diff --git a/.cirrus.star b/.cirrus.star new file mode 100644 index 0000000000000..36233872d1e50 --- /dev/null +++ b/.cirrus.star @@ -0,0 +1,63 @@ +"""Additional CI configuration, using the starlark language. See +https://cirrus-ci.org/guide/programming-tasks/#introduction-into-starlark + +See also the starlark specification at +https://github.com/bazelbuild/starlark/blob/master/spec.md + +See also .cirrus.yml and src/tools/ci/README +""" + +load("cirrus", "env", "fs") + + +def main(): + """The main function is executed by cirrus-ci after loading .cirrus.yml and can + extend the CI definition further. + + As documented in .cirrus.yml, the final CI configuration is composed of + + 1) the contents of .cirrus.yml + + 2) if defined, the contents of the file referenced by the, repository + level, REPO_CI_CONFIG_GIT_URL variable (see + https://cirrus-ci.org/guide/programming-tasks/#fs for the accepted + format) + + 3) .cirrus.tasks.yml + """ + + output = "" + + # 1) is evaluated implicitly + + # Add 2) + repo_config_url = env.get("REPO_CI_CONFIG_GIT_URL") + if repo_config_url != None: + print("loading additional configuration from \"{}\"".format(repo_config_url)) + output += config_from(repo_config_url) + else: + output += "\n# REPO_CI_CONFIG_URL was not set\n" + + # Add 3) + output += config_from(".cirrus.tasks.yml") + + return output + + +def config_from(config_src): + """return contents of config file `config_src`, surrounded by markers + indicating start / end of the included file + """ + + config_contents = fs.read(config_src) + config_fmt = """ + +### +# contents of config file `{0}` start here +### +{1} +### +# contents of config file `{0}` end here +### +""" + return config_fmt.format(config_src, config_contents) diff --git a/.cirrus.tasks.yml b/.cirrus.tasks.yml new file mode 100644 index 0000000000000..aa7c7dcd34dbd --- /dev/null +++ b/.cirrus.tasks.yml @@ -0,0 +1,796 @@ +# CI configuration file for CI utilizing cirrus-ci.org +# +# For instructions on how to enable the CI integration in a repository and +# further details, see src/tools/ci/README + + +env: + # The lower depth accelerates git clone. Use a bit of depth so that + # concurrent tasks and retrying older jobs have a chance of working. + CIRRUS_CLONE_DEPTH: 500 + # Useful to be able to analyse what in a script takes long + CIRRUS_LOG_TIMESTAMP: true + + CCACHE_MAXSIZE: "250M" + + # target to test, for all but windows + CHECK: check-world PROVE_FLAGS=$PROVE_FLAGS + CHECKFLAGS: -Otarget + PROVE_FLAGS: --timer + # Build test dependencies as part of the build step, to see compiler + # errors/warnings in one place. + MBUILD_TARGET: all testprep + MTEST_ARGS: --print-errorlogs --no-rebuild -C build + PGCTLTIMEOUT: 120 # avoids spurious failures during parallel tests + TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/src/tools/ci/pg_ci_base.conf + PG_TEST_EXTRA: kerberos ldap ssl libpq_encryption load_balance + + +# What files to preserve in case tests fail +on_failure_ac: &on_failure_ac + log_artifacts: + paths: + - "**/*.log" + - "**/*.diffs" + - "**/regress_log_*" + type: text/plain + +on_failure_meson: &on_failure_meson + testrun_artifacts: + paths: + - "build*/testrun/**/*.log" + - "build*/testrun/**/*.diffs" + - "build*/testrun/**/regress_log_*" + type: text/plain + + # In theory it'd be nice to upload the junit files meson generates, so that + # cirrus will nicely annotate the commit. Unfortunately the files don't + # contain identifiable file + line numbers right now, so the annotations + # don't end up useful. We could probably improve on that with a some custom + # conversion script, but ... + meson_log_artifacts: + path: "build*/meson-logs/*.txt" + type: text/plain + + +# To avoid unnecessarily spinning up a lot of VMs / containers for entirely +# broken commits, have a minimal task that all others depend on. +task: + name: SanityCheck + + # If a specific OS is requested, don't run the sanity check. This shortens + # push-wait-for-ci cycle time a bit when debugging operating system specific + # failures. Uses skip instead of only_if, as cirrus otherwise warns about + # only_if conditions not matching. + skip: $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:.*' + + env: + CPUS: 4 + BUILD_JOBS: 8 + TEST_JOBS: 8 + IMAGE_FAMILY: pg-ci-bookworm + CCACHE_DIR: ${CIRRUS_WORKING_DIR}/ccache_dir + # no options enabled, should be small + CCACHE_MAXSIZE: "150M" + + # While containers would start up a bit quicker, building is a bit + # slower. This way we don't have to maintain a container image. + <<: *linux_task_template + + ccache_cache: + folder: $CCACHE_DIR + + create_user_script: | + useradd -m postgres + chown -R postgres:postgres . + mkdir -p ${CCACHE_DIR} + chown -R postgres:postgres ${CCACHE_DIR} + echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf + su postgres -c "ulimit -l -H && ulimit -l -S" + # Can't change container's kernel.core_pattern. Postgres user can't write + # to / normally. Change that. + chown root:postgres / + chmod g+rwx / + + configure_script: | + su postgres <<-EOF + meson setup \ + --buildtype=debug \ + --auto-features=disabled \ + -Dtap_tests=enabled \ + build + EOF + build_script: | + su postgres <<-EOF + ninja -C build -j${BUILD_JOBS} ${MBUILD_TARGET} + EOF + upload_caches: ccache + + # Run a minimal set of tests. The main regression tests take too long for + # this purpose. For now this is a random quick pg_regress style test, and a + # tap test that exercises both a frontend binary and the backend. + test_minimal_script: | + su postgres <<-EOF + ulimit -c unlimited + meson test $MTEST_ARGS --suite setup + meson test $MTEST_ARGS --num-processes ${TEST_JOBS} \ + cube/regress pg_ctl/001_start_stop + EOF + + on_failure: + <<: *on_failure_meson + cores_script: | + mkdir -m 770 /tmp/cores + find / -maxdepth 1 -type f -name 'core*' -exec mv '{}' /tmp/cores/ \; + src/tools/ci/cores_backtrace.sh linux /tmp/cores + + +task: + name: FreeBSD - Meson + + env: + CPUS: 4 + BUILD_JOBS: 4 + TEST_JOBS: 8 + IMAGE_FAMILY: pg-ci-freebsd + DISK_SIZE: 50 + + CCACHE_DIR: /tmp/ccache_dir + CPPFLAGS: -DRELCACHE_FORCE_RELEASE -DCOPY_PARSE_PLAN_TREES -DWRITE_READ_PARSE_PLAN_TREES -DRAW_EXPRESSION_COVERAGE_TEST -DENFORCE_REGRESSION_TEST_NAME_RESTRICTIONS + CFLAGS: -Og -ggdb + + PG_TEST_PG_UPGRADE_MODE: --link + + <<: *freebsd_task_template + + depends_on: SanityCheck + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*' + + sysinfo_script: | + id + uname -a + ulimit -a -H && ulimit -a -S + export + + ccache_cache: + folder: $CCACHE_DIR + # Work around performance issues due to 32KB block size + repartition_script: src/tools/ci/gcp_freebsd_repartition.sh + create_user_script: | + pw useradd postgres + chown -R postgres:postgres . + mkdir -p ${CCACHE_DIR} + chown -R postgres:postgres ${CCACHE_DIR} + setup_core_files_script: | + mkdir -m 770 /tmp/cores + chown root:postgres /tmp/cores + sysctl kern.corefile='/tmp/cores/%N.%P.core' + setup_additional_packages_script: | + #pkg install -y ... + + # NB: Intentionally build without -Dllvm. The freebsd image size is already + # large enough to make VM startup slow, and even without llvm freebsd + # already takes longer than other platforms except for windows. + configure_script: | + su postgres <<-EOF + meson setup \ + --buildtype=debug \ + -Dcassert=true -Dinjection_points=true \ + -Duuid=bsd -Dtcl_version=tcl86 -Ddtrace=auto \ + -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \ + -Dextra_lib_dirs=/usr/local/lib -Dextra_include_dirs=/usr/local/include/ \ + build + EOF + build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS} ${MBUILD_TARGET}' + upload_caches: ccache + + test_world_script: | + su postgres <<-EOF + ulimit -c unlimited + meson test $MTEST_ARGS --num-processes ${TEST_JOBS} + EOF + + # test runningcheck, freebsd chosen because it's currently fast enough + test_running_script: | + su postgres <<-EOF + set -e + ulimit -c unlimited + meson test $MTEST_ARGS --quiet --suite setup + export LD_LIBRARY_PATH="$(pwd)/build/tmp_install/usr/local/pgsql/lib/:$LD_LIBRARY_PATH" + mkdir -p build/testrun + build/tmp_install/usr/local/pgsql/bin/initdb -N build/runningcheck --no-instructions -A trust + echo "include '$(pwd)/src/tools/ci/pg_ci_base.conf'" >> build/runningcheck/postgresql.conf + build/tmp_install/usr/local/pgsql/bin/pg_ctl -c -o '-c fsync=off' -D build/runningcheck -l build/testrun/runningcheck.log start + meson test $MTEST_ARGS --num-processes ${TEST_JOBS} --setup running + build/tmp_install/usr/local/pgsql/bin/pg_ctl -D build/runningcheck stop + EOF + + on_failure: + # if the server continues running, it often causes cirrus-ci to fail + # during upload, as it doesn't expect artifacts to change size + stop_running_script: | + su postgres <<-EOF + build/tmp_install/usr/local/pgsql/bin/pg_ctl -D build/runningcheck stop || true + EOF + <<: *on_failure_meson + cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores + + +# configure feature flags, shared between the task running the linux tests and +# the CompilerWarnings task +LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >- + --with-gssapi + --with-icu + --with-ldap + --with-libxml + --with-libxslt + --with-llvm + --with-lz4 + --with-pam + --with-perl + --with-python + --with-selinux + --with-ssl=openssl + --with-systemd + --with-tcl --with-tclconfig=/usr/lib/tcl8.6/ + --with-uuid=ossp + --with-zstd + +LINUX_MESON_FEATURES: &LINUX_MESON_FEATURES >- + -Dllvm=enabled + -Duuid=e2fs + + +task: + env: + CPUS: 4 + BUILD_JOBS: 4 + TEST_JOBS: 8 # experimentally derived to be a decent choice + IMAGE_FAMILY: pg-ci-bookworm + + CCACHE_DIR: /tmp/ccache_dir + DEBUGINFOD_URLS: "https://debuginfod.debian.net" + + # Enable a reasonable set of sanitizers. Use the linux task for that, as + # it's one of the fastest tasks (without sanitizers). Also several of the + # sanitizers work best on linux. + # + # The overhead of alignment sanitizer is low, undefined behaviour has + # moderate overhead. Test alignment sanitizer in the meson task, as it + # does both 32 and 64 bit builds and is thus more likely to expose + # alignment bugs. + # + # Address sanitizer in contrast is somewhat expensive. Enable it in the + # autoconf task, as the meson task tests both 32 and 64bit. + # + # disable_coredump=0, abort_on_error=1: for useful backtraces in case of crashes + # print_stacktraces=1,verbosity=2, duh + # detect_leaks=0: too many uninteresting leak errors in short-lived binaries + UBSAN_OPTIONS: print_stacktrace=1:disable_coredump=0:abort_on_error=1:verbosity=2 + ASAN_OPTIONS: print_stacktrace=1:disable_coredump=0:abort_on_error=1:detect_leaks=0 + + # SANITIZER_FLAGS is set in the tasks below + CFLAGS: -Og -ggdb -fno-sanitize-recover=all $SANITIZER_FLAGS + CXXFLAGS: $CFLAGS + LDFLAGS: $SANITIZER_FLAGS + CC: ccache gcc + CXX: ccache g++ + + LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES + LINUX_MESON_FEATURES: *LINUX_MESON_FEATURES + + <<: *linux_task_template + + depends_on: SanityCheck + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*' + + ccache_cache: + folder: ${CCACHE_DIR} + + sysinfo_script: | + id + uname -a + cat /proc/cmdline + ulimit -a -H && ulimit -a -S + export + create_user_script: | + useradd -m postgres + chown -R postgres:postgres . + mkdir -p ${CCACHE_DIR} + chown -R postgres:postgres ${CCACHE_DIR} + echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf + su postgres -c "ulimit -l -H && ulimit -l -S" + setup_core_files_script: | + mkdir -m 770 /tmp/cores + chown root:postgres /tmp/cores + sysctl kernel.core_pattern='/tmp/cores/%e-%s-%p.core' + + setup_hosts_file_script: | + cat >> /etc/hosts <<-EOF + 127.0.0.1 pg-loadbalancetest + 127.0.0.2 pg-loadbalancetest + 127.0.0.3 pg-loadbalancetest + EOF + + setup_additional_packages_script: | + #apt-get update + #DEBIAN_FRONTEND=noninteractive apt-get -y install ... + + matrix: + - name: Linux - Debian Bookworm - Autoconf + + env: + SANITIZER_FLAGS: -fsanitize=address + + # Normally, the "relation segment" code basically has no coverage in our + # tests, because we (quite reasonably) don't generate tables large + # enough in tests. We've had plenty bugs that we didn't notice due the + # code not being exercised much. Thus specify a very small segment size + # here. Use a non-power-of-two segment size, given we currently allow + # that. + configure_script: | + su postgres <<-EOF + ./configure \ + --enable-cassert --enable-injection-points --enable-debug \ + --enable-tap-tests --enable-nls \ + --with-segsize-blocks=6 \ + \ + ${LINUX_CONFIGURE_FEATURES} \ + \ + CLANG="ccache clang" + EOF + build_script: su postgres -c "make -s -j${BUILD_JOBS} world-bin" + upload_caches: ccache + + test_world_script: | + su postgres <<-EOF + ulimit -c unlimited # default is 0 + make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS} + EOF + + on_failure: + <<: *on_failure_ac + + - name: Linux - Debian Bookworm - Meson + + env: + CCACHE_MAXSIZE: "400M" # tests two different builds + SANITIZER_FLAGS: -fsanitize=alignment,undefined + + configure_script: | + su postgres <<-EOF + meson setup \ + --buildtype=debug \ + -Dcassert=true -Dinjection_points=true \ + ${LINUX_MESON_FEATURES} \ + -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \ + build + EOF + + # Also build & test in a 32bit build - it's gotten rare to test that + # locally. + configure_32_script: | + su postgres <<-EOF + export CC='ccache gcc -m32' + meson setup \ + --buildtype=debug \ + -Dcassert=true -Dinjection_points=true \ + ${LINUX_MESON_FEATURES} \ + -Dllvm=disabled \ + --pkg-config-path /usr/lib/i386-linux-gnu/pkgconfig/ \ + -DPERL=perl5.36-i386-linux-gnu \ + -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \ + build-32 + EOF + + build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS} ${MBUILD_TARGET}' + build_32_script: su postgres -c 'ninja -C build-32 -j${BUILD_JOBS} ${MBUILD_TARGET}' + + upload_caches: ccache + + test_world_script: | + su postgres <<-EOF + ulimit -c unlimited + meson test $MTEST_ARGS --num-processes ${TEST_JOBS} + EOF + # so that we don't upload 64bit logs if 32bit fails + rm -rf build/ + + # There's currently no coverage of icu with LANG=C in the buildfarm. We + # can easily provide some here by running one of the sets of tests that + # way. Newer versions of python insist on changing the LC_CTYPE away + # from C, prevent that with PYTHONCOERCECLOCALE. + test_world_32_script: | + su postgres <<-EOF + ulimit -c unlimited + PYTHONCOERCECLOCALE=0 LANG=C meson test $MTEST_ARGS -C build-32 --num-processes ${TEST_JOBS} + EOF + + on_failure: + <<: *on_failure_meson + + on_failure: + cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores + + +task: + name: macOS - Sonoma - Meson + + env: + CPUS: 4 # always get that much for cirrusci macOS instances + BUILD_JOBS: $CPUS + # Test performance regresses noticably when using all cores. 8 seems to + # work OK. See + # https://postgr.es/m/20220927040208.l3shfcidovpzqxfh%40awork3.anarazel.de + TEST_JOBS: 8 + IMAGE: ghcr.io/cirruslabs/macos-runner:sonoma + + CIRRUS_WORKING_DIR: ${HOME}/pgsql/ + CCACHE_DIR: ${HOME}/ccache + MACPORTS_CACHE: ${HOME}/macports-cache + + MACOS_PACKAGE_LIST: >- + ccache + icu + kerberos5 + lz4 + meson + openldap + openssl + p5.34-io-tty + p5.34-ipc-run + python312 + tcl + zstd + + CC: ccache cc + CXX: ccache c++ + CFLAGS: -Og -ggdb + CXXFLAGS: -Og -ggdb + + PG_TEST_PG_UPGRADE_MODE: --clone + + <<: *macos_task_template + + depends_on: SanityCheck + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*' + + sysinfo_script: | + id + uname -a + ulimit -a -H && ulimit -a -S + export + + setup_core_files_script: + - mkdir ${HOME}/cores + - sudo sysctl kern.corefile="${HOME}/cores/core.%P" + + # Use macports, even though homebrew is installed. The installation + # of the additional packages we need would take quite a while with + # homebrew, even if we cache the downloads. We can't cache all of + # homebrew, because it's already large. So we use macports. To cache + # the installation we create a .dmg file that we mount if it already + # exists. + # XXX: The reason for the direct p5.34* references is that we'd need + # the large macport tree around to figure out that p5-io-tty is + # actually p5.34-io-tty. Using the unversioned name works, but + # updates macports every time. + macports_cache: + folder: ${MACPORTS_CACHE} + fingerprint_script: | + # Reinstall packages if the OS major version, the list of the packages + # to install or the MacPorts install script changes. + sw_vers -productVersion | sed 's/\..*//' + echo $MACOS_PACKAGE_LIST + md5 src/tools/ci/ci_macports_packages.sh + reupload_on_changes: true + setup_additional_packages_script: | + sh src/tools/ci/ci_macports_packages.sh $MACOS_PACKAGE_LIST + # system python doesn't provide headers + sudo /opt/local/bin/port select python3 python312 + # Make macports install visible for subsequent steps + echo PATH=/opt/local/sbin/:/opt/local/bin/:$PATH >> $CIRRUS_ENV + upload_caches: macports + + ccache_cache: + folder: $CCACHE_DIR + configure_script: | + export PKG_CONFIG_PATH="/opt/local/lib/pkgconfig/" + meson setup \ + --buildtype=debug \ + -Dextra_include_dirs=/opt/local/include \ + -Dextra_lib_dirs=/opt/local/lib \ + -Dcassert=true -Dinjection_points=true \ + -Duuid=e2fs -Ddtrace=auto \ + -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \ + build + + build_script: ninja -C build -j${BUILD_JOBS} ${MBUILD_TARGET} + upload_caches: ccache + + test_world_script: | + ulimit -c unlimited # default is 0 + ulimit -n 1024 # default is 256, pretty low + meson test $MTEST_ARGS --num-processes ${TEST_JOBS} + + on_failure: + <<: *on_failure_meson + cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores" + + +WINDOWS_ENVIRONMENT_BASE: &WINDOWS_ENVIRONMENT_BASE + env: + # Half the allowed per-user CPU cores + CPUS: 4 + + # The default cirrus working dir is in a directory msbuild complains about + CIRRUS_WORKING_DIR: "c:/cirrus" + # git's tar doesn't deal with drive letters, see + # https://postgr.es/m/b6782dc3-a7b0-ed56-175f-f8f54cb08d67%40dunslane.net + TAR: "c:/windows/system32/tar.exe" + # Avoids port conflicts between concurrent tap test runs + PG_TEST_USE_UNIX_SOCKETS: 1 + PG_REGRESS_SOCK_DIR: "c:/cirrus/" + DISK_SIZE: 50 + IMAGE_FAMILY: pg-ci-windows-ci + + sysinfo_script: | + chcp + systeminfo + powershell -Command get-psdrive -psprovider filesystem + set + + +task: + name: Windows - Server 2019, VS 2019 - Meson & ninja + << : *WINDOWS_ENVIRONMENT_BASE + + env: + TEST_JOBS: 8 # wild guess, data based value welcome + + # Cirrus defaults to SetErrorMode(SEM_NOGPFAULTERRORBOX | ...). That + # prevents crash reporting from working unless binaries do SetErrorMode() + # themselves. Furthermore, it appears that either python or, more likely, + # the C runtime has a bug where SEM_NOGPFAULTERRORBOX can very + # occasionally *trigger* a crash on process exit - which is hard to debug, + # given that it explicitly prevents crash dumps from working... + # 0x8001 is SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX + CIRRUS_WINDOWS_ERROR_MODE: 0x8001 + + <<: *windows_task_template + + depends_on: SanityCheck + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*windows.*' + + setup_additional_packages_script: | + REM choco install -y --no-progress ... + + setup_hosts_file_script: | + echo 127.0.0.1 pg-loadbalancetest >> c:\Windows\System32\Drivers\etc\hosts + echo 127.0.0.2 pg-loadbalancetest >> c:\Windows\System32\Drivers\etc\hosts + echo 127.0.0.3 pg-loadbalancetest >> c:\Windows\System32\Drivers\etc\hosts + type c:\Windows\System32\Drivers\etc\hosts + + # Use /DEBUG:FASTLINK to avoid high memory usage during linking + configure_script: | + vcvarsall x64 + meson setup --backend ninja --buildtype debug -Dc_link_args=/DEBUG:FASTLINK -Dcassert=true -Dinjection_points=true -Db_pch=true -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=%TAR% -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build + + build_script: | + vcvarsall x64 + ninja -C build %MBUILD_TARGET% + + check_world_script: | + vcvarsall x64 + meson test %MTEST_ARGS% --num-processes %TEST_JOBS% + + on_failure: + <<: *on_failure_meson + crashlog_artifacts: + path: "crashlog-*.txt" + type: text/plain + + +task: + << : *WINDOWS_ENVIRONMENT_BASE + name: Windows - Server 2019, MinGW64 - Meson + + # due to resource constraints we don't run this task by default for now + trigger_type: manual + # worth using only_if despite being manual, otherwise this task will show up + # when e.g. ci-os-only: linux is used. + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*mingw.*' + # otherwise it'll be sorted before other tasks + depends_on: SanityCheck + + env: + TEST_JOBS: 4 # higher concurrency causes occasional failures + CCACHE_DIR: C:/msys64/ccache + CCACHE_MAXSIZE: "500M" + CCACHE_SLOPPINESS: pch_defines,time_macros + CCACHE_DEPEND: 1 + # for some reason mingw plpython cannot find its installation without this + PYTHONHOME: C:/msys64/ucrt64 + # prevents MSYS bash from resetting error mode + MSYS: winjitdebug + # Start bash in current working directory + CHERE_INVOKING: 1 + BASH: C:\msys64\usr\bin\bash.exe -l + + <<: *windows_task_template + + ccache_cache: + folder: ${CCACHE_DIR} + + setup_additional_packages_script: | + REM C:\msys64\usr\bin\pacman.exe -S --noconfirm ... + + mingw_info_script: | + %BASH% -c "where gcc" + %BASH% -c "gcc --version" + %BASH% -c "where perl" + %BASH% -c "perl --version" + + # disable -Dnls as the number of files it creates cause a noticable slowdown + configure_script: | + %BASH% -c "meson setup -Ddebug=true -Doptimization=g -Dcassert=true -Dinjection_points=true -Db_pch=true -Dnls=disabled -DTAR=%TAR% build" + + build_script: | + %BASH% -c "ninja -C build ${MBUILD_TARGET}" + + upload_caches: ccache + + test_world_script: | + %BASH% -c "meson test %MTEST_ARGS% --num-processes %TEST_JOBS%" + + on_failure: + <<: *on_failure_meson + crashlog_artifacts: + path: "crashlog-*.txt" + type: text/plain + + +task: + name: CompilerWarnings + + # To limit unnecessary work only run this once the SanityCheck + # succeeds. This is particularly important for this task as we intentionally + # use always: to continue after failures. Task that did not run count as a + # success, so we need to recheck SanityChecks's condition here ... + depends_on: SanityCheck + only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' + + env: + CPUS: 4 + BUILD_JOBS: 4 + IMAGE_FAMILY: pg-ci-bookworm + + # Use larger ccache cache, as this task compiles with multiple compilers / + # flag combinations + CCACHE_MAXSIZE: "1G" + CCACHE_DIR: "/tmp/ccache_dir" + + LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES + LINUX_MESON_FEATURES: *LINUX_MESON_FEATURES + + <<: *linux_task_template + + sysinfo_script: | + id + uname -a + cat /proc/cmdline + ulimit -a -H && ulimit -a -S + gcc -v + clang -v + export + + ccache_cache: + folder: $CCACHE_DIR + + setup_additional_packages_script: | + #apt-get update + #DEBIAN_FRONTEND=noninteractive apt-get -y install ... + + ### + # Test that code can be built with gcc/clang without warnings + ### + + setup_script: echo "COPT=-Werror" > src/Makefile.custom + + # Trace probes have a history of getting accidentally broken. Use the + # different compilers to build with different combinations of dtrace on/off + # and cassert on/off. + + # gcc, cassert off, dtrace on + always: + gcc_warning_script: | + time ./configure \ + --cache gcc.cache \ + --enable-dtrace \ + ${LINUX_CONFIGURE_FEATURES} \ + CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" + make -s -j${BUILD_JOBS} clean + time make -s -j${BUILD_JOBS} world-bin + + # gcc, cassert on, dtrace off + always: + gcc_a_warning_script: | + time ./configure \ + --cache gcc.cache \ + --enable-cassert \ + ${LINUX_CONFIGURE_FEATURES} \ + CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" + make -s -j${BUILD_JOBS} clean + time make -s -j${BUILD_JOBS} world-bin + + # clang, cassert off, dtrace off + always: + clang_warning_script: | + time ./configure \ + --cache clang.cache \ + ${LINUX_CONFIGURE_FEATURES} \ + CC="ccache clang" CXX="ccache clang++" CLANG="ccache clang" + make -s -j${BUILD_JOBS} clean + time make -s -j${BUILD_JOBS} world-bin + + # clang, cassert on, dtrace on + always: + clang_a_warning_script: | + time ./configure \ + --cache clang.cache \ + --enable-cassert \ + --enable-dtrace \ + ${LINUX_CONFIGURE_FEATURES} \ + CC="ccache clang" CXX="ccache clang++" CLANG="ccache clang" + make -s -j${BUILD_JOBS} clean + time make -s -j${BUILD_JOBS} world-bin + + # cross-compile to windows + always: + mingw_cross_warning_script: | + time ./configure \ + --host=x86_64-w64-mingw32 \ + --enable-cassert \ + --without-icu \ + CC="ccache x86_64-w64-mingw32-gcc" \ + CXX="ccache x86_64-w64-mingw32-g++" + make -s -j${BUILD_JOBS} clean + time make -s -j${BUILD_JOBS} world-bin + + ### + # Verify docs can be built + ### + # XXX: Only do this if there have been changes in doc/ since last build + always: + docs_build_script: | + time ./configure \ + --cache gcc.cache \ + CC="ccache gcc" \ + CXX="ccache g++" \ + CLANG="ccache clang" + make -s -j${BUILD_JOBS} clean + time make -s -j${BUILD_JOBS} -C doc + + ### + # Verify headerscheck / cpluspluscheck succeed + # + # - Don't use ccache, the files are uncacheable, polluting ccache's + # cache + # - Use -fmax-errors, as particularly cpluspluscheck can be very verbose + # - XXX have to disable ICU to avoid errors: + # https://postgr.es/m/20220323002024.f2g6tivduzrktgfa%40alap3.anarazel.de + ### + always: + headers_headerscheck_script: | + time ./configure \ + ${LINUX_CONFIGURE_FEATURES} \ + --without-icu \ + --quiet \ + CC="gcc" CXX"=g++" CLANG="clang" + make -s -j${BUILD_JOBS} clean + time make -s headerscheck EXTRAFLAGS='-fmax-errors=10' + headers_cpluspluscheck_script: | + time make -s cpluspluscheck EXTRAFLAGS='-fmax-errors=10' + + always: + upload_caches: ccache diff --git a/.cirrus.yml b/.cirrus.yml index 113f4545244cc..a83129ae46d1e 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -2,6 +2,22 @@ # # For instructions on how to enable the CI integration in a repository and # further details, see src/tools/ci/README +# +# +# The actual CI tasks are defined in .cirrus.tasks.yml. To make the compute +# resources for CI configurable on a repository level, the "final" CI +# configuration is the combination of: +# +# 1) the contents of this file +# +# 2) if defined, the contents of the file referenced by the, repository +# level, REPO_CI_CONFIG_GIT_URL variable (see +# https://cirrus-ci.org/guide/programming-tasks/#fs for the accepted +# format) +# +# 3) .cirrus.tasks.yml +# +# This composition is done by .cirrus.star env: @@ -9,801 +25,49 @@ env: GCP_PROJECT: pg-ci-images IMAGE_PROJECT: $GCP_PROJECT CONTAINER_REPO: us-docker.pkg.dev/${GCP_PROJECT}/ci - - # The lower depth accelerates git clone. Use a bit of depth so that - # concurrent tasks and retrying older jobs have a chance of working. - CIRRUS_CLONE_DEPTH: 500 - # Useful to be able to analyse what in a script takes long - CIRRUS_LOG_TIMESTAMP: true - - CCACHE_MAXSIZE: "250M" - - # target to test, for all but windows - CHECK: check-world PROVE_FLAGS=$PROVE_FLAGS - CHECKFLAGS: -Otarget - PROVE_FLAGS: --timer - MTEST_ARGS: --print-errorlogs --no-rebuild -C build - PGCTLTIMEOUT: 120 # avoids spurious failures during parallel tests - TEMP_CONFIG: ${CIRRUS_WORKING_DIR}/src/tools/ci/pg_ci_base.conf - PG_TEST_EXTRA: kerberos ldap ssl load_balance + DISK_SIZE: 25 -# What files to preserve in case tests fail -on_failure_ac: &on_failure_ac - log_artifacts: - paths: - - "**/*.log" - - "**/*.diffs" - - "**/regress_log_*" - type: text/plain - -on_failure_meson: &on_failure_meson - testrun_artifacts: - paths: - - "build*/testrun/**/*.log" - - "build*/testrun/**/*.diffs" - - "build*/testrun/**/regress_log_*" - type: text/plain - - # In theory it'd be nice to upload the junit files meson generates, so that - # cirrus will nicely annotate the commit. Unfortunately the files don't - # contain identifiable file + line numbers right now, so the annotations - # don't end up useful. We could probably improve on that with a some custom - # conversion script, but ... - meson_log_artifacts: - path: "build*/meson-logs/*.txt" - type: text/plain - - -# To avoid unnecessarily spinning up a lot of VMs / containers for entirely -# broken commits, have a minimal task that all others depend on. -task: - name: SanityCheck - - # If a specific OS is requested, don't run the sanity check. This shortens - # push-wait-for-ci cycle time a bit when debugging operating system specific - # failures. Uses skip instead of only_if, as cirrus otherwise warns about - # only_if conditions not matching. - skip: $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:.*' - - env: - CPUS: 4 - BUILD_JOBS: 8 - TEST_JOBS: 8 - CCACHE_DIR: ${CIRRUS_WORKING_DIR}/ccache_dir - # no options enabled, should be small - CCACHE_MAXSIZE: "150M" - - # Container starts up quickly, but is slower at runtime, particularly for - # tests. Good for the briefly running sanity check. - container: - image: $CONTAINER_REPO/linux_debian_bullseye_ci:latest - cpu: $CPUS - - ccache_cache: - folder: $CCACHE_DIR - - create_user_script: | - useradd -m postgres - chown -R postgres:postgres . - mkdir -p ${CCACHE_DIR} - chown -R postgres:postgres ${CCACHE_DIR} - echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf - su postgres -c "ulimit -l -H && ulimit -l -S" - # Can't change container's kernel.core_pattern. Postgres user can't write - # to / normally. Change that. - chown root:postgres / - chmod g+rwx / - - configure_script: | - su postgres <<-EOF - meson setup \ - --buildtype=debug \ - --auto-features=disabled \ - -Dtap_tests=enabled \ - build - EOF - build_script: | - su postgres <<-EOF - ninja -C build -j${BUILD_JOBS} - EOF - upload_caches: ccache - - # Run a minimal set of tests. The main regression tests take too long for - # this purpose. For now this is a random quick pg_regress style test, and a - # tap test that exercises both a frontend binary and the backend. - test_minimal_script: | - su postgres <<-EOF - ulimit -c unlimited - meson test $MTEST_ARGS --num-processes ${TEST_JOBS} \ - tmp_install cube/regress pg_ctl/001_start_stop - EOF - - on_failure: - <<: *on_failure_meson - cores_script: | - mkdir -m 770 /tmp/cores - find / -maxdepth 1 -type f -name 'core*' -exec mv '{}' /tmp/cores/ \; - src/tools/ci/cores_backtrace.sh linux /tmp/cores - - -task: - name: FreeBSD - 13 - Meson - - env: - # FreeBSD on GCP is slow when running with larger number of CPUS / - # jobs. Using one more job than cpus seems to work best. - CPUS: 2 - BUILD_JOBS: 3 - TEST_JOBS: 3 - - CCACHE_DIR: /tmp/ccache_dir - CPPFLAGS: -DRELCACHE_FORCE_RELEASE -DCOPY_PARSE_PLAN_TREES -DWRITE_READ_PARSE_PLAN_TREES -DRAW_EXPRESSION_COVERAGE_TEST - CFLAGS: -Og -ggdb - - depends_on: SanityCheck - only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*freebsd.*' +# Define how to run various types of tasks. +# VMs provided by cirrus-ci. Each user has a limited number of "free" credits +# for testing. +cirrus_community_vm_template: &cirrus_community_vm_template compute_engine_instance: image_project: $IMAGE_PROJECT - image: family/pg-ci-freebsd-13 - platform: freebsd + image: family/$IMAGE_FAMILY + platform: $PLATFORM cpu: $CPUS - memory: 4G - disk: 50 - - sysinfo_script: | - id - uname -a - ulimit -a -H && ulimit -a -S - export - - ccache_cache: - folder: $CCACHE_DIR - # Work around performance issues due to 32KB block size - repartition_script: src/tools/ci/gcp_freebsd_repartition.sh - create_user_script: | - pw useradd postgres - chown -R postgres:postgres . - mkdir -p ${CCACHE_DIR} - chown -R postgres:postgres ${CCACHE_DIR} - setup_core_files_script: | - mkdir -m 770 /tmp/cores - chown root:postgres /tmp/cores - sysctl kern.corefile='/tmp/cores/%N.%P.core' - setup_additional_packages_script: | - #pkg install -y ... - - # NB: Intentionally build without -Dllvm. The freebsd image size is already - # large enough to make VM startup slow, and even without llvm freebsd - # already takes longer than other platforms except for windows. - configure_script: | - su postgres <<-EOF - meson setup \ - --buildtype=debug \ - -Dcassert=true -Duuid=bsd -Dtcl_version=tcl86 -Ddtrace=auto \ - -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \ - -Dextra_lib_dirs=/usr/local/lib -Dextra_include_dirs=/usr/local/include/ \ - build - EOF - build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}' - upload_caches: ccache - - test_world_script: | - su postgres <<-EOF - ulimit -c unlimited - meson test $MTEST_ARGS --num-processes ${TEST_JOBS} - EOF - - # test runningcheck, freebsd chosen because it's currently fast enough - test_running_script: | - su postgres <<-EOF - set -e - ulimit -c unlimited - meson test $MTEST_ARGS --quiet --suite setup - export LD_LIBRARY_PATH="$(pwd)/build/tmp_install/usr/local/pgsql/lib/:$LD_LIBRARY_PATH" - mkdir -p build/testrun - build/tmp_install/usr/local/pgsql/bin/initdb -N build/runningcheck --no-instructions -A trust - echo "include '$(pwd)/src/tools/ci/pg_ci_base.conf'" >> build/runningcheck/postgresql.conf - build/tmp_install/usr/local/pgsql/bin/pg_ctl -c -o '-c fsync=off' -D build/runningcheck -l build/testrun/runningcheck.log start - meson test $MTEST_ARGS --num-processes ${TEST_JOBS} --setup running - build/tmp_install/usr/local/pgsql/bin/pg_ctl -D build/runningcheck stop - EOF - - on_failure: - # if the server continues running, it often causes cirrus-ci to fail - # during upload, as it doesn't expect artifacts to change size - stop_running_script: | - su postgres <<-EOF - build/tmp_install/usr/local/pgsql/bin/pg_ctl -D build/runningcheck stop || true - EOF - <<: *on_failure_meson - cores_script: src/tools/ci/cores_backtrace.sh freebsd /tmp/cores + disk: $DISK_SIZE -# configure feature flags, shared between the task running the linux tests and -# the CompilerWarnings task -LINUX_CONFIGURE_FEATURES: &LINUX_CONFIGURE_FEATURES >- - --with-gssapi - --with-icu - --with-ldap - --with-libxml - --with-libxslt - --with-llvm - --with-lz4 - --with-pam - --with-perl - --with-python - --with-selinux - --with-ssl=openssl - --with-systemd - --with-tcl --with-tclconfig=/usr/lib/tcl8.6/ - --with-uuid=ossp - --with-zstd - -LINUX_MESON_FEATURES: &LINUX_MESON_FEATURES >- - -Dllvm=enabled - -Duuid=e2fs - - -task: +default_linux_task_template: &linux_task_template env: - CPUS: 4 - BUILD_JOBS: 4 - TEST_JOBS: 8 # experimentally derived to be a decent choice - - CCACHE_DIR: /tmp/ccache_dir - DEBUGINFOD_URLS: "https://debuginfod.debian.net" - - # Enable a reasonable set of sanitizers. Use the linux task for that, as - # it's one of the fastest tasks (without sanitizers). Also several of the - # sanitizers work best on linux. - # - # The overhead of alignment sanitizer is low, undefined behaviour has - # moderate overhead. Test alignment sanitizer in the meson task, as it - # does both 32 and 64 bit builds and is thus more likely to expose - # alignment bugs. - # - # Address sanitizer in contrast is somewhat expensive. Enable it in the - # autoconf task, as the meson task tests both 32 and 64bit. - # - # disable_coredump=0, abort_on_error=1: for useful backtraces in case of crashes - # print_stacktraces=1,verbosity=2, duh - # detect_leaks=0: too many uninteresting leak errors in short-lived binaries - UBSAN_OPTIONS: print_stacktrace=1:disable_coredump=0:abort_on_error=1:verbosity=2 - ASAN_OPTIONS: print_stacktrace=1:disable_coredump=0:abort_on_error=1:detect_leaks=0 - - # SANITIZER_FLAGS is set in the tasks below - CFLAGS: -Og -ggdb -fno-sanitize-recover=all $SANITIZER_FLAGS - CXXFLAGS: $CFLAGS - LDFLAGS: $SANITIZER_FLAGS - CC: ccache gcc - CXX: ccache g++ - - LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES - LINUX_MESON_FEATURES: *LINUX_MESON_FEATURES - - depends_on: SanityCheck - only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*linux.*' - - compute_engine_instance: - image_project: $IMAGE_PROJECT - image: family/pg-ci-bullseye - platform: linux - cpu: $CPUS - memory: 4G - - ccache_cache: - folder: ${CCACHE_DIR} - - sysinfo_script: | - id - uname -a - cat /proc/cmdline - ulimit -a -H && ulimit -a -S - export - create_user_script: | - useradd -m postgres - chown -R postgres:postgres . - mkdir -p ${CCACHE_DIR} - chown -R postgres:postgres ${CCACHE_DIR} - echo '* - memlock 134217728' > /etc/security/limits.d/postgres.conf - su postgres -c "ulimit -l -H && ulimit -l -S" - setup_core_files_script: | - mkdir -m 770 /tmp/cores - chown root:postgres /tmp/cores - sysctl kernel.core_pattern='/tmp/cores/%e-%s-%p.core' - - setup_hosts_file_script: | - cat >> /etc/hosts <<-EOF - 127.0.0.1 pg-loadbalancetest - 127.0.0.2 pg-loadbalancetest - 127.0.0.3 pg-loadbalancetest - EOF - - setup_additional_packages_script: | - #apt-get update - #DEBIAN_FRONTEND=noninteractive apt-get -y install ... - - matrix: - - name: Linux - Debian Bullseye - Autoconf - - env: - SANITIZER_FLAGS: -fsanitize=address + PLATFORM: linux + <<: *cirrus_community_vm_template - configure_script: | - su postgres <<-EOF - ./configure \ - --enable-cassert --enable-debug --enable-tap-tests \ - --enable-nls \ - --with-segsize-blocks=8 \ - \ - ${LINUX_CONFIGURE_FEATURES} \ - \ - CLANG="ccache clang" - EOF - build_script: su postgres -c "make -s -j${BUILD_JOBS} world-bin" - upload_caches: ccache - - test_world_script: | - su postgres <<-EOF - ulimit -c unlimited # default is 0 - make -s ${CHECK} ${CHECKFLAGS} -j${TEST_JOBS} - EOF - - on_failure: - <<: *on_failure_ac - - - name: Linux - Debian Bullseye - Meson - - env: - CCACHE_MAXSIZE: "400M" # tests two different builds - SANITIZER_FLAGS: -fsanitize=alignment,undefined - - configure_script: | - su postgres <<-EOF - meson setup \ - --buildtype=debug \ - -Dcassert=true \ - ${LINUX_MESON_FEATURES} \ - -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \ - build - EOF - - # Also build & test in a 32bit build - it's gotten rare to test that - # locally. - configure_32_script: | - su postgres <<-EOF - export CC='ccache gcc -m32' - meson setup \ - --buildtype=debug \ - -Dcassert=true \ - ${LINUX_MESON_FEATURES} \ - -Dllvm=disabled \ - --pkg-config-path /usr/lib/i386-linux-gnu/pkgconfig/ \ - -DPERL=perl5.32-i386-linux-gnu \ - -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \ - build-32 - EOF - - build_script: su postgres -c 'ninja -C build -j${BUILD_JOBS}' - build_32_script: su postgres -c 'ninja -C build-32 -j${BUILD_JOBS}' - - upload_caches: ccache - - test_world_script: | - su postgres <<-EOF - ulimit -c unlimited - meson test $MTEST_ARGS --num-processes ${TEST_JOBS} - EOF - # so that we don't upload 64bit logs if 32bit fails - rm -rf build/ - - # There's currently no coverage of icu with LANG=C in the buildfarm. We - # can easily provide some here by running one of the sets of tests that - # way. Newer versions of python insist on changing the LC_CTYPE away - # from C, prevent that with PYTHONCOERCECLOCALE. - test_world_32_script: | - su postgres <<-EOF - ulimit -c unlimited - PYTHONCOERCECLOCALE=0 LANG=C meson test $MTEST_ARGS -C build-32 --num-processes ${TEST_JOBS} - EOF - - on_failure: - <<: *on_failure_meson - - on_failure: - cores_script: src/tools/ci/cores_backtrace.sh linux /tmp/cores - - -task: - name: macOS - Ventura - Meson +default_freebsd_task_template: &freebsd_task_template env: - CPUS: 4 # always get that much for cirrusci macOS instances - BUILD_JOBS: $CPUS - # Test performance regresses noticably when using all cores. 8 seems to - # work OK. See - # https://postgr.es/m/20220927040208.l3shfcidovpzqxfh%40awork3.anarazel.de - TEST_JOBS: 8 - - CIRRUS_WORKING_DIR: ${HOME}/pgsql/ - CCACHE_DIR: ${HOME}/ccache - HOMEBREW_CACHE: ${HOME}/homebrew-cache - PERL5LIB: ${HOME}/perl5/lib/perl5 + PLATFORM: freebsd + <<: *cirrus_community_vm_template - CC: ccache cc - CXX: ccache c++ - CPPFLAGS: -DRANDOMIZE_ALLOCATED_MEMORY - CFLAGS: -Og -ggdb - CXXFLAGS: -Og -ggdb - depends_on: SanityCheck - only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*(macos|darwin|osx).*' - - macos_instance: - image: ghcr.io/cirruslabs/macos-ventura-base:latest - - sysinfo_script: | - id - uname -a - ulimit -a -H && ulimit -a -S - export - - setup_core_files_script: - - mkdir ${HOME}/cores - - sudo sysctl kern.corefile="${HOME}/cores/core.%P" - - perl_cache: - folder: ~/perl5 - cpan_install_script: - - perl -mIPC::Run -e 1 || cpan -T IPC::Run - - perl -mIO::Pty -e 1 || cpan -T IO::Pty - upload_caches: perl - - - # XXX: Could we instead install homebrew into a cached directory? The - # homebrew installation takes a good bit of time every time, even if the - # packages do not need to be downloaded. - homebrew_cache: - folder: $HOMEBREW_CACHE - setup_additional_packages_script: | - brew install \ - ccache \ - icu4c \ - krb5 \ - llvm \ - lz4 \ - make \ - meson \ - openldap \ - openssl \ - python \ - tcl-tk \ - zstd - - brew cleanup -s # to reduce cache size - upload_caches: homebrew - - ccache_cache: - folder: $CCACHE_DIR - configure_script: | - brewpath="/opt/homebrew" - PKG_CONFIG_PATH="${brewpath}/lib/pkgconfig:${PKG_CONFIG_PATH}" - - for pkg in icu4c krb5 openldap openssl zstd ; do - pkgpath="${brewpath}/opt/${pkg}" - PKG_CONFIG_PATH="${pkgpath}/lib/pkgconfig:${PKG_CONFIG_PATH}" - PATH="${pkgpath}/bin:${pkgpath}/sbin:$PATH" - done - - export PKG_CONFIG_PATH PATH - - meson setup \ - --buildtype=debug \ - -Dextra_include_dirs=${brewpath}/include \ - -Dextra_lib_dirs=${brewpath}/lib \ - -Dcassert=true \ - -Duuid=e2fs -Ddtrace=auto \ - -Dsegsize_blocks=6 \ - -DPG_TEST_EXTRA="$PG_TEST_EXTRA" \ - build - - build_script: ninja -C build -j${BUILD_JOBS} - upload_caches: ccache - - test_world_script: | - ulimit -c unlimited # default is 0 - ulimit -n 1024 # default is 256, pretty low - meson test $MTEST_ARGS --num-processes ${TEST_JOBS} - - on_failure: - <<: *on_failure_meson - cores_script: src/tools/ci/cores_backtrace.sh macos "${HOME}/cores" - - -WINDOWS_ENVIRONMENT_BASE: &WINDOWS_ENVIRONMENT_BASE +default_windows_task_template: &windows_task_template env: - # Half the allowed per-user CPU cores - CPUS: 4 - - # The default cirrus working dir is in a directory msbuild complains about - CIRRUS_WORKING_DIR: "c:/cirrus" - # git's tar doesn't deal with drive letters, see - # https://postgr.es/m/b6782dc3-a7b0-ed56-175f-f8f54cb08d67%40dunslane.net - TAR: "c:/windows/system32/tar.exe" - # Avoids port conflicts between concurrent tap test runs - PG_TEST_USE_UNIX_SOCKETS: 1 - PG_REGRESS_SOCK_DIR: "c:/cirrus/" - - sysinfo_script: | - chcp - systeminfo - powershell -Command get-psdrive -psprovider filesystem - set - + PLATFORM: windows + <<: *cirrus_community_vm_template -task: - name: Windows - Server 2019, VS 2019 - Meson & ninja - << : *WINDOWS_ENVIRONMENT_BASE +# macos workers provided by cirrus-ci +default_macos_task_template: &macos_task_template env: - TEST_JOBS: 8 # wild guess, data based value welcome - - # Cirrus defaults to SetErrorMode(SEM_NOGPFAULTERRORBOX | ...). That - # prevents crash reporting from working unless binaries do SetErrorMode() - # themselves. Furthermore, it appears that either python or, more likely, - # the C runtime has a bug where SEM_NOGPFAULTERRORBOX can very - # occasionally *trigger* a crash on process exit - which is hard to debug, - # given that it explicitly prevents crash dumps from working... - # 0x8001 is SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX - CIRRUS_WINDOWS_ERROR_MODE: 0x8001 - - depends_on: SanityCheck - only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*windows.*' - - compute_engine_instance: - image_project: $IMAGE_PROJECT - image: family/pg-ci-windows-ci-vs-2019 - platform: windows - cpu: $CPUS - memory: 4G - - setup_additional_packages_script: | - REM choco install -y --no-progress ... - - setup_hosts_file_script: | - echo 127.0.0.1 pg-loadbalancetest >> c:\Windows\System32\Drivers\etc\hosts - echo 127.0.0.2 pg-loadbalancetest >> c:\Windows\System32\Drivers\etc\hosts - echo 127.0.0.3 pg-loadbalancetest >> c:\Windows\System32\Drivers\etc\hosts - type c:\Windows\System32\Drivers\etc\hosts - - # Use /DEBUG:FASTLINK to avoid high memory usage during linking - configure_script: | - vcvarsall x64 - meson setup --backend ninja --buildtype debug -Dc_link_args=/DEBUG:FASTLINK -Dcassert=true -Db_pch=true -Dextra_lib_dirs=c:\openssl\1.1\lib -Dextra_include_dirs=c:\openssl\1.1\include -DTAR=%TAR% -DPG_TEST_EXTRA="%PG_TEST_EXTRA%" build - - build_script: | - vcvarsall x64 - ninja -C build - - check_world_script: | - vcvarsall x64 - meson test %MTEST_ARGS% --num-processes %TEST_JOBS% - - on_failure: - <<: *on_failure_meson - crashlog_artifacts: - path: "crashlog-*.txt" - type: text/plain - - -task: - << : *WINDOWS_ENVIRONMENT_BASE - name: Windows - Server 2019, MinGW64 - Meson - - # due to resource constraints we don't run this task by default for now - trigger_type: manual - # worth using only_if despite being manual, otherwise this task will show up - # when e.g. ci-os-only: linux is used. - only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' || $CIRRUS_CHANGE_MESSAGE =~ '.*\nci-os-only:[^\n]*mingw.*' - # otherwise it'll be sorted before other tasks - depends_on: SanityCheck - - compute_engine_instance: - image_project: $IMAGE_PROJECT - image: family/pg-ci-windows-ci-mingw64 - platform: windows - cpu: $CPUS - memory: 4G - - env: - TEST_JOBS: 4 # higher concurrency causes occasional failures - CCACHE_DIR: C:/msys64/ccache - CCACHE_MAXSIZE: "500M" - CCACHE_SLOPPINESS: pch_defines,time_macros - CCACHE_DEPEND: 1 - # for some reason mingw plpython cannot find its installation without this - PYTHONHOME: C:/msys64/ucrt64 - # prevents MSYS bash from resetting error mode - MSYS: winjitdebug - # Start bash in current working directory - CHERE_INVOKING: 1 - BASH: C:\msys64\usr\bin\bash.exe -l - - ccache_cache: - folder: ${CCACHE_DIR} - - setup_additional_packages_script: | - REM C:\msys64\usr\bin\pacman.exe -S --noconfirm ... - - mingw_info_script: | - %BASH% -c "where gcc" - %BASH% -c "gcc --version" - %BASH% -c "where perl" - %BASH% -c "perl --version" - - # disable -Dnls as the number of files it creates cause a noticable slowdown - configure_script: | - %BASH% -c "meson setup -Ddebug=true -Doptimization=g -Dcassert=true -Db_pch=true -Dnls=disabled -DTAR=%TAR% build" - - build_script: | - %BASH% -c "ninja -C build" - - upload_caches: ccache - - test_world_script: | - %BASH% -c "meson test %MTEST_ARGS% --num-processes %TEST_JOBS%" - - on_failure: - <<: *on_failure_meson - crashlog_artifacts: - path: "crashlog-*.txt" - type: text/plain - - -task: - name: CompilerWarnings - - # To limit unnecessary work only run this once the SanityCheck - # succeeds. This is particularly important for this task as we intentionally - # use always: to continue after failures. Task that did not run count as a - # success, so we need to recheck SanityChecks's condition here ... - depends_on: SanityCheck - only_if: $CIRRUS_CHANGE_MESSAGE !=~ '.*\nci-os-only:.*' - - env: - CPUS: 4 - BUILD_JOBS: 4 - - # Use larger ccache cache, as this task compiles with multiple compilers / - # flag combinations - CCACHE_MAXSIZE: "1G" - CCACHE_DIR: "/tmp/ccache_dir" - - LINUX_CONFIGURE_FEATURES: *LINUX_CONFIGURE_FEATURES - LINUX_MESON_FEATURES: *LINUX_MESON_FEATURES - - container: - image: $CONTAINER_REPO/linux_debian_bullseye_ci:latest - cpu: $CPUS - - sysinfo_script: | - id - uname -a - cat /proc/cmdline - ulimit -a -H && ulimit -a -S - gcc -v - clang -v - export - - ccache_cache: - folder: $CCACHE_DIR - - setup_additional_packages_script: | - #apt-get update - #DEBIAN_FRONTEND=noninteractive apt-get -y install ... - - ### - # Test that code can be built with gcc/clang without warnings - ### - - setup_script: echo "COPT=-Werror" > src/Makefile.custom - - # Trace probes have a history of getting accidentally broken. Use the - # different compilers to build with different combinations of dtrace on/off - # and cassert on/off. - - # gcc, cassert off, dtrace on - always: - gcc_warning_script: | - time ./configure \ - --cache gcc.cache \ - --enable-dtrace \ - ${LINUX_CONFIGURE_FEATURES} \ - CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" - make -s -j${BUILD_JOBS} clean - time make -s -j${BUILD_JOBS} world-bin - - # gcc, cassert on, dtrace off - always: - gcc_a_warning_script: | - time ./configure \ - --cache gcc.cache \ - --enable-cassert \ - ${LINUX_CONFIGURE_FEATURES} \ - CC="ccache gcc" CXX="ccache g++" CLANG="ccache clang" - make -s -j${BUILD_JOBS} clean - time make -s -j${BUILD_JOBS} world-bin - - # clang, cassert off, dtrace off - always: - clang_warning_script: | - time ./configure \ - --cache clang.cache \ - ${LINUX_CONFIGURE_FEATURES} \ - CC="ccache clang" CXX="ccache clang++" CLANG="ccache clang" - make -s -j${BUILD_JOBS} clean - time make -s -j${BUILD_JOBS} world-bin - - # clang, cassert on, dtrace on - always: - clang_a_warning_script: | - time ./configure \ - --cache clang.cache \ - --enable-cassert \ - --enable-dtrace \ - ${LINUX_CONFIGURE_FEATURES} \ - CC="ccache clang" CXX="ccache clang++" CLANG="ccache clang" - make -s -j${BUILD_JOBS} clean - time make -s -j${BUILD_JOBS} world-bin - - # cross-compile to windows - always: - mingw_cross_warning_script: | - time ./configure \ - --host=x86_64-w64-mingw32 \ - --enable-cassert \ - --without-icu \ - CC="ccache x86_64-w64-mingw32-gcc" \ - CXX="ccache x86_64-w64-mingw32-g++" - make -s -j${BUILD_JOBS} clean - time make -s -j${BUILD_JOBS} world-bin - - ### - # Verify docs can be built - ### - # XXX: Only do this if there have been changes in doc/ since last build - always: - docs_build_script: | - time ./configure \ - --cache gcc.cache \ - CC="ccache gcc" \ - CXX="ccache g++" \ - CLANG="ccache clang" - make -s -j${BUILD_JOBS} clean - time make -s -j${BUILD_JOBS} -C doc + PLATFORM: macos + macos_instance: + image: $IMAGE - ### - # Verify headerscheck / cpluspluscheck succeed - # - # - Don't use ccache, the files are uncacheable, polluting ccache's - # cache - # - Use -fmax-errors, as particularly cpluspluscheck can be very verbose - # - XXX have to disable ICU to avoid errors: - # https://postgr.es/m/20220323002024.f2g6tivduzrktgfa%40alap3.anarazel.de - ### - always: - headers_headerscheck_script: | - time ./configure \ - ${LINUX_CONFIGURE_FEATURES} \ - --without-icu \ - --quiet \ - CC="gcc" CXX"=g++" CLANG="clang" - make -s -j${BUILD_JOBS} clean - time make -s headerscheck EXTRAFLAGS='-fmax-errors=10' - headers_cpluspluscheck_script: | - time make -s cpluspluscheck EXTRAFLAGS='-fmax-errors=10' - always: - upload_caches: ccache +# Contents of REPO_CI_CONFIG_GIT_URL, if defined, will be inserted here, +# followed by the contents .cirrus.tasks.yml. This allows +# REPO_CI_CONFIG_GIT_URL to override how the task types above will be +# executed, e.g. using a custom compute account or permanent workers. diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 00b548c7b0557..3538e0cdc757c 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -14,6 +14,69 @@ # # $ git log --pretty=format:"%H # %cd%n# %s" $PGINDENTGITHASH -1 --date=iso +c739ae9e288c095cfe1b91ce27a2f2c075ed5da4 # 2024-08-26 16:16:09 -0700 +# Fix identation. + +da256a4a7fdcca35fe7ca808686ad3de6ee22306 # 2024-05-14 16:34:50 -0400 +# Pre-beta mechanical code beautification. + +64e401b62b1559d617db5c1e1070d7a05e794c27 # 2024-03-25 14:18:33 +0100 +# Fix indentation from a11f330b5 + +0984a3b851abe89bec6c3eff51b03038808e1997 # 2024-03-05 11:16:23 -0800 +# Run pgindent again on the same file. + +b406af1806e9fc5c090e58282c7d98f22a4b397f # 2024-03-05 10:58:24 -0800 +# Run pgindent for commit ef4cfdce0e. + +dd7ea37c435e10f9c5aa3fb257a05c08814a4ad2 # 2024-03-04 14:37:35 -0500 +# Fix pgindent damage. + +3d47b75546d1ef70145f58e162a96f7e0c649389 # 2024-02-22 08:00:58 +0100 +# pgindent fix + +49e7c6f78ed608c5d5454080ae19c0e7f1b09a04 # 2024-02-09 11:05:01 +0900 +# Fix indentation of copyto.c + +96c019ffa3f883d139709ea0cfe76dc1bce0f1f8 # 2024-01-13 13:54:11 -0500 +# Re-pgindent catcache.c after previous commit. + +611806cd726fc92989ac918eac48fd8d684869c7 # 2023-10-26 09:20:54 +0200 +# Add trailing commas to enum definitions + +e9718b4bd3e4234ffd5a4907a903367fc483c843 # 2023-10-16 09:36:31 +0900 +# Fix code indentation violations in e83d1b0c40cc + +01529c7040088db2718628d0814058598152bd39 # 2023-10-16 13:32:41 +1300 +# Fix comment from commit 22655aa231. + +b6a77c6a6ccf698787201b001cbbbf9c89fe5715 # 2023-10-11 17:14:31 -0400 +# Reindent comment in GenericXLogFinish(). + +bc6041b61f6678d32a5cfb70744653cd8f8d01c0 # 2023-08-30 15:56:22 +0900 +# Fix code indentation vioaltion introduced in commit 3c662643c4. + +89be0b89ae60c63856fd26d82a104781540e2312 # 2023-08-15 17:45:00 +0900 +# Fix code indentation vioaltion introduced in commit 9e9931d2b. + +5dc456b7dda4f7d0d7735b066607c190c74d174a # 2023-08-11 20:43:34 +0900 +# Fix code indentation violations introduced by recent commit + +62e9af4c63fbd36fb9af8450fb44bece76d7766f # 2023-07-25 12:35:58 +0530 +# Fix code indentation vioaltion introduced in commit d38ad8e31d. + +4e465aac36ce9a9533c68dbdc83e67579880e628 # 2023-07-18 14:04:31 +0900 +# Fix indentation in twophase.c + +328f492d2565cfbe383f13a69425d751fd79415f # 2023-07-13 22:26:10 +0900 +# Fix code indentation violation in commit b6e1157e7d + +69a674a170058e63e8178aec8a36a673efce8801 # 2023-07-06 11:49:18 +0530 +# Fix code indentation vioaltion introduced in commit cc32ec24fd. + +a4cfeeca5a97f2b5969c31aa69ba775af95ee5a3 # 2023-07-03 12:47:49 +0200 +# Fix code indentation violations + b334612b8aee9f9a34378982d8938b201dfad323 # 2023-06-20 09:50:43 -0400 # Pre-beta2 mechanical code beautification. diff --git a/.gitattributes b/.gitattributes index 2384956d885df..830313e90f345 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14,19 +14,20 @@ README.* conflict-marker-size=32 *.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/Gen_dummy_probes.pl.prolog whitespace=-blank-at-eof # Test output files that contain extra whitespace *.out -whitespace src/interfaces/ecpg/test/expected/* -whitespace -src/interfaces/libpq/test/expected.out whitespace=-blank-at-eof # These files are maintained or generated elsewhere. We take them as is. configure -whitespace ppport.h -whitespace +src/backend/jit/llvm/SectionMemoryManager.cpp -whitespace +src/backend/jit/llvm/SectionMemoryManager.LICENSE -whitespace src/backend/regex/COPYRIGHT -whitespace src/backend/snowball/libstemmer/*.c -whitespace src/backend/utils/mb/Unicode/*-std.txt -whitespace +src/include/jit/SectionMemoryManager.h -whitespace src/include/snowball/libstemmer/* -whitespace src/timezone/data/* -whitespace src/tools/pg_bsd_indent/* -whitespace diff --git a/COPYRIGHT b/COPYRIGHT index d33e0f599df28..be2d694b03854 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1,7 +1,7 @@ PostgreSQL Database Management System (formerly known as Postgres, then as Postgres95) -Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group Portions Copyright (c) 1994, The Regents of the University of California diff --git a/GNUmakefile.in b/GNUmakefile.in index 9c18c562330c5..cf6e759486ede 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -41,7 +41,7 @@ install-world-bin-contrib-recurse: install-world-bin-src-recurse $(call recurse,installdirs uninstall init-po update-po,doc src config) -$(call recurse,distprep coverage,doc src config contrib) +$(call recurse,coverage,doc src config contrib) # clean, distclean, etc should apply to contrib too, even though # it's not built by default @@ -53,7 +53,7 @@ clean: # Important: distclean `src' last, otherwise Makefile.global # will be gone too soon. -distclean maintainer-clean: +distclean: $(MAKE) -C doc $@ $(MAKE) -C contrib $@ $(MAKE) -C config $@ @@ -87,33 +87,28 @@ update-unicode: | submake-generated-headers submake-libpgport distdir = postgresql-$(VERSION) dummy = =install= -dist: $(distdir).tar.gz $(distdir).tar.bz2 - rm -rf $(distdir) +# git revision to be packaged +PG_GIT_REVISION = HEAD + +GIT = git -$(distdir).tar: distdir - $(TAR) chf $@ $(distdir) +dist: $(distdir).tar.gz $(distdir).tar.bz2 -.INTERMEDIATE: $(distdir).tar +.PHONY: $(distdir).tar.gz $(distdir).tar.bz2 distdir-location: @echo $(distdir) -distdir: - rm -rf $(distdir)* $(dummy) - for x in `cd $(top_srcdir) && find . \( -name CVS -prune \) -o \( -name .git -prune \) -o -print`; do \ - file=`expr X$$x : 'X\./\(.*\)'`; \ - if test -d "$(top_srcdir)/$$file" ; then \ - mkdir "$(distdir)/$$file" && chmod 777 "$(distdir)/$$file"; \ - else \ - ln "$(top_srcdir)/$$file" "$(distdir)/$$file" >/dev/null 2>&1 \ - || cp "$(top_srcdir)/$$file" "$(distdir)/$$file"; \ - fi || exit; \ - done - $(MAKE) -C $(distdir) distprep - $(MAKE) -C $(distdir)/doc/src/sgml/ INSTALL - cp $(distdir)/doc/src/sgml/INSTALL $(distdir)/ - $(MAKE) -C $(distdir) distclean - rm -f $(distdir)/README.git +# Note: core.autocrlf=false is needed to avoid line-ending conversion +# in case the environment has a different setting. Without this, a +# tarball created on Windows might be different than on, and unusable +# on, Unix machines. + +$(distdir).tar.gz: + $(GIT) -C $(srcdir) -c core.autocrlf=false archive --format tar.gz -9 --prefix $(distdir)/ $(PG_GIT_REVISION) -o $(abs_top_builddir)/$@ + +$(distdir).tar.bz2: + $(GIT) -C $(srcdir) -c core.autocrlf=false -c tar.tar.bz2.command='$(BZIP2) -c' archive --format tar.bz2 --prefix $(distdir)/ $(PG_GIT_REVISION) -o $(abs_top_builddir)/$@ distcheck: dist rm -rf $(dummy) @@ -122,7 +117,6 @@ distcheck: dist install_prefix=`cd $(dummy) && pwd`; \ cd $(distdir) \ && ./configure --prefix="$$install_prefix" - $(MAKE) -C $(distdir) -q distprep $(MAKE) -C $(distdir) $(MAKE) -C $(distdir) install $(MAKE) -C $(distdir) uninstall @@ -138,6 +132,6 @@ headerscheck: submake-generated-headers $(top_srcdir)/src/tools/pginclude/headerscheck $(top_srcdir) $(abs_top_builddir) cpluspluscheck: submake-generated-headers - $(top_srcdir)/src/tools/pginclude/cpluspluscheck $(top_srcdir) $(abs_top_builddir) + $(top_srcdir)/src/tools/pginclude/headerscheck --cplusplus $(top_srcdir) $(abs_top_builddir) -.PHONY: dist distdir distcheck docs install-docs world check-world install-world installcheck-world headerscheck cpluspluscheck +.PHONY: dist distcheck docs install-docs world check-world install-world installcheck-world headerscheck cpluspluscheck diff --git a/Makefile b/Makefile index c66fb3027b8dd..7c53ef6518413 100644 --- a/Makefile +++ b/Makefile @@ -13,18 +13,14 @@ # AIX make defaults to building *every* target of the first rule. Start with # a single-target, empty rule to make the other targets non-default. +# (We don't support AIX anymore, but if someone tries to build on AIX anyway, +# at least they'll get the instructions to run 'configure' first.) all: all check install installdirs installcheck installcheck-parallel uninstall clean distclean maintainer-clean dist distcheck world check-world install-world installcheck-world: @if [ ! -f GNUmakefile ] ; then \ - if [ -f INSTALL ] ; then \ - INSTRUCTIONS="INSTALL"; \ - else \ - INSTRUCTIONS="README.git"; \ - fi; \ - echo "You need to run the 'configure' program first. See the file"; \ - echo "'$$INSTRUCTIONS' for installation instructions, or visit: " ; \ - echo "" ; \ + echo "You need to run the 'configure' program first. Please see"; \ + echo "" ; \ false ; \ fi @IFS=':' ; \ diff --git a/README b/README deleted file mode 100644 index 6416a8cf3b467..0000000000000 --- a/README +++ /dev/null @@ -1,27 +0,0 @@ -PostgreSQL Database Management System -===================================== - -This directory contains the source code distribution of the PostgreSQL -database management system. - -PostgreSQL is an advanced object-relational database management system -that supports an extended subset of the SQL standard, including -transactions, foreign keys, subqueries, triggers, user-defined types -and functions. This distribution also contains C language bindings. - -PostgreSQL has many language interfaces, many of which are listed here: - - https://www.postgresql.org/download/ - -See the file INSTALL for instructions on how to build and install -PostgreSQL. That file also lists supported operating systems and -hardware platforms and contains information regarding any other -software packages that are required to build or run the PostgreSQL -system. Copyright and license information can be found in the -file COPYRIGHT. A comprehensive documentation set is included in this -distribution; it can be read as described in the installation -instructions. - -The latest version of this software may be obtained at -https://www.postgresql.org/download/. For more information look at our -web site located at https://www.postgresql.org/. diff --git a/README.git b/README.git deleted file mode 100644 index 4bf614eea4a2e..0000000000000 --- a/README.git +++ /dev/null @@ -1,14 +0,0 @@ -(This file does not appear in release tarballs.) - -In a release or snapshot tarball of PostgreSQL, a documentation file named -INSTALL will appear in this directory. However, this file is not stored in -git and so will not be present if you are using a git checkout. - -If you are using a git checkout, you can view the most recent installation -instructions at: - https://www.postgresql.org/docs/devel/installation.html - -Users compiling from git will also need compatible versions of Bison, Flex, -and Perl, as discussed in the install documentation. These programs are not -needed when using a tarball, since the files they are needed to build are -already present in the tarball. (On Windows, however, you need Perl anyway.) diff --git a/README.md b/README.md new file mode 100644 index 0000000000000..834ddb85c71b3 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +PostgreSQL Database Management System +===================================== + +This directory contains the source code distribution of the PostgreSQL +database management system. + +PostgreSQL is an advanced object-relational database management system +that supports an extended subset of the SQL standard, including +transactions, foreign keys, subqueries, triggers, user-defined types +and functions. This distribution also contains C language bindings. + +Copyright and license information can be found in the file COPYRIGHT. + +General documentation about this version of PostgreSQL can be found at +. In particular, information +about building PostgreSQL from the source code can be found at +. + +The latest version of this software, and related software, may be +obtained at . For more information +look at our web site located at . diff --git a/config/c-compiler.m4 b/config/c-compiler.m4 index 5be8f0f08dcb5..10f8c7bd0a9fb 100644 --- a/config/c-compiler.m4 +++ b/config/c-compiler.m4 @@ -137,7 +137,7 @@ if test x"$pgac_cv__128bit_int" = xyes ; then AC_CACHE_CHECK([for __int128 alignment bug], [pgac_cv__128bit_int_bug], [AC_RUN_IFELSE([AC_LANG_PROGRAM([ /* This must match the corresponding code in c.h: */ -#if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__) +#if defined(__GNUC__) || defined(__SUNPRO_C) #define pg_attribute_aligned(a) __attribute__((aligned(a))) #elif defined(_MSC_VER) #define pg_attribute_aligned(a) __declspec(align(a)) @@ -661,3 +661,94 @@ if test x"$Ac_cachevar" = x"yes"; then fi undefine([Ac_cachevar])dnl ])# PGAC_ARMV8_CRC32C_INTRINSICS + +# PGAC_LOONGARCH_CRC32C_INTRINSICS +# --------------------------- +# Check if the compiler supports the LoongArch CRCC instructions, using +# __builtin_loongarch_crcc_w_b_w, __builtin_loongarch_crcc_w_h_w, +# __builtin_loongarch_crcc_w_w_w and __builtin_loongarch_crcc_w_d_w +# intrinsic functions. +# +# We test for the 8-byte variant since platforms capable of running +# Postgres are 64-bit only (as of PG17), and we know CRC instructions +# are available there without a runtime check. +# +# If the intrinsics are supported, sets pgac_loongarch_crc32c_intrinsics. +AC_DEFUN([PGAC_LOONGARCH_CRC32C_INTRINSICS], +[define([Ac_cachevar], [AS_TR_SH([pgac_cv_loongarch_crc32c_intrinsics])])dnl +AC_CACHE_CHECK( + [for __builtin_loongarch_crcc_w_b_w, __builtin_loongarch_crcc_w_h_w, __builtin_loongarch_crcc_w_w_w and __builtin_loongarch_crcc_w_d_w], + [Ac_cachevar], +[AC_LINK_IFELSE([AC_LANG_PROGRAM([], + [unsigned int crc = 0; + crc = __builtin_loongarch_crcc_w_b_w(0, crc); + crc = __builtin_loongarch_crcc_w_h_w(0, crc); + crc = __builtin_loongarch_crcc_w_w_w(0, crc); + crc = __builtin_loongarch_crcc_w_d_w(0, crc); + /* return computed value, to prevent the above being optimized away */ + return crc == 0;])], + [Ac_cachevar=yes], + [Ac_cachevar=no])]) +if test x"$Ac_cachevar" = x"yes"; then + pgac_loongarch_crc32c_intrinsics=yes +fi +undefine([Ac_cachevar])dnl +])# PGAC_LOONGARCH_CRC32C_INTRINSICS + +# PGAC_XSAVE_INTRINSICS +# --------------------- +# Check if the compiler supports the XSAVE instructions using the _xgetbv +# intrinsic function. +# +# An optional compiler flag can be passed as argument (e.g., -mxsave). If the +# intrinsic is supported, sets pgac_xsave_intrinsics and CFLAGS_XSAVE. +AC_DEFUN([PGAC_XSAVE_INTRINSICS], +[define([Ac_cachevar], [AS_TR_SH([pgac_cv_xsave_intrinsics_$1])])dnl +AC_CACHE_CHECK([for _xgetbv with CFLAGS=$1], [Ac_cachevar], +[pgac_save_CFLAGS=$CFLAGS +CFLAGS="$pgac_save_CFLAGS $1" +AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [return _xgetbv(0) & 0xe0;])], + [Ac_cachevar=yes], + [Ac_cachevar=no]) +CFLAGS="$pgac_save_CFLAGS"]) +if test x"$Ac_cachevar" = x"yes"; then + CFLAGS_XSAVE="$1" + pgac_xsave_intrinsics=yes +fi +undefine([Ac_cachevar])dnl +])# PGAC_XSAVE_INTRINSICS + +# PGAC_AVX512_POPCNT_INTRINSICS +# ----------------------------- +# Check if the compiler supports the AVX-512 popcount instructions using the +# _mm512_setzero_si512, _mm512_maskz_loadu_epi8, _mm512_popcnt_epi64, +# _mm512_add_epi64, and _mm512_reduce_add_epi64 intrinsic functions. +# +# Optional compiler flags can be passed as argument (e.g., -mavx512vpopcntdq +# -mavx512bw). If the intrinsics are supported, sets +# pgac_avx512_popcnt_intrinsics and CFLAGS_POPCNT. +AC_DEFUN([PGAC_AVX512_POPCNT_INTRINSICS], +[define([Ac_cachevar], [AS_TR_SH([pgac_cv_avx512_popcnt_intrinsics_$1])])dnl +AC_CACHE_CHECK([for _mm512_popcnt_epi64 with CFLAGS=$1], [Ac_cachevar], +[pgac_save_CFLAGS=$CFLAGS +CFLAGS="$pgac_save_CFLAGS $1" +AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [const char buf@<:@sizeof(__m512i)@:>@; + PG_INT64_TYPE popcnt = 0; + __m512i accum = _mm512_setzero_si512(); + const __m512i val = _mm512_maskz_loadu_epi8((__mmask64) 0xf0f0f0f0f0f0f0f0, (const __m512i *) buf); + const __m512i cnt = _mm512_popcnt_epi64(val); + accum = _mm512_add_epi64(accum, cnt); + popcnt = _mm512_reduce_add_epi64(accum); + /* return computed value, to prevent the above being optimized away */ + return popcnt == 0;])], + [Ac_cachevar=yes], + [Ac_cachevar=no]) +CFLAGS="$pgac_save_CFLAGS"]) +if test x"$Ac_cachevar" = x"yes"; then + CFLAGS_POPCNT="$1" + pgac_avx512_popcnt_intrinsics=yes +fi +undefine([Ac_cachevar])dnl +])# PGAC_AVX512_POPCNT_INTRINSICS diff --git a/config/c-library.m4 b/config/c-library.m4 index c1dd80467988c..aa8223d2ef0e9 100644 --- a/config/c-library.m4 +++ b/config/c-library.m4 @@ -86,9 +86,9 @@ AC_DEFUN([PGAC_STRUCT_SOCKADDR_SA_LEN], # PGAC_TYPE_LOCALE_T # ------------------ # Check for the locale_t type and find the right header file. macOS -# needs xlocale.h; standard is locale.h, but glibc also has an -# xlocale.h file that we should not use. -# +# needs xlocale.h; standard is locale.h, but glibc <= 2.25 also had an +# xlocale.h file that we should not use, so we check the standard +# header first. AC_DEFUN([PGAC_TYPE_LOCALE_T], [AC_CACHE_CHECK([for locale_t], pgac_cv_type_locale_t, [AC_COMPILE_IFELSE([AC_LANG_PROGRAM( @@ -102,10 +102,6 @@ locale_t x;], [])], [pgac_cv_type_locale_t='yes (in xlocale.h)'], [pgac_cv_type_locale_t=no])])]) -if test "$pgac_cv_type_locale_t" != no; then - AC_DEFINE(HAVE_LOCALE_T, 1, - [Define to 1 if the system has the type `locale_t'.]) -fi if test "$pgac_cv_type_locale_t" = 'yes (in xlocale.h)'; then AC_DEFINE(LOCALE_T_IN_XLOCALE, 1, [Define to 1 if `locale_t' requires .]) diff --git a/config/check_modules.pl b/config/check_modules.pl index 611f3a673fdf9..b605634e073b9 100644 --- a/config/check_modules.pl +++ b/config/check_modules.pl @@ -1,3 +1,6 @@ + +# Copyright (c) 2024, PostgreSQL Global Development Group + # # Verify that required Perl modules are available, # in at least the required minimum versions. @@ -5,7 +8,7 @@ # but specify them anyway for documentation's sake.) # use strict; -use warnings; +use warnings FATAL => 'all'; use Config; use IPC::Run 0.79; diff --git a/config/config.guess b/config/config.guess index 69188da73d743..f6d217a49f8f4 100644 --- a/config/config.guess +++ b/config/config.guess @@ -1,10 +1,10 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2023 Free Software Foundation, Inc. +# Copyright 1992-2024 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2023-01-01' +timestamp='2024-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -47,7 +47,7 @@ me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] -Output the configuration name of the system \`$me' is run on. +Output the configuration name of the system '$me' is run on. Options: -h, --help print this help, then exit @@ -60,13 +60,13 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2023 Free Software Foundation, Inc. +Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" -Try \`$me --help' for more information." +Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do @@ -102,8 +102,8 @@ GUESS= # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still -# use `HOST_CC' if defined, but it is deprecated. +# Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still +# use 'HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. @@ -155,6 +155,9 @@ Linux|GNU|GNU/*) set_cc_for_build cat <<-EOF > "$dummy.c" + #if defined(__ANDROID__) + LIBC=android + #else #include #if defined(__UCLIBC__) LIBC=uclibc @@ -162,6 +165,8 @@ Linux|GNU|GNU/*) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu + #elif defined(__LLVM_LIBC__) + LIBC=llvm #else #include /* First heuristic to detect musl libc. */ @@ -169,6 +174,7 @@ Linux|GNU|GNU/*) LIBC=musl #endif #endif + #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" @@ -459,7 +465,7 @@ case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in UNAME_RELEASE=`uname -v` ;; esac - # Japanese Language versions have a version number like `4.1.3-JL'. + # Japanese Language versions have a version number like '4.1.3-JL'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; @@ -904,7 +910,7 @@ EOF fi ;; *:FreeBSD:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` + UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; @@ -976,7 +982,27 @@ EOF GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) - GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + set_cc_for_build + CPU=$UNAME_MACHINE + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + ABI=64 + sed 's/^ //' << EOF > "$dummy.c" + #ifdef __ARM_EABI__ + #ifdef __ARM_PCS_VFP + ABI=eabihf + #else + ABI=eabi + #endif + #endif +EOF + cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` + eval "$cc_set_abi" + case $ABI in + eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;; + esac + fi + GUESS=$CPU-unknown-linux-$LIBCABI ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be @@ -1042,6 +1068,15 @@ EOF k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; + kvx:Linux:*:*) + GUESS=$UNAME_MACHINE-unknown-linux-$LIBC + ;; + kvx:cos:*:*) + GUESS=$UNAME_MACHINE-unknown-cos + ;; + kvx:mbr:*:*) + GUESS=$UNAME_MACHINE-unknown-mbr + ;; loongarch32:Linux:*:* | loongarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; @@ -1197,7 +1232,7 @@ EOF GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) - # If we were able to find `uname', then EMX Unix compatibility + # If we were able to find 'uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; @@ -1338,7 +1373,7 @@ EOF GUESS=ns32k-sni-sysv fi ;; - PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; @@ -1560,6 +1595,9 @@ EOF *:Unleashed:*:*) GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ;; + *:Ironclad:*:*) + GUESS=$UNAME_MACHINE-unknown-ironclad + ;; esac # Do we have a guess based on uname results? diff --git a/config/config.sub b/config/config.sub index 3c26ae98b2fe9..2c6a07ab3c34e 100644 --- a/config/config.sub +++ b/config/config.sub @@ -1,10 +1,10 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2023 Free Software Foundation, Inc. +# Copyright 1992-2024 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2023-01-21' +timestamp='2024-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -76,13 +76,13 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2023 Free Software Foundation, Inc. +Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" -Try \`$me --help' for more information." +Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do @@ -130,7 +130,7 @@ IFS=$saved_IFS # Separate into logical components for further validation case $1 in *-*-*-*-*) - echo Invalid configuration \`"$1"\': more than four components >&2 + echo "Invalid configuration '$1': more than four components" >&2 exit 1 ;; *-*-*-*) @@ -145,7 +145,8 @@ case $1 in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ - | storm-chaos* | os2-emx* | rtmk-nova* | managarm-*) + | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \ + | windows-* ) basic_machine=$field1 basic_os=$maybe_os ;; @@ -943,7 +944,7 @@ $basic_machine EOF IFS=$saved_IFS ;; - # We use `pc' rather than `unknown' + # We use 'pc' rather than 'unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) @@ -1180,7 +1181,7 @@ case $cpu-$vendor in case $cpu in 1750a | 580 \ | a29k \ - | aarch64 | aarch64_be \ + | aarch64 | aarch64_be | aarch64c | arm64ec \ | abacus \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ @@ -1199,12 +1200,14 @@ case $cpu-$vendor in | d10v | d30v | dlx | dsp16xx \ | e2k | elxsi | epiphany \ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ + | javascript \ | h8300 | h8500 \ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i*86 | i860 | i960 | ia16 | ia64 \ | ip2k | iq2000 \ | k1om \ + | kvx \ | le32 | le64 \ | lm32 \ | loongarch32 | loongarch64 \ @@ -1213,36 +1216,13 @@ case $cpu-$vendor in | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ | m88110 | m88k | maxq | mb | mcore | mep | metag \ | microblaze | microblazeel \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64eb | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa32r3 | mipsisa32r3el \ - | mipsisa32r5 | mipsisa32r5el \ - | mipsisa32r6 | mipsisa32r6el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64r3 | mipsisa64r3el \ - | mipsisa64r5 | mipsisa64r5el \ - | mipsisa64r6 | mipsisa64r6el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipsr5900 | mipsr5900el \ - | mipstx39 | mipstx39el \ + | mips* \ | mmix \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ + | nanomips* \ | nds32 | nds32le | nds32be \ | nfp \ | nios | nios2 | nios2eb | nios2el \ @@ -1274,6 +1254,7 @@ case $cpu-$vendor in | ubicom32 \ | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ | vax \ + | vc4 \ | visium \ | w65 \ | wasm32 | wasm64 \ @@ -1285,7 +1266,7 @@ case $cpu-$vendor in ;; *) - echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 + echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2 exit 1 ;; esac @@ -1306,11 +1287,12 @@ esac # Decode manufacturer-specific aliases for certain operating systems. -if test x$basic_os != x +if test x"$basic_os" != x then # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. +obj= case $basic_os in gnu/linux*) kernel=linux @@ -1510,10 +1492,16 @@ case $os in os=eabi ;; *) - os=elf + os= + obj=elf ;; esac ;; + aout* | coff* | elf* | pe*) + # These are machine code file formats, not OSes + obj=$os + os= + ;; *) # No normalization, but not necessarily accepted, that comes below. ;; @@ -1532,12 +1520,15 @@ else # system, and we'll never get to this point. kernel= +obj= case $cpu-$vendor in score-*) - os=elf + os= + obj=elf ;; spu-*) - os=elf + os= + obj=elf ;; *-acorn) os=riscix1.2 @@ -1547,28 +1538,35 @@ case $cpu-$vendor in os=gnu ;; arm*-semi) - os=aout + os= + obj=aout ;; c4x-* | tic4x-*) - os=coff + os= + obj=coff ;; c8051-*) - os=elf + os= + obj=elf ;; clipper-intergraph) os=clix ;; hexagon-*) - os=elf + os= + obj=elf ;; tic54x-*) - os=coff + os= + obj=coff ;; tic55x-*) - os=coff + os= + obj=coff ;; tic6x-*) - os=coff + os= + obj=coff ;; # This must come before the *-dec entry. pdp10-*) @@ -1590,19 +1588,24 @@ case $cpu-$vendor in os=sunos3 ;; m68*-cisco) - os=aout + os= + obj=aout ;; mep-*) - os=elf + os= + obj=elf ;; mips*-cisco) - os=elf + os= + obj=elf ;; - mips*-*) - os=elf + mips*-*|nanomips*-*) + os= + obj=elf ;; or32-*) - os=coff + os= + obj=coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=sysv3 @@ -1611,7 +1614,8 @@ case $cpu-$vendor in os=sunos4.1.1 ;; pru-*) - os=elf + os= + obj=elf ;; *-be) os=beos @@ -1692,10 +1696,12 @@ case $cpu-$vendor in os=uxpv ;; *-rom68k) - os=coff + os= + obj=coff ;; *-*bug) - os=coff + os= + obj=coff ;; *-apple) os=macos @@ -1713,17 +1719,21 @@ esac fi -# Now, validate our (potentially fixed-up) OS. +# Now, validate our (potentially fixed-up) individual pieces (OS, OBJ). + case $os in # Sometimes we do "kernel-libc", so those need to count as OSes. - musl* | newlib* | relibc* | uclibc*) + llvm* | musl* | newlib* | relibc* | uclibc*) ;; # Likewise for "kernel-abi" eabi* | gnueabi*) ;; - # VxWorks passes extra cpu info in the 4th field. + # VxWorks passes extra cpu info in the 4th filed. simlinux | simwindows | spe) ;; + # See `case $cpu-$os` validation below + ghcjs) + ;; # Now accept the basic system types. # The portable systems comes first. # Each alternative MUST end in a * to match a version number. @@ -1732,7 +1742,7 @@ case $os in | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ | hiux* | abug | nacl* | netware* | windows* \ - | os9* | macos* | osx* | ios* \ + | os9* | macos* | osx* | ios* | tvos* | watchos* \ | mpw* | magic* | mmixware* | mon960* | lnews* \ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ | aos* | aros* | cloudabi* | sortix* | twizzler* \ @@ -1741,11 +1751,11 @@ case $os in | mirbsd* | netbsd* | dicos* | openedition* | ose* \ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ - | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ - | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | bosx* | nextstep* | cxux* | oabi* \ + | ptx* | ecoff* | winnt* | domain* | vsta* \ | udi* | lites* | ieee* | go32* | aux* | hcos* \ | chorusrdb* | cegcc* | glidix* | serenity* \ - | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | cygwin* | msys* | moss* | proelf* | rtems* \ | midipix* | mingw32* | mingw64* | mint* \ | uxpv* | beos* | mpeix* | udk* | moxiebox* \ | interix* | uwin* | mks* | rhapsody* | darwin* \ @@ -1758,62 +1768,116 @@ case $os in | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \ - | fiwix* | mlibc* ) + | fiwix* | mlibc* | cos* | mbr* | ironclad* ) ;; # This one is extra strict with allowed versions sco3.2v2 | sco3.2v[4-9]* | sco5v6*) # Don't forget version if it is 3.2v4 or newer. ;; + # This refers to builds using the UEFI calling convention + # (which depends on the architecture) and PE file format. + # Note that this is both a different calling convention and + # different file format than that of GNU-EFI + # (x86_64-w64-mingw32). + uefi) + ;; none) ;; - kernel* ) + kernel* | msvc* ) # Restricted further below ;; + '') + if test x"$obj" = x + then + echo "Invalid configuration '$1': Blank OS only allowed with explicit machine code file format" 1>&2 + fi + ;; *) - echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 + echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 + exit 1 + ;; +esac + +case $obj in + aout* | coff* | elf* | pe*) + ;; + '') + # empty is fine + ;; + *) + echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 + exit 1 + ;; +esac + +# Here we handle the constraint that a (synthetic) cpu and os are +# valid only in combination with each other and nowhere else. +case $cpu-$os in + # The "javascript-unknown-ghcjs" triple is used by GHC; we + # accept it here in order to tolerate that, but reject any + # variations. + javascript-ghcjs) + ;; + javascript-* | *-ghcjs) + echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. -case $kernel-$os in - linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ - | linux-musl* | linux-relibc* | linux-uclibc* | linux-mlibc* ) +case $kernel-$os-$obj in + linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \ + | linux-mlibc*- | linux-musl*- | linux-newlib*- \ + | linux-relibc*- | linux-uclibc*- ) ;; - uclinux-uclibc* ) + uclinux-uclibc*- ) ;; - managarm-mlibc* | managarm-kernel* ) + managarm-mlibc*- | managarm-kernel*- ) ;; - -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* | -mlibc* ) + windows*-msvc*-) + ;; + -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \ + | -uclibc*- ) # These are just libc implementations, not actual OSes, and thus # require a kernel. - echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 exit 1 ;; - -kernel* ) - echo "Invalid configuration \`$1': \`$os' needs explicit kernel." 1>&2 + -kernel*- ) + echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 exit 1 ;; - *-kernel* ) - echo "Invalid configuration \`$1': \`$kernel' does not support \`$os'." 1>&2 + *-kernel*- ) + echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 exit 1 ;; - kfreebsd*-gnu* | kopensolaris*-gnu*) + *-msvc*- ) + echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 + exit 1 ;; - vxworks-simlinux | vxworks-simwindows | vxworks-spe) + kfreebsd*-gnu*- | kopensolaris*-gnu*-) ;; - nto-qnx*) + vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) ;; - os2-emx) + nto-qnx*-) + ;; + os2-emx-) + ;; + *-eabi*- | *-gnueabi*-) ;; - *-eabi* | *-gnueabi*) + none--*) + # None (no kernel, i.e. freestanding / bare metal), + # can be paired with an machine code file format ;; - -*) + -*-) # Blank kernel with real OS is always fine. ;; - *-*) - echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + --*) + # Blank kernel and OS with real machine code file format is always fine. + ;; + *-*-*) + echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 exit 1 ;; esac @@ -1896,7 +1960,7 @@ case $vendor in ;; esac -echo "$cpu-$vendor-${kernel:+$kernel-}$os" +echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" exit # Local variables: diff --git a/config/llvm.m4 b/config/llvm.m4 index 3a75cd8b4dfe9..c6cf8858f645e 100644 --- a/config/llvm.m4 +++ b/config/llvm.m4 @@ -13,7 +13,7 @@ AC_DEFUN([PGAC_LLVM_SUPPORT], AC_REQUIRE([AC_PROG_AWK]) AC_ARG_VAR(LLVM_CONFIG, [path to llvm-config command]) - PGAC_PATH_PROGS(LLVM_CONFIG, llvm-config llvm-config-7 llvm-config-6.0 llvm-config-5.0 llvm-config-4.0 llvm-config-3.9) + PGAC_PATH_PROGS(LLVM_CONFIG, llvm-config) # no point continuing if llvm wasn't found if test -z "$LLVM_CONFIG"; then @@ -25,13 +25,14 @@ AC_DEFUN([PGAC_LLVM_SUPPORT], AC_MSG_ERROR([$LLVM_CONFIG does not work]) fi # and whether the version is supported - if echo $pgac_llvm_version | $AWK -F '.' '{ if ([$]1 >= 4 || ([$]1 == 3 && [$]2 >= 9)) exit 1; else exit 0;}';then - AC_MSG_ERROR([$LLVM_CONFIG version is $pgac_llvm_version but at least 3.9 is required]) + if echo $pgac_llvm_version | $AWK -F '.' '{ if ([$]1 >= 10) exit 1; else exit 0;}';then + AC_MSG_ERROR([$LLVM_CONFIG version is $pgac_llvm_version but at least 10 is required]) fi + AC_MSG_NOTICE([using llvm $pgac_llvm_version]) # need clang to create some bitcode files AC_ARG_VAR(CLANG, [path to clang compiler to generate bitcode]) - PGAC_PATH_PROGS(CLANG, clang clang-7 clang-6.0 clang-5.0 clang-4.0 clang-3.9) + PGAC_PATH_PROGS(CLANG, clang) if test -z "$CLANG"; then AC_MSG_ERROR([clang not found, but required when compiling --with-llvm, specify with CLANG=]) fi @@ -114,8 +115,6 @@ AC_DEFUN([PGAC_CHECK_LLVM_FUNCTIONS], # Check which functionality is present SAVE_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $LLVM_CPPFLAGS" - AC_CHECK_DECLS([LLVMOrcGetSymbolAddressIn], [], [], [[#include ]]) - AC_CHECK_DECLS([LLVMGetHostCPUName, LLVMGetHostCPUFeatures], [], [], [[#include ]]) AC_CHECK_DECLS([LLVMCreateGDBRegistrationListener, LLVMCreatePerfJITEventListener], [], [], [[#include ]]) CPPFLAGS="$SAVE_CPPFLAGS" ])# PGAC_CHECK_LLVM_FUNCTIONS diff --git a/config/perl.m4 b/config/perl.m4 index 8126e79f67dcb..59b1a0e956f20 100644 --- a/config/perl.m4 +++ b/config/perl.m4 @@ -13,19 +13,14 @@ if test "$PERL"; then if echo "$pgac_perl_version" | sed ['s/[.a-z_]/ /g'] | \ $AWK '{ if ([$]1 == 5 && ([$]2 >= 14)) exit 1; else exit 0;}' then - AC_MSG_WARN([ + AC_MSG_ERROR([ *** The installed version of Perl, $PERL, is too old to use with PostgreSQL. *** Perl version 5.14 or later is required, but this is $pgac_perl_version.]) - PERL="" fi fi if test -z "$PERL"; then - AC_MSG_WARN([ -*** Without Perl you will not be able to build PostgreSQL from Git. -*** You can obtain Perl from any CPAN mirror site. -*** (If you are using the official distribution of PostgreSQL then you do not -*** need to worry about this, because the Perl output is pre-generated.)]) + AC_MSG_ERROR([Perl not found]) fi ])# PGAC_PATH_PERL @@ -58,10 +53,17 @@ AC_DEFUN([PGAC_CHECK_PERL_CONFIGS], # would be fatal to try to compile PL/Perl to a different libc ABI than core # Postgres uses. The available information says that most symbols that affect # Perl's own ABI begin with letters, so it's almost sufficient to adopt -D -# switches for symbols not beginning with underscore. Some exceptions are the -# Windows-specific -D_USE_32BIT_TIME_T and -D__MINGW_USE_VC2005_COMPAT; see -# Mkvcbuild.pm for details. We absorb the former when Perl reports it. Perl -# never reports the latter, and we don't attempt to deduce when it's needed. +# switches for symbols not beginning with underscore. + +# Some exceptions are the Windows-specific -D_USE_32BIT_TIME_T and +# -D__MINGW_USE_VC2005_COMPAT. To be exact, Windows offers several 32-bit ABIs. +# Perl is sensitive to sizeof(time_t), one of the ABI dimensions. PostgreSQL +# doesn't support building with pre-MSVC-2005 compilers, but it does support +# linking to Perl built with such a compiler. MSVC-built Perl 5.13.4 and +# later report -D_USE_32BIT_TIME_T in $Config{ccflags} if applicable, but +# MinGW-built Perl never reports -D_USE_32BIT_TIME_T despite typically needing +# it. +# # Consequently, we don't support using MinGW to link to MSVC-built Perl. As # of 2017, all supported ActivePerl and Strawberry Perl are MinGW-built. If # that changes or an MSVC-built Perl distribution becomes prominent, we can diff --git a/config/programs.m4 b/config/programs.m4 index 8a118b4e03483..490ec9fe9f5d8 100644 --- a/config/programs.m4 +++ b/config/programs.m4 @@ -33,10 +33,9 @@ if test "$BISON"; then AC_MSG_NOTICE([using $pgac_bison_version]) if echo "$pgac_bison_version" | $AWK '{ if ([$]4 < 2.3) exit 0; else exit 1;}' then - AC_MSG_WARN([ + AC_MSG_ERROR([ *** The installed version of Bison, $BISON, is too old to use with PostgreSQL. *** Bison version 2.3 or later is required, but this is $pgac_bison_version.]) - BISON="" fi # Bison >=3.0 issues warnings about %name-prefix="base_yy", instead # of the now preferred %name-prefix "base_yy", but the latter @@ -49,12 +48,7 @@ if test "$BISON"; then fi if test -z "$BISON"; then - AC_MSG_WARN([ -*** Without Bison you will not be able to build PostgreSQL from Git nor -*** change any of the parser definition files. You can obtain Bison from -*** a GNU mirror site. (If you are using the official distribution of -*** PostgreSQL then you do not need to worry about this, because the Bison -*** output is pre-generated.)]) + AC_MSG_ERROR([bison not found]) fi dnl We don't need AC_SUBST(BISON) because PGAC_PATH_PROGS did it AC_SUBST(BISONFLAGS) @@ -95,7 +89,7 @@ else pgac_cv_path_flex=$pgac_candidate break 2 else - AC_MSG_WARN([ + AC_MSG_ERROR([ *** The installed version of Flex, $pgac_candidate, is too old to use with PostgreSQL. *** Flex version 2.5.35 or later is required, but this is $pgac_flex_version.]) fi @@ -109,14 +103,7 @@ fi ])[]dnl AC_CACHE_CHECK if test x"$pgac_cv_path_flex" = x"no"; then - AC_MSG_WARN([ -*** Without Flex you will not be able to build PostgreSQL from Git nor -*** change any of the scanner definition files. You can obtain Flex from -*** a GNU mirror site. (If you are using the official distribution of -*** PostgreSQL then you do not need to worry about this because the Flex -*** output is pre-generated.)]) - - FLEX= + AC_MSG_ERROR([flex not found]) else FLEX=$pgac_cv_path_flex pgac_flex_version=`$FLEX --version 2>/dev/null` diff --git a/configure b/configure index a1c3cb003699e..6ea253f50636f 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for PostgreSQL 16beta2. +# Generated by GNU Autoconf 2.69 for PostgreSQL 17.5. # # Report bugs to . # @@ -11,7 +11,7 @@ # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # -# Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Copyright (c) 1996-2024, PostgreSQL Global Development Group ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## @@ -582,8 +582,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='PostgreSQL' PACKAGE_TARNAME='postgresql' -PACKAGE_VERSION='16beta2' -PACKAGE_STRING='PostgreSQL 16beta2' +PACKAGE_VERSION='17.5' +PACKAGE_STRING='PostgreSQL 17.5' PACKAGE_BUGREPORT='pgsql-bugs@lists.postgresql.org' PACKAGE_URL='https://www.postgresql.org/' @@ -647,6 +647,9 @@ MSGFMT_FLAGS MSGFMT PG_CRC32C_OBJS CFLAGS_CRC +PG_POPCNT_OBJS +CFLAGS_POPCNT +CFLAGS_XSAVE LIBOBJS OPENSSL ZSTD @@ -722,7 +725,6 @@ with_tcl ICU_LIBS ICU_CFLAGS with_icu -enable_thread_safety INCLUDES autodepend PKG_CONFIG_LIBDIR @@ -760,6 +762,7 @@ CPPFLAGS LDFLAGS CFLAGS CC +enable_injection_points enable_tap_tests enable_dtrace DTRACEFLAGS @@ -840,15 +843,14 @@ enable_profiling enable_coverage enable_dtrace enable_tap_tests +enable_injection_points with_blocksize with_segsize with_segsize_blocks with_wal_blocksize -with_CC with_llvm enable_depend enable_cassert -enable_thread_safety with_icu with_tcl with_tclconfig @@ -1448,7 +1450,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures PostgreSQL 16beta2 to adapt to many kinds of systems. +\`configure' configures PostgreSQL 17.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1513,7 +1515,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of PostgreSQL 16beta2:";; + short | recursive ) echo "Configuration of PostgreSQL 17.5:";; esac cat <<\_ACEOF @@ -1534,9 +1536,10 @@ Optional Features: --enable-coverage build with coverage testing instrumentation --enable-dtrace build with DTrace support --enable-tap-tests enable TAP tests (requires Perl and IPC::Run) + --enable-injection-points + enable injection points (for testing) --enable-depend turn on automatic dependency tracking --enable-cassert enable assertion checks (for debugging) - --disable-thread-safety disable thread-safety in client libraries --disable-largefile omit support for large files Optional Packages: @@ -1556,7 +1559,6 @@ Optional Packages: set table segment size in blocks [0] --with-wal-blocksize=BLOCKSIZE set WAL block size in kB [8] - --with-CC=CMD set compiler (deprecated) --with-llvm build with LLVM based JIT support --without-icu build without ICU support --with-tcl build Tcl modules (PL/Tcl) @@ -1688,14 +1690,14 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -PostgreSQL configure 16beta2 +PostgreSQL configure 17.5 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. -Copyright (c) 1996-2023, PostgreSQL Global Development Group +Copyright (c) 1996-2024, PostgreSQL Global Development Group _ACEOF exit fi @@ -2094,116 +2096,116 @@ $as_echo "$ac_res" >&6; } } # ac_fn_c_check_func -# ac_fn_c_check_type LINENO TYPE VAR INCLUDES -# ------------------------------------------- -# Tests whether TYPE exists after having included INCLUDES, setting cache -# variable VAR accordingly. -ac_fn_c_check_type () +# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES +# ---------------------------------------------------- +# Tries to find if the field MEMBER exists in type AGGR, after including +# INCLUDES, setting cache variable VAR accordingly. +ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +$as_echo_n "checking for $2.$3... " >&6; } +if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else - eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$4 +$5 int main () { -if (sizeof ($2)) - return 0; +static $2 ac_aggr; +if (ac_aggr.$3) +return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$4 +$5 int main () { -if (sizeof (($2))) - return 0; +static $2 ac_aggr; +if (sizeof ac_aggr.$3) +return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - + eval "$4=yes" else - eval "$3=yes" + eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -eval ac_res=\$$3 +eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -} # ac_fn_c_check_type +} # ac_fn_c_check_member -# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES -# ---------------------------------------------------- -# Tries to find if the field MEMBER exists in type AGGR, after including -# INCLUDES, setting cache variable VAR accordingly. -ac_fn_c_check_member () +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 -$as_echo_n "checking for $2.$3... " >&6; } -if eval \${$4+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else + eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$5 +$4 int main () { -static $2 ac_aggr; -if (ac_aggr.$3) -return 0; +if (sizeof ($2)) + return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - eval "$4=yes" -else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -$5 +$4 int main () { -static $2 ac_aggr; -if (sizeof ac_aggr.$3) -return 0; +if (sizeof (($2))) + return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - eval "$4=yes" + else - eval "$4=no" + eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -eval ac_res=\$$4 +eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno -} # ac_fn_c_check_member +} # ac_fn_c_check_type # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- @@ -2441,7 +2443,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by PostgreSQL $as_me 16beta2, which was +It was created by PostgreSQL $as_me 17.5, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2986,7 +2988,6 @@ else # --with-template not given case $host_os in - aix*) template=aix ;; cygwin*|msys*) template=cygwin ;; darwin*) template=darwin ;; dragonfly*) template=netbsd ;; @@ -3685,6 +3686,36 @@ fi +# +# Injection points +# + + +# Check whether --enable-injection-points was given. +if test "${enable_injection_points+set}" = set; then : + enableval=$enable_injection_points; + case $enableval in + yes) + +$as_echo "#define USE_INJECTION_POINTS 1" >>confdefs.h + + ;; + no) + : + ;; + *) + as_fn_error $? "no argument expected for --enable-injection-points option" "$LINENO" 5 + ;; + esac + +else + enable_injection_points=no + +fi + + + + # # Block size # @@ -3861,35 +3892,10 @@ _ACEOF # C compiler # -# For historical reasons you can also use --with-CC to specify the C compiler -# to use, although the standard way to do this is to set the CC environment -# variable. - - - -# Check whether --with-CC was given. -if test "${with_CC+set}" = set; then : - withval=$with_CC; - case $withval in - yes) - as_fn_error $? "argument required for --with-CC option" "$LINENO" 5 - ;; - no) - as_fn_error $? "argument required for --with-CC option" "$LINENO" 5 - ;; - *) - CC=$with_CC - ;; - esac - -fi - - - -case $template in - aix) pgac_cc_list="gcc xlc"; pgac_cxx_list="g++ xlC";; - *) pgac_cc_list="gcc cc"; pgac_cxx_list="g++ c++";; -esac +# If you don't specify a list of compilers to test, the AC_PROG_CC and +# AC_PROG_CXX macros test for a long list of unsupported compilers. +pgac_cc_list="gcc cc" +pgac_cxx_list="g++ c++" ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -5059,7 +5065,7 @@ if test "$with_llvm" = yes; then : if test -z "$LLVM_CONFIG"; then - for ac_prog in llvm-config llvm-config-7 llvm-config-6.0 llvm-config-5.0 llvm-config-4.0 llvm-config-3.9 + for ac_prog in llvm-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 @@ -5123,14 +5129,16 @@ fi as_fn_error $? "$LLVM_CONFIG does not work" "$LINENO" 5 fi # and whether the version is supported - if echo $pgac_llvm_version | $AWK -F '.' '{ if ($1 >= 4 || ($1 == 3 && $2 >= 9)) exit 1; else exit 0;}';then - as_fn_error $? "$LLVM_CONFIG version is $pgac_llvm_version but at least 3.9 is required" "$LINENO" 5 + if echo $pgac_llvm_version | $AWK -F '.' '{ if ($1 >= 10) exit 1; else exit 0;}';then + as_fn_error $? "$LLVM_CONFIG version is $pgac_llvm_version but at least 10 is required" "$LINENO" 5 fi + { $as_echo "$as_me:${as_lineno-$LINENO}: using llvm $pgac_llvm_version" >&5 +$as_echo "$as_me: using llvm $pgac_llvm_version" >&6;} # need clang to create some bitcode files if test -z "$CLANG"; then - for ac_prog in clang clang-7 clang-6.0 clang-5.0 clang-4.0 clang-3.9 + for ac_prog in clang do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 @@ -6841,18 +6849,28 @@ if test x"$pgac_cv_prog_CXX_cxxflags__fno_strict_aliasing" = x"yes"; then fi -elif test "$PORTNAME" = "aix"; then - # AIX's xlc has to have strict aliasing turned off too +fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -qnoansialias, for CFLAGS" >&5 -$as_echo_n "checking whether ${CC} supports -qnoansialias, for CFLAGS... " >&6; } -if ${pgac_cv_prog_CC_cflags__qnoansialias+:} false; then : +# If the compiler knows how to hide symbols, add the switch needed for that to +# CFLAGS_SL_MODULE and define HAVE_VISIBILITY_ATTRIBUTE. +# +# This is done separately from the above because -fvisibility is supported by +# quite a few different compilers, making the required repetition bothersome. +# +# We might need to add a separate test to check if +# __attribute__((visibility("hidden"))) is supported, if we encounter a +# compiler that supports one of the supported variants of -fvisibility=hidden +# but uses a different syntax to mark a symbol as exported. +if test "$GCC" = yes -o "$SUN_STUDIO_CC" = yes ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -fvisibility=hidden, for CFLAGS_SL_MODULE" >&5 +$as_echo_n "checking whether ${CC} supports -fvisibility=hidden, for CFLAGS_SL_MODULE... " >&6; } +if ${pgac_cv_prog_CC_cflags__fvisibility_hidden+:} false; then : $as_echo_n "(cached) " >&6 else pgac_save_CFLAGS=$CFLAGS pgac_save_CC=$CC CC=${CC} -CFLAGS="${CFLAGS} -qnoansialias" +CFLAGS="${CFLAGS_SL_MODULE} -fvisibility=hidden" ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -6867,31 +6885,32 @@ main () } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - pgac_cv_prog_CC_cflags__qnoansialias=yes + pgac_cv_prog_CC_cflags__fvisibility_hidden=yes else - pgac_cv_prog_CC_cflags__qnoansialias=no + pgac_cv_prog_CC_cflags__fvisibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="$pgac_save_CFLAGS" CC="$pgac_save_CC" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CC_cflags__qnoansialias" >&5 -$as_echo "$pgac_cv_prog_CC_cflags__qnoansialias" >&6; } -if test x"$pgac_cv_prog_CC_cflags__qnoansialias" = x"yes"; then - CFLAGS="${CFLAGS} -qnoansialias" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CC_cflags__fvisibility_hidden" >&5 +$as_echo "$pgac_cv_prog_CC_cflags__fvisibility_hidden" >&6; } +if test x"$pgac_cv_prog_CC_cflags__fvisibility_hidden" = x"yes"; then + CFLAGS_SL_MODULE="${CFLAGS_SL_MODULE} -fvisibility=hidden" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -qnoansialias, for CXXFLAGS" >&5 -$as_echo_n "checking whether ${CXX} supports -qnoansialias, for CXXFLAGS... " >&6; } -if ${pgac_cv_prog_CXX_cxxflags__qnoansialias+:} false; then : + # For C++ we additionally want -fvisibility-inlines-hidden + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -fvisibility=hidden, for CXXFLAGS_SL_MODULE" >&5 +$as_echo_n "checking whether ${CXX} supports -fvisibility=hidden, for CXXFLAGS_SL_MODULE... " >&6; } +if ${pgac_cv_prog_CXX_cxxflags__fvisibility_hidden+:} false; then : $as_echo_n "(cached) " >&6 else pgac_save_CXXFLAGS=$CXXFLAGS pgac_save_CXX=$CXX CXX=${CXX} -CXXFLAGS="${CXXFLAGS} -qnoansialias" +CXXFLAGS="${CXXFLAGS_SL_MODULE} -fvisibility=hidden" ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_ext=cpp @@ -6912,9 +6931,9 @@ main () } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : - pgac_cv_prog_CXX_cxxflags__qnoansialias=yes + pgac_cv_prog_CXX_cxxflags__fvisibility_hidden=yes else - pgac_cv_prog_CXX_cxxflags__qnoansialias=no + pgac_cv_prog_CXX_cxxflags__fvisibility_hidden=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c @@ -6927,62 +6946,21 @@ ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="$pgac_save_CXXFLAGS" CXX="$pgac_save_CXX" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CXX_cxxflags__qnoansialias" >&5 -$as_echo "$pgac_cv_prog_CXX_cxxflags__qnoansialias" >&6; } -if test x"$pgac_cv_prog_CXX_cxxflags__qnoansialias" = x"yes"; then - CXXFLAGS="${CXXFLAGS} -qnoansialias" -fi - - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -qlonglong, for CFLAGS" >&5 -$as_echo_n "checking whether ${CC} supports -qlonglong, for CFLAGS... " >&6; } -if ${pgac_cv_prog_CC_cflags__qlonglong+:} false; then : - $as_echo_n "(cached) " >&6 -else - pgac_save_CFLAGS=$CFLAGS -pgac_save_CC=$CC -CC=${CC} -CFLAGS="${CFLAGS} -qlonglong" -ac_save_c_werror_flag=$ac_c_werror_flag -ac_c_werror_flag=yes -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - pgac_cv_prog_CC_cflags__qlonglong=yes -else - pgac_cv_prog_CC_cflags__qlonglong=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_c_werror_flag=$ac_save_c_werror_flag -CFLAGS="$pgac_save_CFLAGS" -CC="$pgac_save_CC" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CC_cflags__qlonglong" >&5 -$as_echo "$pgac_cv_prog_CC_cflags__qlonglong" >&6; } -if test x"$pgac_cv_prog_CC_cflags__qlonglong" = x"yes"; then - CFLAGS="${CFLAGS} -qlonglong" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CXX_cxxflags__fvisibility_hidden" >&5 +$as_echo "$pgac_cv_prog_CXX_cxxflags__fvisibility_hidden" >&6; } +if test x"$pgac_cv_prog_CXX_cxxflags__fvisibility_hidden" = x"yes"; then + CXXFLAGS_SL_MODULE="${CXXFLAGS_SL_MODULE} -fvisibility=hidden" fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -qlonglong, for CXXFLAGS" >&5 -$as_echo_n "checking whether ${CXX} supports -qlonglong, for CXXFLAGS... " >&6; } -if ${pgac_cv_prog_CXX_cxxflags__qlonglong+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -fvisibility-inlines-hidden, for CXXFLAGS_SL_MODULE" >&5 +$as_echo_n "checking whether ${CXX} supports -fvisibility-inlines-hidden, for CXXFLAGS_SL_MODULE... " >&6; } +if ${pgac_cv_prog_CXX_cxxflags__fvisibility_inlines_hidden+:} false; then : $as_echo_n "(cached) " >&6 else pgac_save_CXXFLAGS=$CXXFLAGS pgac_save_CXX=$CXX CXX=${CXX} -CXXFLAGS="${CXXFLAGS} -qlonglong" +CXXFLAGS="${CXXFLAGS_SL_MODULE} -fvisibility-inlines-hidden" ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_ext=cpp @@ -7003,9 +6981,9 @@ main () } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : - pgac_cv_prog_CXX_cxxflags__qlonglong=yes + pgac_cv_prog_CXX_cxxflags__fvisibility_inlines_hidden=yes else - pgac_cv_prog_CXX_cxxflags__qlonglong=no + pgac_cv_prog_CXX_cxxflags__fvisibility_inlines_hidden=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c @@ -7018,35 +6996,44 @@ ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="$pgac_save_CXXFLAGS" CXX="$pgac_save_CXX" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CXX_cxxflags__qlonglong" >&5 -$as_echo "$pgac_cv_prog_CXX_cxxflags__qlonglong" >&6; } -if test x"$pgac_cv_prog_CXX_cxxflags__qlonglong" = x"yes"; then - CXXFLAGS="${CXXFLAGS} -qlonglong" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CXX_cxxflags__fvisibility_inlines_hidden" >&5 +$as_echo "$pgac_cv_prog_CXX_cxxflags__fvisibility_inlines_hidden" >&6; } +if test x"$pgac_cv_prog_CXX_cxxflags__fvisibility_inlines_hidden" = x"yes"; then + CXXFLAGS_SL_MODULE="${CXXFLAGS_SL_MODULE} -fvisibility-inlines-hidden" fi + have_visibility_attribute=$pgac_cv_prog_CC_cflags__fvisibility_hidden +fi + +if test "$have_visibility_attribute" = "yes"; then + +$as_echo "#define HAVE_VISIBILITY_ATTRIBUTE 1" >>confdefs.h fi -# If the compiler knows how to hide symbols, add the switch needed for that to -# CFLAGS_SL_MODULE and define HAVE_VISIBILITY_ATTRIBUTE. -# -# This is done separately from the above because -fvisibility is supported by -# quite a few different compilers, making the required repetition bothersome. -# -# We might need to add a separate test to check if -# __attribute__((visibility("hidden"))) is supported, if we encounter a -# compiler that supports one of the supported variants of -fvisibility=hidden -# but uses a different syntax to mark a symbol as exported. -if test "$GCC" = yes -o "$SUN_STUDIO_CC" = yes ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -fvisibility=hidden, for CFLAGS_SL_MODULE" >&5 -$as_echo_n "checking whether ${CC} supports -fvisibility=hidden, for CFLAGS_SL_MODULE... " >&6; } -if ${pgac_cv_prog_CC_cflags__fvisibility_hidden+:} false; then : + + + + + +# Determine flags used to emit bitcode for JIT inlining. +# 1. We must duplicate any behaviour-changing compiler flags used above, +# to keep compatibility with the compiler used for normal Postgres code. +# 2. We don't bother to duplicate extra-warnings switches --- seeing a +# warning in the main build is enough. +# 3. But we must duplicate -Wno-warning flags, else we'll see those anyway. +if test "$with_llvm" = yes ; then + CLANGXX="$CLANG -xc++" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -fno-strict-aliasing, for BITCODE_CFLAGS" >&5 +$as_echo_n "checking whether ${CLANG} supports -fno-strict-aliasing, for BITCODE_CFLAGS... " >&6; } +if ${pgac_cv_prog_CLANG_cflags__fno_strict_aliasing+:} false; then : $as_echo_n "(cached) " >&6 else pgac_save_CFLAGS=$CFLAGS pgac_save_CC=$CC -CC=${CC} -CFLAGS="${CFLAGS_SL_MODULE} -fvisibility=hidden" +CC=${CLANG} +CFLAGS="${BITCODE_CFLAGS} -fno-strict-aliasing" ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -7061,82 +7048,30 @@ main () } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - pgac_cv_prog_CC_cflags__fvisibility_hidden=yes + pgac_cv_prog_CLANG_cflags__fno_strict_aliasing=yes else - pgac_cv_prog_CC_cflags__fvisibility_hidden=no + pgac_cv_prog_CLANG_cflags__fno_strict_aliasing=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="$pgac_save_CFLAGS" CC="$pgac_save_CC" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CC_cflags__fvisibility_hidden" >&5 -$as_echo "$pgac_cv_prog_CC_cflags__fvisibility_hidden" >&6; } -if test x"$pgac_cv_prog_CC_cflags__fvisibility_hidden" = x"yes"; then - CFLAGS_SL_MODULE="${CFLAGS_SL_MODULE} -fvisibility=hidden" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cflags__fno_strict_aliasing" >&5 +$as_echo "$pgac_cv_prog_CLANG_cflags__fno_strict_aliasing" >&6; } +if test x"$pgac_cv_prog_CLANG_cflags__fno_strict_aliasing" = x"yes"; then + BITCODE_CFLAGS="${BITCODE_CFLAGS} -fno-strict-aliasing" fi - - # For C++ we additionally want -fvisibility-inlines-hidden - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -fvisibility=hidden, for CXXFLAGS_SL_MODULE" >&5 -$as_echo_n "checking whether ${CXX} supports -fvisibility=hidden, for CXXFLAGS_SL_MODULE... " >&6; } -if ${pgac_cv_prog_CXX_cxxflags__fvisibility_hidden+:} false; then : - $as_echo_n "(cached) " >&6 -else - pgac_save_CXXFLAGS=$CXXFLAGS -pgac_save_CXX=$CXX -CXX=${CXX} -CXXFLAGS="${CXXFLAGS_SL_MODULE} -fvisibility=hidden" -ac_save_cxx_werror_flag=$ac_cxx_werror_flag -ac_cxx_werror_flag=yes -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_cxx_try_compile "$LINENO"; then : - pgac_cv_prog_CXX_cxxflags__fvisibility_hidden=yes -else - pgac_cv_prog_CXX_cxxflags__fvisibility_hidden=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -ac_cxx_werror_flag=$ac_save_cxx_werror_flag -CXXFLAGS="$pgac_save_CXXFLAGS" -CXX="$pgac_save_CXX" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CXX_cxxflags__fvisibility_hidden" >&5 -$as_echo "$pgac_cv_prog_CXX_cxxflags__fvisibility_hidden" >&6; } -if test x"$pgac_cv_prog_CXX_cxxflags__fvisibility_hidden" = x"yes"; then - CXXFLAGS_SL_MODULE="${CXXFLAGS_SL_MODULE} -fvisibility=hidden" -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -fvisibility-inlines-hidden, for CXXFLAGS_SL_MODULE" >&5 -$as_echo_n "checking whether ${CXX} supports -fvisibility-inlines-hidden, for CXXFLAGS_SL_MODULE... " >&6; } -if ${pgac_cv_prog_CXX_cxxflags__fvisibility_inlines_hidden+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANGXX} supports -fno-strict-aliasing, for BITCODE_CXXFLAGS" >&5 +$as_echo_n "checking whether ${CLANGXX} supports -fno-strict-aliasing, for BITCODE_CXXFLAGS... " >&6; } +if ${pgac_cv_prog_CLANGXX_cxxflags__fno_strict_aliasing+:} false; then : $as_echo_n "(cached) " >&6 else pgac_save_CXXFLAGS=$CXXFLAGS pgac_save_CXX=$CXX -CXX=${CXX} -CXXFLAGS="${CXXFLAGS_SL_MODULE} -fvisibility-inlines-hidden" +CXX=${CLANGXX} +CXXFLAGS="${BITCODE_CXXFLAGS} -fno-strict-aliasing" ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_ext=cpp @@ -7157,9 +7092,9 @@ main () } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : - pgac_cv_prog_CXX_cxxflags__fvisibility_inlines_hidden=yes + pgac_cv_prog_CLANGXX_cxxflags__fno_strict_aliasing=yes else - pgac_cv_prog_CXX_cxxflags__fvisibility_inlines_hidden=no + pgac_cv_prog_CLANGXX_cxxflags__fno_strict_aliasing=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c @@ -7172,24 +7107,21 @@ ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="$pgac_save_CXXFLAGS" CXX="$pgac_save_CXX" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CXX_cxxflags__fvisibility_inlines_hidden" >&5 -$as_echo "$pgac_cv_prog_CXX_cxxflags__fvisibility_inlines_hidden" >&6; } -if test x"$pgac_cv_prog_CXX_cxxflags__fvisibility_inlines_hidden" = x"yes"; then - CXXFLAGS_SL_MODULE="${CXXFLAGS_SL_MODULE} -fvisibility-inlines-hidden" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANGXX_cxxflags__fno_strict_aliasing" >&5 +$as_echo "$pgac_cv_prog_CLANGXX_cxxflags__fno_strict_aliasing" >&6; } +if test x"$pgac_cv_prog_CLANGXX_cxxflags__fno_strict_aliasing" = x"yes"; then + BITCODE_CXXFLAGS="${BITCODE_CXXFLAGS} -fno-strict-aliasing" fi - have_visibility_attribute=$pgac_cv_prog_CC_cflags__fvisibility_hidden -elif test "$PORTNAME" = "aix"; then - # Note that xlc accepts -fvisibility=hidden as a file. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -qvisibility=hidden, for CFLAGS_SL_MODULE" >&5 -$as_echo_n "checking whether ${CC} supports -qvisibility=hidden, for CFLAGS_SL_MODULE... " >&6; } -if ${pgac_cv_prog_CC_cflags__qvisibility_hidden+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -fwrapv, for BITCODE_CFLAGS" >&5 +$as_echo_n "checking whether ${CLANG} supports -fwrapv, for BITCODE_CFLAGS... " >&6; } +if ${pgac_cv_prog_CLANG_cflags__fwrapv+:} false; then : $as_echo_n "(cached) " >&6 else pgac_save_CFLAGS=$CFLAGS pgac_save_CC=$CC -CC=${CC} -CFLAGS="${CFLAGS_SL_MODULE} -qvisibility=hidden" +CC=${CLANG} +CFLAGS="${BITCODE_CFLAGS} -fwrapv" ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -7204,31 +7136,30 @@ main () } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - pgac_cv_prog_CC_cflags__qvisibility_hidden=yes + pgac_cv_prog_CLANG_cflags__fwrapv=yes else - pgac_cv_prog_CC_cflags__qvisibility_hidden=no + pgac_cv_prog_CLANG_cflags__fwrapv=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="$pgac_save_CFLAGS" CC="$pgac_save_CC" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CC_cflags__qvisibility_hidden" >&5 -$as_echo "$pgac_cv_prog_CC_cflags__qvisibility_hidden" >&6; } -if test x"$pgac_cv_prog_CC_cflags__qvisibility_hidden" = x"yes"; then - CFLAGS_SL_MODULE="${CFLAGS_SL_MODULE} -qvisibility=hidden" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cflags__fwrapv" >&5 +$as_echo "$pgac_cv_prog_CLANG_cflags__fwrapv" >&6; } +if test x"$pgac_cv_prog_CLANG_cflags__fwrapv" = x"yes"; then + BITCODE_CFLAGS="${BITCODE_CFLAGS} -fwrapv" fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -qvisibility=hidden, for CXXFLAGS_SL_MODULE" >&5 -$as_echo_n "checking whether ${CXX} supports -qvisibility=hidden, for CXXFLAGS_SL_MODULE... " >&6; } -if ${pgac_cv_prog_CXX_cxxflags__qvisibility_hidden+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANGXX} supports -fwrapv, for BITCODE_CXXFLAGS" >&5 +$as_echo_n "checking whether ${CLANGXX} supports -fwrapv, for BITCODE_CXXFLAGS... " >&6; } +if ${pgac_cv_prog_CLANGXX_cxxflags__fwrapv+:} false; then : $as_echo_n "(cached) " >&6 else pgac_save_CXXFLAGS=$CXXFLAGS pgac_save_CXX=$CXX -CXX=${CXX} -CXXFLAGS="${CXXFLAGS_SL_MODULE} -qvisibility=hidden" +CXX=${CLANGXX} +CXXFLAGS="${BITCODE_CXXFLAGS} -fwrapv" ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_ext=cpp @@ -7249,9 +7180,9 @@ main () } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : - pgac_cv_prog_CXX_cxxflags__qvisibility_hidden=yes + pgac_cv_prog_CLANGXX_cxxflags__fwrapv=yes else - pgac_cv_prog_CXX_cxxflags__qvisibility_hidden=no + pgac_cv_prog_CLANGXX_cxxflags__fwrapv=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c @@ -7264,49 +7195,21 @@ ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="$pgac_save_CXXFLAGS" CXX="$pgac_save_CXX" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CXX_cxxflags__qvisibility_hidden" >&5 -$as_echo "$pgac_cv_prog_CXX_cxxflags__qvisibility_hidden" >&6; } -if test x"$pgac_cv_prog_CXX_cxxflags__qvisibility_hidden" = x"yes"; then - CXXFLAGS_SL_MODULE="${CXXFLAGS_SL_MODULE} -qvisibility=hidden" -fi - - have_visibility_attribute=$pgac_cv_prog_CC_cflags__qvisibility_hidden - # Old xlc versions (<13.1) don't have support for -qvisibility. Use expfull to force - # all extension module symbols to be exported. - if test "$pgac_cv_prog_CC_cflags__qvisibility_hidden" != "yes"; then - CFLAGS_SL_MODULE="$CFLAGS_SL_MODULE -Wl,-b,expfull" - fi -fi - -if test "$have_visibility_attribute" = "yes"; then - -$as_echo "#define HAVE_VISIBILITY_ATTRIBUTE 1" >>confdefs.h - +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANGXX_cxxflags__fwrapv" >&5 +$as_echo "$pgac_cv_prog_CLANGXX_cxxflags__fwrapv" >&6; } +if test x"$pgac_cv_prog_CLANGXX_cxxflags__fwrapv" = x"yes"; then + BITCODE_CXXFLAGS="${BITCODE_CXXFLAGS} -fwrapv" fi - - - - - -# Determine flags used to emit bitcode for JIT inlining. -# 1. We must duplicate any behaviour-changing compiler flags used above, -# to keep compatibility with the compiler used for normal Postgres code. -# 2. We don't bother to duplicate extra-warnings switches --- seeing a -# warning in the main build is enough. -# 3. But we must duplicate -Wno-warning flags, else we'll see those anyway. -if test "$with_llvm" = yes ; then - CLANGXX="$CLANG -xc++" - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -fno-strict-aliasing, for BITCODE_CFLAGS" >&5 -$as_echo_n "checking whether ${CLANG} supports -fno-strict-aliasing, for BITCODE_CFLAGS... " >&6; } -if ${pgac_cv_prog_CLANG_cflags__fno_strict_aliasing+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -fexcess-precision=standard, for BITCODE_CFLAGS" >&5 +$as_echo_n "checking whether ${CLANG} supports -fexcess-precision=standard, for BITCODE_CFLAGS... " >&6; } +if ${pgac_cv_prog_CLANG_cflags__fexcess_precision_standard+:} false; then : $as_echo_n "(cached) " >&6 else pgac_save_CFLAGS=$CFLAGS pgac_save_CC=$CC CC=${CLANG} -CFLAGS="${BITCODE_CFLAGS} -fno-strict-aliasing" +CFLAGS="${BITCODE_CFLAGS} -fexcess-precision=standard" ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -7321,30 +7224,30 @@ main () } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - pgac_cv_prog_CLANG_cflags__fno_strict_aliasing=yes + pgac_cv_prog_CLANG_cflags__fexcess_precision_standard=yes else - pgac_cv_prog_CLANG_cflags__fno_strict_aliasing=no + pgac_cv_prog_CLANG_cflags__fexcess_precision_standard=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="$pgac_save_CFLAGS" CC="$pgac_save_CC" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cflags__fno_strict_aliasing" >&5 -$as_echo "$pgac_cv_prog_CLANG_cflags__fno_strict_aliasing" >&6; } -if test x"$pgac_cv_prog_CLANG_cflags__fno_strict_aliasing" = x"yes"; then - BITCODE_CFLAGS="${BITCODE_CFLAGS} -fno-strict-aliasing" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cflags__fexcess_precision_standard" >&5 +$as_echo "$pgac_cv_prog_CLANG_cflags__fexcess_precision_standard" >&6; } +if test x"$pgac_cv_prog_CLANG_cflags__fexcess_precision_standard" = x"yes"; then + BITCODE_CFLAGS="${BITCODE_CFLAGS} -fexcess-precision=standard" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANGXX} supports -fno-strict-aliasing, for BITCODE_CXXFLAGS" >&5 -$as_echo_n "checking whether ${CLANGXX} supports -fno-strict-aliasing, for BITCODE_CXXFLAGS... " >&6; } -if ${pgac_cv_prog_CLANGXX_cxxflags__fno_strict_aliasing+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANGXX} supports -fexcess-precision=standard, for BITCODE_CXXFLAGS" >&5 +$as_echo_n "checking whether ${CLANGXX} supports -fexcess-precision=standard, for BITCODE_CXXFLAGS... " >&6; } +if ${pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard+:} false; then : $as_echo_n "(cached) " >&6 else pgac_save_CXXFLAGS=$CXXFLAGS pgac_save_CXX=$CXX CXX=${CLANGXX} -CXXFLAGS="${BITCODE_CXXFLAGS} -fno-strict-aliasing" +CXXFLAGS="${BITCODE_CXXFLAGS} -fexcess-precision=standard" ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_ext=cpp @@ -7365,9 +7268,9 @@ main () } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : - pgac_cv_prog_CLANGXX_cxxflags__fno_strict_aliasing=yes + pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard=yes else - pgac_cv_prog_CLANGXX_cxxflags__fno_strict_aliasing=no + pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c @@ -7380,21 +7283,22 @@ ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="$pgac_save_CXXFLAGS" CXX="$pgac_save_CXX" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANGXX_cxxflags__fno_strict_aliasing" >&5 -$as_echo "$pgac_cv_prog_CLANGXX_cxxflags__fno_strict_aliasing" >&6; } -if test x"$pgac_cv_prog_CLANGXX_cxxflags__fno_strict_aliasing" = x"yes"; then - BITCODE_CXXFLAGS="${BITCODE_CXXFLAGS} -fno-strict-aliasing" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard" >&5 +$as_echo "$pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard" >&6; } +if test x"$pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard" = x"yes"; then + BITCODE_CXXFLAGS="${BITCODE_CXXFLAGS} -fexcess-precision=standard" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -fwrapv, for BITCODE_CFLAGS" >&5 -$as_echo_n "checking whether ${CLANG} supports -fwrapv, for BITCODE_CFLAGS... " >&6; } -if ${pgac_cv_prog_CLANG_cflags__fwrapv+:} false; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -Xclang -no-opaque-pointers, for BITCODE_CFLAGS" >&5 +$as_echo_n "checking whether ${CLANG} supports -Xclang -no-opaque-pointers, for BITCODE_CFLAGS... " >&6; } +if ${pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers+:} false; then : $as_echo_n "(cached) " >&6 else pgac_save_CFLAGS=$CFLAGS pgac_save_CC=$CC CC=${CLANG} -CFLAGS="${BITCODE_CFLAGS} -fwrapv" +CFLAGS="${BITCODE_CFLAGS} -Xclang -no-opaque-pointers" ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -7409,30 +7313,30 @@ main () } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - pgac_cv_prog_CLANG_cflags__fwrapv=yes + pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers=yes else - pgac_cv_prog_CLANG_cflags__fwrapv=no + pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="$pgac_save_CFLAGS" CC="$pgac_save_CC" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cflags__fwrapv" >&5 -$as_echo "$pgac_cv_prog_CLANG_cflags__fwrapv" >&6; } -if test x"$pgac_cv_prog_CLANG_cflags__fwrapv" = x"yes"; then - BITCODE_CFLAGS="${BITCODE_CFLAGS} -fwrapv" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers" >&5 +$as_echo "$pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers" >&6; } +if test x"$pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers" = x"yes"; then + BITCODE_CFLAGS="${BITCODE_CFLAGS} -Xclang -no-opaque-pointers" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANGXX} supports -fwrapv, for BITCODE_CXXFLAGS" >&5 -$as_echo_n "checking whether ${CLANGXX} supports -fwrapv, for BITCODE_CXXFLAGS... " >&6; } -if ${pgac_cv_prog_CLANGXX_cxxflags__fwrapv+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANGXX} supports -Xclang -no-opaque-pointers, for BITCODE_CXXFLAGS" >&5 +$as_echo_n "checking whether ${CLANGXX} supports -Xclang -no-opaque-pointers, for BITCODE_CXXFLAGS... " >&6; } +if ${pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers+:} false; then : $as_echo_n "(cached) " >&6 else pgac_save_CXXFLAGS=$CXXFLAGS pgac_save_CXX=$CXX CXX=${CLANGXX} -CXXFLAGS="${BITCODE_CXXFLAGS} -fwrapv" +CXXFLAGS="${BITCODE_CXXFLAGS} -Xclang -no-opaque-pointers" ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_ext=cpp @@ -7453,9 +7357,9 @@ main () } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : - pgac_cv_prog_CLANGXX_cxxflags__fwrapv=yes + pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers=yes else - pgac_cv_prog_CLANGXX_cxxflags__fwrapv=no + pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c @@ -7468,59 +7372,26 @@ ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="$pgac_save_CXXFLAGS" CXX="$pgac_save_CXX" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANGXX_cxxflags__fwrapv" >&5 -$as_echo "$pgac_cv_prog_CLANGXX_cxxflags__fwrapv" >&6; } -if test x"$pgac_cv_prog_CLANGXX_cxxflags__fwrapv" = x"yes"; then - BITCODE_CXXFLAGS="${BITCODE_CXXFLAGS} -fwrapv" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" >&5 +$as_echo "$pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" >&6; } +if test x"$pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" = x"yes"; then + BITCODE_CXXFLAGS="${BITCODE_CXXFLAGS} -Xclang -no-opaque-pointers" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -fexcess-precision=standard, for BITCODE_CFLAGS" >&5 -$as_echo_n "checking whether ${CLANG} supports -fexcess-precision=standard, for BITCODE_CFLAGS... " >&6; } -if ${pgac_cv_prog_CLANG_cflags__fexcess_precision_standard+:} false; then : - $as_echo_n "(cached) " >&6 -else - pgac_save_CFLAGS=$CFLAGS -pgac_save_CC=$CC -CC=${CLANG} -CFLAGS="${BITCODE_CFLAGS} -fexcess-precision=standard" -ac_save_c_werror_flag=$ac_c_werror_flag -ac_c_werror_flag=yes -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - pgac_cv_prog_CLANG_cflags__fexcess_precision_standard=yes -else - pgac_cv_prog_CLANG_cflags__fexcess_precision_standard=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_c_werror_flag=$ac_save_c_werror_flag -CFLAGS="$pgac_save_CFLAGS" -CC="$pgac_save_CC" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cflags__fexcess_precision_standard" >&5 -$as_echo "$pgac_cv_prog_CLANG_cflags__fexcess_precision_standard" >&6; } -if test x"$pgac_cv_prog_CLANG_cflags__fexcess_precision_standard" = x"yes"; then - BITCODE_CFLAGS="${BITCODE_CFLAGS} -fexcess-precision=standard" -fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANGXX} supports -fexcess-precision=standard, for BITCODE_CXXFLAGS" >&5 -$as_echo_n "checking whether ${CLANGXX} supports -fexcess-precision=standard, for BITCODE_CXXFLAGS... " >&6; } -if ${pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard+:} false; then : + # Ideally bitcode should perhaps match $CC's use, or not, of outline atomic + # functions, but for now we err on the side of suppressing them in bitcode, + # because we can't assume they're available at runtime. This affects aarch64 + # builds using the basic armv8-a ISA without LSE support. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -mno-outline-atomics, for BITCODE_CFLAGS" >&5 +$as_echo_n "checking whether ${CLANG} supports -mno-outline-atomics, for BITCODE_CFLAGS... " >&6; } +if ${pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics+:} false; then : $as_echo_n "(cached) " >&6 else pgac_save_CXXFLAGS=$CXXFLAGS pgac_save_CXX=$CXX -CXX=${CLANGXX} -CXXFLAGS="${BITCODE_CXXFLAGS} -fexcess-precision=standard" +CXX=${CLANG} +CXXFLAGS="${BITCODE_CFLAGS} -mno-outline-atomics" ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_ext=cpp @@ -7541,9 +7412,9 @@ main () } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : - pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard=yes + pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics=yes else - pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard=no + pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c @@ -7556,60 +7427,21 @@ ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="$pgac_save_CXXFLAGS" CXX="$pgac_save_CXX" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard" >&5 -$as_echo "$pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard" >&6; } -if test x"$pgac_cv_prog_CLANGXX_cxxflags__fexcess_precision_standard" = x"yes"; then - BITCODE_CXXFLAGS="${BITCODE_CXXFLAGS} -fexcess-precision=standard" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" >&5 +$as_echo "$pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" >&6; } +if test x"$pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" = x"yes"; then + BITCODE_CFLAGS="${BITCODE_CFLAGS} -mno-outline-atomics" fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -Xclang -no-opaque-pointers, for BITCODE_CFLAGS" >&5 -$as_echo_n "checking whether ${CLANG} supports -Xclang -no-opaque-pointers, for BITCODE_CFLAGS... " >&6; } -if ${pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers+:} false; then : - $as_echo_n "(cached) " >&6 -else - pgac_save_CFLAGS=$CFLAGS -pgac_save_CC=$CC -CC=${CLANG} -CFLAGS="${BITCODE_CFLAGS} -Xclang -no-opaque-pointers" -ac_save_c_werror_flag=$ac_c_werror_flag -ac_c_werror_flag=yes -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers=yes -else - pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_c_werror_flag=$ac_save_c_werror_flag -CFLAGS="$pgac_save_CFLAGS" -CC="$pgac_save_CC" -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers" >&5 -$as_echo "$pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers" >&6; } -if test x"$pgac_cv_prog_CLANG_cflags__Xclang__no_opaque_pointers" = x"yes"; then - BITCODE_CFLAGS="${BITCODE_CFLAGS} -Xclang -no-opaque-pointers" -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANGXX} supports -Xclang -no-opaque-pointers, for BITCODE_CXXFLAGS" >&5 -$as_echo_n "checking whether ${CLANGXX} supports -Xclang -no-opaque-pointers, for BITCODE_CXXFLAGS... " >&6; } -if ${pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CLANG} supports -mno-outline-atomics, for BITCODE_CXXFLAGS" >&5 +$as_echo_n "checking whether ${CLANG} supports -mno-outline-atomics, for BITCODE_CXXFLAGS... " >&6; } +if ${pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics+:} false; then : $as_echo_n "(cached) " >&6 else pgac_save_CXXFLAGS=$CXXFLAGS pgac_save_CXX=$CXX -CXX=${CLANGXX} -CXXFLAGS="${BITCODE_CXXFLAGS} -Xclang -no-opaque-pointers" +CXX=${CLANG} +CXXFLAGS="${BITCODE_CXXFLAGS} -mno-outline-atomics" ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_ext=cpp @@ -7630,9 +7462,9 @@ main () } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : - pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers=yes + pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics=yes else - pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers=no + pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_ext=c @@ -7645,10 +7477,10 @@ ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="$pgac_save_CXXFLAGS" CXX="$pgac_save_CXX" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" >&5 -$as_echo "$pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" >&6; } -if test x"$pgac_cv_prog_CLANGXX_cxxflags__Xclang__no_opaque_pointers" = x"yes"; then - BITCODE_CXXFLAGS="${BITCODE_CXXFLAGS} -Xclang -no-opaque-pointers" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" >&5 +$as_echo "$pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" >&6; } +if test x"$pgac_cv_prog_CLANG_cxxflags__mno_outline_atomics" = x"yes"; then + BITCODE_CXXFLAGS="${BITCODE_CXXFLAGS} -mno-outline-atomics" fi @@ -8338,43 +8170,6 @@ $as_echo "$as_me: WARNING: *** Library directory $dir does not exist." >&2;} done IFS=$ac_save_IFS -# -# Enable thread-safe client libraries -# -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking allow thread-safe client libraries" >&5 -$as_echo_n "checking allow thread-safe client libraries... " >&6; } - - -# Check whether --enable-thread-safety was given. -if test "${enable_thread_safety+set}" = set; then : - enableval=$enable_thread_safety; - case $enableval in - yes) - : - ;; - no) - : - ;; - *) - as_fn_error $? "no argument expected for --enable-thread-safety option" "$LINENO" 5 - ;; - esac - -else - enable_thread_safety=yes - -fi - - -if test "$enable_thread_safety" = yes; then - -$as_echo "#define ENABLE_THREAD_SAFETY 1" >>confdefs.h - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_thread_safety" >&5 -$as_echo "$enable_thread_safety" >&6; } - - # # ICU # @@ -10200,13 +9995,9 @@ if test "$BISON"; then $as_echo "$as_me: using $pgac_bison_version" >&6;} if echo "$pgac_bison_version" | $AWK '{ if ($4 < 2.3) exit 0; else exit 1;}' then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -*** The installed version of Bison, $BISON, is too old to use with PostgreSQL. -*** Bison version 2.3 or later is required, but this is $pgac_bison_version." >&5 -$as_echo "$as_me: WARNING: + as_fn_error $? " *** The installed version of Bison, $BISON, is too old to use with PostgreSQL. -*** Bison version 2.3 or later is required, but this is $pgac_bison_version." >&2;} - BISON="" +*** Bison version 2.3 or later is required, but this is $pgac_bison_version." "$LINENO" 5 fi # Bison >=3.0 issues warnings about %name-prefix="base_yy", instead # of the now preferred %name-prefix "base_yy", but the latter @@ -10219,18 +10010,7 @@ $as_echo "$as_me: WARNING: fi if test -z "$BISON"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -*** Without Bison you will not be able to build PostgreSQL from Git nor -*** change any of the parser definition files. You can obtain Bison from -*** a GNU mirror site. (If you are using the official distribution of -*** PostgreSQL then you do not need to worry about this, because the Bison -*** output is pre-generated.)" >&5 -$as_echo "$as_me: WARNING: -*** Without Bison you will not be able to build PostgreSQL from Git nor -*** change any of the parser definition files. You can obtain Bison from -*** a GNU mirror site. (If you are using the official distribution of -*** PostgreSQL then you do not need to worry about this, because the Bison -*** output is pre-generated.)" >&2;} + as_fn_error $? "bison not found" "$LINENO" 5 fi @@ -10263,12 +10043,9 @@ else pgac_cv_path_flex=$pgac_candidate break 2 else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -*** The installed version of Flex, $pgac_candidate, is too old to use with PostgreSQL. -*** Flex version 2.5.35 or later is required, but this is $pgac_flex_version." >&5 -$as_echo "$as_me: WARNING: + as_fn_error $? " *** The installed version of Flex, $pgac_candidate, is too old to use with PostgreSQL. -*** Flex version 2.5.35 or later is required, but this is $pgac_flex_version." >&2;} +*** Flex version 2.5.35 or later is required, but this is $pgac_flex_version." "$LINENO" 5 fi fi fi @@ -10282,20 +10059,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_path_flex" >&5 $as_echo "$pgac_cv_path_flex" >&6; } if test x"$pgac_cv_path_flex" = x"no"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -*** Without Flex you will not be able to build PostgreSQL from Git nor -*** change any of the scanner definition files. You can obtain Flex from -*** a GNU mirror site. (If you are using the official distribution of -*** PostgreSQL then you do not need to worry about this because the Flex -*** output is pre-generated.)" >&5 -$as_echo "$as_me: WARNING: -*** Without Flex you will not be able to build PostgreSQL from Git nor -*** change any of the scanner definition files. You can obtain Flex from -*** a GNU mirror site. (If you are using the official distribution of -*** PostgreSQL then you do not need to worry about this because the Flex -*** output is pre-generated.)" >&2;} - - FLEX= + as_fn_error $? "flex not found" "$LINENO" 5 else FLEX=$pgac_cv_path_flex pgac_flex_version=`$FLEX --version 2>/dev/null` @@ -10369,27 +10133,14 @@ $as_echo "$as_me: using perl $pgac_perl_version" >&6;} if echo "$pgac_perl_version" | sed 's/[.a-z_]/ /g' | \ $AWK '{ if ($1 == 5 && ($2 >= 14)) exit 1; else exit 0;}' then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -*** The installed version of Perl, $PERL, is too old to use with PostgreSQL. -*** Perl version 5.14 or later is required, but this is $pgac_perl_version." >&5 -$as_echo "$as_me: WARNING: + as_fn_error $? " *** The installed version of Perl, $PERL, is too old to use with PostgreSQL. -*** Perl version 5.14 or later is required, but this is $pgac_perl_version." >&2;} - PERL="" +*** Perl version 5.14 or later is required, but this is $pgac_perl_version." "$LINENO" 5 fi fi if test -z "$PERL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: -*** Without Perl you will not be able to build PostgreSQL from Git. -*** You can obtain Perl from any CPAN mirror site. -*** (If you are using the official distribution of PostgreSQL then you do not -*** need to worry about this, because the Perl output is pre-generated.)" >&5 -$as_echo "$as_me: WARNING: -*** Without Perl you will not be able to build PostgreSQL from Git. -*** You can obtain Perl from any CPAN mirror site. -*** (If you are using the official distribution of PostgreSQL then you do not -*** need to worry about this, because the Perl output is pre-generated.)" >&2;} + as_fn_error $? "Perl not found" "$LINENO" 5 fi if test "$with_perl" = yes; then @@ -10728,7 +10479,6 @@ fi # # For each platform, we need to know about any special compile and link # libraries, and whether the normal C function names are thread-safe. -# See the comment at the top of src/port/thread.c for more information. # WIN32 doesn't need the pthread tests; it always uses threads # # These tests are run before the library-tests, because linking with the @@ -11065,7 +10815,7 @@ fi done -if test "$enable_thread_safety" = yes -a "$PORTNAME" != "win32"; then : +if test "$PORTNAME" != "win32"; then : # then @@ -11724,7 +11474,7 @@ if test "x$ac_cv_header_pthread_h" = xyes; then : else as_fn_error $? " -pthread.h not found; use --disable-thread-safety to disable thread safety" "$LINENO" 5 +pthread.h not found" "$LINENO" 5 fi @@ -12204,7 +11954,7 @@ return clock_gettime (); return 0; } _ACEOF -for ac_lib in '' rt posix4; do +for ac_lib in '' rt; do if test -z "$ac_lib"; then ac_res="none required" else @@ -12236,63 +11986,6 @@ if test "$ac_res" != no; then : fi -# Solaris: -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing fdatasync" >&5 -$as_echo_n "checking for library containing fdatasync... " >&6; } -if ${ac_cv_search_fdatasync+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_func_search_save_LIBS=$LIBS -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char fdatasync (); -int -main () -{ -return fdatasync (); - ; - return 0; -} -_ACEOF -for ac_lib in '' rt posix4; do - if test -z "$ac_lib"; then - ac_res="none required" - else - ac_res=-l$ac_lib - LIBS="-l$ac_lib $ac_func_search_save_LIBS" - fi - if ac_fn_c_try_link "$LINENO"; then : - ac_cv_search_fdatasync=$ac_res -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext - if ${ac_cv_search_fdatasync+:} false; then : - break -fi -done -if ${ac_cv_search_fdatasync+:} false; then : - -else - ac_cv_search_fdatasync=no -fi -rm conftest.$ac_ext -LIBS=$ac_func_search_save_LIBS -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_fdatasync" >&5 -$as_echo "$ac_cv_search_fdatasync" >&6; } -ac_res=$ac_cv_search_fdatasync -if test "$ac_res" != no; then : - test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - -fi - # Cygwin: { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing shmget" >&5 $as_echo_n "checking for library containing shmget... " >&6; } @@ -12408,8 +12101,7 @@ if test "$ac_res" != no; then : fi -if test "$enable_thread_safety" = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pthread_barrier_wait" >&5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pthread_barrier_wait" >&5 $as_echo_n "checking for library containing pthread_barrier_wait... " >&6; } if ${ac_cv_search_pthread_barrier_wait+:} false; then : $as_echo_n "(cached) " >&6 @@ -12465,7 +12157,6 @@ if test "$ac_res" != no; then : fi -fi if test "$with_readline" = yes; then @@ -12744,9 +12435,9 @@ if test "$with_openssl" = yes ; then fi if test "$with_ssl" = openssl ; then - # Minimum required OpenSSL version is 1.0.1 + # Minimum required OpenSSL version is 1.0.2 -$as_echo "#define OPENSSL_API_COMPAT 0x10001000L" >>confdefs.h +$as_echo "#define OPENSSL_API_COMPAT 0x10002000L" >>confdefs.h if test "$PORTNAME" != "win32"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CRYPTO_new_ex_data in -lcrypto" >&5 @@ -12961,15 +12652,13 @@ else fi fi - # Functions introduced in OpenSSL 1.0.2. LibreSSL does not have - # SSL_CTX_set_cert_cb(). - for ac_func in X509_get_signature_nid SSL_CTX_set_cert_cb + # Function introduced in OpenSSL 1.0.2, not in LibreSSL. + for ac_func in SSL_CTX_set_cert_cb do : - as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` -ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" -if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + ac_fn_c_check_func "$LINENO" "SSL_CTX_set_cert_cb" "ac_cv_func_SSL_CTX_set_cert_cb" +if test "x$ac_cv_func_SSL_CTX_set_cert_cb" = xyes; then : cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +#define HAVE_SSL_CTX_SET_CERT_CB 1 _ACEOF fi @@ -12980,7 +12669,7 @@ done # defines OPENSSL_VERSION_NUMBER to claim version 2.0.0, even though it # doesn't have these OpenSSL 1.1.0 functions. So check for individual # functions. - for ac_func in OPENSSL_init_ssl BIO_get_data BIO_meth_new ASN1_STRING_get0_data HMAC_CTX_new HMAC_CTX_free + for ac_func in OPENSSL_init_ssl BIO_meth_new ASN1_STRING_get0_data HMAC_CTX_new HMAC_CTX_free do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" @@ -13007,12 +12696,13 @@ fi done # Function introduced in OpenSSL 1.1.1. - for ac_func in X509_get_signature_info + for ac_func in X509_get_signature_info SSL_CTX_set_num_tickets do : - ac_fn_c_check_func "$LINENO" "X509_get_signature_info" "ac_cv_func_X509_get_signature_info" -if test "x$ac_cv_func_X509_get_signature_info" = xyes; then : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF -#define HAVE_X509_GET_SIGNATURE_INFO 1 +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi @@ -13276,8 +12966,7 @@ fi fi -# Note: We can test for libldap_r only after we know PTHREAD_LIBS; -# also, on AIX, we may need to have openssl in LIBS for this step. +# Note: We can test for libldap_r only after we know PTHREAD_LIBS if test "$with_ldap" = yes ; then _LIBS="$LIBS" if test "$PORTNAME" != "win32"; then @@ -13352,7 +13041,7 @@ else thread_safe_libldap=no fi - if test "$enable_thread_safety" = yes -a "$thread_safe_libldap" = no; then + if test "$thread_safe_libldap" = no; then # Use ldap_r for FE if available, else assume ldap is thread-safe. # On some platforms ldap_r fails to link without PTHREAD_LIBS. LIBS="$_LIBS" @@ -13660,100 +13349,6 @@ fi ## Header files ## -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 -$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } -if ${ac_cv_header_stdbool_h+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - - #include - #ifndef bool - "error: bool is not defined" - #endif - #ifndef false - "error: false is not defined" - #endif - #if false - "error: false is not 0" - #endif - #ifndef true - "error: true is not defined" - #endif - #if true != 1 - "error: true is not 1" - #endif - #ifndef __bool_true_false_are_defined - "error: __bool_true_false_are_defined is not defined" - #endif - - struct s { _Bool s: 1; _Bool t; } s; - - char a[true == 1 ? 1 : -1]; - char b[false == 0 ? 1 : -1]; - char c[__bool_true_false_are_defined == 1 ? 1 : -1]; - char d[(bool) 0.5 == true ? 1 : -1]; - /* See body of main program for 'e'. */ - char f[(_Bool) 0.0 == false ? 1 : -1]; - char g[true]; - char h[sizeof (_Bool)]; - char i[sizeof s.t]; - enum { j = false, k = true, l = false * true, m = true * 256 }; - /* The following fails for - HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ - _Bool n[m]; - char o[sizeof n == m * sizeof n[0] ? 1 : -1]; - char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; - /* Catch a bug in an HP-UX C compiler. See - http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html - http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html - */ - _Bool q = true; - _Bool *pq = &q; - -int -main () -{ - - bool e = &s; - *pq |= q; - *pq |= ! q; - /* Refer to every declared value, to avoid compiler optimizations. */ - return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l - + !m + !n + !o + !p + !q + !pq); - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - ac_cv_header_stdbool_h=yes -else - ac_cv_header_stdbool_h=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 -$as_echo "$ac_cv_header_stdbool_h" >&6; } - ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" -if test "x$ac_cv_type__Bool" = xyes; then : - -cat >>confdefs.h <<_ACEOF -#define HAVE__BOOL 1 -_ACEOF - - -fi - - -if test $ac_cv_header_stdbool_h = yes; then - -$as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h - -fi - - for ac_header in atomic.h copyfile.h execinfo.h getopt.h ifaddrs.h langinfo.h mbarrier.h sys/epoll.h sys/event.h sys/personality.h sys/prctl.h sys/procctl.h sys/signalfd.h sys/ucred.h termios.h ucred.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` @@ -14177,6 +13772,9 @@ $as_echo_n "checking for OPENSSL... " >&6; } $as_echo "$OPENSSL" >&6; } fi +pgac_openssl_version="$($OPENSSL version 2> /dev/null || echo openssl not found)" +{ $as_echo "$as_me:${as_lineno-$LINENO}: using openssl: $pgac_openssl_version" >&5 +$as_echo "$as_me: using openssl: $pgac_openssl_version" >&6;} if test "$with_ssl" = openssl ; then ac_fn_c_check_header_mongrel "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default" if test "x$ac_cv_header_openssl_ssl_h" = xyes; then : @@ -15122,11 +14720,6 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_type_locale_t" >&5 $as_echo "$pgac_cv_type_locale_t" >&6; } -if test "$pgac_cv_type_locale_t" != no; then - -$as_echo "#define HAVE_LOCALE_T 1" >>confdefs.h - -fi if test "$pgac_cv_type_locale_t" = 'yes (in xlocale.h)'; then $as_echo "#define LOCALE_T_IN_XLOCALE 1" >>confdefs.h @@ -15137,10 +14730,6 @@ fi # spelling it understands, because it conflicts with # __declspec(restrict). Therefore we define pg_restrict to the # appropriate definition, which presumably won't conflict. -# -# Allow platforms with buggy compilers to force restrict to not be -# used by setting $FORCE_DISABLE_RESTRICT=yes in the relevant -# template. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword" >&5 $as_echo_n "checking for C/C++ restrict keyword... " >&6; } if ${ac_cv_c_restrict+:} false; then : @@ -15187,7 +14776,7 @@ _ACEOF ;; esac -if test "$ac_cv_c_restrict" = "no" -o "x$FORCE_DISABLE_RESTRICT" = "xyes"; then +if test "$ac_cv_c_restrict" = "no"; then pg_restrict="" else pg_restrict="$ac_cv_c_restrict" @@ -15212,21 +14801,6 @@ _ACEOF fi -if test "$with_zlib" = yes; then - # Check that defines z_streamp (versions before about 1.0.4 - # did not). While we could work around the lack of z_streamp, it - # seems unwise to encourage people to use such old zlib versions... - ac_fn_c_check_type "$LINENO" "z_streamp" "ac_cv_type_z_streamp" "#include -" -if test "x$ac_cv_type_z_streamp" = xyes; then : - -else - as_fn_error $? "zlib version is too old -Use --without-zlib to disable zlib support." "$LINENO" 5 -fi - -fi - case $host_cpu in x86_64) # On x86_64, check if we can compile a popcntq instruction @@ -15564,9 +15138,7 @@ $as_echo_n "checking size of bool... " >&6; } if ${ac_cv_sizeof_bool+:} false; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (bool))" "ac_cv_sizeof_bool" "#ifdef HAVE_STDBOOL_H -#include -#endif + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (bool))" "ac_cv_sizeof_bool" "#include "; then : else @@ -15592,7 +15164,7 @@ _ACEOF -if test "$ac_cv_header_stdbool_h" = yes -a "$ac_cv_sizeof_bool" = 1; then +if test "$ac_cv_sizeof_bool" = 1; then $as_echo "#define PG_USE_STDBOOL 1" >>confdefs.h @@ -15700,7 +15272,7 @@ fi LIBS_including_readline="$LIBS" LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'` -for ac_func in backtrace_symbols copyfile getifaddrs getpeerucred inet_pton kqueue mbstowcs_l memset_s posix_fallocate ppoll pthread_is_threaded_np setproctitle setproctitle_fast strchrnul strsignal syncfs sync_file_range uselocale wcstombs_l +for ac_func in backtrace_symbols copyfile copy_file_range getifaddrs getpeerucred inet_pton kqueue mbstowcs_l memset_s posix_fallocate ppoll pthread_is_threaded_np setproctitle setproctitle_fast strsignal syncfs sync_file_range uselocale wcstombs_l do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" @@ -16218,7 +15790,7 @@ cat >>confdefs.h <<_ACEOF _ACEOF -# We can't use AC_REPLACE_FUNCS to replace these functions, because it +# We can't use AC_CHECK_FUNCS to detect these functions, because it # won't handle deployment target restrictions on macOS ac_fn_c_check_decl "$LINENO" "preadv" "ac_cv_have_decl_preadv" "#include " @@ -16231,16 +15803,6 @@ fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PREADV $ac_have_decl _ACEOF -if test $ac_have_decl = 1; then : - -else - case " $LIBOBJS " in - *" preadv.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS preadv.$ac_objext" - ;; -esac - -fi ac_fn_c_check_decl "$LINENO" "pwritev" "ac_cv_have_decl_pwritev" "#include " @@ -16253,17 +15815,19 @@ fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PWRITEV $ac_have_decl _ACEOF -if test $ac_have_decl = 1; then : - -else - case " $LIBOBJS " in - *" pwritev.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS pwritev.$ac_objext" - ;; -esac +ac_fn_c_check_decl "$LINENO" "strchrnul" "ac_cv_have_decl_strchrnul" "#include +" +if test "x$ac_cv_have_decl_strchrnul" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 fi +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRCHRNUL $ac_have_decl +_ACEOF + # This is probably only present on macOS, but may as well check always ac_fn_c_check_decl "$LINENO" "F_FULLFSYNC" "ac_cv_have_decl_F_FULLFSYNC" "#include @@ -16385,8 +15949,7 @@ fi -if test "$enable_thread_safety" = yes; then - ac_fn_c_check_func "$LINENO" "pthread_barrier_wait" "ac_cv_func_pthread_barrier_wait" +ac_fn_c_check_func "$LINENO" "pthread_barrier_wait" "ac_cv_func_pthread_barrier_wait" if test "x$ac_cv_func_pthread_barrier_wait" = xyes; then : $as_echo "#define HAVE_PTHREAD_BARRIER_WAIT 1" >>confdefs.h @@ -16400,7 +15963,6 @@ esac fi -fi if test "$PORTNAME" = "win32" -o "$PORTNAME" = "cygwin"; then # Cygwin and (apparently, based on test results) Mingw both @@ -16537,6 +16099,12 @@ esac ;; esac + case " $LIBOBJS " in + *" win32gai_strerror.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS win32gai_strerror.$ac_objext" + ;; +esac + case " $LIBOBJS " in *" win32getrusage.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS win32getrusage.$ac_objext" @@ -16695,41 +16263,6 @@ if test "$with_llvm" = yes; then # Check which functionality is present SAVE_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $LLVM_CPPFLAGS" - ac_fn_c_check_decl "$LINENO" "LLVMOrcGetSymbolAddressIn" "ac_cv_have_decl_LLVMOrcGetSymbolAddressIn" "#include -" -if test "x$ac_cv_have_decl_LLVMOrcGetSymbolAddressIn" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN $ac_have_decl -_ACEOF - - ac_fn_c_check_decl "$LINENO" "LLVMGetHostCPUName" "ac_cv_have_decl_LLVMGetHostCPUName" "#include -" -if test "x$ac_cv_have_decl_LLVMGetHostCPUName" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_LLVMGETHOSTCPUNAME $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "LLVMGetHostCPUFeatures" "ac_cv_have_decl_LLVMGetHostCPUFeatures" "#include -" -if test "x$ac_cv_have_decl_LLVMGetHostCPUFeatures" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_LLVMGETHOSTCPUFEATURES $ac_have_decl -_ACEOF - ac_fn_c_check_decl "$LINENO" "LLVMCreateGDBRegistrationListener" "ac_cv_have_decl_LLVMCreateGDBRegistrationListener" "#include " if test "x$ac_cv_have_decl_LLVMCreateGDBRegistrationListener" = xyes; then : @@ -17440,18 +16973,28 @@ _ACEOF # Compute maximum alignment of any basic type. -# We assume long's alignment is at least as strong as char, short, or int; -# but we must check long long (if it is being used for int64) and double. -# Note that we intentionally do not consider any types wider than 64 bits, -# as allowing MAXIMUM_ALIGNOF to exceed 8 would be too much of a penalty -# for disk and memory space. +# +# We require 'double' to have the strictest alignment among the basic types, +# because otherwise the C ABI might impose 8-byte alignment on some of the +# other C types that correspond to TYPALIGN_DOUBLE SQL types. That could +# cause a mismatch between the tuple layout and the C struct layout of a +# catalog tuple. We used to carefully order catalog columns such that any +# fixed-width, attalign=4 columns were at offsets divisible by 8 regardless +# of MAXIMUM_ALIGNOF to avoid that, but we no longer support any platforms +# where TYPALIGN_DOUBLE != MAXIMUM_ALIGNOF. +# +# We assume without checking that long's alignment is at least as strong as +# char, short, or int. Note that we intentionally do not consider any types +# wider than 64 bits, as allowing MAXIMUM_ALIGNOF to exceed 8 would be too +# much of a penalty for disk and memory space. -MAX_ALIGNOF=$ac_cv_alignof_long -if test $MAX_ALIGNOF -lt $ac_cv_alignof_double ; then - MAX_ALIGNOF=$ac_cv_alignof_double +MAX_ALIGNOF=$ac_cv_alignof_double + +if test $ac_cv_alignof_long -gt $MAX_ALIGNOF ; then + as_fn_error $? "alignment of 'long' is greater than the alignment of 'double'" "$LINENO" 5 fi -if test x"$HAVE_LONG_LONG_INT_64" = xyes && test $MAX_ALIGNOF -lt $ac_cv_alignof_long_long_int ; then - MAX_ALIGNOF="$ac_cv_alignof_long_long_int" +if test x"$HAVE_LONG_LONG_INT_64" = xyes && test $ac_cv_alignof_long_long_int -gt $MAX_ALIGNOF ; then + as_fn_error $? "alignment of 'long long int' is greater than the alignment of 'double'" "$LINENO" 5 fi cat >>confdefs.h <<_ACEOF @@ -17569,7 +17112,7 @@ else /* end confdefs.h. */ /* This must match the corresponding code in c.h: */ -#if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__) +#if defined(__GNUC__) || defined(__SUNPRO_C) #define pg_attribute_aligned(a) __attribute__((aligned(a))) #elif defined(_MSC_VER) #define pg_attribute_aligned(a) __declspec(align(a)) @@ -17886,6 +17429,40 @@ $as_echo "#define HAVE__GET_CPUID 1" >>confdefs.h fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __get_cpuid_count" >&5 +$as_echo_n "checking for __get_cpuid_count... " >&6; } +if ${pgac_cv__get_cpuid_count+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +unsigned int exx[4] = {0, 0, 0, 0}; + __get_cpuid_count(7, 0, &exx[0], &exx[1], &exx[2], &exx[3]); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pgac_cv__get_cpuid_count="yes" +else + pgac_cv__get_cpuid_count="no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__get_cpuid_count" >&5 +$as_echo "$pgac_cv__get_cpuid_count" >&6; } +if test x"$pgac_cv__get_cpuid_count" = x"yes"; then + +$as_echo "#define HAVE__GET_CPUID_COUNT 1" >>confdefs.h + +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __cpuid" >&5 $as_echo_n "checking for __cpuid... " >&6; } if ${pgac_cv__cpuid+:} false; then : @@ -17920,6 +17497,221 @@ $as_echo "#define HAVE__CPUID 1" >>confdefs.h fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __cpuidex" >&5 +$as_echo_n "checking for __cpuidex... " >&6; } +if ${pgac_cv__cpuidex+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +unsigned int exx[4] = {0, 0, 0, 0}; + __get_cpuidex(exx[0], 7, 0); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pgac_cv__cpuidex="yes" +else + pgac_cv__cpuidex="no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__cpuidex" >&5 +$as_echo "$pgac_cv__cpuidex" >&6; } +if test x"$pgac_cv__cpuidex" = x"yes"; then + +$as_echo "#define HAVE__CPUIDEX 1" >>confdefs.h + +fi + +# Check for XSAVE intrinsics +# +CFLAGS_XSAVE="" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _xgetbv with CFLAGS=" >&5 +$as_echo_n "checking for _xgetbv with CFLAGS=... " >&6; } +if ${pgac_cv_xsave_intrinsics_+:} false; then : + $as_echo_n "(cached) " >&6 +else + pgac_save_CFLAGS=$CFLAGS +CFLAGS="$pgac_save_CFLAGS " +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +return _xgetbv(0) & 0xe0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pgac_cv_xsave_intrinsics_=yes +else + pgac_cv_xsave_intrinsics_=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +CFLAGS="$pgac_save_CFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_xsave_intrinsics_" >&5 +$as_echo "$pgac_cv_xsave_intrinsics_" >&6; } +if test x"$pgac_cv_xsave_intrinsics_" = x"yes"; then + CFLAGS_XSAVE="" + pgac_xsave_intrinsics=yes +fi + +if test x"$pgac_xsave_intrinsics" != x"yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _xgetbv with CFLAGS=-mxsave" >&5 +$as_echo_n "checking for _xgetbv with CFLAGS=-mxsave... " >&6; } +if ${pgac_cv_xsave_intrinsics__mxsave+:} false; then : + $as_echo_n "(cached) " >&6 +else + pgac_save_CFLAGS=$CFLAGS +CFLAGS="$pgac_save_CFLAGS -mxsave" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +return _xgetbv(0) & 0xe0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pgac_cv_xsave_intrinsics__mxsave=yes +else + pgac_cv_xsave_intrinsics__mxsave=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +CFLAGS="$pgac_save_CFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_xsave_intrinsics__mxsave" >&5 +$as_echo "$pgac_cv_xsave_intrinsics__mxsave" >&6; } +if test x"$pgac_cv_xsave_intrinsics__mxsave" = x"yes"; then + CFLAGS_XSAVE="-mxsave" + pgac_xsave_intrinsics=yes +fi + +fi +if test x"$pgac_xsave_intrinsics" = x"yes"; then + +$as_echo "#define HAVE_XSAVE_INTRINSICS 1" >>confdefs.h + +fi + + +# Check for AVX-512 popcount intrinsics +# +CFLAGS_POPCNT="" +PG_POPCNT_OBJS="" +if test x"$host_cpu" = x"x86_64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mm512_popcnt_epi64 with CFLAGS=" >&5 +$as_echo_n "checking for _mm512_popcnt_epi64 with CFLAGS=... " >&6; } +if ${pgac_cv_avx512_popcnt_intrinsics_+:} false; then : + $as_echo_n "(cached) " >&6 +else + pgac_save_CFLAGS=$CFLAGS +CFLAGS="$pgac_save_CFLAGS " +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +const char buf[sizeof(__m512i)]; + PG_INT64_TYPE popcnt = 0; + __m512i accum = _mm512_setzero_si512(); + const __m512i val = _mm512_maskz_loadu_epi8((__mmask64) 0xf0f0f0f0f0f0f0f0, (const __m512i *) buf); + const __m512i cnt = _mm512_popcnt_epi64(val); + accum = _mm512_add_epi64(accum, cnt); + popcnt = _mm512_reduce_add_epi64(accum); + /* return computed value, to prevent the above being optimized away */ + return popcnt == 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pgac_cv_avx512_popcnt_intrinsics_=yes +else + pgac_cv_avx512_popcnt_intrinsics_=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +CFLAGS="$pgac_save_CFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_avx512_popcnt_intrinsics_" >&5 +$as_echo "$pgac_cv_avx512_popcnt_intrinsics_" >&6; } +if test x"$pgac_cv_avx512_popcnt_intrinsics_" = x"yes"; then + CFLAGS_POPCNT="" + pgac_avx512_popcnt_intrinsics=yes +fi + + if test x"$pgac_avx512_popcnt_intrinsics" != x"yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mm512_popcnt_epi64 with CFLAGS=-mavx512vpopcntdq -mavx512bw" >&5 +$as_echo_n "checking for _mm512_popcnt_epi64 with CFLAGS=-mavx512vpopcntdq -mavx512bw... " >&6; } +if ${pgac_cv_avx512_popcnt_intrinsics__mavx512vpopcntdq__mavx512bw+:} false; then : + $as_echo_n "(cached) " >&6 +else + pgac_save_CFLAGS=$CFLAGS +CFLAGS="$pgac_save_CFLAGS -mavx512vpopcntdq -mavx512bw" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +const char buf[sizeof(__m512i)]; + PG_INT64_TYPE popcnt = 0; + __m512i accum = _mm512_setzero_si512(); + const __m512i val = _mm512_maskz_loadu_epi8((__mmask64) 0xf0f0f0f0f0f0f0f0, (const __m512i *) buf); + const __m512i cnt = _mm512_popcnt_epi64(val); + accum = _mm512_add_epi64(accum, cnt); + popcnt = _mm512_reduce_add_epi64(accum); + /* return computed value, to prevent the above being optimized away */ + return popcnt == 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pgac_cv_avx512_popcnt_intrinsics__mavx512vpopcntdq__mavx512bw=yes +else + pgac_cv_avx512_popcnt_intrinsics__mavx512vpopcntdq__mavx512bw=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +CFLAGS="$pgac_save_CFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_avx512_popcnt_intrinsics__mavx512vpopcntdq__mavx512bw" >&5 +$as_echo "$pgac_cv_avx512_popcnt_intrinsics__mavx512vpopcntdq__mavx512bw" >&6; } +if test x"$pgac_cv_avx512_popcnt_intrinsics__mavx512vpopcntdq__mavx512bw" = x"yes"; then + CFLAGS_POPCNT="-mavx512vpopcntdq -mavx512bw" + pgac_avx512_popcnt_intrinsics=yes +fi + + fi + if test x"$pgac_avx512_popcnt_intrinsics" = x"yes"; then + PG_POPCNT_OBJS="pg_popcount_avx512.o pg_popcount_avx512_choose.o" + +$as_echo "#define USE_AVX512_POPCNT_WITH_RUNTIME_CHECK 1" >>confdefs.h + + fi +fi + + + # Check for Intel SSE 4.2 intrinsics to do CRC calculations. # # First check if the _mm_crc32_u8 and _mm_crc32_u64 intrinsics can be used @@ -18029,7 +17821,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext # Check for ARMv8 CRC Extension intrinsics to do CRC calculations. # # First check if __crc32c* intrinsics can be used with the default compiler -# flags. If not, check if adding -march=armv8-a+crc flag helps. +# flags. If not, check if adding "-march=armv8-a+crc+simd" flag helps. +# On systems using soft-float ABI, "-march=armv8-a+crc" is required instead. # CFLAGS_CRC is set if the extra flag is required. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=" >&5 $as_echo_n "checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=... " >&6; } @@ -18072,7 +17865,48 @@ if test x"$pgac_cv_armv8_crc32c_intrinsics_" = x"yes"; then fi if test x"$pgac_armv8_crc32c_intrinsics" != x"yes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=-march=armv8-a+crc" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=-march=armv8-a+crc+simd" >&5 +$as_echo_n "checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=-march=armv8-a+crc+simd... " >&6; } +if ${pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrcpsimd+:} false; then : + $as_echo_n "(cached) " >&6 +else + pgac_save_CFLAGS=$CFLAGS +CFLAGS="$pgac_save_CFLAGS -march=armv8-a+crc+simd" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +unsigned int crc = 0; + crc = __crc32cb(crc, 0); + crc = __crc32ch(crc, 0); + crc = __crc32cw(crc, 0); + crc = __crc32cd(crc, 0); + /* return computed value, to prevent the above being optimized away */ + return crc == 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrcpsimd=yes +else + pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrcpsimd=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +CFLAGS="$pgac_save_CFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrcpsimd" >&5 +$as_echo "$pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrcpsimd" >&6; } +if test x"$pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrcpsimd" = x"yes"; then + CFLAGS_CRC="-march=armv8-a+crc+simd" + pgac_armv8_crc32c_intrinsics=yes +fi + + if test x"$pgac_armv8_crc32c_intrinsics" != x"yes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=-march=armv8-a+crc" >&5 $as_echo_n "checking for __crc32cb, __crc32ch, __crc32cw, and __crc32cd with CFLAGS=-march=armv8-a+crc... " >&6; } if ${pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrc+:} false; then : $as_echo_n "(cached) " >&6 @@ -18112,10 +17946,52 @@ if test x"$pgac_cv_armv8_crc32c_intrinsics__march_armv8_apcrc" = x"yes"; then pgac_armv8_crc32c_intrinsics=yes fi + fi +fi + +# Check for LoongArch CRC intrinsics to do CRC calculations. +# +# Check if __builtin_loongarch_crcc_* intrinsics can be used +# with the default compiler flags. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_loongarch_crcc_w_b_w, __builtin_loongarch_crcc_w_h_w, __builtin_loongarch_crcc_w_w_w and __builtin_loongarch_crcc_w_d_w" >&5 +$as_echo_n "checking for __builtin_loongarch_crcc_w_b_w, __builtin_loongarch_crcc_w_h_w, __builtin_loongarch_crcc_w_w_w and __builtin_loongarch_crcc_w_d_w... " >&6; } +if ${pgac_cv_loongarch_crc32c_intrinsics+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +unsigned int crc = 0; + crc = __builtin_loongarch_crcc_w_b_w(0, crc); + crc = __builtin_loongarch_crcc_w_h_w(0, crc); + crc = __builtin_loongarch_crcc_w_w_w(0, crc); + crc = __builtin_loongarch_crcc_w_d_w(0, crc); + /* return computed value, to prevent the above being optimized away */ + return crc == 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pgac_cv_loongarch_crc32c_intrinsics=yes +else + pgac_cv_loongarch_crc32c_intrinsics=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_loongarch_crc32c_intrinsics" >&5 +$as_echo "$pgac_cv_loongarch_crc32c_intrinsics" >&6; } +if test x"$pgac_cv_loongarch_crc32c_intrinsics" = x"yes"; then + pgac_loongarch_crc32c_intrinsics=yes fi + # Select CRC-32C implementation. # # If we are targeting a processor that has Intel SSE 4.2 instructions, we can @@ -18130,9 +18006,12 @@ fi # we're not targeting such a processor, but can nevertheless produce code that # uses the CRC instructions, compile both, and select at runtime. # -# You can override this logic by setting the appropriate USE_*_CRC32 flag to 1 +# You can skip the runtime check by setting the appropriate USE_*_CRC32 flag to 1 # in the template or configure command line. -if test x"$USE_SLICING_BY_8_CRC32C" = x"" && test x"$USE_SSE42_CRC32C" = x"" && test x"$USE_SSE42_CRC32C_WITH_RUNTIME_CHECK" = x"" && test x"$USE_ARMV8_CRC32C" = x"" && test x"$USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK" = x""; then +# +# If we are targeting a LoongArch processor, CRC instructions are +# always available (at least on 64 bit), so no runtime check is needed. +if test x"$USE_SLICING_BY_8_CRC32C" = x"" && test x"$USE_SSE42_CRC32C" = x"" && test x"$USE_SSE42_CRC32C_WITH_RUNTIME_CHECK" = x"" && test x"$USE_ARMV8_CRC32C" = x"" && test x"$USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK" = x"" && test x"$USE_LOONGARCH_CRC32C" = x""; then # Use Intel SSE 4.2 if available. if test x"$pgac_sse42_crc32_intrinsics" = x"yes" && test x"$SSE4_2_TARGETED" = x"1" ; then USE_SSE42_CRC32C=1 @@ -18150,10 +18029,15 @@ if test x"$USE_SLICING_BY_8_CRC32C" = x"" && test x"$USE_SSE42_CRC32C" = x"" && if test x"$pgac_armv8_crc32c_intrinsics" = x"yes"; then USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK=1 else - # fall back to slicing-by-8 algorithm, which doesn't require any - # special CPU support. - USE_SLICING_BY_8_CRC32C=1 - fi + # LoongArch CRCC instructions. + if test x"$pgac_loongarch_crc32c_intrinsics" = x"yes"; then + USE_LOONGARCH_CRC32C=1 + else + # fall back to slicing-by-8 algorithm, which doesn't require any + # special CPU support. + USE_SLICING_BY_8_CRC32C=1 + fi + fi fi fi fi @@ -18194,12 +18078,21 @@ $as_echo "#define USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: ARMv8 CRC instructions with runtime check" >&5 $as_echo "ARMv8 CRC instructions with runtime check" >&6; } else + if test x"$USE_LOONGARCH_CRC32C" = x"1"; then + +$as_echo "#define USE_LOONGARCH_CRC32C 1" >>confdefs.h + + PG_CRC32C_OBJS="pg_crc32c_loongarch.o" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: LoongArch CRCC instructions" >&5 +$as_echo "LoongArch CRCC instructions" >&6; } + else $as_echo "#define USE_SLICING_BY_8_CRC32C 1" >>confdefs.h - PG_CRC32C_OBJS="pg_crc32c_sb8.o" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: slicing-by-8" >&5 + PG_CRC32C_OBJS="pg_crc32c_sb8.o" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: slicing-by-8" >&5 $as_echo "slicing-by-8" >&6; } + fi fi fi fi @@ -19957,7 +19850,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by PostgreSQL $as_me 16beta2, which was +This file was extended by PostgreSQL $as_me 17.5, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -20028,7 +19921,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -PostgreSQL config.status 16beta2 +PostgreSQL config.status 17.5 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -20816,6 +20709,6 @@ fi # Ensure that any meson build directories would reconfigure and see that # there's a conflicting in-tree build and can error out. -if test "$vpath_build"="no"; then +if test "$vpath_build" = "no"; then touch meson.build fi diff --git a/configure.ac b/configure.ac index fe434f4ddc4f2..f398184645f30 100644 --- a/configure.ac +++ b/configure.ac @@ -17,13 +17,13 @@ dnl Read the Autoconf manual for details. dnl m4_pattern_forbid(^PGAC_)dnl to catch undefined macros -AC_INIT([PostgreSQL], [16beta2], [pgsql-bugs@lists.postgresql.org], [], [https://www.postgresql.org/]) +AC_INIT([PostgreSQL], [17.5], [pgsql-bugs@lists.postgresql.org], [], [https://www.postgresql.org/]) m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.69], [], [m4_fatal([Autoconf version 2.69 is required. Untested combinations of 'autoconf' and PostgreSQL versions are not recommended. You can remove the check from 'configure.ac' but it is then your responsibility whether the result works or not.])]) -AC_COPYRIGHT([Copyright (c) 1996-2023, PostgreSQL Global Development Group]) +AC_COPYRIGHT([Copyright (c) 1996-2024, PostgreSQL Global Development Group]) AC_CONFIG_SRCDIR([src/backend/access/common/heaptuple.c]) AC_CONFIG_AUX_DIR(config) AC_PREFIX_DEFAULT(/usr/local/pgsql) @@ -62,7 +62,6 @@ PGAC_ARG_REQ(with, template, [NAME], [override operating system template], # --with-template not given case $host_os in - aix*) template=aix ;; cygwin*|msys*) template=cygwin ;; darwin*) template=darwin ;; dragonfly*) template=netbsd ;; @@ -250,6 +249,13 @@ PGAC_ARG_BOOL(enable, tap-tests, no, [enable TAP tests (requires Perl and IPC::Run)]) AC_SUBST(enable_tap_tests) +# +# Injection points +# +PGAC_ARG_BOOL(enable, injection-points, no, [enable injection points (for testing)], + [AC_DEFINE([USE_INJECTION_POINTS], 1, [Define to 1 to build with injection points. (--enable-injection-points)])]) +AC_SUBST(enable_injection_points) + # # Block size # @@ -362,15 +368,10 @@ AC_DEFINE_UNQUOTED([XLOG_BLCKSZ], ${XLOG_BLCKSZ}, [ # C compiler # -# For historical reasons you can also use --with-CC to specify the C compiler -# to use, although the standard way to do this is to set the CC environment -# variable. -PGAC_ARG_REQ(with, CC, [CMD], [set compiler (deprecated)], [CC=$with_CC]) - -case $template in - aix) pgac_cc_list="gcc xlc"; pgac_cxx_list="g++ xlC";; - *) pgac_cc_list="gcc cc"; pgac_cxx_list="g++ c++";; -esac +# If you don't specify a list of compilers to test, the AC_PROG_CC and +# AC_PROG_CXX macros test for a long list of unsupported compilers. +pgac_cc_list="gcc cc" +pgac_cxx_list="g++ c++" AC_PROG_CC([$pgac_cc_list]) AC_PROG_CC_C99() @@ -587,12 +588,6 @@ elif test "$ICC" = yes; then # Make sure strict aliasing is off (though this is said to be the default) PGAC_PROG_CC_CFLAGS_OPT([-fno-strict-aliasing]) PGAC_PROG_CXX_CFLAGS_OPT([-fno-strict-aliasing]) -elif test "$PORTNAME" = "aix"; then - # AIX's xlc has to have strict aliasing turned off too - PGAC_PROG_CC_CFLAGS_OPT([-qnoansialias]) - PGAC_PROG_CXX_CFLAGS_OPT([-qnoansialias]) - PGAC_PROG_CC_CFLAGS_OPT([-qlonglong]) - PGAC_PROG_CXX_CFLAGS_OPT([-qlonglong]) fi # If the compiler knows how to hide symbols, add the switch needed for that to @@ -611,16 +606,6 @@ if test "$GCC" = yes -o "$SUN_STUDIO_CC" = yes ; then PGAC_PROG_VARCXX_VARFLAGS_OPT(CXX, CXXFLAGS_SL_MODULE, [-fvisibility=hidden]) PGAC_PROG_VARCXX_VARFLAGS_OPT(CXX, CXXFLAGS_SL_MODULE, [-fvisibility-inlines-hidden]) have_visibility_attribute=$pgac_cv_prog_CC_cflags__fvisibility_hidden -elif test "$PORTNAME" = "aix"; then - # Note that xlc accepts -fvisibility=hidden as a file. - PGAC_PROG_CC_VAR_OPT(CFLAGS_SL_MODULE, [-qvisibility=hidden]) - PGAC_PROG_VARCXX_VARFLAGS_OPT(CXX, CXXFLAGS_SL_MODULE, [-qvisibility=hidden]) - have_visibility_attribute=$pgac_cv_prog_CC_cflags__qvisibility_hidden - # Old xlc versions (<13.1) don't have support for -qvisibility. Use expfull to force - # all extension module symbols to be exported. - if test "$pgac_cv_prog_CC_cflags__qvisibility_hidden" != "yes"; then - CFLAGS_SL_MODULE="$CFLAGS_SL_MODULE -Wl,-b,expfull" - fi fi if test "$have_visibility_attribute" = "yes"; then @@ -652,6 +637,13 @@ if test "$with_llvm" = yes ; then PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, BITCODE_CFLAGS, [-Xclang -no-opaque-pointers]) PGAC_PROG_VARCXX_VARFLAGS_OPT(CLANGXX, BITCODE_CXXFLAGS, [-Xclang -no-opaque-pointers]) + # Ideally bitcode should perhaps match $CC's use, or not, of outline atomic + # functions, but for now we err on the side of suppressing them in bitcode, + # because we can't assume they're available at runtime. This affects aarch64 + # builds using the basic armv8-a ISA without LSE support. + PGAC_PROG_VARCXX_VARFLAGS_OPT(CLANG, BITCODE_CFLAGS, [-mno-outline-atomics]) + PGAC_PROG_VARCXX_VARFLAGS_OPT(CLANG, BITCODE_CXXFLAGS, [-mno-outline-atomics]) + NOT_THE_CFLAGS="" PGAC_PROG_VARCC_VARFLAGS_OPT(CLANG, NOT_THE_CFLAGS, [-Wunused-command-line-argument]) if test -n "$NOT_THE_CFLAGS"; then @@ -837,18 +829,6 @@ for dir in $LIBRARY_DIRS $SRCH_LIB; do done IFS=$ac_save_IFS -# -# Enable thread-safe client libraries -# -AC_MSG_CHECKING([allow thread-safe client libraries]) -PGAC_ARG_BOOL(enable, thread-safety, yes, [disable thread-safety in client libraries]) -if test "$enable_thread_safety" = yes; then - AC_DEFINE([ENABLE_THREAD_SAFETY], 1, - [Define to 1 to build client libraries as thread-safe code. (--enable-thread-safety)]) -fi -AC_MSG_RESULT([$enable_thread_safety]) -AC_SUBST(enable_thread_safety) - # # ICU # @@ -1232,7 +1212,6 @@ fi # # For each platform, we need to know about any special compile and link # libraries, and whether the normal C function names are thread-safe. -# See the comment at the top of src/port/thread.c for more information. # WIN32 doesn't need the pthread tests; it always uses threads # # These tests are run before the library-tests, because linking with the @@ -1244,7 +1223,7 @@ dnl note: We have to use AS_IF here rather than plain if. The AC_CHECK_HEADER dnl invocation below is the first one in the script, and autoconf generates dnl additional code for that, which must not be inside the if-block. AS_IF dnl knows how to do that. -AS_IF([test "$enable_thread_safety" = yes -a "$PORTNAME" != "win32"], +AS_IF([test "$PORTNAME" != "win32"], [ # then AX_PTHREAD # set thread flags @@ -1259,7 +1238,7 @@ CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$LIBS $PTHREAD_LIBS" AC_CHECK_HEADER(pthread.h, [], [AC_MSG_ERROR([ -pthread.h not found; use --disable-thread-safety to disable thread safety])]) +pthread.h not found])]) AC_CHECK_FUNCS([strerror_r]) @@ -1298,17 +1277,13 @@ AC_SEARCH_LIBS(socket, [socket ws2_32]) AC_SEARCH_LIBS(getopt_long, [getopt gnugetopt]) AC_SEARCH_LIBS(shm_open, rt) AC_SEARCH_LIBS(shm_unlink, rt) -AC_SEARCH_LIBS(clock_gettime, [rt posix4]) -# Solaris: -AC_SEARCH_LIBS(fdatasync, [rt posix4]) +AC_SEARCH_LIBS(clock_gettime, rt) # Cygwin: AC_SEARCH_LIBS(shmget, cygipc) # *BSD: AC_SEARCH_LIBS(backtrace_symbols, execinfo) -if test "$enable_thread_safety" = yes; then - AC_SEARCH_LIBS(pthread_barrier_wait, pthread) -fi +AC_SEARCH_LIBS(pthread_barrier_wait, pthread) if test "$with_readline" = yes; then PGAC_CHECK_READLINE @@ -1367,8 +1342,8 @@ fi if test "$with_ssl" = openssl ; then dnl Order matters! - # Minimum required OpenSSL version is 1.0.1 - AC_DEFINE(OPENSSL_API_COMPAT, [0x10001000L], + # Minimum required OpenSSL version is 1.0.2 + AC_DEFINE(OPENSSL_API_COMPAT, [0x10002000L], [Define to the OpenSSL API version in use. This avoids deprecation warnings from newer OpenSSL versions.]) if test "$PORTNAME" != "win32"; then AC_CHECK_LIB(crypto, CRYPTO_new_ex_data, [], [AC_MSG_ERROR([library 'crypto' is required for OpenSSL])]) @@ -1377,21 +1352,20 @@ if test "$with_ssl" = openssl ; then AC_SEARCH_LIBS(CRYPTO_new_ex_data, [eay32 crypto], [], [AC_MSG_ERROR([library 'eay32' or 'crypto' is required for OpenSSL])]) AC_SEARCH_LIBS(SSL_new, [ssleay32 ssl], [], [AC_MSG_ERROR([library 'ssleay32' or 'ssl' is required for OpenSSL])]) fi - # Functions introduced in OpenSSL 1.0.2. LibreSSL does not have - # SSL_CTX_set_cert_cb(). - AC_CHECK_FUNCS([X509_get_signature_nid SSL_CTX_set_cert_cb]) + # Function introduced in OpenSSL 1.0.2, not in LibreSSL. + AC_CHECK_FUNCS([SSL_CTX_set_cert_cb]) # Functions introduced in OpenSSL 1.1.0. We used to check for # OPENSSL_VERSION_NUMBER, but that didn't work with 1.1.0, because LibreSSL # defines OPENSSL_VERSION_NUMBER to claim version 2.0.0, even though it # doesn't have these OpenSSL 1.1.0 functions. So check for individual # functions. - AC_CHECK_FUNCS([OPENSSL_init_ssl BIO_get_data BIO_meth_new ASN1_STRING_get0_data HMAC_CTX_new HMAC_CTX_free]) + AC_CHECK_FUNCS([OPENSSL_init_ssl BIO_meth_new ASN1_STRING_get0_data HMAC_CTX_new HMAC_CTX_free]) # OpenSSL versions before 1.1.0 required setting callback functions, for # thread-safety. In 1.1.0, it's no longer required, and CRYPTO_lock() # function was removed. AC_CHECK_FUNCS([CRYPTO_lock]) # Function introduced in OpenSSL 1.1.1. - AC_CHECK_FUNCS([X509_get_signature_info]) + AC_CHECK_FUNCS([X509_get_signature_info SSL_CTX_set_num_tickets]) AC_DEFINE([USE_OPENSSL], 1, [Define to 1 to build with OpenSSL support. (--with-ssl=openssl)]) elif test "$with_ssl" != no ; then AC_MSG_ERROR([--with-ssl must specify openssl]) @@ -1418,8 +1392,7 @@ if test "$with_zstd" = yes ; then AC_CHECK_LIB(zstd, ZSTD_compress, [], [AC_MSG_ERROR([library 'zstd' is required for ZSTD support])]) fi -# Note: We can test for libldap_r only after we know PTHREAD_LIBS; -# also, on AIX, we may need to have openssl in LIBS for this step. +# Note: We can test for libldap_r only after we know PTHREAD_LIBS if test "$with_ldap" = yes ; then _LIBS="$LIBS" if test "$PORTNAME" != "win32"; then @@ -1436,7 +1409,7 @@ if test "$with_ldap" = yes ; then AC_CHECK_FUNC([ldap_verify_credentials], [thread_safe_libldap=yes], [thread_safe_libldap=no]) - if test "$enable_thread_safety" = yes -a "$thread_safe_libldap" = no; then + if test "$thread_safe_libldap" = no; then # Use ldap_r for FE if available, else assume ldap is thread-safe. # On some platforms ldap_r fails to link without PTHREAD_LIBS. LIBS="$_LIBS" @@ -1490,8 +1463,6 @@ AC_SUBST(UUID_LIBS) ## Header files ## -AC_HEADER_STDBOOL - AC_CHECK_HEADERS(m4_normalize([ atomic.h copyfile.h @@ -1571,6 +1542,8 @@ if test "$with_gssapi" = yes ; then fi PGAC_PATH_PROGS(OPENSSL, openssl) +pgac_openssl_version="$($OPENSSL version 2> /dev/null || echo openssl not found)" +AC_MSG_NOTICE([using openssl: $pgac_openssl_version]) if test "$with_ssl" = openssl ; then AC_CHECK_HEADER(openssl/ssl.h, [], [AC_MSG_ERROR([header file is required for OpenSSL])]) AC_CHECK_HEADER(openssl/err.h, [], [AC_MSG_ERROR([header file is required for OpenSSL])]) @@ -1675,12 +1648,8 @@ PGAC_TYPE_LOCALE_T # spelling it understands, because it conflicts with # __declspec(restrict). Therefore we define pg_restrict to the # appropriate definition, which presumably won't conflict. -# -# Allow platforms with buggy compilers to force restrict to not be -# used by setting $FORCE_DISABLE_RESTRICT=yes in the relevant -# template. AC_C_RESTRICT -if test "$ac_cv_c_restrict" = "no" -o "x$FORCE_DISABLE_RESTRICT" = "xyes"; then +if test "$ac_cv_c_restrict" = "no"; then pg_restrict="" else pg_restrict="$ac_cv_c_restrict" @@ -1694,15 +1663,6 @@ AC_CHECK_TYPES([struct option], [], [], #include #endif]) -if test "$with_zlib" = yes; then - # Check that defines z_streamp (versions before about 1.0.4 - # did not). While we could work around the lack of z_streamp, it - # seems unwise to encourage people to use such old zlib versions... - AC_CHECK_TYPE(z_streamp, [], [AC_MSG_ERROR([zlib version is too old -Use --without-zlib to disable zlib support.])], - [#include ]) -fi - case $host_cpu in x86_64) # On x86_64, check if we can compile a popcntq instruction @@ -1764,14 +1724,11 @@ if test "$ac_cv_sizeof_off_t" -lt 8; then fi fi -AC_CHECK_SIZEOF([bool], [], -[#ifdef HAVE_STDBOOL_H -#include -#endif]) +AC_CHECK_SIZEOF([bool], [], [#include ]) -dnl We use if we have it and it declares type bool as having -dnl size 1. Otherwise, c.h will fall back to declaring bool as unsigned char. -if test "$ac_cv_header_stdbool_h" = yes -a "$ac_cv_sizeof_bool" = 1; then +dnl We use if bool has size 1 after including it. Otherwise, c.h +dnl will fall back to declaring bool as unsigned char. +if test "$ac_cv_sizeof_bool" = 1; then AC_DEFINE([PG_USE_STDBOOL], 1, [Define to 1 to use to define type bool.]) fi @@ -1794,6 +1751,7 @@ LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'` AC_CHECK_FUNCS(m4_normalize([ backtrace_symbols copyfile + copy_file_range getifaddrs getpeerucred inet_pton @@ -1805,7 +1763,6 @@ AC_CHECK_FUNCS(m4_normalize([ pthread_is_threaded_np setproctitle setproctitle_fast - strchrnul strsignal syncfs sync_file_range @@ -1841,10 +1798,11 @@ AC_CHECK_DECLS(posix_fadvise, [], [], [#include ]) AC_CHECK_DECLS(fdatasync, [], [], [#include ]) AC_CHECK_DECLS([strlcat, strlcpy, strnlen]) -# We can't use AC_REPLACE_FUNCS to replace these functions, because it +# We can't use AC_CHECK_FUNCS to detect these functions, because it # won't handle deployment target restrictions on macOS -AC_CHECK_DECLS([preadv], [], [AC_LIBOBJ(preadv)], [#include ]) -AC_CHECK_DECLS([pwritev], [], [AC_LIBOBJ(pwritev)], [#include ]) +AC_CHECK_DECLS([preadv], [], [], [#include ]) +AC_CHECK_DECLS([pwritev], [], [], [#include ]) +AC_CHECK_DECLS([strchrnul], [], [], [#include ]) # This is probably only present on macOS, but may as well check always AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include ]) @@ -1860,9 +1818,7 @@ AC_REPLACE_FUNCS(m4_normalize([ strnlen ])) -if test "$enable_thread_safety" = yes; then - AC_REPLACE_FUNCS(pthread_barrier_wait) -fi +AC_REPLACE_FUNCS(pthread_barrier_wait) if test "$PORTNAME" = "win32" -o "$PORTNAME" = "cygwin"; then # Cygwin and (apparently, based on test results) Mingw both @@ -1905,6 +1861,7 @@ if test "$PORTNAME" = "win32"; then AC_LIBOBJ(win32env) AC_LIBOBJ(win32error) AC_LIBOBJ(win32fdatasync) + AC_LIBOBJ(win32gai_strerror) AC_LIBOBJ(win32getrusage) AC_LIBOBJ(win32link) AC_LIBOBJ(win32ntdll) @@ -2041,18 +1998,28 @@ fi AC_CHECK_ALIGNOF(double) # Compute maximum alignment of any basic type. -# We assume long's alignment is at least as strong as char, short, or int; -# but we must check long long (if it is being used for int64) and double. -# Note that we intentionally do not consider any types wider than 64 bits, -# as allowing MAXIMUM_ALIGNOF to exceed 8 would be too much of a penalty -# for disk and memory space. +# +# We require 'double' to have the strictest alignment among the basic types, +# because otherwise the C ABI might impose 8-byte alignment on some of the +# other C types that correspond to TYPALIGN_DOUBLE SQL types. That could +# cause a mismatch between the tuple layout and the C struct layout of a +# catalog tuple. We used to carefully order catalog columns such that any +# fixed-width, attalign=4 columns were at offsets divisible by 8 regardless +# of MAXIMUM_ALIGNOF to avoid that, but we no longer support any platforms +# where TYPALIGN_DOUBLE != MAXIMUM_ALIGNOF. +# +# We assume without checking that long's alignment is at least as strong as +# char, short, or int. Note that we intentionally do not consider any types +# wider than 64 bits, as allowing MAXIMUM_ALIGNOF to exceed 8 would be too +# much of a penalty for disk and memory space. -MAX_ALIGNOF=$ac_cv_alignof_long -if test $MAX_ALIGNOF -lt $ac_cv_alignof_double ; then - MAX_ALIGNOF=$ac_cv_alignof_double +MAX_ALIGNOF=$ac_cv_alignof_double + +if test $ac_cv_alignof_long -gt $MAX_ALIGNOF ; then + AC_MSG_ERROR([alignment of 'long' is greater than the alignment of 'double']) fi -if test x"$HAVE_LONG_LONG_INT_64" = xyes && test $MAX_ALIGNOF -lt $ac_cv_alignof_long_long_int ; then - MAX_ALIGNOF="$ac_cv_alignof_long_long_int" +if test x"$HAVE_LONG_LONG_INT_64" = xyes && test $ac_cv_alignof_long_long_int -gt $MAX_ALIGNOF ; then + AC_MSG_ERROR([alignment of 'long long int' is greater than the alignment of 'double']) fi AC_DEFINE_UNQUOTED(MAXIMUM_ALIGNOF, $MAX_ALIGNOF, [Define as the maximum alignment requirement of any C data type.]) @@ -2087,6 +2054,17 @@ if test x"$pgac_cv__get_cpuid" = x"yes"; then AC_DEFINE(HAVE__GET_CPUID, 1, [Define to 1 if you have __get_cpuid.]) fi +AC_CACHE_CHECK([for __get_cpuid_count], [pgac_cv__get_cpuid_count], +[AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [[unsigned int exx[4] = {0, 0, 0, 0}; + __get_cpuid_count(7, 0, &exx[0], &exx[1], &exx[2], &exx[3]); + ]])], + [pgac_cv__get_cpuid_count="yes"], + [pgac_cv__get_cpuid_count="no"])]) +if test x"$pgac_cv__get_cpuid_count" = x"yes"; then + AC_DEFINE(HAVE__GET_CPUID_COUNT, 1, [Define to 1 if you have __get_cpuid_count.]) +fi + AC_CACHE_CHECK([for __cpuid], [pgac_cv__cpuid], [AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [[unsigned int exx[4] = {0, 0, 0, 0}; @@ -2098,6 +2076,46 @@ if test x"$pgac_cv__cpuid" = x"yes"; then AC_DEFINE(HAVE__CPUID, 1, [Define to 1 if you have __cpuid.]) fi +AC_CACHE_CHECK([for __cpuidex], [pgac_cv__cpuidex], +[AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [[unsigned int exx[4] = {0, 0, 0, 0}; + __get_cpuidex(exx[0], 7, 0); + ]])], + [pgac_cv__cpuidex="yes"], + [pgac_cv__cpuidex="no"])]) +if test x"$pgac_cv__cpuidex" = x"yes"; then + AC_DEFINE(HAVE__CPUIDEX, 1, [Define to 1 if you have __cpuidex.]) +fi + +# Check for XSAVE intrinsics +# +CFLAGS_XSAVE="" +PGAC_XSAVE_INTRINSICS([]) +if test x"$pgac_xsave_intrinsics" != x"yes"; then + PGAC_XSAVE_INTRINSICS([-mxsave]) +fi +if test x"$pgac_xsave_intrinsics" = x"yes"; then + AC_DEFINE(HAVE_XSAVE_INTRINSICS, 1, [Define to 1 if you have XSAVE intrinsics.]) +fi +AC_SUBST(CFLAGS_XSAVE) + +# Check for AVX-512 popcount intrinsics +# +CFLAGS_POPCNT="" +PG_POPCNT_OBJS="" +if test x"$host_cpu" = x"x86_64"; then + PGAC_AVX512_POPCNT_INTRINSICS([]) + if test x"$pgac_avx512_popcnt_intrinsics" != x"yes"; then + PGAC_AVX512_POPCNT_INTRINSICS([-mavx512vpopcntdq -mavx512bw]) + fi + if test x"$pgac_avx512_popcnt_intrinsics" = x"yes"; then + PG_POPCNT_OBJS="pg_popcount_avx512.o pg_popcount_avx512_choose.o" + AC_DEFINE(USE_AVX512_POPCNT_WITH_RUNTIME_CHECK, 1, [Define to 1 to use AVX-512 popcount instructions with a runtime check.]) + fi +fi +AC_SUBST(CFLAGS_POPCNT) +AC_SUBST(PG_POPCNT_OBJS) + # Check for Intel SSE 4.2 intrinsics to do CRC calculations. # # First check if the _mm_crc32_u8 and _mm_crc32_u64 intrinsics can be used @@ -2119,13 +2137,23 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [ # Check for ARMv8 CRC Extension intrinsics to do CRC calculations. # # First check if __crc32c* intrinsics can be used with the default compiler -# flags. If not, check if adding -march=armv8-a+crc flag helps. +# flags. If not, check if adding "-march=armv8-a+crc+simd" flag helps. +# On systems using soft-float ABI, "-march=armv8-a+crc" is required instead. # CFLAGS_CRC is set if the extra flag is required. PGAC_ARMV8_CRC32C_INTRINSICS([]) if test x"$pgac_armv8_crc32c_intrinsics" != x"yes"; then - PGAC_ARMV8_CRC32C_INTRINSICS([-march=armv8-a+crc]) + PGAC_ARMV8_CRC32C_INTRINSICS([-march=armv8-a+crc+simd]) + if test x"$pgac_armv8_crc32c_intrinsics" != x"yes"; then + PGAC_ARMV8_CRC32C_INTRINSICS([-march=armv8-a+crc]) + fi fi +# Check for LoongArch CRC intrinsics to do CRC calculations. +# +# Check if __builtin_loongarch_crcc_* intrinsics can be used +# with the default compiler flags. +PGAC_LOONGARCH_CRC32C_INTRINSICS() + AC_SUBST(CFLAGS_CRC) # Select CRC-32C implementation. @@ -2142,9 +2170,12 @@ AC_SUBST(CFLAGS_CRC) # we're not targeting such a processor, but can nevertheless produce code that # uses the CRC instructions, compile both, and select at runtime. # -# You can override this logic by setting the appropriate USE_*_CRC32 flag to 1 +# You can skip the runtime check by setting the appropriate USE_*_CRC32 flag to 1 # in the template or configure command line. -if test x"$USE_SLICING_BY_8_CRC32C" = x"" && test x"$USE_SSE42_CRC32C" = x"" && test x"$USE_SSE42_CRC32C_WITH_RUNTIME_CHECK" = x"" && test x"$USE_ARMV8_CRC32C" = x"" && test x"$USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK" = x""; then +# +# If we are targeting a LoongArch processor, CRC instructions are +# always available (at least on 64 bit), so no runtime check is needed. +if test x"$USE_SLICING_BY_8_CRC32C" = x"" && test x"$USE_SSE42_CRC32C" = x"" && test x"$USE_SSE42_CRC32C_WITH_RUNTIME_CHECK" = x"" && test x"$USE_ARMV8_CRC32C" = x"" && test x"$USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK" = x"" && test x"$USE_LOONGARCH_CRC32C" = x""; then # Use Intel SSE 4.2 if available. if test x"$pgac_sse42_crc32_intrinsics" = x"yes" && test x"$SSE4_2_TARGETED" = x"1" ; then USE_SSE42_CRC32C=1 @@ -2162,10 +2193,15 @@ if test x"$USE_SLICING_BY_8_CRC32C" = x"" && test x"$USE_SSE42_CRC32C" = x"" && if test x"$pgac_armv8_crc32c_intrinsics" = x"yes"; then USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK=1 else - # fall back to slicing-by-8 algorithm, which doesn't require any - # special CPU support. - USE_SLICING_BY_8_CRC32C=1 - fi + # LoongArch CRCC instructions. + if test x"$pgac_loongarch_crc32c_intrinsics" = x"yes"; then + USE_LOONGARCH_CRC32C=1 + else + # fall back to slicing-by-8 algorithm, which doesn't require any + # special CPU support. + USE_SLICING_BY_8_CRC32C=1 + fi + fi fi fi fi @@ -2193,9 +2229,15 @@ else PG_CRC32C_OBJS="pg_crc32c_armv8.o pg_crc32c_sb8.o pg_crc32c_armv8_choose.o" AC_MSG_RESULT(ARMv8 CRC instructions with runtime check) else - AC_DEFINE(USE_SLICING_BY_8_CRC32C, 1, [Define to 1 to use software CRC-32C implementation (slicing-by-8).]) - PG_CRC32C_OBJS="pg_crc32c_sb8.o" - AC_MSG_RESULT(slicing-by-8) + if test x"$USE_LOONGARCH_CRC32C" = x"1"; then + AC_DEFINE(USE_LOONGARCH_CRC32C, 1, [Define to 1 to use LoongArch CRCC instructions.]) + PG_CRC32C_OBJS="pg_crc32c_loongarch.o" + AC_MSG_RESULT(LoongArch CRCC instructions) + else + AC_DEFINE(USE_SLICING_BY_8_CRC32C, 1, [Define to 1 to use software CRC-32C implementation (slicing-by-8).]) + PG_CRC32C_OBJS="pg_crc32c_sb8.o" + AC_MSG_RESULT(slicing-by-8) + fi fi fi fi @@ -2497,6 +2539,6 @@ AC_OUTPUT # Ensure that any meson build directories would reconfigure and see that # there's a conflicting in-tree build and can error out. -if test "$vpath_build"="no"; then +if test "$vpath_build" = "no"; then touch meson.build fi diff --git a/contrib/Makefile b/contrib/Makefile index bbf220407b0bf..abd780f277405 100644 --- a/contrib/Makefile +++ b/contrib/Makefile @@ -5,7 +5,6 @@ top_builddir = .. include $(top_builddir)/src/Makefile.global SUBDIRS = \ - adminpack \ amcheck \ auth_delay \ auto_explain \ @@ -29,7 +28,6 @@ SUBDIRS = \ lo \ ltree \ oid2name \ - old_snapshot \ pageinspect \ passwordcheck \ pg_buffercache \ diff --git a/contrib/adminpack/Makefile b/contrib/adminpack/Makefile deleted file mode 100644 index 851504f4aefba..0000000000000 --- a/contrib/adminpack/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -# contrib/adminpack/Makefile - -MODULE_big = adminpack -OBJS = \ - $(WIN32RES) \ - adminpack.o - -EXTENSION = adminpack -DATA = adminpack--1.0.sql adminpack--1.0--1.1.sql adminpack--1.1--2.0.sql\ - adminpack--2.0--2.1.sql -PGFILEDESC = "adminpack - support functions for pgAdmin" - -REGRESS = adminpack - -ifdef USE_PGXS -PG_CONFIG = pg_config -PGXS := $(shell $(PG_CONFIG) --pgxs) -include $(PGXS) -else -subdir = contrib/adminpack -top_builddir = ../.. -include $(top_builddir)/src/Makefile.global -include $(top_srcdir)/contrib/contrib-global.mk -endif diff --git a/contrib/adminpack/adminpack--1.0--1.1.sql b/contrib/adminpack/adminpack--1.0--1.1.sql deleted file mode 100644 index bb581653e0dde..0000000000000 --- a/contrib/adminpack/adminpack--1.0--1.1.sql +++ /dev/null @@ -1,6 +0,0 @@ -/* contrib/adminpack/adminpack--1.0--1.1.sql */ - --- complain if script is sourced in psql, rather than via ALTER EXTENSION -\echo Use "ALTER EXTENSION adminpack UPDATE TO '1.1'" to load this file. \quit - -REVOKE EXECUTE ON FUNCTION pg_catalog.pg_logfile_rotate() FROM PUBLIC; diff --git a/contrib/adminpack/adminpack--1.0.sql b/contrib/adminpack/adminpack--1.0.sql deleted file mode 100644 index f76f5c3cdf719..0000000000000 --- a/contrib/adminpack/adminpack--1.0.sql +++ /dev/null @@ -1,53 +0,0 @@ -/* contrib/adminpack/adminpack--1.0.sql */ - --- complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "CREATE EXTENSION adminpack" to load this file. \quit - -/* *********************************************** - * Administrative functions for PostgreSQL - * *********************************************** */ - -/* generic file access functions */ - -CREATE FUNCTION pg_catalog.pg_file_write(text, text, bool) -RETURNS bigint -AS 'MODULE_PATHNAME', 'pg_file_write' -LANGUAGE C VOLATILE STRICT; - -CREATE FUNCTION pg_catalog.pg_file_rename(text, text, text) -RETURNS bool -AS 'MODULE_PATHNAME', 'pg_file_rename' -LANGUAGE C VOLATILE; - -CREATE FUNCTION pg_catalog.pg_file_rename(text, text) -RETURNS bool -AS 'SELECT pg_catalog.pg_file_rename($1, $2, NULL::pg_catalog.text);' -LANGUAGE SQL VOLATILE STRICT; - -CREATE FUNCTION pg_catalog.pg_file_unlink(text) -RETURNS bool -AS 'MODULE_PATHNAME', 'pg_file_unlink' -LANGUAGE C VOLATILE STRICT; - -CREATE FUNCTION pg_catalog.pg_logdir_ls() -RETURNS setof record -AS 'MODULE_PATHNAME', 'pg_logdir_ls' -LANGUAGE C VOLATILE STRICT; - - -/* Renaming of existing backend functions for pgAdmin compatibility */ - -CREATE FUNCTION pg_catalog.pg_file_read(text, bigint, bigint) -RETURNS text -AS 'pg_read_file' -LANGUAGE INTERNAL VOLATILE STRICT; - -CREATE FUNCTION pg_catalog.pg_file_length(text) -RETURNS bigint -AS 'SELECT size FROM pg_catalog.pg_stat_file($1)' -LANGUAGE SQL VOLATILE STRICT; - -CREATE FUNCTION pg_catalog.pg_logfile_rotate() -RETURNS int4 -AS 'pg_rotate_logfile' -LANGUAGE INTERNAL VOLATILE STRICT; diff --git a/contrib/adminpack/adminpack--1.1--2.0.sql b/contrib/adminpack/adminpack--1.1--2.0.sql deleted file mode 100644 index ceaeafa3789b1..0000000000000 --- a/contrib/adminpack/adminpack--1.1--2.0.sql +++ /dev/null @@ -1,51 +0,0 @@ -/* contrib/adminpack/adminpack--1.1--2.0.sql */ - --- complain if script is sourced in psql, rather than via ALTER EXTENSION -\echo Use "ALTER EXTENSION adminpack UPDATE TO '2.0'" to load this file. \quit - -/* *********************************************** - * Administrative functions for PostgreSQL - * *********************************************** */ - -/* generic file access functions */ - -CREATE OR REPLACE FUNCTION pg_catalog.pg_file_write(text, text, bool) -RETURNS bigint -AS 'MODULE_PATHNAME', 'pg_file_write_v1_1' -LANGUAGE C VOLATILE STRICT; - -REVOKE EXECUTE ON FUNCTION pg_catalog.pg_file_write(text, text, bool) FROM PUBLIC; - -CREATE OR REPLACE FUNCTION pg_catalog.pg_file_rename(text, text, text) -RETURNS bool -AS 'MODULE_PATHNAME', 'pg_file_rename_v1_1' -LANGUAGE C VOLATILE; - -REVOKE EXECUTE ON FUNCTION pg_catalog.pg_file_rename(text, text, text) FROM PUBLIC; - -CREATE OR REPLACE FUNCTION pg_catalog.pg_file_rename(text, text) -RETURNS bool -AS 'SELECT pg_catalog.pg_file_rename($1, $2, NULL::pg_catalog.text);' -LANGUAGE SQL VOLATILE STRICT; - -CREATE OR REPLACE FUNCTION pg_catalog.pg_file_unlink(text) -RETURNS bool -AS 'MODULE_PATHNAME', 'pg_file_unlink_v1_1' -LANGUAGE C VOLATILE STRICT; - -REVOKE EXECUTE ON FUNCTION pg_catalog.pg_file_unlink(text) FROM PUBLIC; - -CREATE OR REPLACE FUNCTION pg_catalog.pg_logdir_ls() -RETURNS setof record -AS 'MODULE_PATHNAME', 'pg_logdir_ls_v1_1' -LANGUAGE C VOLATILE STRICT; - -REVOKE EXECUTE ON FUNCTION pg_catalog.pg_logdir_ls() FROM PUBLIC; - -/* These functions are now in the backend and callers should update to use those */ - -DROP FUNCTION pg_file_read(text, bigint, bigint); - -DROP FUNCTION pg_file_length(text); - -DROP FUNCTION pg_logfile_rotate(); diff --git a/contrib/adminpack/adminpack--2.0--2.1.sql b/contrib/adminpack/adminpack--2.0--2.1.sql deleted file mode 100644 index 1c6712e81639b..0000000000000 --- a/contrib/adminpack/adminpack--2.0--2.1.sql +++ /dev/null @@ -1,17 +0,0 @@ -/* contrib/adminpack/adminpack--2.0--2.1.sql */ - --- complain if script is sourced in psql, rather than via ALTER EXTENSION -\echo Use "ALTER EXTENSION adminpack UPDATE TO '2.1'" to load this file. \quit - -/* *********************************************** - * Administrative functions for PostgreSQL - * *********************************************** */ - -/* generic file access functions */ - -CREATE OR REPLACE FUNCTION pg_catalog.pg_file_sync(text) -RETURNS void -AS 'MODULE_PATHNAME', 'pg_file_sync' -LANGUAGE C VOLATILE STRICT; - -REVOKE EXECUTE ON FUNCTION pg_catalog.pg_file_sync(text) FROM PUBLIC; diff --git a/contrib/adminpack/adminpack.c b/contrib/adminpack/adminpack.c deleted file mode 100644 index d3aec7b685b47..0000000000000 --- a/contrib/adminpack/adminpack.c +++ /dev/null @@ -1,591 +0,0 @@ -/*------------------------------------------------------------------------- - * - * adminpack.c - * - * - * Copyright (c) 2002-2023, PostgreSQL Global Development Group - * - * Author: Andreas Pflug - * - * IDENTIFICATION - * contrib/adminpack/adminpack.c - * - *------------------------------------------------------------------------- - */ -#include "postgres.h" - -#include -#include -#include - -#include "catalog/pg_authid.h" -#include "catalog/pg_type.h" -#include "funcapi.h" -#include "miscadmin.h" -#include "postmaster/syslogger.h" -#include "storage/fd.h" -#include "utils/acl.h" -#include "utils/builtins.h" -#include "utils/datetime.h" - - -#ifdef WIN32 - -#ifdef rename -#undef rename -#endif - -#ifdef unlink -#undef unlink -#endif -#endif - -PG_MODULE_MAGIC; - -PG_FUNCTION_INFO_V1(pg_file_write); -PG_FUNCTION_INFO_V1(pg_file_write_v1_1); -PG_FUNCTION_INFO_V1(pg_file_sync); -PG_FUNCTION_INFO_V1(pg_file_rename); -PG_FUNCTION_INFO_V1(pg_file_rename_v1_1); -PG_FUNCTION_INFO_V1(pg_file_unlink); -PG_FUNCTION_INFO_V1(pg_file_unlink_v1_1); -PG_FUNCTION_INFO_V1(pg_logdir_ls); -PG_FUNCTION_INFO_V1(pg_logdir_ls_v1_1); - -static int64 pg_file_write_internal(text *file, text *data, bool replace); -static bool pg_file_rename_internal(text *file1, text *file2, text *file3); -static Datum pg_logdir_ls_internal(FunctionCallInfo fcinfo); - - -/*----------------------- - * some helper functions - */ - -/* - * Convert a "text" filename argument to C string, and check it's allowable. - * - * Filename may be absolute or relative to the DataDir, but we only allow - * absolute paths that match DataDir. - */ -static char * -convert_and_check_filename(text *arg) -{ - char *filename = text_to_cstring(arg); - - canonicalize_path(filename); /* filename can change length here */ - - /* - * Members of the 'pg_write_server_files' role are allowed to access any - * files on the server as the PG user, so no need to do any further checks - * here. - */ - if (has_privs_of_role(GetUserId(), ROLE_PG_WRITE_SERVER_FILES)) - return filename; - - /* - * User isn't a member of the pg_write_server_files role, so check if it's - * allowable - */ - if (is_absolute_path(filename)) - { - /* Allow absolute paths if within DataDir */ - if (!path_is_prefix_of_path(DataDir, filename)) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("absolute path not allowed"))); - } - else if (!path_is_relative_and_below_cwd(filename)) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("path must be in or below the data directory"))); - - return filename; -} - - -/* - * check for superuser, bark if not. - */ -static void -requireSuperuser(void) -{ - if (!superuser()) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("only superuser may access generic file functions"))); -} - - - -/* ------------------------------------ - * pg_file_write - old version - * - * The superuser() check here must be kept as the library might be upgraded - * without the extension being upgraded, meaning that in pre-1.1 installations - * these functions could be called by any user. - */ -Datum -pg_file_write(PG_FUNCTION_ARGS) -{ - text *file = PG_GETARG_TEXT_PP(0); - text *data = PG_GETARG_TEXT_PP(1); - bool replace = PG_GETARG_BOOL(2); - int64 count = 0; - - requireSuperuser(); - - count = pg_file_write_internal(file, data, replace); - - PG_RETURN_INT64(count); -} - -/* ------------------------------------ - * pg_file_write_v1_1 - Version 1.1 - * - * As of adminpack version 1.1, we no longer need to check if the user - * is a superuser because we REVOKE EXECUTE on the function from PUBLIC. - * Users can then grant access to it based on their policies. - * - * Otherwise identical to pg_file_write (above). - */ -Datum -pg_file_write_v1_1(PG_FUNCTION_ARGS) -{ - text *file = PG_GETARG_TEXT_PP(0); - text *data = PG_GETARG_TEXT_PP(1); - bool replace = PG_GETARG_BOOL(2); - int64 count = 0; - - count = pg_file_write_internal(file, data, replace); - - PG_RETURN_INT64(count); -} - -/* ------------------------------------ - * pg_file_write_internal - Workhorse for pg_file_write functions. - * - * This handles the actual work for pg_file_write. - */ -static int64 -pg_file_write_internal(text *file, text *data, bool replace) -{ - FILE *f; - char *filename; - int64 count = 0; - - filename = convert_and_check_filename(file); - - if (!replace) - { - struct stat fst; - - if (stat(filename, &fst) >= 0) - ereport(ERROR, - (errcode(ERRCODE_DUPLICATE_FILE), - errmsg("file \"%s\" exists", filename))); - - f = AllocateFile(filename, "wb"); - } - else - f = AllocateFile(filename, "ab"); - - if (!f) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open file \"%s\" for writing: %m", - filename))); - - count = fwrite(VARDATA_ANY(data), 1, VARSIZE_ANY_EXHDR(data), f); - if (count != VARSIZE_ANY_EXHDR(data) || FreeFile(f)) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not write file \"%s\": %m", filename))); - - return (count); -} - -/* ------------------------------------ - * pg_file_sync - * - * We REVOKE EXECUTE on the function from PUBLIC. - * Users can then grant access to it based on their policies. - */ -Datum -pg_file_sync(PG_FUNCTION_ARGS) -{ - char *filename; - struct stat fst; - - filename = convert_and_check_filename(PG_GETARG_TEXT_PP(0)); - - if (stat(filename, &fst) < 0) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not stat file \"%s\": %m", filename))); - - fsync_fname_ext(filename, S_ISDIR(fst.st_mode), false, ERROR); - - PG_RETURN_VOID(); -} - -/* ------------------------------------ - * pg_file_rename - old version - * - * The superuser() check here must be kept as the library might be upgraded - * without the extension being upgraded, meaning that in pre-1.1 installations - * these functions could be called by any user. - */ -Datum -pg_file_rename(PG_FUNCTION_ARGS) -{ - text *file1; - text *file2; - text *file3; - bool result; - - requireSuperuser(); - - if (PG_ARGISNULL(0) || PG_ARGISNULL(1)) - PG_RETURN_NULL(); - - file1 = PG_GETARG_TEXT_PP(0); - file2 = PG_GETARG_TEXT_PP(1); - - if (PG_ARGISNULL(2)) - file3 = NULL; - else - file3 = PG_GETARG_TEXT_PP(2); - - result = pg_file_rename_internal(file1, file2, file3); - - PG_RETURN_BOOL(result); -} - -/* ------------------------------------ - * pg_file_rename_v1_1 - Version 1.1 - * - * As of adminpack version 1.1, we no longer need to check if the user - * is a superuser because we REVOKE EXECUTE on the function from PUBLIC. - * Users can then grant access to it based on their policies. - * - * Otherwise identical to pg_file_write (above). - */ -Datum -pg_file_rename_v1_1(PG_FUNCTION_ARGS) -{ - text *file1; - text *file2; - text *file3; - bool result; - - if (PG_ARGISNULL(0) || PG_ARGISNULL(1)) - PG_RETURN_NULL(); - - file1 = PG_GETARG_TEXT_PP(0); - file2 = PG_GETARG_TEXT_PP(1); - - if (PG_ARGISNULL(2)) - file3 = NULL; - else - file3 = PG_GETARG_TEXT_PP(2); - - result = pg_file_rename_internal(file1, file2, file3); - - PG_RETURN_BOOL(result); -} - -/* ------------------------------------ - * pg_file_rename_internal - Workhorse for pg_file_rename functions. - * - * This handles the actual work for pg_file_rename. - */ -static bool -pg_file_rename_internal(text *file1, text *file2, text *file3) -{ - char *fn1, - *fn2, - *fn3; - int rc; - - fn1 = convert_and_check_filename(file1); - fn2 = convert_and_check_filename(file2); - - if (file3 == NULL) - fn3 = NULL; - else - fn3 = convert_and_check_filename(file3); - - if (access(fn1, W_OK) < 0) - { - ereport(WARNING, - (errcode_for_file_access(), - errmsg("file \"%s\" is not accessible: %m", fn1))); - - return false; - } - - if (fn3 && access(fn2, W_OK) < 0) - { - ereport(WARNING, - (errcode_for_file_access(), - errmsg("file \"%s\" is not accessible: %m", fn2))); - - return false; - } - - rc = access(fn3 ? fn3 : fn2, W_OK); - if (rc >= 0 || errno != ENOENT) - { - ereport(ERROR, - (errcode(ERRCODE_DUPLICATE_FILE), - errmsg("cannot rename to target file \"%s\"", - fn3 ? fn3 : fn2))); - } - - if (fn3) - { - if (rename(fn2, fn3) != 0) - { - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not rename \"%s\" to \"%s\": %m", - fn2, fn3))); - } - if (rename(fn1, fn2) != 0) - { - ereport(WARNING, - (errcode_for_file_access(), - errmsg("could not rename \"%s\" to \"%s\": %m", - fn1, fn2))); - - if (rename(fn3, fn2) != 0) - { - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not rename \"%s\" back to \"%s\": %m", - fn3, fn2))); - } - else - { - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_FILE), - errmsg("renaming \"%s\" to \"%s\" was reverted", - fn2, fn3))); - } - } - } - else if (rename(fn1, fn2) != 0) - { - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not rename \"%s\" to \"%s\": %m", fn1, fn2))); - } - - return true; -} - - -/* ------------------------------------ - * pg_file_unlink - old version - * - * The superuser() check here must be kept as the library might be upgraded - * without the extension being upgraded, meaning that in pre-1.1 installations - * these functions could be called by any user. - */ -Datum -pg_file_unlink(PG_FUNCTION_ARGS) -{ - char *filename; - - requireSuperuser(); - - filename = convert_and_check_filename(PG_GETARG_TEXT_PP(0)); - - if (access(filename, W_OK) < 0) - { - if (errno == ENOENT) - PG_RETURN_BOOL(false); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("file \"%s\" is not accessible: %m", filename))); - } - - if (unlink(filename) < 0) - { - ereport(WARNING, - (errcode_for_file_access(), - errmsg("could not unlink file \"%s\": %m", filename))); - - PG_RETURN_BOOL(false); - } - PG_RETURN_BOOL(true); -} - - -/* ------------------------------------ - * pg_file_unlink_v1_1 - Version 1.1 - * - * As of adminpack version 1.1, we no longer need to check if the user - * is a superuser because we REVOKE EXECUTE on the function from PUBLIC. - * Users can then grant access to it based on their policies. - * - * Otherwise identical to pg_file_unlink (above). - */ -Datum -pg_file_unlink_v1_1(PG_FUNCTION_ARGS) -{ - char *filename; - - filename = convert_and_check_filename(PG_GETARG_TEXT_PP(0)); - - if (access(filename, W_OK) < 0) - { - if (errno == ENOENT) - PG_RETURN_BOOL(false); - else - ereport(ERROR, - (errcode_for_file_access(), - errmsg("file \"%s\" is not accessible: %m", filename))); - } - - if (unlink(filename) < 0) - { - ereport(WARNING, - (errcode_for_file_access(), - errmsg("could not unlink file \"%s\": %m", filename))); - - PG_RETURN_BOOL(false); - } - PG_RETURN_BOOL(true); -} - -/* ------------------------------------ - * pg_logdir_ls - Old version - * - * The superuser() check here must be kept as the library might be upgraded - * without the extension being upgraded, meaning that in pre-1.1 installations - * these functions could be called by any user. - */ -Datum -pg_logdir_ls(PG_FUNCTION_ARGS) -{ - if (!superuser()) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("only superuser can list the log directory"))); - - return (pg_logdir_ls_internal(fcinfo)); -} - -/* ------------------------------------ - * pg_logdir_ls_v1_1 - Version 1.1 - * - * As of adminpack version 1.1, we no longer need to check if the user - * is a superuser because we REVOKE EXECUTE on the function from PUBLIC. - * Users can then grant access to it based on their policies. - * - * Otherwise identical to pg_logdir_ls (above). - */ -Datum -pg_logdir_ls_v1_1(PG_FUNCTION_ARGS) -{ - return (pg_logdir_ls_internal(fcinfo)); -} - -static Datum -pg_logdir_ls_internal(FunctionCallInfo fcinfo) -{ - ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; - bool randomAccess; - TupleDesc tupdesc; - Tuplestorestate *tupstore; - AttInMetadata *attinmeta; - DIR *dirdesc; - struct dirent *de; - MemoryContext oldcontext; - - if (strcmp(Log_filename, "postgresql-%Y-%m-%d_%H%M%S.log") != 0) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("the log_filename parameter must equal 'postgresql-%%Y-%%m-%%d_%%H%%M%%S.log'"))); - - /* check to see if caller supports us returning a tuplestore */ - if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("set-valued function called in context that cannot accept a set"))); - if (!(rsinfo->allowedModes & SFRM_Materialize)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("materialize mode required, but it is not allowed in this context"))); - - /* The tupdesc and tuplestore must be created in ecxt_per_query_memory */ - oldcontext = MemoryContextSwitchTo(rsinfo->econtext->ecxt_per_query_memory); - - tupdesc = CreateTemplateTupleDesc(2); - TupleDescInitEntry(tupdesc, (AttrNumber) 1, "starttime", - TIMESTAMPOID, -1, 0); - TupleDescInitEntry(tupdesc, (AttrNumber) 2, "filename", - TEXTOID, -1, 0); - - randomAccess = (rsinfo->allowedModes & SFRM_Materialize_Random) != 0; - tupstore = tuplestore_begin_heap(randomAccess, false, work_mem); - rsinfo->returnMode = SFRM_Materialize; - rsinfo->setResult = tupstore; - rsinfo->setDesc = tupdesc; - - MemoryContextSwitchTo(oldcontext); - - attinmeta = TupleDescGetAttInMetadata(tupdesc); - - dirdesc = AllocateDir(Log_directory); - while ((de = ReadDir(dirdesc, Log_directory)) != NULL) - { - char *values[2]; - HeapTuple tuple; - char timestampbuf[32]; - char *field[MAXDATEFIELDS]; - char lowstr[MAXDATELEN + 1]; - int dtype; - int nf, - ftype[MAXDATEFIELDS]; - fsec_t fsec; - int tz = 0; - struct pg_tm date; - DateTimeErrorExtra extra; - - /* - * Default format: postgresql-YYYY-MM-DD_HHMMSS.log - */ - if (strlen(de->d_name) != 32 - || strncmp(de->d_name, "postgresql-", 11) != 0 - || de->d_name[21] != '_' - || strcmp(de->d_name + 28, ".log") != 0) - continue; - - /* extract timestamp portion of filename */ - strcpy(timestampbuf, de->d_name + 11); - timestampbuf[17] = '\0'; - - /* parse and decode expected timestamp to verify it's OK format */ - if (ParseDateTime(timestampbuf, lowstr, MAXDATELEN, field, ftype, MAXDATEFIELDS, &nf)) - continue; - - if (DecodeDateTime(field, ftype, nf, - &dtype, &date, &fsec, &tz, &extra)) - continue; - - /* Seems the timestamp is OK; prepare and return tuple */ - - values[0] = timestampbuf; - values[1] = psprintf("%s/%s", Log_directory, de->d_name); - - tuple = BuildTupleFromCStrings(attinmeta, values); - - tuplestore_puttuple(tupstore, tuple); - } - - FreeDir(dirdesc); - return (Datum) 0; -} diff --git a/contrib/adminpack/adminpack.control b/contrib/adminpack/adminpack.control deleted file mode 100644 index ae35d22156aa6..0000000000000 --- a/contrib/adminpack/adminpack.control +++ /dev/null @@ -1,6 +0,0 @@ -# adminpack extension -comment = 'administrative functions for PostgreSQL' -default_version = '2.1' -module_pathname = '$libdir/adminpack' -relocatable = false -schema = pg_catalog diff --git a/contrib/adminpack/expected/adminpack.out b/contrib/adminpack/expected/adminpack.out deleted file mode 100644 index f419a5ea1dff5..0000000000000 --- a/contrib/adminpack/expected/adminpack.out +++ /dev/null @@ -1,172 +0,0 @@ -CREATE EXTENSION adminpack; --- create new file -SELECT pg_file_write('test_file1', 'test1', false); - pg_file_write ---------------- - 5 -(1 row) - -SELECT pg_read_file('test_file1'); - pg_read_file --------------- - test1 -(1 row) - --- append -SELECT pg_file_write('test_file1', 'test1', true); - pg_file_write ---------------- - 5 -(1 row) - -SELECT pg_read_file('test_file1'); - pg_read_file --------------- - test1test1 -(1 row) - --- error, already exists -SELECT pg_file_write('test_file1', 'test1', false); -ERROR: file "test_file1" exists -SELECT pg_read_file('test_file1'); - pg_read_file --------------- - test1test1 -(1 row) - --- disallowed file paths for non-superusers and users who are --- not members of pg_write_server_files -CREATE ROLE regress_adminpack_user1; -GRANT pg_read_all_settings TO regress_adminpack_user1; -GRANT EXECUTE ON FUNCTION pg_file_write(text,text,bool) TO regress_adminpack_user1; -SET ROLE regress_adminpack_user1; -SELECT pg_file_write('../test_file0', 'test0', false); -ERROR: path must be in or below the data directory -SELECT pg_file_write('/tmp/test_file0', 'test0', false); -ERROR: absolute path not allowed -SELECT pg_file_write(current_setting('data_directory') || '/test_file4', 'test4', false); - pg_file_write ---------------- - 5 -(1 row) - -SELECT pg_file_write(current_setting('data_directory') || '/../test_file4', 'test4', false); -ERROR: absolute path not allowed -RESET ROLE; -REVOKE EXECUTE ON FUNCTION pg_file_write(text,text,bool) FROM regress_adminpack_user1; -REVOKE pg_read_all_settings FROM regress_adminpack_user1; -DROP ROLE regress_adminpack_user1; --- sync -SELECT pg_file_sync('test_file1'); -- sync file - pg_file_sync --------------- - -(1 row) - -SELECT pg_file_sync('pg_stat'); -- sync directory - pg_file_sync --------------- - -(1 row) - -SELECT pg_file_sync('test_file2'); -- not there -ERROR: could not stat file "test_file2": No such file or directory --- rename file -SELECT pg_file_rename('test_file1', 'test_file2'); - pg_file_rename ----------------- - t -(1 row) - -SELECT pg_read_file('test_file1'); -- not there -ERROR: could not open file "test_file1" for reading: No such file or directory -SELECT pg_read_file('test_file2'); - pg_read_file --------------- - test1test1 -(1 row) - --- error -SELECT pg_file_rename('test_file1', 'test_file2'); -WARNING: file "test_file1" is not accessible: No such file or directory - pg_file_rename ----------------- - f -(1 row) - --- rename file and archive -SELECT pg_file_write('test_file3', 'test3', false); - pg_file_write ---------------- - 5 -(1 row) - -SELECT pg_file_rename('test_file2', 'test_file3', 'test_file3_archive'); - pg_file_rename ----------------- - t -(1 row) - -SELECT pg_read_file('test_file2'); -- not there -ERROR: could not open file "test_file2" for reading: No such file or directory -SELECT pg_read_file('test_file3'); - pg_read_file --------------- - test1test1 -(1 row) - -SELECT pg_read_file('test_file3_archive'); - pg_read_file --------------- - test3 -(1 row) - --- unlink -SELECT pg_file_unlink('test_file1'); -- does not exist - pg_file_unlink ----------------- - f -(1 row) - -SELECT pg_file_unlink('test_file2'); -- does not exist - pg_file_unlink ----------------- - f -(1 row) - -SELECT pg_file_unlink('test_file3'); - pg_file_unlink ----------------- - t -(1 row) - -SELECT pg_file_unlink('test_file3_archive'); - pg_file_unlink ----------------- - t -(1 row) - -SELECT pg_file_unlink('test_file4'); - pg_file_unlink ----------------- - t -(1 row) - --- superuser checks -CREATE USER regress_adminpack_user1; -SET ROLE regress_adminpack_user1; -SELECT pg_file_write('test_file0', 'test0', false); -ERROR: permission denied for function pg_file_write -SELECT pg_file_sync('test_file0'); -ERROR: permission denied for function pg_file_sync -SELECT pg_file_rename('test_file0', 'test_file0'); -ERROR: permission denied for function pg_file_rename -CONTEXT: SQL function "pg_file_rename" statement 1 -SELECT pg_file_unlink('test_file0'); -ERROR: permission denied for function pg_file_unlink -SELECT pg_logdir_ls(); -ERROR: permission denied for function pg_logdir_ls -RESET ROLE; -DROP USER regress_adminpack_user1; --- no further tests for pg_logdir_ls() because it depends on the --- server's logging setup diff --git a/contrib/adminpack/meson.build b/contrib/adminpack/meson.build deleted file mode 100644 index 76587327d0e77..0000000000000 --- a/contrib/adminpack/meson.build +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group - -adminpack_sources = files( - 'adminpack.c', -) - -if host_system == 'windows' - adminpack_sources += rc_lib_gen.process(win32ver_rc, extra_args: [ - '--NAME', 'adminpack', - '--FILEDESC', 'adminpack - support functions for pgAdmin',]) -endif - -adminpack = shared_module('adminpack', - adminpack_sources, - kwargs: contrib_mod_args, -) -contrib_targets += adminpack - -install_data( - 'adminpack.control', - 'adminpack--1.0.sql', - 'adminpack--1.0--1.1.sql', - 'adminpack--1.1--2.0.sql', - 'adminpack--2.0--2.1.sql', - kwargs: contrib_data_args, -) - -tests += { - 'name': 'adminpack', - 'sd': meson.current_source_dir(), - 'bd': meson.current_build_dir(), - 'regress': { - 'sql': ['adminpack'], - }, -} diff --git a/contrib/adminpack/sql/adminpack.sql b/contrib/adminpack/sql/adminpack.sql deleted file mode 100644 index 5776c9af0d135..0000000000000 --- a/contrib/adminpack/sql/adminpack.sql +++ /dev/null @@ -1,76 +0,0 @@ -CREATE EXTENSION adminpack; - --- create new file -SELECT pg_file_write('test_file1', 'test1', false); -SELECT pg_read_file('test_file1'); - --- append -SELECT pg_file_write('test_file1', 'test1', true); -SELECT pg_read_file('test_file1'); - --- error, already exists -SELECT pg_file_write('test_file1', 'test1', false); -SELECT pg_read_file('test_file1'); - --- disallowed file paths for non-superusers and users who are --- not members of pg_write_server_files -CREATE ROLE regress_adminpack_user1; - -GRANT pg_read_all_settings TO regress_adminpack_user1; -GRANT EXECUTE ON FUNCTION pg_file_write(text,text,bool) TO regress_adminpack_user1; - -SET ROLE regress_adminpack_user1; -SELECT pg_file_write('../test_file0', 'test0', false); -SELECT pg_file_write('/tmp/test_file0', 'test0', false); -SELECT pg_file_write(current_setting('data_directory') || '/test_file4', 'test4', false); -SELECT pg_file_write(current_setting('data_directory') || '/../test_file4', 'test4', false); -RESET ROLE; -REVOKE EXECUTE ON FUNCTION pg_file_write(text,text,bool) FROM regress_adminpack_user1; -REVOKE pg_read_all_settings FROM regress_adminpack_user1; -DROP ROLE regress_adminpack_user1; - --- sync -SELECT pg_file_sync('test_file1'); -- sync file -SELECT pg_file_sync('pg_stat'); -- sync directory -SELECT pg_file_sync('test_file2'); -- not there - --- rename file -SELECT pg_file_rename('test_file1', 'test_file2'); -SELECT pg_read_file('test_file1'); -- not there -SELECT pg_read_file('test_file2'); - --- error -SELECT pg_file_rename('test_file1', 'test_file2'); - --- rename file and archive -SELECT pg_file_write('test_file3', 'test3', false); -SELECT pg_file_rename('test_file2', 'test_file3', 'test_file3_archive'); -SELECT pg_read_file('test_file2'); -- not there -SELECT pg_read_file('test_file3'); -SELECT pg_read_file('test_file3_archive'); - - --- unlink -SELECT pg_file_unlink('test_file1'); -- does not exist -SELECT pg_file_unlink('test_file2'); -- does not exist -SELECT pg_file_unlink('test_file3'); -SELECT pg_file_unlink('test_file3_archive'); -SELECT pg_file_unlink('test_file4'); - - --- superuser checks -CREATE USER regress_adminpack_user1; -SET ROLE regress_adminpack_user1; - -SELECT pg_file_write('test_file0', 'test0', false); -SELECT pg_file_sync('test_file0'); -SELECT pg_file_rename('test_file0', 'test_file0'); -SELECT pg_file_unlink('test_file0'); -SELECT pg_logdir_ls(); - -RESET ROLE; -DROP USER regress_adminpack_user1; - - --- no further tests for pg_logdir_ls() because it depends on the --- server's logging setup diff --git a/contrib/amcheck/Makefile b/contrib/amcheck/Makefile index b82f221e50bb4..5e9002d250181 100644 --- a/contrib/amcheck/Makefile +++ b/contrib/amcheck/Makefile @@ -7,11 +7,12 @@ OBJS = \ verify_nbtree.o EXTENSION = amcheck -DATA = amcheck--1.2--1.3.sql amcheck--1.1--1.2.sql amcheck--1.0--1.1.sql amcheck--1.0.sql +DATA = amcheck--1.3--1.4.sql amcheck--1.2--1.3.sql amcheck--1.1--1.2.sql amcheck--1.0--1.1.sql amcheck--1.0.sql PGFILEDESC = "amcheck - function for verifying relation integrity" REGRESS = check check_btree check_heap +EXTRA_INSTALL = contrib/pg_walinspect TAP_TESTS = 1 ifdef USE_PGXS diff --git a/contrib/amcheck/amcheck--1.3--1.4.sql b/contrib/amcheck/amcheck--1.3--1.4.sql new file mode 100644 index 0000000000000..75574eaa64b1d --- /dev/null +++ b/contrib/amcheck/amcheck--1.3--1.4.sql @@ -0,0 +1,29 @@ +/* contrib/amcheck/amcheck--1.3--1.4.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "ALTER EXTENSION amcheck UPDATE TO '1.4'" to load this file. \quit + +-- In order to avoid issues with dependencies when updating amcheck to 1.4, +-- create new, overloaded versions of the 1.2 bt_index_parent_check signature, +-- and 1.1 bt_index_check signature. + +-- +-- bt_index_parent_check() +-- +CREATE FUNCTION bt_index_parent_check(index regclass, + heapallindexed boolean, rootdescend boolean, checkunique boolean) +RETURNS VOID +AS 'MODULE_PATHNAME', 'bt_index_parent_check' +LANGUAGE C STRICT PARALLEL RESTRICTED; +-- +-- bt_index_check() +-- +CREATE FUNCTION bt_index_check(index regclass, + heapallindexed boolean, checkunique boolean) +RETURNS VOID +AS 'MODULE_PATHNAME', 'bt_index_check' +LANGUAGE C STRICT PARALLEL RESTRICTED; + +-- We don't want this to be available to public +REVOKE ALL ON FUNCTION bt_index_parent_check(regclass, boolean, boolean, boolean) FROM PUBLIC; +REVOKE ALL ON FUNCTION bt_index_check(regclass, boolean, boolean) FROM PUBLIC; diff --git a/contrib/amcheck/amcheck.control b/contrib/amcheck/amcheck.control index ab50931f754a0..e67ace01c995f 100644 --- a/contrib/amcheck/amcheck.control +++ b/contrib/amcheck/amcheck.control @@ -1,5 +1,5 @@ # amcheck extension comment = 'functions for verifying relation integrity' -default_version = '1.3' +default_version = '1.4' module_pathname = '$libdir/amcheck' relocatable = true diff --git a/contrib/amcheck/expected/check_btree.out b/contrib/amcheck/expected/check_btree.out index 38791bbc1f4a4..e7fb5f551574a 100644 --- a/contrib/amcheck/expected/check_btree.out +++ b/contrib/amcheck/expected/check_btree.out @@ -2,7 +2,7 @@ CREATE TABLE bttest_a(id int8); CREATE TABLE bttest_b(id int8); CREATE TABLE bttest_multi(id int8, data int8); CREATE TABLE delete_test_table (a bigint, b bigint, c bigint, d bigint); --- Stabalize tests +-- Stabilize tests ALTER TABLE bttest_a SET (autovacuum_enabled = false); ALTER TABLE bttest_b SET (autovacuum_enabled = false); ALTER TABLE bttest_multi SET (autovacuum_enabled = false); @@ -199,6 +199,69 @@ SELECT bt_index_check('bttest_a_expr_idx', true); (1 row) +-- UNIQUE constraint check +SELECT bt_index_check('bttest_a_idx', heapallindexed => true, checkunique => true); + bt_index_check +---------------- + +(1 row) + +SELECT bt_index_check('bttest_b_idx', heapallindexed => false, checkunique => true); + bt_index_check +---------------- + +(1 row) + +SELECT bt_index_parent_check('bttest_a_idx', heapallindexed => true, rootdescend => true, checkunique => true); + bt_index_parent_check +----------------------- + +(1 row) + +SELECT bt_index_parent_check('bttest_b_idx', heapallindexed => true, rootdescend => false, checkunique => true); + bt_index_parent_check +----------------------- + +(1 row) + +-- Check that null values in an unique index are not treated as equal +CREATE TABLE bttest_unique_nulls (a serial, b int, c int UNIQUE); +INSERT INTO bttest_unique_nulls VALUES (generate_series(1, 10000), 2, default); +SELECT bt_index_check('bttest_unique_nulls_c_key', heapallindexed => true, checkunique => true); + bt_index_check +---------------- + +(1 row) + +CREATE INDEX on bttest_unique_nulls (b,c); +SELECT bt_index_check('bttest_unique_nulls_b_c_idx', heapallindexed => true, checkunique => true); + bt_index_check +---------------- + +(1 row) + +-- Check support of both 1B and 4B header sizes of short varlena datum +CREATE TABLE varlena_bug (v text); +ALTER TABLE varlena_bug ALTER column v SET storage plain; +INSERT INTO varlena_bug VALUES ('x'); +COPY varlena_bug from stdin; +CREATE INDEX varlena_bug_idx on varlena_bug(v); +SELECT bt_index_check('varlena_bug_idx', true); + bt_index_check +---------------- + +(1 row) + +-- Also check that we compress varlena values, which were previously stored +-- uncompressed in index. +INSERT INTO varlena_bug VALUES (repeat('Test', 250)); +ALTER TABLE varlena_bug ALTER COLUMN v SET STORAGE extended; +SELECT bt_index_check('varlena_bug_idx', true); + bt_index_check +---------------- + +(1 row) + -- cleanup DROP TABLE bttest_a; DROP TABLE bttest_b; @@ -206,5 +269,7 @@ DROP TABLE bttest_multi; DROP TABLE delete_test_table; DROP TABLE toast_bug; DROP FUNCTION ifun(int8); +DROP TABLE bttest_unique_nulls; DROP OWNED BY regress_bttest_role; -- permissions DROP ROLE regress_bttest_role; +DROP TABLE varlena_bug; diff --git a/contrib/amcheck/expected/check_heap.out b/contrib/amcheck/expected/check_heap.out index 8f1beb4681cb3..979e5e84e723d 100644 --- a/contrib/amcheck/expected/check_heap.out +++ b/contrib/amcheck/expected/check_heap.out @@ -76,11 +76,15 @@ INSERT INTO heaptest (a, b) -- -- Create an alternative tablespace and move the heaptest table to it, causing -- it to be rewritten and all the blocks to reliably evicted from shared --- buffers -- guaranteeing actual reads when we next select from it. +-- buffers -- guaranteeing actual reads when we next select from it in the +-- same transaction. The heaptest table is smaller than the default +-- wal_skip_threshold, so a wal_level=minimal commit reads the table into +-- shared_buffers. A transaction delays that and excludes any autovacuum. SET allow_in_place_tablespaces = true; CREATE TABLESPACE regress_test_stats_tblspc LOCATION ''; SELECT sum(reads) AS stats_bulkreads_before FROM pg_stat_io WHERE context = 'bulkread' \gset +BEGIN; ALTER TABLE heaptest SET TABLESPACE regress_test_stats_tblspc; -- Check that valid options are not rejected nor corruption reported -- for a non-empty table @@ -104,6 +108,7 @@ SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 0, endblock := -------+--------+--------+----- (0 rows) +COMMIT; -- verify_heapam should have read in the page written out by -- ALTER TABLE ... SET TABLESPACE ... -- causing an additional bulkread, which should be reflected in pg_stat_io. diff --git a/contrib/amcheck/meson.build b/contrib/amcheck/meson.build index 5b55cf343a967..fc08e32539a75 100644 --- a/contrib/amcheck/meson.build +++ b/contrib/amcheck/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group amcheck_sources = files( 'verify_heapam.c', @@ -23,6 +23,7 @@ install_data( 'amcheck--1.0--1.1.sql', 'amcheck--1.1--1.2.sql', 'amcheck--1.2--1.3.sql', + 'amcheck--1.3--1.4.sql', kwargs: contrib_data_args, ) @@ -42,6 +43,8 @@ tests += { 't/001_verify_heapam.pl', 't/002_cic.pl', 't/003_cic_2pc.pl', + 't/004_verify_nbtree_unique.pl', + 't/005_pitr.pl', ], }, } diff --git a/contrib/amcheck/sql/check_btree.sql b/contrib/amcheck/sql/check_btree.sql index 033c04b4d0575..0793dbfeebd82 100644 --- a/contrib/amcheck/sql/check_btree.sql +++ b/contrib/amcheck/sql/check_btree.sql @@ -3,7 +3,7 @@ CREATE TABLE bttest_b(id int8); CREATE TABLE bttest_multi(id int8, data int8); CREATE TABLE delete_test_table (a bigint, b bigint, c bigint, d bigint); --- Stabalize tests +-- Stabilize tests ALTER TABLE bttest_a SET (autovacuum_enabled = false); ALTER TABLE bttest_b SET (autovacuum_enabled = false); ALTER TABLE bttest_multi SET (autovacuum_enabled = false); @@ -135,6 +135,35 @@ CREATE INDEX bttest_a_expr_idx ON bttest_a ((ifun(id) + ifun(0))) SELECT bt_index_check('bttest_a_expr_idx', true); +-- UNIQUE constraint check +SELECT bt_index_check('bttest_a_idx', heapallindexed => true, checkunique => true); +SELECT bt_index_check('bttest_b_idx', heapallindexed => false, checkunique => true); +SELECT bt_index_parent_check('bttest_a_idx', heapallindexed => true, rootdescend => true, checkunique => true); +SELECT bt_index_parent_check('bttest_b_idx', heapallindexed => true, rootdescend => false, checkunique => true); + +-- Check that null values in an unique index are not treated as equal +CREATE TABLE bttest_unique_nulls (a serial, b int, c int UNIQUE); +INSERT INTO bttest_unique_nulls VALUES (generate_series(1, 10000), 2, default); +SELECT bt_index_check('bttest_unique_nulls_c_key', heapallindexed => true, checkunique => true); +CREATE INDEX on bttest_unique_nulls (b,c); +SELECT bt_index_check('bttest_unique_nulls_b_c_idx', heapallindexed => true, checkunique => true); + +-- Check support of both 1B and 4B header sizes of short varlena datum +CREATE TABLE varlena_bug (v text); +ALTER TABLE varlena_bug ALTER column v SET storage plain; +INSERT INTO varlena_bug VALUES ('x'); +COPY varlena_bug from stdin; +x +\. +CREATE INDEX varlena_bug_idx on varlena_bug(v); +SELECT bt_index_check('varlena_bug_idx', true); + +-- Also check that we compress varlena values, which were previously stored +-- uncompressed in index. +INSERT INTO varlena_bug VALUES (repeat('Test', 250)); +ALTER TABLE varlena_bug ALTER COLUMN v SET STORAGE extended; +SELECT bt_index_check('varlena_bug_idx', true); + -- cleanup DROP TABLE bttest_a; DROP TABLE bttest_b; @@ -142,5 +171,7 @@ DROP TABLE bttest_multi; DROP TABLE delete_test_table; DROP TABLE toast_bug; DROP FUNCTION ifun(int8); +DROP TABLE bttest_unique_nulls; DROP OWNED BY regress_bttest_role; -- permissions DROP ROLE regress_bttest_role; +DROP TABLE varlena_bug; diff --git a/contrib/amcheck/sql/check_heap.sql b/contrib/amcheck/sql/check_heap.sql index cf5ce4d0c0a56..1745bae634e56 100644 --- a/contrib/amcheck/sql/check_heap.sql +++ b/contrib/amcheck/sql/check_heap.sql @@ -36,19 +36,23 @@ INSERT INTO heaptest (a, b) -- -- Create an alternative tablespace and move the heaptest table to it, causing -- it to be rewritten and all the blocks to reliably evicted from shared --- buffers -- guaranteeing actual reads when we next select from it. +-- buffers -- guaranteeing actual reads when we next select from it in the +-- same transaction. The heaptest table is smaller than the default +-- wal_skip_threshold, so a wal_level=minimal commit reads the table into +-- shared_buffers. A transaction delays that and excludes any autovacuum. SET allow_in_place_tablespaces = true; CREATE TABLESPACE regress_test_stats_tblspc LOCATION ''; SELECT sum(reads) AS stats_bulkreads_before FROM pg_stat_io WHERE context = 'bulkread' \gset +BEGIN; ALTER TABLE heaptest SET TABLESPACE regress_test_stats_tblspc; - -- Check that valid options are not rejected nor corruption reported -- for a non-empty table SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'none'); SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'all-frozen'); SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'all-visible'); SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 0, endblock := 0); +COMMIT; -- verify_heapam should have read in the page written out by -- ALTER TABLE ... SET TABLESPACE ... diff --git a/contrib/amcheck/t/001_verify_heapam.pl b/contrib/amcheck/t/001_verify_heapam.pl index 46d5b53181e88..9de3148277f1d 100644 --- a/contrib/amcheck/t/001_verify_heapam.pl +++ b/contrib/amcheck/t/001_verify_heapam.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/contrib/amcheck/t/002_cic.pl b/contrib/amcheck/t/002_cic.pl index 42a047a35710f..53a3db9745f40 100644 --- a/contrib/amcheck/t/002_cic.pl +++ b/contrib/amcheck/t/002_cic.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test CREATE INDEX CONCURRENTLY with concurrent modifications use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/contrib/amcheck/t/003_cic_2pc.pl b/contrib/amcheck/t/003_cic_2pc.pl index 3279a2505a38d..fc314b8524e34 100644 --- a/contrib/amcheck/t/003_cic_2pc.pl +++ b/contrib/amcheck/t/003_cic_2pc.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test CREATE INDEX CONCURRENTLY with concurrent prepared-xact modifications use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/contrib/amcheck/t/004_verify_nbtree_unique.pl b/contrib/amcheck/t/004_verify_nbtree_unique.pl new file mode 100644 index 0000000000000..3b22d56182862 --- /dev/null +++ b/contrib/amcheck/t/004_verify_nbtree_unique.pl @@ -0,0 +1,244 @@ + +# Copyright (c) 2023-2024, PostgreSQL Global Development Group + +# This regression test checks the behavior of the btree validation in the +# presence of breaking sort order changes. +# +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('test'); +$node->init; +$node->append_conf('postgresql.conf', 'autovacuum = off'); +$node->start; + +# Create a custom operator class and an index which uses it. +$node->safe_psql( + 'postgres', q( + CREATE EXTENSION amcheck; + + CREATE FUNCTION ok_cmp (int4, int4) + RETURNS int LANGUAGE sql AS + $$ + SELECT + CASE WHEN $1 < $2 THEN -1 + WHEN $1 > $2 THEN 1 + ELSE 0 + END; + $$; + + --- + --- Check 1: uniqueness violation. + --- + CREATE FUNCTION ok_cmp1 (int4, int4) + RETURNS int LANGUAGE sql AS + $$ + SELECT public.ok_cmp($1, $2); + $$; + + --- + --- Make values 768 and 769 look equal. + --- + CREATE FUNCTION bad_cmp1 (int4, int4) + RETURNS int LANGUAGE sql AS + $$ + SELECT + CASE WHEN ($1 = 768 AND $2 = 769) OR + ($1 = 769 AND $2 = 768) THEN 0 + ELSE public.ok_cmp($1, $2) + END; + $$; + + --- + --- Check 2: uniqueness violation without deduplication. + --- + CREATE FUNCTION ok_cmp2 (int4, int4) + RETURNS int LANGUAGE sql AS + $$ + SELECT public.ok_cmp($1, $2); + $$; + + CREATE FUNCTION bad_cmp2 (int4, int4) + RETURNS int LANGUAGE sql AS + $$ + SELECT + CASE WHEN $1 = $2 AND $1 = 400 THEN -1 + ELSE public.ok_cmp($1, $2) + END; + $$; + + --- + --- Check 3: uniqueness violation with deduplication. + --- + CREATE FUNCTION ok_cmp3 (int4, int4) + RETURNS int LANGUAGE sql AS + $$ + SELECT public.ok_cmp($1, $2); + $$; + + CREATE FUNCTION bad_cmp3 (int4, int4) + RETURNS int LANGUAGE sql AS + $$ + SELECT public.bad_cmp2($1, $2); + $$; + + --- + --- Create data. + --- + CREATE TABLE bttest_unique1 (i int4); + INSERT INTO bttest_unique1 + (SELECT * FROM generate_series(1, 1024) gs); + + CREATE TABLE bttest_unique2 (i int4); + INSERT INTO bttest_unique2(i) + (SELECT * FROM generate_series(1, 400) gs); + INSERT INTO bttest_unique2 + (SELECT * FROM generate_series(400, 1024) gs); + + CREATE TABLE bttest_unique3 (i int4); + INSERT INTO bttest_unique3 + SELECT * FROM bttest_unique2; + + CREATE OPERATOR CLASS int4_custom_ops1 FOR TYPE int4 USING btree AS + OPERATOR 1 < (int4, int4), OPERATOR 2 <= (int4, int4), + OPERATOR 3 = (int4, int4), OPERATOR 4 >= (int4, int4), + OPERATOR 5 > (int4, int4), FUNCTION 1 ok_cmp1(int4, int4); + CREATE OPERATOR CLASS int4_custom_ops2 FOR TYPE int4 USING btree AS + OPERATOR 1 < (int4, int4), OPERATOR 2 <= (int4, int4), + OPERATOR 3 = (int4, int4), OPERATOR 4 >= (int4, int4), + OPERATOR 5 > (int4, int4), FUNCTION 1 bad_cmp2(int4, int4); + CREATE OPERATOR CLASS int4_custom_ops3 FOR TYPE int4 USING btree AS + OPERATOR 1 < (int4, int4), OPERATOR 2 <= (int4, int4), + OPERATOR 3 = (int4, int4), OPERATOR 4 >= (int4, int4), + OPERATOR 5 > (int4, int4), FUNCTION 1 bad_cmp3(int4, int4); + + CREATE UNIQUE INDEX bttest_unique_idx1 + ON bttest_unique1 + USING btree (i int4_custom_ops1) + WITH (deduplicate_items = off); + CREATE UNIQUE INDEX bttest_unique_idx2 + ON bttest_unique2 + USING btree (i int4_custom_ops2) + WITH (deduplicate_items = off); + CREATE UNIQUE INDEX bttest_unique_idx3 + ON bttest_unique3 + USING btree (i int4_custom_ops3) + WITH (deduplicate_items = on); +)); + +my ($result, $stdout, $stderr); + +# +# Test 1. +# - insert seq values +# - create unique index +# - break cmp function +# - amcheck finds the uniqueness violation +# + +# We have not yet broken the index, so we should get no corruption +$result = $node->safe_psql( + 'postgres', q( + SELECT bt_index_check('bttest_unique_idx1', true, true); +)); +is($result, '', 'run amcheck on non-broken bttest_unique_idx1'); + +# Change the operator class to use a function which considers certain different +# values to be equal. +$node->safe_psql( + 'postgres', q( + UPDATE pg_catalog.pg_amproc SET + amproc = 'bad_cmp1'::regproc + WHERE amproc = 'ok_cmp1'::regproc; +)); + +($result, $stdout, $stderr) = $node->psql( + 'postgres', q( + SELECT bt_index_check('bttest_unique_idx1', true, true); +)); +ok( $stderr =~ /index uniqueness is violated for index "bttest_unique_idx1"/, + 'detected uniqueness violation for index "bttest_unique_idx1"'); + +# +# Test 2. +# - break cmp function +# - insert seq values with duplicates +# - create unique index +# - make cmp function correct +# - amcheck finds the uniqueness violation +# + +# Due to bad cmp function we expect amcheck to detect item order violation, +# but no uniqueness violation. +($result, $stdout, $stderr) = $node->psql( + 'postgres', q( + SELECT bt_index_check('bttest_unique_idx2', true, true); +)); +ok( $stderr =~ /item order invariant violated for index "bttest_unique_idx2"/, + 'detected item order invariant violation for index "bttest_unique_idx2"'); + +$node->safe_psql( + 'postgres', q( + UPDATE pg_catalog.pg_amproc SET + amproc = 'ok_cmp2'::regproc + WHERE amproc = 'bad_cmp2'::regproc; +)); + +($result, $stdout, $stderr) = $node->psql( + 'postgres', q( + SELECT bt_index_check('bttest_unique_idx2', true, true); +)); +ok( $stderr =~ /index uniqueness is violated for index "bttest_unique_idx2"/, + 'detected uniqueness violation for index "bttest_unique_idx2"'); + +# +# Test 3. +# - same as Test 2, but with index deduplication +# +# Then uniqueness violation is detected between different posting list +# entries inside one index entry. +# + +# Due to bad cmp function we expect amcheck to detect item order violation, +# but no uniqueness violation. +($result, $stdout, $stderr) = $node->psql( + 'postgres', q( + SELECT bt_index_check('bttest_unique_idx3', true, true); +)); +ok( $stderr =~ /item order invariant violated for index "bttest_unique_idx3"/, + 'detected item order invariant violation for index "bttest_unique_idx3"'); + +# For unique index deduplication is possible only for same values, but +# with different visibility. +$node->safe_psql( + 'postgres', q( + DELETE FROM bttest_unique3 WHERE 380 <= i AND i <= 420; + INSERT INTO bttest_unique3 (SELECT * FROM generate_series(380, 420)); + INSERT INTO bttest_unique3 VALUES (400); + DELETE FROM bttest_unique3 WHERE 380 <= i AND i <= 420; + INSERT INTO bttest_unique3 (SELECT * FROM generate_series(380, 420)); + INSERT INTO bttest_unique3 VALUES (400); + DELETE FROM bttest_unique3 WHERE 380 <= i AND i <= 420; + INSERT INTO bttest_unique3 (SELECT * FROM generate_series(380, 420)); + INSERT INTO bttest_unique3 VALUES (400); +)); + +$node->safe_psql( + 'postgres', q( + UPDATE pg_catalog.pg_amproc SET + amproc = 'ok_cmp3'::regproc + WHERE amproc = 'bad_cmp3'::regproc; +)); + +($result, $stdout, $stderr) = $node->psql( + 'postgres', q( + SELECT bt_index_check('bttest_unique_idx3', true, true); +)); +ok( $stderr =~ /index uniqueness is violated for index "bttest_unique_idx3"/, + 'detected uniqueness violation for index "bttest_unique_idx3"'); + +$node->stop; +done_testing(); diff --git a/contrib/amcheck/t/005_pitr.pl b/contrib/amcheck/t/005_pitr.pl new file mode 100644 index 0000000000000..a000408360a0e --- /dev/null +++ b/contrib/amcheck/t/005_pitr.pl @@ -0,0 +1,82 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# Test integrity of intermediate states by PITR to those states +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# origin node: generate WAL records of interest. +my $origin = PostgreSQL::Test::Cluster->new('origin'); +$origin->init(has_archiving => 1, allows_streaming => 1); +$origin->append_conf('postgresql.conf', 'autovacuum = off'); +$origin->start; +$origin->backup('my_backup'); +# Create a table with each of 6 PK values spanning 1/4 of a block. Delete the +# first four, so one index leaf is eligible for deletion. Make a replication +# slot just so pg_walinspect will always have access to later WAL. +my $setup = <safe_psql('postgres', $setup); +my $before_vacuum_lsn = + $origin->safe_psql('postgres', "SELECT pg_current_wal_lsn()"); +# VACUUM to delete the aforementioned leaf page. Force an XLogFlush() by +# dropping a permanent table. That way, the XLogReader infrastructure can +# always see VACUUM's records, even under synchronous_commit=off. Finally, +# find the LSN of that VACUUM's last UNLINK_PAGE record. +my $vacuum = <safe_psql('postgres', $vacuum); +$origin->stop; +die "did not find UNLINK_PAGE record" unless $unlink_lsn; + +# replica node: amcheck at notable points in the WAL stream +my $replica = PostgreSQL::Test::Cluster->new('replica'); +$replica->init_from_backup($origin, 'my_backup', has_restoring => 1); +$replica->append_conf('postgresql.conf', + "recovery_target_lsn = '$unlink_lsn'"); +$replica->append_conf('postgresql.conf', 'recovery_target_inclusive = off'); +$replica->append_conf('postgresql.conf', 'recovery_target_action = promote'); +$replica->start; +$replica->poll_query_until('postgres', "SELECT pg_is_in_recovery() = 'f';") + or die "Timed out while waiting for PITR promotion"; +# recovery done; run amcheck +my $debug = "SET client_min_messages = 'debug1'"; +my ($rc, $stderr); +$rc = $replica->psql( + 'postgres', + "$debug; SELECT bt_index_parent_check('not_leftmost_pk', true)", + stderr => \$stderr); +print STDERR $stderr, "\n"; +is($rc, 0, "bt_index_parent_check passes"); +like( + $stderr, + qr/interrupted page deletion detected/, + "bt_index_parent_check: interrupted page deletion detected"); +$rc = $replica->psql( + 'postgres', + "$debug; SELECT bt_index_check('not_leftmost_pk', true)", + stderr => \$stderr); +print STDERR $stderr, "\n"; +is($rc, 0, "bt_index_check passes"); + +done_testing(); diff --git a/contrib/amcheck/verify_heapam.c b/contrib/amcheck/verify_heapam.c index 97f3253522b1d..8290494fdc6c1 100644 --- a/contrib/amcheck/verify_heapam.c +++ b/contrib/amcheck/verify_heapam.c @@ -3,7 +3,7 @@ * verify_heapam.c * Functions to check postgresql heap relations for corruption * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * contrib/amcheck/verify_heapam.c *------------------------------------------------------------------------- @@ -43,7 +43,7 @@ typedef enum XidBoundsViolation XID_IN_FUTURE, XID_PRECEDES_CLUSTERMIN, XID_PRECEDES_RELMIN, - XID_BOUNDS_OK + XID_BOUNDS_OK, } XidBoundsViolation; typedef enum XidCommitStatus @@ -51,14 +51,14 @@ typedef enum XidCommitStatus XID_COMMITTED, XID_IS_CURRENT_XID, XID_IN_PROGRESS, - XID_ABORTED + XID_ABORTED, } XidCommitStatus; typedef enum SkipPages { SKIP_PAGES_ALL_FROZEN, SKIP_PAGES_ALL_VISIBLE, - SKIP_PAGES_NONE + SKIP_PAGES_NONE, } SkipPages; /* @@ -81,12 +81,12 @@ typedef struct ToastedAttribute typedef struct HeapCheckContext { /* - * Cached copies of values from ShmemVariableCache and computed values - * from them. + * Cached copies of values from TransamVariables and computed values from + * them. */ - FullTransactionId next_fxid; /* ShmemVariableCache->nextXid */ + FullTransactionId next_fxid; /* TransamVariables->nextXid */ TransactionId next_xid; /* 32-bit version of next_fxid */ - TransactionId oldest_xid; /* ShmemVariableCache->oldestXid */ + TransactionId oldest_xid; /* TransamVariables->oldestXid */ FullTransactionId oldest_fxid; /* 64-bit version of oldest_xid, computed * relative to next_fxid */ TransactionId safe_xmin; /* this XID and newer ones can't become @@ -1875,7 +1875,9 @@ check_tuple(HeapCheckContext *ctx, bool *xmin_commit_status_ok, /* * Convert a TransactionId into a FullTransactionId using our cached values of * the valid transaction ID range. It is the caller's responsibility to have - * already updated the cached values, if necessary. + * already updated the cached values, if necessary. This is akin to + * FullTransactionIdFromAllowableAt(), but it tolerates corruption in the form + * of an xid before epoch 0. */ static FullTransactionId FullTransactionIdFromXidAndCtx(TransactionId xid, const HeapCheckContext *ctx) @@ -1924,8 +1926,8 @@ update_cached_xid_range(HeapCheckContext *ctx) { /* Make cached copies */ LWLockAcquire(XidGenLock, LW_SHARED); - ctx->next_fxid = ShmemVariableCache->nextXid; - ctx->oldest_xid = ShmemVariableCache->oldestXid; + ctx->next_fxid = TransamVariables->nextXid; + ctx->oldest_xid = TransamVariables->oldestXid; LWLockRelease(XidGenLock); /* And compute alternate versions of the same */ @@ -2062,7 +2064,7 @@ get_xid_status(TransactionId xid, HeapCheckContext *ctx, *status = XID_COMMITTED; LWLockAcquire(XactTruncationLock, LW_SHARED); clog_horizon = - FullTransactionIdFromXidAndCtx(ShmemVariableCache->oldestClogXid, + FullTransactionIdFromXidAndCtx(TransamVariables->oldestClogXid, ctx); if (FullTransactionIdPrecedesOrEquals(clog_horizon, fxid)) { diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c index 94a9759322e43..34990c5cea3f3 100644 --- a/contrib/amcheck/verify_nbtree.c +++ b/contrib/amcheck/verify_nbtree.c @@ -14,7 +14,7 @@ * that every visible heap tuple has a matching index tuple. * * - * Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Copyright (c) 2017-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/amcheck/verify_nbtree.c @@ -23,6 +23,7 @@ */ #include "postgres.h" +#include "access/heaptoast.h" #include "access/htup_details.h" #include "access/nbtree.h" #include "access/table.h" @@ -31,6 +32,7 @@ #include "access/xact.h" #include "catalog/index.h" #include "catalog/pg_am.h" +#include "catalog/pg_opfamily_d.h" #include "commands/tablecmds.h" #include "common/pg_prng.h" #include "lib/bloomfilter.h" @@ -80,11 +82,19 @@ typedef struct BtreeCheckState bool heapallindexed; /* Also making sure non-pivot tuples can be found by new search? */ bool rootdescend; + /* Also check uniqueness constraint if index is unique */ + bool checkunique; /* Per-page context */ MemoryContext targetcontext; /* Buffer access strategy */ BufferAccessStrategy checkstrategy; + /* + * Info for uniqueness checking. Fill these fields once per index check. + */ + IndexInfo *indexinfo; + Snapshot snapshot; + /* * Mutable state, for verification of particular page: */ @@ -135,23 +145,50 @@ typedef struct BtreeLevel bool istruerootlevel; } BtreeLevel; +/* + * Information about the last visible entry with current B-tree key. Used + * for validation of the unique constraint. + */ +typedef struct BtreeLastVisibleEntry +{ + BlockNumber blkno; /* Index block */ + OffsetNumber offset; /* Offset on index block */ + int postingIndex; /* Number in the posting list (-1 for + * non-deduplicated tuples) */ + ItemPointer tid; /* Heap tid */ +} BtreeLastVisibleEntry; + PG_FUNCTION_INFO_V1(bt_index_check); PG_FUNCTION_INFO_V1(bt_index_parent_check); static void bt_index_check_internal(Oid indrelid, bool parentcheck, - bool heapallindexed, bool rootdescend); + bool heapallindexed, bool rootdescend, + bool checkunique); static inline void btree_index_checkable(Relation rel); static inline bool btree_index_mainfork_expected(Relation rel); static void bt_check_every_level(Relation rel, Relation heaprel, bool heapkeyspace, bool readonly, bool heapallindexed, - bool rootdescend); + bool rootdescend, bool checkunique); static BtreeLevel bt_check_level_from_leftmost(BtreeCheckState *state, BtreeLevel level); +static bool bt_leftmost_ignoring_half_dead(BtreeCheckState *state, + BlockNumber start, + BTPageOpaque start_opaque); static void bt_recheck_sibling_links(BtreeCheckState *state, BlockNumber btpo_prev_from_target, BlockNumber leftcurrent); +static bool heap_entry_is_visible(BtreeCheckState *state, ItemPointer tid); +static void bt_report_duplicate(BtreeCheckState *state, + BtreeLastVisibleEntry *lVis, + ItemPointer nexttid, + BlockNumber nblock, OffsetNumber noffset, + int nposting); +static void bt_entry_unique_check(BtreeCheckState *state, IndexTuple itup, + BlockNumber targetblock, OffsetNumber offset, + BtreeLastVisibleEntry *lVis); static void bt_target_page_check(BtreeCheckState *state); -static BTScanInsert bt_right_page_check_scankey(BtreeCheckState *state); +static BTScanInsert bt_right_page_check_scankey(BtreeCheckState *state, + OffsetNumber *rightfirstoffset); static void bt_child_check(BtreeCheckState *state, BTScanInsert targetkey, OffsetNumber downlinkoffnum); static void bt_child_highkey_check(BtreeCheckState *state, @@ -191,7 +228,7 @@ static inline ItemPointer BTreeTupleGetHeapTIDCareful(BtreeCheckState *state, static inline ItemPointer BTreeTupleGetPointsToTID(IndexTuple itup); /* - * bt_index_check(index regclass, heapallindexed boolean) + * bt_index_check(index regclass, heapallindexed boolean, checkunique boolean) * * Verify integrity of B-Tree index. * @@ -204,17 +241,20 @@ bt_index_check(PG_FUNCTION_ARGS) { Oid indrelid = PG_GETARG_OID(0); bool heapallindexed = false; + bool checkunique = false; - if (PG_NARGS() == 2) + if (PG_NARGS() >= 2) heapallindexed = PG_GETARG_BOOL(1); + if (PG_NARGS() == 3) + checkunique = PG_GETARG_BOOL(2); - bt_index_check_internal(indrelid, false, heapallindexed, false); + bt_index_check_internal(indrelid, false, heapallindexed, false, checkunique); PG_RETURN_VOID(); } /* - * bt_index_parent_check(index regclass, heapallindexed boolean) + * bt_index_parent_check(index regclass, heapallindexed boolean, rootdescend boolean, checkunique boolean) * * Verify integrity of B-Tree index. * @@ -228,13 +268,16 @@ bt_index_parent_check(PG_FUNCTION_ARGS) Oid indrelid = PG_GETARG_OID(0); bool heapallindexed = false; bool rootdescend = false; + bool checkunique = false; if (PG_NARGS() >= 2) heapallindexed = PG_GETARG_BOOL(1); - if (PG_NARGS() == 3) + if (PG_NARGS() >= 3) rootdescend = PG_GETARG_BOOL(2); + if (PG_NARGS() == 4) + checkunique = PG_GETARG_BOOL(3); - bt_index_check_internal(indrelid, true, heapallindexed, rootdescend); + bt_index_check_internal(indrelid, true, heapallindexed, rootdescend, checkunique); PG_RETURN_VOID(); } @@ -244,7 +287,7 @@ bt_index_parent_check(PG_FUNCTION_ARGS) */ static void bt_index_check_internal(Oid indrelid, bool parentcheck, bool heapallindexed, - bool rootdescend) + bool rootdescend, bool checkunique) { Oid heapid; Relation indrel; @@ -281,6 +324,7 @@ bt_index_check_internal(Oid indrelid, bool parentcheck, bool heapallindexed, SetUserIdAndSecContext(heaprel->rd_rel->relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); } else { @@ -338,14 +382,24 @@ bt_index_check_internal(Oid indrelid, bool parentcheck, bool heapallindexed, errmsg("index \"%s\" metapage has equalimage field set on unsupported nbtree version", RelationGetRelationName(indrel)))); if (allequalimage && !_bt_allequalimage(indrel, false)) + { + bool has_interval_ops = false; + + for (int i = 0; i < IndexRelationGetNumberOfKeyAttributes(indrel); i++) + if (indrel->rd_opfamily[i] == INTERVAL_BTREE_FAM_OID) + has_interval_ops = true; ereport(ERROR, (errcode(ERRCODE_INDEX_CORRUPTED), errmsg("index \"%s\" metapage incorrectly indicates that deduplication is safe", - RelationGetRelationName(indrel)))); + RelationGetRelationName(indrel)), + has_interval_ops + ? errhint("This is known of \"interval\" indexes last built on a version predating 2023-11.") + : 0)); + } /* Check index, possibly against table it is an index on */ bt_check_every_level(indrel, heaprel, heapkeyspace, parentcheck, - heapallindexed, rootdescend); + heapallindexed, rootdescend, checkunique); } /* Roll back any GUC changes executed by index functions */ @@ -446,7 +500,8 @@ btree_index_mainfork_expected(Relation rel) */ static void bt_check_every_level(Relation rel, Relation heaprel, bool heapkeyspace, - bool readonly, bool heapallindexed, bool rootdescend) + bool readonly, bool heapallindexed, bool rootdescend, + bool checkunique) { BtreeCheckState *state; Page metapage; @@ -478,6 +533,8 @@ bt_check_every_level(Relation rel, Relation heaprel, bool heapkeyspace, state->readonly = readonly; state->heapallindexed = heapallindexed; state->rootdescend = rootdescend; + state->checkunique = checkunique; + state->snapshot = InvalidSnapshot; if (state->heapallindexed) { @@ -535,6 +592,23 @@ bt_check_every_level(Relation rel, Relation heaprel, bool heapkeyspace, } } + /* + * We need a snapshot to check the uniqueness of the index. For better + * performance take it once per index check. If snapshot already taken + * reuse it. + */ + if (state->checkunique) + { + state->indexinfo = BuildIndexInfo(state->rel); + if (state->indexinfo->ii_Unique) + { + if (snapshot != SnapshotAny) + state->snapshot = snapshot; + else + state->snapshot = RegisterSnapshot(GetTransactionSnapshot()); + } + } + Assert(!state->rootdescend || state->readonly); if (state->rootdescend && !state->heapkeyspace) ereport(ERROR, @@ -661,6 +735,8 @@ bt_check_every_level(Relation rel, Relation heaprel, bool heapkeyspace, } /* Be tidy: */ + if (snapshot == SnapshotAny && state->snapshot != InvalidSnapshot) + UnregisterSnapshot(state->snapshot); MemoryContextDelete(state->targetcontext); } @@ -765,7 +841,7 @@ bt_check_level_from_leftmost(BtreeCheckState *state, BtreeLevel level) */ if (state->readonly) { - if (!P_LEFTMOST(opaque)) + if (!bt_leftmost_ignoring_half_dead(state, current, opaque)) ereport(ERROR, (errcode(ERRCODE_INDEX_CORRUPTED), errmsg("block %u is not leftmost in index \"%s\"", @@ -819,8 +895,16 @@ bt_check_level_from_leftmost(BtreeCheckState *state, BtreeLevel level) */ } - /* Sibling links should be in mutual agreement */ - if (opaque->btpo_prev != leftcurrent) + /* + * Sibling links should be in mutual agreement. There arises + * leftcurrent == P_NONE && btpo_prev != P_NONE when the left sibling + * of the parent's low-key downlink is half-dead. (A half-dead page + * has no downlink from its parent.) Under heavyweight locking, the + * last bt_leftmost_ignoring_half_dead() validated this btpo_prev. + * Without heavyweight locking, validation of the P_NONE case remains + * unimplemented. + */ + if (opaque->btpo_prev != leftcurrent && leftcurrent != P_NONE) bt_recheck_sibling_links(state, opaque->btpo_prev, leftcurrent); /* Check level */ @@ -901,6 +985,219 @@ bt_check_level_from_leftmost(BtreeCheckState *state, BtreeLevel level) return nextleveldown; } +/* Check visibility of the table entry referenced by nbtree index */ +static bool +heap_entry_is_visible(BtreeCheckState *state, ItemPointer tid) +{ + bool tid_visible; + + TupleTableSlot *slot = table_slot_create(state->heaprel, NULL); + + tid_visible = table_tuple_fetch_row_version(state->heaprel, + tid, state->snapshot, slot); + if (slot != NULL) + ExecDropSingleTupleTableSlot(slot); + + return tid_visible; +} + +/* + * Prepare an error message for unique constrain violation in + * a btree index and report ERROR. + */ +static void +bt_report_duplicate(BtreeCheckState *state, + BtreeLastVisibleEntry *lVis, + ItemPointer nexttid, BlockNumber nblock, OffsetNumber noffset, + int nposting) +{ + char *htid, + *nhtid, + *itid, + *nitid = "", + *pposting = "", + *pnposting = ""; + + htid = psprintf("tid=(%u,%u)", + ItemPointerGetBlockNumberNoCheck(lVis->tid), + ItemPointerGetOffsetNumberNoCheck(lVis->tid)); + nhtid = psprintf("tid=(%u,%u)", + ItemPointerGetBlockNumberNoCheck(nexttid), + ItemPointerGetOffsetNumberNoCheck(nexttid)); + itid = psprintf("tid=(%u,%u)", lVis->blkno, lVis->offset); + + if (nblock != lVis->blkno || noffset != lVis->offset) + nitid = psprintf(" tid=(%u,%u)", nblock, noffset); + + if (lVis->postingIndex >= 0) + pposting = psprintf(" posting %u", lVis->postingIndex); + + if (nposting >= 0) + pnposting = psprintf(" posting %u", nposting); + + ereport(ERROR, + (errcode(ERRCODE_INDEX_CORRUPTED), + errmsg("index uniqueness is violated for index \"%s\"", + RelationGetRelationName(state->rel)), + errdetail("Index %s%s and%s%s (point to heap %s and %s) page lsn=%X/%X.", + itid, pposting, nitid, pnposting, htid, nhtid, + LSN_FORMAT_ARGS(state->targetlsn)))); +} + +/* Check if current nbtree leaf entry complies with UNIQUE constraint */ +static void +bt_entry_unique_check(BtreeCheckState *state, IndexTuple itup, + BlockNumber targetblock, OffsetNumber offset, + BtreeLastVisibleEntry *lVis) +{ + ItemPointer tid; + bool has_visible_entry = false; + + Assert(targetblock != P_NONE); + + /* + * Current tuple has posting list. Report duplicate if TID of any posting + * list entry is visible and lVis->tid is valid. + */ + if (BTreeTupleIsPosting(itup)) + { + for (int i = 0; i < BTreeTupleGetNPosting(itup); i++) + { + tid = BTreeTupleGetPostingN(itup, i); + if (heap_entry_is_visible(state, tid)) + { + has_visible_entry = true; + if (ItemPointerIsValid(lVis->tid)) + { + bt_report_duplicate(state, + lVis, + tid, targetblock, + offset, i); + } + + /* + * Prevent double reporting unique constraint violation + * between the posting list entries of the first tuple on the + * page after cross-page check. + */ + if (lVis->blkno != targetblock && ItemPointerIsValid(lVis->tid)) + return; + + lVis->blkno = targetblock; + lVis->offset = offset; + lVis->postingIndex = i; + lVis->tid = tid; + } + } + } + + /* + * Current tuple has no posting list. If TID is visible save info about it + * for the next comparisons in the loop in bt_target_page_check(). Report + * duplicate if lVis->tid is already valid. + */ + else + { + tid = BTreeTupleGetHeapTID(itup); + if (heap_entry_is_visible(state, tid)) + { + has_visible_entry = true; + if (ItemPointerIsValid(lVis->tid)) + { + bt_report_duplicate(state, + lVis, + tid, targetblock, + offset, -1); + } + + lVis->blkno = targetblock; + lVis->offset = offset; + lVis->tid = tid; + lVis->postingIndex = -1; + } + } + + if (!has_visible_entry && + lVis->blkno != InvalidBlockNumber && + lVis->blkno != targetblock) + { + char *posting = ""; + + if (lVis->postingIndex >= 0) + posting = psprintf(" posting %u", lVis->postingIndex); + ereport(DEBUG1, + (errcode(ERRCODE_NO_DATA), + errmsg("index uniqueness can not be checked for index tid=(%u,%u) in index \"%s\"", + targetblock, offset, + RelationGetRelationName(state->rel)), + errdetail("It doesn't have visible heap tids and key is equal to the tid=(%u,%u)%s (points to heap tid=(%u,%u)).", + lVis->blkno, lVis->offset, posting, + ItemPointerGetBlockNumberNoCheck(lVis->tid), + ItemPointerGetOffsetNumberNoCheck(lVis->tid)), + errhint("VACUUM the table and repeat the check."))); + } +} + +/* + * Like P_LEFTMOST(start_opaque), but accept an arbitrarily-long chain of + * half-dead, sibling-linked pages to the left. If a half-dead page appears + * under state->readonly, the database exited recovery between the first-stage + * and second-stage WAL records of a deletion. + */ +static bool +bt_leftmost_ignoring_half_dead(BtreeCheckState *state, + BlockNumber start, + BTPageOpaque start_opaque) +{ + BlockNumber reached = start_opaque->btpo_prev, + reached_from = start; + bool all_half_dead = true; + + /* + * To handle the !readonly case, we'd need to accept BTP_DELETED pages and + * potentially observe nbtree/README "Page deletion and backwards scans". + */ + Assert(state->readonly); + + while (reached != P_NONE && all_half_dead) + { + Page page = palloc_btree_page(state, reached); + BTPageOpaque reached_opaque = BTPageGetOpaque(page); + + CHECK_FOR_INTERRUPTS(); + + /* + * Try to detect btpo_prev circular links. _bt_unlink_halfdead_page() + * writes that side-links will continue to point to the siblings. + * Check btpo_next for that property. + */ + all_half_dead = P_ISHALFDEAD(reached_opaque) && + reached != start && + reached != reached_from && + reached_opaque->btpo_next == reached_from; + if (all_half_dead) + { + XLogRecPtr pagelsn = PageGetLSN(page); + + /* pagelsn should point to an XLOG_BTREE_MARK_PAGE_HALFDEAD */ + ereport(DEBUG1, + (errcode(ERRCODE_NO_DATA), + errmsg_internal("harmless interrupted page deletion detected in index \"%s\"", + RelationGetRelationName(state->rel)), + errdetail_internal("Block=%u right block=%u page lsn=%X/%X.", + reached, reached_from, + LSN_FORMAT_ARGS(pagelsn)))); + + reached_from = reached; + reached = reached_opaque->btpo_prev; + } + + pfree(page); + } + + return all_half_dead; +} + /* * Raise an error when target page's left link does not point back to the * previous target page, called leftcurrent here. The leftcurrent page's @@ -941,6 +1238,9 @@ bt_recheck_sibling_links(BtreeCheckState *state, BlockNumber btpo_prev_from_target, BlockNumber leftcurrent) { + /* passing metapage to BTPageGetOpaque() would give irrelevant findings */ + Assert(leftcurrent != P_NONE); + if (!state->readonly) { Buffer lbuf; @@ -1055,6 +1355,9 @@ bt_recheck_sibling_links(BtreeCheckState *state, * - Various checks on the structure of tuples themselves. For example, check * that non-pivot tuples have no truncated attributes. * + * - For index with unique constraint make sure that only one of table entries + * for equal keys is visible. + * * Furthermore, when state passed shows ShareLock held, function also checks: * * - That all child pages respect strict lower bound from parent's pivot @@ -1077,6 +1380,9 @@ bt_target_page_check(BtreeCheckState *state) OffsetNumber max; BTPageOpaque topaque; + /* Last visible entry info for checking indexes with unique constraint */ + BtreeLastVisibleEntry lVis = {InvalidBlockNumber, InvalidOffsetNumber, -1, NULL}; + topaque = BTPageGetOpaque(state->target); max = PageGetMaxOffsetNumber(state->target); @@ -1467,6 +1773,44 @@ bt_target_page_check(BtreeCheckState *state) LSN_FORMAT_ARGS(state->targetlsn)))); } + /* + * If the index is unique verify entries uniqueness by checking the + * heap tuples visibility. + */ + if (state->checkunique && state->indexinfo->ii_Unique && + P_ISLEAF(topaque) && !skey->anynullkeys) + bt_entry_unique_check(state, itup, state->targetblock, offset, + &lVis); + + if (state->checkunique && state->indexinfo->ii_Unique && + P_ISLEAF(topaque) && OffsetNumberNext(offset) <= max) + { + /* Save current scankey tid */ + scantid = skey->scantid; + + /* + * Invalidate scankey tid to make _bt_compare compare only keys in + * the item to report equality even if heap TIDs are different + */ + skey->scantid = NULL; + + /* + * If next key tuple is different, invalidate last visible entry + * data (whole index tuple or last posting in index tuple). Key + * containing null value does not violate unique constraint and + * treated as different to any other key. + */ + if (_bt_compare(state->rel, skey, state->target, + OffsetNumberNext(offset)) != 0 || skey->anynullkeys) + { + lVis.blkno = InvalidBlockNumber; + lVis.offset = InvalidOffsetNumber; + lVis.postingIndex = -1; + lVis.tid = NULL; + } + skey->scantid = scantid; /* Restore saved scan key state */ + } + /* * * Last item check * * @@ -1484,12 +1828,15 @@ bt_target_page_check(BtreeCheckState *state) * available from sibling for various reasons, though (e.g., target is * the rightmost page on level). */ - else if (offset == max) + if (offset == max) { BTScanInsert rightkey; + /* first offset on a right index page (log only) */ + OffsetNumber rightfirstoffset = InvalidOffsetNumber; + /* Get item in next/right page */ - rightkey = bt_right_page_check_scankey(state); + rightkey = bt_right_page_check_scankey(state, &rightfirstoffset); if (rightkey && !invariant_g_offset(state, rightkey, max)) @@ -1523,6 +1870,60 @@ bt_target_page_check(BtreeCheckState *state) state->targetblock, offset, LSN_FORMAT_ARGS(state->targetlsn)))); } + + /* + * If index has unique constraint make sure that no more than one + * found equal items is visible. + */ + if (state->checkunique && state->indexinfo->ii_Unique && + rightkey && P_ISLEAF(topaque) && !P_RIGHTMOST(topaque)) + { + BlockNumber rightblock_number = topaque->btpo_next; + + elog(DEBUG2, "check cross page unique condition"); + + /* + * Make _bt_compare compare only index keys without heap TIDs. + * rightkey->scantid is modified destructively but it is ok + * for it is not used later. + */ + rightkey->scantid = NULL; + + /* The first key on the next page is the same */ + if (_bt_compare(state->rel, rightkey, state->target, max) == 0 && !rightkey->anynullkeys) + { + Page rightpage; + + elog(DEBUG2, "cross page equal keys"); + rightpage = palloc_btree_page(state, + rightblock_number); + topaque = BTPageGetOpaque(rightpage); + + if (P_IGNORE(topaque)) + { + pfree(rightpage); + break; + } + + if (unlikely(!P_ISLEAF(topaque))) + ereport(ERROR, + (errcode(ERRCODE_INDEX_CORRUPTED), + errmsg("right block of leaf block is non-leaf for index \"%s\"", + RelationGetRelationName(state->rel)), + errdetail_internal("Block=%u page lsn=%X/%X.", + state->targetblock, + LSN_FORMAT_ARGS(state->targetlsn)))); + + itemid = PageGetItemIdCareful(state, rightblock_number, + rightpage, + rightfirstoffset); + itup = (IndexTuple) PageGetItem(rightpage, itemid); + + bt_entry_unique_check(state, itup, rightblock_number, rightfirstoffset, &lVis); + + pfree(rightpage); + } + } } /* @@ -1568,9 +1969,11 @@ bt_target_page_check(BtreeCheckState *state) * * Note that !readonly callers must reverify that target page has not * been concurrently deleted. + * + * Save rightfirstoffset for detailed error message. */ static BTScanInsert -bt_right_page_check_scankey(BtreeCheckState *state) +bt_right_page_check_scankey(BtreeCheckState *state, OffsetNumber *rightfirstoffset) { BTPageOpaque opaque; ItemId rightitem; @@ -1737,6 +2140,7 @@ bt_right_page_check_scankey(BtreeCheckState *state) /* Return first data item (if any) */ rightitem = PageGetItemIdCareful(state, targetnext, rightpage, P_FIRSTDATAKEY(opaque)); + *rightfirstoffset = P_FIRSTDATAKEY(opaque); } else if (!P_ISLEAF(opaque) && nline >= OffsetNumberNext(P_FIRSTDATAKEY(opaque))) @@ -1924,7 +2328,8 @@ bt_child_highkey_check(BtreeCheckState *state, opaque = BTPageGetOpaque(page); /* The first page we visit at the level should be leftmost */ - if (first && !BlockNumberIsValid(state->prevrightlink) && !P_LEFTMOST(opaque)) + if (first && !BlockNumberIsValid(state->prevrightlink) && + !bt_leftmost_ignoring_half_dead(state, blkno, opaque)) ereport(ERROR, (errcode(ERRCODE_INDEX_CORRUPTED), errmsg("the first child of leftmost target page is not leftmost of its level in index \"%s\"", @@ -2556,7 +2961,7 @@ bt_normalize_tuple(BtreeCheckState *state, IndexTuple itup) TupleDesc tupleDescriptor = RelationGetDescr(state->rel); Datum normalized[INDEX_MAX_KEYS]; bool isnull[INDEX_MAX_KEYS]; - bool toast_free[INDEX_MAX_KEYS]; + bool need_free[INDEX_MAX_KEYS]; bool formnewtup = false; IndexTuple reformed; int i; @@ -2575,7 +2980,7 @@ bt_normalize_tuple(BtreeCheckState *state, IndexTuple itup) att = TupleDescAttr(tupleDescriptor, i); /* Assume untoasted/already normalized datum initially */ - toast_free[i] = false; + need_free[i] = false; normalized[i] = index_getattr(itup, att->attnum, tupleDescriptor, &isnull[i]); @@ -2594,15 +2999,48 @@ bt_normalize_tuple(BtreeCheckState *state, IndexTuple itup) ItemPointerGetBlockNumber(&(itup->t_tid)), ItemPointerGetOffsetNumber(&(itup->t_tid)), RelationGetRelationName(state->rel)))); + else if (!VARATT_IS_COMPRESSED(DatumGetPointer(normalized[i])) && + VARSIZE(DatumGetPointer(normalized[i])) > TOAST_INDEX_TARGET && + (att->attstorage == TYPSTORAGE_EXTENDED || + att->attstorage == TYPSTORAGE_MAIN)) + { + /* + * This value will be compressed by index_form_tuple() with the + * current storage settings. We may be here because this tuple + * was formed with different storage settings. So, force forming. + */ + formnewtup = true; + } else if (VARATT_IS_COMPRESSED(DatumGetPointer(normalized[i]))) { formnewtup = true; normalized[i] = PointerGetDatum(PG_DETOAST_DATUM(normalized[i])); - toast_free[i] = true; + need_free[i] = true; + } + + /* + * Short tuples may have 1B or 4B header. Convert 4B header of short + * tuples to 1B + */ + else if (VARATT_CAN_MAKE_SHORT(DatumGetPointer(normalized[i]))) + { + /* convert to short varlena */ + Size len = VARATT_CONVERTED_SHORT_SIZE(DatumGetPointer(normalized[i])); + char *data = palloc(len); + + SET_VARSIZE_SHORT(data, len); + memcpy(data + 1, VARDATA(DatumGetPointer(normalized[i])), len - 1); + + formnewtup = true; + normalized[i] = PointerGetDatum(data); + need_free[i] = true; } } - /* Easier case: Tuple has varlena datums, none of which are compressed */ + /* + * Easier case: Tuple has varlena datums, none of which are compressed or + * short with 4B header + */ if (!formnewtup) return itup; @@ -2612,6 +3050,11 @@ bt_normalize_tuple(BtreeCheckState *state, IndexTuple itup) * (normalized input datums). This is rather naive, but shouldn't be * necessary too often. * + * In the heap, tuples may contain short varlena datums with both 1B + * header and 4B headers. But the corresponding index tuple should always + * have such varlena's with 1B headers. So, if there is a short varlena + * with 4B header, we need to convert it for fingerprinting. + * * Note that we rely on deterministic index_form_tuple() TOAST compression * of normalized input. */ @@ -2620,7 +3063,7 @@ bt_normalize_tuple(BtreeCheckState *state, IndexTuple itup) /* Cannot leak memory here */ for (i = 0; i < tupleDescriptor->natts; i++) - if (toast_free[i]) + if (need_free[i]) pfree(DatumGetPointer(normalized[i])); return reformed; @@ -2694,7 +3137,7 @@ bt_rootdescend(BtreeCheckState *state, IndexTuple itup) */ Assert(state->readonly && state->rootdescend); exists = false; - stack = _bt_search(state->rel, NULL, key, &lbuf, BT_READ, NULL); + stack = _bt_search(state->rel, NULL, key, &lbuf, BT_READ); if (BufferIsValid(lbuf)) { @@ -2779,7 +3222,7 @@ invariant_l_offset(BtreeCheckState *state, BTScanInsert key, ItemId itemid; int32 cmp; - Assert(key->pivotsearch); + Assert(!key->nextkey && key->backward); /* Verify line pointer before checking tuple */ itemid = PageGetItemIdCareful(state, state->targetblock, state->target, @@ -2841,7 +3284,7 @@ invariant_leq_offset(BtreeCheckState *state, BTScanInsert key, { int32 cmp; - Assert(key->pivotsearch); + Assert(!key->nextkey && key->backward); cmp = _bt_compare(state->rel, key, state->target, upperbound); @@ -2864,7 +3307,7 @@ invariant_g_offset(BtreeCheckState *state, BTScanInsert key, { int32 cmp; - Assert(key->pivotsearch); + Assert(!key->nextkey && key->backward); cmp = _bt_compare(state->rel, key, state->target, lowerbound); @@ -2902,7 +3345,7 @@ invariant_l_nontarget_offset(BtreeCheckState *state, BTScanInsert key, ItemId itemid; int32 cmp; - Assert(key->pivotsearch); + Assert(!key->nextkey && key->backward); /* Verify line pointer before checking tuple */ itemid = PageGetItemIdCareful(state, nontargetblock, nontarget, @@ -3128,9 +3571,9 @@ palloc_btree_page(BtreeCheckState *state, BlockNumber blocknum) * For example, invariant_g_offset() might miss a cross-page invariant failure * on an internal level if the scankey built from the first item on the * target's right sibling page happened to be equal to (not greater than) the - * last item on target page. The !pivotsearch tiebreaker in _bt_compare() - * might otherwise cause amcheck to assume (rather than actually verify) that - * the scankey is greater. + * last item on target page. The !backward tiebreaker in _bt_compare() might + * otherwise cause amcheck to assume (rather than actually verify) that the + * scankey is greater. */ static inline BTScanInsert bt_mkscankey_pivotsearch(Relation rel, IndexTuple itup) @@ -3138,7 +3581,7 @@ bt_mkscankey_pivotsearch(Relation rel, IndexTuple itup) BTScanInsert skey; skey = _bt_mkscankey(rel, itup); - skey->pivotsearch = true; + skey->backward = true; return skey; } diff --git a/contrib/auth_delay/auth_delay.c b/contrib/auth_delay/auth_delay.c index 8d6e4d27781fc..ff0e1fd461bb3 100644 --- a/contrib/auth_delay/auth_delay.c +++ b/contrib/auth_delay/auth_delay.c @@ -2,7 +2,7 @@ * * auth_delay.c * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/auth_delay/auth_delay.c diff --git a/contrib/auth_delay/meson.build b/contrib/auth_delay/meson.build index f2b2da0551a16..9ef5a7091eeec 100644 --- a/contrib/auth_delay/meson.build +++ b/contrib/auth_delay/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group auth_delay_sources = files( 'auth_delay.c', diff --git a/contrib/auto_explain/auto_explain.c b/contrib/auto_explain/auto_explain.c index c3ac27ae9910d..677c135f59bc2 100644 --- a/contrib/auto_explain/auto_explain.c +++ b/contrib/auto_explain/auto_explain.c @@ -3,7 +3,7 @@ * auto_explain.c * * - * Copyright (c) 2008-2023, PostgreSQL Global Development Group + * Copyright (c) 2008-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/auto_explain/auto_explain.c @@ -396,6 +396,8 @@ explain_ExecutorEnd(QueryDesc *queryDesc) es->wal = (es->analyze && auto_explain_log_wal); es->timing = (es->analyze && auto_explain_log_timing); es->summary = es->analyze; + /* No support for MEMORY */ + /* es->memory = false; */ es->format = auto_explain_log_format; es->settings = auto_explain_log_settings; diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build index 2d5e6aa6ae15c..af1a3b8e3250e 100644 --- a/contrib/auto_explain/meson.build +++ b/contrib/auto_explain/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group auto_explain_sources = files( 'auto_explain.c', diff --git a/contrib/auto_explain/t/001_auto_explain.pl b/contrib/auto_explain/t/001_auto_explain.pl index abb422f8de691..0e5b34afa9456 100644 --- a/contrib/auto_explain/t/001_auto_explain.pl +++ b/contrib/auto_explain/t/001_auto_explain.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/contrib/basebackup_to_shell/basebackup_to_shell.c b/contrib/basebackup_to_shell/basebackup_to_shell.c index 57ed587d4888e..fe419d90806a7 100644 --- a/contrib/basebackup_to_shell/basebackup_to_shell.c +++ b/contrib/basebackup_to_shell/basebackup_to_shell.c @@ -3,7 +3,7 @@ * basebackup_to_shell.c * target base backup files to a shell command * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * contrib/basebackup_to_shell/basebackup_to_shell.c *------------------------------------------------------------------------- diff --git a/contrib/basebackup_to_shell/meson.build b/contrib/basebackup_to_shell/meson.build index a5488c30239f6..8175c9b5c5bba 100644 --- a/contrib/basebackup_to_shell/meson.build +++ b/contrib/basebackup_to_shell/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group basebackup_to_shell_sources = files( 'basebackup_to_shell.c', @@ -24,7 +24,7 @@ tests += { 'tests': [ 't/001_basic.pl', ], - 'env': {'GZIP_PROGRAM': gzip.path(), - 'TAR': tar.path()}, + 'env': {'GZIP_PROGRAM': gzip.found() ? gzip.path() : '', + 'TAR': tar.found() ? tar.path() : '' }, }, } diff --git a/contrib/basebackup_to_shell/t/001_basic.pl b/contrib/basebackup_to_shell/t/001_basic.pl index e2cdd2ecb0cc6..07cb32fdae951 100644 --- a/contrib/basebackup_to_shell/t/001_basic.pl +++ b/contrib/basebackup_to_shell/t/001_basic.pl @@ -1,7 +1,7 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/contrib/basic_archive/Makefile b/contrib/basic_archive/Makefile index 55d299d650c28..100ed81f12aeb 100644 --- a/contrib/basic_archive/Makefile +++ b/contrib/basic_archive/Makefile @@ -5,8 +5,9 @@ PGFILEDESC = "basic_archive - basic archive module" REGRESS = basic_archive REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/basic_archive/basic_archive.conf -# Disabled because these tests require "shared_preload_libraries=basic_archive", -# which typical installcheck users do not have (e.g. buildfarm clients). + +# Disabled because these tests require special configuration, which +# typical installcheck users do not have (e.g. buildfarm clients). NO_INSTALLCHECK = 1 ifdef USE_PGXS diff --git a/contrib/basic_archive/basic_archive.c b/contrib/basic_archive/basic_archive.c index 4d78c31859fa7..028cf51c25d46 100644 --- a/contrib/basic_archive/basic_archive.c +++ b/contrib/basic_archive/basic_archive.c @@ -17,7 +17,7 @@ * a file is successfully archived and then the system crashes before * a durable record of the success has been made. * - * Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/basic_archive/basic_archive.c @@ -40,26 +40,18 @@ PG_MODULE_MAGIC; -typedef struct BasicArchiveData -{ - MemoryContext context; -} BasicArchiveData; - static char *archive_directory = NULL; -static void basic_archive_startup(ArchiveModuleState *state); static bool basic_archive_configured(ArchiveModuleState *state); static bool basic_archive_file(ArchiveModuleState *state, const char *file, const char *path); -static void basic_archive_file_internal(const char *file, const char *path); static bool check_archive_directory(char **newval, void **extra, GucSource source); static bool compare_files(const char *file1, const char *file2); -static void basic_archive_shutdown(ArchiveModuleState *state); static const ArchiveModuleCallbacks basic_archive_callbacks = { - .startup_cb = basic_archive_startup, + .startup_cb = NULL, .check_configured_cb = basic_archive_configured, .archive_file_cb = basic_archive_file, - .shutdown_cb = basic_archive_shutdown + .shutdown_cb = NULL }; /* @@ -93,24 +85,6 @@ _PG_archive_module_init(void) return &basic_archive_callbacks; } -/* - * basic_archive_startup - * - * Creates the module's memory context. - */ -void -basic_archive_startup(ArchiveModuleState *state) -{ - BasicArchiveData *data; - - data = (BasicArchiveData *) MemoryContextAllocZero(TopMemoryContext, - sizeof(BasicArchiveData)); - data->context = AllocSetContextCreate(TopMemoryContext, - "basic_archive", - ALLOCSET_DEFAULT_SIZES); - state->private_data = (void *) data; -} - /* * check_archive_directory * @@ -161,7 +135,12 @@ check_archive_directory(char **newval, void **extra, GucSource source) static bool basic_archive_configured(ArchiveModuleState *state) { - return archive_directory != NULL && archive_directory[0] != '\0'; + if (archive_directory != NULL && archive_directory[0] != '\0') + return true; + + arch_module_check_errdetail("%s is not set.", + "basic_archive.archive_directory"); + return false; } /* @@ -171,74 +150,6 @@ basic_archive_configured(ArchiveModuleState *state) */ static bool basic_archive_file(ArchiveModuleState *state, const char *file, const char *path) -{ - sigjmp_buf local_sigjmp_buf; - MemoryContext oldcontext; - BasicArchiveData *data = (BasicArchiveData *) state->private_data; - MemoryContext basic_archive_context = data->context; - - /* - * We run basic_archive_file_internal() in our own memory context so that - * we can easily reset it during error recovery (thus avoiding memory - * leaks). - */ - oldcontext = MemoryContextSwitchTo(basic_archive_context); - - /* - * Since the archiver operates at the bottom of the exception stack, - * ERRORs turn into FATALs and cause the archiver process to restart. - * However, using ereport(ERROR, ...) when there are problems is easy to - * code and maintain. Therefore, we create our own exception handler to - * catch ERRORs and return false instead of restarting the archiver - * whenever there is a failure. - */ - if (sigsetjmp(local_sigjmp_buf, 1) != 0) - { - /* Since not using PG_TRY, must reset error stack by hand */ - error_context_stack = NULL; - - /* Prevent interrupts while cleaning up */ - HOLD_INTERRUPTS(); - - /* Report the error and clear ErrorContext for next time */ - EmitErrorReport(); - FlushErrorState(); - - /* Close any files left open by copy_file() or compare_files() */ - AtEOSubXact_Files(false, InvalidSubTransactionId, InvalidSubTransactionId); - - /* Reset our memory context and switch back to the original one */ - MemoryContextSwitchTo(oldcontext); - MemoryContextReset(basic_archive_context); - - /* Remove our exception handler */ - PG_exception_stack = NULL; - - /* Now we can allow interrupts again */ - RESUME_INTERRUPTS(); - - /* Report failure so that the archiver retries this file */ - return false; - } - - /* Enable our exception handler */ - PG_exception_stack = &local_sigjmp_buf; - - /* Archive the file! */ - basic_archive_file_internal(file, path); - - /* Remove our exception handler */ - PG_exception_stack = NULL; - - /* Reset our memory context and switch back to the original one */ - MemoryContextSwitchTo(oldcontext); - MemoryContextReset(basic_archive_context); - - return true; -} - -static void -basic_archive_file_internal(const char *file, const char *path) { char destination[MAXPGPATH]; char temp[MAXPGPATH + 256]; @@ -272,7 +183,7 @@ basic_archive_file_internal(const char *file, const char *path) fsync_fname(destination, false); fsync_fname(archive_directory, true); - return; + return true; } ereport(ERROR, @@ -312,6 +223,8 @@ basic_archive_file_internal(const char *file, const char *path) ereport(DEBUG1, (errmsg("archived \"%s\" via basic_archive", file))); + + return true; } /* @@ -394,35 +307,3 @@ compare_files(const char *file1, const char *file2) return ret; } - -/* - * basic_archive_shutdown - * - * Frees our allocated state. - */ -static void -basic_archive_shutdown(ArchiveModuleState *state) -{ - BasicArchiveData *data = (BasicArchiveData *) state->private_data; - MemoryContext basic_archive_context; - - /* - * If we didn't get to storing the pointer to our allocated state, we - * don't have anything to clean up. - */ - if (data == NULL) - return; - - basic_archive_context = data->context; - Assert(CurrentMemoryContext != basic_archive_context); - - if (MemoryContextIsValid(basic_archive_context)) - MemoryContextDelete(basic_archive_context); - data->context = NULL; - - /* - * Finally, free the state. - */ - pfree(data); - state->private_data = NULL; -} diff --git a/contrib/basic_archive/meson.build b/contrib/basic_archive/meson.build index bc1380e6f664e..cc2f62bf36e5a 100644 --- a/contrib/basic_archive/meson.build +++ b/contrib/basic_archive/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group basic_archive_sources = files( 'basic_archive.c', @@ -27,8 +27,8 @@ tests += { 'regress_args': [ '--temp-config', files('basic_archive.conf'), ], - # Disabled because these tests require "shared_preload_libraries=basic_archive", - # which typical runningcheck users do not have (e.g. buildfarm clients). + # Disabled because these tests require special configuration, which + # typical installcheck users do not have (e.g. buildfarm clients). 'runningcheck': false, }, } diff --git a/contrib/bloom/blcost.c b/contrib/bloom/blcost.c index 288e8edd02a1b..9b629b2c3d57e 100644 --- a/contrib/bloom/blcost.c +++ b/contrib/bloom/blcost.c @@ -3,7 +3,7 @@ * blcost.c * Cost estimate function for bloom indexes. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/bloom/blcost.c diff --git a/contrib/bloom/blinsert.c b/contrib/bloom/blinsert.c index b42b9e6c41f5d..f8a1061abb9ef 100644 --- a/contrib/bloom/blinsert.c +++ b/contrib/bloom/blinsert.c @@ -3,7 +3,7 @@ * blinsert.c * Bloom index build and insert functions. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/bloom/blinsert.c @@ -129,7 +129,7 @@ blbuild(Relation heap, Relation index, IndexInfo *indexInfo) RelationGetRelationName(index)); /* Initialize the meta page */ - BloomInitMetapage(index); + BloomInitMetapage(index, MAIN_FORKNUM); /* Initialize the bloom build state */ memset(&buildstate, 0, sizeof(buildstate)); @@ -163,31 +163,8 @@ blbuild(Relation heap, Relation index, IndexInfo *indexInfo) void blbuildempty(Relation index) { - Page metapage; - - /* Construct metapage. */ - metapage = (Page) palloc_aligned(BLCKSZ, PG_IO_ALIGN_SIZE, 0); - BloomFillMetapage(index, metapage); - - /* - * Write the page and log it. It might seem that an immediate sync would - * be sufficient to guarantee that the file exists on disk, but recovery - * itself might remove it while replaying, for example, an - * XLOG_DBASE_CREATE* or XLOG_TBLSPC_CREATE record. Therefore, we need - * this even when wal_level=minimal. - */ - PageSetChecksumInplace(metapage, BLOOM_METAPAGE_BLKNO); - smgrwrite(RelationGetSmgr(index), INIT_FORKNUM, BLOOM_METAPAGE_BLKNO, - metapage, true); - log_newpage(&(RelationGetSmgr(index))->smgr_rlocator.locator, INIT_FORKNUM, - BLOOM_METAPAGE_BLKNO, metapage, true); - - /* - * An immediate sync is required even if we xlog'd the page, because the - * write did not go through shared_buffers and therefore a concurrent - * checkpoint may have moved the redo pointer past our xlog record. - */ - smgrimmedsync(RelationGetSmgr(index), INIT_FORKNUM); + /* Initialize the meta page */ + BloomInitMetapage(index, INIT_FORKNUM); } /* diff --git a/contrib/bloom/bloom.h b/contrib/bloom/bloom.h index efdf9415d151a..83c81e640f9f6 100644 --- a/contrib/bloom/bloom.h +++ b/contrib/bloom/bloom.h @@ -3,7 +3,7 @@ * bloom.h * Header for bloom index. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/bloom/bloom.h @@ -110,12 +110,9 @@ typedef struct BloomOptions * FreeBlockNumberArray - array of block numbers sized so that metadata fill * all space in metapage. */ -typedef BlockNumber FreeBlockNumberArray[ - MAXALIGN_DOWN( - BLCKSZ - SizeOfPageHeaderData - MAXALIGN(sizeof(BloomPageOpaqueData)) - - MAXALIGN(sizeof(uint16) * 2 + sizeof(uint32) + sizeof(BloomOptions)) - ) / sizeof(BlockNumber) -]; +typedef BlockNumber FreeBlockNumberArray[MAXALIGN_DOWN(BLCKSZ - SizeOfPageHeaderData - MAXALIGN(sizeof(BloomPageOpaqueData)) + - MAXALIGN(sizeof(uint16) * 2 + sizeof(uint32) + sizeof(BloomOptions))) + / sizeof(BlockNumber)]; /* Metadata of bloom index */ typedef struct BloomMetaPageData @@ -127,7 +124,7 @@ typedef struct BloomMetaPageData FreeBlockNumberArray notFullPage; } BloomMetaPageData; -/* Magic number to distinguish bloom pages among anothers */ +/* Magic number to distinguish bloom pages from others */ #define BLOOM_MAGICK_NUMBER (0xDBAC0DED) /* Number of blocks numbers fit in BloomMetaPageData */ @@ -177,7 +174,7 @@ typedef BloomScanOpaqueData *BloomScanOpaque; /* blutils.c */ extern void initBloomState(BloomState *state, Relation index); extern void BloomFillMetapage(Relation index, Page metaPage); -extern void BloomInitMetapage(Relation index); +extern void BloomInitMetapage(Relation index, ForkNumber forknum); extern void BloomInitPage(Page page, uint16 flags); extern Buffer BloomNewBuffer(Relation index); extern void signValue(BloomState *state, BloomSignatureWord *sign, Datum value, int attno); diff --git a/contrib/bloom/blscan.c b/contrib/bloom/blscan.c index 6cc7d07164a31..6a90c7a7175c6 100644 --- a/contrib/bloom/blscan.c +++ b/contrib/bloom/blscan.c @@ -3,7 +3,7 @@ * blscan.c * Bloom index scan functions. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/bloom/blscan.c @@ -121,6 +121,7 @@ blgetbitmap(IndexScanDesc scan, TIDBitmap *tbm) */ bas = GetAccessStrategy(BAS_BULKREAD); npages = RelationGetNumberOfBlocks(scan->indexRelation); + pgstat_count_index_scan(scan->indexRelation); for (blkno = BLOOM_HEAD_BLKNO; blkno < npages; blkno++) { @@ -132,7 +133,6 @@ blgetbitmap(IndexScanDesc scan, TIDBitmap *tbm) LockBuffer(buffer, BUFFER_LOCK_SHARE); page = BufferGetPage(buffer); - TestForOldSnapshot(scan->xs_snapshot, scan->indexRelation, page); if (!PageIsNew(page) && !BloomPageIsDeleted(page)) { diff --git a/contrib/bloom/blutils.c b/contrib/bloom/blutils.c index d935ed8fbdff4..6836129c90d8e 100644 --- a/contrib/bloom/blutils.c +++ b/contrib/bloom/blutils.c @@ -3,7 +3,7 @@ * blutils.c * Bloom index utilities. * - * Portions Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1990-1993, Regents of the University of California * * IDENTIFICATION @@ -122,6 +122,7 @@ blhandler(PG_FUNCTION_ARGS) amroutine->amclusterable = false; amroutine->ampredlocks = false; amroutine->amcanparallel = false; + amroutine->amcanbuildparallel = false; amroutine->amcaninclude = false; amroutine->amusemaintenanceworkmem = false; amroutine->amparallelvacuumoptions = @@ -131,6 +132,7 @@ blhandler(PG_FUNCTION_ARGS) amroutine->ambuild = blbuild; amroutine->ambuildempty = blbuildempty; amroutine->aminsert = blinsert; + amroutine->aminsertcleanup = NULL; amroutine->ambulkdelete = blbulkdelete; amroutine->amvacuumcleanup = blvacuumcleanup; amroutine->amcanreturn = NULL; @@ -386,7 +388,7 @@ BloomNewBuffer(Relation index) } /* Must extend the file */ - buffer = ExtendBufferedRel(EB_REL(index), MAIN_FORKNUM, NULL, + buffer = ExtendBufferedRel(BMR_REL(index), MAIN_FORKNUM, NULL, EB_LOCK_FIRST); return buffer; @@ -443,7 +445,7 @@ BloomFillMetapage(Relation index, Page metaPage) * Initialize metapage for bloom index. */ void -BloomInitMetapage(Relation index) +BloomInitMetapage(Relation index, ForkNumber forknum) { Buffer metaBuffer; Page metaPage; @@ -451,9 +453,11 @@ BloomInitMetapage(Relation index) /* * Make a new page; since it is first page it should be associated with - * block number 0 (BLOOM_METAPAGE_BLKNO). + * block number 0 (BLOOM_METAPAGE_BLKNO). No need to hold the extension + * lock because there cannot be concurrent inserters yet. */ - metaBuffer = BloomNewBuffer(index); + metaBuffer = ReadBufferExtended(index, forknum, P_NEW, RBM_NORMAL, NULL); + LockBuffer(metaBuffer, BUFFER_LOCK_EXCLUSIVE); Assert(BufferGetBlockNumber(metaBuffer) == BLOOM_METAPAGE_BLKNO); /* Initialize contents of meta page */ diff --git a/contrib/bloom/blvacuum.c b/contrib/bloom/blvacuum.c index 2340d49e00a83..0998240feaff5 100644 --- a/contrib/bloom/blvacuum.c +++ b/contrib/bloom/blvacuum.c @@ -3,7 +3,7 @@ * blvacuum.c * Bloom VACUUM functions. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/bloom/blvacuum.c diff --git a/contrib/bloom/blvalidate.c b/contrib/bloom/blvalidate.c index 74bb3f894e1d4..88c5a791975c4 100644 --- a/contrib/bloom/blvalidate.c +++ b/contrib/bloom/blvalidate.c @@ -3,7 +3,7 @@ * blvalidate.c * Opclass validator for bloom. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/bloom/blvalidate.c diff --git a/contrib/bloom/expected/bloom.out b/contrib/bloom/expected/bloom.out index dae12a7d3e7e0..edc855121e12e 100644 --- a/contrib/bloom/expected/bloom.out +++ b/contrib/bloom/expected/bloom.out @@ -3,7 +3,7 @@ CREATE TABLE tst ( i int4, t text ); -INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i; +INSERT INTO tst SELECT i%10, substr(encode(sha256(i::text::bytea), 'hex'), 1, 1) FROM generate_series(1,2000) i; CREATE INDEX bloomidx ON tst USING bloom (i, t) WITH (col1 = 3); ALTER INDEX bloomidx SET (length=80); SET enable_seqscan=on; @@ -18,13 +18,13 @@ SELECT count(*) FROM tst WHERE i = 7; SELECT count(*) FROM tst WHERE t = '5'; count ------- - 112 + 126 (1 row) SELECT count(*) FROM tst WHERE i = 7 AND t = '5'; count ------- - 13 + 14 (1 row) SET enable_seqscan=off; @@ -69,17 +69,17 @@ SELECT count(*) FROM tst WHERE i = 7; SELECT count(*) FROM tst WHERE t = '5'; count ------- - 112 + 126 (1 row) SELECT count(*) FROM tst WHERE i = 7 AND t = '5'; count ------- - 13 + 14 (1 row) DELETE FROM tst; -INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i; +INSERT INTO tst SELECT i%10, substr(encode(sha256(i::text::bytea), 'hex'), 1, 1) FROM generate_series(1,2000) i; VACUUM ANALYZE tst; SELECT count(*) FROM tst WHERE i = 7; count @@ -90,18 +90,18 @@ SELECT count(*) FROM tst WHERE i = 7; SELECT count(*) FROM tst WHERE t = '5'; count ------- - 112 + 126 (1 row) SELECT count(*) FROM tst WHERE i = 7 AND t = '5'; count ------- - 13 + 14 (1 row) DELETE FROM tst WHERE i > 1 OR t = '5'; VACUUM tst; -INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i; +INSERT INTO tst SELECT i%10, substr(encode(sha256(i::text::bytea), 'hex'), 1, 1) FROM generate_series(1,2000) i; SELECT count(*) FROM tst WHERE i = 7; count ------- @@ -111,13 +111,13 @@ SELECT count(*) FROM tst WHERE i = 7; SELECT count(*) FROM tst WHERE t = '5'; count ------- - 112 + 126 (1 row) SELECT count(*) FROM tst WHERE i = 7 AND t = '5'; count ------- - 13 + 14 (1 row) VACUUM FULL tst; @@ -130,13 +130,13 @@ SELECT count(*) FROM tst WHERE i = 7; SELECT count(*) FROM tst WHERE t = '5'; count ------- - 112 + 126 (1 row) SELECT count(*) FROM tst WHERE i = 7 AND t = '5'; count ------- - 13 + 14 (1 row) -- Try an unlogged table too @@ -144,7 +144,7 @@ CREATE UNLOGGED TABLE tstu ( i int4, t text ); -INSERT INTO tstu SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i; +INSERT INTO tstu SELECT i%10, substr(encode(sha256(i::text::bytea), 'hex'), 1, 1) FROM generate_series(1,2000) i; CREATE INDEX bloomidxu ON tstu USING bloom (i, t) WITH (col2 = 4); SET enable_seqscan=off; SET enable_bitmapscan=on; @@ -188,13 +188,13 @@ SELECT count(*) FROM tstu WHERE i = 7; SELECT count(*) FROM tstu WHERE t = '5'; count ------- - 112 + 126 (1 row) SELECT count(*) FROM tstu WHERE i = 7 AND t = '5'; count ------- - 13 + 14 (1 row) RESET enable_seqscan; diff --git a/contrib/bloom/meson.build b/contrib/bloom/meson.build index 5d481a58c785e..422e39e74eab5 100644 --- a/contrib/bloom/meson.build +++ b/contrib/bloom/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group bloom_sources = files( 'blcost.c', diff --git a/contrib/bloom/sql/bloom.sql b/contrib/bloom/sql/bloom.sql index 4733e1e7050e5..fa63b301c6e4c 100644 --- a/contrib/bloom/sql/bloom.sql +++ b/contrib/bloom/sql/bloom.sql @@ -5,7 +5,7 @@ CREATE TABLE tst ( t text ); -INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i; +INSERT INTO tst SELECT i%10, substr(encode(sha256(i::text::bytea), 'hex'), 1, 1) FROM generate_series(1,2000) i; CREATE INDEX bloomidx ON tst USING bloom (i, t) WITH (col1 = 3); ALTER INDEX bloomidx SET (length=80); @@ -30,7 +30,7 @@ SELECT count(*) FROM tst WHERE t = '5'; SELECT count(*) FROM tst WHERE i = 7 AND t = '5'; DELETE FROM tst; -INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i; +INSERT INTO tst SELECT i%10, substr(encode(sha256(i::text::bytea), 'hex'), 1, 1) FROM generate_series(1,2000) i; VACUUM ANALYZE tst; SELECT count(*) FROM tst WHERE i = 7; @@ -39,7 +39,7 @@ SELECT count(*) FROM tst WHERE i = 7 AND t = '5'; DELETE FROM tst WHERE i > 1 OR t = '5'; VACUUM tst; -INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i; +INSERT INTO tst SELECT i%10, substr(encode(sha256(i::text::bytea), 'hex'), 1, 1) FROM generate_series(1,2000) i; SELECT count(*) FROM tst WHERE i = 7; SELECT count(*) FROM tst WHERE t = '5'; @@ -58,7 +58,7 @@ CREATE UNLOGGED TABLE tstu ( t text ); -INSERT INTO tstu SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,2000) i; +INSERT INTO tstu SELECT i%10, substr(encode(sha256(i::text::bytea), 'hex'), 1, 1) FROM generate_series(1,2000) i; CREATE INDEX bloomidxu ON tstu USING bloom (i, t) WITH (col2 = 4); SET enable_seqscan=off; diff --git a/contrib/bloom/t/001_wal.pl b/contrib/bloom/t/001_wal.pl index c1614e9be861c..61f5641d9e56e 100644 --- a/contrib/bloom/t/001_wal.pl +++ b/contrib/bloom/t/001_wal.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test generic xlog record work for bloom index replication. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -59,7 +59,7 @@ sub test_index_replay $node_primary->safe_psql("postgres", "CREATE EXTENSION bloom;"); $node_primary->safe_psql("postgres", "CREATE TABLE tst (i int4, t text);"); $node_primary->safe_psql("postgres", - "INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series(1,100000) i;" + "INSERT INTO tst SELECT i%10, substr(encode(sha256(i::text::bytea), 'hex'), 1, 1) FROM generate_series(1,10000) i;" ); $node_primary->safe_psql("postgres", "CREATE INDEX bloomidx ON tst USING bloom (i, t) WITH (col1 = 3);"); @@ -76,7 +76,7 @@ sub test_index_replay test_index_replay("vacuum $i"); my ($start, $end) = (100001 + ($i - 1) * 10000, 100000 + $i * 10000); $node_primary->safe_psql("postgres", - "INSERT INTO tst SELECT i%10, substr(md5(i::text), 1, 1) FROM generate_series($start,$end) i;" + "INSERT INTO tst SELECT i%10, substr(encode(sha256(i::text::bytea), 'hex'), 1, 1) FROM generate_series($start,$end) i;" ); test_index_replay("insert $i"); } diff --git a/contrib/bool_plperl/meson.build b/contrib/bool_plperl/meson.build index 8d29d33954a55..43eaa9cd77aed 100644 --- a/contrib/bool_plperl/meson.build +++ b/contrib/bool_plperl/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not perl_dep.found() subdir_done() diff --git a/contrib/btree_gin/btree_gin.c b/contrib/btree_gin/btree_gin.c index c50d68ce18605..5e27906f802b0 100644 --- a/contrib/btree_gin/btree_gin.c +++ b/contrib/btree_gin/btree_gin.c @@ -306,9 +306,8 @@ leftmostvalue_interval(void) { Interval *v = palloc(sizeof(Interval)); - v->time = DT_NOBEGIN; - v->day = 0; - v->month = 0; + INTERVAL_NOBEGIN(v); + return IntervalPGetDatum(v); } diff --git a/contrib/btree_gin/expected/interval.out b/contrib/btree_gin/expected/interval.out index 1f6ef54070eed..8bb9806650d9f 100644 --- a/contrib/btree_gin/expected/interval.out +++ b/contrib/btree_gin/expected/interval.out @@ -3,30 +3,34 @@ CREATE TABLE test_interval ( i interval ); INSERT INTO test_interval VALUES + ( '-178000000 years' ), ( '03:55:08' ), ( '04:55:08' ), ( '05:55:08' ), ( '08:55:08' ), ( '09:55:08' ), - ( '10:55:08' ) + ( '10:55:08' ), + ( '178000000 years' ) ; CREATE INDEX idx_interval ON test_interval USING gin (i); SELECT * FROM test_interval WHERE i<'08:55:08'::interval ORDER BY i; i -------------------------- + @ 178000000 years ago @ 3 hours 55 mins 8 secs @ 4 hours 55 mins 8 secs @ 5 hours 55 mins 8 secs -(3 rows) +(4 rows) SELECT * FROM test_interval WHERE i<='08:55:08'::interval ORDER BY i; i -------------------------- + @ 178000000 years ago @ 3 hours 55 mins 8 secs @ 4 hours 55 mins 8 secs @ 5 hours 55 mins 8 secs @ 8 hours 55 mins 8 secs -(4 rows) +(5 rows) SELECT * FROM test_interval WHERE i='08:55:08'::interval ORDER BY i; i @@ -40,12 +44,14 @@ SELECT * FROM test_interval WHERE i>='08:55:08'::interval ORDER BY i; @ 8 hours 55 mins 8 secs @ 9 hours 55 mins 8 secs @ 10 hours 55 mins 8 secs -(3 rows) + @ 178000000 years +(4 rows) SELECT * FROM test_interval WHERE i>'08:55:08'::interval ORDER BY i; i --------------------------- @ 9 hours 55 mins 8 secs @ 10 hours 55 mins 8 secs -(2 rows) + @ 178000000 years +(3 rows) diff --git a/contrib/btree_gin/meson.build b/contrib/btree_gin/meson.build index b529401ca176a..74c1adeebb037 100644 --- a/contrib/btree_gin/meson.build +++ b/contrib/btree_gin/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group btree_gin_sources = files( 'btree_gin.c', diff --git a/contrib/btree_gin/sql/interval.sql b/contrib/btree_gin/sql/interval.sql index e385158783370..7a2f3ac0d85f6 100644 --- a/contrib/btree_gin/sql/interval.sql +++ b/contrib/btree_gin/sql/interval.sql @@ -5,12 +5,14 @@ CREATE TABLE test_interval ( ); INSERT INTO test_interval VALUES + ( '-178000000 years' ), ( '03:55:08' ), ( '04:55:08' ), ( '05:55:08' ), ( '08:55:08' ), ( '09:55:08' ), - ( '10:55:08' ) + ( '10:55:08' ), + ( '178000000 years' ) ; CREATE INDEX idx_interval ON test_interval USING gin (i); diff --git a/contrib/btree_gist/Makefile b/contrib/btree_gist/Makefile index 48997c75f633c..073dcc745c4d3 100644 --- a/contrib/btree_gist/Makefile +++ b/contrib/btree_gist/Makefile @@ -38,7 +38,7 @@ PGFILEDESC = "btree_gist - B-tree equivalent GiST operator classes" REGRESS = init int2 int4 int8 float4 float8 cash oid timestamp timestamptz \ time timetz date interval macaddr macaddr8 inet cidr text varchar char \ - bytea bit varbit numeric uuid not_equal enum bool + bytea bit varbit numeric uuid not_equal enum bool partitions SHLIB_LINK += $(filter -lm, $(LIBS)) diff --git a/contrib/btree_gist/btree_gist.h b/contrib/btree_gist/btree_gist.h index f22f14ac4ca14..0db8522c8a764 100644 --- a/contrib/btree_gist/btree_gist.h +++ b/contrib/btree_gist/btree_gist.h @@ -35,7 +35,7 @@ enum gbtree_type gbt_t_bool, gbt_t_inet, gbt_t_uuid, - gbt_t_enum + gbt_t_enum, }; #endif diff --git a/contrib/btree_gist/expected/partitions.out b/contrib/btree_gist/expected/partitions.out new file mode 100644 index 0000000000000..5bddb91587106 --- /dev/null +++ b/contrib/btree_gist/expected/partitions.out @@ -0,0 +1,82 @@ +-- Make sure we can create an exclusion constraint +-- across a partitioned table. +-- That code looks at strategy numbers that can differ in regular gist vs btree_gist, +-- so we want to make sure it works here too. +create table parttmp ( + id int, + valid_at daterange, + exclude using gist (id with =, valid_at with &&) +) partition by range (id); +create table parttmp_1_to_10 partition of parttmp for values from (1) to (10); +create table parttmp_11_to_20 partition of parttmp for values from (11) to (20); +insert into parttmp (id, valid_at) values + (1, '[2000-01-01, 2000-02-01)'), + (1, '[2000-02-01, 2000-03-01)'), + (2, '[2000-01-01, 2000-02-01)'), + (11, '[2000-01-01, 2000-02-01)'), + (11, '[2000-02-01, 2000-03-01)'), + (12, '[2000-01-01, 2000-02-01)'); +select * from parttmp order by id, valid_at; + id | valid_at +----+------------------------- + 1 | [01-01-2000,02-01-2000) + 1 | [02-01-2000,03-01-2000) + 2 | [01-01-2000,02-01-2000) + 11 | [01-01-2000,02-01-2000) + 11 | [02-01-2000,03-01-2000) + 12 | [01-01-2000,02-01-2000) +(6 rows) + +select * from parttmp_1_to_10 order by id, valid_at; + id | valid_at +----+------------------------- + 1 | [01-01-2000,02-01-2000) + 1 | [02-01-2000,03-01-2000) + 2 | [01-01-2000,02-01-2000) +(3 rows) + +select * from parttmp_11_to_20 order by id, valid_at; + id | valid_at +----+------------------------- + 11 | [01-01-2000,02-01-2000) + 11 | [02-01-2000,03-01-2000) + 12 | [01-01-2000,02-01-2000) +(3 rows) + +update parttmp set valid_at = valid_at * '[2000-01-15,2000-02-15)' where id = 1; +select * from parttmp order by id, valid_at; + id | valid_at +----+------------------------- + 1 | [01-15-2000,02-01-2000) + 1 | [02-01-2000,02-15-2000) + 2 | [01-01-2000,02-01-2000) + 11 | [01-01-2000,02-01-2000) + 11 | [02-01-2000,03-01-2000) + 12 | [01-01-2000,02-01-2000) +(6 rows) + +select * from parttmp_1_to_10 order by id, valid_at; + id | valid_at +----+------------------------- + 1 | [01-15-2000,02-01-2000) + 1 | [02-01-2000,02-15-2000) + 2 | [01-01-2000,02-01-2000) +(3 rows) + +select * from parttmp_11_to_20 order by id, valid_at; + id | valid_at +----+------------------------- + 11 | [01-01-2000,02-01-2000) + 11 | [02-01-2000,03-01-2000) + 12 | [01-01-2000,02-01-2000) +(3 rows) + +-- make sure the excluson constraint excludes: +insert into parttmp (id, valid_at) values + (2, '[2000-01-15, 2000-02-01)'); +ERROR: conflicting key value violates exclusion constraint "parttmp_1_to_10_id_valid_at_excl" +DETAIL: Key (id, valid_at)=(2, [01-15-2000,02-01-2000)) conflicts with existing key (id, valid_at)=(2, [01-01-2000,02-01-2000)). +drop table parttmp; +-- should fail with a good error message: +create table parttmp (id int, valid_at daterange, exclude using gist (id with <>, valid_at with &&)) partition by range (id); +ERROR: cannot match partition key to index on column "id" using non-equal operator "<>" diff --git a/contrib/btree_gist/meson.build b/contrib/btree_gist/meson.build index 5811026301a21..c88a6ac84aeff 100644 --- a/contrib/btree_gist/meson.build +++ b/contrib/btree_gist/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group btree_gist_sources = files( 'btree_bit.c', @@ -88,6 +88,7 @@ tests += { 'not_equal', 'enum', 'bool', + 'partitions', ], }, } diff --git a/contrib/btree_gist/sql/partitions.sql b/contrib/btree_gist/sql/partitions.sql new file mode 100644 index 0000000000000..6265c10121fdd --- /dev/null +++ b/contrib/btree_gist/sql/partitions.sql @@ -0,0 +1,39 @@ +-- Make sure we can create an exclusion constraint +-- across a partitioned table. +-- That code looks at strategy numbers that can differ in regular gist vs btree_gist, +-- so we want to make sure it works here too. +create table parttmp ( + id int, + valid_at daterange, + exclude using gist (id with =, valid_at with &&) +) partition by range (id); + +create table parttmp_1_to_10 partition of parttmp for values from (1) to (10); +create table parttmp_11_to_20 partition of parttmp for values from (11) to (20); + +insert into parttmp (id, valid_at) values + (1, '[2000-01-01, 2000-02-01)'), + (1, '[2000-02-01, 2000-03-01)'), + (2, '[2000-01-01, 2000-02-01)'), + (11, '[2000-01-01, 2000-02-01)'), + (11, '[2000-02-01, 2000-03-01)'), + (12, '[2000-01-01, 2000-02-01)'); + +select * from parttmp order by id, valid_at; +select * from parttmp_1_to_10 order by id, valid_at; +select * from parttmp_11_to_20 order by id, valid_at; + +update parttmp set valid_at = valid_at * '[2000-01-15,2000-02-15)' where id = 1; + +select * from parttmp order by id, valid_at; +select * from parttmp_1_to_10 order by id, valid_at; +select * from parttmp_11_to_20 order by id, valid_at; + +-- make sure the excluson constraint excludes: +insert into parttmp (id, valid_at) values + (2, '[2000-01-15, 2000-02-01)'); + +drop table parttmp; + +-- should fail with a good error message: +create table parttmp (id int, valid_at daterange, exclude using gist (id with <>, valid_at with &&)) partition by range (id); diff --git a/contrib/citext/expected/citext.out b/contrib/citext/expected/citext.out index 1c55598136324..8c0bf54f0f34f 100644 --- a/contrib/citext/expected/citext.out +++ b/contrib/citext/expected/citext.out @@ -1744,15 +1744,6 @@ SELECT ltrim('zzzytrim'::citext, 'xyz'::text ) = 'trim' AS t; t (1 row) -SELECT md5( name ) = md5( name::text ) AS t FROM srt; - t ---- - t - t - t - t -(4 rows) - -- pg_client_encoding() takes no args and returns name. SELECT quote_ident( name ) = quote_ident( name::text ) AS t FROM srt; t diff --git a/contrib/citext/expected/citext_1.out b/contrib/citext/expected/citext_1.out index 4a979d7a0d99c..c5e5f180f2b94 100644 --- a/contrib/citext/expected/citext_1.out +++ b/contrib/citext/expected/citext_1.out @@ -1744,15 +1744,6 @@ SELECT ltrim('zzzytrim'::citext, 'xyz'::text ) = 'trim' AS t; t (1 row) -SELECT md5( name ) = md5( name::text ) AS t FROM srt; - t ---- - t - t - t - t -(4 rows) - -- pg_client_encoding() takes no args and returns name. SELECT quote_ident( name ) = quote_ident( name::text ) AS t FROM srt; t diff --git a/contrib/citext/expected/citext_utf8.out b/contrib/citext/expected/citext_utf8.out index 6630e09a4de95..19538db674e66 100644 --- a/contrib/citext/expected/citext_utf8.out +++ b/contrib/citext/expected/citext_utf8.out @@ -2,12 +2,15 @@ * This test must be run in a database with UTF-8 encoding * and a Unicode-aware locale. * - * Also disable this file for ICU, because the test for the the + * Also disable this file for ICU, because the test for the * Turkish dotted I is not correct for many ICU locales. citext always * uses the default collation, so it's not easy to restrict the test * to the "tr-TR-x-icu" collation where it will succeed. + * + * Also disable for Windows. It fails similarly, at least in some locales. */ SELECT getdatabaseencoding() <> 'UTF8' OR + version() ~ '(Visual C\+\+|mingw32|windows)' OR (SELECT (datlocprovider = 'c' AND datctype = 'C') OR datlocprovider = 'i' FROM pg_database WHERE datname=current_database()) diff --git a/contrib/citext/expected/citext_utf8_1.out b/contrib/citext/expected/citext_utf8_1.out index 3caa7a00d4224..874ec8519e13a 100644 --- a/contrib/citext/expected/citext_utf8_1.out +++ b/contrib/citext/expected/citext_utf8_1.out @@ -2,12 +2,15 @@ * This test must be run in a database with UTF-8 encoding * and a Unicode-aware locale. * - * Also disable this file for ICU, because the test for the the + * Also disable this file for ICU, because the test for the * Turkish dotted I is not correct for many ICU locales. citext always * uses the default collation, so it's not easy to restrict the test * to the "tr-TR-x-icu" collation where it will succeed. + * + * Also disable for Windows. It fails similarly, at least in some locales. */ SELECT getdatabaseencoding() <> 'UTF8' OR + version() ~ '(Visual C\+\+|mingw32|windows)' OR (SELECT (datlocprovider = 'c' AND datctype = 'C') OR datlocprovider = 'i' FROM pg_database WHERE datname=current_database()) diff --git a/contrib/citext/meson.build b/contrib/citext/meson.build index b9bc2437344ea..9770ab3ac6464 100644 --- a/contrib/citext/meson.build +++ b/contrib/citext/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group citext_sources = files( 'citext.c', diff --git a/contrib/citext/sql/citext.sql b/contrib/citext/sql/citext.sql index b329253d379f8..aa1cf9abd5cd9 100644 --- a/contrib/citext/sql/citext.sql +++ b/contrib/citext/sql/citext.sql @@ -574,7 +574,6 @@ SELECT ltrim('zzzytrim'::citext, 'xyz'::citext) = 'trim' AS t; SELECT ltrim('zzzytrim'::text, 'xyz'::citext) = 'trim' AS t; SELECT ltrim('zzzytrim'::citext, 'xyz'::text ) = 'trim' AS t; -SELECT md5( name ) = md5( name::text ) AS t FROM srt; -- pg_client_encoding() takes no args and returns name. SELECT quote_ident( name ) = quote_ident( name::text ) AS t FROM srt; SELECT quote_literal( name ) = quote_literal( name::text ) AS t FROM srt; diff --git a/contrib/citext/sql/citext_utf8.sql b/contrib/citext/sql/citext_utf8.sql index 1f51df134bf68..ba28332079769 100644 --- a/contrib/citext/sql/citext_utf8.sql +++ b/contrib/citext/sql/citext_utf8.sql @@ -2,13 +2,16 @@ * This test must be run in a database with UTF-8 encoding * and a Unicode-aware locale. * - * Also disable this file for ICU, because the test for the the + * Also disable this file for ICU, because the test for the * Turkish dotted I is not correct for many ICU locales. citext always * uses the default collation, so it's not easy to restrict the test * to the "tr-TR-x-icu" collation where it will succeed. + * + * Also disable for Windows. It fails similarly, at least in some locales. */ SELECT getdatabaseencoding() <> 'UTF8' OR + version() ~ '(Visual C\+\+|mingw32|windows)' OR (SELECT (datlocprovider = 'c' AND datctype = 'C') OR datlocprovider = 'i' FROM pg_database WHERE datname=current_database()) diff --git a/contrib/cube/Makefile b/contrib/cube/Makefile index 4fd19aac359fa..dfb0d806e4b97 100644 --- a/contrib/cube/Makefile +++ b/contrib/cube/Makefile @@ -18,6 +18,8 @@ REGRESS = cube cube_sci SHLIB_LINK += $(filter -lm, $(LIBS)) +EXTRA_CLEAN = cubeparse.h cubeparse.c cubescan.c + ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) @@ -37,8 +39,3 @@ cubeparse.c: BISONFLAGS += -d # Force these dependencies to be known even without dependency info built: cubeparse.o cubescan.o: cubeparse.h - -distprep: cubeparse.c cubescan.c - -maintainer-clean: - rm -f cubeparse.h cubeparse.c cubescan.c diff --git a/contrib/cube/cubescan.l b/contrib/cube/cubescan.l index 49cb69921653f..a30fbfc3111a2 100644 --- a/contrib/cube/cubescan.l +++ b/contrib/cube/cubescan.l @@ -63,7 +63,7 @@ NaN [nN][aA][nN] \( cube_yylval = "("; return O_PAREN; \) cube_yylval = ")"; return C_PAREN; \, cube_yylval = ","; return COMMA; -[ \t\n\r\f]+ /* discard spaces */ +[ \t\n\r\f\v]+ /* discard spaces */ . return yytext[0]; /* alert parser of the garbage */ %% diff --git a/contrib/cube/meson.build b/contrib/cube/meson.build index 80ad5160b4b87..21b6f9c43ad90 100644 --- a/contrib/cube/meson.build +++ b/contrib/cube/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group cube_sources = files( 'cube.c', diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index 1ff65d1e52118..755293456fff6 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -9,7 +9,7 @@ * Shridhar Daithankar * * contrib/dblink/dblink.c - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * ALL RIGHTS RESERVED; * * Permission to use, copy, modify, and distribute this software and its @@ -61,6 +61,7 @@ #include "utils/memutils.h" #include "utils/rel.h" #include "utils/varlena.h" +#include "utils/wait_event.h" PG_MODULE_MAGIC; @@ -130,6 +131,11 @@ static void restoreLocalGucs(int nestlevel); static remoteConn *pconn = NULL; static HTAB *remoteConnHash = NULL; +/* custom wait event values, retrieved from shared memory */ +static uint32 dblink_we_connect = 0; +static uint32 dblink_we_get_conn = 0; +static uint32 dblink_we_get_result = 0; + /* * Following is list that holds multiple remote connections. * Calling convention of each dblink function changes to accept @@ -202,8 +208,12 @@ dblink_get_conn(char *conname_or_str, connstr = conname_or_str; dblink_connstr_check(connstr); + /* first time, allocate or get the custom wait event */ + if (dblink_we_get_conn == 0) + dblink_we_get_conn = WaitEventExtensionNew("DblinkGetConnect"); + /* OK to make connection */ - conn = libpqsrv_connect(connstr, PG_WAIT_EXTENSION); + conn = libpqsrv_connect(connstr, dblink_we_get_conn); if (PQstatus(conn) == CONNECTION_BAD) { @@ -244,6 +254,9 @@ dblink_init(void) { if (!pconn) { + if (dblink_we_get_result == 0) + dblink_we_get_result = WaitEventExtensionNew("DblinkGetResult"); + pconn = (remoteConn *) MemoryContextAlloc(TopMemoryContext, sizeof(remoteConn)); pconn->conn = NULL; pconn->openCursorCount = 0; @@ -292,8 +305,12 @@ dblink_connect(PG_FUNCTION_ARGS) /* check password in connection string if not superuser */ dblink_connstr_check(connstr); + /* first time, allocate or get the custom wait event */ + if (dblink_we_connect == 0) + dblink_we_connect = WaitEventExtensionNew("DblinkConnect"); + /* OK to make connection */ - conn = libpqsrv_connect(connstr, PG_WAIT_EXTENSION); + conn = libpqsrv_connect(connstr, dblink_we_connect); if (PQstatus(conn) == CONNECTION_BAD) { @@ -430,7 +447,7 @@ dblink_open(PG_FUNCTION_ARGS) /* If we are not in a transaction, start one */ if (PQtransactionStatus(conn) == PQTRANS_IDLE) { - res = PQexec(conn, "BEGIN"); + res = libpqsrv_exec(conn, "BEGIN", dblink_we_get_result); if (PQresultStatus(res) != PGRES_COMMAND_OK) dblink_res_internalerror(conn, res, "begin error"); PQclear(res); @@ -449,7 +466,7 @@ dblink_open(PG_FUNCTION_ARGS) (rconn->openCursorCount)++; appendStringInfo(&buf, "DECLARE %s CURSOR FOR %s", curname, sql); - res = PQexec(conn, buf.data); + res = libpqsrv_exec(conn, buf.data, dblink_we_get_result); if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) { dblink_res_error(conn, conname, res, fail, @@ -518,7 +535,7 @@ dblink_close(PG_FUNCTION_ARGS) appendStringInfo(&buf, "CLOSE %s", curname); /* close the cursor */ - res = PQexec(conn, buf.data); + res = libpqsrv_exec(conn, buf.data, dblink_we_get_result); if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) { dblink_res_error(conn, conname, res, fail, @@ -538,7 +555,7 @@ dblink_close(PG_FUNCTION_ARGS) { rconn->newXactForCursor = false; - res = PQexec(conn, "COMMIT"); + res = libpqsrv_exec(conn, "COMMIT", dblink_we_get_result); if (PQresultStatus(res) != PGRES_COMMAND_OK) dblink_res_internalerror(conn, res, "commit error"); PQclear(res); @@ -620,7 +637,7 @@ dblink_fetch(PG_FUNCTION_ARGS) * PGresult will be long-lived even though we are still in a short-lived * memory context. */ - res = PQexec(conn, buf.data); + res = libpqsrv_exec(conn, buf.data, dblink_we_get_result); if (!res || (PQresultStatus(res) != PGRES_COMMAND_OK && PQresultStatus(res) != PGRES_TUPLES_OK)) @@ -768,7 +785,7 @@ dblink_record_internal(FunctionCallInfo fcinfo, bool is_async) else { /* async result retrieval, do it the old way */ - PGresult *res = PQgetResult(conn); + PGresult *res = libpqsrv_get_result(conn, dblink_we_get_result); /* NULL means we're all done with the async results */ if (res) @@ -1076,7 +1093,8 @@ materializeQueryResult(FunctionCallInfo fcinfo, PQclear(sinfo.last_res); PQclear(sinfo.cur_res); /* and clear out any pending data in libpq */ - while ((res = PQgetResult(conn)) != NULL) + while ((res = libpqsrv_get_result(conn, dblink_we_get_result)) != + NULL) PQclear(res); PG_RE_THROW(); } @@ -1103,7 +1121,7 @@ storeQueryResult(volatile storeInfo *sinfo, PGconn *conn, const char *sql) { CHECK_FOR_INTERRUPTS(); - sinfo->cur_res = PQgetResult(conn); + sinfo->cur_res = libpqsrv_get_result(conn, dblink_we_get_result); if (!sinfo->cur_res) break; @@ -1328,22 +1346,19 @@ PG_FUNCTION_INFO_V1(dblink_cancel_query); Datum dblink_cancel_query(PG_FUNCTION_ARGS) { - int res; PGconn *conn; - PGcancel *cancel; - char errbuf[256]; + const char *msg; + TimestampTz endtime; dblink_init(); conn = dblink_get_named_conn(text_to_cstring(PG_GETARG_TEXT_PP(0))); - cancel = PQgetCancel(conn); + endtime = TimestampTzPlusMilliseconds(GetCurrentTimestamp(), + 30000); + msg = libpqsrv_cancel(conn, endtime); + if (msg == NULL) + msg = "OK"; - res = PQcancel(cancel, errbuf, 256); - PQfreeCancel(cancel); - - if (res == 1) - PG_RETURN_TEXT_P(cstring_to_text("OK")); - else - PG_RETURN_TEXT_P(cstring_to_text(errbuf)); + PG_RETURN_TEXT_P(cstring_to_text(msg)); } @@ -1431,7 +1446,7 @@ dblink_exec(PG_FUNCTION_ARGS) if (!conn) dblink_conn_not_avail(conname); - res = PQexec(conn, sql); + res = libpqsrv_exec(conn, sql, dblink_we_get_result); if (!res || (PQresultStatus(res) != PGRES_COMMAND_OK && PQresultStatus(res) != PGRES_TUPLES_OK)) @@ -2562,7 +2577,6 @@ createNewConnection(const char *name, remoteConn *rconn) } hentry->rconn = rconn; - strlcpy(hentry->name, name, sizeof(hentry->name)); } static void @@ -2728,8 +2742,8 @@ dblink_res_error(PGconn *conn, const char *conname, PGresult *res, /* * If we don't get a message from the PGresult, try the PGconn. This is - * needed because for connection-level failures, PQexec may just return - * NULL, not a PGresult at all. + * needed because for connection-level failures, PQgetResult may just + * return NULL, not a PGresult at all. */ if (message_primary == NULL) message_primary = pchomp(PQerrorMessage(conn)); diff --git a/contrib/dblink/meson.build b/contrib/dblink/meson.build index 4c288ce5ff839..45eeb58c6186b 100644 --- a/contrib/dblink/meson.build +++ b/contrib/dblink/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group dblink_sources = files( 'dblink.c', diff --git a/contrib/dict_int/dict_int.c b/contrib/dict_int/dict_int.c index e44b8eead7fa3..82f3c60251251 100644 --- a/contrib/dict_int/dict_int.c +++ b/contrib/dict_int/dict_int.c @@ -3,7 +3,7 @@ * dict_int.c * Text search dictionary for integers * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/dict_int/dict_int.c diff --git a/contrib/dict_int/meson.build b/contrib/dict_int/meson.build index dcf601d7d7008..97bc0aaf1dbe1 100644 --- a/contrib/dict_int/meson.build +++ b/contrib/dict_int/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group dict_int_sources = files( 'dict_int.c', diff --git a/contrib/dict_xsyn/dict_xsyn.c b/contrib/dict_xsyn/dict_xsyn.c index e538928aba424..62d2d841417ca 100644 --- a/contrib/dict_xsyn/dict_xsyn.c +++ b/contrib/dict_xsyn/dict_xsyn.c @@ -3,7 +3,7 @@ * dict_xsyn.c * Extended synonym dictionary * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/dict_xsyn/dict_xsyn.c diff --git a/contrib/dict_xsyn/meson.build b/contrib/dict_xsyn/meson.build index 83bce52b591bc..12d41d30a7b74 100644 --- a/contrib/dict_xsyn/meson.build +++ b/contrib/dict_xsyn/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group dict_xsyn_sources = files( 'dict_xsyn.c', diff --git a/contrib/earthdistance/Makefile b/contrib/earthdistance/Makefile index f93b7a925a290..0cf3fa379a27d 100644 --- a/contrib/earthdistance/Makefile +++ b/contrib/earthdistance/Makefile @@ -3,7 +3,8 @@ MODULES = earthdistance EXTENSION = earthdistance -DATA = earthdistance--1.1.sql earthdistance--1.0--1.1.sql +DATA = earthdistance--1.1.sql earthdistance--1.0--1.1.sql \ + earthdistance--1.1--1.2.sql PGFILEDESC = "earthdistance - calculate distances on the surface of the Earth" REGRESS = earthdistance diff --git a/contrib/earthdistance/earthdistance--1.1--1.2.sql b/contrib/earthdistance/earthdistance--1.1--1.2.sql new file mode 100644 index 0000000000000..40a0ce233d17c --- /dev/null +++ b/contrib/earthdistance/earthdistance--1.1--1.2.sql @@ -0,0 +1,73 @@ +/* contrib/earthdistance/earthdistance--1.1--1.2.sql */ + +-- complain if script is sourced in psql, rather than via ALTER EXTENSION +\echo Use "ALTER EXTENSION earthdistance UPDATE TO '1.2'" to load this file. \quit + +CREATE OR REPLACE FUNCTION earth() RETURNS float8 +LANGUAGE SQL IMMUTABLE PARALLEL SAFE +RETURN '6378168'::float8; + +CREATE OR REPLACE FUNCTION sec_to_gc(float8) +RETURNS float8 +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN CASE + WHEN $1 < '0'::float8 THEN '0'::float8 + WHEN $1 / ('2'::float8 * earth()) > '1'::float8 THEN pi() * earth() + ELSE '2'::float8 * earth() * asin($1 / ('2'::float8 * earth())) +END; + +CREATE OR REPLACE FUNCTION gc_to_sec(float8) +RETURNS float8 +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN CASE + WHEN $1 < '0'::float8 THEN '0'::float8 + WHEN $1 / earth() > pi() THEN '2'::float8 * earth() + ELSE '2'::float8 * earth() * sin($1 / ('2'::float8 * earth())) +END; + +CREATE OR REPLACE FUNCTION ll_to_earth(float8, float8) +RETURNS earth +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN @extschema:cube@.cube(@extschema:cube@.cube(@extschema:cube@.cube( + earth() * cos(radians($1)) * cos(radians($2))), + earth() * cos(radians($1)) * sin(radians($2))), + earth() * sin(radians($1)))::earth; + +CREATE OR REPLACE FUNCTION latitude(earth) +RETURNS float8 +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN CASE + WHEN @extschema:cube@.cube_ll_coord($1, 3) / earth() < '-1'::float8 THEN '-90'::float8 + WHEN @extschema:cube@.cube_ll_coord($1, 3) / earth() > '1'::float8 THEN '90'::float8 + ELSE degrees(asin(@extschema:cube@.cube_ll_coord($1, 3) / earth())) +END; + +CREATE OR REPLACE FUNCTION longitude(earth) +RETURNS float8 +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN degrees(atan2(@extschema:cube@.cube_ll_coord($1, 2), + @extschema:cube@.cube_ll_coord($1, 1))); + +CREATE OR REPLACE FUNCTION earth_distance(earth, earth) +RETURNS float8 +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN sec_to_gc(@extschema:cube@.cube_distance($1, $2)); + +CREATE OR REPLACE FUNCTION earth_box(earth, float8) +RETURNS @extschema:cube@.cube +LANGUAGE SQL +IMMUTABLE STRICT +PARALLEL SAFE +RETURN @extschema:cube@.cube_enlarge($1, gc_to_sec($2), 3); diff --git a/contrib/earthdistance/earthdistance--1.1.sql b/contrib/earthdistance/earthdistance--1.1.sql index 9ef20ab848c51..4799f03e3ea3d 100644 --- a/contrib/earthdistance/earthdistance--1.1.sql +++ b/contrib/earthdistance/earthdistance--1.1.sql @@ -27,10 +27,10 @@ AS 'SELECT ''6378168''::float8'; -- and that the point must be very near the surface of the sphere -- centered about the origin with the radius of the earth. -CREATE DOMAIN earth AS cube - CONSTRAINT not_point check(cube_is_point(value)) - CONSTRAINT not_3d check(cube_dim(value) <= 3) - CONSTRAINT on_surface check(abs(cube_distance(value, '(0)'::cube) / +CREATE DOMAIN earth AS @extschema:cube@.cube + CONSTRAINT not_point CHECK(@extschema:cube@.cube_is_point(VALUE)) + CONSTRAINT not_3d CHECK(@extschema:cube@.cube_dim(VALUE) <= 3) + CONSTRAINT on_surface CHECK(abs(@extschema:cube@.cube_distance(VALUE, '(0)'::@extschema:cube@.cube) / earth() - '1'::float8) < '10e-7'::float8); CREATE FUNCTION sec_to_gc(float8) diff --git a/contrib/earthdistance/earthdistance.control b/contrib/earthdistance/earthdistance.control index 5816d22cdd988..de2465d487e2e 100644 --- a/contrib/earthdistance/earthdistance.control +++ b/contrib/earthdistance/earthdistance.control @@ -1,6 +1,6 @@ # earthdistance extension comment = 'calculate great-circle distances on the surface of the Earth' -default_version = '1.1' +default_version = '1.2' module_pathname = '$libdir/earthdistance' relocatable = true requires = 'cube' diff --git a/contrib/earthdistance/meson.build b/contrib/earthdistance/meson.build index 05794b3fe5c49..be63bf577c30a 100644 --- a/contrib/earthdistance/meson.build +++ b/contrib/earthdistance/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group earthdistance_sources = files( 'earthdistance.c', @@ -20,6 +20,7 @@ install_data( 'earthdistance.control', 'earthdistance--1.0--1.1.sql', 'earthdistance--1.1.sql', + 'earthdistance--1.1--1.2.sql', kwargs: contrib_data_args, ) diff --git a/contrib/file_fdw/expected/file_fdw.out b/contrib/file_fdw/expected/file_fdw.out index 72304e0ff321b..86c148a86ba3a 100644 --- a/contrib/file_fdw/expected/file_fdw.out +++ b/contrib/file_fdw/expected/file_fdw.out @@ -51,23 +51,23 @@ CREATE USER MAPPING FOR regress_no_priv_user SERVER file_server; CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'xml'); -- ERROR ERROR: COPY format "xml" not recognized CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', quote ':'); -- ERROR -ERROR: COPY quote available only in CSV mode +ERROR: COPY QUOTE requires CSV mode CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', escape ':'); -- ERROR -ERROR: COPY escape available only in CSV mode +ERROR: COPY ESCAPE requires CSV mode CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'binary', header 'true'); -- ERROR ERROR: cannot specify HEADER in BINARY mode CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'binary', quote ':'); -- ERROR -ERROR: COPY quote available only in CSV mode +ERROR: COPY QUOTE requires CSV mode CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'binary', escape ':'); -- ERROR -ERROR: COPY escape available only in CSV mode +ERROR: COPY ESCAPE requires CSV mode CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', delimiter 'a'); -- ERROR ERROR: COPY delimiter cannot be "a" CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', escape '-'); -- ERROR -ERROR: COPY escape available only in CSV mode +ERROR: COPY ESCAPE requires CSV mode CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', quote '-', null '=-='); -- ERROR ERROR: CSV quote character must not appear in the NULL specification CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', delimiter '-', null '=-='); -- ERROR -ERROR: COPY delimiter must not appear in the NULL specification +ERROR: COPY delimiter character must not appear in the NULL specification CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', delimiter '-', quote '-'); -- ERROR ERROR: COPY delimiter and quote must be different CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'csv', delimiter '---'); -- ERROR @@ -138,7 +138,7 @@ CREATE FOREIGN TABLE text_csv ( ) SERVER file_server OPTIONS (format 'text', filename :'filename', null 'NULL'); SELECT * FROM text_csv; -- ERROR -ERROR: COPY force not null available only in CSV mode +ERROR: COPY FORCE_NOT_NULL requires CSV mode ALTER FOREIGN TABLE text_csv OPTIONS (SET format 'csv'); \pset null _null_ SELECT * FROM text_csv; diff --git a/contrib/file_fdw/file_fdw.c b/contrib/file_fdw/file_fdw.c index 9e330b99347ed..249d82d3a0593 100644 --- a/contrib/file_fdw/file_fdw.c +++ b/contrib/file_fdw/file_fdw.c @@ -3,7 +3,7 @@ * file_fdw.c * foreign-data wrapper for server-side flat files (or programs). * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/file_fdw/file_fdw.c @@ -581,6 +581,7 @@ fileGetForeignPaths(PlannerInfo *root, NIL, /* no pathkeys */ baserel->lateral_relids, NULL, /* no extra plan */ + NIL, /* no fdw_restrictinfo list */ coptions)); /* diff --git a/contrib/file_fdw/meson.build b/contrib/file_fdw/meson.build index 7ea6ddfb1fe34..f982196c2b74a 100644 --- a/contrib/file_fdw/meson.build +++ b/contrib/file_fdw/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group file_fdw_sources = files( 'file_fdw.c', diff --git a/contrib/fuzzystrmatch/Makefile b/contrib/fuzzystrmatch/Makefile index e68bc0e33fd6c..04c83a34a7b61 100644 --- a/contrib/fuzzystrmatch/Makefile +++ b/contrib/fuzzystrmatch/Makefile @@ -15,6 +15,8 @@ PGFILEDESC = "fuzzystrmatch - similarities and distance between strings" REGRESS = fuzzystrmatch fuzzystrmatch_utf8 +EXTRA_CLEAN = daitch_mokotoff.h + ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) @@ -31,10 +33,3 @@ daitch_mokotoff.o: daitch_mokotoff.h daitch_mokotoff.h: daitch_mokotoff_header.pl $(PERL) $< $@ - -# daitch_mokotoff.h is included in tarballs, so it has to be made by -# "distprep" and not cleaned except by "maintainer-clean". -distprep: daitch_mokotoff.h - -maintainer-clean: - rm -f daitch_mokotoff.h diff --git a/contrib/fuzzystrmatch/daitch_mokotoff.c b/contrib/fuzzystrmatch/daitch_mokotoff.c index 162e32c11543f..8c050c6441b52 100644 --- a/contrib/fuzzystrmatch/daitch_mokotoff.c +++ b/contrib/fuzzystrmatch/daitch_mokotoff.c @@ -1,7 +1,7 @@ /* * Daitch-Mokotoff Soundex * - * Copyright (c) 2023, PostgreSQL Global Development Group + * Copyright (c) 2023-2024, PostgreSQL Global Development Group * * This module was originally sponsored by Finance Norway / * Trafikkforsikringsforeningen, and implemented by Dag Lem diff --git a/contrib/fuzzystrmatch/daitch_mokotoff_header.pl b/contrib/fuzzystrmatch/daitch_mokotoff_header.pl index 51a40e774898a..bb2827364edeb 100755 --- a/contrib/fuzzystrmatch/daitch_mokotoff_header.pl +++ b/contrib/fuzzystrmatch/daitch_mokotoff_header.pl @@ -2,14 +2,14 @@ # # Generation of types and lookup tables for Daitch-Mokotoff soundex. # -# Copyright (c) 2023, PostgreSQL Global Development Group +# Copyright (c) 2023-2024, PostgreSQL Global Development Group # # This module was originally sponsored by Finance Norway / # Trafikkforsikringsforeningen, and implemented by Dag Lem # use strict; -use warnings; +use warnings FATAL => 'all'; die "Usage: $0 OUTPUT_FILE\n" if @ARGV != 1; my $output_file = $ARGV[0]; @@ -58,7 +58,7 @@ /* * Constants and lookup tables for Daitch-Mokotoff Soundex * - * Copyright (c) 2023, PostgreSQL Global Development Group + * Copyright (c) 2023-2024, PostgreSQL Global Development Group * * This file is generated by daitch_mokotoff_header.pl */ diff --git a/contrib/fuzzystrmatch/fuzzystrmatch.c b/contrib/fuzzystrmatch/fuzzystrmatch.c index 56864979832ce..72ae2ab91b5a9 100644 --- a/contrib/fuzzystrmatch/fuzzystrmatch.c +++ b/contrib/fuzzystrmatch/fuzzystrmatch.c @@ -6,7 +6,7 @@ * Joe Conway * * contrib/fuzzystrmatch/fuzzystrmatch.c - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * ALL RIGHTS RESERVED; * * metaphone() @@ -55,7 +55,7 @@ static void _soundex(const char *instr, char *outstr); #define SOUNDEX_LEN 4 /* ABCDEFGHIJKLMNOPQRSTUVWXYZ */ -static const char *soundex_table = "01230120022455012623010202"; +static const char *const soundex_table = "01230120022455012623010202"; static char soundex_code(char letter) diff --git a/contrib/fuzzystrmatch/meson.build b/contrib/fuzzystrmatch/meson.build index 3ff84eb531ea6..299b2fa9cb4fd 100644 --- a/contrib/fuzzystrmatch/meson.build +++ b/contrib/fuzzystrmatch/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group fuzzystrmatch_sources = files( 'daitch_mokotoff.c', diff --git a/contrib/hstore/expected/hstore_utf8.out b/contrib/hstore/expected/hstore_utf8.out index 4405824413218..bbc885a181a37 100644 --- a/contrib/hstore/expected/hstore_utf8.out +++ b/contrib/hstore/expected/hstore_utf8.out @@ -34,3 +34,34 @@ SELECT 'keyÄ…foo=>valueÄ…'::hstore; "keyÄ…foo"=>"valueÄ…" (1 row) +-- More patterns that may depend on isspace() and locales, all discarded. +SELECT E'key\u000A=>value\u000A'::hstore; -- \n + hstore +---------------- + "key"=>"value" +(1 row) + +SELECT E'key\u0009=>value\u0009'::hstore; -- \t + hstore +---------------- + "key"=>"value" +(1 row) + +SELECT E'key\u000D=>value\u000D'::hstore; -- \r + hstore +---------------- + "key"=>"value" +(1 row) + +SELECT E'key\u000B=>value\u000B'::hstore; -- \v + hstore +---------------- + "key"=>"value" +(1 row) + +SELECT E'key\u000C=>value\u000C'::hstore; -- \f + hstore +---------------- + "key"=>"value" +(1 row) + diff --git a/contrib/hstore/hstore_gist.c b/contrib/hstore/hstore_gist.c index 3df00493e8172..a3b08af385016 100644 --- a/contrib/hstore/hstore_gist.c +++ b/contrib/hstore/hstore_gist.c @@ -7,6 +7,7 @@ #include "access/reloptions.h" #include "access/stratnum.h" #include "catalog/pg_type.h" +#include "common/int.h" #include "hstore.h" #include "utils/pg_crc.h" @@ -77,7 +78,7 @@ typedef struct /* shorthand for calculating CRC-32 of a single chunk of data. */ static pg_crc32 -crc32_sz(char *buf, int size) +crc32_sz(const char *buf, int size) { pg_crc32 crc; @@ -356,7 +357,8 @@ typedef struct static int comparecost(const void *a, const void *b) { - return ((const SPLITCOST *) a)->cost - ((const SPLITCOST *) b)->cost; + return pg_cmp_s32(((const SPLITCOST *) a)->cost, + ((const SPLITCOST *) b)->cost); } diff --git a/contrib/hstore/hstore_subs.c b/contrib/hstore/hstore_subs.c index 6ac91e0193526..1443d8634b299 100644 --- a/contrib/hstore/hstore_subs.c +++ b/contrib/hstore/hstore_subs.c @@ -12,7 +12,7 @@ * check_subscripts function and just let the fetch and assign functions * do everything. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/contrib/hstore/meson.build b/contrib/hstore/meson.build index 20acc45ad88e9..544310a2977fc 100644 --- a/contrib/hstore/meson.build +++ b/contrib/hstore/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # .. so that includes of hstore/hstore.h work hstore_inc = include_directories('.', '../') diff --git a/contrib/hstore/sql/hstore_utf8.sql b/contrib/hstore/sql/hstore_utf8.sql index face878324c37..38c9481ee6493 100644 --- a/contrib/hstore/sql/hstore_utf8.sql +++ b/contrib/hstore/sql/hstore_utf8.sql @@ -17,3 +17,10 @@ SELECT E'key\u0105=>value\u0105'::hstore; SELECT 'keyÄ…=>valueÄ…'::hstore; SELECT 'Ä…=>Ä…'::hstore; SELECT 'keyÄ…foo=>valueÄ…'::hstore; + +-- More patterns that may depend on isspace() and locales, all discarded. +SELECT E'key\u000A=>value\u000A'::hstore; -- \n +SELECT E'key\u0009=>value\u0009'::hstore; -- \t +SELECT E'key\u000D=>value\u000D'::hstore; -- \r +SELECT E'key\u000B=>value\u000B'::hstore; -- \v +SELECT E'key\u000C=>value\u000C'::hstore; -- \f diff --git a/contrib/hstore_plperl/meson.build b/contrib/hstore_plperl/meson.build index 00c3803d6f38e..0da6c7dab047d 100644 --- a/contrib/hstore_plperl/meson.build +++ b/contrib/hstore_plperl/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not perl_dep.found() subdir_done() diff --git a/contrib/hstore_plpython/meson.build b/contrib/hstore_plpython/meson.build index 0bd74754b1fd5..fd6f755e4a3ad 100644 --- a/contrib/hstore_plpython/meson.build +++ b/contrib/hstore_plpython/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not python3_dep.found() subdir_done() diff --git a/contrib/intagg/meson.build b/contrib/intagg/meson.build index 74164120a13c6..b3cb6217e2636 100644 --- a/contrib/intagg/meson.build +++ b/contrib/intagg/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group install_data( 'intagg.control', diff --git a/contrib/intarray/_int_gist.c b/contrib/intarray/_int_gist.c index 98145fe370369..a09b7fa812cb2 100644 --- a/contrib/intarray/_int_gist.c +++ b/contrib/intarray/_int_gist.c @@ -297,8 +297,7 @@ g_int_decompress(PG_FUNCTION_ARGS) ArrayType *in; int lenin; int *din; - int i, - j; + int i; in = DatumGetArrayTypeP(entry->key); @@ -342,9 +341,12 @@ g_int_decompress(PG_FUNCTION_ARGS) dr = ARRPTR(r); for (i = 0; i < lenin; i += 2) - for (j = din[i]; j <= din[i + 1]; j++) + { + /* use int64 for j in case din[i + 1] is INT_MAX */ + for (int64 j = din[i]; j <= din[i + 1]; j++) if ((!i) || *(dr - 1) != j) - *dr++ = j; + *dr++ = (int) j; + } if (in != (ArrayType *) DatumGetPointer(entry->key)) pfree(in); diff --git a/contrib/intarray/_int_selfuncs.c b/contrib/intarray/_int_selfuncs.c index 01d6fe14a70be..bc1ad3a80487f 100644 --- a/contrib/intarray/_int_selfuncs.c +++ b/contrib/intarray/_int_selfuncs.c @@ -3,7 +3,7 @@ * _int_selfuncs.c * Functions for selectivity estimation of intarray operators * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/contrib/intarray/_int_tool.c b/contrib/intarray/_int_tool.c index 68f624e085c6f..c85280c8422c4 100644 --- a/contrib/intarray/_int_tool.c +++ b/contrib/intarray/_int_tool.c @@ -7,6 +7,7 @@ #include "_int.h" #include "catalog/pg_type.h" +#include "common/int.h" #include "lib/qunique.h" /* arguments are assumed sorted & unique-ified */ @@ -396,15 +397,11 @@ int_to_intset(int32 elem) int compASC(const void *a, const void *b) { - if (*(const int32 *) a == *(const int32 *) b) - return 0; - return (*(const int32 *) a > *(const int32 *) b) ? 1 : -1; + return pg_cmp_s32(*(const int32 *) a, *(const int32 *) b); } int compDESC(const void *a, const void *b) { - if (*(const int32 *) a == *(const int32 *) b) - return 0; - return (*(const int32 *) a < *(const int32 *) b) ? 1 : -1; + return pg_cmp_s32(*(const int32 *) b, *(const int32 *) a); } diff --git a/contrib/intarray/_intbig_gist.c b/contrib/intarray/_intbig_gist.c index bfba5eef1d1f4..9699fbf3b4fe5 100644 --- a/contrib/intarray/_intbig_gist.c +++ b/contrib/intarray/_intbig_gist.c @@ -9,6 +9,7 @@ #include "access/gist.h" #include "access/reloptions.h" #include "access/stratnum.h" +#include "common/int.h" #include "port/pg_bitutils.h" #define GETENTRY(vec,pos) ((GISTTYPE *) DatumGetPointer((vec)->vector[(pos)].key)) @@ -178,9 +179,6 @@ g_intbig_compress(PG_FUNCTION_ARGS) entry->rel, entry->page, entry->offset, false); - if (in != DatumGetArrayTypeP(entry->key)) - pfree(in); - PG_RETURN_POINTER(retval); } else if (!ISALLTRUE(DatumGetPointer(entry->key))) @@ -315,7 +313,8 @@ typedef struct static int comparecost(const void *a, const void *b) { - return ((const SPLITCOST *) a)->cost - ((const SPLITCOST *) b)->cost; + return pg_cmp_s32(((const SPLITCOST *) a)->cost, + ((const SPLITCOST *) b)->cost); } diff --git a/contrib/intarray/bench/bench.pl b/contrib/intarray/bench/bench.pl index 067654986e2fe..1c728a2762b12 100755 --- a/contrib/intarray/bench/bench.pl +++ b/contrib/intarray/bench/bench.pl @@ -1,9 +1,9 @@ #!/usr/bin/perl -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; # make sure we are in a sane environment. use DBI(); diff --git a/contrib/intarray/bench/create_test.pl b/contrib/intarray/bench/create_test.pl index 6efe9151ca555..fc540001fc00b 100755 --- a/contrib/intarray/bench/create_test.pl +++ b/contrib/intarray/bench/create_test.pl @@ -1,11 +1,11 @@ #!/usr/bin/perl -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # contrib/intarray/bench/create_test.pl use strict; -use warnings; +use warnings FATAL => 'all'; print < '{23,50}'; + count +------- + 12 +(1 row) + +SELECT count(*) from more__int WHERE a @@ '23&50'; + count +------- + 12 +(1 row) + +SELECT count(*) from more__int WHERE a @> '{20,23}'; + count +------- + 12 +(1 row) + +SELECT count(*) from more__int WHERE a <@ '{73,23,20}'; + count +------- + 10 +(1 row) + +SELECT count(*) from more__int WHERE a = '{73,23,20}'; + count +------- + 1 +(1 row) + +SELECT count(*) from more__int WHERE a @@ '50&68'; + count +------- + 9 +(1 row) + +SELECT count(*) from more__int WHERE a @> '{20,23}' or a @> '{50,68}'; + count +------- + 21 +(1 row) + +SELECT count(*) from more__int WHERE a @@ '(20&23)|(50&68)'; + count +------- + 21 +(1 row) + +SELECT count(*) from more__int WHERE a @@ '20 | !21'; + count +------- + 6567 +(1 row) + +SELECT count(*) from more__int WHERE a @@ '!20 & !21'; + count +------- + 6344 +(1 row) + +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; + count +------- + 12 (1 row) RESET enable_seqscan; diff --git a/contrib/intarray/meson.build b/contrib/intarray/meson.build index 17459ae313d78..5d4609ebc6e28 100644 --- a/contrib/intarray/meson.build +++ b/contrib/intarray/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group intarray_sources = files( '_int_bool.c', diff --git a/contrib/intarray/sql/_int.sql b/contrib/intarray/sql/_int.sql index a947c4f8fdd02..5668ab4070453 100644 --- a/contrib/intarray/sql/_int.sql +++ b/contrib/intarray/sql/_int.sql @@ -107,6 +107,7 @@ SELECT count(*) from test__int WHERE a @> '{20,23}' or a @> '{50,68}'; SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)'; SELECT count(*) from test__int WHERE a @@ '20 | !21'; SELECT count(*) from test__int WHERE a @@ '!20 & !21'; +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; SET enable_seqscan = off; -- not all of these would use index by default @@ -124,6 +125,7 @@ SELECT count(*) from test__int WHERE a @> '{20,23}' or a @> '{50,68}'; SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)'; SELECT count(*) from test__int WHERE a @@ '20 | !21'; SELECT count(*) from test__int WHERE a @@ '!20 & !21'; +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; INSERT INTO test__int SELECT array(SELECT x FROM generate_series(1, 1001) x); -- should fail @@ -144,6 +146,7 @@ SELECT count(*) from test__int WHERE a @> '{20,23}' or a @> '{50,68}'; SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)'; SELECT count(*) from test__int WHERE a @@ '20 | !21'; SELECT count(*) from test__int WHERE a @@ '!20 & !21'; +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; DROP INDEX text_idx; CREATE INDEX text_idx on test__int using gist (a gist__intbig_ops(siglen = 0)); @@ -162,6 +165,7 @@ SELECT count(*) from test__int WHERE a @> '{20,23}' or a @> '{50,68}'; SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)'; SELECT count(*) from test__int WHERE a @@ '20 | !21'; SELECT count(*) from test__int WHERE a @@ '!20 & !21'; +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; DROP INDEX text_idx; CREATE INDEX text_idx on test__int using gist ( a gist__intbig_ops ); @@ -178,6 +182,7 @@ SELECT count(*) from test__int WHERE a @> '{20,23}' or a @> '{50,68}'; SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)'; SELECT count(*) from test__int WHERE a @@ '20 | !21'; SELECT count(*) from test__int WHERE a @@ '!20 & !21'; +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; DROP INDEX text_idx; CREATE INDEX text_idx on test__int using gin ( a gin__int_ops ); @@ -194,5 +199,43 @@ SELECT count(*) from test__int WHERE a @> '{20,23}' or a @> '{50,68}'; SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)'; SELECT count(*) from test__int WHERE a @@ '20 | !21'; SELECT count(*) from test__int WHERE a @@ '!20 & !21'; +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; + +DROP INDEX text_idx; + +-- Repeat the same queries with an extended data set. The data set is the +-- same that we used before, except that each element in the array is +-- repeated three times, offset by 1000 and 2000. For example, {1, 5} +-- becomes {1, 1001, 2001, 5, 1005, 2005}. +-- +-- That has proven to be unreasonably effective at exercising codepaths in +-- core GiST code related to splitting parent pages, which is not covered by +-- other tests. This is a bit out-of-place as the point is to test core GiST +-- code rather than this extension, but there is no suitable GiST opclass in +-- core that would reach the same codepaths. +CREATE TABLE more__int AS SELECT + -- Leave alone NULLs, empty arrays and the one row that we use to test + -- equality; also skip INT_MAX + CASE WHEN a IS NULL OR a = '{}' OR a = '{73,23,20}' THEN a ELSE + (select array_agg(u) || array_agg(u + 1000) || array_agg(u + 2000) + from unnest(a) u where u < 2000000000) + END AS a, a as b + FROM test__int; +CREATE INDEX ON more__int using gist (a gist__int_ops(numranges = 252)); + +SELECT count(*) from more__int WHERE a && '{23,50}'; +SELECT count(*) from more__int WHERE a @@ '23|50'; +SELECT count(*) from more__int WHERE a @> '{23,50}'; +SELECT count(*) from more__int WHERE a @@ '23&50'; +SELECT count(*) from more__int WHERE a @> '{20,23}'; +SELECT count(*) from more__int WHERE a <@ '{73,23,20}'; +SELECT count(*) from more__int WHERE a = '{73,23,20}'; +SELECT count(*) from more__int WHERE a @@ '50&68'; +SELECT count(*) from more__int WHERE a @> '{20,23}' or a @> '{50,68}'; +SELECT count(*) from more__int WHERE a @@ '(20&23)|(50&68)'; +SELECT count(*) from more__int WHERE a @@ '20 | !21'; +SELECT count(*) from more__int WHERE a @@ '!20 & !21'; +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; + RESET enable_seqscan; diff --git a/contrib/isn/isn.c b/contrib/isn/isn.c index 00bd9cdd0216d..71a543b9478b6 100644 --- a/contrib/isn/isn.c +++ b/contrib/isn/isn.c @@ -4,7 +4,7 @@ * PostgreSQL type definitions for ISNs (ISBN, ISMN, ISSN, EAN13, UPC) * * Author: German Mendez Bravo (Kronuz) - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/isn/isn.c diff --git a/contrib/isn/isn.h b/contrib/isn/isn.h index f3f8ee0d6c519..2b499bcf3389a 100644 --- a/contrib/isn/isn.h +++ b/contrib/isn/isn.h @@ -4,7 +4,7 @@ * PostgreSQL type definitions for ISNs (ISBN, ISMN, ISSN, EAN13, UPC) * * Author: German Mendez Bravo (Kronuz) - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/isn/isn.h diff --git a/contrib/isn/meson.build b/contrib/isn/meson.build index a6a87f8717d45..abe83265573ba 100644 --- a/contrib/isn/meson.build +++ b/contrib/isn/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group isn_sources = files( 'isn.c', diff --git a/contrib/jsonb_plperl/meson.build b/contrib/jsonb_plperl/meson.build index 8bf0a8d6ff2cc..c36de6481c2eb 100644 --- a/contrib/jsonb_plperl/meson.build +++ b/contrib/jsonb_plperl/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not perl_dep.found() subdir_done() diff --git a/contrib/jsonb_plpython/meson.build b/contrib/jsonb_plpython/meson.build index 35e745eb78102..0503e952f0e5f 100644 --- a/contrib/jsonb_plpython/meson.build +++ b/contrib/jsonb_plpython/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not python3_dep.found() subdir_done() diff --git a/contrib/lo/expected/lo.out b/contrib/lo/expected/lo.out index c63e4b1c704fb..1b6c5a8564912 100644 --- a/contrib/lo/expected/lo.out +++ b/contrib/lo/expected/lo.out @@ -47,4 +47,73 @@ SELECT lo_get(43214); DELETE FROM image; SELECT lo_get(43214); ERROR: large object 43214 does not exist +-- Now let's try it with an AFTER trigger +DROP TRIGGER t_raster ON image; +CREATE CONSTRAINT TRIGGER t_raster AFTER UPDATE OR DELETE ON image + DEFERRABLE INITIALLY DEFERRED + FOR EACH ROW EXECUTE PROCEDURE lo_manage(raster); +SELECT lo_create(43223); + lo_create +----------- + 43223 +(1 row) + +SELECT lo_create(43224); + lo_create +----------- + 43224 +(1 row) + +SELECT lo_create(43225); + lo_create +----------- + 43225 +(1 row) + +INSERT INTO image (title, raster) VALUES ('beautiful image', 43223); +SELECT lo_get(43223); + lo_get +-------- + \x +(1 row) + +UPDATE image SET raster = 43224 WHERE title = 'beautiful image'; +SELECT lo_get(43223); -- gone +ERROR: large object 43223 does not exist +SELECT lo_get(43224); + lo_get +-------- + \x +(1 row) + +-- test updating of unrelated column +UPDATE image SET title = 'beautiful picture' WHERE title = 'beautiful image'; +SELECT lo_get(43224); + lo_get +-------- + \x +(1 row) + +-- this case used to be buggy +BEGIN; +UPDATE image SET title = 'beautiful image' WHERE title = 'beautiful picture'; +UPDATE image SET raster = 43225 WHERE title = 'beautiful image'; +SELECT lo_get(43224); + lo_get +-------- + \x +(1 row) + +COMMIT; +SELECT lo_get(43224); -- gone +ERROR: large object 43224 does not exist +SELECT lo_get(43225); + lo_get +-------- + \x +(1 row) + +DELETE FROM image; +SELECT lo_get(43225); -- gone +ERROR: large object 43225 does not exist DROP TABLE image; diff --git a/contrib/lo/meson.build b/contrib/lo/meson.build index 06a811b4b9d76..4cc72b64578cb 100644 --- a/contrib/lo/meson.build +++ b/contrib/lo/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group lo_sources = files( 'lo.c', diff --git a/contrib/lo/sql/lo.sql b/contrib/lo/sql/lo.sql index 7703950924508..99c3bd1fab31e 100644 --- a/contrib/lo/sql/lo.sql +++ b/contrib/lo/sql/lo.sql @@ -27,4 +27,44 @@ DELETE FROM image; SELECT lo_get(43214); +-- Now let's try it with an AFTER trigger + +DROP TRIGGER t_raster ON image; + +CREATE CONSTRAINT TRIGGER t_raster AFTER UPDATE OR DELETE ON image + DEFERRABLE INITIALLY DEFERRED + FOR EACH ROW EXECUTE PROCEDURE lo_manage(raster); + +SELECT lo_create(43223); +SELECT lo_create(43224); +SELECT lo_create(43225); + +INSERT INTO image (title, raster) VALUES ('beautiful image', 43223); + +SELECT lo_get(43223); + +UPDATE image SET raster = 43224 WHERE title = 'beautiful image'; + +SELECT lo_get(43223); -- gone +SELECT lo_get(43224); + +-- test updating of unrelated column +UPDATE image SET title = 'beautiful picture' WHERE title = 'beautiful image'; + +SELECT lo_get(43224); + +-- this case used to be buggy +BEGIN; +UPDATE image SET title = 'beautiful image' WHERE title = 'beautiful picture'; +UPDATE image SET raster = 43225 WHERE title = 'beautiful image'; +SELECT lo_get(43224); +COMMIT; + +SELECT lo_get(43224); -- gone +SELECT lo_get(43225); + +DELETE FROM image; + +SELECT lo_get(43225); -- gone + DROP TABLE image; diff --git a/contrib/ltree/Makefile b/contrib/ltree/Makefile index 770769a730d44..e92d971f3db02 100644 --- a/contrib/ltree/Makefile +++ b/contrib/ltree/Makefile @@ -14,7 +14,8 @@ OBJS = \ ltxtquery_op.o EXTENSION = ltree -DATA = ltree--1.1--1.2.sql ltree--1.1.sql ltree--1.0--1.1.sql +DATA = ltree--1.2--1.3.sql ltree--1.1--1.2.sql ltree--1.1.sql \ + ltree--1.0--1.1.sql PGFILEDESC = "ltree - hierarchical label data type" HEADERS = ltree.h diff --git a/contrib/ltree/expected/ltree.out b/contrib/ltree/expected/ltree.out index 984cd030cfae2..c8eac3f6b21bc 100644 --- a/contrib/ltree/expected/ltree.out +++ b/contrib/ltree/expected/ltree.out @@ -1433,8 +1433,27 @@ SELECT '{j.k.l.m, g.b.c.d.e}'::ltree[] ?~ 'A*@|g.b.c.d.e'; g.b.c.d.e (1 row) +-- Check that the hash_ltree() and hash_ltree_extended() function's lower +-- 32 bits match when the seed is 0 and do not match when the seed != 0 +SELECT v as value, hash_ltree(v)::bit(32) as standard, + hash_ltree_extended(v, 0)::bit(32) as extended0, + hash_ltree_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::ltree), (''::ltree), ('0'::ltree), ('0.1'::ltree), + ('0.1.2'::ltree), ('0'::ltree), ('0_asd.1_ASD'::ltree)) x(v) +WHERE hash_ltree(v)::bit(32) != hash_ltree_extended(v, 0)::bit(32) + OR hash_ltree(v)::bit(32) = hash_ltree_extended(v, 1)::bit(32); + value | standard | extended0 | extended1 +-------+----------+-----------+----------- +(0 rows) + CREATE TABLE ltreetest (t ltree); \copy ltreetest FROM 'data/ltree.data' +SELECT count(*) from ltreetest; + count +------- + 1006 +(1 row) + SELECT * FROM ltreetest WHERE t < '12.3' order by t asc; t ---------------------------------- @@ -7833,6 +7852,55 @@ SELECT * FROM ltreetest WHERE t ? '{23.*.1,23.*.2}' order by t asc; (4 rows) drop index tstidx; +--- test hash index +create index tstidx on ltreetest using hash (t); +set enable_seqscan=off; +set enable_bitmapscan=off; +EXPLAIN (COSTS OFF) +SELECT * FROM ltreetest WHERE t = '12.3' order by t asc; + QUERY PLAN +-------------------------------------- + Index Scan using tstidx on ltreetest + Index Cond: (t = '12.3'::ltree) +(2 rows) + +SELECT * FROM ltreetest WHERE t = '12.3' order by t asc; + t +------ + 12.3 +(1 row) + +reset enable_seqscan; +reset enable_bitmapscan; +-- test hash aggregate +set enable_hashagg=on; +set enable_sort=off; +EXPLAIN (COSTS OFF) +SELECT count(*) FROM ( +SELECT t FROM (SELECT * FROM ltreetest UNION ALL SELECT * FROM ltreetest) t1 GROUP BY t +) t2; + QUERY PLAN +----------------------------------------------------- + Aggregate + -> HashAggregate + Group Key: ltreetest.t + -> Append + -> Seq Scan on ltreetest + -> Seq Scan on ltreetest ltreetest_1 +(6 rows) + +SELECT count(*) FROM ( +SELECT t FROM (SELECT * FROM ltreetest UNION ALL SELECT * FROM ltreetest) t1 GROUP BY t +) t2; + count +------- + 1006 +(1 row) + +reset enable_hashagg; +reset enable_sort; +drop index tstidx; +-- test gist index create index tstidx on ltreetest using gist (t gist_ltree_ops(siglen=0)); ERROR: value 0 out of bounds for option "siglen" DETAIL: Valid values are between "4" and "2024". diff --git a/contrib/ltree/ltree--1.2--1.3.sql b/contrib/ltree/ltree--1.2--1.3.sql new file mode 100644 index 0000000000000..bc9a34dd591d1 --- /dev/null +++ b/contrib/ltree/ltree--1.2--1.3.sql @@ -0,0 +1,23 @@ +/* contrib/ltree/ltree--1.2--1.3.sql */ + +-- complain if script is sourced in psql, rather than via ALTER EXTENSION +\echo Use "ALTER EXTENSION ltree UPDATE TO '1.3'" to load this file. \quit + +CREATE FUNCTION hash_ltree(ltree) +RETURNS integer +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE; + +CREATE FUNCTION hash_ltree_extended(ltree, bigint) +RETURNS bigint +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE; + +CREATE OPERATOR CLASS hash_ltree_ops +DEFAULT FOR TYPE ltree USING hash +AS + OPERATOR 1 = , + FUNCTION 1 hash_ltree(ltree), + FUNCTION 2 hash_ltree_extended(ltree, bigint); + +ALTER OPERATOR =(ltree, ltree) SET (HASHES); diff --git a/contrib/ltree/ltree.control b/contrib/ltree/ltree.control index b408d64781f79..c2cbeda96c734 100644 --- a/contrib/ltree/ltree.control +++ b/contrib/ltree/ltree.control @@ -1,6 +1,6 @@ # ltree extension comment = 'data type for hierarchical tree-like structures' -default_version = '1.2' +default_version = '1.3' module_pathname = '$libdir/ltree' relocatable = true trusted = true diff --git a/contrib/ltree/ltree_op.c b/contrib/ltree/ltree_op.c index da1db5fcd2229..24a21d3ea0173 100644 --- a/contrib/ltree/ltree_op.c +++ b/contrib/ltree/ltree_op.c @@ -9,6 +9,7 @@ #include "access/htup_details.h" #include "catalog/pg_statistic.h" +#include "common/hashfn.h" #include "ltree.h" #include "utils/builtins.h" #include "utils/lsyscache.h" @@ -24,6 +25,8 @@ PG_FUNCTION_INFO_V1(ltree_eq); PG_FUNCTION_INFO_V1(ltree_ne); PG_FUNCTION_INFO_V1(ltree_ge); PG_FUNCTION_INFO_V1(ltree_gt); +PG_FUNCTION_INFO_V1(hash_ltree); +PG_FUNCTION_INFO_V1(hash_ltree_extended); PG_FUNCTION_INFO_V1(nlevel); PG_FUNCTION_INFO_V1(ltree_isparent); PG_FUNCTION_INFO_V1(ltree_risparent); @@ -129,6 +132,72 @@ ltree_ne(PG_FUNCTION_ARGS) PG_RETURN_BOOL(res != 0); } +/* Compute a hash for the ltree */ +Datum +hash_ltree(PG_FUNCTION_ARGS) +{ + ltree *a = PG_GETARG_LTREE_P(0); + uint32 result = 1; + int an = a->numlevel; + ltree_level *al = LTREE_FIRST(a); + + while (an > 0) + { + uint32 levelHash = DatumGetUInt32(hash_any((unsigned char *) al->name, al->len)); + + /* + * Combine hash values of successive elements by multiplying the + * current value by 31 and adding on the new element's hash value. + * + * This method is borrowed from hash_array(), which see for further + * commentary. + */ + result = (result << 5) - result + levelHash; + + an--; + al = LEVEL_NEXT(al); + } + + PG_FREE_IF_COPY(a, 0); + PG_RETURN_UINT32(result); +} + +/* Compute an extended hash for the ltree */ +Datum +hash_ltree_extended(PG_FUNCTION_ARGS) +{ + ltree *a = PG_GETARG_LTREE_P(0); + const uint64 seed = PG_GETARG_INT64(1); + uint64 result = 1; + int an = a->numlevel; + ltree_level *al = LTREE_FIRST(a); + + /* + * If the path has length zero, return 1 + seed to ensure that the low 32 + * bits of the result match hash_ltree when the seed is 0, as required by + * the hash index support functions, but to also return a different value + * when there is a seed. + */ + if (an == 0) + { + PG_FREE_IF_COPY(a, 0); + PG_RETURN_UINT64(result + seed); + } + + while (an > 0) + { + uint64 levelHash = DatumGetUInt64(hash_any_extended((unsigned char *) al->name, al->len, seed)); + + result = (result << 5) - result + levelHash; + + an--; + al = LEVEL_NEXT(al); + } + + PG_FREE_IF_COPY(a, 0); + PG_RETURN_UINT64(result); +} + Datum nlevel(PG_FUNCTION_ARGS) { diff --git a/contrib/ltree/ltreetest.sql b/contrib/ltree/ltreetest.sql index d6996caf3c466..388d5bb6f5c06 100644 --- a/contrib/ltree/ltreetest.sql +++ b/contrib/ltree/ltreetest.sql @@ -19,3 +19,4 @@ INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Galaxies'); INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Astronauts'); CREATE INDEX path_gist_idx ON test USING gist(path); CREATE INDEX path_idx ON test USING btree(path); +CREATE INDEX path_hash_idx ON test USING hash(path); diff --git a/contrib/ltree/meson.build b/contrib/ltree/meson.build index 44d0337e6e4b1..1ea9603d453f1 100644 --- a/contrib/ltree/meson.build +++ b/contrib/ltree/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group ltree_sources = files( '_ltree_gist.c', @@ -30,8 +30,9 @@ contrib_targets += ltree install_data( 'ltree.control', 'ltree--1.0--1.1.sql', - 'ltree--1.1--1.2.sql', 'ltree--1.1.sql', + 'ltree--1.1--1.2.sql', + 'ltree--1.2--1.3.sql', kwargs: contrib_data_args, ) diff --git a/contrib/ltree/sql/ltree.sql b/contrib/ltree/sql/ltree.sql index 402096f6c4651..dd705d9d7ca00 100644 --- a/contrib/ltree/sql/ltree.sql +++ b/contrib/ltree/sql/ltree.sql @@ -282,9 +282,21 @@ SELECT ('{3456,1.2.3.4}'::ltree[] ?<@ '1.2.5') is null; SELECT '{ltree.asd, tree.awdfg}'::ltree[] ?@ 'tree & aWdfg@'::ltxtquery; SELECT '{j.k.l.m, g.b.c.d.e}'::ltree[] ?~ 'A*@|g.b.c.d.e'; +-- Check that the hash_ltree() and hash_ltree_extended() function's lower +-- 32 bits match when the seed is 0 and do not match when the seed != 0 +SELECT v as value, hash_ltree(v)::bit(32) as standard, + hash_ltree_extended(v, 0)::bit(32) as extended0, + hash_ltree_extended(v, 1)::bit(32) as extended1 +FROM (VALUES (NULL::ltree), (''::ltree), ('0'::ltree), ('0.1'::ltree), + ('0.1.2'::ltree), ('0'::ltree), ('0_asd.1_ASD'::ltree)) x(v) +WHERE hash_ltree(v)::bit(32) != hash_ltree_extended(v, 0)::bit(32) + OR hash_ltree(v)::bit(32) = hash_ltree_extended(v, 1)::bit(32); + CREATE TABLE ltreetest (t ltree); \copy ltreetest FROM 'data/ltree.data' +SELECT count(*) from ltreetest; + SELECT * FROM ltreetest WHERE t < '12.3' order by t asc; SELECT * FROM ltreetest WHERE t <= '12.3' order by t asc; SELECT * FROM ltreetest WHERE t = '12.3' order by t asc; @@ -329,6 +341,41 @@ SELECT * FROM ltreetest WHERE t ~ '23.*.2' order by t asc; SELECT * FROM ltreetest WHERE t ? '{23.*.1,23.*.2}' order by t asc; drop index tstidx; + +--- test hash index + +create index tstidx on ltreetest using hash (t); +set enable_seqscan=off; +set enable_bitmapscan=off; + +EXPLAIN (COSTS OFF) +SELECT * FROM ltreetest WHERE t = '12.3' order by t asc; +SELECT * FROM ltreetest WHERE t = '12.3' order by t asc; + +reset enable_seqscan; +reset enable_bitmapscan; + +-- test hash aggregate + +set enable_hashagg=on; +set enable_sort=off; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM ( +SELECT t FROM (SELECT * FROM ltreetest UNION ALL SELECT * FROM ltreetest) t1 GROUP BY t +) t2; + +SELECT count(*) FROM ( +SELECT t FROM (SELECT * FROM ltreetest UNION ALL SELECT * FROM ltreetest) t1 GROUP BY t +) t2; + +reset enable_hashagg; +reset enable_sort; + +drop index tstidx; + +-- test gist index + create index tstidx on ltreetest using gist (t gist_ltree_ops(siglen=0)); create index tstidx on ltreetest using gist (t gist_ltree_ops(siglen=2025)); create index tstidx on ltreetest using gist (t gist_ltree_ops(siglen=2028)); diff --git a/contrib/ltree_plpython/meson.build b/contrib/ltree_plpython/meson.build index d6c1a2526a937..894b99b7a3ab5 100644 --- a/contrib/ltree_plpython/meson.build +++ b/contrib/ltree_plpython/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not python3_dep.found() subdir_done() diff --git a/contrib/meson.build b/contrib/meson.build index bd4a57c43c095..14a8906865063 100644 --- a/contrib/meson.build +++ b/contrib/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group contrib_mod_args = pg_mod_args @@ -7,7 +7,11 @@ contrib_data_args = { 'install_dir': contrib_data_dir, } -subdir('adminpack') +contrib_doc_dir = dir_doc_extension +contrib_doc_args = { + 'install_dir': contrib_doc_dir, +} + subdir('amcheck') subdir('auth_delay') subdir('auto_explain') @@ -37,7 +41,6 @@ subdir('lo') subdir('ltree') subdir('ltree_plpython') subdir('oid2name') -subdir('old_snapshot') subdir('pageinspect') subdir('passwordcheck') subdir('pg_buffercache') diff --git a/contrib/oid2name/meson.build b/contrib/oid2name/meson.build index 171d2d226b17a..122979dc43ea2 100644 --- a/contrib/oid2name/meson.build +++ b/contrib/oid2name/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group oid2name_sources = files( 'oid2name.c', diff --git a/contrib/oid2name/t/001_basic.pl b/contrib/oid2name/t/001_basic.pl index 74fe62291693c..ae0e9ee20afce 100644 --- a/contrib/oid2name/t/001_basic.pl +++ b/contrib/oid2name/t/001_basic.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/contrib/old_snapshot/Makefile b/contrib/old_snapshot/Makefile deleted file mode 100644 index adb557532fc1c..0000000000000 --- a/contrib/old_snapshot/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -# contrib/old_snapshot/Makefile - -MODULE_big = old_snapshot -OBJS = \ - $(WIN32RES) \ - time_mapping.o - -EXTENSION = old_snapshot -DATA = old_snapshot--1.0.sql -PGFILEDESC = "old_snapshot - utilities in support of old_snapshot_threshold" - -ifdef USE_PGXS -PG_CONFIG = pg_config -PGXS := $(shell $(PG_CONFIG) --pgxs) -include $(PGXS) -else -subdir = contrib/old_snapshot -top_builddir = ../.. -include $(top_builddir)/src/Makefile.global -include $(top_srcdir)/contrib/contrib-global.mk -endif diff --git a/contrib/old_snapshot/meson.build b/contrib/old_snapshot/meson.build deleted file mode 100644 index fe5fb9027abc5..0000000000000 --- a/contrib/old_snapshot/meson.build +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group - -old_snapshot_sources = files( - 'time_mapping.c', -) - -if host_system == 'windows' - old_snapshot_sources += rc_lib_gen.process(win32ver_rc, extra_args: [ - '--NAME', 'old_snapshot', - '--FILEDESC', 'old_snapshot - utilities in support of old_snapshot_threshold',]) -endif - -old_snapshot = shared_module('old_snapshot', - old_snapshot_sources, - kwargs: contrib_mod_args, -) -contrib_targets += old_snapshot - -install_data( - 'old_snapshot.control', - 'old_snapshot--1.0.sql', - kwargs: contrib_data_args, -) diff --git a/contrib/old_snapshot/old_snapshot--1.0.sql b/contrib/old_snapshot/old_snapshot--1.0.sql deleted file mode 100644 index 9ebb8829e3729..0000000000000 --- a/contrib/old_snapshot/old_snapshot--1.0.sql +++ /dev/null @@ -1,14 +0,0 @@ -/* contrib/old_snapshot/old_snapshot--1.0.sql */ - --- complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "CREATE EXTENSION old_snapshot" to load this file. \quit - --- Show visibility map and page-level visibility information for each block. -CREATE FUNCTION pg_old_snapshot_time_mapping(array_offset OUT int4, - end_timestamp OUT timestamptz, - newest_xmin OUT xid) -RETURNS SETOF record -AS 'MODULE_PATHNAME', 'pg_old_snapshot_time_mapping' -LANGUAGE C STRICT; - --- XXX. Do we want REVOKE commands here? diff --git a/contrib/old_snapshot/old_snapshot.control b/contrib/old_snapshot/old_snapshot.control deleted file mode 100644 index 491eec536cd6f..0000000000000 --- a/contrib/old_snapshot/old_snapshot.control +++ /dev/null @@ -1,5 +0,0 @@ -# old_snapshot extension -comment = 'utilities in support of old_snapshot_threshold' -default_version = '1.0' -module_pathname = '$libdir/old_snapshot' -relocatable = true diff --git a/contrib/old_snapshot/time_mapping.c b/contrib/old_snapshot/time_mapping.c deleted file mode 100644 index 352308cd49b48..0000000000000 --- a/contrib/old_snapshot/time_mapping.c +++ /dev/null @@ -1,142 +0,0 @@ -/*------------------------------------------------------------------------- - * - * time_mapping.c - * time to XID mapping information - * - * Copyright (c) 2020-2023, PostgreSQL Global Development Group - * - * contrib/old_snapshot/time_mapping.c - *------------------------------------------------------------------------- - */ -#include "postgres.h" - -#include "funcapi.h" -#include "storage/lwlock.h" -#include "utils/old_snapshot.h" -#include "utils/snapmgr.h" -#include "utils/timestamp.h" - -/* - * Backend-private copy of the information from oldSnapshotControl which relates - * to the time to XID mapping, plus an index so that we can iterate. - * - * Note that the length of the xid_by_minute array is given by - * OLD_SNAPSHOT_TIME_MAP_ENTRIES (which is not a compile-time constant). - */ -typedef struct -{ - int current_index; - int head_offset; - TimestampTz head_timestamp; - int count_used; - TransactionId xid_by_minute[FLEXIBLE_ARRAY_MEMBER]; -} OldSnapshotTimeMapping; - -#define NUM_TIME_MAPPING_COLUMNS 3 - -PG_MODULE_MAGIC; -PG_FUNCTION_INFO_V1(pg_old_snapshot_time_mapping); - -static OldSnapshotTimeMapping *GetOldSnapshotTimeMapping(void); -static HeapTuple MakeOldSnapshotTimeMappingTuple(TupleDesc tupdesc, - OldSnapshotTimeMapping *mapping); - -/* - * SQL-callable set-returning function. - */ -Datum -pg_old_snapshot_time_mapping(PG_FUNCTION_ARGS) -{ - FuncCallContext *funcctx; - OldSnapshotTimeMapping *mapping; - - if (SRF_IS_FIRSTCALL()) - { - MemoryContext oldcontext; - TupleDesc tupdesc; - - funcctx = SRF_FIRSTCALL_INIT(); - oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx); - mapping = GetOldSnapshotTimeMapping(); - funcctx->user_fctx = mapping; - if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) - elog(ERROR, "return type must be a row type"); - funcctx->tuple_desc = tupdesc; - MemoryContextSwitchTo(oldcontext); - } - - funcctx = SRF_PERCALL_SETUP(); - mapping = (OldSnapshotTimeMapping *) funcctx->user_fctx; - - while (mapping->current_index < mapping->count_used) - { - HeapTuple tuple; - - tuple = MakeOldSnapshotTimeMappingTuple(funcctx->tuple_desc, mapping); - ++mapping->current_index; - SRF_RETURN_NEXT(funcctx, HeapTupleGetDatum(tuple)); - } - - SRF_RETURN_DONE(funcctx); -} - -/* - * Get the old snapshot time mapping data from shared memory. - */ -static OldSnapshotTimeMapping * -GetOldSnapshotTimeMapping(void) -{ - OldSnapshotTimeMapping *mapping; - - mapping = palloc(offsetof(OldSnapshotTimeMapping, xid_by_minute) - + sizeof(TransactionId) * OLD_SNAPSHOT_TIME_MAP_ENTRIES); - mapping->current_index = 0; - - LWLockAcquire(OldSnapshotTimeMapLock, LW_SHARED); - mapping->head_offset = oldSnapshotControl->head_offset; - mapping->head_timestamp = oldSnapshotControl->head_timestamp; - mapping->count_used = oldSnapshotControl->count_used; - for (int i = 0; i < OLD_SNAPSHOT_TIME_MAP_ENTRIES; ++i) - mapping->xid_by_minute[i] = oldSnapshotControl->xid_by_minute[i]; - LWLockRelease(OldSnapshotTimeMapLock); - - return mapping; -} - -/* - * Convert one entry from the old snapshot time mapping to a HeapTuple. - */ -static HeapTuple -MakeOldSnapshotTimeMappingTuple(TupleDesc tupdesc, OldSnapshotTimeMapping *mapping) -{ - Datum values[NUM_TIME_MAPPING_COLUMNS]; - bool nulls[NUM_TIME_MAPPING_COLUMNS]; - int array_position; - TimestampTz timestamp; - - /* - * Figure out the array position corresponding to the current index. - * - * Index 0 means the oldest entry in the mapping, which is stored at - * mapping->head_offset. Index 1 means the next-oldest entry, which is a - * the following index, and so on. We wrap around when we reach the end of - * the array. - */ - array_position = (mapping->head_offset + mapping->current_index) - % OLD_SNAPSHOT_TIME_MAP_ENTRIES; - - /* - * No explicit timestamp is stored for any entry other than the oldest - * one, but each entry corresponds to 1-minute period, so we can just add. - */ - timestamp = TimestampTzPlusMilliseconds(mapping->head_timestamp, - mapping->current_index * 60000); - - /* Initialize nulls and values arrays. */ - memset(nulls, 0, sizeof(nulls)); - values[0] = Int32GetDatum(array_position); - values[1] = TimestampTzGetDatum(timestamp); - values[2] = TransactionIdGetDatum(mapping->xid_by_minute[array_position]); - - return heap_form_tuple(tupdesc, values, nulls); -} diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c index a781f26551417..44116c4cb17c7 100644 --- a/contrib/pageinspect/brinfuncs.c +++ b/contrib/pageinspect/brinfuncs.c @@ -2,7 +2,7 @@ * brinfuncs.c * Functions to investigate BRIN indexes * - * Copyright (c) 2014-2023, PostgreSQL Global Development Group + * Copyright (c) 2014-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pageinspect/brinfuncs.c @@ -121,6 +121,8 @@ verify_brin_page(bytea *raw_page, uint16 type, const char *strtype) return page; } +/* Number of output arguments (columns) for brin_page_items() */ +#define BRIN_PAGE_ITEMS_V1_12 8 /* * Extract all item values from a BRIN index page @@ -149,6 +151,21 @@ brin_page_items(PG_FUNCTION_ARGS) InitMaterializedSRF(fcinfo, 0); + /* + * Version 1.12 added a new output column for the empty range flag. But as + * it was added in the middle, it may cause crashes with function + * definitions from older versions of the extension. + * + * There is no way to reliably avoid the problems created by the old + * function definition at this point, so insist that the user update the + * extension. + */ + if (rsinfo->setDesc->natts < BRIN_PAGE_ITEMS_V1_12) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("function has wrong number of declared columns"), + errhint("To resolve the problem, update the \"pageinspect\" extension to the latest version."))); + indexRel = index_open(indexRelid, AccessShareLock); if (!IS_BRIN(indexRel)) diff --git a/contrib/pageinspect/expected/brin.out b/contrib/pageinspect/expected/brin.out index 098ddc202f41b..b6a43bbb01b30 100644 --- a/contrib/pageinspect/expected/brin.out +++ b/contrib/pageinspect/expected/brin.out @@ -89,4 +89,122 @@ SELECT brin_revmap_data(decode(repeat('00', :block_size), 'hex')); (1 row) +-- Test that partial indexes have all pages, including empty ones. +CREATE TABLE test2 (a int); +INSERT INTO test2 SELECT i FROM generate_series(1,1000) s(i); +-- No rows match the index predicate, make sure the index has the right number +-- of ranges (same as number of page ranges). +CREATE INDEX ON test2 USING brin (a) WITH (pages_per_range=1) WHERE (a IS NULL); +ANALYZE test2; +-- Does the index have one summary of the relation? +SELECT (COUNT(*) = (SELECT relpages FROM pg_class WHERE relname = 'test2')) AS ranges_do_match + FROM generate_series((SELECT (lastrevmappage + 1) FROM brin_metapage_info(get_raw_page('test2_a_idx', 0))), + (SELECT (relpages - 1) FROM pg_class WHERE relname = 'test2_a_idx')) AS pages(p), + LATERAL brin_page_items(get_raw_page('test2_a_idx', p), 'test2_a_idx') AS items; + ranges_do_match +----------------- + t +(1 row) + DROP TABLE test1; +DROP TABLE test2; +-- Test that parallel index build produces the same BRIN index as serial build. +CREATE TABLE brin_parallel_test (a int, b text, c bigint) WITH (fillfactor=40); +-- Generate a table with a mix of NULLs and non-NULL values (and data suitable +-- for the different opclasses we build later). +INSERT INTO brin_parallel_test +SELECT (CASE WHEN (mod(i,231) = 0) OR (i BETWEEN 3500 AND 4000) THEN NULL ELSE i END), + (CASE WHEN (mod(i,233) = 0) OR (i BETWEEN 3750 AND 4250) THEN NULL ELSE encode(sha256(i::text::bytea), 'hex') END), + (CASE WHEN (mod(i,233) = 0) OR (i BETWEEN 3850 AND 4500) THEN NULL ELSE (i/100) + mod(i,8) END) + FROM generate_series(1,5000) S(i); +-- Build an index with different opclasses - minmax, bloom and minmax-multi. +-- +-- For minmax and opclass this is simple, but for minmax-multi we need to be +-- careful, because the result depends on the order in which values are added +-- to the summary, which in turn affects how are values merged etc. The order +-- of merging results from workers has similar effect. All those summaries +-- should produce correct query results, but it means we can't compare them +-- using equality (which is what EXCEPT does). To work around this issue, we +-- generated the data to only have very small number of distinct values per +-- range, so that no merging is needed. This makes the results deterministic. +-- build index without parallelism +SET max_parallel_maintenance_workers = 0; +CREATE INDEX brin_test_serial_idx ON brin_parallel_test + USING brin (a int4_minmax_ops, a int4_bloom_ops, b, c int8_minmax_multi_ops) + WITH (pages_per_range=7) + WHERE NOT (a BETWEEN 1000 and 1500); +-- build index using parallelism +-- +-- Set a couple parameters to force parallel build for small table. There's a +-- requirement for table size, so disable that. Also, plan_create_index_workers +-- assumes each worker will use work_mem=32MB for sorting (which works for btree, +-- but not really for BRIN), so we set maintenance_work_mem for 4 workers. +SET min_parallel_table_scan_size = 0; +SET max_parallel_maintenance_workers = 4; +SET maintenance_work_mem = '128MB'; +CREATE INDEX brin_test_parallel_idx ON brin_parallel_test + USING brin (a int4_minmax_ops, a int4_bloom_ops, b, c int8_minmax_multi_ops) + WITH (pages_per_range=7) + WHERE NOT (a BETWEEN 1000 and 1500); +SELECT relname, relpages + FROM pg_class + WHERE relname IN ('brin_test_serial_idx', 'brin_test_parallel_idx') + ORDER BY relname; + relname | relpages +------------------------+---------- + brin_test_parallel_idx | 4 + brin_test_serial_idx | 4 +(2 rows) + +-- Check that (A except B) and (B except A) is empty, which means the indexes +-- are the same. +SELECT * FROM brin_page_items(get_raw_page('brin_test_parallel_idx', 2), 'brin_test_parallel_idx') +EXCEPT +SELECT * FROM brin_page_items(get_raw_page('brin_test_serial_idx', 2), 'brin_test_serial_idx'); + itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | empty | value +------------+--------+--------+----------+----------+-------------+-------+------- +(0 rows) + +SELECT * FROM brin_page_items(get_raw_page('brin_test_serial_idx', 2), 'brin_test_serial_idx') +EXCEPT +SELECT * FROM brin_page_items(get_raw_page('brin_test_parallel_idx', 2), 'brin_test_parallel_idx'); + itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | empty | value +------------+--------+--------+----------+----------+-------------+-------+------- +(0 rows) + +DROP INDEX brin_test_parallel_idx; +-- force parallel build, but don't allow starting parallel workers to force +-- fallback to serial build, and repeat the checks +SET max_parallel_workers = 0; +CREATE INDEX brin_test_parallel_idx ON brin_parallel_test + USING brin (a int4_minmax_ops, a int4_bloom_ops, b, c int8_minmax_multi_ops) + WITH (pages_per_range=7) + WHERE NOT (a BETWEEN 1000 and 1500); +SELECT relname, relpages + FROM pg_class + WHERE relname IN ('brin_test_serial_idx', 'brin_test_parallel_idx') + ORDER BY relname; + relname | relpages +------------------------+---------- + brin_test_parallel_idx | 4 + brin_test_serial_idx | 4 +(2 rows) + +SELECT * FROM brin_page_items(get_raw_page('brin_test_parallel_idx', 2), 'brin_test_parallel_idx') +EXCEPT +SELECT * FROM brin_page_items(get_raw_page('brin_test_serial_idx', 2), 'brin_test_serial_idx'); + itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | empty | value +------------+--------+--------+----------+----------+-------------+-------+------- +(0 rows) + +SELECT * FROM brin_page_items(get_raw_page('brin_test_serial_idx', 2), 'brin_test_serial_idx') +EXCEPT +SELECT * FROM brin_page_items(get_raw_page('brin_test_parallel_idx', 2), 'brin_test_parallel_idx'); + itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | empty | value +------------+--------+--------+----------+----------+-------------+-------+------- +(0 rows) + +DROP TABLE brin_parallel_test; +RESET min_parallel_table_scan_size; +RESET max_parallel_maintenance_workers; +RESET maintenance_work_mem; diff --git a/contrib/pageinspect/expected/gist.out b/contrib/pageinspect/expected/gist.out index d1adbab8ae2d1..2b1d54a627949 100644 --- a/contrib/pageinspect/expected/gist.out +++ b/contrib/pageinspect/expected/gist.out @@ -1,13 +1,6 @@ --- The gist_page_opaque_info() function prints the page's LSN. Normally, --- that's constant 1 (GistBuildLSN) on every page of a freshly built GiST --- index. But with wal_level=minimal, the whole relation is dumped to WAL at --- the end of the transaction if it's smaller than wal_skip_threshold, which --- updates the LSNs. Wrap the tests on gist_page_opaque_info() in the --- same transaction with the CREATE INDEX so that we see the LSNs before --- they are possibly overwritten at end of transaction. -BEGIN; --- Create a test table and GiST index. -CREATE TABLE test_gist AS SELECT point(i,i) p, i::text t FROM +-- The gist_page_opaque_info() function prints the page's LSN. +-- Use an unlogged index, so that the LSN is predictable. +CREATE UNLOGGED TABLE test_gist AS SELECT point(i,i) p, i::text t FROM generate_series(1,1000) i; CREATE INDEX test_gist_idx ON test_gist USING gist (p); -- Page 0 is the root, the rest are leaf pages @@ -29,7 +22,6 @@ SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 2)); 0/1 | 0/0 | 1 | {leaf} (1 row) -COMMIT; SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 0), 'test_gist_idx'); itemoffset | ctid | itemlen | dead | keys ------------+-----------+---------+------+------------------------------- diff --git a/contrib/pageinspect/expected/hash.out b/contrib/pageinspect/expected/hash.out index 5d6a5188345f9..ea387a6814376 100644 --- a/contrib/pageinspect/expected/hash.out +++ b/contrib/pageinspect/expected/hash.out @@ -1,6 +1,8 @@ CREATE TABLE test_hash (a int, b text); INSERT INTO test_hash VALUES (1, 'one'); CREATE INDEX test_hash_a_idx ON test_hash USING hash (a); +CREATE TABLE test_hash_part (a int, b int) PARTITION BY RANGE (a); +CREATE INDEX test_hash_part_idx ON test_hash_part USING hash(b); \x SELECT hash_page_type(get_raw_page('test_hash_a_idx', 0)); -[ RECORD 1 ]--+--------- @@ -44,6 +46,8 @@ SELECT * FROM hash_bitmap_info('test_hash_a_idx', 5); ERROR: invalid overflow block number 5 SELECT * FROM hash_bitmap_info('test_hash_a_idx', 6); ERROR: block number 6 is out of range for relation "test_hash_a_idx" +SELECT * FROM hash_bitmap_info('test_hash_part_idx', 1); -- error +ERROR: "test_hash_part_idx" is not a hash index SELECT magic, version, ntuples, bsize, bmsize, bmshift, maxbucket, highmask, lowmask, ovflpoint, firstfree, nmaps, procid, spares, mapp FROM hash_metapage_info(get_raw_page('test_hash_a_idx', 0)); @@ -203,3 +207,4 @@ SELECT hash_page_type(decode(repeat('00', :block_size), 'hex')); hash_page_type | unused DROP TABLE test_hash; +DROP TABLE test_hash_part; diff --git a/contrib/pageinspect/expected/oldextversions.out b/contrib/pageinspect/expected/oldextversions.out index f5c4b61bd793f..2910891ece71c 100644 --- a/contrib/pageinspect/expected/oldextversions.out +++ b/contrib/pageinspect/expected/oldextversions.out @@ -52,5 +52,19 @@ SELECT pagesize, version FROM page_header(get_raw_page('test1', 0)); 8192 | 4 (1 row) +-- brin_page_items() added a new "empty" flag in 1.12, make sure we detect +-- an old function definition +ALTER EXTENSION pageinspect UPDATE TO '1.11'; +CREATE INDEX test_1_a_brin_idx ON test1 USING BRIN (a); +SELECT * FROM brin_page_items(get_raw_page('test_1_a_brin_idx', 2), 'test_1_a_brin_idx'); +ERROR: function has wrong number of declared columns +HINT: To resolve the problem, update the "pageinspect" extension to the latest version. +ALTER EXTENSION pageinspect UPDATE TO '1.12'; +SELECT * FROM brin_page_items(get_raw_page('test_1_a_brin_idx', 2), 'test_1_a_brin_idx'); + itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | empty | value +------------+--------+--------+----------+----------+-------------+-------+------------------------------------------ + 1 | 0 | 1 | f | f | f | f | {72057594037927937 .. 72057594037927937} +(1 row) + DROP TABLE test1; DROP EXTENSION pageinspect; diff --git a/contrib/pageinspect/expected/page.out b/contrib/pageinspect/expected/page.out index 80ddb45a60ac0..3fd3869c82a15 100644 --- a/contrib/pageinspect/expected/page.out +++ b/contrib/pageinspect/expected/page.out @@ -239,3 +239,13 @@ SELECT page_checksum(decode(repeat('00', :block_size), 'hex'), 1); (1 row) +-- tests for sequences +create sequence test_sequence start 72057594037927937; +select tuple_data_split('test_sequence'::regclass, t_data, t_infomask, t_infomask2, t_bits) + from heap_page_items(get_raw_page('test_sequence', 0)); + tuple_data_split +------------------------------------------------------- + {"\\x0100000000000001","\\x0000000000000000","\\x00"} +(1 row) + +drop sequence test_sequence; diff --git a/contrib/pageinspect/fsmfuncs.c b/contrib/pageinspect/fsmfuncs.c index 23b192bf92355..f8ae08862445b 100644 --- a/contrib/pageinspect/fsmfuncs.c +++ b/contrib/pageinspect/fsmfuncs.c @@ -9,7 +9,7 @@ * there's hardly any use case for using these without superuser-rights * anyway. * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pageinspect/fsmfuncs.c diff --git a/contrib/pageinspect/ginfuncs.c b/contrib/pageinspect/ginfuncs.c index 0f846988dff80..1dabbdb588972 100644 --- a/contrib/pageinspect/ginfuncs.c +++ b/contrib/pageinspect/ginfuncs.c @@ -2,7 +2,7 @@ * ginfuncs.c * Functions to investigate the content of GIN indexes * - * Copyright (c) 2014-2023, PostgreSQL Global Development Group + * Copyright (c) 2014-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pageinspect/ginfuncs.c diff --git a/contrib/pageinspect/gistfuncs.c b/contrib/pageinspect/gistfuncs.c index 5512b00f02a38..b38f1d32f761e 100644 --- a/contrib/pageinspect/gistfuncs.c +++ b/contrib/pageinspect/gistfuncs.c @@ -2,7 +2,7 @@ * gistfuncs.c * Functions to investigate the content of GiST indexes * - * Copyright (c) 2014-2023, PostgreSQL Global Development Group + * Copyright (c) 2014-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pageinspect/gistfuncs.c @@ -21,8 +21,8 @@ #include "storage/itemptr.h" #include "utils/array.h" #include "utils/builtins.h" -#include "utils/pg_lsn.h" #include "utils/lsyscache.h" +#include "utils/pg_lsn.h" #include "utils/rel.h" #include "utils/ruleutils.h" #include "utils/varlena.h" diff --git a/contrib/pageinspect/hashfuncs.c b/contrib/pageinspect/hashfuncs.c index f43f0928b11de..d4f827a7e2d91 100644 --- a/contrib/pageinspect/hashfuncs.c +++ b/contrib/pageinspect/hashfuncs.c @@ -2,7 +2,7 @@ * hashfuncs.c * Functions to investigate the content of HASH indexes * - * Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Copyright (c) 2017-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pageinspect/hashfuncs.c @@ -12,6 +12,7 @@ #include "access/hash.h" #include "access/htup_details.h" +#include "access/relation.h" #include "catalog/pg_am.h" #include "catalog/pg_type.h" #include "funcapi.h" @@ -27,6 +28,7 @@ PG_FUNCTION_INFO_V1(hash_page_items); PG_FUNCTION_INFO_V1(hash_bitmap_info); PG_FUNCTION_INFO_V1(hash_metapage_info); +#define IS_INDEX(r) ((r)->rd_rel->relkind == RELKIND_INDEX) #define IS_HASH(r) ((r)->rd_rel->relam == HASH_AM_OID) /* ------------------------------------------------ @@ -413,9 +415,9 @@ hash_bitmap_info(PG_FUNCTION_ARGS) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be superuser to use raw page functions"))); - indexRel = index_open(indexRelid, AccessShareLock); + indexRel = relation_open(indexRelid, AccessShareLock); - if (!IS_HASH(indexRel)) + if (!IS_INDEX(indexRel) || !IS_HASH(indexRel)) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("\"%s\" is not a %s index", diff --git a/contrib/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c index 0f0252558c5c4..9fc5f815fda9d 100644 --- a/contrib/pageinspect/heapfuncs.c +++ b/contrib/pageinspect/heapfuncs.c @@ -15,7 +15,7 @@ * there's hardly any use case for using these without superuser-rights * anyway. * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pageinspect/heapfuncs.c @@ -212,11 +212,8 @@ heap_page_items(PG_FUNCTION_ARGS) lp_offset + lp_len <= raw_page_size) { HeapTupleHeader tuphdr; - bytea *tuple_data_bytea; - int tuple_data_len; /* Extract information from the tuple header */ - tuphdr = (HeapTupleHeader) PageGetItem(page, id); values[4] = UInt32GetDatum(HeapTupleHeaderGetRawXmin(tuphdr)); @@ -228,31 +225,32 @@ heap_page_items(PG_FUNCTION_ARGS) values[9] = UInt32GetDatum(tuphdr->t_infomask); values[10] = UInt8GetDatum(tuphdr->t_hoff); - /* Copy raw tuple data into bytea attribute */ - tuple_data_len = lp_len - tuphdr->t_hoff; - tuple_data_bytea = (bytea *) palloc(tuple_data_len + VARHDRSZ); - SET_VARSIZE(tuple_data_bytea, tuple_data_len + VARHDRSZ); - memcpy(VARDATA(tuple_data_bytea), (char *) tuphdr + tuphdr->t_hoff, - tuple_data_len); - values[13] = PointerGetDatum(tuple_data_bytea); - /* * We already checked that the item is completely within the raw * page passed to us, with the length given in the line pointer. - * Let's check that t_hoff doesn't point over lp_len, before using - * it to access t_bits and oid. + * But t_hoff could be out of range, so check it before relying on + * it to fetch additional info. */ if (tuphdr->t_hoff >= SizeofHeapTupleHeader && tuphdr->t_hoff <= lp_len && tuphdr->t_hoff == MAXALIGN(tuphdr->t_hoff)) { + int tuple_data_len; + bytea *tuple_data_bytea; + + /* Copy null bitmask and OID, if present */ if (tuphdr->t_infomask & HEAP_HASNULL) { - int bits_len; - - bits_len = - BITMAPLEN(HeapTupleHeaderGetNatts(tuphdr)) * BITS_PER_BYTE; - values[11] = CStringGetTextDatum(bits_to_text(tuphdr->t_bits, bits_len)); + int bitmaplen; + + bitmaplen = BITMAPLEN(HeapTupleHeaderGetNatts(tuphdr)); + /* better range-check the attribute count, too */ + if (bitmaplen <= tuphdr->t_hoff - SizeofHeapTupleHeader) + values[11] = + CStringGetTextDatum(bits_to_text(tuphdr->t_bits, + bitmaplen * BITS_PER_BYTE)); + else + nulls[11] = true; } else nulls[11] = true; @@ -261,11 +259,22 @@ heap_page_items(PG_FUNCTION_ARGS) values[12] = HeapTupleHeaderGetOidOld(tuphdr); else nulls[12] = true; + + /* Copy raw tuple data into bytea attribute */ + tuple_data_len = lp_len - tuphdr->t_hoff; + tuple_data_bytea = (bytea *) palloc(tuple_data_len + VARHDRSZ); + SET_VARSIZE(tuple_data_bytea, tuple_data_len + VARHDRSZ); + if (tuple_data_len > 0) + memcpy(VARDATA(tuple_data_bytea), + (char *) tuphdr + tuphdr->t_hoff, + tuple_data_len); + values[13] = PointerGetDatum(tuple_data_bytea); } else { nulls[11] = true; nulls[12] = true; + nulls[13] = true; } } else @@ -320,7 +329,11 @@ tuple_data_split_internal(Oid relid, char *tupdata, raw_attrs = initArrayResult(BYTEAOID, CurrentMemoryContext, false); nattrs = tupdesc->natts; - if (rel->rd_rel->relam != HEAP_TABLE_AM_OID) + /* + * Sequences always use heap AM, but they don't show that in the catalogs. + */ + if (rel->rd_rel->relkind != RELKIND_SEQUENCE && + rel->rd_rel->relam != HEAP_TABLE_AM_OID) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("only heap AM is supported"))); diff --git a/contrib/pageinspect/meson.build b/contrib/pageinspect/meson.build index 4dde4e75fe001..27a007c1df3a6 100644 --- a/contrib/pageinspect/meson.build +++ b/contrib/pageinspect/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pageinspect_sources = files( 'brinfuncs.c', diff --git a/contrib/pageinspect/pageinspect.h b/contrib/pageinspect/pageinspect.h index 3f0fe7ea2ea9d..209163a8c8152 100644 --- a/contrib/pageinspect/pageinspect.h +++ b/contrib/pageinspect/pageinspect.h @@ -3,7 +3,7 @@ * pageinspect.h * Common functions for pageinspect. * - * Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Copyright (c) 2017-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pageinspect/pageinspect.h diff --git a/contrib/pageinspect/rawpage.c b/contrib/pageinspect/rawpage.c index b25a63cbd62ea..2800ebd62f5fc 100644 --- a/contrib/pageinspect/rawpage.c +++ b/contrib/pageinspect/rawpage.c @@ -5,7 +5,7 @@ * * Access-method specific inspection functions are in separate files. * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pageinspect/rawpage.c diff --git a/contrib/pageinspect/sql/brin.sql b/contrib/pageinspect/sql/brin.sql index 96b4645187e0e..4edf17b5a4510 100644 --- a/contrib/pageinspect/sql/brin.sql +++ b/contrib/pageinspect/sql/brin.sql @@ -36,4 +36,109 @@ SELECT brin_page_items(decode(repeat('00', :block_size), 'hex'), 'test1_a_idx'); SELECT brin_metapage_info(decode(repeat('00', :block_size), 'hex')); SELECT brin_revmap_data(decode(repeat('00', :block_size), 'hex')); +-- Test that partial indexes have all pages, including empty ones. +CREATE TABLE test2 (a int); +INSERT INTO test2 SELECT i FROM generate_series(1,1000) s(i); + +-- No rows match the index predicate, make sure the index has the right number +-- of ranges (same as number of page ranges). +CREATE INDEX ON test2 USING brin (a) WITH (pages_per_range=1) WHERE (a IS NULL); + +ANALYZE test2; + +-- Does the index have one summary of the relation? +SELECT (COUNT(*) = (SELECT relpages FROM pg_class WHERE relname = 'test2')) AS ranges_do_match + FROM generate_series((SELECT (lastrevmappage + 1) FROM brin_metapage_info(get_raw_page('test2_a_idx', 0))), + (SELECT (relpages - 1) FROM pg_class WHERE relname = 'test2_a_idx')) AS pages(p), + LATERAL brin_page_items(get_raw_page('test2_a_idx', p), 'test2_a_idx') AS items; + DROP TABLE test1; +DROP TABLE test2; + +-- Test that parallel index build produces the same BRIN index as serial build. +CREATE TABLE brin_parallel_test (a int, b text, c bigint) WITH (fillfactor=40); + +-- Generate a table with a mix of NULLs and non-NULL values (and data suitable +-- for the different opclasses we build later). +INSERT INTO brin_parallel_test +SELECT (CASE WHEN (mod(i,231) = 0) OR (i BETWEEN 3500 AND 4000) THEN NULL ELSE i END), + (CASE WHEN (mod(i,233) = 0) OR (i BETWEEN 3750 AND 4250) THEN NULL ELSE encode(sha256(i::text::bytea), 'hex') END), + (CASE WHEN (mod(i,233) = 0) OR (i BETWEEN 3850 AND 4500) THEN NULL ELSE (i/100) + mod(i,8) END) + FROM generate_series(1,5000) S(i); + +-- Build an index with different opclasses - minmax, bloom and minmax-multi. +-- +-- For minmax and opclass this is simple, but for minmax-multi we need to be +-- careful, because the result depends on the order in which values are added +-- to the summary, which in turn affects how are values merged etc. The order +-- of merging results from workers has similar effect. All those summaries +-- should produce correct query results, but it means we can't compare them +-- using equality (which is what EXCEPT does). To work around this issue, we +-- generated the data to only have very small number of distinct values per +-- range, so that no merging is needed. This makes the results deterministic. + +-- build index without parallelism +SET max_parallel_maintenance_workers = 0; +CREATE INDEX brin_test_serial_idx ON brin_parallel_test + USING brin (a int4_minmax_ops, a int4_bloom_ops, b, c int8_minmax_multi_ops) + WITH (pages_per_range=7) + WHERE NOT (a BETWEEN 1000 and 1500); + +-- build index using parallelism +-- +-- Set a couple parameters to force parallel build for small table. There's a +-- requirement for table size, so disable that. Also, plan_create_index_workers +-- assumes each worker will use work_mem=32MB for sorting (which works for btree, +-- but not really for BRIN), so we set maintenance_work_mem for 4 workers. +SET min_parallel_table_scan_size = 0; +SET max_parallel_maintenance_workers = 4; +SET maintenance_work_mem = '128MB'; +CREATE INDEX brin_test_parallel_idx ON brin_parallel_test + USING brin (a int4_minmax_ops, a int4_bloom_ops, b, c int8_minmax_multi_ops) + WITH (pages_per_range=7) + WHERE NOT (a BETWEEN 1000 and 1500); + +SELECT relname, relpages + FROM pg_class + WHERE relname IN ('brin_test_serial_idx', 'brin_test_parallel_idx') + ORDER BY relname; + +-- Check that (A except B) and (B except A) is empty, which means the indexes +-- are the same. + +SELECT * FROM brin_page_items(get_raw_page('brin_test_parallel_idx', 2), 'brin_test_parallel_idx') +EXCEPT +SELECT * FROM brin_page_items(get_raw_page('brin_test_serial_idx', 2), 'brin_test_serial_idx'); + +SELECT * FROM brin_page_items(get_raw_page('brin_test_serial_idx', 2), 'brin_test_serial_idx') +EXCEPT +SELECT * FROM brin_page_items(get_raw_page('brin_test_parallel_idx', 2), 'brin_test_parallel_idx'); + +DROP INDEX brin_test_parallel_idx; + +-- force parallel build, but don't allow starting parallel workers to force +-- fallback to serial build, and repeat the checks + +SET max_parallel_workers = 0; +CREATE INDEX brin_test_parallel_idx ON brin_parallel_test + USING brin (a int4_minmax_ops, a int4_bloom_ops, b, c int8_minmax_multi_ops) + WITH (pages_per_range=7) + WHERE NOT (a BETWEEN 1000 and 1500); + +SELECT relname, relpages + FROM pg_class + WHERE relname IN ('brin_test_serial_idx', 'brin_test_parallel_idx') + ORDER BY relname; + +SELECT * FROM brin_page_items(get_raw_page('brin_test_parallel_idx', 2), 'brin_test_parallel_idx') +EXCEPT +SELECT * FROM brin_page_items(get_raw_page('brin_test_serial_idx', 2), 'brin_test_serial_idx'); + +SELECT * FROM brin_page_items(get_raw_page('brin_test_serial_idx', 2), 'brin_test_serial_idx') +EXCEPT +SELECT * FROM brin_page_items(get_raw_page('brin_test_parallel_idx', 2), 'brin_test_parallel_idx'); + +DROP TABLE brin_parallel_test; +RESET min_parallel_table_scan_size; +RESET max_parallel_maintenance_workers; +RESET maintenance_work_mem; diff --git a/contrib/pageinspect/sql/gist.sql b/contrib/pageinspect/sql/gist.sql index d263542ba1580..85bc44b8000b6 100644 --- a/contrib/pageinspect/sql/gist.sql +++ b/contrib/pageinspect/sql/gist.sql @@ -1,14 +1,6 @@ --- The gist_page_opaque_info() function prints the page's LSN. Normally, --- that's constant 1 (GistBuildLSN) on every page of a freshly built GiST --- index. But with wal_level=minimal, the whole relation is dumped to WAL at --- the end of the transaction if it's smaller than wal_skip_threshold, which --- updates the LSNs. Wrap the tests on gist_page_opaque_info() in the --- same transaction with the CREATE INDEX so that we see the LSNs before --- they are possibly overwritten at end of transaction. -BEGIN; - --- Create a test table and GiST index. -CREATE TABLE test_gist AS SELECT point(i,i) p, i::text t FROM +-- The gist_page_opaque_info() function prints the page's LSN. +-- Use an unlogged index, so that the LSN is predictable. +CREATE UNLOGGED TABLE test_gist AS SELECT point(i,i) p, i::text t FROM generate_series(1,1000) i; CREATE INDEX test_gist_idx ON test_gist USING gist (p); @@ -17,8 +9,6 @@ SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 0)); SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 1)); SELECT * FROM gist_page_opaque_info(get_raw_page('test_gist_idx', 2)); -COMMIT; - SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 0), 'test_gist_idx'); SELECT * FROM gist_page_items(get_raw_page('test_gist_idx', 1), 'test_gist_idx') LIMIT 5; diff --git a/contrib/pageinspect/sql/hash.sql b/contrib/pageinspect/sql/hash.sql index 320fb9fa9f198..e4b9e975f8a4c 100644 --- a/contrib/pageinspect/sql/hash.sql +++ b/contrib/pageinspect/sql/hash.sql @@ -2,6 +2,9 @@ CREATE TABLE test_hash (a int, b text); INSERT INTO test_hash VALUES (1, 'one'); CREATE INDEX test_hash_a_idx ON test_hash USING hash (a); +CREATE TABLE test_hash_part (a int, b int) PARTITION BY RANGE (a); +CREATE INDEX test_hash_part_idx ON test_hash_part USING hash(b); + \x SELECT hash_page_type(get_raw_page('test_hash_a_idx', 0)); @@ -21,6 +24,7 @@ SELECT * FROM hash_bitmap_info('test_hash_a_idx', 3); SELECT * FROM hash_bitmap_info('test_hash_a_idx', 4); SELECT * FROM hash_bitmap_info('test_hash_a_idx', 5); SELECT * FROM hash_bitmap_info('test_hash_a_idx', 6); +SELECT * FROM hash_bitmap_info('test_hash_part_idx', 1); -- error SELECT magic, version, ntuples, bsize, bmsize, bmshift, maxbucket, highmask, @@ -106,3 +110,4 @@ SELECT hash_page_stats(decode(repeat('00', :block_size), 'hex')); SELECT hash_page_type(decode(repeat('00', :block_size), 'hex')); DROP TABLE test_hash; +DROP TABLE test_hash_part; diff --git a/contrib/pageinspect/sql/oldextversions.sql b/contrib/pageinspect/sql/oldextversions.sql index 9f953492c23c3..44f564faec960 100644 --- a/contrib/pageinspect/sql/oldextversions.sql +++ b/contrib/pageinspect/sql/oldextversions.sql @@ -22,5 +22,14 @@ ALTER EXTENSION pageinspect UPDATE TO '1.9'; \df page_header SELECT pagesize, version FROM page_header(get_raw_page('test1', 0)); +-- brin_page_items() added a new "empty" flag in 1.12, make sure we detect +-- an old function definition +ALTER EXTENSION pageinspect UPDATE TO '1.11'; +CREATE INDEX test_1_a_brin_idx ON test1 USING BRIN (a); +SELECT * FROM brin_page_items(get_raw_page('test_1_a_brin_idx', 2), 'test_1_a_brin_idx'); + +ALTER EXTENSION pageinspect UPDATE TO '1.12'; +SELECT * FROM brin_page_items(get_raw_page('test_1_a_brin_idx', 2), 'test_1_a_brin_idx'); + DROP TABLE test1; DROP EXTENSION pageinspect; diff --git a/contrib/pageinspect/sql/page.sql b/contrib/pageinspect/sql/page.sql index 5bff568d3b5f8..346e4ee142c2b 100644 --- a/contrib/pageinspect/sql/page.sql +++ b/contrib/pageinspect/sql/page.sql @@ -98,3 +98,9 @@ SHOW block_size \gset SELECT fsm_page_contents(decode(repeat('00', :block_size), 'hex')); SELECT page_header(decode(repeat('00', :block_size), 'hex')); SELECT page_checksum(decode(repeat('00', :block_size), 'hex'), 1); + +-- tests for sequences +create sequence test_sequence start 72057594037927937; +select tuple_data_split('test_sequence'::regclass, t_data, t_infomask, t_infomask2, t_bits) + from heap_page_items(get_raw_page('test_sequence', 0)); +drop sequence test_sequence; diff --git a/contrib/passwordcheck/expected/passwordcheck_1.out b/contrib/passwordcheck/expected/passwordcheck_1.out new file mode 100644 index 0000000000000..5d8d5dcc1c21b --- /dev/null +++ b/contrib/passwordcheck/expected/passwordcheck_1.out @@ -0,0 +1,18 @@ +LOAD 'passwordcheck'; +CREATE USER regress_passwordcheck_user1; +-- ok +ALTER USER regress_passwordcheck_user1 PASSWORD 'a_nice_long_password'; +-- error: too short +ALTER USER regress_passwordcheck_user1 PASSWORD 'tooshrt'; +ERROR: password is too short +-- error: contains user name +ALTER USER regress_passwordcheck_user1 PASSWORD 'xyzregress_passwordcheck_user1'; +ERROR: password must not contain user name +-- error: contains only letters +ALTER USER regress_passwordcheck_user1 PASSWORD 'alessnicelongpassword'; +ERROR: password must contain both letters and nonletters +-- encrypted ok (password is "secret") +ALTER USER regress_passwordcheck_user1 PASSWORD 'md592350e12ac34e52dd598f90893bb3ae7'; +-- error: password is user name +ALTER USER regress_passwordcheck_user1 PASSWORD 'md507a112732ed9f2087fa90b192d44e358'; +DROP USER regress_passwordcheck_user1; diff --git a/contrib/passwordcheck/meson.build b/contrib/passwordcheck/meson.build index 8bde1de0ec57e..b15a8b9fd6044 100644 --- a/contrib/passwordcheck/meson.build +++ b/contrib/passwordcheck/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group passwordcheck_sources = files( 'passwordcheck.c', diff --git a/contrib/passwordcheck/passwordcheck.c b/contrib/passwordcheck/passwordcheck.c index ae4a0abe2e3c8..0785618f2abbe 100644 --- a/contrib/passwordcheck/passwordcheck.c +++ b/contrib/passwordcheck/passwordcheck.c @@ -3,7 +3,7 @@ * passwordcheck.c * * - * Copyright (c) 2009-2023, PostgreSQL Global Development Group + * Copyright (c) 2009-2024, PostgreSQL Global Development Group * * Author: Laurenz Albe * diff --git a/contrib/pg_buffercache/Makefile b/contrib/pg_buffercache/Makefile index d6b58d4da94ab..eae65ead9e502 100644 --- a/contrib/pg_buffercache/Makefile +++ b/contrib/pg_buffercache/Makefile @@ -8,7 +8,7 @@ OBJS = \ EXTENSION = pg_buffercache DATA = pg_buffercache--1.2.sql pg_buffercache--1.2--1.3.sql \ pg_buffercache--1.1--1.2.sql pg_buffercache--1.0--1.1.sql \ - pg_buffercache--1.3--1.4.sql + pg_buffercache--1.3--1.4.sql pg_buffercache--1.4--1.5.sql PGFILEDESC = "pg_buffercache - monitoring of shared buffer cache in real-time" REGRESS = pg_buffercache diff --git a/contrib/pg_buffercache/meson.build b/contrib/pg_buffercache/meson.build index c51edf37d15b4..1ca3452918bbc 100644 --- a/contrib/pg_buffercache/meson.build +++ b/contrib/pg_buffercache/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_buffercache_sources = files( 'pg_buffercache_pages.c', @@ -22,6 +22,7 @@ install_data( 'pg_buffercache--1.2--1.3.sql', 'pg_buffercache--1.2.sql', 'pg_buffercache--1.3--1.4.sql', + 'pg_buffercache--1.4--1.5.sql', 'pg_buffercache.control', kwargs: contrib_data_args, ) diff --git a/contrib/pg_buffercache/pg_buffercache--1.4--1.5.sql b/contrib/pg_buffercache/pg_buffercache--1.4--1.5.sql new file mode 100644 index 0000000000000..0fb18ff786de0 --- /dev/null +++ b/contrib/pg_buffercache/pg_buffercache--1.4--1.5.sql @@ -0,0 +1,6 @@ +\echo Use "ALTER EXTENSION pg_buffercache UPDATE TO '1.5'" to load this file. \quit + +CREATE FUNCTION pg_buffercache_evict(IN int) +RETURNS bool +AS 'MODULE_PATHNAME', 'pg_buffercache_evict' +LANGUAGE C PARALLEL SAFE VOLATILE STRICT; diff --git a/contrib/pg_buffercache/pg_buffercache.control b/contrib/pg_buffercache/pg_buffercache.control index a82ae5f9bb536..5ee875f77dd90 100644 --- a/contrib/pg_buffercache/pg_buffercache.control +++ b/contrib/pg_buffercache/pg_buffercache.control @@ -1,5 +1,5 @@ # pg_buffercache extension comment = 'examine the shared buffer cache' -default_version = '1.4' +default_version = '1.5' module_pathname = '$libdir/pg_buffercache' relocatable = true diff --git a/contrib/pg_buffercache/pg_buffercache_pages.c b/contrib/pg_buffercache/pg_buffercache_pages.c index 3316732365365..3ae0a018e103c 100644 --- a/contrib/pg_buffercache/pg_buffercache_pages.c +++ b/contrib/pg_buffercache/pg_buffercache_pages.c @@ -63,6 +63,7 @@ typedef struct PG_FUNCTION_INFO_V1(pg_buffercache_pages); PG_FUNCTION_INFO_V1(pg_buffercache_summary); PG_FUNCTION_INFO_V1(pg_buffercache_usage_counts); +PG_FUNCTION_INFO_V1(pg_buffercache_evict); Datum pg_buffercache_pages(PG_FUNCTION_ARGS) @@ -347,3 +348,22 @@ pg_buffercache_usage_counts(PG_FUNCTION_ARGS) return (Datum) 0; } + +/* + * Try to evict a shared buffer. + */ +Datum +pg_buffercache_evict(PG_FUNCTION_ARGS) +{ + Buffer buf = PG_GETARG_INT32(0); + + if (!superuser()) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to use pg_buffercache_evict function"))); + + if (buf < 1 || buf > NBuffers) + elog(ERROR, "bad buffer ID: %d", buf); + + PG_RETURN_BOOL(EvictUnpinnedBuffer(buf)); +} diff --git a/contrib/pg_freespacemap/meson.build b/contrib/pg_freespacemap/meson.build index a91dc45334366..af5d2b8c27c88 100644 --- a/contrib/pg_freespacemap/meson.build +++ b/contrib/pg_freespacemap/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_freespacemap_sources = files( 'pg_freespacemap.c', diff --git a/contrib/pg_freespacemap/pg_freespacemap.c b/contrib/pg_freespacemap/pg_freespacemap.c index b82cab2d97ef4..2de3c764e7940 100644 --- a/contrib/pg_freespacemap/pg_freespacemap.c +++ b/contrib/pg_freespacemap/pg_freespacemap.c @@ -11,6 +11,7 @@ #include "access/relation.h" #include "funcapi.h" #include "storage/freespace.h" +#include "utils/rel.h" PG_MODULE_MAGIC; @@ -30,6 +31,13 @@ pg_freespace(PG_FUNCTION_ARGS) rel = relation_open(relid, AccessShareLock); + if (!RELKIND_HAS_STORAGE(rel->rd_rel->relkind)) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("relation \"%s\" does not have storage", + RelationGetRelationName(rel)), + errdetail_relkind_not_supported(rel->rd_rel->relkind))); + if (blkno < 0 || blkno > MaxBlockNumber) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), diff --git a/contrib/pg_prewarm/autoprewarm.c b/contrib/pg_prewarm/autoprewarm.c index 93835449c0ec9..d061731706ac0 100644 --- a/contrib/pg_prewarm/autoprewarm.c +++ b/contrib/pg_prewarm/autoprewarm.c @@ -16,7 +16,7 @@ * relevant database in turn. The former keeps running after the * initial prewarm is complete to update the dump file periodically. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pg_prewarm/autoprewarm.c @@ -32,12 +32,12 @@ #include "access/xact.h" #include "catalog/pg_class.h" #include "catalog/pg_type.h" -#include "miscadmin.h" #include "pgstat.h" #include "postmaster/bgworker.h" #include "postmaster/interrupt.h" #include "storage/buf_internals.h" #include "storage/dsm.h" +#include "storage/dsm_registry.h" #include "storage/fd.h" #include "storage/ipc.h" #include "storage/latch.h" @@ -95,8 +95,6 @@ static void apw_start_database_worker(void); static bool apw_init_shmem(void); static void apw_detach_shmem(int code, Datum arg); static int apw_compare_blockinfo(const void *p, const void *q); -static void autoprewarm_shmem_request(void); -static shmem_request_hook_type prev_shmem_request_hook = NULL; /* Pointer to shared-memory state. */ static AutoPrewarmSharedState *apw_state = NULL; @@ -140,26 +138,11 @@ _PG_init(void) MarkGUCPrefixReserved("pg_prewarm"); - prev_shmem_request_hook = shmem_request_hook; - shmem_request_hook = autoprewarm_shmem_request; - /* Register autoprewarm worker, if enabled. */ if (autoprewarm) apw_start_leader_worker(); } -/* - * Requests any additional shared memory required for autoprewarm. - */ -static void -autoprewarm_shmem_request(void) -{ - if (prev_shmem_request_hook) - prev_shmem_request_hook(); - - RequestAddinShmemSpace(MAXALIGN(sizeof(AutoPrewarmSharedState))); -} - /* * Main entry point for the leader autoprewarm process. Per-database workers * have a separate entry point. @@ -181,8 +164,14 @@ autoprewarm_main(Datum main_arg) if (apw_init_shmem()) first_time = false; - /* Set on-detach hook so that our PID will be cleared on exit. */ - on_shmem_exit(apw_detach_shmem, 0); + /* + * Set on-detach hook so that our PID will be cleared on exit. + * + * NB: Autoprewarm's state is stored in a DSM segment, and DSM segments + * are detached before calling the on_shmem_exit callbacks, so we must put + * apw_detach_shmem in the before_shmem_exit callback list. + */ + before_shmem_exit(apw_detach_shmem, 0); /* * Store our PID in the shared memory area --- unless there's already @@ -357,8 +346,8 @@ apw_load_buffers(void) FreeFile(file); /* Sort the blocks to be loaded. */ - pg_qsort(blkinfo, num_elements, sizeof(BlockInfoRecord), - apw_compare_blockinfo); + qsort(blkinfo, num_elements, sizeof(BlockInfoRecord), + apw_compare_blockinfo); /* Populate shared memory state. */ apw_state->block_info_handle = dsm_segment_handle(seg); @@ -767,6 +756,16 @@ autoprewarm_dump_now(PG_FUNCTION_ARGS) PG_RETURN_INT64((int64) num_blocks); } +static void +apw_init_state(void *ptr) +{ + AutoPrewarmSharedState *state = (AutoPrewarmSharedState *) ptr; + + LWLockInitialize(&state->lock, LWLockNewTrancheId()); + state->bgworker_pid = InvalidPid; + state->pid_using_dumpfile = InvalidPid; +} + /* * Allocate and initialize autoprewarm related shared memory, if not already * done, and set up backend-local pointer to that state. Returns true if an @@ -777,19 +776,10 @@ apw_init_shmem(void) { bool found; - LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE); - apw_state = ShmemInitStruct("autoprewarm", - sizeof(AutoPrewarmSharedState), - &found); - if (!found) - { - /* First time through ... */ - LWLockInitialize(&apw_state->lock, LWLockNewTrancheId()); - apw_state->bgworker_pid = InvalidPid; - apw_state->pid_using_dumpfile = InvalidPid; - } - LWLockRelease(AddinShmemInitLock); - + apw_state = GetNamedDSMSegment("autoprewarm", + sizeof(AutoPrewarmSharedState), + apw_init_state, + &found); LWLockRegisterTranche(apw_state->lock.tranche, "autoprewarm"); return found; @@ -841,7 +831,7 @@ apw_start_leader_worker(void) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_RESOURCES), errmsg("could not register background process"), - errhint("You may need to increase max_worker_processes."))); + errhint("You may need to increase \"max_worker_processes\"."))); status = WaitForBackgroundWorkerStartup(handle, &pid); if (status != BGWH_STARTED) @@ -877,7 +867,7 @@ apw_start_database_worker(void) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_RESOURCES), errmsg("registering dynamic bgworker autoprewarm failed"), - errhint("Consider increasing configuration parameter \"max_worker_processes\"."))); + errhint("Consider increasing the configuration parameter \"%s\".", "max_worker_processes"))); /* * Ignore return value; if it fails, postmaster has died, but we have diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build index b6ff9d20ebc07..da58f70a9f82c 100644 --- a/contrib/pg_prewarm/meson.build +++ b/contrib/pg_prewarm/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_prewarm_sources = files( 'autoprewarm.c', diff --git a/contrib/pg_prewarm/pg_prewarm.c b/contrib/pg_prewarm/pg_prewarm.c index e464d0d4d2bd1..5c859e983c5ca 100644 --- a/contrib/pg_prewarm/pg_prewarm.c +++ b/contrib/pg_prewarm/pg_prewarm.c @@ -3,7 +3,7 @@ * pg_prewarm.c * prewarming utilities * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pg_prewarm/pg_prewarm.c @@ -19,6 +19,7 @@ #include "fmgr.h" #include "miscadmin.h" #include "storage/bufmgr.h" +#include "storage/read_stream.h" #include "storage/smgr.h" #include "utils/acl.h" #include "utils/builtins.h" @@ -33,11 +34,30 @@ typedef enum { PREWARM_PREFETCH, PREWARM_READ, - PREWARM_BUFFER + PREWARM_BUFFER, } PrewarmType; static PGIOAlignedBlock blockbuffer; +struct pg_prewarm_read_stream_private +{ + BlockNumber blocknum; + int64 last_block; +}; + +static BlockNumber +pg_prewarm_read_stream_next_block(ReadStream *stream, + void *callback_private_data, + void *per_buffer_data) +{ + struct pg_prewarm_read_stream_private *p = callback_private_data; + + if (p->blocknum <= p->last_block) + return p->blocknum++; + + return InvalidBlockNumber; +} + /* * pg_prewarm(regclass, mode text, fork text, * first_block int8, last_block int8) @@ -183,18 +203,36 @@ pg_prewarm(PG_FUNCTION_ARGS) } else if (ptype == PREWARM_BUFFER) { + struct pg_prewarm_read_stream_private p; + ReadStream *stream; + /* * In buffer mode, we actually pull the data into shared_buffers. */ + + /* Set up the private state for our streaming buffer read callback. */ + p.blocknum = first_block; + p.last_block = last_block; + + stream = read_stream_begin_relation(READ_STREAM_FULL, + NULL, + rel, + forkNumber, + pg_prewarm_read_stream_next_block, + &p, + 0); + for (block = first_block; block <= last_block; ++block) { Buffer buf; CHECK_FOR_INTERRUPTS(); - buf = ReadBufferExtended(rel, forkNumber, block, RBM_NORMAL, NULL); + buf = read_stream_next_buffer(stream, NULL); ReleaseBuffer(buf); ++blocks_done; } + Assert(read_stream_next_buffer(stream, NULL) == InvalidBuffer); + read_stream_end(stream); } /* Close relation, release lock. */ diff --git a/contrib/pg_prewarm/t/001_basic.pl b/contrib/pg_prewarm/t/001_basic.pl index 6b7c869afc057..825d3448ee562 100644 --- a/contrib/pg_prewarm/t/001_basic.pl +++ b/contrib/pg_prewarm/t/001_basic.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -55,4 +55,10 @@ $node->stop; +# control file should indicate normal shut down +command_like( + [ 'pg_controldata', $node->data_dir() ], + qr/Database cluster state:\s*shut down/, + 'cluster shut down normally'); + done_testing(); diff --git a/contrib/pg_stat_statements/Makefile b/contrib/pg_stat_statements/Makefile index 5578a9dd4e351..72c7994bb3cdc 100644 --- a/contrib/pg_stat_statements/Makefile +++ b/contrib/pg_stat_statements/Makefile @@ -7,6 +7,7 @@ OBJS = \ EXTENSION = pg_stat_statements DATA = pg_stat_statements--1.4.sql \ + pg_stat_statements--1.10--1.11.sql \ pg_stat_statements--1.9--1.10.sql pg_stat_statements--1.8--1.9.sql \ pg_stat_statements--1.7--1.8.sql pg_stat_statements--1.6--1.7.sql \ pg_stat_statements--1.5--1.6.sql pg_stat_statements--1.4--1.5.sql \ @@ -18,11 +19,14 @@ LDFLAGS_SL += $(filter -lm, $(LIBS)) REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/pg_stat_statements/pg_stat_statements.conf REGRESS = select dml cursors utility level_tracking planning \ - user_activity wal cleanup oldextversions + user_activity wal entry_timestamp extended cleanup \ + oldextversions # Disabled because these tests require "shared_preload_libraries=pg_stat_statements", # which typical installcheck users do not have (e.g. buildfarm clients). NO_INSTALLCHECK = 1 +TAP_TESTS = 1 + ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) diff --git a/contrib/pg_stat_statements/expected/cursors.out b/contrib/pg_stat_statements/expected/cursors.out index 46375ea905114..0fc4b2c098d0e 100644 --- a/contrib/pg_stat_statements/expected/cursors.out +++ b/contrib/pg_stat_statements/expected/cursors.out @@ -3,10 +3,10 @@ -- -- These tests require track_utility to be enabled. SET pg_stat_statements.track_utility = TRUE; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- DECLARE @@ -20,13 +20,13 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -------+------+------------------------------------------------------- 2 | 0 | CLOSE cursor_stats_1 2 | 0 | DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT $1 - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (3 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- FETCH @@ -59,12 +59,12 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; 1 | 0 | DECLARE cursor_stats_2 CURSOR WITH HOLD FOR SELECT $1 1 | 1 | FETCH 1 IN cursor_stats_1 1 | 1 | FETCH 1 IN cursor_stats_2 - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (9 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) diff --git a/contrib/pg_stat_statements/expected/dml.out b/contrib/pg_stat_statements/expected/dml.out index 7b9c8f979ee6f..f6ac8da5ca221 100644 --- a/contrib/pg_stat_statements/expected/dml.out +++ b/contrib/pg_stat_statements/expected/dml.out @@ -81,16 +81,16 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; 1 | 12 | SELECT * FROM pgss_dml_tab ORDER BY a 2 | 4 | SELECT * FROM pgss_dml_tab WHERE a > $1 ORDER BY a 1 | 8 | SELECT * FROM pgss_dml_tab WHERE a IN ($1, $2, $3, $4, $5) - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t 1 | 0 | SET pg_stat_statements.track_utility = FALSE 6 | 6 | UPDATE pgss_dml_tab SET b = $1 WHERE a = $2 1 | 3 | UPDATE pgss_dml_tab SET b = $1 WHERE a > $2 (10 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- MERGE @@ -136,12 +136,39 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; | | WHEN NOT MATCHED THEN INSERT (a, b) VALUES ($1, $2) 1 | 0 | MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a) + | | WHEN NOT MATCHED THEN INSERT (b, a) VALUES ($1, $2) - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (10 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +-- check that [temp] table relation extensions are tracked as writes +CREATE TABLE pgss_extend_tab (a int, b text); +CREATE TEMP TABLE pgss_extend_temp_tab (a int, b text); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +INSERT INTO pgss_extend_tab (a, b) SELECT generate_series(1, 1000), 'something'; +INSERT INTO pgss_extend_temp_tab (a, b) SELECT generate_series(1, 1000), 'something'; +WITH sizes AS ( + SELECT + pg_relation_size('pgss_extend_tab') / current_setting('block_size')::int8 AS rel_size, + pg_relation_size('pgss_extend_temp_tab') / current_setting('block_size')::int8 AS temp_rel_size +) +SELECT + SUM(local_blks_written) >= (SELECT temp_rel_size FROM sizes) AS temp_written_ok, + SUM(local_blks_dirtied) >= (SELECT temp_rel_size FROM sizes) AS temp_dirtied_ok, + SUM(shared_blks_written) >= (SELECT rel_size FROM sizes) AS written_ok, + SUM(shared_blks_dirtied) >= (SELECT rel_size FROM sizes) AS dirtied_ok +FROM pg_stat_statements; + temp_written_ok | temp_dirtied_ok | written_ok | dirtied_ok +-----------------+-----------------+------------+------------ + t | t | t | t +(1 row) + +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) diff --git a/contrib/pg_stat_statements/expected/entry_timestamp.out b/contrib/pg_stat_statements/expected/entry_timestamp.out new file mode 100644 index 0000000000000..a10c4be6bac7e --- /dev/null +++ b/contrib/pg_stat_statements/expected/entry_timestamp.out @@ -0,0 +1,159 @@ +-- +-- statement timestamps +-- +-- planning time is needed during tests +SET pg_stat_statements.track_planning = TRUE; +SELECT 1 AS "STMTTS1"; + STMTTS1 +--------- + 1 +(1 row) + +SELECT now() AS ref_ts \gset +SELECT 1,2 AS "STMTTS2"; + ?column? | STMTTS2 +----------+--------- + 1 | 2 +(1 row) + +SELECT stats_since >= :'ref_ts', count(*) FROM pg_stat_statements +WHERE query LIKE '%STMTTS%' +GROUP BY stats_since >= :'ref_ts' +ORDER BY stats_since >= :'ref_ts'; + ?column? | count +----------+------- + f | 1 + t | 1 +(2 rows) + +SELECT now() AS ref_ts \gset +SELECT + count(*) as total, + count(*) FILTER ( + WHERE min_plan_time + max_plan_time = 0 + ) as minmax_plan_zero, + count(*) FILTER ( + WHERE min_exec_time + max_exec_time = 0 + ) as minmax_exec_zero, + count(*) FILTER ( + WHERE minmax_stats_since >= :'ref_ts' + ) as minmax_stats_since_after_ref, + count(*) FILTER ( + WHERE stats_since >= :'ref_ts' + ) as stats_since_after_ref +FROM pg_stat_statements +WHERE query LIKE '%STMTTS%'; + total | minmax_plan_zero | minmax_exec_zero | minmax_stats_since_after_ref | stats_since_after_ref +-------+------------------+------------------+------------------------------+----------------------- + 2 | 0 | 0 | 0 | 0 +(1 row) + +-- Perform single min/max reset +SELECT pg_stat_statements_reset(0, 0, queryid, true) AS minmax_reset_ts +FROM pg_stat_statements +WHERE query LIKE '%STMTTS1%' \gset +-- check +SELECT + count(*) as total, + count(*) FILTER ( + WHERE min_plan_time + max_plan_time = 0 + ) as minmax_plan_zero, + count(*) FILTER ( + WHERE min_exec_time + max_exec_time = 0 + ) as minmax_exec_zero, + count(*) FILTER ( + WHERE minmax_stats_since >= :'ref_ts' + ) as minmax_stats_since_after_ref, + count(*) FILTER ( + WHERE stats_since >= :'ref_ts' + ) as stats_since_after_ref +FROM pg_stat_statements +WHERE query LIKE '%STMTTS%'; + total | minmax_plan_zero | minmax_exec_zero | minmax_stats_since_after_ref | stats_since_after_ref +-------+------------------+------------------+------------------------------+----------------------- + 2 | 1 | 1 | 1 | 0 +(1 row) + +-- check minmax reset timestamps +SELECT +query, minmax_stats_since = :'minmax_reset_ts' AS reset_ts_match +FROM pg_stat_statements +WHERE query LIKE '%STMTTS%' +ORDER BY query COLLATE "C"; + query | reset_ts_match +---------------------------+---------------- + SELECT $1 AS "STMTTS1" | t + SELECT $1,$2 AS "STMTTS2" | f +(2 rows) + +-- check that minmax reset does not set stats_reset +SELECT +stats_reset = :'minmax_reset_ts' AS stats_reset_ts_match +FROM pg_stat_statements_info; + stats_reset_ts_match +---------------------- + f +(1 row) + +-- Perform common min/max reset +SELECT pg_stat_statements_reset(0, 0, 0, true) AS minmax_reset_ts \gset +-- check again +SELECT + count(*) as total, + count(*) FILTER ( + WHERE min_plan_time + max_plan_time = 0 + ) as minmax_plan_zero, + count(*) FILTER ( + WHERE min_exec_time + max_exec_time = 0 + ) as minmax_exec_zero, + count(*) FILTER ( + WHERE minmax_stats_since >= :'ref_ts' + ) as minmax_ts_after_ref, + count(*) FILTER ( + WHERE minmax_stats_since = :'minmax_reset_ts' + ) as minmax_ts_match, + count(*) FILTER ( + WHERE stats_since >= :'ref_ts' + ) as stats_since_after_ref +FROM pg_stat_statements +WHERE query LIKE '%STMTTS%'; + total | minmax_plan_zero | minmax_exec_zero | minmax_ts_after_ref | minmax_ts_match | stats_since_after_ref +-------+------------------+------------------+---------------------+-----------------+----------------------- + 2 | 2 | 2 | 2 | 2 | 0 +(1 row) + +-- Execute first query once more to check stats update +SELECT 1 AS "STMTTS1"; + STMTTS1 +--------- + 1 +(1 row) + +-- check +-- we don't check planing times here to be independent of +-- plan caching approach +SELECT + count(*) as total, + count(*) FILTER ( + WHERE min_exec_time + max_exec_time = 0 + ) as minmax_exec_zero, + count(*) FILTER ( + WHERE minmax_stats_since >= :'ref_ts' + ) as minmax_ts_after_ref, + count(*) FILTER ( + WHERE stats_since >= :'ref_ts' + ) as stats_since_after_ref +FROM pg_stat_statements +WHERE query LIKE '%STMTTS%'; + total | minmax_exec_zero | minmax_ts_after_ref | stats_since_after_ref +-------+------------------+---------------------+----------------------- + 2 | 1 | 2 | 0 +(1 row) + +-- Cleanup +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + diff --git a/contrib/pg_stat_statements/expected/extended.out b/contrib/pg_stat_statements/expected/extended.out new file mode 100644 index 0000000000000..dbc7868022662 --- /dev/null +++ b/contrib/pg_stat_statements/expected/extended.out @@ -0,0 +1,10 @@ +-- Tests with extended query protocol +SET pg_stat_statements.track_utility = FALSE; +-- This test checks that an execute message sets a query ID. +SELECT query_id IS NOT NULL AS query_id_set + FROM pg_stat_activity WHERE pid = pg_backend_pid() \bind \g + query_id_set +-------------- + t +(1 row) + diff --git a/contrib/pg_stat_statements/expected/level_tracking.out b/contrib/pg_stat_statements/expected/level_tracking.out index d924c87b41ed9..d8dd8a2deea08 100644 --- a/contrib/pg_stat_statements/expected/level_tracking.out +++ b/contrib/pg_stat_statements/expected/level_tracking.out @@ -2,10 +2,10 @@ -- Statement level tracking -- SET pg_stat_statements.track_utility = TRUE; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- DO block - top-level tracking. @@ -29,10 +29,10 @@ SELECT toplevel, calls, query FROM pg_stat_statements | | $$ LANGUAGE plpgsql (2 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- DO block - all-level tracking. @@ -49,31 +49,131 @@ BEGIN END; $$; SELECT toplevel, calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", toplevel; - toplevel | calls | query -----------+-------+-------------------------------------- + toplevel | calls | query +----------+-------+---------------------------------------------------- f | 1 | DELETE FROM stats_track_tab t | 1 | DELETE FROM stats_track_tab - t | 1 | DO $$ + - | | BEGIN + - | | DELETE FROM stats_track_tab; + + t | 1 | DO $$ + + | | BEGIN + + | | DELETE FROM stats_track_tab; + | | END; $$ - t | 1 | DO LANGUAGE plpgsql $$ + - | | BEGIN + - | | -- this is a SELECT + - | | PERFORM 'hello world'::TEXT; + + t | 1 | DO LANGUAGE plpgsql $$ + + | | BEGIN + + | | -- this is a SELECT + + | | PERFORM 'hello world'::TEXT; + | | END; $$ f | 1 | SELECT $1::TEXT - t | 1 | SELECT pg_stat_statements_reset() + t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t t | 1 | SET pg_stat_statements.track = 'all' (7 rows) +-- Procedure with multiple utility statements. +CREATE OR REPLACE PROCEDURE proc_with_utility_stmt() +LANGUAGE SQL +AS $$ + SHOW pg_stat_statements.track; + show pg_stat_statements.track; + SHOW pg_stat_statements.track_utility; +$$; +SET pg_stat_statements.track_utility = TRUE; +-- all-level tracking. +SET pg_stat_statements.track = 'all'; +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +CALL proc_with_utility_stmt(); +SELECT toplevel, calls, query FROM pg_stat_statements + ORDER BY query COLLATE "C", toplevel; + toplevel | calls | query +----------+-------+---------------------------------------------------- + t | 1 | CALL proc_with_utility_stmt() + t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t + f | 2 | SHOW pg_stat_statements.track + f | 1 | SHOW pg_stat_statements.track_utility +(4 rows) + +-- top-level tracking. +SET pg_stat_statements.track = 'top'; +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +CALL proc_with_utility_stmt(); +SELECT toplevel, calls, query FROM pg_stat_statements + ORDER BY query COLLATE "C", toplevel; + toplevel | calls | query +----------+-------+---------------------------------------------------- + t | 1 | CALL proc_with_utility_stmt() + t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t +(2 rows) + +-- DO block - top-level tracking without utility. +SET pg_stat_statements.track = 'top'; +SET pg_stat_statements.track_utility = FALSE; +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +DELETE FROM stats_track_tab; +DO $$ +BEGIN + DELETE FROM stats_track_tab; +END; $$; +DO LANGUAGE plpgsql $$ +BEGIN + -- this is a SELECT + PERFORM 'hello world'::TEXT; +END; $$; +SELECT toplevel, calls, query FROM pg_stat_statements + ORDER BY query COLLATE "C", toplevel; + toplevel | calls | query +----------+-------+---------------------------------------------------- + t | 1 | DELETE FROM stats_track_tab + t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t +(2 rows) + +-- DO block - all-level tracking without utility. +SET pg_stat_statements.track = 'all'; +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +DELETE FROM stats_track_tab; +DO $$ +BEGIN + DELETE FROM stats_track_tab; +END; $$; +DO LANGUAGE plpgsql $$ +BEGIN + -- this is a SELECT + PERFORM 'hello world'::TEXT; +END; $$; +SELECT toplevel, calls, query FROM pg_stat_statements + ORDER BY query COLLATE "C", toplevel; + toplevel | calls | query +----------+-------+---------------------------------------------------- + f | 1 | DELETE FROM stats_track_tab + t | 1 | DELETE FROM stats_track_tab + f | 1 | SELECT $1::TEXT + t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t +(4 rows) + -- PL/pgSQL function - top-level tracking. SET pg_stat_statements.track = 'top'; SET pg_stat_statements.track_utility = FALSE; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) CREATE FUNCTION PLUS_TWO(i INTEGER) RETURNS INTEGER AS $$ @@ -111,24 +211,50 @@ SELECT PLUS_ONE(10); (1 row) SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+----------------------------------- + calls | rows | query +-------+------+---------------------------------------------------- 2 | 2 | SELECT PLUS_ONE($1) 2 | 2 | SELECT PLUS_TWO($1) - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (3 rows) +-- immutable SQL function --- can be executed at plan time +CREATE FUNCTION PLUS_THREE(i INTEGER) RETURNS INTEGER AS +$$ SELECT i + 3 LIMIT 1 $$ IMMUTABLE LANGUAGE SQL; +SELECT PLUS_THREE(8); + plus_three +------------ + 11 +(1 row) + +SELECT PLUS_THREE(10); + plus_three +------------ + 13 +(1 row) + +SELECT toplevel, calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; + toplevel | calls | rows | query +----------+-------+------+------------------------------------------------------------------------------ + t | 2 | 2 | SELECT PLUS_ONE($1) + t | 2 | 2 | SELECT PLUS_THREE($1) + t | 2 | 2 | SELECT PLUS_TWO($1) + t | 1 | 3 | SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C" + t | 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t +(5 rows) + -- PL/pgSQL function - all-level tracking. SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- we drop and recreate the functions to avoid any caching funnies DROP FUNCTION PLUS_ONE(INTEGER); DROP FUNCTION PLUS_TWO(INTEGER); +DROP FUNCTION PLUS_THREE(INTEGER); -- PL/pgSQL function CREATE FUNCTION PLUS_TWO(i INTEGER) RETURNS INTEGER AS $$ DECLARE @@ -165,24 +291,51 @@ SELECT PLUS_ONE(1); (1 row) SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+----------------------------------- + calls | rows | query +-------+------+---------------------------------------------------- 2 | 2 | SELECT (i + $2 + $3)::INTEGER 2 | 2 | SELECT (i + $2)::INTEGER LIMIT $3 2 | 2 | SELECT PLUS_ONE($1) 2 | 2 | SELECT PLUS_TWO($1) - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (5 rows) -DROP FUNCTION PLUS_ONE(INTEGER); +-- immutable SQL function --- can be executed at plan time +CREATE FUNCTION PLUS_THREE(i INTEGER) RETURNS INTEGER AS +$$ SELECT i + 3 LIMIT 1 $$ IMMUTABLE LANGUAGE SQL; +SELECT PLUS_THREE(8); + plus_three +------------ + 11 +(1 row) + +SELECT PLUS_THREE(10); + plus_three +------------ + 13 +(1 row) + +SELECT toplevel, calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; + toplevel | calls | rows | query +----------+-------+------+------------------------------------------------------------------------------ + f | 2 | 2 | SELECT (i + $2 + $3)::INTEGER + f | 2 | 2 | SELECT (i + $2)::INTEGER LIMIT $3 + t | 2 | 2 | SELECT PLUS_ONE($1) + t | 2 | 2 | SELECT PLUS_THREE($1) + t | 2 | 2 | SELECT PLUS_TWO($1) + t | 1 | 5 | SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C" + f | 2 | 2 | SELECT i + $2 LIMIT $3 + t | 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t +(8 rows) + -- -- pg_stat_statements.track = none -- SET pg_stat_statements.track = 'none'; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) SELECT 1 AS "one"; @@ -202,9 +355,9 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -------+------+------- (0 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) diff --git a/contrib/pg_stat_statements/expected/oldextversions.out b/contrib/pg_stat_statements/expected/oldextversions.out index efb2049ecff44..5842c930e50ff 100644 --- a/contrib/pg_stat_statements/expected/oldextversions.out +++ b/contrib/pg_stat_statements/expected/oldextversions.out @@ -52,6 +52,12 @@ SELECT pg_get_functiondef('pg_stat_statements_reset'::regproc); (1 row) +SELECT pg_stat_statements_reset(); + pg_stat_statements_reset +-------------------------- + +(1 row) + \d pg_stat_statements View "public.pg_stat_statements" Column | Type | Collation | Nullable | Default @@ -88,6 +94,17 @@ SELECT count(*) > 0 AS has_data FROM pg_stat_statements; -- New functions and views for pg_stat_statements in 1.8 AlTER EXTENSION pg_stat_statements UPDATE TO '1.8'; +SELECT pg_get_functiondef('pg_stat_statements_reset'::regproc); + pg_get_functiondef +-------------------------------------------------------------------------------------------------------------------------------- + CREATE OR REPLACE FUNCTION public.pg_stat_statements_reset(userid oid DEFAULT 0, dbid oid DEFAULT 0, queryid bigint DEFAULT 0)+ + RETURNS void + + LANGUAGE c + + PARALLEL SAFE STRICT + + AS '$libdir/pg_stat_statements', $function$pg_stat_statements_reset_1_7$function$ + + +(1 row) + \d pg_stat_statements View "public.pg_stat_statements" Column | Type | Collation | Nullable | Default @@ -125,15 +142,10 @@ AlTER EXTENSION pg_stat_statements UPDATE TO '1.8'; wal_fpi | bigint | | | wal_bytes | numeric | | | -SELECT pg_get_functiondef('pg_stat_statements_reset'::regproc); - pg_get_functiondef --------------------------------------------------------------------------------------------------------------------------------- - CREATE OR REPLACE FUNCTION public.pg_stat_statements_reset(userid oid DEFAULT 0, dbid oid DEFAULT 0, queryid bigint DEFAULT 0)+ - RETURNS void + - LANGUAGE c + - PARALLEL SAFE STRICT + - AS '$libdir/pg_stat_statements', $function$pg_stat_statements_reset_1_7$function$ + - +SELECT count(*) > 0 AS has_data FROM pg_stat_statements; + has_data +---------- + t (1 row) -- New function pg_stat_statement_info, and new function @@ -250,4 +262,84 @@ SELECT count(*) > 0 AS has_data FROM pg_stat_statements; t (1 row) +-- New functions and views for pg_stat_statements in 1.11 +AlTER EXTENSION pg_stat_statements UPDATE TO '1.11'; +\d pg_stat_statements + View "public.pg_stat_statements" + Column | Type | Collation | Nullable | Default +------------------------+--------------------------+-----------+----------+--------- + userid | oid | | | + dbid | oid | | | + toplevel | boolean | | | + queryid | bigint | | | + query | text | | | + plans | bigint | | | + total_plan_time | double precision | | | + min_plan_time | double precision | | | + max_plan_time | double precision | | | + mean_plan_time | double precision | | | + stddev_plan_time | double precision | | | + calls | bigint | | | + total_exec_time | double precision | | | + min_exec_time | double precision | | | + max_exec_time | double precision | | | + mean_exec_time | double precision | | | + stddev_exec_time | double precision | | | + rows | bigint | | | + shared_blks_hit | bigint | | | + shared_blks_read | bigint | | | + shared_blks_dirtied | bigint | | | + shared_blks_written | bigint | | | + local_blks_hit | bigint | | | + local_blks_read | bigint | | | + local_blks_dirtied | bigint | | | + local_blks_written | bigint | | | + temp_blks_read | bigint | | | + temp_blks_written | bigint | | | + shared_blk_read_time | double precision | | | + shared_blk_write_time | double precision | | | + local_blk_read_time | double precision | | | + local_blk_write_time | double precision | | | + temp_blk_read_time | double precision | | | + temp_blk_write_time | double precision | | | + wal_records | bigint | | | + wal_fpi | bigint | | | + wal_bytes | numeric | | | + jit_functions | bigint | | | + jit_generation_time | double precision | | | + jit_inlining_count | bigint | | | + jit_inlining_time | double precision | | | + jit_optimization_count | bigint | | | + jit_optimization_time | double precision | | | + jit_emission_count | bigint | | | + jit_emission_time | double precision | | | + jit_deform_count | bigint | | | + jit_deform_time | double precision | | | + stats_since | timestamp with time zone | | | + minmax_stats_since | timestamp with time zone | | | + +SELECT count(*) > 0 AS has_data FROM pg_stat_statements; + has_data +---------- + t +(1 row) + +-- New parameter minmax_only of pg_stat_statements_reset function +SELECT pg_get_functiondef('pg_stat_statements_reset'::regproc); + pg_get_functiondef +------------------------------------------------------------------------------------------------------------------------------------------------------------------- + CREATE OR REPLACE FUNCTION public.pg_stat_statements_reset(userid oid DEFAULT 0, dbid oid DEFAULT 0, queryid bigint DEFAULT 0, minmax_only boolean DEFAULT false)+ + RETURNS timestamp with time zone + + LANGUAGE c + + PARALLEL SAFE STRICT + + AS '$libdir/pg_stat_statements', $function$pg_stat_statements_reset_1_11$function$ + + +(1 row) + +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + DROP EXTENSION pg_stat_statements; diff --git a/contrib/pg_stat_statements/expected/planning.out b/contrib/pg_stat_statements/expected/planning.out index c3561dd7da3e9..9effd11fdc859 100644 --- a/contrib/pg_stat_statements/expected/planning.out +++ b/contrib/pg_stat_statements/expected/planning.out @@ -3,10 +3,10 @@ -- -- These tests require track_planning to be enabled. SET pg_stat_statements.track_planning = TRUE; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- @@ -64,7 +64,7 @@ SELECT plans, calls, rows, query FROM pg_stat_statements 0 | 1 | 0 | ALTER TABLE stats_plan_test ADD COLUMN x int 0 | 1 | 0 | CREATE TABLE stats_plan_test () 3 | 3 | 3 | SELECT $1 - 0 | 1 | 1 | SELECT pg_stat_statements_reset() + 0 | 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t 1 | 0 | 0 | SELECT plans, calls, rows, query FROM pg_stat_statements+ | | | WHERE query NOT LIKE $1 ORDER BY query COLLATE "C" (5 rows) @@ -80,9 +80,9 @@ SELECT plans >= 2 AND plans <= calls AS plans_ok, calls, rows, query FROM pg_sta -- Cleanup DROP TABLE stats_plan_test; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) diff --git a/contrib/pg_stat_statements/expected/select.out b/contrib/pg_stat_statements/expected/select.out index 972539b2c51da..dd6c756f67d5b 100644 --- a/contrib/pg_stat_statements/expected/select.out +++ b/contrib/pg_stat_statements/expected/select.out @@ -4,10 +4,10 @@ CREATE EXTENSION pg_stat_statements; SET pg_stat_statements.track_utility = FALSE; SET pg_stat_statements.track_planning = TRUE; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- @@ -138,7 +138,7 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; 1 | 2 | SELECT $1 AS i UNION SELECT $2 ORDER BY i 1 | 1 | SELECT $1 || $2 0 | 0 | SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C" - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t 1 | 2 | WITH t(f) AS ( + | | VALUES ($1), ($2) + | | ) + @@ -146,10 +146,10 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; 1 | 1 | select $1::jsonb ? $2 (12 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- @@ -157,10 +157,10 @@ SELECT pg_stat_statements_reset(); -- CREATE TABLE pgss_a (id integer PRIMARY KEY); CREATE TABLE pgss_b (id integer PRIMARY KEY, a_id integer REFERENCES pgss_a); -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- control query @@ -236,17 +236,17 @@ SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C"; 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_b, pgss_a 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE SKIP LOCKED 0 | SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C" - 1 | SELECT pg_stat_statements_reset() + 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (12 rows) DROP TABLE pgss_a, pgss_b CASCADE; -- -- access to pg_stat_statements_info view -- -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) SELECT dealloc FROM pg_stat_statements_info; @@ -406,9 +406,9 @@ SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%SELECT GROUPING%'; 2 (1 row) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) diff --git a/contrib/pg_stat_statements/expected/user_activity.out b/contrib/pg_stat_statements/expected/user_activity.out index f3c6b6ab32625..38faf18c7c519 100644 --- a/contrib/pg_stat_statements/expected/user_activity.out +++ b/contrib/pg_stat_statements/expected/user_activity.out @@ -2,10 +2,10 @@ -- Track user activity and reset them -- SET pg_stat_statements.track_utility = TRUE; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) CREATE ROLE regress_stats_user1; @@ -39,27 +39,27 @@ SELECT 1+1 AS "TWO"; RESET ROLE; SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls | rows ------------------------------------+-------+------ - CREATE ROLE regress_stats_user1 | 1 | 0 - CREATE ROLE regress_stats_user2 | 1 | 0 - RESET ROLE | 2 | 0 - SELECT $1 AS "ONE" | 1 | 1 - SELECT $1 AS "ONE" | 1 | 1 - SELECT $1+$2 AS "TWO" | 1 | 1 - SELECT $1+$2 AS "TWO" | 1 | 1 - SELECT pg_stat_statements_reset() | 1 | 1 - SET ROLE regress_stats_user1 | 1 | 0 - SET ROLE regress_stats_user2 | 1 | 0 + query | calls | rows +----------------------------------------------------+-------+------ + CREATE ROLE regress_stats_user1 | 1 | 0 + CREATE ROLE regress_stats_user2 | 1 | 0 + RESET ROLE | 2 | 0 + SELECT $1 AS "ONE" | 1 | 1 + SELECT $1 AS "ONE" | 1 | 1 + SELECT $1+$2 AS "TWO" | 1 | 1 + SELECT $1+$2 AS "TWO" | 1 | 1 + SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 + SET ROLE regress_stats_user1 | 1 | 0 + SET ROLE regress_stats_user2 | 1 | 0 (10 rows) -- -- Don't reset anything if any of the parameter is NULL -- -SELECT pg_stat_statements_reset(NULL); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset(NULL) IS NOT NULL AS t; + t +--- + f (1 row) SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; @@ -72,8 +72,8 @@ SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; SELECT $1 AS "ONE" | 1 | 1 SELECT $1+$2 AS "TWO" | 1 | 1 SELECT $1+$2 AS "TWO" | 1 | 1 - SELECT pg_stat_statements_reset($1) | 1 | 1 - SELECT pg_stat_statements_reset() | 1 | 1 + SELECT pg_stat_statements_reset($1) IS NOT NULL AS t | 1 | 1 + SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C" | 1 | 10 SET ROLE regress_stats_user1 | 1 | 0 SET ROLE regress_stats_user2 | 1 | 0 @@ -87,10 +87,11 @@ SELECT pg_stat_statements_reset( (SELECT r.oid FROM pg_roles AS r WHERE r.rolname = 'regress_stats_user2'), (SELECT d.oid FROM pg_database As d where datname = current_database()), (SELECT s.queryid FROM pg_stat_statements AS s - WHERE s.query = 'SELECT $1+$2 AS "TWO"' LIMIT 1)); - pg_stat_statements_reset --------------------------- - + WHERE s.query = 'SELECT $1+$2 AS "TWO"' LIMIT 1)) + IS NOT NULL AS t; + t +--- + t (1 row) SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; @@ -106,9 +107,10 @@ SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; (SELECT r.oid FROM pg_roles AS r WHERE r.rolname = $1), +| | (SELECT d.oid FROM pg_database As d where datname = current_database()),+| | (SELECT s.queryid FROM pg_stat_statements AS s +| | - WHERE s.query = $2 LIMIT $3)) | | - SELECT pg_stat_statements_reset($1) | 1 | 1 - SELECT pg_stat_statements_reset() | 1 | 1 + WHERE s.query = $2 LIMIT $3)) +| | + IS NOT NULL AS t | | + SELECT pg_stat_statements_reset($1) IS NOT NULL AS t | 1 | 1 + SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C" | 2 | 22 SET ROLE regress_stats_user1 | 1 | 0 SET ROLE regress_stats_user2 | 1 | 0 @@ -117,12 +119,12 @@ SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; -- -- remove query ('SELECT $1 AS "ONE"') executed by two users -- -SELECT pg_stat_statements_reset(0,0,s.queryid) +SELECT pg_stat_statements_reset(0,0,s.queryid) IS NOT NULL AS t FROM pg_stat_statements AS s WHERE s.query = 'SELECT $1 AS "ONE"'; - pg_stat_statements_reset --------------------------- - - + t +--- + t + t (2 rows) SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; @@ -136,11 +138,12 @@ SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; (SELECT r.oid FROM pg_roles AS r WHERE r.rolname = $1), +| | (SELECT d.oid FROM pg_database As d where datname = current_database()),+| | (SELECT s.queryid FROM pg_stat_statements AS s +| | - WHERE s.query = $2 LIMIT $3)) | | - SELECT pg_stat_statements_reset($1) | 1 | 1 - SELECT pg_stat_statements_reset($1,$2,s.queryid) +| 1 | 2 + WHERE s.query = $2 LIMIT $3)) +| | + IS NOT NULL AS t | | + SELECT pg_stat_statements_reset($1) IS NOT NULL AS t | 1 | 1 + SELECT pg_stat_statements_reset($1,$2,s.queryid) IS NOT NULL AS t +| 1 | 2 FROM pg_stat_statements AS s WHERE s.query = $3 | | - SELECT pg_stat_statements_reset() | 1 | 1 + SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C" | 3 | 34 SET ROLE regress_stats_user1 | 1 | 0 SET ROLE regress_stats_user2 | 1 | 0 @@ -149,11 +152,11 @@ SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; -- -- remove query of a user (regress_stats_user1) -- -SELECT pg_stat_statements_reset(r.oid) +SELECT pg_stat_statements_reset(r.oid) IS NOT NULL AS t FROM pg_roles AS r WHERE r.rolname = 'regress_stats_user1'; - pg_stat_statements_reset --------------------------- - + t +--- + t (1 row) SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; @@ -166,12 +169,13 @@ SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; (SELECT r.oid FROM pg_roles AS r WHERE r.rolname = $1), +| | (SELECT d.oid FROM pg_database As d where datname = current_database()),+| | (SELECT s.queryid FROM pg_stat_statements AS s +| | - WHERE s.query = $2 LIMIT $3)) | | - SELECT pg_stat_statements_reset($1) | 1 | 1 - SELECT pg_stat_statements_reset($1,$2,s.queryid) +| 1 | 2 + WHERE s.query = $2 LIMIT $3)) +| | + IS NOT NULL AS t | | + SELECT pg_stat_statements_reset($1) IS NOT NULL AS t | 1 | 1 + SELECT pg_stat_statements_reset($1,$2,s.queryid) IS NOT NULL AS t +| 1 | 2 FROM pg_stat_statements AS s WHERE s.query = $3 | | - SELECT pg_stat_statements_reset() | 1 | 1 - SELECT pg_stat_statements_reset(r.oid) +| 1 | 1 + SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 + SELECT pg_stat_statements_reset(r.oid) IS NOT NULL AS t +| 1 | 1 FROM pg_roles AS r WHERE r.rolname = $1 | | SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C" | 4 | 45 SET ROLE regress_stats_user2 | 1 | 0 @@ -180,16 +184,16 @@ SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; -- -- reset all -- -SELECT pg_stat_statements_reset(0,0,0); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset(0,0,0) IS NOT NULL AS t; + t +--- + t (1 row) SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls | rows -----------------------------------------+-------+------ - SELECT pg_stat_statements_reset(0,0,0) | 1 | 1 + query | calls | rows +---------------------------------------------------------+-------+------ + SELECT pg_stat_statements_reset(0,0,0) IS NOT NULL AS t | 1 | 1 (1 row) -- @@ -197,9 +201,9 @@ SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; -- DROP ROLE regress_stats_user1; DROP ROLE regress_stats_user2; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) diff --git a/contrib/pg_stat_statements/expected/utility.out b/contrib/pg_stat_statements/expected/utility.out index 0047aba5d1acb..fa738b5c00d41 100644 --- a/contrib/pg_stat_statements/expected/utility.out +++ b/contrib/pg_stat_statements/expected/utility.out @@ -3,10 +3,10 @@ -- -- These tests require track_utility to be enabled. SET pg_stat_statements.track_utility = TRUE; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- Tables, indexes, triggers @@ -33,13 +33,13 @@ NOTICE: table "tab_stats" does not exist, skipping 1 | 0 | CREATE TEMP TABLE tab_stats (a int, b char(20)) 3 | 0 | DROP TABLE IF EXISTS tab_stats 1 | 0 | DROP TABLE tab_stats - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (8 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- Partitions @@ -142,13 +142,13 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; 1 | 0 | DROP TABLE trigger_tab_stats 1 | 0 | DROP TYPE stats_type 1 | 0 | DROP VIEW view_stats - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (39 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- Transaction statements @@ -188,13 +188,67 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; 1 | 0 | BEGIN TRANSACTION NOT DEFERRABLE, READ ONLY, READ WRITE, DEFERRABLE 1 | 0 | BEGIN TRANSACTION READ ONLY, READ WRITE, DEFERRABLE, NOT DEFERRABLE 7 | 0 | COMMIT WORK - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (8 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Two-phase transactions +BEGIN; +PREPARE TRANSACTION 'stat_trans1'; +COMMIT PREPARED 'stat_trans1'; +BEGIN; +PREPARE TRANSACTION 'stat_trans2'; +ROLLBACK PREPARED 'stat_trans2'; +SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+---------------------------------------------------- + 2 | 0 | BEGIN + 1 | 0 | COMMIT PREPARED $1 + 2 | 0 | PREPARE TRANSACTION $1 + 1 | 0 | ROLLBACK PREPARED $1 + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t +(5 rows) + +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Savepoints +BEGIN; +SAVEPOINT sp1; +SAVEPOINT sp2; +SAVEPOINT sp3; +SAVEPOINT sp4; +ROLLBACK TO sp4; +ROLLBACK TO SAVEPOINT sp4; +ROLLBACK TRANSACTION TO SAVEPOINT sp3; +RELEASE sp3; +RELEASE SAVEPOINT sp2; +ROLLBACK TO sp1; +RELEASE SAVEPOINT sp1; +COMMIT; +SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+---------------------------------------------------- + 1 | 0 | BEGIN + 1 | 0 | COMMIT + 3 | 0 | RELEASE $1 + 4 | 0 | ROLLBACK TO $1 + 4 | 0 | SAVEPOINT $1 + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t +(6 rows) + +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- EXPLAIN statements @@ -230,7 +284,7 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -------+------+--------------------------------------------------------------------------------- 2 | 0 | EXPLAIN (costs off) SELECT $1 2 | 0 | EXPLAIN (costs off) SELECT a FROM generate_series($1,$2) AS tab(a) WHERE a = $3 - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (3 rows) -- CALL @@ -246,32 +300,68 @@ DECLARE BEGIN SELECT (i + j)::int INTO r; END; $$ LANGUAGE plpgsql; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +-- Overloaded functions. +CREATE OR REPLACE PROCEDURE overload(i int) AS $$ +DECLARE + r int; +BEGIN + SELECT (i + i)::int INTO r; +END; $$ LANGUAGE plpgsql; +CREATE OR REPLACE PROCEDURE overload(i text) AS $$ +DECLARE + r text; +BEGIN + SELECT i::text INTO r; +END; $$ LANGUAGE plpgsql; +-- Mix of IN/OUT parameters. +CREATE OR REPLACE PROCEDURE in_out(i int, i2 OUT int, i3 INOUT int) AS $$ +DECLARE + r int; +BEGIN + i2 := i; + i3 := i3 + i; +END; $$ LANGUAGE plpgsql; +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) CALL sum_one(3); CALL sum_one(199); CALL sum_two(1,1); CALL sum_two(1,2); +CALL overload(1); +CALL overload('A'); +CALL in_out(1, NULL, 1); + i2 | i3 +----+---- + 1 | 2 +(1 row) + +CALL in_out(2, 1, 2); + i2 | i3 +----+---- + 2 | 4 +(1 row) + SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+----------------------------------- - 1 | 0 | CALL sum_one(199) - 1 | 0 | CALL sum_one(3) - 1 | 0 | CALL sum_two(1,1) - 1 | 0 | CALL sum_two(1,2) - 1 | 1 | SELECT pg_stat_statements_reset() -(5 rows) + calls | rows | query +-------+------+---------------------------------------------------- + 2 | 0 | CALL in_out($1, $2, $3) + 1 | 0 | CALL overload($1) + 1 | 0 | CALL overload($1) + 2 | 0 | CALL sum_one($1) + 2 | 0 | CALL sum_two($1,$2) + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t +(6 rows) -- COPY CREATE TABLE copy_stats (a int, b int); -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- Some queries with A_Const nodes. @@ -301,14 +391,14 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; 1 | 1 | COPY (SELECT 2) TO STDOUT 1 | 2 | COPY (UPDATE copy_stats SET b = b + 1 RETURNING *) TO STDOUT 1 | 2 | COPY (UPDATE copy_stats SET b = b + 2 RETURNING *) TO STDOUT - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (8 rows) DROP TABLE copy_stats; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- CREATE TABLE AS @@ -334,13 +424,13 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; | | FROM generate_series($2, $3) AS tab(a) WHERE a < $4 AND a > $5 2 | 0 | DROP TABLE ctas_stats_1 2 | 0 | DROP TABLE ctas_stats_2 - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (5 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- CREATE MATERIALIZED VIEW @@ -360,13 +450,13 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; | | SELECT a AS col1, $1::int AS col2 + | | FROM generate_series($2, $3) AS tab(a) WHERE a < $4 AND a > $5 2 | 0 | DROP MATERIALIZED VIEW matview_stats_1 - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (3 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- CREATE VIEW @@ -388,13 +478,13 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; | | SELECT a AS col1, 4::int AS col2 + | | FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 3 2 | 0 | DROP VIEW view_stats_1 - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (4 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- Domains @@ -409,13 +499,54 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; 1 | 0 | ALTER DOMAIN domain_stats SET DEFAULT '3' 1 | 0 | CREATE DOMAIN domain_stats AS int CHECK (VALUE > 0) 1 | 0 | DROP DOMAIN domain_stats - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (5 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Execution statements +SELECT 1 as a; + a +--- + 1 +(1 row) + +PREPARE stat_select AS SELECT $1 AS a; +EXECUTE stat_select (1); + a +--- + 1 +(1 row) + +DEALLOCATE stat_select; +PREPARE stat_select AS SELECT $1 AS a; +EXECUTE stat_select (2); + a +--- + 2 +(1 row) + +DEALLOCATE PREPARE stat_select; +DEALLOCATE ALL; +DEALLOCATE PREPARE ALL; +SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+---------------------------------------------------- + 2 | 0 | DEALLOCATE $1 + 2 | 0 | DEALLOCATE ALL + 2 | 2 | PREPARE stat_select AS SELECT $1 AS a + 1 | 1 | SELECT $1 as a + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t +(5 rows) + +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- SET statements. @@ -441,14 +572,14 @@ SET LOCAL SESSION AUTHORIZATION DEFAULT; RESET SESSION AUTHORIZATION; COMMIT; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+------------------------------------------------- + calls | rows | query +-------+------+---------------------------------------------------- 2 | 0 | BEGIN 2 | 0 | COMMIT 2 | 0 | RESET SESSION AUTHORIZATION 1 | 0 | RESET enable_seqscan 1 | 0 | RESET work_mem - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t 1 | 0 | SET LOCAL SESSION AUTHORIZATION DEFAULT 1 | 0 | SET SESSION SESSION AUTHORIZATION DEFAULT 1 | 0 | SET TRANSACTION ISOLATION LEVEL READ COMMITTED @@ -460,10 +591,10 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; 1 | 0 | SET work_mem = '2MB' (15 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) -- @@ -521,42 +652,15 @@ SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; 1 | 1 | FETCH NEXT pgss_cursor 1 | 13 | REFRESH MATERIALIZED VIEW pgss_matv 1 | 10 | SELECT generate_series($1, $2) c INTO pgss_select_into - 1 | 1 | SELECT pg_stat_statements_reset() + 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t (12 rows) DROP MATERIALIZED VIEW pgss_matv; DROP TABLE pgss_ctas; DROP TABLE pgss_select_into; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - -(1 row) - --- SET statements. --- These use two different strings, still they count as one entry. -SET work_mem = '1MB'; -Set work_mem = '1MB'; -SET work_mem = '2MB'; -RESET work_mem; -SET enable_seqscan = off; -SET enable_seqscan = on; -RESET enable_seqscan; -SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+----------------------------------- - 1 | 0 | RESET enable_seqscan - 1 | 0 | RESET work_mem - 1 | 1 | SELECT pg_stat_statements_reset() - 1 | 0 | SET enable_seqscan = off - 1 | 0 | SET enable_seqscan = on - 2 | 0 | SET work_mem = '1MB' - 1 | 0 | SET work_mem = '2MB' -(7 rows) - -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) diff --git a/contrib/pg_stat_statements/expected/wal.out b/contrib/pg_stat_statements/expected/wal.out index 9896ba25363fb..34a2bf5b033c1 100644 --- a/contrib/pg_stat_statements/expected/wal.out +++ b/contrib/pg_stat_statements/expected/wal.out @@ -17,14 +17,14 @@ FROM pg_stat_statements ORDER BY query COLLATE "C"; --------------------------------------------------------------+-------+------+---------------------+-----------------------+--------------------- DELETE FROM pgss_wal_tab WHERE a > $1 | 1 | 1 | t | t | t INSERT INTO pgss_wal_tab VALUES(generate_series($1, $2), $3) | 1 | 10 | t | t | t - SELECT pg_stat_statements_reset() | 1 | 1 | f | f | f + SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 | f | f | f SET pg_stat_statements.track_utility = FALSE | 1 | 0 | f | f | t UPDATE pgss_wal_tab SET b = $1 WHERE a > $2 | 1 | 3 | t | t | t (5 rows) -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t (1 row) diff --git a/contrib/pg_stat_statements/meson.build b/contrib/pg_stat_statements/meson.build index 3e3062ada9cb9..a99468e870baf 100644 --- a/contrib/pg_stat_statements/meson.build +++ b/contrib/pg_stat_statements/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_stat_statements_sources = files( 'pg_stat_statements.c', @@ -21,6 +21,7 @@ contrib_targets += pg_stat_statements install_data( 'pg_stat_statements.control', 'pg_stat_statements--1.4.sql', + 'pg_stat_statements--1.10--1.11.sql', 'pg_stat_statements--1.9--1.10.sql', 'pg_stat_statements--1.8--1.9.sql', 'pg_stat_statements--1.7--1.8.sql', @@ -48,6 +49,8 @@ tests += { 'planning', 'user_activity', 'wal', + 'entry_timestamp', + 'extended', 'cleanup', 'oldextversions', ], @@ -57,4 +60,9 @@ tests += { # runningcheck users do not have (e.g. buildfarm clients). 'runningcheck': false, }, + 'tap': { + 'tests': [ + 't/010_restart.pl', + ], + }, } diff --git a/contrib/pg_stat_statements/pg_stat_statements--1.10--1.11.sql b/contrib/pg_stat_statements/pg_stat_statements--1.10--1.11.sql new file mode 100644 index 0000000000000..0bb2c39771116 --- /dev/null +++ b/contrib/pg_stat_statements/pg_stat_statements--1.10--1.11.sql @@ -0,0 +1,82 @@ +/* contrib/pg_stat_statements/pg_stat_statements--1.10--1.11.sql */ + +-- complain if script is sourced in psql, rather than via ALTER EXTENSION +\echo Use "ALTER EXTENSION pg_stat_statements UPDATE TO '1.11'" to load this file. \quit + +/* Drop old versions */ +DROP VIEW pg_stat_statements; +DROP FUNCTION pg_stat_statements(boolean); +DROP FUNCTION pg_stat_statements_reset(Oid, Oid, bigint); + +/* Now redefine */ +CREATE FUNCTION pg_stat_statements(IN showtext boolean, + OUT userid oid, + OUT dbid oid, + OUT toplevel bool, + OUT queryid bigint, + OUT query text, + OUT plans int8, + OUT total_plan_time float8, + OUT min_plan_time float8, + OUT max_plan_time float8, + OUT mean_plan_time float8, + OUT stddev_plan_time float8, + OUT calls int8, + OUT total_exec_time float8, + OUT min_exec_time float8, + OUT max_exec_time float8, + OUT mean_exec_time float8, + OUT stddev_exec_time float8, + OUT rows int8, + OUT shared_blks_hit int8, + OUT shared_blks_read int8, + OUT shared_blks_dirtied int8, + OUT shared_blks_written int8, + OUT local_blks_hit int8, + OUT local_blks_read int8, + OUT local_blks_dirtied int8, + OUT local_blks_written int8, + OUT temp_blks_read int8, + OUT temp_blks_written int8, + OUT shared_blk_read_time float8, + OUT shared_blk_write_time float8, + OUT local_blk_read_time float8, + OUT local_blk_write_time float8, + OUT temp_blk_read_time float8, + OUT temp_blk_write_time float8, + OUT wal_records int8, + OUT wal_fpi int8, + OUT wal_bytes numeric, + OUT jit_functions int8, + OUT jit_generation_time float8, + OUT jit_inlining_count int8, + OUT jit_inlining_time float8, + OUT jit_optimization_count int8, + OUT jit_optimization_time float8, + OUT jit_emission_count int8, + OUT jit_emission_time float8, + OUT jit_deform_count int8, + OUT jit_deform_time float8, + OUT stats_since timestamp with time zone, + OUT minmax_stats_since timestamp with time zone +) +RETURNS SETOF record +AS 'MODULE_PATHNAME', 'pg_stat_statements_1_11' +LANGUAGE C STRICT VOLATILE PARALLEL SAFE; + +CREATE VIEW pg_stat_statements AS + SELECT * FROM pg_stat_statements(true); + +GRANT SELECT ON pg_stat_statements TO PUBLIC; + +CREATE FUNCTION pg_stat_statements_reset(IN userid Oid DEFAULT 0, + IN dbid Oid DEFAULT 0, + IN queryid bigint DEFAULT 0, + IN minmax_only boolean DEFAULT false +) +RETURNS timestamp with time zone +AS 'MODULE_PATHNAME', 'pg_stat_statements_reset_1_11' +LANGUAGE C STRICT PARALLEL SAFE; + +-- Don't want this to be available to non-superusers. +REVOKE ALL ON FUNCTION pg_stat_statements_reset(Oid, Oid, bigint, boolean) FROM PUBLIC; diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 55b957d2515a2..12718dfe45c2d 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -34,7 +34,7 @@ * in the file to be read or written while holding only shared lock. * * - * Copyright (c) 2008-2023, PostgreSQL Global Development Group + * Copyright (c) 2008-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pg_stat_statements/pg_stat_statements.c @@ -50,6 +50,7 @@ #include "access/parallel.h" #include "catalog/pg_authid.h" #include "common/hashfn.h" +#include "common/int.h" #include "executor/instrument.h" #include "funcapi.h" #include "jit/jit.h" @@ -99,14 +100,6 @@ static const uint32 PGSS_PG_MAJOR_VERSION = PG_VERSION_NUM / 100; #define USAGE_DEALLOC_PERCENT 5 /* free this % of entries at once */ #define IS_STICKY(c) ((c.calls[PGSS_PLAN] + c.calls[PGSS_EXEC]) == 0) -/* - * Utility statements that pgss_ProcessUtility and pgss_post_parse_analyze - * ignores. - */ -#define PGSS_HANDLED_UTILITY(n) (!IsA(n, ExecuteStmt) && \ - !IsA(n, PrepareStmt) && \ - !IsA(n, DeallocateStmt)) - /* * Extension version number, for supporting older extension versions' objects */ @@ -118,7 +111,8 @@ typedef enum pgssVersion PGSS_V1_3, PGSS_V1_8, PGSS_V1_9, - PGSS_V1_10 + PGSS_V1_10, + PGSS_V1_11, } pgssVersion; typedef enum pgssStoreKind @@ -162,9 +156,9 @@ typedef struct Counters double total_time[PGSS_NUMKIND]; /* total planning/execution time, * in msec */ double min_time[PGSS_NUMKIND]; /* minimum planning/execution time in - * msec */ + * msec since min/max reset */ double max_time[PGSS_NUMKIND]; /* maximum planning/execution time in - * msec */ + * msec since min/max reset */ double mean_time[PGSS_NUMKIND]; /* mean planning/execution time in * msec */ double sum_var_time[PGSS_NUMKIND]; /* sum of variances in @@ -180,8 +174,14 @@ typedef struct Counters int64 local_blks_written; /* # of local disk blocks written */ int64 temp_blks_read; /* # of temp blocks read */ int64 temp_blks_written; /* # of temp blocks written */ - double blk_read_time; /* time spent reading blocks, in msec */ - double blk_write_time; /* time spent writing blocks, in msec */ + double shared_blk_read_time; /* time spent reading shared blocks, + * in msec */ + double shared_blk_write_time; /* time spent writing shared blocks, + * in msec */ + double local_blk_read_time; /* time spent reading local blocks, in + * msec */ + double local_blk_write_time; /* time spent writing local blocks, in + * msec */ double temp_blk_read_time; /* time spent reading temp blocks, in msec */ double temp_blk_write_time; /* time spent writing temp blocks, in * msec */ @@ -193,6 +193,10 @@ typedef struct Counters double jit_generation_time; /* total time to generate jit code */ int64 jit_inlining_count; /* number of times inlining time has been * > 0 */ + double jit_deform_time; /* total time to deform tuples in jit code */ + int64 jit_deform_count; /* number of times deform time has been > + * 0 */ + double jit_inlining_time; /* total time to inline jit code */ int64 jit_optimization_count; /* number of times optimization time * has been > 0 */ @@ -225,6 +229,8 @@ typedef struct pgssEntry Size query_offset; /* query text offset in external file */ int query_len; /* # of valid bytes in query string, or -1 */ int encoding; /* query text encoding */ + TimestampTz stats_since; /* timestamp of entry allocation */ + TimestampTz minmax_stats_since; /* timestamp of last min/max values reset */ slock_t mutex; /* protects the counters only */ } pgssEntry; @@ -245,11 +251,8 @@ typedef struct pgssSharedState /*---- Local variables ----*/ -/* Current nesting depth of ExecutorRun+ProcessUtility calls */ -static int exec_nested_level = 0; - -/* Current nesting depth of planner calls */ -static int plan_nested_level = 0; +/* Current nesting depth of planner/ExecutorRun/ProcessUtility calls */ +static int nesting_level = 0; /* Saved hook values in case of unload */ static shmem_request_hook_type prev_shmem_request_hook = NULL; @@ -272,7 +275,7 @@ typedef enum { PGSS_TRACK_NONE, /* track no statements */ PGSS_TRACK_TOP, /* only top level statements */ - PGSS_TRACK_ALL /* all statements, including nested ones */ + PGSS_TRACK_ALL, /* all statements, including nested ones */ } PGSSTrackLevel; static const struct config_enum_entry track_options[] = @@ -308,11 +311,13 @@ static bool pgss_save = true; /* whether to save stats across shutdown */ PG_FUNCTION_INFO_V1(pg_stat_statements_reset); PG_FUNCTION_INFO_V1(pg_stat_statements_reset_1_7); +PG_FUNCTION_INFO_V1(pg_stat_statements_reset_1_11); PG_FUNCTION_INFO_V1(pg_stat_statements_1_2); PG_FUNCTION_INFO_V1(pg_stat_statements_1_3); PG_FUNCTION_INFO_V1(pg_stat_statements_1_8); PG_FUNCTION_INFO_V1(pg_stat_statements_1_9); PG_FUNCTION_INFO_V1(pg_stat_statements_1_10); +PG_FUNCTION_INFO_V1(pg_stat_statements_1_11); PG_FUNCTION_INFO_V1(pg_stat_statements); PG_FUNCTION_INFO_V1(pg_stat_statements_info); @@ -358,7 +363,7 @@ static char *qtext_fetch(Size query_offset, int query_len, char *buffer, Size buffer_size); static bool need_gc_qtexts(void); static void gc_qtexts(void); -static void entry_reset(Oid userid, Oid dbid, uint64 queryid); +static TimestampTz entry_reset(Oid userid, Oid dbid, uint64 queryid, bool minmax_only); static char *generate_normalized_query(JumbleState *jstate, const char *query, int query_loc, int *query_len_p); static void fill_in_constant_lengths(JumbleState *jstate, const char *query, @@ -653,6 +658,8 @@ pgss_shmem_startup(void) /* copy in the actual stats */ entry->counters = temp.counters; + entry->stats_since = temp.stats_since; + entry->minmax_stats_since = temp.minmax_stats_since; } /* Read global statistics for pg_stat_statements */ @@ -825,17 +832,18 @@ pgss_post_parse_analyze(ParseState *pstate, Query *query, JumbleState *jstate) prev_post_parse_analyze_hook(pstate, query, jstate); /* Safety check... */ - if (!pgss || !pgss_hash || !pgss_enabled(exec_nested_level)) + if (!pgss || !pgss_hash || !pgss_enabled(nesting_level)) return; /* - * Clear queryId for prepared statements related utility, as those will - * inherit from the underlying statement's one (except DEALLOCATE which is - * entirely untracked). + * If it's EXECUTE, clear the queryId so that stats will accumulate for + * the underlying PREPARE. But don't do this if we're not tracking + * utility statements, to avoid messing up another extension that might be + * tracking them. */ if (query->utilityStmt) { - if (pgss_track_utility && !PGSS_HANDLED_UTILITY(query->utilityStmt)) + if (pgss_track_utility && IsA(query->utilityStmt, ExecuteStmt)) { query->queryId = UINT64CONST(0); return; @@ -879,15 +887,8 @@ pgss_planner(Query *parse, * We can't process the query if no query_string is provided, as * pgss_store needs it. We also ignore query without queryid, as it would * be treated as a utility statement, which may not be the case. - * - * Note that planner_hook can be called from the planner itself, so we - * have a specific nesting level for the planner. However, utility - * commands containing optimizable statements can also call the planner, - * same for regular DML (for instance for underlying foreign key queries). - * So testing the planner nesting level only is not enough to detect real - * top level planner call. */ - if (pgss_enabled(plan_nested_level + exec_nested_level) + if (pgss_enabled(nesting_level) && pgss_track_planning && query_string && parse->queryId != UINT64CONST(0)) { @@ -908,7 +909,7 @@ pgss_planner(Query *parse, walusage_start = pgWalUsage; INSTR_TIME_SET_CURRENT(start); - plan_nested_level++; + nesting_level++; PG_TRY(); { if (prev_planner_hook) @@ -920,7 +921,7 @@ pgss_planner(Query *parse, } PG_FINALLY(); { - plan_nested_level--; + nesting_level--; } PG_END_TRY(); @@ -949,12 +950,26 @@ pgss_planner(Query *parse, } else { - if (prev_planner_hook) - result = prev_planner_hook(parse, query_string, cursorOptions, - boundParams); - else - result = standard_planner(parse, query_string, cursorOptions, - boundParams); + /* + * Even though we're not tracking plan time for this statement, we + * must still increment the nesting level, to ensure that functions + * evaluated during planning are not seen as top-level calls. + */ + nesting_level++; + PG_TRY(); + { + if (prev_planner_hook) + result = prev_planner_hook(parse, query_string, cursorOptions, + boundParams); + else + result = standard_planner(parse, query_string, cursorOptions, + boundParams); + } + PG_FINALLY(); + { + nesting_level--; + } + PG_END_TRY(); } return result; @@ -976,7 +991,7 @@ pgss_ExecutorStart(QueryDesc *queryDesc, int eflags) * counting of optimizable statements that are directly contained in * utility statements. */ - if (pgss_enabled(exec_nested_level) && queryDesc->plannedstmt->queryId != UINT64CONST(0)) + if (pgss_enabled(nesting_level) && queryDesc->plannedstmt->queryId != UINT64CONST(0)) { /* * Set up to track total elapsed time in ExecutorRun. Make sure the @@ -1001,7 +1016,7 @@ static void pgss_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count, bool execute_once) { - exec_nested_level++; + nesting_level++; PG_TRY(); { if (prev_ExecutorRun) @@ -1011,7 +1026,7 @@ pgss_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count, } PG_FINALLY(); { - exec_nested_level--; + nesting_level--; } PG_END_TRY(); } @@ -1022,7 +1037,7 @@ pgss_ExecutorRun(QueryDesc *queryDesc, ScanDirection direction, uint64 count, static void pgss_ExecutorFinish(QueryDesc *queryDesc) { - exec_nested_level++; + nesting_level++; PG_TRY(); { if (prev_ExecutorFinish) @@ -1032,7 +1047,7 @@ pgss_ExecutorFinish(QueryDesc *queryDesc) } PG_FINALLY(); { - exec_nested_level--; + nesting_level--; } PG_END_TRY(); } @@ -1046,7 +1061,7 @@ pgss_ExecutorEnd(QueryDesc *queryDesc) uint64 queryId = queryDesc->plannedstmt->queryId; if (queryId != UINT64CONST(0) && queryDesc->totaltime && - pgss_enabled(exec_nested_level)) + pgss_enabled(nesting_level)) { /* * Make sure stats accumulation is done. (Note: it's okay if several @@ -1087,6 +1102,7 @@ pgss_ProcessUtility(PlannedStmt *pstmt, const char *queryString, uint64 saved_queryId = pstmt->queryId; int saved_stmt_location = pstmt->stmt_location; int saved_stmt_len = pstmt->stmt_len; + bool enabled = pgss_track_utility && pgss_enabled(nesting_level); /* * Force utility statements to get queryId zero. We do this even in cases @@ -1102,7 +1118,7 @@ pgss_ProcessUtility(PlannedStmt *pstmt, const char *queryString, * that user configured another extension to handle utility statements * only. */ - if (pgss_enabled(exec_nested_level) && pgss_track_utility) + if (enabled) pstmt->queryId = UINT64CONST(0); /* @@ -1114,13 +1130,13 @@ pgss_ProcessUtility(PlannedStmt *pstmt, const char *queryString, * hash table entry for the PREPARE (with hash calculated from the query * string), and then a different one with the same query string (but hash * calculated from the query tree) would be used to accumulate costs of - * ensuing EXECUTEs. This would be confusing, and inconsistent with other - * cases where planning time is not included at all. - * - * Likewise, we don't track execution of DEALLOCATE. + * ensuing EXECUTEs. This would be confusing. Since PREPARE doesn't + * actually run the planner (only parse+rewrite), its costs are generally + * pretty negligible and it seems okay to just ignore it. */ - if (pgss_track_utility && pgss_enabled(exec_nested_level) && - PGSS_HANDLED_UTILITY(parsetree)) + if (enabled && + !IsA(parsetree, ExecuteStmt) && + !IsA(parsetree, PrepareStmt)) { instr_time start; instr_time duration; @@ -1134,7 +1150,7 @@ pgss_ProcessUtility(PlannedStmt *pstmt, const char *queryString, walusage_start = pgWalUsage; INSTR_TIME_SET_CURRENT(start); - exec_nested_level++; + nesting_level++; PG_TRY(); { if (prev_ProcessUtility) @@ -1148,7 +1164,7 @@ pgss_ProcessUtility(PlannedStmt *pstmt, const char *queryString, } PG_FINALLY(); { - exec_nested_level--; + nesting_level--; } PG_END_TRY(); @@ -1198,14 +1214,41 @@ pgss_ProcessUtility(PlannedStmt *pstmt, const char *queryString, } else { - if (prev_ProcessUtility) - prev_ProcessUtility(pstmt, queryString, readOnlyTree, - context, params, queryEnv, - dest, qc); - else - standard_ProcessUtility(pstmt, queryString, readOnlyTree, + /* + * Even though we're not tracking execution time for this statement, + * we must still increment the nesting level, to ensure that functions + * evaluated within it are not seen as top-level calls. But don't do + * so for EXECUTE; that way, when control reaches pgss_planner or + * pgss_ExecutorStart, we will treat the costs as top-level if + * appropriate. Likewise, don't bump for PREPARE, so that parse + * analysis will treat the statement as top-level if appropriate. + * + * To be absolutely certain we don't mess up the nesting level, + * evaluate the bump_level condition just once. + */ + bool bump_level = + !IsA(parsetree, ExecuteStmt) && + !IsA(parsetree, PrepareStmt); + + if (bump_level) + nesting_level++; + PG_TRY(); + { + if (prev_ProcessUtility) + prev_ProcessUtility(pstmt, queryString, readOnlyTree, context, params, queryEnv, dest, qc); + else + standard_ProcessUtility(pstmt, queryString, readOnlyTree, + context, params, queryEnv, + dest, qc); + } + PG_FINALLY(); + { + if (bump_level) + nesting_level--; + } + PG_END_TRY(); } } @@ -1263,7 +1306,7 @@ pgss_store(const char *query, uint64 queryId, key.userid = GetUserId(); key.dbid = MyDatabaseId; key.queryid = queryId; - key.toplevel = (exec_nested_level == 0); + key.toplevel = (nesting_level == 0); /* Lookup the hash table entry with shared lock. */ LWLockAcquire(pgss->lock, LW_SHARED); @@ -1372,11 +1415,23 @@ pgss_store(const char *query, uint64 queryId, e->counters.sum_var_time[kind] += (total_time - old_mean) * (total_time - e->counters.mean_time[kind]); - /* calculate min and max time */ - if (e->counters.min_time[kind] > total_time) + /* + * Calculate min and max time. min = 0 and max = 0 means that the + * min/max statistics were reset + */ + if (e->counters.min_time[kind] == 0 + && e->counters.max_time[kind] == 0) + { e->counters.min_time[kind] = total_time; - if (e->counters.max_time[kind] < total_time) e->counters.max_time[kind] = total_time; + } + else + { + if (e->counters.min_time[kind] > total_time) + e->counters.min_time[kind] = total_time; + if (e->counters.max_time[kind] < total_time) + e->counters.max_time[kind] = total_time; + } } e->counters.rows += rows; e->counters.shared_blks_hit += bufusage->shared_blks_hit; @@ -1389,8 +1444,10 @@ pgss_store(const char *query, uint64 queryId, e->counters.local_blks_written += bufusage->local_blks_written; e->counters.temp_blks_read += bufusage->temp_blks_read; e->counters.temp_blks_written += bufusage->temp_blks_written; - e->counters.blk_read_time += INSTR_TIME_GET_MILLISEC(bufusage->blk_read_time); - e->counters.blk_write_time += INSTR_TIME_GET_MILLISEC(bufusage->blk_write_time); + e->counters.shared_blk_read_time += INSTR_TIME_GET_MILLISEC(bufusage->shared_blk_read_time); + e->counters.shared_blk_write_time += INSTR_TIME_GET_MILLISEC(bufusage->shared_blk_write_time); + e->counters.local_blk_read_time += INSTR_TIME_GET_MILLISEC(bufusage->local_blk_read_time); + e->counters.local_blk_write_time += INSTR_TIME_GET_MILLISEC(bufusage->local_blk_write_time); e->counters.temp_blk_read_time += INSTR_TIME_GET_MILLISEC(bufusage->temp_blk_read_time); e->counters.temp_blk_write_time += INSTR_TIME_GET_MILLISEC(bufusage->temp_blk_write_time); e->counters.usage += USAGE_EXEC(total_time); @@ -1402,6 +1459,10 @@ pgss_store(const char *query, uint64 queryId, e->counters.jit_functions += jitusage->created_functions; e->counters.jit_generation_time += INSTR_TIME_GET_MILLISEC(jitusage->generation_counter); + if (INSTR_TIME_GET_MILLISEC(jitusage->deform_counter)) + e->counters.jit_deform_count++; + e->counters.jit_deform_time += INSTR_TIME_GET_MILLISEC(jitusage->deform_counter); + if (INSTR_TIME_GET_MILLISEC(jitusage->inlining_counter)) e->counters.jit_inlining_count++; e->counters.jit_inlining_time += INSTR_TIME_GET_MILLISEC(jitusage->inlining_counter); @@ -1440,18 +1501,34 @@ pg_stat_statements_reset_1_7(PG_FUNCTION_ARGS) dbid = PG_GETARG_OID(1); queryid = (uint64) PG_GETARG_INT64(2); - entry_reset(userid, dbid, queryid); + entry_reset(userid, dbid, queryid, false); PG_RETURN_VOID(); } +Datum +pg_stat_statements_reset_1_11(PG_FUNCTION_ARGS) +{ + Oid userid; + Oid dbid; + uint64 queryid; + bool minmax_only; + + userid = PG_GETARG_OID(0); + dbid = PG_GETARG_OID(1); + queryid = (uint64) PG_GETARG_INT64(2); + minmax_only = PG_GETARG_BOOL(3); + + PG_RETURN_TIMESTAMPTZ(entry_reset(userid, dbid, queryid, minmax_only)); +} + /* * Reset statement statistics. */ Datum pg_stat_statements_reset(PG_FUNCTION_ARGS) { - entry_reset(0, 0, 0); + entry_reset(0, 0, 0, false); PG_RETURN_VOID(); } @@ -1464,7 +1541,8 @@ pg_stat_statements_reset(PG_FUNCTION_ARGS) #define PG_STAT_STATEMENTS_COLS_V1_8 32 #define PG_STAT_STATEMENTS_COLS_V1_9 33 #define PG_STAT_STATEMENTS_COLS_V1_10 43 -#define PG_STAT_STATEMENTS_COLS 43 /* maximum of above */ +#define PG_STAT_STATEMENTS_COLS_V1_11 49 +#define PG_STAT_STATEMENTS_COLS 49 /* maximum of above */ /* * Retrieve statement statistics. @@ -1476,6 +1554,16 @@ pg_stat_statements_reset(PG_FUNCTION_ARGS) * expected API version is identified by embedding it in the C name of the * function. Unfortunately we weren't bright enough to do that for 1.1. */ +Datum +pg_stat_statements_1_11(PG_FUNCTION_ARGS) +{ + bool showtext = PG_GETARG_BOOL(0); + + pg_stat_statements_internal(fcinfo, PGSS_V1_11, showtext); + + return (Datum) 0; +} + Datum pg_stat_statements_1_10(PG_FUNCTION_ARGS) { @@ -1565,7 +1653,7 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, if (!pgss || !pgss_hash) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("pg_stat_statements must be loaded via shared_preload_libraries"))); + errmsg("pg_stat_statements must be loaded via \"shared_preload_libraries\""))); InitMaterializedSRF(fcinfo, 0); @@ -1606,6 +1694,10 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, if (api_version != PGSS_V1_10) elog(ERROR, "incorrect number of output arguments"); break; + case PG_STAT_STATEMENTS_COLS_V1_11: + if (api_version != PGSS_V1_11) + elog(ERROR, "incorrect number of output arguments"); + break; default: elog(ERROR, "incorrect number of output arguments"); } @@ -1683,6 +1775,8 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, Counters tmp; double stddev; int64 queryid = entry->key.queryid; + TimestampTz stats_since; + TimestampTz minmax_stats_since; memset(values, 0, sizeof(values)); memset(nulls, 0, sizeof(nulls)); @@ -1751,6 +1845,8 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, SpinLockAcquire(&e->mutex); tmp = e->counters; + stats_since = e->stats_since; + minmax_stats_since = e->minmax_stats_since; SpinLockRelease(&e->mutex); } @@ -1802,8 +1898,13 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, values[i++] = Int64GetDatumFast(tmp.temp_blks_written); if (api_version >= PGSS_V1_1) { - values[i++] = Float8GetDatumFast(tmp.blk_read_time); - values[i++] = Float8GetDatumFast(tmp.blk_write_time); + values[i++] = Float8GetDatumFast(tmp.shared_blk_read_time); + values[i++] = Float8GetDatumFast(tmp.shared_blk_write_time); + } + if (api_version >= PGSS_V1_11) + { + values[i++] = Float8GetDatumFast(tmp.local_blk_read_time); + values[i++] = Float8GetDatumFast(tmp.local_blk_write_time); } if (api_version >= PGSS_V1_10) { @@ -1838,6 +1939,13 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, values[i++] = Int64GetDatumFast(tmp.jit_emission_count); values[i++] = Float8GetDatumFast(tmp.jit_emission_time); } + if (api_version >= PGSS_V1_11) + { + values[i++] = Int64GetDatumFast(tmp.jit_deform_count); + values[i++] = Float8GetDatumFast(tmp.jit_deform_time); + values[i++] = TimestampTzGetDatum(stats_since); + values[i++] = TimestampTzGetDatum(minmax_stats_since); + } Assert(i == (api_version == PGSS_V1_0 ? PG_STAT_STATEMENTS_COLS_V1_0 : api_version == PGSS_V1_1 ? PG_STAT_STATEMENTS_COLS_V1_1 : @@ -1846,6 +1954,7 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, api_version == PGSS_V1_8 ? PG_STAT_STATEMENTS_COLS_V1_8 : api_version == PGSS_V1_9 ? PG_STAT_STATEMENTS_COLS_V1_9 : api_version == PGSS_V1_10 ? PG_STAT_STATEMENTS_COLS_V1_10 : + api_version == PGSS_V1_11 ? PG_STAT_STATEMENTS_COLS_V1_11 : -1 /* fail if you forget to update this assert */ )); tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); @@ -1873,7 +1982,7 @@ pg_stat_statements_info(PG_FUNCTION_ARGS) if (!pgss || !pgss_hash) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("pg_stat_statements must be loaded via shared_preload_libraries"))); + errmsg("pg_stat_statements must be loaded via \"shared_preload_libraries\""))); /* Build a tuple descriptor for our result type */ if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) @@ -1954,6 +2063,8 @@ entry_alloc(pgssHashKey *key, Size query_offset, int query_len, int encoding, entry->query_offset = query_offset; entry->query_len = query_len; entry->encoding = encoding; + entry->stats_since = GetCurrentTimestamp(); + entry->minmax_stats_since = entry->stats_since; } return entry; @@ -2517,11 +2628,30 @@ gc_qtexts(void) record_gc_qtexts(); } +#define SINGLE_ENTRY_RESET(e) \ +if (e) { \ + if (minmax_only) { \ + /* When requested reset only min/max statistics of an entry */ \ + for (int kind = 0; kind < PGSS_NUMKIND; kind++) \ + { \ + e->counters.max_time[kind] = 0; \ + e->counters.min_time[kind] = 0; \ + } \ + e->minmax_stats_since = stats_reset; \ + } \ + else \ + { \ + /* Remove the key otherwise */ \ + hash_search(pgss_hash, &e->key, HASH_REMOVE, NULL); \ + num_remove++; \ + } \ +} + /* - * Release entries corresponding to parameters passed. + * Reset entries corresponding to parameters passed. */ -static void -entry_reset(Oid userid, Oid dbid, uint64 queryid) +static TimestampTz +entry_reset(Oid userid, Oid dbid, uint64 queryid, bool minmax_only) { HASH_SEQ_STATUS hash_seq; pgssEntry *entry; @@ -2529,15 +2659,18 @@ entry_reset(Oid userid, Oid dbid, uint64 queryid) long num_entries; long num_remove = 0; pgssHashKey key; + TimestampTz stats_reset; if (!pgss || !pgss_hash) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("pg_stat_statements must be loaded via shared_preload_libraries"))); + errmsg("pg_stat_statements must be loaded via \"shared_preload_libraries\""))); LWLockAcquire(pgss->lock, LW_EXCLUSIVE); num_entries = hash_get_num_entries(pgss_hash); + stats_reset = GetCurrentTimestamp(); + if (userid != 0 && dbid != 0 && queryid != UINT64CONST(0)) { /* If all the parameters are available, use the fast path. */ @@ -2547,22 +2680,23 @@ entry_reset(Oid userid, Oid dbid, uint64 queryid) key.queryid = queryid; /* - * Remove the key if it exists, starting with the non-top-level entry. + * Reset the entry if it exists, starting with the non-top-level + * entry. */ key.toplevel = false; - entry = (pgssEntry *) hash_search(pgss_hash, &key, HASH_REMOVE, NULL); - if (entry) /* found */ - num_remove++; + entry = (pgssEntry *) hash_search(pgss_hash, &key, HASH_FIND, NULL); + + SINGLE_ENTRY_RESET(entry); - /* Also remove the top-level entry if it exists. */ + /* Also reset the top-level entry if it exists. */ key.toplevel = true; - entry = (pgssEntry *) hash_search(pgss_hash, &key, HASH_REMOVE, NULL); - if (entry) /* found */ - num_remove++; + entry = (pgssEntry *) hash_search(pgss_hash, &key, HASH_FIND, NULL); + + SINGLE_ENTRY_RESET(entry); } else if (userid != 0 || dbid != 0 || queryid != UINT64CONST(0)) { - /* Remove entries corresponding to valid parameters. */ + /* Reset entries corresponding to valid parameters. */ hash_seq_init(&hash_seq, pgss_hash); while ((entry = hash_seq_search(&hash_seq)) != NULL) { @@ -2570,19 +2704,17 @@ entry_reset(Oid userid, Oid dbid, uint64 queryid) (!dbid || entry->key.dbid == dbid) && (!queryid || entry->key.queryid == queryid)) { - hash_search(pgss_hash, &entry->key, HASH_REMOVE, NULL); - num_remove++; + SINGLE_ENTRY_RESET(entry); } } } else { - /* Remove all entries. */ + /* Reset all entries. */ hash_seq_init(&hash_seq, pgss_hash); while ((entry = hash_seq_search(&hash_seq)) != NULL) { - hash_search(pgss_hash, &entry->key, HASH_REMOVE, NULL); - num_remove++; + SINGLE_ENTRY_RESET(entry); } } @@ -2596,7 +2728,6 @@ entry_reset(Oid userid, Oid dbid, uint64 queryid) */ { volatile pgssSharedState *s = (volatile pgssSharedState *) pgss; - TimestampTz stats_reset = GetCurrentTimestamp(); SpinLockAcquire(&s->mutex); s->stats.dealloc = 0; @@ -2634,6 +2765,8 @@ entry_reset(Oid userid, Oid dbid, uint64 queryid) release_lock: LWLockRelease(pgss->lock); + + return stats_reset; } /* @@ -2868,10 +3001,5 @@ comp_location(const void *a, const void *b) int l = ((const LocationLen *) a)->location; int r = ((const LocationLen *) b)->location; - if (l < r) - return -1; - else if (l > r) - return +1; - else - return 0; + return pg_cmp_s32(l, r); } diff --git a/contrib/pg_stat_statements/pg_stat_statements.conf b/contrib/pg_stat_statements/pg_stat_statements.conf index 13346e2807835..0e900d7119baa 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.conf +++ b/contrib/pg_stat_statements/pg_stat_statements.conf @@ -1 +1,2 @@ shared_preload_libraries = 'pg_stat_statements' +max_prepared_transactions = 5 diff --git a/contrib/pg_stat_statements/pg_stat_statements.control b/contrib/pg_stat_statements/pg_stat_statements.control index 0747e48138373..8a76106ec6763 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.control +++ b/contrib/pg_stat_statements/pg_stat_statements.control @@ -1,5 +1,5 @@ # pg_stat_statements extension comment = 'track planning and execution statistics of all SQL statements executed' -default_version = '1.10' +default_version = '1.11' module_pathname = '$libdir/pg_stat_statements' relocatable = true diff --git a/contrib/pg_stat_statements/sql/cursors.sql b/contrib/pg_stat_statements/sql/cursors.sql index cef6dc9e1b8d2..61738ac470e82 100644 --- a/contrib/pg_stat_statements/sql/cursors.sql +++ b/contrib/pg_stat_statements/sql/cursors.sql @@ -4,7 +4,7 @@ -- These tests require track_utility to be enabled. SET pg_stat_statements.track_utility = TRUE; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- DECLARE -- SELECT is normalized. @@ -14,7 +14,7 @@ DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT 2; CLOSE cursor_stats_1; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- FETCH BEGIN; @@ -27,4 +27,4 @@ CLOSE cursor_stats_2; COMMIT; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; diff --git a/contrib/pg_stat_statements/sql/dml.sql b/contrib/pg_stat_statements/sql/dml.sql index af2f9fcf73b85..9986b0a22d3dd 100644 --- a/contrib/pg_stat_statements/sql/dml.sql +++ b/contrib/pg_stat_statements/sql/dml.sql @@ -46,7 +46,7 @@ SELECT * FROM pgss_dml_tab ORDER BY a; SELECT * FROM pgss_dml_tab WHERE a IN (1, 2, 3, 4, 5); SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- MERGE MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a >= 4) @@ -73,4 +73,23 @@ MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a DROP TABLE pgss_dml_tab; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); + +-- check that [temp] table relation extensions are tracked as writes +CREATE TABLE pgss_extend_tab (a int, b text); +CREATE TEMP TABLE pgss_extend_temp_tab (a int, b text); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; +INSERT INTO pgss_extend_tab (a, b) SELECT generate_series(1, 1000), 'something'; +INSERT INTO pgss_extend_temp_tab (a, b) SELECT generate_series(1, 1000), 'something'; +WITH sizes AS ( + SELECT + pg_relation_size('pgss_extend_tab') / current_setting('block_size')::int8 AS rel_size, + pg_relation_size('pgss_extend_temp_tab') / current_setting('block_size')::int8 AS temp_rel_size +) +SELECT + SUM(local_blks_written) >= (SELECT temp_rel_size FROM sizes) AS temp_written_ok, + SUM(local_blks_dirtied) >= (SELECT temp_rel_size FROM sizes) AS temp_dirtied_ok, + SUM(shared_blks_written) >= (SELECT rel_size FROM sizes) AS written_ok, + SUM(shared_blks_dirtied) >= (SELECT rel_size FROM sizes) AS dirtied_ok +FROM pg_stat_statements; + +SELECT pg_stat_statements_reset() IS NOT NULL AS t; diff --git a/contrib/pg_stat_statements/sql/entry_timestamp.sql b/contrib/pg_stat_statements/sql/entry_timestamp.sql new file mode 100644 index 0000000000000..d6d3027ab4f12 --- /dev/null +++ b/contrib/pg_stat_statements/sql/entry_timestamp.sql @@ -0,0 +1,114 @@ +-- +-- statement timestamps +-- + +-- planning time is needed during tests +SET pg_stat_statements.track_planning = TRUE; + +SELECT 1 AS "STMTTS1"; +SELECT now() AS ref_ts \gset +SELECT 1,2 AS "STMTTS2"; +SELECT stats_since >= :'ref_ts', count(*) FROM pg_stat_statements +WHERE query LIKE '%STMTTS%' +GROUP BY stats_since >= :'ref_ts' +ORDER BY stats_since >= :'ref_ts'; + +SELECT now() AS ref_ts \gset +SELECT + count(*) as total, + count(*) FILTER ( + WHERE min_plan_time + max_plan_time = 0 + ) as minmax_plan_zero, + count(*) FILTER ( + WHERE min_exec_time + max_exec_time = 0 + ) as minmax_exec_zero, + count(*) FILTER ( + WHERE minmax_stats_since >= :'ref_ts' + ) as minmax_stats_since_after_ref, + count(*) FILTER ( + WHERE stats_since >= :'ref_ts' + ) as stats_since_after_ref +FROM pg_stat_statements +WHERE query LIKE '%STMTTS%'; + +-- Perform single min/max reset +SELECT pg_stat_statements_reset(0, 0, queryid, true) AS minmax_reset_ts +FROM pg_stat_statements +WHERE query LIKE '%STMTTS1%' \gset + +-- check +SELECT + count(*) as total, + count(*) FILTER ( + WHERE min_plan_time + max_plan_time = 0 + ) as minmax_plan_zero, + count(*) FILTER ( + WHERE min_exec_time + max_exec_time = 0 + ) as minmax_exec_zero, + count(*) FILTER ( + WHERE minmax_stats_since >= :'ref_ts' + ) as minmax_stats_since_after_ref, + count(*) FILTER ( + WHERE stats_since >= :'ref_ts' + ) as stats_since_after_ref +FROM pg_stat_statements +WHERE query LIKE '%STMTTS%'; + +-- check minmax reset timestamps +SELECT +query, minmax_stats_since = :'minmax_reset_ts' AS reset_ts_match +FROM pg_stat_statements +WHERE query LIKE '%STMTTS%' +ORDER BY query COLLATE "C"; + +-- check that minmax reset does not set stats_reset +SELECT +stats_reset = :'minmax_reset_ts' AS stats_reset_ts_match +FROM pg_stat_statements_info; + +-- Perform common min/max reset +SELECT pg_stat_statements_reset(0, 0, 0, true) AS minmax_reset_ts \gset + +-- check again +SELECT + count(*) as total, + count(*) FILTER ( + WHERE min_plan_time + max_plan_time = 0 + ) as minmax_plan_zero, + count(*) FILTER ( + WHERE min_exec_time + max_exec_time = 0 + ) as minmax_exec_zero, + count(*) FILTER ( + WHERE minmax_stats_since >= :'ref_ts' + ) as minmax_ts_after_ref, + count(*) FILTER ( + WHERE minmax_stats_since = :'minmax_reset_ts' + ) as minmax_ts_match, + count(*) FILTER ( + WHERE stats_since >= :'ref_ts' + ) as stats_since_after_ref +FROM pg_stat_statements +WHERE query LIKE '%STMTTS%'; + +-- Execute first query once more to check stats update +SELECT 1 AS "STMTTS1"; + +-- check +-- we don't check planing times here to be independent of +-- plan caching approach +SELECT + count(*) as total, + count(*) FILTER ( + WHERE min_exec_time + max_exec_time = 0 + ) as minmax_exec_zero, + count(*) FILTER ( + WHERE minmax_stats_since >= :'ref_ts' + ) as minmax_ts_after_ref, + count(*) FILTER ( + WHERE stats_since >= :'ref_ts' + ) as stats_since_after_ref +FROM pg_stat_statements +WHERE query LIKE '%STMTTS%'; + +-- Cleanup +SELECT pg_stat_statements_reset() IS NOT NULL AS t; diff --git a/contrib/pg_stat_statements/sql/extended.sql b/contrib/pg_stat_statements/sql/extended.sql new file mode 100644 index 0000000000000..07b6c5a93d673 --- /dev/null +++ b/contrib/pg_stat_statements/sql/extended.sql @@ -0,0 +1,7 @@ +-- Tests with extended query protocol + +SET pg_stat_statements.track_utility = FALSE; + +-- This test checks that an execute message sets a query ID. +SELECT query_id IS NOT NULL AS query_id_set + FROM pg_stat_activity WHERE pid = pg_backend_pid() \bind \g diff --git a/contrib/pg_stat_statements/sql/level_tracking.sql b/contrib/pg_stat_statements/sql/level_tracking.sql index 0c20b8ce69b71..65a17147a5a96 100644 --- a/contrib/pg_stat_statements/sql/level_tracking.sql +++ b/contrib/pg_stat_statements/sql/level_tracking.sql @@ -3,7 +3,7 @@ -- SET pg_stat_statements.track_utility = TRUE; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- DO block - top-level tracking. CREATE TABLE stats_track_tab (x int); @@ -16,7 +16,7 @@ END; $$ LANGUAGE plpgsql; SELECT toplevel, calls, query FROM pg_stat_statements WHERE query LIKE '%DELETE%' ORDER BY query COLLATE "C", toplevel; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- DO block - all-level tracking. SET pg_stat_statements.track = 'all'; @@ -33,10 +33,65 @@ END; $$; SELECT toplevel, calls, query FROM pg_stat_statements ORDER BY query COLLATE "C", toplevel; +-- Procedure with multiple utility statements. +CREATE OR REPLACE PROCEDURE proc_with_utility_stmt() +LANGUAGE SQL +AS $$ + SHOW pg_stat_statements.track; + show pg_stat_statements.track; + SHOW pg_stat_statements.track_utility; +$$; +SET pg_stat_statements.track_utility = TRUE; +-- all-level tracking. +SET pg_stat_statements.track = 'all'; +SELECT pg_stat_statements_reset() IS NOT NULL AS t; +CALL proc_with_utility_stmt(); +SELECT toplevel, calls, query FROM pg_stat_statements + ORDER BY query COLLATE "C", toplevel; +-- top-level tracking. +SET pg_stat_statements.track = 'top'; +SELECT pg_stat_statements_reset() IS NOT NULL AS t; +CALL proc_with_utility_stmt(); +SELECT toplevel, calls, query FROM pg_stat_statements + ORDER BY query COLLATE "C", toplevel; + +-- DO block - top-level tracking without utility. +SET pg_stat_statements.track = 'top'; +SET pg_stat_statements.track_utility = FALSE; +SELECT pg_stat_statements_reset() IS NOT NULL AS t; +DELETE FROM stats_track_tab; +DO $$ +BEGIN + DELETE FROM stats_track_tab; +END; $$; +DO LANGUAGE plpgsql $$ +BEGIN + -- this is a SELECT + PERFORM 'hello world'::TEXT; +END; $$; +SELECT toplevel, calls, query FROM pg_stat_statements + ORDER BY query COLLATE "C", toplevel; + +-- DO block - all-level tracking without utility. +SET pg_stat_statements.track = 'all'; +SELECT pg_stat_statements_reset() IS NOT NULL AS t; +DELETE FROM stats_track_tab; +DO $$ +BEGIN + DELETE FROM stats_track_tab; +END; $$; +DO LANGUAGE plpgsql $$ +BEGIN + -- this is a SELECT + PERFORM 'hello world'::TEXT; +END; $$; +SELECT toplevel, calls, query FROM pg_stat_statements + ORDER BY query COLLATE "C", toplevel; + -- PL/pgSQL function - top-level tracking. SET pg_stat_statements.track = 'top'; SET pg_stat_statements.track_utility = FALSE; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; CREATE FUNCTION PLUS_TWO(i INTEGER) RETURNS INTEGER AS $$ DECLARE r INTEGER; @@ -57,13 +112,23 @@ SELECT PLUS_ONE(10); SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; +-- immutable SQL function --- can be executed at plan time +CREATE FUNCTION PLUS_THREE(i INTEGER) RETURNS INTEGER AS +$$ SELECT i + 3 LIMIT 1 $$ IMMUTABLE LANGUAGE SQL; + +SELECT PLUS_THREE(8); +SELECT PLUS_THREE(10); + +SELECT toplevel, calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; + -- PL/pgSQL function - all-level tracking. SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- we drop and recreate the functions to avoid any caching funnies DROP FUNCTION PLUS_ONE(INTEGER); DROP FUNCTION PLUS_TWO(INTEGER); +DROP FUNCTION PLUS_THREE(INTEGER); -- PL/pgSQL function CREATE FUNCTION PLUS_TWO(i INTEGER) RETURNS INTEGER AS $$ @@ -85,16 +150,24 @@ SELECT PLUS_ONE(3); SELECT PLUS_ONE(1); SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -DROP FUNCTION PLUS_ONE(INTEGER); + +-- immutable SQL function --- can be executed at plan time +CREATE FUNCTION PLUS_THREE(i INTEGER) RETURNS INTEGER AS +$$ SELECT i + 3 LIMIT 1 $$ IMMUTABLE LANGUAGE SQL; + +SELECT PLUS_THREE(8); +SELECT PLUS_THREE(10); + +SELECT toplevel, calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -- -- pg_stat_statements.track = none -- SET pg_stat_statements.track = 'none'; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; SELECT 1 AS "one"; SELECT 1 + 1 AS "two"; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; diff --git a/contrib/pg_stat_statements/sql/oldextversions.sql b/contrib/pg_stat_statements/sql/oldextversions.sql index e2a83106d4cec..38d5505d0db7d 100644 --- a/contrib/pg_stat_statements/sql/oldextversions.sql +++ b/contrib/pg_stat_statements/sql/oldextversions.sql @@ -28,13 +28,15 @@ SET SESSION AUTHORIZATION pg_read_all_stats; SELECT pg_stat_statements_reset(); RESET SESSION AUTHORIZATION; SELECT pg_get_functiondef('pg_stat_statements_reset'::regproc); +SELECT pg_stat_statements_reset(); \d pg_stat_statements SELECT count(*) > 0 AS has_data FROM pg_stat_statements; -- New functions and views for pg_stat_statements in 1.8 AlTER EXTENSION pg_stat_statements UPDATE TO '1.8'; -\d pg_stat_statements SELECT pg_get_functiondef('pg_stat_statements_reset'::regproc); +\d pg_stat_statements +SELECT count(*) > 0 AS has_data FROM pg_stat_statements; -- New function pg_stat_statement_info, and new function -- and view for pg_stat_statements introduced in 1.9 @@ -48,4 +50,12 @@ AlTER EXTENSION pg_stat_statements UPDATE TO '1.10'; \d pg_stat_statements SELECT count(*) > 0 AS has_data FROM pg_stat_statements; +-- New functions and views for pg_stat_statements in 1.11 +AlTER EXTENSION pg_stat_statements UPDATE TO '1.11'; +\d pg_stat_statements +SELECT count(*) > 0 AS has_data FROM pg_stat_statements; +-- New parameter minmax_only of pg_stat_statements_reset function +SELECT pg_get_functiondef('pg_stat_statements_reset'::regproc); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + DROP EXTENSION pg_stat_statements; diff --git a/contrib/pg_stat_statements/sql/planning.sql b/contrib/pg_stat_statements/sql/planning.sql index a59b9363c4b38..46f5d9b951c45 100644 --- a/contrib/pg_stat_statements/sql/planning.sql +++ b/contrib/pg_stat_statements/sql/planning.sql @@ -4,7 +4,7 @@ -- These tests require track_planning to be enabled. SET pg_stat_statements.track_planning = TRUE; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- -- [re]plan counting @@ -28,4 +28,4 @@ SELECT plans >= 2 AND plans <= calls AS plans_ok, calls, rows, query FROM pg_sta -- Cleanup DROP TABLE stats_plan_test; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; diff --git a/contrib/pg_stat_statements/sql/select.sql b/contrib/pg_stat_statements/sql/select.sql index eef7b0bbf5809..eb45cb81ad23f 100644 --- a/contrib/pg_stat_statements/sql/select.sql +++ b/contrib/pg_stat_statements/sql/select.sql @@ -5,7 +5,7 @@ CREATE EXTENSION pg_stat_statements; SET pg_stat_statements.track_utility = FALSE; SET pg_stat_statements.track_planning = TRUE; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- -- simple and compound statements @@ -56,7 +56,7 @@ EXECUTE pgss_test(1); DEALLOCATE pgss_test; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- -- queries with locking clauses @@ -64,7 +64,7 @@ SELECT pg_stat_statements_reset(); CREATE TABLE pgss_a (id integer PRIMARY KEY); CREATE TABLE pgss_b (id integer PRIMARY KEY, a_id integer REFERENCES pgss_a); -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- control query SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id; @@ -92,7 +92,7 @@ DROP TABLE pgss_a, pgss_b CASCADE; -- -- access to pg_stat_statements_info view -- -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; SELECT dealloc FROM pg_stat_statements_info; -- FROM [ONLY] @@ -146,4 +146,4 @@ SELECT ( ) FROM (VALUES(6,7)) v3(e,f) GROUP BY ROLLUP(e,f); SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%SELECT GROUPING%'; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; diff --git a/contrib/pg_stat_statements/sql/user_activity.sql b/contrib/pg_stat_statements/sql/user_activity.sql index 4b95edda89066..07a5f36fc12d0 100644 --- a/contrib/pg_stat_statements/sql/user_activity.sql +++ b/contrib/pg_stat_statements/sql/user_activity.sql @@ -3,7 +3,7 @@ -- SET pg_stat_statements.track_utility = TRUE; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; CREATE ROLE regress_stats_user1; CREATE ROLE regress_stats_user2; @@ -24,7 +24,7 @@ SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; -- -- Don't reset anything if any of the parameter is NULL -- -SELECT pg_stat_statements_reset(NULL); +SELECT pg_stat_statements_reset(NULL) IS NOT NULL AS t; SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; -- @@ -35,27 +35,28 @@ SELECT pg_stat_statements_reset( (SELECT r.oid FROM pg_roles AS r WHERE r.rolname = 'regress_stats_user2'), (SELECT d.oid FROM pg_database As d where datname = current_database()), (SELECT s.queryid FROM pg_stat_statements AS s - WHERE s.query = 'SELECT $1+$2 AS "TWO"' LIMIT 1)); + WHERE s.query = 'SELECT $1+$2 AS "TWO"' LIMIT 1)) + IS NOT NULL AS t; SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; -- -- remove query ('SELECT $1 AS "ONE"') executed by two users -- -SELECT pg_stat_statements_reset(0,0,s.queryid) +SELECT pg_stat_statements_reset(0,0,s.queryid) IS NOT NULL AS t FROM pg_stat_statements AS s WHERE s.query = 'SELECT $1 AS "ONE"'; SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; -- -- remove query of a user (regress_stats_user1) -- -SELECT pg_stat_statements_reset(r.oid) +SELECT pg_stat_statements_reset(r.oid) IS NOT NULL AS t FROM pg_roles AS r WHERE r.rolname = 'regress_stats_user1'; SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; -- -- reset all -- -SELECT pg_stat_statements_reset(0,0,0); +SELECT pg_stat_statements_reset(0,0,0) IS NOT NULL AS t; SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; -- @@ -63,4 +64,4 @@ SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; -- DROP ROLE regress_stats_user1; DROP ROLE regress_stats_user2; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; diff --git a/contrib/pg_stat_statements/sql/utility.sql b/contrib/pg_stat_statements/sql/utility.sql index 225d30a62a645..4f7afece1decc 100644 --- a/contrib/pg_stat_statements/sql/utility.sql +++ b/contrib/pg_stat_statements/sql/utility.sql @@ -4,7 +4,7 @@ -- These tests require track_utility to be enabled. SET pg_stat_statements.track_utility = TRUE; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- Tables, indexes, triggers CREATE TEMP TABLE tab_stats (a int, b char(20)); @@ -18,7 +18,7 @@ DROP TABLE IF EXISTS tab_stats \; DROP TABLE IF EXISTS tab_stats \; Drop Table If Exists tab_stats \; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- Partitions CREATE TABLE pt_stats (a int, b int) PARTITION BY range (a); @@ -83,7 +83,7 @@ CREATE STATISTICS tab_expr_stats_1 (mcv) ON a, (2*a), (3*b) FROM tab_expr_stats; DROP TABLE tab_expr_stats; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- Transaction statements BEGIN; @@ -113,7 +113,34 @@ COMMIT; BEGIN TRANSACTION NOT DEFERRABLE, READ ONLY, READ WRITE, DEFERRABLE; COMMIT; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + +-- Two-phase transactions +BEGIN; +PREPARE TRANSACTION 'stat_trans1'; +COMMIT PREPARED 'stat_trans1'; +BEGIN; +PREPARE TRANSACTION 'stat_trans2'; +ROLLBACK PREPARED 'stat_trans2'; +SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + +-- Savepoints +BEGIN; +SAVEPOINT sp1; +SAVEPOINT sp2; +SAVEPOINT sp3; +SAVEPOINT sp4; +ROLLBACK TO sp4; +ROLLBACK TO SAVEPOINT sp4; +ROLLBACK TRANSACTION TO SAVEPOINT sp3; +RELEASE sp3; +RELEASE SAVEPOINT sp2; +ROLLBACK TO sp1; +RELEASE SAVEPOINT sp1; +COMMIT; +SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- EXPLAIN statements -- A Query is used, normalized by the query jumbling. @@ -137,16 +164,41 @@ DECLARE BEGIN SELECT (i + j)::int INTO r; END; $$ LANGUAGE plpgsql; -SELECT pg_stat_statements_reset(); +-- Overloaded functions. +CREATE OR REPLACE PROCEDURE overload(i int) AS $$ +DECLARE + r int; +BEGIN + SELECT (i + i)::int INTO r; +END; $$ LANGUAGE plpgsql; +CREATE OR REPLACE PROCEDURE overload(i text) AS $$ +DECLARE + r text; +BEGIN + SELECT i::text INTO r; +END; $$ LANGUAGE plpgsql; +-- Mix of IN/OUT parameters. +CREATE OR REPLACE PROCEDURE in_out(i int, i2 OUT int, i3 INOUT int) AS $$ +DECLARE + r int; +BEGIN + i2 := i; + i3 := i3 + i; +END; $$ LANGUAGE plpgsql; +SELECT pg_stat_statements_reset() IS NOT NULL AS t; CALL sum_one(3); CALL sum_one(199); CALL sum_two(1,1); CALL sum_two(1,2); +CALL overload(1); +CALL overload('A'); +CALL in_out(1, NULL, 1); +CALL in_out(2, 1, 2); SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -- COPY CREATE TABLE copy_stats (a int, b int); -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- Some queries with A_Const nodes. COPY (SELECT 1) TO STDOUT; COPY (SELECT 2) TO STDOUT; @@ -158,7 +210,7 @@ COPY (DELETE FROM copy_stats WHERE a = 1 RETURNING *) TO STDOUT; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; DROP TABLE copy_stats; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- CREATE TABLE AS -- SELECT queries are normalized, creating matching query IDs. @@ -175,7 +227,7 @@ CREATE TABLE ctas_stats_2 AS FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 1; DROP TABLE ctas_stats_2; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- CREATE MATERIALIZED VIEW -- SELECT queries are normalized, creating matching query IDs. @@ -188,7 +240,7 @@ CREATE MATERIALIZED VIEW matview_stats_1 AS FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 3; DROP MATERIALIZED VIEW matview_stats_1; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- CREATE VIEW CREATE VIEW view_stats_1 AS @@ -200,7 +252,7 @@ CREATE VIEW view_stats_1 AS FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 3; DROP VIEW view_stats_1; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- Domains CREATE DOMAIN domain_stats AS int CHECK (VALUE > 0); @@ -208,7 +260,20 @@ ALTER DOMAIN domain_stats SET DEFAULT '3'; ALTER DOMAIN domain_stats ADD CONSTRAINT higher_than_one CHECK (VALUE > 1); DROP DOMAIN domain_stats; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + +-- Execution statements +SELECT 1 as a; +PREPARE stat_select AS SELECT $1 AS a; +EXECUTE stat_select (1); +DEALLOCATE stat_select; +PREPARE stat_select AS SELECT $1 AS a; +EXECUTE stat_select (2); +DEALLOCATE PREPARE stat_select; +DEALLOCATE ALL; +DEALLOCATE PREPARE ALL; +SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- SET statements. -- These use two different strings, still they count as one entry. @@ -234,7 +299,7 @@ RESET SESSION AUTHORIZATION; COMMIT; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; -- -- Track the total number of rows retrieved or affected by the utility @@ -263,17 +328,4 @@ DROP MATERIALIZED VIEW pgss_matv; DROP TABLE pgss_ctas; DROP TABLE pgss_select_into; -SELECT pg_stat_statements_reset(); - --- SET statements. --- These use two different strings, still they count as one entry. -SET work_mem = '1MB'; -Set work_mem = '1MB'; -SET work_mem = '2MB'; -RESET work_mem; -SET enable_seqscan = off; -SET enable_seqscan = on; -RESET enable_seqscan; - -SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; diff --git a/contrib/pg_stat_statements/sql/wal.sql b/contrib/pg_stat_statements/sql/wal.sql index 34b21c0fa98a0..1dc1552a81ebc 100644 --- a/contrib/pg_stat_statements/sql/wal.sql +++ b/contrib/pg_stat_statements/sql/wal.sql @@ -17,4 +17,4 @@ wal_bytes > 0 as wal_bytes_generated, wal_records > 0 as wal_records_generated, wal_records >= rows as wal_records_ge_rows FROM pg_stat_statements ORDER BY query COLLATE "C"; -SELECT pg_stat_statements_reset(); +SELECT pg_stat_statements_reset() IS NOT NULL AS t; diff --git a/contrib/pg_stat_statements/t/010_restart.pl b/contrib/pg_stat_statements/t/010_restart.pl new file mode 100644 index 0000000000000..207d54714bed1 --- /dev/null +++ b/contrib/pg_stat_statements/t/010_restart.pl @@ -0,0 +1,53 @@ +# Copyright (c) 2023-2024, PostgreSQL Global Development Group + +# Tests for checking that pg_stat_statements contents are preserved +# across restarts. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf('postgresql.conf', + "shared_preload_libraries = 'pg_stat_statements'"); +$node->start; + +$node->safe_psql('postgres', 'CREATE EXTENSION pg_stat_statements'); + +$node->safe_psql('postgres', 'CREATE TABLE t1 (a int)'); +$node->safe_psql('postgres', 'SELECT a FROM t1'); + +is( $node->safe_psql( + 'postgres', + "SELECT query FROM pg_stat_statements WHERE query NOT LIKE '%pg_stat_statements%' ORDER BY query" + ), + "CREATE TABLE t1 (a int)\nSELECT a FROM t1", + 'pg_stat_statements populated'); + +$node->restart; + +is( $node->safe_psql( + 'postgres', + "SELECT query FROM pg_stat_statements WHERE query NOT LIKE '%pg_stat_statements%' ORDER BY query" + ), + "CREATE TABLE t1 (a int)\nSELECT a FROM t1", + 'pg_stat_statements data kept across restart'); + +$node->append_conf('postgresql.conf', "pg_stat_statements.save = false"); +$node->reload; + +$node->restart; + +is( $node->safe_psql( + 'postgres', + "SELECT count(*) FROM pg_stat_statements WHERE query NOT LIKE '%pg_stat_statements%'" + ), + '0', + 'pg_stat_statements data not kept across restart with .save=false'); + +$node->stop; + +done_testing(); diff --git a/contrib/pg_surgery/heap_surgery.c b/contrib/pg_surgery/heap_surgery.c index 88a40ab7d39b8..37dffe3f7d57a 100644 --- a/contrib/pg_surgery/heap_surgery.c +++ b/contrib/pg_surgery/heap_surgery.c @@ -3,7 +3,7 @@ * heap_surgery.c * Functions to perform surgery on the damaged heap table. * - * Copyright (c) 2020-2023, PostgreSQL Global Development Group + * Copyright (c) 2020-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pg_surgery/heap_surgery.c @@ -29,7 +29,7 @@ PG_MODULE_MAGIC; typedef enum HeapTupleForceOption { HEAP_FORCE_KILL, - HEAP_FORCE_FREEZE + HEAP_FORCE_FREEZE, } HeapTupleForceOption; PG_FUNCTION_INFO_V1(heap_force_kill); @@ -95,7 +95,7 @@ heap_force_common(FunctionCallInfo fcinfo, HeapTupleForceOption heap_force_opt) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("recovery is in progress"), - errhint("heap surgery functions cannot be executed during recovery."))); + errhint("Heap surgery functions cannot be executed during recovery."))); /* Check inputs. */ sanity_check_tid_array(ta, &ntids); diff --git a/contrib/pg_surgery/meson.build b/contrib/pg_surgery/meson.build index a08327eafae02..effc4ada34b73 100644 --- a/contrib/pg_surgery/meson.build +++ b/contrib/pg_surgery/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_surgery_sources = files( 'heap_surgery.c', diff --git a/contrib/pg_trgm/expected/pg_trgm.out b/contrib/pg_trgm/expected/pg_trgm.out index ce4bf1d4e51bf..0b70d9de25624 100644 --- a/contrib/pg_trgm/expected/pg_trgm.out +++ b/contrib/pg_trgm/expected/pg_trgm.out @@ -2372,6 +2372,9 @@ ERROR: value 2025 out of bounds for option "siglen" DETAIL: Valid values are between "1" and "2024". create index trgm_idx on test_trgm using gist (t gist_trgm_ops(siglen=2024)); set enable_seqscan=off; +-- check index compatibility handling when opclass option is specified +alter table test_trgm alter column t type varchar(768); +alter table test_trgm alter column t type text; select t,similarity(t,'qwertyu0988') as sml from test_trgm where t % 'qwertyu0988' order by sml desc, t; t | sml -------------+---------- diff --git a/contrib/pg_trgm/meson.build b/contrib/pg_trgm/meson.build index 093ac18400ccb..dac92135530cd 100644 --- a/contrib/pg_trgm/meson.build +++ b/contrib/pg_trgm/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_trgm_sources = files( 'trgm_gin.c', diff --git a/contrib/pg_trgm/sql/pg_trgm.sql b/contrib/pg_trgm/sql/pg_trgm.sql index 6a9da24d5a72b..340c9891899f0 100644 --- a/contrib/pg_trgm/sql/pg_trgm.sql +++ b/contrib/pg_trgm/sql/pg_trgm.sql @@ -52,6 +52,10 @@ create index trgm_idx on test_trgm using gist (t gist_trgm_ops(siglen=2025)); create index trgm_idx on test_trgm using gist (t gist_trgm_ops(siglen=2024)); set enable_seqscan=off; +-- check index compatibility handling when opclass option is specified +alter table test_trgm alter column t type varchar(768); +alter table test_trgm alter column t type text; + select t,similarity(t,'qwertyu0988') as sml from test_trgm where t % 'qwertyu0988' order by sml desc, t; select t,similarity(t,'gwertyu0988') as sml from test_trgm where t % 'gwertyu0988' order by sml desc, t; select t,similarity(t,'gwertyu1988') as sml from test_trgm where t % 'gwertyu1988' order by sml desc, t; diff --git a/contrib/pg_trgm/trgm_op.c b/contrib/pg_trgm/trgm_op.c index 49d4497b4f3cf..c509d15ee402f 100644 --- a/contrib/pg_trgm/trgm_op.c +++ b/contrib/pg_trgm/trgm_op.c @@ -6,6 +6,7 @@ #include #include "catalog/pg_type.h" +#include "common/int.h" #include "lib/qunique.h" #include "miscadmin.h" #include "trgm.h" @@ -433,12 +434,7 @@ comp_ptrgm(const void *v1, const void *v2) if (cmp != 0) return cmp; - if (p1->index < p2->index) - return -1; - else if (p1->index == p2->index) - return 0; - else - return 1; + return pg_cmp_s32(p1->index, p2->index); } /* diff --git a/contrib/pg_trgm/trgm_regexp.c b/contrib/pg_trgm/trgm_regexp.c index 1d3694606719f..75d6d1d4a8dd3 100644 --- a/contrib/pg_trgm/trgm_regexp.c +++ b/contrib/pg_trgm/trgm_regexp.c @@ -181,7 +181,7 @@ * 7) Mark state 3 final because state 5 of source NFA is marked as final. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/contrib/pg_visibility/Makefile b/contrib/pg_visibility/Makefile index b3b1a89e47d62..d3cb411cc90d9 100644 --- a/contrib/pg_visibility/Makefile +++ b/contrib/pg_visibility/Makefile @@ -11,6 +11,7 @@ DATA = pg_visibility--1.1.sql pg_visibility--1.1--1.2.sql \ PGFILEDESC = "pg_visibility - page visibility information" REGRESS = pg_visibility +TAP_TESTS = 1 ifdef USE_PGXS PG_CONFIG = pg_config diff --git a/contrib/pg_visibility/expected/pg_visibility.out b/contrib/pg_visibility/expected/pg_visibility.out index 9de54db2a2924..09fa5933a35b2 100644 --- a/contrib/pg_visibility/expected/pg_visibility.out +++ b/contrib/pg_visibility/expected/pg_visibility.out @@ -217,8 +217,7 @@ select * from pg_visibility_map('copyfreeze'); -------+-------------+------------ 0 | t | t 1 | t | t - 2 | t | t -(3 rows) +(2 rows) select * from pg_check_frozen('copyfreeze'); t_ctid diff --git a/contrib/pg_visibility/meson.build b/contrib/pg_visibility/meson.build index 73c708d51bbbb..f3c1263313a25 100644 --- a/contrib/pg_visibility/meson.build +++ b/contrib/pg_visibility/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_visibility_sources = files( 'pg_visibility.c', @@ -33,4 +33,9 @@ tests += { 'pg_visibility', ], }, + 'tap': { + 'tests': [ + 't/001_concurrent_transaction.pl', + ], + }, } diff --git a/contrib/pg_visibility/pg_visibility.c b/contrib/pg_visibility/pg_visibility.c index 2a4acfd1eee03..ad0f2a109a6e9 100644 --- a/contrib/pg_visibility/pg_visibility.c +++ b/contrib/pg_visibility/pg_visibility.c @@ -3,7 +3,7 @@ * pg_visibility.c * display visibility map information and page-level visibility bits * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * contrib/pg_visibility/pg_visibility.c *------------------------------------------------------------------------- @@ -19,6 +19,7 @@ #include "funcapi.h" #include "miscadmin.h" #include "storage/bufmgr.h" +#include "storage/proc.h" #include "storage/procarray.h" #include "storage/smgr.h" #include "utils/rel.h" @@ -379,6 +380,7 @@ pg_truncate_visibility_map(PG_FUNCTION_ARGS) Relation rel; ForkNumber fork; BlockNumber block; + BlockNumber old_block; rel = relation_open(relid, AccessExclusiveLock); @@ -388,15 +390,22 @@ pg_truncate_visibility_map(PG_FUNCTION_ARGS) /* Forcibly reset cached file size */ RelationGetSmgr(rel)->smgr_cached_nblocks[VISIBILITYMAP_FORKNUM] = InvalidBlockNumber; + /* Compute new and old size before entering critical section. */ + fork = VISIBILITYMAP_FORKNUM; block = visibilitymap_prepare_truncate(rel, 0); - if (BlockNumberIsValid(block)) - { - fork = VISIBILITYMAP_FORKNUM; - smgrtruncate(RelationGetSmgr(rel), &fork, 1, &block); - } + old_block = BlockNumberIsValid(block) ? smgrnblocks(RelationGetSmgr(rel), fork) : 0; + + /* + * WAL-logging, buffer dropping, file truncation must be atomic and all on + * one side of a checkpoint. See RelationTruncate() for discussion. + */ + Assert((MyProc->delayChkptFlags & (DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE)) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE; + START_CRIT_SECTION(); if (RelationNeedsWAL(rel)) { + XLogRecPtr lsn; xl_smgr_truncate xlrec; xlrec.blkno = 0; @@ -406,9 +415,17 @@ pg_truncate_visibility_map(PG_FUNCTION_ARGS) XLogBeginInsert(); XLogRegisterData((char *) &xlrec, sizeof(xlrec)); - XLogInsert(RM_SMGR_ID, XLOG_SMGR_TRUNCATE | XLR_SPECIAL_REL_UPDATE); + lsn = XLogInsert(RM_SMGR_ID, + XLOG_SMGR_TRUNCATE | XLR_SPECIAL_REL_UPDATE); + XLogFlush(lsn); } + if (BlockNumberIsValid(block)) + smgrtruncate2(RelationGetSmgr(rel), &fork, 1, &old_block, &block); + + END_CRIT_SECTION(); + MyProc->delayChkptFlags &= ~(DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE); + /* * Release the lock right away, not at commit time. * @@ -532,6 +549,63 @@ collect_visibility_data(Oid relid, bool include_pd) return info; } +/* + * The "strict" version of GetOldestNonRemovableTransactionId(). The + * pg_visibility check can tolerate false positives (don't report some of the + * errors), but can't tolerate false negatives (report false errors). Normally, + * horizons move forwards, but there are cases when it could move backward + * (see comment for ComputeXidHorizons()). + * + * This is why we have to implement our own function for xid horizon, which + * would be guaranteed to be newer or equal to any xid horizon computed before. + * We have to do the following to achieve this. + * + * 1. Ignore processes xmin's, because they consider connection to other + * databases that were ignored before. + * 2. Ignore KnownAssignedXids, because they are not database-aware. At the + * same time, the primary could compute its horizons database-aware. + * 3. Ignore walsender xmin, because it could go backward if some replication + * connections don't use replication slots. + * + * As a result, we're using only currently running xids to compute the horizon. + * Surely these would significantly sacrifice accuracy. But we have to do so + * to avoid reporting false errors. + */ +static TransactionId +GetStrictOldestNonRemovableTransactionId(Relation rel) +{ + RunningTransactions runningTransactions; + + if (rel == NULL || rel->rd_rel->relisshared || RecoveryInProgress()) + { + /* Shared relation: take into account all running xids */ + runningTransactions = GetRunningTransactionData(); + LWLockRelease(ProcArrayLock); + LWLockRelease(XidGenLock); + return runningTransactions->oldestRunningXid; + } + else if (!RELATION_IS_LOCAL(rel)) + { + /* + * Normal relation: take into account xids running within the current + * database + */ + runningTransactions = GetRunningTransactionData(); + LWLockRelease(ProcArrayLock); + LWLockRelease(XidGenLock); + return runningTransactions->oldestDatabaseRunningXid; + } + else + { + /* + * For temporary relations, ComputeXidHorizons() uses only + * TransamVariables->latestCompletedXid and MyProc->xid. These two + * shouldn't go backwards. So we're fine with this horizon. + */ + return GetOldestNonRemovableTransactionId(rel); + } +} + /* * Returns a list of items whose visibility map information does not match * the status of the tuples on the page. @@ -563,7 +637,7 @@ collect_corrupt_items(Oid relid, bool all_visible, bool all_frozen) check_relation_relkind(rel); if (all_visible) - OldestXmin = GetOldestNonRemovableTransactionId(rel); + OldestXmin = GetStrictOldestNonRemovableTransactionId(rel); nblocks = RelationGetNumberOfBlocks(rel); @@ -671,11 +745,11 @@ collect_corrupt_items(Oid relid, bool all_visible, bool all_frozen) * retake ProcArrayLock here while we're holding the buffer * exclusively locked, but it should be safe against * deadlocks, because surely - * GetOldestNonRemovableTransactionId() should never take a - * buffer lock. And this shouldn't happen often, so it's worth - * being careful so as to avoid false positives. + * GetStrictOldestNonRemovableTransactionId() should never + * take a buffer lock. And this shouldn't happen often, so + * it's worth being careful so as to avoid false positives. */ - RecomputedOldestXmin = GetOldestNonRemovableTransactionId(rel); + RecomputedOldestXmin = GetStrictOldestNonRemovableTransactionId(rel); if (!TransactionIdPrecedes(OldestXmin, RecomputedOldestXmin)) record_corrupt_item(items, &tuple.t_self); diff --git a/contrib/pg_visibility/sql/pg_visibility.sql b/contrib/pg_visibility/sql/pg_visibility.sql index ff3538f9964a1..5af06ec5b7600 100644 --- a/contrib/pg_visibility/sql/pg_visibility.sql +++ b/contrib/pg_visibility/sql/pg_visibility.sql @@ -108,12 +108,6 @@ copy copyfreeze from stdin freeze; 4 '4' 5 '5' 6 '6' -7 '7' -8 '8' -9 '9' -10 '10' -11 '11' -12 '12' \. commit; select * from pg_visibility_map('copyfreeze'); diff --git a/contrib/pg_visibility/t/001_concurrent_transaction.pl b/contrib/pg_visibility/t/001_concurrent_transaction.pl new file mode 100644 index 0000000000000..c31d041757d0c --- /dev/null +++ b/contrib/pg_visibility/t/001_concurrent_transaction.pl @@ -0,0 +1,47 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# Check that a concurrent transaction doesn't cause false negatives in +# pg_check_visible() function +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + + +my $node = PostgreSQL::Test::Cluster->new('main'); + +$node->init; +$node->start; + +# Setup another database +$node->safe_psql("postgres", "CREATE DATABASE other_database;\n"); +my $bsession = $node->background_psql('other_database'); + +# Run a concurrent transaction +$bsession->query_safe( + qq[ + BEGIN; + SELECT txid_current(); +]); + +# Create a sample table and run vacuum +$node->safe_psql("postgres", + "CREATE EXTENSION pg_visibility;\n" + . "CREATE TABLE vacuum_test AS SELECT 42 i;\n" + . "VACUUM (disable_page_skipping) vacuum_test;"); + +# Run pg_check_visible() +my $result = $node->safe_psql("postgres", + "SELECT * FROM pg_check_visible('vacuum_test');"); + +# There should be no false negatives +ok($result eq "", "pg_check_visible() detects no errors"); + +# Shutdown +$bsession->query_safe("COMMIT;"); +$bsession->quit; +$node->stop; + +done_testing(); diff --git a/contrib/pg_walinspect/expected/pg_walinspect.out b/contrib/pg_walinspect/expected/pg_walinspect.out index a8f4c91060e0a..c010eed8c5d6e 100644 --- a/contrib/pg_walinspect/expected/pg_walinspect.out +++ b/contrib/pg_walinspect/expected/pg_walinspect.out @@ -127,9 +127,20 @@ SELECT COUNT(*) >= 1 AS ok FROM pg_get_wal_block_info(:'wal_lsn3', :'wal_lsn4') t (1 row) --- Force full-page image on the next update. +-- Force a checkpoint so that the next update will log a full-page image. SELECT pg_current_wal_lsn() AS wal_lsn5 \gset CHECKPOINT; +-- Verify that an XLOG_CHECKPOINT_REDO record begins at precisely the redo LSN +-- of the checkpoint we just performed. +SELECT redo_lsn FROM pg_control_checkpoint() \gset +SELECT start_lsn = :'redo_lsn'::pg_lsn AS same_lsn, resource_manager, + record_type FROM pg_get_wal_record_info(:'redo_lsn'); + same_lsn | resource_manager | record_type +----------+------------------+----------------- + t | XLOG | CHECKPOINT_REDO +(1 row) + +-- This update should produce a full-page image because of the checkpoint. UPDATE sample_tbl SET col1 = col1 + 1 WHERE col1 = 2; SELECT pg_current_wal_lsn() AS wal_lsn6 \gset -- Check if we get FPI from WAL record. diff --git a/contrib/pg_walinspect/meson.build b/contrib/pg_walinspect/meson.build index 80059f61197d5..bd959a2070f69 100644 --- a/contrib/pg_walinspect/meson.build +++ b/contrib/pg_walinspect/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_walinspect_sources = files('pg_walinspect.c') diff --git a/contrib/pg_walinspect/pg_walinspect.c b/contrib/pg_walinspect/pg_walinspect.c index 796a74f322bde..ee2918726d66a 100644 --- a/contrib/pg_walinspect/pg_walinspect.c +++ b/contrib/pg_walinspect/pg_walinspect.c @@ -3,7 +3,7 @@ * pg_walinspect.c * Functions to inspect contents of PostgreSQL Write-Ahead Log * - * Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pg_walinspect/pg_walinspect.c diff --git a/contrib/pg_walinspect/sql/pg_walinspect.sql b/contrib/pg_walinspect/sql/pg_walinspect.sql index f987ca31c452b..1e64a22d29ad8 100644 --- a/contrib/pg_walinspect/sql/pg_walinspect.sql +++ b/contrib/pg_walinspect/sql/pg_walinspect.sql @@ -80,9 +80,17 @@ SELECT pg_current_wal_lsn() AS wal_lsn4 \gset SELECT COUNT(*) >= 1 AS ok FROM pg_get_wal_block_info(:'wal_lsn3', :'wal_lsn4') WHERE relfilenode = :'sample_tbl_oid' AND block_data IS NOT NULL; --- Force full-page image on the next update. +-- Force a checkpoint so that the next update will log a full-page image. SELECT pg_current_wal_lsn() AS wal_lsn5 \gset CHECKPOINT; + +-- Verify that an XLOG_CHECKPOINT_REDO record begins at precisely the redo LSN +-- of the checkpoint we just performed. +SELECT redo_lsn FROM pg_control_checkpoint() \gset +SELECT start_lsn = :'redo_lsn'::pg_lsn AS same_lsn, resource_manager, + record_type FROM pg_get_wal_record_info(:'redo_lsn'); + +-- This update should produce a full-page image because of the checkpoint. UPDATE sample_tbl SET col1 = col1 + 1 WHERE col1 = 2; SELECT pg_current_wal_lsn() AS wal_lsn6 \gset -- Check if we get FPI from WAL record. diff --git a/contrib/pgcrypto/Makefile b/contrib/pgcrypto/Makefile index 7fb59f51b729f..5efa10c334c80 100644 --- a/contrib/pgcrypto/Makefile +++ b/contrib/pgcrypto/Makefile @@ -42,7 +42,7 @@ PGFILEDESC = "pgcrypto - cryptographic functions" REGRESS = init md5 sha1 hmac-md5 hmac-sha1 blowfish rijndael \ sha2 des 3des cast5 \ crypt-des crypt-md5 crypt-blowfish crypt-xdes \ - pgp-armor pgp-decrypt pgp-encrypt $(CF_PGP_TESTS) \ + pgp-armor pgp-decrypt pgp-encrypt pgp-encrypt-md5 $(CF_PGP_TESTS) \ pgp-pubkey-decrypt pgp-pubkey-encrypt pgp-info EXTRA_CLEAN = gen-rtab diff --git a/contrib/pgcrypto/expected/3des_1.out b/contrib/pgcrypto/expected/3des_1.out new file mode 100644 index 0000000000000..fb1d1f6f0c05a --- /dev/null +++ b/contrib/pgcrypto/expected/3des_1.out @@ -0,0 +1,29 @@ +-- +-- 3DES cipher +-- +-- test vector from somewhere +SELECT encrypt('\x8000000000000000', + '\x010101010101010101010101010101010101010101010101', + '3des-ecb/pad:none'); +ERROR: encrypt error: Cipher cannot be initialized +select encrypt('', 'foo', '3des'); +ERROR: encrypt error: Cipher cannot be initialized +-- 10 bytes key +select encrypt('foo', '0123456789', '3des'); +ERROR: encrypt error: Cipher cannot be initialized +-- 22 bytes key +select encrypt('foo', '0123456789012345678901', '3des'); +ERROR: encrypt error: Cipher cannot be initialized +-- decrypt +select encode(decrypt(encrypt('foo', '0123456', '3des'), '0123456', '3des'), 'escape'); +ERROR: encrypt error: Cipher cannot be initialized +-- iv +select encrypt_iv('foo', '0123456', 'abcd', '3des'); +ERROR: encrypt_iv error: Cipher cannot be initialized +select encode(decrypt_iv('\x50735067b073bb93', '0123456', 'abcd', '3des'), 'escape'); +ERROR: decrypt_iv error: Cipher cannot be initialized +-- long message +select encrypt('Lets try a longer message.', '0123456789012345678901', '3des'); +ERROR: encrypt error: Cipher cannot be initialized +select encode(decrypt(encrypt('Lets try a longer message.', '0123456789012345678901', '3des'), '0123456789012345678901', '3des'), 'escape'); +ERROR: encrypt error: Cipher cannot be initialized diff --git a/contrib/pgcrypto/expected/crypt-md5_1.out b/contrib/pgcrypto/expected/crypt-md5_1.out new file mode 100644 index 0000000000000..0ffda34ab4c55 --- /dev/null +++ b/contrib/pgcrypto/expected/crypt-md5_1.out @@ -0,0 +1,16 @@ +-- +-- crypt() and gen_salt(): md5 +-- +SELECT crypt('', '$1$Szzz0yzz'); +ERROR: crypt(3) returned NULL +SELECT crypt('foox', '$1$Szzz0yzz'); +ERROR: crypt(3) returned NULL +CREATE TABLE ctest (data text, res text, salt text); +INSERT INTO ctest VALUES ('password', '', ''); +UPDATE ctest SET salt = gen_salt('md5'); +UPDATE ctest SET res = crypt(data, salt); +ERROR: crypt(3) returned NULL +SELECT res = crypt(data, res) AS "worked" +FROM ctest; +ERROR: invalid salt +DROP TABLE ctest; diff --git a/contrib/pgcrypto/expected/hmac-md5_1.out b/contrib/pgcrypto/expected/hmac-md5_1.out new file mode 100644 index 0000000000000..56875b0f63ee8 --- /dev/null +++ b/contrib/pgcrypto/expected/hmac-md5_1.out @@ -0,0 +1,44 @@ +-- +-- HMAC-MD5 +-- +SELECT hmac( +'Hi There', +'\x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b'::bytea, +'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized +-- 2 +SELECT hmac( +'Jefe', +'what do ya want for nothing?', +'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized +-- 3 +SELECT hmac( +'\xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd'::bytea, +'\xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'::bytea, +'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized +-- 4 +SELECT hmac( +'\xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd'::bytea, +'\x0102030405060708090a0b0c0d0e0f10111213141516171819'::bytea, +'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized +-- 5 +SELECT hmac( +'Test With Truncation', +'\x0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c'::bytea, +'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized +-- 6 +SELECT hmac( +'Test Using Larger Than Block-Size Key - Hash Key First', +'\xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'::bytea, +'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized +-- 7 +SELECT hmac( +'Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data', +'\xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'::bytea, +'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized diff --git a/contrib/pgcrypto/expected/md5_1.out b/contrib/pgcrypto/expected/md5_1.out new file mode 100644 index 0000000000000..decb215c48204 --- /dev/null +++ b/contrib/pgcrypto/expected/md5_1.out @@ -0,0 +1,17 @@ +-- +-- MD5 message digest +-- +SELECT digest('', 'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized +SELECT digest('a', 'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized +SELECT digest('abc', 'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized +SELECT digest('message digest', 'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized +SELECT digest('abcdefghijklmnopqrstuvwxyz', 'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized +SELECT digest('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized +SELECT digest('12345678901234567890123456789012345678901234567890123456789012345678901234567890', 'md5'); +ERROR: Cannot use "md5": Cipher cannot be initialized diff --git a/contrib/pgcrypto/expected/pgp-compression.out b/contrib/pgcrypto/expected/pgp-compression.out index d4c57feba30b8..67e2dce897a9d 100644 --- a/contrib/pgcrypto/expected/pgp-compression.out +++ b/contrib/pgcrypto/expected/pgp-compression.out @@ -60,7 +60,7 @@ WITH random_string AS -- This generates a random string of 16366 bytes. This is chosen -- as random so that it does not get compressed, and the decompression -- would work on a string with the same length as the origin, making the - -- test behavior more predictible. lpad() ensures that the generated + -- test behavior more predictable. lpad() ensures that the generated -- hexadecimal value is completed by extra zero characters if random() -- has generated a value strictly lower than 16. SELECT string_agg(decode(lpad(to_hex((random()*256)::int), 2, '0'), 'hex'), '') as bytes diff --git a/contrib/pgcrypto/expected/pgp-encrypt-md5.out b/contrib/pgcrypto/expected/pgp-encrypt-md5.out new file mode 100644 index 0000000000000..339e12a434b67 --- /dev/null +++ b/contrib/pgcrypto/expected/pgp-encrypt-md5.out @@ -0,0 +1,11 @@ +-- +-- PGP encrypt using MD5 +-- +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 's2k-digest-algo=md5'), + 'key', 'expect-s2k-digest-algo=md5'); + pgp_sym_decrypt +----------------- + Secret. +(1 row) + diff --git a/contrib/pgcrypto/expected/pgp-encrypt-md5_1.out b/contrib/pgcrypto/expected/pgp-encrypt-md5_1.out new file mode 100644 index 0000000000000..612ca1d19c4a4 --- /dev/null +++ b/contrib/pgcrypto/expected/pgp-encrypt-md5_1.out @@ -0,0 +1,7 @@ +-- +-- PGP encrypt using MD5 +-- +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 's2k-digest-algo=md5'), + 'key', 'expect-s2k-digest-algo=md5'); +ERROR: Unsupported digest algorithm diff --git a/contrib/pgcrypto/expected/pgp-encrypt.out b/contrib/pgcrypto/expected/pgp-encrypt.out index 77e45abe53a76..50cd3f6daa001 100644 --- a/contrib/pgcrypto/expected/pgp-encrypt.out +++ b/contrib/pgcrypto/expected/pgp-encrypt.out @@ -121,14 +121,6 @@ NOTICE: pgp_decrypt: unexpected s2k_count: expected 65000000 got 65011712 (1 row) -- s2k digest change -select pgp_sym_decrypt( - pgp_sym_encrypt('Secret.', 'key', 's2k-digest-algo=md5'), - 'key', 'expect-s2k-digest-algo=md5'); - pgp_sym_decrypt ------------------ - Secret. -(1 row) - select pgp_sym_decrypt( pgp_sym_encrypt('Secret.', 'key', 's2k-digest-algo=sha1'), 'key', 'expect-s2k-digest-algo=sha1'); diff --git a/contrib/pgcrypto/meson.build b/contrib/pgcrypto/meson.build index df7dd50dbc3c3..85948915482c3 100644 --- a/contrib/pgcrypto/meson.build +++ b/contrib/pgcrypto/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not ssl.found() subdir_done() @@ -48,6 +48,7 @@ pgcrypto_regress = [ 'pgp-armor', 'pgp-decrypt', 'pgp-encrypt', + 'pgp-encrypt-md5', 'pgp-pubkey-decrypt', 'pgp-pubkey-encrypt', 'pgp-info', diff --git a/contrib/pgcrypto/openssl.c b/contrib/pgcrypto/openssl.c index cf315517e0cba..8259de5e393d9 100644 --- a/contrib/pgcrypto/openssl.c +++ b/contrib/pgcrypto/openssl.c @@ -50,9 +50,8 @@ */ /* - * To make sure we don't leak OpenSSL handles on abort, we keep OSSLDigest - * objects in a linked list, allocated in TopMemoryContext. We use the - * ResourceOwner mechanism to free them on abort. + * To make sure we don't leak OpenSSL handles, we use the ResourceOwner + * mechanism to free them on abort. */ typedef struct OSSLDigest { @@ -60,54 +59,39 @@ typedef struct OSSLDigest EVP_MD_CTX *ctx; ResourceOwner owner; - struct OSSLDigest *next; - struct OSSLDigest *prev; } OSSLDigest; -static OSSLDigest *open_digests = NULL; -static bool digest_resowner_callback_registered = false; +/* ResourceOwner callbacks to hold OpenSSL digest handles */ +static void ResOwnerReleaseOSSLDigest(Datum res); -static void -free_openssl_digest(OSSLDigest *digest) +static const ResourceOwnerDesc ossldigest_resowner_desc = { - EVP_MD_CTX_destroy(digest->ctx); - if (digest->prev) - digest->prev->next = digest->next; - else - open_digests = digest->next; - if (digest->next) - digest->next->prev = digest->prev; - pfree(digest); + .name = "pgcrypto OpenSSL digest handle", + .release_phase = RESOURCE_RELEASE_BEFORE_LOCKS, + .release_priority = RELEASE_PRIO_FIRST, + .ReleaseResource = ResOwnerReleaseOSSLDigest, + .DebugPrint = NULL, /* default message is fine */ +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberOSSLDigest(ResourceOwner owner, OSSLDigest *digest) +{ + ResourceOwnerRemember(owner, PointerGetDatum(digest), &ossldigest_resowner_desc); +} +static inline void +ResourceOwnerForgetOSSLDigest(ResourceOwner owner, OSSLDigest *digest) +{ + ResourceOwnerForget(owner, PointerGetDatum(digest), &ossldigest_resowner_desc); } -/* - * Close any open OpenSSL handles on abort. - */ static void -digest_free_callback(ResourceReleasePhase phase, - bool isCommit, - bool isTopLevel, - void *arg) +free_openssl_digest(OSSLDigest *digest) { - OSSLDigest *curr; - OSSLDigest *next; - - if (phase != RESOURCE_RELEASE_AFTER_LOCKS) - return; - - next = open_digests; - while (next) - { - curr = next; - next = curr->next; - - if (curr->owner == CurrentResourceOwner) - { - if (isCommit) - elog(WARNING, "pgcrypto digest reference leak: digest %p still referenced", curr); - free_openssl_digest(curr); - } - } + EVP_MD_CTX_destroy(digest->ctx); + if (digest->owner != NULL) + ResourceOwnerForgetOSSLDigest(digest->owner, digest); + pfree(digest); } static unsigned @@ -188,16 +172,12 @@ px_find_digest(const char *name, PX_MD **res) OpenSSL_add_all_algorithms(); } - if (!digest_resowner_callback_registered) - { - RegisterResourceReleaseCallback(digest_free_callback, NULL); - digest_resowner_callback_registered = true; - } - md = EVP_get_digestbyname(name); if (md == NULL) return PXE_NO_HASH; + ResourceOwnerEnlarge(CurrentResourceOwner); + /* * Create an OSSLDigest object, an OpenSSL MD object, and a PX_MD object. * The order is crucial, to make sure we don't leak anything on @@ -221,9 +201,7 @@ px_find_digest(const char *name, PX_MD **res) digest->algo = md; digest->ctx = ctx; digest->owner = CurrentResourceOwner; - digest->next = open_digests; - digest->prev = NULL; - open_digests = digest; + ResourceOwnerRememberOSSLDigest(digest->owner, digest); /* The PX_MD object is allocated in the current memory context. */ h = palloc(sizeof(*h)); @@ -239,6 +217,17 @@ px_find_digest(const char *name, PX_MD **res) return 0; } +/* ResourceOwner callbacks for OSSLDigest */ + +static void +ResOwnerReleaseOSSLDigest(Datum res) +{ + OSSLDigest *digest = (OSSLDigest *) DatumGetPointer(res); + + digest->owner = NULL; + free_openssl_digest(digest); +} + /* * Ciphers * @@ -266,9 +255,8 @@ struct ossl_cipher * OSSLCipher contains the state for using a cipher. A separate OSSLCipher * object is allocated in each px_find_cipher() call. * - * To make sure we don't leak OpenSSL handles on abort, we keep OSSLCipher - * objects in a linked list, allocated in TopMemoryContext. We use the - * ResourceOwner mechanism to free them on abort. + * To make sure we don't leak OpenSSL handles, we use the ResourceOwner + * mechanism to free them on abort. */ typedef struct OSSLCipher { @@ -281,54 +269,39 @@ typedef struct OSSLCipher const struct ossl_cipher *ciph; ResourceOwner owner; - struct OSSLCipher *next; - struct OSSLCipher *prev; } OSSLCipher; -static OSSLCipher *open_ciphers = NULL; -static bool cipher_resowner_callback_registered = false; +/* ResourceOwner callbacks to hold OpenSSL cipher state */ +static void ResOwnerReleaseOSSLCipher(Datum res); -static void -free_openssl_cipher(OSSLCipher *od) +static const ResourceOwnerDesc osslcipher_resowner_desc = { - EVP_CIPHER_CTX_free(od->evp_ctx); - if (od->prev) - od->prev->next = od->next; - else - open_ciphers = od->next; - if (od->next) - od->next->prev = od->prev; - pfree(od); + .name = "pgcrypto OpenSSL cipher handle", + .release_phase = RESOURCE_RELEASE_BEFORE_LOCKS, + .release_priority = RELEASE_PRIO_FIRST, + .ReleaseResource = ResOwnerReleaseOSSLCipher, + .DebugPrint = NULL, /* default message is fine */ +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberOSSLCipher(ResourceOwner owner, OSSLCipher *od) +{ + ResourceOwnerRemember(owner, PointerGetDatum(od), &osslcipher_resowner_desc); +} +static inline void +ResourceOwnerForgetOSSLCipher(ResourceOwner owner, OSSLCipher *od) +{ + ResourceOwnerForget(owner, PointerGetDatum(od), &osslcipher_resowner_desc); } -/* - * Close any open OpenSSL cipher handles on abort. - */ static void -cipher_free_callback(ResourceReleasePhase phase, - bool isCommit, - bool isTopLevel, - void *arg) +free_openssl_cipher(OSSLCipher *od) { - OSSLCipher *curr; - OSSLCipher *next; - - if (phase != RESOURCE_RELEASE_AFTER_LOCKS) - return; - - next = open_ciphers; - while (next) - { - curr = next; - next = curr->next; - - if (curr->owner == CurrentResourceOwner) - { - if (isCommit) - elog(WARNING, "pgcrypto cipher reference leak: cipher %p still referenced", curr); - free_openssl_cipher(curr); - } - } + EVP_CIPHER_CTX_free(od->evp_ctx); + if (od->owner != NULL) + ResourceOwnerForgetOSSLCipher(od->owner, od); + pfree(od); } /* Common routines for all algorithms */ @@ -487,7 +460,7 @@ bf_init(PX_Cipher *c, const uint8 *key, unsigned klen, const uint8 *iv) /* * Test if key len is supported. BF_set_key silently cut large keys and it - * could be a problem when user transfer crypted data from one server to + * could be a problem when user transfer encrypted data from one server to * another. */ @@ -782,11 +755,7 @@ px_find_cipher(const char *name, PX_Cipher **res) if (i->name == NULL) return PXE_NO_CIPHER; - if (!cipher_resowner_callback_registered) - { - RegisterResourceReleaseCallback(cipher_free_callback, NULL); - cipher_resowner_callback_registered = true; - } + ResourceOwnerEnlarge(CurrentResourceOwner); /* * Create an OSSLCipher object, an EVP_CIPHER_CTX object and a PX_Cipher. @@ -806,9 +775,7 @@ px_find_cipher(const char *name, PX_Cipher **res) od->evp_ctx = ctx; od->owner = CurrentResourceOwner; - od->next = open_ciphers; - od->prev = NULL; - open_ciphers = od; + ResourceOwnerRememberOSSLCipher(od->owner, od); if (i->ciph->cipher_func) od->evp_ciph = i->ciph->cipher_func(); @@ -827,3 +794,11 @@ px_find_cipher(const char *name, PX_Cipher **res) *res = c; return 0; } + +/* ResourceOwner callbacks for OSSLCipher */ + +static void +ResOwnerReleaseOSSLCipher(Datum res) +{ + free_openssl_cipher((OSSLCipher *) DatumGetPointer(res)); +} diff --git a/contrib/pgcrypto/pgp-armor.c b/contrib/pgcrypto/pgp-armor.c index 9128756647c55..bfc90af063d51 100644 --- a/contrib/pgcrypto/pgp-armor.c +++ b/contrib/pgcrypto/pgp-armor.c @@ -178,8 +178,8 @@ pg_base64_dec_len(unsigned srclen) * PGP armor */ -static const char *armor_header = "-----BEGIN PGP MESSAGE-----\n"; -static const char *armor_footer = "\n-----END PGP MESSAGE-----\n"; +static const char *const armor_header = "-----BEGIN PGP MESSAGE-----\n"; +static const char *const armor_footer = "\n-----END PGP MESSAGE-----\n"; /* CRC24 implementation from rfc2440 */ #define CRC24_INIT 0x00b704ceL diff --git a/contrib/pgcrypto/pgp-compress.c b/contrib/pgcrypto/pgp-compress.c index 086bec31ae2cc..961cf21e74891 100644 --- a/contrib/pgcrypto/pgp-compress.c +++ b/contrib/pgcrypto/pgp-compress.c @@ -113,7 +113,7 @@ compress_process(PushFilter *next, void *priv, const uint8 *data, int len) /* * process data */ - st->stream.next_in = unconstify(uint8 *, data); + st->stream.next_in = data; st->stream.avail_in = len; while (st->stream.avail_in > 0) { diff --git a/contrib/pgcrypto/pgp-decrypt.c b/contrib/pgcrypto/pgp-decrypt.c index d12dcad19452d..e1ea5b3e58dcf 100644 --- a/contrib/pgcrypto/pgp-decrypt.c +++ b/contrib/pgcrypto/pgp-decrypt.c @@ -250,7 +250,8 @@ prefix_init(void **priv_p, void *arg, PullFilter *src) uint8 tmpbuf[PGP_MAX_BLOCK + 2]; len = pgp_get_cipher_block_size(ctx->cipher_algo); - if (len > sizeof(tmpbuf)) + /* Make sure we have space for prefix */ + if (len > PGP_MAX_BLOCK) return PXE_BUG; res = pullf_read_max(src, len + 2, &buf, tmpbuf); diff --git a/contrib/pgcrypto/pgp-pgsql.c b/contrib/pgcrypto/pgp-pgsql.c index d9b15b07b0f81..7c9f4c7b39b88 100644 --- a/contrib/pgcrypto/pgp-pgsql.c +++ b/contrib/pgcrypto/pgp-pgsql.c @@ -553,15 +553,15 @@ decrypt_internal(int is_pubenc, int need_text, text *data, Datum pgp_sym_encrypt_bytea(PG_FUNCTION_ARGS) { - bytea *data, - *key; + bytea *data; text *arg = NULL; - text *res; + text *res, + *key; data = PG_GETARG_BYTEA_PP(0); - key = PG_GETARG_BYTEA_PP(1); + key = PG_GETARG_TEXT_PP(1); if (PG_NARGS() > 2) - arg = PG_GETARG_BYTEA_PP(2); + arg = PG_GETARG_TEXT_PP(2); res = encrypt_internal(0, 0, data, key, arg); @@ -575,15 +575,15 @@ pgp_sym_encrypt_bytea(PG_FUNCTION_ARGS) Datum pgp_sym_encrypt_text(PG_FUNCTION_ARGS) { - bytea *data, + text *data, *key; text *arg = NULL; text *res; - data = PG_GETARG_BYTEA_PP(0); - key = PG_GETARG_BYTEA_PP(1); + data = PG_GETARG_TEXT_PP(0); + key = PG_GETARG_TEXT_PP(1); if (PG_NARGS() > 2) - arg = PG_GETARG_BYTEA_PP(2); + arg = PG_GETARG_TEXT_PP(2); res = encrypt_internal(0, 1, data, key, arg); @@ -598,15 +598,15 @@ pgp_sym_encrypt_text(PG_FUNCTION_ARGS) Datum pgp_sym_decrypt_bytea(PG_FUNCTION_ARGS) { - bytea *data, - *key; + bytea *data; text *arg = NULL; - text *res; + text *res, + *key; data = PG_GETARG_BYTEA_PP(0); - key = PG_GETARG_BYTEA_PP(1); + key = PG_GETARG_TEXT_PP(1); if (PG_NARGS() > 2) - arg = PG_GETARG_BYTEA_PP(2); + arg = PG_GETARG_TEXT_PP(2); res = decrypt_internal(0, 0, data, key, NULL, arg); @@ -620,15 +620,15 @@ pgp_sym_decrypt_bytea(PG_FUNCTION_ARGS) Datum pgp_sym_decrypt_text(PG_FUNCTION_ARGS) { - bytea *data, - *key; + bytea *data; text *arg = NULL; - text *res; + text *res, + *key; data = PG_GETARG_BYTEA_PP(0); - key = PG_GETARG_BYTEA_PP(1); + key = PG_GETARG_TEXT_PP(1); if (PG_NARGS() > 2) - arg = PG_GETARG_BYTEA_PP(2); + arg = PG_GETARG_TEXT_PP(2); res = decrypt_internal(0, 1, data, key, NULL, arg); @@ -654,7 +654,7 @@ pgp_pub_encrypt_bytea(PG_FUNCTION_ARGS) data = PG_GETARG_BYTEA_PP(0); key = PG_GETARG_BYTEA_PP(1); if (PG_NARGS() > 2) - arg = PG_GETARG_BYTEA_PP(2); + arg = PG_GETARG_TEXT_PP(2); res = encrypt_internal(1, 0, data, key, arg); @@ -668,15 +668,15 @@ pgp_pub_encrypt_bytea(PG_FUNCTION_ARGS) Datum pgp_pub_encrypt_text(PG_FUNCTION_ARGS) { - bytea *data, - *key; + bytea *key; text *arg = NULL; - text *res; + text *res, + *data; - data = PG_GETARG_BYTEA_PP(0); + data = PG_GETARG_TEXT_PP(0); key = PG_GETARG_BYTEA_PP(1); if (PG_NARGS() > 2) - arg = PG_GETARG_BYTEA_PP(2); + arg = PG_GETARG_TEXT_PP(2); res = encrypt_internal(1, 1, data, key, arg); @@ -700,9 +700,9 @@ pgp_pub_decrypt_bytea(PG_FUNCTION_ARGS) data = PG_GETARG_BYTEA_PP(0); key = PG_GETARG_BYTEA_PP(1); if (PG_NARGS() > 2) - psw = PG_GETARG_BYTEA_PP(2); + psw = PG_GETARG_TEXT_PP(2); if (PG_NARGS() > 3) - arg = PG_GETARG_BYTEA_PP(3); + arg = PG_GETARG_TEXT_PP(3); res = decrypt_internal(1, 0, data, key, psw, arg); @@ -727,9 +727,9 @@ pgp_pub_decrypt_text(PG_FUNCTION_ARGS) data = PG_GETARG_BYTEA_PP(0); key = PG_GETARG_BYTEA_PP(1); if (PG_NARGS() > 2) - psw = PG_GETARG_BYTEA_PP(2); + psw = PG_GETARG_TEXT_PP(2); if (PG_NARGS() > 3) - arg = PG_GETARG_BYTEA_PP(3); + arg = PG_GETARG_TEXT_PP(3); res = decrypt_internal(1, 1, data, key, psw, arg); diff --git a/contrib/pgcrypto/pgp.h b/contrib/pgcrypto/pgp.h index cb8b32aba09dc..0bbfd0217bae5 100644 --- a/contrib/pgcrypto/pgp.h +++ b/contrib/pgcrypto/pgp.h @@ -38,7 +38,7 @@ enum PGP_S2K_TYPE { PGP_S2K_SIMPLE = 0, PGP_S2K_SALTED = 1, - PGP_S2K_ISALTED = 3 + PGP_S2K_ISALTED = 3, }; enum PGP_PKT_TYPE @@ -60,7 +60,7 @@ enum PGP_PKT_TYPE PGP_PKT_USER_ATTR = 17, PGP_PKT_SYMENCRYPTED_DATA_MDC = 18, PGP_PKT_MDC = 19, - PGP_PKT_PRIV_61 = 61 /* occurs in gpg secring */ + PGP_PKT_PRIV_61 = 61, /* occurs in gpg secring */ }; enum PGP_PUB_ALGO_TYPE @@ -69,7 +69,7 @@ enum PGP_PUB_ALGO_TYPE PGP_PUB_RSA_ENCRYPT = 2, PGP_PUB_RSA_SIGN = 3, PGP_PUB_ELG_ENCRYPT = 16, - PGP_PUB_DSA_SIGN = 17 + PGP_PUB_DSA_SIGN = 17, }; enum PGP_SYMENC_TYPE @@ -84,7 +84,7 @@ enum PGP_SYMENC_TYPE PGP_SYM_AES_128 = 7, /* should */ PGP_SYM_AES_192 = 8, PGP_SYM_AES_256 = 9, - PGP_SYM_TWOFISH = 10 + PGP_SYM_TWOFISH = 10, }; enum PGP_COMPR_TYPE @@ -92,7 +92,7 @@ enum PGP_COMPR_TYPE PGP_COMPR_NONE = 0, /* must */ PGP_COMPR_ZIP = 1, /* should */ PGP_COMPR_ZLIB = 2, - PGP_COMPR_BZIP2 = 3 + PGP_COMPR_BZIP2 = 3, }; enum PGP_DIGEST_TYPE @@ -106,7 +106,7 @@ enum PGP_DIGEST_TYPE PGP_DIGEST_HAVAL5_160 = 7, /* obsolete */ PGP_DIGEST_SHA256 = 8, PGP_DIGEST_SHA384 = 9, - PGP_DIGEST_SHA512 = 10 + PGP_DIGEST_SHA512 = 10, }; #define PGP_MAX_KEY (256/8) diff --git a/contrib/pgcrypto/sql/pgp-compression.sql b/contrib/pgcrypto/sql/pgp-compression.sql index 87c59c6cabc4e..82080e4389cae 100644 --- a/contrib/pgcrypto/sql/pgp-compression.sql +++ b/contrib/pgcrypto/sql/pgp-compression.sql @@ -36,7 +36,7 @@ WITH random_string AS -- This generates a random string of 16366 bytes. This is chosen -- as random so that it does not get compressed, and the decompression -- would work on a string with the same length as the origin, making the - -- test behavior more predictible. lpad() ensures that the generated + -- test behavior more predictable. lpad() ensures that the generated -- hexadecimal value is completed by extra zero characters if random() -- has generated a value strictly lower than 16. SELECT string_agg(decode(lpad(to_hex((random()*256)::int), 2, '0'), 'hex'), '') as bytes diff --git a/contrib/pgcrypto/sql/pgp-encrypt-md5.sql b/contrib/pgcrypto/sql/pgp-encrypt-md5.sql new file mode 100644 index 0000000000000..201636c820998 --- /dev/null +++ b/contrib/pgcrypto/sql/pgp-encrypt-md5.sql @@ -0,0 +1,7 @@ +-- +-- PGP encrypt using MD5 +-- + +select pgp_sym_decrypt( + pgp_sym_encrypt('Secret.', 'key', 's2k-digest-algo=md5'), + 'key', 'expect-s2k-digest-algo=md5'); diff --git a/contrib/pgcrypto/sql/pgp-encrypt.sql b/contrib/pgcrypto/sql/pgp-encrypt.sql index ed8b17776b331..f67329c2c3073 100644 --- a/contrib/pgcrypto/sql/pgp-encrypt.sql +++ b/contrib/pgcrypto/sql/pgp-encrypt.sql @@ -63,9 +63,6 @@ select pgp_sym_decrypt( 'key', 'expect-s2k-count=65000000'); -- s2k digest change -select pgp_sym_decrypt( - pgp_sym_encrypt('Secret.', 'key', 's2k-digest-algo=md5'), - 'key', 'expect-s2k-digest-algo=md5'); select pgp_sym_decrypt( pgp_sym_encrypt('Secret.', 'key', 's2k-digest-algo=sha1'), 'key', 'expect-s2k-digest-algo=sha1'); diff --git a/contrib/pgrowlocks/expected/pgrowlocks.out b/contrib/pgrowlocks/expected/pgrowlocks.out index 725467266a42a..77431bfe1897e 100644 --- a/contrib/pgrowlocks/expected/pgrowlocks.out +++ b/contrib/pgrowlocks/expected/pgrowlocks.out @@ -136,10 +136,10 @@ a|b (2 rows) step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict'); -locked_row|multi|modes -----------+-----+------------------- -(0,1) |t |{"Key Share",Share} -(0,2) |t |{"Key Share",Share} +locked_row|multi|modes +----------+-----+----------------------------- +(0,1) |t |{"For Key Share","For Share"} +(0,2) |t |{"For Key Share","For Share"} (2 rows) step s1_commit: COMMIT; @@ -161,10 +161,10 @@ a|b (2 rows) step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict'); -locked_row|multi|modes -----------+-----+--------------------------------- -(0,1) |t |{"Key Share","For No Key Update"} -(0,2) |t |{"Key Share","For No Key Update"} +locked_row|multi|modes +----------+-----+------------------------------------- +(0,1) |t |{"For Key Share","For No Key Update"} +(0,2) |t |{"For Key Share","For No Key Update"} (2 rows) step s1_commit: COMMIT; @@ -186,10 +186,10 @@ a|b (2 rows) step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict'); -locked_row|multi|modes -----------+-----+-------------------------- -(0,1) |t |{"Key Share","For Update"} -(0,2) |t |{"Key Share","For Update"} +locked_row|multi|modes +----------+-----+------------------------------ +(0,1) |t |{"For Key Share","For Update"} +(0,2) |t |{"For Key Share","For Update"} (2 rows) step s1_commit: COMMIT; @@ -205,10 +205,10 @@ a|b step s1_updatea: UPDATE multixact_conflict SET a = 10 WHERE a = 1; step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict'); -locked_row|multi|modes -----------+-----+-------------------- -(0,1) |t |{"Key Share",Update} -(0,2) |f |{"For Key Share"} +locked_row|multi|modes +----------+-----+------------------------ +(0,1) |t |{"For Key Share",Update} +(0,2) |f |{"For Key Share"} (2 rows) step s1_commit: COMMIT; @@ -224,10 +224,10 @@ a|b step s1_updateb: UPDATE multixact_conflict SET b = 11 WHERE b = 4; step s2_rowlocks: SELECT locked_row, multi, modes FROM pgrowlocks('multixact_conflict'); -locked_row|multi|modes -----------+-----+----------------------------- -(0,1) |f |{"For Key Share"} -(0,2) |t |{"Key Share","No Key Update"} +locked_row|multi|modes +----------+-----+--------------------------------- +(0,1) |f |{"For Key Share"} +(0,2) |t |{"For Key Share","No Key Update"} (2 rows) step s1_commit: COMMIT; diff --git a/contrib/pgrowlocks/meson.build b/contrib/pgrowlocks/meson.build index 48bce002e8c54..d1e73dc617ec1 100644 --- a/contrib/pgrowlocks/meson.build +++ b/contrib/pgrowlocks/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pgrowlocks_sources = files( 'pgrowlocks.c', diff --git a/contrib/pgrowlocks/pgrowlocks.c b/contrib/pgrowlocks/pgrowlocks.c index c543277b7c550..adbc8279c3fdb 100644 --- a/contrib/pgrowlocks/pgrowlocks.c +++ b/contrib/pgrowlocks/pgrowlocks.c @@ -81,10 +81,6 @@ pgrowlocks(PG_FUNCTION_ARGS) relrv = makeRangeVarFromNameList(textToQualifiedNameList(relname)); rel = relation_openrv(relrv, AccessShareLock); - if (rel->rd_rel->relam != HEAP_TABLE_AM_OID) - ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("only heap AM is supported"))); - if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), @@ -96,6 +92,10 @@ pgrowlocks(PG_FUNCTION_ARGS) (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("\"%s\" is not a table", RelationGetRelationName(rel)))); + else if (rel->rd_rel->relam != HEAP_TABLE_AM_OID) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("only heap AM is supported"))); /* * check permissions: must have SELECT on table or be in @@ -200,10 +200,10 @@ pgrowlocks(PG_FUNCTION_ARGS) snprintf(buf, NCHARS, "For No Key Update"); break; case MultiXactStatusForShare: - snprintf(buf, NCHARS, "Share"); + snprintf(buf, NCHARS, "For Share"); break; case MultiXactStatusForKeyShare: - snprintf(buf, NCHARS, "Key Share"); + snprintf(buf, NCHARS, "For Key Share"); break; } strcat(values[Atnum_modes], buf); diff --git a/contrib/pgstattuple/expected/pgstattuple.out b/contrib/pgstattuple/expected/pgstattuple.out index e4ac86f9e30f8..9176dc98b6a9e 100644 --- a/contrib/pgstattuple/expected/pgstattuple.out +++ b/contrib/pgstattuple/expected/pgstattuple.out @@ -153,6 +153,7 @@ ERROR: relation "test_hashidx" is not a GIN index -- check that using any of these functions with unsupported relations will fail create table test_partitioned (a int) partition by range (a); create index test_partitioned_index on test_partitioned(a); +create index test_partitioned_hash_index on test_partitioned using hash(a); -- these should all fail select pgstattuple('test_partitioned'); ERROR: cannot get tuple-level statistics for relation "test_partitioned" @@ -171,7 +172,9 @@ ERROR: relation "test_partitioned" is not a btree index select pgstatginindex('test_partitioned'); ERROR: relation "test_partitioned" is not a GIN index select pgstathashindex('test_partitioned'); -ERROR: "test_partitioned" is not an index +ERROR: relation "test_partitioned" is not a hash index +select pgstathashindex('test_partitioned_hash_index'); +ERROR: relation "test_partitioned_hash_index" is not a hash index create view test_view as select 1; -- these should all fail select pgstattuple('test_view'); @@ -188,7 +191,7 @@ ERROR: relation "test_view" is not a btree index select pgstatginindex('test_view'); ERROR: relation "test_view" is not a GIN index select pgstathashindex('test_view'); -ERROR: "test_view" is not an index +ERROR: relation "test_view" is not a hash index create foreign data wrapper dummy; create server dummy_server foreign data wrapper dummy; create foreign table test_foreign_table () server dummy_server; @@ -207,7 +210,7 @@ ERROR: relation "test_foreign_table" is not a btree index select pgstatginindex('test_foreign_table'); ERROR: relation "test_foreign_table" is not a GIN index select pgstathashindex('test_foreign_table'); -ERROR: "test_foreign_table" is not an index +ERROR: relation "test_foreign_table" is not a hash index -- a partition of a partitioned table should work though create table test_partition partition of test_partitioned for values from (1) to (100); select pgstattuple('test_partition'); @@ -253,7 +256,7 @@ ERROR: relation "test_partition" is not a btree index select pgstatginindex('test_partition'); ERROR: relation "test_partition" is not a GIN index select pgstathashindex('test_partition'); -ERROR: "test_partition" is not an index +ERROR: relation "test_partition" is not a hash index -- an actual index of a partitioned table should work though create index test_partition_idx on test_partition(a); create index test_partition_hash_idx on test_partition using hash (a); @@ -270,6 +273,31 @@ select pgstathashindex('test_partition_hash_idx'); (4,8,0,1,0,0,0,100) (1 row) +-- these should work for sequences +create sequence test_sequence; +select count(*) from pgstattuple('test_sequence'); + count +------- + 1 +(1 row) + +select pg_relpages('test_sequence'); + pg_relpages +------------- + 1 +(1 row) + +-- these should fail for sequences +select pgstatindex('test_sequence'); +ERROR: relation "test_sequence" is not a btree index +select pgstatginindex('test_sequence'); +ERROR: relation "test_sequence" is not a GIN index +select pgstathashindex('test_sequence'); +ERROR: relation "test_sequence" is not a hash index +select pgstattuple_approx('test_sequence'); +ERROR: relation "test_sequence" is of wrong relation kind +DETAIL: This operation is not supported for sequences. +drop sequence test_sequence; drop table test_partitioned; drop view test_view; drop foreign table test_foreign_table; diff --git a/contrib/pgstattuple/meson.build b/contrib/pgstattuple/meson.build index 6ed84fa50f706..72e8902e4410f 100644 --- a/contrib/pgstattuple/meson.build +++ b/contrib/pgstattuple/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pgstattuple_sources = files( 'pgstatapprox.c', diff --git a/contrib/pgstattuple/pgstatapprox.c b/contrib/pgstattuple/pgstatapprox.c index f601dc6121a97..c84c6423555e2 100644 --- a/contrib/pgstattuple/pgstatapprox.c +++ b/contrib/pgstattuple/pgstatapprox.c @@ -3,7 +3,7 @@ * pgstatapprox.c * Bloat estimation functions * - * Copyright (c) 2014-2023, PostgreSQL Global Development Group + * Copyright (c) 2014-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/pgstattuple/pgstatapprox.c diff --git a/contrib/pgstattuple/pgstatindex.c b/contrib/pgstattuple/pgstatindex.c index d69ac1c93df2a..5c06ba6db438e 100644 --- a/contrib/pgstattuple/pgstatindex.c +++ b/contrib/pgstattuple/pgstatindex.c @@ -237,6 +237,18 @@ pgstatindex_impl(Relation rel, FunctionCallInfo fcinfo) (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary tables of other sessions"))); + /* + * A !indisready index could lead to ERRCODE_DATA_CORRUPTED later, so exit + * early. We're capable of assessing an indisready&&!indisvalid index, + * but the results could be confusing. For example, the index's size + * could be too low for a valid index of the table. + */ + if (!rel->rd_index->indisvalid) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("index \"%s\" is not valid", + RelationGetRelationName(rel)))); + /* * Read metapage */ @@ -523,6 +535,13 @@ pgstatginindex_internal(Oid relid, FunctionCallInfo fcinfo) (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary indexes of other sessions"))); + /* see pgstatindex_impl */ + if (!rel->rd_index->indisvalid) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("index \"%s\" is not valid", + RelationGetRelationName(rel)))); + /* * Read metapage */ @@ -581,10 +600,9 @@ pgstathashindex(PG_FUNCTION_ARGS) float8 free_percent; uint64 total_space; - rel = index_open(relid, AccessShareLock); + rel = relation_open(relid, AccessShareLock); - /* index_open() checks that it's an index */ - if (!IS_HASH(rel)) + if (!IS_INDEX(rel) || !IS_HASH(rel)) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("relation \"%s\" is not a hash index", @@ -600,6 +618,13 @@ pgstathashindex(PG_FUNCTION_ARGS) (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot access temporary indexes of other sessions"))); + /* see pgstatindex_impl */ + if (!rel->rd_index->indisvalid) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("index \"%s\" is not valid", + RelationGetRelationName(rel)))); + /* Get the information we need from the metapage. */ memset(&stats, 0, sizeof(stats)); metabuf = _hash_getbuf(rel, HASH_METAPAGE, HASH_READ, LH_META_PAGE); diff --git a/contrib/pgstattuple/pgstattuple.c b/contrib/pgstattuple/pgstattuple.c index 93b7834b774a4..1d012233cbffe 100644 --- a/contrib/pgstattuple/pgstattuple.c +++ b/contrib/pgstattuple/pgstattuple.c @@ -259,6 +259,13 @@ pgstat_relation(Relation rel, FunctionCallInfo fcinfo) } else if (rel->rd_rel->relkind == RELKIND_INDEX) { + /* see pgstatindex_impl */ + if (!rel->rd_index->indisvalid) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("index \"%s\" is not valid", + RelationGetRelationName(rel)))); + switch (rel->rd_rel->relam) { case BTREE_AM_OID: @@ -316,7 +323,11 @@ pgstat_heap(Relation rel, FunctionCallInfo fcinfo) pgstattuple_type stat = {0}; SnapshotData SnapshotDirty; - if (rel->rd_rel->relam != HEAP_TABLE_AM_OID) + /* + * Sequences always use heap AM, but they don't show that in the catalogs. + */ + if (rel->rd_rel->relkind != RELKIND_SEQUENCE && + rel->rd_rel->relam != HEAP_TABLE_AM_OID) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("only heap AM is supported"))); diff --git a/contrib/pgstattuple/sql/pgstattuple.sql b/contrib/pgstattuple/sql/pgstattuple.sql index 5111be0e62506..7e72c567a0641 100644 --- a/contrib/pgstattuple/sql/pgstattuple.sql +++ b/contrib/pgstattuple/sql/pgstattuple.sql @@ -65,6 +65,7 @@ select pgstatginindex('test_hashidx'); -- check that using any of these functions with unsupported relations will fail create table test_partitioned (a int) partition by range (a); create index test_partitioned_index on test_partitioned(a); +create index test_partitioned_hash_index on test_partitioned using hash(a); -- these should all fail select pgstattuple('test_partitioned'); select pgstattuple('test_partitioned_index'); @@ -73,6 +74,7 @@ select pg_relpages('test_partitioned'); select pgstatindex('test_partitioned'); select pgstatginindex('test_partitioned'); select pgstathashindex('test_partitioned'); +select pgstathashindex('test_partitioned_hash_index'); create view test_view as select 1; -- these should all fail @@ -117,6 +119,18 @@ create index test_partition_hash_idx on test_partition using hash (a); select pgstatindex('test_partition_idx'); select pgstathashindex('test_partition_hash_idx'); +-- these should work for sequences +create sequence test_sequence; +select count(*) from pgstattuple('test_sequence'); +select pg_relpages('test_sequence'); + +-- these should fail for sequences +select pgstatindex('test_sequence'); +select pgstatginindex('test_sequence'); +select pgstathashindex('test_sequence'); +select pgstattuple_approx('test_sequence'); + +drop sequence test_sequence; drop table test_partitioned; drop view test_view; drop foreign table test_foreign_table; diff --git a/contrib/postgres_fdw/Makefile b/contrib/postgres_fdw/Makefile index c1b0cad453f25..b9fa69930529b 100644 --- a/contrib/postgres_fdw/Makefile +++ b/contrib/postgres_fdw/Makefile @@ -16,7 +16,7 @@ SHLIB_LINK_INTERNAL = $(libpq) EXTENSION = postgres_fdw DATA = postgres_fdw--1.0.sql postgres_fdw--1.0--1.1.sql -REGRESS = postgres_fdw +REGRESS = postgres_fdw query_cancel ifdef USE_PGXS PG_CONFIG = pg_config diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c index f839308b40030..2fc52b81e13dd 100644 --- a/contrib/postgres_fdw/connection.c +++ b/contrib/postgres_fdw/connection.c @@ -3,7 +3,7 @@ * connection.c * Connection management functions for postgres_fdw * - * Portions Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/postgres_fdw/connection.c @@ -83,6 +83,11 @@ static unsigned int prep_stmt_number = 0; /* tracks whether any work is needed in callback functions */ static bool xact_got_connection = false; +/* custom wait event values, retrieved from shared memory */ +static uint32 pgfdw_we_cleanup_result = 0; +static uint32 pgfdw_we_connect = 0; +static uint32 pgfdw_we_get_result = 0; + /* * Milliseconds to wait to cancel an in-progress query or execute a cleanup * query; if it takes longer than 30 seconds to do these, we assume the @@ -90,6 +95,13 @@ static bool xact_got_connection = false; */ #define CONNECTION_CLEANUP_TIMEOUT 30000 +/* + * Milliseconds to wait before issuing another cancel request. This covers + * the race condition where the remote session ignored our cancel request + * because it arrived while idle. + */ +#define RETRY_CANCEL_TIMEOUT 1000 + /* Macro for constructing abort command to be sent */ #define CONSTRUCT_ABORT_COMMAND(sql, entry, toplevel) \ do { \ @@ -128,8 +140,9 @@ static void pgfdw_inval_callback(Datum arg, int cacheid, uint32 hashvalue); static void pgfdw_reject_incomplete_xact_state_change(ConnCacheEntry *entry); static void pgfdw_reset_xact_state(ConnCacheEntry *entry, bool toplevel); static bool pgfdw_cancel_query(PGconn *conn); -static bool pgfdw_cancel_query_begin(PGconn *conn); +static bool pgfdw_cancel_query_begin(PGconn *conn, TimestampTz endtime); static bool pgfdw_cancel_query_end(PGconn *conn, TimestampTz endtime, + TimestampTz retrycanceltime, bool consume_input); static bool pgfdw_exec_cleanup_query(PGconn *conn, const char *query, bool ignore_errors); @@ -139,6 +152,7 @@ static bool pgfdw_exec_cleanup_query_end(PGconn *conn, const char *query, bool consume_input, bool ignore_errors); static bool pgfdw_get_cleanup_result(PGconn *conn, TimestampTz endtime, + TimestampTz retrycanceltime, PGresult **result, bool *timed_out); static void pgfdw_abort_cleanup(ConnCacheEntry *entry, bool toplevel); static bool pgfdw_abort_cleanup_begin(ConnCacheEntry *entry, bool toplevel, @@ -182,6 +196,10 @@ GetConnection(UserMapping *user, bool will_prep_stmt, PgFdwConnState **state) { HASHCTL ctl; + if (pgfdw_we_get_result == 0) + pgfdw_we_get_result = + WaitEventExtensionNew("PostgresFdwGetResult"); + ctl.keysize = sizeof(ConnCacheKey); ctl.entrysize = sizeof(ConnCacheEntry); ConnectionHash = hash_create("postgres_fdw connections", 8, @@ -527,10 +545,14 @@ connect_pg_server(ForeignServer *server, UserMapping *user) /* verify the set of connection parameters */ check_conn_params(keywords, values, user); + /* first time, allocate or get the custom wait event */ + if (pgfdw_we_connect == 0) + pgfdw_we_connect = WaitEventExtensionNew("PostgresFdwConnect"); + /* OK to make connection */ conn = libpqsrv_connect_params(keywords, values, false, /* expand_dbname */ - PG_WAIT_EXTENSION); + pgfdw_we_connect); if (!conn || PQstatus(conn) != CONNECTION_OK) ereport(ERROR, @@ -658,10 +680,12 @@ configure_remote_session(PGconn *conn) * anyway. However it makes the regression test outputs more predictable. * * We don't risk setting remote zone equal to ours, since the remote - * server might use a different timezone database. Instead, use UTC - * (quoted, because very old servers are picky about case). + * server might use a different timezone database. Instead, use GMT + * (quoted, because very old servers are picky about case). That's + * guaranteed to work regardless of the remote's timezone database, + * because pg_tzset() hard-wires it (at least in PG 9.2 and later). */ - do_sql_command(conn, "SET timezone = 'UTC'"); + do_sql_command(conn, "SET timezone = 'GMT'"); /* * Set values needed to ensure unambiguous data output from remote. (This @@ -707,7 +731,7 @@ do_sql_command_end(PGconn *conn, const char *sql, bool consume_input) */ if (consume_input && !PQconsumeInput(conn)) pgfdw_report_error(ERROR, NULL, conn, false, sql); - res = pgfdw_get_result(conn, sql); + res = pgfdw_get_result(conn); if (PQresultStatus(res) != PGRES_COMMAND_OK) pgfdw_report_error(ERROR, res, conn, true, sql); PQclear(res); @@ -810,7 +834,9 @@ GetPrepStmtNumber(PGconn *conn) /* * Submit a query and wait for the result. * - * This function is interruptible by signals. + * Since we don't use non-blocking mode, this can't process interrupts while + * pushing the query text to the server. That risk is relatively small, so we + * ignore that for now. * * Caller is responsible for the error handling on the result. */ @@ -821,77 +847,20 @@ pgfdw_exec_query(PGconn *conn, const char *query, PgFdwConnState *state) if (state && state->pendingAreq) process_pending_request(state->pendingAreq); - /* - * Submit a query. Since we don't use non-blocking mode, this also can - * block. But its risk is relatively small, so we ignore that for now. - */ if (!PQsendQuery(conn, query)) - pgfdw_report_error(ERROR, NULL, conn, false, query); - - /* Wait for the result. */ - return pgfdw_get_result(conn, query); + return NULL; + return pgfdw_get_result(conn); } /* - * Wait for the result from a prior asynchronous execution function call. - * - * This function offers quick responsiveness by checking for any interruptions. - * - * This function emulates PQexec()'s behavior of returning the last result - * when there are many. + * Wrap libpqsrv_get_result_last(), adding wait event. * * Caller is responsible for the error handling on the result. */ PGresult * -pgfdw_get_result(PGconn *conn, const char *query) +pgfdw_get_result(PGconn *conn) { - PGresult *volatile last_res = NULL; - - /* In what follows, do not leak any PGresults on an error. */ - PG_TRY(); - { - for (;;) - { - PGresult *res; - - while (PQisBusy(conn)) - { - int wc; - - /* Sleep until there's something to do */ - wc = WaitLatchOrSocket(MyLatch, - WL_LATCH_SET | WL_SOCKET_READABLE | - WL_EXIT_ON_PM_DEATH, - PQsocket(conn), - -1L, PG_WAIT_EXTENSION); - ResetLatch(MyLatch); - - CHECK_FOR_INTERRUPTS(); - - /* Data available in socket? */ - if (wc & WL_SOCKET_READABLE) - { - if (!PQconsumeInput(conn)) - pgfdw_report_error(ERROR, NULL, conn, false, query); - } - } - - res = PQgetResult(conn); - if (res == NULL) - break; /* query is complete */ - - PQclear(last_res); - last_res = res; - } - } - PG_CATCH(); - { - PQclear(last_res); - PG_RE_THROW(); - } - PG_END_TRY(); - - return last_res; + return libpqsrv_get_result_last(conn, pgfdw_we_get_result); } /* @@ -932,8 +901,8 @@ pgfdw_report_error(int elevel, PGresult *res, PGconn *conn, /* * If we don't get a message from the PGresult, try the PGconn. This - * is needed because for connection-level failures, PQexec may just - * return NULL, not a PGresult at all. + * is needed because for connection-level failures, PQgetResult may + * just return NULL, not a PGresult at all. */ if (message_primary == NULL) message_primary = pchomp(PQerrorMessage(conn)); @@ -1033,7 +1002,8 @@ pgfdw_xact_callback(XactEvent event, void *arg) */ if (entry->have_prep_stmt && entry->have_error) { - res = PQexec(entry->conn, "DEALLOCATE ALL"); + res = pgfdw_exec_query(entry->conn, "DEALLOCATE ALL", + NULL); PQclear(res); } entry->have_prep_stmt = false; @@ -1347,51 +1317,54 @@ pgfdw_reset_xact_state(ConnCacheEntry *entry, bool toplevel) static bool pgfdw_cancel_query(PGconn *conn) { + TimestampTz now = GetCurrentTimestamp(); TimestampTz endtime; + TimestampTz retrycanceltime; /* * If it takes too long to cancel the query and discard the result, assume * the connection is dead. */ - endtime = TimestampTzPlusMilliseconds(GetCurrentTimestamp(), - CONNECTION_CLEANUP_TIMEOUT); + endtime = TimestampTzPlusMilliseconds(now, CONNECTION_CLEANUP_TIMEOUT); + + /* + * Also, lose patience and re-issue the cancel request after a little bit. + * (This serves to close some race conditions.) + */ + retrycanceltime = TimestampTzPlusMilliseconds(now, RETRY_CANCEL_TIMEOUT); - if (!pgfdw_cancel_query_begin(conn)) + if (!pgfdw_cancel_query_begin(conn, endtime)) return false; - return pgfdw_cancel_query_end(conn, endtime, false); + return pgfdw_cancel_query_end(conn, endtime, retrycanceltime, false); } +/* + * Submit a cancel request to the given connection, waiting only until + * the given time. + * + * We sleep interruptibly until we receive confirmation that the cancel + * request has been accepted, and if it is, return true; if the timeout + * lapses without that, or the request fails for whatever reason, return + * false. + */ static bool -pgfdw_cancel_query_begin(PGconn *conn) +pgfdw_cancel_query_begin(PGconn *conn, TimestampTz endtime) { - PGcancel *cancel; - char errbuf[256]; + const char *errormsg = libpqsrv_cancel(conn, endtime); - /* - * Issue cancel request. Unfortunately, there's no good way to limit the - * amount of time that we might block inside PQgetCancel(). - */ - if ((cancel = PQgetCancel(conn))) - { - if (!PQcancel(cancel, errbuf, sizeof(errbuf))) - { - ereport(WARNING, - (errcode(ERRCODE_CONNECTION_FAILURE), - errmsg("could not send cancel request: %s", - errbuf))); - PQfreeCancel(cancel); - return false; - } - PQfreeCancel(cancel); - } + if (errormsg != NULL) + ereport(WARNING, + errcode(ERRCODE_CONNECTION_FAILURE), + errmsg("could not send cancel request: %s", errormsg)); - return true; + return errormsg == NULL; } static bool -pgfdw_cancel_query_end(PGconn *conn, TimestampTz endtime, bool consume_input) +pgfdw_cancel_query_end(PGconn *conn, TimestampTz endtime, + TimestampTz retrycanceltime, bool consume_input) { - PGresult *result = NULL; + PGresult *result; bool timed_out; /* @@ -1410,7 +1383,8 @@ pgfdw_cancel_query_end(PGconn *conn, TimestampTz endtime, bool consume_input) } /* Get and discard the result of the query. */ - if (pgfdw_get_cleanup_result(conn, endtime, &result, &timed_out)) + if (pgfdw_get_cleanup_result(conn, endtime, retrycanceltime, + &result, &timed_out)) { if (timed_out) ereport(WARNING, @@ -1463,6 +1437,8 @@ pgfdw_exec_cleanup_query(PGconn *conn, const char *query, bool ignore_errors) static bool pgfdw_exec_cleanup_query_begin(PGconn *conn, const char *query) { + Assert(query != NULL); + /* * Submit a query. Since we don't use non-blocking mode, this also can * block. But its risk is relatively small, so we ignore that for now. @@ -1481,9 +1457,11 @@ pgfdw_exec_cleanup_query_end(PGconn *conn, const char *query, TimestampTz endtime, bool consume_input, bool ignore_errors) { - PGresult *result = NULL; + PGresult *result; bool timed_out; + Assert(query != NULL); + /* * If requested, consume whatever data is available from the socket. (Note * that if all data is available, this allows pgfdw_get_cleanup_result to @@ -1497,12 +1475,12 @@ pgfdw_exec_cleanup_query_end(PGconn *conn, const char *query, } /* Get the result of the query. */ - if (pgfdw_get_cleanup_result(conn, endtime, &result, &timed_out)) + if (pgfdw_get_cleanup_result(conn, endtime, endtime, &result, &timed_out)) { if (timed_out) ereport(WARNING, (errmsg("could not get query result due to timeout"), - query ? errcontext("remote SQL command: %s", query) : 0)); + errcontext("remote SQL command: %s", query))); else pgfdw_report_error(WARNING, NULL, conn, false, query); @@ -1521,28 +1499,36 @@ pgfdw_exec_cleanup_query_end(PGconn *conn, const char *query, } /* - * Get, during abort cleanup, the result of a query that is in progress. This - * might be a query that is being interrupted by transaction abort, or it might - * be a query that was initiated as part of transaction abort to get the remote - * side back to the appropriate state. + * Get, during abort cleanup, the result of a query that is in progress. + * This might be a query that is being interrupted by a cancel request or by + * transaction abort, or it might be a query that was initiated as part of + * transaction abort to get the remote side back to the appropriate state. + * + * endtime is the time at which we should give up and assume the remote side + * is dead. retrycanceltime is the time at which we should issue a fresh + * cancel request (pass the same value as endtime if this is not wanted). * - * endtime is the time at which we should give up and assume the remote - * side is dead. Returns true if the timeout expired or connection trouble - * occurred, false otherwise. Sets *result except in case of a timeout. - * Sets timed_out to true only when the timeout expired. + * Returns true if the timeout expired or connection trouble occurred, + * false otherwise. Sets *result except in case of a true result. + * Sets *timed_out to true only when the timeout expired. */ static bool -pgfdw_get_cleanup_result(PGconn *conn, TimestampTz endtime, PGresult **result, +pgfdw_get_cleanup_result(PGconn *conn, TimestampTz endtime, + TimestampTz retrycanceltime, + PGresult **result, bool *timed_out) { volatile bool failed = false; PGresult *volatile last_res = NULL; + *result = NULL; *timed_out = false; /* In what follows, do not leak any PGresults on an error. */ PG_TRY(); { + int canceldelta = RETRY_CANCEL_TIMEOUT * 2; + for (;;) { PGresult *res; @@ -1553,8 +1539,33 @@ pgfdw_get_cleanup_result(PGconn *conn, TimestampTz endtime, PGresult **result, TimestampTz now = GetCurrentTimestamp(); long cur_timeout; + /* If timeout has expired, give up. */ + if (now >= endtime) + { + *timed_out = true; + failed = true; + goto exit; + } + + /* If we need to re-issue the cancel request, do that. */ + if (now >= retrycanceltime) + { + /* We ignore failure to issue the repeated request. */ + (void) libpqsrv_cancel(conn, endtime); + + /* Recompute "now" in case that took measurable time. */ + now = GetCurrentTimestamp(); + + /* Adjust re-cancel timeout in increasing steps. */ + retrycanceltime = TimestampTzPlusMilliseconds(now, + canceldelta); + canceldelta += canceldelta; + } + /* If timeout has expired, give up, else get sleep time. */ - cur_timeout = TimestampDifferenceMilliseconds(now, endtime); + cur_timeout = TimestampDifferenceMilliseconds(now, + Min(endtime, + retrycanceltime)); if (cur_timeout <= 0) { *timed_out = true; @@ -1562,12 +1573,16 @@ pgfdw_get_cleanup_result(PGconn *conn, TimestampTz endtime, PGresult **result, goto exit; } + /* first time, allocate or get the custom wait event */ + if (pgfdw_we_cleanup_result == 0) + pgfdw_we_cleanup_result = WaitEventExtensionNew("PostgresFdwCleanupResult"); + /* Sleep until there's something to do */ wc = WaitLatchOrSocket(MyLatch, WL_LATCH_SET | WL_SOCKET_READABLE | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, PQsocket(conn), - cur_timeout, PG_WAIT_EXTENSION); + cur_timeout, pgfdw_we_cleanup_result); ResetLatch(MyLatch); CHECK_FOR_INTERRUPTS(); @@ -1722,7 +1737,11 @@ pgfdw_abort_cleanup_begin(ConnCacheEntry *entry, bool toplevel, */ if (PQtransactionStatus(entry->conn) == PQTRANS_ACTIVE) { - if (!pgfdw_cancel_query_begin(entry->conn)) + TimestampTz endtime; + + endtime = TimestampTzPlusMilliseconds(GetCurrentTimestamp(), + CONNECTION_CLEANUP_TIMEOUT); + if (!pgfdw_cancel_query_begin(entry->conn, endtime)) return false; /* Unable to cancel running query */ *cancel_requested = lappend(*cancel_requested, entry); } @@ -1867,7 +1886,9 @@ pgfdw_finish_abort_cleanup(List *pending_entries, List *cancel_requested, foreach(lc, cancel_requested) { ConnCacheEntry *entry = (ConnCacheEntry *) lfirst(lc); + TimestampTz now = GetCurrentTimestamp(); TimestampTz endtime; + TimestampTz retrycanceltime; char sql[100]; Assert(entry->changing_xact_state); @@ -1881,10 +1902,13 @@ pgfdw_finish_abort_cleanup(List *pending_entries, List *cancel_requested, * remaining entries in the list, leading to slamming that entry's * connection shut. */ - endtime = TimestampTzPlusMilliseconds(GetCurrentTimestamp(), + endtime = TimestampTzPlusMilliseconds(now, CONNECTION_CLEANUP_TIMEOUT); + retrycanceltime = TimestampTzPlusMilliseconds(now, + RETRY_CANCEL_TIMEOUT); - if (!pgfdw_cancel_query_end(entry->conn, endtime, true)) + if (!pgfdw_cancel_query_end(entry->conn, endtime, + retrycanceltime, true)) { /* Unable to cancel running query */ pgfdw_reset_xact_state(entry, toplevel); diff --git a/contrib/postgres_fdw/deparse.c b/contrib/postgres_fdw/deparse.c index 09d6dd60ddc87..fb590c87e67ba 100644 --- a/contrib/postgres_fdw/deparse.c +++ b/contrib/postgres_fdw/deparse.c @@ -24,7 +24,7 @@ * with collations that match the remote table's columns, which we can * consider to be user error. * - * Portions Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/postgres_fdw/deparse.c @@ -47,6 +47,7 @@ #include "catalog/pg_ts_dict.h" #include "catalog/pg_type.h" #include "commands/defrem.h" +#include "commands/tablecmds.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "nodes/plannodes.h" @@ -60,7 +61,6 @@ #include "utils/rel.h" #include "utils/syscache.h" #include "utils/typcache.h" -#include "commands/tablecmds.h" /* * Global context for foreign_expr_walker's search of an expression tree. @@ -83,7 +83,7 @@ typedef enum * it has default collation that is not * traceable to a foreign Var */ FDW_COLLATE_SAFE, /* collation derives from a foreign Var */ - FDW_COLLATE_UNSAFE /* collation is non-default and derives from + FDW_COLLATE_UNSAFE, /* collation is non-default and derives from * something other than a foreign Var */ } FDWCollateState; @@ -180,11 +180,15 @@ static void appendConditions(List *exprs, deparse_expr_cxt *context); static void deparseFromExprForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, bool use_alias, Index ignore_rel, List **ignore_conds, + List **additional_conds, List **params_list); +static void appendWhereClause(List *exprs, List *additional_conds, + deparse_expr_cxt *context); static void deparseFromExpr(List *quals, deparse_expr_cxt *context); static void deparseRangeTblRef(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, bool make_subquery, - Index ignore_rel, List **ignore_conds, List **params_list); + Index ignore_rel, List **ignore_conds, + List **additional_conds, List **params_list); static void deparseAggref(Aggref *node, deparse_expr_cxt *context); static void appendGroupByClause(List *tlist, deparse_expr_cxt *context); static void appendOrderBySuffix(Oid sortop, Oid sortcoltype, bool nulls_first, @@ -1370,6 +1374,7 @@ deparseFromExpr(List *quals, deparse_expr_cxt *context) { StringInfo buf = context->buf; RelOptInfo *scanrel = context->scanrel; + List *additional_conds = NIL; /* For upper relations, scanrel must be either a joinrel or a baserel */ Assert(!IS_UPPER_REL(context->foreignrel) || @@ -1379,14 +1384,11 @@ deparseFromExpr(List *quals, deparse_expr_cxt *context) appendStringInfoString(buf, " FROM "); deparseFromExprForRel(buf, context->root, scanrel, (bms_membership(scanrel->relids) == BMS_MULTIPLE), - (Index) 0, NULL, context->params_list); - - /* Construct WHERE clause */ - if (quals != NIL) - { - appendStringInfoString(buf, " WHERE "); - appendConditions(quals, context); - } + (Index) 0, NULL, &additional_conds, + context->params_list); + appendWhereClause(quals, additional_conds, context); + if (additional_conds != NIL) + list_free_deep(additional_conds); } /* @@ -1598,6 +1600,42 @@ appendConditions(List *exprs, deparse_expr_cxt *context) reset_transmission_modes(nestlevel); } +/* + * Append WHERE clause, containing conditions from exprs and additional_conds, + * to context->buf. + */ +static void +appendWhereClause(List *exprs, List *additional_conds, deparse_expr_cxt *context) +{ + StringInfo buf = context->buf; + bool need_and = false; + ListCell *lc; + + if (exprs != NIL || additional_conds != NIL) + appendStringInfoString(buf, " WHERE "); + + /* + * If there are some filters, append them. + */ + if (exprs != NIL) + { + appendConditions(exprs, context); + need_and = true; + } + + /* + * If there are some EXISTS conditions, coming from SEMI-JOINS, append + * them. + */ + foreach(lc, additional_conds) + { + if (need_and) + appendStringInfoString(buf, " AND "); + appendStringInfoString(buf, (char *) lfirst(lc)); + need_and = true; + } +} + /* Output join name for given join type */ const char * get_jointype_name(JoinType jointype) @@ -1616,6 +1654,9 @@ get_jointype_name(JoinType jointype) case JOIN_FULL: return "FULL"; + case JOIN_SEMI: + return "SEMI"; + default: /* Shouldn't come here, but protect from buggy code. */ elog(ERROR, "unsupported join type %d", jointype); @@ -1712,11 +1753,14 @@ deparseSubqueryTargetList(deparse_expr_cxt *context) * of DELETE; it deparses the join relation as if the relation never contained * the target relation, and creates a List of conditions to be deparsed into * the top-level WHERE clause, which is returned to *ignore_conds. + * + * 'additional_conds' is a pointer to a list of strings to be appended to + * the WHERE clause, coming from lower-level SEMI-JOINs. */ static void deparseFromExprForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, bool use_alias, Index ignore_rel, List **ignore_conds, - List **params_list) + List **additional_conds, List **params_list) { PgFdwRelationInfo *fpinfo = (PgFdwRelationInfo *) foreignrel->fdw_private; @@ -1728,6 +1772,8 @@ deparseFromExprForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, RelOptInfo *innerrel = fpinfo->innerrel; bool outerrel_is_target = false; bool innerrel_is_target = false; + List *additional_conds_i = NIL; + List *additional_conds_o = NIL; if (ignore_rel > 0 && bms_is_member(ignore_rel, foreignrel->relids)) { @@ -1764,7 +1810,8 @@ deparseFromExprForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, initStringInfo(&join_sql_o); deparseRangeTblRef(&join_sql_o, root, outerrel, fpinfo->make_outerrel_subquery, - ignore_rel, ignore_conds, params_list); + ignore_rel, ignore_conds, &additional_conds_o, + params_list); /* * If inner relation is the target relation, skip deparsing it. @@ -1780,6 +1827,12 @@ deparseFromExprForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, Assert(fpinfo->jointype == JOIN_INNER); Assert(fpinfo->joinclauses == NIL); appendBinaryStringInfo(buf, join_sql_o.data, join_sql_o.len); + /* Pass EXISTS conditions to upper level */ + if (additional_conds_o != NIL) + { + Assert(*additional_conds == NIL); + *additional_conds = additional_conds_o; + } return; } } @@ -1790,7 +1843,54 @@ deparseFromExprForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, initStringInfo(&join_sql_i); deparseRangeTblRef(&join_sql_i, root, innerrel, fpinfo->make_innerrel_subquery, - ignore_rel, ignore_conds, params_list); + ignore_rel, ignore_conds, &additional_conds_i, + params_list); + + /* + * SEMI-JOIN is deparsed as the EXISTS subquery. It references + * outer and inner relations, so it should be evaluated as the + * condition in the upper-level WHERE clause. We deparse the + * condition and pass it to upper level callers as an + * additional_conds list. Upper level callers are responsible for + * inserting conditions from the list where appropriate. + */ + if (fpinfo->jointype == JOIN_SEMI) + { + deparse_expr_cxt context; + StringInfoData str; + + /* Construct deparsed condition from this SEMI-JOIN */ + initStringInfo(&str); + appendStringInfo(&str, "EXISTS (SELECT NULL FROM %s", + join_sql_i.data); + + context.buf = &str; + context.foreignrel = foreignrel; + context.scanrel = foreignrel; + context.root = root; + context.params_list = params_list; + + /* + * Append SEMI-JOIN clauses and EXISTS conditions from lower + * levels to the current EXISTS subquery + */ + appendWhereClause(fpinfo->joinclauses, additional_conds_i, &context); + + /* + * EXISTS conditions, coming from lower join levels, have just + * been processed. + */ + if (additional_conds_i != NIL) + { + list_free_deep(additional_conds_i); + additional_conds_i = NIL; + } + + /* Close parentheses for EXISTS subquery */ + appendStringInfoChar(&str, ')'); + + *additional_conds = lappend(*additional_conds, str.data); + } /* * If outer relation is the target relation, skip deparsing it. @@ -1801,6 +1901,12 @@ deparseFromExprForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, Assert(fpinfo->jointype == JOIN_INNER); Assert(fpinfo->joinclauses == NIL); appendBinaryStringInfo(buf, join_sql_i.data, join_sql_i.len); + /* Pass EXISTS conditions to the upper call */ + if (additional_conds_i != NIL) + { + Assert(*additional_conds == NIL); + *additional_conds = additional_conds_i; + } return; } } @@ -1809,33 +1915,65 @@ deparseFromExprForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, Assert(!outerrel_is_target && !innerrel_is_target); /* - * For a join relation FROM clause entry is deparsed as - * - * ((outer relation) (inner relation) ON (joinclauses)) + * For semijoin FROM clause is deparsed as an outer relation. An inner + * relation and join clauses are converted to EXISTS condition and + * passed to the upper level. */ - appendStringInfo(buf, "(%s %s JOIN %s ON ", join_sql_o.data, - get_jointype_name(fpinfo->jointype), join_sql_i.data); - - /* Append join clause; (TRUE) if no join clause */ - if (fpinfo->joinclauses) + if (fpinfo->jointype == JOIN_SEMI) { - deparse_expr_cxt context; + appendBinaryStringInfo(buf, join_sql_o.data, join_sql_o.len); + } + else + { + /* + * For a join relation FROM clause, entry is deparsed as + * + * ((outer relation) (inner relation) ON + * (joinclauses)) + */ + appendStringInfo(buf, "(%s %s JOIN %s ON ", join_sql_o.data, + get_jointype_name(fpinfo->jointype), join_sql_i.data); - context.buf = buf; - context.foreignrel = foreignrel; - context.scanrel = foreignrel; - context.root = root; - context.params_list = params_list; + /* Append join clause; (TRUE) if no join clause */ + if (fpinfo->joinclauses) + { + deparse_expr_cxt context; - appendStringInfoChar(buf, '('); - appendConditions(fpinfo->joinclauses, &context); + context.buf = buf; + context.foreignrel = foreignrel; + context.scanrel = foreignrel; + context.root = root; + context.params_list = params_list; + + appendStringInfoChar(buf, '('); + appendConditions(fpinfo->joinclauses, &context); + appendStringInfoChar(buf, ')'); + } + else + appendStringInfoString(buf, "(TRUE)"); + + /* End the FROM clause entry. */ appendStringInfoChar(buf, ')'); } - else - appendStringInfoString(buf, "(TRUE)"); - /* End the FROM clause entry. */ - appendStringInfoChar(buf, ')'); + /* + * Construct additional_conds to be passed to the upper caller from + * current level additional_conds and additional_conds, coming from + * inner and outer rels. + */ + if (additional_conds_o != NIL) + { + *additional_conds = list_concat(*additional_conds, + additional_conds_o); + list_free(additional_conds_o); + } + + if (additional_conds_i != NIL) + { + *additional_conds = list_concat(*additional_conds, + additional_conds_i); + list_free(additional_conds_i); + } } else { @@ -1863,11 +2001,13 @@ deparseFromExprForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, /* * Append FROM clause entry for the given relation into buf. + * Conditions from lower-level SEMI-JOINs are appended to additional_conds + * and should be added to upper level WHERE clause. */ static void deparseRangeTblRef(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, bool make_subquery, Index ignore_rel, List **ignore_conds, - List **params_list) + List **additional_conds, List **params_list) { PgFdwRelationInfo *fpinfo = (PgFdwRelationInfo *) foreignrel->fdw_private; @@ -1925,7 +2065,8 @@ deparseRangeTblRef(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, } else deparseFromExprForRel(buf, root, foreignrel, true, ignore_rel, - ignore_conds, params_list); + ignore_conds, additional_conds, + params_list); } /* @@ -2148,6 +2289,7 @@ deparseDirectUpdateSql(StringInfo buf, PlannerInfo *root, RangeTblEntry *rte = planner_rt_fetch(rtindex, root); ListCell *lc, *lc2; + List *additional_conds = NIL; /* Set up context struct for recursion */ context.root = root; @@ -2189,17 +2331,17 @@ deparseDirectUpdateSql(StringInfo buf, PlannerInfo *root, { List *ignore_conds = NIL; + appendStringInfoString(buf, " FROM "); deparseFromExprForRel(buf, root, foreignrel, true, rtindex, - &ignore_conds, params_list); + &ignore_conds, &additional_conds, params_list); remote_conds = list_concat(remote_conds, ignore_conds); } - if (remote_conds) - { - appendStringInfoString(buf, " WHERE "); - appendConditions(remote_conds, &context); - } + appendWhereClause(remote_conds, additional_conds, &context); + + if (additional_conds != NIL) + list_free_deep(additional_conds); if (foreignrel->reloptkind == RELOPT_JOINREL) deparseExplicitTargetList(returningList, true, retrieved_attrs, @@ -2255,6 +2397,7 @@ deparseDirectDeleteSql(StringInfo buf, PlannerInfo *root, List **retrieved_attrs) { deparse_expr_cxt context; + List *additional_conds = NIL; /* Set up context struct for recursion */ context.root = root; @@ -2274,15 +2417,14 @@ deparseDirectDeleteSql(StringInfo buf, PlannerInfo *root, appendStringInfoString(buf, " USING "); deparseFromExprForRel(buf, root, foreignrel, true, rtindex, - &ignore_conds, params_list); + &ignore_conds, &additional_conds, params_list); remote_conds = list_concat(remote_conds, ignore_conds); } - if (remote_conds) - { - appendStringInfoString(buf, " WHERE "); - appendConditions(remote_conds, &context); - } + appendWhereClause(remote_conds, additional_conds, &context); + + if (additional_conds != NIL) + list_free_deep(additional_conds); if (foreignrel->reloptkind == RELOPT_JOINREL) deparseExplicitTargetList(returningList, true, retrieved_attrs, @@ -3673,7 +3815,7 @@ appendOrderBySuffix(Oid sortop, Oid sortcoltype, bool nulls_first, * Print the representation of a parameter to be sent to the remote side. * * Note: we always label the Param's type explicitly rather than relying on - * transmitting a numeric type OID in PQexecParams(). This allows us to + * transmitting a numeric type OID in PQsendQueryParams(). This allows us to * avoid assuming that types have the same OIDs on the remote side as they * do locally --- they need only have the same names. */ @@ -3770,13 +3912,12 @@ appendOrderByClause(List *pathkeys, bool has_final_sort, { ListCell *lcell; int nestlevel; - const char *delim = " "; StringInfo buf = context->buf; + bool gotone = false; /* Make sure any constants in the exprs are printed portably */ nestlevel = set_transmission_modes(); - appendStringInfoString(buf, " ORDER BY"); foreach(lcell, pathkeys) { PathKey *pathkey = lfirst(lcell); @@ -3809,6 +3950,26 @@ appendOrderByClause(List *pathkeys, bool has_final_sort, em_expr = em->em_expr; + /* + * If the member is a Const expression then we needn't add it to the + * ORDER BY clause. This can happen in UNION ALL queries where the + * union child targetlist has a Const. Adding these would be + * wasteful, but also, for INT columns, an integer literal would be + * seen as an ordinal column position rather than a value to sort by. + * deparseConst() does have code to handle this, but it seems less + * effort on all accounts just to skip these for ORDER BY clauses. + */ + if (IsA(em_expr, Const)) + continue; + + if (!gotone) + { + appendStringInfoString(buf, " ORDER BY "); + gotone = true; + } + else + appendStringInfoString(buf, ", "); + /* * Lookup the operator corresponding to the strategy in the opclass. * The datatype used by the opfamily is not necessarily the same as @@ -3823,7 +3984,6 @@ appendOrderByClause(List *pathkeys, bool has_final_sort, pathkey->pk_strategy, em->em_datatype, em->em_datatype, pathkey->pk_opfamily); - appendStringInfoString(buf, delim); deparseExpr(em_expr, context); /* @@ -3833,7 +3993,6 @@ appendOrderByClause(List *pathkeys, bool has_final_sort, appendOrderBySuffix(oprid, exprType((Node *) em_expr), pathkey->pk_nulls_first, context); - delim = ", "; } reset_transmission_modes(nestlevel); } diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index c8c4614b547b0..602067c4e474f 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -637,6 +637,17 @@ EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft_empty ORDER BY c1; Remote SQL: SELECT c1, c2 FROM public.loct_empty ORDER BY c1 ASC NULLS LAST (3 rows) +-- test restriction on non-system foreign tables. +SET restrict_nonsystem_relation_kind TO 'foreign-table'; +SELECT * from ft1 where c1 < 1; -- ERROR +ERROR: access to non-system foreign table is restricted +INSERT INTO ft1 (c1) VALUES (1); -- ERROR +ERROR: access to non-system foreign table is restricted +DELETE FROM ft1 WHERE c1 = 1; -- ERROR +ERROR: access to non-system foreign table is restricted +TRUNCATE ft1; -- ERROR +ERROR: access to non-system foreign table is restricted +RESET restrict_nonsystem_relation_kind; -- =================================================================== -- WHERE with remotely-executable conditions -- =================================================================== @@ -656,20 +667,20 @@ EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 100 AND t1.c2 = Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = 100)) AND ((c2 = 0)) (3 rows) -EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 IS NULL; -- NullTest - QUERY PLAN -------------------------------------------------------------------------------------------------- +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c3 IS NULL; -- NullTest + QUERY PLAN +---------------------------------------------------------------------------------------------- Foreign Scan on public.ft1 t1 Output: c1, c2, c3, c4, c5, c6, c7, c8 - Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" IS NULL)) + Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE ((c3 IS NULL)) (3 rows) -EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 IS NOT NULL; -- NullTest - QUERY PLAN ------------------------------------------------------------------------------------------------------ +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c3 IS NOT NULL; -- NullTest + QUERY PLAN +-------------------------------------------------------------------------------------------------- Foreign Scan on public.ft1 t1 Output: c1, c2, c3, c4, c5, c6, c7, c8 - Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" IS NOT NULL)) + Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE ((c3 IS NOT NULL)) (3 rows) EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE round(abs(c1), 0) = 1; -- FuncExpr @@ -744,10 +755,10 @@ EXPLAIN (VERBOSE, COSTS OFF) Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" = $1::integer)) (8 rows) -SELECT * FROM ft2 a, ft2 b WHERE a.c1 = 47 AND b.c1 = a.c2; - c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 | c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 -----+----+-------+------------------------------+--------------------------+----+------------+-----+----+----+-------+------------------------------+--------------------------+----+------------+----- - 47 | 7 | 00047 | Tue Feb 17 00:00:00 1970 PST | Tue Feb 17 00:00:00 1970 | 7 | 7 | foo | 7 | 7 | 00007 | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7 | 7 | foo +SELECT * FROM "S 1"."T 1" a, ft2 b WHERE a."C 1" = 47 AND b.c1 = a.c2; + C 1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 | c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 +-----+----+-------+------------------------------+--------------------------+----+------------+-----+----+----+-------+------------------------------+--------------------------+----+------------+----- + 47 | 7 | 00047 | Tue Feb 17 00:00:00 1970 PST | Tue Feb 17 00:00:00 1970 | 7 | 7 | foo | 7 | 7 | 00007 | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7 | 7 | foo (1 row) -- check both safe and unsafe join conditions @@ -893,32 +904,6 @@ SELECT * FROM ft2 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft1 WHERE c1 < 5)); 4 | 4 | 00004 | Mon Jan 05 00:00:00 1970 PST | Mon Jan 05 00:00:00 1970 | 4 | 4 | foo (4 rows) --- we should not push order by clause with volatile expressions or unsafe --- collations -EXPLAIN (VERBOSE, COSTS OFF) - SELECT * FROM ft2 ORDER BY ft2.c1, random(); - QUERY PLAN -------------------------------------------------------------------------------- - Sort - Output: c1, c2, c3, c4, c5, c6, c7, c8, (random()) - Sort Key: ft2.c1, (random()) - -> Foreign Scan on public.ft2 - Output: c1, c2, c3, c4, c5, c6, c7, c8, random() - Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" -(6 rows) - -EXPLAIN (VERBOSE, COSTS OFF) - SELECT * FROM ft2 ORDER BY ft2.c1, ft2.c3 collate "C"; - QUERY PLAN -------------------------------------------------------------------------------- - Sort - Output: c1, c2, c3, c4, c5, c6, c7, c8, ((c3)::text) - Sort Key: ft2.c1, ft2.c3 COLLATE "C" - -> Foreign Scan on public.ft2 - Output: c1, c2, c3, c4, c5, c6, c7, c8, c3 - Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" -(6 rows) - -- user-defined operator/function CREATE FUNCTION postgres_fdw_abs(int) RETURNS int AS $$ BEGIN @@ -1073,6 +1058,27 @@ SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1; 1 | 1 | 00001 | Fri Jan 02 00:00:00 1970 PST | Fri Jan 02 00:00:00 1970 | 1 | 1 | foo (1 row) +-- Ensure we don't ship FETCH FIRST .. WITH TIES +EXPLAIN (VERBOSE, COSTS OFF) +SELECT t1.c2 FROM ft1 t1 WHERE t1.c1 > 960 ORDER BY t1.c2 FETCH FIRST 2 ROWS WITH TIES; + QUERY PLAN +------------------------------------------------------------------------------------------------- + Limit + Output: c2 + -> Foreign Scan on public.ft1 t1 + Output: c2 + Remote SQL: SELECT c2 FROM "S 1"."T 1" WHERE (("C 1" > 960)) ORDER BY c2 ASC NULLS LAST +(5 rows) + +SELECT t1.c2 FROM ft1 t1 WHERE t1.c1 > 960 ORDER BY t1.c2 FETCH FIRST 2 ROWS WITH TIES; + c2 +---- + 0 + 0 + 0 + 0 +(4 rows) + -- Test CASE pushdown EXPLAIN (VERBOSE, COSTS OFF) SELECT c1,c2,c3 FROM ft2 WHERE CASE WHEN c1 > 990 THEN c1 END < 1000 ORDER BY c1; @@ -1206,6 +1212,73 @@ WHERE c1 = 642 AND length(to_tsvector('custom_search'::regconfig, c3)) > 0; 642 | '00642':1 (1 row) +-- =================================================================== +-- ORDER BY queries +-- =================================================================== +-- we should not push order by clause with volatile expressions or unsafe +-- collations +EXPLAIN (VERBOSE, COSTS OFF) + SELECT * FROM ft2 ORDER BY ft2.c1, random(); + QUERY PLAN +------------------------------------------------------------------------------- + Sort + Output: c1, c2, c3, c4, c5, c6, c7, c8, (random()) + Sort Key: ft2.c1, (random()) + -> Foreign Scan on public.ft2 + Output: c1, c2, c3, c4, c5, c6, c7, c8, random() + Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" +(6 rows) + +EXPLAIN (VERBOSE, COSTS OFF) + SELECT * FROM ft2 ORDER BY ft2.c1, ft2.c3 collate "C"; + QUERY PLAN +------------------------------------------------------------------------------- + Sort + Output: c1, c2, c3, c4, c5, c6, c7, c8, ((c3)::text) + Sort Key: ft2.c1, ft2.c3 COLLATE "C" + -> Foreign Scan on public.ft2 + Output: c1, c2, c3, c4, c5, c6, c7, c8, c3 + Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" +(6 rows) + +-- Ensure we don't push ORDER BY expressions which are Consts at the UNION +-- child level to the foreign server. +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM ( + SELECT 1 AS type,c1 FROM ft1 + UNION ALL + SELECT 2 AS type,c1 FROM ft2 +) a ORDER BY type,c1; + QUERY PLAN +--------------------------------------------------------------------------------- + Merge Append + Sort Key: (1), ft1.c1 + -> Foreign Scan on public.ft1 + Output: 1, ft1.c1 + Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC NULLS LAST + -> Foreign Scan on public.ft2 + Output: 2, ft2.c1 + Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC NULLS LAST +(8 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM ( + SELECT 1 AS type,c1 FROM ft1 + UNION ALL + SELECT 2 AS type,c1 FROM ft2 +) a ORDER BY type; + QUERY PLAN +--------------------------------------------------- + Merge Append + Sort Key: (1) + -> Foreign Scan on public.ft1 + Output: 1, ft1.c1 + Remote SQL: SELECT "C 1" FROM "S 1"."T 1" + -> Foreign Scan on public.ft2 + Output: 2, ft2.c1 + Remote SQL: SELECT "C 1" FROM "S 1"."T 1" +(8 rows) + -- =================================================================== -- JOIN queries -- =================================================================== @@ -2001,23 +2074,16 @@ SELECT t1.ctid, t1, t2, t1.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER B Remote SQL: SELECT r1.ctid, CASE WHEN (r1.*)::text IS NOT NULL THEN ROW(r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8) END, CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END, r1."C 1", r1.c3 FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r2."C 1" = r1."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST LIMIT 10::bigint OFFSET 100::bigint (4 rows) --- SEMI JOIN, not pushed down +-- SEMI JOIN EXPLAIN (VERBOSE, COSTS OFF) SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10; - QUERY PLAN ---------------------------------------------------------------------------------------- - Limit + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan Output: t1.c1 - -> Merge Semi Join - Output: t1.c1 - Merge Cond: (t1.c1 = t2.c1) - -> Foreign Scan on public.ft1 t1 - Output: t1.c1 - Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC NULLS LAST - -> Foreign Scan on public.ft2 t2 - Output: t2.c1 - Remote SQL: SELECT "C 1" FROM "S 1"."T 1" ORDER BY "C 1" ASC NULLS LAST -(11 rows) + Relations: (public.ft1 t1) SEMI JOIN (public.ft2 t2) + Remote SQL: SELECT r1."C 1" FROM "S 1"."T 1" r1 WHERE EXISTS (SELECT NULL FROM "S 1"."T 1" r2 WHERE ((r2."C 1" = r1."C 1"))) ORDER BY r1."C 1" ASC NULLS LAST LIMIT 10::bigint OFFSET 100::bigint +(4 rows) SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10; c1 @@ -2316,6 +2382,22 @@ SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM 1 (10 rows) +-- join with pseudoconstant quals +EXPLAIN (VERBOSE, COSTS OFF) +SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1 AND CURRENT_USER = SESSION_USER) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Limit + Output: t1.c1, t2.c1, t1.c3 + -> Result + Output: t1.c1, t2.c1, t1.c3 + One-Time Filter: (CURRENT_USER = SESSION_USER) + -> Foreign Scan + Output: t1.c1, t1.c3, t2.c1 + Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2) + Remote SQL: SELECT r1."C 1", r2."C 1", r1.c3 FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r2."C 1" = r1."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST +(9 rows) + -- non-Var items in targetlist of the nullable rel of a join preventing -- push-down in some cases -- unable to push {ft1, ft2} @@ -2689,6 +2771,48 @@ SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c (10 rows) ALTER VIEW v4 OWNER TO regress_view_owner; +-- ==================================================================== +-- Check that userid to use when querying the remote table is correctly +-- propagated into foreign rels present in subqueries under an UNION ALL +-- ==================================================================== +CREATE ROLE regress_view_owner_another; +ALTER VIEW v4 OWNER TO regress_view_owner_another; +GRANT SELECT ON ft4 TO regress_view_owner_another; +ALTER FOREIGN TABLE ft4 OPTIONS (ADD use_remote_estimate 'true'); +-- The following should query the remote backing table of ft4 as user +-- regress_view_owner_another, the view owner, though it fails as expected +-- due to the lack of a user mapping for that user. +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM v4; +ERROR: user mapping not found for user "regress_view_owner_another", server "loopback" +-- Likewise, but with the query under an UNION ALL +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM (SELECT * FROM v4 UNION ALL SELECT * FROM v4); +ERROR: user mapping not found for user "regress_view_owner_another", server "loopback" +-- Should not get that error once a user mapping is created +CREATE USER MAPPING FOR regress_view_owner_another SERVER loopback OPTIONS (password_required 'false'); +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM v4; + QUERY PLAN +-------------------------------------------------- + Foreign Scan on public.ft4 + Output: ft4.c1, ft4.c2, ft4.c3 + Remote SQL: SELECT c1, c2, c3 FROM "S 1"."T 3" +(3 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM (SELECT * FROM v4 UNION ALL SELECT * FROM v4); + QUERY PLAN +-------------------------------------------------------- + Append + -> Foreign Scan on public.ft4 + Output: ft4.c1, ft4.c2, ft4.c3 + Remote SQL: SELECT c1, c2, c3 FROM "S 1"."T 3" + -> Foreign Scan on public.ft4 ft4_1 + Output: ft4_1.c1, ft4_1.c2, ft4_1.c3 + Remote SQL: SELECT c1, c2, c3 FROM "S 1"."T 3" +(7 rows) + +DROP USER MAPPING FOR regress_view_owner_another SERVER loopback; +DROP OWNED BY regress_view_owner_another; +DROP ROLE regress_view_owner_another; +ALTER FOREIGN TABLE ft4 OPTIONS (SET use_remote_estimate 'false'); -- cleanup DROP OWNED BY regress_view_owner; DROP ROLE regress_view_owner; @@ -2970,10 +3094,10 @@ select exists(select 1 from pg_enum), sum(c1) from ft1; QUERY PLAN -------------------------------------------------- Foreign Scan - Output: $0, (sum(ft1.c1)) + Output: (InitPlan 1).col1, (sum(ft1.c1)) Relations: Aggregate on (public.ft1) Remote SQL: SELECT sum("C 1") FROM "S 1"."T 1" - InitPlan 1 (returns $0) + InitPlan 1 -> Seq Scan on pg_catalog.pg_enum (6 rows) @@ -2988,8 +3112,8 @@ select exists(select 1 from pg_enum), sum(c1) from ft1 group by 1; QUERY PLAN --------------------------------------------------- GroupAggregate - Output: $0, sum(ft1.c1) - InitPlan 1 (returns $0) + Output: (InitPlan 1).col1, sum(ft1.c1) + InitPlan 1 -> Seq Scan on pg_catalog.pg_enum -> Foreign Scan on public.ft1 Output: ft1.c1 @@ -3213,10 +3337,10 @@ select sum(c1) filter (where (c1 / c1) * random() <= 1) from ft1 group by c2 ord explain (verbose, costs off) select sum(c2) filter (where c2 in (select c2 from ft1 where c2 < 5)) from ft1; - QUERY PLAN -------------------------------------------------------------------- + QUERY PLAN +------------------------------------------------------------------------------- Aggregate - Output: sum(ft1.c2) FILTER (WHERE (hashed SubPlan 1)) + Output: sum(ft1.c2) FILTER (WHERE (ANY (ft1.c2 = (hashed SubPlan 1).col1))) -> Foreign Scan on public.ft1 Output: ft1.c2 Remote SQL: SELECT c2 FROM "S 1"."T 1" @@ -3960,27 +4084,26 @@ EXECUTE st1(101, 101); 00101 | 00101 (1 row) +SET enable_hashjoin TO off; +SET enable_sort TO off; -- subquery using stable function (can't be sent to remote) PREPARE st2(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c4) = '1970-01-17'::date) ORDER BY c1; EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st2(10, 20); - QUERY PLAN ----------------------------------------------------------------------------------------------------------- - Sort + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------- + Nested Loop Semi Join Output: t1.c1, t1.c2, t1.c3, t1.c4, t1.c5, t1.c6, t1.c7, t1.c8 - Sort Key: t1.c1 - -> Nested Loop Semi Join + Join Filter: (t2.c3 = t1.c3) + -> Foreign Scan on public.ft1 t1 Output: t1.c1, t1.c2, t1.c3, t1.c4, t1.c5, t1.c6, t1.c7, t1.c8 - Join Filter: (t2.c3 = t1.c3) - -> Foreign Scan on public.ft1 t1 - Output: t1.c1, t1.c2, t1.c3, t1.c4, t1.c5, t1.c6, t1.c7, t1.c8 - Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" < 20)) - -> Materialize + Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" < 20)) ORDER BY "C 1" ASC NULLS LAST + -> Materialize + Output: t2.c3 + -> Foreign Scan on public.ft2 t2 Output: t2.c3 - -> Foreign Scan on public.ft2 t2 - Output: t2.c3 - Filter: (date(t2.c4) = '01-17-1970'::date) - Remote SQL: SELECT c3, c4 FROM "S 1"."T 1" WHERE (("C 1" > 10)) -(15 rows) + Filter: (date(t2.c4) = '01-17-1970'::date) + Remote SQL: SELECT c3, c4 FROM "S 1"."T 1" WHERE (("C 1" > 10)) +(12 rows) EXECUTE st2(10, 20); c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 @@ -3994,26 +4117,18 @@ EXECUTE st2(101, 121); 116 | 6 | 00116 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6 | 6 | foo (1 row) +RESET enable_hashjoin; +RESET enable_sort; -- subquery using immutable function (can be sent to remote) PREPARE st3(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c5) = '1970-01-17'::date) ORDER BY c1; EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st3(10, 20); - QUERY PLAN ------------------------------------------------------------------------------------------------------------------------ - Sort + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan Output: t1.c1, t1.c2, t1.c3, t1.c4, t1.c5, t1.c6, t1.c7, t1.c8 - Sort Key: t1.c1 - -> Nested Loop Semi Join - Output: t1.c1, t1.c2, t1.c3, t1.c4, t1.c5, t1.c6, t1.c7, t1.c8 - Join Filter: (t2.c3 = t1.c3) - -> Foreign Scan on public.ft1 t1 - Output: t1.c1, t1.c2, t1.c3, t1.c4, t1.c5, t1.c6, t1.c7, t1.c8 - Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" WHERE (("C 1" < 20)) - -> Materialize - Output: t2.c3 - -> Foreign Scan on public.ft2 t2 - Output: t2.c3 - Remote SQL: SELECT c3 FROM "S 1"."T 1" WHERE (("C 1" > 10)) AND ((date(c5) = '1970-01-17'::date)) -(14 rows) + Relations: (public.ft1 t1) SEMI JOIN (public.ft2 t2) + Remote SQL: SELECT r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8 FROM "S 1"."T 1" r1 WHERE ((r1."C 1" < 20)) AND EXISTS (SELECT NULL FROM "S 1"."T 1" r3 WHERE ((r3."C 1" > 10)) AND ((date(r3.c5) = '1970-01-17'::date)) AND ((r3.c3 = r1.c3))) ORDER BY r1."C 1" ASC NULLS LAST +(4 rows) EXECUTE st3(10, 20); c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 @@ -4151,13 +4266,13 @@ EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st6; PREPARE st7 AS INSERT INTO ft1 (c1,c2,c3) VALUES (1001,101,'foo'); EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7; - QUERY PLAN -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Insert on public.ft1 Remote SQL: INSERT INTO "S 1"."T 1"("C 1", c2, c3, c4, c5, c6, c7, c8) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) Batch Size: 1 -> Result - Output: NULL::integer, 1001, 101, 'foo'::text, NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying, 'ft1 '::character(10), NULL::user_enum + Output: NULL::integer, 1001, 101, 'foo'::text, NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying(10), 'ft1 '::character(10), NULL::user_enum (5 rows) ALTER TABLE "S 1"."T 1" RENAME TO "T 0"; @@ -4185,13 +4300,13 @@ EXECUTE st6; (9 rows) EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st7; - QUERY PLAN -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Insert on public.ft1 Remote SQL: INSERT INTO "S 1"."T 0"("C 1", c2, c3, c4, c5, c6, c7, c8) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) Batch Size: 1 -> Result - Output: NULL::integer, 1001, 101, 'foo'::text, NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying, 'ft1 '::character(10), NULL::user_enum + Output: NULL::integer, 1001, 101, 'foo'::text, NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying(10), 'ft1 '::character(10), NULL::user_enum (5 rows) ALTER TABLE "S 1"."T 0" RENAME TO "T 1"; @@ -4557,18 +4672,333 @@ explain (verbose, costs off) select * from ft3 f, loct3 l Index Cond: (l.f1 = 'foo'::text) (12 rows) +-- =================================================================== +-- test SEMI-JOIN pushdown +-- =================================================================== +EXPLAIN (verbose, costs off) +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN ft4 ON ft2.c2 = ft4.c1 + WHERE ft2.c1 > 900 + AND EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1) + ORDER BY ft2.c1; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan + Output: ft2.c1, ft2.c2, ft2.c3, ft2.c4, ft2.c5, ft2.c6, ft2.c7, ft2.c8, ft4.c1, ft4.c2, ft4.c3 + Relations: ((public.ft2) INNER JOIN (public.ft4)) SEMI JOIN (public.ft5) + Remote SQL: SELECT r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8, r2.c1, r2.c2, r2.c3 FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 3" r2 ON (((r1.c2 = r2.c1)) AND ((r1."C 1" > 900)))) WHERE EXISTS (SELECT NULL FROM "S 1"."T 4" r4 WHERE ((r1.c2 = r4.c1))) ORDER BY r1."C 1" ASC NULLS LAST +(4 rows) + +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN ft4 ON ft2.c2 = ft4.c1 + WHERE ft2.c1 > 900 + AND EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1) + ORDER BY ft2.c1; + c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 | c1 | c2 | c3 +-----+----+-------+------------------------------+--------------------------+----+------------+-----+----+----+-------- + 906 | 6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 916 | 6 | 00916 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 926 | 6 | 00926 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 936 | 6 | 00936 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 946 | 6 | 00946 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 956 | 6 | 00956 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 966 | 6 | 00966 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 976 | 6 | 00976 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 986 | 6 | 00986 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 996 | 6 | 00996 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 +(10 rows) + +-- The same query, different join order +EXPLAIN (verbose, costs off) +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN + (SELECT * FROM ft4 WHERE + EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4 + ON ft2.c2 = ft4.c1 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan + Output: ft2.c1, ft2.c2, ft2.c3, ft2.c4, ft2.c5, ft2.c6, ft2.c7, ft2.c8, ft4.c1, ft4.c2, ft4.c3 + Relations: ((public.ft2) INNER JOIN (public.ft4)) SEMI JOIN (public.ft5) + Remote SQL: SELECT r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8, r4.c1, r4.c2, r4.c3 FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 3" r4 ON (((r1.c2 = r4.c1)) AND ((r1."C 1" > 900)))) WHERE EXISTS (SELECT NULL FROM "S 1"."T 4" r5 WHERE ((r4.c1 = r5.c1))) ORDER BY r1."C 1" ASC NULLS LAST +(4 rows) + +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN + (SELECT * FROM ft4 WHERE + EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4 + ON ft2.c2 = ft4.c1 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1; + c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 | c1 | c2 | c3 +-----+----+-------+------------------------------+--------------------------+----+------------+-----+----+----+-------- + 906 | 6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 916 | 6 | 00916 | Sat Jan 17 00:00:00 1970 PST | Sat Jan 17 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 926 | 6 | 00926 | Tue Jan 27 00:00:00 1970 PST | Tue Jan 27 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 936 | 6 | 00936 | Fri Feb 06 00:00:00 1970 PST | Fri Feb 06 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 946 | 6 | 00946 | Mon Feb 16 00:00:00 1970 PST | Mon Feb 16 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 956 | 6 | 00956 | Thu Feb 26 00:00:00 1970 PST | Thu Feb 26 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 966 | 6 | 00966 | Sun Mar 08 00:00:00 1970 PST | Sun Mar 08 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 976 | 6 | 00976 | Wed Mar 18 00:00:00 1970 PST | Wed Mar 18 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 986 | 6 | 00986 | Sat Mar 28 00:00:00 1970 PST | Sat Mar 28 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 996 | 6 | 00996 | Tue Apr 07 00:00:00 1970 PST | Tue Apr 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 +(10 rows) + +-- Left join +EXPLAIN (verbose, costs off) +SELECT ft2.*, ft4.* FROM ft2 LEFT JOIN + (SELECT * FROM ft4 WHERE + EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4 + ON ft2.c2 = ft4.c1 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Foreign Scan + Output: ft2.c1, ft2.c2, ft2.c3, ft2.c4, ft2.c5, ft2.c6, ft2.c7, ft2.c8, ft4.c1, ft4.c2, ft4.c3 + Relations: (public.ft2) LEFT JOIN ((public.ft4) SEMI JOIN (public.ft5)) + Remote SQL: SELECT r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8, s6.c1, s6.c2, s6.c3 FROM ("S 1"."T 1" r1 LEFT JOIN (SELECT r4.c1, r4.c2, r4.c3 FROM "S 1"."T 3" r4 WHERE EXISTS (SELECT NULL FROM "S 1"."T 4" r5 WHERE ((r4.c1 = r5.c1)))) s6(c1, c2, c3) ON (((r1.c2 = s6.c1)))) WHERE ((r1."C 1" > 900)) ORDER BY r1."C 1" ASC NULLS LAST LIMIT 10::bigint +(4 rows) + +SELECT ft2.*, ft4.* FROM ft2 LEFT JOIN + (SELECT * FROM ft4 WHERE + EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4 + ON ft2.c2 = ft4.c1 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; + c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 | c1 | c2 | c3 +-----+----+-------+------------------------------+--------------------------+----+------------+-----+----+----+-------- + 901 | 1 | 00901 | Fri Jan 02 00:00:00 1970 PST | Fri Jan 02 00:00:00 1970 | 1 | 1 | foo | | | + 902 | 2 | 00902 | Sat Jan 03 00:00:00 1970 PST | Sat Jan 03 00:00:00 1970 | 2 | 2 | foo | | | + 903 | 3 | 00903 | Sun Jan 04 00:00:00 1970 PST | Sun Jan 04 00:00:00 1970 | 3 | 3 | foo | | | + 904 | 4 | 00904 | Mon Jan 05 00:00:00 1970 PST | Mon Jan 05 00:00:00 1970 | 4 | 4 | foo | | | + 905 | 5 | 00905 | Tue Jan 06 00:00:00 1970 PST | Tue Jan 06 00:00:00 1970 | 5 | 5 | foo | | | + 906 | 6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 907 | 7 | 00907 | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7 | 7 | foo | | | + 908 | 8 | 00908 | Fri Jan 09 00:00:00 1970 PST | Fri Jan 09 00:00:00 1970 | 8 | 8 | foo | | | + 909 | 9 | 00909 | Sat Jan 10 00:00:00 1970 PST | Sat Jan 10 00:00:00 1970 | 9 | 9 | foo | | | + 910 | 0 | 00910 | Sun Jan 11 00:00:00 1970 PST | Sun Jan 11 00:00:00 1970 | 0 | 0 | foo | | | +(10 rows) + +-- Several semi-joins per upper level join +EXPLAIN (verbose, costs off) +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN + (SELECT * FROM ft4 WHERE + EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4 + ON ft2.c2 = ft4.c1 + INNER JOIN (SELECT * FROM ft5 WHERE + EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft5.c1)) ft5 + ON ft2.c2 <= ft5.c1 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan + Output: ft2.c1, ft2.c2, ft2.c3, ft2.c4, ft2.c5, ft2.c6, ft2.c7, ft2.c8, ft4.c1, ft4.c2, ft4.c3 + Relations: ((((public.ft2) INNER JOIN (public.ft4)) SEMI JOIN (public.ft5)) INNER JOIN (public.ft5 ft5_1)) SEMI JOIN (public.ft4 ft4_1) + Remote SQL: SELECT r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8, r6.c1, r6.c2, r6.c3 FROM (("S 1"."T 1" r1 INNER JOIN "S 1"."T 3" r6 ON (((r1.c2 = r6.c1)) AND ((r1."C 1" > 900)))) INNER JOIN "S 1"."T 4" r8 ON (((r1.c2 <= r8.c1)))) WHERE EXISTS (SELECT NULL FROM "S 1"."T 3" r9 WHERE ((r8.c1 = r9.c1))) AND EXISTS (SELECT NULL FROM "S 1"."T 4" r7 WHERE ((r6.c1 = r7.c1))) ORDER BY r1."C 1" ASC NULLS LAST LIMIT 10::bigint +(4 rows) + +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN + (SELECT * FROM ft4 WHERE + EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4 + ON ft2.c2 = ft4.c1 + INNER JOIN (SELECT * FROM ft5 WHERE + EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft5.c1)) ft5 + ON ft2.c2 <= ft5.c1 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; + c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 | c1 | c2 | c3 +-----+----+-------+------------------------------+--------------------------+----+------------+-----+----+----+-------- + 906 | 6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 906 | 6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 906 | 6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 906 | 6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 906 | 6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 906 | 6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 906 | 6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 906 | 6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 906 | 6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 + 906 | 6 | 00906 | Wed Jan 07 00:00:00 1970 PST | Wed Jan 07 00:00:00 1970 | 6 | 6 | foo | 6 | 7 | AAA006 +(10 rows) + +-- Semi-join below Semi-join +EXPLAIN (verbose, costs off) +SELECT ft2.* FROM ft2 WHERE + c1 = ANY ( + SELECT c1 FROM ft2 WHERE + EXISTS (SELECT 1 FROM ft4 WHERE ft4.c2 = ft2.c2)) + AND ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan + Output: ft2.c1, ft2.c2, ft2.c3, ft2.c4, ft2.c5, ft2.c6, ft2.c7, ft2.c8 + Relations: (public.ft2) SEMI JOIN ((public.ft2 ft2_1) SEMI JOIN (public.ft4)) + Remote SQL: SELECT r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8 FROM "S 1"."T 1" r1 WHERE ((r1."C 1" > 900)) AND EXISTS (SELECT NULL FROM "S 1"."T 1" r3 WHERE ((r1."C 1" = r3."C 1")) AND EXISTS (SELECT NULL FROM "S 1"."T 3" r4 WHERE ((r3.c2 = r4.c2)))) ORDER BY r1."C 1" ASC NULLS LAST LIMIT 10::bigint +(4 rows) + +SELECT ft2.* FROM ft2 WHERE + c1 = ANY ( + SELECT c1 FROM ft2 WHERE + EXISTS (SELECT 1 FROM ft4 WHERE ft4.c2 = ft2.c2)) + AND ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; + c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 +-----+----+-------+------------------------------+--------------------------+----+------------+----- + 903 | 3 | 00903 | Sun Jan 04 00:00:00 1970 PST | Sun Jan 04 00:00:00 1970 | 3 | 3 | foo + 905 | 5 | 00905 | Tue Jan 06 00:00:00 1970 PST | Tue Jan 06 00:00:00 1970 | 5 | 5 | foo + 907 | 7 | 00907 | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7 | 7 | foo + 909 | 9 | 00909 | Sat Jan 10 00:00:00 1970 PST | Sat Jan 10 00:00:00 1970 | 9 | 9 | foo + 913 | 3 | 00913 | Wed Jan 14 00:00:00 1970 PST | Wed Jan 14 00:00:00 1970 | 3 | 3 | foo + 915 | 5 | 00915 | Fri Jan 16 00:00:00 1970 PST | Fri Jan 16 00:00:00 1970 | 5 | 5 | foo + 917 | 7 | 00917 | Sun Jan 18 00:00:00 1970 PST | Sun Jan 18 00:00:00 1970 | 7 | 7 | foo + 919 | 9 | 00919 | Tue Jan 20 00:00:00 1970 PST | Tue Jan 20 00:00:00 1970 | 9 | 9 | foo + 923 | 3 | 00923 | Sat Jan 24 00:00:00 1970 PST | Sat Jan 24 00:00:00 1970 | 3 | 3 | foo + 925 | 5 | 00925 | Mon Jan 26 00:00:00 1970 PST | Mon Jan 26 00:00:00 1970 | 5 | 5 | foo +(10 rows) + +-- Upper level relations shouldn't refer EXISTS() subqueries +EXPLAIN (verbose, costs off) +SELECT * FROM ft2 ftupper WHERE + EXISTS ( + SELECT c1 FROM ft2 WHERE + EXISTS (SELECT 1 FROM ft4 WHERE ft4.c2 = ft2.c2) AND c1 = ftupper.c1 ) + AND ftupper.c1 > 900 + ORDER BY ftupper.c1 LIMIT 10; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan + Output: ftupper.c1, ftupper.c2, ftupper.c3, ftupper.c4, ftupper.c5, ftupper.c6, ftupper.c7, ftupper.c8 + Relations: (public.ft2 ftupper) SEMI JOIN ((public.ft2) SEMI JOIN (public.ft4)) + Remote SQL: SELECT r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8 FROM "S 1"."T 1" r1 WHERE ((r1."C 1" > 900)) AND EXISTS (SELECT NULL FROM "S 1"."T 1" r2 WHERE ((r1."C 1" = r2."C 1")) AND EXISTS (SELECT NULL FROM "S 1"."T 3" r3 WHERE ((r2.c2 = r3.c2)))) ORDER BY r1."C 1" ASC NULLS LAST LIMIT 10::bigint +(4 rows) + +SELECT * FROM ft2 ftupper WHERE + EXISTS ( + SELECT c1 FROM ft2 WHERE + EXISTS (SELECT 1 FROM ft4 WHERE ft4.c2 = ft2.c2) AND c1 = ftupper.c1 ) + AND ftupper.c1 > 900 + ORDER BY ftupper.c1 LIMIT 10; + c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 +-----+----+-------+------------------------------+--------------------------+----+------------+----- + 903 | 3 | 00903 | Sun Jan 04 00:00:00 1970 PST | Sun Jan 04 00:00:00 1970 | 3 | 3 | foo + 905 | 5 | 00905 | Tue Jan 06 00:00:00 1970 PST | Tue Jan 06 00:00:00 1970 | 5 | 5 | foo + 907 | 7 | 00907 | Thu Jan 08 00:00:00 1970 PST | Thu Jan 08 00:00:00 1970 | 7 | 7 | foo + 909 | 9 | 00909 | Sat Jan 10 00:00:00 1970 PST | Sat Jan 10 00:00:00 1970 | 9 | 9 | foo + 913 | 3 | 00913 | Wed Jan 14 00:00:00 1970 PST | Wed Jan 14 00:00:00 1970 | 3 | 3 | foo + 915 | 5 | 00915 | Fri Jan 16 00:00:00 1970 PST | Fri Jan 16 00:00:00 1970 | 5 | 5 | foo + 917 | 7 | 00917 | Sun Jan 18 00:00:00 1970 PST | Sun Jan 18 00:00:00 1970 | 7 | 7 | foo + 919 | 9 | 00919 | Tue Jan 20 00:00:00 1970 PST | Tue Jan 20 00:00:00 1970 | 9 | 9 | foo + 923 | 3 | 00923 | Sat Jan 24 00:00:00 1970 PST | Sat Jan 24 00:00:00 1970 | 3 | 3 | foo + 925 | 5 | 00925 | Mon Jan 26 00:00:00 1970 PST | Mon Jan 26 00:00:00 1970 | 5 | 5 | foo +(10 rows) + +-- EXISTS should be propagated to the highest upper inner join +EXPLAIN (verbose, costs off) + SELECT ft2.*, ft4.* FROM ft2 INNER JOIN + (SELECT * FROM ft4 WHERE EXISTS ( + SELECT 1 FROM ft2 WHERE ft2.c2 = ft4.c2)) ft4 + ON ft2.c2 = ft4.c1 + INNER JOIN + (SELECT * FROM ft2 WHERE EXISTS ( + SELECT 1 FROM ft4 WHERE ft2.c2 = ft4.c2)) ft21 + ON ft2.c2 = ft21.c2 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan + Output: ft2.c1, ft2.c2, ft2.c3, ft2.c4, ft2.c5, ft2.c6, ft2.c7, ft2.c8, ft4.c1, ft4.c2, ft4.c3 + Relations: ((((public.ft2) INNER JOIN (public.ft4)) SEMI JOIN (public.ft2 ft2_1)) INNER JOIN (public.ft2 ft2_2)) SEMI JOIN (public.ft4 ft4_1) + Remote SQL: SELECT r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8, r6.c1, r6.c2, r6.c3 FROM (("S 1"."T 1" r1 INNER JOIN "S 1"."T 3" r6 ON (((r1.c2 = r6.c1)) AND ((r1."C 1" > 900)))) INNER JOIN "S 1"."T 1" r8 ON (((r1.c2 = r8.c2)))) WHERE EXISTS (SELECT NULL FROM "S 1"."T 3" r9 WHERE ((r1.c2 = r9.c2))) AND EXISTS (SELECT NULL FROM "S 1"."T 1" r7 WHERE ((r7.c2 = r6.c2))) ORDER BY r1."C 1" ASC NULLS LAST LIMIT 10::bigint +(4 rows) + +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN + (SELECT * FROM ft4 WHERE EXISTS ( + SELECT 1 FROM ft2 WHERE ft2.c2 = ft4.c2)) ft4 + ON ft2.c2 = ft4.c1 + INNER JOIN + (SELECT * FROM ft2 WHERE EXISTS ( + SELECT 1 FROM ft4 WHERE ft2.c2 = ft4.c2)) ft21 + ON ft2.c2 = ft21.c2 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; + c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 | c1 | c2 | c3 +----+----+----+----+----+----+----+----+----+----+---- +(0 rows) + +-- Semi-join conditions shouldn't pop up as left/right join clauses. +SET enable_material TO off; +EXPLAIN (verbose, costs off) +SELECT x1.c1 FROM + (SELECT * FROM ft2 WHERE EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft2.c1 AND ft2.c2 < 10)) x1 + RIGHT JOIN + (SELECT * FROM ft2 WHERE EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft2.c1 AND ft2.c2 < 10)) x2 + ON (x1.c1 = x2.c1) +ORDER BY x1.c1 LIMIT 10; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan + Output: ft2.c1 + Relations: ((public.ft2 ft2_1) LEFT JOIN ((public.ft2) SEMI JOIN (public.ft4))) SEMI JOIN (public.ft4 ft4_1) + Remote SQL: SELECT s9.c1 FROM ("S 1"."T 1" r6 LEFT JOIN (SELECT r4."C 1" FROM "S 1"."T 1" r4 WHERE ((r4.c2 < 10)) AND EXISTS (SELECT NULL FROM "S 1"."T 3" r5 WHERE ((r4."C 1" = r5.c1)))) s9(c1) ON (((s9.c1 = r6."C 1")))) WHERE ((r6.c2 < 10)) AND EXISTS (SELECT NULL FROM "S 1"."T 3" r7 WHERE ((r6."C 1" = r7.c1))) ORDER BY s9.c1 ASC NULLS LAST LIMIT 10::bigint +(4 rows) + +SELECT x1.c1 FROM + (SELECT * FROM ft2 WHERE EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft2.c1 AND ft2.c2 < 10)) x1 + RIGHT JOIN + (SELECT * FROM ft2 WHERE EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft2.c1 AND ft2.c2 < 10)) x2 + ON (x1.c1 = x2.c1) +ORDER BY x1.c1 LIMIT 10; + c1 +---- + 2 + 4 + 6 + 8 + 10 + 12 + 14 + 16 + 18 + 20 +(10 rows) + +RESET enable_material; +-- Can't push down semi-join with inner rel vars in targetlist +EXPLAIN (verbose, costs off) +SELECT ft1.c1 FROM ft1 JOIN ft2 on ft1.c1 = ft2.c1 WHERE + ft1.c1 IN ( + SELECT ft2.c1 FROM ft2 JOIN ft4 ON ft2.c1 = ft4.c1) + ORDER BY ft1.c1 LIMIT 5; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Limit + Output: ft1.c1 + -> Merge Semi Join + Output: ft1.c1 + Merge Cond: (ft1.c1 = ft2_1.c1) + -> Foreign Scan + Output: ft1.c1, ft2.c1 + Relations: (public.ft1) INNER JOIN (public.ft2) + Remote SQL: SELECT r1."C 1", r2."C 1" FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r2."C 1" = r1."C 1")))) ORDER BY r1."C 1" ASC NULLS LAST + -> Foreign Scan + Output: ft2_1.c1, ft4.c1 + Relations: (public.ft2 ft2_1) INNER JOIN (public.ft4) + Remote SQL: SELECT r5."C 1", r6.c1 FROM ("S 1"."T 1" r5 INNER JOIN "S 1"."T 3" r6 ON (((r5."C 1" = r6.c1)))) ORDER BY r5."C 1" ASC NULLS LAST +(13 rows) + -- =================================================================== -- test writable foreign table stuff -- =================================================================== EXPLAIN (verbose, costs off) INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20; - QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Insert on public.ft2 Remote SQL: INSERT INTO "S 1"."T 1"("C 1", c2, c3, c4, c5, c6, c7, c8) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) Batch Size: 1 -> Subquery Scan on "*SELECT*" - Output: "*SELECT*"."?column?", "*SELECT*"."?column?_1", NULL::integer, "*SELECT*"."?column?_2", NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying, 'ft2 '::character(10), NULL::user_enum + Output: "*SELECT*"."?column?", "*SELECT*"."?column?_1", NULL::integer, "*SELECT*"."?column?_2", NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying(10), 'ft2 '::character(10), NULL::user_enum -> Foreign Scan on public.ft2 ft2_1 Output: (ft2_1.c1 + 1000), (ft2_1.c2 + 100), (ft2_1.c3 || ft2_1.c3) Remote SQL: SELECT "C 1", c2, c3 FROM "S 1"."T 1" LIMIT 20::bigint @@ -5678,14 +6108,14 @@ SELECT c1,c2,c3,c4 FROM ft2 ORDER BY c1; EXPLAIN (verbose, costs off) INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo') RETURNING tableoid::regclass; - QUERY PLAN -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Insert on public.ft2 Output: (ft2.tableoid)::regclass Remote SQL: INSERT INTO "S 1"."T 1"("C 1", c2, c3, c4, c5, c6, c7, c8) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) Batch Size: 1 -> Result - Output: 1200, 999, NULL::integer, 'foo'::text, NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying, 'ft2 '::character(10), NULL::user_enum + Output: 1200, 999, NULL::integer, 'foo'::text, NULL::timestamp with time zone, NULL::timestamp without time zone, NULL::character varying(10), 'ft2 '::character(10), NULL::user_enum (6 rows) INSERT INTO ft2 (c1,c2,c3) VALUES (1200,999,'foo') RETURNING tableoid::regclass; @@ -5811,9 +6241,9 @@ UPDATE ft2 AS target SET (c2, c7) = ( Update on public.ft2 target Remote SQL: UPDATE "S 1"."T 1" SET c2 = $2, c7 = $3 WHERE ctid = $1 -> Foreign Scan on public.ft2 target - Output: $1, $2, (SubPlan 1 (returns $1,$2)), target.ctid, target.* + Output: (SubPlan 1).col1, (SubPlan 1).col2, (rescan SubPlan 1), target.ctid, target.* Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8, ctid FROM "S 1"."T 1" WHERE (("C 1" > 1100)) FOR UPDATE - SubPlan 1 (returns $1,$2) + SubPlan 1 -> Foreign Scan on public.ft2 src Output: (src.c2 * 10), src.c7 Remote SQL: SELECT c2, c7 FROM "S 1"."T 1" WHERE (($1::integer = "C 1")) @@ -6449,6 +6879,51 @@ SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10; 40 | 42 | 00040_trig_update | Tue Feb 10 00:00:00 1970 PST | Tue Feb 10 00:00:00 1970 | 0 | 0 | foo (10 rows) +-- Test ReScan code path that recreates the cursor even when no parameters +-- change (bug #17889) +CREATE TABLE loct1 (c1 int); +CREATE TABLE loct2 (c1 int, c2 text); +INSERT INTO loct1 VALUES (1001); +INSERT INTO loct1 VALUES (1002); +INSERT INTO loct2 SELECT id, to_char(id, 'FM0000') FROM generate_series(1, 1000) id; +INSERT INTO loct2 VALUES (1001, 'foo'); +INSERT INTO loct2 VALUES (1002, 'bar'); +CREATE FOREIGN TABLE remt2 (c1 int, c2 text) SERVER loopback OPTIONS (table_name 'loct2'); +ANALYZE loct1; +ANALYZE remt2; +SET enable_mergejoin TO false; +SET enable_hashjoin TO false; +SET enable_material TO false; +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE remt2 SET c2 = remt2.c2 || remt2.c2 FROM loct1 WHERE loct1.c1 = remt2.c1 RETURNING remt2.*; + QUERY PLAN +-------------------------------------------------------------------------------- + Update on public.remt2 + Output: remt2.c1, remt2.c2 + Remote SQL: UPDATE public.loct2 SET c2 = $2 WHERE ctid = $1 RETURNING c1, c2 + -> Nested Loop + Output: (remt2.c2 || remt2.c2), remt2.ctid, remt2.*, loct1.ctid + Join Filter: (remt2.c1 = loct1.c1) + -> Seq Scan on public.loct1 + Output: loct1.ctid, loct1.c1 + -> Foreign Scan on public.remt2 + Output: remt2.c2, remt2.ctid, remt2.*, remt2.c1 + Remote SQL: SELECT c1, c2, ctid FROM public.loct2 FOR UPDATE +(11 rows) + +UPDATE remt2 SET c2 = remt2.c2 || remt2.c2 FROM loct1 WHERE loct1.c1 = remt2.c1 RETURNING remt2.*; + c1 | c2 +------+-------- + 1001 | foofoo + 1002 | barbar +(2 rows) + +RESET enable_mergejoin; +RESET enable_hashjoin; +RESET enable_material; +DROP FOREIGN TABLE remt2; +DROP TABLE loct1; +DROP TABLE loct2; -- =================================================================== -- test check constraints -- =================================================================== @@ -9671,21 +10146,19 @@ SELECT t1.a, t1.phv, t2.b, t2.phv FROM (SELECT 't1_phv' phv, * FROM fprt1 WHERE -- test FOR UPDATE; partitionwise join does not apply EXPLAIN (COSTS OFF) SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1; - QUERY PLAN --------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------- LockRows - -> Sort - Sort Key: t1.a - -> Hash Join - Hash Cond: (t2.b = t1.a) + -> Nested Loop + Join Filter: (t1.a = t2.b) + -> Append + -> Foreign Scan on ftprt1_p1 t1_1 + -> Foreign Scan on ftprt1_p2 t1_2 + -> Materialize -> Append -> Foreign Scan on ftprt2_p1 t2_1 -> Foreign Scan on ftprt2_p2 t2_2 - -> Hash - -> Append - -> Foreign Scan on ftprt1_p1 t1_1 - -> Foreign Scan on ftprt1_p2 t1_2 -(12 rows) +(10 rows) SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a % 25 = 0 ORDER BY 1,2 FOR UPDATE OF t1; a | b @@ -9720,18 +10193,16 @@ ANALYZE fpagg_tab_p3; SET enable_partitionwise_aggregate TO false; EXPLAIN (COSTS OFF) SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 ORDER BY 1; - QUERY PLAN ------------------------------------------------------------ - Sort - Sort Key: pagg_tab.a - -> HashAggregate - Group Key: pagg_tab.a - Filter: (avg(pagg_tab.b) < '22'::numeric) - -> Append - -> Foreign Scan on fpagg_tab_p1 pagg_tab_1 - -> Foreign Scan on fpagg_tab_p2 pagg_tab_2 - -> Foreign Scan on fpagg_tab_p3 pagg_tab_3 -(9 rows) + QUERY PLAN +----------------------------------------------------- + GroupAggregate + Group Key: pagg_tab.a + Filter: (avg(pagg_tab.b) < '22'::numeric) + -> Append + -> Foreign Scan on fpagg_tab_p1 pagg_tab_1 + -> Foreign Scan on fpagg_tab_p2 pagg_tab_2 + -> Foreign Scan on fpagg_tab_p3 pagg_tab_3 +(7 rows) -- Plan with partitionwise aggregates is enabled SET enable_partitionwise_aggregate TO true; @@ -9765,34 +10236,32 @@ SELECT a, sum(b), min(b), count(*) FROM pagg_tab GROUP BY a HAVING avg(b) < 22 O -- Should have all the columns in the target list for the given relation EXPLAIN (VERBOSE, COSTS OFF) SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1; - QUERY PLAN ------------------------------------------------------------------------- - Sort - Output: t1.a, (count(((t1.*)::pagg_tab))) + QUERY PLAN +-------------------------------------------------------------------------------------------- + Merge Append Sort Key: t1.a - -> Append - -> HashAggregate - Output: t1.a, count(((t1.*)::pagg_tab)) - Group Key: t1.a - Filter: (avg(t1.b) < '22'::numeric) - -> Foreign Scan on public.fpagg_tab_p1 t1 - Output: t1.a, t1.*, t1.b - Remote SQL: SELECT a, b, c FROM public.pagg_tab_p1 - -> HashAggregate - Output: t1_1.a, count(((t1_1.*)::pagg_tab)) - Group Key: t1_1.a - Filter: (avg(t1_1.b) < '22'::numeric) - -> Foreign Scan on public.fpagg_tab_p2 t1_1 - Output: t1_1.a, t1_1.*, t1_1.b - Remote SQL: SELECT a, b, c FROM public.pagg_tab_p2 - -> HashAggregate - Output: t1_2.a, count(((t1_2.*)::pagg_tab)) - Group Key: t1_2.a - Filter: (avg(t1_2.b) < '22'::numeric) - -> Foreign Scan on public.fpagg_tab_p3 t1_2 - Output: t1_2.a, t1_2.*, t1_2.b - Remote SQL: SELECT a, b, c FROM public.pagg_tab_p3 -(25 rows) + -> GroupAggregate + Output: t1.a, count(((t1.*)::pagg_tab)) + Group Key: t1.a + Filter: (avg(t1.b) < '22'::numeric) + -> Foreign Scan on public.fpagg_tab_p1 t1 + Output: t1.a, t1.*, t1.b + Remote SQL: SELECT a, b, c FROM public.pagg_tab_p1 ORDER BY a ASC NULLS LAST + -> GroupAggregate + Output: t1_1.a, count(((t1_1.*)::pagg_tab)) + Group Key: t1_1.a + Filter: (avg(t1_1.b) < '22'::numeric) + -> Foreign Scan on public.fpagg_tab_p2 t1_1 + Output: t1_1.a, t1_1.*, t1_1.b + Remote SQL: SELECT a, b, c FROM public.pagg_tab_p2 ORDER BY a ASC NULLS LAST + -> GroupAggregate + Output: t1_2.a, count(((t1_2.*)::pagg_tab)) + Group Key: t1_2.a + Filter: (avg(t1_2.b) < '22'::numeric) + -> Foreign Scan on public.fpagg_tab_p3 t1_2 + Output: t1_2.a, t1_2.*, t1_2.b + Remote SQL: SELECT a, b, c FROM public.pagg_tab_p3 ORDER BY a ASC NULLS LAST +(23 rows) SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1; a | count @@ -9808,24 +10277,23 @@ SELECT a, count(t1) FROM pagg_tab t1 GROUP BY a HAVING avg(b) < 22 ORDER BY 1; -- When GROUP BY clause does not match with PARTITION KEY. EXPLAIN (COSTS OFF) SELECT b, avg(a), max(a), count(*) FROM pagg_tab GROUP BY b HAVING sum(a) < 700 ORDER BY 1; - QUERY PLAN ------------------------------------------------------------------ - Sort - Sort Key: pagg_tab.b - -> Finalize HashAggregate - Group Key: pagg_tab.b - Filter: (sum(pagg_tab.a) < 700) - -> Append - -> Partial HashAggregate - Group Key: pagg_tab.b - -> Foreign Scan on fpagg_tab_p1 pagg_tab - -> Partial HashAggregate - Group Key: pagg_tab_1.b - -> Foreign Scan on fpagg_tab_p2 pagg_tab_1 - -> Partial HashAggregate - Group Key: pagg_tab_2.b - -> Foreign Scan on fpagg_tab_p3 pagg_tab_2 -(15 rows) + QUERY PLAN +----------------------------------------------------------- + Finalize GroupAggregate + Group Key: pagg_tab.b + Filter: (sum(pagg_tab.a) < 700) + -> Merge Append + Sort Key: pagg_tab.b + -> Partial GroupAggregate + Group Key: pagg_tab.b + -> Foreign Scan on fpagg_tab_p1 pagg_tab + -> Partial GroupAggregate + Group Key: pagg_tab_1.b + -> Foreign Scan on fpagg_tab_p2 pagg_tab_1 + -> Partial GroupAggregate + Group Key: pagg_tab_2.b + -> Foreign Scan on fpagg_tab_p3 pagg_tab_2 +(14 rows) -- =================================================================== -- access rights and superuser @@ -10304,17 +10772,6 @@ SELECT COUNT(*) FROM ftable; 34 (1 row) -TRUNCATE batch_table; -DROP FOREIGN TABLE ftable; --- try if large batches exceed max number of bind parameters -CREATE FOREIGN TABLE ftable ( x int ) SERVER loopback OPTIONS ( table_name 'batch_table', batch_size '100000' ); -INSERT INTO ftable SELECT * FROM generate_series(1, 70000) i; -SELECT COUNT(*) FROM ftable; - count -------- - 70000 -(1 row) - TRUNCATE batch_table; DROP FOREIGN TABLE ftable; -- Disable batch insert @@ -10768,6 +11225,13 @@ SELECT * FROM result_tbl ORDER BY a; (2 rows) DELETE FROM result_tbl; +-- Test error handling, if accessing one of the foreign partitions errors out +CREATE FOREIGN TABLE async_p_broken PARTITION OF async_pt FOR VALUES FROM (10000) TO (10001) + SERVER loopback OPTIONS (table_name 'non_existent_table'); +SELECT * FROM async_pt; +ERROR: relation "public.non_existent_table" does not exist +CONTEXT: remote SQL command: SELECT a, b, c FROM public.non_existent_table +DROP FOREIGN TABLE async_p_broken; -- Check case where multiple partitions use the same connection CREATE TABLE base_tbl3 (a int, b int, c text); CREATE FOREIGN TABLE async_p3 PARTITION OF async_pt FOR VALUES FROM (3000) TO (4000) @@ -11146,6 +11610,10 @@ DROP INDEX base_tbl1_idx; DROP INDEX base_tbl2_idx; DROP INDEX async_p3_idx; -- UNION queries +SET enable_sort TO off; +SET enable_incremental_sort TO off; +-- Adjust fdw_startup_cost so that we get an unordered path in the Append. +ALTER SERVER loopback2 OPTIONS (ADD fdw_startup_cost '0.00'); EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO result_tbl (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10) @@ -11227,6 +11695,9 @@ SELECT * FROM result_tbl ORDER BY a; (12 rows) DELETE FROM result_tbl; +RESET enable_incremental_sort; +RESET enable_sort; +ALTER SERVER loopback2 OPTIONS (DROP fdw_startup_cost); -- Disable async execution if we use gating Result nodes for pseudoconstant -- quals EXPLAIN (VERBOSE, COSTS OFF) @@ -11336,9 +11807,9 @@ SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt W QUERY PLAN ---------------------------------------------------------------------------------------- Nested Loop Left Join - Output: t1.a, t1.b, t1.c, async_pt.a, async_pt.b, async_pt.c, ($0) + Output: t1.a, t1.b, t1.c, async_pt.a, async_pt.b, async_pt.c, ((InitPlan 1).col1) Join Filter: (t1.a = async_pt.a) - InitPlan 1 (returns $0) + InitPlan 1 -> Aggregate Output: count(*) -> Append @@ -11350,10 +11821,10 @@ SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt W Output: t1.a, t1.b, t1.c -> Append -> Async Foreign Scan on public.async_p1 async_pt_1 - Output: async_pt_1.a, async_pt_1.b, async_pt_1.c, $0 + Output: async_pt_1.a, async_pt_1.b, async_pt_1.c, (InitPlan 1).col1 Remote SQL: SELECT a, b, c FROM public.base_tbl1 WHERE ((a < 3000)) -> Async Foreign Scan on public.async_p2 async_pt_2 - Output: async_pt_2.a, async_pt_2.b, async_pt_2.c, $0 + Output: async_pt_2.a, async_pt_2.b, async_pt_2.c, (InitPlan 1).col1 Remote SQL: SELECT a, b, c FROM public.base_tbl2 WHERE ((a < 3000)) (20 rows) @@ -11364,7 +11835,7 @@ SELECT * FROM local_tbl t1 LEFT JOIN (SELECT *, (SELECT count(*) FROM async_pt W Nested Loop Left Join (actual rows=1 loops=1) Join Filter: (t1.a = async_pt.a) Rows Removed by Join Filter: 399 - InitPlan 1 (returns $0) + InitPlan 1 -> Aggregate (actual rows=1 loops=1) -> Append (actual rows=400 loops=1) -> Async Foreign Scan on async_p1 async_pt_4 (actual rows=200 loops=1) @@ -11586,15 +12057,15 @@ CREATE FOREIGN TABLE foreign_tbl (b int) CREATE FOREIGN TABLE foreign_tbl2 () INHERITS (foreign_tbl) SERVER loopback OPTIONS (table_name 'base_tbl'); EXPLAIN (VERBOSE, COSTS OFF) -SELECT a FROM base_tbl WHERE a IN (SELECT a FROM foreign_tbl); - QUERY PLAN ------------------------------------------------------------------------------ +SELECT a FROM base_tbl WHERE (a, random() > 0) IN (SELECT a, random() > 0 FROM foreign_tbl); + QUERY PLAN +--------------------------------------------------------------------------------------------------------------- Seq Scan on public.base_tbl Output: base_tbl.a - Filter: (SubPlan 1) + Filter: (ANY ((base_tbl.a = (SubPlan 1).col1) AND ((random() > '0'::double precision) = (SubPlan 1).col2))) SubPlan 1 -> Result - Output: base_tbl.a + Output: base_tbl.a, (random() > '0'::double precision) -> Append -> Async Foreign Scan on public.foreign_tbl foreign_tbl_1 Remote SQL: SELECT NULL FROM public.base_tbl @@ -11602,7 +12073,7 @@ SELECT a FROM base_tbl WHERE a IN (SELECT a FROM foreign_tbl); Remote SQL: SELECT NULL FROM public.base_tbl (11 rows) -SELECT a FROM base_tbl WHERE a IN (SELECT a FROM foreign_tbl); +SELECT a FROM base_tbl WHERE (a, random() > 0) IN (SELECT a, random() > 0 FROM foreign_tbl); a --- 1 diff --git a/contrib/postgres_fdw/expected/query_cancel.out b/contrib/postgres_fdw/expected/query_cancel.out new file mode 100644 index 0000000000000..c3fc585d49f81 --- /dev/null +++ b/contrib/postgres_fdw/expected/query_cancel.out @@ -0,0 +1,34 @@ +SELECT version() ~ 'cygwin' AS skip_test \gset +\if :skip_test +\quit +\endif +-- Let's test canceling a remote query. Use a table that does not have +-- remote_estimate enabled, else there will be multiple queries to the +-- remote and we might unluckily send the cancel in between two of them. +-- First let's confirm that the query is actually pushed down. +EXPLAIN (VERBOSE, COSTS OFF) +SELECT count(*) FROM ft1 a CROSS JOIN ft1 b CROSS JOIN ft1 c CROSS JOIN ft1 d; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Foreign Scan + Output: (count(*)) + Relations: Aggregate on ((((public.ft1 a) INNER JOIN (public.ft1 b)) INNER JOIN (public.ft1 c)) INNER JOIN (public.ft1 d)) + Remote SQL: SELECT count(*) FROM ((("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (TRUE)) INNER JOIN "S 1"."T 1" r4 ON (TRUE)) INNER JOIN "S 1"."T 1" r6 ON (TRUE)) +(4 rows) + +BEGIN; +-- Make sure that connection is open and set up. +SELECT count(*) FROM ft1 a; + count +------- + 822 +(1 row) + +-- On most machines, 10ms will be enough to be sure that we've sent the slow +-- query. We may sometimes exercise the race condition where we send cancel +-- before the remote side starts the query, but that's fine too. +SET LOCAL statement_timeout = '10ms'; +-- This would take very long if not canceled: +SELECT count(*) FROM ft1 a CROSS JOIN ft1 b CROSS JOIN ft1 c CROSS JOIN ft1 d; +ERROR: canceling statement due to statement timeout +COMMIT; diff --git a/contrib/postgres_fdw/expected/query_cancel_1.out b/contrib/postgres_fdw/expected/query_cancel_1.out new file mode 100644 index 0000000000000..c909f2917dacd --- /dev/null +++ b/contrib/postgres_fdw/expected/query_cancel_1.out @@ -0,0 +1,3 @@ +SELECT version() ~ 'cygwin' AS skip_test \gset +\if :skip_test +\quit diff --git a/contrib/postgres_fdw/meson.build b/contrib/postgres_fdw/meson.build index 2b451f165e18b..f0803ee077ee6 100644 --- a/contrib/postgres_fdw/meson.build +++ b/contrib/postgres_fdw/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group postgres_fdw_sources = files( 'connection.c', @@ -36,6 +36,7 @@ tests += { 'regress': { 'sql': [ 'postgres_fdw', + 'query_cancel', ], 'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'], }, diff --git a/contrib/postgres_fdw/option.c b/contrib/postgres_fdw/option.c index 8c822f4ef909c..d740893918c24 100644 --- a/contrib/postgres_fdw/option.c +++ b/contrib/postgres_fdw/option.c @@ -3,7 +3,7 @@ * option.c * FDW and GUC option handling for postgres_fdw * - * Portions Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/postgres_fdw/option.c @@ -522,7 +522,7 @@ process_pgfdw_appname(const char *appname) appendStringInfoString(&buf, application_name); break; case 'c': - appendStringInfo(&buf, "%lx.%x", (long) (MyStartTime), MyProcPid); + appendStringInfo(&buf, "%" INT64_MODIFIER "x.%x", MyStartTime, MyProcPid); break; case 'C': appendStringInfoString(&buf, cluster_name); diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c index c5cada55fb732..7c4b91e01fd72 100644 --- a/contrib/postgres_fdw/postgres_fdw.c +++ b/contrib/postgres_fdw/postgres_fdw.c @@ -3,7 +3,7 @@ * postgres_fdw.c * Foreign-data wrapper for remote PostgreSQL servers * - * Portions Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/postgres_fdw/postgres_fdw.c @@ -57,7 +57,7 @@ PG_MODULE_MAGIC; #define DEFAULT_FDW_STARTUP_COST 100.0 /* Default CPU cost to process 1 row (above and beyond cpu_tuple_cost). */ -#define DEFAULT_FDW_TUPLE_COST 0.01 +#define DEFAULT_FDW_TUPLE_COST 0.2 /* If no remote estimates, assume a sort costs 20% extra */ #define DEFAULT_FDW_SORT_MULTIPLIER 1.2 @@ -82,7 +82,7 @@ enum FdwScanPrivateIndex * String describing join i.e. names of relations being joined and types * of join, added when the scan is join */ - FdwScanPrivateRelations + FdwScanPrivateRelations, }; /* @@ -108,7 +108,7 @@ enum FdwModifyPrivateIndex /* has-returning flag (as a Boolean node) */ FdwModifyPrivateHasReturning, /* Integer list of attribute numbers retrieved by RETURNING */ - FdwModifyPrivateRetrievedAttrs + FdwModifyPrivateRetrievedAttrs, }; /* @@ -129,7 +129,7 @@ enum FdwDirectModifyPrivateIndex /* Integer list of attribute numbers retrieved by RETURNING */ FdwDirectModifyPrivateRetrievedAttrs, /* set-processed flag (as a Boolean node) */ - FdwDirectModifyPrivateSetProcessed + FdwDirectModifyPrivateSetProcessed, }; /* @@ -285,7 +285,7 @@ enum FdwPathPrivateIndex /* has-final-sort flag (as a Boolean node) */ FdwPathPrivateHasFinalSort, /* has-limit flag (as a Boolean node) */ - FdwPathPrivateHasLimit + FdwPathPrivateHasLimit, }; /* Struct for extra information passed to estimate_path_cost_size() */ @@ -524,7 +524,7 @@ static List *get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel); static List *get_useful_ecs_for_relation(PlannerInfo *root, RelOptInfo *rel); static void add_paths_with_pathkeys_for_rel(PlannerInfo *root, RelOptInfo *rel, - Path *epq_path); + Path *epq_path, List *restrictlist); static void add_foreign_grouping_paths(PlannerInfo *root, RelOptInfo *input_rel, RelOptInfo *grouped_rel, @@ -779,6 +779,7 @@ postgresGetForeignRelSize(PlannerInfo *root, fpinfo->make_outerrel_subquery = false; fpinfo->make_innerrel_subquery = false; fpinfo->lower_subquery_rels = NULL; + fpinfo->hidden_subquery_rels = NULL; /* Set the relation index. */ fpinfo->relation_index = baserel->relid; } @@ -1034,11 +1035,12 @@ postgresGetForeignPaths(PlannerInfo *root, NIL, /* no pathkeys */ baserel->lateral_relids, NULL, /* no extra plan */ + NIL, /* no fdw_restrictinfo list */ NIL); /* no fdw_private list */ add_path(baserel, (Path *) path); /* Add paths with pathkeys */ - add_paths_with_pathkeys_for_rel(root, baserel, NULL); + add_paths_with_pathkeys_for_rel(root, baserel, NULL, NIL); /* * If we're not using remote estimates, stop here. We have no way to @@ -1206,6 +1208,7 @@ postgresGetForeignPaths(PlannerInfo *root, NIL, /* no pathkeys */ param_info->ppi_req_outer, NULL, + NIL, /* no fdw_restrictinfo list */ NIL); /* no fdw_private list */ add_path(baserel, (Path *) path); } @@ -1659,9 +1662,12 @@ postgresReScanForeignScan(ForeignScanState *node) /* * If any internal parameters affecting this node have changed, we'd - * better destroy and recreate the cursor. Otherwise, rewinding it should - * be good enough. If we've only fetched zero or one batch, we needn't - * even rewind the cursor, just rescan what we have. + * better destroy and recreate the cursor. Otherwise, if the remote + * server is v14 or older, rewinding it should be good enough; if not, + * rewind is only allowed for scrollable cursors, but we don't have a way + * to check the scrollability of it, so destroy and recreate it in any + * case. If we've only fetched zero or one batch, we needn't even rewind + * the cursor, just rescan what we have. */ if (node->ss.ps.chgParam != NULL) { @@ -1671,8 +1677,15 @@ postgresReScanForeignScan(ForeignScanState *node) } else if (fsstate->fetch_ct_2 > 1) { - snprintf(sql, sizeof(sql), "MOVE BACKWARD ALL IN c%u", - fsstate->cursor_number); + if (PQserverVersion(fsstate->conn) < 150000) + snprintf(sql, sizeof(sql), "MOVE BACKWARD ALL IN c%u", + fsstate->cursor_number); + else + { + fsstate->cursor_exists = false; + snprintf(sql, sizeof(sql), "CLOSE c%u", + fsstate->cursor_number); + } } else { @@ -3757,7 +3770,7 @@ create_cursor(ForeignScanState *node) * We don't use a PG_TRY block here, so be careful not to throw error * without releasing the PGresult. */ - res = pgfdw_get_result(conn, buf.data); + res = pgfdw_get_result(conn); if (PQresultStatus(res) != PGRES_COMMAND_OK) pgfdw_report_error(ERROR, res, conn, true, fsstate->query); PQclear(res); @@ -3807,7 +3820,7 @@ fetch_more_data(ForeignScanState *node) * The query was already sent by an earlier call to * fetch_more_data_begin. So now we just fetch the result. */ - res = pgfdw_get_result(conn, fsstate->query); + res = pgfdw_get_result(conn); /* On error, report the original query, not the FETCH. */ if (PQresultStatus(res) != PGRES_TUPLES_OK) pgfdw_report_error(ERROR, res, conn, false, fsstate->query); @@ -4156,7 +4169,7 @@ execute_foreign_modify(EState *estate, * We don't use a PG_TRY block here, so be careful not to throw error * without releasing the PGresult. */ - res = pgfdw_get_result(fmstate->conn, fmstate->query); + res = pgfdw_get_result(fmstate->conn); if (PQresultStatus(res) != (fmstate->has_returning ? PGRES_TUPLES_OK : PGRES_COMMAND_OK)) pgfdw_report_error(ERROR, res, fmstate->conn, true, fmstate->query); @@ -4226,7 +4239,7 @@ prepare_foreign_modify(PgFdwModifyState *fmstate) * We don't use a PG_TRY block here, so be careful not to throw error * without releasing the PGresult. */ - res = pgfdw_get_result(fmstate->conn, fmstate->query); + res = pgfdw_get_result(fmstate->conn); if (PQresultStatus(res) != PGRES_COMMAND_OK) pgfdw_report_error(ERROR, res, fmstate->conn, true, fmstate->query); PQclear(res); @@ -4568,7 +4581,7 @@ execute_dml_stmt(ForeignScanState *node) * We don't use a PG_TRY block here, so be careful not to throw error * without releasing the PGresult. */ - dmstate->result = pgfdw_get_result(dmstate->conn, dmstate->query); + dmstate->result = pgfdw_get_result(dmstate->conn); if (PQresultStatus(dmstate->result) != (dmstate->has_returning ? PGRES_TUPLES_OK : PGRES_COMMAND_OK)) pgfdw_report_error(ERROR, dmstate->result, dmstate->conn, true, @@ -5722,6 +5735,45 @@ postgresImportForeignSchema(ImportForeignSchemaStmt *stmt, Oid serverOid) return commands; } +/* + * Check if reltarget is safe enough to push down semi-join. Reltarget is not + * safe, if it contains references to inner rel relids, which do not belong to + * outer rel. + */ +static bool +semijoin_target_ok(PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, RelOptInfo *innerrel) +{ + List *vars; + ListCell *lc; + bool ok = true; + + Assert(joinrel->reltarget); + + vars = pull_var_clause((Node *) joinrel->reltarget->exprs, PVC_INCLUDE_PLACEHOLDERS); + + foreach(lc, vars) + { + Var *var = (Var *) lfirst(lc); + + if (!IsA(var, Var)) + continue; + + if (bms_is_member(var->varno, innerrel->relids)) + { + /* + * The planner can create semi-join, which refers to inner rel + * vars in its target list. However, we deparse semi-join as an + * exists() subquery, so can't handle references to inner rel in + * the target list. + */ + Assert(!bms_is_member(var->varno, outerrel->relids)); + ok = false; + break; + } + } + return ok; +} + /* * Assess whether the join between inner and outer relations can be pushed down * to the foreign server. As a side effect, save information we obtain in this @@ -5739,12 +5791,19 @@ foreign_join_ok(PlannerInfo *root, RelOptInfo *joinrel, JoinType jointype, List *joinclauses; /* - * We support pushing down INNER, LEFT, RIGHT and FULL OUTER joins. - * Constructing queries representing SEMI and ANTI joins is hard, hence - * not considered right now. + * We support pushing down INNER, LEFT, RIGHT, FULL OUTER and SEMI joins. + * Constructing queries representing ANTI joins is hard, hence not + * considered right now. */ if (jointype != JOIN_INNER && jointype != JOIN_LEFT && - jointype != JOIN_RIGHT && jointype != JOIN_FULL) + jointype != JOIN_RIGHT && jointype != JOIN_FULL && + jointype != JOIN_SEMI) + return false; + + /* + * We can't push down semi-join if its reltarget is not safe + */ + if ((jointype == JOIN_SEMI) && !semijoin_target_ok(root, joinrel, outerrel, innerrel)) return false; /* @@ -5856,6 +5915,8 @@ foreign_join_ok(PlannerInfo *root, RelOptInfo *joinrel, JoinType jointype, Assert(bms_is_subset(fpinfo_i->lower_subquery_rels, innerrel->relids)); fpinfo->lower_subquery_rels = bms_union(fpinfo_o->lower_subquery_rels, fpinfo_i->lower_subquery_rels); + fpinfo->hidden_subquery_rels = bms_union(fpinfo_o->hidden_subquery_rels, + fpinfo_i->hidden_subquery_rels); /* * Pull the other remote conditions from the joining relations into join @@ -5869,6 +5930,12 @@ foreign_join_ok(PlannerInfo *root, RelOptInfo *joinrel, JoinType jointype, * the joinclauses, since they need to be evaluated while constructing the * join. * + * For SEMI-JOIN clauses from inner relation can not be added to + * remote_conds, but should be treated as join clauses (as they are + * deparsed to EXISTS subquery, where inner relation can be referred). A + * list of relation ids, which can't be referred to from higher levels, is + * preserved as a hidden_subquery_rels list. + * * For a FULL OUTER JOIN, the other clauses from either relation can not * be added to the joinclauses or remote_conds, since each relation acts * as an outer relation for the other. @@ -5886,17 +5953,43 @@ foreign_join_ok(PlannerInfo *root, RelOptInfo *joinrel, JoinType jointype, break; case JOIN_LEFT: - fpinfo->joinclauses = list_concat(fpinfo->joinclauses, - fpinfo_i->remote_conds); - fpinfo->remote_conds = list_concat(fpinfo->remote_conds, - fpinfo_o->remote_conds); + + /* + * When semi-join is involved in the inner or outer part of the + * left join, it's deparsed as a subquery, and we can't refer to + * its vars on the upper level. + */ + if (bms_is_empty(fpinfo_i->hidden_subquery_rels)) + fpinfo->joinclauses = list_concat(fpinfo->joinclauses, + fpinfo_i->remote_conds); + if (bms_is_empty(fpinfo_o->hidden_subquery_rels)) + fpinfo->remote_conds = list_concat(fpinfo->remote_conds, + fpinfo_o->remote_conds); break; case JOIN_RIGHT: + + /* + * When semi-join is involved in the inner or outer part of the + * right join, it's deparsed as a subquery, and we can't refer to + * its vars on the upper level. + */ + if (bms_is_empty(fpinfo_o->hidden_subquery_rels)) + fpinfo->joinclauses = list_concat(fpinfo->joinclauses, + fpinfo_o->remote_conds); + if (bms_is_empty(fpinfo_i->hidden_subquery_rels)) + fpinfo->remote_conds = list_concat(fpinfo->remote_conds, + fpinfo_i->remote_conds); + break; + + case JOIN_SEMI: fpinfo->joinclauses = list_concat(fpinfo->joinclauses, - fpinfo_o->remote_conds); - fpinfo->remote_conds = list_concat(fpinfo->remote_conds, - fpinfo_i->remote_conds); + fpinfo_i->remote_conds); + fpinfo->joinclauses = list_concat(fpinfo->joinclauses, + fpinfo->remote_conds); + fpinfo->remote_conds = list_copy(fpinfo_o->remote_conds); + fpinfo->hidden_subquery_rels = bms_union(fpinfo->hidden_subquery_rels, + innerrel->relids); break; case JOIN_FULL: @@ -5941,6 +6034,24 @@ foreign_join_ok(PlannerInfo *root, RelOptInfo *joinrel, JoinType jointype, fpinfo->joinclauses = fpinfo->remote_conds; fpinfo->remote_conds = NIL; } + else if (jointype == JOIN_LEFT || jointype == JOIN_RIGHT || jointype == JOIN_FULL) + { + /* + * Conditions, generated from semi-joins, should be evaluated before + * LEFT/RIGHT/FULL join. + */ + if (!bms_is_empty(fpinfo_o->hidden_subquery_rels)) + { + fpinfo->make_outerrel_subquery = true; + fpinfo->lower_subquery_rels = bms_add_members(fpinfo->lower_subquery_rels, outerrel->relids); + } + + if (!bms_is_empty(fpinfo_i->hidden_subquery_rels)) + { + fpinfo->make_innerrel_subquery = true; + fpinfo->lower_subquery_rels = bms_add_members(fpinfo->lower_subquery_rels, innerrel->relids); + } + } /* Mark that this join can be pushed down safely */ fpinfo->pushdown_safe = true; @@ -5991,7 +6102,7 @@ foreign_join_ok(PlannerInfo *root, RelOptInfo *joinrel, JoinType jointype, static void add_paths_with_pathkeys_for_rel(PlannerInfo *root, RelOptInfo *rel, - Path *epq_path) + Path *epq_path, List *restrictlist) { List *useful_pathkeys_list = NIL; /* List of all pathkeys */ ListCell *lc; @@ -6085,6 +6196,8 @@ add_paths_with_pathkeys_for_rel(PlannerInfo *root, RelOptInfo *rel, useful_pathkeys, rel->lateral_relids, sorted_epq_path, + NIL, /* no fdw_restrictinfo + * list */ NIL)); else add_path(rel, (Path *) @@ -6096,6 +6209,7 @@ add_paths_with_pathkeys_for_rel(PlannerInfo *root, RelOptInfo *rel, useful_pathkeys, rel->lateral_relids, sorted_epq_path, + restrictlist, NIL)); } } @@ -6348,13 +6462,15 @@ postgresGetForeignJoinPaths(PlannerInfo *root, NIL, /* no pathkeys */ joinrel->lateral_relids, epq_path, + extra->restrictlist, NIL); /* no fdw_private */ /* Add generated path into joinrel by add_path(). */ add_path(joinrel, (Path *) joinpath); /* Consider pathkeys for the join relation */ - add_paths_with_pathkeys_for_rel(root, joinrel, epq_path); + add_paths_with_pathkeys_for_rel(root, joinrel, epq_path, + extra->restrictlist); /* XXX Consider parameterized paths for the join relation */ } @@ -6735,6 +6851,7 @@ add_foreign_grouping_paths(PlannerInfo *root, RelOptInfo *input_rel, total_cost, NIL, /* no pathkeys */ NULL, + NIL, /* no fdw_restrictinfo list */ NIL); /* no fdw_private */ /* Add generated path into grouped_rel by add_path(). */ @@ -6868,6 +6985,8 @@ add_foreign_ordered_paths(PlannerInfo *root, RelOptInfo *input_rel, total_cost, root->sort_pathkeys, NULL, /* no extra plan */ + NIL, /* no fdw_restrictinfo + * list */ fdw_private); /* and add it to the ordered_rel */ @@ -6983,7 +7102,9 @@ add_foreign_final_paths(PlannerInfo *root, RelOptInfo *input_rel, path->total_cost, path->pathkeys, NULL, /* no extra plan */ - NULL); /* no fdw_private */ + NIL, /* no fdw_restrictinfo + * list */ + NIL); /* no fdw_private */ /* and add it to the final_rel */ add_path(final_rel, (Path *) final_path); @@ -7045,6 +7166,20 @@ add_foreign_final_paths(PlannerInfo *root, RelOptInfo *input_rel, if (ifpinfo->local_conds) return; + /* + * If the query has FETCH FIRST .. WITH TIES, 1) it must have ORDER BY as + * well, which is used to determine which additional rows tie for the last + * place in the result set, and 2) ORDER BY must already have been + * determined to be safe to push down before we get here. So in that case + * the FETCH clause is safe to push down with ORDER BY if the remote + * server is v13 or later, but if not, the remote query will fail entirely + * for lack of support for it. Since we do not currently have a way to do + * a remote-version check (without accessing the remote server), disable + * pushing the FETCH clause for now. + */ + if (parse->limitOption == LIMIT_OPTION_WITH_TIES) + return; + /* * Also, the LIMIT/OFFSET cannot be pushed down, if their expressions are * not safe to remote. @@ -7103,6 +7238,7 @@ add_foreign_final_paths(PlannerInfo *root, RelOptInfo *input_rel, total_cost, pathkeys, NULL, /* no extra plan */ + NIL, /* no fdw_restrictinfo list */ fdw_private); /* and add it to the final_rel */ @@ -7174,14 +7310,16 @@ postgresForeignAsyncConfigureWait(AsyncRequest *areq) { /* * This is the case when the in-process request was made by another - * Append. Note that it might be useless to process the request, - * because the query might not need tuples from that Append anymore. - * If there are any child subplans of the same parent that are ready - * for new requests, skip the given request. Likewise, if there are - * any configured events other than the postmaster death event, skip - * it. Otherwise, process the in-process request, then begin a fetch - * to configure the event below, because we might otherwise end up - * with no configured events other than the postmaster death event. + * Append. Note that it might be useless to process the request made + * by that Append, because the query might not need tuples from that + * Append anymore; so we avoid processing it to begin a fetch for the + * given request if possible. If there are any child subplans of the + * same parent that are ready for new requests, skip the given + * request. Likewise, if there are any configured events other than + * the postmaster death event, skip it. Otherwise, process the + * in-process request, then begin a fetch to configure the event + * below, because we might otherwise end up with no configured events + * other than the postmaster death event. */ if (!bms_is_empty(requestor->as_needrequest)) return; @@ -7679,6 +7817,8 @@ find_em_for_rel(PlannerInfo *root, EquivalenceClass *ec, RelOptInfo *rel) { ListCell *lc; + PgFdwRelationInfo *fpinfo = (PgFdwRelationInfo *) rel->fdw_private; + foreach(lc, ec->ec_members) { EquivalenceMember *em = (EquivalenceMember *) lfirst(lc); @@ -7689,6 +7829,7 @@ find_em_for_rel(PlannerInfo *root, EquivalenceClass *ec, RelOptInfo *rel) */ if (bms_is_subset(em->em_relids, rel->relids) && !bms_is_empty(em->em_relids) && + bms_is_empty(bms_intersect(em->em_relids, fpinfo->hidden_subquery_rels)) && is_foreign_expr(root, rel, em->em_expr)) return em; } diff --git a/contrib/postgres_fdw/postgres_fdw.h b/contrib/postgres_fdw/postgres_fdw.h index 02c11523199e7..37c1575af6c21 100644 --- a/contrib/postgres_fdw/postgres_fdw.h +++ b/contrib/postgres_fdw/postgres_fdw.h @@ -3,7 +3,7 @@ * postgres_fdw.h * Foreign-data wrapper for remote PostgreSQL servers * - * Portions Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/postgres_fdw/postgres_fdw.h @@ -118,6 +118,10 @@ typedef struct PgFdwRelationInfo * subquery? */ Relids lower_subquery_rels; /* all relids appearing in lower * subqueries */ + Relids hidden_subquery_rels; /* relids, which can't be referred to + * from upper relations, used + * internally for equivalence member + * search */ /* * Index of the relation. It is used to create an alias to a subquery @@ -143,7 +147,7 @@ typedef enum PgFdwSamplingMethod ANALYZE_SAMPLE_AUTO, /* choose by server version */ ANALYZE_SAMPLE_RANDOM, /* remote random() */ ANALYZE_SAMPLE_SYSTEM, /* TABLESAMPLE system */ - ANALYZE_SAMPLE_BERNOULLI /* TABLESAMPLE bernoulli */ + ANALYZE_SAMPLE_BERNOULLI, /* TABLESAMPLE bernoulli */ } PgFdwSamplingMethod; /* in postgres_fdw.c */ @@ -158,7 +162,7 @@ extern void ReleaseConnection(PGconn *conn); extern unsigned int GetCursorNumber(PGconn *conn); extern unsigned int GetPrepStmtNumber(PGconn *conn); extern void do_sql_command(PGconn *conn, const char *sql); -extern PGresult *pgfdw_get_result(PGconn *conn, const char *query); +extern PGresult *pgfdw_get_result(PGconn *conn); extern PGresult *pgfdw_exec_query(PGconn *conn, const char *query, PgFdwConnState *state); extern void pgfdw_report_error(int elevel, PGresult *res, PGconn *conn, diff --git a/contrib/postgres_fdw/shippable.c b/contrib/postgres_fdw/shippable.c index 07c11b75e9280..ad91660696803 100644 --- a/contrib/postgres_fdw/shippable.c +++ b/contrib/postgres_fdw/shippable.c @@ -13,7 +13,7 @@ * functions or functions using nonportable collations. Those considerations * need not be accounted for here. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/postgres_fdw/shippable.c diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index b54903ad8fa49..8acfb78f471cb 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -327,13 +327,21 @@ DELETE FROM loct_empty; ANALYZE ft_empty; EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft_empty ORDER BY c1; +-- test restriction on non-system foreign tables. +SET restrict_nonsystem_relation_kind TO 'foreign-table'; +SELECT * from ft1 where c1 < 1; -- ERROR +INSERT INTO ft1 (c1) VALUES (1); -- ERROR +DELETE FROM ft1 WHERE c1 = 1; -- ERROR +TRUNCATE ft1; -- ERROR +RESET restrict_nonsystem_relation_kind; + -- =================================================================== -- WHERE with remotely-executable conditions -- =================================================================== EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 1; -- Var, OpExpr(b), Const EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 = 100 AND t1.c2 = 0; -- BoolExpr -EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 IS NULL; -- NullTest -EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 IS NOT NULL; -- NullTest +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c3 IS NULL; -- NullTest +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c3 IS NOT NULL; -- NullTest EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE round(abs(c1), 0) = 1; -- FuncExpr EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c1 = -c1; -- OpExpr(l) EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE (c1 IS NOT NULL) IS DISTINCT FROM (c1 IS NOT NULL); -- DistinctExpr @@ -344,7 +352,7 @@ EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE c8 = 'foo'; -- can't be -- parameterized remote path for foreign table EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM "S 1"."T 1" a, ft2 b WHERE a."C 1" = 47 AND b.c1 = a.c2; -SELECT * FROM ft2 a, ft2 b WHERE a.c1 = 47 AND b.c1 = a.c2; +SELECT * FROM "S 1"."T 1" a, ft2 b WHERE a."C 1" = 47 AND b.c1 = a.c2; -- check both safe and unsafe join conditions EXPLAIN (VERBOSE, COSTS OFF) @@ -355,12 +363,6 @@ WHERE a.c2 = 6 AND b.c1 = a.c1 AND a.c8 = 'foo' AND b.c7 = upper(a.c7); -- bug before 9.3.5 due to sloppy handling of remote-estimate parameters SELECT * FROM ft1 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft2 WHERE c1 < 5)); SELECT * FROM ft2 WHERE c1 = ANY (ARRAY(SELECT c1 FROM ft1 WHERE c1 < 5)); --- we should not push order by clause with volatile expressions or unsafe --- collations -EXPLAIN (VERBOSE, COSTS OFF) - SELECT * FROM ft2 ORDER BY ft2.c1, random(); -EXPLAIN (VERBOSE, COSTS OFF) - SELECT * FROM ft2 ORDER BY ft2.c1, ft2.c3 collate "C"; -- user-defined operator/function CREATE FUNCTION postgres_fdw_abs(int) RETURNS int AS $$ @@ -414,6 +416,11 @@ EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1; SELECT * FROM ft1 t1 WHERE t1.c1 === t1.c2 order by t1.c2 limit 1; +-- Ensure we don't ship FETCH FIRST .. WITH TIES +EXPLAIN (VERBOSE, COSTS OFF) +SELECT t1.c2 FROM ft1 t1 WHERE t1.c1 > 960 ORDER BY t1.c2 FETCH FIRST 2 ROWS WITH TIES; +SELECT t1.c2 FROM ft1 t1 WHERE t1.c1 > 960 ORDER BY t1.c2 FETCH FIRST 2 ROWS WITH TIES; + -- Test CASE pushdown EXPLAIN (VERBOSE, COSTS OFF) SELECT c1,c2,c3 FROM ft2 WHERE CASE WHEN c1 > 990 THEN c1 END < 1000 ORDER BY c1; @@ -462,6 +469,32 @@ WHERE c1 = 642 AND length(to_tsvector('custom_search'::regconfig, c3)) > 0; SELECT c1, to_tsvector('custom_search'::regconfig, c3) FROM ft1 WHERE c1 = 642 AND length(to_tsvector('custom_search'::regconfig, c3)) > 0; +-- =================================================================== +-- ORDER BY queries +-- =================================================================== +-- we should not push order by clause with volatile expressions or unsafe +-- collations +EXPLAIN (VERBOSE, COSTS OFF) + SELECT * FROM ft2 ORDER BY ft2.c1, random(); +EXPLAIN (VERBOSE, COSTS OFF) + SELECT * FROM ft2 ORDER BY ft2.c1, ft2.c3 collate "C"; + +-- Ensure we don't push ORDER BY expressions which are Consts at the UNION +-- child level to the foreign server. +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM ( + SELECT 1 AS type,c1 FROM ft1 + UNION ALL + SELECT 2 AS type,c1 FROM ft2 +) a ORDER BY type,c1; + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT * FROM ( + SELECT 1 AS type,c1 FROM ft1 + UNION ALL + SELECT 2 AS type,c1 FROM ft2 +) a ORDER BY type; + -- =================================================================== -- JOIN queries -- =================================================================== @@ -600,7 +633,7 @@ WITH t (c1_1, c1_3, c2_1) AS MATERIALIZED (SELECT t1.c1, t1.c3, t2.c1 FROM ft1 t -- ctid with whole-row reference EXPLAIN (VERBOSE, COSTS OFF) SELECT t1.ctid, t1, t2, t1.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10; --- SEMI JOIN, not pushed down +-- SEMI JOIN EXPLAIN (VERBOSE, COSTS OFF) SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10; SELECT t1.c1 FROM ft1 t1 WHERE EXISTS (SELECT 1 FROM ft2 t2 WHERE t1.c1 = t2.c1) ORDER BY t1.c1 OFFSET 100 LIMIT 10; @@ -640,6 +673,9 @@ SELECT t1c1, avg(t1c1 + t2c1) FROM (SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 EXPLAIN (VERBOSE, COSTS OFF) SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM ft1 t2, ft2 t3 WHERE t2.c1 = t3.c1 AND t2.c2 = t1.c2) q ORDER BY t1."C 1" OFFSET 10 LIMIT 10; SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM ft1 t2, ft2 t3 WHERE t2.c1 = t3.c1 AND t2.c2 = t1.c2) q ORDER BY t1."C 1" OFFSET 10 LIMIT 10; +-- join with pseudoconstant quals +EXPLAIN (VERBOSE, COSTS OFF) +SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1 AND CURRENT_USER = SESSION_USER) ORDER BY t1.c3, t1.c1 OFFSET 100 LIMIT 10; -- non-Var items in targetlist of the nullable rel of a join preventing -- push-down in some cases @@ -714,6 +750,29 @@ SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1, t2.c1 OFFSET 10 LIMIT 10; ALTER VIEW v4 OWNER TO regress_view_owner; +-- ==================================================================== +-- Check that userid to use when querying the remote table is correctly +-- propagated into foreign rels present in subqueries under an UNION ALL +-- ==================================================================== +CREATE ROLE regress_view_owner_another; +ALTER VIEW v4 OWNER TO regress_view_owner_another; +GRANT SELECT ON ft4 TO regress_view_owner_another; +ALTER FOREIGN TABLE ft4 OPTIONS (ADD use_remote_estimate 'true'); +-- The following should query the remote backing table of ft4 as user +-- regress_view_owner_another, the view owner, though it fails as expected +-- due to the lack of a user mapping for that user. +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM v4; +-- Likewise, but with the query under an UNION ALL +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM (SELECT * FROM v4 UNION ALL SELECT * FROM v4); +-- Should not get that error once a user mapping is created +CREATE USER MAPPING FOR regress_view_owner_another SERVER loopback OPTIONS (password_required 'false'); +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM v4; +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM (SELECT * FROM v4 UNION ALL SELECT * FROM v4); +DROP USER MAPPING FOR regress_view_owner_another SERVER loopback; +DROP OWNED BY regress_view_owner_another; +DROP ROLE regress_view_owner_another; +ALTER FOREIGN TABLE ft4 OPTIONS (SET use_remote_estimate 'false'); + -- cleanup DROP OWNED BY regress_view_owner; DROP ROLE regress_view_owner; @@ -1096,11 +1155,15 @@ PREPARE st1(int, int) AS SELECT t1.c3, t2.c3 FROM ft1 t1, ft2 t2 WHERE t1.c1 = $ EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st1(1, 2); EXECUTE st1(1, 1); EXECUTE st1(101, 101); +SET enable_hashjoin TO off; +SET enable_sort TO off; -- subquery using stable function (can't be sent to remote) PREPARE st2(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c4) = '1970-01-17'::date) ORDER BY c1; EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st2(10, 20); EXECUTE st2(10, 20); EXECUTE st2(101, 121); +RESET enable_hashjoin; +RESET enable_sort; -- subquery using immutable function (can be sent to remote) PREPARE st3(int) AS SELECT * FROM ft1 t1 WHERE t1.c1 < $2 AND t1.c3 IN (SELECT c3 FROM ft2 t2 WHERE c1 > $1 AND date(c5) = '1970-01-17'::date) ORDER BY c1; EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st3(10, 20); @@ -1275,6 +1338,147 @@ explain (verbose, costs off) select * from ft3 where f2 = 'foo' COLLATE "C"; explain (verbose, costs off) select * from ft3 f, loct3 l where f.f3 = l.f3 COLLATE "POSIX" and l.f1 = 'foo'; +-- =================================================================== +-- test SEMI-JOIN pushdown +-- =================================================================== +EXPLAIN (verbose, costs off) +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN ft4 ON ft2.c2 = ft4.c1 + WHERE ft2.c1 > 900 + AND EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1) + ORDER BY ft2.c1; +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN ft4 ON ft2.c2 = ft4.c1 + WHERE ft2.c1 > 900 + AND EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1) + ORDER BY ft2.c1; + +-- The same query, different join order +EXPLAIN (verbose, costs off) +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN + (SELECT * FROM ft4 WHERE + EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4 + ON ft2.c2 = ft4.c1 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1; +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN + (SELECT * FROM ft4 WHERE + EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4 + ON ft2.c2 = ft4.c1 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1; + +-- Left join +EXPLAIN (verbose, costs off) +SELECT ft2.*, ft4.* FROM ft2 LEFT JOIN + (SELECT * FROM ft4 WHERE + EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4 + ON ft2.c2 = ft4.c1 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; +SELECT ft2.*, ft4.* FROM ft2 LEFT JOIN + (SELECT * FROM ft4 WHERE + EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4 + ON ft2.c2 = ft4.c1 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; + +-- Several semi-joins per upper level join +EXPLAIN (verbose, costs off) +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN + (SELECT * FROM ft4 WHERE + EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4 + ON ft2.c2 = ft4.c1 + INNER JOIN (SELECT * FROM ft5 WHERE + EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft5.c1)) ft5 + ON ft2.c2 <= ft5.c1 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN + (SELECT * FROM ft4 WHERE + EXISTS (SELECT 1 FROM ft5 WHERE ft4.c1 = ft5.c1)) ft4 + ON ft2.c2 = ft4.c1 + INNER JOIN (SELECT * FROM ft5 WHERE + EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft5.c1)) ft5 + ON ft2.c2 <= ft5.c1 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; + +-- Semi-join below Semi-join +EXPLAIN (verbose, costs off) +SELECT ft2.* FROM ft2 WHERE + c1 = ANY ( + SELECT c1 FROM ft2 WHERE + EXISTS (SELECT 1 FROM ft4 WHERE ft4.c2 = ft2.c2)) + AND ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; +SELECT ft2.* FROM ft2 WHERE + c1 = ANY ( + SELECT c1 FROM ft2 WHERE + EXISTS (SELECT 1 FROM ft4 WHERE ft4.c2 = ft2.c2)) + AND ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; + +-- Upper level relations shouldn't refer EXISTS() subqueries +EXPLAIN (verbose, costs off) +SELECT * FROM ft2 ftupper WHERE + EXISTS ( + SELECT c1 FROM ft2 WHERE + EXISTS (SELECT 1 FROM ft4 WHERE ft4.c2 = ft2.c2) AND c1 = ftupper.c1 ) + AND ftupper.c1 > 900 + ORDER BY ftupper.c1 LIMIT 10; +SELECT * FROM ft2 ftupper WHERE + EXISTS ( + SELECT c1 FROM ft2 WHERE + EXISTS (SELECT 1 FROM ft4 WHERE ft4.c2 = ft2.c2) AND c1 = ftupper.c1 ) + AND ftupper.c1 > 900 + ORDER BY ftupper.c1 LIMIT 10; + +-- EXISTS should be propagated to the highest upper inner join +EXPLAIN (verbose, costs off) + SELECT ft2.*, ft4.* FROM ft2 INNER JOIN + (SELECT * FROM ft4 WHERE EXISTS ( + SELECT 1 FROM ft2 WHERE ft2.c2 = ft4.c2)) ft4 + ON ft2.c2 = ft4.c1 + INNER JOIN + (SELECT * FROM ft2 WHERE EXISTS ( + SELECT 1 FROM ft4 WHERE ft2.c2 = ft4.c2)) ft21 + ON ft2.c2 = ft21.c2 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; +SELECT ft2.*, ft4.* FROM ft2 INNER JOIN + (SELECT * FROM ft4 WHERE EXISTS ( + SELECT 1 FROM ft2 WHERE ft2.c2 = ft4.c2)) ft4 + ON ft2.c2 = ft4.c1 + INNER JOIN + (SELECT * FROM ft2 WHERE EXISTS ( + SELECT 1 FROM ft4 WHERE ft2.c2 = ft4.c2)) ft21 + ON ft2.c2 = ft21.c2 + WHERE ft2.c1 > 900 + ORDER BY ft2.c1 LIMIT 10; + +-- Semi-join conditions shouldn't pop up as left/right join clauses. +SET enable_material TO off; +EXPLAIN (verbose, costs off) +SELECT x1.c1 FROM + (SELECT * FROM ft2 WHERE EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft2.c1 AND ft2.c2 < 10)) x1 + RIGHT JOIN + (SELECT * FROM ft2 WHERE EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft2.c1 AND ft2.c2 < 10)) x2 + ON (x1.c1 = x2.c1) +ORDER BY x1.c1 LIMIT 10; +SELECT x1.c1 FROM + (SELECT * FROM ft2 WHERE EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft2.c1 AND ft2.c2 < 10)) x1 + RIGHT JOIN + (SELECT * FROM ft2 WHERE EXISTS (SELECT 1 FROM ft4 WHERE ft4.c1 = ft2.c1 AND ft2.c2 < 10)) x2 + ON (x1.c1 = x2.c1) +ORDER BY x1.c1 LIMIT 10; +RESET enable_material; + +-- Can't push down semi-join with inner rel vars in targetlist +EXPLAIN (verbose, costs off) +SELECT ft1.c1 FROM ft1 JOIN ft2 on ft1.c1 = ft2.c1 WHERE + ft1.c1 IN ( + SELECT ft2.c1 FROM ft2 JOIN ft4 ON ft2.c1 = ft4.c1) + ORDER BY ft1.c1 LIMIT 5; + -- =================================================================== -- test writable foreign table stuff -- =================================================================== @@ -1460,6 +1664,31 @@ SELECT * FROM ft1 ORDER BY c6 DESC NULLS FIRST, c1 OFFSET 15 LIMIT 10; EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10; SELECT * FROM ft1 ORDER BY c6 ASC NULLS FIRST, c1 OFFSET 15 LIMIT 10; +-- Test ReScan code path that recreates the cursor even when no parameters +-- change (bug #17889) +CREATE TABLE loct1 (c1 int); +CREATE TABLE loct2 (c1 int, c2 text); +INSERT INTO loct1 VALUES (1001); +INSERT INTO loct1 VALUES (1002); +INSERT INTO loct2 SELECT id, to_char(id, 'FM0000') FROM generate_series(1, 1000) id; +INSERT INTO loct2 VALUES (1001, 'foo'); +INSERT INTO loct2 VALUES (1002, 'bar'); +CREATE FOREIGN TABLE remt2 (c1 int, c2 text) SERVER loopback OPTIONS (table_name 'loct2'); +ANALYZE loct1; +ANALYZE remt2; +SET enable_mergejoin TO false; +SET enable_hashjoin TO false; +SET enable_material TO false; +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE remt2 SET c2 = remt2.c2 || remt2.c2 FROM loct1 WHERE loct1.c1 = remt2.c1 RETURNING remt2.*; +UPDATE remt2 SET c2 = remt2.c2 || remt2.c2 FROM loct1 WHERE loct1.c1 = remt2.c1 RETURNING remt2.*; +RESET enable_mergejoin; +RESET enable_hashjoin; +RESET enable_material; +DROP FOREIGN TABLE remt2; +DROP TABLE loct1; +DROP TABLE loct2; + -- =================================================================== -- test check constraints -- =================================================================== @@ -3318,13 +3547,6 @@ SELECT COUNT(*) FROM ftable; TRUNCATE batch_table; DROP FOREIGN TABLE ftable; --- try if large batches exceed max number of bind parameters -CREATE FOREIGN TABLE ftable ( x int ) SERVER loopback OPTIONS ( table_name 'batch_table', batch_size '100000' ); -INSERT INTO ftable SELECT * FROM generate_series(1, 70000) i; -SELECT COUNT(*) FROM ftable; -TRUNCATE batch_table; -DROP FOREIGN TABLE ftable; - -- Disable batch insert CREATE FOREIGN TABLE ftable ( x int ) SERVER loopback OPTIONS ( table_name 'batch_table', batch_size '1' ); EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO ftable VALUES (1), (2); @@ -3584,6 +3806,12 @@ INSERT INTO result_tbl SELECT a, b, 'AAA' || c FROM async_pt WHERE b === 505; SELECT * FROM result_tbl ORDER BY a; DELETE FROM result_tbl; +-- Test error handling, if accessing one of the foreign partitions errors out +CREATE FOREIGN TABLE async_p_broken PARTITION OF async_pt FOR VALUES FROM (10000) TO (10001) + SERVER loopback OPTIONS (table_name 'non_existent_table'); +SELECT * FROM async_pt; +DROP FOREIGN TABLE async_p_broken; + -- Check case where multiple partitions use the same connection CREATE TABLE base_tbl3 (a int, b int, c text); CREATE FOREIGN TABLE async_p3 PARTITION OF async_pt FOR VALUES FROM (3000) TO (4000) @@ -3704,6 +3932,11 @@ DROP INDEX base_tbl2_idx; DROP INDEX async_p3_idx; -- UNION queries +SET enable_sort TO off; +SET enable_incremental_sort TO off; +-- Adjust fdw_startup_cost so that we get an unordered path in the Append. +ALTER SERVER loopback2 OPTIONS (ADD fdw_startup_cost '0.00'); + EXPLAIN (VERBOSE, COSTS OFF) INSERT INTO result_tbl (SELECT a, b, 'AAA' || c FROM async_p1 ORDER BY a LIMIT 10) @@ -3730,6 +3963,10 @@ UNION ALL SELECT * FROM result_tbl ORDER BY a; DELETE FROM result_tbl; +RESET enable_incremental_sort; +RESET enable_sort; +ALTER SERVER loopback2 OPTIONS (DROP fdw_startup_cost); + -- Disable async execution if we use gating Result nodes for pseudoconstant -- quals EXPLAIN (VERBOSE, COSTS OFF) @@ -3835,8 +4072,8 @@ CREATE FOREIGN TABLE foreign_tbl2 () INHERITS (foreign_tbl) SERVER loopback OPTIONS (table_name 'base_tbl'); EXPLAIN (VERBOSE, COSTS OFF) -SELECT a FROM base_tbl WHERE a IN (SELECT a FROM foreign_tbl); -SELECT a FROM base_tbl WHERE a IN (SELECT a FROM foreign_tbl); +SELECT a FROM base_tbl WHERE (a, random() > 0) IN (SELECT a, random() > 0 FROM foreign_tbl); +SELECT a FROM base_tbl WHERE (a, random() > 0) IN (SELECT a, random() > 0 FROM foreign_tbl); -- Clean up DROP FOREIGN TABLE foreign_tbl CASCADE; diff --git a/contrib/postgres_fdw/sql/query_cancel.sql b/contrib/postgres_fdw/sql/query_cancel.sql new file mode 100644 index 0000000000000..a68307058436b --- /dev/null +++ b/contrib/postgres_fdw/sql/query_cancel.sql @@ -0,0 +1,22 @@ +SELECT version() ~ 'cygwin' AS skip_test \gset +\if :skip_test +\quit +\endif + +-- Let's test canceling a remote query. Use a table that does not have +-- remote_estimate enabled, else there will be multiple queries to the +-- remote and we might unluckily send the cancel in between two of them. +-- First let's confirm that the query is actually pushed down. +EXPLAIN (VERBOSE, COSTS OFF) +SELECT count(*) FROM ft1 a CROSS JOIN ft1 b CROSS JOIN ft1 c CROSS JOIN ft1 d; + +BEGIN; +-- Make sure that connection is open and set up. +SELECT count(*) FROM ft1 a; +-- On most machines, 10ms will be enough to be sure that we've sent the slow +-- query. We may sometimes exercise the race condition where we send cancel +-- before the remote side starts the query, but that's fine too. +SET LOCAL statement_timeout = '10ms'; +-- This would take very long if not canceled: +SELECT count(*) FROM ft1 a CROSS JOIN ft1 b CROSS JOIN ft1 c CROSS JOIN ft1 d; +COMMIT; diff --git a/contrib/seg/Makefile b/contrib/seg/Makefile index a1e49bf051e3d..b408f4049cbd7 100644 --- a/contrib/seg/Makefile +++ b/contrib/seg/Makefile @@ -14,9 +14,9 @@ PGFILEDESC = "seg - line segment data type" HEADERS = segdata.h -REGRESS = security seg +REGRESS = security seg partition -EXTRA_CLEAN = y.tab.c y.tab.h +EXTRA_CLEAN = segparse.h segparse.c segscan.c ifdef USE_PGXS PG_CONFIG = pg_config @@ -38,8 +38,3 @@ segparse.c: BISONFLAGS += -d # Force these dependencies to be known even without dependency info built: segparse.o segscan.o: segparse.h - -distprep: segparse.c segscan.c - -maintainer-clean: - rm -f segparse.h segparse.c segscan.c diff --git a/contrib/seg/expected/partition.out b/contrib/seg/expected/partition.out new file mode 100644 index 0000000000000..90d8397d5d461 --- /dev/null +++ b/contrib/seg/expected/partition.out @@ -0,0 +1,54 @@ +-- +-- Test that partitioned-index operations cope with objects that are +-- not in the secure search path. (This has little to do with seg, +-- but we need an opclass that isn't in pg_catalog, and the base system +-- has no such opclass.) Note that we need to test propagation of the +-- partitioned index's properties both to partitions that pre-date it +-- and to partitions created later. +-- +create function mydouble(int) returns int strict immutable parallel safe +begin atomic select $1 * 2; end; +create collation mycollation from "POSIX"; +create table pt (category int, sdata seg, tdata text) + partition by list (category); +-- pre-existing partition +create table pt12 partition of pt for values in (1,2); +insert into pt values(1, '0 .. 1'::seg, 'zed'); +-- expression references object in public schema +create index pti1 on pt ((mydouble(category) + 1)); +-- opclass in public schema +create index pti2 on pt (sdata seg_ops); +-- collation in public schema +create index pti3 on pt (tdata collate mycollation); +-- new partition +create table pt34 partition of pt for values in (3,4); +insert into pt values(4, '-1 .. 1'::seg, 'foo'); +\d+ pt + Partitioned table "public.pt" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +----------+---------+-----------+----------+---------+----------+--------------+------------- + category | integer | | | | plain | | + sdata | seg | | | | plain | | + tdata | text | | | | extended | | +Partition key: LIST (category) +Indexes: + "pti1" btree ((mydouble(category) + 1)) + "pti2" btree (sdata) + "pti3" btree (tdata COLLATE mycollation) +Partitions: pt12 FOR VALUES IN (1, 2), + pt34 FOR VALUES IN (3, 4) + +\d+ pt12 + Table "public.pt12" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +----------+---------+-----------+----------+---------+----------+--------------+------------- + category | integer | | | | plain | | + sdata | seg | | | | plain | | + tdata | text | | | | extended | | +Partition of: pt FOR VALUES IN (1, 2) +Partition constraint: ((category IS NOT NULL) AND (category = ANY (ARRAY[1, 2]))) +Indexes: + "pt12_expr_idx" btree ((mydouble(category) + 1)) + "pt12_sdata_idx" btree (sdata) + "pt12_tdata_idx" btree (tdata COLLATE mycollation) + diff --git a/contrib/seg/meson.build b/contrib/seg/meson.build index 0395f7609f0e0..018ba5591ae1e 100644 --- a/contrib/seg/meson.build +++ b/contrib/seg/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group seg_sources = files( 'seg.c', @@ -53,7 +53,9 @@ tests += { 'bd': meson.current_build_dir(), 'regress': { 'sql': [ + 'security', 'seg', + 'partition', ], }, } diff --git a/contrib/seg/seg-validate.pl b/contrib/seg/seg-validate.pl index 67c0015e6bea2..22cbca966d6e0 100755 --- a/contrib/seg/seg-validate.pl +++ b/contrib/seg/seg-validate.pl @@ -1,9 +1,9 @@ #!/usr/bin/perl -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; my $integer = '[+-]?[0-9]+'; my $real = '[+-]?[0-9]+\.[0-9]+'; diff --git a/contrib/seg/segscan.l b/contrib/seg/segscan.l index a1e9e9937ef32..4ad529eccc468 100644 --- a/contrib/seg/segscan.l +++ b/contrib/seg/segscan.l @@ -59,7 +59,7 @@ float ({integer}|{real})([eE]{integer})? \< seg_yylval.text = "<"; return EXTENSION; \> seg_yylval.text = ">"; return EXTENSION; \~ seg_yylval.text = "~"; return EXTENSION; -[ \t\n\r\f]+ /* discard spaces */ +[ \t\n\r\f\v]+ /* discard spaces */ . return yytext[0]; /* alert parser of the garbage */ %% diff --git a/contrib/seg/sort-segments.pl b/contrib/seg/sort-segments.pl index 3cc21a3ba0464..44f203a9a9fef 100755 --- a/contrib/seg/sort-segments.pl +++ b/contrib/seg/sort-segments.pl @@ -1,11 +1,11 @@ #!/usr/bin/perl -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # this script will sort any table with the segment data type in its last column use strict; -use warnings; +use warnings FATAL => 'all'; my @rows; diff --git a/contrib/seg/sql/partition.sql b/contrib/seg/sql/partition.sql new file mode 100644 index 0000000000000..e1febdea87370 --- /dev/null +++ b/contrib/seg/sql/partition.sql @@ -0,0 +1,36 @@ +-- +-- Test that partitioned-index operations cope with objects that are +-- not in the secure search path. (This has little to do with seg, +-- but we need an opclass that isn't in pg_catalog, and the base system +-- has no such opclass.) Note that we need to test propagation of the +-- partitioned index's properties both to partitions that pre-date it +-- and to partitions created later. +-- + +create function mydouble(int) returns int strict immutable parallel safe +begin atomic select $1 * 2; end; + +create collation mycollation from "POSIX"; + +create table pt (category int, sdata seg, tdata text) + partition by list (category); + +-- pre-existing partition +create table pt12 partition of pt for values in (1,2); + +insert into pt values(1, '0 .. 1'::seg, 'zed'); + +-- expression references object in public schema +create index pti1 on pt ((mydouble(category) + 1)); +-- opclass in public schema +create index pti2 on pt (sdata seg_ops); +-- collation in public schema +create index pti3 on pt (tdata collate mycollation); + +-- new partition +create table pt34 partition of pt for values in (3,4); + +insert into pt values(4, '-1 .. 1'::seg, 'foo'); + +\d+ pt +\d+ pt12 diff --git a/contrib/sepgsql/database.c b/contrib/sepgsql/database.c index 4f5662e141e78..eaeb4101bca18 100644 --- a/contrib/sepgsql/database.c +++ b/contrib/sepgsql/database.c @@ -4,7 +4,7 @@ * * Routines corresponding to database objects * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * ------------------------------------------------------------------------- */ diff --git a/contrib/sepgsql/dml.c b/contrib/sepgsql/dml.c index 8c8f6f1e3a115..57e4a84bb0b7d 100644 --- a/contrib/sepgsql/dml.c +++ b/contrib/sepgsql/dml.c @@ -4,7 +4,7 @@ * * Routines to handle DML permission checks * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * ------------------------------------------------------------------------- */ diff --git a/contrib/sepgsql/expected/alter.out b/contrib/sepgsql/expected/alter.out index c604cc7768246..ae43537505296 100644 --- a/contrib/sepgsql/expected/alter.out +++ b/contrib/sepgsql/expected/alter.out @@ -207,11 +207,15 @@ LOG: SELinux: allowed { execute } scontext=unconfined_u:unconfined_r:sepgsql_re ALTER TABLE regtest_table DROP CONSTRAINT test_ck; -- not supported CREATE TRIGGER regtest_test_trig BEFORE UPDATE ON regtest_table FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); -ALTER TABLE regtest_table DISABLE TRIGGER regtest_test_trig; -- not supported -ALTER TABLE regtest_table ENABLE TRIGGER regtest_test_trig; -- not supported +ALTER TABLE regtest_table DISABLE TRIGGER regtest_test_trig; +LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema_2.regtest_table" permissive=0 +ALTER TABLE regtest_table ENABLE TRIGGER regtest_test_trig; +LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema_2.regtest_table" permissive=0 CREATE RULE regtest_test_rule AS ON INSERT TO regtest_table_3 DO ALSO NOTHING; -ALTER TABLE regtest_table_3 DISABLE RULE regtest_test_rule; -- not supported -ALTER TABLE regtest_table_3 ENABLE RULE regtest_test_rule; -- not supported +ALTER TABLE regtest_table_3 DISABLE RULE regtest_test_rule; +LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_table_3" permissive=0 +ALTER TABLE regtest_table_3 ENABLE RULE regtest_test_rule; +LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_table_3" permissive=0 ALTER TABLE regtest_table SET (fillfactor = 75); LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema_2.regtest_table" permissive=0 ALTER TABLE regtest_table RESET (fillfactor); @@ -281,8 +285,10 @@ LOG: SELinux: allowed { execute } scontext=unconfined_u:unconfined_r:sepgsql_re ALTER TABLE regtest_table_part DROP CONSTRAINT test_ck; -- not supported by sepgsql CREATE TRIGGER regtest_part_test_trig BEFORE UPDATE ON regtest_table_part FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); -ALTER TABLE regtest_table_part DISABLE TRIGGER regtest_part_test_trig; -- not supported by sepgsql -ALTER TABLE regtest_table_part ENABLE TRIGGER regtest_part_test_trig; -- not supported by sepgsql +ALTER TABLE regtest_table_part DISABLE TRIGGER regtest_part_test_trig; +LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema_2.regtest_table_part" permissive=0 +ALTER TABLE regtest_table_part ENABLE TRIGGER regtest_part_test_trig; +LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema_2.regtest_table_part" permissive=0 ALTER TABLE regtest_table_part SET (fillfactor = 75); LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema_2.regtest_table_part" permissive=0 ALTER TABLE regtest_table_part RESET (fillfactor); diff --git a/contrib/sepgsql/expected/ddl.out b/contrib/sepgsql/expected/ddl.out index 15d2b9c5e7d2c..93c677e5463f6 100644 --- a/contrib/sepgsql/expected/ddl.out +++ b/contrib/sepgsql/expected/ddl.out @@ -55,6 +55,8 @@ LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_reg LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_seq_t:s0 tclass=db_sequence name="regtest_schema.regtest_table_x_seq" permissive=0 ALTER TABLE regtest_table ADD COLUMN z int; +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="pg_catalog" permissive=0 LINE 1: ALTER TABLE regtest_table ADD COLUMN z int; ^ @@ -123,8 +125,21 @@ ALTER TABLE regtest_table_2 ADD COLUMN b text; LOG: SELinux: allowed { create } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_column name="regtest_schema.regtest_table_2.b" permissive=0 -- VACUUM FULL internally create a new table and swap them later. VACUUM FULL regtest_table; +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="pg_catalog" permissive=0 VACUUM FULL regtest_ptable; +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="pg_catalog" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="pg_catalog" permissive=0 CREATE VIEW regtest_view AS SELECT * FROM regtest_table WHERE x < 100; +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LINE 1: CREATE VIEW regtest_view AS SELECT * FROM regtest_table WHER... + ^ +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 +LINE 1: CREATE VIEW regtest_view AS SELECT * FROM regtest_table WHER... + ^ LOG: SELinux: allowed { add_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 LOG: SELinux: allowed { create } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_view_t:s0 tclass=db_view name="regtest_schema.regtest_view" permissive=0 CREATE VIEW regtest_pview AS SELECT * FROM regtest_ptable WHERE a < 99; @@ -272,25 +287,37 @@ LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_reg LOG: SELinux: allowed { add_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_table_4" permissive=0 CREATE INDEX regtest_index_tbl4_y ON regtest_table_4(y); +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 LOG: SELinux: allowed { add_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_table_4" permissive=0 CREATE INDEX regtest_index_tbl4_z ON regtest_table_4(z); +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 LOG: SELinux: allowed { add_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_table_4" permissive=0 ALTER TABLE regtest_table_4 ALTER COLUMN y TYPE float; +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="pg_catalog" permissive=0 LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="pg_catalog" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_column name="regtest_schema.regtest_table_4.y" permissive=0 LOG: SELinux: allowed { execute } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_proc_exec_t:s0 tclass=db_procedure name="pg_catalog.float8(integer)" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_table_4" permissive=0 DROP INDEX regtest_index_tbl4_y; LOG: SELinux: allowed { remove_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_table_4" permissive=0 ALTER TABLE regtest_table_4 ADD CONSTRAINT regtest_tbl4_con EXCLUDE USING btree (z WITH =); +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 LOG: SELinux: allowed { add_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_table_4" permissive=0 DROP TABLE regtest_table_4 CASCADE; +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 LOG: SELinux: allowed { remove_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_table_4" permissive=0 LOG: SELinux: allowed { remove_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 @@ -349,9 +376,13 @@ CREATE INDEX regtest_pindex_tbl4_y ON regtest_ptable_4_ones(y); LOG: SELinux: allowed { add_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_ptable_4_ones" permissive=0 CREATE INDEX regtest_pindex_tbl4_z ON regtest_ptable_4_ones(z); +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 LOG: SELinux: allowed { add_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_ptable_4_ones" permissive=0 ALTER TABLE regtest_ptable_4 ALTER COLUMN y TYPE float; +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="pg_catalog" permissive=0 LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="pg_catalog" permissive=0 LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="pg_catalog" permissive=0 @@ -359,15 +390,21 @@ LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_re LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="pg_catalog" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_column name="regtest_schema.regtest_ptable_4_ones.y" permissive=0 LOG: SELinux: allowed { execute } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_proc_exec_t:s0 tclass=db_procedure name="pg_catalog.float8(integer)" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_ptable_4_ones" permissive=0 DROP INDEX regtest_pindex_tbl4_y; LOG: SELinux: allowed { remove_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_ptable_4_ones" permissive=0 ALTER TABLE regtest_ptable_4_ones ADD CONSTRAINT regtest_ptbl4_con EXCLUDE USING btree (z WITH =); +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 LOG: SELinux: allowed { add_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_ptable_4_ones" permissive=0 DROP TABLE regtest_ptable_4 CASCADE; +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 +LOG: SELinux: allowed { search } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=system_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="public" permissive=0 LOG: SELinux: allowed { remove_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 LOG: SELinux: allowed { setattr } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_table_t:s0 tclass=db_table name="regtest_schema.regtest_ptable_4_ones" permissive=0 LOG: SELinux: allowed { remove_name } scontext=unconfined_u:unconfined_r:sepgsql_regtest_superuser_t:s0 tcontext=unconfined_u:object_r:sepgsql_schema_t:s0 tclass=db_schema name="regtest_schema" permissive=0 diff --git a/contrib/sepgsql/hooks.c b/contrib/sepgsql/hooks.c index fa734763602b0..0f206b1093d81 100644 --- a/contrib/sepgsql/hooks.c +++ b/contrib/sepgsql/hooks.c @@ -4,7 +4,7 @@ * * Entrypoints of the hooks in PostgreSQL, and dispatches the callbacks. * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * ------------------------------------------------------------------------- */ @@ -50,7 +50,7 @@ typedef struct * command. Elsewhere (including the case of default) NULL. */ const char *createdb_dtemplate; -} sepgsql_context_info_t; +} sepgsql_context_info_t; static sepgsql_context_info_t sepgsql_context_info; @@ -406,7 +406,7 @@ _PG_init(void) if (IsUnderPostmaster) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("sepgsql must be loaded via shared_preload_libraries"))); + errmsg("sepgsql must be loaded via \"shared_preload_libraries\""))); /* * Check availability of SELinux on the platform. If disabled, we cannot diff --git a/contrib/sepgsql/label.c b/contrib/sepgsql/label.c index 38ff4068ff285..c790bc6b10004 100644 --- a/contrib/sepgsql/label.c +++ b/contrib/sepgsql/label.c @@ -4,7 +4,7 @@ * * Routines to support SELinux labels (security context) * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * ------------------------------------------------------------------------- */ @@ -67,7 +67,7 @@ typedef struct { SubTransactionId subid; char *label; -} pending_label; +} pending_label; /* * sepgsql_get_client_label diff --git a/contrib/sepgsql/launcher b/contrib/sepgsql/launcher index 79545492d25d7..85f60fd84f324 100755 --- a/contrib/sepgsql/launcher +++ b/contrib/sepgsql/launcher @@ -2,7 +2,7 @@ # # A wrapper script to launch psql command in regression test # -# Copyright (c) 2010-2023, PostgreSQL Global Development Group +# Copyright (c) 2010-2024, PostgreSQL Global Development Group # # ------------------------------------------------------------------------- diff --git a/contrib/sepgsql/meson.build b/contrib/sepgsql/meson.build index 5dbbe312b9f52..acff379b4b6b8 100644 --- a/contrib/sepgsql/meson.build +++ b/contrib/sepgsql/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not selinux.found() subdir_done() @@ -31,13 +31,13 @@ sepgsql = shared_module('sepgsql', ) contrib_targets += sepgsql -custom_target('sepgsql.sql', +contrib_targets += custom_target('sepgsql.sql', input: 'sepgsql.sql.in', output: 'sepgsql.sql', command: [sed, '-e', 's,MODULE_PATHNAME,$libdir/sepgsql,g', '@INPUT@'], capture: true, install: true, - install_dir: contrib_data_args['install_dir'], + install_dir: dir_data / 'contrib', ) # TODO: implement sepgsql tests diff --git a/contrib/sepgsql/proc.c b/contrib/sepgsql/proc.c index 2182034427b96..4899bc2a3e322 100644 --- a/contrib/sepgsql/proc.c +++ b/contrib/sepgsql/proc.c @@ -4,7 +4,7 @@ * * Routines corresponding to procedure objects * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * ------------------------------------------------------------------------- */ diff --git a/contrib/sepgsql/relation.c b/contrib/sepgsql/relation.c index 4653a98502978..92867d41e4088 100644 --- a/contrib/sepgsql/relation.c +++ b/contrib/sepgsql/relation.c @@ -4,7 +4,7 @@ * * Routines corresponding to relation/attribute objects * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * ------------------------------------------------------------------------- */ diff --git a/contrib/sepgsql/schema.c b/contrib/sepgsql/schema.c index 9c77f20cd46ef..96e34b90e7596 100644 --- a/contrib/sepgsql/schema.c +++ b/contrib/sepgsql/schema.c @@ -4,7 +4,7 @@ * * Routines corresponding to schema objects * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * ------------------------------------------------------------------------- */ diff --git a/contrib/sepgsql/selinux.c b/contrib/sepgsql/selinux.c index cd6784c90b035..d3b67b1304cb8 100644 --- a/contrib/sepgsql/selinux.c +++ b/contrib/sepgsql/selinux.c @@ -5,7 +5,7 @@ * Interactions between userspace and selinux in kernelspace, * using libselinux api. * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * ------------------------------------------------------------------------- */ diff --git a/contrib/sepgsql/sepgsql.h b/contrib/sepgsql/sepgsql.h index 00164aacbd661..a42d288e96e5b 100644 --- a/contrib/sepgsql/sepgsql.h +++ b/contrib/sepgsql/sepgsql.h @@ -4,7 +4,7 @@ * * Definitions corresponding to SE-PostgreSQL * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * ------------------------------------------------------------------------- */ diff --git a/contrib/sepgsql/sql/alter.sql b/contrib/sepgsql/sql/alter.sql index f1144492329b3..fd711f3f7abb9 100644 --- a/contrib/sepgsql/sql/alter.sql +++ b/contrib/sepgsql/sql/alter.sql @@ -127,12 +127,12 @@ ALTER TABLE regtest_table DROP CONSTRAINT test_ck; -- not supported CREATE TRIGGER regtest_test_trig BEFORE UPDATE ON regtest_table FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); -ALTER TABLE regtest_table DISABLE TRIGGER regtest_test_trig; -- not supported -ALTER TABLE regtest_table ENABLE TRIGGER regtest_test_trig; -- not supported +ALTER TABLE regtest_table DISABLE TRIGGER regtest_test_trig; +ALTER TABLE regtest_table ENABLE TRIGGER regtest_test_trig; CREATE RULE regtest_test_rule AS ON INSERT TO regtest_table_3 DO ALSO NOTHING; -ALTER TABLE regtest_table_3 DISABLE RULE regtest_test_rule; -- not supported -ALTER TABLE regtest_table_3 ENABLE RULE regtest_test_rule; -- not supported +ALTER TABLE regtest_table_3 DISABLE RULE regtest_test_rule; +ALTER TABLE regtest_table_3 ENABLE RULE regtest_test_rule; ALTER TABLE regtest_table SET (fillfactor = 75); ALTER TABLE regtest_table RESET (fillfactor); @@ -173,8 +173,8 @@ ALTER TABLE regtest_table_part DROP CONSTRAINT test_ck; -- not supported by CREATE TRIGGER regtest_part_test_trig BEFORE UPDATE ON regtest_table_part FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); -ALTER TABLE regtest_table_part DISABLE TRIGGER regtest_part_test_trig; -- not supported by sepgsql -ALTER TABLE regtest_table_part ENABLE TRIGGER regtest_part_test_trig; -- not supported by sepgsql +ALTER TABLE regtest_table_part DISABLE TRIGGER regtest_part_test_trig; +ALTER TABLE regtest_table_part ENABLE TRIGGER regtest_part_test_trig; ALTER TABLE regtest_table_part SET (fillfactor = 75); ALTER TABLE regtest_table_part RESET (fillfactor); diff --git a/contrib/sepgsql/uavc.c b/contrib/sepgsql/uavc.c index 6e3a892da2472..7defbc961e1b6 100644 --- a/contrib/sepgsql/uavc.c +++ b/contrib/sepgsql/uavc.c @@ -6,7 +6,7 @@ * access control decisions recently used, and reduce number of kernel * invocations to avoid unnecessary performance hit. * - * Copyright (c) 2011-2023, PostgreSQL Global Development Group + * Copyright (c) 2011-2024, PostgreSQL Global Development Group * * ------------------------------------------------------------------------- */ @@ -44,7 +44,7 @@ typedef struct /* true, if tcontext is valid */ char *ncontext; /* temporary scontext on execution of trusted * procedure, or NULL elsewhere */ -} avc_cache; +} avc_cache; /* * Declaration of static variables diff --git a/contrib/spi/meson.build b/contrib/spi/meson.build index a80e2c8ce4f56..7f623dceb6c3b 100644 --- a/contrib/spi/meson.build +++ b/contrib/spi/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group autoinc_sources = files( 'autoinc.c', @@ -20,6 +20,10 @@ install_data('autoinc.control', 'autoinc--1.0.sql', kwargs: contrib_data_args, ) +install_data('autoinc.example', + kwargs: contrib_doc_args, +) + insert_username_sources = files( 'insert_username.c', @@ -43,6 +47,10 @@ install_data( kwargs: contrib_data_args, ) +install_data('insert_username.example', + kwargs: contrib_doc_args, +) + moddatetime_sources = files( 'moddatetime.c', @@ -66,6 +74,11 @@ install_data( kwargs: contrib_data_args, ) +install_data('moddatetime.example', + kwargs: contrib_doc_args, +) + + # this is needed for the regression tests; # comment out if you want a quieter refint package for other uses refint_cflags = ['-DREFINT_VERBOSE'] @@ -90,3 +103,7 @@ contrib_targets += refint install_data('refint.control', 'refint--1.0.sql', kwargs: contrib_data_args, ) + +install_data('refint.example', + kwargs: contrib_doc_args, +) diff --git a/contrib/sslinfo/meson.build b/contrib/sslinfo/meson.build index 999456d3a42b3..39d49a1736c15 100644 --- a/contrib/sslinfo/meson.build +++ b/contrib/sslinfo/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not ssl.found() subdir_done() diff --git a/contrib/tablefunc/expected/tablefunc.out b/contrib/tablefunc/expected/tablefunc.out index 464c210f42fd1..ddece79029a3a 100644 --- a/contrib/tablefunc/expected/tablefunc.out +++ b/contrib/tablefunc/expected/tablefunc.out @@ -145,6 +145,23 @@ SELECT * FROM crosstab_out('SELECT rowid, attribute, val FROM ct where rowclass | val9 | val10 | val11 (3 rows) +-- check error reporting +SELECT * FROM crosstab('SELECT rowid, val FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;') + AS ct(row_name text, category_1 text, category_2 text); +ERROR: invalid crosstab source data query +DETAIL: The query must return 3 columns: row_name, category, and value. +SELECT * FROM crosstab('SELECT rowid, attribute, val FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;') + AS ct(row_name text); +ERROR: invalid crosstab return type +DETAIL: Return row must have at least two columns. +SELECT * FROM crosstab('SELECT rowid, attribute, val FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;') + AS ct(row_name int, category_1 text, category_2 text); +ERROR: invalid crosstab return type +DETAIL: Source row_name datatype text does not match return row_name datatype integer. +SELECT * FROM crosstab('SELECT rowid, attribute, val FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;') + AS ct(row_name text, category_1 text, category_2 int); +ERROR: invalid crosstab return type +DETAIL: Source value datatype text does not match return value datatype integer in column 3. -- -- hash based crosstab -- @@ -216,13 +233,20 @@ SELECT * FROM crosstab( 'SELECT rowid, rowdt, attribute, val FROM cth ORDER BY 1', 'SELECT DISTINCT attribute FROM cth WHERE attribute = ''a'' ORDER BY 1') AS c(rowid text, rowdt timestamp, temperature int4, test_result text, test_startdate timestamp, volts float8); -ERROR: provided "categories" SQL must return 1 column of at least one row +ERROR: crosstab categories query must return at least one row -- if category query generates more than one column, get expected error SELECT * FROM crosstab( 'SELECT rowid, rowdt, attribute, val FROM cth ORDER BY 1', 'SELECT DISTINCT rowdt, attribute FROM cth ORDER BY 2') AS c(rowid text, rowdt timestamp, temperature int4, test_result text, test_startdate timestamp, volts float8); -ERROR: provided "categories" SQL must return 1 column of at least one row +ERROR: invalid crosstab categories query +DETAIL: The query must return one column. +-- if category query generates a NULL value, get expected error +SELECT * FROM crosstab( + 'SELECT rowid, rowdt, attribute, val FROM cth ORDER BY 1', + 'SELECT NULL::text') +AS c(rowid text, rowdt timestamp, temperature int4, test_result text, test_startdate timestamp, volts float8); +ERROR: crosstab category value must not be null -- if source query returns zero rows, get zero rows returned SELECT * FROM crosstab( 'SELECT rowid, rowdt, attribute, val FROM cth WHERE false ORDER BY 1', @@ -241,6 +265,26 @@ AS c(rowid text, rowdt timestamp, temperature text, test_result text, test_start -------+-------+-------------+-------------+----------------+------- (0 rows) +-- check errors with inappropriate input rowtype +SELECT * FROM crosstab( + 'SELECT rowid, attribute FROM cth ORDER BY 1', + 'SELECT DISTINCT attribute FROM cth ORDER BY 1') +AS c(rowid text, temperature text, test_result text, test_startdate text, volts text); +ERROR: invalid crosstab source data query +DETAIL: The query must return at least 3 columns: row_name, category, and value. +SELECT * FROM crosstab( + 'SELECT rowid, rowdt, rowdt, attribute, val FROM cth ORDER BY 1', + 'SELECT DISTINCT attribute FROM cth ORDER BY 1') +AS c(rowid text, rowdt timestamp, temperature int4, test_result text, test_startdate timestamp, volts float8); +ERROR: invalid crosstab return type +DETAIL: Return row must have 7 columns, not 6. +-- check errors with inappropriate result rowtype +SELECT * FROM crosstab( + 'SELECT rowid, attribute, val FROM cth ORDER BY 1', + 'SELECT DISTINCT attribute FROM cth ORDER BY 1') +AS c(rowid text); +ERROR: invalid crosstab return type +DETAIL: Return row must have at least two columns. -- check it works with a named result rowtype create type my_crosstab_result as ( rowid text, rowdt timestamp, @@ -381,17 +425,42 @@ SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 4, '~') A -- should fail as first two columns must have the same type SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0, '~') AS t(keyid text, parent_keyid int, level int, branch text); -ERROR: invalid return type -DETAIL: First two columns must be the same type. +ERROR: invalid connectby return type +DETAIL: Source key type integer does not match return key type text. -- should fail as key field datatype should match return datatype SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0, '~') AS t(keyid float8, parent_keyid float8, level int, branch text); -ERROR: invalid return type -DETAIL: SQL key field type double precision does not match return key field type integer. +ERROR: invalid connectby return type +DETAIL: Source key type integer does not match return key type double precision. +SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0, '~') AS t(keyid int, parent_keyid float8, level int, branch text); +ERROR: invalid connectby return type +DETAIL: Source parent key type integer does not match return parent key type double precision. +-- check other rowtype mismatch cases +SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0) AS t(keyid int, parent_keyid int, level int, branch text); +ERROR: invalid connectby return type +DETAIL: Return row must have 3 columns, not 4. +SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0, '~') AS t(keyid int, parent_keyid int, level int); +ERROR: invalid connectby return type +DETAIL: Return row must have 4 columns, not 3. +SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0) AS t(keyid int, parent_keyid text, level int); +ERROR: invalid connectby return type +DETAIL: Source parent key type integer does not match return parent key type text. +SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0, '~') AS t(keyid int, parent_keyid int, level float, branch float); +ERROR: invalid connectby return type +DETAIL: Third return column (depth) must be type integer. +SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0, '~') AS t(keyid int, parent_keyid int, level int, branch float); +ERROR: invalid connectby return type +DETAIL: Fourth return column (branch) must be type text. +SELECT * FROM connectby('connectby_text', 'keyid', 'parent_keyid', 'pos', 'row2', 0, '~') AS t(keyid text, parent_keyid text, level int, branch text, pos text); +ERROR: invalid connectby return type +DETAIL: Fifth return column (serial) must be type integer. +SELECT * FROM connectby('connectby_text', 'keyid', 'parent_keyid', 'pos', 'row2', 0) AS t(keyid text, parent_keyid text, level int, pos text); +ERROR: invalid connectby return type +DETAIL: Fourth return column (serial) must be type integer. -- tests for values using custom queries -- query with one column - failed SELECT * FROM connectby('connectby_int', '1; --', 'parent_keyid', '2', 0) AS t(keyid int, parent_keyid int, level int); -ERROR: invalid return type -DETAIL: Query must return at least two columns. +ERROR: invalid connectby source data query +DETAIL: The query must return at least two columns. -- query with two columns first value as NULL SELECT * FROM connectby('connectby_int', 'NULL::int, 1::int; --', 'parent_keyid', '2', 0) AS t(keyid int, parent_keyid int, level int); keyid | parent_keyid | level diff --git a/contrib/tablefunc/meson.build b/contrib/tablefunc/meson.build index 8399b316b0703..dccf3b375821b 100644 --- a/contrib/tablefunc/meson.build +++ b/contrib/tablefunc/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tablefunc_sources = files( 'tablefunc.c', diff --git a/contrib/tablefunc/sql/tablefunc.sql b/contrib/tablefunc/sql/tablefunc.sql index 02e8a98c73e0b..0fb8e40de29fe 100644 --- a/contrib/tablefunc/sql/tablefunc.sql +++ b/contrib/tablefunc/sql/tablefunc.sql @@ -44,6 +44,16 @@ LANGUAGE C STABLE STRICT; SELECT * FROM crosstab_out('SELECT rowid, attribute, val FROM ct where rowclass = ''group1'' ORDER BY 1,2;'); +-- check error reporting +SELECT * FROM crosstab('SELECT rowid, val FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;') + AS ct(row_name text, category_1 text, category_2 text); +SELECT * FROM crosstab('SELECT rowid, attribute, val FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;') + AS ct(row_name text); +SELECT * FROM crosstab('SELECT rowid, attribute, val FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;') + AS ct(row_name int, category_1 text, category_2 text); +SELECT * FROM crosstab('SELECT rowid, attribute, val FROM ct where rowclass = ''group1'' and (attribute = ''att2'' or attribute = ''att3'') ORDER BY 1,2;') + AS ct(row_name text, category_1 text, category_2 int); + -- -- hash based crosstab -- @@ -99,6 +109,12 @@ SELECT * FROM crosstab( 'SELECT DISTINCT rowdt, attribute FROM cth ORDER BY 2') AS c(rowid text, rowdt timestamp, temperature int4, test_result text, test_startdate timestamp, volts float8); +-- if category query generates a NULL value, get expected error +SELECT * FROM crosstab( + 'SELECT rowid, rowdt, attribute, val FROM cth ORDER BY 1', + 'SELECT NULL::text') +AS c(rowid text, rowdt timestamp, temperature int4, test_result text, test_startdate timestamp, volts float8); + -- if source query returns zero rows, get zero rows returned SELECT * FROM crosstab( 'SELECT rowid, rowdt, attribute, val FROM cth WHERE false ORDER BY 1', @@ -111,6 +127,22 @@ SELECT * FROM crosstab( 'SELECT DISTINCT attribute FROM cth WHERE false ORDER BY 1') AS c(rowid text, rowdt timestamp, temperature text, test_result text, test_startdate text, volts text); +-- check errors with inappropriate input rowtype +SELECT * FROM crosstab( + 'SELECT rowid, attribute FROM cth ORDER BY 1', + 'SELECT DISTINCT attribute FROM cth ORDER BY 1') +AS c(rowid text, temperature text, test_result text, test_startdate text, volts text); +SELECT * FROM crosstab( + 'SELECT rowid, rowdt, rowdt, attribute, val FROM cth ORDER BY 1', + 'SELECT DISTINCT attribute FROM cth ORDER BY 1') +AS c(rowid text, rowdt timestamp, temperature int4, test_result text, test_startdate timestamp, volts float8); + +-- check errors with inappropriate result rowtype +SELECT * FROM crosstab( + 'SELECT rowid, attribute, val FROM cth ORDER BY 1', + 'SELECT DISTINCT attribute FROM cth ORDER BY 1') +AS c(rowid text); + -- check it works with a named result rowtype create type my_crosstab_result as ( @@ -186,6 +218,16 @@ SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0, '~') A -- should fail as key field datatype should match return datatype SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0, '~') AS t(keyid float8, parent_keyid float8, level int, branch text); +SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0, '~') AS t(keyid int, parent_keyid float8, level int, branch text); + +-- check other rowtype mismatch cases +SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0) AS t(keyid int, parent_keyid int, level int, branch text); +SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0, '~') AS t(keyid int, parent_keyid int, level int); +SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0) AS t(keyid int, parent_keyid text, level int); +SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0, '~') AS t(keyid int, parent_keyid int, level float, branch float); +SELECT * FROM connectby('connectby_int', 'keyid', 'parent_keyid', '2', 0, '~') AS t(keyid int, parent_keyid int, level int, branch float); +SELECT * FROM connectby('connectby_text', 'keyid', 'parent_keyid', 'pos', 'row2', 0, '~') AS t(keyid text, parent_keyid text, level int, branch text, pos text); +SELECT * FROM connectby('connectby_text', 'keyid', 'parent_keyid', 'pos', 'row2', 0) AS t(keyid text, parent_keyid text, level int, pos text); -- tests for values using custom queries -- query with one column - failed diff --git a/contrib/tablefunc/tablefunc.c b/contrib/tablefunc/tablefunc.c index 7a6a36704476c..7d1b5f514390c 100644 --- a/contrib/tablefunc/tablefunc.c +++ b/contrib/tablefunc/tablefunc.c @@ -10,7 +10,7 @@ * And contributors: * Nabil Sayegh * - * Copyright (c) 2002-2023, PostgreSQL Global Development Group + * Copyright (c) 2002-2024, PostgreSQL Global Development Group * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without a written agreement @@ -52,7 +52,7 @@ static Tuplestorestate *get_crosstab_tuplestore(char *sql, TupleDesc tupdesc, bool randomAccess); static void validateConnectbyTupleDesc(TupleDesc td, bool show_branch, bool show_serial); -static bool compatCrosstabTupleDescs(TupleDesc ret_tupdesc, TupleDesc sql_tupdesc); +static void compatCrosstabTupleDescs(TupleDesc ret_tupdesc, TupleDesc sql_tupdesc); static void compatConnectbyTupleDescs(TupleDesc ret_tupdesc, TupleDesc sql_tupdesc); static void get_normal_pair(float8 *x1, float8 *x2); static Tuplestorestate *connectby(char *relname, @@ -418,9 +418,8 @@ crosstab(PG_FUNCTION_ARGS) if (spi_tupdesc->natts != 3) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("invalid source data SQL statement"), - errdetail("The provided SQL must return 3 " - "columns: rowid, category, and values."))); + errmsg("invalid crosstab source data query"), + errdetail("The query must return 3 columns: row_name, category, and value."))); /* get a tuple descriptor for our result type */ switch (get_call_result_type(fcinfo, NULL, &tupdesc)) @@ -447,11 +446,7 @@ crosstab(PG_FUNCTION_ARGS) * Check that return tupdesc is compatible with the data we got from SPI, * at least based on number and type of attributes */ - if (!compatCrosstabTupleDescs(tupdesc, spi_tupdesc)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("return and sql tuple descriptions are " \ - "incompatible"))); + compatCrosstabTupleDescs(tupdesc, spi_tupdesc); /* * switch to long-lived memory context @@ -673,9 +668,9 @@ crosstab_hash(PG_FUNCTION_ARGS) */ if (tupdesc->natts < 2) ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("query-specified return tuple and " \ - "crosstab function are not compatible"))); + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("invalid crosstab return type"), + errdetail("Return row must have at least two columns."))); /* load up the categories hash table */ crosstab_hash = load_categories_hash(cats_sql, per_query_ctx); @@ -750,9 +745,9 @@ load_categories_hash(char *cats_sql, MemoryContext per_query_ctx) */ if (spi_tupdesc->natts != 1) ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("provided \"categories\" SQL must " \ - "return 1 column of at least one row"))); + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid crosstab categories query"), + errdetail("The query must return one column."))); for (i = 0; i < proc; i++) { @@ -767,9 +762,8 @@ load_categories_hash(char *cats_sql, MemoryContext per_query_ctx) catname = SPI_getvalue(spi_tuple, spi_tupdesc, 1); if (catname == NULL) ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("provided \"categories\" SQL must " \ - "not return NULL values"))); + (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), + errmsg("crosstab category value must not be null"))); SPIcontext = MemoryContextSwitchTo(per_query_ctx); @@ -837,9 +831,8 @@ get_crosstab_tuplestore(char *sql, { /* no qualifying category tuples */ ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("provided \"categories\" SQL must " \ - "return 1 column of at least one row"))); + (errcode(ERRCODE_CARDINALITY_VIOLATION), + errmsg("crosstab categories query must return at least one row"))); } /* @@ -858,20 +851,18 @@ get_crosstab_tuplestore(char *sql, if (ncols < 3) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("invalid source data SQL statement"), - errdetail("The provided SQL must return 3 " \ - " columns; rowid, category, and values."))); + errmsg("invalid crosstab source data query"), + errdetail("The query must return at least 3 columns: row_name, category, and value."))); result_ncols = (ncols - 2) + num_categories; - /* Recheck to make sure we tuple descriptor still looks reasonable */ + /* Recheck to make sure output tuple descriptor looks reasonable */ if (tupdesc->natts != result_ncols) ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("invalid return type"), - errdetail("Query-specified return " \ - "tuple has %d columns but crosstab " \ - "returns %d.", tupdesc->natts, result_ncols))); + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("invalid crosstab return type"), + errdetail("Return row must have %d columns, not %d.", + result_ncols, tupdesc->natts))); /* allocate space and make sure it's clear */ values = (char **) palloc0(result_ncols * sizeof(char *)); @@ -1422,77 +1413,62 @@ build_tuplestore_recursively(char *key_fld, static void validateConnectbyTupleDesc(TupleDesc td, bool show_branch, bool show_serial) { - int serial_column = 0; - - if (show_serial) - serial_column = 1; + int expected_cols; /* are there the correct number of columns */ if (show_branch) - { - if (td->natts != (CONNECTBY_NCOLS + serial_column)) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("invalid return type"), - errdetail("Query-specified return tuple has " \ - "wrong number of columns."))); - } + expected_cols = CONNECTBY_NCOLS; else - { - if (td->natts != CONNECTBY_NCOLS_NOBRANCH + serial_column) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("invalid return type"), - errdetail("Query-specified return tuple has " \ - "wrong number of columns."))); - } + expected_cols = CONNECTBY_NCOLS_NOBRANCH; + if (show_serial) + expected_cols++; - /* check that the types of the first two columns match */ - if (TupleDescAttr(td, 0)->atttypid != TupleDescAttr(td, 1)->atttypid) + if (td->natts != expected_cols) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("invalid return type"), - errdetail("First two columns must be the same type."))); + errmsg("invalid connectby return type"), + errdetail("Return row must have %d columns, not %d.", + expected_cols, td->natts))); + + /* the first two columns will be checked against the input tuples later */ /* check that the type of the third column is INT4 */ if (TupleDescAttr(td, 2)->atttypid != INT4OID) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("invalid return type"), - errdetail("Third column must be type %s.", + errmsg("invalid connectby return type"), + errdetail("Third return column (depth) must be type %s.", format_type_be(INT4OID)))); - /* check that the type of the fourth column is TEXT if applicable */ + /* check that the type of the branch column is TEXT if applicable */ if (show_branch && TupleDescAttr(td, 3)->atttypid != TEXTOID) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("invalid return type"), - errdetail("Fourth column must be type %s.", + errmsg("invalid connectby return type"), + errdetail("Fourth return column (branch) must be type %s.", format_type_be(TEXTOID)))); - /* check that the type of the fifth column is INT4 */ + /* check that the type of the serial column is INT4 if applicable */ if (show_branch && show_serial && TupleDescAttr(td, 4)->atttypid != INT4OID) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("query-specified return tuple not valid for Connectby: " - "fifth column must be type %s", - format_type_be(INT4OID)))); - - /* check that the type of the fourth column is INT4 */ + errmsg("invalid connectby return type"), + errdetail("Fifth return column (serial) must be type %s.", + format_type_be(INT4OID)))); if (!show_branch && show_serial && TupleDescAttr(td, 3)->atttypid != INT4OID) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("query-specified return tuple not valid for Connectby: " - "fourth column must be type %s", - format_type_be(INT4OID)))); + errmsg("invalid connectby return type"), + errdetail("Fourth return column (serial) must be type %s.", + format_type_be(INT4OID)))); /* OK, the tupdesc is valid for our purposes */ } /* - * Check if spi sql tupdesc and return tupdesc are compatible + * Check if output tupdesc and SQL query's tupdesc are compatible */ static void compatConnectbyTupleDescs(TupleDesc ret_tupdesc, TupleDesc sql_tupdesc) @@ -1503,13 +1479,13 @@ compatConnectbyTupleDescs(TupleDesc ret_tupdesc, TupleDesc sql_tupdesc) int32 sql_atttypmod; /* - * Result must have at least 2 columns. + * Query result must have at least 2 columns. */ if (sql_tupdesc->natts < 2) ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("invalid return type"), - errdetail("Query must return at least two columns."))); + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid connectby source data query"), + errdetail("The query must return at least two columns."))); /* * These columns must match the result type indicated by the calling @@ -1523,11 +1499,10 @@ compatConnectbyTupleDescs(TupleDesc ret_tupdesc, TupleDesc sql_tupdesc) (ret_atttypmod >= 0 && ret_atttypmod != sql_atttypmod)) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("invalid return type"), - errdetail("SQL key field type %s does " \ - "not match return key field type %s.", - format_type_with_typemod(ret_atttypid, ret_atttypmod), - format_type_with_typemod(sql_atttypid, sql_atttypmod)))); + errmsg("invalid connectby return type"), + errdetail("Source key type %s does not match return key type %s.", + format_type_with_typemod(sql_atttypid, sql_atttypmod), + format_type_with_typemod(ret_atttypid, ret_atttypmod)))); ret_atttypid = TupleDescAttr(ret_tupdesc, 1)->atttypid; sql_atttypid = TupleDescAttr(sql_tupdesc, 1)->atttypid; @@ -1537,55 +1512,69 @@ compatConnectbyTupleDescs(TupleDesc ret_tupdesc, TupleDesc sql_tupdesc) (ret_atttypmod >= 0 && ret_atttypmod != sql_atttypmod)) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("invalid return type"), - errdetail("SQL parent key field type %s does " \ - "not match return parent key field type %s.", - format_type_with_typemod(ret_atttypid, ret_atttypmod), - format_type_with_typemod(sql_atttypid, sql_atttypmod)))); + errmsg("invalid connectby return type"), + errdetail("Source parent key type %s does not match return parent key type %s.", + format_type_with_typemod(sql_atttypid, sql_atttypmod), + format_type_with_typemod(ret_atttypid, ret_atttypmod)))); /* OK, the two tupdescs are compatible for our purposes */ } /* - * Check if two tupdescs match in type of attributes + * Check if crosstab output tupdesc agrees with input tupdesc */ -static bool +static void compatCrosstabTupleDescs(TupleDesc ret_tupdesc, TupleDesc sql_tupdesc) { int i; - Form_pg_attribute ret_attr; Oid ret_atttypid; - Form_pg_attribute sql_attr; Oid sql_atttypid; + int32 ret_atttypmod; + int32 sql_atttypmod; - if (ret_tupdesc->natts < 2 || - sql_tupdesc->natts < 3) - return false; + if (ret_tupdesc->natts < 2) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("invalid crosstab return type"), + errdetail("Return row must have at least two columns."))); + Assert(sql_tupdesc->natts == 3); /* already checked by caller */ - /* check the rowid types match */ + /* check the row_name types match */ ret_atttypid = TupleDescAttr(ret_tupdesc, 0)->atttypid; sql_atttypid = TupleDescAttr(sql_tupdesc, 0)->atttypid; - if (ret_atttypid != sql_atttypid) + ret_atttypmod = TupleDescAttr(ret_tupdesc, 0)->atttypmod; + sql_atttypmod = TupleDescAttr(sql_tupdesc, 0)->atttypmod; + if (ret_atttypid != sql_atttypid || + (ret_atttypmod >= 0 && ret_atttypmod != sql_atttypmod)) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("invalid return type"), - errdetail("SQL rowid datatype does not match " \ - "return rowid datatype."))); + errmsg("invalid crosstab return type"), + errdetail("Source row_name datatype %s does not match return row_name datatype %s.", + format_type_with_typemod(sql_atttypid, sql_atttypmod), + format_type_with_typemod(ret_atttypid, ret_atttypmod)))); /* - * - attribute [1] of the sql tuple is the category; no need to check it - - * attribute [2] of the sql tuple should match attributes [1] to [natts] + * attribute [1] of sql tuple is the category; no need to check it + * attribute [2] of sql tuple should match attributes [1] to [natts - 1] * of the return tuple */ - sql_attr = TupleDescAttr(sql_tupdesc, 2); + sql_atttypid = TupleDescAttr(sql_tupdesc, 2)->atttypid; + sql_atttypmod = TupleDescAttr(sql_tupdesc, 2)->atttypmod; for (i = 1; i < ret_tupdesc->natts; i++) { - ret_attr = TupleDescAttr(ret_tupdesc, i); + ret_atttypid = TupleDescAttr(ret_tupdesc, i)->atttypid; + ret_atttypmod = TupleDescAttr(ret_tupdesc, i)->atttypmod; - if (ret_attr->atttypid != sql_attr->atttypid) - return false; + if (ret_atttypid != sql_atttypid || + (ret_atttypmod >= 0 && ret_atttypmod != sql_atttypmod)) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("invalid crosstab return type"), + errdetail("Source value datatype %s does not match return value datatype %s in column %d.", + format_type_with_typemod(sql_atttypid, sql_atttypmod), + format_type_with_typemod(ret_atttypid, ret_atttypmod), + i + 1))); } /* OK, the two tupdescs are compatible for our purposes */ - return true; } diff --git a/contrib/tablefunc/tablefunc.h b/contrib/tablefunc/tablefunc.h index 0398c6dfc6543..2009382ce7df8 100644 --- a/contrib/tablefunc/tablefunc.h +++ b/contrib/tablefunc/tablefunc.h @@ -10,7 +10,7 @@ * And contributors: * Nabil Sayegh * - * Copyright (c) 2002-2023, PostgreSQL Global Development Group + * Copyright (c) 2002-2024, PostgreSQL Global Development Group * * Permission to use, copy, modify, and distribute this software and its * documentation for any purpose, without fee, and without a written agreement diff --git a/contrib/tcn/meson.build b/contrib/tcn/meson.build index 3028bc56a208d..9650a234d8fd6 100644 --- a/contrib/tcn/meson.build +++ b/contrib/tcn/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tcn_sources = files( 'tcn.c', diff --git a/contrib/tcn/tcn.c b/contrib/tcn/tcn.c index 546fbf263277c..8d23c824c1b04 100644 --- a/contrib/tcn/tcn.c +++ b/contrib/tcn/tcn.c @@ -3,7 +3,7 @@ * tcn.c * triggered change notification support for PostgreSQL * - * Portions Copyright (c) 2011-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2011-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/contrib/test_decoding/Makefile b/contrib/test_decoding/Makefile index c7ce6037064d8..02e961f4d3144 100644 --- a/contrib/test_decoding/Makefile +++ b/contrib/test_decoding/Makefile @@ -8,7 +8,8 @@ REGRESS = ddl xact rewrite toast permissions decoding_in_xact \ spill slot truncate stream stats twophase twophase_stream ISOLATION = mxact delayed_startup ondisk_startup concurrent_ddl_dml \ oldest_xmin snapshot_transfer subxact_without_top concurrent_stream \ - twophase_snapshot slot_creation_error catalog_change_snapshot + twophase_snapshot slot_creation_error catalog_change_snapshot \ + skip_snapshot_restore invalidation_distribution REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/test_decoding/logical.conf ISOLATION_OPTS = --temp-config $(top_srcdir)/contrib/test_decoding/logical.conf diff --git a/contrib/test_decoding/expected/concurrent_stream.out b/contrib/test_decoding/expected/concurrent_stream.out index bf1e1326c6196..1e5e2d1b111d3 100644 --- a/contrib/test_decoding/expected/concurrent_stream.out +++ b/contrib/test_decoding/expected/concurrent_stream.out @@ -2,11 +2,11 @@ Parsed test spec with 3 sessions starting permutation: s0_begin s0_ddl s1_ddl s1_begin s1_toast_insert s2_ddl s1_commit s1_get_stream_changes step s0_begin: BEGIN; -step s0_ddl: CREATE TABLE stream_test1(data text); -step s1_ddl: CREATE TABLE stream_test(data text); +step s0_ddl: CREATE TABLE stream_test1(data bytea); +step s1_ddl: CREATE TABLE stream_test(data bytea); step s1_begin: BEGIN; step s1_toast_insert: INSERT INTO stream_test SELECT large_val(); -step s2_ddl: CREATE TABLE stream_test2(data text); +step s2_ddl: CREATE TABLE stream_test2(data bytea); step s1_commit: COMMIT; step s1_get_stream_changes: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL,NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); data diff --git a/contrib/test_decoding/expected/ddl.out b/contrib/test_decoding/expected/ddl.out index d55fb3a667f16..5713b8ab1c375 100644 --- a/contrib/test_decoding/expected/ddl.out +++ b/contrib/test_decoding/expected/ddl.out @@ -659,154 +659,156 @@ INSERT INTO toasttable(toasted_col2) SELECT repeat(string_agg(to_char(g.i, 'FM00 UPDATE toasttable SET toasted_col1 = (SELECT string_agg(g.i::text, '') FROM generate_series(1, 2000) g(i)) WHERE id = 1; +-- This output is extremely wide, and using aligned mode causes psql to +-- produce 200kB of useless dashes. Turn that off temporarily to avoid it. +\pset format unaligned SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - data ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - BEGIN - table public.table_without_key: INSERT: id[integer]:1 data[integer]:1 - table public.table_without_key: INSERT: id[integer]:2 data[integer]:2 - COMMIT - BEGIN - table public.table_without_key: DELETE: (no-tuple-data) - COMMIT - BEGIN - table public.table_without_key: UPDATE: id[integer]:2 data[integer]:3 - COMMIT - BEGIN - table public.table_without_key: UPDATE: id[integer]:-2 data[integer]:3 - COMMIT - BEGIN - table public.table_without_key: UPDATE: id[integer]:2 data[integer]:3 - COMMIT - BEGIN - table public.table_without_key: UPDATE: old-key: id[integer]:2 data[integer]:3 new-tuple: id[integer]:-2 data[integer]:3 - COMMIT - BEGIN - table public.table_without_key: UPDATE: old-key: id[integer]:-2 data[integer]:3 new-tuple: id[integer]:2 data[integer]:3 - COMMIT - BEGIN - table public.table_without_key: UPDATE: old-key: id[integer]:2 data[integer]:3 new-tuple: id[integer]:-2 data[integer]:3 new_column[text]:null - COMMIT - BEGIN - table public.table_without_key: UPDATE: old-key: id[integer]:-2 data[integer]:3 new-tuple: id[integer]:2 data[integer]:3 new_column[text]:'someval' - COMMIT - BEGIN - table public.table_without_key: DELETE: id[integer]:2 data[integer]:3 new_column[text]:'someval' - COMMIT - BEGIN - table public.table_with_pkey: INSERT: id[integer]:1 data[integer]:1 - table public.table_with_pkey: INSERT: id[integer]:2 data[integer]:2 - COMMIT - BEGIN - table public.table_with_pkey: DELETE: id[integer]:1 - COMMIT - BEGIN - table public.table_with_pkey: UPDATE: id[integer]:2 data[integer]:3 - COMMIT - BEGIN - table public.table_with_pkey: UPDATE: old-key: id[integer]:2 new-tuple: id[integer]:-2 data[integer]:3 - COMMIT - BEGIN - table public.table_with_pkey: UPDATE: old-key: id[integer]:-2 new-tuple: id[integer]:2 data[integer]:3 - COMMIT - BEGIN - table public.table_with_pkey: UPDATE: old-key: id[integer]:2 new-tuple: id[integer]:-2 data[integer]:3 - COMMIT - BEGIN - table public.table_with_pkey: UPDATE: old-key: id[integer]:-2 new-tuple: id[integer]:2 data[integer]:3 - COMMIT - BEGIN - table public.table_with_pkey: DELETE: id[integer]:2 - COMMIT - BEGIN - table public.table_with_unique_not_null: INSERT: id[integer]:1 data[integer]:1 - table public.table_with_unique_not_null: INSERT: id[integer]:2 data[integer]:2 - COMMIT - BEGIN - table public.table_with_unique_not_null: DELETE: (no-tuple-data) - COMMIT - BEGIN - table public.table_with_unique_not_null: UPDATE: id[integer]:2 data[integer]:3 - COMMIT - BEGIN - table public.table_with_unique_not_null: UPDATE: id[integer]:-2 data[integer]:3 - COMMIT - BEGIN - table public.table_with_unique_not_null: UPDATE: id[integer]:2 data[integer]:3 - COMMIT - BEGIN - table public.table_with_unique_not_null: DELETE: (no-tuple-data) - COMMIT - BEGIN - table public.table_with_unique_not_null: INSERT: id[integer]:3 data[integer]:1 - table public.table_with_unique_not_null: INSERT: id[integer]:4 data[integer]:2 - COMMIT - BEGIN - table public.table_with_unique_not_null: DELETE: id[integer]:3 - COMMIT - BEGIN - table public.table_with_unique_not_null: UPDATE: id[integer]:4 data[integer]:3 - COMMIT - BEGIN - table public.table_with_unique_not_null: UPDATE: old-key: id[integer]:4 new-tuple: id[integer]:-4 data[integer]:3 - COMMIT - BEGIN - table public.table_with_unique_not_null: UPDATE: old-key: id[integer]:-4 new-tuple: id[integer]:4 data[integer]:3 - COMMIT - BEGIN - table public.table_with_unique_not_null: DELETE: id[integer]:4 - COMMIT - BEGIN - table public.table_dropped_index_with_pk: INSERT: a[integer]:1 b[integer]:1 c[integer]:1 - table public.table_dropped_index_with_pk: INSERT: a[integer]:2 b[integer]:2 c[integer]:2 - table public.table_dropped_index_with_pk: INSERT: a[integer]:3 b[integer]:3 c[integer]:3 - COMMIT - BEGIN - table public.table_dropped_index_with_pk: UPDATE: a[integer]:4 b[integer]:1 c[integer]:1 - COMMIT - BEGIN - table public.table_dropped_index_with_pk: UPDATE: a[integer]:2 b[integer]:5 c[integer]:2 - COMMIT - BEGIN - table public.table_dropped_index_with_pk: UPDATE: a[integer]:3 b[integer]:6 c[integer]:7 - COMMIT - BEGIN - table public.table_dropped_index_with_pk: DELETE: (no-tuple-data) - COMMIT - BEGIN - table public.table_dropped_index_with_pk: DELETE: (no-tuple-data) - COMMIT - BEGIN - table public.table_dropped_index_no_pk: INSERT: a[integer]:1 b[integer]:1 c[integer]:1 - table public.table_dropped_index_no_pk: INSERT: a[integer]:2 b[integer]:2 c[integer]:2 - table public.table_dropped_index_no_pk: INSERT: a[integer]:3 b[integer]:3 c[integer]:3 - COMMIT - BEGIN - table public.table_dropped_index_no_pk: UPDATE: a[integer]:4 b[integer]:1 c[integer]:1 - COMMIT - BEGIN - table public.table_dropped_index_no_pk: UPDATE: a[integer]:2 b[integer]:5 c[integer]:2 - COMMIT - BEGIN - table public.table_dropped_index_no_pk: UPDATE: a[integer]:3 b[integer]:6 c[integer]:7 - COMMIT - BEGIN - table public.table_dropped_index_no_pk: DELETE: (no-tuple-data) - COMMIT - BEGIN - table public.table_dropped_index_no_pk: DELETE: (no-tuple-data) - COMMIT - BEGIN - table public.toasttable: INSERT: id[integer]:1 toasted_col1[text]:'12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000' rand1[double precision]:79 toasted_col2[text]:null rand2[double precision]:1578 - COMMIT - BEGIN - table public.toasttable: INSERT: id[integer]:2 toasted_col1[text]:null rand1[double precision]:3077 toasted_col2[text]:'0001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500' rand2[double precision]:4576 - COMMIT - BEGIN - table public.toasttable: UPDATE: id[integer]:1 toasted_col1[text]:'12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000' rand1[double precision]:79 toasted_col2[text]:null rand2[double precision]:1578 - COMMIT +data +BEGIN +table public.table_without_key: INSERT: id[integer]:1 data[integer]:1 +table public.table_without_key: INSERT: id[integer]:2 data[integer]:2 +COMMIT +BEGIN +table public.table_without_key: DELETE: (no-tuple-data) +COMMIT +BEGIN +table public.table_without_key: UPDATE: id[integer]:2 data[integer]:3 +COMMIT +BEGIN +table public.table_without_key: UPDATE: id[integer]:-2 data[integer]:3 +COMMIT +BEGIN +table public.table_without_key: UPDATE: id[integer]:2 data[integer]:3 +COMMIT +BEGIN +table public.table_without_key: UPDATE: old-key: id[integer]:2 data[integer]:3 new-tuple: id[integer]:-2 data[integer]:3 +COMMIT +BEGIN +table public.table_without_key: UPDATE: old-key: id[integer]:-2 data[integer]:3 new-tuple: id[integer]:2 data[integer]:3 +COMMIT +BEGIN +table public.table_without_key: UPDATE: old-key: id[integer]:2 data[integer]:3 new-tuple: id[integer]:-2 data[integer]:3 new_column[text]:null +COMMIT +BEGIN +table public.table_without_key: UPDATE: old-key: id[integer]:-2 data[integer]:3 new-tuple: id[integer]:2 data[integer]:3 new_column[text]:'someval' +COMMIT +BEGIN +table public.table_without_key: DELETE: id[integer]:2 data[integer]:3 new_column[text]:'someval' +COMMIT +BEGIN +table public.table_with_pkey: INSERT: id[integer]:1 data[integer]:1 +table public.table_with_pkey: INSERT: id[integer]:2 data[integer]:2 +COMMIT +BEGIN +table public.table_with_pkey: DELETE: id[integer]:1 +COMMIT +BEGIN +table public.table_with_pkey: UPDATE: id[integer]:2 data[integer]:3 +COMMIT +BEGIN +table public.table_with_pkey: UPDATE: old-key: id[integer]:2 new-tuple: id[integer]:-2 data[integer]:3 +COMMIT +BEGIN +table public.table_with_pkey: UPDATE: old-key: id[integer]:-2 new-tuple: id[integer]:2 data[integer]:3 +COMMIT +BEGIN +table public.table_with_pkey: UPDATE: old-key: id[integer]:2 new-tuple: id[integer]:-2 data[integer]:3 +COMMIT +BEGIN +table public.table_with_pkey: UPDATE: old-key: id[integer]:-2 new-tuple: id[integer]:2 data[integer]:3 +COMMIT +BEGIN +table public.table_with_pkey: DELETE: id[integer]:2 +COMMIT +BEGIN +table public.table_with_unique_not_null: INSERT: id[integer]:1 data[integer]:1 +table public.table_with_unique_not_null: INSERT: id[integer]:2 data[integer]:2 +COMMIT +BEGIN +table public.table_with_unique_not_null: DELETE: (no-tuple-data) +COMMIT +BEGIN +table public.table_with_unique_not_null: UPDATE: id[integer]:2 data[integer]:3 +COMMIT +BEGIN +table public.table_with_unique_not_null: UPDATE: id[integer]:-2 data[integer]:3 +COMMIT +BEGIN +table public.table_with_unique_not_null: UPDATE: id[integer]:2 data[integer]:3 +COMMIT +BEGIN +table public.table_with_unique_not_null: DELETE: (no-tuple-data) +COMMIT +BEGIN +table public.table_with_unique_not_null: INSERT: id[integer]:3 data[integer]:1 +table public.table_with_unique_not_null: INSERT: id[integer]:4 data[integer]:2 +COMMIT +BEGIN +table public.table_with_unique_not_null: DELETE: id[integer]:3 +COMMIT +BEGIN +table public.table_with_unique_not_null: UPDATE: id[integer]:4 data[integer]:3 +COMMIT +BEGIN +table public.table_with_unique_not_null: UPDATE: old-key: id[integer]:4 new-tuple: id[integer]:-4 data[integer]:3 +COMMIT +BEGIN +table public.table_with_unique_not_null: UPDATE: old-key: id[integer]:-4 new-tuple: id[integer]:4 data[integer]:3 +COMMIT +BEGIN +table public.table_with_unique_not_null: DELETE: id[integer]:4 +COMMIT +BEGIN +table public.table_dropped_index_with_pk: INSERT: a[integer]:1 b[integer]:1 c[integer]:1 +table public.table_dropped_index_with_pk: INSERT: a[integer]:2 b[integer]:2 c[integer]:2 +table public.table_dropped_index_with_pk: INSERT: a[integer]:3 b[integer]:3 c[integer]:3 +COMMIT +BEGIN +table public.table_dropped_index_with_pk: UPDATE: a[integer]:4 b[integer]:1 c[integer]:1 +COMMIT +BEGIN +table public.table_dropped_index_with_pk: UPDATE: a[integer]:2 b[integer]:5 c[integer]:2 +COMMIT +BEGIN +table public.table_dropped_index_with_pk: UPDATE: a[integer]:3 b[integer]:6 c[integer]:7 +COMMIT +BEGIN +table public.table_dropped_index_with_pk: DELETE: (no-tuple-data) +COMMIT +BEGIN +table public.table_dropped_index_with_pk: DELETE: (no-tuple-data) +COMMIT +BEGIN +table public.table_dropped_index_no_pk: INSERT: a[integer]:1 b[integer]:1 c[integer]:1 +table public.table_dropped_index_no_pk: INSERT: a[integer]:2 b[integer]:2 c[integer]:2 +table public.table_dropped_index_no_pk: INSERT: a[integer]:3 b[integer]:3 c[integer]:3 +COMMIT +BEGIN +table public.table_dropped_index_no_pk: UPDATE: a[integer]:4 b[integer]:1 c[integer]:1 +COMMIT +BEGIN +table public.table_dropped_index_no_pk: UPDATE: a[integer]:2 b[integer]:5 c[integer]:2 +COMMIT +BEGIN +table public.table_dropped_index_no_pk: UPDATE: a[integer]:3 b[integer]:6 c[integer]:7 +COMMIT +BEGIN +table public.table_dropped_index_no_pk: DELETE: (no-tuple-data) +COMMIT +BEGIN +table public.table_dropped_index_no_pk: DELETE: (no-tuple-data) +COMMIT +BEGIN +table public.toasttable: INSERT: id[integer]:1 toasted_col1[text]:'12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000' rand1[double precision]:79 toasted_col2[text]:null rand2[double precision]:1578 +COMMIT +BEGIN +table public.toasttable: INSERT: id[integer]:2 toasted_col1[text]:null rand1[double precision]:3077 toasted_col2[text]:'0001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500000100020003000400050006000700080009001000110012001300140015001600170018001900200021002200230024002500260027002800290030003100320033003400350036003700380039004000410042004300440045004600470048004900500051005200530054005500560057005800590060006100620063006400650066006700680069007000710072007300740075007600770078007900800081008200830084008500860087008800890090009100920093009400950096009700980099010001010102010301040105010601070108010901100111011201130114011501160117011801190120012101220123012401250126012701280129013001310132013301340135013601370138013901400141014201430144014501460147014801490150015101520153015401550156015701580159016001610162016301640165016601670168016901700171017201730174017501760177017801790180018101820183018401850186018701880189019001910192019301940195019601970198019902000201020202030204020502060207020802090210021102120213021402150216021702180219022002210222022302240225022602270228022902300231023202330234023502360237023802390240024102420243024402450246024702480249025002510252025302540255025602570258025902600261026202630264026502660267026802690270027102720273027402750276027702780279028002810282028302840285028602870288028902900291029202930294029502960297029802990300030103020303030403050306030703080309031003110312031303140315031603170318031903200321032203230324032503260327032803290330033103320333033403350336033703380339034003410342034303440345034603470348034903500351035203530354035503560357035803590360036103620363036403650366036703680369037003710372037303740375037603770378037903800381038203830384038503860387038803890390039103920393039403950396039703980399040004010402040304040405040604070408040904100411041204130414041504160417041804190420042104220423042404250426042704280429043004310432043304340435043604370438043904400441044204430444044504460447044804490450045104520453045404550456045704580459046004610462046304640465046604670468046904700471047204730474047504760477047804790480048104820483048404850486048704880489049004910492049304940495049604970498049905000001000200030004000500060007000800090010001100120013001400150016001700180019002000210022002300240025002600270028002900300031003200330034003500360037003800390040004100420043004400450046004700480049005000510052005300540055005600570058005900600061006200630064006500660067006800690070007100720073007400750076007700780079008000810082008300840085008600870088008900900091009200930094009500960097009800990100010101020103010401050106010701080109011001110112011301140115011601170118011901200121012201230124012501260127012801290130013101320133013401350136013701380139014001410142014301440145014601470148014901500151015201530154015501560157015801590160016101620163016401650166016701680169017001710172017301740175017601770178017901800181018201830184018501860187018801890190019101920193019401950196019701980199020002010202020302040205020602070208020902100211021202130214021502160217021802190220022102220223022402250226022702280229023002310232023302340235023602370238023902400241024202430244024502460247024802490250025102520253025402550256025702580259026002610262026302640265026602670268026902700271027202730274027502760277027802790280028102820283028402850286028702880289029002910292029302940295029602970298029903000301030203030304030503060307030803090310031103120313031403150316031703180319032003210322032303240325032603270328032903300331033203330334033503360337033803390340034103420343034403450346034703480349035003510352035303540355035603570358035903600361036203630364036503660367036803690370037103720373037403750376037703780379038003810382038303840385038603870388038903900391039203930394039503960397039803990400040104020403040404050406040704080409041004110412041304140415041604170418041904200421042204230424042504260427042804290430043104320433043404350436043704380439044004410442044304440445044604470448044904500451045204530454045504560457045804590460046104620463046404650466046704680469047004710472047304740475047604770478047904800481048204830484048504860487048804890490049104920493049404950496049704980499050000010002000300040005000600070008000900100011001200130014001500160017001800190020002100220023002400250026002700280029003000310032003300340035003600370038003900400041004200430044004500460047004800490050005100520053005400550056005700580059006000610062006300640065006600670068006900700071007200730074007500760077007800790080008100820083008400850086008700880089009000910092009300940095009600970098009901000101010201030104010501060107010801090110011101120113011401150116011701180119012001210122012301240125012601270128012901300131013201330134013501360137013801390140014101420143014401450146014701480149015001510152015301540155015601570158015901600161016201630164016501660167016801690170017101720173017401750176017701780179018001810182018301840185018601870188018901900191019201930194019501960197019801990200020102020203020402050206020702080209021002110212021302140215021602170218021902200221022202230224022502260227022802290230023102320233023402350236023702380239024002410242024302440245024602470248024902500251025202530254025502560257025802590260026102620263026402650266026702680269027002710272027302740275027602770278027902800281028202830284028502860287028802890290029102920293029402950296029702980299030003010302030303040305030603070308030903100311031203130314031503160317031803190320032103220323032403250326032703280329033003310332033303340335033603370338033903400341034203430344034503460347034803490350035103520353035403550356035703580359036003610362036303640365036603670368036903700371037203730374037503760377037803790380038103820383038403850386038703880389039003910392039303940395039603970398039904000401040204030404040504060407040804090410041104120413041404150416041704180419042004210422042304240425042604270428042904300431043204330434043504360437043804390440044104420443044404450446044704480449045004510452045304540455045604570458045904600461046204630464046504660467046804690470047104720473047404750476047704780479048004810482048304840485048604870488048904900491049204930494049504960497049804990500' rand2[double precision]:4576 +COMMIT +BEGIN +table public.toasttable: UPDATE: id[integer]:1 toasted_col1[text]:'12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000' rand1[double precision]:79 toasted_col2[text]:null rand2[double precision]:1578 +COMMIT (143 rows) - +\pset format aligned INSERT INTO toasttable(toasted_col1) SELECT string_agg(g.i::text, '') FROM generate_series(1, 2000) g(i); -- update of second column, first column unchanged UPDATE toasttable @@ -814,23 +816,21 @@ UPDATE toasttable WHERE id = 1; -- make sure we decode correctly even if the toast table is gone DROP TABLE toasttable; +\pset format unaligned SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - data ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - BEGIN - table public.toasttable: INSERT: id[integer]:3 toasted_col1[text]:'12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000' rand1[double precision]:6075 toasted_col2[text]:null rand2[double precision]:7574 - COMMIT - BEGIN - table public.toasttable: UPDATE: id[integer]:1 toasted_col1[text]:unchanged-toast-datum rand1[double precision]:79 toasted_col2[text]:'12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000' rand2[double precision]:1578 - COMMIT +data +BEGIN +table public.toasttable: INSERT: id[integer]:3 toasted_col1[text]:'12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000' rand1[double precision]:6075 toasted_col2[text]:null rand2[double precision]:7574 +COMMIT +BEGIN +table public.toasttable: UPDATE: id[integer]:1 toasted_col1[text]:unchanged-toast-datum rand1[double precision]:79 toasted_col2[text]:'12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000' rand2[double precision]:1578 +COMMIT (6 rows) - -- done, free logical replication slot SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - data ------- +data (0 rows) - +\pset format aligned SELECT pg_drop_replication_slot('regression_slot'); pg_drop_replication_slot -------------------------- diff --git a/contrib/test_decoding/expected/decoding_in_xact.out b/contrib/test_decoding/expected/decoding_in_xact.out index b65253f463091..ac03ff120300d 100644 --- a/contrib/test_decoding/expected/decoding_in_xact.out +++ b/contrib/test_decoding/expected/decoding_in_xact.out @@ -79,6 +79,54 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc COMMIT (6 rows) +-- Decoding works in transaction that issues DDL +-- +-- We had issues handling relcache invalidations with these, see +-- https://www.postgresql.org/message-id/e56be7d9-14b1-664d-0bfc-00ce9772721c@gmail.com +CREATE TABLE tbl_created_outside_xact(id SERIAL PRIMARY KEY); +BEGIN; + -- TRUNCATE changes the relfilenode and sends relcache invalidation + TRUNCATE tbl_created_outside_xact; + INSERT INTO tbl_created_outside_xact(id) VALUES('1'); + -- don't show yet, haven't committed + SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); + data +------ +(0 rows) + +COMMIT; +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); + data +-------------------------------------------------------------- + BEGIN + table public.tbl_created_outside_xact: TRUNCATE: (no-flags) + table public.tbl_created_outside_xact: INSERT: id[integer]:1 + COMMIT +(4 rows) + +SET debug_logical_replication_streaming = immediate; +BEGIN; + CREATE TABLE tbl_created_in_xact(id SERIAL PRIMARY KEY); + INSERT INTO tbl_created_in_xact VALUES (1); + CHECKPOINT; -- Force WAL flush, so that the above changes will be streamed + SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); + data +------------------------------------------ + opening a streamed block for transaction + streaming change for transaction + closing a streamed block for transaction +(3 rows) + +COMMIT; +RESET debug_logical_replication_streaming; +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); + data +--------------------------------------------------------- + BEGIN + table public.tbl_created_in_xact: INSERT: id[integer]:1 + COMMIT +(3 rows) + SELECT 'stop' FROM pg_drop_replication_slot('regression_slot'); ?column? ---------- diff --git a/contrib/test_decoding/expected/invalidation_distribution.out b/contrib/test_decoding/expected/invalidation_distribution.out new file mode 100644 index 0000000000000..ad0a944cbf303 --- /dev/null +++ b/contrib/test_decoding/expected/invalidation_distribution.out @@ -0,0 +1,20 @@ +Parsed test spec with 2 sessions + +starting permutation: s1_insert_tbl1 s1_begin s1_insert_tbl1 s2_alter_pub_add_tbl s1_commit s1_insert_tbl1 s2_get_binary_changes +step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1); +step s1_begin: BEGIN; +step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1); +step s2_alter_pub_add_tbl: ALTER PUBLICATION pub ADD TABLE tbl1; +step s1_commit: COMMIT; +step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1); +step s2_get_binary_changes: SELECT count(data) FROM pg_logical_slot_get_binary_changes('isolation_slot', NULL, NULL, 'proto_version', '4', 'publication_names', 'pub') WHERE get_byte(data, 0) = 73; +count +----- + 1 +(1 row) + +?column? +-------- +stop +(1 row) + diff --git a/contrib/test_decoding/expected/messages.out b/contrib/test_decoding/expected/messages.out index c75d40190b6e9..84baf8af3ee87 100644 --- a/contrib/test_decoding/expected/messages.out +++ b/contrib/test_decoding/expected/messages.out @@ -6,13 +6,14 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_d init (1 row) -SELECT 'msg1' FROM pg_logical_emit_message(true, 'test', 'msg1'); +-- These two cover the path for the flush variant. +SELECT 'msg1' FROM pg_logical_emit_message(true, 'test', 'msg1', true); ?column? ---------- msg1 (1 row) -SELECT 'msg2' FROM pg_logical_emit_message(false, 'test', 'msg2'); +SELECT 'msg2' FROM pg_logical_emit_message(false, 'test', 'msg2', true); ?column? ---------- msg2 @@ -58,17 +59,23 @@ SELECT 'ignorethis' FROM pg_logical_emit_message(true, 'test', 'czechtastic'); ignorethis (1 row) -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'force-binary', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'force-binary', '0', 'skip-empty-xacts', '1', 'include-xids', '0'); data -------------------------------------------------------------------- + BEGIN message: transactional: 1 prefix: test, sz: 4 content:msg1 + COMMIT message: transactional: 0 prefix: test, sz: 4 content:msg2 message: transactional: 0 prefix: test, sz: 4 content:msg4 message: transactional: 0 prefix: test, sz: 4 content:msg6 + BEGIN message: transactional: 1 prefix: test, sz: 4 content:msg5 message: transactional: 1 prefix: test, sz: 4 content:msg7 + COMMIT + BEGIN message: transactional: 1 prefix: test, sz: 11 content:czechtastic -(7 rows) + COMMIT +(13 rows) -- test db filtering \set prevdb :DBNAME diff --git a/contrib/test_decoding/expected/oldest_xmin.out b/contrib/test_decoding/expected/oldest_xmin.out index dd6053f9c1f4b..57268b38d3322 100644 --- a/contrib/test_decoding/expected/oldest_xmin.out +++ b/contrib/test_decoding/expected/oldest_xmin.out @@ -38,3 +38,44 @@ COMMIT stop (1 row) + +starting permutation: s0_begin s0_getxid s1_begin s1_insert s0_alter s0_commit s0_checkpoint s0_advance_slot s0_advance_slot s1_commit s0_vacuum s0_get_changes +step s0_begin: BEGIN; +step s0_getxid: SELECT pg_current_xact_id() IS NULL; +?column? +-------- +f +(1 row) + +step s1_begin: BEGIN; +step s1_insert: INSERT INTO harvest VALUES ((1, 2, 3)); +step s0_alter: ALTER TYPE basket DROP ATTRIBUTE mangos; +step s0_commit: COMMIT; +step s0_checkpoint: CHECKPOINT; +step s0_advance_slot: SELECT slot_name FROM pg_replication_slot_advance('isolation_slot', pg_current_wal_lsn()); +slot_name +-------------- +isolation_slot +(1 row) + +step s0_advance_slot: SELECT slot_name FROM pg_replication_slot_advance('isolation_slot', pg_current_wal_lsn()); +slot_name +-------------- +isolation_slot +(1 row) + +step s1_commit: COMMIT; +step s0_vacuum: VACUUM pg_attribute; +step s0_get_changes: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +data +------------------------------------------------------ +BEGIN +table public.harvest: INSERT: fruits[basket]:'(1,2,3)' +COMMIT +(3 rows) + +?column? +-------- +stop +(1 row) + diff --git a/contrib/test_decoding/expected/permissions.out b/contrib/test_decoding/expected/permissions.out index d6eaba8c55d68..8d100646ce642 100644 --- a/contrib/test_decoding/expected/permissions.out +++ b/contrib/test_decoding/expected/permissions.out @@ -64,6 +64,9 @@ DETAIL: Only roles with the REPLICATION attribute may use replication slots. SELECT pg_drop_replication_slot('regression_slot'); ERROR: permission denied to use replication slots DETAIL: Only roles with the REPLICATION attribute may use replication slots. +SELECT pg_sync_replication_slots(); +ERROR: permission denied to use replication slots +DETAIL: Only roles with the REPLICATION attribute may use replication slots. RESET ROLE; -- replication users can drop superuser created slots SET ROLE regress_lr_superuser; diff --git a/contrib/test_decoding/expected/replorigin.out b/contrib/test_decoding/expected/replorigin.out index 49ffaeea2da8b..c85e1a01b231c 100644 --- a/contrib/test_decoding/expected/replorigin.out +++ b/contrib/test_decoding/expected/replorigin.out @@ -267,3 +267,59 @@ SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot_no_lsn (1 row) +-- Test that the pgoutput correctly filters changes corresponding to the provided origin value. +SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'pgoutput'); + ?column? +---------- + init +(1 row) + +CREATE PUBLICATION pub FOR TABLE target_tbl; +SELECT pg_replication_origin_create('regress_test_decoding: regression_slot'); + pg_replication_origin_create +------------------------------ + 1 +(1 row) + +-- mark session as replaying +SELECT pg_replication_origin_session_setup('regress_test_decoding: regression_slot'); + pg_replication_origin_session_setup +------------------------------------- + +(1 row) + +INSERT INTO target_tbl(data) VALUES ('test data'); +-- The replayed change will be filtered. +SELECT count(*) = 0 FROM pg_logical_slot_peek_binary_changes('regression_slot', NULL, NULL, 'proto_version', '4', 'publication_names', 'pub', 'origin', 'none'); + ?column? +---------- + t +(1 row) + +-- The replayed change will be output if the origin value is not specified. +SELECT count(*) != 0 FROM pg_logical_slot_peek_binary_changes('regression_slot', NULL, NULL, 'proto_version', '4', 'publication_names', 'pub'); + ?column? +---------- + t +(1 row) + +-- Clean up +SELECT pg_replication_origin_session_reset(); + pg_replication_origin_session_reset +------------------------------------- + +(1 row) + +SELECT pg_drop_replication_slot('regression_slot'); + pg_drop_replication_slot +-------------------------- + +(1 row) + +SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot'); + pg_replication_origin_drop +---------------------------- + +(1 row) + +DROP PUBLICATION pub; diff --git a/contrib/test_decoding/expected/skip_snapshot_restore.out b/contrib/test_decoding/expected/skip_snapshot_restore.out new file mode 100644 index 0000000000000..c64dbd9c4e0e8 --- /dev/null +++ b/contrib/test_decoding/expected/skip_snapshot_restore.out @@ -0,0 +1,45 @@ +Parsed test spec with 3 sessions + +starting permutation: s0_init s0_begin s0_insert1 s1_init s2_checkpoint s2_get_changes_slot0 s0_insert2 s0_commit s1_get_changes_slot0 s1_get_changes_slot1 +step s0_init: SELECT 'init' FROM pg_create_logical_replication_slot('slot0', 'test_decoding'); +?column? +-------- +init +(1 row) + +step s0_begin: BEGIN; +step s0_insert1: INSERT INTO tbl VALUES (1); +step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('slot1', 'test_decoding'); +step s2_checkpoint: CHECKPOINT; +step s2_get_changes_slot0: SELECT data FROM pg_logical_slot_get_changes('slot0', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); +data +---- +(0 rows) + +step s0_insert2: INSERT INTO tbl VALUES (2); +step s0_commit: COMMIT; +step s1_init: <... completed> +?column? +-------- +init +(1 row) + +step s1_get_changes_slot0: SELECT data FROM pg_logical_slot_get_changes('slot0', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); +data +----------------------------------------- +BEGIN +table public.tbl: INSERT: val1[integer]:1 +table public.tbl: INSERT: val1[integer]:2 +COMMIT +(4 rows) + +step s1_get_changes_slot1: SELECT data FROM pg_logical_slot_get_changes('slot1', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); +data +---- +(0 rows) + +?column? +-------- +stop +(1 row) + diff --git a/contrib/test_decoding/expected/slot.out b/contrib/test_decoding/expected/slot.out index 63a9940f73abe..7de03c79f6f01 100644 --- a/contrib/test_decoding/expected/slot.out +++ b/contrib/test_decoding/expected/slot.out @@ -220,7 +220,7 @@ ORDER BY o.slot_name, c.slot_name; -- released even when raise error during creating the target slot. SELECT 'copy' FROM pg_copy_logical_replication_slot('orig_slot1', 'failed'); -- error ERROR: all replication slots are in use -HINT: Free one or increase max_replication_slots. +HINT: Free one or increase "max_replication_slots". -- temporary slots were dropped automatically SELECT pg_drop_replication_slot('orig_slot1'); pg_drop_replication_slot @@ -406,3 +406,63 @@ SELECT pg_drop_replication_slot('copied_slot2_notemp'); (1 row) +-- Test failover option of slots. +SELECT 'init' FROM pg_create_logical_replication_slot('failover_true_slot', 'test_decoding', false, false, true); + ?column? +---------- + init +(1 row) + +SELECT 'init' FROM pg_create_logical_replication_slot('failover_false_slot', 'test_decoding', false, false, false); + ?column? +---------- + init +(1 row) + +SELECT 'init' FROM pg_create_logical_replication_slot('failover_default_slot', 'test_decoding', false, false); + ?column? +---------- + init +(1 row) + +SELECT 'init' FROM pg_create_logical_replication_slot('failover_true_temp_slot', 'test_decoding', true, false, true); +ERROR: cannot enable failover for a temporary replication slot +SELECT 'init' FROM pg_create_physical_replication_slot('physical_slot'); + ?column? +---------- + init +(1 row) + +SELECT slot_name, slot_type, failover FROM pg_replication_slots; + slot_name | slot_type | failover +-----------------------+-----------+---------- + failover_true_slot | logical | t + failover_false_slot | logical | f + failover_default_slot | logical | f + physical_slot | physical | f +(4 rows) + +SELECT pg_drop_replication_slot('failover_true_slot'); + pg_drop_replication_slot +-------------------------- + +(1 row) + +SELECT pg_drop_replication_slot('failover_false_slot'); + pg_drop_replication_slot +-------------------------- + +(1 row) + +SELECT pg_drop_replication_slot('failover_default_slot'); + pg_drop_replication_slot +-------------------------- + +(1 row) + +SELECT pg_drop_replication_slot('physical_slot'); + pg_drop_replication_slot +-------------------------- + +(1 row) + diff --git a/contrib/test_decoding/expected/stream.out b/contrib/test_decoding/expected/stream.out index 0f21dcb8e0e44..a76f77601e26f 100644 --- a/contrib/test_decoding/expected/stream.out +++ b/contrib/test_decoding/expected/stream.out @@ -29,7 +29,10 @@ COMMIT; SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL,NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); data ---------------------------------------------------------- + opening a streamed block for transaction streaming message: transactional: 1 prefix: test, sz: 50 + closing a streamed block for transaction + aborting streamed (sub)transaction opening a streamed block for transaction streaming change for transaction streaming change for transaction @@ -53,7 +56,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL,NULL, 'incl streaming change for transaction closing a streamed block for transaction committing streamed transaction -(24 rows) +(27 rows) -- streaming test for toast changes ALTER TABLE stream_test ALTER COLUMN data set storage external; @@ -106,6 +109,25 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL,NULL, 'incl committing streamed transaction (17 rows) +/* + * Test concurrent abort with toast data. When streaming the second insertion, we + * detect that the subtransaction was aborted, and reset the transaction while having + * the TOAST changes in memory, resulting in deallocating both decoded changes and + * TOAST reconstruction data. Memory usage counters must be updated correctly. + */ +BEGIN; +INSERT INTO stream_test SELECT repeat(string_agg(to_char(g.i, 'FM0000'), ''), 50) FROM generate_series(1, 500) g(i); +ALTER TABLE stream_test ADD COLUMN i INT; +SAVEPOINT s1; +INSERT INTO stream_test(data, i) SELECT repeat(string_agg(to_char(g.i, 'FM0000'), ''), 50), 1 FROM generate_series(1, 500) g(i); +ROLLBACK TO s1; +COMMIT; +SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); + count +------- + 5 +(1 row) + DROP TABLE stream_test; SELECT pg_drop_replication_slot('regression_slot'); pg_drop_replication_slot diff --git a/contrib/test_decoding/expected/twophase.out b/contrib/test_decoding/expected/twophase.out index e89dc74a5e449..08a7c56b5dfb5 100644 --- a/contrib/test_decoding/expected/twophase.out +++ b/contrib/test_decoding/expected/twophase.out @@ -205,10 +205,34 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'inc COMMIT (3 rows) +-- Test that accessing a TOAST table is permitted during the decoding of a +-- prepared transaction. +-- Create a table with a column that uses a TOASTed default value. +-- (temporarily hide query, to avoid the long CREATE TABLE stmt) +\set ECHO none +BEGIN; +INSERT INTO test_tab VALUES('test'); +PREPARE TRANSACTION 'test_toast_table_access'; +SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); + count +------- + 3 +(1 row) + +COMMIT PREPARED 'test_toast_table_access'; +-- consume commit prepared +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); + data +------------------------------------------- + COMMIT PREPARED 'test_toast_table_access' +(1 row) + -- Test 8: -- cleanup and make sure results are also empty DROP TABLE test_prepared1; DROP TABLE test_prepared2; +DROP TABLE test_prepared_savepoint; +DROP TABLE test_tab; -- show results. There should be nothing to show SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data diff --git a/contrib/test_decoding/expected/twophase_stream.out b/contrib/test_decoding/expected/twophase_stream.out index b08bb0e5730be..a3574f73c8e85 100644 --- a/contrib/test_decoding/expected/twophase_stream.out +++ b/contrib/test_decoding/expected/twophase_stream.out @@ -31,7 +31,10 @@ PREPARE TRANSACTION 'test1'; SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL,NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); data ---------------------------------------------------------- + opening a streamed block for transaction streaming message: transactional: 1 prefix: test, sz: 50 + closing a streamed block for transaction + aborting streamed (sub)transaction opening a streamed block for transaction streaming change for transaction streaming change for transaction @@ -55,7 +58,7 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL,NULL, 'incl streaming change for transaction closing a streamed block for transaction preparing streamed transaction 'test1' -(24 rows) +(27 rows) COMMIT PREPARED 'test1'; --should show the COMMIT PREPARED and the other changes in the transaction @@ -84,8 +87,11 @@ PREPARE TRANSACTION 'test1_nodecode'; SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL,NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); data ---------------------------------------------------------- + opening a streamed block for transaction streaming message: transactional: 1 prefix: test, sz: 50 -(1 row) + closing a streamed block for transaction + aborting streamed (sub)transaction +(4 rows) COMMIT PREPARED 'test1_nodecode'; -- should show the inserts but not show a COMMIT PREPARED but a COMMIT diff --git a/contrib/test_decoding/meson.build b/contrib/test_decoding/meson.build index 7b05cc25a3630..03dd80b7f1967 100644 --- a/contrib/test_decoding/meson.build +++ b/contrib/test_decoding/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_decoding_sources = files( 'test_decoding.c', @@ -62,6 +62,8 @@ tests += { 'concurrent_stream', 'twophase_snapshot', 'slot_creation_error', + 'skip_snapshot_restore', + 'invalidation_distribution', ], 'regress_args': [ '--temp-config', files('logical.conf'), diff --git a/contrib/test_decoding/specs/concurrent_stream.spec b/contrib/test_decoding/specs/concurrent_stream.spec index 54218a4b3f655..7b5c3ec79d883 100644 --- a/contrib/test_decoding/specs/concurrent_stream.spec +++ b/contrib/test_decoding/specs/concurrent_stream.spec @@ -8,7 +8,7 @@ setup -- consume DDL SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); - CREATE OR REPLACE FUNCTION large_val() RETURNS TEXT LANGUAGE SQL AS 'select array_agg(md5(g::text))::text from generate_series(1, 80000) g'; + CREATE OR REPLACE FUNCTION large_val() RETURNS bytea LANGUAGE SQL AS $$ select string_agg(sha256(g::text::bytea), '') from generate_series(1, 83000) g $$; } teardown @@ -21,11 +21,11 @@ teardown session "s0" setup { SET synchronous_commit=on; } step "s0_begin" { BEGIN; } -step "s0_ddl" {CREATE TABLE stream_test1(data text);} +step "s0_ddl" {CREATE TABLE stream_test1(data bytea);} session "s2" setup { SET synchronous_commit=on; } -step "s2_ddl" {CREATE TABLE stream_test2(data text);} +step "s2_ddl" {CREATE TABLE stream_test2(data bytea);} # The transaction commit for s1_ddl will add the INTERNAL_SNAPSHOT change to # the currently running s0_ddl and we want to test that s0_ddl should not get @@ -34,7 +34,7 @@ step "s2_ddl" {CREATE TABLE stream_test2(data text);} # what gets streamed. session "s1" setup { SET synchronous_commit=on; } -step "s1_ddl" { CREATE TABLE stream_test(data text); } +step "s1_ddl" { CREATE TABLE stream_test(data bytea); } step "s1_begin" { BEGIN; } step "s1_toast_insert" {INSERT INTO stream_test SELECT large_val();} step "s1_commit" { COMMIT; } diff --git a/contrib/test_decoding/specs/invalidation_distribution.spec b/contrib/test_decoding/specs/invalidation_distribution.spec new file mode 100644 index 0000000000000..decbed627e327 --- /dev/null +++ b/contrib/test_decoding/specs/invalidation_distribution.spec @@ -0,0 +1,32 @@ +# Test that catalog cache invalidation messages are distributed to ongoing +# transactions, ensuring they can access the updated catalog content after +# processing these messages. +setup +{ + SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'pgoutput'); + CREATE TABLE tbl1(val1 integer, val2 integer); + CREATE PUBLICATION pub; +} + +teardown +{ + DROP TABLE tbl1; + DROP PUBLICATION pub; + SELECT 'stop' FROM pg_drop_replication_slot('isolation_slot'); +} + +session "s1" +setup { SET synchronous_commit=on; } + +step "s1_begin" { BEGIN; } +step "s1_insert_tbl1" { INSERT INTO tbl1 (val1, val2) VALUES (1, 1); } +step "s1_commit" { COMMIT; } + +session "s2" +setup { SET synchronous_commit=on; } + +step "s2_alter_pub_add_tbl" { ALTER PUBLICATION pub ADD TABLE tbl1; } +step "s2_get_binary_changes" { SELECT count(data) FROM pg_logical_slot_get_binary_changes('isolation_slot', NULL, NULL, 'proto_version', '4', 'publication_names', 'pub') WHERE get_byte(data, 0) = 73; } + +# Expect to get one insert change. LOGICAL_REP_MSG_INSERT = 'I' +permutation "s1_insert_tbl1" "s1_begin" "s1_insert_tbl1" "s2_alter_pub_add_tbl" "s1_commit" "s1_insert_tbl1" "s2_get_binary_changes" diff --git a/contrib/test_decoding/specs/oldest_xmin.spec b/contrib/test_decoding/specs/oldest_xmin.spec index 88bd30f5ff76c..7f2fe3d7ed776 100644 --- a/contrib/test_decoding/specs/oldest_xmin.spec +++ b/contrib/test_decoding/specs/oldest_xmin.spec @@ -25,6 +25,7 @@ step "s0_commit" { COMMIT; } step "s0_checkpoint" { CHECKPOINT; } step "s0_vacuum" { VACUUM pg_attribute; } step "s0_get_changes" { SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); } +step "s0_advance_slot" { SELECT slot_name FROM pg_replication_slot_advance('isolation_slot', pg_current_wal_lsn()); } session "s1" setup { SET synchronous_commit=on; } @@ -40,3 +41,7 @@ step "s1_commit" { COMMIT; } # will be removed (xmax set) before T1 commits. That is, interlocking doesn't # forbid modifying catalog after someone read it (and didn't commit yet). permutation "s0_begin" "s0_getxid" "s1_begin" "s1_insert" "s0_alter" "s0_commit" "s0_checkpoint" "s0_get_changes" "s0_get_changes" "s1_commit" "s0_vacuum" "s0_get_changes" + +# Perform the same testing process as described above, but use advance_slot to +# forces xmin advancement during fast forward decoding. +permutation "s0_begin" "s0_getxid" "s1_begin" "s1_insert" "s0_alter" "s0_commit" "s0_checkpoint" "s0_advance_slot" "s0_advance_slot" "s1_commit" "s0_vacuum" "s0_get_changes" diff --git a/contrib/test_decoding/specs/skip_snapshot_restore.spec b/contrib/test_decoding/specs/skip_snapshot_restore.spec new file mode 100644 index 0000000000000..3f1fb6f02c778 --- /dev/null +++ b/contrib/test_decoding/specs/skip_snapshot_restore.spec @@ -0,0 +1,46 @@ +# Test that a slot creation skips to restore serialized snapshot to reach +# the consistent state. + +setup +{ + DROP TABLE IF EXISTS tbl; + CREATE TABLE tbl (val1 integer); +} + +teardown +{ + DROP TABLE tbl; + SELECT 'stop' FROM pg_drop_replication_slot('slot0'); + SELECT 'stop' FROM pg_drop_replication_slot('slot1'); +} + +session "s0" +setup { SET synchronous_commit = on; } +step "s0_init" { SELECT 'init' FROM pg_create_logical_replication_slot('slot0', 'test_decoding'); } +step "s0_begin" { BEGIN; } +step "s0_insert1" { INSERT INTO tbl VALUES (1); } +step "s0_insert2" { INSERT INTO tbl VALUES (2); } +step "s0_commit" { COMMIT; } + +session "s1" +setup { SET synchronous_commit = on; } +step "s1_init" { SELECT 'init' FROM pg_create_logical_replication_slot('slot1', 'test_decoding'); } +step "s1_get_changes_slot0" { SELECT data FROM pg_logical_slot_get_changes('slot0', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); } +step "s1_get_changes_slot1" { SELECT data FROM pg_logical_slot_get_changes('slot1', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); } + +session "s2" +setup { SET synchronous_commit = on ;} +step "s2_checkpoint" { CHECKPOINT; } +step "s2_get_changes_slot0" { SELECT data FROM pg_logical_slot_get_changes('slot0', NULL, NULL, 'skip-empty-xacts', '1', 'include-xids', '0'); } + + +# While 'slot1' creation by "s1_init" waits for s0-transaction to commit, the +# RUNNING_XACTS record is written by "s2_checkpoint" and "s2_get_changes_slot1" +# serializes consistent snapshots to the disk at LSNs where are before +# s0-transaction's commit. After s0-transaction commits, "s1_init" resumes but +# must not restore any serialized snapshots and will reach the consistent state +# when decoding a RUNNING_XACT record generated after s0-transaction's commit. +# We check if the get_changes on 'slot1' will not return any s0-transaction's +# changes as its confirmed_flush_lsn will be after the s0-transaction's commit +# record. +permutation "s0_init" "s0_begin" "s0_insert1" "s1_init" "s2_checkpoint" "s2_get_changes_slot0" "s0_insert2" "s0_commit" "s1_get_changes_slot0" "s1_get_changes_slot1" diff --git a/contrib/test_decoding/sql/ddl.sql b/contrib/test_decoding/sql/ddl.sql index 57285a828c7b8..2f8e4e7f2ccfa 100644 --- a/contrib/test_decoding/sql/ddl.sql +++ b/contrib/test_decoding/sql/ddl.sql @@ -414,7 +414,11 @@ UPDATE toasttable SET toasted_col1 = (SELECT string_agg(g.i::text, '') FROM generate_series(1, 2000) g(i)) WHERE id = 1; +-- This output is extremely wide, and using aligned mode causes psql to +-- produce 200kB of useless dashes. Turn that off temporarily to avoid it. +\pset format unaligned SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +\pset format aligned INSERT INTO toasttable(toasted_col1) SELECT string_agg(g.i::text, '') FROM generate_series(1, 2000) g(i); @@ -426,10 +430,12 @@ WHERE id = 1; -- make sure we decode correctly even if the toast table is gone DROP TABLE toasttable; +\pset format unaligned SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); -- done, free logical replication slot SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +\pset format aligned SELECT pg_drop_replication_slot('regression_slot'); diff --git a/contrib/test_decoding/sql/decoding_in_xact.sql b/contrib/test_decoding/sql/decoding_in_xact.sql index 108782dc2e98d..233ade5b6ce85 100644 --- a/contrib/test_decoding/sql/decoding_in_xact.sql +++ b/contrib/test_decoding/sql/decoding_in_xact.sql @@ -38,4 +38,31 @@ COMMIT; INSERT INTO nobarf(data) VALUES('3'); SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +-- Decoding works in transaction that issues DDL +-- +-- We had issues handling relcache invalidations with these, see +-- https://www.postgresql.org/message-id/e56be7d9-14b1-664d-0bfc-00ce9772721c@gmail.com +CREATE TABLE tbl_created_outside_xact(id SERIAL PRIMARY KEY); +BEGIN; + -- TRUNCATE changes the relfilenode and sends relcache invalidation + TRUNCATE tbl_created_outside_xact; + INSERT INTO tbl_created_outside_xact(id) VALUES('1'); + + -- don't show yet, haven't committed + SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +COMMIT; +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); + +SET debug_logical_replication_streaming = immediate; +BEGIN; + CREATE TABLE tbl_created_in_xact(id SERIAL PRIMARY KEY); + INSERT INTO tbl_created_in_xact VALUES (1); + + CHECKPOINT; -- Force WAL flush, so that the above changes will be streamed + + SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); +COMMIT; +RESET debug_logical_replication_streaming; +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); + SELECT 'stop' FROM pg_drop_replication_slot('regression_slot'); diff --git a/contrib/test_decoding/sql/messages.sql b/contrib/test_decoding/sql/messages.sql index cf3f7738e5788..1f3dcb63ee72a 100644 --- a/contrib/test_decoding/sql/messages.sql +++ b/contrib/test_decoding/sql/messages.sql @@ -3,8 +3,9 @@ SET synchronous_commit = on; SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); -SELECT 'msg1' FROM pg_logical_emit_message(true, 'test', 'msg1'); -SELECT 'msg2' FROM pg_logical_emit_message(false, 'test', 'msg2'); +-- These two cover the path for the flush variant. +SELECT 'msg1' FROM pg_logical_emit_message(true, 'test', 'msg1', true); +SELECT 'msg2' FROM pg_logical_emit_message(false, 'test', 'msg2', true); BEGIN; SELECT 'msg3' FROM pg_logical_emit_message(true, 'test', 'msg3'); @@ -19,7 +20,7 @@ COMMIT; SELECT 'ignorethis' FROM pg_logical_emit_message(true, 'test', 'czechtastic'); -SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'force-binary', '0', 'skip-empty-xacts', '1'); +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'force-binary', '0', 'skip-empty-xacts', '1', 'include-xids', '0'); -- test db filtering \set prevdb :DBNAME diff --git a/contrib/test_decoding/sql/permissions.sql b/contrib/test_decoding/sql/permissions.sql index 312b514593744..94db936aee253 100644 --- a/contrib/test_decoding/sql/permissions.sql +++ b/contrib/test_decoding/sql/permissions.sql @@ -29,6 +29,7 @@ SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_d INSERT INTO lr_test VALUES('lr_superuser_init'); SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); SELECT pg_drop_replication_slot('regression_slot'); +SELECT pg_sync_replication_slots(); RESET ROLE; -- replication users can drop superuser created slots diff --git a/contrib/test_decoding/sql/replorigin.sql b/contrib/test_decoding/sql/replorigin.sql index db06541f56559..e71ee02d050a0 100644 --- a/contrib/test_decoding/sql/replorigin.sql +++ b/contrib/test_decoding/sql/replorigin.sql @@ -124,3 +124,25 @@ SELECT data FROM pg_logical_slot_get_changes('regression_slot_no_lsn', NULL, NUL SELECT pg_replication_origin_session_reset(); SELECT pg_drop_replication_slot('regression_slot_no_lsn'); SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot_no_lsn'); + +-- Test that the pgoutput correctly filters changes corresponding to the provided origin value. +SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'pgoutput'); +CREATE PUBLICATION pub FOR TABLE target_tbl; +SELECT pg_replication_origin_create('regress_test_decoding: regression_slot'); + +-- mark session as replaying +SELECT pg_replication_origin_session_setup('regress_test_decoding: regression_slot'); + +INSERT INTO target_tbl(data) VALUES ('test data'); + +-- The replayed change will be filtered. +SELECT count(*) = 0 FROM pg_logical_slot_peek_binary_changes('regression_slot', NULL, NULL, 'proto_version', '4', 'publication_names', 'pub', 'origin', 'none'); + +-- The replayed change will be output if the origin value is not specified. +SELECT count(*) != 0 FROM pg_logical_slot_peek_binary_changes('regression_slot', NULL, NULL, 'proto_version', '4', 'publication_names', 'pub'); + +-- Clean up +SELECT pg_replication_origin_session_reset(); +SELECT pg_drop_replication_slot('regression_slot'); +SELECT pg_replication_origin_drop('regress_test_decoding: regression_slot'); +DROP PUBLICATION pub; diff --git a/contrib/test_decoding/sql/slot.sql b/contrib/test_decoding/sql/slot.sql index 1aa27c56674b7..580e3ae3befad 100644 --- a/contrib/test_decoding/sql/slot.sql +++ b/contrib/test_decoding/sql/slot.sql @@ -176,3 +176,17 @@ ORDER BY o.slot_name, c.slot_name; SELECT pg_drop_replication_slot('orig_slot2'); SELECT pg_drop_replication_slot('copied_slot2_no_change'); SELECT pg_drop_replication_slot('copied_slot2_notemp'); + +-- Test failover option of slots. +SELECT 'init' FROM pg_create_logical_replication_slot('failover_true_slot', 'test_decoding', false, false, true); +SELECT 'init' FROM pg_create_logical_replication_slot('failover_false_slot', 'test_decoding', false, false, false); +SELECT 'init' FROM pg_create_logical_replication_slot('failover_default_slot', 'test_decoding', false, false); +SELECT 'init' FROM pg_create_logical_replication_slot('failover_true_temp_slot', 'test_decoding', true, false, true); +SELECT 'init' FROM pg_create_physical_replication_slot('physical_slot'); + +SELECT slot_name, slot_type, failover FROM pg_replication_slots; + +SELECT pg_drop_replication_slot('failover_true_slot'); +SELECT pg_drop_replication_slot('failover_false_slot'); +SELECT pg_drop_replication_slot('failover_default_slot'); +SELECT pg_drop_replication_slot('physical_slot'); diff --git a/contrib/test_decoding/sql/stream.sql b/contrib/test_decoding/sql/stream.sql index 4feec62972a5e..7f43f0c2ab72a 100644 --- a/contrib/test_decoding/sql/stream.sql +++ b/contrib/test_decoding/sql/stream.sql @@ -44,5 +44,20 @@ toasted-123456789012345678901234567890123456789012345678901234567890123456789012 SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL,NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); +/* + * Test concurrent abort with toast data. When streaming the second insertion, we + * detect that the subtransaction was aborted, and reset the transaction while having + * the TOAST changes in memory, resulting in deallocating both decoded changes and + * TOAST reconstruction data. Memory usage counters must be updated correctly. + */ +BEGIN; +INSERT INTO stream_test SELECT repeat(string_agg(to_char(g.i, 'FM0000'), ''), 50) FROM generate_series(1, 500) g(i); +ALTER TABLE stream_test ADD COLUMN i INT; +SAVEPOINT s1; +INSERT INTO stream_test(data, i) SELECT repeat(string_agg(to_char(g.i, 'FM0000'), ''), 50), 1 FROM generate_series(1, 500) g(i); +ROLLBACK TO s1; +COMMIT; +SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); + DROP TABLE stream_test; SELECT pg_drop_replication_slot('regression_slot'); diff --git a/contrib/test_decoding/sql/twophase.sql b/contrib/test_decoding/sql/twophase.sql index aff5114eb1038..4b9ef0c0c4499 100644 --- a/contrib/test_decoding/sql/twophase.sql +++ b/contrib/test_decoding/sql/twophase.sql @@ -104,10 +104,33 @@ COMMIT PREPARED 'test_prepared_nodecode'; -- should be decoded now SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); +-- Test that accessing a TOAST table is permitted during the decoding of a +-- prepared transaction. + +-- Create a table with a column that uses a TOASTed default value. +-- (temporarily hide query, to avoid the long CREATE TABLE stmt) +\set ECHO none +SELECT 'CREATE TABLE test_tab (a text DEFAULT ''' || string_agg('toast value', '') || ''');' FROM generate_series(1, 4000) +\gexec +\set ECHO all + +BEGIN; +INSERT INTO test_tab VALUES('test'); +PREPARE TRANSACTION 'test_toast_table_access'; + +SELECT count(*) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); + +COMMIT PREPARED 'test_toast_table_access'; + +-- consume commit prepared +SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'stream-changes', '1'); + -- Test 8: -- cleanup and make sure results are also empty DROP TABLE test_prepared1; DROP TABLE test_prepared2; +DROP TABLE test_prepared_savepoint; +DROP TABLE test_tab; -- show results. There should be nothing to show SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); diff --git a/contrib/test_decoding/t/001_repl_stats.pl b/contrib/test_decoding/t/001_repl_stats.pl index 7c2d87561ce17..0521d7a404965 100644 --- a/contrib/test_decoding/t/001_repl_stats.pl +++ b/contrib/test_decoding/t/001_repl_stats.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test replication statistics data in pg_stat_replication_slots is sane after # drop replication slot and restart. use strict; -use warnings; +use warnings FATAL => 'all'; use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -118,4 +118,64 @@ sub test_slot_stats # shutdown $node->stop; +# Test replication slot stats persistence in a single session. The slot +# is dropped and created concurrently of a session peeking at its data +# repeatedly, hence holding in its local cache a reference to the stats. +$node->start; + +my $slot_name_restart = 'regression_slot5'; +$node->safe_psql('postgres', + "SELECT pg_create_logical_replication_slot('$slot_name_restart', 'test_decoding');" +); + +# Look at slot data, with a persistent connection. +my $bpgsql = $node->background_psql('postgres', on_error_stop => 1); + +# Launch query and look at slot data, incrementing the refcount of the +# stats entry. +$bpgsql->query_safe( + "SELECT pg_logical_slot_peek_binary_changes('$slot_name_restart', NULL, NULL)" +); + +# Drop the slot entry. The stats entry is not dropped yet as the previous +# session still holds a reference to it. +$node->safe_psql('postgres', + "SELECT pg_drop_replication_slot('$slot_name_restart')"); + +# Create again the same slot. The stats entry is reinitialized, not marked +# as dropped anymore. +$node->safe_psql('postgres', + "SELECT pg_create_logical_replication_slot('$slot_name_restart', 'test_decoding');" +); + +# Look again at the slot data. The local stats reference should be refreshed +# to the reinitialized entry. +$bpgsql->query_safe( + "SELECT pg_logical_slot_peek_binary_changes('$slot_name_restart', NULL, NULL)" +); +# Drop again the slot, the entry is not dropped yet as the previous session +# still has a refcount on it. +$node->safe_psql('postgres', + "SELECT pg_drop_replication_slot('$slot_name_restart')"); + +# Shutdown the node, which should happen cleanly with the stats file written +# to disk. Note that the background session created previously needs to be +# hold *while* the node is shutting down to check that it drops the stats +# entry of the slot before writing the stats file. +$node->stop; + +# Make sure that the node is correctly shut down. Checking the control file +# is not enough, as the node may detect that something is incorrect after the +# control file has been updated and the shutdown checkpoint is finished, so +# also check that the stats file has been written out. +command_like( + [ 'pg_controldata', $node->data_dir ], + qr/Database cluster state:\s+shut down\n/, + 'node shut down ok'); + +my $stats_file = "$datadir/pg_stat/pgstat.stat"; +ok(-f "$stats_file", "stats file must exist after shutdown"); + +$bpgsql->quit; + done_testing(); diff --git a/contrib/test_decoding/test_decoding.c b/contrib/test_decoding/test_decoding.c index 12d1d0505d77b..7c50d13969841 100644 --- a/contrib/test_decoding/test_decoding.c +++ b/contrib/test_decoding/test_decoding.c @@ -3,7 +3,7 @@ * test_decoding.c * example logical decoding output plugin * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/test_decoding/test_decoding.c @@ -640,7 +640,7 @@ pg_decode_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, appendStringInfoString(ctx->out, " (no-tuple-data)"); else tuple_to_stringinfo(ctx->out, tupdesc, - &change->data.tp.newtuple->tuple, + change->data.tp.newtuple, false); break; case REORDER_BUFFER_CHANGE_UPDATE: @@ -649,7 +649,7 @@ pg_decode_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, { appendStringInfoString(ctx->out, " old-key:"); tuple_to_stringinfo(ctx->out, tupdesc, - &change->data.tp.oldtuple->tuple, + change->data.tp.oldtuple, true); appendStringInfoString(ctx->out, " new-tuple:"); } @@ -658,7 +658,7 @@ pg_decode_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, appendStringInfoString(ctx->out, " (no-tuple-data)"); else tuple_to_stringinfo(ctx->out, tupdesc, - &change->data.tp.newtuple->tuple, + change->data.tp.newtuple, false); break; case REORDER_BUFFER_CHANGE_DELETE: @@ -670,7 +670,7 @@ pg_decode_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, /* In DELETE, only the replica identity is present; display that */ else tuple_to_stringinfo(ctx->out, tupdesc, - &change->data.tp.oldtuple->tuple, + change->data.tp.oldtuple, true); break; default: @@ -743,6 +743,18 @@ pg_decode_message(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr lsn, bool transactional, const char *prefix, Size sz, const char *message) { + TestDecodingData *data = ctx->output_plugin_private; + TestDecodingTxnData *txndata; + + txndata = transactional ? txn->output_plugin_private : NULL; + + /* output BEGIN if we haven't yet for transactional messages */ + if (transactional && data->skip_empty_xacts && !txndata->xact_wrote_changes) + pg_output_begin(ctx, data, txn, false); + + if (transactional) + txndata->xact_wrote_changes = true; + OutputPluginPrepareWrite(ctx, true); appendStringInfo(ctx->out, "message: transactional: %d prefix: %s, sz: %zu content:", transactional, prefix, sz); @@ -932,6 +944,19 @@ pg_decode_stream_message(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr lsn, bool transactional, const char *prefix, Size sz, const char *message) { + /* Output stream start if we haven't yet for transactional messages. */ + if (transactional) + { + TestDecodingData *data = ctx->output_plugin_private; + TestDecodingTxnData *txndata = txn->output_plugin_private; + + if (data->skip_empty_xacts && !txndata->stream_wrote_changes) + { + pg_output_stream_start(ctx, data, txn, false); + } + txndata->xact_wrote_changes = txndata->stream_wrote_changes = true; + } + OutputPluginPrepareWrite(ctx, true); if (transactional) diff --git a/contrib/tsm_system_rows/meson.build b/contrib/tsm_system_rows/meson.build index f45940f6b322c..534eca7f2aeb3 100644 --- a/contrib/tsm_system_rows/meson.build +++ b/contrib/tsm_system_rows/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tsm_system_rows_sources = files( 'tsm_system_rows.c', diff --git a/contrib/tsm_system_rows/tsm_system_rows.c b/contrib/tsm_system_rows/tsm_system_rows.c index 90058bbf03797..a9f5d657d1ce6 100644 --- a/contrib/tsm_system_rows/tsm_system_rows.c +++ b/contrib/tsm_system_rows/tsm_system_rows.c @@ -17,7 +17,7 @@ * won't visit blocks added after the first scan, but that is fine since * such blocks shouldn't contain any visible tuples anyway. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/contrib/tsm_system_time/meson.build b/contrib/tsm_system_time/meson.build index e43147de8bc56..5e0480b4187f2 100644 --- a/contrib/tsm_system_time/meson.build +++ b/contrib/tsm_system_time/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tsm_system_time_sources = files( 'tsm_system_time.c', diff --git a/contrib/tsm_system_time/tsm_system_time.c b/contrib/tsm_system_time/tsm_system_time.c index e0a8eec48d560..f187fd77655a3 100644 --- a/contrib/tsm_system_time/tsm_system_time.c +++ b/contrib/tsm_system_time/tsm_system_time.c @@ -13,7 +13,7 @@ * However, we do what we can to reduce surprising behavior by selecting * the sampling pattern just once per query, much as in tsm_system_rows. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/contrib/unaccent/Makefile b/contrib/unaccent/Makefile index d6c466e07adba..3ff49ba1e93cd 100644 --- a/contrib/unaccent/Makefile +++ b/contrib/unaccent/Makefile @@ -12,10 +12,6 @@ PGFILEDESC = "unaccent - text search dictionary that removes accents" REGRESS = unaccent -# We need a UTF8 database -ENCODING = UTF8 -NO_LOCALE = 1 - ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) @@ -30,7 +26,9 @@ endif update-unicode: $(srcdir)/unaccent.rules # Allow running this even without --with-python -PYTHON ?= python +ifeq ($(PYTHON),) +PYTHON = python +endif $(srcdir)/unaccent.rules: generate_unaccent_rules.py ../../src/common/unicode/UnicodeData.txt Latin-ASCII.xml $(PYTHON) $< --unicode-data-file $(word 2,$^) --latin-ascii-file $(word 3,$^) >$@ diff --git a/contrib/unaccent/expected/unaccent.out b/contrib/unaccent/expected/unaccent.out index ee0ac71a1cc7c..d03374c799a49 100644 --- a/contrib/unaccent/expected/unaccent.out +++ b/contrib/unaccent/expected/unaccent.out @@ -1,11 +1,13 @@ +/* + * This test must be run in a database with UTF-8 encoding, + * because other encodings don't support all the characters used. + */ +SELECT getdatabaseencoding() <> 'UTF8' + AS skip_test \gset +\if :skip_test +\quit +\endif CREATE EXTENSION unaccent; --- must have a UTF8 database -SELECT getdatabaseencoding(); - getdatabaseencoding ---------------------- - UTF8 -(1 row) - SET client_encoding TO 'UTF8'; SELECT unaccent('foobar'); unaccent @@ -49,6 +51,18 @@ SELECT unaccent('â„—'); -- sound recording copyright (P) (1 row) +SELECT unaccent('1½'); -- math expression with whitespace + unaccent +---------- + 1 1/2 +(1 row) + +SELECT unaccent('ã€'); -- quote + unaccent +---------- + " +(1 row) + SELECT unaccent('unaccent', 'foobar'); unaccent ---------- @@ -91,6 +105,18 @@ SELECT unaccent('unaccent', 'â„—'); (P) (1 row) +SELECT unaccent('unaccent', '1½'); + unaccent +---------- + 1 1/2 +(1 row) + +SELECT unaccent('unaccent', 'ã€'); + unaccent +---------- + " +(1 row) + SELECT ts_lexize('unaccent', 'foobar'); ts_lexize ----------- @@ -133,6 +159,18 @@ SELECT ts_lexize('unaccent', 'â„—'); {(P)} (1 row) +SELECT ts_lexize('unaccent', '1½'); + ts_lexize +----------- + {"1 1/2"} +(1 row) + +SELECT ts_lexize('unaccent', 'ã€'); + ts_lexize +----------- + {"\""} +(1 row) + -- Controversial case. Black-Letter Capital H (U+210C) is translated by -- Latin-ASCII.xml as 'x', but it should be 'H'. SELECT unaccent('ℌ'); diff --git a/contrib/unaccent/expected/unaccent_1.out b/contrib/unaccent/expected/unaccent_1.out new file mode 100644 index 0000000000000..37aead89c0c03 --- /dev/null +++ b/contrib/unaccent/expected/unaccent_1.out @@ -0,0 +1,8 @@ +/* + * This test must be run in a database with UTF-8 encoding, + * because other encodings don't support all the characters used. + */ +SELECT getdatabaseencoding() <> 'UTF8' + AS skip_test \gset +\if :skip_test +\quit diff --git a/contrib/unaccent/generate_unaccent_rules.py b/contrib/unaccent/generate_unaccent_rules.py index b4b4c38bebe9f..cffb7db7cee1c 100644 --- a/contrib/unaccent/generate_unaccent_rules.py +++ b/contrib/unaccent/generate_unaccent_rules.py @@ -58,6 +58,10 @@ def print_record(codepoint, letter): if letter: + # If the letter has whitespace or double quotes, escape double + # quotes and apply more quotes around it. + if (' ' in letter) or ('"' in letter): + letter = '"' + letter.replace('"', '""') + '"' output = chr(codepoint) + "\t" + letter else: output = chr(codepoint) diff --git a/contrib/unaccent/meson.build b/contrib/unaccent/meson.build index bd629ec090e46..2fe44fde70964 100644 --- a/contrib/unaccent/meson.build +++ b/contrib/unaccent/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group unaccent_sources = files( 'unaccent.c', @@ -37,6 +37,5 @@ tests += { 'sql': [ 'unaccent', ], - 'regress_args': ['--no-locale', '--encoding=UTF8'], }, } diff --git a/contrib/unaccent/sql/unaccent.sql b/contrib/unaccent/sql/unaccent.sql index 3fc0c706be388..70c7f1c0a0942 100644 --- a/contrib/unaccent/sql/unaccent.sql +++ b/contrib/unaccent/sql/unaccent.sql @@ -1,7 +1,15 @@ -CREATE EXTENSION unaccent; +/* + * This test must be run in a database with UTF-8 encoding, + * because other encodings don't support all the characters used. + */ + +SELECT getdatabaseencoding() <> 'UTF8' + AS skip_test \gset +\if :skip_test +\quit +\endif --- must have a UTF8 database -SELECT getdatabaseencoding(); +CREATE EXTENSION unaccent; SET client_encoding TO 'UTF8'; @@ -12,6 +20,8 @@ SELECT unaccent('˃˖˗˜'); SELECT unaccent('AÌ€'); -- Remove combining diacritical 0x0300 SELECT unaccent('℃℉'); -- degree signs SELECT unaccent('â„—'); -- sound recording copyright +SELECT unaccent('1½'); -- math expression with whitespace +SELECT unaccent('ã€'); -- quote SELECT unaccent('unaccent', 'foobar'); SELECT unaccent('unaccent', 'ёлка'); @@ -20,6 +30,8 @@ SELECT unaccent('unaccent', '˃˖˗˜'); SELECT unaccent('unaccent', 'AÌ€'); SELECT unaccent('unaccent', '℃℉'); SELECT unaccent('unaccent', 'â„—'); +SELECT unaccent('unaccent', '1½'); +SELECT unaccent('unaccent', 'ã€'); SELECT ts_lexize('unaccent', 'foobar'); SELECT ts_lexize('unaccent', 'ёлка'); @@ -28,6 +40,8 @@ SELECT ts_lexize('unaccent', '˃˖˗˜'); SELECT ts_lexize('unaccent', 'AÌ€'); SELECT ts_lexize('unaccent', '℃℉'); SELECT ts_lexize('unaccent', 'â„—'); +SELECT ts_lexize('unaccent', '1½'); +SELECT ts_lexize('unaccent', 'ã€'); -- Controversial case. Black-Letter Capital H (U+210C) is translated by -- Latin-ASCII.xml as 'x', but it should be 'H'. diff --git a/contrib/unaccent/unaccent.c b/contrib/unaccent/unaccent.c index 64c879e5470f9..707962305f83b 100644 --- a/contrib/unaccent/unaccent.c +++ b/contrib/unaccent/unaccent.c @@ -3,7 +3,7 @@ * unaccent.c * Text search unaccent dictionary * - * Copyright (c) 2009-2023, PostgreSQL Global Development Group + * Copyright (c) 2009-2024, PostgreSQL Global Development Group * * IDENTIFICATION * contrib/unaccent/unaccent.c @@ -127,24 +127,30 @@ initTrie(const char *filename) * src and trg are sequences of one or more non-whitespace * characters, separated by whitespace. Whitespace at start * or end of line is ignored. If trg is omitted, an empty - * string is used as the replacement. + * string is used as the replacement. trg can be optionally + * quoted, in which case whitespaces are included in it. * * We use a simple state machine, with states * 0 initial (before src) * 1 in src * 2 in whitespace after src - * 3 in trg - * 4 in whitespace after trg - * -1 syntax error detected + * 3 in trg (non-quoted) + * 4 in trg (quoted) + * 5 in whitespace after trg + * -1 syntax error detected (two strings) + * -2 syntax error detected (unfinished quoted string) *---------- */ int state; char *ptr; char *src = NULL; char *trg = NULL; + char *trgstore = NULL; int ptrlen; int srclen = 0; int trglen = 0; + int trgstorelen = 0; + bool trgquoted = false; state = 0; for (ptr = line; *ptr; ptr += ptrlen) @@ -156,8 +162,10 @@ initTrie(const char *filename) if (state == 1) state = 2; else if (state == 3) - state = 4; - continue; + state = 5; + /* whitespaces are OK in quoted area */ + if (state != 4) + continue; } switch (state) { @@ -173,13 +181,40 @@ initTrie(const char *filename) break; case 2: /* start of trg */ + if (*ptr == '"') + { + trgquoted = true; + state = 4; + } + else + state = 3; + trg = ptr; trglen = ptrlen; - state = 3; break; case 3: - /* continue trg */ + /* continue non-quoted trg */ + trglen += ptrlen; + break; + case 4: + /* continue quoted trg */ trglen += ptrlen; + + /* + * If this is a quote, consider it as the end of + * trg except if the follow-up character is itself + * a quote. + */ + if (*ptr == '"') + { + if (*(ptr + 1) == '"') + { + ptr++; + trglen += 1; + } + else + state = 5; + } break; default: /* bogus line format */ @@ -195,15 +230,46 @@ initTrie(const char *filename) trglen = 0; } + /* If still in a quoted area, fallback to an error */ + if (state == 4) + state = -2; + + /* If trg was quoted, remove its quotes and unescape it */ + if (trgquoted && state > 0) + { + /* Ignore first and end quotes */ + trgstore = (char *) palloc(sizeof(char) * (trglen - 2)); + trgstorelen = 0; + for (int i = 1; i < trglen - 1; i++) + { + trgstore[trgstorelen] = trg[i]; + trgstorelen++; + /* skip second double quotes */ + if (trg[i] == '"' && trg[i + 1] == '"') + i++; + } + } + else + { + trgstore = (char *) palloc(sizeof(char) * trglen); + trgstorelen = trglen; + memcpy(trgstore, trg, trgstorelen); + } + if (state > 0) rootTrie = placeChar(rootTrie, (unsigned char *) src, srclen, - trg, trglen); - else if (state < 0) + trgstore, trgstorelen); + else if (state == -1) ereport(WARNING, (errcode(ERRCODE_CONFIG_FILE_ERROR), errmsg("invalid syntax: more than two strings in unaccent rule"))); + else if (state == -2) + ereport(WARNING, + (errcode(ERRCODE_CONFIG_FILE_ERROR), + errmsg("invalid syntax: unfinished quoted string in unaccent rule"))); + pfree(trgstore); pfree(line); } skip = false; diff --git a/contrib/unaccent/unaccent.rules b/contrib/unaccent/unaccent.rules index 3030166ed67f3..ca6caa51f521e 100644 --- a/contrib/unaccent/unaccent.rules +++ b/contrib/unaccent/unaccent.rules @@ -5,9 +5,9 @@ ® (R) ± +/- » >> -¼ 1/4 -½ 1/2 -¾ 3/4 +¼ " 1/4" +½ " 1/2" +¾ " 3/4" ¿ ? À A à A @@ -403,7 +403,7 @@ ʪ ls Ê« lz ʹ ' -ʺ " +ʺ """" Ê» ' ʼ ' ʽ ' @@ -1058,15 +1058,15 @@ ’ ' ‚ , ‛ ' -“ " -†" +“ """" +†"""" „ ,, -‟ " +‟ """" ․ . ‥ .. … ... ′ ' -″ " +″ """" ‹ < › > ‼ !! @@ -1134,22 +1134,22 @@ â…‡ e â…ˆ i â…‰ j -â… 1/7 -â…‘ 1/9 -â…’ 1/10 -â…“ 1/3 -â…” 2/3 -â…• 1/5 -â…– 2/5 -â…— 3/5 -â…˜ 4/5 -â…™ 1/6 -â…š 5/6 -â…› 1/8 -â…œ 3/8 -â… 5/8 -â…ž 7/8 -â…Ÿ 1/ +â… " 1/7" +â…‘ " 1/9" +â…’ " 1/10" +â…“ " 1/3" +â…” " 2/3" +â…• " 1/5" +â…– " 2/5" +â…— " 3/5" +â…˜ " 4/5" +â…™ " 1/6" +â…š " 5/6" +â…› " 1/8" +â…œ " 3/8" +â… " 5/8" +â…ž " 7/8" +â…Ÿ " 1/" â…  I â…¡ II â…¢ III @@ -1182,7 +1182,7 @@ â…½ c â…¾ d â…¿ m -↉ 0/3 +↉ " 0/3" − - ∕ / ∖ \ @@ -1296,8 +1296,8 @@ 〙 ] 〚 [ 〛 ] -〠" -〞 " +〠"""" +〞 """" ã± hPa ã² da ã³ AU @@ -1512,7 +1512,7 @@ ﹪ % ﹫ @ ï¼ ! -" " +" """" # # $ $ ï¼… % diff --git a/contrib/uuid-ossp/expected/uuid_ossp_1.out b/contrib/uuid-ossp/expected/uuid_ossp_1.out new file mode 100644 index 0000000000000..58104dbe185dd --- /dev/null +++ b/contrib/uuid-ossp/expected/uuid_ossp_1.out @@ -0,0 +1,135 @@ +CREATE EXTENSION "uuid-ossp"; +SELECT uuid_nil(); + uuid_nil +-------------------------------------- + 00000000-0000-0000-0000-000000000000 +(1 row) + +SELECT uuid_ns_dns(); + uuid_ns_dns +-------------------------------------- + 6ba7b810-9dad-11d1-80b4-00c04fd430c8 +(1 row) + +SELECT uuid_ns_url(); + uuid_ns_url +-------------------------------------- + 6ba7b811-9dad-11d1-80b4-00c04fd430c8 +(1 row) + +SELECT uuid_ns_oid(); + uuid_ns_oid +-------------------------------------- + 6ba7b812-9dad-11d1-80b4-00c04fd430c8 +(1 row) + +SELECT uuid_ns_x500(); + uuid_ns_x500 +-------------------------------------- + 6ba7b814-9dad-11d1-80b4-00c04fd430c8 +(1 row) + +-- some quick and dirty field extraction functions +-- this is actually timestamp concatenated with clock sequence, per RFC 4122 +CREATE FUNCTION uuid_timestamp_bits(uuid) RETURNS varbit AS +$$ SELECT ('x' || substr($1::text, 15, 4) || substr($1::text, 10, 4) || + substr($1::text, 1, 8) || substr($1::text, 20, 4))::bit(80) + & x'0FFFFFFFFFFFFFFF3FFF' $$ +LANGUAGE SQL STRICT IMMUTABLE; +CREATE FUNCTION uuid_version_bits(uuid) RETURNS varbit AS +$$ SELECT ('x' || substr($1::text, 15, 2))::bit(8) & '11110000' $$ +LANGUAGE SQL STRICT IMMUTABLE; +CREATE FUNCTION uuid_reserved_bits(uuid) RETURNS varbit AS +$$ SELECT ('x' || substr($1::text, 20, 2))::bit(8) & '11000000' $$ +LANGUAGE SQL STRICT IMMUTABLE; +CREATE FUNCTION uuid_multicast_bit(uuid) RETURNS bool AS +$$ SELECT (('x' || substr($1::text, 25, 2))::bit(8) & '00000001') != '00000000' $$ +LANGUAGE SQL STRICT IMMUTABLE; +CREATE FUNCTION uuid_local_admin_bit(uuid) RETURNS bool AS +$$ SELECT (('x' || substr($1::text, 25, 2))::bit(8) & '00000010') != '00000000' $$ +LANGUAGE SQL STRICT IMMUTABLE; +CREATE FUNCTION uuid_node(uuid) RETURNS text AS +$$ SELECT substr($1::text, 25) $$ +LANGUAGE SQL STRICT IMMUTABLE; +-- Ideally, the multicast bit would never be set in V1 output, but the +-- UUID library may fall back to MC if it can't get the system MAC address. +-- Also, the local-admin bit might be set (if so, we're probably inside a VM). +-- So we can't test either bit here. +SELECT uuid_version_bits(uuid_generate_v1()), + uuid_reserved_bits(uuid_generate_v1()); + uuid_version_bits | uuid_reserved_bits +-------------------+-------------------- + 00010000 | 10000000 +(1 row) + +-- Although RFC 4122 only requires the multicast bit to be set in V1MC style +-- UUIDs, our implementation always sets the local-admin bit as well. +SELECT uuid_version_bits(uuid_generate_v1mc()), + uuid_reserved_bits(uuid_generate_v1mc()), + uuid_multicast_bit(uuid_generate_v1mc()), + uuid_local_admin_bit(uuid_generate_v1mc()); + uuid_version_bits | uuid_reserved_bits | uuid_multicast_bit | uuid_local_admin_bit +-------------------+--------------------+--------------------+---------------------- + 00010000 | 10000000 | t | t +(1 row) + +-- timestamp+clock sequence should be monotonic increasing in v1 +SELECT uuid_timestamp_bits(uuid_generate_v1()) < uuid_timestamp_bits(uuid_generate_v1()); + ?column? +---------- + t +(1 row) + +SELECT uuid_timestamp_bits(uuid_generate_v1mc()) < uuid_timestamp_bits(uuid_generate_v1mc()); + ?column? +---------- + t +(1 row) + +-- Ideally, the node value is stable in V1 addresses, but OSSP UUID +-- falls back to V1MC behavior if it can't get the system MAC address. +SELECT CASE WHEN uuid_multicast_bit(uuid_generate_v1()) AND + uuid_local_admin_bit(uuid_generate_v1()) THEN + true -- punt, no test + ELSE + uuid_node(uuid_generate_v1()) = uuid_node(uuid_generate_v1()) + END; + case +------ + t +(1 row) + +-- In any case, V1MC node addresses should be random. +SELECT uuid_node(uuid_generate_v1()) <> uuid_node(uuid_generate_v1mc()); + ?column? +---------- + t +(1 row) + +SELECT uuid_node(uuid_generate_v1mc()) <> uuid_node(uuid_generate_v1mc()); + ?column? +---------- + t +(1 row) + +SELECT uuid_generate_v3(uuid_ns_dns(), 'www.widgets.com'); +ERROR: could not initialize MD5 context: unsupported +SELECT uuid_generate_v5(uuid_ns_dns(), 'www.widgets.com'); + uuid_generate_v5 +-------------------------------------- + 21f7f8de-8051-5b89-8680-0195ef798b6a +(1 row) + +SELECT uuid_version_bits(uuid_generate_v4()), + uuid_reserved_bits(uuid_generate_v4()); + uuid_version_bits | uuid_reserved_bits +-------------------+-------------------- + 01000000 | 10000000 +(1 row) + +SELECT uuid_generate_v4() <> uuid_generate_v4(); + ?column? +---------- + t +(1 row) + diff --git a/contrib/uuid-ossp/meson.build b/contrib/uuid-ossp/meson.build index b9fe6038a0f1f..56732d1d14763 100644 --- a/contrib/uuid-ossp/meson.build +++ b/contrib/uuid-ossp/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not uuid.found() subdir_done() diff --git a/contrib/uuid-ossp/uuid-ossp.c b/contrib/uuid-ossp/uuid-ossp.c index 6399baf2571d5..3172714eb6ac4 100644 --- a/contrib/uuid-ossp/uuid-ossp.c +++ b/contrib/uuid-ossp/uuid-ossp.c @@ -2,7 +2,7 @@ * * UUID generation functions using the BSD, E2FS or OSSP UUID library * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * Portions Copyright (c) 2009 Andrew Gierth * @@ -13,9 +13,9 @@ #include "postgres.h" -#include "fmgr.h" #include "common/cryptohash.h" #include "common/sha1.h" +#include "fmgr.h" #include "port/pg_bswap.h" #include "utils/builtins.h" #include "utils/uuid.h" diff --git a/contrib/vacuumlo/meson.build b/contrib/vacuumlo/meson.build index 9fa7380590a39..b5f4ee0851969 100644 --- a/contrib/vacuumlo/meson.build +++ b/contrib/vacuumlo/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group vacuumlo_sources = files( 'vacuumlo.c', diff --git a/contrib/vacuumlo/t/001_basic.pl b/contrib/vacuumlo/t/001_basic.pl index 75067863decf0..57a9cda6f6b57 100644 --- a/contrib/vacuumlo/t/001_basic.pl +++ b/contrib/vacuumlo/t/001_basic.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/contrib/vacuumlo/vacuumlo.c b/contrib/vacuumlo/vacuumlo.c index 8941262731116..0d99428dec666 100644 --- a/contrib/vacuumlo/vacuumlo.c +++ b/contrib/vacuumlo/vacuumlo.c @@ -3,7 +3,7 @@ * vacuumlo.c * This removes orphaned large objects from a database. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -35,7 +35,7 @@ enum trivalue { TRI_DEFAULT, TRI_NO, - TRI_YES + TRI_YES, }; struct _param diff --git a/contrib/xml2/meson.build b/contrib/xml2/meson.build index 49895675c2c3c..5e80e17f82423 100644 --- a/contrib/xml2/meson.build +++ b/contrib/xml2/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not libxml.found() subdir_done() diff --git a/contrib/xml2/xpath.c b/contrib/xml2/xpath.c index a692dc6be86df..212cb74aa220b 100644 --- a/contrib/xml2/xpath.c +++ b/contrib/xml2/xpath.c @@ -74,9 +74,6 @@ pgxml_parser_init(PgXmlStrictness strictness) /* Initialize libxml */ xmlInitParser(); - xmlSubstituteEntitiesDefault(1); - xmlLoadExtDtdDefaultValue = 1; - return xmlerrcxt; } @@ -380,15 +377,16 @@ pgxml_xpath(text *document, xmlChar *xpath, xpath_workspace *workspace) PG_TRY(); { - workspace->doctree = xmlParseMemory((char *) VARDATA_ANY(document), - docsize); + workspace->doctree = xmlReadMemory((char *) VARDATA_ANY(document), + docsize, NULL, NULL, + XML_PARSE_NOENT); if (workspace->doctree != NULL) { workspace->ctxt = xmlXPathNewContext(workspace->doctree); workspace->ctxt->node = xmlDocGetRootElement(workspace->doctree); /* compile the path */ - comppath = xmlXPathCompile(xpath); + comppath = xmlXPathCtxtCompile(workspace->ctxt, xpath); if (comppath == NULL) xml_ereport(xmlerrcxt, ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION, "XPath Syntax Error"); @@ -624,7 +622,9 @@ xpath_table(PG_FUNCTION_ARGS) /* Parse the document */ if (xmldoc) - doctree = xmlParseMemory(xmldoc, strlen(xmldoc)); + doctree = xmlReadMemory(xmldoc, strlen(xmldoc), + NULL, NULL, + XML_PARSE_NOENT); else /* treat NULL as not well-formed */ doctree = NULL; @@ -650,7 +650,7 @@ xpath_table(PG_FUNCTION_ARGS) ctxt->node = xmlDocGetRootElement(doctree); /* compile the path */ - comppath = xmlXPathCompile(xpaths[j]); + comppath = xmlXPathCtxtCompile(ctxt, xpaths[j]); if (comppath == NULL) xml_ereport(xmlerrcxt, ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION, diff --git a/contrib/xml2/xslt_proc.c b/contrib/xml2/xslt_proc.c index 2189bca86ff63..f30a3a42c03e9 100644 --- a/contrib/xml2/xslt_proc.c +++ b/contrib/xml2/xslt_proc.c @@ -85,16 +85,18 @@ xslt_process(PG_FUNCTION_ARGS) bool xslt_sec_prefs_error; /* Parse document */ - doctree = xmlParseMemory((char *) VARDATA_ANY(doct), - VARSIZE_ANY_EXHDR(doct)); + doctree = xmlReadMemory((char *) VARDATA_ANY(doct), + VARSIZE_ANY_EXHDR(doct), NULL, NULL, + XML_PARSE_NOENT); if (doctree == NULL) xml_ereport(xmlerrcxt, ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION, "error parsing XML document"); /* Same for stylesheet */ - ssdoc = xmlParseMemory((char *) VARDATA_ANY(ssheet), - VARSIZE_ANY_EXHDR(ssheet)); + ssdoc = xmlReadMemory((char *) VARDATA_ANY(ssheet), + VARSIZE_ANY_EXHDR(ssheet), NULL, NULL, + XML_PARSE_NOENT); if (ssdoc == NULL) xml_ereport(xmlerrcxt, ERROR, ERRCODE_EXTERNAL_ROUTINE_EXCEPTION, diff --git a/doc/Makefile b/doc/Makefile index aee3cc09654d7..24370fc903024 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -12,5 +12,5 @@ subdir = doc top_builddir = .. include $(top_builddir)/src/Makefile.global -all distprep html man install installdirs uninstall clean distclean maintainer-clean: +all html man install installdirs uninstall clean distclean: $(MAKE) -C src $@ diff --git a/doc/src/Makefile b/doc/src/Makefile index 30d883815aa47..2ed02084ff57d 100644 --- a/doc/src/Makefile +++ b/doc/src/Makefile @@ -4,5 +4,5 @@ subdir = doc/src top_builddir = ../.. include $(top_builddir)/src/Makefile.global -all distprep html man install installdirs uninstall clean distclean maintainer-clean: +all html man install installdirs uninstall clean distclean: $(MAKE) -C sgml $@ diff --git a/doc/src/sgml/.gitignore b/doc/src/sgml/.gitignore index d8e3dab3380a8..91f2781fe7bfe 100644 --- a/doc/src/sgml/.gitignore +++ b/doc/src/sgml/.gitignore @@ -6,7 +6,6 @@ /man7/ /man-stamp # Other popular build targets -/INSTALL /postgres-US.pdf /postgres-A4.pdf /postgres.html @@ -16,10 +15,10 @@ /features-unsupported.sgml /errcodes-table.sgml /keywords-table.sgml +/targets-meson.sgml /version.sgml +/wait_event_types.sgml # Assorted byproducts from building the above /postgres-full.xml -/INSTALL.html -/INSTALL.xml /postgres-US.fo /postgres-A4.fo diff --git a/doc/src/sgml/Makefile b/doc/src/sgml/Makefile index 71cbef230f34a..9c9bbfe375d84 100644 --- a/doc/src/sgml/Makefile +++ b/doc/src/sgml/Makefile @@ -7,8 +7,7 @@ #---------------------------------------------------------------------------- # This makefile is for building and installing the documentation. -# When a release tarball is created, the documentation files are -# prepared using the distprep target. In Git-based trees these files +# In Git-based trees these files # don't exist, unless explicitly built, so we skip the installation in # that case. @@ -16,6 +15,8 @@ # Make "html" the default target, since that is what most people tend # to want to use. html: +# Note that all is *not* the default target in this directory +all: html man # We don't need the tree-wide headers or install support here. NO_GENERATED_HEADERS=yes @@ -26,10 +27,6 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global -all: html man - -distprep: html distprep-man - ifndef DBTOEPUB DBTOEPUB = $(missing) dbtoepub @@ -39,6 +36,8 @@ ifndef FOP FOP = $(missing) fop endif +PANDOC = pandoc + XMLINCLUDE = --path . --path $(srcdir) ifdef XMLLINT @@ -58,7 +57,7 @@ override XSLTPROCFLAGS += --stringparam pg.version '$(VERSION)' GENERATED_SGML = version.sgml \ features-supported.sgml features-unsupported.sgml errcodes-table.sgml \ - keywords-table.sgml + keywords-table.sgml targets-meson.sgml wait_event_types.sgml ALLSGML := $(wildcard $(srcdir)/*.sgml $(srcdir)/ref/*.sgml) $(GENERATED_SGML) @@ -77,7 +76,7 @@ postgres-full.xml: postgres.sgml $(ALLSGML) ## Man pages ## -man distprep-man: man-stamp +man: man-stamp man-stamp: stylesheet-man.xsl postgres-full.xml $(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) $(XSLTPROC_MAN_FLAGS) $^ @@ -89,10 +88,9 @@ man-stamp: stylesheet-man.xsl postgres-full.xml ## # Technically, this should depend on Makefile.global, but then -# version.sgml would need to be rebuilt after every configure run, -# even in distribution tarballs. So this is cheating a bit, but it -# will achieve the goal of updating the version number when it -# changes. +# version.sgml would need to be rebuilt after every configure run. So +# this is cheating a bit, but it will achieve the goal of updating the +# version number when it changes. version.sgml: $(top_srcdir)/configure { \ echo ""; \ @@ -111,25 +109,11 @@ errcodes-table.sgml: $(top_srcdir)/src/backend/utils/errcodes.txt generate-errco keywords-table.sgml: $(top_srcdir)/src/include/parser/kwlist.h $(wildcard $(srcdir)/keywords/sql*.txt) generate-keywords-table.pl $(PERL) $(srcdir)/generate-keywords-table.pl $(srcdir) > $@ +wait_event_types.sgml: $(top_srcdir)/src/backend/utils/activity/wait_event_names.txt $(top_srcdir)/src/backend/utils/activity/generate-wait_event_types.pl + $(PERL) $(top_srcdir)/src/backend/utils/activity/generate-wait_event_types.pl --docs $< -## -## Generation of some text files. -## - -ICONV = iconv -PANDOC = pandoc - -INSTALL: % : %.html - $(PANDOC) -t plain -o $@.tmp $< - $(ICONV) -f utf8 -t us-ascii//TRANSLIT $@.tmp > $@ - rm $@.tmp - -INSTALL.html: %.html : stylesheet-text.xsl %.xml - $(XMLLINT) --noout --valid $*.xml - $(XSLTPROC) $(XSLTPROCFLAGS) $(XSLTPROC_HTML_FLAGS) $^ >$@ - -INSTALL.xml: standalone-profile.xsl standalone-install.xml postgres-full.xml - $(XSLTPROC) $(XMLINCLUDE) $(XSLTPROCFLAGS) --xinclude $(wordlist 1,2,$^) >$@ +targets-meson.sgml: targets-meson.txt $(srcdir)/generate-targets-meson.pl + $(PERL) $(srcdir)/generate-targets-meson.pl $^ > $@ ## @@ -231,7 +215,7 @@ uninstall: ## Install html install-html: html installdirs - cp -R $(call vpathsearch,html) '$(DESTDIR)$(htmldir)' + cp -R html '$(DESTDIR)$(htmldir)' ## Install man @@ -246,7 +230,7 @@ sqlmansectnum = $(shell expr X'$(sqlmansect)' : X'\([0-9]\)') # ifeq ($(sqlmansectnum),7) install-man: - cp -R $(foreach dir,man1 man3 man7,$(call vpathsearch,$(dir))) '$(DESTDIR)$(mandir)' + cp -R man1 man3 man7 '$(DESTDIR)$(mandir)' else # sqlmansectnum != 7 fix_sqlmansectnum = sed -e '/^\.TH/s/"7"/"$(sqlmansect)"/' \ @@ -257,9 +241,9 @@ man: fixed-man-stamp fixed-man-stamp: man-stamp @$(MKDIR_P) $(addprefix fixedman/,man1 man3 man$(sqlmansectnum)) - for file in $(call vpathsearch,man1)/*.1; do $(fix_sqlmansectnum) $$file >fixedman/man1/`basename $$file` || exit; done - for file in $(call vpathsearch,man3)/*.3; do $(fix_sqlmansectnum) $$file >fixedman/man3/`basename $$file` || exit; done - for file in $(call vpathsearch,man7)/*.7; do $(fix_sqlmansectnum) $$file >fixedman/man$(sqlmansectnum)/`basename $$file | sed s/\.7$$/.$(sqlmansect)/` || exit; done + for file in man1/*.1; do $(fix_sqlmansectnum) $$file >fixedman/man1/`basename $$file` || exit; done + for file in man3/*.3; do $(fix_sqlmansectnum) $$file >fixedman/man3/`basename $$file` || exit; done + for file in man7/*.7; do $(fix_sqlmansectnum) $$file >fixedman/man$(sqlmansectnum)/`basename $$file | sed s/\.7$$/.$(sqlmansect)/` || exit; done install-man: cp -R $(foreach dir,man1 man3 man$(sqlmansectnum),fixedman/$(dir)) '$(DESTDIR)$(mandir)' @@ -283,13 +267,9 @@ check-tabs: # keeping the dependencies satisfied. .SECONDARY: $(GENERATED_SGML) .SECONDARY: postgres-full.xml -.SECONDARY: INSTALL.html INSTALL.xml .SECONDARY: postgres-A4.fo postgres-US.fo clean: -# text --- these are shipped, but not in this directory - rm -f INSTALL - rm -f INSTALL.html INSTALL.xml # single-page output rm -f postgres.html postgres.txt # print @@ -303,8 +283,6 @@ clean: rm -f *.texixml *.texi *.info db2texi.refs distclean: clean - -maintainer-clean: distclean # HTML rm -fr html/ html-stamp # man diff --git a/doc/src/sgml/acronyms.sgml b/doc/src/sgml/acronyms.sgml index 22e0dc5c70b55..6e64b190ea275 100644 --- a/doc/src/sgml/acronyms.sgml +++ b/doc/src/sgml/acronyms.sgml @@ -9,6 +9,15 @@ + + AM + + + Access Method + + + + ANSI @@ -625,7 +634,7 @@ Server Name Indication, - RFC 6066 + RFC 6066 diff --git a/doc/src/sgml/adminpack.sgml b/doc/src/sgml/adminpack.sgml deleted file mode 100644 index 04f3b52379b48..0000000000000 --- a/doc/src/sgml/adminpack.sgml +++ /dev/null @@ -1,159 +0,0 @@ - - - - adminpack — pgAdmin support toolpack - - - adminpack - - - - adminpack provides a number of support functions which - pgAdmin and other administration and management tools can - use to provide additional functionality, such as remote management - of server log files. - Use of all these functions is only allowed to database superusers by default, but may be - allowed to other users by using the GRANT command. - - - - The functions shown in provide - write access to files on the machine hosting the server. (See also the - functions in , which - provide read-only access.) - Only files within the database cluster directory can be accessed, unless the - user is a superuser or given privileges of one of the - pg_read_server_files or - pg_write_server_files roles, as appropriate for the - function, but either a relative or absolute path is allowable. - - - - <filename>adminpack</filename> Functions - - - - - Function - - - Description - - - - - - - - pg_catalog.pg_file_write ( filename text, data text, append boolean ) - bigint - - - Writes, or appends to, a text file. - - - - - - pg_catalog.pg_file_sync ( filename text ) - void - - - Flushes a file or directory to disk. - - - - - - pg_catalog.pg_file_rename ( oldname text, newname text , archivename text ) - boolean - - - Renames a file. - - - - - - pg_catalog.pg_file_unlink ( filename text ) - boolean - - - Removes a file. - - - - - - pg_catalog.pg_logdir_ls () - setof record - - - Lists the log files in the log_directory directory. - - - - -
- - - pg_file_write - - - pg_file_write writes the specified data into - the file named by filename. If append is - false, the file must not already exist. If append is true, - the file can already exist, and will be appended to if so. - Returns the number of bytes written. - - - - pg_file_sync - - - pg_file_sync fsyncs the specified file or directory - named by filename. An error is thrown - on failure (e.g., the specified file is not present). Note that - has no effect on this function, - and therefore a PANIC-level error will not be raised even on failure to - flush database files. - - - - pg_file_rename - - - pg_file_rename renames a file. If archivename - is omitted or NULL, it simply renames oldname - to newname (which must not already exist). - If archivename is provided, it first - renames newname to archivename (which must - not already exist), and then renames oldname - to newname. In event of failure of the second rename step, - it will try to rename archivename back - to newname before reporting the error. - Returns true on success, false if the source file(s) are not present or - not writable; other cases throw errors. - - - - pg_file_unlink - - - pg_file_unlink removes the specified file. - Returns true on success, false if the specified file is not present - or the unlink() call fails; other cases throw errors. - - - - pg_logdir_ls - - - pg_logdir_ls returns the start timestamps and path - names of all the log files in the - directory. The parameter must have its - default setting (postgresql-%Y-%m-%d_%H%M%S.log) to use this - function. - - -
diff --git a/doc/src/sgml/amcheck.sgml b/doc/src/sgml/amcheck.sgml index 2b9c1a9205fb1..3af065615bc0d 100644 --- a/doc/src/sgml/amcheck.sgml +++ b/doc/src/sgml/amcheck.sgml @@ -24,6 +24,9 @@ to hold, we can expect binary searches on the affected page to incorrectly guide index scans, resulting in wrong answers to SQL queries. If the structure appears to be valid, no error is raised. + While these checking functions are run, the is temporarily changed to pg_catalog, + pg_temp. Verification is performed using the same procedures as those used by @@ -58,7 +61,7 @@ - bt_index_check(index regclass, heapallindexed boolean) returns void + bt_index_check(index regclass, heapallindexed boolean, checkunique boolean) returns void bt_index_check @@ -115,7 +118,10 @@ ORDER BY c.relpages DESC LIMIT 10; that span child/parent relationships, but will verify the presence of all heap tuples as index tuples within the index when heapallindexed is - true. When a routine, lightweight test for + true. When checkunique + is true bt_index_check will + check that no more than one among duplicate entries in unique + index is visible. When a routine, lightweight test for corruption is required in a live production environment, using bt_index_check often provides the best trade-off between thoroughness of verification and limiting the @@ -126,7 +132,7 @@ ORDER BY c.relpages DESC LIMIT 10; - bt_index_parent_check(index regclass, heapallindexed boolean, rootdescend boolean) returns void + bt_index_parent_check(index regclass, heapallindexed boolean, rootdescend boolean, checkunique boolean) returns void bt_index_parent_check @@ -139,7 +145,10 @@ ORDER BY c.relpages DESC LIMIT 10; Optionally, when the heapallindexed argument is true, the function verifies the presence of all heap tuples that should be found within the - index. When the optional rootdescend + index. When checkunique + is true bt_index_parent_check will + check that no more than one among duplicate entries in unique + index is visible. When the optional rootdescend argument is true, verification re-finds tuples on the leaf level by performing a new search from the root page for each tuple. The checks that can be performed by diff --git a/doc/src/sgml/archive-modules.sgml b/doc/src/sgml/archive-modules.sgml index 7064307d9e608..10ec96eae96c6 100644 --- a/doc/src/sgml/archive-modules.sgml +++ b/doc/src/sgml/archive-modules.sgml @@ -114,6 +114,18 @@ WARNING: archive_mode enabled, yet archiving is not configured In the latter case, the server will periodically call this function, and archiving will proceed only when it returns true. + + + + When returning false, it may be useful to append some + additional information to the generic warning message. To do that, provide + a message to the arch_module_check_errdetail macro + before returning false. Like + errdetail(), this macro accepts a format string + followed by an optional list of arguments. The resulting string will be + emitted as the DETAIL line of the warning message. + + @@ -128,12 +140,21 @@ typedef bool (*ArchiveFileCB) (ArchiveModuleState *state, const char *file, cons If true is returned, the server proceeds as if the file was successfully archived, which may include recycling or removing the - original WAL file. If false is returned, the server will + original WAL file. If false is returned or an error is thrown, the server will keep the original WAL file and retry archiving later. file will contain just the file name of the WAL file to archive, while path contains the full path of the WAL file (including the file name). + + + + The archive_file_cb callback is called in a + short-lived memory context that will be reset between invocations. If you + need longer-lived storage, create a memory context in the module's + startup_cb callback. + + diff --git a/doc/src/sgml/array.sgml b/doc/src/sgml/array.sgml index 56185b9b0387d..ce338c770c95d 100644 --- a/doc/src/sgml/array.sgml +++ b/doc/src/sgml/array.sgml @@ -171,7 +171,8 @@ INSERT INTO sal_emp VALUES ('Bill', '{10000, 10000, 10000, 10000}', '{{"meeting", "lunch"}, {"meeting"}}'); -ERROR: multidimensional arrays must have array expressions with matching dimensions +ERROR: malformed array literal: "{{"meeting", "lunch"}, {"meeting"}}" +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. diff --git a/doc/src/sgml/backup-manifest.sgml b/doc/src/sgml/backup-manifest.sgml index 771be1310a153..d5ec244834ec1 100644 --- a/doc/src/sgml/backup-manifest.sgml +++ b/doc/src/sgml/backup-manifest.sgml @@ -37,7 +37,22 @@ PostgreSQL-Backup-Manifest-Version - The associated value is always the integer 1. + The associated value is an integer. Beginning in + PostgreSQL 17, + it is 2; in older versions, it is 1. + + + + + + System-Identifier + + + The database system identifier of the + PostgreSQL instance where the backup was + taken. This field is present only when + PostgreSQL-Backup-Manifest-Version is + 2. diff --git a/doc/src/sgml/backup.sgml b/doc/src/sgml/backup.sgml index 8cb24d6ae542f..25b8904baf7cd 100644 --- a/doc/src/sgml/backup.sgml +++ b/doc/src/sgml/backup.sgml @@ -106,10 +106,10 @@ pg_dump dbname > Text files created by pg_dump are intended to - be read in by the psql program. The - general command form to restore a dump is + be read by the psql program using its default + settings. The general command form to restore a text dump is -psql dbname < dumpfile +psql -X dbname < dumpfile where dumpfile is the file output by the pg_dump command. The database dbname < template0 before executing psql (e.g., with createdb -T template0 dbname). psql + class="parameter">dbname). + To ensure psql runs with its default settings, + use the () option. + psql supports options similar to pg_dump for specifying the database server to connect to and the user name to use. See the reference page for more information. - Non-text file dumps are restored using the + + + Non-text file dumps should be restored using the utility. @@ -141,7 +147,7 @@ psql dbname < psql exit with an exit status of 3 if an SQL error occurs: -psql --set ON_ERROR_STOP=on dbname < dumpfile +psql -X --set ON_ERROR_STOP=on dbname < dumpfile Either way, you will only have a partially restored database. Alternatively, you can specify that the whole dump should be @@ -160,7 +166,7 @@ psql --set ON_ERROR_STOP=on dbname < write to or read from pipes makes it possible to dump a database directly from one server to another, for example: -pg_dump -h host1 dbname | psql -h host2 dbname +pg_dump -h host1 dbname | psql -X -h host2 dbname @@ -205,7 +211,7 @@ pg_dumpall > dumpfile The resulting dump can be restored with psql: -psql -f dumpfile postgres +psql -X -f dumpfile postgres (Actually, you can specify any existing database name to start from, but if you are loading into an empty cluster then postgres @@ -857,12 +863,94 @@ test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/0 + + Making an Incremental Backup + + + You can use to take an incremental + backup by specifying the --incremental option. You must + supply, as an argument to --incremental, the backup + manifest to an earlier backup from the same server. In the resulting + backup, non-relation files will be included in their entirety, but some + relation files may be replaced by smaller incremental files which contain + only the blocks which have been changed since the earlier backup and enough + metadata to reconstruct the current version of the file. + + + + To figure out which blocks need to be backed up, the server uses WAL + summaries, which are stored in the data directory, inside the directory + pg_wal/summaries. If the required summary files are not + present, an attempt to take an incremental backup will fail. The summaries + present in this directory must cover all LSNs from the start LSN of the + prior backup to the start LSN of the current backup. Since the server looks + for WAL summaries just after establishing the start LSN of the current + backup, the necessary summary files probably won't be instantly present + on disk, but the server will wait for any missing files to show up. + This also helps if the WAL summarization process has fallen behind. + However, if the necessary files have already been removed, or if the WAL + summarizer doesn't catch up quickly enough, the incremental backup will + fail. + + + + When restoring an incremental backup, it will be necessary to have not + only the incremental backup itself but also all earlier backups that + are required to supply the blocks omitted from the incremental backup. + See for further information about + this requirement. Note that there are restrictions on the use of + pg_combinebackup when the checksum status of the + cluster has been changed; see + pg_combinebackup + limitations. + + + + Note that all of the requirements for making use of a full backup also + apply to an incremental backup. For instance, you still need all of the + WAL segment files generated during and after the file system backup, and + any relevant WAL history files. And you still need to create a + recovery.signal (or standby.signal) + and perform recovery, as described in + . The requirement to have earlier + backups available at restore time and to use + pg_combinebackup is an additional requirement on top of + everything else. Keep in mind that PostgreSQL + has no built-in mechanism to figure out which backups are still needed as + a basis for restoring later incremental backups. You must keep track of + the relationships between your full and incremental backups on your own, + and be certain not to remove earlier backups if they might be needed when + restoring later incremental backups. + + + + Incremental backups typically only make sense for relatively large + databases where a significant portion of the data does not change, or only + changes slowly. For a small database, it's simpler to ignore the existence + of incremental backups and simply take full backups, which are simpler + to manage. For a large database all of which is heavily modified, + incremental backups won't be much smaller than full backups. + + + + An incremental backup is only possible if replay would begin from a later + checkpoint than for the previous backup upon which it depends. If you + take the incremental backup on the primary, this condition is always + satisfied, because each backup triggers a new checkpoint. On a standby, + replay begins from the most recent restartpoint. Therefore, an + incremental backup of a standby server can fail if there has been very + little activity since the previous backup, since no new restartpoint might + have been created. + + + Making a Base Backup Using the Low Level API - The procedure for making a base backup using the low level - APIs contains a few more steps than - the method, but is relatively + Instead of taking a full or incremental base backup using + , you can take a base backup using the + low-level API. This procedure contains a few more steps than + the pg_basebackup method, but is relatively simple. It is very important that these steps are executed in sequence, and that the success of a step is verified before proceeding to the next step. @@ -1118,7 +1206,8 @@ SELECT * FROM pg_backup_stop(wait_for_archive => true); - Restore the database files from your file system backup. Be sure that they + If you're restoring a full backup, you can restore the database files + directly into the target directories. Be sure that they are restored with the right ownership (the database system user, not root!) and with the right permissions. If you are using tablespaces, @@ -1126,6 +1215,19 @@ SELECT * FROM pg_backup_stop(wait_for_archive => true); were correctly restored. + + + If you're restoring an incremental backup, you'll need to restore the + incremental backup and all earlier backups upon which it directly or + indirectly depends to the machine where you are performing the restore. + These backups will need to be placed in separate directories, not the + target directories where you want the running server to end up. + Once this is done, use to pull + data from the full backup and all of the subsequent incremental backups + and write out a synthetic full backup to the target directories. As above, + verify that permissions and tablespace links are correct. + + Remove any files present in pg_wal/; these came from the diff --git a/doc/src/sgml/bgworker.sgml b/doc/src/sgml/bgworker.sgml index 7ba5da27e50a4..2c393385a91f4 100644 --- a/doc/src/sgml/bgworker.sgml +++ b/doc/src/sgml/bgworker.sgml @@ -59,7 +59,7 @@ typedef struct BackgroundWorker int bgw_flags; BgWorkerStartTime bgw_start_time; int bgw_restart_time; /* in seconds, or BGW_NEVER_RESTART */ - char bgw_library_name[BGW_MAXLEN]; + char bgw_library_name[MAXPGPATH]; char bgw_function_name[BGW_MAXLEN]; Datum bgw_main_arg; char bgw_extra[BGW_EXTRALEN]; @@ -201,6 +201,9 @@ typedef struct BackgroundWorker during initdb. If BGWORKER_BYPASS_ALLOWCONN is specified as flags it is possible to bypass the restriction to connect to databases not allowing user connections. + If BGWORKER_BYPASS_ROLELOGINCHECK is specified as + flags it is possible to bypass the login check for the + role used to connect to databases. A background worker can only call one of these two functions, and only once. It is not possible to switch databases. diff --git a/doc/src/sgml/biblio.sgml b/doc/src/sgml/biblio.sgml index cd8aa3e8aadc8..4674544461d1b 100644 --- a/doc/src/sgml/biblio.sgml +++ b/doc/src/sgml/biblio.sgml @@ -546,5 +546,23 @@ ssimkovi@ag.or.at + + + <ulink url="https://dsf.berkeley.edu/papers/S2K-91-05.pdf"> + An overview of the Sequoia 2000 project + </ulink> + + + M. + Stonebraker + + + + + Digest of Papers COMPCON Spring 1992 + 1992 + 383–388 + + diff --git a/doc/src/sgml/bki.sgml b/doc/src/sgml/bki.sgml index f71644e398982..3cd5bee7ffaf4 100644 --- a/doc/src/sgml/bki.sgml +++ b/doc/src/sgml/bki.sgml @@ -184,9 +184,9 @@ descr => 'database\'s default template', datname => 'template1', encoding => 'ENCODING', datlocprovider => 'LOCALE_PROVIDER', datistemplate => 't', - datallowconn => 't', datconnlimit => '-1', datfrozenxid => '0', + datallowconn => 't', dathasloginevt => 'f', datconnlimit => '-1', datfrozenxid => '0', datminmxid => '1', dattablespace => 'pg_default', datcollate => 'LC_COLLATE', - datctype => 'LC_CTYPE', daticulocale => 'ICU_LOCALE', datacl => '_null_' }, + datctype => 'LC_CTYPE', datlocale => 'DATLOCALE', datacl => '_null_' }, ] ]]> diff --git a/doc/src/sgml/bloom.sgml b/doc/src/sgml/bloom.sgml index 19f2b172cc4fb..0e734f3d6e685 100644 --- a/doc/src/sgml/bloom.sgml +++ b/doc/src/sgml/bloom.sgml @@ -118,11 +118,11 @@ SELECT 10000000 =# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; QUERY PLAN -------------------------------------------------------------------&zwsp;----------------------------------- - Seq Scan on tbloom (cost=0.00..2137.14 rows=3 width=24) (actual time=16.971..16.971 rows=0 loops=1) + Seq Scan on tbloom (cost=0.00..213744.00 rows=250 width=24) (actual time=357.059..357.059 rows=0 loops=1) Filter: ((i2 = 898732) AND (i5 = 123451)) - Rows Removed by Filter: 100000 + Rows Removed by Filter: 10000000 Planning Time: 0.346 ms - Execution Time: 16.988 ms + Execution Time: 357.076 ms (5 rows) @@ -136,16 +136,16 @@ CREATE INDEX =# SELECT pg_size_pretty(pg_relation_size('btreeidx')); pg_size_pretty ---------------- - 3976 kB + 386 MB (1 row) =# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; QUERY PLAN -------------------------------------------------------------------&zwsp;----------------------------------- - Seq Scan on tbloom (cost=0.00..2137.00 rows=2 width=24) (actual time=12.805..12.805 rows=0 loops=1) + Seq Scan on tbloom (cost=0.00..213744.00 rows=2 width=24) (actual time=351.016..351.017 rows=0 loops=1) Filter: ((i2 = 898732) AND (i5 = 123451)) - Rows Removed by Filter: 100000 + Rows Removed by Filter: 10000000 Planning Time: 0.138 ms - Execution Time: 12.817 ms + Execution Time: 351.035 ms (5 rows) @@ -159,19 +159,19 @@ CREATE INDEX =# SELECT pg_size_pretty(pg_relation_size('bloomidx')); pg_size_pretty ---------------- - 1584 kB + 153 MB (1 row) =# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; QUERY PLAN -------------------------------------------------------------------&zwsp;-------------------------------------------------- - Bitmap Heap Scan on tbloom (cost=1792.00..1799.69 rows=2 width=24) (actual time=0.388..0.388 rows=0 loops=1) + Bitmap Heap Scan on tbloom (cost=1792.00..1799.69 rows=2 width=24) (actual time=22.605..22.606 rows=0 loops=1) Recheck Cond: ((i2 = 898732) AND (i5 = 123451)) - Rows Removed by Index Recheck: 29 - Heap Blocks: exact=28 - -> Bitmap Index Scan on bloomidx (cost=0.00..1792.00 rows=2 width=0) (actual time=0.356..0.356 rows=29 loops=1) + Rows Removed by Index Recheck: 2300 + Heap Blocks: exact=2256 + -> Bitmap Index Scan on bloomidx (cost=0.00..178436.00 rows=1 width=0) (actual time=20.005..20.005 rows=2300 loops=1) Index Cond: ((i2 = 898732) AND (i5 = 123451)) Planning Time: 0.099 ms - Execution Time: 0.408 ms + Execution Time: 22.632 ms (8 rows) @@ -197,21 +197,21 @@ CREATE INDEX =# EXPLAIN ANALYZE SELECT * FROM tbloom WHERE i2 = 898732 AND i5 = 123451; QUERY PLAN -------------------------------------------------------------------&zwsp;-------------------------------------------------------- - Bitmap Heap Scan on tbloom (cost=24.34..32.03 rows=2 width=24) (actual time=0.028..0.029 rows=0 loops=1) + Bitmap Heap Scan on tbloom (cost=9.29..13.30 rows=1 width=24) (actual time=0.032..0.033 rows=0 loops=1) Recheck Cond: ((i5 = 123451) AND (i2 = 898732)) - -> BitmapAnd (cost=24.34..24.34 rows=2 width=0) (actual time=0.027..0.027 rows=0 loops=1) - -> Bitmap Index Scan on btreeidx5 (cost=0.00..12.04 rows=500 width=0) (actual time=0.026..0.026 rows=0 loops=1) + -> BitmapAnd (cost=9.29..9.29 rows=1 width=0) (actual time=0.047..0.047 rows=0 loops=1) + -> Bitmap Index Scan on btreeidx5 (cost=0.00..4.52 rows=11 width=0) (actual time=0.026..0.026 rows=7 loops=1) Index Cond: (i5 = 123451) - -> Bitmap Index Scan on btreeidx2 (cost=0.00..12.04 rows=500 width=0) (never executed) + -> Bitmap Index Scan on btreeidx2 (cost=0.00..4.52 rows=11 width=0) (actual time=0.007..0.007 rows=8 loops=1) Index Cond: (i2 = 898732) - Planning Time: 0.491 ms - Execution Time: 0.055 ms + Planning Time: 0.264 ms + Execution Time: 0.047 ms (9 rows) Although this query runs much faster than with either of the single indexes, we pay a penalty in index size. Each of the single-column - btree indexes occupies 2 MB, so the total space needed is 12 MB, - eight times the space used by the bloom index. + btree indexes occupies 88.5 MB, so the total space needed is 531 MB, + over three times the space used by the bloom index. diff --git a/doc/src/sgml/brin.sgml b/doc/src/sgml/brin.sgml index 9c5ffcddf8489..64fb520db7e51 100644 --- a/doc/src/sgml/brin.sgml +++ b/doc/src/sgml/brin.sgml @@ -1,6 +1,6 @@ - + BRIN Indexes @@ -8,7 +8,7 @@ BRIN - + Introduction @@ -64,7 +64,7 @@ be more precise and more data blocks can be skipped during an index scan. - + Index Maintenance @@ -95,7 +95,9 @@ - Lastly, the following functions can be used: + Lastly, the following functions can be used (while these functions run, + is temporarily changed to + pg_catalog, pg_temp): brin_summarize_new_values(regclass) @@ -134,10 +136,10 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was See for details. - - + + - + Built-in Operator Classes @@ -741,7 +743,7 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was - + Operator Class Parameters @@ -806,11 +808,11 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was
- + - + - + Extensibility @@ -1338,5 +1340,5 @@ typedef struct BrinOpcInfo float4_minmax_ops as an example of minmax, and box_inclusion_ops as an example of inclusion. + - diff --git a/doc/src/sgml/btree.sgml b/doc/src/sgml/btree.sgml index 6f608a14bf318..2b3997988cff0 100644 --- a/doc/src/sgml/btree.sgml +++ b/doc/src/sgml/btree.sgml @@ -1,6 +1,6 @@ - + B-Tree Indexes @@ -8,7 +8,7 @@ B-Tree - + Introduction @@ -27,12 +27,12 @@ and understanding of sorting semantics. Therefore, they've acquired some features that go beyond what would be needed just to support btree indexes, and parts of the system that are quite distant from the - btree AM make use of them. + btree AM make use of them. - + - + Behavior of B-Tree Operator Classes @@ -200,9 +200,9 @@ planner relies on them for optimization purposes. - + - + B-Tree Support Functions @@ -585,9 +585,9 @@ options(relopts local_relopts *) returns - + - + Implementation @@ -597,7 +597,7 @@ options(relopts local_relopts *) returns distribution for a much more detailed, internals-focused description of the B-Tree implementation. - + B-Tree Structure PostgreSQL B-Tree indexes are @@ -627,9 +627,9 @@ options(relopts local_relopts *) returns the tree structure by creating a new root page that is one level above the original root page. - + - + Bottom-up Index Deletion B-Tree indexes are not directly aware that under MVCC, there might @@ -731,9 +731,9 @@ options(relopts local_relopts *) returns two logical rows whose lifetimes span the same VACUUM cycle). - + - + Deduplication A duplicate is a leaf page tuple (a tuple that points to a table @@ -908,7 +908,7 @@ options(relopts local_relopts *) returns - - + + - + diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index ed32ca03495f4..a63cc71efa2f1 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -1353,6 +1353,17 @@ + + + attcollation oid + (references pg_collation.oid) + + + The defined collation of the column, or zero if the column is + not of a collatable data type + + + attstattarget int2 @@ -1362,7 +1373,7 @@ of statistics accumulated for this column by ANALYZE. A zero value indicates that no statistics should be collected. - A negative value says to use the system default statistics target. + A null value says to use the system default statistics target. The exact meaning of positive values is data type-dependent. For scalar data types, attstattarget is both the target number of most common values @@ -1370,17 +1381,6 @@ - - - attcollation oid - (references pg_collation.oid) - - - The defined collation of the column, or zero if the column is - not of a collatable data type - - - attacl aclitem[] @@ -1624,7 +1624,7 @@ SCRAM-SHA-256$<iteration count>:&l where salt, StoredKey and ServerKey are in Base64 encoded format. This format is - the same as that specified by RFC 5803. + the same as that specified by RFC 5803. @@ -1892,8 +1892,8 @@ SCRAM-SHA-256$<iteration count>:&l - The catalog pg_class catalogs tables and most - everything else that has columns or is otherwise similar to a + The catalog pg_class describes tables and + other objects that have columns or are otherwise similar to a table. This includes indexes (but see also pg_index), sequences (but see also <iteration count>:&l views, materialized views, composite types, and TOAST tables; see relkind. Below, when we mean all of these kinds of objects we speak of - relations. Not all columns are meaningful for all relation - types. + relations. Not all of pg_class's + columns are meaningful for all relation kinds. @@ -1987,9 +1987,13 @@ SCRAM-SHA-256$<iteration count>:&l (references pg_am.oid) - If this is a table or an index, the access method used (heap, - B-tree, hash, etc.); otherwise zero (zero occurs for sequences, - as well as relations without storage, such as views) + The access method used to access this table or index. + Not meaningful if the relation is a sequence or + has no on-disk file, + except for partitioned tables, where, if set, it takes + precedence over default_table_access_method + when determining the access method to use for partitions created + when one is not specified in the creation command. @@ -2010,9 +2014,12 @@ SCRAM-SHA-256$<iteration count>:&l (references pg_tablespace.oid) - The tablespace in which this relation is stored. If zero, - the database's default tablespace is implied. (Not meaningful - if the relation has no on-disk file.) + The tablespace in which this relation is stored. + If zero, the database's default tablespace is implied. + Not meaningful if the relation has no on-disk file, + except for partitioned tables, where this is the tablespace + in which partitions will be created when one is not + specified in the creation command. @@ -2377,9 +2384,9 @@ SCRAM-SHA-256$<iteration count>:&l collprovider char - Provider of the collation: d = database - default, c = libc, i = icu - + Provider of the collation: d = database default, + b = builtin, c = libc, + i = icu @@ -2406,7 +2413,10 @@ SCRAM-SHA-256$<iteration count>:&l collcollate text - LC_COLLATE for this collation object + LC_COLLATE for this collation object. If the provider is + not libc, collcollate is + NULL and colllocale is + used instead. @@ -2415,16 +2425,23 @@ SCRAM-SHA-256$<iteration count>:&l collctype text - LC_CTYPE for this collation object + LC_CTYPE for this collation object. If the provider is + not libc, collctype is + NULL and colllocale is + used instead. - colliculocale text + colllocale text - ICU locale ID for this collation object + Collation provider locale name for this collation object. If the + provider is libc, + colllocale is NULL; + collcollate and + collctype are used instead. @@ -2485,10 +2502,11 @@ SCRAM-SHA-256$<iteration count>:&l The catalog pg_constraint stores check, primary - key, unique, foreign key, and exclusion constraints on tables. + key, unique, foreign key, and exclusion constraints on tables, as well as + not-null constraints on domains. (Column constraints are not treated specially. Every column constraint is equivalent to some table constraint.) - Not-null constraints are represented in the + Not-null constraints on relations are represented in the pg_attribute catalog, not here. @@ -2552,6 +2570,7 @@ SCRAM-SHA-256$<iteration count>:&l c = check constraint, f = foreign key constraint, + n = not-null constraint (domains only), p = primary key constraint, u = unique constraint, t = constraint trigger, @@ -3009,9 +3028,8 @@ SCRAM-SHA-256$<iteration count>:&l datlocprovider char - Locale provider for this database: c = libc, - i = icu - + Locale provider for this database: b = builtin, + c = libc, i = icu @@ -3036,13 +3054,27 @@ SCRAM-SHA-256$<iteration count>:&l + + + dathasloginevt bool + + + Indicates that there are login event triggers defined for this database. + This flag is used to avoid extra lookups on the + pg_event_trigger table during each backend + startup. This flag is used internally by PostgreSQL + and should not be manually altered or read for monitoring purposes. + + + datconnlimit int4 Sets maximum number of concurrent connections that can be made - to this database. -1 means no limit. + to this database. -1 means no limit, -2 indicates the database is + invalid. @@ -3108,10 +3140,14 @@ SCRAM-SHA-256$<iteration count>:&l - daticulocale text + datlocale text - ICU locale ID for this database + Collation provider locale name for this database. If the + provider is libc, + datlocale is NULL; + datcollate and + datctype are used instead. @@ -7139,6 +7175,17 @@ SCRAM-SHA-256$<iteration count>:&l + + SHARED_DEPENDENCY_INITACL (i) + + + The referenced object (which must be a role) is mentioned in a + pg_init_privs + entry for the dependent object. + + + + SHARED_DEPENDENCY_POLICY (r) @@ -7622,14 +7669,27 @@ SCRAM-SHA-256$<iteration count>:&l - stxstattarget int4 + stxkeys int2vector + (references pg_attribute.attnum) + + + An array of attribute numbers, indicating which table columns are + covered by this statistics object; + for example a value of 1 3 would + mean that the first and the third table columns are covered + + + + + + stxstattarget int2 stxstattarget controls the level of detail of statistics accumulated for this statistics object by ANALYZE. A zero value indicates that no statistics should be collected. - A negative value says to use the maximum of the statistics targets of + A null value says to use the maximum of the statistics targets of the referenced columns, if set, or the system default statistics target. Positive values of stxstattarget determine the target number of most common values @@ -7637,19 +7697,6 @@ SCRAM-SHA-256$<iteration count>:&l - - - stxkeys int2vector - (references pg_attribute.attnum) - - - An array of attribute numbers, indicating which table columns are - covered by this statistics object; - for example a value of 1 3 would - mean that the first and the third table columns are covered - - - stxkind char[] @@ -7729,8 +7776,7 @@ SCRAM-SHA-256$<iteration count>:&l is a publicly readable view on pg_statistic_ext_data (after joining with pg_statistic_ext) that only exposes - information about those tables and columns that are readable by the - current user. + information about tables the current user owns.
@@ -7930,7 +7976,8 @@ SCRAM-SHA-256$<iteration count>:&l disk and apply at once after the transaction is committed on the publisher and received by the subscriber, p = apply changes directly using a parallel apply - worker if available (same as 't' if no worker is available) + worker if available (same as t if no worker is + available) @@ -7976,6 +8023,17 @@ SCRAM-SHA-256$<iteration count>:&l + + + subfailover bool + + + If true, the associated replication slots (i.e. the main slot and the + table sync slots) in the upstream database are enabled to be + synchronized to the standbys + + + subconninfo text diff --git a/doc/src/sgml/charset.sgml b/doc/src/sgml/charset.sgml index ed844659967d4..6682927799aca 100644 --- a/doc/src/sgml/charset.sgml +++ b/doc/src/sgml/charset.sgml @@ -293,10 +293,10 @@ initdb --locale=sv_SE As explained above, the environment of the operating system provides the defaults for the locales of a newly initialized database cluster. In - many cases, this is enough: If the operating system is configured for - the desired language/territory, then - PostgreSQL will by default also behave - according to that locale. + many cases, this is enough: if the operating system is configured for + the desired language/territory, by default + PostgreSQL will also behave according + to that locale. @@ -342,22 +342,14 @@ initdb --locale=sv_SE Locale Providers - PostgreSQL supports multiple locale - providers. This specifies which library supplies the locale - data. One standard provider name is libc, which uses - the locales provided by the operating system C library. These are the - locales used by most tools provided by the operating system. Another - provider is icu, which uses the external - ICUICU library. ICU locales can - only be used if support for ICU was configured when PostgreSQL was built. + A locale provider specifies which library defines the locale behavior for + collations and character classifications. The commands and tools that select the locale settings, as described - above, each have an option to select the locale provider. The examples - shown earlier all use the libc provider, which is the - default. Here is an example to initialize a database cluster using the - ICU provider: + above, each have an option to select the locale provider. Here is an + example to initialize a database cluster using the ICU provider: initdb --locale-provider=icu --icu-locale=en @@ -370,17 +362,92 @@ initdb --locale-provider=icu --icu-locale=en - Which locale provider to use depends on individual requirements. For most - basic uses, either provider will give adequate results. For the libc - provider, it depends on what the operating system offers; some operating - systems are better than others. For advanced uses, ICU offers more locale - variants and customization options. + Regardless of the locale provider, the operating system is still used to + provide some locale-aware behavior, such as messages (see ). + + + The available locale providers are listed below: + + + + + builtin + + + The builtin provider uses built-in operations. Only + the C and C.UTF-8 locales are + supported for this provider. + + + The C locale behavior is identical to the + C locale in the libc provider. When using this + locale, the behavior may depend on the database encoding. + + + The C.UTF-8 locale is available only for when the + database encoding is UTF-8, and the behavior is + based on Unicode. The collation uses the code point values only. The + regular expression character classes are based on the "POSIX + Compatible" semantics, and the case mapping is the "simple" variant. + + + + + + icu + + + The icu provider uses the external + ICUICU + library. PostgreSQL must have been + configured with support. + + + ICU provides collation and character classification behavior that is + independent of the operating system and database encoding, which is + preferable if you expect to transition to other platforms without any + change in results. LC_COLLATE and + LC_CTYPE can be set independently of the ICU + locale. + + + + For the ICU provider, results may depend on the version of the ICU + library used, as it is updated to reflect changes in natural language + over time. + + + + + + + libc + + + The libc provider uses the operating system's C + library. The collation and character classification behavior is + controlled by the settings LC_COLLATE and + LC_CTYPE, so they cannot be set independently. + + + + The same locale name may have different behavior on different + platforms when using the libc provider. + + + + + + ICU Locales + ICU Locale Names + The ICU format for the locale name is a Language Tag. @@ -412,16 +479,19 @@ NOTICE: using standard form "de-DE" for locale "de_DE.utf8" linkend="icu-language-tag">language tag instead of relying on the transformation. + A locale with no language name, or the special language name root, is transformed to have the language und ("undefined"). + ICU can transform most libc locale names, as well as some other formats, into language tags for easier transition to ICU. If a libc locale name is used in ICU, it may not have precisely the same behavior as in libc. + If there is a problem interpreting the locale name, or if the locale name represents a language or region that ICU does not recognize, you will see @@ -442,10 +512,12 @@ CREATE COLLATION Language Tag + A language tag, defined in BCP 47, is a standardized identifier used to identify languages, regions, and other information about a locale. + Basic language tags are simply language-region; @@ -457,6 +529,7 @@ CREATE COLLATION ja-JP, de, or fr-CA. + Collation settings may be included in the language tag to customize collation behavior. ICU allows extensive customization, such as @@ -464,6 +537,7 @@ CREATE COLLATION treatment of digits within text; and many other options to satisfy a variety of uses. + To include this additional collation information in a language tag, append -u, which indicates there are additional @@ -477,6 +551,7 @@ CREATE COLLATION -value, which implies a value of true. + For example, the language tag en-US-u-kn-ks-level2 means the locale with the English language in the US region, with @@ -500,6 +575,7 @@ SELECT 'N-45' < 'N-123' COLLATE mycollation5 as result; (1 row) + See for details and additional examples of using language tags with custom collation information for the @@ -507,6 +583,7 @@ SELECT 'N-45' < 'N-123' COLLATE mycollation5 as result; + Problems @@ -775,37 +852,19 @@ SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR"; Standard Collations - On all platforms, the collations named default, - C, and POSIX are available. Additional - collations may be available depending on operating system support. - The default collation selects the LC_COLLATE - and LC_CTYPE values specified at database creation time. - The C and POSIX collations both specify - traditional C behavior, in which only the ASCII letters - A through Z - are treated as letters, and sorting is done strictly by character - code byte values. - - - - - The C and POSIX locales may behave - differently depending on the database encoding. - - - - - Additionally, two SQL standard collation names are available: + On all platforms, the following collations are supported: unicode - This collation sorts using the Unicode Collation Algorithm with the - Default Unicode Collation Element Table. It is available in all - encodings. ICU support is required to use this collation. (This - collation has the same behavior as the ICU root locale; see .) @@ -815,15 +874,68 @@ SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR"; ucs_basic - This collation sorts by Unicode code point. It is only available for - encoding UTF8. (This collation has the same + This SQL standard collation sorts using the Unicode code point values + rather than natural language order, and only the ASCII letters + A through + Z are treated as letters. The + behavior is efficient and stable across all versions. Only available + for encoding UTF8. (This collation has the same behavior as the libc locale specification C in UTF8 encoding.) + + + pg_c_utf8 + + + This collation sorts by Unicode code point values rather than natural + language order. For the functions lower, + initcap, and upper, it uses + Unicode simple case mapping. For pattern matching (including regular + expressions), it uses the POSIX Compatible variant of Unicode Compatibility + Properties. Behavior is efficient and stable within a + Postgres major version. This collation is + only available for encoding UTF8. + + + + + + C (equivalent to POSIX) + + + The C and POSIX collations are + based on traditional C behavior. They sort by byte + values rather than natural language order, and only the ASCII letters + A through + Z are treated as letters. The + behavior is efficient and stable across all versions for a given + database encoding, but behavior may vary between different database + encodings. + + + + + + default + + + The default collation selects the locale specified + at database creation time. + + + + + + Additional collations may be available depending on operating system + support. The efficiency and stability of these additional collations + depend on the collation provider, the provider version, and the locale. + @@ -1100,6 +1212,7 @@ CREATE COLLATION ignore_accents (provider = icu, locale = 'und-u-ks-level1-kc-tr + ICU Custom Collations @@ -1129,8 +1242,10 @@ SELECT 'w;x*y-z' = 'wxyz' COLLATE num_ignore_punct; -- true linkend="icu-collation-settings"/>, or see for more details. + ICU Comparison Levels + Comparison of two strings (collation) in ICU is determined by a multi-level process, where textual features are grouped into @@ -1138,14 +1253,15 @@ SELECT 'w;x*y-z' = 'wxyz' COLLATE num_ignore_punct; -- true linkend="icu-collation-settings-table">collation settings. Higher levels correspond to finer textual features. + shows which textual feature differences are considered significant when determining equality at the - given level. The unicode character U+2063 is an + given level. The Unicode character U+2063 is an invisible separator, and as seen in the table, is ignored for at all levels of comparison less than identic. - +
ICU Collation Levels @@ -1157,6 +1273,7 @@ SELECT 'w;x*y-z' = 'wxyz' COLLATE num_ignore_punct; -- true + Level @@ -1169,6 +1286,7 @@ SELECT 'w;x*y-z' = 'wxyz' COLLATE num_ignore_punct; -- true 'y' = 'z' + level1 @@ -1202,7 +1320,9 @@ SELECT 'w;x*y-z' = 'wxyz' COLLATE num_ignore_punct; -- true level4 - Punctuation + Punctuationonly with + ka-shifted; see true true false @@ -1224,6 +1344,7 @@ SELECT 'w;x*y-z' = 'wxyz' COLLATE num_ignore_punct; -- true
+ At every level, even with full normalization off, basic normalization is performed. For example, 'á' may be composed of the code points U&'\0061\0301' or the single code @@ -1233,9 +1354,9 @@ SELECT 'w;x*y-z' = 'wxyz' COLLATE num_ignore_punct; -- true created with deterministic set to true. + Collation Level Examples - CREATE COLLATION level3 (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-ks-level3'); @@ -1251,18 +1372,18 @@ SELECT 'x-y' = 'x_y' COLLATE level3; -- true SELECT 'x-y' = 'x_y' COLLATE level4; -- false - Collation Settings for an ICU Locale + shows the available collation settings, which can be used as part of a language tag to customize a collation. - + ICU Collation Settings @@ -1270,6 +1391,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false + Key @@ -1278,6 +1400,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false Description + co @@ -1287,6 +1410,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false Collation type. See for additional options and details. + ka noignore, shifted @@ -1299,6 +1423,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false character classes are ignored. + kb true, false @@ -1309,6 +1434,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false before 'aé'. + kc true, false @@ -1325,6 +1451,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false + kf @@ -1339,6 +1466,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false the rules of the locale. + kn true, false @@ -1350,6 +1478,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false 'id-123'. + kk true, false @@ -1373,6 +1502,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false + kr @@ -1398,6 +1528,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false + ks level1, level2, level3, level4, identic @@ -1409,6 +1540,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false for details. + kv @@ -1429,10 +1561,13 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false
- Defaults may depend on locale. The above table is not meant to be - complete. See for additional - options and details. + + + Defaults may depend on locale. The above table is not meant to be + complete. See for additional + options and details. + For many collation settings, you must create the collation with @@ -1447,8 +1582,8 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false
- Examples - + Collation Settings Examples + CREATE COLLATION "de-u-co-phonebk-x-icu" (provider = icu, locale = 'de-u-co-phonebk'); @@ -1494,33 +1629,87 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false + + + + ICU Tailoring Rules + + + If the options provided by the collation settings shown above are not + sufficient, the order of collation elements can be changed with tailoring + rules, whose syntax is detailed at . + + + + This small example creates a collation based on the root locale with a + tailoring rule: + + + + With this rule, the letter W is sorted after + V, but is treated as a secondary difference similar to an + accent. Rules like this are contained in the locale definitions of some + languages. (Of course, if a locale definition already contains the + desired rules, then they don't need to be specified again explicitly.) + + + + Here is a more complex example. The following statement sets up a + collation named ebcdic with rules to sort US-ASCII + characters in the order of the EBCDIC encoding. + + +' < '?' +< '`' < ':' < '#' < '@' < \' < '=' < '"' +<*a-r < '~' <*s-z < '^' < '[' < ']' +< '{' <*A-I < '}' <*J-R < '\' <*S-Z <*0-9 +$$);]]> + +SELECT c +FROM (VALUES ('a'), ('b'), ('A'), ('B'), ('1'), ('2'), ('!'), ('^')) AS x(c) +ORDER BY c COLLATE ebcdic; + c +--- + ! + a + b + ^ + A + B + 1 + 2 + External References for ICU + This section () is only a brief overview of ICU behavior and language tags. Refer to the following documents for technical details, additional options, and new behavior: + - Unicode - Technical Standard #35 + Unicode Technical Standard #35 - BCP 47 + BCP 47 - CLDR - repository + CLDR repository @@ -1530,7 +1719,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false - + @@ -1657,7 +1846,7 @@ SELECT 'x-y' = 'x_y' COLLATE level4; -- false Traditional Chinese, Taiwanese Yes Yes - 1–3 + 1–4
@@ -3212,7 +3401,7 @@ RESET client_encoding; - RFC 3629 + RFC 3629 diff --git a/doc/src/sgml/client-auth.sgml b/doc/src/sgml/client-auth.sgml index 204d09df67b50..f1eb3b279ed42 100644 --- a/doc/src/sgml/client-auth.sgml +++ b/doc/src/sgml/client-auth.sgml @@ -73,6 +73,35 @@ however; see the configuration parameter. + + The pg_hba.conf file is read on start-up and when + the main server process receives a + SIGHUPSIGHUP + signal. If you edit the file on an + active system, you will need to signal the postmaster + (using pg_ctl reload, calling the SQL function + pg_reload_conf(), or using kill + -HUP) to make it re-read the file. + + + + + The preceding statement is not true on Microsoft Windows: there, any + changes in the pg_hba.conf file are immediately + applied by subsequent new connections. + + + + + The system view + pg_hba_file_rules + can be helpful for pre-testing changes to the pg_hba.conf + file, or for diagnosing problems if loading of the file did not have the + desired effects. Rows in the view with + non-null error fields indicate problems in the + corresponding lines of the file. + + The general format of the pg_hba.conf file is a set of records, one per line. Blank lines are ignored, as is any @@ -662,11 +691,11 @@ include_dir directory entire Distinguished Name (DN) of the certificate. This option is probably best used in conjunction with a username map. The comparison is done with the DN in - RFC 2253 + RFC 2253 format. To see the DN of a client certificate in this format, do -openssl x509 -in myclient.crt -noout --subject -nameopt RFC2253 | sed "s/^subject=//" +openssl x509 -in myclient.crt -noout -subject -nameopt RFC2253 | sed "s/^subject=//" Care needs to be taken when using this option, especially when using regular expression matching against the DN. @@ -733,35 +762,6 @@ openssl x509 -in myclient.crt -noout --subject -nameopt RFC2253 | sed "s/^subjec range of allowed client IP addresses. - - The pg_hba.conf file is read on start-up and when - the main server process receives a - SIGHUPSIGHUP - signal. If you edit the file on an - active system, you will need to signal the postmaster - (using pg_ctl reload, calling the SQL function - pg_reload_conf(), or using kill - -HUP) to make it re-read the file. - - - - - The preceding statement is not true on Microsoft Windows: there, any - changes in the pg_hba.conf file are immediately - applied by subsequent new connections. - - - - - The system view - pg_hba_file_rules - can be helpful for pre-testing changes to the pg_hba.conf - file, or for diagnosing problems if loading of the file did not have the - desired effects. Rows in the view with - non-null error fields indicate problems in the - corresponding lines of the file. - - To connect to a particular database, a user must not only pass the @@ -810,12 +810,11 @@ host all all ::1/128 trust host all all localhost trust # The same using a regular expression for DATABASE, that allows connection -# to the database db1, db2 and any databases with a name beginning with "db" -# and finishing with a number using two to four digits (like "db1234" or -# "db12"). +# to any databases with a name beginning with "db" and finishing with a +# number using two to four digits (like "db1234" or "db12"). # -# TYPE DATABASE USER ADDRESS METHOD -local db1,"/^db\d{2,4}$",db2 all localhost trust +# TYPE DATABASE USER ADDRESS METHOD +host "/^db\d{2,4}$" all localhost trust # Allow any user from any host with IP address 192.168.93.x to connect # to database "postgres" as the same user name that ident reports for @@ -933,6 +932,28 @@ local db1,db2,@demodbs all md5 As for pg_hba.conf, the lines in this file can be include directives, following the same rules. + + + The pg_ident.conf file is read on start-up and + when the main server process receives a + SIGHUPSIGHUP + signal. If you edit the file on an + active system, you will need to signal the postmaster + (using pg_ctl reload, calling the SQL function + pg_reload_conf(), or using kill + -HUP) to make it re-read the file. + + + + The system view + pg_ident_file_mappings + can be helpful for pre-testing changes to the + pg_ident.conf file, or for diagnosing problems if + loading of the file did not have the desired effects. Rows in the view with + non-null error fields indicate problems in the + corresponding lines of the file. + + There is no restriction regarding how many database users a given operating system user can correspond to, nor vice versa. Thus, entries @@ -943,8 +964,8 @@ local db1,db2,@demodbs all md5 external authentication system with the database user name that the user has requested to connect as. The value all can be used as the database-username to specify - that if the system-user matches, then this user - is allowed to log in as any of the existing database users. Quoting + that if the system-username matches, then this + user is allowed to log in as any of the existing database users. Quoting all makes the keyword lose its special meaning. @@ -984,7 +1005,7 @@ mymap /^(.*)@otherdomain\.com$ guest a slash (/), the remainder of the field is treated as a regular expression (see for details of PostgreSQL's regular - expression syntax. It is not possible to use \1 + expression syntax). It is not possible to use \1 to use a capture from regular expression on system-username for a regular expression on database-username. @@ -999,27 +1020,6 @@ mymap /^(.*)@otherdomain\.com$ guest - - The pg_ident.conf file is read on start-up and - when the main server process receives a - SIGHUPSIGHUP - signal. If you edit the file on an - active system, you will need to signal the postmaster - (using pg_ctl reload, calling the SQL function - pg_reload_conf(), or using kill - -HUP) to make it re-read the file. - - - - The system view - pg_ident_file_mappings - can be helpful for pre-testing changes to the - pg_ident.conf file, or for diagnosing problems if - loading of the file did not have the desired effects. Rows in the view with - non-null error fields indicate problems in the - corresponding lines of the file. - - A pg_ident.conf file that could be used in conjunction with the pg_hba.conf file in Ident authentication, which relies on an Identification Protocol - (RFC 1413) + (RFC 1413) service on the client's machine. (On local Unix-socket connections, this is treated as peer authentication.) @@ -1228,7 +1228,7 @@ omicron bryanh guest1 The method scram-sha-256 performs SCRAM-SHA-256 authentication, as described in - RFC 7677. It + RFC 7677. It is a challenge-response scheme that prevents password sniffing on untrusted connections and supports storing passwords on the server in a cryptographically hashed form that is thought to be secure. @@ -1253,11 +1253,6 @@ omicron bryanh guest1 attacks. - - The md5 method cannot be used with - the feature. - - To ease transition from the md5 method to the newer SCRAM method, if md5 is specified as a method @@ -1340,7 +1335,7 @@ omicron bryanh guest1 GSSAPI is an industry-standard protocol for secure authentication defined in - RFC 2743. + RFC 2743. PostgreSQL supports GSSAPI for authentication, communications encryption, or both. @@ -1510,10 +1505,12 @@ omicron bryanh guest1 negotiate mode, which will use Kerberos when possible and automatically fall back to NTLM in other cases. - SSPI authentication only works when both - server and client are running Windows, - or, on non-Windows platforms, when GSSAPI - is available. + SSPI and GSSAPI + interoperate as clients and servers, e.g., an + SSPI client can authenticate to an + GSSAPI server. It is recommended to use + SSPI on Windows clients and servers and + GSSAPI on non-Windows platforms. @@ -1653,7 +1650,7 @@ omicron bryanh guest1 The Identification Protocol is described in - RFC 1413. + RFC 1413. Virtually every Unix-like operating system ships with an ident server that listens on TCP port 113 by default. The basic functionality of an ident server @@ -1775,13 +1772,13 @@ omicron bryanh guest1 do an exact match of the attribute specified in ldapsearchattribute. Once the user has been found in - this search, the server disconnects and re-binds to the directory as + this search, the server re-binds to the directory as this user, using the password specified by the client, to verify that the login is correct. This mode is the same as that used by LDAP authentication schemes in other software, such as Apache mod_authnz_ldap and pam_ldap. This method allows for significantly more flexibility in where the user objects are located in the directory, but will cause - two separate connections to the LDAP server to be made. + two additional requests to the LDAP server to be made. @@ -1822,7 +1819,7 @@ omicron bryanh guest1 Set to 1 to make the connection between PostgreSQL and the LDAP server use TLS encryption. This uses the StartTLS - operation per RFC 4513. + operation per RFC 4513. See also the ldapscheme option for an alternative. @@ -1917,7 +1914,7 @@ omicron bryanh guest1 ldapurl - An RFC 4516 + An RFC 4516 LDAP URL. This is an alternative way to write some of the other LDAP options in a more compact and standard form. The format is @@ -1980,7 +1977,7 @@ ldap[s]://host[:port]/OpenLDAP as the LDAP client library, the ldapserver setting may be omitted. In that case, a list of host names and ports is looked up via - RFC 2782 DNS SRV records. + RFC 2782 DNS SRV records. The name _ldap._tcp.DOMAIN is looked up, where DOMAIN is extracted from ldapbasedn. @@ -2008,7 +2005,7 @@ host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapse the LDAP server, perform a search for (uid=someuser) under the specified base DN. If an entry is found, it will then attempt to bind using that found information and the password supplied by the client. - If that second connection succeeds, the database access is granted. + If that second bind succeeds, the database access is granted. @@ -2170,7 +2167,8 @@ host ... radius radiusservers="server1,server2" radiussecrets="""secret one"","" This authentication method uses SSL client certificates to perform - authentication. It is therefore only available for SSL connections. + authentication. It is therefore only available for SSL connections; + see for SSL configuration instructions. When using this authentication method, the server will require that the client provide a valid, trusted certificate. No password prompt will be sent to the client. The cn (Common Name) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index 6262cb7bb2f1a..1ec048ac31b9d 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -199,7 +199,8 @@ shared_buffers = 128MB External tools may also modify postgresql.auto.conf. It is not - recommended to do this while the server is running, since a + recommended to do this while the server is running unless is set to off, since a concurrent ALTER SYSTEM command could overwrite such changes. Such tools might simply append new settings to the end, or they might choose to remove duplicate settings and/or comments @@ -333,9 +334,10 @@ UPDATE pg_settings SET setting = reset_val WHERE name = 'configuration_parameter During server startup, parameter settings can be passed to the postgres command via the - command-line parameter. For example, + command-line parameter, or its equivalent + variation. For example, -postgres -c log_connections=yes -c log_destination='syslog' +postgres -c log_connections=yes --log-destination='syslog' Settings provided in this way override those set via postgresql.conf or ALTER SYSTEM, @@ -352,10 +354,10 @@ postgres -c log_connections=yes -c log_destination='syslog' of the session, but do not affect other sessions. For historical reasons, the format of PGOPTIONS is similar to that used when launching the postgres - command; specifically, the flag must be specified. - For example, + command; specifically, the , or prepended + --, before the name must be specified. For example, -env PGOPTIONS="-c geqo=off -c statement_timeout=5min" psql +env PGOPTIONS="-c geqo=off --statement-timeout=5min" psql @@ -656,10 +658,15 @@ include_dir 'conf.d' :: allows listening for all IPv6 addresses. If the list is empty, the server does not listen on any IP interface at all, in which case only Unix-domain sockets can be used to connect - to it. + to it. If the list is not empty, the server will start if it + can listen on at least one TCP/IP address. A warning will be + emitted for any TCP/IP address which cannot be opened. The default value is localhost, which allows only local TCP/IP loopback connections to be - made. While client authentication ( + + While client authentication () allows fine-grained control over who can access the server, listen_addresses controls which interfaces accept connection attempts, which @@ -700,6 +707,12 @@ include_dir 'conf.d' only be set at server start. + + PostgreSQL sizes certain resources based directly on the value of + max_connections. Increasing its value leads to + higher allocation of those resources, including shared memory. + + When running a standby server, you must set this parameter to the same or higher value than on the primary server. Otherwise, queries @@ -1182,64 +1195,12 @@ include_dir 'conf.d' Sets whether GSSAPI delegation should be accepted from the client. The default is off meaning credentials from the client will - NOT be accepted. Changing this to on will make the server + not be accepted. Changing this to on will make the server accept credentials delegated to it from the client. This parameter can only be set in the postgresql.conf file or on the server command line. - - - db_user_namespace (boolean) - - db_user_namespace configuration parameter - - - - - This parameter enables per-database user names. It is off by default. - This parameter can only be set in the postgresql.conf - file or on the server command line. - - - - If this is on, you should create users as username@dbname. - When username is passed by a connecting client, - @ and the database name are appended to the user - name and that database-specific user name is looked up by the - server. Note that when you create users with names containing - @ within the SQL environment, you will need to - quote the user name. - - - - With this parameter enabled, you can still create ordinary global - users. Simply append @ when specifying the user - name in the client, e.g., joe@. The @ - will be stripped off before the user name is looked up by the - server. - - - - db_user_namespace causes the client's and - server's user name representation to differ. - Authentication checks are always done with the server's user name - so authentication methods must be configured for the - server's user name, not the client's. Because - md5 uses the user name as salt on both the - client and server, md5 cannot be used with - db_user_namespace. - - - - - This feature is intended as a temporary measure until a - complete solution is found. At that time, this option will - be removed. - - - - @@ -1482,11 +1443,11 @@ include_dir 'conf.d' - Older PostgreSQL versions do not have this setting and always use the - client's preferences. This setting is mainly for backward - compatibility with those versions. Using the server's preferences is - usually better because it is more likely that the server is appropriately - configured. + PostgreSQL versions before 9.4 do not have + this setting and always use the client's preferences. This setting is + mainly for backward compatibility with those versions. Using the + server's preferences is usually better because it is more likely that + the server is appropriately configured. @@ -1727,7 +1688,9 @@ include_dir 'conf.d' server will try to request huge pages, but fall back to the default if that fails. With on, failure to request huge pages will prevent the server from starting up. With off, - huge pages will not be requested. + huge pages will not be requested. The actual state of huge pages is + indicated by the server variable + . @@ -1879,9 +1842,10 @@ include_dir 'conf.d' (such as a sort or hash table) before writing to temporary disk files. If this value is specified without units, it is taken as kilobytes. The default value is four megabytes (4MB). - Note that for a complex query, several sort or hash operations might be - running in parallel; each operation will generally be allowed - to use as much memory as this value specifies before it starts + Note that a complex query might perform several sort and hash + operations at the same time, with each operation generally being + allowed to use as much memory as this value specifies before + it starts to write data into temporary files. Also, several running sessions could be doing such operations concurrently. Therefore, the total memory used could be many times the value @@ -1889,14 +1853,13 @@ include_dir 'conf.d' fact in mind when choosing the value. Sort operations are used for ORDER BY, DISTINCT, and merge joins. - Hash tables are used in hash joins, hash-based aggregation, result - cache nodes and hash-based processing of IN - subqueries. + Hash tables are used in hash joins, hash-based aggregation, memoize + nodes and hash-based processing of IN subqueries. Hash-based operations are generally more sensitive to memory availability than equivalent sort-based operations. The - memory available for hash tables is computed by multiplying + memory limit for a hash table is computed by multiplying work_mem by hash_mem_multiplier. This makes it possible for hash-based operations to use an amount of memory @@ -1963,11 +1926,6 @@ include_dir 'conf.d' too high. It may be useful to control for this by separately setting . - - Note that for the collection of dead tuple identifiers, - VACUUM is only able to utilize up to a maximum of - 1GB of memory. - @@ -1990,13 +1948,6 @@ include_dir 'conf.d' postgresql.conf file or on the server command line. - - For the collection of dead tuple identifiers, autovacuum is only able - to utilize up to a maximum of 1GB of memory, so - setting autovacuum_work_mem to a value higher than - that has no effect on the number of dead tuples that autovacuum can - collect while scanning a table. - @@ -2017,7 +1968,7 @@ include_dir 'conf.d' valid sizes range from 128 kB to 16 GB. If the specified size would exceed 1/8 the size of shared_buffers, the size is silently capped - to that value. The default value is 256 kB. If + to that value. The default value is 2MB. If this value is specified without units, it is taken as kilobytes. This parameter can be set at any time. It can be overridden for and @@ -2051,6 +2002,145 @@ include_dir 'conf.d' + + commit_timestamp_buffers (integer) + + commit_timestamp_buffers configuration parameter + + + + + Specifies the amount of memory to use to cache the contents of + pg_commit_ts (see + ). + If this value is specified without units, it is taken as blocks, + that is BLCKSZ bytes, typically 8kB. + The default value is 0, which requests + shared_buffers/512 up to 1024 blocks, + but not fewer than 16 blocks. + This parameter can only be set at server start. + + + + + + multixact_member_buffers (integer) + + multixact_member_buffers configuration parameter + + + + + Specifies the amount of shared memory to use to cache the contents + of pg_multixact/members (see + ). + If this value is specified without units, it is taken as blocks, + that is BLCKSZ bytes, typically 8kB. + The default value is 32. + This parameter can only be set at server start. + + + + + + multixact_offset_buffers (integer) + + multixact_offset_buffers configuration parameter + + + + + Specifies the amount of shared memory to use to cache the contents + of pg_multixact/offsets (see + ). + If this value is specified without units, it is taken as blocks, + that is BLCKSZ bytes, typically 8kB. + The default value is 16. + This parameter can only be set at server start. + + + + + + notify_buffers (integer) + + notify_buffers configuration parameter + + + + + Specifies the amount of shared memory to use to cache the contents + of pg_notify (see + ). + If this value is specified without units, it is taken as blocks, + that is BLCKSZ bytes, typically 8kB. + The default value is 16. + This parameter can only be set at server start. + + + + + + serializable_buffers (integer) + + serializable_buffers configuration parameter + + + + + Specifies the amount of shared memory to use to cache the contents + of pg_serial (see + ). + If this value is specified without units, it is taken as blocks, + that is BLCKSZ bytes, typically 8kB. + The default value is 32. + This parameter can only be set at server start. + + + + + + subtransaction_buffers (integer) + + subtransaction_buffers configuration parameter + + + + + Specifies the amount of shared memory to use to cache the contents + of pg_subtrans (see + ). + If this value is specified without units, it is taken as blocks, + that is BLCKSZ bytes, typically 8kB. + The default value is 0, which requests + shared_buffers/512 up to 1024 blocks, + but not fewer than 16 blocks. + This parameter can only be set at server start. + + + + + + transaction_buffers (integer) + + transaction_buffers configuration parameter + + + + + Specifies the amount of shared memory to use to cache the contents + of pg_xact (see + ). + If this value is specified without units, it is taken as blocks, + that is BLCKSZ bytes, typically 8kB. + The default value is 0, which requests + shared_buffers/512 up to 1024 blocks, + but not fewer than 16 blocks. + This parameter can only be set at server start. + + + + max_stack_depth (integer) @@ -2196,6 +2286,22 @@ include_dir 'conf.d' + + max_notify_queue_pages (integer) + + max_notify_queue_pages configuration parameter + + + + + Specifies the maximum amount of allocated pages for + / queue. + The default value is 1048576. For 8 KB pages it allows to consume + up to 8 GB of disk space. + + + + @@ -2348,8 +2454,8 @@ include_dir 'conf.d' - The accumulated cost that will cause the vacuuming process to sleep. - The default value is 200. + This is the accumulated cost that will cause the vacuuming process to sleep + for vacuum_cost_delay. The default is 200. @@ -2409,7 +2515,7 @@ include_dir 'conf.d' bgwriter_delay. If this value is specified without units, it is taken as milliseconds. The default value is 200 - milliseconds (200ms). Note that on many systems, the + milliseconds (200ms). Note that on some systems, the effective resolution of sleep delays is 10 milliseconds; setting bgwriter_delay to a value that is not a multiple of 10 might have the same results as setting it to the next higher multiple @@ -2609,6 +2715,20 @@ include_dir 'conf.d' + + io_combine_limit (integer) + + io_combine_limit configuration parameter + + + + + Controls the largest I/O size in operations that combine I/O. + The default is 128kB. + + + + max_worker_processes (integer) @@ -2617,7 +2737,7 @@ include_dir 'conf.d' - Sets the maximum number of background processes that the system + Sets the maximum number of background processes that the cluster can support. This parameter can only be set at server start. The default is 8. @@ -2690,7 +2810,7 @@ include_dir 'conf.d' Sets the maximum number of parallel workers that can be started by a single utility command. Currently, the parallel utility commands that support the use of parallel workers are - CREATE INDEX only when building a B-tree index, + CREATE INDEX when building a B-tree or BRIN index, and VACUUM without FULL option. Parallel workers are taken from the pool of processes established by , limited @@ -2725,7 +2845,7 @@ include_dir 'conf.d' - Sets the maximum number of workers that the system can support for + Sets the maximum number of workers that the cluster can support for parallel operations. The default value is 8. When increasing or decreasing this value, consider also adjusting and @@ -2760,65 +2880,6 @@ include_dir 'conf.d' - - - old_snapshot_threshold (integer) - - old_snapshot_threshold configuration parameter - - - - - Sets the minimum amount of time that a query snapshot can be used - without risk of a snapshot too old error occurring - when using the snapshot. Data that has been dead for longer than - this threshold is allowed to be vacuumed away. This can help - prevent bloat in the face of snapshots which remain in use for a - long time. To prevent incorrect results due to cleanup of data which - would otherwise be visible to the snapshot, an error is generated - when the snapshot is older than this threshold and the snapshot is - used to read a page which has been modified since the snapshot was - built. - - - - If this value is specified without units, it is taken as minutes. - A value of -1 (the default) disables this feature, - effectively setting the snapshot age limit to infinity. - This parameter can only be set at server start. - - - - Useful values for production work probably range from a small number - of hours to a few days. Small values (such as 0 or - 1min) are only allowed because they may sometimes be - useful for testing. While a setting as high as 60d is - allowed, please note that in many workloads extreme bloat or - transaction ID wraparound may occur in much shorter time frames. - - - - When this feature is enabled, freed space at the end of a relation - cannot be released to the operating system, since that could remove - information needed to detect the snapshot too old - condition. All space allocated to a relation remains associated with - that relation for reuse only within that relation unless explicitly - freed (for example, with VACUUM FULL). - - - - This setting does not attempt to guarantee that an error will be - generated under any particular circumstances. In fact, if the - correct results can be generated from (for example) a cursor which - has materialized a result set, no error will be generated even if the - underlying rows in the referenced table have been vacuumed away. - Some tables cannot safely be vacuumed early, and so will not be - affected by this setting, such as system catalogs. For such tables - this setting will neither reduce bloat nor create a possibility - of a snapshot too old error on scanning. - - - @@ -3362,7 +3423,7 @@ include_dir 'conf.d' flushed to disk. If this value is specified without units, it is taken as milliseconds. The default value is 200 milliseconds (200ms). Note that - on many systems, the effective resolution of sleep delays is 10 + on some systems, the effective resolution of sleep delays is 10 milliseconds; setting wal_writer_delay to a value that is not a multiple of 10 might have the same results as setting it to the next higher multiple of 10. This parameter can only be set in the @@ -4238,6 +4299,72 @@ restore_command = 'copy "C:\\server\\archivedir\\%f" "%p"' # Windows + + WAL Summarization + + + These settings control WAL summarization, a feature which must be + enabled in order to perform an + incremental backup. + + + + + summarize_wal (boolean) + + summarize_wal configuration parameter + + + + + Enables the WAL summarizer process. Note that WAL summarization can + be enabled either on a primary or on a standby. This parameter can only + be set in the postgresql.conf file or on the server + command line. The default is off. + + + The server cannot be started with summarize_wal=on + if wal_level is set to minimal. If + summarize_wal=on is configured after server startup + while wal_level=minimal, the summarizer will run + but refuse to generate summary files for any WAL generated with + wal_level=minimal. + + + + + + wal_summary_keep_time (integer) + + wal_summary_keep_time configuration parameter + + + + + Configures the amount of time after which the WAL summarizer + automatically removes old WAL summaries. The file timestamp is used to + determine which files are old enough to remove. Typically, you should set + this comfortably higher than the time that could pass between a backup + and a later incremental backup that depends on it. WAL summaries must + be available for the entire range of WAL records between the preceding + backup and the new one being taken; if not, the incremental backup will + fail. If this parameter is set to zero, WAL summaries will not be + automatically deleted, but it is safe to manually remove files that you + know will not be required for future incremental backups. + This parameter can only be set in the + postgresql.conf file or on the server command line. + If this value is specified without units, it is taken as minutes. + The default is 10 days. If summarize_wal = off, + existing WAL summaries will not be removed regardless of the value of + this parameter, because the WAL summarizer will not run. + + + + + + + + @@ -4448,6 +4575,45 @@ restore_command = 'copy "C:\\server\\archivedir\\%f" "%p"' # Windows + + synchronized_standby_slots (string) + + synchronized_standby_slots configuration parameter + + + + + A comma-separated list of streaming replication standby server slot names + that logical WAL sender processes will wait for. Logical WAL sender processes + will send decoded changes to plugins only after the specified replication + slots confirm receiving WAL. This guarantees that logical replication + failover slots do not consume changes until those changes are received + and flushed to corresponding physical standbys. If a + logical replication connection is meant to switch to a physical standby + after the standby is promoted, the physical replication slot for the + standby should be listed here. Note that logical replication will not + proceed if the slots specified in the + synchronized_standby_slots do not exist or are invalidated. + Additionally, the replication management functions + + pg_replication_slot_advance, + + pg_logical_slot_get_changes, and + + pg_logical_slot_peek_changes, + when used with logical failover slots, will block until all + physical slots specified in synchronized_standby_slots have + confirmed WAL receipt. + + + The standbys corresponding to the physical replication slots in + synchronized_standby_slots must configure + sync_replication_slots = true so they can receive + logical failover slot changes from the primary. + + + + @@ -4640,8 +4806,13 @@ ANY num_sync ( ), + it is also necessary to specify a valid dbname + in the primary_conninfo string. This will only be + used for slot synchronization. It is ignored for streaming. This parameter can only be set in the postgresql.conf @@ -4834,16 +5005,6 @@ ANY num_sync ( ( + sync_replication_slots (boolean) + + sync_replication_slots configuration parameter + + + + + It enables a physical standby to synchronize logical failover slots + from the primary server so that logical subscribers can resume + replication from the new primary server after failover. + + + It is disabled by default. This parameter can only be set in the + postgresql.conf file or on the server command line. + + + @@ -5168,6 +5347,25 @@ ANY num_sync ( + enable_group_by_reordering (boolean) + + enable_group_by_reordering configuration parameter + + + + + Controls if the query planner will produce a plan which will provide + GROUP BY keys sorted in the order of keys of + a child node of the plan, such as an index scan. When disabled, the + query planner will produce a plan with GROUP BY + keys only sorted to match the ORDER BY clause, + if any. When enabled, the planner will try to produce a more + efficient plan. The default value is on. + + + + enable_hashagg (boolean) @@ -5221,8 +5419,9 @@ ANY num_sync ( . @@ -5237,7 +5436,9 @@ ANY num_sync ( ). - The default is on. + The default is on. The + setting must also be + enabled to have the query planner consider index-only-scans. @@ -5369,9 +5570,13 @@ ANY num_sync ( num_sync ( parameter. Only printable ASCII characters may be used in the - application_name value. Other characters will be - replaced with question marks (?). + application_name value. + Other characters are replaced with C-style hexadecimal escapes. @@ -7353,7 +7564,7 @@ local0.* /var/log/postgresql %v - Virtual transaction ID (backendID/localXID); see + Virtual transaction ID (procNumber/localXID); see no @@ -7606,11 +7817,12 @@ log_line_prefix = '%m [%p] %q%u@%d/%a ' - Causes each replication command to be logged in the server log. - See for more information about - replication command. The default value is off. - Only superusers and users with the appropriate SET - privilege can change this setting. + Causes each replication command and walsender + process's replication slot acquisition/release to be logged in the + server log. See for more + information about replication command. The default value is + off. Only superusers and users with the appropriate + SET privilege can change this setting. @@ -7997,17 +8209,19 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; various purposes. The cluster name appears in the process title for all server processes in this cluster. Moreover, it is the default application name for a standby connection (see .) + linkend="guc-synchronous-standby-names"/>). The name can be any string of less than NAMEDATALEN characters (64 characters in a standard build). Only printable ASCII characters may be used in the - cluster_name value. Other characters will be - replaced with question marks (?). No name is shown - if this parameter is set to the empty string '' (which is - the default). This parameter can only be set at server start. + cluster_name value. + Other characters are replaced with C-style hexadecimal escapes. + No name is shown if this parameter is set to the empty string + '' (which is the default). + This parameter can only be set at server start. @@ -8122,7 +8336,9 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; measure the overhead of timing on your system. I/O timing information is displayed in - pg_stat_database, in the output of + pg_stat_database, + + pg_stat_io, in the output of when the BUFFERS option is used, in the output of when the VERBOSE option is used, by autovacuum @@ -9135,7 +9351,7 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; The timeout is measured from the time a command arrives at the server until it is completed by the server. If multiple SQL - statements appear in a single simple-Query message, the timeout + statements appear in a single simple-query message, the timeout is applied to each statement separately. (PostgreSQL versions before 13 usually treated the timeout as applying to the whole query string.) @@ -9152,6 +9368,42 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; + + transaction_timeout (integer) + + transaction_timeout configuration parameter + + + + + Terminate any session that spans longer than the specified amount of + time in a transaction. The limit applies both to explicit transactions + (started with BEGIN) and to an implicitly started + transaction corresponding to a single statement. + If this value is specified without units, it is taken as milliseconds. + A value of zero (the default) disables the timeout. + + + + If transaction_timeout is shorter or equal to + idle_in_transaction_session_timeout or statement_timeout + then the longer timeout is ignored. + + + + Setting transaction_timeout in + postgresql.conf is not recommended because it would + affect all sessions. + + + + + Prepared transactions are not subject to this timeout. + + + + + lock_timeout (integer) @@ -9545,6 +9797,42 @@ SET XML OPTION { DOCUMENT | CONTENT }; + + event_triggers (boolean) + + event_triggers + configuration parameter + + + + + Allow temporarily disabling execution of event triggers in order to + troubleshoot and repair faulty event triggers. All event triggers will + be disabled by setting it to false. Setting the value + to true allows all event triggers to fire, this + is the default value. Only superusers and users with the appropriate + SET privilege can change this setting. + + + + + + restrict_nonsystem_relation_kind (string) + + restrict_nonsystem_relation_kind + configuration parameter + + + + + Set relation kinds for which access to non-system relations is prohibited. + The value takes the form of a comma-separated list of relation kinds. + Currently, the supported relation kinds are view and + foreign-table. + + + + @@ -10528,6 +10816,54 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' + + allow_alter_system (boolean) + + allow_alter_system configuration parameter + + + + + When allow_alter_system is set to + off, an error is returned if the ALTER + SYSTEM command is executed. This parameter can only be set in + the postgresql.conf file or on the server command + line. The default value is on. + + + + Note that this setting must not be regarded as a security feature. It + only disables the ALTER SYSTEM command. It does not + prevent a superuser from changing the configuration using other SQL + commands. A superuser has many ways of executing shell commands at + the operating system level, and can therefore modify + postgresql.auto.conf regardless of the value of + this setting. + + + + Turning this setting off is intended for environments where the + configuration of PostgreSQL is managed by + some external tool. + In such environments, a well intentioned superuser might + mistakenly use ALTER SYSTEM + to change the configuration instead of using the external tool. + This might result in unintended behavior, such as the external tool + overwriting the change at some later point in time when it updates the + configuration. + Setting this parameter to off can + help avoid such mistakes. + + + + This parameter only controls the use of ALTER SYSTEM. + The settings stored in postgresql.auto.conf + take effect even if allow_alter_system is set to + off. + + + + @@ -10629,7 +10965,7 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' On Linux, syncfs may be used instead, to ask the - operating system to synchronize the whole file systems that contain the + operating system to synchronize the file systems that contain the data directory, the WAL files and each tablespace (but not any other file systems that may be reachable through symbolic links). This may be a lot faster than the fsync setting, because it @@ -10738,6 +11074,25 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' + + huge_pages_status (enum) + + huge_pages_status configuration parameter + + + + + Reports the state of huge pages in the current instance: + on, off, or + unknown (if displayed with + postgres -C). + This parameter is useful to determine whether allocation of huge pages + was successful under huge_pages=try. + See for more information. + + + + integer_datetimes (boolean) @@ -11261,32 +11616,6 @@ dynamic_library_path = 'C:\tools\postgresql;H:\my_project\lib;$libdir' - - trace_recovery_messages (enum) - - trace_recovery_messages configuration parameter - - - - - Enables logging of recovery-related debugging output that otherwise - would not be logged. This parameter allows the user to override the - normal setting of , but only for - specific messages. This is intended for use in debugging hot standby. - Valid values are DEBUG5, DEBUG4, - DEBUG3, DEBUG2, DEBUG1, and - LOG. The default, LOG, does not affect - logging decisions at all. The other values cause recovery-related - debug messages of that priority or higher to be logged as though they - had LOG priority; for common settings of - log_min_messages this results in unconditionally sending - them to the server log. - This parameter can only be set in the postgresql.conf - file or on the server command line. - - - - trace_sort (boolean) @@ -11744,10 +12073,10 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1) - - logical_replication_mode (enum) + + debug_logical_replication_streaming (enum) - logical_replication_mode configuration parameter + debug_logical_replication_streaming configuration parameter @@ -11756,15 +12085,15 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1) immediate. The default is buffered. This parameter is intended to be used to test logical decoding and replication of large transactions. The effect of - logical_replication_mode is different for the + debug_logical_replication_streaming is different for the publisher and subscriber: - On the publisher side, logical_replication_mode + On the publisher side, debug_logical_replication_streaming allows streaming or serializing changes immediately in logical decoding. When set to immediate, stream each change if the - streaming + streaming option of CREATE SUBSCRIPTION is enabled, otherwise, serialize each change. When set to @@ -11774,7 +12103,7 @@ LOG: CleanUpLock: deleting: lock(0xb7acd844) id(24688,24696,0,0,0,1) On the subscriber side, if the streaming option is set to - parallel, logical_replication_mode + parallel, debug_logical_replication_streaming can be used to direct the leader apply worker to send changes to the shared memory queue or to serialize all changes to the file. When set to buffered, the leader sends changes to parallel apply diff --git a/doc/src/sgml/contrib.sgml b/doc/src/sgml/contrib.sgml index 922421a8971c6..44639a8dcab90 100644 --- a/doc/src/sgml/contrib.sgml +++ b/doc/src/sgml/contrib.sgml @@ -127,7 +127,6 @@ CREATE EXTENSION extension_name; component for details. - &adminpack; &amcheck; &auth-delay; &auto-explain; @@ -150,7 +149,6 @@ CREATE EXTENSION extension_name; &isn; &lo; <ree; - &oldsnapshot; &pageinspect; &passwordcheck; &pgbuffercache; diff --git a/doc/src/sgml/custom-rmgr.sgml b/doc/src/sgml/custom-rmgr.sgml index baf86b1c07dc1..3032b2dc0d2df 100644 --- a/doc/src/sgml/custom-rmgr.sgml +++ b/doc/src/sgml/custom-rmgr.sgml @@ -1,10 +1,10 @@ - + Custom WAL Resource Managers - This chapter explains the interface between the core + This section explains the interface between the core PostgreSQL system and custom WAL resource managers, which enable extensions to integrate directly with the WAL. @@ -13,10 +13,7 @@ An extension, especially a Table Access Method or Index Access Method, may need to use WAL for recovery, replication, and/or Logical Decoding. Custom resource managers - are a more flexible alternative to Generic - WAL (which does not support logical decoding), but more complex for - an extension to implement. + linkend="logicaldecoding">Logical Decoding. To create a new custom WAL resource manager, first define an @@ -96,10 +93,10 @@ extern void RegisterCustomRmgr(RmgrId rmid, const RmgrData *rmgr); - The extension must remain in shared_preload_libraries as long as any - custom WAL records may exist in the system. Otherwise + The extension must remain in shared_preload_libraries + as long as any custom WAL records may exist in the system. Otherwise PostgreSQL will not be able to apply or decode the custom WAL records, which may prevent the server from starting. - + diff --git a/doc/src/sgml/custom-scan.sgml b/doc/src/sgml/custom-scan.sgml index 93d96f2f56690..a200d502cddee 100644 --- a/doc/src/sgml/custom-scan.sgml +++ b/doc/src/sgml/custom-scan.sgml @@ -38,8 +38,8 @@ A custom scan provider will typically add paths for a base relation by setting the following hook, which is called after the core code has generated all the access paths it can for the relation (except for - Gather paths, which are made after this call so that they can use - partial paths added by the hook): + Gather and Gather Merge paths, which are made after this call so that + they can use partial paths added by the hook): typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, RelOptInfo *rel, @@ -53,15 +53,17 @@ extern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook; Although this hook function can be used to examine, modify, or remove paths generated by the core system, a custom scan provider will typically confine itself to generating CustomPath objects and adding - them to rel using add_path. The custom scan - provider is responsible for initializing the CustomPath - object, which is declared like this: + them to rel using add_path, or + add_partial_path if they are partial paths. The + custom scan provider is responsible for initializing the + CustomPath object, which is declared like this: typedef struct CustomPath { Path path; uint32 flags; List *custom_paths; + List *custom_restrictinfo; List *custom_private; const CustomPathMethods *methods; } CustomPath; @@ -85,12 +87,16 @@ typedef struct CustomPath An optional custom_paths is a list of Path nodes used by this custom-path node; these will be transformed into Plan nodes by planner. + As described below, custom paths can be created for join relations as + well. In such a case, custom_restrictinfo + should be used to store the set of join clauses to apply to the join the + custom path replaces. Otherwise it should be NIL. custom_private can be used to store the custom path's private data. Private data should be stored in a form that can be handled by nodeToString, so that debugging routines that attempt to print the custom path will work as designed. methods must point to a (usually statically allocated) object implementing the required - custom path methods, of which there is currently only one. + custom path methods, which are further detailed below. @@ -114,6 +120,17 @@ extern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook; responsibility of the hook to minimize duplicated work. + + Note also that the set of join clauses to apply to the join, + which is passed as extra->restrictlist, varies + depending on the combination of inner and outer relations. A + CustomPath path generated for the + joinrel must contain the set of join clauses it uses, + which will be used by the planner to convert the + CustomPath path into a plan, if it is selected + by the planner as the best path for the joinrel. + + Custom Scan Path Callbacks @@ -130,6 +147,23 @@ Plan *(*PlanCustomPath) (PlannerInfo *root, be a CustomScan object, which the callback must allocate and initialize. See for more details. + + + +List *(*ReparameterizeCustomPathByChild) (PlannerInfo *root, + List *custom_private, + RelOptInfo *child_rel); + + This callback is called while converting a path parameterized by the + top-most parent of the given child relation child_rel + to be parameterized by the child relation. The callback is used to + reparameterize any paths or translate any expression nodes saved in the + given custom_private member of a + CustomPath. The callback may use + reparameterize_path_by_child, + adjust_appendrel_attrs or + adjust_appendrel_attrs_multilevel as required. + diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml index 8d32a8c9c5be5..cd82c1c17e0a4 100644 --- a/doc/src/sgml/datatype.sgml +++ b/doc/src/sgml/datatype.sgml @@ -955,7 +955,7 @@ FROM generate_series(-3.5, 3.5, 1) as x; This section describes a PostgreSQL-specific way to create an autoincrementing column. Another way is to use the SQL-standard - identity column feature, described at . + identity column feature, described at . @@ -1174,7 +1174,11 @@ SELECT '52093.89'::money::numeric::float8; character(n), char(n), bpchar(n) - fixed-length, blank padded + fixed-length, blank-padded + + + bpchar + variable unlimited length, blank-trimmed text @@ -1230,19 +1234,22 @@ SELECT '52093.89'::money::numeric::float8; The type name varchar is an alias for character - varying, while char and bpchar are - aliases for character. - The varchar and char aliases are defined in - the SQL standard, but bpchar is - a PostgreSQL extension. + varying, while bpchar (with length specifier) and + char are aliases for character. The + varchar and char aliases are defined in the + SQL standard; bpchar is a + PostgreSQL extension. If specified, the length n must be greater - than zero and cannot exceed 10485760. - character without length specifier is equivalent to - character(1). If character varying is used - without length specifier, the type accepts strings of any size. + than zero and cannot exceed 10,485,760. If character + varying (or varchar) is used without + length specifier, the type accepts strings of any length. If + bpchar lacks a length specifier, it also accepts strings + of any length, but trailing spaces are semantically insignificant. + If character (or char) lacks a specifier, + it is equivalent to character(1). @@ -2040,7 +2047,8 @@ MINUTE TO SECOND America/New_York. In this case specifying the date is required in order to determine whether standard or daylight-savings time applies. The appropriate time zone offset is recorded in the - time with time zone value. + time with time zone value and is output as stored; + it is not adjusted to the active time zone. @@ -2237,24 +2245,27 @@ TIMESTAMP '2004-10-19 10:23:54+02' TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02' + - In a literal that has been determined to be timestamp without time + + In a value that has been determined to be timestamp without time zone, PostgreSQL will silently ignore any time zone indication. That is, the resulting value is derived from the date/time - fields in the input value, and is not adjusted for time zone. + fields in the input string, and is not adjusted for time zone. - For timestamp with time zone, the internally stored - value is always in UTC (Universal - Coordinated Time, traditionally known as Greenwich Mean Time, - GMT). An input value that has an explicit - time zone specified is converted to UTC using the appropriate offset + For timestamp with time zone values, an input string + that includes an explicit time zone will be converted to UTC + (Universal Coordinated + Time) using the appropriate offset for that time zone. If no time zone is stated in the input string, then it is assumed to be in the time zone indicated by the system's parameter, and is converted to UTC using the offset for the timezone zone. + In either case, the value is stored internally as UTC, and the + originally stated or assumed time zone is not retained. @@ -2320,12 +2331,12 @@ TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02' infinity - date, timestamp + date, timestamp, interval later than all other time stamps -infinity - date, timestamp + date, timestamp, interval earlier than all other time stamps @@ -2463,7 +2474,7 @@ TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02' the date and time. PostgreSQL accepts that format on input, but on output it uses a space rather than T, as shown above. This is for readability and for consistency with - RFC 3339 as + RFC 3339 as well as some other database systems. @@ -2861,10 +2872,31 @@ P years-months- - Field values can have fractional parts: for example, '1.5 + Internally, interval values are stored as three integral + fields: months, days, and microseconds. These fields are kept + separate because the number of days in a month varies, while a day + can have 23 or 25 hours if a daylight savings time transition is + involved. An interval input string that uses other units is + normalized into this format, and then reconstructed in a standardized + way for output, for example: + + +SELECT '2 years 15 months 100 weeks 99 hours 123456789 milliseconds'::interval; + interval +--------------------------------------- + 3 years 3 mons 700 days 133:17:36.789 + + + Here weeks, which are understood as 7 days, have been + kept separate, while the smaller and larger time units were + combined and normalized. + + + + Input field values can have fractional parts, for example '1.5 weeks' or '01:02:03.45'. However, - because interval internally stores only three integer units (months, - days, microseconds), fractional units must be spilled to smaller + because interval internally stores only integral fields, + fractional values must be converted into smaller units. Fractional parts of units greater than months are rounded to be an integer number of months, e.g. '1.5 years' becomes '1 year 6 mons'. Fractional parts of @@ -2914,33 +2946,6 @@ P years-months-
- - Internally interval values are stored as months, days, - and microseconds. This is done because the number of days in a month - varies, and a day can have 23 or 25 hours if a daylight savings - time adjustment is involved. The months and days fields are integers - while the microseconds field can store fractional seconds. Because intervals are - usually created from constant strings or timestamp subtraction, - this storage method works well in most cases, but can cause unexpected - results: - - -SELECT EXTRACT(hours from '80 minutes'::interval); - date_part ------------ - 1 - -SELECT EXTRACT(days from '80 hours'::interval); - date_part ------------ - 0 - - - Functions justify_days and - justify_hours are available for adjusting days - and hours that overflow their normal ranges. - - @@ -2952,6 +2957,23 @@ SELECT EXTRACT(days from '80 hours'::interval); formatting + + As previously explained, PostgreSQL + stores interval values as months, days, and + microseconds. For output, the months field is converted to years and + months by dividing by 12. The days field is shown as-is. The + microseconds field is converted to hours, minutes, seconds, and + fractional seconds. Thus months, minutes, and seconds will never be + shown as exceeding the ranges 0–11, 0–59, and 0–59 + respectively, while the displayed years, days, and hours fields can + be quite large. (The justify_days + and justify_hours + functions can be used if it is desirable to transpose large days or + hours values into the next higher field.) + + The output format of the interval type can be set to one of the four styles sql_standard, postgres, @@ -3350,7 +3372,7 @@ SELECT person.name, holidays.num_weeks FROM person, holidays
line - 32 bytes + 24 bytes Infinite line {A,B,C} @@ -3358,13 +3380,13 @@ SELECT person.name, holidays.num_weeks FROM person, holidays lseg 32 bytes Finite line segment - ((x1,y1),(x2,y2)) + [(x1,y1),(x2,y2)] box 32 bytes Rectangular box - ((x1,y1),(x2,y2)) + (x1,y1),(x2,y2) path @@ -3394,6 +3416,11 @@ SELECT person.name, holidays.num_weeks FROM person, holidays + + In all these types, the individual coordinates are stored as + double precision (float8) numbers. + + A rich set of functions and operators is available to perform various geometric operations such as scaling, translation, rotation, and determining @@ -3582,10 +3609,18 @@ SELECT person.name, holidays.num_weeks FROM person, holidays - Polygons are represented by lists of points (the vertexes of the + Polygons are represented by lists of points (the vertices of the polygon). Polygons are very similar to closed paths; the essential - difference is that a polygon is considered to include the area - within it, while a path is not. + semantic difference is that a polygon is considered to include the + area within it, while a path is not. + + + + An important implementation difference between polygons and + paths is that the stored representation of a polygon includes its + smallest bounding box. This speeds up certain search operations, + although computing the bounding box adds overhead while constructing + new polygons. @@ -4348,7 +4383,7 @@ SELECT to_tsvector( 'postgraduate' ), to_tsquery( 'postgres:*' ); The data type uuid stores Universally Unique Identifiers - (UUID) as defined by RFC 4122, + (UUID) as defined by RFC 4122, ISO/IEC 9834-8:2005, and related standards. (Some systems refer to this data type as a globally unique identifier, or GUID,GUID instead.) This diff --git a/doc/src/sgml/datetime.sgml b/doc/src/sgml/datetime.sgml index ecc3245a469b3..e7035c7806538 100644 --- a/doc/src/sgml/datetime.sgml +++ b/doc/src/sgml/datetime.sgml @@ -726,7 +726,7 @@ As an example, CET-1CEST,M3.5.0,M10.5.0/3 describes - current (as of 2020) timekeeping practice in Paris. This specification + the current (as of 2020) timekeeping practice in Paris. This specification says that standard time has the abbreviation CET and is one hour ahead (east) of UTC; daylight savings time has the abbreviation CEST and is implicitly two hours ahead diff --git a/doc/src/sgml/dblink.sgml b/doc/src/sgml/dblink.sgml index 7d25f24f490da..81f35986c8820 100644 --- a/doc/src/sgml/dblink.sgml +++ b/doc/src/sgml/dblink.sgml @@ -13,6 +13,41 @@ session. + + dblink can report the following wait events under the wait + event type Extension. + + + + + DblinkConnect + + + Waiting to establish a connection to a remote server. + + + + + + DblinkGetConnect + + + Waiting to establish a connection to a remote server when it could not + be found in the list of already-opened connections. + + + + + + DblinkGetResult + + + Waiting to receive the results of a query from a remote server. + + + + + See also , which provides roughly the same functionality using a more modern and standards-compliant infrastructure. diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml index e32f8253d03b4..44578e51a8288 100644 --- a/doc/src/sgml/ddl.sgml +++ b/doc/src/sgml/ddl.sgml @@ -233,6 +233,118 @@ CREATE TABLE products ( + + Identity Columns + + + identity column + + + + An identity column is a special column that is generated automatically from + an implicit sequence. It can be used to generate key values. + + + + To create an identity column, use the GENERATED ... + AS IDENTITY clause in CREATE TABLE, for example: + +CREATE TABLE people ( + id bigint GENERATED ALWAYS AS IDENTITY, + ..., +); + + or alternatively + +CREATE TABLE people ( + id bigint GENERATED BY DEFAULT AS IDENTITY, + ..., +); + + See for more details. + + + + If an INSERT command is executed on the table with the + identity column and no value is explicitly specified for the identity + column, then a value generated by the implicit sequence is inserted. For + example, with the above definitions and assuming additional appropriate + columns, writing + +INSERT INTO people (name, address) VALUES ('A', 'foo'); +INSERT INTO people (name, address) VALUES ('B', 'bar'); + + would generate values for the id column starting at 1 + and result in the following table data: + + id | name | address +----+------+--------- + 1 | A | foo + 2 | B | bar + + Alternatively, the keyword DEFAULT can be specified in + place of a value to explicitly request the sequence-generated value, like + +INSERT INTO people (id, name, address) VALUES (DEFAULT, 'C', 'baz'); + + Similarly, the keyword DEFAULT can be used in + UPDATE commands. + + + + Thus, in many ways, an identity column behaves like a column with a default + value. + + + + The clauses ALWAYS and BY DEFAULT in + the column definition determine how explicitly user-specified values are + handled in INSERT and UPDATE + commands. In an INSERT command, if + ALWAYS is selected, a user-specified value is only + accepted if the INSERT statement specifies + OVERRIDING SYSTEM VALUE. If BY + DEFAULT is selected, then the user-specified value takes + precedence. Thus, using BY DEFAULT results in a + behavior more similar to default values, where the default value can be + overridden by an explicit value, whereas ALWAYS provides + some more protection against accidentally inserting an explicit value. + + + + The data type of an identity column must be one of the data types supported + by sequences. (See .) The properties + of the associated sequence may be specified when creating an identity + column (see ) or changed afterwards (see + ). + + + + An identity column is automatically marked as NOT NULL. + An identity column, however, does not guarantee uniqueness. (A sequence + normally returns unique values, but a sequence could be reset, or values + could be inserted manually into the identity column, as discussed above.) + Uniqueness would need to be enforced using a PRIMARY KEY + or UNIQUE constraint. + + + + In table inheritance hierarchies, identity columns and their properties in + a child table are independent of those in its parent tables. A child table + does not inherit identity columns or their properties automatically from + the parent. During INSERT or UPDATE, + a column is treated as an identity column if that column is an identity + column in the table named in the statement, and the corresponding identity + properties are applied. + + + + Partitions inherit identity columns from the partitioned table. They + cannot have their own identity columns. The properties of a given identity + column are consistent across all the partitions in the partition hierarchy. + + + Generated Columns @@ -249,7 +361,7 @@ CREATE TABLE products ( storage and is computed when it is read. Thus, a virtual generated column is similar to a view and a stored generated column is similar to a materialized view (except that it is always updated automatically). - PostgreSQL currently implements only stored generated columns. + PostgreSQL currently implements only stored generated columns. @@ -400,6 +512,12 @@ CREATE TABLE people ( generated columns in BEFORE triggers. + + + Generated columns are skipped for logical replication and cannot be + specified in a CREATE PUBLICATION column list. + + @@ -1181,16 +1299,16 @@ CREATE TABLE posts ( A foreign key must reference columns that either are a primary key or - form a unique constraint. This means that the referenced columns always - have an index (the one underlying the primary key or unique constraint); - so checks on whether a referencing row has a match will be efficient. - Since a DELETE of a row from the referenced table - or an UPDATE of a referenced column will require - a scan of the referencing table for rows matching the old value, it - is often a good idea to index the referencing columns too. Because this - is not always needed, and there are many choices available on how - to index, declaration of a foreign key constraint does not - automatically create an index on the referencing columns. + form a unique constraint, or are columns from a non-partial unique index. + This means that the referenced columns always have an index to allow + efficient lookups on whether a referencing row has a match. Since a + DELETE of a row from the referenced table or an + UPDATE of a referenced column will require a scan of + the referencing table for rows matching the old value, it is often a good + idea to index the referencing columns too. Because this is not always + needed, and there are many choices available on how to index, the + declaration of a foreign key constraint does not automatically create an + index on the referencing columns. @@ -1563,9 +1681,6 @@ ALTER TABLE products ALTER COLUMN product_no SET NOT NULL; ALTER TABLE products DROP CONSTRAINT some_name; - (If you are dealing with a generated constraint name like $2, - don't forget that you'll need to double-quote it to make it a valid - identifier.) @@ -1577,7 +1692,7 @@ ALTER TABLE products DROP CONSTRAINT some_name; This works the same for all constraint types except not-null - constraints. To drop a not null constraint use: + constraints. To drop a not-null constraint use: ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL; @@ -1704,6 +1819,11 @@ ALTER TABLE products RENAME TO items; ACL + + privilege + default + + When an object is created, it is assigned an owner. The owner is normally the role that executed the creation statement. @@ -2028,7 +2148,7 @@ REVOKE ALL ON accounts FROM PUBLIC; reference page of the respective command. - + PostgreSQL grants privileges on some types of objects to PUBLIC by default when the objects are created. No privileges are granted to PUBLIC by default on @@ -2297,9 +2417,16 @@ REVOKE ALL ON accounts FROM PUBLIC; aclitem The privileges that have been granted for a particular object are - displayed as a list of aclitem entries, where each - aclitem describes the permissions of one grantee that - have been granted by a particular grantor. For example, + displayed as a list of aclitem entries, each having the + format: + +grantee=privilege-abbreviation*.../grantor + + Each aclitem lists all the permissions of one grantee that + have been granted by a particular grantor. Specific privileges are + represented by one-letter abbreviations from + , with * + appended if the privilege was granted with grant option. For example, calvin=r*w/hobbes specifies that the role calvin has the privilege SELECT (r) with grant option @@ -2359,6 +2486,15 @@ GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw; access privileges display. A * will appear only when grant options have been explicitly granted to someone. + + + The Access privileges column + shows (none) when the object's privileges entry is + non-null but empty. This means that no privileges are granted at all, + even to the object's owner — a rare situation. (The owner still + has implicit grant options in this case, and so could re-grant her own + privileges; but she has none at the moment.) + @@ -2854,7 +2990,11 @@ SELECT * FROM information WHERE group_id = 2 FOR UPDATE; A database contains one or more named schemas, which in turn contain tables. Schemas also contain other kinds of named - objects, including data types, functions, and operators. The same + objects, including data types, functions, and operators. Within one + schema, two objects of the same type cannot have the same name. + Furthermore, tables, sequences, indexes, views, materialized views, and + foreign tables share the same namespace, so that, for example, an index and + a table must have different names if they are in the same schema. The same object name can be used in different schemas without conflict; for example, both schema1 and myschema can contain tables named mytable. Unlike databases, @@ -4113,18 +4253,20 @@ CREATE TABLE measurement_y2008m02 PARTITION OF measurement TABLESPACE fasttablespace; - As an alternative, it is sometimes more convenient to create the - new table outside the partition structure, and attach it as a - partition later. This allows new data to be loaded, checked, and - transformed prior to it appearing in the partitioned table. + As an alternative to creating a new partition, it is sometimes more + convenient to create a new table separate from the partition structure + and attach it as a partition later. This allows new data to be loaded, + checked, and transformed prior to it appearing in the partitioned table. Moreover, the ATTACH PARTITION operation requires - only SHARE UPDATE EXCLUSIVE lock on the - partitioned table, as opposed to the ACCESS - EXCLUSIVE lock that is required by CREATE TABLE - ... PARTITION OF, so it is more friendly to concurrent - operations on the partitioned table. - The CREATE TABLE ... LIKE option is helpful - to avoid tediously repeating the parent table's definition: + only a SHARE UPDATE EXCLUSIVE lock on the + partitioned table rather than the ACCESS EXCLUSIVE + lock required by CREATE TABLE ... PARTITION OF, + so it is more friendly to concurrent operations on the partitioned table; + see ALTER TABLE ... ATTACH PARTITION + for additional details. The + CREATE TABLE ... LIKE + option can be helpful to avoid tediously repeating the parent table's + definition; for example: CREATE TABLE measurement_y2008m02 @@ -4143,17 +4285,15 @@ ALTER TABLE measurement ATTACH PARTITION measurement_y2008m02 - Before running the ATTACH PARTITION command, it is - recommended to create a CHECK constraint on the table to - be attached that matches the expected partition constraint, as - illustrated above. That way, the system will be able to skip the scan - which is otherwise needed to validate the implicit - partition constraint. Without the CHECK constraint, + Note that when running the ATTACH PARTITION command, the table will be scanned to validate the partition constraint while holding an ACCESS EXCLUSIVE lock on that partition. - It is recommended to drop the now-redundant CHECK - constraint after the ATTACH PARTITION is complete. If - the table being attached is itself a partitioned table, then each of its + As shown above, it is recommended to avoid this scan by creating a + CHECK constraint matching the expected partition + constraint on the table prior to attaching it. Once the + ATTACH PARTITION is complete, it is recommended to drop + the now-redundant CHECK constraint. + If the table being attached is itself a partitioned table, then each of its sub-partitions will be recursively locked and scanned until either a suitable CHECK constraint is encountered or the leaf partitions are reached. @@ -4163,7 +4303,7 @@ ALTER TABLE measurement ATTACH PARTITION measurement_y2008m02 Similarly, if the partitioned table has a DEFAULT partition, it is recommended to create a CHECK constraint which excludes the to-be-attached partition's constraint. If - this is not done then the DEFAULT partition will be + this is not done, the DEFAULT partition will be scanned to verify that it contains no records which should be located in the partition being attached. This operation will be performed whilst holding an ACCESS EXCLUSIVE lock on the @@ -4174,25 +4314,25 @@ ALTER TABLE measurement ATTACH PARTITION measurement_y2008m02 - As explained above, it is possible to create indexes on partitioned tables - so that they are applied automatically to the entire hierarchy. - This is very - convenient, as not only will the existing partitions become indexed, but - also any partitions that are created in the future will. One limitation is - that it's not possible to use the CONCURRENTLY - qualifier when creating such a partitioned index. To avoid long lock - times, it is possible to use CREATE INDEX ON ONLY - the partitioned table; such an index is marked invalid, and the partitions - do not get the index applied automatically. The indexes on partitions can - be created individually using CONCURRENTLY, and then - attached to the index on the parent using - ALTER INDEX .. ATTACH PARTITION. Once indexes for all - partitions are attached to the parent index, the parent index is marked - valid automatically. Example: + As mentioned earlier, it is possible to create indexes on partitioned + tables so that they are applied automatically to the entire hierarchy. + This can be very convenient as not only will all existing partitions be + indexed, but any future partitions will be as well. However, one + limitation when creating new indexes on partitioned tables is that it + is not possible to use the CONCURRENTLY + qualifier, which could lead to long lock times. To avoid this, you can + use CREATE INDEX ON ONLY the partitioned table, which + creates the new index marked as invalid, preventing automatic application + to existing partitions. Instead, indexes can then be created individually + on each partition using CONCURRENTLY and + attached to the partitioned index on the parent + using ALTER INDEX ... ATTACH PARTITION. Once indexes for + all the partitions are attached to the parent index, the parent index will + be marked valid automatically. Example: CREATE INDEX measurement_usls_idx ON ONLY measurement (unitsales); -CREATE INDEX measurement_usls_200602_idx +CREATE INDEX CONCURRENTLY measurement_usls_200602_idx ON measurement_y2006m02 (unitsales); ALTER INDEX measurement_usls_idx ATTACH PARTITION measurement_usls_200602_idx; @@ -4233,11 +4373,13 @@ ALTER INDEX measurement_city_id_logdate_key - There is no way to create an exclusion constraint spanning the - whole partitioned table. It is only possible to put such a - constraint on each leaf partition individually. Again, this - limitation stems from not being able to enforce cross-partition - restrictions. + Similarly an exclusion constraint must include all the + partition key columns. Furthermore the constraint must compare those + columns for equality (not e.g. &&). + Again, this limitation stems from not being able to enforce + cross-partition restrictions. The constraint may include additional + columns that aren't part of the partition key, and it may compare + those with any operators you like. @@ -4309,7 +4451,9 @@ ALTER INDEX measurement_city_id_logdate_key Using ONLY to add or drop a constraint on only the partitioned table is supported as long as there are no partitions. Once partitions exist, using ONLY - will result in an error. Instead, constraints on the partitions + will result in an error for any constraints other than + UNIQUE and PRIMARY KEY. + Instead, constraints on the partitions themselves can be added and (if they are not present in the parent table) dropped. @@ -4839,7 +4983,9 @@ EXPLAIN SELECT count(*) FROM measurement WHERE logdate >= DATE '2008-01-01'; It is possible to determine the number of partitions which were removed during this phase by observing the Subplans Removed property in the - EXPLAIN output. + EXPLAIN output. It's important to note that any + partitions removed by the partition pruning done at this stage are + still locked at the beginning of execution. @@ -5267,7 +5413,7 @@ CREATE FUNCTION get_color_note (rainbow) RETURNS text AS - On the other hand, for a SQL-language function or procedure whose body + On the other hand, for an SQL-language function or procedure whose body is written in SQL-standard style, the body is parsed at function definition time and all dependencies recognized by the parser are stored. Thus, if we write the function above as diff --git a/doc/src/sgml/dfunc.sgml b/doc/src/sgml/dfunc.sgml index 7bdf7f607025d..b94aefcd0ca6c 100644 --- a/doc/src/sgml/dfunc.sgml +++ b/doc/src/sgml/dfunc.sgml @@ -66,11 +66,12 @@ . To create shared libraries the compiler flag is . -gcc -fPIC -c foo.c -gcc -shared -o foo.so foo.o +cc -fPIC -c foo.c +cc -shared -o foo.so foo.o - This is applicable as of version 3.0 of - FreeBSD. + This is applicable as of version 13.0 of + FreeBSD, older versions used + the gcc compiler. @@ -201,23 +202,4 @@ gcc -G -o foo.so foo.o server expects to find the shared library files. - - diff --git a/doc/src/sgml/diskusage.sgml b/doc/src/sgml/diskusage.sgml deleted file mode 100644 index 75467582e48f0..0000000000000 --- a/doc/src/sgml/diskusage.sgml +++ /dev/null @@ -1,144 +0,0 @@ - - - - Monitoring Disk Usage - - - This chapter discusses how to monitor the disk usage of a - PostgreSQL database system. - - - - Determining Disk Usage - - - disk usage - - - - Each table has a primary heap disk file where most of the data is - stored. If the table has any columns with potentially-wide values, - there also might be a TOAST file associated with the table, - which is used to store values too wide to fit comfortably in the main - table (see ). There will be one valid index - on the TOAST table, if present. There also might be indexes - associated with the base table. Each table and index is stored in a - separate disk file — possibly more than one file, if the file would - exceed one gigabyte. Naming conventions for these files are described - in . - - - - You can monitor disk space in three ways: - using the SQL functions listed in , - using the module, or - using manual inspection of the system catalogs. - The SQL functions are the easiest to use and are generally recommended. - The remainder of this section shows how to do it by inspection of the - system catalogs. - - - - Using psql on a recently vacuumed or analyzed database, - you can issue queries to see the disk usage of any table: - -SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'customer'; - - pg_relation_filepath | relpages -----------------------+---------- - base/16384/16806 | 60 -(1 row) - - Each page is typically 8 kilobytes. (Remember, relpages - is only updated by VACUUM, ANALYZE, and - a few DDL commands such as CREATE INDEX.) The file path name - is of interest if you want to examine the table's disk file directly. - - - - To show the space used by TOAST tables, use a query - like the following: - -SELECT relname, relpages -FROM pg_class, - (SELECT reltoastrelid - FROM pg_class - WHERE relname = 'customer') AS ss -WHERE oid = ss.reltoastrelid OR - oid = (SELECT indexrelid - FROM pg_index - WHERE indrelid = ss.reltoastrelid) -ORDER BY relname; - - relname | relpages -----------------------+---------- - pg_toast_16806 | 0 - pg_toast_16806_index | 1 - - - - - You can easily display index sizes, too: - -SELECT c2.relname, c2.relpages -FROM pg_class c, pg_class c2, pg_index i -WHERE c.relname = 'customer' AND - c.oid = i.indrelid AND - c2.oid = i.indexrelid -ORDER BY c2.relname; - - relname | relpages --------------------+---------- - customer_id_index | 26 - - - - - It is easy to find your largest tables and indexes using this - information: - -SELECT relname, relpages -FROM pg_class -ORDER BY relpages DESC; - - relname | relpages -----------------------+---------- - bigtable | 3290 - customer | 3144 - - - - - - Disk Full Failure - - - The most important disk monitoring task of a database administrator - is to make sure the disk doesn't become full. A filled data disk will - not result in data corruption, but it might prevent useful activity - from occurring. If the disk holding the WAL files grows full, database - server panic and consequent shutdown might occur. - - - - If you cannot free up additional space on the disk by deleting - other things, you can move some of the database files to other file - systems by making use of tablespaces. See for more information about that. - - - - - Some file systems perform badly when they are almost full, so do - not wait until the disk is completely full to take action. - - - - - If your system supports per-user disk quotas, then the database - will naturally be subject to whatever quota is placed on the user - the server runs as. Exceeding the quota will have the same bad - effects as running out of disk space entirely. - - - diff --git a/doc/src/sgml/dml.sgml b/doc/src/sgml/dml.sgml index cbbc5e246334e..3d95bdb94e79d 100644 --- a/doc/src/sgml/dml.sgml +++ b/doc/src/sgml/dml.sgml @@ -283,10 +283,15 @@ DELETE FROM products; RETURNING + + MERGE + RETURNING + + Sometimes it is useful to obtain data from modified rows while they are being manipulated. The INSERT, UPDATE, - and DELETE commands all have an + DELETE, and MERGE commands all have an optional RETURNING clause that supports this. Use of RETURNING avoids performing an extra database query to collect the data, and is especially valuable when it would otherwise be @@ -339,6 +344,21 @@ DELETE FROM products + + In a MERGE, the data available to RETURNING is + the content of the source row plus the content of the inserted, updated, or + deleted target row. Since it is quite common for the source and target to + have many of the same columns, specifying RETURNING * + can lead to a lot of duplicated columns, so it is often more useful to + qualify it so as to return just the source or target row. For example: + +MERGE INTO products p USING new_products n ON p.product_no = n.product_no + WHEN NOT MATCHED THEN INSERT VALUES (n.product_no, n.name, n.price) + WHEN MATCHED THEN UPDATE SET name = n.name, price = n.price + RETURNING p.*; + + + If there are triggers () on the target table, the data available to RETURNING is the row as modified by diff --git a/doc/src/sgml/docguide.sgml b/doc/src/sgml/docguide.sgml index fd72b3975ad28..db4bcce56eac6 100644 --- a/doc/src/sgml/docguide.sgml +++ b/doc/src/sgml/docguide.sgml @@ -393,28 +393,6 @@ LOGLEVEL=-Dorg.apache.commons.logging.simplelog.defaultlog=WARN - - Plain Text Files - - - The installation instructions are also distributed as plain text, - in case they are needed in a situation where better reading tools - are not available. The INSTALL file - corresponds to , with some minor - changes to account for the different context. To recreate the - file, change to the directory doc/src/sgml - and enter make INSTALL. Building text output - requires Pandoc version 1.13 or newer as an - additional build tool. - - - - In the past, the release notes and regression testing instructions - were also distributed as plain text, but this practice has been - discontinued. - - - Syntax Check @@ -434,20 +412,19 @@ LOGLEVEL=-Dorg.apache.commons.logging.simplelog.defaultlog=WARN Building the Documentation with Meson - Two options are provided for building the documentation using Meson. - Change to the build directory before running - one of these commands, or add to the command. + To build the documentation using Meson, change to the + build directory before running one of these commands, + or add to the command. To build just the HTML version of the documentation: -build$ ninja docs - - To build all forms of the documentation: - -build$ ninja alldocs +build$ ninja html + For a list of other documentation targets see + . + The output appears in the subdirectory build/doc/src/sgml. diff --git a/doc/src/sgml/ecpg.sgml b/doc/src/sgml/ecpg.sgml index f52165165dcdf..e7a53f3c9d00d 100644 --- a/doc/src/sgml/ecpg.sgml +++ b/doc/src/sgml/ecpg.sgml @@ -412,12 +412,6 @@ EXEC SQL DISCONNECT connection; - - - DEFAULT - - - CURRENT @@ -1506,9 +1500,9 @@ EXEC SQL TYPE serial_t IS long; - Any word you declare as a typedef cannot be used as an SQL keyword - in EXEC SQL commands later in the same program. - For example, this won't work: + Any word you declare as a typedef cannot be used as + an SQL keyword in EXEC SQL commands later in the same + program. For example, this won't work: EXEC SQL BEGIN DECLARE SECTION; typedef int start; @@ -2396,9 +2390,10 @@ int PGTYPESnumeric_to_long(numeric *nv, long *lp); The function converts the numeric value from the variable that nv points to into the long integer variable that lp points to. It returns 0 on success and -1 if an error - occurs, including overflow. On overflow, the global variable + occurs, including overflow and underflow. On overflow, the global variable errno will be set to PGTYPES_NUM_OVERFLOW - additionally. + and on underflow errno will be set to + PGTYPES_NUM_UNDERFLOW. @@ -3322,7 +3317,7 @@ int PGTYPEStimestamp_fmt_asc(timestamp *ts, char *output, int str_len, char *fmt %z - is replaced by the time zone offset from UTC; a leading plus sign stands for east of UTC, a minus sign for west of UTC, hours and minutes follow with two digits each and no - delimiter between them (common form for RFC 822 date headers). + delimiter between them (common form for RFC 822 date headers). @@ -4769,6 +4764,7 @@ datdba = 10 (type: 1) encoding = 0 (type: 5) datistemplate = t (type: 1) datallowconn = t (type: 1) +dathasloginevt = f (type: 1) datconnlimit = -1 (type: 5) datfrozenxid = 379 (type: 1) dattablespace = 1663 (type: 1) @@ -4793,6 +4789,7 @@ datdba = 10 (type: 1) encoding = 0 (type: 5) datistemplate = f (type: 1) datallowconn = t (type: 1) +dathasloginevt = f (type: 1) datconnlimit = -1 (type: 5) datfrozenxid = 379 (type: 1) dattablespace = 1663 (type: 1) @@ -5796,6 +5793,14 @@ EXEC SQL UPDATE Tbl SET col = MYNUMBER; embedded SQL query because in this case the embedded SQL precompiler is not able to see this declaration. + + + If multiple input files are named on the ecpg + preprocessor's command line, the effects of EXEC SQL + DEFINE and EXEC SQL UNDEF do not carry + across files: each file starts with only the symbols defined + by switches on the command line. + @@ -7128,7 +7133,6 @@ EXEC SQL DEALLOCATE DESCRIPTOR mydesc; DISCONNECT connection_name DISCONNECT [ CURRENT ] -DISCONNECT DEFAULT DISCONNECT ALL @@ -7169,15 +7173,6 @@ DISCONNECT ALL - - DEFAULT - - - Close the default connection. - - - - ALL @@ -7196,13 +7191,11 @@ DISCONNECT ALL int main(void) { - EXEC SQL CONNECT TO testdb AS DEFAULT USER testuser; EXEC SQL CONNECT TO testdb AS con1 USER testuser; EXEC SQL CONNECT TO testdb AS con2 USER testuser; EXEC SQL CONNECT TO testdb AS con3 USER testuser; EXEC SQL DISCONNECT CURRENT; /* close con3 */ - EXEC SQL DISCONNECT DEFAULT; /* close DEFAULT */ EXEC SQL DISCONNECT ALL; /* close con2 and con1 */ return 0; @@ -7770,11 +7763,11 @@ SET CONNECTION [ TO | = ] connection_name - - DEFAULT + + CURRENT - Set the connection to the default connection. + Set the connection to the current connection (thus, nothing happens). @@ -8900,7 +8893,7 @@ int dectodbl(decimal *np, double *dblp); dectoint - Convert a variable to type decimal to an integer. + Convert a variable of type decimal to an integer. int dectoint(decimal *np, int *ip); @@ -8926,7 +8919,7 @@ int dectoint(decimal *np, int *ip); dectolong - Convert a variable to type decimal to a long integer. + Convert a variable of type decimal to a long integer. int dectolong(decimal *np, long *lngp); diff --git a/doc/src/sgml/event-trigger.sgml b/doc/src/sgml/event-trigger.sgml index 3b6a5361b3459..01a7f1eb18fd4 100644 --- a/doc/src/sgml/event-trigger.sgml +++ b/doc/src/sgml/event-trigger.sgml @@ -28,6 +28,7 @@ An event trigger fires whenever the event with which it is associated occurs in the database in which it is defined. Currently, the only supported events are + login, ddl_command_start, ddl_command_end, table_rewrite @@ -35,6 +36,24 @@ Support for additional events may be added in future releases. + + The login event occurs when an authenticated user logs + into the system. Any bug in a trigger procedure for this event may + prevent successful login to the system. Such bugs may be worked around by + setting to false + either in a connection string or configuration file. Alternatively, you can + restart the system in single-user mode (as event triggers are + disabled in this mode). See the reference + page for details about using single-user mode. + The login event will also fire on standby servers. + To prevent servers from becoming inaccessible, such triggers must avoid + writing anything to the database when running on a standby. + Also, it's recommended to avoid long-running queries in + login event triggers. Note that, for instance, + canceling a connection in psql will not cancel + the in-progress login trigger. + + The ddl_command_start event occurs just before the execution of a CREATE, ALTER, DROP, @@ -80,6 +99,11 @@ control statements are available to rewrite a table, like CLUSTER and VACUUM, the table_rewrite event is not triggered by them. + To find the OID of the table that was rewritten, use the function + pg_event_trigger_table_rewrite_oid() (see + ). To discover the reason(s) + for the rewrite, use the function + pg_event_trigger_table_rewrite_reason(). @@ -1013,6 +1037,14 @@ - + + REINDEX + X + X + - + - + + REVOKE X @@ -1117,8 +1149,9 @@ typedef struct EventTriggerData Describes the event for which the function is called, one of - "ddl_command_start", "ddl_command_end", - "sql_drop", "table_rewrite". + "login", "ddl_command_start", + "ddl_command_end", "sql_drop", + "table_rewrite". See for the meaning of these events. @@ -1176,8 +1209,9 @@ typedef struct EventTriggerData This is the source code of the trigger function: + + + A Database Login Event Trigger Example + + + The event trigger on the login event can be + useful for logging user logins, for verifying the connection and + assigning roles according to current circumstances, or for session + data initialization. It is very important that any event trigger using + the login event checks whether or not the database is + in recovery before performing any writes. Writing to a standby server + will make it inaccessible. + + + + The following example demonstrates these options. + +-- create test tables and roles +CREATE TABLE user_login_log ( + "user" text, + "session_start" timestamp with time zone +); +CREATE ROLE day_worker; +CREATE ROLE night_worker; + +-- the example trigger function +CREATE OR REPLACE FUNCTION init_session() + RETURNS event_trigger SECURITY DEFINER + LANGUAGE plpgsql AS +$$ +DECLARE + hour integer = EXTRACT('hour' FROM current_time at time zone 'utc'); + rec boolean; +BEGIN +-- 1. Forbid logging in between 2AM and 4AM. +IF hour BETWEEN 2 AND 4 THEN + RAISE EXCEPTION 'Login forbidden'; +END IF; + +-- The checks below cannot be performed on standby servers so +-- ensure the database is not in recovery before we perform any +-- operations. +SELECT pg_is_in_recovery() INTO rec; +IF rec THEN + RETURN; +END IF; + +-- 2. Assign some roles. At daytime, grant the day_worker role, else the +-- night_worker role. +IF hour BETWEEN 8 AND 20 THEN + EXECUTE 'REVOKE night_worker FROM ' || quote_ident(session_user); + EXECUTE 'GRANT day_worker TO ' || quote_ident(session_user); +ELSE + EXECUTE 'REVOKE day_worker FROM ' || quote_ident(session_user); + EXECUTE 'GRANT night_worker TO ' || quote_ident(session_user); +END IF; + +-- 3. Initialize user session data +CREATE TEMP TABLE session_storage (x float, y integer); +ALTER TABLE session_storage OWNER TO session_user; + +-- 4. Log the connection time +INSERT INTO public.user_login_log VALUES (session_user, current_timestamp); + +END; +$$; + +-- trigger definition +CREATE EVENT TRIGGER init_session + ON login + EXECUTE FUNCTION init_session(); +ALTER EVENT TRIGGER init_session ENABLE ALWAYS; + + + diff --git a/doc/src/sgml/extend.sgml b/doc/src/sgml/extend.sgml index 218940ee5ce19..4b7094f2739d7 100644 --- a/doc/src/sgml/extend.sgml +++ b/doc/src/sgml/extend.sgml @@ -1339,8 +1339,8 @@ SELECT * FROM pg_extension_update_paths('extension_namesearch_path; do not trust the path provided by CREATE/ALTER EXTENSION to be secure. Best practice is to temporarily - set search_path to 'pg_catalog, - pg_temp' and insert references to the extension's + set search_path to pg_catalog, + pg_temp and insert references to the extension's installation schema explicitly where needed. (This practice might also be helpful for creating views.) Examples can be found in the contrib modules in diff --git a/doc/src/sgml/external-projects.sgml b/doc/src/sgml/external-projects.sgml index 2d0fd723b2902..50872dfd88e2d 100644 --- a/doc/src/sgml/external-projects.sgml +++ b/doc/src/sgml/external-projects.sgml @@ -40,99 +40,17 @@ All other language interfaces are external projects and are distributed - separately. includes a list of - some of these projects. Note that some of these packages might not be - released under the same license as PostgreSQL. For more - information on each language interface, including licensing terms, refer to - its website and documentation. + separately. A + list of language interfaces + is maintained on the PostgreSQL wiki. Note that some of these packages are + not released under the same license as PostgreSQL. + For more information on each language interface, including licensing terms, + refer to its website and documentation. - - Externally Maintained Client Interfaces - - - - - Name - Language - Comments - Website - - - - - - DBD::Pg - Perl - Perl DBI driver - - - - - JDBC - Java - Type 4 JDBC driver - - - - - libpqxx - C++ - C++ interface - - - - - node-postgres - JavaScript - Node.js driver - - - - - Npgsql - .NET - .NET data provider - - - - - pgtcl - Tcl - - - - - - pgtclng - Tcl - - - - - - pq - Go - Pure Go driver for Go's database/sql - - - - - psqlODBC - ODBC - ODBC driver - - - - - psycopg - Python - DB API 2.0-compliant - - - - -
+ + + @@ -170,58 +88,18 @@ In addition, there are a number of procedural languages that are developed and maintained outside the core PostgreSQL - distribution. lists some of these - packages. Note that some of these projects might not be released under the same - license as PostgreSQL. For more information on each - procedural language, including licensing information, refer to its website + distribution. A list of + procedural languages + is maintained on the PostgreSQL wiki. Note that some of these projects are + not released under the same license as PostgreSQL. + For more information on each procedural language, including licensing + information, refer to its website and documentation. - - Externally Maintained Procedural Languages - - - - - Name - Language - Website - - - - - - PL/Java - Java - - - - - PL/Lua - Lua - - - - - PL/R - R - - - - - PL/sh - Unix shell - - - - - PL/v8 - JavaScript - - - - -
+ + +
diff --git a/doc/src/sgml/fdwhandler.sgml b/doc/src/sgml/fdwhandler.sgml index ac1717bc3c493..b80320504d695 100644 --- a/doc/src/sgml/fdwhandler.sgml +++ b/doc/src/sgml/fdwhandler.sgml @@ -67,13 +67,16 @@ foreign tables using the wrapper. The validator function must be registered as taking two arguments, a text array containing the options to be validated, and an OID - representing the type of object the options are associated with (in - the form of the OID of the system catalog the object would be stored - in, either - ForeignDataWrapperRelationId, - ForeignServerRelationId, - UserMappingRelationId, - or ForeignTableRelationId). + representing the type of object the options are associated with. The + latter corresponds to the OID of the system catalog the object + would be stored in, one of: + + AttributeRelationId + ForeignDataWrapperRelationId + ForeignServerRelationId + ForeignTableRelationId + UserMappingRelationId + If no validator function is supplied, options are not checked at object creation time or object alteration time. @@ -333,6 +336,17 @@ GetForeignJoinPaths(PlannerInfo *root, the responsibility of the FDW to minimize duplicated work. + + Note also that the set of join clauses to apply to the join, + which is passed as extra->restrictlist, varies + depending on the combination of inner and outer relations. A + ForeignPath path generated for the + joinrel must contain the set of join clauses it uses, + which will be used by the planner to convert the + ForeignPath path into a plan, if it is selected + by the planner as the best path for the joinrel. + + If a ForeignPath path is chosen for the join, it will represent the entire join process; paths generated for the component diff --git a/doc/src/sgml/features.sgml b/doc/src/sgml/features.sgml index 575afa34760c7..966fd39882760 100644 --- a/doc/src/sgml/features.sgml +++ b/doc/src/sgml/features.sgml @@ -199,6 +199,15 @@ standard.
+ + + + PostgreSQL does not support the + RETURNING CONTENT or RETURNING SEQUENCE + clauses, functions which are defined to have these in the specification + are implicitly returning content. + + diff --git a/doc/src/sgml/file-fdw.sgml b/doc/src/sgml/file-fdw.sgml index 56d696c323c3d..f2f2af9a5962f 100644 --- a/doc/src/sgml/file-fdw.sgml +++ b/doc/src/sgml/file-fdw.sgml @@ -279,4 +279,20 @@ OPTIONS ( filename 'log/pglog.csv', format 'csv' ); + + Create a Foreign Table with an Option on a Column + + To set the force_null option for a column, use the + OPTIONS keyword. + + +CREATE FOREIGN TABLE films ( + code char(5) NOT NULL, + title text NOT NULL, + rating text OPTIONS (force_null 'true') +) SERVER film_server +OPTIONS ( filename 'films/db.csv', format 'csv' ); + + + diff --git a/doc/src/sgml/filelist.sgml b/doc/src/sgml/filelist.sgml index 0d6be9a2faf9a..38ec362d8f469 100644 --- a/doc/src/sgml/filelist.sgml +++ b/doc/src/sgml/filelist.sgml @@ -34,14 +34,14 @@ - - + + @@ -85,6 +85,7 @@ + @@ -106,13 +107,13 @@ + - @@ -137,7 +138,6 @@ - @@ -177,7 +177,7 @@ - + diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 5a47ce4343462..f441ec43314d7 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -718,7 +718,19 @@ repeat('Pg', 4) PgPgPgPg IS NULL and IS NOT NULL do not always return inverse results for row-valued expressions; in particular, a row-valued expression that contains both null and non-null fields will return false - for both tests. In some cases, it may be preferable to + for both tests. For example: + + +SELECT ROW(1,2.5,'this is a test') = ROW(1, 3, 'not the same'); + +SELECT ROW(table.*) IS NULL FROM table; -- detect all-null rows + +SELECT ROW(table.*) IS NOT NULL FROM table; -- detect all-non-null rows + +SELECT NOT(ROW(table.*) IS NOT NULL) FROM TABLE; -- detect at least one null in rows + + + In some cases, it may be preferable to write row IS DISTINCT FROM NULL or row IS NOT DISTINCT FROM NULL, which will simply check whether the overall row value is null without any @@ -1850,6 +1862,39 @@ repeat('Pg', 4) PgPgPgPg
+ + + + random + + random ( min integer, max integer ) + integer + + + random ( min bigint, max bigint ) + bigint + + + random ( min numeric, max numeric ) + numeric + + + Returns a random value in the range + min <= x <= max. + For type numeric, the result will have the same number of + fractional decimal digits as min or + max, whichever has more. + + + random(1, 10) + 7 + + + random(-0.499, 0.499) + 0.347 + + + @@ -1894,19 +1939,19 @@ repeat('Pg', 4) PgPgPgPg - The random() function uses a deterministic - pseudo-random number generator. + The random() and random_normal() + functions listed in use a + deterministic pseudo-random number generator. It is fast but not suitable for cryptographic applications; see the module for a more secure alternative. If setseed() is called, the series of results of - subsequent random() calls in the current session + subsequent calls to these functions in the current session can be repeated by re-issuing setseed() with the same argument. Without any prior setseed() call in the same - session, the first random() call obtains a seed + session, the first call to any of these functions obtains a seed from a platform-dependent source of random bits. - These remarks hold equally for random_normal(). @@ -2859,6 +2904,22 @@ repeat('Pg', 4) PgPgPgPg + + + + unicode_assigned + + unicode_assigned ( text ) + boolean + + + Returns true if all characters in the string are + assigned Unicode codepoints; false otherwise. This + function can only be used when the server encoding is + UTF8. + + + @@ -3737,6 +3798,32 @@ repeat('Pg', 4) PgPgPgPg + + + + to_bin + + to_bin ( integer ) + text + + + to_bin ( bigint ) + text + + + Converts the number to its equivalent two's complement binary + representation. + + + to_bin(2147483647) + 1111111111111111111111111111111 + + + to_bin(-1234) + 11111111111111111111101100101110 + + + @@ -3750,11 +3837,42 @@ repeat('Pg', 4) PgPgPgPg text - Converts the number to its equivalent hexadecimal representation. + Converts the number to its equivalent two's complement hexadecimal + representation. to_hex(2147483647) 7fffffff + + + to_hex(-1234) + fffffb2e + + + + + + + to_oct + + to_oct ( integer ) + text + + + to_oct ( bigint ) + text + + + Converts the number to its equivalent two's complement octal + representation. + + + to_oct(2147483647) + 17777777777 + + + to_oct(-1234) + 37777775456 @@ -4783,7 +4901,7 @@ SELECT format('Testing %3$s, %2$s, %s', 'one', 'two', 'three'); The base64 format is that - of RFC + of RFC 2045 Section 6.8. As per the RFC, encoded lines are broken at 76 characters. However instead of the MIME CRLF end-of-line marker, only a newline is used for end-of-line. @@ -8046,13 +8164,11 @@ SELECT regexp_match('abc01234xyz', '(?:(.*?)(\d+)(.*)){1,1}'); TZ - upper case time-zone abbreviation - (only supported in to_char) + upper case time-zone abbreviation tz - lower case time-zone abbreviation - (only supported in to_char) + lower case time-zone abbreviation TZH @@ -8064,8 +8180,8 @@ SELECT regexp_match('abc01234xyz', '(?:(.*?)(\d+)(.*)){1,1}'); OF - time-zone offset from UTC - (only supported in to_char) + time-zone offset from UTC (HH + or HH:MM) @@ -8285,11 +8401,11 @@ SELECT regexp_match('abc01234xyz', '(?:(.*?)(\d+)(.*)){1,1}'); use some non-digit character or template after YYYY, otherwise the year is always interpreted as 4 digits. For example (with the year 20000): - to_date('200001131', 'YYYYMMDD') will be + to_date('200001130', 'YYYYMMDD') will be interpreted as a 4-digit year; instead use a non-digit separator after the year, like - to_date('20000-1131', 'YYYY-MMDD') or - to_date('20000Nov31', 'YYYYMonDD'). + to_date('20000-1130', 'YYYY-MMDD') or + to_date('20000Nov30', 'YYYYMonDD'). @@ -8505,6 +8621,14 @@ SELECT regexp_match('abc01234xyz', '(?:(.*?)(\d+)(.*)){1,1}'); + + + If the format provides fewer fractional digits than the number being + formatted, to_char() will round the number to + the specified number of fractional digits. + + + The pattern characters S, L, D, @@ -8655,6 +8779,12 @@ SELECT regexp_match('abc01234xyz', '(?:(.*?)(\d+)(.*)){1,1}'); to_char(current_timestamp, 'FMDay, FMDD  HH12:MI:SS') 'Tuesday, 6  05:39:18' + + to_char(current_timestamp AT TIME ZONE + 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS"Z"') + '2022-12-06T05:39:18Z', + ISO 8601 extended format + to_char(-0.1, '99.99') '  -.10' @@ -9069,7 +9199,8 @@ SELECT regexp_match('abc01234xyz', '(?:(.*?)(\d+)(.*)){1,1}'); Subtract timestamps (converting 24-hour intervals into days, - similarly to justify_hours()) + similarly to justify_hours()) timestamp '2001-09-29 03:00' - timestamp '2001-07-27 12:00' @@ -9472,7 +9603,7 @@ SELECT regexp_match('abc01234xyz', '(?:(.*?)(\d+)(.*)){1,1}'); boolean - Test for finite interval (currently always true) + Test for finite interval (not +/-infinity) isfinite(interval '4 hours') @@ -9482,35 +9613,35 @@ SELECT regexp_match('abc01234xyz', '(?:(.*?)(\d+)(.*)){1,1}'); - + justify_days justify_days ( interval ) interval - Adjust interval so 30-day time periods are represented as months + Adjust interval, converting 30-day time periods to months - justify_days(interval '35 days') - 1 mon 5 days + justify_days(interval '1 year 65 days') + 1 year 2 mons 5 days - + justify_hours justify_hours ( interval ) interval - Adjust interval so 24-hour time periods are represented as days + Adjust interval, converting 24-hour time periods to days - justify_hours(interval '27 hours') - 1 day 03:00:00 + justify_hours(interval '50 hours 10 minutes') + 2 days 02:10:00 @@ -9943,13 +10074,19 @@ EXTRACT(field FROM source) The extract function retrieves subfields such as year or hour from date/time values. source must be a value expression of - type timestamp, time, or interval. - (Expressions of type date are - cast to timestamp and can therefore be used as - well.) field is an identifier or + type timestamp, date, time, + or interval. (Timestamps and times can be with or + without time zone.) + field is an identifier or string that selects what field to extract from the source value. + Not all fields are valid for every input data type; for example, fields + smaller than a day cannot be extracted from a date, while + fields of a day or more cannot be extracted from a time. The extract function returns values of type numeric. + + + The following are valid field names: @@ -9958,7 +10095,8 @@ EXTRACT(field FROM source) century - The century + The century; for interval values, the year field + divided by 100 @@ -9966,17 +10104,13 @@ SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); Result: 20 SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 21 +SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD'); +Result: 1 +SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); +Result: -1 +SELECT EXTRACT(CENTURY FROM INTERVAL '2001 years'); +Result: 20 - - - The first century starts at 0001-01-01 00:00:00 AD, although - they did not know it at the time. This definition applies to all - Gregorian calendar countries. There is no century number 0, - you go from -1 century to 1 century. - - If you disagree with this, please write your complaint to: - Pope, Cathedral Saint-Peter of Roma, Vatican. - @@ -9984,14 +10118,13 @@ SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40'); day - For timestamp values, the day (of the month) field - (1–31) ; for interval values, the number of days + The day of the month (1–31); for interval + values, the number of days SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 16 - SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute'); Result: 40 @@ -10065,10 +10198,8 @@ SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40'); SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); Result: 982384720.120000 - SELECT EXTRACT(EPOCH FROM TIMESTAMP '2001-02-16 20:38:40.12'); Result: 982355920.120000 - SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); Result: 442800.000000 @@ -10096,7 +10227,8 @@ SELECT to_timestamp(982384720.12); hour - The hour field (0–23) + The hour field (0–23 in timestamps, unrestricted in + intervals) @@ -10131,7 +10263,7 @@ SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40'); The ISO 8601 week-numbering year that the date - falls in (not applicable to intervals) + falls in @@ -10148,9 +10280,6 @@ SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); different from the Gregorian year. See the week field for more information. - - This field is not available in PostgreSQL releases prior to 8.3. - @@ -10159,7 +10288,7 @@ SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); The Julian Date corresponding to the - date or timestamp (not applicable to intervals). Timestamps + date or timestamp. Timestamps that are not local midnight result in a fractional value. See for more information. @@ -10192,12 +10321,15 @@ SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5'); millennium - The millennium + The millennium; for interval values, the year field + divided by 1000 SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 3 +SELECT EXTRACT(MILLENNIUM FROM INTERVAL '2001 years'); +Result: 2 @@ -10240,18 +10372,16 @@ SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40'); month - For timestamp values, the number of the month - within the year (1–12) ; for interval values, - the number of months, modulo 12 (0–11) + The number of the month within the year (1–12); + for interval values, the number of months modulo 12 + (0–11) SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 2 - SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months'); Result: 3 - SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months'); Result: 1 @@ -10282,7 +10412,6 @@ SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40'); SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40'); Result: 40.000000 - SELECT EXTRACT(SECOND FROM TIME '17:12:28.5'); Result: 28.500000 @@ -10364,12 +10493,30 @@ SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40'); + + When processing an interval value, + the extract function produces field values that + match the interpretation used by the interval output function. This + can produce surprising results if one starts with a non-normalized + interval representation, for example: + +SELECT INTERVAL '80 minutes'; +Result: 01:20:00 +SELECT EXTRACT(MINUTES FROM INTERVAL '80 minutes'); +Result: 20 + + + When the input value is +/-Infinity, extract returns +/-Infinity for monotonically-increasing fields (epoch, julian, year, isoyear, - decade, century, and millennium). + decade, century, and millennium + for timestamp inputs; epoch, hour, + day, year, decade, + century, and millennium for + interval inputs). For other fields, NULL is returned. PostgreSQL versions before 9.6 returned zero for all cases of infinite input. @@ -10401,7 +10548,6 @@ date_part('field', source) SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40'); Result: 16 - SELECT date_part('hour', INTERVAL '4 hours 3 minutes'); Result: 4 @@ -10479,16 +10625,12 @@ date_trunc(field, source [ SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40'); Result: 2001-02-16 20:00:00 - SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40'); Result: 2001-01-01 00:00:00 - SELECT date_trunc('day', TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40+00'); Result: 2001-02-16 00:00:00-05 - SELECT date_trunc('day', TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40+00', 'Australia/Sydney'); Result: 2001-02-16 08:00:00-05 - SELECT date_trunc('hour', INTERVAL '3 days 02:47:33'); Result: 3 days 02:00:00 @@ -10527,7 +10669,6 @@ date_bin(stride, source, < SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-01-01'); Result: 2020-02-11 15:30:00 - SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-01-01 00:02:30'); Result: 2020-02-11 15:32:30 @@ -10546,7 +10687,7 @@ SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-0 - <literal>AT TIME ZONE</literal> + <literal>AT TIME ZONE and AT LOCAL</literal> time zone @@ -10557,6 +10698,10 @@ SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-0 AT TIME ZONE + + AT LOCAL + + The AT TIME ZONE operator converts time stamp without time zone to/from @@ -10567,7 +10712,7 @@ SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-0 - <literal>AT TIME ZONE</literal> Variants + <literal>AT TIME ZONE</literal> and <literal>AT LOCAL</literal> Variants @@ -10600,6 +10745,22 @@ SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-0 + + + timestamp without time zone AT LOCAL + timestamp with time zone + + + Converts given time stamp without time zone to + time stamp with the session's + TimeZone value as time zone. + + + timestamp '2001-02-16 20:38:40' at local + 2001-02-17 03:38:40+00 + + + timestamp with time zone AT TIME ZONE zone @@ -10616,6 +10777,22 @@ SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-0 + + + timestamp with time zone AT LOCAL + timestamp without time zone + + + Converts given time stamp with time zone to + time stamp without time zone, as the time would + appear with the session's TimeZone value as time zone. + + + timestamp with time zone '2001-02-16 20:38:40-05' at local + 2001-02-16 18:38:40 + + + time with time zone AT TIME ZONE zone @@ -10631,6 +10808,25 @@ SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-0 10:34:17+00 + + + + time with time zone AT LOCAL + time with time zone + + + Converts given time with time zone to a new time + zone. Since no date is supplied, this uses the currently active UTC + offset for the session's TimeZone value. + + + Assuming the session's TimeZone is set to UTC: + + + time with time zone '05:34:17-05' at local + 10:34:17+00 + +
@@ -10645,18 +10841,27 @@ SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-0 UTC, so it is not very common in practice. + + The syntax AT LOCAL may be used as shorthand for + AT TIME ZONE local, where + local is the session's + TimeZone value. + + Examples (assuming the current setting is America/Los_Angeles): SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'America/Denver'; Result: 2001-02-16 19:38:40-08 - SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'America/Denver'; Result: 2001-02-16 18:38:40 - SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'Asia/Tokyo' AT TIME ZONE 'America/Chicago'; Result: 2001-02-16 05:38:40 +SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT LOCAL; +Result: 2001-02-16 17:38:40 +SELECT TIME WITH TIME ZONE '20:38:40-05' AT LOCAL; +Result: 17:38:40 The first example adds a time zone to a value that lacks it, and displays the value using the current TimeZone @@ -10664,7 +10869,18 @@ SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'Asia/Tokyo' AT TIME ZONE 'A to the specified time zone, and returns the value without a time zone. This allows storage and display of values different from the current TimeZone setting. The third example converts - Tokyo time to Chicago time. + Tokyo time to Chicago time. The fourth example shifts the time stamp + with time zone value to the time zone currently specified by the + TimeZone setting and returns the value without a + time zone. + + + + The fifth example is a cautionary tale. Due to the fact that there is no + date associated with the input value, the conversion is made using the + current date of the session. Therefore, this static example may show a wrong + result depending on the time of the year it is viewed because + 'America/Los_Angeles' observes Daylight Savings Time. @@ -10673,6 +10889,25 @@ SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'Asia/Tokyo' AT TIME ZONE 'A timestamp AT TIME ZONE zone. + + + The function timezone(zone, + time) is equivalent to the SQL-conforming construct + time AT TIME ZONE + zone. + + + + The function timezone(timestamp) + is equivalent to the SQL-conforming construct timestamp + AT LOCAL. + + + + The function timezone(time) + is equivalent to the SQL-conforming construct time + AT LOCAL. +
@@ -10729,16 +10964,12 @@ LOCALTIMESTAMP(precision) SELECT CURRENT_TIME; Result: 14:39:53.662522-05 - SELECT CURRENT_DATE; Result: 2019-12-23 - SELECT CURRENT_TIMESTAMP; Result: 2019-12-23 14:39:53.662522-05 - SELECT CURRENT_TIMESTAMP(2); Result: 2019-12-23 14:39:53.66-05 - SELECT LOCALTIMESTAMP; Result: 2019-12-23 14:39:53.662522 @@ -12945,24 +13176,6 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple - - - tsvector @@@ tsquery - boolean - - - tsquery @@@ tsvector - boolean - - - This is a deprecated synonym for @@. - - - to_tsvector('fat cats ate rats') @@@ to_tsquery('cat & rat') - t - - - tsvector || tsvector @@ -13947,6 +14160,14 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple gen_random_uuid + + uuid_extract_timestamp + + + + uuid_extract_version + + PostgreSQL includes one function to generate a UUID: @@ -13961,6 +14182,28 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple implement other standard algorithms for generating UUIDs. + + There are also functions to extract data from UUIDs: + +uuid_extract_timestamp (uuid) timestamp with time zone + + This function extracts a timestamp with time zone from UUID + version 1. For other versions, this function returns null. Note that the + extracted timestamp is not necessarily exactly equal to the time the UUID + was generated; this depends on the implementation that generated the UUID. + + + + +uuid_extract_version (uuid) smallint + + This function extracts the version from a UUID of the variant described by + RFC 4122. For + other variants, this function returns null. For example, for a UUID + generated by gen_random_uuid, this function will + return 4. + + PostgreSQL also provides the usual comparison operators shown in for @@ -14001,6 +14244,36 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple documents for processing in client applications. + + <literal>xmltext</literal> + + + xmltext + + + +xmltext ( text ) xml + + + + The function xmltext returns an XML value with a single + text node containing the input argument as its content. Predefined entities + like ampersand (), left and right angle brackets + (]]>), and quotation marks () + are escaped. + + + + Example: +'); + xmltext +------------------------- + < foo & bar > +]]> + + + <literal>xmlcomment</literal> @@ -15248,6 +15521,11 @@ table2-mapping the SQL/JSON path language
+ + + the SQL/JSON query functions + + @@ -15259,7 +15537,7 @@ table2-mapping values, with an additional SQL/JSON null value, and composite data structures that use JSON arrays and objects. The model is a formalization of the implied data model in the JSON specification - RFC 7159. + RFC 7159. @@ -15676,6 +15954,9 @@ table2-mapping Does JSON path return any item for the specified JSON value? + (This is useful only with SQL-standard JSON path expressions, not + predicate check + expressions, since those always return a value.) '{"a":[1,2,3,4,5]}'::jsonb @? '$.a[*] ? (@ > 2)' @@ -15690,9 +15971,12 @@ table2-mapping Returns the result of a JSON path predicate check for the - specified JSON value. Only the first item of the result is taken into - account. If the result is not Boolean, then NULL - is returned. + specified JSON value. + (This is useful only + with predicate + check expressions, not SQL-standard JSON path expressions, + since it will return NULL if the path result is + not a single boolean value.) '{"a":[1,2,3,4,5]}'::jsonb @@ '$.a[*] > 2' @@ -15720,8 +16004,8 @@ table2-mapping Some functions in this table have a RETURNING clause, which specifies the data type returned. It must be one of json, jsonb, bytea, a character string type (text, - char, varchar, or nchar), or a type - for which there is a cast from json to that type. + char, or varchar), or a type + that can be cast to json. By default, the json type is returned. @@ -16001,30 +16285,97 @@ table2-mapping {"a": "1", "b": "2"} - - - - - - details SQL/JSON - facilities for testing JSON. - - - - SQL/JSON Testing Functions - - - - - Function signature - - - Description - - - Example(s) - - + + + + json constructor + json ( + expression + FORMAT JSON ENCODING UTF8 + { WITH | WITHOUT } UNIQUE KEYS ) + json + + + Converts a given expression specified as text or + bytea string (in UTF8 encoding) into a JSON + value. If expression is NULL, an + SQL null value is returned. + If WITH UNIQUE is specified, the + expression must not contain any duplicate + object keys. + + + json('{"a":123, "b":[true,"foo"], "a":"bar"}') + {"a":123, "b":[true,"foo"], "a":"bar"} + + + + + + + json_scalar + json_scalar ( expression ) + + + Converts a given SQL scalar value into a JSON scalar value. + If the input is NULL, an SQL null is returned. If + the input is number or a boolean value, a corresponding JSON number + or boolean value is returned. For any other value, a JSON string is + returned. + + + json_scalar(123.45) + 123.45 + + + json_scalar(CURRENT_TIMESTAMP) + "2022-05-10T10:51:04.62128-04:00" + + + + + + json_serialize ( + expression FORMAT JSON ENCODING UTF8 + RETURNING data_type FORMAT JSON ENCODING UTF8 ) + + + Converts an SQL/JSON expression into a character or binary string. The + expression can be of any JSON type, any + character string type, or bytea in UTF8 encoding. + The returned type used in RETURNING can be any + character string type or bytea. The default is + text. + + + json_serialize('{ "a" : 1 } ' RETURNING bytea) + \x7b20226122203a2031207d20 + + + + +
+ + + details SQL/JSON + facilities for testing JSON. + + + + SQL/JSON Testing Functions + + + + + Function signature + + + Description + + + Example(s) + + @@ -16447,6 +16798,58 @@ array w/o UK? | t + + + + jsonb_populate_record_valid + + jsonb_populate_record_valid ( base anyelement, from_json json ) + boolean + + + Function for testing jsonb_populate_record. Returns + true if the input jsonb_populate_record + would finish without an error for the given input JSON object; that is, it's + valid input, false otherwise. + + + create type jsb_char2 as (a char(2)); + + + select jsonb_populate_record_valid(NULL::jsb_char2, '{"a": "aaa"}'); + + + jsonb_populate_record_valid +----------------------------- + f +(1 row) + + + select * from jsonb_populate_record(NULL::jsb_char2, '{"a": "aaa"}') q; + + +ERROR: value too long for type character(2) + + select jsonb_populate_record_valid(NULL::jsb_char2, '{"a": "aa"}'); + + + jsonb_populate_record_valid +----------------------------- + t +(1 row) + + + select * from jsonb_populate_record(NULL::jsb_char2, '{"a": "aa"}') q; + + + a +---- + aa +(1 row) + + + + @@ -16697,6 +17100,9 @@ array w/o UK? | t Checks whether the JSON path returns any item for the specified JSON value. + (This is useful only with SQL-standard JSON path expressions, not + predicate check + expressions, since those always return a value.) If the vars argument is specified, it must be a JSON object, and its fields provide named values to be substituted into the jsonpath expression. @@ -16719,9 +17125,13 @@ array w/o UK? | t boolean - Returns the result of a JSON path predicate check for the specified - JSON value. Only the first item of the result is taken into account. - If the result is not Boolean, then NULL is returned. + Returns the SQL boolean result of a JSON path predicate check + for the specified JSON value. + (This is useful only + with predicate + check expressions, not SQL-standard JSON path expressions, + since it will either fail or return NULL if the + path result is not a single boolean value.) The optional vars and silent arguments act the same as for jsonb_path_exists. @@ -16743,6 +17153,12 @@ array w/o UK? | t Returns all JSON items returned by the JSON path for the specified JSON value. + For SQL-standard JSON path expressions it returns the JSON + values selected from target. + For predicate + check expressions it returns the result of the predicate + check: true, false, + or null. The optional vars and silent arguments act the same as for jsonb_path_exists. @@ -16771,9 +17187,8 @@ array w/o UK? | t Returns all JSON items returned by the JSON path for the specified JSON value, as a JSON array. - The optional vars - and silent arguments act the same as - for jsonb_path_exists. + The parameters are the same as + for jsonb_path_query. jsonb_path_query_array('{"a":[1,2,3,4,5]}', '$.a[*] ? (@ >= $min && @ <= $max)', '{"min":2, "max":4}') @@ -16791,11 +17206,10 @@ array w/o UK? | t Returns the first JSON item returned by the JSON path for the - specified JSON value. Returns NULL if there are no + specified JSON value, or NULL if there are no results. - The optional vars - and silent arguments act the same as - for jsonb_path_exists. + The parameters are the same as + for jsonb_path_query. jsonb_path_query_first('{"a":[1,2,3,4,5]}', '$.a[*] ? (@ >= $min && @ <= $max)', '{"min":2, "max":4}') @@ -16934,9 +17348,9 @@ array w/o UK? | t - SQL/JSON path expressions specify the items to be retrieved - from the JSON data, similar to XPath expressions used - for SQL access to XML. In PostgreSQL, + SQL/JSON path expressions specify item(s) to be retrieved + from a JSON value, similarly to XPath expressions used + for access to XML content. In PostgreSQL, path expressions are implemented as the jsonpath data type and can use any elements described in . @@ -16947,6 +17361,8 @@ array w/o UK? | t pass the provided path expression to the path engine for evaluation. If the expression matches the queried JSON data, the corresponding JSON item, or set of items, is returned. + If there is no match, the result will be NULL, + false, or an error, depending on the function. Path expressions are written in the SQL/JSON path language and can include arithmetic expressions and functions. @@ -16964,18 +17380,20 @@ array w/o UK? | t To refer to the JSON value being queried (the context item), use the $ variable - in the path expression. It can be followed by one or more + in the path expression. The first element of a path must always + be $. It can be followed by one or more accessor operators, which go down the JSON structure level by level to retrieve sub-items - of the context item. Each operator that follows deals with the - result of the previous evaluation step. + of the context item. Each accessor operator acts on the + result(s) of the previous evaluation step, producing zero, one, or more + output items from each input item. For example, suppose you have some JSON data from a GPS tracker that you would like to parse, such as: -{ +SELECT '{ "track": { "segments": [ { @@ -16990,68 +17408,100 @@ array w/o UK? | t } ] } -} +}' AS json \gset + (The above example can be copied-and-pasted + into psql to set things up for the following + examples. Then psql will + expand :'json' into a suitably-quoted string + constant containing the JSON value.) To retrieve the available track segments, you need to use the .key accessor - operator to descend through surrounding JSON objects: - -$.track.segments - + operator to descend through surrounding JSON objects, for example: + +=> select jsonb_path_query(:'json', '$.track.segments'); + jsonb_path_query +-----------------------------------------------------------&zwsp;-----------------------------------------------------------&zwsp;--------------------------------------------- + [{"HR": 73, "location": [47.763, 13.4034], "start time": "2018-10-14 10:05:14"}, {"HR": 135, "location": [47.706, 13.2635], "start time": "2018-10-14 10:39:21"}] + To retrieve the contents of an array, you typically use the - [*] operator. For example, - the following path will return the location coordinates for all + [*] operator. + The following example will return the location coordinates for all the available track segments: - -$.track.segments[*].location - + +=> select jsonb_path_query(:'json', '$.track.segments[*].location'); + jsonb_path_query +------------------- + [47.763, 13.4034] + [47.706, 13.2635] + + Here we started with the whole JSON input value ($), + then the .track accessor selected the JSON object + associated with the "track" object key, then + the .segments accessor selected the JSON array + associated with the "segments" key within that + object, then the [*] accessor selected each element + of that array (producing a series of items), then + the .location accessor selected the JSON array + associated with the "location" key within each of + those objects. In this example, each of those objects had + a "location" key; but if any of them did not, + the .location accessor would have simply produced no + output for that input item. To return the coordinates of the first segment only, you can specify the corresponding subscript in the [] accessor operator. Recall that JSON array indexes are 0-relative: - -$.track.segments[0].location - + +=> select jsonb_path_query(:'json', '$.track.segments[0].location'); + jsonb_path_query +------------------- + [47.763, 13.4034] + The result of each path evaluation step can be processed - by one or more jsonpath operators and methods + by one or more of the jsonpath operators and methods listed in . Each method name must be preceded by a dot. For example, you can get the size of an array: - -$.track.segments.size() - + +=> select jsonb_path_query(:'json', '$.track.segments.size()'); + jsonb_path_query +------------------ + 2 + More examples of using jsonpath operators and methods within path expressions appear below in . - When defining a path, you can also use one or more + A path can also contain filter expressions that work similarly to the WHERE clause in SQL. A filter expression begins with a question mark and provides a condition in parentheses: - + ? (condition) - + Filter expressions must be written just after the path evaluation step to which they should apply. The result of that step is filtered to include only those items that satisfy the provided condition. SQL/JSON defines - three-valued logic, so the condition can be true, false, + three-valued logic, so the condition can + produce true, false, or unknown. The unknown value plays the same role as SQL NULL and can be tested for with the is unknown predicate. Further path @@ -17063,90 +17513,133 @@ $.track.segments.size() The functions and operators that can be used in filter expressions are listed in . Within a filter expression, the @ variable denotes the value - being filtered (i.e., one result of the preceding path step). You can + being considered (i.e., one result of the preceding path step). You can write accessor operators after @ to retrieve component items. For example, suppose you would like to retrieve all heart rate values higher - than 130. You can achieve this using the following expression: - -$.track.segments[*].HR ? (@ > 130) - + than 130. You can achieve this as follows: + +=> select jsonb_path_query(:'json', '$.track.segments[*].HR ? (@ > 130)'); + jsonb_path_query +------------------ + 135 + To get the start times of segments with such values, you have to - filter out irrelevant segments before returning the start times, so the + filter out irrelevant segments before selecting the start times, so the filter expression is applied to the previous step, and the path used in the condition is different: - -$.track.segments[*] ? (@.HR > 130)."start time" - + +=> select jsonb_path_query(:'json', '$.track.segments[*] ? (@.HR > 130)."start time"'); + jsonb_path_query +----------------------- + "2018-10-14 10:39:21" + - You can use several filter expressions in sequence, if required. For - example, the following expression selects start times of all segments that + You can use several filter expressions in sequence, if required. + The following example selects start times of all segments that contain locations with relevant coordinates and high heart rate values: - -$.track.segments[*] ? (@.location[1] < 13.4) ? (@.HR > 130)."start time" - + +=> select jsonb_path_query(:'json', '$.track.segments[*] ? (@.location[1] < 13.4) ? (@.HR > 130)."start time"'); + jsonb_path_query +----------------------- + "2018-10-14 10:39:21" + Using filter expressions at different nesting levels is also allowed. The following example first filters all segments by location, and then returns high heart rate values for these segments, if available: - -$.track.segments[*] ? (@.location[1] < 13.4).HR ? (@ > 130) - + +=> select jsonb_path_query(:'json', '$.track.segments[*] ? (@.location[1] < 13.4).HR ? (@ > 130)'); + jsonb_path_query +------------------ + 135 + - You can also nest filter expressions within each other: - -$.track ? (exists(@.segments[*] ? (@.HR > 130))).segments.size() - - This expression returns the size of the track if it contains any - segments with high heart rate values, or an empty sequence otherwise. + You can also nest filter expressions within each other. + This example returns the size of the track if it contains any + segments with high heart rate values, or an empty sequence otherwise: + +=> select jsonb_path_query(:'json', '$.track ? (exists(@.segments[*] ? (@.HR > 130))).segments.size()'); + jsonb_path_query +------------------ + 2 + - - PostgreSQL's implementation of the SQL/JSON path - language has the following deviations from the SQL/JSON standard: - + + Deviations from the SQL Standard + + PostgreSQL's implementation of the SQL/JSON path + language has the following deviations from the SQL/JSON standard. + - - + + Boolean Predicate Check Expressions - A path expression can be a Boolean predicate, although the SQL/JSON - standard allows predicates only in filters. This is necessary for - implementation of the @@ operator. For example, - the following jsonpath expression is valid in - PostgreSQL: - -$.track.segments[*].HR < 70 - - - + As an extension to the SQL standard, + a PostgreSQL path expression can be a + Boolean predicate, whereas the SQL standard allows predicates only within + filters. While SQL-standard path expressions return the relevant + element(s) of the queried JSON value, predicate check expressions + return the single three-valued jsonb result of the + predicate: true, + false, or null. + For example, we could write this SQL-standard filter expression: + +=> select jsonb_path_query(:'json', '$.track.segments ?(@[*].HR > 130)'); + jsonb_path_query +-----------------------------------------------------------&zwsp;---------------------- + {"HR": 135, "location": [47.706, 13.2635], "start time": "2018-10-14 10:39:21"} + + The similar predicate check expression simply + returns true, indicating that a match exists: + +=> select jsonb_path_query(:'json', '$.track.segments[*].HR > 130'); + jsonb_path_query +------------------ + true + + - - - There are minor differences in the interpretation of regular - expression patterns used in like_regex filters, as - described in . - - - + + + Predicate check expressions are required in the + @@ operator (and the + jsonb_path_match function), and should not be used + with the @? operator (or the + jsonb_path_exists function). + + + + + + Regular Expression Interpretation + + There are minor differences in the interpretation of regular + expression patterns used in like_regex filters, as + described in . + + + - + Strict and Lax Modes When you query JSON data, the path expression may not match the actual JSON data structure. An attempt to access a non-existent - member of an object or element of an array results in a + member of an object or element of an array is defined as a structural error. SQL/JSON path expressions have two modes of handling structural errors: @@ -17156,8 +17649,8 @@ $.track.segments[*].HR < 70 lax (default) — the path engine implicitly adapts the queried data to the specified path. - Any remaining structural errors are suppressed and converted - to empty SQL/JSON sequences. + Any structural errors that cannot be fixed as described below + are suppressed, producing no match. @@ -17168,15 +17661,15 @@ $.track.segments[*].HR < 70 - The lax mode facilitates matching of a JSON document structure and path - expression if the JSON data does not conform to the expected schema. + Lax mode facilitates matching of a JSON document and path + expression when the JSON data does not conform to the expected schema. If an operand does not match the requirements of a particular operation, - it can be automatically wrapped as an SQL/JSON array or unwrapped by + it can be automatically wrapped as an SQL/JSON array, or unwrapped by converting its elements into an SQL/JSON sequence before performing - this operation. Besides, comparison operators automatically unwrap their - operands in the lax mode, so you can compare SQL/JSON arrays + the operation. Also, comparison operators automatically unwrap their + operands in lax mode, so you can compare SQL/JSON arrays out-of-the-box. An array of size 1 is considered equal to its sole element. - Automatic unwrapping is not performed only when: + Automatic unwrapping is not performed when: @@ -17199,41 +17692,96 @@ $.track.segments[*].HR < 70 For example, when querying the GPS data listed above, you can abstract from the fact that it stores an array of segments - when using the lax mode: - -lax $.track.segments.location - + when using lax mode: + +=> select jsonb_path_query(:'json', 'lax $.track.segments.location'); + jsonb_path_query +------------------- + [47.763, 13.4034] + [47.706, 13.2635] + - In the strict mode, the specified path must exactly match the structure of - the queried JSON document to return an SQL/JSON item, so using this - path expression will cause an error. To get the same result as in - the lax mode, you have to explicitly unwrap the + In strict mode, the specified path must exactly match the structure of + the queried JSON document, so using this path + expression will cause an error: + +=> select jsonb_path_query(:'json', 'strict $.track.segments.location'); +ERROR: jsonpath member accessor can only be applied to an object + + To get the same result as in lax mode, you have to explicitly unwrap the segments array: - -strict $.track.segments[*].location - + +=> select jsonb_path_query(:'json', 'strict $.track.segments[*].location'); + jsonb_path_query +------------------- + [47.763, 13.4034] + [47.706, 13.2635] + - The .** accessor can lead to surprising results - when using the lax mode. For instance, the following query selects every - HR value twice: - -lax $.**.HR - + The unwrapping behavior of lax mode can lead to surprising results. For + instance, the following query using the .** accessor + selects every HR value twice: + +=> select jsonb_path_query(:'json', 'lax $.**.HR'); + jsonb_path_query +------------------ + 73 + 135 + 73 + 135 + This happens because the .** accessor selects both the segments array and each of its elements, while the .HR accessor automatically unwraps arrays when - using the lax mode. To avoid surprising results, we recommend using - the .** accessor only in the strict mode. The + using lax mode. To avoid surprising results, we recommend using + the .** accessor only in strict mode. The following query selects each HR value just once: - -strict $.**.HR - + +=> select jsonb_path_query(:'json', 'strict $.**.HR'); + jsonb_path_query +------------------ + 73 + 135 + + + The unwrapping of arrays can also lead to unexpected results. Consider this + example, which selects all the location arrays: + +=> select jsonb_path_query(:'json', 'lax $.track.segments[*].location'); + jsonb_path_query +------------------- + [47.763, 13.4034] + [47.706, 13.2635] +(2 rows) + + As expected it returns the full arrays. But applying a filter expression + causes the arrays to be unwrapped to evaluate each item, returning only the + items that match the expression: + +=> select jsonb_path_query(:'json', 'lax $.track.segments[*].location ?(@[*] > 15)'); + jsonb_path_query +------------------ + 47.763 + 47.706 +(2 rows) + + This despite the fact that the full arrays are selected by the path + expression. Use strict mode to restore selecting the arrays: + +=> select jsonb_path_query(:'json', 'strict $.track.segments[*].location ?(@[*] > 15)'); + jsonb_path_query +------------------- + [47.763, 13.4034] + [47.706, 13.2635] +(2 rows) + + @@ -17244,7 +17792,10 @@ strict $.**.HR methods available in jsonpath. Note that while the unary operators and methods can be applied to multiple values resulting from a preceding path step, the binary operators (addition etc.) can only be - applied to single values. + applied to single values. In lax mode, methods applied to an array will be + executed for each value in the array. The exceptions are + .type() and .size(), which apply to + the array itself.
@@ -17394,6 +17945,39 @@ strict $.**.HR + + + value . boolean() + boolean + + + Boolean value converted from a JSON boolean, number, or string + + + jsonb_path_query_array('[1, "yes", false]', '$[*].boolean()') + [true, true, false] + + + + + + value . string() + string + + + String value converted from a JSON boolean, number, string, or + datetime + + + jsonb_path_query_array('[1.23, "xyz", false]', '$[*].string()') + ["1.23", "xyz", "false"] + + + jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp().string()') + "2023-08-15T12:34:56" + + + value . double() @@ -17453,49 +18037,237 @@ strict $.**.HR - string . datetime() - datetime_type - (see note) + value . bigint() + bigint - Date/time value converted from a string + Big integer value converted from a JSON number or string - jsonb_path_query('["2015-8-1", "2015-08-12"]', '$[*] ? (@.datetime() < "2015-08-2".datetime())') - "2015-8-1" + jsonb_path_query('{"len": "9876543219"}', '$.len.bigint()') + 9876543219 - string . datetime(template) - datetime_type - (see note) + value . decimal( [ precision [ , scale ] ] ) + decimal - Date/time value converted from a string using the - specified to_timestamp template + Rounded decimal value converted from a JSON number or string + (precision and scale must be + integer values) - jsonb_path_query_array('["12:30", "18:40"]', '$[*].datetime("HH24:MI")') - ["12:30:00", "18:40:00"] + jsonb_path_query('1234.5678', '$.decimal(6, 2)') + 1234.57 - object . keyvalue() - array + value . integer() + integer - The object's key-value pairs, represented as an array of objects - containing three fields: "key", - "value", and "id"; - "id" is a unique identifier of the object the - key-value pair belongs to + Integer value converted from a JSON number or string - jsonb_path_query_array('{"x": "20", "y": 32}', '$.keyvalue()') + jsonb_path_query('{"len": "12345"}', '$.len.integer()') + 12345 + + + + + + value . number() + numeric + + + Numeric value converted from a JSON number or string + + + jsonb_path_query('{"len": "123.45"}', '$.len.number()') + 123.45 + + + + + + string . datetime() + datetime_type + (see note) + + + Date/time value converted from a string + + + jsonb_path_query('["2015-8-1", "2015-08-12"]', '$[*] ? (@.datetime() < "2015-08-2".datetime())') + "2015-8-1" + + + + + + string . datetime(template) + datetime_type + (see note) + + + Date/time value converted from a string using the + specified to_timestamp template + + + jsonb_path_query_array('["12:30", "18:40"]', '$[*].datetime("HH24:MI")') + ["12:30:00", "18:40:00"] + + + + + + string . date() + date + + + Date value converted from a string + + + jsonb_path_query('"2023-08-15"', '$.date()') + "2023-08-15" + + + + + + string . time() + time without time zone + + + Time without time zone value converted from a string + + + jsonb_path_query('"12:34:56"', '$.time()') + "12:34:56" + + + + + + string . time(precision) + time without time zone + + + Time without time zone value converted from a string, with fractional + seconds adjusted to the given precision + + + jsonb_path_query('"12:34:56.789"', '$.time(2)') + "12:34:56.79" + + + + + + string . time_tz() + time with time zone + + + Time with time zone value converted from a string + + + jsonb_path_query('"12:34:56 +05:30"', '$.time_tz()') + "12:34:56+05:30" + + + + + + string . time_tz(precision) + time with time zone + + + Time with time zone value converted from a string, with fractional + seconds adjusted to the given precision + + + jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(2)') + "12:34:56.79+05:30" + + + + + + string . timestamp() + timestamp without time zone + + + Timestamp without time zone value converted from a string + + + jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp()') + "2023-08-15T12:34:56" + + + + + + string . timestamp(precision) + timestamp without time zone + + + Timestamp without time zone value converted from a string, with + fractional seconds adjusted to the given precision + + + jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(2)') + "2023-08-15T12:34:56.79" + + + + + + string . timestamp_tz() + timestamp with time zone + + + Timestamp with time zone value converted from a string + + + jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp_tz()') + "2023-08-15T12:34:56+05:30" + + + + + + string . timestamp_tz(precision) + timestamp with time zone + + + Timestamp with time zone value converted from a string, with fractional + seconds adjusted to the given precision + + + jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(2)') + "2023-08-15T12:34:56.79+05:30" + + + + + + object . keyvalue() + array + + + The object's key-value pairs, represented as an array of objects + containing three fields: "key", + "value", and "id"; + "id" is a unique identifier of the object the + key-value pair belongs to + + + jsonb_path_query_array('{"x": "20", "y": 32}', '$.keyvalue()') [{"id": 0, "key": "x", "value": "20"}, {"id": 0, "key": "y", "value": 32}] @@ -17541,7 +18313,12 @@ strict $.**.HR timestamptz, and time to timetz. However, all but the first of these conversions depend on the current setting, and thus can only be performed - within timezone-aware jsonpath functions. + within timezone-aware jsonpath functions. Similarly, other + date/time-related methods that convert strings to date/time types + also do this casting, which may involve the current + setting. Therefore, these conversions can + also only be performed within timezone-aware jsonpath + functions. @@ -17829,59 +18606,831 @@ strict $.**.HR SQL/JSON Regular Expressions - - LIKE_REGEX - in SQL/JSON - + + LIKE_REGEX + in SQL/JSON + + + + SQL/JSON path expressions allow matching text to a regular expression + with the like_regex filter. For example, the + following SQL/JSON path query would case-insensitively match all + strings in an array that start with an English vowel: + +$[*] ? (@ like_regex "^[aeiou]" flag "i") + + + + + The optional flag string may include one or more of + the characters + i for case-insensitive match, + m to allow ^ + and $ to match at newlines, + s to allow . to match a newline, + and q to quote the whole pattern (reducing the + behavior to a simple substring match). + + + + The SQL/JSON standard borrows its definition for regular expressions + from the LIKE_REGEX operator, which in turn uses the + XQuery standard. PostgreSQL does not currently support the + LIKE_REGEX operator. Therefore, + the like_regex filter is implemented using the + POSIX regular expression engine described in + . This leads to various minor + discrepancies from standard SQL/JSON behavior, which are cataloged in + . + Note, however, that the flag-letter incompatibilities described there + do not apply to SQL/JSON, as it translates the XQuery flag letters to + match what the POSIX engine expects. + + + + Keep in mind that the pattern argument of like_regex + is a JSON path string literal, written according to the rules given in + . This means in particular that any + backslashes you want to use in the regular expression must be doubled. + For example, to match string values of the root document that contain + only digits: + +$.* ? (@ like_regex "^\\d+$") + + + + + + + SQL/JSON Query Functions + + SQL/JSON functions JSON_EXISTS(), + JSON_QUERY(), and JSON_VALUE() + described in can be used + to query JSON documents. Each of these functions apply a + path_expression (an SQL/JSON path query) to a + context_item (the document). See + for more details on what + the path_expression can contain. The + path_expression can also reference variables, + whose values are specified with their respective names in the + PASSING clause that is supported by each function. + context_item can be a jsonb value + or a character string that can be successfully cast to jsonb. + + +
+ SQL/JSON Query Functions + + + + + Function signature + + + Description + + + Example(s) + + + + + + + json_exists + +JSON_EXISTS ( +context_item, path_expression + PASSING { value AS varname } , ... +{ TRUE | FALSE | UNKNOWN | ERROR } ON ERROR ) boolean + + + + + + Returns true if the SQL/JSON path_expression + applied to the context_item yields any + items, false otherwise. + + + + + The ON ERROR clause specifies the behavior if + an error occurs during path_expression + evaluation. Specifying ERROR will cause an error to + be thrown with the appropriate message. Other options include + returning boolean values FALSE or + TRUE or the value UNKNOWN which + is actually an SQL NULL. The default when no ON ERROR + clause is specified is to return the boolean value + FALSE. + + + + + Examples: + + + JSON_EXISTS(jsonb '{"key1": [1,2,3]}', 'strict $.key1[*] ? (@ > $x)' PASSING 2 AS x) + t + + + JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'lax $.a[5]' ERROR ON ERROR) + f + + + JSON_EXISTS(jsonb '{"a": [1,2,3]}', 'strict $.a[5]' ERROR ON ERROR) + + +ERROR: jsonpath array subscript is out of bounds + + + + + + json_query + +JSON_QUERY ( +context_item, path_expression + PASSING { value AS varname } , ... + RETURNING data_type FORMAT JSON ENCODING UTF8 + { WITHOUT | WITH { CONDITIONAL | UNCONDITIONAL } } ARRAY WRAPPER + { KEEP | OMIT } QUOTES ON SCALAR STRING + { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON EMPTY + { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON ERROR ) jsonb + + + + + + Returns the result of applying the SQL/JSON + path_expression to the + context_item. + + + + + By default, the result is returned as a value of type jsonb, + though the RETURNING clause can be used to return + as some other type to which it can be successfully coerced. + + + + + If the path expression may return multiple values, it might be necessary + to wrap those values using the WITH WRAPPER clause to + make it a valid JSON string, because the default behavior is to not wrap + them, as if WITHOUT WRAPPER were specified. The + WITH WRAPPER clause is by default taken to mean + WITH UNCONDITIONAL WRAPPER, which means that even a + single result value will be wrapped. To apply the wrapper only when + multiple values are present, specify WITH CONDITIONAL WRAPPER. + Getting multiple values in result will be treated as an error if + WITHOUT WRAPPER is specified. + + + + + If the result is a scalar string, by default, the returned value will + be surrounded by quotes, making it a valid JSON value. It can be made + explicit by specifying KEEP QUOTES. Conversely, + quotes can be omitted by specifying OMIT QUOTES. + To ensure that the result is a valid JSON value, OMIT QUOTES + cannot be specified when WITH WRAPPER is also + specified. + + + + + The ON EMPTY clause specifies the behavior if + evaluating path_expression yields an empty + set. The ON ERROR clause specifies the behavior + if an error occurs when evaluating path_expression, + when coercing the result value to the RETURNING type, + or when evaluating the ON EMPTY expression if the + path_expression evaluation returns an empty + set. + + + + + For both ON EMPTY and ON ERROR, + specifying ERROR will cause an error to be thrown with + the appropriate message. Other options include returning an SQL NULL, an + empty array (EMPTY ARRAY), + an empty object (EMPTY OBJECT), or a user-specified + expression (DEFAULT expression) + that can be coerced to jsonb or the type specified in RETURNING. + The default when ON EMPTY or ON ERROR + is not specified is to return an SQL NULL value. + + + + + Examples: + + + JSON_QUERY(jsonb '[1,[2,3],null]', 'lax $[*][$off]' PASSING 1 AS off WITH CONDITIONAL WRAPPER) + 3 + + + JSON_QUERY(jsonb '{"a": "[1, 2]"}', 'lax $.a' OMIT QUOTES) + [1, 2] + + + JSON_QUERY(jsonb '{"a": "[1, 2]"}', 'lax $.a' RETURNING int[] OMIT QUOTES ERROR ON ERROR) + + +ERROR: malformed array literal: "[1, 2]" +DETAIL: Missing "]" after array dimensions. + + + + + + + json_value + +JSON_VALUE ( +context_item, path_expression + PASSING { value AS varname } , ... + RETURNING data_type + { ERROR | NULL | DEFAULT expression } ON EMPTY + { ERROR | NULL | DEFAULT expression } ON ERROR ) text + + + + + + Returns the result of applying the SQL/JSON + path_expression to the + context_item. + + + + + Only use JSON_VALUE() if the extracted value is + expected to be a single SQL/JSON scalar item; + getting multiple values will be treated as an error. If you expect that + extracted value might be an object or an array, use the + JSON_QUERY function instead. + + + + + By default, the result, which must be a single scalar value, is + returned as a value of type text, though the + RETURNING clause can be used to return as some + other type to which it can be successfully coerced. + + + + + The ON ERROR and ON EMPTY + clauses have similar semantics as mentioned in the description of + JSON_QUERY, except the set of values returned in + lieu of throwing an error is different. + + + + + Note that scalar strings returned by JSON_VALUE + always have their quotes removed, equivalent to specifying + OMIT QUOTES in JSON_QUERY. + + + + + Examples: + + + JSON_VALUE(jsonb '"123.45"', '$' RETURNING float) + 123.45 + + + JSON_VALUE(jsonb '"03:04 2015-02-01"', '$.datetime("HH24:MI YYYY-MM-DD")' RETURNING date) + 2015-02-01 + + + JSON_VALUE(jsonb '[1,2]', 'strict $[$off]' PASSING 1 as off) + 2 + + + JSON_VALUE(jsonb '[1,2]', 'strict $[*]' DEFAULT 9 ON ERROR) + 9 + + + + + +
+ + + The context_item expression is converted to + jsonb by an implicit cast if the expression is not already of + type jsonb. Note, however, that any parsing errors that occur + during that conversion are thrown unconditionally, that is, are not + handled according to the (specified or implicit) ON ERROR + clause. + + + + + JSON_VALUE() returns an SQL NULL if + path_expression returns a JSON + null, whereas JSON_QUERY() returns + the JSON null as is. + + + + + + JSON_TABLE + + json_table + + + + JSON_TABLE is an SQL/JSON function which + queries JSON data + and presents the results as a relational view, which can be accessed as a + regular SQL table. You can use JSON_TABLE inside + the FROM clause of a SELECT, + UPDATE, or DELETE and as data source + in a MERGE statement. + + + + Taking JSON data as input, JSON_TABLE uses a JSON path + expression to extract a part of the provided data to use as a + row pattern for the constructed view. Each SQL/JSON + value given by the row pattern serves as source for a separate row in the + constructed view. + + + + To split the row pattern into columns, JSON_TABLE + provides the COLUMNS clause that defines the + schema of the created view. For each column, a separate JSON path expression + can be specified to be evaluated against the row pattern to get an SQL/JSON + value that will become the value for the specified column in a given output + row. + + + + JSON data stored at a nested level of the row pattern can be extracted using + the NESTED PATH clause. Each + NESTED PATH clause can be used to generate one or more + columns using the data from a nested level of the row pattern. Those + columns can be specified using a COLUMNS clause that + looks similar to the top-level COLUMNS clause. Rows constructed from + NESTED COLUMNS are called child rows and are joined + against the row constructed from the columns specified in the parent + COLUMNS clause to get the row in the final view. Child + columns themselves may contain a NESTED PATH + specification thus allowing to extract data located at arbitrary nesting + levels. Columns produced by multiple NESTED PATHs at the + same level are considered to be siblings of each + other and their rows after joining with the parent row are combined using + UNION. + + + + The rows produced by JSON_TABLE are laterally + joined to the row that generated them, so you do not have to explicitly join + the constructed view with the original table holding JSON + data. + + + + The syntax is: + + + +JSON_TABLE ( + context_item, path_expression AS json_path_name PASSING { value AS varname } , ... + COLUMNS ( json_table_column , ... ) + { ERROR | EMPTY ARRAY} ON ERROR +) + + +where json_table_column is: + + name FOR ORDINALITY + | name type + FORMAT JSON ENCODING UTF8 + PATH path_expression + { WITHOUT | WITH { CONDITIONAL | UNCONDITIONAL } } ARRAY WRAPPER + { KEEP | OMIT } QUOTES ON SCALAR STRING + { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON EMPTY + { ERROR | NULL | EMPTY { ARRAY | OBJECT } | DEFAULT expression } ON ERROR + | name type EXISTS PATH path_expression + { ERROR | TRUE | FALSE | UNKNOWN } ON ERROR + | NESTED PATH path_expression AS json_path_name COLUMNS ( json_table_column , ... ) + + + + Each syntax element is described below in more detail. + + + + + + context_item, path_expression AS json_path_name PASSING { value AS varname } , ... + + + + The context_item specifies the input document + to query, the path_expression is an SQL/JSON + path expression defining the query, and json_path_name + is an optional name for the path_expression. + The optional PASSING clause provides data values for + the variables mentioned in the path_expression. + The result of the input data evaluation using the aforementioned elements + is called the row pattern, which is used as the + source for row values in the constructed view. + + + + + + + COLUMNS ( json_table_column , ... ) + + + + + The COLUMNS clause defining the schema of the + constructed view. In this clause, you can specify each column to be + filled with an SQL/JSON value obtained by applying a JSON path expression + against the row pattern. json_table_column has + the following variants: + + + + + + name FOR ORDINALITY + + + + Adds an ordinality column that provides sequential row numbering starting + from 1. Each NESTED PATH (see below) gets its own + counter for any nested ordinality columns. + + + + + + + name type + FORMAT JSON ENCODING UTF8 + PATH path_expression + + + + Inserts an SQL/JSON value obtained by applying + path_expression against the row pattern into + the view's output row after coercing it to specified + type. + + + Specifying FORMAT JSON makes it explicit that you + expect the value to be a valid json object. It only + makes sense to specify FORMAT JSON if + type is one of bpchar, + bytea, character varying, name, + json, jsonb, text, or a domain over + these types. + + + Optionally, you can specify WRAPPER and + QUOTES clauses to format the output. Note that + specifying OMIT QUOTES overrides + FORMAT JSON if also specified, because unquoted + literals do not constitute valid json values. + + + Optionally, you can use ON EMPTY and + ON ERROR clauses to specify whether to throw the error + or return the specified value when the result of JSON path evaluation is + empty and when an error occurs during JSON path evaluation or when + coercing the SQL/JSON value to the specified type, respectively. The + default for both is to return a NULL value. + + + + This clause is internally turned into and has the same semantics as + JSON_VALUE or JSON_QUERY. + The latter if the specified type is not a scalar type or if either of + FORMAT JSON, WRAPPER, or + QUOTES clause is present. + + + + + + + + name type + EXISTS PATH path_expression + + + + Inserts a boolean value obtained by applying + path_expression against the row pattern + into the view's output row after coercing it to specified + type. + + + The value corresponds to whether applying the PATH + expression to the row pattern yields any values. + + + The specified type should have a cast from the + boolean type. + + + Optionally, you can use ON ERROR to specify whether to + throw the error or return the specified value when an error occurs during + JSON path evaluation or when coercing SQL/JSON value to the specified + type. The default is to return a boolean value + FALSE. + + + + This clause is internally turned into and has the same semantics as + JSON_EXISTS. + + + + + + + + NESTED PATH path_expression AS json_path_name + COLUMNS ( json_table_column , ... ) + + - SQL/JSON path expressions allow matching text to a regular expression - with the like_regex filter. For example, the - following SQL/JSON path query would case-insensitively match all - strings in an array that start with an English vowel: - -$[*] ? (@ like_regex "^[aeiou]" flag "i") - + Extracts SQL/JSON values from nested levels of the row pattern, + generates one or more columns as defined by the COLUMNS + subclause, and inserts the extracted SQL/JSON values into those + columns. The json_table_column + expression in the COLUMNS subclause uses the same + syntax as in the parent COLUMNS clause. - The optional flag string may include one or more of - the characters - i for case-insensitive match, - m to allow ^ - and $ to match at newlines, - s to allow . to match a newline, - and q to quote the whole pattern (reducing the - behavior to a simple substring match). + The NESTED PATH syntax is recursive, + so you can go down multiple nested levels by specifying several + NESTED PATH subclauses within each other. + It allows to unnest the hierarchy of JSON objects and arrays + in a single function invocation rather than chaining several + JSON_TABLE expressions in an SQL statement. + + + + + + + In each variant of json_table_column described + above, if the PATH clause is omitted, path expression + $.name is used, where + name is the provided column name. + + + + + + + + + AS json_path_name + + - The SQL/JSON standard borrows its definition for regular expressions - from the LIKE_REGEX operator, which in turn uses the - XQuery standard. PostgreSQL does not currently support the - LIKE_REGEX operator. Therefore, - the like_regex filter is implemented using the - POSIX regular expression engine described in - . This leads to various minor - discrepancies from standard SQL/JSON behavior, which are cataloged in - . - Note, however, that the flag-letter incompatibilities described there - do not apply to SQL/JSON, as it translates the XQuery flag letters to - match what the POSIX engine expects. + The optional json_path_name serves as an + identifier of the provided path_expression. + The name must be unique and distinct from the column names. + + + + + + { ERROR | EMPTY } ON ERROR + + - Keep in mind that the pattern argument of like_regex - is a JSON path string literal, written according to the rules given in - . This means in particular that any - backslashes you want to use in the regular expression must be doubled. - For example, to match string values of the root document that contain - only digits: + The optional ON ERROR can be used to specify how to + handle errors when evaluating the top-level + path_expression. Use ERROR + if you want the errors to be thrown and EMPTY to + return an empty table, that is, a table containing 0 rows. Note that + this clause does not affect the errors that occur when evaluating + columns, for which the behavior depends on whether the + ON ERROR clause is specified against a given column. + + + + + + Examples + + + In the examples that follow, the following table containing JSON data + will be used: + -$.* ? (@ like_regex "^\\d+$") +CREATE TABLE my_films ( js jsonb ); + +INSERT INTO my_films VALUES ( +'{ "favorites" : [ + { "kind" : "comedy", "films" : [ + { "title" : "Bananas", + "director" : "Woody Allen"}, + { "title" : "The Dinner Game", + "director" : "Francis Veber" } ] }, + { "kind" : "horror", "films" : [ + { "title" : "Psycho", + "director" : "Alfred Hitchcock" } ] }, + { "kind" : "thriller", "films" : [ + { "title" : "Vertigo", + "director" : "Alfred Hitchcock" } ] }, + { "kind" : "drama", "films" : [ + { "title" : "Yojimbo", + "director" : "Akira Kurosawa" } ] } + ] }'); - - + + + + The following query shows how to use JSON_TABLE to + turn the JSON objects in the my_films table + to a view containing columns for the keys kind, + title, and director contained in + the original JSON along with an ordinality column: + + +SELECT jt.* FROM + my_films, + JSON_TABLE (js, '$.favorites[*]' COLUMNS ( + id FOR ORDINALITY, + kind text PATH '$.kind', + title text PATH '$.films[*].title' WITH WRAPPER, + director text PATH '$.films[*].director' WITH WRAPPER)) AS jt; + + + + id | kind | title | director +----+----------+--------------------------------+---------------------------------- + 1 | comedy | ["Bananas", "The Dinner Game"] | ["Woody Allen", "Francis Veber"] + 2 | horror | ["Psycho"] | ["Alfred Hitchcock"] + 3 | thriller | ["Vertigo"] | ["Alfred Hitchcock"] + 4 | drama | ["Yojimbo"] | ["Akira Kurosawa"] +(4 rows) + + + + + The following is a modified version of the above query to show the + usage of PASSING arguments in the filter specified in + the top-level JSON path expression and the various options for the + individual columns: + + +SELECT jt.* FROM + my_films, + JSON_TABLE (js, '$.favorites[*] ? (@.films[*].director == $filter)' + PASSING 'Alfred Hitchcock' AS filter + COLUMNS ( + id FOR ORDINALITY, + kind text PATH '$.kind', + title text FORMAT JSON PATH '$.films[*].title' OMIT QUOTES, + director text PATH '$.films[*].director' KEEP QUOTES)) AS jt; + + + + id | kind | title | director +----+----------+---------+-------------------- + 1 | horror | Psycho | "Alfred Hitchcock" + 2 | thriller | Vertigo | "Alfred Hitchcock" +(2 rows) + + + + + The following is a modified version of the above query to show the usage + of NESTED PATH for populating title and director + columns, illustrating how they are joined to the parent columns id and + kind: + + +SELECT jt.* FROM + my_films, + JSON_TABLE ( js, '$.favorites[*] ? (@.films[*].director == $filter)' + PASSING 'Alfred Hitchcock' AS filter + COLUMNS ( + id FOR ORDINALITY, + kind text PATH '$.kind', + NESTED PATH '$.films[*]' COLUMNS ( + title text FORMAT JSON PATH '$.title' OMIT QUOTES, + director text PATH '$.director' KEEP QUOTES))) AS jt; + + + + id | kind | title | director +----+----------+---------+-------------------- + 1 | horror | Psycho | "Alfred Hitchcock" + 2 | thriller | Vertigo | "Alfred Hitchcock" +(2 rows) + + + + + + The following is the same query but without the filter in the root + path: + + +SELECT jt.* FROM + my_films, + JSON_TABLE ( js, '$.favorites[*]' + COLUMNS ( + id FOR ORDINALITY, + kind text PATH '$.kind', + NESTED PATH '$.films[*]' COLUMNS ( + title text FORMAT JSON PATH '$.title' OMIT QUOTES, + director text PATH '$.director' KEEP QUOTES))) AS jt; + + + + id | kind | title | director +----+----------+-----------------+-------------------- + 1 | comedy | Bananas | "Woody Allen" + 1 | comedy | The Dinner Game | "Francis Veber" + 2 | horror | Psycho | "Alfred Hitchcock" + 3 | thriller | Vertigo | "Alfred Hitchcock" + 4 | drama | Yojimbo | "Akira Kurosawa" +(5 rows) + + + + + + The following shows another query using a different JSON + object as input. It shows the UNION "sibling join" between + NESTED paths $.movies[*] and + $.books[*] and also the usage of + FOR ORDINALITY column at NESTED + levels (columns movie_id, book_id, + and author_id): + + +SELECT * FROM JSON_TABLE ( +'{"favorites": + [{"movies": + [{"name": "One", "director": "John Doe"}, + {"name": "Two", "director": "Don Joe"}], + "books": + [{"name": "Mystery", "authors": [{"name": "Brown Dan"}]}, + {"name": "Wonder", "authors": [{"name": "Jun Murakami"}, {"name":"Craig Doe"}]}] +}]}'::json, '$.favorites[*]' +COLUMNS ( + user_id FOR ORDINALITY, + NESTED '$.movies[*]' + COLUMNS ( + movie_id FOR ORDINALITY, + mname text PATH '$.name', + director text), + NESTED '$.books[*]' + COLUMNS ( + book_id FOR ORDINALITY, + bname text PATH '$.name', + NESTED '$.authors[*]' + COLUMNS ( + author_id FOR ORDINALITY, + author_name text PATH '$.name')))); + + + + user_id | movie_id | mname | director | book_id | bname | author_id | author_name +---------+----------+-------+----------+---------+---------+-----------+-------------- + 1 | 1 | One | John Doe | | | | + 1 | 2 | Two | Don Joe | | | | + 1 | | | | 1 | Mystery | 1 | Brown Dan + 1 | | | | 2 | Wonder | 1 | Jun Murakami + 1 | | | | 2 | Wonder | 2 | Craig Doe +(5 rows) + + + @@ -19675,7 +21224,7 @@ SELECT NULLIF(value, '(none)') ... Extracts the lower bound of the range (NULL if the - range is empty or the lower bound is infinite). + range is empty or has no lower bound). lower(numrange(1.1,2.2)) @@ -19693,7 +21242,7 @@ SELECT NULLIF(value, '(none)') ... Extracts the upper bound of the range (NULL if the - range is empty or the upper bound is infinite). + range is empty or has no upper bound). upper(numrange(1.1,2.2)) @@ -19761,7 +21310,8 @@ SELECT NULLIF(value, '(none)') ... boolean - Is the range's lower bound infinite? + Does the range have no lower bound? (A lower bound of + -Infinity returns false.) lower_inf('(,)'::daterange) @@ -19778,7 +21328,8 @@ SELECT NULLIF(value, '(none)') ... boolean - Is the range's upper bound infinite? + Does the range have no upper bound? (An upper bound of + Infinity returns false.) upper_inf('(,)'::daterange) @@ -19833,7 +21384,7 @@ SELECT NULLIF(value, '(none)') ... Extracts the lower bound of the multirange (NULL if the - multirange is empty or the lower bound is infinite). + multirange is empty has no lower bound). lower('{[1.1,2.2)}'::nummultirange) @@ -19851,7 +21402,7 @@ SELECT NULLIF(value, '(none)') ... Extracts the upper bound of the multirange (NULL if the - multirange is empty or the upper bound is infinite). + multirange is empty or has no upper bound). upper('{[1.1,2.2)}'::nummultirange) @@ -19919,7 +21470,8 @@ SELECT NULLIF(value, '(none)') ... boolean - Is the multirange's lower bound infinite? + Does the multirange have no lower bound? (A lower bound of + -Infinity returns false.) lower_inf('{(,)}'::datemultirange) @@ -19936,7 +21488,8 @@ SELECT NULLIF(value, '(none)') ... boolean - Is the multirange's upper bound infinite? + Does the multirange have no upper bound? (An upper bound of + Infinity returns false.) upper_inf('{(,)}'::datemultirange) @@ -19988,8 +21541,7 @@ SELECT NULLIF(value, '(none)') ... setof anyrange - Expands a multirange into a set of ranges. - The ranges are read out in storage order (ascending). + Expands a multirange into a set of ranges in ascending order. unnest('{[1,2), [3,4)}'::int4multirange) @@ -20043,6 +21595,13 @@ SELECT NULLIF(value, '(none)') ... aggregation. + + While all aggregates below accept an optional + ORDER BY clause (as outlined in ), the clause has only been added to + aggregates whose output is affected by ordering. + + General-Purpose Aggregate Functions @@ -20080,7 +21639,7 @@ SELECT NULLIF(value, '(none)') ... array_agg - array_agg ( anynonarray ) + array_agg ( anynonarray ORDER BY input_sort_columns ) anyarray @@ -20091,7 +21650,7 @@ SELECT NULLIF(value, '(none)') ... - array_agg ( anyarray ) + array_agg ( anyarray ORDER BY input_sort_columns ) anyarray @@ -20296,14 +21855,14 @@ SELECT NULLIF(value, '(none)') ... json_agg - json_agg ( anyelement ) + json_agg ( anyelement ORDER BY input_sort_columns ) json jsonb_agg - jsonb_agg ( anyelement ) + jsonb_agg ( anyelement ORDER BY input_sort_columns ) jsonb @@ -20314,6 +21873,54 @@ SELECT NULLIF(value, '(none)') ... No + + + + json_agg_strict + + json_agg_strict ( anyelement ) + json + + + + jsonb_agg_strict + + jsonb_agg_strict ( anyelement ) + jsonb + + + Collects all the input values, skipping nulls, into a JSON array. + Values are converted to JSON as per to_json + or to_jsonb. + + No + + + + + json_arrayagg + json_arrayagg ( + value_expression + ORDER BY sort_expression + { NULL | ABSENT } ON NULL + RETURNING data_type FORMAT JSON ENCODING UTF8 ) + + + Behaves in the same way as json_array + but as an aggregate function so it only takes one + value_expression parameter. + If ABSENT ON NULL is specified, any NULL + values are omitted. + If ORDER BY is specified, the elements will + appear in the array in that order rather than in the input order. + + + SELECT json_arrayagg(v) FROM (VALUES(2),(1)) t(v) + [2, 1] + + No + + json_objectagg @@ -20343,7 +21950,8 @@ SELECT NULLIF(value, '(none)') ... json_object_agg ( key "any", value - "any" ) + "any" + ORDER BY input_sort_columns ) json @@ -20352,7 +21960,8 @@ SELECT NULLIF(value, '(none)') ... jsonb_object_agg ( key "any", value - "any" ) + "any" + ORDER BY input_sort_columns ) jsonb @@ -20422,31 +22031,6 @@ SELECT NULLIF(value, '(none)') ... No - - - json_arrayagg - json_arrayagg ( - value_expression - ORDER BY sort_expression - { NULL | ABSENT } ON NULL - RETURNING data_type FORMAT JSON ENCODING UTF8 ) - - - Behaves in the same way as json_array - but as an aggregate function so it only takes one - value_expression parameter. - If ABSENT ON NULL is specified, any NULL - values are omitted. - If ORDER BY is specified, the elements will - appear in the array in that order rather than in the input order. - - - SELECT json_arrayagg(v) FROM (VALUES(2),(1)) t(v) - [2, 1] - - No - - @@ -20555,29 +22139,6 @@ SELECT NULLIF(value, '(none)') ... No - - - - json_agg_strict - - json_agg_strict ( anyelement ) - json - - - - jsonb_agg_strict - - jsonb_agg_strict ( anyelement ) - jsonb - - - Collects all the input values, skipping nulls, into a JSON array. - Values are converted to JSON as per to_json - or to_jsonb. - - No - - @@ -20589,7 +22150,8 @@ SELECT NULLIF(value, '(none)') ... string_agg ( value - bytea, delimiter bytea ) + bytea, delimiter bytea + ORDER BY input_sort_columns ) bytea @@ -20647,7 +22209,7 @@ SELECT NULLIF(value, '(none)') ... xmlagg - xmlagg ( xml ) + xmlagg ( xml ORDER BY input_sort_columns ) xml @@ -21705,6 +23267,85 @@ SELECT count(*) FROM sometable; + + Merge Support Functions + + + MERGE + RETURNING + + + + PostgreSQL includes one merge support function + that may be used in the RETURNING list of a + command to identify the action taken for each + row; see . + + +
+ Merge Support Functions + + + + + + Function + + + Description + + + + + + + + + merge_action + + merge_action ( ) + text + + + Returns the merge action command executed for the current row. This + will be 'INSERT', 'UPDATE', or + 'DELETE'. + + + + +
+ + + Example: + 0 THEN + UPDATE SET in_stock = true, quantity = s.quantity + WHEN MATCHED THEN + UPDATE SET in_stock = false, quantity = 0 + WHEN NOT MATCHED THEN + INSERT (product_id, in_stock, quantity) + VALUES (s.product_id, true, s.quantity) + RETURNING merge_action(), p.*; + + merge_action | product_id | in_stock | quantity +--------------+------------+----------+---------- + UPDATE | 1001 | t | 50 + UPDATE | 1002 | f | 0 + INSERT | 1003 | t | 10 +]]> + + + + Note that this function can only be used in the RETURNING + list of a MERGE command. It is an error to use it in any + other part of a query. + + + + Subquery Expressions @@ -22127,7 +23768,7 @@ WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2); The right-hand side is a parenthesized list - of scalar expressions. The result is true if the left-hand expression's + of expressions. The result is true if the left-hand expression's result is equal to any of the right-hand expressions. This is a shorthand notation for @@ -22158,7 +23799,7 @@ OR The right-hand side is a parenthesized list - of scalar expressions. The result is true if the left-hand expression's + of expressions. The result is true if the left-hand expression's result is unequal to all of the right-hand expressions. This is a shorthand notation for @@ -22269,26 +23910,24 @@ AND Each side is a row constructor, as described in . - The two row values must have the same number of fields. - Each side is evaluated and they are compared row-wise. Row constructor - comparisons are allowed when the operator is + The two row constructors must have the same number of fields. + The given operator is applied to each pair + of corresponding fields. (Since the fields could be of different + types, this means that a different specific operator could be selected + for each pair.) + All the selected operators must be members of some B-tree operator + class, or be the negator of an = member of a B-tree + operator class, meaning that row constructor comparison is only + possible when the operator is =, <>, <, <=, - > or - >=. - Every row element must be of a type which has a default B-tree operator - class or the attempted comparison may generate an error. + >, or + >=, + or has semantics similar to one of these. - - - Errors related to the number or types of elements might not occur if - the comparison is resolved using earlier columns. - - - The = and <> cases work slightly differently from the others. Two rows are considered @@ -22309,19 +23948,6 @@ AND considered. - - - Prior to PostgreSQL 8.2, the - <, <=, > and >= - cases were not handled per SQL specification. A comparison like - ROW(a,b) < ROW(c,d) - was implemented as - a < c AND b < d - whereas the correct behavior is equivalent to - a < c OR (a = c AND b < d). - - - row_constructor IS DISTINCT FROM row_constructor @@ -22734,7 +24360,7 @@ SELECT * FROM pg_ls_dir('.') WITH ORDINALITY AS t(ls,n); In addition to the functions listed in this section, there are a number of functions related to the statistics system that also provide system - information. See for more + information. See for more information. @@ -23033,6 +24659,11 @@ SELECT * FROM pg_ls_dir('.') WITH ORDINALITY AS t(ls,n); . The result reflects the contents of the current_logfiles file. + + + This function is restricted to superusers and roles with privileges of + the pg_monitor role by default, but other users can + be granted EXECUTE to run the function. @@ -23213,25 +24844,6 @@ SELECT * FROM pg_ls_dir('.') WITH ORDINALITY AS t(ls,n); This is equivalent to current_user. - - - - - version - - version () - text - - - Returns a string describing the PostgreSQL - server's version. You can also get this information from - , or for a machine-readable - version use . Software - developers should use server_version_num (available - since 8.2) or instead of - parsing the text version. - - @@ -23608,6 +25220,10 @@ SELECT has_function_privilege('joeuser', 'myfunc(int, text)', 'execute'); are immediately available without doing SET ROLE, while SET denotes whether it is possible to change to the role using the SET ROLE command. + WITH ADMIN OPTION or WITH GRANT + OPTION can be added to any of these privilege types to + test whether the ADMIN privilege is held (all + six spellings test the same thing). This function does not allow the special case of setting user to public, because the PUBLIC pseudo-role can never be a member of real roles. @@ -24076,7 +25692,7 @@ SELECT pg_type_is_visible('myschema.widget'::regtype); - + format_type @@ -24090,6 +25706,30 @@ SELECT pg_type_is_visible('myschema.widget'::regtype); + + + + pg_basetype + + pg_basetype ( regtype ) + regtype + + + Returns the OID of the base type of a domain identified by its + type OID. If the argument is the OID of a non-domain type, + returns the argument as-is. Returns NULL if the argument is + not a valid type OID. If there's a chain of domain dependencies, + it will recurse until finding the base type. + + + Assuming CREATE DOMAIN mytext AS text: + + + pg_basetype('mytext'::regtype) + text + + + @@ -24591,18 +26231,8 @@ SELECT currval(pg_get_serial_sequence('sometable', 'id')); OID for comparison purposes but displays as a type name. - For example: - -SELECT pg_typeof(33); - pg_typeof ------------ - integer - -SELECT typlen FROM pg_type WHERE oid = pg_typeof(33); - typlen --------- - 4 - + pg_typeof(33) + integer @@ -24622,18 +26252,12 @@ SELECT typlen FROM pg_type WHERE oid = pg_typeof(33); collatable data type, then an error is raised. - For example: - -SELECT collation for (description) FROM pg_description LIMIT 1; - pg_collation_for ------------------- - "default" - -SELECT collation for ('foo' COLLATE "de_DE"); - pg_collation_for ------------------- - "de_DE" - + collation for ('foo'::text) + "default" + + + collation for ('foo' COLLATE "de_DE") + "de_DE" @@ -24774,7 +26398,7 @@ SELECT collation for ('foo' COLLATE "de_DE"); - + to_regtype @@ -24782,11 +26406,42 @@ SELECT collation for ('foo' COLLATE "de_DE"); regtype - Translates a textual type name to its OID. A similar result is - obtained by casting the string to type regtype (see - ); however, this function will return - NULL rather than throwing an error if the name is - not found. + Parses a string of text, extracts a potential type name from it, + and translates that name into a type OID. A syntax error in the + string will result in an error; but if the string is a + syntactically valid type name that happens not to be found in the + catalogs, the result is NULL. A similar result + is obtained by casting the string to type regtype + (see ), except that that will throw + error for name not found. + + + + + + + to_regtypemod + + to_regtypemod ( text ) + integer + + + Parses a string of text, extracts a potential type name from it, + and translates its type modifier, if any. A syntax error in the + string will result in an error; but if the string is a + syntactically valid type name that happens not to be found in the + catalogs, the result is NULL. The result is + -1 if no type modifier is present. + + + to_regtypemod can be combined with + to produce appropriate inputs for + , allowing a string representing a + type name to be canonicalized. + + + format_type(to_regtype('varchar(32)'), to_regtypemod('varchar(32)')) + character varying(32) @@ -25314,21 +26969,12 @@ SELECT collation for ('foo' COLLATE "de_DE"); directly. - select * from pg_input_error_info('42000000000', 'integer') + SELECT * FROM pg_input_error_info('42000000000', 'integer') message | detail | hint | sql_error_code ------------------------------------------------------+--------+------+---------------- value "42000000000" is out of range for type integer | | | 22003 - - - - select message, detail from pg_input_error_info('1234.567', 'numeric(7,4)') - - - message | detail -------------------------+----------------------------------&zwsp;------------------------------------------------- - numeric field overflow | A field with precision 7, scale 4 must round to an absolute value less than 10^3. @@ -25363,6 +27009,34 @@ SELECT collation for ('foo' COLLATE "de_DE"); + + + + age + + age ( xid ) + integer + + + Returns the number of transactions between the supplied + transaction id and the current transaction counter. + + + + + + + mxid_age + + mxid_age ( xid ) + integer + + + Returns the number of multixacts IDs between the supplied + multixact ID and the current multixacts counter. + + + @@ -25507,7 +27181,8 @@ SELECT collation for ('foo' COLLATE "de_DE"); The internal transaction ID type xid is 32 bits wide and wraps around every 4 billion transactions. However, - the functions shown in use a + the functions shown in , except + age and mxid_age, use a 64-bit type xid8 that does not wrap around during the life of an installation and can be converted to xid by casting if required; see for details. @@ -25589,6 +27264,7 @@ SELECT collation for ('foo' COLLATE "de_DE"); + @@ -25707,7 +27383,8 @@ SELECT collation for ('foo' COLLATE "de_DE"); They only provide useful data when the configuration option is enabled, and only for transactions that were committed after it was - enabled. + enabled. Commit timestamp information is routinely removed during + vacuum. @@ -26118,6 +27795,199 @@ SELECT collation for ('foo' COLLATE "de_DE"); + + Version Information Functions + + + The functions shown in + print version information. + + +
+ Version Information Functions + + + + + Function + + + Description + + + + + + + + + version + + version () + text + + + Returns a string describing the PostgreSQL + server's version. You can also get this information from + , or for a machine-readable + version use . Software + developers should use server_version_num (available + since 8.2) or instead of + parsing the text version. + + + + + + + unicode_version + + unicode_version () + text + + + Returns a string representing the version of Unicode used by + PostgreSQL. + + + + + + icu_unicode_version + + icu_unicode_version () + text + + + Returns a string representing the version of Unicode used by ICU, if + the server was built with ICU support; otherwise returns + NULL + + + +
+ + + + + WAL Summarization Information Functions + + + The functions shown in + print information about the status of WAL summarization. + See . + + + + WAL Summarization Information Functions + + + + + Function + + + Description + + + + + + + + + pg_available_wal_summaries + + pg_available_wal_summaries () + setof record + ( tli bigint, + start_lsn pg_lsn, + end_lsn pg_lsn ) + + + Returns information about the WAL summary files present in the + data directory, under pg_wal/summaries. + One row will be returned per WAL summary file. Each file summarizes + WAL on the indicated TLI within the indicated LSN range. This function + might be useful to determine whether enough WAL summaries are present + on the server to take an incremental backup based on some prior + backup whose start LSN is known. + + + + + + + pg_wal_summary_contents + + pg_wal_summary_contents ( tli bigint, start_lsn pg_lsn, end_lsn pg_lsn ) + setof record + ( relfilenode oid, + reltablespace oid, + reldatabase oid, + relforknumber smallint, + relblocknumber bigint, + is_limit_block boolean ) + + + Returns one information about the contents of a single WAL summary file + identified by TLI and starting and ending LSNs. Each row with + is_limit_block false indicates that the block + identified by the remaining output columns was modified by at least + one WAL record within the range of records summarized by this file. + Each row with is_limit_block true indicates either + that (a) the relation fork was truncated to the length given by + relblocknumber within the relevant range of WAL + records or (b) that the relation fork was created or dropped within + the relevant range of WAL records; in such cases, + relblocknumber will be zero. + + + + + + + pg_get_wal_summarizer_state + + pg_get_wal_summarizer_state () + record + ( summarized_tli bigint, + summarized_lsn pg_lsn, + pending_lsn pg_lsn, + summarizer_pid int ) + + + Returns information about the progress of the WAL summarizer. If the + WAL summarizer has never run since the instance was started, then + summarized_tli and summarized_lsn + will be 0 and 0/0 respectively; + otherwise, they will be the TLI and ending LSN of the last WAL summary + file written to disk. If the WAL summarizer is currently running, + pending_lsn will be the ending LSN of the last + record that it has consumed, which must always be greater than or + equal to summarized_lsn; if the WAL summarizer is + not running, it will be equal to summarized_lsn. + summarizer_pid is the PID of the WAL summarizer + process, if it is running, and otherwise NULL. + + + As a special exception, the WAL summarizer will refuse to generate + WAL summary files if run on WAL generated under + wal_level=minimal, since such summaries would be + unsafe to use as the basis for an incremental backup. In this case, + the fields above will continue to advance as if summaries were being + generated, but nothing will be written to disk. Once the summarizer + reaches WAL generated while wal_level was set + to replica or higher, it will resume writing + summaries to disk. + + + + +
+ +
+
@@ -26313,7 +28183,7 @@ SELECT collation for ('foo' COLLATE "de_DE"); of its children.) You can use the pg_file_settings, pg_hba_file_rules and - pg_ident_file_mappings views + pg_ident_file_mappings views to check the configuration files for possible errors, before reloading. @@ -26719,11 +28589,6 @@ postgres=# SELECT * FROM pg_walfile_name_offset((pg_backup_stop()).lsn); (1 row) Similarly, pg_walfile_name extracts just the write-ahead log file name. - When the given write-ahead log location is exactly at a write-ahead log file boundary, both - these functions return the name of the preceding write-ahead log file. - This is usually the desired behavior for managing write-ahead log archiving - behavior, since the preceding file is the last one that currently - needs to be archived. @@ -27180,17 +29045,16 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset Drops the physical or logical replication slot named slot_name. Same as replication protocol - command DROP_REPLICATION_SLOT. For logical slots, this must - be called while connected to the same database the slot was created on. + command DROP_REPLICATION_SLOT. - + pg_create_logical_replication_slot - pg_create_logical_replication_slot ( slot_name name, plugin name , temporary boolean, twophase boolean ) + pg_create_logical_replication_slot ( slot_name name, plugin name , temporary boolean, twophase boolean, failover boolean ) record ( slot_name name, lsn pg_lsn ) @@ -27205,8 +29069,13 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset released upon any error. The optional fourth parameter, twophase, when set to true, specifies that the decoding of prepared transactions is enabled for this - slot. A call to this function has the same effect as the replication - protocol command CREATE_REPLICATION_SLOT ... LOGICAL. + slot. The optional fifth parameter, + failover, when set to true, + specifies that this slot is enabled to be synced to the + standbys so that logical replication can be resumed after + failover. A call to this function has the same effect as + the replication protocol command + CREATE_REPLICATION_SLOT ... LOGICAL. @@ -27226,7 +29095,8 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset The copied physical slot starts to reserve WAL from the same LSN as the source slot. temporary is optional. If temporary - is omitted, the same value as the source slot is used. + is omitted, the same value as the source slot is used. Copy of an + invalidated slot is not allowed. @@ -27248,11 +29118,16 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset from the same LSN as the source logical slot. Both temporary and plugin are optional; if they are omitted, the values of the source slot are used. + The failover option of the source logical slot + is not copied and is set to false by default. This + is to avoid the risk of being unable to continue logical replication + after failover to standby where the slot is being synchronized. Copy of + an invalidated slot is not allowed. - + pg_logical_slot_get_changes @@ -27275,11 +29150,15 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset the specified value. Note, however, that the actual number of rows returned may be larger, since this limit is only checked after adding the rows produced when decoding each new transaction commit. + If the specified slot is a logical failover slot then the function will + not return until all physical slots specified in + synchronized_standby_slots + have confirmed WAL receipt. - + pg_logical_slot_peek_changes @@ -27334,7 +29213,7 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset - + pg_replication_slot_advance @@ -27350,7 +29229,11 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset the name of the slot and the actual position that it was advanced to. The updated slot position information is written out at the next checkpoint if any advancing is done. So in the event of a crash, the - slot may return to an earlier position. + slot may return to an earlier position. If the specified slot is a + logical failover slot then the function will not return until all + physical slots specified in + synchronized_standby_slots + have confirmed WAL receipt. @@ -27525,11 +29408,11 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset pg_logical_emit_message - pg_logical_emit_message ( transactional boolean, prefix text, content text ) + pg_logical_emit_message ( transactional boolean, prefix text, content text [, flush boolean DEFAULT false] ) pg_lsn - pg_logical_emit_message ( transactional boolean, prefix text, content bytea ) + pg_logical_emit_message ( transactional boolean, prefix text, content bytea [, flush boolean DEFAULT false] ) pg_lsn @@ -27543,8 +29426,50 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset recognize messages that are interesting for them. The content parameter is the content of the message, given either in text or binary form. + The flush parameter (default set to + false) controls if the message is immediately + flushed to WAL or not. flush has no effect + with transactional, as the message's WAL + record is flushed along with its transaction. + + + + + pg_sync_replication_slots + + pg_sync_replication_slots () + void + + + Synchronize the logical failover replication slots from the primary + server to the standby server. This function can only be executed on the + standby server. Temporary synced slots, if any, cannot be used for + logical decoding and must be dropped after promotion. See + for details. + Note that this function cannot be executed if + + sync_replication_slots is enabled and the slotsync + worker is already running to perform the synchronization of slots. + + + + + If, after executing the function, + + hot_standby_feedback is disabled on + the standby or the physical slot configured in + + primary_slot_name is + removed, then it is possible that the necessary rows of the + synchronized slot will be removed by the VACUUM process on the primary + server, resulting in the synchronized slot becoming invalidated. + + + + + @@ -27608,6 +29533,23 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset + + + + pg_column_toast_chunk_id + + pg_column_toast_chunk_id ( "any" ) + oid + + + Shows the chunk_id of an on-disk + TOASTed value. Returns NULL + if the value is un-TOASTed or not on-disk. See + for more information about + TOAST. + + + @@ -29175,8 +31117,12 @@ CREATE EVENT TRIGGER test_event_trigger_for_drops integer - Returns a code explaining the reason(s) for rewriting. The exact - meaning of the codes is release dependent. + Returns a code explaining the reason(s) for rewriting. The value is + a bitmap built from the following values: 1 + (the table has changed its persistence), 2 + (default value of a column has changed), 4 + (a column has a new data type) and 8 + (the table access method has changed). diff --git a/doc/src/sgml/generate-errcodes-table.pl b/doc/src/sgml/generate-errcodes-table.pl index 51f22bde95865..dd87aee948397 100644 --- a/doc/src/sgml/generate-errcodes-table.pl +++ b/doc/src/sgml/generate-errcodes-table.pl @@ -1,10 +1,10 @@ #!/usr/bin/perl # # Generate the errcodes-table.sgml file from errcodes.txt -# Copyright (c) 2000-2023, PostgreSQL Global Development Group +# Copyright (c) 2000-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; print "\n"; diff --git a/doc/src/sgml/generate-keywords-table.pl b/doc/src/sgml/generate-keywords-table.pl index ee44edaa6c44d..891d7811a866c 100644 --- a/doc/src/sgml/generate-keywords-table.pl +++ b/doc/src/sgml/generate-keywords-table.pl @@ -2,10 +2,10 @@ # # Generate the keywords table for the documentation's SQL Key Words appendix # -# Copyright (c) 2019-2023, PostgreSQL Global Development Group +# Copyright (c) 2019-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; my @sql_versions = reverse sort ('1992', '2016', '2023'); diff --git a/doc/src/sgml/generate-targets-meson.pl b/doc/src/sgml/generate-targets-meson.pl new file mode 100644 index 0000000000000..62823b46bef84 --- /dev/null +++ b/doc/src/sgml/generate-targets-meson.pl @@ -0,0 +1,63 @@ +#!/usr/bin/perl +# +# Generate the targets-meson.sgml file from targets-meson.txt +# Copyright (c) 2000-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; + +my $targets_meson_file = $ARGV[0]; +open my $targets_meson, '<', $targets_meson_file or die; + +print + "\n"; + +# Find the start of each group of targets +while (<$targets_meson>) +{ + next if /^#/; + + if (/^(.*) Targets:$/) + { + my $targets = $1; + my $targets_id = lc $targets; + + print qq( + + $targets Targets + + +); + + # Each target in the group + while (<$targets_meson>) + { + next if /^#/; + last if !/^\s+([^ ]+)\s+(.+)/; + + my $target = $1; + my $desc = $2; + my $target_id = $1; + + $target_id =~ s/\//-/g; + + print qq( + + + + + ${desc} + + + +); + } + + print qq( + + +); + } +} + +close $targets_meson; diff --git a/doc/src/sgml/generic-wal.sgml b/doc/src/sgml/generic-wal.sgml index a028856d2eb5a..41f97ad7dc846 100644 --- a/doc/src/sgml/generic-wal.sgml +++ b/doc/src/sgml/generic-wal.sgml @@ -1,20 +1,12 @@ - + Generic WAL Records Although all built-in WAL-logged modules have their own types of WAL records, there is also a generic WAL record type, which describes changes - to pages in a generic way. This is useful for extensions that provide - custom access methods. - - - - In comparison with Custom WAL Resource - Managers, Generic WAL is simpler for an extension to implement and - does not require the extension library to be loaded in order to apply the - records. + to pages in a generic way. @@ -171,4 +163,4 @@
- + diff --git a/doc/src/sgml/gin.sgml b/doc/src/sgml/gin.sgml index d68d12d515c27..46e87e01324dd 100644 --- a/doc/src/sgml/gin.sgml +++ b/doc/src/sgml/gin.sgml @@ -1,6 +1,6 @@ - + GIN Indexes @@ -8,7 +8,7 @@ GIN - + Introduction @@ -60,9 +60,9 @@ information about GIN on their website. - + - + Built-in Operator Classes @@ -126,12 +126,9 @@ @@ (jsonb,jsonpath) - tsvector_ops + tsvector_ops @@ (tsvector,tsquery) - - @@@ (tsvector,tsquery) - @@ -143,9 +140,9 @@ See for details. - + - + Extensibility @@ -461,9 +458,9 @@ though the actual type might be something else depending on the operator. - + - + Implementation @@ -500,7 +497,7 @@ - + GIN Fast Update Technique @@ -538,9 +535,9 @@ GIN index. See for details. - + - + Partial Match Algorithm @@ -557,11 +554,11 @@ to be searched, or greater than zero if the index key is past the range that could match. - + - + - + GIN Tips and Tricks @@ -656,9 +653,9 @@ - + - + Limitations @@ -670,9 +667,9 @@ however that null key values contained within a non-null composite item or query value are supported. - + - + Examples @@ -712,6 +709,6 @@ - + - + diff --git a/doc/src/sgml/gist.sgml b/doc/src/sgml/gist.sgml index 9ac6b03e6e452..39c7bf370d67b 100644 --- a/doc/src/sgml/gist.sgml +++ b/doc/src/sgml/gist.sgml @@ -1,6 +1,6 @@ - + GiST Indexes @@ -8,7 +8,7 @@ GiST - + Introduction @@ -38,9 +38,9 @@ web site. - + - + Built-in Operator Classes @@ -66,9 +66,9 @@ - box_ops + box_ops << (box, box) - <-> (box, point) + <-> (box, point) &< (box, box) && (box, box) @@ -81,13 +81,11 @@ <<| (box, box) |>> (box, box) |&> (box, box) - ~ (box, box) - @ (box, box) - circle_ops + circle_ops << (circle, circle) - <-> (circle, point) + <-> (circle, point) &< (circle, circle) &> (circle, circle) @@ -100,8 +98,6 @@ <<| (circle, circle) &<| (circle, circle) |&> (circle, circle) - @ (circle, circle) - ~ (circle, circle) inet_ops @@ -156,9 +152,9 @@ <@ (point, circle) - poly_ops + poly_ops << (polygon, polygon) - <-> (polygon, point) + <-> (polygon, point) &< (polygon, polygon) &> (polygon, polygon) @@ -171,8 +167,6 @@ &<| (polygon, polygon) |&> (polygon, polygon) |>> (polygon, polygon) - @ (polygon, polygon) - ~ (polygon, polygon) range_ops @@ -222,9 +216,9 @@ CREATE INDEX ON my_table USING GIST (my_inet_column inet_ops); - + - + Extensibility @@ -1185,12 +1179,12 @@ my_sortsupport(PG_FUNCTION_ARGS) will accumulate for the duration of the operation. - + - + Implementation - + GiST Index Build Methods @@ -1239,10 +1233,10 @@ my_sortsupport(PG_FUNCTION_ARGS) is ordered. - - + + - + Examples @@ -1307,6 +1301,6 @@ my_sortsupport(PG_FUNCTION_ARGS) - + - + diff --git a/doc/src/sgml/glossary.sgml b/doc/src/sgml/glossary.sgml index fe8def41d0482..7e053cf205a11 100644 --- a/doc/src/sgml/glossary.sgml +++ b/doc/src/sgml/glossary.sgml @@ -39,6 +39,21 @@ + + Access Method + + + Interfaces which PostgreSQL use in order to + access data in tables and indexes. This abstraction allows for adding + support for new types of data storage. + + + For more information, see and + . + + + + Analytic function @@ -149,6 +164,7 @@ the WAL archiver, the WAL receiver (but not the WAL senders), + the WAL summarizer, and the WAL writer. @@ -247,7 +263,8 @@ This role also behaves as a normal - database superuser. + database superuser, + and its superuser status cannot be removed. @@ -834,6 +851,11 @@ + + GMT + + + Grant @@ -893,6 +915,28 @@ + + Incremental backup + + + A special base backup + that for some files may contain only those pages that were modified since + a previous backup, as opposed to the full contents of every file. Like + base backups, it is generated by the tool . + + + To restore incremental backups the tool + is used, which combines incremental backups with a base backup. + Afterwards, recovery can use + WAL to bring the + database cluster to + a consistent state. + + + For more information, see . + + + Insert @@ -1097,8 +1141,8 @@ (just like a view), but stores data in the same way that a table does. It cannot be - modified via INSERT, UPDATE, or - DELETE operations. + modified via INSERT, UPDATE, + DELETE, or MERGE operations. For more information, see @@ -1107,6 +1151,23 @@ + + Merge + + + An SQL command used to conditionally add, modify, + or remove rows + in a given table, + using data from a source + relation. + + + For more information, see + . + + + + Multi-version concurrency control (MVCC) @@ -1387,9 +1448,9 @@ to a client upon the completion of an SQL command, usually a SELECT but it can be an - INSERT, UPDATE, or - DELETE command if the RETURNING - clause is specified. + INSERT, UPDATE, + DELETE, or MERGE command if the + RETURNING clause is specified. The fact that a result set is a relation means that a query can be used @@ -1981,6 +2042,17 @@ + + UTC + + + Universal Coordinated Time, the primary global time reference, + approximately the time prevailing at the zero meridian of longitude. + Often but inaccurately referred to as GMT (Greenwich Mean Time). + + + + Vacuum @@ -2140,11 +2212,26 @@ + + WAL summarizer (process) + + + An auxiliary process + that summarizes WAL data for + incremental backups. + + + For more information, see . + + + + WAL writer (process) - A process that writes WAL records + An auxiliary process + that writes WAL records from shared memory to WAL files. diff --git a/doc/src/sgml/hash.sgml b/doc/src/sgml/hash.sgml index e35911ebf8eb4..9e69ef91fe834 100644 --- a/doc/src/sgml/hash.sgml +++ b/doc/src/sgml/hash.sgml @@ -1,6 +1,6 @@ - + Hash Indexes @@ -8,7 +8,7 @@ Hash - + Overview @@ -108,9 +108,9 @@ with rapidly increasing number of rows. - + - + Implementation @@ -157,6 +157,6 @@ successfully. - + - + diff --git a/doc/src/sgml/high-availability.sgml b/doc/src/sgml/high-availability.sgml index 5f9257313a237..acf3ac0601d23 100644 --- a/doc/src/sgml/high-availability.sgml +++ b/doc/src/sgml/high-availability.sgml @@ -648,7 +648,7 @@ protocol to make nodes agree on a serializable transactional order. later disconnected, the standby goes back to step 1 and tries to restore the file from the archive again. This loop of retries from the archive, pg_wal, and via streaming replication goes on until the server - is stopped or failover is triggered by a trigger file. + is stopped or is promoted. @@ -924,7 +924,8 @@ primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass' streaming replication - Replication slots provide an automated way to ensure that the primary does + Replication slots provide an automated way to ensure that the + primary server does not remove WAL segments until they have been received by all standbys, and that the primary does not remove rows which could cause a recovery conflict even when the @@ -935,21 +936,28 @@ primary_conninfo = 'host=192.168.1.50 port=5432 user=foo password=foopass' of old WAL segments using , or by storing the segments in an archive using or . - However, these methods often result in retaining more WAL segments than + A disadvantage of these methods is that they + often result in retaining more WAL segments than required, whereas replication slots retain only the number of segments - known to be needed. On the other hand, replication slots can retain so - many WAL segments that they fill up the space allocated - for pg_wal; - limits the size of WAL files - retained by replication slots. + known to be needed. Similarly, on its own, without also using a replication slot, provides protection against relevant rows being removed by vacuum, but provides no protection during any time period - when the standby is not connected. Replication slots overcome these - disadvantages. + when the standby is not connected. + + + + Beware that replication slots can cause the server to retain so + many WAL segments that they fill up the space allocated for + pg_wal. + can be used to limit the size + of WAL files retained by replication slots. + + + Querying and Manipulating Replication Slots @@ -1294,7 +1302,7 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)' synchronous_commit is set to on, remote_apply or remote_write will wait for responses from. Such transaction commits may never be completed - if any one of synchronous standbys should crash. + if any one of the synchronous standbys should crash. @@ -1359,8 +1367,8 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)' If you need to re-create a standby server while transactions are - waiting, make sure that the commands pg_backup_start() and - pg_backup_stop() are run in a session with + waiting, make sure that the functions pg_backup_start() + and pg_backup_stop() are run in a session with synchronous_commit = off, otherwise those requests will wait forever for the standby to appear. @@ -1479,6 +1487,15 @@ synchronous_standby_names = 'ANY 2 (s1, s2, s3)' Written administration procedures are advised. + + If you have opted for logical replication slot synchronization (see + ), + then before switching to the standby server, it is recommended to check + if the logical slots synchronized on the standby server are ready + for failover. This can be done by following the steps described in + . + + To trigger failover of a log-shipping standby server, run pg_ctl promote or call pg_promote(). @@ -2219,10 +2236,11 @@ HINT: You can then restart the server after making the necessary configuration The cumulative statistics system is active during recovery. All scans, reads, blocks, index usage, etc., will be recorded normally on the standby. However, WAL replay will not increment relation and database - specific counters. I.e. replay will not increment pg_stat_all_tables - columns (like n_tup_ins), nor will reads or writes performed by the - startup process be tracked in the pg_statio views, nor will associated - pg_stat_database columns be incremented. + specific counters. I.e. replay will not increment + pg_stat_all_tables columns (like n_tup_ins), + nor will reads or writes performed by the startup process be tracked in the + pg_statio_ views, nor will associated + pg_stat_database columns be incremented. diff --git a/doc/src/sgml/history.sgml b/doc/src/sgml/history.sgml index 19bea5390b94e..070cfb8c94bec 100644 --- a/doc/src/sgml/history.sgml +++ b/doc/src/sgml/history.sgml @@ -69,9 +69,8 @@ url="https://www.ibm.com/">IBM) picked up the code and commercialized it. In late 1992, POSTGRES became the primary data manager - for the - - Sequoia 2000 scientific computing project. + for the Sequoia 2000 scientific computing project described in + . @@ -198,11 +197,10 @@ - Many people continue to refer to - PostgreSQL as Postgres - (now rarely in all capital letters) because of tradition or because - it is easier to pronounce. This usage is widely accepted as a - nickname or alias. + Postgres is still considered an official + project name, both because of tradition and because people find it + easier to pronounce Postgres than + PostgreSQL. diff --git a/doc/src/sgml/indexam.sgml b/doc/src/sgml/indexam.sgml index e813e2b620afb..e3c1539a1e3bc 100644 --- a/doc/src/sgml/indexam.sgml +++ b/doc/src/sgml/indexam.sgml @@ -123,6 +123,8 @@ typedef struct IndexAmRoutine bool ampredlocks; /* does AM support parallel scan? */ bool amcanparallel; + /* does AM support parallel build? */ + bool amcanbuildparallel; /* does AM support columns included with clause INCLUDE? */ bool amcaninclude; /* does AM use maintenance_work_mem? */ @@ -139,6 +141,7 @@ typedef struct IndexAmRoutine ambuild_function ambuild; ambuildempty_function ambuildempty; aminsert_function aminsert; + aminsertcleanup_function aminsertcleanup; ambulkdelete_function ambulkdelete; amvacuumcleanup_function amvacuumcleanup; amcanreturn_function amcanreturn; /* can be NULL */ @@ -212,7 +215,7 @@ typedef struct IndexAmRoutine the first; however they are permitted to require some restriction to appear for the first index column, and this is signaled by setting amoptionalkey false. - One reason that an index AM might set + One reason that an index AM might set amoptionalkey false is if it doesn't index null values. Since most indexable operators are strict and hence cannot return true for null inputs, @@ -285,6 +288,11 @@ ambuild (Relation heapRelation, and compute the keys that need to be inserted into the index. The function must return a palloc'd struct containing statistics about the new index. + The amcanbuildparallel flag indicates whether + the access method supports parallel index builds. When set to true, + the system will attempt to allocate parallel workers for the build. + Access methods supporting only non-parallel index builds should leave + this flag set to false. @@ -332,9 +340,13 @@ aminsert (Relation indexRelation, modify any columns covered by the index, but nevertheless requires a new version in the index. The index AM may use this hint to decide to apply bottom-up index deletion in parts of the index where many - versions of the same logical row accumulate. Note that updating a - non-key column does not affect the value of - indexUnchanged. + versions of the same logical row accumulate. Note that updating a non-key + column or a column that only appears in a partial index predicate does not + affect the value of indexUnchanged. The core code + determines each tuple's indexUnchanged value using a low + overhead approach that allows both false positives and false negatives. + Index AMs must not treat indexUnchanged as an + authoritative source of information about tuple visibility or versioning. @@ -355,7 +367,21 @@ aminsert (Relation indexRelation, within an SQL statement, it can allocate space in indexInfo->ii_Context and store a pointer to the data in indexInfo->ii_AmCache (which will be NULL - initially). + initially). If resources other than memory have to be released after + index insertions, aminsertcleanup may be provided, + which will be called before the memory is released. + + + + +void +aminsertcleanup (Relation indexRelation, + IndexInfo *indexInfo); + + Clean up state that was maintained across successive inserts in + indexInfo->ii_AmCache. This is useful if the data + requires additional cleanup steps (e.g., releasing pinned buffers), and + simply releasing the memory is not sufficient. @@ -783,7 +809,8 @@ amrestrpos (IndexScanDesc scan); Size -amestimateparallelscan (void); +amestimateparallelscan (int nkeys, + int norderbys); Estimate and return the number of bytes of dynamic shared memory which the access method will be needed to perform a parallel scan. (This number @@ -791,6 +818,13 @@ amestimateparallelscan (void); AM-independent data in ParallelIndexScanDescData.) + + The nkeys and norderbys + parameters indicate the number of quals and ordering operators that will be + used in the scan; the same values will be passed to amrescan. + Note that the actual values of the scan keys aren't provided yet. + + It is not necessary to implement this function for access methods which do not support parallel scans or for which the number of additional bytes diff --git a/doc/src/sgml/indextypes.sgml b/doc/src/sgml/indextypes.sgml new file mode 100644 index 0000000000000..94a2b01afcc73 --- /dev/null +++ b/doc/src/sgml/indextypes.sgml @@ -0,0 +1,13 @@ + + + +Built-in Index Access Methods + +&btree; +&gist; +&spgist; +&gin; +&brin; +&hash; + + diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml index 55122129d586b..6d731e0701fdd 100644 --- a/doc/src/sgml/indices.sgml +++ b/doc/src/sgml/indices.sgml @@ -90,6 +90,39 @@ CREATE INDEX test1_id_index ON test1 (id); also significantly speed up queries with joins. + + In general, PostgreSQL indexes can be used + to optimize queries that contain one or more WHERE + or JOIN clauses of the form + + +indexed-column indexable-operator comparison-value + + + Here, the indexed-column is whatever + column or expression the index has been defined on. + The indexable-operator is an operator that + is a member of the index's operator class for + the indexed column. (More details about that appear below.) + And the comparison-value can be any + expression that is not volatile and does not reference the index's + table. + + + + In some cases the query planner can extract an indexable clause of + this form from another SQL construct. A simple example is that if + the original clause was + + +comparison-value operator indexed-column + + + then it can be flipped around into indexable form if the + original operator has a commutator + operator that is a member of the index's operator class. + + Creating an index on a large table can take a long time. By default, PostgreSQL allows reads (SELECT statements) to occur @@ -120,7 +153,7 @@ CREATE INDEX test1_id_index ON test1 (id); B-tree, Hash, GiST, SP-GiST, GIN, BRIN, and the extension bloom. Each index type uses a different - algorithm that is best suited to different types of queries. + algorithm that is best suited to different types of indexable clauses. By default, the CREATE INDEX command creates B-tree indexes, which fit the most common situations. @@ -754,7 +787,7 @@ CREATE INDEX people_names ON people ((first_name || ' ' || last_name)); Index expressions are relatively expensive to maintain, because the derived expression(s) must be computed for each row insertion - and non-HOT update. However, the index expressions are + and non-HOT update. However, the index expressions are not recomputed during an indexed search, since they are already stored in the index. In both examples above, the system sees the query as just WHERE indexedcolumn = 'constant' diff --git a/doc/src/sgml/information_schema.sgml b/doc/src/sgml/information_schema.sgml index 350c75bc31ef8..9442b0718c094 100644 --- a/doc/src/sgml/information_schema.sgml +++ b/doc/src/sgml/information_schema.sgml @@ -639,8 +639,8 @@ dtd_identifier sql_identifier - An identifier of the data type descriptor of the column, unique - among the data type descriptors pertaining to the table. This + An identifier of the data type descriptor of the attribute, unique + among the data type descriptors pertaining to the composite type. This is mainly useful for joining with other instances of such identifiers. (The specific format of the identifier is not defined and not guaranteed to remain the same in future @@ -697,8 +697,8 @@ An encoding of some character repertoire. Most older character repertoires only use one encoding form, and so there are no - separate names for them (e.g., LATIN1 is an - encoding form applicable to the LATIN1 + separate names for them (e.g., LATIN2 is an + encoding form applicable to the LATIN2 repertoire). But for example Unicode has the encoding forms UTF8, UTF16, etc. (not all supported by PostgreSQL). Encoding forms are not exposed @@ -917,6 +917,13 @@ domain is the owner of the constraint.) + + The SQL standard considers not-null constraints to be check constraints + with a CHECK (column_name IS NOT + NULL) expression. So not-null constraints are also included here + and don't have a separate view. + + <structname>check_constraints</structname> Columns @@ -2116,7 +2123,9 @@ columns in the current database that are used by some constraint. Only those columns are shown that are contained in a table owned by a currently enabled role. For a check constraint, this view - identifies the columns that are used in the check expression. For + identifies the columns that are used in the check expression. For a + not-null constraint, this view identifies the column that the constraint is + defined on. For a foreign key constraint, this view identifies the columns that the foreign key references. For a unique or primary key constraint, this view identifies the constrained columns. @@ -3134,15 +3143,6 @@ ORDER BY c.ordinal_position; - - - domain_default character_data - - - Not yet implemented - - - udt_catalog sql_identifier @@ -4846,9 +4846,11 @@ ORDER BY c.ordinal_position; <literal>routine_column_usage</literal> - The view routine_column_usage is meant to identify all - columns that are used by a function or procedure. This information is - currently not tracked by PostgreSQL. + The view routine_column_usage identifies all columns + that are used by a function or procedure, either in the SQL body or in + parameter default expressions. (This only works for unquoted SQL bodies, + not quoted bodies or functions in other languages.) A column is only + included if its table is owned by a currently enabled role.
@@ -5085,12 +5087,12 @@ ORDER BY c.ordinal_position; <literal>routine_routine_usage</literal> - The view routine_routine_usage is meant to identify all - functions or procedures that are used by another (or the same) function or - procedure, either in the body or in parameter default expressions. - Currently, only functions used in parameter default expressions are - tracked. An entry is included here only if the used function is owned by a - currently enabled role. (There is no such restriction on the using + The view routine_routine_usage identifies all functions + or procedures that are used by another (or the same) function or procedure, + either in the SQL body or in parameter default expressions. (This only + works for unquoted SQL bodies, not quoted bodies or functions in other + languages.) An entry is included here only if the used function is owned + by a currently enabled role. (There is no such restriction on the using function.) @@ -5184,11 +5186,11 @@ ORDER BY c.ordinal_position; <literal>routine_sequence_usage</literal> - The view routine_sequence_usage is meant to identify all - sequences that are used by a function or procedure, either in the body or - in parameter default expressions. Currently, only sequences used in - parameter default expressions are tracked. A sequence is only included if - that sequence is owned by a currently enabled role. + The view routine_sequence_usage identifies all sequences + that are used by a function or procedure, either in the SQL body or in + parameter default expressions. (This only works for unquoted SQL bodies, + not quoted bodies or functions in other languages.) A sequence is only + included if that sequence is owned by a currently enabled role.
@@ -6865,7 +6867,7 @@ ORDER BY c.ordinal_position; constraint_typecharacter_data - Type of the constraint: CHECK, + Type of the constraint: CHECK (includes not-null constraints), FOREIGN KEY, PRIMARY KEY, or UNIQUE diff --git a/doc/src/sgml/install-windows.sgml b/doc/src/sgml/install-windows.sgml deleted file mode 100644 index 379a2ea80bae2..0000000000000 --- a/doc/src/sgml/install-windows.sgml +++ /dev/null @@ -1,581 +0,0 @@ - - - - Installation from Source Code on <productname>Windows</productname> - - - installation - on Windows - - - - It is recommended that most users download the binary distribution for - Windows, available as a graphical installer package - from the PostgreSQL website at - . Building from source - is only intended for people developing PostgreSQL - or extensions. - - - - There are several different ways of building PostgreSQL on - Windows. The simplest way to build with - Microsoft tools is to install Visual Studio 2022 - and use the included compiler. It is also possible to build with the full - Microsoft Visual C++ 2015 to 2022. - In some cases that requires the installation of the - Windows SDK in addition to the compiler. - - - - It is also possible to build PostgreSQL using the GNU compiler tools - provided by MinGW, or using - Cygwin for older versions of - Windows. - - - - Building using MinGW or - Cygwin uses the normal build system, see - and the specific notes in - and . - To produce native 64 bit binaries in these environments, use the tools from - MinGW-w64. These tools can also be used to - cross-compile for 32 bit and 64 bit Windows - targets on other hosts, such as Linux and - macOS. - Cygwin is not recommended for running a - production server, and it should only be used for running on - older versions of Windows where - the native build does not work. The official - binaries are built using Visual Studio. - - - - Native builds of psql don't support command - line editing. The Cygwin build does support - command line editing, so it should be used where psql is needed for - interactive use on Windows. - - - - Building with <productname>Visual C++</productname> or the - <productname>Microsoft Windows SDK</productname> - - - PostgreSQL can be built using the Visual C++ compiler suite from Microsoft. - These compilers can be either from Visual Studio, - Visual Studio Express or some versions of the - Microsoft Windows SDK. If you do not already have a - Visual Studio environment set up, the easiest - ways are to use the compilers from - Visual Studio 2022 or those in the - Windows SDK 10, which are both free downloads - from Microsoft. - - - - Both 32-bit and 64-bit builds are possible with the Microsoft Compiler suite. - 32-bit PostgreSQL builds are possible with - Visual Studio 2015 to - Visual Studio 2022, - as well as standalone Windows SDK releases 10 and above. - 64-bit PostgreSQL builds are supported with - Microsoft Windows SDK version 10 and above or - Visual Studio 2015 and above. - - - - - The tools for building using Visual C++ or - Platform SDK are in the - src\tools\msvc directory. When building, make sure - there are no tools from MinGW or - Cygwin present in your system PATH. Also, make - sure you have all the required Visual C++ tools available in the PATH. In - Visual Studio, start the - Visual Studio Command Prompt. - If you wish to build a 64-bit version, you must use the 64-bit version of - the command, and vice versa. - Starting with Visual Studio 2017 this can be - done from the command line using VsDevCmd.bat, see - -help for the available options and their default values. - vsvars32.bat is available in - Visual Studio 2015 and earlier versions for the - same purpose. - From the Visual Studio Command Prompt, you can - change the targeted CPU architecture, build type, and target OS by using the - vcvarsall.bat command, e.g., - vcvarsall.bat x64 10.0.10240.0 to target Windows 10 - with a 64-bit release build. See -help for the other - options of vcvarsall.bat. All commands should be run from - the src\tools\msvc directory. - - - - Before you build, you can create the file config.pl - to reflect any configuration options you want to change, or the paths to - any third party libraries to use. The complete configuration is determined - by first reading and parsing the file config_default.pl, - and then apply any changes from config.pl. For example, - to specify the location of your Python installation, - put the following in config.pl: - -$config->{python} = 'c:\python310'; - - You only need to specify those parameters that are different from what's in - config_default.pl. - - - - If you need to set any other environment variables, create a file called - buildenv.pl and put the required commands there. For - example, to add the path for bison when it's not in the PATH, create a file - containing: - -$ENV{PATH}=$ENV{PATH} . ';c:\some\where\bison\bin'; - - - - - To pass additional command line arguments to the Visual Studio build - command (msbuild or vcbuild): - -$ENV{MSBFLAGS}="/m"; - - - - - Requirements - - The following additional products are required to build - PostgreSQL. Use the - config.pl file to specify which directories the libraries - are available in. - - - - Microsoft Windows SDK - - If your build environment doesn't ship with a supported version of the - Microsoft Windows SDK it - is recommended that you upgrade to the latest version (currently - version 10), available for download from - . - - - You must always include the - Windows Headers and Libraries part of the SDK. - If you install a Windows SDK - including the Visual C++ Compilers, - you don't need Visual Studio to build. - Note that as of Version 8.0a the Windows SDK no longer ships with a - complete command-line build environment. - - - - - ActiveState Perl - - ActiveState Perl is required to run the build generation scripts. MinGW - or Cygwin Perl will not work. It must also be present in the PATH. - Binaries can be downloaded from - - (Note: version 5.14 or later is required, - the free Standard Distribution is sufficient). - - - - - - - The following additional products are not required to get started, - but are required to build the complete package. Use the - config.pl file to specify which directories the libraries - are available in. - - - - ActiveState TCL - - Required for building PL/Tcl (Note: version - 8.4 is required, the free Standard Distribution is sufficient). - - - - - Bison and - Flex - - - Bison and Flex are - required to build from Git, but not required when building from a release - file. Only Bison versions 2.3 and later - will work. Flex must be version 2.5.35 or later. - - - - Both Bison and Flex - are included in the msys tool suite, available - from as part of the - MinGW compiler suite. - - - - You will need to add the directory containing - flex.exe and bison.exe to the - PATH environment variable in buildenv.pl unless - they are already in PATH. In the case of MinGW, the directory is the - \msys\1.0\bin subdirectory of your MinGW - installation directory. - - - - - The Bison distribution from GnuWin32 appears to have a bug that - causes Bison to malfunction when installed in a directory with - spaces in the name, such as the default location on English - installations C:\Program Files\GnuWin32. - Consider installing into C:\GnuWin32 or use the - NTFS short name path to GnuWin32 in your PATH environment setting - (e.g., C:\PROGRA~1\GnuWin32). - - - - - - - - Diff - - Diff is required to run the regression tests, and can be downloaded - from . - - - - - Gettext - - Gettext is required to build with NLS support, and can be downloaded - from . Note that binaries, - dependencies and developer files are all needed. - - - - - MIT Kerberos - - Required for GSSAPI authentication support. MIT Kerberos can be - downloaded from - . - - - - - libxml2 and - libxslt - - Required for XML support. Binaries can be downloaded from - or source from - . Note that libxml2 requires iconv, - which is available from the same download location. - - - - - LZ4 - - Required for supporting LZ4 compression. - Binaries and source can be downloaded from - . - - - - - Zstandard - - Required for supporting Zstandard compression. - Binaries and source can be downloaded from - . - - - - - OpenSSL - - Required for SSL support. Binaries can be downloaded from - - or source from . - - - - - ossp-uuid - - Required for UUID-OSSP support (contrib only). Source can be - downloaded from - . - - - - - Python - - Required for building PL/Python. Binaries can - be downloaded from . - - - - - zlib - - Required for compression support in pg_dump - and pg_restore. Binaries can be downloaded - from . - - - - - - - - - Special Considerations for 64-Bit Windows - - - PostgreSQL will only build for the x64 architecture on 64-bit Windows. - - - - Mixing 32- and 64-bit versions in the same build tree is not supported. - The build system will automatically detect if it's running in a 32- or - 64-bit environment, and build PostgreSQL accordingly. For this reason, it - is important to start the correct command prompt before building. - - - - To use a server-side third party library such as Python or - OpenSSL, this library must also be - 64-bit. There is no support for loading a 32-bit library in a 64-bit - server. Several of the third party libraries that PostgreSQL supports may - only be available in 32-bit versions, in which case they cannot be used with - 64-bit PostgreSQL. - - - - - Building - - - To build all of PostgreSQL in release configuration (the default), run the - command: - -build - - To build all of PostgreSQL in debug configuration, run the command: - -build DEBUG - - To build just a single project, for example psql, run the commands: - -build psql -build DEBUG psql - - To change the default build configuration to debug, put the following - in the buildenv.pl file: - -$ENV{CONFIG}="Debug"; - - - - - It is also possible to build from inside the Visual Studio GUI. In this - case, you need to run: - -perl mkvcbuild.pl - - from the command prompt, and then open the generated - pgsql.sln (in the root directory of the source tree) - in Visual Studio. - - - - - Cleaning and Installing - - - Most of the time, the automatic dependency tracking in Visual Studio will - handle changed files. But if there have been large changes, you may need - to clean the installation. To do this, simply run the - clean.bat command, which will automatically clean out - all generated files. You can also run it with the - dist parameter, in which case it will behave like - make distclean and remove the flex/bison output files - as well. - - - - By default, all files are written into a subdirectory of the - debug or release directories. To - install these files using the standard layout, and also generate the files - required to initialize and use the database, run the command: - -install c:\destination\directory - - - - - If you want to install only the client applications and - interface libraries, then you can use these commands: - -install c:\destination\directory client - - - - - - Running the Regression Tests - - - To run the regression tests, make sure you have completed the build of all - required parts first. Also, make sure that the DLLs required to load all - parts of the system (such as the Perl and Python DLLs for the procedural - languages) are present in the system path. If they are not, set it through - the buildenv.pl file. To run the tests, run one of - the following commands from the src\tools\msvc - directory: - -vcregress check -vcregress installcheck -vcregress plcheck -vcregress contribcheck -vcregress modulescheck -vcregress ecpgcheck -vcregress isolationcheck -vcregress bincheck -vcregress recoverycheck - - - To change the schedule used (default is parallel), append it to the - command line like: - -vcregress check serial - - - For more information about the regression tests, see - . - - - - Running the regression tests on client programs, with - vcregress bincheck, or on recovery tests, with - vcregress recoverycheck, requires an additional Perl module - to be installed: - - - IPC::Run - - As of this writing, IPC::Run is not included in the - ActiveState Perl installation, nor in the ActiveState Perl Package - Manager (PPM) library. To install, download the - IPC-Run-<version>.tar.gz source archive from - CPAN, - at , and - uncompress. Edit the buildenv.pl file, and add a PERL5LIB - variable to point to the lib subdirectory from the - extracted archive. For example: - -$ENV{PERL5LIB}=$ENV{PERL5LIB} . ';c:\IPC-Run-0.94\lib'; - - - - - - - - The TAP tests run with vcregress support the - environment variables PROVE_TESTS, that is expanded - automatically using the name patterns given, and - PROVE_FLAGS. These can be set on a Windows terminal, - before running vcregress: - -set PROVE_FLAGS=--timer --jobs 2 -set PROVE_TESTS=t/020*.pl t/010*.pl - - It is also possible to set up those parameters in - buildenv.pl: - -$ENV{PROVE_FLAGS}='--timer --jobs 2' -$ENV{PROVE_TESTS}='t/020*.pl t/010*.pl' - - - - - Additionally, the behavior of TAP tests can be controlled by a set of - environment variables, see . - - - - Some of the TAP tests depend on a set of external commands that would - optionally trigger tests related to them. Each one of those variables - can be set or unset in buildenv.pl: - - - GZIP_PROGRAM - - Path to a gzip command. The default is - gzip, which will search for a command by that - name in the configured PATH. - - - - - LZ4 - - Path to a lz4 command. The default is - lz4, which will search for a command by that - name in the configured PATH. - - - - - OPENSSL - - Path to an openssl command. The default is - openssl, which will search for a command by that - name in the configured PATH. - - - - - TAR - - Path to a tar command. The default is - tar, which will search for a command by that - name in the configured PATH. - - - - - ZSTD - - Path to a zstd command. The default is - zstd, which will search for a command by that - name in the configured PATH. - - - - - - - - diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index 75dc81a0a9e25..ba5c07685716a 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -1,12 +1,4 @@ - Installation from Source Code @@ -15,7 +7,6 @@ documentation. See standalone-profile.xsl for details. installation - This chapter describes the installation of PostgreSQL using the source code @@ -24,13 +15,6 @@ documentation. See standalone-profile.xsl for details. and see instead. - - If you are building PostgreSQL for Microsoft - Windows, read this chapter if you intend to build with MinGW or Cygwin; - but if you intend to build with Microsoft's Visual - C++, see instead. - - Requirements @@ -72,8 +56,7 @@ documentation. See standalone-profile.xsl for details. Alternatively, PostgreSQL can be built using Meson. This is currently - experimental and only works when building from a Git checkout (not from - a distribution tarball). If you choose to use + experimental. If you choose to use Meson, then you don't need GNU make, but the other requirements below still apply. @@ -102,6 +85,41 @@ documentation. See standalone-profile.xsl for details. + + + + flex + + + lex + + + bison + + + yacc + + + Flex 2.5.35 or later and + Bison 2.3 or later are required. Other + lex and yacc + programs cannot be used. + + + + + + + perl + + + Perl 5.14 or later is needed during the build + process and to run some test suites. (This requirement is separate from + the requirements for building PL/Perl; see + below.) + + + @@ -149,7 +167,7 @@ documentation. See standalone-profile.xsl for details. - The ICU locale provider (see ) is used by default. If you don't want to use it then you must specify the option to configure. Using this option disables support for ICU collation features (see ). + The ICU library is used by default. If you don't want to use it then you must specify the option to configure. Using this option disables support for ICU collation features (see ). ICU support requires the ICU4C package to be @@ -275,7 +293,7 @@ documentation. See standalone-profile.xsl for details. encrypted client connections. OpenSSL is also required for random number generation on platforms that do not have /dev/urandom (except Windows). The minimum - required version is 1.0.1. + required version is 1.0.2. @@ -315,51 +333,6 @@ documentation. See standalone-profile.xsl for details. - - If you are building from a Git tree instead of - using a released source package, or if you want to do server development, - you also need the following packages: - - - - - - flex - - - lex - - - bison - - - yacc - - - Flex and Bison - are needed to build from a Git checkout, or if you changed the actual - scanner and parser definition files. If you need them, be sure - to get Flex 2.5.35 or later and - Bison 2.3 or later. Other lex - and yacc programs cannot be used. - - - - - - perl - - - Perl 5.14 or later is needed to build from a Git checkout, - or if you changed the input files for any of the build steps that - use Perl scripts. If building on Windows you will need - Perl in any case. Perl is - also required to run some test suites. - - - - - If you need to get a GNU package, you can find it at your local GNU mirror site (see Build with support for LLVM based - JIT compilation (see ). This + JIT compilation (see ). This requires the LLVM library to be installed. The minimum required version of LLVM is - currently 3.9. + currently 10. llvm-configllvm-config will be used to find the required compilation options. - llvm-config, and then - llvm-config-$major-$minor for all supported - versions, will be searched for in your PATH. If - that would not yield the desired program, - use LLVM_CONFIG to specify a path to the - correct llvm-config. For example + llvm-config will be searched for in your + PATH. If that would not yield the desired program, + use LLVM_CONFIG to specify a path to the correct + llvm-config. For example ./configure ... --with-llvm LLVM_CONFIG='/path/to/llvm/bin/llvm-config' @@ -1103,8 +1072,8 @@ build-postgresql: for systemdsystemd service notifications. This improves integration if the server is started under systemd but has no impact - otherwise; see for more - information. libsystemd and the + otherwise; see for more + information. libsystemd and the associated header files need to be installed to use this option. @@ -1209,6 +1178,16 @@ build-postgresql: + + + + + Build with SElinux support, enabling the + extension. + + + + @@ -1232,9 +1211,8 @@ build-postgresql: Build without support for the ICUICU - library, disabling the use of ICU collation features (see ). + library, disabling the use of ICU collation features (see ). @@ -1306,19 +1284,6 @@ build-postgresql: - - - - - Disable the thread-safety of client libraries. This prevents - concurrent threads in libpq and - ECPG programs from safely controlling - their private connection handles. Use this only on platforms - with deficient threading support. - - - - @@ -1604,7 +1569,7 @@ build-postgresql: Enable tests using the Perl TAP tools. This requires a Perl installation and the Perl module IPC::Run. - See for more information. + See for more information. @@ -1631,8 +1596,8 @@ build-postgresql: code coverage testing instrumentation. When run, they generate files in the build directory with code coverage metrics. - See - for more information. This option is for use only with GCC + See + for more information. This option is for use only with GCC and when doing development work. @@ -1660,8 +1625,7 @@ build-postgresql: Compiles PostgreSQL with support for the dynamic tracing tool DTrace. - See - for more information. + See for more information. @@ -1690,11 +1654,26 @@ build-postgresql: + + + + + Compiles PostgreSQL with support for + injection points in the server. Injection points allow to run + user-defined code from within the server in pre-defined code paths. + This helps in testing and in the investigation of concurrency scenarios + in a controlled fashion. This option is disabled by default. See + for more details. This + option is intended to be used only by developers for testing. + + + + - Specify the segment size in blocks. If both + Specify the relation segment size in blocks. If both and this option are specified, this option wins. @@ -2103,9 +2082,9 @@ ninja configure with the option to select the one you want to use and then build using meson compile. To learn more about these backends and other arguments you can provide to - ninja, you can refer to the meson - documentation. + Meson documentation. @@ -2427,9 +2406,8 @@ ninja install Build with support for the ICUICU - library, enabling use of ICU collation features (see ). Defaults to auto and requires the + library, enabling use of ICU collation features (see ). Defaults to auto and requires the ICU4C package to be installed. The minimum required version of ICU4C is currently 4.2. @@ -2441,11 +2419,10 @@ ninja install Build with support for LLVM based - JIT compilation (see ). + JIT compilation (see ). This requires the LLVM library to be installed. The minimum required version of - LLVM is currently 3.9. Disabled by + LLVM is currently 10. Disabled by default. @@ -2567,8 +2544,8 @@ ninja install systemdsystemd service notifications. This improves integration if the server is started under systemd but has no impact - otherwise; see for more information. Defaults to + otherwise; see for more information. Defaults to auto. libsystemd and the associated header files need to be installed to use this option. @@ -2653,6 +2630,17 @@ ninja install + + + + + + Build with SElinux support, enabling the + extension. Defaults to auto. + + + + @@ -2737,7 +2725,7 @@ ninja install - + Setting this option allows you to override the value of all @@ -2756,8 +2744,8 @@ ninja install The default backend Meson uses is ninja and that should suffice for most use cases. However, if you'd like to fully integrate with Visual - Studio, you can set the to - vs. + Studio, you can set the BACKEND to + vs. @@ -3132,8 +3120,7 @@ ninja install Enable tests using the Perl TAP tools. Defaults to auto and requires a Perl installation and the Perl module IPC::Run. - See for more information. + See for more information. @@ -3157,8 +3144,8 @@ ninja install code coverage testing instrumentation. When run, they generate files in the build directory with code coverage metrics. - See - for more information. This option is for use only with GCC + See + for more information. This option is for use only with GCC and when doing development work. @@ -3173,8 +3160,7 @@ ninja install Enabling this compiles PostgreSQL with support for the dynamic tracing tool DTrace. - See - for more information. + See for more information. @@ -3187,11 +3173,26 @@ ninja install + + + + + Compiles PostgreSQL with support for + injection points in the server. Injection points allow to run + user-defined code from within the server in pre-defined code paths. + This helps in testing and in the investigation of concurrency scenarios + in a controlled fashion. This option is disabled by default. See + for more details. This + option is intended to be used only by developers for testing. + + + + - Specify the segment size in blocks. If both + Specify the relation segment size in blocks. If both and this option are specified, this option wins. @@ -3203,6 +3204,21 @@ ninja install + + + <literal>meson</literal> Build Targets + + + Individual build targets can be built using ninja target. + + When no target is specified, everything except documentation is + built. Individual build products can be built using the path/filename as + target. + + + &targets-meson; + + @@ -3383,7 +3399,7 @@ export MANPATH PostgreSQL can be expected to work on current versions of these operating systems: Linux, Windows, - FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, AIX, Solaris, and illumos. + FreeBSD, OpenBSD, NetBSD, DragonFlyBSD, macOS, Solaris, and illumos. Other Unix-like systems may also work but are not currently being tested. In most cases, all CPU architectures supported by a given operating system will work. Look in @@ -3404,7 +3420,7 @@ export MANPATH Historical versions of PostgreSQL or POSTGRES also ran on CPU architectures including Alpha, Itanium, M32R, M68K, - M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, BEOS, + M88K, NS32K, SuperH, and VAX, and operating systems including 4.3BSD, AIX, BEOS, BSD/OS, DG/UX, Dynix, HP-UX, IRIX, NeXTSTEP, QNX, SCO, SINIX, Sprite, SunOS, Tru64 UNIX, and ULTRIX. @@ -3427,123 +3443,6 @@ export MANPATH installation issues. - - AIX - - - AIX - installation on - - - - You can use GCC or the native IBM compiler xlc - to build PostgreSQL - on AIX. - - - - AIX versions before 7.1 are no longer - tested nor supported by the PostgreSQL - community. - - - - Memory Management - - - - AIX can be somewhat peculiar with regards to the way it does - memory management. You can have a server with many multiples of - gigabytes of RAM free, but still get out of memory or address - space errors when running applications. One example - is loading of extensions failing with unusual errors. - For example, running as the owner of the PostgreSQL installation: - -=# CREATE EXTENSION plperl; -ERROR: could not load library "/opt/dbs/pgsql/lib/plperl.so": A memory address is not in the address space for the process. - - Running as a non-owner in the group possessing the PostgreSQL - installation: - -=# CREATE EXTENSION plperl; -ERROR: could not load library "/opt/dbs/pgsql/lib/plperl.so": Bad address - - Another example is out of memory errors in the PostgreSQL server - logs, with every memory allocation near or greater than 256 MB - failing. - - - - The overall cause of all these problems is the default bittedness - and memory model used by the server process. By default, all - binaries built on AIX are 32-bit. This does not depend upon - hardware type or kernel in use. These 32-bit processes are - limited to 4 GB of memory laid out in 256 MB segments using one - of a few models. The default allows for less than 256 MB in the - heap as it shares a single segment with the stack. - - - - In the case of the plperl example, above, - check your umask and the permissions of the binaries in your - PostgreSQL installation. The binaries involved in that example - were 32-bit and installed as mode 750 instead of 755. Due to the - permissions being set in this fashion, only the owner or a member - of the possessing group can load the library. Since it isn't - world-readable, the loader places the object into the process' - heap instead of the shared library segments where it would - otherwise be placed. - - - - The ideal solution for this is to use a 64-bit - build of PostgreSQL, but that is not always practical, because - systems with 32-bit processors can build, but not run, 64-bit - binaries. - - - - If a 32-bit binary is desired, set LDR_CNTRL to - MAXDATA=0xn0000000, - where 1 <= n <= 8, before starting the PostgreSQL server, - and try different values and postgresql.conf - settings to find a configuration that works satisfactorily. This - use of LDR_CNTRL tells AIX that you want the - server to have MAXDATA bytes set aside for the - heap, allocated in 256 MB segments. When you find a workable - configuration, - ldedit can be used to modify the binaries so - that they default to using the desired heap size. PostgreSQL can - also be rebuilt, passing configure - LDFLAGS="-Wl,-bmaxdata:0xn0000000" - to achieve the same effect. - - - - For a 64-bit build, set OBJECT_MODE to 64 and - pass CC="gcc -maix64" - and LDFLAGS="-Wl,-bbigtoc" - to configure. (Options for - xlc might differ.) If you omit the export of - OBJECT_MODE, your build may fail with linker errors. When - OBJECT_MODE is set, it tells AIX's build utilities - such as ar, as, and ld what - type of objects to default to handling. - - - - By default, overcommit of paging space can happen. While we have - not seen this occur, AIX will kill processes when it runs out of - memory and the overcommit is accessed. The closest to this that - we have seen is fork failing because the system decided that - there was not enough memory for another process. Like many other - parts of AIX, the paging space allocation method and - out-of-memory kill is configurable on a system- or process-wide - basis if this becomes a problem. - - - - Cygwin @@ -3555,8 +3454,7 @@ ERROR: could not load library "/opt/dbs/pgsql/lib/plperl.so": Bad address PostgreSQL can be built using Cygwin, a Linux-like environment for Windows, but that method is inferior to the native Windows build - (see ) and - running a server under Cygwin is no longer recommended. + and running a server under Cygwin is no longer recommended. @@ -3722,7 +3620,7 @@ xcrun --show-sdk-path - MinGW/Native Windows + MinGW MinGW @@ -3731,18 +3629,13 @@ xcrun --show-sdk-path PostgreSQL for Windows can be built using MinGW, a Unix-like build - environment for Microsoft operating systems, or using - Microsoft's Visual C++ compiler suite. + environment for Microsoft operating systems. The MinGW build procedure uses the normal build system described in - this chapter; the Visual C++ build works completely differently - and is described in . + this chapter. - The native Windows port requires a 32 or 64-bit version of Windows - 2000 or later. Earlier operating systems do - not have sufficient infrastructure (but Cygwin may be used on - those). MinGW, the Unix-like build tools, and MSYS, a collection + MinGW, the Unix-like build tools, and MSYS, a collection of Unix tools required to run shell scripts like configure, can be downloaded from . Neither is @@ -3765,8 +3658,8 @@ xcrun --show-sdk-path buffering issues. - - Collecting Crash Dumps on Windows + + Collecting Crash Dumps If PostgreSQL on Windows crashes, it has the ability to generate @@ -3885,6 +3778,292 @@ make: *** [postgres] Error 1 + + + Visual Studio + + + Visual Studio + installation on + + + + It is recommended that most users download the binary distribution for + Windows, available as a graphical installer package from the + PostgreSQL website at + . Building from + source is only intended for people developing + PostgreSQL or extensions. + + + + PostgreSQL for Windows with Visual Studio can be built using Meson, as + described in . + The native Windows port requires a 32 or 64-bit version of Windows + 10 or later. + + + + Native builds of psql don't support command + line editing. The Cygwin build does support + command line editing, so it should be used where psql is needed for + interactive use on Windows. + + + + PostgreSQL can be built using the Visual C++ compiler suite from Microsoft. + These compilers can be either from Visual Studio, + Visual Studio Express or some versions of the + Microsoft Windows SDK. If you do not already have a + Visual Studio environment set up, the easiest + ways are to use the compilers from + Visual Studio 2022 or those in the + Windows SDK 10, which are both free downloads + from Microsoft. + + + + Both 32-bit and 64-bit builds are possible with the Microsoft Compiler suite. + 32-bit PostgreSQL builds are possible with + Visual Studio 2015 to + Visual Studio 2022, + as well as standalone Windows SDK releases 10 and above. + 64-bit PostgreSQL builds are supported with + Microsoft Windows SDK version 10 and above or + Visual Studio 2015 and above. + + + + + If your build environment doesn't ship with a supported version of the + Microsoft Windows SDK it is recommended + that you upgrade to the latest version (currently version 10), available + for download from . + + + + You must always include the + Windows Headers and Libraries part of the SDK. + If you install a Windows SDK + including the Visual C++ Compilers, + you don't need Visual Studio to build. + Note that as of Version 8.0a the Windows SDK no longer ships with a + complete command-line build environment. + + + + Requirements + + The following additional products are required to build + PostgreSQL on Windows. + + + + Strawberry Perl + + Strawberry Perl is required to run the build generation scripts. MinGW + or Cygwin Perl will not work. It must also be present in the PATH. + Binaries can be downloaded from + . + + + + + Bison and + Flex + + + Bison and Flex are + required. Only Bison versions 2.3 and later + will work. Flex must be version 2.5.35 or later. + + + + Both Bison and Flex + are included in the msys tool suite, available + from as part of the + MinGW compiler suite. + + + + You will need to add the directory containing + flex.exe and bison.exe to the + PATH environment variable. In the case of MinGW, the directory is the + \msys\1.0\bin subdirectory of your MinGW + installation directory. + + + + + The Bison distribution from GnuWin32 appears to have a bug that + causes Bison to malfunction when installed in a directory with + spaces in the name, such as the default location on English + installations C:\Program Files\GnuWin32. + Consider installing into C:\GnuWin32 or use the + NTFS short name path to GnuWin32 in your PATH environment setting + (e.g., C:\PROGRA~1\GnuWin32). + + + + + + + + + + The following additional products are not required to get started, + but are required to build the complete package. + + + + Magicsplat Tcl + + Required for building PL/Tcl. + Binaries can be downloaded from + . + + + + + Diff + + Diff is required to run the regression tests, and can be downloaded + from . + + + + + Gettext + + Gettext is required to build with NLS support, and can be downloaded + from . Note that binaries, + dependencies and developer files are all needed. + + + + + MIT Kerberos + + Required for GSSAPI authentication support. MIT Kerberos can be + downloaded from + . + + + + + libxml2 and + libxslt + + Required for XML support. Binaries can be downloaded from + or source from + . Note that libxml2 requires iconv, + which is available from the same download location. + + + + + LZ4 + + Required for supporting LZ4 compression. + Binaries and source can be downloaded from + . + + + + + Zstandard + + Required for supporting Zstandard compression. + Binaries and source can be downloaded from + . + + + + + OpenSSL + + Required for SSL support. Binaries can be downloaded from + + or source from . + + + + + ossp-uuid + + Required for UUID-OSSP support (contrib only). Source can be + downloaded from + . + + + + + Python + + Required for building PL/Python. Binaries can + be downloaded from . + + + + + zlib + + Required for compression support in pg_dump + and pg_restore. Binaries can be downloaded + from . + + + + + + + + + Special Considerations for 64-Bit Windows + + PostgreSQL will only build for the x64 architecture on 64-bit Windows. + + + Mixing 32- and 64-bit versions in the same build tree is not supported. + The build system will automatically detect if it's running in a 32- or + 64-bit environment, and build PostgreSQL accordingly. For this reason, it + is important to start the correct command prompt before building. + + + To use a server-side third party library such as Python or + OpenSSL, this library must also be + 64-bit. There is no support for loading a 32-bit library in a 64-bit + server. Several of the third party libraries that PostgreSQL supports may + only be available in 32-bit versions, in which case they cannot be used with + 64-bit PostgreSQL. + + + + + Collecting Crash Dumps + + + If PostgreSQL on Windows crashes, it has the ability to generate + minidumps that can be used to track down the cause + for the crash, similar to core dumps on Unix. These dumps can be + read using the Windows Debugger Tools or using + Visual Studio. To enable the generation of dumps + on Windows, create a subdirectory named crashdumps + inside the cluster data directory. The dumps will then be written + into this directory with a unique name based on the identifier of + the crashing process and the current time of the crash. + + + diff --git a/doc/src/sgml/intagg.sgml b/doc/src/sgml/intagg.sgml index 44a766eb4b018..29e74ce146cc9 100644 --- a/doc/src/sgml/intagg.sgml +++ b/doc/src/sgml/intagg.sgml @@ -54,20 +54,22 @@ Sample Uses - Many database systems have the notion of a one to many table. Such a table + Many database systems have the notion of a many to many table. Such a table usually sits between two indexed tables, for example: -CREATE TABLE left (id INT PRIMARY KEY, ...); -CREATE TABLE right (id INT PRIMARY KEY, ...); -CREATE TABLE one_to_many(left INT REFERENCES left, right INT REFERENCES right); +CREATE TABLE left_table (id INT PRIMARY KEY, ...); +CREATE TABLE right_table (id INT PRIMARY KEY, ...); +CREATE TABLE many_to_many(id_left INT REFERENCES left_table, + id_right INT REFERENCES right_table); It is typically used like this: -SELECT right.* from right JOIN one_to_many ON (right.id = one_to_many.right) - WHERE one_to_many.left = item; +SELECT right_table.* +FROM right_table JOIN many_to_many ON (right_table.id = many_to_many.id_right) +WHERE many_to_many.id_left = item; This will return all the items in the right hand table for an entry @@ -76,7 +78,7 @@ SELECT right.* from right JOIN one_to_many ON (right.id = one_to_many.right) Now, this methodology can be cumbersome with a very large number of - entries in the one_to_many table. Often, + entries in the many_to_many table. Often, a join like this would result in an index scan and a fetch for each right hand entry in the table for a particular left hand entry. If you have a very dynamic system, there is not much you @@ -85,9 +87,9 @@ SELECT right.* from right JOIN one_to_many ON (right.id = one_to_many.right) CREATE TABLE summary AS - SELECT left, int_array_aggregate(right) AS right - FROM one_to_many - GROUP BY left; + SELECT id_left, int_array_aggregate(id_right) AS rights + FROM many_to_many + GROUP BY id_left; This will create a table with one row per left item, and an array @@ -95,33 +97,35 @@ CREATE TABLE summary AS the array; that's why there is an array enumerator. You can do -SELECT left, int_array_enum(right) FROM summary WHERE left = item; +SELECT id_left, int_array_enum(rights) FROM summary WHERE id_left = item; The above query using int_array_enum produces the same results as -SELECT left, right FROM one_to_many WHERE left = item; +SELECT id_left, id_right FROM many_to_many WHERE id_left = item; The difference is that the query against the summary table has to get only one row from the table, whereas the direct query against - one_to_many must index scan and fetch a row for each entry. + many_to_many must index scan and fetch a row for each entry. On one system, an EXPLAIN showed a query with a cost of 8488 was reduced to a cost of 329. The original query was a join involving the - one_to_many table, which was replaced by: + many_to_many table, which was replaced by: -SELECT right, count(right) FROM - ( SELECT left, int_array_enum(right) AS right - FROM summary JOIN (SELECT left FROM left_table WHERE left = item) AS lefts - ON (summary.left = lefts.left) +SELECT id_right, count(id_right) FROM + ( SELECT id_left, int_array_enum(rights) AS id_right + FROM summary + JOIN (SELECT id FROM left_table + WHERE id = item) AS lefts + ON (summary.id_left = lefts.id) ) AS list - GROUP BY right + GROUP BY id_right ORDER BY count DESC; diff --git a/doc/src/sgml/intro.sgml b/doc/src/sgml/intro.sgml index 63eda059f0c9d..fec72481b54c7 100644 --- a/doc/src/sgml/intro.sgml +++ b/doc/src/sgml/intro.sgml @@ -101,22 +101,22 @@ - complex queries + complex queries - foreign keys + foreign keys - triggers + triggers - updatable views + updatable views - transactional integrity + transactional integrity - multiversion concurrency control + multiversion concurrency control @@ -125,22 +125,22 @@ - data types + data types - functions + functions - operators + operators - aggregate functions + aggregate functions - index methods + index methods - procedural languages + procedural languages diff --git a/doc/src/sgml/isn.sgml b/doc/src/sgml/isn.sgml index ea2aabc87d7e4..264455204c9da 100644 --- a/doc/src/sgml/isn.sgml +++ b/doc/src/sgml/isn.sgml @@ -398,9 +398,9 @@ SELECT isbn13(id) FROM test; - + - + Care was taken during the creation of the algorithms and they diff --git a/doc/src/sgml/jit.sgml b/doc/src/sgml/jit.sgml index 998c972e8ba08..1921557cb826d 100644 --- a/doc/src/sgml/jit.sgml +++ b/doc/src/sgml/jit.sgml @@ -170,7 +170,7 @@ SET JIT: Functions: 3 Options: Inlining false, Optimization false, Expressions true, Deforming true - Timing: Generation 1.259 ms, Inlining 0.000 ms, Optimization 0.797 ms, Emission 5.048 ms, Total 7.104 ms + Timing: Generation 1.259 ms (Deform 0.000 ms), Inlining 0.000 ms, Optimization 0.797 ms, Emission 5.048 ms, Total 7.104 ms Execution Time: 7.416 ms As visible here, JIT was used, but inlining and diff --git a/doc/src/sgml/json.sgml b/doc/src/sgml/json.sgml index b6c2ddbf55a0e..206eadb8f7baf 100644 --- a/doc/src/sgml/json.sgml +++ b/doc/src/sgml/json.sgml @@ -13,7 +13,7 @@ JSON data types are for storing JSON (JavaScript Object Notation) - data, as specified in RFC + data, as specified in RFC 7159. Such data can also be stored as text, but the JSON data types have the advantage of enforcing that each stored value is valid according to the JSON rules. There are also @@ -513,7 +513,7 @@ SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @@ '$.tags[*] == "qui"'; For these operators, a GIN index extracts clauses of the form accessors_chain - = constant out of + == constant out of the jsonpath pattern, and does the index search based on the keys and values mentioned in these clauses. The accessors chain may include .key, @@ -584,12 +584,13 @@ SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @@ '$.tags[*] == "qui"'; The btree ordering for jsonb datums is seldom of great interest, but for completeness it is: -Object > Array > Boolean > Number > String > Null +Object > Array > Boolean > Number > String > null Object with n pairs > object with n - 1 pairs Array with n elements > array with n - 1 elements + with the exception that (for historical reasons) an empty top level array sorts less than null. Objects with equal numbers of pairs are compared in the order: key-1, value-1, key-2 ... @@ -803,21 +804,20 @@ UPDATE table_name SET jsonb_field[1]['a'] = '1'; In particular, the way to write a double quote within an embedded string literal is \", and to write a backslash itself, you must write \\. Other special backslash sequences - include those recognized in JSON strings: + include those recognized in JavaScript strings: \b, \f, \n, \r, \t, \v - for various ASCII control characters, and - \uNNNN for a Unicode - character identified by its 4-hex-digit code point. The backslash - syntax also includes two cases not allowed by JSON: + for various ASCII control characters, \xNN for a character code - written with only two hex digits, and - \u{N...} for a character - code written with 1 to 6 hex digits. + written with only two hex digits, + \uNNNN for a Unicode + character identified by its 4-hex-digit code point, and + \u{N...} for a Unicode + character code point written with 1 to 6 hex digits. diff --git a/doc/src/sgml/legal.sgml b/doc/src/sgml/legal.sgml index b4773b6510198..af13bf2e055b1 100644 --- a/doc/src/sgml/legal.sgml +++ b/doc/src/sgml/legal.sgml @@ -1,9 +1,9 @@ -2023 +2025 - 1996–2023 + 1996–2025 The PostgreSQL Global Development Group @@ -11,7 +11,7 @@ Legal Notice - PostgreSQL is Copyright © 1996–2023 + PostgreSQL is Copyright © 1996–2025 by the PostgreSQL Global Development Group. diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index 2225e4e0ef3f6..ab296b6f87b72 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -265,7 +265,7 @@ PGconn *PQsetdb(char *pghost, PQconnectStartParamsPQconnectStartParams PQconnectStartPQconnectStart - PQconnectPollPQconnectPoll + PQconnectPollPQconnectPoll nonblocking connection @@ -358,7 +358,10 @@ PostgresPollingStatusType PQconnectPoll(PGconn *conn); Loop thus: If PQconnectPoll(conn) last returned PGRES_POLLING_READING, wait until the socket is ready to read (as indicated by select(), poll(), or - similar system function). + similar system function). Note that PQsocketPoll + can help reduce boilerplate by abstracting the setup of + select(2) or poll(2) if it is + available on your system. Then call PQconnectPoll(conn) again. Conversely, if PQconnectPoll(conn) last returned PGRES_POLLING_WRITING, wait until the socket is ready @@ -428,11 +431,11 @@ PostgresPollingStatusType PQconnectPoll(PGconn *conn); - - CONNECTION_SETENV + + CONNECTION_GSS_STARTUP - Negotiating environment-driven parameter settings. + Negotiating GSS encryption. @@ -446,6 +449,15 @@ PostgresPollingStatusType PQconnectPoll(PGconn *conn); + + CONNECTION_CHECK_STANDBY + + + Checking if connection is to a server in standby mode. + + + + CONNECTION_CONSUME @@ -499,6 +511,70 @@ switch(PQstatus(conn)) + + PQsocketPollPQsocketPoll + + + nonblocking connection + Poll a connection's underlying socket descriptor retrieved with + . + The primary use of this function is iterating through the connection + sequence described in the documentation of + . + +typedef pg_int64 pg_usec_time_t; + +int PQsocketPoll(int sock, int forRead, int forWrite, + pg_usec_time_t end_time); + + + + + This function performs polling of a file descriptor, optionally with + a timeout. + If forRead is nonzero, the + function will terminate when the socket is ready for + reading. If forWrite is nonzero, + the function will terminate when the + socket is ready for writing. + + + + The timeout is specified by end_time, which + is the time to stop waiting expressed as a number of microseconds since + the Unix epoch (that is, time_t times 1 million). + Timeout is infinite if end_time + is -1. Timeout is immediate (no blocking) if + end_time is 0 (or indeed, any time before now). + Timeout values can be calculated conveniently by adding the desired + number of microseconds to the result of + . + Note that the underlying system calls may have less than microsecond + precision, so that the actual delay may be imprecise. + + + + The function returns a value greater than 0 if the + specified condition is met, 0 if a timeout occurred, + or -1 if an error occurred. The error can be + retrieved by checking the errno(3) value. In the + event both forRead + and forWrite are zero, the function immediately + returns a timeout indication. + + + + PQsocketPoll is implemented using either + poll(2) or select(2), + depending on platform. See POLLIN + and POLLOUT from poll(2), + or readfds and + writefds from select(2), + for more information. + + + + PQconndefaultsPQconndefaults @@ -873,7 +949,7 @@ PQsslKeyPassHook_OpenSSL_type PQgetSSLKeyPassHook_OpenSSL(void); connection parameters. There are two accepted formats for these strings: plain keyword/value strings and URIs. URIs generally follow - RFC + RFC 3986, except that multi-host connection strings are allowed as further described below. @@ -958,7 +1034,7 @@ postgresql:///mydb?host=localhost&port=5433 The connection URI needs to be encoded with percent-encoding + url="https://datatracker.ietf.org/doc/html/rfc3986#section-2.1">percent-encoding if it includes symbols with special meaning in any of its parts. Here is an example where the equal sign (=) is replaced with %3D and the space character with @@ -1343,8 +1419,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname Maximum time to wait while connecting, in seconds (write as a decimal integer, e.g., 10). Zero, negative, or not specified means - wait indefinitely. The minimum allowed timeout is 2 seconds, therefore - a value of 1 is interpreted as 2. + wait indefinitely. This timeout applies separately to each host name or IP address. For example, if you specify two hosts and connect_timeout is 5, each host will time out if no connection is made within 5 @@ -1374,9 +1449,10 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname Specifies command-line options to send to the server at connection - start. For example, setting this to -c geqo=off sets the - session's value of the geqo parameter to - off. Spaces within this string are considered to + start. For example, setting this to -c geqo=off + or --geqo=off sets the session's value of the + geqo parameter to off. + Spaces within this string are considered to separate command-line arguments, unless escaped with a backslash (\); write \\ to represent a literal backslash. For a detailed discussion of the available @@ -1693,8 +1769,8 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname encryption, regardless of the value of sslmode. To force use of SSL encryption in an environment that has working GSSAPI - infrastructure (such as a Kerberos server), also - set gssencmode to disable. + infrastructure (such as a Kerberos server), also set + gssencmode to disable. @@ -1721,6 +1797,51 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname + + sslnegotiation + + + This option controls how SSL encryption is negotiated with the server, + if SSL is used. In the default postgres mode, the + client first asks the server if SSL is supported. In + direct mode, the client starts the standard SSL + handshake directly after establishing the TCP/IP connection. Traditional + PostgreSQL protocol negotiation is the most + flexible with different server configurations. If the server is known + to support direct SSL connections then the latter + requires one fewer round trip reducing connection latency and also + allows the use of protocol agnostic SSL network tools. The direct SSL + option was introduced in PostgreSQL version + 17. + + + + + postgres + + + perform PostgreSQL protocol + negotiation. This is the default if the option is not provided. + + + + + + direct + + + start SSL handshake directly after establishing the TCP/IP + connection. This is only allowed with sslmode=require or higher, + because the weaker settings could lead to unintended fallback to + plaintext authentication when the server does not support direct + SSL handshake. + + + + + + + sslcompression @@ -1732,11 +1853,11 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname SSL compression is nowadays considered insecure and its use is no - longer recommended. OpenSSL 1.1.0 disables + longer recommended. OpenSSL 1.1.0 disabled compression by default, and many operating system distributions - disable it in prior versions as well, so setting this parameter to on + disabled it in prior versions as well, so setting this parameter to on will not have any effect if the server does not accept compression. - PostgreSQL 14 disables compression + PostgreSQL 14 disabled compression completely in the backend. @@ -1878,7 +1999,7 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname The special value system may be specified instead, in - which case the system's trusted CA roots will be loaded. The exact + which case the trusted CA roots from the SSL implementation will be loaded. The exact locations of these root certificates differ by SSL implementation and platform. For OpenSSL in particular, the locations may be further modified by the SSL_CERT_DIR @@ -1954,11 +2075,13 @@ postgresql://%2Fvar%2Flib%2Fpostgresql/dbname The Server Name Indication can be used by SSL-aware proxies to route - connections without having to decrypt the SSL stream. (Note that this - requires a proxy that is aware of the PostgreSQL protocol handshake, - not just any SSL proxy.) However, SNI makes the - destination host name appear in cleartext in the network traffic, so - it might be undesirable in some cases. + connections without having to decrypt the SSL stream. (Note that + unless the proxy is aware of the PostgreSQL protocol handshake this + would require setting sslnegotiation + to direct.) + However, SNI makes the destination host name appear + in cleartext in the network traffic, so it might be undesirable in + some cases. @@ -2509,30 +2632,27 @@ const char *PQparameterStatus(const PGconn *conn, const char *paramName); - Parameters reported as of the current release include - server_version, - server_encoding, - client_encoding, - application_name, - default_transaction_read_only, - in_hot_standby, - is_superuser, - session_authorization, - DateStyle, - IntervalStyle, - TimeZone, - integer_datetimes, and - standard_conforming_strings. - (server_encoding, TimeZone, and - integer_datetimes were not reported by releases before 8.0; - standard_conforming_strings was not reported by releases - before 8.1; - IntervalStyle was not reported by releases before 8.4; - application_name was not reported by releases before - 9.0; - default_transaction_read_only and + Parameters reported as of the current release include: + + application_name + client_encoding + DateStyle + default_transaction_read_only + in_hot_standby + integer_datetimes + IntervalStyle + is_superuser + scram_iterations + server_encoding + server_version + session_authorization + standard_conforming_strings + TimeZone + + (default_transaction_read_only and in_hot_standby were not reported by releases before - 14.) + 14; scram_iterations was not reported by releases + before 16.) Note that server_version, server_encoding and @@ -2616,17 +2736,19 @@ int PQserverVersion(const PGconn *conn); - PQerrorMessagePQerrorMessage + + PQerrorMessagePQerrorMessage + error messagein PGconn + - error message Returns the error message - most recently generated by an operation on the connection. + Returns the error message most recently generated by + an operation on the connection. char *PQerrorMessage(const PGconn *conn); - @@ -2835,6 +2957,18 @@ const char *PQsslAttribute(const PGconn *conn, const char *attribute_name); + + alpn + + + Application protocol selected by the TLS Application-Layer + Protocol Negotiation (ALPN) extension. The only protocol + supported by libpq is postgresql, so this is + mainly useful for checking whether the server supported ALPN or + not. Empty string if ALPN was not used. + + + @@ -3250,10 +3384,7 @@ PGresult *PQprepare(PGconn *conn, Prepared statements for use with can also be created by executing SQL - statements. Also, although there is no libpq - function for deleting a prepared statement, the SQL statement - can be used for that purpose. + statements. @@ -3360,6 +3491,66 @@ PGresult *PQdescribePortal(PGconn *conn, const char *portalName); + + + PQclosePreparedPQclosePrepared + + + + Submits a request to close the specified prepared statement, and waits + for completion. + +PGresult *PQclosePrepared(PGconn *conn, const char *stmtName); + + + + + allows an application to close + a previously prepared statement. Closing a statement releases all + of its associated resources on the server and allows its name to be + reused. + + + + stmtName can be "" or + NULL to reference the unnamed statement. It is fine + if no statement exists with this name, in that case the operation is a + no-op. On success, a PGresult with + status PGRES_COMMAND_OK is returned. + + + + + + PQclosePortalPQclosePortal + + + + Submits a request to close the specified portal, and waits for + completion. + +PGresult *PQclosePortal(PGconn *conn, const char *portalName); + + + + + allows an application to trigger + a close of a previously created portal. Closing a portal releases all + of its associated resources on the server and allows its name to be + reused. (libpq does not provide any + direct access to portals, but you can use this function to close a + cursor created with a DECLARE CURSOR SQL command.) + + + + portalName can be "" or + NULL to reference the unnamed portal. It is fine + if no portal exists with this name, in that case the operation is a + no-op. On success, a PGresult with status + PGRES_COMMAND_OK is returned. + + + @@ -3485,13 +3676,28 @@ ExecStatusType PQresultStatus(const PGresult *res); + + PGRES_TUPLES_CHUNK + + + The PGresult contains several result tuples + from the current command. This status occurs only when + chunked mode has been selected for the query + (see ). + The number of tuples will not exceed the limit passed to + . + + + + PGRES_PIPELINE_SYNC The PGresult represents a - synchronization point in pipeline mode, requested by - . + synchronization point in pipeline mode, requested by either + or + . This status occurs only when pipeline mode has been selected. @@ -3513,8 +3719,9 @@ ExecStatusType PQresultStatus(const PGresult *res); - If the result status is PGRES_TUPLES_OK or - PGRES_SINGLE_TUPLE, then + If the result status is PGRES_TUPLES_OK, + PGRES_SINGLE_TUPLE, or + PGRES_TUPLES_CHUNK, then the functions described below can be used to retrieve the rows returned by the query. Note that a SELECT command that happens to retrieve zero rows still shows @@ -3926,7 +4133,9 @@ void PQclear(PGresult *res); These functions are used to extract information from a PGresult object that represents a successful query result (that is, one that has status - PGRES_TUPLES_OK or PGRES_SINGLE_TUPLE). + PGRES_TUPLES_OK, + PGRES_SINGLE_TUPLE, or + PGRES_TUPLES_CHUNK). They can also be used to extract information from a successful Describe operation: a Describe's result has all the same column information that actual execution of the query @@ -4851,15 +5060,19 @@ unsigned char *PQunescapeBytea(const unsigned char *from, size_t *to_length); , , , - , and + , , + , and + , which can be used with to duplicate the functionality of , , , - , and - + , + , + , and + respectively. @@ -5008,6 +5221,46 @@ int PQsendDescribePortal(PGconn *conn, const char *portalName); + + PQsendClosePreparedPQsendClosePrepared + + + + Submits a request to close the specified prepared statement, without + waiting for completion. + +int PQsendClosePrepared(PGconn *conn, const char *stmtName); + + + This is an asynchronous version of : + it returns 1 if it was able to dispatch the request, and 0 if not. + After a successful call, call to + obtain the results. The function's parameters are handled + identically to . + + + + + + PQsendClosePortalPQsendClosePortal + + + + Submits a request to close specified portal, without waiting for + completion. + +int PQsendClosePortal(PGconn *conn, const char *portalName); + + + This is an asynchronous version of : + it returns 1 if it was able to dispatch the request, and 0 if not. + After a successful call, call to + obtain the results. The function's parameters are handled + identically to . + + + + PQgetResultPQgetResult @@ -5019,7 +5272,10 @@ int PQsendDescribePortal(PGconn *conn, const char *portalName); , , , - , or + , + , + , + , or call, and returns it. A null pointer is returned when the command is complete and there @@ -5054,7 +5310,7 @@ PGresult *PQgetResult(PGconn *conn); PGRES_PIPELINE_SYNC will be returned. The result of the next query after the synchronization point follows immediately (that is, no null pointer is returned after - the synchronization point.) + the synchronization point). @@ -5084,7 +5340,8 @@ PGresult *PQgetResult(PGconn *conn); Another frequently-desired feature that can be obtained with and - is retrieving large query results a row at a time. This is discussed + is retrieving large query results a limited number of rows at a time. + This is discussed in . @@ -5176,7 +5433,7 @@ int PQisBusy(PGconn *conn); / can also attempt to cancel a command that is still being processed by the server; see . But regardless of - the return value of , the application + the return value of , the application must continue with the normal result-reading sequence using . A successful cancellation will simply cause the command to terminate sooner than it would have @@ -5213,11 +5470,12 @@ int PQsetnonblocking(PGconn *conn, int arg); - In the nonblocking state, calls to + In the nonblocking state, successful calls to , , , , - and will not block but instead return - an error if they need to be called again. + and will not block; their changes + are stored in the local output buffer until they are flushed. + Unsuccessful calls will return an error and must be retried. @@ -5350,6 +5608,8 @@ int PQflush(PGconn *conn); PQexecPrepared, PQdescribePrepared, PQdescribePortal, + PQclosePrepared, + PQclosePortal, is an error condition. PQsendQuery is also disallowed, because it uses the simple query protocol. @@ -5389,8 +5649,10 @@ int PQflush(PGconn *conn); establish a synchronization point in the pipeline, or when is called. The functions , - , and - also work in pipeline mode. + , + , + , and + also work in pipeline mode. Result processing is described below. @@ -5399,8 +5661,9 @@ int PQflush(PGconn *conn); client sends them. The server will begin executing the commands in the pipeline immediately, not waiting for the end of the pipeline. Note that results are buffered on the server side; the server flushes - that buffer when a synchronization point is established with - PQpipelineSync, or when + that buffer when a synchronization point is established with either + PQpipelineSync or + PQsendPipelineSync, or when PQsendFlushRequest is called. If any statement encounters an error, the server aborts the current transaction and does not execute any subsequent command in the queue @@ -5442,22 +5705,14 @@ int PQflush(PGconn *conn); queries in the pipeline; see . - - To enter single-row mode, call PQsetSingleRowMode - before retrieving results with PQgetResult. - This mode selection is effective only for the query currently - being processed. For more information on the use of - PQsetSingleRowMode, - refer to . - - PQgetResult behaves the same as for normal asynchronous processing except that it may contain the new PGresult types PGRES_PIPELINE_SYNC and PGRES_PIPELINE_ABORTED. PGRES_PIPELINE_SYNC is reported exactly once for each - PQpipelineSync at the corresponding point + PQpipelineSync or + PQsendPipelineSync at the corresponding point in the pipeline. PGRES_PIPELINE_ABORTED is emitted in place of a normal query result for the first error and all subsequent results @@ -5495,7 +5750,8 @@ int PQflush(PGconn *conn); PQresultStatus will report a PGRES_PIPELINE_ABORTED result for each remaining queued operation in an aborted pipeline. The result for - PQpipelineSync is reported as + PQpipelineSync or + PQsendPipelineSync is reported as PGRES_PIPELINE_SYNC to signal the end of the aborted pipeline and resumption of normal result processing. @@ -5702,31 +5958,57 @@ int PQpipelineSync(PGconn *conn); + + PQsendPipelineSyncPQsendPipelineSync + + + + Marks a synchronization point in a pipeline by sending a + sync message + without flushing the send buffer. This serves as + the delimiter of an implicit transaction and an error recovery + point; see . + + +int PQsendPipelineSync(PGconn *conn); + + + + Returns 1 for success. Returns 0 if the connection is not in + pipeline mode or sending a + sync message + failed. + Note that the message is not itself flushed to the server automatically; + use PQflush if necessary. + + + + PQsendFlushRequestPQsendFlushRequest - - - Sends a request for the server to flush its output buffer. + + + Sends a request for the server to flush its output buffer. int PQsendFlushRequest(PGconn *conn); - + - - Returns 1 for success. Returns 0 on any failure. - - - The server flushes its output buffer automatically as a result of - PQpipelineSync being called, or - on any request when not in pipeline mode; this function is useful - to cause the server to flush its output buffer in pipeline mode - without establishing a synchronization point. - Note that the request is not itself flushed to the server automatically; - use PQflush if necessary. - - - + + Returns 1 for success. Returns 0 on any failure. + + + The server flushes its output buffer automatically as a result of + PQpipelineSync being called, or + on any request when not in pipeline mode; this function is useful + to cause the server to flush its output buffer in pipeline mode + without establishing a synchronization point. + Note that the request is not itself flushed to the server automatically; + use PQflush if necessary. + + + @@ -5787,36 +6069,49 @@ UPDATE mytable SET x = x + 1 WHERE id = 42; + - Retrieving Query Results Row-by-Row + Retrieving Query Results in Chunks libpq single-row mode + + libpq + chunked mode + + Ordinarily, libpq collects an SQL command's entire result and returns it to the application as a single PGresult. This can be unworkable for commands that return a large number of rows. For such cases, applications can use and in - single-row mode. In this mode, the result row(s) are - returned to the application one at a time, as they are received from the - server. + single-row mode or chunked + mode. In these modes, result row(s) are returned to the + application as they are received from the server, one at a time for + single-row mode or in groups for chunked mode. - To enter single-row mode, call + To enter one of these modes, call + or immediately after a successful call of (or a sibling function). This mode selection is effective only for the currently executing query. Then call repeatedly, until it returns null, as documented in . If the query returns any rows, they are returned - as individual PGresult objects, which look like + as one or more PGresult objects, which look like normal query results except for having status code - PGRES_SINGLE_TUPLE instead of - PGRES_TUPLES_OK. After the last row, or immediately if + PGRES_SINGLE_TUPLE for single-row mode or + PGRES_TUPLES_CHUNK for chunked mode, instead of + PGRES_TUPLES_OK. There is exactly one result row in + each PGRES_SINGLE_TUPLE object, while + a PGRES_TUPLES_CHUNK object contains at least one + row but not more than the specified number of rows per chunk. + After the last row, or immediately if the query returns zero rows, a zero-row object with status PGRES_TUPLES_OK is returned; this is the signal that no more rows will arrive. (But note that it is still necessary to continue @@ -5828,9 +6123,9 @@ UPDATE mytable SET x = x + 1 WHERE id = 42; - When using pipeline mode, single-row mode needs to be activated for each - query in the pipeline before retrieving results for that query - with PQgetResult. + When using pipeline mode, single-row or chunked mode needs to be + activated for each query in the pipeline before retrieving results for + that query with PQgetResult. See for more information. @@ -5861,6 +6156,36 @@ int PQsetSingleRowMode(PGconn *conn); + + + PQsetChunkedRowsModePQsetChunkedRowsMode + + + + Select chunked mode for the currently-executing query. + + +int PQsetChunkedRowsMode(PGconn *conn, int chunkSize); + + + + + This function is similar to + , except that it + specifies retrieval of up to chunkSize rows + per PGresult, not necessarily just one row. + This function can only be called immediately after + or one of its sibling functions, + before any other operation on the connection such as + or + . If called at the correct time, + the function activates chunked mode for the current query and + returns 1. Otherwise the mode stays unchanged and the function + returns 0. In any case, the mode reverts to normal after + completion of the current query. + + + @@ -5869,9 +6194,10 @@ int PQsetSingleRowMode(PGconn *conn); While processing a query, the server may return some rows and then encounter an error, causing the query to be aborted. Ordinarily, libpq discards any such rows and reports only the - error. But in single-row mode, those rows will have already been - returned to the application. Hence, the application will see some - PGRES_SINGLE_TUPLE PGresult + error. But in single-row or chunked mode, some rows may have already + been returned to the application. Hence, the application will see some + PGRES_SINGLE_TUPLE or PGRES_TUPLES_CHUNK + PGresult objects followed by a PGRES_FATAL_ERROR object. For proper transactional behavior, the application must be designed to discard or undo whatever has been done with the previously-processed @@ -5885,14 +6211,429 @@ int PQsetSingleRowMode(PGconn *conn); Canceling Queries in Progress - canceling - SQL command + canceling SQL queries + + + query cancellation - - A client application can request cancellation of a command that is - still being processed by the server, using the functions described in - this section. + + Functions for Sending Cancel Requests + + + PQcancelCreatePQcancelCreate + + + + Prepares a connection over which a cancel request can be sent. + +PGcancelConn *PQcancelCreate(PGconn *conn); + + + + + creates a + PGcancelConnPGcancelConn + object, but it won't instantly start sending a cancel request over this + connection. A cancel request can be sent over this connection in a + blocking manner using and in a + non-blocking manner using . + The return value can be passed to + to check if the PGcancelConn object was + created successfully. The PGcancelConn object + is an opaque structure that is not meant to be accessed directly by the + application. This PGcancelConn object can be + used to cancel the query that's running on the original connection in a + thread-safe way. + + + + Many connection parameters of the original client will be reused when + setting up the connection for the cancel request. Importantly, if the + original connection requires encryption of the connection and/or + verification of the target host (using sslmode or + gssencmode), then the connection for the cancel + request is made with these same requirements. Any connection options + that are only used during authentication or after authentication of the + client are ignored though, because cancellation requests do not require + authentication and the connection is closed right after the cancellation + request is submitted. + + + + Note that when PQcancelCreate returns a non-null + pointer, you must call when you + are finished with it, in order to dispose of the structure and any + associated memory blocks. This must be done even if the cancel request + failed or was abandoned. + + + + + + PQcancelBlockingPQcancelBlocking + + + + Requests that the server abandons processing of the current command + in a blocking manner. + +int PQcancelBlocking(PGcancelConn *cancelConn); + + + + + The request is made over the given PGcancelConn, + which needs to be created with . + The return value of + is 1 if the cancel request was successfully + dispatched and 0 if not. If it was unsuccessful, the error message can be + retrieved using . + + + + Successful dispatch of the cancellation is no guarantee that the request + will have any effect, however. If the cancellation is effective, the + command being canceled will terminate early and return an error result. + If the cancellation fails (say, because the server was already done + processing the command), then there will be no visible result at all. + + + + + + + PQcancelStartPQcancelStart + PQcancelPollPQcancelPoll + + + + Requests that the server abandons processing of the current command + in a non-blocking manner. + +int PQcancelStart(PGcancelConn *cancelConn); + +PostgresPollingStatusType PQcancelPoll(PGcancelConn *cancelConn); + + + + + The request is made over the given PGcancelConn, + which needs to be created with . + The return value of + is 1 if the cancellation request could be started and 0 if not. + If it was unsuccessful, the error message can be + retrieved using . + + + + If PQcancelStart succeeds, the next stage + is to poll libpq so that it can proceed with + the cancel connection sequence. + Use to obtain the descriptor of the + socket underlying the database connection. + (Caution: do not assume that the socket remains the same + across PQcancelPoll calls.) + Loop thus: If PQcancelPoll(cancelConn) last returned + PGRES_POLLING_READING, wait until the socket is ready to + read (as indicated by select(), + poll(), or similar system function). + Then call PQcancelPoll(cancelConn) again. + Conversely, if PQcancelPoll(cancelConn) last returned + PGRES_POLLING_WRITING, wait until the socket is ready + to write, then call PQcancelPoll(cancelConn) again. + On the first iteration, i.e., if you have yet to call + PQcancelPoll(cancelConn), behave as if it last returned + PGRES_POLLING_WRITING. Continue this loop until + PQcancelPoll(cancelConn) returns + PGRES_POLLING_FAILED, indicating the connection procedure + has failed, or PGRES_POLLING_OK, indicating cancel + request was successfully dispatched. + + + + Successful dispatch of the cancellation is no guarantee that the request + will have any effect, however. If the cancellation is effective, the + command being canceled will terminate early and return an error result. + If the cancellation fails (say, because the server was already done + processing the command), then there will be no visible result at all. + + + + At any time during connection, the status of the connection can be + checked by calling . + If this call returns CONNECTION_BAD, then + the cancel procedure has failed; if the call returns + CONNECTION_OK, then cancel request was + successfully dispatched. + Both of these states are equally detectable from the return value of + PQcancelPoll, described above. + Other states might also occur during (and only during) an asynchronous + connection procedure. + These indicate the current stage of the connection procedure and might + be useful to provide feedback to the user for example. + These statuses are: + + + + CONNECTION_ALLOCATED + + + Waiting for a call to or + , to actually open the + socket. This is the connection state right after + calling + or . No connection to the + server has been initiated yet at this point. To actually start + sending the cancel request use or + . + + + + + + CONNECTION_STARTED + + + Waiting for connection to be made. + + + + + + CONNECTION_MADE + + + Connection OK; waiting to send. + + + + + + CONNECTION_AWAITING_RESPONSE + + + Waiting for a response from the server. + + + + + + CONNECTION_SSL_STARTUP + + + Negotiating SSL encryption. + + + + + + CONNECTION_GSS_STARTUP + + + Negotiating GSS encryption. + + + + + + Note that, although these constants will remain (in order to maintain + compatibility), an application should never rely upon these occurring in a + particular order, or at all, or on the status always being one of these + documented values. An application might do something like this: + +switch(PQcancelStatus(conn)) +{ + case CONNECTION_STARTED: + feedback = "Connecting..."; + break; + + case CONNECTION_MADE: + feedback = "Connected to server..."; + break; +. +. +. + default: + feedback = "Connecting..."; +} + + + + + The connect_timeout connection parameter is ignored + when using PQcancelPoll; it is the application's + responsibility to decide whether an excessive amount of time has elapsed. + Otherwise, PQcancelStart followed by a + PQcancelPoll loop is equivalent to + . + + + + + + + PQcancelStatusPQcancelStatus + + + + Returns the status of the cancel connection. + +ConnStatusType PQcancelStatus(const PGcancelConn *cancelConn); + + + + + The status can be one of a number of values. However, only three of + these are seen outside of an asynchronous cancel procedure: + CONNECTION_ALLOCATED, + CONNECTION_OK and + CONNECTION_BAD. The initial state of a + PGcancelConn that's successfully created using + is CONNECTION_ALLOCATED. + A cancel request that was successfully dispatched + has the status CONNECTION_OK. A failed + cancel attempt is signaled by status + CONNECTION_BAD. An OK status will + remain so until or + is called. + + + + See the entry for with regards + to other status codes that might be returned. + + + + Successful dispatch of the cancellation is no guarantee that the request + will have any effect, however. If the cancellation is effective, the + command being canceled will terminate early and return an error result. + If the cancellation fails (say, because the server was already done + processing the command), then there will be no visible result at all. + + + + + + + PQcancelSocketPQcancelSocket + + + + Obtains the file descriptor number of the cancel connection socket to + the server. + +int PQcancelSocket(const PGcancelConn *cancelConn); + + + + + A valid descriptor will be greater than or equal to 0; + a result of -1 indicates that no server connection is currently open. + This might change as a result of calling any of the functions + in this section on the PGcancelConn + (except for and + PQcancelSocket itself). + + + + + + + PQcancelErrorMessagePQcancelErrorMessage + error messagein PGcancelConn + + + + + Returns the error message most recently generated by an + operation on the cancel connection. + +char *PQcancelErrorMessage(const PGcancelConn *cancelconn); + + + + + Nearly all libpq functions that take a + PGcancelConn will set a message for + if they fail. + Note that by libpq convention, + a nonempty result + can consist of multiple lines, and will include a trailing newline. + The caller should not free the result directly. + It will be freed when the associated + PGcancelConn handle is passed to + . The result string should not be + expected to remain the same across operations on the + PGcancelConn structure. + + + + + + PQcancelFinishPQcancelFinish + + + Closes the cancel connection (if it did not finish sending the + cancel request yet). Also frees memory used by the + PGcancelConn object. + +void PQcancelFinish(PGcancelConn *cancelConn); + + + + + Note that even if the cancel attempt fails (as + indicated by ), the + application should call + to free the memory used by the PGcancelConn + object. + The PGcancelConn pointer must not be used + again after has been called. + + + + + + PQcancelResetPQcancelReset + + + Resets the PGcancelConn so it can be reused for a new + cancel connection. + +void PQcancelReset(PGcancelConn *cancelConn); + + + + + If the PGcancelConn is currently used to send a cancel + request, then this connection is closed. It will then prepare the + PGcancelConn object such that it can be used to send a + new cancel request. + + + + This can be used to create one PGcancelConn + for a PGconn and reuse it multiple times + throughout the lifetime of the original PGconn. + + + + + + + + Obsolete Functions for Sending Cancel Requests + + + These functions represent older methods of sending cancel requests. + Although they still work, they are deprecated due to not sending the cancel + requests in an encrypted manner, even when the original connection + specified sslmode or gssencmode to + require encryption. Thus these older methods are heavily discouraged from + being used in new code, and it is recommended to change existing code to + use the new functions instead. + @@ -5901,7 +6642,7 @@ int PQsetSingleRowMode(PGconn *conn); Creates a data structure containing the information needed to cancel - a command issued through a particular database connection. + a command using . PGcancel *PQgetCancel(PGconn *conn); @@ -5909,10 +6650,11 @@ PGcancel *PQgetCancel(PGconn *conn); creates a - PGcancelPGcancel object - given a PGconn connection object. It will return - NULL if the given conn is NULL or an invalid - connection. The PGcancel object is an opaque + PGcancelPGcancel + object given a PGconn connection object. + It will return NULL if the given conn + is NULL or an invalid connection. + The PGcancel object is an opaque structure that is not meant to be accessed directly by the application; it can only be passed to or . @@ -5943,36 +6685,38 @@ void PQfreeCancel(PGcancel *cancel); - Requests that the server abandon processing of the current command. + is a deprecated and insecure + variant of , but one that can be + used safely from within a signal handler. int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize); - The return value is 1 if the cancel request was successfully - dispatched and 0 if not. If not, errbuf is filled - with an explanatory error message. errbuf - must be a char array of size errbufsize (the - recommended size is 256 bytes). + only exists because of backwards + compatibility reasons. should be + used instead. The only benefit that has + is that it can be safely invoked from a signal handler, if the + errbuf is a local variable in the signal handler. + However, this is generally not considered a big enough benefit to be + worth the security issues that this function has. - Successful dispatch is no guarantee that the request will have - any effect, however. If the cancellation is effective, the current - command will terminate early and return an error result. If the - cancellation fails (say, because the server was already done - processing the command), then there will be no visible result at - all. + The PGcancel object is read-only as far as + is concerned, so it can also be invoked + from a thread that is separate from the one manipulating the + PGconn object. - can safely be invoked from a signal - handler, if the errbuf is a local variable in the - signal handler. The PGcancel object is read-only - as far as is concerned, so it can - also be invoked from a thread that is separate from the one - manipulating the PGconn object. + The return value of is 1 if the + cancel request was successfully dispatched and 0 if not. + If not, errbuf is filled with an explanatory + error message. + errbuf must be a char array of size + errbufsize (the recommended size is 256 bytes). @@ -5984,13 +6728,21 @@ int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize); - is a deprecated variant of - . + is a deprecated and insecure + variant of . int PQrequestCancel(PGconn *conn); + + only exists because of backwards + compatibility reasons. should be + used instead. There is no benefit to using + over + . + + Requests that the server abandon processing of the current command. It operates directly on the @@ -6005,8 +6757,7 @@ int PQrequestCancel(PGconn *conn); - - + @@ -7008,6 +7759,45 @@ char *PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, + + PQchangePasswordPQchangePassword + + + + Changes a PostgreSQL password. + +PGresult *PQchangePassword(PGconn *conn, const char *user, const char *passwd); + + This function uses PQencryptPasswordConn + to build and execute the command ALTER USER ... PASSWORD + '...', thereby changing the user's password. It exists for + the same reason as PQencryptPasswordConn, but + is more convenient as it both builds and runs the command for you. + is passed a + NULL for the algorithm argument, hence encryption is + done according to the server's + setting. + + + + The user and passwd arguments + are the SQL name of the target user, and the new cleartext password. + + + + Returns a PGresult pointer representing + the result of the ALTER USER command, or + a null pointer if the routine failed before issuing any command. + The function should be called + to check the return value for any errors (including the value of a null + pointer, in which case it will return + PGRES_FATAL_ERROR). Use + to get more information about + such errors. + + + + PQencryptPasswordPQencryptPassword @@ -7216,7 +8006,7 @@ size_t PQresultMemorySize(const PGresult *res); This value is the sum of all malloc requests associated with the PGresult object, that is, - all the space that will be freed by . + all the memory that will be freed by . This information can be useful for managing memory consumption. @@ -7277,6 +8067,25 @@ int PQlibVersion(void); + + PQgetCurrentTimeUSecPQgetCurrentTimeUSec + + + + Retrieves the current time, expressed as the number of microseconds + since the Unix epoch (that is, time_t times 1 million). + +pg_usec_time_t PQgetCurrentTimeUSec(void); + + + + + This is primarily useful for calculating timeout values to use with + . + + + + @@ -7447,7 +8256,7 @@ defaultNoticeProcessor(void *arg, const char *message) is called. It is the ideal time to initialize any instanceData an event procedure may need. Only one register event will be fired per event handler per connection. If the - event procedure fails (returns zero), the registration is cancelled. + event procedure fails (returns zero), the registration is canceled. typedef struct @@ -7974,6 +8783,16 @@ myEventProc(PGEventId evtId, void *evtInfo, void *passThrough) + + + + PGSSLNEGOTIATION + + PGSSLNEGOTIATION behaves the same as the connection parameter. + + + @@ -8556,7 +9375,7 @@ user=admin LDAP query will be performed. The result must be a list of keyword = value pairs which will be used to set connection options. The URL must conform to - RFC 1959 + RFC 1959 and be of the form ldap://[hostname[:port]]/search_base?attribute?search_scope?filter @@ -8700,7 +9519,7 @@ ldap://ldap.acme.com/cn=dbserver,cn=hosts?pgconnectinfo?base?(objectclass=*) For backward compatibility with earlier versions of PostgreSQL, the host IP address is verified in a manner different - from RFC 6125. + from RFC 6125. The host IP address is always matched against dNSName SANs as well as iPAddress SANs, and can be matched against the Common Name attribute if no relevant SANs exist. @@ -9129,14 +9948,28 @@ void PQinitSSL(int do_ssl); - libpq is reentrant and thread-safe by default. - You might need to use special compiler command-line - options when you compile your application code. Refer to your - system's documentation for information about how to build - thread-enabled applications, or look in - src/Makefile.global for PTHREAD_CFLAGS - and PTHREAD_LIBS. This function allows the querying of - libpq's thread-safe status: + As of version 17, libpq is always reentrant and thread-safe. + However, one restriction is that no two threads attempt to manipulate + the same PGconn object at the same time. In particular, + you cannot issue concurrent commands from different threads through + the same connection object. (If you need to run concurrent commands, + use multiple connections.) + + + + PGresult objects are normally read-only after creation, + and so can be passed around freely between threads. However, if you use + any of the PGresult-modifying functions described in + or , it's up + to you to avoid concurrent operations on the same PGresult, + too. + + + + In earlier versions, libpq could be compiled + with or without thread support, depending on compiler options. This + function allows the querying of libpq's + thread-safe status: @@ -9154,34 +9987,17 @@ int PQisthreadsafe(); Returns 1 if the libpq is thread-safe - and 0 if it is not. + and 0 if it is not. Always returns 1 on version 17 and above. - - One thread restriction is that no two threads attempt to manipulate - the same PGconn object at the same time. In particular, - you cannot issue concurrent commands from different threads through - the same connection object. (If you need to run concurrent commands, - use multiple connections.) - - - - PGresult objects are normally read-only after creation, - and so can be passed around freely between threads. However, if you use - any of the PGresult-modifying functions described in - or , it's up - to you to avoid concurrent operations on the same PGresult, - too. - - The deprecated functions and are not thread-safe and should not be used in multithread programs. - can be replaced by . + can be replaced by . can be replaced by . diff --git a/doc/src/sgml/limits.sgml b/doc/src/sgml/limits.sgml index d5b2b627ddf05..f26f4466719a5 100644 --- a/doc/src/sgml/limits.sgml +++ b/doc/src/sgml/limits.sgml @@ -57,14 +57,14 @@ columns per table - 1600 + 1,600 further limited by tuple size fitting on a single page; see note below columns in a result set - 1664 + 1,664 @@ -74,12 +74,6 @@ - - identifier length - 63 bytes - can be increased by recompiling PostgreSQL - - indexes per table unlimited @@ -92,11 +86,29 @@ can be increased by recompiling PostgreSQL - - partition keys - 32 - can be increased by recompiling PostgreSQL - + + partition keys + 32 + can be increased by recompiling PostgreSQL + + + + identifier length + 63 bytes + can be increased by recompiling PostgreSQL + + + + function arguments + 100 + can be increased by recompiling PostgreSQL + + + + query parameters + 65,535 + +
@@ -104,9 +116,9 @@ The maximum number of columns for a table is further reduced as the tuple being stored must fit in a single 8192-byte heap page. For example, - excluding the tuple header, a tuple made up of 1600 int columns + excluding the tuple header, a tuple made up of 1,600 int columns would consume 6400 bytes and could be stored in a heap page, but a tuple of - 1600 bigint columns would consume 12800 bytes and would + 1,600 bigint columns would consume 12800 bytes and would therefore not fit inside a heap page. Variable-length fields of types such as text, varchar, and char @@ -123,4 +135,15 @@ created tuples are internally marked as null in the tuple's null bitmap, the null bitmap also occupies space. + + + Each table can store a theoretical maximum of 2^32 out-of-line values; see + for a detailed discussion of out-of-line + storage. This limit arises from the use of a 32-bit OID to identify each + such value. The practical limit is significantly less than the theoretical + limit, because as the OID space fills up, finding an OID that is still free + can become expensive, in turn slowing down INSERT/UPDATE statements. + Typically, this is only an issue for tables containing many terabytes + of data; partitioning is a possible workaround. + diff --git a/doc/src/sgml/lobj.sgml b/doc/src/sgml/lobj.sgml index cc14f1ae49e0d..2b725c3c18240 100644 --- a/doc/src/sgml/lobj.sgml +++ b/doc/src/sgml/lobj.sgml @@ -725,7 +725,7 @@ SELECT lo_export(image.raster, '/tmp/motd') FROM image * testlo.c * test using large objects with libpq * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml index c5de2040f78a5..88b2491e09b3e 100644 --- a/doc/src/sgml/logical-replication.sgml +++ b/doc/src/sgml/logical-replication.sgml @@ -134,12 +134,12 @@ to replica identity FULL, which means the entire row becomes the key. When replica identity FULL is specified, indexes can be used on the subscriber side for searching the rows. Candidate - indexes must be btree, non-partial, and have at least one column reference - (i.e. cannot consist of only expressions). These restrictions - on the non-unique index properties adhere to some of the restrictions that - are enforced for primary keys. If there are no such suitable indexes, - the search on the subscriber side can be very inefficient, therefore - replica identity FULL should only be used as a + indexes must be btree or hash, non-partial, and the leftmost index field must + be a column (not an expression) that references the published table column. + These restrictions on the non-unique index properties adhere to some of the + restrictions that are enforced for primary keys. If there are no such + suitable indexes, the search on the subscriber side can be very inefficient, + therefore replica identity FULL should only be used as a fallback if no other solution is possible. If a replica identity other than FULL is set on the publisher side, a replica identity comprising the same or fewer columns must also be set on the subscriber @@ -253,7 +253,7 @@ will be filled with the default value as specified in the definition of the target table. However, logical replication in binary format is more restrictive. See the - binary + binary option of CREATE SUBSCRIPTION for details.
@@ -274,9 +274,11 @@
Normally, the remote replication slot is created automatically when the - subscription is created using CREATE SUBSCRIPTION and it + subscription is created using + CREATE SUBSCRIPTION and it is dropped automatically when the subscription is dropped using - DROP SUBSCRIPTION. In some situations, however, it can + DROP SUBSCRIPTION. + In some situations, however, it can be useful or necessary to manipulate the subscription and the underlying replication slot separately. Here are some scenarios: @@ -306,8 +308,9 @@ When dropping a subscription, the replication slot should be kept. This could be useful when the subscriber database is being moved to a different host and will be activated from there. In that case, - disassociate the slot from the subscription using ALTER - SUBSCRIPTION before attempting to drop the subscription. + disassociate the slot from the subscription using + ALTER SUBSCRIPTION + before attempting to drop the subscription. @@ -368,7 +371,7 @@ INSERT 0 3 Create publications for the tables. The publications pub2 and pub3a disallow some - publish + publish operations. The publication pub3b has a row filter (see ). @@ -532,7 +535,7 @@ test_sub=# SELECT * FROM t3; remote replication slot was not created automatically, the user must create it manually before the subscription can be activated. The steps to create the slot and activate the subscription are shown in the following examples. - These examples specify the standard logical decoding plugin + These examples specify the standard logical decoding output plugin (pgoutput), which is what the built-in logical replication uses. @@ -590,7 +593,7 @@ ALTER SUBSCRIPTION Example 2: Where the subscription says connect = false, but also specifies the - slot_name + slot_name option. @@ -684,6 +687,112 @@ ALTER SUBSCRIPTION + + Logical Replication Failover + + + To allow subscriber nodes to continue replicating data from the publisher + node even when the publisher node goes down, there must be a physical standby + corresponding to the publisher node. The logical slots on the primary server + corresponding to the subscriptions can be synchronized to the standby server by + specifying failover = true when creating subscriptions. See + for details. + Enabling the + failover + parameter ensures a seamless transition of those subscriptions after the + standby is promoted. They can continue subscribing to publications on the + new primary server. + + + + Because the slot synchronization logic copies asynchronously, it is + necessary to confirm that replication slots have been synced to the standby + server before the failover happens. To ensure a successful failover, the + standby server must be ahead of the subscriber. This can be achieved by + configuring + synchronized_standby_slots. + + + + To confirm that the standby server is indeed ready for failover, follow these + steps to verify that all necessary logical replication slots have been + synchronized to the standby server: + + + + + + On the subscriber node, use the following SQL to identify which replication + slots should be synced to the standby that we plan to promote. This query + will return the relevant replication slots associated with the + failover-enabled subscriptions. + +test_sub=# SELECT + array_agg(quote_literal(s.subslotname)) AS slots + FROM pg_subscription s + WHERE s.subfailover AND + s.subslotname IS NOT NULL; + slots +------- + {'sub1','sub2','sub3'} +(1 row) + + + + + On the subscriber node, use the following SQL to identify which table + synchronization slots should be synced to the standby that we plan to promote. + This query needs to be run on each database that includes the failover-enabled + subscription(s). Note that the table sync slot should be synced to the standby + server only if the table copy is finished + (See ). + We don't need to ensure that the table sync slots are synced in other scenarios + as they will either be dropped or re-created on the new primary server in those + cases. + +test_sub=# SELECT + array_agg(quote_literal(slot_name)) AS slots + FROM + ( + SELECT CONCAT('pg_', srsubid, '_sync_', srrelid, '_', ctl.system_identifier) AS slot_name + FROM pg_control_system() ctl, pg_subscription_rel r, pg_subscription s + WHERE r.srsubstate = 'f' AND s.oid = r.srsubid AND s.subfailover + ); + slots +------- + {'pg_16394_sync_16385_7394666715149055164'} +(1 row) + + + + + Check that the logical replication slots identified above exist on + the standby server and are ready for failover. + +test_standby=# SELECT slot_name, (synced AND NOT temporary AND NOT conflicting) AS failover_ready + FROM pg_replication_slots + WHERE slot_name IN + ('sub1','sub2','sub3', 'pg_16394_sync_16385_7394666715149055164'); + slot_name | failover_ready +--------------------------------------------+---------------- + sub1 | t + sub2 | t + sub3 | t + pg_16394_sync_16385_7394666715149055164 | t +(4 rows) + + + + + + If all the slots are present on the standby server and the result + (failover_ready) of the above SQL query is true, then + existing subscriptions can continue subscribing to publications now on the + new primary server. + + + + Row Filters @@ -709,7 +818,7 @@ ALTER SUBSCRIPTION then the row is not replicated. The WHERE clause expression is evaluated with the same role used for the replication connection (i.e. the role specified in the - CONNECTION + CONNECTION clause of the ). Row filters have no effect for TRUNCATE command. @@ -802,7 +911,7 @@ ALTER SUBSCRIPTION If the publication contains a partitioned table, the publication parameter - publish_via_partition_root + publish_via_partition_root determines which row filter is used. If publish_via_partition_root is true, the root partitioned table's row filter is used. Otherwise, if publish_via_partition_root @@ -831,7 +940,7 @@ ALTER SUBSCRIPTION Because initial data synchronization does not take into account the - publish + publish parameter when copying existing table data, some rows may be copied that would not be replicated using DML. Refer to , and see @@ -855,7 +964,7 @@ ALTER SUBSCRIPTION If the subscription has several publications in which the same table has been published with different row filters (for the same - publish + publish operation), those expressions get ORed together, so that rows satisfying any of the expressions will be replicated. This means all the other row filters for the same table become redundant if: @@ -868,14 +977,14 @@ ALTER SUBSCRIPTION One of the publications was created using - FOR ALL TABLES. + FOR ALL TABLES. This clause does not allow row filters. One of the publications was created using - FOR TABLES IN SCHEMA + FOR TABLES IN SCHEMA and the table belongs to the referred schema. This clause does not allow row filters. @@ -1142,7 +1251,7 @@ test_sub=# SELECT * FROM t1; The following examples show how the publication parameter - publish_via_partition_root + publish_via_partition_root determines whether the row filter of the parent or child table will be used in the case of partitioned tables. @@ -1285,9 +1394,9 @@ test_sub=# SELECT * FROM child ORDER BY a; - If no column list is specified, any columns added later are automatically - replicated. This means that having a column list which names all columns - is not the same as having no column list at all. + If no column list is specified, any columns added to the table later are + automatically replicated. This means that having a column list which names + all columns is not the same as having no column list at all. @@ -1297,13 +1406,13 @@ test_sub=# SELECT * FROM child ORDER BY a; Specifying a column list when the publication also publishes - FOR TABLES IN SCHEMA + FOR TABLES IN SCHEMA is not supported. For partitioned tables, the publication parameter - publish_via_partition_root + publish_via_partition_root determines which column list is used. If publish_via_partition_root is true, the root partitioned table's column list is used. Otherwise, if publish_via_partition_root is @@ -1349,7 +1458,8 @@ test_sub=# SELECT * FROM child ORDER BY a; If a subscription is affected by this problem, the only way to resume replication is to adjust one of the column lists on the publication side so that they all match; and then either recreate the subscription, - or use ALTER SUBSCRIPTION ... DROP PUBLICATION to + or use + ALTER SUBSCRIPTION ... DROP PUBLICATION to remove one of the offending publications and add it again. @@ -1504,15 +1614,17 @@ CONTEXT: processing remote data for replication origin "pg_16395" during "INSER the replication origin name can be found from the server log (LSN 0/14C0378 and replication origin pg_16395 in the above case). The transaction that produced the conflict can be skipped by using - ALTER SUBSCRIPTION ... SKIP with the finish LSN + ALTER SUBSCRIPTION ... SKIP + with the finish LSN (i.e., LSN 0/14C0378). The finish LSN could be an LSN at which the transaction is committed or prepared on the publisher. Alternatively, the transaction can also be skipped by calling the pg_replication_origin_advance() function. Before using this function, the subscription needs to be disabled temporarily - either by ALTER SUBSCRIPTION ... DISABLE or, the + either by + ALTER SUBSCRIPTION ... DISABLE or, the subscription can be used with the - disable_on_error + disable_on_error option. Then, you can use pg_replication_origin_advance() function with the node_name (i.e., pg_16395) and the next LSN of the finish LSN (i.e., 0/14C0379). The current position of @@ -1525,7 +1637,7 @@ CONTEXT: processing remote data for replication origin "pg_16395" during "INSER When the - streaming + streaming mode is parallel, the finish LSN of failed transactions may not be logged. In that case, it may be necessary to change the streaming mode to on or off and cause the same @@ -1618,10 +1730,23 @@ CONTEXT: processing remote data for replication origin "pg_16395" during "INSER using the identity and schema of the partitioned root table instead of that of the individual leaf partitions in which the changes actually originate (see - publish_via_partition_root + publish_via_partition_root parameter of CREATE PUBLICATION). + + + + When using + REPLICA IDENTITY FULL + on published tables, it is important to note that the UPDATE + and DELETE operations cannot be applied to subscribers + if the tables include attributes with datatypes (such as point or box) + that do not have a default operator class for B-tree or Hash. However, + this limitation can be overcome by ensuring that the table has a primary + key or replica identity defined for it. + + @@ -1643,7 +1768,8 @@ CONTEXT: processing remote data for replication origin "pg_16395" during "INSER implemented by walsender and apply processes. The walsender process starts logical decoding (described in ) of the WAL and loads the standard - logical decoding plugin (pgoutput). The plugin transforms the changes read + logical decoding output plugin (pgoutput). The plugin + transforms the changes read from WAL to the logical replication protocol (see ) and filters the data according to the publication specification. The data is then continuously @@ -1690,7 +1816,7 @@ CONTEXT: processing remote data for replication origin "pg_16395" during "INSER The publication - publish + publish parameter only affects what DML operations will be replicated. The initial data synchronization does not take this parameter into account when copying the existing table data. @@ -1724,7 +1850,7 @@ CONTEXT: processing remote data for replication origin "pg_16395" during "INSER zero rows in this view. If the initial data synchronization of any table is in progress, there will be additional workers for the tables being synchronized. Moreover, if the - streaming + streaming transaction is applied in parallel, there may be additional parallel apply workers. @@ -1775,7 +1901,7 @@ CONTEXT: processing remote data for replication origin "pg_16395" during "INSER - To create a subscription, the user must have the privileges of the + To create a subscription, the user must have the privileges of the pg_create_subscription role, as well as CREATE privileges on the database. diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml index cbd3aa804f77b..1c4ae38f1b992 100644 --- a/doc/src/sgml/logicaldecoding.sgml +++ b/doc/src/sgml/logicaldecoding.sgml @@ -144,7 +144,7 @@ postgres=# SELECT pg_drop_replication_slot('regression_slot'); - The following examples shows how logical decoding is controlled over the + The following examples show how logical decoding is controlled over the streaming replication protocol, using the program included in the PostgreSQL distribution. This requires that client authentication is set up to allow @@ -326,11 +326,12 @@ postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NU will work but only while the connection is alive (for example a node restart would break it). Then, the primary may delete system catalog rows that could be needed by the logical decoding on the standby (as it does - not know about the catalog_xmin on the standby). Existing logical slots - on standby also get invalidated if wal_level on the - primary is reduced to less than logical. + not know about the catalog_xmin on the standby). + Existing logical slots on standby also get invalidated if + wal_level on the primary is reduced to less than + logical. This is done as soon as the standby detects such a change in the WAL stream. - It means that, for walsenders which are lagging (if any), some WAL records up + It means that, for walsenders that are lagging (if any), some WAL records up to the wal_level parameter change on the primary won't be decoded. @@ -357,6 +358,77 @@ postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NU So if a slot is no longer required it should be dropped.
+ + + + + Replication Slot Synchronization + + The logical replication slots on the primary can be synchronized to + the hot standby by using the failover parameter of + + pg_create_logical_replication_slot, or by + using the + failover option of + CREATE SUBSCRIPTION during slot creation, and then calling + + pg_sync_replication_slots + on the standby. By setting + sync_replication_slots + on the standby, the failover slots can be synchronized periodically in + the slotsync worker. For the synchronization to work, it is mandatory to + have a physical replication slot between the primary and the standby (i.e., + primary_slot_name + should be configured on the standby), and + hot_standby_feedback + must be enabled on the standby. It is also necessary to specify a valid + dbname in the + primary_conninfo. + It's highly recommended that the said physical replication slot is named in + synchronized_standby_slots + list on the primary, to prevent the subscriber from consuming changes + faster than the hot standby. Even when correctly configured, some latency + is expected when sending changes to logical subscribers due to the waiting + on slots named in + synchronized_standby_slots. + When synchronized_standby_slots is utilized, the + primary server will not completely shut down until the corresponding + standbys, associated with the physical replication slots specified + in synchronized_standby_slots, have confirmed + receiving the WAL up to the latest flushed position on the primary server. + + + + The ability to resume logical replication after failover depends upon the + pg_replication_slots.synced + value for the synchronized slots on the standby at the time of failover. + Only persistent slots that have attained synced state as true on the standby + before failover can be used for logical replication after failover. + Temporary synced slots cannot be used for logical decoding, therefore + logical replication for those slots cannot be resumed. For example, if the + synchronized slot could not become persistent on the standby due to a + disabled subscription, then the subscription cannot be resumed after + failover even when it is enabled. + + + + To resume logical replication after failover from the synced logical + slots, the subscription's 'conninfo' must be altered to point to the + new primary server. This is done using + ALTER SUBSCRIPTION ... CONNECTION. + It is recommended that subscriptions are first disabled before promoting + the standby and are re-enabled after altering the connection string. + + + + There is a chance that the old primary is up again during the promotion + and if subscriptions are not disabled, the logical subscribers may + continue to receive data from the old primary server even after promotion + until the connection string is altered. This might result in data + inconsistency issues, preventing the logical subscribers from being + able to continue replication from the new primary server. + + @@ -1196,9 +1268,8 @@ OutputPluginWrite(ctx, true); - Note that these commands that can cause deadlock apply to not only explicitly - indicated system catalog tables above but also to any other [user] catalog - table. + Note that these commands can cause deadlocks not only for the system + catalog tables listed above but for other catalog tables.
diff --git a/doc/src/sgml/ltree.sgml b/doc/src/sgml/ltree.sgml index 00a6ae70da327..9584105b03b39 100644 --- a/doc/src/sgml/ltree.sgml +++ b/doc/src/sgml/ltree.sgml @@ -623,6 +623,13 @@ Europe & Russia*@ & !Transportation >=, > + + + Hash index over ltree: + = + + + GiST index over ltree (gist_ltree_ops @@ -712,6 +719,7 @@ INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Galaxies'); INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Astronauts'); CREATE INDEX path_gist_idx ON test USING GIST (path); CREATE INDEX path_idx ON test USING BTREE (path); +CREATE INDEX path_hash_idx ON test USING HASH (path); diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml index 9cf9d030a8a04..89040942be2fe 100644 --- a/doc/src/sgml/maintenance.sgml +++ b/doc/src/sgml/maintenance.sgml @@ -656,33 +656,84 @@ SELECT datname, age(datfrozenxid) FROM pg_database; WARNING: database "mydb" must be vacuumed within 39985967 transactions -HINT: To avoid a database shutdown, execute a database-wide VACUUM in that database. +HINT: To avoid XID assignment failures, execute a database-wide VACUUM in that database. (A manual VACUUM should fix the problem, as suggested by the - hint; but note that the VACUUM must be performed by a - superuser, else it will fail to process system catalogs and thus not - be able to advance the database's datfrozenxid.) - If these warnings are - ignored, the system will shut down and refuse to start any new - transactions once there are fewer than three million transactions left - until wraparound: + hint; but note that the VACUUM should be performed by a + superuser, else it will fail to process system catalogs, which prevent it from + being able to advance the database's datfrozenxid.) + If these warnings are ignored, the system will refuse to assign new XIDs once + there are fewer than three million transactions left until wraparound: -ERROR: database is not accepting commands to avoid wraparound data loss in database "mydb" -HINT: Stop the postmaster and vacuum that database in single-user mode. +ERROR: database is not accepting commands that assign new XIDs to avoid wraparound data loss in database "mydb" +HINT: Execute a database-wide VACUUM in that database. - The three-million-transaction safety margin exists to let the - administrator recover without data loss, by manually executing the - required VACUUM commands. However, since the system will not - execute commands once it has gone into the safety shutdown mode, - the only way to do this is to stop the server and start the server in single-user - mode to execute VACUUM. The shutdown mode is not enforced - in single-user mode. See the reference - page for details about using single-user mode. + In this condition any transactions already in progress can continue, + but only read-only transactions can be started. Operations that + modify database records or truncate relations will fail. + The VACUUM command can still be run normally. + Note that, contrary to what was sometimes recommended in earlier releases, + it is not necessary or desirable to stop the postmaster or enter single + user-mode in order to restore normal operation. + Instead, follow these steps: + + + + Resolve old prepared transactions. You can find these by checking + pg_prepared_xacts for rows where + age(transactionid) is large. Such transactions should be + committed or rolled back. + + + End long-running open transactions. You can find these by checking + pg_stat_activity for rows where + age(backend_xid) or age(backend_xmin) is + large. Such transactions should be committed or rolled back, or the session + can be terminated using pg_terminate_backend. + + + Drop any old replication slots. Use + pg_stat_replication to + find slots where age(xmin) or age(catalog_xmin) + is large. In many cases, such slots were created for replication to servers that no + longer exist, or that have been down for a long time. If you drop a slot for a server + that still exists and might still try to connect to that slot, that replica may + need to be rebuilt. + + + Execute VACUUM in the target database. A database-wide + VACUUM is simplest; to reduce the time required, it as also possible + to issue manual VACUUM commands on the tables where + relminxid is oldest. Do not use VACUUM FULL + in this scenario, because it requires an XID and will therefore fail, except in super-user + mode, where it will instead consume an XID and thus increase the risk of transaction ID + wraparound. Do not use VACUUM FREEZE either, because it will do + more than the minimum amount of work required to restore normal operation. + + + Once normal operation is restored, ensure that autovacuum is properly configured + in the target database in order to avoid future problems. + + + + + In earlier versions, it was sometimes necessary to stop the postmaster and + VACUUM the database in a single-user mode. In typical scenarios, this + is no longer necessary, and should be avoided whenever possible, since it involves taking + the system down. It is also riskier, since it disables transaction ID wraparound safeguards + that are designed to prevent data loss. The only reason to use single-user mode in this + scenario is if you wish to TRUNCATE or DROP unneeded + tables to avoid needing to VACUUM them. The three-million-transaction + safety margin exists to let the administrator do this. See the + reference page for details about using single-user mode. + + + Multixacts and Wraparound @@ -742,11 +793,44 @@ HINT: Stop the postmaster and vacuum that database in single-user mode. As a safety device, an aggressive vacuum scan will occur for any table whose multixact-age is greater than . Also, if the - storage occupied by multixacts members exceeds 2GB, aggressive vacuum + storage occupied by multixacts members exceeds about 10GB, aggressive vacuum scans will occur more often for all tables, starting with those that have the oldest multixact-age. Both of these kinds of aggressive - scans will occur even if autovacuum is nominally disabled. + scans will occur even if autovacuum is nominally disabled. The members storage + area can grow up to about 20GB before reaching wraparound. + + + Similar to the XID case, if autovacuum fails to clear old MXIDs from a table, the + system will begin to emit warning messages when the database's oldest MXIDs reach forty + million transactions from the wraparound point. And, just as in the XID case, if these + warnings are ignored, the system will refuse to generate new MXIDs once there are fewer + than three million left until wraparound. + + + + Normal operation when MXIDs are exhausted can be restored in much the same way as + when XIDs are exhausted. Follow the same steps in the previous section, but with the + following differences: + + + + Running transactions and prepared transactions can be ignored if there + is no chance that they might appear in a multixact. + + + MXID information is not directly visible in system views such as + pg_stat_activity; however, looking for old XIDs is still a good + way of determining which transactions are causing MXID wraparound problems. + + + XID exhaustion will block all write transactions, but MXID exhaustion will + only block a subset of write transactions, specifically those that involve + row locks that require an MXID. + + + + @@ -841,10 +925,9 @@ vacuum insert threshold = vacuum base insert threshold + vacuum insert scale fac as this may allow tuples to be frozen by earlier vacuums. The number of obsolete tuples and the number of inserted tuples are obtained from the cumulative statistics system; - it is a semi-accurate count updated by each UPDATE, - DELETE and INSERT operation. (It is - only semi-accurate because some information might be lost under heavy - load.) If the relfrozenxid value of the table + it is an eventually-consistent count updated by each UPDATE, + DELETE and INSERT operation. + If the relfrozenxid value of the table is more than vacuum_freeze_table_age transactions old, an aggressive vacuum is performed to freeze old tuples and advance relfrozenxid; otherwise, only pages that have been modified @@ -861,10 +944,15 @@ analyze threshold = analyze base threshold + analyze scale factor * number of tu - Partitioned tables are not processed by autovacuum. Statistics - should be collected by running a manual ANALYZE when it is - first populated, and again whenever the distribution of data in its - partitions changes significantly. + Partitioned tables do not directly store tuples and consequently + are not processed by autovacuum. (Autovacuum does process table + partitions just like other tables.) Unfortunately, this means that + autovacuum does not run ANALYZE on partitioned + tables, and this can cause suboptimal plans for queries that reference + partitioned table statistics. You can work around this problem by + manually running ANALYZE on partitioned tables + when they are first populated, and again whenever the distribution + of data in their partitions changes significantly. diff --git a/doc/src/sgml/manage-ag.sgml b/doc/src/sgml/manage-ag.sgml index 192c500994545..a8a70a1fc4242 100644 --- a/doc/src/sgml/manage-ag.sgml +++ b/doc/src/sgml/manage-ag.sgml @@ -213,6 +213,12 @@ createdb -O rolename dbname + + However, CREATE DATABASE does not copy database-level + GRANT permissions attached to the source database. + The new database has default database-level permissions. + + There is a second standard system database named template0.template0 This @@ -498,7 +504,7 @@ CREATE TABLE foo(i int); Two tablespaces are automatically created when the database cluster is initialized. The - pg_global tablespace is used for shared system catalogs. The + pg_global tablespace is used only for shared system catalogs. The pg_default tablespace is the default tablespace of the template1 and template0 databases (and, therefore, will be the default tablespace for other databases as well, unless diff --git a/doc/src/sgml/meson.build b/doc/src/sgml/meson.build index c6d77b5a1504c..e418de83a76e1 100644 --- a/doc/src/sgml/meson.build +++ b/doc/src/sgml/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group docs = [] installdocs = [] @@ -46,6 +46,18 @@ doc_generated += custom_target('errcodes-table.sgml', capture: true, ) +doc_generated += custom_target('wait_event_types.sgml', + input: files( + '../../../src/backend/utils/activity/wait_event_names.txt'), + output: 'wait_event_types.sgml', + command: [perl, + files('../../../src/backend/utils/activity/generate-wait_event_types.pl'), + '--outdir', '@OUTDIR@', '--docs', '@INPUT@'], + build_by_default: false, + install: false, + capture: false, +) + # FIXME: this actually has further inputs, adding depfile support to # generate-keywords-table.pl is probably the best way to address that # robustly. @@ -59,6 +71,15 @@ doc_generated += custom_target('keywords-table.sgml', capture: true, ) +doc_generated += custom_target('targets-meson.sgml', + input: files('targets-meson.txt'), + output: 'targets-meson.sgml', + command: [perl, files('generate-targets-meson.pl'), '@INPUT@'], + build_by_default: false, + install: false, + capture: true, +) + # For everything else we need at least xmllint if not xmllint_bin.found() subdir_done() @@ -130,7 +151,8 @@ if docs_dep.found() '--install-dir-contents', dir_doc_html, html], build_always_stale: true, build_by_default: false, ) - alias_target('install-doc-html', install_doc_html) + alias_target('html', html) + alias_target('install-html', install_doc_html) # build and install multi-page html docs as part of docs target docs += html @@ -160,43 +182,6 @@ if docs_dep.found() endif -# -# INSTALL in html, text -# -if docs_dep.found() - # Depend on postgres_full_xml, so validity errors are raised in one place, - # and so dependencies don't need to be re-specified. - install_xml = custom_target('INSTALL.xml', - input: ['standalone-profile.xsl', 'standalone-install.xml'], - output: 'INSTALL.xml', - depfile: 'INSTALL.xml.d', - depends: postgres_full_xml, - command: [xsltproc, '-o', '@OUTPUT@', xsltproc_flags, '--xinclude', '@INPUT@'], - build_by_default: false, - ) - install_html = custom_target('INSTALL.html', - input: ['stylesheet-text.xsl', install_xml], - output: 'INSTALL.html', - depfile: 'INSTALL.html.d', - command: [xsltproc, '-o', '@OUTPUT@', xsltproc_html_flags, '@INPUT@'], - build_by_default: false, - ) - alldocs += install_html - - if pandoc.found() - # XXX: Makefile does an iconv translit here, but unclear why? - install = custom_target('INSTALL', - input: [install_html], - output: 'INSTALL', - command: [pandoc, '-t', 'plain', '-o', '@OUTPUT@', '@INPUT@'], - build_by_default: false, - ) - alldocs += install - endif - -endif - - # # Man pages # @@ -213,16 +198,18 @@ if docs_dep.found() install_doc_man = custom_target('install-man', output: 'install-man', + input: man, command: [ python, install_files, '--prefix', dir_prefix, - '--install-dirs', dir_man, man], + '--install-dirs', dir_man, '@INPUT@'], build_always_stale: true, build_by_default: false, ) - alias_target('install-doc-man', install_doc_man) + alias_target('man', man) + alias_target('install-man', install_doc_man) - # even though we don't want to build man pages as part of 'docs', we do want - # to install them as part of install-docs + # built and installed as part of the docs target installdocs += install_doc_man + docs += man endif diff --git a/doc/src/sgml/mk_feature_tables.pl b/doc/src/sgml/mk_feature_tables.pl index 824be729a0384..69b1d3a1a7389 100644 --- a/doc/src/sgml/mk_feature_tables.pl +++ b/doc/src/sgml/mk_feature_tables.pl @@ -3,7 +3,7 @@ # doc/src/sgml/mk_feature_tables.pl use strict; -use warnings; +use warnings FATAL => 'all'; my $yesno = $ARGV[0]; diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 5cfdc70c03fd1..d73c627382ace 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -180,12 +180,12 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser The parameter enables monitoring - of block read and write times. + of block read, write, extend, and fsync times. The parameter enables monitoring - of WAL write times. + of WAL write and fsync times. @@ -261,7 +261,7 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser unnecessary and can be avoided by setting stats_fetch_consistency to none. - You can invoke pg_stat_clear_snapshot() to discard the + You can invoke pg_stat_clear_snapshot() to discard the current transaction's statistics snapshot or cached values (if any). The next use of statistical information will (when in snapshot mode) cause a new snapshot to be built or (when in cache mode) accessed statistics to be @@ -451,6 +451,15 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser + + pg_stat_checkpointerpg_stat_checkpointer + One row only, showing statistics about the + checkpointer process's activity. See + + pg_stat_checkpointer for details. + + + pg_stat_databasepg_stat_database One row per database, showing database-wide statistics. See @@ -990,7 +999,8 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser client backend, checkpointer, archiver, standalone backend, startup, walreceiver, - walsender and walwriter. + walsender, walwriter and + walsummarizer. In addition, background workers registered by extensions may have additional types. @@ -1024,1345 +1034,94 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser Activity The server process is idle. This event type indicates a process - waiting for activity in its main processing loop. - wait_event will identify the specific wait point; - see . - - - - BufferPin - The server process is waiting for exclusive access to - a data buffer. Buffer pin waits can be protracted if - another process holds an open cursor that last read data from the - buffer in question. See . - - - - Client - The server process is waiting for activity on a socket - connected to a user application. Thus, the server expects something - to happen that is independent of its internal processes. - wait_event will identify the specific wait point; - see . - - - - Extension - The server process is waiting for some condition defined by an - extension module. - See . - - - - IO - The server process is waiting for an I/O operation to complete. - wait_event will identify the specific wait point; - see . - - - - IPC - The server process is waiting for some interaction with - another server process. wait_event will - identify the specific wait point; - see . - - - - Lock - The server process is waiting for a heavyweight lock. - Heavyweight locks, also known as lock manager locks or simply locks, - primarily protect SQL-visible objects such as tables. However, - they are also used to ensure mutual exclusion for certain internal - operations such as relation extension. wait_event - will identify the type of lock awaited; - see . - - - - LWLock - The server process is waiting for a lightweight lock. - Most such locks protect a particular data structure in shared memory. - wait_event will contain a name identifying the purpose - of the lightweight lock. (Some locks have specific names; others - are part of a group of locks each with a similar purpose.) - See . - - - - Timeout - The server process is waiting for a timeout - to expire. wait_event will identify the specific wait - point; see . - - - - - - - - Wait Events of Type <literal>Activity</literal> - - - - Activity Wait Event - Description - - - - - - ArchiverMain - Waiting in main loop of archiver process. - - - AutoVacuumMain - Waiting in main loop of autovacuum launcher process. - - - BgWriterHibernate - Waiting in background writer process, hibernating. - - - BgWriterMain - Waiting in main loop of background writer process. - - - CheckpointerMain - Waiting in main loop of checkpointer process. - - - LogicalApplyMain - Waiting in main loop of logical replication apply process. - - - LogicalLauncherMain - Waiting in main loop of logical replication launcher process. - - - LogicalParallelApplyMain - Waiting in main loop of logical replication parallel apply - process. - - - RecoveryWalStream - Waiting in main loop of startup process for WAL to arrive, during - streaming recovery. - - - SysLoggerMain - Waiting in main loop of syslogger process. - - - WalReceiverMain - Waiting in main loop of WAL receiver process. - - - WalSenderMain - Waiting in main loop of WAL sender process. - - - WalWriterMain - Waiting in main loop of WAL writer process. - - - -
- - - Wait Events of Type <literal>BufferPin</literal> - - - - BufferPin Wait Event - Description - - - - - - BufferPin - Waiting to acquire an exclusive pin on a buffer. - - - -
- - - Wait Events of Type <literal>Client</literal> - - - - Client Wait Event - Description - - - - - - ClientRead - Waiting to read data from the client. - - - ClientWrite - Waiting to write data to the client. - - - GSSOpenServer - Waiting to read data from the client while establishing a GSSAPI - session. - - - LibPQWalReceiverConnect - Waiting in WAL receiver to establish connection to remote - server. - - - LibPQWalReceiverReceive - Waiting in WAL receiver to receive data from remote server. - - - SSLOpenServer - Waiting for SSL while attempting connection. - - - WalSenderWaitForWAL - Waiting for WAL to be flushed in WAL sender process. - - - WalSenderWriteData - Waiting for any activity when processing replies from WAL - receiver in WAL sender process. - - - -
- - - Wait Events of Type <literal>Extension</literal> - - - - Extension Wait Event - Description - - - - - - Extension - Waiting in an extension. - - - -
- - - Wait Events of Type <literal>IO</literal> - - - - IO Wait Event - Description - - - - - - BaseBackupRead - Waiting for base backup to read from a file. - - - BaseBackupSync - Waiting for data written by a base backup to reach durable storage. - - - BaseBackupWrite - Waiting for base backup to write to a file. - - - BufFileRead - Waiting for a read from a buffered file. - - - BufFileTruncate - Waiting for a buffered file to be truncated. - - - BufFileWrite - Waiting for a write to a buffered file. - - - ControlFileRead - Waiting for a read from the pg_control - file. - - - ControlFileSync - Waiting for the pg_control file to reach - durable storage. - - - ControlFileSyncUpdate - Waiting for an update to the pg_control file - to reach durable storage. - - - ControlFileWrite - Waiting for a write to the pg_control - file. - - - ControlFileWriteUpdate - Waiting for a write to update the pg_control - file. - - - CopyFileRead - Waiting for a read during a file copy operation. - - - CopyFileWrite - Waiting for a write during a file copy operation. - - - DSMAllocate - Waiting for a dynamic shared memory segment to be - allocated. - - - DSMFillZeroWrite - Waiting to fill a dynamic shared memory backing file with - zeroes. - - - DataFileExtend - Waiting for a relation data file to be extended. - - - DataFileFlush - Waiting for a relation data file to reach durable storage. - - - DataFileImmediateSync - Waiting for an immediate synchronization of a relation data file to - durable storage. - - - DataFilePrefetch - Waiting for an asynchronous prefetch from a relation data - file. - - - DataFileRead - Waiting for a read from a relation data file. - - - DataFileSync - Waiting for changes to a relation data file to reach durable storage. - - - DataFileTruncate - Waiting for a relation data file to be truncated. - - - DataFileWrite - Waiting for a write to a relation data file. - - - LockFileAddToDataDirRead - Waiting for a read while adding a line to the data directory lock - file. - - - LockFileAddToDataDirSync - Waiting for data to reach durable storage while adding a line to the - data directory lock file. - - - LockFileAddToDataDirWrite - Waiting for a write while adding a line to the data directory - lock file. - - - LockFileCreateRead - Waiting to read while creating the data directory lock - file. - - - LockFileCreateSync - Waiting for data to reach durable storage while creating the data - directory lock file. - - - LockFileCreateWrite - Waiting for a write while creating the data directory lock - file. - - - LockFileReCheckDataDirRead - Waiting for a read during recheck of the data directory lock - file. - - - LogicalRewriteCheckpointSync - Waiting for logical rewrite mappings to reach durable storage - during a checkpoint. - - - LogicalRewriteMappingSync - Waiting for mapping data to reach durable storage during a logical - rewrite. - - - LogicalRewriteMappingWrite - Waiting for a write of mapping data during a logical - rewrite. - - - LogicalRewriteSync - Waiting for logical rewrite mappings to reach durable - storage. - - - LogicalRewriteTruncate - Waiting for truncate of mapping data during a logical - rewrite. - - - LogicalRewriteWrite - Waiting for a write of logical rewrite mappings. - - - RelationMapRead - Waiting for a read of the relation map file. - - - RelationMapReplace - Waiting for durable replacement of a relation map file. - - - RelationMapWrite - Waiting for a write to the relation map file. - - - ReorderBufferRead - Waiting for a read during reorder buffer management. - - - ReorderBufferWrite - Waiting for a write during reorder buffer management. - - - ReorderLogicalMappingRead - Waiting for a read of a logical mapping during reorder buffer - management. - - - ReplicationSlotRead - Waiting for a read from a replication slot control file. - - - ReplicationSlotRestoreSync - Waiting for a replication slot control file to reach durable storage - while restoring it to memory. - - - ReplicationSlotSync - Waiting for a replication slot control file to reach durable - storage. - - - ReplicationSlotWrite - Waiting for a write to a replication slot control file. - - - SLRUFlushSync - Waiting for SLRU data to reach durable storage during a checkpoint - or database shutdown. - - - SLRURead - Waiting for a read of an SLRU page. - - - SLRUSync - Waiting for SLRU data to reach durable storage following a page - write. - - - SLRUWrite - Waiting for a write of an SLRU page. - - - SnapbuildRead - Waiting for a read of a serialized historical catalog - snapshot. - - - SnapbuildSync - Waiting for a serialized historical catalog snapshot to reach - durable storage. - - - SnapbuildWrite - Waiting for a write of a serialized historical catalog - snapshot. - - - TimelineHistoryFileSync - Waiting for a timeline history file received via streaming - replication to reach durable storage. - - - TimelineHistoryFileWrite - Waiting for a write of a timeline history file received via - streaming replication. - - - TimelineHistoryRead - Waiting for a read of a timeline history file. - - - TimelineHistorySync - Waiting for a newly created timeline history file to reach durable - storage. - - - TimelineHistoryWrite - Waiting for a write of a newly created timeline history - file. - - - TwophaseFileRead - Waiting for a read of a two phase state file. - - - TwophaseFileSync - Waiting for a two phase state file to reach durable storage. - - - TwophaseFileWrite - Waiting for a write of a two phase state file. - - - VersionFileWrite - Waiting for the version file to be written while creating a database. - - - WALBootstrapSync - Waiting for WAL to reach durable storage during - bootstrapping. - - - WALBootstrapWrite - Waiting for a write of a WAL page during bootstrapping. - - - WALCopyRead - Waiting for a read when creating a new WAL segment by copying an - existing one. - - - WALCopySync - Waiting for a new WAL segment created by copying an existing one to - reach durable storage. - - - WALCopyWrite - Waiting for a write when creating a new WAL segment by copying an - existing one. - - - WALInitSync - Waiting for a newly initialized WAL file to reach durable - storage. - - - WALInitWrite - Waiting for a write while initializing a new WAL file. - - - WALRead - Waiting for a read from a WAL file. - - - WALSenderTimelineHistoryRead - Waiting for a read from a timeline history file during a walsender - timeline command. - - - WALSync - Waiting for a WAL file to reach durable storage. - - - WALSyncMethodAssign - Waiting for data to reach durable storage while assigning a new - WAL sync method. - - - WALWrite - Waiting for a write to a WAL file. - - - -
- - - Wait Events of Type <literal>IPC</literal> - - - - IPC Wait Event - Description - - - - - - AppendReady - Waiting for subplan nodes of an Append plan - node to be ready. - - - ArchiveCleanupCommand - Waiting for to - complete. - - - ArchiveCommand - Waiting for to - complete. - - - BackendTermination - Waiting for the termination of another backend. - - - BackupWaitWalArchive - Waiting for WAL files required for a backup to be successfully - archived. - - - BgWorkerShutdown - Waiting for background worker to shut down. - - - BgWorkerStartup - Waiting for background worker to start up. - - - BtreePage - Waiting for the page number needed to continue a parallel B-tree - scan to become available. - - - BufferIO - Waiting for buffer I/O to complete. - - - CheckpointDone - Waiting for a checkpoint to complete. - - - CheckpointStart - Waiting for a checkpoint to start. - - - ExecuteGather - Waiting for activity from a child process while - executing a Gather plan node. - - - HashBatchAllocate - Waiting for an elected Parallel Hash participant to allocate a hash - table. - - - HashBatchElect - Waiting to elect a Parallel Hash participant to allocate a hash - table. - - - HashBatchLoad - Waiting for other Parallel Hash participants to finish loading a - hash table. - - - HashBuildAllocate - Waiting for an elected Parallel Hash participant to allocate the - initial hash table. - - - HashBuildElect - Waiting to elect a Parallel Hash participant to allocate the - initial hash table. - - - HashBuildHashInner - Waiting for other Parallel Hash participants to finish hashing the - inner relation. - - - HashBuildHashOuter - Waiting for other Parallel Hash participants to finish partitioning - the outer relation. - - - HashGrowBatchesDecide - Waiting to elect a Parallel Hash participant to decide on future - batch growth. - - - HashGrowBatchesElect - Waiting to elect a Parallel Hash participant to allocate more - batches. - - - HashGrowBatchesFinish - Waiting for an elected Parallel Hash participant to decide on - future batch growth. - - - HashGrowBatchesReallocate - Waiting for an elected Parallel Hash participant to allocate more - batches. - - - HashGrowBatchesRepartition - Waiting for other Parallel Hash participants to finish - repartitioning. - - - HashGrowBucketsElect - Waiting to elect a Parallel Hash participant to allocate more - buckets. - - - HashGrowBucketsReallocate - Waiting for an elected Parallel Hash participant to finish - allocating more buckets. - - - HashGrowBucketsReinsert - Waiting for other Parallel Hash participants to finish inserting - tuples into new buckets. - - - LogicalApplySendData - Waiting for a logical replication leader apply process to send - data to a parallel apply process. - - - LogicalParallelApplyStateChange - Waiting for a logical replication parallel apply process to change - state. - - - LogicalSyncData - Waiting for a logical replication remote server to send data for - initial table synchronization. - - - LogicalSyncStateChange - Waiting for a logical replication remote server to change - state. - - - MessageQueueInternal - Waiting for another process to be attached to a shared message - queue. - - - MessageQueuePutMessage - Waiting to write a protocol message to a shared message queue. - - - MessageQueueReceive - Waiting to receive bytes from a shared message queue. - - - MessageQueueSend - Waiting to send bytes to a shared message queue. - - - ParallelBitmapScan - Waiting for parallel bitmap scan to become initialized. - - - ParallelCreateIndexScan - Waiting for parallel CREATE INDEX workers to - finish heap scan. - - - ParallelFinish - Waiting for parallel workers to finish computing. - - - ProcArrayGroupUpdate - Waiting for the group leader to clear the transaction ID at - end of a parallel operation. - - - ProcSignalBarrier - Waiting for a barrier event to be processed by all - backends. - - - Promote - Waiting for standby promotion. - - - RecoveryConflictSnapshot - Waiting for recovery conflict resolution for a vacuum - cleanup. - - - RecoveryConflictTablespace - Waiting for recovery conflict resolution for dropping a - tablespace. - - - RecoveryEndCommand - Waiting for to - complete. - - - RecoveryPause - Waiting for recovery to be resumed. - - - ReplicationOriginDrop - Waiting for a replication origin to become inactive so it can be - dropped. - - - ReplicationSlotDrop - Waiting for a replication slot to become inactive so it can be - dropped. - - - RestoreCommand - Waiting for to - complete. - - - SafeSnapshot - Waiting to obtain a valid snapshot for a READ ONLY - DEFERRABLE transaction. - - - SyncRep - Waiting for confirmation from a remote server during synchronous - replication. - - - WalReceiverExit - Waiting for the WAL receiver to exit. - - - WalReceiverWaitStart - Waiting for startup process to send initial data for streaming - replication. - - - XactGroupUpdate - Waiting for the group leader to update transaction status at - end of a parallel operation. - - - -
- - - Wait Events of Type <literal>Lock</literal> - - - - Lock Wait Event - Description - - - - - - advisory - Waiting to acquire an advisory user lock. - - - applytransaction - Waiting to acquire a lock on a remote transaction being applied - by a logical replication subscriber. - - - extend - Waiting to extend a relation. - - - frozenid - Waiting to - update pg_database.datfrozenxid - and pg_database.datminmxid. - - - object - Waiting to acquire a lock on a non-relation database object. - - - page - Waiting to acquire a lock on a page of a relation. - - - relation - Waiting to acquire a lock on a relation. - - - spectoken - Waiting to acquire a speculative insertion lock. - - - transactionid - Waiting for a transaction to finish. - - - tuple - Waiting to acquire a lock on a tuple. - - - userlock - Waiting to acquire a user lock. - - - virtualxid - Waiting to acquire a virtual transaction ID lock; see - . - - - -
- - - Wait Events of Type <literal>LWLock</literal> - - - - LWLock Wait Event - Description - - - - - - AddinShmemInit - Waiting to manage an extension's space allocation in shared - memory. - - - AutoFile - Waiting to update the postgresql.auto.conf - file. - - - Autovacuum - Waiting to read or update the current state of autovacuum - workers. - - - AutovacuumSchedule - Waiting to ensure that a table selected for autovacuum - still needs vacuuming. - - - BackgroundWorker - Waiting to read or update background worker state. - - - BtreeVacuum - Waiting to read or update vacuum-related information for a - B-tree index. - - - BufferContent - Waiting to access a data page in memory. - - - BufferMapping - Waiting to associate a data block with a buffer in the buffer - pool. - - - CheckpointerComm - Waiting to manage fsync requests. - - - CommitTs - Waiting to read or update the last value set for a - transaction commit timestamp. - - - CommitTsBuffer - Waiting for I/O on a commit timestamp SLRU buffer. - - - CommitTsSLRU - Waiting to access the commit timestamp SLRU cache. - - - ControlFile - Waiting to read or update the pg_control - file or create a new WAL file. - - - DynamicSharedMemoryControl - Waiting to read or update dynamic shared memory allocation - information. - - - LockFastPath - Waiting to read or update a process' fast-path lock - information. - - - LockManager - Waiting to read or update information - about heavyweight locks. - - - LogicalRepLauncherDSA - Waiting to access logical replication launcher's dynamic shared - memory allocator. - - - LogicalRepLauncherHash - Waiting to access logical replication launcher's shared - hash table. - - - LogicalRepWorker - Waiting to read or update the state of logical replication - workers. - - - MultiXactGen - Waiting to read or update shared multixact state. - - - MultiXactMemberBuffer - Waiting for I/O on a multixact member SLRU buffer. - - - MultiXactMemberSLRU - Waiting to access the multixact member SLRU cache. - - - MultiXactOffsetBuffer - Waiting for I/O on a multixact offset SLRU buffer. - - - MultiXactOffsetSLRU - Waiting to access the multixact offset SLRU cache. - - - MultiXactTruncation - Waiting to read or truncate multixact information. - - - NotifyBuffer - Waiting for I/O on a NOTIFY message SLRU - buffer. - - - NotifyQueue - Waiting to read or update NOTIFY messages. - - - NotifyQueueTail - Waiting to update limit on NOTIFY message - storage. - - - NotifySLRU - Waiting to access the NOTIFY message SLRU - cache. - - - OidGen - Waiting to allocate a new OID. - - - OldSnapshotTimeMap - Waiting to read or update old snapshot control information. - - - ParallelAppend - Waiting to choose the next subplan during Parallel Append plan - execution. - - - ParallelHashJoin - Waiting to synchronize workers during Parallel Hash Join plan - execution. - - - ParallelQueryDSA - Waiting for parallel query dynamic shared memory allocation. - - - PerSessionDSA - Waiting for parallel query dynamic shared memory allocation. - - - PerSessionRecordType - Waiting to access a parallel query's information about composite - types. - - - PerSessionRecordTypmod - Waiting to access a parallel query's information about type - modifiers that identify anonymous record types. - - - PerXactPredicateList - Waiting to access the list of predicate locks held by the current - serializable transaction during a parallel query. - - - PgStatsData - Waiting for shared memory stats data access - - - PgStatsDSA - Waiting for stats dynamic shared memory allocator access - - - PgStatsHash - Waiting for stats shared memory hash table access - - - PredicateLockManager - Waiting to access predicate lock information used by - serializable transactions. - - - ProcArray - Waiting to access the shared per-process data structures - (typically, to get a snapshot or report a session's transaction - ID). - - - RelationMapping - Waiting to read or update - a pg_filenode.map file (used to track the - filenode assignments of certain system catalogs). - - - RelCacheInit - Waiting to read or update a pg_internal.init - relation cache initialization file. - - - ReplicationOrigin - Waiting to create, drop or use a replication origin. - - - ReplicationOriginState - Waiting to read or update the progress of one replication - origin. - - - ReplicationSlotAllocation - Waiting to allocate or free a replication slot. - - - ReplicationSlotControl - Waiting to read or update replication slot state. - - - ReplicationSlotIO - Waiting for I/O on a replication slot. - - - SerialBuffer - Waiting for I/O on a serializable transaction conflict SLRU - buffer. - - - SerializableFinishedList - Waiting to access the list of finished serializable - transactions. - - - SerializablePredicateList - Waiting to access the list of predicate locks held by - serializable transactions. - - - SerializableXactHash - Waiting to read or update information about serializable - transactions. - - - SerialSLRU - Waiting to access the serializable transaction conflict SLRU - cache. - - - SharedTidBitmap - Waiting to access a shared TID bitmap during a parallel bitmap - index scan. - - - SharedTupleStore - Waiting to access a shared tuple store during parallel - query. - - - ShmemIndex - Waiting to find or allocate space in shared memory. - - - SInvalRead - Waiting to retrieve messages from the shared catalog invalidation - queue. - - - SInvalWrite - Waiting to add a message to the shared catalog invalidation - queue. - - - SubtransBuffer - Waiting for I/O on a sub-transaction SLRU buffer. - - - SubtransSLRU - Waiting to access the sub-transaction SLRU cache. - - - SyncRep - Waiting to read or update information about the state of - synchronous replication. - - - SyncScan - Waiting to select the starting location of a synchronized table - scan. - - - TablespaceCreate - Waiting to create or drop a tablespace. - - - TwoPhaseState - Waiting to read or update the state of prepared transactions. - - - WALBufMapping - Waiting to replace a page in WAL buffers. - - - WALInsert - Waiting to insert WAL data into a memory buffer. - - - WALWrite - Waiting for WAL buffers to be written to disk. - - - WrapLimitsVacuum - Waiting to update limits on transaction id and multixact - consumption. - - - XactBuffer - Waiting for I/O on a transaction status SLRU buffer. - - - XactSLRU - Waiting to access the transaction status SLRU cache. - - - XactTruncation - Waiting to execute pg_xact_status or update - the oldest transaction ID available to it. - - - XidGen - Waiting to allocate a new transaction ID. - - - -
- - - - Extensions can add LWLock types to the list shown in - . In some cases, the name - assigned by an extension will not be available in all server processes; - so an LWLock wait event might be reported as - just extension rather than the - extension-assigned name. - - - - - Wait Events of Type <literal>Timeout</literal> - - - - Timeout Wait Event - Description + waiting for activity in its main processing loop. + wait_event will identify the specific wait point; + see . + - - - - BaseBackupThrottle - Waiting during base backup when throttling activity. + BufferPin + The server process is waiting for exclusive access to + a data buffer. Buffer pin waits can be protracted if + another process holds an open cursor that last read data from the + buffer in question. See . + - CheckpointWriteDelay - Waiting between writes while performing a checkpoint. + Client + The server process is waiting for activity on a socket + connected to a user application. Thus, the server expects something + to happen that is independent of its internal processes. + wait_event will identify the specific wait point; + see . + - PgSleep - Waiting due to a call to pg_sleep or - a sibling function. + Extension + The server process is waiting for some condition defined by an + extension module. + See . + - RecoveryApplyDelay - Waiting to apply WAL during recovery because of a delay - setting. + InjectionPoint + The server process is waiting for an injection point to reach an + outcome defined in a test. See + for more details. This + type has no predefined wait points. + - RecoveryRetrieveRetryInterval - Waiting during recovery when WAL data is not available from any - source (pg_wal, archive or stream). + IO + The server process is waiting for an I/O operation to complete. + wait_event will identify the specific wait point; + see . + - RegisterSyncRequest - Waiting while sending synchronization requests to the - checkpointer, because the request queue is full. + IPC + The server process is waiting for some interaction with + another server process. wait_event will + identify the specific wait point; + see . + - SpinDelay - Waiting while acquiring a contended spinlock. + Lock + The server process is waiting for a heavyweight lock. + Heavyweight locks, also known as lock manager locks or simply locks, + primarily protect SQL-visible objects such as tables. However, + they are also used to ensure mutual exclusion for certain internal + operations such as relation extension. wait_event + will identify the type of lock awaited; + see . + - VacuumDelay - Waiting in a cost-based vacuum delay point. + LWLock + The server process is waiting for a lightweight lock. + Most such locks protect a particular data structure in shared memory. + wait_event will contain a name identifying the purpose + of the lightweight lock. (Some locks have specific names; others + are part of a group of locks each with a similar purpose.) + See . + - VacuumTruncate - Waiting to acquire an exclusive lock to truncate off any - empty pages at the end of a table vacuumed. + Timeout + The server process is waiting for a timeout + to expire. wait_event will identify the specific wait + point; see . +
+ &wait_event_types; + - Here is an example of how wait events can be viewed: + Here are examples of how wait events can be viewed: SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event is NOT NULL; @@ -2371,9 +1130,33 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i 2540 | Lock | relation 6644 | LWLock | ProcArray (2 rows) + + + +SELECT a.pid, a.wait_event, w.description + FROM pg_stat_activity a JOIN + pg_wait_events w ON (a.wait_event_type = w.type AND + a.wait_event = w.name) + WHERE a.wait_event is NOT NULL and a.state = 'active'; +-[ RECORD 1 ]------------------------------------------------------&zwsp;------------ +pid | 686674 +wait_event | WALInitSync +description | Waiting for a newly initialized WAL file to reach durable storage + + + Extensions can add Extension, + InjectionPoint, and LWLock events + to the lists shown in and + . In some cases, the name + of an LWLock assigned by an extension will not be + available in all server processes. It might be reported as just + extension rather than the + extension-assigned name. + + @@ -3228,6 +2011,17 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i
+ + + worker_type text + + + Type of the subscription worker process. Possible types are + apply, parallel apply, and + table synchronization. + + + pid integer @@ -3243,7 +2037,7 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i Process ID of the leader apply worker if this process is a parallel - apply worker; NULL if this process is a leader apply worker or a + apply worker; NULL if this process is a leader apply worker or a table synchronization worker @@ -3798,7 +2592,7 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i vacuum: I/O operations performed outside of shared buffers while vacuuming and analyzing permanent relations. Temporary table vacuums use the same local buffer pool as other temporary table - IO operations and are tracked in context + I/O operations and are tracked in context normal.
@@ -4074,7 +2868,7 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i Columns tracking I/O time will only be non-zero when is enabled. The user should be careful when referencing these columns in combination with their - corresponding IO operations in case track_io_timing + corresponding I/O operations in case track_io_timing was not enabled for the entire time since the last stats reset. @@ -4092,7 +2886,7 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i The pg_stat_bgwriter view will always have a - single row, containing global data for the cluster. + single row, containing data about the background writer of the cluster. @@ -4112,97 +2906,149 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i - checkpoints_timed bigint + buffers_clean bigint - Number of scheduled checkpoints that have been performed + Number of buffers written by the background writer - checkpoints_req bigint + maxwritten_clean bigint - Number of requested checkpoints that have been performed + Number of times the background writer stopped a cleaning + scan because it had written too many buffers - checkpoint_write_time double precision + buffers_alloc bigint - Total amount of time that has been spent in the portion of - checkpoint processing where files are written to disk, in milliseconds + Number of buffers allocated - checkpoint_sync_time double precision + stats_reset timestamp with time zone - Total amount of time that has been spent in the portion of - checkpoint processing where files are synchronized to disk, in - milliseconds + Time at which these statistics were last reset + + + + +
+ + + + + <structname>pg_stat_checkpointer</structname> + + + pg_stat_checkpointer + + + + The pg_stat_checkpointer view will always have a + single row, containing data about the checkpointer process of the cluster. + + + + <structname>pg_stat_checkpointer</structname> View + + + + + Column Type + + + Description + + + + + + + + num_timed bigint + + + Number of scheduled checkpoints due to timeout. + Note that checkpoints may be skipped if the server has been idle + since the last one, and this value counts both completed and + skipped checkpoints - buffers_checkpoint bigint + num_requested bigint - Number of buffers written during checkpoints + Number of requested checkpoints that have been performed - buffers_clean bigint + restartpoints_timed bigint - Number of buffers written by the background writer + Number of scheduled restartpoints due to timeout or after a failed attempt to perform it - maxwritten_clean bigint + restartpoints_req bigint - Number of times the background writer stopped a cleaning - scan because it had written too many buffers + Number of requested restartpoints - buffers_backend bigint + restartpoints_done bigint - Number of buffers written directly by a backend + Number of restartpoints that have been performed - buffers_backend_fsync bigint + write_time double precision - Number of times a backend had to execute its own - fsync call (normally the background writer handles those - even when the backend does its own write) + Total amount of time that has been spent in the portion of + processing checkpoints and restartpoints where files are written to disk, + in milliseconds - buffers_alloc bigint + sync_time double precision - Number of buffers allocated + Total amount of time that has been spent in the portion of + processing checkpoints and restartpoints where files are synchronized to + disk, in milliseconds + + + + + + buffers_written bigint + + + Number of buffers written during checkpoints and restartpoints @@ -5229,6 +4075,19 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i + + + Queries that use certain SQL constructs to search for + rows matching any value out of a list or array of multiple scalar values + (see ) perform multiple + primitive index scans (up to one primitive scan per scalar + value) during query execution. Each internal primitive index scan + increments pg_stat_all_indexes.idx_scan, + so it's possible for the count of index scans to significantly exceed the + total number of index scan executor node executions. + + + @@ -5648,12 +4507,19 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i PostgreSQL accesses certain on-disk information - via SLRU (simple least-recently-used) caches. + via SLRU (simple least-recently-used) + caches. The pg_stat_slru view will contain one row for each tracked SLRU cache, showing statistics about access to cached pages. + + For each SLRU cache that's part of the core server, + there is a configuration parameter that controls its size, with the suffix + _buffers appended. + +
<structname>pg_stat_slru</structname> View @@ -5906,22 +4772,62 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i pg_stat_reset_shared - pg_stat_reset_shared ( text ) + pg_stat_reset_shared ( [ target text DEFAULT NULL ] ) void Resets some cluster-wide statistics counters to zero, depending on the - argument. The argument can be bgwriter to reset - all the counters shown in - the pg_stat_bgwriter - view, archiver to reset all the counters shown in - the pg_stat_archiver view, - io to reset all the counters shown in the - pg_stat_io view, - wal to reset all the counters shown in the - pg_stat_wal view or - recovery_prefetch to reset all the counters shown - in the pg_stat_recovery_prefetch view. + argument. target can be: + + + + archiver: Reset all the counters shown in the + pg_stat_archiver view. + + + + + bgwriter: Reset all the counters shown in the + pg_stat_bgwriter view. + + + + + checkpointer: Reset all the counters shown in the + pg_stat_checkpointer view. + + + + + io: Reset all the counters shown in the + pg_stat_io view. + + + + + recovery_prefetch: Reset all the counters shown in + the pg_stat_recovery_prefetch view. + + + + + slru: Reset all the counters shown in the + pg_stat_slru view. + + + + + wal: Reset all the counters shown in the + pg_stat_wal view. + + + + + NULL or not specified: All the counters from the + views listed above are reset. + + + This function is restricted to superusers by default, but other users @@ -5970,21 +4876,22 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i pg_stat_reset_slru - pg_stat_reset_slru ( text ) + pg_stat_reset_slru ( [ target text DEFAULT NULL ] ) void Resets statistics to zero for a single SLRU cache, or for all SLRUs in - the cluster. If the argument is NULL, all counters shown in + the cluster. If target is + NULL or is not specified, all the counters shown in the pg_stat_slru view for all SLRU caches are - reset. The argument can be one of - CommitTs, - MultiXactMember, - MultiXactOffset, - Notify, - Serial, - Subtrans, or - Xact + reset. The argument can be one of + commit_timestamp, + multixact_member, + multixact_offset, + notify, + serializable, + subtransaction, or + transaction to reset the counters for only that entry. If the argument is other (or indeed, any unrecognized name), then the counters for all other SLRU caches, such @@ -6058,7 +4965,7 @@ SELECT pid, wait_event_type, wait_event FROM pg_stat_activity WHERE wait_event i access functions can be used; these are shown in . These access functions use the session's backend ID number, which is a - small positive integer that is distinct from the backend ID of any + small integer (>= 0) that is distinct from the backend ID of any concurrent session, although a session's ID can be recycled as soon as it exits. The backend ID is used, among other things, to identify the session's temporary schema if it has one. @@ -6859,7 +5766,7 @@ FROM pg_stat_get_backend_idset() AS backendid; type text - The io type that the data is read from or written to: + The I/O type that the data is read from or written to: FILE, PROGRAM, PIPE (for COPY FROM STDIN and COPY TO STDOUT), or CALLBACK @@ -6905,6 +5812,18 @@ FROM pg_stat_get_backend_idset() AS backendid; WHERE clause of the COPY command. + + + + tuples_skipped bigint + + + Number of tuples skipped because they contain malformed data. + This counter only advances when a value other than + stop is specified to the ON_ERROR + option. + +
@@ -7342,10 +6261,10 @@ FROM pg_stat_get_backend_idset() AS backendid; - max_dead_tuples bigint + max_dead_tuple_bytes bigint - Number of dead tuples that we can store before needing to perform + Amount of dead tuple data that we can store before needing to perform an index vacuum cycle, based on . @@ -7353,10 +6272,42 @@ FROM pg_stat_get_backend_idset() AS backendid; - num_dead_tuples bigint + dead_tuple_bytes bigint + + + Amount of dead tuple data collected since the last index vacuum cycle. + + + + + + num_dead_item_ids bigint - Number of dead tuples collected since the last index vacuum cycle. + Number of dead item identifiers collected since the last index vacuum cycle. + + + + + + indexes_total bigint + + + Total number of indexes that will be vacuumed or cleaned up. This + number is reported at the beginning of the + vacuuming indexes phase or the + cleaning up indexes phase. + + + + + + indexes_processed bigint + + + Number of indexes processed. This counter only advances when the + phase is vacuuming indexes or + cleaning up indexes. @@ -7896,7 +6847,7 @@ FROM pg_stat_get_backend_idset() AS backendid; arg0 contains the fork to be extended. arg1, arg2, and arg3 contain the tablespace, database, and relation OIDs identifying the relation. arg4 is the ID of the backend which created the temporary relation for a - local buffer, or InvalidBackendId (-1) for a shared + local buffer, or INVALID_PROC_NUMBER (-1) for a shared buffer. arg5 is the number of blocks the caller would like to extend by. @@ -7907,7 +6858,7 @@ FROM pg_stat_get_backend_idset() AS backendid; arg0 contains the fork to be extended. arg1, arg2, and arg3 contain the tablespace, database, and relation OIDs identifying the relation. arg4 is the ID of the backend which created the temporary relation for a - local buffer, or InvalidBackendId (-1) for a shared + local buffer, or INVALID_PROC_NUMBER (-1) for a shared buffer. arg5 is the number of blocks the relation was extended by, this can be less than the number in the buffer-extend-start due to resource @@ -7922,7 +6873,7 @@ FROM pg_stat_get_backend_idset() AS backendid; arg2, arg3, and arg4 contain the tablespace, database, and relation OIDs identifying the relation. arg5 is the ID of the backend which created the temporary relation for a - local buffer, or InvalidBackendId (-1) for a shared buffer. + local buffer, or INVALID_PROC_NUMBER (-1) for a shared buffer. @@ -7933,7 +6884,7 @@ FROM pg_stat_get_backend_idset() AS backendid; arg2, arg3, and arg4 contain the tablespace, database, and relation OIDs identifying the relation. arg5 is the ID of the backend which created the temporary relation for a - local buffer, or InvalidBackendId (-1) for a shared buffer. + local buffer, or INVALID_PROC_NUMBER (-1) for a shared buffer. arg6 is true if the buffer was found in the pool, false if not. @@ -7986,7 +6937,7 @@ FROM pg_stat_get_backend_idset() AS backendid; arg2, arg3, and arg4 contain the tablespace, database, and relation OIDs identifying the relation. arg5 is the ID of the backend which created the temporary relation for a - local buffer, or InvalidBackendId (-1) for a shared buffer. + local buffer, or INVALID_PROC_NUMBER (-1) for a shared buffer. smgr-md-read-done @@ -7996,9 +6947,9 @@ FROM pg_stat_get_backend_idset() AS backendid; arg2, arg3, and arg4 contain the tablespace, database, and relation OIDs identifying the relation. arg5 is the ID of the backend which created the temporary relation for a - local buffer, or InvalidBackendId (-1) for a shared buffer. + local buffer, or INVALID_PROC_NUMBER (-1) for a shared buffer. arg6 is the number of bytes actually read, while arg7 is the number - requested (if these are different it indicates trouble). + requested (if these are different it indicates a short read). smgr-md-write-start @@ -8008,7 +6959,7 @@ FROM pg_stat_get_backend_idset() AS backendid; arg2, arg3, and arg4 contain the tablespace, database, and relation OIDs identifying the relation. arg5 is the ID of the backend which created the temporary relation for a - local buffer, or InvalidBackendId (-1) for a shared buffer. + local buffer, or INVALID_PROC_NUMBER (-1) for a shared buffer. smgr-md-write-done @@ -8018,9 +6969,9 @@ FROM pg_stat_get_backend_idset() AS backendid; arg2, arg3, and arg4 contain the tablespace, database, and relation OIDs identifying the relation. arg5 is the ID of the backend which created the temporary relation for a - local buffer, or InvalidBackendId (-1) for a shared buffer. + local buffer, or INVALID_PROC_NUMBER (-1) for a shared buffer. arg6 is the number of bytes actually written, while arg7 is the number - requested (if these are different it indicates trouble). + requested (if these are different it indicates a short write). sort-start @@ -8364,4 +7315,147 @@ if (TRACE_POSTGRESQL_TRANSACTION_START_ENABLED()) + + Monitoring Disk Usage + + + This section discusses how to monitor the disk usage of a + PostgreSQL database system. + + + + Determining Disk Usage + + + disk usage + + + + Each table has a primary heap disk file where most of the data is + stored. If the table has any columns with potentially-wide values, + there also might be a TOAST file associated with the table, + which is used to store values too wide to fit comfortably in the main + table (see ). There will be one valid index + on the TOAST table, if present. There also might be indexes + associated with the base table. Each table and index is stored in a + separate disk file — possibly more than one file, if the file would + exceed one gigabyte. Naming conventions for these files are described + in . + + + + You can monitor disk space in three ways: + using the SQL functions listed in , + using the module, or + using manual inspection of the system catalogs. + The SQL functions are the easiest to use and are generally recommended. + The remainder of this section shows how to do it by inspection of the + system catalogs. + + + + Using psql on a recently vacuumed or analyzed + database, you can issue queries to see the disk usage of any table: + +SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'customer'; + + pg_relation_filepath | relpages +----------------------+---------- + base/16384/16806 | 60 +(1 row) + + Each page is typically 8 kilobytes. (Remember, relpages + is only updated by VACUUM, ANALYZE, and + a few DDL commands such as CREATE INDEX.) The file path name + is of interest if you want to examine the table's disk file directly. + + + + To show the space used by TOAST tables, use a query + like the following: + +SELECT relname, relpages +FROM pg_class, + (SELECT reltoastrelid + FROM pg_class + WHERE relname = 'customer') AS ss +WHERE oid = ss.reltoastrelid OR + oid = (SELECT indexrelid + FROM pg_index + WHERE indrelid = ss.reltoastrelid) +ORDER BY relname; + + relname | relpages +----------------------+---------- + pg_toast_16806 | 0 + pg_toast_16806_index | 1 + + + + + You can easily display index sizes, too: + +SELECT c2.relname, c2.relpages +FROM pg_class c, pg_class c2, pg_index i +WHERE c.relname = 'customer' AND + c.oid = i.indrelid AND + c2.oid = i.indexrelid +ORDER BY c2.relname; + + relname | relpages +-------------------+---------- + customer_id_index | 26 + + + + + It is easy to find your largest tables and indexes using this + information: + +SELECT relname, relpages +FROM pg_class +ORDER BY relpages DESC; + + relname | relpages +----------------------+---------- + bigtable | 3290 + customer | 3144 + + + + + + Disk Full Failure + + + The most important disk monitoring task of a database administrator + is to make sure the disk doesn't become full. A filled data disk will + not result in data corruption, but it might prevent useful activity + from occurring. If the disk holding the WAL files grows full, database + server panic and consequent shutdown might occur. + + + + If you cannot free up additional space on the disk by deleting + other things, you can move some of the database files to other file + systems by making use of tablespaces. See for more information about that. + + + + + Some file systems perform badly when they are almost full, so do + not wait until the disk is completely full to take action. + + + + + If your system supports per-user disk quotas, then the database + will naturally be subject to whatever quota is placed on the user + the server runs as. Exceeding the quota will have the same bad + effects as running out of disk space entirely. + + + + diff --git a/doc/src/sgml/mvcc.sgml b/doc/src/sgml/mvcc.sgml index f8f83d463d429..380d0c9e8051e 100644 --- a/doc/src/sgml/mvcc.sgml +++ b/doc/src/sgml/mvcc.sgml @@ -394,10 +394,14 @@ conditions for each action are re-evaluated on the updated version of the row, starting from the first action, even if the action that had originally matched appears later in the list of actions. - On the other hand, if the row is concurrently updated or deleted so - that the join condition fails, then MERGE will - evaluate the condition's NOT MATCHED actions next, - and execute the first one that succeeds. + On the other hand, if the row is concurrently updated so that the join + condition fails, then MERGE will evaluate the + command's NOT MATCHED BY SOURCE and + NOT MATCHED [BY TARGET] actions next, and execute + the first one of each kind that succeeds. + If the row is concurrently deleted, then MERGE + will evaluate the command's NOT MATCHED [BY TARGET] + actions, and execute the first one that succeeds. If MERGE attempts an INSERT and a unique index is present and a duplicate row is concurrently inserted, then a uniqueness violation error is raised; diff --git a/doc/src/sgml/nls.sgml b/doc/src/sgml/nls.sgml index 9b6a7da870d8c..0ad1b2c9c4532 100644 --- a/doc/src/sgml/nls.sgml +++ b/doc/src/sgml/nls.sgml @@ -205,7 +205,7 @@ make update-po The PO files can be edited with a regular text editor. There are also several specialized editors for PO files which can help the process with - translation specific features. + translation-specific features. There is (unsurprisingly) a PO mode for Emacs, which can be quite useful. diff --git a/doc/src/sgml/oid2name.sgml b/doc/src/sgml/oid2name.sgml index dfe3682739181..54cc9be2b8278 100644 --- a/doc/src/sgml/oid2name.sgml +++ b/doc/src/sgml/oid2name.sgml @@ -281,7 +281,7 @@ $ ls -lS * | head -10 -rw------- 1 alvherre alvherre 163840 sep 14 09:50 16699 -rw------- 1 alvherre alvherre 122880 sep 6 17:51 16751 -$ # I wonder what file 155173 is ... +$ # What file is 155173? $ oid2name -d alvherre -f 155173 From database "alvherre": Filenode Table Name diff --git a/doc/src/sgml/oldsnapshot.sgml b/doc/src/sgml/oldsnapshot.sgml deleted file mode 100644 index 2e37087738b68..0000000000000 --- a/doc/src/sgml/oldsnapshot.sgml +++ /dev/null @@ -1,33 +0,0 @@ - - - - old_snapshot — inspect <literal>old_snapshot_threshold</literal> state - - - old_snapshot - - - - The old_snapshot module allows inspection - of the server state that is used to implement - . - - - - Functions - - - - pg_old_snapshot_time_mapping(array_offset OUT int4, end_timestamp OUT timestamptz, newest_xmin OUT xid) returns setof record - - - Returns all of the entries in the server's timestamp to XID mapping. - Each entry represents the newest xmin of any snapshot taken in the - corresponding minute. - - - - - - - diff --git a/doc/src/sgml/pageinspect.sgml b/doc/src/sgml/pageinspect.sgml index 0f278662af530..27e0598f74c01 100644 --- a/doc/src/sgml/pageinspect.sgml +++ b/doc/src/sgml/pageinspect.sgml @@ -700,7 +700,7 @@ test=# SELECT * FROM gin_page_opaque_info(get_raw_page('gin_index', 2)); gin_leafpage_items returns information about - the data stored in a GIN leaf page. For example: + the data stored in a compressed GIN leaf page. For example: test=# SELECT first_tid, nbytes, tids[0:5] AS some_tids FROM gin_leafpage_items(get_raw_page('gin_test_idx', 2)); diff --git a/doc/src/sgml/parallel.sgml b/doc/src/sgml/parallel.sgml index 5acc9537d6f28..cdd4ce258eb2a 100644 --- a/doc/src/sgml/parallel.sgml +++ b/doc/src/sgml/parallel.sgml @@ -202,7 +202,7 @@ EXPLAIN SELECT * FROM pgbench_accounts WHERE filler LIKE '%x%'; - Even when parallel query plan is generated for a particular query, there + Even when a parallel query plan is generated for a particular query, there are several circumstances under which it will be impossible to execute that plan in parallel at execution time. If this occurs, the leader will execute the portion of the plan below the Gather @@ -510,12 +510,6 @@ EXPLAIN SELECT * FROM pgbench_accounts WHERE filler LIKE '%x%'; - - - Plan nodes to which an InitPlan is attached. - - - Plan nodes that reference a correlated SubPlan. @@ -545,10 +539,10 @@ EXPLAIN SELECT * FROM pgbench_accounts WHERE filler LIKE '%x%'; - Functions and aggregates must be marked PARALLEL UNSAFE if - they write to the database, access sequences, change the transaction state - even temporarily (e.g., a PL/pgSQL function that establishes an - EXCEPTION block to catch errors), or make persistent changes to + Functions and aggregates must be marked PARALLEL UNSAFE + if they write to the database, change the transaction state (other than by + using a subtransaction for error recovery), access sequences, or make + persistent changes to settings. Similarly, functions must be marked PARALLEL RESTRICTED if they access temporary tables, client connection state, cursors, prepared statements, or miscellaneous backend-local state that diff --git a/doc/src/sgml/perform.sgml b/doc/src/sgml/perform.sgml index 90822b3f4c6cb..ff689b65245fc 100644 --- a/doc/src/sgml/perform.sgml +++ b/doc/src/sgml/perform.sgml @@ -39,7 +39,7 @@ Examples in this section are drawn from the regression test database - after doing a VACUUM ANALYZE, using 9.3 development sources. + after doing a VACUUM ANALYZE, using v17 development sources. You should be able to get similar results if you try the examples yourself, but your estimated costs and row counts might vary slightly because ANALYZE's statistics are random samples rather @@ -88,7 +88,7 @@ EXPLAIN SELECT * FROM tenk1; QUERY PLAN ------------------------------------------------------------- - Seq Scan on tenk1 (cost=0.00..458.00 rows=10000 width=244) + Seq Scan on tenk1 (cost=0.00..445.00 rows=10000 width=244) @@ -144,11 +144,11 @@ EXPLAIN SELECT * FROM tenk1; It's important to understand that the cost of an upper-level node includes the cost of all its child nodes. It's also important to realize that the cost only reflects things that the planner cares about. - In particular, the cost does not consider the time spent transmitting - result rows to the client, which could be an important - factor in the real elapsed time; but the planner ignores it because - it cannot change it by altering the plan. (Every correct plan will - output the same row set, we trust.) + In particular, the cost does not consider the time spent to convert + output values to text form or to transmit them to the client, which + could be important factors in the real elapsed time; but the planner + ignores those costs because it cannot change them by altering the + plan. (Every correct plan will output the same row set, we trust.) @@ -169,7 +169,7 @@ EXPLAIN SELECT * FROM tenk1; QUERY PLAN ------------------------------------------------------------- - Seq Scan on tenk1 (cost=0.00..458.00 rows=10000 width=244) + Seq Scan on tenk1 (cost=0.00..445.00 rows=10000 width=244) @@ -180,12 +180,12 @@ EXPLAIN SELECT * FROM tenk1; SELECT relpages, reltuples FROM pg_class WHERE relname = 'tenk1'; - you will find that tenk1 has 358 disk + you will find that tenk1 has 345 disk pages and 10000 rows. The estimated cost is computed as (disk pages read * ) + (rows scanned * ). By default, seq_page_cost is 1.0 and cpu_tuple_cost is 0.01, - so the estimated cost is (358 * 1.0) + (10000 * 0.01) = 458. + so the estimated cost is (345 * 1.0) + (10000 * 0.01) = 445. @@ -196,7 +196,7 @@ EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 7000; QUERY PLAN ------------------------------------------------------------ - Seq Scan on tenk1 (cost=0.00..483.00 rows=7001 width=244) + Seq Scan on tenk1 (cost=0.00..470.00 rows=7000 width=244) Filter: (unique1 < 7000) @@ -216,7 +216,7 @@ EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 7000; The actual number of rows this query would select is 7000, but the rows estimate is only approximate. If you try to duplicate this experiment, - you will probably get a slightly different estimate; moreover, it can + you may well get a slightly different estimate; moreover, it can change after each ANALYZE command, because the statistics produced by ANALYZE are taken from a randomized sample of the table. @@ -230,9 +230,9 @@ EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100; QUERY PLAN -------------------------------------------------------------------&zwsp;----------- - Bitmap Heap Scan on tenk1 (cost=5.07..229.20 rows=101 width=244) + Bitmap Heap Scan on tenk1 (cost=5.06..224.98 rows=100 width=244) Recheck Cond: (unique1 < 100) - -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=101 width=0) + -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=100 width=0) Index Cond: (unique1 < 100) @@ -257,19 +257,19 @@ EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND stringu1 = 'xxx'; QUERY PLAN -------------------------------------------------------------------&zwsp;----------- - Bitmap Heap Scan on tenk1 (cost=5.04..229.43 rows=1 width=244) + Bitmap Heap Scan on tenk1 (cost=5.04..225.20 rows=1 width=244) Recheck Cond: (unique1 < 100) Filter: (stringu1 = 'xxx'::name) - -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=101 width=0) + -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=100 width=0) Index Cond: (unique1 < 100) The added condition stringu1 = 'xxx' reduces the output row count estimate, but not the cost because we still have to visit - the same set of rows. Notice that the stringu1 clause + the same set of rows. That's because the stringu1 clause cannot be applied as an index condition, since this index is only on the unique1 column. Instead it is applied as a filter on - the rows retrieved by the index. Thus the cost has actually gone up + the rows retrieved using the index. Thus the cost has actually gone up slightly to reflect this extra checking. @@ -300,10 +300,11 @@ EXPLAIN SELECT * FROM tenk1 WHERE unique1 = 42; The planner may implement an ORDER BY clause in several ways. The above example shows that such an ordering clause may be implemented implicitly. The planner may also add an explicit - sort step: + Sort step: EXPLAIN SELECT * FROM tenk1 ORDER BY unique1; + QUERY PLAN ------------------------------------------------------------------- Sort (cost=1109.39..1134.39 rows=10000 width=244) @@ -313,17 +314,18 @@ EXPLAIN SELECT * FROM tenk1 ORDER BY unique1; If a part of the plan guarantees an ordering on a prefix of the required sort keys, then the planner may instead decide to use an - incremental sort step: + Incremental Sort step: -EXPLAIN SELECT * FROM tenk1 ORDER BY four, ten LIMIT 100; +EXPLAIN SELECT * FROM tenk1 ORDER BY hundred, ten LIMIT 100; + QUERY PLAN --------------------------------------------------------------------&zwsp;----------------------------------- - Limit (cost=521.06..538.05 rows=100 width=244) - -> Incremental Sort (cost=521.06..2220.95 rows=10000 width=244) - Sort Key: four, ten - Presorted Key: four - -> Index Scan using index_tenk1_on_four on tenk1 (cost=0.29..1510.08 rows=10000 width=244) +-------------------------------------------------------------------&zwsp;----------------------------- + Limit (cost=19.35..39.49 rows=100 width=244) + -> Incremental Sort (cost=19.35..2033.39 rows=10000 width=244) + Sort Key: hundred, ten + Presorted Key: hundred + -> Index Scan using tenk1_hundred on tenk1 (cost=0.29..1574.20 rows=10000 width=244) Compared to regular sorts, sorting incrementally allows returning tuples @@ -344,10 +346,10 @@ EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000; QUERY PLAN -------------------------------------------------------------------&zwsp;------------------ - Bitmap Heap Scan on tenk1 (cost=25.08..60.21 rows=10 width=244) + Bitmap Heap Scan on tenk1 (cost=25.07..60.11 rows=10 width=244) Recheck Cond: ((unique1 < 100) AND (unique2 > 9000)) - -> BitmapAnd (cost=25.08..25.08 rows=10 width=0) - -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=101 width=0) + -> BitmapAnd (cost=25.07..25.07 rows=10 width=0) + -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=100 width=0) Index Cond: (unique1 < 100) -> Bitmap Index Scan on tenk1_unique2 (cost=0.00..19.78 rows=999 width=0) Index Cond: (unique2 > 9000) @@ -367,8 +369,8 @@ EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000 LIMIT 2 QUERY PLAN -------------------------------------------------------------------&zwsp;------------------ - Limit (cost=0.29..14.48 rows=2 width=244) - -> Index Scan using tenk1_unique2 on tenk1 (cost=0.29..71.27 rows=10 width=244) + Limit (cost=0.29..14.28 rows=2 width=244) + -> Index Scan using tenk1_unique2 on tenk1 (cost=0.29..70.27 rows=10 width=244) Index Cond: (unique2 > 9000) Filter: (unique1 < 100) @@ -397,12 +399,12 @@ WHERE t1.unique1 < 10 AND t1.unique2 = t2.unique2; QUERY PLAN -------------------------------------------------------------------&zwsp;------------------- - Nested Loop (cost=4.65..118.62 rows=10 width=488) - -> Bitmap Heap Scan on tenk1 t1 (cost=4.36..39.47 rows=10 width=244) + Nested Loop (cost=4.65..118.50 rows=10 width=488) + -> Bitmap Heap Scan on tenk1 t1 (cost=4.36..39.38 rows=10 width=244) Recheck Cond: (unique1 < 10) -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..4.36 rows=10 width=0) Index Cond: (unique1 < 10) - -> Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.29..7.91 rows=1 width=244) + -> Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.29..7.90 rows=1 width=244) Index Cond: (unique2 = t1.unique2) @@ -428,7 +430,7 @@ WHERE t1.unique1 < 10 AND t1.unique2 = t2.unique2; as a result of caching that's expected to occur during the repeated index scans on t2.) The costs of the loop node are then set on the basis of the cost of the outer - scan, plus one repetition of the inner scan for each outer row (10 * 7.91, + scan, plus one repetition of the inner scan for each outer row (10 * 7.90, here), plus a little CPU time for join processing. @@ -446,9 +448,9 @@ WHERE t1.unique1 < 10 AND t2.unique2 < 10 AND t1.hundred < t2.hundred; QUERY PLAN -------------------------------------------------------------------&zwsp;-------------------------- - Nested Loop (cost=4.65..49.46 rows=33 width=488) + Nested Loop (cost=4.65..49.36 rows=33 width=488) Join Filter: (t1.hundred < t2.hundred) - -> Bitmap Heap Scan on tenk1 t1 (cost=4.36..39.47 rows=10 width=244) + -> Bitmap Heap Scan on tenk1 t1 (cost=4.36..39.38 rows=10 width=244) Recheck Cond: (unique1 < 10) -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..4.36 rows=10 width=0) Index Cond: (unique1 < 10) @@ -494,13 +496,13 @@ WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2; QUERY PLAN -------------------------------------------------------------------&zwsp;----------------------- - Hash Join (cost=230.47..713.98 rows=101 width=488) + Hash Join (cost=226.23..709.73 rows=100 width=488) Hash Cond: (t2.unique2 = t1.unique2) -> Seq Scan on tenk2 t2 (cost=0.00..445.00 rows=10000 width=244) - -> Hash (cost=229.20..229.20 rows=101 width=244) - -> Bitmap Heap Scan on tenk1 t1 (cost=5.07..229.20 rows=101 width=244) + -> Hash (cost=224.98..224.98 rows=100 width=244) + -> Bitmap Heap Scan on tenk1 t1 (cost=5.06..224.98 rows=100 width=244) Recheck Cond: (unique1 < 100) - -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=101 width=0) + -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=100 width=0) Index Cond: (unique1 < 100) @@ -525,22 +527,18 @@ WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2; QUERY PLAN -------------------------------------------------------------------&zwsp;----------------------- - Merge Join (cost=198.11..268.19 rows=10 width=488) + Merge Join (cost=0.56..233.49 rows=10 width=488) Merge Cond: (t1.unique2 = t2.unique2) - -> Index Scan using tenk1_unique2 on tenk1 t1 (cost=0.29..656.28 rows=101 width=244) + -> Index Scan using tenk1_unique2 on tenk1 t1 (cost=0.29..643.28 rows=100 width=244) Filter: (unique1 < 100) - -> Sort (cost=197.83..200.33 rows=1000 width=244) - Sort Key: t2.unique2 - -> Seq Scan on onek t2 (cost=0.00..148.00 rows=1000 width=244) + -> Index Scan using onek_unique2 on onek t2 (cost=0.28..166.28 rows=1000 width=244) Merge join requires its input data to be sorted on the join keys. In this - plan the tenk1 data is sorted by using an index scan to visit - the rows in the correct order, but a sequential scan and sort is preferred - for onek, because there are many more rows to be visited in - that table. + example each input is sorted by using an index scan to visit the rows + in the correct order; but a sequential scan and sort could also be used. (Sequential-scan-and-sort frequently beats an index scan for sorting many rows, because of the nonsequential disk access required by the index scan.) @@ -551,11 +549,11 @@ WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2; flags described in . (This is a crude tool, but useful. See also .) - For example, if we're unconvinced that sequential-scan-and-sort is the best way to - deal with table onek in the previous example, we could try + For example, if we're unconvinced that merge join is the best join + type for the previous example, we could try -SET enable_sort = off; +SET enable_mergejoin = off; EXPLAIN SELECT * FROM tenk1 t1, onek t2 @@ -563,18 +561,119 @@ WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2; QUERY PLAN -------------------------------------------------------------------&zwsp;----------------------- - Merge Join (cost=0.56..292.65 rows=10 width=488) - Merge Cond: (t1.unique2 = t2.unique2) - -> Index Scan using tenk1_unique2 on tenk1 t1 (cost=0.29..656.28 rows=101 width=244) - Filter: (unique1 < 100) - -> Index Scan using onek_unique2 on onek t2 (cost=0.28..224.79 rows=1000 width=244) + Hash Join (cost=226.23..344.08 rows=10 width=488) + Hash Cond: (t2.unique2 = t1.unique2) + -> Seq Scan on onek t2 (cost=0.00..114.00 rows=1000 width=244) + -> Hash (cost=224.98..224.98 rows=100 width=244) + -> Bitmap Heap Scan on tenk1 t1 (cost=5.06..224.98 rows=100 width=244) + Recheck Cond: (unique1 < 100) + -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=100 width=0) + Index Cond: (unique1 < 100) - which shows that the planner thinks that sorting onek by - index-scanning is about 12% more expensive than sequential-scan-and-sort. + which shows that the planner thinks that hash join would be nearly 50% + more expensive than merge join for this case. Of course, the next question is whether it's right about that. - We can investigate that using EXPLAIN ANALYZE, as discussed - below. + We can investigate that using EXPLAIN ANALYZE, as + discussed below. + + + + + subplan + + Some query plans involve subplans, which arise + from sub-SELECTs in the original query. Such + queries can sometimes be transformed into ordinary join plans, but + when they cannot be, we get plans like: + + +EXPLAIN VERBOSE SELECT unique1 +FROM tenk1 t +WHERE t.ten < ALL (SELECT o.ten FROM onek o WHERE o.four = t.four); + + QUERY PLAN +-------------------------------------------------------------------&zwsp;------ + Seq Scan on public.tenk1 t (cost=0.00..586095.00 rows=5000 width=4) + Output: t.unique1 + Filter: (ALL (t.ten < (SubPlan 1).col1)) + SubPlan 1 + -> Seq Scan on public.onek o (cost=0.00..116.50 rows=250 width=4) + Output: o.ten + Filter: (o.four = t.four) + + + This rather artificial example serves to illustrate a couple of + points: values from the outer plan level can be passed down into a + subplan (here, t.four is passed down) and the + results of the sub-select are available to the outer plan. Those + result values are shown by EXPLAIN with notations + like + (subplan_name).colN, + which refers to the N'th output column of + the sub-SELECT. + + + + + subplan + hashed + + In the example above, the ALL operator runs the + subplan again for each row of the outer query (which accounts for the + high estimated cost). Some queries can use a hashed + subplan to avoid that: + + +EXPLAIN SELECT * +FROM tenk1 t +WHERE t.unique1 NOT IN (SELECT o.unique1 FROM onek o); + + QUERY PLAN +-------------------------------------------------------------------&zwsp;------------------------- + Seq Scan on tenk1 t (cost=61.77..531.77 rows=5000 width=244) + Filter: (NOT (ANY (unique1 = (hashed SubPlan 1).col1))) + SubPlan 1 + -> Index Only Scan using onek_unique1 on onek o (cost=0.28..59.27 rows=1000 width=4) +(4 rows) + + + Here, the subplan is run a single time and its output is loaded into + an in-memory hash table, which is then probed by the + outer ANY operator. This requires that the + sub-SELECT not reference any variables of the outer + query, and that the ANY's comparison operator be + amenable to hashing. + + + + + initplan + + If, in addition to not referencing any variables of the outer query, + the sub-SELECT cannot return more than one row, + it may instead be implemented as an initplan: + + +EXPLAIN VERBOSE SELECT unique1 +FROM tenk1 t1 WHERE t1.ten = (SELECT (random() * 10)::integer); + + QUERY PLAN +------------------------------------------------------------&zwsp;-------- + Seq Scan on public.tenk1 t1 (cost=0.02..470.02 rows=1000 width=4) + Output: t1.unique1 + Filter: (t1.ten = (InitPlan 1).col1) + InitPlan 1 + -> Result (cost=0.00..0.02 rows=1 width=4) + Output: ((random() * '10'::double precision))::integer + + + An initplan is run only once per execution of the outer plan, and its + results are saved for re-use in later rows of the outer plan. So in + this example random() is evaluated only once and + all the values of t1.ten are compared to the same + randomly-chosen integer. That's quite different from what would + happen without the sub-SELECT construct.
@@ -597,15 +696,16 @@ WHERE t1.unique1 < 10 AND t1.unique2 = t2.unique2; QUERY PLAN -------------------------------------------------------------------&zwsp;-------------------------------------------------------------- - Nested Loop (cost=4.65..118.62 rows=10 width=488) (actual time=0.128..0.377 rows=10 loops=1) - -> Bitmap Heap Scan on tenk1 t1 (cost=4.36..39.47 rows=10 width=244) (actual time=0.057..0.121 rows=10 loops=1) + Nested Loop (cost=4.65..118.50 rows=10 width=488) (actual time=0.017..0.051 rows=10 loops=1) + -> Bitmap Heap Scan on tenk1 t1 (cost=4.36..39.38 rows=10 width=244) (actual time=0.009..0.017 rows=10 loops=1) Recheck Cond: (unique1 < 10) - -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..4.36 rows=10 width=0) (actual time=0.024..0.024 rows=10 loops=1) + Heap Blocks: exact=10 + -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..4.36 rows=10 width=0) (actual time=0.004..0.004 rows=10 loops=1) Index Cond: (unique1 < 10) - -> Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.29..7.91 rows=1 width=244) (actual time=0.021..0.022 rows=1 loops=10) + -> Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.29..7.90 rows=1 width=244) (actual time=0.003..0.003 rows=1 loops=10) Index Cond: (unique2 = t1.unique2) - Planning time: 0.181 ms - Execution time: 0.501 ms + Planning Time: 0.485 ms + Execution Time: 0.073 ms Note that the actual time values are in milliseconds of @@ -625,7 +725,7 @@ WHERE t1.unique1 < 10 AND t1.unique2 = t2.unique2; values shown are averages per-execution. This is done to make the numbers comparable with the way that the cost estimates are shown. Multiply by the loops value to get the total time actually spent in - the node. In the above example, we spent a total of 0.220 milliseconds + the node. In the above example, we spent a total of 0.030 milliseconds executing the index scans on tenk2. @@ -641,20 +741,21 @@ WHERE t1.unique1 < 100 AND t1.unique2 = t2.unique2 ORDER BY t1.fivethous; QUERY PLAN -------------------------------------------------------------------&zwsp;-------------------------------------------------------------------&zwsp;------ - Sort (cost=717.34..717.59 rows=101 width=488) (actual time=7.761..7.774 rows=100 loops=1) + Sort (cost=713.05..713.30 rows=100 width=488) (actual time=2.995..3.002 rows=100 loops=1) Sort Key: t1.fivethous - Sort Method: quicksort Memory: 77kB - -> Hash Join (cost=230.47..713.98 rows=101 width=488) (actual time=0.711..7.427 rows=100 loops=1) + Sort Method: quicksort Memory: 74kB + -> Hash Join (cost=226.23..709.73 rows=100 width=488) (actual time=0.515..2.920 rows=100 loops=1) Hash Cond: (t2.unique2 = t1.unique2) - -> Seq Scan on tenk2 t2 (cost=0.00..445.00 rows=10000 width=244) (actual time=0.007..2.583 rows=10000 loops=1) - -> Hash (cost=229.20..229.20 rows=101 width=244) (actual time=0.659..0.659 rows=100 loops=1) - Buckets: 1024 Batches: 1 Memory Usage: 28kB - -> Bitmap Heap Scan on tenk1 t1 (cost=5.07..229.20 rows=101 width=244) (actual time=0.080..0.526 rows=100 loops=1) + -> Seq Scan on tenk2 t2 (cost=0.00..445.00 rows=10000 width=244) (actual time=0.026..1.790 rows=10000 loops=1) + -> Hash (cost=224.98..224.98 rows=100 width=244) (actual time=0.476..0.477 rows=100 loops=1) + Buckets: 1024 Batches: 1 Memory Usage: 35kB + -> Bitmap Heap Scan on tenk1 t1 (cost=5.06..224.98 rows=100 width=244) (actual time=0.030..0.450 rows=100 loops=1) Recheck Cond: (unique1 < 100) - -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=101 width=0) (actual time=0.049..0.049 rows=100 loops=1) + Heap Blocks: exact=90 + -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=100 width=0) (actual time=0.013..0.013 rows=100 loops=1) Index Cond: (unique1 < 100) - Planning time: 0.194 ms - Execution time: 8.008 ms + Planning Time: 0.187 ms + Execution Time: 3.036 ms The Sort node shows the sort method used (in particular, whether the sort @@ -674,11 +775,11 @@ EXPLAIN ANALYZE SELECT * FROM tenk1 WHERE ten < 7; QUERY PLAN -------------------------------------------------------------------&zwsp;-------------------------------------- - Seq Scan on tenk1 (cost=0.00..483.00 rows=7000 width=244) (actual time=0.016..5.107 rows=7000 loops=1) + Seq Scan on tenk1 (cost=0.00..470.00 rows=7000 width=244) (actual time=0.030..1.995 rows=7000 loops=1) Filter: (ten < 7) Rows Removed by Filter: 3000 - Planning time: 0.083 ms - Execution time: 5.905 ms + Planning Time: 0.102 ms + Execution Time: 2.145 ms These counts can be particularly valuable for filter conditions applied at @@ -697,11 +798,11 @@ EXPLAIN ANALYZE SELECT * FROM polygon_tbl WHERE f1 @> polygon '(0.5,2.0)'; QUERY PLAN -------------------------------------------------------------------&zwsp;----------------------------------- - Seq Scan on polygon_tbl (cost=0.00..1.05 rows=1 width=32) (actual time=0.044..0.044 rows=0 loops=1) + Seq Scan on polygon_tbl (cost=0.00..1.09 rows=1 width=85) (actual time=0.023..0.023 rows=0 loops=1) Filter: (f1 @> '((0.5,2))'::polygon) - Rows Removed by Filter: 4 - Planning time: 0.040 ms - Execution time: 0.083 ms + Rows Removed by Filter: 7 + Planning Time: 0.039 ms + Execution Time: 0.033 ms The planner thinks (quite correctly) that this sample table is too small @@ -716,11 +817,11 @@ EXPLAIN ANALYZE SELECT * FROM polygon_tbl WHERE f1 @> polygon '(0.5,2.0)'; QUERY PLAN -------------------------------------------------------------------&zwsp;------------------------------------------------------- - Index Scan using gpolygonind on polygon_tbl (cost=0.13..8.15 rows=1 width=32) (actual time=0.062..0.062 rows=0 loops=1) + Index Scan using gpolygonind on polygon_tbl (cost=0.13..8.15 rows=1 width=85) (actual time=0.074..0.074 rows=0 loops=1) Index Cond: (f1 @> '((0.5,2))'::polygon) Rows Removed by Index Recheck: 1 - Planning time: 0.034 ms - Execution time: 0.144 ms + Planning Time: 0.039 ms + Execution Time: 0.098 ms Here we can see that the index returned one candidate row, which was @@ -739,19 +840,22 @@ EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM tenk1 WHERE unique1 < 100 AND unique QUERY PLAN -------------------------------------------------------------------&zwsp;-------------------------------------------------------------- - Bitmap Heap Scan on tenk1 (cost=25.08..60.21 rows=10 width=244) (actual time=0.323..0.342 rows=10 loops=1) + Bitmap Heap Scan on tenk1 (cost=25.07..60.11 rows=10 width=244) (actual time=0.105..0.114 rows=10 loops=1) Recheck Cond: ((unique1 < 100) AND (unique2 > 9000)) - Buffers: shared hit=15 - -> BitmapAnd (cost=25.08..25.08 rows=10 width=0) (actual time=0.309..0.309 rows=0 loops=1) - Buffers: shared hit=7 - -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=101 width=0) (actual time=0.043..0.043 rows=100 loops=1) + Heap Blocks: exact=10 + Buffers: shared hit=14 read=3 + -> BitmapAnd (cost=25.07..25.07 rows=10 width=0) (actual time=0.100..0.101 rows=0 loops=1) + Buffers: shared hit=4 read=3 + -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=100 width=0) (actual time=0.027..0.027 rows=100 loops=1) Index Cond: (unique1 < 100) Buffers: shared hit=2 - -> Bitmap Index Scan on tenk1_unique2 (cost=0.00..19.78 rows=999 width=0) (actual time=0.227..0.227 rows=999 loops=1) + -> Bitmap Index Scan on tenk1_unique2 (cost=0.00..19.78 rows=999 width=0) (actual time=0.070..0.070 rows=999 loops=1) Index Cond: (unique2 > 9000) - Buffers: shared hit=5 - Planning time: 0.088 ms - Execution time: 0.423 ms + Buffers: shared hit=2 read=3 + Planning: + Buffers: shared hit=3 + Planning Time: 0.162 ms + Execution Time: 0.143 ms The numbers provided by BUFFERS help to identify which parts @@ -773,14 +877,14 @@ EXPLAIN ANALYZE UPDATE tenk1 SET hundred = hundred + 1 WHERE unique1 < 100; QUERY PLAN -------------------------------------------------------------------&zwsp;------------------------------------------------------------- - Update on tenk1 (cost=5.08..230.08 rows=0 width=0) (actual time=3.791..3.792 rows=0 loops=1) - -> Bitmap Heap Scan on tenk1 (cost=5.08..230.08 rows=102 width=10) (actual time=0.069..0.513 rows=100 loops=1) + Update on tenk1 (cost=5.06..225.23 rows=0 width=0) (actual time=1.634..1.635 rows=0 loops=1) + -> Bitmap Heap Scan on tenk1 (cost=5.06..225.23 rows=100 width=10) (actual time=0.065..0.141 rows=100 loops=1) Recheck Cond: (unique1 < 100) Heap Blocks: exact=90 - -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.05 rows=102 width=0) (actual time=0.036..0.037 rows=300 loops=1) + -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=100 width=0) (actual time=0.031..0.031 rows=100 loops=1) Index Cond: (unique1 < 100) - Planning Time: 0.113 ms - Execution Time: 3.850 ms + Planning Time: 0.151 ms + Execution Time: 1.856 ms ROLLBACK; @@ -805,32 +909,30 @@ ROLLBACK; When an UPDATE, DELETE, or - MERGE command affects an + MERGE command affects a partitioned table or inheritance hierarchy, the output might look like this: -EXPLAIN UPDATE parent SET f2 = f2 + 1 WHERE f1 = 101; - QUERY PLAN --------------------------------------------------------------------&zwsp;----------------------------------- - Update on parent (cost=0.00..24.59 rows=0 width=0) - Update on parent parent_1 - Update on child1 parent_2 - Update on child2 parent_3 - Update on child3 parent_4 - -> Result (cost=0.00..24.59 rows=4 width=14) - -> Append (cost=0.00..24.54 rows=4 width=14) - -> Seq Scan on parent parent_1 (cost=0.00..0.00 rows=1 width=14) - Filter: (f1 = 101) - -> Index Scan using child1_pkey on child1 parent_2 (cost=0.15..8.17 rows=1 width=14) - Index Cond: (f1 = 101) - -> Index Scan using child2_pkey on child2 parent_3 (cost=0.15..8.17 rows=1 width=14) - Index Cond: (f1 = 101) - -> Index Scan using child3_pkey on child3 parent_4 (cost=0.15..8.17 rows=1 width=14) - Index Cond: (f1 = 101) +EXPLAIN UPDATE gtest_parent SET f1 = CURRENT_DATE WHERE f2 = 101; + + QUERY PLAN +-------------------------------------------------------------------&zwsp;--------------------- + Update on gtest_parent (cost=0.00..3.06 rows=0 width=0) + Update on gtest_child gtest_parent_1 + Update on gtest_child2 gtest_parent_2 + Update on gtest_child3 gtest_parent_3 + -> Append (cost=0.00..3.06 rows=3 width=14) + -> Seq Scan on gtest_child gtest_parent_1 (cost=0.00..1.01 rows=1 width=14) + Filter: (f2 = 101) + -> Seq Scan on gtest_child2 gtest_parent_2 (cost=0.00..1.01 rows=1 width=14) + Filter: (f2 = 101) + -> Seq Scan on gtest_child3 gtest_parent_3 (cost=0.00..1.01 rows=1 width=14) + Filter: (f2 = 101) - In this example the Update node needs to consider three child tables as - well as the originally-mentioned parent table. So there are four input + In this example the Update node needs to consider three child tables, + but not the originally-mentioned partitioned table (since that never + stores any data). So there are three input scanning subplans, one per table. For clarity, the Update node is annotated to show the specific target tables that will be updated, in the same order as the corresponding subplans. @@ -858,6 +960,17 @@ EXPLAIN UPDATE parent SET f2 = f2 + 1 WHERE f1 = 101; EXPLAIN ANALYZE. + + The time shown for the top-level node does not include any time needed + to convert the query's output data into displayable form or to send it + to the client. While EXPLAIN ANALYZE will never + send the data to the client, it can be told to convert the query's + output data to displayable form and measure the time needed for that, + by specifying the SERIALIZE option. That time will + be shown separately, and it's also included in the + total Execution time. + + @@ -867,7 +980,8 @@ EXPLAIN UPDATE parent SET f2 = f2 + 1 WHERE f1 = 101; There are two significant ways in which run times measured by EXPLAIN ANALYZE can deviate from normal execution of the same query. First, since no output rows are delivered to the client, - network transmission costs and I/O conversion costs are not included. + network transmission costs are not included. I/O conversion costs are + not included either unless SERIALIZE is specified. Second, the measurement overhead added by EXPLAIN ANALYZE can be significant, especially on machines with slow gettimeofday() operating-system calls. You can use the @@ -900,13 +1014,13 @@ EXPLAIN ANALYZE SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000 QUERY PLAN -------------------------------------------------------------------&zwsp;------------------------------------------------------------ - Limit (cost=0.29..14.71 rows=2 width=244) (actual time=0.177..0.249 rows=2 loops=1) - -> Index Scan using tenk1_unique2 on tenk1 (cost=0.29..72.42 rows=10 width=244) (actual time=0.174..0.244 rows=2 loops=1) + Limit (cost=0.29..14.33 rows=2 width=244) (actual time=0.051..0.071 rows=2 loops=1) + -> Index Scan using tenk1_unique2 on tenk1 (cost=0.29..70.50 rows=10 width=244) (actual time=0.051..0.070 rows=2 loops=1) Index Cond: (unique2 > 9000) Filter: (unique1 < 100) Rows Removed by Filter: 287 - Planning time: 0.096 ms - Execution time: 0.336 ms + Planning Time: 0.077 ms + Execution Time: 0.086 ms the estimated cost and row count for the Index Scan node are shown as @@ -987,8 +1101,8 @@ WHERE relname LIKE 'tenk1%'; relname | relkind | reltuples | relpages ----------------------+---------+-----------+---------- - tenk1 | r | 10000 | 358 - tenk1_hundred | i | 10000 | 30 + tenk1 | r | 10000 | 345 + tenk1_hundred | i | 10000 | 11 tenk1_thous_tenthous | i | 10000 | 30 tenk1_unique1 | i | 10000 | 30 tenk1_unique2 | i | 10000 | 30 @@ -1061,17 +1175,31 @@ WHERE tablename = 'road'; attname | inherited | n_distinct | most_common_vals ---------+-----------+------------+------------------------------------ - name | f | -0.363388 | I- 580 Ramp+ + name | f | -0.5681108 | I- 580 Ramp+ | | | I- 880 Ramp+ | | | Sp Railroad + | | | I- 580 + - | | | I- 680 Ramp - name | t | -0.284859 | I- 880 Ramp+ - | | | I- 580 Ramp+ | | | I- 680 Ramp+ + | | | I- 80 Ramp+ + | | | 14th St + + | | | I- 880 + + | | | Mac Arthur Blvd+ + | | | Mission Blvd+ +... + name | t | -0.5125 | I- 580 Ramp+ + | | | I- 880 Ramp+ | | | I- 580 + - | | | State Hwy 13 Ramp -(2 rows) + | | | I- 680 Ramp+ + | | | I- 80 Ramp+ + | | | Sp Railroad + + | | | I- 880 + + | | | State Hwy 13 Ramp+ + | | | I- 80 + + | | | State Hwy 24 Ramp+ +... + thepath | f | 0 | + thepath | t | 0 | +(4 rows) Note that two rows are displayed for the same column, one corresponding @@ -1079,6 +1207,8 @@ WHERE tablename = 'road'; road table (inherited=t), and another one including only the road table itself (inherited=f). + (For brevity, we have only shown the first ten most-common values for + the name column.) diff --git a/doc/src/sgml/pgbuffercache.sgml b/doc/src/sgml/pgbuffercache.sgml index afe2d97834049..802a5112d77d7 100644 --- a/doc/src/sgml/pgbuffercache.sgml +++ b/doc/src/sgml/pgbuffercache.sgml @@ -11,6 +11,8 @@ The pg_buffercache module provides a means for examining what's happening in the shared buffer cache in real time. + It also offers a low-level way to evict data from it, for testing + purposes. @@ -21,11 +23,16 @@ pg_buffercache_summary + + pg_buffercache_evict + + This module provides the pg_buffercache_pages() function (wrapped in the pg_buffercache view), - the pg_buffercache_summary() function, and the - pg_buffercache_usage_counts() function. + the pg_buffercache_summary() function, the + pg_buffercache_usage_counts() function and + the pg_buffercache_evict() function. @@ -47,9 +54,15 @@ - By default, use is restricted to superusers and roles with privileges of the - pg_monitor role. Access may be granted to others - using GRANT. + By default, use of the above functions is restricted to superusers and roles + with privileges of the pg_monitor role. Access may be + granted to others using GRANT. + + + + The pg_buffercache_evict() function allows a block to + be evicted from the buffer pool given a buffer identifier. Use of this + function is restricted to superusers only. @@ -351,7 +364,21 @@ - + + The <function>pg_buffercache_evict()</function> Function + + The pg_buffercache_evict() function takes a buffer + identifier, as shown in the bufferid column of + the pg_buffercache view. It returns true on success, + and false if the buffer wasn't valid, if it couldn't be evicted because it + was pinned, or if it became dirty again after an attempt to write it out. + The result is immediately out of date upon return, as the buffer might + become valid again at any time due to concurrent activity. The function is + intended for developer testing only. + + + + Sample Output diff --git a/doc/src/sgml/pgcrypto.sgml b/doc/src/sgml/pgcrypto.sgml index 2e29f1d6f7749..b8b89696e7f68 100644 --- a/doc/src/sgml/pgcrypto.sgml +++ b/doc/src/sgml/pgcrypto.sgml @@ -442,7 +442,7 @@ gen_salt(type text [, iter_count integer ]) returns text The functions here implement the encryption part of the OpenPGP - (RFC 4880) + (RFC 4880) standard. Supported are both symmetric-key and public-key encryption. @@ -1220,72 +1220,6 @@ gen_random_uuid() returns uuid ciphertexts of a given size. - - - Useful Reading - - - - - The GNU Privacy Handbook. - - - - Describes the crypt-blowfish algorithm. - - - - - - How to choose a good password. - - - - Interesting idea for picking passwords. - - - - - - Describes good and bad cryptography. - - - - - - Technical References - - - - - OpenPGP message format. - - - - The MD5 Message-Digest Algorithm. - - - - HMAC: Keyed-Hashing for Message Authentication. - - - - - - Comparison of crypt-des, crypt-md5 and bcrypt algorithms. - - - - - - Description of Fortuna CSPRNG. - - - - Jean-Luc Cooke Fortuna-based /dev/random driver for Linux. - - - diff --git a/doc/src/sgml/pgfreespacemap.sgml b/doc/src/sgml/pgfreespacemap.sgml index 829ad60f32fdc..3774a9f8c6b29 100644 --- a/doc/src/sgml/pgfreespacemap.sgml +++ b/doc/src/sgml/pgfreespacemap.sgml @@ -67,7 +67,7 @@ For indexes, what is tracked is entirely-unused pages, rather than free space within pages. Therefore, the values are not meaningful, just - whether a page is full or empty. + whether a page is in-use or empty. diff --git a/doc/src/sgml/pgrowlocks.sgml b/doc/src/sgml/pgrowlocks.sgml index b5e655735a1d5..9c6e86b27ed5c 100644 --- a/doc/src/sgml/pgrowlocks.sgml +++ b/doc/src/sgml/pgrowlocks.sgml @@ -74,7 +74,7 @@ pgrowlocks(text) returns setof record modes text[] Lock mode of lockers (more than one if multitransaction), - an array of Key Share, Share, + an array of For Key Share, For Share, For No Key Update, No Key Update, For Update, Update. diff --git a/doc/src/sgml/pgstatstatements.sgml b/doc/src/sgml/pgstatstatements.sgml index b1214ee6453c9..9b0aff73b1efe 100644 --- a/doc/src/sgml/pgstatstatements.sgml +++ b/doc/src/sgml/pgstatstatements.sgml @@ -140,9 +140,12 @@ min_plan_time double precision - Minimum time spent planning the statement, in milliseconds - (if pg_stat_statements.track_planning is enabled, - otherwise zero) + Minimum time spent planning the statement, in milliseconds. + This field will be zero if pg_stat_statements.track_planning + is disabled, or if the counter has been reset using the + pg_stat_statements_reset function with the + minmax_only parameter set to true + and never been planned since. @@ -151,9 +154,12 @@ max_plan_time double precision - Maximum time spent planning the statement, in milliseconds - (if pg_stat_statements.track_planning is enabled, - otherwise zero) + Maximum time spent planning the statement, in milliseconds. + This field will be zero if pg_stat_statements.track_planning + is disabled, or if the counter has been reset using the + pg_stat_statements_reset function with the + minmax_only parameter set to true + and never been planned since. @@ -203,7 +209,11 @@ min_exec_time double precision - Minimum time spent executing the statement, in milliseconds + Minimum time spent executing the statement, in milliseconds, + this field will be zero until this statement + is executed first time after reset performed by the + pg_stat_statements_reset function with the + minmax_only parameter set to true @@ -212,7 +222,11 @@ max_exec_time double precision - Maximum time spent executing the statement, in milliseconds + Maximum time spent executing the statement, in milliseconds, + this field will be zero until this statement + is executed first time after reset performed by the + pg_stat_statements_reset function with the + minmax_only parameter set to true @@ -335,20 +349,40 @@ - blk_read_time double precision + shared_blk_read_time double precision + + + Total time the statement spent reading shared blocks, in milliseconds + (if is enabled, otherwise zero) + + + + + + shared_blk_write_time double precision + + + Total time the statement spent writing shared blocks, in milliseconds + (if is enabled, otherwise zero) + + + + + + local_blk_read_time double precision - Total time the statement spent reading data file blocks, in milliseconds + Total time the statement spent reading local blocks, in milliseconds (if is enabled, otherwise zero) - blk_write_time double precision + local_blk_write_time double precision - Total time the statement spent writing data file blocks, in milliseconds + Total time the statement spent writing local blocks, in milliseconds (if is enabled, otherwise zero) @@ -473,6 +507,47 @@ Total time spent by the statement on emitting code, in milliseconds + + + + jit_deform_count bigint + + + Total number of tuple deform functions JIT-compiled by the statement + + + + + + jit_deform_time double precision + + + Total time spent by the statement on JIT-compiling tuple deform + functions, in milliseconds + + + + + + stats_since timestamp with time zone + + + Time at which statistics gathering started for this statement + + + + + + minmax_stats_since timestamp with time zone + + + Time at which min/max statistics gathering started for this + statement (fields min_plan_time, + max_plan_time, + min_exec_time and + max_exec_time) + + @@ -564,15 +639,21 @@ - As a rule of thumb, queryid values can be assumed to be - stable and comparable only so long as the underlying server version and - catalog metadata details stay exactly the same. Two servers - participating in replication based on physical WAL replay can be expected - to have identical queryid values for the same query. - However, logical replication schemes do not promise to keep replicas - identical in all relevant details, so queryid will - not be a useful identifier for accumulating costs across a set of logical - replicas. If in doubt, direct testing is recommended. + Two servers participating in replication based on physical WAL replay can + be expected to have identical queryid values for + the same query. However, logical replication schemes do not promise to + keep replicas identical in all relevant details, so + queryid will not be a useful identifier for + accumulating costs across a set of logical replicas. + If in doubt, direct testing is recommended. + + + + Generally, it can be assumed that queryid values + are stable between minor version releases of PostgreSQL, + providing that instances are running on the same machine architecture and + the catalog metadata details match. Compatibility will only be broken + between minor versions as a last resort. @@ -674,7 +755,8 @@ - pg_stat_statements_reset(userid Oid, dbid Oid, queryid bigint) returns void + pg_stat_statements_reset(userid Oid, dbid Oid, queryid + bigint, minmax_only boolean) returns timestamp with time zone pg_stat_statements_reset @@ -693,6 +775,20 @@ If all statistics in the pg_stat_statements view are discarded, it will also reset the statistics in the pg_stat_statements_info view. + When minmax_only is true only the + values of minimum and maximum planning and execution time will be reset (i.e. + min_plan_time, max_plan_time, + min_exec_time and max_exec_time + fields). The default value for minmax_only parameter is + false. Time of last min/max reset performed is shown in + minmax_stats_since field of the + pg_stat_statements view. + This function returns the time of a reset. This time is saved to + stats_reset field of + pg_stat_statements_info view or to + minmax_stats_since field of the + pg_stat_statements view if the corresponding reset was + actually performed. By default, this function can only be executed by superusers. Access may be granted to others using GRANT. diff --git a/doc/src/sgml/pgwalinspect.sgml b/doc/src/sgml/pgwalinspect.sgml index 762ad6981767c..3a8121c70f1f1 100644 --- a/doc/src/sgml/pgwalinspect.sgml +++ b/doc/src/sgml/pgwalinspect.sgml @@ -209,7 +209,7 @@ block_fpi_data | The pg_filenode_relation function (see ) can help you to - determine which relation was modified during original execution + determine which relation was modified during original execution. diff --git a/doc/src/sgml/planstats.sgml b/doc/src/sgml/planstats.sgml index d2b84b301f5c6..c7ec749d0a601 100644 --- a/doc/src/sgml/planstats.sgml +++ b/doc/src/sgml/planstats.sgml @@ -30,8 +30,6 @@ The examples shown below use tables in the PostgreSQL regression test database. - The outputs shown are taken from version 8.3. - The behavior of earlier (or later) versions might vary. Note also that since ANALYZE uses random sampling while producing statistics, the results will change slightly after any new ANALYZE. @@ -391,18 +389,20 @@ tablename | null_frac | n_distinct | most_common_vals In this case there is no MCV information for - unique2 because all the values appear to be - unique, so we use an algorithm that relies only on the number of - distinct values for both relations together with their null fractions: + unique2 and all the values appear to be + unique (n_distinct = -1), so we use an algorithm that relies on the row + count estimates for both relations (num_rows, not shown, but "tenk") + together with the column null fractions (zero for both): -selectivity = (1 - null_frac1) * (1 - null_frac2) * min(1/num_distinct1, 1/num_distinct2) +selectivity = (1 - null_frac1) * (1 - null_frac2) / max(num_rows1, num_rows2) = (1 - 0) * (1 - 0) / max(10000, 10000) = 0.0001 This is, subtract the null fraction from one for each of the relations, - and divide by the maximum of the numbers of distinct values. + and divide by the row count of the larger relation (this value does get + scaled in the non-unique case). The number of rows that the join is likely to emit is calculated as the cardinality of the Cartesian product of the two inputs, multiplied by the diff --git a/doc/src/sgml/plperl.sgml b/doc/src/sgml/plperl.sgml index 25b1077ad7382..8007261d0224c 100644 --- a/doc/src/sgml/plperl.sgml +++ b/doc/src/sgml/plperl.sgml @@ -1093,6 +1093,19 @@ $$ LANGUAGE plperl; be permitted to use this language. + + + Trusted PL/Perl relies on the Perl Opcode module to + preserve security. + Perl + documents + that the module is not effective for the trusted PL/Perl use case. If + your security needs are incompatible with the uncertainty in that warning, + consider executing REVOKE USAGE ON LANGUAGE plperl FROM + PUBLIC. + + + Here is an example of a function that will not work because file system operations are not allowed for security reasons: diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml index f55e901c7e5ed..8f4db1b114fdc 100644 --- a/doc/src/sgml/plpgsql.sgml +++ b/doc/src/sgml/plpgsql.sgml @@ -675,12 +675,14 @@ DECLARE Copying Types -variable%TYPE +name table.column%TYPE +name variable%TYPE - %TYPE provides the data type of a variable or - table column. You can use this to declare variables that will hold + %TYPE provides the data type of a table column + or a previously-declared PL/pgSQL + variable. You can use this to declare variables that will hold database values. For example, let's say you have a column named user_id in your users table. To declare a variable with the same data type as @@ -690,6 +692,21 @@ user_id users.user_id%TYPE; + + It is also possible to write array decoration + after %TYPE, thereby creating a variable that holds + an array of the referenced type: + +user_ids users.user_id%TYPE[]; +user_ids users.user_id%TYPE ARRAY[4]; -- equivalent to the above + + Just as when declaring table columns that are arrays, it doesn't + matter whether you write multiple bracket pairs or specific array + dimensions: PostgreSQL treats all arrays of + a given element type as the same type, regardless of dimensionality. + (See .) + + By using %TYPE you don't need to know the data type of the structure you are referencing, and most importantly, @@ -739,6 +756,12 @@ user_id users.user_id%TYPE; %ROWTYPE is more portable.) + + As with %TYPE, %ROWTYPE can be + followed by array decoration to declare a variable that holds an array + of the referenced composite type. + + Parameters to a function can be composite types (complete table rows). In that case, the @@ -1020,8 +1043,8 @@ INSERT INTO mytable VALUES (1,'one'), (2,'two'); - If the command does return rows (for example SELECT, - or INSERT/UPDATE/DELETE + If the command does return rows (for example SELECT, or + INSERT/UPDATE/DELETE/MERGE with RETURNING), there are two ways to proceed. When the command will return at most one row, or you only care about the first row of output, write the command as usual but add @@ -1149,6 +1172,7 @@ SELECT select_expressions INTO STRICTexpressions INTO STRICT target; UPDATE ... RETURNING expressions INTO STRICT target; DELETE ... RETURNING expressions INTO STRICT target; +MERGE ... RETURNING expressions INTO STRICT target; where target can be a record variable, a row @@ -1159,8 +1183,8 @@ DELETE ... RETURNING expressions INTO STRIC INTO clause) just as described above, and the plan is cached in the same way. This works for SELECT, - INSERT/UPDATE/DELETE with - RETURNING, and certain utility commands + INSERT/UPDATE/DELETE/MERGE + with RETURNING, and certain utility commands that return row sets, such as EXPLAIN. Except for the INTO clause, the SQL command is the same as it would be written outside PL/pgSQL. @@ -1236,7 +1260,7 @@ END; - For INSERT/UPDATE/DELETE with + For INSERT/UPDATE/DELETE/MERGE with RETURNING, PL/pgSQL reports an error for more than one returned row, even when STRICT is not specified. This is because there @@ -1271,7 +1295,7 @@ $$ LANGUAGE plpgsql; On failure, this function might produce an error message such as ERROR: query returned no rows -DETAIL: parameters: $1 = 'nosuchuser' +DETAIL: parameters: username = 'nosuchuser' CONTEXT: PL/pgSQL function get_userid(text) line 6 at SQL statement @@ -2634,8 +2658,9 @@ $$ LANGUAGE plpgsql; The query used in this type of FOR statement can be any SQL command that returns rows to the caller: SELECT is the most common case, - but you can also use INSERT, UPDATE, or - DELETE with a RETURNING clause. Some utility + but you can also use INSERT, UPDATE, + DELETE, or MERGE with a + RETURNING clause. Some utility commands such as EXPLAIN will work too. @@ -3384,13 +3409,16 @@ FETCH direction { FROM | IN } - FETCH retrieves the next row from the + FETCH retrieves the next row (in the indicated + direction) from the cursor into a target, which might be a row variable, a record variable, or a comma-separated list of simple variables, just like - SELECT INTO. If there is no next row, the + SELECT INTO. If there is no suitable row, the target is set to NULL(s). As with SELECT INTO, the special variable FOUND can - be checked to see whether a row was obtained or not. + be checked to see whether a row was obtained or not. If no row is + obtained, the cursor is positioned after the last row or before the + first row, depending on the movement direction. @@ -3442,11 +3470,25 @@ MOVE direction { FROM | IN } < MOVE repositions a cursor without retrieving - any data. MOVE works exactly like the + any data. MOVE works like the FETCH command, except it only repositions the - cursor and does not return the row moved to. As with SELECT + cursor and does not return the row moved to. + The direction clause can be any of the + variants allowed in the SQL + command, including those that can fetch more than one row; + the cursor is positioned to the last such row. + (However, the case in which the direction + clause is simply a count expression with + no key word is deprecated in PL/pgSQL. + That syntax is ambiguous with the case where + the direction clause is omitted + altogether, and hence it may fail if + the count is not a constant.) + As with SELECT INTO, the special variable FOUND can - be checked to see whether there was a next row to move to. + be checked to see whether there was a row to move to. If there is no + such row, the cursor is positioned after the last row or before the + first row, depending on the movement direction. @@ -3720,6 +3762,17 @@ CALL transaction_test1(); SELECT in between. + + PL/pgSQL does not support savepoints + (SAVEPOINT/ROLLBACK TO + SAVEPOINT/RELEASE SAVEPOINT commands). + Typical usage patterns for savepoints can be replaced by blocks with + exception handlers (see ). + Under the hood, a block with exception handlers forms a + subtransaction, which means that transactions cannot be ended inside + such a block. + + Special considerations apply to cursor loops. Consider this example: @@ -3745,7 +3798,10 @@ CALL transaction_test2(); evaluated at the first COMMIT or ROLLBACK rather than row by row. The cursor is still removed automatically after the loop, so this is mostly invisible to the - user. + user. But one must keep in mind that any table or row locks taken by + the cursor's query will no longer be held after the + first COMMIT or + ROLLBACK. @@ -3753,10 +3809,6 @@ CALL transaction_test2(); that are not read-only (for example UPDATE ... RETURNING). - - - A transaction cannot be ended inside a block with exception handlers. - @@ -3942,7 +3994,7 @@ RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id; If no condition name nor SQLSTATE is specified in a RAISE EXCEPTION command, the default is to use - ERRCODE_RAISE_EXCEPTION (P0001). + raise_exception (P0001). If no message text is specified, the default is to use the condition name or SQLSTATE as message text. @@ -4330,11 +4382,11 @@ CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$ -- making use of the special variable TG_OP to work out the operation. -- IF (TG_OP = 'DELETE') THEN - INSERT INTO emp_audit SELECT 'D', now(), user, OLD.*; + INSERT INTO emp_audit SELECT 'D', now(), current_user, OLD.*; ELSIF (TG_OP = 'UPDATE') THEN - INSERT INTO emp_audit SELECT 'U', now(), user, NEW.*; + INSERT INTO emp_audit SELECT 'U', now(), current_user, NEW.*; ELSIF (TG_OP = 'INSERT') THEN - INSERT INTO emp_audit SELECT 'I', now(), user, NEW.*; + INSERT INTO emp_audit SELECT 'I', now(), current_user, NEW.*; END IF; RETURN NULL; -- result is ignored since this is an AFTER trigger END; @@ -4400,20 +4452,20 @@ CREATE OR REPLACE FUNCTION update_emp_view() RETURNS TRIGGER AS $$ IF NOT FOUND THEN RETURN NULL; END IF; OLD.last_updated = now(); - INSERT INTO emp_audit VALUES('D', user, OLD.*); + INSERT INTO emp_audit VALUES('D', current_user, OLD.*); RETURN OLD; ELSIF (TG_OP = 'UPDATE') THEN UPDATE emp SET salary = NEW.salary WHERE empname = OLD.empname; IF NOT FOUND THEN RETURN NULL; END IF; NEW.last_updated = now(); - INSERT INTO emp_audit VALUES('U', user, NEW.*); + INSERT INTO emp_audit VALUES('U', current_user, NEW.*); RETURN NEW; ELSIF (TG_OP = 'INSERT') THEN INSERT INTO emp VALUES(NEW.empname, NEW.salary); NEW.last_updated = now(); - INSERT INTO emp_audit VALUES('I', user, NEW.*); + INSERT INTO emp_audit VALUES('I', current_user, NEW.*); RETURN NEW; END IF; END; @@ -4628,13 +4680,13 @@ CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$ -- IF (TG_OP = 'DELETE') THEN INSERT INTO emp_audit - SELECT 'D', now(), user, o.* FROM old_table o; + SELECT 'D', now(), current_user, o.* FROM old_table o; ELSIF (TG_OP = 'UPDATE') THEN INSERT INTO emp_audit - SELECT 'U', now(), user, n.* FROM new_table n; + SELECT 'U', now(), current_user, n.* FROM new_table n; ELSIF (TG_OP = 'INSERT') THEN INSERT INTO emp_audit - SELECT 'I', now(), user, n.* FROM new_table n; + SELECT 'I', now(), current_user, n.* FROM new_table n; END IF; RETURN NULL; -- result is ignored since this is an AFTER trigger END; diff --git a/doc/src/sgml/plpython.sgml b/doc/src/sgml/plpython.sgml index e05e607aba080..bee817ea822a2 100644 --- a/doc/src/sgml/plpython.sgml +++ b/doc/src/sgml/plpython.sgml @@ -553,7 +553,7 @@ $$ LANGUAGE plpython3u; Iterator (any object providing __iter__ and - next methods) + __next__ methods) @@ -569,7 +569,7 @@ AS $$ def __iter__ (self): return self - def next (self): + def __next__(self): self.ndx += 1 if self.ndx == len(self.who): raise StopIteration @@ -1175,7 +1175,7 @@ plan = plpy.prepare("INSERT INTO operations (result) VALUES ($1)", ["text"]) plpy.execute(plan, [result]) $$ LANGUAGE plpython3u; - Note that the use of try/catch is still + Note that the use of try/except is still required. Otherwise the exception would propagate to the top of the Python stack and would cause the whole function to abort with a PostgreSQL error, so that the diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml index 5062d712e74c5..1a600382e2e77 100644 --- a/doc/src/sgml/postgres-fdw.sgml +++ b/doc/src/sgml/postgres-fdw.sgml @@ -124,7 +124,7 @@ user, password and sslpassword (specify these - in a user mapping, instead, or use a service file) + in a user mapping instead, or use a service file) @@ -303,7 +303,7 @@ OPTIONS (ADD password_required 'false'); scans on that server. This represents the additional overhead of data transfer between servers. You might increase or decrease this number to reflect higher or lower network delay to the remote server. - The default value is 0.01. + The default value is 0.2. @@ -337,7 +337,7 @@ OPTIONS (ADD password_required 'false'); - analyze_sampling (text) + analyze_sampling (string) This option, which can be specified for a foreign table or a foreign @@ -1042,6 +1042,44 @@ postgres=# SELECT postgres_fdw_disconnect_all(); + + Wait Events + + + postgres_fdw can report the following wait events + under the wait event type Extension: + + + + + PostgresFdwCleanupResult + + + Waiting for transaction abort on remote server. + + + + + + PostgresFdwConnect + + + Waiting to establish a connection to a remote server. + + + + + + PostgresFdwGetResult + + + Waiting to receive the results of a query from a remote server. + + + + + + Configuration Parameters @@ -1067,9 +1105,9 @@ postgres=# SELECT postgres_fdw_disconnect_all(); of any length and contain even non-ASCII characters. However when it's passed to and used as application_name in a foreign server, note that it will be truncated to less than - NAMEDATALEN characters and anything other than - printable ASCII characters will be replaced with question - marks (?). + NAMEDATALEN characters. + Anything other than printable ASCII characters are replaced with C-style hexadecimal escapes. See for details. diff --git a/doc/src/sgml/postgres.sgml b/doc/src/sgml/postgres.sgml index 2e271862fc180..7be25c58507fb 100644 --- a/doc/src/sgml/postgres.sgml +++ b/doc/src/sgml/postgres.sgml @@ -9,6 +9,7 @@ %filelist; + At present there is a hard-wired set of parameters for which - ParameterStatus will be generated: they are - server_version, - server_encoding, - client_encoding, - application_name, - default_transaction_read_only, - in_hot_standby, - is_superuser, - session_authorization, - DateStyle, - IntervalStyle, - TimeZone, - integer_datetimes, and - standard_conforming_strings. - (server_encoding, TimeZone, and - integer_datetimes were not reported by releases before 8.0; - standard_conforming_strings was not reported by releases - before 8.1; - IntervalStyle was not reported by releases before 8.4; - application_name was not reported by releases before - 9.0; - default_transaction_read_only and + ParameterStatus will be generated. They are: + + application_name + client_encoding + DateStyle + default_transaction_read_only + in_hot_standby + integer_datetimes + IntervalStyle + is_superuser + scram_iterations + server_encoding + server_version + session_authorization + standard_conforming_strings + TimeZone + + (default_transaction_read_only and in_hot_standby were not reported by releases before - 14.) + 14; scram_iterations was not reported by releases + before 16.) Note that server_version, server_encoding and @@ -1509,10 +1506,10 @@ SELCT 1/0; The frontend should also be prepared to handle an ErrorMessage - response to SSLRequest from the server. This would only occur if - the server predates the addition of SSL support - to PostgreSQL. (Such servers are now very ancient, - and likely do not exist in the wild anymore.) + response to SSLRequest from the server. The frontend should not display + this error message to the user/application, since the server has not been + authenticated + (CVE-2024-10977). In this case the connection must be closed, but the frontend might choose to open a fresh connection and proceed without requesting SSL. @@ -1532,11 +1529,47 @@ SELCT 1/0; bytes. + + Likewise the server expects the client to not begin + the SSL negotiation until it receives the server's + single byte response to the SSL request. If the + client begins the SSL negotiation immediately without + waiting for the server response to be received it can reduce connection + latency by one round-trip. However this comes at the cost of not being + able to handle the case where the server sends a negative response to the + SSL request. In that case instead of continuing with either GSSAPI or an + unencrypted connection or a protocol error the server will simply + disconnect. + + An initial SSLRequest can also be used in a connection that is being opened to send a CancelRequest message. + + A second alternate way to initiate SSL encryption is + available. The server will recognize connections which immediately + begin SSL negotiation without any previous SSLRequest + packets. Once the SSL connection is established the + server will expect a normal startup-request packet and continue + negotiation over the encrypted channel. In this case any other requests + for encryption will be refused. This method is not preferred for general + purpose tools as it cannot negotiate the best connection encryption + available or handle unencrypted connections. However it is useful for + environments where both the server and client are controlled together. + In that case it avoids one round trip of latency and allows the use of + network tools that depend on standard SSL connections. + When using SSL connections in this style the client is + required to use the ALPN extension defined + by RFC 7301 to + protect against protocol confusion attacks. + The PostgreSQL protocol is "postgresql" as + registered + at IANA + TLS ALPN Protocol IDs registry. + + While the protocol itself does not provide a way for the server to force SSL encryption, the administrator can @@ -1567,7 +1600,7 @@ SELCT 1/0; respectively. The frontend might close the connection at this point if it is dissatisfied with the response. To continue after G, using the GSSAPI C bindings as discussed in - RFC 2744 + RFC 2744 or equivalent, perform a GSSAPI initialization by calling gss_init_sec_context() in a loop and sending the result to the server, starting with an empty input and then with each @@ -1586,12 +1619,13 @@ SELCT 1/0; The frontend should also be prepared to handle an ErrorMessage - response to GSSENCRequest from the server. This would only occur if - the server predates the addition of GSSAPI encryption - support to PostgreSQL. In this case the - connection must be closed, but the frontend might choose to open a fresh - connection and proceed without requesting GSSAPI - encryption. + response to GSSENCRequest from the server. The frontend should not display + this error message to the user/application, since the server has not been + authenticated + (CVE-2024-10977). + In this case the connection must be closed, but the frontend might choose + to open a fresh connection and proceed without requesting + GSSAPI encryption. @@ -1704,8 +1738,8 @@ SELCT 1/0; The implemented SASL mechanisms at the moment are SCRAM-SHA-256 and its variant with channel binding SCRAM-SHA-256-PLUS. They are described in - detail in RFC 7677 - and RFC 5802. + detail in RFC 7677 + and RFC 5802. @@ -2060,6 +2094,17 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" + + + FAILOVER [ boolean ] + + + If true, the slot is enabled to be synced to the standbys + so that logical replication can be resumed after failover. + The default is false. + + + @@ -2124,6 +2169,47 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" + + ALTER_REPLICATION_SLOT slot_name ( option [, ...] ) + ALTER_REPLICATION_SLOT + + + + Change the definition of a replication slot. + See for more about + replication slots. This command is currently only supported for logical + replication slots. + + + + + slot_name + + + The name of the slot to alter. Must be a valid replication slot + name (see ). + + + + + + The following option is supported: + + + + FAILOVER [ boolean ] + + + If true, the slot is enabled to be synced to the standbys + so that logical replication can be resumed after failover. + + + + + + + + READ_REPLICATION_SLOT slot_name READ_REPLICATION_SLOT @@ -2222,8 +2308,10 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" - WAL data is sent as a series of CopyData messages. (This allows - other information to be intermixed; in particular the server can send + WAL data is sent as a series of CopyData messages; + see and for details. + (This allows other information to be intermixed; in particular the server can send an ErrorResponse message if it encounters a failure after beginning to stream.) The payload of each CopyData message from server to the client contains a message of one of the following formats: @@ -2437,11 +2525,12 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" Int32 - The standby's current global xmin, excluding the catalog_xmin from any - replication slots. If both this value and the following - catalog_xmin are 0 this is treated as a notification that hot standby - feedback will no longer be sent on this connection. Later non-zero - messages may reinitiate the feedback mechanism. + The standby's current global xmin, excluding the + catalog_xmin from any replication slots. If both + this value and the following catalog_xmin + are 0, this is treated as a notification that hot standby feedback + will no longer be sent on this connection. Later non-zero messages + may reinitiate the feedback mechanism. @@ -2450,7 +2539,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" Int32 - The epoch of the global xmin xid on the standby. + The epoch of the global xmin xid on the standby. @@ -2459,8 +2548,9 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" Int32 - The lowest catalog_xmin of any replication slots on the standby. Set to 0 - if no catalog_xmin exists on the standby or if hot standby feedback is being + The lowest catalog_xmin of any replication + slots on the standby. Set to 0 if no catalog_xmin + exists on the standby or if hot standby feedback is being disabled. @@ -2470,7 +2560,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" Int32 - The epoch of the catalog_xmin xid on the standby. + The epoch of the catalog_xmin xid on the standby. @@ -2541,7 +2631,10 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" option_name - The name of an option passed to the slot's logical decoding plugin. + The name of an option passed to the slot's logical decoding output + plugin. See for + options that are accepted by the standard (pgoutput) + plugin. @@ -2567,8 +2660,6 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" Drops a replication slot, freeing any reserved server-side resources. - If the slot is a logical slot that was created in a database other than - the database the walsender is connected to, this command fails. @@ -2595,6 +2686,19 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" + + + UPLOAD_MANIFEST + UPLOAD_MANIFEST + + + + Uploads a backup manifest in preparation for taking an incremental + backup. + + + + BASE_BACKUP [ ( option [, ...] ) ] BASE_BACKUP @@ -2834,6 +2938,17 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" + + + INCREMENTAL + + + Requests an incremental backup. The + UPLOAD_MANIFEST command must be executed + before running a base backup with this option. + + + @@ -3049,7 +3164,7 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" Files other than regular files and directories, such as symbolic links (other than for the directories listed above) and special - device files, are skipped. (Symbolic links + device and operating system files, are skipped. (Symbolic links in pg_tblspc are maintained.) @@ -3061,6 +3176,13 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" + + + In all the above commands, + when specifying a parameter of type boolean the + value part can be omitted, + which is equivalent to specifying TRUE. + @@ -3078,12 +3200,18 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" the physical streaming replication protocol. + + PostgreSQL logical decoding supports output + plugins. pgoutput is the standard one used for + the built-in logical replication. + + Logical Streaming Replication Parameters - The logical replication START_REPLICATION command - accepts following parameters: + Using the START_REPLICATION command, + pgoutput accepts the following options: @@ -3093,7 +3221,8 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" Protocol version. Currently versions 1, 2, - 3, and 4 are supported. + 3, and 4 are supported. A valid + version is required. Version 2 is supported only for server version 14 @@ -3120,6 +3249,73 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" Comma separated list of publication names for which to subscribe (receive changes). The individual publication names are treated as standard objects names and can be quoted the same as needed. + At least one publication name is required. + + + + + + + binary + + + + Boolean option to use binary transfer mode. Binary mode is faster + than the text mode but slightly less robust. + + + + + + + messages + + + + Boolean option to enable sending the messages that are written + by pg_logical_emit_message. + + + + + + + streaming + + + + Boolean option to enable streaming of in-progress transactions. + It accepts an additional value "parallel" to enable sending extra + information with some messages to be used for parallelisation. + Minimum protocol version 2 is required to turn it on. Minimum protocol + version 4 is required for the "parallel" option. + + + + + + + two_phase + + + + Boolean option to enable two-phase transactions. Minimum protocol + version 3 is required to turn it on. + + + + + + + origin + + + + Option to send changes by their origin. Possible values are "none" + to only send the changes that have no origin associated, or "any" + to send the changes regardless of their origin. This can be used + to avoid loops (infinite replication of the same data) among + replication nodes. diff --git a/doc/src/sgml/queries.sgml b/doc/src/sgml/queries.sgml index 3f9584928c516..a326960ff4dfb 100644 --- a/doc/src/sgml/queries.sgml +++ b/doc/src/sgml/queries.sgml @@ -392,7 +392,7 @@ FROM table_reference , table_r input tables. As with USING, these columns appear only once in the output table. If there are no common column names, NATURAL JOIN behaves like - JOIN ... ON TRUE, producing a cross-product join. + CROSS JOIN. @@ -1362,7 +1362,7 @@ GROUPING SETS ( If multiple grouping items are specified in a single GROUP BY - clause, then the final list of grouping sets is the cross product of the + clause, then the final list of grouping sets is the Cartesian product of the individual items. For example: GROUP BY a, CUBE (b, c), GROUPING SETS ((d), (e)) @@ -1461,10 +1461,10 @@ GROUP BY GROUPING SETS ( When multiple window functions are used, all the window functions having - syntactically equivalent PARTITION BY and ORDER BY - clauses in their window definitions are guaranteed to be evaluated in a - single pass over the data. Therefore they will see the same sort ordering, - even if the ORDER BY does not uniquely determine an ordering. + equivalent PARTITION BY and ORDER BY + clauses in their window definitions are guaranteed to see the same + ordering of the input rows, even if the ORDER BY does + not uniquely determine the ordering. However, no guarantees are made about the evaluation of functions having different PARTITION BY or ORDER BY specifications. (In such cases a sort step is typically required between the passes of @@ -1912,7 +1912,8 @@ SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong SELECT select_list FROM table_expression ORDER BY ... - LIMIT { number | ALL } OFFSET number + LIMIT { count | ALL } + OFFSET start @@ -2062,9 +2063,10 @@ SELECT select_list FROM table_expression Table Expressions or CTEs, can be thought of as defining temporary tables that exist just for one query. Each auxiliary statement in a WITH clause can be a SELECT, - INSERT, UPDATE, or DELETE; and the + INSERT, UPDATE, DELETE, + or MERGE; and the WITH clause itself is attached to a primary statement that can - be a SELECT, INSERT, UPDATE, + also be a SELECT, INSERT, UPDATE, DELETE, or MERGE. @@ -2598,8 +2600,8 @@ SELECT * FROM w AS w1 JOIN w AS w2 ON w1.f = w2.f; Data-Modifying Statements in <literal>WITH</literal> - You can use most data-modifying statements (INSERT, - UPDATE, or DELETE, but not + You can use data-modifying statements (INSERT, + UPDATE, DELETE, or MERGE) in WITH. This allows you to perform several different operations in the same query. An example is: diff --git a/doc/src/sgml/ref/allfiles.sgml b/doc/src/sgml/ref/allfiles.sgml index 54b5f22d6ec9f..f5be638867abe 100644 --- a/doc/src/sgml/ref/allfiles.sgml +++ b/doc/src/sgml/ref/allfiles.sgml @@ -202,8 +202,10 @@ Complete list of usable sgml source files in this directory. + + @@ -218,6 +220,7 @@ Complete list of usable sgml source files in this directory. + diff --git a/doc/src/sgml/ref/alter_default_privileges.sgml b/doc/src/sgml/ref/alter_default_privileges.sgml index a33461fbc2f43..89aacec4fab84 100644 --- a/doc/src/sgml/ref/alter_default_privileges.sgml +++ b/doc/src/sgml/ref/alter_default_privileges.sgml @@ -46,7 +46,8 @@ GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPES TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] -GRANT { USAGE | CREATE | ALL [ PRIVILEGES ] } +GRANT { { USAGE | CREATE } + [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAS TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] @@ -77,7 +78,8 @@ REVOKE [ GRANT OPTION FOR ] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] - { USAGE | CREATE | ALL [ PRIVILEGES ] } + { { USAGE | CREATE } + [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAS FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] @@ -88,25 +90,19 @@ REVOKE [ GRANT OPTION FOR ] Description - ALTER DEFAULT PRIVILEGES allows you to set the privileges - that will be applied to objects created in the future. (It does not - affect privileges assigned to already-existing objects.) Currently, - only the privileges for schemas, tables (including views and foreign - tables), sequences, functions, and types (including domains) can be - altered. For this command, functions include aggregates and procedures. - The words FUNCTIONS and ROUTINES are - equivalent in this command. (ROUTINES is preferred - going forward as the standard term for functions and procedures taken - together. In earlier PostgreSQL releases, only the - word FUNCTIONS was allowed. It is not possible to set - default privileges for functions and procedures separately.) + ALTER DEFAULT PRIVILEGES allows you to set the + privileges that will be applied to objects created in the future. + (It does not affect privileges assigned to already-existing objects.) + Privileges can be set globally (i.e., for all objects created in the + current database), or just for objects created in specified schemas. - You can change default privileges only for objects that will be created by - yourself or by roles that you are a member of. The privileges can be set - globally (i.e., for all objects created in the current database), - or just for objects created in specified schemas. + While you can change your own default privileges and the defaults of + roles that you are a member of, at object creation time, new object + permissions are only affected by the default privileges of the current + role, and are not inherited from any roles in which the current role + is a member. @@ -118,6 +114,19 @@ REVOKE [ GRANT OPTION FOR ] ALTER DEFAULT PRIVILEGES. + + Currently, + only the privileges for schemas, tables (including views and foreign + tables), sequences, functions, and types (including domains) can be + altered. For this command, functions include aggregates and procedures. + The words FUNCTIONS and ROUTINES are + equivalent in this command. (ROUTINES is preferred + going forward as the standard term for functions and procedures taken + together. In earlier PostgreSQL releases, only the + word FUNCTIONS was allowed. It is not possible to set + default privileges for functions and procedures separately.) + + Default privileges that are specified per-schema are added to whatever the global default privileges are for the particular object type. @@ -136,8 +145,9 @@ REVOKE [ GRANT OPTION FOR ] target_role - The name of an existing role of which the current role is a member. - If FOR ROLE is omitted, the current role is assumed. + Change default privileges for objects created by the + target_role, or the current + role if unspecified. diff --git a/doc/src/sgml/ref/alter_domain.sgml b/doc/src/sgml/ref/alter_domain.sgml index f6704d7557a81..74855172222ec 100644 --- a/doc/src/sgml/ref/alter_domain.sgml +++ b/doc/src/sgml/ref/alter_domain.sgml @@ -41,6 +41,11 @@ ALTER DOMAIN name RENAME TO new_name ALTER DOMAIN name SET SCHEMA new_schema + +where domain_constraint is: + +[ CONSTRAINT constraint_name ] +{ NOT NULL | CHECK (expression) } @@ -79,8 +84,7 @@ ALTER DOMAIN name ADD domain_constraint [ NOT VALID ] - This form adds a new constraint to a domain using the same syntax as - CREATE DOMAIN. + This form adds a new constraint to a domain. When a new constraint is added to a domain, all columns using that domain will be checked against the newly added constraint. These checks can be suppressed by adding the new constraint using the diff --git a/doc/src/sgml/ref/alter_event_trigger.sgml b/doc/src/sgml/ref/alter_event_trigger.sgml index ef5253bf37eb3..139d74e372f38 100644 --- a/doc/src/sgml/ref/alter_event_trigger.sgml +++ b/doc/src/sgml/ref/alter_event_trigger.sgml @@ -73,7 +73,7 @@ ALTER EVENT TRIGGER name RENAME TO - DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER + DISABLE/ENABLE [ REPLICA | ALWAYS ] These forms configure the firing of event triggers. A disabled trigger diff --git a/doc/src/sgml/ref/alter_foreign_data_wrapper.sgml b/doc/src/sgml/ref/alter_foreign_data_wrapper.sgml index 54f34c2c01516..dc0957d965a62 100644 --- a/doc/src/sgml/ref/alter_foreign_data_wrapper.sgml +++ b/doc/src/sgml/ref/alter_foreign_data_wrapper.sgml @@ -153,7 +153,7 @@ ALTER FOREIGN DATA WRAPPER name REN Change a foreign-data wrapper dbi, add option foo, drop bar: -ALTER FOREIGN DATA WRAPPER dbi OPTIONS (ADD foo '1', DROP 'bar'); +ALTER FOREIGN DATA WRAPPER dbi OPTIONS (ADD foo '1', DROP bar); diff --git a/doc/src/sgml/ref/alter_index.sgml b/doc/src/sgml/ref/alter_index.sgml index e26efec064bee..1d42d05d85816 100644 --- a/doc/src/sgml/ref/alter_index.sgml +++ b/doc/src/sgml/ref/alter_index.sgml @@ -87,10 +87,11 @@ ALTER INDEX ALL IN TABLESPACE name - ATTACH PARTITION + ATTACH PARTITION index_name - Causes the named index to become attached to the altered index. + Causes the named index (possibly schema-qualified) to become attached + to the altered index. The named index must be on a partition of the table containing the index being altered, and have an equivalent definition. An attached index cannot be dropped by itself, and will automatically be dropped diff --git a/doc/src/sgml/ref/alter_materialized_view.sgml b/doc/src/sgml/ref/alter_materialized_view.sgml index da7ed045974f4..f81a7393f5d2f 100644 --- a/doc/src/sgml/ref/alter_materialized_view.sgml +++ b/doc/src/sgml/ref/alter_materialized_view.sgml @@ -100,7 +100,7 @@ ALTER MATERIALIZED VIEW ALL IN TABLESPACE namecolumn_name - Name of a new or existing column. + Name of an existing column. diff --git a/doc/src/sgml/ref/alter_operator.sgml b/doc/src/sgml/ref/alter_operator.sgml index a4a1af564ffb5..673dcce2f50b3 100644 --- a/doc/src/sgml/ref/alter_operator.sgml +++ b/doc/src/sgml/ref/alter_operator.sgml @@ -30,7 +30,11 @@ ALTER OPERATOR name ( { left_typename ( { left_type | NONE } , right_type ) SET ( { RESTRICT = { res_proc | NONE } | JOIN = { join_proc | NONE } - } [, ... ] ) + | COMMUTATOR = com_op + | NEGATOR = neg_op + | HASHES + | MERGES + } [, ... ] ) @@ -121,9 +125,69 @@ ALTER OPERATOR name ( { left_type + + com_op + + + The commutator of this operator. Can only be changed if the operator + does not have an existing commutator. + + + + + + neg_op + + + The negator of this operator. Can only be changed if the operator does + not have an existing negator. + + + + + + HASHES + + + Indicates this operator can support a hash join. Can only be enabled and + not disabled. + + + + + + MERGES + + + Indicates this operator can support a merge join. Can only be enabled + and not disabled. + + + + + + Notes + + + Refer to and + for further information. + + + + Since commutators come in pairs that are commutators of each other, + ALTER OPERATOR SET COMMUTATOR will also set the + commutator of the com_op + to be the target operator. Likewise, ALTER OPERATOR SET + NEGATOR will also set the negator of + the neg_op to be the + target operator. Therefore, you must own the commutator or negator + operator as well as the target operator. + + + Examples @@ -131,13 +195,25 @@ ALTER OPERATOR name ( { left_typea @@ b for type text: ALTER OPERATOR @@ (text, text) OWNER TO joe; - + + - Change the restriction and join selectivity estimator functions of a custom operator a && b for type int[]: + Change the restriction and join selectivity estimator functions of a + custom operator a && b for + type int[]: -ALTER OPERATOR && (_int4, _int4) SET (RESTRICT = _int_contsel, JOIN = _int_contjoinsel); - +ALTER OPERATOR && (int[], int[]) SET (RESTRICT = _int_contsel, JOIN = _int_contjoinsel); + + + + + Mark the && operator as being its own + commutator: + +ALTER OPERATOR && (int[], int[]) SET (COMMUTATOR = &&); + + diff --git a/doc/src/sgml/ref/alter_publication.sgml b/doc/src/sgml/ref/alter_publication.sgml index c8424bca15067..44ae7e0e871c8 100644 --- a/doc/src/sgml/ref/alter_publication.sgml +++ b/doc/src/sgml/ref/alter_publication.sgml @@ -51,11 +51,12 @@ ALTER PUBLICATION name RENAME TO ADD and DROP clauses will add and remove one or more tables/schemas from the publication. Note that adding tables/schemas to a publication that is already subscribed to will require an - ALTER SUBSCRIPTION ... REFRESH PUBLICATION action on the + + ALTER SUBSCRIPTION ... REFRESH PUBLICATION action on the subscribing side in order to become effective. Note also that DROP TABLES IN SCHEMA will not drop any schema tables that were specified using - FOR TABLE/ + FOR TABLE/ ADD TABLE, and the combination of DROP with a WHERE clause is not allowed. @@ -81,8 +82,8 @@ ALTER PUBLICATION name RENAME TO CREATE privilege on the database. Also, the new owner of a - FOR ALL TABLES - or FOR TABLES IN SCHEMA + FOR ALL TABLES + or FOR TABLES IN SCHEMA publication must be a superuser. However, a superuser can change the ownership of a publication regardless of these restrictions. diff --git a/doc/src/sgml/ref/alter_role.sgml b/doc/src/sgml/ref/alter_role.sgml index ab1ee45d54e1a..7b0a04bc4637c 100644 --- a/doc/src/sgml/ref/alter_role.sgml +++ b/doc/src/sgml/ref/alter_role.sgml @@ -69,7 +69,9 @@ ALTER ROLE { role_specification | A GRANT and REVOKE for that.) Attributes not mentioned in the command retain their previous settings. - Database superusers can change any of these settings for any role. + Database superusers can change any of these settings for any role, except + for changing the SUPERUSER property for the + bootstrap superuser. Non-superuser roles having CREATEROLE privilege can change most of these properties, but only for non-superuser and non-replication roles for which they have been granted diff --git a/doc/src/sgml/ref/alter_statistics.sgml b/doc/src/sgml/ref/alter_statistics.sgml index 73cc9e830de5b..c82a728a910ee 100644 --- a/doc/src/sgml/ref/alter_statistics.sgml +++ b/doc/src/sgml/ref/alter_statistics.sgml @@ -26,7 +26,7 @@ PostgreSQL documentation ALTER STATISTICS name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER STATISTICS name RENAME TO new_name ALTER STATISTICS name SET SCHEMA new_schema -ALTER STATISTICS name SET STATISTICS new_target +ALTER STATISTICS name SET STATISTICS { new_target | DEFAULT } @@ -101,10 +101,11 @@ ALTER STATISTICS name SET STATISTIC The statistic-gathering target for this statistics object for subsequent ANALYZE operations. - The target can be set in the range 0 to 10000; alternatively, set it - to -1 to revert to using the maximum of the statistics target of the - referenced columns, if set, or the system default statistics - target (). + The target can be set in the range 0 to 10000. Set it to + DEFAULT to revert to using the system default + statistics target (). + (Setting to a value of -1 is an obsolete way spelling to get the same + outcome.) For more information on the use of statistics by the PostgreSQL query planner, refer to . diff --git a/doc/src/sgml/ref/alter_subscription.sgml b/doc/src/sgml/ref/alter_subscription.sgml index a85e04e4d6dcf..2ccbf5e489740 100644 --- a/doc/src/sgml/ref/alter_subscription.sgml +++ b/doc/src/sgml/ref/alter_subscription.sgml @@ -66,15 +66,21 @@ ALTER SUBSCRIPTION name RENAME TO < - Commands ALTER SUBSCRIPTION ... REFRESH PUBLICATION and + Commands ALTER SUBSCRIPTION ... REFRESH PUBLICATION, ALTER SUBSCRIPTION ... {SET|ADD|DROP} PUBLICATION ... - with refresh option as true cannot be - executed inside a transaction block. + with refresh option as true and + ALTER SUBSCRIPTION ... SET (failover = true|false) + cannot be executed inside a transaction block. + - These commands also cannot be executed when the subscription has - two_phase + + Commands ALTER SUBSCRIPTION ... REFRESH PUBLICATION and + ALTER SUBSCRIPTION ... {SET|ADD|DROP} PUBLICATION ... + with refresh option as true also cannot + be executed when the subscription has + two_phase commit enabled, unless - copy_data + copy_data is false. See column subtwophasestate of pg_subscription to know the actual two-phase state. @@ -85,7 +91,7 @@ ALTER SUBSCRIPTION name RENAME TO < Parameters - + name @@ -94,7 +100,7 @@ ALTER SUBSCRIPTION name RENAME TO < - + CONNECTION 'conninfo' @@ -105,7 +111,7 @@ ALTER SUBSCRIPTION name RENAME TO < - + SET PUBLICATION publication_name ADD PUBLICATION publication_name DROP PUBLICATION publication_name @@ -147,13 +153,14 @@ ALTER SUBSCRIPTION name RENAME TO < - + REFRESH PUBLICATION Fetch missing table information from publisher. This will start replication of tables that were added to the subscribed-to publications - since CREATE SUBSCRIPTION or + since + CREATE SUBSCRIPTION or the last invocation of REFRESH PUBLICATION. @@ -177,12 +184,12 @@ ALTER SUBSCRIPTION name RENAME TO < See for details of how copy_data = true can interact with the - origin + origin parameter. See the - binary + binary parameter of CREATE SUBSCRIPTION for details about copying pre-existing data in binary format. @@ -192,7 +199,7 @@ ALTER SUBSCRIPTION name RENAME TO < - + ENABLE @@ -202,7 +209,7 @@ ALTER SUBSCRIPTION name RENAME TO < - + DISABLE @@ -212,27 +219,48 @@ ALTER SUBSCRIPTION name RENAME TO < - + SET ( subscription_parameter [= value] [, ... ] ) This clause alters parameters originally set by . See there for more information. The parameters that can be altered are - slot_name, - synchronous_commit, - binary, - streaming, - disable_on_error, - password_required, - run_as_owner, and - origin. + slot_name, + synchronous_commit, + binary, + streaming, + disable_on_error, + password_required, + run_as_owner, + origin, and + failover. Only a superuser can set password_required = false. + + + When altering the + slot_name, + the failover and two_phase property + values of the named slot may differ from the counterpart + failover + and two_phase + parameters specified in the subscription. When creating the slot, ensure + the slot properties failover and two_phase + match their counterpart parameters of the subscription. + Otherwise, the slot on the publisher may behave differently from what these + subscription options say: for example, the slot on the publisher could either be + synced to the standbys even when the subscription's + failover + option is disabled or could be disabled for sync + even when the subscription's + failover + option is enabled. + - + SKIP ( skip_option = value ) @@ -242,7 +270,7 @@ ALTER SUBSCRIPTION name RENAME TO < the logical replication worker skips all data modification changes within the transaction. This option has no effect on the transactions that are already prepared by enabling - two_phase + two_phase on the subscriber. After the logical replication worker successfully skips the transaction or finishes a transaction, the LSN (stored in @@ -272,7 +300,7 @@ ALTER SUBSCRIPTION name RENAME TO < - + new_owner @@ -281,7 +309,7 @@ ALTER SUBSCRIPTION name RENAME TO < - + new_name diff --git a/doc/src/sgml/ref/alter_system.sgml b/doc/src/sgml/ref/alter_system.sgml index 6f8bd39eaf8e3..1bde66d6ad2d3 100644 --- a/doc/src/sgml/ref/alter_system.sgml +++ b/doc/src/sgml/ref/alter_system.sgml @@ -21,7 +21,7 @@ PostgreSQL documentation -ALTER SYSTEM SET configuration_parameter { TO | = } { value | 'value' | DEFAULT } +ALTER SYSTEM SET configuration_parameter { TO | = } { value [, ...] | DEFAULT } ALTER SYSTEM RESET configuration_parameter ALTER SYSTEM RESET ALL @@ -83,9 +83,17 @@ ALTER SYSTEM RESET ALL New value of the parameter. Values can be specified as string constants, identifiers, numbers, or comma-separated lists of these, as appropriate for the particular parameter. + Values that are neither numbers nor valid identifiers must be quoted. DEFAULT can be written to specify removing the parameter and its value from postgresql.auto.conf. + + + For some list-accepting parameters, quoted values will produce + double-quoted output to preserve whitespace and commas; for others, + double-quotes must be used inside single-quoted strings to get + this effect. + @@ -96,6 +104,7 @@ ALTER SYSTEM RESET ALL This command can't be used to set , + , nor parameters that are not allowed in postgresql.conf (e.g., preset options). @@ -103,6 +112,13 @@ ALTER SYSTEM RESET ALL See for other ways to set the parameters. + + + ALTER SYSTEM can be disabled by setting + to off, but this + is not a security mechanism (as explained in detail in the documentation for + this parameter). + diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml index d4d93eeb7c6e5..c6ab432df1483 100644 --- a/doc/src/sgml/ref/alter_table.sgml +++ b/doc/src/sgml/ref/alter_table.sgml @@ -46,11 +46,12 @@ ALTER TABLE [ IF EXISTS ] name ALTER [ COLUMN ] column_name SET DEFAULT expression ALTER [ COLUMN ] column_name DROP DEFAULT ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL + ALTER [ COLUMN ] column_name SET EXPRESSION AS ( expression ) ALTER [ COLUMN ] column_name DROP EXPRESSION [ IF EXISTS ] ALTER [ COLUMN ] column_name ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] ALTER [ COLUMN ] column_name { SET GENERATED { ALWAYS | BY DEFAULT } | SET sequence_option | RESTART [ [ WITH ] restart ] } [...] ALTER [ COLUMN ] column_name DROP IDENTITY [ IF EXISTS ] - ALTER [ COLUMN ] column_name SET STATISTICS integer + ALTER [ COLUMN ] column_name SET STATISTICS { integer | DEFAULT } ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ] ) ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] ) ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } @@ -75,7 +76,7 @@ ALTER TABLE [ IF EXISTS ] name CLUSTER ON index_name SET WITHOUT CLUSTER SET WITHOUT OIDS - SET ACCESS METHOD new_access_method + SET ACCESS METHOD { new_access_method | DEFAULT } SET TABLESPACE new_tablespace SET { LOGGED | UNLOGGED } SET ( storage_parameter [= value] [, ... ] ) @@ -134,7 +135,7 @@ WITH ( MODULUS numeric_literal, REM exclude_element in an EXCLUDE constraint is: -{ column_name | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] +{ column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] referential_action in a FOREIGN KEY/REFERENCES constraint is: @@ -255,6 +256,17 @@ WITH ( MODULUS numeric_literal, REM + + SET EXPRESSION AS + + + This form replaces the expression of a generated column. Existing data + in the column is rewritten and all the future changes will apply the new + generation expression. + + + + DROP EXPRESSION [ IF EXISTS ] @@ -315,9 +327,11 @@ WITH ( MODULUS numeric_literal, REM This form sets the per-column statistics-gathering target for subsequent ANALYZE operations. - The target can be set in the range 0 to 10000; alternatively, set it - to -1 to revert to using the system default statistics - target (). + The target can be set in the range 0 to 10000. Set it + to DEFAULT to revert to using the system default + statistics target (). + (Setting to a value of -1 is an obsolete way spelling to get the same + outcome.) For more information on the use of statistics by the PostgreSQL query planner, refer to . @@ -524,8 +538,8 @@ WITH ( MODULUS numeric_literal, REM Adding a constraint using an existing index can be helpful in situations where a new constraint needs to be added without blocking table updates for a long time. To do that, create the index using - CREATE INDEX CONCURRENTLY, and then install it as an - official constraint using this syntax. See the example below. + CREATE UNIQUE INDEX CONCURRENTLY, and then convert it to a + constraint using this syntax. See the example below. @@ -717,8 +731,20 @@ WITH ( MODULUS numeric_literal, REM SET ACCESS METHOD - This form changes the access method of the table by rewriting it. See - for more information. + This form changes the access method of the table by rewriting it + using the indicated access method; specifying + DEFAULT selects the access method set as the + configuration + parameter. + See for more information. + + + When applied to a partitioned table, there is no data to rewrite, + but partitions created afterwards will default to the given access + method unless overridden by a USING clause. + Specifying DEFAULT removes a previous value, + causing future partitions to default to + default_table_access_method. @@ -984,20 +1010,18 @@ WITH ( MODULUS numeric_literal, REM A partition using FOR VALUES uses same syntax for partition_bound_spec as - CREATE TABLE. The partition bound specification + CREATE TABLE. + The partition bound specification must correspond to the partitioning strategy and partition key of the target table. The table to be attached must have all the same columns as the target table and no more; moreover, the column types must also match. Also, it must have all the NOT NULL and - CHECK constraints of the target table. Currently + CHECK constraints of the target table, not marked + NO INHERIT. Currently FOREIGN KEY constraints are not considered. UNIQUE and PRIMARY KEY constraints from the parent table will be created in the partition, if they don't already exist. - If any of the CHECK constraints of the table being - attached are marked NO INHERIT, the command will fail; - such constraints must be recreated without the - NO INHERIT clause. diff --git a/doc/src/sgml/ref/analyze.sgml b/doc/src/sgml/ref/analyze.sgml index 954491b5df0f4..2b94b378e9f31 100644 --- a/doc/src/sgml/ref/analyze.sgml +++ b/doc/src/sgml/ref/analyze.sgml @@ -22,13 +22,12 @@ PostgreSQL documentation ANALYZE [ ( option [, ...] ) ] [ table_and_columns [, ...] ] -ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ] where option can be one of: VERBOSE [ boolean ] SKIP_LOCKED [ boolean ] - BUFFER_USAGE_LIMIT [ size ] + BUFFER_USAGE_LIMIT size and table_and_columns is: @@ -56,13 +55,6 @@ ANALYZE [ VERBOSE ] [ table_and_columns - - - When the option list is surrounded by parentheses, the options can be - written in any order. The parenthesized syntax was added in - PostgreSQL 11; the unparenthesized syntax - is deprecated. - @@ -136,9 +128,9 @@ ANALYZE [ VERBOSE ] [ table_and_columns Specifies an amount of memory in kilobytes. Sizes may also be specified as a string containing the numerical size followed by any one of the - following memory units: kB (kilobytes), - MB (megabytes), GB (gigabytes), or - TB (terabytes). + following memory units: B (bytes), + kB (kilobytes), MB (megabytes), + GB (gigabytes), or TB (terabytes). @@ -211,10 +203,16 @@ ANALYZE [ VERBOSE ] [ table_and_columns + + While ANALYZE is running, the is temporarily changed to pg_catalog, + pg_temp. + + ANALYZE requires only a read lock on the target table, so it can run in - parallel with other activity on the table. + parallel with other non-DDL activity on the table. @@ -337,6 +335,14 @@ ANALYZE [ VERBOSE ] [ table_and_columns There is no ANALYZE statement in the SQL standard. + + + The following syntax was used before PostgreSQL + version 11 and is still supported: + +ANALYZE [ VERBOSE ] [ table_and_columns [, ...] ] + + diff --git a/doc/src/sgml/ref/cluster.sgml b/doc/src/sgml/ref/cluster.sgml index 06f3d269e67bc..c5760244e67e2 100644 --- a/doc/src/sgml/ref/cluster.sgml +++ b/doc/src/sgml/ref/cluster.sgml @@ -21,9 +21,7 @@ PostgreSQL documentation -CLUSTER [VERBOSE] table_name [ USING index_name ] -CLUSTER ( option [, ...] ) table_name [ USING index_name ] -CLUSTER [VERBOSE] +CLUSTER [ ( option [, ...] ) ] [ table_name [ USING index_name ] ] where option can be one of: @@ -159,6 +157,12 @@ CLUSTER [VERBOSE] information. + + While CLUSTER is running, the is temporarily changed to pg_catalog, + pg_temp. + + When an index scan is used, a temporary copy of the table is created that contains the table data in the index order. Temporary copies of each @@ -245,12 +249,19 @@ CLUSTER; - The syntax + The following syntax was used before PostgreSQL + 17 and is still supported: + +CLUSTER [ VERBOSE ] [ table_name [ USING index_name ] ] + + + + + The following syntax was used before PostgreSQL + 8.3 and is still supported: CLUSTER index_name ON table_name - is also supported for compatibility with pre-8.3 PostgreSQL - versions. diff --git a/doc/src/sgml/ref/clusterdb.sgml b/doc/src/sgml/ref/clusterdb.sgml index c838b22c44053..0d2051bf6f188 100644 --- a/doc/src/sgml/ref/clusterdb.sgml +++ b/doc/src/sgml/ref/clusterdb.sgml @@ -23,7 +23,7 @@ PostgreSQL documentation clusterdb connection-option - + option @@ -35,14 +35,13 @@ PostgreSQL documentation - dbname - - - - clusterdb - connection-option - - + + + dbname + + + + @@ -249,9 +248,8 @@ PostgreSQL documentation - Specifies the name of the database to connect to to discover which - databases should be clustered, - when / is used. + When the / is used, connect + to this database to gather the list of databases to cluster. If not specified, the postgres database will be used, or if that does not exist, template1 will be used. This can be a connection diff --git a/doc/src/sgml/ref/copy.sgml b/doc/src/sgml/ref/copy.sgml index 5e591ed2e630e..1518af8a0450c 100644 --- a/doc/src/sgml/ref/copy.sgml +++ b/doc/src/sgml/ref/copy.sgml @@ -36,14 +36,16 @@ COPY { table_name [ ( boolean ] DELIMITER 'delimiter_character' NULL 'null_string' + DEFAULT 'default_string' HEADER [ boolean | MATCH ] QUOTE 'quote_character' ESCAPE 'escape_character' FORCE_QUOTE { ( column_name [, ...] ) | * } - FORCE_NOT_NULL ( column_name [, ...] ) - FORCE_NULL ( column_name [, ...] ) + FORCE_NOT_NULL { ( column_name [, ...] ) | * } + FORCE_NULL { ( column_name [, ...] ) | * } + ON_ERROR error_action ENCODING 'encoding_name' - DEFAULT 'default_string' + LOG_VERBOSITY verbosity @@ -89,6 +91,13 @@ COPY { table_name [ ( pg_stat_progress_copy view. See for details. + + + By default, COPY will fail if it encounters an error + during processing. For use cases where a best-effort attempt at loading + the entire file is desired, the ON_ERROR clause can + be used to specify some other behavior. + @@ -122,15 +131,18 @@ COPY { table_name [ ( SELECT, VALUES, INSERT, - UPDATE, or - DELETE command whose results are to be - copied. Note that parentheses are required around the query. + UPDATE, + DELETE, or + MERGE command + whose results are to be copied. Note that parentheses are required + around the query. - For INSERT, UPDATE and - DELETE queries a RETURNING clause must be provided, - and the target relation must not have a conditional rule, nor - an ALSO rule, nor an INSTEAD rule + For INSERT, UPDATE, + DELETE, and MERGE queries a + RETURNING clause must be provided, and the target + relation must not have a conditional rule, nor an + ALSO rule, nor an INSTEAD rule that expands to multiple statements. @@ -224,6 +236,7 @@ COPY { table_name [ ( COPY FREEZE on a partitioned table. + This option is only allowed in COPY FROM. Note that all other sessions will immediately be able to see the data @@ -271,6 +284,19 @@ COPY { table_name [ ( + + DEFAULT + + + Specifies the string that represents a default value. Each time the string + is found in the input file, the default value of the corresponding column + will be used. + This option is allowed only in COPY FROM, and only when + not using binary format. + + + + HEADER @@ -337,6 +363,7 @@ COPY { table_name [ ( * is specified, the option will be applied to all columns. This option is allowed only in COPY FROM, and only when using CSV format. @@ -351,12 +378,39 @@ COPY { table_name [ ( NULL. In the default case where the null string is empty, this converts a quoted empty string into NULL. + If * is specified, the option will be applied to all columns. This option is allowed only in COPY FROM, and only when using CSV format. + + ON_ERROR + + + Specifies how to behave when encountering an error converting a column's + input value into its data type. + An error_action value of + stop means fail the command, while + ignore means discard the input row and continue with the next one. + The default is stop. + + + The ignore option is applicable only for COPY FROM + when the FORMAT is text or csv. + + + A NOTICE message containing the ignored row count is + emitted at the end of the COPY FROM if at least one + row was discarded. When LOG_VERBOSITY option is set to + verbose, a NOTICE message + containing the line of the input file and the column name whose input + conversion has failed is emitted for each discarded row. + + + + ENCODING @@ -370,15 +424,18 @@ COPY { table_name [ ( - DEFAULT + LOG_VERBOSITY - Specifies the string that represents a default value. Each time the string - is found in the input file, the default value of the corresponding column - will be used. - This option is allowed only in COPY FROM, and only when - not using binary format. + Specify the amount of messages emitted by a COPY + command: default or verbose. If + verbose is specified, additional messages are emitted + during processing. + + This is currently used in COPY FROM command when + ON_ERROR option is set to ignore. + @@ -553,14 +610,13 @@ COPY count - COPY stops operation at the first error. This - should not lead to problems in the event of a COPY - TO, but the target table will already have received - earlier rows in a COPY FROM. These rows will not - be visible or accessible, but they still occupy disk space. This might - amount to a considerable amount of wasted disk space if the failure - happened well into a large copy operation. You might wish to invoke - VACUUM to recover the wasted space. + The COPY FROM command physically inserts input rows + into the table as it progresses. If the command fails, these rows are + left in a deleted state; these rows will not be visible, but still + occupy disk space. This might amount to considerable + wasted disk space if the failure happened well into a large copy + operation. VACUUM should be used to recover the + wasted space. diff --git a/doc/src/sgml/ref/create_collation.sgml b/doc/src/sgml/ref/create_collation.sgml index b86a9bbb9ceba..e34bfc97c3da2 100644 --- a/doc/src/sgml/ref/create_collation.sgml +++ b/doc/src/sgml/ref/create_collation.sgml @@ -96,6 +96,11 @@ CREATE COLLATION [ IF NOT EXISTS ] name FROM locale, you cannot specify either of those parameters. + + If provider is builtin, + then locale must be specified and set to + either C or C.UTF-8. + @@ -129,9 +134,9 @@ CREATE COLLATION [ IF NOT EXISTS ] name FROM Specifies the provider to use for locale services associated with this - collation. Possible values are - icuICU - (if the server was built with ICU support) or libc. + collation. Possible values are builtin, + icuICU (if + the server was built with ICU support) or libc. libc is the default. See for details. @@ -149,7 +154,7 @@ CREATE COLLATION [ IF NOT EXISTS ] name FROM LC_COLLATE setting + choose an appropriate LOCALE setting and set the collation to not deterministic here. @@ -165,9 +170,8 @@ CREATE COLLATION [ IF NOT EXISTS ] name FROM Specifies additional collation rules to customize the behavior of the - collation. This is supported for ICU only. See - for details on the syntax. + collation. This is supported for ICU only. See for details. @@ -257,12 +261,8 @@ CREATE COLLATION german_phonebook (provider = icu, locale = 'de-u-co-phonebk'); - With this rule, the letter W is sorted after - V, but is treated as a secondary difference similar to an - accent. Rules like this are contained in the locale definitions of some - languages. (Of course, if a locale definition already contains the desired - rules, then they don't need to be specified again explicitly.) See the ICU - documentation for further details and examples on the rules syntax. + See for further details and examples + on the rules syntax. diff --git a/doc/src/sgml/ref/create_database.sgml b/doc/src/sgml/ref/create_database.sgml index b2c8aef1ad220..7653cb902eebe 100644 --- a/doc/src/sgml/ref/create_database.sgml +++ b/doc/src/sgml/ref/create_database.sgml @@ -25,10 +25,11 @@ CREATE DATABASE name [ WITH ] [ OWNER [=] user_name ] [ TEMPLATE [=] template ] [ ENCODING [=] encoding ] - [ STRATEGY [=] strategy ] ] + [ STRATEGY [=] strategy ] [ LOCALE [=] locale ] [ LC_COLLATE [=] lc_collate ] [ LC_CTYPE [=] lc_ctype ] + [ BUILTIN_LOCALE [=] builtin_locale ] [ ICU_LOCALE [=] icu_locale ] [ ICU_RULES [=] icu_rules ] [ LOCALE_PROVIDER [=] locale_provider ] @@ -159,9 +160,16 @@ CREATE DATABASE name Can be overridden by setting , , or , , or individually. + + If is + builtin, then locale or + builtin_locale must be specified and set to + either C or C.UTF-8. + The other locale settings , name + + builtin_locale + + + Specifies the builtin provider locale for the database default + collation order and character classification, overriding the setting + . The locale provider must + be builtin. The default is the setting of if specified; otherwise the same + setting as the template database. + + + The locales available for the builtin provider are + C and C.UTF-8. + + + + icu_locale @@ -232,9 +259,7 @@ CREATE DATABASE name Specifies additional collation rules to customize the behavior of the default collation of this database. This is supported for ICU only. - See - for details on the syntax. + See for details. @@ -245,7 +270,7 @@ CREATE DATABASE name Specifies the provider to use for the default collation in this - database. Possible values are + database. Possible values are builtin, icuICU (if the server was built with ICU support) or libc. By default, the provider is the same as that of the name [ AS ] data_type [ COLLATE collation ] [ DEFAULT expression ] - [ constraint [ ... ] ] + [ domain_constraint [ ... ] ] -where constraint is: +where domain_constraint is: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK (expression) } @@ -190,7 +190,7 @@ CREATE DOMAIN name [ AS ] - + Notes @@ -279,6 +279,18 @@ CREATE TABLE us_snail_addy ( The command CREATE DOMAIN conforms to the SQL standard. + + + The syntax NOT NULL in this command is a + PostgreSQL extension. (A standard-conforming + way to write the same for non-composite data types would be + CHECK (VALUE IS NOT + NULL). However, per , + such constraints are best avoided in practice anyway.) The + NULL constraint is a + PostgreSQL extension (see also ). + diff --git a/doc/src/sgml/ref/create_event_trigger.sgml b/doc/src/sgml/ref/create_event_trigger.sgml index 22c8119198279..ef12cfa20d411 100644 --- a/doc/src/sgml/ref/create_event_trigger.sgml +++ b/doc/src/sgml/ref/create_event_trigger.sgml @@ -121,9 +121,12 @@ CREATE EVENT TRIGGER name Event triggers are disabled in single-user mode (see ). If an erroneous event trigger disables the - database so much that you can't even drop the trigger, restart in - single-user mode and you'll be able to do that. + linkend="app-postgres"/>) as well as when + is set to false. + If an erroneous event trigger disables the database so much that you can't + even drop the trigger, restart with + set to false to temporarily disable event triggers, or + in single-user mode, and you'll be able to do that. diff --git a/doc/src/sgml/ref/create_foreign_table.sgml b/doc/src/sgml/ref/create_foreign_table.sgml index ae1f94b9de732..dc4b90759901b 100644 --- a/doc/src/sgml/ref/create_foreign_table.sgml +++ b/doc/src/sgml/ref/create_foreign_table.sgml @@ -376,7 +376,7 @@ WITH ( MODULUS numeric_literal, REM an UPDATE that changes the partition key value can cause a row to be moved from a local partition to a foreign-table partition, provided the foreign data wrapper supports tuple routing. - However it is not currently possible to move a row from a + However, it is not currently possible to move a row from a foreign-table partition to another partition. An UPDATE that would require doing that will fail due to the partitioning constraint, assuming that that is properly diff --git a/doc/src/sgml/ref/create_function.sgml b/doc/src/sgml/ref/create_function.sgml index 863d99d1fc056..0d240484cd3f0 100644 --- a/doc/src/sgml/ref/create_function.sgml +++ b/doc/src/sgml/ref/create_function.sgml @@ -428,22 +428,24 @@ CREATE [ OR REPLACE ] FUNCTION PARALLEL - PARALLEL UNSAFE indicates that the function - can't be executed in parallel mode and the presence of such a + + PARALLEL UNSAFE indicates that the function + can't be executed in parallel mode; the presence of such a function in an SQL statement forces a serial execution plan. This is the default. PARALLEL RESTRICTED indicates that - the function can be executed in parallel mode, but the execution is - restricted to parallel group leader. PARALLEL SAFE + the function can be executed in parallel mode, but only in the parallel + group leader process. PARALLEL SAFE indicates that the function is safe to run in parallel mode without - restriction. + restriction, including in parallel worker processes. Functions should be labeled parallel unsafe if they modify any database - state, or if they make changes to the transaction such as using - sub-transactions, or if they access sequences or attempt to make - persistent changes to settings (e.g., setval). They should - be labeled as parallel restricted if they access temporary tables, + state, change the transaction state (other than by using a + subtransaction for error recovery), access sequences (e.g., by + calling currval) or make persistent changes to + settings. They should + be labeled parallel restricted if they access temporary tables, client connection state, cursors, prepared statements, or miscellaneous backend-local state which the system cannot synchronize in parallel mode (e.g., setseed cannot be executed other than by the group diff --git a/doc/src/sgml/ref/create_index.sgml b/doc/src/sgml/ref/create_index.sgml index 40986aa502ffd..208389e80060b 100644 --- a/doc/src/sgml/ref/create_index.sgml +++ b/doc/src/sgml/ref/create_index.sgml @@ -789,6 +789,12 @@ Indexes: the table to generate statistics for these indexes. + + While CREATE INDEX is running, the is temporarily changed to pg_catalog, + pg_temp. + + For most index methods, the speed of creating an index is dependent on the setting of . @@ -802,7 +808,7 @@ Indexes: leveraging multiple CPUs in order to process the table rows faster. This feature is known as parallel index build. For index methods that support building indexes - in parallel (currently, only B-tree), + in parallel (currently, B-tree and BRIN), maintenance_work_mem specifies the maximum amount of memory that can be used by each index build operation as a whole, regardless of how many worker processes were started. diff --git a/doc/src/sgml/ref/create_materialized_view.sgml b/doc/src/sgml/ref/create_materialized_view.sgml index 0d2fea2b97f0d..62d897931c314 100644 --- a/doc/src/sgml/ref/create_materialized_view.sgml +++ b/doc/src/sgml/ref/create_materialized_view.sgml @@ -143,7 +143,9 @@ CREATE MATERIALIZED VIEW [ IF NOT EXISTS ] table_name A SELECT, TABLE, or VALUES command. This query will run within a security-restricted operation; in particular, calls to functions that - themselves create temporary tables will fail. + themselves create temporary tables will fail. Also, while the query is + running, the is temporarily changed to + pg_catalog, pg_temp. diff --git a/doc/src/sgml/ref/create_operator.sgml b/doc/src/sgml/ref/create_operator.sgml index e27512ff39193..3553d36454185 100644 --- a/doc/src/sgml/ref/create_operator.sgml +++ b/doc/src/sgml/ref/create_operator.sgml @@ -52,7 +52,8 @@ CREATE OPERATOR name ( There are a few restrictions on your choice of name: - -- and /* cannot appear anywhere in an operator name, + + -- and /* cannot appear anywhere in an operator name, since they will be taken as the start of a comment. @@ -72,8 +73,8 @@ CREATE OPERATOR name ( - The use of => as an operator name is deprecated. It may - be disallowed altogether in a future release. + The symbol => is reserved by the SQL grammar, + so it cannot be used as an operator name. @@ -104,7 +105,7 @@ CREATE OPERATOR name ( - The other clauses specify optional operator optimization clauses. + The other clauses specify optional operator optimization attributes. Their meaning is detailed in . @@ -112,7 +113,7 @@ CREATE OPERATOR name ( To be able to create an operator, you must have USAGE privilege on the argument types and the return type, as well as EXECUTE privilege on the underlying function. If a - commutator or negator operator is specified, you must own these operators. + commutator or negator operator is specified, you must own those operators. @@ -231,7 +232,67 @@ COMMUTATOR = OPERATOR(myschema.===) , Notes - Refer to for further information. + Refer to and + for further information. + + + + When you are defining a self-commutative operator, you just do it. + When you are defining a pair of commutative operators, things are + a little trickier: how can the first one to be defined refer to the + other one, which you haven't defined yet? There are three solutions + to this problem: + + + + + One way is to omit the COMMUTATOR clause in the + first operator that you define, and then provide one in the second + operator's definition. Since PostgreSQL + knows that commutative operators come in pairs, when it sees the + second definition it will automatically go back and fill in the + missing COMMUTATOR clause in the first + definition. + + + + + + Another, more straightforward way is just to + include COMMUTATOR clauses in both definitions. + When PostgreSQL processes the first + definition and realizes that COMMUTATOR refers to + a nonexistent operator, the system will make a dummy entry for that + operator in the system catalog. This dummy entry will have valid + data only for the operator name, left and right operand types, and + owner, since that's all that PostgreSQL + can deduce at this point. The first operator's catalog entry will + link to this dummy entry. Later, when you define the second + operator, the system updates the dummy entry with the additional + information from the second definition. If you try to use the dummy + operator before it's been filled in, you'll just get an error + message. + + + + + + Alternatively, both operators can be defined + without COMMUTATOR clauses + and then ALTER OPERATOR can be used to set their + commutator links. It's sufficient to ALTER + either one of the pair. + + + + + In all three cases, you must own both operators in order to mark + them as commutators. + + + + Pairs of negator operators can be defined using the same methods + as for commutator pairs. diff --git a/doc/src/sgml/ref/create_publication.sgml b/doc/src/sgml/ref/create_publication.sgml index 606aa64ecfa3e..fd9c5deac95dc 100644 --- a/doc/src/sgml/ref/create_publication.sgml +++ b/doc/src/sgml/ref/create_publication.sgml @@ -54,7 +54,7 @@ CREATE PUBLICATION name Parameters - + name @@ -63,7 +63,7 @@ CREATE PUBLICATION name - + FOR TABLE @@ -117,7 +117,7 @@ CREATE PUBLICATION name - + FOR ALL TABLES @@ -127,7 +127,7 @@ CREATE PUBLICATION name - + FOR TABLES IN SCHEMA @@ -158,7 +158,7 @@ CREATE PUBLICATION name - + WITH ( publication_parameter [= value] [, ... ] ) @@ -166,7 +166,7 @@ CREATE PUBLICATION name following parameters are supported: - + publish (string) @@ -188,7 +188,7 @@ CREATE PUBLICATION name - + publish_via_partition_root (boolean) diff --git a/doc/src/sgml/ref/create_role.sgml b/doc/src/sgml/ref/create_role.sgml index 7249fc74324d6..f72ba9affc2d1 100644 --- a/doc/src/sgml/ref/create_role.sgml +++ b/doc/src/sgml/ref/create_role.sgml @@ -36,10 +36,8 @@ CREATE ROLE name [ [ WITH ] password' | PASSWORD NULL | VALID UNTIL 'timestamp' | IN ROLE role_name [, ...] - | IN GROUP role_name [, ...] | ROLE role_name [, ...] | ADMIN role_name [, ...] - | USER role_name [, ...] | SYSID uid @@ -68,6 +66,17 @@ in sync when changing the above synopsis! Note that roles are defined at the database cluster level, and so are valid in all databases in the cluster. + + + During role creation it is possible to immediately assign the newly created + role to be a member of an existing role, and also assign existing roles + to be members of the newly created role. The rules for which initial + role membership options are enabled are described below in the + IN ROLE, ROLE, and + ADMIN clauses. The + command has fine-grained option control during membership creation, + and the ability to modify these options after the new role is created. + @@ -135,24 +144,21 @@ in sync when changing the above synopsis! NOINHERIT - When the GRANT statement is used to confer - membership in one role to another role, the GRANT - may use the WITH INHERIT clause to specify whether - the privileges of the granted role should be inherited - by the new member. If the GRANT statement does not - specify either inheritance behavior, the new GRANT - will be created WITH INHERIT TRUE if the member - role is set to INHERIT and to - WITH INHERIT FALSE if it is set to - NOINHERIT. + This affects the membership inheritance status when this + role is added as a member of another role, both in this and + future commands. Specifically, it controls the inheritance + status of memberships added with this command using the + IN ROLE clause, and in later commands using + the ROLE clause. It is also used as the + default inheritance status when adding this role as a member + using the GRANT command. If not specified, + INHERIT is the default. In PostgreSQL versions before 16, - the GRANT statement did not support - WITH INHERIT. Therefore, changing this role-level - property would also change the behavior of already-existing grants. - This is no longer the case. + inheritance was a role-level attribute that controlled all runtime + membership checks for that role. @@ -287,18 +293,10 @@ in sync when changing the above synopsis! The IN ROLE clause causes the new role to be automatically added as a member of the specified existing - roles. (Note that there is no option to add the new role as an - administrator; use a separate GRANT command - to do that.) - - - - - - IN GROUP role_name - - IN GROUP is an obsolete spelling of - IN ROLE. + roles. The new membership will have the SET + option enabled and the ADMIN option disabled. + The INHERIT option will be enabled unless the + NOINHERIT option is specified. @@ -308,8 +306,12 @@ in sync when changing the above synopsis! The ROLE clause causes one or more specified - existing roles to be automatically added as members of the new - role. This in effect makes the new role a group. + existing roles to be automatically added as members, with the + SET option enabled. This in effect makes the + new role a group. Roles named in this clause + with the role-level INHERIT attribute will have + the INHERIT option enabled in the new membership. + New memberships will have the ADMIN option disabled. @@ -318,20 +320,10 @@ in sync when changing the above synopsis! ADMIN role_name - The ADMIN clause is like ROLE, - but the named roles are added to the new role WITH ADMIN - OPTION, giving them the right to grant membership in this role - to others. - - - - - - USER role_name - - - The USER clause is an obsolete spelling of - the ROLE clause. + The ADMIN clause has the same effect as + ROLE, but the named roles are added as members + of the new role with ADMIN enabled, giving + them the right to grant membership in the new role to others. @@ -374,15 +366,19 @@ in sync when changing the above synopsis! - The INHERIT attribute governs inheritance of grantable - privileges (that is, access privileges for database objects and role - memberships). It does not apply to the special role attributes set by - CREATE ROLE and ALTER ROLE. For example, being - a member of a role with CREATEDB privilege does not immediately - grant the ability to create databases, even if INHERIT is set; - it would be necessary to become that role via - SET ROLE before - creating a database. + The role attributes defined here are non-inheritable, i.e., being a + member of a role with, e.g., CREATEDB will not + allow the member to create new databases even if the membership grant + has the INHERIT option. Of course, if the membership + grant has the SET option the member role would be able to + SET ROLE to the + createdb role and then create a new database. + + + + The membership grants created by the + IN ROLE, ROLE, and ADMIN + clauses have the role executing this command as the grantor. @@ -481,8 +477,26 @@ CREATE ROLE name [ WITH ADMIN The behavior specified by the SQL standard is most closely approximated - by giving users the NOINHERIT attribute, while roles are - given the INHERIT attribute. + creating SQL-standard users as PostgreSQL + roles with the NOINHERIT option, and SQL-standard + roles as PostgreSQL roles with the + INHERIT option. + + + + The USER clause has the same behavior as + ROLE but has been deprecated: + +USER role_name [, ...] + + + + + The IN GROUP clause has the same behavior as IN + ROLE but has been deprecated: + +IN GROUP role_name [, ...] + diff --git a/doc/src/sgml/ref/create_rule.sgml b/doc/src/sgml/ref/create_rule.sgml index dbf4c937841d5..4871a896dc3dd 100644 --- a/doc/src/sgml/ref/create_rule.sgml +++ b/doc/src/sgml/ref/create_rule.sgml @@ -59,15 +59,16 @@ CREATE [ OR REPLACE ] RULE name AS - Presently, ON SELECT rules must be unconditional - INSTEAD rules and must have actions that consist - of a single SELECT command. Thus, an - ON SELECT rule effectively turns the table into - a view, whose visible contents are the rows returned by the rule's - SELECT command rather than whatever had been - stored in the table (if anything). It is considered better style - to write a CREATE VIEW command than to create a - real table and define an ON SELECT rule for it. + Presently, ON SELECT rules can only be attached + to views. Such a rule must be named "_RETURN", + must be an unconditional INSTEAD rule, and must have + an action that consists of a single SELECT command. + This command defines the visible contents of the view. (The view + itself is basically a dummy table with no storage.) It's best to + regard such a rule as an implementation detail. While a view can be + redefined via CREATE OR REPLACE RULE "_RETURN" AS + ..., it's better style to use CREATE OR REPLACE + VIEW. diff --git a/doc/src/sgml/ref/create_server.sgml b/doc/src/sgml/ref/create_server.sgml index af0a7a06fdcdf..05f4019453ba2 100644 --- a/doc/src/sgml/ref/create_server.sgml +++ b/doc/src/sgml/ref/create_server.sgml @@ -129,6 +129,11 @@ CREATE SERVER [ IF NOT EXISTS ] server_nameUSAGE privilege on the foreign server to be able to use it in this way. + + + If the foreign server supports sort pushdown, it is necessary for it + to have the same sort ordering as the local server. + diff --git a/doc/src/sgml/ref/create_subscription.sgml b/doc/src/sgml/ref/create_subscription.sgml index 71652fd9188cd..c9c8dd440dc7e 100644 --- a/doc/src/sgml/ref/create_subscription.sgml +++ b/doc/src/sgml/ref/create_subscription.sgml @@ -51,7 +51,7 @@ CREATE SUBSCRIPTION subscription_name - To be able to create a subscription, you must have the privileges of the + To be able to create a subscription, you must have the privileges of the pg_create_subscription role, as well as CREATE privileges on the current database. @@ -68,7 +68,7 @@ CREATE SUBSCRIPTION subscription_nameParameters - + subscription_name @@ -77,7 +77,7 @@ CREATE SUBSCRIPTION subscription_name - + CONNECTION 'conninfo' @@ -88,7 +88,7 @@ CREATE SUBSCRIPTION subscription_name - + PUBLICATION publication_name [, ...] @@ -97,7 +97,7 @@ CREATE SUBSCRIPTION subscription_name - + WITH ( subscription_parameter [= value] [, ... ] ) @@ -109,7 +109,7 @@ CREATE SUBSCRIPTION subscription_name - + connect (boolean) @@ -129,14 +129,15 @@ CREATE SUBSCRIPTION subscription_namefalse, no tables are subscribed. To initiate replication, you must manually create the replication slot, enable - the subscription, and refresh the subscription. See + the failover if required, enable the subscription, and refresh the + subscription. See for examples. - + create_slot (boolean) @@ -152,7 +153,7 @@ CREATE SUBSCRIPTION subscription_name - + enabled (boolean) @@ -163,7 +164,7 @@ CREATE SUBSCRIPTION subscription_name - + slot_name (string) @@ -181,6 +182,21 @@ CREATE SUBSCRIPTION subscription_name for examples. + + + When setting slot_name to a valid name and + create_slot to false, the + failover property value of the named slot may + differ from the counterpart failover parameter + specified in the subscription. Always ensure the slot property + failover matches the counterpart parameter of the + subscription and vice versa. Otherwise, the slot on the publisher may + behave differently from what these subscription options say: for + example, the slot on the publisher could either be synced to the + standbys even when the subscription's failover + option is disabled or could be disabled for sync even when the + subscription's failover option is enabled. + @@ -192,7 +208,7 @@ CREATE SUBSCRIPTION subscription_name - + binary (boolean) @@ -229,7 +245,7 @@ CREATE SUBSCRIPTION subscription_name - + copy_data (boolean) @@ -250,7 +266,7 @@ CREATE SUBSCRIPTION subscription_name - + streaming (enum) @@ -278,7 +294,7 @@ CREATE SUBSCRIPTION subscription_name - + synchronous_commit (enum) @@ -310,7 +326,7 @@ CREATE SUBSCRIPTION subscription_name - + two_phase (boolean) @@ -341,7 +357,7 @@ CREATE SUBSCRIPTION subscription_name - + disable_on_error (boolean) @@ -353,20 +369,21 @@ CREATE SUBSCRIPTION subscription_name - + password_required (boolean) - Specifies whether connections to the publisher made as a result - of this subscription must use password authentication. This setting - is ignored when the subscription is owned by a superuser. - The default is true. Only superusers can set - this value to false. + If set to true, connections to the publisher made + as a result of this subscription must use password authentication + and the password must be specified as a part of the connection + string. This setting is ignored when the subscription is owned by a + superuser. The default is true. Only superusers + can set this value to false. - + run_as_owner (boolean) @@ -380,7 +397,7 @@ CREATE SUBSCRIPTION subscription_name - + origin (string) @@ -399,6 +416,18 @@ CREATE SUBSCRIPTION subscription_name + + + failover (boolean) + + + Specifies whether the replication slots associated with the subscription + are enabled to be synced to the standbys so that logical + replication can be resumed from the new primary after failover. + The default is false. + + + @@ -452,8 +481,8 @@ CREATE SUBSCRIPTION subscription_nameWHERE clauses, if one of the publications has no WHERE clause (referring to that publish operation) or the publication is declared as - FOR ALL TABLES - or FOR TABLES IN SCHEMA, + FOR ALL TABLES + or FOR TABLES IN SCHEMA, rows are always published regardless of the definition of the other expressions. If the subscriber is a PostgreSQL version before 15, then any row filtering is ignored during the initial data @@ -461,7 +490,7 @@ CREATE SUBSCRIPTION subscription_namepublish + publish parameter when copying existing table data, some rows may be copied that would not be replicated using DML. See for examples. @@ -497,12 +526,14 @@ CREATE SUBSCRIPTION subscription_name # substitute <pub-names> below with your publication name(s) to be queried SELECT DISTINCT PT.schemaname, PT.tablename -FROM pg_publication_tables PT, +FROM pg_publication_tables PT + JOIN pg_class C ON (C.relname = PT.tablename) + JOIN pg_namespace N ON (N.nspname = PT.schemaname), pg_subscription_rel PS - JOIN pg_class C ON (C.oid = PS.srrelid) - JOIN pg_namespace N ON (N.oid = C.relnamespace) -WHERE N.nspname = PT.schemaname AND - C.relname = PT.tablename AND +WHERE C.relnamespace = N.oid AND + (PS.srrelid = C.oid OR + C.oid IN (SELECT relid FROM pg_partition_ancestors(PS.srrelid) UNION + SELECT relid FROM pg_partition_tree(PS.srrelid))) AND PT.pubname IN (<pub-names>); diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml index 10ef699fab920..38be1a5a710e1 100644 --- a/doc/src/sgml/ref/create_table.sgml +++ b/doc/src/sgml/ref/create_table.sgml @@ -104,7 +104,7 @@ WITH ( MODULUS numeric_literal, REM exclude_element in an EXCLUDE constraint is: -{ column_name | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] +{ column_name | ( expression ) } [ COLLATE collation ] [ opclass [ ( opclass_parameter = value [, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] referential_action in a FOREIGN KEY/REFERENCES constraint is: @@ -924,8 +924,8 @@ WITH ( MODULUS numeric_literal, REM This clause creates the column as an identity column. It will have an implicit sequence attached to it - and the column in new rows will automatically have values from the - sequence assigned to it. + and in newly-inserted rows the column will automatically have values + from the sequence assigned to it. Such a column is implicitly NOT NULL. @@ -955,9 +955,16 @@ WITH ( MODULUS numeric_literal, REM - The optional sequence_options clause can be - used to override the options of the sequence. - See for details. + The optional sequence_options clause can + be used to override the parameters of the sequence. The available + options include those shown for , + plus SEQUENCE NAME name, + LOGGED, and UNLOGGED, which + allow selection of the name and persistence level of the + sequence. Without SEQUENCE NAME, the system + chooses an unused name for the sequence. + Without LOGGED or UNLOGGED, + the sequence will have the same persistence level as the table. @@ -1000,7 +1007,8 @@ WITH ( MODULUS numeric_literal, REM Adding a unique constraint will automatically create a unique btree - index on the column or group of columns used in the constraint. + index on the column or group of columns used in the constraint. The + created index has the same name as the unique constraint. @@ -1052,7 +1060,8 @@ WITH ( MODULUS numeric_literal, REM Adding a PRIMARY KEY constraint will automatically - create a unique btree index on the column or group of columns used in the + create a unique btree index on the column or group of columns used in + the constraint. That index has the same name as the primary key constraint. @@ -1086,19 +1095,19 @@ WITH ( MODULUS numeric_literal, REM no two rows in the table contain overlapping circles (see ) by using the && operator. + The operator(s) are required to be commutative. Exclusion constraints are implemented using - an index, so each specified operator must be associated with an - appropriate operator class + an index that has the same name as the constraint, so each specified + operator must be associated with an appropriate operator class (see ) for the index access method index_method. - The operators are required to be commutative. Each exclude_element - can optionally specify an operator class and/or ordering options; - these are described fully under - . + defines a column of the index, so it can optionally specify a collation, + an operator class, operator class parameters, and/or ordering options; + these are described fully under . @@ -1137,10 +1146,11 @@ WITH ( MODULUS numeric_literal, REM column(s) of some row of the referenced table. If the refcolumn list is omitted, the primary key of the reftable - is used. The referenced columns must be the columns of a non-deferrable - unique or primary key constraint in the referenced table. The user - must have REFERENCES permission on the referenced table - (either the whole table, or the specific referenced columns). The + is used. Otherwise, the refcolumn + list must refer to the columns of a non-deferrable unique or primary key + constraint or be the columns of a non-partial unique index. The user + must have REFERENCES permission on the referenced + table (either the whole table, or the specific referenced columns). The addition of a foreign key constraint requires a SHARE ROW EXCLUSIVE lock on the referenced table. Note that foreign key constraints cannot be defined between temporary @@ -1299,6 +1309,10 @@ WITH ( MODULUS numeric_literal, REM method is chosen for the new table. See for more information. + + When creating a partition, the table access method is the access method + of its partitioned table, if set. + @@ -2277,13 +2291,19 @@ CREATE TABLE cities_partdef - Foreign-Key Constraint Actions + Foreign Key Constraints - The ability to specify column lists in the foreign-key actions + The ability to specify column lists in the foreign key actions SET DEFAULT and SET NULL is a PostgreSQL extension. + + + It is a PostgreSQL extension that a + foreign key constraint may reference columns of a unique index instead of + columns of a primary key or unique constraint. + @@ -2317,7 +2337,7 @@ CREATE TABLE cities_partdef Currently, PostgreSQL does not record names - for NOT NULL constraints at all, so they are not + for not-null constraints at all, so they are not subject to the uniqueness restriction. This might change in a future release. diff --git a/doc/src/sgml/ref/create_view.sgml b/doc/src/sgml/ref/create_view.sgml index 3b26205f7883c..e8d9d3c8d0f64 100644 --- a/doc/src/sgml/ref/create_view.sgml +++ b/doc/src/sgml/ref/create_view.sgml @@ -192,12 +192,14 @@ CREATE VIEW [ schema . ] view_name This option controls the behavior of automatically updatable views. When - this option is specified, INSERT and UPDATE + this option is specified, INSERT, + UPDATE, and MERGE commands on the view will be checked to ensure that new rows satisfy the view-defining condition (that is, the new rows are checked to ensure that they are visible through the view). If they are not, the update will be rejected. If the CHECK OPTION is not specified, - INSERT and UPDATE commands on the view are + INSERT, UPDATE, and + MERGE commands on the view are allowed to create rows that are not visible through the view. The following check options are supported: @@ -247,7 +249,8 @@ CREATE VIEW [ schema . ] view_nameINSERT or UPDATE command to be rewritten, then all check options will be ignored in the rewritten query, including any checks from automatically updatable views defined on top of the relation - with the INSTEAD rule. + with the INSTEAD rule. MERGE is not + supported if the view or any of its base relations have rules. @@ -360,7 +363,8 @@ CREATE VIEW vista AS SELECT text 'Hello World' AS hello; Simple views are automatically updatable: the system will allow - INSERT, UPDATE and DELETE statements + INSERT, UPDATE, + DELETE, and MERGE statements to be used on the view in the same way as on a regular table. A view is automatically updatable if it satisfies all of the following conditions: @@ -400,13 +404,15 @@ CREATE VIEW vista AS SELECT text 'Hello World' AS hello; An automatically updatable view may contain a mix of updatable and non-updatable columns. A column is updatable if it is a simple reference to an updatable column of the underlying base relation; otherwise the - column is read-only, and an error will be raised if an INSERT - or UPDATE statement attempts to assign a value to it. + column is read-only, and an error will be raised if an + INSERT, UPDATE, or + MERGE statement attempts to assign a value to it. If the view is automatically updatable the system will convert any - INSERT, UPDATE or DELETE statement + INSERT, UPDATE, + DELETE, or MERGE statement on the view into the corresponding statement on the underlying base relation. INSERT statements that have an ON CONFLICT UPDATE clause are fully supported. @@ -415,17 +421,21 @@ CREATE VIEW vista AS SELECT text 'Hello World' AS hello; If an automatically updatable view contains a WHERE condition, the condition restricts which rows of the base relation are - available to be modified by UPDATE and DELETE - statements on the view. However, an UPDATE is allowed to + available to be modified by UPDATE, + DELETE, and MERGE + statements on the view. However, an UPDATE or + MERGE is allowed to change a row so that it no longer satisfies the WHERE condition, and thus is no longer visible through the view. Similarly, - an INSERT command can potentially insert base-relation rows + an INSERT or MERGE command can + potentially insert base-relation rows that do not satisfy the WHERE condition and thus are not visible through the view (ON CONFLICT UPDATE may similarly affect an existing row not visible through the view). The CHECK OPTION may be used to prevent - INSERT and UPDATE commands from creating - such rows that are not visible through the view. + INSERT, UPDATE, and + MERGE commands from creating such rows that are not + visible through the view. @@ -443,14 +453,16 @@ CREATE VIEW vista AS SELECT text 'Hello World' AS hello; A more complex view that does not satisfy all these conditions is - read-only by default: the system will not allow an insert, update, or - delete on the view. You can get the effect of an updatable view by + read-only by default: the system will not allow an INSERT, + UPDATE, DELETE, or MERGE + on the view. You can get the effect of an updatable view by creating INSTEAD OF triggers on the view, which must convert attempted inserts, etc. on the view into appropriate actions on other tables. For more information see . Another possibility is to create rules (see ), but in practice triggers are - easier to understand and use correctly. + easier to understand and use correctly. Also note that MERGE + is not supported on relations with rules. diff --git a/doc/src/sgml/ref/createdb.sgml b/doc/src/sgml/ref/createdb.sgml index e4647d5ce71d4..5c4e0465ed9da 100644 --- a/doc/src/sgml/ref/createdb.sgml +++ b/doc/src/sgml/ref/createdb.sgml @@ -150,6 +150,16 @@ PostgreSQL documentation + + + + + Specifies the locale name when the builtin provider is used. Locale support + is described in . + + + + @@ -171,7 +181,7 @@ PostgreSQL documentation - + Specifies the locale provider for the database's default collation. @@ -191,7 +201,7 @@ PostgreSQL documentation - + diff --git a/doc/src/sgml/ref/delete.sgml b/doc/src/sgml/ref/delete.sgml index 1b81b4e7d743f..7717855bc9ef4 100644 --- a/doc/src/sgml/ref/delete.sgml +++ b/doc/src/sgml/ref/delete.sgml @@ -25,7 +25,7 @@ PostgreSQL documentation DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ] [ USING from_item [, ...] ] [ WHERE condition | WHERE CURRENT OF cursor_name ] - [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] + [ RETURNING { * | output_expression [ [ AS ] output_name ] } [, ...] ] @@ -260,12 +260,32 @@ DELETE FROM tasks WHERE status = 'DONE' RETURNING *; - + Delete the row of tasks on which the cursor c_tasks is currently positioned: DELETE FROM tasks WHERE CURRENT OF c_tasks; - + + + + + While there is no LIMIT clause + for DELETE, it is possible to get a similar effect + using the same method described in the + documentation of UPDATE: + +WITH delete_batch AS ( + SELECT l.ctid FROM user_logs AS l + WHERE l.status = 'archived' + ORDER BY l.creation_date + FOR UPDATE + LIMIT 10000 +) +DELETE FROM user_logs AS dl + USING delete_batch AS del + WHERE dl.ctid = del.ctid; + + diff --git a/doc/src/sgml/ref/drop_database.sgml b/doc/src/sgml/ref/drop_database.sgml index ff01450ba7757..55c52ae93bc2b 100644 --- a/doc/src/sgml/ref/drop_database.sgml +++ b/doc/src/sgml/ref/drop_database.sgml @@ -79,12 +79,14 @@ DROP DATABASE [ IF EXISTS ] name [ It doesn't terminate if prepared transactions, active logical replication slots or subscriptions are present in the target database. + - This will fail if the current user has no permissions to terminate other - connections. Required permissions are the same as with - pg_terminate_backend, described in - . This will also fail if we - are not able to terminate connections. + This terminates background worker connections and connections that the + current user has permission to terminate + with pg_terminate_backend, described in + . If connections would remain, + this command will fail. diff --git a/doc/src/sgml/ref/drop_extension.sgml b/doc/src/sgml/ref/drop_extension.sgml index 484e5d9b11a15..4266c6d1ceb31 100644 --- a/doc/src/sgml/ref/drop_extension.sgml +++ b/doc/src/sgml/ref/drop_extension.sgml @@ -82,7 +82,7 @@ DROP EXTENSION [ IF EXISTS ] name [ This option prevents the specified extensions from being dropped if other objects, besides these extensions, their members, and their - explicitly dependent routines, depend on them.  This is the default. + explicitly dependent routines, depend on them. This is the default. diff --git a/doc/src/sgml/ref/drop_subscription.sgml b/doc/src/sgml/ref/drop_subscription.sgml index 2a67bdea91310..d4f54c7170eac 100644 --- a/doc/src/sgml/ref/drop_subscription.sgml +++ b/doc/src/sgml/ref/drop_subscription.sgml @@ -40,7 +40,7 @@ DROP SUBSCRIPTION [ IF EXISTS ] name DROP SUBSCRIPTION cannot be executed inside a transaction block if the subscription is associated with a replication - slot. (You can use ALTER SUBSCRIPTION to unset the + slot. (You can use ALTER SUBSCRIPTION to unset the slot.) @@ -87,9 +87,11 @@ DROP SUBSCRIPTION [ IF EXISTS ] nameDROP SUBSCRIPTION command will fail. To proceed in this situation, first disable the subscription by executing - ALTER SUBSCRIPTION ... DISABLE, and then disassociate + + ALTER SUBSCRIPTION ... DISABLE, and then disassociate it from the replication slot by executing - ALTER SUBSCRIPTION ... SET (slot_name = NONE). + + ALTER SUBSCRIPTION ... SET (slot_name = NONE). After that, DROP SUBSCRIPTION will no longer attempt any actions on a remote host. Note that if the remote replication slot still exists, it (and any related table synchronization slots) should then be diff --git a/doc/src/sgml/ref/ecpg-ref.sgml b/doc/src/sgml/ref/ecpg-ref.sgml index f3b6034f42aef..43f2d8bdaa751 100644 --- a/doc/src/sgml/ref/ecpg-ref.sgml +++ b/doc/src/sgml/ref/ecpg-ref.sgml @@ -93,10 +93,12 @@ PostgreSQL documentation - + - Define a C preprocessor symbol. + Define a preprocessor symbol, equivalently to the EXEC SQL + DEFINE directive. If no value is + specified, the symbol is defined with the value 1. diff --git a/doc/src/sgml/ref/explain.sgml b/doc/src/sgml/ref/explain.sgml index 410490951b14b..db9d3a8549add 100644 --- a/doc/src/sgml/ref/explain.sgml +++ b/doc/src/sgml/ref/explain.sgml @@ -32,7 +32,6 @@ PostgreSQL documentation EXPLAIN [ ( option [, ...] ) ] statement -EXPLAIN [ ANALYZE ] [ VERBOSE ] statement where option can be one of: @@ -42,9 +41,11 @@ EXPLAIN [ ANALYZE ] [ VERBOSE ] statementboolean ] GENERIC_PLAN [ boolean ] BUFFERS [ boolean ] + SERIALIZE [ { NONE | TEXT | BINARY } ] WAL [ boolean ] TIMING [ boolean ] SUMMARY [ boolean ] + MEMORY [ boolean ] FORMAT { TEXT | XML | JSON | YAML } @@ -106,14 +107,6 @@ ROLLBACK; - - - Only the ANALYZE and VERBOSE options - can be specified, and only in that order, without surrounding the option - list in parentheses. Prior to PostgreSQL 9.0, - the unparenthesized syntax was the only one supported. It is expected that - all new options will be supported only in the parenthesized syntax. - @@ -192,8 +185,8 @@ ROLLBACK; Include information on buffer usage. Specifically, include the number of shared blocks hit, read, dirtied, and written, the number of local blocks hit, read, dirtied, and written, the number of temp blocks read and - written, and the time spent reading and writing data file blocks and - temporary file blocks (in milliseconds) if + written, and the time spent reading and writing data file blocks, local + blocks and temporary file blocks (in milliseconds) if is enabled. A hit means that a read was avoided because the block was found already in cache when needed. @@ -214,6 +207,34 @@ ROLLBACK; + + SERIALIZE + + + Include information on the cost + of serializing the query's output data, that + is converting it to text or binary format to send to the client. + This can be a significant part of the time required for regular + execution of the query, if the datatype output functions are + expensive or if TOASTed values must be fetched + from out-of-line storage. EXPLAIN's default + behavior, SERIALIZE NONE, does not perform these + conversions. If SERIALIZE TEXT + or SERIALIZE BINARY is specified, the appropriate + conversions are performed, and the time spent doing so is measured + (unless TIMING OFF is specified). If + the BUFFERS option is also specified, then any + buffer accesses involved in the conversions are counted too. + In no case, however, will EXPLAIN actually send + the resulting data to the client; hence network transmission costs + cannot be investigated this way. + Serialization may only be enabled when ANALYZE is + also enabled. If SERIALIZE is written without an + argument, TEXT is assumed. + + + + WAL @@ -259,6 +280,19 @@ ROLLBACK; + + MEMORY + + + Include information on memory consumption by the query planning phase. + Specifically, include the precise amount of storage used by planner + in-memory structures, as well as total memory considering allocation + overhead. + This parameter defaults to FALSE. + + + + FORMAT @@ -529,6 +563,16 @@ EXPLAIN (GENERIC_PLAN) There is no EXPLAIN statement defined in the SQL standard. + + + The following syntax was used before PostgreSQL + version 9.0 and is still supported: + +EXPLAIN [ ANALYZE ] [ VERBOSE ] statement + + Note that in this syntax, the options must be specified in exactly the order + shown. + diff --git a/doc/src/sgml/ref/grant.sgml b/doc/src/sgml/ref/grant.sgml index 35bf0332c8fc3..999f657d5c008 100644 --- a/doc/src/sgml/ref/grant.sgml +++ b/doc/src/sgml/ref/grant.sgml @@ -250,11 +250,16 @@ GRANT role_name [, ...] TO This variant of the GRANT command grants membership - in a role to one or more other roles. Membership in a role is significant + in a role to one or more other roles, and the modification of + membership options SET, INHERIT, + and ADMIN; see + for details. Membership in a role is significant because it potentially allows access to the privileges granted to a role to each of its members, and potentially also the ability to make changes to the role itself. However, the actual permissions conferred depend on - the options associated with the grant. + the options associated with the grant. To modify that options of + an existing membership, simply specify the membership with updated + option values. @@ -262,7 +267,9 @@ GRANT role_name [, ...] TO TRUE or FALSE. The keyword OPTION is accepted as a synonym for TRUE, so that WITH ADMIN OPTION - is a synonym for WITH ADMIN TRUE. + is a synonym for WITH ADMIN TRUE. When altering + an existing membership the omission of an option results in the current + value being retained. @@ -276,15 +283,13 @@ GRANT role_name [, ...] TO - The INHERIT option, if it is set to - TRUE, causes the member to inherit the privileges of - the granted role. That is, it can automatically use whatever database - privileges have been granted to that role. If set to - FALSE, the member does not inherit the privileges - of the granted role. If this clause is not specified, it defaults to - true if the member role is set to INHERIT and to false - if the member role is set to NOINHERIT. - See CREATE ROLE. + The INHERIT option controls the inheritance status + of the new membership; see for + details on inheritance. If it is set to TRUE, + it causes the new member to inherit from the granted role. If + set to FALSE, the new member does not inherit. + If unspecified when creating a new role membership, this defaults to the + inheritance attribute of the new member. diff --git a/doc/src/sgml/ref/initdb.sgml b/doc/src/sgml/ref/initdb.sgml index 22f1011781fb8..bdd613e77ffdd 100644 --- a/doc/src/sgml/ref/initdb.sgml +++ b/doc/src/sgml/ref/initdb.sgml @@ -286,6 +286,12 @@ PostgreSQL documentation environment that initdb runs in. Locale support is described in . + + If is builtin, + or must be + specified and set to C or + C.UTF-8. + @@ -314,43 +320,25 @@ PostgreSQL documentation - - - - - This option sets the locale provider for databases created in the new - cluster. It can be overridden in the CREATE - DATABASE command when new databases are subsequently - created. The default is libc (see ). - - - - - - - + + - By default, initdb will wait for all files to be - written safely to disk. This option causes initdb - to return without waiting, which is faster, but means that a - subsequent operating system crash can leave the data directory - corrupt. Generally, this option is useful for testing, but should not - be used when creating a production installation. + Specifies the locale name when the builtin provider is used. Locale support + is described in . - - + + - By default, initdb will write instructions for how - to start the cluster at the end of its output. This option causes - those instructions to be left out. This is primarily intended for use - by tools that wrap initdb in platform-specific - behavior, where those instructions are likely to be incorrect. + This option sets the locale provider for databases created in the new + cluster. It can be overridden in the CREATE + DATABASE command when new databases are subsequently + created. The default is libc (see ). @@ -365,20 +353,6 @@ PostgreSQL documentation - - - - - - Safely write all database files to disk and exit. This does not - perform any of the normal initdb operations. - Generally, this option is useful for ensuring reliable recovery after - changing from off to - on. - - - - @@ -395,10 +369,10 @@ PostgreSQL documentation - Selects the user name of the + Sets the user name of the bootstrap superuser. - This defaults to the name of the - cluster owner. + This defaults to the name of the operating-system user running + initdb. @@ -522,6 +496,82 @@ PostgreSQL documentation + + + + + + + By default, initdb will wait for all files to be + written safely to disk. This option causes initdb + to return without waiting, which is faster, but means that a + subsequent operating system crash can leave the data directory + corrupt. Generally, this option is useful for testing, but should not + be used when creating a production installation. + + + + + + + + + By default, initdb will write instructions for how + to start the cluster at the end of its output. This option causes + those instructions to be left out. This is primarily intended for use + by tools that wrap initdb in platform-specific + behavior, where those instructions are likely to be incorrect. + + + + + + + + + + Show internal settings and exit, without doing anything else. This + can be used to debug the initdb + installation. + + + + + + + + + When set to fsync, which is the default, + initdb will recursively open and synchronize all + files in the data directory. The search for files will follow symbolic + links for the WAL directory and each configured tablespace. + + + On Linux, syncfs may be used instead to ask the + operating system to synchronize the whole file systems that contain the + data directory, the WAL files, and each tablespace. See + for information about + the caveats to be aware of when using syncfs. + + + This option has no effect when is used. + + + + + + + + + + Safely write all database files to disk and exit. This does not + perform any of the normal initdb operations. + Generally, this option is useful for ensuring reliable recovery after + changing from off to + on. + + + @@ -594,12 +644,6 @@ PostgreSQL documentation - - This utility, like most other PostgreSQL utilities, - also uses the environment variables supported by libpq - (see ). - - diff --git a/doc/src/sgml/ref/insert.sgml b/doc/src/sgml/ref/insert.sgml index 7cea70329e107..6f0adee1a124a 100644 --- a/doc/src/sgml/ref/insert.sgml +++ b/doc/src/sgml/ref/insert.sgml @@ -26,7 +26,7 @@ INSERT INTO table_name [ AS expression | DEFAULT } [, ...] ) [, ...] | query } [ ON CONFLICT [ conflict_target ] conflict_action ] - [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] + [ RETURNING { * | output_expression [ [ AS ] output_name ] } [, ...] ] where conflict_target can be one of: diff --git a/doc/src/sgml/ref/listen.sgml b/doc/src/sgml/ref/listen.sgml index 2fab9d65a107e..6c1f09bd45526 100644 --- a/doc/src/sgml/ref/listen.sgml +++ b/doc/src/sgml/ref/listen.sgml @@ -148,6 +148,7 @@ Asynchronous notification "virtual" received from server process with PID 8448. + diff --git a/doc/src/sgml/ref/merge.sgml b/doc/src/sgml/ref/merge.sgml index 0995fe0c0469a..97b34b9fcaf7a 100644 --- a/doc/src/sgml/ref/merge.sgml +++ b/doc/src/sgml/ref/merge.sgml @@ -25,6 +25,7 @@ PostgreSQL documentation MERGE INTO [ ONLY ] target_table_name [ * ] [ [ AS ] target_alias ] USING data_source ON join_condition when_clause [...] +[ RETURNING { * | output_expression [ [ AS ] output_name ] } [, ...] ] where data_source is: @@ -33,7 +34,8 @@ USING data_source ON and when_clause is: { WHEN MATCHED [ AND condition ] THEN { merge_update | merge_delete | DO NOTHING } | - WHEN NOT MATCHED [ AND condition ] THEN { merge_insert | DO NOTHING } } + WHEN NOT MATCHED BY SOURCE [ AND condition ] THEN { merge_update | merge_delete | DO NOTHING } | + WHEN NOT MATCHED [ BY TARGET ] [ AND condition ] THEN { merge_insert | DO NOTHING } } and merge_insert is: @@ -44,7 +46,9 @@ INSERT [( column_name [, ...] )] and merge_update is: UPDATE SET { column_name = { expression | DEFAULT } | - ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...] + ( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) | + ( column_name [, ...] ) = ( sub-SELECT ) + } [, ...] and merge_delete is: @@ -57,7 +61,7 @@ DELETE MERGE performs actions that modify rows in the - target_table_name, + target table identified as target_table_name, using the data_source. MERGE provides a single SQL statement that can conditionally INSERT, @@ -68,9 +72,11 @@ DELETE First, the MERGE command performs a join from data_source to - target_table_name + the target table producing zero or more candidate change rows. For each candidate change - row, the status of MATCHED or NOT MATCHED + row, the status of MATCHED, + NOT MATCHED BY SOURCE, + or NOT MATCHED [BY TARGET] is set just once, after which WHEN clauses are evaluated in the order specified. For each candidate change row, the first clause to evaluate as true is executed. No more than one WHEN @@ -83,7 +89,7 @@ DELETE DELETE commands of the same names. The syntax of those commands is different, notably that there is no WHERE clause and no table name is specified. All actions refer to the - target_table_name, + target table, though modifications to other tables may be made using triggers. @@ -94,27 +100,44 @@ DELETE more fine-grained handling. + + The optional RETURNING clause causes MERGE + to compute and return value(s) based on each row inserted, updated, or + deleted. Any expression using the source or target table's columns, or + the merge_action() + function can be computed. When an INSERT or + UPDATE action is performed, the new values of the target + table's columns are used. When a DELETE is performed, + the old values of the target table's columns are used. The syntax of the + RETURNING list is identical to that of the output list + of SELECT. + + There is no separate MERGE privilege. If you specify an update action, you must have the UPDATE privilege on the column(s) - of the target_table_name + of the target table that are referred to in the SET clause. If you specify an insert action, you must have the INSERT - privilege on the target_table_name. - If you specify an delete action, you must have the DELETE - privilege on the target_table_name. + privilege on the target table. + If you specify a delete action, you must have the DELETE + privilege on the target table. + If you specify a DO NOTHING action, you must have + the SELECT privilege on at least one column + of the target table. + You will also need SELECT privilege on any column(s) + of the data_source and + of the target table referred to + in any condition (including join_condition) + or expression. Privileges are tested once at statement start and are checked whether or not particular WHEN clauses are executed. - You will require the SELECT privilege on the - data_source and any column(s) - of the target_table_name - referred to in a condition. MERGE is not supported if the - target_table_name is a + target table is a materialized view, foreign table, or if it has any rules defined on it. @@ -124,13 +147,26 @@ DELETE Parameters + + with_query + + + The WITH clause allows you to specify one or more + subqueries that can be referenced by name in the MERGE + query. See and + for details. Note that WITH RECURSIVE is not supported + by MERGE. + + + + target_table_name - The name (optionally schema-qualified) of the target table to merge into. - If ONLY is specified before the table name, matching - rows are updated or deleted in the named table only. If + The name (optionally schema-qualified) of the target table or view to + merge into. If ONLY is specified before a table + name, matching rows are updated or deleted in the named table only. If ONLY is not specified, matching rows are also updated or deleted in any tables inheriting from the named table. Optionally, * can be specified after the table name to explicitly @@ -138,6 +174,16 @@ DELETE ONLY keyword and * option do not affect insert actions, which always insert into the named table only. + + + If target_table_name is a + view, it must either be automatically updatable with no + INSTEAD OF triggers, or it must have + INSTEAD OF triggers for every type of action + (INSERT, UPDATE, and + DELETE) specified in the WHEN + clauses. Views with rules are not supported. + @@ -175,7 +221,7 @@ DELETE A query (SELECT statement or VALUES statement) that supplies the rows to be merged into the - target_table_name. + target table. Refer to the statement or statement for a description of the syntax. @@ -203,18 +249,27 @@ DELETE boolean (similar to a WHERE clause) that specifies which rows in the data_source - match rows in the - target_table_name. + match rows in the target table. - Only columns from target_table_name + Only columns from the target table that attempt to match data_source rows should appear in join_condition. join_condition subexpressions that - only reference target_table_name + only reference the target table's columns can affect which action is taken, often in surprising ways. + + If both WHEN NOT MATCHED BY SOURCE and + WHEN NOT MATCHED [BY TARGET] clauses are specified, + the MERGE command will perform a FULL + join between data_source + and the target table. For this to work, at least one + join_condition subexpression + must use an operator that can support a hash join, or all of the + subexpressions must use operators that can support a merge join. + @@ -225,19 +280,41 @@ DELETE At least one WHEN clause is required. + + The WHEN clause may specify WHEN MATCHED, + WHEN NOT MATCHED BY SOURCE, or + WHEN NOT MATCHED [BY TARGET]. + Note that the SQL standard only defines + WHEN MATCHED and WHEN NOT MATCHED + (which is defined to mean no matching target row). + WHEN NOT MATCHED BY SOURCE is an extension to the + SQL standard, as is the option to append + BY TARGET to WHEN NOT MATCHED, to + make its meaning more explicit. + If the WHEN clause specifies WHEN MATCHED and the candidate change row matches a row in the - target_table_name, - the WHEN clause is executed if the + data_source to a row in the + target table, the WHEN clause is executed if the condition is absent or it evaluates to true. - Conversely, if the WHEN clause specifies - WHEN NOT MATCHED - and the candidate change row does not match a row in the - target_table_name, + If the WHEN clause specifies + WHEN NOT MATCHED BY SOURCE and the candidate change + row represents a row in the target table that does not match a row in the + data_source, the + WHEN clause is executed if the + condition is + absent or it evaluates to true. + + + If the WHEN clause specifies + WHEN NOT MATCHED [BY TARGET] and the candidate change + row represents a row in the + data_source that does not + match a row in the target table, the WHEN clause is executed if the condition is absent or it evaluates to true. @@ -257,7 +334,10 @@ DELETE A condition on a WHEN MATCHED clause can refer to columns in both the source and the target relations. A condition on a - WHEN NOT MATCHED clause can only refer to columns from + WHEN NOT MATCHED BY SOURCE clause can only refer to + columns from the target relation, since by definition there is no matching + source row. A condition on a WHEN NOT MATCHED [BY TARGET] + clause can only refer to columns from the source relation, since by definition there is no matching target row. Only the system attributes from the target table are accessible. @@ -280,10 +360,10 @@ DELETE or null if there is none. - If target_table_name + If the target table is a partitioned table, each row is routed to the appropriate partition and inserted into it. - If target_table_name + If the target table is a partition, an error will occur if any input row violates the partition constraint. @@ -304,7 +384,7 @@ DELETE The specification of an UPDATE action that updates - the current row of the target_table_name. + the current row of the target table. Column names may not be specified more than once. @@ -318,7 +398,7 @@ DELETE Specifies a DELETE action that deletes the current row - of the target_table_name. + of the target table. Do not include the table name or any other clauses, as you would normally do with a command. @@ -329,8 +409,7 @@ DELETE column_name - The name of a column in the target_table_name. The column name + The name of a column in the target table. The column name can be qualified with a subfield name or array subscript, if needed. (Inserting into only some fields of a composite column leaves the other fields null.) @@ -381,9 +460,12 @@ DELETE An expression to assign to the column. If used in a WHEN MATCHED clause, the expression can use values from the original row in the target table, and values from the - data_source row. - If used in a WHEN NOT MATCHED clause, the - expression can use values from the data_source. + data_source row. + If used in a WHEN NOT MATCHED BY SOURCE clause, the + expression can only use values from the original row in the target table. + If used in a WHEN NOT MATCHED [BY TARGET] clause, the + expression can only use values from the + data_source row. @@ -399,13 +481,50 @@ DELETE - with_query + sub-SELECT - The WITH clause allows you to specify one or more - subqueries that can be referenced by name in the MERGE - query. See and - for details. + A SELECT sub-query that produces as many output columns + as are listed in the parenthesized column list preceding it. The + sub-query must yield no more than one row when executed. If it + yields one row, its column values are assigned to the target columns; + if it yields no rows, NULL values are assigned to the target columns. + If used in a WHEN MATCHED clause, the sub-query can + refer to values from the original row in the target table, and values + from the data_source row. + If used in a WHEN NOT MATCHED BY SOURCE clause, the + sub-query can only refer to values from the original row in the target + table. + + + + + + output_expression + + + An expression to be computed and returned by the MERGE + command after each row is changed (whether inserted, updated, or deleted). + The expression can use any columns of the source or target tables, or the + merge_action() + function to return additional information about the action executed. + + + Writing * will return all columns from the source + table, followed by all columns from the target table. Often this will + lead to a lot of duplication, since it is common for the source and + target tables to have a lot of the same columns. This can be avoided by + qualifying the * with the name or alias of the source + or target table. + + + + + + output_name + + + A name to use for a returned column. @@ -428,6 +547,13 @@ MERGE total_count were changed in any way. + + If the MERGE command contains a RETURNING + clause, the result will be similar to that of a SELECT + statement containing the columns and values defined in the + RETURNING list, computed over the row(s) inserted, updated, + or deleted by the command. + @@ -452,8 +578,9 @@ MERGE total_count - Evaluate whether each row is MATCHED or - NOT MATCHED. + Evaluate whether each row is MATCHED, + NOT MATCHED BY SOURCE, or + NOT MATCHED [BY TARGET]. @@ -484,7 +611,11 @@ MERGE total_count the action's event type. - + + If the target relation is a view with INSTEAD OF ROW + triggers for the action's event type, they are used to perform the + action instead. + @@ -528,7 +659,8 @@ MERGE total_count If a WHEN clause omits an AND sub-clause, it becomes the final reachable clause of that - kind (MATCHED or NOT MATCHED). + kind (MATCHED, NOT MATCHED BY SOURCE, + or NOT MATCHED [BY TARGET]). If a later WHEN clause of that kind is specified it would be provably unreachable and an error is raised. If no final reachable clause is specified of either kind, it is @@ -543,13 +675,6 @@ MERGE total_count needed to avoid deadlocks between concurrent transactions. - - There is no RETURNING clause with - MERGE. Actions of INSERT, - UPDATE and DELETE cannot contain - RETURNING or WITH clauses. - - When MERGE is run concurrently with other commands that modify the target table, the usual transaction isolation rules @@ -602,7 +727,8 @@ WHEN NOT MATCHED THEN Attempt to insert a new stock item along with the quantity of stock. If the item already exists, instead update the stock count of the existing - item. Don't allow entries that have zero stock. + item. Don't allow entries that have zero stock. Return details of all + changes made. MERGE INTO wines w USING wine_stock_changes s @@ -612,13 +738,31 @@ WHEN NOT MATCHED AND s.stock_delta > 0 THEN WHEN MATCHED AND w.stock + s.stock_delta > 0 THEN UPDATE SET stock = w.stock + s.stock_delta WHEN MATCHED THEN - DELETE; + DELETE +RETURNING merge_action(), w.*; The wine_stock_changes table might be, for example, a temporary table recently loaded into the database. + + Update wines based on a replacement wine list, inserting + rows for any new stock, updating modified stock entries, and deleting any + wines not present in the new list. + +MERGE INTO wines w +USING new_wine_list s +ON s.winename = w.winename +WHEN NOT MATCHED BY TARGET THEN + INSERT VALUES(s.winename, s.stock) +WHEN MATCHED AND w.stock != s.stock THEN + UPDATE SET stock = s.stock +WHEN NOT MATCHED BY SOURCE THEN + DELETE; + + + @@ -627,8 +771,11 @@ WHEN MATCHED THEN This command conforms to the SQL standard. - The WITH clause and DO NOTHING action are extensions to - the SQL standard. + The WITH clause, BY SOURCE and + BY TARGET qualifiers to + WHEN NOT MATCHED, DO NOTHING action, + and RETURNING clause are extensions to the + SQL standard. diff --git a/doc/src/sgml/ref/notify.sgml b/doc/src/sgml/ref/notify.sgml index d7dcbea02d45e..fd6ed54e8f9d8 100644 --- a/doc/src/sgml/ref/notify.sgml +++ b/doc/src/sgml/ref/notify.sgml @@ -228,6 +228,7 @@ Asynchronous notification "foo" with payload "payload" received from server proc + diff --git a/doc/src/sgml/ref/pg_amcheck.sgml b/doc/src/sgml/ref/pg_amcheck.sgml index 20c2897accb49..6bfe28799c4e6 100644 --- a/doc/src/sgml/ref/pg_amcheck.sgml +++ b/doc/src/sgml/ref/pg_amcheck.sgml @@ -383,6 +383,17 @@ PostgreSQL documentation The following command-line options control checking of B-tree indexes: + + + + + For each index with unique constraint checked, verify that no more than + one among duplicate entries is visible in the index using 's + option. + + + + @@ -633,6 +644,24 @@ PostgreSQL documentation + + Environment + + + pg_amcheck, like most other PostgreSQL + utilities, + also uses the environment variables supported by libpq + (see ). + + + + The environment variable PG_COLOR specifies whether to use + color in diagnostic messages. Possible values are + always, auto and + never. + + + Notes diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml index 79d3e657c32c2..95b9b302e950e 100644 --- a/doc/src/sgml/ref/pg_basebackup.sgml +++ b/doc/src/sgml/ref/pg_basebackup.sgml @@ -38,11 +38,25 @@ PostgreSQL documentation - pg_basebackup makes an exact copy of the database - cluster's files, while making sure the server is put into and - out of backup mode automatically. Backups are always taken of the entire - database cluster; it is not possible to back up individual databases or - database objects. For selective backups, another tool such as + pg_basebackup can take a full or incremental + base backup of the database. When used to take a full backup, it makes an + exact copy of the database cluster's files. When used to take an incremental + backup, some files that would have been part of a full backup may be + replaced with incremental versions of the same files, containing only those + blocks that have been modified since the reference backup. An incremental + backup cannot be used directly; instead, + must first + be used to combine it with the previous backups upon which it depends. + See for more information + about incremental backups, and + for steps to recover from a backup. + + + + In any mode, pg_basebackup makes sure the server + is put into and out of backup mode automatically. Backups are always taken of + the entire database cluster; it is not possible to back up individual + databases or database objects. For selective backups, another tool such as must be used. @@ -197,6 +211,19 @@ PostgreSQL documentation + + + + + + Performs an incremental + backup. The backup manifest for the reference + backup must be provided, and will be uploaded to the server, which will + respond by sending the requested incremental backup. + + + + @@ -216,7 +243,11 @@ PostgreSQL documentation The postgresql.auto.conf file will record the connection settings and, if specified, the replication slot that pg_basebackup is using, so that - streaming replication will use the same settings later on. + streaming replication and + logical replication slot synchronization will use the same + settings later on. The dbname will be recorded only if the dbname was + specified explicitly in the connection string or + environment variable. @@ -422,8 +453,9 @@ PostgreSQL documentation A compression detail string can optionally be specified. If the detail string is an integer, it specifies the compression level. Otherwise, it should be a comma-separated list of items, - each of the form keyword or - keyword=value. + each of the form + keyword or + keyword=value. Currently, the supported keywords are level, long, and workers. The detail string cannot be used when the compression method @@ -594,6 +626,31 @@ PostgreSQL documentation + + + + + When set to fsync, which is the default, + pg_basebackup will recursively open and synchronize + all files in the backup directory. When the plain format is used, the + search for files will follow symbolic links for the WAL directory and + each configured tablespace. + + + On Linux, syncfs may be used instead to ask the + operating system to synchronize the whole file system that contains the + backup directory. When the plain format is used, + pg_basebackup will also synchronize the file systems + that contain the WAL files and each tablespace. See + for information about + the caveats to be aware of when using syncfs. + + + This option has no effect when is used. + + + + @@ -750,10 +807,19 @@ PostgreSQL documentation will override any conflicting command line options. - The option is called --dbname for consistency with other + This option is called --dbname for consistency with other client applications, but because pg_basebackup doesn't connect to any particular database in the cluster, any database - name in the connection string will be ignored. + name included in the connection string will be ignored by the server. + However, a database name supplied that way overrides the default + database name (replication) for purposes of + looking up the replication connection's password + in ~/.pgpass. Similarly, middleware or proxies + used in connecting to PostgreSQL might + utilize the name for purposes such as connection routing. The + database name can also be used + by + logical replication slot synchronization. @@ -909,7 +975,8 @@ PostgreSQL documentation The backup will include all files in the data directory and tablespaces, including the configuration files and any additional files placed in the directory by third parties, except certain temporary files managed by - PostgreSQL. But only regular files and directories are copied, except that + PostgreSQL and operating system files. But only regular files and + directories are copied, except that symbolic links used for tablespaces are preserved. Symbolic links pointing to certain directories known to PostgreSQL are copied as empty directories. Other symbolic links and special device files are skipped. @@ -938,10 +1005,11 @@ PostgreSQL documentation pg_basebackup works with servers of the same - or an older major version, down to 9.1. However, WAL streaming mode (-X - stream) only works with server version 9.3 and later, and tar format + or older major version, down to 9.1. However, WAL streaming mode (-X + stream) only works with server version 9.3 and later, the tar format (--format=tar) only works with server version 9.5 - and later. + and later, and incremental backup (--incremental) only works + with server version 17 and later. @@ -991,7 +1059,7 @@ PostgreSQL documentation - To create a backup of a local server with one tar file for each tablespace + To create a backup of the local server with one tar file for each tablespace compressed with gzip at level 9, stored in the directory backup: diff --git a/doc/src/sgml/ref/pg_checksums.sgml b/doc/src/sgml/ref/pg_checksums.sgml index a3d0b0f0a3d64..95043aa329c02 100644 --- a/doc/src/sgml/ref/pg_checksums.sgml +++ b/doc/src/sgml/ref/pg_checksums.sgml @@ -139,6 +139,28 @@ PostgreSQL documentation + + + + + When set to fsync, which is the default, + pg_checksums will recursively open and synchronize + all files in the data directory. The search for files will follow + symbolic links for the WAL directory and each configured tablespace. + + + On Linux, syncfs may be used instead to ask the + operating system to synchronize the whole file systems that contain the + data directory, the WAL files, and each tablespace. See + for information about + the caveats to be aware of when using syncfs. + + + This option has no effect when is used. + + + + diff --git a/doc/src/sgml/ref/pg_combinebackup.sgml b/doc/src/sgml/ref/pg_combinebackup.sgml new file mode 100644 index 0000000000000..091982f62ad56 --- /dev/null +++ b/doc/src/sgml/ref/pg_combinebackup.sgml @@ -0,0 +1,319 @@ + + + + + pg_combinebackup + + + + pg_combinebackup + 1 + Application + + + + pg_combinebackup + reconstruct a full backup from an incremental backup and dependent backups + + + + + pg_combinebackup + option + backup_directory + + + + + Description + + pg_combinebackup is used to reconstruct a + synthetic full backup from an + incremental backup and the + earlier backups upon which it depends. + + + + Specify all of the required backups on the command line from oldest to newest. + That is, the first backup directory should be the path to the full backup, and + the last should be the path to the final incremental backup + that you wish to restore. The reconstructed backup will be written to the + output directory specified by the option. + + + + pg_combinebackup will attempt to verify + that the backups you specify form a legal backup chain from which a correct + full backup can be reconstructed. However, it is not designed to help you + keep track of which backups depend on which other backups. If you remove + one or more of the previous backups upon which your incremental + backup relies, you will not be able to restore it. Moreover, + pg_combinebackup only attempts to verify that the + backups have the correct relationship to each other, not that each + individual backup is intact; for that, use + . + + + + Since the output of pg_combinebackup is a + synthetic full backup, it can be used as an input to a future invocation of + pg_combinebackup. The synthetic full backup would + be specified on the command line in lieu of the chain of backups from which + it was reconstructed. + + + + + Options + + + + + + + + + Print lots of debug logging output on stderr. + + + + + + + + + + The / option instructs + pg_combinebackup to figure out what would be done + without actually creating the target directory or any output files. + It is particularly useful in combination with . + + + + + + + + + + By default, pg_combinebackup will wait for all files + to be written safely to disk. This option causes + pg_combinebackup to return without waiting, which is + faster, but means that a subsequent operating system crash can leave + the output backup corrupt. Generally, this option is useful for testing + but should not be used when creating a production installation. + + + + + + + + + + Specifies the output directory to which the synthetic full backup + should be written. Currently, this argument is required. + + + + + + + + + + Relocates the tablespace in directory olddir + to newdir during the backup. + olddir is the absolute path of the tablespace + as it exists in the final backup specified on the command line, + and newdir is the absolute path to use for the + tablespace in the reconstructed backup. If either path needs to contain + an equal sign (=), precede that with a backslash. + This option can be specified multiple times for multiple tablespaces. + + + + + + + + + Use efficient file cloning (also known as reflinks on + some systems) instead of copying files to the new data directory, + which can result in near-instantaneous copying of the data files. + + + + If a backup manifest is not available or does not contain checksum of + the right type, file cloning will be used to copy the file, but the + file will be also read block-by-block for the checksum calculation. + + + + File cloning is only supported on some operating systems and file + systems. If it is selected but not supported, the + pg_combinebackup run will error. At present, + it is supported on Linux (kernel 4.5 or later) with Btrfs and XFS (on + file systems created with reflink support), and on macOS with APFS. + + + + + + + + + Perform regular file copy. This is the default. (See also + and .) + + + + + + + + + Use the copy_file_range system call for efficient + copying. On some file systems this gives results similar to + , sharing physical disk blocks, while on others + it may still copy blocks, but do so via an optimized path. At present, + it is supported on Linux and FreeBSD. + + + + If a backup manifest is not available or does not contain checksum of + the right type, copy_file_range will be used to + copy the file, but the file will be also read block-by-block for the + checksum calculation. + + + + + + + + + Like , + pg_combinebackup writes a backup manifest + in the output directory. This option specifies the checksum algorithm + that should be applied to each file included in the backup manifest. + Currently, the available algorithms are NONE, + CRC32C, SHA224, + SHA256, SHA384, + and SHA512. The default is CRC32C. + + + + + + + + + Disables generation of a backup manifest. If this option is not + specified, a backup manifest for the reconstructed backup will be + written to the output directory. + + + + + + + + + When set to fsync, which is the default, + pg_combinebackup will recursively open and synchronize + all files in the backup directory. When the plain format is used, the + search for files will follow symbolic links for the WAL directory and + each configured tablespace. + + + On Linux, syncfs may be used instead to ask the + operating system to synchronize the whole file system that contains the + backup directory. When the plain format is used, + pg_combinebackup will also synchronize the file systems + that contain the WAL files and each tablespace. See + for information about + the caveats to be aware of when using syncfs. + + + This option has no effect when is used. + + + + + + + + + + Prints the pg_combinebackup version and + exits. + + + + + + + + + + Shows help about pg_combinebackup command + line arguments, and exits. + + + + + + + + + + + Limitations + + + pg_combinebackup does not recompute page checksums when + writing the output directory. Therefore, if any of the backups used for + reconstruction were taken with checksums disabled, but the final backup was + taken with checksums enabled, the resulting directory may contain pages + with invalid checksums. + + + + To avoid this problem, taking a new full backup after changing the checksum + state of the cluster using is + recommended. Otherwise, you can disable and then optionally reenable + checksums on the directory produced by pg_combinebackup + in order to correct the problem. + + + + + Environment + + + This utility, like most other PostgreSQL utilities, + uses the environment variables supported by libpq + (see ). + + + + The environment variable PG_COLOR specifies whether to use + color in diagnostic messages. Possible values are + always, auto and + never. + + + + + See Also + + + + + + + diff --git a/doc/src/sgml/ref/pg_createsubscriber.sgml b/doc/src/sgml/ref/pg_createsubscriber.sgml new file mode 100644 index 0000000000000..26b8e64a4e03b --- /dev/null +++ b/doc/src/sgml/ref/pg_createsubscriber.sgml @@ -0,0 +1,542 @@ + + + + + pg_createsubscriber + + + + pg_createsubscriber + 1 + Application + + + + pg_createsubscriber + convert a physical replica into a new logical replica + + + + + pg_createsubscriber + option + + + + + + dbname + + + + + datadir + + + + + connstr + + + + + + Description + + + pg_createsubscriber creates a new logical + replica from a physical standby server. All tables in the specified + database are included in the logical + replication setup. A pair of + publication and subscription objects are created for each database. It + must be run at the target server. + + + + After a successful run, the state of the target server is analogous to a + fresh logical replication setup. The main difference between the logical + replication setup and pg_createsubscriber is how + the data synchronization is done. pg_createsubscriber + does not copy the initial table data. It does only the synchronization phase, + which ensures each table is brought up to a synchronized state. + + + + pg_createsubscriber targets large database + systems because in logical replication setup, most of the time is spent + doing the initial data copy. Furthermore, a side effect of this long time + spent synchronizing data is usually a large amount of changes to be applied + (that were produced during the initial data copy), which increases even + more the time when the logical replica will be available. For smaller + databases, it is recommended to set up logical replication with initial data + synchronization. For details, see the CREATE SUBSCRIPTION + + copy_data option. + + + + + + Options + + + pg_createsubscriber accepts the following + command-line arguments: + + + + + + + + The name of the database in which to create a subscription. Multiple + databases can be selected by writing multiple + switches. + + + + + + + + + + The target directory that contains a cluster directory from a physical + replica. + + + + + + + + + + Do everything except actually modifying the target directory. + + + + + + + + + + The port number on which the target server is listening for + connections. Defaults to running the target server on port 50432 to + avoid unintended client connections. + + + + + + + + + + The connection string to the publisher. For details see . + + + + + + + + + + The directory to use for postmaster sockets on target server. The + default is current directory. + + + + + + + + + + The maximum number of seconds to wait for recovery to end. Setting to + 0 disables. The default is 0. + + + + + + + + + + The user name to connect as on target server. Defaults to the current + operating system user name. + + + + + + + + + + Enables verbose mode. This will cause + pg_createsubscriber to output progress + messages and detailed information about each step to standard error. + Repeating the option causes additional debug-level messages to appear + on standard error. + + + + + + + + + Use the specified main server configuration file for the target data + directory. pg_createsubscriber internally uses + the pg_ctl command to start and + stop the target server. It allows you to specify the actual + postgresql.conf configuration file if it is stored + outside the data directory. + + + + + + + + + The publication name to set up the logical replication. Multiple + publications can be specified by writing multiple + switches. The number of publication + names must match the number of specified databases, otherwise an error + is reported. The order of the multiple publication name switches must + match the order of database switches. If this option is not specified, + a generated name is assigned to the publication name. + + + + + + + + + The replication slot name to set up the logical replication. Multiple + replication slots can be specified by writing multiple + switches. The number of + replication slot names must match the number of specified databases, + otherwise an error is reported. The order of the multiple replication + slot name switches must match the order of database switches. If this + option is not specified, the subscription name is assigned to the + replication slot name. + + + + + + + + + The subscription name to set up the logical replication. Multiple + subscriptions can be specified by writing multiple + switches. The number of subscription + names must match the number of specified databases, otherwise an error + is reported. The order of the multiple subscription name switches must + match the order of database switches. If this option is not specified, + a generated name is assigned to the subscription name. + + + + + + + + + + Print the pg_createsubscriber version and exit. + + + + + + + + + + Show help about pg_createsubscriber command + line arguments, and exit. + + + + + + + + + Notes + + + Prerequisites + + + There are some prerequisites for + pg_createsubscriber to convert the target server + into a logical replica. If these are not met, an error will be reported. + The source and target servers must have the same major version as the + pg_createsubscriber. The given target data + directory must have the same system identifier as the source data + directory. The given database user for the target data directory must have + privileges for creating subscriptions and using pg_replication_origin_advance(). + + + + The target server must be used as a physical standby. The target server + must have and configured to a value + greater than or equal to the number of specified databases. The target + server must have configured to a + value greater than the number of specified databases. The target server + must accept local connections. + + + + The source server must accept connections from the target server. The + source server must not be in recovery. The source server must have as logical. The source server + must have configured to a value + greater than or equal to the number of specified databases plus existing + replication slots. The source server must have configured to a value greater than or equal + to the number of specified databases and existing WAL sender processes. + + + + + Warnings + + + If pg_createsubscriber fails after the target + server was promoted, then the data directory is likely not in a state that + can be recovered. In such case, creating a new standby server is + recommended. + + + + pg_createsubscriber usually starts the target + server with different connection settings during transformation. Hence, + connections to the target server should fail. + + + + Since DDL commands are not replicated by logical replication, avoid + executing DDL commands that change the database schema while running + pg_createsubscriber. If the target server has + already been converted to logical replica, the DDL commands might not be + replicated, which might cause an error. + + + + If pg_createsubscriber fails while processing, + objects (publications, replication slots) created on the source server are + removed. The removal might fail if the target server cannot connect to + the source server. In such a case, a warning message will inform the + objects left. If the target server is running, it will be stopped. + + + + If the replication is using , it + will be removed from the source server after the logical replication + setup. + + + + If the target server is a synchronous replica, transaction commits on the + primary might wait for replication while running + pg_createsubscriber. + + + + pg_createsubscriber sets up logical + replication with two-phase commit disabled. This means that any + prepared transactions will be replicated at the time + of COMMIT PREPARED, without advance preparation. + Once setup is complete, you can manually drop and re-create the + subscription(s) with + the two_phase + option enabled. + + + + pg_createsubscriber changes the system + identifier using pg_resetwal. It would avoid + situations in which the target server might use WAL files from the source + server. If the target server has a standby, replication will break and a + fresh standby should be created. + + + + + How It Works + + + The basic idea is to have a replication start point from the source server + and set up a logical replication to start from this point: + + + + + + Start the target server with the specified command-line options. If the + target server is already running, + pg_createsubscriber will terminate with an + error. + + + + + + Check if the target server can be converted. There are also a few + checks on the source server. If any of the prerequisites are not met, + pg_createsubscriber will terminate with an + error. + + + + + + Create a publication and replication slot for each specified database on + the source server. Each publication is created using FOR ALL + TABLES. If the option + is not specified, the publication has the following name pattern: + pg_createsubscriber_%u_%x (parameter: + database oid, random int). + If the option is not specified, the + replication slot has the following name pattern: + pg_createsubscriber_%u_%x (parameters: + database oid, random int). + These replication slots will be used by the subscriptions in a future + step. The last replication slot LSN is used as a stopping point in the + parameter and by the + subscriptions as a replication start point. It guarantees that no + transaction will be lost. + + + + + + Write recovery parameters into the target data directory and restart the + target server. It specifies an LSN () of the write-ahead log location up + to which recovery will proceed. It also specifies + promote as the action that the server should take + once the recovery target is reached. Additional recovery parameters + are added to avoid unexpected behavior during the recovery process such + as end of the recovery as soon as a consistent state is reached (WAL + should be applied until the replication start location) and multiple + recovery targets that can cause a failure. This step finishes once the + server ends standby mode and is accepting read-write transactions. If + option is set, + pg_createsubscriber terminates if recovery + does not end until the given number of seconds. + + + + + + Create a subscription for each specified database on the target server. + If the option is not specified, the + subscription has the following name pattern: + pg_createsubscriber_%u_%x (parameters: + database oid, random int). + It does not copy existing data from the source server. It does not + create a replication slot. Instead, it uses the replication slot that + was created in a previous step. The subscription is created but it is + not enabled yet. The reason is the replication progress must be set to + the replication start point before starting the replication. + + + + + + Drop publications on the target server that were replicated because they + were created before the replication start location. It has no use on + the subscriber. + + + + + + Set the replication progress to the replication start point for each + subscription. When the target server starts the recovery process, it + catches up to the replication start point. This is the exact LSN to be + used as a initial replication location for each subscription. The + replication origin name is obtained since the subscription was created. + The replication origin name and the replication start point are used in + pg_replication_origin_advance() + to set up the initial replication location. + + + + + + Enable the subscription for each specified database on the target server. + The subscription starts applying transactions from the replication start + point. + + + + + + If the standby server was using , + it has no use from now on so drop it. + + + + + + If the standby server contains failover + replication slots, they cannot be synchronized anymore, so drop + them. + + + + + + Update the system identifier on the target server. The + is run to modify the system identifier. + The target server is stopped as a pg_resetwal requirement. + + + + + + + + Examples + + + To create a logical replica for databases hr and + finance from a physical replica at + foo: + +$ pg_createsubscriber -D /usr/local/pgsql/data -P "host=foo" -d hr -d finance + + + + + + See Also + + + + + + diff --git a/doc/src/sgml/ref/pg_ctl-ref.sgml b/doc/src/sgml/ref/pg_ctl-ref.sgml index 46906966eb994..a0287bb81d623 100644 --- a/doc/src/sgml/ref/pg_ctl-ref.sgml +++ b/doc/src/sgml/ref/pg_ctl-ref.sgml @@ -578,13 +578,6 @@ PostgreSQL documentation unless PGDATA is set. - - pg_ctl, like most other PostgreSQL - utilities, - also uses the environment variables supported by libpq - (see ). - - For additional variables that affect the server, see . diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml index a3cf0608f5b14..cfc74ca6d694a 100644 --- a/doc/src/sgml/ref/pg_dump.sgml +++ b/doc/src/sgml/ref/pg_dump.sgml @@ -170,11 +170,12 @@ PostgreSQL documentation - Output commands to clean (drop) + Output commands to DROP all the dumped database objects prior to outputting the commands for creating them. - (Unless is also specified, - restore might generate some harmless error messages, if any objects - were not present in the destination database.) + This option is useful when the restore is to overwrite an existing + database. If any of the objects do not exist in the destination + database, ignorable error messages will be reported during + restore, unless is also specified. @@ -781,6 +782,27 @@ PostgreSQL documentation + + + + + Do not dump any extensions matching pattern. The pattern is + interpreted according to the same rules as for . + can be given more than once to exclude extensions + matching any of several patterns. + + + + When both and are given, the behavior + is to dump just the extensions that match at least one + switch but no switches. If + appears without , then extensions matching are + excluded from what is otherwise a normal dump. + + + + @@ -835,13 +857,123 @@ PostgreSQL documentation + + + + + Specify a filename from which to read patterns for objects to include + or exclude from the dump. The patterns are interpreted according to the + same rules as the corresponding options: + /, + , + /, and + for tables, + / and + / for schemas, + for data on foreign servers, + and + for table data, and + / and + for extensions. + To read from STDIN, use - as the + filename. The option can be specified in + conjunction with the above listed options for including or excluding + objects, and can also be specified more than once for multiple filter + files. + + + + The file lists one object pattern per row, with the following format: + +{ include | exclude } { extension | foreign_data | table | table_and_children | table_data | table_data_and_children | schema } PATTERN + + + + + The first keyword specifies whether the objects matched by the pattern + are to be included or excluded. The second keyword specifies the type + of object to be filtered using the pattern: + + + + extension: extensions. This works like the + / or + option. + + + + + foreign_data: data on foreign servers. This works like + the option. This keyword can + only be used with the include keyword. + + + + + table: tables. This works like the + / or + / option. + + + + + table_and_children: tables including any partitions + or inheritance child tables. This works like the + or + option. + + + + + table_data: table data of any tables matching + pattern. This works like the + option. This keyword can only + be used with the exclude keyword. + + + + + table_data_and_children: table data of any tables + matching pattern as well as any partitions + or inheritance children of the table(s). This works like the + option. This + keyword can only be used with the exclude keyword. + + + + + schema: schemas. This works like the + / or + / option. + + + + + + + Lines starting with # are considered comments and + ignored. Comments can be placed after an object pattern row as well. + Blank lines are also ignored. See + for how to perform quoting in patterns. + + + + Example files are listed below in the + section. + + + + + - Use conditional commands (i.e., add an IF EXISTS - clause) when cleaning database objects. This option is not valid - unless is also specified. + Use DROP ... IF EXISTS commands to drop objects + in mode. This suppresses does not + exist errors that might otherwise be reported. This + option is not valid unless is also + specified. @@ -865,6 +997,14 @@ PostgreSQL documentation The only exception is that an empty pattern is disallowed. + + + Using wildcards in may result + in access to unexpected foreign servers. Also, to use this option securely, + make sure that the named server must have a trusted owner. + + + When is specified, @@ -1165,13 +1305,15 @@ PostgreSQL documentation schema (/) and table (/) pattern match at least one extension/schema/table in the database to be dumped. + This also applies to filters used with . Note that if none of the extension/schema/table patterns find matches, pg_dump will generate an error even without . This option has no effect - on /, + on , + /, /, or . An exclude pattern failing to match any objects is not considered an error. @@ -1179,6 +1321,28 @@ PostgreSQL documentation + + + + + When set to fsync, which is the default, + pg_dump --format=directory will recursively open and + synchronize all files in the archive directory. + + + On Linux, syncfs may be used instead to ask the + operating system to synchronize the whole file system that contains the + archive directory. See + for information about the caveats to be aware of when using + syncfs. + + + This option has no effect when is used or + is not set to directory. + + + + @@ -1464,10 +1628,18 @@ CREATE DATABASE foo WITH TEMPLATE template0; truncate the target tables before initiating a new full table copy. If users intend to copy initial data during refresh they must create the slot with two_phase = false. After the initial sync, the - two_phase + two_phase option will be automatically enabled by the subscriber if the subscription had been originally created with two_phase = true option. + + + It is generally recommended to use the + () option when restoring a database from a + plain-text pg_dump script to ensure a clean + restore process and prevent potential conflicts with + non-default psql configurations. + @@ -1485,7 +1657,7 @@ CREATE DATABASE foo WITH TEMPLATE template0; newdb: -$ psql -d newdb -f db.sql +$ psql -X -d newdb -f db.sql @@ -1587,6 +1759,19 @@ CREATE DATABASE foo WITH TEMPLATE template0; $ pg_dump -t "\"MixedCaseName\"" mydb > mytab.sql + + + + To dump all tables whose names start with mytable, except + for table mytable2, specify a filter file + filter.txt like: + +include table mytable* +exclude table mytable2 + + + +$ pg_dump --filter=filter.txt mydb > db.sql diff --git a/doc/src/sgml/ref/pg_dumpall.sgml b/doc/src/sgml/ref/pg_dumpall.sgml index e219a79858e80..9624144c1f4a2 100644 --- a/doc/src/sgml/ref/pg_dumpall.sgml +++ b/doc/src/sgml/ref/pg_dumpall.sgml @@ -91,9 +91,12 @@ PostgreSQL documentation - Include SQL commands to clean (drop) databases before - recreating them. DROP commands for roles and - tablespaces are added as well. + Emit SQL commands to DROP all the dumped + databases, roles, and tablespaces before recreating them. + This option is useful when the restore is to overwrite an existing + cluster. If any of the objects do not exist in the destination + cluster, ignorable error messages will be reported during + restore, unless is also specified. @@ -122,6 +125,37 @@ PostgreSQL documentation + + + + + Specify a filename from which to read patterns for databases excluded + from the dump. The patterns are interpreted according to the same rules + as . + To read from STDIN, use - as the + filename. The option can be specified in + conjunction with for excluding + databases, and can also be specified more than once for multiple filter + files. + + + + The file lists one database pattern per row, with the following format: + +exclude database PATTERN + + + + + Lines starting with # are considered comments and + ignored. Comments can be placed after an object pattern row as well. + Blank lines are also ignored. See + for how to perform quoting in patterns. + + + + + @@ -324,9 +358,11 @@ PostgreSQL documentation - Use conditional commands (i.e., add an IF EXISTS - clause) to drop databases and other objects. This option is not valid - unless is also specified. + Use DROP ... IF EXISTS commands to drop objects + in mode. This suppresses does not + exist errors that might otherwise be reported. This + option is not valid unless is also + specified. @@ -781,6 +817,17 @@ PostgreSQL documentation database creation will fail for databases in non-default locations. + + + It is generally recommended to use the + () option when restoring a database from a + pg_dumpall script to ensure a clean restore + process and prevent potential conflicts with non-default + psql configurations. Additionally, because + the pg_dumpall script may + include psql meta-commands, it may be + incompatible with clients other than psql. + @@ -797,9 +844,9 @@ PostgreSQL documentation To restore database(s) from this file, you can use: -$ psql -f db.out postgres +$ psql -X -f db.out -d postgres - It is not important to which database you connect here since the + It is not important which database you connect to here since the script file created by pg_dumpall will contain the appropriate commands to create and connect to the saved databases. An exception is that if you specified , diff --git a/doc/src/sgml/ref/pg_receivewal.sgml b/doc/src/sgml/ref/pg_receivewal.sgml index cecc7daec976b..9e353a068e5a3 100644 --- a/doc/src/sgml/ref/pg_receivewal.sgml +++ b/doc/src/sgml/ref/pg_receivewal.sgml @@ -281,7 +281,8 @@ PostgreSQL documentation A compression detail string can optionally be specified. If the detail string is an integer, it specifies the compression level. Otherwise, it should be a comma-separated list of items, each of the - form keyword or keyword=value. + form keyword or + keyword=value. Currently, the only supported keyword is level. @@ -314,10 +315,16 @@ PostgreSQL documentation will override any conflicting command line options. - The option is called --dbname for consistency with other + This option is called --dbname for consistency with other client applications, but because pg_receivewal - doesn't connect to any particular database in the cluster, database - name in the connection string will be ignored. + doesn't connect to any particular database in the cluster, any database + name included in the connection string will be ignored by the server. + However, a database name supplied that way overrides the default + database name (replication) for purposes of + looking up the replication connection's password + in ~/.pgpass. Similarly, middleware or proxies + used in connecting to PostgreSQL might + utilize the name for purposes such as connection routing. diff --git a/doc/src/sgml/ref/pg_recvlogical.sgml b/doc/src/sgml/ref/pg_recvlogical.sgml index 648d3f0f62c18..95eb14b6352e2 100644 --- a/doc/src/sgml/ref/pg_recvlogical.sgml +++ b/doc/src/sgml/ref/pg_recvlogical.sgml @@ -274,7 +274,7 @@ PostgreSQL documentation Enables decoding of prepared transactions. This option may only be specified with - + . diff --git a/doc/src/sgml/ref/pg_resetwal.sgml b/doc/src/sgml/ref/pg_resetwal.sgml index fd539f560433d..cf9c7e70f2712 100644 --- a/doc/src/sgml/ref/pg_resetwal.sgml +++ b/doc/src/sgml/ref/pg_resetwal.sgml @@ -52,21 +52,33 @@ PostgreSQL documentation - After running this command, it should be possible to start the server, + Some options, such as (see below), can also + be used to modify certain global settings of a database cluster without the + need to rerun initdb. This can be done safely on an + otherwise sound database cluster, if none of the dangerous modes mentioned + below are used. + + + + If pg_resetwal is used on a data directory where the + server has been cleanly shut down and the control file is sound, then it + will have no effect on the contents of the database system, except that no + longer used WAL files are cleared away. Any other use is potentially + dangerous and must be done with great care. pg_resetwal + will require the (force) option to be specified before + working on a data directory in an unclean shutdown state or with a + corrupted control file. + + + + After running this command on a data directory with corrupted WAL or a + corrupted control file, it should be possible to start the server, but bear in mind that the database might contain inconsistent data due to partially-committed transactions. You should immediately dump your data, run initdb, and restore. After restore, check for inconsistencies and repair as needed. - - This utility can only be run by the user who installed the server, because - it requires read/write access to the data directory. - For safety reasons, you must specify the data directory on the command line. - pg_resetwal does not use the environment variable - PGDATA. - - If pg_resetwal complains that it cannot determine valid data for pg_control, you can force it to proceed anyway @@ -82,19 +94,41 @@ PostgreSQL documentation execute any data-modifying operations in the database before you dump, as any such action is likely to make the corruption worse. + + + This utility can only be run by the user who installed the server, because + it requires read/write access to the data directory. + Options + + datadir + + + + + Specifies the location of the database directory. + For safety reasons, you must specify the data directory on the command + line. pg_resetwal does not use the environment + variable PGDATA. + + + + - Force pg_resetwal to proceed even if it cannot determine - valid data for pg_control, as explained above. + Force pg_resetwal to proceed even in situations where + it could be dangerous, as explained above. Specifically, this option is + required to proceed if the server had not been cleanly shut down or if + pg_resetwal cannot determine valid data for + pg_control. @@ -132,7 +166,8 @@ PostgreSQL documentation pg_resetwal is unable to determine appropriate values by reading pg_control. Safe values can be determined as described below. For values that take numeric arguments, hexadecimal - values can be specified by using the prefix 0x. + values can be specified by using the prefix 0x. Note + that these instructions only apply with the standard block size of 8 kB. @@ -155,6 +190,7 @@ PostgreSQL documentation greatest file name in the same directory. The file names are in hexadecimal. + @@ -238,6 +274,7 @@ PostgreSQL documentation names are in hexadecimal, so the easiest way to do this is to specify the option value in hexadecimal and append four zeroes. + @@ -272,6 +309,7 @@ PostgreSQL documentation The file names are in hexadecimal. There is no simple recipe such as the ones for other options of appending zeroes. + @@ -284,6 +322,12 @@ PostgreSQL documentation linkend="app-initdb"/> for more information. + + This option can also be used to change the WAL segment size of an + existing database cluster, avoiding the need to + re-initdb. + + While pg_resetwal will set the WAL starting address @@ -314,6 +358,7 @@ PostgreSQL documentation in pg_xact, -u 0x700000 will work (five trailing zeroes provide the proper multiplier). + @@ -335,6 +380,7 @@ PostgreSQL documentation in pg_xact, -x 0x1200000 will work (five trailing zeroes provide the proper multiplier). + diff --git a/doc/src/sgml/ref/pg_restore.sgml b/doc/src/sgml/ref/pg_restore.sgml index 47bd7dbda0614..0f23067d78489 100644 --- a/doc/src/sgml/ref/pg_restore.sgml +++ b/doc/src/sgml/ref/pg_restore.sgml @@ -111,10 +111,12 @@ PostgreSQL documentation - Clean (drop) database objects before recreating them. - (Unless is used, - this might generate some harmless error messages, if any objects - were not present in the destination database.) + Before restoring database objects, issue commands + to DROP all the objects that will be restored. + This option is useful for overwriting an existing database. + If any of the objects do not exist in the destination database, + ignorable error messages will be reported, + unless is also specified. @@ -188,6 +190,86 @@ PostgreSQL documentation + + + + + Specify a filename from which to read patterns for objects excluded + or included from restore. The patterns are interpreted according to the + same rules as + / for including objects in schemas, + / for excluding objects in schemas, + / for restoring named functions, + / for restoring named indexes, + / for restoring named tables + or / for restoring triggers. + To read from STDIN, use - as the + filename. The option can be specified in + conjunction with the above listed options for including or excluding + objects, and can also be specified more than once for multiple filter + files. + + + + The file lists one database pattern per row, with the following format: + +{ include | exclude } { function | index | schema | table | trigger } PATTERN + + + + + The first keyword specifies whether the objects matched by the pattern + are to be included or excluded. The second keyword specifies the type + of object to be filtered using the pattern: + + + + function: functions, works like the + / option. This keyword + can only be used with the include keyword. + + + + + index: indexes, works like the + / option. This keyword + can only be used with the include keyword. + + + + + schema: schemas, works like the + / and + / options. + + + + + table: tables, works like the + / option. This keyword + can only be used with the include keyword. + + + + + trigger: triggers, works like the + / option. This keyword + can only be used with the include keyword. + + + + + + + Lines starting with # are considered comments and + ignored. Comments can be placed after an object pattern row as well. + Blank lines are also ignored. See + for how to perform quoting in patterns. + + + + + @@ -580,9 +662,11 @@ PostgreSQL documentation - Use conditional commands (i.e., add an IF EXISTS - clause) to drop database objects. This option is not valid - unless is also specified. + Use DROP ... IF EXISTS commands to drop objects + in mode. This suppresses does not + exist errors that might otherwise be reported. This + option is not valid unless is also + specified. @@ -655,7 +739,7 @@ PostgreSQL documentation Do not output commands to select table access methods. With this option, all objects will be created with whichever - access method is the default during restore. + table access method is the default during restore. @@ -702,6 +786,30 @@ PostgreSQL documentation + + + + + Execute the restore as a series of transactions, each processing + up to N database + objects. This option implies . + + + offers an intermediate choice + between the default behavior (one transaction per SQL command) + and / + (one transaction for all restored objects). + While has the least + overhead, it may be impractical for large databases because the + transaction will take a lock on each restored object, possibly + exhausting the server's lock table space. + Using with a size of a few + thousand objects offers nearly the same performance benefits while + capping the amount of lock table space needed. + + + + diff --git a/doc/src/sgml/ref/pg_rewind.sgml b/doc/src/sgml/ref/pg_rewind.sgml index 15cddd086b756..dc039d875665a 100644 --- a/doc/src/sgml/ref/pg_rewind.sgml +++ b/doc/src/sgml/ref/pg_rewind.sgml @@ -284,6 +284,28 @@ PostgreSQL documentation + + + + + When set to fsync, which is the default, + pg_rewind will recursively open and synchronize all + files in the data directory. The search for files will follow symbolic + links for the WAL directory and each configured tablespace. + + + On Linux, syncfs may be used instead to ask the + operating system to synchronize the whole file systems that contain the + data directory, the WAL files, and each tablespace. See + for information about + the caveats to be aware of when using syncfs. + + + This option has no effect when is used. + + + + @@ -381,8 +403,9 @@ GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text, bigint, bigint, b backup_label, tablespace_map, pg_internal.init, - postmaster.opts, and - postmaster.pid, as well as any file or directory + postmaster.opts, + postmaster.pid and + .DS_Store as well as any file or directory beginning with pgsql_tmp, are omitted. diff --git a/doc/src/sgml/ref/pg_verifybackup.sgml b/doc/src/sgml/ref/pg_verifybackup.sgml index 36335e0a188fd..a3f167f9f6e01 100644 --- a/doc/src/sgml/ref/pg_verifybackup.sgml +++ b/doc/src/sgml/ref/pg_verifybackup.sgml @@ -53,9 +53,10 @@ PostgreSQL documentation Backup verification proceeds in four stages. First, pg_verifybackup reads the backup_manifest file. If that file - does not exist, cannot be read, is malformed, or fails verification - against its own internal checksum, pg_verifybackup - will terminate with a fatal error. + does not exist, cannot be read, is malformed, fails to match the system + identifier with pg_control of the backup directory or + fails verification against its own internal checksum, + pg_verifybackup will terminate with a fatal error. diff --git a/doc/src/sgml/ref/pg_waldump.sgml b/doc/src/sgml/ref/pg_waldump.sgml index 4592d6016a551..ce23add5577ed 100644 --- a/doc/src/sgml/ref/pg_waldump.sgml +++ b/doc/src/sgml/ref/pg_waldump.sgml @@ -117,7 +117,7 @@ PostgreSQL documentation - If provided, only display records that modify blocks in the given fork. + Only display records that modify blocks in the given fork. The valid values are main for the main fork, fsm for the free space map, vm for the visibility map, @@ -174,12 +174,13 @@ PostgreSQL documentation names, and exit. - Extensions may define custom resource managers, but pg_waldump does + Extensions may define custom resource managers, but + pg_waldump does not load the extension module and therefore does not recognize custom resource managers by name. Instead, you can specify the custom resource managers as custom### where - "###" is the three-digit resource manager ID. Names - of this form will always be considered valid. + ### is the three-digit resource manager ID. + Names of this form will always be considered valid. @@ -283,7 +284,7 @@ PostgreSQL documentation The full page images are saved with the following file name format: - TIMELINE-LSN.RELTABLESPACE.DATOID.RELNODE.BLKNOFORK + TIMELINE-LSN.RELTABLESPACE.DATOID.RELNODE.BLKNO_FORK The file names are composed of the following parts: @@ -334,8 +335,8 @@ PostgreSQL documentation FORK The name of the fork the full page image came from, such as - _main, _fsm, - _vm, or _init. + main, fsm, + vm, or init. diff --git a/doc/src/sgml/ref/pg_walsummary.sgml b/doc/src/sgml/ref/pg_walsummary.sgml new file mode 100644 index 0000000000000..57b2d24650cf1 --- /dev/null +++ b/doc/src/sgml/ref/pg_walsummary.sgml @@ -0,0 +1,132 @@ + + + + + pg_walsummary + + + + pg_walsummary + 1 + Application + + + + pg_walsummary + print contents of WAL summary files + + + + + pg_walsummary + option + file + + + + + Description + + pg_walsummary is used to print the contents of + WAL summary files. These binary files are found with the + pg_wal/summaries subdirectory of the data directory, + and can be converted to text using this tool. This is not ordinarily + necessary, since WAL summary files primarily exist to support + incremental backup, + but it may be useful for debugging purposes. + + + + A WAL summary file is indexed by tablespace OID, relation OID, and relation + fork. For each relation fork, it stores the list of blocks that were + modified by WAL within the range summarized in the file. It can also + store a "limit block," which is 0 if the relation fork was created or + truncated within the relevant WAL range, and otherwise the shortest length + to which the relation fork was truncated. If the relation fork was not + created, deleted, or truncated within the relevant WAL range, the limit + block is undefined or infinite and will not be printed by this tool. + + + + + Options + + + + + + + + + By default, pg_walsummary prints one line of output + for each range of one or more consecutive modified blocks. This can + make the output a lot briefer, since a relation where all blocks from + 0 through 999 were modified will produce only one line of output rather + than 1000 separate lines. This option requests a separate line of + output for every modified block. + + + + + + + + + + Do not print any output, except for errors. This can be useful + when you want to know whether a WAL summary file can be successfully + parsed but don't care about the contents. + + + + + + + + + + Display version information, then exit. + + + + + + + + + + Shows help about pg_walsummary command line + arguments, and exits. + + + + + + + + + + + Environment + + + The environment variable PG_COLOR specifies whether to use + color in diagnostic messages. Possible values are + always, auto and + never. + + + + + See Also + + + + + + + + diff --git a/doc/src/sgml/ref/pgarchivecleanup.sgml b/doc/src/sgml/ref/pgarchivecleanup.sgml index 635e7c7685473..cd8f49b1c5bd7 100644 --- a/doc/src/sgml/ref/pgarchivecleanup.sgml +++ b/doc/src/sgml/ref/pgarchivecleanup.sgml @@ -93,8 +93,21 @@ pg_archivecleanup: removing file "archive/00000001000000370000000E" + + + + + + Remove backup history files as well. + See for details about backup + history files. + + + + + Print lots of debug logging output on stderr. @@ -104,6 +117,7 @@ pg_archivecleanup: removing file "archive/00000001000000370000000E" + Print the names of the files that would have been removed on stdout (performs a dry run). @@ -122,7 +136,8 @@ pg_archivecleanup: removing file "archive/00000001000000370000000E" - extension + + Provide an extension diff --git a/doc/src/sgml/ref/pgbench.sgml b/doc/src/sgml/ref/pgbench.sgml index 850028557d384..920204a7c8668 100644 --- a/doc/src/sgml/ref/pgbench.sgml +++ b/doc/src/sgml/ref/pgbench.sgml @@ -162,7 +162,8 @@ pgbench options d - dbname + + Specifies the name of the database to test in. If this is @@ -229,12 +230,14 @@ pgbench options d data is generated in pgbench client and then sent to the server. This uses the client/server bandwidth extensively through a COPY. - pgbench uses the FREEZE option with version 14 or later + pgbench uses the option + with version 14 or later of PostgreSQL to speed up - subsequent VACUUM, unless partitions are enabled. - Using g causes logging to print one message - every 100,000 rows while generating data for the - pgbench_accounts table. + subsequent VACUUM, except on the + pgbench_accounts table if partitions are + enabled. Using g causes logging to + print one message every 100,000 rows while generating data for all + tables. With G (server-side data generation), @@ -460,16 +463,6 @@ pgbench options d - - - - - - Print debugging output. - - - - varname=value varname=value @@ -767,6 +760,24 @@ pgbench options d + + + + + Exit immediately when any client is aborted due to some error. Without + this option, even when a client is aborted, other clients could + continue their run as specified by + or option, and pgbench + will print an incomplete results in this case. + + + Note that serialization failures or deadlock failures do not abort the + client, so they are not affected by this option. + See for more information. + + + + @@ -898,7 +909,7 @@ pgbench options d Print messages about all errors and failures (errors without retrying) including which limit for retries was exceeded and how far it was exceeded for the serialization/deadlock failures. (Note that in this - case the output can be significantly increased.). + case the output can be significantly increased.) See for more information. @@ -914,9 +925,17 @@ pgbench options d pgbench also accepts the following common command-line - arguments for connection parameters: + arguments for connection parameters and other common settings: + + + + + Print debugging output. + + + hostname @@ -984,7 +1003,8 @@ pgbench options d benchmark such as initial connection failures also exit with status 1. Errors during the run such as database errors or problems in the script will result in exit status 2. In the latter case, - pgbench will print partial results. + pgbench will print partial results if + option is not specified. @@ -1098,7 +1118,8 @@ pgbench options d each SQL command on a single line ending with a semicolon. - It is assumed that pgbench scripts do not contain incomplete blocks of SQL + It is assumed that pgbench scripts do not contain + incomplete blocks of SQL transactions. If at runtime the client reaches the end of the script without completing the last transaction block, it will be aborted. @@ -1364,13 +1385,19 @@ SELECT 4 AS four \; SELECT 5 AS five \aset \startpipeline + \syncpipeline \endpipeline - These commands delimit the start and end of a pipeline of SQL - statements. In pipeline mode, statements are sent to the server - without waiting for the results of previous statements. See + This group of commands implements pipelining of SQL statements. + A pipeline must begin with a \startpipeline + and end with an \endpipeline. In between there + may be any number of \syncpipeline commands, + which sends a sync message + without ending the ongoing pipeline and flushing the send buffer. + In pipeline mode, statements are sent to the server without waiting + for the results of previous statements. See for more details. Pipeline mode requires the use of extended query protocol. @@ -2616,7 +2643,7 @@ END; - Here is some example output generated with these options: + Here is some example output generated with this option: pgbench --aggregate-interval=10 --time=20 --client=10 --log --rate=1000 --latency-limit=10 --failures-detailed --max-tries=10 test @@ -2800,14 +2827,17 @@ statement latencies in milliseconds, failures and retries: start a connection to the database server / the socket for connecting the client to the database server has become invalid). In such cases all clients of this thread stop while other threads continue to work. + However, is specified, all of the + threads stop immediately in this case. Direct client errors. They lead to immediate exit from pgbench with the corresponding error message - only in the case of an internal pgbench - error (which are supposed to never occur...). Otherwise in the worst + in the case of an internal pgbench + error (which are supposed to never occur...) or when + is specified. Otherwise in the worst case they only lead to the abortion of the failed client while other clients continue their run (but some client errors are handled without an abortion of the client and reported separately, see below). Later in diff --git a/doc/src/sgml/ref/pgupgrade.sgml b/doc/src/sgml/ref/pgupgrade.sgml index 7816b4c6859bf..9877f2f01c691 100644 --- a/doc/src/sgml/ref/pgupgrade.sgml +++ b/doc/src/sgml/ref/pgupgrade.sgml @@ -40,9 +40,9 @@ PostgreSQL documentation pg_upgrade (formerly called pg_migrator) allows data stored in PostgreSQL data files to be upgraded to a later PostgreSQL major version without the data dump/restore typically required for - major version upgrades, e.g., from 9.5.8 to 9.6.4 or from 10.7 to 11.2. - It is not required for minor version upgrades, e.g., from 9.6.2 to 9.6.3 - or from 10.1 to 10.2. + major version upgrades, e.g., from 12.14 to 13.10 or from 14.9 to 15.5. + It is not required for minor version upgrades, e.g., from 12.7 to 12.8 + or from 14.1 to 14.5. @@ -240,6 +240,42 @@ PostgreSQL documentation + + + + + Use the copy_file_range system call for efficient + copying. On some file systems this gives results similar to + , sharing physical disk blocks, while on others + it may still copy blocks, but do so via an optimized path. At present, + it is supported on Linux and FreeBSD. + + + + + + method + + + When set to fsync, which is the default, + pg_upgrade will recursively open and synchronize all + files in the upgraded cluster's data directory. The search for files + will follow symbolic links for the WAL directory and each configured + tablespace. + + + On Linux, syncfs may be used instead to ask the + operating system to synchronize the whole file systems that contain the + upgraded cluster's data directory, its WAL files, and each tablespace. + See for information + about the caveats to be aware of when using syncfs. + + + This option has no effect when is used. + + + + @@ -360,6 +396,129 @@ make prefix=/usr/local/pgsql.new install + + Prepare for publisher upgrades + + + pg_upgrade attempts to migrate logical + slots. This helps avoid the need for manually defining the same + logical slots on the new publisher. Migration of logical slots is + only supported when the old cluster is version 17.0 or later. + Logical slots on clusters before version 17.0 will silently be + ignored. + + + + Before you start upgrading the publisher cluster, ensure that the + subscription is temporarily disabled, by executing + ALTER SUBSCRIPTION ... DISABLE. + Re-enable the subscription after the upgrade. + + + + There are some prerequisites for pg_upgrade to + be able to upgrade the logical slots. If these are not met an error + will be reported. + + + + + + The new cluster must have + wal_level as + logical. + + + + + The new cluster must have + max_replication_slots + configured to a value greater than or equal to the number of slots + present in the old cluster. + + + + + The output plugins referenced by the slots on the old cluster must be + installed in the new PostgreSQL executable directory. + + + + + The old cluster has replicated all the transactions and logical decoding + messages to subscribers. + + + + + All slots on the old cluster must be usable, i.e., there are no slots + whose + pg_replication_slots.conflicting + is not true. + + + + + The new cluster must not have permanent logical slots, i.e., + there must be no slots where + pg_replication_slots.temporary + is false. + + + + + + + + Prepare for subscriber upgrades + + + Setup the + subscriber configurations in the new subscriber. + pg_upgrade attempts to migrate subscription + dependencies which includes the subscription's table information present in + pg_subscription_rel + system catalog and also the subscription's replication origin. This allows + logical replication on the new subscriber to continue from where the + old subscriber was up to. Migration of subscription dependencies is only + supported when the old cluster is version 17.0 or later. Subscription + dependencies on clusters before version 17.0 will silently be ignored. + + + + There are some prerequisites for pg_upgrade to + be able to upgrade the subscriptions. If these are not met an error + will be reported. + + + + + + All the subscription tables in the old subscriber should be in state + i (initialize) or r (ready). This + can be verified by checking pg_subscription_rel.srsubstate. + + + + + The replication origin entry corresponding to each of the subscriptions + should exist in the old cluster. This can be found by checking + pg_subscription and + pg_replication_origin + system tables. + + + + + The new cluster must have + max_replication_slots + configured to a value greater than or equal to the number of + subscriptions present in the old cluster. + + + + + Stop both servers @@ -367,21 +526,21 @@ make prefix=/usr/local/pgsql.new install Make sure both database servers are stopped using, on Unix, e.g.: -pg_ctl -D /opt/PostgreSQL/9.6 stop +pg_ctl -D /opt/PostgreSQL/12 stop pg_ctl -D /opt/PostgreSQL/&majorversion; stop or on Windows, using the proper service names: -NET STOP postgresql-9.6 +NET STOP postgresql-12 NET STOP postgresql-&majorversion; - Streaming replication and log-shipping standby servers can - remain running until a later step. + Streaming replication and log-shipping standby servers must be + running during this shutdown so they receive all changes. @@ -394,8 +553,6 @@ NET STOP postgresql-&majorversion; servers are caught up by running pg_controldata against the old primary and standby clusters. Verify that the Latest checkpoint location values match in all clusters. - (There will be a mismatch if old standby servers were shut down - before the old primary or if the old standby servers are still running.) Also, make sure wal_level is not set to minimal in the postgresql.conf file on the new primary cluster. @@ -438,21 +595,15 @@ NET STOP postgresql-&majorversion; - For Windows users, you must be logged into an administrative account, and - then start a shell as the postgres user and set the proper path: - - -RUNAS /USER:postgres "CMD.EXE" -SET PATH=%PATH%;C:\Program Files\PostgreSQL\&majorversion;\bin; - - - and then run pg_upgrade with quoted directories, e.g.: + For Windows users, you must be logged into an administrative account, + and then run pg_upgrade with quoted + directories, e.g.: pg_upgrade.exe - --old-datadir "C:/Program Files/PostgreSQL/9.6/data" + --old-datadir "C:/Program Files/PostgreSQL/12/data" --new-datadir "C:/Program Files/PostgreSQL/&majorversion;/data" - --old-bindir "C:/Program Files/PostgreSQL/9.6/bin" + --old-bindir "C:/Program Files/PostgreSQL/12/bin" --new-bindir "C:/Program Files/PostgreSQL/&majorversion;/bin" @@ -582,8 +733,8 @@ rsync --archive --delete --hard-links --size-only --no-inc-recursive old_cluster remote directory, e.g., -rsync --archive --delete --hard-links --size-only --no-inc-recursive /opt/PostgreSQL/9.5 \ - /opt/PostgreSQL/9.6 standby.example.com:/opt/PostgreSQL +rsync --archive --delete --hard-links --size-only --no-inc-recursive /opt/PostgreSQL/12 \ + /opt/PostgreSQL/&majorversion; standby.example.com:/opt/PostgreSQL You can verify what the command will do using @@ -612,8 +763,8 @@ rsync --archive --delete --hard-links --size-only --no-inc-recursive /opt/Postgr rsync command for each tablespace directory, e.g.: -rsync --archive --delete --hard-links --size-only --no-inc-recursive /vol1/pg_tblsp/PG_9.5_201510051 \ - /vol1/pg_tblsp/PG_9.6_201608131 standby.example.com:/vol1/pg_tblsp +rsync --archive --delete --hard-links --size-only --no-inc-recursive /vol1/pg_tblsp/PG_12_201909212 \ + /vol1/pg_tblsp/PG_&majorversion;_202307071 standby.example.com:/vol1/pg_tblsp If you have relocated pg_wal outside the data @@ -629,8 +780,12 @@ rsync --archive --delete --hard-links --size-only --no-inc-recursive /vol1/pg_tb Configure the servers for log shipping. (You do not need to run pg_backup_start() and pg_backup_stop() or take a file system backup as the standbys are still synchronized - with the primary.) Replication slots are not copied and must - be recreated. + with the primary.) If the old primary is prior to version 17.0, then no + slots on the primary are copied to the new standby, so all the slots on + the old standby must be recreated manually. If the old primary is + version 17.0 or later, then only logical slots on the primary are copied + to the new standby, but other slots on the old standby are not copied, + so must be recreated manually. @@ -695,6 +850,17 @@ psql --username=postgres --file=script.sql postgres of the upgrade. You might need to set connection parameters to match your new cluster. + + + Using vacuumdb --all --analyze-only can efficiently + generate such statistics, and the use of + can speed it up. Option + can be used to generate minimal statistics quickly. + If vacuum_cost_delay is set to a non-zero + value, this can be overridden to speed up statistics generation + using PGOPTIONS, e.g., PGOPTIONS='-c + vacuum_cost_delay=0' vacuumdb .... + @@ -773,6 +939,104 @@ psql --username=postgres --file=script.sql postgres + + Environment + + + Some environment variables can be used to provide defaults for command-line options: + + + + PGBINOLD + + + + The old PostgreSQL executable directory; option + /. + + + + + + PGBINNEW + + + + The new PostgreSQL executable directory; option + /. + + + + + + PGDATAOLD + + + + The old database cluster configuration directory; option + /. + + + + + + PGDATANEW + + + + The new database cluster configuration directory; option + /. + + + + + + PGPORTOLD + + + + The old cluster port number; option + /. + + + + + + PGPORTNEW + + + + The new cluster port number; option + /. + + + + + + PGSOCKETDIR + + + + Directory to use for postmaster sockets during upgrade; option + /. + + + + + + PGUSER + + + + Cluster's install user name; option + /. + + + + + + + Notes diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index 35aec6d3ce896..830306ea1e202 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -540,7 +540,7 @@ EOF - + @@ -1119,6 +1119,10 @@ INSERT INTO tbl1 VALUES ($1, $2) \bind 'first value' 'second value' \g destination, because all data must pass through the client/server connection. For large amounts of data the SQL command might be preferable. + Also, because of this pass-through method, \copy + ... from in CSV mode will erroneously + treat a \. data value alone on a line as an + end-of-input marker. @@ -1883,6 +1887,7 @@ INSERT INTO tbl1 VALUES ($1, $2) \bind 'first value' 'second value' \g + \drds [ role-pattern [ database-pattern ] ] @@ -1905,6 +1910,27 @@ INSERT INTO tbl1 VALUES ($1, $2) \bind 'first value' 'second value' \g + + + \drg[S] [ pattern ] + + + Lists information about each granted role membership, including + assigned options (ADMIN, + INHERIT and/or SET) and grantor. + See the GRANT + command for information about role memberships. + + + By default, only grants to user-created roles are shown; supply the + S modifier to include system roles. + If pattern is specified, + only grants to those roles whose names match the pattern are listed. + + + + + \dRp[+] [ pattern ] @@ -2957,7 +2983,7 @@ lo_import 152801 writes column values separated by commas, applying the quoting rules described in - RFC 4180. + RFC 4180. This output is compatible with the CSV format of the server's COPY command. A header line with column names is generated unless @@ -3544,13 +3570,14 @@ testdb=> \setenv LESS -imx4F - \watch [ i[nterval]=seconds ] [ c[ount]=times ] [ seconds ] + \watch [ i[nterval]=seconds ] [ c[ount]=times ] [ m[in_rows]=rows ] [ seconds ] Repeatedly execute the current query buffer (as \g does) until interrupted, or the query fails, or the execution count limit - (if given) is reached. Wait the specified number of - seconds (default 2) between executions. For backwards compatibility, + (if given) is reached, or the query no longer returns the minimum number + of rows. Wait the specified number of seconds (default 2) between executions. + For backwards compatibility, seconds can be specified with or without an interval= prefix. Each query result is @@ -5282,9 +5309,9 @@ This second example shows a multiplication table with rows sorted in reverse numerical order and columns with an independent, ascending numerical order. testdb=> SELECT t1.first as "A", t2.first+100 AS "B", t1.first*(t2.first+100) as "AxB", -testdb(> row_number() over(order by t2.first) AS ord -testdb(> FROM my_table t1 CROSS JOIN my_table t2 ORDER BY 1 DESC -testdb(> \crosstabview "A" "B" "AxB" ord +testdb-> row_number() over(order by t2.first) AS ord +testdb-> FROM my_table t1 CROSS JOIN my_table t2 ORDER BY 1 DESC +testdb-> \crosstabview "A" "B" "AxB" ord A | 101 | 102 | 103 | 104 ---+-----+-----+-----+----- 4 | 404 | 408 | 412 | 416 diff --git a/doc/src/sgml/ref/refresh_materialized_view.sgml b/doc/src/sgml/ref/refresh_materialized_view.sgml index 19737668cdb2a..8ed43ade803ec 100644 --- a/doc/src/sgml/ref/refresh_materialized_view.sgml +++ b/doc/src/sgml/ref/refresh_materialized_view.sgml @@ -68,7 +68,7 @@ REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] nameWHERE clause. - This option may not be used when the materialized view is not already + This option can only be used when the materialized view is already populated. @@ -99,6 +99,12 @@ REFRESH MATERIALIZED VIEW [ CONCURRENTLY ] nameREFRESH MATERIALIZED VIEW does not guarantee to preserve that ordering. + + + While REFRESH MATERIALIZED VIEW is running, the is temporarily changed to pg_catalog, + pg_temp. + diff --git a/doc/src/sgml/ref/reindex.sgml b/doc/src/sgml/ref/reindex.sgml index bef3486843cab..2942dccf1e2e1 100644 --- a/doc/src/sgml/ref/reindex.sgml +++ b/doc/src/sgml/ref/reindex.sgml @@ -291,6 +291,12 @@ REINDEX [ ( option [, ...] ) ] { DA into expensive sequential scans. + + While REINDEX is running, the is temporarily changed to pg_catalog, + pg_temp. + + Reindexing a single index or table requires having the MAINTAIN privilege on the diff --git a/doc/src/sgml/ref/reindexdb.sgml b/doc/src/sgml/ref/reindexdb.sgml index 8cb8bf4fa3924..abcb041179bb9 100644 --- a/doc/src/sgml/ref/reindexdb.sgml +++ b/doc/src/sgml/ref/reindexdb.sgml @@ -55,30 +55,22 @@ PostgreSQL documentation - dbname - - - - reindexdb - connection-option - option - - - - - - - - - reindexdb - connection-option - option + + + + + + + + - - - - - dbname + + + dbname + + + + @@ -187,8 +179,7 @@ PostgreSQL documentation setting is high enough to accommodate all connections. - Note that this option is incompatible with the - and options. + Note that this option is incompatible with the option. @@ -361,9 +352,8 @@ PostgreSQL documentation - Specifies the name of the database to connect to to discover which - databases should be reindexed, - when / is used. + When the / is used, connect + to this database to gather the list of databases to reindex. If not specified, the postgres database will be used, or if that does not exist, template1 will be used. This can be a connection @@ -432,20 +422,6 @@ PostgreSQL documentation - - - Notes - - - reindexdb might need to connect several - times to the PostgreSQL server, asking - for a password each time. It is convenient to have a - ~/.pgpass file in such cases. See for more information. - - - - Examples diff --git a/doc/src/sgml/ref/release_savepoint.sgml b/doc/src/sgml/ref/release_savepoint.sgml index e9fc6e5d1c845..6c616aaf999e7 100644 --- a/doc/src/sgml/ref/release_savepoint.sgml +++ b/doc/src/sgml/ref/release_savepoint.sgml @@ -116,8 +116,8 @@ BEGIN; now only choose one of these two commands, since all other commands will be ignored: - ROLLBACK; - ROLLBACK TO SAVEPOINT sp1; +ROLLBACK; +ROLLBACK TO SAVEPOINT sp1; Choosing ROLLBACK will abort everything, including value 1, whereas ROLLBACK TO SAVEPOINT sp1 will retain diff --git a/doc/src/sgml/ref/security_label.sgml b/doc/src/sgml/ref/security_label.sgml index 5f96b7e1ded8c..e5e5fb483e94e 100644 --- a/doc/src/sgml/ref/security_label.sgml +++ b/doc/src/sgml/ref/security_label.sgml @@ -29,7 +29,7 @@ SECURITY LABEL [ FOR provider ] ON DATABASE object_name | DOMAIN object_name | EVENT TRIGGER object_name | - FOREIGN TABLE object_name + FOREIGN TABLE object_name | FUNCTION function_name [ ( [ [ argmode ] [ argname ] argtype [, ...] ] ) ] | LARGE OBJECT large_object_oid | MATERIALIZED VIEW object_name | diff --git a/doc/src/sgml/ref/select.sgml b/doc/src/sgml/ref/select.sgml index 0ee0cc7e6416c..d7089eac0bee7 100644 --- a/doc/src/sgml/ref/select.sgml +++ b/doc/src/sgml/ref/select.sgml @@ -34,7 +34,7 @@ PostgreSQL documentation [ WITH [ RECURSIVE ] with_query [, ...] ] SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] - [ * | expression [ [ AS ] output_name ] [, ...] ] + [ { * | expression [ [ AS ] output_name ] } [, ...] ] [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ] @@ -45,7 +45,7 @@ SELECT [ ALL | DISTINCT [ ON ( expressioncount | ALL } ] [ OFFSET start [ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES } ] - [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF table_name [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ] + [ FOR { UPDATE | NO KEY UPDATE | SHARE | KEY SHARE } [ OF from_reference [, ...] ] [ NOWAIT | SKIP LOCKED ] [...] ] where from_item can be one of: @@ -74,7 +74,7 @@ SELECT [ ALL | DISTINCT [ ON ( expressionand with_query is: - with_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( select | values | insert | update | delete ) + with_query_name [ ( column_name [, ...] ) ] AS [ [ NOT ] MATERIALIZED ] ( select | values | insert | update | delete | merge ) [ SEARCH { BREADTH | DEPTH } FIRST BY column_name [, ...] SET search_seq_col_name ] [ CYCLE column_name [, ...] SET cycle_mark_col_name [ TO cycle_mark_value DEFAULT cycle_mark_default ] USING cycle_path_col_name ] @@ -131,6 +131,9 @@ TABLE [ ONLY ] table_name [ * ] eliminates groups that do not satisfy the given condition. (See and below.) + Although query output columns are nominally computed in the next + step, they can also be referenced (by name or ordinal number) + in the GROUP BY clause. @@ -227,10 +230,10 @@ TABLE [ ONLY ] table_name [ * ] The subqueries effectively act as temporary tables or views for the duration of the primary query. Each subquery can be a SELECT, TABLE, VALUES, - INSERT, UPDATE or - DELETE statement. + INSERT, UPDATE, + DELETE, or MERGE statement. When writing a data-modifying statement (INSERT, - UPDATE or DELETE) in + UPDATE, DELETE, or MERGE) in WITH, it is usual to include a RETURNING clause. It is the output of RETURNING, not the underlying table that the statement modifies, that forms the temporary table that is @@ -1574,7 +1577,7 @@ FETCH { FIRST | NEXT } [ count ] { The locking clause has the general form -FOR lock_strength [ OF table_name [, ...] ] [ NOWAIT | SKIP LOCKED ] +FOR lock_strength [ OF from_reference [, ...] ] [ NOWAIT | SKIP LOCKED ] where lock_strength can be one of @@ -1588,8 +1591,11 @@ KEY SHARE - For more information on each row-level lock mode, refer to - . + from_reference must be a + table alias or non-hidden + table_name referenced + in the FROM clause. For more information on each + row-level lock mode, refer to . @@ -1915,8 +1921,7 @@ WITH t AS ( ) SELECT * FROM t UNION ALL -SELECT * FROM t - +SELECT * FROM t; x -------------------- 0.534150459803641 @@ -2179,7 +2184,8 @@ SELECT 2+2; PostgreSQL allows INSERT, - UPDATE, and DELETE to be used as WITH + UPDATE, DELETE, and + MERGE to be used as WITH queries. This is not found in the SQL standard. diff --git a/doc/src/sgml/ref/select_into.sgml b/doc/src/sgml/ref/select_into.sgml index 82a77784b9976..ae7e6bed24f25 100644 --- a/doc/src/sgml/ref/select_into.sgml +++ b/doc/src/sgml/ref/select_into.sgml @@ -23,7 +23,7 @@ PostgreSQL documentation [ WITH [ RECURSIVE ] with_query [, ...] ] SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] - * | expression [ [ AS ] output_name ] [, ...] + [ { * | expression [ [ AS ] output_name ] } [, ...] ] INTO [ TEMPORARY | TEMP | UNLOGGED ] [ TABLE ] new_table [ FROM from_item [, ...] ] [ WHERE condition ] diff --git a/doc/src/sgml/ref/set.sgml b/doc/src/sgml/ref/set.sgml index 5459b29525969..f0e6047e0b117 100644 --- a/doc/src/sgml/ref/set.sgml +++ b/doc/src/sgml/ref/set.sgml @@ -200,7 +200,7 @@ SELECT setseed(value); - 'PST8PDT' + 'America/Los_Angeles' The time zone for Berkeley, California. @@ -298,7 +298,7 @@ SET datestyle TO postgres, dmy; Set the time zone for Berkeley, California: -SET TIME ZONE 'PST8PDT'; +SET TIME ZONE 'America/Los_Angeles'; diff --git a/doc/src/sgml/ref/set_role.sgml b/doc/src/sgml/ref/set_role.sgml index 13bad1bf66eee..9557bb77aba14 100644 --- a/doc/src/sgml/ref/set_role.sgml +++ b/doc/src/sgml/ref/set_role.sgml @@ -37,12 +37,17 @@ RESET ROLE written as either an identifier or a string literal. After SET ROLE, permissions checking for SQL commands is carried out as though the named role were the one that had logged - in originally. + in originally. Note that SET ROLE and + SET SESSION AUTHORIZATION are exceptions; permissions + checks for those continue to use the current session user and the initial + session user (the authenticated user), respectively. - The specified role_name - must be a role that the current session user is a member of. + The current session user must have the SET option for the + specified role_name, either + directly or indirectly via a chain of memberships with the + SET option. (If the session user is a superuser, any role can be selected.) @@ -86,11 +91,6 @@ RESET ROLE exercised either with or without SET ROLE. - - Note that when a superuser chooses to SET ROLE to a - non-superuser role, they lose their superuser privileges. - - SET ROLE has effects comparable to SET SESSION AUTHORIZATION, but the privilege diff --git a/doc/src/sgml/ref/set_session_auth.sgml b/doc/src/sgml/ref/set_session_auth.sgml index f8fcafc1946e8..94adab2468d90 100644 --- a/doc/src/sgml/ref/set_session_auth.sgml +++ b/doc/src/sgml/ref/set_session_auth.sgml @@ -51,7 +51,7 @@ RESET SESSION AUTHORIZATION The session user identifier can be changed only if the initial session - user (the authenticated user) had the + user (the authenticated user) has the superuser privilege. Otherwise, the command is accepted only if it specifies the authenticated user name. diff --git a/doc/src/sgml/ref/show.sgml b/doc/src/sgml/ref/show.sgml index b3747b119f9d2..5fbb5bbe013e3 100644 --- a/doc/src/sgml/ref/show.sgml +++ b/doc/src/sgml/ref/show.sgml @@ -77,30 +77,6 @@ SHOW ALL - - LC_COLLATE - - - Shows the database's locale setting for collation (text - ordering). At present, this parameter can be shown but not - set, because the setting is determined at database creation - time. - - - - - - LC_CTYPE - - - Shows the database's locale setting for character - classification. At present, this parameter can be shown but - not set, because the setting is determined at database creation - time. - - - - IS_SUPERUSER diff --git a/doc/src/sgml/ref/update.sgml b/doc/src/sgml/ref/update.sgml index 2ab24b0523ef2..1c433bec2bb8e 100644 --- a/doc/src/sgml/ref/update.sgml +++ b/doc/src/sgml/ref/update.sgml @@ -29,7 +29,7 @@ UPDATE [ ONLY ] table_name [ * ] [ } [, ...] [ FROM from_item [, ...] ] [ WHERE condition | WHERE CURRENT OF cursor_name ] - [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] + [ RETURNING { * | output_expression [ [ AS ] output_name ] } [, ...] ] @@ -441,7 +441,45 @@ COMMIT; c_films is currently positioned: UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films; - + + + + + Updates affecting many rows can have negative effects on system + performance, such as table bloat, increased replica lag, and increased + lock contention. In such situations it can make sense to perform the + operation in smaller batches, possibly with a VACUUM + operation on the table between batches. While there is + no LIMIT clause for UPDATE, it is + possible to get a similar effect through the use of + a Common Table Expression and a + self-join. With the standard PostgreSQL + table access method, a self-join on the system + column ctid is very + efficient: + +WITH exceeded_max_retries AS ( + SELECT w.ctid FROM work_item AS w + WHERE w.status = 'active' AND w.num_retries > 10 + ORDER BY w.retry_timestamp + FOR UPDATE + LIMIT 5000 +) +UPDATE work_item SET status = 'failed' + FROM exceeded_max_retries AS emr + WHERE work_item.ctid = emr.ctid; + + This command will need to be repeated until no rows remain to be updated. + Use of an ORDER BY clause allows the command to + prioritize which rows will be updated; it can also prevent deadlock + with other update operations if they use the same ordering. + If lock contention is a concern, then SKIP LOCKED + can be added to the CTE to prevent multiple commands + from updating the same row. However, then a + final UPDATE without SKIP LOCKED + or LIMIT will be needed to ensure that no matching + rows were overlooked. + diff --git a/doc/src/sgml/ref/vacuum.sgml b/doc/src/sgml/ref/vacuum.sgml index c42bbea9e228e..9857b35627b3e 100644 --- a/doc/src/sgml/ref/vacuum.sgml +++ b/doc/src/sgml/ref/vacuum.sgml @@ -22,7 +22,6 @@ PostgreSQL documentation VACUUM [ ( option [, ...] ) ] [ table_and_columns [, ...] ] -VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ] where option can be one of: @@ -39,7 +38,7 @@ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ integer SKIP_DATABASE_STATS [ boolean ] ONLY_DATABASE_STATS [ boolean ] - BUFFER_USAGE_LIMIT [ size ] + BUFFER_USAGE_LIMIT size and table_and_columns is: @@ -90,15 +89,6 @@ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ Specifies an amount of memory in kilobytes. Sizes may also be specified as a string containing the numerical size followed by any one of the - following memory units: kB (kilobytes), - MB (megabytes), GB (gigabytes), or - TB (terabytes). + following memory units: B (bytes), + kB (kilobytes), MB (megabytes), + GB (gigabytes), or TB (terabytes). @@ -451,6 +441,12 @@ VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ is temporarily changed to pg_catalog, + pg_temp. + + VACUUM cannot be executed inside a transaction block. @@ -523,6 +519,16 @@ VACUUM (VERBOSE, ANALYZE) onek; There is no VACUUM statement in the SQL standard. + + + The following syntax was used before PostgreSQL + version 9.0 and is still supported: + +VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ ANALYZE ] [ table_and_columns [, ...] ] + + Note that in this syntax, the options must be specified in exactly the order + shown. + diff --git a/doc/src/sgml/ref/vacuumdb.sgml b/doc/src/sgml/ref/vacuumdb.sgml index da2393783b7dc..80c04919a4bf3 100644 --- a/doc/src/sgml/ref/vacuumdb.sgml +++ b/doc/src/sgml/ref/vacuumdb.sgml @@ -36,7 +36,13 @@ PostgreSQL documentation - dbname + + + dbname + + + + @@ -47,40 +53,44 @@ PostgreSQL documentation - - - - - - - schema - - - - - - - - - - schema - - + + + schema - dbname + + + dbname + + + + vacuumdb connection-option option - - - - + + + + + + + + schema + + + + + + dbname + + + + @@ -534,9 +544,8 @@ PostgreSQL documentation - Specifies the name of the database to connect to to discover which - databases should be vacuumed, - when / is used. + When the / is used, connect + to this database to gather the list of databases to vacuum. If not specified, the postgres database will be used, or if that does not exist, template1 will be used. This can be a connection @@ -605,19 +614,6 @@ PostgreSQL documentation - - - Notes - - - vacuumdb might need to connect several - times to the PostgreSQL server, asking - for a password each time. It is convenient to have a - ~/.pgpass file in such cases. See for more information. - - - Examples diff --git a/doc/src/sgml/reference.sgml b/doc/src/sgml/reference.sgml index e11b4b6130753..ff85ace83fc48 100644 --- a/doc/src/sgml/reference.sgml +++ b/doc/src/sgml/reference.sgml @@ -250,6 +250,7 @@ &pgamcheck; &pgBasebackup; &pgbench; + &pgCombinebackup; &pgConfig; &pgDump; &pgDumpall; @@ -281,6 +282,7 @@ &pgarchivecleanup; &pgChecksums; &pgControldata; + &pgCreateSubscriber; &pgCtl; &pgResetwal; &pgRewind; @@ -288,6 +290,7 @@ &pgtesttiming; &pgupgrade; &pgwaldump; + &pgwalsummary; &postgres; diff --git a/doc/src/sgml/regress.sgml b/doc/src/sgml/regress.sgml index 88a43b8961b5e..f4cef9e80f746 100644 --- a/doc/src/sgml/regress.sgml +++ b/doc/src/sgml/regress.sgml @@ -196,8 +196,9 @@ make check-world -j8 >/dev/null - Regression tests for the ECPG interface library, - located in src/interfaces/ecpg/test. + Regression tests for the interface libraries, + located in src/interfaces/libpq/test and + src/interfaces/ecpg/test. @@ -252,13 +253,13 @@ make check-world -j8 >/dev/null Some test suites are not run by default, either because they are not secure - to run on a multiuser system or because they require special software. You - can decide which test suites to run additionally by setting the - make or environment variable - PG_TEST_EXTRA to a whitespace-separated list, for - example: + to run on a multiuser system, because they require special software or + because they are resource intensive. You can decide which test suites to + run additionally by setting the make or environment + variable PG_TEST_EXTRA to a whitespace-separated list, + for example: -make check-world PG_TEST_EXTRA='kerberos ldap ssl load_balance' +make check-world PG_TEST_EXTRA='kerberos ldap ssl load_balance libpq_encryption' The following values are currently supported: @@ -303,6 +304,18 @@ make check-world PG_TEST_EXTRA='kerberos ldap ssl load_balance' + + libpq_encryption + + + Runs the test src/interfaces/libpq/t/005_negotiate_encryption.pl. + This opens TCP/IP listen sockets. If PG_TEST_EXTRA + also includes kerberos, additional tests that require + an MIT Kerberos installation are enabled. + + + + wal_consistency_checking @@ -313,6 +326,16 @@ make check-world PG_TEST_EXTRA='kerberos ldap ssl load_balance' + + + xid_wraparound + + + Runs the test suite under src/test/modules/xid_wraparound. + Not enabled by default because it is resource intensive. + + + Tests for features that are not supported by the current build @@ -379,12 +402,37 @@ make check LANG=C ENCODING=EUC_JP Custom Server Settings - Custom server settings to use when running a regression test suite can be + There are several ways to use custom server settings when running a test + suite. This can be useful to enable additional logging, adjust resource + limits, or enable extra run-time checks such as . But note that not all tests can be + expected to pass cleanly with arbitrary settings. + + + + Extra options can be passed to the various initdb + commands that are run internally during test setup using the environment + variable PG_TEST_INITDB_EXTRA_OPTS. For example, to run a + test with checksums enabled and a custom WAL segment size and + work_mem setting, use: + +make check PG_TEST_INITDB_EXTRA_OPTS='-k --wal-segsize=4 -c work_mem=50MB' + + + + + For the core regression test suite and other tests driven by + pg_regress, custom run-time server settings can also be set in the PGOPTIONS environment variable (for settings - that allow this): + that allow this), for example: make check PGOPTIONS="-c debug_parallel_query=regress -c work_mem=50MB" + (This makes use of functionality provided by libpq; see for details.) + + + When running against a temporary installation, custom settings can also be set by supplying a pre-written postgresql.conf: @@ -394,11 +442,6 @@ make check EXTRA_REGRESS_OPTS="--temp-config=test_postgresql.conf" - - This can be useful to enable additional logging, adjust resource limits, - or enable extra run-time checks such as . - @@ -533,11 +576,11 @@ make check NO_LOCALE=1 Most of the date and time results are dependent on the time zone environment. The reference files are generated for time zone - PST8PDT (Berkeley, California), and there will be + America/Los_Angeles, and there will be apparent failures if the tests are not run with that time zone setting. The regression test driver sets environment variable - PGTZ to PST8PDT, which normally - ensures proper results. + PGTZ to America/Los_Angeles, + which normally ensures proper results. @@ -818,6 +861,8 @@ make check PROVE_TESTS='t/001_test1.pl t/003_test3.pl' PG_TEST_NOCLEAN=1 make -C src/bin/pg_dump check + This environment variable also prevents the test's temporary directories + from being removed. diff --git a/doc/src/sgml/release-16.sgml b/doc/src/sgml/release-16.sgml deleted file mode 100644 index 21fe8bb4868e8..0000000000000 --- a/doc/src/sgml/release-16.sgml +++ /dev/null @@ -1,3203 +0,0 @@ - - - - - Release 16 - - - Release date: - AS OF 2023-06-26, 2023-??-?? - - - - Overview - - - PostgreSQL 16 contains many new features - and enhancements, including: - - - - - - - Allow parallelization of FULL and internal right OUTER hash joins - - - - - - Allow logical replication from standby servers - - - - - - Allow logical replication subscribers to apply large transactions in parallel - - - - - - Allow monitoring of I/O statistics using the new pg_stat_io view - - - - - - Add SQL/JSON constructors and identity functions - - - - - - Improve performance of vacuum freezing - - - - - - Add support for regular expression matching of user and database names in pg_hba.conf, and user names in pg_ident.conf - - - - - - - The above items and other new features of - PostgreSQL 16 are explained in more detail - in the sections below. - - - - - - - Migration to Version 16 - - - A dump/restore using or use of - or logical replication is required for - those wishing to migrate data from any previous release. See for general information on migrating to new - major releases. - - - - Version 16 contains a number of changes that may affect compatibility - with previous releases. Observe the following incompatibilities: - - - - - - - - -Change assignment rules for PL/pgSQL bound cursor variables (Tom Lane) - - - -Previously, the string value of such variables was set to match the variable name during cursor assignment; now it will be assigned during OPEN, and will not match the variable name. -To restore the previous behavior, assign the desired portal name to the cursor variable before OPEN. - - - - - - - -Disallow NULLS NOT DISTINCT indexes for primary keys (Daniel Gustafsson) - - - - - - - -Change REINDEX DATABASE and reindexdb to not process indexes on system catalogs (Simon Riggs) - - - -Processing such indexes is still possible using REINDEX SYSTEM and reindexdb --system. - - - - - - - -Tighten GENERATED expression restrictions on inherited and partitioned tables (Amit Langote, Tom Lane) - - - -Columns of parent/partitioned and child/partition tables must all have the same generation status, though now the actual generation expressions can be different. - - - - - - - -Remove pg_walinspect functions pg_get_wal_records_info_till_end_of_wal() and pg_get_wal_stats_till_end_of_wal() (Bharath Rupireddy) - - - - - - - -Remove libpq support for SCM credential authentication (Michael Paquier) - - - -Backend support for this authentication method was removed in PostgreSQL 9.1. - - - - - - - -Rename server variable force_parallel_mode to debug_parallel_query (David Rowley) - - - - - - - -Remove the ability to create views manually with ON SELECT rules (Tom Lane) - - - - - - - -Remove the server variable vacuum_defer_cleanup_age (Andres Freund) - - - -This has been unnecessary since hot_standby_feedback and replication slots were added. - - - - - - - -Remove server variable promote_trigger_file (Simon Riggs) - - - -This was used to promote a standby to primary, but is now easier accomplished with pg_ctl promote or pg_promote(). - - - - - - - -Remove read-only server variables lc_collate and lc_ctype (Peter Eisentraut) - - - -Collations and locales can vary between databases so having them as read-only server variables was unhelpful. - - - - - - - -Deprecate createuser option --role (Nathan Bossart) - - - -This option could be easily confused with new createuser role membership options, so option --member-of has been added with the same functionality. -The --role option can still be used. - - - - - - - -Remove symbolic links for the postmaster binary (Peter Eisentraut) - - - - - - - - - Changes - - - Below you will find a detailed account of the changes between - PostgreSQL 16 and the previous major - release. - - - - Server - - - Optimizer - - - - - - - -Allow incremental sorts in more cases, including DISTINCT (David Rowley) - - - - - - - -Add the ability for aggregates having ORDER BY or DISTINCT to use pre-sorted data (David Rowley) - - - -This ability is new in this release and the server variable to disable it is called enable_presorted_aggregate. - - - - - - - -Allow memoize atop a UNION ALL (Richard Guo) - - - - - - - -Allow anti-joins to be performed with the non-nullable input as the inner relation (Richard Guo) - - - - - - - -Allow parallelization of FULL and internal right OUTER hash joins (Melanie Plageman, Thomas Munro) - - - - - - - -Improve the accuracy of GIN index access optimizer costs (Ronan Dunklau) - - - - - - - - - General Performance - - - - - - - -Allow more efficient addition of heap and index pages (Andres Freund) - - - - - - - -During non-freeze operations, perform page freezing where appropriate (Peter Geoghegan) - - - -This makes full-table freeze vacuums less necessary. - - - - - - - -Allow window functions to use ROWS mode internally when RANGE mode is specified but unnecessary (David Rowley) - - - - - - - -Allow optimization of always-increasing window functions ntile(), cume_dist() and percent_rank() (David Rowley) - - - - - - - -Allow aggregate functions string_agg() and array_agg() to be parallelized (David Rowley) - - - - - - - -Improve performance by caching RANGE and LIST partition lookups (Amit Langote, Hou Zhijie, David Rowley) - - - - - - - -Allow control of the shared buffer usage by vacuum and analyze (Melanie Plageman) - - - -The VACUUM/ANALYZE option is BUFFER_USAGE_LIMIT, and the vacuumdb option is --buffer-usage-limit. The default value is set by server variable vacuum_buffer_usage_limit, which also controls autovacuum. - - - - - - - -Support wal_sync_method=fdatasync on Windows (Thomas Munro) - - - - - - - -Allow HOT updates if only BRIN-indexed columns are updated (Matthias van de Meent, Josef Simanek, Tomas Vondra) - - - - - - - -Improve the speed of updating the process title (David Rowley) - - - - - - - -Allow xid/subxid searches and ASCII string detection to use vector operations (Nathan Bossart, John Naylor) - - - -ASCII detection is particularly useful for COPY FROM. Vector operations are also used for some C array searches. - - - - - - - - -Reduce overhead of memory allocations (Andres Freund, David Rowley) - - - - - - - - - Monitoring - - - - - - - -Add system view pg_stat_io view to track IO statistics (Melanie Plageman) - - - - - - - -Record statistics on the last sequential and index scans on tables (Dave Page) - - - -This information appears in pg_stat_all_tables and pg_stat_all_indexes. - - - - - - - -Record statistics on the occurrence of updated rows moving to new pages (Corey Huinker) - - - -The pg_stat_*_tables column is n_tup_newpage_upd. - - - - - - - -Add speculative lock information to the pg_locks system view (Masahiko Sawada, Noriyoshi Shinoda) - - - -The transaction id is displayed in the transactionid field and the speculative insertion token is displayed in the objid field. - - - - - - - -Add the display of prepared statement result types to the pg_prepared_statements view (Dagfinn Ilmari MannsÃ¥ker) - - - - - - - -Create subscription statistics entries at subscription creation time so stats_reset is accurate (Andres Freund) - - - -Previously entries were created only when the first statistics were reported. - - - - - - - -Correct the IO accounting for temp relation writes shown in pg_stat_database (Melanie Plageman) - - - - - - - -Add function pg_stat_get_backend_subxact() to report on a session's subtransaction cache (Dilip Kumar) - - - - - - - -Have pg_stat_get_backend_idset(), pg_stat_get_backend_activity(), and related functions use the unchanging backend id (Nathan Bossart) - - - -Previously the index values might change during the lifetime of the session. - - - - - - - -Report stand-alone backends with a special backend type (Melanie Plageman) - - - - - - - -Add wait event SpinDelay to report spinlock sleep delays (Andres Freund) - - - - - - - -Create new wait event "DSMAllocate" to indicate waiting for dynamic shared memory allocation (Thomas Munro) - - - -Previously this type of wait was reported as "DSMFillZeroWrite", which was also used by mmap() allocations. - - - - - - - -Add the database name to the process display of logical WAL senders (Tatsuhiro Nakamori) - - - -Physical WAL senders do not display a database name. - - - - - - - -Add checkpoint and REDO LSN information to log_checkpoints messages (Bharath Rupireddy, Kyotaro Horiguchi) - - - - - - - -Provide additional details during client certificate failures (Jacob Champion) - - - - - - - - - Privileges - - - - - - - -Create a predefined role and grantable privilege with permission to perform maintenance operations (Nathan Bossart) - - - -The predefined role is is called pg_maintain. - - - - - - - -Add predefined role pg_create_subscription with permission to create subscriptions (Robert Haas) - - - - - - - -Allow subscriptions to not require passwords (Robert Haas) - - - -This is accomplished with the option password_required=false. - - - - - - - -Simplify permissions for LOCK TABLE (Jeff Davis) - - - -Previously the ability to perform LOCK TABLE at various lock levels was bound to specific query-type permissions. For example, UPDATE could perform all lock levels except ACCESS SHARE, which -required SELECT permissions. Now UPDATE can issue all lock levels. MORE? - - - - - - - -Allow "GRANT group_name TO user_name" to be performed with ADMIN OPTION (Robert Haas) - - - -Previously CREATEROLE permission was required. - - - - - - - -Restrict the privileges of CREATEROLE roles (Robert Haas) - - - -Previously roles with CREATEROLE privileges could change many aspects of any non-superuser role. Such changes, including adding members, now require the role requesting the change to have ADMIN OPTION -permission. - - - - - - - -Improve logic of CREATEROLE roles ability to control other roles (Robert Haas) - - - -For example, they can change the CREATEDB, REPLICATION, and BYPASSRLS properties only if they also have those permissions. - - - - - - - -Allow GRANT to control role inheritance behavior (Robert Haas) - - - -By default, role inheritance is controlled by the inheritance status of the member role. The new GRANT clauses WITH INHERIT and WITH ADMIN can now override this. - - - - - - - -Allow roles that create other roles to automatically inherit the new role's rights or SET ROLE to the new role (Robert Haas, Shi Yu) - - - -This is controlled by server variable createrole_self_grant. - - - - - - - -Prevent users from changing the default privileges of non-inherited roles (Robert Haas) - - - -This is now only allowed for inherited roles. - - - - - - - -When granting role membership, require the granted-by role to be a role that has appropriate permissions (Robert Haas) - - - -This is a requirement even when a non-bootstrap superuser is granting role membership. - - - - - - - -Allow non-superusers to grant permissions using a granted-by user that is not the current user (Robert Haas) - - - -The current user still must have sufficient permissions given by the specified granted-by user. - - - - - - - -Add GRANT to control permission to use SET ROLE (Robert Haas) - - - -This is controlled by a new GRANT ... SET option. - - - - - - - -Add dependency tracking to roles which have granted privileges (Robert Haas) - - - -For example, removing ADMIN OPTION will fail if there are privileges using that option; CASCADE must be used to revoke dependent permissions. - - - - - - - -Add dependency tracking of grantors for GRANT records (Robert Haas) - - - -This guarantees that pg_auth_members.grantor values are always valid. - - - - - - - -Allow multiple role membership records (Robert Haas) - - - -Previously a new membership grant would remove a previous matching membership grant, even if other aspects of the grant did not match. - - - - - - - -Prevent removal of superuser privileges for the bootstrap user (Robert Haas) - - - -Restoring such users could lead to errors. - - - - - - - -Allow makeaclitem() to accept multiple privilege names (Robins Tharakan) - - - -Previously only a single privilege name, like SELECT, was accepted. - - - - - - - - - Server Configuration - - - - - - - -Add support for Kerberos credential delegation (Stephen Frost) - - - -This is enabled with server variable gss_accept_delegation -and libpq connection parameter gssdelegation. - - - - - - - -Allow the SCRAM iteration count to be set with server variable scram_iterations (Daniel Gustafsson) - - - - - - - -Improve performance of server variable management (Tom Lane) - - - - - - - -Tighten restrictions on which server variables can be reset (Masahiko Sawada) - - - -Previously, while certain variables, like transaction_isolation, were not affected by RESET ALL, they could be individually reset in inappropriate situations. - - - - - - - -Move various postgresql.conf items into new categories (Shinya Kato) - - - -This also affects the categories displayed in the pg_settings view. - - - - - - - -Prevent configuration file recursion beyond 10 levels (Julien Rouhaud) - - - - - - - -Allow autovacuum to more frequently honor changes to delay settings (Melanie Plageman) - - - -Rather than honor changes only at the start of each relation, honor them at the start of each block. - - - - - - - -Remove restrictions that archive files be durably renamed (Nathan Bossart) - - - -The archive command is now more likely to be called with already-archived files after a crash. - - - - - - - -Prevent archive_library and archive_command from being set at the same time (Nathan Bossart) - - - -Previously archive_library would override archive_command. - - - - - - - -Allow the postmaster to terminate children with an abort signal (Tom Lane) - - - -This allows collection of a core dump for a stuck child process. -This is controlled by send_abort_for_crash and send_abort_for_kill. -The postmaster's -T switch is now the same as setting send_abort_for_crash. - - - - - - - -Remove the non-functional postmaster -n option (Tom Lane) - - - - - - - -Allow the server to reserve backend slots for roles with pg_use_reserved_connections membership (Nathan Bossart) - - - -The number of reserved slots is set by server variable reserved_connections. - - - - - - - -Add debug_io_direct setting for developer usage (Thomas Munro, Andres Freund, Bharath Rupireddy) - - - -While primarily for developers, wal_sync_method=open_sync/open_datasync has been modified to not use direct I/O with wal_level=minimal; this is now enabled with debug_io_direct=wal. - - - - - - - -Add function pg_split_walfile_name() to report the segment and timeline values of WAL file names (Bharath Rupireddy) - - - - - - - - - <link linkend="auth-pg-hba-conf">pg_hba.conf</link> - - - - - - - -Add support for regular expression matching on database and role entries in pg_hba.conf (Bertrand Drouvot) - - - -Regular expression patterns are prefixed with a slash. Database and role names that begin with slashes need to be double-quoted if referenced in pg_hba.conf. - - - - - - - -Improve user-column handling of pg_ident.conf to match pg_hba.conf (Jelte Fennema) - - - -Specifically, add support for "all", role membership with "+", and regular expressions with a leading slash. Any user name that matches these patterns must be double-quoted. - - - - - - - -Allow include files in pg_hba.conf and pg_ident.conf (Julien Rouhaud) - - - -These are controlled by "include", "include_if_exists", and "include_dir". System views pg_hba_file_rules and pg_ident_file_mappings now display the file name. - - - - - - - -Add rule and map numbers to the system view pg_hba_file_rules (Julien Rouhaud) - - - - - - - - - <link linkend="charset">Localization</link> - - - - - - - -Determine the ICU default locale from the environment (Jeff Davis) - - - -However, ICU doesn't support the C locale so UTF-8 is used in such cases. Previously the default was always UTF-8. - - - - - - - -Have CREATE DATABASE and CREATE COLLATION's LOCALE options, and initdb and createdb --locale options, control non-libc collation providers (Jeff Davis) - - - -Previously they only controlled libc providers. - - - - - - - -Add predefined collations "unicode" and "ucs_basic" (Peter Eisentraut) - - - -This only works if ICU support is enabled. - - - - - - - -Allow custom ICU collation rules to be created (Peter Eisentraut) - - - -This is done using CREATE COLLATION's new new RULES clause, as well as new options for CREATE DATABASE, createdb, and initdb. - - - - - - - -Allow Windows to import system locales automatically (Juan José Santamaría Flecha) - - - -Previously, only ICU locales could be imported on Windows. - - - - - - - - - - - <link linkend="logical-replication">Logical Replication</link> - - - - - - - -Allow logical decoding on standbys (Bertrand Drouvot, Andres Freund, Amit Khandekar) - - - - - -Snapshot WAL records are required for logical slot creation but cannot be created on standbys. -To avoid delays, the new function pg_log_standby_snapshot() allows creation of such records. - - - - - - - -Add server variable to control how logical decoding publishers transfer changes and how subscribers apply them (Shi Yu) - - - -The variable is logical_replication_mode. - - - - - - - -Allow logical replication initial table synchronization to copy rows in binary format (Melih Mutlu) - - - -This is only possible for subscriptions marked as binary. - - - - - - - -Allow parallel application of logical replication (Hou Zhijie, Wang Wei, Amit Kapila) - - - -The CREATE SUBSCRIPTION "streaming" option now supports "parallel" to enable parallel application. Perform apply of large transactions by parallel workers. The number of parallel workers is controlled by -the new server variable max_parallel_apply_workers_per_subscription. Wait events LogicalParallelApplyMain, LogicalParallelApplyStateChange, and LogicalApplySendData were also added. Column leader_pid was -added to system view pg_stat_subscription to track parallel activity. - - - - - - - -Improve performance for logical replication apply without a primary key (Onder Kalaci, Amit Kapila) - - - -Specifically, REPLICA IDENTITY FULL can now use btree indexes rather than sequentially scanning the table to find matches. - - - - - - - -Allow logical replication subscribers to process only changes that have no origin (Vignesh C, Amit Kapila) - - - -This can be used to avoid replication loops. This is controlled by the new CREATE SUBSCRIPTION "origin" option. - - - - - - - -Perform logical replication SELECT and DML actions as the table owner (Robert Haas) - - - -This improves security and now requires subscription owners to be either superusers or to have SET ROLE permissions on all tables in the replication set. The previous behavior of performing all operations -as the subscription owner can be enabled with the subscription run_as_owner option. - - - - - - - -Have wal_retrieve_retry_interval operate on a per-subscription basis (Nathan Bossart) - - - -Previously the retry time was applied globally. This also adds wait events LogicalRepLauncherDSA and LogicalRepLauncherHash. - - - - - - - - - Utility Commands - - - - - - - -Add EXPLAIN option GENERIC_PLAN to display the generic plan for a parameterized query (Laurenz Albe) - - - - - - - -Allow a COPY FROM value to map to a column's DEFAULT (Israel Barth Rubio) - - - - - - - -Allow COPY into foreign tables to add rows in batches (Andrey Lepikhov, Etsuro Fujita) - - - -This is controlled by the postgres_fdw "batch_size" option. - - - - - - - -Allow the STORAGE type to be specified by CREATE TABLE (Teodor Sigaev, Aleksander Alekseev) - - - -Previously only ALTER TABLE could control this - - - - - - - -Allow truncate triggers on foreign tables (Yugo Nagata) - - - - - - - -Allow VACUUM and vacuumdb to only process TOAST tables (Nathan Bossart) - - - -This is accomplished by having VACUUM turn off PROCESS_MAIN or by vacuumdb using the --no-process-main option. - - - - - - - -Add VACUUM options to skip or update all frozen statistics (Tom Lane, Nathan Bossart) - - - -The options are SKIP_DATABASE_STATS and ONLY_DATABASE_STATS. - - - - - - - -Change REINDEX DATABASE and REINDEX SYSTEM to no longer require an argument (Simon Riggs) - - - -Previously the database name had to be specified. - - - - - - - -Allow CREATE STATISTICS to generate a statistics name if none is specified (Simon Riggs) - - - - - - - - - Data Types - - - - - - - -Allow non-decimal integer literals (Peter Eisentraut) - - - -For example, 0x42F, 0o273, and 0b100101. - - - - - - - -Allow NUMERIC to process hexadecimal, octal, and binary integers of any size (Dean Rasheed) - - - -Previously only unquoted eight-byte integers were supported with these non-decimal bases. - - - - - - - -Allow underscores in integer and numeric constants (Peter Eisentraut, Dean Rasheed) - - - -This can improve readability for long strings of digits. - - - - - - - -Accept the spelling "+infinity" in datetime input (Vik Fearing) - - - - - - - -Prevent the specification of "epoch" and "infinity" together with other fields in datetime strings (Joseph Koshakow) - - - - - - - -Remove undocumented support for date input in the form -"YyearMmonthDday" -(Joseph Koshakow) - - - - - - - -Add functions pg_input_is_valid() and pg_input_error_info() to check for type conversion errors (Tom Lane) - - - - - - - - - General Queries - - - - - - - -Allow subqueries in the FROM clause to omit aliases (Dean Rasheed) - - - - - - - -Add support for enhanced numeric literals in SQL JSON paths (Peter Eisentraut) - - - -For example, allow hexadecimal, octal, and binary integers and underscores between digits. - - - - - - - - - Functions - - - - - - - -Add SQL/JSON constructors (Nikita Glukhov, Teodor Sigaev, Oleg Bartunov, Alexander Korotkov, Amit Langote) - - - -The new functions JSON_ARRAY(), JSON_ARRAYAGG(), JSON_OBJECT(), and JSON_OBJECTAGG() are part of the SQL standard. - - - - - - - -Add SQL/JSON object checks (Nikita Glukhov, Teodor Sigaev, Oleg Bartunov, Alexander Korotkov, Amit Langote, Andrew Dunstan) - - - -The IS JSON checks include checks for values, arrays, objects, scalars, and unique keys. - - - - - - - -Allow JSON string parsing to use vector operations (John Naylor) - - - - - - - -Improve the handling of full text highlighting function ts_headline() for OR and NOT expressions (Tom Lane) - - - - - - - -Add functions to add, subtract, and generate timestamptz values in a specified time zone (Przemyslaw Sztoch, Gurjeet Singh) - - - -The functions are date_add(), date_subtract(), and generate_series(). - - - - - - - -Change date_trunc(unit, timestamptz, time_zone) to be an immutable function (Przemyslaw Sztoch) - - - -This allows the creation of expression indexes using this function. - - - - - - - -Add server variable SYSTEM_USER (Bertrand Drouvot) - - - -This reports the authentication method and its authenticated user. - - - - - - - -Add functions array_sample() and array_shuffle() (Martin Kalcher) - - - - - - - -Add aggregate function ANY_VALUE() which returns any value from a set (Vik Fearing) - - - - - - - -Add function random_normal() to supply normally-distributed random numbers (Paul Ramsey) - - - - - - - -Add error function erf() and its complement erfc() (Dean Rasheed) - - - - - - - -Improve the accuracy of numeric power() for integer exponents (Dean Rasheed) - - - - - - - -Add XMLSERIALIZE() option INDENT to pretty-print its output (Jim Jones) - - - - - - - -Change pg_collation_actual_version() to return a reasonable value for the default collation (Jeff Davis) - - - -Previously it returned NULL. - - - - - - - -Allow pg_read_file() and pg_read_binary_file() to ignore missing files (Kyotaro Horiguchi) - - - - - - - -Add the byte specification ('B') to pg_size_bytes() (Peter Eisentraut) - - - - - - - -Allow to_reg* functions to accept numeric OIDs as input (Tom Lane) - - - - - - - - - <link linkend="plpgsql">PL/pgSQL</link> - - - - - - - -Add the ability to get the current function's OID in PL/pgSQL (Pavel Stehule) - - - -This is accomplished with GET DIAGNOSTICS variable = PG_ROUTINE_OID. - - - - - - - - - <link linkend="libpq">libpq</link> - - - - - - - -Add libpq connection option require_auth to specify a list of acceptable authentication methods (Jacob Champion) - - - -This can also be used to disallow certain authentication methods. - - - - - - - -Allow multiple libpq-specified hosts to be randomly selected (Jelte Fennema) - - - -This is enabled with "load_balance_hosts=random". This can be used for load balancing. - - - - - - - -Add libpq option sslcertmode to control transmission of the client certificate (Jacob Champion) - - - -The option values are "disable", "allow", and "require". - - - - - - - -Allow libpq to use the system certificate pool for certificate verification (Jacob Champion, Thomas Habets) - - - -This is enabled with sslrootcert=system, which also enables sslmode=verify-full. - - - - - - - - - Client Applications - - - - - - - -Allow ECPG variable declarations to use typedef names that match unreserved SQL keywords (Tom Lane) - - - -This change does prevent keywords which match C typedef names from being processed as keywords in later EXEC SQL blocks. - - - - - - - <xref linkend="app-psql"/> - - - - - - - -Allow psql to control the maximum width of header lines in expanded format (Platon Pronko) - - - -This is controlled by xheader_width. - - - - - - - -Allow psql's access privilege commands to show system objects (Nathan Bossart) - - - -The options are \dpS and \zS. - - - - - - - -Add "FOREIGN" designation to psql \d+ for foreign table children and partitions (Ian Lawrence Barwick) - - - - - - - -Prevent \df+ from showing function source code (Isaac Morland) - - - -Function bodies are more easily viewed with \ev and \ef. - - - - - - - -Allow psql to submit queries using the extended query protocol (Peter Eisentraut) - - - -Passing arguments to such queries is done using the new psql \bind command. - - - - - - - -Allow psql \watch to limit the number of executions (Andrey Borodin) - - - -The \watch options can now be named. - - - - - - - -Detect invalid values for psql \watch, and allow zero to specify no delay (Andrey Borodin) - - - - - - - -Allow psql scripts to obtain the exit status of shell commands and queries -(Corey Huinker, Tom Lane) - - - -The new psql control variables are SHELL_ERROR and SHELL_EXIT_CODE. - - - - - - - -Various psql tab completion improvements (Vignesh C, Aleksander Alekseev, Dagfinn Ilmari MannsÃ¥ker, Shi Yu, Michael Paquier, Ken Kato, Peter Smith) - - - - - - - - - <link linkend="app-pgdump"><application>pg_dump</application></link> - - - - - - - -Add pg_dump control of dumping child tables and partitions (Gilles Darold) - - - -The new options are --table-and-children, --exclude-table-and-children, and --exclude-table-data-and-children. - - - - - - - -Add LZ4 and Zstandard compression to pg_dump (Georgios Kokolatos, Justin Pryzby) - - - - - - - -Allow pg_dump and pg_basebackup to use "long" mode for compression (Justin Pryzby) - - - - - - - -Improve pg_dump to accept a more consistent compression syntax (Georgios Kokolatos) - - - -Options like "--compress=gzip:5". - - - - - - - - - - - Server Applications - - - - - - - -Have initdb use ICU by default if ICU is enabled in the binary (Jeff Davis) - - - -Option --locale-provider=libc can be used to disable ICU. - - - - - - - -Add initdb option to set server variables for the duration of initdb and all future server starts (Tom Lane) - - - -The option is "-c name=value". - - - - - - - -Add options to createuser to control more user options (Shinya Kato) - - - -Specifically, the new options control the valid-until date, bypassing of row-level security, and role membership. - - - - - - - -Allow control of vacuumdb schema processing (Gilles Darold) - - - -These are controlled by options --schema and --exclude-schema. - - - - - - - -Use new VACUUM options to improve the performance of vacuumdb (Tom Lane, Nathan Bossart) - - - - - - - -Have pg_upgrade set the new cluster's locale and encoding (Jeff Davis) - - - -This removes the requirement that the new cluster be created with the same locale and encoding settings. - - - - - - - -Add pg_upgrade option to specify the default transfer mode (Peter Eisentraut) - - - -The option is --copy. - - - - - - - -Improve pg_basebackup to accept numeric compression options (Georgios Kokolatos, Michael Paquier) - - - -Options like "--compress=server-5" are now supported. - - - - - - - -Fix pg_basebackup to handle tablespaces stored in the PGDATA directory (Robert Haas) - - - - - - - -Add pg_waldump option --save-fullpage to dump full page images (David Christensen) - - - - - - - -Allow pg_waldump options -t/--timeline to accept hexadecimal values (Peter Eisentraut) - - - - - - - -Add support for progress reporting to pg_verifybackup (Masahiko Sawada) - - - - - - - -Allow pg_rewind to properly track timeline changes (Heikki Linnakangas) - - - -Previously if pg_rewind was run after a timeline switch but before a checkpoint was issued, it might incorrectly determine that a rewind was unnecessary. - - - - - - - -Have pg_receivewal and pg_recvlogical cleanly exit on SIGTERM (Christoph Berg) - - - -This signal is often used by systemd. - - - - - - - - - Source Code - - - - - - - -Build ICU support by default (Jeff Davis) - - - -This removes build flag --with-icu and adds flag --without-icu. - - - - - - - -Add support for SSE2 (Streaming SIMD Extensions 2) vector operations on x86-64 architectures (John Naylor) - - - - - - - -Add support for Advanced SIMD (Single Instruction Multiple Data) (NEON) instructions on ARM architectures (Nathan Bossart) - - - - - - - -Have Windows binaries built with MSVC use RandomizedBaseAddress (ASLR) (Michael Paquier) - - - -This was already enabled on MinGW builds. - - - - - - - -Prevent extension libraries from exporting their symbols by default (Andres Freund, Tom Lane) - - - -Functions that need to be called from the core backend or other extensions must now be explicitly marked PGDLLEXPORT. - - - - - - - -Require Windows 10 or newer versions (Michael Paquier, Juan José Santamaría Flecha) - - - -Previously Windows Vista and Windows XP were supported. - - - - - - - -Require Perl version 5.14 or later (John Naylor) - - - - - - - -Require Bison version 2.3 or later (John Naylor) - - - - - - - -Require Flex version 2.5.35 or later (John Naylor) - - - - - - - -Require MIT Kerberos for GSSAPI support (Stephen Frost) - - - - - - - -Remove support for Visual Studio 2013 (Michael Paquier) - - - - - - - -Remove support for HP-UX (Thomas Munro) - - - - - - - -Remove support for HP/Intel Itanium (Thomas Munro) - - - - - - - -Remove support for M68K, M88K, M32R, and SuperH CPU architectures (Thomas Munro) - - - - - - - -Add meson build system (Andres Freund, Nazir Bilal Yavuz, Peter Eisentraut) - - - -This eventually will replace the Autoconf and Windows-based MSVC build systems. - - - - - - - -Allow control of the location of the openssl binary used by the build system (Peter Eisentraut) - - - -Make finding openssl program a configure or meson option - - - - - - - -Add build option to allow testing of small segment sizes (Andres Freund) - - - -The build options are --with-segsize-blocks and -Dsegsize_blocks. - - - - - - - -Add pgindent options (Andrew Dunstan) - - - -The new options are --show-diff, --silent-diff, --commit, and --help, and allow multiple --exclude options. Also require the typedef file to be explicitly specified. Options --code-base and --build were -also removed. - - - - - - - -Add pg_bsd_indent source code to the main tree (Tom Lane) - - - - - - - -Improve make_ctags and make_etags (Yugo Nagata) - - - - - - - -Adjust pg_attribute columns for efficiency (Peter Eisentraut) - - - - - - - - - Additional Modules - - - - - - - -Improve use of extension-based indexes on boolean columns (Zongliang Quan, Tom Lane) - - - - - - - -Add support for Daitch-Mokotoff Soundex to fuzzystrmatch (Dag Lem) - - - - - - - -Allow auto_explain to log values passed to parameterized statements (Dagfinn Ilmari MannsÃ¥ker) - - - -This affects queries using server-side PREPARE/EXECUTE and client-side parse/bind. Logging is controlled by auto_explain.log_parameter_max_length; by default query parameters will -be logged with no length restriction. - - - - - - - -Have auto_explain's log_verbose mode honor the value of compute_query_id (Atsushi Torikoshi) - - - -Previously even if compute_query_id was enabled, log_verbose was not showing the query identifier. - - - - - - - -Change the maximum length of ltree labels from 256 to 1000 and allow hyphens (Garen Torikian) - - - - - - - -Have pg_stat_statements normalize constants used in utility commands (Michael Paquier) - - - -Previously constants appeared instead of placeholders, e.g., $1. - - - - - - - -Add pg_walinspect function pg_get_wal_block_info() to report WAL block information (Michael Paquier, Melanie Plageman, Bharath Rupireddy) - - - - - - - -Change how pg_walinspect functions pg_get_wal_records_info() and pg_get_wal_stats() interpret ending LSNs (Bharath Rupireddy) - - - -Previously ending LSNs which represent nonexistent WAL locations would generate an error, while they will now be interpreted as the end of the WAL. - - - - - - - -Add detailed descriptions of WAL records in pg_walinspect and pg_waldump (Melanie Plageman, Peter Geoghegan) - - - - - - - -Add pageinspect function bt_multi_page_stats() to report statistics on multiple pages (Hamid Akhtar) - - - -This is similar to bt_page_stats() except it can report on a range of pages. - - - - - - - -Add empty range output column to pageinspect function brin_page_items() (Tomas Vondra) - - - - - - - -Redesign archive modules to be more flexible (Nathan Bossart) - - - -Initialization changes will require modules written for older versions of Postgres to be updated. - - - - - - - -Correct inaccurate pg_stat_statements row tracking extended query protocol statements (Sami Imseih) - - - - - - - -Add pg_buffercache function pg_buffercache_usage_counts() to report usage totals (Nathan Bossart) - - - - - - - -Add pg_buffercache function pg_buffercache_summary() to report summarized buffer statistics (Melih Mutlu) - - - - - - - -Allow the schemas of required extensions to be referenced in extension scripts using the new syntax @extschema:referenced_extension_name@ (Regina Obe) - - - - - - - -Allow required extensions to be marked as non-relocatable using "no_relocate" (Regina Obe) - - - -This allows @extschema:referenced_extension_name@ to be treated as a constant for the lifetime of the extension. - - - - - - - <link linkend="postgres-fdw"><application>postgres_fdw</application></link> - - - - - - - -Allow postgres_fdw to do aborts in parallel (Etsuro Fujita) - - - -This is enabled with postgres_fdw option "parallel_abort". - - - - - - - -Make ANALYZE on foreign postgres_fdw tables more efficient (Tomas Vondra) - - - -The postgres_fdw option analyze_sampling controls the sampling method. - - - - - - - -Restrict shipment of reg* type constants in postgres_fdw to those referencing built-in objects or extensions marked as shippable (Tom Lane) - - - - - - - -Have postgres_fdw and dblink handle interrupts during connection establishment (Andres Freund) - - - - - - - - - - - - - Acknowledgments - - - The following individuals (in alphabetical order) have contributed - to this release as patch authors, committers, reviewers, testers, - or reporters of issues. - - - - ADD HERE - - - - diff --git a/doc/src/sgml/release-17.sgml b/doc/src/sgml/release-17.sgml new file mode 100644 index 0000000000000..dddc3229f94f3 --- /dev/null +++ b/doc/src/sgml/release-17.sgml @@ -0,0 +1,8539 @@ + + + + + Release 17.5 + + + Release date: + 2025-05-08 + + + + This release contains a variety of fixes from 17.4. + For information about new features in major release 17, see + . + + + + Migration to Version 17.5 + + + A dump/restore is not required for those running 17.X. + + + + However, if you have any self-referential foreign key constraints on + partitioned tables, it may be necessary to recreate those constraints + to ensure that they are being enforced correctly. See the second + changelog entry below. + + + + Also, if you have any BRIN bloom indexes, it may be advisable to + reindex them after updating. See the third changelog entry below. + + + + Also, if you are upgrading from a version earlier than 17.1, + see . + + + + + Changes + + + + + + + Avoid one-byte buffer overread when examining invalidly-encoded + strings that are claimed to be in GB18030 encoding + (Noah Misch, Andres Freund) + § + § + + + + While unlikely, a SIGSEGV crash could occur if an incomplete + multibyte character appeared at the end of memory. This was + possible both in the server and + in libpq-using applications. + (CVE-2025-4207) + + + + + + + Handle self-referential foreign keys on partitioned tables correctly + (Ãlvaro Herrera) + § + + + + Creating or attaching partitions failed to make the required catalog + entries for a foreign-key constraint, if the table referenced by the + constraint was the same partitioned table. This resulted in failure + to enforce the constraint fully. + + + + To fix this, you should drop and recreate any self-referential + foreign keys on partitioned tables, if partitions have been created + or attached since the constraint was created. Bear in mind that + violating rows might already be present, in which case recreating + the constraint will fail, and you'll need to fix up those rows + before trying again. + + + + + + + Avoid data loss when merging compressed BRIN summaries + in brin_bloom_union() (Tomas Vondra) + § + + + + The code failed to account for decompression results not being + identical to the input objects, which would result in failure to add + some of the data to the merged summary, leading to missed rows in + index searches. + + + + This mistake was present back to v14 where BRIN bloom indexes were + introduced, but this code path was only rarely reached then. It's + substantially more likely to be hit in v17 because parallel index + builds now use the code. + + + + + + + Fix unexpected attribute has wrong type errors + in UPDATE, DELETE, + and MERGE queries that use whole-row table + references to views or functions in FROM + (Tom Lane) + § + + + + + + + Fix MERGE into a partitioned table + with DO NOTHING actions (Tender Wang) + § + + + + Some cases failed with unknown action in MERGE WHEN + clause errors. + + + + + + + Prevent failure in INSERT commands when the table + has a GENERATED column of a domain data type and + the domain's constraints disallow null values (Jian He) + § + + + + Constraint failure was reported even if the generation expression + produced a perfectly okay result. + + + + + + + Correctly process references to outer CTE names that appear within + a WITH clause attached to + an INSERT/UPDATE/DELETE/MERGE + command that's inside WITH (Tom Lane) + § + + + + The parser failed to detect disallowed recursion cases, nor did it + account for such references when sorting CTEs into a usable order. + + + + + + + Fix misprocessing of casts within the keys of JSON constructor + expressions (Amit Langote) + § + + + + + + + Don't try to parallelize array_agg() when the + argument is of an anonymous record type (Richard Guo, Tom Lane) + § + + + + The protocol for communicating with parallel workers doesn't support + identifying the concrete record type that a worker is returning. + + + + + + + Fix ARRAY(subquery) + and ARRAY[expression, ...] + constructs to produce sane results when the input is of + type int2vector or oidvector (Tom Lane) + § + + + + This patch restores the behavior that existed + before PostgreSQL 9.5: the result is of + type int2vector[] or oidvector[]. + + + + + + + Fix possible erroneous reports of invalid affixes while parsing + Ispell dictionaries (Jacob Brazeal) + § + + + + + + + Fix ALTER TABLE ADD COLUMN to correctly handle + the case of a domain type that has a default + (Jian He, Tom Lane, Tender Wang) + § + § + + + + If a domain type has a default, adding a column of that type (without + any explicit DEFAULT + clause) failed to install the domain's default + value in existing rows, instead leaving the new column null. + + + + + + + Repair misbehavior when there are duplicate column names in a + foreign key constraint's ON DELETE SET DEFAULT + or SET NULL action (Tom Lane) + § + + + + + + + Improve the error message for disallowed attempts to alter the + properties of a foreign key constraint (Ãlvaro Herrera) + § + + + + + + + Avoid error when resetting + the relhassubclass flag of a temporary + table that's marked ON COMMIT DELETE ROWS + (Noah Misch) + § + + + + + + + Add missing deparsing of the INDENT option + of XMLSERIALIZE() (Jim Jones) + § + § + + + + Previously, views or rules + using XMLSERIALIZE(... INDENT) were dumped + without the INDENT clause, causing incorrect + results after restore. + + + + + + + Avoid premature evaluation of the arguments of an aggregate function + that has both FILTER and ORDER + BY (or DISTINCT) options (David Rowley) + § + + + + If there is ORDER BY + or DISTINCT, we consider pre-sorting the + aggregate input values rather than doing the sort within the Agg + plan node. But this is problematic if the aggregate inputs include + expressions that could fail (for example, a division where some of + the input divisors could be zero) and there is + a FILTER clause that's meant to prevent such + failures. Pre-sorting would push the expression evaluations to + before the FILTER test, allowing the failures to + happen anyway. Avoid this by not pre-sorting if there's + a FILTER and the input expressions are anything + more complex than a simple Var or Const. + + + + + + + Fix erroneous deductions from column NOT NULL + constraints in the presence of outer joins (Richard Guo) + § + + + + In some cases the planner would discard an IS NOT + NULL query condition, even though the condition applies + after an outer join and thus is not redundant. + + + + + + + Avoid incorrect optimizations based on IS [NOT] + NULL tests that are applied to composite values + (Bruce Momjian) + § + + + + + + + Fix planner's failure to identify more than one hashable + ScalarArrayOpExpr subexpression within a top-level expression + (David Geier) + § + + + + This resulted in unnecessarily-inefficient execution of any + additional subexpressions that could have been processed with a hash + table (that is, IN, NOT IN, + or = ANY clauses with all-constant right-hand + sides). + + + + + + + Fix incorrect table size estimate with low fill factor (Tomas Vondra) + § + + + + When the planner estimates the number of rows in a + never-yet-analyzed table, it uses the table's fillfactor setting in + the estimation, but it neglected to clamp the result to at least one + row per page. A low fillfactor could thus result in an unreasonably + small estimate. + + + + + + + Disable skip fetch optimization in bitmap heap scan + (Matthias van de Meent) + § + + + + It turns out that this optimization can result in returning dead + tuples when a concurrent vacuum marks a page all-visible. + + + + + + + Fix performance issues in GIN index search startup when there are + many search keys (Tom Lane, Vinod Sridharan) + § + § + + + + An indexable clause with many keys (for example, jsonbcol + ?| array[...] with tens of thousands of array elements) + took O(N2) time to start up, and was + uncancelable for that interval too. + + + + + + + Detect missing support procedures in a BRIN index operator class, + and report an error instead of crashing (Ãlvaro Herrera) + § + + + + + + + Respond to interrupts (such as query cancel) while waiting for + asynchronous subplans of an Append plan node (Heikki Linnakangas) + § + + + + Previously, nothing would happen until one of the subplans becomes + ready. + + + + + + + Report the I/O statistics of active WAL senders more frequently + (Bertrand Drouvot) + § + + + + Previously, the pg_stat_io view failed to + accumulate I/O performed by a WAL sender until that process exited. + Now such I/O will be reported after at most one second's delay. + + + + + + + Fix race condition in handling + of synchronous_standby_names immediately after + startup (Melnikov Maksim, Michael Paquier) + § + + + + For a short period after system startup, backends might fail to wait + for synchronous commit even + though synchronous_standby_names is enabled. + + + + + + + Cope with possible intra-query changes + of io_combine_limit (Thomas Munro) + § + + + + + + + Avoid infinite loop if scram_iterations is set to + INT_MAX (Kevin K Biju) + § + + + + + + + Avoid possible crashes due to double transformation + of json_array()'s subquery (Tom Lane) + § + + + + + + + Fix pg_strtof() to not crash with null endptr + (Alexander Lakhin, Tom Lane) + § + + + + + + + Fix crash after out-of-memory in certain GUC assignments (Daniel + Gustafsson) + § + + + + + + + Avoid crash when a Snowball stemmer encounters an out-of-memory + condition (Maksim Korotkov) + § + + + + + + + Fix over-enthusiastic freeing of SpecialJoinInfo structs during + planning (Richard Guo) + § + + + + This led to crashes during planning if partitionwise joining is + enabled. + + + + + + + Disallow copying of invalidated replication slots (Shlok Kyal) + § + + + + This prevents trouble when the invalid slot points to WAL that's + already been removed. + + + + + + + Disallow restoring logical replication slots on standby servers that + are not in hot-standby mode (Masahiko Sawada) + § + + + + This prevents a scenario where the slot could remain valid after + promotion even if wal_level is too low. + + + + + + + Prevent over-advancement of catalog xmin in fast + forward mode of logical decoding (Zhijie Hou) + § + + + + This mistake could allow deleted catalog entries to be vacuumed away + even though they were still potentially needed by the WAL-reading + process. + + + + + + + Avoid data loss when DDL operations that don't take a strong lock + affect tables that are being logically replicated (Shlok Kyal, + Hayato Kuroda) + § + § + + + + The catalog changes caused by the DDL command were not reflected + into WAL-decoding processes, allowing them to decode subsequent + changes using stale catalog data, probably resulting in data + corruption. + + + + + + + Prevent incorrect reset of replication origin when an apply worker + encounters an error but the error is caught and does not result in + worker exit (Hayato Kuroda) + § + + + + This mistake could allow duplicate data to be applied. + + + + + + + Fix crash in logical replication if the subscriber's partitioned + table has a BRIN index (Tom Lane) + § + + + + + + + Avoid duplicate snapshot creation in logical replication index + lookups (Heikki Linnakangas) + § + § + + + + + + + Improve detection of mixed-origin subscriptions + (Hou Zhijie, Shlok Kyal) + § + + + + Subscription creation gives a warning if a subscribed-to table is + also being followed through other publications, since that could + cause duplicate data to be received. This change improves that + logic to also detect cases where a partition parent or child table + is the one being followed through another publication. + + + + + + + Fix wrong checkpoint details in error message about incorrect + recovery timeline choice (David Steele) + § + + + + If the requested recovery timeline is not reachable, the reported + checkpoint and timeline should be the values read from the + backup_label, if there is one. This message previously reported + values from the control file, which is correct when recovering from + the control file without a backup_label, but not when there is a + backup_label. + + + + + + + Fix order of operations in smgropen() + (Andres Freund) + § + + + + Ensure that the SMgrRelation object is fully initialized before + calling the smgr_open callback, so that it can be cleaned up + properly if the callback fails. + + + + + + + Remove incorrect assertion + in pgstat_report_stat() (Michael Paquier) + § + + + + + + + Fix overly-strict assertion + in gistFindCorrectParent() (Heikki Linnakangas) + § + + + + + + + Avoid assertion failure in parallel vacuum + when maintenance_work_mem has a very small value + (Masahiko Sawada) + § + + + + + + + Fix rare assertion failure in standby servers when the primary is + restarted (Heikki Linnakangas) + § + + + + + + + In PL/pgSQL, avoid unexpected plan node type error + when a scrollable cursor is defined on a + simple SELECT expression + query (Andrei Lepikhov) + § + + + + + + + Don't try to drop individual index partitions + in pg_dump's + mode (Jian He) + § + + + + The server rejects such DROP commands. That has + no real consequences, since the partitions will go away anyway in + the subsequent DROPs of either their parent + tables or their partitioned index. However, the error reported for + the attempted drop causes problems when restoring + in mode. + + + + + + + In pg_dumpall, avoid emitting invalid + role GRANT commands + if pg_auth_members contains invalid role + OIDs (Tom Lane) + § + + + + Instead, print a warning and skip the entry. This copes better with + catalog corruption that has been seen to occur in back branches as a + result of race conditions between GRANT + and DROP ROLE. + + + + + + + In pg_amcheck + and pg_upgrade, use the correct function + to free allocations made by libpq + (Michael Paquier, Ranier Vilela) + § + § + § + + + + These oversights could result in crashes in certain Windows build + configurations, such as a debug build + of libpq used by a non-debug build of the + calling application. + + + + + + + Fix reindexdb's scheduling of parallel + reindex operations (Alexander Korotkov) + § + + + + The original coding failed to achieve the expected amount of + parallelism. + + + + + + + Avoid crashing with corrupt input data + in contrib/pageinspect's + heap_page_items() (Dmitry Kovalenko) + § + + + + + + + Prevent assertion failure + in contrib/pg_freespacemap's + pg_freespacemap() (Tender Wang) + § + + + + Applying pg_freespacemap() to a relation + lacking storage (such as a view) caused an assertion failure, + although there was no ill effect in non-assert builds. + Add an error check to reject that case. + + + + + + + In contrib/postgres_fdw, avoid pulling up + restriction conditions from subqueries (Alexander Pyhalov) + § + + + + This fix prevents rare cases of unexpected expression in + subquery output errors. + + + + + + + Fix build failure when an old version + of libpq_fe.h is present in system include + directories (Tom Lane) + § + + + + + + + Fix build failure on macOS 15.4 (Tom Lane, Peter Eisentraut) + § + + + + This macOS update broke our configuration probe + for strchrnul(). + + + + + + + Fix valgrind labeling of per-buffer data of read streams + (Thomas Munro) + § + + + + This affects no core code in released versions + of PostgreSQL, but an extension using the + per-buffer data feature might have encountered spurious failures + when being tested under valgrind. + + + + + + + Avoid valgrind complaints about string hashing code (John Naylor) + § + + + + + + + Update time zone data files to tzdata + release 2025b for DST law changes in Chile, plus historical + corrections for Iran (Tom Lane) + § + + + + There is a new time zone America/Coyhaique for Chile's Aysén Region, + to account for it changing to UTC-03 year-round and thus diverging + from America/Santiago. + + + + + + + + + + Release 17.4 + + + Release date: + 2025-02-20 + + + + This release contains a few fixes from 17.3. + For information about new features in major release 17, see + . + + + + Migration to Version 17.4 + + + A dump/restore is not required for those running 17.X. + + + + However, if you are upgrading from a version earlier than 17.1, + see . + + + + + Changes + + + + + + + Improve behavior of libpq's quoting + functions (Andres Freund, Tom Lane) + § + § + § + + + + The changes made for CVE-2025-1094 had one serious oversight: + PQescapeLiteral() + and PQescapeIdentifier() failed to honor their + string length parameter, instead always reading to the input + string's trailing null. This resulted in including unwanted text in + the output, if the caller intended to truncate the string via the + length parameter. With very bad luck it could cause a crash due to + reading off the end of memory. + + + + In addition, modify all these quoting functions so that when invalid + encoding is detected, an invalid sequence is substituted for just + the first byte of the presumed character, not all of it. This + reduces the risk of problems if a calling application performs + additional processing on the quoted string. + + + + + + + Fix small memory leak + in pg_createsubscriber (Ranier Vilela) + § + + + + + + + Fix meson build system to correctly detect availability of + the bsd_auth.h system header + (Nazir Bilal Yavuz) + § + + + + + + + + + + Release 17.3 + + + Release date: + 2025-02-13 + + + + This release contains a variety of fixes from 17.2. + For information about new features in major release 17, see + . + + + + Migration to Version 17.3 + + + A dump/restore is not required for those running 17.X. + + + + However, if you are upgrading from a version earlier than 17.1, + see . + + + + + Changes + + + + + + + Harden PQescapeString and allied functions + against invalidly-encoded input strings (Andres Freund, Noah Misch) + § + § + § + § + § + § + + + + Data-quoting functions supplied by libpq + now fully check the encoding validity of their input. If invalid + characters are detected, they report an error if possible. For the + ones that lack an error return convention, the output string is + adjusted to ensure that the server will report invalid encoding and + no intervening processing will be fooled by bytes that might happen + to match single quote, backslash, etc. + + + + The purpose of this change is to guard against SQL-injection attacks + that are possible if one of these functions is used to quote crafted + input. There is no hazard when the resulting string is sent + directly to a PostgreSQL server (which + would check its encoding anyway), but there is a risk when it is + passed through psql or other client-side + code. Historically such code has not carefully vetted encoding, and + in many cases it's not clear what it should do if it did detect such + a problem. + + + + This fix is effective only if the data-quoting function, the server, + and any intermediate processing agree on the character encoding + that's being used. Applications that insert untrusted input into + SQL commands should take special care to ensure that that's true. + + + + Applications and drivers that quote untrusted input without using + these libpq functions may be at risk of + similar problems. They should first confirm the data is valid in + the encoding expected by the server. + + + + The PostgreSQL Project thanks + Stephen Fewer for reporting this problem. + (CVE-2025-1094) + + + + + + + Restore auto-truncation of database and user names appearing in + connection requests (Nathan Bossart) + § + + + + This reverts a v17 change that proved to cause trouble for some + users. Over-length names should be truncated in an encoding-aware + fashion, but for now just return to the former behavior of blind + truncation at NAMEDATALEN-1 bytes. + + + + + + + Exclude parallel workers from connection privilege checks and limits + (Tom Lane) + § + + + + Do not + check datallowconn, rolcanlogin, + and ACL_CONNECT privileges when starting a + parallel worker, instead assuming that it's enough for the leader + process to have passed similar checks originally. This avoids, for + example, unexpected failures of parallelized queries when the leader + is running as a role that lacks login privilege. In the same vein, + enforce ReservedConnections, + datconnlimit, and rolconnlimit + limits only against regular backends, and count only regular + backends while checking if the limits were already reached. Those + limits are meant to prevent excessive consumption of process slots + for regular backends --- but parallel workers and other special + processes have their own pools of process slots with their own limit + checks. + + + + + + + Drop Lock suffix from LWLock wait event names + (Bertrand Drouvot) + § + + + + Refactoring unintentionally caused + the pg_stat_activity view to show + lock-related wait event names with a Lock suffix, + which among other things broke joining it + to pg_wait_events. + + + + + + + Fix possible failure to return all matching tuples for a btree index + scan with a ScalarArrayOp (= ANY) condition + (Peter Geoghegan) + § + + + + + + + Fix possible re-use of stale results in window aggregates (David + Rowley) + § + + + + A window aggregate with a run condition optimization + and a pass-by-reference result type might incorrectly return the + result from the previous partition instead of performing a fresh + calculation. + + + + + + + Keep TransactionXmin in sync + with MyProc->xmin (Heikki Linnakangas) + § + + + + This oversight could permit a process to try to access data that had + already been vacuumed away. One known consequence is + transient could not access status of transaction + errors. + + + + + + + Fix race condition that could cause failure to add a newly-inserted + catalog entry to a catalog cache list (Heikki Linnakangas) + § + + + + This could result, for example, in failure to use a newly-created + function within an existing session. + + + + + + + Prevent possible catalog corruption when a system catalog is + vacuumed concurrently with an update (Noah Misch) + § + § + + + + + + + Fix data corruption when relation truncation fails (Thomas Munro) + § + § + § + + + + The filesystem calls needed to perform relation truncation could + fail, leaving inconsistent state on disk (for example, effectively + reviving deleted data). We can't really prevent that, but we can + recover by dint of making such failures into PANICs, so that + consistency is restored by replaying from WAL up to just before the + attempted truncation. This isn't a hugely desirable behavior, but + such failures are rare enough that it seems an acceptable solution. + + + + + + + Prevent checkpoints from starting during relation truncation + (Robert Haas) + § + + + + This avoids a race condition wherein the modified file might not get + fsync'd before completing the checkpoint, creating a risk of data + corruption if the operating system crashes soon after. + + + + + + + Avoid possibly losing an update of + pg_database.datfrozenxid + when VACUUM runs concurrently with + a REASSIGN OWNED that changes that database's + owner (Kirill Reshke) + § + + + + + + + Fix incorrect tg_updatedcols values + passed to AFTER UPDATE triggers (Tom Lane) + § + + + + In some cases the tg_updatedcols bitmap + could describe the set of columns updated by an earlier command in + the same transaction, fooling the trigger into doing the wrong + thing. + + + + Also, prevent memory bloat caused by making too many copies of + the tg_updatedcols bitmap. + + + + + + + Fix detach of a partition that has its own foreign-key constraint + referencing a partitioned table (Amul Sul) + § + + + + In common cases, foreign keys are defined on a partitioned table's + top level; but if instead one is defined on a partition and + references a partitioned table, and the referencing partition is + detached, the relevant pg_constraint + entries were updated incorrectly. This led to errors + like could not find ON INSERT check triggers of foreign key + constraint. + + + + + + + Fix pg_get_constraintdef's support + for NOT NULL constraints on domains + (Ãlvaro Herrera) + § + + + + + + + Fix mis-processing of to_timestamp's + FFn format codes + (Tom Lane) + § + + + + An integer format code immediately + preceding FFn would + consume all available digits, leaving none + for FFn. + + + + + + + When deparsing a PASSING clause in a SQL/JSON + query function, ensure that variable names are double-quoted when + necessary (Dean Rasheed) + § + + + + + + + When deparsing an XMLTABLE() expression, ensure + that XML namespace names are double-quoted when necessary (Dean + Rasheed) + § + + + + + + + Include the ldapscheme option + in pg_hba_file_rules() output (Laurenz Albe) + § + § + + + + + + + Fix planning of pre-sorted UNION operations for + cases where the input column datatypes don't all match (David + Rowley) + § + + + + This error could lead to sorting data with the wrong sort operator, + with consequences ranging from no visible problem to core dumps. + + + + + + + Don't merge UNION operations if their column + collations aren't consistent (Tom Lane) + § + + + + Previously we ignored collations when deciding if it's safe to + merge UNION steps into a single + N-way UNION operation. This was arguably valid + before the introduction of nondeterministic collations, but it's not + anymore, since the collation in use can affect the definition of + uniqueness. + + + + + + + Prevent wrong varnullingrels planner errors after + pulling up a subquery that's underneath an outer join (Tom Lane) + § + § + + + + + + + Ignore nulling-relation marker bits when looking up statistics + (Richard Guo) + § + + + + This oversight could lead to failure to use relevant statistics + about expressions, or to corrupt MVNDistinct + entry errors. + + + + + + + Fix missed expression processing for partition pruning steps + (Tom Lane) + § + + + + This oversight could lead to unrecognized node type + errors, and perhaps other problems, in queries accessing partitioned + tables. + + + + + + + Give the slotsync worker process its own process slot (Tom Lane, Hou + Zhijie) + § + + + + This was overlooked in the addition of the slotsync worker, with the + result that its process slot effectively came out of the pool meant + for regular backend processes. This could result in failure to + launch the worker, or to subsequent failures of connection requests + that should have succeeded according to the configured settings, + if the number of regular backend processes + approached max_connections. + + + + + + + Allow dshash tables to grow past 1GB (Matthias van de Meent) + § + + + + This avoids errors like invalid DSA memory alloc request + size. The case can occur for example in transactions that + process several million tables. + + + + + + + Avoid possible integer overflow + in bringetbitmap() (James Hunter, Evgeniy + Gorbanyov) + § + + + + Since the result is only used for statistical purposes, the effects + of this error were mostly cosmetic. + + + + + + + Correct miscalculation of SLRU bank numbers (Yura Sokolov) + § + + + + This error led to using a smaller number of banks than intended, + causing more contention but no functional misbehavior. + + + + + + + Ensure that an already-set process latch doesn't prevent the + postmaster from noticing socket events (Thomas Munro) + § + + + + An extremely heavy workload of backends launching workers and + workers exiting could prevent the postmaster from responding to + incoming client connections in a timely fashion. + + + + + + + Prevent streaming standby servers from looping infinitely when + reading a WAL record that crosses pages (Kyotaro Horiguchi, + Alexander Kukushkin) + § + + + + This would happen when the record's continuation is on a page that + needs to be read from a different WAL source. + + + + + + + Fix unintended promotion of FATAL errors to PANIC during early + process startup (Noah Misch) + § + + + + This fixes some unlikely cases that would result in PANIC: + proc_exit() called in child process. + + + + + + + Fix cases where an operator family member operator or support + procedure could become a dangling reference (Tom Lane) + § + § + + + + In some cases a data type could be dropped while references to its + OID still remain in pg_amop + or pg_amproc. While that caused no + immediate issues, an attempt to drop the owning operator family + would fail, and pg_dump would produce + bogus output when dumping the operator family. This fix causes + creation and modification of operator families/classes to add + needed dependency entries so that dropping a data type will also + drop any dependent operator family elements. That does not help + vulnerable pre-existing operator families, though, so a band-aid has + also been added to DROP OPERATOR FAMILY to + prevent failure when dropping a family that has dangling members. + + + + + + + Fix multiple memory leaks in logical decoding output (Vignesh C, + Masahiko Sawada, Boyu Yang) + § + § + § + + + + + + + Fix small memory leak when + updating the application_name + or cluster_name settings (Tofig Aliev) + § + + + + + + + Avoid crash when a background process tries to check a new value + of synchronized_standby_slots (Ãlvaro Herrera) + § + + + + + + + Avoid integer overflow while + testing wal_skip_threshold condition (Tom Lane) + § + + + + A transaction that created a very large relation could mistakenly + decide to ensure durability by copying the relation into WAL instead + of fsync'ing it, thereby negating the point + of wal_skip_threshold. (This only matters + when wal_level is set + to minimal, else a WAL copy is required anyway.) + + + + + + + Fix unsafe order of operations during cache lookups (Noah Misch) + § + + + + The only known consequence was a usually-harmless you don't + own a lock of type ExclusiveLock warning + during GRANT TABLESPACE. + + + + + + + Avoid potential use-after-free in parallel vacuum (Vallimaharajan G, + John Naylor) + § + + + + This bug seems to have no consequences in standard builds, but it's + theoretically a hazard. + + + + + + + Fix possible failed to resolve name failures when + using JIT on older ARM platforms (Thomas Munro) + § + + + + This could occur as a consequence of inconsistency about the default + setting of between gcc and clang. + At least Debian and Ubuntu are known to ship gcc and clang compilers + that target armv8-a but differ on the use of outline atomics by + default. + + + + + + + Fix assertion failure in WITH RECURSIVE ... UNION + queries (David Rowley) + § + + + + + + + Avoid assertion failure in rule deparsing if a set operation leaf + query contains set operations (Man Zeng, Tom Lane) + § + + + + + + + Avoid edge-case assertion failure in parallel query startup (Tom Lane) + § + + + + + + + Fix assertion failure at shutdown when writing out the statistics + file (Michael Paquier) + § + + + + + + + Avoid valgrind complaints about string hashing code (John Naylor) + § + + + + + + + In NULLIF(), avoid passing a read-write + expanded object pointer to the data type's equality function + (Tom Lane) + § + + + + The equality function could modify or delete the object if it's + given a read-write pointer, which would be bad if we decide to + return it as the NULLIF() result. There is + probably no problem with any built-in equality function, but it's + easy to demonstrate a failure with one coded in PL/pgSQL. + + + + + + + Ensure that expression preprocessing is applied to a default null + value in INSERT (Tom Lane) + § + + + + If the target column is of a domain type, the planner must insert a + coerce-to-domain step not just a null constant, and this expression + missed going through some required processing steps. There is no + known consequence with domains based on core data types, but in + theory an error could occur with domains based on extension types. + + + + + + + Avoid data loss when starting a bulk write on a relation fork that + already contains data (Matthias van de Meent) + § + + + + Any pre-existing data was overwritten with zeroes. This is not an + issue for core PostgreSQL, which never + does that. Some extensions would like to, however. + + + + + + + Avoid crash if a server process tried to iterate over a shared radix + tree that it didn't create (Masahiko Sawada) + § + + + + There is no code in core PostgreSQL that + does this, but an extension might wish to. + + + + + + + Repair memory leaks in PL/Python (Mat Arye, Tom Lane) + § + + + + Repeated use of PLyPlan.execute + or plpy.cursor resulted in memory leakage for + the duration of the calling PL/Python function. + + + + + + + Fix PL/Tcl to compile with Tcl 9 (Peter Eisentraut) + § + + + + + + + In the ecpg preprocessor, fix possible + misprocessing of cursors that reference out-of-scope variables + (Tom Lane) + § + + + + + + + In ecpg, fix compile-time warnings about + unsupported use of COPY ... FROM STDIN (Ryo + Kanbayashi) + § + + + + Previously, the intended warning was not issued due to a typo. + + + + + + + Fix psql to safely handle file path names + that are encoded in SJIS (Tom Lane) + § + + + + Some two-byte characters in SJIS have a second byte that is equal to + ASCII backslash (\). These characters were + corrupted by path name normalization, preventing access to files + whose names include such characters. + + + + + + + Add psql tab completion for COPY + (MERGE INTO) (Jian He) + § + + + + + + + Fix use of wrong version of pqsignal() + in pgbench + and psql (Fujii Masao, Tom Lane) + § + + + + This error could lead to misbehavior when using + the option in pgbench + or the \watch command + in psql, due to interrupted system calls + not being resumed as expected. + + + + + + + Fix misexecution of some nested \if constructs + in pgbench (Michail Nikolaev) + § + + + + An \if command appearing within a false + (not-being-executed) \if branch was incorrectly + treated the same as \elif. + + + + + + + In pgbench, fix possible misdisplay of + progress messages during table initialization (Yushi Ogiwara, Tatsuo + Ishii, Fujii Masao) + § + § + + + + + + + Make pg_controldata more robust against + corrupted pg_control files (Ilyasov Ian, Anton + Voloshin) + § + + + + Since pg_controldata will attempt to + print the contents of pg_control even if the + CRC check fails, it must take care not to misbehave for invalid + field values. This patch fixes some issues triggered by invalid + timestamps and apparently-negative WAL segment sizes. + + + + + + + Fix possible crash in pg_dump with + identity sequences attached to tables that are extension members + (Tom Lane) + § + + + + + + + Fix memory leak in pg_restore + with zstd-compressed data (Tom Lane) + § + + + + The leak was per-decompression-operation, so would be most + noticeable with a dump containing many tables or large objects. + + + + + + + Fix pg_basebackup to correctly + handle pg_wal.tar files exceeding 2GB on + Windows (Davinder Singh, Thomas Munro) + § + § + + + + + + + Use SQL-standard function bodies in the declarations + of contrib/earthdistance's SQL-language + functions (Tom Lane, Ronan Dunklau) + § + + + + This change allows their references + to contrib/cube to be resolved during extension + creation, reducing the risk of search-path-based failures and + possible attacks. + + + + In particular, this restores their usability in contexts like + generated columns, for which PostgreSQL + v17 restricts the search path on security grounds. We have received + reports of databases failing to be upgraded to v17 because of that. + This patch has been included in v16 to provide a workaround: + updating the earthdistance extension to this + version beforehand should allow an upgrade to succeed. + + + + + + + Detect version mismatch + between contrib/pageinspect's SQL declarations + and the underlying shared library (Tomas Vondra) + § + + + + Previously, such a mismatch could result in a crash while + calling brin_page_items(). Instead throw an + error recommending updating the extension. + + + + + + + When trying to cancel a remote query + in contrib/postgres_fdw, re-issue the cancel + request a few times if it didn't seem to do anything (Tom Lane) + § + + + + This fixes a race condition where we might try to cancel a just-sent + query before the remote server has started to process it, so that + the initial cancel request is ignored. + + + + + + + Update configuration probes that determine the compiler switches + needed to access ARM CRC instructions (Tom Lane) + § + + + + On ARM platforms where the baseline CPU target lacks CRC + instructions, we need to supply a switch to + persuade the compiler to compile such instructions. Recent versions + of gcc reject the value we were trying, leading to silently falling + back to software CRC. + + + + + + + Fix meson build system to support old OpenSSL libraries on Windows + (Darek Slusarczyk) + § + + + + Add support for the legacy library + names ssleay32 + and libeay32. + + + + + + + In Windows builds using meson, ensure all libcommon and libpgport + functions are exported (Vladlen Popolitov, Heikki Linnakangas) + § + § + + + + This fixes unresolved external symbol build errors + for extensions. + + + + + + + Fix meson configuration process to correctly detect + OSSP's uuid.h header file under MSVC + (Andrew Dunstan) + § + + + + + + + When building with meson, install pgevent + in pkglibdir + not bindir (Peter Eisentraut) + § + + + + This matches the behavior of the make-based build system and the old + MSVC build system. + + + + + + + When building with meson, install sepgsql.sql + under share/contrib/ + not share/extension/ (Peter Eisentraut) + § + + + + This matches what the make-based build system does. + + + + + + + Update time zone data files to tzdata + release 2025a for DST law changes in Paraguay, plus historical + corrections for the Philippines (Tom Lane) + § + + + + + + + + + + Release 17.2 + + + Release date: + 2024-11-21 + + + + This release contains a few fixes from 17.1. + For information about new features in major release 17, see + . + + + + Migration to Version 17.2 + + + A dump/restore is not required for those running 17.X. + + + + However, if you are upgrading from a version earlier than 17.1, + see . + + + + + Changes + + + + + + + Repair ABI break for extensions that work with + struct ResultRelInfo (Tom Lane) + § + + + + Last week's minor releases unintentionally broke binary + compatibility with timescaledb and + several other extensions. Restore the affected structure to its + previous size, so that such extensions need not be rebuilt. + + + + + + + Restore functionality of ALTER {ROLE|DATABASE} SET + role (Tom Lane, Noah Misch) + § + + + + The fix for CVE-2024-10978 accidentally caused settings + for role to not be applied if they come from + non-interactive sources, including previous ALTER + {ROLE|DATABASE} commands and + the PGOPTIONS environment variable. + + + + + + + Fix cases where a logical replication + slot's restart_lsn could go backwards + (Masahiko Sawada) + § + + + + Previously, restarting logical replication could sometimes cause the + slot's restart point to be recomputed as an older value than had + previously been advertised + in pg_replication_slots. This is bad, + since for example WAL files might have been removed on the basis of + the later restart_lsn value, in which + case replication would fail to restart. + + + + + + + Avoid deleting still-needed WAL files + during pg_rewind + (Polina Bungina, Alexander Kukushkin) + § + + + + Previously, in unlucky cases, it was possible + for pg_rewind to remove important WAL + files from the rewound demoted primary. In particular this happens + if those files have been marked for archival (i.e., + their .ready files were created) but not yet + archived. Then the newly promoted node no longer has such files + because of them having been recycled, but likely they are needed + for recovery in the demoted node. + If pg_rewind removes them, recovery is + not possible anymore. + + + + + + + Fix race conditions associated with dropping shared statistics + entries (Kyotaro Horiguchi, Michael Paquier) + § + + + + These bugs could lead to loss of statistics data, assertion + failures, or can only drop stats once errors. + + + + + + + Count index scans in contrib/bloom indexes in + the statistics views, such as the + pg_stat_user_indexes.idx_scan + counter (Masahiro Ikeda) + § + + + + + + + Fix crash when checking to see if an index's opclass options have + changed (Alexander Korotkov) + § + + + + Some forms of ALTER TABLE would fail if the + table has an index with non-default operator class options. + + + + + + + Avoid assertion failure caused by disconnected NFA sub-graphs in + regular expression parsing (Tom Lane) + § + + + + This bug does not appear to have any visible consequences in + non-assert builds. + + + + + + + + + + Release 17.1 + + + Release date: + 2024-11-14 + + + + This release contains a variety of fixes from 17.0. + For information about new features in major release 17, see + . + + + + Migration to Version 17.1 + + + A dump/restore is not required for those running 17.X. + + + + However, if you have ever detached a partition from a partitioned + table that has a foreign-key reference to another partitioned table, + and not dropped the former partition, then you may have catalog and/or + data corruption to repair, as detailed in the fifth changelog entry + below. + + + + Also, in the uncommon case that a + database's LC_CTYPE setting is C + while its LC_COLLATE setting is some other locale, + indexes on textual columns should be reindexed, as described in the + sixth changelog entry below. + + + + + Changes + + + + + + + Ensure cached plans are marked as dependent on the calling role when + RLS applies to a non-top-level table reference (Nathan Bossart) + § + + + + If a CTE, subquery, sublink, security invoker view, or coercion + projection in a query references a table with row-level security + policies, we neglected to mark the resulting plan as potentially + dependent on which role is executing it. This could lead to later + query executions in the same session using the wrong plan, and then + returning or hiding rows that should have been hidden or returned + instead. + + + + The PostgreSQL Project thanks + Wolfgang Walther for reporting this problem. + (CVE-2024-10976) + + + + + + + Make libpq discard error messages + received during SSL or GSS protocol negotiation (Jacob Champion) + § + + + + An error message received before encryption negotiation is completed + might have been injected by a man-in-the-middle, rather than being + real server output. Reporting it opens the door to various security + hazards; for example, the message might spoof a query result that a + careless user could mistake for correct output. The best answer + seems to be to discard such data and rely only + on libpq's own report of the connection + failure. + + + + The PostgreSQL Project thanks + Jacob Champion for reporting this problem. + (CVE-2024-10977) + + + + + + + Fix unintended interactions between SET SESSION + AUTHORIZATION and SET ROLE (Tom Lane) + § + § + + + + The SQL standard mandates that SET SESSION + AUTHORIZATION have a side-effect of doing SET + ROLE NONE. Our implementation of that was flawed, + creating more interaction between the two settings than intended. + Notably, rolling back a transaction that had done SET + SESSION AUTHORIZATION would revert ROLE + to NONE even if that had not been the previous + state, so that the effective user ID might now be different from + what it had been before the transaction. Transiently + setting session_authorization in a + function SET clause had a similar effect. + A related bug was that if a parallel worker + inspected current_setting('role'), it + saw none even when it should see something else. + + + + The PostgreSQL Project thanks + Tom Lane for reporting this problem. + (CVE-2024-10978) + + + + + + + Prevent trusted PL/Perl code from changing environment variables + (Andrew Dunstan, Noah Misch) + § + § + § + + + + The ability to manipulate process environment variables such + as PATH gives an attacker opportunities to + execute arbitrary code. Therefore, trusted PLs must + not offer the ability to do that. To fix plperl, + replace %ENV with a tied hash that rejects any + modification attempt with a warning. + Untrusted plperlu retains the ability to change + the environment. + + + + The PostgreSQL Project thanks + Coby Abrams for reporting this problem. + (CVE-2024-10979) + + + + + + + Fix updates of catalog state for foreign-key constraints when + attaching or detaching table partitions (Jehan-Guillaume de + Rorthais, Tender Wang, Ãlvaro Herrera) + § + § + + + + If the referenced table is partitioned, then different catalog + entries are needed for a referencing table that is stand-alone + versus one that is a partition. ATTACH/DETACH + PARTITION commands failed to perform this conversion + correctly. In particular, after DETACH the now + stand-alone table would be missing foreign-key enforcement triggers, + which could result in the table later containing rows that fail the + foreign-key constraint. A subsequent re-ATTACH + could fail with surprising errors, too. + + + + The way to fix this is to do ALTER TABLE DROP + CONSTRAINT on the now stand-alone table for each faulty + constraint, and then re-add the constraint. If re-adding the + constraint fails, then some erroneous data has crept in. You will + need to manually re-establish consistency between the referencing + and referenced tables, then re-add the constraint. + + + + This query can be used to identify broken constraints and construct + the commands needed to recreate them: + +SELECT conrelid::pg_catalog.regclass AS "constrained table", + conname AS constraint, + confrelid::pg_catalog.regclass AS "references", + pg_catalog.format('ALTER TABLE %s DROP CONSTRAINT %I;', + conrelid::pg_catalog.regclass, conname) AS "drop", + pg_catalog.format('ALTER TABLE %s ADD CONSTRAINT %I %s;', + conrelid::pg_catalog.regclass, conname, + pg_catalog.pg_get_constraintdef(oid)) AS "add" +FROM pg_catalog.pg_constraint c +WHERE contype = 'f' AND conparentid = 0 AND + (SELECT count(*) FROM pg_catalog.pg_constraint c2 + WHERE c2.conparentid = c.oid) <> + (SELECT count(*) FROM pg_catalog.pg_inherits i + WHERE (i.inhparent = c.conrelid OR i.inhparent = c.confrelid) AND + EXISTS (SELECT 1 FROM pg_catalog.pg_partitioned_table + WHERE partrelid = i.inhparent)); + + Since it is possible that one or more of the ADD + CONSTRAINT steps will fail, you should save the query's + output in a file and then attempt to perform each step. + + + + + + + Fix test for C locale + when LC_COLLATE is different + from LC_CTYPE (Jeff Davis) + § + + + + When using libc as the default collation + provider, the test to see if C locale is in use + for collation accidentally checked LC_CTYPE + not LC_COLLATE. This has no impact in the + typical case where those settings are the same, nor if both are + not C (nor its alias POSIX). + However, if LC_CTYPE is C + while LC_COLLATE is some other locale, wrong + query answers could ensue, and corruption of indexes on strings was + possible. Users of databases with such settings should reindex + affected indexes after installing this update. + The converse case with LC_COLLATE + being C while LC_CTYPE is some + other locale would cause performance degradation, but no actual + errors. + + + + + + + Don't use partitionwise joins or grouping if the query's collation + for the key column doesn't match the partition key's collation (Jian + He, Webbo Han) + § + § + + + + Such plans could produce incorrect results. + + + + + + + Avoid planner failure after converting an IS NULL + test on a NOT NULL column to + constant FALSE (Richard Guo) + § + + + + This bug typically led to errors such as variable not found + in subplan target lists. + + + + + + + Avoid possible planner crash while inlining a SQL function whose + arguments contain certain array-related constructs (Tom Lane, Nathan + Bossart) + § + + + + + + + Fix possible wrong answers or wrong varnullingrels + planner errors for MERGE ... WHEN NOT MATCHED BY + SOURCE actions (Dean Rasheed) + § + § + + + + + + + Fix possible could not find pathkey item to sort + error when the output of a UNION ALL member query + needs to be sorted, and the sort column is an expression (Andrei + Lepikhov, Tom Lane) + § + + + + + + + Fix edge case in B-tree ScalarArrayOp index scans (Peter Geoghegan) + § + + + + When a scrollable cursor with a plan of this kind was backed up to its + starting point and then run forward again, wrong answers were + possible. + + + + + + + Fix assertion failure or confusing error message for COPY + (query) TO ..., when + the query is rewritten by a DO + INSTEAD NOTIFY rule (Tender Wang, Tom Lane) + § + + + + + + + Fix validation + of COPY's FORCE_NOT_NULL + and FORCE_NULL options (Joel Jacobson) + § + + + + Some incorrect usages are now rejected as they should be. + + + + + + + Fix server crash when a json_objectagg() call + contains a volatile function (Amit Langote) + § + + + + + + + Fix detection of skewed data during parallel hash join (Thomas + Munro) + § + + + + After repartitioning the inner side of a hash join because one + partition has accumulated too many tuples, we check to see if all + the partition's tuples went into the same child partition, which + suggests that they all have the same hash value and further + repartitioning cannot improve matters. This check malfunctioned in + some cases, allowing repeated futile repartitioning which would + eventually end in a resource-exhaustion error. + + + + + + + Avoid crash when ALTER DATABASE SET is used to + set a server parameter that requires search-path-based lookup, such + as default_text_search_config (Jeff Davis) + § + + + + + + + Avoid repeated lookups of opclasses and collations while creating a + new index on a partitioned table (Tom Lane) + § + + + + This was problematic mainly because some of the lookups would be + done with a restricted search_path, leading to + unexpected failures if the CREATE INDEX command + referenced objects outside pg_catalog. + + + + This fix also prevents comments on the parent partitioned index from + being copied to child indexes. + + + + + + + Add missing dependency from a partitioned table to a non-built-in + access method specified in CREATE TABLE ... USING + (Michael Paquier) + § + + + + Dropping the access method should be blocked when a table exists + that depends on it, but it was not, allowing subsequent odd + behavior. Note that this fix only prevents problems for partitioned + tables created after this update. + + + + + + + Disallow locale names containing non-ASCII characters (Thomas Munro) + § + + + + This is only an issue on Windows, as such locale names are not used + elsewhere. They are problematic because it's quite unclear what + encoding such names are represented in (since the locale itself + defines the encoding to use). In + recent PostgreSQL releases, an abort in + the Windows runtime library could occur because of confusion about + that. + + + + Anyone who encounters the new error message should either create a + new duplicated locale with an ASCII-only name using Windows Locale + Builder, or consider using BCP 47-compliant locale names + like tr-TR. + + + + + + + Fix race condition in committing a serializable transaction (Heikki + Linnakangas) + § + + + + Mis-processing of a recently committed transaction could lead to an + assertion failure or a could not access status of + transaction error. + + + + + + + Fix race condition in COMMIT PREPARED + that resulted in orphaned 2PC files (wuchengwen) + § + + + + A concurrent PREPARE TRANSACTION could + cause COMMIT PREPARED to not remove the on-disk + two-phase state file for the completed transaction. There was no + immediate ill effect, but a subsequent crash-and-recovery could fail + with could not access status of transaction, + requiring manual removal of the orphaned file to restore service. + + + + + + + Avoid invalid memory accesses after skipping an invalid toast index + during VACUUM FULL (Tender Wang) + § + + + + A list tracking yet-to-be-rebuilt indexes was not properly updated + in this code path, risking assertion failures or crashes later on. + + + + + + + Fix ways in which an in place catalog update could be + lost (Noah Misch) + § + § + § + § + § + § + § + + + + Normal row updates write a new version of the row to preserve + rollback-ability of the transaction. However, certain system + catalog updates are intentionally non-transactional and are done + with an in-place update of the row. These patches fix race + conditions that could cause the effects of an in-place update to be + lost. As an example, it was possible to forget having set + pg_class.relhasindex + to true, preventing updates of the new index and thus causing index + corruption. + + + + + + + Reset catalog caches at end of recovery (Noah Misch) + § + + + + This prevents scenarios wherein an in-place catalog update could be + lost due to using stale data from a catalog cache. + + + + + + + Avoid using parallel query while holding off interrupts + (Francesco Degrassi, Noah Misch, Tom Lane) + § + § + + + + This situation cannot arise normally, but it can be reached with + test scenarios such as using a SQL-language function as B-tree + support (which would be far too slow for production usage). If it + did occur it would result in an indefinite wait. + + + + + + + Ignore not-yet-defined Portals in + the pg_cursors view (Tom Lane) + § + + + + It is possible for user-defined code that inspects this view to be + called while a new cursor is being set up, and if that happens a + null pointer dereference would ensue. Avoid the problem by defining + the view to exclude incompletely-set-up cursors. + + + + + + + Avoid unexpected table_index_fetch_tuple call during logical + decoding error while decoding a transaction involving + insertion of a column default value (Takeshi Ideriha, Hou Zhijie) + § + § + + + + + + + Reduce memory consumption of logical decoding (Masahiko Sawada) + § + + + + Use a smaller default block size to store tuple data received during + logical replication. This reduces memory wastage, which has been + reported to be severe while processing long-running transactions, + even leading to out-of-memory failures. + + + + + + + Fix behavior of stable functions called from + a CALL statement's argument list, when + the CALL is within a + PL/pgSQL EXCEPTION block (Tom Lane) + § + + + + As with a similar fix in our previous quarterly releases, this case + allowed such functions to be passed the wrong snapshot, causing them + to see stale values of rows modified since the start of the outer + transaction. + + + + + + + Parse libpq's keepalives + connection option in the same way as other integer-valued options + (Yuto Sasaki) + § + + + + The coding used here rejected trailing whitespace in the option + value, unlike other cases. This turns out to be problematic + in ecpg's usage, for example. + + + + + + + In ecpglib, fix out-of-bounds read when + parsing incorrect datetime input (Bruce Momjian, Pavel Nekrasov) + § + + + + It was possible to try to read the location just before the start of + a constant array. Real-world consequences seem minimal, though. + + + + + + + Fix psql's describe commands to again + work with pre-9.4 servers (Tom Lane) + § + + + + Commands involving display of an ACL (permissions) column failed + with very old PostgreSQL servers, due to + use of a function not present in those versions. + + + + + + + Avoid hanging if an interval less than 1ms is specified + in psql's \watch + command (Andrey Borodin, Michael Paquier) + § + + + + Instead, treat this the same as an interval of zero (no wait between + executions). + + + + + + + Fix failure to find replication password + in ~/.pgpass (Tom Lane) + § + + + + pg_basebackup + and pg_receivewal failed to match an entry + in ~/.pgpass that + had replication in the database name field, if + no or switch was + supplied. This resulted in an unexpected prompt for password. + + + + + + + In pg_combinebackup, throw an error if an + incremental backup file is present in a directory that is supposed to + contain a full backup (Robert Haas) + § + + + + + + + In pg_combinebackup, don't construct + filenames containing double slashes (Robert Haas) + § + + + + This caused no functional problems, but the duplicate slashes were + visible in error messages, which could create confusion. + + + + + + + Avoid trying to reindex temporary tables and indexes + in vacuumdb and in + parallel reindexdb (VaibhaveS, Michael + Paquier, Fujii Masao, Nathan Bossart) + § + § + § + + + + Reindexing other sessions' temporary tables cannot work, but the + check to skip them was missing in some code paths, leading to + unwanted failures. + + + + + + + Fix incorrect LLVM-generated code on ARM64 platforms (Thomas + Munro, Anthonin Bonnefoy) + § + + + + When using JIT compilation on ARM platforms, the generated code + could not support relocation distances exceeding 32 bits, allowing + unlucky placement of generated code to cause server crashes on + large-memory systems. + + + + + + + Fix a few places that assumed that process start time (represented + as a time_t) will fit into a long value + (Max Johnson, Nathan Bossart) + § + + + + On platforms where long is 32 bits (notably Windows), + this coding would fail after Y2038. Most of the failures appear + only cosmetic, but notably pg_ctl start would + hang. + + + + + + + Update time zone data files to tzdata + release 2024b (Tom Lane) + § + § + + + + This tzdata release changes the old + System-V-compatibility zone names to duplicate the corresponding + geographic zones; for example PST8PDT is now an + alias for America/Los_Angeles. The main visible + consequence is that for timestamps before the introduction of + standardized time zones, the zone is considered to represent local + mean solar time for the named location. For example, + in PST8PDT, timestamptz input such + as 1801-01-01 00:00 would previously have been + rendered as 1801-01-01 00:00:00-08, but now it is + rendered as 1801-01-01 00:00:00-07:52:58. + + + + Also, historical corrections for Mexico, Mongolia, and Portugal. + Notably, Asia/Choibalsan is now an alias + for Asia/Ulaanbaatar rather than being a separate + zone, mainly because the differences between those zones were found to + be based on untrustworthy data. + + + + + + + + + + Release 17 + + + Release date: + 2024-09-26 + + + + Overview + + + PostgreSQL 17 contains many new features + and enhancements, including: + + + + + + New memory management system for VACUUM, which reduces + memory consumption and can improve overall vacuuming performance. + + + + + + New SQL/JSON capabilities, including constructors, + identity functions, and the JSON_TABLE() + function, which converts JSON data into a table representation. + + + + + + Various query performance improvements, including for sequential reads + using streaming I/O, write throughput under high concurrency, and + searches over multiple values in a btree + index. + + + + + + Logical replication enhancements, including: + + + + Failover control + + + + + pg_createsubscriber, + a utility that creates logical replicas from physical standbys + + + + + pg_upgrade now + preserves logical replication slots on publishers and full + subscription state on subscribers. This will allow upgrades + to future major versions to continue logical replication without + requiring copy to resynchronize. + + + + + + + + + New client-side connection option, sslnegotiation=direct, + that performs a direct TLS handshake to avoid a round-trip negotiation. + + + + + + pg_basebackup + now supports incremental backup. + + + + + + COPY adds a new option, + ON_ERROR ignore, that allows a copy operation to + continue in the event of an error. + + + + + + The above items and other new features of + PostgreSQL 17 are explained in more detail + in the sections below. + + + + + + + Migration to Version 17 + + + A dump/restore using or use of + or logical replication is required for + those wishing to migrate data from any previous release. See for general information on migrating to new + major releases. + + + + Version 17 contains a number of changes that may affect compatibility + with previous releases. Observe the following incompatibilities: + + + + + + + + + Change functions to use a safe + during maintenance operations (Jeff Davis) + § + § + + + + This prevents maintenance operations (ANALYZE, + CLUSTER, CREATE + INDEX, CREATE + MATERIALIZED VIEW, REFRESH + MATERIALIZED VIEW, REINDEX, + or VACUUM) from performing unsafe access. + Functions used by expression indexes and materialized views that + need to reference non-default schemas must specify a search path + during function creation. + + + + + + + + Restrict ago to only appear at the end in + interval values (Joseph Koshakow) + § + § + + + + Also, prevent empty interval units from appearing multiple times. + + + + + + + + Remove server variable old_snapshot_threshold (Thomas Munro) + § + + + + This variable allowed vacuum to remove rows that potentially could + be still visible to running transactions, causing "snapshot too + old" errors later if accessed. This feature might be re-added + to PostgreSQL later if an improved + implementation is found. + + + + + + + + Change SET + SESSION AUTHORIZATION handling of the initial + session user's superuser status (Joseph Koshakow) + § + + + + The new behavior is based on the session user's superuser status at + the time the SET SESSION AUTHORIZATION command + is issued, rather than their superuser status at connection time. + + + + + + + + Remove feature which simulated per-database users (Nathan Bossart) + § + + + + The feature, db_user_namespace, was rarely used. + + + + + + + + Remove adminpack contrib extension + (Daniel Gustafsson) + § + + + + This was used by now end-of-life pgAdmin + III. + + + + + + + + Remove value + fsync_writethrough on Windows (Thomas Munro) + § + + + + This value was the same as fsync on Windows. + + + + + + + + Change file boundary handling of two WAL file + name functions (Kyotaro Horiguchi, Andres Freund, Bruce Momjian) + § + + + + The functions pg_walfile_name() + and pg_walfile_name_offset() used to report + the previous LSN segment number when the + LSN was on a file segment boundary; it now + returns the current LSN segment. + + + + + + + + Remove server variable trace_recovery_messages + since it is no longer needed (Bharath Rupireddy) + § + + + + + + + + Remove information schema column + element_types.domain_default + (Peter Eisentraut) + § + + + + + + + + Change + lock mode output labels (Bruce Momjian) + § + + + + + + + + Remove buffers_backend and + buffers_backend_fsync from pg_stat_bgwriter + (Bharath Rupireddy) + § + + + + These fields are considered redundant to similar columns in pg_stat_io. + + + + + + + + Rename I/O block read/write timing statistics columns of + + (Nazir Bilal Yavuz) + § + + + + This renames blk_read_time + to shared_blk_read_time, + and blk_write_time to + shared_blk_write_time. + + + + + + + + Change pg_attribute.attstattarget + and + pg_statistic_ext.stxstattarget + to represent the default statistics target as NULL + (Peter Eisentraut) + § + § + + + + + + + + Rename pg_collation.colliculocale + to colllocale and + pg_database.daticulocale + to datlocale (Jeff Davis) + § + + + + + + + + Rename pg_stat_progress_vacuum + column max_dead_tuples + to max_dead_tuple_bytes, + rename num_dead_tuples to + num_dead_item_ids, and add + dead_tuple_bytes (Masahiko Sawada) + § + § + + + + + + + + Rename SLRU columns in system view pg_stat_slru + (Alvaro Herrera) + § + + + + The column names accepted by pg_stat_reset_slru() + are also changed. + + + + + + + + + Changes + + + Below you will find a detailed account of the changes between + PostgreSQL 17 and the previous major + release. + + + + Server + + + Optimizer + + + + + + + + Allow the optimizer to improve CTE plans by + considering the statistics and sort order of columns referenced in earlier row + output clauses (Jian Guo, Richard Guo, Tom Lane) + § + § + + + + + + + + Improve optimization of IS NOT NULL and + IS NULL query restrictions (David Rowley, + Richard Guo, Andy Fan) + § + § + + + + Remove IS NOT NULL restrictions from queries on + NOT NULL columns and eliminate scans on + NOT NULL columns if IS NULL + is specified. + + + + + + + + Allow partition pruning on boolean columns on IS [NOT] + UNKNOWN conditionals (David Rowley) + § + + + + + + + + Improve optimization of range values when using containment + operators <@ and @> (Kim Johan Andersson, Jian He) + § + + + + + + + + Allow correlated IN subqueries to be transformed + into joins (Andy Fan, Tom Lane) + § + + + + + + + + Improve optimization of the LIMIT clause + on partitioned tables, inheritance parents, and UNION + ALL queries (Andy Fan, David Rowley) + § + + + + + + + + Allow query nodes to be run in parallel in more cases (Tom Lane) + § + + + + + + + + Allow GROUP BY columns to be internally + ordered to match ORDER BY (Andrei Lepikhov, + Teodor Sigaev) + § + + + + This can be disabled using server variable + . + + + + + + + + Allow UNION (without ALL) + to use MergeAppend (David Rowley) + § + + + + + + + + Fix MergeAppend plans to more accurately compute the number of + rows that need to be sorted (Alexander Kuzmenkov) + § + + + + + + + + Allow GiST and SP-GiST indexes to be part of incremental + sorts (Miroslav Bendik) + § + + + + This is particularly useful for ORDER BY + clauses where the first column has a GiST and SP-GiST index, + and other columns do not. + + + + + + + + Add columns to pg_stats + to report range-type histogram information (Egor Rogov, Soumyadeep + Chakraborty) + § + + + + + + + + + Indexes + + + + + + + Allow btree indexes to more + efficiently find a set of values, such as those supplied by + IN clauses using constants (Peter Geoghegan, + Matthias van de Meent) + § + + + + + + + + Allow BRIN indexes + to be created using parallel workers (Tomas Vondra, Matthias van + de Meent) + § + + + + + + + + + General Performance + + + + + + + + Allow vacuum to more efficiently remove and freeze tuples (Melanie + Plageman, Heikki Linnakangas) + § + + + + WAL traffic caused by vacuum is also more + compact. + + + + + + + + Allow vacuum to more efficiently store tuple references (Masahiko + Sawada, John Naylor) + § + § + § + § + + + + Additionally, vacuum is no longer silently limited to one gigabyte + of memory when or are higher. + + + + + + + + Optimize vacuuming of relations with no indexes (Melanie Plageman) + § + + + + + + + + Increase default + to 2MB (Thomas Munro) + § + + + + + + + + Improve performance when checking roles with many memberships + (Nathan Bossart) + § + + + + + + + + Improve performance of heavily-contended WAL + writes (Bharath Rupireddy) + § + + + + + + + + Improve performance when transferring large blocks of data to a + client (Melih Mutlu) + § + + + + + + + + Allow the grouping of file system reads with the new system variable + (Thomas Munro, Andres Freund, + Melanie Plageman, Nazir Bilal Yavuz) + § + § + § + + + + + + + + + Monitoring + + + + + + + + Create system view pg_stat_checkpointer + (Bharath Rupireddy, Anton A. Melnikov, Alexander Korotkov) + § + § + § + + + + Relevant columns have been removed from pg_stat_bgwriter + and added to this new system view. + + + + + + + + Improve control over resetting statistics (Atsushi Torikoshi, + Bharath Rupireddy) + § + § + § + + + + Allow pg_stat_reset_shared() + (with no arguments) and + pg_stat_reset_shared(NULL) to reset all + shared statistics. Allow pg_stat_reset_shared('slru') and pg_stat_reset_slru() + (with no arguments) to reset SLRU statistics, + which was already possible with pg_stat_reset_slru(NULL). + + + + + + + + Add log messages related to WAL recovery from + backups (Andres Freund) + § + + + + + + + + Add log line for + trust connections (Jacob Champion) + § + + + + + + + + Add log message to report walsender acquisition and release of + replication slots (Bharath Rupireddy) + § + + + + This is enabled by the server variable . + + + + + + + + Add system view pg_wait_events + that reports wait event types (Bertrand Drouvot) + § + + + + This is useful for adding descriptions + to wait events reported in pg_stat_activity. + + + + + + + + Add wait events for + checkpoint delays (Thomas Munro) + § + + + + + + + + Allow vacuum to report the progress of index processing (Sami + Imseih) + § + + + + This appears in system view pg_stat_progress_vacuum + columns indexes_total and + indexes_processed. + + + + + + + + + Privileges + + + + + + + + Allow granting the right to perform maintenance operations + (Nathan Bossart) + § + + + + The permission can be granted on a per-table basis using the MAINTAIN + privilege and on a per-role basis via the pg_maintain + predefined role. Permitted operations are + VACUUM, ANALYZE, + REINDEX, REFRESH MATERIALIZED + VIEW, CLUSTER, and LOCK + TABLE. + + + + + + + + Allow roles with pg_monitor + membership to execute pg_current_logfile() + (Pavlo Golub, Nathan Bossart) + § + + + + + + + + + Server Configuration + + + + + + + + Add system variable + to disallow ALTER + SYSTEM (Jelte Fennema-Nio, Gabriele Bartolini) + § + + + + + + + + Allow ALTER + SYSTEM to set unrecognized custom server variables + (Tom Lane) + § + + + + This is also possible with GRANT + ON PARAMETER. + + + + + + + + Add server variable to + restrict the duration of transactions (Andrey Borodin, Japin Li, + Junwang Zhao, Alexander Korotkov) + § + § + § + + + + + + + + Add a builtin platform-independent collation provider (Jeff Davis) + § + § + § + § + + + + This supports C and C.UTF-8 + collations. + + + + + + + + Add server variable to + report the use of huge pages by Postgres (Justin Pryzby) + § + + + + This is useful when is set to + try. + + + + + + + + Add server variable to disable event triggers (Daniel Gustafsson) + § + + + + The setting, , allows for the + temporary disabling of event triggers for debugging. + + + + + + + + Allow the SLRU + cache sizes to be configured (Andrey Borodin, Dilip Kumar, + Alvaro Herrera) + § + + + + The new server variables are , + , + , + , , , and + . , , and scale up automatically with + . + + + + + + + + + Streaming Replication and Recovery + + + + + + + + Add support for incremental file system backup (Robert Haas, + Jakub Wartak, Tomas Vondra) + § + § + + + + Incremental backups can be created using pg_basebackup's + new + option. The new application pg_combinebackup + allows manipulation of base and incremental file system backups. + + + + + + + + Allow the creation of WAL summarization files + (Robert Haas, Nathan Bossart, Hubert Depesz Lubaczewski) + § + § + § + § + + + + These files record the block numbers that have changed within an + LSN + range and are useful for incremental file + system backups. This is controlled by the server + variables and , and introspected with pg_available_wal_summaries(), + pg_wal_summary_contents(), and + pg_get_wal_summarizer_state(). + + + + + + + + Add the system identifier to file system backup manifest files + (Amul Sul) + § + + + + This helps detect invalid WAL usage. + + + + + + + + Allow connection string value + dbname to be written when pg_basebackup + writes connection information to + postgresql.auto.conf (Vignesh C, Hayato Kuroda) + § + + + + + + + + Add column pg_replication_slots.invalidation_reason + to report the reason for invalid slots (Shveta Malik, Bharath + Rupireddy) + § + § + + + + + + + + Add column pg_replication_slots.inactive_since + to report slot inactivity duration (Bharath Rupireddy) + § + § + § + + + + + + + + Add function pg_sync_replication_slots() + to synchronize logical replication slots (Hou Zhijie, Shveta Malik, + Ajin Cherian, Peter Eisentraut) + § + § + + + + + + + + Add the failover property to the replication protocol (Hou + Zhijie, Shveta Malik) + § + + + + + + + + + <link linkend="logical-replication">Logical Replication</link> + + + + + + + + Add application pg_createsubscriber + to create a logical replica from a physical standby server + (Euler Taveira) + § + + + + + + + + Have pg_upgrade + migrate valid logical slots and subscriptions (Hayato Kuroda, + Hou Zhijie, Vignesh C, Julien Rouhaud, Shlok Kyal) + § + § + + + + This allows logical replication to continue + quickly after the upgrade. This only works for old + PostgreSQL clusters that are version + 17 or later. + + + + + + + + Enable the failover of logical slots + (Hou Zhijie, Shveta Malik, Ajin Cherian) + § + + + + This is controlled by an optional fifth argument to pg_create_logical_replication_slot(). + + + + + + + + Add server variable + to enable failover logical slot synchronization (Shveta Malik, + Hou Zhijie, Peter Smith) + § + § + + + + + + + + Add logical replication failover control to CREATE/ALTER + SUBSCRIPTION (Shveta Malik, Hou Zhijie, Ajin + Cherian) + § + § + + + + + + + + Allow the application of logical replication changes to use + hash indexes on the subscriber + (Hayato Kuroda) + § + + + + Previously only btree indexes could + be used for this purpose. + + + + + + + + Improve logical decoding + performance in cases where there are many subtransactions + (Masahiko Sawada) + § + + + + + + + + Restart apply workers if subscription owner's superuser privileges + are revoked (Vignesh C) + § + + + + This forces reauthentication. + + + + + + + + Add flush option to pg_logical_emit_message() + (Michael Paquier) + § + + + + This makes the message durable. + + + + + + + + Allow specification of physical standbys that must be synchronized + before they are visible to subscribers (Hou Zhijie, Shveta Malik) + § + § + + + + The new server variable is . + + + + + + + + Add worker type column to pg_stat_subscription + (Peter Smith) + § + + + + + + + + + + + Utility Commands + + + + + + + + Add new COPY + option ON_ERROR ignore to discard error rows + (Damir Belyalov, Atsushi Torikoshi, Alex Shulgin, Jian He, Yugo + Nagata) + § + § + § + § + + + + The default behavior is ON_ERROR stop. + + + + + + + + Add new COPY option + LOG_VERBOSITY which reports COPY + FROM ignored error rows (Bharath Rupireddy) + § + + + + + + + + Allow COPY FROM to report the number of skipped + rows during processing (Atsushi Torikoshi) + § + + + + This appears in system view column pg_stat_progress_copy.tuples_skipped. + + + + + + + + In COPY FROM, allow easy specification that all + columns should be forced null or not null (Zhang Mingli) + § + + + + + + + + Allow partitioned tables to have identity columns (Ashutosh Bapat) + § + + + + + + + + Allow exclusion + constraints on partitioned tables (Paul A. Jungwirth) + § + + + + As long as exclusion constraints compare partition key columns + for equality, other columns can use exclusion constraint-specific + comparisons. + + + + + + + + Add clearer ALTER + TABLE method to set a column to the default + statistics target (Peter Eisentraut) + § + + + + The new syntax is ALTER TABLE ... SET STATISTICS + DEFAULT; using SET STATISTICS -1 + is still supported. + + + + + + + + Allow ALTER TABLE to change a column's generation + expression (Amul Sul) + § + + + + The syntax is ALTER TABLE ... ALTER COLUMN ... SET + EXPRESSION. + + + + + + + + Allow specification of table access + methods on partitioned tables (Justin Pryzby, Soumyadeep + Chakraborty, Michael Paquier) + § + § + + + + + + + + Add DEFAULT setting for ALTER TABLE + .. SET ACCESS METHOD (Michael Paquier) + § + + + + + + + + Add support for event + triggers that fire at connection time (Konstantin Knizhnik, + Mikhail Gribkov) + § + + + + + + + + Add event trigger support for REINDEX (Garrett + Thornburg, Jian He) + § + + + + + + + + Allow parenthesized syntax for CLUSTER options if + a table name is not specified (Nathan Bossart) + § + + + + + + + <link linkend="sql-explain"><command>EXPLAIN</command></link> + + + + + + + + Allow EXPLAIN to report + optimizer memory usage (Ashutosh Bapat) + § + + + + The option is called MEMORY. + + + + + + + + Add EXPLAIN option SERIALIZE + to report the cost of converting data for network transmission + (Stepan Rutz, Matthias van de Meent) + § + + + + + + + + Add local I/O block read/write timing statistics to + EXPLAIN's BUFFERS output + (Nazir Bilal Yavuz) + § + + + + + + + + Improve EXPLAIN's display of SubPlan nodes and + output parameters (Tom Lane, Dean Rasheed) + § + + + + + + + + Add JIT deform_counter + details to EXPLAIN (Dmitry Dolgov) + § + + + + + + + + + + + Data Types + + + + + + + + Allow the interval data type to support + +/-infinity values (Joseph Koshakow, Jian He, + Ashutosh Bapat) + § + + + + + + + + Allow the use of an ENUM added via ALTER TYPE if + the type was created in the same transaction (Tom Lane) + § + + + + This was previously disallowed. + + + + + + + + + <link linkend="sql-merge">MERGE</link> + + + + + + + + + Allow MERGE to modify updatable views (Dean + Rasheed) + § + + + + + + + + Add WHEN NOT MATCHED BY SOURCE to + MERGE (Dean Rasheed) + § + + + + WHEN NOT MATCHED on target rows was already + supported. + + + + + + + + Allow MERGE to use the + RETURNING clause (Dean Rasheed) + § + + + + The new RETURNING function + merge_action() reports on the + DML that generated the row. + + + + + + + + + Functions + + + + + + + + Add function JSON_TABLE() + to convert JSON data to a table representation (Nikita + Glukhov, Teodor Sigaev, Oleg Bartunov, Alexander Korotkov, Andrew + Dunstan, Amit Langote, Jian He) + § + § + + + + This function can be used in the FROM clause of + SELECT queries as a tuple source. + + + + + + + + Add SQL/JSON constructor functions JSON(), + JSON_SCALAR(), and + JSON_SERIALIZE() (Nikita Glukhov, Teodor Sigaev, + Oleg Bartunov, Alexander Korotkov, Andrew Dunstan, Amit Langote) + § + + + + + + + + Add SQL/JSON query functions JSON_EXISTS(), + JSON_QUERY(), and + JSON_VALUE() (Nikita Glukhov, Teodor Sigaev, + Oleg Bartunov, Alexander Korotkov, Andrew Dunstan, Amit Langote, + Peter Eisentraut, Jian He) + § + § + § + § + § + + + + + + + + Add jsonpath + methods to convert JSON values to other + JSON data types (Jeevan Chalke) + § + + + + The jsonpath methods are .bigint(), + .boolean(), .date(), + .decimal([precision [, scale]]), + .integer(), .number(), + .string(), .time(), + .time_tz(), .timestamp(), + and .timestamp_tz(). + + + + + + + + Add to_timestamp() + time zone format specifiers (Tom Lane) + § + + + + TZ accepts time zone abbreviations or numeric + offsets, while OF accepts only numeric offsets. + + + + + + + + Allow the session time zone + to be specified by AT LOCAL (Vik Fearing) + § + + + + This is useful when converting adding and removing time zones from + time stamps values, rather than specifying the literal session + time zone. + + + + + + + + Add functions uuid_extract_timestamp() + and uuid_extract_version() to return + UUID information (Andrey Borodin) + § + + + + + + + + Add functions to generate random numbers in a specified range + (Dean Rasheed) + § + + + + The functions are random(min, + max) and they take values of type + integer, bigint, and numeric. + + + + + + + + Add functions to convert integers to binary and octal strings + (Eric Radman, Nathan Bossart) + § + + + + The functions are to_bin() + and to_oct(). + + + + + + + + Add Unicode informational functions (Jeff Davis) + § + + + + Function unicode_version() + returns the Unicode version, + icu_unicode_version() + returns the ICU version, and + unicode_assigned() returns if the characters + are assigned Unicode codepoints. + + + + + + + + Add function xmltext() + to convert text to a single XML text node (Jim Jones) + § + + + + + + + + Add function to_regtypemod() + to return the type modifier of a type specification (David Wheeler, + Erik Wienhold) + § + + + + + + + + Add pg_basetype() + function to return a domain's base type (Steve Chavez) + § + + + + + + + + Add function pg_column_toast_chunk_id() + to return a value's TOAST identifier + (Yugo Nagata) + § + + + + This returns NULL if the value is not stored + in TOAST. + + + + + + + + + <link linkend="plpgsql">PL/pgSQL</link> + + + + + + + + Allow plpgsql %TYPE + and %ROWTYPE specifications to represent arrays + of non-array types (Quan Zongliang, Pavel Stehule) + § + + + + + + + + Allow plpgsql %TYPE specification to reference + composite column (Tom Lane) + § + + + + + + + + + <link linkend="libpq">libpq</link> + + + + + + + + Add libpq function to change role passwords (Joe Conway) + § + + + + The new function, PQchangePassword(), + hashes the new password before sending it to the server. + + + + + + + + Add libpq functions to close portals and prepared statements + (Jelte Fennema-Nio) + § + + + + The functions are PQclosePrepared(), + PQclosePortal(), + PQsendClosePrepared(), + and PQsendClosePortal(). + + + + + + + + Add libpq API which allows for blocking and + non-blocking cancel requests, + with encryption if already in use (Jelte Fennema-Nio) + § + + + + Previously only blocking, unencrypted cancel requests were supported. + + + + + + + + Add libpq function PQsocketPoll() + to allow polling of network sockets (Tristan Partin, Tom Lane) + § + § + + + + + + + + Add libpq function PQsendPipelineSync() + to send a pipeline synchronization point (Anton Kirilov) + § + + + + This is similar to PQpipelineSync() + but it does not flush to the server unless the size threshold of + the output buffer is reached. + + + + + + + + Add libpq function PQsetChunkedRowsMode() + to allow retrieval of results in chunks (Daniel Vérité) + § + + + + + + + + Allow TLS connections without requiring a + network round-trip negotiation (Greg Stark, Heikki Linnakangas, + Peter Eisentraut, Michael Paquier, Daniel Gustafsson) + § + § + § + § + § + § + § + § + + + + This is enabled with the client-side option sslnegotiation=direct, + requires ALPN, and only works on + PostgreSQL 17 and later servers. + + + + + + + + + <xref linkend="app-psql"/> + + + + + + + + Improve psql display of default and + empty privileges (Erik Wienhold, Laurenz Albe) + § + + + + Command \dp now displays (none) + for empty privileges; default still displays as empty. + + + + + + + + Have backslash commands honor \pset null (Erik + Wienhold, Laurenz Albe) + § + + + + Previously \pset null was ignored. + + + + + + + + Allow psql's \watch + to stop after a minimum number of rows returned (Greg Sabino Mullane) + § + + + + The parameter is min_rows. + + + + + + + + Allow psql connection attempts to be + canceled with control-C (Tristan Partin) + § + + + + + + + + Allow psql to honor + FETCH_COUNT for non-SELECT + queries (Daniel Vérité) + § + + + + + + + + Improve psql tab completion (Dagfinn + Ilmari Mannsåker, Gilles Darold, Christoph Heiss, Steve Chavez, + Vignesh C, Pavel Borisov, Jian He) + § + § + § + § + § + § + § + § + + + + + + + + + Server Applications + + + + + + + + Add application pg_walsummary + to dump WAL summary files (Robert Haas) + § + + + + + + + + Allow pg_dump's + large objects to be restorable in batches (Tom Lane) + § + + + + This allows the restoration of many large objects to avoid + transaction limits and to be restored in parallel. + + + + + + + + Add pg_dump option + (Ayush Vatsa) + § + + + + + + + + Allow pg_dump, pg_dumpall, + and pg_restore + to specify include/exclude objects in a file (Pavel Stehule, + Daniel Gustafsson) + § + + + + The option is called . + + + + + + + + Add the parameter to several client + applications (Justin Pryzby, Nathan Bossart) + § + + + + The applications are initdb, pg_basebackup, + pg_checksums, + pg_dump, + pg_rewind, + and pg_upgrade. + + + + + + + + Add pg_restore + option to allow object restores + in transaction batches (Tom Lane) + § + + + + This allows the performance benefits of transaction batches without + the problems of excessively large transaction blocks. + + + + + + + + Change pgbench debug + mode option from to + (Greg Sabino Mullane) + § + + + + Option is now used for the database name, + and the new option can be used as well. + + + + + + + + Add pgbench option to exit after + any client aborts (Yugo Nagata) + § + + + + + + + + Add pgbench command \syncpipeline to allow + sending of sync messages (Anthonin Bonnefoy) + § + + + + + + + + Allow pg_archivecleanup + to remove backup history files (Atsushi Torikoshi) + § + + + + The option is . + + + + + + + + Add some long options to pg_archivecleanup + (Atsushi Torikoshi) + § + + + + The long options are , + , and . + + + + + + + + Allow pg_basebackup + and pg_receivewal + to use dbname in their connection specification (Jelte Fennema-Nio) + § + + + + This is useful for connection poolers that are sensitive to the + database name. + + + + + + + + Add pg_upgrade + option (Thomas Munro) + § + + + + This is supported on Linux + and FreeBSD. + + + + + + + + Allow reindexdb + to process indexes from different tables + in parallel (Maxim Orlov, Svetlana Derevyanko, Alexander Korotkov) + § + + + + + + + + Allow reindexdb, + vacuumdb, and clusterdb to process objects in all + databases matching a pattern (Nathan Bossart) + § + § + § + + + + The new option controls this behavior. + + + + + + + + + Source Code + + + + + + + + Remove support for OpenSSL 1.0.1 + (Michael Paquier) + § + + + + + + + + Allow tests to pass in OpenSSL + FIPS mode (Peter Eisentraut) + § + § + + + + + + + + Use CPU AVX-512 instructions for bit counting + (Paul Amonson, Nathan Bossart, Ants Aasma) + § + § + + + + + + + + Require LLVM version + 10 or later (Thomas Munro) + § + + + + + + + + Use native CRC instructions on 64-bit + LoongArch CPUs (Xudong Yang) + § + + + + + + + + Remove AIX + support (Heikki Linnakangas) + § + + + + + + + + Remove the Microsoft Visual + Studio-specific PostgreSQL + build option (Michael Paquier) + § + + + + Meson is now the only available method + for Visual Studio builds. + + + + + + + + Remove configure option + (Thomas Munro, Heikki Linnakangas) + § + § + + + + We now assume all supported platforms have sufficient thread support. + + + + + + + + Remove configure option + (Heikki Linnakangas) + § + + + + Setting the CC environment variable is now the only + supported method for specifying the compiler. + + + + + + + + User-defined data type receive functions will no longer receive + their data null-terminated (David Rowley) + § + + + + + + + + Add incremental JSON parser for use with huge + JSON documents (Andrew Dunstan) + § + + + + + + + + Convert top-level README file to + Markdown (Nathan Bossart) + § + + + + + + + + Remove no longer needed top-level INSTALL file + (Tom Lane) + § + + + + + + + + Remove make's distprep + option (Peter Eisentraut) + § + + + + + + + + Add make support for + Android shared libraries (Peter + Eisentraut) + § + + + + + + + + Add backend support for injection points (Michael Paquier) + § + § + § + § + + + + This is used for server debugging and they must be enabled at server + compile time. + + + + + + + + Add dynamic shared memory registry (Nathan Bossart) + § + + + + This allows shared libraries which are not initialized at startup + to coordinate dynamic shared memory access. + + + + + + + + Fix emit_log_hook to use the same time value as + other log records for the same query (Kambam Vinay, Michael Paquier) + § + + + + + + + + Improve documentation for using jsonpath for + predicate checks (David Wheeler) + § + + + + + + + + + Additional Modules + + + + + + + + Allow joins with non-join qualifications to be pushed down to + foreign servers and custom scans (Richard Guo, Etsuro Fujita) + § + + + + Foreign data wrappers and custom scans will need to be modified to + handle these cases. + + + + + + + + Allow pushdown of EXISTS and IN + subqueries to foreign servers + (Alexander Pyhalov) + § + + + + + + + + Increase the default foreign data wrapper tuple cost (David Rowley, + Umair Shahid) + § + § + + + + This value is used by the optimizer. + + + + + + + + Allow dblink + database operations to be interrupted (Noah Misch) + § + + + + + + + + Allow the creation of hash indexes on columns (Tommy Pavlicek) + § + + + + This also enables hash join and hash aggregation on + ltree columns. + + + + + + + + Allow character + translation rules to contain whitespace and quotes (Michael Paquier) + § + + + + The syntax for the unaccent.rules file has + changed. + + + + + + + + Allow + to check for unique constraint violations using new option + (Anastasia Lubennikova, Pavel Borisov, + Maxim Orlov) + § + + + + + + + + Allow tests to + pass in OpenSSL FIPS mode (Peter Eisentraut) + § + + + + + + + + Allow tests + to pass in OpenSSL FIPS mode (Peter Eisentraut) + § + + + + + + + + Remove some unused SPI + macros (Bharath Rupireddy) + § + + + + + + + + Allow ALTER + OPERATOR to set more optimization attributes + (Tommy Pavlicek) + § + + + + This is useful for extensions. + + + + + + + + Allow extensions to define custom wait events + (Masahiro Ikeda) + § + § + § + § + + + + Custom wait events have been added to and . + + + + + + + + Add + function pg_buffercache_evict() to allow shared + buffer eviction (Palak Chaturvedi, Thomas Munro) + § + + + + This is useful for testing. + + + + + + + <link linkend="pgstatstatements"><application>pg_stat_statements</application></link> + + + + + + + + Replace CALL + parameters in pg_stat_statements with + placeholders (Sami Imseih) + § + + + + + + + + Replace savepoint names stored in + pg_stat_statements with placeholders + (Greg Sabino Mullane) + § + + + + This greatly reduces the number of entries needed to record SAVEPOINT, + RELEASE + SAVEPOINT, and ROLLBACK TO + SAVEPOINT commands. + + + + + + + + Replace the two-phase commit GIDs stored in + pg_stat_statements with placeholders + (Michael Paquier) + § + + + + This greatly reduces the number of entries needed to record + PREPARE + TRANSACTION, COMMIT + PREPARED, and ROLLBACK + PREPARED. + + + + + + + + Track DEALLOCATE + in pg_stat_statements (Dagfinn Ilmari + Mannsåker, Michael Paquier) + § + + + + DEALLOCATE names are stored in + pg_stat_statements as placeholders. + + + + + + + + Add local I/O block read/write timing statistics columns of + pg_stat_statements (Nazir Bilal Yavuz) + § + § + + + + The new columns are local_blk_read_time + and local_blk_write_time. + + + + + + + + Add JIT deform_counter details to + pg_stat_statements (Dmitry Dolgov) + § + + + + + + + + Add optional fourth argument (minmax_only) + to pg_stat_statements_reset() to allow for + the resetting of only min/max statistics (Andrei Zubkov) + § + + + + This argument defaults to false. + + + + + + + + Add pg_stat_statements + columns stats_since and + minmax_stats_since to track entry + creation time and last min/max reset time (Andrei Zubkov) + § + + + + + + + + + + + + + Acknowledgments + + + The following individuals (in alphabetical order) have contributed + to this release as patch authors, committers, reviewers, testers, + or reporters of issues. + + + + Abhijit Menon-Sen + Adnan Dautovic + Aidar Imamov + Ajin Cherian + Akash Shankaran + Akshat Jaimini + Alaa Attya + Aleksander Alekseev + Aleksej Orlov + Alena Rybakina + Alex Hsieh + Alex Malek + Alex Shulgin + Alex Work + Alexander Korotkov + Alexander Kozhemyakin + Alexander Kuzmenkov + Alexander Lakhin + Alexander Pyhalov + Alexey Palazhchenko + Alfons Kemper + Ãlvaro Herrera + Amadeo Gallardo + Amit Kapila + Amit Langote + Amul Sul + Anastasia Lubennikova + Anatoly Zaretsky + Andreas Karlsson + Andreas Ulbrich + Andrei Lepikhov + Andrei Zubkov + Andres Freund + Andrew Alsup + Andrew Atkinson + Andrew Bille + Andrew Dunstan + Andrew Kane + Andrey Borodin + Andrey Rachitskiy + Andrey Sokolov + Andy Fan + Anthonin Bonnefoy + Anthony Hsu + Anton Kirilov + Anton Melnikov + Anton Voloshin + Antonin Houska + Ants Aasma + Antti Lampinen + Aramaki Zyake + Artem Anisimov + Artur Zakirov + Ashutosh Bapat + Ashutosh Sharma + Atsushi Torikoshi + Attila Gulyás + Ayush Tiwari + Ayush Vatsa + Bartosz Chrol + Benoît Ryder + Bernd Helmle + Bertrand Drouvot + Bharath Rupireddy + Bo Andreson + Boshomi Phenix + Bowen Shi + Boyu Yang + Bruce Momjian + Cameron Vogt + Cary Huang + Cédric Villemain + Changhong Fei + Chantal Keller + Chapman Flack + Chengxi Sun + Chris Travers + Christian Maurer + Christian Stork + Christoph Berg + Christoph Heiss + Christophe Courtois + Christopher Kline + Claudio Freire + Colin Caine + Corey Huinker + Curt Kolovson + Dag Lem + Dagfinn Ilmari MannsÃ¥ker + Damir Belyalov + Daniel Fredouille + Daniel Gustafsson + Daniel Shelepanov + Daniel Vérité + Daniel Westermann + Darren Rush + Dave Cramer + Dave Page + David Christensen + David Cook + David G. Johnston + David Geier + David Hillman + David Perez + David Rowley + David Steele + David Wheeler + David Zhang + Dean Rasheed + Denis Erokhin + Denis Laxalde + Devrim Gündüz + Dilip Kumar + Dimitrios Apostolou + Dmitry Dolgov + Dmitry Koval + Dmitry Vasiliev + Dominique Devienne + Dong Wook Lee + Donghang Lin + Dongming Liu + Drew Callahan + Drew Kimball + Dzmitry Jachnik + Egor Chindyaskin + Egor Rogov + Ekaterina Kiryanova + Elena Indrupskaya + Elizabeth Christensen + Emre Hasegeli + Eric Cyr + Eric Mutta + Eric Radman + Eric Ridge + Erik Rijkers + Erik Wienhold + Erki Eessaar + Ethan Mertz + Etsuro Fujita + Eugen Konkov + Euler Taveira + Evan Macbeth + Evgeny Morozov + Fabien Coelho + Fabrízio de Royes Mello + Farias de Oliveira + Feliphe Pozzer + Fire Emerald + Flavien Guedez + Floris Van Nee + Francesco Degrassi + Frank Streitzig + Gabriele Bartolini + Garrett Thornburg + Gavin Flower + Gavin Panella + Gilles Darold + Gilles Parc + Grant Gryczan + Greg Nancarrow + Greg Sabino Mullane + Greg Stark + Gurjeet Singh + Haiying Tang + Hajime Matsunaga + Hal Takahara + Hanefi Onaldi + Hannu Krosing + Hans Buschmann + Hao Wu + Hao Zhang + Hayato Kuroda + Heikki Linnakangas + Hemanth Sandrana + Himanshu Upadhyaya + Hironobu Suzuki + Holger Reise + Hongxu Ma + Hongyu Song + Horst Reiterer + Hubert Lubaczewski + Hywel Carver + Ian Barwick + Ian Ilyasov + Ilya Nenashev + Isaac Morland + Israel Barth Rubio + Ivan Kartyshov + Ivan Kolombet + Ivan Lazarev + Ivan Panchenko + Ivan Trofimov + Jacob Champion + Jacob Speidel + Jacques Combrink + Jaime Casanova + Jakub Wartak + James Coleman + James Pang + Jani Rahkola + Japin Li + Jeevan Chalke + Jeff Davis + Jeff Janes + Jelte Fennema-Nio + Jeremy Schneider + Jian Guo + Jian He + Jim Jones + Jim Keener + Jim Nasby + Jingtang Zhang + Jingxian Li + Jingzhou Fu + Joe Conway + Joel Jacobson + John Ekins + John Hsu + John Morris + John Naylor + John Russell + Jonathan Katz + Jordi Gutiérrez + Joseph Koshakow + Josh Kupershmidt + Joshua D. Drake + Joshua Uyehara + Jubilee Young + Julien Rouhaud + Junwang Zhao + Justin Pryzby + Kaido Vaikla + Kambam Vinay + Karen Talarico + Karina Litskevich + Karl O. Pinc + Kashif Zeeshan + Kim Johan Andersson + Kirill Reshke + Kirk Parker + Kirk Wolak + Kisoon Kwon + Koen De Groote + Kohei KaiGai + Kong Man + Konstantin Knizhnik + Kouhei Sutou + Krishnakumar R + Kuntal Ghosh + Kurt Roeckx + Kyotaro Horiguchi + Lang Liu + Lars Kanis + Laurenz Albe + Lauri Laanmets + Legs Mansion + Lukas Fittl + Magnus Hagander + Mahendrakar Srinivasarao + Maiquel Grassi + Manos Emmanouilidis + Marcel Hofstetter + Marcos Pegoraro + Marian Krucina + Marina Polyakova + Mark Dilger + Mark Guertin + Mark Sloan + Markus Winand + Marlene Reiterer + Martín Marqués + Martin Nash + Martin Schlossarek + Masahiko Sawada + Masahiro Ikeda + Masaki Kuwamura + Masao Fujii + Mason Sharp + Matheus Alcantara + Mats Kindahl + Matthias Kuhn + Matthias van de Meent + Maxim Boguk + Maxim Orlov + Maxim Yablokov + Maxime Boyer + Melanie Plageman + Melih Mutlu + Merlin Moncure + Micah Gate + Michael Banck + Michael Bondarenko + Michael Paquier + Michael Wang + Michael Zhilin + Michail Nikolaev + Michal Bartak + Michal Kleczek + Mikhail Gribkov + Mingli Zhang + Miroslav Bendik + Mitsuru Hinata + Moaaz Assali + Muralikrishna Bandaru + Nathan Bossart + Nazir Bilal Yavuz + Neil Tiffin + Ngigi Waithaka + Nikhil Benesch + Nikhil Raj + Nikita Glukhov + Nikita Kalinin + Nikita Malakhov + Nikolay Samokhvalov + Nikolay Shaplov + Nisha Moond + Nishant Sharma + Nitin Jadhav + Noah Misch + Noriyoshi Shinoda + Ole Peder Brandtzæg + Oleg Bartunov + Oleg Sibiryakov + Oleg Tselebrovskiy + Olleg Samoylov + Onder Kalaci + Ondrej Navratil + Pablo Kharo + Palak Chaturvedi + Pantelis Theodosiou + Paul Amonson + Paul Jungwirth + Pavel Borisov + Pavel Kulakov + Pavel Luzanov + Pavel Stehule + Pavlo Golub + Pedro Gallegos + Pete Storer + Peter Eisentraut + Peter Geoghegan + Peter Smith + Philip Warner + Philipp Salvisberg + Pierre Ducroquet + Pierre Fortin + Przemyslaw Sztoch + Quynh Tran + Raghuveer Devulapalli + Ranier Vilela + Reid Thompson + Rian McGuire + Richard Guo + Richard Vesely + Ridvan Korkmaz + Robert Haas + Robert Scott + Robert Treat + Roberto Mello + Robins Tharakan + Roman Lozko + Ronan Dunklau + Rui Zhao + Ryo Matsumura + Ryoga Yoshida + Sameer Kumar + Sami Imseih + Samuel Dussault + Sanjay Minni + Satoru Koizumi + Sebastian Skalacki + Sergei Glukhov + Sergei Kornilov + Sergey Prokhorenko + Sergey Sargsyan + Sergey Shinderuk + Shaozhong Shi + Shaun Thomas + Shay Rojansky + Shihao Zhong + Shinya Kato + Shlok Kyal + Shruthi Gowda + Shubham Khanna + Shulin Zhou + Shveta Malik + Simon Riggs + Soumyadeep Chakraborty + Sravan Velagandula + Stan Hu + Stepan Neretin + Stepan Rutz + Stéphane Schildknecht + Stephane Tachoires + Stephen Frost + Steve Atkins + Steve Chavez + Suraj Khamkar + Suraj Kharage + Svante Richter + Svetlana Derevyanko + Sylvain Frandaz + Takayuki Tsunakawa + Tatsuo Ishii + Tatsuro Yamada + Tender Wang + Teodor Sigaev + Thom Brown + Thomas Munro + Tim Carey-Smith + Tim Needham + Tim Palmer + Tobias Bussmann + Tom Lane + Tomas Vondra + Tommy Pavlicek + Tomonari Katsumata + Tristan Partin + Tristen Raab + Tung Nguyen + Umair Shahid + Uwe Binder + Valerie Woolard + Vallimaharajan G + Vasya Boytsov + Victor Wagner + Victor Yegorov + Victoria Shepard + Vidushi Gupta + Vignesh C + Vik Fearing + Viktor Leis + Vinayak Pokale + Vitaly Burovoy + Vojtech Benes + Wei Sun + Wei Wang + Wenjiang Zhang + Will Mortensen + Willi Mann + Wolfgang Walther + Xiang Liu + Xiaoran Wang + Xing Guo + Xudong Yang + Yahor Yuzefovich + Yajun Hu + Yaroslav Saburov + Yong Li + Yongtao Huang + Yugo Nagata + Yuhang Qiu + Yuki Seino + Yura Sokolov + Yurii Rashkovskii + Yuuki Fujii + Yuya Watari + Yves Colin + Zhihong Yu + Zhijie Hou + Zongliang Quan + Zubeyr Eryilmaz + Zuming Jiang + + + + diff --git a/doc/src/sgml/release.sgml b/doc/src/sgml/release.sgml index 1303e86cfa2d6..9c72e4a98732f 100644 --- a/doc/src/sgml/release.sgml +++ b/doc/src/sgml/release.sgml @@ -16,7 +16,8 @@ pg_[A-Za-z0-9_]+ , \<[a-z]+_[a-z_]+\> , -non-ASCII characters find using grep -P '[\x80-\xFF]' +non-ASCII characters find using grep -P '[\x80-\xFF]' or + (remove 'X') grep -X-color='auto' -P -n "[\x80-\xFF]" convert to HTML4 named entity (&) escapes official: http://www.w3.org/TR/html4/sgml/entities.html @@ -25,16 +26,13 @@ non-ASCII characters find using grep -P '[\x80-\xFF]' http://www.zipcon.net/~swhite/docs/computers/browsers/entities_page.html https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references - We cannot use UTF8 because back branches still use SGML Docbook, - which does not support it. Also, rendering engines have to + We cannot use UTF8 because rendering engines have to support the referenced characters. Do not use numeric _UTF_ numeric character escapes (&#nnn;), we can only use Latin1. Example: Alvaro Herrera is Álvaro Herrera - Find non-ASCII characters (remove 'X'): - grep -X-color='auto' -P -n "[\x80-\xFF]" wrap long lines @@ -71,6 +69,15 @@ For new features, add links to the documentation sections. review, so each item is truly a community effort. + + Section markers (§) in the release notes link to gitweb + pages which show the primary git commit + messages and source tree changes responsible for the release note item. + There might be additional git commits which + are not shown. + + -&release-16; +&release-17; Prior Releases diff --git a/doc/src/sgml/rowtypes.sgml b/doc/src/sgml/rowtypes.sgml index 4d86f97c03e4c..bbeac84d46adf 100644 --- a/doc/src/sgml/rowtypes.sgml +++ b/doc/src/sgml/rowtypes.sgml @@ -348,7 +348,7 @@ SELECT m.* FROM some_table, LATERAL myfunc(x) AS m; column expansion of this kind when it appears at the top level of a SELECT output list, a RETURNING - list in INSERT/UPDATE/DELETE, + list in INSERT/UPDATE/DELETE/MERGE, a VALUES clause, or a row constructor. In all other contexts (including when nested inside one of those diff --git a/doc/src/sgml/rules.sgml b/doc/src/sgml/rules.sgml index d229b94d396b0..7a928bd7b9040 100644 --- a/doc/src/sgml/rules.sgml +++ b/doc/src/sgml/rules.sgml @@ -797,9 +797,9 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a; What happens if a view is named as the target relation for an - INSERT, UPDATE, or - DELETE? Doing the substitutions - described above would give a query tree in which the result + INSERT, UPDATE, + DELETE, or MERGE? Doing the + substitutions described above would give a query tree in which the result relation points at a subquery range-table entry, which will not work. There are several ways in which PostgreSQL can support the appearance of updating a view, however. @@ -813,11 +813,12 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a; If the subquery selects from a single base relation and is simple enough, the rewriter can automatically replace the subquery with the underlying base relation so that the INSERT, - UPDATE, or DELETE is applied to - the base relation in the appropriate way. Views that are - simple enough for this are called automatically - updatable. For detailed information on the kinds of view that can - be automatically updated, see . + UPDATE, DELETE, or + MERGE is applied to the base relation in the + appropriate way. Views that are simple enough for this + are called automatically updatable. For detailed + information on the kinds of view that can be automatically updated, see + . @@ -827,10 +828,10 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a; Rewriting works slightly differently in this case. For INSERT, the rewriter does nothing at all with the view, leaving it as the result relation - for the query. For UPDATE and - DELETE, it's still necessary to expand the + for the query. For UPDATE, DELETE, + and MERGE, it's still necessary to expand the view query to produce the old rows that the command will - attempt to update or delete. So the view is expanded as normal, + attempt to update, delete, or merge. So the view is expanded as normal, but another unexpanded range-table entry is added to the query to represent the view in its capacity as the result relation. @@ -842,13 +843,13 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a; list to identify the physical locations of the rows to be updated. This does not work if the result relation is a view, because a view does not have any CTID, since its rows do not have - actual physical locations. Instead, for an UPDATE - or DELETE operation, a special wholerow - entry is added to the target list, which expands to include all - columns from the view. The executor uses this value to supply the - old row to the INSTEAD OF trigger. It is - up to the trigger to work out what to update based on the old and - new row values. + actual physical locations. Instead, for an UPDATE, + DELETE, or MERGE operation, a + special wholerow entry is added to the target list, + which expands to include all columns from the view. The executor uses this + value to supply the old row to the + INSTEAD OF trigger. It is up to the trigger to work + out what to update based on the old and new row values. @@ -857,7 +858,9 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a; UPDATE, and DELETE commands on a view. These rules will rewrite the command, typically into a command that updates one or more tables, rather than views. That is the topic - of . + of . Note that this will not work with + MERGE, which currently does not support rules on + the target relation other than SELECT rules. @@ -871,7 +874,8 @@ SELECT t1.a, t2.b, t1.ctid FROM t1, t2 WHERE t1.a = t2.a; Automatic rewriting of an INSERT, - UPDATE, or DELETE query on a + UPDATE, DELETE, or + MERGE query on a simple view is always tried last. Therefore, if a view has rules or triggers, they will override the default behavior of automatically updatable views. diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml index 64753d9c014ad..25ee5be5b1b64 100644 --- a/doc/src/sgml/runtime.sgml +++ b/doc/src/sgml/runtime.sgml @@ -781,19 +781,19 @@ psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such SEMMNI Maximum number of semaphore identifiers (i.e., sets) - at least ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 5) / 16) plus room for other applications + at least ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 7) / 19) plus room for other applications SEMMNS Maximum number of semaphores system-wide - ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 5) / 16) * 17 plus room for other applications + ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 7) / 19) * 20 plus room for other applications SEMMSL Maximum number of semaphores per set - at least 17 + at least 20 @@ -838,21 +838,22 @@ psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such When using System V semaphores, PostgreSQL uses one semaphore per allowed connection (), allowed autovacuum worker process - () and allowed background - process (), in sets of 16. + (), allowed WAL sender process + (), and allowed background + process (), in sets of 19. Each such set will - also contain a 17th semaphore which contains a magic + also contain a 20th semaphore which contains a magic number, to detect collision with semaphore sets used by other applications. The maximum number of semaphores in the system is set by SEMMNS, which consequently must be at least as high as max_connections plus autovacuum_max_workers plus max_wal_senders, - plus max_worker_processes, plus one extra for each 16 + plus max_worker_processes, plus one extra for each 19 allowed connections plus workers (see the formula in ). The parameter SEMMNI determines the limit on the number of semaphore sets that can exist on the system at one time. Hence this parameter must be at - least ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 5) / 16). + least ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 7) / 19). Lowering the number of allowed connections is a temporary workaround for failures, which are usually confusingly worded No space @@ -883,7 +884,8 @@ psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such When using POSIX semaphores, the number of semaphores needed is the same as for System V, that is one semaphore per allowed connection (), allowed autovacuum worker process - () and allowed background + (), allowed WAL sender process + (), and allowed background process (). On the platforms where this option is preferred, there is no specific kernel limit on the number of POSIX semaphores. @@ -891,29 +893,6 @@ psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such - - AIX - AIXIPC configuration - - - - It should not be necessary to do - any special configuration for such parameters as - SHMMAX, as it appears this is configured to - allow all memory to be used as shared memory. That is the - sort of configuration commonly used for other databases such - as DB/2. - - It might, however, be necessary to modify the global - ulimit information in - /etc/security/limits, as the default hard - limits for file sizes (fsize) and numbers of - files (nofiles) might be too low. - - - - - FreeBSD FreeBSDIPC configuration @@ -1443,11 +1422,10 @@ export PG_OOM_ADJUST_VALUE=0 with CONFIG_HUGETLBFS=y and CONFIG_HUGETLB_PAGE=y. You will also have to configure the operating system to provide enough huge pages of the desired size. - To determine the number of huge pages needed, use the - postgres command to see the value of - . Note that the - server must be shut down to view this runtime-computed parameter. - This might look like: + The runtime-computed parameter + reports the number + of huge pages required. This parameter can be viewed before starting the + server with a postgres command like: $ postgres -D $PGDATA -C shared_memory_size_in_huge_pages 3170 @@ -2008,7 +1986,8 @@ pg_dumpall -p 5432 | psql -d postgres -p 5433 sslmode=verify-ca or verify-full and have the appropriate root certificate file installed (). Alternatively the - system CA pool can be used using sslrootcert=system; in + system CA pool, as defined + by the SSL implementation, can be used using sslrootcert=system; in this case, sslmode=verify-full is forced for safety, since it is generally trivial to obtain certificates which are signed by a public CA. diff --git a/doc/src/sgml/sepgsql.sgml b/doc/src/sgml/sepgsql.sgml index b368e587cbf81..1b848f1977c29 100644 --- a/doc/src/sgml/sepgsql.sgml +++ b/doc/src/sgml/sepgsql.sgml @@ -87,9 +87,14 @@ Policy from config file: targeted - To build this module, include the option --with-selinux in - your PostgreSQL configure command. Be sure that the - libselinux-devel RPM is installed at build time. + To build this module specify (when using make and autoconf ) or (when using meson). + + Be sure that the libselinux-devel RPM is installed at + build time. diff --git a/doc/src/sgml/sourcerepo.sgml b/doc/src/sgml/sourcerepo.sgml index 07b003a7941ca..6c13c5a30cde6 100644 --- a/doc/src/sgml/sourcerepo.sgml +++ b/doc/src/sgml/sourcerepo.sgml @@ -16,16 +16,6 @@ has some discussion on working with Git. - - Note that building PostgreSQL from the source - repository requires reasonably up-to-date versions of bison, - flex, and Perl. - These tools are not needed to build from a distribution tarball, because - the files generated with these tools are included in the tarball. - Other tool requirements - are the same as shown in . - - Getting the Source via <productname>Git</productname> diff --git a/doc/src/sgml/sources.sgml b/doc/src/sgml/sources.sgml index 0db36aee2f55b..fa68d4d024a93 100644 --- a/doc/src/sgml/sources.sgml +++ b/doc/src/sgml/sources.sgml @@ -105,7 +105,8 @@ less -x4 There are two required elements for every message: a severity level - (ranging from DEBUG to PANIC) and a primary + (ranging from DEBUG to PANIC, defined + in src/include/utils/elog.h) and a primary message text. In addition there are optional elements, the most common of which is an error identifier code that follows the SQL spec's SQLSTATE conventions. @@ -470,7 +471,7 @@ IpcMemoryCreate: shmget(key=%d, size=%u, 0%o) failed: %m Primary: could not create shared memory segment: %m Detail: Failed syscall was shmget(key=%d, size=%u, 0%o). -Hint: the addendum +Hint: The addendum, written as a complete sentence. @@ -532,9 +533,10 @@ Hint: the addendum Use of Quotes - Always use quotes to delimit file names, user-supplied identifiers, and - other variables that might contain words. Do not use them to mark up - variables that will not contain words (for example, operator names). + Always use quotes to delimit file names, user-supplied identifiers, + configuration variable names, and other variables that might contain + words. Do not use them to mark up variables that will not contain words + (for example, operator names). @@ -998,18 +1000,10 @@ MemoryContextSwitchTo(MemoryContext context) static void handle_sighup(SIGNAL_ARGS) { - int save_errno = errno; - got_SIGHUP = true; SetLatch(MyLatch); - - errno = save_errno; } - errno is saved and restored because - SetLatch() might change it. If that were not done - interrupted code that's currently inspecting errno might see the wrong - value. diff --git a/doc/src/sgml/spgist.sgml b/doc/src/sgml/spgist.sgml index 102f8627bd05d..6af93719b8439 100644 --- a/doc/src/sgml/spgist.sgml +++ b/doc/src/sgml/spgist.sgml @@ -1,6 +1,6 @@ - + SP-GiST Indexes @@ -8,7 +8,7 @@ SP-GiST - + Introduction @@ -51,9 +51,9 @@ web site. - + - + Built-in Operator Classes @@ -191,9 +191,9 @@ search over indexed point or polygon data sets. - + - + Extensibility @@ -933,9 +933,9 @@ LANGUAGE C STRICT; PG_GET_COLLATION() mechanism. - + - + Implementation @@ -944,7 +944,7 @@ LANGUAGE C STRICT; know. - + SP-GiST Limits @@ -991,9 +991,9 @@ LANGUAGE C STRICT; leaf datum does not become any smaller within ten cycles of choose method calls. - + - + SP-GiST Without Node Labels @@ -1018,9 +1018,9 @@ LANGUAGE C STRICT; for choose to return spgAddNode, since the set of nodes is supposed to be fixed in such cases. - + - + <quote>All-the-Same</quote> Inner Tuples @@ -1056,11 +1056,11 @@ LANGUAGE C STRICT; depending on how much the inner_consistent function normally assumes about the meaning of the nodes. - + - + - + Examples @@ -1071,6 +1071,6 @@ LANGUAGE C STRICT; and src/backend/utils/adt/ to see the code. - + - + diff --git a/doc/src/sgml/spi.sgml b/doc/src/sgml/spi.sgml index 651930aa3d6a4..7d154914b9076 100644 --- a/doc/src/sgml/spi.sgml +++ b/doc/src/sgml/spi.sgml @@ -301,8 +301,9 @@ SPI_execute("INSERT INTO foo SELECT * FROM bar RETURNING *", false, 5); is returned in the global variable SPI_processed. If the return value of the function is SPI_OK_SELECT, SPI_OK_INSERT_RETURNING, - SPI_OK_DELETE_RETURNING, or - SPI_OK_UPDATE_RETURNING, + SPI_OK_DELETE_RETURNING, + SPI_OK_UPDATE_RETURNING, or + SPI_OK_MERGE_RETURNING, then you can use the global pointer SPITupleTable *SPI_tuptable to access the result rows. Some utility commands (such as @@ -473,6 +474,15 @@ typedef struct SPITupleTable + + SPI_OK_MERGE_RETURNING + + + if a MERGE RETURNING was executed + + + + SPI_OK_UTILITY @@ -742,7 +752,9 @@ int SPI_execute_extended(const char *command, true allows non-atomic execution of CALL and DO - statements + statements (but this field is ignored unless + the SPI_OPT_NONATOMIC flag was passed + to SPI_connect_ext) @@ -1883,7 +1895,9 @@ int SPI_execute_plan_extended(SPIPlanPtr plan, true allows non-atomic execution of CALL and DO - statements + statements (but this field is ignored unless + the SPI_OPT_NONATOMIC flag was passed + to SPI_connect_ext) @@ -2727,6 +2741,19 @@ Portal SPI_cursor_find(const char * name) NULL if none was found + + + Notes + + + Beware that this function can return a Portal object + that does not have cursor-like properties; for example it might not + return tuples. If you simply pass the Portal pointer + to other SPI functions, they can defend themselves against such + cases, but caution is appropriate when directly inspecting + the Portal. + + @@ -5314,15 +5341,16 @@ CREATE FUNCTION execq(text, integer) RETURNS int8 => INSERT INTO a VALUES (execq('INSERT INTO a VALUES (0)', 0)); INSERT 0 1 => SELECT execq('SELECT * FROM a', 0); -INFO: EXECQ: 0 -- inserted by execq -INFO: EXECQ: 1 -- returned by execq and inserted by upper INSERT +INFO: EXECQ: 0 -- inserted by execq +INFO: EXECQ: 1 -- returned by execq and inserted by upper INSERT execq ------- 2 (1 row) -=> SELECT execq('INSERT INTO a SELECT x + 2 FROM a', 1); +=> SELECT execq('INSERT INTO a SELECT x + 2 FROM a RETURNING *', 1); +INFO: EXECQ: 2 -- 0 + 2, then execution was stopped by count execq ------- 1 @@ -5331,21 +5359,38 @@ INFO: EXECQ: 1 -- returned by execq and inserted by upper INSERT => SELECT execq('SELECT * FROM a', 10); INFO: EXECQ: 0 INFO: EXECQ: 1 -INFO: EXECQ: 2 -- 0 + 2, only one row inserted - as specified +INFO: EXECQ: 2 + + execq +------- + 3 -- 10 is the max value only, 3 is the real number of rows +(1 row) +=> SELECT execq('INSERT INTO a SELECT x + 10 FROM a', 1); execq ------- - 3 -- 10 is the max value only, 3 is the real number of rows + 3 -- all rows processed; count does not stop it, because nothing is returned (1 row) +=> SELECT * FROM a; + x +---- + 0 + 1 + 2 + 10 + 11 + 12 +(6 rows) + => DELETE FROM a; -DELETE 3 +DELETE 6 => INSERT INTO a VALUES (execq('SELECT * FROM a', 0) + 1); INSERT 0 1 => SELECT * FROM a; x --- - 1 -- no rows in a (0) + 1 + 1 -- 0 (no rows in a) + 1 (1 row) => INSERT INTO a VALUES (execq('SELECT * FROM a', 0) + 1); @@ -5355,15 +5400,16 @@ INSERT 0 1 x --- 1 - 2 -- there was one row in a + 1 + 2 -- 1 (there was one row in a) + 1 (2 rows) --- This demonstrates the data changes visibility rule: +-- This demonstrates the data changes visibility rule. +-- execq is called twice and sees different numbers of rows each time: => INSERT INTO a SELECT execq('SELECT * FROM a', 0) * x FROM a; -INFO: EXECQ: 1 +INFO: EXECQ: 1 -- results from first execq INFO: EXECQ: 2 -INFO: EXECQ: 1 +INFO: EXECQ: 1 -- results from second execq INFO: EXECQ: 2 INFO: EXECQ: 2 INSERT 0 2 @@ -5372,10 +5418,9 @@ INSERT 0 2 --- 1 2 - 2 -- 2 rows * 1 (x in first row) - 6 -- 3 rows (2 + 1 just inserted) * 2 (x in second row) -(4 rows) ^^^^^^ - rows visible to execq() in different invocations + 2 -- 2 rows * 1 (x in first row) + 6 -- 3 rows (2 + 1 just inserted) * 2 (x in second row) +(4 rows) diff --git a/doc/src/sgml/standalone-install.xml b/doc/src/sgml/standalone-install.xml deleted file mode 100644 index b29e90daf9869..0000000000000 --- a/doc/src/sgml/standalone-install.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - -
- <productname>PostgreSQL</productname> Installation from Source Code - - - - This document describes the installation of - PostgreSQL using this source code distribution. - - - - If you are building PostgreSQL for Microsoft - Windows, read this document if you intend to build with MinGW or Cygwin; - but if you intend to build with Microsoft's Visual - C++, see the main documentation instead. - - - - - - - - Getting Started - - - The following is a quick summary of how to get PostgreSQL up and - running once installed. The main documentation contains more information. - - - - - - Create a user account for the PostgreSQL - server. This is the user the server will run as. For production - use you should create a separate, unprivileged account - (postgres is commonly used). If you do not have root - access or just want to play around, your own user account is - enough, but running the server as root is a security risk and - will not work. -adduser postgres - - - - - - Create a database installation with the initdb - command. To run initdb you must be logged in to your - PostgreSQL server account. It will not work as - root. -root# mkdir /usr/local/pgsql/data -root# chown postgres /usr/local/pgsql/data -root# su - postgres -postgres$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data - - - - The option specifies the location where the data - will be stored. You can use any path you want, it does not have - to be under the installation directory. Just make sure that the - server account can write to the directory (or create it, if it - doesn't already exist) before starting initdb, as - illustrated here. - - - - - - At this point, if you did not use the initdb -A - option, you might want to modify pg_hba.conf to control - local access to the server before you start it. The default is to - trust all local users. - - - - - - The previous initdb step should have told you how to - start up the database server. Do so now. The command should look - something like: -/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data start - - - - To stop a server running in the background you can type: -/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data stop - - - - - - Create a database: -/usr/local/pgsql/bin/createdb testdb - Then enter: -/usr/local/pgsql/bin/psql testdb - to connect to that database. At the prompt you can enter SQL - commands and start experimenting. - - - - - - - What Now? - - - - - - The PostgreSQL distribution contains a - comprehensive documentation set, which you should read sometime. - After installation, the documentation can be accessed by - pointing your browser to - /usr/local/pgsql/doc/html/index.html, unless you - changed the installation directories. - - - - The first few chapters of the main documentation are the Tutorial, - which should be your first reading if you are completely new to - SQL databases. If you are familiar with database - concepts then you want to proceed with part on server - administration, which contains information about how to set up - the database server, database users, and authentication. - - - - - - Usually, you will want to modify your computer so that it will - automatically start the database server whenever it boots. Some - suggestions for this are in the documentation. - - - - - - Run the regression tests against the installed server (using - make installcheck). If you didn't run the - tests before installation, you should definitely do it now. This - is also explained in the documentation. - - - - - - By default, PostgreSQL is configured to run on - minimal hardware. This allows it to start up with almost any - hardware configuration. The default configuration is, however, - not designed for optimum performance. To achieve optimum - performance, several server parameters must be adjusted, the two - most common being shared_buffers and - work_mem. - Other parameters mentioned in the documentation also affect - performance. - - - - - - - - -
diff --git a/doc/src/sgml/standalone-profile.xsl b/doc/src/sgml/standalone-profile.xsl deleted file mode 100644 index 1b3938a638d67..0000000000000 --- a/doc/src/sgml/standalone-profile.xsl +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - document - - - - the documentation about client authentication and libpq - - - - the documentation - - - - the main documentation's appendix on documentation - - - - the documentation - - - - the configuration parameter default_toast_compression - - - - the configuration parameter wal_compression - - - - the documentation - - - - the documentation - - - - the PL/Python documentation - - - - the file - src/test/regress/README - and the documentation - - - - the documentation - - - - uuid-ossp - - - - xml2 - - - diff --git a/doc/src/sgml/storage.sgml b/doc/src/sgml/storage.sgml index 148fb1b49d966..61250799ec076 100644 --- a/doc/src/sgml/storage.sgml +++ b/doc/src/sgml/storage.sgml @@ -202,7 +202,7 @@ these files are named after the table or index's filenode which can be found in pg_class.relfilenode. But for temporary relations, the file name is of the form tBBB_FFF, where BBB -is the backend ID of the backend which created the file, and FFF +is the process number of the backend which created the file, and FFF is the filenode number. In either case, in addition to the main file (a/k/a main fork), each table and index has a free space map (see ), which stores information about free space available in @@ -456,9 +456,7 @@ for storing TOAST-able columns on disk: PLAIN prevents either compression or - out-of-line storage; furthermore it disables use of single-byte headers - for varlena types. - This is the only possible strategy for + out-of-line storage. This is the only possible strategy for columns of non-TOAST-able data types. @@ -1099,8 +1097,10 @@ data. Empty in ordinary tables. - The update does not modify any columns referenced by the table's - indexes, including expression and partial indexes. + The update does not modify any columns referenced by the table's indexes, + not including summarizing indexes. The only summarizing index method in + the core PostgreSQL distribution is BRIN. @@ -1116,30 +1116,35 @@ data. Empty in ordinary tables. - New index entries are not needed to represent updated rows. + New index entries are not needed to represent updated rows, however, + summary indexes may still need to be updated. - Old versions of updated rows can be completely removed during normal - operation, including SELECTs, instead of requiring - periodic vacuum operations. (This is possible because indexes - do not reference their page - item identifiers.) + When a row is updated multiple times, row versions other than the oldest + and the newest can be completely removed during normal operation, + including SELECTs, instead of requiring periodic vacuum + operations. (Indexes always refer to the + page item identifier of the + original row version. The tuple data associated with that row version + is removed, and its item identifier is converted to a redirect that + points to the oldest version that may still be visible to some concurrent + transaction. Intermediate row versions that are no longer visible to + anyone are completely removed, and the associated page item identifiers + are made available for reuse.) - In summary, heap-only tuple updates can only be created - if columns used by indexes are not updated. You can - increase the likelihood of sufficient page space for + You can increase the likelihood of sufficient page space for HOT updates by decreasing a table's fillfactor. - If you don't, HOT updates will still happen because - new rows will naturally migrate to new pages and existing pages with - sufficient free space for new row versions. The system view fillfactor. If you + don't, HOT updates will still happen because new rows + will naturally migrate to new pages and existing pages with sufficient free + space for new row versions. The system view pg_stat_all_tables allows monitoring of the occurrence of HOT and non-HOT updates. diff --git a/doc/src/sgml/stylesheet-common.xsl b/doc/src/sgml/stylesheet-common.xsl index b7fb6c489a28a..a2e3db67a329f 100644 --- a/doc/src/sgml/stylesheet-common.xsl +++ b/doc/src/sgml/stylesheet-common.xsl @@ -4,7 +4,7 @@ @@ -43,6 +43,13 @@ + + + diff --git a/doc/src/sgml/stylesheet-fo.xsl b/doc/src/sgml/stylesheet-fo.xsl index 5e7e132480335..e7916a6a88347 100644 --- a/doc/src/sgml/stylesheet-fo.xsl +++ b/doc/src/sgml/stylesheet-fo.xsl @@ -1,4 +1,8 @@ + +%common.entities; +]> @@ -10,6 +14,21 @@ 3 + + + + + + + + + + + 1.5em @@ -138,4 +157,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ientry- + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ientry- + + + + + + + + + ( + + + + + + + + + + + + + + + + + + + + + + + + + ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ientry- + + + + + + + + + ( + + + + + + + + + + + + + + + + + + + + + + + + + ) + + + + + + + diff --git a/doc/src/sgml/stylesheet-html-common.xsl b/doc/src/sgml/stylesheet-html-common.xsl index a368e0e199087..9dcf96c02e518 100644 --- a/doc/src/sgml/stylesheet-html-common.xsl +++ b/doc/src/sgml/stylesheet-html-common.xsl @@ -436,4 +436,242 @@ set toc,title + + + + + + + + + + + + + +
+ + + + + ientry- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+ + + + + + + + + + + + + + +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + #ientry- + + + + + + + + ( + + + + + + + + + + + + + + + + + + + + + + + + + ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + #ientry- + + + + + + + +
+ ( + + + + + + + + + + + + + + + + + + + + + + + + + ) +
+ + +
+
+
+
+ diff --git a/doc/src/sgml/syntax.sgml b/doc/src/sgml/syntax.sgml index 5668ab01433e3..4dfbbd0862614 100644 --- a/doc/src/sgml/syntax.sgml +++ b/doc/src/sgml/syntax.sgml @@ -555,7 +555,7 @@ U&'d!0061t!+000061' UESCAPE '!' While the standard syntax for specifying string constants is usually convenient, it can be difficult to understand when the desired string - contains many single quotes or backslashes, since each of those must + contains many single quotes, since each of those must be doubled. To allow more readable queries in such situations, PostgreSQL provides another way, called dollar quoting, to write string constants. @@ -1065,6 +1065,18 @@ CAST ( 'string' AS type ) unary plus, unary minus + + COLLATE + left + collation selection + + + + AT + left + AT TIME ZONE, AT LOCAL + + ^ left @@ -1647,7 +1659,20 @@ sqrt(2) are always just expressions and cannot be output-column names or numbers. For example: -SELECT array_agg(a ORDER BY b DESC) FROM table; +WITH vals (v) AS ( VALUES (1),(3),(4),(3),(2) ) +SELECT array_agg(v ORDER BY v DESC) FROM vals; + array_agg +------------- + {4,3,3,2,1} + + Since jsonb only keeps the last matching key, ordering + of its keys can be significant: + +WITH vals (k, v) AS ( VALUES ('key0','1'), ('key1','3'), ('key1','2') ) +SELECT jsonb_object_agg(k, v ORDER BY v) FROM vals; + jsonb_object_agg +---------------------------- + {"key0": "1", "key1": "3"} @@ -1668,20 +1693,19 @@ SELECT string_agg(a ORDER BY a, ',') FROM table; -- incorrect - If DISTINCT is specified in addition to an - order_by_clause, then all the ORDER BY - expressions must match regular arguments of the aggregate; that is, - you cannot sort on an expression that is not included in the - DISTINCT list. + If DISTINCT is specified with an + order_by_clause, ORDER + BY expressions can only reference columns in the + DISTINCT list. For example: + +WITH vals (v) AS ( VALUES (1),(3),(4),(3),(2) ) +SELECT array_agg(DISTINCT v ORDER BY v DESC) FROM vals; + array_agg +----------- + {4,3,2,1} + - - - The ability to specify both DISTINCT and ORDER BY - in an aggregate function is a PostgreSQL extension. - - - Placing ORDER BY within the aggregate's regular argument list, as described so far, is used when ordering the input rows for @@ -2467,17 +2491,12 @@ SELECT getf1(CAST(ROW(11,'this is a test',2.5) AS myrowtype)); Row constructors can be used to build composite values to be stored in a composite-type table column, or to be passed to a function that - accepts a composite parameter. Also, - it is possible to compare two row values or test a row with - IS NULL or IS NOT NULL, for example: - -SELECT ROW(1,2.5,'this is a test') = ROW(1, 3, 'not the same'); - -SELECT ROW(table.*) IS NULL FROM table; -- detect all-null rows - - For more detail see . - Row constructors can also be used in connection with subqueries, - as discussed in . + accepts a composite parameter. Also, it is possible to test rows + using the standard comparison operators as described in , to compare one row against another + as described in , and to + use them in connection with subqueries, as discussed in , diff --git a/doc/src/sgml/system-views.sgml b/doc/src/sgml/system-views.sgml index 57b228076e8ec..a852bdb99a31f 100644 --- a/doc/src/sgml/system-views.sgml +++ b/doc/src/sgml/system-views.sgml @@ -221,6 +221,11 @@ views + + pg_wait_events + wait events + + @@ -1603,7 +1608,7 @@ Apply transaction locks are used in parallel mode to apply the transaction - in logical replication. The remote transaction id is displayed in the + in logical replication. The remote transaction ID is displayed in the transactionid column. The objsubid displays the lock subtype which is 0 for the lock used to synchronize the set of changes, and 1 for the lock used to wait for the transaction to @@ -2146,8 +2151,8 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx tables they contain. Unlike the underlying catalog pg_publication_rel, this view expands publications defined as - FOR ALL TABLES - and FOR TABLES IN SCHEMA, + FOR ALL TABLES + and FOR TABLES IN SCHEMA, so for such publications there will be a row for each eligible table. @@ -2392,7 +2397,7 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx active bool - True if this slot is currently actively being used + True if this slot is currently being streamed @@ -2401,9 +2406,8 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx active_pid int4 - The process ID of the session using this slot if the slot - is currently actively being used. NULL if - inactive. + The process ID of the session streaming data for this slot. + NULL if inactive. @@ -2518,15 +2522,95 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx + + + inactive_since timestamptz + + + The time when the slot became inactive. NULL if the + slot is currently being streamed. + Note that for slots on the standby that are being synced from a + primary server (whose synced field is + true), the inactive_since + indicates the time when slot synchronization (see ) + was most recently stopped. NULL if the slot + has always been synchronized. On standby, this is useful for slots + that are being synced from a primary server (whose + synced field is true) + so they know when the slot stopped being synchronized. + + + conflicting bool True if this logical slot conflicted with recovery (and so is now - invalidated). Always NULL for physical slots. + invalidated). When this column is true, check + invalidation_reason column for the conflict + reason. Always NULL for physical slots. + + + + invalidation_reason text + + + The reason for the slot's invalidation. It is set for both logical and + physical slots. NULL if the slot is not invalidated. + Possible values are: + + + + wal_removed means that the required WAL has been + removed. + + + + + rows_removed means that the required rows have + been removed. It is set only for logical slots. + + + + + wal_level_insufficient means that the + primary doesn't have a sufficient to + perform logical decoding. It is set only for logical slots. + + + + + + + + + failover bool + + + True if this is a logical slot enabled to be synced to the standbys + so that logical replication can be resumed from the new primary + after failover. Always false for physical slots. + + + + + + synced bool + + + True if this is a logical slot that was synced from a primary server. + On a hot standby, the slots with the synced column marked as true can + neither be used for logical decoding nor dropped manually. The value + of this column has no meaning on the primary server; the column value on + the primary is default false for all slots but may (if leftover from a + promoted standby) also be true. + + + @@ -3009,15 +3093,36 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx The last sequence value written to disk. If caching is used, this value can be greater than the last value handed out from the - sequence. Null if the sequence has not been read from yet. Also, if - the current user does not have USAGE - or SELECT privilege on the sequence, the value is - null. + sequence. + + + The last_value column will read as null if any of + the following are true: + + + + The sequence has not been read from yet. + + + + + The current user does not have USAGE or + SELECT privilege on the sequence. + + + + + The sequence is unlogged and the server is a standby. + + + + + @@ -3794,6 +3899,45 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx non-null elements. (Null for scalar types.) + + + + range_length_histogram anyarray + + + A histogram of the lengths of non-empty and non-null range values of a + range type column. (Null for non-range types.) + + + This histogram is calculated using the subtype_diff + range function regardless of whether range bounds are inclusive. + + + + + + range_empty_frac float4 + + + Fraction of column entries whose values are empty ranges. + (Null for non-range types.) + + + + + + range_bounds_histogram anyarray + + + A histogram of lower and upper bounds of non-empty and non-null range + values. (Null for non-range types.) + + + These two histograms are represented as a single array of ranges, whose + lower bounds represent the histogram of lower bounds, and upper bounds + represent the histogram of upper bounds. + + @@ -3823,7 +3967,7 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx and pg_statistic_ext_data catalogs. This view allows access only to rows of pg_statistic_ext and pg_statistic_ext_data - that correspond to tables the user has permission to read, and therefore + that correspond to tables the user owns, and therefore it is safe to allow public read access to this view. @@ -4034,7 +4178,7 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx and pg_statistic_ext_data catalogs. This view allows access only to rows of pg_statistic_ext and pg_statistic_ext_data - that correspond to tables the user has permission to read, and therefore + that correspond to tables the user owns, and therefore it is safe to allow public read access to this view. @@ -4825,4 +4969,63 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx + + + <structname>pg_wait_events</structname> + + + pg_wait_events + + + + The view pg_wait_events provides description about the + wait events. + + + + <structname>pg_wait_events</structname> Columns + + + + + Column Type + + + Description + + + + + + + + type text + + + Wait event type + + + + + + name text + + + Wait event name + + + + + + description text + + + Wait event description + + + + +
+
+ diff --git a/doc/src/sgml/tableam.sgml b/doc/src/sgml/tableam.sgml index 6a6eb2b766540..4b37f2e5a601c 100644 --- a/doc/src/sgml/tableam.sgml +++ b/doc/src/sgml/tableam.sgml @@ -56,7 +56,7 @@ To implement an access method, an implementor will typically need to - implement an AM-specific type of tuple table slot (see + implement an AM-specific type of tuple table slot (see src/include/executor/tuptable.h), which allows code outside the access method to hold references to tuples of the AM, and diff --git a/doc/src/sgml/targets-meson.txt b/doc/src/sgml/targets-meson.txt new file mode 100644 index 0000000000000..bd470c87a7090 --- /dev/null +++ b/doc/src/sgml/targets-meson.txt @@ -0,0 +1,43 @@ +# Copyright (c) 2023-2024, PostgreSQL Global Development Group +# +# Description of important meson targets, used for the 'help' target and +# installation.sgml (via generate-targets-meson.pl). Right now the parsers are +# extremely simple. Both parsers ignore comments. The help target prints +# everything else. For xml everything without a leading newline is a group, +# remaining lines are target separated by whitespace from their description +# +Code Targets: + all Build everything other than documentation + backend Build backend and related modules + bin Build frontend binaries + contrib Build contrib modules + pl Build procedural languages + +Developer Targets: + reformat-dat-files Rewrite catalog data files into standard format + expand-dat-files Expand all data files to include defaults + update-unicode Update unicode data to new version + +Documentation Targets: + html Build documentation in multi-page HTML format + man Build documentation in man page format + docs Build documentation in multi-page HTML and man page format + doc/src/sgml/postgres-A4.pdf Build documentation in PDF format, with A4 pages + doc/src/sgml/postgres-US.pdf Build documentation in PDF format, with US letter pages + doc/src/sgml/postgres.html Build documentation in single-page HTML format + alldocs Build documentation in all supported formats + +Installation Targets: + install Install postgres, excluding documentation + install-docs Install documentation in multi-page HTML and man page formats + install-html Install documentation in multi-page HTML format + install-man Install documentation in man page format + install-quiet Like "install", but installed files are not displayed + install-world Install postgres, including multi-page HTML and man page documentation + uninstall Remove installed files + +Other Targets: + clean Remove all build products + test Run all enabled tests (including contrib) + world Build everything, including documentation + help List important targets diff --git a/doc/src/sgml/textsearch.sgml b/doc/src/sgml/textsearch.sgml index 1550be5695071..bf91c23bd11ee 100644 --- a/doc/src/sgml/textsearch.sgml +++ b/doc/src/sgml/textsearch.sgml @@ -1287,7 +1287,10 @@ ts_headline( config ts_headline accepts a document along with a query, and returns an excerpt from - the document in which terms from the query are highlighted. The + the document in which terms from the query are highlighted. + Specifically, the function will use the query to select relevant + text fragments, and then highlight all words that appear in the query, + even if those word positions do not match the query's restrictions. The configuration to be used to parse the document can be specified by config; if config is omitted, the @@ -1339,7 +1342,7 @@ ts_headline( config <b> and </b>, which can be suitable - for HTML output. + for HTML output (but see the warning below).
@@ -1351,6 +1354,21 @@ ts_headline( config
+ + Warning: Cross-site scripting (XSS) safety + + The output from ts_headline is not guaranteed to + be safe for direct inclusion in web pages. When + HighlightAll is false (the + default), some simple XML tags are removed from the document, but this + is not guaranteed to remove all HTML markup. Therefore, this does not + provide an effective defense against attacks such as cross-site + scripting (XSS) attacks, when working with untrusted input. To guard + against such attacks, all HTML markup should be removed from the input + document, or an HTML sanitizer should be used on the output. + + + These option names are recognized case-insensitively. You must double-quote string values if they contain spaces or commas. @@ -2218,10 +2236,22 @@ LIMIT 10; email does not support all valid email characters as - defined by RFC 5322. + defined by RFC 5322. Specifically, the only non-alphanumeric characters supported for email user names are period, dash, and underscore. + + + tag does not support all valid tag names as defined by + W3C Recommendation, XML. + Specifically, the only tag names supported are those starting with an + ASCII letter, underscore, or colon, and containing only letters, digits, + hyphens, underscores, periods, and colons. tag also + includes XML comments starting with <!-- and ending + with -->, and XML declarations (but note that this + includes anything starting with <?x and ending with + >). + diff --git a/doc/src/sgml/trigger.sgml b/doc/src/sgml/trigger.sgml index 6e1f370b213b3..31626536a2e29 100644 --- a/doc/src/sgml/trigger.sgml +++ b/doc/src/sgml/trigger.sgml @@ -132,29 +132,19 @@ - A statement that targets a parent table in an inheritance or partitioning - hierarchy does not cause the statement-level triggers of affected child - tables to be fired; only the parent table's statement-level triggers are - fired. However, row-level triggers of any affected child tables will be - fired. + If an INSERT contains an ON CONFLICT + DO UPDATE clause, it is possible for row-level + BEFORE INSERT and then + BEFORE UPDATE triggers + to be executed on triggered rows. Such interactions can be + complex if the triggers are not idempotent because change made by + BEFORE INSERT triggers will be + seen by BEFORE UPDATE triggers, + including changes to EXCLUDED columns. - If an INSERT contains an ON CONFLICT - DO UPDATE clause, it is possible that the effects of - row-level BEFORE INSERT triggers and - row-level BEFORE UPDATE triggers can - both be applied in a way that is apparent from the final state of - the updated row, if an EXCLUDED column is referenced. - There need not be an EXCLUDED column reference for - both sets of row-level BEFORE triggers to execute, - though. The - possibility of surprising outcomes should be considered when there - are both BEFORE INSERT and - BEFORE UPDATE row-level triggers - that change a row being inserted/updated (this can be - problematic even if the modifications are more or less equivalent, if - they're not also idempotent). Note that statement-level + Note that statement-level UPDATE triggers are executed when ON CONFLICT DO UPDATE is specified, regardless of whether or not any rows were affected by the UPDATE (and @@ -169,6 +159,14 @@ triggers. + + A statement that targets a parent table in an inheritance or partitioning + hierarchy does not cause the statement-level triggers of affected child + tables to be fired; only the parent table's statement-level triggers are + fired. However, row-level triggers of any affected child tables will be + fired. + + If an UPDATE on a partitioned table causes a row to move to another partition, it will be performed as a DELETE @@ -356,6 +354,17 @@ to avoid infinite recursion in such scenarios. + + If a foreign key constraint specifies referential actions (that + is, cascading updates or deletes), those actions are performed via + ordinary SQL update or delete commands on the referencing table. + In particular, any triggers that exist on the referencing table + will be fired for those changes. If such a trigger modifies or + blocks the effect of one of these commands, the end result could + be to break referential integrity. It is the trigger programmer's + responsibility to avoid that. + + trigger diff --git a/doc/src/sgml/unaccent.sgml b/doc/src/sgml/unaccent.sgml index f3ddc64bbcbec..94100ed26091a 100644 --- a/doc/src/sgml/unaccent.sgml +++ b/doc/src/sgml/unaccent.sgml @@ -84,6 +84,22 @@ + + + Some characters, like numeric symbols, may require whitespaces in their + translation rule. It is possible to use double quotes around the translated + characters in this case. A double quote needs to be escaped with a second + double quote when including one in the translated character. For example: + +¼ " 1/4" +½ " 1/2" +¾ " 3/4" +“ """" +” """" + + + + As with other PostgreSQL text search configuration files, diff --git a/doc/src/sgml/user-manag.sgml b/doc/src/sgml/user-manag.sgml index e1540dd481b0c..07a16247d76f1 100644 --- a/doc/src/sgml/user-manag.sgml +++ b/doc/src/sgml/user-manag.sgml @@ -103,11 +103,10 @@ SELECT rolname FROM pg_roles WHERE rolcanlogin; In order to bootstrap the database system, a freshly initialized system always contains one predefined login-capable role. This role - is always a superuser, and by default it will have + is always a superuser, and it will have the same name as the operating system user that initialized the - database cluster, unless another name is specified while - running initdb. - It is common, but not required, to arrange for this role to be named + database cluster with initdb unless a different name + is specified. This role is often named postgres. In order to create more roles you first have to connect as this initial role. @@ -351,7 +350,7 @@ ALTER ROLE myname SET enable_indexscan TO off; options. Thus, the fact that privileges are not inherited by default nor is SET ROLE granted by default is a safeguard against accidents, not a security feature. Also note that, because this automatic - grant is granted by the bootstrap user, it cannot be removed or changed by + grant is granted by the bootstrap superuser, it cannot be removed or changed by the CREATEROLE user; however, any superuser could revoke it, modify it, and/or issue additional such grants to other CREATEROLE users. Whichever CREATEROLE @@ -410,10 +409,10 @@ REVOKE group_role FROM role1INHERIT option automatically have use - of the privileges of those roles, including any - privileges inherited by those roles. - As an example, suppose we have done: + INHERIT option automatically have use of the + privileges of those directly or indirectly a member of, though the + chain stops at memberships lacking the inherit option. As an example, + suppose we have done: CREATE ROLE joe LOGIN; CREATE ROLE admin; diff --git a/doc/src/sgml/uuid-ossp.sgml b/doc/src/sgml/uuid-ossp.sgml index 6f851ac85f259..acd20a51f01c2 100644 --- a/doc/src/sgml/uuid-ossp.sgml +++ b/doc/src/sgml/uuid-ossp.sgml @@ -29,7 +29,7 @@ shows the functions available to generate UUIDs. The relevant standards ITU-T Rec. X.667, ISO/IEC 9834-8:2005, and - RFC 4122 + RFC 4122 specify four algorithms for generating UUIDs, identified by the version numbers 1, 3, 4, and 5. (There is no version 2 algorithm.) Each of these algorithms could be suitable for a different set of diff --git a/doc/src/sgml/wal-for-extensions.sgml b/doc/src/sgml/wal-for-extensions.sgml new file mode 100644 index 0000000000000..4c4fb29dd192d --- /dev/null +++ b/doc/src/sgml/wal-for-extensions.sgml @@ -0,0 +1,32 @@ + + + + Write Ahead Logging for Extensions + + + Certain extensions, principally extensions that implement custom access + methods, may need to perform write-ahead logging in order to ensure + crash-safety. PostgreSQL provides two ways + for extensions to achieve this goal. + + + + First, extensions can choose to use generic + WAL, a special type of WAL record which describes changes to pages + in a generic way. This method is simple to implement and does not require + that an extension library be loaded in order to apply the records. However, + generic WAL records will be ignored when performing logical decoding. + + + + Second, extensions can choose to use a custom + resource manager. This method is more flexible, supports logical + decoding, and can sometimes generate much smaller write-ahead log records + than would be possible with generic WAL. However, it is more complex for an + extension to implement. + + +&generic-wal; +&custom-rmgr; + + diff --git a/doc/src/sgml/wal.sgml b/doc/src/sgml/wal.sgml index ed7929cbcd72c..dc3c061256d4a 100644 --- a/doc/src/sgml/wal.sgml +++ b/doc/src/sgml/wal.sgml @@ -86,7 +86,7 @@ On FreeBSD, IDE drives can be queried using - atacontrol and write caching turned off using + camcontrol identify and write caching turned off using hw.ata.wc=0 in /boot/loader.conf; SCSI drives can be queried using camcontrol identify, and the write cache both queried and changed using @@ -109,9 +109,8 @@ open_datasync (the default), write caching can be disabled by unchecking My Computer\Open\disk drive\Properties\Hardware\Properties\Policies\Enable write caching on the disk. Alternatively, set wal_sync_method to - fdatasync (NTFS only), fsync or - fsync_writethrough, which prevent - write caching. + fdatasync (NTFS only) or fsync, + which prevent write caching. @@ -187,7 +186,7 @@ - Each individual record in a WAL file is protected by a CRC-32 (32-bit) check + Each individual record in a WAL file is protected by a CRC-32C (32-bit) check that allows us to tell if record contents are correct. The CRC value is set when we write each WAL record and checked during crash recovery, archive recovery and replication. @@ -213,7 +212,7 @@ - Individual state files in pg_twophase are protected by CRC-32. + Individual state files in pg_twophase are protected by CRC-32C. @@ -247,7 +246,7 @@ - Checksums are normally enabled when the cluster is initialized using initdb. They can also be enabled or disabled at a later time as an offline operation. Data checksums are enabled or disabled at the full cluster @@ -603,7 +602,7 @@ On Linux and POSIX platforms - allows to force the OS that pages written by the checkpoint should be + allows you to force OS pages written by the checkpoint to be flushed to disk after a configurable number of bytes. Otherwise, these pages may be kept in the OS's page cache, inducing a stall when fsync is issued at the end of a checkpoint. This setting will @@ -644,6 +643,9 @@ until the situation is resolved. A slow or failed standby server that uses a replication slot will have the same effect (see ). + Similarly, if + WAL summarization is enabled, old segments are kept + until they are summarized. @@ -656,14 +658,41 @@ directory. Restartpoints can't be performed more frequently than checkpoints on the primary because restartpoints can only be performed at checkpoint records. - A restartpoint is triggered when a checkpoint record is reached if at - least checkpoint_timeout seconds have passed since the last - restartpoint, or if WAL size is about to exceed - max_wal_size. However, because of limitations on when a - restartpoint can be performed, max_wal_size is often exceeded - during recovery, by up to one checkpoint cycle's worth of WAL. + A restartpoint can be demanded by a schedule or by an external request. + The restartpoints_timed counter in the + pg_stat_checkpointer + view counts the first ones while the restartpoints_req + the second. + A restartpoint is triggered by schedule when a checkpoint record is reached + if at least seconds have passed since + the last performed restartpoint or when the previous attempt to perform + the restartpoint has failed. In the last case, the next restartpoint + will be scheduled in 15 seconds. + A restartpoint is triggered by request due to similar reasons like checkpoint + but mostly if WAL size is about to exceed + However, because of limitations on when a restartpoint can be performed, + max_wal_size is often exceeded during recovery, + by up to one checkpoint cycle's worth of WAL. (max_wal_size is never a hard limit anyway, so you should always leave plenty of headroom to avoid running out of disk space.) + The restartpoints_done counter in the + pg_stat_checkpointer + view counts the restartpoints that have really been performed. + + + + In some cases, when the WAL size on the primary increases quickly, + for instance during massive INSERT, + the restartpoints_req counter on the standby + may demonstrate a peak growth. + This occurs because requests to create a new restartpoint due to increased + XLOG consumption cannot be performed because the safe checkpoint record + since the last restartpoint has not yet been replayed on the standby. + This behavior is normal and does not lead to an increase in system resource + consumption. + Only the restartpoints_done + counter among the restartpoint-related ones indicates that noticeable system + resources have been spent. diff --git a/doc/src/sgml/xact.sgml b/doc/src/sgml/xact.sgml index b467660eeec15..3aa7ee1383e42 100644 --- a/doc/src/sgml/xact.sgml +++ b/doc/src/sgml/xact.sgml @@ -26,10 +26,10 @@ Every transaction is identified by a unique VirtualTransactionId (also called virtualXID or vxid), which - is comprised of a backend ID (or backendID) + is comprised of a backend's process number (or procNumber) and a sequentially-assigned number local to each backend, known as localXID. For example, the virtual transaction - ID 4/12532 has a backendID + ID 4/12532 has a procNumber of 4 and a localXID of 12532. @@ -70,7 +70,7 @@ - In addition to vxid and xid, + In addition to vxid and xid, prepared transactions are also assigned Global Transaction Identifiers (GID). GIDs are string literals up to 200 bytes long, which must be unique amongst other currently @@ -121,8 +121,8 @@ Subtransactions can be started explicitly using the SAVEPOINT command, but can also be started in - other ways, such as PL/pgSQL's EXCEPTION clause. - PL/Python and PL/TCL also support explicit subtransactions. + other ways, such as PL/pgSQL's EXCEPTION clause. + PL/Python and PL/Tcl also support explicit subtransactions. Subtransactions can also be started from other subtransactions. The top-level transaction and its child subtransactions form a hierarchy or tree, which is why we refer to the main transaction as @@ -156,7 +156,7 @@ When a top-level transaction with an xid commits, all of its subcommitted child subtransactions are also persistently recorded - as committed in the pg_xact directory. If the + as committed in the pg_xact subdirectory. If the top-level transaction aborts, all its subtransactions are also aborted, even if they were subcommitted. diff --git a/doc/src/sgml/xfunc.sgml b/doc/src/sgml/xfunc.sgml index 9620ea9ae38fe..a8aa871918a72 100644 --- a/doc/src/sgml/xfunc.sgml +++ b/doc/src/sgml/xfunc.sgml @@ -177,7 +177,8 @@ statements separated by semicolons. A semicolon after the last statement is optional. Unless the function is declared to return void, the last statement must be a SELECT, - or an INSERT, UPDATE, or DELETE + or an INSERT, UPDATE, + DELETE, or MERGE that has a RETURNING clause. @@ -1236,8 +1237,9 @@ SELECT x, CASE WHEN x > 0 THEN generate_series(1, 5) ELSE 0 END FROM tab; - If a function's last command is INSERT, UPDATE, - or DELETE with RETURNING, that command will + If a function's last command is INSERT, + UPDATE, DELETE, or + MERGE with RETURNING, that command will always be executed to completion, even if the function is not declared with SETOF or the calling query does not fetch all the result rows. Any extra rows produced by the RETURNING @@ -3397,59 +3399,291 @@ CREATE FUNCTION make_array(anyelement) RETURNS anyarray - Shared Memory and LWLocks + Shared Memory + + + Requesting Shared Memory at Startup + + + Add-ins can reserve shared memory on server startup. To do so, the + add-in's shared library must be preloaded by specifying it in + shared_preload_libraries. + The shared library should also register a + shmem_request_hook in its + _PG_init function. This + shmem_request_hook can reserve shared memory by + calling: + +void RequestAddinShmemSpace(Size size) + + Each backend should obtain a pointer to the reserved shared memory by + calling: + +void *ShmemInitStruct(const char *name, Size size, bool *foundPtr) + + If this function sets foundPtr to + false, the caller should proceed to initialize the + contents of the reserved shared memory. If foundPtr + is set to true, the shared memory was already + initialized by another backend, and the caller need not initialize + further. + + + + To avoid race conditions, each backend should use the LWLock + AddinShmemInitLock when initializing its allocation + of shared memory, as shown here: + +static mystruct *ptr = NULL; +bool found; + +LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE); +ptr = ShmemInitStruct("my struct name", size, &found); +if (!found) +{ + ... initialize contents of shared memory ... + ptr->locks = GetNamedLWLockTranche("my tranche name"); +} +LWLockRelease(AddinShmemInitLock); + + shmem_startup_hook provides a convenient place for the + initialization code, but it is not strictly required that all such code + be placed in this hook. Each backend will execute the registered + shmem_startup_hook shortly after it attaches to shared + memory. Note that add-ins should still acquire + AddinShmemInitLock within this hook, as shown in the + example above. + + + + An example of a shmem_request_hook and + shmem_startup_hook can be found in + contrib/pg_stat_statements/pg_stat_statements.c in + the PostgreSQL source tree. + + + + + Requesting Shared Memory After Startup + + + There is another, more flexible method of reserving shared memory that + can be done after server startup and outside a + shmem_request_hook. To do so, each backend that will + use the shared memory should obtain a pointer to it by calling: + +void *GetNamedDSMSegment(const char *name, size_t size, + void (*init_callback) (void *ptr), + bool *found) + + If a dynamic shared memory segment with the given name does not yet + exist, this function will allocate it and initialize it with the provided + init_callback callback function. If the segment has + already been allocated and initialized by another backend, this function + simply attaches the existing dynamic shared memory segment to the current + backend. + + + + Unlike shared memory reserved at server startup, there is no need to + acquire AddinShmemInitLock or otherwise take action + to avoid race conditions when reserving shared memory with + GetNamedDSMSegment. This function ensures that only + one backend allocates and initializes the segment and that all other + backends receive a pointer to the fully allocated and initialized + segment. + + + + A complete usage example of GetNamedDSMSegment can + be found in + src/test/modules/test_dsm_registry/test_dsm_registry.c + in the PostgreSQL source tree. + + + + + + LWLocks + + + Requesting LWLocks at Startup + + + Add-ins can reserve LWLocks on server startup. As with shared memory + reserved at server startup, the add-in's shared library must be preloaded + by specifying it in + shared_preload_libraries, + and the shared library should register a + shmem_request_hook in its + _PG_init function. This + shmem_request_hook can reserve LWLocks by calling: + +void RequestNamedLWLockTranche(const char *tranche_name, int num_lwlocks) + + This ensures that an array of num_lwlocks LWLocks is + available under the name tranche_name. A pointer to + this array can be obtained by calling: + +LWLockPadded *GetNamedLWLockTranche(const char *tranche_name) + + + + + + Requesting LWLocks After Startup + + + There is another, more flexible method of obtaining LWLocks that can be + done after server startup and outside a + shmem_request_hook. To do so, first allocate a + tranche_id by calling: + +int LWLockNewTrancheId(void) + + Next, initialize each LWLock, passing the new + tranche_id as an argument: + +void LWLockInitialize(LWLock *lock, int tranche_id) + + Similar to shared memory, each backend should ensure that only one + process allocates a new tranche_id and initializes + each new LWLock. One way to do this is to only call these functions in + your shared memory initialization code with the + AddinShmemInitLock held exclusively. If using + GetNamedDSMSegment, calling these functions in the + init_callback callback function is sufficient to + avoid race conditions. + + + + Finally, each backend using the tranche_id should + associate it with a tranche_name by calling: + +void LWLockRegisterTranche(int tranche_id, const char *tranche_name) + + + + + A complete usage example of LWLockNewTrancheId, + LWLockInitialize, and + LWLockRegisterTranche can be found in + contrib/pg_prewarm/autoprewarm.c in the + PostgreSQL source tree. + + + + + + Custom Wait Events - Add-ins can reserve LWLocks and an allocation of shared memory on server - startup. The add-in's shared library must be preloaded by specifying - it in - shared_preload_libraries. - The shared library should register a shmem_request_hook - in its _PG_init function. This - shmem_request_hook can reserve LWLocks or shared memory. - Shared memory is reserved by calling: + Add-ins can define custom wait events under the wait event type + Extension by calling: -void RequestAddinShmemSpace(int size) +uint32 WaitEventExtensionNew(const char *wait_event_name) - from your shmem_request_hook. + The wait event is associated to a user-facing custom string. + An example can be found in src/test/modules/worker_spi + in the PostgreSQL source tree. - LWLocks are reserved by calling: + Custom wait events can be viewed in + pg_stat_activity: + +=# SELECT wait_event_type, wait_event FROM pg_stat_activity + WHERE backend_type ~ 'worker_spi'; + wait_event_type | wait_event +-----------------+--------------- + Extension | WorkerSpiMain +(1 row) + + + + + + Injection Points + + + An injection point with a given name is declared using + macro: -void RequestNamedLWLockTranche(const char *tranche_name, int num_lwlocks) +INJECTION_POINT(name); - from your shmem_request_hook. This will ensure that an array of - num_lwlocks LWLocks is available under the name - tranche_name. Use GetNamedLWLockTranche - to get a pointer to this array. + + There are a few injection points already declared at strategic points + within the server code. After adding a new injection point the code needs + to be compiled in order for that injection point to be available in the + binary. Add-ins written in C-language can declare injection points in + their own code using the same macro. The injection point names should + use lower-case characters, with terms separated by dashes. + - An example of a shmem_request_hook can be found in - contrib/pg_stat_statements/pg_stat_statements.c in the - PostgreSQL source tree. + Add-ins can attach callbacks to an already-declared injection point by + calling: + +extern void InjectionPointAttach(const char *name, + const char *library, + const char *function, + const void *private_data, + int private_data_size); + + + name is the name of the injection point, which when + reached during execution will execute the function + loaded from library. private_data + is a private area of data of size private_data_size + given as argument to the callback when executed. + - To avoid possible race-conditions, each backend should use the LWLock - AddinShmemInitLock when connecting to and initializing - its allocation of shared memory, as shown here: + Here is an example of callback for + InjectionPointCallback: -static mystruct *ptr = NULL; - -if (!ptr) +static void +custom_injection_callback(const char *name, const void *private_data) { - bool found; - - LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE); - ptr = ShmemInitStruct("my struct name", size, &found); - if (!found) - { - initialize contents of shmem area; - acquire any requested LWLocks using: - ptr->locks = GetNamedLWLockTranche("my tranche name"); - } - LWLockRelease(AddinShmemInitLock); + uint32 wait_event_info = WaitEventInjectionPointNew(name); + + pgstat_report_wait_start(wait_event_info); + elog(NOTICE, "%s: executed custom callback", name); + pgstat_report_wait_end(); } + This callback prints a message to server error log with severity + NOTICE, but callbacks may implement more complex + logic. + + + + Optionally, it is possible to detach an injection point by calling: + +extern bool InjectionPointDetach(const char *name); + + On success, true is returned, false + otherwise. + + + + A callback attached to an injection point is available across all the + backends including the backends started after + InjectionPointAttach is called. It remains attached + while the server is running or until the injection point is detached + using InjectionPointDetach. + + + + An example can be found in + src/test/modules/injection_points in the PostgreSQL + source tree. + + + + Enabling injections points requires + with + configure or + with Meson. diff --git a/doc/src/sgml/xindex.sgml b/doc/src/sgml/xindex.sgml index c753d8005acd4..22d8ad1aac43b 100644 --- a/doc/src/sgml/xindex.sgml +++ b/doc/src/sgml/xindex.sgml @@ -29,14 +29,11 @@ Index Methods and Operator Classes - The pg_am table contains one row for every - index method (internally known as access method). Support for - regular access to tables is built into - PostgreSQL, but all index methods are - described in pg_am. It is possible to add a - new index access method by writing the necessary code and - then creating an entry in pg_am — but that is - beyond the scope of this chapter (see ). + Operator classes are associated with an index access method, such + as B-Tree + or GIN. Custom index access method may be + defined with . See + for details. diff --git a/doc/src/sgml/xoper.sgml b/doc/src/sgml/xoper.sgml index a929ced07d704..954a90d77d0ed 100644 --- a/doc/src/sgml/xoper.sgml +++ b/doc/src/sgml/xoper.sgml @@ -146,44 +146,6 @@ SELECT (a + b) AS c FROM test_complex; = operator must specify that it is valid, by marking the operator with commutator information. - - - When you are defining a self-commutative operator, you just do it. - When you are defining a pair of commutative operators, things are - a little trickier: how can the first one to be defined refer to the - other one, which you haven't defined yet? There are two solutions - to this problem: - - - - - One way is to omit the COMMUTATOR clause in the first operator that - you define, and then provide one in the second operator's definition. - Since PostgreSQL knows that commutative - operators come in pairs, when it sees the second definition it will - automatically go back and fill in the missing COMMUTATOR clause in - the first definition. - - - - - - The other, more straightforward way is just to include COMMUTATOR clauses - in both definitions. When PostgreSQL processes - the first definition and realizes that COMMUTATOR refers to a nonexistent - operator, the system will make a dummy entry for that operator in the - system catalog. This dummy entry will have valid data only - for the operator name, left and right operand types, and result type, - since that's all that PostgreSQL can deduce - at this point. The first operator's catalog entry will link to this - dummy entry. Later, when you define the second operator, the system - updates the dummy entry with the additional information from the second - definition. If you try to use the dummy operator before it's been filled - in, you'll just get an error message. - - - - @@ -217,12 +179,6 @@ SELECT (a + b) AS c FROM test_complex; x <> y. This comes up more often than you might think, because NOT operations can be inserted as a consequence of other rearrangements. - - - Pairs of negator operators can be defined using the same methods - explained above for commutator pairs. - - diff --git a/meson.build b/meson.build index fbec997947529..78be2687d6716 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # Entry point for building PostgreSQL with meson # @@ -8,7 +8,7 @@ project('postgresql', ['c'], - version: '16beta2', + version: '17.5', license: 'PostgreSQL', # We want < 0.56 for python 3.5 compatibility on old platforms. EPEL for @@ -72,7 +72,7 @@ configure. Alternatively use a separate check out for meson based builds. @0@ ****''' if fs.exists(meson.current_source_dir() / 'src' / 'include' / 'pg_config.h') - errmsg_cleanup = 'To clean up, run make maintainer-clean in the source tree.' + errmsg_cleanup = 'To clean up, run make distclean in the source tree.' error(errmsg_nonclean_base.format(errmsg_cleanup)) endif @@ -159,12 +159,6 @@ cdata.set_quoted('CONFIGURE_ARGS', '') # Basic platform specific configuration ############################################################### -# meson's system names don't quite map to our "traditional" names. In some -# places we need the "traditional" name, e.g., for mapping -# src/include/port/$os.h to src/include/pg_config_os.h. Define portname for -# that purpose. -portname = host_system - exesuffix = '' # overridden below where necessary dlsuffix = '.so' # overridden below where necessary library_path_var = 'LD_LIBRARY_PATH' @@ -190,33 +184,24 @@ sema_kind = 'sysv' if host_system == 'dragonfly' # apparently the most similar host_system = 'netbsd' +elif host_system == 'android' + # while android isn't quite a normal linux, it seems close enough + # for our purposes so far + host_system = 'linux' endif -if host_system == 'aix' - library_path_var = 'LIBPATH' - - export_file_format = 'aix' - export_fmt = '-Wl,-bE:@0@' - mod_link_args_fmt = ['-Wl,-bI:@0@'] - mod_link_with_dir = 'libdir' - mod_link_with_name = '@0@.imp' - - # M:SRE sets a flag indicating that an object is a shared library. Seems to - # work in some circumstances without, but required in others. - ldflags_sl += '-Wl,-bM:SRE' - ldflags_be += '-Wl,-brtllib' - - # Native memset() is faster, tested on: - # - AIX 5.1 and 5.2, XLC 6.0 (IBM's cc) - # - AIX 5.3 ML3, gcc 4.0.1 - memset_loop_limit = 0 +# meson's system names don't quite map to our "traditional" names. In some +# places we need the "traditional" name, e.g., for mapping +# src/include/port/$os.h to src/include/pg_config_os.h. Define portname for +# that purpose. +portname = host_system -elif host_system == 'cygwin' +if host_system == 'cygwin' sema_kind = 'unnamed_posix' cppflags += '-D_GNU_SOURCE' dlsuffix = '.dll' mod_link_args_fmt = ['@0@'] - mod_link_with_name = 'lib@0@.exe.a' + mod_link_with_name = 'lib@0@.a' mod_link_with_dir = 'libdir' elif host_system == 'darwin' @@ -224,7 +209,7 @@ elif host_system == 'darwin' library_path_var = 'DYLD_LIBRARY_PATH' export_file_format = 'darwin' - export_fmt = '-exported_symbols_list=@0@' + export_fmt = '-Wl,-exported_symbols_list,@0@' mod_link_args_fmt = ['-bundle_loader', '@0@'] mod_link_with_dir = 'bindir' @@ -237,10 +222,20 @@ elif host_system == 'darwin' cflags += ['-isysroot', pg_sysroot] ldflags += ['-isysroot', pg_sysroot] endif + # meson defaults to -Wl,-undefined,dynamic_lookup for modules, which we # don't want because a) it's different from what we do for autoconf, b) it - # causes warnings starting in macOS Ventura - ldflags_mod += ['-Wl,-undefined,error'] + # causes warnings in macOS Ventura. But using -Wl,-undefined,error causes a + # warning starting in Sonoma. So only add -Wl,-undefined,error if it does + # not cause a warning. + if cc.has_multi_link_arguments('-Wl,-undefined,error', '-Werror') + ldflags_mod += '-Wl,-undefined,error' + endif + + # Starting in Sonoma, the linker warns about the same library being + # linked twice. Which can easily happen when multiple dependencies + # depend on the same library. Quiesce the ill considered warning. + ldflags += cc.get_supported_link_arguments('-Wl,-no_warn_duplicate_libraries') elif host_system == 'freebsd' sema_kind = 'unnamed_posix' @@ -278,10 +273,10 @@ elif host_system == 'windows' export_file_suffix = 'def' if cc.get_id() == 'msvc' export_fmt = '/DEF:@0@' - mod_link_with_name = '@0@.exe.lib' + mod_link_with_name = '@0@.lib' else export_fmt = '@0@' - mod_link_with_name = 'lib@0@.exe.a' + mod_link_with_name = 'lib@0@.a' endif mod_link_args_fmt = ['@0@'] mod_link_with_dir = 'libdir' @@ -331,10 +326,10 @@ perl = find_program(get_option('PERL'), required: true, native: true) python = find_program(get_option('PYTHON'), required: true, native: true) flex = find_program(get_option('FLEX'), native: true, version: '>= 2.5.35') bison = find_program(get_option('BISON'), native: true, version: '>= 2.3') -sed = find_program(get_option('SED'), 'sed', native: true) +sed = find_program(get_option('SED'), 'sed', native: true, required: false) prove = find_program(get_option('PROVE'), native: true, required: false) -tar = find_program(get_option('TAR'), native: true) -gzip = find_program(get_option('GZIP'), native: true) +tar = find_program(get_option('TAR'), native: true, required: false) +gzip = find_program(get_option('GZIP'), native: true, required: false) program_lz4 = find_program(get_option('LZ4'), native: true, required: false) openssl = find_program(get_option('OPENSSL'), native: true, required: false) program_zstd = find_program(get_option('ZSTD'), native: true, required: false) @@ -361,6 +356,10 @@ bison_kw = { } flex_flags = [] +if flex.found() + flex_version_c = run_command(flex, '--version', check: true) + flex_version = flex_version_c.stdout().split(' ')[1].split('\n')[0] +endif flex_wrapper = files('src/tools/pgflex') flex_cmd = [python, flex_wrapper, '--builddir', '@BUILD_ROOT@', @@ -427,6 +426,7 @@ meson_bin = find_program(meson_binpath, native: true) ############################################################### cdata.set('USE_ASSERT_CHECKING', get_option('cassert') ? 1 : false) +cdata.set('USE_INJECTION_POINTS', get_option('injection_points') ? 1 : false) blocksize = get_option('blocksize').to_int() * 1024 @@ -507,7 +507,10 @@ endif dir_man = get_option('mandir') # FIXME: These used to be separately configurable - worth adding? -dir_doc = get_option('datadir') / 'doc' / 'postgresql' +dir_doc = get_option('datadir') / 'doc' +if not (dir_prefix_contains_pg or dir_doc.contains('pgsql') or dir_doc.contains('postgres')) + dir_doc = dir_doc / pkg +endif dir_doc_html = dir_doc / 'html' dir_locale = get_option('localedir') @@ -519,6 +522,7 @@ dir_include_internal = dir_include_pkg / 'internal' dir_include_server = dir_include_pkg / 'server' dir_include_extension = dir_include_server / 'extension' dir_data_extension = dir_data / 'extension' +dir_doc_extension = dir_doc / 'extension' @@ -543,7 +547,8 @@ test_c_args = cppflags + cflags bsd_authopt = get_option('bsd_auth') bsd_auth = not_found_dep if cc.check_header('bsd_auth.h', required: bsd_authopt, - args: test_c_args, include_directories: postgres_inc) + args: test_c_args, prefix: '#include ', + include_directories: postgres_inc) cdata.set('USE_BSD_AUTH', 1) bsd_auth = declare_dependency() endif @@ -579,7 +584,7 @@ if not docs_opt.disabled() if xmllint_bin.found() and xsltproc_bin.found() docs_dep = declare_dependency() elif docs_opt.enabled() - error('missing required tools for docs in HTML / man page format') + error('missing required tools (xmllint and xsltproc needed) for docs in HTML / man page format') endif endif @@ -610,31 +615,66 @@ gssapiopt = get_option('gssapi') krb_srvtab = '' have_gssapi = false if not gssapiopt.disabled() - gssapi = dependency('krb5-gssapi', required: gssapiopt) + gssapi = dependency('krb5-gssapi', required: false) have_gssapi = gssapi.found() + if have_gssapi + gssapi_deps = [gssapi] + elif not have_gssapi + # Hardcoded lookup for gssapi. This is necessary as gssapi on windows does + # not install neither pkg-config nor cmake dependency information. + if host_system == 'windows' + is_64 = cc.sizeof('void *', args: test_c_args) == 8 + if is_64 + gssapi_search_libs = ['gssapi64', 'krb5_64', 'comerr64'] + else + gssapi_search_libs = ['gssapi32', 'krb5_32', 'comerr32'] + endif + else + gssapi_search_libs = ['gssapi_krb5'] + endif + + gssapi_deps = [] + foreach libname : gssapi_search_libs + lib = cc.find_library(libname, dirs: test_lib_d, required: false) + if lib.found() + have_gssapi = true + gssapi_deps += lib + endif + endforeach + + if have_gssapi + # Meson before 0.57.0 did not support using check_header() etc with + # declare_dependency(). Thus the tests below use the library looked up + # above. Once we require a newer meson version, we can simplify. + gssapi = declare_dependency(dependencies: gssapi_deps) + endif + endif + if not have_gssapi - elif cc.check_header('gssapi/gssapi.h', dependencies: gssapi, required: false, + elif cc.check_header('gssapi/gssapi.h', dependencies: gssapi_deps, required: false, args: test_c_args, include_directories: postgres_inc) cdata.set('HAVE_GSSAPI_GSSAPI_H', 1) - elif cc.check_header('gssapi.h', args: test_c_args, dependencies: gssapi, required: gssapiopt) + elif cc.check_header('gssapi.h', dependencies: gssapi_deps, required: gssapiopt, + args: test_c_args, include_directories: postgres_inc) cdata.set('HAVE_GSSAPI_H', 1) else have_gssapi = false endif if not have_gssapi - elif cc.check_header('gssapi/gssapi_ext.h', dependencies: gssapi, required: false, + elif cc.check_header('gssapi/gssapi_ext.h', dependencies: gssapi_deps, required: false, args: test_c_args, include_directories: postgres_inc) cdata.set('HAVE_GSSAPI_GSSAPI_EXT_H', 1) - elif cc.check_header('gssapi_ext.h', args: test_c_args, dependencies: gssapi, required: gssapiopt) + elif cc.check_header('gssapi_ext.h', dependencies: gssapi_deps, required: gssapiopt, + args: test_c_args, include_directories: postgres_inc) cdata.set('HAVE_GSSAPI_EXT_H', 1) else have_gssapi = false endif if not have_gssapi - elif cc.has_function('gss_store_cred_into', dependencies: gssapi, + elif cc.has_function('gss_store_cred_into', dependencies: gssapi_deps, args: test_c_args, include_directories: postgres_inc) cdata.set('ENABLE_GSS', 1) @@ -645,6 +685,11 @@ if not gssapiopt.disabled() else have_gssapi = false endif + + if not have_gssapi and gssapiopt.enabled() + error('dependency lookup for gssapi failed') + endif + endif if not have_gssapi gssapi = not_found_dep @@ -742,9 +787,9 @@ endif ############################################################### llvmopt = get_option('llvm') -if not llvmopt.disabled() - add_languages('cpp', required: true, native: false) - llvm = dependency('llvm', version: '>=3.9', method: 'config-tool', required: llvmopt) +llvm = not_found_dep +if add_languages('cpp', required: llvmopt, native: false) + llvm = dependency('llvm', version: '>=10', method: 'config-tool', required: llvmopt) if llvm.found() @@ -755,10 +800,13 @@ if not llvmopt.disabled() llvm_binpath = llvm.get_variable(configtool: 'bindir') ccache = find_program('ccache', native: true, required: false) - clang = find_program(llvm_binpath / 'clang', required: true) + + # Some distros put LLVM and clang in different paths, so fallback to + # find via PATH, too. + clang = find_program(llvm_binpath / 'clang', 'clang', required: true) endif -else - llvm = not_found_dep +elif llvmopt.auto() + message('llvm requires a C++ compiler') endif @@ -769,11 +817,25 @@ endif icuopt = get_option('icu') if not icuopt.disabled() - icu = dependency('icu-uc', required: icuopt.enabled()) - icu_i18n = dependency('icu-i18n', required: icuopt.enabled()) + icu = dependency('icu-uc', required: false) + if icu.found() + icu_i18n = dependency('icu-i18n', required: true) + endif + + # Unfortunately the dependency is named differently with cmake + if not icu.found() # combine with above once meson 0.60.0 is required + icu = dependency('ICU', required: icuopt, + components: ['uc'], modules: ['ICU::uc'], method: 'cmake') + if icu.found() + icu_i18n = dependency('ICU', required: true, + components: ['i18n'], modules: ['ICU::i18n']) + endif + endif if icu.found() cdata.set('USE_ICU', 1) + else + icu_i18n = not_found_dep endif else @@ -789,7 +851,12 @@ endif libxmlopt = get_option('libxml') if not libxmlopt.disabled() - libxml = dependency('libxml-2.0', required: libxmlopt, version: '>= 2.6.23') + libxml = dependency('libxml-2.0', required: false, version: '>= 2.6.23') + # Unfortunately the dependency is named differently with cmake + if not libxml.found() # combine with above once meson 0.60.0 is required + libxml = dependency('LibXml2', required: libxmlopt, version: '>= 2.6.23', + method: 'cmake') + endif if libxml.found() cdata.set('USE_LIBXML', 1) @@ -806,7 +873,11 @@ endif libxsltopt = get_option('libxslt') if not libxsltopt.disabled() - libxslt = dependency('libxslt', required: libxsltopt) + libxslt = dependency('libxslt', required: false) + # Unfortunately the dependency is named differently with cmake + if not libxslt.found() # combine with above once meson 0.60.0 is required + libxslt = dependency('LibXslt', required: libxsltopt, method: 'cmake') + endif if libxslt.found() cdata.set('USE_LIBXSLT', 1) @@ -823,7 +894,13 @@ endif lz4opt = get_option('lz4') if not lz4opt.disabled() - lz4 = dependency('liblz4', required: lz4opt) + lz4 = dependency('liblz4', required: false) + # Unfortunately the dependency is named differently with cmake + if not lz4.found() # combine with above once meson 0.60.0 is required + lz4 = dependency('lz4', required: lz4opt, + method: 'cmake', modules: ['LZ4::lz4_shared'], + ) + endif if lz4.found() cdata.set('USE_LZ4', 1) @@ -978,7 +1055,10 @@ if not perlopt.disabled() if cc.get_id() == 'msvc' # prevent binary mismatch between MSVC built plperl and Strawberry or # msys ucrt perl libraries - perl_ccflags += ['-DNO_THREAD_SAFE_LOCALE'] + perl_v = run_command(perl, '-V').stdout() + if not perl_v.contains('USE_THREAD_SAFE_LOCALE') + perl_ccflags += ['-DNO_THREAD_SAFE_LOCALE'] + endif endif endif @@ -989,20 +1069,19 @@ if not perlopt.disabled() # Config's ccdlflags and ldflags. (Those are the choices of those who # built the Perl installation, which are not necessarily appropriate # for building PostgreSQL.) - ldopts = run_command(perl, '-MExtUtils::Embed', '-e', 'ldopts', check: true).stdout().strip() - undesired = run_command(perl_conf_cmd, 'ccdlflags', check: true).stdout().split() - undesired += run_command(perl_conf_cmd, 'ldflags', check: true).stdout().split() - - perl_ldopts = [] - foreach ldopt : ldopts.split(' ') - if ldopt == '' or ldopt in undesired - continue - endif - - perl_ldopts += ldopt.strip('"') - endforeach + perl_ldopts = run_command(perl, '-e', ''' +use ExtUtils::Embed; +use Text::ParseWords; +# tell perl to suppress including these in ldopts +*ExtUtils::Embed::_ldflags =*ExtUtils::Embed::_ccdlflags = sub { return ""; }; +# adding an argument to ldopts makes it return a value instead of printing +# print one of these per line so splitting will preserve spaces in file names. +# shellwords eats backslashes, so we need to escape them. +(my $opts = ldopts(undef)) =~ s!\\!\\\\!g; +print "$_\n" foreach shellwords($opts); +''', + check: true).stdout().strip().split('\n') - message('LDFLAGS recommended by perl: "@0@"'.format(ldopts)) message('LDFLAGS for embedding perl: "@0@"'.format(' '.join(perl_ldopts))) perl_dep_int = declare_dependency( @@ -1052,15 +1131,17 @@ endif ############################################################### pyopt = get_option('plpython') +python3_dep = not_found_dep if not pyopt.disabled() pm = import('python') - python3_inst = pm.find_installation(required: pyopt.enabled()) - python3_dep = python3_inst.dependency(embed: true, required: pyopt.enabled()) - if not cc.check_header('Python.h', dependencies: python3_dep, required: pyopt.enabled()) - python3_dep = not_found_dep + python3_inst = pm.find_installation(python.path(), required: pyopt) + if python3_inst.found() + python3_dep = python3_inst.dependency(embed: true, required: pyopt) + # Remove this check after we depend on Meson >= 1.1.0 + if not cc.check_header('Python.h', dependencies: python3_dep, required: pyopt, include_directories: postgres_inc) + python3_dep = not_found_dep + endif endif -else - python3_dep = not_found_dep endif @@ -1071,15 +1152,26 @@ endif if not get_option('readline').disabled() libedit_preferred = get_option('libedit_preferred') - # Set the order of readline dependencies - check_readline_deps = libedit_preferred ? \ - ['libedit', 'readline'] : ['readline', 'libedit'] + # Set the order of readline dependencies. + # cc.find_library breaks and throws on the first dependency which + # is marked as required=true and can't be found. Thus, we only mark + # the last dependency to look up as required, to not throw too early. + check_readline_deps = [ + { + 'name': libedit_preferred ? 'libedit' : 'readline', + 'required': false + }, + { + 'name': libedit_preferred ? 'readline' : 'libedit', + 'required': get_option('readline') + } + ] foreach readline_dep : check_readline_deps - readline = dependency(readline_dep, required: false) + readline = dependency(readline_dep['name'], required: false) if not readline.found() - readline = cc.find_library(readline_dep, - required: get_option('readline').enabled(), + readline = cc.find_library(readline_dep['name'], + required: readline_dep['required'], dirs: test_lib_d) endif if readline.found() @@ -1129,7 +1221,7 @@ if not get_option('readline').disabled() if not at_least_one_header_found error('''readline header not found -If you have @0@ already installed, see meson-log/meson-log.txt for details on the +If you have @0@ already installed, see meson-logs/meson-log.txt for details on the failure. It is possible the compiler isn't looking in the proper directory. Use -Dreadline=disabled to disable readline support.'''.format(readline_dep)) endif @@ -1242,14 +1334,37 @@ if sslopt in ['auto', 'openssl'] # via library + headers if not ssl.found() + is_windows = host_system == 'windows' + + ssl_lib_common_params = { + 'dirs': test_lib_d, + 'header_include_directories': postgres_inc, + 'has_headers': ['openssl/ssl.h', 'openssl/err.h'], + } ssl_lib = cc.find_library('ssl', - dirs: test_lib_d, - header_include_directories: postgres_inc, - has_headers: ['openssl/ssl.h', 'openssl/err.h'], - required: openssl_required) + kwargs: ssl_lib_common_params, + required: openssl_required and not is_windows + ) + # Before OpenSSL 1.1.0, there was a different naming convention for + # libraries on Windows, so try the alternative name if ssl wasn't found + if not ssl_lib.found() and is_windows + ssl_lib = cc.find_library('ssleay32', + kwargs: ssl_lib_common_params, + required: openssl_required + ) + endif + crypto_lib = cc.find_library('crypto', dirs: test_lib_d, - required: openssl_required) + required: openssl_required and not is_windows) + # Before OpenSSL 1.1.0, there was a different naming convention for + # libraries on Windows, so try the alternatve name if crypto wasn't found + if not crypto_lib.found() and is_windows + crypto_lib = cc.find_library('libeay32', + dirs: test_lib_d, + required: openssl_required) + endif + if ssl_lib.found() and crypto_lib.found() ssl_int = [ssl_lib, crypto_lib] ssl = declare_dependency(dependencies: ssl_int, include_directories: postgres_inc) @@ -1266,9 +1381,8 @@ if sslopt in ['auto', 'openssl'] ['CRYPTO_new_ex_data', {'required': true}], ['SSL_new', {'required': true}], - # Functions introduced in OpenSSL 1.0.2. - ['X509_get_signature_nid'], - ['SSL_CTX_set_cert_cb'], # not in LibreSSL + # Function introduced in OpenSSL 1.0.2, not in LibreSSL. + ['SSL_CTX_set_cert_cb'], # Functions introduced in OpenSSL 1.1.0. We used to check for # OPENSSL_VERSION_NUMBER, but that didn't work with 1.1.0, because LibreSSL @@ -1276,7 +1390,6 @@ if sslopt in ['auto', 'openssl'] # doesn't have these OpenSSL 1.1.0 functions. So check for individual # functions. ['OPENSSL_init_ssl'], - ['BIO_get_data'], ['BIO_meth_new'], ['ASN1_STRING_get0_data'], ['HMAC_CTX_new'], @@ -1289,6 +1402,7 @@ if sslopt in ['auto', 'openssl'] # Function introduced in OpenSSL 1.1.1 ['X509_get_signature_info'], + ['SSL_CTX_set_num_tickets'], ] are_openssl_funcs_complete = true @@ -1310,7 +1424,7 @@ if sslopt in ['auto', 'openssl'] if are_openssl_funcs_complete cdata.set('USE_OPENSSL', 1, description: 'Define to 1 to build with OpenSSL support. (-Dssl=openssl)') - cdata.set('OPENSSL_API_COMPAT', '0x10001000L', + cdata.set('OPENSSL_API_COMPAT', '0x10002000L', description: 'Define to the OpenSSL API version in use. This avoids deprecation warnings from newer OpenSSL versions.') ssl_library = 'openssl' else @@ -1342,14 +1456,34 @@ if uuidopt != 'none' uuidfunc = 'uuid_to_string' uuidheader = 'uuid.h' elif uuidopt == 'ossp' - uuid = dependency('ossp-uuid', required: true) + # In upstream, the package and library is called just 'uuid', but many + # distros change it to 'ossp-uuid'. + uuid = dependency('ossp-uuid', 'uuid', required: false) uuidfunc = 'uuid_export' uuidheader = 'uuid.h' + + # Hardcoded lookup for ossp-uuid. This is necessary as ossp-uuid on + # windows installs neither a pkg-config nor a cmake dependency + # information. Nor is there another supported uuid implementation + # available on windows. + if not uuid.found() + uuid = cc.find_library('ossp-uuid', + required: false, dirs: test_lib_d, + has_headers: uuidheader, header_include_directories: postgres_inc) + endif + if not uuid.found() + uuid = cc.find_library('uuid', + required: true, dirs: test_lib_d, + has_headers: uuidheader, header_include_directories: postgres_inc) + endif else error('unknown uuid build option value: @0@'.format(uuidopt)) endif - if not cc.has_header_symbol(uuidheader, uuidfunc, args: test_c_args, dependencies: uuid) + if not cc.has_header_symbol(uuidheader, uuidfunc, + args: test_c_args, + include_directories: postgres_inc, + dependencies: uuid) error('uuid library @0@ missing required function @1@'.format(uuidopt, uuidfunc)) endif cdata.set('HAVE_@0@'.format(uuidheader.underscorify().to_upper()), 1) @@ -1379,16 +1513,8 @@ if not zlibopt.disabled() warning('did not find zlib') elif not cc.has_header('zlib.h', args: test_c_args, include_directories: postgres_inc, - dependencies: [zlib_t], required: zlibopt.enabled()) + dependencies: [zlib_t], required: zlibopt) warning('zlib header not found') - elif not cc.has_type('z_streamp', - dependencies: [zlib_t], prefix: '#include ', - args: test_c_args, include_directories: postgres_inc) - if zlibopt.enabled() - error('zlib version is too old') - else - warning('zlib version is too old') - endif else zlib = zlib_t endif @@ -1430,7 +1556,12 @@ endif zstdopt = get_option('zstd') if not zstdopt.disabled() - zstd = dependency('libzstd', required: zstdopt, version: '>=1.4.0') + zstd = dependency('libzstd', required: false, version: '>=1.4.0') + # Unfortunately the dependency is named differently with cmake + if not zstd.found() # combine with above once meson 0.60.0 is required + zstd = dependency('zstd', required: zstdopt, version: '>=1.4.0', + method: 'cmake', modules: ['zstd::libzstd_shared']) + endif if zstd.found() cdata.set('USE_ZSTD', 1) @@ -1494,30 +1625,49 @@ sizeof_long = cc.sizeof('long', args: test_c_args) cdata.set('SIZEOF_LONG', sizeof_long) if sizeof_long == 8 cdata.set('HAVE_LONG_INT_64', 1) - cdata.set('PG_INT64_TYPE', 'long int') + pg_int64_type = 'long int' cdata.set_quoted('INT64_MODIFIER', 'l') elif sizeof_long == 4 and cc.sizeof('long long', args: test_c_args) == 8 cdata.set('HAVE_LONG_LONG_INT_64', 1) - cdata.set('PG_INT64_TYPE', 'long long int') + pg_int64_type = 'long long int' cdata.set_quoted('INT64_MODIFIER', 'll') else error('do not know how to get a 64bit int') endif +cdata.set('PG_INT64_TYPE', pg_int64_type) if host_machine.endian() == 'big' cdata.set('WORDS_BIGENDIAN', 1) endif +# Determine memory alignment requirements for the basic C data types. + alignof_types = ['short', 'int', 'long', 'double'] -maxalign = 0 foreach t : alignof_types align = cc.alignment(t, args: test_c_args) - if maxalign < align - maxalign = align - endif cdata.set('ALIGNOF_@0@'.format(t.to_upper()), align) endforeach -cdata.set('MAXIMUM_ALIGNOF', maxalign) + +# Compute maximum alignment of any basic type. +# +# We require 'double' to have the strictest alignment among the basic types, +# because otherwise the C ABI might impose 8-byte alignment on some of the +# other C types that correspond to TYPALIGN_DOUBLE SQL types. That could +# cause a mismatch between the tuple layout and the C struct layout of a +# catalog tuple. We used to carefully order catalog columns such that any +# fixed-width, attalign=4 columns were at offsets divisible by 8 regardless +# of MAXIMUM_ALIGNOF to avoid that, but we no longer support any platforms +# where TYPALIGN_DOUBLE != MAXIMUM_ALIGNOF. +# +# We assume without checking that int64's alignment is at least as strong +# as long, char, short, or int. Note that we intentionally do not consider +# any types wider than 64 bits, as allowing MAXIMUM_ALIGNOF to exceed 8 +# would be too much of a penalty for disk and memory space. +alignof_double = cdata.get('ALIGNOF_DOUBLE') +if cc.alignment(pg_int64_type, args: test_c_args) > alignof_double + error('alignment of int64 is greater than the alignment of double') +endif +cdata.set('MAXIMUM_ALIGNOF', alignof_double) cdata.set('SIZEOF_VOID_P', cc.sizeof('void *', args: test_c_args)) cdata.set('SIZEOF_SIZE_T', cc.sizeof('size_t', args: test_c_args)) @@ -1566,7 +1716,7 @@ if cc.links(''' if not meson.is_cross_build() r = cc.run(''' /* This must match the corresponding code in c.h: */ - #if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__) + #if defined(__GNUC__) || defined(__SUNPRO_C) #define pg_attribute_aligned(a) __attribute__((aligned(a))) #elif defined(_MSC_VER) #define pg_attribute_aligned(a) __declspec(align(a)) @@ -1638,12 +1788,9 @@ if cc.compiles(''' endif -# We use if we have it and it declares type bool as having -# size 1. Otherwise, c.h will fall back to declaring bool as unsigned char. -if cc.has_type('_Bool', args: test_c_args) \ - and cc.has_type('bool', prefix: '#include ', args: test_c_args) \ - and cc.sizeof('bool', prefix: '#include ', args: test_c_args) == 1 - cdata.set('HAVE__BOOL', 1) +# We use if bool has size 1 after including it. Otherwise, c.h +# will fall back to declaring bool as unsigned char. +if cc.sizeof('bool', prefix: '#include ', args: test_c_args) == 1 cdata.set('PG_USE_STDBOOL', 1) endif @@ -1768,6 +1915,30 @@ elif cc.links(''' endif +# Check for __get_cpuid_count() and __cpuidex() in a similar fashion. +if cc.links(''' + #include + int main(int arg, char **argv) + { + unsigned int exx[4] = {0, 0, 0, 0}; + __get_cpuid_count(7, 0, &exx[0], &exx[1], &exx[2], &exx[3]); + } + ''', name: '__get_cpuid_count', + args: test_c_args) + cdata.set('HAVE__GET_CPUID_COUNT', 1) +elif cc.links(''' + #include + int main(int arg, char **argv) + { + unsigned int exx[4] = {0, 0, 0, 0}; + __cpuidex(exx, 7, 0); + } + ''', name: '__cpuidex', + args: test_c_args) + cdata.set('HAVE__CPUIDEX', 1) +endif + + # Defend against clang being used on x86-32 without SSE2 enabled. As current # versions of clang do not understand -fexcess-precision=standard, the use of # x87 floating point operations leads to problems like isinf possibly returning @@ -1876,7 +2047,6 @@ foreach w : negative_warning_flags endforeach -# From Project.pm if cc.get_id() == 'msvc' cflags_warn += [ '/wd4018', # signed/unsigned mismatch @@ -1905,6 +2075,38 @@ if cc.get_id() == 'msvc' endif +# Compute flags that are built into Meson. We need these to +# substitute into Makefile.global and for pg_config. We only compute +# the flags for Unix-style compilers, since that's the only style that +# would use Makefile.global or pg_config. + +# We don't use get_option('warning_level') here, because the other +# warning levels are not useful with PostgreSQL source code. +common_builtin_flags = ['-Wall'] + +if get_option('debug') + common_builtin_flags += ['-g'] +endif + +optimization = get_option('optimization') +if optimization == '0' + common_builtin_flags += ['-O0'] +elif optimization == '1' + common_builtin_flags += ['-O1'] +elif optimization == '2' + common_builtin_flags += ['-O2'] +elif optimization == '3' + common_builtin_flags += ['-O3'] +elif optimization == 's' + common_builtin_flags += ['-Os'] +endif + +cflags_builtin = cc.get_supported_arguments(common_builtin_flags) +if llvm.found() + cxxflags_builtin = cpp.get_supported_arguments(common_builtin_flags) +endif + + ############################################################### # Atomics @@ -1982,6 +2184,69 @@ int main(void) endif +############################################################### +# Check for the availability of XSAVE intrinsics. +############################################################### + +cflags_xsave = [] +if host_cpu == 'x86' or host_cpu == 'x86_64' + + prog = ''' +#include + +int main(void) +{ + return _xgetbv(0) & 0xe0; +} +''' + + if cc.links(prog, name: 'XSAVE intrinsics without -mxsave', + args: test_c_args) + cdata.set('HAVE_XSAVE_INTRINSICS', 1) + elif cc.links(prog, name: 'XSAVE intrinsics with -mxsave', + args: test_c_args + ['-mxsave']) + cdata.set('HAVE_XSAVE_INTRINSICS', 1) + cflags_xsave += '-mxsave' + endif + +endif + + +############################################################### +# Check for the availability of AVX-512 popcount intrinsics. +############################################################### + +cflags_popcnt = [] +if host_cpu == 'x86_64' + + prog = ''' +#include + +int main(void) +{ + const char buf[sizeof(__m512i)]; + INT64 popcnt = 0; + __m512i accum = _mm512_setzero_si512(); + const __m512i val = _mm512_maskz_loadu_epi8((__mmask64) 0xf0f0f0f0f0f0f0f0, (const __m512i *) buf); + const __m512i cnt = _mm512_popcnt_epi64(val); + accum = _mm512_add_epi64(accum, cnt); + popcnt = _mm512_reduce_add_epi64(accum); + /* return computed value, to prevent the above being optimized away */ + return popcnt == 0; +} +''' + + if cc.links(prog, name: 'AVX-512 popcount without -mavx512vpopcntdq -mavx512bw', + args: test_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))]) + cdata.set('USE_AVX512_POPCNT_WITH_RUNTIME_CHECK', 1) + elif cc.links(prog, name: 'AVX-512 popcount with -mavx512vpopcntdq -mavx512bw', + args: test_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))] + ['-mavx512vpopcntdq'] + ['-mavx512bw']) + cdata.set('USE_AVX512_POPCNT_WITH_RUNTIME_CHECK', 1) + cflags_popcnt += ['-mavx512vpopcntdq'] + ['-mavx512bw'] + endif + +endif + ############################################################### # Select CRC-32C implementation. @@ -2062,6 +2327,13 @@ int main(void) # Use ARM CRC Extension unconditionally cdata.set('USE_ARMV8_CRC32C', 1) have_optimized_crc = true + elif cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd with -march=armv8-a+crc+simd', + args: test_c_args + ['-march=armv8-a+crc+simd']) + # Use ARM CRC Extension, with runtime check + cflags_crc += '-march=armv8-a+crc+simd' + cdata.set('USE_ARMV8_CRC32C', false) + cdata.set('USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 1) + have_optimized_crc = true elif cc.links(prog, name: '__crc32cb, __crc32ch, __crc32cw, and __crc32cd with -march=armv8-a+crc', args: test_c_args + ['-march=armv8-a+crc']) # Use ARM CRC Extension, with runtime check @@ -2070,6 +2342,30 @@ int main(void) cdata.set('USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK', 1) have_optimized_crc = true endif + +elif host_cpu == 'loongarch64' + + prog = ''' +int main(void) +{ + unsigned int crc = 0; + crc = __builtin_loongarch_crcc_w_b_w(0, crc); + crc = __builtin_loongarch_crcc_w_h_w(0, crc); + crc = __builtin_loongarch_crcc_w_w_w(0, crc); + crc = __builtin_loongarch_crcc_w_d_w(0, crc); + + /* return computed value, to prevent the above being optimized away */ + return crc == 0; +} +''' + + if cc.links(prog, name: '__builtin_loongarch_crcc_w_b_w, __builtin_loongarch_crcc_w_h_w, __builtin_loongarch_crcc_w_w_w, and __builtin_loongarch_crcc_w_d_w', + args: test_c_args) + # Use LoongArch CRC instruction unconditionally + cdata.set('USE_LOONGARCH_CRC32C', 1) + have_optimized_crc = true + endif + endif if not have_optimized_crc @@ -2135,7 +2431,6 @@ header_checks = [ 'ifaddrs.h', 'langinfo.h', 'mbarrier.h', - 'stdbool.h', 'strings.h', 'sys/epoll.h', 'sys/event.h', @@ -2174,16 +2469,40 @@ decl_checks = [ decl_checks += [ ['preadv', 'sys/uio.h'], ['pwritev', 'sys/uio.h'], + ['strchrnul', 'string.h'], ] +# Check presence of some optional LLVM functions. +if llvm.found() + decl_checks += [ + ['LLVMCreateGDBRegistrationListener', 'llvm-c/ExecutionEngine.h'], + ['LLVMCreatePerfJITEventListener', 'llvm-c/ExecutionEngine.h'], + ] +endif + foreach c : decl_checks func = c.get(0) header = c.get(1) args = c.get(2, {}) varname = 'HAVE_DECL_' + func.underscorify().to_upper() - found = cc.has_header_symbol(header, func, - args: test_c_args, include_directories: postgres_inc, + found = cc.compiles(''' +#include <@0@> + +int main() +{ +#ifndef @1@ + (void) @1@; +#endif + +return 0; +} +'''.format(header, func), + name: 'test whether @0@ is declared'.format(func), + # need to add cflags_warn to get at least + # -Werror=unguarded-availability-new if applicable + args: test_c_args + cflags_warn, + include_directories: postgres_inc, kwargs: args) cdata.set10(varname, found, description: '''Define to 1 if you have the declaration of `@0@', and to 0 if you @@ -2280,17 +2599,13 @@ else cdata.set('STRERROR_R_INT', false) endif -# Check for the locale_t type and find the right header file. macOS -# needs xlocale.h; standard is locale.h, but glibc also has an -# xlocale.h file that we should not use. MSVC has a replacement -# defined in src/include/port/win32_port.h. -if cc.has_type('locale_t', prefix: '#include ') - cdata.set('HAVE_LOCALE_T', 1) -elif cc.has_type('locale_t', prefix: '#include ') - cdata.set('HAVE_LOCALE_T', 1) +# Find the right header file for the locale_t type. macOS needs xlocale.h; +# standard is locale.h, but glibc <= 2.25 also had an xlocale.h file that +# we should not use so we check the standard header first. MSVC has a +# replacement defined in src/include/port/win32_port.h. +if not cc.has_type('locale_t', prefix: '#include ') and \ + cc.has_type('locale_t', prefix: '#include ') cdata.set('LOCALE_T_IN_XLOCALE', 1) -elif cc.get_id() == 'msvc' - cdata.set('HAVE_LOCALE_T', 1) endif # Check if the C compiler understands typeof or a variant. Define @@ -2347,10 +2662,6 @@ endif # conflict. # # We assume C99 support, so we don't need to make this conditional. -# -# XXX: Historically we allowed platforms to disable restrict in template -# files, but that was only added for AIX when building with XLC, which we -# don't support yet. cdata.set('pg_restrict', '__restrict') @@ -2365,7 +2676,6 @@ rt_dep = cc.find_library('rt', required: false) dl_dep = cc.find_library('dl', required: false) util_dep = cc.find_library('util', required: false) -posix4_dep = cc.find_library('posix4', required: false) getopt_dep = cc.find_library('getopt', required: false) gnugetopt_dep = cc.find_library('gnugetopt', required: false) @@ -2399,14 +2709,14 @@ endif func_checks = [ ['_configthreadlocale', {'skip': host_system != 'windows'}], ['backtrace_symbols', {'dependencies': [execinfo_dep]}], - ['clock_gettime', {'dependencies': [rt_dep, posix4_dep], 'define': false}], + ['clock_gettime', {'dependencies': [rt_dep], 'define': false}], ['copyfile'], + ['copy_file_range'], # gcc/clang's sanitizer helper library provides dlopen but not dlsym, thus # when enabling asan the dlopen check doesn't notice that -ldl is actually # required. Just checking for dlsym() ought to suffice. ['dlsym', {'dependencies': [dl_dep], 'define': false}], ['explicit_bzero'], - ['fdatasync', {'dependencies': [rt_dep, posix4_dep], 'define': false}], # Solaris ['getifaddrs'], ['getopt', {'dependencies': [getopt_dep, gnugetopt_dep], 'skip': always_replace_getopt}], ['getopt_long', {'dependencies': [getopt_dep, gnugetopt_dep], 'skip': always_replace_getopt_long}], @@ -2421,7 +2731,6 @@ func_checks = [ ['posix_fadvise'], ['posix_fallocate'], ['ppoll'], - ['pstat'], ['pthread_barrier_wait', {'dependencies': [thread_dep]}], ['pthread_is_threaded_np', {'dependencies': [thread_dep]}], ['sem_init', {'dependencies': [rt_dep, thread_dep], 'skip': sema_kind != 'unnamed_posix', 'define': false}], @@ -2431,7 +2740,6 @@ func_checks = [ ['shm_unlink', {'dependencies': [rt_dep], 'define': false}], ['shmget', {'dependencies': [cygipc_dep], 'define': false}], ['socket', {'dependencies': [socket_dep], 'define': false}], - ['strchrnul'], ['strerror_r', {'dependencies': [thread_dep]}], ['strlcat'], ['strlcpy'], @@ -2486,13 +2794,6 @@ if cc.has_function('syslog', args: test_c_args) and \ endif -# MSVC has replacements defined in src/include/port/win32_port.h. -if cc.get_id() == 'msvc' - cdata.set('HAVE_WCSTOMBS_L', 1) - cdata.set('HAVE_MBSTOWCS_L', 1) -endif - - # if prerequisites for unnamed posix semas aren't fulfilled, fall back to sysv # semaphores if sema_kind == 'unnamed_posix' and \ @@ -2516,17 +2817,6 @@ cdata.set_quoted('PG_VERSION_STR', ) - -############################################################### -# Threading -############################################################### - -# XXX: About to rely on thread safety in the autoconf build, so not worth -# implementing a fallback. -cdata.set('ENABLE_THREAD_SAFETY', 1) - - - ############################################################### # NLS / Gettext ############################################################### @@ -2538,7 +2828,7 @@ if not nlsopt.disabled() # otherwise there'd be lots of # "Gettext not found, all translation (po) targets will be ignored." # warnings if not found. - msgfmt = find_program('msgfmt', required: nlsopt.enabled(), native: true) + msgfmt = find_program('msgfmt', required: nlsopt, native: true) # meson 0.59 has this wrapped in dependency('intl') if (msgfmt.found() and @@ -2827,6 +3117,16 @@ frontend_shlib_code = declare_dependency( dependencies: [shlib_code, os_deps, libintl], ) +# For frontend code that doesn't use fe_utils - this mainly exists for libpq's +# tests, which are defined before fe_utils is defined, as fe_utils depends on +# libpq. +frontend_no_fe_utils_code = declare_dependency( + include_directories: [postgres_inc], + link_with: [common_static, pgport_static], + sources: generated_headers, + dependencies: [os_deps, libintl], +) + # Dependencies both for static and shared libpq libpq_deps += [ thread_dep, @@ -2894,7 +3194,6 @@ subdir('src') subdir('contrib') subdir('src/test') -subdir('src/interfaces/libpq/test') subdir('src/interfaces/ecpg/test') subdir('doc/src/sgml') @@ -2924,8 +3223,12 @@ potentially_conflicting_files = [] foreach t : potentially_conflicting_files_t potentially_conflicting_files += t.full_path() endforeach -foreach t : configure_files - t = '@0@'.format(t) +foreach t1 : configure_files + if meson.version().version_compare('>=0.59') + t = fs.parent(t1) / fs.name(t1) + else + t = '@0@'.format(t1) + endif potentially_conflicting_files += meson.current_build_dir() / t endforeach foreach sub, fnames : generated_sources_ac @@ -2984,24 +3287,30 @@ if libintl.found() and meson.version().version_compare('>=0.60') endif -all_built = [ +# all targets that 'meson install' needs +installed_targets = [ backend_targets, bin_targets, libpq_st, pl_targets, contrib_targets, nls_mo_targets, - testprep_targets, ecpg_targets, ] +# all targets that require building code +all_built = [ + installed_targets, + testprep_targets, +] + # Meson's default install target is quite verbose. Provide one that is quiet. install_quiet = custom_target('install-quiet', output: 'install-quiet', build_always_stale: true, build_by_default: false, command: [meson_bin, meson_args, 'install', '--quiet', '--no-rebuild'], - depends: all_built, + depends: installed_targets, ) # Target to install files used for tests, which aren't installed by default @@ -3029,15 +3338,17 @@ test_install_destdir = meson.build_root() / 'tmp_install/' if build_system != 'windows' # On unixoid systems this is trivial, we just prepend the destdir assert(dir_prefix.startswith('/')) # enforced by meson - test_install_location = '@0@@1@'.format(test_install_destdir, dir_prefix) + temp_install_bindir = '@0@@1@'.format(test_install_destdir, dir_prefix / dir_bin) + temp_install_libdir = '@0@@1@'.format(test_install_destdir, dir_prefix / dir_lib) else # drives, drive-relative paths, etc make this complicated on windows, call # into a copy of meson's logic for it command = [ python, '-c', 'import sys; from pathlib import PurePath; d1=sys.argv[1]; d2=sys.argv[2]; print(str(PurePath(d1, *PurePath(d2).parts[1:])))', - test_install_destdir, dir_prefix] - test_install_location = run_command(command, check: true).stdout().strip() + test_install_destdir] + temp_install_bindir = run_command(command, dir_prefix / dir_bin, check: true).stdout().strip() + temp_install_libdir = run_command(command, dir_prefix / dir_lib, check: true).stdout().strip() endif meson_install_args = meson_args + ['install'] + { @@ -3054,6 +3365,7 @@ test('tmp_install', priority: setup_tests_priority, timeout: 300, is_parallel: false, + depends: installed_targets, suite: ['setup']) test('install_test_files', @@ -3074,9 +3386,12 @@ testport = 40000 test_env = environment() -temp_install_bindir = test_install_location / get_option('bindir') +test_initdb_template = meson.build_root() / 'tmp_install' / 'initdb-template' test_env.set('PG_REGRESS', pg_regress.full_path()) test_env.set('REGRESS_SHLIB', regress_module.full_path()) +test_env.set('INITDB_TEMPLATE', test_initdb_template) +# for Cluster.pm's portlock logic +test_env.set('top_builddir', meson.build_root()) # Test suites that are not safe by default but can be run if selected # by the user via the whitespace-separated list in variable PG_TEST_EXTRA. @@ -3087,10 +3402,39 @@ test_env.set('PG_TEST_EXTRA', get_option('PG_TEST_EXTRA')) # that works (everything but windows, basically). On windows everything # library-like gets installed into bindir, solving that issue. if library_path_var != '' - test_env.prepend(library_path_var, test_install_location / get_option('libdir')) + test_env.prepend(library_path_var, temp_install_libdir) endif +# Create (and remove old) initdb template directory. Tests use that, where +# possible, to make it cheaper to run tests. +# +# Use python to remove the old cached initdb, as we cannot rely on a working +# 'rm' binary on windows. +test('initdb_cache', + python, + args: [ + '-c', ''' +import shutil +import sys +import subprocess + +shutil.rmtree(sys.argv[1], ignore_errors=True) +sp = subprocess.run(sys.argv[2:] + [sys.argv[1]]) +sys.exit(sp.returncode) +''', + test_initdb_template, + temp_install_bindir / 'initdb', + '--auth', 'trust', '--no-sync', '--no-instructions', '--lc-messages=C', + '--no-clean' + ], + priority: setup_tests_priority - 1, + timeout: 300, + is_parallel: false, + env: test_env, + suite: ['setup']) + + ############################################################### # Test Generation @@ -3221,8 +3565,9 @@ foreach test_dir : tests testport += 1 elif kind == 'tap' + testwrap_tap = testwrap_base if not tap_tests_enabled - continue + testwrap_tap += ['--skip', 'TAP tests not enabled'] endif test_command = [ @@ -3262,7 +3607,7 @@ foreach test_dir : tests test(test_dir['name'] / onetap_p, python, kwargs: test_kwargs, - args: testwrap_base + [ + args: testwrap_tap + [ '--testgroup', test_dir['name'], '--testname', onetap_p, '--', test_command, @@ -3299,8 +3644,87 @@ alias_target('bin', bin_targets + [libpq_st]) alias_target('pl', pl_targets) alias_target('contrib', contrib_targets) alias_target('testprep', testprep_targets) + +alias_target('world', all_built, docs) alias_target('install-world', install_quiet, installdocs) +run_target('help', + command: [ + perl, '-ne', 'next if /^#/; print', + files('doc/src/sgml/targets-meson.txt'), + ] +) + + + +############################################################### +# Distribution archive +############################################################### + +# Meson has its own distribution building command (meson dist), but we +# are not using that at this point. The main problem is that, the way +# they have implemented it, it is not deterministic. Also, we want it +# to be equivalent to the "make" version for the time being. But the +# target name "dist" in meson is reserved for that reason, so we call +# the custom target "pgdist". + +git = find_program('git', required: false, native: true, disabler: true) +bzip2 = find_program('bzip2', required: false, native: true) + +distdir = meson.project_name() + '-' + meson.project_version() + +pg_git_revision = get_option('PG_GIT_REVISION') + +# Note: core.autocrlf=false is needed to avoid line-ending conversion +# in case the environment has a different setting. Without this, a +# tarball created on Windows might be different than on, and unusable +# on, Unix machines. + +tar_gz = custom_target('tar.gz', + build_always_stale: true, + command: [git, '-C', '@SOURCE_ROOT@', + '-c', 'core.autocrlf=false', + 'archive', + '--format', 'tar.gz', + '-9', + '--prefix', distdir + '/', + '-o', join_paths(meson.build_root(), '@OUTPUT@'), + pg_git_revision], + output: distdir + '.tar.gz', +) + +if bzip2.found() + tar_bz2 = custom_target('tar.bz2', + build_always_stale: true, + command: [git, '-C', '@SOURCE_ROOT@', + '-c', 'core.autocrlf=false', + '-c', 'tar.tar.bz2.command="@0@" -c'.format(bzip2.path()), + 'archive', + '--format', 'tar.bz2', + '--prefix', distdir + '/', + '-o', join_paths(meson.build_root(), '@OUTPUT@'), + pg_git_revision], + output: distdir + '.tar.bz2', + ) +else + tar_bz2 = custom_target('tar.bz2', + command: [perl, '-e', 'exit 1'], + output: distdir + '.tar.bz2', + ) +endif + +alias_target('pgdist', [tar_gz, tar_bz2]) + +# Make the standard "dist" command fail, to prevent accidental use. +# But not if we are in a subproject, in case the parent project wants to +# create a dist using the standard Meson command. +if not meson.is_subproject() + # We can only pass the identifier perl here when we depend on >= 0.55 + if meson.version().version_compare('>=0.55') + meson.add_dist_script(perl, '-e', 'exit 1') + endif +endif + ############################################################### @@ -3371,6 +3795,7 @@ if meson.version().version_compare('>=0.57') { 'bison': '@0@ @1@'.format(bison.full_path(), bison_version), 'dtrace': dtrace, + 'flex': '@0@ @1@'.format(flex.full_path(), flex_version), }, section: 'Programs', ) diff --git a/meson_options.txt b/meson_options.txt index d2f95cfec364f..246cecf382712 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # Data layout influencing options @@ -43,6 +43,9 @@ option('cassert', type: 'boolean', value: false, option('tap_tests', type: 'feature', value: 'auto', description: 'Enable TAP tests') +option('injection_points', type: 'boolean', value: false, + description: 'Enable injection points') + option('PG_TEST_EXTRA', type: 'string', value: '', description: 'Enable selected extra tests') @@ -52,6 +55,9 @@ option('atomics', type: 'boolean', value: true, option('spinlocks', type: 'boolean', value: true, description: 'Use spinlocks') +option('PG_GIT_REVISION', type: 'string', value: 'HEAD', + description: 'git revision to be packaged by pgdist target') + # Compilation options @@ -136,7 +142,7 @@ option('tcl_version', type: 'string', value: 'tcl', option('readline', type: 'feature', value: 'auto', description: 'Use GNU Readline or BSD Libedit for editing') -option('selinux', type: 'feature', value: 'disabled', +option('selinux', type: 'feature', value: 'auto', description: 'SELinux support') option('ssl', type: 'combo', choices: ['auto', 'none', 'openssl'], diff --git a/src/Makefile b/src/Makefile index 94649c36c7a46..2f31a2f20a713 100644 --- a/src/Makefile +++ b/src/Makefile @@ -59,16 +59,13 @@ uninstall: uninstall-local uninstall-local: rm -f $(addprefix '$(DESTDIR)$(pgxsdir)/$(subdir)'/, Makefile.global Makefile.port Makefile.shlib nls-global.mk) -distprep: - $(MAKE) -C test/isolation $@ - clean: $(MAKE) -C test $@ $(MAKE) -C tutorial NO_PGXS=1 $@ $(MAKE) -C test/isolation $@ $(MAKE) -C tools/pg_bsd_indent $@ -distclean maintainer-clean: +distclean: $(MAKE) -C test $@ $(MAKE) -C tutorial NO_PGXS=1 $@ $(MAKE) -C test/isolation $@ diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 974b1dfef9e05..a00c909681eb1 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -19,11 +19,11 @@ # # Meta configuration -standard_targets = all install installdirs uninstall distprep clean distclean maintainer-clean coverage check checkprep installcheck init-po update-po +standard_targets = all install installdirs uninstall clean distclean coverage check checkprep installcheck init-po update-po # these targets should recurse even into subdirectories not being built: -standard_always_targets = distprep clean distclean maintainer-clean +standard_always_targets = clean distclean -.PHONY: $(standard_targets) install-strip html man installcheck-parallel update-unicode +.PHONY: $(standard_targets) maintainer-clean install-strip html man installcheck-parallel update-unicode # make `all' the default target all: @@ -35,6 +35,8 @@ all: # Never delete any intermediate files automatically. .SECONDARY: +maintainer-clean: distclean + # PostgreSQL version number VERSION = @PACKAGE_VERSION@ MAJORVERSION = @PG_MAJORVERSION@ @@ -74,8 +76,6 @@ VPATH = $(srcdir) endif endif # not PGXS -vpathsearch = `for f in $(addsuffix /$(1),$(subst :, ,. $(VPATH))); do test -r $$f && echo $$f && break; done` - ########################################################################## # @@ -201,8 +201,8 @@ enable_nls = @enable_nls@ enable_debug = @enable_debug@ enable_dtrace = @enable_dtrace@ enable_coverage = @enable_coverage@ +enable_injection_points = @enable_injection_points@ enable_tap_tests = @enable_tap_tests@ -enable_thread_safety = @enable_thread_safety@ python_includespec = @python_includespec@ python_libdir = @python_libdir@ @@ -262,7 +262,9 @@ CFLAGS_SL_MODULE = @CFLAGS_SL_MODULE@ CXXFLAGS_SL_MODULE = @CXXFLAGS_SL_MODULE@ CFLAGS_UNROLL_LOOPS = @CFLAGS_UNROLL_LOOPS@ CFLAGS_VECTORIZE = @CFLAGS_VECTORIZE@ +CFLAGS_POPCNT = @CFLAGS_POPCNT@ CFLAGS_CRC = @CFLAGS_CRC@ +CFLAGS_XSAVE = @CFLAGS_XSAVE@ PERMIT_DECLARATION_AFTER_STATEMENT = @PERMIT_DECLARATION_AFTER_STATEMENT@ CXXFLAGS = @CXXFLAGS@ @@ -320,12 +322,8 @@ X = @EXEEXT@ # Perl -ifneq (@PERL@,) - # quoted to protect pathname with spaces - PERL = '@PERL@' -else - PERL = $(missing) perl -endif +# quoted to protect pathname with spaces +PERL = '@PERL@' perl_archlibexp = @perl_archlibexp@ perl_privlibexp = @perl_privlibexp@ perl_includespec = @perl_includespec@ @@ -360,10 +358,10 @@ DOWNLOAD = wget -O $@ --no-use-server-timestamps # Pick a release from here: . Note # that the most recent release listed there is often a pre-release; # don't pick that one, except for testing. -UNICODE_VERSION = 15.0.0 +UNICODE_VERSION = 15.1.0 # Pick a release from here: -CLDR_VERSION = 43 +CLDR_VERSION = 45 # Tree-wide build support @@ -398,6 +396,25 @@ check: temp-install .PHONY: temp-install + +# prepend to path if already set, else just set it +define add_to_path +$(1)="$(if $($(1)),$(2):$$$(1),$(2))" +endef + +# platform-specific environment variable to set shared library path +# individual ports can override this later, this is the default name +ld_library_path_var = LD_LIBRARY_PATH + +# with_temp_install_extra is for individual ports to define if they +# need something more here. If not defined then the expansion does +# nothing. +with_temp_install = \ + PATH="$(abs_top_builddir)/tmp_install$(bindir):$(CURDIR):$$PATH" \ + $(call add_to_path,$(strip $(ld_library_path_var)),$(abs_top_builddir)/tmp_install$(libdir)) \ + INITDB_TEMPLATE='$(abs_top_builddir)'/tmp_install/initdb-template \ + $(with_temp_install_extra) + temp-install: | submake-generated-headers ifndef NO_TEMP_INSTALL ifneq ($(abs_top_builddir),) @@ -406,6 +423,8 @@ ifeq ($(MAKELEVEL),0) $(MKDIR_P) '$(abs_top_builddir)'/tmp_install/log $(MAKE) -C '$(top_builddir)' DESTDIR='$(abs_top_builddir)'/tmp_install install >'$(abs_top_builddir)'/tmp_install/log/install.log 2>&1 $(MAKE) -j1 $(if $(CHECKPREP_TOP),-C $(CHECKPREP_TOP),) checkprep >>'$(abs_top_builddir)'/tmp_install/log/install.log 2>&1 + + $(with_temp_install) initdb --auth trust --no-sync --no-instructions --lc-messages=C --no-clean '$(abs_top_builddir)'/tmp_install/initdb-template >>'$(abs_top_builddir)'/tmp_install/log/initdb-template.log 2>&1 endif endif endif @@ -423,23 +442,6 @@ PG_PROVE_FLAGS = -I $(top_srcdir)/src/test/perl/ -I $(srcdir) # User-supplied prove flags such as --verbose can be provided in PROVE_FLAGS. PROVE_FLAGS = -# prepend to path if already set, else just set it -define add_to_path -$(1)="$(if $($(1)),$(2):$$$(1),$(2))" -endef - -# platform-specific environment variable to set shared library path -# individual ports can override this later, this is the default name -ld_library_path_var = LD_LIBRARY_PATH - -# with_temp_install_extra is for individual ports to define if they -# need something more here. If not defined then the expansion does -# nothing. -with_temp_install = \ - PATH="$(abs_top_builddir)/tmp_install$(bindir):$(CURDIR):$$PATH" \ - $(call add_to_path,$(strip $(ld_library_path_var)),$(abs_top_builddir)/tmp_install$(libdir)) \ - $(with_temp_install_extra) - ifeq ($(enable_tap_tests),yes) ifndef PGXS @@ -586,19 +588,27 @@ endif libpq = -L$(libpq_builddir) -lpq # libpq_pgport is for use by client executables (not libraries) that use libpq. -# We force clients to pull symbols from the non-shared libraries libpgport -# and libpgcommon rather than pulling some libpgport symbols from libpq just -# because libpq uses those functions too. This makes applications less -# dependent on changes in libpq's usage of pgport (on platforms where we -# don't have symbol export control for libpq). To do this we link to -# pgport before libpq. This does cause duplicate -lpgport's to appear -# on client link lines, since that also appears in $(LIBS). +# We used to use this to force libpgport and libpgcommon to be linked before +# libpq, ensuring that clients would pull symbols from those libraries rather +# than possibly getting them from libpq (and thereby having an unwanted +# dependency on which symbols libpq uses). However, now that we can prevent +# libpq from exporting those symbols on all platforms of interest, we don't +# worry about that anymore. The previous technique resulted in duplicate +# libraries in link commands, since those libraries also appear in $(LIBS). +# Some platforms warn about that, so avoiding those warnings is now more +# important. Hence, $(libpq_pgport) is now equivalent to $(libpq), but we +# still recommend using it for client executables in case some other reason +# appears to handle them differently. +libpq_pgport = $(libpq) + # libpq_pgport_shlib is the same idea, but for use in client shared libraries. +# We need those clients to use the shlib variants. (Ideally, users of this +# macro would strip libpgport and libpgcommon from $(LIBS), but no harm is +# done if they don't, since they will have satisfied all their references +# from these libraries.) ifdef PGXS -libpq_pgport = -L$(libdir) -lpgcommon -lpgport $(libpq) libpq_pgport_shlib = -L$(libdir) -lpgcommon_shlib -lpgport_shlib $(libpq) else -libpq_pgport = -L$(top_builddir)/src/common -lpgcommon -L$(top_builddir)/src/port -lpgport $(libpq) libpq_pgport_shlib = -L$(top_builddir)/src/common -lpgcommon_shlib -L$(top_builddir)/src/port -lpgport_shlib $(libpq) endif @@ -750,6 +760,9 @@ LIBOBJS = @LIBOBJS@ # files needed for the chosen CRC-32C implementation PG_CRC32C_OBJS = @PG_CRC32C_OBJS@ +# files needed for the chosen popcount implementation +PG_POPCNT_OBJS = @PG_POPCNT_OBJS@ + LIBS := -lpgcommon -lpgport $(LIBS) # to make ws2_32.lib the last library @@ -766,21 +779,13 @@ TAS = @TAS@ # Global targets and rules %.c: %.l -ifdef FLEX $(FLEX) $(if $(FLEX_NO_BACKUP),-b) $(FLEXFLAGS) -o'$@' $< @$(if $(FLEX_NO_BACKUP),if [ `wc -l &2; exit 1; fi) $(if $(FLEX_FIX_WARNING),$(PERL) $(top_srcdir)/src/tools/fix-old-flex-code.pl '$@') -else - @$(missing) flex $< '$@' -endif %.c: %.y $(if $(BISON_CHECK_CMD),$(BISON_CHECK_CMD)) -ifdef BISON $(BISON) $(BISONFLAGS) -o $@ $< -else - @$(missing) bison $< $@ -endif %.i: %.c $(CPP) $(CPPFLAGS) -o $@ $< @@ -908,7 +913,7 @@ recurse = $(foreach target,$(if $1,$1,$(standard_targets)),$(foreach subdir,$(if # If a makefile's list of SUBDIRS varies depending on configuration, then # any subdirectories excluded from SUBDIRS should instead be added to # ALWAYS_SUBDIRS, and then it must call recurse_always as well as recurse. -# This ensures that distprep, distclean, etc will apply to all subdirectories. +# This ensures that distclean, etc will apply to all subdirectories. # In the normal case all arguments will be defaulted. # $1: targets to make recursive (defaults to standard_always_targets) # $2: list of subdirs (defaults to ALWAYS_SUBDIRS variable) @@ -963,7 +968,7 @@ include $(Po_files) endif # hook for clean-up -clean distclean maintainer-clean: clean-deps +clean distclean: clean-deps .PHONY: clean-deps clean-deps: @@ -1047,7 +1052,7 @@ lcov_test.info: $(all_gcda_files) # hook for clean-up -clean distclean maintainer-clean: clean-coverage +clean distclean: clean-coverage .PHONY: clean-coverage clean-coverage: diff --git a/src/Makefile.shlib b/src/Makefile.shlib index 35abce58d22a6..fa81f6ffdd6d9 100644 --- a/src/Makefile.shlib +++ b/src/Makefile.shlib @@ -106,32 +106,18 @@ ifdef SO_MAJOR_VERSION override CPPFLAGS += -DSO_MAJOR_VERSION=$(SO_MAJOR_VERSION) endif -ifeq ($(PORTNAME), aix) - LINK.shared = $(COMPILER) - ifdef SO_MAJOR_VERSION - shlib = lib$(NAME)$(DLSUFFIX).$(SO_MAJOR_VERSION) - endif - haslibarule = yes - # $(exports_file) is also usable as an import file - exports_file = lib$(NAME).exp - BUILD.exports = ( echo '\#! $(shlib)'; $(AWK) '/^[^\#]/ {printf "%s\n",$$1}' $< ) > $@ - ifneq (,$(SHLIB_EXPORTS)) - LINK.shared += -Wl,-bE:$(exports_file) - endif -endif - ifeq ($(PORTNAME), darwin) ifdef soname # linkable library ifneq ($(SO_MAJOR_VERSION), 0) version_link = -compatibility_version $(SO_MAJOR_VERSION) -current_version $(SO_MAJOR_VERSION).$(SO_MINOR_VERSION) endif - LINK.shared = $(COMPILER) -dynamiclib -install_name '$(libdir)/lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX)' $(version_link) $(exported_symbols_list) -multiply_defined suppress + LINK.shared = $(COMPILER) -dynamiclib -install_name '$(libdir)/lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX)' $(version_link) $(exported_symbols_list) shlib = lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX) shlib_major = lib$(NAME).$(SO_MAJOR_VERSION)$(DLSUFFIX) else # loadable module - LINK.shared = $(COMPILER) -bundle -multiply_defined suppress + LINK.shared = $(COMPILER) -bundle endif BUILD.exports = $(AWK) '/^[^\#]/ {printf "_%s\n",$$1}' $< >$@ exports_file = $(SHLIB_EXPORTS:%.txt=%.list) @@ -183,6 +169,11 @@ endif ifeq ($(PORTNAME), linux) LINK.shared = $(COMPILER) -shared ifdef soname + ifneq (,$(findstring linux-android,$(host_os))) + # Android uses unversioned shared libraries + shlib = $(shlib_bare) + soname = $(shlib_bare) + endif LINK.shared += -Wl,-soname,$(soname) endif BUILD.exports = ( echo '{ global:'; $(AWK) '/^[^\#]/ {printf "%s;\n",$$1}' $<; echo ' local: *; };' ) >$@ @@ -263,14 +254,6 @@ $(stlib): $(OBJS) | $(SHLIB_PREREQS) touch $@ endif #haslibarule -# AIX wraps shared libraries inside a static library, can be used both -# for static and shared linking -ifeq ($(PORTNAME), aix) -$(stlib): $(shlib) - rm -f $(stlib) - $(AR) $(AROPT) $(stlib) $(shlib) -endif # aix - ifeq (,$(filter cygwin win32,$(PORTNAME))) # Normal case @@ -284,11 +267,8 @@ ifneq ($(shlib), $(shlib_major)) endif # Make sure we have a link to a name without any version numbers ifneq ($(shlib), $(shlib_bare)) -# except on AIX, where that's not a thing -ifneq ($(PORTNAME), aix) rm -f $(shlib_bare) $(LN_S) $(shlib) $(shlib_bare) -endif # aix endif # shlib_bare endif # shlib_major @@ -396,9 +376,6 @@ install-lib-static: $(stlib) installdirs-lib install-lib-shared: $(shlib) installdirs-lib ifdef soname -# we don't install $(shlib) on AIX -# (see http://archives.postgresql.org/message-id/52EF20B2E3209443BC37736D00C3C1380A6E79FE@EXADV1.host.magwien.gv.at) -ifneq ($(PORTNAME), aix) $(INSTALL_SHLIB) $< '$(DESTDIR)$(libdir)/$(shlib)' ifneq ($(PORTNAME), cygwin) ifneq ($(PORTNAME), win32) @@ -414,7 +391,6 @@ ifneq ($(shlib), $(shlib_bare)) endif endif # not win32 endif # not cygwin -endif # not aix ifneq (,$(findstring $(PORTNAME),win32 cygwin)) $(INSTALL_SHLIB) $< '$(DESTDIR)$(bindir)/$(shlib)' endif diff --git a/src/backend/Makefile b/src/backend/Makefile index 3c420031759d1..84302cc6dab7b 100644 --- a/src/backend/Makefile +++ b/src/backend/Makefile @@ -2,7 +2,7 @@ # # Makefile for the postgres backend # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/backend/Makefile @@ -62,14 +62,12 @@ all: submake-libpgport submake-catalog-headers submake-utils-headers postgres $( ifneq ($(PORTNAME), cygwin) ifneq ($(PORTNAME), win32) -ifneq ($(PORTNAME), aix) postgres: $(OBJS) $(CC) $(CFLAGS) $(call expand_subsys,$^) $(LDFLAGS) $(LIBS) -o $@ endif endif -endif ifeq ($(PORTNAME), cygwin) @@ -96,24 +94,6 @@ libpostgres.a: postgres endif # win32 -ifeq ($(PORTNAME), aix) - -postgres: $(POSTGRES_IMP) - $(CC) $(CFLAGS) $(call expand_subsys,$(OBJS)) $(LDFLAGS) -Wl,-bE:$(top_builddir)/src/backend/$(POSTGRES_IMP) $(LIBS) -Wl,-brtllib -o $@ - -# Linking to a single .o with -r is a lot faster than building a .a or passing -# all objects to MKLDEXPORT. -# -# It looks alluring to use $(CC) -r instead of ld -r, but that doesn't -# trivially work with gcc, due to gcc specific static libraries linked in with -# -r. -$(POSTGRES_IMP): $(OBJS) - ld -r -o SUBSYS.o $(call expand_subsys,$^) - $(MKLDEXPORT) SUBSYS.o . > $@ - @rm -f SUBSYS.o - -endif # aix - $(top_builddir)/src/port/libpgport_srv.a: | submake-libpgport @@ -130,20 +110,23 @@ $(top_builddir)/src/port/libpgport_srv.a: | submake-libpgport parser/gram.h: parser/gram.y $(MAKE) -C parser gram.h -storage/lmgr/lwlocknames.h: storage/lmgr/generate-lwlocknames.pl storage/lmgr/lwlocknames.txt - $(MAKE) -C storage/lmgr lwlocknames.h lwlocknames.c +storage/lmgr/lwlocknames.h: storage/lmgr/generate-lwlocknames.pl ../include/storage/lwlocklist.h utils/activity/wait_event_names.txt + $(MAKE) -C storage/lmgr lwlocknames.h + +utils/activity/wait_event_types.h: utils/activity/generate-wait_event_types.pl utils/activity/wait_event_names.txt + $(MAKE) -C utils/activity wait_event_types.h pgstat_wait_event.c wait_event_funcs_data.c # run this unconditionally to avoid needing to know its dependencies here: submake-catalog-headers: - $(MAKE) -C catalog distprep generated-header-symlinks + $(MAKE) -C ../include/catalog generated-headers # run this unconditionally to avoid needing to know its dependencies here: submake-nodes-headers: - $(MAKE) -C nodes distprep generated-header-symlinks + $(MAKE) -C nodes generated-header-symlinks # run this unconditionally to avoid needing to know its dependencies here: submake-utils-headers: - $(MAKE) -C utils distprep generated-header-symlinks + $(MAKE) -C utils generated-header-symlinks .PHONY: submake-catalog-headers submake-nodes-headers submake-utils-headers @@ -153,35 +136,34 @@ submake-utils-headers: # # The point of the prereqdir incantation in some of the rules below is to # force the symlink to use an absolute path rather than a relative path. -# For headers which are generated by make distprep, the actual header within -# src/backend will be in the source tree, while the symlink in src/include -# will be in the build tree, so a simple ../.. reference won't work. -# For headers generated during regular builds, we prefer a relative symlink. +# This is needed to support platforms without ln -s. .PHONY: generated-headers -generated-headers: $(top_builddir)/src/include/storage/lwlocknames.h submake-catalog-headers submake-nodes-headers submake-utils-headers +generated-headers: $(top_builddir)/src/include/storage/lwlocknames.h $(top_builddir)/src/include/utils/wait_event_types.h submake-catalog-headers submake-nodes-headers submake-utils-headers parser/gram.h $(top_builddir)/src/include/storage/lwlocknames.h: storage/lmgr/lwlocknames.h prereqdir=`cd '$(dir $<)' >/dev/null && pwd` && \ cd '$(dir $@)' && rm -f $(notdir $@) && \ $(LN_S) "$$prereqdir/$(notdir $<)" . +$(top_builddir)/src/include/utils/wait_event_types.h: utils/activity/wait_event_types.h + prereqdir=`cd '$(dir $<)' >/dev/null && pwd` && \ + cd '$(dir $@)' && rm -f $(notdir $@) && \ + $(LN_S) "$$prereqdir/$(notdir $<)" . + utils/probes.o: utils/probes.d $(SUBDIROBJS) $(DTRACE) $(DTRACEFLAGS) -C -G -s $(call expand_subsys,$^) -o $@ ########################################################################## -# Be sure that these files get removed by the maintainer-clean target -distprep: +# This target is only needed by nls.mk. +.PHONY: generated-parser-sources +generated-parser-sources: $(MAKE) -C parser gram.c gram.h scan.c $(MAKE) -C bootstrap bootparse.c bootparse.h bootscanner.c - $(MAKE) -C catalog distprep - $(MAKE) -C nodes distprep $(MAKE) -C replication repl_gram.c repl_gram.h repl_scanner.c syncrep_gram.c syncrep_gram.h syncrep_scanner.c - $(MAKE) -C storage/lmgr lwlocknames.h lwlocknames.c - $(MAKE) -C utils distprep $(MAKE) -C utils/adt jsonpath_gram.c jsonpath_gram.h jsonpath_scan.c $(MAKE) -C utils/misc guc-file.c @@ -281,31 +263,9 @@ ifeq ($(PORTNAME), win32) endif distclean: clean +# generated by configure rm -f port/tas.s port/pg_sema.c port/pg_shmem.c -maintainer-clean: distclean - $(MAKE) -C catalog $@ - $(MAKE) -C nodes $@ - $(MAKE) -C utils $@ - rm -f bootstrap/bootparse.c \ - bootstrap/bootparse.h \ - bootstrap/bootscanner.c \ - parser/gram.c \ - parser/gram.h \ - parser/scan.c \ - replication/repl_gram.c \ - replication/repl_gram.h \ - replication/repl_scanner.c \ - replication/syncrep_gram.c \ - replication/syncrep_gram.h \ - replication/syncrep_scanner.c \ - storage/lmgr/lwlocknames.c \ - storage/lmgr/lwlocknames.h \ - utils/adt/jsonpath_gram.c \ - utils/adt/jsonpath_gram.h \ - utils/adt/jsonpath_scan.c \ - utils/misc/guc-file.c - ########################################################################## # diff --git a/src/backend/access/Makefile b/src/backend/access/Makefile index 0880e0a8bbb63..1932d11d154e3 100644 --- a/src/backend/access/Makefile +++ b/src/backend/access/Makefile @@ -9,6 +9,6 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global SUBDIRS = brin common gin gist hash heap index nbtree rmgrdesc spgist \ - table tablesample transam + sequence table tablesample transam include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c index 3c6a956eaa3f2..6cbd31f0a3d8b 100644 --- a/src/backend/access/brin/brin.c +++ b/src/backend/access/brin/brin.c @@ -4,7 +4,7 @@ * * See src/backend/access/brin/README for details. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -33,14 +33,117 @@ #include "postmaster/autovacuum.h" #include "storage/bufmgr.h" #include "storage/freespace.h" +#include "tcop/tcopprot.h" /* pgrminclude ignore */ #include "utils/acl.h" -#include "utils/builtins.h" #include "utils/datum.h" +#include "utils/fmgrprotos.h" #include "utils/guc.h" #include "utils/index_selfuncs.h" #include "utils/memutils.h" #include "utils/rel.h" +#include "utils/tuplesort.h" +/* Magic numbers for parallel state sharing */ +#define PARALLEL_KEY_BRIN_SHARED UINT64CONST(0xB000000000000001) +#define PARALLEL_KEY_TUPLESORT UINT64CONST(0xB000000000000002) +#define PARALLEL_KEY_QUERY_TEXT UINT64CONST(0xB000000000000003) +#define PARALLEL_KEY_WAL_USAGE UINT64CONST(0xB000000000000004) +#define PARALLEL_KEY_BUFFER_USAGE UINT64CONST(0xB000000000000005) + +/* + * Status for index builds performed in parallel. This is allocated in a + * dynamic shared memory segment. + */ +typedef struct BrinShared +{ + /* + * These fields are not modified during the build. They primarily exist + * for the benefit of worker processes that need to create state + * corresponding to that used by the leader. + */ + Oid heaprelid; + Oid indexrelid; + bool isconcurrent; + BlockNumber pagesPerRange; + int scantuplesortstates; + + /* + * workersdonecv is used to monitor the progress of workers. All parallel + * participants must indicate that they are done before leader can use + * results built by the workers (and before leader can write the data into + * the index). + */ + ConditionVariable workersdonecv; + + /* + * mutex protects all fields before heapdesc. + * + * These fields contain status information of interest to BRIN index + * builds that must work just the same when an index is built in parallel. + */ + slock_t mutex; + + /* + * Mutable state that is maintained by workers, and reported back to + * leader at end of the scans. + * + * nparticipantsdone is number of worker processes finished. + * + * reltuples is the total number of input heap tuples. + * + * indtuples is the total number of tuples that made it into the index. + */ + int nparticipantsdone; + double reltuples; + double indtuples; + + /* + * ParallelTableScanDescData data follows. Can't directly embed here, as + * implementations of the parallel table scan desc interface might need + * stronger alignment. + */ +} BrinShared; + +/* + * Return pointer to a BrinShared's parallel table scan. + * + * c.f. shm_toc_allocate as to why BUFFERALIGN is used, rather than just + * MAXALIGN. + */ +#define ParallelTableScanFromBrinShared(shared) \ + (ParallelTableScanDesc) ((char *) (shared) + BUFFERALIGN(sizeof(BrinShared))) + +/* + * Status for leader in parallel index build. + */ +typedef struct BrinLeader +{ + /* parallel context itself */ + ParallelContext *pcxt; + + /* + * nparticipanttuplesorts is the exact number of worker processes + * successfully launched, plus one leader process if it participates as a + * worker (only DISABLE_LEADER_PARTICIPATION builds avoid leader + * participating as a worker). + */ + int nparticipanttuplesorts; + + /* + * Leader process convenience pointers to shared state (leader avoids TOC + * lookups). + * + * brinshared is the shared state for entire build. sharedsort is the + * shared, tuplesort-managed state passed to each process tuplesort. + * snapshot is the snapshot used by the scan iff an MVCC snapshot is + * required. + */ + BrinShared *brinshared; + Sharedsort *sharedsort; + Snapshot snapshot; + WalUsage *walusage; + BufferUsage *bufferusage; +} BrinLeader; /* * We use a BrinBuildState during initial construction of a BRIN index. @@ -49,15 +152,47 @@ typedef struct BrinBuildState { Relation bs_irel; - int bs_numtuples; + double bs_numtuples; + double bs_reltuples; Buffer bs_currentInsertBuf; BlockNumber bs_pagesPerRange; BlockNumber bs_currRangeStart; + BlockNumber bs_maxRangeStart; BrinRevmap *bs_rmAccess; BrinDesc *bs_bdesc; BrinMemTuple *bs_dtuple; + + BrinTuple *bs_emptyTuple; + Size bs_emptyTupleLen; + MemoryContext bs_context; + + /* + * bs_leader is only present when a parallel index build is performed, and + * only in the leader process. (Actually, only the leader process has a + * BrinBuildState.) + */ + BrinLeader *bs_leader; + int bs_worker_id; + + /* + * The sortstate is used by workers (including the leader). It has to be + * part of the build state, because that's the only thing passed to the + * build callback etc. + */ + Tuplesortstate *bs_sortstate; } BrinBuildState; +/* + * We use a BrinInsertState to capture running state spanning multiple + * brininsert invocations, within the same command. + */ +typedef struct BrinInsertState +{ + BrinRevmap *bis_rmAccess; + BrinDesc *bis_desc; + BlockNumber bis_pages_per_range; +} BrinInsertState; + /* * Struct used as "opaque" during index scans */ @@ -71,17 +206,38 @@ typedef struct BrinOpaque #define BRIN_ALL_BLOCKRANGES InvalidBlockNumber static BrinBuildState *initialize_brin_buildstate(Relation idxRel, - BrinRevmap *revmap, BlockNumber pagesPerRange); + BrinRevmap *revmap, + BlockNumber pagesPerRange, + BlockNumber tablePages); +static BrinInsertState *initialize_brin_insertstate(Relation idxRel, IndexInfo *indexInfo); static void terminate_brin_buildstate(BrinBuildState *state); static void brinsummarize(Relation index, Relation heapRel, BlockNumber pageRange, bool include_partial, double *numSummarized, double *numExisting); static void form_and_insert_tuple(BrinBuildState *state); +static void form_and_spill_tuple(BrinBuildState *state); static void union_tuples(BrinDesc *bdesc, BrinMemTuple *a, BrinTuple *b); static void brin_vacuum_scan(Relation idxrel, BufferAccessStrategy strategy); static bool add_values_to_range(Relation idxRel, BrinDesc *bdesc, - BrinMemTuple *dtup, Datum *values, bool *nulls); + BrinMemTuple *dtup, const Datum *values, const bool *nulls); static bool check_null_keys(BrinValues *bval, ScanKey *nullkeys, int nnullkeys); +static void brin_fill_empty_ranges(BrinBuildState *state, + BlockNumber prevRange, BlockNumber nextRange); + +/* parallel index builds */ +static void _brin_begin_parallel(BrinBuildState *buildstate, Relation heap, Relation index, + bool isconcurrent, int request); +static void _brin_end_parallel(BrinLeader *brinleader, BrinBuildState *state); +static Size _brin_parallel_estimate_shared(Relation heap, Snapshot snapshot); +static double _brin_parallel_heapscan(BrinBuildState *state); +static double _brin_parallel_merge(BrinBuildState *state); +static void _brin_leader_participate_as_worker(BrinBuildState *buildstate, + Relation heap, Relation index); +static void _brin_parallel_scan_and_build(BrinBuildState *state, + BrinShared *brinshared, + Sharedsort *sharedsort, + Relation heap, Relation index, + int sortmem, bool progress); /* * BRIN handler function: return IndexAmRoutine with access method parameters @@ -107,6 +263,7 @@ brinhandler(PG_FUNCTION_ARGS) amroutine->amclusterable = false; amroutine->ampredlocks = false; amroutine->amcanparallel = false; + amroutine->amcanbuildparallel = true; amroutine->amcaninclude = false; amroutine->amusemaintenanceworkmem = false; amroutine->amsummarizing = true; @@ -117,6 +274,7 @@ brinhandler(PG_FUNCTION_ARGS) amroutine->ambuild = brinbuild; amroutine->ambuildempty = brinbuildempty; amroutine->aminsert = brininsert; + amroutine->aminsertcleanup = brininsertcleanup; amroutine->ambulkdelete = brinbulkdelete; amroutine->amvacuumcleanup = brinvacuumcleanup; amroutine->amcanreturn = NULL; @@ -140,6 +298,27 @@ brinhandler(PG_FUNCTION_ARGS) PG_RETURN_POINTER(amroutine); } +/* + * Initialize a BrinInsertState to maintain state to be used across multiple + * tuple inserts, within the same command. + */ +static BrinInsertState * +initialize_brin_insertstate(Relation idxRel, IndexInfo *indexInfo) +{ + BrinInsertState *bistate; + MemoryContext oldcxt; + + oldcxt = MemoryContextSwitchTo(indexInfo->ii_Context); + bistate = palloc0(sizeof(BrinInsertState)); + bistate->bis_desc = brin_build_desc(idxRel); + bistate->bis_rmAccess = brinRevmapInitialize(idxRel, + &bistate->bis_pages_per_range); + indexInfo->ii_AmCache = bistate; + MemoryContextSwitchTo(oldcxt); + + return bistate; +} + /* * A tuple in the heap is being inserted. To keep a brin index up to date, * we need to obtain the relevant index tuple and compare its stored values @@ -162,14 +341,24 @@ brininsert(Relation idxRel, Datum *values, bool *nulls, BlockNumber pagesPerRange; BlockNumber origHeapBlk; BlockNumber heapBlk; - BrinDesc *bdesc = (BrinDesc *) indexInfo->ii_AmCache; + BrinInsertState *bistate = (BrinInsertState *) indexInfo->ii_AmCache; BrinRevmap *revmap; + BrinDesc *bdesc; Buffer buf = InvalidBuffer; MemoryContext tupcxt = NULL; MemoryContext oldcxt = CurrentMemoryContext; bool autosummarize = BrinGetAutoSummarize(idxRel); - revmap = brinRevmapInitialize(idxRel, &pagesPerRange, NULL); + /* + * If first time through in this statement, initialize the insert state + * that we keep for all the inserts in the command. + */ + if (!bistate) + bistate = initialize_brin_insertstate(idxRel, indexInfo); + + revmap = bistate->bis_rmAccess; + bdesc = bistate->bis_desc; + pagesPerRange = bistate->bis_pages_per_range; /* * origHeapBlk is the block number where the insertion occurred. heapBlk @@ -202,7 +391,7 @@ brininsert(Relation idxRel, Datum *values, bool *nulls, lastPageTuple = brinGetTupleForHeapBlock(revmap, lastPageRange, &buf, &off, - NULL, BUFFER_LOCK_SHARE, NULL); + NULL, BUFFER_LOCK_SHARE); if (!lastPageTuple) { bool recorded; @@ -222,20 +411,12 @@ brininsert(Relation idxRel, Datum *values, bool *nulls, } brtup = brinGetTupleForHeapBlock(revmap, heapBlk, &buf, &off, - NULL, BUFFER_LOCK_SHARE, NULL); + NULL, BUFFER_LOCK_SHARE); /* if range is unsummarized, there's nothing to do */ if (!brtup) break; - /* First time through in this statement? */ - if (bdesc == NULL) - { - MemoryContextSwitchTo(indexInfo->ii_Context); - bdesc = brin_build_desc(idxRel); - indexInfo->ii_AmCache = (void *) bdesc; - MemoryContextSwitchTo(oldcxt); - } /* First time through in this brininsert call? */ if (tupcxt == NULL) { @@ -297,7 +478,7 @@ brininsert(Relation idxRel, Datum *values, bool *nulls, samepage)) { /* no luck; start over */ - MemoryContextResetAndDeleteChildren(tupcxt); + MemoryContextReset(tupcxt); continue; } } @@ -306,7 +487,6 @@ brininsert(Relation idxRel, Datum *values, bool *nulls, break; } - brinRevmapTerminate(revmap); if (BufferIsValid(buf)) ReleaseBuffer(buf); MemoryContextSwitchTo(oldcxt); @@ -316,6 +496,29 @@ brininsert(Relation idxRel, Datum *values, bool *nulls, return false; } +/* + * Callback to clean up the BrinInsertState once all tuple inserts are done. + */ +void +brininsertcleanup(Relation index, IndexInfo *indexInfo) +{ + BrinInsertState *bistate = (BrinInsertState *) indexInfo->ii_AmCache; + + /* bail out if cache not initialized */ + if (bistate == NULL) + return; + + /* do this first to avoid dangling pointer if we fail partway through */ + indexInfo->ii_AmCache = NULL; + + /* + * Clean up the revmap. Note that the brinDesc has already been cleaned up + * as part of its own memory context. + */ + brinRevmapTerminate(bistate->bis_rmAccess); + pfree(bistate); +} + /* * Initialize state for a BRIN index scan. * @@ -332,8 +535,7 @@ brinbeginscan(Relation r, int nkeys, int norderbys) scan = RelationGetIndexScan(r, nkeys, norderbys); opaque = palloc_object(BrinOpaque); - opaque->bo_rmAccess = brinRevmapInitialize(r, &opaque->bo_pagesPerRange, - scan->xs_snapshot); + opaque->bo_rmAccess = brinRevmapInitialize(r, &opaque->bo_pagesPerRange); opaque->bo_bdesc = brin_build_desc(r); scan->opaque = opaque; @@ -363,7 +565,7 @@ bringetbitmap(IndexScanDesc scan, TIDBitmap *tbm) BrinOpaque *opaque; BlockNumber nblocks; BlockNumber heapBlk; - int totalpages = 0; + int64 totalpages = 0; FmgrInfo *consistentFn; MemoryContext oldcxt; MemoryContext perRangeCxt; @@ -534,11 +736,10 @@ bringetbitmap(IndexScanDesc scan, TIDBitmap *tbm) CHECK_FOR_INTERRUPTS(); - MemoryContextResetAndDeleteChildren(perRangeCxt); + MemoryContextReset(perRangeCxt); tup = brinGetTupleForHeapBlock(opaque->bo_rmAccess, heapBlk, &buf, - &off, &size, BUFFER_LOCK_SHARE, - scan->xs_snapshot); + &off, &size, BUFFER_LOCK_SHARE); if (tup) { gottuple = true; @@ -822,6 +1023,71 @@ brinbuildCallback(Relation index, values, isnull); } +/* + * Per-heap-tuple callback for table_index_build_scan with parallelism. + * + * A version of the callback used by parallel index builds. The main difference + * is that instead of writing the BRIN tuples into the index, we write them + * into a shared tuplesort, and leave the insertion up to the leader (which may + * reorder them a bit etc.). The callback also does not generate empty ranges, + * those will be added by the leader when merging results from workers. + */ +static void +brinbuildCallbackParallel(Relation index, + ItemPointer tid, + Datum *values, + bool *isnull, + bool tupleIsAlive, + void *brstate) +{ + BrinBuildState *state = (BrinBuildState *) brstate; + BlockNumber thisblock; + + thisblock = ItemPointerGetBlockNumber(tid); + + /* + * If we're in a block that belongs to a different range, summarize what + * we've got and start afresh. Note the scan might have skipped many + * pages, if they were devoid of live tuples; we do not create empty BRIN + * ranges here - the leader is responsible for filling them in. + * + * Unlike serial builds, parallel index builds allow synchronized seqscans + * (because that's what parallel scans do). This means the block may wrap + * around to the beginning of the relation, so the condition needs to + * check for both future and past ranges. + */ + if ((thisblock < state->bs_currRangeStart) || + (thisblock > state->bs_currRangeStart + state->bs_pagesPerRange - 1)) + { + + BRIN_elog((DEBUG2, + "brinbuildCallbackParallel: completed a range: %u--%u", + state->bs_currRangeStart, + state->bs_currRangeStart + state->bs_pagesPerRange)); + + /* create the index tuple and write it into the tuplesort */ + form_and_spill_tuple(state); + + /* + * Set state to correspond to the next range (for this block). + * + * This skips ranges that are either empty (and so we don't get any + * tuples to summarize), or processed by other workers. We can't + * differentiate those cases here easily, so we leave it up to the + * leader to fill empty ranges where needed. + */ + state->bs_currRangeStart + = state->bs_pagesPerRange * (thisblock / state->bs_pagesPerRange); + + /* re-initialize state for it */ + brin_memtuple_initialize(state->bs_dtuple, state->bs_bdesc); + } + + /* Accumulate the current tuple into the running state */ + (void) add_values_to_range(index, state->bs_bdesc, state->bs_dtuple, + values, isnull); +} + /* * brinbuild() -- build a new BRIN index. */ @@ -848,7 +1114,7 @@ brinbuild(Relation heap, Relation index, IndexInfo *indexInfo) * whole relation will be rolled back. */ - meta = ExtendBufferedRel(EB_REL(index), MAIN_FORKNUM, NULL, + meta = ExtendBufferedRel(BMR_REL(index), MAIN_FORKNUM, NULL, EB_LOCK_FIRST | EB_SKIP_EXTENSION_LOCK); Assert(BufferGetBlockNumber(meta) == BRIN_METAPAGE_BLKNO); @@ -880,18 +1146,103 @@ brinbuild(Relation heap, Relation index, IndexInfo *indexInfo) /* * Initialize our state, including the deformed tuple state. */ - revmap = brinRevmapInitialize(index, &pagesPerRange, NULL); - state = initialize_brin_buildstate(index, revmap, pagesPerRange); + revmap = brinRevmapInitialize(index, &pagesPerRange); + state = initialize_brin_buildstate(index, revmap, pagesPerRange, + RelationGetNumberOfBlocks(heap)); + + /* + * Attempt to launch parallel worker scan when required + * + * XXX plan_create_index_workers makes the number of workers dependent on + * maintenance_work_mem, requiring 32MB for each worker. That makes sense + * for btree, but not for BRIN, which can do with much less memory. So + * maybe make that somehow less strict, optionally? + */ + if (indexInfo->ii_ParallelWorkers > 0) + _brin_begin_parallel(state, heap, index, indexInfo->ii_Concurrent, + indexInfo->ii_ParallelWorkers); /* - * Now scan the relation. No syncscan allowed here because we want the - * heap blocks in physical order. + * If parallel build requested and at least one worker process was + * successfully launched, set up coordination state, wait for workers to + * complete. Then read all tuples from the shared tuplesort and insert + * them into the index. + * + * In serial mode, simply scan the table and build the index one index + * tuple at a time. */ - reltuples = table_index_build_scan(heap, index, indexInfo, false, true, - brinbuildCallback, (void *) state, NULL); + if (state->bs_leader) + { + SortCoordinate coordinate; + + coordinate = (SortCoordinate) palloc0(sizeof(SortCoordinateData)); + coordinate->isWorker = false; + coordinate->nParticipants = + state->bs_leader->nparticipanttuplesorts; + coordinate->sharedsort = state->bs_leader->sharedsort; + + /* + * Begin leader tuplesort. + * + * In cases where parallelism is involved, the leader receives the + * same share of maintenance_work_mem as a serial sort (it is + * generally treated in the same way as a serial sort once we return). + * Parallel worker Tuplesortstates will have received only a fraction + * of maintenance_work_mem, though. + * + * We rely on the lifetime of the Leader Tuplesortstate almost not + * overlapping with any worker Tuplesortstate's lifetime. There may + * be some small overlap, but that's okay because we rely on leader + * Tuplesortstate only allocating a small, fixed amount of memory + * here. When its tuplesort_performsort() is called (by our caller), + * and significant amounts of memory are likely to be used, all + * workers must have already freed almost all memory held by their + * Tuplesortstates (they are about to go away completely, too). The + * overall effect is that maintenance_work_mem always represents an + * absolute high watermark on the amount of memory used by a CREATE + * INDEX operation, regardless of the use of parallelism or any other + * factor. + */ + state->bs_sortstate = + tuplesort_begin_index_brin(maintenance_work_mem, coordinate, + TUPLESORT_NONE); + + /* scan the relation and merge per-worker results */ + reltuples = _brin_parallel_merge(state); + + _brin_end_parallel(state->bs_leader, state); + } + else /* no parallel index build */ + { + /* + * Now scan the relation. No syncscan allowed here because we want + * the heap blocks in physical order (we want to produce the ranges + * starting from block 0, and the callback also relies on this to not + * generate summary for the same range twice). + */ + reltuples = table_index_build_scan(heap, index, indexInfo, false, true, + brinbuildCallback, (void *) state, NULL); - /* process the final batch */ - form_and_insert_tuple(state); + /* + * process the final batch + * + * XXX Note this does not update state->bs_currRangeStart, i.e. it + * stays set to the last range added to the index. This is OK, because + * that's what brin_fill_empty_ranges expects. + */ + form_and_insert_tuple(state); + + /* + * Backfill the final ranges with empty data. + * + * This saves us from doing what amounts to full table scans when the + * index with a predicate like WHERE (nonnull_column IS NULL), or + * other very selective predicates. + */ + brin_fill_empty_ranges(state, + state->bs_currRangeStart, + state->bs_maxRangeStart); + } /* release resources */ idxtuples = state->bs_numtuples; @@ -915,7 +1266,7 @@ brinbuildempty(Relation index) Buffer metabuf; /* An empty BRIN index has a metapage only. */ - metabuf = ExtendBufferedRel(EB_REL(index), INIT_FORKNUM, NULL, + metabuf = ExtendBufferedRel(BMR_REL(index), INIT_FORKNUM, NULL, EB_LOCK_FIRST | EB_SKIP_EXTENSION_LOCK); /* Initialize and xlog metabuffer. */ @@ -1066,6 +1417,7 @@ brin_summarize_range(PG_FUNCTION_ARGS) SetUserIdAndSecContext(heapRel->rd_rel->relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); } else { @@ -1102,8 +1454,14 @@ brin_summarize_range(PG_FUNCTION_ARGS) errmsg("could not open parent table of index \"%s\"", RelationGetRelationName(indexRel)))); - /* OK, do it */ - brinsummarize(indexRel, heapRel, heapBlk, true, &numSummarized, NULL); + /* see gin_clean_pending_list() */ + if (indexRel->rd_index->indisvalid) + brinsummarize(indexRel, heapRel, heapBlk, true, &numSummarized, NULL); + else + ereport(DEBUG1, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("index \"%s\" is not valid", + RelationGetRelationName(indexRel)))); /* Roll back any GUC changes executed by index functions */ AtEOXact_GUC(false, save_nestlevel); @@ -1185,12 +1543,21 @@ brin_desummarize_range(PG_FUNCTION_ARGS) errmsg("could not open parent table of index \"%s\"", RelationGetRelationName(indexRel)))); - /* the revmap does the hard work */ - do + /* see gin_clean_pending_list() */ + if (indexRel->rd_index->indisvalid) { - done = brinRevmapDesummarizeRange(indexRel, heapBlk); + /* the revmap does the hard work */ + do + { + done = brinRevmapDesummarizeRange(indexRel, heapBlk); + } + while (!done); } - while (!done); + else + ereport(DEBUG1, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("index \"%s\" is not valid", + RelationGetRelationName(indexRel)))); relation_close(indexRel, ShareUpdateExclusiveLock); relation_close(heapRel, ShareUpdateExclusiveLock); @@ -1291,20 +1658,44 @@ brinGetStats(Relation index, BrinStatsData *stats) */ static BrinBuildState * initialize_brin_buildstate(Relation idxRel, BrinRevmap *revmap, - BlockNumber pagesPerRange) + BlockNumber pagesPerRange, BlockNumber tablePages) { BrinBuildState *state; + BlockNumber lastRange = 0; state = palloc_object(BrinBuildState); state->bs_irel = idxRel; state->bs_numtuples = 0; + state->bs_reltuples = 0; state->bs_currentInsertBuf = InvalidBuffer; state->bs_pagesPerRange = pagesPerRange; state->bs_currRangeStart = 0; state->bs_rmAccess = revmap; state->bs_bdesc = brin_build_desc(idxRel); state->bs_dtuple = brin_new_memtuple(state->bs_bdesc); + state->bs_leader = NULL; + state->bs_worker_id = 0; + state->bs_sortstate = NULL; + state->bs_context = CurrentMemoryContext; + state->bs_emptyTuple = NULL; + state->bs_emptyTupleLen = 0; + + /* Remember the memory context to use for an empty tuple, if needed. */ + state->bs_context = CurrentMemoryContext; + state->bs_emptyTuple = NULL; + state->bs_emptyTupleLen = 0; + + /* + * Calculate the start of the last page range. Page numbers are 0-based, + * so to calculate the index we need to subtract one. The integer division + * gives us the index of the page range. + */ + if (tablePages > 0) + lastRange = ((tablePages - 1) / pagesPerRange) * pagesPerRange; + + /* Now calculate the start of the next range. */ + state->bs_maxRangeStart = lastRange + state->bs_pagesPerRange; return state; } @@ -1458,8 +1849,7 @@ summarize_range(IndexInfo *indexInfo, BrinBuildState *state, Relation heapRel, * the same.) */ phtup = brinGetTupleForHeapBlock(state->bs_rmAccess, heapBlk, &phbuf, - &offset, &phsz, BUFFER_LOCK_SHARE, - NULL); + &offset, &phsz, BUFFER_LOCK_SHARE); /* the placeholder tuple must exist */ if (phtup == NULL) elog(ERROR, "missing placeholder tuple"); @@ -1496,7 +1886,7 @@ brinsummarize(Relation index, Relation heapRel, BlockNumber pageRange, Buffer buf; BlockNumber startBlk; - revmap = brinRevmapInitialize(index, &pagesPerRange, NULL); + revmap = brinRevmapInitialize(index, &pagesPerRange); /* determine range of pages to process */ heapNumBlocks = RelationGetNumberOfBlocks(heapRel); @@ -1537,7 +1927,7 @@ brinsummarize(Relation index, Relation heapRel, BlockNumber pageRange, CHECK_FOR_INTERRUPTS(); tup = brinGetTupleForHeapBlock(revmap, startBlk, &buf, &off, NULL, - BUFFER_LOCK_SHARE, NULL); + BUFFER_LOCK_SHARE); if (tup == NULL) { /* no revmap entry for this heap range. Summarize it. */ @@ -1546,7 +1936,8 @@ brinsummarize(Relation index, Relation heapRel, BlockNumber pageRange, /* first time through */ Assert(!indexInfo); state = initialize_brin_buildstate(index, revmap, - pagesPerRange); + pagesPerRange, + InvalidBlockNumber); indexInfo = BuildIndexInfo(index); } summarize_range(indexInfo, state, heapRel, startBlk, heapNumBlocks); @@ -1597,6 +1988,32 @@ form_and_insert_tuple(BrinBuildState *state) pfree(tup); } +/* + * Given a deformed tuple in the build state, convert it into the on-disk + * format and write it to a (shared) tuplesort (the leader will insert it + * into the index later). + */ +static void +form_and_spill_tuple(BrinBuildState *state) +{ + BrinTuple *tup; + Size size; + + /* don't insert empty tuples in parallel build */ + if (state->bs_dtuple->bt_empty_range) + return; + + tup = brin_form_tuple(state->bs_bdesc, state->bs_currRangeStart, + state->bs_dtuple, &size); + + /* write the BRIN tuple to the tuplesort */ + tuplesort_putbrintuple(state->bs_sortstate, tup, size); + + state->bs_numtuples++; + + pfree(tup); +} + /* * Given two deformed tuples, adjust the first one so that it's consistent * with the summary values in both. @@ -1738,7 +2155,7 @@ union_tuples(BrinDesc *bdesc, BrinMemTuple *a, BrinTuple *b) * brin_vacuum_scan * Do a complete scan of the index during VACUUM. * - * This routine scans the complete index looking for uncatalogued index pages, + * This routine scans the complete index looking for uncataloged index pages, * i.e. those that might have been lost due to a crash after index extension * and such. */ @@ -1777,7 +2194,7 @@ brin_vacuum_scan(Relation idxrel, BufferAccessStrategy strategy) static bool add_values_to_range(Relation idxRel, BrinDesc *bdesc, BrinMemTuple *dtup, - Datum *values, bool *nulls) + const Datum *values, const bool *nulls) { int keyno; @@ -1916,3 +2333,672 @@ check_null_keys(BrinValues *bval, ScanKey *nullkeys, int nnullkeys) return true; } + +/* + * Create parallel context, and launch workers for leader. + * + * buildstate argument should be initialized (with the exception of the + * tuplesort states, which may later be created based on shared + * state initially set up here). + * + * isconcurrent indicates if operation is CREATE INDEX CONCURRENTLY. + * + * request is the target number of parallel worker processes to launch. + * + * Sets buildstate's BrinLeader, which caller must use to shut down parallel + * mode by passing it to _brin_end_parallel() at the very end of its index + * build. If not even a single worker process can be launched, this is + * never set, and caller should proceed with a serial index build. + */ +static void +_brin_begin_parallel(BrinBuildState *buildstate, Relation heap, Relation index, + bool isconcurrent, int request) +{ + ParallelContext *pcxt; + int scantuplesortstates; + Snapshot snapshot; + Size estbrinshared; + Size estsort; + BrinShared *brinshared; + Sharedsort *sharedsort; + BrinLeader *brinleader = (BrinLeader *) palloc0(sizeof(BrinLeader)); + WalUsage *walusage; + BufferUsage *bufferusage; + bool leaderparticipates = true; + int querylen; + +#ifdef DISABLE_LEADER_PARTICIPATION + leaderparticipates = false; +#endif + + /* + * Enter parallel mode, and create context for parallel build of brin + * index + */ + EnterParallelMode(); + Assert(request > 0); + pcxt = CreateParallelContext("postgres", "_brin_parallel_build_main", + request); + + scantuplesortstates = leaderparticipates ? request + 1 : request; + + /* + * Prepare for scan of the base relation. In a normal index build, we use + * SnapshotAny because we must retrieve all tuples and do our own time + * qual checks (because we have to index RECENTLY_DEAD tuples). In a + * concurrent build, we take a regular MVCC snapshot and index whatever's + * live according to that. + */ + if (!isconcurrent) + snapshot = SnapshotAny; + else + snapshot = RegisterSnapshot(GetTransactionSnapshot()); + + /* + * Estimate size for our own PARALLEL_KEY_BRIN_SHARED workspace. + */ + estbrinshared = _brin_parallel_estimate_shared(heap, snapshot); + shm_toc_estimate_chunk(&pcxt->estimator, estbrinshared); + estsort = tuplesort_estimate_shared(scantuplesortstates); + shm_toc_estimate_chunk(&pcxt->estimator, estsort); + + shm_toc_estimate_keys(&pcxt->estimator, 2); + + /* + * Estimate space for WalUsage and BufferUsage -- PARALLEL_KEY_WAL_USAGE + * and PARALLEL_KEY_BUFFER_USAGE. + * + * If there are no extensions loaded that care, we could skip this. We + * have no way of knowing whether anyone's looking at pgWalUsage or + * pgBufferUsage, so do it unconditionally. + */ + shm_toc_estimate_chunk(&pcxt->estimator, + mul_size(sizeof(WalUsage), pcxt->nworkers)); + shm_toc_estimate_keys(&pcxt->estimator, 1); + shm_toc_estimate_chunk(&pcxt->estimator, + mul_size(sizeof(BufferUsage), pcxt->nworkers)); + shm_toc_estimate_keys(&pcxt->estimator, 1); + + /* Finally, estimate PARALLEL_KEY_QUERY_TEXT space */ + if (debug_query_string) + { + querylen = strlen(debug_query_string); + shm_toc_estimate_chunk(&pcxt->estimator, querylen + 1); + shm_toc_estimate_keys(&pcxt->estimator, 1); + } + else + querylen = 0; /* keep compiler quiet */ + + /* Everyone's had a chance to ask for space, so now create the DSM */ + InitializeParallelDSM(pcxt); + + /* If no DSM segment was available, back out (do serial build) */ + if (pcxt->seg == NULL) + { + if (IsMVCCSnapshot(snapshot)) + UnregisterSnapshot(snapshot); + DestroyParallelContext(pcxt); + ExitParallelMode(); + return; + } + + /* Store shared build state, for which we reserved space */ + brinshared = (BrinShared *) shm_toc_allocate(pcxt->toc, estbrinshared); + /* Initialize immutable state */ + brinshared->heaprelid = RelationGetRelid(heap); + brinshared->indexrelid = RelationGetRelid(index); + brinshared->isconcurrent = isconcurrent; + brinshared->scantuplesortstates = scantuplesortstates; + brinshared->pagesPerRange = buildstate->bs_pagesPerRange; + ConditionVariableInit(&brinshared->workersdonecv); + SpinLockInit(&brinshared->mutex); + + /* Initialize mutable state */ + brinshared->nparticipantsdone = 0; + brinshared->reltuples = 0.0; + brinshared->indtuples = 0.0; + + table_parallelscan_initialize(heap, + ParallelTableScanFromBrinShared(brinshared), + snapshot); + + /* + * Store shared tuplesort-private state, for which we reserved space. + * Then, initialize opaque state using tuplesort routine. + */ + sharedsort = (Sharedsort *) shm_toc_allocate(pcxt->toc, estsort); + tuplesort_initialize_shared(sharedsort, scantuplesortstates, + pcxt->seg); + + /* + * Store shared tuplesort-private state, for which we reserved space. + * Then, initialize opaque state using tuplesort routine. + */ + shm_toc_insert(pcxt->toc, PARALLEL_KEY_BRIN_SHARED, brinshared); + shm_toc_insert(pcxt->toc, PARALLEL_KEY_TUPLESORT, sharedsort); + + /* Store query string for workers */ + if (debug_query_string) + { + char *sharedquery; + + sharedquery = (char *) shm_toc_allocate(pcxt->toc, querylen + 1); + memcpy(sharedquery, debug_query_string, querylen + 1); + shm_toc_insert(pcxt->toc, PARALLEL_KEY_QUERY_TEXT, sharedquery); + } + + /* + * Allocate space for each worker's WalUsage and BufferUsage; no need to + * initialize. + */ + walusage = shm_toc_allocate(pcxt->toc, + mul_size(sizeof(WalUsage), pcxt->nworkers)); + shm_toc_insert(pcxt->toc, PARALLEL_KEY_WAL_USAGE, walusage); + bufferusage = shm_toc_allocate(pcxt->toc, + mul_size(sizeof(BufferUsage), pcxt->nworkers)); + shm_toc_insert(pcxt->toc, PARALLEL_KEY_BUFFER_USAGE, bufferusage); + + /* Launch workers, saving status for leader/caller */ + LaunchParallelWorkers(pcxt); + brinleader->pcxt = pcxt; + brinleader->nparticipanttuplesorts = pcxt->nworkers_launched; + if (leaderparticipates) + brinleader->nparticipanttuplesorts++; + brinleader->brinshared = brinshared; + brinleader->sharedsort = sharedsort; + brinleader->snapshot = snapshot; + brinleader->walusage = walusage; + brinleader->bufferusage = bufferusage; + + /* If no workers were successfully launched, back out (do serial build) */ + if (pcxt->nworkers_launched == 0) + { + _brin_end_parallel(brinleader, NULL); + return; + } + + /* Save leader state now that it's clear build will be parallel */ + buildstate->bs_leader = brinleader; + + /* Join heap scan ourselves */ + if (leaderparticipates) + _brin_leader_participate_as_worker(buildstate, heap, index); + + /* + * Caller needs to wait for all launched workers when we return. Make + * sure that the failure-to-start case will not hang forever. + */ + WaitForParallelWorkersToAttach(pcxt); +} + +/* + * Shut down workers, destroy parallel context, and end parallel mode. + */ +static void +_brin_end_parallel(BrinLeader *brinleader, BrinBuildState *state) +{ + int i; + + /* Shutdown worker processes */ + WaitForParallelWorkersToFinish(brinleader->pcxt); + + /* + * Next, accumulate WAL usage. (This must wait for the workers to finish, + * or we might get incomplete data.) + */ + for (i = 0; i < brinleader->pcxt->nworkers_launched; i++) + InstrAccumParallelQuery(&brinleader->bufferusage[i], &brinleader->walusage[i]); + + /* Free last reference to MVCC snapshot, if one was used */ + if (IsMVCCSnapshot(brinleader->snapshot)) + UnregisterSnapshot(brinleader->snapshot); + DestroyParallelContext(brinleader->pcxt); + ExitParallelMode(); +} + +/* + * Within leader, wait for end of heap scan. + * + * When called, parallel heap scan started by _brin_begin_parallel() will + * already be underway within worker processes (when leader participates + * as a worker, we should end up here just as workers are finishing). + * + * Returns the total number of heap tuples scanned. + */ +static double +_brin_parallel_heapscan(BrinBuildState *state) +{ + BrinShared *brinshared = state->bs_leader->brinshared; + int nparticipanttuplesorts; + + nparticipanttuplesorts = state->bs_leader->nparticipanttuplesorts; + for (;;) + { + SpinLockAcquire(&brinshared->mutex); + if (brinshared->nparticipantsdone == nparticipanttuplesorts) + { + /* copy the data into leader state */ + state->bs_reltuples = brinshared->reltuples; + state->bs_numtuples = brinshared->indtuples; + + SpinLockRelease(&brinshared->mutex); + break; + } + SpinLockRelease(&brinshared->mutex); + + ConditionVariableSleep(&brinshared->workersdonecv, + WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN); + } + + ConditionVariableCancelSleep(); + + return state->bs_reltuples; +} + +/* + * Within leader, wait for end of heap scan and merge per-worker results. + * + * After waiting for all workers to finish, merge the per-worker results into + * the complete index. The results from each worker are sorted by block number + * (start of the page range). While combining the per-worker results we merge + * summaries for the same page range, and also fill-in empty summaries for + * ranges without any tuples. + * + * Returns the total number of heap tuples scanned. + */ +static double +_brin_parallel_merge(BrinBuildState *state) +{ + BrinTuple *btup; + BrinMemTuple *memtuple = NULL; + Size tuplen; + BlockNumber prevblkno = InvalidBlockNumber; + MemoryContext rangeCxt, + oldCxt; + double reltuples; + + /* wait for workers to scan table and produce partial results */ + reltuples = _brin_parallel_heapscan(state); + + /* do the actual sort in the leader */ + tuplesort_performsort(state->bs_sortstate); + + /* + * Initialize BrinMemTuple we'll use to union summaries from workers (in + * case they happened to produce parts of the same page range). + */ + memtuple = brin_new_memtuple(state->bs_bdesc); + + /* + * Create a memory context we'll reset to combine results for a single + * page range (received from the workers). We don't expect huge number of + * overlaps under regular circumstances, because for large tables the + * chunk size is likely larger than the BRIN page range), but it can + * happen, and the union functions may do all kinds of stuff. So we better + * reset the context once in a while. + */ + rangeCxt = AllocSetContextCreate(CurrentMemoryContext, + "brin union", + ALLOCSET_DEFAULT_SIZES); + oldCxt = MemoryContextSwitchTo(rangeCxt); + + /* + * Read the BRIN tuples from the shared tuplesort, sorted by block number. + * That probably gives us an index that is cheaper to scan, thanks to + * mostly getting data from the same index page as before. + */ + while ((btup = tuplesort_getbrintuple(state->bs_sortstate, &tuplen, true)) != NULL) + { + /* Ranges should be multiples of pages_per_range for the index. */ + Assert(btup->bt_blkno % state->bs_leader->brinshared->pagesPerRange == 0); + + /* + * Do we need to union summaries for the same page range? + * + * If this is the first brin tuple we read, then just deform it into + * the memtuple, and continue with the next one from tuplesort. We + * however may need to insert empty summaries into the index. + * + * If it's the same block as the last we saw, we simply union the brin + * tuple into it, and we're done - we don't even need to insert empty + * ranges, because that was done earlier when we saw the first brin + * tuple (for this range). + * + * Finally, if it's not the first brin tuple, and it's not the same + * page range, we need to do the insert and then deform the tuple into + * the memtuple. Then we'll insert empty ranges before the new brin + * tuple, if needed. + */ + if (prevblkno == InvalidBlockNumber) + { + /* First brin tuples, just deform into memtuple. */ + memtuple = brin_deform_tuple(state->bs_bdesc, btup, memtuple); + + /* continue to insert empty pages before thisblock */ + } + else if (memtuple->bt_blkno == btup->bt_blkno) + { + /* + * Not the first brin tuple, but same page range as the previous + * one, so we can merge it into the memtuple. + */ + union_tuples(state->bs_bdesc, memtuple, btup); + continue; + } + else + { + BrinTuple *tmp; + Size len; + + /* + * We got brin tuple for a different page range, so form a brin + * tuple from the memtuple, insert it, and re-init the memtuple + * from the new brin tuple. + */ + tmp = brin_form_tuple(state->bs_bdesc, memtuple->bt_blkno, + memtuple, &len); + + brin_doinsert(state->bs_irel, state->bs_pagesPerRange, state->bs_rmAccess, + &state->bs_currentInsertBuf, tmp->bt_blkno, tmp, len); + + /* + * Reset the per-output-range context. This frees all the memory + * possibly allocated by the union functions, and also the BRIN + * tuple we just formed and inserted. + */ + MemoryContextReset(rangeCxt); + + memtuple = brin_deform_tuple(state->bs_bdesc, btup, memtuple); + + /* continue to insert empty pages before thisblock */ + } + + /* Fill empty ranges for all ranges missing in the tuplesort. */ + brin_fill_empty_ranges(state, prevblkno, btup->bt_blkno); + + prevblkno = btup->bt_blkno; + } + + tuplesort_end(state->bs_sortstate); + + /* Fill the BRIN tuple for the last page range with data. */ + if (prevblkno != InvalidBlockNumber) + { + BrinTuple *tmp; + Size len; + + tmp = brin_form_tuple(state->bs_bdesc, memtuple->bt_blkno, + memtuple, &len); + + brin_doinsert(state->bs_irel, state->bs_pagesPerRange, state->bs_rmAccess, + &state->bs_currentInsertBuf, tmp->bt_blkno, tmp, len); + + pfree(tmp); + } + + /* Fill empty ranges at the end, for all ranges missing in the tuplesort. */ + brin_fill_empty_ranges(state, prevblkno, state->bs_maxRangeStart); + + /* + * Switch back to the original memory context, and destroy the one we + * created to isolate the union_tuple calls. + */ + MemoryContextSwitchTo(oldCxt); + MemoryContextDelete(rangeCxt); + + return reltuples; +} + +/* + * Returns size of shared memory required to store state for a parallel + * brin index build based on the snapshot its parallel scan will use. + */ +static Size +_brin_parallel_estimate_shared(Relation heap, Snapshot snapshot) +{ + /* c.f. shm_toc_allocate as to why BUFFERALIGN is used */ + return add_size(BUFFERALIGN(sizeof(BrinShared)), + table_parallelscan_estimate(heap, snapshot)); +} + +/* + * Within leader, participate as a parallel worker. + */ +static void +_brin_leader_participate_as_worker(BrinBuildState *buildstate, Relation heap, Relation index) +{ + BrinLeader *brinleader = buildstate->bs_leader; + int sortmem; + + /* + * Might as well use reliable figure when doling out maintenance_work_mem + * (when requested number of workers were not launched, this will be + * somewhat higher than it is for other workers). + */ + sortmem = maintenance_work_mem / brinleader->nparticipanttuplesorts; + + /* Perform work common to all participants */ + _brin_parallel_scan_and_build(buildstate, brinleader->brinshared, + brinleader->sharedsort, heap, index, sortmem, true); +} + +/* + * Perform a worker's portion of a parallel sort. + * + * This generates a tuplesort for the worker portion of the table. + * + * sortmem is the amount of working memory to use within each worker, + * expressed in KBs. + * + * When this returns, workers are done, and need only release resources. + */ +static void +_brin_parallel_scan_and_build(BrinBuildState *state, + BrinShared *brinshared, Sharedsort *sharedsort, + Relation heap, Relation index, + int sortmem, bool progress) +{ + SortCoordinate coordinate; + TableScanDesc scan; + double reltuples; + IndexInfo *indexInfo; + + /* Initialize local tuplesort coordination state */ + coordinate = palloc0(sizeof(SortCoordinateData)); + coordinate->isWorker = true; + coordinate->nParticipants = -1; + coordinate->sharedsort = sharedsort; + + /* Begin "partial" tuplesort */ + state->bs_sortstate = tuplesort_begin_index_brin(sortmem, coordinate, + TUPLESORT_NONE); + + /* Join parallel scan */ + indexInfo = BuildIndexInfo(index); + indexInfo->ii_Concurrent = brinshared->isconcurrent; + + scan = table_beginscan_parallel(heap, + ParallelTableScanFromBrinShared(brinshared)); + + reltuples = table_index_build_scan(heap, index, indexInfo, true, true, + brinbuildCallbackParallel, state, scan); + + /* insert the last item */ + form_and_spill_tuple(state); + + /* sort the BRIN ranges built by this worker */ + tuplesort_performsort(state->bs_sortstate); + + state->bs_reltuples += reltuples; + + /* + * Done. Record ambuild statistics. + */ + SpinLockAcquire(&brinshared->mutex); + brinshared->nparticipantsdone++; + brinshared->reltuples += state->bs_reltuples; + brinshared->indtuples += state->bs_numtuples; + SpinLockRelease(&brinshared->mutex); + + /* Notify leader */ + ConditionVariableSignal(&brinshared->workersdonecv); + + tuplesort_end(state->bs_sortstate); +} + +/* + * Perform work within a launched parallel process. + */ +void +_brin_parallel_build_main(dsm_segment *seg, shm_toc *toc) +{ + char *sharedquery; + BrinShared *brinshared; + Sharedsort *sharedsort; + BrinBuildState *buildstate; + Relation heapRel; + Relation indexRel; + LOCKMODE heapLockmode; + LOCKMODE indexLockmode; + WalUsage *walusage; + BufferUsage *bufferusage; + int sortmem; + + /* + * The only possible status flag that can be set to the parallel worker is + * PROC_IN_SAFE_IC. + */ + Assert((MyProc->statusFlags == 0) || + (MyProc->statusFlags == PROC_IN_SAFE_IC)); + + /* Set debug_query_string for individual workers first */ + sharedquery = shm_toc_lookup(toc, PARALLEL_KEY_QUERY_TEXT, true); + debug_query_string = sharedquery; + + /* Report the query string from leader */ + pgstat_report_activity(STATE_RUNNING, debug_query_string); + + /* Look up brin shared state */ + brinshared = shm_toc_lookup(toc, PARALLEL_KEY_BRIN_SHARED, false); + + /* Open relations using lock modes known to be obtained by index.c */ + if (!brinshared->isconcurrent) + { + heapLockmode = ShareLock; + indexLockmode = AccessExclusiveLock; + } + else + { + heapLockmode = ShareUpdateExclusiveLock; + indexLockmode = RowExclusiveLock; + } + + /* Open relations within worker */ + heapRel = table_open(brinshared->heaprelid, heapLockmode); + indexRel = index_open(brinshared->indexrelid, indexLockmode); + + buildstate = initialize_brin_buildstate(indexRel, NULL, + brinshared->pagesPerRange, + InvalidBlockNumber); + + /* Look up shared state private to tuplesort.c */ + sharedsort = shm_toc_lookup(toc, PARALLEL_KEY_TUPLESORT, false); + tuplesort_attach_shared(sharedsort, seg); + + /* Prepare to track buffer usage during parallel execution */ + InstrStartParallelQuery(); + + /* + * Might as well use reliable figure when doling out maintenance_work_mem + * (when requested number of workers were not launched, this will be + * somewhat higher than it is for other workers). + */ + sortmem = maintenance_work_mem / brinshared->scantuplesortstates; + + _brin_parallel_scan_and_build(buildstate, brinshared, sharedsort, + heapRel, indexRel, sortmem, false); + + /* Report WAL/buffer usage during parallel execution */ + bufferusage = shm_toc_lookup(toc, PARALLEL_KEY_BUFFER_USAGE, false); + walusage = shm_toc_lookup(toc, PARALLEL_KEY_WAL_USAGE, false); + InstrEndParallelQuery(&bufferusage[ParallelWorkerNumber], + &walusage[ParallelWorkerNumber]); + + index_close(indexRel, indexLockmode); + table_close(heapRel, heapLockmode); +} + +/* + * brin_build_empty_tuple + * Maybe initialize a BRIN tuple representing empty range. + * + * Returns a BRIN tuple representing an empty page range starting at the + * specified block number. The empty tuple is initialized only once, when it's + * needed for the first time, stored in the memory context bs_context to ensure + * proper life span, and reused on following calls. All empty tuples are + * exactly the same except for the bt_blkno field, which is set to the value + * in blkno parameter. + */ +static void +brin_build_empty_tuple(BrinBuildState *state, BlockNumber blkno) +{ + /* First time an empty tuple is requested? If yes, initialize it. */ + if (state->bs_emptyTuple == NULL) + { + MemoryContext oldcxt; + BrinMemTuple *dtuple = brin_new_memtuple(state->bs_bdesc); + + /* Allocate the tuple in context for the whole index build. */ + oldcxt = MemoryContextSwitchTo(state->bs_context); + + state->bs_emptyTuple = brin_form_tuple(state->bs_bdesc, blkno, dtuple, + &state->bs_emptyTupleLen); + + MemoryContextSwitchTo(oldcxt); + } + else + { + /* If we already have an empty tuple, just update the block. */ + state->bs_emptyTuple->bt_blkno = blkno; + } +} + +/* + * brin_fill_empty_ranges + * Add BRIN index tuples representing empty page ranges. + * + * prevRange/nextRange determine for which page ranges to add empty summaries. + * Both boundaries are exclusive, i.e. only ranges starting at blkno for which + * (prevRange < blkno < nextRange) will be added to the index. + * + * If prevRange is InvalidBlockNumber, this means there was no previous page + * range (i.e. the first empty range to add is for blkno=0). + * + * The empty tuple is built only once, and then reused for all future calls. + */ +static void +brin_fill_empty_ranges(BrinBuildState *state, + BlockNumber prevRange, BlockNumber nextRange) +{ + BlockNumber blkno; + + /* + * If we already summarized some ranges, we need to start with the next + * one. Otherwise start from the first range of the table. + */ + blkno = (prevRange == InvalidBlockNumber) ? 0 : (prevRange + state->bs_pagesPerRange); + + /* Generate empty ranges until we hit the next non-empty range. */ + while (blkno < nextRange) + { + /* Did we already build the empty tuple? If not, do it now. */ + brin_build_empty_tuple(state, blkno); + + brin_doinsert(state->bs_irel, state->bs_pagesPerRange, state->bs_rmAccess, + &state->bs_currentInsertBuf, + blkno, state->bs_emptyTuple, state->bs_emptyTupleLen); + + /* try next page range */ + blkno += state->bs_pagesPerRange; + } +} diff --git a/src/backend/access/brin/brin_bloom.c b/src/backend/access/brin/brin_bloom.c index e4953a9d37b83..354cc545843a9 100644 --- a/src/backend/access/brin/brin_bloom.c +++ b/src/backend/access/brin/brin_bloom.c @@ -2,7 +2,7 @@ * brin_bloom.c * Implementation of Bloom opclass for BRIN * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -114,24 +114,21 @@ */ #include "postgres.h" -#include "access/genam.h" +#include + #include "access/brin.h" #include "access/brin_internal.h" #include "access/brin_page.h" #include "access/brin_tuple.h" -#include "access/hash.h" +#include "access/genam.h" #include "access/htup_details.h" #include "access/reloptions.h" -#include "access/stratnum.h" -#include "catalog/pg_type.h" +#include "catalog/pg_am.h" #include "catalog/pg_amop.h" -#include "utils/builtins.h" -#include "utils/datum.h" -#include "utils/lsyscache.h" +#include "catalog/pg_type.h" +#include "common/hashfn.h" +#include "utils/fmgrprotos.h" #include "utils/rel.h" -#include "utils/syscache.h" - -#include #define BloomEqualStrategyNumber 1 @@ -259,6 +256,48 @@ typedef struct BloomFilter char data[FLEXIBLE_ARRAY_MEMBER]; } BloomFilter; +/* + * bloom_filter_size + * Calculate Bloom filter parameters (nbits, nbytes, nhashes). + * + * Given expected number of distinct values and desired false positive rate, + * calculates the optimal parameters of the Bloom filter. + * + * The resulting parameters are returned through nbytesp (number of bytes), + * nbitsp (number of bits) and nhashesp (number of hash functions). If a + * pointer is NULL, the parameter is not returned. + */ +static void +bloom_filter_size(int ndistinct, double false_positive_rate, + int *nbytesp, int *nbitsp, int *nhashesp) +{ + double k; + int nbits, + nbytes; + + /* sizing bloom filter: -(n * ln(p)) / (ln(2))^2 */ + nbits = ceil(-(ndistinct * log(false_positive_rate)) / pow(log(2.0), 2)); + + /* round m to whole bytes */ + nbytes = ((nbits + 7) / 8); + nbits = nbytes * 8; + + /* + * round(log(2.0) * m / ndistinct), but assume round() may not be + * available on Windows + */ + k = log(2.0) * nbits / ndistinct; + k = (k - floor(k) >= 0.5) ? ceil(k) : floor(k); + + if (nbytesp) + *nbytesp = nbytes; + + if (nbitsp) + *nbitsp = nbits; + + if (nhashesp) + *nhashesp = (int) k; +} /* * bloom_init @@ -275,19 +314,14 @@ bloom_init(int ndistinct, double false_positive_rate) int nbits; /* size of filter / number of bits */ int nbytes; /* size of filter / number of bytes */ - - double k; /* number of hash functions */ + int nhashes; /* number of hash functions */ Assert(ndistinct > 0); - Assert((false_positive_rate >= BLOOM_MIN_FALSE_POSITIVE_RATE) && - (false_positive_rate < BLOOM_MAX_FALSE_POSITIVE_RATE)); - - /* sizing bloom filter: -(n * ln(p)) / (ln(2))^2 */ - nbits = ceil(-(ndistinct * log(false_positive_rate)) / pow(log(2.0), 2)); + Assert(false_positive_rate > 0 && false_positive_rate < 1); - /* round m to whole bytes */ - nbytes = ((nbits + 7) / 8); - nbits = nbytes * 8; + /* calculate bloom filter size / parameters */ + bloom_filter_size(ndistinct, false_positive_rate, + &nbytes, &nbits, &nhashes); /* * Reject filters that are obviously too large to store on a page. @@ -310,13 +344,6 @@ bloom_init(int ndistinct, double false_positive_rate) elog(ERROR, "the bloom filter is too large (%d > %zu)", nbytes, BloomMaxFilterSize); - /* - * round(log(2.0) * m / ndistinct), but assume round() may not be - * available on Windows - */ - k = log(2.0) * nbits / ndistinct; - k = (k - floor(k) >= 0.5) ? ceil(k) : floor(k); - /* * We allocate the whole filter. Most of it is going to be 0 bits, so the * varlena is easy to compress. @@ -326,7 +353,7 @@ bloom_init(int ndistinct, double false_positive_rate) filter = (BloomFilter *) palloc0(len); filter->flags = 0; - filter->nhashes = (int) k; + filter->nhashes = nhashes; filter->nbits = nbits; SET_VARSIZE(filter, len); @@ -412,7 +439,6 @@ typedef struct BloomOpaque * consistency. We may need additional procs in the future. */ FmgrInfo extra_procinfos[BLOOM_MAX_PROCNUMS]; - bool extra_proc_missing[BLOOM_MAX_PROCNUMS]; } BloomOpaque; static FmgrInfo *bloom_get_procinfo(BrinDesc *bdesc, uint16 attno, @@ -574,7 +600,7 @@ brin_bloom_consistent(PG_FUNCTION_ARGS) Oid colloid = PG_GET_COLLATION(); AttrNumber attno; Datum value; - Datum matches; + bool matches; FmgrInfo *finfo; uint32 hashValue; BloomFilter *filter; @@ -584,6 +610,10 @@ brin_bloom_consistent(PG_FUNCTION_ARGS) Assert(filter); + /* + * Assume all scan keys match. We'll be searching for a scan key + * eliminating the page range (we can stop on the first such key). + */ matches = true; for (keyno = 0; keyno < nkeys; keyno++) @@ -601,9 +631,8 @@ brin_bloom_consistent(PG_FUNCTION_ARGS) case BloomEqualStrategyNumber: /* - * In the equality case (WHERE col = someval), we want to - * return the current page range if the minimum value in the - * range <= scan key, and the maximum value >= scan key. + * We want to return the current page range if the bloom + * filter seems to contain the value. */ finfo = bloom_get_procinfo(bdesc, attno, PROCNUM_HASH); @@ -614,7 +643,7 @@ brin_bloom_consistent(PG_FUNCTION_ARGS) default: /* shouldn't happen */ elog(ERROR, "invalid strategy number %d", key->sk_strategy); - matches = 0; + matches = false; break; } @@ -622,7 +651,7 @@ brin_bloom_consistent(PG_FUNCTION_ARGS) break; } - PG_RETURN_DATUM(matches); + PG_RETURN_BOOL(matches); } /* @@ -661,6 +690,20 @@ brin_bloom_union(PG_FUNCTION_ARGS) for (i = 0; i < nbytes; i++) filter_a->data[i] |= filter_b->data[i]; + /* update the number of bits set in the filter */ + filter_a->nbits_set = pg_popcount((const char *) filter_a->data, nbytes); + + /* if we decompressed filter_a, update the summary */ + if (PointerGetDatum(filter_a) != col_a->bv_values[0]) + { + pfree(DatumGetPointer(col_a->bv_values[0])); + col_a->bv_values[0] = PointerGetDatum(filter_a); + } + + /* also free filter_b, if it was decompressed */ + if (PointerGetDatum(filter_b) != col_b->bv_values[0]) + pfree(filter_b); + PG_RETURN_VOID(); } @@ -682,27 +725,19 @@ bloom_get_procinfo(BrinDesc *bdesc, uint16 attno, uint16 procnum) */ opaque = (BloomOpaque *) bdesc->bd_info[attno - 1]->oi_opaque; - /* - * If we already searched for this proc and didn't find it, don't bother - * searching again. - */ - if (opaque->extra_proc_missing[basenum]) - return NULL; - if (opaque->extra_procinfos[basenum].fn_oid == InvalidOid) { if (RegProcedureIsValid(index_getprocid(bdesc->bd_index, attno, procnum))) - { fmgr_info_copy(&opaque->extra_procinfos[basenum], index_getprocinfo(bdesc->bd_index, attno, procnum), bdesc->bd_context); - } else - { - opaque->extra_proc_missing[basenum] = true; - return NULL; - } + ereport(ERROR, + errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg_internal("invalid opclass definition"), + errdetail_internal("The operator class is missing support function %d for column %d.", + procnum, attno)); } return &opaque->extra_procinfos[basenum]; @@ -767,7 +802,7 @@ brin_bloom_summary_out(PG_FUNCTION_ARGS) StringInfoData str; /* detoast the data to get value with a full 4B header */ - filter = (BloomFilter *) PG_DETOAST_DATUM_PACKED(PG_GETARG_DATUM(0)); + filter = (BloomFilter *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); initStringInfo(&str); appendStringInfoChar(&str, '{'); diff --git a/src/backend/access/brin/brin_inclusion.c b/src/backend/access/brin/brin_inclusion.c index 02f4d0ae76ec7..c09dad28ef985 100644 --- a/src/backend/access/brin/brin_inclusion.c +++ b/src/backend/access/brin/brin_inclusion.c @@ -16,7 +16,7 @@ * writing is the INET type, where IPv6 values cannot be merged with IPv4 * values. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -30,8 +30,8 @@ #include "access/skey.h" #include "catalog/pg_amop.h" #include "catalog/pg_type.h" -#include "utils/builtins.h" #include "utils/datum.h" +#include "utils/fmgrprotos.h" #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/syscache.h" @@ -82,7 +82,7 @@ typedef struct InclusionOpaque } InclusionOpaque; static FmgrInfo *inclusion_get_procinfo(BrinDesc *bdesc, uint16 attno, - uint16 procnum); + uint16 procnum, bool missing_ok); static FmgrInfo *inclusion_get_strategy_procinfo(BrinDesc *bdesc, uint16 attno, Oid subtype, uint16 strategynum); @@ -179,7 +179,7 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS) * new value for emptiness; if it returns true, we need to set the * "contains empty" flag in the element (unless already set). */ - finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_EMPTY); + finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_EMPTY, true); if (finfo != NULL && DatumGetBool(FunctionCall1Coll(finfo, colloid, newval))) { if (!DatumGetBool(column->bv_values[INCLUSION_CONTAINS_EMPTY])) @@ -195,7 +195,7 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS) PG_RETURN_BOOL(true); /* Check if the new value is already contained. */ - finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_CONTAINS); + finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_CONTAINS, true); if (finfo != NULL && DatumGetBool(FunctionCall2Coll(finfo, colloid, column->bv_values[INCLUSION_UNION], @@ -210,7 +210,7 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS) * it's not going to be used any longer. However, the BRIN framework * doesn't allow for the value not being present. Improve someday. */ - finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGEABLE); + finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGEABLE, true); if (finfo != NULL && !DatumGetBool(FunctionCall2Coll(finfo, colloid, column->bv_values[INCLUSION_UNION], @@ -221,8 +221,7 @@ brin_inclusion_add_value(PG_FUNCTION_ARGS) } /* Finally, merge the new value to the existing union. */ - finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGE); - Assert(finfo != NULL); + finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGE, false); result = FunctionCall2Coll(finfo, colloid, column->bv_values[INCLUSION_UNION], newval); if (!attr->attbyval && @@ -506,7 +505,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS) } /* Check if A and B are mergeable; if not, mark A unmergeable. */ - finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGEABLE); + finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGEABLE, true); if (finfo != NULL && !DatumGetBool(FunctionCall2Coll(finfo, colloid, col_a->bv_values[INCLUSION_UNION], @@ -517,8 +516,7 @@ brin_inclusion_union(PG_FUNCTION_ARGS) } /* Finally, merge B to A. */ - finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGE); - Assert(finfo != NULL); + finfo = inclusion_get_procinfo(bdesc, attno, PROCNUM_MERGE, false); result = FunctionCall2Coll(finfo, colloid, col_a->bv_values[INCLUSION_UNION], col_b->bv_values[INCLUSION_UNION]); @@ -539,10 +537,12 @@ brin_inclusion_union(PG_FUNCTION_ARGS) * Cache and return inclusion opclass support procedure * * Return the procedure corresponding to the given function support number - * or null if it is not exists. + * or null if it is not exists. If missing_ok is true and the procedure + * isn't set up for this opclass, return NULL instead of raising an error. */ static FmgrInfo * -inclusion_get_procinfo(BrinDesc *bdesc, uint16 attno, uint16 procnum) +inclusion_get_procinfo(BrinDesc *bdesc, uint16 attno, uint16 procnum, + bool missing_ok) { InclusionOpaque *opaque; uint16 basenum = procnum - PROCNUM_BASE; @@ -564,13 +564,18 @@ inclusion_get_procinfo(BrinDesc *bdesc, uint16 attno, uint16 procnum) { if (RegProcedureIsValid(index_getprocid(bdesc->bd_index, attno, procnum))) - { fmgr_info_copy(&opaque->extra_procinfos[basenum], index_getprocinfo(bdesc->bd_index, attno, procnum), bdesc->bd_context); - } else { + if (!missing_ok) + ereport(ERROR, + errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg_internal("invalid opclass definition"), + errdetail_internal("The operator class is missing support function %d for column %d.", + procnum, attno)); + opaque->extra_proc_missing[basenum] = true; return NULL; } diff --git a/src/backend/access/brin/brin_minmax.c b/src/backend/access/brin/brin_minmax.c index 8229493c84acb..caf6991eb1b01 100644 --- a/src/backend/access/brin/brin_minmax.c +++ b/src/backend/access/brin/brin_minmax.c @@ -2,7 +2,7 @@ * brin_minmax.c * Implementation of Min/Max opclass for BRIN * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -12,12 +12,10 @@ #include "access/brin_internal.h" #include "access/brin_tuple.h" -#include "access/genam.h" #include "access/stratnum.h" #include "catalog/pg_amop.h" -#include "catalog/pg_type.h" -#include "utils/builtins.h" #include "utils/datum.h" +#include "utils/fmgrprotos.h" #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/syscache.h" diff --git a/src/backend/access/brin/brin_minmax_multi.c b/src/backend/access/brin/brin_minmax_multi.c index 8e4e6c2fc8aa1..8a13cd59c0b03 100644 --- a/src/backend/access/brin/brin_minmax_multi.c +++ b/src/backend/access/brin/brin_minmax_multi.c @@ -2,7 +2,7 @@ * brin_minmax_multi.c * Implementation of Multi Min/Max opclass for BRIN * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -59,16 +59,16 @@ /* needed for PGSQL_AF_INET */ #include -#include "access/genam.h" #include "access/brin.h" #include "access/brin_internal.h" #include "access/brin_tuple.h" +#include "access/genam.h" +#include "access/htup_details.h" #include "access/reloptions.h" #include "access/stratnum.h" -#include "access/htup_details.h" -#include "catalog/pg_type.h" #include "catalog/pg_am.h" #include "catalog/pg_amop.h" +#include "catalog/pg_type.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/date.h" @@ -77,7 +77,6 @@ #include "utils/inet.h" #include "utils/lsyscache.h" #include "utils/memutils.h" -#include "utils/numeric.h" #include "utils/pg_lsn.h" #include "utils/rel.h" #include "utils/syscache.h" @@ -112,7 +111,6 @@ typedef struct MinmaxMultiOpaque { FmgrInfo extra_procinfos[MINMAX_MAX_PROCNUMS]; - bool extra_proc_missing[MINMAX_MAX_PROCNUMS]; Oid cached_subtype; FmgrInfo strategy_procinfos[BTMaxStrategyNumber]; } MinmaxMultiOpaque; @@ -1369,7 +1367,7 @@ build_distances(FmgrInfo *distanceFn, Oid colloid, * Sort the distances in descending order, so that the longest gaps are at * the front. */ - pg_qsort(distances, ndistances, sizeof(DistanceValue), compare_distances); + qsort(distances, ndistances, sizeof(DistanceValue), compare_distances); return distances; } @@ -1660,6 +1658,9 @@ ensure_free_space_in_buffer(BrinDesc *bdesc, Oid colloid, /* build the expanded ranges */ eranges = build_expanded_ranges(cmpFn, colloid, range, &neranges); + /* Is the expanded representation of ranges correct? */ + AssertCheckExpandedRanges(bdesc, colloid, attno, attr, eranges, neranges); + /* and we'll also need the 'distance' procedure */ distanceFn = minmax_multi_get_procinfo(bdesc, attno, PROCNUM_DISTANCE); @@ -1675,6 +1676,9 @@ ensure_free_space_in_buffer(BrinDesc *bdesc, Oid colloid, range->maxvalues * MINMAX_BUFFER_LOAD_FACTOR, cmpFn, colloid); + /* Is the result of reducing expanded ranges correct? */ + AssertCheckExpandedRanges(bdesc, colloid, attno, attr, eranges, neranges); + /* Make sure we've sufficiently reduced the number of ranges. */ Assert(count_values(eranges, neranges) <= range->maxvalues * MINMAX_BUFFER_LOAD_FACTOR); @@ -2075,13 +2079,15 @@ brin_minmax_multi_distance_uuid(PG_FUNCTION_ARGS) Datum brin_minmax_multi_distance_date(PG_FUNCTION_ARGS) { + float8 delta = 0; DateADT dateVal1 = PG_GETARG_DATEADT(0); DateADT dateVal2 = PG_GETARG_DATEADT(1); - if (DATE_NOT_FINITE(dateVal1) || DATE_NOT_FINITE(dateVal2)) - PG_RETURN_FLOAT8(0); + delta = (float8) dateVal2 - (float8) dateVal1; + + Assert(delta >= 0); - PG_RETURN_FLOAT8(dateVal1 - dateVal2); + PG_RETURN_FLOAT8(delta); } /* @@ -2135,10 +2141,7 @@ brin_minmax_multi_distance_timestamp(PG_FUNCTION_ARGS) Timestamp dt1 = PG_GETARG_TIMESTAMP(0); Timestamp dt2 = PG_GETARG_TIMESTAMP(1); - if (TIMESTAMP_NOT_FINITE(dt1) || TIMESTAMP_NOT_FINITE(dt2)) - PG_RETURN_FLOAT8(0); - - delta = dt2 - dt1; + delta = (float8) dt2 - (float8) dt1; Assert(delta >= 0); @@ -2155,45 +2158,20 @@ brin_minmax_multi_distance_interval(PG_FUNCTION_ARGS) Interval *ia = PG_GETARG_INTERVAL_P(0); Interval *ib = PG_GETARG_INTERVAL_P(1); - Interval *result; int64 dayfraction; int64 days; - result = (Interval *) palloc(sizeof(Interval)); - - result->month = ib->month - ia->month; - /* overflow check copied from int4mi */ - if (!SAMESIGN(ib->month, ia->month) && - !SAMESIGN(result->month, ib->month)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); - - result->day = ib->day - ia->day; - if (!SAMESIGN(ib->day, ia->day) && - !SAMESIGN(result->day, ib->day)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); - - result->time = ib->time - ia->time; - if (!SAMESIGN(ib->time, ia->time) && - !SAMESIGN(result->time, ib->time)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); - /* * Delta is (fractional) number of days between the intervals. Assume * months have 30 days for consistency with interval_cmp_internal. We * don't need to be exact, in the worst case we'll build a bit less * efficient ranges. But we should not contradict interval_cmp. */ - dayfraction = result->time % USECS_PER_DAY; - days = result->time / USECS_PER_DAY; - days += result->month * INT64CONST(30); - days += result->day; + dayfraction = (ib->time % USECS_PER_DAY) - (ia->time % USECS_PER_DAY); + days = (ib->time / USECS_PER_DAY) - (ia->time / USECS_PER_DAY); + days += (int64) ib->day - (int64) ia->day; + days += ((int64) ib->month - (int64) ia->month) * INT64CONST(30); /* convert to double precision */ delta = (double) days + dayfraction / (double) USECS_PER_DAY; @@ -2602,7 +2580,7 @@ brin_minmax_multi_consistent(PG_FUNCTION_ARGS) for (keyno = 0; keyno < nkeys; keyno++) { - Datum matches; + bool matches; ScanKey key = keys[keyno]; /* NULL keys are handled and filtered-out in bringetbitmap */ @@ -2618,7 +2596,7 @@ brin_minmax_multi_consistent(PG_FUNCTION_ARGS) finfo = minmax_multi_get_strategy_procinfo(bdesc, attno, subtype, key->sk_strategy); /* first value from the array */ - matches = FunctionCall2Coll(finfo, colloid, minval, value); + matches = DatumGetBool(FunctionCall2Coll(finfo, colloid, minval, value)); break; case BTEqualStrategyNumber: @@ -2664,18 +2642,18 @@ brin_minmax_multi_consistent(PG_FUNCTION_ARGS) finfo = minmax_multi_get_strategy_procinfo(bdesc, attno, subtype, key->sk_strategy); /* last value from the array */ - matches = FunctionCall2Coll(finfo, colloid, maxval, value); + matches = DatumGetBool(FunctionCall2Coll(finfo, colloid, maxval, value)); break; default: /* shouldn't happen */ elog(ERROR, "invalid strategy number %d", key->sk_strategy); - matches = 0; + matches = false; break; } /* the range has to match all the scan keys */ - matching &= DatumGetBool(matches); + matching &= matches; /* once we find a non-matching key, we're done */ if (!matching) @@ -2686,7 +2664,7 @@ brin_minmax_multi_consistent(PG_FUNCTION_ARGS) * have we found a range matching all scan keys? if yes, we're done */ if (matching) - PG_RETURN_DATUM(BoolGetDatum(true)); + PG_RETURN_BOOL(true); } /* @@ -2703,7 +2681,7 @@ brin_minmax_multi_consistent(PG_FUNCTION_ARGS) for (keyno = 0; keyno < nkeys; keyno++) { - Datum matches; + bool matches; ScanKey key = keys[keyno]; /* we've already dealt with NULL keys at the beginning */ @@ -2723,18 +2701,18 @@ brin_minmax_multi_consistent(PG_FUNCTION_ARGS) finfo = minmax_multi_get_strategy_procinfo(bdesc, attno, subtype, key->sk_strategy); - matches = FunctionCall2Coll(finfo, colloid, val, value); + matches = DatumGetBool(FunctionCall2Coll(finfo, colloid, val, value)); break; default: /* shouldn't happen */ elog(ERROR, "invalid strategy number %d", key->sk_strategy); - matches = 0; + matches = false; break; } /* the range has to match all the scan keys */ - matching &= DatumGetBool(matches); + matching &= matches; /* once we find a non-matching key, we're done */ if (!matching) @@ -2743,10 +2721,10 @@ brin_minmax_multi_consistent(PG_FUNCTION_ARGS) /* have we found a range matching all scan keys? if yes, we're done */ if (matching) - PG_RETURN_DATUM(BoolGetDatum(true)); + PG_RETURN_BOOL(true); } - PG_RETURN_DATUM(BoolGetDatum(false)); + PG_RETURN_BOOL(false); } /* @@ -2859,6 +2837,9 @@ brin_minmax_multi_union(PG_FUNCTION_ARGS) ranges_a->maxvalues, cmpFn, colloid); + /* Is the result of reducing expanded ranges correct? */ + AssertCheckExpandedRanges(bdesc, colloid, attno, attr, eranges, neranges); + /* update the first range summary */ store_expanded_ranges(ranges_a, eranges, neranges); @@ -2890,27 +2871,19 @@ minmax_multi_get_procinfo(BrinDesc *bdesc, uint16 attno, uint16 procnum) */ opaque = (MinmaxMultiOpaque *) bdesc->bd_info[attno - 1]->oi_opaque; - /* - * If we already searched for this proc and didn't find it, don't bother - * searching again. - */ - if (opaque->extra_proc_missing[basenum]) - return NULL; - if (opaque->extra_procinfos[basenum].fn_oid == InvalidOid) { if (RegProcedureIsValid(index_getprocid(bdesc->bd_index, attno, procnum))) - { fmgr_info_copy(&opaque->extra_procinfos[basenum], index_getprocinfo(bdesc->bd_index, attno, procnum), bdesc->bd_context); - } else - { - opaque->extra_proc_missing[basenum] = true; - return NULL; - } + ereport(ERROR, + errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg_internal("invalid opclass definition"), + errdetail_internal("The operator class is missing support function %d for column %d.", + procnum, attno)); } return &opaque->extra_procinfos[basenum]; @@ -3041,7 +3014,7 @@ brin_minmax_multi_summary_out(PG_FUNCTION_ARGS) * Detoast to get value with full 4B header (can't be stored in a toast * table, but can use 1B header). */ - ranges = (SerializedRanges *) PG_DETOAST_DATUM_PACKED(PG_GETARG_DATUM(0)); + ranges = (SerializedRanges *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); /* lookup output func for the type */ getTypeOutputInfo(ranges->typid, &outfunc, &isvarlena); diff --git a/src/backend/access/brin/brin_pageops.c b/src/backend/access/brin/brin_pageops.c index b578d2595451f..b69217c1ec6d5 100644 --- a/src/backend/access/brin/brin_pageops.c +++ b/src/backend/access/brin/brin_pageops.c @@ -2,7 +2,7 @@ * brin_pageops.c * Page-handling routines for BRIN indexes * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -19,7 +19,6 @@ #include "storage/bufmgr.h" #include "storage/freespace.h" #include "storage/lmgr.h" -#include "storage/smgr.h" #include "utils/rel.h" /* diff --git a/src/backend/access/brin/brin_revmap.c b/src/backend/access/brin/brin_revmap.c index f4271ba31c916..5a9ed40ab64a2 100644 --- a/src/backend/access/brin/brin_revmap.c +++ b/src/backend/access/brin/brin_revmap.c @@ -12,7 +12,7 @@ * the metapage. When the revmap needs to be expanded, all tuples on the * regular BRIN page at that block (if any) are moved out of the way. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -29,7 +29,6 @@ #include "access/xloginsert.h" #include "miscadmin.h" #include "storage/bufmgr.h" -#include "storage/lmgr.h" #include "utils/rel.h" @@ -68,8 +67,7 @@ static void revmap_physical_extend(BrinRevmap *revmap); * brinRevmapTerminate when caller is done with it. */ BrinRevmap * -brinRevmapInitialize(Relation idxrel, BlockNumber *pagesPerRange, - Snapshot snapshot) +brinRevmapInitialize(Relation idxrel, BlockNumber *pagesPerRange) { BrinRevmap *revmap; Buffer meta; @@ -79,7 +77,6 @@ brinRevmapInitialize(Relation idxrel, BlockNumber *pagesPerRange, meta = ReadBuffer(idxrel, BRIN_METAPAGE_BLKNO); LockBuffer(meta, BUFFER_LOCK_SHARE); page = BufferGetPage(meta); - TestForOldSnapshot(snapshot, idxrel, page); metadata = (BrinMetaPageData *) PageGetContents(page); revmap = palloc(sizeof(BrinRevmap)); @@ -195,8 +192,7 @@ brinSetHeapBlockItemptr(Buffer buf, BlockNumber pagesPerRange, */ BrinTuple * brinGetTupleForHeapBlock(BrinRevmap *revmap, BlockNumber heapBlk, - Buffer *buf, OffsetNumber *off, Size *size, int mode, - Snapshot snapshot) + Buffer *buf, OffsetNumber *off, Size *size, int mode) { Relation idxRel = revmap->rm_irel; BlockNumber mapBlk; @@ -277,7 +273,6 @@ brinGetTupleForHeapBlock(BrinRevmap *revmap, BlockNumber heapBlk, } LockBuffer(*buf, mode); page = BufferGetPage(*buf); - TestForOldSnapshot(snapshot, idxRel, page); /* If we land on a revmap page, start over */ if (BRIN_IS_REGULAR_PAGE(page)) @@ -341,7 +336,7 @@ brinRevmapDesummarizeRange(Relation idxrel, BlockNumber heapBlk) OffsetNumber regOffset; ItemId lp; - revmap = brinRevmapInitialize(idxrel, &pagesPerRange, NULL); + revmap = brinRevmapInitialize(idxrel, &pagesPerRange); revmapBlk = revmap_get_blkno(revmap, heapBlk); if (!BlockNumberIsValid(revmapBlk)) @@ -372,11 +367,6 @@ brinRevmapDesummarizeRange(Relation idxrel, BlockNumber heapBlk) LockBuffer(regBuf, BUFFER_LOCK_EXCLUSIVE); regPg = BufferGetPage(regBuf); - /* - * We're only removing data, not reading it, so there's no need to - * TestForOldSnapshot here. - */ - /* if this is no longer a regular page, tell caller to start over */ if (!BRIN_IS_REGULAR_PAGE(regPg)) { @@ -569,7 +559,7 @@ revmap_physical_extend(BrinRevmap *revmap) } else { - buf = ExtendBufferedRel(EB_REL(irel), MAIN_FORKNUM, NULL, + buf = ExtendBufferedRel(BMR_REL(irel), MAIN_FORKNUM, NULL, EB_LOCK_FIRST); if (BufferGetBlockNumber(buf) != mapBlk) { diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c index 23dfeab7de874..997eb6d822cd6 100644 --- a/src/backend/access/brin/brin_tuple.c +++ b/src/backend/access/brin/brin_tuple.c @@ -23,7 +23,7 @@ * Note the size of the null bitmask may not be the same as that of the * datum array. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/access/brin/brin_validate.c b/src/backend/access/brin/brin_validate.c index c8edfb3759144..539ac9cb0645f 100644 --- a/src/backend/access/brin/brin_validate.c +++ b/src/backend/access/brin/brin_validate.c @@ -3,7 +3,7 @@ * brin_validate.c * Opclass validator for BRIN. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/access/brin/brin_xlog.c b/src/backend/access/brin/brin_xlog.c index 89145b68f685d..eb48d5e90da0b 100644 --- a/src/backend/access/brin/brin_xlog.c +++ b/src/backend/access/brin/brin_xlog.c @@ -2,7 +2,7 @@ * brin_xlog.c * XLog replay routines for BRIN indexes * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/access/brin/meson.build b/src/backend/access/brin/meson.build index 154c88b75d875..1c784cadbe094 100644 --- a/src/backend/access/brin/meson.build +++ b/src/backend/access/brin/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'brin.c', diff --git a/src/backend/access/common/Makefile b/src/backend/access/common/Makefile index b9aff0ccfdc45..e78de312659ed 100644 --- a/src/backend/access/common/Makefile +++ b/src/backend/access/common/Makefile @@ -25,6 +25,7 @@ OBJS = \ scankey.o \ session.o \ syncscan.o \ + tidstore.o \ toast_compression.o \ toast_internals.o \ tupconvert.o \ diff --git a/src/backend/access/common/attmap.c b/src/backend/access/common/attmap.c index eec39aa7f7488..b0fe27ef57da4 100644 --- a/src/backend/access/common/attmap.c +++ b/src/backend/access/common/attmap.c @@ -10,7 +10,7 @@ * columns in a different order, taking into account dropped columns. * They are also used by the tuple conversion routines in tupconvert.c. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,7 +23,6 @@ #include "postgres.h" #include "access/attmap.h" -#include "access/htup_details.h" #include "utils/builtins.h" diff --git a/src/backend/access/common/bufmask.c b/src/backend/access/common/bufmask.c index 5e392dab1e9d2..10a1e4d7c6c64 100644 --- a/src/backend/access/common/bufmask.c +++ b/src/backend/access/common/bufmask.c @@ -5,7 +5,7 @@ * in a page which can be different when the WAL is generated * and when the WAL is applied. * - * Portions Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group * * Contains common routines required for masking a page. * diff --git a/src/backend/access/common/detoast.c b/src/backend/access/common/detoast.c index 108e0126a14c7..3547cdba56eae 100644 --- a/src/backend/access/common/detoast.c +++ b/src/backend/access/common/detoast.c @@ -3,7 +3,7 @@ * detoast.c * Retrieve compressed or external variable size attributes. * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/access/common/detoast.c diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c index cb2291ee36024..9e3407bf987aa 100644 --- a/src/backend/access/common/heaptuple.c +++ b/src/backend/access/common/heaptuple.c @@ -45,7 +45,7 @@ * and we'd like to still refer to them via C struct offsets. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -60,17 +60,80 @@ #include "access/heaptoast.h" #include "access/sysattr.h" #include "access/tupdesc_details.h" -#include "executor/tuptable.h" +#include "common/hashfn.h" +#include "utils/datum.h" #include "utils/expandeddatum.h" +#include "utils/hsearch.h" +#include "utils/memutils.h" -/* Does att's datatype allow packing into the 1-byte-header varlena format? */ +/* + * Does att's datatype allow packing into the 1-byte-header varlena format? + * While functions that use TupleDescAttr() and assign attstorage = + * TYPSTORAGE_PLAIN cannot use packed varlena headers, functions that call + * TupleDescInitEntry() use typeForm->typstorage (TYPSTORAGE_EXTENDED) and + * can use packed varlena headers, e.g.: + * CREATE TABLE test(a VARCHAR(10000) STORAGE PLAIN); + * INSERT INTO test VALUES (repeat('A',10)); + * This can be verified with pageinspect. + */ #define ATT_IS_PACKABLE(att) \ ((att)->attlen == -1 && (att)->attstorage != TYPSTORAGE_PLAIN) /* Use this if it's already known varlena */ #define VARLENA_ATT_IS_PACKABLE(att) \ ((att)->attstorage != TYPSTORAGE_PLAIN) +/* + * Setup for caching pass-by-ref missing attributes in a way that survives + * tupleDesc destruction. + */ + +typedef struct +{ + int len; + Datum value; +} missing_cache_key; + +static HTAB *missing_cache = NULL; + +static uint32 +missing_hash(const void *key, Size keysize) +{ + const missing_cache_key *entry = (missing_cache_key *) key; + + return hash_bytes((const unsigned char *) entry->value, entry->len); +} + +static int +missing_match(const void *key1, const void *key2, Size keysize) +{ + const missing_cache_key *entry1 = (missing_cache_key *) key1; + const missing_cache_key *entry2 = (missing_cache_key *) key2; + + if (entry1->len != entry2->len) + return entry1->len > entry2->len ? 1 : -1; + + return memcmp(DatumGetPointer(entry1->value), + DatumGetPointer(entry2->value), + entry1->len); +} + +static void +init_missing_cache() +{ + HASHCTL hash_ctl; + + hash_ctl.keysize = sizeof(missing_cache_key); + hash_ctl.entrysize = sizeof(missing_cache_key); + hash_ctl.hcxt = TopMemoryContext; + hash_ctl.hash = missing_hash; + hash_ctl.match = missing_match; + missing_cache = + hash_create("Missing Values Cache", + 32, + &hash_ctl, + HASH_ELEM | HASH_CONTEXT | HASH_FUNCTION | HASH_COMPARE); +} /* ---------------------------------------------------------------- * misc support routines @@ -102,8 +165,41 @@ getmissingattr(TupleDesc tupleDesc, if (attrmiss->am_present) { + missing_cache_key key; + missing_cache_key *entry; + bool found; + MemoryContext oldctx; + *isnull = false; - return attrmiss->am_value; + + /* no need to cache by-value attributes */ + if (att->attbyval) + return attrmiss->am_value; + + /* set up cache if required */ + if (missing_cache == NULL) + init_missing_cache(); + + /* check if there's a cache entry */ + Assert(att->attlen > 0 || att->attlen == -1); + if (att->attlen > 0) + key.len = att->attlen; + else + key.len = VARSIZE_ANY(attrmiss->am_value); + key.value = attrmiss->am_value; + + entry = hash_search(missing_cache, &key, HASH_ENTER, &found); + + if (!found) + { + /* cache miss, so we need a non-transient copy of the datum */ + oldctx = MemoryContextSwitchTo(TopMemoryContext); + entry->value = + datumCopy(attrmiss->am_value, false, att->attlen); + MemoryContextSwitchTo(oldctx); + } + + return entry->value; } } @@ -117,8 +213,8 @@ getmissingattr(TupleDesc tupleDesc, */ Size heap_compute_data_size(TupleDesc tupleDesc, - Datum *values, - bool *isnull) + const Datum *values, + const bool *isnull) { Size data_length = 0; int i; @@ -302,7 +398,7 @@ fill_val(Form_pg_attribute att, */ void heap_fill_tuple(TupleDesc tupleDesc, - Datum *values, bool *isnull, + const Datum *values, const bool *isnull, char *data, Size data_size, uint16 *infomask, bits8 *bit) { @@ -399,8 +495,8 @@ heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc) /* ---------------- * nocachegetattr * - * This only gets called from fastgetattr() macro, in cases where - * we can't use a cacheoffset and the value is not null. + * This only gets called from fastgetattr(), in cases where we + * can't use a cacheoffset and the value is not null. * * This caches attribute offsets in the attribute descriptor. * @@ -619,8 +715,8 @@ nocachegetattr(HeapTuple tup, * * Fetch the value of a system attribute for a tuple. * - * This is a support routine for the heap_getattr macro. The macro - * has already determined that the attnum refers to a system attribute. + * This is a support routine for heap_getattr(). The function has already + * determined that the attnum refers to a system attribute. * ---------------- */ Datum @@ -1018,8 +1114,8 @@ heap_copy_tuple_as_datum(HeapTuple tuple, TupleDesc tupleDesc) */ HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, - Datum *values, - bool *isnull) + const Datum *values, + const bool *isnull) { HeapTuple tuple; /* return tuple */ HeapTupleHeader td; /* tuple data */ @@ -1112,9 +1208,9 @@ heap_form_tuple(TupleDesc tupleDescriptor, HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, - Datum *replValues, - bool *replIsnull, - bool *doReplace) + const Datum *replValues, + const bool *replIsnull, + const bool *doReplace) { int numberOfAttributes = tupleDesc->natts; int attoff; @@ -1181,9 +1277,9 @@ HeapTuple heap_modify_tuple_by_cols(HeapTuple tuple, TupleDesc tupleDesc, int nCols, - int *replCols, - Datum *replValues, - bool *replIsnull) + const int *replCols, + const Datum *replValues, + const bool *replIsnull) { int numberOfAttributes = tupleDesc->natts; Datum *values; @@ -1354,8 +1450,8 @@ heap_freetuple(HeapTuple htup) */ MinimalTuple heap_form_minimal_tuple(TupleDesc tupleDescriptor, - Datum *values, - bool *isnull) + const Datum *values, + const bool *isnull) { MinimalTuple tuple; /* return tuple */ Size len, diff --git a/src/backend/access/common/indextuple.c b/src/backend/access/common/indextuple.c index 8b178f94c172b..bb2c6a2bcc15d 100644 --- a/src/backend/access/common/indextuple.c +++ b/src/backend/access/common/indextuple.c @@ -4,7 +4,7 @@ * This file contains index tuple accessor and mutator routines, * as well as various tuple utilities. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -42,8 +42,8 @@ */ IndexTuple index_form_tuple(TupleDesc tupleDescriptor, - Datum *values, - bool *isnull) + const Datum *values, + const bool *isnull) { return index_form_tuple_context(tupleDescriptor, values, isnull, CurrentMemoryContext); @@ -63,8 +63,8 @@ index_form_tuple(TupleDesc tupleDescriptor, */ IndexTuple index_form_tuple_context(TupleDesc tupleDescriptor, - Datum *values, - bool *isnull, + const Datum *values, + const bool *isnull, MemoryContext context) { char *tp; /* tuple pointer */ @@ -79,8 +79,8 @@ index_form_tuple_context(TupleDesc tupleDescriptor, int numberOfAttributes = tupleDescriptor->natts; #ifdef TOAST_INDEX_HACK - Datum untoasted_values[INDEX_MAX_KEYS]; - bool untoasted_free[INDEX_MAX_KEYS]; + Datum untoasted_values[INDEX_MAX_KEYS] = {0}; + bool untoasted_free[INDEX_MAX_KEYS] = {0}; #endif if (numberOfAttributes > INDEX_MAX_KEYS) diff --git a/src/backend/access/common/meson.build b/src/backend/access/common/meson.build index f5ac17b49871c..14090c728fb3a 100644 --- a/src/backend/access/common/meson.build +++ b/src/backend/access/common/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'attmap.c', @@ -13,6 +13,7 @@ backend_sources += files( 'scankey.c', 'session.c', 'syncscan.c', + 'tidstore.c', 'toast_compression.c', 'toast_internals.c', 'tupconvert.c', diff --git a/src/backend/access/common/printsimple.c b/src/backend/access/common/printsimple.c index ef818228acb39..4c5eedcdc1795 100644 --- a/src/backend/access/common/printsimple.c +++ b/src/backend/access/common/printsimple.c @@ -8,7 +8,7 @@ * doesn't handle standalone backends or protocol versions other than * 3.0, because we don't need such handling for current applications. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -21,6 +21,7 @@ #include "access/printsimple.h" #include "catalog/pg_type.h" #include "libpq/pqformat.h" +#include "libpq/protocol.h" #include "utils/builtins.h" /* @@ -32,7 +33,7 @@ printsimple_startup(DestReceiver *self, int operation, TupleDesc tupdesc) StringInfoData buf; int i; - pq_beginmessage(&buf, 'T'); /* RowDescription */ + pq_beginmessage(&buf, PqMsg_RowDescription); pq_sendint16(&buf, tupdesc->natts); for (i = 0; i < tupdesc->natts; ++i) @@ -65,7 +66,7 @@ printsimple(TupleTableSlot *slot, DestReceiver *self) slot_getallattrs(slot); /* Prepare and send message */ - pq_beginmessage(&buf, 'D'); + pq_beginmessage(&buf, PqMsg_DataRow); pq_sendint16(&buf, tupdesc->natts); for (i = 0; i < tupdesc->natts; ++i) @@ -94,8 +95,7 @@ printsimple(TupleTableSlot *slot, DestReceiver *self) pq_sendcountedtext(&buf, VARDATA_ANY(t), - VARSIZE_ANY_EXHDR(t), - false); + VARSIZE_ANY_EXHDR(t)); } break; @@ -106,7 +106,7 @@ printsimple(TupleTableSlot *slot, DestReceiver *self) int len; len = pg_ltoa(num, str); - pq_sendcountedtext(&buf, str, len, false); + pq_sendcountedtext(&buf, str, len); } break; @@ -117,7 +117,7 @@ printsimple(TupleTableSlot *slot, DestReceiver *self) int len; len = pg_lltoa(num, str); - pq_sendcountedtext(&buf, str, len, false); + pq_sendcountedtext(&buf, str, len); } break; @@ -128,7 +128,7 @@ printsimple(TupleTableSlot *slot, DestReceiver *self) int len; len = pg_ultoa_n(num, str); - pq_sendcountedtext(&buf, str, len, false); + pq_sendcountedtext(&buf, str, len); } break; diff --git a/src/backend/access/common/printtup.c b/src/backend/access/common/printtup.c index 72faeb5dfa3f0..c78cc3930873a 100644 --- a/src/backend/access/common/printtup.c +++ b/src/backend/access/common/printtup.c @@ -5,7 +5,7 @@ * clients and standalone backends are supported here). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -16,8 +16,8 @@ #include "postgres.h" #include "access/printtup.h" -#include "libpq/libpq.h" #include "libpq/pqformat.h" +#include "libpq/protocol.h" #include "tcop/pquery.h" #include "utils/lsyscache.h" #include "utils/memdebug.h" @@ -171,7 +171,7 @@ SendRowDescriptionMessage(StringInfo buf, TupleDesc typeinfo, ListCell *tlist_item = list_head(targetlist); /* tuple descriptor message type */ - pq_beginmessage_reuse(buf, 'T'); + pq_beginmessage_reuse(buf, PqMsg_RowDescription); /* # of attrs in tuples */ pq_sendint16(buf, natts); @@ -295,6 +295,9 @@ printtup_prepare_info(DR_printtup *myState, TupleDesc typeinfo, int numAttrs) /* ---------------- * printtup --- send a tuple to the client + * + * Note: if you change this function, see also serializeAnalyzeReceive + * in explain.c, which is meant to replicate the computations done here. * ---------------- */ static bool @@ -318,9 +321,9 @@ printtup(TupleTableSlot *slot, DestReceiver *self) oldcontext = MemoryContextSwitchTo(myState->tmpcontext); /* - * Prepare a DataRow message (note buffer is in per-row context) + * Prepare a DataRow message (note buffer is in per-query context) */ - pq_beginmessage_reuse(buf, 'D'); + pq_beginmessage_reuse(buf, PqMsg_DataRow); pq_sendint16(buf, natts); @@ -355,7 +358,7 @@ printtup(TupleTableSlot *slot, DestReceiver *self) char *outputstr; outputstr = OutputFunctionCall(&thisState->finfo, attr); - pq_sendcountedtext(buf, outputstr, strlen(outputstr), false); + pq_sendcountedtext(buf, outputstr, strlen(outputstr)); } else { diff --git a/src/backend/access/common/relation.c b/src/backend/access/common/relation.c index 4017e175e3d96..d8a313a2c906f 100644 --- a/src/backend/access/common/relation.c +++ b/src/backend/access/common/relation.c @@ -3,7 +3,7 @@ * relation.c * Generic relation related routines. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,7 +23,6 @@ #include "access/relation.h" #include "access/xact.h" #include "catalog/namespace.h" -#include "miscadmin.h" #include "pgstat.h" #include "storage/lmgr.h" #include "utils/inval.h" diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 11cc43167769b..d6eb5d8559939 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -3,7 +3,7 @@ * reloptions.c * Core support for relation options (pg_class.reloptions) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -27,9 +27,7 @@ #include "catalog/pg_type.h" #include "commands/defrem.h" #include "commands/tablespace.h" -#include "commands/view.h" #include "nodes/makefuncs.h" -#include "postmaster/postmaster.h" #include "utils/array.h" #include "utils/attoptcache.h" #include "utils/builtins.h" @@ -42,9 +40,9 @@ * * To add an option: * - * (i) decide on a type (integer, real, bool, string), name, default value, - * upper and lower bounds (if applicable); for strings, consider a validation - * routine. + * (i) decide on a type (bool, integer, real, enum, string), name, default + * value, upper and lower bounds (if applicable); for strings, consider a + * validation routine. * (ii) add a record below (or use add__reloption). * (iii) add it to the appropriate options struct (perhaps StdRdOptions) * (iv) add it to the appropriate handling routine (perhaps @@ -68,24 +66,24 @@ * since they are only used by the AV procs and don't change anything * currently executing. * - * Fillfactor can be set because it applies only to subsequent changes made to - * data blocks, as documented in hio.c + * Fillfactor can be set at ShareUpdateExclusiveLock because it applies only to + * subsequent changes made to data blocks, as documented in hio.c * * n_distinct options can be set at ShareUpdateExclusiveLock because they * are only used during ANALYZE, which uses a ShareUpdateExclusiveLock, * so the ANALYZE will not be affected by in-flight changes. Changing those * values has no effect until the next ANALYZE, so no need for stronger lock. * - * Planner-related parameters can be set with ShareUpdateExclusiveLock because + * Planner-related parameters can be set at ShareUpdateExclusiveLock because * they only affect planning and not the correctness of the execution. Plans * cannot be changed in mid-flight, so changes here could not easily result in * new improved plans in any case. So we allow existing queries to continue * and existing plans to survive, a small price to pay for allowing better * plans to be introduced concurrently without interfering with users. * - * Setting parallel_workers is safe, since it acts the same as - * max_parallel_workers_per_gather which is a USERSET parameter that doesn't - * affect existing plans or queries. + * Setting parallel_workers at ShareUpdateExclusiveLock is safe, since it acts + * the same as max_parallel_workers_per_gather which is a USERSET parameter + * that doesn't affect existing plans or queries. * * vacuum_truncate can be set at ShareUpdateExclusiveLock because it * is only used during VACUUM, which uses a ShareUpdateExclusiveLock, @@ -1989,7 +1987,7 @@ partitioned_table_reloptions(Datum reloptions, bool validate) ereport(ERROR, errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot specify storage parameters for a partitioned table"), - errhint("Specify storage parameters for its leaf partitions, instead.")); + errhint("Specify storage parameters for its leaf partitions instead.")); return NULL; } diff --git a/src/backend/access/common/scankey.c b/src/backend/access/common/scankey.c index 6b470d6f4e091..704363af3f54d 100644 --- a/src/backend/access/common/scankey.c +++ b/src/backend/access/common/scankey.c @@ -3,7 +3,7 @@ * scankey.c * scan key support code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/access/common/session.c b/src/backend/access/common/session.c index 964100a683e10..3f2256f491525 100644 --- a/src/backend/access/common/session.c +++ b/src/backend/access/common/session.c @@ -12,7 +12,7 @@ * Currently this infrastructure is used to share: * - typemod registry for ephemeral row-types, i.e. BlessTupleDesc etc. * - * Portions Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2017-2024, PostgreSQL Global Development Group * * src/backend/access/common/session.c * diff --git a/src/backend/access/common/syncscan.c b/src/backend/access/common/syncscan.c index 2bc68288831c4..8d78d28a6fced 100644 --- a/src/backend/access/common/syncscan.c +++ b/src/backend/access/common/syncscan.c @@ -36,7 +36,7 @@ * ss_report_location - update current scan location * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/access/common/tidstore.c b/src/backend/access/common/tidstore.c new file mode 100644 index 0000000000000..fb3949d69f69f --- /dev/null +++ b/src/backend/access/common/tidstore.c @@ -0,0 +1,622 @@ +/*------------------------------------------------------------------------- + * + * tidstore.c + * TID (ItemPointerData) storage implementation. + * + * TidStore is a in-memory data structure to store TIDs (ItemPointerData). + * Internally it uses a radix tree as the storage for TIDs. The key is the + * BlockNumber and the value is a bitmap of offsets, BlocktableEntry. + * + * TidStore can be shared among parallel worker processes by using + * TidStoreCreateShared(). Other backends can attach to the shared TidStore + * by TidStoreAttach(). + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/backend/access/common/tidstore.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/tidstore.h" +#include "miscadmin.h" +#include "nodes/bitmapset.h" +#include "storage/lwlock.h" +#include "utils/dsa.h" + + +#define WORDNUM(x) ((x) / BITS_PER_BITMAPWORD) +#define BITNUM(x) ((x) % BITS_PER_BITMAPWORD) + +/* number of active words for a page: */ +#define WORDS_PER_PAGE(n) ((n) / BITS_PER_BITMAPWORD + 1) + +/* number of offsets we can store in the header of a BlocktableEntry */ +#define NUM_FULL_OFFSETS ((sizeof(uintptr_t) - sizeof(uint8) - sizeof(int8)) / sizeof(OffsetNumber)) + +/* + * This is named similarly to PagetableEntry in tidbitmap.c + * because the two have a similar function. + */ +typedef struct BlocktableEntry +{ + struct + { +#ifndef WORDS_BIGENDIAN + /* + * We need to position this member to reserve space for the backing + * radix tree to tag the lowest bit when struct 'header' is stored + * inside a pointer or DSA pointer. + */ + uint8 flags; + + int8 nwords; +#endif + + /* + * We can store a small number of offsets here to avoid wasting space + * with a sparse bitmap. + */ + OffsetNumber full_offsets[NUM_FULL_OFFSETS]; + +#ifdef WORDS_BIGENDIAN + int8 nwords; + uint8 flags; +#endif + } header; + + /* + * We don't expect any padding space here, but to be cautious, code + * creating new entries should zero out space up to 'words'. + */ + + bitmapword words[FLEXIBLE_ARRAY_MEMBER]; +} BlocktableEntry; + +/* + * The type of 'nwords' limits the max number of words in the 'words' array. + * This computes the max offset we can actually store in the bitmap. In + * practice, it's almost always the same as MaxOffsetNumber. + */ +#define MAX_OFFSET_IN_BITMAP Min(BITS_PER_BITMAPWORD * PG_INT8_MAX - 1, MaxOffsetNumber) + +#define MaxBlocktableEntrySize \ + offsetof(BlocktableEntry, words) + \ + (sizeof(bitmapword) * WORDS_PER_PAGE(MAX_OFFSET_IN_BITMAP)) + +#define RT_PREFIX local_ts +#define RT_SCOPE static +#define RT_DECLARE +#define RT_DEFINE +#define RT_VALUE_TYPE BlocktableEntry +#define RT_VARLEN_VALUE_SIZE(page) \ + (offsetof(BlocktableEntry, words) + \ + sizeof(bitmapword) * (page)->header.nwords) +#define RT_RUNTIME_EMBEDDABLE_VALUE +#include "lib/radixtree.h" + +#define RT_PREFIX shared_ts +#define RT_SHMEM +#define RT_SCOPE static +#define RT_DECLARE +#define RT_DEFINE +#define RT_VALUE_TYPE BlocktableEntry +#define RT_VARLEN_VALUE_SIZE(page) \ + (offsetof(BlocktableEntry, words) + \ + sizeof(bitmapword) * (page)->header.nwords) +#define RT_RUNTIME_EMBEDDABLE_VALUE +#include "lib/radixtree.h" + +/* Per-backend state for a TidStore */ +struct TidStore +{ + /* MemoryContext where the TidStore is allocated */ + MemoryContext context; + + /* MemoryContext that the radix tree uses */ + MemoryContext rt_context; + + /* Storage for TIDs. Use either one depending on TidStoreIsShared() */ + union + { + local_ts_radix_tree *local; + shared_ts_radix_tree *shared; + } tree; + + /* DSA area for TidStore if using shared memory */ + dsa_area *area; +}; +#define TidStoreIsShared(ts) ((ts)->area != NULL) + +/* Iterator for TidStore */ +struct TidStoreIter +{ + TidStore *ts; + + /* iterator of radix tree. Use either one depending on TidStoreIsShared() */ + union + { + shared_ts_iter *shared; + local_ts_iter *local; + } tree_iter; + + /* output for the caller */ + TidStoreIterResult output; +}; + +static void tidstore_iter_extract_tids(TidStoreIter *iter, BlockNumber blkno, + BlocktableEntry *page); + +/* + * Create a TidStore. The TidStore will live in the memory context that is + * CurrentMemoryContext at the time of this call. The TID storage, backed + * by a radix tree, will live in its child memory context, rt_context. + * + * "max_bytes" is not an internally-enforced limit; it is used only as a + * hint to cap the memory block size of the memory context for TID storage. + * This reduces space wastage due to over-allocation. If the caller wants to + * monitor memory usage, it must compare its limit with the value reported + * by TidStoreMemoryUsage(). + */ +TidStore * +TidStoreCreateLocal(size_t max_bytes, bool insert_only) +{ + TidStore *ts; + size_t initBlockSize = ALLOCSET_DEFAULT_INITSIZE; + size_t minContextSize = ALLOCSET_DEFAULT_MINSIZE; + size_t maxBlockSize = ALLOCSET_DEFAULT_MAXSIZE; + + ts = palloc0(sizeof(TidStore)); + ts->context = CurrentMemoryContext; + + /* choose the maxBlockSize to be no larger than 1/16 of max_bytes */ + while (16 * maxBlockSize > max_bytes) + maxBlockSize >>= 1; + + if (maxBlockSize < ALLOCSET_DEFAULT_INITSIZE) + maxBlockSize = ALLOCSET_DEFAULT_INITSIZE; + + /* Create a memory context for the TID storage */ + if (insert_only) + { + ts->rt_context = BumpContextCreate(CurrentMemoryContext, + "TID storage", + minContextSize, + initBlockSize, + maxBlockSize); + } + else + { + ts->rt_context = AllocSetContextCreate(CurrentMemoryContext, + "TID storage", + minContextSize, + initBlockSize, + maxBlockSize); + } + + ts->tree.local = local_ts_create(ts->rt_context); + + return ts; +} + +/* + * Similar to TidStoreCreateLocal() but create a shared TidStore on a + * DSA area. The TID storage will live in the DSA area, and the memory + * context rt_context will have only meta data of the radix tree. + * + * The returned object is allocated in backend-local memory. + */ +TidStore * +TidStoreCreateShared(size_t max_bytes, int tranche_id) +{ + TidStore *ts; + dsa_area *area; + size_t dsa_init_size = DSA_DEFAULT_INIT_SEGMENT_SIZE; + size_t dsa_max_size = DSA_MAX_SEGMENT_SIZE; + + ts = palloc0(sizeof(TidStore)); + ts->context = CurrentMemoryContext; + + ts->rt_context = AllocSetContextCreate(CurrentMemoryContext, + "TID storage meta data", + ALLOCSET_SMALL_SIZES); + + /* + * Choose the initial and maximum DSA segment sizes to be no longer than + * 1/8 of max_bytes. + */ + while (8 * dsa_max_size > max_bytes) + dsa_max_size >>= 1; + + if (dsa_max_size < DSA_MIN_SEGMENT_SIZE) + dsa_max_size = DSA_MIN_SEGMENT_SIZE; + + if (dsa_init_size > dsa_max_size) + dsa_init_size = dsa_max_size; + + area = dsa_create_ext(tranche_id, dsa_init_size, dsa_max_size); + ts->tree.shared = shared_ts_create(ts->rt_context, area, + tranche_id); + ts->area = area; + + return ts; +} + +/* + * Attach to the shared TidStore. 'area_handle' is the DSA handle where + * the TidStore is created. 'handle' is the dsa_pointer returned by + * TidStoreGetHandle(). The returned object is allocated in backend-local + * memory using the CurrentMemoryContext. + */ +TidStore * +TidStoreAttach(dsa_handle area_handle, dsa_pointer handle) +{ + TidStore *ts; + dsa_area *area; + + Assert(area_handle != DSA_HANDLE_INVALID); + Assert(DsaPointerIsValid(handle)); + + /* create per-backend state */ + ts = palloc0(sizeof(TidStore)); + + area = dsa_attach(area_handle); + + /* Find the shared the shared radix tree */ + ts->tree.shared = shared_ts_attach(area, handle); + ts->area = area; + + return ts; +} + +/* + * Detach from a TidStore. This also detaches from radix tree and frees + * the backend-local resources. + */ +void +TidStoreDetach(TidStore *ts) +{ + Assert(TidStoreIsShared(ts)); + + shared_ts_detach(ts->tree.shared); + dsa_detach(ts->area); + + pfree(ts); +} + +/* + * Lock support functions. + * + * We can use the radix tree's lock for shared TidStore as the data we + * need to protect is only the shared radix tree. + */ + +void +TidStoreLockExclusive(TidStore *ts) +{ + if (TidStoreIsShared(ts)) + shared_ts_lock_exclusive(ts->tree.shared); +} + +void +TidStoreLockShare(TidStore *ts) +{ + if (TidStoreIsShared(ts)) + shared_ts_lock_share(ts->tree.shared); +} + +void +TidStoreUnlock(TidStore *ts) +{ + if (TidStoreIsShared(ts)) + shared_ts_unlock(ts->tree.shared); +} + +/* + * Destroy a TidStore, returning all memory. + * + * Note that the caller must be certain that no other backend will attempt to + * access the TidStore before calling this function. Other backend must + * explicitly call TidStoreDetach() to free up backend-local memory associated + * with the TidStore. The backend that calls TidStoreDestroy() must not call + * TidStoreDetach(). + */ +void +TidStoreDestroy(TidStore *ts) +{ + /* Destroy underlying radix tree */ + if (TidStoreIsShared(ts)) + { + shared_ts_free(ts->tree.shared); + + dsa_detach(ts->area); + } + else + local_ts_free(ts->tree.local); + + MemoryContextDelete(ts->rt_context); + + pfree(ts); +} + +/* + * Create or replace an entry for the given block and array of offsets. + * + * NB: This function is designed and optimized for vacuum's heap scanning + * phase, so has some limitations: + * + * - The offset numbers "offsets" must be sorted in ascending order. + * - If the block number already exists, the entry will be replaced -- + * there is no way to add or remove offsets from an entry. + */ +void +TidStoreSetBlockOffsets(TidStore *ts, BlockNumber blkno, OffsetNumber *offsets, + int num_offsets) +{ + union + { + char data[MaxBlocktableEntrySize]; + BlocktableEntry force_align_entry; + } data; + BlocktableEntry *page = (BlocktableEntry *) data.data; + bitmapword word; + int wordnum; + int next_word_threshold; + int idx = 0; + + Assert(num_offsets > 0); + + /* Check if the given offset numbers are ordered */ + for (int i = 1; i < num_offsets; i++) + Assert(offsets[i] > offsets[i - 1]); + + memset(page, 0, offsetof(BlocktableEntry, words)); + + if (num_offsets <= NUM_FULL_OFFSETS) + { + for (int i = 0; i < num_offsets; i++) + { + OffsetNumber off = offsets[i]; + + /* safety check to ensure we don't overrun bit array bounds */ + if (off == InvalidOffsetNumber || off > MAX_OFFSET_IN_BITMAP) + elog(ERROR, "tuple offset out of range: %u", off); + + page->header.full_offsets[i] = off; + } + + page->header.nwords = 0; + } + else + { + for (wordnum = 0, next_word_threshold = BITS_PER_BITMAPWORD; + wordnum <= WORDNUM(offsets[num_offsets - 1]); + wordnum++, next_word_threshold += BITS_PER_BITMAPWORD) + { + word = 0; + + while (idx < num_offsets) + { + OffsetNumber off = offsets[idx]; + + /* safety check to ensure we don't overrun bit array bounds */ + if (off == InvalidOffsetNumber || off > MAX_OFFSET_IN_BITMAP) + elog(ERROR, "tuple offset out of range: %u", off); + + if (off >= next_word_threshold) + break; + + word |= ((bitmapword) 1 << BITNUM(off)); + idx++; + } + + /* write out offset bitmap for this wordnum */ + page->words[wordnum] = word; + } + + page->header.nwords = wordnum; + Assert(page->header.nwords == WORDS_PER_PAGE(offsets[num_offsets - 1])); + } + + if (TidStoreIsShared(ts)) + shared_ts_set(ts->tree.shared, blkno, page); + else + local_ts_set(ts->tree.local, blkno, page); +} + +/* Return true if the given TID is present in the TidStore */ +bool +TidStoreIsMember(TidStore *ts, ItemPointer tid) +{ + int wordnum; + int bitnum; + BlocktableEntry *page; + BlockNumber blk = ItemPointerGetBlockNumber(tid); + OffsetNumber off = ItemPointerGetOffsetNumber(tid); + + if (TidStoreIsShared(ts)) + page = shared_ts_find(ts->tree.shared, blk); + else + page = local_ts_find(ts->tree.local, blk); + + /* no entry for the blk */ + if (page == NULL) + return false; + + if (page->header.nwords == 0) + { + /* we have offsets in the header */ + for (int i = 0; i < NUM_FULL_OFFSETS; i++) + { + if (page->header.full_offsets[i] == off) + return true; + } + return false; + } + else + { + wordnum = WORDNUM(off); + bitnum = BITNUM(off); + + /* no bitmap for the off */ + if (wordnum >= page->header.nwords) + return false; + + return (page->words[wordnum] & ((bitmapword) 1 << bitnum)) != 0; + } +} + +/* + * Prepare to iterate through a TidStore. + * + * The TidStoreIter struct is created in the caller's memory context, and it + * will be freed in TidStoreEndIterate. + * + * The caller is responsible for locking TidStore until the iteration is + * finished. + */ +TidStoreIter * +TidStoreBeginIterate(TidStore *ts) +{ + TidStoreIter *iter; + + iter = palloc0(sizeof(TidStoreIter)); + iter->ts = ts; + + /* + * We start with an array large enough to contain at least the offsets + * from one completely full bitmap element. + */ + iter->output.max_offset = 2 * BITS_PER_BITMAPWORD; + iter->output.offsets = palloc(sizeof(OffsetNumber) * iter->output.max_offset); + + if (TidStoreIsShared(ts)) + iter->tree_iter.shared = shared_ts_begin_iterate(ts->tree.shared); + else + iter->tree_iter.local = local_ts_begin_iterate(ts->tree.local); + + return iter; +} + + +/* + * Scan the TidStore and return the TIDs of the next block. The offsets in + * each iteration result are ordered, as are the block numbers over all + * iterations. + */ +TidStoreIterResult * +TidStoreIterateNext(TidStoreIter *iter) +{ + uint64 key; + BlocktableEntry *page; + + if (TidStoreIsShared(iter->ts)) + page = shared_ts_iterate_next(iter->tree_iter.shared, &key); + else + page = local_ts_iterate_next(iter->tree_iter.local, &key); + + if (page == NULL) + return NULL; + + /* Collect TIDs from the key-value pair */ + tidstore_iter_extract_tids(iter, (BlockNumber) key, page); + + return &(iter->output); +} + +/* + * Finish the iteration on TidStore. + * + * The caller is responsible for releasing any locks. + */ +void +TidStoreEndIterate(TidStoreIter *iter) +{ + if (TidStoreIsShared(iter->ts)) + shared_ts_end_iterate(iter->tree_iter.shared); + else + local_ts_end_iterate(iter->tree_iter.local); + + pfree(iter->output.offsets); + pfree(iter); +} + +/* + * Return the memory usage of TidStore. + */ +size_t +TidStoreMemoryUsage(TidStore *ts) +{ + if (TidStoreIsShared(ts)) + return shared_ts_memory_usage(ts->tree.shared); + else + return local_ts_memory_usage(ts->tree.local); +} + +/* + * Return the DSA area where the TidStore lives. + */ +dsa_area * +TidStoreGetDSA(TidStore *ts) +{ + Assert(TidStoreIsShared(ts)); + + return ts->area; +} + +dsa_pointer +TidStoreGetHandle(TidStore *ts) +{ + Assert(TidStoreIsShared(ts)); + + return (dsa_pointer) shared_ts_get_handle(ts->tree.shared); +} + +/* Extract TIDs from the given key-value pair */ +static void +tidstore_iter_extract_tids(TidStoreIter *iter, BlockNumber blkno, + BlocktableEntry *page) +{ + TidStoreIterResult *result = (&iter->output); + int wordnum; + + result->num_offsets = 0; + result->blkno = blkno; + + if (page->header.nwords == 0) + { + /* we have offsets in the header */ + for (int i = 0; i < NUM_FULL_OFFSETS; i++) + { + if (page->header.full_offsets[i] != InvalidOffsetNumber) + result->offsets[result->num_offsets++] = page->header.full_offsets[i]; + } + } + else + { + for (wordnum = 0; wordnum < page->header.nwords; wordnum++) + { + bitmapword w = page->words[wordnum]; + int off = wordnum * BITS_PER_BITMAPWORD; + + /* Make sure there is enough space to add offsets */ + if ((result->num_offsets + BITS_PER_BITMAPWORD) > result->max_offset) + { + result->max_offset *= 2; + result->offsets = repalloc(result->offsets, + sizeof(OffsetNumber) * result->max_offset); + } + + while (w != 0) + { + if (w & 1) + result->offsets[result->num_offsets++] = (OffsetNumber) off; + off++; + w >>= 1; + } + } + } +} diff --git a/src/backend/access/common/toast_compression.c b/src/backend/access/common/toast_compression.c index 4cf956a759c3e..52230f31c6821 100644 --- a/src/backend/access/common/toast_compression.c +++ b/src/backend/access/common/toast_compression.c @@ -3,7 +3,7 @@ * toast_compression.c * Functions for toast compression. * - * Copyright (c) 2021-2023, PostgreSQL Global Development Group + * Copyright (c) 2021-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -20,8 +20,6 @@ #include "access/detoast.h" #include "access/toast_compression.h" #include "common/pg_lzcompress.h" -#include "fmgr.h" -#include "utils/builtins.h" #include "varatt.h" /* GUC */ diff --git a/src/backend/access/common/toast_internals.c b/src/backend/access/common/toast_internals.c index 588825ed85dd8..90d0654e6298b 100644 --- a/src/backend/access/common/toast_internals.c +++ b/src/backend/access/common/toast_internals.c @@ -3,7 +3,7 @@ * toast_internals.c * Functions for internal use by the TOAST system. * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/access/common/toast_internals.c @@ -21,7 +21,6 @@ #include "access/toast_internals.h" #include "access/xact.h" #include "catalog/catalog.h" -#include "common/pg_lzcompress.h" #include "miscadmin.h" #include "utils/fmgroids.h" #include "utils/rel.h" @@ -636,8 +635,7 @@ toast_close_indexes(Relation *toastidxs, int num_indexes, LOCKMODE lock) * * Initialize an appropriate TOAST snapshot. We must use an MVCC snapshot * to initialize the TOAST snapshot; since we don't know which one to use, - * just use the oldest one. This is safe: at worst, we will get a "snapshot - * too old" error that might have been avoided otherwise. + * just use the oldest one. */ void init_toast_snapshot(Snapshot toast_snapshot) diff --git a/src/backend/access/common/tupconvert.c b/src/backend/access/common/tupconvert.c index d303fe010a2da..4d596c4bef60a 100644 --- a/src/backend/access/common/tupconvert.c +++ b/src/backend/access/common/tupconvert.c @@ -7,7 +7,7 @@ * equivalent but might have columns in a different order or different sets of * dropped columns. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/access/common/tupdesc.c b/src/backend/access/common/tupdesc.c index 7c5c390503b44..47379fef220b7 100644 --- a/src/backend/access/common/tupdesc.c +++ b/src/backend/access/common/tupdesc.c @@ -3,7 +3,7 @@ * tupdesc.c * POSTGRES tuple descriptor support code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,14 +25,36 @@ #include "catalog/pg_collation.h" #include "catalog/pg_type.h" #include "common/hashfn.h" -#include "miscadmin.h" -#include "parser/parse_type.h" -#include "utils/acl.h" #include "utils/builtins.h" #include "utils/datum.h" -#include "utils/resowner_private.h" +#include "utils/resowner.h" #include "utils/syscache.h" +/* ResourceOwner callbacks to hold tupledesc references */ +static void ResOwnerReleaseTupleDesc(Datum res); +static char *ResOwnerPrintTupleDesc(Datum res); + +static const ResourceOwnerDesc tupdesc_resowner_desc = +{ + .name = "tupdesc reference", + .release_phase = RESOURCE_RELEASE_AFTER_LOCKS, + .release_priority = RELEASE_PRIO_TUPDESC_REFS, + .ReleaseResource = ResOwnerReleaseTupleDesc, + .DebugPrint = ResOwnerPrintTupleDesc +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberTupleDesc(ResourceOwner owner, TupleDesc tupdesc) +{ + ResourceOwnerRemember(owner, PointerGetDatum(tupdesc), &tupdesc_resowner_desc); +} + +static inline void +ResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc) +{ + ResourceOwnerForget(owner, PointerGetDatum(tupdesc), &tupdesc_resowner_desc); +} /* * CreateTemplateTupleDesc @@ -367,7 +389,7 @@ IncrTupleDescRefCount(TupleDesc tupdesc) { Assert(tupdesc->tdrefcount >= 0); - ResourceOwnerEnlargeTupleDescs(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); tupdesc->tdrefcount++; ResourceOwnerRememberTupleDesc(CurrentResourceOwner, tupdesc); } @@ -392,11 +414,6 @@ DecrTupleDescRefCount(TupleDesc tupdesc) /* * Compare two TupleDesc structures for logical equality - * - * Note: we deliberately do not check the attrelid and tdtypmod fields. - * This allows typcache.c to use this routine to see if a cached record type - * matches a requested type, and is harmless for relcache.c's uses. - * We don't compare tdrefcount, either. */ bool equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2) @@ -409,6 +426,8 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2) if (tupdesc1->tdtypeid != tupdesc2->tdtypeid) return false; + /* tdtypmod and tdrefcount are not checked */ + for (i = 0; i < tupdesc1->natts; i++) { Form_pg_attribute attr1 = TupleDescAttr(tupdesc1, i); @@ -431,8 +450,6 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2) return false; if (attr1->atttypid != attr2->atttypid) return false; - if (attr1->attstattarget != attr2->attstattarget) - return false; if (attr1->attlen != attr2->attlen) return false; if (attr1->attndims != attr2->attndims) @@ -541,17 +558,68 @@ equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2) } /* - * hashTupleDesc - * Compute a hash value for a tuple descriptor. + * equalRowTypes * - * If two tuple descriptors would be considered equal by equalTupleDescs() - * then their hash value will be equal according to this function. + * This determines whether two tuple descriptors have equal row types. This + * only checks those fields in pg_attribute that are applicable for row types, + * while ignoring those fields that define the physical row storage or those + * that define table column metadata. + * + * Specifically, this checks: + * + * - same number of attributes + * - same composite type ID (but could both be zero) + * - corresponding attributes (in order) have same the name, type, typmod, + * collation + * + * This is used to check whether two record types are compatible, whether + * function return row types are the same, and other similar situations. + * + * (XXX There was some discussion whether attndims should be checked here, but + * for now it has been decided not to.) * - * Note that currently contents of constraint are not hashed - it'd be a bit - * painful to do so, and conflicts just due to constraints are unlikely. + * Note: We deliberately do not check the tdtypmod field. This allows + * typcache.c to use this routine to see if a cached record type matches a + * requested type. + */ +bool +equalRowTypes(TupleDesc tupdesc1, TupleDesc tupdesc2) +{ + if (tupdesc1->natts != tupdesc2->natts) + return false; + if (tupdesc1->tdtypeid != tupdesc2->tdtypeid) + return false; + + for (int i = 0; i < tupdesc1->natts; i++) + { + Form_pg_attribute attr1 = TupleDescAttr(tupdesc1, i); + Form_pg_attribute attr2 = TupleDescAttr(tupdesc2, i); + + if (strcmp(NameStr(attr1->attname), NameStr(attr2->attname)) != 0) + return false; + if (attr1->atttypid != attr2->atttypid) + return false; + if (attr1->atttypmod != attr2->atttypmod) + return false; + if (attr1->attcollation != attr2->attcollation) + return false; + + /* Record types derived from tables could have dropped fields. */ + if (attr1->attisdropped != attr2->attisdropped) + return false; + } + + return true; +} + +/* + * hashRowType + * + * If two tuple descriptors would be considered equal by equalRowTypes() + * then their hash value will be equal according to this function. */ uint32 -hashTupleDesc(TupleDesc desc) +hashRowType(TupleDesc desc) { uint32 s; int i; @@ -617,7 +685,6 @@ TupleDescInitEntry(TupleDesc desc, else if (attributeName != NameStr(att->attname)) namestrcpy(&(att->attname), attributeName); - att->attstattarget = -1; att->attcacheoff = -1; att->atttypmod = typmod; @@ -680,7 +747,6 @@ TupleDescInitBuiltinEntry(TupleDesc desc, Assert(attributeName != NULL); namestrcpy(&(att->attname), attributeName); - att->attstattarget = -1; att->attcacheoff = -1; att->atttypmod = typmod; @@ -778,107 +844,6 @@ TupleDescInitEntryCollation(TupleDesc desc, TupleDescAttr(desc, attributeNumber - 1)->attcollation = collationid; } - -/* - * BuildDescForRelation - * - * Given a relation schema (list of ColumnDef nodes), build a TupleDesc. - * - * Note: tdtypeid will need to be filled in later on. - */ -TupleDesc -BuildDescForRelation(List *schema) -{ - int natts; - AttrNumber attnum; - ListCell *l; - TupleDesc desc; - bool has_not_null; - char *attname; - Oid atttypid; - int32 atttypmod; - Oid attcollation; - int attdim; - - /* - * allocate a new tuple descriptor - */ - natts = list_length(schema); - desc = CreateTemplateTupleDesc(natts); - has_not_null = false; - - attnum = 0; - - foreach(l, schema) - { - ColumnDef *entry = lfirst(l); - AclResult aclresult; - Form_pg_attribute att; - - /* - * for each entry in the list, get the name and type information from - * the list and have TupleDescInitEntry fill in the attribute - * information we need. - */ - attnum++; - - attname = entry->colname; - typenameTypeIdAndMod(NULL, entry->typeName, &atttypid, &atttypmod); - - aclresult = object_aclcheck(TypeRelationId, atttypid, GetUserId(), ACL_USAGE); - if (aclresult != ACLCHECK_OK) - aclcheck_error_type(aclresult, atttypid); - - attcollation = GetColumnDefCollation(NULL, entry, atttypid); - attdim = list_length(entry->typeName->arrayBounds); - if (attdim > PG_INT16_MAX) - ereport(ERROR, - errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("too many array dimensions")); - - if (entry->typeName->setof) - ereport(ERROR, - (errcode(ERRCODE_INVALID_TABLE_DEFINITION), - errmsg("column \"%s\" cannot be declared SETOF", - attname))); - - TupleDescInitEntry(desc, attnum, attname, - atttypid, atttypmod, attdim); - att = TupleDescAttr(desc, attnum - 1); - - /* Override TupleDescInitEntry's settings as requested */ - TupleDescInitEntryCollation(desc, attnum, attcollation); - if (entry->storage) - att->attstorage = entry->storage; - - /* Fill in additional stuff not handled by TupleDescInitEntry */ - att->attnotnull = entry->is_not_null; - has_not_null |= entry->is_not_null; - att->attislocal = entry->is_local; - att->attinhcount = entry->inhcount; - } - - if (has_not_null) - { - TupleConstr *constr = (TupleConstr *) palloc0(sizeof(TupleConstr)); - - constr->has_not_null = true; - constr->has_generated_stored = false; - constr->defval = NULL; - constr->missing = NULL; - constr->num_defval = 0; - constr->check = NULL; - constr->num_check = 0; - desc->constr = constr; - } - else - { - desc->constr = NULL; - } - - return desc; -} - /* * BuildDescFromLists * @@ -887,11 +852,10 @@ BuildDescForRelation(List *schema) * * No constraints are generated. * - * This is essentially a cut-down version of BuildDescForRelation for use - * with functions returning RECORD. + * This is for use with functions returning RECORD. */ TupleDesc -BuildDescFromLists(List *names, List *types, List *typmods, List *collations) +BuildDescFromLists(const List *names, const List *types, const List *typmods, const List *collations) { int natts; AttrNumber attnum; @@ -927,3 +891,50 @@ BuildDescFromLists(List *names, List *types, List *typmods, List *collations) return desc; } + +/* + * Get default expression (or NULL if none) for the given attribute number. + */ +Node * +TupleDescGetDefault(TupleDesc tupdesc, AttrNumber attnum) +{ + Node *result = NULL; + + if (tupdesc->constr) + { + AttrDefault *attrdef = tupdesc->constr->defval; + + for (int i = 0; i < tupdesc->constr->num_defval; i++) + { + if (attrdef[i].adnum == attnum) + { + result = stringToNode(attrdef[i].adbin); + break; + } + } + } + + return result; +} + +/* ResourceOwner callbacks */ + +static void +ResOwnerReleaseTupleDesc(Datum res) +{ + TupleDesc tupdesc = (TupleDesc) DatumGetPointer(res); + + /* Like DecrTupleDescRefCount, but don't call ResourceOwnerForget() */ + Assert(tupdesc->tdrefcount > 0); + if (--tupdesc->tdrefcount == 0) + FreeTupleDesc(tupdesc); +} + +static char * +ResOwnerPrintTupleDesc(Datum res) +{ + TupleDesc tupdesc = (TupleDesc) DatumGetPointer(res); + + return psprintf("TupleDesc %p (%u,%d)", + tupdesc, tupdesc->tdtypeid, tupdesc->tdtypmod); +} diff --git a/src/backend/access/gin/ginarrayproc.c b/src/backend/access/gin/ginarrayproc.c index e9b7813e7821f..2373e76f77e4f 100644 --- a/src/backend/access/gin/ginarrayproc.c +++ b/src/backend/access/gin/ginarrayproc.c @@ -4,7 +4,7 @@ * support functions for GIN's indexing of any array * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -16,7 +16,7 @@ #include "access/gin.h" #include "access/stratnum.h" #include "utils/array.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/lsyscache.h" diff --git a/src/backend/access/gin/ginbtree.c b/src/backend/access/gin/ginbtree.c index 35490c7283218..b7a5013896adb 100644 --- a/src/backend/access/gin/ginbtree.c +++ b/src/backend/access/gin/ginbtree.c @@ -4,7 +4,7 @@ * page utilities routines for the postgres inverted index access method. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -19,6 +19,7 @@ #include "access/xloginsert.h" #include "miscadmin.h" #include "storage/predicate.h" +#include "utils/injection_point.h" #include "utils/memutils.h" #include "utils/rel.h" @@ -28,6 +29,8 @@ static bool ginPlaceToPage(GinBtree btree, GinBtreeStack *stack, Buffer childbuf, GinStatsData *buildStats); static void ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, GinStatsData *buildStats); +static void ginFinishOldSplit(GinBtree btree, GinBtreeStack *stack, + GinStatsData *buildStats, int access); /* * Lock buffer by needed method for search. @@ -78,7 +81,7 @@ ginTraverseLock(Buffer buffer, bool searchMode) */ GinBtreeStack * ginFindLeafPage(GinBtree btree, bool searchMode, - bool rootConflictCheck, Snapshot snapshot) + bool rootConflictCheck) { GinBtreeStack *stack; @@ -100,7 +103,6 @@ ginFindLeafPage(GinBtree btree, bool searchMode, stack->off = InvalidOffsetNumber; page = BufferGetPage(stack->buffer); - TestForOldSnapshot(snapshot, btree->index, page); access = ginTraverseLock(stack->buffer, searchMode); @@ -109,7 +111,7 @@ ginFindLeafPage(GinBtree btree, bool searchMode, * encounter on the way. */ if (!searchMode && GinPageIsIncompleteSplit(page)) - ginFinishSplit(btree, stack, false, NULL); + ginFinishOldSplit(btree, stack, NULL, access); /* * ok, page is correctly locked, we should check to move right .., @@ -127,10 +129,9 @@ ginFindLeafPage(GinBtree btree, bool searchMode, stack->buffer = ginStepRight(stack->buffer, btree->index, access); stack->blkno = rightlink; page = BufferGetPage(stack->buffer); - TestForOldSnapshot(snapshot, btree->index, page); if (!searchMode && GinPageIsIncompleteSplit(page)) - ginFinishSplit(btree, stack, false, NULL); + ginFinishOldSplit(btree, stack, NULL, access); } if (GinPageIsLeaf(page)) /* we found, return locked page */ @@ -166,8 +167,11 @@ ginFindLeafPage(GinBtree btree, bool searchMode, * Step right from current page. * * The next page is locked first, before releasing the current page. This is - * crucial to protect from concurrent page deletion (see comment in - * ginDeletePage). + * crucial to prevent concurrent VACUUM from deleting a page that we are about + * to step to. (The lock-coupling isn't strictly necessary when we are + * traversing the tree to find an insert location, because page deletion grabs + * a cleanup lock on the root to prevent any concurrent inserts. See Page + * deletion section in the README. But there's no harm in doing it always.) */ Buffer ginStepRight(Buffer buffer, Relation index, int lockmode) @@ -264,7 +268,7 @@ ginFindParents(GinBtree btree, GinBtreeStack *stack) ptr->parent = root; ptr->off = InvalidOffsetNumber; - ginFinishSplit(btree, ptr, false, NULL); + ginFinishOldSplit(btree, ptr, NULL, GIN_EXCLUSIVE); } leftmostBlkno = btree->getLeftMostChild(btree, page); @@ -274,7 +278,11 @@ ginFindParents(GinBtree btree, GinBtreeStack *stack) blkno = GinPageGetOpaque(page)->rightlink; if (blkno == InvalidBlockNumber) { - UnlockReleaseBuffer(buffer); + /* Link not present in this level */ + LockBuffer(buffer, GIN_UNLOCK); + /* Do not release pin on the root buffer */ + if (buffer != root->buffer) + ReleaseBuffer(buffer); break; } buffer = ginStepRight(buffer, btree->index, GIN_EXCLUSIVE); @@ -289,7 +297,7 @@ ginFindParents(GinBtree btree, GinBtreeStack *stack) ptr->parent = root; ptr->off = InvalidOffsetNumber; - ginFinishSplit(btree, ptr, false, NULL); + ginFinishOldSplit(btree, ptr, NULL, GIN_EXCLUSIVE); } } @@ -389,24 +397,22 @@ ginPlaceToPage(GinBtree btree, GinBtreeStack *stack, START_CRIT_SECTION(); if (RelationNeedsWAL(btree->index) && !btree->isBuild) - { XLogBeginInsert(); - XLogRegisterBuffer(0, stack->buffer, REGBUF_STANDARD); - if (BufferIsValid(childbuf)) - XLogRegisterBuffer(1, childbuf, REGBUF_STANDARD); - } - /* Perform the page update, and register any extra WAL data */ + /* + * Perform the page update, dirty and register stack->buffer, and + * register any extra WAL data. + */ btree->execPlaceToPage(btree, stack->buffer, stack, insertdata, updateblkno, ptp_workspace); - MarkBufferDirty(stack->buffer); - /* An insert to an internal page finishes the split of the child. */ if (BufferIsValid(childbuf)) { GinPageGetOpaque(childpage)->flags &= ~GIN_INCOMPLETE_SPLIT; MarkBufferDirty(childbuf); + if (RelationNeedsWAL(btree->index) && !btree->isBuild) + XLogRegisterBuffer(1, childbuf, REGBUF_STANDARD); } if (RelationNeedsWAL(btree->index) && !btree->isBuild) @@ -670,15 +676,6 @@ ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, bool done; bool first = true; - /* - * freestack == false when we encounter an incompletely split page during - * a scan, while freestack == true is used in the normal scenario that a - * split is finished right after the initial insert. - */ - if (!freestack) - elog(DEBUG1, "finishing incomplete split of block %u in gin index \"%s\"", - stack->blkno, RelationGetRelationName(btree->index)); - /* this loop crawls up the stack until the insertion is complete */ do { @@ -686,6 +683,13 @@ ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, void *insertdata; BlockNumber updateblkno; +#ifdef USE_INJECTION_POINTS + if (GinPageIsLeaf(BufferGetPage(stack->buffer))) + INJECTION_POINT("gin-leave-leaf-split-incomplete"); + else + INJECTION_POINT("gin-leave-internal-split-incomplete"); +#endif + /* search parent to lock */ LockBuffer(parent->buffer, GIN_EXCLUSIVE); @@ -699,7 +703,7 @@ ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, * would fail. */ if (GinPageIsIncompleteSplit(BufferGetPage(parent->buffer))) - ginFinishSplit(btree, parent, false, buildStats); + ginFinishOldSplit(btree, parent, buildStats, GIN_EXCLUSIVE); /* move right if it's needed */ page = BufferGetPage(parent->buffer); @@ -723,7 +727,7 @@ ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, page = BufferGetPage(parent->buffer); if (GinPageIsIncompleteSplit(BufferGetPage(parent->buffer))) - ginFinishSplit(btree, parent, false, buildStats); + ginFinishOldSplit(btree, parent, buildStats, GIN_EXCLUSIVE); } /* insert the downlink */ @@ -759,6 +763,43 @@ ginFinishSplit(GinBtree btree, GinBtreeStack *stack, bool freestack, freeGinBtreeStack(stack); } +/* + * An entry point to ginFinishSplit() that is used when we stumble upon an + * existing incompletely split page in the tree, as opposed to completing a + * split that we just made ourselves. The difference is that stack->buffer may + * be merely share-locked on entry, and will be upgraded to exclusive mode. + * + * Note: Upgrading the lock momentarily releases it. Doing that in a scan + * would not be OK, because a concurrent VACUUM might delete the page while + * we're not holding the lock. It's OK in an insert, though, because VACUUM + * has a different mechanism that prevents it from running concurrently with + * inserts. (Namely, it holds a cleanup lock on the root.) + */ +static void +ginFinishOldSplit(GinBtree btree, GinBtreeStack *stack, GinStatsData *buildStats, int access) +{ + INJECTION_POINT("gin-finish-incomplete-split"); + elog(DEBUG1, "finishing incomplete split of block %u in gin index \"%s\"", + stack->blkno, RelationGetRelationName(btree->index)); + + if (access == GIN_SHARE) + { + LockBuffer(stack->buffer, GIN_UNLOCK); + LockBuffer(stack->buffer, GIN_EXCLUSIVE); + + if (!GinPageIsIncompleteSplit(BufferGetPage(stack->buffer))) + { + /* + * Someone else already completed the split while we were not + * holding the lock. + */ + return; + } + } + + ginFinishSplit(btree, stack, false, buildStats); +} + /* * Insert a value to tree described by stack. * @@ -779,7 +820,7 @@ ginInsertValue(GinBtree btree, GinBtreeStack *stack, void *insertdata, /* If the leaf page was incompletely split, finish the split first */ if (GinPageIsIncompleteSplit(BufferGetPage(stack->buffer))) - ginFinishSplit(btree, stack, false, buildStats); + ginFinishOldSplit(btree, stack, buildStats, GIN_EXCLUSIVE); done = ginPlaceToPage(btree, stack, insertdata, InvalidBlockNumber, diff --git a/src/backend/access/gin/ginbulk.c b/src/backend/access/gin/ginbulk.c index 57c218cb99c6b..7f89cd5e8261e 100644 --- a/src/backend/access/gin/ginbulk.c +++ b/src/backend/access/gin/ginbulk.c @@ -4,7 +4,7 @@ * routines for fast build of inverted index * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -42,7 +42,7 @@ ginCombineData(RBTNode *existing, const RBTNode *newdata, void *arg) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("posting list is too long"), - errhint("Reduce maintenance_work_mem."))); + errhint("Reduce \"maintenance_work_mem\"."))); accum->allocatedMemory -= GetMemoryChunkSpace(eo->list); eo->maxcount *= 2; diff --git a/src/backend/access/gin/gindatapage.c b/src/backend/access/gin/gindatapage.c index 9caeac164a9ff..126c4dd4504e8 100644 --- a/src/backend/access/gin/gindatapage.c +++ b/src/backend/access/gin/gindatapage.c @@ -4,7 +4,7 @@ * routines for handling GIN posting tree pages. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -721,9 +721,12 @@ dataExecPlaceToPageLeaf(GinBtree btree, Buffer buf, GinBtreeStack *stack, /* Apply changes to page */ dataPlaceToPageLeafRecompress(buf, leaf); + MarkBufferDirty(buf); + /* If needed, register WAL data built by computeLeafRecompressWALData */ if (RelationNeedsWAL(btree->index) && !btree->isBuild) { + XLogRegisterBuffer(0, buf, REGBUF_STANDARD); XLogRegisterBufData(0, leaf->walinfo, leaf->walinfolen); } } @@ -1155,6 +1158,8 @@ dataExecPlaceToPageInternal(GinBtree btree, Buffer buf, GinBtreeStack *stack, pitem = (PostingItem *) insertdata; GinDataPageAddPostingItem(page, pitem, off); + MarkBufferDirty(buf); + if (RelationNeedsWAL(btree->index) && !btree->isBuild) { /* @@ -1167,6 +1172,7 @@ dataExecPlaceToPageInternal(GinBtree btree, Buffer buf, GinBtreeStack *stack, data.offset = off; data.newitem = *pitem; + XLogRegisterBuffer(0, buf, REGBUF_STANDARD); XLogRegisterBufData(0, (char *) &data, sizeof(ginxlogInsertDataInternal)); } @@ -1917,7 +1923,7 @@ ginInsertItemPointers(Relation index, BlockNumber rootBlkno, { /* search for the leaf page where the first item should go to */ btree.itemptr = insertdata.items[insertdata.curitem]; - stack = ginFindLeafPage(&btree, false, true, NULL); + stack = ginFindLeafPage(&btree, false, true); ginInsertValue(&btree, stack, &insertdata, buildStats); } @@ -1927,8 +1933,7 @@ ginInsertItemPointers(Relation index, BlockNumber rootBlkno, * Starts a new scan on a posting tree. */ GinBtreeStack * -ginScanBeginPostingTree(GinBtree btree, Relation index, BlockNumber rootBlkno, - Snapshot snapshot) +ginScanBeginPostingTree(GinBtree btree, Relation index, BlockNumber rootBlkno) { GinBtreeStack *stack; @@ -1936,7 +1941,7 @@ ginScanBeginPostingTree(GinBtree btree, Relation index, BlockNumber rootBlkno, btree->fullScan = true; - stack = ginFindLeafPage(btree, true, false, snapshot); + stack = ginFindLeafPage(btree, true, false); return stack; } diff --git a/src/backend/access/gin/ginentrypage.c b/src/backend/access/gin/ginentrypage.c index 5a8c0eb98d0eb..94ef951e14fda 100644 --- a/src/backend/access/gin/ginentrypage.c +++ b/src/backend/access/gin/ginentrypage.c @@ -4,7 +4,7 @@ * routines for handling GIN entry tree pages. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -17,7 +17,6 @@ #include "access/gin_private.h" #include "access/ginxlog.h" #include "access/xloginsert.h" -#include "miscadmin.h" #include "utils/rel.h" static void entrySplitPage(GinBtree btree, Buffer origbuf, @@ -571,6 +570,8 @@ entryExecPlaceToPage(GinBtree btree, Buffer buf, GinBtreeStack *stack, elog(ERROR, "failed to add item to index page in \"%s\"", RelationGetRelationName(btree->index)); + MarkBufferDirty(buf); + if (RelationNeedsWAL(btree->index) && !btree->isBuild) { /* @@ -583,6 +584,7 @@ entryExecPlaceToPage(GinBtree btree, Buffer buf, GinBtreeStack *stack, data.isDelete = insertData->isDelete; data.offset = off; + XLogRegisterBuffer(0, buf, REGBUF_STANDARD); XLogRegisterBufData(0, (char *) &data, offsetof(ginxlogInsertEntry, tuple)); XLogRegisterBufData(0, (char *) insertData->entry, diff --git a/src/backend/access/gin/ginfast.c b/src/backend/access/gin/ginfast.c index ca7d770d864f4..eeca3ed318f4c 100644 --- a/src/backend/access/gin/ginfast.c +++ b/src/backend/access/gin/ginfast.c @@ -7,7 +7,7 @@ * transfer pending entries into the regular index structure. This * wins because bulk insertion is much more efficient than retail. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -31,7 +31,7 @@ #include "storage/lmgr.h" #include "storage/predicate.h" #include "utils/acl.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/memutils.h" #include "utils/rel.h" @@ -245,9 +245,10 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector) /* * An insertion to the pending list could logically belong anywhere in the * tree, so it conflicts with all serializable scans. All scans acquire a - * predicate lock on the metabuffer to represent that. + * predicate lock on the metabuffer to represent that. Therefore we'll + * check for conflicts in, but not until we have the page locked and are + * ready to modify the page. */ - CheckForSerializableConflictIn(index, NULL, GIN_METAPAGE_BLKNO); if (collector->sumsize + collector->ntuples * sizeof(ItemIdData) > GinListPageSize) { @@ -291,6 +292,8 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector) LockBuffer(metabuffer, GIN_EXCLUSIVE); metadata = GinPageGetMeta(metapage); + CheckForSerializableConflictIn(index, NULL, GIN_METAPAGE_BLKNO); + if (metadata->head == InvalidBlockNumber) { /* @@ -353,6 +356,8 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector) char *ptr; char *collectordata; + CheckForSerializableConflictIn(index, NULL, GIN_METAPAGE_BLKNO); + buffer = ReadBuffer(index, metadata->tail); LockBuffer(buffer, GIN_EXCLUSIVE); page = BufferGetPage(buffer); @@ -392,6 +397,9 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector) } Assert((ptr - collectordata) <= collector->sumsize); + + MarkBufferDirty(buffer); + if (needWal) { XLogRegisterBuffer(1, buffer, REGBUF_STANDARD); @@ -399,8 +407,6 @@ ginHeapTupleFastInsert(GinState *ginstate, GinTupleCollector *collector) } metadata->tailFreeSize = PageGetExactFreeSpace(page); - - MarkBufferDirty(buffer); } /* @@ -806,7 +812,7 @@ ginInsertCleanup(GinState *ginstate, bool full_clean, */ LockPage(index, GIN_METAPAGE_BLKNO, ExclusiveLock); workMemory = - (IsAutoVacuumWorkerProcess() && autovacuum_work_mem != -1) ? + (AmAutoVacuumWorkerProcess() && autovacuum_work_mem != -1) ? autovacuum_work_mem : maintenance_work_mem; } else @@ -1027,7 +1033,6 @@ gin_clean_pending_list(PG_FUNCTION_ARGS) Oid indexoid = PG_GETARG_OID(0); Relation indexRel = index_open(indexoid, RowExclusiveLock); IndexBulkDeleteResult stats; - GinState ginstate; if (RecoveryInProgress()) ereport(ERROR, @@ -1059,8 +1064,26 @@ gin_clean_pending_list(PG_FUNCTION_ARGS) RelationGetRelationName(indexRel)); memset(&stats, 0, sizeof(stats)); - initGinState(&ginstate, indexRel); - ginInsertCleanup(&ginstate, true, true, true, &stats); + + /* + * Can't assume anything about the content of an !indisready index. Make + * those a no-op, not an error, so users can just run this function on all + * indexes of the access method. Since an indisready&&!indisvalid index + * is merely awaiting missed aminsert calls, we're capable of processing + * it. Decline to do so, out of an abundance of caution. + */ + if (indexRel->rd_index->indisvalid) + { + GinState ginstate; + + initGinState(&ginstate, indexRel); + ginInsertCleanup(&ginstate, true, true, true, &stats); + } + else + ereport(DEBUG1, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("index \"%s\" is not valid", + RelationGetRelationName(indexRel)))); index_close(indexRel, RowExclusiveLock); diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c index cb676a710fb09..17601bb56b270 100644 --- a/src/backend/access/gin/ginget.c +++ b/src/backend/access/gin/ginget.c @@ -4,7 +4,7 @@ * fetch tuples from a GIN scan. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -67,7 +67,7 @@ moveRightIfItNeeded(GinBtreeData *btree, GinBtreeStack *stack, Snapshot snapshot */ static void scanPostingTree(Relation index, GinScanEntry scanEntry, - BlockNumber rootPostingTree, Snapshot snapshot) + BlockNumber rootPostingTree) { GinBtreeData btree; GinBtreeStack *stack; @@ -75,7 +75,7 @@ scanPostingTree(Relation index, GinScanEntry scanEntry, Page page; /* Descend to the leftmost leaf page */ - stack = ginScanBeginPostingTree(&btree, index, rootPostingTree, snapshot); + stack = ginScanBeginPostingTree(&btree, index, rootPostingTree); buffer = stack->buffer; IncrBufferRefCount(buffer); /* prevent unpin in freeGinBtreeStack */ @@ -140,7 +140,9 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack, * Predicate lock entry leaf page, following pages will be locked by * moveRightIfItNeeded() */ - PredicateLockPage(btree->index, stack->buffer, snapshot); + PredicateLockPage(btree->index, + BufferGetBlockNumber(stack->buffer), + snapshot); for (;;) { @@ -156,7 +158,6 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack, return true; page = BufferGetPage(stack->buffer); - TestForOldSnapshot(snapshot, btree->index, page); itup = (IndexTuple) PageGetItem(page, PageGetItemId(page, stack->off)); /* @@ -243,8 +244,7 @@ collectMatchBitmap(GinBtreeData *btree, GinBtreeStack *stack, PredicateLockPage(btree->index, rootPostingTree, snapshot); /* Collect all the TIDs in this entry's posting tree */ - scanPostingTree(btree->index, scanEntry, rootPostingTree, - snapshot); + scanPostingTree(btree->index, scanEntry, rootPostingTree); /* * We lock again the entry page and while it was unlocked insert @@ -343,7 +343,7 @@ startScanEntry(GinState *ginstate, GinScanEntry entry, Snapshot snapshot) ginPrepareEntryScan(&btreeEntry, entry->attnum, entry->queryKey, entry->queryCategory, ginstate); - stackEntry = ginFindLeafPage(&btreeEntry, true, false, snapshot); + stackEntry = ginFindLeafPage(&btreeEntry, true, false); page = BufferGetPage(stackEntry->buffer); /* ginFindLeafPage() will have already checked snapshot age. */ @@ -418,7 +418,7 @@ startScanEntry(GinState *ginstate, GinScanEntry entry, Snapshot snapshot) needUnlock = false; stack = ginScanBeginPostingTree(&entry->btree, ginstate->index, - rootPostingTree, snapshot); + rootPostingTree); entry->buffer = stack->buffer; /* @@ -556,16 +556,18 @@ startScanKey(GinState *ginstate, GinScanOpaque so, GinScanKey key) qsort_arg(entryIndexes, key->nentries, sizeof(int), entryIndexByFrequencyCmp, key); + for (i = 1; i < key->nentries; i++) + key->entryRes[entryIndexes[i]] = GIN_MAYBE; for (i = 0; i < key->nentries - 1; i++) { /* Pass all entries <= i as FALSE, and the rest as MAYBE */ - for (j = 0; j <= i; j++) - key->entryRes[entryIndexes[j]] = GIN_FALSE; - for (j = i + 1; j < key->nentries; j++) - key->entryRes[entryIndexes[j]] = GIN_MAYBE; + key->entryRes[entryIndexes[i]] = GIN_FALSE; if (key->triConsistentFn(key) == GIN_FALSE) break; + + /* Make this loop interruptible in case there are many keys */ + CHECK_FOR_INTERRUPTS(); } /* i is now the last required entry. */ @@ -651,7 +653,7 @@ startScan(IndexScanDesc scan) */ static void entryLoadMoreItems(GinState *ginstate, GinScanEntry entry, - ItemPointerData advancePast, Snapshot snapshot) + ItemPointerData advancePast) { Page page; int i; @@ -696,7 +698,7 @@ entryLoadMoreItems(GinState *ginstate, GinScanEntry entry, OffsetNumberNext(GinItemPointerGetOffsetNumber(&advancePast))); } entry->btree.fullScan = false; - stack = ginFindLeafPage(&entry->btree, true, false, snapshot); + stack = ginFindLeafPage(&entry->btree, true, false); /* we don't need the stack, just the buffer. */ entry->buffer = stack->buffer; @@ -806,7 +808,7 @@ entryLoadMoreItems(GinState *ginstate, GinScanEntry entry, */ static void entryGetItem(GinState *ginstate, GinScanEntry entry, - ItemPointerData advancePast, Snapshot snapshot) + ItemPointerData advancePast) { Assert(!entry->isFinished); @@ -937,7 +939,7 @@ entryGetItem(GinState *ginstate, GinScanEntry entry, /* If we've processed the current batch, load more items */ while (entry->offset >= entry->nlist) { - entryLoadMoreItems(ginstate, entry, advancePast, snapshot); + entryLoadMoreItems(ginstate, entry, advancePast); if (entry->isFinished) { @@ -988,7 +990,7 @@ entryGetItem(GinState *ginstate, GinScanEntry entry, */ static void keyGetItem(GinState *ginstate, MemoryContext tempCtx, GinScanKey key, - ItemPointerData advancePast, Snapshot snapshot) + ItemPointerData advancePast) { ItemPointerData minItem; ItemPointerData curPageLossy; @@ -1035,7 +1037,7 @@ keyGetItem(GinState *ginstate, MemoryContext tempCtx, GinScanKey key, */ if (ginCompareItemPointers(&entry->curItem, &advancePast) <= 0) { - entryGetItem(ginstate, entry, advancePast, snapshot); + entryGetItem(ginstate, entry, advancePast); if (entry->isFinished) continue; } @@ -1110,7 +1112,7 @@ keyGetItem(GinState *ginstate, MemoryContext tempCtx, GinScanKey key, if (ginCompareItemPointers(&entry->curItem, &advancePast) <= 0) { - entryGetItem(ginstate, entry, advancePast, snapshot); + entryGetItem(ginstate, entry, advancePast); if (entry->isFinished) continue; } @@ -1333,8 +1335,7 @@ scanGetItem(IndexScanDesc scan, ItemPointerData advancePast, } /* Fetch the next item for this key that is > advancePast. */ - keyGetItem(&so->ginstate, so->tempCtx, key, advancePast, - scan->xs_snapshot); + keyGetItem(&so->ginstate, so->tempCtx, key, advancePast); if (key->isFinished) return false; @@ -1458,7 +1459,6 @@ scanGetCandidate(IndexScanDesc scan, pendingPosition *pos) for (;;) { page = BufferGetPage(pos->pendingBuffer); - TestForOldSnapshot(scan->xs_snapshot, scan->indexRelation, page); maxoff = PageGetMaxOffsetNumber(page); if (pos->firstOffset > maxoff) @@ -1639,7 +1639,6 @@ collectMatchesForHeapRow(IndexScanDesc scan, pendingPosition *pos) sizeof(bool) * (pos->lastOffset - pos->firstOffset)); page = BufferGetPage(pos->pendingBuffer); - TestForOldSnapshot(scan->xs_snapshot, scan->indexRelation, page); for (i = 0; i < so->nkeys; i++) { @@ -1842,7 +1841,6 @@ scanPendingInsert(IndexScanDesc scan, TIDBitmap *tbm, int64 *ntids) LockBuffer(metabuffer, GIN_SHARE); page = BufferGetPage(metabuffer); - TestForOldSnapshot(scan->xs_snapshot, scan->indexRelation, page); blkno = GinPageGetMeta(page)->head; /* diff --git a/src/backend/access/gin/gininsert.c b/src/backend/access/gin/gininsert.c index be1841de7bfc0..71f38be90c3b1 100644 --- a/src/backend/access/gin/gininsert.c +++ b/src/backend/access/gin/gininsert.c @@ -4,7 +4,7 @@ * insert routines for the postgres inverted index access method. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -15,15 +15,12 @@ #include "postgres.h" #include "access/gin_private.h" -#include "access/ginxlog.h" #include "access/tableam.h" #include "access/xloginsert.h" -#include "catalog/index.h" #include "miscadmin.h" +#include "nodes/execnodes.h" #include "storage/bufmgr.h" -#include "storage/indexfsm.h" #include "storage/predicate.h" -#include "storage/smgr.h" #include "utils/memutils.h" #include "utils/rel.h" @@ -192,7 +189,7 @@ ginEntryInsert(GinState *ginstate, ginPrepareEntryScan(&btree, attnum, key, category, ginstate); btree.isBuild = (buildStats != NULL); - stack = ginFindLeafPage(&btree, false, false, NULL); + stack = ginFindLeafPage(&btree, false, false); page = BufferGetPage(stack->buffer); if (btree.findItem(&btree, stack)) @@ -440,9 +437,9 @@ ginbuildempty(Relation index) MetaBuffer; /* An empty GIN index has two pages. */ - MetaBuffer = ExtendBufferedRel(EB_REL(index), INIT_FORKNUM, NULL, + MetaBuffer = ExtendBufferedRel(BMR_REL(index), INIT_FORKNUM, NULL, EB_LOCK_FIRST | EB_SKIP_EXTENSION_LOCK); - RootBuffer = ExtendBufferedRel(EB_REL(index), INIT_FORKNUM, NULL, + RootBuffer = ExtendBufferedRel(BMR_REL(index), INIT_FORKNUM, NULL, EB_LOCK_FIRST | EB_SKIP_EXTENSION_LOCK); /* Initialize and xlog metabuffer and root buffer. */ diff --git a/src/backend/access/gin/ginlogic.c b/src/backend/access/gin/ginlogic.c index cfcd662893a8d..aab0ebd566b33 100644 --- a/src/backend/access/gin/ginlogic.c +++ b/src/backend/access/gin/ginlogic.c @@ -24,7 +24,7 @@ * is used for.) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -35,12 +35,6 @@ #include "postgres.h" #include "access/gin_private.h" -#include "access/reloptions.h" -#include "catalog/pg_collation.h" -#include "catalog/pg_type.h" -#include "miscadmin.h" -#include "storage/indexfsm.h" -#include "storage/lmgr.h" /* @@ -146,7 +140,9 @@ shimBoolConsistentFn(GinScanKey key) * every combination is O(n^2), so this is only feasible for a small number of * MAYBE inputs. * - * NB: This function modifies the key->entryRes array! + * NB: This function modifies the key->entryRes array. For now that's okay + * so long as we restore the entry-time contents before returning. This may + * need revisiting if we ever invent multithreaded GIN scans, though. */ static GinTernaryValue shimTriConsistentFn(GinScanKey key) @@ -155,7 +151,7 @@ shimTriConsistentFn(GinScanKey key) int maybeEntries[MAX_MAYBE_ENTRIES]; int i; bool boolResult; - bool recheck = false; + bool recheck; GinTernaryValue curResult; /* @@ -175,8 +171,8 @@ shimTriConsistentFn(GinScanKey key) } /* - * If none of the inputs were MAYBE, so we can just call consistent - * function as is. + * If none of the inputs were MAYBE, we can just call the consistent + * function as-is. */ if (nmaybe == 0) return directBoolConsistentFn(key); @@ -185,6 +181,7 @@ shimTriConsistentFn(GinScanKey key) for (i = 0; i < nmaybe; i++) key->entryRes[maybeEntries[i]] = GIN_FALSE; curResult = directBoolConsistentFn(key); + recheck = key->recheckCurItem; for (;;) { @@ -206,13 +203,20 @@ shimTriConsistentFn(GinScanKey key) recheck |= key->recheckCurItem; if (curResult != boolResult) - return GIN_MAYBE; + { + curResult = GIN_MAYBE; + break; + } } /* TRUE with recheck is taken to mean MAYBE */ if (curResult == GIN_TRUE && recheck) curResult = GIN_MAYBE; + /* We must restore the original state of the entryRes array */ + for (i = 0; i < nmaybe; i++) + key->entryRes[maybeEntries[i]] = GIN_MAYBE; + return curResult; } diff --git a/src/backend/access/gin/ginpostinglist.c b/src/backend/access/gin/ginpostinglist.c index 66a89837e6e69..708f9f49ec162 100644 --- a/src/backend/access/gin/ginpostinglist.c +++ b/src/backend/access/gin/ginpostinglist.c @@ -4,7 +4,7 @@ * routines for dealing with posting lists. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/access/gin/ginscan.c b/src/backend/access/gin/ginscan.c index ae7b0e9bb87ef..d832f2707fb79 100644 --- a/src/backend/access/gin/ginscan.c +++ b/src/backend/access/gin/ginscan.c @@ -4,7 +4,7 @@ * routines to manage scans of inverted index relations * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -68,8 +68,13 @@ ginFillScanEntry(GinScanOpaque so, OffsetNumber attnum, * * Entries with non-null extra_data are never considered identical, since * we can't know exactly what the opclass might be doing with that. + * + * Also, give up de-duplication once we have 100 entries. That avoids + * spending O(N^2) time on probably-fruitless de-duplication of large + * search-key sets. The threshold of 100 is arbitrary but matches + * predtest.c's threshold for what's a large array. */ - if (extra_data == NULL) + if (extra_data == NULL && so->totalentries < 100) { for (i = 0; i < so->totalentries; i++) { @@ -251,7 +256,7 @@ ginFreeScanKeys(GinScanOpaque so) tbm_free(entry->matchBitmap); } - MemoryContextResetAndDeleteChildren(so->keyCtx); + MemoryContextReset(so->keyCtx); so->keys = NULL; so->nkeys = 0; diff --git a/src/backend/access/gin/ginutil.c b/src/backend/access/gin/ginutil.c index 437f24753c031..5747ae6a4cabe 100644 --- a/src/backend/access/gin/ginutil.c +++ b/src/backend/access/gin/ginutil.c @@ -4,7 +4,7 @@ * Utility routines for the Postgres inverted index access method. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -23,10 +23,9 @@ #include "commands/vacuum.h" #include "miscadmin.h" #include "storage/indexfsm.h" -#include "storage/lmgr.h" -#include "storage/predicate.h" #include "utils/builtins.h" #include "utils/index_selfuncs.h" +#include "utils/rel.h" #include "utils/typcache.h" @@ -54,6 +53,7 @@ ginhandler(PG_FUNCTION_ARGS) amroutine->amclusterable = false; amroutine->ampredlocks = true; amroutine->amcanparallel = false; + amroutine->amcanbuildparallel = false; amroutine->amcaninclude = false; amroutine->amusemaintenanceworkmem = true; amroutine->amsummarizing = false; @@ -64,6 +64,7 @@ ginhandler(PG_FUNCTION_ARGS) amroutine->ambuild = ginbuild; amroutine->ambuildempty = ginbuildempty; amroutine->aminsert = gininsert; + amroutine->aminsertcleanup = NULL; amroutine->ambulkdelete = ginbulkdelete; amroutine->amvacuumcleanup = ginvacuumcleanup; amroutine->amcanreturn = NULL; @@ -327,7 +328,7 @@ GinNewBuffer(Relation index) } /* Must extend the file */ - buffer = ExtendBufferedRel(EB_REL(index), MAIN_FORKNUM, NULL, + buffer = ExtendBufferedRel(BMR_REL(index), MAIN_FORKNUM, NULL, EB_LOCK_FIRST); return buffer; diff --git a/src/backend/access/gin/ginvacuum.c b/src/backend/access/gin/ginvacuum.c index e5d310d836288..b3f415e2849a0 100644 --- a/src/backend/access/gin/ginvacuum.c +++ b/src/backend/access/gin/ginvacuum.c @@ -4,7 +4,7 @@ * delete & vacuum routines for the postgres GIN * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -590,7 +590,7 @@ ginbulkdelete(IndexVacuumInfo *info, IndexBulkDeleteResult *stats, /* * and cleanup any pending inserts */ - ginInsertCleanup(&gvs.ginstate, !IsAutoVacuumWorkerProcess(), + ginInsertCleanup(&gvs.ginstate, !AmAutoVacuumWorkerProcess(), false, true, stats); } @@ -701,7 +701,7 @@ ginvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats) */ if (info->analyze_only) { - if (IsAutoVacuumWorkerProcess()) + if (AmAutoVacuumWorkerProcess()) { initGinState(&ginstate, index); ginInsertCleanup(&ginstate, false, true, true, stats); @@ -717,7 +717,7 @@ ginvacuumcleanup(IndexVacuumInfo *info, IndexBulkDeleteResult *stats) { stats = (IndexBulkDeleteResult *) palloc0(sizeof(IndexBulkDeleteResult)); initGinState(&ginstate, index); - ginInsertCleanup(&ginstate, !IsAutoVacuumWorkerProcess(), + ginInsertCleanup(&ginstate, !AmAutoVacuumWorkerProcess(), false, true, stats); } diff --git a/src/backend/access/gin/ginvalidate.c b/src/backend/access/gin/ginvalidate.c index 33f43371f905c..74420a129aa48 100644 --- a/src/backend/access/gin/ginvalidate.c +++ b/src/backend/access/gin/ginvalidate.c @@ -3,7 +3,7 @@ * ginvalidate.c * Opclass validator for GIN. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -21,8 +21,6 @@ #include "catalog/pg_opclass.h" #include "catalog/pg_opfamily.h" #include "catalog/pg_type.h" -#include "utils/builtins.h" -#include "utils/lsyscache.h" #include "utils/regproc.h" #include "utils/syscache.h" diff --git a/src/backend/access/gin/ginxlog.c b/src/backend/access/gin/ginxlog.c index f7c84beef8d95..07ba0b559eaea 100644 --- a/src/backend/access/gin/ginxlog.c +++ b/src/backend/access/gin/ginxlog.c @@ -4,7 +4,7 @@ * WAL replay logic for inverted index. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/access/gin/meson.build b/src/backend/access/gin/meson.build index 499cad5571273..bd52c98f14f56 100644 --- a/src/backend/access/gin/meson.build +++ b/src/backend/access/gin/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'ginarrayproc.c', diff --git a/src/backend/access/gist/README b/src/backend/access/gist/README index efb2730e18148..8015ff19f05bc 100644 --- a/src/backend/access/gist/README +++ b/src/backend/access/gist/README @@ -271,10 +271,10 @@ should be visited too. When split inserts the downlink to the parent, it clears the F_FOLLOW_RIGHT flag in the child, and sets the NSN field in the child page header to match the LSN of the insertion on the parent. If the F_FOLLOW_RIGHT flag is not set, a scan compares the NSN on the child and the -LSN it saw in the parent. If NSN < LSN, the scan looked at the parent page -before the downlink was inserted, so it should follow the rightlink. Otherwise -the scan saw the downlink in the parent page, and will/did follow that as -usual. +LSN it saw in the parent. If the child's NSN is greater than the LSN seen on +the parent, the scan looked at the parent page before the downlink was +inserted, so it should follow the rightlink. Otherwise the scan saw the +downlink in the parent page, and will/did follow that as usual. A scan can't normally see a page with the F_FOLLOW_RIGHT flag set, because a page split keeps the child pages locked until the downlink has been inserted diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index 516465f8b7dbf..e49abbcb18afa 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -4,7 +4,7 @@ * interface routines for the postgres GiST index access method. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -21,9 +21,8 @@ #include "commands/vacuum.h" #include "miscadmin.h" #include "nodes/execnodes.h" -#include "storage/lmgr.h" #include "storage/predicate.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/index_selfuncs.h" #include "utils/memutils.h" #include "utils/rel.h" @@ -44,7 +43,7 @@ static void gistprunepage(Relation rel, Page page, Buffer buffer, #define ROTATEDIST(d) do { \ - SplitedPageLayout *tmp=(SplitedPageLayout*)palloc0(sizeof(SplitedPageLayout)); \ + SplitPageLayout *tmp=(SplitPageLayout*)palloc0(sizeof(SplitPageLayout)); \ tmp->block.blkno = InvalidBlockNumber; \ tmp->buffer = InvalidBuffer; \ tmp->next = (d); \ @@ -76,6 +75,7 @@ gisthandler(PG_FUNCTION_ARGS) amroutine->amclusterable = true; amroutine->ampredlocks = true; amroutine->amcanparallel = false; + amroutine->amcanbuildparallel = false; amroutine->amcaninclude = true; amroutine->amusemaintenanceworkmem = false; amroutine->amsummarizing = false; @@ -86,6 +86,7 @@ gisthandler(PG_FUNCTION_ARGS) amroutine->ambuild = gistbuild; amroutine->ambuildempty = gistbuildempty; amroutine->aminsert = gistinsert; + amroutine->aminsertcleanup = NULL; amroutine->ambulkdelete = gistbulkdelete; amroutine->amvacuumcleanup = gistvacuumcleanup; amroutine->amcanreturn = gistcanreturn; @@ -134,7 +135,7 @@ gistbuildempty(Relation index) Buffer buffer; /* Initialize the root page */ - buffer = ExtendBufferedRel(EB_REL(index), INIT_FORKNUM, NULL, + buffer = ExtendBufferedRel(BMR_REL(index), INIT_FORKNUM, NULL, EB_SKIP_EXTENSION_LOCK | EB_LOCK_FIRST); /* Initialize and xlog buffer */ @@ -281,11 +282,11 @@ gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate, /* no space for insertion */ IndexTuple *itvec; int tlen; - SplitedPageLayout *dist = NULL, + SplitPageLayout *dist = NULL, *ptr; BlockNumber oldrlink = InvalidBlockNumber; GistNSN oldnsn = 0; - SplitedPageLayout rootpg; + SplitPageLayout rootpg; bool is_rootsplit; int npage; @@ -1018,87 +1019,113 @@ gistFindPath(Relation r, BlockNumber child, OffsetNumber *downlinkoffnum) * remain so at exit, but it might not be the same page anymore. */ static void -gistFindCorrectParent(Relation r, GISTInsertStack *child) +gistFindCorrectParent(Relation r, GISTInsertStack *child, bool is_build) { GISTInsertStack *parent = child->parent; + ItemId iid; + IndexTuple idxtuple; + OffsetNumber maxoff; + GISTInsertStack *ptr; gistcheckpage(r, parent->buffer); parent->page = (Page) BufferGetPage(parent->buffer); + maxoff = PageGetMaxOffsetNumber(parent->page); - /* here we don't need to distinguish between split and page update */ - if (child->downlinkoffnum == InvalidOffsetNumber || - parent->lsn != PageGetLSN(parent->page)) + /* Check if the downlink is still where it was before */ + if (child->downlinkoffnum != InvalidOffsetNumber && child->downlinkoffnum <= maxoff) { - /* parent is changed, look child in right links until found */ - OffsetNumber i, - maxoff; - ItemId iid; - IndexTuple idxtuple; - GISTInsertStack *ptr; + iid = PageGetItemId(parent->page, child->downlinkoffnum); + idxtuple = (IndexTuple) PageGetItem(parent->page, iid); + if (ItemPointerGetBlockNumber(&(idxtuple->t_tid)) == child->blkno) + return; /* still there */ + } - while (true) - { - maxoff = PageGetMaxOffsetNumber(parent->page); - for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i)) - { - iid = PageGetItemId(parent->page, i); - idxtuple = (IndexTuple) PageGetItem(parent->page, iid); - if (ItemPointerGetBlockNumber(&(idxtuple->t_tid)) == child->blkno) - { - /* yes!!, found */ - child->downlinkoffnum = i; - return; - } - } + /* + * The page has changed since we looked. During normal operation, every + * update of a page changes its LSN, so the LSN we memorized should have + * changed too. + * + * During index build, however, we don't WAL-log the changes until we have + * built the index, so the LSN doesn't change. There is no concurrent + * activity during index build, but we might have changed the parent + * ourselves. + * + * We will also get here if child->downlinkoffnum is invalid. That happens + * if 'parent' had been updated by an earlier call to this function on its + * grandchild, which had to move right. + */ + Assert(parent->lsn != PageGetLSN(parent->page) || is_build || + child->downlinkoffnum == InvalidOffsetNumber); + + /* + * Scan the page to re-find the downlink. If the page was split, it might + * have moved to a different page, so follow the right links until we find + * it. + */ + while (true) + { + OffsetNumber i; - parent->blkno = GistPageGetOpaque(parent->page)->rightlink; - UnlockReleaseBuffer(parent->buffer); - if (parent->blkno == InvalidBlockNumber) + maxoff = PageGetMaxOffsetNumber(parent->page); + for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i)) + { + iid = PageGetItemId(parent->page, i); + idxtuple = (IndexTuple) PageGetItem(parent->page, iid); + if (ItemPointerGetBlockNumber(&(idxtuple->t_tid)) == child->blkno) { - /* - * End of chain and still didn't find parent. It's a very-very - * rare situation when root splitted. - */ - break; + /* yes!!, found */ + child->downlinkoffnum = i; + return; } - parent->buffer = ReadBuffer(r, parent->blkno); - LockBuffer(parent->buffer, GIST_EXCLUSIVE); - gistcheckpage(r, parent->buffer); - parent->page = (Page) BufferGetPage(parent->buffer); } - /* - * awful!!, we need search tree to find parent ... , but before we - * should release all old parent - */ - - ptr = child->parent->parent; /* child->parent already released - * above */ - while (ptr) + parent->blkno = GistPageGetOpaque(parent->page)->rightlink; + parent->downlinkoffnum = InvalidOffsetNumber; + UnlockReleaseBuffer(parent->buffer); + if (parent->blkno == InvalidBlockNumber) { - ReleaseBuffer(ptr->buffer); - ptr = ptr->parent; + /* + * End of chain and still didn't find parent. It's a very-very + * rare situation when the root was split. + */ + break; } + parent->buffer = ReadBuffer(r, parent->blkno); + LockBuffer(parent->buffer, GIST_EXCLUSIVE); + gistcheckpage(r, parent->buffer); + parent->page = (Page) BufferGetPage(parent->buffer); + } - /* ok, find new path */ - ptr = parent = gistFindPath(r, child->blkno, &child->downlinkoffnum); + /* + * awful!!, we need search tree to find parent ... , but before we should + * release all old parent + */ - /* read all buffers as expected by caller */ - /* note we don't lock them or gistcheckpage them here! */ - while (ptr) - { - ptr->buffer = ReadBuffer(r, ptr->blkno); - ptr->page = (Page) BufferGetPage(ptr->buffer); - ptr = ptr->parent; - } + ptr = child->parent->parent; /* child->parent already released above */ + while (ptr) + { + ReleaseBuffer(ptr->buffer); + ptr = ptr->parent; + } - /* install new chain of parents to stack */ - child->parent = parent; + /* ok, find new path */ + ptr = parent = gistFindPath(r, child->blkno, &child->downlinkoffnum); - /* make recursive call to normal processing */ - LockBuffer(child->parent->buffer, GIST_EXCLUSIVE); - gistFindCorrectParent(r, child); + /* read all buffers as expected by caller */ + /* note we don't lock them or gistcheckpage them here! */ + while (ptr) + { + ptr->buffer = ReadBuffer(r, ptr->blkno); + ptr->page = (Page) BufferGetPage(ptr->buffer); + ptr = ptr->parent; } + + /* install new chain of parents to stack */ + child->parent = parent; + + /* make recursive call to normal processing */ + LockBuffer(child->parent->buffer, GIST_EXCLUSIVE); + gistFindCorrectParent(r, child, is_build); } /* @@ -1106,7 +1133,7 @@ gistFindCorrectParent(Relation r, GISTInsertStack *child) */ static IndexTuple gistformdownlink(Relation rel, Buffer buf, GISTSTATE *giststate, - GISTInsertStack *stack) + GISTInsertStack *stack, bool is_build) { Page page = BufferGetPage(buf); OffsetNumber maxoff; @@ -1147,7 +1174,7 @@ gistformdownlink(Relation rel, Buffer buf, GISTSTATE *giststate, ItemId iid; LockBuffer(stack->parent->buffer, GIST_EXCLUSIVE); - gistFindCorrectParent(rel, stack); + gistFindCorrectParent(rel, stack, is_build); iid = PageGetItemId(stack->parent->page, stack->downlinkoffnum); downlink = (IndexTuple) PageGetItem(stack->parent->page, iid); downlink = CopyIndexTuple(downlink); @@ -1193,7 +1220,7 @@ gistfixsplit(GISTInsertState *state, GISTSTATE *giststate) page = BufferGetPage(buf); /* Form the new downlink tuples to insert to parent */ - downlink = gistformdownlink(state->r, buf, giststate, stack); + downlink = gistformdownlink(state->r, buf, giststate, stack, state->is_build); si->buf = buf; si->downlink = downlink; @@ -1347,7 +1374,7 @@ gistfinishsplit(GISTInsertState *state, GISTInsertStack *stack, right = (GISTPageSplitInfo *) list_nth(splitinfo, pos); left = (GISTPageSplitInfo *) list_nth(splitinfo, pos - 1); - gistFindCorrectParent(state->r, stack); + gistFindCorrectParent(state->r, stack, state->is_build); if (gistinserttuples(state, stack->parent, giststate, &right->downlink, 1, InvalidOffsetNumber, @@ -1372,21 +1399,22 @@ gistfinishsplit(GISTInsertState *state, GISTInsertStack *stack, */ tuples[0] = left->downlink; tuples[1] = right->downlink; - gistFindCorrectParent(state->r, stack); - if (gistinserttuples(state, stack->parent, giststate, - tuples, 2, - stack->downlinkoffnum, - left->buf, right->buf, - true, /* Unlock parent */ - unlockbuf /* Unlock stack->buffer if caller wants - * that */ - )) - { - /* - * If the parent page was split, the downlink might have moved. - */ - stack->downlinkoffnum = InvalidOffsetNumber; - } + gistFindCorrectParent(state->r, stack, state->is_build); + (void) gistinserttuples(state, stack->parent, giststate, + tuples, 2, + stack->downlinkoffnum, + left->buf, right->buf, + true, /* Unlock parent */ + unlockbuf /* Unlock stack->buffer if caller + * wants that */ + ); + + /* + * The downlink might have moved when we updated it. Even if the page + * wasn't split, because gistinserttuples() implements updating the old + * tuple by removing and re-inserting it! + */ + stack->downlinkoffnum = InvalidOffsetNumber; Assert(left->buf == stack->buffer); @@ -1413,7 +1441,7 @@ gistfinishsplit(GISTInsertState *state, GISTInsertStack *stack, * used for XLOG and real writes buffers. Function is recursive, ie * it will split page until keys will fit in every page. */ -SplitedPageLayout * +SplitPageLayout * gistSplit(Relation r, Page page, IndexTuple *itup, /* contains compressed entry */ @@ -1424,7 +1452,7 @@ gistSplit(Relation r, *rvectup; GistSplitVector v; int i; - SplitedPageLayout *res = NULL; + SplitPageLayout *res = NULL; /* this should never recurse very deeply, but better safe than sorry */ check_stack_depth(); @@ -1474,7 +1502,7 @@ gistSplit(Relation r, if (!gistfitpage(lvectup, v.splitVector.spl_nleft)) { - SplitedPageLayout *resptr, + SplitPageLayout *resptr, *subres; resptr = subres = gistSplit(r, page, lvectup, v.splitVector.spl_nleft, giststate); diff --git a/src/backend/access/gist/gistbuild.c b/src/backend/access/gist/gistbuild.c index 5e0c1447f9243..ba06df30fafeb 100644 --- a/src/backend/access/gist/gistbuild.c +++ b/src/backend/access/gist/gistbuild.c @@ -22,7 +22,7 @@ * tuples (unless buffering mode is disabled). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -36,14 +36,14 @@ #include "access/genam.h" #include "access/gist_private.h" -#include "access/gistxlog.h" #include "access/tableam.h" #include "access/xloginsert.h" -#include "catalog/index.h" #include "miscadmin.h" +#include "nodes/execnodes.h" #include "optimizer/optimizer.h" #include "storage/bufmgr.h" -#include "storage/smgr.h" +#include "storage/bulk_write.h" + #include "utils/memutils.h" #include "utils/rel.h" #include "utils/tuplesort.h" @@ -75,7 +75,7 @@ typedef enum GIST_BUFFERING_STATS, /* gathering statistics of index tuple size * before switching to the buffering build * mode */ - GIST_BUFFERING_ACTIVE /* in buffering build mode */ + GIST_BUFFERING_ACTIVE, /* in buffering build mode */ } GistBuildMode; /* Working state for gistbuild and its callback */ @@ -106,11 +106,8 @@ typedef struct Tuplesortstate *sortstate; /* state data for tuplesort.c */ BlockNumber pages_allocated; - BlockNumber pages_written; - int ready_num_pages; - BlockNumber ready_blknos[XLR_MAX_BLOCK_ID]; - Page ready_pages[XLR_MAX_BLOCK_ID]; + BulkWriteState *bulkstate; } GISTBuildState; #define GIST_SORTED_BUILD_PAGE_NUM 4 @@ -142,7 +139,6 @@ static void gist_indexsortbuild_levelstate_add(GISTBuildState *state, IndexTuple itup); static void gist_indexsortbuild_levelstate_flush(GISTBuildState *state, GistSortedBuildLevelState *levelstate); -static void gist_indexsortbuild_flush_ready_pages(GISTBuildState *state); static void gistInitBuffering(GISTBuildState *buildstate); static int calculatePagesPerBuffer(GISTBuildState *buildstate, int levelStep); @@ -405,27 +401,18 @@ gist_indexsortbuild(GISTBuildState *state) { IndexTuple itup; GistSortedBuildLevelState *levelstate; - Page page; + BulkWriteBuffer rootbuf; - state->pages_allocated = 0; - state->pages_written = 0; - state->ready_num_pages = 0; + /* Reserve block 0 for the root page */ + state->pages_allocated = 1; - /* - * Write an empty page as a placeholder for the root page. It will be - * replaced with the real root page at the end. - */ - page = palloc_aligned(BLCKSZ, PG_IO_ALIGN_SIZE, MCXT_ALLOC_ZERO); - smgrextend(RelationGetSmgr(state->indexrel), MAIN_FORKNUM, GIST_ROOT_BLKNO, - page, true); - state->pages_allocated++; - state->pages_written++; + state->bulkstate = smgr_bulk_start_rel(state->indexrel, MAIN_FORKNUM); /* Allocate a temporary buffer for the first leaf page batch. */ levelstate = palloc0(sizeof(GistSortedBuildLevelState)); - levelstate->pages[0] = page; + levelstate->pages[0] = palloc(BLCKSZ); levelstate->parent = NULL; - gistinitpage(page, F_LEAF); + gistinitpage(levelstate->pages[0], F_LEAF); /* * Fill index pages with tuples in the sorted order. @@ -455,31 +442,15 @@ gist_indexsortbuild(GISTBuildState *state) levelstate = parent; } - gist_indexsortbuild_flush_ready_pages(state); - /* Write out the root */ PageSetLSN(levelstate->pages[0], GistBuildLSN); - PageSetChecksumInplace(levelstate->pages[0], GIST_ROOT_BLKNO); - smgrwrite(RelationGetSmgr(state->indexrel), MAIN_FORKNUM, GIST_ROOT_BLKNO, - levelstate->pages[0], true); - if (RelationNeedsWAL(state->indexrel)) - log_newpage(&state->indexrel->rd_locator, MAIN_FORKNUM, GIST_ROOT_BLKNO, - levelstate->pages[0], true); - - pfree(levelstate->pages[0]); + rootbuf = smgr_bulk_get_buf(state->bulkstate); + memcpy(rootbuf, levelstate->pages[0], BLCKSZ); + smgr_bulk_write(state->bulkstate, GIST_ROOT_BLKNO, rootbuf, true); + pfree(levelstate); - /* - * When we WAL-logged index pages, we must nonetheless fsync index files. - * Since we're building outside shared buffers, a CHECKPOINT occurring - * during the build has no way to flush the previously written data to - * disk (indeed it won't know the index even exists). A crash later on - * would replay WAL from the checkpoint, therefore it wouldn't replay our - * earlier WAL entries. If we do not fsync those pages here, they might - * still not be on disk when the crash occurs. - */ - if (RelationNeedsWAL(state->indexrel)) - smgrimmedsync(RelationGetSmgr(state->indexrel), MAIN_FORKNUM); + smgr_bulk_finish(state->bulkstate); } /* @@ -509,8 +480,7 @@ gist_indexsortbuild_levelstate_add(GISTBuildState *state, levelstate->current_page++; if (levelstate->pages[levelstate->current_page] == NULL) - levelstate->pages[levelstate->current_page] = - palloc_aligned(BLCKSZ, PG_IO_ALIGN_SIZE, 0); + levelstate->pages[levelstate->current_page] = palloc0(BLCKSZ); newPage = levelstate->pages[levelstate->current_page]; gistinitpage(newPage, old_page_flags); @@ -527,7 +497,7 @@ gist_indexsortbuild_levelstate_flush(GISTBuildState *state, BlockNumber blkno; MemoryContext oldCtx; IndexTuple union_tuple; - SplitedPageLayout *dist; + SplitPageLayout *dist; IndexTuple *itvec; int vect_len; bool isleaf = GistPageIsLeaf(levelstate->pages[0]); @@ -555,8 +525,8 @@ gist_indexsortbuild_levelstate_flush(GISTBuildState *state, } else { - /* Create splitted layout from single page */ - dist = (SplitedPageLayout *) palloc0(sizeof(SplitedPageLayout)); + /* Create split layout from single page */ + dist = (SplitPageLayout *) palloc0(sizeof(SplitPageLayout)); union_tuple = gistunion(state->indexrel, itvec, vect_len, state->giststate); dist->itup = union_tuple; @@ -573,6 +543,7 @@ gist_indexsortbuild_levelstate_flush(GISTBuildState *state, for (; dist != NULL; dist = dist->next) { char *data; + BulkWriteBuffer buf; Page target; /* check once per page */ @@ -580,7 +551,8 @@ gist_indexsortbuild_levelstate_flush(GISTBuildState *state, /* Create page and copy data */ data = (char *) (dist->list); - target = palloc_aligned(BLCKSZ, PG_IO_ALIGN_SIZE, MCXT_ALLOC_ZERO); + buf = smgr_bulk_get_buf(state->bulkstate); + target = (Page) buf; gistinitpage(target, isleaf ? F_LEAF : 0); for (int i = 0; i < dist->block.num; i++) { @@ -593,20 +565,6 @@ gist_indexsortbuild_levelstate_flush(GISTBuildState *state, } union_tuple = dist->itup; - if (state->ready_num_pages == XLR_MAX_BLOCK_ID) - gist_indexsortbuild_flush_ready_pages(state); - - /* - * The page is now complete. Assign a block number to it, and add it - * to the list of finished pages. (We don't write it out immediately, - * because we want to WAL-log the pages in batches.) - */ - blkno = state->pages_allocated++; - state->ready_blknos[state->ready_num_pages] = blkno; - state->ready_pages[state->ready_num_pages] = target; - state->ready_num_pages++; - ItemPointerSetBlockNumber(&(union_tuple->t_tid), blkno); - /* * Set the right link to point to the previous page. This is just for * debugging purposes: GiST only follows the right link if a page is @@ -621,6 +579,15 @@ gist_indexsortbuild_levelstate_flush(GISTBuildState *state, */ if (levelstate->last_blkno) GistPageGetOpaque(target)->rightlink = levelstate->last_blkno; + + /* + * The page is now complete. Assign a block number to it, and pass it + * to the bulk writer. + */ + blkno = state->pages_allocated++; + PageSetLSN(target, GistBuildLSN); + smgr_bulk_write(state->bulkstate, blkno, buf, true); + ItemPointerSetBlockNumber(&(union_tuple->t_tid), blkno); levelstate->last_blkno = blkno; /* @@ -631,7 +598,7 @@ gist_indexsortbuild_levelstate_flush(GISTBuildState *state, if (parent == NULL) { parent = palloc0(sizeof(GistSortedBuildLevelState)); - parent->pages[0] = (Page) palloc_aligned(BLCKSZ, PG_IO_ALIGN_SIZE, 0); + parent->pages[0] = palloc(BLCKSZ); parent->parent = NULL; gistinitpage(parent->pages[0], 0); @@ -641,39 +608,6 @@ gist_indexsortbuild_levelstate_flush(GISTBuildState *state, } } -static void -gist_indexsortbuild_flush_ready_pages(GISTBuildState *state) -{ - if (state->ready_num_pages == 0) - return; - - for (int i = 0; i < state->ready_num_pages; i++) - { - Page page = state->ready_pages[i]; - BlockNumber blkno = state->ready_blknos[i]; - - /* Currently, the blocks must be buffered in order. */ - if (blkno != state->pages_written) - elog(ERROR, "unexpected block number to flush GiST sorting build"); - - PageSetLSN(page, GistBuildLSN); - PageSetChecksumInplace(page, blkno); - smgrextend(RelationGetSmgr(state->indexrel), MAIN_FORKNUM, blkno, page, - true); - - state->pages_written++; - } - - if (RelationNeedsWAL(state->indexrel)) - log_newpages(&state->indexrel->rd_locator, MAIN_FORKNUM, state->ready_num_pages, - state->ready_blknos, state->ready_pages, true); - - for (int i = 0; i < state->ready_num_pages; i++) - pfree(state->ready_pages[i]); - - state->ready_num_pages = 0; -} - /*------------------------------------------------------------------------- * Routines for non-sorted build diff --git a/src/backend/access/gist/gistbuildbuffers.c b/src/backend/access/gist/gistbuildbuffers.c index 1423b4b047cf2..4c2301da00500 100644 --- a/src/backend/access/gist/gistbuildbuffers.c +++ b/src/backend/access/gist/gistbuildbuffers.c @@ -4,7 +4,7 @@ * node buffer management functions for GiST buffering build algorithm. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -14,13 +14,9 @@ */ #include "postgres.h" -#include "access/genam.h" #include "access/gist_private.h" -#include "catalog/index.h" -#include "miscadmin.h" #include "storage/buffile.h" #include "storage/bufmgr.h" -#include "utils/memutils.h" #include "utils/rel.h" static GISTNodeBufferPage *gistAllocateNewPageBuffer(GISTBuildBuffers *gfbb); @@ -163,7 +159,7 @@ gistGetNodeBuffer(GISTBuildBuffers *gfbb, GISTSTATE *giststate, * not arbitrary that the new buffer is put to the beginning of the * list: in the final emptying phase we loop through all buffers at * each level, and flush them. If a page is split during the emptying, - * it's more efficient to flush the new splitted pages first, before + * it's more efficient to flush the new split pages first, before * moving on to pre-existing pages on the level. The buffers just * created during the page split are likely still in cache, so * flushing them immediately is more efficient than putting them to @@ -518,7 +514,7 @@ gistFreeBuildBuffers(GISTBuildBuffers *gfbb) /* * Data structure representing information about node buffer for index tuples - * relocation from splitted node buffer. + * relocation from split node buffer. */ typedef struct { @@ -549,12 +545,12 @@ gistRelocateBuildBuffersOnSplit(GISTBuildBuffers *gfbb, GISTSTATE *giststate, GISTNodeBuffer oldBuf; ListCell *lc; - /* If the splitted page doesn't have buffers, we have nothing to do. */ + /* If the split page doesn't have buffers, we have nothing to do. */ if (!LEVEL_HAS_BUFFERS(level, gfbb)) return; /* - * Get the node buffer of the splitted page. + * Get the node buffer of the split page. */ blocknum = BufferGetBlockNumber(buffer); nodeBuffer = hash_search(gfbb->nodeBuffersTab, &blocknum, diff --git a/src/backend/access/gist/gistget.c b/src/backend/access/gist/gistget.c index e2c9b5f069c6b..b35b8a9757752 100644 --- a/src/backend/access/gist/gistget.c +++ b/src/backend/access/gist/gistget.c @@ -4,7 +4,7 @@ * fetch tuples from a GiST scan. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -20,7 +20,6 @@ #include "lib/pairingheap.h" #include "miscadmin.h" #include "pgstat.h" -#include "storage/lmgr.h" #include "storage/predicate.h" #include "utils/float.h" #include "utils/memutils.h" @@ -346,7 +345,6 @@ gistScanPage(IndexScanDesc scan, GISTSearchItem *pageItem, PredicateLockPage(r, BufferGetBlockNumber(buffer), scan->xs_snapshot); gistcheckpage(scan->indexRelation, buffer); page = BufferGetPage(buffer); - TestForOldSnapshot(scan->xs_snapshot, r, page); opaque = GistPageGetOpaque(page); /* diff --git a/src/backend/access/gist/gistproc.c b/src/backend/access/gist/gistproc.c index 4881034069baa..781c2f7358814 100644 --- a/src/backend/access/gist/gistproc.c +++ b/src/backend/access/gist/gistproc.c @@ -7,7 +7,7 @@ * This gives R-tree behavior, with Guttman's poly-time split algorithm. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -21,8 +21,8 @@ #include "access/gist.h" #include "access/stratnum.h" -#include "utils/builtins.h" #include "utils/float.h" +#include "utils/fmgrprotos.h" #include "utils/geo_decls.h" #include "utils/sortsupport.h" diff --git a/src/backend/access/gist/gistscan.c b/src/backend/access/gist/gistscan.c index 00400583c0b03..e05801e2f5bf1 100644 --- a/src/backend/access/gist/gistscan.c +++ b/src/backend/access/gist/gistscan.c @@ -4,7 +4,7 @@ * routines to manage scans on GiST index relations * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/access/gist/gistsplit.c b/src/backend/access/gist/gistsplit.c index c56c2e3014e1e..f56b92c31361b 100644 --- a/src/backend/access/gist/gistsplit.c +++ b/src/backend/access/gist/gistsplit.c @@ -15,7 +15,7 @@ * gistSplitByKey() is the entry point to this file. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/access/gist/gistutil.c b/src/backend/access/gist/gistutil.c index f9f51152b8e18..78e98d68b1518 100644 --- a/src/backend/access/gist/gistutil.c +++ b/src/backend/access/gist/gistutil.c @@ -4,7 +4,7 @@ * utilities routines for the postgres GiST index access method. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -18,12 +18,11 @@ #include "access/gist_private.h" #include "access/htup_details.h" #include "access/reloptions.h" -#include "catalog/pg_opclass.h" #include "common/pg_prng.h" #include "storage/indexfsm.h" -#include "storage/lmgr.h" #include "utils/float.h" #include "utils/lsyscache.h" +#include "utils/rel.h" #include "utils/snapmgr.h" #include "utils/syscache.h" @@ -573,7 +572,7 @@ gistdentryinit(GISTSTATE *giststate, int nkey, GISTENTRY *e, IndexTuple gistFormTuple(GISTSTATE *giststate, Relation r, - Datum *attdata, bool *isnull, bool isleaf) + const Datum *attdata, const bool *isnull, bool isleaf) { Datum compatt[INDEX_MAX_KEYS]; IndexTuple res; @@ -594,7 +593,7 @@ gistFormTuple(GISTSTATE *giststate, Relation r, void gistCompressValues(GISTSTATE *giststate, Relation r, - Datum *attdata, bool *isnull, bool isleaf, Datum *compatt) + const Datum *attdata, const bool *isnull, bool isleaf, Datum *compatt) { int i; @@ -877,7 +876,7 @@ gistNewBuffer(Relation r, Relation heaprel) } /* Must extend the file */ - buffer = ExtendBufferedRel(EB_REL(r), MAIN_FORKNUM, NULL, + buffer = ExtendBufferedRel(BMR_REL(r), MAIN_FORKNUM, NULL, EB_LOCK_FIRST); return buffer; diff --git a/src/backend/access/gist/gistvacuum.c b/src/backend/access/gist/gistvacuum.c index 3f60d3274d260..24fb94f473ecb 100644 --- a/src/backend/access/gist/gistvacuum.c +++ b/src/backend/access/gist/gistvacuum.c @@ -4,7 +4,7 @@ * vacuuming routines for the postgres GiST index access method. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/access/gist/gistvalidate.c b/src/backend/access/gist/gistvalidate.c index 4c711ecfa8501..36b5a85cf31a7 100644 --- a/src/backend/access/gist/gistvalidate.c +++ b/src/backend/access/gist/gistvalidate.c @@ -3,7 +3,7 @@ * gistvalidate.c * Opclass validator for GiST. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -21,7 +21,6 @@ #include "catalog/pg_opclass.h" #include "catalog/pg_opfamily.h" #include "catalog/pg_type.h" -#include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/regproc.h" #include "utils/syscache.h" diff --git a/src/backend/access/gist/gistxlog.c b/src/backend/access/gist/gistxlog.c index 15249aa9212c4..451e8d8d98e63 100644 --- a/src/backend/access/gist/gistxlog.c +++ b/src/backend/access/gist/gistxlog.c @@ -4,7 +4,7 @@ * WAL replay logic for GiST. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -16,12 +16,10 @@ #include "access/bufmask.h" #include "access/gist_private.h" #include "access/gistxlog.h" -#include "access/heapam_xlog.h" #include "access/transam.h" #include "access/xloginsert.h" #include "access/xlogutils.h" -#include "miscadmin.h" -#include "storage/procarray.h" +#include "storage/standby.h" #include "utils/memutils.h" #include "utils/rel.h" @@ -185,10 +183,10 @@ gistRedoDeleteRecord(XLogReaderState *record) * * GiST delete records can conflict with standby queries. You might think * that vacuum records would conflict as well, but we've handled that - * already. XLOG_HEAP2_PRUNE records provide the highest xid cleaned by - * the vacuum of the heap and so we can resolve any conflicts just once - * when that arrives. After that we know that no conflicts exist from - * individual gist vacuum records on that index. + * already. XLOG_HEAP2_PRUNE_VACUUM_SCAN records provide the highest xid + * cleaned by the vacuum of the heap and so we can resolve any conflicts + * just once when that arrives. After that we know that no conflicts + * exist from individual gist vacuum records on that index. */ if (InHotStandby) { @@ -495,12 +493,12 @@ gist_mask(char *pagedata, BlockNumber blkno) */ XLogRecPtr gistXLogSplit(bool page_is_leaf, - SplitedPageLayout *dist, + SplitPageLayout *dist, BlockNumber origrlink, GistNSN orignsn, Buffer leftchildbuf, bool markfollowright) { gistxlogPageSplit xlrec; - SplitedPageLayout *ptr; + SplitPageLayout *ptr; int npage = 0; XLogRecPtr recptr; int i; diff --git a/src/backend/access/gist/meson.build b/src/backend/access/gist/meson.build index 17804ce716b37..1f67512192484 100644 --- a/src/backend/access/gist/meson.build +++ b/src/backend/access/gist/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'gist.c', diff --git a/src/backend/access/hash/hash.c b/src/backend/access/hash/hash.c index fc5d97f606e2f..01d06b7c3289e 100644 --- a/src/backend/access/hash/hash.c +++ b/src/backend/access/hash/hash.c @@ -3,7 +3,7 @@ * hash.c * Implementation of Margo Seltzer's Hashing package for postgres. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,13 +23,13 @@ #include "access/relscan.h" #include "access/tableam.h" #include "access/xloginsert.h" -#include "catalog/index.h" #include "commands/progress.h" #include "commands/vacuum.h" #include "miscadmin.h" +#include "nodes/execnodes.h" #include "optimizer/plancat.h" #include "pgstat.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/index_selfuncs.h" #include "utils/rel.h" @@ -73,6 +73,7 @@ hashhandler(PG_FUNCTION_ARGS) amroutine->amclusterable = false; amroutine->ampredlocks = true; amroutine->amcanparallel = false; + amroutine->amcanbuildparallel = false; amroutine->amcaninclude = false; amroutine->amusemaintenanceworkmem = false; amroutine->amsummarizing = false; @@ -83,6 +84,7 @@ hashhandler(PG_FUNCTION_ARGS) amroutine->ambuild = hashbuild; amroutine->ambuildempty = hashbuildempty; amroutine->aminsert = hashinsert; + amroutine->aminsertcleanup = NULL; amroutine->ambulkdelete = hashbulkdelete; amroutine->amvacuumcleanup = hashvacuumcleanup; amroutine->amcanreturn = NULL; @@ -824,11 +826,16 @@ hashbucketcleanup(Relation rel, Bucket cur_bucket, Buffer bucket_buf, XLogRegisterData((char *) &xlrec, SizeOfHashDelete); /* - * bucket buffer needs to be registered to ensure that we can - * acquire a cleanup lock on it during replay. + * bucket buffer was not changed, but still needs to be + * registered to ensure that we can acquire a cleanup lock on + * it during replay. */ if (!xlrec.is_primary_bucket_page) - XLogRegisterBuffer(0, bucket_buf, REGBUF_STANDARD | REGBUF_NO_IMAGE); + { + uint8 flags = REGBUF_STANDARD | REGBUF_NO_IMAGE | REGBUF_NO_CHANGE; + + XLogRegisterBuffer(0, bucket_buf, flags); + } XLogRegisterBuffer(1, buf, REGBUF_STANDARD); XLogRegisterBufData(1, (char *) deletable, diff --git a/src/backend/access/hash/hash_xlog.c b/src/backend/access/hash/hash_xlog.c index e8e06c62a9566..4e1ec468569e1 100644 --- a/src/backend/access/hash/hash_xlog.c +++ b/src/backend/access/hash/hash_xlog.c @@ -4,7 +4,7 @@ * WAL replay logic for hash index. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -17,11 +17,8 @@ #include "access/bufmask.h" #include "access/hash.h" #include "access/hash_xlog.h" -#include "access/transam.h" -#include "access/xlog.h" #include "access/xlogutils.h" -#include "miscadmin.h" -#include "storage/procarray.h" +#include "storage/standby.h" /* * replay a hash index meta page @@ -632,7 +629,7 @@ hash_xlog_squeeze_page(XLogReaderState *record) XLogRecPtr lsn = record->EndRecPtr; xl_hash_squeeze_page *xldata = (xl_hash_squeeze_page *) XLogRecGetData(record); Buffer bucketbuf = InvalidBuffer; - Buffer writebuf; + Buffer writebuf = InvalidBuffer; Buffer ovflbuf; Buffer prevbuf = InvalidBuffer; Buffer mapbuf; @@ -655,7 +652,10 @@ hash_xlog_squeeze_page(XLogReaderState *record) */ (void) XLogReadBufferForRedoExtended(record, 0, RBM_NORMAL, true, &bucketbuf); - action = XLogReadBufferForRedo(record, 1, &writebuf); + if (xldata->ntups > 0 || xldata->is_prev_bucket_same_wrt) + action = XLogReadBufferForRedo(record, 1, &writebuf); + else + action = BLK_NOTFOUND; } /* replay the record for adding entries in overflow buffer */ @@ -666,6 +666,7 @@ hash_xlog_squeeze_page(XLogReaderState *record) char *data; Size datalen; uint16 ninserted = 0; + bool mod_wbuf = false; data = begin = XLogRecGetBlockData(record, 1, &datalen); @@ -695,6 +696,17 @@ hash_xlog_squeeze_page(XLogReaderState *record) ninserted++; } + + mod_wbuf = true; + } + else + { + /* + * Ensure that the required flags are set when there are no + * tuples. See _hash_freeovflpage(). + */ + Assert(xldata->is_prim_bucket_same_wrt || + xldata->is_prev_bucket_same_wrt); } /* @@ -711,10 +723,15 @@ hash_xlog_squeeze_page(XLogReaderState *record) HashPageOpaque writeopaque = HashPageGetOpaque(writepage); writeopaque->hasho_nextblkno = xldata->nextblkno; + mod_wbuf = true; } - PageSetLSN(writepage, lsn); - MarkBufferDirty(writebuf); + /* Set LSN and mark writebuf dirty iff it is modified */ + if (mod_wbuf) + { + PageSetLSN(writepage, lsn); + MarkBufferDirty(writebuf); + } } /* replay the record for initializing overflow buffer */ @@ -992,10 +1009,11 @@ hash_xlog_vacuum_one_page(XLogReaderState *record) * Hash index records that are marked as LP_DEAD and being removed during * hash index tuple insertion can conflict with standby queries. You might * think that vacuum records would conflict as well, but we've handled - * that already. XLOG_HEAP2_PRUNE records provide the highest xid cleaned - * by the vacuum of the heap and so we can resolve any conflicts just once - * when that arrives. After that we know that no conflicts exist from - * individual hash index vacuum records on that index. + * that already. XLOG_HEAP2_PRUNE_VACUUM_SCAN records provide the highest + * xid cleaned by the vacuum of the heap and so we can resolve any + * conflicts just once when that arrives. After that we know that no + * conflicts exist from individual hash index vacuum records on that + * index. */ if (InHotStandby) { diff --git a/src/backend/access/hash/hashfunc.c b/src/backend/access/hash/hashfunc.c index 37646cc9a109a..c3a67b51afe0b 100644 --- a/src/backend/access/hash/hashfunc.c +++ b/src/backend/access/hash/hashfunc.c @@ -3,7 +3,7 @@ * hashfunc.c * Support functions for hash access method. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -26,11 +26,9 @@ #include "postgres.h" -#include "access/hash.h" -#include "catalog/pg_collation.h" #include "common/hashfn.h" -#include "utils/builtins.h" #include "utils/float.h" +#include "utils/fmgrprotos.h" #include "utils/pg_locale.h" #include "varatt.h" @@ -300,7 +298,9 @@ hashtext(PG_FUNCTION_ARGS) buf = palloc(bsize + 1); rsize = pg_strnxfrm(buf, bsize + 1, keydata, keylen, mylocale); - if (rsize != bsize) + + /* the second call may return a smaller value than the first */ + if (rsize > bsize) elog(ERROR, "pg_strnxfrm() returned unexpected result"); /* @@ -354,7 +354,9 @@ hashtextextended(PG_FUNCTION_ARGS) buf = palloc(bsize + 1); rsize = pg_strnxfrm(buf, bsize + 1, keydata, keylen, mylocale); - if (rsize != bsize) + + /* the second call may return a smaller value than the first */ + if (rsize > bsize) elog(ERROR, "pg_strnxfrm() returned unexpected result"); /* diff --git a/src/backend/access/hash/hashinsert.c b/src/backend/access/hash/hashinsert.c index 22656b24e2051..9ac162041183e 100644 --- a/src/backend/access/hash/hashinsert.c +++ b/src/backend/access/hash/hashinsert.c @@ -3,7 +3,7 @@ * hashinsert.c * Item insertion in hash tables for Postgres. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,8 +19,6 @@ #include "access/hash_xlog.h" #include "access/xloginsert.h" #include "miscadmin.h" -#include "storage/buf_internals.h" -#include "storage/lwlock.h" #include "storage/predicate.h" #include "utils/rel.h" diff --git a/src/backend/access/hash/hashovfl.c b/src/backend/access/hash/hashovfl.c index 39bb2cb9f61e4..c280ae885e37a 100644 --- a/src/backend/access/hash/hashovfl.c +++ b/src/backend/access/hash/hashovfl.c @@ -3,7 +3,7 @@ * hashovfl.c * Overflow page management code for the Postgres hash access method * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -647,6 +647,7 @@ _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf, xl_hash_squeeze_page xlrec; XLogRecPtr recptr; int i; + bool mod_wbuf = false; xlrec.prevblkno = prevblkno; xlrec.nextblkno = nextblkno; @@ -658,20 +659,52 @@ _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf, XLogRegisterData((char *) &xlrec, SizeOfHashSqueezePage); /* - * bucket buffer needs to be registered to ensure that we can acquire - * a cleanup lock on it during replay. + * bucket buffer was not changed, but still needs to be registered to + * ensure that we can acquire a cleanup lock on it during replay. */ if (!xlrec.is_prim_bucket_same_wrt) - XLogRegisterBuffer(0, bucketbuf, REGBUF_STANDARD | REGBUF_NO_IMAGE); + { + uint8 flags = REGBUF_STANDARD | REGBUF_NO_IMAGE | REGBUF_NO_CHANGE; + + XLogRegisterBuffer(0, bucketbuf, flags); + } - XLogRegisterBuffer(1, wbuf, REGBUF_STANDARD); if (xlrec.ntups > 0) { + XLogRegisterBuffer(1, wbuf, REGBUF_STANDARD); + + /* Remember that wbuf is modified. */ + mod_wbuf = true; + XLogRegisterBufData(1, (char *) itup_offsets, nitups * sizeof(OffsetNumber)); for (i = 0; i < nitups; i++) XLogRegisterBufData(1, (char *) itups[i], tups_size[i]); } + else if (xlrec.is_prim_bucket_same_wrt || xlrec.is_prev_bucket_same_wrt) + { + uint8 wbuf_flags; + + /* + * A write buffer needs to be registered even if no tuples are + * added to it to ensure that we can acquire a cleanup lock on it + * if it is the same as primary bucket buffer or update the + * nextblkno if it is same as the previous bucket buffer. + */ + Assert(xlrec.ntups == 0); + + wbuf_flags = REGBUF_STANDARD; + if (!xlrec.is_prev_bucket_same_wrt) + { + wbuf_flags |= REGBUF_NO_CHANGE; + } + else + { + /* Remember that wbuf is modified. */ + mod_wbuf = true; + } + XLogRegisterBuffer(1, wbuf, wbuf_flags); + } XLogRegisterBuffer(2, ovflbuf, REGBUF_STANDARD); @@ -698,7 +731,10 @@ _hash_freeovflpage(Relation rel, Buffer bucketbuf, Buffer ovflbuf, recptr = XLogInsert(RM_HASH_ID, XLOG_HASH_SQUEEZE_PAGE); - PageSetLSN(BufferGetPage(wbuf), recptr); + /* Set LSN iff wbuf is modified. */ + if (mod_wbuf) + PageSetLSN(BufferGetPage(wbuf), recptr); + PageSetLSN(BufferGetPage(ovflbuf), recptr); if (BufferIsValid(prevbuf) && !xlrec.is_prev_bucket_same_wrt) @@ -960,11 +996,16 @@ _hash_squeezebucket(Relation rel, XLogRegisterData((char *) &xlrec, SizeOfHashMovePageContents); /* - * bucket buffer needs to be registered to ensure that - * we can acquire a cleanup lock on it during replay. + * bucket buffer was not changed, but still needs to + * be registered to ensure that we can acquire a + * cleanup lock on it during replay. */ if (!xlrec.is_prim_bucket_same_wrt) - XLogRegisterBuffer(0, bucket_buf, REGBUF_STANDARD | REGBUF_NO_IMAGE); + { + int flags = REGBUF_STANDARD | REGBUF_NO_IMAGE | REGBUF_NO_CHANGE; + + XLogRegisterBuffer(0, bucket_buf, flags); + } XLogRegisterBuffer(1, wbuf, REGBUF_STANDARD); XLogRegisterBufData(1, (char *) itup_offsets, diff --git a/src/backend/access/hash/hashpage.c b/src/backend/access/hash/hashpage.c index af3a154266752..d09c349e28f99 100644 --- a/src/backend/access/hash/hashpage.c +++ b/src/backend/access/hash/hashpage.c @@ -3,7 +3,7 @@ * hashpage.c * Hash table page management code for the Postgres hash access method * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -33,9 +33,9 @@ #include "access/xloginsert.h" #include "miscadmin.h" #include "port/pg_bitutils.h" -#include "storage/lmgr.h" #include "storage/predicate.h" #include "storage/smgr.h" +#include "utils/rel.h" static bool _hash_alloc_buckets(Relation rel, BlockNumber firstblock, uint32 nblocks); @@ -209,7 +209,7 @@ _hash_getnewbuf(Relation rel, BlockNumber blkno, ForkNumber forkNum) /* smgr insists we explicitly extend the relation */ if (blkno == nblocks) { - buf = ExtendBufferedRel(EB_REL(rel), forkNum, NULL, + buf = ExtendBufferedRel(BMR_REL(rel), forkNum, NULL, EB_LOCK_FIRST | EB_SKIP_EXTENSION_LOCK); if (BufferGetBlockNumber(buf) != blkno) elog(ERROR, "unexpected hash relation size: %u, should be %u", diff --git a/src/backend/access/hash/hashsearch.c b/src/backend/access/hash/hashsearch.c index 9ea2a42a07f00..0d99d6abc8669 100644 --- a/src/backend/access/hash/hashsearch.c +++ b/src/backend/access/hash/hashsearch.c @@ -3,7 +3,7 @@ * hashsearch.c * search code for postgres hash tables * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -37,8 +37,8 @@ static void _hash_readnext(IndexScanDesc scan, Buffer *bufp, * be pinned but not locked, and so->currPos.itemIndex identifies * which item was previously returned. * - * On successful exit, scan->xs_ctup.t_self is set to the TID - * of the next heap tuple. so->currPos is updated as needed. + * On successful exit, scan->xs_heaptid is set to the TID of the next + * heap tuple. so->currPos is updated as needed. * * On failure exit (no more tuples), we return false with pin * held on bucket page but no pins or locks held on overflow @@ -71,7 +71,6 @@ _hash_next(IndexScanDesc scan, ScanDirection dir) if (BlockNumberIsValid(blkno)) { buf = _hash_getbuf(rel, blkno, HASH_READ, LH_OVERFLOW_PAGE); - TestForOldSnapshot(scan->xs_snapshot, rel, BufferGetPage(buf)); if (!_hash_readpage(scan, &buf, dir)) end_of_scan = true; } @@ -91,7 +90,6 @@ _hash_next(IndexScanDesc scan, ScanDirection dir) { buf = _hash_getbuf(rel, blkno, HASH_READ, LH_BUCKET_PAGE | LH_OVERFLOW_PAGE); - TestForOldSnapshot(scan->xs_snapshot, rel, BufferGetPage(buf)); /* * We always maintain the pin on bucket page for whole scan @@ -186,7 +184,6 @@ _hash_readnext(IndexScanDesc scan, if (block_found) { *pagep = BufferGetPage(*bufp); - TestForOldSnapshot(scan->xs_snapshot, rel, *pagep); *opaquep = HashPageGetOpaque(*pagep); } } @@ -232,7 +229,6 @@ _hash_readprev(IndexScanDesc scan, *bufp = _hash_getbuf(rel, blkno, HASH_READ, LH_BUCKET_PAGE | LH_OVERFLOW_PAGE); *pagep = BufferGetPage(*bufp); - TestForOldSnapshot(scan->xs_snapshot, rel, *pagep); *opaquep = HashPageGetOpaque(*pagep); /* @@ -283,7 +279,7 @@ _hash_readprev(IndexScanDesc scan, * overflow page, both pin and lock are released whereas if it is a bucket * page then it is pinned but not locked and data about the matching * tuple(s) on the page has been loaded into so->currPos, - * scan->xs_ctup.t_self is set to the heap TID of the current tuple. + * scan->xs_heaptid is set to the heap TID of the current tuple. * * On failure exit (no more tuples), we return false, with pin held on * bucket page but no pins or locks held on overflow page. @@ -351,7 +347,6 @@ _hash_first(IndexScanDesc scan, ScanDirection dir) buf = _hash_getbucketbuf_from_hashkey(rel, hashkey, HASH_READ, NULL); PredicateLockPage(rel, BufferGetBlockNumber(buf), scan->xs_snapshot); page = BufferGetPage(buf); - TestForOldSnapshot(scan->xs_snapshot, rel, page); opaque = HashPageGetOpaque(page); bucket = opaque->hasho_bucket; @@ -387,7 +382,6 @@ _hash_first(IndexScanDesc scan, ScanDirection dir) LockBuffer(buf, BUFFER_LOCK_UNLOCK); old_buf = _hash_getbuf(rel, old_blkno, HASH_READ, LH_BUCKET_PAGE); - TestForOldSnapshot(scan->xs_snapshot, rel, BufferGetPage(old_buf)); /* * remember the split bucket buffer so as to use it later for diff --git a/src/backend/access/hash/hashsort.c b/src/backend/access/hash/hashsort.c index b67b2207c05aa..e608d533629c2 100644 --- a/src/backend/access/hash/hashsort.c +++ b/src/backend/access/hash/hashsort.c @@ -14,7 +14,7 @@ * plenty of locality of access. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -106,7 +106,7 @@ _h_spooldestroy(HSpool *hspool) * spool an index entry into the sort file. */ void -_h_spool(HSpool *hspool, ItemPointer self, Datum *values, bool *isnull) +_h_spool(HSpool *hspool, ItemPointer self, const Datum *values, const bool *isnull) { tuplesort_putindextuplevalues(hspool->sortstate, hspool->index, self, values, isnull); @@ -148,6 +148,9 @@ _h_indexbuild(HSpool *hspool, Relation heapRel) /* the tuples are sorted by hashkey, so pass 'sorted' as true */ _hash_doinsert(hspool->index, itup, heapRel, true); + /* allow insertion phase to be interrupted, and track progress */ + CHECK_FOR_INTERRUPTS(); + pgstat_progress_update_param(PROGRESS_CREATEIDX_TUPLES_DONE, ++tups_done); } diff --git a/src/backend/access/hash/hashutil.c b/src/backend/access/hash/hashutil.c index 88089ce02ba4d..20028f5cd14e1 100644 --- a/src/backend/access/hash/hashutil.c +++ b/src/backend/access/hash/hashutil.c @@ -3,7 +3,7 @@ * hashutil.c * Utility code for Postgres hash implementation. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,7 +18,6 @@ #include "access/reloptions.h" #include "access/relscan.h" #include "port/pg_bitutils.h" -#include "storage/buf_internals.h" #include "utils/lsyscache.h" #include "utils/rel.h" diff --git a/src/backend/access/hash/hashvalidate.c b/src/backend/access/hash/hashvalidate.c index 24bab58499045..40164e2ea2bb8 100644 --- a/src/backend/access/hash/hashvalidate.c +++ b/src/backend/access/hash/hashvalidate.c @@ -3,7 +3,7 @@ * hashvalidate.c * Opclass validator for hash. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/access/hash/meson.build b/src/backend/access/hash/meson.build index 18e0bfbc87947..390e2795e784a 100644 --- a/src/backend/access/hash/meson.build +++ b/src/backend/access/hash/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'hash.c', diff --git a/src/backend/access/heap/README.HOT b/src/backend/access/heap/README.HOT index 6fd1767f707e7..74e407f375aad 100644 --- a/src/backend/access/heap/README.HOT +++ b/src/backend/access/heap/README.HOT @@ -6,7 +6,7 @@ Heap Only Tuples (HOT) The Heap Only Tuple (HOT) feature eliminates redundant index entries and allows the re-use of space taken by DELETEd or obsoleted UPDATEd tuples without performing a table-wide vacuum. It does this by allowing -single-page vacuuming, also called "defragmentation". +single-page vacuuming, also called "defragmentation" or "pruning". Note: there is a Glossary at the end of this document that may be helpful for first-time readers. @@ -31,12 +31,20 @@ corrupt index, in the form of entries pointing to tuple slots that by now contain some unrelated content. In any case we would prefer to be able to do vacuuming without invoking any user-written code. -HOT solves this problem for a restricted but useful special case: -where a tuple is repeatedly updated in ways that do not change its -indexed columns. (Here, "indexed column" means any column referenced +HOT solves this problem for two restricted but useful special cases: + +First, where a tuple is repeatedly updated in ways that do not change +its indexed columns. (Here, "indexed column" means any column referenced at all in an index definition, including for example columns that are tested in a partial-index predicate but are not stored in the index.) +Second, where the modified columns are only used in indexes that do not +contain tuple IDs, but maintain summaries of the indexed data by block. +As these indexes don't contain references to individual tuples, they +can't remove tuple references in VACUUM, and thus don't need to get a new +and unique reference to a tuple. These indexes still need to be notified +of the new column data, but don't need a new HOT chain to be established. + An additional property of HOT is that it reduces index size by avoiding the creation of identically-keyed index entries. This improves search speeds. @@ -102,16 +110,16 @@ This is safe because no index entry points to line pointer 2. Subsequent insertions into the page can now recycle both line pointer 2 and the space formerly used by tuple 2. -If an update changes any indexed column, or there is not room on the -same page for the new tuple, then the HOT chain ends: the last member -has a regular t_ctid link to the next version and is not marked -HEAP_HOT_UPDATED. (In principle we could continue a HOT chain across -pages, but this would destroy the desired property of being able to -reclaim space with just page-local manipulations. Anyway, we don't -want to have to chase through multiple heap pages to get from an index -entry to the desired tuple, so it seems better to create a new index -entry for the new tuple.) If further updates occur, the next version -could become the root of a new HOT chain. +If an update changes any column indexed by a non-summarizing indexes, or +if there is not room on the same page for the new tuple, then the HOT +chain ends: the last member has a regular t_ctid link to the next version +and is not marked HEAP_HOT_UPDATED. (In principle we could continue a +HOT chain across pages, but this would destroy the desired property of +being able to reclaim space with just page-local manipulations. Anyway, +we don't want to have to chase through multiple heap pages to get from an +index entry to the desired tuple, so it seems better to create a new +index entry for the new tuple.) If further updates occur, the next +version could become the root of a new HOT chain. Line pointer 1 has to remain as long as there is any non-dead member of the chain on the page. When there is not, it is marked "dead". @@ -125,15 +133,28 @@ Note: we can use a "dead" line pointer for any DELETEd tuple, whether it was part of a HOT chain or not. This allows space reclamation in advance of running VACUUM for plain DELETEs as well as HOT updates. -The requirement for doing a HOT update is that none of the indexed -columns are changed. This is checked at execution time by comparing the -binary representation of the old and new values. We insist on bitwise -equality rather than using datatype-specific equality routines. The -main reason to avoid the latter is that there might be multiple notions -of equality for a datatype, and we don't know exactly which one is -relevant for the indexes at hand. We assume that bitwise equality +The requirement for doing a HOT update is that indexes which point to +the root line pointer (and thus need to be cleaned up by VACUUM when the +tuple is dead) do not reference columns which are updated in that HOT +chain. Summarizing indexes (such as BRIN) are assumed to have no +references to individual tuples and thus are ignored when checking HOT +applicability. The updated columns are checked at execution time by +comparing the binary representation of the old and new values. We insist +on bitwise equality rather than using datatype-specific equality routines. +The main reason to avoid the latter is that there might be multiple +notions of equality for a datatype, and we don't know exactly which one +is relevant for the indexes at hand. We assume that bitwise equality guarantees equality for all purposes. +If any columns that are included by non-summarizing indexes are updated, +the HOT optimization is not applied, and the new tuple is inserted into +all indexes of the table. If none of the updated columns are included in +the table's indexes, the HOT optimization is applied and no indexes are +updated. If instead the updated columns are only indexed by summarizing +indexes, the HOT optimization is applied, but the update is propagated to +all summarizing indexes. (Realistically, we only need to propagate the +update to the indexes that contain the updated values, but that is yet to +be implemented.) Abort Cases ----------- diff --git a/src/backend/access/heap/README.tuplock b/src/backend/access/heap/README.tuplock index 6441e8baf0e4a..750684d33989c 100644 --- a/src/backend/access/heap/README.tuplock +++ b/src/backend/access/heap/README.tuplock @@ -70,13 +70,8 @@ KEY SHARE conflict When there is a single locker in a tuple, we can just store the locking info in the tuple itself. We do this by storing the locker's Xid in XMAX, and -setting infomask bits specifying the locking strength. There is one exception -here: since infomask space is limited, we do not provide a separate bit -for SELECT FOR SHARE, so we have to use the extended info in a MultiXact in -that case. (The other cases, SELECT FOR UPDATE and SELECT FOR KEY SHARE, are -presumably more commonly used due to being the standards-mandated locking -mechanism, or heavily used by the RI code, so we want to provide fast paths -for those.) +setting infomask bits specifying the locking strength. See "Infomask Bits" +below for details on the bit patterns we use. MultiXacts ---------- @@ -153,3 +148,56 @@ The following infomask bits are applicable: We currently never set the HEAP_XMAX_COMMITTED when the HEAP_XMAX_IS_MULTI bit is set. + +Locking to write inplace-updated tables +--------------------------------------- + +If IsInplaceUpdateRelation() returns true for a table, the table is a system +catalog that receives systable_inplace_update_begin() calls. Preparing a +heap_update() of these tables follows additional locking rules, to ensure we +don't lose the effects of an inplace update. In particular, consider a moment +when a backend has fetched the old tuple to modify, not yet having called +heap_update(). Another backend's inplace update starting then can't conclude +until the heap_update() places its new tuple in a buffer. We enforce that +using locktags as follows. While DDL code is the main audience, the executor +follows these rules to make e.g. "MERGE INTO pg_class" safer. Locking rules +are per-catalog: + + pg_class systable_inplace_update_begin() callers: before the call, acquire a + lock on the relation in mode ShareUpdateExclusiveLock or stricter. If the + update targets a row of RELKIND_INDEX (but not RELKIND_PARTITIONED_INDEX), + that lock must be on the table. Locking the index rel is not necessary. + (This allows VACUUM to overwrite per-index pg_class while holding a lock on + the table alone.) systable_inplace_update_begin() acquires and releases + LOCKTAG_TUPLE in InplaceUpdateTupleLock, an alias for ExclusiveLock, on each + tuple it overwrites. + + pg_class heap_update() callers: before copying the tuple to modify, take a + lock on the tuple, a ShareUpdateExclusiveLock on the relation, or a + ShareRowExclusiveLock or stricter on the relation. + + SearchSysCacheLocked1() is one convenient way to acquire the tuple lock. + Most heap_update() callers already hold a suitable lock on the relation for + other reasons and can skip the tuple lock. If you do acquire the tuple + lock, release it immediately after the update. + + + pg_database: before copying the tuple to modify, all updaters of pg_database + rows acquire LOCKTAG_TUPLE. (Few updaters acquire LOCKTAG_OBJECT on the + database OID, so it wasn't worth extending that as a second option.) + +Ideally, DDL might want to perform permissions checks before LockTuple(), as +we do with RangeVarGetRelidExtended() callbacks. We typically don't bother. +LOCKTAG_TUPLE acquirers release it after each row, so the potential +inconvenience is lower. + +Reading inplace-updated columns +------------------------------- + +Inplace updates create an exception to the rule that tuple data won't change +under a reader holding a pin. A reader of a heap_fetch() result tuple may +witness a torn read. Current inplace-updated fields are aligned and are no +wider than four bytes, and current readers don't need consistency across +fields. Hence, they get by with just fetching each field once. XXX such a +caller may also read a value that has not reached WAL; see +systable_inplace_update_finish(). diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 7ed72abe597a4..95e3be524a7f8 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -3,7 +3,7 @@ * heapam.c * heap access method code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -32,7 +32,6 @@ #include "postgres.h" #include "access/bufmask.h" -#include "access/genam.h" #include "access/heapam.h" #include "access/heapam_xlog.h" #include "access/heaptoast.h" @@ -52,6 +51,8 @@ #include "access/xloginsert.h" #include "access/xlogutils.h" #include "catalog/catalog.h" +#include "catalog/pg_database.h" +#include "catalog/pg_database_d.h" #include "commands/vacuum.h" #include "miscadmin.h" #include "pgstat.h" @@ -62,15 +63,14 @@ #include "storage/lmgr.h" #include "storage/predicate.h" #include "storage/procarray.h" -#include "storage/smgr.h" -#include "storage/spin.h" #include "storage/standby.h" #include "utils/datum.h" +#include "utils/injection_point.h" #include "utils/inval.h" -#include "utils/lsyscache.h" #include "utils/relcache.h" #include "utils/snapmgr.h" #include "utils/spccache.h" +#include "utils/syscache.h" static HeapTuple heap_prepare_insert(Relation relation, HeapTuple tup, @@ -79,6 +79,12 @@ static XLogRecPtr log_heap_update(Relation reln, Buffer oldbuf, Buffer newbuf, HeapTuple oldtup, HeapTuple newtup, HeapTuple old_key_tuple, bool all_visible_cleared, bool new_all_visible_cleared); +#ifdef USE_ASSERT_CHECKING +static void check_lock_if_inplace_updateable_rel(Relation relation, + ItemPointer otid, + HeapTuple newtup); +static void check_inplace_rel_lock(HeapTuple oldtup); +#endif static Bitmapset *HeapDetermineColumnsInfo(Relation relation, Bitmapset *interesting_cols, Bitmapset *external_cols, @@ -87,6 +93,11 @@ static Bitmapset *HeapDetermineColumnsInfo(Relation relation, static bool heap_acquire_tuplock(Relation relation, ItemPointer tid, LockTupleMode mode, LockWaitPolicy wait_policy, bool *have_tuple_lock); +static inline BlockNumber heapgettup_advance_block(HeapScanDesc scan, + BlockNumber block, + ScanDirection dir); +static pg_noinline BlockNumber heapgettup_initial_block(HeapScanDesc scan, + ScanDirection dir); static void compute_new_xmax_infomask(TransactionId xmax, uint16 old_infomask, uint16 old_infomask2, TransactionId add_to_xmax, LockTupleMode mode, bool is_update, @@ -95,9 +106,6 @@ static void compute_new_xmax_infomask(TransactionId xmax, uint16 old_infomask, static TM_Result heap_lock_updated_tuple(Relation rel, HeapTuple tuple, ItemPointer ctid, TransactionId xid, LockTupleMode mode); -static int heap_log_freeze_plan(HeapTupleFreeze *tuples, int ntuples, - xl_heap_freeze_plan *plans_out, - OffsetNumber *offsets_out); static void GetMultiXactIdHintBits(MultiXactId multi, uint16 *new_infomask, uint16 *new_infomask2); static TransactionId MultiXactIdGetUpdateXid(TransactionId xmax, @@ -123,6 +131,8 @@ static HeapTuple ExtractReplicaIdentity(Relation relation, HeapTuple tp, bool ke * heavyweight lock mode and MultiXactStatus values to use for any particular * tuple lock strength. * + * These interact with InplaceUpdateTupleLock, an alias for ExclusiveLock. + * * Don't look at lockstatus/updstatus directly! Use get_mxact_status_for_lock * instead. */ @@ -225,6 +235,68 @@ static const int MultiXactStatusLock[MaxMultiXactStatus + 1] = * ---------------------------------------------------------------- */ +/* + * Streaming read API callback for parallel sequential scans. Returns the next + * block the caller wants from the read stream or InvalidBlockNumber when done. + */ +static BlockNumber +heap_scan_stream_read_next_parallel(ReadStream *stream, + void *callback_private_data, + void *per_buffer_data) +{ + HeapScanDesc scan = (HeapScanDesc) callback_private_data; + + Assert(ScanDirectionIsForward(scan->rs_dir)); + Assert(scan->rs_base.rs_parallel); + + if (unlikely(!scan->rs_inited)) + { + /* parallel scan */ + table_block_parallelscan_startblock_init(scan->rs_base.rs_rd, + scan->rs_parallelworkerdata, + (ParallelBlockTableScanDesc) scan->rs_base.rs_parallel); + + /* may return InvalidBlockNumber if there are no more blocks */ + scan->rs_prefetch_block = table_block_parallelscan_nextpage(scan->rs_base.rs_rd, + scan->rs_parallelworkerdata, + (ParallelBlockTableScanDesc) scan->rs_base.rs_parallel); + scan->rs_inited = true; + } + else + { + scan->rs_prefetch_block = table_block_parallelscan_nextpage(scan->rs_base.rs_rd, + scan->rs_parallelworkerdata, (ParallelBlockTableScanDesc) + scan->rs_base.rs_parallel); + } + + return scan->rs_prefetch_block; +} + +/* + * Streaming read API callback for serial sequential and TID range scans. + * Returns the next block the caller wants from the read stream or + * InvalidBlockNumber when done. + */ +static BlockNumber +heap_scan_stream_read_next_serial(ReadStream *stream, + void *callback_private_data, + void *per_buffer_data) +{ + HeapScanDesc scan = (HeapScanDesc) callback_private_data; + + if (unlikely(!scan->rs_inited)) + { + scan->rs_prefetch_block = heapgettup_initial_block(scan, scan->rs_dir); + scan->rs_inited = true; + } + else + scan->rs_prefetch_block = heapgettup_advance_block(scan, + scan->rs_prefetch_block, + scan->rs_dir); + + return scan->rs_prefetch_block; +} + /* ---------------- * initscan - scan code common to heap_beginscan and heap_rescan * ---------------- @@ -327,6 +399,13 @@ initscan(HeapScanDesc scan, ScanKey key, bool keep_startblock) scan->rs_cbuf = InvalidBuffer; scan->rs_cblock = InvalidBlockNumber; + /* + * Initialize to ForwardScanDirection because it is most common and + * because heap scans go forward before going backward (e.g. CURSORs). + */ + scan->rs_dir = ForwardScanDirection; + scan->rs_prefetch_block = InvalidBlockNumber; + /* page-at-a-time fields are always invalid when not rs_inited */ /* @@ -367,49 +446,77 @@ heap_setscanlimits(TableScanDesc sscan, BlockNumber startBlk, BlockNumber numBlk } /* - * heapgetpage - subroutine for heapgettup() + * Per-tuple loop for heap_prepare_pagescan(). Pulled out so it can be called + * multiple times, with constant arguments for all_visible, + * check_serializable. + */ +pg_attribute_always_inline +static int +page_collect_tuples(HeapScanDesc scan, Snapshot snapshot, + Page page, Buffer buffer, + BlockNumber block, int lines, + bool all_visible, bool check_serializable) +{ + int ntup = 0; + OffsetNumber lineoff; + + for (lineoff = FirstOffsetNumber; lineoff <= lines; lineoff++) + { + ItemId lpp = PageGetItemId(page, lineoff); + HeapTupleData loctup; + bool valid; + + if (!ItemIdIsNormal(lpp)) + continue; + + loctup.t_data = (HeapTupleHeader) PageGetItem(page, lpp); + loctup.t_len = ItemIdGetLength(lpp); + loctup.t_tableOid = RelationGetRelid(scan->rs_base.rs_rd); + ItemPointerSet(&(loctup.t_self), block, lineoff); + + if (all_visible) + valid = true; + else + valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer); + + if (check_serializable) + HeapCheckForSerializableConflictOut(valid, scan->rs_base.rs_rd, + &loctup, buffer, snapshot); + + if (valid) + { + scan->rs_vistuples[ntup] = lineoff; + ntup++; + } + } + + Assert(ntup <= MaxHeapTuplesPerPage); + + return ntup; +} + +/* + * heap_prepare_pagescan - Prepare current scan page to be scanned in pagemode * - * This routine reads and pins the specified page of the relation. - * In page-at-a-time mode it performs additional work, namely determining - * which tuples on the page are visible. + * Preparation currently consists of 1. prune the scan's rs_cbuf page, and 2. + * fill the rs_vistuples[] array with the OffsetNumbers of visible tuples. */ void -heapgetpage(TableScanDesc sscan, BlockNumber block) +heap_prepare_pagescan(TableScanDesc sscan) { HeapScanDesc scan = (HeapScanDesc) sscan; - Buffer buffer; + Buffer buffer = scan->rs_cbuf; + BlockNumber block = scan->rs_cblock; Snapshot snapshot; Page page; int lines; - int ntup; - OffsetNumber lineoff; bool all_visible; + bool check_serializable; - Assert(block < scan->rs_nblocks); - - /* release previous scan buffer, if any */ - if (BufferIsValid(scan->rs_cbuf)) - { - ReleaseBuffer(scan->rs_cbuf); - scan->rs_cbuf = InvalidBuffer; - } - - /* - * Be sure to check for interrupts at least once per page. Checks at - * higher code levels won't be able to stop a seqscan that encounters many - * pages' worth of consecutive dead tuples. - */ - CHECK_FOR_INTERRUPTS(); + Assert(BufferGetBlockNumber(buffer) == block); - /* read page using selected strategy */ - scan->rs_cbuf = ReadBufferExtended(scan->rs_base.rs_rd, MAIN_FORKNUM, block, - RBM_NORMAL, scan->rs_strategy); - scan->rs_cblock = block; - - if (!(scan->rs_base.rs_flags & SO_ALLOW_PAGEMODE)) - return; - - buffer = scan->rs_cbuf; + /* ensure we're not accidentally being used when not in pagemode */ + Assert(scan->rs_base.rs_flags & SO_ALLOW_PAGEMODE); snapshot = scan->rs_base.rs_snapshot; /* @@ -425,9 +532,7 @@ heapgetpage(TableScanDesc sscan, BlockNumber block) LockBuffer(buffer, BUFFER_LOCK_SHARE); page = BufferGetPage(buffer); - TestForOldSnapshot(snapshot, scan->rs_base.rs_rd, page); lines = PageGetMaxOffsetNumber(page); - ntup = 0; /* * If the all-visible flag indicates that all tuples on the page are @@ -450,37 +555,79 @@ heapgetpage(TableScanDesc sscan, BlockNumber block) * tuple for visibility the hard way. */ all_visible = PageIsAllVisible(page) && !snapshot->takenDuringRecovery; + check_serializable = + CheckForSerializableConflictOutNeeded(scan->rs_base.rs_rd, snapshot); - for (lineoff = FirstOffsetNumber; lineoff <= lines; lineoff++) + /* + * We call page_collect_tuples() with constant arguments, to get the + * compiler to constant fold the constant arguments. Separate calls with + * constant arguments, rather than variables, are needed on several + * compilers to actually perform constant folding. + */ + if (likely(all_visible)) { - ItemId lpp = PageGetItemId(page, lineoff); - HeapTupleData loctup; - bool valid; + if (likely(!check_serializable)) + scan->rs_ntuples = page_collect_tuples(scan, snapshot, page, buffer, + block, lines, true, false); + else + scan->rs_ntuples = page_collect_tuples(scan, snapshot, page, buffer, + block, lines, true, true); + } + else + { + if (likely(!check_serializable)) + scan->rs_ntuples = page_collect_tuples(scan, snapshot, page, buffer, + block, lines, false, false); + else + scan->rs_ntuples = page_collect_tuples(scan, snapshot, page, buffer, + block, lines, false, true); + } - if (!ItemIdIsNormal(lpp)) - continue; + LockBuffer(buffer, BUFFER_LOCK_UNLOCK); +} - loctup.t_tableOid = RelationGetRelid(scan->rs_base.rs_rd); - loctup.t_data = (HeapTupleHeader) PageGetItem(page, lpp); - loctup.t_len = ItemIdGetLength(lpp); - ItemPointerSet(&(loctup.t_self), block, lineoff); +/* + * heap_fetch_next_buffer - read and pin the next block from MAIN_FORKNUM. + * + * Read the next block of the scan relation from the read stream and save it + * in the scan descriptor. It is already pinned. + */ +static inline void +heap_fetch_next_buffer(HeapScanDesc scan, ScanDirection dir) +{ + Assert(scan->rs_read_stream); - if (all_visible) - valid = true; - else - valid = HeapTupleSatisfiesVisibility(&loctup, snapshot, buffer); + /* release previous scan buffer, if any */ + if (BufferIsValid(scan->rs_cbuf)) + { + ReleaseBuffer(scan->rs_cbuf); + scan->rs_cbuf = InvalidBuffer; + } - HeapCheckForSerializableConflictOut(valid, scan->rs_base.rs_rd, - &loctup, buffer, snapshot); + /* + * Be sure to check for interrupts at least once per page. Checks at + * higher code levels won't be able to stop a seqscan that encounters many + * pages' worth of consecutive dead tuples. + */ + CHECK_FOR_INTERRUPTS(); - if (valid) - scan->rs_vistuples[ntup++] = lineoff; + /* + * If the scan direction is changing, reset the prefetch block to the + * current block. Otherwise, we will incorrectly prefetch the blocks + * between the prefetch block and the current block again before + * prefetching blocks in the new, correct scan direction. + */ + if (unlikely(scan->rs_dir != dir)) + { + scan->rs_prefetch_block = scan->rs_cblock; + read_stream_reset(scan->rs_read_stream); } - LockBuffer(buffer, BUFFER_LOCK_UNLOCK); + scan->rs_dir = dir; - Assert(ntup <= MaxHeapTuplesPerPage); - scan->rs_ntuples = ntup; + scan->rs_cbuf = read_stream_next_buffer(scan->rs_read_stream, NULL); + if (BufferIsValid(scan->rs_cbuf)) + scan->rs_cblock = BufferGetBlockNumber(scan->rs_cbuf); } /* @@ -490,10 +637,11 @@ heapgetpage(TableScanDesc sscan, BlockNumber block) * occur with empty tables and in parallel scans when parallel workers get all * of the pages before we can get a chance to get our first page. */ -static BlockNumber +static pg_noinline BlockNumber heapgettup_initial_block(HeapScanDesc scan, ScanDirection dir) { Assert(!scan->rs_inited); + Assert(scan->rs_base.rs_parallel == NULL); /* When there are no pages to scan, return InvalidBlockNumber */ if (scan->rs_nblocks == 0 || scan->rs_numblocks == 0) @@ -501,27 +649,10 @@ heapgettup_initial_block(HeapScanDesc scan, ScanDirection dir) if (ScanDirectionIsForward(dir)) { - /* serial scan */ - if (scan->rs_base.rs_parallel == NULL) - return scan->rs_startblock; - else - { - /* parallel scan */ - table_block_parallelscan_startblock_init(scan->rs_base.rs_rd, - scan->rs_parallelworkerdata, - (ParallelBlockTableScanDesc) scan->rs_base.rs_parallel); - - /* may return InvalidBlockNumber if there are no more blocks */ - return table_block_parallelscan_nextpage(scan->rs_base.rs_rd, - scan->rs_parallelworkerdata, - (ParallelBlockTableScanDesc) scan->rs_base.rs_parallel); - } + return scan->rs_startblock; } else { - /* backward parallel scan not supported */ - Assert(scan->rs_base.rs_parallel == NULL); - /* * Disable reporting to syncscan logic in a backwards scan; it's not * very likely anyone else is doing the same thing at the same time, @@ -565,8 +696,6 @@ heapgettup_start_page(HeapScanDesc scan, ScanDirection dir, int *linesleft, /* Caller is responsible for ensuring buffer is locked if needed */ page = BufferGetPage(scan->rs_cbuf); - TestForOldSnapshot(scan->rs_base.rs_snapshot, scan->rs_base.rs_rd, page); - *linesleft = PageGetMaxOffsetNumber(page) - FirstOffsetNumber + 1; if (ScanDirectionIsForward(dir)) @@ -598,8 +727,6 @@ heapgettup_continue_page(HeapScanDesc scan, ScanDirection dir, int *linesleft, /* Caller is responsible for ensuring buffer is locked if needed */ page = BufferGetPage(scan->rs_cbuf); - TestForOldSnapshot(scan->rs_base.rs_snapshot, scan->rs_base.rs_rd, page); - if (ScanDirectionIsForward(dir)) { *lineoff = OffsetNumberNext(scan->rs_coffset); @@ -621,7 +748,7 @@ heapgettup_continue_page(HeapScanDesc scan, ScanDirection dir, int *linesleft, } /* - * heapgettup_advance_block - helper for heapgettup() and heapgettup_pagemode() + * heapgettup_advance_block - helper for heap_fetch_next_buffer() * * Given the current block number, the scan direction, and various information * contained in the scan descriptor, calculate the BlockNumber to scan next @@ -637,50 +764,43 @@ heapgettup_continue_page(HeapScanDesc scan, ScanDirection dir, int *linesleft, static inline BlockNumber heapgettup_advance_block(HeapScanDesc scan, BlockNumber block, ScanDirection dir) { - if (ScanDirectionIsForward(dir)) - { - if (scan->rs_base.rs_parallel == NULL) - { - block++; + Assert(scan->rs_base.rs_parallel == NULL); - /* wrap back to the start of the heap */ - if (block >= scan->rs_nblocks) - block = 0; + if (likely(ScanDirectionIsForward(dir))) + { + block++; - /* we're done if we're back at where we started */ - if (block == scan->rs_startblock) - return InvalidBlockNumber; + /* wrap back to the start of the heap */ + if (block >= scan->rs_nblocks) + block = 0; - /* check if the limit imposed by heap_setscanlimits() is met */ - if (scan->rs_numblocks != InvalidBlockNumber) - { - if (--scan->rs_numblocks == 0) - return InvalidBlockNumber; - } + /* + * Report our new scan position for synchronization purposes. We don't + * do that when moving backwards, however. That would just mess up any + * other forward-moving scanners. + * + * Note: we do this before checking for end of scan so that the final + * state of the position hint is back at the start of the rel. That's + * not strictly necessary, but otherwise when you run the same query + * multiple times the starting position would shift a little bit + * backwards on every invocation, which is confusing. We don't + * guarantee any specific ordering in general, though. + */ + if (scan->rs_base.rs_flags & SO_ALLOW_SYNC) + ss_report_location(scan->rs_base.rs_rd, block); - /* - * Report our new scan position for synchronization purposes. We - * don't do that when moving backwards, however. That would just - * mess up any other forward-moving scanners. - * - * Note: we do this before checking for end of scan so that the - * final state of the position hint is back at the start of the - * rel. That's not strictly necessary, but otherwise when you run - * the same query multiple times the starting position would shift - * a little bit backwards on every invocation, which is confusing. - * We don't guarantee any specific ordering in general, though. - */ - if (scan->rs_base.rs_flags & SO_ALLOW_SYNC) - ss_report_location(scan->rs_base.rs_rd, block); + /* we're done if we're back at where we started */ + if (block == scan->rs_startblock) + return InvalidBlockNumber; - return block; - } - else + /* check if the limit imposed by heap_setscanlimits() is met */ + if (scan->rs_numblocks != InvalidBlockNumber) { - return table_block_parallelscan_nextpage(scan->rs_base.rs_rd, - scan->rs_parallelworkerdata, (ParallelBlockTableScanDesc) - scan->rs_base.rs_parallel); + if (--scan->rs_numblocks == 0) + return InvalidBlockNumber; } + + return block; } else { @@ -732,23 +852,13 @@ heapgettup(HeapScanDesc scan, ScanKey key) { HeapTuple tuple = &(scan->rs_ctup); - BlockNumber block; Page page; OffsetNumber lineoff; int linesleft; - if (unlikely(!scan->rs_inited)) - { - block = heapgettup_initial_block(scan, dir); - /* ensure rs_cbuf is invalid when we get InvalidBlockNumber */ - Assert(block != InvalidBlockNumber || !BufferIsValid(scan->rs_cbuf)); - scan->rs_inited = true; - } - else + if (likely(scan->rs_inited)) { /* continue from previously returned page/tuple */ - block = scan->rs_cblock; - LockBuffer(scan->rs_cbuf, BUFFER_LOCK_SHARE); page = heapgettup_continue_page(scan, dir, &linesleft, &lineoff); goto continue_page; @@ -758,9 +868,16 @@ heapgettup(HeapScanDesc scan, * advance the scan until we find a qualifying tuple or run out of stuff * to scan */ - while (block != InvalidBlockNumber) + while (true) { - heapgetpage((TableScanDesc) scan, block); + heap_fetch_next_buffer(scan, dir); + + /* did we run out of blocks to scan? */ + if (!BufferIsValid(scan->rs_cbuf)) + break; + + Assert(BufferGetBlockNumber(scan->rs_cbuf) == scan->rs_cblock); + LockBuffer(scan->rs_cbuf, BUFFER_LOCK_SHARE); page = heapgettup_start_page(scan, dir, &linesleft, &lineoff); continue_page: @@ -782,7 +899,7 @@ heapgettup(HeapScanDesc scan, tuple->t_data = (HeapTupleHeader) PageGetItem(page, lpp); tuple->t_len = ItemIdGetLength(lpp); - ItemPointerSet(&(tuple->t_self), block, lineoff); + ItemPointerSet(&(tuple->t_self), scan->rs_cblock, lineoff); visible = HeapTupleSatisfiesVisibility(tuple, scan->rs_base.rs_snapshot, @@ -812,9 +929,6 @@ heapgettup(HeapScanDesc scan, * it's time to move to the next. */ LockBuffer(scan->rs_cbuf, BUFFER_LOCK_UNLOCK); - - /* get the BlockNumber to scan next */ - block = heapgettup_advance_block(scan, block, dir); } /* end of scan */ @@ -823,6 +937,7 @@ heapgettup(HeapScanDesc scan, scan->rs_cbuf = InvalidBuffer; scan->rs_cblock = InvalidBlockNumber; + scan->rs_prefetch_block = InvalidBlockNumber; tuple->t_data = NULL; scan->rs_inited = false; } @@ -834,9 +949,9 @@ heapgettup(HeapScanDesc scan, * * The internal logic is much the same as heapgettup's too, but there are some * differences: we do not take the buffer content lock (that only needs to - * happen inside heapgetpage), and we iterate through just the tuples listed - * in rs_vistuples[] rather than all tuples on the page. Notice that - * lineindex is 0-based, where the corresponding loop variable lineoff in + * happen inside heap_prepare_pagescan), and we iterate through just the + * tuples listed in rs_vistuples[] rather than all tuples on the page. Notice + * that lineindex is 0-based, where the corresponding loop variable lineoff in * heapgettup is 1-based. * ---------------- */ @@ -847,24 +962,14 @@ heapgettup_pagemode(HeapScanDesc scan, ScanKey key) { HeapTuple tuple = &(scan->rs_ctup); - BlockNumber block; Page page; int lineindex; int linesleft; - if (unlikely(!scan->rs_inited)) - { - block = heapgettup_initial_block(scan, dir); - /* ensure rs_cbuf is invalid when we get InvalidBlockNumber */ - Assert(block != InvalidBlockNumber || !BufferIsValid(scan->rs_cbuf)); - scan->rs_inited = true; - } - else + if (likely(scan->rs_inited)) { /* continue from previously returned page/tuple */ - block = scan->rs_cblock; /* current page */ page = BufferGetPage(scan->rs_cbuf); - TestForOldSnapshot(scan->rs_base.rs_snapshot, scan->rs_base.rs_rd, page); lineindex = scan->rs_cindex + dir; if (ScanDirectionIsForward(dir)) @@ -880,11 +985,19 @@ heapgettup_pagemode(HeapScanDesc scan, * advance the scan until we find a qualifying tuple or run out of stuff * to scan */ - while (block != InvalidBlockNumber) + while (true) { - heapgetpage((TableScanDesc) scan, block); + heap_fetch_next_buffer(scan, dir); + + /* did we run out of blocks to scan? */ + if (!BufferIsValid(scan->rs_cbuf)) + break; + + Assert(BufferGetBlockNumber(scan->rs_cbuf) == scan->rs_cblock); + + /* prune the page and determine visible tuple offsets */ + heap_prepare_pagescan((TableScanDesc) scan); page = BufferGetPage(scan->rs_cbuf); - TestForOldSnapshot(scan->rs_base.rs_snapshot, scan->rs_base.rs_rd, page); linesleft = scan->rs_ntuples; lineindex = ScanDirectionIsForward(dir) ? 0 : linesleft - 1; @@ -902,7 +1015,7 @@ heapgettup_pagemode(HeapScanDesc scan, tuple->t_data = (HeapTupleHeader) PageGetItem(page, lpp); tuple->t_len = ItemIdGetLength(lpp); - ItemPointerSet(&(tuple->t_self), block, lineoff); + ItemPointerSet(&(tuple->t_self), scan->rs_cblock, lineoff); /* skip any tuples that don't match the scan key */ if (key != NULL && @@ -913,9 +1026,6 @@ heapgettup_pagemode(HeapScanDesc scan, scan->rs_cindex = lineindex; return; } - - /* get the BlockNumber to scan next */ - block = heapgettup_advance_block(scan, block, dir); } /* end of scan */ @@ -923,6 +1033,7 @@ heapgettup_pagemode(HeapScanDesc scan, ReleaseBuffer(scan->rs_cbuf); scan->rs_cbuf = InvalidBuffer; scan->rs_cblock = InvalidBlockNumber; + scan->rs_prefetch_block = InvalidBlockNumber; tuple->t_data = NULL; scan->rs_inited = false; } @@ -962,6 +1073,8 @@ heap_beginscan(Relation relation, Snapshot snapshot, scan->rs_base.rs_flags = flags; scan->rs_base.rs_parallel = parallel_scan; scan->rs_strategy = NULL; /* set in initscan */ + scan->rs_vmbuffer = InvalidBuffer; + scan->rs_empty_tuples_pending = 0; /* * Disable page-at-a-time mode if it's not a MVCC-safe snapshot. @@ -1016,6 +1129,33 @@ heap_beginscan(Relation relation, Snapshot snapshot, initscan(scan, key, false); + scan->rs_read_stream = NULL; + + /* + * Set up a read stream for sequential scans and TID range scans. This + * should be done after initscan() because initscan() allocates the + * BufferAccessStrategy object passed to the read stream API. + */ + if (scan->rs_base.rs_flags & SO_TYPE_SEQSCAN || + scan->rs_base.rs_flags & SO_TYPE_TIDRANGESCAN) + { + ReadStreamBlockNumberCB cb; + + if (scan->rs_base.rs_parallel) + cb = heap_scan_stream_read_next_parallel; + else + cb = heap_scan_stream_read_next_serial; + + scan->rs_read_stream = read_stream_begin_relation(READ_STREAM_SEQUENTIAL, + scan->rs_strategy, + scan->rs_base.rs_rd, + MAIN_FORKNUM, + cb, + scan, + 0); + } + + return (TableScanDesc) scan; } @@ -1050,6 +1190,27 @@ heap_rescan(TableScanDesc sscan, ScanKey key, bool set_params, if (BufferIsValid(scan->rs_cbuf)) ReleaseBuffer(scan->rs_cbuf); + if (BufferIsValid(scan->rs_vmbuffer)) + { + ReleaseBuffer(scan->rs_vmbuffer); + scan->rs_vmbuffer = InvalidBuffer; + } + + /* + * Reset rs_empty_tuples_pending, a field only used by bitmap heap scan, + * to avoid incorrectly emitting NULL-filled tuples from a previous scan + * on rescan. + */ + scan->rs_empty_tuples_pending = 0; + + /* + * The read stream is reset on rescan. This must be done before + * initscan(), as some state referred to by read_stream_reset() is reset + * in initscan(). + */ + if (scan->rs_read_stream) + read_stream_reset(scan->rs_read_stream); + /* * reinitialize scan descriptor */ @@ -1069,6 +1230,15 @@ heap_endscan(TableScanDesc sscan) if (BufferIsValid(scan->rs_cbuf)) ReleaseBuffer(scan->rs_cbuf); + if (BufferIsValid(scan->rs_vmbuffer)) + ReleaseBuffer(scan->rs_vmbuffer); + + /* + * Must free the read stream before freeing the BufferAccessStrategy. + */ + if (scan->rs_read_stream) + read_stream_end(scan->rs_read_stream); + /* * decrement relation reference count and free scan descriptor storage */ @@ -1372,7 +1542,6 @@ heap_fetch(Relation relation, */ LockBuffer(buffer, BUFFER_LOCK_SHARE); page = BufferGetPage(buffer); - TestForOldSnapshot(snapshot, relation, page); /* * We'd better check for out-of-range offnum in case of VACUUM since the @@ -1663,7 +1832,6 @@ heap_get_latest_tid(TableScanDesc sscan, buffer = ReadBuffer(relation, ItemPointerGetBlockNumber(&ctid)); LockBuffer(buffer, BUFFER_LOCK_SHARE); page = BufferGetPage(buffer); - TestForOldSnapshot(snapshot, relation, page); /* * Check for bogus item number. This is not treated as an error @@ -1776,6 +1944,7 @@ GetBulkInsertState(void) bistate->current_buf = InvalidBuffer; bistate->next_free = InvalidBlockNumber; bistate->last_free = InvalidBlockNumber; + bistate->already_extended_by = 0; return bistate; } @@ -1800,6 +1969,17 @@ ReleaseBulkInsertStatePin(BulkInsertState bistate) if (bistate->current_buf != InvalidBuffer) ReleaseBuffer(bistate->current_buf); bistate->current_buf = InvalidBuffer; + + /* + * Despite the name, we also reset bulk relation extension state. + * Otherwise we can end up erroring out due to looking for free space in + * ->next_free of one partition, even though ->next_free was set when + * extending another partition. It could obviously also be bad for + * efficiency to look at existing blocks at offsets from another + * partition, even if we don't error out. + */ + bistate->next_free = InvalidBlockNumber; + bistate->last_free = InvalidBlockNumber; } @@ -2705,13 +2885,7 @@ heap_delete(Relation relation, ItemPointer tid, result = TM_Deleted; } - if (crosscheck != InvalidSnapshot && result == TM_Ok) - { - /* Perform additional check for transaction-snapshot mode RI updates */ - if (!HeapTupleSatisfiesVisibility(&tp, crosscheck, buffer)) - result = TM_Updated; - } - + /* sanity check the result HeapTupleSatisfiesUpdate() and the logic above */ if (result != TM_Ok) { Assert(result == TM_SelfModified || @@ -2721,6 +2895,17 @@ heap_delete(Relation relation, ItemPointer tid, Assert(!(tp.t_data->t_infomask & HEAP_XMAX_INVALID)); Assert(result != TM_Updated || !ItemPointerEquals(&tp.t_self, &tp.t_data->t_ctid)); + } + + if (crosscheck != InvalidSnapshot && result == TM_Ok) + { + /* Perform additional check for transaction-snapshot mode RI updates */ + if (!HeapTupleSatisfiesVisibility(&tp, crosscheck, buffer)) + result = TM_Updated; + } + + if (result != TM_Ok) + { tmfd->ctid = tp.t_data->t_ctid; tmfd->xmax = HeapTupleHeaderGetUpdateXid(tp.t_data); if (result == TM_SelfModified) @@ -3034,6 +3219,10 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, (errcode(ERRCODE_INVALID_TRANSACTION_STATE), errmsg("cannot update tuples during a parallel operation"))); +#ifdef USE_ASSERT_CHECKING + check_lock_if_inplace_updateable_rel(relation, otid, newtup); +#endif + /* * Fetch the list of attributes to be checked for various operations. * @@ -3064,6 +3253,7 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, interesting_attrs = bms_add_members(interesting_attrs, id_attrs); block = ItemPointerGetBlockNumber(otid); + INJECTION_POINT("heap_update-before-pin"); buffer = ReadBuffer(relation, block); page = BufferGetPage(buffer); @@ -3079,7 +3269,51 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); lp = PageGetItemId(page, ItemPointerGetOffsetNumber(otid)); - Assert(ItemIdIsNormal(lp)); + + /* + * Usually, a buffer pin and/or snapshot blocks pruning of otid, ensuring + * we see LP_NORMAL here. When the otid origin is a syscache, we may have + * neither a pin nor a snapshot. Hence, we may see other LP_ states, each + * of which indicates concurrent pruning. + * + * Failing with TM_Updated would be most accurate. However, unlike other + * TM_Updated scenarios, we don't know the successor ctid in LP_UNUSED and + * LP_DEAD cases. While the distinction between TM_Updated and TM_Deleted + * does matter to SQL statements UPDATE and MERGE, those SQL statements + * hold a snapshot that ensures LP_NORMAL. Hence, the choice between + * TM_Updated and TM_Deleted affects only the wording of error messages. + * Settle on TM_Deleted, for two reasons. First, it avoids complicating + * the specification of when tmfd->ctid is valid. Second, it creates + * error log evidence that we took this branch. + * + * Since it's possible to see LP_UNUSED at otid, it's also possible to see + * LP_NORMAL for a tuple that replaced LP_UNUSED. If it's a tuple for an + * unrelated row, we'll fail with "duplicate key value violates unique". + * XXX if otid is the live, newer version of the newtup row, we'll discard + * changes originating in versions of this catalog row after the version + * the caller got from syscache. See syscache-update-pruned.spec. + */ + if (!ItemIdIsNormal(lp)) + { + Assert(RelationSupportsSysCache(RelationGetRelid(relation))); + + UnlockReleaseBuffer(buffer); + Assert(!have_tuple_lock); + if (vmbuffer != InvalidBuffer) + ReleaseBuffer(vmbuffer); + tmfd->ctid = *otid; + tmfd->xmax = InvalidTransactionId; + tmfd->cmax = InvalidCommandId; + *update_indexes = TU_None; + + bms_free(hot_attrs); + bms_free(sum_attrs); + bms_free(key_attrs); + bms_free(id_attrs); + /* modified_attrs not yet initialized */ + bms_free(interesting_attrs); + return TM_Deleted; + } /* * Fill in enough data in oldtup for HeapDetermineColumnsInfo to work @@ -3339,16 +3573,7 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, result = TM_Deleted; } - if (crosscheck != InvalidSnapshot && result == TM_Ok) - { - /* Perform additional check for transaction-snapshot mode RI updates */ - if (!HeapTupleSatisfiesVisibility(&oldtup, crosscheck, buffer)) - { - result = TM_Updated; - Assert(!ItemPointerEquals(&oldtup.t_self, &oldtup.t_data->t_ctid)); - } - } - + /* Sanity check the result HeapTupleSatisfiesUpdate() and the logic above */ if (result != TM_Ok) { Assert(result == TM_SelfModified || @@ -3358,6 +3583,17 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, Assert(!(oldtup.t_data->t_infomask & HEAP_XMAX_INVALID)); Assert(result != TM_Updated || !ItemPointerEquals(&oldtup.t_self, &oldtup.t_data->t_ctid)); + } + + if (crosscheck != InvalidSnapshot && result == TM_Ok) + { + /* Perform additional check for transaction-snapshot mode RI updates */ + if (!HeapTupleSatisfiesVisibility(&oldtup, crosscheck, buffer)) + result = TM_Updated; + } + + if (result != TM_Ok) + { tmfd->ctid = oldtup.t_data->t_ctid; tmfd->xmax = HeapTupleHeaderGetUpdateXid(oldtup.t_data); if (result == TM_SelfModified) @@ -3896,6 +4132,128 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, return TM_Ok; } +#ifdef USE_ASSERT_CHECKING +/* + * Confirm adequate lock held during heap_update(), per rules from + * README.tuplock section "Locking to write inplace-updated tables". + */ +static void +check_lock_if_inplace_updateable_rel(Relation relation, + ItemPointer otid, + HeapTuple newtup) +{ + /* LOCKTAG_TUPLE acceptable for any catalog */ + switch (RelationGetRelid(relation)) + { + case RelationRelationId: + case DatabaseRelationId: + { + LOCKTAG tuptag; + + SET_LOCKTAG_TUPLE(tuptag, + relation->rd_lockInfo.lockRelId.dbId, + relation->rd_lockInfo.lockRelId.relId, + ItemPointerGetBlockNumber(otid), + ItemPointerGetOffsetNumber(otid)); + if (LockHeldByMe(&tuptag, InplaceUpdateTupleLock, false)) + return; + } + break; + default: + Assert(!IsInplaceUpdateRelation(relation)); + return; + } + + switch (RelationGetRelid(relation)) + { + case RelationRelationId: + { + /* LOCKTAG_TUPLE or LOCKTAG_RELATION ok */ + Form_pg_class classForm = (Form_pg_class) GETSTRUCT(newtup); + Oid relid = classForm->oid; + Oid dbid; + LOCKTAG tag; + + if (IsSharedRelation(relid)) + dbid = InvalidOid; + else + dbid = MyDatabaseId; + + if (classForm->relkind == RELKIND_INDEX) + { + Relation irel = index_open(relid, AccessShareLock); + + SET_LOCKTAG_RELATION(tag, dbid, irel->rd_index->indrelid); + index_close(irel, AccessShareLock); + } + else + SET_LOCKTAG_RELATION(tag, dbid, relid); + + if (!LockHeldByMe(&tag, ShareUpdateExclusiveLock, false) && + !LockHeldByMe(&tag, ShareRowExclusiveLock, true)) + elog(WARNING, + "missing lock for relation \"%s\" (OID %u, relkind %c) @ TID (%u,%u)", + NameStr(classForm->relname), + relid, + classForm->relkind, + ItemPointerGetBlockNumber(otid), + ItemPointerGetOffsetNumber(otid)); + } + break; + case DatabaseRelationId: + { + /* LOCKTAG_TUPLE required */ + Form_pg_database dbForm = (Form_pg_database) GETSTRUCT(newtup); + + elog(WARNING, + "missing lock on database \"%s\" (OID %u) @ TID (%u,%u)", + NameStr(dbForm->datname), + dbForm->oid, + ItemPointerGetBlockNumber(otid), + ItemPointerGetOffsetNumber(otid)); + } + break; + } +} + +/* + * Confirm adequate relation lock held, per rules from README.tuplock section + * "Locking to write inplace-updated tables". + */ +static void +check_inplace_rel_lock(HeapTuple oldtup) +{ + Form_pg_class classForm = (Form_pg_class) GETSTRUCT(oldtup); + Oid relid = classForm->oid; + Oid dbid; + LOCKTAG tag; + + if (IsSharedRelation(relid)) + dbid = InvalidOid; + else + dbid = MyDatabaseId; + + if (classForm->relkind == RELKIND_INDEX) + { + Relation irel = index_open(relid, AccessShareLock); + + SET_LOCKTAG_RELATION(tag, dbid, irel->rd_index->indrelid); + index_close(irel, AccessShareLock); + } + else + SET_LOCKTAG_RELATION(tag, dbid, relid); + + if (!LockHeldByMe(&tag, ShareUpdateExclusiveLock, true)) + elog(WARNING, + "missing lock for relation \"%s\" (OID %u, relkind %c) @ TID (%u,%u)", + NameStr(classForm->relname), + relid, + classForm->relkind, + ItemPointerGetBlockNumber(&oldtup->t_self), + ItemPointerGetOffsetNumber(&oldtup->t_self)); +} +#endif + /* * Check if the specified attribute's values are the same. Subroutine for * HeapDetermineColumnsInfo. @@ -5735,7 +6093,6 @@ heap_abort_speculative(Relation relation, ItemPointer tid) Page page; BlockNumber block; Buffer buffer; - TransactionId prune_xid; Assert(ItemPointerIsValid(tid)); @@ -5788,11 +6145,16 @@ heap_abort_speculative(Relation relation, ItemPointer tid) * TransactionXmin, so there's no race here). */ Assert(TransactionIdIsValid(TransactionXmin)); - if (TransactionIdPrecedes(TransactionXmin, relation->rd_rel->relfrozenxid)) - prune_xid = relation->rd_rel->relfrozenxid; - else - prune_xid = TransactionXmin; - PageSetPrunable(page, prune_xid); + { + TransactionId relfrozenxid = relation->rd_rel->relfrozenxid; + TransactionId prune_xid; + + if (TransactionIdPrecedes(TransactionXmin, relfrozenxid)) + prune_xid = relfrozenxid; + else + prune_xid = TransactionXmin; + PageSetPrunable(page, prune_xid); + } /* store transaction information of xact deleting the tuple */ tp.t_data->t_infomask &= ~(HEAP_XMAX_BITS | HEAP_MOVED); @@ -5861,23 +6223,260 @@ heap_abort_speculative(Relation relation, ItemPointer tid) } /* - * heap_inplace_update - update a tuple "in place" (ie, overwrite it) - * - * Overwriting violates both MVCC and transactional safety, so the uses - * of this function in Postgres are extremely limited. Nonetheless we - * find some places to use it. - * - * The tuple cannot change size, and therefore it's reasonable to assume - * that its null bitmap (if any) doesn't change either. So we just - * overwrite the data portion of the tuple without touching the null - * bitmap or any of the header fields. - * - * tuple is an in-memory tuple structure containing the data to be written - * over the target tuple. Also, tuple->t_self identifies the target tuple. + * heap_inplace_lock - protect inplace update from concurrent heap_update() + * + * Evaluate whether the tuple's state is compatible with a no-key update. + * Current transaction rowmarks are fine, as is KEY SHARE from any + * transaction. If compatible, return true with the buffer exclusive-locked, + * and the caller must release that by calling + * heap_inplace_update_and_unlock(), calling heap_inplace_unlock(), or raising + * an error. Otherwise, call release_callback(arg), wait for blocking + * transactions to end, and return false. + * + * Since this is intended for system catalogs and SERIALIZABLE doesn't cover + * DDL, this doesn't guarantee any particular predicate locking. + * + * One could modify this to return true for tuples with delete in progress, + * All inplace updaters take a lock that conflicts with DROP. If explicit + * "DELETE FROM pg_class" is in progress, we'll wait for it like we would an + * update. + * + * Readers of inplace-updated fields expect changes to those fields are + * durable. For example, vac_truncate_clog() reads datfrozenxid from + * pg_database tuples via catalog snapshots. A future snapshot must not + * return a lower datfrozenxid for the same database OID (lower in the + * FullTransactionIdPrecedes() sense). We achieve that since no update of a + * tuple can start while we hold a lock on its buffer. In cases like + * BEGIN;GRANT;CREATE INDEX;COMMIT we're inplace-updating a tuple visible only + * to this transaction. ROLLBACK then is one case where it's okay to lose + * inplace updates. (Restoring relhasindex=false on ROLLBACK is fine, since + * any concurrent CREATE INDEX would have blocked, then inplace-updated the + * committed tuple.) + * + * In principle, we could avoid waiting by overwriting every tuple in the + * updated tuple chain. Reader expectations permit updating a tuple only if + * it's aborted, is the tail of the chain, or we already updated the tuple + * referenced in its t_ctid. Hence, we would need to overwrite the tuples in + * order from tail to head. That would imply either (a) mutating all tuples + * in one critical section or (b) accepting a chance of partial completion. + * Partial completion of a relfrozenxid update would have the weird + * consequence that the table's next VACUUM could see the table's relfrozenxid + * move forward between vacuum_get_cutoffs() and finishing. + */ +bool +heap_inplace_lock(Relation relation, + HeapTuple oldtup_ptr, Buffer buffer, + void (*release_callback) (void *), void *arg) +{ + HeapTupleData oldtup = *oldtup_ptr; /* minimize diff vs. heap_update() */ + TM_Result result; + bool ret; + +#ifdef USE_ASSERT_CHECKING + if (RelationGetRelid(relation) == RelationRelationId) + check_inplace_rel_lock(oldtup_ptr); +#endif + + Assert(BufferIsValid(buffer)); + + LockTuple(relation, &oldtup.t_self, InplaceUpdateTupleLock); + LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); + + /*---------- + * Interpret HeapTupleSatisfiesUpdate() like heap_update() does, except: + * + * - wait unconditionally + * - already locked tuple above, since inplace needs that unconditionally + * - don't recheck header after wait: simpler to defer to next iteration + * - don't try to continue even if the updater aborts: likewise + * - no crosscheck + */ + result = HeapTupleSatisfiesUpdate(&oldtup, GetCurrentCommandId(false), + buffer); + + if (result == TM_Invisible) + { + /* no known way this can happen */ + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg_internal("attempted to overwrite invisible tuple"))); + } + else if (result == TM_SelfModified) + { + /* + * CREATE INDEX might reach this if an expression is silly enough to + * call e.g. SELECT ... FROM pg_class FOR SHARE. C code of other SQL + * statements might get here after a heap_update() of the same row, in + * the absence of an intervening CommandCounterIncrement(). + */ + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("tuple to be updated was already modified by an operation triggered by the current command"))); + } + else if (result == TM_BeingModified) + { + TransactionId xwait; + uint16 infomask; + + xwait = HeapTupleHeaderGetRawXmax(oldtup.t_data); + infomask = oldtup.t_data->t_infomask; + + if (infomask & HEAP_XMAX_IS_MULTI) + { + LockTupleMode lockmode = LockTupleNoKeyExclusive; + MultiXactStatus mxact_status = MultiXactStatusNoKeyUpdate; + int remain; + + if (DoesMultiXactIdConflict((MultiXactId) xwait, infomask, + lockmode, NULL)) + { + LockBuffer(buffer, BUFFER_LOCK_UNLOCK); + release_callback(arg); + ret = false; + MultiXactIdWait((MultiXactId) xwait, mxact_status, infomask, + relation, &oldtup.t_self, XLTW_Update, + &remain); + } + else + ret = true; + } + else if (TransactionIdIsCurrentTransactionId(xwait)) + ret = true; + else if (HEAP_XMAX_IS_KEYSHR_LOCKED(infomask)) + ret = true; + else + { + LockBuffer(buffer, BUFFER_LOCK_UNLOCK); + release_callback(arg); + ret = false; + XactLockTableWait(xwait, relation, &oldtup.t_self, + XLTW_Update); + } + } + else + { + ret = (result == TM_Ok); + if (!ret) + { + LockBuffer(buffer, BUFFER_LOCK_UNLOCK); + release_callback(arg); + } + } + + /* + * GetCatalogSnapshot() relies on invalidation messages to know when to + * take a new snapshot. COMMIT of xwait is responsible for sending the + * invalidation. We're not acquiring heavyweight locks sufficient to + * block if not yet sent, so we must take a new snapshot to ensure a later + * attempt has a fair chance. While we don't need this if xwait aborted, + * don't bother optimizing that. + */ + if (!ret) + { + UnlockTuple(relation, &oldtup.t_self, InplaceUpdateTupleLock); + InvalidateCatalogSnapshot(); + } + return ret; +} + +/* + * heap_inplace_update_and_unlock - core of systable_inplace_update_finish + * + * The tuple cannot change size, and therefore its header fields and null + * bitmap (if any) don't change either. + * + * Since we hold LOCKTAG_TUPLE, no updater has a local copy of this tuple. + */ +void +heap_inplace_update_and_unlock(Relation relation, + HeapTuple oldtup, HeapTuple tuple, + Buffer buffer) +{ + HeapTupleHeader htup = oldtup->t_data; + uint32 oldlen; + uint32 newlen; + + Assert(ItemPointerEquals(&oldtup->t_self, &tuple->t_self)); + oldlen = oldtup->t_len - htup->t_hoff; + newlen = tuple->t_len - tuple->t_data->t_hoff; + if (oldlen != newlen || htup->t_hoff != tuple->t_data->t_hoff) + elog(ERROR, "wrong tuple length"); + + /* NO EREPORT(ERROR) from here till changes are logged */ + START_CRIT_SECTION(); + + memcpy((char *) htup + htup->t_hoff, + (char *) tuple->t_data + tuple->t_data->t_hoff, + newlen); + + /*---------- + * XXX A crash here can allow datfrozenxid() to get ahead of relfrozenxid: + * + * ["D" is a VACUUM (ONLY_DATABASE_STATS)] + * ["R" is a VACUUM tbl] + * D: vac_update_datfrozenid() -> systable_beginscan(pg_class) + * D: systable_getnext() returns pg_class tuple of tbl + * R: memcpy() into pg_class tuple of tbl + * D: raise pg_database.datfrozenxid, XLogInsert(), finish + * [crash] + * [recovery restores datfrozenxid w/o relfrozenxid] + */ + + MarkBufferDirty(buffer); + + /* XLOG stuff */ + if (RelationNeedsWAL(relation)) + { + xl_heap_inplace xlrec; + XLogRecPtr recptr; + + xlrec.offnum = ItemPointerGetOffsetNumber(&tuple->t_self); + + XLogBeginInsert(); + XLogRegisterData((char *) &xlrec, SizeOfHeapInplace); + + XLogRegisterBuffer(0, buffer, REGBUF_STANDARD); + XLogRegisterBufData(0, (char *) htup + htup->t_hoff, newlen); + + /* inplace updates aren't decoded atm, don't log the origin */ + + recptr = XLogInsert(RM_HEAP_ID, XLOG_HEAP_INPLACE); + + PageSetLSN(BufferGetPage(buffer), recptr); + } + + END_CRIT_SECTION(); + + heap_inplace_unlock(relation, oldtup, buffer); + + /* + * Send out shared cache inval if necessary. Note that because we only + * pass the new version of the tuple, this mustn't be used for any + * operations that could change catcache lookup keys. But we aren't + * bothering with index updates either, so that's true a fortiori. + * + * XXX ROLLBACK discards the invalidation. See test inplace-inval.spec. + */ + if (!IsBootstrapProcessingMode()) + CacheInvalidateHeapTuple(relation, tuple, NULL); +} + +/* + * heap_inplace_unlock - reverse of heap_inplace_lock + */ +void +heap_inplace_unlock(Relation relation, + HeapTuple oldtup, Buffer buffer) +{ + LockBuffer(buffer, BUFFER_LOCK_UNLOCK); + UnlockTuple(relation, &oldtup->t_self, InplaceUpdateTupleLock); +} + +/* + * heap_inplace_update - deprecated * - * Note that the tuple updated here had better not come directly from the - * syscache if the relation has a toast relation as this tuple could - * include toast values that have been expanded, causing a failure here. + * This exists only to keep modules working in back branches. Affected + * modules should migrate to systable_inplace_update_begin(). */ void heap_inplace_update(Relation relation, HeapTuple tuple) @@ -6337,9 +6936,9 @@ FreezeMultiXactId(MultiXactId multi, uint16 t_infomask, * XIDs or MultiXactIds that will need to be processed by a future VACUUM. * * VACUUM caller must assemble HeapTupleFreeze freeze plan entries for every - * tuple that we returned true for, and call heap_freeze_execute_prepared to - * execute freezing. Caller must initialize pagefrz fields for page as a - * whole before first call here for each heap page. + * tuple that we returned true for, and then execute freezing. Caller must + * initialize pagefrz fields for page as a whole before first call here for + * each heap page. * * VACUUM caller decides on whether or not to freeze the page as a whole. * We'll often prepare freeze plans for a page that caller just discards. @@ -6655,35 +7254,19 @@ heap_execute_freeze_tuple(HeapTupleHeader tuple, HeapTupleFreeze *frz) } /* - * heap_freeze_execute_prepared - * - * Executes freezing of one or more heap tuples on a page on behalf of caller. - * Caller passes an array of tuple plans from heap_prepare_freeze_tuple. - * Caller must set 'offset' in each plan for us. Note that we destructively - * sort caller's tuples array in-place, so caller had better be done with it. - * - * WAL-logs the changes so that VACUUM can advance the rel's relfrozenxid - * later on without any risk of unsafe pg_xact lookups, even following a hard - * crash (or when querying from a standby). We represent freezing by setting - * infomask bits in tuple headers, but this shouldn't be thought of as a hint. - * See section on buffer access rules in src/backend/storage/buffer/README. + * Perform xmin/xmax XID status sanity checks before actually executing freeze + * plans. + * + * heap_prepare_freeze_tuple doesn't perform these checks directly because + * pg_xact lookups are relatively expensive. They shouldn't be repeated by + * successive VACUUMs that each decide against freezing the same page. */ void -heap_freeze_execute_prepared(Relation rel, Buffer buffer, - TransactionId snapshotConflictHorizon, - HeapTupleFreeze *tuples, int ntuples) +heap_pre_freeze_checks(Buffer buffer, + HeapTupleFreeze *tuples, int ntuples) { Page page = BufferGetPage(buffer); - Assert(ntuples > 0); - - /* - * Perform xmin/xmax XID status sanity checks before critical section. - * - * heap_prepare_freeze_tuple doesn't perform these checks directly because - * pg_xact lookups are relatively expensive. They shouldn't be repeated - * by successive VACUUMs that each decide against freezing the same page. - */ for (int i = 0; i < ntuples; i++) { HeapTupleFreeze *frz = tuples + i; @@ -6722,195 +7305,29 @@ heap_freeze_execute_prepared(Relation rel, Buffer buffer, xmax))); } } - - START_CRIT_SECTION(); - - for (int i = 0; i < ntuples; i++) - { - HeapTupleFreeze *frz = tuples + i; - ItemId itemid = PageGetItemId(page, frz->offset); - HeapTupleHeader htup; - - htup = (HeapTupleHeader) PageGetItem(page, itemid); - heap_execute_freeze_tuple(htup, frz); - } - - MarkBufferDirty(buffer); - - /* Now WAL-log freezing if necessary */ - if (RelationNeedsWAL(rel)) - { - xl_heap_freeze_plan plans[MaxHeapTuplesPerPage]; - OffsetNumber offsets[MaxHeapTuplesPerPage]; - int nplans; - xl_heap_freeze_page xlrec; - XLogRecPtr recptr; - - /* Prepare deduplicated representation for use in WAL record */ - nplans = heap_log_freeze_plan(tuples, ntuples, plans, offsets); - - xlrec.snapshotConflictHorizon = snapshotConflictHorizon; - xlrec.isCatalogRel = RelationIsAccessibleInLogicalDecoding(rel); - xlrec.nplans = nplans; - - XLogBeginInsert(); - XLogRegisterData((char *) &xlrec, SizeOfHeapFreezePage); - - /* - * The freeze plan array and offset array are not actually in the - * buffer, but pretend that they are. When XLogInsert stores the - * whole buffer, the arrays need not be stored too. - */ - XLogRegisterBuffer(0, buffer, REGBUF_STANDARD); - XLogRegisterBufData(0, (char *) plans, - nplans * sizeof(xl_heap_freeze_plan)); - XLogRegisterBufData(0, (char *) offsets, - ntuples * sizeof(OffsetNumber)); - - recptr = XLogInsert(RM_HEAP2_ID, XLOG_HEAP2_FREEZE_PAGE); - - PageSetLSN(page, recptr); - } - - END_CRIT_SECTION(); -} - -/* - * Comparator used to deduplicate XLOG_HEAP2_FREEZE_PAGE freeze plans - */ -static int -heap_log_freeze_cmp(const void *arg1, const void *arg2) -{ - HeapTupleFreeze *frz1 = (HeapTupleFreeze *) arg1; - HeapTupleFreeze *frz2 = (HeapTupleFreeze *) arg2; - - if (frz1->xmax < frz2->xmax) - return -1; - else if (frz1->xmax > frz2->xmax) - return 1; - - if (frz1->t_infomask2 < frz2->t_infomask2) - return -1; - else if (frz1->t_infomask2 > frz2->t_infomask2) - return 1; - - if (frz1->t_infomask < frz2->t_infomask) - return -1; - else if (frz1->t_infomask > frz2->t_infomask) - return 1; - - if (frz1->frzflags < frz2->frzflags) - return -1; - else if (frz1->frzflags > frz2->frzflags) - return 1; - - /* - * heap_log_freeze_eq would consider these tuple-wise plans to be equal. - * (So the tuples will share a single canonical freeze plan.) - * - * We tiebreak on page offset number to keep each freeze plan's page - * offset number array individually sorted. (Unnecessary, but be tidy.) - */ - if (frz1->offset < frz2->offset) - return -1; - else if (frz1->offset > frz2->offset) - return 1; - - Assert(false); - return 0; -} - -/* - * Compare fields that describe actions required to freeze tuple with caller's - * open plan. If everything matches then the frz tuple plan is equivalent to - * caller's plan. - */ -static inline bool -heap_log_freeze_eq(xl_heap_freeze_plan *plan, HeapTupleFreeze *frz) -{ - if (plan->xmax == frz->xmax && - plan->t_infomask2 == frz->t_infomask2 && - plan->t_infomask == frz->t_infomask && - plan->frzflags == frz->frzflags) - return true; - - /* Caller must call heap_log_freeze_new_plan again for frz */ - return false; -} - -/* - * Start new plan initialized using tuple-level actions. At least one tuple - * will have steps required to freeze described by caller's plan during REDO. - */ -static inline void -heap_log_freeze_new_plan(xl_heap_freeze_plan *plan, HeapTupleFreeze *frz) -{ - plan->xmax = frz->xmax; - plan->t_infomask2 = frz->t_infomask2; - plan->t_infomask = frz->t_infomask; - plan->frzflags = frz->frzflags; - plan->ntuples = 1; /* for now */ } /* - * Deduplicate tuple-based freeze plans so that each distinct set of - * processing steps is only stored once in XLOG_HEAP2_FREEZE_PAGE records. - * Called during original execution of freezing (for logged relations). - * - * Return value is number of plans set in *plans_out for caller. Also writes - * an array of offset numbers into *offsets_out output argument for caller - * (actually there is one array per freeze plan, but that's not of immediate - * concern to our caller). + * Helper which executes freezing of one or more heap tuples on a page on + * behalf of caller. Caller passes an array of tuple plans from + * heap_prepare_freeze_tuple. Caller must set 'offset' in each plan for us. + * Must be called in a critical section that also marks the buffer dirty and, + * if needed, emits WAL. */ -static int -heap_log_freeze_plan(HeapTupleFreeze *tuples, int ntuples, - xl_heap_freeze_plan *plans_out, - OffsetNumber *offsets_out) +void +heap_freeze_prepared_tuples(Buffer buffer, HeapTupleFreeze *tuples, int ntuples) { - int nplans = 0; - - /* Sort tuple-based freeze plans in the order required to deduplicate */ - qsort(tuples, ntuples, sizeof(HeapTupleFreeze), heap_log_freeze_cmp); + Page page = BufferGetPage(buffer); for (int i = 0; i < ntuples; i++) { HeapTupleFreeze *frz = tuples + i; + ItemId itemid = PageGetItemId(page, frz->offset); + HeapTupleHeader htup; - if (i == 0) - { - /* New canonical freeze plan starting with first tup */ - heap_log_freeze_new_plan(plans_out, frz); - nplans++; - } - else if (heap_log_freeze_eq(plans_out, frz)) - { - /* tup matches open canonical plan -- include tup in it */ - Assert(offsets_out[i - 1] < frz->offset); - plans_out->ntuples++; - } - else - { - /* Tup doesn't match current plan -- done with it now */ - plans_out++; - - /* New canonical freeze plan starting with this tup */ - heap_log_freeze_new_plan(plans_out, frz); - nplans++; - } - - /* - * Save page offset number in dedicated buffer in passing. - * - * REDO routine relies on the record's offset numbers array grouping - * offset numbers by freeze plan. The sort order within each grouping - * is ascending offset number order, just to keep things tidy. - */ - offsets_out[i] = frz->offset; + htup = (HeapTupleHeader) PageGetItem(page, itemid); + heap_execute_freeze_tuple(htup, frz); } - - Assert(nplans > 0 && nplans <= ntuples); - - return nplans; } /* @@ -7886,10 +8303,10 @@ heap_index_delete_tuples(Relation rel, TM_IndexDeleteOp *delstate) * must have considered the original tuple header as part of * generating its own snapshotConflictHorizon value. * - * Relying on XLOG_HEAP2_PRUNE records like this is the same - * strategy that index vacuuming uses in all cases. Index VACUUM - * WAL records don't even have a snapshotConflictHorizon field of - * their own for this reason. + * Relying on XLOG_HEAP2_PRUNE_VACUUM_SCAN records like this is + * the same strategy that index vacuuming uses in all cases. Index + * VACUUM WAL records don't even have a snapshotConflictHorizon + * field of their own for this reason. */ if (!ItemIdIsNormal(lp)) break; @@ -8747,162 +9164,149 @@ ExtractReplicaIdentity(Relation relation, HeapTuple tp, bool key_required, } /* - * Handles XLOG_HEAP2_PRUNE record type. - * - * Acquires a full cleanup lock. + * Replay XLOG_HEAP2_PRUNE_* records. */ static void -heap_xlog_prune(XLogReaderState *record) +heap_xlog_prune_freeze(XLogReaderState *record) { XLogRecPtr lsn = record->EndRecPtr; - xl_heap_prune *xlrec = (xl_heap_prune *) XLogRecGetData(record); + char *maindataptr = XLogRecGetData(record); + xl_heap_prune xlrec; Buffer buffer; RelFileLocator rlocator; BlockNumber blkno; XLogRedoAction action; XLogRecGetBlockTag(record, 0, &rlocator, NULL, &blkno); + memcpy(&xlrec, maindataptr, SizeOfHeapPrune); + maindataptr += SizeOfHeapPrune; /* - * We're about to remove tuples. In Hot Standby mode, ensure that there's - * no queries running for which the removed tuples are still visible. + * We will take an ordinary exclusive lock or a cleanup lock depending on + * whether the XLHP_CLEANUP_LOCK flag is set. With an ordinary exclusive + * lock, we better not be doing anything that requires moving existing + * tuple data. */ - if (InHotStandby) - ResolveRecoveryConflictWithSnapshot(xlrec->snapshotConflictHorizon, - xlrec->isCatalogRel, - rlocator); + Assert((xlrec.flags & XLHP_CLEANUP_LOCK) != 0 || + (xlrec.flags & (XLHP_HAS_REDIRECTIONS | XLHP_HAS_DEAD_ITEMS)) == 0); + + /* + * We are about to remove and/or freeze tuples. In Hot Standby mode, + * ensure that there are no queries running for which the removed tuples + * are still visible or which still consider the frozen xids as running. + * The conflict horizon XID comes after xl_heap_prune. + */ + if ((xlrec.flags & XLHP_HAS_CONFLICT_HORIZON) != 0) + { + TransactionId snapshot_conflict_horizon; + + /* memcpy() because snapshot_conflict_horizon is stored unaligned */ + memcpy(&snapshot_conflict_horizon, maindataptr, sizeof(TransactionId)); + maindataptr += sizeof(TransactionId); + + if (InHotStandby) + ResolveRecoveryConflictWithSnapshot(snapshot_conflict_horizon, + (xlrec.flags & XLHP_IS_CATALOG_REL) != 0, + rlocator); + } /* - * If we have a full-page image, restore it (using a cleanup lock) and - * we're done. + * If we have a full-page image, restore it and we're done. */ - action = XLogReadBufferForRedoExtended(record, 0, RBM_NORMAL, true, + action = XLogReadBufferForRedoExtended(record, 0, RBM_NORMAL, + (xlrec.flags & XLHP_CLEANUP_LOCK) != 0, &buffer); if (action == BLK_NEEDS_REDO) { Page page = (Page) BufferGetPage(buffer); - OffsetNumber *end; OffsetNumber *redirected; OffsetNumber *nowdead; OffsetNumber *nowunused; int nredirected; int ndead; int nunused; + int nplans; Size datalen; + xlhp_freeze_plan *plans; + OffsetNumber *frz_offsets; + char *dataptr = XLogRecGetBlockData(record, 0, &datalen); - redirected = (OffsetNumber *) XLogRecGetBlockData(record, 0, &datalen); - - nredirected = xlrec->nredirected; - ndead = xlrec->ndead; - end = (OffsetNumber *) ((char *) redirected + datalen); - nowdead = redirected + (nredirected * 2); - nowunused = nowdead + ndead; - nunused = (end - nowunused); - Assert(nunused >= 0); - - /* Update all line pointers per the record, and repair fragmentation */ - heap_page_prune_execute(buffer, - redirected, nredirected, - nowdead, ndead, - nowunused, nunused); + heap_xlog_deserialize_prune_and_freeze(dataptr, xlrec.flags, + &nplans, &plans, &frz_offsets, + &nredirected, &redirected, + &ndead, &nowdead, + &nunused, &nowunused); /* - * Note: we don't worry about updating the page's prunability hints. - * At worst this will cause an extra prune cycle to occur soon. + * Update all line pointers per the record, and repair fragmentation + * if needed. */ + if (nredirected > 0 || ndead > 0 || nunused > 0) + heap_page_prune_execute(buffer, + (xlrec.flags & XLHP_CLEANUP_LOCK) == 0, + redirected, nredirected, + nowdead, ndead, + nowunused, nunused); + + /* Freeze tuples */ + for (int p = 0; p < nplans; p++) + { + HeapTupleFreeze frz; - PageSetLSN(page, lsn); - MarkBufferDirty(buffer); - } + /* + * Convert freeze plan representation from WAL record into + * per-tuple format used by heap_execute_freeze_tuple + */ + frz.xmax = plans[p].xmax; + frz.t_infomask2 = plans[p].t_infomask2; + frz.t_infomask = plans[p].t_infomask; + frz.frzflags = plans[p].frzflags; + frz.offset = InvalidOffsetNumber; /* unused, but be tidy */ - if (BufferIsValid(buffer)) - { - Size freespace = PageGetHeapFreeSpace(BufferGetPage(buffer)); + for (int i = 0; i < plans[p].ntuples; i++) + { + OffsetNumber offset = *(frz_offsets++); + ItemId lp; + HeapTupleHeader tuple; - UnlockReleaseBuffer(buffer); + lp = PageGetItemId(page, offset); + tuple = (HeapTupleHeader) PageGetItem(page, lp); + heap_execute_freeze_tuple(tuple, &frz); + } + } + + /* There should be no more data */ + Assert((char *) frz_offsets == dataptr + datalen); /* - * After pruning records from a page, it's useful to update the FSM - * about it, as it may cause the page become target for insertions - * later even if vacuum decides not to visit it (which is possible if - * gets marked all-visible.) - * - * Do this regardless of a full-page image being applied, since the - * FSM data is not in the page anyway. + * Note: we don't worry about updating the page's prunability hints. + * At worst this will cause an extra prune cycle to occur soon. */ - XLogRecordPageWithFreeSpace(rlocator, blkno, freespace); - } -} - -/* - * Handles XLOG_HEAP2_VACUUM record type. - * - * Acquires an ordinary exclusive lock only. - */ -static void -heap_xlog_vacuum(XLogReaderState *record) -{ - XLogRecPtr lsn = record->EndRecPtr; - xl_heap_vacuum *xlrec = (xl_heap_vacuum *) XLogRecGetData(record); - Buffer buffer; - BlockNumber blkno; - XLogRedoAction action; - - /* - * If we have a full-page image, restore it (without using a cleanup lock) - * and we're done. - */ - action = XLogReadBufferForRedoExtended(record, 0, RBM_NORMAL, false, - &buffer); - if (action == BLK_NEEDS_REDO) - { - Page page = (Page) BufferGetPage(buffer); - OffsetNumber *nowunused; - Size datalen; - OffsetNumber *offnum; - - nowunused = (OffsetNumber *) XLogRecGetBlockData(record, 0, &datalen); - - /* Shouldn't be a record unless there's something to do */ - Assert(xlrec->nunused > 0); - - /* Update all now-unused line pointers */ - offnum = nowunused; - for (int i = 0; i < xlrec->nunused; i++) - { - OffsetNumber off = *offnum++; - ItemId lp = PageGetItemId(page, off); - - Assert(ItemIdIsDead(lp) && !ItemIdHasStorage(lp)); - ItemIdSetUnused(lp); - } - - /* Attempt to truncate line pointer array now */ - PageTruncateLinePointerArray(page); PageSetLSN(page, lsn); MarkBufferDirty(buffer); } + /* + * If we released any space or line pointers, update the free space map. + * + * Do this regardless of a full-page image being applied, since the FSM + * data is not in the page anyway. + */ if (BufferIsValid(buffer)) { - Size freespace = PageGetHeapFreeSpace(BufferGetPage(buffer)); - RelFileLocator rlocator; - - XLogRecGetBlockTag(record, 0, &rlocator, NULL, &blkno); + if (xlrec.flags & (XLHP_HAS_REDIRECTIONS | + XLHP_HAS_DEAD_ITEMS | + XLHP_HAS_NOW_UNUSED_ITEMS)) + { + Size freespace = PageGetHeapFreeSpace(BufferGetPage(buffer)); - UnlockReleaseBuffer(buffer); + UnlockReleaseBuffer(buffer); - /* - * After vacuuming LP_DEAD items from a page, it's useful to update - * the FSM about it, as it may cause the page become target for - * insertions later even if vacuum decides not to visit it (which is - * possible if gets marked all-visible.) - * - * Do this regardless of a full-page image being applied, since the - * FSM data is not in the page anyway. - */ - XLogRecordPageWithFreeSpace(rlocator, blkno, freespace); + XLogRecordPageWithFreeSpace(rlocator, blkno, freespace); + } + else + UnlockReleaseBuffer(buffer); } } @@ -9043,74 +9447,6 @@ heap_xlog_visible(XLogReaderState *record) UnlockReleaseBuffer(vmbuffer); } -/* - * Replay XLOG_HEAP2_FREEZE_PAGE records - */ -static void -heap_xlog_freeze_page(XLogReaderState *record) -{ - XLogRecPtr lsn = record->EndRecPtr; - xl_heap_freeze_page *xlrec = (xl_heap_freeze_page *) XLogRecGetData(record); - Buffer buffer; - - /* - * In Hot Standby mode, ensure that there's no queries running which still - * consider the frozen xids as running. - */ - if (InHotStandby) - { - RelFileLocator rlocator; - - XLogRecGetBlockTag(record, 0, &rlocator, NULL, NULL); - ResolveRecoveryConflictWithSnapshot(xlrec->snapshotConflictHorizon, - xlrec->isCatalogRel, - rlocator); - } - - if (XLogReadBufferForRedo(record, 0, &buffer) == BLK_NEEDS_REDO) - { - Page page = BufferGetPage(buffer); - xl_heap_freeze_plan *plans; - OffsetNumber *offsets; - int curoff = 0; - - plans = (xl_heap_freeze_plan *) XLogRecGetBlockData(record, 0, NULL); - offsets = (OffsetNumber *) ((char *) plans + - (xlrec->nplans * - sizeof(xl_heap_freeze_plan))); - for (int p = 0; p < xlrec->nplans; p++) - { - HeapTupleFreeze frz; - - /* - * Convert freeze plan representation from WAL record into - * per-tuple format used by heap_execute_freeze_tuple - */ - frz.xmax = plans[p].xmax; - frz.t_infomask2 = plans[p].t_infomask2; - frz.t_infomask = plans[p].t_infomask; - frz.frzflags = plans[p].frzflags; - frz.offset = InvalidOffsetNumber; /* unused, but be tidy */ - - for (int i = 0; i < plans[p].ntuples; i++) - { - OffsetNumber offset = offsets[curoff++]; - ItemId lp; - HeapTupleHeader tuple; - - lp = PageGetItemId(page, offset); - tuple = (HeapTupleHeader) PageGetItem(page, lp); - heap_execute_freeze_tuple(tuple, &frz); - } - } - - PageSetLSN(page, lsn); - MarkBufferDirty(buffer); - } - if (BufferIsValid(buffer)) - UnlockReleaseBuffer(buffer); -} - /* * Given an "infobits" field from an XLog record, set the correct bits in the * given infomask and infomask2 for the tuple touched by the record. @@ -10011,14 +10347,10 @@ heap2_redo(XLogReaderState *record) switch (info & XLOG_HEAP_OPMASK) { - case XLOG_HEAP2_PRUNE: - heap_xlog_prune(record); - break; - case XLOG_HEAP2_VACUUM: - heap_xlog_vacuum(record); - break; - case XLOG_HEAP2_FREEZE_PAGE: - heap_xlog_freeze_page(record); + case XLOG_HEAP2_PRUNE_ON_ACCESS: + case XLOG_HEAP2_PRUNE_VACUUM_SCAN: + case XLOG_HEAP2_PRUNE_VACUUM_CLEANUP: + heap_xlog_prune_freeze(record); break; case XLOG_HEAP2_VISIBLE: heap_xlog_visible(record); diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 0755be8390112..6f8b1b79298f3 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -3,7 +3,7 @@ * heapam_handler.c * heap table access method code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -27,6 +27,7 @@ #include "access/syncscan.h" #include "access/tableam.h" #include "access/tsmapi.h" +#include "access/visibilitymap.h" #include "access/xact.h" #include "catalog/catalog.h" #include "catalog/index.h" @@ -606,12 +607,9 @@ heapam_relation_set_new_filelocator(Relation rel, /* * If required, set up an init fork for an unlogged table so that it can - * be correctly reinitialized on restart. An immediate sync is required - * even if the page has been logged, because the write did not go through - * shared_buffers and therefore a concurrent checkpoint may have moved the - * redo pointer past our xlog record. Recovery may as well remove it - * while replaying, for example, XLOG_DBASE_CREATE* or XLOG_TBLSPC_CREATE - * record. Therefore, logging is necessary even if wal_level=minimal. + * be correctly reinitialized on restart. Recovery may remove it while + * replaying, for example, an XLOG_DBASE_CREATE* or XLOG_TBLSPC_CREATE + * record. Therefore, logging is necessary even if wal_level=minimal. */ if (persistence == RELPERSISTENCE_UNLOGGED) { @@ -620,7 +618,6 @@ heapam_relation_set_new_filelocator(Relation rel, rel->rd_rel->relkind == RELKIND_TOASTVALUE); smgrcreate(srel, INIT_FORKNUM, false); log_smgrcreate(newrlocator, INIT_FORKNUM); - smgrimmedsync(srel, INIT_FORKNUM); } smgrclose(srel); @@ -637,8 +634,6 @@ heapam_relation_copy_data(Relation rel, const RelFileLocator *newrlocator) { SMgrRelation dstrel; - dstrel = smgropen(*newrlocator, rel->rd_backend); - /* * Since we copy the file directly without looking at the shared buffers, * we'd better first flush out any pages of the source relation that are @@ -654,7 +649,7 @@ heapam_relation_copy_data(Relation rel, const RelFileLocator *newrlocator) * NOTE: any conflict in relfilenumber value will be caught in * RelationCreateStorage(). */ - RelationCreateStorage(*newrlocator, rel->rd_rel->relpersistence, true); + dstrel = RelationCreateStorage(*newrlocator, rel->rd_rel->relpersistence, true); /* copy main fork */ RelationCopyStorage(RelationGetSmgr(rel), dstrel, MAIN_FORKNUM, @@ -998,28 +993,36 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap, pfree(isnull); } +/* + * Prepare to analyze the next block in the read stream. Returns false if + * the stream is exhausted and true otherwise. The scan must have been started + * with SO_TYPE_ANALYZE option. + * + * This routine holds a buffer pin and lock on the heap page. They are held + * until heapam_scan_analyze_next_tuple() returns false. That is until all the + * items of the heap page are analyzed. + */ static bool -heapam_scan_analyze_next_block(TableScanDesc scan, BlockNumber blockno, - BufferAccessStrategy bstrategy) +heapam_scan_analyze_next_block(TableScanDesc scan, ReadStream *stream) { HeapScanDesc hscan = (HeapScanDesc) scan; /* * We must maintain a pin on the target page's buffer to ensure that * concurrent activity - e.g. HOT pruning - doesn't delete tuples out from - * under us. Hence, pin the page until we are done looking at it. We - * also choose to hold sharelock on the buffer throughout --- we could - * release and re-acquire sharelock for each tuple, but since we aren't - * doing much work per tuple, the extra lock traffic is probably better - * avoided. + * under us. It comes from the stream already pinned. We also choose to + * hold sharelock on the buffer throughout --- we could release and + * re-acquire sharelock for each tuple, but since we aren't doing much + * work per tuple, the extra lock traffic is probably better avoided. */ - hscan->rs_cblock = blockno; - hscan->rs_cindex = FirstOffsetNumber; - hscan->rs_cbuf = ReadBufferExtended(scan->rs_rd, MAIN_FORKNUM, - blockno, RBM_NORMAL, bstrategy); + hscan->rs_cbuf = read_stream_next_buffer(stream, NULL); + if (!BufferIsValid(hscan->rs_cbuf)) + return false; + LockBuffer(hscan->rs_cbuf, BUFFER_LOCK_SHARE); - /* in heap all blocks can contain tuples, so always return true */ + hscan->rs_cblock = BufferGetBlockNumber(hscan->rs_cbuf); + hscan->rs_cindex = FirstOffsetNumber; return true; } @@ -1052,7 +1055,7 @@ heapam_scan_analyze_next_tuple(TableScanDesc scan, TransactionId OldestXmin, * We ignore unused and redirect line pointers. DEAD line pointers * should be counted as dead, because we need vacuum to run to get rid * of them. Note that this rule agrees with the way that - * heap_page_prune() counts things. + * heap_page_prune_and_freeze() counts things. */ if (!ItemIdIsNormal(itemid)) { @@ -2128,13 +2131,33 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, hscan->rs_cindex = 0; hscan->rs_ntuples = 0; + /* + * We can skip fetching the heap page if we don't need any fields from the + * heap, the bitmap entries don't need rechecking, and all tuples on the + * page are visible to our transaction. + */ + if (!(scan->rs_flags & SO_NEED_TUPLES) && + !tbmres->recheck && + VM_ALL_VISIBLE(scan->rs_rd, tbmres->blockno, &hscan->rs_vmbuffer)) + { + /* can't be lossy in the skip_fetch case */ + Assert(tbmres->ntuples >= 0); + Assert(hscan->rs_empty_tuples_pending >= 0); + + hscan->rs_empty_tuples_pending += tbmres->ntuples; + + return true; + } + /* * Ignore any claimed entries past what we think is the end of the * relation. It may have been extended after the start of our scan (we * only hold an AccessShareLock, and it could be inserts from this - * backend). + * backend). We don't take this optimization in SERIALIZABLE isolation + * though, as we need to examine all invisible tuples reachable by the + * index. */ - if (block >= hscan->rs_nblocks) + if (!IsolationIsSerializable() && block >= hscan->rs_nblocks) return false; /* @@ -2238,6 +2261,16 @@ heapam_scan_bitmap_next_tuple(TableScanDesc scan, Page page; ItemId lp; + if (hscan->rs_empty_tuples_pending > 0) + { + /* + * If we don't have to fetch the tuple, just return nulls. + */ + ExecStoreAllNullTuple(slot); + hscan->rs_empty_tuples_pending--; + return true; + } + /* * Out of range? If so, nothing more to look at on this page */ @@ -2280,11 +2313,15 @@ heapam_scan_sample_next_block(TableScanDesc scan, SampleScanState *scanstate) if (hscan->rs_nblocks == 0) return false; - if (tsm->NextSampleBlock) + /* release previous scan buffer, if any */ + if (BufferIsValid(hscan->rs_cbuf)) { - blockno = tsm->NextSampleBlock(scanstate, hscan->rs_nblocks); - hscan->rs_cblock = blockno; + ReleaseBuffer(hscan->rs_cbuf); + hscan->rs_cbuf = InvalidBuffer; } + + if (tsm->NextSampleBlock) + blockno = tsm->NextSampleBlock(scanstate, hscan->rs_nblocks); else { /* scanning table sequentially */ @@ -2326,20 +2363,32 @@ heapam_scan_sample_next_block(TableScanDesc scan, SampleScanState *scanstate) } } + hscan->rs_cblock = blockno; + if (!BlockNumberIsValid(blockno)) { - if (BufferIsValid(hscan->rs_cbuf)) - ReleaseBuffer(hscan->rs_cbuf); - hscan->rs_cbuf = InvalidBuffer; - hscan->rs_cblock = InvalidBlockNumber; hscan->rs_inited = false; - return false; } - heapgetpage(scan, blockno); - hscan->rs_inited = true; + Assert(hscan->rs_cblock < hscan->rs_nblocks); + + /* + * Be sure to check for interrupts at least once per page. Checks at + * higher code levels won't be able to stop a sample scan that encounters + * many pages' worth of consecutive dead tuples. + */ + CHECK_FOR_INTERRUPTS(); + + /* Read page using selected strategy */ + hscan->rs_cbuf = ReadBufferExtended(hscan->rs_base.rs_rd, MAIN_FORKNUM, + blockno, RBM_NORMAL, hscan->rs_strategy); + /* in pagemode, prune the page and determine visible tuple offsets */ + if (hscan->rs_base.rs_flags & SO_ALLOW_PAGEMODE) + heap_prepare_pagescan(scan); + + hscan->rs_inited = true; return true; } @@ -2401,7 +2450,7 @@ heapam_scan_sample_next_tuple(TableScanDesc scan, SampleScanState *scanstate, visible = SampleHeapTupleVisible(scan, hscan->rs_cbuf, tuple, tupoffset); - /* in pagemode, heapgetpage did this for us */ + /* in pagemode, heap_prepare_pagescan did this for us */ if (!pagemode) HeapCheckForSerializableConflictOut(visible, scan->rs_rd, tuple, hscan->rs_cbuf, scan->rs_snapshot); @@ -2500,8 +2549,8 @@ SampleHeapTupleVisible(TableScanDesc scan, Buffer buffer, if (scan->rs_flags & SO_ALLOW_PAGEMODE) { /* - * In pageatatime mode, heapgetpage() already did visibility checks, - * so just look at the info it left in rs_vistuples[]. + * In pageatatime mode, heap_prepare_pagescan() already did visibility + * checks, so just look at the info it left in rs_vistuples[]. * * We use a binary search over the known-sorted array. Note: we could * save some effort if we insisted that NextSampleTuple select tuples diff --git a/src/backend/access/heap/heapam_visibility.c b/src/backend/access/heap/heapam_visibility.c index a71600134191d..9243feed01f9b 100644 --- a/src/backend/access/heap/heapam_visibility.c +++ b/src/backend/access/heap/heapam_visibility.c @@ -55,7 +55,7 @@ * HeapTupleSatisfiesAny() * all tuples are visible * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -69,7 +69,6 @@ #include "access/heapam.h" #include "access/htup_details.h" #include "access/multixact.h" -#include "access/subtrans.h" #include "access/tableam.h" #include "access/transam.h" #include "access/xact.h" @@ -77,7 +76,6 @@ #include "storage/bufmgr.h" #include "storage/procarray.h" #include "utils/builtins.h" -#include "utils/combocid.h" #include "utils/snapmgr.h" diff --git a/src/backend/access/heap/heaptoast.c b/src/backend/access/heap/heaptoast.c index 52ecd45654c6d..a420e1653046c 100644 --- a/src/backend/access/heap/heaptoast.c +++ b/src/backend/access/heap/heaptoast.c @@ -4,7 +4,7 @@ * Heap-specific definitions for external and compressed storage * of variable size attributes. * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/access/heap/hio.c b/src/backend/access/heap/hio.c index c275b08494d02..7c662cdf46ecf 100644 --- a/src/backend/access/heap/hio.c +++ b/src/backend/access/heap/hio.c @@ -3,7 +3,7 @@ * hio.c * POSTGRES heap access method input/output code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,7 +22,6 @@ #include "storage/bufmgr.h" #include "storage/freespace.h" #include "storage/lmgr.h" -#include "storage/smgr.h" /* @@ -283,6 +282,24 @@ RelationAddBlocks(Relation relation, BulkInsertState bistate, */ extend_by_pages += extend_by_pages * waitcount; + /* --- + * If we previously extended using the same bistate, it's very likely + * we'll extend some more. Try to extend by as many pages as + * before. This can be important for performance for several reasons, + * including: + * + * - It prevents mdzeroextend() switching between extending the + * relation in different ways, which is inefficient for some + * filesystems. + * + * - Contention is often intermittent. Even if we currently don't see + * other waiters (see above), extending by larger amounts can + * prevent future contention. + * --- + */ + if (bistate) + extend_by_pages = Max(extend_by_pages, bistate->already_extended_by); + /* * Can't extend by more than MAX_BUFFERS_TO_EXTEND_BY, we need to pin * them all concurrently. @@ -321,7 +338,7 @@ RelationAddBlocks(Relation relation, BulkInsertState bistate, * [auto]vacuum trying to truncate later pages as REL_TRUNCATE_MINIMUM is * way larger. */ - first_block = ExtendBufferedRelBy(EB_REL(relation), MAIN_FORKNUM, + first_block = ExtendBufferedRelBy(BMR_REL(relation), MAIN_FORKNUM, bistate ? bistate->strategy : NULL, EB_LOCK_FIRST, extend_by_pages, @@ -409,6 +426,7 @@ RelationAddBlocks(Relation relation, BulkInsertState bistate, /* maintain bistate->current_buf */ IncrBufferRefCount(buffer); bistate->current_buf = buffer; + bistate->already_extended_by += extend_by_pages; } return buffer; @@ -544,7 +562,7 @@ RelationGetBufferForTuple(Relation relation, Size len, * on, as cached in the BulkInsertState or relcache entry. If that * doesn't work, we ask the Free Space Map to locate a suitable page. * Since the FSM's info might be out of date, we have to be prepared to - * loop around and retry multiple times. (To insure this isn't an infinite + * loop around and retry multiple times. (To ensure this isn't an infinite * loop, we must update the FSM with the correct amount of free space on * each page that proves not to be suitable.) If the FSM has no record of * a page with enough free space, we give up and extend the relation. diff --git a/src/backend/access/heap/meson.build b/src/backend/access/heap/meson.build index 98397cbe81500..e00d5b4f0de2d 100644 --- a/src/backend/access/heap/meson.build +++ b/src/backend/access/heap/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'heapam.c', diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c index 47b9e209154d5..869d82ad66724 100644 --- a/src/backend/access/heap/pruneheap.c +++ b/src/backend/access/heap/pruneheap.c @@ -3,7 +3,7 @@ * pruneheap.c * heap page pruning and HOT-chain management code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -17,78 +17,163 @@ #include "access/heapam.h" #include "access/heapam_xlog.h" #include "access/htup_details.h" +#include "access/multixact.h" #include "access/transam.h" #include "access/xlog.h" #include "access/xloginsert.h" -#include "catalog/catalog.h" +#include "commands/vacuum.h" +#include "executor/instrument.h" #include "miscadmin.h" #include "pgstat.h" #include "storage/bufmgr.h" -#include "utils/snapmgr.h" #include "utils/rel.h" #include "utils/snapmgr.h" -/* Working data for heap_page_prune and subroutines */ +/* Working data for heap_page_prune_and_freeze() and subroutines */ typedef struct { - Relation rel; + /*------------------------------------------------------- + * Arguments passed to heap_page_prune_and_freeze() + *------------------------------------------------------- + */ /* tuple visibility test, initialized for the relation */ GlobalVisState *vistest; - - /* - * Thresholds set by TransactionIdLimitedForOldSnapshots() if they have - * been computed (done on demand, and only if - * OldSnapshotThresholdActive()). The first time a tuple is about to be - * removed based on the limited horizon, old_snap_used is set to true, and - * SetOldSnapshotThresholdTimestamp() is called. See - * heap_prune_satisfies_vacuum(). + /* whether or not dead items can be set LP_UNUSED during pruning */ + bool mark_unused_now; + /* whether to attempt freezing tuples */ + bool freeze; + struct VacuumCutoffs *cutoffs; + + /*------------------------------------------------------- + * Fields describing what to do to the page + *------------------------------------------------------- */ - TimestampTz old_snap_ts; - TransactionId old_snap_xmin; - bool old_snap_used; - - TransactionId new_prune_xid; /* new prune hint value for page */ - TransactionId snapshotConflictHorizon; /* latest xid removed */ + TransactionId new_prune_xid; /* new prune hint value */ + TransactionId latest_xid_removed; int nredirected; /* numbers of entries in arrays below */ int ndead; int nunused; + int nfrozen; /* arrays that accumulate indexes of items to be changed */ OffsetNumber redirected[MaxHeapTuplesPerPage * 2]; OffsetNumber nowdead[MaxHeapTuplesPerPage]; OffsetNumber nowunused[MaxHeapTuplesPerPage]; + HeapTupleFreeze frozen[MaxHeapTuplesPerPage]; + + /*------------------------------------------------------- + * Working state for HOT chain processing + *------------------------------------------------------- + */ + + /* + * 'root_items' contains offsets of all LP_REDIRECT line pointers and + * normal non-HOT tuples. They can be stand-alone items or the first item + * in a HOT chain. 'heaponly_items' contains heap-only tuples which can + * only be removed as part of a HOT chain. + */ + int nroot_items; + OffsetNumber root_items[MaxHeapTuplesPerPage]; + int nheaponly_items; + OffsetNumber heaponly_items[MaxHeapTuplesPerPage]; /* - * marked[i] is true if item i is entered in one of the above arrays. + * processed[offnum] is true if item at offnum has been processed. * * This needs to be MaxHeapTuplesPerPage + 1 long as FirstOffsetNumber is * 1. Otherwise every access would need to subtract 1. */ - bool marked[MaxHeapTuplesPerPage + 1]; + bool processed[MaxHeapTuplesPerPage + 1]; /* * Tuple visibility is only computed once for each tuple, for correctness - * and efficiency reasons; see comment in heap_page_prune() for details. - * This is of type int8[], instead of HTSV_Result[], so we can use -1 to - * indicate no visibility has been computed, e.g. for LP_DEAD items. + * and efficiency reasons; see comment in heap_page_prune_and_freeze() for + * details. This is of type int8[], instead of HTSV_Result[], so we can + * use -1 to indicate no visibility has been computed, e.g. for LP_DEAD + * items. * - * Same indexing as ->marked. + * This needs to be MaxHeapTuplesPerPage + 1 long as FirstOffsetNumber is + * 1. Otherwise every access would need to subtract 1. */ int8 htsv[MaxHeapTuplesPerPage + 1]; + + /* + * Freezing-related state. + */ + HeapPageFreeze pagefrz; + + /*------------------------------------------------------- + * Information about what was done + * + * These fields are not used by pruning itself for the most part, but are + * used to collect information about what was pruned and what state the + * page is in after pruning, for the benefit of the caller. They are + * copied to the caller's PruneFreezeResult at the end. + * ------------------------------------------------------- + */ + + int ndeleted; /* Number of tuples deleted from the page */ + + /* Number of live and recently dead tuples, after pruning */ + int live_tuples; + int recently_dead_tuples; + + /* Whether or not the page makes rel truncation unsafe */ + bool hastup; + + /* + * LP_DEAD items on the page after pruning. Includes existing LP_DEAD + * items + */ + int lpdead_items; /* number of items in the array */ + OffsetNumber *deadoffsets; /* points directly to presult->deadoffsets */ + + /* + * all_visible and all_frozen indicate if the all-visible and all-frozen + * bits in the visibility map can be set for this page after pruning. + * + * visibility_cutoff_xid is the newest xmin of live tuples on the page. + * The caller can use it as the conflict horizon, when setting the VM + * bits. It is only valid if we froze some tuples, and all_frozen is + * true. + * + * NOTE: all_visible and all_frozen don't include LP_DEAD items. That's + * convenient for heap_page_prune_and_freeze(), to use them to decide + * whether to freeze the page or not. The all_visible and all_frozen + * values returned to the caller are adjusted to include LP_DEAD items at + * the end. + * + * all_frozen should only be considered valid if all_visible is also set; + * we don't bother to clear the all_frozen flag every time we clear the + * all_visible flag. + */ + bool all_visible; + bool all_frozen; + TransactionId visibility_cutoff_xid; } PruneState; /* Local functions */ static HTSV_Result heap_prune_satisfies_vacuum(PruneState *prstate, HeapTuple tup, Buffer buffer); -static int heap_prune_chain(Buffer buffer, - OffsetNumber rootoffnum, - PruneState *prstate); +static inline HTSV_Result htsv_get_valid_status(int status); +static void heap_prune_chain(Page page, BlockNumber blockno, OffsetNumber maxoff, + OffsetNumber rootoffnum, PruneState *prstate); static void heap_prune_record_prunable(PruneState *prstate, TransactionId xid); static void heap_prune_record_redirect(PruneState *prstate, - OffsetNumber offnum, OffsetNumber rdoffnum); -static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum); -static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum); + OffsetNumber offnum, OffsetNumber rdoffnum, + bool was_normal); +static void heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum, + bool was_normal); +static void heap_prune_record_dead_or_unused(PruneState *prstate, OffsetNumber offnum, + bool was_normal); +static void heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum, bool was_normal); + +static void heap_prune_record_unchanged_lp_unused(Page page, PruneState *prstate, OffsetNumber offnum); +static void heap_prune_record_unchanged_lp_normal(Page page, PruneState *prstate, OffsetNumber offnum); +static void heap_prune_record_unchanged_lp_dead(Page page, PruneState *prstate, OffsetNumber offnum); +static void heap_prune_record_unchanged_lp_redirect(PruneState *prstate, OffsetNumber offnum); + static void page_verify_redirects(Page page); @@ -110,8 +195,6 @@ heap_page_prune_opt(Relation relation, Buffer buffer) Page page = BufferGetPage(buffer); TransactionId prune_xid; GlobalVisState *vistest; - TransactionId limited_xmin = InvalidTransactionId; - TimestampTz limited_ts = 0; Size minfree; /* @@ -122,15 +205,6 @@ heap_page_prune_opt(Relation relation, Buffer buffer) if (RecoveryInProgress()) return; - /* - * XXX: Magic to keep old_snapshot_threshold tests appear "working". They - * currently are broken, and discussion of what to do about them is - * ongoing. See - * https://www.postgresql.org/message-id/20200403001235.e6jfdll3gh2ygbuc%40alap3.anarazel.de - */ - if (old_snapshot_threshold == 0) - SnapshotTooOldMagicForTest(); - /* * First check whether there's any chance there's something to prune, * determining the appropriate horizon is a waste if there's no prune_xid @@ -143,35 +217,11 @@ heap_page_prune_opt(Relation relation, Buffer buffer) /* * Check whether prune_xid indicates that there may be dead rows that can * be cleaned up. - * - * It is OK to check the old snapshot limit before acquiring the cleanup - * lock because the worst that can happen is that we are not quite as - * aggressive about the cleanup (by however many transaction IDs are - * consumed between this point and acquiring the lock). This allows us to - * save significant overhead in the case where the page is found not to be - * prunable. - * - * Even if old_snapshot_threshold is set, we first check whether the page - * can be pruned without. Both because - * TransactionIdLimitedForOldSnapshots() is not cheap, and because not - * unnecessarily relying on old_snapshot_threshold avoids causing - * conflicts. */ vistest = GlobalVisTestFor(relation); if (!GlobalVisTestIsRemovableXid(vistest, prune_xid)) - { - if (!OldSnapshotThresholdActive()) - return; - - if (!TransactionIdLimitedForOldSnapshots(GlobalVisTestNonRemovableHorizon(vistest), - relation, - &limited_xmin, &limited_ts)) - return; - - if (!TransactionIdPrecedes(prune_xid, limited_xmin)) - return; - } + return; /* * We prune when a previous UPDATE failed to find enough space on the page @@ -202,15 +252,20 @@ heap_page_prune_opt(Relation relation, Buffer buffer) */ if (PageIsFull(page) || PageGetHeapFreeSpace(page) < minfree) { - int ndeleted, - nnewlpdead; + OffsetNumber dummy_off_loc; + PruneFreezeResult presult; - ndeleted = heap_page_prune(relation, buffer, vistest, limited_xmin, - limited_ts, &nnewlpdead, NULL); + /* + * For now, pass mark_unused_now as false regardless of whether or + * not the relation has indexes, since we cannot safely determine + * that during on-access pruning with the current implementation. + */ + heap_page_prune_and_freeze(relation, buffer, vistest, 0, + NULL, &presult, PRUNE_ON_ACCESS, &dummy_off_loc, NULL, NULL); /* * Report the number of tuples reclaimed to pgstats. This is - * ndeleted minus the number of newly-LP_DEAD-set items. + * presult.ndeleted minus the number of newly-LP_DEAD-set items. * * We derive the number of dead tuples like this to avoid totally * forgetting about items that were set to LP_DEAD, since they @@ -222,9 +277,9 @@ heap_page_prune_opt(Relation relation, Buffer buffer) * tracks ndeleted, since it will set the same LP_DEAD items to * LP_UNUSED separately. */ - if (ndeleted > nnewlpdead) + if (presult.ndeleted > presult.nnewlpdead) pgstat_update_heap_dead_tuples(relation, - ndeleted - nnewlpdead); + presult.ndeleted - presult.nnewlpdead); } /* And release buffer lock */ @@ -240,42 +295,85 @@ heap_page_prune_opt(Relation relation, Buffer buffer) /* - * Prune and repair fragmentation in the specified page. + * Prune and repair fragmentation and potentially freeze tuples on the + * specified page. * * Caller must have pin and buffer cleanup lock on the page. Note that we * don't update the FSM information for page on caller's behalf. Caller might * also need to account for a reduction in the length of the line pointer * array following array truncation by us. * + * If the HEAP_PRUNE_FREEZE option is set, we will also freeze tuples if it's + * required in order to advance relfrozenxid / relminmxid, or if it's + * considered advantageous for overall system performance to do so now. The + * 'cutoffs', 'presult', 'new_relfrozen_xid' and 'new_relmin_mxid' arguments + * are required when freezing. When HEAP_PRUNE_FREEZE option is set, we also + * set presult->all_visible and presult->all_frozen on exit, to indicate if + * the VM bits can be set. They are always set to false when the + * HEAP_PRUNE_FREEZE option is not set, because at the moment only callers + * that also freeze need that information. + * * vistest is used to distinguish whether tuples are DEAD or RECENTLY_DEAD - * (see heap_prune_satisfies_vacuum and - * HeapTupleSatisfiesVacuum). old_snap_xmin / old_snap_ts need to - * either have been set by TransactionIdLimitedForOldSnapshots, or - * InvalidTransactionId/0 respectively. + * (see heap_prune_satisfies_vacuum). + * + * options: + * MARK_UNUSED_NOW indicates that dead items can be set LP_UNUSED during + * pruning. + * + * FREEZE indicates that we will also freeze tuples, and will return + * 'all_visible', 'all_frozen' flags to the caller. + * + * cutoffs contains the freeze cutoffs, established by VACUUM at the beginning + * of vacuuming the relation. Required if HEAP_PRUNE_FREEZE option is set. + * cutoffs->OldestXmin is also used to determine if dead tuples are + * HEAPTUPLE_RECENTLY_DEAD or HEAPTUPLE_DEAD. * - * Sets *nnewlpdead for caller, indicating the number of items that were - * newly set LP_DEAD during prune operation. + * presult contains output parameters needed by callers, such as the number of + * tuples removed and the offsets of dead items on the page after pruning. + * heap_page_prune_and_freeze() is responsible for initializing it. Required + * by all callers. + * + * reason indicates why the pruning is performed. It is included in the WAL + * record for debugging and analysis purposes, but otherwise has no effect. * * off_loc is the offset location required by the caller to use in error * callback. * - * Returns the number of tuples deleted from the page during this call. + * new_relfrozen_xid and new_relmin_mxid must provided by the caller if the + * HEAP_PRUNE_FREEZE option is set. On entry, they contain the oldest XID and + * multi-XID seen on the relation so far. They will be updated with oldest + * values present on the page after pruning. After processing the whole + * relation, VACUUM can use these values as the new relfrozenxid/relminmxid + * for the relation. */ -int -heap_page_prune(Relation relation, Buffer buffer, - GlobalVisState *vistest, - TransactionId old_snap_xmin, - TimestampTz old_snap_ts, - int *nnewlpdead, - OffsetNumber *off_loc) +void +heap_page_prune_and_freeze(Relation relation, Buffer buffer, + GlobalVisState *vistest, + int options, + struct VacuumCutoffs *cutoffs, + PruneFreezeResult *presult, + PruneReason reason, + OffsetNumber *off_loc, + TransactionId *new_relfrozen_xid, + MultiXactId *new_relmin_mxid) { - int ndeleted = 0; Page page = BufferGetPage(buffer); BlockNumber blockno = BufferGetBlockNumber(buffer); OffsetNumber offnum, maxoff; PruneState prstate; HeapTupleData tup; + bool do_freeze; + bool do_prune; + bool do_hint; + bool hint_bit_fpi; + int64 fpi_before = pgWalUsage.wal_fpi; + + /* Copy parameters to prstate */ + prstate.vistest = vistest; + prstate.mark_unused_now = (options & HEAP_PAGE_PRUNE_MARK_UNUSED_NOW) != 0; + prstate.freeze = (options & HEAP_PAGE_PRUNE_FREEZE) != 0; + prstate.cutoffs = cutoffs; /* * Our strategy is to scan the page and make lists of items to change, @@ -289,28 +387,98 @@ heap_page_prune(Relation relation, Buffer buffer, * initialize the rest of our working state. */ prstate.new_prune_xid = InvalidTransactionId; - prstate.rel = relation; - prstate.vistest = vistest; - prstate.old_snap_xmin = old_snap_xmin; - prstate.old_snap_ts = old_snap_ts; - prstate.old_snap_used = false; - prstate.snapshotConflictHorizon = InvalidTransactionId; - prstate.nredirected = prstate.ndead = prstate.nunused = 0; - memset(prstate.marked, 0, sizeof(prstate.marked)); + prstate.latest_xid_removed = InvalidTransactionId; + prstate.nredirected = prstate.ndead = prstate.nunused = prstate.nfrozen = 0; + prstate.nroot_items = 0; + prstate.nheaponly_items = 0; + + /* initialize page freezing working state */ + prstate.pagefrz.freeze_required = false; + if (prstate.freeze) + { + Assert(new_relfrozen_xid && new_relmin_mxid); + prstate.pagefrz.FreezePageRelfrozenXid = *new_relfrozen_xid; + prstate.pagefrz.NoFreezePageRelfrozenXid = *new_relfrozen_xid; + prstate.pagefrz.FreezePageRelminMxid = *new_relmin_mxid; + prstate.pagefrz.NoFreezePageRelminMxid = *new_relmin_mxid; + } + else + { + Assert(new_relfrozen_xid == NULL && new_relmin_mxid == NULL); + prstate.pagefrz.FreezePageRelminMxid = InvalidMultiXactId; + prstate.pagefrz.NoFreezePageRelminMxid = InvalidMultiXactId; + prstate.pagefrz.FreezePageRelfrozenXid = InvalidTransactionId; + prstate.pagefrz.NoFreezePageRelfrozenXid = InvalidTransactionId; + } + + prstate.ndeleted = 0; + prstate.live_tuples = 0; + prstate.recently_dead_tuples = 0; + prstate.hastup = false; + prstate.lpdead_items = 0; + prstate.deadoffsets = presult->deadoffsets; + + /* + * Caller may update the VM after we're done. We can keep track of + * whether the page will be all-visible and all-frozen after pruning and + * freezing to help the caller to do that. + * + * Currently, only VACUUM sets the VM bits. To save the effort, only do + * the bookkeeping if the caller needs it. Currently, that's tied to + * HEAP_PAGE_PRUNE_FREEZE, but it could be a separate flag if you wanted + * to update the VM bits without also freezing or freeze without also + * setting the VM bits. + * + * In addition to telling the caller whether it can set the VM bit, we + * also use 'all_visible' and 'all_frozen' for our own decision-making. If + * the whole page would become frozen, we consider opportunistically + * freezing tuples. We will not be able to freeze the whole page if there + * are tuples present that are not visible to everyone or if there are + * dead tuples which are not yet removable. However, dead tuples which + * will be removed by the end of vacuuming should not preclude us from + * opportunistically freezing. Because of that, we do not clear + * all_visible when we see LP_DEAD items. We fix that at the end of the + * function, when we return the value to the caller, so that the caller + * doesn't set the VM bit incorrectly. + */ + if (prstate.freeze) + { + prstate.all_visible = true; + prstate.all_frozen = true; + } + else + { + /* + * Initializing to false allows skipping the work to update them in + * heap_prune_record_unchanged_lp_normal(). + */ + prstate.all_visible = false; + prstate.all_frozen = false; + } + + /* + * The visibility cutoff xid is the newest xmin of live tuples on the + * page. In the common case, this will be set as the conflict horizon the + * caller can use for updating the VM. If, at the end of freezing and + * pruning, the page is all-frozen, there is no possibility that any + * running transaction on the standby does not see tuples on the page as + * all-visible, so the conflict horizon remains InvalidTransactionId. + */ + prstate.visibility_cutoff_xid = InvalidTransactionId; maxoff = PageGetMaxOffsetNumber(page); - tup.t_tableOid = RelationGetRelid(prstate.rel); + tup.t_tableOid = RelationGetRelid(relation); /* - * Determine HTSV for all tuples. + * Determine HTSV for all tuples, and queue them up for processing as HOT + * chain roots or as heap-only items. * - * This is required for correctness to deal with cases where running HTSV - * twice could result in different results (e.g. RECENTLY_DEAD can turn to - * DEAD if another checked item causes GlobalVisTestIsRemovableFullXid() - * to update the horizon, INSERT_IN_PROGRESS can change to DEAD if the - * inserting transaction aborts, ...). That in turn could cause - * heap_prune_chain() to behave incorrectly if a tuple is reached twice, - * once directly via a heap_prune_chain() and once following a HOT chain. + * Determining HTSV only once for each tuple is required for correctness, + * to deal with cases where running HTSV twice could result in different + * results. For example, RECENTLY_DEAD can turn to DEAD if another + * checked item causes GlobalVisTestIsRemovableFullXid() to update the + * horizon, or INSERT_IN_PROGRESS can change to DEAD if the inserting + * transaction aborts. * * It's also good for performance. Most commonly tuples within a page are * stored at decreasing offsets (while the items are stored at increasing @@ -328,72 +496,265 @@ heap_page_prune(Relation relation, Buffer buffer, ItemId itemid = PageGetItemId(page, offnum); HeapTupleHeader htup; + /* + * Set the offset number so that we can display it along with any + * error that occurred while processing this tuple. + */ + *off_loc = offnum; + + prstate.processed[offnum] = false; + prstate.htsv[offnum] = -1; + /* Nothing to do if slot doesn't contain a tuple */ - if (!ItemIdIsNormal(itemid)) + if (!ItemIdIsUsed(itemid)) { - prstate.htsv[offnum] = -1; + heap_prune_record_unchanged_lp_unused(page, &prstate, offnum); continue; } - htup = (HeapTupleHeader) PageGetItem(page, itemid); - tup.t_data = htup; - tup.t_len = ItemIdGetLength(itemid); - ItemPointerSet(&(tup.t_self), blockno, offnum); + if (ItemIdIsDead(itemid)) + { + /* + * If the caller set mark_unused_now true, we can set dead line + * pointers LP_UNUSED now. + */ + if (unlikely(prstate.mark_unused_now)) + heap_prune_record_unused(&prstate, offnum, false); + else + heap_prune_record_unchanged_lp_dead(page, &prstate, offnum); + continue; + } + + if (ItemIdIsRedirected(itemid)) + { + /* This is the start of a HOT chain */ + prstate.root_items[prstate.nroot_items++] = offnum; + continue; + } + + Assert(ItemIdIsNormal(itemid)); /* - * Set the offset number so that we can display it along with any - * error that occurred while processing this tuple. + * Get the tuple's visibility status and queue it up for processing. */ - if (off_loc) - *off_loc = offnum; + htup = (HeapTupleHeader) PageGetItem(page, itemid); + tup.t_data = htup; + tup.t_len = ItemIdGetLength(itemid); + ItemPointerSet(&tup.t_self, blockno, offnum); prstate.htsv[offnum] = heap_prune_satisfies_vacuum(&prstate, &tup, buffer); + + if (!HeapTupleHeaderIsHeapOnly(htup)) + prstate.root_items[prstate.nroot_items++] = offnum; + else + prstate.heaponly_items[prstate.nheaponly_items++] = offnum; } - /* Scan the page */ - for (offnum = FirstOffsetNumber; - offnum <= maxoff; - offnum = OffsetNumberNext(offnum)) + /* + * If checksums are enabled, heap_prune_satisfies_vacuum() may have caused + * an FPI to be emitted. + */ + hint_bit_fpi = fpi_before != pgWalUsage.wal_fpi; + + /* + * Process HOT chains. + * + * We added the items to the array starting from 'maxoff', so by + * processing the array in reverse order, we process the items in + * ascending offset number order. The order doesn't matter for + * correctness, but some quick micro-benchmarking suggests that this is + * faster. (Earlier PostgreSQL versions, which scanned all the items on + * the page instead of using the root_items array, also did it in + * ascending offset number order.) + */ + for (int i = prstate.nroot_items - 1; i >= 0; i--) { - ItemId itemid; + offnum = prstate.root_items[i]; /* Ignore items already processed as part of an earlier chain */ - if (prstate.marked[offnum]) + if (prstate.processed[offnum]) continue; /* see preceding loop */ - if (off_loc) - *off_loc = offnum; + *off_loc = offnum; + + /* Process this item or chain of items */ + heap_prune_chain(page, blockno, maxoff, offnum, &prstate); + } + + /* + * Process any heap-only tuples that were not already processed as part of + * a HOT chain. + */ + for (int i = prstate.nheaponly_items - 1; i >= 0; i--) + { + offnum = prstate.heaponly_items[i]; - /* Nothing to do if slot is empty or already dead */ - itemid = PageGetItemId(page, offnum); - if (!ItemIdIsUsed(itemid) || ItemIdIsDead(itemid)) + if (prstate.processed[offnum]) continue; - /* Process this item or chain of items */ - ndeleted += heap_prune_chain(buffer, offnum, &prstate); + /* see preceding loop */ + *off_loc = offnum; + + /* + * If the tuple is DEAD and doesn't chain to anything else, mark it + * unused. (If it does chain, we can only remove it as part of + * pruning its chain.) + * + * We need this primarily to handle aborted HOT updates, that is, + * XMIN_INVALID heap-only tuples. Those might not be linked to by any + * chain, since the parent tuple might be re-updated before any + * pruning occurs. So we have to be able to reap them separately from + * chain-pruning. (Note that HeapTupleHeaderIsHotUpdated will never + * return true for an XMIN_INVALID tuple, so this code will work even + * when there were sequential updates within the aborted transaction.) + */ + if (prstate.htsv[offnum] == HEAPTUPLE_DEAD) + { + ItemId itemid = PageGetItemId(page, offnum); + HeapTupleHeader htup = (HeapTupleHeader) PageGetItem(page, itemid); + + if (likely(!HeapTupleHeaderIsHotUpdated(htup))) + { + HeapTupleHeaderAdvanceConflictHorizon(htup, + &prstate.latest_xid_removed); + heap_prune_record_unused(&prstate, offnum, true); + } + else + { + /* + * This tuple should've been processed and removed as part of + * a HOT chain, so something's wrong. To preserve evidence, + * we don't dare to remove it. We cannot leave behind a DEAD + * tuple either, because that will cause VACUUM to error out. + * Throwing an error with a distinct error message seems like + * the least bad option. + */ + elog(ERROR, "dead heap-only tuple (%u, %d) is not linked to from any HOT chain", + blockno, offnum); + } + } + else + heap_prune_record_unchanged_lp_normal(page, &prstate, offnum); } + /* We should now have processed every tuple exactly once */ +#ifdef USE_ASSERT_CHECKING + for (offnum = FirstOffsetNumber; + offnum <= maxoff; + offnum = OffsetNumberNext(offnum)) + { + *off_loc = offnum; + + Assert(prstate.processed[offnum]); + } +#endif + /* Clear the offset information once we have processed the given page. */ - if (off_loc) - *off_loc = InvalidOffsetNumber; + *off_loc = InvalidOffsetNumber; - /* Any error while applying the changes is critical */ - START_CRIT_SECTION(); + do_prune = prstate.nredirected > 0 || + prstate.ndead > 0 || + prstate.nunused > 0; - /* Have we found any prunable items? */ - if (prstate.nredirected > 0 || prstate.ndead > 0 || prstate.nunused > 0) + /* + * Even if we don't prune anything, if we found a new value for the + * pd_prune_xid field or the page was marked full, we will update the hint + * bit. + */ + do_hint = ((PageHeader) page)->pd_prune_xid != prstate.new_prune_xid || + PageIsFull(page); + + /* + * Decide if we want to go ahead with freezing according to the freeze + * plans we prepared, or not. + */ + do_freeze = false; + if (prstate.freeze) + { + if (prstate.pagefrz.freeze_required) + { + /* + * heap_prepare_freeze_tuple indicated that at least one XID/MXID + * from before FreezeLimit/MultiXactCutoff is present. Must + * freeze to advance relfrozenxid/relminmxid. + */ + do_freeze = true; + } + else + { + /* + * Opportunistically freeze the page if we are generating an FPI + * anyway and if doing so means that we can set the page + * all-frozen afterwards (might not happen until VACUUM's final + * heap pass). + * + * XXX: Previously, we knew if pruning emitted an FPI by checking + * pgWalUsage.wal_fpi before and after pruning. Once the freeze + * and prune records were combined, this heuristic couldn't be + * used anymore. The opportunistic freeze heuristic must be + * improved; however, for now, try to approximate the old logic. + */ + if (prstate.all_visible && prstate.all_frozen && prstate.nfrozen > 0) + { + /* + * Freezing would make the page all-frozen. Have already + * emitted an FPI or will do so anyway? + */ + if (RelationNeedsWAL(relation)) + { + if (hint_bit_fpi) + do_freeze = true; + else if (do_prune) + { + if (XLogCheckBufferNeedsBackup(buffer)) + do_freeze = true; + } + else if (do_hint) + { + if (XLogHintBitIsNeeded() && XLogCheckBufferNeedsBackup(buffer)) + do_freeze = true; + } + } + } + } + } + + if (do_freeze) + { + /* + * Validate the tuples we will be freezing before entering the + * critical section. + */ + heap_pre_freeze_checks(buffer, prstate.frozen, prstate.nfrozen); + } + else if (prstate.nfrozen > 0) { /* - * Apply the planned item changes, then repair page fragmentation, and - * update the page's hint bit about whether it has free line pointers. + * The page contained some tuples that were not already frozen, and we + * chose not to freeze them now. The page won't be all-frozen then. */ - heap_page_prune_execute(buffer, - prstate.redirected, prstate.nredirected, - prstate.nowdead, prstate.ndead, - prstate.nowunused, prstate.nunused); + Assert(!prstate.pagefrz.freeze_required); + prstate.all_frozen = false; + prstate.nfrozen = 0; /* avoid miscounts in instrumentation */ + } + else + { + /* + * We have no freeze plans to execute. The page might already be + * all-frozen (perhaps only following pruning), though. Such pages + * can be marked all-frozen in the VM by our caller, even though none + * of its tuples were newly frozen here. + */ + } + + /* Any error while applying the changes is critical */ + START_CRIT_SECTION(); + + if (do_hint) + { /* * Update the page's pd_prune_xid field to either zero, or the lowest * XID of any soon-prunable tuple. @@ -407,93 +768,150 @@ heap_page_prune(Relation relation, Buffer buffer, */ PageClearFull(page); - MarkBufferDirty(buffer); - /* - * Emit a WAL XLOG_HEAP2_PRUNE record showing what we did + * If that's all we had to do to the page, this is a non-WAL-logged + * hint. If we are going to freeze or prune the page, we will mark + * the buffer dirty below. */ - if (RelationNeedsWAL(relation)) + if (!do_freeze && !do_prune) + MarkBufferDirtyHint(buffer, true); + } + + if (do_prune || do_freeze) + { + /* Apply the planned item changes and repair page fragmentation. */ + if (do_prune) { - xl_heap_prune xlrec; - XLogRecPtr recptr; + heap_page_prune_execute(buffer, false, + prstate.redirected, prstate.nredirected, + prstate.nowdead, prstate.ndead, + prstate.nowunused, prstate.nunused); + } - xlrec.isCatalogRel = RelationIsAccessibleInLogicalDecoding(relation); - xlrec.snapshotConflictHorizon = prstate.snapshotConflictHorizon; - xlrec.nredirected = prstate.nredirected; - xlrec.ndead = prstate.ndead; + if (do_freeze) + heap_freeze_prepared_tuples(buffer, prstate.frozen, prstate.nfrozen); - XLogBeginInsert(); - XLogRegisterData((char *) &xlrec, SizeOfHeapPrune); + MarkBufferDirty(buffer); - XLogRegisterBuffer(0, buffer, REGBUF_STANDARD); + /* + * Emit a WAL XLOG_HEAP2_PRUNE_FREEZE record showing what we did + */ + if (RelationNeedsWAL(relation)) + { + /* + * The snapshotConflictHorizon for the whole record should be the + * most conservative of all the horizons calculated for any of the + * possible modifications. If this record will prune tuples, any + * transactions on the standby older than the youngest xmax of the + * most recently removed tuple this record will prune will + * conflict. If this record will freeze tuples, any transactions + * on the standby with xids older than the youngest tuple this + * record will freeze will conflict. + */ + TransactionId frz_conflict_horizon = InvalidTransactionId; + TransactionId conflict_xid; /* - * The OffsetNumber arrays are not actually in the buffer, but we - * pretend that they are. When XLogInsert stores the whole - * buffer, the offset arrays need not be stored too. + * We can use the visibility_cutoff_xid as our cutoff for + * conflicts when the whole page is eligible to become all-frozen + * in the VM once we're done with it. Otherwise we generate a + * conservative cutoff by stepping back from OldestXmin. */ - if (prstate.nredirected > 0) - XLogRegisterBufData(0, (char *) prstate.redirected, - prstate.nredirected * - sizeof(OffsetNumber) * 2); + if (do_freeze) + { + if (prstate.all_visible && prstate.all_frozen) + frz_conflict_horizon = prstate.visibility_cutoff_xid; + else + { + /* Avoids false conflicts when hot_standby_feedback in use */ + frz_conflict_horizon = prstate.cutoffs->OldestXmin; + TransactionIdRetreat(frz_conflict_horizon); + } + } - if (prstate.ndead > 0) - XLogRegisterBufData(0, (char *) prstate.nowdead, - prstate.ndead * sizeof(OffsetNumber)); + if (TransactionIdFollows(frz_conflict_horizon, prstate.latest_xid_removed)) + conflict_xid = frz_conflict_horizon; + else + conflict_xid = prstate.latest_xid_removed; + + log_heap_prune_and_freeze(relation, buffer, + conflict_xid, + true, reason, + prstate.frozen, prstate.nfrozen, + prstate.redirected, prstate.nredirected, + prstate.nowdead, prstate.ndead, + prstate.nowunused, prstate.nunused); + } + } - if (prstate.nunused > 0) - XLogRegisterBufData(0, (char *) prstate.nowunused, - prstate.nunused * sizeof(OffsetNumber)); + END_CRIT_SECTION(); - recptr = XLogInsert(RM_HEAP2_ID, XLOG_HEAP2_PRUNE); + /* Copy information back for caller */ + presult->ndeleted = prstate.ndeleted; + presult->nnewlpdead = prstate.ndead; + presult->nfrozen = prstate.nfrozen; + presult->live_tuples = prstate.live_tuples; + presult->recently_dead_tuples = prstate.recently_dead_tuples; - PageSetLSN(BufferGetPage(buffer), recptr); - } + /* + * It was convenient to ignore LP_DEAD items in all_visible earlier on to + * make the choice of whether or not to freeze the page unaffected by the + * short-term presence of LP_DEAD items. These LP_DEAD items were + * effectively assumed to be LP_UNUSED items in the making. It doesn't + * matter which vacuum heap pass (initial pass or final pass) ends up + * setting the page all-frozen, as long as the ongoing VACUUM does it. + * + * Now that freezing has been finalized, unset all_visible if there are + * any LP_DEAD items on the page. It needs to reflect the present state + * of the page, as expected by our caller. + */ + if (prstate.all_visible && prstate.lpdead_items == 0) + { + presult->all_visible = prstate.all_visible; + presult->all_frozen = prstate.all_frozen; } else { - /* - * If we didn't prune anything, but have found a new value for the - * pd_prune_xid field, update it and mark the buffer dirty. This is - * treated as a non-WAL-logged hint. - * - * Also clear the "page is full" flag if it is set, since there's no - * point in repeating the prune/defrag process until something else - * happens to the page. - */ - if (((PageHeader) page)->pd_prune_xid != prstate.new_prune_xid || - PageIsFull(page)) - { - ((PageHeader) page)->pd_prune_xid = prstate.new_prune_xid; - PageClearFull(page); - MarkBufferDirtyHint(buffer, true); - } + presult->all_visible = false; + presult->all_frozen = false; } - END_CRIT_SECTION(); + presult->hastup = prstate.hastup; - /* Record number of newly-set-LP_DEAD items for caller */ - *nnewlpdead = prstate.ndead; + /* + * For callers planning to update the visibility map, the conflict horizon + * for that record must be the newest xmin on the page. However, if the + * page is completely frozen, there can be no conflict and the + * vm_conflict_horizon should remain InvalidTransactionId. This includes + * the case that we just froze all the tuples; the prune-freeze record + * included the conflict XID already so the caller doesn't need it. + */ + if (presult->all_frozen) + presult->vm_conflict_horizon = InvalidTransactionId; + else + presult->vm_conflict_horizon = prstate.visibility_cutoff_xid; + + presult->lpdead_items = prstate.lpdead_items; + /* the presult->deadoffsets array was already filled in */ - return ndeleted; + if (prstate.freeze) + { + if (presult->nfrozen > 0) + { + *new_relfrozen_xid = prstate.pagefrz.FreezePageRelfrozenXid; + *new_relmin_mxid = prstate.pagefrz.FreezePageRelminMxid; + } + else + { + *new_relfrozen_xid = prstate.pagefrz.NoFreezePageRelfrozenXid; + *new_relmin_mxid = prstate.pagefrz.NoFreezePageRelminMxid; + } + } } /* * Perform visibility checks for heap pruning. - * - * This is more complicated than just using GlobalVisTestIsRemovableXid() - * because of old_snapshot_threshold. We only want to increase the threshold - * that triggers errors for old snapshots when we actually decide to remove a - * row based on the limited horizon. - * - * Due to its cost we also only want to call - * TransactionIdLimitedForOldSnapshots() if necessary, i.e. we might not have - * done so in heap_page_prune_opt() if pd_prune_xid was old enough. But we - * still want to be able to remove rows that are too new to be removed - * according to prstate->vistest, but that can be removed based on - * old_snapshot_threshold. So we call TransactionIdLimitedForOldSnapshots() on - * demand in here, if appropriate. */ static HTSV_Result heap_prune_satisfies_vacuum(PruneState *prstate, HeapTuple tup, Buffer buffer) @@ -507,72 +925,58 @@ heap_prune_satisfies_vacuum(PruneState *prstate, HeapTuple tup, Buffer buffer) return res; /* - * If we are already relying on the limited xmin, there is no need to - * delay doing so anymore. + * For VACUUM, we must be sure to prune tuples with xmax older than + * OldestXmin -- a visibility cutoff determined at the beginning of + * vacuuming the relation. OldestXmin is used for freezing determination + * and we cannot freeze dead tuples' xmaxes. */ - if (prstate->old_snap_used) - { - Assert(TransactionIdIsValid(prstate->old_snap_xmin)); - - if (TransactionIdPrecedes(dead_after, prstate->old_snap_xmin)) - res = HEAPTUPLE_DEAD; - return res; - } + if (prstate->cutoffs && + TransactionIdIsValid(prstate->cutoffs->OldestXmin) && + NormalTransactionIdPrecedes(dead_after, prstate->cutoffs->OldestXmin)) + return HEAPTUPLE_DEAD; /* - * First check if GlobalVisTestIsRemovableXid() is sufficient to find the - * row dead. If not, and old_snapshot_threshold is enabled, try to use the - * lowered horizon. + * Determine whether or not the tuple is considered dead when compared + * with the provided GlobalVisState. On-access pruning does not provide + * VacuumCutoffs. And for vacuum, even if the tuple's xmax is not older + * than OldestXmin, GlobalVisTestIsRemovableXid() could find the row dead + * if the GlobalVisState has been updated since the beginning of vacuuming + * the relation. */ if (GlobalVisTestIsRemovableXid(prstate->vistest, dead_after)) - res = HEAPTUPLE_DEAD; - else if (OldSnapshotThresholdActive()) - { - /* haven't determined limited horizon yet, requests */ - if (!TransactionIdIsValid(prstate->old_snap_xmin)) - { - TransactionId horizon = - GlobalVisTestNonRemovableHorizon(prstate->vistest); - - TransactionIdLimitedForOldSnapshots(horizon, prstate->rel, - &prstate->old_snap_xmin, - &prstate->old_snap_ts); - } - - if (TransactionIdIsValid(prstate->old_snap_xmin) && - TransactionIdPrecedes(dead_after, prstate->old_snap_xmin)) - { - /* - * About to remove row based on snapshot_too_old. Need to raise - * the threshold so problematic accesses would error. - */ - Assert(!prstate->old_snap_used); - SetOldSnapshotThresholdTimestamp(prstate->old_snap_ts, - prstate->old_snap_xmin); - prstate->old_snap_used = true; - res = HEAPTUPLE_DEAD; - } - } + return HEAPTUPLE_DEAD; return res; } +/* + * Pruning calculates tuple visibility once and saves the results in an array + * of int8. See PruneState.htsv for details. This helper function is meant + * to guard against examining visibility status array members which have not + * yet been computed. + */ +static inline HTSV_Result +htsv_get_valid_status(int status) +{ + Assert(status >= HEAPTUPLE_DEAD && + status <= HEAPTUPLE_DELETE_IN_PROGRESS); + return (HTSV_Result) status; +} + /* * Prune specified line pointer or a HOT chain originating at line pointer. * + * Tuple visibility information is provided in prstate->htsv. + * * If the item is an index-referenced tuple (i.e. not a heap-only tuple), * the HOT chain is pruned by removing all DEAD tuples at the start of the HOT * chain. We also prune any RECENTLY_DEAD tuples preceding a DEAD tuple. * This is OK because a RECENTLY_DEAD tuple preceding a DEAD tuple is really * DEAD, our visibility test is just too coarse to detect it. * - * In general, pruning must never leave behind a DEAD tuple that still has - * tuple storage. VACUUM isn't prepared to deal with that case. That's why - * VACUUM prunes the same heap page a second time (without dropping its lock - * in the interim) when it sees a newly DEAD tuple that we initially saw as - * in-progress. Retrying pruning like this can only happen when an inserting - * transaction concurrently aborts. + * Pruning must never leave behind a DEAD tuple that still has tuple storage. + * VACUUM isn't prepared to deal with that case. * * The root line pointer is redirected to the tuple immediately after the * latest DEAD tuple. If all tuples in the chain are DEAD, the root line @@ -583,68 +987,31 @@ heap_prune_satisfies_vacuum(PruneState *prstate, HeapTuple tup, Buffer buffer) * prstate showing the changes to be made. Items to be redirected are added * to the redirected[] array (two entries per redirection); items to be set to * LP_DEAD state are added to nowdead[]; and items to be set to LP_UNUSED - * state are added to nowunused[]. - * - * Returns the number of tuples (to be) deleted from the page. + * state are added to nowunused[]. We perform bookkeeping of live tuples, + * visibility etc. based on what the page will look like after the changes + * applied. All that bookkeeping is performed in the heap_prune_record_*() + * subroutines. The division of labor is that heap_prune_chain() decides the + * fate of each tuple, ie. whether it's going to be removed, redirected or + * left unchanged, and the heap_prune_record_*() subroutines update PruneState + * based on that outcome. */ -static int -heap_prune_chain(Buffer buffer, OffsetNumber rootoffnum, PruneState *prstate) +static void +heap_prune_chain(Page page, BlockNumber blockno, OffsetNumber maxoff, + OffsetNumber rootoffnum, PruneState *prstate) { - int ndeleted = 0; - Page dp = (Page) BufferGetPage(buffer); TransactionId priorXmax = InvalidTransactionId; ItemId rootlp; - HeapTupleHeader htup; - OffsetNumber latestdead = InvalidOffsetNumber, - maxoff = PageGetMaxOffsetNumber(dp), - offnum; + OffsetNumber offnum; OffsetNumber chainitems[MaxHeapTuplesPerPage]; - int nchain = 0, - i; - - rootlp = PageGetItemId(dp, rootoffnum); /* - * If it's a heap-only tuple, then it is not the start of a HOT chain. + * After traversing the HOT chain, ndeadchain is the index in chainitems + * of the first live successor after the last dead item. */ - if (ItemIdIsNormal(rootlp)) - { - Assert(prstate->htsv[rootoffnum] != -1); - htup = (HeapTupleHeader) PageGetItem(dp, rootlp); + int ndeadchain = 0, + nchain = 0; - if (HeapTupleHeaderIsHeapOnly(htup)) - { - /* - * If the tuple is DEAD and doesn't chain to anything else, mark - * it unused immediately. (If it does chain, we can only remove - * it as part of pruning its chain.) - * - * We need this primarily to handle aborted HOT updates, that is, - * XMIN_INVALID heap-only tuples. Those might not be linked to by - * any chain, since the parent tuple might be re-updated before - * any pruning occurs. So we have to be able to reap them - * separately from chain-pruning. (Note that - * HeapTupleHeaderIsHotUpdated will never return true for an - * XMIN_INVALID tuple, so this code will work even when there were - * sequential updates within the aborted transaction.) - * - * Note that we might first arrive at a dead heap-only tuple - * either here or while following a chain below. Whichever path - * gets there first will mark the tuple unused. - */ - if (prstate->htsv[rootoffnum] == HEAPTUPLE_DEAD && - !HeapTupleHeaderIsHotUpdated(htup)) - { - heap_prune_record_unused(prstate, rootoffnum); - HeapTupleHeaderAdvanceConflictHorizon(htup, - &prstate->snapshotConflictHorizon); - ndeleted++; - } - - /* Nothing more to do */ - return ndeleted; - } - } + rootlp = PageGetItemId(page, rootoffnum); /* Start from the root tuple */ offnum = rootoffnum; @@ -652,9 +1019,8 @@ heap_prune_chain(Buffer buffer, OffsetNumber rootoffnum, PruneState *prstate) /* while not end of the chain */ for (;;) { + HeapTupleHeader htup; ItemId lp; - bool tupdead, - recent_dead; /* Sanity check (pure paranoia) */ if (offnum < FirstOffsetNumber) @@ -668,14 +1034,18 @@ heap_prune_chain(Buffer buffer, OffsetNumber rootoffnum, PruneState *prstate) break; /* If item is already processed, stop --- it must not be same chain */ - if (prstate->marked[offnum]) + if (prstate->processed[offnum]) break; - lp = PageGetItemId(dp, offnum); + lp = PageGetItemId(page, offnum); - /* Unused item obviously isn't part of the chain */ - if (!ItemIdIsUsed(lp)) - break; + /* + * Unused item obviously isn't part of the chain. Likewise, a dead + * line pointer can't be part of the chain. Both of those cases were + * already marked as processed. + */ + Assert(ItemIdIsUsed(lp)); + Assert(!ItemIdIsDead(lp)); /* * If we are looking at the redirected root line pointer, jump to the @@ -691,17 +1061,9 @@ heap_prune_chain(Buffer buffer, OffsetNumber rootoffnum, PruneState *prstate) continue; } - /* - * Likewise, a dead line pointer can't be part of the chain. (We - * already eliminated the case of dead root tuple outside this - * function.) - */ - if (ItemIdIsDead(lp)) - break; - Assert(ItemIdIsNormal(lp)); - Assert(prstate->htsv[offnum] != -1); - htup = (HeapTupleHeader) PageGetItem(dp, lp); + + htup = (HeapTupleHeader) PageGetItem(page, lp); /* * Check the tuple XMIN against prior XMAX, if any @@ -715,76 +1077,53 @@ heap_prune_chain(Buffer buffer, OffsetNumber rootoffnum, PruneState *prstate) */ chainitems[nchain++] = offnum; - /* - * Check tuple's visibility status. - */ - tupdead = recent_dead = false; - - switch ((HTSV_Result) prstate->htsv[offnum]) + switch (htsv_get_valid_status(prstate->htsv[offnum])) { case HEAPTUPLE_DEAD: - tupdead = true; + + /* Remember the last DEAD tuple seen */ + ndeadchain = nchain; + HeapTupleHeaderAdvanceConflictHorizon(htup, + &prstate->latest_xid_removed); + /* Advance to next chain member */ break; case HEAPTUPLE_RECENTLY_DEAD: - recent_dead = true; /* - * This tuple may soon become DEAD. Update the hint field so - * that the page is reconsidered for pruning in future. + * We don't need to advance the conflict horizon for + * RECENTLY_DEAD tuples, even if we are removing them. This + * is because we only remove RECENTLY_DEAD tuples if they + * precede a DEAD tuple, and the DEAD tuple must have been + * inserted by a newer transaction than the RECENTLY_DEAD + * tuple by virtue of being later in the chain. We will have + * advanced the conflict horizon for the DEAD tuple. */ - heap_prune_record_prunable(prstate, - HeapTupleHeaderGetUpdateXid(htup)); - break; - - case HEAPTUPLE_DELETE_IN_PROGRESS: /* - * This tuple may soon become DEAD. Update the hint field so - * that the page is reconsidered for pruning in future. + * Advance past RECENTLY_DEAD tuples just in case there's a + * DEAD one after them. We have to make sure that we don't + * miss any DEAD tuples, since DEAD tuples that still have + * tuple storage after pruning will confuse VACUUM. */ - heap_prune_record_prunable(prstate, - HeapTupleHeaderGetUpdateXid(htup)); break; + case HEAPTUPLE_DELETE_IN_PROGRESS: case HEAPTUPLE_LIVE: case HEAPTUPLE_INSERT_IN_PROGRESS: - - /* - * If we wanted to optimize for aborts, we might consider - * marking the page prunable when we see INSERT_IN_PROGRESS. - * But we don't. See related decisions about when to mark the - * page prunable in heapam.c. - */ - break; + goto process_chain; default: elog(ERROR, "unexpected HeapTupleSatisfiesVacuum result"); - break; + goto process_chain; } - /* - * Remember the last DEAD tuple seen. We will advance past - * RECENTLY_DEAD tuples just in case there's a DEAD one after them; - * but we can't advance past anything else. We have to make sure that - * we don't miss any DEAD tuples, since DEAD tuples that still have - * tuple storage after pruning will confuse VACUUM. - */ - if (tupdead) - { - latestdead = offnum; - HeapTupleHeaderAdvanceConflictHorizon(htup, - &prstate->snapshotConflictHorizon); - } - else if (!recent_dead) - break; - /* * If the tuple is not HOT-updated, then we are at the end of this * HOT-update chain. */ if (!HeapTupleHeaderIsHotUpdated(htup)) - break; + goto process_chain; /* HOT implies it can't have moved to different partition */ Assert(!HeapTupleHeaderIndicatesMovedPartitions(htup)); @@ -792,63 +1131,69 @@ heap_prune_chain(Buffer buffer, OffsetNumber rootoffnum, PruneState *prstate) /* * Advance to next chain member. */ - Assert(ItemPointerGetBlockNumber(&htup->t_ctid) == - BufferGetBlockNumber(buffer)); + Assert(ItemPointerGetBlockNumber(&htup->t_ctid) == blockno); offnum = ItemPointerGetOffsetNumber(&htup->t_ctid); priorXmax = HeapTupleHeaderGetUpdateXid(htup); } - /* - * If we found a DEAD tuple in the chain, adjust the HOT chain so that all - * the DEAD tuples at the start of the chain are removed and the root line - * pointer is appropriately redirected. - */ - if (OffsetNumberIsValid(latestdead)) + if (ItemIdIsRedirected(rootlp) && nchain < 2) { /* - * Mark as unused each intermediate item that we are able to remove - * from the chain. - * - * When the previous item is the last dead tuple seen, we are at the - * right candidate for redirection. + * We found a redirect item that doesn't point to a valid follow-on + * item. This can happen if the loop in heap_page_prune_and_freeze() + * caused us to visit the dead successor of a redirect item before + * visiting the redirect item. We can clean up by setting the + * redirect item to LP_DEAD state or LP_UNUSED if the caller + * indicated. */ - for (i = 1; (i < nchain) && (chainitems[i - 1] != latestdead); i++) - { - heap_prune_record_unused(prstate, chainitems[i]); - ndeleted++; - } + heap_prune_record_dead_or_unused(prstate, rootoffnum, false); + return; + } + +process_chain: + if (ndeadchain == 0) + { /* - * If the root entry had been a normal tuple, we are deleting it, so - * count it in the result. But changing a redirect (even to DEAD - * state) doesn't count. + * No DEAD tuple was found, so the chain is entirely composed of + * normal, unchanged tuples. Leave it alone. */ - if (ItemIdIsNormal(rootlp)) - ndeleted++; + int i = 0; + if (ItemIdIsRedirected(rootlp)) + { + heap_prune_record_unchanged_lp_redirect(prstate, rootoffnum); + i++; + } + for (; i < nchain; i++) + heap_prune_record_unchanged_lp_normal(page, prstate, chainitems[i]); + } + else if (ndeadchain == nchain) + { /* - * If the DEAD tuple is at the end of the chain, the entire chain is - * dead and the root line pointer can be marked dead. Otherwise just - * redirect the root to the correct chain member. + * The entire chain is dead. Mark the root line pointer LP_DEAD, and + * fully remove the other tuples in the chain. */ - if (i >= nchain) - heap_prune_record_dead(prstate, rootoffnum); - else - heap_prune_record_redirect(prstate, rootoffnum, chainitems[i]); + heap_prune_record_dead_or_unused(prstate, rootoffnum, ItemIdIsNormal(rootlp)); + for (int i = 1; i < nchain; i++) + heap_prune_record_unused(prstate, chainitems[i], true); } - else if (nchain < 2 && ItemIdIsRedirected(rootlp)) + else { /* - * We found a redirect item that doesn't point to a valid follow-on - * item. This can happen if the loop in heap_page_prune caused us to - * visit the dead successor of a redirect item before visiting the - * redirect item. We can clean up by setting the redirect item to - * DEAD state. + * We found a DEAD tuple in the chain. Redirect the root line pointer + * to the first non-DEAD tuple, and mark as unused each intermediate + * item that we are able to remove from the chain. */ - heap_prune_record_dead(prstate, rootoffnum); + heap_prune_record_redirect(prstate, rootoffnum, chainitems[ndeadchain], + ItemIdIsNormal(rootlp)); + for (int i = 1; i < ndeadchain; i++) + heap_prune_record_unused(prstate, chainitems[i], true); + + /* the rest of tuples in the chain are normal, unchanged tuples */ + for (int i = ndeadchain; i < nchain; i++) + heap_prune_record_unchanged_lp_normal(page, prstate, chainitems[i]); } - - return ndeleted; } /* Record lowest soon-prunable XID */ @@ -868,48 +1213,352 @@ heap_prune_record_prunable(PruneState *prstate, TransactionId xid) /* Record line pointer to be redirected */ static void heap_prune_record_redirect(PruneState *prstate, - OffsetNumber offnum, OffsetNumber rdoffnum) + OffsetNumber offnum, OffsetNumber rdoffnum, + bool was_normal) { + Assert(!prstate->processed[offnum]); + prstate->processed[offnum] = true; + + /* + * Do not mark the redirect target here. It needs to be counted + * separately as an unchanged tuple. + */ + Assert(prstate->nredirected < MaxHeapTuplesPerPage); prstate->redirected[prstate->nredirected * 2] = offnum; prstate->redirected[prstate->nredirected * 2 + 1] = rdoffnum; + prstate->nredirected++; - Assert(!prstate->marked[offnum]); - prstate->marked[offnum] = true; - Assert(!prstate->marked[rdoffnum]); - prstate->marked[rdoffnum] = true; + + /* + * If the root entry had been a normal tuple, we are deleting it, so count + * it in the result. But changing a redirect (even to DEAD state) doesn't + * count. + */ + if (was_normal) + prstate->ndeleted++; + + prstate->hastup = true; } /* Record line pointer to be marked dead */ static void -heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum) +heap_prune_record_dead(PruneState *prstate, OffsetNumber offnum, + bool was_normal) { + Assert(!prstate->processed[offnum]); + prstate->processed[offnum] = true; + Assert(prstate->ndead < MaxHeapTuplesPerPage); prstate->nowdead[prstate->ndead] = offnum; prstate->ndead++; - Assert(!prstate->marked[offnum]); - prstate->marked[offnum] = true; + + /* + * Deliberately delay unsetting all_visible until later during pruning. + * Removable dead tuples shouldn't preclude freezing the page. + */ + + /* Record the dead offset for vacuum */ + prstate->deadoffsets[prstate->lpdead_items++] = offnum; + + /* + * If the root entry had been a normal tuple, we are deleting it, so count + * it in the result. But changing a redirect (even to DEAD state) doesn't + * count. + */ + if (was_normal) + prstate->ndeleted++; +} + +/* + * Depending on whether or not the caller set mark_unused_now to true, record that a + * line pointer should be marked LP_DEAD or LP_UNUSED. There are other cases in + * which we will mark line pointers LP_UNUSED, but we will not mark line + * pointers LP_DEAD if mark_unused_now is true. + */ +static void +heap_prune_record_dead_or_unused(PruneState *prstate, OffsetNumber offnum, + bool was_normal) +{ + /* + * If the caller set mark_unused_now to true, we can remove dead tuples + * during pruning instead of marking their line pointers dead. Set this + * tuple's line pointer LP_UNUSED. We hint that this option is less + * likely. + */ + if (unlikely(prstate->mark_unused_now)) + heap_prune_record_unused(prstate, offnum, was_normal); + else + heap_prune_record_dead(prstate, offnum, was_normal); } /* Record line pointer to be marked unused */ static void -heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum) +heap_prune_record_unused(PruneState *prstate, OffsetNumber offnum, bool was_normal) { + Assert(!prstate->processed[offnum]); + prstate->processed[offnum] = true; + Assert(prstate->nunused < MaxHeapTuplesPerPage); prstate->nowunused[prstate->nunused] = offnum; prstate->nunused++; - Assert(!prstate->marked[offnum]); - prstate->marked[offnum] = true; + + /* + * If the root entry had been a normal tuple, we are deleting it, so count + * it in the result. But changing a redirect (even to DEAD state) doesn't + * count. + */ + if (was_normal) + prstate->ndeleted++; +} + +/* + * Record an unused line pointer that is left unchanged. + */ +static void +heap_prune_record_unchanged_lp_unused(Page page, PruneState *prstate, OffsetNumber offnum) +{ + Assert(!prstate->processed[offnum]); + prstate->processed[offnum] = true; +} + +/* + * Record line pointer that is left unchanged. We consider freezing it, and + * update bookkeeping of tuple counts and page visibility. + */ +static void +heap_prune_record_unchanged_lp_normal(Page page, PruneState *prstate, OffsetNumber offnum) +{ + HeapTupleHeader htup; + + Assert(!prstate->processed[offnum]); + prstate->processed[offnum] = true; + + prstate->hastup = true; /* the page is not empty */ + + /* + * The criteria for counting a tuple as live in this block need to match + * what analyze.c's acquire_sample_rows() does, otherwise VACUUM and + * ANALYZE may produce wildly different reltuples values, e.g. when there + * are many recently-dead tuples. + * + * The logic here is a bit simpler than acquire_sample_rows(), as VACUUM + * can't run inside a transaction block, which makes some cases impossible + * (e.g. in-progress insert from the same transaction). + * + * HEAPTUPLE_DEAD are handled by the other heap_prune_record_*() + * subroutines. They don't count dead items like acquire_sample_rows() + * does, because we assume that all dead items will become LP_UNUSED + * before VACUUM finishes. This difference is only superficial. VACUUM + * effectively agrees with ANALYZE about DEAD items, in the end. VACUUM + * won't remember LP_DEAD items, but only because they're not supposed to + * be left behind when it is done. (Cases where we bypass index vacuuming + * will violate this optimistic assumption, but the overall impact of that + * should be negligible.) + */ + htup = (HeapTupleHeader) PageGetItem(page, PageGetItemId(page, offnum)); + + switch (prstate->htsv[offnum]) + { + case HEAPTUPLE_LIVE: + + /* + * Count it as live. Not only is this natural, but it's also what + * acquire_sample_rows() does. + */ + prstate->live_tuples++; + + /* + * Is the tuple definitely visible to all transactions? + * + * NB: Like with per-tuple hint bits, we can't set the + * PD_ALL_VISIBLE flag if the inserter committed asynchronously. + * See SetHintBits for more info. Check that the tuple is hinted + * xmin-committed because of that. + */ + if (prstate->all_visible) + { + TransactionId xmin; + + if (!HeapTupleHeaderXminCommitted(htup)) + { + prstate->all_visible = false; + break; + } + + /* + * The inserter definitely committed. But is it old enough + * that everyone sees it as committed? A FrozenTransactionId + * is seen as committed to everyone. Otherwise, we check if + * there is a snapshot that considers this xid to still be + * running, and if so, we don't consider the page all-visible. + */ + xmin = HeapTupleHeaderGetXmin(htup); + + /* + * For now always use prstate->cutoffs for this test, because + * we only update 'all_visible' when freezing is requested. We + * could use GlobalVisTestIsRemovableXid instead, if a + * non-freezing caller wanted to set the VM bit. + */ + Assert(prstate->cutoffs); + if (!TransactionIdPrecedes(xmin, prstate->cutoffs->OldestXmin)) + { + prstate->all_visible = false; + break; + } + + /* Track newest xmin on page. */ + if (TransactionIdFollows(xmin, prstate->visibility_cutoff_xid) && + TransactionIdIsNormal(xmin)) + prstate->visibility_cutoff_xid = xmin; + } + break; + + case HEAPTUPLE_RECENTLY_DEAD: + prstate->recently_dead_tuples++; + prstate->all_visible = false; + + /* + * This tuple will soon become DEAD. Update the hint field so + * that the page is reconsidered for pruning in future. + */ + heap_prune_record_prunable(prstate, + HeapTupleHeaderGetUpdateXid(htup)); + break; + + case HEAPTUPLE_INSERT_IN_PROGRESS: + + /* + * We do not count these rows as live, because we expect the + * inserting transaction to update the counters at commit, and we + * assume that will happen only after we report our results. This + * assumption is a bit shaky, but it is what acquire_sample_rows() + * does, so be consistent. + */ + prstate->all_visible = false; + + /* + * If we wanted to optimize for aborts, we might consider marking + * the page prunable when we see INSERT_IN_PROGRESS. But we + * don't. See related decisions about when to mark the page + * prunable in heapam.c. + */ + break; + + case HEAPTUPLE_DELETE_IN_PROGRESS: + + /* + * This an expected case during concurrent vacuum. Count such + * rows as live. As above, we assume the deleting transaction + * will commit and update the counters after we report. + */ + prstate->live_tuples++; + prstate->all_visible = false; + + /* + * This tuple may soon become DEAD. Update the hint field so that + * the page is reconsidered for pruning in future. + */ + heap_prune_record_prunable(prstate, + HeapTupleHeaderGetUpdateXid(htup)); + break; + + default: + + /* + * DEAD tuples should've been passed to heap_prune_record_dead() + * or heap_prune_record_unused() instead. + */ + elog(ERROR, "unexpected HeapTupleSatisfiesVacuum result %d", + prstate->htsv[offnum]); + break; + } + + /* Consider freezing any normal tuples which will not be removed */ + if (prstate->freeze) + { + bool totally_frozen; + + if ((heap_prepare_freeze_tuple(htup, + prstate->cutoffs, + &prstate->pagefrz, + &prstate->frozen[prstate->nfrozen], + &totally_frozen))) + { + /* Save prepared freeze plan for later */ + prstate->frozen[prstate->nfrozen++].offset = offnum; + } + + /* + * If any tuple isn't either totally frozen already or eligible to + * become totally frozen (according to its freeze plan), then the page + * definitely cannot be set all-frozen in the visibility map later on. + */ + if (!totally_frozen) + prstate->all_frozen = false; + } +} + + +/* + * Record line pointer that was already LP_DEAD and is left unchanged. + */ +static void +heap_prune_record_unchanged_lp_dead(Page page, PruneState *prstate, OffsetNumber offnum) +{ + Assert(!prstate->processed[offnum]); + prstate->processed[offnum] = true; + + /* + * Deliberately don't set hastup for LP_DEAD items. We make the soft + * assumption that any LP_DEAD items encountered here will become + * LP_UNUSED later on, before count_nondeletable_pages is reached. If we + * don't make this assumption then rel truncation will only happen every + * other VACUUM, at most. Besides, VACUUM must treat + * hastup/nonempty_pages as provisional no matter how LP_DEAD items are + * handled (handled here, or handled later on). + * + * Similarly, don't unset all_visible until later, at the end of + * heap_page_prune_and_freeze(). This will allow us to attempt to freeze + * the page after pruning. As long as we unset it before updating the + * visibility map, this will be correct. + */ + + /* Record the dead offset for vacuum */ + prstate->deadoffsets[prstate->lpdead_items++] = offnum; } +/* + * Record LP_REDIRECT that is left unchanged. + */ +static void +heap_prune_record_unchanged_lp_redirect(PruneState *prstate, OffsetNumber offnum) +{ + /* + * A redirect line pointer doesn't count as a live tuple. + * + * If we leave a redirect line pointer in place, there will be another + * tuple on the page that it points to. We will do the bookkeeping for + * that separately. So we have nothing to do here, except remember that + * we processed this item. + */ + Assert(!prstate->processed[offnum]); + prstate->processed[offnum] = true; +} /* - * Perform the actual page changes needed by heap_page_prune. - * It is expected that the caller has a full cleanup lock on the - * buffer. + * Perform the actual page changes needed by heap_page_prune_and_freeze(). + * + * If 'lp_truncate_only' is set, we are merely marking LP_DEAD line pointers + * as unused, not redirecting or removing anything else. The + * PageRepairFragmentation() call is skipped in that case. + * + * If 'lp_truncate_only' is not set, the caller must hold a cleanup lock on + * the buffer. If it is set, an ordinary exclusive lock suffices. */ void -heap_page_prune_execute(Buffer buffer, +heap_page_prune_execute(Buffer buffer, bool lp_truncate_only, OffsetNumber *redirected, int nredirected, OffsetNumber *nowdead, int ndead, OffsetNumber *nowunused, int nunused) @@ -921,6 +1570,9 @@ heap_page_prune_execute(Buffer buffer, /* Shouldn't be called unless there's something to do */ Assert(nredirected > 0 || ndead > 0 || nunused > 0); + /* If 'lp_truncate_only', we can only remove already-dead line pointers */ + Assert(!lp_truncate_only || (nredirected == 0 && ndead == 0)); + /* Update all redirected line pointers */ offnum = redirected; for (int i = 0; i < nredirected; i++) @@ -1019,30 +1671,52 @@ heap_page_prune_execute(Buffer buffer, #ifdef USE_ASSERT_CHECKING - /* - * Only heap-only tuples can become LP_UNUSED during pruning. They - * don't need to be left in place as LP_DEAD items until VACUUM gets - * around to doing index vacuuming. - */ - Assert(ItemIdHasStorage(lp) && ItemIdIsNormal(lp)); - htup = (HeapTupleHeader) PageGetItem(page, lp); - Assert(HeapTupleHeaderIsHeapOnly(htup)); + if (lp_truncate_only) + { + /* Setting LP_DEAD to LP_UNUSED in vacuum's second pass */ + Assert(ItemIdIsDead(lp) && !ItemIdHasStorage(lp)); + } + else + { + /* + * When heap_page_prune_and_freeze() was called, mark_unused_now + * may have been passed as true, which allows would-be LP_DEAD + * items to be made LP_UNUSED instead. This is only possible if + * the relation has no indexes. If there are any dead items, then + * mark_unused_now was not true and every item being marked + * LP_UNUSED must refer to a heap-only tuple. + */ + if (ndead > 0) + { + Assert(ItemIdHasStorage(lp) && ItemIdIsNormal(lp)); + htup = (HeapTupleHeader) PageGetItem(page, lp); + Assert(HeapTupleHeaderIsHeapOnly(htup)); + } + else + Assert(ItemIdIsUsed(lp)); + } + #endif ItemIdSetUnused(lp); } - /* - * Finally, repair any fragmentation, and update the page's hint bit about - * whether it has free pointers. - */ - PageRepairFragmentation(page); + if (lp_truncate_only) + PageTruncateLinePointerArray(page); + else + { + /* + * Finally, repair any fragmentation, and update the page's hint bit + * about whether it has free pointers. + */ + PageRepairFragmentation(page); - /* - * Now that the page has been modified, assert that redirect items still - * point to valid targets. - */ - page_verify_redirects(page); + /* + * Now that the page has been modified, assert that redirect items + * still point to valid targets. + */ + page_verify_redirects(page); + } } @@ -1211,3 +1885,288 @@ heap_get_root_tuples(Page page, OffsetNumber *root_offsets) } } } + + +/* + * Compare fields that describe actions required to freeze tuple with caller's + * open plan. If everything matches then the frz tuple plan is equivalent to + * caller's plan. + */ +static inline bool +heap_log_freeze_eq(xlhp_freeze_plan *plan, HeapTupleFreeze *frz) +{ + if (plan->xmax == frz->xmax && + plan->t_infomask2 == frz->t_infomask2 && + plan->t_infomask == frz->t_infomask && + plan->frzflags == frz->frzflags) + return true; + + /* Caller must call heap_log_freeze_new_plan again for frz */ + return false; +} + +/* + * Comparator used to deduplicate XLOG_HEAP2_FREEZE_PAGE freeze plans + */ +static int +heap_log_freeze_cmp(const void *arg1, const void *arg2) +{ + HeapTupleFreeze *frz1 = (HeapTupleFreeze *) arg1; + HeapTupleFreeze *frz2 = (HeapTupleFreeze *) arg2; + + if (frz1->xmax < frz2->xmax) + return -1; + else if (frz1->xmax > frz2->xmax) + return 1; + + if (frz1->t_infomask2 < frz2->t_infomask2) + return -1; + else if (frz1->t_infomask2 > frz2->t_infomask2) + return 1; + + if (frz1->t_infomask < frz2->t_infomask) + return -1; + else if (frz1->t_infomask > frz2->t_infomask) + return 1; + + if (frz1->frzflags < frz2->frzflags) + return -1; + else if (frz1->frzflags > frz2->frzflags) + return 1; + + /* + * heap_log_freeze_eq would consider these tuple-wise plans to be equal. + * (So the tuples will share a single canonical freeze plan.) + * + * We tiebreak on page offset number to keep each freeze plan's page + * offset number array individually sorted. (Unnecessary, but be tidy.) + */ + if (frz1->offset < frz2->offset) + return -1; + else if (frz1->offset > frz2->offset) + return 1; + + Assert(false); + return 0; +} + +/* + * Start new plan initialized using tuple-level actions. At least one tuple + * will have steps required to freeze described by caller's plan during REDO. + */ +static inline void +heap_log_freeze_new_plan(xlhp_freeze_plan *plan, HeapTupleFreeze *frz) +{ + plan->xmax = frz->xmax; + plan->t_infomask2 = frz->t_infomask2; + plan->t_infomask = frz->t_infomask; + plan->frzflags = frz->frzflags; + plan->ntuples = 1; /* for now */ +} + +/* + * Deduplicate tuple-based freeze plans so that each distinct set of + * processing steps is only stored once in XLOG_HEAP2_FREEZE_PAGE records. + * Called during original execution of freezing (for logged relations). + * + * Return value is number of plans set in *plans_out for caller. Also writes + * an array of offset numbers into *offsets_out output argument for caller + * (actually there is one array per freeze plan, but that's not of immediate + * concern to our caller). + */ +static int +heap_log_freeze_plan(HeapTupleFreeze *tuples, int ntuples, + xlhp_freeze_plan *plans_out, + OffsetNumber *offsets_out) +{ + int nplans = 0; + + /* Sort tuple-based freeze plans in the order required to deduplicate */ + qsort(tuples, ntuples, sizeof(HeapTupleFreeze), heap_log_freeze_cmp); + + for (int i = 0; i < ntuples; i++) + { + HeapTupleFreeze *frz = tuples + i; + + if (i == 0) + { + /* New canonical freeze plan starting with first tup */ + heap_log_freeze_new_plan(plans_out, frz); + nplans++; + } + else if (heap_log_freeze_eq(plans_out, frz)) + { + /* tup matches open canonical plan -- include tup in it */ + Assert(offsets_out[i - 1] < frz->offset); + plans_out->ntuples++; + } + else + { + /* Tup doesn't match current plan -- done with it now */ + plans_out++; + + /* New canonical freeze plan starting with this tup */ + heap_log_freeze_new_plan(plans_out, frz); + nplans++; + } + + /* + * Save page offset number in dedicated buffer in passing. + * + * REDO routine relies on the record's offset numbers array grouping + * offset numbers by freeze plan. The sort order within each grouping + * is ascending offset number order, just to keep things tidy. + */ + offsets_out[i] = frz->offset; + } + + Assert(nplans > 0 && nplans <= ntuples); + + return nplans; +} + +/* + * Write an XLOG_HEAP2_PRUNE_FREEZE WAL record + * + * This is used for several different page maintenance operations: + * + * - Page pruning, in VACUUM's 1st pass or on access: Some items are + * redirected, some marked dead, and some removed altogether. + * + * - Freezing: Items are marked as 'frozen'. + * + * - Vacuum, 2nd pass: Items that are already LP_DEAD are marked as unused. + * + * They have enough commonalities that we use a single WAL record for them + * all. + * + * If replaying the record requires a cleanup lock, pass cleanup_lock = true. + * Replaying 'redirected' or 'dead' items always requires a cleanup lock, but + * replaying 'unused' items depends on whether they were all previously marked + * as dead. + * + * Note: This function scribbles on the 'frozen' array. + * + * Note: This is called in a critical section, so careful what you do here. + */ +void +log_heap_prune_and_freeze(Relation relation, Buffer buffer, + TransactionId conflict_xid, + bool cleanup_lock, + PruneReason reason, + HeapTupleFreeze *frozen, int nfrozen, + OffsetNumber *redirected, int nredirected, + OffsetNumber *dead, int ndead, + OffsetNumber *unused, int nunused) +{ + xl_heap_prune xlrec; + XLogRecPtr recptr; + uint8 info; + + /* The following local variables hold data registered in the WAL record: */ + xlhp_freeze_plan plans[MaxHeapTuplesPerPage]; + xlhp_freeze_plans freeze_plans; + xlhp_prune_items redirect_items; + xlhp_prune_items dead_items; + xlhp_prune_items unused_items; + OffsetNumber frz_offsets[MaxHeapTuplesPerPage]; + + xlrec.flags = 0; + + /* + * Prepare data for the buffer. The arrays are not actually in the + * buffer, but we pretend that they are. When XLogInsert stores a full + * page image, the arrays can be omitted. + */ + XLogBeginInsert(); + XLogRegisterBuffer(0, buffer, REGBUF_STANDARD); + if (nfrozen > 0) + { + int nplans; + + xlrec.flags |= XLHP_HAS_FREEZE_PLANS; + + /* + * Prepare deduplicated representation for use in the WAL record. This + * destructively sorts frozen tuples array in-place. + */ + nplans = heap_log_freeze_plan(frozen, nfrozen, plans, frz_offsets); + + freeze_plans.nplans = nplans; + XLogRegisterBufData(0, (char *) &freeze_plans, + offsetof(xlhp_freeze_plans, plans)); + XLogRegisterBufData(0, (char *) plans, + sizeof(xlhp_freeze_plan) * nplans); + } + if (nredirected > 0) + { + xlrec.flags |= XLHP_HAS_REDIRECTIONS; + + redirect_items.ntargets = nredirected; + XLogRegisterBufData(0, (char *) &redirect_items, + offsetof(xlhp_prune_items, data)); + XLogRegisterBufData(0, (char *) redirected, + sizeof(OffsetNumber[2]) * nredirected); + } + if (ndead > 0) + { + xlrec.flags |= XLHP_HAS_DEAD_ITEMS; + + dead_items.ntargets = ndead; + XLogRegisterBufData(0, (char *) &dead_items, + offsetof(xlhp_prune_items, data)); + XLogRegisterBufData(0, (char *) dead, + sizeof(OffsetNumber) * ndead); + } + if (nunused > 0) + { + xlrec.flags |= XLHP_HAS_NOW_UNUSED_ITEMS; + + unused_items.ntargets = nunused; + XLogRegisterBufData(0, (char *) &unused_items, + offsetof(xlhp_prune_items, data)); + XLogRegisterBufData(0, (char *) unused, + sizeof(OffsetNumber) * nunused); + } + if (nfrozen > 0) + XLogRegisterBufData(0, (char *) frz_offsets, + sizeof(OffsetNumber) * nfrozen); + + /* + * Prepare the main xl_heap_prune record. We already set the XLPH_HAS_* + * flag above. + */ + if (RelationIsAccessibleInLogicalDecoding(relation)) + xlrec.flags |= XLHP_IS_CATALOG_REL; + if (TransactionIdIsValid(conflict_xid)) + xlrec.flags |= XLHP_HAS_CONFLICT_HORIZON; + if (cleanup_lock) + xlrec.flags |= XLHP_CLEANUP_LOCK; + else + { + Assert(nredirected == 0 && ndead == 0); + /* also, any items in 'unused' must've been LP_DEAD previously */ + } + XLogRegisterData((char *) &xlrec, SizeOfHeapPrune); + if (TransactionIdIsValid(conflict_xid)) + XLogRegisterData((char *) &conflict_xid, sizeof(TransactionId)); + + switch (reason) + { + case PRUNE_ON_ACCESS: + info = XLOG_HEAP2_PRUNE_ON_ACCESS; + break; + case PRUNE_VACUUM_SCAN: + info = XLOG_HEAP2_PRUNE_VACUUM_SCAN; + break; + case PRUNE_VACUUM_CLEANUP: + info = XLOG_HEAP2_PRUNE_VACUUM_CLEANUP; + break; + default: + elog(ERROR, "unrecognized prune reason: %d", (int) reason); + break; + } + recptr = XLogInsert(RM_HEAP2_ID, info); + + PageSetLSN(BufferGetPage(buffer), recptr); +} diff --git a/src/backend/access/heap/rewriteheap.c b/src/backend/access/heap/rewriteheap.c index 424958912c75b..473f3aa9bef9e 100644 --- a/src/backend/access/heap/rewriteheap.c +++ b/src/backend/access/heap/rewriteheap.c @@ -87,12 +87,12 @@ * is optimized for bulk inserting a lot of tuples, knowing that we have * exclusive access to the heap. raw_heap_insert builds new pages in * local storage. When a page is full, or at the end of the process, - * we insert it to WAL as a single record and then write it to disk - * directly through smgr. Note, however, that any data sent to the new + * we insert it to WAL as a single record and then write it to disk with + * the bulk smgr writer. Note, however, that any data sent to the new * heap's TOAST table will go through the normal bufmgr. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * IDENTIFICATION @@ -111,17 +111,15 @@ #include "access/transam.h" #include "access/xact.h" #include "access/xloginsert.h" -#include "catalog/catalog.h" #include "common/file_utils.h" #include "lib/ilist.h" #include "miscadmin.h" #include "pgstat.h" -#include "replication/logical.h" #include "replication/slot.h" #include "storage/bufmgr.h" +#include "storage/bulk_write.h" #include "storage/fd.h" #include "storage/procarray.h" -#include "storage/smgr.h" #include "utils/memutils.h" #include "utils/rel.h" @@ -133,9 +131,9 @@ typedef struct RewriteStateData { Relation rs_old_rel; /* source heap */ Relation rs_new_rel; /* destination heap */ - Page rs_buffer; /* page currently being built */ + BulkWriteState *rs_bulkstate; /* writer for the destination */ + BulkWriteBuffer rs_buffer; /* page currently being built */ BlockNumber rs_blockno; /* block where page will go */ - bool rs_buffer_valid; /* T if any tuples in buffer */ bool rs_logical_rewrite; /* do we need to do logical rewriting */ TransactionId rs_oldest_xmin; /* oldest xmin used by caller to determine * tuple visibility */ @@ -255,14 +253,14 @@ begin_heap_rewrite(Relation old_heap, Relation new_heap, TransactionId oldest_xm state->rs_old_rel = old_heap; state->rs_new_rel = new_heap; - state->rs_buffer = (Page) palloc_aligned(BLCKSZ, PG_IO_ALIGN_SIZE, 0); + state->rs_buffer = NULL; /* new_heap needn't be empty, just locked */ state->rs_blockno = RelationGetNumberOfBlocks(new_heap); - state->rs_buffer_valid = false; state->rs_oldest_xmin = oldest_xmin; state->rs_freeze_xid = freeze_xid; state->rs_cutoff_multi = cutoff_multi; state->rs_cxt = rw_cxt; + state->rs_bulkstate = smgr_bulk_start_rel(new_heap, MAIN_FORKNUM); /* Initialize hash tables used to track update chains */ hash_ctl.keysize = sizeof(TidHashKey); @@ -314,30 +312,13 @@ end_heap_rewrite(RewriteState state) } /* Write the last page, if any */ - if (state->rs_buffer_valid) + if (state->rs_buffer) { - if (RelationNeedsWAL(state->rs_new_rel)) - log_newpage(&state->rs_new_rel->rd_locator, - MAIN_FORKNUM, - state->rs_blockno, - state->rs_buffer, - true); - - PageSetChecksumInplace(state->rs_buffer, state->rs_blockno); - - smgrextend(RelationGetSmgr(state->rs_new_rel), MAIN_FORKNUM, - state->rs_blockno, state->rs_buffer, true); + smgr_bulk_write(state->rs_bulkstate, state->rs_blockno, state->rs_buffer, true); + state->rs_buffer = NULL; } - /* - * When we WAL-logged rel pages, we must nonetheless fsync them. The - * reason is the same as in storage.c's RelationCopyStorage(): we're - * writing data that's not in shared buffers, and so a CHECKPOINT - * occurring during the rewriteheap operation won't have fsync'd data we - * wrote before the checkpoint. - */ - if (RelationNeedsWAL(state->rs_new_rel)) - smgrimmedsync(RelationGetSmgr(state->rs_new_rel), MAIN_FORKNUM); + smgr_bulk_finish(state->rs_bulkstate); logical_end_heap_rewrite(state); @@ -611,7 +592,7 @@ rewrite_heap_dead_tuple(RewriteState state, HeapTuple old_tuple) static void raw_heap_insert(RewriteState state, HeapTuple tup) { - Page page = state->rs_buffer; + Page page; Size pageFreeSpace, saveFreeSpace; Size len; @@ -664,7 +645,8 @@ raw_heap_insert(RewriteState state, HeapTuple tup) HEAP_DEFAULT_FILLFACTOR); /* Now we can check to see if there's enough free space already. */ - if (state->rs_buffer_valid) + page = (Page) state->rs_buffer; + if (page) { pageFreeSpace = PageGetHeapFreeSpace(page); @@ -675,35 +657,19 @@ raw_heap_insert(RewriteState state, HeapTuple tup) * contains a tuple. Hence, unlike RelationGetBufferForTuple(), * enforce saveFreeSpace unconditionally. */ - - /* XLOG stuff */ - if (RelationNeedsWAL(state->rs_new_rel)) - log_newpage(&state->rs_new_rel->rd_locator, - MAIN_FORKNUM, - state->rs_blockno, - page, - true); - - /* - * Now write the page. We say skipFsync = true because there's no - * need for smgr to schedule an fsync for this write; we'll do it - * ourselves in end_heap_rewrite. - */ - PageSetChecksumInplace(page, state->rs_blockno); - - smgrextend(RelationGetSmgr(state->rs_new_rel), MAIN_FORKNUM, - state->rs_blockno, page, true); - + smgr_bulk_write(state->rs_bulkstate, state->rs_blockno, state->rs_buffer, true); + state->rs_buffer = NULL; + page = NULL; state->rs_blockno++; - state->rs_buffer_valid = false; } } - if (!state->rs_buffer_valid) + if (!page) { /* Initialize a new empty page */ + state->rs_buffer = smgr_bulk_get_buf(state->rs_bulkstate); + page = (Page) state->rs_buffer; PageInit(page, BLCKSZ, 0); - state->rs_buffer_valid = true; } /* And now we can insert the tuple into the page */ diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 4eb953f904747..b22604e96003b 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -3,25 +3,24 @@ * vacuumlazy.c * Concurrent ("lazy") vacuuming. * - * The major space usage for vacuuming is storage for the array of dead TIDs - * that are to be removed from indexes. We want to ensure we can vacuum even - * the very largest relations with finite memory space usage. To do that, we - * set upper bounds on the number of TIDs we can keep track of at once. + * The major space usage for vacuuming is storage for the dead tuple IDs that + * are to be removed from indexes. We want to ensure we can vacuum even the + * very largest relations with finite memory space usage. To do that, we set + * upper bounds on the memory that can be used for keeping track of dead TIDs + * at once. * * We are willing to use at most maintenance_work_mem (or perhaps - * autovacuum_work_mem) memory space to keep track of dead TIDs. We initially - * allocate an array of TIDs of that size, with an upper limit that depends on - * table size (this limit ensures we don't allocate a huge area uselessly for - * vacuuming small tables). If the array threatens to overflow, we must call - * lazy_vacuum to vacuum indexes (and to vacuum the pages that we've pruned). - * This frees up the memory space dedicated to storing dead TIDs. + * autovacuum_work_mem) memory space to keep track of dead TIDs. If the + * TID store is full, we must call lazy_vacuum to vacuum indexes (and to vacuum + * the pages that we've pruned). This frees up the memory space dedicated to + * store dead TIDs. * * In practice VACUUM will often complete its initial pass over the target * heap relation without ever running out of space to store TIDs. This means * that there only needs to be one call to lazy_vacuum, after the initial pass * completes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -34,32 +33,28 @@ #include -#include "access/amapi.h" #include "access/genam.h" #include "access/heapam.h" #include "access/heapam_xlog.h" #include "access/htup_details.h" #include "access/multixact.h" +#include "access/tidstore.h" #include "access/transam.h" #include "access/visibilitymap.h" -#include "access/xact.h" -#include "access/xlog.h" #include "access/xloginsert.h" -#include "catalog/index.h" #include "catalog/storage.h" #include "commands/dbcommands.h" #include "commands/progress.h" #include "commands/vacuum.h" +#include "common/int.h" #include "executor/instrument.h" #include "miscadmin.h" -#include "optimizer/paths.h" #include "pgstat.h" #include "portability/instr_time.h" #include "postmaster/autovacuum.h" #include "storage/bufmgr.h" #include "storage/freespace.h" #include "storage/lmgr.h" -#include "tcop/tcopprot.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/pg_rusage.h" @@ -135,7 +130,7 @@ typedef enum VACUUM_ERRCB_PHASE_VACUUM_INDEX, VACUUM_ERRCB_PHASE_VACUUM_HEAP, VACUUM_ERRCB_PHASE_INDEX_CLEANUP, - VACUUM_ERRCB_PHASE_TRUNCATE + VACUUM_ERRCB_PHASE_TRUNCATE, } VacErrPhase; typedef struct LVRelState @@ -185,8 +180,13 @@ typedef struct LVRelState * that has been processed by lazy_scan_prune. Also needed by * lazy_vacuum_heap_rel, which marks the same LP_DEAD line pointers as * LP_UNUSED during second heap pass. + * + * Both dead_items and dead_items_info are allocated in shared memory in + * parallel vacuum cases. */ - VacDeadItems *dead_items; /* TIDs whose index tuples we'll delete */ + TidStore *dead_items; /* TIDs whose index tuples we'll delete */ + VacDeadItemsInfo *dead_items_info; + BlockNumber rel_pages; /* total number of pages */ BlockNumber scanned_pages; /* # pages examined (not skipped via VM) */ BlockNumber removed_pages; /* # pages removed by relation truncation */ @@ -210,25 +210,13 @@ typedef struct LVRelState int64 live_tuples; /* # live tuples remaining */ int64 recently_dead_tuples; /* # dead, but not yet removable */ int64 missed_dead_tuples; /* # removable, but not removed */ -} LVRelState; - -/* - * State returned by lazy_scan_prune() - */ -typedef struct LVPagePruneState -{ - bool hastup; /* Page prevents rel truncation? */ - bool has_lpdead_items; /* includes existing LP_DEAD items */ - /* - * State describes the proper VM bit states to set for the page following - * pruning and freezing. all_visible implies !has_lpdead_items, but don't - * trust all_frozen result unless all_visible is also set to true. - */ - bool all_visible; /* Every item visible to all? */ - bool all_frozen; /* provided all_visible is also true */ - TransactionId visibility_cutoff_xid; /* For recovery conflicts */ -} LVPagePruneState; + /* State maintained by heap_vac_scan_next_block() */ + BlockNumber current_block; /* last block returned */ + BlockNumber next_unskippable_block; /* next unskippable block */ + bool next_unskippable_allvis; /* its visibility status */ + Buffer next_unskippable_vmbuffer; /* buffer containing its VM bit */ +} LVRelState; /* Struct for saving and restoring vacuum error information. */ typedef struct LVSavedErrInfo @@ -241,24 +229,25 @@ typedef struct LVSavedErrInfo /* non-export function prototypes */ static void lazy_scan_heap(LVRelState *vacrel); -static BlockNumber lazy_scan_skip(LVRelState *vacrel, Buffer *vmbuffer, - BlockNumber next_block, - bool *next_unskippable_allvis, - bool *skipping_current_range); +static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno, + bool *all_visible_according_to_vm); +static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis); static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno, Page page, bool sharelock, Buffer vmbuffer); static void lazy_scan_prune(LVRelState *vacrel, Buffer buf, BlockNumber blkno, Page page, - LVPagePruneState *prunestate); + Buffer vmbuffer, bool all_visible_according_to_vm, + bool *has_lpdead_items); static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf, BlockNumber blkno, Page page, - bool *hastup, bool *recordfreespace); + bool *has_lpdead_items); static void lazy_vacuum(LVRelState *vacrel); static bool lazy_vacuum_all_indexes(LVRelState *vacrel); static void lazy_vacuum_heap_rel(LVRelState *vacrel); -static int lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, - Buffer buffer, int index, Buffer vmbuffer); +static void lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, + Buffer buffer, OffsetNumber *deadoffsets, + int num_offsets, Buffer vmbuffer); static bool lazy_check_wraparound_failsafe(LVRelState *vacrel); static void lazy_cleanup_all_indexes(LVRelState *vacrel); static IndexBulkDeleteResult *lazy_vacuum_one_index(Relation indrel, @@ -275,6 +264,9 @@ static void lazy_truncate_heap(LVRelState *vacrel); static BlockNumber count_nondeletable_pages(LVRelState *vacrel, bool *lock_waiter_detected); static void dead_items_alloc(LVRelState *vacrel, int nworkers); +static void dead_items_add(LVRelState *vacrel, BlockNumber blkno, OffsetNumber *offsets, + int num_offsets); +static void dead_items_reset(LVRelState *vacrel); static void dead_items_cleanup(LVRelState *vacrel); static bool heap_page_is_all_visible(LVRelState *vacrel, Buffer buf, TransactionId *visibility_cutoff_xid, bool *all_frozen); @@ -317,14 +309,12 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, PgStat_Counter startreadtime = 0, startwritetime = 0; WalUsage startwalusage = pgWalUsage; - int64 StartPageHit = VacuumPageHit, - StartPageMiss = VacuumPageMiss, - StartPageDirty = VacuumPageDirty; + BufferUsage startbufferusage = pgBufferUsage; ErrorContextCallback errcallback; char **indnames = NULL; verbose = (params->options & VACOPT_VERBOSE) != 0; - instrument = (verbose || (IsAutoVacuumWorkerProcess() && + instrument = (verbose || (AmAutoVacuumWorkerProcess() && params->log_min_duration >= 0)); if (instrument) { @@ -448,12 +438,13 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, * as an upper bound on the XIDs stored in the pages we'll actually scan * (NewRelfrozenXid tracking must never be allowed to miss unfrozen XIDs). * - * Next acquire vistest, a related cutoff that's used in heap_page_prune. - * We expect vistest will always make heap_page_prune remove any deleted - * tuple whose xmax is < OldestXmin. lazy_scan_prune must never become - * confused about whether a tuple should be frozen or removed. (In the - * future we might want to teach lazy_scan_prune to recompute vistest from - * time to time, to increase the number of dead tuples it can prune away.) + * Next acquire vistest, a related cutoff that's used in pruning. We use + * vistest in combination with OldestXmin to ensure that + * heap_page_prune_and_freeze() always removes any deleted tuple whose + * xmax is < OldestXmin. lazy_scan_prune must never become confused about + * whether a tuple should be frozen or removed. (In the future we might + * want to teach lazy_scan_prune to recompute vistest from time to time, + * to increase the number of dead tuples it can prune away.) */ vacrel->aggressive = vacuum_get_cutoffs(rel, params, &vacrel->cutoffs); vacrel->rel_pages = orig_rel_pages = RelationGetNumberOfBlocks(rel); @@ -490,7 +481,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, } /* - * Allocate dead_items array memory using dead_items_alloc. This handles + * Allocate dead_items memory using dead_items_alloc. This handles * parallel VACUUM initialization as part of allocating shared memory * space used for dead_items. (But do a failsafe precheck first, to * ensure that parallel VACUUM won't be attempted at all when relfrozenxid @@ -611,18 +602,18 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, long secs_dur; int usecs_dur; WalUsage walusage; + BufferUsage bufferusage; StringInfoData buf; char *msgfmt; int32 diff; - int64 PageHitOp = VacuumPageHit - StartPageHit, - PageMissOp = VacuumPageMiss - StartPageMiss, - PageDirtyOp = VacuumPageDirty - StartPageDirty; double read_rate = 0, write_rate = 0; TimestampDifference(starttime, endtime, &secs_dur, &usecs_dur); memset(&walusage, 0, sizeof(WalUsage)); WalUsageAccumDiff(&walusage, &pgWalUsage, &startwalusage); + memset(&bufferusage, 0, sizeof(BufferUsage)); + BufferUsageAccumDiff(&bufferusage, &pgBufferUsage, &startbufferusage); initStringInfo(&buf); if (verbose) @@ -749,18 +740,18 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, } if (secs_dur > 0 || usecs_dur > 0) { - read_rate = (double) BLCKSZ * PageMissOp / (1024 * 1024) / - (secs_dur + usecs_dur / 1000000.0); - write_rate = (double) BLCKSZ * PageDirtyOp / (1024 * 1024) / - (secs_dur + usecs_dur / 1000000.0); + read_rate = (double) BLCKSZ * (bufferusage.shared_blks_read + bufferusage.local_blks_read) / + (1024 * 1024) / (secs_dur + usecs_dur / 1000000.0); + write_rate = (double) BLCKSZ * (bufferusage.shared_blks_dirtied + bufferusage.local_blks_dirtied) / + (1024 * 1024) / (secs_dur + usecs_dur / 1000000.0); } appendStringInfo(&buf, _("avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n"), read_rate, write_rate); appendStringInfo(&buf, _("buffer usage: %lld hits, %lld misses, %lld dirtied\n"), - (long long) PageHitOp, - (long long) PageMissOp, - (long long) PageDirtyOp); + (long long) (bufferusage.shared_blks_hit + bufferusage.local_blks_hit), + (long long) (bufferusage.shared_blks_read + bufferusage.local_blks_read), + (long long) (bufferusage.shared_blks_dirtied + bufferusage.local_blks_dirtied)); appendStringInfo(&buf, _("WAL usage: %lld records, %lld full page images, %llu bytes\n"), (long long) walusage.wal_records, @@ -800,7 +791,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params, * have collected the TIDs whose index tuples need to be removed. * * Finally, invokes lazy_vacuum_heap_rel to vacuum heap pages, which - * largely consists of marking LP_DEAD items (from collected TID array) + * largely consists of marking LP_DEAD items (from vacrel->dead_items) * as LP_UNUSED. This has to happen in a second, final pass over the * heap, to preserve a basic invariant that all index AMs rely on: no * extant index tuple can ever be allowed to contain a TID that points to @@ -826,61 +817,35 @@ lazy_scan_heap(LVRelState *vacrel) { BlockNumber rel_pages = vacrel->rel_pages, blkno, - next_unskippable_block, next_fsm_block_to_vacuum = 0; - VacDeadItems *dead_items = vacrel->dead_items; + bool all_visible_according_to_vm; + Buffer vmbuffer = InvalidBuffer; - bool next_unskippable_allvis, - skipping_current_range; const int initprog_index[] = { PROGRESS_VACUUM_PHASE, PROGRESS_VACUUM_TOTAL_HEAP_BLKS, - PROGRESS_VACUUM_MAX_DEAD_TUPLES + PROGRESS_VACUUM_MAX_DEAD_TUPLE_BYTES }; int64 initprog_val[3]; /* Report that we're scanning the heap, advertising total # of blocks */ initprog_val[0] = PROGRESS_VACUUM_PHASE_SCAN_HEAP; initprog_val[1] = rel_pages; - initprog_val[2] = dead_items->max_items; + initprog_val[2] = vacrel->dead_items_info->max_bytes; pgstat_progress_update_multi_param(3, initprog_index, initprog_val); - /* Set up an initial range of skippable blocks using the visibility map */ - next_unskippable_block = lazy_scan_skip(vacrel, &vmbuffer, 0, - &next_unskippable_allvis, - &skipping_current_range); - for (blkno = 0; blkno < rel_pages; blkno++) + /* Initialize for the first heap_vac_scan_next_block() call */ + vacrel->current_block = InvalidBlockNumber; + vacrel->next_unskippable_block = InvalidBlockNumber; + vacrel->next_unskippable_allvis = false; + vacrel->next_unskippable_vmbuffer = InvalidBuffer; + + while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm)) { Buffer buf; Page page; - bool all_visible_according_to_vm; - LVPagePruneState prunestate; - - if (blkno == next_unskippable_block) - { - /* - * Can't skip this page safely. Must scan the page. But - * determine the next skippable range after the page first. - */ - all_visible_according_to_vm = next_unskippable_allvis; - next_unskippable_block = lazy_scan_skip(vacrel, &vmbuffer, - blkno + 1, - &next_unskippable_allvis, - &skipping_current_range); - - Assert(next_unskippable_block >= blkno + 1); - } - else - { - /* Last page always scanned (may need to set nonempty_pages) */ - Assert(blkno < rel_pages - 1); - - if (skipping_current_range) - continue; - - /* Current range is too small to skip -- just scan the page */ - all_visible_according_to_vm = true; - } + bool has_lpdead_items; + bool got_cleanup_lock = false; vacrel->scanned_pages++; @@ -907,10 +872,12 @@ lazy_scan_heap(LVRelState *vacrel) * Consider if we definitely have enough space to process TIDs on page * already. If we are close to overrunning the available space for * dead_items TIDs, pause and do a cycle of vacuuming before we tackle - * this page. + * this page. However, let's force at least one page-worth of tuples + * to be stored as to ensure we do at least some work when the memory + * configured is so low that we run out before storing anything. */ - Assert(dead_items->max_items >= MaxHeapTuplesPerPage); - if (dead_items->max_items - dead_items->num_items < MaxHeapTuplesPerPage) + if (vacrel->dead_items_info->num_items > 0 && + TidStoreMemoryUsage(vacrel->dead_items) > vacrel->dead_items_info->max_bytes) { /* * Before beginning index vacuuming, we release any pin we may @@ -948,284 +915,112 @@ lazy_scan_heap(LVRelState *vacrel) */ visibilitymap_pin(vacrel->rel, blkno, &vmbuffer); + buf = ReadBufferExtended(vacrel->rel, MAIN_FORKNUM, blkno, RBM_NORMAL, + vacrel->bstrategy); + page = BufferGetPage(buf); + /* * We need a buffer cleanup lock to prune HOT chains and defragment * the page in lazy_scan_prune. But when it's not possible to acquire * a cleanup lock right away, we may be able to settle for reduced * processing using lazy_scan_noprune. */ - buf = ReadBufferExtended(vacrel->rel, MAIN_FORKNUM, blkno, RBM_NORMAL, - vacrel->bstrategy); - page = BufferGetPage(buf); - if (!ConditionalLockBufferForCleanup(buf)) - { - bool hastup, - recordfreespace; + got_cleanup_lock = ConditionalLockBufferForCleanup(buf); + if (!got_cleanup_lock) LockBuffer(buf, BUFFER_LOCK_SHARE); - /* Check for new or empty pages before lazy_scan_noprune call */ - if (lazy_scan_new_or_empty(vacrel, buf, blkno, page, true, - vmbuffer)) - { - /* Processed as new/empty page (lock and pin released) */ - continue; - } - - /* Collect LP_DEAD items in dead_items array, count tuples */ - if (lazy_scan_noprune(vacrel, buf, blkno, page, &hastup, - &recordfreespace)) - { - Size freespace = 0; - - /* - * Processed page successfully (without cleanup lock) -- just - * need to perform rel truncation and FSM steps, much like the - * lazy_scan_prune case. Don't bother trying to match its - * visibility map setting steps, though. - */ - if (hastup) - vacrel->nonempty_pages = blkno + 1; - if (recordfreespace) - freespace = PageGetHeapFreeSpace(page); - UnlockReleaseBuffer(buf); - if (recordfreespace) - RecordPageWithFreeSpace(vacrel->rel, blkno, freespace); - continue; - } - - /* - * lazy_scan_noprune could not do all required processing. Wait - * for a cleanup lock, and call lazy_scan_prune in the usual way. - */ - Assert(vacrel->aggressive); - LockBuffer(buf, BUFFER_LOCK_UNLOCK); - LockBufferForCleanup(buf); - } - - /* Check for new or empty pages before lazy_scan_prune call */ - if (lazy_scan_new_or_empty(vacrel, buf, blkno, page, false, vmbuffer)) + /* Check for new or empty pages before lazy_scan_[no]prune call */ + if (lazy_scan_new_or_empty(vacrel, buf, blkno, page, !got_cleanup_lock, + vmbuffer)) { /* Processed as new/empty page (lock and pin released) */ continue; } /* - * Prune, freeze, and count tuples. - * - * Accumulates details of remaining LP_DEAD line pointers on page in - * dead_items array. This includes LP_DEAD line pointers that we - * pruned ourselves, as well as existing LP_DEAD line pointers that - * were pruned some time earlier. Also considers freezing XIDs in the - * tuple headers of remaining items with storage. - */ - lazy_scan_prune(vacrel, buf, blkno, page, &prunestate); - - Assert(!prunestate.all_visible || !prunestate.has_lpdead_items); - - /* Remember the location of the last page with nonremovable tuples */ - if (prunestate.hastup) - vacrel->nonempty_pages = blkno + 1; - - if (vacrel->nindexes == 0) - { - /* - * Consider the need to do page-at-a-time heap vacuuming when - * using the one-pass strategy now. - * - * The one-pass strategy will never call lazy_vacuum(). The steps - * performed here can be thought of as the one-pass equivalent of - * a call to lazy_vacuum(). - */ - if (prunestate.has_lpdead_items) - { - Size freespace; - - lazy_vacuum_heap_page(vacrel, blkno, buf, 0, vmbuffer); - - /* Forget the LP_DEAD items that we just vacuumed */ - dead_items->num_items = 0; - - /* - * Periodically perform FSM vacuuming to make newly-freed - * space visible on upper FSM pages. Note we have not yet - * performed FSM processing for blkno. - */ - if (blkno - next_fsm_block_to_vacuum >= VACUUM_FSM_EVERY_PAGES) - { - FreeSpaceMapVacuumRange(vacrel->rel, next_fsm_block_to_vacuum, - blkno); - next_fsm_block_to_vacuum = blkno; - } - - /* - * Now perform FSM processing for blkno, and move on to next - * page. - * - * Our call to lazy_vacuum_heap_page() will have considered if - * it's possible to set all_visible/all_frozen independently - * of lazy_scan_prune(). Note that prunestate was invalidated - * by lazy_vacuum_heap_page() call. - */ - freespace = PageGetHeapFreeSpace(page); - - UnlockReleaseBuffer(buf); - RecordPageWithFreeSpace(vacrel->rel, blkno, freespace); - continue; - } - - /* - * There was no call to lazy_vacuum_heap_page() because pruning - * didn't encounter/create any LP_DEAD items that needed to be - * vacuumed. Prune state has not been invalidated, so proceed - * with prunestate-driven visibility map and FSM steps (just like - * the two-pass strategy). - */ - Assert(dead_items->num_items == 0); - } - - /* - * Handle setting visibility map bit based on information from the VM - * (as of last lazy_scan_skip() call), and from prunestate + * If we didn't get the cleanup lock, we can still collect LP_DEAD + * items in the dead_items area for later vacuuming, count live and + * recently dead tuples for vacuum logging, and determine if this + * block could later be truncated. If we encounter any xid/mxids that + * require advancing the relfrozenxid/relminxid, we'll have to wait + * for a cleanup lock and call lazy_scan_prune(). */ - if (!all_visible_according_to_vm && prunestate.all_visible) + if (!got_cleanup_lock && + !lazy_scan_noprune(vacrel, buf, blkno, page, &has_lpdead_items)) { - uint8 flags = VISIBILITYMAP_ALL_VISIBLE; - - if (prunestate.all_frozen) - { - Assert(!TransactionIdIsValid(prunestate.visibility_cutoff_xid)); - flags |= VISIBILITYMAP_ALL_FROZEN; - } - /* - * It should never be the case that the visibility map page is set - * while the page-level bit is clear, but the reverse is allowed - * (if checksums are not enabled). Regardless, set both bits so - * that we get back in sync. - * - * NB: If the heap page is all-visible but the VM bit is not set, - * we don't need to dirty the heap page. However, if checksums - * are enabled, we do need to make sure that the heap page is - * dirtied before passing it to visibilitymap_set(), because it - * may be logged. Given that this situation should only happen in - * rare cases after a crash, it is not worth optimizing. + * lazy_scan_noprune could not do all required processing. Wait + * for a cleanup lock, and call lazy_scan_prune in the usual way. */ - PageSetAllVisible(page); - MarkBufferDirty(buf); - visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr, - vmbuffer, prunestate.visibility_cutoff_xid, - flags); + Assert(vacrel->aggressive); + LockBuffer(buf, BUFFER_LOCK_UNLOCK); + LockBufferForCleanup(buf); + got_cleanup_lock = true; } /* - * As of PostgreSQL 9.2, the visibility map bit should never be set if - * the page-level bit is clear. However, it's possible that the bit - * got cleared after lazy_scan_skip() was called, so we must recheck - * with buffer lock before concluding that the VM is corrupt. + * If we have a cleanup lock, we must now prune, freeze, and count + * tuples. We may have acquired the cleanup lock originally, or we may + * have gone back and acquired it after lazy_scan_noprune() returned + * false. Either way, the page hasn't been processed yet. + * + * Like lazy_scan_noprune(), lazy_scan_prune() will count + * recently_dead_tuples and live tuples for vacuum logging, determine + * if the block can later be truncated, and accumulate the details of + * remaining LP_DEAD line pointers on the page into dead_items. These + * dead items include those pruned by lazy_scan_prune() as well as + * line pointers previously marked LP_DEAD. */ - else if (all_visible_according_to_vm && !PageIsAllVisible(page) && - visibilitymap_get_status(vacrel->rel, blkno, &vmbuffer) != 0) - { - elog(WARNING, "page is not marked all-visible but visibility map bit is set in relation \"%s\" page %u", - vacrel->relname, blkno); - visibilitymap_clear(vacrel->rel, blkno, vmbuffer, - VISIBILITYMAP_VALID_BITS); - } + if (got_cleanup_lock) + lazy_scan_prune(vacrel, buf, blkno, page, + vmbuffer, all_visible_according_to_vm, + &has_lpdead_items); /* - * It's possible for the value returned by - * GetOldestNonRemovableTransactionId() to move backwards, so it's not - * wrong for us to see tuples that appear to not be visible to - * everyone yet, while PD_ALL_VISIBLE is already set. The real safe - * xmin value never moves backwards, but - * GetOldestNonRemovableTransactionId() is conservative and sometimes - * returns a value that's unnecessarily small, so if we see that - * contradiction it just means that the tuples that we think are not - * visible to everyone yet actually are, and the PD_ALL_VISIBLE flag - * is correct. + * Now drop the buffer lock and, potentially, update the FSM. + * + * Our goal is to update the freespace map the last time we touch the + * page. If we'll process a block in the second pass, we may free up + * additional space on the page, so it is better to update the FSM + * after the second pass. If the relation has no indexes, or if index + * vacuuming is disabled, there will be no second heap pass; if this + * particular page has no dead items, the second heap pass will not + * touch this page. So, in those cases, update the FSM now. * - * There should never be LP_DEAD items on a page with PD_ALL_VISIBLE - * set, however. + * Note: In corner cases, it's possible to miss updating the FSM + * entirely. If index vacuuming is currently enabled, we'll skip the + * FSM update now. But if failsafe mode is later activated, or there + * are so few dead tuples that index vacuuming is bypassed, there will + * also be no opportunity to update the FSM later, because we'll never + * revisit this page. Since updating the FSM is desirable but not + * absolutely required, that's OK. */ - else if (prunestate.has_lpdead_items && PageIsAllVisible(page)) + if (vacrel->nindexes == 0 + || !vacrel->do_index_vacuuming + || !has_lpdead_items) { - elog(WARNING, "page containing LP_DEAD items is marked as all-visible in relation \"%s\" page %u", - vacrel->relname, blkno); - PageClearAllVisible(page); - MarkBufferDirty(buf); - visibilitymap_clear(vacrel->rel, blkno, vmbuffer, - VISIBILITYMAP_VALID_BITS); - } + Size freespace = PageGetHeapFreeSpace(page); + + UnlockReleaseBuffer(buf); + RecordPageWithFreeSpace(vacrel->rel, blkno, freespace); - /* - * If the all-visible page is all-frozen but not marked as such yet, - * mark it as all-frozen. Note that all_frozen is only valid if - * all_visible is true, so we must check both prunestate fields. - */ - else if (all_visible_according_to_vm && prunestate.all_visible && - prunestate.all_frozen && - !VM_ALL_FROZEN(vacrel->rel, blkno, &vmbuffer)) - { /* - * Avoid relying on all_visible_according_to_vm as a proxy for the - * page-level PD_ALL_VISIBLE bit being set, since it might have - * become stale -- even when all_visible is set in prunestate + * Periodically perform FSM vacuuming to make newly-freed space + * visible on upper FSM pages. This is done after vacuuming if the + * table has indexes. There will only be newly-freed space if we + * held the cleanup lock and lazy_scan_prune() was called. */ - if (!PageIsAllVisible(page)) + if (got_cleanup_lock && vacrel->nindexes == 0 && has_lpdead_items && + blkno - next_fsm_block_to_vacuum >= VACUUM_FSM_EVERY_PAGES) { - PageSetAllVisible(page); - MarkBufferDirty(buf); + FreeSpaceMapVacuumRange(vacrel->rel, next_fsm_block_to_vacuum, + blkno); + next_fsm_block_to_vacuum = blkno; } - - /* - * Set the page all-frozen (and all-visible) in the VM. - * - * We can pass InvalidTransactionId as our visibility_cutoff_xid, - * since a snapshotConflictHorizon sufficient to make everything - * safe for REDO was logged when the page's tuples were frozen. - */ - Assert(!TransactionIdIsValid(prunestate.visibility_cutoff_xid)); - visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr, - vmbuffer, InvalidTransactionId, - VISIBILITYMAP_ALL_VISIBLE | - VISIBILITYMAP_ALL_FROZEN); - } - - /* - * Final steps for block: drop cleanup lock, record free space in the - * FSM - */ - if (prunestate.has_lpdead_items && vacrel->do_index_vacuuming) - { - /* - * Wait until lazy_vacuum_heap_rel() to save free space. This - * doesn't just save us some cycles; it also allows us to record - * any additional free space that lazy_vacuum_heap_page() will - * make available in cases where it's possible to truncate the - * page's line pointer array. - * - * Note: It's not in fact 100% certain that we really will call - * lazy_vacuum_heap_rel() -- lazy_vacuum() might yet opt to skip - * index vacuuming (and so must skip heap vacuuming). This is - * deemed okay because it only happens in emergencies, or when - * there is very little free space anyway. (Besides, we start - * recording free space in the FSM once index vacuuming has been - * abandoned.) - * - * Note: The one-pass (no indexes) case is only supposed to make - * it this far when there were no LP_DEAD items during pruning. - */ - Assert(vacrel->nindexes > 0); - UnlockReleaseBuffer(buf); } else - { - Size freespace = PageGetHeapFreeSpace(page); - UnlockReleaseBuffer(buf); - RecordPageWithFreeSpace(vacrel->rel, blkno, freespace); - } } vacrel->blkno = InvalidBlockNumber; @@ -1252,7 +1047,7 @@ lazy_scan_heap(LVRelState *vacrel) * Do index vacuuming (call each index's ambulkdelete routine), then do * related heap vacuuming */ - if (dead_items->num_items > 0) + if (vacrel->dead_items_info->num_items > 0) lazy_vacuum(vacrel); /* @@ -1271,47 +1066,146 @@ lazy_scan_heap(LVRelState *vacrel) } /* - * lazy_scan_skip() -- set up range of skippable blocks using visibility map. + * heap_vac_scan_next_block() -- get next block for vacuum to process + * + * lazy_scan_heap() calls here every time it needs to get the next block to + * prune and vacuum. The function uses the visibility map, vacuum options, + * and various thresholds to skip blocks which do not need to be processed and + * sets blkno to the next block to process. * - * lazy_scan_heap() calls here every time it needs to set up a new range of - * blocks to skip via the visibility map. Caller passes the next block in - * line. We return a next_unskippable_block for this range. When there are - * no skippable blocks we just return caller's next_block. The all-visible - * status of the returned block is set in *next_unskippable_allvis for caller, - * too. Block usually won't be all-visible (since it's unskippable), but it - * can be during aggressive VACUUMs (as well as in certain edge cases). + * The block number and visibility status of the next block to process are set + * in *blkno and *all_visible_according_to_vm. The return value is false if + * there are no further blocks to process. * - * Sets *skipping_current_range to indicate if caller should skip this range. - * Costs and benefits drive our decision. Very small ranges won't be skipped. + * vacrel is an in/out parameter here. Vacuum options and information about + * the relation are read. vacrel->skippedallvis is set if we skip a block + * that's all-visible but not all-frozen, to ensure that we don't update + * relfrozenxid in that case. vacrel also holds information about the next + * unskippable block, as bookkeeping for this function. + */ +static bool +heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno, + bool *all_visible_according_to_vm) +{ + BlockNumber next_block; + + /* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */ + next_block = vacrel->current_block + 1; + + /* Have we reached the end of the relation? */ + if (next_block >= vacrel->rel_pages) + { + if (BufferIsValid(vacrel->next_unskippable_vmbuffer)) + { + ReleaseBuffer(vacrel->next_unskippable_vmbuffer); + vacrel->next_unskippable_vmbuffer = InvalidBuffer; + } + *blkno = vacrel->rel_pages; + return false; + } + + /* + * We must be in one of the three following states: + */ + if (next_block > vacrel->next_unskippable_block || + vacrel->next_unskippable_block == InvalidBlockNumber) + { + /* + * 1. We have just processed an unskippable block (or we're at the + * beginning of the scan). Find the next unskippable block using the + * visibility map. + */ + bool skipsallvis; + + find_next_unskippable_block(vacrel, &skipsallvis); + + /* + * We now know the next block that we must process. It can be the + * next block after the one we just processed, or something further + * ahead. If it's further ahead, we can jump to it, but we choose to + * do so only if we can skip at least SKIP_PAGES_THRESHOLD consecutive + * pages. Since we're reading sequentially, the OS should be doing + * readahead for us, so there's no gain in skipping a page now and + * then. Skipping such a range might even discourage sequential + * detection. + * + * This test also enables more frequent relfrozenxid advancement + * during non-aggressive VACUUMs. If the range has any all-visible + * pages then skipping makes updating relfrozenxid unsafe, which is a + * real downside. + */ + if (vacrel->next_unskippable_block - next_block >= SKIP_PAGES_THRESHOLD) + { + next_block = vacrel->next_unskippable_block; + if (skipsallvis) + vacrel->skippedallvis = true; + } + } + + /* Now we must be in one of the two remaining states: */ + if (next_block < vacrel->next_unskippable_block) + { + /* + * 2. We are processing a range of blocks that we could have skipped + * but chose not to. We know that they are all-visible in the VM, + * otherwise they would've been unskippable. + */ + *blkno = vacrel->current_block = next_block; + *all_visible_according_to_vm = true; + return true; + } + else + { + /* + * 3. We reached the next unskippable block. Process it. On next + * iteration, we will be back in state 1. + */ + Assert(next_block == vacrel->next_unskippable_block); + + *blkno = vacrel->current_block = next_block; + *all_visible_according_to_vm = vacrel->next_unskippable_allvis; + return true; + } +} + +/* + * Find the next unskippable block in a vacuum scan using the visibility map. + * The next unskippable block and its visibility information is updated in + * vacrel. * * Note: our opinion of which blocks can be skipped can go stale immediately. * It's okay if caller "misses" a page whose all-visible or all-frozen marking * was concurrently cleared, though. All that matters is that caller scan all * pages whose tuples might contain XIDs < OldestXmin, or MXIDs < OldestMxact. * (Actually, non-aggressive VACUUMs can choose to skip all-visible pages with - * older XIDs/MXIDs. The vacrel->skippedallvis flag will be set here when the - * choice to skip such a range is actually made, making everything safe.) + * older XIDs/MXIDs. The *skippedallvis flag will be set here when the choice + * to skip such a range is actually made, making everything safe.) */ -static BlockNumber -lazy_scan_skip(LVRelState *vacrel, Buffer *vmbuffer, BlockNumber next_block, - bool *next_unskippable_allvis, bool *skipping_current_range) +static void +find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis) { - BlockNumber rel_pages = vacrel->rel_pages, - next_unskippable_block = next_block, - nskippable_blocks = 0; - bool skipsallvis = false; + BlockNumber rel_pages = vacrel->rel_pages; + BlockNumber next_unskippable_block = vacrel->next_unskippable_block + 1; + Buffer next_unskippable_vmbuffer = vacrel->next_unskippable_vmbuffer; + bool next_unskippable_allvis; - *next_unskippable_allvis = true; - while (next_unskippable_block < rel_pages) + *skipsallvis = false; + + for (;;) { uint8 mapbits = visibilitymap_get_status(vacrel->rel, next_unskippable_block, - vmbuffer); + &next_unskippable_vmbuffer); + + next_unskippable_allvis = (mapbits & VISIBILITYMAP_ALL_VISIBLE) != 0; - if ((mapbits & VISIBILITYMAP_ALL_VISIBLE) == 0) + /* + * A block is unskippable if it is not all visible according to the + * visibility map. + */ + if (!next_unskippable_allvis) { Assert((mapbits & VISIBILITYMAP_ALL_FROZEN) == 0); - *next_unskippable_allvis = false; break; } @@ -1330,11 +1224,7 @@ lazy_scan_skip(LVRelState *vacrel, Buffer *vmbuffer, BlockNumber next_block, /* DISABLE_PAGE_SKIPPING makes all skipping unsafe */ if (!vacrel->skipwithvm) - { - /* Caller shouldn't rely on all_visible_according_to_vm */ - *next_unskippable_allvis = false; break; - } /* * Aggressive VACUUM caller can't skip pages just because they are @@ -1350,34 +1240,16 @@ lazy_scan_skip(LVRelState *vacrel, Buffer *vmbuffer, BlockNumber next_block, * All-visible block is safe to skip in non-aggressive case. But * remember that the final range contains such a block for later. */ - skipsallvis = true; + *skipsallvis = true; } - vacuum_delay_point(); next_unskippable_block++; - nskippable_blocks++; } - /* - * We only skip a range with at least SKIP_PAGES_THRESHOLD consecutive - * pages. Since we're reading sequentially, the OS should be doing - * readahead for us, so there's no gain in skipping a page now and then. - * Skipping such a range might even discourage sequential detection. - * - * This test also enables more frequent relfrozenxid advancement during - * non-aggressive VACUUMs. If the range has any all-visible pages then - * skipping makes updating relfrozenxid unsafe, which is a real downside. - */ - if (nskippable_blocks < SKIP_PAGES_THRESHOLD) - *skipping_current_range = false; - else - { - *skipping_current_range = true; - if (skipsallvis) - vacrel->skippedallvis = true; - } - - return next_unskippable_block; + /* write the local variables back to vacrel */ + vacrel->next_unskippable_block = next_unskippable_block; + vacrel->next_unskippable_allvis = next_unskippable_allvis; + vacrel->next_unskippable_vmbuffer = next_unskippable_vmbuffer; } /* @@ -1511,429 +1383,246 @@ lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf, BlockNumber blkno, return false; } +/* qsort comparator for sorting OffsetNumbers */ +static int +cmpOffsetNumbers(const void *a, const void *b) +{ + return pg_cmp_u16(*(const OffsetNumber *) a, *(const OffsetNumber *) b); +} + /* * lazy_scan_prune() -- lazy_scan_heap() pruning and freezing. * * Caller must hold pin and buffer cleanup lock on the buffer. * - * Prior to PostgreSQL 14 there were very rare cases where heap_page_prune() - * was allowed to disagree with our HeapTupleSatisfiesVacuum() call about - * whether or not a tuple should be considered DEAD. This happened when an - * inserting transaction concurrently aborted (after our heap_page_prune() - * call, before our HeapTupleSatisfiesVacuum() call). There was rather a lot - * of complexity just so we could deal with tuples that were DEAD to VACUUM, - * but nevertheless were left with storage after pruning. + * vmbuffer is the buffer containing the VM block with visibility information + * for the heap block, blkno. all_visible_according_to_vm is the saved + * visibility status of the heap block looked up earlier by the caller. We + * won't rely entirely on this status, as it may be out of date. * - * The approach we take now is to restart pruning when the race condition is - * detected. This allows heap_page_prune() to prune the tuples inserted by - * the now-aborted transaction. This is a little crude, but it guarantees - * that any items that make it into the dead_items array are simple LP_DEAD - * line pointers, and that every remaining item with tuple storage is - * considered as a candidate for freezing. + * *has_lpdead_items is set to true or false depending on whether, upon return + * from this function, any LP_DEAD items are still present on the page. */ static void lazy_scan_prune(LVRelState *vacrel, Buffer buf, BlockNumber blkno, Page page, - LVPagePruneState *prunestate) + Buffer vmbuffer, + bool all_visible_according_to_vm, + bool *has_lpdead_items) { Relation rel = vacrel->rel; - OffsetNumber offnum, - maxoff; - ItemId itemid; - HeapTupleData tuple; - HTSV_Result res; - int tuples_deleted, - tuples_frozen, - lpdead_items, - live_tuples, - recently_dead_tuples; - int nnewlpdead; - HeapPageFreeze pagefrz; - int64 fpi_before = pgWalUsage.wal_fpi; - OffsetNumber deadoffsets[MaxHeapTuplesPerPage]; - HeapTupleFreeze frozen[MaxHeapTuplesPerPage]; + PruneFreezeResult presult; + int prune_options = 0; Assert(BufferGetBlockNumber(buf) == blkno); /* - * maxoff might be reduced following line pointer array truncation in - * heap_page_prune. That's safe for us to ignore, since the reclaimed - * space will continue to look like LP_UNUSED items below. - */ - maxoff = PageGetMaxOffsetNumber(page); - -retry: - - /* Initialize (or reset) page-level state */ - pagefrz.freeze_required = false; - pagefrz.FreezePageRelfrozenXid = vacrel->NewRelfrozenXid; - pagefrz.FreezePageRelminMxid = vacrel->NewRelminMxid; - pagefrz.NoFreezePageRelfrozenXid = vacrel->NewRelfrozenXid; - pagefrz.NoFreezePageRelminMxid = vacrel->NewRelminMxid; - tuples_deleted = 0; - tuples_frozen = 0; - lpdead_items = 0; - live_tuples = 0; - recently_dead_tuples = 0; - - /* - * Prune all HOT-update chains in this page. + * Prune all HOT-update chains and potentially freeze tuples on this page. * - * We count tuples removed by the pruning step as tuples_deleted. Its - * final value can be thought of as the number of tuples that have been - * deleted from the table. It should not be confused with lpdead_items; - * lpdead_items's final value can be thought of as the number of tuples - * that were deleted from indexes. + * If the relation has no indexes, we can immediately mark would-be dead + * items LP_UNUSED. + * + * The number of tuples removed from the page is returned in + * presult.ndeleted. It should not be confused with presult.lpdead_items; + * presult.lpdead_items's final value can be thought of as the number of + * tuples that were deleted from indexes. + * + * We will update the VM after collecting LP_DEAD items and freezing + * tuples. Pruning will have determined whether or not the page is + * all-visible. */ - tuples_deleted = heap_page_prune(rel, buf, vacrel->vistest, - InvalidTransactionId, 0, &nnewlpdead, - &vacrel->offnum); + prune_options = HEAP_PAGE_PRUNE_FREEZE; + if (vacrel->nindexes == 0) + prune_options |= HEAP_PAGE_PRUNE_MARK_UNUSED_NOW; - /* - * Now scan the page to collect LP_DEAD items and check for tuples - * requiring freezing among remaining tuples with storage - */ - prunestate->hastup = false; - prunestate->has_lpdead_items = false; - prunestate->all_visible = true; - prunestate->all_frozen = true; - prunestate->visibility_cutoff_xid = InvalidTransactionId; + heap_page_prune_and_freeze(rel, buf, vacrel->vistest, prune_options, + &vacrel->cutoffs, &presult, PRUNE_VACUUM_SCAN, + &vacrel->offnum, + &vacrel->NewRelfrozenXid, &vacrel->NewRelminMxid); - for (offnum = FirstOffsetNumber; - offnum <= maxoff; - offnum = OffsetNumberNext(offnum)) - { - bool totally_frozen; + Assert(MultiXactIdIsValid(vacrel->NewRelminMxid)); + Assert(TransactionIdIsValid(vacrel->NewRelfrozenXid)); + if (presult.nfrozen > 0) + { /* - * Set the offset number so that we can display it along with any - * error that occurred while processing this tuple. + * We don't increment the frozen_pages instrumentation counter when + * nfrozen == 0, since it only counts pages with newly frozen tuples + * (don't confuse that with pages newly set all-frozen in VM). */ - vacrel->offnum = offnum; - itemid = PageGetItemId(page, offnum); - - if (!ItemIdIsUsed(itemid)) - continue; + vacrel->frozen_pages++; + } - /* Redirect items mustn't be touched */ - if (ItemIdIsRedirected(itemid)) - { - /* page makes rel truncation unsafe */ - prunestate->hastup = true; - continue; - } + /* + * VACUUM will call heap_page_is_all_visible() during the second pass over + * the heap to determine all_visible and all_frozen for the page -- this + * is a specialized version of the logic from this function. Now that + * we've finished pruning and freezing, make sure that we're in total + * agreement with heap_page_is_all_visible() using an assertion. + */ +#ifdef USE_ASSERT_CHECKING + /* Note that all_frozen value does not matter when !all_visible */ + if (presult.all_visible) + { + TransactionId debug_cutoff; + bool debug_all_frozen; - if (ItemIdIsDead(itemid)) - { - /* - * Deliberately don't set hastup for LP_DEAD items. We make the - * soft assumption that any LP_DEAD items encountered here will - * become LP_UNUSED later on, before count_nondeletable_pages is - * reached. If we don't make this assumption then rel truncation - * will only happen every other VACUUM, at most. Besides, VACUUM - * must treat hastup/nonempty_pages as provisional no matter how - * LP_DEAD items are handled (handled here, or handled later on). - * - * Also deliberately delay unsetting all_visible until just before - * we return to lazy_scan_heap caller, as explained in full below. - * (This is another case where it's useful to anticipate that any - * LP_DEAD items will become LP_UNUSED during the ongoing VACUUM.) - */ - deadoffsets[lpdead_items++] = offnum; - continue; - } + Assert(presult.lpdead_items == 0); - Assert(ItemIdIsNormal(itemid)); + if (!heap_page_is_all_visible(vacrel, buf, + &debug_cutoff, &debug_all_frozen)) + Assert(false); - ItemPointerSet(&(tuple.t_self), blkno, offnum); - tuple.t_data = (HeapTupleHeader) PageGetItem(page, itemid); - tuple.t_len = ItemIdGetLength(itemid); - tuple.t_tableOid = RelationGetRelid(rel); + Assert(presult.all_frozen == debug_all_frozen); - /* - * DEAD tuples are almost always pruned into LP_DEAD line pointers by - * heap_page_prune(), but it's possible that the tuple state changed - * since heap_page_prune() looked. Handle that here by restarting. - * (See comments at the top of function for a full explanation.) - */ - res = HeapTupleSatisfiesVacuum(&tuple, vacrel->cutoffs.OldestXmin, - buf); + Assert(!TransactionIdIsValid(debug_cutoff) || + debug_cutoff == presult.vm_conflict_horizon); + } +#endif - if (unlikely(res == HEAPTUPLE_DEAD)) - goto retry; + /* + * Now save details of the LP_DEAD items from the page in vacrel + */ + if (presult.lpdead_items > 0) + { + vacrel->lpdead_item_pages++; /* - * The criteria for counting a tuple as live in this block need to - * match what analyze.c's acquire_sample_rows() does, otherwise VACUUM - * and ANALYZE may produce wildly different reltuples values, e.g. - * when there are many recently-dead tuples. - * - * The logic here is a bit simpler than acquire_sample_rows(), as - * VACUUM can't run inside a transaction block, which makes some cases - * impossible (e.g. in-progress insert from the same transaction). - * - * We treat LP_DEAD items (which are the closest thing to DEAD tuples - * that might be seen here) differently, too: we assume that they'll - * become LP_UNUSED before VACUUM finishes. This difference is only - * superficial. VACUUM effectively agrees with ANALYZE about DEAD - * items, in the end. VACUUM won't remember LP_DEAD items, but only - * because they're not supposed to be left behind when it is done. - * (Cases where we bypass index vacuuming will violate this optimistic - * assumption, but the overall impact of that should be negligible.) + * deadoffsets are collected incrementally in + * heap_page_prune_and_freeze() as each dead line pointer is recorded, + * with an indeterminate order, but dead_items_add requires them to be + * sorted. */ - switch (res) - { - case HEAPTUPLE_LIVE: - - /* - * Count it as live. Not only is this natural, but it's also - * what acquire_sample_rows() does. - */ - live_tuples++; - - /* - * Is the tuple definitely visible to all transactions? - * - * NB: Like with per-tuple hint bits, we can't set the - * PD_ALL_VISIBLE flag if the inserter committed - * asynchronously. See SetHintBits for more info. Check that - * the tuple is hinted xmin-committed because of that. - */ - if (prunestate->all_visible) - { - TransactionId xmin; + qsort(presult.deadoffsets, presult.lpdead_items, sizeof(OffsetNumber), + cmpOffsetNumbers); - if (!HeapTupleHeaderXminCommitted(tuple.t_data)) - { - prunestate->all_visible = false; - break; - } - - /* - * The inserter definitely committed. But is it old enough - * that everyone sees it as committed? - */ - xmin = HeapTupleHeaderGetXmin(tuple.t_data); - if (!TransactionIdPrecedes(xmin, - vacrel->cutoffs.OldestXmin)) - { - prunestate->all_visible = false; - break; - } + dead_items_add(vacrel, blkno, presult.deadoffsets, presult.lpdead_items); + } - /* Track newest xmin on page. */ - if (TransactionIdFollows(xmin, prunestate->visibility_cutoff_xid) && - TransactionIdIsNormal(xmin)) - prunestate->visibility_cutoff_xid = xmin; - } - break; - case HEAPTUPLE_RECENTLY_DEAD: + /* Finally, add page-local counts to whole-VACUUM counts */ + vacrel->tuples_deleted += presult.ndeleted; + vacrel->tuples_frozen += presult.nfrozen; + vacrel->lpdead_items += presult.lpdead_items; + vacrel->live_tuples += presult.live_tuples; + vacrel->recently_dead_tuples += presult.recently_dead_tuples; - /* - * If tuple is recently dead then we must not remove it from - * the relation. (We only remove items that are LP_DEAD from - * pruning.) - */ - recently_dead_tuples++; - prunestate->all_visible = false; - break; - case HEAPTUPLE_INSERT_IN_PROGRESS: + /* Can't truncate this page */ + if (presult.hastup) + vacrel->nonempty_pages = blkno + 1; - /* - * We do not count these rows as live, because we expect the - * inserting transaction to update the counters at commit, and - * we assume that will happen only after we report our - * results. This assumption is a bit shaky, but it is what - * acquire_sample_rows() does, so be consistent. - */ - prunestate->all_visible = false; - break; - case HEAPTUPLE_DELETE_IN_PROGRESS: - /* This is an expected case during concurrent vacuum */ - prunestate->all_visible = false; + /* Did we find LP_DEAD items? */ + *has_lpdead_items = (presult.lpdead_items > 0); - /* - * Count such rows as live. As above, we assume the deleting - * transaction will commit and update the counters after we - * report. - */ - live_tuples++; - break; - default: - elog(ERROR, "unexpected HeapTupleSatisfiesVacuum result"); - break; - } + Assert(!presult.all_visible || !(*has_lpdead_items)); - prunestate->hastup = true; /* page makes rel truncation unsafe */ + /* + * Handle setting visibility map bit based on information from the VM (as + * of last heap_vac_scan_next_block() call), and from all_visible and + * all_frozen variables + */ + if (!all_visible_according_to_vm && presult.all_visible) + { + uint8 flags = VISIBILITYMAP_ALL_VISIBLE; - /* Tuple with storage -- consider need to freeze */ - if (heap_prepare_freeze_tuple(tuple.t_data, &vacrel->cutoffs, &pagefrz, - &frozen[tuples_frozen], &totally_frozen)) + if (presult.all_frozen) { - /* Save prepared freeze plan for later */ - frozen[tuples_frozen++].offset = offnum; + Assert(!TransactionIdIsValid(presult.vm_conflict_horizon)); + flags |= VISIBILITYMAP_ALL_FROZEN; } /* - * If any tuple isn't either totally frozen already or eligible to - * become totally frozen (according to its freeze plan), then the page - * definitely cannot be set all-frozen in the visibility map later on + * It should never be the case that the visibility map page is set + * while the page-level bit is clear, but the reverse is allowed (if + * checksums are not enabled). Regardless, set both bits so that we + * get back in sync. + * + * NB: If the heap page is all-visible but the VM bit is not set, we + * don't need to dirty the heap page. However, if checksums are + * enabled, we do need to make sure that the heap page is dirtied + * before passing it to visibilitymap_set(), because it may be logged. + * Given that this situation should only happen in rare cases after a + * crash, it is not worth optimizing. */ - if (!totally_frozen) - prunestate->all_frozen = false; + PageSetAllVisible(page); + MarkBufferDirty(buf); + visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr, + vmbuffer, presult.vm_conflict_horizon, + flags); } /* - * We have now divided every item on the page into either an LP_DEAD item - * that will need to be vacuumed in indexes later, or a LP_NORMAL tuple - * that remains and needs to be considered for freezing now (LP_UNUSED and - * LP_REDIRECT items also remain, but are of no further interest to us). - */ - vacrel->offnum = InvalidOffsetNumber; - - /* - * Freeze the page when heap_prepare_freeze_tuple indicates that at least - * one XID/MXID from before FreezeLimit/MultiXactCutoff is present. Also - * freeze when pruning generated an FPI, if doing so means that we set the - * page all-frozen afterwards (might not happen until final heap pass). + * As of PostgreSQL 9.2, the visibility map bit should never be set if the + * page-level bit is clear. However, it's possible that the bit got + * cleared after heap_vac_scan_next_block() was called, so we must recheck + * with buffer lock before concluding that the VM is corrupt. */ - if (pagefrz.freeze_required || tuples_frozen == 0 || - (prunestate->all_visible && prunestate->all_frozen && - fpi_before != pgWalUsage.wal_fpi)) + else if (all_visible_according_to_vm && !PageIsAllVisible(page) && + visibilitymap_get_status(vacrel->rel, blkno, &vmbuffer) != 0) { - /* - * We're freezing the page. Our final NewRelfrozenXid doesn't need to - * be affected by the XIDs that are just about to be frozen anyway. - */ - vacrel->NewRelfrozenXid = pagefrz.FreezePageRelfrozenXid; - vacrel->NewRelminMxid = pagefrz.FreezePageRelminMxid; - - if (tuples_frozen == 0) - { - /* - * We have no freeze plans to execute, so there's no added cost - * from following the freeze path. That's why it was chosen. This - * is important in the case where the page only contains totally - * frozen tuples at this point (perhaps only following pruning). - * Such pages can be marked all-frozen in the VM by our caller, - * even though none of its tuples were newly frozen here (note - * that the "no freeze" path never sets pages all-frozen). - * - * We never increment the frozen_pages instrumentation counter - * here, since it only counts pages with newly frozen tuples - * (don't confuse that with pages newly set all-frozen in VM). - */ - } - else - { - TransactionId snapshotConflictHorizon; - - vacrel->frozen_pages++; - - /* - * We can use visibility_cutoff_xid as our cutoff for conflicts - * when the whole page is eligible to become all-frozen in the VM - * once we're done with it. Otherwise we generate a conservative - * cutoff by stepping back from OldestXmin. - */ - if (prunestate->all_visible && prunestate->all_frozen) - { - /* Using same cutoff when setting VM is now unnecessary */ - snapshotConflictHorizon = prunestate->visibility_cutoff_xid; - prunestate->visibility_cutoff_xid = InvalidTransactionId; - } - else - { - /* Avoids false conflicts when hot_standby_feedback in use */ - snapshotConflictHorizon = vacrel->cutoffs.OldestXmin; - TransactionIdRetreat(snapshotConflictHorizon); - } - - /* Execute all freeze plans for page as a single atomic action */ - heap_freeze_execute_prepared(vacrel->rel, buf, - snapshotConflictHorizon, - frozen, tuples_frozen); - } - } - else - { - /* - * Page requires "no freeze" processing. It might be set all-visible - * in the visibility map, but it can never be set all-frozen. - */ - vacrel->NewRelfrozenXid = pagefrz.NoFreezePageRelfrozenXid; - vacrel->NewRelminMxid = pagefrz.NoFreezePageRelminMxid; - prunestate->all_frozen = false; - tuples_frozen = 0; /* avoid miscounts in instrumentation */ + elog(WARNING, "page is not marked all-visible but visibility map bit is set in relation \"%s\" page %u", + vacrel->relname, blkno); + visibilitymap_clear(vacrel->rel, blkno, vmbuffer, + VISIBILITYMAP_VALID_BITS); } /* - * VACUUM will call heap_page_is_all_visible() during the second pass over - * the heap to determine all_visible and all_frozen for the page -- this - * is a specialized version of the logic from this function. Now that - * we've finished pruning and freezing, make sure that we're in total - * agreement with heap_page_is_all_visible() using an assertion. + * It's possible for the value returned by + * GetOldestNonRemovableTransactionId() to move backwards, so it's not + * wrong for us to see tuples that appear to not be visible to everyone + * yet, while PD_ALL_VISIBLE is already set. The real safe xmin value + * never moves backwards, but GetOldestNonRemovableTransactionId() is + * conservative and sometimes returns a value that's unnecessarily small, + * so if we see that contradiction it just means that the tuples that we + * think are not visible to everyone yet actually are, and the + * PD_ALL_VISIBLE flag is correct. + * + * There should never be LP_DEAD items on a page with PD_ALL_VISIBLE set, + * however. */ -#ifdef USE_ASSERT_CHECKING - /* Note that all_frozen value does not matter when !all_visible */ - if (prunestate->all_visible && lpdead_items == 0) + else if (presult.lpdead_items > 0 && PageIsAllVisible(page)) { - TransactionId cutoff; - bool all_frozen; - - if (!heap_page_is_all_visible(vacrel, buf, &cutoff, &all_frozen)) - Assert(false); - - Assert(!TransactionIdIsValid(cutoff) || - cutoff == prunestate->visibility_cutoff_xid); + elog(WARNING, "page containing LP_DEAD items is marked as all-visible in relation \"%s\" page %u", + vacrel->relname, blkno); + PageClearAllVisible(page); + MarkBufferDirty(buf); + visibilitymap_clear(vacrel->rel, blkno, vmbuffer, + VISIBILITYMAP_VALID_BITS); } -#endif /* - * Now save details of the LP_DEAD items from the page in vacrel + * If the all-visible page is all-frozen but not marked as such yet, mark + * it as all-frozen. Note that all_frozen is only valid if all_visible is + * true, so we must check both all_visible and all_frozen. */ - if (lpdead_items > 0) + else if (all_visible_according_to_vm && presult.all_visible && + presult.all_frozen && !VM_ALL_FROZEN(vacrel->rel, blkno, &vmbuffer)) { - VacDeadItems *dead_items = vacrel->dead_items; - ItemPointerData tmp; - - vacrel->lpdead_item_pages++; - prunestate->has_lpdead_items = true; - - ItemPointerSetBlockNumber(&tmp, blkno); - - for (int i = 0; i < lpdead_items; i++) + /* + * Avoid relying on all_visible_according_to_vm as a proxy for the + * page-level PD_ALL_VISIBLE bit being set, since it might have become + * stale -- even when all_visible is set + */ + if (!PageIsAllVisible(page)) { - ItemPointerSetOffsetNumber(&tmp, deadoffsets[i]); - dead_items->items[dead_items->num_items++] = tmp; + PageSetAllVisible(page); + MarkBufferDirty(buf); } - Assert(dead_items->num_items <= dead_items->max_items); - pgstat_progress_update_param(PROGRESS_VACUUM_NUM_DEAD_TUPLES, - dead_items->num_items); - /* - * It was convenient to ignore LP_DEAD items in all_visible earlier on - * to make the choice of whether or not to freeze the page unaffected - * by the short-term presence of LP_DEAD items. These LP_DEAD items - * were effectively assumed to be LP_UNUSED items in the making. It - * doesn't matter which heap pass (initial pass or final pass) ends up - * setting the page all-frozen, as long as the ongoing VACUUM does it. + * Set the page all-frozen (and all-visible) in the VM. * - * Now that freezing has been finalized, unset all_visible. It needs - * to reflect the present state of things, as expected by our caller. + * We can pass InvalidTransactionId as our cutoff_xid, since a + * snapshotConflictHorizon sufficient to make everything safe for REDO + * was logged when the page's tuples were frozen. */ - prunestate->all_visible = false; + Assert(!TransactionIdIsValid(presult.vm_conflict_horizon)); + visibilitymap_set(vacrel->rel, blkno, buf, InvalidXLogRecPtr, + vmbuffer, InvalidTransactionId, + VISIBILITYMAP_ALL_VISIBLE | + VISIBILITYMAP_ALL_FROZEN); } - - /* Finally, add page-local counts to whole-VACUUM counts */ - vacrel->tuples_deleted += tuples_deleted; - vacrel->tuples_frozen += tuples_frozen; - vacrel->lpdead_items += lpdead_items; - vacrel->live_tuples += live_tuples; - vacrel->recently_dead_tuples += recently_dead_tuples; } /* @@ -1943,7 +1632,7 @@ lazy_scan_prune(LVRelState *vacrel, * lazy_scan_prune, which requires a full cleanup lock. While pruning isn't * performed here, it's quite possible that an earlier opportunistic pruning * operation left LP_DEAD items behind. We'll at least collect any such items - * in the dead_items array for removal from indexes. + * in dead_items for removal from indexes. * * For aggressive VACUUM callers, we may return false to indicate that a full * cleanup lock is required for processing by lazy_scan_prune. This is only @@ -1951,17 +1640,17 @@ lazy_scan_prune(LVRelState *vacrel, * one or more tuples on the page. We always return true for non-aggressive * callers. * - * See lazy_scan_prune for an explanation of hastup return flag. - * recordfreespace flag instructs caller on whether or not it should do - * generic FSM processing for page. + * If this function returns true, *has_lpdead_items gets set to true or false + * depending on whether, upon return from this function, any LP_DEAD items are + * present on the page. If this function returns false, *has_lpdead_items + * is not updated. */ static bool lazy_scan_noprune(LVRelState *vacrel, Buffer buf, BlockNumber blkno, Page page, - bool *hastup, - bool *recordfreespace) + bool *has_lpdead_items) { OffsetNumber offnum, maxoff; @@ -1969,6 +1658,7 @@ lazy_scan_noprune(LVRelState *vacrel, live_tuples, recently_dead_tuples, missed_dead_tuples; + bool hastup; HeapTupleHeader tupleheader; TransactionId NoFreezePageRelfrozenXid = vacrel->NewRelfrozenXid; MultiXactId NoFreezePageRelminMxid = vacrel->NewRelminMxid; @@ -1976,8 +1666,7 @@ lazy_scan_noprune(LVRelState *vacrel, Assert(BufferGetBlockNumber(buf) == blkno); - *hastup = false; /* for now */ - *recordfreespace = false; /* for now */ + hastup = false; /* for now */ lpdead_items = 0; live_tuples = 0; @@ -2000,7 +1689,7 @@ lazy_scan_noprune(LVRelState *vacrel, if (ItemIdIsRedirected(itemid)) { - *hastup = true; + hastup = true; continue; } @@ -2014,7 +1703,7 @@ lazy_scan_noprune(LVRelState *vacrel, continue; } - *hastup = true; /* page prevents rel truncation */ + hastup = true; /* page prevents rel truncation */ tupleheader = (HeapTupleHeader) PageGetItem(page, itemid); if (heap_tuple_should_freeze(tupleheader, &vacrel->cutoffs, &NoFreezePageRelfrozenXid, @@ -2102,7 +1791,7 @@ lazy_scan_noprune(LVRelState *vacrel, vacrel->NewRelfrozenXid = NoFreezePageRelfrozenXid; vacrel->NewRelminMxid = NoFreezePageRelminMxid; - /* Save any LP_DEAD items found on the page in dead_items array */ + /* Save any LP_DEAD items found on the page in dead_items */ if (vacrel->nindexes == 0) { /* Using one-pass strategy (since table has no indexes) */ @@ -2116,25 +1805,12 @@ lazy_scan_noprune(LVRelState *vacrel, * but it beats having to maintain specialized heap vacuuming code * forever, for vanishingly little benefit.) */ - *hastup = true; + hastup = true; missed_dead_tuples += lpdead_items; } - - *recordfreespace = true; - } - else if (lpdead_items == 0) - { - /* - * Won't be vacuuming this page later, so record page's freespace in - * the FSM now - */ - *recordfreespace = true; } - else + else if (lpdead_items > 0) { - VacDeadItems *dead_items = vacrel->dead_items; - ItemPointerData tmp; - /* * Page has LP_DEAD items, and so any references/TIDs that remain in * indexes will be deleted during index vacuuming (and then marked @@ -2142,25 +1818,9 @@ lazy_scan_noprune(LVRelState *vacrel, */ vacrel->lpdead_item_pages++; - ItemPointerSetBlockNumber(&tmp, blkno); - - for (int i = 0; i < lpdead_items; i++) - { - ItemPointerSetOffsetNumber(&tmp, deadoffsets[i]); - dead_items->items[dead_items->num_items++] = tmp; - } - - Assert(dead_items->num_items <= dead_items->max_items); - pgstat_progress_update_param(PROGRESS_VACUUM_NUM_DEAD_TUPLES, - dead_items->num_items); + dead_items_add(vacrel, blkno, deadoffsets, lpdead_items); vacrel->lpdead_items += lpdead_items; - - /* - * Assume that we'll go on to vacuum this heap page during final pass - * over the heap. Don't record free space until then. - */ - *recordfreespace = false; } /* @@ -2172,6 +1832,13 @@ lazy_scan_noprune(LVRelState *vacrel, if (missed_dead_tuples > 0) vacrel->missed_dead_pages++; + /* Can't truncate this page */ + if (hastup) + vacrel->nonempty_pages = blkno + 1; + + /* Did we find LP_DEAD items? */ + *has_lpdead_items = (lpdead_items > 0); + /* Caller won't need to call lazy_scan_prune with same page */ return true; } @@ -2201,7 +1868,7 @@ lazy_vacuum(LVRelState *vacrel) if (!vacrel->do_index_vacuuming) { Assert(!vacrel->do_index_cleanup); - vacrel->dead_items->num_items = 0; + dead_items_reset(vacrel); return; } @@ -2230,7 +1897,7 @@ lazy_vacuum(LVRelState *vacrel) BlockNumber threshold; Assert(vacrel->num_index_scans == 0); - Assert(vacrel->lpdead_items == vacrel->dead_items->num_items); + Assert(vacrel->lpdead_items == vacrel->dead_items_info->num_items); Assert(vacrel->do_index_vacuuming); Assert(vacrel->do_index_cleanup); @@ -2258,7 +1925,7 @@ lazy_vacuum(LVRelState *vacrel) */ threshold = (double) vacrel->rel_pages * BYPASS_THRESHOLD_PAGES; bypass = (vacrel->lpdead_item_pages < threshold && - vacrel->lpdead_items < MAXDEADITEMS(32L * 1024L * 1024L)); + (TidStoreMemoryUsage(vacrel->dead_items) < (32L * 1024L * 1024L))); } if (bypass) @@ -2303,7 +1970,7 @@ lazy_vacuum(LVRelState *vacrel) * Forget the LP_DEAD items that we just vacuumed (or just decided to not * vacuum) */ - vacrel->dead_items->num_items = 0; + dead_items_reset(vacrel); } /* @@ -2319,6 +1986,17 @@ lazy_vacuum_all_indexes(LVRelState *vacrel) { bool allindexes = true; double old_live_tuples = vacrel->rel->rd_rel->reltuples; + const int progress_start_index[] = { + PROGRESS_VACUUM_PHASE, + PROGRESS_VACUUM_INDEXES_TOTAL + }; + const int progress_end_index[] = { + PROGRESS_VACUUM_INDEXES_TOTAL, + PROGRESS_VACUUM_INDEXES_PROCESSED, + PROGRESS_VACUUM_NUM_INDEX_VACUUMS + }; + int64 progress_start_val[2]; + int64 progress_end_val[3]; Assert(vacrel->nindexes > 0); Assert(vacrel->do_index_vacuuming); @@ -2331,9 +2009,13 @@ lazy_vacuum_all_indexes(LVRelState *vacrel) return false; } - /* Report that we are now vacuuming indexes */ - pgstat_progress_update_param(PROGRESS_VACUUM_PHASE, - PROGRESS_VACUUM_PHASE_VACUUM_INDEX); + /* + * Report that we are now vacuuming indexes and the number of indexes to + * vacuum. + */ + progress_start_val[0] = PROGRESS_VACUUM_PHASE_VACUUM_INDEX; + progress_start_val[1] = vacrel->nindexes; + pgstat_progress_update_multi_param(2, progress_start_index, progress_start_val); if (!ParallelVacuumIsActive(vacrel)) { @@ -2346,6 +2028,10 @@ lazy_vacuum_all_indexes(LVRelState *vacrel) old_live_tuples, vacrel); + /* Report the number of indexes vacuumed */ + pgstat_progress_update_param(PROGRESS_VACUUM_INDEXES_PROCESSED, + idx + 1); + if (lazy_check_wraparound_failsafe(vacrel)) { /* Wraparound emergency -- end current index scan */ @@ -2376,18 +2062,21 @@ lazy_vacuum_all_indexes(LVRelState *vacrel) * place). */ Assert(vacrel->num_index_scans > 0 || - vacrel->dead_items->num_items == vacrel->lpdead_items); + vacrel->dead_items_info->num_items == vacrel->lpdead_items); Assert(allindexes || VacuumFailsafeActive); /* - * Increase and report the number of index scans. + * Increase and report the number of index scans. Also, we reset + * PROGRESS_VACUUM_INDEXES_TOTAL and PROGRESS_VACUUM_INDEXES_PROCESSED. * * We deliberately include the case where we started a round of bulk * deletes that we weren't able to finish due to the failsafe triggering. */ vacrel->num_index_scans++; - pgstat_progress_update_param(PROGRESS_VACUUM_NUM_INDEX_VACUUMS, - vacrel->num_index_scans); + progress_end_val[0] = 0; + progress_end_val[1] = 0; + progress_end_val[2] = vacrel->num_index_scans; + pgstat_progress_update_multi_param(3, progress_end_index, progress_end_val); return allindexes; } @@ -2395,9 +2084,8 @@ lazy_vacuum_all_indexes(LVRelState *vacrel) /* * lazy_vacuum_heap_rel() -- second pass over the heap for two pass strategy * - * This routine marks LP_DEAD items in vacrel->dead_items array as LP_UNUSED. - * Pages that never had lazy_scan_prune record LP_DEAD items are not visited - * at all. + * This routine marks LP_DEAD items in vacrel->dead_items as LP_UNUSED. Pages + * that never had lazy_scan_prune record LP_DEAD items are not visited at all. * * We may also be able to truncate the line pointer array of the heap pages we * visit. If there is a contiguous group of LP_UNUSED items at the end of the @@ -2413,10 +2101,11 @@ lazy_vacuum_all_indexes(LVRelState *vacrel) static void lazy_vacuum_heap_rel(LVRelState *vacrel) { - int index = 0; BlockNumber vacuumed_pages = 0; Buffer vmbuffer = InvalidBuffer; LVSavedErrInfo saved_err_info; + TidStoreIter *iter; + TidStoreIterResult *iter_result; Assert(vacrel->do_index_vacuuming); Assert(vacrel->do_index_cleanup); @@ -2431,7 +2120,8 @@ lazy_vacuum_heap_rel(LVRelState *vacrel) VACUUM_ERRCB_PHASE_VACUUM_HEAP, InvalidBlockNumber, InvalidOffsetNumber); - while (index < vacrel->dead_items->num_items) + iter = TidStoreBeginIterate(vacrel->dead_items); + while ((iter_result = TidStoreIterateNext(iter)) != NULL) { BlockNumber blkno; Buffer buf; @@ -2440,7 +2130,7 @@ lazy_vacuum_heap_rel(LVRelState *vacrel) vacuum_delay_point(); - blkno = ItemPointerGetBlockNumber(&vacrel->dead_items->items[index]); + blkno = iter_result->blkno; vacrel->blkno = blkno; /* @@ -2454,7 +2144,8 @@ lazy_vacuum_heap_rel(LVRelState *vacrel) buf = ReadBufferExtended(vacrel->rel, MAIN_FORKNUM, blkno, RBM_NORMAL, vacrel->bstrategy); LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); - index = lazy_vacuum_heap_page(vacrel, blkno, buf, index, vmbuffer); + lazy_vacuum_heap_page(vacrel, blkno, buf, iter_result->offsets, + iter_result->num_offsets, vmbuffer); /* Now that we've vacuumed the page, record its available space */ page = BufferGetPage(buf); @@ -2464,6 +2155,7 @@ lazy_vacuum_heap_rel(LVRelState *vacrel) RecordPageWithFreeSpace(vacrel->rel, blkno, freespace); vacuumed_pages++; } + TidStoreEndIterate(iter); vacrel->blkno = InvalidBlockNumber; if (BufferIsValid(vmbuffer)) @@ -2473,14 +2165,14 @@ lazy_vacuum_heap_rel(LVRelState *vacrel) * We set all LP_DEAD items from the first heap pass to LP_UNUSED during * the second heap pass. No more, no less. */ - Assert(index > 0); Assert(vacrel->num_index_scans > 1 || - (index == vacrel->lpdead_items && + (vacrel->dead_items_info->num_items == vacrel->lpdead_items && vacuumed_pages == vacrel->lpdead_item_pages)); ereport(DEBUG2, (errmsg("table \"%s\": removed %lld dead item identifiers in %u pages", - vacrel->relname, (long long) index, vacuumed_pages))); + vacrel->relname, (long long) vacrel->dead_items_info->num_items, + vacuumed_pages))); /* Revert to the previous phase information for error traceback */ restore_vacuum_error_info(vacrel, &saved_err_info); @@ -2488,21 +2180,17 @@ lazy_vacuum_heap_rel(LVRelState *vacrel) /* * lazy_vacuum_heap_page() -- free page's LP_DEAD items listed in the - * vacrel->dead_items array. + * vacrel->dead_items store. * * Caller must have an exclusive buffer lock on the buffer (though a full * cleanup lock is also acceptable). vmbuffer must be valid and already have * a pin on blkno's visibility map page. - * - * index is an offset into the vacrel->dead_items array for the first listed - * LP_DEAD item on the page. The return value is the first index immediately - * after all LP_DEAD items for the same page in the array. */ -static int +static void lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, Buffer buffer, - int index, Buffer vmbuffer) + OffsetNumber *deadoffsets, int num_offsets, + Buffer vmbuffer) { - VacDeadItems *dead_items = vacrel->dead_items; Page page = BufferGetPage(buffer); OffsetNumber unused[MaxHeapTuplesPerPage]; int nunused = 0; @@ -2510,7 +2198,7 @@ lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, Buffer buffer, bool all_frozen; LVSavedErrInfo saved_err_info; - Assert(vacrel->nindexes == 0 || vacrel->do_index_vacuuming); + Assert(vacrel->do_index_vacuuming); pgstat_progress_update_param(PROGRESS_VACUUM_HEAP_BLKS_VACUUMED, blkno); @@ -2521,16 +2209,11 @@ lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, Buffer buffer, START_CRIT_SECTION(); - for (; index < dead_items->num_items; index++) + for (int i = 0; i < num_offsets; i++) { - BlockNumber tblk; - OffsetNumber toff; ItemId itemid; + OffsetNumber toff = deadoffsets[i]; - tblk = ItemPointerGetBlockNumber(&dead_items->items[index]); - if (tblk != blkno) - break; /* past end of tuples for this block */ - toff = ItemPointerGetOffsetNumber(&dead_items->items[index]); itemid = PageGetItemId(page, toff); Assert(ItemIdIsDead(itemid) && !ItemIdHasStorage(itemid)); @@ -2551,20 +2234,14 @@ lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, Buffer buffer, /* XLOG stuff */ if (RelationNeedsWAL(vacrel->rel)) { - xl_heap_vacuum xlrec; - XLogRecPtr recptr; - - xlrec.nunused = nunused; - - XLogBeginInsert(); - XLogRegisterData((char *) &xlrec, SizeOfHeapVacuum); - - XLogRegisterBuffer(0, buffer, REGBUF_STANDARD); - XLogRegisterBufData(0, (char *) unused, nunused * sizeof(OffsetNumber)); - - recptr = XLogInsert(RM_HEAP2_ID, XLOG_HEAP2_VACUUM); - - PageSetLSN(page, recptr); + log_heap_prune_and_freeze(vacrel->rel, buffer, + InvalidTransactionId, + false, /* no cleanup lock required */ + PRUNE_VACUUM_CLEANUP, + NULL, 0, /* frozen */ + NULL, 0, /* redirected */ + NULL, 0, /* dead */ + unused, nunused); } /* @@ -2600,7 +2277,6 @@ lazy_vacuum_heap_page(LVRelState *vacrel, BlockNumber blkno, Buffer buffer, /* Revert to the previous phase information for error traceback */ restore_vacuum_error_info(vacrel, &saved_err_info); - return index; } /* @@ -2624,6 +2300,12 @@ lazy_check_wraparound_failsafe(LVRelState *vacrel) if (unlikely(vacuum_xid_failsafe_check(&vacrel->cutoffs))) { + const int progress_index[] = { + PROGRESS_VACUUM_INDEXES_TOTAL, + PROGRESS_VACUUM_INDEXES_PROCESSED + }; + int64 progress_val[2] = {0, 0}; + VacuumFailsafeActive = true; /* @@ -2638,6 +2320,9 @@ lazy_check_wraparound_failsafe(LVRelState *vacrel) vacrel->do_index_cleanup = false; vacrel->do_rel_truncate = false; + /* Reset the progress counters */ + pgstat_progress_update_multi_param(2, progress_index, progress_val); + ereport(WARNING, (errmsg("bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans", vacrel->dbname, vacrel->relnamespace, vacrel->relname, @@ -2664,13 +2349,27 @@ lazy_cleanup_all_indexes(LVRelState *vacrel) { double reltuples = vacrel->new_rel_tuples; bool estimated_count = vacrel->scanned_pages < vacrel->rel_pages; + const int progress_start_index[] = { + PROGRESS_VACUUM_PHASE, + PROGRESS_VACUUM_INDEXES_TOTAL + }; + const int progress_end_index[] = { + PROGRESS_VACUUM_INDEXES_TOTAL, + PROGRESS_VACUUM_INDEXES_PROCESSED + }; + int64 progress_start_val[2]; + int64 progress_end_val[2] = {0, 0}; Assert(vacrel->do_index_cleanup); Assert(vacrel->nindexes > 0); - /* Report that we are now cleaning up indexes */ - pgstat_progress_update_param(PROGRESS_VACUUM_PHASE, - PROGRESS_VACUUM_PHASE_INDEX_CLEANUP); + /* + * Report that we are now cleaning up indexes and the number of indexes to + * cleanup. + */ + progress_start_val[0] = PROGRESS_VACUUM_PHASE_INDEX_CLEANUP; + progress_start_val[1] = vacrel->nindexes; + pgstat_progress_update_multi_param(2, progress_start_index, progress_start_val); if (!ParallelVacuumIsActive(vacrel)) { @@ -2682,6 +2381,10 @@ lazy_cleanup_all_indexes(LVRelState *vacrel) vacrel->indstats[idx] = lazy_cleanup_one_index(indrel, istat, reltuples, estimated_count, vacrel); + + /* Report the number of indexes cleaned up */ + pgstat_progress_update_param(PROGRESS_VACUUM_INDEXES_PROCESSED, + idx + 1); } } else @@ -2691,14 +2394,17 @@ lazy_cleanup_all_indexes(LVRelState *vacrel) vacrel->num_index_scans, estimated_count); } + + /* Reset the progress counters */ + pgstat_progress_update_multi_param(2, progress_end_index, progress_end_val); } /* * lazy_vacuum_one_index() -- vacuum index relation. * * Delete all the index tuples containing a TID collected in - * vacrel->dead_items array. Also update running statistics. - * Exact details depend on index AM's ambulkdelete routine. + * vacrel->dead_items. Also update running statistics. Exact + * details depend on index AM's ambulkdelete routine. * * reltuples is the number of heap tuples to be passed to the * bulkdelete callback. It's always assumed to be estimated. @@ -2735,7 +2441,8 @@ lazy_vacuum_one_index(Relation indrel, IndexBulkDeleteResult *istat, InvalidBlockNumber, InvalidOffsetNumber); /* Do bulk deletion */ - istat = vac_bulkdel_one_index(&ivinfo, istat, (void *) vacrel->dead_items); + istat = vac_bulkdel_one_index(&ivinfo, istat, (void *) vacrel->dead_items, + vacrel->dead_items_info); /* Revert to the previous phase information for error traceback */ restore_vacuum_error_info(vacrel, &saved_err_info); @@ -2813,18 +2520,13 @@ lazy_cleanup_one_index(Relation indrel, IndexBulkDeleteResult *istat, * in effect in any case. lazy_scan_prune makes the optimistic assumption * that any LP_DEAD items it encounters will always be LP_UNUSED by the time * we're called. - * - * Also don't attempt it if we are doing early pruning/vacuuming, because a - * scan which cannot find a truncated heap page cannot determine that the - * snapshot is too old to read that page. */ static bool should_attempt_truncation(LVRelState *vacrel) { BlockNumber possibly_freeable; - if (!vacrel->do_rel_truncate || VacuumFailsafeActive || - old_snapshot_threshold >= 0) + if (!vacrel->do_rel_truncate || VacuumFailsafeActive) return false; possibly_freeable = vacrel->rel_pages - vacrel->nonempty_pages; @@ -3106,48 +2808,8 @@ count_nondeletable_pages(LVRelState *vacrel, bool *lock_waiter_detected) } /* - * Returns the number of dead TIDs that VACUUM should allocate space to - * store, given a heap rel of size vacrel->rel_pages, and given current - * maintenance_work_mem setting (or current autovacuum_work_mem setting, - * when applicable). - * - * See the comments at the head of this file for rationale. - */ -static int -dead_items_max_items(LVRelState *vacrel) -{ - int64 max_items; - int vac_work_mem = IsAutoVacuumWorkerProcess() && - autovacuum_work_mem != -1 ? - autovacuum_work_mem : maintenance_work_mem; - - if (vacrel->nindexes > 0) - { - BlockNumber rel_pages = vacrel->rel_pages; - - max_items = MAXDEADITEMS(vac_work_mem * 1024L); - max_items = Min(max_items, INT_MAX); - max_items = Min(max_items, MAXDEADITEMS(MaxAllocSize)); - - /* curious coding here to ensure the multiplication can't overflow */ - if ((BlockNumber) (max_items / MaxHeapTuplesPerPage) > rel_pages) - max_items = rel_pages * MaxHeapTuplesPerPage; - - /* stay sane if small maintenance_work_mem */ - max_items = Max(max_items, MaxHeapTuplesPerPage); - } - else - { - /* One-pass case only stores a single heap page's TIDs at a time */ - max_items = MaxHeapTuplesPerPage; - } - - return (int) max_items; -} - -/* - * Allocate dead_items (either using palloc, or in dynamic shared memory). - * Sets dead_items in vacrel for caller. + * Allocate dead_items and dead_items_info (either using palloc, or in dynamic + * shared memory). Sets both in vacrel for caller. * * Also handles parallel initialization as part of allocating dead_items in * DSM when required. @@ -3155,11 +2817,10 @@ dead_items_max_items(LVRelState *vacrel) static void dead_items_alloc(LVRelState *vacrel, int nworkers) { - VacDeadItems *dead_items; - int max_items; - - max_items = dead_items_max_items(vacrel); - Assert(max_items >= MaxHeapTuplesPerPage); + VacDeadItemsInfo *dead_items_info; + int vac_work_mem = AmAutoVacuumWorkerProcess() && + autovacuum_work_mem != -1 ? + autovacuum_work_mem : maintenance_work_mem; /* * Initialize state for a parallel vacuum. As of now, only one worker can @@ -3186,24 +2847,75 @@ dead_items_alloc(LVRelState *vacrel, int nworkers) else vacrel->pvs = parallel_vacuum_init(vacrel->rel, vacrel->indrels, vacrel->nindexes, nworkers, - max_items, + vac_work_mem, vacrel->verbose ? INFO : DEBUG2, vacrel->bstrategy); - /* If parallel mode started, dead_items space is allocated in DSM */ + /* + * If parallel mode started, dead_items and dead_items_info spaces are + * allocated in DSM. + */ if (ParallelVacuumIsActive(vacrel)) { - vacrel->dead_items = parallel_vacuum_get_dead_items(vacrel->pvs); + vacrel->dead_items = parallel_vacuum_get_dead_items(vacrel->pvs, + &vacrel->dead_items_info); return; } } - /* Serial VACUUM case */ - dead_items = (VacDeadItems *) palloc(vac_max_items_to_alloc_size(max_items)); - dead_items->max_items = max_items; - dead_items->num_items = 0; + /* + * Serial VACUUM case. Allocate both dead_items and dead_items_info + * locally. + */ + + dead_items_info = (VacDeadItemsInfo *) palloc(sizeof(VacDeadItemsInfo)); + dead_items_info->max_bytes = vac_work_mem * 1024L; + dead_items_info->num_items = 0; + vacrel->dead_items_info = dead_items_info; + + vacrel->dead_items = TidStoreCreateLocal(dead_items_info->max_bytes, true); +} + +/* + * Add the given block number and offset numbers to dead_items. + */ +static void +dead_items_add(LVRelState *vacrel, BlockNumber blkno, OffsetNumber *offsets, + int num_offsets) +{ + const int prog_index[2] = { + PROGRESS_VACUUM_NUM_DEAD_ITEM_IDS, + PROGRESS_VACUUM_DEAD_TUPLE_BYTES + }; + int64 prog_val[2]; + + TidStoreSetBlockOffsets(vacrel->dead_items, blkno, offsets, num_offsets); + vacrel->dead_items_info->num_items += num_offsets; + + /* update the progress information */ + prog_val[0] = vacrel->dead_items_info->num_items; + prog_val[1] = TidStoreMemoryUsage(vacrel->dead_items); + pgstat_progress_update_multi_param(2, prog_index, prog_val); +} + +/* + * Forget all collected dead items. + */ +static void +dead_items_reset(LVRelState *vacrel) +{ + if (ParallelVacuumIsActive(vacrel)) + { + parallel_vacuum_reset_dead_items(vacrel->pvs); + return; + } + + /* Recreate the tidstore with the same max_bytes limitation */ + TidStoreDestroy(vacrel->dead_items); + vacrel->dead_items = TidStoreCreateLocal(vacrel->dead_items_info->max_bytes, true); - vacrel->dead_items = dead_items; + /* Reset the counter */ + vacrel->dead_items_info->num_items = 0; } /* diff --git a/src/backend/access/heap/visibilitymap.c b/src/backend/access/heap/visibilitymap.c index 7d54ec9c0f71c..8b24e7bc33cf6 100644 --- a/src/backend/access/heap/visibilitymap.c +++ b/src/backend/access/heap/visibilitymap.c @@ -3,7 +3,7 @@ * visibilitymap.c * bitmap for tracking visibility of heap tuples * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -93,9 +93,9 @@ #include "miscadmin.h" #include "port/pg_bitutils.h" #include "storage/bufmgr.h" -#include "storage/lmgr.h" #include "storage/smgr.h" #include "utils/inval.h" +#include "utils/rel.h" /*#define TRACE_VISIBILITYMAP */ @@ -119,10 +119,8 @@ #define HEAPBLK_TO_OFFSET(x) (((x) % HEAPBLOCKS_PER_BYTE) * BITS_PER_HEAPBLOCK) /* Masks for counting subsets of bits in the visibility map. */ -#define VISIBLE_MASK64 UINT64CONST(0x5555555555555555) /* The lower bit of each - * bit pair */ -#define FROZEN_MASK64 UINT64CONST(0xaaaaaaaaaaaaaaaa) /* The upper bit of each - * bit pair */ +#define VISIBLE_MASK8 (0x55) /* The lower bit of each bit pair */ +#define FROZEN_MASK8 (0xaa) /* The upper bit of each bit pair */ /* prototypes for internal routines */ static Buffer vm_readbuf(Relation rel, BlockNumber blkno, bool extend); @@ -396,7 +394,6 @@ visibilitymap_count(Relation rel, BlockNumber *all_visible, BlockNumber *all_fro { Buffer mapBuffer; uint64 *map; - int i; /* * Read till we fall off the end of the map. We assume that any extra @@ -414,21 +411,9 @@ visibilitymap_count(Relation rel, BlockNumber *all_visible, BlockNumber *all_fro */ map = (uint64 *) PageGetContents(BufferGetPage(mapBuffer)); - StaticAssertStmt(MAPSIZE % sizeof(uint64) == 0, - "unsupported MAPSIZE"); - if (all_frozen == NULL) - { - for (i = 0; i < MAPSIZE / sizeof(uint64); i++) - nvisible += pg_popcount64(map[i] & VISIBLE_MASK64); - } - else - { - for (i = 0; i < MAPSIZE / sizeof(uint64); i++) - { - nvisible += pg_popcount64(map[i] & VISIBLE_MASK64); - nfrozen += pg_popcount64(map[i] & FROZEN_MASK64); - } - } + nvisible += pg_popcount_masked((const char *) map, MAPSIZE, VISIBLE_MASK8); + if (all_frozen) + nfrozen += pg_popcount_masked((const char *) map, MAPSIZE, FROZEN_MASK8); ReleaseBuffer(mapBuffer); } @@ -628,7 +613,7 @@ vm_extend(Relation rel, BlockNumber vm_nblocks) { Buffer buf; - buf = ExtendBufferedRelTo(EB_REL(rel), VISIBILITYMAP_FORKNUM, NULL, + buf = ExtendBufferedRelTo(BMR_REL(rel), VISIBILITYMAP_FORKNUM, NULL, EB_CREATE_FORK_IF_NEEDED | EB_CLEAR_SIZE_CACHE, vm_nblocks, diff --git a/src/backend/access/index/amapi.c b/src/backend/access/index/amapi.c index 8b02cdbe82539..079fb7cba65ef 100644 --- a/src/backend/access/index/amapi.c +++ b/src/backend/access/index/amapi.c @@ -3,7 +3,7 @@ * amapi.c * Support routines for API for Postgres index access methods. * - * Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Copyright (c) 2015-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -17,7 +17,7 @@ #include "access/htup_details.h" #include "catalog/pg_am.h" #include "catalog/pg_opclass.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/syscache.h" diff --git a/src/backend/access/index/amvalidate.c b/src/backend/access/index/amvalidate.c index 5c2d77e908536..32bb477f3283c 100644 --- a/src/backend/access/index/amvalidate.c +++ b/src/backend/access/index/amvalidate.c @@ -4,7 +4,7 @@ * Support routines for index access methods' amvalidate and * amadjustmembers functions. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/access/index/genam.c b/src/backend/access/index/genam.c index 722927aebabc3..b123acc5a6091 100644 --- a/src/backend/access/index/genam.c +++ b/src/backend/access/index/genam.c @@ -3,7 +3,7 @@ * genam.c * general index access method routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -30,13 +30,12 @@ #include "storage/bufmgr.h" #include "storage/procarray.h" #include "utils/acl.h" -#include "utils/builtins.h" +#include "utils/injection_point.h" #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/rls.h" #include "utils/ruleutils.h" #include "utils/snapmgr.h" -#include "utils/syscache.h" /* ---------------------------------------------------------------- @@ -175,7 +174,7 @@ IndexScanEnd(IndexScanDesc scan) */ char * BuildIndexValueDescription(Relation indexRelation, - Datum *values, bool *isnull) + const Datum *values, const bool *isnull) { StringInfoData buf; Form_pg_index idxrec; @@ -653,8 +652,10 @@ systable_beginscan_ordered(Relation heapRelation, /* REINDEX can probably be a hard error here ... */ if (ReindexIsProcessingIndex(RelationGetRelid(indexRelation))) - elog(ERROR, "cannot do ordered scan on index \"%s\", because it is being reindexed", - RelationGetRelationName(indexRelation)); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot access index \"%s\" while it is being reindexed", + RelationGetRelationName(indexRelation)))); /* ... but we only throw a warning about violating IgnoreSystemIndexes */ if (IgnoreSystemIndexes) elog(WARNING, "using index \"%s\" despite IgnoreSystemIndexes", @@ -701,6 +702,14 @@ systable_beginscan_ordered(Relation heapRelation, index_rescan(sysscan->iscan, key, nkeys, NULL, 0); sysscan->scan = NULL; + /* + * If CheckXidAlive is set then set a flag to indicate that system table + * scan is in-progress. See detailed comments in xact.c where these + * variables are declared. + */ + if (TransactionIdIsValid(CheckXidAlive)) + bsysscan = true; + return sysscan; } @@ -745,5 +754,150 @@ systable_endscan_ordered(SysScanDesc sysscan) index_endscan(sysscan->iscan); if (sysscan->snapshot) UnregisterSnapshot(sysscan->snapshot); + + /* + * Reset the bsysscan flag at the end of the systable scan. See detailed + * comments in xact.c where these variables are declared. + */ + if (TransactionIdIsValid(CheckXidAlive)) + bsysscan = false; + pfree(sysscan); } + +/* + * systable_inplace_update_begin --- update a row "in place" (overwrite it) + * + * Overwriting violates both MVCC and transactional safety, so the uses of + * this function in Postgres are extremely limited. Nonetheless we find some + * places to use it. See README.tuplock section "Locking to write + * inplace-updated tables" and later sections for expectations of readers and + * writers of a table that gets inplace updates. Standard flow: + * + * ... [any slow preparation not requiring oldtup] ... + * systable_inplace_update_begin([...], &tup, &inplace_state); + * if (!HeapTupleIsValid(tup)) + * elog(ERROR, [...]); + * ... [buffer is exclusive-locked; mutate "tup"] ... + * if (dirty) + * systable_inplace_update_finish(inplace_state, tup); + * else + * systable_inplace_update_cancel(inplace_state); + * + * The first several params duplicate the systable_beginscan() param list. + * "oldtupcopy" is an output parameter, assigned NULL if the key ceases to + * find a live tuple. (In PROC_IN_VACUUM, that is a low-probability transient + * condition.) If "oldtupcopy" gets non-NULL, you must pass output parameter + * "state" to systable_inplace_update_finish() or + * systable_inplace_update_cancel(). + */ +void +systable_inplace_update_begin(Relation relation, + Oid indexId, + bool indexOK, + Snapshot snapshot, + int nkeys, const ScanKeyData *key, + HeapTuple *oldtupcopy, + void **state) +{ + ScanKey mutable_key = palloc(sizeof(ScanKeyData) * nkeys); + int retries = 0; + SysScanDesc scan; + HeapTuple oldtup; + BufferHeapTupleTableSlot *bslot; + + /* + * For now, we don't allow parallel updates. Unlike a regular update, + * this should never create a combo CID, so it might be possible to relax + * this restriction, but not without more thought and testing. It's not + * clear that it would be useful, anyway. + */ + if (IsInParallelMode()) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TRANSACTION_STATE), + errmsg("cannot update tuples during a parallel operation"))); + + /* + * Accept a snapshot argument, for symmetry, but this function advances + * its snapshot as needed to reach the tail of the updated tuple chain. + */ + Assert(snapshot == NULL); + + Assert(IsInplaceUpdateRelation(relation) || !IsSystemRelation(relation)); + + /* Loop for an exclusive-locked buffer of a non-updated tuple. */ + do + { + TupleTableSlot *slot; + + CHECK_FOR_INTERRUPTS(); + + /* + * Processes issuing heap_update (e.g. GRANT) at maximum speed could + * drive us to this error. A hostile table owner has stronger ways to + * damage their own table, so that's minor. + */ + if (retries++ > 10000) + elog(ERROR, "giving up after too many tries to overwrite row"); + + memcpy(mutable_key, key, sizeof(ScanKeyData) * nkeys); + INJECTION_POINT("inplace-before-pin"); + scan = systable_beginscan(relation, indexId, indexOK, snapshot, + nkeys, mutable_key); + oldtup = systable_getnext(scan); + if (!HeapTupleIsValid(oldtup)) + { + systable_endscan(scan); + *oldtupcopy = NULL; + return; + } + + slot = scan->slot; + Assert(TTS_IS_BUFFERTUPLE(slot)); + bslot = (BufferHeapTupleTableSlot *) slot; + } while (!heap_inplace_lock(scan->heap_rel, + bslot->base.tuple, bslot->buffer, + (void (*) (void *)) systable_endscan, scan)); + + *oldtupcopy = heap_copytuple(oldtup); + *state = scan; +} + +/* + * systable_inplace_update_finish --- second phase of inplace update + * + * The tuple cannot change size, and therefore its header fields and null + * bitmap (if any) don't change either. + */ +void +systable_inplace_update_finish(void *state, HeapTuple tuple) +{ + SysScanDesc scan = (SysScanDesc) state; + Relation relation = scan->heap_rel; + TupleTableSlot *slot = scan->slot; + BufferHeapTupleTableSlot *bslot = (BufferHeapTupleTableSlot *) slot; + HeapTuple oldtup = bslot->base.tuple; + Buffer buffer = bslot->buffer; + + heap_inplace_update_and_unlock(relation, oldtup, tuple, buffer); + systable_endscan(scan); +} + +/* + * systable_inplace_update_cancel --- abandon inplace update + * + * This is an alternative to making a no-op update. + */ +void +systable_inplace_update_cancel(void *state) +{ + SysScanDesc scan = (SysScanDesc) state; + Relation relation = scan->heap_rel; + TupleTableSlot *slot = scan->slot; + BufferHeapTupleTableSlot *bslot = (BufferHeapTupleTableSlot *) slot; + HeapTuple oldtup = bslot->base.tuple; + Buffer buffer = bslot->buffer; + + heap_inplace_unlock(relation, oldtup, buffer); + systable_endscan(scan); +} diff --git a/src/backend/access/index/indexam.c b/src/backend/access/index/indexam.c index b25b03f7abc32..dcd04b813d8d9 100644 --- a/src/backend/access/index/indexam.c +++ b/src/backend/access/index/indexam.c @@ -3,7 +3,7 @@ * indexam.c * general index access method routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -44,19 +44,14 @@ #include "postgres.h" #include "access/amapi.h" -#include "access/heapam.h" +#include "access/relation.h" #include "access/reloptions.h" #include "access/relscan.h" #include "access/tableam.h" -#include "access/transam.h" -#include "access/xlog.h" #include "catalog/index.h" -#include "catalog/pg_amproc.h" #include "catalog/pg_type.h" -#include "commands/defrem.h" -#include "nodes/makefuncs.h" +#include "nodes/execnodes.h" #include "pgstat.h" -#include "storage/bufmgr.h" #include "storage/lmgr.h" #include "storage/predicate.h" #include "utils/ruleutils.h" @@ -70,18 +65,23 @@ * Note: the ReindexIsProcessingIndex() check in RELATION_CHECKS is there * to check that we don't try to scan or do retail insertions into an index * that is currently being rebuilt or pending rebuild. This helps to catch - * things that don't work when reindexing system catalogs. The assertion + * things that don't work when reindexing system catalogs, as well as prevent + * user errors like index expressions that access their own tables. The check * doesn't prevent the actual rebuild because we don't use RELATION_CHECKS * when calling the index AM's ambuild routine, and there is no reason for * ambuild to call its subsidiary routines through this file. * ---------------------------------------------------------------- */ #define RELATION_CHECKS \ -( \ - AssertMacro(RelationIsValid(indexRelation)), \ - AssertMacro(PointerIsValid(indexRelation->rd_indam)), \ - AssertMacro(!ReindexIsProcessingIndex(RelationGetRelid(indexRelation))) \ -) +do { \ + Assert(RelationIsValid(indexRelation)); \ + Assert(PointerIsValid(indexRelation->rd_indam)); \ + if (unlikely(ReindexIsProcessingIndex(RelationGetRelid(indexRelation)))) \ + ereport(ERROR, \ + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), \ + errmsg("cannot access index \"%s\" while it is being reindexed", \ + RelationGetRelationName(indexRelation)))); \ +} while(0) #define SCAN_CHECKS \ ( \ @@ -107,6 +107,7 @@ do { \ static IndexScanDesc index_beginscan_internal(Relation indexRelation, int nkeys, int norderbys, Snapshot snapshot, ParallelIndexScanDesc pscan, bool temp_snap); +static inline void validate_relation_kind(Relation r); /* ---------------------------------------------------------------- @@ -135,12 +136,30 @@ index_open(Oid relationId, LOCKMODE lockmode) r = relation_open(relationId, lockmode); - if (r->rd_rel->relkind != RELKIND_INDEX && - r->rd_rel->relkind != RELKIND_PARTITIONED_INDEX) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not an index", - RelationGetRelationName(r)))); + validate_relation_kind(r); + + return r; +} + +/* ---------------- + * try_index_open - open an index relation by relation OID + * + * Same as index_open, except return NULL instead of failing + * if the relation does not exist. + * ---------------- + */ +Relation +try_index_open(Oid relationId, LOCKMODE lockmode) +{ + Relation r; + + r = try_relation_open(relationId, lockmode); + + /* leave if index does not exist */ + if (!r) + return NULL; + + validate_relation_kind(r); return r; } @@ -168,6 +187,24 @@ index_close(Relation relation, LOCKMODE lockmode) UnlockRelationId(&relid, lockmode); } +/* ---------------- + * validate_relation_kind - check the relation's kind + * + * Make sure relkind is an index or a partitioned index. + * ---------------- + */ +static inline void +validate_relation_kind(Relation r) +{ + if (r->rd_rel->relkind != RELKIND_INDEX && + r->rd_rel->relkind != RELKIND_PARTITIONED_INDEX) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not an index", + RelationGetRelationName(r)))); +} + + /* ---------------- * index_insert - insert an index tuple into a relation * ---------------- @@ -196,6 +233,20 @@ index_insert(Relation indexRelation, indexInfo); } +/* ------------------------- + * index_insert_cleanup - clean up after all index inserts are done + * ------------------------- + */ +void +index_insert_cleanup(Relation indexRelation, + IndexInfo *indexInfo) +{ + RELATION_CHECKS; + + if (indexRelation->rd_indam->aminsertcleanup) + indexRelation->rd_indam->aminsertcleanup(indexRelation, indexInfo); +} + /* * index_beginscan - start a scan of an index with amgettuple * @@ -397,13 +448,10 @@ index_restrpos(IndexScanDesc scan) /* * index_parallelscan_estimate - estimate shared memory for parallel scan - * - * Currently, we don't pass any information to the AM-specific estimator, - * so it can probably only return a constant. In the future, we might need - * to pass more information. */ Size -index_parallelscan_estimate(Relation indexRelation, Snapshot snapshot) +index_parallelscan_estimate(Relation indexRelation, int nkeys, int norderbys, + Snapshot snapshot) { Size nbytes; @@ -422,7 +470,8 @@ index_parallelscan_estimate(Relation indexRelation, Snapshot snapshot) */ if (indexRelation->rd_indam->amestimateparallelscan != NULL) nbytes = add_size(nbytes, - indexRelation->rd_indam->amestimateparallelscan()); + indexRelation->rd_indam->amestimateparallelscan(nkeys, + norderbys)); return nbytes; } diff --git a/src/backend/access/index/meson.build b/src/backend/access/index/meson.build index 7cd536dc35415..641b5bd0c272e 100644 --- a/src/backend/access/index/meson.build +++ b/src/backend/access/index/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'amapi.c', diff --git a/src/backend/access/meson.build b/src/backend/access/meson.build index aa99c4d162204..62a371db7f75c 100644 --- a/src/backend/access/meson.build +++ b/src/backend/access/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group subdir('brin') subdir('common') @@ -9,6 +9,7 @@ subdir('heap') subdir('index') subdir('nbtree') subdir('rmgrdesc') +subdir('sequence') subdir('spgist') subdir('table') subdir('tablesample') diff --git a/src/backend/access/nbtree/meson.build b/src/backend/access/nbtree/meson.build index e8cbb97a11893..232f64b9447d8 100644 --- a/src/backend/access/nbtree/meson.build +++ b/src/backend/access/nbtree/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'nbtcompare.c', diff --git a/src/backend/access/nbtree/nbtcompare.c b/src/backend/access/nbtree/nbtcompare.c index 976a2cc644749..1c72867c84e5e 100644 --- a/src/backend/access/nbtree/nbtcompare.c +++ b/src/backend/access/nbtree/nbtcompare.c @@ -3,7 +3,7 @@ * nbtcompare.c * Comparison functions for btree access method. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -57,7 +57,7 @@ #include -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/sortsupport.h" #ifdef STRESS_SORT_INT_MIN diff --git a/src/backend/access/nbtree/nbtdedup.c b/src/backend/access/nbtree/nbtdedup.c index d4db0b28f28e0..456d86b51c95d 100644 --- a/src/backend/access/nbtree/nbtdedup.c +++ b/src/backend/access/nbtree/nbtdedup.c @@ -3,7 +3,7 @@ * nbtdedup.c * Deduplicate or bottom-up delete items in Postgres btrees. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c index d33f814a938ac..7e8902e48cde7 100644 --- a/src/backend/access/nbtree/nbtinsert.c +++ b/src/backend/access/nbtree/nbtinsert.c @@ -3,7 +3,7 @@ * nbtinsert.c * Item insertion in Lehman and Yao btrees for Postgres. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,12 +19,12 @@ #include "access/nbtxlog.h" #include "access/transam.h" #include "access/xloginsert.h" +#include "common/int.h" #include "common/pg_prng.h" #include "lib/qunique.h" #include "miscadmin.h" #include "storage/lmgr.h" #include "storage/predicate.h" -#include "storage/smgr.h" /* Minimum tree height for application of fastpath optimization */ #define BTREE_FASTPATH_MIN_LEVEL 2 @@ -378,7 +378,7 @@ _bt_search_insert(Relation rel, Relation heaprel, BTInsertState insertstate) /* Cannot use optimization -- descend tree, return proper descent stack */ return _bt_search(rel, heaprel, insertstate->itup_key, &insertstate->buf, - BT_WRITE, NULL); + BT_WRITE); } /* @@ -2165,7 +2165,7 @@ _bt_insert_parent(Relation rel, BlockNumberIsValid(RelationGetTargetBlock(rel)))); /* Find the leftmost page at the next level up */ - pbuf = _bt_get_endpoint(rel, opaque->btpo_level + 1, false, NULL); + pbuf = _bt_get_endpoint(rel, opaque->btpo_level + 1, false); /* Set up a phony stack entry pointing there */ stack = &fakestack; stack->bts_blkno = BufferGetBlockNumber(pbuf); @@ -3013,10 +3013,5 @@ _bt_blk_cmp(const void *arg1, const void *arg2) BlockNumber b1 = *((BlockNumber *) arg1); BlockNumber b2 = *((BlockNumber *) arg2); - if (b1 < b2) - return -1; - else if (b1 > b2) - return 1; - - return 0; + return pg_cmp_u32(b1, b2); } diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index d78971bfe8867..01bbece6bfd9d 100644 --- a/src/backend/access/nbtree/nbtpage.c +++ b/src/backend/access/nbtree/nbtpage.c @@ -4,7 +4,7 @@ * BTree-specific page management code for the Postgres btree access * method. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -28,9 +28,9 @@ #include "access/transam.h" #include "access/xlog.h" #include "access/xloginsert.h" +#include "common/int.h" #include "miscadmin.h" #include "storage/indexfsm.h" -#include "storage/lmgr.h" #include "storage/predicate.h" #include "storage/procarray.h" #include "utils/memdebug.h" @@ -975,7 +975,7 @@ _bt_allocbuf(Relation rel, Relation heaprel) * otherwise would make, as we can't use _bt_lockbuf() without introducing * a race. */ - buf = ExtendBufferedRel(EB_REL(rel), MAIN_FORKNUM, NULL, EB_LOCK_FIRST); + buf = ExtendBufferedRel(BMR_REL(rel), MAIN_FORKNUM, NULL, EB_LOCK_FIRST); if (!RelationUsesLocalBuffers(rel)) VALGRIND_MAKE_MEM_DEFINED(BufferGetPage(buf), BLCKSZ); @@ -1466,14 +1466,9 @@ _bt_delitems_cmp(const void *a, const void *b) TM_IndexDelete *indexdelete1 = (TM_IndexDelete *) a; TM_IndexDelete *indexdelete2 = (TM_IndexDelete *) b; - if (indexdelete1->id > indexdelete2->id) - return 1; - if (indexdelete1->id < indexdelete2->id) - return -1; + Assert(indexdelete1->id != indexdelete2->id); - Assert(false); - - return 0; + return pg_cmp_s16(indexdelete1->id, indexdelete2->id); } /* @@ -1958,12 +1953,21 @@ _bt_pagedel(Relation rel, Buffer leafbuf, BTVacState *vstate) return; } - /* we need an insertion scan key for the search, so build one */ + /* + * We need an insertion scan key, so build one. + * + * _bt_search searches for the leaf page that contains any + * matching non-pivot tuples, but we need it to "search" for + * the high key pivot from the page that we're set to delete. + * Compensate for the mismatch by having _bt_search locate the + * last position < equal-to-untruncated-prefix non-pivots. + */ itup_key = _bt_mkscankey(rel, targetkey); - /* find the leftmost leaf page with matching pivot/high key */ - itup_key->pivotsearch = true; - stack = _bt_search(rel, NULL, itup_key, &sleafbuf, BT_READ, - NULL); + + /* Set up a BTLessStrategyNumber-like insertion scan key */ + itup_key->nextkey = false; + itup_key->backward = true; + stack = _bt_search(rel, NULL, itup_key, &sleafbuf, BT_READ); /* won't need a second lock or pin on leafbuf */ _bt_relbuf(rel, sleafbuf); diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c index 4553aaee53187..59155a7bea69d 100644 --- a/src/backend/access/nbtree/nbtree.c +++ b/src/backend/access/nbtree/nbtree.c @@ -8,7 +8,7 @@ * This file contains only the public interface routines. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -19,22 +19,20 @@ #include "postgres.h" #include "access/nbtree.h" -#include "access/nbtxlog.h" #include "access/relscan.h" -#include "access/xlog.h" #include "access/xloginsert.h" #include "commands/progress.h" #include "commands/vacuum.h" #include "miscadmin.h" #include "nodes/execnodes.h" #include "pgstat.h" -#include "postmaster/autovacuum.h" +#include "storage/bulk_write.h" #include "storage/condition_variable.h" #include "storage/indexfsm.h" #include "storage/ipc.h" #include "storage/lmgr.h" #include "storage/smgr.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/index_selfuncs.h" #include "utils/memutils.h" @@ -42,6 +40,9 @@ /* * BTPARALLEL_NOT_INITIALIZED indicates that the scan has not started. * + * BTPARALLEL_NEED_PRIMSCAN indicates that some process must now seize the + * scan to advance it via another call to _bt_first. + * * BTPARALLEL_ADVANCING indicates that some process is advancing the scan to * a new page; others must wait. * @@ -49,14 +50,14 @@ * to a new page; some process can start doing that. * * BTPARALLEL_DONE indicates that the scan is complete (including error exit). - * We reach this state once for every distinct combination of array keys. */ typedef enum { BTPARALLEL_NOT_INITIALIZED, + BTPARALLEL_NEED_PRIMSCAN, BTPARALLEL_ADVANCING, BTPARALLEL_IDLE, - BTPARALLEL_DONE + BTPARALLEL_DONE, } BTPS_State; /* @@ -69,10 +70,14 @@ typedef struct BTParallelScanDescData BTPS_State btps_pageStatus; /* indicates whether next page is * available for scan. see above for * possible states of parallel scan. */ - int btps_arrayKeyCount; /* count indicating number of array scan - * keys processed by parallel scan */ - slock_t btps_mutex; /* protects above variables */ + slock_t btps_mutex; /* protects above variables, btps_arrElems */ ConditionVariable btps_cv; /* used to synchronize parallel scan */ + + /* + * btps_arrElems is used when scans need to schedule another primitive + * index scan. Holds BTArrayKeyInfo.cur_elem offsets for scan keys. + */ + int btps_arrElems[FLEXIBLE_ARRAY_MEMBER]; } BTParallelScanDescData; typedef struct BTParallelScanDescData *BTParallelScanDesc; @@ -112,6 +117,7 @@ bthandler(PG_FUNCTION_ARGS) amroutine->amclusterable = true; amroutine->ampredlocks = true; amroutine->amcanparallel = true; + amroutine->amcanbuildparallel = true; amroutine->amcaninclude = true; amroutine->amusemaintenanceworkmem = false; amroutine->amsummarizing = false; @@ -122,6 +128,7 @@ bthandler(PG_FUNCTION_ARGS) amroutine->ambuild = btbuild; amroutine->ambuildempty = btbuildempty; amroutine->aminsert = btinsert; + amroutine->aminsertcleanup = NULL; amroutine->ambulkdelete = btbulkdelete; amroutine->amvacuumcleanup = btvacuumcleanup; amroutine->amcanreturn = btcanreturn; @@ -151,31 +158,18 @@ bthandler(PG_FUNCTION_ARGS) void btbuildempty(Relation index) { - Page metapage; + bool allequalimage = _bt_allequalimage(index, false); + BulkWriteState *bulkstate; + BulkWriteBuffer metabuf; - /* Construct metapage. */ - metapage = (Page) palloc_aligned(BLCKSZ, PG_IO_ALIGN_SIZE, 0); - _bt_initmetapage(metapage, P_NONE, 0, _bt_allequalimage(index, false)); + bulkstate = smgr_bulk_start_rel(index, INIT_FORKNUM); - /* - * Write the page and log it. It might seem that an immediate sync would - * be sufficient to guarantee that the file exists on disk, but recovery - * itself might remove it while replaying, for example, an - * XLOG_DBASE_CREATE* or XLOG_TBLSPC_CREATE record. Therefore, we need - * this even when wal_level=minimal. - */ - PageSetChecksumInplace(metapage, BTREE_METAPAGE); - smgrwrite(RelationGetSmgr(index), INIT_FORKNUM, BTREE_METAPAGE, - metapage, true); - log_newpage(&RelationGetSmgr(index)->smgr_rlocator.locator, INIT_FORKNUM, - BTREE_METAPAGE, metapage, true); + /* Construct metapage. */ + metabuf = smgr_bulk_get_buf(bulkstate); + _bt_initmetapage((Page) metabuf, P_NONE, 0, allequalimage); + smgr_bulk_write(bulkstate, BTREE_METAPAGE, metabuf, true); - /* - * An immediate sync is required even if we xlog'd the page, because the - * write did not go through shared_buffers and therefore a concurrent - * checkpoint may have moved the redo pointer past our xlog record. - */ - smgrimmedsync(RelationGetSmgr(index), INIT_FORKNUM); + smgr_bulk_finish(bulkstate); } /* @@ -217,21 +211,7 @@ btgettuple(IndexScanDesc scan, ScanDirection dir) /* btree indexes are never lossy */ scan->xs_recheck = false; - /* - * If we have any array keys, initialize them during first call for a - * scan. We can't do this in btrescan because we don't know the scan - * direction at that time. - */ - if (so->numArrayKeys && !BTScanPosIsValid(so->currPos)) - { - /* punt if we have any unsatisfiable array keys */ - if (so->numArrayKeys < 0) - return false; - - _bt_start_array_keys(scan, dir); - } - - /* This loop handles advancing to the next array elements, if any */ + /* Each loop iteration performs another primitive index scan */ do { /* @@ -273,8 +253,8 @@ btgettuple(IndexScanDesc scan, ScanDirection dir) /* If we have a tuple, return it ... */ if (res) break; - /* ... otherwise see if we have more array keys to deal with */ - } while (so->numArrayKeys && _bt_advance_array_keys(scan, dir)); + /* ... otherwise see if we need another primitive index scan */ + } while (so->numArrayKeys && _bt_start_prim_scan(scan, dir)); return res; } @@ -289,19 +269,7 @@ btgetbitmap(IndexScanDesc scan, TIDBitmap *tbm) int64 ntids = 0; ItemPointer heapTid; - /* - * If we have any array keys, initialize them. - */ - if (so->numArrayKeys) - { - /* punt if we have any unsatisfiable array keys */ - if (so->numArrayKeys < 0) - return ntids; - - _bt_start_array_keys(scan, ForwardScanDirection); - } - - /* This loop handles advancing to the next array elements, if any */ + /* Each loop iteration performs another primitive index scan */ do { /* Fetch the first page & tuple */ @@ -331,8 +299,8 @@ btgetbitmap(IndexScanDesc scan, TIDBitmap *tbm) ntids++; } } - /* Now see if we have more array keys to deal with */ - } while (so->numArrayKeys && _bt_advance_array_keys(scan, ForwardScanDirection)); + /* Now see if we need another primitive index scan */ + } while (so->numArrayKeys && _bt_start_prim_scan(scan, ForwardScanDirection)); return ntids; } @@ -361,9 +329,10 @@ btbeginscan(Relation rel, int nkeys, int norderbys) else so->keyData = NULL; - so->arrayKeyData = NULL; /* assume no array keys for now */ - so->numArrayKeys = 0; + so->needPrimScan = false; + so->scanBehind = false; so->arrayKeys = NULL; + so->orderProcs = NULL; so->arrayContext = NULL; so->killedItems = NULL; /* until needed */ @@ -403,7 +372,8 @@ btrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys, } so->markItemIndex = -1; - so->arrayKeyCount = 0; + so->needPrimScan = false; + so->scanBehind = false; BTScanPosUnpinIfPinned(so->markPos); BTScanPosInvalidate(so->markPos); @@ -437,9 +407,7 @@ btrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys, scankey, scan->numberOfKeys * sizeof(ScanKeyData)); so->numberOfKeys = 0; /* until _bt_preprocess_keys sets it */ - - /* If any keys are SK_SEARCHARRAY type, set up array-key info */ - _bt_preprocess_array_keys(scan); + so->numArrayKeys = 0; /* ditto */ } /* @@ -467,7 +435,7 @@ btendscan(IndexScanDesc scan) /* Release storage */ if (so->keyData != NULL) pfree(so->keyData); - /* so->arrayKeyData and so->arrayKeys are in arrayContext */ + /* so->arrayKeys and so->orderProcs are in arrayContext */ if (so->arrayContext != NULL) MemoryContextDelete(so->arrayContext); if (so->killedItems != NULL) @@ -502,10 +470,6 @@ btmarkpos(IndexScanDesc scan) BTScanPosInvalidate(so->markPos); so->markItemIndex = -1; } - - /* Also record the current positions of any array keys */ - if (so->numArrayKeys) - _bt_mark_array_keys(scan); } /* @@ -516,10 +480,6 @@ btrestrpos(IndexScanDesc scan) { BTScanOpaque so = (BTScanOpaque) scan->opaque; - /* Restore the marked positions of any array keys */ - if (so->numArrayKeys) - _bt_restore_array_keys(scan); - if (so->markItemIndex >= 0) { /* @@ -558,6 +518,12 @@ btrestrpos(IndexScanDesc scan) if (so->currTuples) memcpy(so->currTuples, so->markTuples, so->markPos.nextTupleOffset); + /* Reset the scan's array keys (see _bt_steppage for why) */ + if (so->numArrayKeys) + { + _bt_start_array_keys(scan, so->currPos.dir); + so->needPrimScan = false; + } } else BTScanPosInvalidate(so->currPos); @@ -568,9 +534,10 @@ btrestrpos(IndexScanDesc scan) * btestimateparallelscan -- estimate storage for BTParallelScanDescData */ Size -btestimateparallelscan(void) +btestimateparallelscan(int nkeys, int norderbys) { - return sizeof(BTParallelScanDescData); + /* Pessimistically assume all input scankeys will be output with arrays */ + return offsetof(BTParallelScanDescData, btps_arrElems) + sizeof(int) * nkeys; } /* @@ -584,7 +551,6 @@ btinitparallelscan(void *target) SpinLockInit(&bt_target->btps_mutex); bt_target->btps_scanPage = InvalidBlockNumber; bt_target->btps_pageStatus = BTPARALLEL_NOT_INITIALIZED; - bt_target->btps_arrayKeyCount = 0; ConditionVariableInit(&bt_target->btps_cv); } @@ -610,7 +576,6 @@ btparallelrescan(IndexScanDesc scan) SpinLockAcquire(&btscan->btps_mutex); btscan->btps_scanPage = InvalidBlockNumber; btscan->btps_pageStatus = BTPARALLEL_NOT_INITIALIZED; - btscan->btps_arrayKeyCount = 0; SpinLockRelease(&btscan->btps_mutex); } @@ -620,12 +585,15 @@ btparallelrescan(IndexScanDesc scan) * or _bt_parallel_done(). * * The return value is true if we successfully seized the scan and false - * if we did not. The latter case occurs if no pages remain for the current - * set of scankeys. + * if we did not. The latter case occurs when no pages remain, or when + * another primitive index scan is scheduled that caller's backend cannot + * start just yet (only backends that call from _bt_first are capable of + * starting primitive index scans, which they indicate by passing first=true). * * If the return value is true, *pageno returns the next or current page * of the scan (depending on the scan direction). An invalid block number - * means the scan hasn't yet started, and P_NONE means we've reached the end. + * means the scan hasn't yet started, or that caller needs to start the next + * primitive index scan (if it's the latter case we'll set so.needPrimScan). * The first time a participating process reaches the last page, it will return * true and set *pageno to P_NONE; after that, further attempts to seize the * scan will return false. @@ -633,10 +601,9 @@ btparallelrescan(IndexScanDesc scan) * Callers should ignore the value of pageno if the return value is false. */ bool -_bt_parallel_seize(IndexScanDesc scan, BlockNumber *pageno) +_bt_parallel_seize(IndexScanDesc scan, BlockNumber *pageno, bool first) { BTScanOpaque so = (BTScanOpaque) scan->opaque; - BTPS_State pageStatus; bool exit_loop = false; bool status = true; ParallelIndexScanDesc parallel_scan = scan->parallel_scan; @@ -644,28 +611,74 @@ _bt_parallel_seize(IndexScanDesc scan, BlockNumber *pageno) *pageno = P_NONE; + if (first) + { + /* + * Initialize array related state when called from _bt_first, assuming + * that this will be the first primitive index scan for the scan + */ + so->needPrimScan = false; + so->scanBehind = false; + } + else + { + /* + * Don't attempt to seize the scan when it requires another primitive + * index scan, since caller's backend cannot start it right now + */ + if (so->needPrimScan) + return false; + } + btscan = (BTParallelScanDesc) OffsetToPointer((void *) parallel_scan, parallel_scan->ps_offset); while (1) { SpinLockAcquire(&btscan->btps_mutex); - pageStatus = btscan->btps_pageStatus; - if (so->arrayKeyCount < btscan->btps_arrayKeyCount) + if (btscan->btps_pageStatus == BTPARALLEL_DONE) { - /* Parallel scan has already advanced to a new set of scankeys. */ + /* We're done with this parallel index scan */ status = false; } - else if (pageStatus == BTPARALLEL_DONE) + else if (btscan->btps_pageStatus == BTPARALLEL_NEED_PRIMSCAN) { + Assert(so->numArrayKeys); + + if (first) + { + /* Can start scheduled primitive scan right away, so do so */ + btscan->btps_pageStatus = BTPARALLEL_ADVANCING; + for (int i = 0; i < so->numArrayKeys; i++) + { + BTArrayKeyInfo *array = &so->arrayKeys[i]; + ScanKey skey = &so->keyData[array->scan_key]; + + array->cur_elem = btscan->btps_arrElems[i]; + skey->sk_argument = array->elem_values[array->cur_elem]; + } + *pageno = InvalidBlockNumber; + exit_loop = true; + } + else + { + /* + * Don't attempt to seize the scan when it requires another + * primitive index scan, since caller's backend cannot start + * it right now + */ + status = false; + } + /* - * We're done with this set of scankeys. This may be the end, or - * there could be more sets to try. + * Either way, update backend local state to indicate that a + * pending primitive scan is required */ - status = false; + so->needPrimScan = true; + so->scanBehind = false; } - else if (pageStatus != BTPARALLEL_ADVANCING) + else if (btscan->btps_pageStatus != BTPARALLEL_ADVANCING) { /* * We have successfully seized control of the scan for the purpose @@ -689,6 +702,12 @@ _bt_parallel_seize(IndexScanDesc scan, BlockNumber *pageno) * _bt_parallel_release() -- Complete the process of advancing the scan to a * new page. We now have the new value btps_scanPage; some other backend * can now begin advancing the scan. + * + * Callers whose scan uses array keys must save their scan_page argument so + * that it can be passed to _bt_parallel_primscan_schedule, should caller + * determine that another primitive index scan is required. If that happens, + * scan_page won't be scanned by any backend (unless the next primitive index + * scan lands on scan_page). */ void _bt_parallel_release(IndexScanDesc scan, BlockNumber scan_page) @@ -725,17 +744,23 @@ _bt_parallel_done(IndexScanDesc scan) if (parallel_scan == NULL) return; + /* + * Should not mark parallel scan done when there's still a pending + * primitive index scan + */ + if (so->needPrimScan) + return; + btscan = (BTParallelScanDesc) OffsetToPointer((void *) parallel_scan, parallel_scan->ps_offset); /* - * Mark the parallel scan as done for this combination of scan keys, - * unless some other process already did so. See also - * _bt_advance_array_keys. + * Mark the parallel scan as done, unless some other process did so + * already */ SpinLockAcquire(&btscan->btps_mutex); - if (so->arrayKeyCount >= btscan->btps_arrayKeyCount && - btscan->btps_pageStatus != BTPARALLEL_DONE) + Assert(btscan->btps_pageStatus != BTPARALLEL_NEED_PRIMSCAN); + if (btscan->btps_pageStatus != BTPARALLEL_DONE) { btscan->btps_pageStatus = BTPARALLEL_DONE; status_changed = true; @@ -748,29 +773,39 @@ _bt_parallel_done(IndexScanDesc scan) } /* - * _bt_parallel_advance_array_keys() -- Advances the parallel scan for array - * keys. + * _bt_parallel_primscan_schedule() -- Schedule another primitive index scan. * - * Updates the count of array keys processed for both local and parallel - * scans. + * Caller passes the block number most recently passed to _bt_parallel_release + * by its backend. Caller successfully schedules the next primitive index scan + * if the shared parallel state hasn't been seized since caller's backend last + * advanced the scan. */ void -_bt_parallel_advance_array_keys(IndexScanDesc scan) +_bt_parallel_primscan_schedule(IndexScanDesc scan, BlockNumber prev_scan_page) { BTScanOpaque so = (BTScanOpaque) scan->opaque; ParallelIndexScanDesc parallel_scan = scan->parallel_scan; BTParallelScanDesc btscan; + Assert(so->numArrayKeys); + btscan = (BTParallelScanDesc) OffsetToPointer((void *) parallel_scan, parallel_scan->ps_offset); - so->arrayKeyCount++; SpinLockAcquire(&btscan->btps_mutex); - if (btscan->btps_pageStatus == BTPARALLEL_DONE) + if (btscan->btps_scanPage == prev_scan_page && + btscan->btps_pageStatus == BTPARALLEL_IDLE) { btscan->btps_scanPage = InvalidBlockNumber; - btscan->btps_pageStatus = BTPARALLEL_NOT_INITIALIZED; - btscan->btps_arrayKeyCount++; + btscan->btps_pageStatus = BTPARALLEL_NEED_PRIMSCAN; + + /* Serialize scan's current array keys */ + for (int i = 0; i < so->numArrayKeys; i++) + { + BTArrayKeyInfo *array = &so->arrayKeys[i]; + + btscan->btps_arrElems[i] = array->cur_elem; + } } SpinLockRelease(&btscan->btps_mutex); } diff --git a/src/backend/access/nbtree/nbtsearch.c b/src/backend/access/nbtree/nbtsearch.c index 7e05e58676895..e0bbb97cbecdf 100644 --- a/src/backend/access/nbtree/nbtsearch.c +++ b/src/backend/access/nbtree/nbtsearch.c @@ -4,7 +4,7 @@ * Search code for postgres btrees. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -17,6 +17,7 @@ #include "access/nbtree.h" #include "access/relscan.h" +#include "access/xact.h" #include "miscadmin.h" #include "pgstat.h" #include "storage/predicate.h" @@ -29,7 +30,7 @@ static OffsetNumber _bt_binsrch(Relation rel, BTScanInsert key, Buffer buf); static int _bt_binsrch_posting(BTScanInsert key, Page page, OffsetNumber offnum); static bool _bt_readpage(IndexScanDesc scan, ScanDirection dir, - OffsetNumber offnum); + OffsetNumber offnum, bool firstPage); static void _bt_saveitem(BTScanOpaque so, int itemIndex, OffsetNumber offnum, IndexTuple itup); static int _bt_setuppostingitems(BTScanOpaque so, int itemIndex, @@ -42,7 +43,7 @@ static bool _bt_steppage(IndexScanDesc scan, ScanDirection dir); static bool _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir); static bool _bt_parallel_readpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir); -static Buffer _bt_walk_left(Relation rel, Buffer buf, Snapshot snapshot); +static Buffer _bt_walk_left(Relation rel, Buffer buf); static bool _bt_endpoint(IndexScanDesc scan, ScanDirection dir); static inline void _bt_initialize_more_data(BTScanOpaque so, ScanDirection dir); @@ -82,10 +83,6 @@ _bt_drop_lock_and_maybe_pin(IndexScanDesc scan, BTScanPos sp) * which is locked and pinned. No locks are held on the parent pages, * however! * - * If the snapshot parameter is not NULL, "old snapshot" checking will take - * place during the descent through the tree. This is not needed when - * positioning for an insert or delete, so NULL is used for those cases. - * * The returned buffer is locked according to access parameter. Additionally, * access = BT_WRITE will allow an empty root page to be created and returned. * When access = BT_READ, an empty index will result in *bufP being set to @@ -97,7 +94,7 @@ _bt_drop_lock_and_maybe_pin(IndexScanDesc scan, BTScanPos sp) */ BTStack _bt_search(Relation rel, Relation heaprel, BTScanInsert key, Buffer *bufP, - int access, Snapshot snapshot) + int access) { BTStack stack_in = NULL; int page_access = BT_READ; @@ -137,7 +134,7 @@ _bt_search(Relation rel, Relation heaprel, BTScanInsert key, Buffer *bufP, * opportunity to finish splits of internal pages too. */ *bufP = _bt_moveright(rel, heaprel, key, *bufP, (access == BT_WRITE), - stack_in, page_access, snapshot); + stack_in, page_access); /* if this is a leaf page, we're done */ page = BufferGetPage(*bufP); @@ -197,8 +194,7 @@ _bt_search(Relation rel, Relation heaprel, BTScanInsert key, Buffer *bufP, * but before we acquired a write lock. If it has, we may need to * move right to its new sibling. Do that. */ - *bufP = _bt_moveright(rel, heaprel, key, *bufP, true, stack_in, BT_WRITE, - snapshot); + *bufP = _bt_moveright(rel, heaprel, key, *bufP, true, stack_in, BT_WRITE); } return stack_in; @@ -234,10 +230,6 @@ _bt_search(Relation rel, Relation heaprel, BTScanInsert key, Buffer *bufP, * On entry, we have the buffer pinned and a lock of the type specified by * 'access'. If we move right, we release the buffer and lock and acquire * the same on the right sibling. Return value is the buffer we stop at. - * - * If the snapshot parameter is not NULL, "old snapshot" checking will take - * place during the descent through the tree. This is not needed when - * positioning for an insert or delete, so NULL is used for those cases. */ Buffer _bt_moveright(Relation rel, @@ -246,8 +238,7 @@ _bt_moveright(Relation rel, Buffer buf, bool forupdate, BTStack stack, - int access, - Snapshot snapshot) + int access) { Page page; BTPageOpaque opaque; @@ -277,7 +268,6 @@ _bt_moveright(Relation rel, for (;;) { page = BufferGetPage(buf); - TestForOldSnapshot(snapshot, rel, page); opaque = BTPageGetOpaque(page); if (P_RIGHTMOST(opaque)) @@ -327,18 +317,17 @@ _bt_moveright(Relation rel, /* * _bt_binsrch() -- Do a binary search for a key on a particular page. * - * On a leaf page, _bt_binsrch() returns the OffsetNumber of the first - * key >= given scankey, or > scankey if nextkey is true. (NOTE: in - * particular, this means it is possible to return a value 1 greater than the - * number of keys on the page, if the scankey is > all keys on the page.) - * * On an internal (non-leaf) page, _bt_binsrch() returns the OffsetNumber * of the last key < given scankey, or last key <= given scankey if nextkey * is true. (Since _bt_compare treats the first data key of such a page as * minus infinity, there will be at least one key < scankey, so the result - * always points at one of the keys on the page.) This key indicates the - * right place to descend to be sure we find all leaf keys >= given scankey - * (or leaf keys > given scankey when nextkey is true). + * always points at one of the keys on the page.) + * + * On a leaf page, _bt_binsrch() returns the final result of the initial + * positioning process that started with _bt_first's call to _bt_search. + * We're returning a non-pivot tuple offset, so things are a little different. + * It is possible that we'll return an offset that's either past the last + * non-pivot slot, or (in the case of a backward scan) before the first slot. * * This procedure is not responsible for walking right, it just examines * the given page. _bt_binsrch() has no lock or refcount side effects @@ -372,7 +361,7 @@ _bt_binsrch(Relation rel, * this covers two cases: the page is really empty (no keys), or it * contains only a high key. The latter case is possible after vacuuming. * This can never happen on an internal page, however, since they are - * never empty (an internal page must have children). + * never empty (an internal page must have at least one child). */ if (unlikely(high < low)) return low; @@ -408,18 +397,45 @@ _bt_binsrch(Relation rel, } /* - * At this point we have high == low, but be careful: they could point - * past the last slot on the page. + * At this point we have high == low. * - * On a leaf page, we always return the first key >= scan key (resp. > - * scan key), which could be the last slot + 1. + * On a leaf page we always return the first non-pivot tuple >= scan key + * (resp. > scan key) for forward scan callers. For backward scans, it's + * always the _last_ non-pivot tuple < scan key (resp. <= scan key). */ if (P_ISLEAF(opaque)) + { + /* + * In the backward scan case we're supposed to locate the last + * matching tuple on the leaf level -- not the first matching tuple + * (the last tuple will be the first one returned by the scan). + * + * At this point we've located the first non-pivot tuple immediately + * after the last matching tuple (which might just be maxoff + 1). + * Compensate by stepping back. + */ + if (key->backward) + return OffsetNumberPrev(low); + return low; + } /* * On a non-leaf page, return the last key < scan key (resp. <= scan key). * There must be one if _bt_compare() is playing by the rules. + * + * _bt_compare() will seldom see any exactly-matching pivot tuples, since + * a truncated -inf heap TID is usually enough to prevent it altogether. + * Even omitted scan key entries are treated as > truncated attributes. + * + * However, during backward scans _bt_compare() interprets omitted scan + * key attributes as == corresponding truncated -inf attributes instead. + * This works just like < would work here. Under this scheme, < strategy + * backward scans will always directly descend to the correct leaf page. + * In particular, they will never incur an "extra" leaf page access with a + * scan key that happens to contain the same prefix of values as some + * pivot tuple's untruncated prefix. VACUUM relies on this guarantee when + * it uses a leaf page high key to "re-find" a page undergoing deletion. */ Assert(low > P_FIRSTDATAKEY(opaque)); @@ -777,10 +793,12 @@ _bt_compare(Relation rel, if (key->scantid == NULL) { /* - * Most searches have a scankey that is considered greater than a + * Forward scans have a scankey that is considered greater than a * truncated pivot tuple if and when the scankey has equal values for * attributes up to and including the least significant untruncated - * attribute in tuple. + * attribute in tuple. Even attributes that were omitted from the + * scan key are considered greater than -inf truncated attributes. + * (See _bt_binsrch for an explanation of our backward scan behavior.) * * For example, if an index has the minimum two attributes (single * user key attribute, plus heap TID attribute), and a page's high key @@ -792,25 +810,13 @@ _bt_compare(Relation rel, * doesn't have to descend left because it isn't interested in a match * that has a heap TID value of -inf. * - * However, some searches (pivotsearch searches) actually require that - * we descend left when this happens. -inf is treated as a possible - * match for omitted scankey attribute(s). This is needed by page - * deletion, which must re-find leaf pages that are targets for - * deletion using their high keys. - * * Note: the heap TID part of the test ensures that scankey is being - * compared to a pivot tuple with one or more truncated key - * attributes. - * - * Note: pg_upgrade'd !heapkeyspace indexes must always descend to the - * left here, since they have no heap TID attribute (and cannot have - * any -inf key values in any case, since truncation can only remove - * non-key attributes). !heapkeyspace searches must always be - * prepared to deal with matches on both sides of the pivot once the - * leaf level is reached. + * compared to a pivot tuple with one or more truncated -inf key + * attributes. The heap TID attribute is the last key attribute in + * every index, of course, but other than that it isn't special. */ - if (key->heapkeyspace && !key->pivotsearch && - key->keysz == ntupatts && heapTid == NULL) + if (!key->backward && key->keysz == ntupatts && heapTid == NULL && + key->heapkeyspace) return 1; /* All provided scankey arguments found to be equal */ @@ -855,8 +861,8 @@ _bt_compare(Relation rel, * qualifications in the scan key. On success exit, the page containing * the current index tuple is pinned but not locked, and data about * the matching tuple(s) on the page has been loaded into so->currPos. - * scan->xs_ctup.t_self is set to the heap TID of the current tuple, - * and if requested, scan->xs_itup points to a copy of the index tuple. + * scan->xs_heaptid is set to the heap TID of the current tuple, and if + * requested, scan->xs_itup points to a copy of the index tuple. * * If there are no matching items in the index, we return false, with no * pins or locks held. @@ -875,12 +881,10 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) BTStack stack; OffsetNumber offnum; StrategyNumber strat; - bool nextkey; - bool goback; BTScanInsertData inskey; ScanKey startKeys[INDEX_MAX_KEYS]; ScanKeyData notnullkeys[INDEX_MAX_KEYS]; - int keysCount = 0; + int keysz = 0; int i; bool status; StrategyNumber strat_total; @@ -889,8 +893,6 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) Assert(!BTScanPosIsValid(so->currPos)); - pgstat_count_index_scan(rel); - /* * Examine the scan keys and eliminate any redundant keys; also mark the * keys that must be matched to continue the scan. @@ -903,7 +905,6 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) */ if (!so->qual_ok) { - /* Notify any other workers that we're done with this scan key. */ _bt_parallel_done(scan); return false; } @@ -913,10 +914,22 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) * scan has not started, proceed to find out first leaf page in the usual * way while keeping other participating processes waiting. If the scan * has already begun, use the page number from the shared structure. + * + * When a parallel scan has another primitive index scan scheduled, a + * parallel worker will seize the scan for that purpose now. This is + * similar to the case where the top-level scan hasn't started. */ if (scan->parallel_scan != NULL) { - status = _bt_parallel_seize(scan, &blkno); + status = _bt_parallel_seize(scan, &blkno, true); + + /* + * Initialize arrays (when _bt_parallel_seize didn't already set up + * the next primitive index scan) + */ + if (so->numArrayKeys && !so->needPrimScan) + _bt_start_array_keys(scan, dir); + if (!status) return false; else if (blkno == P_NONE) @@ -931,6 +944,22 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) goto readcomplete; } } + else if (so->numArrayKeys && !so->needPrimScan) + { + /* + * First _bt_first call (for current btrescan) without parallelism. + * + * Initialize arrays, and the corresponding scan keys that were just + * output by _bt_preprocess_keys. + */ + _bt_start_array_keys(scan, dir); + } + + /* + * Count an indexscan for stats, now that we know that we'll call + * _bt_search/_bt_endpoint below + */ + pgstat_count_index_scan(rel); /*---------- * Examine the scan keys to discover where we need to start the scan. @@ -976,6 +1005,18 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) * * The selected scan keys (at most one per index column) are remembered by * storing their addresses into the local startKeys[] array. + * + * _bt_checkkeys/_bt_advance_array_keys decide whether and when to start + * the next primitive index scan (for scans with array keys) based in part + * on an understanding of how it'll enable us to reposition the scan. + * They're directly aware of how we'll sometimes cons up an explicit + * SK_SEARCHNOTNULL key. They'll even end primitive scans by applying a + * symmetric "deduce NOT NULL" rule of their own. This allows top-level + * scans to skip large groups of NULLs through repeated deductions about + * key strictness (for a required inequality key) and whether NULLs in the + * key's index column are stored last or first (relative to non-NULLs). + * If you update anything here, _bt_checkkeys/_bt_advance_array_keys might + * need to be kept in sync. *---------- */ strat_total = BTEqualStrategyNumber; @@ -1014,8 +1055,8 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) ScanDirectionIsForward(dir) : ScanDirectionIsBackward(dir))) { - /* Yes, so build the key in notnullkeys[keysCount] */ - chosen = ¬nullkeys[keysCount]; + /* Yes, so build the key in notnullkeys[keysz] */ + chosen = ¬nullkeys[keysz]; ScanKeyEntryInitialize(chosen, (SK_SEARCHNOTNULL | SK_ISNULL | (impliesNN->sk_flags & @@ -1036,7 +1077,7 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) */ if (chosen == NULL) break; - startKeys[keysCount++] = chosen; + startKeys[keysz++] = chosen; /* * Adjust strat_total, and quit if we have stored a > or < @@ -1110,7 +1151,7 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) * the tree. Walk down that edge to the first or last key, and scan from * there. */ - if (keysCount == 0) + if (keysz == 0) { bool match; @@ -1132,8 +1173,8 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) * identified by startKeys[]. (Remaining insertion scankey fields are * initialized after initial-positioning strategy is finalized.) */ - Assert(keysCount <= INDEX_MAX_KEYS); - for (i = 0; i < keysCount; i++) + Assert(keysz <= INDEX_MAX_KEYS); + for (i = 0; i < keysz; i++) { ScanKey cur = startKeys[i]; @@ -1174,7 +1215,7 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) * did use has to be treated as just a ">=" or "<=" condition, and * so we'd better adjust strat_total accordingly. */ - if (i == keysCount - 1) + if (i == keysz - 1) { bool used_all_subkeys = false; @@ -1183,16 +1224,16 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) { subkey++; Assert(subkey->sk_flags & SK_ROW_MEMBER); - if (subkey->sk_attno != keysCount + 1) + if (subkey->sk_attno != keysz + 1) break; /* out-of-sequence, can't use it */ if (subkey->sk_strategy != cur->sk_strategy) break; /* wrong direction, can't use it */ if (subkey->sk_flags & SK_ISNULL) break; /* can't use null keys */ - Assert(keysCount < INDEX_MAX_KEYS); - memcpy(inskey.scankeys + keysCount, subkey, + Assert(keysz < INDEX_MAX_KEYS); + memcpy(inskey.scankeys + keysz, subkey, sizeof(ScanKeyData)); - keysCount++; + keysz++; if (subkey->sk_flags & SK_ROW_END) { used_all_subkeys = true; @@ -1273,40 +1314,26 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) /*---------- * Examine the selected initial-positioning strategy to determine exactly * where we need to start the scan, and set flag variables to control the - * code below. - * - * If nextkey = false, _bt_search and _bt_binsrch will locate the first - * item >= scan key. If nextkey = true, they will locate the first - * item > scan key. - * - * If goback = true, we will then step back one item, while if - * goback = false, we will start the scan on the located item. + * initial descent by _bt_search (and our _bt_binsrch call for the leaf + * page _bt_search returns). *---------- */ + _bt_metaversion(rel, &inskey.heapkeyspace, &inskey.allequalimage); + inskey.anynullkeys = false; /* unused */ + inskey.scantid = NULL; + inskey.keysz = keysz; switch (strat_total) { case BTLessStrategyNumber: - /* - * Find first item >= scankey, then back up one to arrive at last - * item < scankey. (Note: this positioning strategy is only used - * for a backward scan, so that is always the correct starting - * position.) - */ - nextkey = false; - goback = true; + inskey.nextkey = false; + inskey.backward = true; break; case BTLessEqualStrategyNumber: - /* - * Find first item > scankey, then back up one to arrive at last - * item <= scankey. (Note: this positioning strategy is only used - * for a backward scan, so that is always the correct starting - * position.) - */ - nextkey = true; - goback = true; + inskey.nextkey = true; + inskey.backward = true; break; case BTEqualStrategyNumber: @@ -1318,41 +1345,37 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) if (ScanDirectionIsBackward(dir)) { /* - * This is the same as the <= strategy. We will check at the - * end whether the found item is actually =. + * This is the same as the <= strategy */ - nextkey = true; - goback = true; + inskey.nextkey = true; + inskey.backward = true; } else { /* - * This is the same as the >= strategy. We will check at the - * end whether the found item is actually =. + * This is the same as the >= strategy */ - nextkey = false; - goback = false; + inskey.nextkey = false; + inskey.backward = false; } break; case BTGreaterEqualStrategyNumber: /* - * Find first item >= scankey. (This is only used for forward - * scans.) + * Find first item >= scankey */ - nextkey = false; - goback = false; + inskey.nextkey = false; + inskey.backward = false; break; case BTGreaterStrategyNumber: /* - * Find first item > scankey. (This is only used for forward - * scans.) + * Find first item > scankey */ - nextkey = true; - goback = false; + inskey.nextkey = true; + inskey.backward = false; break; default: @@ -1361,19 +1384,12 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) return false; } - /* Initialize remaining insertion scan key fields */ - _bt_metaversion(rel, &inskey.heapkeyspace, &inskey.allequalimage); - inskey.anynullkeys = false; /* unused */ - inskey.nextkey = nextkey; - inskey.pivotsearch = false; - inskey.scantid = NULL; - inskey.keysz = keysCount; - /* * Use the manufactured insertion scan key to descend the tree and * position ourselves on the target leaf page. */ - stack = _bt_search(rel, NULL, &inskey, &buf, BT_READ, scan->xs_snapshot); + Assert(ScanDirectionIsBackward(dir) == inskey.backward); + stack = _bt_search(rel, NULL, &inskey, &buf, BT_READ); /* don't need to keep the stack around... */ _bt_freestack(stack); @@ -1382,57 +1398,61 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) { /* * We only get here if the index is completely empty. Lock relation - * because nothing finer to lock exists. - */ - PredicateLockRelation(rel, scan->xs_snapshot); - - /* - * mark parallel scan as done, so that all the workers can finish - * their scan + * because nothing finer to lock exists. Without a buffer lock, it's + * possible for another transaction to insert data between + * _bt_search() and PredicateLockRelation(). We have to try again + * after taking the relation-level predicate lock, to close a narrow + * window where we wouldn't scan concurrently inserted tuples, but the + * writer wouldn't see our predicate lock. */ - _bt_parallel_done(scan); - BTScanPosInvalidate(so->currPos); + if (IsolationIsSerializable()) + { + PredicateLockRelation(rel, scan->xs_snapshot); + stack = _bt_search(rel, NULL, &inskey, &buf, BT_READ); + _bt_freestack(stack); + } - return false; + if (!BufferIsValid(buf)) + { + /* + * Mark parallel scan as done, so that all the workers can finish + * their scan. + */ + _bt_parallel_done(scan); + BTScanPosInvalidate(so->currPos); + return false; + } } - else - PredicateLockPage(rel, BufferGetBlockNumber(buf), - scan->xs_snapshot); + + PredicateLockPage(rel, BufferGetBlockNumber(buf), scan->xs_snapshot); _bt_initialize_more_data(so, dir); /* position to the precise item on the page */ offnum = _bt_binsrch(rel, &inskey, buf); - - /* - * If nextkey = false, we are positioned at the first item >= scan key, or - * possibly at the end of a page on which all the existing items are less - * than the scan key and we know that everything on later pages is greater - * than or equal to scan key. - * - * If nextkey = true, we are positioned at the first item > scan key, or - * possibly at the end of a page on which all the existing items are less - * than or equal to the scan key and we know that everything on later - * pages is greater than scan key. - * - * The actually desired starting point is either this item or the prior - * one, or in the end-of-page case it's the first item on the next page or - * the last item on this page. Adjust the starting offset if needed. (If - * this results in an offset before the first item or after the last one, - * _bt_readpage will report no items found, and then we'll step to the - * next page as needed.) - */ - if (goback) - offnum = OffsetNumberPrev(offnum); - - /* remember which buffer we have pinned, if any */ Assert(!BTScanPosIsValid(so->currPos)); so->currPos.buf = buf; /* * Now load data from the first page of the scan. + * + * If inskey.nextkey = false and inskey.backward = false, offnum is + * positioned at the first non-pivot tuple >= inskey.scankeys. + * + * If inskey.nextkey = false and inskey.backward = true, offnum is + * positioned at the last non-pivot tuple < inskey.scankeys. + * + * If inskey.nextkey = true and inskey.backward = false, offnum is + * positioned at the first non-pivot tuple > inskey.scankeys. + * + * If inskey.nextkey = true and inskey.backward = true, offnum is + * positioned at the last non-pivot tuple <= inskey.scankeys. + * + * It's possible that _bt_binsrch returned an offnum that is out of bounds + * for the page. For example, when inskey is both < the leaf page's high + * key and > all of its non-pivot tuples, offnum will be "maxoff + 1". */ - if (!_bt_readpage(scan, dir, offnum)) + if (!_bt_readpage(scan, dir, offnum, true)) { /* * There's no actually-matching data on this page. Try to advance to @@ -1444,7 +1464,7 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) } else { - /* Drop the lock, and maybe the pin, on the current page */ + /* We have at least one item to return as scan's first item */ _bt_drop_lock_and_maybe_pin(scan, &so->currPos); } @@ -1465,9 +1485,9 @@ _bt_first(IndexScanDesc scan, ScanDirection dir) * but is not locked, and so->currPos.itemIndex identifies which item was * previously returned. * - * On successful exit, scan->xs_ctup.t_self is set to the TID of the - * next heap tuple, and if requested, scan->xs_itup points to a copy of - * the index tuple. so->currPos is updated as needed. + * On successful exit, scan->xs_heaptid is set to the TID of the next + * heap tuple, and if requested, scan->xs_itup points to a copy of the + * index tuple. so->currPos is updated as needed. * * On failure exit (no more tuples), we release pin and set * so->currPos.buf to InvalidBuffer. @@ -1519,7 +1539,16 @@ _bt_next(IndexScanDesc scan, ScanDirection dir) * We scan the current page starting at offnum and moving in the indicated * direction. All items matching the scan keys are loaded into currPos.items. * moreLeft or moreRight (as appropriate) is cleared if _bt_checkkeys reports - * that there can be no more matching tuples in the current scan direction. + * that there can be no more matching tuples in the current scan direction + * (could just be for the current primitive index scan when scan has arrays). + * + * _bt_first caller passes us an offnum returned by _bt_binsrch, which might + * be an out of bounds offnum such as "maxoff + 1" in certain corner cases. + * _bt_checkkeys will stop the scan as soon as an equality qual fails (when + * its scan key was marked required), so _bt_first _must_ pass us an offnum + * exactly at the beginning of where equal tuples are to be found. When we're + * passed an offnum past the end of the page, we might still manage to stop + * the scan on this page by calling _bt_checkkeys against the high key. * * In the case of a parallel scan, caller must have called _bt_parallel_seize * prior to calling this function; this function will invoke @@ -1528,16 +1557,18 @@ _bt_next(IndexScanDesc scan, ScanDirection dir) * Returns true if any matching items found on the page, false if none. */ static bool -_bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) +_bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum, + bool firstPage) { BTScanOpaque so = (BTScanOpaque) scan->opaque; Page page; BTPageOpaque opaque; OffsetNumber minoff; OffsetNumber maxoff; - int itemIndex; - bool continuescan; - int indnatts; + BTReadPageState pstate; + bool arrayKeys; + int itemIndex, + indnatts; /* * We must have the buffer pinned and locked, but the usual macro can't be @@ -1552,16 +1583,32 @@ _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) if (scan->parallel_scan) { if (ScanDirectionIsForward(dir)) - _bt_parallel_release(scan, opaque->btpo_next); + pstate.prev_scan_page = opaque->btpo_next; else - _bt_parallel_release(scan, BufferGetBlockNumber(so->currPos.buf)); + pstate.prev_scan_page = BufferGetBlockNumber(so->currPos.buf); + + _bt_parallel_release(scan, pstate.prev_scan_page); } - continuescan = true; /* default assumption */ indnatts = IndexRelationGetNumberOfAttributes(scan->indexRelation); + arrayKeys = so->numArrayKeys != 0; minoff = P_FIRSTDATAKEY(opaque); maxoff = PageGetMaxOffsetNumber(page); + /* initialize page-level state that we'll pass to _bt_checkkeys */ + pstate.dir = dir; + pstate.minoff = minoff; + pstate.maxoff = maxoff; + pstate.finaltup = NULL; + pstate.page = page; + pstate.offnum = InvalidOffsetNumber; + pstate.skip = InvalidOffsetNumber; + pstate.continuescan = true; /* default assumption */ + pstate.prechecked = false; + pstate.firstmatch = false; + pstate.rechecks = 0; + pstate.targetdistance = 0; + /* * We note the buffer's block number so that we can release the pin later. * This allows us to re-read the buffer if it is needed again for hinting. @@ -1581,6 +1628,7 @@ _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) * corresponding need for the left-link, since splits always go right. */ so->currPos.nextPage = opaque->btpo_next; + so->currPos.dir = dir; /* initialize tuple workspace to empty */ so->currPos.nextTupleOffset = 0; @@ -1591,8 +1639,70 @@ _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) */ Assert(BTScanPosIsPinned(so->currPos)); + /* + * Prechecking the value of the continuescan flag for the last item on the + * page (for backwards scan it will be the first item on a page). If we + * observe it to be true, then it should be true for all other items. This + * allows us to do significant optimizations in the _bt_checkkeys() + * function for all the items on the page. + * + * With the forward scan, we do this check for the last item on the page + * instead of the high key. It's relatively likely that the most + * significant column in the high key will be different from the + * corresponding value from the last item on the page. So checking with + * the last item on the page would give a more precise answer. + * + * We skip this for the first page read by each (primitive) scan, to avoid + * slowing down point queries. They typically don't stand to gain much + * when the optimization can be applied, and are more likely to notice the + * overhead of the precheck. + * + * The optimization is unsafe and must be avoided whenever _bt_checkkeys + * just set a low-order required array's key to the best available match + * for a truncated -inf attribute value from the prior page's high key + * (array element 0 is always the best available match in this scenario). + * It's quite likely that matches for array element 0 begin on this page, + * but the start of matches won't necessarily align with page boundaries. + * When the start of matches is somewhere in the middle of this page, it + * would be wrong to treat page's final non-pivot tuple as representative. + * Doing so might lead us to treat some of the page's earlier tuples as + * being part of a group of tuples thought to satisfy the required keys. + * + * Note: Conversely, in the case where the scan's arrays just advanced + * using the prior page's HIKEY _without_ advancement setting scanBehind, + * the start of matches must be aligned with page boundaries, which makes + * it safe to attempt the optimization here now. It's also safe when the + * prior page's HIKEY simply didn't need to advance any required array. In + * both cases we can safely assume that the _first_ tuple from this page + * must be >= the current set of array keys/equality constraints. And so + * if the final tuple is == those same keys (and also satisfies any + * required < or <= strategy scan keys) during the precheck, we can safely + * assume that this must also be true of all earlier tuples from the page. + */ + if (!firstPage && !so->scanBehind && minoff < maxoff) + { + ItemId iid; + IndexTuple itup; + + iid = PageGetItemId(page, ScanDirectionIsForward(dir) ? maxoff : minoff); + itup = (IndexTuple) PageGetItem(page, iid); + + /* Call with arrayKeys=false to avoid undesirable side-effects */ + _bt_checkkeys(scan, &pstate, false, itup, indnatts); + pstate.prechecked = pstate.continuescan; + pstate.continuescan = true; /* reset */ + } + if (ScanDirectionIsForward(dir)) { + /* SK_SEARCHARRAY forward scans must provide high key up front */ + if (arrayKeys && !P_RIGHTMOST(opaque)) + { + ItemId iid = PageGetItemId(page, P_HIKEY); + + pstate.finaltup = (IndexTuple) PageGetItem(page, iid); + } + /* load items[] in ascending order */ itemIndex = 0; @@ -1602,6 +1712,7 @@ _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) { ItemId iid = PageGetItemId(page, offnum); IndexTuple itup; + bool passes_quals; /* * If the scan specifies not to return killed tuples, then we @@ -1614,10 +1725,30 @@ _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) } itup = (IndexTuple) PageGetItem(page, iid); + Assert(!BTreeTupleIsPivot(itup)); + + pstate.offnum = offnum; + passes_quals = _bt_checkkeys(scan, &pstate, arrayKeys, + itup, indnatts); + + /* + * Check if we need to skip ahead to a later tuple (only possible + * when the scan uses array keys) + */ + if (arrayKeys && OffsetNumberIsValid(pstate.skip)) + { + Assert(!passes_quals && pstate.continuescan); + Assert(offnum < pstate.skip); - if (_bt_checkkeys(scan, itup, indnatts, dir, &continuescan)) + offnum = pstate.skip; + pstate.skip = InvalidOffsetNumber; + continue; + } + + if (passes_quals) { /* tuple passes all scan key conditions */ + pstate.firstmatch = true; if (!BTreeTupleIsPosting(itup)) { /* Remember it */ @@ -1648,7 +1779,7 @@ _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) } } /* When !continuescan, there can't be any more matches, so stop */ - if (!continuescan) + if (!pstate.continuescan) break; offnum = OffsetNumberNext(offnum); @@ -1665,17 +1796,18 @@ _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) * only appear on non-pivot tuples on the right sibling page are * common. */ - if (continuescan && !P_RIGHTMOST(opaque)) + if (pstate.continuescan && !P_RIGHTMOST(opaque)) { ItemId iid = PageGetItemId(page, P_HIKEY); IndexTuple itup = (IndexTuple) PageGetItem(page, iid); int truncatt; truncatt = BTreeTupleGetNAtts(itup, scan->indexRelation); - _bt_checkkeys(scan, itup, truncatt, dir, &continuescan); + pstate.prechecked = false; /* precheck didn't cover HIKEY */ + _bt_checkkeys(scan, &pstate, arrayKeys, itup, truncatt); } - if (!continuescan) + if (!pstate.continuescan) so->currPos.moreRight = false; Assert(itemIndex <= MaxTIDsPerBTreePage); @@ -1685,6 +1817,14 @@ _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) } else { + /* SK_SEARCHARRAY backward scans must provide final tuple up front */ + if (arrayKeys && minoff <= maxoff && !P_LEFTMOST(opaque)) + { + ItemId iid = PageGetItemId(page, minoff); + + pstate.finaltup = (IndexTuple) PageGetItem(page, iid); + } + /* load items[] in descending order */ itemIndex = MaxTIDsPerBTreePage; @@ -1722,12 +1862,30 @@ _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) tuple_alive = true; itup = (IndexTuple) PageGetItem(page, iid); + Assert(!BTreeTupleIsPivot(itup)); + + pstate.offnum = offnum; + passes_quals = _bt_checkkeys(scan, &pstate, arrayKeys, + itup, indnatts); + + /* + * Check if we need to skip ahead to a later tuple (only possible + * when the scan uses array keys) + */ + if (arrayKeys && OffsetNumberIsValid(pstate.skip)) + { + Assert(!passes_quals && pstate.continuescan); + Assert(offnum > pstate.skip); + + offnum = pstate.skip; + pstate.skip = InvalidOffsetNumber; + continue; + } - passes_quals = _bt_checkkeys(scan, itup, indnatts, dir, - &continuescan); if (passes_quals && tuple_alive) { /* tuple passes all scan key conditions */ + pstate.firstmatch = true; if (!BTreeTupleIsPosting(itup)) { /* Remember it */ @@ -1763,7 +1921,7 @@ _bt_readpage(IndexScanDesc scan, ScanDirection dir, OffsetNumber offnum) } } } - if (!continuescan) + if (!pstate.continuescan) { /* there can't be any more matches, so stop */ so->currPos.moreLeft = false; @@ -1909,8 +2067,41 @@ _bt_steppage(IndexScanDesc scan, ScanDirection dir) so->currPos.nextTupleOffset); so->markPos.itemIndex = so->markItemIndex; so->markItemIndex = -1; + + /* + * If we're just about to start the next primitive index scan + * (possible with a scan that has arrays keys, and needs to skip to + * continue in the current scan direction), moreLeft/moreRight only + * indicate the end of the current primitive index scan. They must + * never be taken to indicate that the top-level index scan has ended + * (that would be wrong). + * + * We could handle this case by treating the current array keys as + * markPos state. But depending on the current array state like this + * would add complexity. Instead, we just unset markPos's copy of + * moreRight or moreLeft (whichever might be affected), while making + * btrestpos reset the scan's arrays to their initial scan positions. + * In effect, btrestpos leaves advancing the arrays up to the first + * _bt_readpage call (that takes place after it has restored markPos). + */ + if (so->needPrimScan) + { + if (ScanDirectionIsForward(so->currPos.dir)) + so->markPos.moreRight = true; + else + so->markPos.moreLeft = true; + } } + /* + * Cancel primitive index scans that were scheduled when the call to + * _bt_readpage for currPos happened to use the opposite direction to the + * one that we're stepping in now. (It's okay to leave the scan's array + * keys as-is, since the next _bt_readpage will advance them.) + */ + if (so->currPos.dir != dir) + so->needPrimScan = false; + if (ScanDirectionIsForward(dir)) { /* Walk right to the next page with data */ @@ -1920,7 +2111,7 @@ _bt_steppage(IndexScanDesc scan, ScanDirection dir) * Seize the scan to get the next block number; if the scan has * ended already, bail out. */ - status = _bt_parallel_seize(scan, &blkno); + status = _bt_parallel_seize(scan, &blkno, false); if (!status) { /* release the previous buffer, if pinned */ @@ -1952,7 +2143,7 @@ _bt_steppage(IndexScanDesc scan, ScanDirection dir) * Seize the scan to get the current block number; if the scan has * ended already, bail out. */ - status = _bt_parallel_seize(scan, &blkno); + status = _bt_parallel_seize(scan, &blkno, false); BTScanPosUnpinIfPinned(so->currPos); if (!status) { @@ -1970,7 +2161,7 @@ _bt_steppage(IndexScanDesc scan, ScanDirection dir) if (!_bt_readnextpage(scan, blkno, dir)) return false; - /* Drop the lock, and maybe the pin, on the current page */ + /* We have at least one item to return as scan's next item */ _bt_drop_lock_and_maybe_pin(scan, &so->currPos); return true; @@ -1980,8 +2171,8 @@ _bt_steppage(IndexScanDesc scan, ScanDirection dir) * _bt_readnextpage() -- Read next page containing valid data for scan * * On success exit, so->currPos is updated to contain data from the next - * interesting page. Caller is responsible to release lock and pin on - * buffer on success. We return true to indicate success. + * interesting page, and we return true. Caller must release the lock (and + * maybe the pin) on the buffer on success exit. * * If there are no more matching records in the given direction, we drop all * locks and pins, set so->currPos.buf to InvalidBuffer, and return false. @@ -2016,7 +2207,6 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir) /* step right one page */ so->currPos.buf = _bt_getbuf(rel, blkno, BT_READ); page = BufferGetPage(so->currPos.buf); - TestForOldSnapshot(scan->xs_snapshot, rel, page); opaque = BTPageGetOpaque(page); /* check for deleted page */ if (!P_IGNORE(opaque)) @@ -2024,7 +2214,7 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir) PredicateLockPage(rel, blkno, scan->xs_snapshot); /* see if there are any matches on this page */ /* note that this will clear moreRight if we can stop */ - if (_bt_readpage(scan, dir, P_FIRSTDATAKEY(opaque))) + if (_bt_readpage(scan, dir, P_FIRSTDATAKEY(opaque), false)) break; } else if (scan->parallel_scan != NULL) @@ -2037,7 +2227,7 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir) if (scan->parallel_scan != NULL) { _bt_relbuf(rel, so->currPos.buf); - status = _bt_parallel_seize(scan, &blkno); + status = _bt_parallel_seize(scan, &blkno, false); if (!status) { BTScanPosInvalidate(so->currPos); @@ -2072,18 +2262,9 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir) * * It might be possible to rearrange this code to have less overhead * in pinning and locking, but that would require capturing the left - * pointer when the page is initially read, and using it here, along - * with big changes to _bt_walk_left() and the code below. It is not - * clear whether this would be a win, since if the page immediately to - * the left splits after we read this page and before we step left, we - * would need to visit more pages than with the current code. - * - * Note that if we change the code so that we drop the pin for a scan - * which uses a non-MVCC snapshot, we will need to modify the code for - * walking left, to allow for the possibility that a referenced page - * has been deleted. As long as the buffer is pinned or the snapshot - * is MVCC the page cannot move past the half-dead state to fully - * deleted. + * sibling block number when the page is initially read, and then + * optimistically starting there (rather than pinning the page twice). + * It is not clear that this would be worth the complexity. */ if (BTScanPosIsPinned(so->currPos)) _bt_lockbuf(rel, so->currPos.buf, BT_READ); @@ -2102,8 +2283,7 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir) } /* Step to next physical page */ - so->currPos.buf = _bt_walk_left(rel, so->currPos.buf, - scan->xs_snapshot); + so->currPos.buf = _bt_walk_left(rel, so->currPos.buf); /* if we're physically at end of index, return failure */ if (so->currPos.buf == InvalidBuffer) @@ -2119,14 +2299,13 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir) * and do it all again. */ page = BufferGetPage(so->currPos.buf); - TestForOldSnapshot(scan->xs_snapshot, rel, page); opaque = BTPageGetOpaque(page); if (!P_IGNORE(opaque)) { PredicateLockPage(rel, BufferGetBlockNumber(so->currPos.buf), scan->xs_snapshot); /* see if there are any matches on this page */ /* note that this will clear moreLeft if we can stop */ - if (_bt_readpage(scan, dir, PageGetMaxOffsetNumber(page))) + if (_bt_readpage(scan, dir, PageGetMaxOffsetNumber(page), false)) break; } else if (scan->parallel_scan != NULL) @@ -2144,7 +2323,7 @@ _bt_readnextpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir) if (scan->parallel_scan != NULL) { _bt_relbuf(rel, so->currPos.buf); - status = _bt_parallel_seize(scan, &blkno); + status = _bt_parallel_seize(scan, &blkno, false); if (!status) { BTScanPosInvalidate(so->currPos); @@ -2169,12 +2348,14 @@ _bt_parallel_readpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir) { BTScanOpaque so = (BTScanOpaque) scan->opaque; + Assert(!so->needPrimScan); + _bt_initialize_more_data(so, dir); if (!_bt_readnextpage(scan, blkno, dir)) return false; - /* Drop the lock, and maybe the pin, on the current page */ + /* We have at least one item to return as scan's next item */ _bt_drop_lock_and_maybe_pin(scan, &so->currPos); return true; @@ -2190,12 +2371,11 @@ _bt_parallel_readpage(IndexScanDesc scan, BlockNumber blkno, ScanDirection dir) * Returns InvalidBuffer if there is no page to the left (no lock is held * in that case). * - * When working on a non-leaf level, it is possible for the returned page - * to be half-dead; the caller should check that condition and step left - * again if it's important. + * It is possible for the returned leaf page to be half-dead; caller must + * check that condition and step left again when required. */ static Buffer -_bt_walk_left(Relation rel, Buffer buf, Snapshot snapshot) +_bt_walk_left(Relation rel, Buffer buf) { Page page; BTPageOpaque opaque; @@ -2225,7 +2405,6 @@ _bt_walk_left(Relation rel, Buffer buf, Snapshot snapshot) CHECK_FOR_INTERRUPTS(); buf = _bt_getbuf(rel, blkno, BT_READ); page = BufferGetPage(buf); - TestForOldSnapshot(snapshot, rel, page); opaque = BTPageGetOpaque(page); /* @@ -2236,8 +2415,7 @@ _bt_walk_left(Relation rel, Buffer buf, Snapshot snapshot) * anymore, not that its left sibling got split more than four times. * * Note that it is correct to test P_ISDELETED not P_IGNORE here, - * because half-dead pages are still in the sibling chain. Caller - * must reject half-dead pages if wanted. + * because half-dead pages are still in the sibling chain. */ tries = 0; for (;;) @@ -2252,14 +2430,12 @@ _bt_walk_left(Relation rel, Buffer buf, Snapshot snapshot) blkno = opaque->btpo_next; buf = _bt_relandgetbuf(rel, buf, blkno, BT_READ); page = BufferGetPage(buf); - TestForOldSnapshot(snapshot, rel, page); opaque = BTPageGetOpaque(page); } /* Return to the original page to see what's up */ buf = _bt_relandgetbuf(rel, buf, obknum, BT_READ); page = BufferGetPage(buf); - TestForOldSnapshot(snapshot, rel, page); opaque = BTPageGetOpaque(page); if (P_ISDELETED(opaque)) { @@ -2277,7 +2453,6 @@ _bt_walk_left(Relation rel, Buffer buf, Snapshot snapshot) blkno = opaque->btpo_next; buf = _bt_relandgetbuf(rel, buf, blkno, BT_READ); page = BufferGetPage(buf); - TestForOldSnapshot(snapshot, rel, page); opaque = BTPageGetOpaque(page); if (!P_ISDELETED(opaque)) break; @@ -2314,8 +2489,7 @@ _bt_walk_left(Relation rel, Buffer buf, Snapshot snapshot) * The returned buffer is pinned and read-locked. */ Buffer -_bt_get_endpoint(Relation rel, uint32 level, bool rightmost, - Snapshot snapshot) +_bt_get_endpoint(Relation rel, uint32 level, bool rightmost) { Buffer buf; Page page; @@ -2338,7 +2512,6 @@ _bt_get_endpoint(Relation rel, uint32 level, bool rightmost, return InvalidBuffer; page = BufferGetPage(buf); - TestForOldSnapshot(snapshot, rel, page); opaque = BTPageGetOpaque(page); for (;;) @@ -2358,7 +2531,6 @@ _bt_get_endpoint(Relation rel, uint32 level, bool rightmost, RelationGetRelationName(rel)); buf = _bt_relandgetbuf(rel, buf, blkno, BT_READ); page = BufferGetPage(buf); - TestForOldSnapshot(snapshot, rel, page); opaque = BTPageGetOpaque(page); } @@ -2413,7 +2585,7 @@ _bt_endpoint(IndexScanDesc scan, ScanDirection dir) * version of _bt_search(). We don't maintain a stack since we know we * won't need it. */ - buf = _bt_get_endpoint(rel, 0, ScanDirectionIsBackward(dir), scan->xs_snapshot); + buf = _bt_get_endpoint(rel, 0, ScanDirectionIsBackward(dir)); if (!BufferIsValid(buf)) { @@ -2458,7 +2630,7 @@ _bt_endpoint(IndexScanDesc scan, ScanDirection dir) /* * Now load data from the first page of the scan. */ - if (!_bt_readpage(scan, dir, start)) + if (!_bt_readpage(scan, dir, start, true)) { /* * There's no actually-matching data on this page. Try to advance to @@ -2470,7 +2642,7 @@ _bt_endpoint(IndexScanDesc scan, ScanDirection dir) } else { - /* Drop the lock, and maybe the pin, on the current page */ + /* We have at least one item to return as scan's first item */ _bt_drop_lock_and_maybe_pin(scan, &so->currPos); } @@ -2484,14 +2656,21 @@ _bt_endpoint(IndexScanDesc scan, ScanDirection dir) } /* - * _bt_initialize_more_data() -- initialize moreLeft/moreRight appropriately - * for scan direction + * _bt_initialize_more_data() -- initialize moreLeft, moreRight and scan dir + * from currPos */ static inline void _bt_initialize_more_data(BTScanOpaque so, ScanDirection dir) { - /* initialize moreLeft/moreRight appropriately for scan direction */ - if (ScanDirectionIsForward(dir)) + if (so->needPrimScan) + { + Assert(so->numArrayKeys); + + so->currPos.moreLeft = true; + so->currPos.moreRight = true; + so->needPrimScan = false; + } + else if (ScanDirectionIsForward(dir)) { so->currPos.moreLeft = false; so->currPos.moreRight = true; diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c index c2665fce411af..f5d7b3b0c3014 100644 --- a/src/backend/access/nbtree/nbtsort.c +++ b/src/backend/access/nbtree/nbtsort.c @@ -23,18 +23,13 @@ * many upper pages if the keys are reasonable-size) without risking a lot of * cascading splits during early insertions. * - * Formerly the index pages being built were kept in shared buffers, but - * that is of no value (since other backends have no interest in them yet) - * and it created locking problems for CHECKPOINT, because the upper-level - * pages were held exclusive-locked for long periods. Now we just build - * the pages in local memory and smgrwrite or smgrextend them as we finish - * them. They will need to be re-read into shared buffers on first use after - * the build finishes. + * We use the bulk smgr loading facility to bypass the buffer cache and + * WAL-log the pages efficiently. * * This code isn't concerned about the FSM at all. The caller is responsible * for initializing that. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -50,14 +45,13 @@ #include "access/relscan.h" #include "access/table.h" #include "access/xact.h" -#include "access/xlog.h" #include "access/xloginsert.h" #include "catalog/index.h" #include "commands/progress.h" #include "executor/instrument.h" #include "miscadmin.h" #include "pgstat.h" -#include "storage/smgr.h" +#include "storage/bulk_write.h" #include "tcop/tcopprot.h" /* pgrminclude ignore */ #include "utils/rel.h" #include "utils/sortsupport.h" @@ -234,7 +228,7 @@ typedef struct BTBuildState */ typedef struct BTPageState { - Page btps_page; /* workspace for page building */ + BulkWriteBuffer btps_buf; /* workspace for page building */ BlockNumber btps_blkno; /* block # to write this page at */ IndexTuple btps_lowkey; /* page's strict lower bound pivot tuple */ OffsetNumber btps_lastoff; /* last item offset loaded */ @@ -251,11 +245,9 @@ typedef struct BTWriteState { Relation heap; Relation index; + BulkWriteState *bulkstate; BTScanInsert inskey; /* generic insertion scankey */ - bool btws_use_wal; /* dump pages to WAL? */ BlockNumber btws_pages_alloced; /* # pages allocated */ - BlockNumber btws_pages_written; /* # pages written out */ - Page btws_zeropage; /* workspace for filling zeroes */ } BTWriteState; @@ -267,7 +259,7 @@ static void _bt_spool(BTSpool *btspool, ItemPointer self, static void _bt_leafbuild(BTSpool *btspool, BTSpool *btspool2); static void _bt_build_callback(Relation index, ItemPointer tid, Datum *values, bool *isnull, bool tupleIsAlive, void *state); -static Page _bt_blnewpage(uint32 level); +static BulkWriteBuffer _bt_blnewpage(BTWriteState *wstate, uint32 level); static BTPageState *_bt_pagestate(BTWriteState *wstate, uint32 level); static void _bt_slideleft(Page rightmostpage); static void _bt_sortaddtup(Page page, Size itemsize, @@ -569,12 +561,9 @@ _bt_leafbuild(BTSpool *btspool, BTSpool *btspool2) wstate.inskey = _bt_mkscankey(wstate.index, NULL); /* _bt_mkscankey() won't set allequalimage without metapage */ wstate.inskey->allequalimage = _bt_allequalimage(wstate.index, true); - wstate.btws_use_wal = RelationNeedsWAL(wstate.index); /* reserve the metapage */ wstate.btws_pages_alloced = BTREE_METAPAGE + 1; - wstate.btws_pages_written = 0; - wstate.btws_zeropage = NULL; /* until needed */ pgstat_progress_update_param(PROGRESS_CREATEIDX_SUBPHASE, PROGRESS_BTREE_PHASE_LEAF_LOAD); @@ -613,13 +602,15 @@ _bt_build_callback(Relation index, /* * allocate workspace for a new, clean btree page, not linked to any siblings. */ -static Page -_bt_blnewpage(uint32 level) +static BulkWriteBuffer +_bt_blnewpage(BTWriteState *wstate, uint32 level) { + BulkWriteBuffer buf; Page page; BTPageOpaque opaque; - page = (Page) palloc_aligned(BLCKSZ, PG_IO_ALIGN_SIZE, 0); + buf = smgr_bulk_get_buf(wstate->bulkstate); + page = (Page) buf; /* Zero the page and set up standard page header info */ _bt_pageinit(page, BLCKSZ); @@ -634,63 +625,17 @@ _bt_blnewpage(uint32 level) /* Make the P_HIKEY line pointer appear allocated */ ((PageHeader) page)->pd_lower += sizeof(ItemIdData); - return page; + return buf; } /* * emit a completed btree page, and release the working storage. */ static void -_bt_blwritepage(BTWriteState *wstate, Page page, BlockNumber blkno) +_bt_blwritepage(BTWriteState *wstate, BulkWriteBuffer buf, BlockNumber blkno) { - /* XLOG stuff */ - if (wstate->btws_use_wal) - { - /* We use the XLOG_FPI record type for this */ - log_newpage(&wstate->index->rd_locator, MAIN_FORKNUM, blkno, page, true); - } - - /* - * If we have to write pages nonsequentially, fill in the space with - * zeroes until we come back and overwrite. This is not logically - * necessary on standard Unix filesystems (unwritten space will read as - * zeroes anyway), but it should help to avoid fragmentation. The dummy - * pages aren't WAL-logged though. - */ - while (blkno > wstate->btws_pages_written) - { - if (!wstate->btws_zeropage) - wstate->btws_zeropage = (Page) palloc_aligned(BLCKSZ, - PG_IO_ALIGN_SIZE, - MCXT_ALLOC_ZERO); - /* don't set checksum for all-zero page */ - smgrextend(RelationGetSmgr(wstate->index), MAIN_FORKNUM, - wstate->btws_pages_written++, - wstate->btws_zeropage, - true); - } - - PageSetChecksumInplace(page, blkno); - - /* - * Now write the page. There's no need for smgr to schedule an fsync for - * this write; we'll do it ourselves before ending the build. - */ - if (blkno == wstate->btws_pages_written) - { - /* extending the file... */ - smgrextend(RelationGetSmgr(wstate->index), MAIN_FORKNUM, blkno, - page, true); - wstate->btws_pages_written++; - } - else - { - /* overwriting a block we zero-filled before */ - smgrwrite(RelationGetSmgr(wstate->index), MAIN_FORKNUM, blkno, - page, true); - } - - pfree(page); + smgr_bulk_write(wstate->bulkstate, blkno, buf, true); + /* smgr_bulk_write took ownership of 'buf' */ } /* @@ -703,7 +648,7 @@ _bt_pagestate(BTWriteState *wstate, uint32 level) BTPageState *state = (BTPageState *) palloc0(sizeof(BTPageState)); /* create initial page for level */ - state->btps_page = _bt_blnewpage(level); + state->btps_buf = _bt_blnewpage(wstate, level); /* and assign it a page position */ state->btps_blkno = wstate->btws_pages_alloced++; @@ -839,6 +784,7 @@ static void _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup, Size truncextra) { + BulkWriteBuffer nbuf; Page npage; BlockNumber nblkno; OffsetNumber last_off; @@ -853,7 +799,8 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup, */ CHECK_FOR_INTERRUPTS(); - npage = state->btps_page; + nbuf = state->btps_buf; + npage = (Page) nbuf; nblkno = state->btps_blkno; last_off = state->btps_lastoff; last_truncextra = state->btps_lastextra; @@ -909,6 +856,7 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup, /* * Finish off the page and write it out. */ + BulkWriteBuffer obuf = nbuf; Page opage = npage; BlockNumber oblkno = nblkno; ItemId ii; @@ -916,7 +864,8 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup, IndexTuple oitup; /* Create new page of same level */ - npage = _bt_blnewpage(state->btps_level); + nbuf = _bt_blnewpage(wstate, state->btps_level); + npage = (Page) nbuf; /* and assign it a page position */ nblkno = wstate->btws_pages_alloced++; @@ -1028,10 +977,10 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup, } /* - * Write out the old page. We never need to touch it again, so we can - * free the opage workspace too. + * Write out the old page. _bt_blwritepage takes ownership of the + * 'opage' buffer. */ - _bt_blwritepage(wstate, opage, oblkno); + _bt_blwritepage(wstate, obuf, oblkno); /* * Reset last_off to point to new page @@ -1064,7 +1013,7 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup, _bt_sortaddtup(npage, itupsz, itup, last_off, !isleaf && last_off == P_FIRSTKEY); - state->btps_page = npage; + state->btps_buf = nbuf; state->btps_blkno = nblkno; state->btps_lastoff = last_off; } @@ -1116,7 +1065,7 @@ _bt_uppershutdown(BTWriteState *wstate, BTPageState *state) BTPageState *s; BlockNumber rootblkno = P_NONE; uint32 rootlevel = 0; - Page metapage; + BulkWriteBuffer metabuf; /* * Each iteration of this loop completes one more level of the tree. @@ -1127,7 +1076,7 @@ _bt_uppershutdown(BTWriteState *wstate, BTPageState *state) BTPageOpaque opaque; blkno = s->btps_blkno; - opaque = BTPageGetOpaque(s->btps_page); + opaque = BTPageGetOpaque((Page) s->btps_buf); /* * We have to link the last page on this level to somewhere. @@ -1161,9 +1110,9 @@ _bt_uppershutdown(BTWriteState *wstate, BTPageState *state) * This is the rightmost page, so the ItemId array needs to be slid * back one slot. Then we can dump out the page. */ - _bt_slideleft(s->btps_page); - _bt_blwritepage(wstate, s->btps_page, s->btps_blkno); - s->btps_page = NULL; /* writepage freed the workspace */ + _bt_slideleft((Page) s->btps_buf); + _bt_blwritepage(wstate, s->btps_buf, s->btps_blkno); + s->btps_buf = NULL; /* writepage took ownership of the buffer */ } /* @@ -1172,10 +1121,10 @@ _bt_uppershutdown(BTWriteState *wstate, BTPageState *state) * set to point to "P_NONE"). This changes the index to the "valid" state * by filling in a valid magic number in the metapage. */ - metapage = (Page) palloc_aligned(BLCKSZ, PG_IO_ALIGN_SIZE, 0); - _bt_initmetapage(metapage, rootblkno, rootlevel, + metabuf = smgr_bulk_get_buf(wstate->bulkstate); + _bt_initmetapage((Page) metabuf, rootblkno, rootlevel, wstate->inskey->allequalimage); - _bt_blwritepage(wstate, metapage, BTREE_METAPAGE); + _bt_blwritepage(wstate, metabuf, BTREE_METAPAGE); } /* @@ -1197,6 +1146,8 @@ _bt_load(BTWriteState *wstate, BTSpool *btspool, BTSpool *btspool2) int64 tuples_done = 0; bool deduplicate; + wstate->bulkstate = smgr_bulk_start_rel(wstate->index, MAIN_FORKNUM); + deduplicate = wstate->inskey->allequalimage && !btspool->isunique && BTGetDeduplicateItems(wstate->index); @@ -1352,7 +1303,7 @@ _bt_load(BTWriteState *wstate, BTSpool *btspool, BTSpool *btspool2) */ dstate->maxpostingsize = MAXALIGN_DOWN((BLCKSZ * 10 / 100)) - sizeof(ItemIdData); - Assert(dstate->maxpostingsize <= BTMaxItemSize(state->btps_page) && + Assert(dstate->maxpostingsize <= BTMaxItemSize((Page) state->btps_buf) && dstate->maxpostingsize <= INDEX_SIZE_MASK); dstate->htids = palloc(dstate->maxpostingsize); @@ -1422,18 +1373,7 @@ _bt_load(BTWriteState *wstate, BTSpool *btspool, BTSpool *btspool2) /* Close down final pages and write the metapage */ _bt_uppershutdown(wstate, state); - - /* - * When we WAL-logged index pages, we must nonetheless fsync index files. - * Since we're building outside shared buffers, a CHECKPOINT occurring - * during the build has no way to flush the previously written data to - * disk (indeed it won't know the index even exists). A crash later on - * would replay WAL from the checkpoint, therefore it wouldn't replay our - * earlier WAL entries. If we do not fsync those pages here, they might - * still not be on disk when the crash occurs. - */ - if (wstate->btws_use_wal) - smgrimmedsync(RelationGetSmgr(wstate->index), MAIN_FORKNUM); + smgr_bulk_finish(wstate->bulkstate); } /* diff --git a/src/backend/access/nbtree/nbtsplitloc.c b/src/backend/access/nbtree/nbtsplitloc.c index 43b67893d9461..1f40d40263e93 100644 --- a/src/backend/access/nbtree/nbtsplitloc.c +++ b/src/backend/access/nbtree/nbtsplitloc.c @@ -3,7 +3,7 @@ * nbtsplitloc.c * Choose split point code for Postgres btree implementation. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -15,14 +15,14 @@ #include "postgres.h" #include "access/nbtree.h" -#include "storage/lmgr.h" +#include "common/int.h" typedef enum { /* strategy for searching through materialized list of split points */ SPLIT_DEFAULT, /* give some weight to truncation */ SPLIT_MANY_DUPLICATES, /* find minimally distinguishing point */ - SPLIT_SINGLE_VALUE /* leave left page almost full */ + SPLIT_SINGLE_VALUE, /* leave left page almost full */ } FindSplitStrat; typedef struct @@ -596,12 +596,7 @@ _bt_splitcmp(const void *arg1, const void *arg2) SplitPoint *split1 = (SplitPoint *) arg1; SplitPoint *split2 = (SplitPoint *) arg2; - if (split1->curdelta > split2->curdelta) - return 1; - if (split1->curdelta < split2->curdelta) - return -1; - - return 0; + return pg_cmp_s16(split1->curdelta, split2->curdelta); } /* diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c index 7da499c4dd55d..878f4b2e7b843 100644 --- a/src/backend/access/nbtree/nbtutils.c +++ b/src/backend/access/nbtree/nbtutils.c @@ -3,7 +3,7 @@ * nbtutils.c * Utility code for Postgres btree implementation. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -20,7 +20,6 @@ #include "access/nbtree.h" #include "access/reloptions.h" #include "access/relscan.h" -#include "catalog/catalog.h" #include "commands/progress.h" #include "lib/qunique.h" #include "miscadmin.h" @@ -30,29 +29,77 @@ #include "utils/memutils.h" #include "utils/rel.h" +#define LOOK_AHEAD_REQUIRED_RECHECKS 3 +#define LOOK_AHEAD_DEFAULT_DISTANCE 5 typedef struct BTSortArrayContext { - FmgrInfo flinfo; + FmgrInfo *sortproc; Oid collation; bool reverse; } BTSortArrayContext; +typedef struct BTScanKeyPreproc +{ + ScanKey skey; + int ikey; + int arrayidx; +} BTScanKeyPreproc; + +static void _bt_setup_array_cmp(IndexScanDesc scan, ScanKey skey, Oid elemtype, + FmgrInfo *orderproc, FmgrInfo **sortprocp); static Datum _bt_find_extreme_element(IndexScanDesc scan, ScanKey skey, - StrategyNumber strat, + Oid elemtype, StrategyNumber strat, Datum *elems, int nelems); -static int _bt_sort_array_elements(IndexScanDesc scan, ScanKey skey, - bool reverse, - Datum *elems, int nelems); +static int _bt_sort_array_elements(ScanKey skey, FmgrInfo *sortproc, + bool reverse, Datum *elems, int nelems); +static bool _bt_merge_arrays(IndexScanDesc scan, ScanKey skey, + FmgrInfo *sortproc, bool reverse, + Oid origelemtype, Oid nextelemtype, + Datum *elems_orig, int *nelems_orig, + Datum *elems_next, int nelems_next); +static bool _bt_compare_array_scankey_args(IndexScanDesc scan, + ScanKey arraysk, ScanKey skey, + FmgrInfo *orderproc, BTArrayKeyInfo *array, + bool *qual_ok); +static ScanKey _bt_preprocess_array_keys(IndexScanDesc scan); +static void _bt_preprocess_array_keys_final(IndexScanDesc scan, int *keyDataMap); static int _bt_compare_array_elements(const void *a, const void *b, void *arg); +static inline int32 _bt_compare_array_skey(FmgrInfo *orderproc, + Datum tupdatum, bool tupnull, + Datum arrdatum, ScanKey cur); +static int _bt_binsrch_array_skey(FmgrInfo *orderproc, + bool cur_elem_trig, ScanDirection dir, + Datum tupdatum, bool tupnull, + BTArrayKeyInfo *array, ScanKey cur, + int32 *set_elem_result); +static bool _bt_advance_array_keys_increment(IndexScanDesc scan, ScanDirection dir); +static void _bt_rewind_nonrequired_arrays(IndexScanDesc scan, ScanDirection dir); +static bool _bt_tuple_before_array_skeys(IndexScanDesc scan, ScanDirection dir, + IndexTuple tuple, TupleDesc tupdesc, int tupnatts, + bool readpagetup, int sktrig, bool *scanBehind); +static bool _bt_advance_array_keys(IndexScanDesc scan, BTReadPageState *pstate, + IndexTuple tuple, int tupnatts, TupleDesc tupdesc, + int sktrig, bool sktrig_required); +#ifdef USE_ASSERT_CHECKING +static bool _bt_verify_arrays_bt_first(IndexScanDesc scan, ScanDirection dir); +static bool _bt_verify_keys_with_arraykeys(IndexScanDesc scan); +#endif static bool _bt_compare_scankey_args(IndexScanDesc scan, ScanKey op, ScanKey leftarg, ScanKey rightarg, + BTArrayKeyInfo *array, FmgrInfo *orderproc, bool *result); static bool _bt_fix_scankey_strategy(ScanKey skey, int16 *indoption); static void _bt_mark_scankey_required(ScanKey skey); +static bool _bt_check_compare(IndexScanDesc scan, ScanDirection dir, + IndexTuple tuple, int tupnatts, TupleDesc tupdesc, + bool advancenonrequired, bool prechecked, bool firstmatch, + bool *continuescan, int *ikey); static bool _bt_check_rowcompare(ScanKey skey, IndexTuple tuple, int tupnatts, TupleDesc tupdesc, ScanDirection dir, bool *continuescan); +static void _bt_checkkeys_look_ahead(IndexScanDesc scan, BTReadPageState *pstate, + int tupnatts, TupleDesc tupdesc); static int _bt_keep_natts(Relation rel, IndexTuple lastleft, IndexTuple firstright, BTScanInsert itup_key); @@ -62,14 +109,6 @@ static int _bt_keep_natts(Relation rel, IndexTuple lastleft, * Build an insertion scan key that contains comparison data from itup * as well as comparator routines appropriate to the key datatypes. * - * When itup is a non-pivot tuple, the returned insertion scan key is - * suitable for finding a place for it to go on the leaf level. Pivot - * tuples can be used to re-find leaf page with matching high key, but - * then caller needs to set scan key's pivotsearch field to true. This - * allows caller to search for a leaf page with a matching high key, - * which is usually to the left of the first leaf page a non-pivot match - * might appear on. - * * The result is intended for use with _bt_compare() and _bt_truncate(). * Callers that don't need to fill out the insertion scankey arguments * (e.g. they use an ad-hoc comparison routine, or only need a scankey @@ -120,8 +159,8 @@ _bt_mkscankey(Relation rel, IndexTuple itup) key->allequalimage = false; } key->anynullkeys = false; /* initial assumption */ - key->nextkey = false; - key->pivotsearch = false; + key->nextkey = false; /* usual case, required by btinsert */ + key->backward = false; /* usual case, required by btinsert */ key->keysz = Min(indnkeyatts, tupnatts); key->scantid = key->heapkeyspace && itup ? BTreeTupleGetHeapTID(itup) : NULL; @@ -197,29 +236,55 @@ _bt_freestack(BTStack stack) * * If there are any SK_SEARCHARRAY scan keys, deconstruct the array(s) and * set up BTArrayKeyInfo info for each one that is an equality-type key. - * Prepare modified scan keys in so->arrayKeyData, which will hold the current - * array elements during each primitive indexscan operation. For inequality - * array keys, it's sufficient to find the extreme element value and replace - * the whole array with that scalar value. - * - * Note: the reason we need so->arrayKeyData, rather than just scribbling - * on scan->keyData, is that callers are permitted to call btrescan without - * supplying a new set of scankey data. + * Returns modified scan keys as input for further, standard preprocessing. + * + * Currently we perform two kinds of preprocessing to deal with redundancies. + * For inequality array keys, it's sufficient to find the extreme element + * value and replace the whole array with that scalar value. This eliminates + * all but one array element as redundant. Similarly, we are capable of + * "merging together" multiple equality array keys (from two or more input + * scan keys) into a single output scan key containing only the intersecting + * array elements. This can eliminate many redundant array elements, as well + * as eliminating whole array scan keys as redundant. It can also allow us to + * detect contradictory quals. + * + * It is convenient for _bt_preprocess_keys caller to have to deal with no + * more than one equality strategy array scan key per index attribute. We'll + * always be able to set things up that way when complete opfamilies are used. + * Eliminated array scan keys can be recognized as those that have had their + * sk_strategy field set to InvalidStrategy here by us. Caller should avoid + * including these in the scan's so->keyData[] output array. + * + * We set the scan key references from the scan's BTArrayKeyInfo info array to + * offsets into the temp modified input array returned to caller. Scans that + * have array keys should call _bt_preprocess_array_keys_final when standard + * preprocessing steps are complete. This will convert the scan key offset + * references into references to the scan's so->keyData[] output scan keys. + * + * Note: the reason we need to return a temp scan key array, rather than just + * scribbling on scan->keyData, is that callers are permitted to call btrescan + * without supplying a new set of scankey data. */ -void +static ScanKey _bt_preprocess_array_keys(IndexScanDesc scan) { BTScanOpaque so = (BTScanOpaque) scan->opaque; + Relation rel = scan->indexRelation; int numberOfKeys = scan->numberOfKeys; - int16 *indoption = scan->indexRelation->rd_indoption; + int16 *indoption = rel->rd_indoption; int numArrayKeys; + int origarrayatt = InvalidAttrNumber, + origarraykey = -1; + Oid origelemtype = InvalidOid; ScanKey cur; - int i; MemoryContext oldContext; + ScanKey arrayKeyData; /* modified copy of scan->keyData */ + + Assert(numberOfKeys); /* Quick check to see if there are any array keys */ numArrayKeys = 0; - for (i = 0; i < numberOfKeys; i++) + for (int i = 0; i < numberOfKeys; i++) { cur = &scan->keyData[i]; if (cur->sk_flags & SK_SEARCHARRAY) @@ -229,20 +294,15 @@ _bt_preprocess_array_keys(IndexScanDesc scan) /* If any arrays are null as a whole, we can quit right now. */ if (cur->sk_flags & SK_ISNULL) { - so->numArrayKeys = -1; - so->arrayKeyData = NULL; - return; + so->qual_ok = false; + return NULL; } } } /* Quit if nothing to do. */ if (numArrayKeys == 0) - { - so->numArrayKeys = 0; - so->arrayKeyData = NULL; - return; - } + return NULL; /* * Make a scan-lifespan context to hold array-associated data, or reset it @@ -258,18 +318,23 @@ _bt_preprocess_array_keys(IndexScanDesc scan) oldContext = MemoryContextSwitchTo(so->arrayContext); /* Create modifiable copy of scan->keyData in the workspace context */ - so->arrayKeyData = (ScanKey) palloc(scan->numberOfKeys * sizeof(ScanKeyData)); - memcpy(so->arrayKeyData, - scan->keyData, - scan->numberOfKeys * sizeof(ScanKeyData)); + arrayKeyData = (ScanKey) palloc(numberOfKeys * sizeof(ScanKeyData)); + memcpy(arrayKeyData, scan->keyData, numberOfKeys * sizeof(ScanKeyData)); /* Allocate space for per-array data in the workspace context */ - so->arrayKeys = (BTArrayKeyInfo *) palloc0(numArrayKeys * sizeof(BTArrayKeyInfo)); + so->arrayKeys = (BTArrayKeyInfo *) palloc(numArrayKeys * sizeof(BTArrayKeyInfo)); + + /* Allocate space for ORDER procs used to help _bt_checkkeys */ + so->orderProcs = (FmgrInfo *) palloc(numberOfKeys * sizeof(FmgrInfo)); /* Now process each array key */ numArrayKeys = 0; - for (i = 0; i < numberOfKeys; i++) + for (int i = 0; i < numberOfKeys; i++) { + FmgrInfo sortproc; + FmgrInfo *sortprocp = &sortproc; + Oid elemtype; + bool reverse; ArrayType *arrayval; int16 elmlen; bool elmbyval; @@ -280,7 +345,7 @@ _bt_preprocess_array_keys(IndexScanDesc scan) int num_nonnulls; int j; - cur = &so->arrayKeyData[i]; + cur = &arrayKeyData[i]; if (!(cur->sk_flags & SK_SEARCHARRAY)) continue; @@ -314,10 +379,20 @@ _bt_preprocess_array_keys(IndexScanDesc scan) /* If there's no non-nulls, the scan qual is unsatisfiable */ if (num_nonnulls == 0) { - numArrayKeys = -1; + so->qual_ok = false; break; } + /* + * Determine the nominal datatype of the array elements. We have to + * support the convention that sk_subtype == InvalidOid means the + * opclass input type; this is a hack to simplify life for + * ScanKeyInit(). + */ + elemtype = cur->sk_subtype; + if (elemtype == InvalidOid) + elemtype = rel->rd_opcintype[cur->sk_attno - 1]; + /* * If the comparison operator is not equality, then the array qual * degenerates to a simple comparison against the smallest or largest @@ -328,7 +403,7 @@ _bt_preprocess_array_keys(IndexScanDesc scan) case BTLessStrategyNumber: case BTLessEqualStrategyNumber: cur->sk_argument = - _bt_find_extreme_element(scan, cur, + _bt_find_extreme_element(scan, cur, elemtype, BTGreaterStrategyNumber, elem_values, num_nonnulls); continue; @@ -338,7 +413,7 @@ _bt_preprocess_array_keys(IndexScanDesc scan) case BTGreaterEqualStrategyNumber: case BTGreaterStrategyNumber: cur->sk_argument = - _bt_find_extreme_element(scan, cur, + _bt_find_extreme_element(scan, cur, elemtype, BTLessStrategyNumber, elem_values, num_nonnulls); continue; @@ -348,17 +423,93 @@ _bt_preprocess_array_keys(IndexScanDesc scan) break; } + /* + * We'll need a 3-way ORDER proc to perform binary searches for the + * next matching array element. Set that up now. + * + * Array scan keys with cross-type equality operators will require a + * separate same-type ORDER proc for sorting their array. Otherwise, + * sortproc just points to the same proc used during binary searches. + */ + _bt_setup_array_cmp(scan, cur, elemtype, + &so->orderProcs[i], &sortprocp); + /* * Sort the non-null elements and eliminate any duplicates. We must * sort in the same ordering used by the index column, so that the - * successive primitive indexscans produce data in index order. + * arrays can be advanced in lockstep with the scan's progress through + * the index's key space. */ - num_elems = _bt_sort_array_elements(scan, cur, - (indoption[cur->sk_attno - 1] & INDOPTION_DESC) != 0, + reverse = (indoption[cur->sk_attno - 1] & INDOPTION_DESC) != 0; + num_elems = _bt_sort_array_elements(cur, sortprocp, reverse, elem_values, num_nonnulls); + if (origarrayatt == cur->sk_attno) + { + BTArrayKeyInfo *orig = &so->arrayKeys[origarraykey]; + + /* + * This array scan key is redundant with a previous equality + * operator array scan key. Merge the two arrays together to + * eliminate contradictory non-intersecting elements (or try to). + * + * We merge this next array back into attribute's original array. + */ + Assert(arrayKeyData[orig->scan_key].sk_attno == cur->sk_attno); + Assert(arrayKeyData[orig->scan_key].sk_collation == + cur->sk_collation); + if (_bt_merge_arrays(scan, cur, sortprocp, reverse, + origelemtype, elemtype, + orig->elem_values, &orig->num_elems, + elem_values, num_elems)) + { + /* Successfully eliminated this array */ + pfree(elem_values); + + /* + * If no intersecting elements remain in the original array, + * the scan qual is unsatisfiable + */ + if (orig->num_elems == 0) + { + so->qual_ok = false; + break; + } + + /* + * Indicate to _bt_preprocess_keys caller that it must ignore + * this scan key + */ + cur->sk_strategy = InvalidStrategy; + continue; + } + + /* + * Unable to merge this array with previous array due to a lack of + * suitable cross-type opfamily support. Will need to keep both + * scan keys/arrays. + */ + } + else + { + /* + * This array is the first for current index attribute. + * + * If it turns out to not be the last array (that is, if the next + * array is redundantly applied to this same index attribute), + * we'll then treat this array as the attribute's "original" array + * when merging. + */ + origarrayatt = cur->sk_attno; + origarraykey = numArrayKeys; + origelemtype = elemtype; + } + /* * And set up the BTArrayKeyInfo data. + * + * Note: _bt_preprocess_array_keys_final will fix-up each array's + * scan_key field later on, after so->keyData[] has been finalized. */ so->arrayKeys[numArrayKeys].scan_key = i; so->arrayKeys[numArrayKeys].num_elems = num_elems; @@ -369,6 +520,262 @@ _bt_preprocess_array_keys(IndexScanDesc scan) so->numArrayKeys = numArrayKeys; MemoryContextSwitchTo(oldContext); + + return arrayKeyData; +} + +/* + * _bt_preprocess_array_keys_final() -- fix up array scan key references + * + * When _bt_preprocess_array_keys performed initial array preprocessing, it + * set each array's array->scan_key to the array's arrayKeys[] entry offset + * (that also work as references into the original scan->keyData[] array). + * This function handles translation of the scan key references from the + * BTArrayKeyInfo info array, from input scan key references (to the keys in + * scan->keyData[]), into output references (to the keys in so->keyData[]). + * Caller's keyDataMap[] array tells us how to perform this remapping. + * + * Also finalizes so->orderProcs[] for the scan. Arrays already have an ORDER + * proc, which might need to be repositioned to its so->keyData[]-wise offset + * (very much like the remapping that we apply to array->scan_key references). + * Non-array equality strategy scan keys (that survived preprocessing) don't + * yet have an so->orderProcs[] entry, so we set one for them here. + * + * Also converts single-element array scan keys into equivalent non-array + * equality scan keys, which decrements so->numArrayKeys. It's possible that + * this will leave this new btrescan without any arrays at all. This isn't + * necessary for correctness; it's just an optimization. Non-array equality + * scan keys are slightly faster than equivalent array scan keys at runtime. + */ +static void +_bt_preprocess_array_keys_final(IndexScanDesc scan, int *keyDataMap) +{ + BTScanOpaque so = (BTScanOpaque) scan->opaque; + Relation rel = scan->indexRelation; + int arrayidx = 0; + int last_equal_output_ikey PG_USED_FOR_ASSERTS_ONLY = -1; + + Assert(so->qual_ok); + + /* + * Nothing for us to do when _bt_preprocess_array_keys only had to deal + * with array inequalities + */ + if (so->numArrayKeys == 0) + return; + + for (int output_ikey = 0; output_ikey < so->numberOfKeys; output_ikey++) + { + ScanKey outkey = so->keyData + output_ikey; + int input_ikey; + bool found PG_USED_FOR_ASSERTS_ONLY = false; + + Assert(outkey->sk_strategy != InvalidStrategy); + + if (outkey->sk_strategy != BTEqualStrategyNumber) + continue; + + input_ikey = keyDataMap[output_ikey]; + + Assert(last_equal_output_ikey < output_ikey); + Assert(last_equal_output_ikey < input_ikey); + last_equal_output_ikey = output_ikey; + + /* + * We're lazy about looking up ORDER procs for non-array keys, since + * not all input keys become output keys. Take care of it now. + */ + if (!(outkey->sk_flags & SK_SEARCHARRAY)) + { + Oid elemtype; + + /* No need for an ORDER proc given an IS NULL scan key */ + if (outkey->sk_flags & SK_SEARCHNULL) + continue; + + /* + * A non-required scan key doesn't need an ORDER proc, either + * (unless it's associated with an array, which this one isn't) + */ + if (!(outkey->sk_flags & SK_BT_REQFWD)) + continue; + + elemtype = outkey->sk_subtype; + if (elemtype == InvalidOid) + elemtype = rel->rd_opcintype[outkey->sk_attno - 1]; + + _bt_setup_array_cmp(scan, outkey, elemtype, + &so->orderProcs[output_ikey], NULL); + continue; + } + + /* + * Reorder existing array scan key so->orderProcs[] entries. + * + * Doing this in-place is safe because preprocessing is required to + * output all equality strategy scan keys in original input order + * (among each group of entries against the same index attribute). + * This is also the order that the arrays themselves appear in. + */ + so->orderProcs[output_ikey] = so->orderProcs[input_ikey]; + + /* Fix-up array->scan_key references for arrays */ + for (; arrayidx < so->numArrayKeys; arrayidx++) + { + BTArrayKeyInfo *array = &so->arrayKeys[arrayidx]; + + Assert(array->num_elems > 0); + + if (array->scan_key == input_ikey) + { + /* found it */ + array->scan_key = output_ikey; + found = true; + + /* + * Transform array scan keys that have exactly 1 element + * remaining (following all prior preprocessing) into + * equivalent non-array scan keys. + */ + if (array->num_elems == 1) + { + outkey->sk_flags &= ~SK_SEARCHARRAY; + outkey->sk_argument = array->elem_values[0]; + so->numArrayKeys--; + + /* If we're out of array keys, we can quit right away */ + if (so->numArrayKeys == 0) + return; + + /* Shift other arrays forward */ + memmove(array, array + 1, + sizeof(BTArrayKeyInfo) * + (so->numArrayKeys - arrayidx)); + + /* + * Don't increment arrayidx (there was an entry that was + * just shifted forward to the offset at arrayidx, which + * will still need to be matched) + */ + } + else + { + /* Match found, so done with this array */ + arrayidx++; + } + + break; + } + } + + Assert(found); + } + + /* + * Parallel index scans require space in shared memory to store the + * current array elements (for arrays kept by preprocessing) to schedule + * the next primitive index scan. The underlying structure is protected + * using a spinlock, so defensively limit its size. In practice this can + * only affect parallel scans that use an incomplete opfamily. + */ + if (scan->parallel_scan && so->numArrayKeys > INDEX_MAX_KEYS) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg_internal("number of array scan keys left by preprocessing (%d) exceeds the maximum allowed by parallel btree index scans (%d)", + so->numArrayKeys, INDEX_MAX_KEYS))); +} + +/* + * _bt_setup_array_cmp() -- Set up array comparison functions + * + * Sets ORDER proc in caller's orderproc argument, which is used during binary + * searches of arrays during the index scan. Also sets a same-type ORDER proc + * in caller's *sortprocp argument, which is used when sorting the array. + * + * Preprocessing calls here with all equality strategy scan keys (when scan + * uses equality array keys), including those not associated with any array. + * See _bt_advance_array_keys for an explanation of why it'll need to treat + * simple scalar equality scan keys as degenerate single element arrays. + * + * Caller should pass an orderproc pointing to space that'll store the ORDER + * proc for the scan, and a *sortprocp pointing to its own separate space. + * When calling here for a non-array scan key, sortprocp arg should be NULL. + * + * In the common case where we don't need to deal with cross-type operators, + * only one ORDER proc is actually required by caller. We'll set *sortprocp + * to point to the same memory that caller's orderproc continues to point to. + * Otherwise, *sortprocp will continue to point to caller's own space. Either + * way, *sortprocp will point to a same-type ORDER proc (since that's the only + * safe way to sort/deduplicate the array associated with caller's scan key). + */ +static void +_bt_setup_array_cmp(IndexScanDesc scan, ScanKey skey, Oid elemtype, + FmgrInfo *orderproc, FmgrInfo **sortprocp) +{ + BTScanOpaque so = (BTScanOpaque) scan->opaque; + Relation rel = scan->indexRelation; + RegProcedure cmp_proc; + Oid opcintype = rel->rd_opcintype[skey->sk_attno - 1]; + + Assert(skey->sk_strategy == BTEqualStrategyNumber); + Assert(OidIsValid(elemtype)); + + /* + * If scankey operator is not a cross-type comparison, we can use the + * cached comparison function; otherwise gotta look it up in the catalogs + */ + if (elemtype == opcintype) + { + /* Set same-type ORDER procs for caller */ + *orderproc = *index_getprocinfo(rel, skey->sk_attno, BTORDER_PROC); + if (sortprocp) + *sortprocp = orderproc; + + return; + } + + /* + * Look up the appropriate cross-type comparison function in the opfamily. + * + * Use the opclass input type as the left hand arg type, and the array + * element type as the right hand arg type (since binary searches use an + * index tuple's attribute value to search for a matching array element). + * + * Note: it's possible that this would fail, if the opfamily is + * incomplete, but only in cases where it's quite likely that _bt_first + * would fail in just the same way (had we not failed before it could). + */ + cmp_proc = get_opfamily_proc(rel->rd_opfamily[skey->sk_attno - 1], + opcintype, elemtype, BTORDER_PROC); + if (!RegProcedureIsValid(cmp_proc)) + elog(ERROR, "missing support function %d(%u,%u) for attribute %d of index \"%s\"", + BTORDER_PROC, opcintype, elemtype, skey->sk_attno, + RelationGetRelationName(rel)); + + /* Set cross-type ORDER proc for caller */ + fmgr_info_cxt(cmp_proc, orderproc, so->arrayContext); + + /* Done if caller doesn't actually have an array they'll need to sort */ + if (!sortprocp) + return; + + /* + * Look up the appropriate same-type comparison function in the opfamily. + * + * Note: it's possible that this would fail, if the opfamily is + * incomplete, but it seems quite unlikely that an opfamily would omit + * non-cross-type comparison procs for any datatype that it supports at + * all. + */ + cmp_proc = get_opfamily_proc(rel->rd_opfamily[skey->sk_attno - 1], + elemtype, elemtype, BTORDER_PROC); + if (!RegProcedureIsValid(cmp_proc)) + elog(ERROR, "missing support function %d(%u,%u) for attribute %d of index \"%s\"", + BTORDER_PROC, elemtype, elemtype, + skey->sk_attno, RelationGetRelationName(rel)); + + /* Set same-type ORDER proc for caller */ + fmgr_info_cxt(cmp_proc, *sortprocp, so->arrayContext); } /* @@ -379,27 +786,17 @@ _bt_preprocess_array_keys(IndexScanDesc scan) * least element, or BTGreaterStrategyNumber to get the greatest. */ static Datum -_bt_find_extreme_element(IndexScanDesc scan, ScanKey skey, +_bt_find_extreme_element(IndexScanDesc scan, ScanKey skey, Oid elemtype, StrategyNumber strat, Datum *elems, int nelems) { Relation rel = scan->indexRelation; - Oid elemtype, - cmp_op; + Oid cmp_op; RegProcedure cmp_proc; FmgrInfo flinfo; Datum result; int i; - /* - * Determine the nominal datatype of the array elements. We have to - * support the convention that sk_subtype == InvalidOid means the opclass - * input type; this is a hack to simplify life for ScanKeyInit(). - */ - elemtype = skey->sk_subtype; - if (elemtype == InvalidOid) - elemtype = rel->rd_opcintype[skey->sk_attno - 1]; - /* * Look up the appropriate comparison operator in the opfamily. * @@ -408,6 +805,8 @@ _bt_find_extreme_element(IndexScanDesc scan, ScanKey skey, * non-cross-type comparison operators for any datatype that it supports * at all. */ + Assert(skey->sk_strategy != BTEqualStrategyNumber); + Assert(OidIsValid(elemtype)); cmp_op = get_opfamily_member(rel->rd_opfamily[skey->sk_attno - 1], elemtype, elemtype, @@ -442,50 +841,21 @@ _bt_find_extreme_element(IndexScanDesc scan, ScanKey skey, * The array elements are sorted in-place, and the new number of elements * after duplicate removal is returned. * - * scan and skey identify the index column, whose opfamily determines the - * comparison semantics. If reverse is true, we sort in descending order. + * skey identifies the index column whose opfamily determines the comparison + * semantics, and sortproc is a corresponding ORDER proc. If reverse is true, + * we sort in descending order. */ static int -_bt_sort_array_elements(IndexScanDesc scan, ScanKey skey, - bool reverse, +_bt_sort_array_elements(ScanKey skey, FmgrInfo *sortproc, bool reverse, Datum *elems, int nelems) { - Relation rel = scan->indexRelation; - Oid elemtype; - RegProcedure cmp_proc; BTSortArrayContext cxt; if (nelems <= 1) return nelems; /* no work to do */ - /* - * Determine the nominal datatype of the array elements. We have to - * support the convention that sk_subtype == InvalidOid means the opclass - * input type; this is a hack to simplify life for ScanKeyInit(). - */ - elemtype = skey->sk_subtype; - if (elemtype == InvalidOid) - elemtype = rel->rd_opcintype[skey->sk_attno - 1]; - - /* - * Look up the appropriate comparison function in the opfamily. - * - * Note: it's possible that this would fail, if the opfamily is - * incomplete, but it seems quite unlikely that an opfamily would omit - * non-cross-type support functions for any datatype that it supports at - * all. - */ - cmp_proc = get_opfamily_proc(rel->rd_opfamily[skey->sk_attno - 1], - elemtype, - elemtype, - BTORDER_PROC); - if (!RegProcedureIsValid(cmp_proc)) - elog(ERROR, "missing support function %d(%u,%u) in opfamily %u", - BTORDER_PROC, elemtype, elemtype, - rel->rd_opfamily[skey->sk_attno - 1]); - /* Sort the array elements */ - fmgr_info(cmp_proc, &cxt.flinfo); + cxt.sortproc = sortproc; cxt.collation = skey->sk_collation; cxt.reverse = reverse; qsort_arg(elems, nelems, sizeof(Datum), @@ -497,174 +867,1606 @@ _bt_sort_array_elements(IndexScanDesc scan, ScanKey skey, } /* - * qsort_arg comparator for sorting array elements - */ -static int -_bt_compare_array_elements(const void *a, const void *b, void *arg) -{ - Datum da = *((const Datum *) a); - Datum db = *((const Datum *) b); - BTSortArrayContext *cxt = (BTSortArrayContext *) arg; - int32 compare; - - compare = DatumGetInt32(FunctionCall2Coll(&cxt->flinfo, - cxt->collation, - da, db)); - if (cxt->reverse) - INVERT_COMPARE_RESULT(compare); - return compare; -} - -/* - * _bt_start_array_keys() -- Initialize array keys at start of a scan + * _bt_merge_arrays() -- merge next array's elements into an original array * - * Set up the cur_elem counters and fill in the first sk_argument value for - * each array scankey. We can't do this until we know the scan direction. + * Called when preprocessing encounters a pair of array equality scan keys, + * both against the same index attribute (during initial array preprocessing). + * Merging reorganizes caller's original array (the left hand arg) in-place, + * without ever copying elements from one array into the other. (Mixing the + * elements together like this would be wrong, since they don't necessarily + * use the same underlying element type, despite all the other similarities.) + * + * Both arrays must have already been sorted and deduplicated by calling + * _bt_sort_array_elements. sortproc is the same-type ORDER proc that was + * just used to sort and deduplicate caller's "next" array. We'll usually be + * able to reuse that order PROC to merge the arrays together now. If not, + * then we'll perform a separate ORDER proc lookup. + * + * If the opfamily doesn't supply a complete set of cross-type ORDER procs we + * may not be able to determine which elements are contradictory. If we have + * the required ORDER proc then we return true (and validly set *nelems_orig), + * guaranteeing that at least the next array can be considered redundant. We + * return false if the required comparisons cannot not be made (caller must + * keep both arrays when this happens). */ -void -_bt_start_array_keys(IndexScanDesc scan, ScanDirection dir) +static bool +_bt_merge_arrays(IndexScanDesc scan, ScanKey skey, FmgrInfo *sortproc, + bool reverse, Oid origelemtype, Oid nextelemtype, + Datum *elems_orig, int *nelems_orig, + Datum *elems_next, int nelems_next) { + Relation rel = scan->indexRelation; BTScanOpaque so = (BTScanOpaque) scan->opaque; - int i; + BTSortArrayContext cxt; + int nelems_orig_start = *nelems_orig, + nelems_orig_merged = 0; + FmgrInfo *mergeproc = sortproc; + FmgrInfo crosstypeproc; - for (i = 0; i < so->numArrayKeys; i++) + Assert(skey->sk_strategy == BTEqualStrategyNumber); + Assert(OidIsValid(origelemtype) && OidIsValid(nextelemtype)); + + if (origelemtype != nextelemtype) { - BTArrayKeyInfo *curArrayKey = &so->arrayKeys[i]; - ScanKey skey = &so->arrayKeyData[curArrayKey->scan_key]; + RegProcedure cmp_proc; - Assert(curArrayKey->num_elems > 0); - if (ScanDirectionIsBackward(dir)) - curArrayKey->cur_elem = curArrayKey->num_elems - 1; - else - curArrayKey->cur_elem = 0; - skey->sk_argument = curArrayKey->elem_values[curArrayKey->cur_elem]; + /* + * Cross-array-element-type merging is required, so can't just reuse + * sortproc when merging + */ + cmp_proc = get_opfamily_proc(rel->rd_opfamily[skey->sk_attno - 1], + origelemtype, nextelemtype, BTORDER_PROC); + if (!RegProcedureIsValid(cmp_proc)) + { + /* Can't make the required comparisons */ + return false; + } + + /* We have all we need to determine redundancy/contradictoriness */ + mergeproc = &crosstypeproc; + fmgr_info_cxt(cmp_proc, mergeproc, so->arrayContext); } + + cxt.sortproc = mergeproc; + cxt.collation = skey->sk_collation; + cxt.reverse = reverse; + + for (int i = 0, j = 0; i < nelems_orig_start && j < nelems_next;) + { + Datum *oelem = elems_orig + i, + *nelem = elems_next + j; + int res = _bt_compare_array_elements(oelem, nelem, &cxt); + + if (res == 0) + { + elems_orig[nelems_orig_merged++] = *oelem; + i++; + j++; + } + else if (res < 0) + i++; + else /* res > 0 */ + j++; + } + + *nelems_orig = nelems_orig_merged; + + return true; } /* - * _bt_advance_array_keys() -- Advance to next set of array elements + * Compare an array scan key to a scalar scan key, eliminating contradictory + * array elements such that the scalar scan key becomes redundant. * - * Returns true if there is another set of values to consider, false if not. - * On true result, the scankeys are initialized with the next set of values. + * Array elements can be eliminated as contradictory when excluded by some + * other operator on the same attribute. For example, with an index scan qual + * "WHERE a IN (1, 2, 3) AND a < 2", all array elements except the value "1" + * are eliminated, and the < scan key is eliminated as redundant. Cases where + * every array element is eliminated by a redundant scalar scan key have an + * unsatisfiable qual, which we handle by setting *qual_ok=false for caller. + * + * If the opfamily doesn't supply a complete set of cross-type ORDER procs we + * may not be able to determine which elements are contradictory. If we have + * the required ORDER proc then we return true (and validly set *qual_ok), + * guaranteeing that at least the scalar scan key can be considered redundant. + * We return false if the comparison could not be made (caller must keep both + * scan keys when this happens). */ -bool -_bt_advance_array_keys(IndexScanDesc scan, ScanDirection dir) +static bool +_bt_compare_array_scankey_args(IndexScanDesc scan, ScanKey arraysk, ScanKey skey, + FmgrInfo *orderproc, BTArrayKeyInfo *array, + bool *qual_ok) { - BTScanOpaque so = (BTScanOpaque) scan->opaque; - bool found = false; - int i; + Relation rel = scan->indexRelation; + Oid opcintype = rel->rd_opcintype[arraysk->sk_attno - 1]; + int cmpresult = 0, + cmpexact = 0, + matchelem, + new_nelems = 0; + FmgrInfo crosstypeproc; + FmgrInfo *orderprocp = orderproc; + + Assert(arraysk->sk_attno == skey->sk_attno); + Assert(array->num_elems > 0); + Assert(!(arraysk->sk_flags & (SK_ISNULL | SK_ROW_HEADER | SK_ROW_MEMBER))); + Assert((arraysk->sk_flags & SK_SEARCHARRAY) && + arraysk->sk_strategy == BTEqualStrategyNumber); + Assert(!(skey->sk_flags & (SK_ISNULL | SK_ROW_HEADER | SK_ROW_MEMBER))); + Assert(!(skey->sk_flags & SK_SEARCHARRAY) || + skey->sk_strategy != BTEqualStrategyNumber); /* - * We must advance the last array key most quickly, since it will - * correspond to the lowest-order index column among the available - * qualifications. This is necessary to ensure correct ordering of output - * when there are multiple array keys. + * _bt_binsrch_array_skey searches an array for the entry best matching a + * datum of opclass input type for the index's attribute (on-disk type). + * We can reuse the array's ORDER proc whenever the non-array scan key's + * type is a match for the corresponding attribute's input opclass type. + * Otherwise, we have to do another ORDER proc lookup so that our call to + * _bt_binsrch_array_skey applies the correct comparator. + * + * Note: we have to support the convention that sk_subtype == InvalidOid + * means the opclass input type; this is a hack to simplify life for + * ScanKeyInit(). */ - for (i = so->numArrayKeys - 1; i >= 0; i--) + if (skey->sk_subtype != opcintype && skey->sk_subtype != InvalidOid) { - BTArrayKeyInfo *curArrayKey = &so->arrayKeys[i]; - ScanKey skey = &so->arrayKeyData[curArrayKey->scan_key]; - int cur_elem = curArrayKey->cur_elem; - int num_elems = curArrayKey->num_elems; + RegProcedure cmp_proc; + Oid arraysk_elemtype; - if (ScanDirectionIsBackward(dir)) + /* + * Need an ORDER proc lookup to detect redundancy/contradictoriness + * with this pair of scankeys. + * + * Scalar scan key's argument will be passed to _bt_compare_array_skey + * as its tupdatum/lefthand argument (rhs arg is for array elements). + */ + arraysk_elemtype = arraysk->sk_subtype; + if (arraysk_elemtype == InvalidOid) + arraysk_elemtype = rel->rd_opcintype[arraysk->sk_attno - 1]; + cmp_proc = get_opfamily_proc(rel->rd_opfamily[arraysk->sk_attno - 1], + skey->sk_subtype, arraysk_elemtype, + BTORDER_PROC); + if (!RegProcedureIsValid(cmp_proc)) { - if (--cur_elem < 0) + /* Can't make the comparison */ + *qual_ok = false; /* suppress compiler warnings */ + return false; + } + + /* We have all we need to determine redundancy/contradictoriness */ + orderprocp = &crosstypeproc; + fmgr_info(cmp_proc, orderprocp); + } + + matchelem = _bt_binsrch_array_skey(orderprocp, false, + NoMovementScanDirection, + skey->sk_argument, false, array, + arraysk, &cmpresult); + + switch (skey->sk_strategy) + { + case BTLessStrategyNumber: + cmpexact = 1; /* exclude exact match, if any */ + /* FALL THRU */ + case BTLessEqualStrategyNumber: + if (cmpresult >= cmpexact) + matchelem++; + /* Resize, keeping elements from the start of the array */ + new_nelems = matchelem; + break; + case BTEqualStrategyNumber: + if (cmpresult != 0) { - cur_elem = num_elems - 1; - found = false; /* need to advance next array key */ + /* qual is unsatisfiable */ + new_nelems = 0; } else - found = true; + { + /* Shift matching element to the start of the array, resize */ + array->elem_values[0] = array->elem_values[matchelem]; + new_nelems = 1; + } + break; + case BTGreaterEqualStrategyNumber: + cmpexact = 1; /* include exact match, if any */ + /* FALL THRU */ + case BTGreaterStrategyNumber: + if (cmpresult >= cmpexact) + matchelem++; + /* Shift matching elements to the start of the array, resize */ + new_nelems = array->num_elems - matchelem; + memmove(array->elem_values, array->elem_values + matchelem, + sizeof(Datum) * new_nelems); + break; + default: + elog(ERROR, "unrecognized StrategyNumber: %d", + (int) skey->sk_strategy); + break; + } + + Assert(new_nelems >= 0); + Assert(new_nelems <= array->num_elems); + + array->num_elems = new_nelems; + *qual_ok = new_nelems > 0; + + return true; +} + +/* + * qsort_arg comparator for sorting array elements + */ +static int +_bt_compare_array_elements(const void *a, const void *b, void *arg) +{ + Datum da = *((const Datum *) a); + Datum db = *((const Datum *) b); + BTSortArrayContext *cxt = (BTSortArrayContext *) arg; + int32 compare; + + compare = DatumGetInt32(FunctionCall2Coll(cxt->sortproc, + cxt->collation, + da, db)); + if (cxt->reverse) + INVERT_COMPARE_RESULT(compare); + return compare; +} + +/* + * _bt_compare_array_skey() -- apply array comparison function + * + * Compares caller's tuple attribute value to a scan key/array element. + * Helper function used during binary searches of SK_SEARCHARRAY arrays. + * + * This routine returns: + * <0 if tupdatum < arrdatum; + * 0 if tupdatum == arrdatum; + * >0 if tupdatum > arrdatum. + * + * This is essentially the same interface as _bt_compare: both functions + * compare the value that they're searching for to a binary search pivot. + * However, unlike _bt_compare, this function's "tuple argument" comes first, + * while its "array/scankey argument" comes second. +*/ +static inline int32 +_bt_compare_array_skey(FmgrInfo *orderproc, + Datum tupdatum, bool tupnull, + Datum arrdatum, ScanKey cur) +{ + int32 result = 0; + + Assert(cur->sk_strategy == BTEqualStrategyNumber); + + if (tupnull) /* NULL tupdatum */ + { + if (cur->sk_flags & SK_ISNULL) + result = 0; /* NULL "=" NULL */ + else if (cur->sk_flags & SK_BT_NULLS_FIRST) + result = -1; /* NULL "<" NOT_NULL */ + else + result = 1; /* NULL ">" NOT_NULL */ + } + else if (cur->sk_flags & SK_ISNULL) /* NOT_NULL tupdatum, NULL arrdatum */ + { + if (cur->sk_flags & SK_BT_NULLS_FIRST) + result = 1; /* NOT_NULL ">" NULL */ + else + result = -1; /* NOT_NULL "<" NULL */ + } + else + { + /* + * Like _bt_compare, we need to be careful of cross-type comparisons, + * so the left value has to be the value that came from an index tuple + */ + result = DatumGetInt32(FunctionCall2Coll(orderproc, cur->sk_collation, + tupdatum, arrdatum)); + + /* + * We flip the sign by following the obvious rule: flip whenever the + * column is a DESC column. + * + * _bt_compare does it the wrong way around (flip when *ASC*) in order + * to compensate for passing its orderproc arguments backwards. We + * don't need to play these games because we find it natural to pass + * tupdatum as the left value (and arrdatum as the right value). + */ + if (cur->sk_flags & SK_BT_DESC) + INVERT_COMPARE_RESULT(result); + } + + return result; +} + +/* + * _bt_binsrch_array_skey() -- Binary search for next matching array key + * + * Returns an index to the first array element >= caller's tupdatum argument. + * This convention is more natural for forwards scan callers, but that can't + * really matter to backwards scan callers. Both callers require handling for + * the case where the match we return is < tupdatum, and symmetric handling + * for the case where our best match is > tupdatum. + * + * Also sets *set_elem_result to the result _bt_compare_array_skey returned + * when we used it to compare the matching array element to tupdatum/tupnull. + * + * cur_elem_trig indicates if array advancement was triggered by this array's + * scan key, and that the array is for a required scan key. We can apply this + * information to find the next matching array element in the current scan + * direction using far fewer comparisons (fewer on average, compared to naive + * binary search). This scheme takes advantage of an important property of + * required arrays: required arrays always advance in lockstep with the index + * scan's progress through the index's key space. + */ +static int +_bt_binsrch_array_skey(FmgrInfo *orderproc, + bool cur_elem_trig, ScanDirection dir, + Datum tupdatum, bool tupnull, + BTArrayKeyInfo *array, ScanKey cur, + int32 *set_elem_result) +{ + int low_elem = 0, + mid_elem = -1, + high_elem = array->num_elems - 1, + result = 0; + Datum arrdatum; + + Assert(cur->sk_flags & SK_SEARCHARRAY); + Assert(cur->sk_strategy == BTEqualStrategyNumber); + + if (cur_elem_trig) + { + Assert(!ScanDirectionIsNoMovement(dir)); + Assert(cur->sk_flags & SK_BT_REQFWD); + + /* + * When the scan key that triggered array advancement is a required + * array scan key, it is now certain that the current array element + * (plus all prior elements relative to the current scan direction) + * cannot possibly be at or ahead of the corresponding tuple value. + * (_bt_checkkeys must have called _bt_tuple_before_array_skeys, which + * makes sure this is true as a condition of advancing the arrays.) + * + * This makes it safe to exclude array elements up to and including + * the former-current array element from our search. + * + * Separately, when array advancement was triggered by a required scan + * key, the array element immediately after the former-current element + * is often either an exact tupdatum match, or a "close by" near-match + * (a near-match tupdatum is one whose key space falls _between_ the + * former-current and new-current array elements). We'll detect both + * cases via an optimistic comparison of the new search lower bound + * (or new search upper bound in the case of backwards scans). + */ + if (ScanDirectionIsForward(dir)) + { + low_elem = array->cur_elem + 1; /* old cur_elem exhausted */ + + /* Compare prospective new cur_elem (also the new lower bound) */ + if (high_elem >= low_elem) + { + arrdatum = array->elem_values[low_elem]; + result = _bt_compare_array_skey(orderproc, tupdatum, tupnull, + arrdatum, cur); + + if (result <= 0) + { + /* Optimistic comparison optimization worked out */ + *set_elem_result = result; + return low_elem; + } + mid_elem = low_elem; + low_elem++; /* this cur_elem exhausted, too */ + } + + if (high_elem < low_elem) + { + /* Caller needs to perform "beyond end" array advancement */ + *set_elem_result = 1; + return high_elem; + } } else { - if (++cur_elem >= num_elems) + high_elem = array->cur_elem - 1; /* old cur_elem exhausted */ + + /* Compare prospective new cur_elem (also the new upper bound) */ + if (high_elem >= low_elem) + { + arrdatum = array->elem_values[high_elem]; + result = _bt_compare_array_skey(orderproc, tupdatum, tupnull, + arrdatum, cur); + + if (result >= 0) + { + /* Optimistic comparison optimization worked out */ + *set_elem_result = result; + return high_elem; + } + mid_elem = high_elem; + high_elem--; /* this cur_elem exhausted, too */ + } + + if (high_elem < low_elem) { - cur_elem = 0; - found = false; /* need to advance next array key */ + /* Caller needs to perform "beyond end" array advancement */ + *set_elem_result = -1; + return low_elem; } - else - found = true; } + } - curArrayKey->cur_elem = cur_elem; - skey->sk_argument = curArrayKey->elem_values[cur_elem]; - if (found) + while (high_elem > low_elem) + { + mid_elem = low_elem + ((high_elem - low_elem) / 2); + arrdatum = array->elem_values[mid_elem]; + + result = _bt_compare_array_skey(orderproc, tupdatum, tupnull, + arrdatum, cur); + + if (result == 0) + { + /* + * It's safe to quit as soon as we see an equal array element. + * This often saves an extra comparison or two... + */ + low_elem = mid_elem; break; + } + + if (result > 0) + low_elem = mid_elem + 1; + else + high_elem = mid_elem; } - /* advance parallel scan */ - if (scan->parallel_scan != NULL) - _bt_parallel_advance_array_keys(scan); + /* + * ...but our caller also cares about how its searched-for tuple datum + * compares to the low_elem datum. Must always set *set_elem_result with + * the result of that comparison specifically. + */ + if (low_elem != mid_elem) + result = _bt_compare_array_skey(orderproc, tupdatum, tupnull, + array->elem_values[low_elem], cur); + + *set_elem_result = result; - return found; + return low_elem; } /* - * _bt_mark_array_keys() -- Handle array keys during btmarkpos + * _bt_start_array_keys() -- Initialize array keys at start of a scan * - * Save the current state of the array keys as the "mark" position. + * Set up the cur_elem counters and fill in the first sk_argument value for + * each array scankey. */ void -_bt_mark_array_keys(IndexScanDesc scan) +_bt_start_array_keys(IndexScanDesc scan, ScanDirection dir) { BTScanOpaque so = (BTScanOpaque) scan->opaque; int i; + Assert(so->numArrayKeys); + Assert(so->qual_ok); + for (i = 0; i < so->numArrayKeys; i++) { BTArrayKeyInfo *curArrayKey = &so->arrayKeys[i]; + ScanKey skey = &so->keyData[curArrayKey->scan_key]; + + Assert(curArrayKey->num_elems > 0); + Assert(skey->sk_flags & SK_SEARCHARRAY); - curArrayKey->mark_elem = curArrayKey->cur_elem; + if (ScanDirectionIsBackward(dir)) + curArrayKey->cur_elem = curArrayKey->num_elems - 1; + else + curArrayKey->cur_elem = 0; + skey->sk_argument = curArrayKey->elem_values[curArrayKey->cur_elem]; } + so->scanBehind = false; } /* - * _bt_restore_array_keys() -- Handle array keys during btrestrpos + * _bt_advance_array_keys_increment() -- Advance to next set of array elements + * + * Advances the array keys by a single increment in the current scan + * direction. When there are multiple array keys this can roll over from the + * lowest order array to higher order arrays. * - * Restore the array keys to where they were when the mark was set. + * Returns true if there is another set of values to consider, false if not. + * On true result, the scankeys are initialized with the next set of values. + * On false result, the scankeys stay the same, and the array keys are not + * advanced (every array remains at its final element for scan direction). */ -void -_bt_restore_array_keys(IndexScanDesc scan) +static bool +_bt_advance_array_keys_increment(IndexScanDesc scan, ScanDirection dir) { BTScanOpaque so = (BTScanOpaque) scan->opaque; - bool changed = false; - int i; - /* Restore each array key to its position when the mark was set */ - for (i = 0; i < so->numArrayKeys; i++) + /* + * We must advance the last array key most quickly, since it will + * correspond to the lowest-order index column among the available + * qualifications + */ + for (int i = so->numArrayKeys - 1; i >= 0; i--) { BTArrayKeyInfo *curArrayKey = &so->arrayKeys[i]; - ScanKey skey = &so->arrayKeyData[curArrayKey->scan_key]; - int mark_elem = curArrayKey->mark_elem; + ScanKey skey = &so->keyData[curArrayKey->scan_key]; + int cur_elem = curArrayKey->cur_elem; + int num_elems = curArrayKey->num_elems; + bool rolled = false; + + if (ScanDirectionIsForward(dir) && ++cur_elem >= num_elems) + { + cur_elem = 0; + rolled = true; + } + else if (ScanDirectionIsBackward(dir) && --cur_elem < 0) + { + cur_elem = num_elems - 1; + rolled = true; + } + + curArrayKey->cur_elem = cur_elem; + skey->sk_argument = curArrayKey->elem_values[cur_elem]; + if (!rolled) + return true; + + /* Need to advance next array key, if any */ + } + + /* + * The array keys are now exhausted. (There isn't actually a distinct + * state that represents array exhaustion, since index scans don't always + * end after btgettuple returns "false".) + * + * Restore the array keys to the state they were in immediately before we + * were called. This ensures that the arrays only ever ratchet in the + * current scan direction. Without this, scans would overlook matching + * tuples if and when the scan's direction was subsequently reversed. + */ + _bt_start_array_keys(scan, -dir); + + return false; +} + +/* + * _bt_rewind_nonrequired_arrays() -- Rewind non-required arrays + * + * Called when _bt_advance_array_keys decides to start a new primitive index + * scan on the basis of the current scan position being before the position + * that _bt_first is capable of repositioning the scan to by applying an + * inequality operator required in the opposite-to-scan direction only. + * + * Although equality strategy scan keys (for both arrays and non-arrays alike) + * are either marked required in both directions or in neither direction, + * there is a sense in which non-required arrays behave like required arrays. + * With a qual such as "WHERE a IN (100, 200) AND b >= 3 AND c IN (5, 6, 7)", + * the scan key on "c" is non-required, but nevertheless enables positioning + * the scan at the first tuple >= "(100, 3, 5)" on the leaf level during the + * first descent of the tree by _bt_first. Later on, there could also be a + * second descent, that places the scan right before tuples >= "(200, 3, 5)". + * _bt_first must never be allowed to build an insertion scan key whose "c" + * entry is set to a value other than 5, the "c" array's first element/value. + * (Actually, it's the first in the current scan direction. This example uses + * a forward scan.) + * + * Calling here resets the array scan key elements for the scan's non-required + * arrays. This is strictly necessary for correctness in a subset of cases + * involving "required in opposite direction"-triggered primitive index scans. + * Not all callers are at risk of _bt_first using a non-required array like + * this, but advancement always resets the arrays when another primitive scan + * is scheduled, just to keep things simple. Array advancement even makes + * sure to reset non-required arrays during scans that have no inequalities. + * (Advancement still won't call here when there are no inequalities, though + * that's just because it's all handled indirectly instead.) + * + * Note: _bt_verify_arrays_bt_first is called by an assertion to enforce that + * everybody got this right. + */ +static void +_bt_rewind_nonrequired_arrays(IndexScanDesc scan, ScanDirection dir) +{ + BTScanOpaque so = (BTScanOpaque) scan->opaque; + int arrayidx = 0; + + for (int ikey = 0; ikey < so->numberOfKeys; ikey++) + { + ScanKey cur = so->keyData + ikey; + BTArrayKeyInfo *array = NULL; + int first_elem_dir; + + if (!(cur->sk_flags & SK_SEARCHARRAY) || + cur->sk_strategy != BTEqualStrategyNumber) + continue; + + array = &so->arrayKeys[arrayidx++]; + Assert(array->scan_key == ikey); + + if ((cur->sk_flags & (SK_BT_REQFWD | SK_BT_REQBKWD))) + continue; + + if (ScanDirectionIsForward(dir)) + first_elem_dir = 0; + else + first_elem_dir = array->num_elems - 1; + + if (array->cur_elem != first_elem_dir) + { + array->cur_elem = first_elem_dir; + cur->sk_argument = array->elem_values[first_elem_dir]; + } + } +} + +/* + * _bt_tuple_before_array_skeys() -- too early to advance required arrays? + * + * We always compare the tuple using the current array keys (which we assume + * are already set in so->keyData[]). readpagetup indicates if tuple is the + * scan's current _bt_readpage-wise tuple. + * + * readpagetup callers must only call here when _bt_check_compare already set + * continuescan=false. We help these callers deal with _bt_check_compare's + * inability to distinguishing between the < and > cases (it uses equality + * operator scan keys, whereas we use 3-way ORDER procs). These callers pass + * a _bt_check_compare-set sktrig value that indicates which scan key + * triggered the call (!readpagetup callers just pass us sktrig=0 instead). + * This information allows us to avoid wastefully checking earlier scan keys + * that were already deemed to have been satisfied inside _bt_check_compare. + * + * Returns false when caller's tuple is >= the current required equality scan + * keys (or <=, in the case of backwards scans). This happens to readpagetup + * callers when the scan has reached the point of needing its array keys + * advanced; caller will need to advance required and non-required arrays at + * scan key offsets >= sktrig, plus scan keys < sktrig iff sktrig rolls over. + * (When we return false to readpagetup callers, tuple can only be == current + * required equality scan keys when caller's sktrig indicates that the arrays + * need to be advanced due to an unsatisfied required inequality key trigger.) + * + * Returns true when caller passes a tuple that is < the current set of + * equality keys for the most significant non-equal required scan key/column + * (or > the keys, during backwards scans). This happens to readpagetup + * callers when tuple is still before the start of matches for the scan's + * required equality strategy scan keys. (sktrig can't have indicated that an + * inequality strategy scan key wasn't satisfied in _bt_check_compare when we + * return true. In fact, we automatically return false when passed such an + * inequality sktrig by readpagetup callers -- _bt_check_compare's initial + * continuescan=false doesn't really need to be confirmed here by us.) + * + * !readpagetup callers optionally pass us *scanBehind, which tracks whether + * any missing truncated attributes might have affected array advancement + * (compared to what would happen if it was shown the first non-pivot tuple on + * the page to the right of caller's finaltup/high key tuple instead). It's + * only possible that we'll set *scanBehind to true when caller passes us a + * pivot tuple (with truncated -inf attributes) that we return false for. + */ +static bool +_bt_tuple_before_array_skeys(IndexScanDesc scan, ScanDirection dir, + IndexTuple tuple, TupleDesc tupdesc, int tupnatts, + bool readpagetup, int sktrig, bool *scanBehind) +{ + BTScanOpaque so = (BTScanOpaque) scan->opaque; + + Assert(so->numArrayKeys); + Assert(so->numberOfKeys); + Assert(sktrig == 0 || readpagetup); + Assert(!readpagetup || scanBehind == NULL); + + if (scanBehind) + *scanBehind = false; + + for (int ikey = sktrig; ikey < so->numberOfKeys; ikey++) + { + ScanKey cur = so->keyData + ikey; + Datum tupdatum; + bool tupnull; + int32 result; + + /* readpagetup calls require one ORDER proc comparison (at most) */ + Assert(!readpagetup || ikey == sktrig); + + /* + * Once we reach a non-required scan key, we're completely done. + * + * Note: we deliberately don't consider the scan direction here. + * _bt_advance_array_keys caller requires that we track *scanBehind + * without concern for scan direction. + */ + if ((cur->sk_flags & (SK_BT_REQFWD | SK_BT_REQBKWD)) == 0) + { + Assert(!readpagetup); + Assert(ikey > sktrig || ikey == 0); + return false; + } + + if (cur->sk_attno > tupnatts) + { + Assert(!readpagetup); + + /* + * When we reach a high key's truncated attribute, assume that the + * tuple attribute's value is >= the scan's equality constraint + * scan keys (but set *scanBehind to let interested callers know + * that a truncated attribute might have affected our answer). + */ + if (scanBehind) + *scanBehind = true; + + return false; + } + + /* + * Deal with inequality strategy scan keys that _bt_check_compare set + * continuescan=false for + */ + if (cur->sk_strategy != BTEqualStrategyNumber) + { + /* + * When _bt_check_compare indicated that a required inequality + * scan key wasn't satisfied, there's no need to verify anything; + * caller always calls _bt_advance_array_keys with this sktrig. + */ + if (readpagetup) + return false; + + /* + * Otherwise we can't give up, since we must check all required + * scan keys (required in either direction) in order to correctly + * track *scanBehind for caller + */ + continue; + } + + tupdatum = index_getattr(tuple, cur->sk_attno, tupdesc, &tupnull); + + result = _bt_compare_array_skey(&so->orderProcs[ikey], + tupdatum, tupnull, + cur->sk_argument, cur); + + /* + * Does this comparison indicate that caller must _not_ advance the + * scan's arrays just yet? + */ + if ((ScanDirectionIsForward(dir) && result < 0) || + (ScanDirectionIsBackward(dir) && result > 0)) + return true; + + /* + * Does this comparison indicate that caller should now advance the + * scan's arrays? (Must be if we get here during a readpagetup call.) + */ + if (readpagetup || result != 0) + { + Assert(result != 0); + return false; + } + + /* + * Inconclusive -- need to check later scan keys, too. + * + * This must be a finaltup precheck, or a call made from an assertion. + */ + Assert(result == 0); + } + + Assert(!readpagetup); + + return false; +} + +/* + * _bt_start_prim_scan() -- start scheduled primitive index scan? + * + * Returns true if _bt_checkkeys scheduled another primitive index scan, just + * as the last one ended. Otherwise returns false, indicating that the array + * keys are now fully exhausted. + * + * Only call here during scans with one or more equality type array scan keys, + * after _bt_first or _bt_next return false. + */ +bool +_bt_start_prim_scan(IndexScanDesc scan, ScanDirection dir) +{ + BTScanOpaque so = (BTScanOpaque) scan->opaque; + + Assert(so->numArrayKeys); + + /* scanBehind flag doesn't persist across primitive index scans - reset */ + so->scanBehind = false; + + /* + * Array keys are advanced within _bt_checkkeys when the scan reaches the + * leaf level (more precisely, they're advanced when the scan reaches the + * end of each distinct set of array elements). This process avoids + * repeat access to leaf pages (across multiple primitive index scans) by + * advancing the scan's array keys when it allows the primitive index scan + * to find nearby matching tuples (or when it eliminates ranges of array + * key space that can't possibly be satisfied by any index tuple). + * + * _bt_checkkeys sets a simple flag variable to schedule another primitive + * index scan. The flag tells us what to do. + * + * We cannot rely on _bt_first always reaching _bt_checkkeys. There are + * various cases where that won't happen. For example, if the index is + * completely empty, then _bt_first won't call _bt_readpage/_bt_checkkeys. + * We also don't expect a call to _bt_checkkeys during searches for a + * non-existent value that happens to be lower/higher than any existing + * value in the index. + * + * We don't require special handling for these cases -- we don't need to + * be explicitly instructed to _not_ perform another primitive index scan. + * It's up to code under the control of _bt_first to always set the flag + * when another primitive index scan will be required. + * + * This works correctly, even with the tricky cases listed above, which + * all involve access to leaf pages "near the boundaries of the key space" + * (whether it's from a leftmost/rightmost page, or an imaginary empty + * leaf root page). If _bt_checkkeys cannot be reached by a primitive + * index scan for one set of array keys, then it also won't be reached for + * any later set ("later" in terms of the direction that we scan the index + * and advance the arrays). The array keys won't have advanced in these + * cases, but that's the correct behavior (even _bt_advance_array_keys + * won't always advance the arrays at the point they become "exhausted"). + */ + if (so->needPrimScan) + { + Assert(_bt_verify_arrays_bt_first(scan, dir)); + + /* + * Flag was set -- must call _bt_first again, which will reset the + * scan's needPrimScan flag + */ + return true; + } + + /* The top-level index scan ran out of tuples in this scan direction */ + if (scan->parallel_scan != NULL) + _bt_parallel_done(scan); + + return false; +} + +/* + * _bt_advance_array_keys() -- Advance array elements using a tuple + * + * The scan always gets a new qual as a consequence of calling here (except + * when we determine that the top-level scan has run out of matching tuples). + * All later _bt_check_compare calls also use the same new qual that was first + * used here (at least until the next call here advances the keys once again). + * It's convenient to structure _bt_check_compare rechecks of caller's tuple + * (using the new qual) as one the steps of advancing the scan's array keys, + * so this function works as a wrapper around _bt_check_compare. + * + * Like _bt_check_compare, we'll set pstate.continuescan on behalf of the + * caller, and return a boolean indicating if caller's tuple satisfies the + * scan's new qual. But unlike _bt_check_compare, we set so->needPrimScan + * when we set continuescan=false, indicating if a new primitive index scan + * has been scheduled (otherwise, the top-level scan has run out of tuples in + * the current scan direction). + * + * Caller must use _bt_tuple_before_array_skeys to determine if the current + * place in the scan is >= the current array keys _before_ calling here. + * We're responsible for ensuring that caller's tuple is <= the newly advanced + * required array keys once we return. We try to find an exact match, but + * failing that we'll advance the array keys to whatever set of array elements + * comes next in the key space for the current scan direction. Required array + * keys "ratchet forwards" (or backwards). They can only advance as the scan + * itself advances through the index/key space. + * + * (The rules are the same for backwards scans, except that the operators are + * flipped: just replace the precondition's >= operator with a <=, and the + * postcondition's <= operator with a >=. In other words, just swap the + * precondition with the postcondition.) + * + * We also deal with "advancing" non-required arrays here. Callers whose + * sktrig scan key is non-required specify sktrig_required=false. These calls + * are the only exception to the general rule about always advancing the + * required array keys (the scan may not even have a required array). These + * callers should just pass a NULL pstate (since there is never any question + * of stopping the scan). No call to _bt_tuple_before_array_skeys is required + * ahead of these calls (it's already clear that any required scan keys must + * be satisfied by caller's tuple). + * + * Note that we deal with non-array required equality strategy scan keys as + * degenerate single element arrays here. Obviously, they can never really + * advance in the way that real arrays can, but they must still affect how we + * advance real array scan keys (exactly like true array equality scan keys). + * We have to keep around a 3-way ORDER proc for these (using the "=" operator + * won't do), since in general whether the tuple is < or > _any_ unsatisfied + * required equality key influences how the scan's real arrays must advance. + * + * Note also that we may sometimes need to advance the array keys when the + * existing required array keys (and other required equality keys) are already + * an exact match for every corresponding value from caller's tuple. We must + * do this for inequalities that _bt_check_compare set continuescan=false for. + * They'll advance the array keys here, just like any other scan key that + * _bt_check_compare stops on. (This can even happen _after_ we advance the + * array keys, in which case we'll advance the array keys a second time. That + * way _bt_checkkeys caller always has its required arrays advance to the + * maximum possible extent that its tuple will allow.) + */ +static bool +_bt_advance_array_keys(IndexScanDesc scan, BTReadPageState *pstate, + IndexTuple tuple, int tupnatts, TupleDesc tupdesc, + int sktrig, bool sktrig_required) +{ + BTScanOpaque so = (BTScanOpaque) scan->opaque; + Relation rel = scan->indexRelation; + ScanDirection dir = pstate ? pstate->dir : ForwardScanDirection; + int arrayidx = 0; + bool beyond_end_advance = false, + has_required_opposite_direction_only = false, + oppodir_inequality_sktrig = false, + all_required_satisfied = true, + all_satisfied = true; + + /* + * Unset so->scanBehind in case it is still set from back when we dealt + * with the previous page's high key/finaltup + */ + so->scanBehind = false; + + if (sktrig_required) + { + /* + * Precondition array state assertion + */ + Assert(!_bt_tuple_before_array_skeys(scan, dir, tuple, tupdesc, + tupnatts, false, 0, NULL)); + + /* + * Required scan key wasn't satisfied, so required arrays will have to + * advance. Invalidate page-level state that tracks whether the + * scan's required-in-opposite-direction-only keys are known to be + * satisfied by page's remaining tuples. + */ + pstate->firstmatch = false; + + /* Shouldn't have to invalidate 'prechecked', though */ + Assert(!pstate->prechecked); + + /* + * Once we return we'll have a new set of required array keys, so + * reset state used by "look ahead" optimization + */ + pstate->rechecks = 0; + pstate->targetdistance = 0; + } + + Assert(_bt_verify_keys_with_arraykeys(scan)); + + for (int ikey = 0; ikey < so->numberOfKeys; ikey++) + { + ScanKey cur = so->keyData + ikey; + BTArrayKeyInfo *array = NULL; + Datum tupdatum; + bool required = false, + required_opposite_direction_only = false, + tupnull; + int32 result; + int set_elem = 0; + + if (cur->sk_strategy == BTEqualStrategyNumber) + { + /* Manage array state */ + if (cur->sk_flags & SK_SEARCHARRAY) + { + array = &so->arrayKeys[arrayidx++]; + Assert(array->scan_key == ikey); + } + } + else + { + /* + * Are any inequalities required in the opposite direction only + * present here? + */ + if (((ScanDirectionIsForward(dir) && + (cur->sk_flags & (SK_BT_REQBKWD))) || + (ScanDirectionIsBackward(dir) && + (cur->sk_flags & (SK_BT_REQFWD))))) + has_required_opposite_direction_only = + required_opposite_direction_only = true; + } + + /* Optimization: skip over known-satisfied scan keys */ + if (ikey < sktrig) + continue; + + if (cur->sk_flags & (SK_BT_REQFWD | SK_BT_REQBKWD)) + { + Assert(sktrig_required); + + required = true; + + if (cur->sk_attno > tupnatts) + { + /* Set this just like _bt_tuple_before_array_skeys */ + Assert(sktrig < ikey); + so->scanBehind = true; + } + } + + /* + * Handle a required non-array scan key that the initial call to + * _bt_check_compare indicated triggered array advancement, if any. + * + * The non-array scan key's strategy will be <, <=, or = during a + * forwards scan (or any one of =, >=, or > during a backwards scan). + * It follows that the corresponding tuple attribute's value must now + * be either > or >= the scan key value (for backwards scans it must + * be either < or <= that value). + * + * If this is a required equality strategy scan key, this is just an + * optimization; _bt_tuple_before_array_skeys already confirmed that + * this scan key places us ahead of caller's tuple. There's no need + * to repeat that work now. (The same underlying principle also gets + * applied by the cur_elem_trig optimization used to speed up searches + * for the next array element.) + * + * If this is a required inequality strategy scan key, we _must_ rely + * on _bt_check_compare like this; we aren't capable of directly + * evaluating required inequality strategy scan keys here, on our own. + */ + if (ikey == sktrig && !array) + { + Assert(sktrig_required && required && all_required_satisfied); + + /* Use "beyond end" advancement. See below for an explanation. */ + beyond_end_advance = true; + all_satisfied = all_required_satisfied = false; + + /* + * Set a flag that remembers that this was an inequality required + * in the opposite scan direction only, that nevertheless + * triggered the call here. + * + * This only happens when an inequality operator (which must be + * strict) encounters a group of NULLs that indicate the end of + * non-NULL values for tuples in the current scan direction. + */ + if (unlikely(required_opposite_direction_only)) + oppodir_inequality_sktrig = true; + + continue; + } + + /* + * Nothing more for us to do with an inequality strategy scan key that + * wasn't the one that _bt_check_compare stopped on, though. + * + * Note: if our later call to _bt_check_compare (to recheck caller's + * tuple) sets continuescan=false due to finding this same inequality + * unsatisfied (possible when it's required in the scan direction), + * we'll deal with it via a recursive "second pass" call. + */ + else if (cur->sk_strategy != BTEqualStrategyNumber) + continue; + + /* + * Nothing for us to do with an equality strategy scan key that isn't + * marked required, either -- unless it's a non-required array + */ + else if (!required && !array) + continue; + + /* + * Here we perform steps for all array scan keys after a required + * array scan key whose binary search triggered "beyond end of array + * element" array advancement due to encountering a tuple attribute + * value > the closest matching array key (or < for backwards scans). + */ + if (beyond_end_advance) + { + int final_elem_dir; + + if (ScanDirectionIsBackward(dir) || !array) + final_elem_dir = 0; + else + final_elem_dir = array->num_elems - 1; + + if (array && array->cur_elem != final_elem_dir) + { + array->cur_elem = final_elem_dir; + cur->sk_argument = array->elem_values[final_elem_dir]; + } + + continue; + } + + /* + * Here we perform steps for all array scan keys after a required + * array scan key whose tuple attribute was < the closest matching + * array key when we dealt with it (or > for backwards scans). + * + * This earlier required array key already puts us ahead of caller's + * tuple in the key space (for the current scan direction). We must + * make sure that subsequent lower-order array keys do not put us too + * far ahead (ahead of tuples that have yet to be seen by our caller). + * For example, when a tuple "(a, b) = (42, 5)" advances the array + * keys on "a" from 40 to 45, we must also set "b" to whatever the + * first array element for "b" is. It would be wrong to allow "b" to + * be set based on the tuple value. + * + * Perform the same steps with truncated high key attributes. You can + * think of this as a "binary search" for the element closest to the + * value -inf. Again, the arrays must never get ahead of the scan. + */ + if (!all_required_satisfied || cur->sk_attno > tupnatts) + { + int first_elem_dir; + + if (ScanDirectionIsForward(dir) || !array) + first_elem_dir = 0; + else + first_elem_dir = array->num_elems - 1; + + if (array && array->cur_elem != first_elem_dir) + { + array->cur_elem = first_elem_dir; + cur->sk_argument = array->elem_values[first_elem_dir]; + } + + continue; + } + + /* + * Search in scankey's array for the corresponding tuple attribute + * value from caller's tuple + */ + tupdatum = index_getattr(tuple, cur->sk_attno, tupdesc, &tupnull); + + if (array) + { + bool cur_elem_trig = (sktrig_required && ikey == sktrig); + + /* + * Binary search for closest match that's available from the array + */ + set_elem = _bt_binsrch_array_skey(&so->orderProcs[ikey], + cur_elem_trig, dir, + tupdatum, tupnull, array, cur, + &result); + + Assert(set_elem >= 0 && set_elem < array->num_elems); + } + else + { + Assert(sktrig_required && required); + + /* + * This is a required non-array equality strategy scan key, which + * we'll treat as a degenerate single element array. + * + * This scan key's imaginary "array" can't really advance, but it + * can still roll over like any other array. (Actually, this is + * no different to real single value arrays, which never advance + * without rolling over -- they can never truly advance, either.) + */ + result = _bt_compare_array_skey(&so->orderProcs[ikey], + tupdatum, tupnull, + cur->sk_argument, cur); + } + + /* + * Consider "beyond end of array element" array advancement. + * + * When the tuple attribute value is > the closest matching array key + * (or < in the backwards scan case), we need to ratchet this array + * forward (backward) by one increment, so that caller's tuple ends up + * being < final array value instead (or > final array value instead). + * This process has to work for all of the arrays, not just this one: + * it must "carry" to higher-order arrays when the set_elem that we + * just found happens to be the final one for the scan's direction. + * Incrementing (decrementing) set_elem itself isn't good enough. + * + * Our approach is to provisionally use set_elem as if it was an exact + * match now, then set each later/less significant array to whatever + * its final element is. Once outside the loop we'll then "increment + * this array's set_elem" by calling _bt_advance_array_keys_increment. + * That way the process rolls over to higher order arrays as needed. + * + * Under this scheme any required arrays only ever ratchet forwards + * (or backwards), and always do so to the maximum possible extent + * that we can know will be safe without seeing the scan's next tuple. + * We don't need any special handling for required scan keys that lack + * a real array to advance, nor for redundant scan keys that couldn't + * be eliminated by _bt_preprocess_keys. It won't matter if some of + * our "true" array scan keys (or even all of them) are non-required. + */ + if (required && + ((ScanDirectionIsForward(dir) && result > 0) || + (ScanDirectionIsBackward(dir) && result < 0))) + beyond_end_advance = true; + + Assert(all_required_satisfied && all_satisfied); + if (result != 0) + { + /* + * Track whether caller's tuple satisfies our new post-advancement + * qual, for required scan keys, as well as for the entire set of + * interesting scan keys (all required scan keys plus non-required + * array scan keys are considered interesting.) + */ + all_satisfied = false; + if (required) + all_required_satisfied = false; + else + { + /* + * There's no need to advance the arrays using the best + * available match for a non-required array. Give up now. + * (Though note that sktrig_required calls still have to do + * all the usual post-advancement steps, including the recheck + * call to _bt_check_compare.) + */ + break; + } + } + + /* Advance array keys, even when set_elem isn't an exact match */ + if (array && array->cur_elem != set_elem) + { + array->cur_elem = set_elem; + cur->sk_argument = array->elem_values[set_elem]; + } + } + + /* + * Advance the array keys incrementally whenever "beyond end of array + * element" array advancement happens, so that advancement will carry to + * higher-order arrays (might exhaust all the scan's arrays instead, which + * ends the top-level scan). + */ + if (beyond_end_advance && !_bt_advance_array_keys_increment(scan, dir)) + goto end_toplevel_scan; + + Assert(_bt_verify_keys_with_arraykeys(scan)); + + /* + * Does tuple now satisfy our new qual? Recheck with _bt_check_compare. + * + * Calls triggered by an unsatisfied required scan key, whose tuple now + * satisfies all required scan keys, but not all nonrequired array keys, + * will still require a recheck call to _bt_check_compare. They'll still + * need its "second pass" handling of required inequality scan keys. + * (Might have missed a still-unsatisfied required inequality scan key + * that caller didn't detect as the sktrig scan key during its initial + * _bt_check_compare call that used the old/original qual.) + * + * Calls triggered by an unsatisfied nonrequired array scan key never need + * "second pass" handling of required inequalities (nor any other handling + * of any required scan key). All that matters is whether caller's tuple + * satisfies the new qual, so it's safe to just skip the _bt_check_compare + * recheck when we've already determined that it can only return 'false'. + */ + if ((sktrig_required && all_required_satisfied) || + (!sktrig_required && all_satisfied)) + { + int nsktrig = sktrig + 1; + bool continuescan; + + Assert(all_required_satisfied); + + /* Recheck _bt_check_compare on behalf of caller */ + if (_bt_check_compare(scan, dir, tuple, tupnatts, tupdesc, + false, false, false, + &continuescan, &nsktrig) && + !so->scanBehind) + { + /* This tuple satisfies the new qual */ + Assert(all_satisfied && continuescan); + + if (pstate) + pstate->continuescan = true; + + return true; + } + + /* + * Consider "second pass" handling of required inequalities. + * + * It's possible that our _bt_check_compare call indicated that the + * scan should end due to some unsatisfied inequality that wasn't + * initially recognized as such by us. Handle this by calling + * ourselves recursively, this time indicating that the trigger is the + * inequality that we missed first time around (and using a set of + * required array/equality keys that are now exact matches for tuple). + * + * We make a strong, general guarantee that every _bt_checkkeys call + * here will advance the array keys to the maximum possible extent + * that we can know to be safe based on caller's tuple alone. If we + * didn't perform this step, then that guarantee wouldn't quite hold. + */ + if (unlikely(!continuescan)) + { + bool satisfied PG_USED_FOR_ASSERTS_ONLY; + + Assert(sktrig_required); + Assert(so->keyData[nsktrig].sk_strategy != BTEqualStrategyNumber); + + /* + * The tuple must use "beyond end" advancement during the + * recursive call, so we cannot possibly end up back here when + * recursing. We'll consume a small, fixed amount of stack space. + */ + Assert(!beyond_end_advance); + + /* Advance the array keys a second time using same tuple */ + satisfied = _bt_advance_array_keys(scan, pstate, tuple, tupnatts, + tupdesc, nsktrig, true); + + /* This tuple doesn't satisfy the inequality */ + Assert(!satisfied); + return false; + } + + /* + * Some non-required scan key (from new qual) still not satisfied. + * + * All scan keys required in the current scan direction must still be + * satisfied, though, so we can trust all_required_satisfied below. + */ + } + + /* + * When we were called just to deal with "advancing" non-required arrays, + * this is as far as we can go (cannot stop the scan for these callers) + */ + if (!sktrig_required) + { + /* Caller's tuple doesn't match any qual */ + return false; + } + + /* + * Postcondition array state assertion (for still-unsatisfied tuples). + * + * By here we have established that the scan's required arrays (scan must + * have at least one required array) advanced, without becoming exhausted. + * + * Caller's tuple is now < the newly advanced array keys (or > when this + * is a backwards scan), except in the case where we only got this far due + * to an unsatisfied non-required scan key. Verify that with an assert. + * + * Note: we don't just quit at this point when all required scan keys were + * found to be satisfied because we need to consider edge-cases involving + * scan keys required in the opposite direction only; those aren't tracked + * by all_required_satisfied. (Actually, oppodir_inequality_sktrig trigger + * scan keys are tracked by all_required_satisfied, since it's convenient + * for _bt_check_compare to behave as if they are required in the current + * scan direction to deal with NULLs. We'll account for that separately.) + */ + Assert(_bt_tuple_before_array_skeys(scan, dir, tuple, tupdesc, tupnatts, + false, 0, NULL) == + !all_required_satisfied); + + /* + * We generally permit primitive index scans to continue onto the next + * sibling page when the page's finaltup satisfies all required scan keys + * at the point where we're between pages. + * + * If caller's tuple is also the page's finaltup, and we see that required + * scan keys still aren't satisfied, start a new primitive index scan. + */ + if (!all_required_satisfied && pstate->finaltup == tuple) + goto new_prim_scan; + + /* + * Proactively check finaltup (don't wait until finaltup is reached by the + * scan) when it might well turn out to not be satisfied later on. + * + * Note: if so->scanBehind hasn't already been set for finaltup by us, + * it'll be set during this call to _bt_tuple_before_array_skeys. Either + * way, it'll be set correctly (for the whole page) after this point. + */ + if (!all_required_satisfied && pstate->finaltup && + _bt_tuple_before_array_skeys(scan, dir, pstate->finaltup, tupdesc, + BTreeTupleGetNAtts(pstate->finaltup, rel), + false, 0, &so->scanBehind)) + goto new_prim_scan; + + /* + * When we encounter a truncated finaltup high key attribute, we're + * optimistic about the chances of its corresponding required scan key + * being satisfied when we go on to check it against tuples from this + * page's right sibling leaf page. We consider truncated attributes to be + * satisfied by required scan keys, which allows the primitive index scan + * to continue to the next leaf page. We must set so->scanBehind to true + * to remember that the last page's finaltup had "satisfied" required scan + * keys for one or more truncated attribute values (scan keys required in + * _either_ scan direction). + * + * There is a chance that _bt_checkkeys (which checks so->scanBehind) will + * find that even the sibling leaf page's finaltup is < the new array + * keys. When that happens, our optimistic policy will have incurred a + * single extra leaf page access that could have been avoided. + * + * A pessimistic policy would give backward scans a gratuitous advantage + * over forward scans. We'd punish forward scans for applying more + * accurate information from the high key, rather than just using the + * final non-pivot tuple as finaltup, in the style of backward scans. + * Being pessimistic would also give some scans with non-required arrays a + * perverse advantage over similar scans that use required arrays instead. + * + * You can think of this as a speculative bet on what the scan is likely + * to find on the next page. It's not much of a gamble, though, since the + * untruncated prefix of attributes must strictly satisfy the new qual + * (though it's okay if any non-required scan keys fail to be satisfied). + */ + if (so->scanBehind && has_required_opposite_direction_only) + { + /* + * However, we avoid this behavior whenever the scan involves a scan + * key required in the opposite direction to the scan only, along with + * a finaltup with at least one truncated attribute that's associated + * with a scan key marked required (required in either direction). + * + * _bt_check_compare simply won't stop the scan for a scan key that's + * marked required in the opposite scan direction only. That leaves + * us without any reliable way of reconsidering any opposite-direction + * inequalities if it turns out that starting a new primitive index + * scan will allow _bt_first to skip ahead by a great many leaf pages + * (see next section for details of how that works). + */ + goto new_prim_scan; + } + + /* + * Handle inequalities marked required in the opposite scan direction. + * They can also signal that we should start a new primitive index scan. + * + * It's possible that the scan is now positioned where "matching" tuples + * begin, and that caller's tuple satisfies all scan keys required in the + * current scan direction. But if caller's tuple still doesn't satisfy + * other scan keys that are required in the opposite scan direction only + * (e.g., a required >= strategy scan key when scan direction is forward), + * it's still possible that there are many leaf pages before the page that + * _bt_first could skip straight to. Groveling through all those pages + * will always give correct answers, but it can be very inefficient. We + * must avoid needlessly scanning extra pages. + * + * Separately, it's possible that _bt_check_compare set continuescan=false + * for a scan key that's required in the opposite direction only. This is + * a special case, that happens only when _bt_check_compare sees that the + * inequality encountered a NULL value. This signals the end of non-NULL + * values in the current scan direction, which is reason enough to end the + * (primitive) scan. If this happens at the start of a large group of + * NULL values, then we shouldn't expect to be called again until after + * the scan has already read indefinitely-many leaf pages full of tuples + * with NULL suffix values. We need a separate test for this case so that + * we don't miss our only opportunity to skip over such a group of pages. + * (_bt_first is expected to skip over the group of NULLs by applying a + * similar "deduce NOT NULL" rule, where it finishes its insertion scan + * key by consing up an explicit SK_SEARCHNOTNULL key.) + * + * Apply a test against finaltup to detect and recover from these problem: + * if even finaltup doesn't satisfy such an inequality, we just skip by + * starting a new primitive index scan. When we skip, we know for sure + * that all of the tuples on the current page following caller's tuple are + * also before the _bt_first-wise start of tuples for our new qual. That + * at least suggests many more skippable pages beyond the current page. + */ + if (has_required_opposite_direction_only && pstate->finaltup && + (all_required_satisfied || oppodir_inequality_sktrig)) + { + int nfinaltupatts = BTreeTupleGetNAtts(pstate->finaltup, rel); + ScanDirection flipped; + bool continuescanflip; + int opsktrig; + + /* + * We're checking finaltup (which is usually not caller's tuple), so + * cannot reuse work from caller's earlier _bt_check_compare call. + * + * Flip the scan direction when calling _bt_check_compare this time, + * so that it will set continuescanflip=false when it encounters an + * inequality required in the opposite scan direction. + */ + Assert(!so->scanBehind); + opsktrig = 0; + flipped = -dir; + _bt_check_compare(scan, flipped, + pstate->finaltup, nfinaltupatts, tupdesc, + false, false, false, + &continuescanflip, &opsktrig); + + /* + * Only start a new primitive index scan when finaltup has a required + * unsatisfied inequality (unsatisfied in the opposite direction) + */ + Assert(all_required_satisfied != oppodir_inequality_sktrig); + if (unlikely(!continuescanflip && + so->keyData[opsktrig].sk_strategy != BTEqualStrategyNumber)) + { + /* + * It's possible for the same inequality to be unsatisfied by both + * caller's tuple (in scan's direction) and finaltup (in the + * opposite direction) due to _bt_check_compare's behavior with + * NULLs + */ + Assert(opsktrig >= sktrig); /* not opsktrig > sktrig due to NULLs */ + + /* + * Make sure that any non-required arrays are set to the first + * array element for the current scan direction + */ + _bt_rewind_nonrequired_arrays(scan, dir); + + goto new_prim_scan; + } + } + + /* + * Stick with the ongoing primitive index scan for now. + * + * It's possible that later tuples will also turn out to have values that + * are still < the now-current array keys (or > the current array keys). + * Our caller will handle this by performing what amounts to a linear + * search of the page, implemented by calling _bt_check_compare and then + * _bt_tuple_before_array_skeys for each tuple. + * + * This approach has various advantages over a binary search of the page. + * Repeated binary searches of the page (one binary search for every array + * advancement) won't outperform a continuous linear search. While there + * are workloads that a naive linear search won't handle well, our caller + * has a "look ahead" fallback mechanism to deal with that problem. + */ + pstate->continuescan = true; /* Override _bt_check_compare */ + so->needPrimScan = false; /* _bt_readpage has more tuples to check */ + + if (so->scanBehind) + { + /* Optimization: skip by setting "look ahead" mechanism's offnum */ + Assert(ScanDirectionIsForward(dir)); + pstate->skip = pstate->maxoff + 1; + } + + /* Caller's tuple doesn't match the new qual */ + return false; + +new_prim_scan: + + /* + * End this primitive index scan, but schedule another. + * + * Note: We make a soft assumption that the current scan direction will + * also be used within _bt_next, when it is asked to step off this page. + * It is up to _bt_next to cancel this scheduled primitive index scan + * whenever it steps to a page in the direction opposite currPos.dir. + */ + pstate->continuescan = false; /* Tell _bt_readpage we're done... */ + so->needPrimScan = true; /* ...but call _bt_first again */ + + if (scan->parallel_scan) + _bt_parallel_primscan_schedule(scan, pstate->prev_scan_page); + + /* Caller's tuple doesn't match the new qual */ + return false; - if (curArrayKey->cur_elem != mark_elem) - { - curArrayKey->cur_elem = mark_elem; - skey->sk_argument = curArrayKey->elem_values[mark_elem]; - changed = true; - } - } +end_toplevel_scan: /* - * If we changed any keys, we must redo _bt_preprocess_keys. That might - * sound like overkill, but in cases with multiple keys per index column - * it seems necessary to do the full set of pushups. + * End the current primitive index scan, but don't schedule another. + * + * This ends the entire top-level scan in the current scan direction. + * + * Note: The scan's arrays (including any non-required arrays) are now in + * their final positions for the current scan direction. If the scan + * direction happens to change, then the arrays will already be in their + * first positions for what will then be the current scan direction. */ - if (changed) - { - _bt_preprocess_keys(scan); - /* The mark should have been set on a consistent set of keys... */ - Assert(so->qual_ok); - } -} + pstate->continuescan = false; /* Tell _bt_readpage we're done... */ + so->needPrimScan = false; /* ...don't call _bt_first again, though */ + /* Caller's tuple doesn't match any qual */ + return false; +} /* * _bt_preprocess_keys() -- Preprocess scan keys * - * The given search-type keys (in scan->keyData[] or so->arrayKeyData[]) + * The given search-type keys (taken from scan->keyData[]) * are copied to so->keyData[] with possible transformation. * scan->numberOfKeys is the number of input keys, so->numberOfKeys gets * the number of output keys (possibly less, never greater). @@ -684,8 +2486,9 @@ _bt_restore_array_keys(IndexScanDesc scan) * The output keys must be sorted by index attribute. Presently we expect * (but verify) that the input keys are already so sorted --- this is done * by match_clauses_to_index() in indxpath.c. Some reordering of the keys - * within each attribute may be done as a byproduct of the processing here, - * but no other code depends on that. + * within each attribute may be done as a byproduct of the processing here. + * That process must leave array scan keys (within an attribute) in the same + * order as corresponding entries from the scan's BTArrayKeyInfo array info. * * The output keys are marked with flags SK_BT_REQFWD and/or SK_BT_REQBKWD * if they must be satisfied in order to continue the scan forward or backward @@ -742,8 +2545,8 @@ _bt_restore_array_keys(IndexScanDesc scan) * * Note: the reason we have to copy the preprocessed scan keys into private * storage is that we are modifying the array based on comparisons of the - * key argument values, which could change on a rescan or after moving to - * new elements of array keys. Therefore we can't overwrite the source data. + * key argument values, which could change on a rescan. Therefore we can't + * overwrite the source data. */ void _bt_preprocess_keys(IndexScanDesc scan) @@ -756,11 +2559,28 @@ _bt_preprocess_keys(IndexScanDesc scan) ScanKey inkeys; ScanKey outkeys; ScanKey cur; - ScanKey xform[BTMaxStrategyNumber]; + BTScanKeyPreproc xform[BTMaxStrategyNumber]; bool test_result; int i, j; AttrNumber attno; + ScanKey arrayKeyData; + int *keyDataMap = NULL; + int arrayidx = 0; + + if (so->numberOfKeys > 0) + { + /* + * Only need to do preprocessing once per btrescan, at most. All + * calls after the first are handled as no-ops. + * + * If there are array scan keys in so->keyData[], then the now-current + * array elements must already be present in each array's scan key. + * Verify that that happened using an assertion. + */ + Assert(_bt_verify_keys_with_arraykeys(scan)); + return; + } /* initialize result variables */ so->qual_ok = true; @@ -769,11 +2589,27 @@ _bt_preprocess_keys(IndexScanDesc scan) if (numberOfKeys < 1) return; /* done if qual-less scan */ + /* If any keys are SK_SEARCHARRAY type, set up array-key info */ + arrayKeyData = _bt_preprocess_array_keys(scan); + if (!so->qual_ok) + { + /* unmatchable array, so give up */ + return; + } + /* - * Read so->arrayKeyData if array keys are present, else scan->keyData + * Treat arrayKeyData[] (a partially preprocessed copy of scan->keyData[]) + * as our input if _bt_preprocess_array_keys just allocated it, else just + * use scan->keyData[] */ - if (so->arrayKeyData != NULL) - inkeys = so->arrayKeyData; + if (arrayKeyData) + { + inkeys = arrayKeyData; + + /* Also maintain keyDataMap for remapping so->orderProc[] later */ + keyDataMap = MemoryContextAlloc(so->arrayContext, + numberOfKeys * sizeof(int)); + } else inkeys = scan->keyData; @@ -794,6 +2630,19 @@ _bt_preprocess_keys(IndexScanDesc scan) /* We can mark the qual as required if it's for first index col */ if (cur->sk_attno == 1) _bt_mark_scankey_required(outkeys); + if (arrayKeyData) + { + /* + * Don't call _bt_preprocess_array_keys_final in this fast path + * (we'll miss out on the single value array transformation, but + * that's not nearly as important when there's only one scan key) + */ + Assert(cur->sk_flags & SK_SEARCHARRAY); + Assert(cur->sk_strategy != BTEqualStrategyNumber || + (so->arrayKeys[0].scan_key == 0 && + OidIsValid(so->orderProcs[0].fn_oid))); + } + return; } @@ -853,13 +2702,29 @@ _bt_preprocess_keys(IndexScanDesc scan) * check, and we've rejected any combination of it with a regular * equality condition; but not with other types of conditions. */ - if (xform[BTEqualStrategyNumber - 1]) + if (xform[BTEqualStrategyNumber - 1].skey) { - ScanKey eq = xform[BTEqualStrategyNumber - 1]; + ScanKey eq = xform[BTEqualStrategyNumber - 1].skey; + BTArrayKeyInfo *array = NULL; + FmgrInfo *orderproc = NULL; + + if (arrayKeyData && (eq->sk_flags & SK_SEARCHARRAY)) + { + int eq_in_ikey, + eq_arrayidx; + + eq_in_ikey = xform[BTEqualStrategyNumber - 1].ikey; + eq_arrayidx = xform[BTEqualStrategyNumber - 1].arrayidx; + array = &so->arrayKeys[eq_arrayidx - 1]; + orderproc = so->orderProcs + eq_in_ikey; + + Assert(array->scan_key == eq_in_ikey); + Assert(OidIsValid(orderproc->fn_oid)); + } for (j = BTMaxStrategyNumber; --j >= 0;) { - ScanKey chk = xform[j]; + ScanKey chk = xform[j].skey; if (!chk || j == (BTEqualStrategyNumber - 1)) continue; @@ -872,6 +2737,7 @@ _bt_preprocess_keys(IndexScanDesc scan) } if (_bt_compare_scankey_args(scan, chk, eq, chk, + array, orderproc, &test_result)) { if (!test_result) @@ -881,7 +2747,9 @@ _bt_preprocess_keys(IndexScanDesc scan) return; } /* else discard the redundant non-equality key */ - xform[j] = NULL; + Assert(!array || array->num_elems > 0); + xform[j].skey = NULL; + xform[j].ikey = -1; } /* else, cannot determine redundancy, keep both keys */ } @@ -890,36 +2758,36 @@ _bt_preprocess_keys(IndexScanDesc scan) } /* try to keep only one of <, <= */ - if (xform[BTLessStrategyNumber - 1] - && xform[BTLessEqualStrategyNumber - 1]) + if (xform[BTLessStrategyNumber - 1].skey + && xform[BTLessEqualStrategyNumber - 1].skey) { - ScanKey lt = xform[BTLessStrategyNumber - 1]; - ScanKey le = xform[BTLessEqualStrategyNumber - 1]; + ScanKey lt = xform[BTLessStrategyNumber - 1].skey; + ScanKey le = xform[BTLessEqualStrategyNumber - 1].skey; - if (_bt_compare_scankey_args(scan, le, lt, le, + if (_bt_compare_scankey_args(scan, le, lt, le, NULL, NULL, &test_result)) { if (test_result) - xform[BTLessEqualStrategyNumber - 1] = NULL; + xform[BTLessEqualStrategyNumber - 1].skey = NULL; else - xform[BTLessStrategyNumber - 1] = NULL; + xform[BTLessStrategyNumber - 1].skey = NULL; } } /* try to keep only one of >, >= */ - if (xform[BTGreaterStrategyNumber - 1] - && xform[BTGreaterEqualStrategyNumber - 1]) + if (xform[BTGreaterStrategyNumber - 1].skey + && xform[BTGreaterEqualStrategyNumber - 1].skey) { - ScanKey gt = xform[BTGreaterStrategyNumber - 1]; - ScanKey ge = xform[BTGreaterEqualStrategyNumber - 1]; + ScanKey gt = xform[BTGreaterStrategyNumber - 1].skey; + ScanKey ge = xform[BTGreaterEqualStrategyNumber - 1].skey; - if (_bt_compare_scankey_args(scan, ge, gt, ge, + if (_bt_compare_scankey_args(scan, ge, gt, ge, NULL, NULL, &test_result)) { if (test_result) - xform[BTGreaterEqualStrategyNumber - 1] = NULL; + xform[BTGreaterEqualStrategyNumber - 1].skey = NULL; else - xform[BTGreaterStrategyNumber - 1] = NULL; + xform[BTGreaterStrategyNumber - 1].skey = NULL; } } @@ -930,11 +2798,13 @@ _bt_preprocess_keys(IndexScanDesc scan) */ for (j = BTMaxStrategyNumber; --j >= 0;) { - if (xform[j]) + if (xform[j].skey) { ScanKey outkey = &outkeys[new_numberOfKeys++]; - memcpy(outkey, xform[j], sizeof(ScanKeyData)); + memcpy(outkey, xform[j].skey, sizeof(ScanKeyData)); + if (arrayKeyData) + keyDataMap[new_numberOfKeys - 1] = xform[j].ikey; if (priorNumberOfEqualCols == attno - 1) _bt_mark_scankey_required(outkey); } @@ -960,6 +2830,8 @@ _bt_preprocess_keys(IndexScanDesc scan) ScanKey outkey = &outkeys[new_numberOfKeys++]; memcpy(outkey, cur, sizeof(ScanKeyData)); + if (arrayKeyData) + keyDataMap[new_numberOfKeys - 1] = i; if (numberOfEqualCols == attno - 1) _bt_mark_scankey_required(outkey); @@ -971,20 +2843,108 @@ _bt_preprocess_keys(IndexScanDesc scan) continue; } - /* have we seen one of these before? */ - if (xform[j] == NULL) + /* + * Does this input scan key require further processing as an array? + */ + if (cur->sk_strategy == InvalidStrategy) + { + /* _bt_preprocess_array_keys marked this array key redundant */ + Assert(arrayKeyData); + Assert(cur->sk_flags & SK_SEARCHARRAY); + continue; + } + + if (cur->sk_strategy == BTEqualStrategyNumber && + (cur->sk_flags & SK_SEARCHARRAY)) { - /* nope, so remember this scankey */ - xform[j] = cur; + /* _bt_preprocess_array_keys kept this array key */ + Assert(arrayKeyData); + arrayidx++; + } + + /* + * have we seen a scan key for this same attribute and using this same + * operator strategy before now? + */ + if (xform[j].skey == NULL) + { + /* nope, so this scan key wins by default (at least for now) */ + xform[j].skey = cur; + xform[j].ikey = i; + xform[j].arrayidx = arrayidx; } else { - /* yup, keep only the more restrictive key */ - if (_bt_compare_scankey_args(scan, cur, cur, xform[j], - &test_result)) + FmgrInfo *orderproc = NULL; + BTArrayKeyInfo *array = NULL; + + /* + * Seen one of these before, so keep only the more restrictive key + * if possible + */ + if (j == (BTEqualStrategyNumber - 1) && arrayKeyData) { + /* + * Have to set up array keys + */ + if ((cur->sk_flags & SK_SEARCHARRAY)) + { + array = &so->arrayKeys[arrayidx - 1]; + orderproc = so->orderProcs + i; + + Assert(array->scan_key == i); + Assert(OidIsValid(orderproc->fn_oid)); + } + else if ((xform[j].skey->sk_flags & SK_SEARCHARRAY)) + { + array = &so->arrayKeys[xform[j].arrayidx - 1]; + orderproc = so->orderProcs + xform[j].ikey; + + Assert(array->scan_key == xform[j].ikey); + Assert(OidIsValid(orderproc->fn_oid)); + } + + /* + * Both scan keys might have arrays, in which case we'll + * arbitrarily pass only one of the arrays. That won't + * matter, since _bt_compare_scankey_args is aware that two + * SEARCHARRAY scan keys mean that _bt_preprocess_array_keys + * failed to eliminate redundant arrays through array merging. + * _bt_compare_scankey_args just returns false when it sees + * this; it won't even try to examine either array. + */ + } + + if (_bt_compare_scankey_args(scan, cur, cur, xform[j].skey, + array, orderproc, &test_result)) + { + /* Have all we need to determine redundancy */ if (test_result) - xform[j] = cur; + { + Assert(!array || array->num_elems > 0); + + /* + * New key is more restrictive, and so replaces old key... + */ + if (j != (BTEqualStrategyNumber - 1) || + !(xform[j].skey->sk_flags & SK_SEARCHARRAY)) + { + xform[j].skey = cur; + xform[j].ikey = i; + xform[j].arrayidx = arrayidx; + } + else + { + /* + * ...unless we have to keep the old key because it's + * an array that rendered the new key redundant. We + * need to make sure that we don't throw away an array + * scan key. _bt_compare_scankey_args expects us to + * always keep arrays (and discard non-arrays). + */ + Assert(!(cur->sk_flags & SK_SEARCHARRAY)); + } + } else if (j == (BTEqualStrategyNumber - 1)) { /* key == a && key == b, but a != b */ @@ -996,21 +2956,129 @@ _bt_preprocess_keys(IndexScanDesc scan) else { /* - * We can't determine which key is more restrictive. Keep the - * previous one in xform[j] and push this one directly to the - * output array. + * We can't determine which key is more restrictive. Push + * xform[j] directly to the output array, then set xform[j] to + * the new scan key. + * + * Note: We do things this way around so that our arrays are + * always in the same order as their corresponding scan keys, + * even with incomplete opfamilies. _bt_advance_array_keys + * depends on this. */ ScanKey outkey = &outkeys[new_numberOfKeys++]; - memcpy(outkey, cur, sizeof(ScanKeyData)); + memcpy(outkey, xform[j].skey, sizeof(ScanKeyData)); + if (arrayKeyData) + keyDataMap[new_numberOfKeys - 1] = xform[j].ikey; if (numberOfEqualCols == attno - 1) _bt_mark_scankey_required(outkey); + xform[j].skey = cur; + xform[j].ikey = i; + xform[j].arrayidx = arrayidx; } } } so->numberOfKeys = new_numberOfKeys; + + /* + * Now that we've built a temporary mapping from so->keyData[] (output + * scan keys) to scan->keyData[] (input scan keys), fix array->scan_key + * references. Also consolidate the so->orderProc[] array such that it + * can be subscripted using so->keyData[]-wise offsets. + */ + if (arrayKeyData) + _bt_preprocess_array_keys_final(scan, keyDataMap); + + /* Could pfree arrayKeyData/keyDataMap now, but not worth the cycles */ +} + +#ifdef USE_ASSERT_CHECKING +/* + * Verify that the scan's qual state matches what we expect at the point that + * _bt_start_prim_scan is about to start a just-scheduled new primitive scan. + * + * We enforce a rule against non-required array scan keys: they must start out + * with whatever element is the first for the scan's current scan direction. + * See _bt_rewind_nonrequired_arrays comments for an explanation. + */ +static bool +_bt_verify_arrays_bt_first(IndexScanDesc scan, ScanDirection dir) +{ + BTScanOpaque so = (BTScanOpaque) scan->opaque; + int arrayidx = 0; + + for (int ikey = 0; ikey < so->numberOfKeys; ikey++) + { + ScanKey cur = so->keyData + ikey; + BTArrayKeyInfo *array = NULL; + int first_elem_dir; + + if (!(cur->sk_flags & SK_SEARCHARRAY) || + cur->sk_strategy != BTEqualStrategyNumber) + continue; + + array = &so->arrayKeys[arrayidx++]; + + if (((cur->sk_flags & SK_BT_REQFWD) && ScanDirectionIsForward(dir)) || + ((cur->sk_flags & SK_BT_REQBKWD) && ScanDirectionIsBackward(dir))) + continue; + + if (ScanDirectionIsForward(dir)) + first_elem_dir = 0; + else + first_elem_dir = array->num_elems - 1; + + if (array->cur_elem != first_elem_dir) + return false; + } + + return _bt_verify_keys_with_arraykeys(scan); +} + +/* + * Verify that the scan's "so->keyData[]" scan keys are in agreement with + * its array key state + */ +static bool +_bt_verify_keys_with_arraykeys(IndexScanDesc scan) +{ + BTScanOpaque so = (BTScanOpaque) scan->opaque; + int last_sk_attno = InvalidAttrNumber, + arrayidx = 0; + + if (!so->qual_ok) + return false; + + for (int ikey = 0; ikey < so->numberOfKeys; ikey++) + { + ScanKey cur = so->keyData + ikey; + BTArrayKeyInfo *array; + + if (cur->sk_strategy != BTEqualStrategyNumber || + !(cur->sk_flags & SK_SEARCHARRAY)) + continue; + + array = &so->arrayKeys[arrayidx++]; + if (array->scan_key != ikey) + return false; + + if (array->num_elems <= 0) + return false; + + if (cur->sk_argument != array->elem_values[array->cur_elem]) + return false; + if (last_sk_attno > cur->sk_attno) + return false; + last_sk_attno = cur->sk_attno; + } + + if (arrayidx != so->numArrayKeys) + return false; + + return true; } +#endif /* * Compare two scankey values using a specified operator. @@ -1027,9 +3095,24 @@ _bt_preprocess_keys(IndexScanDesc scan) * we store the operator result in *result and return true. We return false * if the comparison could not be made. * + * If either leftarg or rightarg are an array, we'll apply array-specific + * rules to determine which array elements are redundant on behalf of caller. + * It is up to our caller to save whichever of the two scan keys is the array, + * and discard the non-array scan key (the non-array scan key is guaranteed to + * be redundant with any complete opfamily). Caller isn't expected to call + * here with a pair of array scan keys provided we're dealing with a complete + * opfamily (_bt_preprocess_array_keys will merge array keys together to make + * sure of that). + * + * Note: we'll also shrink caller's array as needed to eliminate redundant + * array elements. One reason why caller should prefer to discard non-array + * scan keys is so that we'll have the opportunity to shrink the array + * multiple times, in multiple calls (for each of several other scan keys on + * the same index attribute). + * * Note: op always points at the same ScanKey as either leftarg or rightarg. - * Since we don't scribble on the scankeys, this aliasing should cause no - * trouble. + * Since we don't scribble on the scankeys themselves, this aliasing should + * cause no trouble. * * Note: this routine needs to be insensitive to any DESC option applied * to the index column. For example, "x < 4" is a tighter constraint than @@ -1038,6 +3121,7 @@ _bt_preprocess_keys(IndexScanDesc scan) static bool _bt_compare_scankey_args(IndexScanDesc scan, ScanKey op, ScanKey leftarg, ScanKey rightarg, + BTArrayKeyInfo *array, FmgrInfo *orderproc, bool *result) { Relation rel = scan->indexRelation; @@ -1106,6 +3190,48 @@ _bt_compare_scankey_args(IndexScanDesc scan, ScanKey op, return true; } + /* + * If either leftarg or rightarg are equality-type array scankeys, we need + * specialized handling (since by now we know that IS NULL wasn't used) + */ + if (array) + { + bool leftarray, + rightarray; + + leftarray = ((leftarg->sk_flags & SK_SEARCHARRAY) && + leftarg->sk_strategy == BTEqualStrategyNumber); + rightarray = ((rightarg->sk_flags & SK_SEARCHARRAY) && + rightarg->sk_strategy == BTEqualStrategyNumber); + + /* + * _bt_preprocess_array_keys is responsible for merging together array + * scan keys, and will do so whenever the opfamily has the required + * cross-type support. If it failed to do that, we handle it just + * like the case where we can't make the comparison ourselves. + */ + if (leftarray && rightarray) + { + /* Can't make the comparison */ + *result = false; /* suppress compiler warnings */ + return false; + } + + /* + * Otherwise we need to determine if either one of leftarg or rightarg + * uses an array, then pass this through to a dedicated helper + * function. + */ + if (leftarray) + return _bt_compare_array_scankey_args(scan, leftarg, rightarg, + orderproc, array, result); + else if (rightarray) + return _bt_compare_array_scankey_args(scan, rightarg, leftarg, + orderproc, array, result); + + /* FALL THRU */ + } + /* * The opfamily we need to worry about is identified by the index column. */ @@ -1260,6 +3386,13 @@ _bt_fix_scankey_strategy(ScanKey skey, int16 *indoption) return true; } + if (skey->sk_strategy == InvalidStrategy) + { + /* Already-eliminated array scan key; don't need to fix anything */ + Assert(skey->sk_flags & SK_SEARCHARRAY); + return true; + } + /* Adjust strategy for DESC, if we didn't already */ if ((addflags & SK_BT_DESC) && !(skey->sk_flags & SK_BT_DESC)) skey->sk_strategy = BTCommuteStrategyNumber(skey->sk_strategy); @@ -1345,42 +3478,255 @@ _bt_mark_scankey_required(ScanKey skey) * * Return true if so, false if not. If the tuple fails to pass the qual, * we also determine whether there's any need to continue the scan beyond - * this tuple, and set *continuescan accordingly. See comments for + * this tuple, and set pstate.continuescan accordingly. See comments for * _bt_preprocess_keys(), above, about how this is done. * * Forward scan callers can pass a high key tuple in the hopes of having * us set *continuescan to false, and avoiding an unnecessary visit to * the page to the right. * + * Advances the scan's array keys when necessary for arrayKeys=true callers. + * Caller can avoid all array related side-effects when calling just to do a + * page continuescan precheck -- pass arrayKeys=false for that. Scans without + * any arrays keys must always pass arrayKeys=false. + * + * Also stops and starts primitive index scans for arrayKeys=true callers. + * Scans with array keys are required to set up page state that helps us with + * this. The page's finaltup tuple (the page high key for a forward scan, or + * the page's first non-pivot tuple for a backward scan) must be set in + * pstate.finaltup ahead of the first call here for the page (or possibly the + * first call after an initial continuescan-setting page precheck call). Set + * this to NULL for rightmost page (or the leftmost page for backwards scans). + * * scan: index scan descriptor (containing a search-type scankey) + * pstate: page level input and output parameters + * arrayKeys: should we advance the scan's array keys if necessary? * tuple: index tuple to test * tupnatts: number of attributes in tupnatts (high key may be truncated) - * dir: direction we are scanning in - * continuescan: output parameter (will be set correctly in all cases) */ bool -_bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, int tupnatts, - ScanDirection dir, bool *continuescan) +_bt_checkkeys(IndexScanDesc scan, BTReadPageState *pstate, bool arrayKeys, + IndexTuple tuple, int tupnatts) { - TupleDesc tupdesc; - BTScanOpaque so; - int keysz; - int ikey; - ScanKey key; + TupleDesc tupdesc = RelationGetDescr(scan->indexRelation); + BTScanOpaque so = (BTScanOpaque) scan->opaque; + ScanDirection dir = pstate->dir; + int ikey = 0; + bool res; Assert(BTreeTupleGetNAtts(tuple, scan->indexRelation) == tupnatts); - *continuescan = true; /* default assumption */ + res = _bt_check_compare(scan, dir, tuple, tupnatts, tupdesc, + arrayKeys, pstate->prechecked, pstate->firstmatch, + &pstate->continuescan, &ikey); + +#ifdef USE_ASSERT_CHECKING + if (!arrayKeys && so->numArrayKeys) + { + /* + * This is a continuescan precheck call for a scan with array keys. + * + * Assert that the scan isn't in danger of becoming confused. + */ + Assert(!so->scanBehind && !pstate->prechecked && !pstate->firstmatch); + Assert(!_bt_tuple_before_array_skeys(scan, dir, tuple, tupdesc, + tupnatts, false, 0, NULL)); + } + if (pstate->prechecked || pstate->firstmatch) + { + bool dcontinuescan; + int dikey = 0; + + /* + * Call relied on continuescan/firstmatch prechecks -- assert that we + * get the same answer without those optimizations + */ + Assert(res == _bt_check_compare(scan, dir, tuple, tupnatts, tupdesc, + false, false, false, + &dcontinuescan, &dikey)); + Assert(pstate->continuescan == dcontinuescan); + } +#endif + + /* + * Only one _bt_check_compare call is required in the common case where + * there are no equality strategy array scan keys. Otherwise we can only + * accept _bt_check_compare's answer unreservedly when it didn't set + * pstate.continuescan=false. + */ + if (!arrayKeys || pstate->continuescan) + return res; + + /* + * _bt_check_compare call set continuescan=false in the presence of + * equality type array keys. This could mean that the tuple is just past + * the end of matches for the current array keys. + * + * It's also possible that the scan is still _before_ the _start_ of + * tuples matching the current set of array keys. Check for that first. + */ + if (_bt_tuple_before_array_skeys(scan, dir, tuple, tupdesc, tupnatts, true, + ikey, NULL)) + { + /* + * Tuple is still before the start of matches according to the scan's + * required array keys (according to _all_ of its required equality + * strategy keys, actually). + * + * _bt_advance_array_keys occasionally sets so->scanBehind to signal + * that the scan's current position/tuples might be significantly + * behind (multiple pages behind) its current array keys. When this + * happens, we need to be prepared to recover by starting a new + * primitive index scan here, on our own. + */ + Assert(!so->scanBehind || + so->keyData[ikey].sk_strategy == BTEqualStrategyNumber); + if (unlikely(so->scanBehind) && pstate->finaltup && + _bt_tuple_before_array_skeys(scan, dir, pstate->finaltup, tupdesc, + BTreeTupleGetNAtts(pstate->finaltup, + scan->indexRelation), + false, 0, NULL)) + { + /* Cut our losses -- start a new primitive index scan now */ + pstate->continuescan = false; + so->needPrimScan = true; + } + else + { + /* Override _bt_check_compare, continue primitive scan */ + pstate->continuescan = true; + + /* + * We will end up here repeatedly given a group of tuples > the + * previous array keys and < the now-current keys (for a backwards + * scan it's just the same, though the operators swap positions). + * + * We must avoid allowing this linear search process to scan very + * many tuples from well before the start of tuples matching the + * current array keys (or from well before the point where we'll + * once again have to advance the scan's array keys). + * + * We keep the overhead under control by speculatively "looking + * ahead" to later still-unscanned items from this same leaf page. + * We'll only attempt this once the number of tuples that the + * linear search process has examined starts to get out of hand. + */ + pstate->rechecks++; + if (pstate->rechecks >= LOOK_AHEAD_REQUIRED_RECHECKS) + { + /* See if we should skip ahead within the current leaf page */ + _bt_checkkeys_look_ahead(scan, pstate, tupnatts, tupdesc); + + /* + * Might have set pstate.skip to a later page offset. When + * that happens then _bt_readpage caller will inexpensively + * skip ahead to a later tuple from the same page (the one + * just after the tuple we successfully "looked ahead" to). + */ + } + } + + /* This indextuple doesn't match the current qual, in any case */ + return false; + } + + /* + * Caller's tuple is >= the current set of array keys and other equality + * constraint scan keys (or <= if this is a backwards scan). It's now + * clear that we _must_ advance any required array keys in lockstep with + * the scan. + */ + return _bt_advance_array_keys(scan, pstate, tuple, tupnatts, tupdesc, + ikey, true); +} + +/* + * Test whether an indextuple satisfies current scan condition. + * + * Return true if so, false if not. If not, also sets *continuescan to false + * when it's also not possible for any later tuples to pass the current qual + * (with the scan's current set of array keys, in the current scan direction), + * in addition to setting *ikey to the so->keyData[] subscript/offset for the + * unsatisfied scan key (needed when caller must consider advancing the scan's + * array keys). + * + * This is a subroutine for _bt_checkkeys. We provisionally assume that + * reaching the end of the current set of required keys (in particular the + * current required array keys) ends the ongoing (primitive) index scan. + * Callers without array keys should just end the scan right away when they + * find that continuescan has been set to false here by us. Things are more + * complicated for callers with array keys. + * + * Callers with array keys must first consider advancing the arrays when + * continuescan has been set to false here by us. They must then consider if + * it really does make sense to end the current (primitive) index scan, in + * light of everything that is known at that point. (In general when we set + * continuescan=false for these callers it must be treated as provisional.) + * + * We deal with advancing unsatisfied non-required arrays directly, though. + * This is safe, since by definition non-required keys can't end the scan. + * This is just how we determine if non-required arrays are just unsatisfied + * by the current array key, or if they're truly unsatisfied (that is, if + * they're unsatisfied by every possible array key). + * + * Though we advance non-required array keys on our own, that shouldn't have + * any lasting consequences for the scan. By definition, non-required arrays + * have no fixed relationship with the scan's progress. (There are delicate + * considerations for non-required arrays when the arrays need to be advanced + * following our setting continuescan to false, but that doesn't concern us.) + * + * Pass advancenonrequired=false to avoid all array related side effects. + * This allows _bt_advance_array_keys caller to avoid infinite recursion. + */ +static bool +_bt_check_compare(IndexScanDesc scan, ScanDirection dir, + IndexTuple tuple, int tupnatts, TupleDesc tupdesc, + bool advancenonrequired, bool prechecked, bool firstmatch, + bool *continuescan, int *ikey) +{ + BTScanOpaque so = (BTScanOpaque) scan->opaque; - tupdesc = RelationGetDescr(scan->indexRelation); - so = (BTScanOpaque) scan->opaque; - keysz = so->numberOfKeys; + *continuescan = true; /* default assumption */ - for (key = so->keyData, ikey = 0; ikey < keysz; key++, ikey++) + for (; *ikey < so->numberOfKeys; (*ikey)++) { + ScanKey key = so->keyData + *ikey; Datum datum; bool isNull; - Datum test; + bool requiredSameDir = false, + requiredOppositeDirOnly = false; + + /* + * Check if the key is required in the current scan direction, in the + * opposite scan direction _only_, or in neither direction + */ + if (((key->sk_flags & SK_BT_REQFWD) && ScanDirectionIsForward(dir)) || + ((key->sk_flags & SK_BT_REQBKWD) && ScanDirectionIsBackward(dir))) + requiredSameDir = true; + else if (((key->sk_flags & SK_BT_REQFWD) && ScanDirectionIsBackward(dir)) || + ((key->sk_flags & SK_BT_REQBKWD) && ScanDirectionIsForward(dir))) + requiredOppositeDirOnly = true; + + /* + * If the caller told us the *continuescan flag is known to be true + * for the last item on the page, then we know the keys required for + * the current direction scan should be matched. Otherwise, the + * *continuescan flag would be set for the current item and + * subsequently the last item on the page accordingly. + * + * If the key is required for the opposite direction scan, we can skip + * the check if the caller tells us there was already at least one + * matching item on the page. Also, we require the *continuescan flag + * to be true for the last item on the page to know there are no + * NULLs. + * + * Both cases above work except for the row keys, where NULLs could be + * found in the middle of matching values. + */ + if (prechecked && + (requiredSameDir || (requiredOppositeDirOnly && firstmatch)) && + !(key->sk_flags & SK_ROW_HEADER)) + continue; if (key->sk_attno > tupnatts) { @@ -1390,7 +3736,6 @@ _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, int tupnatts, * right could be any possible value. Assume that truncated * attribute passes the qual. */ - Assert(ScanDirectionIsForward(dir)); Assert(BTreeTupleIsPivot(tuple)); continue; } @@ -1429,11 +3774,7 @@ _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, int tupnatts, * scan direction, then we can conclude no further tuples will * pass, either. */ - if ((key->sk_flags & SK_BT_REQFWD) && - ScanDirectionIsForward(dir)) - *continuescan = false; - else if ((key->sk_flags & SK_BT_REQBKWD) && - ScanDirectionIsBackward(dir)) + if (requiredSameDir) *continuescan = false; /* @@ -1455,6 +3796,8 @@ _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, int tupnatts, * because it's not possible for any future tuples to pass. On * a forward scan, however, we must keep going, because we may * have initially positioned to the start of the index. + * (_bt_advance_array_keys also relies on this behavior during + * forward scans.) */ if ((key->sk_flags & (SK_BT_REQFWD | SK_BT_REQBKWD)) && ScanDirectionIsBackward(dir)) @@ -1471,6 +3814,8 @@ _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, int tupnatts, * because it's not possible for any future tuples to pass. On * a backward scan, however, we must keep going, because we * may have initially positioned to the end of the index. + * (_bt_advance_array_keys also relies on this behavior during + * backward scans.) */ if ((key->sk_flags & (SK_BT_REQFWD | SK_BT_REQBKWD)) && ScanDirectionIsForward(dir)) @@ -1483,10 +3828,16 @@ _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, int tupnatts, return false; } - test = FunctionCall2Coll(&key->sk_func, key->sk_collation, - datum, key->sk_argument); - - if (!DatumGetBool(test)) + /* + * Apply the key-checking function, though only if we must. + * + * When a key is required in the opposite-of-scan direction _only_, + * then it must already be satisfied if firstmatch=true indicates that + * an earlier tuple from this same page satisfied it earlier on. + */ + if (!(requiredOppositeDirOnly && firstmatch) && + !DatumGetBool(FunctionCall2Coll(&key->sk_func, key->sk_collation, + datum, key->sk_argument))) { /* * Tuple fails this qual. If it's a required qual for the current @@ -1498,15 +3849,23 @@ _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, int tupnatts, * initial positioning in _bt_first() when they are available. See * comments in _bt_first(). */ - if ((key->sk_flags & SK_BT_REQFWD) && - ScanDirectionIsForward(dir)) - *continuescan = false; - else if ((key->sk_flags & SK_BT_REQBKWD) && - ScanDirectionIsBackward(dir)) + if (requiredSameDir) *continuescan = false; /* - * In any case, this indextuple doesn't match the qual. + * If this is a non-required equality-type array key, the tuple + * needs to be checked against every possible array key. Handle + * this by "advancing" the scan key's array to a matching value + * (if we're successful then the tuple might match the qual). + */ + else if (advancenonrequired && + key->sk_strategy == BTEqualStrategyNumber && + (key->sk_flags & SK_SEARCHARRAY)) + return _bt_advance_array_keys(scan, NULL, tuple, tupnatts, + tupdesc, *ikey, false); + + /* + * This indextuple doesn't match the qual. */ return false; } @@ -1523,7 +3882,7 @@ _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, int tupnatts, * it's not possible for any future tuples in the current scan direction * to pass the qual. * - * This is a subroutine for _bt_checkkeys, which see for more info. + * This is a subroutine for _bt_checkkeys/_bt_check_compare. */ static bool _bt_check_rowcompare(ScanKey skey, IndexTuple tuple, int tupnatts, @@ -1552,7 +3911,6 @@ _bt_check_rowcompare(ScanKey skey, IndexTuple tuple, int tupnatts, * right could be any possible value. Assume that truncated * attribute passes the qual. */ - Assert(ScanDirectionIsForward(dir)); Assert(BTreeTupleIsPivot(tuple)); cmpresult = 0; if (subkey->sk_flags & SK_ROW_END) @@ -1579,6 +3937,8 @@ _bt_check_rowcompare(ScanKey skey, IndexTuple tuple, int tupnatts, * because it's not possible for any future tuples to pass. On * a forward scan, however, we must keep going, because we may * have initially positioned to the start of the index. + * (_bt_advance_array_keys also relies on this behavior during + * forward scans.) */ if ((subkey->sk_flags & (SK_BT_REQFWD | SK_BT_REQBKWD)) && ScanDirectionIsBackward(dir)) @@ -1595,6 +3955,8 @@ _bt_check_rowcompare(ScanKey skey, IndexTuple tuple, int tupnatts, * because it's not possible for any future tuples to pass. On * a backward scan, however, we must keep going, because we * may have initially positioned to the end of the index. + * (_bt_advance_array_keys also relies on this behavior during + * backward scans.) */ if ((subkey->sk_flags & (SK_BT_REQFWD | SK_BT_REQBKWD)) && ScanDirectionIsForward(dir)) @@ -1690,6 +4052,90 @@ _bt_check_rowcompare(ScanKey skey, IndexTuple tuple, int tupnatts, return result; } +/* + * Determine if a scan with array keys should skip over uninteresting tuples. + * + * This is a subroutine for _bt_checkkeys. Called when _bt_readpage's linear + * search process (started after it finishes reading an initial group of + * matching tuples, used to locate the start of the next group of tuples + * matching the next set of required array keys) has already scanned an + * excessive number of tuples whose key space is "between arrays". + * + * When we perform look ahead successfully, we'll sets pstate.skip, which + * instructs _bt_readpage to skip ahead to that tuple next (could be past the + * end of the scan's leaf page). Pages where the optimization is effective + * will generally still need to skip several times. Each call here performs + * only a single "look ahead" comparison of a later tuple, whose distance from + * the current tuple's offset number is determined by applying heuristics. + */ +static void +_bt_checkkeys_look_ahead(IndexScanDesc scan, BTReadPageState *pstate, + int tupnatts, TupleDesc tupdesc) +{ + ScanDirection dir = pstate->dir; + OffsetNumber aheadoffnum; + IndexTuple ahead; + + /* Avoid looking ahead when comparing the page high key */ + if (pstate->offnum < pstate->minoff) + return; + + /* + * Don't look ahead when there aren't enough tuples remaining on the page + * (in the current scan direction) for it to be worth our while + */ + if (ScanDirectionIsForward(dir) && + pstate->offnum >= pstate->maxoff - LOOK_AHEAD_DEFAULT_DISTANCE) + return; + else if (ScanDirectionIsBackward(dir) && + pstate->offnum <= pstate->minoff + LOOK_AHEAD_DEFAULT_DISTANCE) + return; + + /* + * The look ahead distance starts small, and ramps up as each call here + * allows _bt_readpage to skip over more tuples + */ + if (!pstate->targetdistance) + pstate->targetdistance = LOOK_AHEAD_DEFAULT_DISTANCE; + else if (pstate->targetdistance < MaxIndexTuplesPerPage / 2) + pstate->targetdistance *= 2; + + /* Don't read past the end (or before the start) of the page, though */ + if (ScanDirectionIsForward(dir)) + aheadoffnum = Min((int) pstate->maxoff, + (int) pstate->offnum + pstate->targetdistance); + else + aheadoffnum = Max((int) pstate->minoff, + (int) pstate->offnum - pstate->targetdistance); + + ahead = (IndexTuple) PageGetItem(pstate->page, + PageGetItemId(pstate->page, aheadoffnum)); + if (_bt_tuple_before_array_skeys(scan, dir, ahead, tupdesc, tupnatts, + false, 0, NULL)) + { + /* + * Success -- instruct _bt_readpage to skip ahead to very next tuple + * after the one we determined was still before the current array keys + */ + if (ScanDirectionIsForward(dir)) + pstate->skip = aheadoffnum + 1; + else + pstate->skip = aheadoffnum - 1; + } + else + { + /* + * Failure -- "ahead" tuple is too far ahead (we were too aggressive). + * + * Reset the number of rechecks, and aggressively reduce the target + * distance (we're much more aggressive here than we were when the + * distance was initially ramped up). + */ + pstate->rechecks = 0; + pstate->targetdistance = Max(pstate->targetdistance / 8, 1); + } +} + /* * _bt_killitems - set LP_DEAD state for items an indexscan caller has * told us were killed diff --git a/src/backend/access/nbtree/nbtvalidate.c b/src/backend/access/nbtree/nbtvalidate.c index de823ddfed564..e9d4cd60de3c2 100644 --- a/src/backend/access/nbtree/nbtvalidate.c +++ b/src/backend/access/nbtree/nbtvalidate.c @@ -3,7 +3,7 @@ * nbtvalidate.c * Opclass validator for btree. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c index c87e46ed66e7e..b5b0e22447e4b 100644 --- a/src/backend/access/nbtree/nbtxlog.c +++ b/src/backend/access/nbtree/nbtxlog.c @@ -4,7 +4,7 @@ * WAL replay logic for btrees. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -18,10 +18,8 @@ #include "access/nbtree.h" #include "access/nbtxlog.h" #include "access/transam.h" -#include "access/xlog.h" #include "access/xlogutils.h" -#include "miscadmin.h" -#include "storage/procarray.h" +#include "storage/standby.h" #include "utils/memutils.h" static MemoryContext opCtx; /* working memory for operations */ diff --git a/src/backend/access/rmgrdesc/README b/src/backend/access/rmgrdesc/README new file mode 100644 index 0000000000000..c56fd4508f02e --- /dev/null +++ b/src/backend/access/rmgrdesc/README @@ -0,0 +1,61 @@ +src/backend/access/rmgrdesc/README + +WAL resource manager description functions +========================================== + +For debugging purposes, there is a "description function", or rmgrdesc +function, for each WAL resource manager. The rmgrdesc function parses the WAL +record and prints the contents of the WAL record in a somewhat human-readable +format. + +The rmgrdesc functions for all resource managers are gathered in this +directory, because they are also used in the stand-alone pg_waldump program. +They could potentially be used by out-of-tree debugging tools too, although +neither the description functions nor the output format should be considered +part of a stable API + +Guidelines for rmgrdesc output format +------------------------------------- + +The goal of these guidelines is to avoid gratuitous inconsistencies across +each rmgr, and to allow users to parse desc output strings without too much +difficulty. This is not an API specification or an interchange format. +(Only heapam and nbtree desc routines follow these guidelines at present, in +any case.) + +Record descriptions are similar to JSON style key/value objects. However, +there is no explicit "string" type/string escaping. Top-level { } brackets +should be omitted. For example: + +snapshotConflictHorizon: 0, flags: 0x03 + +Record descriptions may contain variable-length arrays. For example: + +nunused: 5, unused: [1, 2, 3, 4, 5] + +Nested objects are supported via { } brackets. They generally appear inside +variable-length arrays. For example: + +ndeleted: 0, nupdated: 1, deleted: [], updated: [{ off: 45, nptids: 1, ptids: [0] }] + +Try to output things in an order that faithfully represents the order of +fields from the underlying physical WAL record struct. Key names should be +unique (at the same nesting level) to make parsing easy. It's a good idea if +the number of items in the array appears before the array. + +It's okay for individual WAL record types to invent their own conventions. +For example, Heap2's PRUNE record descriptions use a custom array format for +the record's "redirected" field: + +... redirected: [1->4, 5->9], dead: [10, 11], unused: [3, 7, 8] + +Arguably the desc routine should be using object notation for this instead. +However, there is value in using a custom format when it conveys useful +information about the underlying physical data structures. + +This ad-hoc format has the advantage of being close to the format used for +the "dead" and "unused" arrays (which follow the standard desc convention for +page offset number arrays). It suggests that the "redirected" elements shown +are just pairs of page offset numbers (which is how it really works). + +rmgrdesc_utils.c contains some helper functions to print data in this format. diff --git a/src/backend/access/rmgrdesc/brindesc.c b/src/backend/access/rmgrdesc/brindesc.c index 1466a31bbb6e0..3f55022a3e000 100644 --- a/src/backend/access/rmgrdesc/brindesc.c +++ b/src/backend/access/rmgrdesc/brindesc.c @@ -3,7 +3,7 @@ * brindesc.c * rmgr descriptor routines for BRIN indexes * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/access/rmgrdesc/clogdesc.c b/src/backend/access/rmgrdesc/clogdesc.c index e60b76f9da6c3..c1d47c219f9d2 100644 --- a/src/backend/access/rmgrdesc/clogdesc.c +++ b/src/backend/access/rmgrdesc/clogdesc.c @@ -3,7 +3,7 @@ * clogdesc.c * rmgr descriptor routines for access/transam/clog.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,18 +25,18 @@ clog_desc(StringInfo buf, XLogReaderState *record) if (info == CLOG_ZEROPAGE) { - int pageno; + int64 pageno; - memcpy(&pageno, rec, sizeof(int)); - appendStringInfo(buf, "page %d", pageno); + memcpy(&pageno, rec, sizeof(pageno)); + appendStringInfo(buf, "page %lld", (long long) pageno); } else if (info == CLOG_TRUNCATE) { xl_clog_truncate xlrec; memcpy(&xlrec, rec, sizeof(xl_clog_truncate)); - appendStringInfo(buf, "page %d; oldestXact %u", - xlrec.pageno, xlrec.oldestXact); + appendStringInfo(buf, "page %lld; oldestXact %u", + (long long) xlrec.pageno, xlrec.oldestXact); } } diff --git a/src/backend/access/rmgrdesc/committsdesc.c b/src/backend/access/rmgrdesc/committsdesc.c index e7155cd507272..f5f09a1bc7968 100644 --- a/src/backend/access/rmgrdesc/committsdesc.c +++ b/src/backend/access/rmgrdesc/committsdesc.c @@ -3,7 +3,7 @@ * committsdesc.c * rmgr descriptor routines for access/transam/commit_ts.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -15,7 +15,6 @@ #include "postgres.h" #include "access/commit_ts.h" -#include "utils/timestamp.h" void @@ -26,17 +25,17 @@ commit_ts_desc(StringInfo buf, XLogReaderState *record) if (info == COMMIT_TS_ZEROPAGE) { - int pageno; + int64 pageno; - memcpy(&pageno, rec, sizeof(int)); - appendStringInfo(buf, "%d", pageno); + memcpy(&pageno, rec, sizeof(pageno)); + appendStringInfo(buf, "%lld", (long long) pageno); } else if (info == COMMIT_TS_TRUNCATE) { xl_commit_ts_truncate *trunc = (xl_commit_ts_truncate *) rec; - appendStringInfo(buf, "pageno %d, oldestXid %u", - trunc->pageno, trunc->oldestXid); + appendStringInfo(buf, "pageno %lld, oldestXid %u", + (long long) trunc->pageno, trunc->oldestXid); } } diff --git a/src/backend/access/rmgrdesc/dbasedesc.c b/src/backend/access/rmgrdesc/dbasedesc.c index 3922120d647c0..731dac826cccd 100644 --- a/src/backend/access/rmgrdesc/dbasedesc.c +++ b/src/backend/access/rmgrdesc/dbasedesc.c @@ -3,7 +3,7 @@ * dbasedesc.c * rmgr descriptor routines for commands/dbcommands.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/access/rmgrdesc/genericdesc.c b/src/backend/access/rmgrdesc/genericdesc.c index 4ac589d1ba186..c35641483b8f9 100644 --- a/src/backend/access/rmgrdesc/genericdesc.c +++ b/src/backend/access/rmgrdesc/genericdesc.c @@ -4,7 +4,7 @@ * rmgr descriptor routines for access/transam/generic_xlog.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/rmgrdesc/genericdesc.c @@ -15,7 +15,6 @@ #include "access/generic_xlog.h" #include "lib/stringinfo.h" -#include "storage/relfilelocator.h" /* * Description of generic xlog record: write page regions that this record diff --git a/src/backend/access/rmgrdesc/gindesc.c b/src/backend/access/rmgrdesc/gindesc.c index 246a6a6b857d9..4746f246ff1f9 100644 --- a/src/backend/access/rmgrdesc/gindesc.c +++ b/src/backend/access/rmgrdesc/gindesc.c @@ -3,7 +3,7 @@ * gindesc.c * rmgr descriptor routines for access/transam/gin/ginxlog.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -15,9 +15,7 @@ #include "postgres.h" #include "access/ginxlog.h" -#include "access/xlogutils.h" #include "lib/stringinfo.h" -#include "storage/relfilelocator.h" static void desc_recompress_leaf(StringInfo buf, ginxlogRecompressDataLeaf *insertData) diff --git a/src/backend/access/rmgrdesc/gistdesc.c b/src/backend/access/rmgrdesc/gistdesc.c index 5dc6e1dcee086..5efbbf72e5781 100644 --- a/src/backend/access/rmgrdesc/gistdesc.c +++ b/src/backend/access/rmgrdesc/gistdesc.c @@ -3,7 +3,7 @@ * gistdesc.c * rmgr descriptor routines for access/gist/gistxlog.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -16,7 +16,6 @@ #include "access/gistxlog.h" #include "lib/stringinfo.h" -#include "storage/relfilelocator.h" static void out_gistxlogPageUpdate(StringInfo buf, gistxlogPageUpdate *xlrec) @@ -26,18 +25,20 @@ out_gistxlogPageUpdate(StringInfo buf, gistxlogPageUpdate *xlrec) static void out_gistxlogPageReuse(StringInfo buf, gistxlogPageReuse *xlrec) { - appendStringInfo(buf, "rel %u/%u/%u; blk %u; snapshotConflictHorizon %u:%u", + appendStringInfo(buf, "rel %u/%u/%u; blk %u; snapshotConflictHorizon %u:%u, isCatalogRel %c", xlrec->locator.spcOid, xlrec->locator.dbOid, xlrec->locator.relNumber, xlrec->block, EpochFromFullTransactionId(xlrec->snapshotConflictHorizon), - XidFromFullTransactionId(xlrec->snapshotConflictHorizon)); + XidFromFullTransactionId(xlrec->snapshotConflictHorizon), + xlrec->isCatalogRel ? 'T' : 'F'); } static void out_gistxlogDelete(StringInfo buf, gistxlogDelete *xlrec) { - appendStringInfo(buf, "delete: snapshotConflictHorizon %u, nitems: %u", - xlrec->snapshotConflictHorizon, xlrec->ntodelete); + appendStringInfo(buf, "delete: snapshotConflictHorizon %u, nitems: %u, isCatalogRel %c", + xlrec->snapshotConflictHorizon, xlrec->ntodelete, + xlrec->isCatalogRel ? 'T' : 'F'); } static void diff --git a/src/backend/access/rmgrdesc/hashdesc.c b/src/backend/access/rmgrdesc/hashdesc.c index b6810a932071b..dd0bfff8cbc25 100644 --- a/src/backend/access/rmgrdesc/hashdesc.c +++ b/src/backend/access/rmgrdesc/hashdesc.c @@ -3,7 +3,7 @@ * hashdesc.c * rmgr descriptor routines for access/hash/hash.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -113,9 +113,10 @@ hash_desc(StringInfo buf, XLogReaderState *record) { xl_hash_vacuum_one_page *xlrec = (xl_hash_vacuum_one_page *) rec; - appendStringInfo(buf, "ntuples %d, snapshotConflictHorizon %u", + appendStringInfo(buf, "ntuples %d, snapshotConflictHorizon %u, isCatalogRel %c", xlrec->ntuples, - xlrec->snapshotConflictHorizon); + xlrec->snapshotConflictHorizon, + xlrec->isCatalogRel ? 'T' : 'F'); break; } } diff --git a/src/backend/access/rmgrdesc/heapdesc.c b/src/backend/access/rmgrdesc/heapdesc.c index d73248abddf27..5f5673e088b01 100644 --- a/src/backend/access/rmgrdesc/heapdesc.c +++ b/src/backend/access/rmgrdesc/heapdesc.c @@ -3,7 +3,7 @@ * heapdesc.c * rmgr descriptor routines for access/heap/heapam.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -47,7 +47,7 @@ infobits_desc(StringInfo buf, uint8 infobits, const char *keyname) buf->data[buf->len] = '\0'; } - appendStringInfoString(buf, "]"); + appendStringInfoChar(buf, ']'); } static void @@ -68,13 +68,13 @@ truncate_flags_desc(StringInfo buf, uint8 flags) buf->data[buf->len] = '\0'; } - appendStringInfoString(buf, "]"); + appendStringInfoChar(buf, ']'); } static void plan_elem_desc(StringInfo buf, void *plan, void *data) { - xl_heap_freeze_plan *new_plan = (xl_heap_freeze_plan *) plan; + xlhp_freeze_plan *new_plan = (xlhp_freeze_plan *) plan; OffsetNumber **offsets = data; appendStringInfo(buf, "{ xmax: %u, infomask: %u, infomask2: %u, ntuples: %u", @@ -88,7 +88,95 @@ plan_elem_desc(StringInfo buf, void *plan, void *data) *offsets += new_plan->ntuples; - appendStringInfo(buf, " }"); + appendStringInfoString(buf, " }"); +} + + +/* + * Given a MAXALIGNed buffer returned by XLogRecGetBlockData() and pointed to + * by cursor and any xl_heap_prune flags, deserialize the arrays of + * OffsetNumbers contained in an XLOG_HEAP2_PRUNE_* record. + * + * This is in heapdesc.c so it can be shared between heap2_redo and heap2_desc + * code, the latter of which is used in frontend (pg_waldump) code. + */ +void +heap_xlog_deserialize_prune_and_freeze(char *cursor, uint8 flags, + int *nplans, xlhp_freeze_plan **plans, + OffsetNumber **frz_offsets, + int *nredirected, OffsetNumber **redirected, + int *ndead, OffsetNumber **nowdead, + int *nunused, OffsetNumber **nowunused) +{ + if (flags & XLHP_HAS_FREEZE_PLANS) + { + xlhp_freeze_plans *freeze_plans = (xlhp_freeze_plans *) cursor; + + *nplans = freeze_plans->nplans; + Assert(*nplans > 0); + *plans = freeze_plans->plans; + + cursor += offsetof(xlhp_freeze_plans, plans); + cursor += sizeof(xlhp_freeze_plan) * *nplans; + } + else + { + *nplans = 0; + *plans = NULL; + } + + if (flags & XLHP_HAS_REDIRECTIONS) + { + xlhp_prune_items *subrecord = (xlhp_prune_items *) cursor; + + *nredirected = subrecord->ntargets; + Assert(*nredirected > 0); + *redirected = &subrecord->data[0]; + + cursor += offsetof(xlhp_prune_items, data); + cursor += sizeof(OffsetNumber[2]) * *nredirected; + } + else + { + *nredirected = 0; + *redirected = NULL; + } + + if (flags & XLHP_HAS_DEAD_ITEMS) + { + xlhp_prune_items *subrecord = (xlhp_prune_items *) cursor; + + *ndead = subrecord->ntargets; + Assert(*ndead > 0); + *nowdead = subrecord->data; + + cursor += offsetof(xlhp_prune_items, data); + cursor += sizeof(OffsetNumber) * *ndead; + } + else + { + *ndead = 0; + *nowdead = NULL; + } + + if (flags & XLHP_HAS_NOW_UNUSED_ITEMS) + { + xlhp_prune_items *subrecord = (xlhp_prune_items *) cursor; + + *nunused = subrecord->ntargets; + Assert(*nunused > 0); + *nowunused = subrecord->data; + + cursor += offsetof(xlhp_prune_items, data); + cursor += sizeof(OffsetNumber) * *nunused; + } + else + { + *nunused = 0; + *nowunused = NULL; + } + + *frz_offsets = (OffsetNumber *) cursor; } void @@ -175,84 +263,76 @@ heap2_desc(StringInfo buf, XLogReaderState *record) uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; info &= XLOG_HEAP_OPMASK; - if (info == XLOG_HEAP2_PRUNE) + if (info == XLOG_HEAP2_PRUNE_ON_ACCESS || + info == XLOG_HEAP2_PRUNE_VACUUM_SCAN || + info == XLOG_HEAP2_PRUNE_VACUUM_CLEANUP) { xl_heap_prune *xlrec = (xl_heap_prune *) rec; - appendStringInfo(buf, "snapshotConflictHorizon: %u, nredirected: %u, ndead: %u", - xlrec->snapshotConflictHorizon, - xlrec->nredirected, - xlrec->ndead); - - if (XLogRecHasBlockData(record, 0)) - { - OffsetNumber *end; - OffsetNumber *redirected; - OffsetNumber *nowdead; - OffsetNumber *nowunused; - int nredirected; - int nunused; - Size datalen; - - redirected = (OffsetNumber *) XLogRecGetBlockData(record, 0, - &datalen); - - nredirected = xlrec->nredirected; - end = (OffsetNumber *) ((char *) redirected + datalen); - nowdead = redirected + (nredirected * 2); - nowunused = nowdead + xlrec->ndead; - nunused = (end - nowunused); - Assert(nunused >= 0); - - appendStringInfo(buf, ", nunused: %d", nunused); - - appendStringInfoString(buf, ", redirected:"); - array_desc(buf, redirected, sizeof(OffsetNumber) * 2, - nredirected, &redirect_elem_desc, NULL); - appendStringInfoString(buf, ", dead:"); - array_desc(buf, nowdead, sizeof(OffsetNumber), xlrec->ndead, - &offset_elem_desc, NULL); - appendStringInfoString(buf, ", unused:"); - array_desc(buf, nowunused, sizeof(OffsetNumber), nunused, - &offset_elem_desc, NULL); - } - } - else if (info == XLOG_HEAP2_VACUUM) - { - xl_heap_vacuum *xlrec = (xl_heap_vacuum *) rec; - - appendStringInfo(buf, "nunused: %u", xlrec->nunused); - - if (XLogRecHasBlockData(record, 0)) + if (xlrec->flags & XLHP_HAS_CONFLICT_HORIZON) { - OffsetNumber *nowunused; + TransactionId conflict_xid; - nowunused = (OffsetNumber *) XLogRecGetBlockData(record, 0, NULL); + memcpy(&conflict_xid, rec + SizeOfHeapPrune, sizeof(TransactionId)); - appendStringInfoString(buf, ", unused:"); - array_desc(buf, nowunused, sizeof(OffsetNumber), xlrec->nunused, - &offset_elem_desc, NULL); + appendStringInfo(buf, "snapshotConflictHorizon: %u", + conflict_xid); } - } - else if (info == XLOG_HEAP2_FREEZE_PAGE) - { - xl_heap_freeze_page *xlrec = (xl_heap_freeze_page *) rec; - appendStringInfo(buf, "snapshotConflictHorizon: %u, nplans: %u", - xlrec->snapshotConflictHorizon, xlrec->nplans); + appendStringInfo(buf, ", isCatalogRel: %c", + xlrec->flags & XLHP_IS_CATALOG_REL ? 'T' : 'F'); if (XLogRecHasBlockData(record, 0)) { - xl_heap_freeze_plan *plans; - OffsetNumber *offsets; - - plans = (xl_heap_freeze_plan *) XLogRecGetBlockData(record, 0, NULL); - offsets = (OffsetNumber *) ((char *) plans + - (xlrec->nplans * - sizeof(xl_heap_freeze_plan))); - appendStringInfoString(buf, ", plans:"); - array_desc(buf, plans, sizeof(xl_heap_freeze_plan), xlrec->nplans, - &plan_elem_desc, &offsets); + Size datalen; + OffsetNumber *redirected; + OffsetNumber *nowdead; + OffsetNumber *nowunused; + int nredirected; + int nunused; + int ndead; + int nplans; + xlhp_freeze_plan *plans; + OffsetNumber *frz_offsets; + + char *cursor = XLogRecGetBlockData(record, 0, &datalen); + + heap_xlog_deserialize_prune_and_freeze(cursor, xlrec->flags, + &nplans, &plans, &frz_offsets, + &nredirected, &redirected, + &ndead, &nowdead, + &nunused, &nowunused); + + appendStringInfo(buf, ", nplans: %u, nredirected: %u, ndead: %u, nunused: %u", + nplans, nredirected, ndead, nunused); + + if (nplans > 0) + { + appendStringInfoString(buf, ", plans:"); + array_desc(buf, plans, sizeof(xlhp_freeze_plan), nplans, + &plan_elem_desc, &frz_offsets); + } + + if (nredirected > 0) + { + appendStringInfoString(buf, ", redirected:"); + array_desc(buf, redirected, sizeof(OffsetNumber) * 2, + nredirected, &redirect_elem_desc, NULL); + } + + if (ndead > 0) + { + appendStringInfoString(buf, ", dead:"); + array_desc(buf, nowdead, sizeof(OffsetNumber), ndead, + &offset_elem_desc, NULL); + } + + if (nunused > 0) + { + appendStringInfoString(buf, ", unused:"); + array_desc(buf, nowunused, sizeof(OffsetNumber), nunused, + &offset_elem_desc, NULL); + } } } else if (info == XLOG_HEAP2_VISIBLE) @@ -353,14 +433,14 @@ heap2_identify(uint8 info) switch (info & ~XLR_INFO_MASK) { - case XLOG_HEAP2_PRUNE: - id = "PRUNE"; + case XLOG_HEAP2_PRUNE_ON_ACCESS: + id = "PRUNE_ON_ACCESS"; break; - case XLOG_HEAP2_VACUUM: - id = "VACUUM"; + case XLOG_HEAP2_PRUNE_VACUUM_SCAN: + id = "PRUNE_VACUUM_SCAN"; break; - case XLOG_HEAP2_FREEZE_PAGE: - id = "FREEZE_PAGE"; + case XLOG_HEAP2_PRUNE_VACUUM_CLEANUP: + id = "PRUNE_VACUUM_CLEANUP"; break; case XLOG_HEAP2_VISIBLE: id = "VISIBLE"; diff --git a/src/backend/access/rmgrdesc/logicalmsgdesc.c b/src/backend/access/rmgrdesc/logicalmsgdesc.c index 0578ec5535e07..430d7668c0c2e 100644 --- a/src/backend/access/rmgrdesc/logicalmsgdesc.c +++ b/src/backend/access/rmgrdesc/logicalmsgdesc.c @@ -3,7 +3,7 @@ * logicalmsgdesc.c * rmgr descriptor routines for replication/logical/message.c * - * Portions Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2015-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/access/rmgrdesc/meson.build b/src/backend/access/rmgrdesc/meson.build index f76e87e2d7ddf..e8b7a65fc76c2 100644 --- a/src/backend/access/rmgrdesc/meson.build +++ b/src/backend/access/rmgrdesc/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # used by frontend programs like pg_waldump rmgr_desc_sources = files( diff --git a/src/backend/access/rmgrdesc/mxactdesc.c b/src/backend/access/rmgrdesc/mxactdesc.c index a2fa1eca18188..3e8ad4d5ef82b 100644 --- a/src/backend/access/rmgrdesc/mxactdesc.c +++ b/src/backend/access/rmgrdesc/mxactdesc.c @@ -3,7 +3,7 @@ * mxactdesc.c * rmgr descriptor routines for access/transam/multixact.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -55,10 +55,10 @@ multixact_desc(StringInfo buf, XLogReaderState *record) if (info == XLOG_MULTIXACT_ZERO_OFF_PAGE || info == XLOG_MULTIXACT_ZERO_MEM_PAGE) { - int pageno; + int64 pageno; - memcpy(&pageno, rec, sizeof(int)); - appendStringInfo(buf, "%d", pageno); + memcpy(&pageno, rec, sizeof(pageno)); + appendStringInfo(buf, "%lld", (long long) pageno); } else if (info == XLOG_MULTIXACT_CREATE_ID) { diff --git a/src/backend/access/rmgrdesc/nbtdesc.c b/src/backend/access/rmgrdesc/nbtdesc.c index e4fbaa4d5d5f9..0f201ca2237c8 100644 --- a/src/backend/access/rmgrdesc/nbtdesc.c +++ b/src/backend/access/rmgrdesc/nbtdesc.c @@ -3,7 +3,7 @@ * nbtdesc.c * rmgr descriptor routines for access/nbtree/nbtxlog.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -71,9 +71,10 @@ btree_desc(StringInfo buf, XLogReaderState *record) { xl_btree_delete *xlrec = (xl_btree_delete *) rec; - appendStringInfo(buf, "snapshotConflictHorizon: %u, ndeleted: %u, nupdated: %u", + appendStringInfo(buf, "snapshotConflictHorizon: %u, ndeleted: %u, nupdated: %u, isCatalogRel: %c", xlrec->snapshotConflictHorizon, - xlrec->ndeleted, xlrec->nupdated); + xlrec->ndeleted, xlrec->nupdated, + xlrec->isCatalogRel ? 'T' : 'F'); if (XLogRecHasBlockData(record, 0)) delvacuum_desc(buf, XLogRecGetBlockData(record, 0, NULL), @@ -113,11 +114,12 @@ btree_desc(StringInfo buf, XLogReaderState *record) { xl_btree_reuse_page *xlrec = (xl_btree_reuse_page *) rec; - appendStringInfo(buf, "rel: %u/%u/%u, snapshotConflictHorizon: %u:%u", + appendStringInfo(buf, "rel: %u/%u/%u, snapshotConflictHorizon: %u:%u, isCatalogRel: %c", xlrec->locator.spcOid, xlrec->locator.dbOid, xlrec->locator.relNumber, EpochFromFullTransactionId(xlrec->snapshotConflictHorizon), - XidFromFullTransactionId(xlrec->snapshotConflictHorizon)); + XidFromFullTransactionId(xlrec->snapshotConflictHorizon), + xlrec->isCatalogRel ? 'T' : 'F'); break; } case XLOG_BTREE_META_CLEANUP: @@ -248,5 +250,5 @@ delvacuum_desc(StringInfo buf, char *block_data, ((char *) updates + SizeOfBtreeUpdate + updates->ndeletedtids * sizeof(uint16)); } - appendStringInfoString(buf, "]"); + appendStringInfoChar(buf, ']'); } diff --git a/src/backend/access/rmgrdesc/relmapdesc.c b/src/backend/access/rmgrdesc/relmapdesc.c index 82ad51eb9a219..46d39cdca0eed 100644 --- a/src/backend/access/rmgrdesc/relmapdesc.c +++ b/src/backend/access/rmgrdesc/relmapdesc.c @@ -3,7 +3,7 @@ * relmapdesc.c * rmgr descriptor routines for utils/cache/relmapper.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/access/rmgrdesc/replorigindesc.c b/src/backend/access/rmgrdesc/replorigindesc.c index 8ce4588fda219..c369ca01171ff 100644 --- a/src/backend/access/rmgrdesc/replorigindesc.c +++ b/src/backend/access/rmgrdesc/replorigindesc.c @@ -3,7 +3,7 @@ * replorigindesc.c * rmgr descriptor routines for replication/logical/origin.c * - * Portions Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2015-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/access/rmgrdesc/rmgrdesc_utils.c b/src/backend/access/rmgrdesc/rmgrdesc_utils.c index 90051f0df9044..2665c45873a64 100644 --- a/src/backend/access/rmgrdesc/rmgrdesc_utils.c +++ b/src/backend/access/rmgrdesc/rmgrdesc_utils.c @@ -3,7 +3,7 @@ * rmgrdesc_utils.c * Support functions for rmgrdesc routines * - * Copyright (c) 2023, PostgreSQL Global Development Group + * Copyright (c) 2023-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -16,6 +16,10 @@ #include "access/rmgrdesc_utils.h" #include "storage/off.h" +/* + * Helper function to print an array, in the format described in the + * README. + */ void array_desc(StringInfo buf, void *array, size_t elem_size, int count, void (*elem_desc) (StringInfo buf, void *elem, void *data), @@ -33,7 +37,7 @@ array_desc(StringInfo buf, void *array, size_t elem_size, int count, if (i < count - 1) appendStringInfoString(buf, ", "); } - appendStringInfoString(buf, "]"); + appendStringInfoChar(buf, ']'); } void diff --git a/src/backend/access/rmgrdesc/seqdesc.c b/src/backend/access/rmgrdesc/seqdesc.c index ba60544085e76..cf0e02ded592e 100644 --- a/src/backend/access/rmgrdesc/seqdesc.c +++ b/src/backend/access/rmgrdesc/seqdesc.c @@ -3,7 +3,7 @@ * seqdesc.c * rmgr descriptor routines for commands/sequence.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/access/rmgrdesc/smgrdesc.c b/src/backend/access/rmgrdesc/smgrdesc.c index bd841b96e8e7c..71410e0a2d358 100644 --- a/src/backend/access/rmgrdesc/smgrdesc.c +++ b/src/backend/access/rmgrdesc/smgrdesc.c @@ -3,7 +3,7 @@ * smgrdesc.c * rmgr descriptor routines for catalog/storage.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/access/rmgrdesc/spgdesc.c b/src/backend/access/rmgrdesc/spgdesc.c index 87f62f0fb4b38..e75971100c9c8 100644 --- a/src/backend/access/rmgrdesc/spgdesc.c +++ b/src/backend/access/rmgrdesc/spgdesc.c @@ -3,7 +3,7 @@ * spgdesc.c * rmgr descriptor routines for access/spgist/spgxlog.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -118,10 +118,11 @@ spg_desc(StringInfo buf, XLogReaderState *record) { spgxlogVacuumRedirect *xlrec = (spgxlogVacuumRedirect *) rec; - appendStringInfo(buf, "ntoplaceholder: %u, firstplaceholder: %u, snapshotConflictHorizon: %u", + appendStringInfo(buf, "ntoplaceholder: %u, firstplaceholder: %u, snapshotConflictHorizon: %u, isCatalogRel: %c", xlrec->nToPlaceholder, xlrec->firstPlaceholder, - xlrec->snapshotConflictHorizon); + xlrec->snapshotConflictHorizon, + xlrec->isCatalogRel ? 'T' : 'F'); } break; } diff --git a/src/backend/access/rmgrdesc/standbydesc.c b/src/backend/access/rmgrdesc/standbydesc.c index f2bce9a37adf4..25f870b187e8e 100644 --- a/src/backend/access/rmgrdesc/standbydesc.c +++ b/src/backend/access/rmgrdesc/standbydesc.c @@ -3,7 +3,7 @@ * standbydesc.c * rmgr descriptor routines for storage/ipc/standby.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/access/rmgrdesc/tblspcdesc.c b/src/backend/access/rmgrdesc/tblspcdesc.c index b8c89f8c543c3..56396ca946fef 100644 --- a/src/backend/access/rmgrdesc/tblspcdesc.c +++ b/src/backend/access/rmgrdesc/tblspcdesc.c @@ -3,7 +3,7 @@ * tblspcdesc.c * rmgr descriptor routines for commands/tablespace.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/access/rmgrdesc/xactdesc.c b/src/backend/access/rmgrdesc/xactdesc.c index 01610c5ddcac2..dccca201e05c0 100644 --- a/src/backend/access/rmgrdesc/xactdesc.c +++ b/src/backend/access/rmgrdesc/xactdesc.c @@ -3,7 +3,7 @@ * xactdesc.c * rmgr descriptor routines for access/transam/xact.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,7 +25,7 @@ * Parse the WAL format of an xact commit and abort records into an easier to * understand format. * - * This routines are in xactdesc.c because they're accessed in backend (when + * These routines are in xactdesc.c because they're accessed in backend (when * replaying WAL) and frontend (pg_waldump) code. This file is the only xact * specific one shared between both. They're complicated enough that * duplication would be bothersome. diff --git a/src/backend/access/rmgrdesc/xlogdesc.c b/src/backend/access/rmgrdesc/xlogdesc.c index f390c177e4d9e..363294d6234a9 100644 --- a/src/backend/access/rmgrdesc/xlogdesc.c +++ b/src/backend/access/rmgrdesc/xlogdesc.c @@ -3,7 +3,7 @@ * xlogdesc.c * rmgr descriptor routines for access/transam/xlog.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -33,6 +33,27 @@ const struct config_enum_entry wal_level_options[] = { {NULL, 0, false} }; +/* + * Find a string representation for wal_level + */ +static const char * +get_wal_level_string(int wal_level) +{ + const struct config_enum_entry *entry; + const char *wal_level_str = "?"; + + for (entry = wal_level_options; entry->name; entry++) + { + if (entry->val == wal_level) + { + wal_level_str = entry->name; + break; + } + } + + return wal_level_str; +} + void xlog_desc(StringInfo buf, XLogReaderState *record) { @@ -45,7 +66,7 @@ xlog_desc(StringInfo buf, XLogReaderState *record) CheckPoint *checkpoint = (CheckPoint *) rec; appendStringInfo(buf, "redo %X/%X; " - "tli %u; prev tli %u; fpw %s; xid %u:%u; oid %u; multi %u; offset %u; " + "tli %u; prev tli %u; fpw %s; wal_level %s; xid %u:%u; oid %u; multi %u; offset %u; " "oldest xid %u in DB %u; oldest multi %u in DB %u; " "oldest/newest commit timestamp xid: %u/%u; " "oldest running xid %u; %s", @@ -53,6 +74,7 @@ xlog_desc(StringInfo buf, XLogReaderState *record) checkpoint->ThisTimeLineID, checkpoint->PrevTimeLineID, checkpoint->fullPageWrites ? "true" : "false", + get_wal_level_string(checkpoint->wal_level), EpochFromFullTransactionId(checkpoint->nextXid), XidFromFullTransactionId(checkpoint->nextXid), checkpoint->nextOid, @@ -95,20 +117,9 @@ xlog_desc(StringInfo buf, XLogReaderState *record) { xl_parameter_change xlrec; const char *wal_level_str; - const struct config_enum_entry *entry; memcpy(&xlrec, rec, sizeof(xl_parameter_change)); - - /* Find a string representation for wal_level */ - wal_level_str = "?"; - for (entry = wal_level_options; entry->name; entry++) - { - if (entry->val == xlrec.wal_level) - { - wal_level_str = entry->name; - break; - } - } + wal_level_str = get_wal_level_string(xlrec.wal_level); appendStringInfo(buf, "max_connections=%d max_worker_processes=%d " "max_wal_senders=%d max_prepared_xacts=%d " @@ -135,9 +146,10 @@ xlog_desc(StringInfo buf, XLogReaderState *record) xl_end_of_recovery xlrec; memcpy(&xlrec, rec, sizeof(xl_end_of_recovery)); - appendStringInfo(buf, "tli %u; prev tli %u; time %s", + appendStringInfo(buf, "tli %u; prev tli %u; time %s; wal_level %s", xlrec.ThisTimeLineID, xlrec.PrevTimeLineID, - timestamptz_to_str(xlrec.end_time)); + timestamptz_to_str(xlrec.end_time), + get_wal_level_string(xlrec.wal_level)); } else if (info == XLOG_OVERWRITE_CONTRECORD) { @@ -148,6 +160,13 @@ xlog_desc(StringInfo buf, XLogReaderState *record) LSN_FORMAT_ARGS(xlrec.overwritten_lsn), timestamptz_to_str(xlrec.overwrite_time)); } + else if (info == XLOG_CHECKPOINT_REDO) + { + int wal_level; + + memcpy(&wal_level, rec, sizeof(int)); + appendStringInfo(buf, "wal_level %s", get_wal_level_string(wal_level)); + } } const char * @@ -196,6 +215,9 @@ xlog_identify(uint8 info) case XLOG_FPI_FOR_HINT: id = "FPI_FOR_HINT"; break; + case XLOG_CHECKPOINT_REDO: + id = "CHECKPOINT_REDO"; + break; } return id; diff --git a/src/backend/access/sequence/Makefile b/src/backend/access/sequence/Makefile new file mode 100644 index 0000000000000..9f9d31f5425a2 --- /dev/null +++ b/src/backend/access/sequence/Makefile @@ -0,0 +1,17 @@ +#------------------------------------------------------------------------- +# +# Makefile +# Makefile for access/sequence +# +# IDENTIFICATION +# src/backend/access/sequence/Makefile +# +#------------------------------------------------------------------------- + +subdir = src/backend/access/sequence +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global + +OBJS = sequence.o + +include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/access/sequence/meson.build b/src/backend/access/sequence/meson.build new file mode 100644 index 0000000000000..1843aed38db23 --- /dev/null +++ b/src/backend/access/sequence/meson.build @@ -0,0 +1,5 @@ +# Copyright (c) 2022-2024, PostgreSQL Global Development Group + +backend_sources += files( + 'sequence.c', +) diff --git a/src/backend/access/sequence/sequence.c b/src/backend/access/sequence/sequence.c new file mode 100644 index 0000000000000..8d6b7bb5dc25b --- /dev/null +++ b/src/backend/access/sequence/sequence.c @@ -0,0 +1,78 @@ +/*------------------------------------------------------------------------- + * + * sequence.c + * Generic routines for sequence-related code. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/access/sequence/sequence.c + * + * + * NOTES + * This file contains sequence_ routines that implement access to sequences + * (in contrast to other relation types like indexes). + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "access/relation.h" +#include "access/sequence.h" +#include "storage/lmgr.h" + +static inline void validate_relation_kind(Relation r); + +/* ---------------- + * sequence_open - open a sequence relation by relation OID + * + * This is essentially relation_open plus check that the relation + * is a sequence. + * ---------------- + */ +Relation +sequence_open(Oid relationId, LOCKMODE lockmode) +{ + Relation r; + + r = relation_open(relationId, lockmode); + + validate_relation_kind(r); + + return r; +} + +/* ---------------- + * sequence_close - close a sequence + * + * If lockmode is not "NoLock", we then release the specified lock. + * + * Note that it is often sensible to hold a lock beyond relation_close; + * in that case, the lock is released automatically at xact end. + * ---------------- + */ +void +sequence_close(Relation relation, LOCKMODE lockmode) +{ + relation_close(relation, lockmode); +} + +/* ---------------- + * validate_relation_kind - check the relation's kind + * + * Make sure relkind is from a sequence. + * ---------------- + */ +static inline void +validate_relation_kind(Relation r) +{ + if (r->rd_rel->relkind != RELKIND_SEQUENCE) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("cannot open relation \"%s\"", + RelationGetRelationName(r)), + errdetail_relkind_not_supported(r->rd_rel->relkind))); +} diff --git a/src/backend/access/spgist/meson.build b/src/backend/access/spgist/meson.build index 065d988870c77..a6f4f3182bbed 100644 --- a/src/backend/access/spgist/meson.build +++ b/src/backend/access/spgist/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'spgdoinsert.c', diff --git a/src/backend/access/spgist/spgdoinsert.c b/src/backend/access/spgist/spgdoinsert.c index 3554edcc9a4fb..a4995c168b44d 100644 --- a/src/backend/access/spgist/spgdoinsert.c +++ b/src/backend/access/spgist/spgdoinsert.c @@ -4,7 +4,7 @@ * implementation of insert algorithm * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -19,6 +19,7 @@ #include "access/spgist_private.h" #include "access/spgxlog.h" #include "access/xloginsert.h" +#include "common/int.h" #include "common/pg_prng.h" #include "miscadmin.h" #include "storage/bufmgr.h" @@ -110,9 +111,7 @@ addNode(SpGistState *state, SpGistInnerTuple tuple, Datum label, int offset) static int cmpOffsetNumbers(const void *a, const void *b) { - if (*(const OffsetNumber *) a == *(const OffsetNumber *) b) - return 0; - return (*(const OffsetNumber *) a > *(const OffsetNumber *) b) ? 1 : -1; + return pg_cmp_u16(*(const OffsetNumber *) a, *(const OffsetNumber *) b); } /* diff --git a/src/backend/access/spgist/spginsert.c b/src/backend/access/spgist/spginsert.c index 72d2e1551cd4f..1bec19c2b88f7 100644 --- a/src/backend/access/spgist/spginsert.c +++ b/src/backend/access/spgist/spginsert.c @@ -5,7 +5,7 @@ * * All the actual insertion logic is in spgdoinsert.c. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -18,14 +18,12 @@ #include "access/genam.h" #include "access/spgist_private.h" -#include "access/spgxlog.h" #include "access/tableam.h" -#include "access/xlog.h" #include "access/xloginsert.h" -#include "catalog/index.h" #include "miscadmin.h" +#include "nodes/execnodes.h" #include "storage/bufmgr.h" -#include "storage/smgr.h" +#include "storage/bulk_write.h" #include "utils/memutils.h" #include "utils/rel.h" @@ -155,49 +153,27 @@ spgbuild(Relation heap, Relation index, IndexInfo *indexInfo) void spgbuildempty(Relation index) { - Page page; + BulkWriteState *bulkstate; + BulkWriteBuffer buf; - /* Construct metapage. */ - page = (Page) palloc_aligned(BLCKSZ, PG_IO_ALIGN_SIZE, 0); - SpGistInitMetapage(page); + bulkstate = smgr_bulk_start_rel(index, INIT_FORKNUM); - /* - * Write the page and log it unconditionally. This is important - * particularly for indexes created on tablespaces and databases whose - * creation happened after the last redo pointer as recovery removes any - * of their existing content when the corresponding create records are - * replayed. - */ - PageSetChecksumInplace(page, SPGIST_METAPAGE_BLKNO); - smgrwrite(RelationGetSmgr(index), INIT_FORKNUM, SPGIST_METAPAGE_BLKNO, - page, true); - log_newpage(&(RelationGetSmgr(index))->smgr_rlocator.locator, INIT_FORKNUM, - SPGIST_METAPAGE_BLKNO, page, true); + /* Construct metapage. */ + buf = smgr_bulk_get_buf(bulkstate); + SpGistInitMetapage((Page) buf); + smgr_bulk_write(bulkstate, SPGIST_METAPAGE_BLKNO, buf, true); /* Likewise for the root page. */ - SpGistInitPage(page, SPGIST_LEAF); - - PageSetChecksumInplace(page, SPGIST_ROOT_BLKNO); - smgrwrite(RelationGetSmgr(index), INIT_FORKNUM, SPGIST_ROOT_BLKNO, - page, true); - log_newpage(&(RelationGetSmgr(index))->smgr_rlocator.locator, INIT_FORKNUM, - SPGIST_ROOT_BLKNO, page, true); + buf = smgr_bulk_get_buf(bulkstate); + SpGistInitPage((Page) buf, SPGIST_LEAF); + smgr_bulk_write(bulkstate, SPGIST_ROOT_BLKNO, buf, true); /* Likewise for the null-tuples root page. */ - SpGistInitPage(page, SPGIST_LEAF | SPGIST_NULLS); - - PageSetChecksumInplace(page, SPGIST_NULL_BLKNO); - smgrwrite(RelationGetSmgr(index), INIT_FORKNUM, SPGIST_NULL_BLKNO, - page, true); - log_newpage(&(RelationGetSmgr(index))->smgr_rlocator.locator, INIT_FORKNUM, - SPGIST_NULL_BLKNO, page, true); + buf = smgr_bulk_get_buf(bulkstate); + SpGistInitPage((Page) buf, SPGIST_LEAF | SPGIST_NULLS); + smgr_bulk_write(bulkstate, SPGIST_NULL_BLKNO, buf, true); - /* - * An immediate sync is required even if we xlog'd the pages, because the - * writes did not go through shared buffers and therefore a concurrent - * checkpoint may have moved the redo pointer past our xlog record. - */ - smgrimmedsync(RelationGetSmgr(index), INIT_FORKNUM); + smgr_bulk_finish(bulkstate); } /* diff --git a/src/backend/access/spgist/spgkdtreeproc.c b/src/backend/access/spgist/spgkdtreeproc.c index c1c686e6398dc..44d054525202a 100644 --- a/src/backend/access/spgist/spgkdtreeproc.c +++ b/src/backend/access/spgist/spgkdtreeproc.c @@ -4,7 +4,7 @@ * implementation of k-d tree over points for SP-GiST * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -19,8 +19,8 @@ #include "access/spgist_private.h" #include "access/stratnum.h" #include "catalog/pg_type.h" -#include "utils/builtins.h" #include "utils/float.h" +#include "utils/fmgrprotos.h" #include "utils/geo_decls.h" diff --git a/src/backend/access/spgist/spgproc.c b/src/backend/access/spgist/spgproc.c index 7879e5fd49ab8..89699e7e7ffc6 100644 --- a/src/backend/access/spgist/spgproc.c +++ b/src/backend/access/spgist/spgproc.c @@ -4,7 +4,7 @@ * Common supporting procedures for SP-GiST opclasses. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -18,8 +18,8 @@ #include #include "access/spgist_private.h" -#include "utils/builtins.h" #include "utils/float.h" +#include "utils/fmgrprotos.h" #include "utils/geo_decls.h" #define point_point_distance(p1,p2) \ diff --git a/src/backend/access/spgist/spgquadtreeproc.c b/src/backend/access/spgist/spgquadtreeproc.c index aae1d450fc599..791db1d42e002 100644 --- a/src/backend/access/spgist/spgquadtreeproc.c +++ b/src/backend/access/spgist/spgquadtreeproc.c @@ -4,7 +4,7 @@ * implementation of quad tree over points for SP-GiST * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -19,8 +19,8 @@ #include "access/spgist_private.h" #include "access/stratnum.h" #include "catalog/pg_type.h" -#include "utils/builtins.h" #include "utils/float.h" +#include "utils/fmgrprotos.h" #include "utils/geo_decls.h" Datum diff --git a/src/backend/access/spgist/spgscan.c b/src/backend/access/spgist/spgscan.c index cbfaf0c00ac1c..03293a7816e6f 100644 --- a/src/backend/access/spgist/spgscan.c +++ b/src/backend/access/spgist/spgscan.c @@ -4,7 +4,7 @@ * routines for scanning SP-GiST indexes * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -756,7 +756,7 @@ enum SpGistSpecialOffsetNumbers { SpGistBreakOffsetNumber = InvalidOffsetNumber, SpGistRedirectOffsetNumber = MaxOffsetNumber + 1, - SpGistErrorOffsetNumber = MaxOffsetNumber + 2 + SpGistErrorOffsetNumber = MaxOffsetNumber + 2, }; static OffsetNumber @@ -815,7 +815,7 @@ spgTestLeafTuple(SpGistScanOpaque so, */ static void spgWalk(Relation index, SpGistScanOpaque so, bool scanWholeIndex, - storeRes_func storeRes, Snapshot snapshot) + storeRes_func storeRes) { Buffer buffer = InvalidBuffer; bool reportedSome = false; @@ -862,7 +862,6 @@ spgWalk(Relation index, SpGistScanOpaque so, bool scanWholeIndex, /* else new pointer points to the same page, no work needed */ page = BufferGetPage(buffer); - TestForOldSnapshot(snapshot, index, page); isnull = SpGistPageStoresNulls(page) ? true : false; @@ -950,7 +949,7 @@ spggetbitmap(IndexScanDesc scan, TIDBitmap *tbm) so->tbm = tbm; so->ntids = 0; - spgWalk(scan->indexRelation, so, true, storeBitmap, scan->xs_snapshot); + spgWalk(scan->indexRelation, so, true, storeBitmap); return so->ntids; } @@ -1071,8 +1070,7 @@ spggettuple(IndexScanDesc scan, ScanDirection dir) } so->iPtr = so->nPtrs = 0; - spgWalk(scan->indexRelation, so, false, storeGettuple, - scan->xs_snapshot); + spgWalk(scan->indexRelation, so, false, storeGettuple); if (so->nPtrs == 0) break; /* must have completed scan */ diff --git a/src/backend/access/spgist/spgtextproc.c b/src/backend/access/spgist/spgtextproc.c index 03a7afdbabcd7..3f08d330b6113 100644 --- a/src/backend/access/spgist/spgtextproc.c +++ b/src/backend/access/spgist/spgtextproc.c @@ -29,7 +29,7 @@ * No new entries ever get pushed into a -2-labeled child, either. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -41,9 +41,10 @@ #include "access/spgist.h" #include "catalog/pg_type.h" +#include "common/int.h" #include "mb/pg_wchar.h" -#include "utils/builtins.h" #include "utils/datum.h" +#include "utils/fmgrprotos.h" #include "utils/pg_locale.h" #include "utils/varlena.h" #include "varatt.h" @@ -325,7 +326,7 @@ cmpNodePtr(const void *a, const void *b) const spgNodePtr *aa = (const spgNodePtr *) a; const spgNodePtr *bb = (const spgNodePtr *) b; - return aa->c - bb->c; + return pg_cmp_s16(aa->c, bb->c); } Datum diff --git a/src/backend/access/spgist/spgutils.c b/src/backend/access/spgist/spgutils.c index 190e4f76a9eec..76b80146ff01b 100644 --- a/src/backend/access/spgist/spgutils.c +++ b/src/backend/access/spgist/spgutils.c @@ -4,7 +4,7 @@ * various support functions for SP-GiST * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -28,11 +28,11 @@ #include "parser/parse_coerce.h" #include "storage/bufmgr.h" #include "storage/indexfsm.h" -#include "storage/lmgr.h" -#include "utils/builtins.h" #include "utils/catcache.h" +#include "utils/fmgrprotos.h" #include "utils/index_selfuncs.h" #include "utils/lsyscache.h" +#include "utils/rel.h" #include "utils/syscache.h" @@ -60,6 +60,7 @@ spghandler(PG_FUNCTION_ARGS) amroutine->amclusterable = false; amroutine->ampredlocks = false; amroutine->amcanparallel = false; + amroutine->amcanbuildparallel = false; amroutine->amcaninclude = true; amroutine->amusemaintenanceworkmem = false; amroutine->amsummarizing = false; @@ -70,6 +71,7 @@ spghandler(PG_FUNCTION_ARGS) amroutine->ambuild = spgbuild; amroutine->ambuildempty = spgbuildempty; amroutine->aminsert = spginsert; + amroutine->aminsertcleanup = NULL; amroutine->ambulkdelete = spgbulkdelete; amroutine->amvacuumcleanup = spgvacuumcleanup; amroutine->amcanreturn = spgcanreturn; @@ -186,8 +188,6 @@ spgGetCache(Relation index) Oid atttype; spgConfigIn in; FmgrInfo *procinfo; - Buffer metabuffer; - SpGistMetaPageData *metadata; cache = MemoryContextAllocZero(index->rd_indexcxt, sizeof(SpGistCache)); @@ -255,19 +255,28 @@ spgGetCache(Relation index) fillTypeDesc(&cache->attPrefixType, cache->config.prefixType); fillTypeDesc(&cache->attLabelType, cache->config.labelType); - /* Last, get the lastUsedPages data from the metapage */ - metabuffer = ReadBuffer(index, SPGIST_METAPAGE_BLKNO); - LockBuffer(metabuffer, BUFFER_LOCK_SHARE); + /* + * Finally, if it's a real index (not a partitioned one), get the + * lastUsedPages data from the metapage + */ + if (index->rd_rel->relkind != RELKIND_PARTITIONED_INDEX) + { + Buffer metabuffer; + SpGistMetaPageData *metadata; - metadata = SpGistPageGetMeta(BufferGetPage(metabuffer)); + metabuffer = ReadBuffer(index, SPGIST_METAPAGE_BLKNO); + LockBuffer(metabuffer, BUFFER_LOCK_SHARE); - if (metadata->magicNumber != SPGIST_MAGIC_NUMBER) - elog(ERROR, "index \"%s\" is not an SP-GiST index", - RelationGetRelationName(index)); + metadata = SpGistPageGetMeta(BufferGetPage(metabuffer)); - cache->lastUsedPages = metadata->lastUsedPages; + if (metadata->magicNumber != SPGIST_MAGIC_NUMBER) + elog(ERROR, "index \"%s\" is not an SP-GiST index", + RelationGetRelationName(index)); - UnlockReleaseBuffer(metabuffer); + cache->lastUsedPages = metadata->lastUsedPages; + + UnlockReleaseBuffer(metabuffer); + } index->rd_amcache = (void *) cache; } @@ -349,8 +358,19 @@ initSpGistState(SpGistState *state, Relation index) /* Make workspace for constructing dead tuples */ state->deadTupleStorage = palloc0(SGDTSIZE); - /* Set XID to use in redirection tuples */ - state->myXid = GetTopTransactionIdIfAny(); + /* + * Set horizon XID to use in redirection tuples. Use our own XID if we + * have one, else use InvalidTransactionId. The latter case can happen in + * VACUUM or REINDEX CONCURRENTLY, and in neither case would it be okay to + * force an XID to be assigned. VACUUM won't create any redirection + * tuples anyway, but REINDEX CONCURRENTLY can. Fortunately, REINDEX + * CONCURRENTLY doesn't mark the index valid until the end, so there could + * never be any concurrent scans "in flight" to a redirection tuple it has + * inserted. And it locks out VACUUM until the end, too. So it's okay + * for VACUUM to immediately expire a redirection tuple that contains an + * invalid xid. + */ + state->redirectXid = GetTopTransactionIdIfAny(); /* Assume we're not in an index build (spgbuild will override) */ state->isBuild = false; @@ -405,7 +425,7 @@ SpGistNewBuffer(Relation index) ReleaseBuffer(buffer); } - buffer = ExtendBufferedRel(EB_REL(index), MAIN_FORKNUM, NULL, + buffer = ExtendBufferedRel(BMR_REL(index), MAIN_FORKNUM, NULL, EB_LOCK_FIRST); return buffer; @@ -788,7 +808,7 @@ memcpyInnerDatum(void *target, SpGistTypeDesc *att, Datum datum) */ Size SpGistGetLeafTupleSize(TupleDesc tupleDescriptor, - Datum *datums, bool *isnulls) + const Datum *datums, const bool *isnulls) { Size size; Size data_size; @@ -841,7 +861,7 @@ SpGistGetLeafTupleSize(TupleDesc tupleDescriptor, */ SpGistLeafTuple spgFormLeafTuple(SpGistState *state, ItemPointer heapPtr, - Datum *datums, bool *isnulls) + const Datum *datums, const bool *isnulls) { SpGistLeafTuple tup; TupleDesc tupleDescriptor = state->leafTupDesc; @@ -1066,8 +1086,7 @@ spgFormDeadTuple(SpGistState *state, int tupstate, if (tupstate == SPGIST_REDIRECT) { ItemPointerSet(&tuple->pointer, blkno, offnum); - Assert(TransactionIdIsValid(state->myXid)); - tuple->xid = state->myXid; + tuple->xid = state->redirectXid; } else { diff --git a/src/backend/access/spgist/spgvacuum.c b/src/backend/access/spgist/spgvacuum.c index 8a5b540c809af..0da069fd4d722 100644 --- a/src/backend/access/spgist/spgvacuum.c +++ b/src/backend/access/spgist/spgvacuum.c @@ -4,7 +4,7 @@ * vacuum for SP-GiST * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -20,7 +20,6 @@ #include "access/spgxlog.h" #include "access/transam.h" #include "access/xloginsert.h" -#include "catalog/storage_xlog.h" #include "commands/vacuum.h" #include "miscadmin.h" #include "storage/bufmgr.h" @@ -189,7 +188,9 @@ vacuumLeafPage(spgBulkDeleteState *bds, Relation index, Buffer buffer, /* * Add target TID to pending list if the redirection could have - * happened since VACUUM started. + * happened since VACUUM started. (If xid is invalid, assume it + * must have happened before VACUUM started, since REINDEX + * CONCURRENTLY locks out VACUUM.) * * Note: we could make a tighter test by seeing if the xid is * "running" according to the active snapshot; but snapmgr.c @@ -524,8 +525,17 @@ vacuumRedirectAndPlaceholder(Relation index, Relation heaprel, Buffer buffer) dt = (SpGistDeadTuple) PageGetItem(page, PageGetItemId(page, i)); + /* + * We can convert a REDIRECT to a PLACEHOLDER if there could no longer + * be any index scans "in flight" to it. Such an index scan would + * have to be in a transaction whose snapshot sees the REDIRECT's XID + * as still running, so comparing the XID against global xmin is a + * conservatively safe test. If the XID is invalid, it must have been + * inserted by REINDEX CONCURRENTLY, so we can zap it immediately. + */ if (dt->tupstate == SPGIST_REDIRECT && - GlobalVisTestIsRemovableXid(vistest, dt->xid)) + (!TransactionIdIsValid(dt->xid) || + GlobalVisTestIsRemovableXid(vistest, dt->xid))) { dt->tupstate = SPGIST_PLACEHOLDER; Assert(opaque->nRedirection > 0); diff --git a/src/backend/access/spgist/spgvalidate.c b/src/backend/access/spgist/spgvalidate.c index 1e763f9e28ab9..850c3b675d63c 100644 --- a/src/backend/access/spgist/spgvalidate.c +++ b/src/backend/access/spgist/spgvalidate.c @@ -3,7 +3,7 @@ * spgvalidate.c * Opclass validator for SP-GiST. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -15,7 +15,7 @@ #include "access/amvalidate.h" #include "access/htup_details.h" -#include "access/spgist_private.h" +#include "access/spgist.h" #include "catalog/pg_amop.h" #include "catalog/pg_amproc.h" #include "catalog/pg_opclass.h" diff --git a/src/backend/access/spgist/spgxlog.c b/src/backend/access/spgist/spgxlog.c index 459ac929ba534..4e31d33e70949 100644 --- a/src/backend/access/spgist/spgxlog.c +++ b/src/backend/access/spgist/spgxlog.c @@ -4,7 +4,7 @@ * WAL replay logic for SP-GiST * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -17,8 +17,6 @@ #include "access/bufmask.h" #include "access/spgist_private.h" #include "access/spgxlog.h" -#include "access/transam.h" -#include "access/xlog.h" #include "access/xlogutils.h" #include "storage/standby.h" #include "utils/memutils.h" @@ -38,7 +36,7 @@ fillFakeState(SpGistState *state, spgxlogState stateSrc) { memset(state, 0, sizeof(*state)); - state->myXid = stateSrc.myXid; + state->redirectXid = stateSrc.redirectXid; state->isBuild = stateSrc.isBuild; state->deadTupleStorage = palloc0(SGDTSIZE); } diff --git a/src/backend/access/table/meson.build b/src/backend/access/table/meson.build index 5455f265b0040..8ed1335a55d68 100644 --- a/src/backend/access/table/meson.build +++ b/src/backend/access/table/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'table.c', diff --git a/src/backend/access/table/table.c b/src/backend/access/table/table.c index fe2fc45fc3a46..e589730ca0842 100644 --- a/src/backend/access/table/table.c +++ b/src/backend/access/table/table.c @@ -3,7 +3,7 @@ * table.c * Generic routines for table related code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,7 +23,7 @@ #include "access/relation.h" #include "access/table.h" -#include "storage/lmgr.h" +#include "utils/rel.h" static inline void validate_relation_kind(Relation r); diff --git a/src/backend/access/table/tableam.c b/src/backend/access/table/tableam.c index 771438c8cecb9..3ec11fb52c075 100644 --- a/src/backend/access/table/tableam.c +++ b/src/backend/access/table/tableam.c @@ -3,7 +3,7 @@ * tableam.c * Table access method routines too big to be inline functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -24,6 +24,7 @@ #include "access/syncscan.h" #include "access/tableam.h" #include "access/xact.h" +#include "optimizer/optimizer.h" #include "optimizer/plancat.h" #include "port/pg_bitutils.h" #include "storage/bufmgr.h" @@ -120,16 +121,6 @@ table_beginscan_catalog(Relation relation, int nkeys, struct ScanKeyData *key) NULL, flags); } -void -table_scan_update_snapshot(TableScanDesc scan, Snapshot snapshot) -{ - Assert(IsMVCCSnapshot(snapshot)); - - RegisterSnapshot(snapshot); - scan->rs_snapshot = snapshot; - scan->rs_flags |= SO_TEMP_SNAPSHOT; -} - /* ---------------------------------------------------------------------------- * Parallel table scan related functions. @@ -737,11 +728,21 @@ table_block_relation_estimate_size(Relation rel, int32 *attr_widths, * and (c) different table AMs might use different padding schemes. */ int32 tuple_width; + int fillfactor; + + /* + * Without reltuples/relpages, we also need to consider fillfactor. + * The other branch considers it implicitly by calculating density + * from actual relpages/reltuples statistics. + */ + fillfactor = RelationGetFillFactor(rel, HEAP_DEFAULT_FILLFACTOR); tuple_width = get_rel_data_width(rel, attr_widths); tuple_width += overhead_bytes_per_tuple; /* note: integer division is intentional here */ - density = usable_bytes_per_page / tuple_width; + density = (usable_bytes_per_page * fillfactor / 100) / tuple_width; + /* There's at least one row on the page, even with low fillfactor. */ + density = clamp_row_est(density); } *tuples = rint(density * (double) curpages); diff --git a/src/backend/access/table/tableamapi.c b/src/backend/access/table/tableamapi.c index d7798b6afb621..e9b598256fbe0 100644 --- a/src/backend/access/table/tableamapi.c +++ b/src/backend/access/table/tableamapi.c @@ -3,7 +3,7 @@ * tableamapi.c * Support routines for API for Postgres table access methods * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/table/tableamapi.c @@ -11,18 +11,11 @@ */ #include "postgres.h" -#include "access/heapam.h" -#include "access/htup_details.h" #include "access/tableam.h" #include "access/xact.h" -#include "catalog/pg_am.h" -#include "catalog/pg_proc.h" #include "commands/defrem.h" #include "miscadmin.h" -#include "utils/fmgroids.h" #include "utils/guc_hooks.h" -#include "utils/memutils.h" -#include "utils/syscache.h" /* @@ -113,14 +106,14 @@ check_default_table_access_method(char **newval, void **extra, GucSource source) { if (**newval == '\0') { - GUC_check_errdetail("%s cannot be empty.", + GUC_check_errdetail("\"%s\" cannot be empty.", "default_table_access_method"); return false; } if (strlen(*newval) >= NAMEDATALEN) { - GUC_check_errdetail("%s is too long (maximum %d characters).", + GUC_check_errdetail("\"%s\" is too long (maximum %d characters).", "default_table_access_method", NAMEDATALEN - 1); return false; } diff --git a/src/backend/access/table/toast_helper.c b/src/backend/access/table/toast_helper.c index b5cfeb21aab02..53224932f0db4 100644 --- a/src/backend/access/table/toast_helper.c +++ b/src/backend/access/table/toast_helper.c @@ -4,7 +4,7 @@ * Helper functions for table AMs implementing compressed or * out-of-line storage of varlena attributes. * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/access/table/toast_helper.c @@ -15,7 +15,6 @@ #include "postgres.h" #include "access/detoast.h" -#include "access/table.h" #include "access/toast_helper.h" #include "access/toast_internals.h" #include "catalog/pg_type_d.h" @@ -316,7 +315,7 @@ toast_tuple_cleanup(ToastTupleContext *ttc) * relation. */ void -toast_delete_external(Relation rel, Datum *values, bool *isnull, +toast_delete_external(Relation rel, const Datum *values, const bool *isnull, bool is_speculative) { TupleDesc tupleDesc = rel->rd_att; diff --git a/src/backend/access/tablesample/bernoulli.c b/src/backend/access/tablesample/bernoulli.c index 46c81305ad997..c8ac308ff8c55 100644 --- a/src/backend/access/tablesample/bernoulli.c +++ b/src/backend/access/tablesample/bernoulli.c @@ -13,7 +13,7 @@ * cutoff value computed from the selection probability by BeginSampleScan. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -30,7 +30,7 @@ #include "catalog/pg_type.h" #include "common/hashfn.h" #include "optimizer/optimizer.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" /* Private state */ diff --git a/src/backend/access/tablesample/meson.build b/src/backend/access/tablesample/meson.build index 2e559d7352155..6f3112fb758b5 100644 --- a/src/backend/access/tablesample/meson.build +++ b/src/backend/access/tablesample/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'bernoulli.c', diff --git a/src/backend/access/tablesample/system.c b/src/backend/access/tablesample/system.c index 076842aa6bb7a..fe483ab859725 100644 --- a/src/backend/access/tablesample/system.c +++ b/src/backend/access/tablesample/system.c @@ -13,7 +13,7 @@ * cutoff value computed from the selection probability by BeginSampleScan. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -26,12 +26,11 @@ #include -#include "access/relscan.h" #include "access/tsmapi.h" #include "catalog/pg_type.h" #include "common/hashfn.h" #include "optimizer/optimizer.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" /* Private state */ diff --git a/src/backend/access/tablesample/tablesample.c b/src/backend/access/tablesample/tablesample.c index 7c3b9d40e103d..e9a495e4cc879 100644 --- a/src/backend/access/tablesample/tablesample.c +++ b/src/backend/access/tablesample/tablesample.c @@ -3,7 +3,7 @@ * tablesample.c * Support functions for TABLESAMPLE feature * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/access/transam/README b/src/backend/access/transam/README index 22c8ae9755134..28d196cf62b33 100644 --- a/src/backend/access/transam/README +++ b/src/backend/access/transam/README @@ -203,12 +203,12 @@ pg_subtrans and PGPROC are done at the time it is assigned. A transaction that has no XID still needs to be identified for various purposes, notably holding locks. For this purpose we assign a "virtual transaction ID" or VXID to each top-level transaction. VXIDs are formed from -two fields, the backendID and a backend-local counter; this arrangement allows -assignment of a new VXID at transaction start without any contention for -shared memory. To ensure that a VXID isn't re-used too soon after backend +two fields, the procNumber and a backend-local counter; this arrangement +allows assignment of a new VXID at transaction start without any contention +for shared memory. To ensure that a VXID isn't re-used too soon after backend exit, we store the last local counter value into shared memory at backend -exit, and initialize it from the previous value for the same backendID slot -at backend start. All these counters go back to zero at shared memory +exit, and initialize it from the previous value for the same PGPROC slot at +backend start. All these counters go back to zero at shared memory re-initialization, but that's OK because VXIDs never appear anywhere on-disk. Internally, a backend needs a way to identify subtransactions whether or not @@ -324,7 +324,7 @@ changes much more often than its xid, having GetSnapshotData look at xmins can lead to a lot of unnecessary cacheline ping-pong. Instead GetSnapshotData updates approximate thresholds (one that guarantees that all deleted rows older than it can be removed, another determining that deleted -rows newer than it can not be removed). GlobalVisTest* uses those threshold +rows newer than it can not be removed). GlobalVisTest* uses those thresholds to make invisibility decision, falling back to ComputeXidHorizons if necessary. diff --git a/src/backend/access/transam/README.parallel b/src/backend/access/transam/README.parallel index e486bffc475dd..9df3da91b0ca1 100644 --- a/src/backend/access/transam/README.parallel +++ b/src/backend/access/transam/README.parallel @@ -137,7 +137,7 @@ Transaction Integration ======================= Regardless of what the TransactionState stack looks like in the parallel -leader, each parallel worker ends up with a stack of depth 1. This stack +leader, each parallel worker begins with a stack of depth 1. This stack entry is marked with the special transaction block state TBLOCK_PARALLEL_INPROGRESS so that it's not confused with an ordinary toplevel transaction. The XID of this TransactionState is set to the XID of @@ -153,18 +153,18 @@ associated with the memory contexts or resource owners of intermediate subtransactions. No meaningful change to the transaction state can be made while in parallel -mode. No XIDs can be assigned, and no subtransactions can start or end, +mode. No XIDs can be assigned, and no command counter increments can happen, because we have no way of communicating these state changes to cooperating backends, or of synchronizing them. It's clearly unworkable for the initiating backend to exit any transaction or subtransaction that was in progress when parallelism was started before all parallel workers have exited; and it's even more clearly crazy for a parallel worker to try to subcommit or subabort the current subtransaction and execute in some other transaction context than was -present in the initiating backend. It might be practical to allow internal -sub-transactions (e.g. to implement a PL/pgSQL EXCEPTION block) to be used in -parallel mode, provided that they are XID-less, because other backends -wouldn't really need to know about those transactions or do anything -differently because of them. Right now, we don't even allow that. +present in the initiating backend. However, we allow internal subtransactions +(e.g. those used to implement a PL/pgSQL EXCEPTION block) to be used in +parallel mode, provided that they remain XID-less, because other backends +don't really need to know about those transactions or do anything differently +because of them. At the end of a parallel operation, which can happen either because it completed successfully or because it was interrupted by an error, parallel diff --git a/src/backend/access/transam/clog.c b/src/backend/access/transam/clog.c index 4a431d5876760..e6f79320e9425 100644 --- a/src/backend/access/transam/clog.c +++ b/src/backend/access/transam/clog.c @@ -3,12 +3,13 @@ * clog.c * PostgreSQL transaction-commit-log manager * - * This module replaces the old "pg_log" access code, which treated pg_log - * essentially like a relation, in that it went through the regular buffer - * manager. The problem with that was that there wasn't any good way to - * recycle storage space for transactions so old that they'll never be - * looked up again. Now we use specialized access code so that the commit - * log can be broken into relatively small, independent segments. + * This module stores two bits per transaction regarding its commit/abort + * status; the status for four transactions fit in a byte. + * + * This would be a pretty simple abstraction on top of slru.c, except that + * for performance reasons we allow multiple transactions that are + * committing concurrently to form a queue, so that a single process can + * update the status for all of them within a single lock acquisition run. * * XLOG interactions: this module generates an XLOG record whenever a new * CLOG page is initialized to zeroes. Other writes of CLOG come from @@ -23,7 +24,7 @@ * for aborts (whether sync or async), since the post-crash assumption would * be that such transactions failed anyway. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/clog.c @@ -43,6 +44,7 @@ #include "pgstat.h" #include "storage/proc.h" #include "storage/sync.h" +#include "utils/guc_hooks.h" /* * Defines for CLOG page sizes. A page is the same BLCKSZ as is used @@ -62,7 +64,26 @@ #define CLOG_XACTS_PER_PAGE (BLCKSZ * CLOG_XACTS_PER_BYTE) #define CLOG_XACT_BITMASK ((1 << CLOG_BITS_PER_XACT) - 1) -#define TransactionIdToPage(xid) ((xid) / (TransactionId) CLOG_XACTS_PER_PAGE) +/* + * Because space used in CLOG by each transaction is so small, we place a + * smaller limit on the number of CLOG buffers than SLRU allows. No other + * SLRU needs this. + */ +#define CLOG_MAX_ALLOWED_BUFFERS \ + Min(SLRU_MAX_ALLOWED_BUFFERS, \ + (((MaxTransactionId / 2) + (CLOG_XACTS_PER_PAGE - 1)) / CLOG_XACTS_PER_PAGE)) + + +/* + * Although we return an int64 the actual value can't currently exceed + * 0xFFFFFFFF/CLOG_XACTS_PER_PAGE. + */ +static inline int64 +TransactionIdToPage(TransactionId xid) +{ + return xid / (int64) CLOG_XACTS_PER_PAGE; +} + #define TransactionIdToPgIndex(xid) ((xid) % (TransactionId) CLOG_XACTS_PER_PAGE) #define TransactionIdToByte(xid) (TransactionIdToPgIndex(xid) / CLOG_XACTS_PER_BYTE) #define TransactionIdToBIndex(xid) ((xid) % (TransactionId) CLOG_XACTS_PER_BYTE) @@ -89,24 +110,24 @@ static SlruCtlData XactCtlData; #define XactCtl (&XactCtlData) -static int ZeroCLOGPage(int pageno, bool writeXlog); -static bool CLOGPagePrecedes(int page1, int page2); -static void WriteZeroPageXlogRec(int pageno); -static void WriteTruncateXlogRec(int pageno, TransactionId oldestXact, +static int ZeroCLOGPage(int64 pageno, bool writeXlog); +static bool CLOGPagePrecedes(int64 page1, int64 page2); +static void WriteZeroPageXlogRec(int64 pageno); +static void WriteTruncateXlogRec(int64 pageno, TransactionId oldestXact, Oid oldestXactDb); static void TransactionIdSetPageStatus(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, - XLogRecPtr lsn, int pageno, + XLogRecPtr lsn, int64 pageno, bool all_xact_same_page); static void TransactionIdSetStatusBit(TransactionId xid, XidStatus status, XLogRecPtr lsn, int slotno); static void set_status_by_pages(int nsubxids, TransactionId *subxids, XidStatus status, XLogRecPtr lsn); static bool TransactionGroupUpdateXidStatus(TransactionId xid, - XidStatus status, XLogRecPtr lsn, int pageno); + XidStatus status, XLogRecPtr lsn, int64 pageno); static void TransactionIdSetPageStatusInternal(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, - XLogRecPtr lsn, int pageno); + XLogRecPtr lsn, int64 pageno); /* @@ -162,7 +183,7 @@ void TransactionIdSetTreeStatus(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, XLogRecPtr lsn) { - int pageno = TransactionIdToPage(xid); /* get page of parent */ + int64 pageno = TransactionIdToPage(xid); /* get page of parent */ int i; Assert(status == TRANSACTION_STATUS_COMMITTED || @@ -236,7 +257,7 @@ static void set_status_by_pages(int nsubxids, TransactionId *subxids, XidStatus status, XLogRecPtr lsn) { - int pageno = TransactionIdToPage(subxids[0]); + int64 pageno = TransactionIdToPage(subxids[0]); int offset = 0; int i = 0; @@ -245,7 +266,7 @@ set_status_by_pages(int nsubxids, TransactionId *subxids, while (i < nsubxids) { int num_on_page = 0; - int nextpageno; + int64 nextpageno; do { @@ -271,18 +292,23 @@ set_status_by_pages(int nsubxids, TransactionId *subxids, static void TransactionIdSetPageStatus(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, - XLogRecPtr lsn, int pageno, + XLogRecPtr lsn, int64 pageno, bool all_xact_same_page) { + LWLock *lock; + /* Can't use group update when PGPROC overflows. */ StaticAssertDecl(THRESHOLD_SUBTRANS_CLOG_OPT <= PGPROC_MAX_CACHED_SUBXIDS, "group clog threshold less than PGPROC cached subxids"); + /* Get the SLRU bank lock for the page we are going to access. */ + lock = SimpleLruGetBankLock(XactCtl, pageno); + /* - * When there is contention on XactSLRULock, we try to group multiple - * updates; a single leader process will perform transaction status - * updates for multiple backends so that the number of times XactSLRULock - * needs to be acquired is reduced. + * When there is contention on the SLRU bank lock we need, we try to group + * multiple updates; a single leader process will perform transaction + * status updates for multiple backends so that the number of times the + * bank lock needs to be acquired is reduced. * * For this optimization to be safe, the XID and subxids in MyProc must be * the same as the ones for which we're setting the status. Check that @@ -300,17 +326,17 @@ TransactionIdSetPageStatus(TransactionId xid, int nsubxids, nsubxids * sizeof(TransactionId)) == 0)) { /* - * If we can immediately acquire XactSLRULock, we update the status of - * our own XID and release the lock. If not, try use group XID - * update. If that doesn't work out, fall back to waiting for the - * lock to perform an update for this transaction only. + * If we can immediately acquire the lock, we update the status of our + * own XID and release the lock. If not, try use group XID update. If + * that doesn't work out, fall back to waiting for the lock to perform + * an update for this transaction only. */ - if (LWLockConditionalAcquire(XactSLRULock, LW_EXCLUSIVE)) + if (LWLockConditionalAcquire(lock, LW_EXCLUSIVE)) { /* Got the lock without waiting! Do the update. */ TransactionIdSetPageStatusInternal(xid, nsubxids, subxids, status, lsn, pageno); - LWLockRelease(XactSLRULock); + LWLockRelease(lock); return; } else if (TransactionGroupUpdateXidStatus(xid, status, lsn, pageno)) @@ -323,10 +349,10 @@ TransactionIdSetPageStatus(TransactionId xid, int nsubxids, } /* Group update not applicable, or couldn't accept this page number. */ - LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); + LWLockAcquire(lock, LW_EXCLUSIVE); TransactionIdSetPageStatusInternal(xid, nsubxids, subxids, status, lsn, pageno); - LWLockRelease(XactSLRULock); + LWLockRelease(lock); } /* @@ -337,7 +363,7 @@ TransactionIdSetPageStatus(TransactionId xid, int nsubxids, static void TransactionIdSetPageStatusInternal(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, - XLogRecPtr lsn, int pageno) + XLogRecPtr lsn, int64 pageno) { int slotno; int i; @@ -345,7 +371,8 @@ TransactionIdSetPageStatusInternal(TransactionId xid, int nsubxids, Assert(status == TRANSACTION_STATUS_COMMITTED || status == TRANSACTION_STATUS_ABORTED || (status == TRANSACTION_STATUS_SUB_COMMITTED && !TransactionIdIsValid(xid))); - Assert(LWLockHeldByMeInMode(XactSLRULock, LW_EXCLUSIVE)); + Assert(LWLockHeldByMeInMode(SimpleLruGetBankLock(XactCtl, pageno), + LW_EXCLUSIVE)); /* * If we're doing an async commit (ie, lsn is valid), then we must wait @@ -396,14 +423,15 @@ TransactionIdSetPageStatusInternal(TransactionId xid, int nsubxids, } /* - * When we cannot immediately acquire XactSLRULock in exclusive mode at + * Subroutine for TransactionIdSetPageStatus, q.v. + * + * When we cannot immediately acquire the SLRU bank lock in exclusive mode at * commit time, add ourselves to a list of processes that need their XIDs * status update. The first process to add itself to the list will acquire - * XactSLRULock in exclusive mode and set transaction status as required - * on behalf of all group members. This avoids a great deal of contention - * around XactSLRULock when many processes are trying to commit at once, - * since the lock need not be repeatedly handed off from one committing - * process to the next. + * the lock in exclusive mode and set transaction status as required on behalf + * of all group members. This avoids a great deal of contention when many + * processes are trying to commit at once, since the lock need not be + * repeatedly handed off from one committing process to the next. * * Returns true when transaction status has been updated in clog; returns * false if we decided against applying the optimization because the page @@ -411,19 +439,21 @@ TransactionIdSetPageStatusInternal(TransactionId xid, int nsubxids, */ static bool TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, - XLogRecPtr lsn, int pageno) + XLogRecPtr lsn, int64 pageno) { volatile PROC_HDR *procglobal = ProcGlobal; PGPROC *proc = MyProc; uint32 nextidx; uint32 wakeidx; + int64 prevpageno; + LWLock *prevlock = NULL; /* We should definitely have an XID whose status needs to be updated. */ Assert(TransactionIdIsValid(xid)); /* - * Add ourselves to the list of processes needing a group XID status - * update. + * Prepare to add ourselves to the list of processes needing a group XID + * status update. */ proc->clogGroupMember = true; proc->clogGroupMemberXid = xid; @@ -431,6 +461,29 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, proc->clogGroupMemberPage = pageno; proc->clogGroupMemberLsn = lsn; + /* + * We put ourselves in the queue by writing MyProcNumber to + * ProcGlobal->clogGroupFirst. However, if there's already a process + * listed there, we compare our pageno with that of that process; if it + * differs, we cannot participate in the group, so we return for caller to + * update pg_xact in the normal way. + * + * If we're not the first process in the list, we must follow the leader. + * We do this by storing the data we want updated in our PGPROC entry + * where the leader can find it, then going to sleep. + * + * If no process is already in the list, we're the leader; our first step + * is to lock the SLRU bank to which our page belongs, then we close out + * the group by resetting the list pointer from ProcGlobal->clogGroupFirst + * (this lets other processes set up other groups later); finally we do + * the SLRU updates, release the SLRU bank lock, and wake up the sleeping + * processes. + * + * If another group starts to update a page in a different SLRU bank, they + * can proceed concurrently, since the bank lock they're going to use is + * different from ours. If another group starts to update a page in the + * same bank as ours, they wait until we release the lock. + */ nextidx = pg_atomic_read_u32(&procglobal->clogGroupFirst); while (true) @@ -442,20 +495,21 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, * There is a race condition here, which is that after doing the below * check and before adding this proc's clog update to a group, the * group leader might have already finished the group update for this - * page and becomes group leader of another group. This will lead to a - * situation where a single group can have different clog page - * updates. This isn't likely and will still work, just maybe a bit - * less efficiently. + * page and becomes group leader of another group, updating a + * different page. This will lead to a situation where a single group + * can have different clog page updates. This isn't likely and will + * still work, just less efficiently -- we handle this case by + * switching to a different bank lock in the loop below. */ - if (nextidx != INVALID_PGPROCNO && - ProcGlobal->allProcs[nextidx].clogGroupMemberPage != proc->clogGroupMemberPage) + if (nextidx != INVALID_PROC_NUMBER && + GetPGProcByNumber(nextidx)->clogGroupMemberPage != proc->clogGroupMemberPage) { /* * Ensure that this proc is not a member of any clog group that * needs an XID status update. */ proc->clogGroupMember = false; - pg_atomic_write_u32(&proc->clogGroupNext, INVALID_PGPROCNO); + pg_atomic_write_u32(&proc->clogGroupNext, INVALID_PROC_NUMBER); return false; } @@ -463,7 +517,7 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, if (pg_atomic_compare_exchange_u32(&procglobal->clogGroupFirst, &nextidx, - (uint32) proc->pgprocno)) + (uint32) MyProcNumber)) break; } @@ -471,9 +525,9 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, * If the list was not empty, the leader will update the status of our * XID. It is impossible to have followers without a leader because the * first process that has added itself to the list will always have - * nextidx as INVALID_PGPROCNO. + * nextidx as INVALID_PROC_NUMBER. */ - if (nextidx != INVALID_PGPROCNO) + if (nextidx != INVALID_PROC_NUMBER) { int extraWaits = 0; @@ -489,7 +543,7 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, } pgstat_report_wait_end(); - Assert(pg_atomic_read_u32(&proc->clogGroupNext) == INVALID_PGPROCNO); + Assert(pg_atomic_read_u32(&proc->clogGroupNext) == INVALID_PROC_NUMBER); /* Fix semaphore count for any absorbed wakeups */ while (extraWaits-- > 0) @@ -497,24 +551,57 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, return true; } - /* We are the leader. Acquire the lock on behalf of everyone. */ - LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); + /* + * By here, we know we're the leader process. Acquire the SLRU bank lock + * that corresponds to the page we originally wanted to modify. + */ + prevpageno = proc->clogGroupMemberPage; + prevlock = SimpleLruGetBankLock(XactCtl, prevpageno); + LWLockAcquire(prevlock, LW_EXCLUSIVE); /* * Now that we've got the lock, clear the list of processes waiting for * group XID status update, saving a pointer to the head of the list. - * Trying to pop elements one at a time could lead to an ABA problem. + * (Trying to pop elements one at a time could lead to an ABA problem.) + * + * At this point, any processes trying to do this would create a separate + * group. */ nextidx = pg_atomic_exchange_u32(&procglobal->clogGroupFirst, - INVALID_PGPROCNO); + INVALID_PROC_NUMBER); /* Remember head of list so we can perform wakeups after dropping lock. */ wakeidx = nextidx; /* Walk the list and update the status of all XIDs. */ - while (nextidx != INVALID_PGPROCNO) + while (nextidx != INVALID_PROC_NUMBER) { PGPROC *nextproc = &ProcGlobal->allProcs[nextidx]; + int64 thispageno = nextproc->clogGroupMemberPage; + + /* + * If the page to update belongs to a different bank than the previous + * one, exchange bank lock to the new one. This should be quite rare, + * as described above. + * + * (We could try to optimize this by waking up the processes for which + * we have already updated the status while we exchange the lock, but + * the code doesn't do that at present. I think it'd require + * additional bookkeeping, making the common path slower in order to + * improve an infrequent case.) + */ + if (thispageno != prevpageno) + { + LWLock *lock = SimpleLruGetBankLock(XactCtl, thispageno); + + if (prevlock != lock) + { + LWLockRelease(prevlock); + LWLockAcquire(lock, LW_EXCLUSIVE); + } + prevlock = lock; + prevpageno = thispageno; + } /* * Transactions with more than THRESHOLD_SUBTRANS_CLOG_OPT sub-XIDs @@ -534,19 +621,24 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, } /* We're done with the lock now. */ - LWLockRelease(XactSLRULock); + if (prevlock != NULL) + LWLockRelease(prevlock); /* * Now that we've released the lock, go back and wake everybody up. We * don't do this under the lock so as to keep lock hold times to a * minimum. + * + * (Perhaps we could do this in two passes, the first setting + * clogGroupNext to invalid while saving the semaphores to an array, then + * a single write barrier, then another pass unlocking the semaphores.) */ - while (wakeidx != INVALID_PGPROCNO) + while (wakeidx != INVALID_PROC_NUMBER) { PGPROC *wakeproc = &ProcGlobal->allProcs[wakeidx]; wakeidx = pg_atomic_read_u32(&wakeproc->clogGroupNext); - pg_atomic_write_u32(&wakeproc->clogGroupNext, INVALID_PGPROCNO); + pg_atomic_write_u32(&wakeproc->clogGroupNext, INVALID_PROC_NUMBER); /* ensure all previous writes are visible before follower continues. */ pg_write_barrier(); @@ -563,7 +655,7 @@ TransactionGroupUpdateXidStatus(TransactionId xid, XidStatus status, /* * Sets the commit status of a single transaction. * - * Must be called with XactSLRULock held + * Caller must hold the corresponding SLRU bank lock, will be held at exit. */ static void TransactionIdSetStatusBit(TransactionId xid, XidStatus status, XLogRecPtr lsn, int slotno) @@ -574,6 +666,11 @@ TransactionIdSetStatusBit(TransactionId xid, XidStatus status, XLogRecPtr lsn, i char byteval; char curval; + Assert(XactCtl->shared->page_number[slotno] == TransactionIdToPage(xid)); + Assert(LWLockHeldByMeInMode(SimpleLruGetBankLock(XactCtl, + XactCtl->shared->page_number[slotno]), + LW_EXCLUSIVE)); + byteptr = XactCtl->shared->page_buffer[slotno] + byteno; curval = (*byteptr >> bshift) & CLOG_XACT_BITMASK; @@ -637,7 +734,7 @@ TransactionIdSetStatusBit(TransactionId xid, XidStatus status, XLogRecPtr lsn, i XidStatus TransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn) { - int pageno = TransactionIdToPage(xid); + int64 pageno = TransactionIdToPage(xid); int byteno = TransactionIdToByte(xid); int bshift = TransactionIdToBIndex(xid) * CLOG_BITS_PER_XACT; int slotno; @@ -655,7 +752,7 @@ TransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn) lsnindex = GetLSNIndex(slotno, xid); *lsn = XactCtl->shared->group_lsn[lsnindex]; - LWLockRelease(XactSLRULock); + LWLockRelease(SimpleLruGetBankLock(XactCtl, pageno)); return status; } @@ -663,23 +760,18 @@ TransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn) /* * Number of shared CLOG buffers. * - * On larger multi-processor systems, it is possible to have many CLOG page - * requests in flight at one time which could lead to disk access for CLOG - * page if the required page is not found in memory. Testing revealed that we - * can get the best performance by having 128 CLOG buffers, more than that it - * doesn't improve performance. - * - * Unconditionally keeping the number of CLOG buffers to 128 did not seem like - * a good idea, because it would increase the minimum amount of shared memory - * required to start, which could be a problem for people running very small - * configurations. The following formula seems to represent a reasonable - * compromise: people with very low values for shared_buffers will get fewer - * CLOG buffers as well, and everyone else will get 128. + * If asked to autotune, use 2MB for every 1GB of shared buffers, up to 8MB. + * Otherwise just cap the configured amount to be between 16 and the maximum + * allowed. */ -Size +static int CLOGShmemBuffers(void) { - return Min(128, Max(4, NBuffers / 512)); + /* auto-tune based on shared buffers */ + if (transaction_buffers == 0) + return SimpleLruAutotuneBuffers(512, 1024); + + return Min(Max(16, transaction_buffers), CLOG_MAX_ALLOWED_BUFFERS); } /* @@ -694,13 +786,43 @@ CLOGShmemSize(void) void CLOGShmemInit(void) { + /* If auto-tuning is requested, now is the time to do it */ + if (transaction_buffers == 0) + { + char buf[32]; + + snprintf(buf, sizeof(buf), "%d", CLOGShmemBuffers()); + SetConfigOption("transaction_buffers", buf, PGC_POSTMASTER, + PGC_S_DYNAMIC_DEFAULT); + + /* + * We prefer to report this value's source as PGC_S_DYNAMIC_DEFAULT. + * However, if the DBA explicitly set transaction_buffers = 0 in the + * config file, then PGC_S_DYNAMIC_DEFAULT will fail to override that + * and we must force the matter with PGC_S_OVERRIDE. + */ + if (transaction_buffers == 0) /* failed to apply it? */ + SetConfigOption("transaction_buffers", buf, PGC_POSTMASTER, + PGC_S_OVERRIDE); + } + Assert(transaction_buffers != 0); + XactCtl->PagePrecedes = CLOGPagePrecedes; - SimpleLruInit(XactCtl, "Xact", CLOGShmemBuffers(), CLOG_LSNS_PER_PAGE, - XactSLRULock, "pg_xact", LWTRANCHE_XACT_BUFFER, - SYNC_HANDLER_CLOG); + SimpleLruInit(XactCtl, "transaction", CLOGShmemBuffers(), CLOG_LSNS_PER_PAGE, + "pg_xact", LWTRANCHE_XACT_BUFFER, + LWTRANCHE_XACT_SLRU, SYNC_HANDLER_CLOG, false); SlruPagePrecedesUnitTests(XactCtl, CLOG_XACTS_PER_PAGE); } +/* + * GUC check_hook for transaction_buffers + */ +bool +check_transaction_buffers(int *newval, void **extra, GucSource source) +{ + return check_slru_buffers("transaction_buffers", newval); +} + /* * This func must be called ONCE on system install. It creates * the initial CLOG segment. (The CLOG directory is assumed to @@ -711,8 +833,9 @@ void BootStrapCLOG(void) { int slotno; + LWLock *lock = SimpleLruGetBankLock(XactCtl, 0); - LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); + LWLockAcquire(lock, LW_EXCLUSIVE); /* Create and zero the first page of the commit log */ slotno = ZeroCLOGPage(0, false); @@ -721,7 +844,7 @@ BootStrapCLOG(void) SimpleLruWritePage(XactCtl, slotno); Assert(!XactCtl->shared->page_dirty[slotno]); - LWLockRelease(XactSLRULock); + LWLockRelease(lock); } /* @@ -734,7 +857,7 @@ BootStrapCLOG(void) * Control lock must be held at entry, and will be held at exit. */ static int -ZeroCLOGPage(int pageno, bool writeXlog) +ZeroCLOGPage(int64 pageno, bool writeXlog) { int slotno; @@ -748,22 +871,18 @@ ZeroCLOGPage(int pageno, bool writeXlog) /* * This must be called ONCE during postmaster or standalone-backend startup, - * after StartupXLOG has initialized ShmemVariableCache->nextXid. + * after StartupXLOG has initialized TransamVariables->nextXid. */ void StartupCLOG(void) { - TransactionId xid = XidFromFullTransactionId(ShmemVariableCache->nextXid); - int pageno = TransactionIdToPage(xid); - - LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); + TransactionId xid = XidFromFullTransactionId(TransamVariables->nextXid); + int64 pageno = TransactionIdToPage(xid); /* * Initialize our idea of the latest page number. */ - XactCtl->shared->latest_page_number = pageno; - - LWLockRelease(XactSLRULock); + pg_atomic_write_u64(&XactCtl->shared->latest_page_number, pageno); } /* @@ -772,10 +891,11 @@ StartupCLOG(void) void TrimCLOG(void) { - TransactionId xid = XidFromFullTransactionId(ShmemVariableCache->nextXid); - int pageno = TransactionIdToPage(xid); + TransactionId xid = XidFromFullTransactionId(TransamVariables->nextXid); + int64 pageno = TransactionIdToPage(xid); + LWLock *lock = SimpleLruGetBankLock(XactCtl, pageno); - LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); + LWLockAcquire(lock, LW_EXCLUSIVE); /* * Zero out the remainder of the current clog page. Under normal @@ -807,7 +927,7 @@ TrimCLOG(void) XactCtl->shared->page_dirty[slotno] = true; } - LWLockRelease(XactSLRULock); + LWLockRelease(lock); } /* @@ -838,7 +958,8 @@ CheckPointCLOG(void) void ExtendCLOG(TransactionId newestXact) { - int pageno; + int64 pageno; + LWLock *lock; /* * No work except at first XID of a page. But beware: just after @@ -849,13 +970,14 @@ ExtendCLOG(TransactionId newestXact) return; pageno = TransactionIdToPage(newestXact); + lock = SimpleLruGetBankLock(XactCtl, pageno); - LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); + LWLockAcquire(lock, LW_EXCLUSIVE); /* Zero the page and make an XLOG entry about it */ ZeroCLOGPage(pageno, true); - LWLockRelease(XactSLRULock); + LWLockRelease(lock); } @@ -877,7 +999,7 @@ ExtendCLOG(TransactionId newestXact) void TruncateCLOG(TransactionId oldestXact, Oid oldestxid_datoid) { - int cutoffPage; + int64 cutoffPage; /* * The cutoff point is the start of the segment containing oldestXact. We @@ -930,7 +1052,7 @@ TruncateCLOG(TransactionId oldestXact, Oid oldestxid_datoid) * don't optimize that edge case. */ static bool -CLOGPagePrecedes(int page1, int page2) +CLOGPagePrecedes(int64 page1, int64 page2) { TransactionId xid1; TransactionId xid2; @@ -949,10 +1071,10 @@ CLOGPagePrecedes(int page1, int page2) * Write a ZEROPAGE xlog record */ static void -WriteZeroPageXlogRec(int pageno) +WriteZeroPageXlogRec(int64 pageno) { XLogBeginInsert(); - XLogRegisterData((char *) (&pageno), sizeof(int)); + XLogRegisterData((char *) (&pageno), sizeof(pageno)); (void) XLogInsert(RM_CLOG_ID, CLOG_ZEROPAGE); } @@ -963,7 +1085,7 @@ WriteZeroPageXlogRec(int pageno) * in TruncateCLOG(). */ static void -WriteTruncateXlogRec(int pageno, TransactionId oldestXact, Oid oldestXactDb) +WriteTruncateXlogRec(int64 pageno, TransactionId oldestXact, Oid oldestXactDb) { XLogRecPtr recptr; xl_clog_truncate xlrec; @@ -991,18 +1113,20 @@ clog_redo(XLogReaderState *record) if (info == CLOG_ZEROPAGE) { - int pageno; + int64 pageno; int slotno; + LWLock *lock; - memcpy(&pageno, XLogRecGetData(record), sizeof(int)); + memcpy(&pageno, XLogRecGetData(record), sizeof(pageno)); - LWLockAcquire(XactSLRULock, LW_EXCLUSIVE); + lock = SimpleLruGetBankLock(XactCtl, pageno); + LWLockAcquire(lock, LW_EXCLUSIVE); slotno = ZeroCLOGPage(pageno, false); SimpleLruWritePage(XactCtl, slotno); Assert(!XactCtl->shared->page_dirty[slotno]); - LWLockRelease(XactSLRULock); + LWLockRelease(lock); } else if (info == CLOG_TRUNCATE) { diff --git a/src/backend/access/transam/commit_ts.c b/src/backend/access/transam/commit_ts.c index b897fabc702b6..77e1899d7ad21 100644 --- a/src/backend/access/transam/commit_ts.c +++ b/src/backend/access/transam/commit_ts.c @@ -12,7 +12,7 @@ * XLOG records for these events and will re-perform the status update on * redo; so we need make no additional XLOG entry here. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/commit_ts.c @@ -27,13 +27,11 @@ #include "access/transam.h" #include "access/xloginsert.h" #include "access/xlogutils.h" -#include "catalog/pg_type.h" #include "funcapi.h" #include "miscadmin.h" -#include "pg_trace.h" #include "storage/shmem.h" -#include "utils/builtins.h" -#include "utils/snapmgr.h" +#include "utils/fmgrprotos.h" +#include "utils/guc_hooks.h" #include "utils/timestamp.h" /* @@ -65,8 +63,17 @@ typedef struct CommitTimestampEntry #define COMMIT_TS_XACTS_PER_PAGE \ (BLCKSZ / SizeOfCommitTimestampEntry) -#define TransactionIdToCTsPage(xid) \ - ((xid) / (TransactionId) COMMIT_TS_XACTS_PER_PAGE) + +/* + * Although we return an int64 the actual value can't currently exceed + * 0xFFFFFFFF/COMMIT_TS_XACTS_PER_PAGE. + */ +static inline int64 +TransactionIdToCTsPage(TransactionId xid) +{ + return xid / (int64) COMMIT_TS_XACTS_PER_PAGE; +} + #define TransactionIdToCTsEntry(xid) \ ((xid) % (TransactionId) COMMIT_TS_XACTS_PER_PAGE) @@ -103,16 +110,16 @@ bool track_commit_timestamp; static void SetXidCommitTsInPage(TransactionId xid, int nsubxids, TransactionId *subxids, TimestampTz ts, - RepOriginId nodeid, int pageno); + RepOriginId nodeid, int64 pageno); static void TransactionIdSetCommitTs(TransactionId xid, TimestampTz ts, RepOriginId nodeid, int slotno); static void error_commit_ts_disabled(void); -static int ZeroCommitTsPage(int pageno, bool writeXlog); -static bool CommitTsPagePrecedes(int page1, int page2); +static int ZeroCommitTsPage(int64 pageno, bool writeXlog); +static bool CommitTsPagePrecedes(int64 page1, int64 page2); static void ActivateCommitTs(void); static void DeactivateCommitTs(void); -static void WriteZeroPageXlogRec(int pageno); -static void WriteTruncateXlogRec(int pageno, TransactionId oldestXid); +static void WriteZeroPageXlogRec(int64 pageno); +static void WriteTruncateXlogRec(int64 pageno, TransactionId oldestXid); /* * TransactionTreeSetCommitTsData @@ -170,7 +177,7 @@ TransactionTreeSetCommitTsData(TransactionId xid, int nsubxids, i = 0; for (;;) { - int pageno = TransactionIdToCTsPage(headxid); + int64 pageno = TransactionIdToCTsPage(headxid); int j; for (j = i; j < nsubxids; j++) @@ -202,8 +209,8 @@ TransactionTreeSetCommitTsData(TransactionId xid, int nsubxids, commitTsShared->dataLastCommit.nodeid = nodeid; /* and move forwards our endpoint, if needed */ - if (TransactionIdPrecedes(ShmemVariableCache->newestCommitTsXid, newestXact)) - ShmemVariableCache->newestCommitTsXid = newestXact; + if (TransactionIdPrecedes(TransamVariables->newestCommitTsXid, newestXact)) + TransamVariables->newestCommitTsXid = newestXact; LWLockRelease(CommitTsLock); } @@ -214,12 +221,13 @@ TransactionTreeSetCommitTsData(TransactionId xid, int nsubxids, static void SetXidCommitTsInPage(TransactionId xid, int nsubxids, TransactionId *subxids, TimestampTz ts, - RepOriginId nodeid, int pageno) + RepOriginId nodeid, int64 pageno) { + LWLock *lock = SimpleLruGetBankLock(CommitTsCtl, pageno); int slotno; int i; - LWLockAcquire(CommitTsSLRULock, LW_EXCLUSIVE); + LWLockAcquire(lock, LW_EXCLUSIVE); slotno = SimpleLruReadPage(CommitTsCtl, pageno, true, xid); @@ -229,13 +237,13 @@ SetXidCommitTsInPage(TransactionId xid, int nsubxids, CommitTsCtl->shared->page_dirty[slotno] = true; - LWLockRelease(CommitTsSLRULock); + LWLockRelease(lock); } /* * Sets the commit timestamp of a single transaction. * - * Must be called with CommitTsSLRULock held + * Caller must hold the correct SLRU bank lock, will be held at exit */ static void TransactionIdSetCommitTs(TransactionId xid, TimestampTz ts, @@ -266,7 +274,7 @@ bool TransactionIdGetCommitTsData(TransactionId xid, TimestampTz *ts, RepOriginId *nodeid) { - int pageno = TransactionIdToCTsPage(xid); + int64 pageno = TransactionIdToCTsPage(xid); int entryno = TransactionIdToCTsEntry(xid); int slotno; CommitTimestampEntry entry; @@ -306,8 +314,8 @@ TransactionIdGetCommitTsData(TransactionId xid, TimestampTz *ts, return *ts != 0; } - oldestCommitTsXid = ShmemVariableCache->oldestCommitTsXid; - newestCommitTsXid = ShmemVariableCache->newestCommitTsXid; + oldestCommitTsXid = TransamVariables->oldestCommitTsXid; + newestCommitTsXid = TransamVariables->newestCommitTsXid; /* neither is invalid, or both are */ Assert(TransactionIdIsValid(oldestCommitTsXid) == TransactionIdIsValid(newestCommitTsXid)); LWLockRelease(CommitTsLock); @@ -336,7 +344,7 @@ TransactionIdGetCommitTsData(TransactionId xid, TimestampTz *ts, if (nodeid) *nodeid = entry.nodeid; - LWLockRelease(CommitTsSLRULock); + LWLockRelease(SimpleLruGetBankLock(CommitTsCtl, pageno)); return *ts != 0; } @@ -490,14 +498,18 @@ pg_xact_commit_timestamp_origin(PG_FUNCTION_ARGS) /* * Number of shared CommitTS buffers. * - * We use a very similar logic as for the number of CLOG buffers (except we - * scale up twice as fast with shared buffers, and the maximum is twice as - * high); see comments in CLOGShmemBuffers. + * If asked to autotune, use 2MB for every 1GB of shared buffers, up to 8MB. + * Otherwise just cap the configured amount to be between 16 and the maximum + * allowed. */ -Size +static int CommitTsShmemBuffers(void) { - return Min(256, Max(4, NBuffers / 256)); + /* auto-tune based on shared buffers */ + if (commit_timestamp_buffers == 0) + return SimpleLruAutotuneBuffers(512, 1024); + + return Min(Max(16, commit_timestamp_buffers), SLRU_MAX_ALLOWED_BUFFERS); } /* @@ -519,11 +531,33 @@ CommitTsShmemInit(void) { bool found; + /* If auto-tuning is requested, now is the time to do it */ + if (commit_timestamp_buffers == 0) + { + char buf[32]; + + snprintf(buf, sizeof(buf), "%d", CommitTsShmemBuffers()); + SetConfigOption("commit_timestamp_buffers", buf, PGC_POSTMASTER, + PGC_S_DYNAMIC_DEFAULT); + + /* + * We prefer to report this value's source as PGC_S_DYNAMIC_DEFAULT. + * However, if the DBA explicitly set commit_timestamp_buffers = 0 in + * the config file, then PGC_S_DYNAMIC_DEFAULT will fail to override + * that and we must force the matter with PGC_S_OVERRIDE. + */ + if (commit_timestamp_buffers == 0) /* failed to apply it? */ + SetConfigOption("commit_timestamp_buffers", buf, PGC_POSTMASTER, + PGC_S_OVERRIDE); + } + Assert(commit_timestamp_buffers != 0); + CommitTsCtl->PagePrecedes = CommitTsPagePrecedes; - SimpleLruInit(CommitTsCtl, "CommitTs", CommitTsShmemBuffers(), 0, - CommitTsSLRULock, "pg_commit_ts", - LWTRANCHE_COMMITTS_BUFFER, - SYNC_HANDLER_COMMIT_TS); + SimpleLruInit(CommitTsCtl, "commit_timestamp", CommitTsShmemBuffers(), 0, + "pg_commit_ts", LWTRANCHE_COMMITTS_BUFFER, + LWTRANCHE_COMMITTS_SLRU, + SYNC_HANDLER_COMMIT_TS, + false); SlruPagePrecedesUnitTests(CommitTsCtl, COMMIT_TS_XACTS_PER_PAGE); commitTsShared = ShmemInitStruct("CommitTs shared", @@ -543,6 +577,15 @@ CommitTsShmemInit(void) Assert(found); } +/* + * GUC check_hook for commit_timestamp_buffers + */ +bool +check_commit_ts_buffers(int *newval, void **extra, GucSource source) +{ + return check_slru_buffers("commit_timestamp_buffers", newval); +} + /* * This function must be called ONCE on system install. * @@ -569,7 +612,7 @@ BootStrapCommitTs(void) * Control lock must be held at entry, and will be held at exit. */ static int -ZeroCommitTsPage(int pageno, bool writeXlog) +ZeroCommitTsPage(int64 pageno, bool writeXlog) { int slotno; @@ -583,7 +626,7 @@ ZeroCommitTsPage(int pageno, bool writeXlog) /* * This must be called ONCE during postmaster or standalone-backend startup, - * after StartupXLOG has initialized ShmemVariableCache->nextXid. + * after StartupXLOG has initialized TransamVariables->nextXid. */ void StartupCommitTs(void) @@ -662,7 +705,7 @@ static void ActivateCommitTs(void) { TransactionId xid; - int pageno; + int64 pageno; /* If we've done this already, there's nothing to do */ LWLockAcquire(CommitTsLock, LW_EXCLUSIVE); @@ -673,15 +716,13 @@ ActivateCommitTs(void) } LWLockRelease(CommitTsLock); - xid = XidFromFullTransactionId(ShmemVariableCache->nextXid); + xid = XidFromFullTransactionId(TransamVariables->nextXid); pageno = TransactionIdToCTsPage(xid); /* * Re-Initialize our idea of the latest page number. */ - LWLockAcquire(CommitTsSLRULock, LW_EXCLUSIVE); - CommitTsCtl->shared->latest_page_number = pageno; - LWLockRelease(CommitTsSLRULock); + pg_atomic_write_u64(&CommitTsCtl->shared->latest_page_number, pageno); /* * If CommitTs is enabled, but it wasn't in the previous server run, we @@ -697,23 +738,24 @@ ActivateCommitTs(void) * Invalid temporarily. */ LWLockAcquire(CommitTsLock, LW_EXCLUSIVE); - if (ShmemVariableCache->oldestCommitTsXid == InvalidTransactionId) + if (TransamVariables->oldestCommitTsXid == InvalidTransactionId) { - ShmemVariableCache->oldestCommitTsXid = - ShmemVariableCache->newestCommitTsXid = ReadNextTransactionId(); + TransamVariables->oldestCommitTsXid = + TransamVariables->newestCommitTsXid = ReadNextTransactionId(); } LWLockRelease(CommitTsLock); /* Create the current segment file, if necessary */ if (!SimpleLruDoesPhysicalPageExist(CommitTsCtl, pageno)) { + LWLock *lock = SimpleLruGetBankLock(CommitTsCtl, pageno); int slotno; - LWLockAcquire(CommitTsSLRULock, LW_EXCLUSIVE); + LWLockAcquire(lock, LW_EXCLUSIVE); slotno = ZeroCommitTsPage(pageno, false); SimpleLruWritePage(CommitTsCtl, slotno); Assert(!CommitTsCtl->shared->page_dirty[slotno]); - LWLockRelease(CommitTsSLRULock); + LWLockRelease(lock); } /* Change the activation status in shared memory. */ @@ -749,10 +791,8 @@ DeactivateCommitTs(void) TIMESTAMP_NOBEGIN(commitTsShared->dataLastCommit.time); commitTsShared->dataLastCommit.nodeid = InvalidRepOriginId; - ShmemVariableCache->oldestCommitTsXid = InvalidTransactionId; - ShmemVariableCache->newestCommitTsXid = InvalidTransactionId; - - LWLockRelease(CommitTsLock); + TransamVariables->oldestCommitTsXid = InvalidTransactionId; + TransamVariables->newestCommitTsXid = InvalidTransactionId; /* * Remove *all* files. This is necessary so that there are no leftover @@ -761,10 +801,16 @@ DeactivateCommitTs(void) * (We can probably tolerate out-of-sequence files, as they are going to * be overwritten anyway when we wrap around, but it seems better to be * tidy.) + * + * Note that we do this with CommitTsLock acquired in exclusive mode. This + * is very heavy-handed, but since this routine can only be called in the + * replica and should happen very rarely, we don't worry too much about + * it. Note also that no process should be consulting this SLRU if we + * have just deactivated it. */ - LWLockAcquire(CommitTsSLRULock, LW_EXCLUSIVE); (void) SlruScanDirectory(CommitTsCtl, SlruScanDirCbDeleteAll, NULL); - LWLockRelease(CommitTsSLRULock); + + LWLockRelease(CommitTsLock); } /* @@ -795,7 +841,8 @@ CheckPointCommitTs(void) void ExtendCommitTs(TransactionId newestXact) { - int pageno; + int64 pageno; + LWLock *lock; /* * Nothing to do if module not enabled. Note we do an unlocked read of @@ -816,12 +863,14 @@ ExtendCommitTs(TransactionId newestXact) pageno = TransactionIdToCTsPage(newestXact); - LWLockAcquire(CommitTsSLRULock, LW_EXCLUSIVE); + lock = SimpleLruGetBankLock(CommitTsCtl, pageno); + + LWLockAcquire(lock, LW_EXCLUSIVE); /* Zero the page and make an XLOG entry about it */ ZeroCommitTsPage(pageno, !InRecovery); - LWLockRelease(CommitTsSLRULock); + LWLockRelease(lock); } /* @@ -833,7 +882,7 @@ ExtendCommitTs(TransactionId newestXact) void TruncateCommitTs(TransactionId oldestXact) { - int cutoffPage; + int64 cutoffPage; /* * The cutoff point is the start of the segment containing oldestXact. We @@ -864,18 +913,18 @@ SetCommitTsLimit(TransactionId oldestXact, TransactionId newestXact) * "future" or signal a disabled committs. */ LWLockAcquire(CommitTsLock, LW_EXCLUSIVE); - if (ShmemVariableCache->oldestCommitTsXid != InvalidTransactionId) + if (TransamVariables->oldestCommitTsXid != InvalidTransactionId) { - if (TransactionIdPrecedes(ShmemVariableCache->oldestCommitTsXid, oldestXact)) - ShmemVariableCache->oldestCommitTsXid = oldestXact; - if (TransactionIdPrecedes(newestXact, ShmemVariableCache->newestCommitTsXid)) - ShmemVariableCache->newestCommitTsXid = newestXact; + if (TransactionIdPrecedes(TransamVariables->oldestCommitTsXid, oldestXact)) + TransamVariables->oldestCommitTsXid = oldestXact; + if (TransactionIdPrecedes(newestXact, TransamVariables->newestCommitTsXid)) + TransamVariables->newestCommitTsXid = newestXact; } else { - Assert(ShmemVariableCache->newestCommitTsXid == InvalidTransactionId); - ShmemVariableCache->oldestCommitTsXid = oldestXact; - ShmemVariableCache->newestCommitTsXid = newestXact; + Assert(TransamVariables->newestCommitTsXid == InvalidTransactionId); + TransamVariables->oldestCommitTsXid = oldestXact; + TransamVariables->newestCommitTsXid = newestXact; } LWLockRelease(CommitTsLock); } @@ -887,9 +936,9 @@ void AdvanceOldestCommitTsXid(TransactionId oldestXact) { LWLockAcquire(CommitTsLock, LW_EXCLUSIVE); - if (ShmemVariableCache->oldestCommitTsXid != InvalidTransactionId && - TransactionIdPrecedes(ShmemVariableCache->oldestCommitTsXid, oldestXact)) - ShmemVariableCache->oldestCommitTsXid = oldestXact; + if (TransamVariables->oldestCommitTsXid != InvalidTransactionId && + TransactionIdPrecedes(TransamVariables->oldestCommitTsXid, oldestXact)) + TransamVariables->oldestCommitTsXid = oldestXact; LWLockRelease(CommitTsLock); } @@ -918,7 +967,7 @@ AdvanceOldestCommitTsXid(TransactionId oldestXact) * oldestXact=N+2.1, it would be precious at oldestXact=N+2.9. */ static bool -CommitTsPagePrecedes(int page1, int page2) +CommitTsPagePrecedes(int64 page1, int64 page2) { TransactionId xid1; TransactionId xid2; @@ -937,10 +986,10 @@ CommitTsPagePrecedes(int page1, int page2) * Write a ZEROPAGE xlog record */ static void -WriteZeroPageXlogRec(int pageno) +WriteZeroPageXlogRec(int64 pageno) { XLogBeginInsert(); - XLogRegisterData((char *) (&pageno), sizeof(int)); + XLogRegisterData((char *) (&pageno), sizeof(pageno)); (void) XLogInsert(RM_COMMIT_TS_ID, COMMIT_TS_ZEROPAGE); } @@ -948,7 +997,7 @@ WriteZeroPageXlogRec(int pageno) * Write a TRUNCATE xlog record */ static void -WriteTruncateXlogRec(int pageno, TransactionId oldestXid) +WriteTruncateXlogRec(int64 pageno, TransactionId oldestXid) { xl_commit_ts_truncate xlrec; @@ -973,18 +1022,20 @@ commit_ts_redo(XLogReaderState *record) if (info == COMMIT_TS_ZEROPAGE) { - int pageno; + int64 pageno; int slotno; + LWLock *lock; - memcpy(&pageno, XLogRecGetData(record), sizeof(int)); + memcpy(&pageno, XLogRecGetData(record), sizeof(pageno)); - LWLockAcquire(CommitTsSLRULock, LW_EXCLUSIVE); + lock = SimpleLruGetBankLock(CommitTsCtl, pageno); + LWLockAcquire(lock, LW_EXCLUSIVE); slotno = ZeroCommitTsPage(pageno, false); SimpleLruWritePage(CommitTsCtl, slotno); Assert(!CommitTsCtl->shared->page_dirty[slotno]); - LWLockRelease(CommitTsSLRULock); + LWLockRelease(lock); } else if (info == COMMIT_TS_TRUNCATE) { @@ -996,7 +1047,8 @@ commit_ts_redo(XLogReaderState *record) * During XLOG replay, latest_page_number isn't set up yet; insert a * suitable value to bypass the sanity test in SimpleLruTruncate. */ - CommitTsCtl->shared->latest_page_number = trunc->pageno; + pg_atomic_write_u64(&CommitTsCtl->shared->latest_page_number, + trunc->pageno); SimpleLruTruncate(CommitTsCtl, trunc->pageno); } diff --git a/src/backend/access/transam/generic_xlog.c b/src/backend/access/transam/generic_xlog.c index 6c68191ca6241..e8522781631df 100644 --- a/src/backend/access/transam/generic_xlog.c +++ b/src/backend/access/transam/generic_xlog.c @@ -4,7 +4,7 @@ * Implementation of generic xlog records. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/generic_xlog.c @@ -17,7 +17,6 @@ #include "access/generic_xlog.h" #include "access/xlogutils.h" #include "miscadmin.h" -#include "utils/memutils.h" /*------------------------------------------------------------------------- * Internally, a delta between pages consists of a set of fragments. Each @@ -347,6 +346,10 @@ GenericXLogFinish(GenericXLogState *state) START_CRIT_SECTION(); + /* + * Compute deltas if necessary, write changes to buffers, mark buffers + * dirty, and register changes. + */ for (i = 0; i < MAX_GENERIC_XLOG_PAGES; i++) { PageData *pageData = &state->pages[i]; @@ -359,41 +362,34 @@ GenericXLogFinish(GenericXLogState *state) page = BufferGetPage(pageData->buffer); pageHeader = (PageHeader) pageData->image; + /* + * Compute delta while we still have both the unmodified page and + * the new image. Not needed if we are logging the full image. + */ + if (!(pageData->flags & GENERIC_XLOG_FULL_IMAGE)) + computeDelta(pageData, page, (Page) pageData->image); + + /* + * Apply the image, being careful to zero the "hole" between + * pd_lower and pd_upper in order to avoid divergence between + * actual page state and what replay would produce. + */ + memcpy(page, pageData->image, pageHeader->pd_lower); + memset(page + pageHeader->pd_lower, 0, + pageHeader->pd_upper - pageHeader->pd_lower); + memcpy(page + pageHeader->pd_upper, + pageData->image + pageHeader->pd_upper, + BLCKSZ - pageHeader->pd_upper); + + MarkBufferDirty(pageData->buffer); + if (pageData->flags & GENERIC_XLOG_FULL_IMAGE) { - /* - * A full-page image does not require us to supply any xlog - * data. Just apply the image, being careful to zero the - * "hole" between pd_lower and pd_upper in order to avoid - * divergence between actual page state and what replay would - * produce. - */ - memcpy(page, pageData->image, pageHeader->pd_lower); - memset(page + pageHeader->pd_lower, 0, - pageHeader->pd_upper - pageHeader->pd_lower); - memcpy(page + pageHeader->pd_upper, - pageData->image + pageHeader->pd_upper, - BLCKSZ - pageHeader->pd_upper); - XLogRegisterBuffer(i, pageData->buffer, REGBUF_FORCE_IMAGE | REGBUF_STANDARD); } else { - /* - * In normal mode, calculate delta and write it as xlog data - * associated with this page. - */ - computeDelta(pageData, page, (Page) pageData->image); - - /* Apply the image, with zeroed "hole" as above */ - memcpy(page, pageData->image, pageHeader->pd_lower); - memset(page + pageHeader->pd_lower, 0, - pageHeader->pd_upper - pageHeader->pd_lower); - memcpy(page + pageHeader->pd_upper, - pageData->image + pageHeader->pd_upper, - BLCKSZ - pageHeader->pd_upper); - XLogRegisterBuffer(i, pageData->buffer, REGBUF_STANDARD); XLogRegisterBufData(i, pageData->delta, pageData->deltaLen); } @@ -402,7 +398,7 @@ GenericXLogFinish(GenericXLogState *state) /* Insert xlog record */ lsn = XLogInsert(RM_GENERIC_ID, 0); - /* Set LSN and mark buffers dirty */ + /* Set LSN */ for (i = 0; i < MAX_GENERIC_XLOG_PAGES; i++) { PageData *pageData = &state->pages[i]; @@ -410,7 +406,6 @@ GenericXLogFinish(GenericXLogState *state) if (BufferIsInvalid(pageData->buffer)) continue; PageSetLSN(BufferGetPage(pageData->buffer), lsn); - MarkBufferDirty(pageData->buffer); } END_CRIT_SECTION(); } diff --git a/src/backend/access/transam/meson.build b/src/backend/access/transam/meson.build index 8920c1bfce21f..8a3522557cd90 100644 --- a/src/backend/access/transam/meson.build +++ b/src/backend/access/transam/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'clog.c', diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index abb022e0670fa..b7b47ef076a9c 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -59,7 +59,7 @@ * counter does not fall within the wraparound horizon considering the global * minimum value. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/multixact.c @@ -74,22 +74,22 @@ #include "access/twophase.h" #include "access/twophase_rmgr.h" #include "access/xact.h" +#include "access/xlog.h" #include "access/xloginsert.h" #include "access/xlogutils.h" -#include "catalog/pg_type.h" #include "commands/dbcommands.h" #include "funcapi.h" #include "lib/ilist.h" #include "miscadmin.h" #include "pg_trace.h" +#include "pgstat.h" #include "postmaster/autovacuum.h" -#include "storage/lmgr.h" #include "storage/pmsignal.h" #include "storage/proc.h" #include "storage/procarray.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" +#include "utils/guc_hooks.h" #include "utils/memutils.h" -#include "utils/snapmgr.h" /* @@ -108,11 +108,23 @@ /* We need four bytes per offset */ #define MULTIXACT_OFFSETS_PER_PAGE (BLCKSZ / sizeof(MultiXactOffset)) -#define MultiXactIdToOffsetPage(xid) \ - ((xid) / (MultiXactOffset) MULTIXACT_OFFSETS_PER_PAGE) -#define MultiXactIdToOffsetEntry(xid) \ - ((xid) % (MultiXactOffset) MULTIXACT_OFFSETS_PER_PAGE) -#define MultiXactIdToOffsetSegment(xid) (MultiXactIdToOffsetPage(xid) / SLRU_PAGES_PER_SEGMENT) +static inline int64 +MultiXactIdToOffsetPage(MultiXactId multi) +{ + return multi / MULTIXACT_OFFSETS_PER_PAGE; +} + +static inline int +MultiXactIdToOffsetEntry(MultiXactId multi) +{ + return multi % MULTIXACT_OFFSETS_PER_PAGE; +} + +static inline int64 +MultiXactIdToOffsetSegment(MultiXactId multi) +{ + return MultiXactIdToOffsetPage(multi) / SLRU_PAGES_PER_SEGMENT; +} /* * The situation for members is a bit more complex: we store one byte of @@ -156,30 +168,59 @@ ((uint32) ((0xFFFFFFFF % MULTIXACT_MEMBERS_PER_PAGE) + 1)) /* page in which a member is to be found */ -#define MXOffsetToMemberPage(xid) ((xid) / (TransactionId) MULTIXACT_MEMBERS_PER_PAGE) -#define MXOffsetToMemberSegment(xid) (MXOffsetToMemberPage(xid) / SLRU_PAGES_PER_SEGMENT) +static inline int64 +MXOffsetToMemberPage(MultiXactOffset offset) +{ + return offset / MULTIXACT_MEMBERS_PER_PAGE; +} + +static inline int64 +MXOffsetToMemberSegment(MultiXactOffset offset) +{ + return MXOffsetToMemberPage(offset) / SLRU_PAGES_PER_SEGMENT; +} /* Location (byte offset within page) of flag word for a given member */ -#define MXOffsetToFlagsOffset(xid) \ - ((((xid) / (TransactionId) MULTIXACT_MEMBERS_PER_MEMBERGROUP) % \ - (TransactionId) MULTIXACT_MEMBERGROUPS_PER_PAGE) * \ - (TransactionId) MULTIXACT_MEMBERGROUP_SIZE) -#define MXOffsetToFlagsBitShift(xid) \ - (((xid) % (TransactionId) MULTIXACT_MEMBERS_PER_MEMBERGROUP) * \ - MXACT_MEMBER_BITS_PER_XACT) +static inline int +MXOffsetToFlagsOffset(MultiXactOffset offset) +{ + MultiXactOffset group = offset / MULTIXACT_MEMBERS_PER_MEMBERGROUP; + int grouponpg = group % MULTIXACT_MEMBERGROUPS_PER_PAGE; + int byteoff = grouponpg * MULTIXACT_MEMBERGROUP_SIZE; + + return byteoff; +} + +static inline int +MXOffsetToFlagsBitShift(MultiXactOffset offset) +{ + int member_in_group = offset % MULTIXACT_MEMBERS_PER_MEMBERGROUP; + int bshift = member_in_group * MXACT_MEMBER_BITS_PER_XACT; + + return bshift; +} /* Location (byte offset within page) of TransactionId of given member */ -#define MXOffsetToMemberOffset(xid) \ - (MXOffsetToFlagsOffset(xid) + MULTIXACT_FLAGBYTES_PER_GROUP + \ - ((xid) % MULTIXACT_MEMBERS_PER_MEMBERGROUP) * sizeof(TransactionId)) +static inline int +MXOffsetToMemberOffset(MultiXactOffset offset) +{ + int member_in_group = offset % MULTIXACT_MEMBERS_PER_MEMBERGROUP; + + return MXOffsetToFlagsOffset(offset) + + MULTIXACT_FLAGBYTES_PER_GROUP + + member_in_group * sizeof(TransactionId); +} /* Multixact members wraparound thresholds. */ #define MULTIXACT_MEMBER_SAFE_THRESHOLD (MaxMultiXactOffset / 2) #define MULTIXACT_MEMBER_DANGER_THRESHOLD \ (MaxMultiXactOffset - MaxMultiXactOffset / 4) -#define PreviousMultiXactId(xid) \ - ((xid) == FirstMultiXactId ? MaxMultiXactId : (xid) - 1) +static inline MultiXactId +PreviousMultiXactId(MultiXactId multi) +{ + return multi == FirstMultiXactId ? MaxMultiXactId : multi - 1; +} /* * Links to shared-memory data structures for MultiXact control @@ -192,10 +233,10 @@ static SlruCtlData MultiXactMemberCtlData; /* * MultiXact state shared across all backends. All this state is protected - * by MultiXactGenLock. (We also use MultiXactOffsetSLRULock and - * MultiXactMemberSLRULock to guard accesses to the two sets of SLRU - * buffers. For concurrency's sake, we avoid holding more than one of these - * locks at a time.) + * by MultiXactGenLock. (We also use SLRU bank's lock of MultiXactOffset and + * MultiXactMember to guard accesses to the two sets of SLRU buffers. For + * concurrency's sake, we avoid holding more than one of these locks at a + * time.) */ typedef struct MultiXactStateData { @@ -233,14 +274,20 @@ typedef struct MultiXactStateData /* support for members anti-wraparound measures */ MultiXactOffset offsetStopLimit; /* known if oldestOffsetKnown */ + /* + * This is used to sleep until a multixact offset is written when we want + * to create the next one. + */ + ConditionVariable nextoff_cv; + /* * Per-backend data starts here. We have two arrays stored in the area * immediately following the MultiXactStateData struct. Each is indexed by - * BackendId. + * ProcNumber. * - * In both arrays, there's a slot for all normal backends (1..MaxBackends) - * followed by a slot for max_prepared_xacts prepared transactions. Valid - * BackendIds start from 1; element zero of each array is never used. + * In both arrays, there's a slot for all normal backends + * (0..MaxBackends-1) followed by a slot for max_prepared_xacts prepared + * transactions. * * OldestMemberMXactId[k] is the oldest MultiXactId each backend's current * transaction(s) could possibly be a member of, or InvalidMultiXactId @@ -284,8 +331,7 @@ typedef struct MultiXactStateData } MultiXactStateData; /* - * Last element of OldestMemberMXactId and OldestVisibleMXactId arrays. - * Valid elements are (1..MaxOldestSlot); element 0 is never used. + * Size of OldestMemberMXactId and OldestVisibleMXactId arrays. */ #define MaxOldestSlot (MaxBackends + max_prepared_xacts) @@ -354,10 +400,10 @@ static void mXactCachePut(MultiXactId multi, int nmembers, static char *mxstatus_to_string(MultiXactStatus status); /* management of SLRU infrastructure */ -static int ZeroMultiXactOffsetPage(int pageno, bool writeXlog); -static int ZeroMultiXactMemberPage(int pageno, bool writeXlog); -static bool MultiXactOffsetPagePrecedes(int page1, int page2); -static bool MultiXactMemberPagePrecedes(int page1, int page2); +static int ZeroMultiXactOffsetPage(int64 pageno, bool writeXlog); +static int ZeroMultiXactMemberPage(int64 pageno, bool writeXlog); +static bool MultiXactOffsetPagePrecedes(int64 page1, int64 page2); +static bool MultiXactMemberPagePrecedes(int64 page1, int64 page2); static bool MultiXactOffsetPrecedes(MultiXactOffset offset1, MultiXactOffset offset2); static void ExtendMultiXactOffset(MultiXactId multi); @@ -366,7 +412,7 @@ static bool MultiXactOffsetWouldWrap(MultiXactOffset boundary, MultiXactOffset start, uint32 distance); static bool SetOffsetVacuumLimit(bool is_startup); static bool find_multixact_start(MultiXactId multi, MultiXactOffset *result); -static void WriteMZeroPageXlogRec(int pageno, uint8 info); +static void WriteMZeroPageXlogRec(int64 pageno, uint8 info); static void WriteMTruncateXlogRec(Oid oldestMultiDB, MultiXactId startTruncOff, MultiXactId endTruncOff, @@ -396,7 +442,7 @@ MultiXactIdCreate(TransactionId xid1, MultiXactStatus status1, Assert(!TransactionIdEquals(xid1, xid2) || (status1 != status2)); /* MultiXactIdSetOldestMember() must have been called already. */ - Assert(MultiXactIdIsValid(OldestMemberMXactId[MyBackendId])); + Assert(MultiXactIdIsValid(OldestMemberMXactId[MyProcNumber])); /* * Note: unlike MultiXactIdExpand, we don't bother to check that both XIDs @@ -450,7 +496,7 @@ MultiXactIdExpand(MultiXactId multi, TransactionId xid, MultiXactStatus status) Assert(TransactionIdIsValid(xid)); /* MultiXactIdSetOldestMember() must have been called already. */ - Assert(MultiXactIdIsValid(OldestMemberMXactId[MyBackendId])); + Assert(MultiXactIdIsValid(OldestMemberMXactId[MyProcNumber])); debug_elog5(DEBUG2, "Expand: received multi %u, xid %u status %s", multi, xid, mxstatus_to_string(status)); @@ -625,7 +671,7 @@ MultiXactIdIsRunning(MultiXactId multi, bool isLockOnly) void MultiXactIdSetOldestMember(void) { - if (!MultiXactIdIsValid(OldestMemberMXactId[MyBackendId])) + if (!MultiXactIdIsValid(OldestMemberMXactId[MyProcNumber])) { MultiXactId nextMXact; @@ -654,12 +700,12 @@ MultiXactIdSetOldestMember(void) if (nextMXact < FirstMultiXactId) nextMXact = FirstMultiXactId; - OldestMemberMXactId[MyBackendId] = nextMXact; + OldestMemberMXactId[MyProcNumber] = nextMXact; LWLockRelease(MultiXactGenLock); debug_elog4(DEBUG2, "MultiXact: setting OldestMember[%d] = %u", - MyBackendId, nextMXact); + MyProcNumber, nextMXact); } } @@ -682,7 +728,7 @@ MultiXactIdSetOldestMember(void) static void MultiXactIdSetOldestVisible(void) { - if (!MultiXactIdIsValid(OldestVisibleMXactId[MyBackendId])) + if (!MultiXactIdIsValid(OldestVisibleMXactId[MyProcNumber])) { MultiXactId oldestMXact; int i; @@ -698,7 +744,7 @@ MultiXactIdSetOldestVisible(void) if (oldestMXact < FirstMultiXactId) oldestMXact = FirstMultiXactId; - for (i = 1; i <= MaxOldestSlot; i++) + for (i = 0; i < MaxOldestSlot; i++) { MultiXactId thisoldest = OldestMemberMXactId[i]; @@ -707,12 +753,12 @@ MultiXactIdSetOldestVisible(void) oldestMXact = thisoldest; } - OldestVisibleMXactId[MyBackendId] = oldestMXact; + OldestVisibleMXactId[MyProcNumber] = oldestMXact; LWLockRelease(MultiXactGenLock); debug_elog4(DEBUG2, "MultiXact: setting OldestVisible[%d] = %u", - MyBackendId, oldestMXact); + MyProcNumber, oldestMXact); } } @@ -864,18 +910,21 @@ static void RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, int nmembers, MultiXactMember *members) { - int pageno; - int prev_pageno; + int64 pageno; + int64 prev_pageno; int entryno; int slotno; MultiXactOffset *offptr; int i; - - LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); + LWLock *lock; + LWLock *prevlock = NULL; pageno = MultiXactIdToOffsetPage(multi); entryno = MultiXactIdToOffsetEntry(multi); + lock = SimpleLruGetBankLock(MultiXactOffsetCtl, pageno); + LWLockAcquire(lock, LW_EXCLUSIVE); + /* * Note: we pass the MultiXactId to SimpleLruReadPage as the "transaction" * to complain about if there's any I/O error. This is kinda bogus, but @@ -891,10 +940,14 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, MultiXactOffsetCtl->shared->page_dirty[slotno] = true; - /* Exchange our lock */ - LWLockRelease(MultiXactOffsetSLRULock); + /* Release MultiXactOffset SLRU lock. */ + LWLockRelease(lock); - LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE); + /* + * If anybody was waiting to know the offset of this multixact ID we just + * wrote, they can read it now, so wake them up. + */ + ConditionVariableBroadcast(&MultiXactState->nextoff_cv); prev_pageno = -1; @@ -916,6 +969,20 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, if (pageno != prev_pageno) { + /* + * MultiXactMember SLRU page is changed so check if this new page + * fall into the different SLRU bank then release the old bank's + * lock and acquire lock on the new bank. + */ + lock = SimpleLruGetBankLock(MultiXactMemberCtl, pageno); + if (lock != prevlock) + { + if (prevlock != NULL) + LWLockRelease(prevlock); + + LWLockAcquire(lock, LW_EXCLUSIVE); + prevlock = lock; + } slotno = SimpleLruReadPage(MultiXactMemberCtl, pageno, true, multi); prev_pageno = pageno; } @@ -936,7 +1003,8 @@ RecordNewMultiXact(MultiXactId multi, MultiXactOffset offset, MultiXactMemberCtl->shared->page_dirty[slotno] = true; } - LWLockRelease(MultiXactMemberSLRULock); + if (prevlock != NULL) + LWLockRelease(prevlock); } /* @@ -1020,14 +1088,14 @@ GetNewMultiXactId(int nmembers, MultiXactOffset *offset) if (oldest_datname) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"", + errmsg("database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database \"%s\"", oldest_datname), errhint("Execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); else ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u", + errmsg("database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database with OID %u", oldest_datoid), errhint("Execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); @@ -1124,7 +1192,7 @@ GetNewMultiXactId(int nmembers, MultiXactOffset *offset) MultiXactState->offsetStopLimit - nextOffset - 1, nmembers, MultiXactState->offsetStopLimit - nextOffset - 1), - errhint("Execute a database-wide VACUUM in database with OID %u with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings.", + errhint("Execute a database-wide VACUUM in database with OID %u with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings.", MultiXactState->oldestMultiXactDB))); } @@ -1160,7 +1228,7 @@ GetNewMultiXactId(int nmembers, MultiXactOffset *offset) MultiXactState->offsetStopLimit - nextOffset + nmembers, MultiXactState->oldestMultiXactDB, MultiXactState->offsetStopLimit - nextOffset + nmembers), - errhint("Execute a database-wide VACUUM in that database with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings."))); + errhint("Execute a database-wide VACUUM in that database with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings."))); ExtendMultiXactMember(nextOffset, nmembers); @@ -1225,20 +1293,21 @@ int GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members, bool from_pgupgrade, bool isLockOnly) { - int pageno; - int prev_pageno; + int64 pageno; + int64 prev_pageno; int entryno; int slotno; MultiXactOffset *offptr; MultiXactOffset offset; int length; int truelength; - int i; MultiXactId oldestMXact; MultiXactId nextMXact; MultiXactId tmpMXact; MultiXactOffset nextOffset; MultiXactMember *ptr; + LWLock *lock; + bool slept = false; debug_elog3(DEBUG2, "GetMembers: asked for %u", multi); @@ -1266,7 +1335,7 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members, * multi. It cannot possibly still be running. */ if (isLockOnly && - MultiXactIdPrecedes(multi, OldestVisibleMXactId[MyBackendId])) + MultiXactIdPrecedes(multi, OldestVisibleMXactId[MyProcNumber])) { debug_elog2(DEBUG2, "GetMembers: a locker-only multi is too old"); *members = NULL; @@ -1326,7 +1395,9 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members, * (because we are careful to pre-zero offset pages). Because * GetNewMultiXactId will never return zero as the starting offset for a * multixact, when we read zero as the next multixact's offset, we know we - * have this case. We sleep for a bit and try again. + * have this case. We handle this by sleeping on the condition variable + * we have just for this; the process in charge will signal the CV as soon + * as it has finished writing the multixact offset. * * 3. Because GetNewMultiXactId increments offset zero to offset one to * handle case #2, there is an ambiguity near the point of offset @@ -1342,11 +1413,13 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members, * time on every multixact creation. */ retry: - LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); - pageno = MultiXactIdToOffsetPage(multi); entryno = MultiXactIdToOffsetEntry(multi); + /* Acquire the bank lock for the page we need. */ + lock = SimpleLruGetBankLock(MultiXactOffsetCtl, pageno); + LWLockAcquire(lock, LW_EXCLUSIVE); + slotno = SimpleLruReadPage(MultiXactOffsetCtl, pageno, true, multi); offptr = (MultiXactOffset *) MultiXactOffsetCtl->shared->page_buffer[slotno]; offptr += entryno; @@ -1379,7 +1452,23 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members, entryno = MultiXactIdToOffsetEntry(tmpMXact); if (pageno != prev_pageno) + { + LWLock *newlock; + + /* + * Since we're going to access a different SLRU page, if this page + * falls under a different bank, release the old bank's lock and + * acquire the lock of the new bank. + */ + newlock = SimpleLruGetBankLock(MultiXactOffsetCtl, pageno); + if (newlock != lock) + { + LWLockRelease(lock); + LWLockAcquire(newlock, LW_EXCLUSIVE); + lock = newlock; + } slotno = SimpleLruReadPage(MultiXactOffsetCtl, pageno, true, tmpMXact); + } offptr = (MultiXactOffset *) MultiXactOffsetCtl->shared->page_buffer[slotno]; offptr += entryno; @@ -1388,25 +1477,32 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members, if (nextMXOffset == 0) { /* Corner case 2: next multixact is still being filled in */ - LWLockRelease(MultiXactOffsetSLRULock); + LWLockRelease(lock); CHECK_FOR_INTERRUPTS(); - pg_usleep(1000L); + + ConditionVariableSleep(&MultiXactState->nextoff_cv, + WAIT_EVENT_MULTIXACT_CREATION); + slept = true; goto retry; } length = nextMXOffset - offset; } - LWLockRelease(MultiXactOffsetSLRULock); + LWLockRelease(lock); + lock = NULL; - ptr = (MultiXactMember *) palloc(length * sizeof(MultiXactMember)); + /* + * If we slept above, clean up state; it's no longer needed. + */ + if (slept) + ConditionVariableCancelSleep(); - /* Now get the members themselves. */ - LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE); + ptr = (MultiXactMember *) palloc(length * sizeof(MultiXactMember)); truelength = 0; prev_pageno = -1; - for (i = 0; i < length; i++, offset++) + for (int i = 0; i < length; i++, offset++) { TransactionId *xactptr; uint32 *flagsptr; @@ -1419,6 +1515,22 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members, if (pageno != prev_pageno) { + LWLock *newlock; + + /* + * Since we're going to access a different SLRU page, if this page + * falls under a different bank, release the old bank's lock and + * acquire the lock of the new bank. + */ + newlock = SimpleLruGetBankLock(MultiXactMemberCtl, pageno); + if (newlock != lock) + { + if (lock) + LWLockRelease(lock); + LWLockAcquire(newlock, LW_EXCLUSIVE); + lock = newlock; + } + slotno = SimpleLruReadPage(MultiXactMemberCtl, pageno, true, multi); prev_pageno = pageno; } @@ -1442,7 +1554,7 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members, truelength++; } - LWLockRelease(MultiXactMemberSLRULock); + LWLockRelease(lock); /* A multixid with zero members should not happen */ Assert(truelength > 0); @@ -1694,8 +1806,8 @@ AtEOXact_MultiXact(void) * We assume that storing a MultiXactId is atomic and so we need not take * MultiXactGenLock to do this. */ - OldestMemberMXactId[MyBackendId] = InvalidMultiXactId; - OldestVisibleMXactId[MyBackendId] = InvalidMultiXactId; + OldestMemberMXactId[MyProcNumber] = InvalidMultiXactId; + OldestVisibleMXactId[MyProcNumber] = InvalidMultiXactId; /* * Discard the local MultiXactId cache. Since MXactContext was created as @@ -1715,7 +1827,7 @@ AtEOXact_MultiXact(void) void AtPrepare_MultiXact(void) { - MultiXactId myOldestMember = OldestMemberMXactId[MyBackendId]; + MultiXactId myOldestMember = OldestMemberMXactId[MyProcNumber]; if (MultiXactIdIsValid(myOldestMember)) RegisterTwoPhaseRecord(TWOPHASE_RM_MULTIXACT_ID, 0, @@ -1735,10 +1847,10 @@ PostPrepare_MultiXact(TransactionId xid) * Transfer our OldestMemberMXactId value to the slot reserved for the * prepared transaction. */ - myOldestMember = OldestMemberMXactId[MyBackendId]; + myOldestMember = OldestMemberMXactId[MyProcNumber]; if (MultiXactIdIsValid(myOldestMember)) { - BackendId dummyBackendId = TwoPhaseGetDummyBackendId(xid, false); + ProcNumber dummyProcNumber = TwoPhaseGetDummyProcNumber(xid, false); /* * Even though storing MultiXactId is atomic, acquire lock to make @@ -1748,8 +1860,8 @@ PostPrepare_MultiXact(TransactionId xid) */ LWLockAcquire(MultiXactGenLock, LW_EXCLUSIVE); - OldestMemberMXactId[dummyBackendId] = myOldestMember; - OldestMemberMXactId[MyBackendId] = InvalidMultiXactId; + OldestMemberMXactId[dummyProcNumber] = myOldestMember; + OldestMemberMXactId[MyProcNumber] = InvalidMultiXactId; LWLockRelease(MultiXactGenLock); } @@ -1762,7 +1874,7 @@ PostPrepare_MultiXact(TransactionId xid) * We assume that storing a MultiXactId is atomic and so we need not take * MultiXactGenLock to do this. */ - OldestVisibleMXactId[MyBackendId] = InvalidMultiXactId; + OldestVisibleMXactId[MyProcNumber] = InvalidMultiXactId; /* * Discard the local MultiXactId cache like in AtEOXact_MultiXact. @@ -1779,7 +1891,7 @@ void multixact_twophase_recover(TransactionId xid, uint16 info, void *recdata, uint32 len) { - BackendId dummyBackendId = TwoPhaseGetDummyBackendId(xid, false); + ProcNumber dummyProcNumber = TwoPhaseGetDummyProcNumber(xid, false); MultiXactId oldestMember; /* @@ -1789,7 +1901,7 @@ multixact_twophase_recover(TransactionId xid, uint16 info, Assert(len == sizeof(MultiXactId)); oldestMember = *((MultiXactId *) recdata); - OldestMemberMXactId[dummyBackendId] = oldestMember; + OldestMemberMXactId[dummyProcNumber] = oldestMember; } /* @@ -1800,11 +1912,11 @@ void multixact_twophase_postcommit(TransactionId xid, uint16 info, void *recdata, uint32 len) { - BackendId dummyBackendId = TwoPhaseGetDummyBackendId(xid, true); + ProcNumber dummyProcNumber = TwoPhaseGetDummyProcNumber(xid, true); Assert(len == sizeof(MultiXactId)); - OldestMemberMXactId[dummyBackendId] = InvalidMultiXactId; + OldestMemberMXactId[dummyProcNumber] = InvalidMultiXactId; } /* @@ -1828,14 +1940,14 @@ MultiXactShmemSize(void) { Size size; - /* We need 2*MaxOldestSlot + 1 perBackendXactIds[] entries */ + /* We need 2*MaxOldestSlot perBackendXactIds[] entries */ #define SHARED_MULTIXACT_STATE_SIZE \ - add_size(offsetof(MultiXactStateData, perBackendXactIds) + sizeof(MultiXactId), \ + add_size(offsetof(MultiXactStateData, perBackendXactIds), \ mul_size(sizeof(MultiXactId) * 2, MaxOldestSlot)) size = SHARED_MULTIXACT_STATE_SIZE; - size = add_size(size, SimpleLruShmemSize(NUM_MULTIXACTOFFSET_BUFFERS, 0)); - size = add_size(size, SimpleLruShmemSize(NUM_MULTIXACTMEMBER_BUFFERS, 0)); + size = add_size(size, SimpleLruShmemSize(multixact_offset_buffers, 0)); + size = add_size(size, SimpleLruShmemSize(multixact_member_buffers, 0)); return size; } @@ -1851,16 +1963,18 @@ MultiXactShmemInit(void) MultiXactMemberCtl->PagePrecedes = MultiXactMemberPagePrecedes; SimpleLruInit(MultiXactOffsetCtl, - "MultiXactOffset", NUM_MULTIXACTOFFSET_BUFFERS, 0, - MultiXactOffsetSLRULock, "pg_multixact/offsets", - LWTRANCHE_MULTIXACTOFFSET_BUFFER, - SYNC_HANDLER_MULTIXACT_OFFSET); + "multixact_offset", multixact_offset_buffers, 0, + "pg_multixact/offsets", LWTRANCHE_MULTIXACTOFFSET_BUFFER, + LWTRANCHE_MULTIXACTOFFSET_SLRU, + SYNC_HANDLER_MULTIXACT_OFFSET, + false); SlruPagePrecedesUnitTests(MultiXactOffsetCtl, MULTIXACT_OFFSETS_PER_PAGE); SimpleLruInit(MultiXactMemberCtl, - "MultiXactMember", NUM_MULTIXACTMEMBER_BUFFERS, 0, - MultiXactMemberSLRULock, "pg_multixact/members", - LWTRANCHE_MULTIXACTMEMBER_BUFFER, - SYNC_HANDLER_MULTIXACT_MEMBER); + "multixact_member", multixact_member_buffers, 0, + "pg_multixact/members", LWTRANCHE_MULTIXACTMEMBER_BUFFER, + LWTRANCHE_MULTIXACTMEMBER_SLRU, + SYNC_HANDLER_MULTIXACT_MEMBER, + false); /* doesn't call SimpleLruTruncate() or meet criteria for unit tests */ /* Initialize our shared state struct */ @@ -1873,18 +1987,36 @@ MultiXactShmemInit(void) /* Make sure we zero out the per-backend state */ MemSet(MultiXactState, 0, SHARED_MULTIXACT_STATE_SIZE); + ConditionVariableInit(&MultiXactState->nextoff_cv); } else Assert(found); /* - * Set up array pointers. Note that perBackendXactIds[0] is wasted space - * since we only use indexes 1..MaxOldestSlot in each array. + * Set up array pointers. */ OldestMemberMXactId = MultiXactState->perBackendXactIds; OldestVisibleMXactId = OldestMemberMXactId + MaxOldestSlot; } +/* + * GUC check_hook for multixact_offset_buffers + */ +bool +check_multixact_offset_buffers(int *newval, void **extra, GucSource source) +{ + return check_slru_buffers("multixact_offset_buffers", newval); +} + +/* + * GUC check_hook for multixact_member_buffer + */ +bool +check_multixact_member_buffers(int *newval, void **extra, GucSource source) +{ + return check_slru_buffers("multixact_member_buffers", newval); +} + /* * This func must be called ONCE on system install. It creates the initial * MultiXact segments. (The MultiXacts directories are assumed to have been @@ -1894,8 +2026,10 @@ void BootStrapMultiXact(void) { int slotno; + LWLock *lock; - LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); + lock = SimpleLruGetBankLock(MultiXactOffsetCtl, 0); + LWLockAcquire(lock, LW_EXCLUSIVE); /* Create and zero the first page of the offsets log */ slotno = ZeroMultiXactOffsetPage(0, false); @@ -1904,9 +2038,10 @@ BootStrapMultiXact(void) SimpleLruWritePage(MultiXactOffsetCtl, slotno); Assert(!MultiXactOffsetCtl->shared->page_dirty[slotno]); - LWLockRelease(MultiXactOffsetSLRULock); + LWLockRelease(lock); - LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE); + lock = SimpleLruGetBankLock(MultiXactMemberCtl, 0); + LWLockAcquire(lock, LW_EXCLUSIVE); /* Create and zero the first page of the members log */ slotno = ZeroMultiXactMemberPage(0, false); @@ -1915,7 +2050,7 @@ BootStrapMultiXact(void) SimpleLruWritePage(MultiXactMemberCtl, slotno); Assert(!MultiXactMemberCtl->shared->page_dirty[slotno]); - LWLockRelease(MultiXactMemberSLRULock); + LWLockRelease(lock); } /* @@ -1928,7 +2063,7 @@ BootStrapMultiXact(void) * Control lock must be held at entry, and will be held at exit. */ static int -ZeroMultiXactOffsetPage(int pageno, bool writeXlog) +ZeroMultiXactOffsetPage(int64 pageno, bool writeXlog) { int slotno; @@ -1944,7 +2079,7 @@ ZeroMultiXactOffsetPage(int pageno, bool writeXlog) * Ditto, for MultiXactMember */ static int -ZeroMultiXactMemberPage(int pageno, bool writeXlog) +ZeroMultiXactMemberPage(int64 pageno, bool writeXlog) { int slotno; @@ -1974,11 +2109,13 @@ ZeroMultiXactMemberPage(int pageno, bool writeXlog) static void MaybeExtendOffsetSlru(void) { - int pageno; + int64 pageno; + LWLock *lock; pageno = MultiXactIdToOffsetPage(MultiXactState->nextMXact); + lock = SimpleLruGetBankLock(MultiXactOffsetCtl, pageno); - LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); + LWLockAcquire(lock, LW_EXCLUSIVE); if (!SimpleLruDoesPhysicalPageExist(MultiXactOffsetCtl, pageno)) { @@ -1993,7 +2130,7 @@ MaybeExtendOffsetSlru(void) SimpleLruWritePage(MultiXactOffsetCtl, slotno); } - LWLockRelease(MultiXactOffsetSLRULock); + LWLockRelease(lock); } /* @@ -2009,19 +2146,21 @@ StartupMultiXact(void) { MultiXactId multi = MultiXactState->nextMXact; MultiXactOffset offset = MultiXactState->nextOffset; - int pageno; + int64 pageno; /* * Initialize offset's idea of the latest page number. */ pageno = MultiXactIdToOffsetPage(multi); - MultiXactOffsetCtl->shared->latest_page_number = pageno; + pg_atomic_write_u64(&MultiXactOffsetCtl->shared->latest_page_number, + pageno); /* * Initialize member's idea of the latest page number. */ pageno = MXOffsetToMemberPage(offset); - MultiXactMemberCtl->shared->latest_page_number = pageno; + pg_atomic_write_u64(&MultiXactMemberCtl->shared->latest_page_number, + pageno); } /* @@ -2034,7 +2173,7 @@ TrimMultiXact(void) MultiXactOffset offset; MultiXactId oldestMXact; Oid oldestMXactDB; - int pageno; + int64 pageno; int entryno; int flagsoff; @@ -2046,13 +2185,13 @@ TrimMultiXact(void) LWLockRelease(MultiXactGenLock); /* Clean up offsets state */ - LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); /* * (Re-)Initialize our idea of the latest page number for offsets. */ pageno = MultiXactIdToOffsetPage(nextMXact); - MultiXactOffsetCtl->shared->latest_page_number = pageno; + pg_atomic_write_u64(&MultiXactOffsetCtl->shared->latest_page_number, + pageno); /* * Zero out the remainder of the current offsets page. See notes in @@ -2067,7 +2206,9 @@ TrimMultiXact(void) { int slotno; MultiXactOffset *offptr; + LWLock *lock = SimpleLruGetBankLock(MultiXactOffsetCtl, pageno); + LWLockAcquire(lock, LW_EXCLUSIVE); slotno = SimpleLruReadPage(MultiXactOffsetCtl, pageno, true, nextMXact); offptr = (MultiXactOffset *) MultiXactOffsetCtl->shared->page_buffer[slotno]; offptr += entryno; @@ -2075,18 +2216,17 @@ TrimMultiXact(void) MemSet(offptr, 0, BLCKSZ - (entryno * sizeof(MultiXactOffset))); MultiXactOffsetCtl->shared->page_dirty[slotno] = true; + LWLockRelease(lock); } - LWLockRelease(MultiXactOffsetSLRULock); - - /* And the same for members */ - LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE); - /* + * And the same for members. + * * (Re-)Initialize our idea of the latest page number for members. */ pageno = MXOffsetToMemberPage(offset); - MultiXactMemberCtl->shared->latest_page_number = pageno; + pg_atomic_write_u64(&MultiXactMemberCtl->shared->latest_page_number, + pageno); /* * Zero out the remainder of the current members page. See notes in @@ -2098,7 +2238,9 @@ TrimMultiXact(void) int slotno; TransactionId *xidptr; int memberoff; + LWLock *lock = SimpleLruGetBankLock(MultiXactMemberCtl, pageno); + LWLockAcquire(lock, LW_EXCLUSIVE); memberoff = MXOffsetToMemberOffset(offset); slotno = SimpleLruReadPage(MultiXactMemberCtl, pageno, true, offset); xidptr = (TransactionId *) @@ -2113,10 +2255,9 @@ TrimMultiXact(void) */ MultiXactMemberCtl->shared->page_dirty[slotno] = true; + LWLockRelease(lock); } - LWLockRelease(MultiXactMemberSLRULock); - /* signal that we're officially up */ LWLockAcquire(MultiXactGenLock, LW_EXCLUSIVE); MultiXactState->finishedStartup = true; @@ -2335,7 +2476,7 @@ SetMultiXactIdLimit(MultiXactId oldest_datminmxid, Oid oldest_datoid, multiWrapLimit - curMulti, oldest_datname, multiWrapLimit - curMulti), - errhint("To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" + errhint("To avoid MultiXactId assignment failures, execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); else ereport(WARNING, @@ -2344,7 +2485,7 @@ SetMultiXactIdLimit(MultiXactId oldest_datminmxid, Oid oldest_datoid, multiWrapLimit - curMulti, oldest_datoid, multiWrapLimit - curMulti), - errhint("To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" + errhint("To avoid MultiXactId assignment failures, execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); } } @@ -2403,7 +2544,8 @@ MultiXactAdvanceOldest(MultiXactId oldestMulti, Oid oldestMultiDB) static void ExtendMultiXactOffset(MultiXactId multi) { - int pageno; + int64 pageno; + LWLock *lock; /* * No work except at first MultiXactId of a page. But beware: just after @@ -2414,13 +2556,14 @@ ExtendMultiXactOffset(MultiXactId multi) return; pageno = MultiXactIdToOffsetPage(multi); + lock = SimpleLruGetBankLock(MultiXactOffsetCtl, pageno); - LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); + LWLockAcquire(lock, LW_EXCLUSIVE); /* Zero the page and make an XLOG entry about it */ ZeroMultiXactOffsetPage(pageno, true); - LWLockRelease(MultiXactOffsetSLRULock); + LWLockRelease(lock); } /* @@ -2452,16 +2595,18 @@ ExtendMultiXactMember(MultiXactOffset offset, int nmembers) flagsbit = MXOffsetToFlagsBitShift(offset); if (flagsoff == 0 && flagsbit == 0) { - int pageno; + int64 pageno; + LWLock *lock; pageno = MXOffsetToMemberPage(offset); + lock = SimpleLruGetBankLock(MultiXactMemberCtl, pageno); - LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE); + LWLockAcquire(lock, LW_EXCLUSIVE); /* Zero the page and make an XLOG entry about it */ ZeroMultiXactMemberPage(pageno, true); - LWLockRelease(MultiXactMemberSLRULock); + LWLockRelease(lock); } /* @@ -2526,7 +2671,7 @@ GetOldestMultiXactId(void) nextMXact = FirstMultiXactId; oldestMXact = nextMXact; - for (i = 1; i <= MaxOldestSlot; i++) + for (i = 0; i < MaxOldestSlot; i++) { MultiXactId thisoldest; @@ -2735,7 +2880,7 @@ static bool find_multixact_start(MultiXactId multi, MultiXactOffset *result) { MultiXactOffset offset; - int pageno; + int64 pageno; int entryno; int slotno; MultiXactOffset *offptr; @@ -2759,7 +2904,7 @@ find_multixact_start(MultiXactId multi, MultiXactOffset *result) offptr = (MultiXactOffset *) MultiXactOffsetCtl->shared->page_buffer[slotno]; offptr += entryno; offset = *offptr; - LWLockRelease(MultiXactOffsetSLRULock); + LWLockRelease(SimpleLruGetBankLock(MultiXactOffsetCtl, pageno)); *result = offset; return true; @@ -2828,6 +2973,7 @@ MultiXactMemberFreezeThreshold(void) uint32 multixacts; uint32 victim_multixacts; double fraction; + int result; /* If we can't determine member space utilization, assume the worst. */ if (!ReadMultiXactCounts(&multixacts, &members)) @@ -2849,12 +2995,18 @@ MultiXactMemberFreezeThreshold(void) /* fraction could be > 1.0, but lowest possible freeze age is zero */ if (victim_multixacts > multixacts) return 0; - return multixacts - victim_multixacts; + result = multixacts - victim_multixacts; + + /* + * Clamp to autovacuum_multixact_freeze_max_age, so that we never make + * autovacuum less aggressive than it would otherwise be. + */ + return Min(result, autovacuum_multixact_freeze_max_age); } typedef struct mxtruncinfo { - int earliestExistingPage; + int64 earliestExistingPage; } mxtruncinfo; /* @@ -2862,7 +3014,7 @@ typedef struct mxtruncinfo * This callback determines the earliest existing page number. */ static bool -SlruScanDirCbFindEarliest(SlruCtl ctl, char *filename, int segpage, void *data) +SlruScanDirCbFindEarliest(SlruCtl ctl, char *filename, int64 segpage, void *data) { mxtruncinfo *trunc = (mxtruncinfo *) data; @@ -2887,10 +3039,10 @@ SlruScanDirCbFindEarliest(SlruCtl ctl, char *filename, int segpage, void *data) static void PerformMembersTruncation(MultiXactOffset oldestOffset, MultiXactOffset newOldestOffset) { - const int maxsegment = MXOffsetToMemberSegment(MaxMultiXactOffset); - int startsegment = MXOffsetToMemberSegment(oldestOffset); - int endsegment = MXOffsetToMemberSegment(newOldestOffset); - int segment = startsegment; + const int64 maxsegment = MXOffsetToMemberSegment(MaxMultiXactOffset); + int64 startsegment = MXOffsetToMemberSegment(oldestOffset); + int64 endsegment = MXOffsetToMemberSegment(newOldestOffset); + int64 segment = startsegment; /* * Delete all the segments but the last one. The last segment can still @@ -2898,7 +3050,8 @@ PerformMembersTruncation(MultiXactOffset oldestOffset, MultiXactOffset newOldest */ while (segment != endsegment) { - elog(DEBUG2, "truncating multixact members segment %x", segment); + elog(DEBUG2, "truncating multixact members segment %llx", + (unsigned long long) segment); SlruDeleteSegment(MultiXactMemberCtl, segment); /* move to next segment, handling wraparound correctly */ @@ -3049,14 +3202,14 @@ TruncateMultiXact(MultiXactId newOldestMulti, Oid newOldestMultiDB) } elog(DEBUG1, "performing multixact truncation: " - "offsets [%u, %u), offsets segments [%x, %x), " - "members [%u, %u), members segments [%x, %x)", + "offsets [%u, %u), offsets segments [%llx, %llx), " + "members [%u, %u), members segments [%llx, %llx)", oldestMulti, newOldestMulti, - MultiXactIdToOffsetSegment(oldestMulti), - MultiXactIdToOffsetSegment(newOldestMulti), + (unsigned long long) MultiXactIdToOffsetSegment(oldestMulti), + (unsigned long long) MultiXactIdToOffsetSegment(newOldestMulti), oldestOffset, newOldestOffset, - MXOffsetToMemberSegment(oldestOffset), - MXOffsetToMemberSegment(newOldestOffset)); + (unsigned long long) MXOffsetToMemberSegment(oldestOffset), + (unsigned long long) MXOffsetToMemberSegment(newOldestOffset)); /* * Do truncation, and the WAL logging of the truncation, in a critical @@ -3113,7 +3266,7 @@ TruncateMultiXact(MultiXactId newOldestMulti, Oid newOldestMultiDB) * translational symmetry. */ static bool -MultiXactOffsetPagePrecedes(int page1, int page2) +MultiXactOffsetPagePrecedes(int64 page1, int64 page2) { MultiXactId multi1; MultiXactId multi2; @@ -3133,7 +3286,7 @@ MultiXactOffsetPagePrecedes(int page1, int page2) * purposes. There is no "invalid offset number" so use the numbers verbatim. */ static bool -MultiXactMemberPagePrecedes(int page1, int page2) +MultiXactMemberPagePrecedes(int64 page1, int64 page2) { MultiXactOffset offset1; MultiXactOffset offset2; @@ -3191,10 +3344,10 @@ MultiXactOffsetPrecedes(MultiXactOffset offset1, MultiXactOffset offset2) * OFFSETs page (info shows which) */ static void -WriteMZeroPageXlogRec(int pageno, uint8 info) +WriteMZeroPageXlogRec(int64 pageno, uint8 info) { XLogBeginInsert(); - XLogRegisterData((char *) (&pageno), sizeof(int)); + XLogRegisterData((char *) (&pageno), sizeof(pageno)); (void) XLogInsert(RM_MULTIXACT_ID, info); } @@ -3239,33 +3392,37 @@ multixact_redo(XLogReaderState *record) if (info == XLOG_MULTIXACT_ZERO_OFF_PAGE) { - int pageno; + int64 pageno; int slotno; + LWLock *lock; - memcpy(&pageno, XLogRecGetData(record), sizeof(int)); + memcpy(&pageno, XLogRecGetData(record), sizeof(pageno)); - LWLockAcquire(MultiXactOffsetSLRULock, LW_EXCLUSIVE); + lock = SimpleLruGetBankLock(MultiXactOffsetCtl, pageno); + LWLockAcquire(lock, LW_EXCLUSIVE); slotno = ZeroMultiXactOffsetPage(pageno, false); SimpleLruWritePage(MultiXactOffsetCtl, slotno); Assert(!MultiXactOffsetCtl->shared->page_dirty[slotno]); - LWLockRelease(MultiXactOffsetSLRULock); + LWLockRelease(lock); } else if (info == XLOG_MULTIXACT_ZERO_MEM_PAGE) { - int pageno; + int64 pageno; int slotno; + LWLock *lock; - memcpy(&pageno, XLogRecGetData(record), sizeof(int)); + memcpy(&pageno, XLogRecGetData(record), sizeof(pageno)); - LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE); + lock = SimpleLruGetBankLock(MultiXactMemberCtl, pageno); + LWLockAcquire(lock, LW_EXCLUSIVE); slotno = ZeroMultiXactMemberPage(pageno, false); SimpleLruWritePage(MultiXactMemberCtl, slotno); Assert(!MultiXactMemberCtl->shared->page_dirty[slotno]); - LWLockRelease(MultiXactMemberSLRULock); + LWLockRelease(lock); } else if (info == XLOG_MULTIXACT_CREATE_ID) { @@ -3299,20 +3456,20 @@ multixact_redo(XLogReaderState *record) else if (info == XLOG_MULTIXACT_TRUNCATE_ID) { xl_multixact_truncate xlrec; - int pageno; + int64 pageno; memcpy(&xlrec, XLogRecGetData(record), SizeOfMultiXactTruncate); elog(DEBUG1, "replaying multixact truncation: " - "offsets [%u, %u), offsets segments [%x, %x), " - "members [%u, %u), members segments [%x, %x)", + "offsets [%u, %u), offsets segments [%llx, %llx), " + "members [%u, %u), members segments [%llx, %llx)", xlrec.startTruncOff, xlrec.endTruncOff, - MultiXactIdToOffsetSegment(xlrec.startTruncOff), - MultiXactIdToOffsetSegment(xlrec.endTruncOff), + (unsigned long long) MultiXactIdToOffsetSegment(xlrec.startTruncOff), + (unsigned long long) MultiXactIdToOffsetSegment(xlrec.endTruncOff), xlrec.startTruncMemb, xlrec.endTruncMemb, - MXOffsetToMemberSegment(xlrec.startTruncMemb), - MXOffsetToMemberSegment(xlrec.endTruncMemb)); + (unsigned long long) MXOffsetToMemberSegment(xlrec.startTruncMemb), + (unsigned long long) MXOffsetToMemberSegment(xlrec.endTruncMemb)); /* should not be required, but more than cheap enough */ LWLockAcquire(MultiXactTruncationLock, LW_EXCLUSIVE); @@ -3331,7 +3488,8 @@ multixact_redo(XLogReaderState *record) * SimpleLruTruncate. */ pageno = MultiXactIdToOffsetPage(xlrec.endTruncOff); - MultiXactOffsetCtl->shared->latest_page_number = pageno; + pg_atomic_write_u64(&MultiXactOffsetCtl->shared->latest_page_number, + pageno); PerformOffsetsTruncation(xlrec.startTruncOff, xlrec.endTruncOff); LWLockRelease(MultiXactTruncationLock); diff --git a/src/backend/access/transam/parallel.c b/src/backend/access/transam/parallel.c index 2b8bc2f58dd8e..d0ad0bd4280cd 100644 --- a/src/backend/access/transam/parallel.c +++ b/src/backend/access/transam/parallel.c @@ -3,7 +3,7 @@ * parallel.c * Infrastructure for launching parallel workers * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -14,6 +14,7 @@ #include "postgres.h" +#include "access/brin.h" #include "access/nbtree.h" #include "access/parallel.h" #include "access/session.h" @@ -34,7 +35,6 @@ #include "pgstat.h" #include "storage/ipc.h" #include "storage/predicate.h" -#include "storage/sinval.h" #include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/combocid.h" @@ -43,7 +43,6 @@ #include "utils/memutils.h" #include "utils/relmapper.h" #include "utils/snapmgr.h" -#include "utils/typcache.h" /* * We don't want to waste a lot of memory on an error queue which, most of @@ -84,15 +83,17 @@ typedef struct FixedParallelState /* Fixed-size state that workers must restore. */ Oid database_id; Oid authenticated_user_id; - Oid current_user_id; + Oid session_user_id; Oid outer_user_id; + Oid current_user_id; Oid temp_namespace_id; Oid temp_toast_namespace_id; int sec_context; - bool is_superuser; + bool session_user_is_superuser; + bool role_is_superuser; PGPROC *parallel_leader_pgproc; pid_t parallel_leader_pid; - BackendId parallel_leader_backend_id; + ProcNumber parallel_leader_proc_number; TimestampTz xact_ts; TimestampTz stmt_ts; SerializableXactHandle serializable_xact_handle; @@ -144,6 +145,9 @@ static const struct { "_bt_parallel_build_main", _bt_parallel_build_main }, + { + "_brin_parallel_build_main", _brin_parallel_build_main + }, { "parallel_vacuum_main", parallel_vacuum_main } @@ -228,6 +232,15 @@ InitializeParallelDSM(ParallelContext *pcxt) shm_toc_estimate_chunk(&pcxt->estimator, sizeof(FixedParallelState)); shm_toc_estimate_keys(&pcxt->estimator, 1); + /* + * If we manage to reach here while non-interruptible, it's unsafe to + * launch any workers: we would fail to process interrupts sent by them. + * We can deal with that edge case by pretending no workers were + * requested. + */ + if (!INTERRUPTS_CAN_BE_PROCESSED()) + pcxt->nworkers = 0; + /* * Normally, the user will have requested at least one worker process, but * if by chance they have not, we can skip a bunch of things here. @@ -325,14 +338,16 @@ InitializeParallelDSM(ParallelContext *pcxt) shm_toc_allocate(pcxt->toc, sizeof(FixedParallelState)); fps->database_id = MyDatabaseId; fps->authenticated_user_id = GetAuthenticatedUserId(); + fps->session_user_id = GetSessionUserId(); fps->outer_user_id = GetCurrentRoleId(); - fps->is_superuser = session_auth_is_superuser; GetUserIdAndSecContext(&fps->current_user_id, &fps->sec_context); + fps->session_user_is_superuser = GetSessionUserIsSuperuser(); + fps->role_is_superuser = current_role_is_superuser; GetTempNamespaceState(&fps->temp_namespace_id, &fps->temp_toast_namespace_id); fps->parallel_leader_pgproc = MyProc; fps->parallel_leader_pid = MyProcPid; - fps->parallel_leader_backend_id = MyBackendId; + fps->parallel_leader_proc_number = MyProcNumber; fps->xact_ts = GetCurrentTransactionStartTimestamp(); fps->stmt_ts = GetCurrentStatementStartTimestamp(); fps->serializable_xact_handle = ShareSerializableXact(); @@ -474,6 +489,9 @@ InitializeParallelDSM(ParallelContext *pcxt) shm_toc_insert(pcxt->toc, PARALLEL_KEY_ENTRYPOINT, entrypointstate); } + /* Update nworkers_to_launch, in case we changed nworkers above. */ + pcxt->nworkers_to_launch = pcxt->nworkers; + /* Restore previous memory context. */ MemoryContextSwitchTo(oldcontext); } @@ -537,10 +555,11 @@ ReinitializeParallelWorkers(ParallelContext *pcxt, int nworkers_to_launch) { /* * The number of workers that need to be launched must be less than the - * number of workers with which the parallel context is initialized. + * number of workers with which the parallel context is initialized. But + * the caller might not know that InitializeParallelDSM reduced nworkers, + * so just silently trim the request. */ - Assert(pcxt->nworkers >= nworkers_to_launch); - pcxt->nworkers_to_launch = nworkers_to_launch; + pcxt->nworkers_to_launch = Min(pcxt->nworkers, nworkers_to_launch); } /* @@ -1126,18 +1145,8 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg) switch (msgtype) { - case 'K': /* BackendKeyData */ - { - int32 pid = pq_getmsgint(msg, 4); - - (void) pq_getmsgint(msg, 4); /* discard cancel key */ - (void) pq_getmsgend(msg); - pcxt->worker[i].pid = pid; - break; - } - - case 'E': /* ErrorResponse */ - case 'N': /* NoticeResponse */ + case PqMsg_ErrorResponse: + case PqMsg_NoticeResponse: { ErrorData edata; ErrorContextCallback *save_error_context_stack; @@ -1182,7 +1191,7 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg) break; } - case 'A': /* NotifyResponse */ + case PqMsg_NotificationResponse: { /* Propagate NotifyResponse. */ int32 pid; @@ -1199,7 +1208,24 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg) break; } - case 'X': /* Terminate, indicating clean exit */ + case PqMsg_Progress: + { + /* + * Only incremental progress reporting is currently supported. + * However, it's possible to add more fields to the message to + * allow for handling of other backend progress APIs. + */ + int index = pq_getmsgint(msg, 4); + int64 incr = pq_getmsgint64(msg); + + pq_getmsgend(msg); + + pgstat_progress_incr_param(index, incr); + + break; + } + + case PqMsg_Terminate: { shm_mq_detach(pcxt->worker[i].error_mqh); pcxt->worker[i].error_mqh = NULL; @@ -1217,10 +1243,8 @@ HandleParallelMessage(ParallelContext *pcxt, int i, StringInfo msg) /* * End-of-subtransaction cleanup for parallel contexts. * - * Currently, it's forbidden to enter or leave a subtransaction while - * parallel mode is in effect, so we could just blow away everything. But - * we may want to relax that restriction in the future, so this code - * contemplates that there may be multiple subtransaction IDs in pcxt_list. + * Here we remove only parallel contexts initiated within the current + * subtransaction. */ void AtEOSubXact_Parallel(bool isCommit, SubTransactionId mySubId) @@ -1240,6 +1264,8 @@ AtEOSubXact_Parallel(bool isCommit, SubTransactionId mySubId) /* * End-of-transaction cleanup for parallel contexts. + * + * We nuke all remaining parallel contexts. */ void AtEOXact_Parallel(bool isCommit) @@ -1282,7 +1308,6 @@ ParallelWorkerMain(Datum main_arg) char *relmapperspace; char *uncommittedenumsspace; char *clientconninfospace; - StringInfoData msgbuf; char *session_dsm_handle_space; Snapshot tsnapshot; Snapshot asnapshot; @@ -1329,7 +1354,7 @@ ParallelWorkerMain(Datum main_arg) /* Arrange to signal the leader if we exit. */ ParallelLeaderPid = fps->parallel_leader_pid; - ParallelLeaderBackendId = fps->parallel_leader_backend_id; + ParallelLeaderProcNumber = fps->parallel_leader_proc_number; before_shmem_exit(ParallelWorkerShutdown, PointerGetDatum(seg)); /* @@ -1345,19 +1370,7 @@ ParallelWorkerMain(Datum main_arg) mqh = shm_mq_attach(mq, seg, NULL); pq_redirect_to_shm_mq(seg, mqh); pq_set_parallel_leader(fps->parallel_leader_pid, - fps->parallel_leader_backend_id); - - /* - * Send a BackendKeyData message to the process that initiated parallelism - * so that it has access to our PID before it receives any other messages - * from us. Our cancel key is sent, too, since that's the way the - * protocol message is defined, but it won't actually be used for anything - * in this case. - */ - pq_beginmessage(&msgbuf, 'K'); - pq_sendint32(&msgbuf, (int32) MyProcPid); - pq_sendint32(&msgbuf, (int32) MyCancelKey); - pq_endmessage(&msgbuf); + fps->parallel_leader_proc_number); /* * Hooray! Primary initialization is complete. Now, we need to set up our @@ -1395,10 +1408,27 @@ ParallelWorkerMain(Datum main_arg) entrypt = LookupParallelWorkerFunction(library_name, function_name); - /* Restore database connection. */ + /* + * Restore current session authorization and role id. No verification + * happens here, we just blindly adopt the leader's state. Note that this + * has to happen before InitPostgres, since InitializeSessionUserId will + * not set these variables. + */ + SetAuthenticatedUserId(fps->authenticated_user_id); + SetSessionAuthorization(fps->session_user_id, + fps->session_user_is_superuser); + SetCurrentRoleId(fps->outer_user_id, fps->role_is_superuser); + + /* + * Restore database connection. We skip connection authorization checks, + * reasoning that (a) the leader checked these things when it started, and + * (b) we do not want parallel mode to cause these failures, because that + * would make use of parallel query plans not transparent to applications. + */ BackgroundWorkerInitializeConnectionByOid(fps->database_id, fps->authenticated_user_id, - 0); + BGWORKER_BYPASS_ALLOWCONN | + BGWORKER_BYPASS_ROLELOGINCHECK); /* * Set the client encoding to the database encoding, since that is what @@ -1460,13 +1490,13 @@ ParallelWorkerMain(Datum main_arg) InvalidateSystemCaches(); /* - * Restore current role id. Skip verifying whether session user is - * allowed to become this role and blindly restore the leader's state for - * current role. + * Restore current user ID and security context. No verification happens + * here, we just blindly adopt the leader's state. We can't do this till + * after restoring GUCs, else we'll get complaints about restoring + * session_authorization and role. (In effect, we're assuming that all + * the restored values are okay to set, even if we are now inside a + * restricted context.) */ - SetCurrentRoleId(fps->outer_user_id, fps->is_superuser); - - /* Restore user ID and security context. */ SetUserIdAndSecContext(fps->current_user_id, fps->sec_context); /* Restore temp-namespace state to ensure search path matches leader's. */ @@ -1532,7 +1562,7 @@ ParallelWorkerMain(Datum main_arg) DetachSession(); /* Report success. */ - pq_putmessage('X', NULL, 0); + pq_putmessage(PqMsg_Terminate, NULL, 0); } /* @@ -1572,7 +1602,7 @@ ParallelWorkerShutdown(int code, Datum arg) { SendProcSignal(ParallelLeaderPid, PROCSIG_PARALLEL_MESSAGE, - ParallelLeaderBackendId); + ParallelLeaderProcNumber); dsm_detach((dsm_segment *) DatumGetPointer(arg)); } diff --git a/src/backend/access/transam/rmgr.c b/src/backend/access/transam/rmgr.c index 7d67eda5f79cc..1b7499726eb02 100644 --- a/src/backend/access/transam/rmgr.c +++ b/src/backend/access/transam/rmgr.c @@ -7,6 +7,18 @@ */ #include "postgres.h" +#include "access/rmgr.h" +#include "access/xlog_internal.h" +#include "fmgr.h" +#include "funcapi.h" +#include "miscadmin.h" +#include "nodes/execnodes.h" +#include "utils/builtins.h" +#include "utils/fmgrprotos.h" +#include "utils/tuplestore.h" + +/* includes needed for "access/rmgrlist.h" */ +/* IWYU pragma: begin_keep */ #include "access/brin_xlog.h" #include "access/clog.h" #include "access/commit_ts.h" @@ -19,20 +31,17 @@ #include "access/nbtxlog.h" #include "access/spgxlog.h" #include "access/xact.h" -#include "access/xlog_internal.h" #include "catalog/storage_xlog.h" #include "commands/dbcommands_xlog.h" #include "commands/sequence.h" #include "commands/tablespace.h" -#include "fmgr.h" -#include "funcapi.h" -#include "miscadmin.h" #include "replication/decode.h" #include "replication/message.h" #include "replication/origin.h" #include "storage/standby.h" -#include "utils/builtins.h" #include "utils/relmapper.h" +/* IWYU pragma: end_keep */ + /* must be kept in sync with RmgrData definition in xlog_internal.h */ #define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup,mask,decode) \ @@ -82,7 +91,7 @@ void RmgrNotFound(RmgrId rmid) { ereport(ERROR, (errmsg("resource manager with ID %d not registered", rmid), - errhint("Include the extension module that implements this resource manager in shared_preload_libraries."))); + errhint("Include the extension module that implements this resource manager in \"shared_preload_libraries\"."))); } /* @@ -109,7 +118,7 @@ RegisterCustomRmgr(RmgrId rmid, const RmgrData *rmgr) if (!process_shared_preload_libraries_in_progress) ereport(ERROR, (errmsg("failed to register custom resource manager \"%s\" with ID %d", rmgr->rm_name, rmid), - errdetail("Custom resource manager must be registered while initializing modules in shared_preload_libraries."))); + errdetail("Custom resource manager must be registered while initializing modules in \"shared_preload_libraries\"."))); if (RmgrTable[rmid].rm_name != NULL) ereport(ERROR, diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c index 71ac70fb40c5d..afedb5c039f16 100644 --- a/src/backend/access/transam/slru.c +++ b/src/backend/access/transam/slru.c @@ -1,27 +1,38 @@ /*------------------------------------------------------------------------- * * slru.c - * Simple LRU buffering for transaction status logfiles + * Simple LRU buffering for wrap-around-able permanent metadata * - * We use a simple least-recently-used scheme to manage a pool of page - * buffers. Under ordinary circumstances we expect that write - * traffic will occur mostly to the latest page (and to the just-prior - * page, soon after a page transition). Read traffic will probably touch - * a larger span of pages, but in any case a fairly small number of page - * buffers should be sufficient. So, we just search the buffers using plain - * linear search; there's no need for a hashtable or anything fancy. - * The management algorithm is straight LRU except that we will never swap - * out the latest page (since we know it's going to be hit again eventually). + * This module is used to maintain various pieces of transaction status + * indexed by TransactionId (such as commit status, parent transaction ID, + * commit timestamp), as well as storage for multixacts, serializable + * isolation locks and NOTIFY traffic. Extensions can define their own + * SLRUs, too. * - * We use a control LWLock to protect the shared data structures, plus - * per-buffer LWLocks that synchronize I/O for each buffer. The control lock - * must be held to examine or modify any shared state. A process that is - * reading in or writing out a page buffer does not hold the control lock, - * only the per-buffer lock for the buffer it is working on. + * Under ordinary circumstances we expect that write traffic will occur + * mostly to the latest page (and to the just-prior page, soon after a + * page transition). Read traffic will probably touch a larger span of + * pages, but a relatively small number of buffers should be sufficient. * - * "Holding the control lock" means exclusive lock in all cases except for - * SimpleLruReadPage_ReadOnly(); see comments for SlruRecentlyUsed() for - * the implications of that. + * We use a simple least-recently-used scheme to manage a pool of shared + * page buffers, split in banks by the lowest bits of the page number, and + * the management algorithm only processes the bank to which the desired + * page belongs, so a linear search is sufficient; there's no need for a + * hashtable or anything fancy. The algorithm is straight LRU except that + * we will never swap out the latest page (since we know it's going to be + * hit again eventually). + * + * We use per-bank control LWLocks to protect the shared data structures, + * plus per-buffer LWLocks that synchronize I/O for each buffer. The + * bank's control lock must be held to examine or modify any of the bank's + * shared state. A process that is reading in or writing out a page + * buffer does not hold the control lock, only the per-buffer lock for the + * buffer it is working on. One exception is latest_page_number, which is + * read and written using atomic ops. + * + * "Holding the bank control lock" means exclusive lock in all cases + * except for SimpleLruReadPage_ReadOnly(); see comments for + * SlruRecentlyUsed() for the implications of that. * * When initiating I/O on a buffer, we acquire the per-buffer lock exclusively * before releasing the control lock. The per-buffer lock is released after @@ -38,7 +49,7 @@ * by re-setting the page's page_dirty flag. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/slru.c @@ -59,9 +70,50 @@ #include "pgstat.h" #include "storage/fd.h" #include "storage/shmem.h" +#include "utils/guc_hooks.h" -#define SlruFileName(ctl, path, seg) \ - snprintf(path, MAXPGPATH, "%s/%04X", (ctl)->Dir, seg) +/* + * Converts segment number to the filename of the segment. + * + * "path" should point to a buffer at least MAXPGPATH characters long. + * + * If ctl->long_segment_names is true, segno can be in the range [0, 2^60-1]. + * The resulting file name is made of 15 characters, e.g. dir/123456789ABCDEF. + * + * If ctl->long_segment_names is false, segno can be in the range [0, 2^24-1]. + * The resulting file name is made of 4 to 6 characters, as of: + * + * dir/1234 for [0, 2^16-1] + * dir/12345 for [2^16, 2^20-1] + * dir/123456 for [2^20, 2^24-1] + */ +static inline int +SlruFileName(SlruCtl ctl, char *path, int64 segno) +{ + if (ctl->long_segment_names) + { + /* + * We could use 16 characters here but the disadvantage would be that + * the SLRU segments will be hard to distinguish from WAL segments. + * + * For this reason we use 15 characters. It is enough but also means + * that in the future we can't decrease SLRU_PAGES_PER_SEGMENT easily. + */ + Assert(segno >= 0 && segno <= INT64CONST(0xFFFFFFFFFFFFFFF)); + return snprintf(path, MAXPGPATH, "%s/%015llX", ctl->Dir, + (long long) segno); + } + else + { + /* + * Despite the fact that %04X format string is used up to 24 bit + * integers are allowed. See SlruCorrectSegmentFilenameLength() + */ + Assert(segno >= 0 && segno <= INT64CONST(0xFFFFFF)); + return snprintf(path, MAXPGPATH, "%s/%04X", (ctl)->Dir, + (unsigned int) segno); + } +} /* * During SimpleLruWriteAll(), we will usually not need to write more than one @@ -75,11 +127,28 @@ typedef struct SlruWriteAllData { int num_files; /* # files actually open */ int fd[MAX_WRITEALL_BUFFERS]; /* their FD's */ - int segno[MAX_WRITEALL_BUFFERS]; /* their log seg#s */ + int64 segno[MAX_WRITEALL_BUFFERS]; /* their log seg#s */ } SlruWriteAllData; typedef struct SlruWriteAllData *SlruWriteAll; + +/* + * Bank size for the slot array. Pages are assigned a bank according to their + * page number, with each bank being this size. We want a power of 2 so that + * we can determine the bank number for a page with just bit shifting; we also + * want to keep the bank size small so that LRU victim search is fast. 16 + * buffers per bank seems a good number. + */ +#define SLRU_BANK_BITSHIFT 4 +#define SLRU_BANK_SIZE (1 << SLRU_BANK_BITSHIFT) + +/* + * Macro to get the bank number to which the slot belongs. + */ +#define SlotGetBankNumber(slotno) ((slotno) >> SLRU_BANK_BITSHIFT) + + /* * Populate a file tag describing a segment file. We only use the segment * number, since we can derive everything else we need by having separate @@ -92,34 +161,6 @@ typedef struct SlruWriteAllData *SlruWriteAll; (a).segno = (xx_segno) \ ) -/* - * Macro to mark a buffer slot "most recently used". Note multiple evaluation - * of arguments! - * - * The reason for the if-test is that there are often many consecutive - * accesses to the same page (particularly the latest page). By suppressing - * useless increments of cur_lru_count, we reduce the probability that old - * pages' counts will "wrap around" and make them appear recently used. - * - * We allow this code to be executed concurrently by multiple processes within - * SimpleLruReadPage_ReadOnly(). As long as int reads and writes are atomic, - * this should not cause any completely-bogus values to enter the computation. - * However, it is possible for either cur_lru_count or individual - * page_lru_count entries to be "reset" to lower values than they should have, - * in case a process is delayed while it executes this macro. With care in - * SlruSelectLRUPage(), this does little harm, and in any case the absolute - * worst possible consequence is a nonoptimal choice of page to evict. The - * gain from allowing concurrent reads of SLRU pages seems worth it. - */ -#define SlruRecentlyUsed(shared, slotno) \ - do { \ - int new_lru_count = (shared)->cur_lru_count; \ - if (new_lru_count != (shared)->page_lru_count[slotno]) { \ - (shared)->cur_lru_count = ++new_lru_count; \ - (shared)->page_lru_count[slotno] = new_lru_count; \ - } \ - } while (0) - /* Saved info for SlruReportIOError */ typedef enum { @@ -128,7 +169,7 @@ typedef enum SLRU_READ_FAILED, SLRU_WRITE_FAILED, SLRU_FSYNC_FAILED, - SLRU_CLOSE_FAILED + SLRU_CLOSE_FAILED, } SlruErrorCause; static SlruErrorCause slru_errcause; @@ -138,15 +179,17 @@ static int slru_errno; static void SimpleLruZeroLSNs(SlruCtl ctl, int slotno); static void SimpleLruWaitIO(SlruCtl ctl, int slotno); static void SlruInternalWritePage(SlruCtl ctl, int slotno, SlruWriteAll fdata); -static bool SlruPhysicalReadPage(SlruCtl ctl, int pageno, int slotno); -static bool SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno, +static bool SlruPhysicalReadPage(SlruCtl ctl, int64 pageno, int slotno); +static bool SlruPhysicalWritePage(SlruCtl ctl, int64 pageno, int slotno, SlruWriteAll fdata); -static void SlruReportIOError(SlruCtl ctl, int pageno, TransactionId xid); -static int SlruSelectLRUPage(SlruCtl ctl, int pageno); +static void SlruReportIOError(SlruCtl ctl, int64 pageno, TransactionId xid); +static int SlruSelectLRUPage(SlruCtl ctl, int64 pageno); static bool SlruScanDirCbDeleteCutoff(SlruCtl ctl, char *filename, - int segpage, void *data); -static void SlruInternalDeleteSegment(SlruCtl ctl, int segno); + int64 segpage, void *data); +static void SlruInternalDeleteSegment(SlruCtl ctl, int64 segno); +static inline void SlruRecentlyUsed(SlruShared shared, int slotno); + /* * Initialization of shared memory @@ -155,16 +198,22 @@ static void SlruInternalDeleteSegment(SlruCtl ctl, int segno); Size SimpleLruShmemSize(int nslots, int nlsns) { + int nbanks = nslots / SLRU_BANK_SIZE; Size sz; + Assert(nslots <= SLRU_MAX_ALLOWED_BUFFERS); + Assert(nslots % SLRU_BANK_SIZE == 0); + /* we assume nslots isn't so large as to risk overflow */ sz = MAXALIGN(sizeof(SlruSharedData)); sz += MAXALIGN(nslots * sizeof(char *)); /* page_buffer[] */ sz += MAXALIGN(nslots * sizeof(SlruPageStatus)); /* page_status[] */ sz += MAXALIGN(nslots * sizeof(bool)); /* page_dirty[] */ - sz += MAXALIGN(nslots * sizeof(int)); /* page_number[] */ + sz += MAXALIGN(nslots * sizeof(int64)); /* page_number[] */ sz += MAXALIGN(nslots * sizeof(int)); /* page_lru_count[] */ sz += MAXALIGN(nslots * sizeof(LWLockPadded)); /* buffer_locks[] */ + sz += MAXALIGN(nbanks * sizeof(LWLockPadded)); /* bank_locks[] */ + sz += MAXALIGN(nbanks * sizeof(int)); /* bank_cur_lru_count[] */ if (nlsns > 0) sz += MAXALIGN(nslots * nlsns * sizeof(XLogRecPtr)); /* group_lsn[] */ @@ -172,6 +221,21 @@ SimpleLruShmemSize(int nslots, int nlsns) return BUFFERALIGN(sz) + BLCKSZ * nslots; } +/* + * Determine a number of SLRU buffers to use. + * + * We simply divide shared_buffers by the divisor given and cap + * that at the maximum given; but always at least SLRU_BANK_SIZE. + * Round down to the nearest multiple of SLRU_BANK_SIZE. + */ +int +SimpleLruAutotuneBuffers(int divisor, int max) +{ + return Min(max - (max % SLRU_BANK_SIZE), + Max(SLRU_BANK_SIZE, + NBuffers / divisor - (NBuffers / divisor) % SLRU_BANK_SIZE)); +} + /* * Initialize, or attach to, a simple LRU cache in shared memory. * @@ -179,18 +243,21 @@ SimpleLruShmemSize(int nslots, int nlsns) * name: name of SLRU. (This is user-visible, pick with care!) * nslots: number of page slots to use. * nlsns: number of LSN groups per page (set to zero if not relevant). - * ctllock: LWLock to use to control access to the shared control structure. * subdir: PGDATA-relative subdirectory that will contain the files. - * tranche_id: LWLock tranche ID to use for the SLRU's per-buffer LWLocks. + * buffer_tranche_id: tranche ID to use for the SLRU's per-buffer LWLocks. + * bank_tranche_id: tranche ID to use for the bank LWLocks. * sync_handler: which set of functions to use to handle sync requests */ void SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, - LWLock *ctllock, const char *subdir, int tranche_id, - SyncRequestHandler sync_handler) + const char *subdir, int buffer_tranche_id, int bank_tranche_id, + SyncRequestHandler sync_handler, bool long_segment_names) { SlruShared shared; bool found; + int nbanks = nslots / SLRU_BANK_SIZE; + + Assert(nslots <= SLRU_MAX_ALLOWED_BUFFERS); shared = (SlruShared) ShmemInitStruct(name, SimpleLruShmemSize(nslots, nlsns), @@ -201,20 +268,15 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, /* Initialize locks and shared memory area */ char *ptr; Size offset; - int slotno; Assert(!found); memset(shared, 0, sizeof(SlruSharedData)); - shared->ControlLock = ctllock; - shared->num_slots = nslots; shared->lsn_groups_per_page = nlsns; - shared->cur_lru_count = 0; - - /* shared->latest_page_number will be set later */ + pg_atomic_init_u64(&shared->latest_page_number, 0); shared->slru_stats_idx = pgstat_get_slru_index(name); @@ -226,14 +288,18 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, offset += MAXALIGN(nslots * sizeof(SlruPageStatus)); shared->page_dirty = (bool *) (ptr + offset); offset += MAXALIGN(nslots * sizeof(bool)); - shared->page_number = (int *) (ptr + offset); - offset += MAXALIGN(nslots * sizeof(int)); + shared->page_number = (int64 *) (ptr + offset); + offset += MAXALIGN(nslots * sizeof(int64)); shared->page_lru_count = (int *) (ptr + offset); offset += MAXALIGN(nslots * sizeof(int)); /* Initialize LWLocks */ shared->buffer_locks = (LWLockPadded *) (ptr + offset); offset += MAXALIGN(nslots * sizeof(LWLockPadded)); + shared->bank_locks = (LWLockPadded *) (ptr + offset); + offset += MAXALIGN(nbanks * sizeof(LWLockPadded)); + shared->bank_cur_lru_count = (int *) (ptr + offset); + offset += MAXALIGN(nbanks * sizeof(int)); if (nlsns > 0) { @@ -242,10 +308,10 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, } ptr += BUFFERALIGN(offset); - for (slotno = 0; slotno < nslots; slotno++) + for (int slotno = 0; slotno < nslots; slotno++) { LWLockInitialize(&shared->buffer_locks[slotno].lock, - tranche_id); + buffer_tranche_id); shared->page_buffer[slotno] = ptr; shared->page_status[slotno] = SLRU_PAGE_EMPTY; @@ -254,11 +320,21 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, ptr += BLCKSZ; } + /* Initialize the slot banks. */ + for (int bankno = 0; bankno < nbanks; bankno++) + { + LWLockInitialize(&shared->bank_locks[bankno].lock, bank_tranche_id); + shared->bank_cur_lru_count[bankno] = 0; + } + /* Should fit to estimated shmem size */ Assert(ptr - (char *) shared <= SimpleLruShmemSize(nslots, nlsns)); } else + { Assert(found); + Assert(shared->num_slots == nslots); + } /* * Initialize the unshared control struct, including directory path. We @@ -266,23 +342,43 @@ SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, */ ctl->shared = shared; ctl->sync_handler = sync_handler; + ctl->long_segment_names = long_segment_names; + ctl->nbanks = nbanks; strlcpy(ctl->Dir, subdir, sizeof(ctl->Dir)); } +/* + * Helper function for GUC check_hook to check whether slru buffers are in + * multiples of SLRU_BANK_SIZE. + */ +bool +check_slru_buffers(const char *name, int *newval) +{ + /* Valid values are multiples of SLRU_BANK_SIZE */ + if (*newval % SLRU_BANK_SIZE == 0) + return true; + + GUC_check_errdetail("\"%s\" must be a multiple of %d", name, + SLRU_BANK_SIZE); + return false; +} + /* * Initialize (or reinitialize) a page to zeroes. * * The page is not actually written, just set up in shared memory. * The slot number of the new page is returned. * - * Control lock must be held at entry, and will be held at exit. + * Bank lock must be held at entry, and will be held at exit. */ int -SimpleLruZeroPage(SlruCtl ctl, int pageno) +SimpleLruZeroPage(SlruCtl ctl, int64 pageno) { SlruShared shared = ctl->shared; int slotno; + Assert(LWLockHeldByMeInMode(SimpleLruGetBankLock(ctl, pageno), LW_EXCLUSIVE)); + /* Find a suitable buffer slot for the page */ slotno = SlruSelectLRUPage(ctl, pageno); Assert(shared->page_status[slotno] == SLRU_PAGE_EMPTY || @@ -302,8 +398,15 @@ SimpleLruZeroPage(SlruCtl ctl, int pageno) /* Set the LSNs for this new page to zero */ SimpleLruZeroLSNs(ctl, slotno); - /* Assume this page is now the latest active page */ - shared->latest_page_number = pageno; + /* + * Assume this page is now the latest active page. + * + * Note that because both this routine and SlruSelectLRUPage run with + * ControlLock held, it is not possible for this to be zeroing a page that + * SlruSelectLRUPage is going to evict simultaneously. Therefore, there's + * no memory barrier here. + */ + pg_atomic_write_u64(&shared->latest_page_number, pageno); /* update the stats counter of zeroed pages */ pgstat_count_slru_page_zeroed(shared->slru_stats_idx); @@ -336,18 +439,21 @@ SimpleLruZeroLSNs(SlruCtl ctl, int slotno) * guarantee that new I/O hasn't been started before we return, though. * In fact the slot might not even contain the same page anymore.) * - * Control lock must be held at entry, and will be held at exit. + * Bank lock must be held at entry, and will be held at exit. */ static void SimpleLruWaitIO(SlruCtl ctl, int slotno) { SlruShared shared = ctl->shared; + int bankno = SlotGetBankNumber(slotno); + + Assert(shared->page_status[slotno] != SLRU_PAGE_EMPTY); /* See notes at top of file */ - LWLockRelease(shared->ControlLock); + LWLockRelease(&shared->bank_locks[bankno].lock); LWLockAcquire(&shared->buffer_locks[slotno].lock, LW_SHARED); LWLockRelease(&shared->buffer_locks[slotno].lock); - LWLockAcquire(shared->ControlLock, LW_EXCLUSIVE); + LWLockAcquire(&shared->bank_locks[bankno].lock, LW_EXCLUSIVE); /* * If the slot is still in an io-in-progress state, then either someone @@ -390,13 +496,16 @@ SimpleLruWaitIO(SlruCtl ctl, int slotno) * Return value is the shared-buffer slot number now holding the page. * The buffer's LRU access info is updated. * - * Control lock must be held at entry, and will be held at exit. + * The correct bank lock must be held at entry, and will be held at exit. */ int -SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok, +SimpleLruReadPage(SlruCtl ctl, int64 pageno, bool write_ok, TransactionId xid) { SlruShared shared = ctl->shared; + LWLock *banklock = SimpleLruGetBankLock(ctl, pageno); + + Assert(LWLockHeldByMeInMode(banklock, LW_EXCLUSIVE)); /* Outer loop handles restart if we must wait for someone else's I/O */ for (;;) @@ -408,8 +517,8 @@ SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok, slotno = SlruSelectLRUPage(ctl, pageno); /* Did we find the page in memory? */ - if (shared->page_number[slotno] == pageno && - shared->page_status[slotno] != SLRU_PAGE_EMPTY) + if (shared->page_status[slotno] != SLRU_PAGE_EMPTY && + shared->page_number[slotno] == pageno) { /* * If page is still being read in, we must wait for I/O. Likewise @@ -445,8 +554,8 @@ SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok, /* Acquire per-buffer lock (cannot deadlock, see notes at top) */ LWLockAcquire(&shared->buffer_locks[slotno].lock, LW_EXCLUSIVE); - /* Release control lock while doing I/O */ - LWLockRelease(shared->ControlLock); + /* Release bank lock while doing I/O */ + LWLockRelease(banklock); /* Do the read */ ok = SlruPhysicalReadPage(ctl, pageno, slotno); @@ -454,8 +563,8 @@ SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok, /* Set the LSNs for this newly read-in page to zero */ SimpleLruZeroLSNs(ctl, slotno); - /* Re-acquire control lock and update page state */ - LWLockAcquire(shared->ControlLock, LW_EXCLUSIVE); + /* Re-acquire bank control lock and update page state */ + LWLockAcquire(banklock, LW_EXCLUSIVE); Assert(shared->page_number[slotno] == pageno && shared->page_status[slotno] == SLRU_PAGE_READ_IN_PROGRESS && @@ -489,23 +598,26 @@ SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok, * Return value is the shared-buffer slot number now holding the page. * The buffer's LRU access info is updated. * - * Control lock must NOT be held at entry, but will be held at exit. + * Bank control lock must NOT be held at entry, but will be held at exit. * It is unspecified whether the lock will be shared or exclusive. */ int -SimpleLruReadPage_ReadOnly(SlruCtl ctl, int pageno, TransactionId xid) +SimpleLruReadPage_ReadOnly(SlruCtl ctl, int64 pageno, TransactionId xid) { SlruShared shared = ctl->shared; - int slotno; + LWLock *banklock = SimpleLruGetBankLock(ctl, pageno); + int bankno = pageno % ctl->nbanks; + int bankstart = bankno * SLRU_BANK_SIZE; + int bankend = bankstart + SLRU_BANK_SIZE; /* Try to find the page while holding only shared lock */ - LWLockAcquire(shared->ControlLock, LW_SHARED); + LWLockAcquire(banklock, LW_SHARED); /* See if page is already in a buffer */ - for (slotno = 0; slotno < shared->num_slots; slotno++) + for (int slotno = bankstart; slotno < bankend; slotno++) { - if (shared->page_number[slotno] == pageno && - shared->page_status[slotno] != SLRU_PAGE_EMPTY && + if (shared->page_status[slotno] != SLRU_PAGE_EMPTY && + shared->page_number[slotno] == pageno && shared->page_status[slotno] != SLRU_PAGE_READ_IN_PROGRESS) { /* See comments for SlruRecentlyUsed macro */ @@ -519,8 +631,8 @@ SimpleLruReadPage_ReadOnly(SlruCtl ctl, int pageno, TransactionId xid) } /* No luck, so switch to normal exclusive lock and do regular read */ - LWLockRelease(shared->ControlLock); - LWLockAcquire(shared->ControlLock, LW_EXCLUSIVE); + LWLockRelease(banklock); + LWLockAcquire(banklock, LW_EXCLUSIVE); return SimpleLruReadPage(ctl, pageno, true, xid); } @@ -534,15 +646,19 @@ SimpleLruReadPage_ReadOnly(SlruCtl ctl, int pageno, TransactionId xid) * the write). However, we *do* attempt a fresh write even if the page * is already being written; this is for checkpoints. * - * Control lock must be held at entry, and will be held at exit. + * Bank lock must be held at entry, and will be held at exit. */ static void SlruInternalWritePage(SlruCtl ctl, int slotno, SlruWriteAll fdata) { SlruShared shared = ctl->shared; - int pageno = shared->page_number[slotno]; + int64 pageno = shared->page_number[slotno]; + int bankno = SlotGetBankNumber(slotno); bool ok; + Assert(shared->page_status[slotno] != SLRU_PAGE_EMPTY); + Assert(LWLockHeldByMeInMode(SimpleLruGetBankLock(ctl, pageno), LW_EXCLUSIVE)); + /* If a write is in progress, wait for it to finish */ while (shared->page_status[slotno] == SLRU_PAGE_WRITE_IN_PROGRESS && shared->page_number[slotno] == pageno) @@ -569,8 +685,8 @@ SlruInternalWritePage(SlruCtl ctl, int slotno, SlruWriteAll fdata) /* Acquire per-buffer lock (cannot deadlock, see notes at top) */ LWLockAcquire(&shared->buffer_locks[slotno].lock, LW_EXCLUSIVE); - /* Release control lock while doing I/O */ - LWLockRelease(shared->ControlLock); + /* Release bank lock while doing I/O */ + LWLockRelease(&shared->bank_locks[bankno].lock); /* Do the write */ ok = SlruPhysicalWritePage(ctl, pageno, slotno, fdata); @@ -578,14 +694,12 @@ SlruInternalWritePage(SlruCtl ctl, int slotno, SlruWriteAll fdata) /* If we failed, and we're in a flush, better close the files */ if (!ok && fdata) { - int i; - - for (i = 0; i < fdata->num_files; i++) + for (int i = 0; i < fdata->num_files; i++) CloseTransientFile(fdata->fd[i]); } - /* Re-acquire control lock and update page state */ - LWLockAcquire(shared->ControlLock, LW_EXCLUSIVE); + /* Re-acquire bank lock and update page state */ + LWLockAcquire(&shared->bank_locks[bankno].lock, LW_EXCLUSIVE); Assert(shared->page_number[slotno] == pageno && shared->page_status[slotno] == SLRU_PAGE_WRITE_IN_PROGRESS); @@ -614,6 +728,8 @@ SlruInternalWritePage(SlruCtl ctl, int slotno, SlruWriteAll fdata) void SimpleLruWritePage(SlruCtl ctl, int slotno) { + Assert(ctl->shared->page_status[slotno] != SLRU_PAGE_EMPTY); + SlruInternalWritePage(ctl, slotno, NULL); } @@ -624,9 +740,9 @@ SimpleLruWritePage(SlruCtl ctl, int slotno) * large enough to contain the given page. */ bool -SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int pageno) +SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int64 pageno) { - int segno = pageno / SLRU_PAGES_PER_SEGMENT; + int64 segno = pageno / SLRU_PAGES_PER_SEGMENT; int rpageno = pageno % SLRU_PAGES_PER_SEGMENT; int offset = rpageno * BLCKSZ; char path[MAXPGPATH]; @@ -682,10 +798,10 @@ SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int pageno) * read/write operations. We could cache one virtual file pointer ... */ static bool -SlruPhysicalReadPage(SlruCtl ctl, int pageno, int slotno) +SlruPhysicalReadPage(SlruCtl ctl, int64 pageno, int slotno) { SlruShared shared = ctl->shared; - int segno = pageno / SLRU_PAGES_PER_SEGMENT; + int64 segno = pageno / SLRU_PAGES_PER_SEGMENT; int rpageno = pageno % SLRU_PAGES_PER_SEGMENT; off_t offset = rpageno * BLCKSZ; char path[MAXPGPATH]; @@ -754,10 +870,10 @@ SlruPhysicalReadPage(SlruCtl ctl, int pageno, int slotno) * SimpleLruWriteAll. */ static bool -SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno, SlruWriteAll fdata) +SlruPhysicalWritePage(SlruCtl ctl, int64 pageno, int slotno, SlruWriteAll fdata) { SlruShared shared = ctl->shared; - int segno = pageno / SLRU_PAGES_PER_SEGMENT; + int64 segno = pageno / SLRU_PAGES_PER_SEGMENT; int rpageno = pageno % SLRU_PAGES_PER_SEGMENT; off_t offset = rpageno * BLCKSZ; char path[MAXPGPATH]; @@ -781,12 +897,11 @@ SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno, SlruWriteAll fdata) * transaction-commit path). */ XLogRecPtr max_lsn; - int lsnindex, - lsnoff; + int lsnindex; lsnindex = slotno * shared->lsn_groups_per_page; max_lsn = shared->group_lsn[lsnindex++]; - for (lsnoff = 1; lsnoff < shared->lsn_groups_per_page; lsnoff++) + for (int lsnoff = 1; lsnoff < shared->lsn_groups_per_page; lsnoff++) { XLogRecPtr this_lsn = shared->group_lsn[lsnindex++]; @@ -813,9 +928,7 @@ SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno, SlruWriteAll fdata) */ if (fdata) { - int i; - - for (i = 0; i < fdata->num_files; i++) + for (int i = 0; i < fdata->num_files; i++) { if (fdata->segno[i] == segno) { @@ -929,9 +1042,9 @@ SlruPhysicalWritePage(SlruCtl ctl, int pageno, int slotno, SlruWriteAll fdata) * SlruPhysicalWritePage. Call this after cleaning up shared-memory state. */ static void -SlruReportIOError(SlruCtl ctl, int pageno, TransactionId xid) +SlruReportIOError(SlruCtl ctl, int64 pageno, TransactionId xid) { - int segno = pageno / SLRU_PAGES_PER_SEGMENT; + int64 segno = pageno / SLRU_PAGES_PER_SEGMENT; int rpageno = pageno % SLRU_PAGES_PER_SEGMENT; int offset = rpageno * BLCKSZ; char path[MAXPGPATH]; @@ -1001,40 +1114,80 @@ SlruReportIOError(SlruCtl ctl, int pageno, TransactionId xid) } /* - * Select the slot to re-use when we need a free slot. + * Mark a buffer slot "most recently used". + */ +static inline void +SlruRecentlyUsed(SlruShared shared, int slotno) +{ + int bankno = SlotGetBankNumber(slotno); + int new_lru_count = shared->bank_cur_lru_count[bankno]; + + Assert(shared->page_status[slotno] != SLRU_PAGE_EMPTY); + + /* + * The reason for the if-test is that there are often many consecutive + * accesses to the same page (particularly the latest page). By + * suppressing useless increments of bank_cur_lru_count, we reduce the + * probability that old pages' counts will "wrap around" and make them + * appear recently used. + * + * We allow this code to be executed concurrently by multiple processes + * within SimpleLruReadPage_ReadOnly(). As long as int reads and writes + * are atomic, this should not cause any completely-bogus values to enter + * the computation. However, it is possible for either bank_cur_lru_count + * or individual page_lru_count entries to be "reset" to lower values than + * they should have, in case a process is delayed while it executes this + * function. With care in SlruSelectLRUPage(), this does little harm, and + * in any case the absolute worst possible consequence is a nonoptimal + * choice of page to evict. The gain from allowing concurrent reads of + * SLRU pages seems worth it. + */ + if (new_lru_count != shared->page_lru_count[slotno]) + { + shared->bank_cur_lru_count[bankno] = ++new_lru_count; + shared->page_lru_count[slotno] = new_lru_count; + } +} + +/* + * Select the slot to re-use when we need a free slot for the given page. * - * The target page number is passed because we need to consider the - * possibility that some other process reads in the target page while - * we are doing I/O to free a slot. Hence, check or recheck to see if - * any slot already holds the target page, and return that slot if so. - * Thus, the returned slot is *either* a slot already holding the pageno - * (could be any state except EMPTY), *or* a freeable slot (state EMPTY - * or CLEAN). + * The target page number is passed not only because we need to know the + * correct bank to use, but also because we need to consider the possibility + * that some other process reads in the target page while we are doing I/O to + * free a slot. Hence, check or recheck to see if any slot already holds the + * target page, and return that slot if so. Thus, the returned slot is + * *either* a slot already holding the pageno (could be any state except + * EMPTY), *or* a freeable slot (state EMPTY or CLEAN). * - * Control lock must be held at entry, and will be held at exit. + * The correct bank lock must be held at entry, and will be held at exit. */ static int -SlruSelectLRUPage(SlruCtl ctl, int pageno) +SlruSelectLRUPage(SlruCtl ctl, int64 pageno) { SlruShared shared = ctl->shared; /* Outer loop handles restart after I/O */ for (;;) { - int slotno; int cur_count; int bestvalidslot = 0; /* keep compiler quiet */ int best_valid_delta = -1; - int best_valid_page_number = 0; /* keep compiler quiet */ + int64 best_valid_page_number = 0; /* keep compiler quiet */ int bestinvalidslot = 0; /* keep compiler quiet */ int best_invalid_delta = -1; - int best_invalid_page_number = 0; /* keep compiler quiet */ + int64 best_invalid_page_number = 0; /* keep compiler quiet */ + int bankno = pageno % ctl->nbanks; + int bankstart = bankno * SLRU_BANK_SIZE; + int bankend = bankstart + SLRU_BANK_SIZE; + + Assert(LWLockHeldByMe(SimpleLruGetBankLock(ctl, pageno))); /* See if page already has a buffer assigned */ - for (slotno = 0; slotno < shared->num_slots; slotno++) + for (int slotno = bankstart; slotno < bankend; slotno++) { - if (shared->page_number[slotno] == pageno && - shared->page_status[slotno] != SLRU_PAGE_EMPTY) + if (shared->page_status[slotno] != SLRU_PAGE_EMPTY && + shared->page_number[slotno] == pageno) return slotno; } @@ -1065,14 +1218,15 @@ SlruSelectLRUPage(SlruCtl ctl, int pageno) * That gets us back on the path to having good data when there are * multiple pages with the same lru_count. */ - cur_count = (shared->cur_lru_count)++; - for (slotno = 0; slotno < shared->num_slots; slotno++) + cur_count = (shared->bank_cur_lru_count[bankno])++; + for (int slotno = bankstart; slotno < bankend; slotno++) { int this_delta; - int this_page_number; + int64 this_page_number; if (shared->page_status[slotno] == SLRU_PAGE_EMPTY) return slotno; + this_delta = cur_count - shared->page_lru_count[slotno]; if (this_delta < 0) { @@ -1086,9 +1240,17 @@ SlruSelectLRUPage(SlruCtl ctl, int pageno) shared->page_lru_count[slotno] = cur_count; this_delta = 0; } + + /* + * If this page is the one most recently zeroed, don't consider it + * an eviction candidate. See comments in SimpleLruZeroPage for an + * explanation about the lack of a memory barrier here. + */ this_page_number = shared->page_number[slotno]; - if (this_page_number == shared->latest_page_number) + if (this_page_number == + pg_atomic_read_u64(&shared->latest_page_number)) continue; + if (shared->page_status[slotno] == SLRU_PAGE_VALID) { if (this_delta > best_valid_delta || @@ -1158,9 +1320,8 @@ SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied) { SlruShared shared = ctl->shared; SlruWriteAllData fdata; - int slotno; - int pageno = 0; - int i; + int64 pageno = 0; + int prevbank = SlotGetBankNumber(0); bool ok; /* update the stats counter of flushes */ @@ -1171,10 +1332,27 @@ SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied) */ fdata.num_files = 0; - LWLockAcquire(shared->ControlLock, LW_EXCLUSIVE); + LWLockAcquire(&shared->bank_locks[prevbank].lock, LW_EXCLUSIVE); - for (slotno = 0; slotno < shared->num_slots; slotno++) + for (int slotno = 0; slotno < shared->num_slots; slotno++) { + int curbank = SlotGetBankNumber(slotno); + + /* + * If the current bank lock is not same as the previous bank lock then + * release the previous lock and acquire the new lock. + */ + if (curbank != prevbank) + { + LWLockRelease(&shared->bank_locks[prevbank].lock); + LWLockAcquire(&shared->bank_locks[curbank].lock, LW_EXCLUSIVE); + prevbank = curbank; + } + + /* Do nothing if slot is unused */ + if (shared->page_status[slotno] == SLRU_PAGE_EMPTY) + continue; + SlruInternalWritePage(ctl, slotno, &fdata); /* @@ -1188,13 +1366,13 @@ SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied) !shared->page_dirty[slotno])); } - LWLockRelease(shared->ControlLock); + LWLockRelease(&shared->bank_locks[prevbank].lock); /* * Now close any files that were open */ ok = true; - for (i = 0; i < fdata.num_files; i++) + for (int i = 0; i < fdata.num_files; i++) { if (CloseTransientFile(fdata.fd[i]) != 0) { @@ -1224,10 +1402,10 @@ SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied) * after it has accrued freshly-written data. */ void -SimpleLruTruncate(SlruCtl ctl, int cutoffPage) +SimpleLruTruncate(SlruCtl ctl, int64 cutoffPage) { SlruShared shared = ctl->shared; - int slotno; + int prevbank; /* update the stats counter of truncates */ pgstat_count_slru_truncate(shared->slru_stats_idx); @@ -1238,25 +1416,40 @@ SimpleLruTruncate(SlruCtl ctl, int cutoffPage) * or just after a checkpoint, any dirty pages should have been flushed * already ... we're just being extra careful here.) */ - LWLockAcquire(shared->ControlLock, LW_EXCLUSIVE); - restart: /* - * While we are holding the lock, make an important safety check: the - * current endpoint page must not be eligible for removal. + * An important safety check: the current endpoint page must not be + * eligible for removal. This check is just a backstop against wraparound + * bugs elsewhere in SLRU handling, so we don't care if we read a slightly + * outdated value; therefore we don't add a memory barrier. */ - if (ctl->PagePrecedes(shared->latest_page_number, cutoffPage)) + if (ctl->PagePrecedes(pg_atomic_read_u64(&shared->latest_page_number), + cutoffPage)) { - LWLockRelease(shared->ControlLock); ereport(LOG, (errmsg("could not truncate directory \"%s\": apparent wraparound", ctl->Dir))); return; } - for (slotno = 0; slotno < shared->num_slots; slotno++) + prevbank = SlotGetBankNumber(0); + LWLockAcquire(&shared->bank_locks[prevbank].lock, LW_EXCLUSIVE); + for (int slotno = 0; slotno < shared->num_slots; slotno++) { + int curbank = SlotGetBankNumber(slotno); + + /* + * If the current bank lock is not same as the previous bank lock then + * release the previous lock and acquire the new lock. + */ + if (curbank != prevbank) + { + LWLockRelease(&shared->bank_locks[prevbank].lock); + LWLockAcquire(&shared->bank_locks[curbank].lock, LW_EXCLUSIVE); + prevbank = curbank; + } + if (shared->page_status[slotno] == SLRU_PAGE_EMPTY) continue; if (!ctl->PagePrecedes(shared->page_number[slotno], cutoffPage)) @@ -1286,10 +1479,12 @@ SimpleLruTruncate(SlruCtl ctl, int cutoffPage) SlruInternalWritePage(ctl, slotno, NULL); else SimpleLruWaitIO(ctl, slotno); + + LWLockRelease(&shared->bank_locks[prevbank].lock); goto restart; } - LWLockRelease(shared->ControlLock); + LWLockRelease(&shared->bank_locks[prevbank].lock); /* Now we can remove the old segment(s) */ (void) SlruScanDirectory(ctl, SlruScanDirCbDeleteCutoff, &cutoffPage); @@ -1302,7 +1497,7 @@ SimpleLruTruncate(SlruCtl ctl, int cutoffPage) * they either can't yet contain anything, or have already been cleaned out. */ static void -SlruInternalDeleteSegment(SlruCtl ctl, int segno) +SlruInternalDeleteSegment(SlruCtl ctl, int64 segno) { char path[MAXPGPATH]; @@ -1325,23 +1520,36 @@ SlruInternalDeleteSegment(SlruCtl ctl, int segno) * Delete an individual SLRU segment, identified by the segment number. */ void -SlruDeleteSegment(SlruCtl ctl, int segno) +SlruDeleteSegment(SlruCtl ctl, int64 segno) { SlruShared shared = ctl->shared; - int slotno; + int prevbank = SlotGetBankNumber(0); bool did_write; /* Clean out any possibly existing references to the segment. */ - LWLockAcquire(shared->ControlLock, LW_EXCLUSIVE); + LWLockAcquire(&shared->bank_locks[prevbank].lock, LW_EXCLUSIVE); restart: did_write = false; - for (slotno = 0; slotno < shared->num_slots; slotno++) + for (int slotno = 0; slotno < shared->num_slots; slotno++) { - int pagesegno = shared->page_number[slotno] / SLRU_PAGES_PER_SEGMENT; + int64 pagesegno; + int curbank = SlotGetBankNumber(slotno); + + /* + * If the current bank lock is not same as the previous bank lock then + * release the previous lock and acquire the new lock. + */ + if (curbank != prevbank) + { + LWLockRelease(&shared->bank_locks[prevbank].lock); + LWLockAcquire(&shared->bank_locks[curbank].lock, LW_EXCLUSIVE); + prevbank = curbank; + } if (shared->page_status[slotno] == SLRU_PAGE_EMPTY) continue; + pagesegno = shared->page_number[slotno] / SLRU_PAGES_PER_SEGMENT; /* not the segment we're looking for */ if (pagesegno != segno) continue; @@ -1372,7 +1580,7 @@ SlruDeleteSegment(SlruCtl ctl, int segno) SlruInternalDeleteSegment(ctl, segno); - LWLockRelease(shared->ControlLock); + LWLockRelease(&shared->bank_locks[prevbank].lock); } /* @@ -1389,9 +1597,9 @@ SlruDeleteSegment(SlruCtl ctl, int segno) * first>=cutoff && last>=cutoff: no; every page of this segment is too young */ static bool -SlruMayDeleteSegment(SlruCtl ctl, int segpage, int cutoffPage) +SlruMayDeleteSegment(SlruCtl ctl, int64 segpage, int64 cutoffPage) { - int seg_last_page = segpage + SLRU_PAGES_PER_SEGMENT - 1; + int64 seg_last_page = segpage + SLRU_PAGES_PER_SEGMENT - 1; Assert(segpage % SLRU_PAGES_PER_SEGMENT == 0); @@ -1405,7 +1613,7 @@ SlruPagePrecedesTestOffset(SlruCtl ctl, int per_page, uint32 offset) { TransactionId lhs, rhs; - int newestPage, + int64 newestPage, oldestPage; TransactionId newestXact, oldestXact; @@ -1498,9 +1706,10 @@ SlruPagePrecedesUnitTests(SlruCtl ctl, int per_page) * one containing the page passed as "data". */ bool -SlruScanDirCbReportPresence(SlruCtl ctl, char *filename, int segpage, void *data) +SlruScanDirCbReportPresence(SlruCtl ctl, char *filename, int64 segpage, + void *data) { - int cutoffPage = *(int *) data; + int64 cutoffPage = *(int64 *) data; if (SlruMayDeleteSegment(ctl, segpage, cutoffPage)) return true; /* found one; don't iterate any more */ @@ -1513,9 +1722,10 @@ SlruScanDirCbReportPresence(SlruCtl ctl, char *filename, int segpage, void *data * This callback deletes segments prior to the one passed in as "data". */ static bool -SlruScanDirCbDeleteCutoff(SlruCtl ctl, char *filename, int segpage, void *data) +SlruScanDirCbDeleteCutoff(SlruCtl ctl, char *filename, int64 segpage, + void *data) { - int cutoffPage = *(int *) data; + int64 cutoffPage = *(int64 *) data; if (SlruMayDeleteSegment(ctl, segpage, cutoffPage)) SlruInternalDeleteSegment(ctl, segpage / SLRU_PAGES_PER_SEGMENT); @@ -1528,13 +1738,37 @@ SlruScanDirCbDeleteCutoff(SlruCtl ctl, char *filename, int segpage, void *data) * This callback deletes all segments. */ bool -SlruScanDirCbDeleteAll(SlruCtl ctl, char *filename, int segpage, void *data) +SlruScanDirCbDeleteAll(SlruCtl ctl, char *filename, int64 segpage, void *data) { SlruInternalDeleteSegment(ctl, segpage / SLRU_PAGES_PER_SEGMENT); return false; /* keep going */ } +/* + * An internal function used by SlruScanDirectory(). + * + * Returns true if a file with a name of a given length may be a correct + * SLRU segment. + */ +static inline bool +SlruCorrectSegmentFilenameLength(SlruCtl ctl, size_t len) +{ + if (ctl->long_segment_names) + return (len == 15); /* see SlruFileName() */ + else + + /* + * Commit 638cf09e76d allowed 5-character lengths. Later commit + * 73c986adde5 allowed 6-character length. + * + * Note: There is an ongoing plan to migrate all SLRUs to 64-bit page + * numbers, and the corresponding 15-character file names, which may + * eventually deprecate the support for 4, 5, and 6-character names. + */ + return (len == 4 || len == 5 || len == 6); +} + /* * Scan the SimpleLru directory and apply a callback to each file found in it. * @@ -1556,8 +1790,8 @@ SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data) bool retval = false; DIR *cldir; struct dirent *clde; - int segno; - int segpage; + int64 segno; + int64 segpage; cldir = AllocateDir(ctl->Dir); while ((clde = ReadDir(cldir, ctl->Dir)) != NULL) @@ -1566,10 +1800,10 @@ SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data) len = strlen(clde->d_name); - if ((len == 4 || len == 5 || len == 6) && + if (SlruCorrectSegmentFilenameLength(ctl, len) && strspn(clde->d_name, "0123456789ABCDEF") == len) { - segno = (int) strtol(clde->d_name, NULL, 16); + segno = strtoi64(clde->d_name, NULL, 16); segpage = segno * SLRU_PAGES_PER_SEGMENT; elog(DEBUG2, "SlruScanDirectory invoking callback on %s/%s", diff --git a/src/backend/access/transam/subtrans.c b/src/backend/access/transam/subtrans.c index 62bb610167c0a..50bb1d8cfc5f0 100644 --- a/src/backend/access/transam/subtrans.c +++ b/src/backend/access/transam/subtrans.c @@ -19,7 +19,7 @@ * data across crashes. During database startup, we simply force the * currently-active page of SUBTRANS to zeroes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/subtrans.c @@ -31,7 +31,9 @@ #include "access/slru.h" #include "access/subtrans.h" #include "access/transam.h" +#include "miscadmin.h" #include "pg_trace.h" +#include "utils/guc_hooks.h" #include "utils/snapmgr.h" @@ -51,7 +53,16 @@ /* We need four bytes per xact */ #define SUBTRANS_XACTS_PER_PAGE (BLCKSZ / sizeof(TransactionId)) -#define TransactionIdToPage(xid) ((xid) / (TransactionId) SUBTRANS_XACTS_PER_PAGE) +/* + * Although we return an int64 the actual value can't currently exceed + * 0xFFFFFFFF/SUBTRANS_XACTS_PER_PAGE. + */ +static inline int64 +TransactionIdToPage(TransactionId xid) +{ + return xid / (int64) SUBTRANS_XACTS_PER_PAGE; +} + #define TransactionIdToEntry(xid) ((xid) % (TransactionId) SUBTRANS_XACTS_PER_PAGE) @@ -63,8 +74,8 @@ static SlruCtlData SubTransCtlData; #define SubTransCtl (&SubTransCtlData) -static int ZeroSUBTRANSPage(int pageno); -static bool SubTransPagePrecedes(int page1, int page2); +static int ZeroSUBTRANSPage(int64 pageno); +static bool SubTransPagePrecedes(int64 page1, int64 page2); /* @@ -73,15 +84,17 @@ static bool SubTransPagePrecedes(int page1, int page2); void SubTransSetParent(TransactionId xid, TransactionId parent) { - int pageno = TransactionIdToPage(xid); + int64 pageno = TransactionIdToPage(xid); int entryno = TransactionIdToEntry(xid); int slotno; + LWLock *lock; TransactionId *ptr; Assert(TransactionIdIsValid(parent)); Assert(TransactionIdFollows(xid, parent)); - LWLockAcquire(SubtransSLRULock, LW_EXCLUSIVE); + lock = SimpleLruGetBankLock(SubTransCtl, pageno); + LWLockAcquire(lock, LW_EXCLUSIVE); slotno = SimpleLruReadPage(SubTransCtl, pageno, true, xid); ptr = (TransactionId *) SubTransCtl->shared->page_buffer[slotno]; @@ -99,7 +112,7 @@ SubTransSetParent(TransactionId xid, TransactionId parent) SubTransCtl->shared->page_dirty[slotno] = true; } - LWLockRelease(SubtransSLRULock); + LWLockRelease(lock); } /* @@ -108,7 +121,7 @@ SubTransSetParent(TransactionId xid, TransactionId parent) TransactionId SubTransGetParent(TransactionId xid) { - int pageno = TransactionIdToPage(xid); + int64 pageno = TransactionIdToPage(xid); int entryno = TransactionIdToEntry(xid); int slotno; TransactionId *ptr; @@ -129,7 +142,7 @@ SubTransGetParent(TransactionId xid) parent = *ptr; - LWLockRelease(SubtransSLRULock); + LWLockRelease(SimpleLruGetBankLock(SubTransCtl, pageno)); return parent; } @@ -177,6 +190,22 @@ SubTransGetTopmostTransaction(TransactionId xid) return previousXid; } +/* + * Number of shared SUBTRANS buffers. + * + * If asked to autotune, use 2MB for every 1GB of shared buffers, up to 8MB. + * Otherwise just cap the configured amount to be between 16 and the maximum + * allowed. + */ +static int +SUBTRANSShmemBuffers(void) +{ + /* auto-tune based on shared buffers */ + if (subtransaction_buffers == 0) + return SimpleLruAutotuneBuffers(512, 1024); + + return Min(Max(16, subtransaction_buffers), SLRU_MAX_ALLOWED_BUFFERS); +} /* * Initialization of shared memory for SUBTRANS @@ -184,19 +213,49 @@ SubTransGetTopmostTransaction(TransactionId xid) Size SUBTRANSShmemSize(void) { - return SimpleLruShmemSize(NUM_SUBTRANS_BUFFERS, 0); + return SimpleLruShmemSize(SUBTRANSShmemBuffers(), 0); } void SUBTRANSShmemInit(void) { + /* If auto-tuning is requested, now is the time to do it */ + if (subtransaction_buffers == 0) + { + char buf[32]; + + snprintf(buf, sizeof(buf), "%d", SUBTRANSShmemBuffers()); + SetConfigOption("subtransaction_buffers", buf, PGC_POSTMASTER, + PGC_S_DYNAMIC_DEFAULT); + + /* + * We prefer to report this value's source as PGC_S_DYNAMIC_DEFAULT. + * However, if the DBA explicitly set subtransaction_buffers = 0 in + * the config file, then PGC_S_DYNAMIC_DEFAULT will fail to override + * that and we must force the matter with PGC_S_OVERRIDE. + */ + if (subtransaction_buffers == 0) /* failed to apply it? */ + SetConfigOption("subtransaction_buffers", buf, PGC_POSTMASTER, + PGC_S_OVERRIDE); + } + Assert(subtransaction_buffers != 0); + SubTransCtl->PagePrecedes = SubTransPagePrecedes; - SimpleLruInit(SubTransCtl, "Subtrans", NUM_SUBTRANS_BUFFERS, 0, - SubtransSLRULock, "pg_subtrans", - LWTRANCHE_SUBTRANS_BUFFER, SYNC_HANDLER_NONE); + SimpleLruInit(SubTransCtl, "subtransaction", SUBTRANSShmemBuffers(), 0, + "pg_subtrans", LWTRANCHE_SUBTRANS_BUFFER, + LWTRANCHE_SUBTRANS_SLRU, SYNC_HANDLER_NONE, false); SlruPagePrecedesUnitTests(SubTransCtl, SUBTRANS_XACTS_PER_PAGE); } +/* + * GUC check_hook for subtransaction_buffers + */ +bool +check_subtrans_buffers(int *newval, void **extra, GucSource source) +{ + return check_slru_buffers("subtransaction_buffers", newval); +} + /* * This func must be called ONCE on system install. It creates * the initial SUBTRANS segment. (The SUBTRANS directory is assumed to @@ -211,8 +270,9 @@ void BootStrapSUBTRANS(void) { int slotno; + LWLock *lock = SimpleLruGetBankLock(SubTransCtl, 0); - LWLockAcquire(SubtransSLRULock, LW_EXCLUSIVE); + LWLockAcquire(lock, LW_EXCLUSIVE); /* Create and zero the first page of the subtrans log */ slotno = ZeroSUBTRANSPage(0); @@ -221,7 +281,7 @@ BootStrapSUBTRANS(void) SimpleLruWritePage(SubTransCtl, slotno); Assert(!SubTransCtl->shared->page_dirty[slotno]); - LWLockRelease(SubtransSLRULock); + LWLockRelease(lock); } /* @@ -233,14 +293,14 @@ BootStrapSUBTRANS(void) * Control lock must be held at entry, and will be held at exit. */ static int -ZeroSUBTRANSPage(int pageno) +ZeroSUBTRANSPage(int64 pageno) { return SimpleLruZeroPage(SubTransCtl, pageno); } /* * This must be called ONCE during postmaster or standalone-backend startup, - * after StartupXLOG has initialized ShmemVariableCache->nextXid. + * after StartupXLOG has initialized TransamVariables->nextXid. * * oldestActiveXID is the oldest XID of any prepared transaction, or nextXid * if there are none. @@ -249,8 +309,10 @@ void StartupSUBTRANS(TransactionId oldestActiveXID) { FullTransactionId nextXid; - int startPage; - int endPage; + int64 startPage; + int64 endPage; + LWLock *prevlock = NULL; + LWLock *lock; /* * Since we don't expect pg_subtrans to be valid across crashes, we @@ -258,23 +320,32 @@ StartupSUBTRANS(TransactionId oldestActiveXID) * Whenever we advance into a new page, ExtendSUBTRANS will likewise zero * the new page without regard to whatever was previously on disk. */ - LWLockAcquire(SubtransSLRULock, LW_EXCLUSIVE); - startPage = TransactionIdToPage(oldestActiveXID); - nextXid = ShmemVariableCache->nextXid; + nextXid = TransamVariables->nextXid; endPage = TransactionIdToPage(XidFromFullTransactionId(nextXid)); - while (startPage != endPage) + for (;;) { + lock = SimpleLruGetBankLock(SubTransCtl, startPage); + if (prevlock != lock) + { + if (prevlock) + LWLockRelease(prevlock); + LWLockAcquire(lock, LW_EXCLUSIVE); + prevlock = lock; + } + (void) ZeroSUBTRANSPage(startPage); + if (startPage == endPage) + break; + startPage++; /* must account for wraparound */ if (startPage > TransactionIdToPage(MaxTransactionId)) startPage = 0; } - (void) ZeroSUBTRANSPage(startPage); - LWLockRelease(SubtransSLRULock); + LWLockRelease(lock); } /* @@ -307,7 +378,8 @@ CheckPointSUBTRANS(void) void ExtendSUBTRANS(TransactionId newestXact) { - int pageno; + int64 pageno; + LWLock *lock; /* * No work except at first XID of a page. But beware: just after @@ -319,12 +391,13 @@ ExtendSUBTRANS(TransactionId newestXact) pageno = TransactionIdToPage(newestXact); - LWLockAcquire(SubtransSLRULock, LW_EXCLUSIVE); + lock = SimpleLruGetBankLock(SubTransCtl, pageno); + LWLockAcquire(lock, LW_EXCLUSIVE); /* Zero the page */ ZeroSUBTRANSPage(pageno); - LWLockRelease(SubtransSLRULock); + LWLockRelease(lock); } @@ -337,7 +410,7 @@ ExtendSUBTRANS(TransactionId newestXact) void TruncateSUBTRANS(TransactionId oldestXact) { - int cutoffPage; + int64 cutoffPage; /* * The cutoff point is the start of the segment containing oldestXact. We @@ -359,7 +432,7 @@ TruncateSUBTRANS(TransactionId oldestXact) * Analogous to CLOGPagePrecedes(). */ static bool -SubTransPagePrecedes(int page1, int page2) +SubTransPagePrecedes(int64 page1, int64 page2) { TransactionId xid1; TransactionId xid2; diff --git a/src/backend/access/transam/timeline.c b/src/backend/access/transam/timeline.c index 94e152694e434..146751ae37526 100644 --- a/src/backend/access/transam/timeline.c +++ b/src/backend/access/transam/timeline.c @@ -21,7 +21,7 @@ * The fields are separated by tabs. Lines beginning with # are comments, and * are ignored. Empty lines are also ignored. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/timeline.c diff --git a/src/backend/access/transam/transam.c b/src/backend/access/transam/transam.c index 7629904bbf736..75b5325df8b28 100644 --- a/src/backend/access/transam/transam.c +++ b/src/backend/access/transam/transam.c @@ -3,7 +3,7 @@ * transam.c * postgres transaction (commit) log interface routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 068e59bec005b..4f78c1dc5795d 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -3,7 +3,7 @@ * twophase.c * Two-phase commit support functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -86,6 +86,7 @@ #include "access/xlog.h" #include "access/xloginsert.h" #include "access/xlogreader.h" +#include "access/xlogrecovery.h" #include "access/xlogutils.h" #include "catalog/pg_type.h" #include "catalog/storage.h" @@ -95,15 +96,12 @@ #include "pgstat.h" #include "replication/origin.h" #include "replication/syncrep.h" -#include "replication/walsender.h" #include "storage/fd.h" #include "storage/ipc.h" #include "storage/md.h" #include "storage/predicate.h" #include "storage/proc.h" #include "storage/procarray.h" -#include "storage/sinvaladt.h" -#include "storage/smgr.h" #include "utils/builtins.h" #include "utils/memutils.h" #include "utils/timestamp.h" @@ -131,7 +129,7 @@ int max_prepared_xacts = 0; * * 3. To begin COMMIT PREPARED or ROLLBACK PREPARED, check that the entry is * valid and not locked, then mark the entry as locked by storing my current - * backend ID into locking_backend. This prevents concurrent attempts to + * proc number into locking_backend. This prevents concurrent attempts to * commit or rollback the same prepared xact. * * 4. On completion of COMMIT PREPARED or ROLLBACK PREPARED, remove the entry @@ -150,7 +148,6 @@ typedef struct GlobalTransactionData { GlobalTransaction next; /* list link for free list */ int pgprocno; /* ID of associated dummy PGPROC */ - BackendId dummyBackendId; /* similar to backend id for backends */ TimestampTz prepared_at; /* time of preparation */ /* @@ -165,7 +162,7 @@ typedef struct GlobalTransactionData TransactionId xid; /* The GXACT id */ Oid owner; /* ID of user that executed the xact */ - BackendId locking_backend; /* backend currently working on the xact */ + ProcNumber locking_backend; /* backend currently working on the xact */ bool valid; /* true if PGPROC entry is in proc array */ bool ondisk; /* true if prepare state file is on disk */ bool inredo; /* true if entry was added via xlog_redo */ @@ -283,21 +280,7 @@ TwoPhaseShmemInit(void) TwoPhaseState->freeGXacts = &gxacts[i]; /* associate it with a PGPROC assigned by InitProcGlobal */ - gxacts[i].pgprocno = PreparedXactProcs[i].pgprocno; - - /* - * Assign a unique ID for each dummy proc, so that the range of - * dummy backend IDs immediately follows the range of normal - * backend IDs. We don't dare to assign a real backend ID to dummy - * procs, because prepared transactions don't take part in cache - * invalidation like a real backend ID would imply, but having a - * unique ID for them is nevertheless handy. This arrangement - * allows you to allocate an array of size (MaxBackends + - * max_prepared_xacts + 1), and have a slot for every backend and - * prepared transaction. Currently multixact.c uses that - * technique. - */ - gxacts[i].dummyBackendId = MaxBackends + 1 + i; + gxacts[i].pgprocno = GetNumberFromPGProc(&PreparedXactProcs[i]); } } else @@ -347,7 +330,7 @@ AtAbort_Twophase(void) if (!MyLockedGxact->valid) RemoveGXact(MyLockedGxact); else - MyLockedGxact->locking_backend = InvalidBackendId; + MyLockedGxact->locking_backend = INVALID_PROC_NUMBER; LWLockRelease(TwoPhaseStateLock); MyLockedGxact = NULL; @@ -361,7 +344,7 @@ void PostPrepare_Twophase(void) { LWLockAcquire(TwoPhaseStateLock, LW_EXCLUSIVE); - MyLockedGxact->locking_backend = InvalidBackendId; + MyLockedGxact->locking_backend = INVALID_PROC_NUMBER; LWLockRelease(TwoPhaseStateLock); MyLockedGxact = NULL; @@ -390,7 +373,7 @@ MarkAsPreparing(TransactionId xid, const char *gid, ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("prepared transactions are disabled"), - errhint("Set max_prepared_transactions to a nonzero value."))); + errhint("Set \"max_prepared_transactions\" to a nonzero value."))); /* on first call, register the exit hook */ if (!twophaseExitRegistered) @@ -419,7 +402,7 @@ MarkAsPreparing(TransactionId xid, const char *gid, ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("maximum number of prepared transactions reached"), - errhint("Increase max_prepared_transactions (currently %d).", + errhint("Increase \"max_prepared_transactions\" (currently %d).", max_prepared_xacts))); gxact = TwoPhaseState->freeGXacts; TwoPhaseState->freeGXacts = gxact->next; @@ -456,25 +439,24 @@ MarkAsPreparingGuts(GlobalTransaction gxact, TransactionId xid, const char *gid, Assert(LWLockHeldByMeInMode(TwoPhaseStateLock, LW_EXCLUSIVE)); Assert(gxact != NULL); - proc = &ProcGlobal->allProcs[gxact->pgprocno]; + proc = GetPGProcByNumber(gxact->pgprocno); /* Initialize the PGPROC entry */ MemSet(proc, 0, sizeof(PGPROC)); - proc->pgprocno = gxact->pgprocno; dlist_node_init(&proc->links); proc->waitStatus = PROC_WAIT_STATUS_OK; - if (LocalTransactionIdIsValid(MyProc->lxid)) + if (LocalTransactionIdIsValid(MyProc->vxid.lxid)) { /* clone VXID, for TwoPhaseGetXidByVirtualXID() to find */ - proc->lxid = MyProc->lxid; - proc->backendId = MyBackendId; + proc->vxid.lxid = MyProc->vxid.lxid; + proc->vxid.procNumber = MyProcNumber; } else { Assert(AmStartupProcess() || !IsPostmasterEnvironment); /* GetLockConflicts() uses this to specify a wait on the XID */ - proc->lxid = xid; - proc->backendId = InvalidBackendId; + proc->vxid.lxid = xid; + proc->vxid.procNumber = INVALID_PROC_NUMBER; } proc->xid = xid; Assert(proc->xmin == InvalidTransactionId); @@ -484,7 +466,7 @@ MarkAsPreparingGuts(GlobalTransaction gxact, TransactionId xid, const char *gid, proc->databaseId = databaseid; proc->roleId = owner; proc->tempNamespaceId = InvalidOid; - proc->isBackgroundWorker = false; + proc->isBackgroundWorker = true; proc->lwWaiting = LW_WS_NOT_WAITING; proc->lwWaitMode = 0; proc->waitLock = NULL; @@ -499,7 +481,7 @@ MarkAsPreparingGuts(GlobalTransaction gxact, TransactionId xid, const char *gid, gxact->prepared_at = prepared_at; gxact->xid = xid; gxact->owner = owner; - gxact->locking_backend = MyBackendId; + gxact->locking_backend = MyProcNumber; gxact->valid = false; gxact->inredo = false; strcpy(gxact->gid, gid); @@ -522,7 +504,7 @@ static void GXactLoadSubxactData(GlobalTransaction gxact, int nsubxacts, TransactionId *children) { - PGPROC *proc = &ProcGlobal->allProcs[gxact->pgprocno]; + PGPROC *proc = GetPGProcByNumber(gxact->pgprocno); /* We need no extra lock since the GXACT isn't valid yet */ if (nsubxacts > PGPROC_MAX_CACHED_SUBXIDS) @@ -559,7 +541,7 @@ MarkAsPrepared(GlobalTransaction gxact, bool lock_held) * Put it into the global ProcArray so TransactionIdIsInProgress considers * the XID as still running. */ - ProcArrayAdd(&ProcGlobal->allProcs[gxact->pgprocno]); + ProcArrayAdd(GetPGProcByNumber(gxact->pgprocno)); } /* @@ -583,7 +565,7 @@ LockGXact(const char *gid, Oid user) for (i = 0; i < TwoPhaseState->numPrepXacts; i++) { GlobalTransaction gxact = TwoPhaseState->prepXacts[i]; - PGPROC *proc = &ProcGlobal->allProcs[gxact->pgprocno]; + PGPROC *proc = GetPGProcByNumber(gxact->pgprocno); /* Ignore not-yet-valid GIDs */ if (!gxact->valid) @@ -592,7 +574,7 @@ LockGXact(const char *gid, Oid user) continue; /* Found it, but has someone else got it locked? */ - if (gxact->locking_backend != InvalidBackendId) + if (gxact->locking_backend != INVALID_PROC_NUMBER) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("prepared transaction with identifier \"%s\" is busy", @@ -617,7 +599,7 @@ LockGXact(const char *gid, Oid user) errhint("Connect to the database where the transaction was prepared to finish it."))); /* OK for me to lock it */ - gxact->locking_backend = MyBackendId; + gxact->locking_backend = MyProcNumber; MyLockedGxact = gxact; LWLockRelease(TwoPhaseStateLock); @@ -779,7 +761,7 @@ pg_prepared_xact(PG_FUNCTION_ARGS) while (status->array != NULL && status->currIdx < status->ngxacts) { GlobalTransaction gxact = &status->array[status->currIdx++]; - PGPROC *proc = &ProcGlobal->allProcs[gxact->pgprocno]; + PGPROC *proc = GetPGProcByNumber(gxact->pgprocno); Datum values[5] = {0}; bool nulls[5] = {0}; HeapTuple tuple; @@ -864,7 +846,7 @@ TwoPhaseGetGXact(TransactionId xid, bool lock_held) * * (This won't find recovered xacts.) If more than one matches, return any * and set "have_more" to true. To witness multiple matches, a single - * BackendId must consume 2^32 LXIDs, with no intervening database restart. + * proc number must consume 2^32 LXIDs, with no intervening database restart. */ TransactionId TwoPhaseGetXidByVirtualXID(VirtualTransactionId vxid, @@ -884,11 +866,14 @@ TwoPhaseGetXidByVirtualXID(VirtualTransactionId vxid, if (!gxact->valid) continue; - proc = &ProcGlobal->allProcs[gxact->pgprocno]; + proc = GetPGProcByNumber(gxact->pgprocno); GET_VXID_FROM_PGPROC(proc_vxid, *proc); if (VirtualTransactionIdEquals(vxid, proc_vxid)) { - /* Startup process sets proc->backendId to InvalidBackendId. */ + /* + * Startup process sets proc->vxid.procNumber to + * INVALID_PROC_NUMBER. + */ Assert(!gxact->inredo); if (result != InvalidTransactionId) @@ -906,20 +891,20 @@ TwoPhaseGetXidByVirtualXID(VirtualTransactionId vxid, } /* - * TwoPhaseGetDummyBackendId - * Get the dummy backend ID for prepared transaction specified by XID + * TwoPhaseGetDummyProcNumber + * Get the dummy proc number for prepared transaction specified by XID * - * Dummy backend IDs are similar to real backend IDs of real backends. - * They start at MaxBackends + 1, and are unique across all currently active - * real backends and prepared transactions. If lock_held is set to true, + * Dummy proc numbers are similar to proc numbers of real backends. They + * start at MaxBackends, and are unique across all currently active real + * backends and prepared transactions. If lock_held is set to true, * TwoPhaseStateLock will not be taken, so the caller had better hold it. */ -BackendId -TwoPhaseGetDummyBackendId(TransactionId xid, bool lock_held) +ProcNumber +TwoPhaseGetDummyProcNumber(TransactionId xid, bool lock_held) { GlobalTransaction gxact = TwoPhaseGetGXact(xid, lock_held); - return gxact->dummyBackendId; + return gxact->pgprocno; } /* @@ -934,15 +919,37 @@ TwoPhaseGetDummyProc(TransactionId xid, bool lock_held) { GlobalTransaction gxact = TwoPhaseGetGXact(xid, lock_held); - return &ProcGlobal->allProcs[gxact->pgprocno]; + return GetPGProcByNumber(gxact->pgprocno); } /************************************************************************/ /* State file support */ /************************************************************************/ -#define TwoPhaseFilePath(path, xid) \ - snprintf(path, MAXPGPATH, TWOPHASE_DIR "/%08X", xid) +/* + * Compute the FullTransactionId for the given TransactionId. + * + * This is safe if the xid has not yet reached COMMIT PREPARED or ROLLBACK + * PREPARED. After those commands, concurrent vac_truncate_clog() may make + * the xid cease to qualify as allowable. XXX Not all callers limit their + * calls accordingly. + */ +static inline FullTransactionId +AdjustToFullTransactionId(TransactionId xid) +{ + Assert(TransactionIdIsValid(xid)); + return FullTransactionIdFromAllowableAt(ReadNextFullTransactionId(), xid); +} + +static inline int +TwoPhaseFilePath(char *path, TransactionId xid) +{ + FullTransactionId fxid = AdjustToFullTransactionId(xid); + + return snprintf(path, MAXPGPATH, TWOPHASE_DIR "/%08X%08X", + EpochFromFullTransactionId(fxid), + XidFromFullTransactionId(fxid)); +} /* * 2PC state file format: @@ -1041,7 +1048,7 @@ save_state_data(const void *data, uint32 len) void StartPrepare(GlobalTransaction gxact) { - PGPROC *proc = &ProcGlobal->allProcs[gxact->pgprocno]; + PGPROC *proc = GetPGProcByNumber(gxact->pgprocno); TransactionId xid = gxact->xid; TwoPhaseFileHeader hdr; TransactionId *children; @@ -1482,6 +1489,7 @@ FinishPreparedTransaction(const char *gid, bool isCommit) GlobalTransaction gxact; PGPROC *proc; TransactionId xid; + bool ondisk; char *buf; char *bufptr; TwoPhaseFileHeader *hdr; @@ -1500,7 +1508,7 @@ FinishPreparedTransaction(const char *gid, bool isCommit) * try to commit the same GID at once. */ gxact = LockGXact(gid, GetUserId()); - proc = &ProcGlobal->allProcs[gxact->pgprocno]; + proc = GetPGProcByNumber(gxact->pgprocno); xid = gxact->xid; /* @@ -1634,6 +1642,12 @@ FinishPreparedTransaction(const char *gid, bool isCommit) PredicateLockTwoPhaseFinish(xid, isCommit); + /* + * Read this value while holding the two-phase lock, as the on-disk 2PC + * file is physically removed after the lock is released. + */ + ondisk = gxact->ondisk; + /* Clear shared memory state */ RemoveGXact(gxact); @@ -1649,7 +1663,7 @@ FinishPreparedTransaction(const char *gid, bool isCommit) /* * And now we can clean up any files we may have left. */ - if (gxact->ondisk) + if (ondisk) RemoveTwoPhaseFile(xid, true); MyLockedGxact = NULL; @@ -1881,13 +1895,15 @@ restoreTwoPhaseData(void) cldir = AllocateDir(TWOPHASE_DIR); while ((clde = ReadDir(cldir, TWOPHASE_DIR)) != NULL) { - if (strlen(clde->d_name) == 8 && - strspn(clde->d_name, "0123456789ABCDEF") == 8) + if (strlen(clde->d_name) == 16 && + strspn(clde->d_name, "0123456789ABCDEF") == 16) { TransactionId xid; + FullTransactionId fxid; char *buf; - xid = (TransactionId) strtoul(clde->d_name, NULL, 16); + fxid = FullTransactionIdFromU64(strtou64(clde->d_name, NULL, 16)); + xid = XidFromFullTransactionId(fxid); buf = ProcessTwoPhaseBuffer(xid, InvalidXLogRecPtr, true, false, false); @@ -1907,7 +1923,7 @@ restoreTwoPhaseData(void) * * Scan the shared memory entries of TwoPhaseState and determine the range * of valid XIDs present. This is run during database startup, after we - * have completed reading WAL. ShmemVariableCache->nextXid has been set to + * have completed reading WAL. TransamVariables->nextXid has been set to * one more than the highest XID for which evidence exists in WAL. * * We throw away any prepared xacts with main XID beyond nextXid --- if any @@ -1926,7 +1942,7 @@ restoreTwoPhaseData(void) * backup should be rolled in. * * Our other responsibility is to determine and return the oldest valid XID - * among the prepared xacts (if none, return ShmemVariableCache->nextXid). + * among the prepared xacts (if none, return TransamVariables->nextXid). * This is needed to synchronize pg_subtrans startup properly. * * If xids_p and nxids_p are not NULL, pointer to a palloc'd array of all @@ -1936,7 +1952,7 @@ restoreTwoPhaseData(void) TransactionId PrescanPreparedTransactions(TransactionId **xids_p, int *nxids_p) { - FullTransactionId nextXid = ShmemVariableCache->nextXid; + FullTransactionId nextXid = TransamVariables->nextXid; TransactionId origNextXid = XidFromFullTransactionId(nextXid); TransactionId result = origNextXid; TransactionId *xids = NULL; @@ -2010,9 +2026,8 @@ PrescanPreparedTransactions(TransactionId **xids_p, int *nxids_p) * This is never called at the end of recovery - we use * RecoverPreparedTransactions() at that point. * - * The lack of calls to SubTransSetParent() calls here is by design; - * those calls are made by RecoverPreparedTransactions() at the end of recovery - * for those xacts that need this. + * This updates pg_subtrans, so that any subtransactions will be correctly + * seen as in-progress in snapshots taken during recovery. */ void StandbyRecoverPreparedTransactions(void) @@ -2032,7 +2047,7 @@ StandbyRecoverPreparedTransactions(void) buf = ProcessTwoPhaseBuffer(xid, gxact->prepare_start_lsn, - gxact->ondisk, false, false); + gxact->ondisk, true, false); if (buf != NULL) pfree(buf); } @@ -2155,7 +2170,7 @@ RecoverPreparedTransactions(void) * * If setParent is true, set up subtransaction parent linkages. * - * If setNextXid is true, set ShmemVariableCache->nextXid to the newest + * If setNextXid is true, set TransamVariables->nextXid to the newest * value scanned. */ static char * @@ -2164,7 +2179,7 @@ ProcessTwoPhaseBuffer(TransactionId xid, bool fromdisk, bool setParent, bool setNextXid) { - FullTransactionId nextXid = ShmemVariableCache->nextXid; + FullTransactionId nextXid = TransamVariables->nextXid; TransactionId origNextXid = XidFromFullTransactionId(nextXid); TransactionId *subxids; char *buf; @@ -2477,12 +2492,44 @@ PrepareRedoAdd(char *buf, XLogRecPtr start_lsn, * that it got added in the redo phase */ + /* + * In the event of a crash while a checkpoint was running, it may be + * possible that some two-phase data found its way to disk while its + * corresponding record needs to be replayed in the follow-up recovery. As + * the 2PC data was on disk, it has already been restored at the beginning + * of recovery with restoreTwoPhaseData(), so skip this record to avoid + * duplicates in TwoPhaseState. If a consistent state has been reached, + * the record is added to TwoPhaseState and it should have no + * corresponding file in pg_twophase. + */ + if (!XLogRecPtrIsInvalid(start_lsn)) + { + char path[MAXPGPATH]; + + TwoPhaseFilePath(path, hdr->xid); + + if (access(path, F_OK) == 0) + { + ereport(reachedConsistency ? ERROR : WARNING, + (errmsg("could not recover two-phase state file for transaction %u", + hdr->xid), + errdetail("Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk.", + LSN_FORMAT_ARGS(start_lsn)))); + return; + } + + if (errno != ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not access file \"%s\": %m", path))); + } + /* Get a free gxact from the freelist */ if (TwoPhaseState->freeGXacts == NULL) ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("maximum number of prepared transactions reached"), - errhint("Increase max_prepared_transactions (currently %d).", + errhint("Increase \"max_prepared_transactions\" (currently %d).", max_prepared_xacts))); gxact = TwoPhaseState->freeGXacts; TwoPhaseState->freeGXacts = gxact->next; @@ -2492,7 +2539,7 @@ PrepareRedoAdd(char *buf, XLogRecPtr start_lsn, gxact->prepare_end_lsn = end_lsn; gxact->xid = hdr->xid; gxact->owner = hdr->owner; - gxact->locking_backend = InvalidBackendId; + gxact->locking_backend = INVALID_PROC_NUMBER; gxact->valid = false; gxact->ondisk = XLogRecPtrIsInvalid(start_lsn); gxact->inredo = true; /* yes, added in redo */ diff --git a/src/backend/access/transam/twophase_rmgr.c b/src/backend/access/transam/twophase_rmgr.c index 8211441d5351b..15b797f34b3af 100644 --- a/src/backend/access/transam/twophase_rmgr.c +++ b/src/backend/access/transam/twophase_rmgr.c @@ -3,7 +3,7 @@ * twophase_rmgr.c * Two-phase-commit resource managers tables * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/access/transam/varsup.c b/src/backend/access/transam/varsup.c index 334adac09e8cc..cfe8c6cf8dc08 100644 --- a/src/backend/access/transam/varsup.c +++ b/src/backend/access/transam/varsup.c @@ -3,7 +3,7 @@ * varsup.c * postgres OID & XID variables support routines * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/access/transam/varsup.c @@ -30,10 +30,37 @@ /* Number of OIDs to prefetch (preallocate) per XLOG write */ #define VAR_OID_PREFETCH 8192 -/* pointer to "variable cache" in shared memory (set up by shmem.c) */ -VariableCache ShmemVariableCache = NULL; +/* pointer to variables struct in shared memory */ +TransamVariablesData *TransamVariables = NULL; +/* + * Initialization of shared memory for TransamVariables. + */ +Size +VarsupShmemSize(void) +{ + return sizeof(TransamVariablesData); +} + +void +VarsupShmemInit(void) +{ + bool found; + + /* Initialize our shared state struct */ + TransamVariables = ShmemInitStruct("TransamVariables", + sizeof(TransamVariablesData), + &found); + if (!IsUnderPostmaster) + { + Assert(!found); + memset(TransamVariables, 0, sizeof(TransamVariablesData)); + } + else + Assert(found); +} + /* * Allocate the next FullTransactionId for a new transaction or * subtransaction. @@ -77,7 +104,7 @@ GetNewTransactionId(bool isSubXact) LWLockAcquire(XidGenLock, LW_EXCLUSIVE); - full_xid = ShmemVariableCache->nextXid; + full_xid = TransamVariables->nextXid; xid = XidFromFullTransactionId(full_xid); /*---------- @@ -93,7 +120,7 @@ GetNewTransactionId(bool isSubXact) * Note that this coding also appears in GetNewMultiXactId. *---------- */ - if (TransactionIdFollowsOrEquals(xid, ShmemVariableCache->xidVacLimit)) + if (TransactionIdFollowsOrEquals(xid, TransamVariables->xidVacLimit)) { /* * For safety's sake, we release XidGenLock while sending signals, @@ -102,10 +129,10 @@ GetNewTransactionId(bool isSubXact) * possibility of deadlock while doing get_database_name(). First, * copy all the shared values we'll need in this path. */ - TransactionId xidWarnLimit = ShmemVariableCache->xidWarnLimit; - TransactionId xidStopLimit = ShmemVariableCache->xidStopLimit; - TransactionId xidWrapLimit = ShmemVariableCache->xidWrapLimit; - Oid oldest_datoid = ShmemVariableCache->oldestXidDB; + TransactionId xidWarnLimit = TransamVariables->xidWarnLimit; + TransactionId xidStopLimit = TransamVariables->xidStopLimit; + TransactionId xidWrapLimit = TransamVariables->xidWrapLimit; + Oid oldest_datoid = TransamVariables->oldestXidDB; LWLockRelease(XidGenLock); @@ -126,16 +153,16 @@ GetNewTransactionId(bool isSubXact) if (oldest_datname) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("database is not accepting commands to avoid wraparound data loss in database \"%s\"", + errmsg("database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database \"%s\"", oldest_datname), - errhint("Stop the postmaster and vacuum that database in single-user mode.\n" + errhint("Execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); else ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("database is not accepting commands to avoid wraparound data loss in database with OID %u", + errmsg("database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database with OID %u", oldest_datoid), - errhint("Stop the postmaster and vacuum that database in single-user mode.\n" + errhint("Execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); } else if (TransactionIdFollowsOrEquals(xid, xidWarnLimit)) @@ -148,20 +175,20 @@ GetNewTransactionId(bool isSubXact) (errmsg("database \"%s\" must be vacuumed within %u transactions", oldest_datname, xidWrapLimit - xid), - errhint("To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" + errhint("To avoid transaction ID assignment failures, execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); else ereport(WARNING, (errmsg("database with OID %u must be vacuumed within %u transactions", oldest_datoid, xidWrapLimit - xid), - errhint("To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" + errhint("To avoid XID assignment failures, execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); } /* Re-acquire lock and start over */ LWLockAcquire(XidGenLock, LW_EXCLUSIVE); - full_xid = ShmemVariableCache->nextXid; + full_xid = TransamVariables->nextXid; xid = XidFromFullTransactionId(full_xid); } @@ -184,7 +211,7 @@ GetNewTransactionId(bool isSubXact) * want the next incoming transaction to try it again. We cannot assign * more XIDs until there is CLOG space for them. */ - FullTransactionIdAdvance(&ShmemVariableCache->nextXid); + FullTransactionIdAdvance(&TransamVariables->nextXid); /* * We must store the new XID into the shared ProcArray before releasing @@ -263,7 +290,7 @@ ReadNextFullTransactionId(void) FullTransactionId fullXid; LWLockAcquire(XidGenLock, LW_SHARED); - fullXid = ShmemVariableCache->nextXid; + fullXid = TransamVariables->nextXid; LWLockRelease(XidGenLock); return fullXid; @@ -288,7 +315,7 @@ AdvanceNextFullTransactionIdPastXid(TransactionId xid) Assert(AmStartupProcess() || !IsUnderPostmaster); /* Fast return if this isn't an xid high enough to move the needle. */ - next_xid = XidFromFullTransactionId(ShmemVariableCache->nextXid); + next_xid = XidFromFullTransactionId(TransamVariables->nextXid); if (!TransactionIdFollowsOrEquals(xid, next_xid)) return; @@ -301,7 +328,7 @@ AdvanceNextFullTransactionIdPastXid(TransactionId xid) * point in the WAL stream. */ TransactionIdAdvance(xid); - epoch = EpochFromFullTransactionId(ShmemVariableCache->nextXid); + epoch = EpochFromFullTransactionId(TransamVariables->nextXid); if (unlikely(xid < next_xid)) ++epoch; newNextFullXid = FullTransactionIdFromEpochAndXid(epoch, xid); @@ -311,7 +338,7 @@ AdvanceNextFullTransactionIdPastXid(TransactionId xid) * concurrent readers. */ LWLockAcquire(XidGenLock, LW_EXCLUSIVE); - ShmemVariableCache->nextXid = newNextFullXid; + TransamVariables->nextXid = newNextFullXid; LWLockRelease(XidGenLock); } @@ -328,10 +355,10 @@ void AdvanceOldestClogXid(TransactionId oldest_datfrozenxid) { LWLockAcquire(XactTruncationLock, LW_EXCLUSIVE); - if (TransactionIdPrecedes(ShmemVariableCache->oldestClogXid, + if (TransactionIdPrecedes(TransamVariables->oldestClogXid, oldest_datfrozenxid)) { - ShmemVariableCache->oldestClogXid = oldest_datfrozenxid; + TransamVariables->oldestClogXid = oldest_datfrozenxid; } LWLockRelease(XactTruncationLock); } @@ -414,13 +441,13 @@ SetTransactionIdLimit(TransactionId oldest_datfrozenxid, Oid oldest_datoid) /* Grab lock for just long enough to set the new limit values */ LWLockAcquire(XidGenLock, LW_EXCLUSIVE); - ShmemVariableCache->oldestXid = oldest_datfrozenxid; - ShmemVariableCache->xidVacLimit = xidVacLimit; - ShmemVariableCache->xidWarnLimit = xidWarnLimit; - ShmemVariableCache->xidStopLimit = xidStopLimit; - ShmemVariableCache->xidWrapLimit = xidWrapLimit; - ShmemVariableCache->oldestXidDB = oldest_datoid; - curXid = XidFromFullTransactionId(ShmemVariableCache->nextXid); + TransamVariables->oldestXid = oldest_datfrozenxid; + TransamVariables->xidVacLimit = xidVacLimit; + TransamVariables->xidWarnLimit = xidWarnLimit; + TransamVariables->xidStopLimit = xidStopLimit; + TransamVariables->xidWrapLimit = xidWrapLimit; + TransamVariables->oldestXidDB = oldest_datoid; + curXid = XidFromFullTransactionId(TransamVariables->nextXid); LWLockRelease(XidGenLock); /* Log the info */ @@ -463,14 +490,14 @@ SetTransactionIdLimit(TransactionId oldest_datfrozenxid, Oid oldest_datoid) (errmsg("database \"%s\" must be vacuumed within %u transactions", oldest_datname, xidWrapLimit - curXid), - errhint("To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" + errhint("To avoid XID assignment failures, execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); else ereport(WARNING, (errmsg("database with OID %u must be vacuumed within %u transactions", oldest_datoid, xidWrapLimit - curXid), - errhint("To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" + errhint("To avoid XID assignment failures, execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots."))); } } @@ -496,10 +523,10 @@ ForceTransactionIdLimitUpdate(void) /* Locking is probably not really necessary, but let's be careful */ LWLockAcquire(XidGenLock, LW_SHARED); - nextXid = XidFromFullTransactionId(ShmemVariableCache->nextXid); - xidVacLimit = ShmemVariableCache->xidVacLimit; - oldestXid = ShmemVariableCache->oldestXid; - oldestXidDB = ShmemVariableCache->oldestXidDB; + nextXid = XidFromFullTransactionId(TransamVariables->nextXid); + xidVacLimit = TransamVariables->xidVacLimit; + oldestXid = TransamVariables->oldestXid; + oldestXidDB = TransamVariables->oldestXidDB; LWLockRelease(XidGenLock); if (!TransactionIdIsNormal(oldestXid)) @@ -549,37 +576,37 @@ GetNewObjectId(void) * available for automatic assignment during initdb, while ensuring they * will never conflict with user-assigned OIDs. */ - if (ShmemVariableCache->nextOid < ((Oid) FirstNormalObjectId)) + if (TransamVariables->nextOid < ((Oid) FirstNormalObjectId)) { if (IsPostmasterEnvironment) { /* wraparound, or first post-initdb assignment, in normal mode */ - ShmemVariableCache->nextOid = FirstNormalObjectId; - ShmemVariableCache->oidCount = 0; + TransamVariables->nextOid = FirstNormalObjectId; + TransamVariables->oidCount = 0; } else { /* we may be bootstrapping, so don't enforce the full range */ - if (ShmemVariableCache->nextOid < ((Oid) FirstGenbkiObjectId)) + if (TransamVariables->nextOid < ((Oid) FirstGenbkiObjectId)) { /* wraparound in standalone mode (unlikely but possible) */ - ShmemVariableCache->nextOid = FirstNormalObjectId; - ShmemVariableCache->oidCount = 0; + TransamVariables->nextOid = FirstNormalObjectId; + TransamVariables->oidCount = 0; } } } /* If we run out of logged for use oids then we must log more */ - if (ShmemVariableCache->oidCount == 0) + if (TransamVariables->oidCount == 0) { - XLogPutNextOid(ShmemVariableCache->nextOid + VAR_OID_PREFETCH); - ShmemVariableCache->oidCount = VAR_OID_PREFETCH; + XLogPutNextOid(TransamVariables->nextOid + VAR_OID_PREFETCH); + TransamVariables->oidCount = VAR_OID_PREFETCH; } - result = ShmemVariableCache->nextOid; + result = TransamVariables->nextOid; - (ShmemVariableCache->nextOid)++; - (ShmemVariableCache->oidCount)--; + (TransamVariables->nextOid)++; + (TransamVariables->oidCount)--; LWLockRelease(OidGenLock); @@ -602,12 +629,12 @@ SetNextObjectId(Oid nextOid) /* Taking the lock is, therefore, just pro forma; but do it anyway */ LWLockAcquire(OidGenLock, LW_EXCLUSIVE); - if (ShmemVariableCache->nextOid > nextOid) + if (TransamVariables->nextOid > nextOid) elog(ERROR, "too late to advance OID counter to %u, it is now %u", - nextOid, ShmemVariableCache->nextOid); + nextOid, TransamVariables->nextOid); - ShmemVariableCache->nextOid = nextOid; - ShmemVariableCache->oidCount = 0; + TransamVariables->nextOid = nextOid; + TransamVariables->oidCount = 0; LWLockRelease(OidGenLock); } @@ -634,7 +661,7 @@ StopGeneratingPinnedObjectIds(void) * Assert that xid is between [oldestXid, nextXid], which is the range we * expect XIDs coming from tables etc to be in. * - * As ShmemVariableCache->oldestXid could change just after this call without + * As TransamVariables->oldestXid could change just after this call without * further precautions, and as a wrapped-around xid could again fall within * the valid range, this assertion can only detect if something is definitely * wrong, but not establish correctness. @@ -669,8 +696,8 @@ AssertTransactionIdInAllowableRange(TransactionId xid) * before we see the updated nextXid value. */ pg_memory_barrier(); - oldest_xid = ShmemVariableCache->oldestXid; - next_xid = XidFromFullTransactionId(ShmemVariableCache->nextXid); + oldest_xid = TransamVariables->oldestXid; + next_xid = XidFromFullTransactionId(TransamVariables->nextXid); Assert(TransactionIdFollowsOrEquals(xid, oldest_xid) || TransactionIdPrecedesOrEquals(xid, next_xid)); diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 8daaa535edf80..4cecf63006043 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -5,7 +5,7 @@ * * See src/backend/access/transam/README for more information. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -51,7 +51,6 @@ #include "replication/origin.h" #include "replication/snapbuild.h" #include "replication/syncrep.h" -#include "replication/walsender.h" #include "storage/condition_variable.h" #include "storage/fd.h" #include "storage/lmgr.h" @@ -62,7 +61,6 @@ #include "storage/sinvaladt.h" #include "storage/smgr.h" #include "utils/builtins.h" -#include "utils/catcache.h" #include "utils/combocid.h" #include "utils/guc.h" #include "utils/inval.h" @@ -145,7 +143,7 @@ typedef enum TransState TRANS_INPROGRESS, /* inside a valid transaction */ TRANS_COMMIT, /* commit in progress */ TRANS_ABORT, /* abort in progress */ - TRANS_PREPARE /* prepare in progress */ + TRANS_PREPARE, /* prepare in progress */ } TransState; /* @@ -180,11 +178,15 @@ typedef enum TBlockState TBLOCK_SUBABORT_END, /* failed subxact, ROLLBACK received */ TBLOCK_SUBABORT_PENDING, /* live subxact, ROLLBACK received */ TBLOCK_SUBRESTART, /* live subxact, ROLLBACK TO received */ - TBLOCK_SUBABORT_RESTART /* failed subxact, ROLLBACK TO received */ + TBLOCK_SUBABORT_RESTART, /* failed subxact, ROLLBACK TO received */ } TBlockState; /* * transaction state structure + * + * Note: parallelModeLevel counts the number of unmatched EnterParallelMode + * calls done at this transaction level. parallelChildXact is true if any + * upper transaction level has nonzero parallelModeLevel. */ typedef struct TransactionStateData { @@ -207,6 +209,7 @@ typedef struct TransactionStateData bool startedInRecovery; /* did we start in recovery? */ bool didLogXid; /* has xid been included in WAL record? */ int parallelModeLevel; /* Enter/ExitParallelMode counter */ + bool parallelChildXact; /* is any parent transaction parallel? */ bool chain; /* start a new block after this one */ bool topXidLogged; /* for a subxact: is top-level XID logged? */ struct TransactionStateData *parent; /* back link to parent */ @@ -343,6 +346,9 @@ static void CommitTransaction(void); static TransactionId RecordTransactionAbort(bool isSubXact); static void StartTransaction(void); +static bool CommitTransactionCommandInternal(void); +static bool AbortCurrentTransactionInternal(void); + static void StartSubTransaction(void); static void CommitSubTransaction(void); static void AbortSubTransaction(void); @@ -600,9 +606,9 @@ GetStableLatestTransactionId(void) static LocalTransactionId lxid = InvalidLocalTransactionId; static TransactionId stablexid = InvalidTransactionId; - if (lxid != MyProc->lxid) + if (lxid != MyProc->vxid.lxid) { - lxid = MyProc->lxid; + lxid = MyProc->vxid.lxid; stablexid = GetTopTransactionIdIfAny(); if (!TransactionIdIsValid(stablexid)) stablexid = ReadNextTransactionId(); @@ -638,7 +644,9 @@ AssignTransactionId(TransactionState s) * operation, so we can't account for new XIDs at this point. */ if (IsInParallelMode() || IsParallelWorker()) - elog(ERROR, "cannot assign XIDs during a parallel operation"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_TRANSACTION_STATE), + errmsg("cannot assign transaction IDs during a parallel operation"))); /* * Ensure parent(s) have XIDs, so that a child always has an XID later @@ -826,7 +834,11 @@ GetCurrentCommandId(bool used) * could relax this restriction when currentCommandIdUsed was already * true at the start of the parallel operation. */ - Assert(!IsParallelWorker()); + if (IsParallelWorker()) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TRANSACTION_STATE), + errmsg("cannot modify data in a parallel worker"))); + currentCommandIdUsed = true; } return currentCommandId; @@ -1051,7 +1063,8 @@ ExitParallelMode(void) TransactionState s = CurrentTransactionState; Assert(s->parallelModeLevel > 0); - Assert(s->parallelModeLevel > 1 || !ParallelContextActive()); + Assert(s->parallelModeLevel > 1 || s->parallelChildXact || + !ParallelContextActive()); --s->parallelModeLevel; } @@ -1064,11 +1077,17 @@ ExitParallelMode(void) * match across all workers. Mere caches usually don't require such a * restriction. State modified in a strict push/pop fashion, such as the * active snapshot stack, is often fine. + * + * We say we are in parallel mode if we are in a subxact of a transaction + * that's initiated a parallel operation; for most purposes that context + * has all the same restrictions. */ bool IsInParallelMode(void) { - return CurrentTransactionState->parallelModeLevel != 0; + TransactionState s = CurrentTransactionState; + + return s->parallelModeLevel != 0 || s->parallelChildXact; } /* @@ -1091,7 +1110,9 @@ CommandCounterIncrement(void) * point. */ if (IsInParallelMode() || IsParallelWorker()) - elog(ERROR, "cannot start commands during a parallel operation"); + ereport(ERROR, + (errcode(ERRCODE_INVALID_TRANSACTION_STATE), + errmsg("cannot start commands during a parallel operation"))); currentCommandId += 1; if (currentCommandId == InvalidCommandId) @@ -1933,7 +1954,7 @@ AtCleanup_Memory(void) * Clear the special abort context for next time. */ if (TransactionAbortContext != NULL) - MemoryContextResetAndDeleteChildren(TransactionAbortContext); + MemoryContextReset(TransactionAbortContext); /* * Release all transaction-local memory. @@ -1969,7 +1990,7 @@ AtSubCleanup_Memory(void) * Clear the special abort context for next time. */ if (TransactionAbortContext != NULL) - MemoryContextResetAndDeleteChildren(TransactionAbortContext); + MemoryContextReset(TransactionAbortContext); /* * Delete the subxact local memory contexts. Its CurTransactionContext can @@ -2084,10 +2105,10 @@ StartTransaction(void) AtStart_ResourceOwner(); /* - * Assign a new LocalTransactionId, and combine it with the backendId to + * Assign a new LocalTransactionId, and combine it with the proc number to * form a virtual transaction id. */ - vxid.backendId = MyBackendId; + vxid.procNumber = MyProcNumber; vxid.localTransactionId = GetNextLocalTransactionId(); /* @@ -2097,10 +2118,11 @@ StartTransaction(void) /* * Advertise it in the proc array. We assume assignment of - * localTransactionId is atomic, and the backendId should be set already. + * localTransactionId is atomic, and the proc number should be set + * already. */ - Assert(MyProc->backendId == vxid.backendId); - MyProc->lxid = vxid.localTransactionId; + Assert(MyProc->vxid.procNumber == vxid.procNumber); + MyProc->vxid.lxid = vxid.localTransactionId; TRACE_POSTGRESQL_TRANSACTION_START(vxid.localTransactionId); @@ -2139,6 +2161,10 @@ StartTransaction(void) */ s->state = TRANS_INPROGRESS; + /* Schedule transaction timeout */ + if (TransactionTimeout > 0) + enable_timeout_after(TRANSACTION_TIMEOUT, TransactionTimeout); + ShowTransactionState("StartTransaction"); } @@ -2204,9 +2230,26 @@ CommitTransaction(void) CallXactCallbacks(is_parallel_worker ? XACT_EVENT_PARALLEL_PRE_COMMIT : XACT_EVENT_PRE_COMMIT); - /* If we might have parallel workers, clean them up now. */ - if (IsInParallelMode()) - AtEOXact_Parallel(true); + /* + * If this xact has started any unfinished parallel operation, clean up + * its workers, warning about leaked resources. (But we don't actually + * reset parallelModeLevel till entering TRANS_COMMIT, a bit below. This + * keeps parallel mode restrictions active as long as possible in a + * parallel worker.) + */ + AtEOXact_Parallel(true); + if (is_parallel_worker) + { + if (s->parallelModeLevel != 1) + elog(WARNING, "parallelModeLevel is %d not 1 at end of parallel worker transaction", + s->parallelModeLevel); + } + else + { + if (s->parallelModeLevel != 0) + elog(WARNING, "parallelModeLevel is %d not 0 at end of transaction", + s->parallelModeLevel); + } /* Shut down the deferred-trigger manager */ AfterTriggerEndXact(true); @@ -2257,6 +2300,11 @@ CommitTransaction(void) */ s->state = TRANS_COMMIT; s->parallelModeLevel = 0; + s->parallelChildXact = false; /* should be false already */ + + /* Disable transaction timeout */ + if (TransactionTimeout > 0) + disable_timeout(TRANSACTION_TIMEOUT, false); if (!is_parallel_worker) { @@ -2281,7 +2329,7 @@ CommitTransaction(void) ParallelWorkerReportLastRecEnd(XactLastRecEnd); } - TRACE_POSTGRESQL_TRANSACTION_COMMIT(MyProc->lxid); + TRACE_POSTGRESQL_TRANSACTION_COMMIT(MyProc->vxid.lxid); /* * Let others know about no transaction in progress by me. Note that this @@ -2309,6 +2357,7 @@ CommitTransaction(void) CallXactCallbacks(is_parallel_worker ? XACT_EVENT_PARALLEL_COMMIT : XACT_EVENT_COMMIT); + CurrentResourceOwner = NULL; ResourceOwnerRelease(TopTransactionResourceOwner, RESOURCE_RELEASE_BEFORE_LOCKS, true, true); @@ -2374,7 +2423,6 @@ CommitTransaction(void) AtEOXact_LogicalRepWorkers(true); pgstat_report_xact_timestamp(0); - CurrentResourceOwner = NULL; ResourceOwnerDelete(TopTransactionResourceOwner); s->curTransactionOwner = NULL; CurTransactionResourceOwner = NULL; @@ -2531,6 +2579,10 @@ PrepareTransaction(void) */ s->state = TRANS_PREPARE; + /* Disable transaction timeout */ + if (TransactionTimeout > 0) + disable_timeout(TRANSACTION_TIMEOUT, false); + prepared_at = GetCurrentTimestamp(); /* @@ -2703,6 +2755,10 @@ AbortTransaction(void) /* Prevent cancel/die interrupt while cleaning up */ HOLD_INTERRUPTS(); + /* Disable transaction timeout */ + if (TransactionTimeout > 0) + disable_timeout(TRANSACTION_TIMEOUT, false); + /* Make sure we have a valid memory context and resource owner */ AtAbort_Memory(); AtAbort_ResourceOwner(); @@ -2786,12 +2842,13 @@ AbortTransaction(void) /* Reset snapshot export state. */ SnapBuildResetExportedSnapshotState(); - /* If in parallel mode, clean up workers and exit parallel mode. */ - if (IsInParallelMode()) - { - AtEOXact_Parallel(false); - s->parallelModeLevel = 0; - } + /* + * If this xact has started any unfinished parallel operation, clean up + * its workers and exit parallel mode. Don't warn about leaked resources. + */ + AtEOXact_Parallel(false); + s->parallelModeLevel = 0; + s->parallelChildXact = false; /* should be false already */ /* * do abort processing @@ -2824,7 +2881,7 @@ AbortTransaction(void) XLogSetAsyncXactLSN(XactLastRecEnd); } - TRACE_POSTGRESQL_TRANSACTION_ABORT(MyProc->lxid); + TRACE_POSTGRESQL_TRANSACTION_ABORT(MyProc->vxid.lxid); /* * Let others know about no transaction in progress by me. Note that this @@ -2919,6 +2976,7 @@ CleanupTransaction(void) s->nChildXids = 0; s->maxChildXids = 0; s->parallelModeLevel = 0; + s->parallelChildXact = false; XactTopFullTransactionId = InvalidFullTransactionId; nParallelCurrentXids = 0; @@ -3026,16 +3084,36 @@ RestoreTransactionCharacteristics(const SavedTransactionCharacteristics *s) XactDeferrable = s->save_XactDeferrable; } - /* - * CommitTransactionCommand + * CommitTransactionCommand -- a wrapper function handling the + * loop over subtransactions to avoid a potentially dangerous recursion + * in CommitTransactionCommandInternal(). */ void CommitTransactionCommand(void) +{ + /* + * Repeatedly call CommitTransactionCommandInternal() until all the work + * is done. + */ + while (!CommitTransactionCommandInternal()) + { + } +} + +/* + * CommitTransactionCommandInternal - a function doing an iteration of work + * regarding handling the commit transaction command. In the case of + * subtransactions more than one iterations could be required. Returns + * true when no more iterations required, false otherwise. + */ +static bool +CommitTransactionCommandInternal(void) { TransactionState s = CurrentTransactionState; SavedTransactionCharacteristics savetc; + /* Must save in case we need to restore below */ SaveTransactionCharacteristics(&savetc); switch (s->blockState) @@ -3222,11 +3300,12 @@ CommitTransactionCommand(void) * The current already-failed subtransaction is ending due to a * ROLLBACK or ROLLBACK TO command, so pop it and recursively * examine the parent (which could be in any of several states). + * As we need to examine the parent, return false to request the + * caller to do the next iteration. */ case TBLOCK_SUBABORT_END: CleanupSubTransaction(); - CommitTransactionCommand(); - break; + return false; /* * As above, but it's not dead yet, so abort first. @@ -3234,8 +3313,7 @@ CommitTransactionCommand(void) case TBLOCK_SUBABORT_PENDING: AbortSubTransaction(); CleanupSubTransaction(); - CommitTransactionCommand(); - break; + return false; /* * The current subtransaction is the target of a ROLLBACK TO @@ -3295,13 +3373,36 @@ CommitTransactionCommand(void) } break; } + + /* Done, no more iterations required */ + return true; } /* - * AbortCurrentTransaction + * AbortCurrentTransaction -- a wrapper function handling the + * loop over subtransactions to avoid potentially dangerous recursion in + * AbortCurrentTransactionInternal(). */ void AbortCurrentTransaction(void) +{ + /* + * Repeatedly call AbortCurrentTransactionInternal() until all the work is + * done. + */ + while (!AbortCurrentTransactionInternal()) + { + } +} + +/* + * AbortCurrentTransactionInternal - a function doing an iteration of work + * regarding handling the current transaction abort. In the case of + * subtransactions more than one iterations could be required. Returns + * true when no more iterations required, false otherwise. + */ +static bool +AbortCurrentTransactionInternal(void) { TransactionState s = CurrentTransactionState; @@ -3429,7 +3530,9 @@ AbortCurrentTransaction(void) /* * If we failed while trying to create a subtransaction, clean up * the broken subtransaction and abort the parent. The same - * applies if we get a failure while ending a subtransaction. + * applies if we get a failure while ending a subtransaction. As + * we need to abort the parent, return false to request the caller + * to do the next iteration. */ case TBLOCK_SUBBEGIN: case TBLOCK_SUBRELEASE: @@ -3438,8 +3541,7 @@ AbortCurrentTransaction(void) case TBLOCK_SUBRESTART: AbortSubTransaction(); CleanupSubTransaction(); - AbortCurrentTransaction(); - break; + return false; /* * Same as above, except the Abort() was already done. @@ -3447,9 +3549,11 @@ AbortCurrentTransaction(void) case TBLOCK_SUBABORT_END: case TBLOCK_SUBABORT_RESTART: CleanupSubTransaction(); - AbortCurrentTransaction(); - break; + return false; } + + /* Done, no more iterations required */ + return true; } /* @@ -4226,7 +4330,7 @@ DefineSavepoint(const char *name) * is TBLOCK_PARALLEL_INPROGRESS, so we can treat that as an invalid case * below.) */ - if (IsInParallelMode()) + if (IsInParallelMode() || IsParallelWorker()) ereport(ERROR, (errcode(ERRCODE_INVALID_TRANSACTION_STATE), errmsg("cannot define savepoints during a parallel operation"))); @@ -4313,7 +4417,7 @@ ReleaseSavepoint(const char *name) * is TBLOCK_PARALLEL_INPROGRESS, so we can treat that as an invalid case * below.) */ - if (IsInParallelMode()) + if (IsInParallelMode() || IsParallelWorker()) ereport(ERROR, (errcode(ERRCODE_INVALID_TRANSACTION_STATE), errmsg("cannot release savepoints during a parallel operation"))); @@ -4422,7 +4526,7 @@ RollbackToSavepoint(const char *name) * is TBLOCK_PARALLEL_INPROGRESS, so we can treat that as an invalid case * below.) */ - if (IsInParallelMode()) + if (IsInParallelMode() || IsParallelWorker()) ereport(ERROR, (errcode(ERRCODE_INVALID_TRANSACTION_STATE), errmsg("cannot rollback to savepoints during a parallel operation"))); @@ -4528,38 +4632,40 @@ RollbackToSavepoint(const char *name) /* * BeginInternalSubTransaction * This is the same as DefineSavepoint except it allows TBLOCK_STARTED, - * TBLOCK_IMPLICIT_INPROGRESS, TBLOCK_END, and TBLOCK_PREPARE states, - * and therefore it can safely be used in functions that might be called - * when not inside a BEGIN block or when running deferred triggers at - * COMMIT/PREPARE time. Also, it automatically does - * CommitTransactionCommand/StartTransactionCommand instead of expecting - * the caller to do it. + * TBLOCK_IMPLICIT_INPROGRESS, TBLOCK_PARALLEL_INPROGRESS, TBLOCK_END, + * and TBLOCK_PREPARE states, and therefore it can safely be used in + * functions that might be called when not inside a BEGIN block or when + * running deferred triggers at COMMIT/PREPARE time. Also, it + * automatically does CommitTransactionCommand/StartTransactionCommand + * instead of expecting the caller to do it. */ void BeginInternalSubTransaction(const char *name) { TransactionState s = CurrentTransactionState; + bool save_ExitOnAnyError = ExitOnAnyError; /* - * Workers synchronize transaction state at the beginning of each parallel - * operation, so we can't account for new subtransactions after that - * point. We might be able to make an exception for the type of - * subtransaction established by this function, which is typically used in - * contexts where we're going to release or roll back the subtransaction - * before proceeding further, so that no enduring change to the - * transaction state occurs. For now, however, we prohibit this case along - * with all the others. - */ - if (IsInParallelMode()) - ereport(ERROR, - (errcode(ERRCODE_INVALID_TRANSACTION_STATE), - errmsg("cannot start subtransactions during a parallel operation"))); + * Errors within this function are improbable, but if one does happen we + * force a FATAL exit. Callers generally aren't prepared to handle losing + * control, and moreover our transaction state is probably corrupted if we + * fail partway through; so an ordinary ERROR longjmp isn't okay. + */ + ExitOnAnyError = true; + + /* + * We do not check for parallel mode here. It's permissible to start and + * end "internal" subtransactions while in parallel mode, so long as no + * new XIDs or command IDs are assigned. Enforcement of that occurs in + * AssignTransactionId() and CommandCounterIncrement(). + */ switch (s->blockState) { case TBLOCK_STARTED: case TBLOCK_INPROGRESS: case TBLOCK_IMPLICIT_INPROGRESS: + case TBLOCK_PARALLEL_INPROGRESS: case TBLOCK_END: case TBLOCK_PREPARE: case TBLOCK_SUBINPROGRESS: @@ -4578,7 +4684,6 @@ BeginInternalSubTransaction(const char *name) /* These cases are invalid. */ case TBLOCK_DEFAULT: case TBLOCK_BEGIN: - case TBLOCK_PARALLEL_INPROGRESS: case TBLOCK_SUBBEGIN: case TBLOCK_SUBRELEASE: case TBLOCK_SUBCOMMIT: @@ -4597,6 +4702,8 @@ BeginInternalSubTransaction(const char *name) CommitTransactionCommand(); StartTransactionCommand(); + + ExitOnAnyError = save_ExitOnAnyError; } /* @@ -4612,16 +4719,10 @@ ReleaseCurrentSubTransaction(void) TransactionState s = CurrentTransactionState; /* - * Workers synchronize transaction state at the beginning of each parallel - * operation, so we can't account for commit of subtransactions after that - * point. This should not happen anyway. Code calling this would - * typically have called BeginInternalSubTransaction() first, failing - * there. + * We do not check for parallel mode here. It's permissible to start and + * end "internal" subtransactions while in parallel mode, so long as no + * new XIDs or command IDs are assigned. */ - if (IsInParallelMode()) - ereport(ERROR, - (errcode(ERRCODE_INVALID_TRANSACTION_STATE), - errmsg("cannot commit subtransactions during a parallel operation"))); if (s->blockState != TBLOCK_SUBINPROGRESS) elog(ERROR, "ReleaseCurrentSubTransaction: unexpected state %s", @@ -4646,11 +4747,9 @@ RollbackAndReleaseCurrentSubTransaction(void) TransactionState s = CurrentTransactionState; /* - * Unlike ReleaseCurrentSubTransaction(), this is nominally permitted - * during parallel operations. That's because we may be in the leader, - * recovering from an error thrown while we were in parallel mode. We - * won't reach here in a worker, because BeginInternalSubTransaction() - * will have failed. + * We do not check for parallel mode here. It's permissible to start and + * end "internal" subtransactions while in parallel mode, so long as no + * new XIDs or command IDs are assigned. */ switch (s->blockState) @@ -4697,6 +4796,7 @@ RollbackAndReleaseCurrentSubTransaction(void) Assert(s->blockState == TBLOCK_SUBINPROGRESS || s->blockState == TBLOCK_INPROGRESS || s->blockState == TBLOCK_IMPLICIT_INPROGRESS || + s->blockState == TBLOCK_PARALLEL_INPROGRESS || s->blockState == TBLOCK_STARTED); } @@ -4960,10 +5060,15 @@ CommitSubTransaction(void) CallSubXactCallbacks(SUBXACT_EVENT_PRE_COMMIT_SUB, s->subTransactionId, s->parent->subTransactionId); - /* If in parallel mode, clean up workers and exit parallel mode. */ - if (IsInParallelMode()) + /* + * If this subxact has started any unfinished parallel operation, clean up + * its workers and exit parallel mode. Warn about leaked resources. + */ + AtEOSubXact_Parallel(true, s->subTransactionId); + if (s->parallelModeLevel != 0) { - AtEOSubXact_Parallel(true, s->subTransactionId); + elog(WARNING, "parallelModeLevel is %d not 0 at end of subtransaction", + s->parallelModeLevel); s->parallelModeLevel = 0; } @@ -5136,12 +5241,12 @@ AbortSubTransaction(void) * exports are not supported in subtransactions. */ - /* Exit from parallel mode, if necessary. */ - if (IsInParallelMode()) - { - AtEOSubXact_Parallel(false, s->subTransactionId); - s->parallelModeLevel = 0; - } + /* + * If this subxact has started any unfinished parallel operation, clean up + * its workers and exit parallel mode. Don't warn about leaked resources. + */ + AtEOSubXact_Parallel(false, s->subTransactionId); + s->parallelModeLevel = 0; /* * We can skip all this stuff if the subxact failed before creating a @@ -5171,6 +5276,7 @@ AbortSubTransaction(void) ResourceOwnerRelease(s->curTransactionOwner, RESOURCE_RELEASE_BEFORE_LOCKS, false, false); + AtEOSubXact_RelationCache(false, s->subTransactionId, s->parent->subTransactionId); AtEOSubXact_Inval(false); @@ -5284,7 +5390,9 @@ PushTransaction(void) s->blockState = TBLOCK_SUBBEGIN; GetUserIdAndSecContext(&s->prevUser, &s->prevSecContext); s->prevXactReadOnly = XactReadOnly; + s->startedInRecovery = p->startedInRecovery; s->parallelModeLevel = 0; + s->parallelChildXact = (p->parallelModeLevel != 0 || p->parallelChildXact); s->topXidLogged = false; CurrentTransactionState = s; @@ -5491,8 +5599,22 @@ ShowTransactionStateRec(const char *str, TransactionState s) { StringInfoData buf; - initStringInfo(&buf); + if (s->parent) + { + /* + * Since this function recurses, it could be driven to stack overflow. + * This is just a debugging aid, so we can leave out some details + * instead of erroring out with check_stack_depth(). + */ + if (stack_is_too_deep()) + ereport(DEBUG5, + (errmsg_internal("%s(%d): parent omitted to avoid stack overflow", + str, s->nestingLevel))); + else + ShowTransactionStateRec(str, s->parent); + } + initStringInfo(&buf); if (s->nChildXids > 0) { int i; @@ -5501,10 +5623,6 @@ ShowTransactionStateRec(const char *str, TransactionState s) for (i = 1; i < s->nChildXids; i++) appendStringInfo(&buf, " %u", s->childXids[i]); } - - if (s->parent) - ShowTransactionStateRec(str, s->parent); - ereport(DEBUG5, (errmsg_internal("%s(%d) name: %s; blockState: %s; state: %s, xid/subid/cid: %u/%u/%u%s%s", str, s->nestingLevel, @@ -5516,7 +5634,6 @@ ShowTransactionStateRec(const char *str, TransactionState s) (unsigned int) currentCommandId, currentCommandIdUsed ? " (used)" : "", buf.data))); - pfree(buf.data); } diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 8b0710abe6037..c1dd8b543289c 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -28,7 +28,7 @@ * the current system state, and for starting/stopping backups. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/xlog.c @@ -59,7 +59,6 @@ #include "access/xlog_internal.h" #include "access/xlogarchive.h" #include "access/xloginsert.h" -#include "access/xlogprefetcher.h" #include "access/xlogreader.h" #include "access/xlogrecovery.h" #include "access/xlogutils.h" @@ -77,8 +76,8 @@ #include "port/pg_iovec.h" #include "postmaster/bgwriter.h" #include "postmaster/startup.h" +#include "postmaster/walsummarizer.h" #include "postmaster/walwriter.h" -#include "replication/logical.h" #include "replication/origin.h" #include "replication/slot.h" #include "replication/snapbuild.h" @@ -89,20 +88,19 @@ #include "storage/ipc.h" #include "storage/large_object.h" #include "storage/latch.h" -#include "storage/pmsignal.h" #include "storage/predicate.h" #include "storage/proc.h" #include "storage/procarray.h" #include "storage/reinit.h" -#include "storage/smgr.h" +#include "storage/sinvaladt.h" #include "storage/spin.h" #include "storage/sync.h" #include "utils/guc_hooks.h" #include "utils/guc_tables.h" +#include "utils/injection_point.h" #include "utils/memutils.h" #include "utils/ps_status.h" #include "utils/relmapper.h" -#include "utils/pg_rusage.h" #include "utils/snapmgr.h" #include "utils/timeout.h" #include "utils/timestamp.h" @@ -130,7 +128,7 @@ bool *wal_consistency_checking = NULL; bool wal_init_zero = true; bool wal_recycle = true; bool log_checkpoints = true; -int sync_method = DEFAULT_SYNC_METHOD; +int wal_sync_method = DEFAULT_WAL_SYNC_METHOD; int wal_level = WAL_LEVEL_REPLICA; int CommitDelay = 0; /* precommit delay in microseconds */ int CommitSiblings = 5; /* # concurrent xacts needed to sleep */ @@ -171,17 +169,17 @@ static bool check_wal_consistency_checking_deferred = false; /* * GUC support */ -const struct config_enum_entry sync_method_options[] = { - {"fsync", SYNC_METHOD_FSYNC, false}, +const struct config_enum_entry wal_sync_method_options[] = { + {"fsync", WAL_SYNC_METHOD_FSYNC, false}, #ifdef HAVE_FSYNC_WRITETHROUGH - {"fsync_writethrough", SYNC_METHOD_FSYNC_WRITETHROUGH, false}, + {"fsync_writethrough", WAL_SYNC_METHOD_FSYNC_WRITETHROUGH, false}, #endif - {"fdatasync", SYNC_METHOD_FDATASYNC, false}, + {"fdatasync", WAL_SYNC_METHOD_FDATASYNC, false}, #ifdef O_SYNC - {"open_sync", SYNC_METHOD_OPEN, false}, + {"open_sync", WAL_SYNC_METHOD_OPEN, false}, #endif #ifdef O_DSYNC - {"open_datasync", SYNC_METHOD_OPEN_DSYNC, false}, + {"open_datasync", WAL_SYNC_METHOD_OPEN_DSYNC, false}, #endif {NULL, 0, false} }; @@ -293,16 +291,10 @@ static bool doPageWrites; * * LogwrtRqst indicates a byte position that we need to write and/or fsync * the log up to (all records before that point must be written or fsynced). - * LogwrtResult indicates the byte positions we have already written/fsynced. - * These structs are identical but are declared separately to indicate their - * slightly different functions. - * - * To read XLogCtl->LogwrtResult, you must hold either info_lck or - * WALWriteLock. To update it, you need to hold both locks. The point of - * this arrangement is that the value can be examined by code that already - * holds WALWriteLock without needing to grab info_lck as well. In addition - * to the shared variable, each backend has a private copy of LogwrtResult, - * which is updated when convenient. + * The positions already written/fsynced are maintained in logWriteResult + * and logFlushResult using atomic access. + * In addition to the shared variable, each backend has a private copy of + * both in LogwrtResult, which is updated when convenient. * * The request bookkeeping is simpler: there is a shared XLogCtl->LogwrtRqst * (protected by info_lck), but we don't need to cache any copies of it. @@ -376,7 +368,7 @@ typedef struct XLogwrtResult typedef struct { LWLock lock; - XLogRecPtr insertingAt; + pg_atomic_uint64 insertingAt; XLogRecPtr lastImportantAt; } WALInsertLock; @@ -469,19 +461,17 @@ typedef struct XLogCtlData XLogSegNo lastRemovedSegNo; /* latest removed/recycled XLOG segment */ - /* Fake LSN counter, for unlogged relations. Protected by ulsn_lck. */ - XLogRecPtr unloggedLSN; - slock_t ulsn_lck; + /* Fake LSN counter, for unlogged relations. */ + pg_atomic_uint64 unloggedLSN; /* Time and LSN of last xlog segment switch. Protected by WALWriteLock. */ pg_time_t lastSegSwitchTime; XLogRecPtr lastSegSwitchLSN; - /* - * Protected by info_lck and WALWriteLock (you must hold either lock to - * read it, but both to update) - */ - XLogwrtResult LogwrtResult; + /* These are accessed using atomics -- info_lck not needed */ + pg_atomic_uint64 logInsertResult; /* last byte + 1 inserted to buffers */ + pg_atomic_uint64 logWriteResult; /* last byte + 1 written out */ + pg_atomic_uint64 logFlushResult; /* last byte + 1 flushed */ /* * Latest initialized page in the cache (last byte position + 1). @@ -501,7 +491,7 @@ typedef struct XLogCtlData * WALBufMappingLock. */ char *pages; /* buffers for unwritten XLOG pages */ - XLogRecPtr *xlblocks; /* 1st byte ptr-s + XLOG_BLCKSZ */ + pg_atomic_uint64 *xlblocks; /* 1st byte ptr-s + XLOG_BLCKSZ */ int XLogCacheBlck; /* highest allocated xlog buffer index */ /* @@ -511,6 +501,11 @@ typedef struct XLogCtlData * If we create a new timeline when the system was started up, * PrevTimeLineID is the old timeline's ID that we forked off from. * Otherwise it's equal to InsertTimeLineID. + * + * We set these fields while holding info_lck. Most that reads these + * values knows that recovery is no longer in progress and so can safely + * read the value without a lock, but code that could be run either during + * or after recovery can take info_lck while reading these values. */ TimeLineID InsertTimeLineID; TimeLineID PrevTimeLineID; @@ -559,6 +554,16 @@ typedef struct XLogCtlData slock_t info_lck; /* locks shared variables shown above */ } XLogCtlData; +/* + * Classification of XLogRecordInsert operations. + */ +typedef enum +{ + WALINSERT_NORMAL, + WALINSERT_SPECIAL_SWITCH, + WALINSERT_SPECIAL_CHECKPOINT +} WalInsertClass; + static XLogCtlData *XLogCtl = NULL; /* a private copy of XLogCtl->Insert.WALInsertLocks, for convenience */ @@ -607,6 +612,19 @@ static int UsableBytesInSegment; */ static XLogwrtResult LogwrtResult = {0, 0}; +/* + * Update local copy of shared XLogCtl->log{Write,Flush}Result + * + * It's critical that Flush always trails Write, so the order of the reads is + * important, as is the barrier. See also XLogWrite. + */ +#define RefreshXLogWriteResult(_target) \ + do { \ + _target.Flush = pg_atomic_read_u64(&XLogCtl->logFlushResult); \ + pg_read_barrier(); \ + _target.Write = pg_atomic_read_u64(&XLogCtl->logWriteResult); \ + } while (0) + /* * openLogFile is -1 or a kernel FD for an open log file segment. * openLogSegNo identifies the segment, and openLogTLI the corresponding TLI. @@ -739,13 +757,21 @@ XLogInsertRecord(XLogRecData *rdata, bool inserted; XLogRecord *rechdr = (XLogRecord *) rdata->data; uint8 info = rechdr->xl_info & ~XLR_INFO_MASK; - bool isLogSwitch = (rechdr->xl_rmid == RM_XLOG_ID && - info == XLOG_SWITCH); + WalInsertClass class = WALINSERT_NORMAL; XLogRecPtr StartPos; XLogRecPtr EndPos; bool prevDoPageWrites = doPageWrites; TimeLineID insertTLI; + /* Does this record type require special handling? */ + if (unlikely(rechdr->xl_rmid == RM_XLOG_ID)) + { + if (info == XLOG_SWITCH) + class = WALINSERT_SPECIAL_SWITCH; + else if (info == XLOG_CHECKPOINT_REDO) + class = WALINSERT_SPECIAL_CHECKPOINT; + } + /* we assume that all of the record header is in the first chunk */ Assert(rdata->len >= SizeOfXLogRecord); @@ -792,57 +818,90 @@ XLogInsertRecord(XLogRecData *rdata, *---------- */ START_CRIT_SECTION(); - if (isLogSwitch) - WALInsertLockAcquireExclusive(); - else - WALInsertLockAcquire(); - /* - * Check to see if my copy of RedoRecPtr is out of date. If so, may have - * to go back and have the caller recompute everything. This can only - * happen just after a checkpoint, so it's better to be slow in this case - * and fast otherwise. - * - * Also check to see if fullPageWrites was just turned on or there's a - * running backup (which forces full-page writes); if we weren't already - * doing full-page writes then go back and recompute. - * - * If we aren't doing full-page writes then RedoRecPtr doesn't actually - * affect the contents of the XLOG record, so we'll update our local copy - * but not force a recomputation. (If doPageWrites was just turned off, - * we could recompute the record without full pages, but we choose not to - * bother.) - */ - if (RedoRecPtr != Insert->RedoRecPtr) + if (likely(class == WALINSERT_NORMAL)) { - Assert(RedoRecPtr < Insert->RedoRecPtr); - RedoRecPtr = Insert->RedoRecPtr; - } - doPageWrites = (Insert->fullPageWrites || Insert->runningBackups > 0); + WALInsertLockAcquire(); - if (doPageWrites && - (!prevDoPageWrites || - (fpw_lsn != InvalidXLogRecPtr && fpw_lsn <= RedoRecPtr))) - { /* - * Oops, some buffer now needs to be backed up that the caller didn't - * back up. Start over. + * Check to see if my copy of RedoRecPtr is out of date. If so, may + * have to go back and have the caller recompute everything. This can + * only happen just after a checkpoint, so it's better to be slow in + * this case and fast otherwise. + * + * Also check to see if fullPageWrites was just turned on or there's a + * running backup (which forces full-page writes); if we weren't + * already doing full-page writes then go back and recompute. + * + * If we aren't doing full-page writes then RedoRecPtr doesn't + * actually affect the contents of the XLOG record, so we'll update + * our local copy but not force a recomputation. (If doPageWrites was + * just turned off, we could recompute the record without full pages, + * but we choose not to bother.) */ - WALInsertLockRelease(); - END_CRIT_SECTION(); - return InvalidXLogRecPtr; - } + if (RedoRecPtr != Insert->RedoRecPtr) + { + Assert(RedoRecPtr < Insert->RedoRecPtr); + RedoRecPtr = Insert->RedoRecPtr; + } + doPageWrites = (Insert->fullPageWrites || Insert->runningBackups > 0); - /* - * Reserve space for the record in the WAL. This also sets the xl_prev - * pointer. - */ - if (isLogSwitch) + if (doPageWrites && + (!prevDoPageWrites || + (fpw_lsn != InvalidXLogRecPtr && fpw_lsn <= RedoRecPtr))) + { + /* + * Oops, some buffer now needs to be backed up that the caller + * didn't back up. Start over. + */ + WALInsertLockRelease(); + END_CRIT_SECTION(); + return InvalidXLogRecPtr; + } + + /* + * Reserve space for the record in the WAL. This also sets the xl_prev + * pointer. + */ + ReserveXLogInsertLocation(rechdr->xl_tot_len, &StartPos, &EndPos, + &rechdr->xl_prev); + + /* Normal records are always inserted. */ + inserted = true; + } + else if (class == WALINSERT_SPECIAL_SWITCH) + { + /* + * In order to insert an XLOG_SWITCH record, we need to hold all of + * the WAL insertion locks, not just one, so that no one else can + * begin inserting a record until we've figured out how much space + * remains in the current WAL segment and claimed all of it. + * + * Nonetheless, this case is simpler than the normal cases handled + * below, which must check for changes in doPageWrites and RedoRecPtr. + * Those checks are only needed for records that can contain buffer + * references, and an XLOG_SWITCH record never does. + */ + Assert(fpw_lsn == InvalidXLogRecPtr); + WALInsertLockAcquireExclusive(); inserted = ReserveXLogSwitch(&StartPos, &EndPos, &rechdr->xl_prev); + } else { + Assert(class == WALINSERT_SPECIAL_CHECKPOINT); + + /* + * We need to update both the local and shared copies of RedoRecPtr, + * which means that we need to hold all the WAL insertion locks. + * However, there can't be any buffer references, so as above, we need + * not check RedoRecPtr before inserting the record; we just need to + * update it afterwards. + */ + Assert(fpw_lsn == InvalidXLogRecPtr); + WALInsertLockAcquireExclusive(); ReserveXLogInsertLocation(rechdr->xl_tot_len, &StartPos, &EndPos, &rechdr->xl_prev); + RedoRecPtr = Insert->RedoRecPtr = StartPos; inserted = true; } @@ -861,7 +920,8 @@ XLogInsertRecord(XLogRecData *rdata, * All the record data, including the header, is now ready to be * inserted. Copy the record in the space reserved. */ - CopyXLogRecordToWAL(rechdr->xl_tot_len, isLogSwitch, rdata, + CopyXLogRecordToWAL(rechdr->xl_tot_len, + class == WALINSERT_SPECIAL_SWITCH, rdata, StartPos, EndPos, insertTLI); /* @@ -910,9 +970,8 @@ XLogInsertRecord(XLogRecData *rdata, /* advance global request to include new block(s) */ if (XLogCtl->LogwrtRqst.Write < EndPos) XLogCtl->LogwrtRqst.Write = EndPos; - /* update local result copy while I have the chance */ - LogwrtResult = XLogCtl->LogwrtResult; SpinLockRelease(&XLogCtl->info_lck); + RefreshXLogWriteResult(LogwrtResult); } /* @@ -920,7 +979,7 @@ XLogInsertRecord(XLogRecData *rdata, * padding space that fills the rest of the segment, and perform * end-of-segment actions (eg, notifying archiver). */ - if (isLogSwitch) + if (class == WALINSERT_SPECIAL_SWITCH) { TRACE_POSTGRESQL_WAL_SWITCH(); XLogFlush(EndPos); @@ -977,8 +1036,10 @@ XLogInsertRecord(XLogRecData *rdata, if (!debug_reader) debug_reader = XLogReaderAllocate(wal_segment_size, NULL, - XL_ROUTINE(), NULL); - + XL_ROUTINE(.page_read = NULL, + .segment_open = NULL, + .segment_close = NULL), + NULL); if (!debug_reader) { appendStringInfoString(&buf, "error decoding record: out of memory while allocating a WAL reading processor"); @@ -1039,8 +1100,12 @@ XLogInsertRecord(XLogRecData *rdata, * * NB: The space calculation here must match the code in CopyXLogRecordToWAL, * where we actually copy the record to the reserved space. + * + * NB: Testing shows that XLogInsertRecord runs faster if this code is inlined; + * however, because there are two call sites, the compiler is reluctant to + * inline. We use pg_attribute_always_inline here to try to convince it. */ -static void +static pg_attribute_always_inline void ReserveXLogInsertLocation(int size, XLogRecPtr *StartPos, XLogRecPtr *EndPos, XLogRecPtr *PrevPtr) { @@ -1295,7 +1360,9 @@ CopyXLogRecordToWAL(int write_len, bool isLogSwitch, XLogRecData *rdata, } if (CurrPos != EndPos) - elog(PANIC, "space reserved for WAL record does not match what was written"); + ereport(PANIC, + errcode(ERRCODE_DATA_CORRUPTED), + errmsg_internal("space reserved for WAL record does not match what was written")); } /* @@ -1320,7 +1387,7 @@ WALInsertLockAcquire(void) static int lockToTry = -1; if (lockToTry == -1) - lockToTry = MyProc->pgprocno % NUM_XLOGINSERT_LOCKS; + lockToTry = MyProcNumber % NUM_XLOGINSERT_LOCKS; MyLockNo = lockToTry; /* @@ -1438,6 +1505,7 @@ static XLogRecPtr WaitXLogInsertionsToFinish(XLogRecPtr upto) { uint64 bytepos; + XLogRecPtr inserted; XLogRecPtr reservedUpto; XLogRecPtr finishedUpto; XLogCtlInsert *Insert = &XLogCtl->Insert; @@ -1446,6 +1514,14 @@ WaitXLogInsertionsToFinish(XLogRecPtr upto) if (MyProc == NULL) elog(PANIC, "cannot wait without a PGPROC structure"); + /* + * Check if there's any work to do. Use a barrier to ensure we get the + * freshest value. + */ + inserted = pg_atomic_read_membarrier_u64(&XLogCtl->logInsertResult); + if (upto <= inserted) + return inserted; + /* Read the current insert position */ SpinLockAcquire(&Insert->insertpos_lck); bytepos = Insert->CurrBytePos; @@ -1495,6 +1571,17 @@ WaitXLogInsertionsToFinish(XLogRecPtr upto) * calling LWLockUpdateVar. But if it has to sleep, it will * advertise the insertion point with LWLockUpdateVar before * sleeping. + * + * In this loop we are only waiting for insertions that started + * before WaitXLogInsertionsToFinish was called. The lack of + * memory barriers in the loop means that we might see locks as + * "unused" that have since become used. This is fine because + * they only can be used for later insertions that we would not + * want to wait on anyway. Not taking a lock to acquire the + * current insertingAt value means that we might see older + * insertingAt values. This is also fine, because if we read a + * value too old, we will add ourselves to the wait queue, which + * contains atomic operations. */ if (LWLockWaitForVar(&WALInsertLocks[i].l.lock, &WALInsertLocks[i].l.insertingAt, @@ -1514,6 +1601,15 @@ WaitXLogInsertionsToFinish(XLogRecPtr upto) if (insertingat != InvalidXLogRecPtr && insertingat < finishedUpto) finishedUpto = insertingat; } + + /* + * Advance the limit we know to have been inserted and return the freshest + * value we know of, which might be beyond what we requested if somebody + * is concurrently doing this with an 'upto' pointer ahead of us. + */ + finishedUpto = pg_atomic_monotonic_advance_u64(&XLogCtl->logInsertResult, + finishedUpto); + return finishedUpto; } @@ -1567,20 +1663,16 @@ GetXLogBuffer(XLogRecPtr ptr, TimeLineID tli) * out to disk and evicted, and the caller is responsible for making sure * that doesn't happen. * - * However, we don't hold a lock while we read the value. If someone has - * just initialized the page, it's possible that we get a "torn read" of - * the XLogRecPtr if 64-bit fetches are not atomic on this platform. In - * that case we will see a bogus value. That's ok, we'll grab the mapping - * lock (in AdvanceXLInsertBuffer) and retry if we see anything else than - * the page we're looking for. But it means that when we do this unlocked - * read, we might see a value that appears to be ahead of the page we're - * looking for. Don't PANIC on that, until we've verified the value while - * holding the lock. + * We don't hold a lock while we read the value. If someone is just about + * to initialize or has just initialized the page, it's possible that we + * get InvalidXLogRecPtr. That's ok, we'll grab the mapping lock (in + * AdvanceXLInsertBuffer) and retry if we see anything other than the page + * we're looking for. */ expectedEndPtr = ptr; expectedEndPtr += XLOG_BLCKSZ - ptr % XLOG_BLCKSZ; - endptr = XLogCtl->xlblocks[idx]; + endptr = pg_atomic_read_u64(&XLogCtl->xlblocks[idx]); if (expectedEndPtr != endptr) { XLogRecPtr initializedUpto; @@ -1611,7 +1703,7 @@ GetXLogBuffer(XLogRecPtr ptr, TimeLineID tli) WALInsertLockUpdateInsertingAt(initializedUpto); AdvanceXLInsertBuffer(ptr, tli, false); - endptr = XLogCtl->xlblocks[idx]; + endptr = pg_atomic_read_u64(&XLogCtl->xlblocks[idx]); if (expectedEndPtr != endptr) elog(PANIC, "could not find WAL buffer for %X/%X", @@ -1639,6 +1731,125 @@ GetXLogBuffer(XLogRecPtr ptr, TimeLineID tli) return cachedPos + ptr % XLOG_BLCKSZ; } +/* + * Read WAL data directly from WAL buffers, if available. Returns the number + * of bytes read successfully. + * + * Fewer than 'count' bytes may be read if some of the requested WAL data has + * already been evicted. + * + * No locks are taken. + * + * Caller should ensure that it reads no further than LogwrtResult.Write + * (which should have been updated by the caller when determining how far to + * read). The 'tli' argument is only used as a convenient safety check so that + * callers do not read from WAL buffers on a historical timeline. + */ +Size +WALReadFromBuffers(char *dstbuf, XLogRecPtr startptr, Size count, + TimeLineID tli) +{ + char *pdst = dstbuf; + XLogRecPtr recptr = startptr; + XLogRecPtr inserted; + Size nbytes = count; + + if (RecoveryInProgress() || tli != GetWALInsertionTimeLine()) + return 0; + + Assert(!XLogRecPtrIsInvalid(startptr)); + + /* + * Caller should ensure that the requested data has been inserted into WAL + * buffers before we try to read it. + */ + inserted = pg_atomic_read_u64(&XLogCtl->logInsertResult); + if (startptr + count > inserted) + ereport(ERROR, + errmsg("cannot read past end of generated WAL: requested %X/%X, current position %X/%X", + LSN_FORMAT_ARGS(startptr + count), + LSN_FORMAT_ARGS(inserted))); + + /* + * Loop through the buffers without a lock. For each buffer, atomically + * read and verify the end pointer, then copy the data out, and finally + * re-read and re-verify the end pointer. + * + * Once a page is evicted, it never returns to the WAL buffers, so if the + * end pointer matches the expected end pointer before and after we copy + * the data, then the right page must have been present during the data + * copy. Read barriers are necessary to ensure that the data copy actually + * happens between the two verification steps. + * + * If either verification fails, we simply terminate the loop and return + * with the data that had been already copied out successfully. + */ + while (nbytes > 0) + { + uint32 offset = recptr % XLOG_BLCKSZ; + int idx = XLogRecPtrToBufIdx(recptr); + XLogRecPtr expectedEndPtr; + XLogRecPtr endptr; + const char *page; + const char *psrc; + Size npagebytes; + + /* + * Calculate the end pointer we expect in the xlblocks array if the + * correct page is present. + */ + expectedEndPtr = recptr + (XLOG_BLCKSZ - offset); + + /* + * First verification step: check that the correct page is present in + * the WAL buffers. + */ + endptr = pg_atomic_read_u64(&XLogCtl->xlblocks[idx]); + if (expectedEndPtr != endptr) + break; + + /* + * The correct page is present (or was at the time the endptr was + * read; must re-verify later). Calculate pointer to source data and + * determine how much data to read from this page. + */ + page = XLogCtl->pages + idx * (Size) XLOG_BLCKSZ; + psrc = page + offset; + npagebytes = Min(nbytes, XLOG_BLCKSZ - offset); + + /* + * Ensure that the data copy and the first verification step are not + * reordered. + */ + pg_read_barrier(); + + /* data copy */ + memcpy(pdst, psrc, npagebytes); + + /* + * Ensure that the data copy and the second verification step are not + * reordered. + */ + pg_read_barrier(); + + /* + * Second verification step: check that the page we read from wasn't + * evicted while we were copying the data. + */ + endptr = pg_atomic_read_u64(&XLogCtl->xlblocks[idx]); + if (expectedEndPtr != endptr) + break; + + pdst += npagebytes; + recptr += npagebytes; + nbytes -= npagebytes; + } + + Assert(pdst - dstbuf <= count); + + return pdst - dstbuf; +} + /* * Converts a "usable byte position" to XLogRecPtr. A usable byte position * is the position starting from the beginning of WAL, excluding all WAL @@ -1798,7 +2009,7 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli, bool opportunistic) * be zero if the buffer hasn't been used yet). Fall through if it's * already written out. */ - OldPageRqstPtr = XLogCtl->xlblocks[nextidx]; + OldPageRqstPtr = pg_atomic_read_u64(&XLogCtl->xlblocks[nextidx]); if (LogwrtResult.Write < OldPageRqstPtr) { /* @@ -1808,17 +2019,17 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli, bool opportunistic) if (opportunistic) break; - /* Before waiting, get info_lck and update LogwrtResult */ + /* Advance shared memory write request position */ SpinLockAcquire(&XLogCtl->info_lck); if (XLogCtl->LogwrtRqst.Write < OldPageRqstPtr) XLogCtl->LogwrtRqst.Write = OldPageRqstPtr; - LogwrtResult = XLogCtl->LogwrtResult; SpinLockRelease(&XLogCtl->info_lck); /* - * Now that we have an up-to-date LogwrtResult value, see if we - * still need to write it or if someone else already did. + * Acquire an up-to-date LogwrtResult value and see if we still + * need to write it or if someone else already did. */ + RefreshXLogWriteResult(LogwrtResult); if (LogwrtResult.Write < OldPageRqstPtr) { /* @@ -1833,7 +2044,7 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli, bool opportunistic) LWLockAcquire(WALWriteLock, LW_EXCLUSIVE); - LogwrtResult = XLogCtl->LogwrtResult; + RefreshXLogWriteResult(LogwrtResult); if (LogwrtResult.Write >= OldPageRqstPtr) { /* OK, someone wrote it already */ @@ -1867,6 +2078,14 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli, bool opportunistic) NewPage = (XLogPageHeader) (XLogCtl->pages + nextidx * (Size) XLOG_BLCKSZ); + /* + * Mark the xlblock with InvalidXLogRecPtr and issue a write barrier + * before initializing. Otherwise, the old page may be partially + * zeroed but look valid. + */ + pg_atomic_write_u64(&XLogCtl->xlblocks[nextidx], InvalidXLogRecPtr); + pg_write_barrier(); + /* * Be sure to re-zero the buffer so that bytes beyond what we've * written will look like zeroes and not valid XLOG records... @@ -1920,8 +2139,7 @@ AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli, bool opportunistic) */ pg_write_barrier(); - *((volatile XLogRecPtr *) &XLogCtl->xlblocks[nextidx]) = NewPageEndPtr; - + pg_atomic_write_u64(&XLogCtl->xlblocks[nextidx], NewPageEndPtr); XLogCtl->InitializedUpTo = NewPageEndPtr; npages++; @@ -1984,6 +2202,37 @@ assign_checkpoint_completion_target(double newval, void *extra) CalculateCheckpointSegments(); } +bool +check_wal_segment_size(int *newval, void **extra, GucSource source) +{ + if (!IsValidWalSegSize(*newval)) + { + GUC_check_errdetail("The WAL segment size must be a power of two between 1 MB and 1 GB."); + return false; + } + + return true; +} + +/* + * GUC check_hook for max_slot_wal_keep_size + * + * We don't allow the value of max_slot_wal_keep_size other than -1 during the + * binary upgrade. See start_postmaster() in pg_upgrade for more details. + */ +bool +check_max_slot_wal_keep_size(int *newval, void **extra, GucSource source) +{ + if (IsBinaryUpgrade && *newval != -1) + { + GUC_check_errdetail("\"%s\" must be set to -1 during binary upgrade mode.", + "max_slot_wal_keep_size"); + return false; + } + + return true; +} + /* * At a checkpoint, how many WAL segments to recycle as preallocated future * XLOG segments? Returns the highest segment that should be preallocated. @@ -2079,7 +2328,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) /* * Update local LogwrtResult (caller probably did this already, but...) */ - LogwrtResult = XLogCtl->LogwrtResult; + RefreshXLogWriteResult(LogwrtResult); /* * Since successive pages in the xlog cache are consecutively allocated, @@ -2108,7 +2357,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) * if we're passed a bogus WriteRqst.Write that is past the end of the * last page that's been initialized by AdvanceXLInsertBuffer. */ - XLogRecPtr EndPtr = XLogCtl->xlblocks[curridx]; + XLogRecPtr EndPtr = pg_atomic_read_u64(&XLogCtl->xlblocks[curridx]); if (LogwrtResult.Write >= EndPtr) elog(PANIC, "xlog write request %X/%X is past end of log %X/%X", @@ -2176,7 +2425,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) char *from; Size nbytes; Size nleft; - int written; + ssize_t written; instr_time start; /* OK to write the page(s) */ @@ -2203,10 +2452,10 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) */ if (track_wal_io_timing) { - instr_time duration; + instr_time end; - INSTR_TIME_SET_CURRENT(duration); - INSTR_TIME_ACCUM_DIFF(PendingWalStats.wal_write_time, duration, start); + INSTR_TIME_SET_CURRENT(end); + INSTR_TIME_ACCUM_DIFF(PendingWalStats.wal_write_time, end, start); } PendingWalStats.wal_write++; @@ -2225,8 +2474,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) errno = save_errno; ereport(PANIC, (errcode_for_file_access(), - errmsg("could not write to log file %s " - "at offset %u, length %zu: %m", + errmsg("could not write to log file \"%s\" at offset %u, length %zu: %m", xlogfname, startoffset, nleft))); } nleft -= written; @@ -2306,8 +2554,8 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) * have no open file or the wrong one. However, we do not need to * fsync more than one file. */ - if (sync_method != SYNC_METHOD_OPEN && - sync_method != SYNC_METHOD_OPEN_DSYNC) + if (wal_sync_method != WAL_SYNC_METHOD_OPEN && + wal_sync_method != WAL_SYNC_METHOD_OPEN_DSYNC) { if (openLogFile >= 0 && !XLByteInPrevSeg(LogwrtResult.Write, openLogSegNo, @@ -2338,15 +2586,41 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) * 'result' values. This is not absolutely essential, but it saves some * code in a couple of places. */ + SpinLockAcquire(&XLogCtl->info_lck); + if (XLogCtl->LogwrtRqst.Write < LogwrtResult.Write) + XLogCtl->LogwrtRqst.Write = LogwrtResult.Write; + if (XLogCtl->LogwrtRqst.Flush < LogwrtResult.Flush) + XLogCtl->LogwrtRqst.Flush = LogwrtResult.Flush; + SpinLockRelease(&XLogCtl->info_lck); + + /* + * We write Write first, bar, then Flush. When reading, the opposite must + * be done (with a matching barrier in between), so that we always see a + * Flush value that trails behind the Write value seen. + */ + pg_atomic_write_u64(&XLogCtl->logWriteResult, LogwrtResult.Write); + pg_write_barrier(); + pg_atomic_write_u64(&XLogCtl->logFlushResult, LogwrtResult.Flush); + +#ifdef USE_ASSERT_CHECKING { - SpinLockAcquire(&XLogCtl->info_lck); - XLogCtl->LogwrtResult = LogwrtResult; - if (XLogCtl->LogwrtRqst.Write < LogwrtResult.Write) - XLogCtl->LogwrtRqst.Write = LogwrtResult.Write; - if (XLogCtl->LogwrtRqst.Flush < LogwrtResult.Flush) - XLogCtl->LogwrtRqst.Flush = LogwrtResult.Flush; - SpinLockRelease(&XLogCtl->info_lck); + XLogRecPtr Flush; + XLogRecPtr Write; + XLogRecPtr Insert; + + Flush = pg_atomic_read_u64(&XLogCtl->logFlushResult); + pg_read_barrier(); + Write = pg_atomic_read_u64(&XLogCtl->logWriteResult); + pg_read_barrier(); + Insert = pg_atomic_read_u64(&XLogCtl->logInsertResult); + + /* WAL written to disk is always ahead of WAL flushed */ + Assert(Write >= Flush); + + /* WAL inserted to buffers is always ahead of WAL written */ + Assert(Insert >= Write); } +#endif } /* @@ -2359,35 +2633,45 @@ XLogSetAsyncXactLSN(XLogRecPtr asyncXactLSN) { XLogRecPtr WriteRqstPtr = asyncXactLSN; bool sleeping; + bool wakeup = false; + XLogRecPtr prevAsyncXactLSN; SpinLockAcquire(&XLogCtl->info_lck); - LogwrtResult = XLogCtl->LogwrtResult; sleeping = XLogCtl->WalWriterSleeping; + prevAsyncXactLSN = XLogCtl->asyncXactLSN; if (XLogCtl->asyncXactLSN < asyncXactLSN) XLogCtl->asyncXactLSN = asyncXactLSN; SpinLockRelease(&XLogCtl->info_lck); /* - * If the WALWriter is sleeping, we should kick it to make it come out of - * low-power mode. Otherwise, determine whether there's a full page of - * WAL available to write. + * If somebody else already called this function with a more aggressive + * LSN, they will have done what we needed (and perhaps more). */ - if (!sleeping) + if (asyncXactLSN <= prevAsyncXactLSN) + return; + + /* + * If the WALWriter is sleeping, kick it to make it come out of low-power + * mode, so that this async commit will reach disk within the expected + * amount of time. Otherwise, determine whether it has enough WAL + * available to flush, the same way that XLogBackgroundFlush() does. + */ + if (sleeping) + wakeup = true; + else { - /* back off to last completed page boundary */ - WriteRqstPtr -= WriteRqstPtr % XLOG_BLCKSZ; + int flushblocks; - /* if we have already flushed that far, we're done */ - if (WriteRqstPtr <= LogwrtResult.Flush) - return; + RefreshXLogWriteResult(LogwrtResult); + + flushblocks = + WriteRqstPtr / XLOG_BLCKSZ - LogwrtResult.Flush / XLOG_BLCKSZ; + + if (WalWriterFlushAfter == 0 || flushblocks >= WalWriterFlushAfter) + wakeup = true; } - /* - * Nudge the WALWriter: it has a full page of WAL to write, or we want it - * to come out of low-power mode so that this async commit will reach disk - * within the expected amount of time. - */ - if (ProcGlobal->walwriterLatch) + if (wakeup && ProcGlobal->walwriterLatch) SetLatch(ProcGlobal->walwriterLatch); } @@ -2562,14 +2846,8 @@ XLogFlush(XLogRecPtr record) { XLogRecPtr insertpos; - /* read LogwrtResult and update local state */ - SpinLockAcquire(&XLogCtl->info_lck); - if (WriteRqstPtr < XLogCtl->LogwrtRqst.Write) - WriteRqstPtr = XLogCtl->LogwrtRqst.Write; - LogwrtResult = XLogCtl->LogwrtResult; - SpinLockRelease(&XLogCtl->info_lck); - /* done already? */ + RefreshXLogWriteResult(LogwrtResult); if (record <= LogwrtResult.Flush) break; @@ -2577,6 +2855,10 @@ XLogFlush(XLogRecPtr record) * Before actually performing the write, wait for all in-flight * insertions to the pages we're about to write to finish. */ + SpinLockAcquire(&XLogCtl->info_lck); + if (WriteRqstPtr < XLogCtl->LogwrtRqst.Write) + WriteRqstPtr = XLogCtl->LogwrtRqst.Write; + SpinLockRelease(&XLogCtl->info_lck); insertpos = WaitXLogInsertionsToFinish(WriteRqstPtr); /* @@ -2597,7 +2879,7 @@ XLogFlush(XLogRecPtr record) } /* Got the lock; recheck whether request is satisfied */ - LogwrtResult = XLogCtl->LogwrtResult; + RefreshXLogWriteResult(LogwrtResult); if (record <= LogwrtResult.Flush) { LWLockRelease(WALWriteLock); @@ -2706,7 +2988,7 @@ XLogBackgroundFlush(void) bool flexible = true; static TimestampTz lastflush; TimestampTz now; - int flushbytes; + int flushblocks; TimeLineID insertTLI; /* XLOG doesn't need flushing during recovery */ @@ -2719,9 +3001,8 @@ XLogBackgroundFlush(void) */ insertTLI = XLogCtl->InsertTimeLineID; - /* read LogwrtResult and update local state */ + /* read updated LogwrtRqst */ SpinLockAcquire(&XLogCtl->info_lck); - LogwrtResult = XLogCtl->LogwrtResult; WriteRqst = XLogCtl->LogwrtRqst; SpinLockRelease(&XLogCtl->info_lck); @@ -2729,6 +3010,7 @@ XLogBackgroundFlush(void) WriteRqst.Write -= WriteRqst.Write % XLOG_BLCKSZ; /* if we have already flushed that far, consider async commit records */ + RefreshXLogWriteResult(LogwrtResult); if (WriteRqst.Write <= LogwrtResult.Flush) { SpinLockAcquire(&XLogCtl->info_lck); @@ -2758,9 +3040,13 @@ XLogBackgroundFlush(void) /* * Determine how far to flush WAL, based on the wal_writer_delay and * wal_writer_flush_after GUCs. + * + * Note that XLogSetAsyncXactLSN() performs similar calculation based on + * wal_writer_flush_after, to decide when to wake us up. Make sure the + * logic is the same in both places if you change this. */ now = GetCurrentTimestamp(); - flushbytes = + flushblocks = WriteRqst.Write / XLOG_BLCKSZ - LogwrtResult.Flush / XLOG_BLCKSZ; if (WalWriterFlushAfter == 0 || lastflush == 0) @@ -2779,7 +3065,7 @@ XLogBackgroundFlush(void) WriteRqst.Flush = WriteRqst.Write; lastflush = now; } - else if (flushbytes >= WalWriterFlushAfter) + else if (flushblocks >= WalWriterFlushAfter) { /* exceeded wal_writer_flush_after blocks, flush */ WriteRqst.Flush = WriteRqst.Write; @@ -2805,7 +3091,7 @@ XLogBackgroundFlush(void) /* now wait for any in-progress insertions to finish and get write lock */ WaitXLogInsertionsToFinish(WriteRqst.Write); LWLockAcquire(WALWriteLock, LW_EXCLUSIVE); - LogwrtResult = XLogCtl->LogwrtResult; + RefreshXLogWriteResult(LogwrtResult); if (WriteRqst.Write > LogwrtResult.Write || WriteRqst.Flush > LogwrtResult.Flush) { @@ -2893,9 +3179,7 @@ XLogNeedsFlush(XLogRecPtr record) return false; /* read LogwrtResult and update local state */ - SpinLockAcquire(&XLogCtl->info_lck); - LogwrtResult = XLogCtl->LogwrtResult; - SpinLockRelease(&XLogCtl->info_lck); + RefreshXLogWriteResult(LogwrtResult); /* check again */ if (record <= LogwrtResult.Flush) @@ -2937,7 +3221,7 @@ XLogFileInitInternal(XLogSegNo logsegno, TimeLineID logtli, */ *added = false; fd = BasicOpenFile(path, O_RDWR | PG_BINARY | O_CLOEXEC | - get_sync_bit(sync_method)); + get_sync_bit(wal_sync_method)); if (fd < 0) { if (errno != ENOENT) @@ -3102,7 +3386,7 @@ XLogFileInit(XLogSegNo logsegno, TimeLineID logtli) /* Now open original target segment (might not be file I just made) */ fd = BasicOpenFile(path, O_RDWR | PG_BINARY | O_CLOEXEC | - get_sync_bit(sync_method)); + get_sync_bit(wal_sync_method)); if (fd < 0) ereport(ERROR, (errcode_for_file_access(), @@ -3334,7 +3618,7 @@ XLogFileOpen(XLogSegNo segno, TimeLineID tli) XLogFilePath(path, tli, segno, wal_segment_size); fd = BasicOpenFile(path, O_RDWR | PG_BINARY | O_CLOEXEC | - get_sync_bit(sync_method)); + get_sync_bit(wal_sync_method)); if (fd < 0) ereport(PANIC, (errcode_for_file_access(), @@ -3477,6 +3761,43 @@ XLogGetLastRemovedSegno(void) return lastRemovedSegNo; } +/* + * Return the oldest WAL segment on the given TLI that still exists in + * XLOGDIR, or 0 if none. + */ +XLogSegNo +XLogGetOldestSegno(TimeLineID tli) +{ + DIR *xldir; + struct dirent *xlde; + XLogSegNo oldest_segno = 0; + + xldir = AllocateDir(XLOGDIR); + while ((xlde = ReadDir(xldir, XLOGDIR)) != NULL) + { + TimeLineID file_tli; + XLogSegNo file_segno; + + /* Ignore files that are not XLOG segments. */ + if (!IsXLogFileName(xlde->d_name)) + continue; + + /* Parse filename to get TLI and segno. */ + XLogFromFileName(xlde->d_name, &file_tli, &file_segno, + wal_segment_size); + + /* Ignore anything that's not from the TLI of interest. */ + if (tli != file_tli) + continue; + + /* If it's the oldest so far, update oldest_segno. */ + if (oldest_segno == 0 || file_segno < oldest_segno) + oldest_segno = file_segno; + } + + FreeDir(xldir); + return oldest_segno; +} /* * Update the last removed segno pointer in shared memory, to reflect that the @@ -3595,7 +3916,8 @@ RemoveOldXlogFiles(XLogSegNo segno, XLogRecPtr lastredoptr, XLogRecPtr endptr, } /* - * Remove WAL files that are not part of the given timeline's history. + * Recycle or remove WAL files that are not part of the given timeline's + * history. * * This is called during recovery, whenever we switch to follow a new * timeline, and at the end of recovery when we create a new timeline. We @@ -3756,8 +4078,8 @@ RemoveXlogFile(const struct dirent *segment_de, } /* - * Verify whether pg_wal and pg_wal/archive_status exist. - * If the latter does not exist, recreate it. + * Verify whether pg_wal, pg_wal/archive_status, and pg_wal/summaries exist. + * If the latter do not exist, recreate them. * * It is not the goal of this function to verify the contents of these * directories, but to help in cases where someone has performed a cluster @@ -3778,12 +4100,35 @@ ValidateXLOGDirectoryStructure(void) if (stat(XLOGDIR, &stat_buf) != 0 || !S_ISDIR(stat_buf.st_mode)) ereport(FATAL, - (errmsg("required WAL directory \"%s\" does not exist", + (errcode_for_file_access(), + errmsg("required WAL directory \"%s\" does not exist", XLOGDIR))); /* Check for archive_status */ snprintf(path, MAXPGPATH, XLOGDIR "/archive_status"); if (stat(path, &stat_buf) == 0) + { + /* Check for weird cases where it exists but isn't a directory */ + if (!S_ISDIR(stat_buf.st_mode)) + ereport(FATAL, + (errcode_for_file_access(), + errmsg("required WAL directory \"%s\" does not exist", + path))); + } + else + { + ereport(LOG, + (errmsg("creating missing WAL directory \"%s\"", path))); + if (MakePGDirectory(path) < 0) + ereport(FATAL, + (errcode_for_file_access(), + errmsg("could not create missing directory \"%s\": %m", + path))); + } + + /* Check for summaries */ + snprintf(path, MAXPGPATH, XLOGDIR "/summaries"); + if (stat(path, &stat_buf) == 0) { /* Check for weird cases where it exists but isn't a directory */ if (!S_ISDIR(stat_buf.st_mode)) @@ -4014,7 +4359,8 @@ ReadControlFile(void) if (ControlFile->pg_control_version != PG_CONTROL_VERSION && ControlFile->pg_control_version % 65536 == 0 && ControlFile->pg_control_version / 65536 != 0) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x)," " but the server was compiled with PG_CONTROL_VERSION %d (0x%08x).", ControlFile->pg_control_version, ControlFile->pg_control_version, @@ -4023,7 +4369,8 @@ ReadControlFile(void) if (ControlFile->pg_control_version != PG_CONTROL_VERSION) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with PG_CONTROL_VERSION %d," " but the server was compiled with PG_CONTROL_VERSION %d.", ControlFile->pg_control_version, PG_CONTROL_VERSION), @@ -4038,7 +4385,8 @@ ReadControlFile(void) if (!EQ_CRC32C(crc, ControlFile->crc)) ereport(FATAL, - (errmsg("incorrect checksum in control file"))); + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("incorrect checksum in control file"))); /* * Do compatibility checking immediately. If the database isn't @@ -4047,68 +4395,78 @@ ReadControlFile(void) */ if (ControlFile->catalog_version_no != CATALOG_VERSION_NO) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with CATALOG_VERSION_NO %d," " but the server was compiled with CATALOG_VERSION_NO %d.", ControlFile->catalog_version_no, CATALOG_VERSION_NO), errhint("It looks like you need to initdb."))); if (ControlFile->maxAlign != MAXIMUM_ALIGNOF) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with MAXALIGN %d," " but the server was compiled with MAXALIGN %d.", ControlFile->maxAlign, MAXIMUM_ALIGNOF), errhint("It looks like you need to initdb."))); if (ControlFile->floatFormat != FLOATFORMAT_VALUE) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster appears to use a different floating-point number format than the server executable."), errhint("It looks like you need to initdb."))); if (ControlFile->blcksz != BLCKSZ) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with BLCKSZ %d," " but the server was compiled with BLCKSZ %d.", ControlFile->blcksz, BLCKSZ), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->relseg_size != RELSEG_SIZE) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with RELSEG_SIZE %d," " but the server was compiled with RELSEG_SIZE %d.", ControlFile->relseg_size, RELSEG_SIZE), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->xlog_blcksz != XLOG_BLCKSZ) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with XLOG_BLCKSZ %d," " but the server was compiled with XLOG_BLCKSZ %d.", ControlFile->xlog_blcksz, XLOG_BLCKSZ), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->nameDataLen != NAMEDATALEN) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with NAMEDATALEN %d," " but the server was compiled with NAMEDATALEN %d.", ControlFile->nameDataLen, NAMEDATALEN), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->indexMaxKeys != INDEX_MAX_KEYS) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with INDEX_MAX_KEYS %d," " but the server was compiled with INDEX_MAX_KEYS %d.", ControlFile->indexMaxKeys, INDEX_MAX_KEYS), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->toast_max_chunk_size != TOAST_MAX_CHUNK_SIZE) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d," " but the server was compiled with TOAST_MAX_CHUNK_SIZE %d.", ControlFile->toast_max_chunk_size, (int) TOAST_MAX_CHUNK_SIZE), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->loblksize != LOBLKSIZE) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with LOBLKSIZE %d," " but the server was compiled with LOBLKSIZE %d.", ControlFile->loblksize, (int) LOBLKSIZE), @@ -4117,14 +4475,16 @@ ReadControlFile(void) #ifdef USE_FLOAT8_BYVAL if (ControlFile->float8ByVal != true) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized without USE_FLOAT8_BYVAL" " but the server was compiled with USE_FLOAT8_BYVAL."), errhint("It looks like you need to recompile or initdb."))); #else if (ControlFile->float8ByVal != false) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with USE_FLOAT8_BYVAL" " but the server was compiled without USE_FLOAT8_BYVAL."), errhint("It looks like you need to recompile or initdb."))); @@ -4134,10 +4494,11 @@ ReadControlFile(void) if (!IsValidWalSegSize(wal_segment_size)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg_plural("WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte", - "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes", + errmsg_plural("invalid WAL segment size in control file (%d byte)", + "invalid WAL segment size in control file (%d bytes)", wal_segment_size, - wal_segment_size))); + wal_segment_size), + errdetail("The WAL segment size must be a power of two between 1 MB and 1 GB."))); snprintf(wal_segsz_str, sizeof(wal_segsz_str), "%d", wal_segment_size); SetConfigOption("wal_segment_size", wal_segsz_str, PGC_INTERNAL, @@ -4215,14 +4576,7 @@ DataChecksumsEnabled(void) XLogRecPtr GetFakeLSNForUnloggedRel(void) { - XLogRecPtr nextUnloggedLSN; - - /* increment the unloggedLSN counter, need SpinLock */ - SpinLockAcquire(&XLogCtl->ulsn_lck); - nextUnloggedLSN = XLogCtl->unloggedLSN++; - SpinLockRelease(&XLogCtl->ulsn_lck); - - return nextUnloggedLSN; + return pg_atomic_fetch_add_u64(&XLogCtl->unloggedLSN, 1); } /* @@ -4518,7 +4872,7 @@ XLOGShmemSize(void) /* WAL insertion locks, plus alignment */ size = add_size(size, mul_size(sizeof(WALInsertLockPadded), NUM_XLOGINSERT_LOCKS + 1)); /* xlblocks array */ - size = add_size(size, mul_size(sizeof(XLogRecPtr), XLOGbuffers)); + size = add_size(size, mul_size(sizeof(pg_atomic_uint64), XLOGbuffers)); /* extra alignment padding for XLOG I/O buffers */ size = add_size(size, Max(XLOG_BLCKSZ, PG_IO_ALIGN_SIZE)); /* and the buffers themselves */ @@ -4596,10 +4950,13 @@ XLOGShmemInit(void) * needed here. */ allocptr = ((char *) XLogCtl) + sizeof(XLogCtlData); - XLogCtl->xlblocks = (XLogRecPtr *) allocptr; - memset(XLogCtl->xlblocks, 0, sizeof(XLogRecPtr) * XLOGbuffers); - allocptr += sizeof(XLogRecPtr) * XLOGbuffers; + XLogCtl->xlblocks = (pg_atomic_uint64 *) allocptr; + allocptr += sizeof(pg_atomic_uint64) * XLOGbuffers; + for (i = 0; i < XLOGbuffers; i++) + { + pg_atomic_init_u64(&XLogCtl->xlblocks[i], InvalidXLogRecPtr); + } /* WAL insertion locks. Ensure they're aligned to the full padded size */ allocptr += sizeof(WALInsertLockPadded) - @@ -4611,7 +4968,7 @@ XLOGShmemInit(void) for (i = 0; i < NUM_XLOGINSERT_LOCKS; i++) { LWLockInitialize(&WALInsertLocks[i].l.lock, LWTRANCHE_WAL_INSERT); - WALInsertLocks[i].l.insertingAt = InvalidXLogRecPtr; + pg_atomic_init_u64(&WALInsertLocks[i].l.insertingAt, InvalidXLogRecPtr); WALInsertLocks[i].l.lastImportantAt = InvalidXLogRecPtr; } @@ -4635,7 +4992,10 @@ XLOGShmemInit(void) SpinLockInit(&XLogCtl->Insert.insertpos_lck); SpinLockInit(&XLogCtl->info_lck); - SpinLockInit(&XLogCtl->ulsn_lck); + pg_atomic_init_u64(&XLogCtl->logInsertResult, InvalidXLogRecPtr); + pg_atomic_init_u64(&XLogCtl->logWriteResult, InvalidXLogRecPtr); + pg_atomic_init_u64(&XLogCtl->logFlushResult, InvalidXLogRecPtr); + pg_atomic_init_u64(&XLogCtl->unloggedLSN, InvalidXLogRecPtr); } /* @@ -4691,6 +5051,7 @@ BootStrapXLOG(void) checkPoint.ThisTimeLineID = BootstrapTimeLineID; checkPoint.PrevTimeLineID = BootstrapTimeLineID; checkPoint.fullPageWrites = fullPageWrites; + checkPoint.wal_level = wal_level; checkPoint.nextXid = FullTransactionIdFromEpochAndXid(0, FirstNormalTransactionId); checkPoint.nextOid = FirstGenbkiObjectId; @@ -4705,9 +5066,9 @@ BootStrapXLOG(void) checkPoint.time = (pg_time_t) time(NULL); checkPoint.oldestActiveXid = InvalidTransactionId; - ShmemVariableCache->nextXid = checkPoint.nextXid; - ShmemVariableCache->nextOid = checkPoint.nextOid; - ShmemVariableCache->oidCount = 0; + TransamVariables->nextXid = checkPoint.nextXid; + TransamVariables->nextOid = checkPoint.nextOid; + TransamVariables->oidCount = 0; MultiXactSetNextMXact(checkPoint.nextMulti, checkPoint.nextMultiOffset); AdvanceOldestClogXid(checkPoint.oldestXid); SetTransactionIdLimit(checkPoint.oldestXid, checkPoint.oldestXidDB); @@ -4962,6 +5323,13 @@ CleanupAfterArchiveRecovery(TimeLineID EndOfLogTLI, XLogRecPtr EndOfLog, char partialfname[MAXFNAMELEN]; char partialpath[MAXPGPATH]; + /* + * If we're summarizing WAL, we can't rename the partial file + * until the summarizer finishes with it, else it will fail. + */ + if (summarize_wal) + WaitForWalSummarization(EndOfLog); + XLogFilePath(origpath, EndOfLogTLI, endLogSegNo, wal_segment_size); snprintf(partialfname, MAXFNAMELEN, "%s.partial", origfname); snprintf(partialpath, MAXPGPATH, "%s.partial", origpath); @@ -4996,9 +5364,10 @@ CheckRequiredParameterValues(void) if (ArchiveRecoveryRequested && ControlFile->wal_level == WAL_LEVEL_MINIMAL) { ereport(FATAL, - (errmsg("WAL was generated with wal_level=minimal, cannot continue recovering"), - errdetail("This happens if you temporarily set wal_level=minimal on the server."), - errhint("Use a backup taken after setting wal_level to higher than minimal."))); + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("WAL was generated with \"wal_level=minimal\", cannot continue recovering"), + errdetail("This happens if you temporarily set \"wal_level=minimal\" on the server."), + errhint("Use a backup taken after setting \"wal_level\" to higher than \"minimal\"."))); } /* @@ -5062,7 +5431,8 @@ StartupXLOG(void) */ if (!XRecOffIsValid(ControlFile->checkPoint)) ereport(FATAL, - (errmsg("control file contains invalid checkpoint location"))); + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("control file contains invalid checkpoint location"))); switch (ControlFile->state) { @@ -5113,7 +5483,8 @@ StartupXLOG(void) default: ereport(FATAL, - (errmsg("control file contains invalid database cluster state"))); + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("control file contains invalid database cluster state"))); } /* This is just to allow attaching to startup process with a debugger */ @@ -5123,9 +5494,9 @@ StartupXLOG(void) #endif /* - * Verify that pg_wal and pg_wal/archive_status exist. In cases where - * someone has performed a copy for PITR, these directories may have been - * excluded and need to be re-created. + * Verify that pg_wal, pg_wal/archive_status, and pg_wal/summaries exist. + * In cases where someone has performed a copy for PITR, these directories + * may have been excluded and need to be re-created. */ ValidateXLOGDirectoryStructure(); @@ -5171,9 +5542,9 @@ StartupXLOG(void) checkPoint = ControlFile->checkPointCopy; /* initialize shared memory variables from the checkpoint record */ - ShmemVariableCache->nextXid = checkPoint.nextXid; - ShmemVariableCache->nextOid = checkPoint.nextOid; - ShmemVariableCache->oidCount = 0; + TransamVariables->nextXid = checkPoint.nextXid; + TransamVariables->nextOid = checkPoint.nextOid; + TransamVariables->oidCount = 0; MultiXactSetNextMXact(checkPoint.nextMulti, checkPoint.nextMultiOffset); AdvanceOldestClogXid(checkPoint.oldestXid); SetTransactionIdLimit(checkPoint.oldestXid, checkPoint.oldestXidDB); @@ -5209,7 +5580,7 @@ StartupXLOG(void) StartupReorderBuffer(); /* - * Startup CLOG. This must be done after ShmemVariableCache->nextXid has + * Startup CLOG. This must be done after TransamVariables->nextXid has * been initialized and before we accept connections or begin WAL replay. */ StartupCLOG(); @@ -5240,9 +5611,11 @@ StartupXLOG(void) * the unlogged LSN counter can be reset too. */ if (ControlFile->state == DB_SHUTDOWNED) - XLogCtl->unloggedLSN = ControlFile->unloggedLSN; + pg_atomic_write_membarrier_u64(&XLogCtl->unloggedLSN, + ControlFile->unloggedLSN); else - XLogCtl->unloggedLSN = FirstNormalUnloggedLSN; + pg_atomic_write_membarrier_u64(&XLogCtl->unloggedLSN, + FirstNormalUnloggedLSN); /* * Copy any missing timeline history files between 'now' and the recovery @@ -5398,7 +5771,7 @@ StartupXLOG(void) Assert(TransactionIdIsValid(oldestActiveXID)); /* Tell procarray about the range of xids it has to deal with */ - ProcArrayInitRecovery(XidFromFullTransactionId(ShmemVariableCache->nextXid)); + ProcArrayInitRecovery(XidFromFullTransactionId(TransamVariables->nextXid)); /* * Startup subtrans only. CLOG, MultiXact and commit timestamp @@ -5418,6 +5791,9 @@ StartupXLOG(void) RunningTransactionsData running; TransactionId latestCompletedXid; + /* Update pg_subtrans entries for any prepared transactions */ + StandbyRecoverPreparedTransactions(); + /* * Construct a RunningTransactions snapshot representing a * shut down server, with only prepared transactions still @@ -5426,7 +5802,7 @@ StartupXLOG(void) */ running.xcnt = nxids; running.subxcnt = 0; - running.subxid_overflow = false; + running.subxid_status = SUBXIDS_IN_SUBTRANS; running.nextXid = XidFromFullTransactionId(checkPoint.nextXid); running.oldestRunningXid = oldestActiveXID; latestCompletedXid = XidFromFullTransactionId(checkPoint.nextXid); @@ -5436,8 +5812,6 @@ StartupXLOG(void) running.xids = xids; ProcArrayApplyRecoveryInfo(&running); - - StandbyRecoverPreparedTransactions(); } } @@ -5497,11 +5871,13 @@ StartupXLOG(void) { if (!XLogRecPtrIsInvalid(ControlFile->backupStartPoint) || ControlFile->backupEndRequired) ereport(FATAL, - (errmsg("WAL ends before end of online backup"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("WAL ends before end of online backup"), errhint("All WAL generated while online backup was taken must be available at recovery."))); else ereport(FATAL, - (errmsg("WAL ends before consistent recovery point"))); + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("WAL ends before consistent recovery point"))); } } @@ -5584,8 +5960,10 @@ StartupXLOG(void) } /* Save the selected TimeLineID in shared memory, too */ + SpinLockAcquire(&XLogCtl->info_lck); XLogCtl->InsertTimeLineID = newTLI; XLogCtl->PrevTimeLineID = endOfRecoveryInfo->lastRecTLI; + SpinLockRelease(&XLogCtl->info_lck); /* * Actually, if WAL ended in an incomplete record, skip the parts that @@ -5636,7 +6014,7 @@ StartupXLOG(void) memcpy(page, endOfRecoveryInfo->lastPage, len); memset(page + len, 0, XLOG_BLCKSZ - len); - XLogCtl->xlblocks[firstIdx] = endOfRecoveryInfo->lastPageBeginPtr + XLOG_BLCKSZ; + pg_atomic_write_u64(&XLogCtl->xlblocks[firstIdx], endOfRecoveryInfo->lastPageBeginPtr + XLOG_BLCKSZ); XLogCtl->InitializedUpTo = endOfRecoveryInfo->lastPageBeginPtr + XLOG_BLCKSZ; } else @@ -5649,13 +6027,41 @@ StartupXLOG(void) XLogCtl->InitializedUpTo = EndOfLog; } + /* + * Update local and shared status. This is OK to do without any locks + * because no other process can be reading or writing WAL yet. + */ LogwrtResult.Write = LogwrtResult.Flush = EndOfLog; - - XLogCtl->LogwrtResult = LogwrtResult; - + pg_atomic_write_u64(&XLogCtl->logInsertResult, EndOfLog); + pg_atomic_write_u64(&XLogCtl->logWriteResult, EndOfLog); + pg_atomic_write_u64(&XLogCtl->logFlushResult, EndOfLog); XLogCtl->LogwrtRqst.Write = EndOfLog; XLogCtl->LogwrtRqst.Flush = EndOfLog; + /* + * Invalidate all sinval-managed caches before READ WRITE transactions + * begin. The xl_heap_inplace WAL record doesn't store sufficient data + * for invalidations. The commit record, if any, has the invalidations. + * However, the inplace update is permanent, whether or not we reach a + * commit record. Fortunately, read-only transactions tolerate caches not + * reflecting the latest inplace updates. Read-only transactions + * experience the notable inplace updates as follows: + * + * - relhasindex=true affects readers only after the CREATE INDEX + * transaction commit makes an index fully available to them. + * + * - datconnlimit=DATCONNLIMIT_INVALID_DB affects readers only at + * InitPostgres() time, and that read does not use a cache. + * + * - relfrozenxid, datfrozenxid, relminmxid, and datminmxid have no effect + * on readers. + * + * Hence, hot standby queries (all READ ONLY) function correctly without + * the missing invalidations. This avoided changing the WAL format in + * back branches. + */ + SIResetAll(); + /* * Preallocate additional log files, if wanted. */ @@ -5672,8 +6078,8 @@ StartupXLOG(void) /* also initialize latestCompletedXid, to nextXid - 1 */ LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); - ShmemVariableCache->latestCompletedXid = ShmemVariableCache->nextXid; - FullTransactionIdRetreat(&ShmemVariableCache->latestCompletedXid); + TransamVariables->latestCompletedXid = TransamVariables->nextXid; + FullTransactionIdRetreat(&TransamVariables->latestCompletedXid); LWLockRelease(ProcArrayLock); /* @@ -6091,9 +6497,7 @@ GetFlushRecPtr(TimeLineID *insertTLI) { Assert(XLogCtl->SharedRecoveryState == RECOVERY_STATE_DONE); - SpinLockAcquire(&XLogCtl->info_lck); - LogwrtResult = XLogCtl->LogwrtResult; - SpinLockRelease(&XLogCtl->info_lck); + RefreshXLogWriteResult(LogwrtResult); /* * If we're writing and flushing WAL, the time line can't be changing, so @@ -6118,6 +6522,25 @@ GetWALInsertionTimeLine(void) return XLogCtl->InsertTimeLineID; } +/* + * GetWALInsertionTimeLineIfSet -- If the system is not in recovery, returns + * the WAL insertion timeline; else, returns 0. Wherever possible, use + * GetWALInsertionTimeLine() instead, since it's cheaper. Note that this + * function decides recovery has ended as soon as the insert TLI is set, which + * happens before we set XLogCtl->SharedRecoveryState to RECOVERY_STATE_DONE. + */ +TimeLineID +GetWALInsertionTimeLineIfSet(void) +{ + TimeLineID insertTLI; + + SpinLockAcquire(&XLogCtl->info_lck); + insertTLI = XLogCtl->InsertTimeLineID; + SpinLockRelease(&XLogCtl->info_lck); + + return insertTLI; +} + /* * GetLastImportantRecPtr -- Returns the LSN of the last important record * inserted. All records not explicitly marked as unimportant are considered @@ -6270,8 +6693,8 @@ LogCheckpointEnd(bool restartpoint) CheckpointStats.ckpt_sync_end_t); /* Accumulate checkpoint timing summary data, in milliseconds. */ - PendingCheckpointerStats.checkpoint_write_time += write_msecs; - PendingCheckpointerStats.checkpoint_sync_time += sync_msecs; + PendingCheckpointerStats.write_time += write_msecs; + PendingCheckpointerStats.sync_time += sync_msecs; /* * All of the published timing statistics are accounted for. Only @@ -6437,17 +6860,22 @@ update_checkpoint_display(int flags, bool restartpoint, bool reset) * In particular note that this routine is synchronous and does not pay * attention to CHECKPOINT_WAIT. * - * If !shutdown then we are writing an online checkpoint. This is a very special - * kind of operation and WAL record because the checkpoint action occurs over - * a period of time yet logically occurs at just a single LSN. The logical - * position of the WAL record (redo ptr) is the same or earlier than the - * physical position. When we replay WAL we locate the checkpoint via its - * physical position then read the redo ptr and actually start replay at the - * earlier logical position. Note that we don't write *anything* to WAL at - * the logical position, so that location could be any other kind of WAL record. - * All of this mechanism allows us to continue working while we checkpoint. - * As a result, timing of actions is critical here and be careful to note that - * this function will likely take minutes to execute on a busy system. + * If !shutdown then we are writing an online checkpoint. An XLOG_CHECKPOINT_REDO + * record is inserted into WAL at the logical location of the checkpoint, before + * flushing anything to disk, and when the checkpoint is eventually completed, + * and it is from this point that WAL replay will begin in the case of a recovery + * from this checkpoint. Once everything is written to disk, an + * XLOG_CHECKPOINT_ONLINE record is written to complete the checkpoint, and + * points back to the earlier XLOG_CHECKPOINT_REDO record. This mechanism allows + * other write-ahead log records to be written while the checkpoint is in + * progress, but we must be very careful about order of operations. This function + * may take many minutes to execute on a busy system. + * + * On the other hand, when shutdown is true, concurrent insertion into the + * write-ahead log is impossible, so there is no need for two separate records. + * In this case, we only insert an XLOG_CHECKPOINT_SHUTDOWN record, and it's + * both the record marking the completion of the checkpoint and the location + * from which WAL replay would begin if needed. */ void CreateCheckPoint(int flags) @@ -6459,7 +6887,6 @@ CreateCheckPoint(int flags) XLogCtlInsert *Insert = &XLogCtl->Insert; uint32 freespace; XLogRecPtr PriorRedoPtr; - XLogRecPtr curInsert; XLogRecPtr last_important_lsn; VirtualTransactionId *vxids; int nvxids; @@ -6529,13 +6956,6 @@ CreateCheckPoint(int flags) */ last_important_lsn = GetLastImportantRecPtr(); - /* - * We must block concurrent insertions while examining insert state to - * determine the checkpoint REDO pointer. - */ - WALInsertLockAcquireExclusive(); - curInsert = XLogBytePosToRecPtr(Insert->CurrBytePos); - /* * If this isn't a shutdown or forced checkpoint, and if there has been no * WAL activity requiring a checkpoint, skip it. The idea here is to @@ -6546,7 +6966,6 @@ CreateCheckPoint(int flags) { if (last_important_lsn == ControlFile->checkPoint) { - WALInsertLockRelease(); END_CRIT_SECTION(); ereport(DEBUG1, (errmsg_internal("checkpoint skipped because system is idle"))); @@ -6568,38 +6987,48 @@ CreateCheckPoint(int flags) else checkPoint.PrevTimeLineID = checkPoint.ThisTimeLineID; - checkPoint.fullPageWrites = Insert->fullPageWrites; - /* - * Compute new REDO record ptr = location of next XLOG record. - * - * NB: this is NOT necessarily where the checkpoint record itself will be, - * since other backends may insert more XLOG records while we're off doing - * the buffer flush work. Those XLOG records are logically after the - * checkpoint, even though physically before it. Got that? + * We must block concurrent insertions while examining insert state. */ - freespace = INSERT_FREESPACE(curInsert); - if (freespace == 0) + WALInsertLockAcquireExclusive(); + + checkPoint.fullPageWrites = Insert->fullPageWrites; + checkPoint.wal_level = wal_level; + + if (shutdown) { - if (XLogSegmentOffset(curInsert, wal_segment_size) == 0) - curInsert += SizeOfXLogLongPHD; - else - curInsert += SizeOfXLogShortPHD; - } - checkPoint.redo = curInsert; + XLogRecPtr curInsert = XLogBytePosToRecPtr(Insert->CurrBytePos); - /* - * Here we update the shared RedoRecPtr for future XLogInsert calls; this - * must be done while holding all the insertion locks. - * - * Note: if we fail to complete the checkpoint, RedoRecPtr will be left - * pointing past where it really needs to point. This is okay; the only - * consequence is that XLogInsert might back up whole buffers that it - * didn't really need to. We can't postpone advancing RedoRecPtr because - * XLogInserts that happen while we are dumping buffers must assume that - * their buffer changes are not included in the checkpoint. - */ - RedoRecPtr = XLogCtl->Insert.RedoRecPtr = checkPoint.redo; + /* + * Compute new REDO record ptr = location of next XLOG record. + * + * Since this is a shutdown checkpoint, there can't be any concurrent + * WAL insertion. + */ + freespace = INSERT_FREESPACE(curInsert); + if (freespace == 0) + { + if (XLogSegmentOffset(curInsert, wal_segment_size) == 0) + curInsert += SizeOfXLogLongPHD; + else + curInsert += SizeOfXLogShortPHD; + } + checkPoint.redo = curInsert; + + /* + * Here we update the shared RedoRecPtr for future XLogInsert calls; + * this must be done while holding all the insertion locks. + * + * Note: if we fail to complete the checkpoint, RedoRecPtr will be + * left pointing past where it really needs to point. This is okay; + * the only consequence is that XLogInsert might back up whole buffers + * that it didn't really need to. We can't postpone advancing + * RedoRecPtr because XLogInserts that happen while we are dumping + * buffers must assume that their buffer changes are not included in + * the checkpoint. + */ + RedoRecPtr = XLogCtl->Insert.RedoRecPtr = checkPoint.redo; + } /* * Now we can release the WAL insertion locks, allowing other xacts to @@ -6607,6 +7036,31 @@ CreateCheckPoint(int flags) */ WALInsertLockRelease(); + /* + * If this is an online checkpoint, we have not yet determined the redo + * point. We do so now by inserting the special XLOG_CHECKPOINT_REDO + * record; the LSN at which it starts becomes the new redo pointer. We + * don't do this for a shutdown checkpoint, because in that case no WAL + * can be written between the redo point and the insertion of the + * checkpoint record itself, so the checkpoint record itself serves to + * mark the redo point. + */ + if (!shutdown) + { + /* Include WAL level in record for WAL summarizer's benefit. */ + XLogBeginInsert(); + XLogRegisterData((char *) &wal_level, sizeof(wal_level)); + (void) XLogInsert(RM_XLOG_ID, XLOG_CHECKPOINT_REDO); + + /* + * XLogInsertRecord will have updated XLogCtl->Insert.RedoRecPtr in + * shared memory and RedoRecPtr in backend-local memory, but we need + * to copy that into the record that will be inserted when the + * checkpoint is complete. + */ + checkPoint.redo = RedoRecPtr; + } + /* Update the info_lck-protected copy of RedoRecPtr as well */ SpinLockAcquire(&XLogCtl->info_lck); XLogCtl->RedoRecPtr = checkPoint.redo; @@ -6633,20 +7087,20 @@ CreateCheckPoint(int flags) * there. */ LWLockAcquire(XidGenLock, LW_SHARED); - checkPoint.nextXid = ShmemVariableCache->nextXid; - checkPoint.oldestXid = ShmemVariableCache->oldestXid; - checkPoint.oldestXidDB = ShmemVariableCache->oldestXidDB; + checkPoint.nextXid = TransamVariables->nextXid; + checkPoint.oldestXid = TransamVariables->oldestXid; + checkPoint.oldestXidDB = TransamVariables->oldestXidDB; LWLockRelease(XidGenLock); LWLockAcquire(CommitTsLock, LW_SHARED); - checkPoint.oldestCommitTsXid = ShmemVariableCache->oldestCommitTsXid; - checkPoint.newestCommitTsXid = ShmemVariableCache->newestCommitTsXid; + checkPoint.oldestCommitTsXid = TransamVariables->oldestCommitTsXid; + checkPoint.newestCommitTsXid = TransamVariables->newestCommitTsXid; LWLockRelease(CommitTsLock); LWLockAcquire(OidGenLock, LW_SHARED); - checkPoint.nextOid = ShmemVariableCache->nextOid; + checkPoint.nextOid = TransamVariables->nextOid; if (!shutdown) - checkPoint.nextOid += ShmemVariableCache->oidCount; + checkPoint.nextOid += TransamVariables->oidCount; LWLockRelease(OidGenLock); MultiXactGetCheckptMulti(shutdown, @@ -6699,7 +7153,16 @@ CreateCheckPoint(int flags) { do { + /* + * Keep absorbing fsync requests while we wait. There could even + * be a deadlock if we don't, if the process that prevents the + * checkpoint is trying to add a request to the queue. + */ + AbsorbSyncRequests(); + + pgstat_report_wait_start(WAIT_EVENT_CHECKPOINT_DELAY_START); pg_usleep(10000L); /* wait for 10 msec */ + pgstat_report_wait_end(); } while (HaveVirtualXIDsDelayingChkpt(vxids, nvxids, DELAY_CHKPT_START)); } @@ -6712,7 +7175,11 @@ CreateCheckPoint(int flags) { do { + AbsorbSyncRequests(); + + pgstat_report_wait_start(WAIT_EVENT_CHECKPOINT_DELAY_COMPLETE); pg_usleep(10000L); /* wait for 10 msec */ + pgstat_report_wait_end(); } while (HaveVirtualXIDsDelayingChkpt(vxids, nvxids, DELAY_CHKPT_COMPLETE)); } @@ -6788,9 +7255,7 @@ CreateCheckPoint(int flags) * unused on non-shutdown checkpoints, but seems useful to store it always * for debugging purposes. */ - SpinLockAcquire(&XLogCtl->ulsn_lck); - ControlFile->unloggedLSN = XLogCtl->unloggedLSN; - SpinLockRelease(&XLogCtl->ulsn_lck); + ControlFile->unloggedLSN = pg_atomic_read_membarrier_u64(&XLogCtl->unloggedLSN); UpdateControlFile(); LWLockRelease(ControlFileLock); @@ -6806,6 +7271,25 @@ CreateCheckPoint(int flags) */ END_CRIT_SECTION(); + /* + * WAL summaries end when the next XLOG_CHECKPOINT_REDO or + * XLOG_CHECKPOINT_SHUTDOWN record is reached. This is the first point + * where (a) we're not inside of a critical section and (b) we can be + * certain that the relevant record has been flushed to disk, which must + * happen before it can be summarized. + * + * If this is a shutdown checkpoint, then this happens reasonably + * promptly: we've only just inserted and flushed the + * XLOG_CHECKPOINT_SHUTDOWN record. If this is not a shutdown checkpoint, + * then this might not be very prompt at all: the XLOG_CHECKPOINT_REDO + * record was written before we began flushing data to disk, and that + * could be many minutes ago at this point. However, we don't XLogFlush() + * after inserting that record, so we're not guaranteed that it's on disk + * until after the above call that flushes the XLOG_CHECKPOINT_ONLINE + * record. + */ + SetWalSummarizerLatch(); + /* * Let smgr do post-checkpoint cleanup (eg, deleting old files). */ @@ -6888,6 +7372,7 @@ CreateEndOfRecoveryRecord(void) elog(ERROR, "can only be used to end recovery"); xlrec.end_time = GetCurrentTimestamp(); + xlrec.wal_level = wal_level; WALInsertLockAcquireExclusive(); xlrec.ThisTimeLineID = XLogCtl->InsertTimeLineID; @@ -7015,7 +7500,7 @@ static void CheckPointGuts(XLogRecPtr checkPointRedo, int flags) { CheckPointRelationMap(); - CheckPointReplicationSlots(); + CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN); CheckPointSnapBuild(); CheckPointLogicalRewriteHeap(); CheckPointReplicationOrigin(); @@ -7063,7 +7548,7 @@ RecoveryRestartPoint(const CheckPoint *checkPoint, XLogReaderState *record) */ if (XLogHaveInvalidPages()) { - elog(trace_recovery(DEBUG2), + elog(DEBUG2, "could not record restart point at %X/%X because there " "are unresolved references to invalid pages", LSN_FORMAT_ARGS(checkPoint->redo)); @@ -7195,6 +7680,12 @@ CreateRestartPoint(int flags) CheckPointGuts(lastCheckPoint.redo, flags); + /* + * This location needs to be after CheckPointGuts() to ensure that some + * work has already happened during this checkpoint. + */ + INJECTION_POINT("create-restart-point"); + /* * Remember the prior checkpoint's redo ptr for * UpdateCheckPointDistanceEstimate() @@ -7480,6 +7971,20 @@ KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo) } } + /* + * If WAL summarization is in use, don't remove WAL that has yet to be + * summarized. + */ + keep = GetOldestUnsummarizedLSN(NULL, NULL); + if (keep != InvalidXLogRecPtr) + { + XLogSegNo unsummarized_segno; + + XLByteToSeg(keep, unsummarized_segno, wal_segment_size); + if (unsummarized_segno < segno) + segno = unsummarized_segno; + } + /* but, keep at least wal_keep_size if that's set */ if (wal_keep_size_mb > 0) { @@ -7734,16 +8239,16 @@ xlog_redo(XLogReaderState *record) Oid nextOid; /* - * We used to try to take the maximum of ShmemVariableCache->nextOid - * and the recorded nextOid, but that fails if the OID counter wraps + * We used to try to take the maximum of TransamVariables->nextOid and + * the recorded nextOid, but that fails if the OID counter wraps * around. Since no OID allocation should be happening during replay * anyway, better to just believe the record exactly. We still take * OidGenLock while setting the variable, just in case. */ memcpy(&nextOid, XLogRecGetData(record), sizeof(Oid)); LWLockAcquire(OidGenLock, LW_EXCLUSIVE); - ShmemVariableCache->nextOid = nextOid; - ShmemVariableCache->oidCount = 0; + TransamVariables->nextOid = nextOid; + TransamVariables->oidCount = 0; LWLockRelease(OidGenLock); } else if (info == XLOG_CHECKPOINT_SHUTDOWN) @@ -7754,11 +8259,11 @@ xlog_redo(XLogReaderState *record) memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint)); /* In a SHUTDOWN checkpoint, believe the counters exactly */ LWLockAcquire(XidGenLock, LW_EXCLUSIVE); - ShmemVariableCache->nextXid = checkPoint.nextXid; + TransamVariables->nextXid = checkPoint.nextXid; LWLockRelease(XidGenLock); LWLockAcquire(OidGenLock, LW_EXCLUSIVE); - ShmemVariableCache->nextOid = checkPoint.nextOid; - ShmemVariableCache->oidCount = 0; + TransamVariables->nextOid = checkPoint.nextOid; + TransamVariables->oidCount = 0; LWLockRelease(OidGenLock); MultiXactSetNextMXact(checkPoint.nextMulti, checkPoint.nextMultiOffset); @@ -7799,6 +8304,9 @@ xlog_redo(XLogReaderState *record) oldestActiveXID = PrescanPreparedTransactions(&xids, &nxids); + /* Update pg_subtrans entries for any prepared transactions */ + StandbyRecoverPreparedTransactions(); + /* * Construct a RunningTransactions snapshot representing a shut * down server, with only prepared transactions still alive. We're @@ -7807,7 +8315,7 @@ xlog_redo(XLogReaderState *record) */ running.xcnt = nxids; running.subxcnt = 0; - running.subxid_overflow = false; + running.subxid_status = SUBXIDS_IN_SUBTRANS; running.nextXid = XidFromFullTransactionId(checkPoint.nextXid); running.oldestRunningXid = oldestActiveXID; latestCompletedXid = XidFromFullTransactionId(checkPoint.nextXid); @@ -7817,8 +8325,6 @@ xlog_redo(XLogReaderState *record) running.xids = xids; ProcArrayApplyRecoveryInfo(&running); - - StandbyRecoverPreparedTransactions(); } /* ControlFile->checkPointCopy always tracks the latest ckpt XID */ @@ -7851,9 +8357,9 @@ xlog_redo(XLogReaderState *record) memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint)); /* In an ONLINE checkpoint, treat the XID counter as a minimum */ LWLockAcquire(XidGenLock, LW_EXCLUSIVE); - if (FullTransactionIdPrecedes(ShmemVariableCache->nextXid, + if (FullTransactionIdPrecedes(TransamVariables->nextXid, checkPoint.nextXid)) - ShmemVariableCache->nextXid = checkPoint.nextXid; + TransamVariables->nextXid = checkPoint.nextXid; LWLockRelease(XidGenLock); /* @@ -7878,7 +8384,7 @@ xlog_redo(XLogReaderState *record) */ MultiXactAdvanceOldest(checkPoint.oldestMulti, checkPoint.oldestMultiDB); - if (TransactionIdPrecedes(ShmemVariableCache->oldestXid, + if (TransactionIdPrecedes(TransamVariables->oldestXid, checkPoint.oldestXid)) SetTransactionIdLimit(checkPoint.oldestXid, checkPoint.oldestXidDB); @@ -8063,11 +8569,15 @@ xlog_redo(XLogReaderState *record) /* Keep track of full_page_writes */ lastFullPageWrites = fpw; } + else if (info == XLOG_CHECKPOINT_REDO) + { + /* nothing to do here, just for informational purposes */ + } } /* * Return the extra open flags used for opening a file, depending on the - * value of the GUCs wal_sync_method, fsync and io_direct. + * value of the GUCs wal_sync_method, fsync and debug_io_direct. */ static int get_sync_bit(int method) @@ -8095,21 +8605,21 @@ get_sync_bit(int method) * not included in the enum option array, and therefore will never * be seen here. */ - case SYNC_METHOD_FSYNC: - case SYNC_METHOD_FSYNC_WRITETHROUGH: - case SYNC_METHOD_FDATASYNC: + case WAL_SYNC_METHOD_FSYNC: + case WAL_SYNC_METHOD_FSYNC_WRITETHROUGH: + case WAL_SYNC_METHOD_FDATASYNC: return o_direct_flag; #ifdef O_SYNC - case SYNC_METHOD_OPEN: + case WAL_SYNC_METHOD_OPEN: return O_SYNC | o_direct_flag; #endif #ifdef O_DSYNC - case SYNC_METHOD_OPEN_DSYNC: + case WAL_SYNC_METHOD_OPEN_DSYNC: return O_DSYNC | o_direct_flag; #endif default: /* can't happen (unless we are out of sync with option array) */ - elog(ERROR, "unrecognized wal_sync_method: %d", method); + elog(ERROR, "unrecognized \"wal_sync_method\": %d", method); return 0; /* silence warning */ } } @@ -8118,9 +8628,9 @@ get_sync_bit(int method) * GUC support */ void -assign_xlog_sync_method(int new_sync_method, void *extra) +assign_wal_sync_method(int new_wal_sync_method, void *extra) { - if (sync_method != new_sync_method) + if (wal_sync_method != new_wal_sync_method) { /* * To ensure that no blocks escape unsynced, force an fsync on the @@ -8146,7 +8656,7 @@ assign_xlog_sync_method(int new_sync_method, void *extra) } pgstat_report_wait_end(); - if (get_sync_bit(sync_method) != get_sync_bit(new_sync_method)) + if (get_sync_bit(wal_sync_method) != get_sync_bit(new_wal_sync_method)) XLogFileClose(); } } @@ -8172,8 +8682,8 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) * file. */ if (!enableFsync || - sync_method == SYNC_METHOD_OPEN || - sync_method == SYNC_METHOD_OPEN_DSYNC) + wal_sync_method == WAL_SYNC_METHOD_OPEN || + wal_sync_method == WAL_SYNC_METHOD_OPEN_DSYNC) return; /* Measure I/O timing to sync the WAL file */ @@ -8183,29 +8693,31 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_SYNC); - switch (sync_method) + switch (wal_sync_method) { - case SYNC_METHOD_FSYNC: + case WAL_SYNC_METHOD_FSYNC: if (pg_fsync_no_writethrough(fd) != 0) msg = _("could not fsync file \"%s\": %m"); break; #ifdef HAVE_FSYNC_WRITETHROUGH - case SYNC_METHOD_FSYNC_WRITETHROUGH: + case WAL_SYNC_METHOD_FSYNC_WRITETHROUGH: if (pg_fsync_writethrough(fd) != 0) msg = _("could not fsync write-through file \"%s\": %m"); break; #endif - case SYNC_METHOD_FDATASYNC: + case WAL_SYNC_METHOD_FDATASYNC: if (pg_fdatasync(fd) != 0) msg = _("could not fdatasync file \"%s\": %m"); break; - case SYNC_METHOD_OPEN: - case SYNC_METHOD_OPEN_DSYNC: + case WAL_SYNC_METHOD_OPEN: + case WAL_SYNC_METHOD_OPEN_DSYNC: /* not reachable */ Assert(false); break; default: - elog(PANIC, "unrecognized wal_sync_method: %d", sync_method); + ereport(PANIC, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg_internal("unrecognized \"wal_sync_method\": %d", wal_sync_method)); break; } @@ -8229,10 +8741,10 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) */ if (track_wal_io_timing) { - instr_time duration; + instr_time end; - INSTR_TIME_SET_CURRENT(duration); - INSTR_TIME_ACCUM_DIFF(PendingWalStats.wal_sync_time, duration, start); + INSTR_TIME_SET_CURRENT(end); + INSTR_TIME_ACCUM_DIFF(PendingWalStats.wal_sync_time, end, start); } PendingWalStats.wal_sync++; @@ -8283,7 +8795,7 @@ do_pg_backup_start(const char *backupidstr, bool fast, List **tablespaces, ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("WAL level not sufficient for making an online backup"), - errhint("wal_level must be set to \"replica\" or \"logical\" at server start."))); + errhint("\"wal_level\" must be set to \"replica\" or \"logical\" at server start."))); if (strlen(backupidstr) > MAXPGPATH) ereport(ERROR, @@ -8409,11 +8921,11 @@ do_pg_backup_start(const char *backupidstr, bool fast, List **tablespaces, if (!checkpointfpw || state->startpoint <= recptr) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("WAL generated with full_page_writes=off was replayed " + errmsg("WAL generated with \"full_page_writes=off\" was replayed " "since last restartpoint"), errhint("This means that the backup being taken on the standby " "is corrupt and should not be used. " - "Enable full_page_writes and run CHECKPOINT on the primary, " + "Enable \"full_page_writes\" and run CHECKPOINT on the primary, " "and then try an online backup again."))); /* @@ -8460,9 +8972,22 @@ do_pg_backup_start(const char *backupidstr, bool fast, List **tablespaces, char *relpath = NULL; char *s; PGFileType de_type; + char *badp; + Oid tsoid; - /* Skip anything that doesn't look like a tablespace */ - if (strspn(de->d_name, "0123456789") != strlen(de->d_name)) + /* + * Try to parse the directory name as an unsigned integer. + * + * Tablespace directories should be positive integers that can be + * represented in 32 bits, with no leading zeroes or trailing + * garbage. If we come across a name that doesn't meet those + * criteria, skip it. + */ + if (de->d_name[0] < '1' || de->d_name[1] > '9') + continue; + errno = 0; + tsoid = strtoul(de->d_name, &badp, 10); + if (*badp != '\0' || errno == EINVAL || errno == ERANGE) continue; snprintf(fullpath, sizeof(fullpath), "pg_tblspc/%s", de->d_name); @@ -8537,7 +9062,7 @@ do_pg_backup_start(const char *backupidstr, bool fast, List **tablespaces, } ti = palloc(sizeof(tablespaceinfo)); - ti->oid = pstrdup(de->d_name); + ti->oid = tsoid; ti->path = pstrdup(linkpath); ti->rpath = relpath; ti->size = -1; @@ -8692,11 +9217,11 @@ do_pg_backup_stop(BackupState *state, bool waitforarchive) if (state->startpoint <= recptr) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("WAL generated with full_page_writes=off was replayed " + errmsg("WAL generated with \"full_page_writes=off\" was replayed " "during online backup"), errhint("This means that the backup being taken on the standby " "is corrupt and should not be used. " - "Enable full_page_writes and run CHECKPOINT on the primary, " + "Enable \"full_page_writes\" and run CHECKPOINT on the primary, " "and then try an online backup again."))); @@ -8824,7 +9349,7 @@ do_pg_backup_stop(BackupState *state, bool waitforarchive) ereport(WARNING, (errmsg("still waiting for all required WAL segments to be archived (%d seconds elapsed)", waits), - errhint("Check that your archive_command is executing properly. " + errhint("Check that your \"archive_command\" is executing properly. " "You can safely cancel this backup, " "but the database backup will not be usable without all the WAL segments."))); } @@ -8915,9 +9440,7 @@ GetXLogInsertRecPtr(void) XLogRecPtr GetXLogWriteRecPtr(void) { - SpinLockAcquire(&XLogCtl->info_lck); - LogwrtResult = XLogCtl->LogwrtResult; - SpinLockRelease(&XLogCtl->info_lck); + RefreshXLogWriteResult(LogwrtResult); return LogwrtResult.Write; } diff --git a/src/backend/access/transam/xlogarchive.c b/src/backend/access/transam/xlogarchive.c index f3fb92c8f96f9..81999b48200be 100644 --- a/src/backend/access/transam/xlogarchive.c +++ b/src/backend/access/transam/xlogarchive.c @@ -4,7 +4,7 @@ * Functions for archiving WAL files and restoring from the archive. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/xlogarchive.c @@ -26,12 +26,11 @@ #include "common/percentrepl.h" #include "miscadmin.h" #include "pgstat.h" -#include "postmaster/startup.h" #include "postmaster/pgarch.h" +#include "postmaster/startup.h" #include "replication/walsender.h" #include "storage/fd.h" #include "storage/ipc.h" -#include "storage/lwlock.h" /* * Attempt to retrieve the specified file from off-line archival storage. @@ -159,20 +158,27 @@ RestoreArchivedFile(char *path, const char *xlogfname, (errmsg_internal("executing restore command \"%s\"", xlogRestoreCmd))); + fflush(NULL); + pgstat_report_wait_start(WAIT_EVENT_RESTORE_COMMAND); + /* - * Check signals before restore command and reset afterwards. + * PreRestoreCommand() informs the SIGTERM handler for the startup process + * that it should proc_exit() right away. This is done for the duration + * of the system() call because there isn't a good way to break out while + * it is executing. Since we might call proc_exit() in a signal handler, + * it is best to put any additional logic before or after the + * PreRestoreCommand()/PostRestoreCommand() section. */ PreRestoreCommand(); /* * Copy xlog from archival storage to XLOGDIR */ - fflush(NULL); - pgstat_report_wait_start(WAIT_EVENT_RESTORE_COMMAND); rc = system(xlogRestoreCmd); - pgstat_report_wait_end(); PostRestoreCommand(); + + pgstat_report_wait_end(); pfree(xlogRestoreCmd); if (rc == 0) @@ -227,7 +233,7 @@ RestoreArchivedFile(char *path, const char *xlogfname, ereport(elevel, (errcode_for_file_access(), errmsg("could not stat file \"%s\": %m", xlogpath), - errdetail("restore_command returned a zero exit status, but stat() failed."))); + errdetail("\"restore_command\" returned a zero exit status, but stat() failed."))); } } diff --git a/src/backend/access/transam/xlogbackup.c b/src/backend/access/transam/xlogbackup.c index 23461c9d2ca4e..5171668cddc17 100644 --- a/src/backend/access/transam/xlogbackup.c +++ b/src/backend/access/transam/xlogbackup.c @@ -3,7 +3,7 @@ * xlogbackup.c * Internal routines for base backups. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -58,7 +58,7 @@ build_backup_content(BackupState *state, bool ishistoryfile) appendStringInfo(result, "CHECKPOINT LOCATION: %X/%X\n", LSN_FORMAT_ARGS(state->checkpointloc)); - appendStringInfo(result, "BACKUP METHOD: streamed\n"); + appendStringInfoString(result, "BACKUP METHOD: streamed\n"); appendStringInfo(result, "BACKUP FROM: %s\n", state->started_in_recovery ? "standby" : "primary"); appendStringInfo(result, "START TIME: %s\n", startstrbuf); @@ -77,6 +77,16 @@ build_backup_content(BackupState *state, bool ishistoryfile) appendStringInfo(result, "STOP TIMELINE: %u\n", state->stoptli); } + /* either both istartpoint and istarttli should be set, or neither */ + Assert(XLogRecPtrIsInvalid(state->istartpoint) == (state->istarttli == 0)); + if (!XLogRecPtrIsInvalid(state->istartpoint)) + { + appendStringInfo(result, "INCREMENTAL FROM LSN: %X/%X\n", + LSN_FORMAT_ARGS(state->istartpoint)); + appendStringInfo(result, "INCREMENTAL FROM TLI: %u\n", + state->istarttli); + } + data = result->data; pfree(result); diff --git a/src/backend/access/transam/xlogfuncs.c b/src/backend/access/transam/xlogfuncs.c index 5044ff064329b..4e46baaebdf7a 100644 --- a/src/backend/access/transam/xlogfuncs.c +++ b/src/backend/access/transam/xlogfuncs.c @@ -7,7 +7,7 @@ * This file contains WAL control and information functions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/xlogfuncs.c @@ -22,23 +22,17 @@ #include "access/xlog_internal.h" #include "access/xlogbackup.h" #include "access/xlogrecovery.h" -#include "access/xlogutils.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "miscadmin.h" #include "pgstat.h" #include "replication/walreceiver.h" #include "storage/fd.h" -#include "storage/ipc.h" -#include "storage/smgr.h" #include "storage/standby.h" #include "utils/builtins.h" -#include "utils/guc.h" #include "utils/memutils.h" -#include "utils/numeric.h" #include "utils/pg_lsn.h" #include "utils/timestamp.h" -#include "utils/tuplestore.h" /* * Backup-related variables. @@ -218,7 +212,7 @@ pg_log_standby_snapshot(PG_FUNCTION_ARGS) if (!XLogStandbyInfoActive()) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("pg_log_standby_snapshot() can only be used if wal_level >= replica"))); + errmsg("pg_log_standby_snapshot() can only be used if \"wal_level\" >= \"replica\""))); recptr = LogStandbySnapshot(); @@ -251,7 +245,7 @@ pg_create_restore_point(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("WAL level not sufficient for creating a restore point"), - errhint("wal_level must be set to \"replica\" or \"logical\" at server start."))); + errhint("\"wal_level\" must be set to \"replica\" or \"logical\" at server start."))); restore_name_str = text_to_cstring(restore_name); @@ -374,10 +368,6 @@ pg_last_wal_replay_lsn(PG_FUNCTION_ARGS) /* * Compute an xlog file name and decimal byte offset given a WAL location, * such as is returned by pg_backup_stop() or pg_switch_wal(). - * - * Note that a location exactly at a segment boundary is taken to be in - * the previous segment. This is usually the right thing, since the - * expected usage is to determine which xlog file(s) are ready to archive. */ Datum pg_walfile_name_offset(PG_FUNCTION_ARGS) @@ -414,7 +404,7 @@ pg_walfile_name_offset(PG_FUNCTION_ARGS) /* * xlogfilename */ - XLByteToPrevSeg(locationpoint, xlogsegno, wal_segment_size); + XLByteToSeg(locationpoint, xlogsegno, wal_segment_size); XLogFileName(xlogfilename, GetWALInsertionTimeLine(), xlogsegno, wal_segment_size); @@ -457,7 +447,7 @@ pg_walfile_name(PG_FUNCTION_ARGS) errhint("%s cannot be executed during recovery.", "pg_walfile_name()"))); - XLByteToPrevSeg(locationpoint, xlogsegno, wal_segment_size); + XLByteToSeg(locationpoint, xlogsegno, wal_segment_size); XLogFileName(xlogfilename, GetWALInsertionTimeLine(), xlogsegno, wal_segment_size); @@ -711,10 +701,10 @@ pg_promote(PG_FUNCTION_ARGS) /* signal the postmaster */ if (kill(PostmasterPid, SIGUSR1) != 0) { - ereport(WARNING, - (errmsg("failed to send signal to postmaster: %m"))); (void) unlink(PROMOTE_SIGNAL_FILE); - PG_RETURN_BOOL(false); + ereport(ERROR, + (errcode(ERRCODE_SYSTEM_ERROR), + errmsg("failed to send signal to postmaster: %m"))); } /* return immediately if waiting was not requested */ @@ -744,7 +734,10 @@ pg_promote(PG_FUNCTION_ARGS) * necessity for manual cleanup of all postmaster children. */ if (rc & WL_POSTMASTER_DEATH) - PG_RETURN_BOOL(false); + ereport(FATAL, + (errcode(ERRCODE_ADMIN_SHUTDOWN), + errmsg("terminating connection due to unexpected postmaster exit"), + errcontext("while waiting on promotion"))); } ereport(WARNING, diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c index 54247e1d81bfc..90476015347ad 100644 --- a/src/backend/access/transam/xloginsert.c +++ b/src/backend/access/transam/xloginsert.c @@ -9,7 +9,7 @@ * of XLogRecData structs by a call to XLogRecordAssemble(). See * access/transam/README for details. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/xloginsert.c @@ -33,7 +33,6 @@ #include "access/xloginsert.h" #include "catalog/pg_control.h" #include "common/pg_lzcompress.h" -#include "executor/instrument.h" #include "miscadmin.h" #include "pg_trace.h" #include "replication/origin.h" @@ -248,6 +247,20 @@ XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags) Assert(!((flags & REGBUF_FORCE_IMAGE) && (flags & (REGBUF_NO_IMAGE)))); Assert(begininsert_called); + /* + * Ordinarily, buffer should be exclusive-locked and marked dirty before + * we get here, otherwise we could end up violating one of the rules in + * access/transam/README. + * + * Some callers intentionally register a clean page and never update that + * page's LSN; in that case they can pass the flag REGBUF_NO_CHANGE to + * bypass these checks. + */ +#ifdef USE_ASSERT_CHECKING + if (!(flags & REGBUF_NO_CHANGE)) + Assert(BufferIsExclusiveLocked(buffer) && BufferIsDirty(buffer)); +#endif + if (block_id >= max_registered_block_id) { if (block_id >= max_registered_buffers) @@ -897,10 +910,9 @@ XLogRecordAssemble(RmgrId rmid, uint8 info, * * XLogReader machinery is only able to handle records up to a certain * size (ignoring machine resource limitations), so make sure that we will - * not emit records larger than the sizes advertised to be supported. This - * cap is based on DecodeXLogRecordRequiredSpace(). + * not emit records larger than the sizes advertised to be supported. */ - if (total_len >= XLogRecordMaxSize) + if (total_len > XLogRecordMaxSize) ereport(ERROR, (errmsg_internal("oversized WAL record"), errdetail_internal("WAL record would be %llu bytes (of maximum %u bytes); rmid %u flags %u.", @@ -1314,8 +1326,8 @@ log_newpage_range(Relation rel, ForkNumber forknum, START_CRIT_SECTION(); for (i = 0; i < nbufs; i++) { - XLogRegisterBuffer(i, bufpack[i], flags); MarkBufferDirty(bufpack[i]); + XLogRegisterBuffer(i, bufpack[i], flags); } recptr = XLogInsert(RM_XLOG_ID, XLOG_FPI); @@ -1339,10 +1351,12 @@ InitXLogInsert(void) /* * Check that any records assembled can be decoded. This is capped based - * on what XLogReader would require at its maximum bound. This code path + * on what XLogReader would require at its maximum bound. The XLOG_BLCKSZ + * addend covers the larger allocate_recordbuf() demand. This code path * is called once per backend, more than enough for this check. */ - size_t max_required = DecodeXLogRecordRequiredSpace(XLogRecordMaxSize); + size_t max_required = + DecodeXLogRecordRequiredSpace(XLogRecordMaxSize + XLOG_BLCKSZ); Assert(AllocSizeIsValid(max_required)); #endif diff --git a/src/backend/access/transam/xlogprefetcher.c b/src/backend/access/transam/xlogprefetcher.c index 539928cb854a3..84023d61baf30 100644 --- a/src/backend/access/transam/xlogprefetcher.c +++ b/src/backend/access/transam/xlogprefetcher.c @@ -3,7 +3,7 @@ * xlogprefetcher.c * Prefetching support for recovery. * - * Portions Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2022-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -27,25 +27,21 @@ #include "postgres.h" -#include "access/xlog.h" #include "access/xlogprefetcher.h" #include "access/xlogreader.h" -#include "access/xlogutils.h" -#include "catalog/pg_class.h" #include "catalog/pg_control.h" #include "catalog/storage_xlog.h" #include "commands/dbcommands_xlog.h" -#include "utils/fmgrprotos.h" -#include "utils/timestamp.h" #include "funcapi.h" -#include "pgstat.h" #include "miscadmin.h" #include "port/atomics.h" #include "storage/bufmgr.h" #include "storage/shmem.h" #include "storage/smgr.h" +#include "utils/fmgrprotos.h" #include "utils/guc_hooks.h" #include "utils/hsearch.h" +#include "utils/timestamp.h" /* * Every time we process this much WAL, we'll update the values in @@ -88,7 +84,7 @@ typedef enum { LRQ_NEXT_NO_IO, LRQ_NEXT_IO, - LRQ_NEXT_AGAIN + LRQ_NEXT_AGAIN, } LsnReadQueueNextStatus; /* @@ -722,7 +718,7 @@ XLogPrefetcherNextBlock(uintptr_t pgsr_private, XLogRecPtr *lsn) * same relation (with some scheme to handle invalidations * safely), but for now we'll call smgropen() every time. */ - reln = smgropen(block->rlocator, InvalidBackendId); + reln = smgropen(block->rlocator, INVALID_PROC_NUMBER); /* * If the relation file doesn't exist on disk, for example because @@ -1089,7 +1085,7 @@ check_recovery_prefetch(int *new_value, void **extra, GucSource source) #ifndef USE_PREFETCH if (*new_value == RECOVERY_PREFETCH_ON) { - GUC_check_errdetail("recovery_prefetch is not supported on platforms that lack posix_fadvise()."); + GUC_check_errdetail("\"recovery_prefetch\" is not supported on platforms that lack posix_fadvise()."); return false; } #endif diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index 2e7b1ba8e184f..a07f55dfbc944 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -3,7 +3,7 @@ * xlogreader.c * Generic XLog reading facility * - * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/access/transam/xlogreader.c @@ -34,16 +34,14 @@ #include "replication/origin.h" #ifndef FRONTEND -#include "miscadmin.h" #include "pgstat.h" -#include "utils/memutils.h" #else #include "common/logging.h" #endif static void report_invalid_record(XLogReaderState *state, const char *fmt,...) pg_attribute_printf(2, 3); -static bool allocate_recordbuf(XLogReaderState *state, uint32 reclength); +static void allocate_recordbuf(XLogReaderState *state, uint32 reclength); static int ReadPageInternal(XLogReaderState *state, XLogRecPtr pageptr, int reqLen); static void XLogReaderInvalReadState(XLogReaderState *state); @@ -155,14 +153,7 @@ XLogReaderAllocate(int wal_segment_size, const char *waldir, * Allocate an initial readRecordBuf of minimal size, which can later be * enlarged if necessary. */ - if (!allocate_recordbuf(state, 0)) - { - pfree(state->errormsg_buf); - pfree(state->readBuf); - pfree(state); - return NULL; - } - + allocate_recordbuf(state, 0); return state; } @@ -184,7 +175,6 @@ XLogReaderFree(XLogReaderState *state) /* * Allocate readRecordBuf to fit a record of at least the given length. - * Returns true if successful, false if out of memory. * * readRecordBufSize is set to the new buffer size. * @@ -192,8 +182,11 @@ XLogReaderFree(XLogReaderState *state) * XLOG_BLCKSZ, and make sure it's at least 5*Max(BLCKSZ, XLOG_BLCKSZ) to start * with. (That is enough for all "normal" records, but very large commit or * abort records might need more space.) + * + * Note: This routine should *never* be called for xl_tot_len until the header + * of the record has been fully validated. */ -static bool +static void allocate_recordbuf(XLogReaderState *state, uint32 reclength) { uint32 newSize = reclength; @@ -201,36 +194,10 @@ allocate_recordbuf(XLogReaderState *state, uint32 reclength) newSize += XLOG_BLCKSZ - (newSize % XLOG_BLCKSZ); newSize = Max(newSize, 5 * Max(BLCKSZ, XLOG_BLCKSZ)); -#ifndef FRONTEND - - /* - * Note that in much unlucky circumstances, the random data read from a - * recycled segment can cause this routine to be called with a size - * causing a hard failure at allocation. For a standby, this would cause - * the instance to stop suddenly with a hard failure, preventing it to - * retry fetching WAL from one of its sources which could allow it to move - * on with replay without a manual restart. If the data comes from a past - * recycled segment and is still valid, then the allocation may succeed - * but record checks are going to fail so this would be short-lived. If - * the allocation fails because of a memory shortage, then this is not a - * hard failure either per the guarantee given by MCXT_ALLOC_NO_OOM. - */ - if (!AllocSizeIsValid(newSize)) - return false; - -#endif - if (state->readRecordBuf) pfree(state->readRecordBuf); - state->readRecordBuf = - (char *) palloc_extended(newSize, MCXT_ALLOC_NO_OOM); - if (state->readRecordBuf == NULL) - { - state->readRecordBufSize = 0; - return false; - } + state->readRecordBuf = (char *) palloc(newSize); state->readRecordBufSize = newSize; - return true; } /* @@ -488,18 +455,37 @@ XLogReadRecordAlloc(XLogReaderState *state, size_t xl_tot_len, bool allow_oversi if (state->decode_buffer_tail >= state->decode_buffer_head) { /* Empty, or tail is to the right of head. */ - if (state->decode_buffer_tail + required_space <= - state->decode_buffer + state->decode_buffer_size) + if (required_space <= + state->decode_buffer_size - + (state->decode_buffer_tail - state->decode_buffer)) { - /* There is space between tail and end. */ + /*- + * There is space between tail and end. + * + * +-----+--------------------+-----+ + * | |////////////////////|here!| + * +-----+--------------------+-----+ + * ^ ^ + * | | + * h t + */ decoded = (DecodedXLogRecord *) state->decode_buffer_tail; decoded->oversized = false; return decoded; } - else if (state->decode_buffer + required_space < - state->decode_buffer_head) + else if (required_space < + state->decode_buffer_head - state->decode_buffer) { - /* There is space between start and head. */ + /*- + * There is space between start and head. + * + * +-----+--------------------+-----+ + * |here!|////////////////////| | + * +-----+--------------------+-----+ + * ^ ^ + * | | + * h t + */ decoded = (DecodedXLogRecord *) state->decode_buffer; decoded->oversized = false; return decoded; @@ -508,10 +494,19 @@ XLogReadRecordAlloc(XLogReaderState *state, size_t xl_tot_len, bool allow_oversi else { /* Tail is to the left of head. */ - if (state->decode_buffer_tail + required_space < - state->decode_buffer_head) + if (required_space < + state->decode_buffer_head - state->decode_buffer_tail) { - /* There is space between tail and head. */ + /*- + * There is space between tail and head. + * + * +-----+--------------------+-----+ + * |/////|here! |/////| + * +-----+--------------------+-----+ + * ^ ^ + * | | + * t h + */ decoded = (DecodedXLogRecord *) state->decode_buffer_tail; decoded->oversized = false; return decoded; @@ -521,9 +516,7 @@ XLogReadRecordAlloc(XLogReaderState *state, size_t xl_tot_len, bool allow_oversi /* Not enough space in the decode buffer. Are we allowed to allocate? */ if (allow_oversized) { - decoded = palloc_extended(required_space, MCXT_ALLOC_NO_OOM); - if (decoded == NULL) - return NULL; + decoded = palloc(required_space); decoded->oversized = true; return decoded; } @@ -669,7 +662,7 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) } else { - /* XXX: more validation should be done here */ + /* There may be no next page if it's too small. */ if (total_len < SizeOfXLogRecord) { report_invalid_record(state, @@ -678,32 +671,26 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) (uint32) SizeOfXLogRecord, total_len); goto err; } + /* We'll validate the header once we have the next page. */ gotheader = false; } /* - * Find space to decode this record. Don't allow oversized allocation if - * the caller requested nonblocking. Otherwise, we *have* to try to - * decode the record now because the caller has nothing else to do, so - * allow an oversized record to be palloc'd if that turns out to be - * necessary. + * Try to find space to decode this record, if we can do so without + * calling palloc. If we can't, we'll try again below after we've + * validated that total_len isn't garbage bytes from a recycled WAL page. */ decoded = XLogReadRecordAlloc(state, total_len, - !nonblocking /* allow_oversized */ ); - if (decoded == NULL) + false /* allow_oversized */ ); + if (decoded == NULL && nonblocking) { /* - * There is no space in the decode buffer. The caller should help - * with that problem by consuming some records. + * There is no space in the circular decode buffer, and the caller is + * only reading ahead. The caller should consume existing records to + * make space. */ - if (nonblocking) - return XLREAD_WOULDBLOCK; - - /* We failed to allocate memory for an oversized record. */ - report_invalid_record(state, - "out of memory while trying to decode a record of length %u", total_len); - goto err; + return XLREAD_WOULDBLOCK; } len = XLOG_BLCKSZ - RecPtr % XLOG_BLCKSZ; @@ -718,16 +705,11 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) assembled = true; /* - * Enlarge readRecordBuf as needed. + * We always have space for a couple of pages, enough to validate a + * boundary-spanning record header. */ - if (total_len > state->readRecordBufSize && - !allocate_recordbuf(state, total_len)) - { - /* We treat this as a "bogus data" condition */ - report_invalid_record(state, "record length %u at %X/%X too long", - total_len, LSN_FORMAT_ARGS(RecPtr)); - goto err; - } + Assert(state->readRecordBufSize >= XLOG_BLCKSZ * 2); + Assert(state->readRecordBufSize >= len); /* Copy the first fragment of the record from the first page. */ memcpy(state->readRecordBuf, @@ -824,8 +806,29 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) goto err; gotheader = true; } - } while (gotlen < total_len); + /* + * We might need a bigger buffer. We have validated the record + * header, in the case that it split over a page boundary. We've + * also cross-checked total_len against xlp_rem_len on the second + * page, and verified xlp_pageaddr on both. + */ + if (total_len > state->readRecordBufSize) + { + char save_copy[XLOG_BLCKSZ * 2]; + + /* + * Save and restore the data we already had. It can't be more + * than two pages. + */ + Assert(gotlen <= lengthof(save_copy)); + Assert(gotlen <= state->readRecordBufSize); + memcpy(save_copy, state->readRecordBuf, gotlen); + allocate_recordbuf(state, total_len); + memcpy(state->readRecordBuf, save_copy, gotlen); + buffer = state->readRecordBuf + gotlen; + } + } while (gotlen < total_len); Assert(gotheader); record = (XLogRecord *) state->readRecordBuf; @@ -867,6 +870,20 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) state->NextRecPtr -= XLogSegmentOffset(state->NextRecPtr, state->segcxt.ws_segsize); } + /* + * If we got here without a DecodedXLogRecord, it means we needed to + * validate total_len before trusting it, but by now we've done that. + */ + if (decoded == NULL) + { + Assert(!nonblocking); + decoded = XLogReadRecordAlloc(state, + total_len, + true /* allow_oversized */ ); + /* allocation should always happen under allow_oversized */ + Assert(decoded != NULL); + } + if (DecodeXLogRecord(state, decoded, record, RecPtr, &errormsg)) { /* Record the location of the next record. */ @@ -895,8 +912,6 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) state->decode_queue_head = decoded; return XLREAD_SUCCESS; } - else - return XLREAD_FAIL; err: if (assembled) @@ -914,15 +929,11 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) state->missingContrecPtr = targetPagePtr; /* - * If we got here without reporting an error, report one now so that - * XLogPrefetcherReadRecord() doesn't bring us back a second time and - * clobber the above state. Otherwise, the existing error takes - * precedence. + * If we got here without reporting an error, make sure an error is + * queued so that XLogPrefetcherReadRecord() doesn't bring us back a + * second time and clobber the above state. */ - if (!state->errormsg_buf[0]) - report_invalid_record(state, - "missing contrecord at %X/%X", - LSN_FORMAT_ARGS(RecPtr)); + state->errormsg_deferred = true; } if (decoded && decoded->oversized) @@ -1183,6 +1194,8 @@ ValidXLogRecord(XLogReaderState *state, XLogRecord *record, XLogRecPtr recptr) { pg_crc32c crc; + Assert(record->xl_tot_len >= SizeOfXLogRecord); + /* Calculate the CRC */ INIT_CRC32C(crc); COMP_CRC32C(crc, ((char *) record) + SizeOfXLogRecord, record->xl_tot_len - SizeOfXLogRecord); @@ -1485,9 +1498,6 @@ XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr) * * Returns true if succeeded, false if an error occurs, in which case * 'errinfo' receives error details. - * - * XXX probably this should be improved to suck data directly from the - * WAL buffers when possible. */ bool WALRead(XLogReaderState *state, @@ -2156,28 +2166,14 @@ RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page) FullTransactionId XLogRecGetFullXid(XLogReaderState *record) { - TransactionId xid, - next_xid; - uint32 epoch; - /* * This function is only safe during replay, because it depends on the * replay state. See AdvanceNextFullTransactionIdPastXid() for more. */ Assert(AmStartupProcess() || !IsUnderPostmaster); - xid = XLogRecGetXid(record); - next_xid = XidFromFullTransactionId(ShmemVariableCache->nextXid); - epoch = EpochFromFullTransactionId(ShmemVariableCache->nextXid); - - /* - * If xid is numerically greater than next_xid, it has to be from the last - * epoch. - */ - if (unlikely(xid > next_xid)) - --epoch; - - return FullTransactionIdFromEpochAndXid(epoch, xid); + return FullTransactionIdFromAllowableAt(TransamVariables->nextXid, + XLogRecGetXid(record)); } #endif diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index becc2bda62e63..1917cd4f44955 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -14,7 +14,7 @@ * for interrogating recovery state and controlling the recovery process. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/xlogrecovery.c @@ -49,16 +49,16 @@ #include "postmaster/bgwriter.h" #include "postmaster/startup.h" #include "replication/slot.h" +#include "replication/slotsync.h" #include "replication/walreceiver.h" #include "storage/fd.h" #include "storage/ipc.h" #include "storage/latch.h" #include "storage/pmsignal.h" -#include "storage/proc.h" #include "storage/procarray.h" #include "storage/spin.h" -#include "utils/builtins.h" #include "utils/datetime.h" +#include "utils/fmgrprotos.h" #include "utils/guc_hooks.h" #include "utils/pg_lsn.h" #include "utils/ps_status.h" @@ -133,7 +133,7 @@ static TimeLineID curFileTLI; * currently performing crash recovery using only XLOG files in pg_wal, but * will switch to using offline XLOG archives as soon as we reach the end of * WAL in pg_wal. -*/ + */ bool ArchiveRecoveryRequested = false; bool InArchiveRecovery = false; @@ -211,7 +211,7 @@ typedef enum XLOG_FROM_ANY = 0, /* request to read WAL from any source */ XLOG_FROM_ARCHIVE, /* restored using restore_command */ XLOG_FROM_PG_WAL, /* existing file in pg_wal */ - XLOG_FROM_STREAM /* streamed from primary */ + XLOG_FROM_STREAM, /* streamed from primary */ } XLogSource; /* human-readable names for XLogSources, for debugging output */ @@ -540,42 +540,17 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, readRecoverySignalFile(); validateRecoveryParameters(); - if (ArchiveRecoveryRequested) - { - if (StandbyModeRequested) - ereport(LOG, - (errmsg("entering standby mode"))); - else if (recoveryTarget == RECOVERY_TARGET_XID) - ereport(LOG, - (errmsg("starting point-in-time recovery to XID %u", - recoveryTargetXid))); - else if (recoveryTarget == RECOVERY_TARGET_TIME) - ereport(LOG, - (errmsg("starting point-in-time recovery to %s", - timestamptz_to_str(recoveryTargetTime)))); - else if (recoveryTarget == RECOVERY_TARGET_NAME) - ereport(LOG, - (errmsg("starting point-in-time recovery to \"%s\"", - recoveryTargetName))); - else if (recoveryTarget == RECOVERY_TARGET_LSN) - ereport(LOG, - (errmsg("starting point-in-time recovery to WAL location (LSN) \"%X/%X\"", - LSN_FORMAT_ARGS(recoveryTargetLSN)))); - else if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE) - ereport(LOG, - (errmsg("starting point-in-time recovery to earliest consistent point"))); - else - ereport(LOG, - (errmsg("starting archive recovery"))); - } - /* * Take ownership of the wakeup latch if we're going to sleep during - * recovery. + * recovery, if required. */ if (ArchiveRecoveryRequested) OwnLatch(&XLogRecoveryCtl->recoveryWakeupLatch); + /* + * Set the WAL reading processor now, as it will be needed when reading + * the checkpoint record required (backup_label or not). + */ private = palloc0(sizeof(XLogPageReadPrivate)); xlogreader = XLogReaderAllocate(wal_segment_size, NULL, @@ -609,6 +584,11 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, replay_image_masked = (char *) palloc(BLCKSZ); primary_image_masked = (char *) palloc(BLCKSZ); + /* + * Read the backup_label file. We want to run this part of the recovery + * process after checking for signal files and after performing validation + * of the recovery parameters. + */ if (read_backup_label(&CheckPointLoc, &CheckPointTLI, &backupEndRequired, &backupFromStandby)) { @@ -623,6 +603,22 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, if (StandbyModeRequested) EnableStandbyMode(); + /* + * Omitting backup_label when creating a new replica, PITR node etc. + * unfortunately is a common cause of corruption. Logging that + * backup_label was used makes it a bit easier to exclude that as the + * cause of observed corruption. + * + * Do so before we try to read the checkpoint record (which can fail), + * as otherwise it can be hard to understand why a checkpoint other + * than ControlFile->checkPoint is used. + */ + ereport(LOG, + (errmsg("starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on timeline ID %u", + LSN_FORMAT_ARGS(RedoStartLSN), + LSN_FORMAT_ARGS(CheckPointLoc), + CheckPointTLI))); + /* * When a backup_label file is present, we want to roll forward from * the checkpoint it identifies, rather than using pg_control. @@ -650,21 +646,23 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, if (!ReadRecord(xlogprefetcher, LOG, false, checkPoint.ThisTimeLineID)) ereport(FATAL, - (errmsg("could not find redo location referenced by checkpoint record"), - errhint("If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" + (errmsg("could not find redo location %X/%X referenced by checkpoint record at %X/%X", + LSN_FORMAT_ARGS(checkPoint.redo), LSN_FORMAT_ARGS(CheckPointLoc)), + errhint("If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/standby.signal\" and add required recovery options.\n" "If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" "Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup.", - DataDir, DataDir, DataDir))); + DataDir, DataDir, DataDir, DataDir))); } } else { ereport(FATAL, - (errmsg("could not locate required checkpoint record"), - errhint("If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" + (errmsg("could not locate required checkpoint record at %X/%X", + LSN_FORMAT_ARGS(CheckPointLoc)), + errhint("If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/standby.signal\" and add required recovery options.\n" "If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" "Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup.", - DataDir, DataDir, DataDir))); + DataDir, DataDir, DataDir, DataDir))); wasShutdown = false; /* keep compiler quiet */ } @@ -678,7 +676,7 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, tablespaceinfo *ti = lfirst(lc); char *linkloc; - linkloc = psprintf("pg_tblspc/%s", ti->oid); + linkloc = psprintf("pg_tblspc/%u", ti->oid); /* * Remove the existing symlink if any and Create the symlink @@ -692,7 +690,6 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, errmsg("could not create symbolic link \"%s\": %m", linkloc))); - pfree(ti->oid); pfree(ti->path); pfree(ti); } @@ -706,6 +703,8 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, } else { + /* No backup_label file has been found if we are here. */ + /* * If tablespace_map file is present without backup_label file, there * is no use of such file. There is no harm in retaining it, but it @@ -761,6 +760,16 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, EnableStandbyMode(); } + /* + * For the same reason as when starting up with backup_label present, + * emit a log message when we continue initializing from a base + * backup. + */ + if (!XLogRecPtrIsInvalid(ControlFile->backupStartPoint)) + ereport(LOG, + (errmsg("restarting backup recovery with redo LSN %X/%X", + LSN_FORMAT_ARGS(ControlFile->backupStartPoint)))); + /* Get the last valid checkpoint record. */ CheckPointLoc = ControlFile->checkPoint; CheckPointTLI = ControlFile->checkPointCopy.ThisTimeLineID; @@ -783,12 +792,42 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, * simplify processing around checkpoints. */ ereport(PANIC, - (errmsg("could not locate a valid checkpoint record"))); + (errmsg("could not locate a valid checkpoint record at %X/%X", + LSN_FORMAT_ARGS(CheckPointLoc)))); } memcpy(&checkPoint, XLogRecGetData(xlogreader), sizeof(CheckPoint)); wasShutdown = ((record->xl_info & ~XLR_INFO_MASK) == XLOG_CHECKPOINT_SHUTDOWN); } + if (ArchiveRecoveryRequested) + { + if (StandbyModeRequested) + ereport(LOG, + (errmsg("entering standby mode"))); + else if (recoveryTarget == RECOVERY_TARGET_XID) + ereport(LOG, + (errmsg("starting point-in-time recovery to XID %u", + recoveryTargetXid))); + else if (recoveryTarget == RECOVERY_TARGET_TIME) + ereport(LOG, + (errmsg("starting point-in-time recovery to %s", + timestamptz_to_str(recoveryTargetTime)))); + else if (recoveryTarget == RECOVERY_TARGET_NAME) + ereport(LOG, + (errmsg("starting point-in-time recovery to \"%s\"", + recoveryTargetName))); + else if (recoveryTarget == RECOVERY_TARGET_LSN) + ereport(LOG, + (errmsg("starting point-in-time recovery to WAL location (LSN) \"%X/%X\"", + LSN_FORMAT_ARGS(recoveryTargetLSN)))); + else if (recoveryTarget == RECOVERY_TARGET_IMMEDIATE) + ereport(LOG, + (errmsg("starting point-in-time recovery to earliest consistent point"))); + else + ereport(LOG, + (errmsg("starting archive recovery"))); + } + /* * If the location of the checkpoint record is not on the expected * timeline in the history of the requested timeline, we cannot proceed: @@ -805,13 +844,13 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr, * tliSwitchPoint will throw an error if the checkpoint's timeline is * not in expectedTLEs at all. */ - switchpoint = tliSwitchPoint(ControlFile->checkPointCopy.ThisTimeLineID, expectedTLEs, NULL); + switchpoint = tliSwitchPoint(CheckPointTLI, expectedTLEs, NULL); ereport(FATAL, (errmsg("requested timeline %u is not a child of this server's history", recoveryTargetTLI), errdetail("Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X.", - LSN_FORMAT_ARGS(ControlFile->checkPoint), - ControlFile->checkPointCopy.ThisTimeLineID, + LSN_FORMAT_ARGS(CheckPointLoc), + CheckPointTLI, LSN_FORMAT_ARGS(switchpoint)))); } @@ -1080,7 +1119,7 @@ validateRecoveryParameters(void) if ((PrimaryConnInfo == NULL || strcmp(PrimaryConnInfo, "") == 0) && (recoveryRestoreCommand == NULL || strcmp(recoveryRestoreCommand, "") == 0)) ereport(WARNING, - (errmsg("specified neither primary_conninfo nor restore_command"), + (errmsg("specified neither \"primary_conninfo\" nor \"restore_command\""), errhint("The database server will regularly poll the pg_wal subdirectory to check for files placed there."))); } else @@ -1089,7 +1128,7 @@ validateRecoveryParameters(void) strcmp(recoveryRestoreCommand, "") == 0) ereport(FATAL, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("must specify restore_command when standby mode is not enabled"))); + errmsg("must specify \"restore_command\" when standby mode is not enabled"))); } /* @@ -1285,6 +1324,12 @@ read_backup_label(XLogRecPtr *checkPointLoc, TimeLineID *backupLabelTLI, tli_from_file, BACKUP_LABEL_FILE))); } + if (fscanf(lfp, "INCREMENTAL FROM LSN: %X/%X\n", &hi, &lo) > 0) + ereport(FATAL, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("this is an incremental backup, not a data directory"), + errhint("Use pg_combinebackup to reconstruct a valid data directory."))); + if (ferror(lfp) || FreeFile(lfp)) ereport(FATAL, (errcode_for_file_access(), @@ -1341,6 +1386,8 @@ read_tablespace_map(List **tablespaces) { if (!was_backslash && (ch == '\n' || ch == '\r')) { + char *endp; + if (i == 0) continue; /* \r immediately followed by \n */ @@ -1360,7 +1407,12 @@ read_tablespace_map(List **tablespaces) str[n++] = '\0'; ti = palloc0(sizeof(tablespaceinfo)); - ti->oid = pstrdup(str); + errno = 0; + ti->oid = strtoul(str, &endp, 10); + if (*endp != '\0' || errno == EINVAL || errno == ERANGE) + ereport(FATAL, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("invalid data in file \"%s\"", TABLESPACE_MAP))); ti->path = pstrdup(str + n); *tablespaces = lappend(*tablespaces, ti); @@ -1418,6 +1470,21 @@ FinishWalRecovery(void) */ XLogShutdownWalRcv(); + /* + * Shutdown the slot sync worker to drop any temporary slots acquired by + * it and to prevent it from keep trying to fetch the failover slots. + * + * We do not update the 'synced' column in 'pg_replication_slots' system + * view from true to false here, as any failed update could leave 'synced' + * column false for some slots. This could cause issues during slot sync + * after restarting the server as a standby. While updating the 'synced' + * column after switching to the new timeline is an option, it does not + * simplify the handling for the 'synced' column. Therefore, we retain the + * 'synced' column as true after promotion as it may provide useful + * information about the slot origin. + */ + ShutDownSlotSync(); + /* * We are now done reading the xlog from stream. Turn off streaming * recovery to force fetching the files (which would be required at end of @@ -1638,6 +1705,17 @@ PerformWalRecovery(void) replayTLI = RedoStartTLI; XLogPrefetcherBeginRead(xlogprefetcher, RedoStartLSN); record = ReadRecord(xlogprefetcher, PANIC, false, replayTLI); + + /* + * If a checkpoint record's redo pointer points back to an earlier + * LSN, the record at that LSN should be an XLOG_CHECKPOINT_REDO + * record. + */ + if (record->xl_rmid != RM_XLOG_ID || + (record->xl_info & ~XLR_INFO_MASK) != XLOG_CHECKPOINT_REDO) + ereport(FATAL, + (errmsg("unexpected record type found at redo point %X/%X", + LSN_FORMAT_ARGS(xlogreader->ReadRecPtr)))); } else { @@ -1676,9 +1754,7 @@ PerformWalRecovery(void) LSN_FORMAT_ARGS(xlogreader->ReadRecPtr)); #ifdef WAL_DEBUG - if (XLOG_DEBUG || - (record->xl_rmid == RM_XACT_ID && trace_recovery_messages <= DEBUG2) || - (record->xl_rmid != RM_XACT_ID && trace_recovery_messages <= DEBUG3)) + if (XLOG_DEBUG) { StringInfoData buf; @@ -1841,7 +1917,7 @@ ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, TimeLineID *repl error_context_stack = &errcallback; /* - * ShmemVariableCache->nextXid must be beyond record's xid. + * TransamVariables->nextXid must be beyond record's xid. */ AdvanceNextFullTransactionIdPastXid(record->xl_xid); @@ -2086,7 +2162,7 @@ CheckTablespaceDirectory(void) errmsg("unexpected directory entry \"%s\" found in %s", de->d_name, "pg_tblspc/"), errdetail("All directory entries in pg_tblspc/ should be symbolic links."), - errhint("Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete."))); + errhint("Remove those directories, or set \"allow_in_place_tablespaces\" to ON transiently to let recovery complete."))); } } @@ -2123,6 +2199,9 @@ CheckRecoveryConsistency(void) if (!XLogRecPtrIsInvalid(backupEndPoint) && backupEndPoint <= lastReplayedEndRecPtr) { + XLogRecPtr saveBackupStartPoint = backupStartPoint; + XLogRecPtr saveBackupEndPoint = backupEndPoint; + elog(DEBUG1, "end of backup reached"); /* @@ -2133,6 +2212,11 @@ CheckRecoveryConsistency(void) backupStartPoint = InvalidXLogRecPtr; backupEndPoint = InvalidXLogRecPtr; backupEndRequired = false; + + ereport(LOG, + (errmsg("completed backup recovery with redo LSN %X/%X and end LSN %X/%X", + LSN_FORMAT_ARGS(saveBackupStartPoint), + LSN_FORMAT_ARGS(saveBackupEndPoint)))); } /* @@ -3352,12 +3436,12 @@ XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, * validates the page header anyway, and would propagate the failure up to * ReadRecord(), which would retry. However, there's a corner case with * continuation records, if a record is split across two pages such that - * we would need to read the two pages from different sources. For - * example, imagine a scenario where a streaming replica is started up, - * and replay reaches a record that's split across two WAL segments. The - * first page is only available locally, in pg_wal, because it's already - * been recycled on the primary. The second page, however, is not present - * in pg_wal, and we should stream it from the primary. There is a + * we would need to read the two pages from different sources across two + * WAL segments. + * + * The first page is only available locally, in pg_wal, because it's + * already been recycled on the primary. The second page, however, is not + * present in pg_wal, and we should stream it from the primary. There is a * recycled WAL segment present in pg_wal, with garbage contents, however. * We would read the first page from the local WAL segment, but when * reading the second page, we would read the bogus, recycled, WAL @@ -3379,6 +3463,7 @@ XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, * responsible for the validation. */ if (StandbyMode && + (targetPagePtr % wal_segment_size) == 0 && !XLogReaderValidatePageHeader(xlogreader, targetPagePtr, readBuf)) { /* @@ -4687,7 +4772,7 @@ error_multiple_recovery_targets(void) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("multiple recovery targets specified"), - errdetail("At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set."))); + errdetail("At most one of \"recovery_target\", \"recovery_target_lsn\", \"recovery_target_name\", \"recovery_target_time\", \"recovery_target_xid\" may be set."))); } /* @@ -4771,7 +4856,7 @@ check_recovery_target_name(char **newval, void **extra, GucSource source) /* Use the value of newval directly */ if (strlen(*newval) >= MAXFNAMELEN) { - GUC_check_errdetail("%s is too long (maximum %d characters).", + GUC_check_errdetail("\"%s\" is too long (maximum %d characters).", "recovery_target_name", MAXFNAMELEN - 1); return false; } @@ -4895,7 +4980,7 @@ check_recovery_target_timeline(char **newval, void **extra, GucSource source) strtoul(*newval, NULL, 0); if (errno == EINVAL || errno == ERANGE) { - GUC_check_errdetail("recovery_target_timeline is not a valid number."); + GUC_check_errdetail("\"recovery_target_timeline\" is not a valid number."); return false; } } diff --git a/src/backend/access/transam/xlogstats.c b/src/backend/access/transam/xlogstats.c index 2d315df67a08f..2b33decd5a19b 100644 --- a/src/backend/access/transam/xlogstats.c +++ b/src/backend/access/transam/xlogstats.c @@ -3,7 +3,7 @@ * xlogstats.c * Functions for WAL Statitstics * - * Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/access/transam/xlogstats.c diff --git a/src/backend/access/transam/xlogutils.c b/src/backend/access/transam/xlogutils.c index e174a2a8919b7..5295b85fe078c 100644 --- a/src/backend/access/transam/xlogutils.c +++ b/src/backend/access/transam/xlogutils.c @@ -8,7 +8,7 @@ * None of this code is used during normal system operation. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/access/transam/xlogutils.c @@ -22,13 +22,10 @@ #include "access/timeline.h" #include "access/xlogrecovery.h" #include "access/xlog_internal.h" -#include "access/xlogprefetcher.h" #include "access/xlogutils.h" #include "miscadmin.h" -#include "pgstat.h" #include "storage/fd.h" #include "storage/smgr.h" -#include "utils/guc.h" #include "utils/hsearch.h" #include "utils/rel.h" @@ -491,7 +488,7 @@ XLogReadBufferExtended(RelFileLocator rlocator, ForkNumber forknum, } /* Open the relation at smgr level */ - smgr = smgropen(rlocator, InvalidBackendId); + smgr = smgropen(rlocator, INVALID_PROC_NUMBER); /* * Create the target file if it doesn't already exist. This lets us cope @@ -524,7 +521,7 @@ XLogReadBufferExtended(RelFileLocator rlocator, ForkNumber forknum, /* OK to extend the file */ /* we do this in recovery only - no rel-extension lock needed */ Assert(InRecovery); - buffer = ExtendBufferedRelTo(EB_SMGR(smgr, RELPERSISTENCE_PERMANENT), + buffer = ExtendBufferedRelTo(BMR_SMGR(smgr, RELPERSISTENCE_PERMANENT), forknum, NULL, EB_PERFORMING_RECOVERY | @@ -598,7 +595,7 @@ CreateFakeRelcacheEntry(RelFileLocator rlocator) * We will never be working with temp rels during recovery or while * syncing WAL-skipped files. */ - rel->rd_backend = InvalidBackendId; + rel->rd_backend = INVALID_PROC_NUMBER; /* It must be a permanent table here */ rel->rd_rel->relpersistence = RELPERSISTENCE_PERMANENT; @@ -616,7 +613,11 @@ CreateFakeRelcacheEntry(RelFileLocator rlocator) rel->rd_lockInfo.lockRelId.dbId = rlocator.dbOid; rel->rd_lockInfo.lockRelId.relId = rlocator.relNumber; - rel->rd_smgr = NULL; + /* + * Set up a non-pinned SMgrRelation reference, so that we don't need to + * worry about unpinning it on error. + */ + rel->rd_smgr = smgropen(rlocator, INVALID_PROC_NUMBER); return rel; } @@ -627,9 +628,6 @@ CreateFakeRelcacheEntry(RelFileLocator rlocator) void FreeFakeRelcacheEntry(Relation fakerel) { - /* make sure the fakerel is not referenced by the SmgrRelation anymore */ - if (fakerel->rd_smgr != NULL) - smgrclearowner(&fakerel->rd_smgr, fakerel->rd_smgr); pfree(fakerel); } @@ -656,10 +654,10 @@ XLogDropDatabase(Oid dbid) /* * This is unnecessarily heavy-handed, as it will close SMgrRelation * objects for other databases as well. DROP DATABASE occurs seldom enough - * that it's not worth introducing a variant of smgrclose for just this - * purpose. XXX: Or should we rather leave the smgr entries dangling? + * that it's not worth introducing a variant of smgrdestroy for just this + * purpose. */ - smgrcloseall(); + smgrdestroyall(); forget_invalid_pages_db(dbid); } @@ -1006,12 +1004,7 @@ read_local_xlog_page_guts(XLogReaderState *state, XLogRecPtr targetPagePtr, count = read_upto - targetPagePtr; } - /* - * Even though we just determined how much of the page can be validly read - * as 'count', read the whole page anyway. It's guaranteed to be - * zero-padded up to the page boundary if it's incomplete. - */ - if (!WALRead(state, cur_page, targetPagePtr, XLOG_BLCKSZ, tli, + if (!WALRead(state, cur_page, targetPagePtr, count, tli, &errinfo)) WALReadRaiseError(&errinfo); diff --git a/src/backend/archive/meson.build b/src/backend/archive/meson.build index e194282931c92..51a71673e65f4 100644 --- a/src/backend/archive/meson.build +++ b/src/backend/archive/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2023, PostgreSQL Global Development Group +# Copyright (c) 2023-2024, PostgreSQL Global Development Group backend_sources += files( 'shell_archive.c' diff --git a/src/backend/archive/shell_archive.c b/src/backend/archive/shell_archive.c index 157ca4c751b7e..506c5a30ad209 100644 --- a/src/backend/archive/shell_archive.c +++ b/src/backend/archive/shell_archive.c @@ -6,7 +6,7 @@ * archive_command GUC) to copy write-ahead log files. It is used as the * default, but other modules may define their own custom archiving logic. * - * Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/archive/shell_archive.c @@ -45,7 +45,12 @@ shell_archive_init(void) static bool shell_archive_configured(ArchiveModuleState *state) { - return XLogArchiveCommand[0] != '\0'; + if (XLogArchiveCommand[0] != '\0') + return true; + + arch_module_check_errdetail("%s is not set.", + "archive_command"); + return false; } static bool @@ -66,9 +71,6 @@ shell_archive_file(ArchiveModuleState *state, const char *file, "archive_command", "fp", file, nativePath); - if (nativePath) - pfree(nativePath); - ereport(DEBUG3, (errmsg_internal("executing archive command \"%s\"", xlogarchcmd))); @@ -123,10 +125,10 @@ shell_archive_file(ArchiveModuleState *state, const char *file, errdetail("The failed archive command was: %s", xlogarchcmd))); } + pfree(xlogarchcmd); return false; } - pfree(xlogarchcmd); elog(DEBUG1, "archived write-ahead log file \"%s\"", file); diff --git a/src/backend/backup/Makefile b/src/backend/backup/Makefile index b21bd8ff4368d..751e6d3d5e2e4 100644 --- a/src/backend/backup/Makefile +++ b/src/backend/backup/Makefile @@ -19,12 +19,15 @@ OBJS = \ basebackup.o \ basebackup_copy.o \ basebackup_gzip.o \ + basebackup_incremental.o \ basebackup_lz4.o \ basebackup_zstd.o \ basebackup_progress.o \ basebackup_server.o \ basebackup_sink.o \ basebackup_target.o \ - basebackup_throttle.o + basebackup_throttle.o \ + walsummary.o \ + walsummaryfuncs.o include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/backup/backup_manifest.c b/src/backend/backup/backup_manifest.c index cee62165246bf..b360a135472e9 100644 --- a/src/backend/backup/backup_manifest.c +++ b/src/backend/backup/backup_manifest.c @@ -3,7 +3,7 @@ * backup_manifest.c * code for generating and sending a backup manifest * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/backup/backup_manifest.c @@ -13,10 +13,9 @@ #include "postgres.h" #include "access/timeline.h" +#include "access/xlog.h" #include "backup/backup_manifest.h" #include "backup/basebackup_sink.h" -#include "libpq/libpq.h" -#include "libpq/pqformat.h" #include "mb/pg_wchar.h" #include "utils/builtins.h" #include "utils/json.h" @@ -79,8 +78,10 @@ InitializeBackupManifest(backup_manifest_info *manifest, if (want_manifest != MANIFEST_OPTION_NO) AppendToManifest(manifest, - "{ \"PostgreSQL-Backup-Manifest-Version\": 1,\n" - "\"Files\": ["); + "{ \"PostgreSQL-Backup-Manifest-Version\": 2,\n" + "\"System-Identifier\": " UINT64_FORMAT ",\n" + "\"Files\": [", + GetSystemIdentifier()); } /* @@ -97,7 +98,7 @@ FreeBackupManifest(backup_manifest_info *manifest) * Add an entry to the backup manifest for a file. */ void -AddFileToBackupManifest(backup_manifest_info *manifest, const char *spcoid, +AddFileToBackupManifest(backup_manifest_info *manifest, Oid spcoid, const char *pathname, size_t size, pg_time_t mtime, pg_checksum_context *checksum_ctx) { @@ -114,9 +115,9 @@ AddFileToBackupManifest(backup_manifest_info *manifest, const char *spcoid, * pathname relative to the data directory (ignoring the intermediate * symlink traversal). */ - if (spcoid != NULL) + if (OidIsValid(spcoid)) { - snprintf(pathbuf, sizeof(pathbuf), "pg_tblspc/%s/%s", spcoid, + snprintf(pathbuf, sizeof(pathbuf), "pg_tblspc/%u/%s", spcoid, pathname); pathname = pathbuf; } diff --git a/src/backend/backup/basebackup.c b/src/backend/backup/basebackup.c index 45be21131c5cb..9a2bf59e84ee4 100644 --- a/src/backend/backup/basebackup.c +++ b/src/backend/backup/basebackup.c @@ -3,7 +3,7 @@ * basebackup.c * code for taking a base backup and streaming it to a standby * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/backup/basebackup.c @@ -20,11 +20,14 @@ #include "access/xlogbackup.h" #include "backup/backup_manifest.h" #include "backup/basebackup.h" +#include "backup/basebackup_incremental.h" #include "backup/basebackup_sink.h" #include "backup/basebackup_target.h" +#include "catalog/pg_tablespace_d.h" #include "commands/defrem.h" #include "common/compression.h" #include "common/file_perm.h" +#include "common/file_utils.h" #include "lib/stringinfo.h" #include "miscadmin.h" #include "nodes/pg_list.h" @@ -32,12 +35,12 @@ #include "pgtar.h" #include "port.h" #include "postmaster/syslogger.h" +#include "postmaster/walsummarizer.h" #include "replication/walsender.h" #include "replication/walsender_private.h" #include "storage/bufpage.h" #include "storage/checksum.h" #include "storage/dsm_impl.h" -#include "storage/fd.h" #include "storage/ipc.h" #include "storage/reinit.h" #include "utils/builtins.h" @@ -45,7 +48,6 @@ #include "utils/ps_status.h" #include "utils/relcache.h" #include "utils/resowner.h" -#include "utils/timestamp.h" /* * How much data do we want to send in one CopyData message? Note that @@ -64,6 +66,7 @@ typedef struct bool fastcheckpoint; bool nowait; bool includewal; + bool incremental; uint32 maxrate; bool sendtblspcmapfile; bool send_to_client; @@ -75,28 +78,46 @@ typedef struct pg_checksum_type manifest_checksum_type; } basebackup_options; -static int64 sendTablespace(bbsink *sink, char *path, char *spcoid, bool sizeonly, - struct backup_manifest_info *manifest); +static int64 sendTablespace(bbsink *sink, char *path, Oid spcoid, bool sizeonly, + struct backup_manifest_info *manifest, + IncrementalBackupInfo *ib); static int64 sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, List *tablespaces, bool sendtblspclinks, - backup_manifest_info *manifest, const char *spcoid); + backup_manifest_info *manifest, Oid spcoid, + IncrementalBackupInfo *ib); static bool sendFile(bbsink *sink, const char *readfilename, const char *tarfilename, - struct stat *statbuf, bool missing_ok, Oid dboid, - backup_manifest_info *manifest, const char *spcoid); + struct stat *statbuf, bool missing_ok, + Oid dboid, Oid spcoid, RelFileNumber relfilenumber, + unsigned segno, + backup_manifest_info *manifest, + unsigned num_incremental_blocks, + BlockNumber *incremental_blocks, + unsigned truncation_block_length); +static off_t read_file_data_into_buffer(bbsink *sink, + const char *readfilename, int fd, + off_t offset, size_t length, + BlockNumber blkno, + bool verify_checksum, + int *checksum_failures); +static void push_to_sink(bbsink *sink, pg_checksum_context *checksum_ctx, + size_t *bytes_done, void *data, size_t length); +static bool verify_page_checksum(Page page, XLogRecPtr start_lsn, + BlockNumber blkno, + uint16 *expected_checksum); static void sendFileWithContent(bbsink *sink, const char *filename, - const char *content, + const char *content, int len, backup_manifest_info *manifest); static int64 _tarWriteHeader(bbsink *sink, const char *filename, const char *linktarget, struct stat *statbuf, bool sizeonly); static void _tarWritePadding(bbsink *sink, int len); static void convert_link_to_directory(const char *pathbuf, struct stat *statbuf); -static void perform_base_backup(basebackup_options *opt, bbsink *sink); +static void perform_base_backup(basebackup_options *opt, bbsink *sink, + IncrementalBackupInfo *ib); static void parse_basebackup_options(List *options, basebackup_options *opt); static int compareWalFileNames(const ListCell *a, const ListCell *b); -static bool is_checksummed_file(const char *fullpath, const char *filename); -static int basebackup_read_file(int fd, char *buf, size_t nbytes, off_t offset, - const char *filename, bool partial_read_ok); +static ssize_t basebackup_read_file(int fd, char *buf, size_t nbytes, off_t offset, + const char *filename, bool partial_read_ok); /* Was the backup currently in-progress initiated in recovery mode? */ static bool backup_started_in_recovery = false; @@ -203,23 +224,6 @@ static const struct exclude_list_item excludeFiles[] = {NULL, false} }; -/* - * List of files excluded from checksum validation. - * - * Note: this list should be kept in sync with what pg_checksums.c - * includes. - */ -static const struct exclude_list_item noChecksumFiles[] = { - {"pg_control", false}, - {"pg_filenode.map", false}, - {"pg_internal.init", true}, - {"PG_VERSION", false}, -#ifdef EXEC_BACKEND - {"config_exec_params", true}, -#endif - {NULL, false} -}; - /* * Actually do a base backup for the specified tablespaces. * @@ -227,7 +231,8 @@ static const struct exclude_list_item noChecksumFiles[] = { * clobbered by longjmp" from stupider versions of gcc. */ static void -perform_base_backup(basebackup_options *opt, bbsink *sink) +perform_base_backup(basebackup_options *opt, bbsink *sink, + IncrementalBackupInfo *ib) { bbsink_state state; XLogRecPtr endptr; @@ -277,6 +282,10 @@ perform_base_backup(basebackup_options *opt, bbsink *sink) ListCell *lc; tablespaceinfo *newti; + /* If this is an incremental backup, execute preparatory steps. */ + if (ib != NULL) + PrepareForIncrementalBackup(ib, backup_state); + /* Add a node for the base directory at the end */ newti = palloc0(sizeof(tablespaceinfo)); newti->size = -1; @@ -296,10 +305,10 @@ perform_base_backup(basebackup_options *opt, bbsink *sink) if (tmp->path == NULL) tmp->size = sendDir(sink, ".", 1, true, state.tablespaces, - true, NULL, NULL); + true, NULL, InvalidOid, NULL); else tmp->size = sendTablespace(sink, tmp->path, tmp->oid, true, - NULL); + NULL, NULL); state.bytes_total += tmp->size; } state.bytes_total_is_valid = true; @@ -324,20 +333,20 @@ perform_base_backup(basebackup_options *opt, bbsink *sink) /* In the main tar, include the backup_label first... */ backup_label = build_backup_content(backup_state, false); sendFileWithContent(sink, BACKUP_LABEL_FILE, - backup_label, &manifest); + backup_label, -1, &manifest); pfree(backup_label); /* Then the tablespace_map file, if required... */ if (opt->sendtblspcmapfile) { sendFileWithContent(sink, TABLESPACE_MAP, - tablespace_map->data, &manifest); + tablespace_map->data, -1, &manifest); sendtblspclinks = false; } /* Then the bulk of the files... */ sendDir(sink, ".", 1, false, state.tablespaces, - sendtblspclinks, &manifest, NULL); + sendtblspclinks, &manifest, InvalidOid, ib); /* ... and pg_control after everything else. */ if (lstat(XLOG_CONTROL_FILE, &statbuf) != 0) @@ -346,15 +355,16 @@ perform_base_backup(basebackup_options *opt, bbsink *sink) errmsg("could not stat file \"%s\": %m", XLOG_CONTROL_FILE))); sendFile(sink, XLOG_CONTROL_FILE, XLOG_CONTROL_FILE, &statbuf, - false, InvalidOid, &manifest, NULL); + false, InvalidOid, InvalidOid, + InvalidRelFileNumber, 0, &manifest, 0, NULL, 0); } else { - char *archive_name = psprintf("%s.tar", ti->oid); + char *archive_name = psprintf("%u.tar", ti->oid); bbsink_begin_archive(sink, archive_name); - sendTablespace(sink, ti->path, ti->oid, false, &manifest); + sendTablespace(sink, ti->path, ti->oid, false, &manifest, ib); } /* @@ -387,8 +397,7 @@ perform_base_backup(basebackup_options *opt, bbsink *sink) endtli = backup_state->stoptli; /* Deallocate backup-related variables. */ - pfree(tablespace_map->data); - pfree(tablespace_map); + destroyStringInfo(tablespace_map); pfree(backup_state); } PG_END_ENSURE_ERROR_CLEANUP(do_pg_abort_backup, BoolGetDatum(false)); @@ -514,7 +523,7 @@ perform_base_backup(basebackup_options *opt, bbsink *sink) { char *walFileName = (char *) lfirst(lc); int fd; - size_t cnt; + ssize_t cnt; pgoff_t len = 0; snprintf(pathbuf, MAXPGPATH, XLOGDIR "/%s", walFileName); @@ -591,7 +600,7 @@ perform_base_backup(basebackup_options *opt, bbsink *sink) * complete segment. */ StatusFilePath(pathbuf, walFileName, ".done"); - sendFileWithContent(sink, pathbuf, "", &manifest); + sendFileWithContent(sink, pathbuf, "", -1, &manifest); } /* @@ -614,12 +623,13 @@ perform_base_backup(basebackup_options *opt, bbsink *sink) (errcode_for_file_access(), errmsg("could not stat file \"%s\": %m", pathbuf))); - sendFile(sink, pathbuf, pathbuf, &statbuf, false, InvalidOid, - &manifest, NULL); + sendFile(sink, pathbuf, pathbuf, &statbuf, false, + InvalidOid, InvalidOid, InvalidRelFileNumber, 0, + &manifest, 0, NULL, 0); /* unconditionally mark file as archived */ StatusFilePath(pathbuf, fname, ".done"); - sendFileWithContent(sink, pathbuf, "", &manifest); + sendFileWithContent(sink, pathbuf, "", -1, &manifest); } /* Properly terminate the tar file. */ @@ -691,6 +701,7 @@ parse_basebackup_options(List *options, basebackup_options *opt) bool o_checkpoint = false; bool o_nowait = false; bool o_wal = false; + bool o_incremental = false; bool o_maxrate = false; bool o_tablespace_map = false; bool o_noverify_checksums = false; @@ -769,6 +780,19 @@ parse_basebackup_options(List *options, basebackup_options *opt) opt->includewal = defGetBoolean(defel); o_wal = true; } + else if (strcmp(defel->defname, "incremental") == 0) + { + if (o_incremental) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("duplicate option \"%s\"", defel->defname))); + opt->incremental = defGetBoolean(defel); + if (opt->incremental && !summarize_wal) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("incremental backups cannot be taken unless WAL summarization is enabled"))); + o_incremental = true; + } else if (strcmp(defel->defname, "max_rate") == 0) { int64 maxrate; @@ -961,7 +985,7 @@ parse_basebackup_options(List *options, basebackup_options *opt) * the filesystem, bypassing the buffer cache. */ void -SendBaseBackup(BaseBackupCmd *cmd) +SendBaseBackup(BaseBackupCmd *cmd, IncrementalBackupInfo *ib) { basebackup_options opt; bbsink *sink; @@ -985,6 +1009,20 @@ SendBaseBackup(BaseBackupCmd *cmd) set_ps_display(activitymsg); } + /* + * If we're asked to perform an incremental backup and the user has not + * supplied a manifest, that's an ERROR. + * + * If we're asked to perform a full backup and the user did supply a + * manifest, just ignore it. + */ + if (!opt.incremental) + ib = NULL; + else if (ib == NULL) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP"))); + /* * If the target is specifically 'client' then set up to stream the backup * to the client; otherwise, it's being sent someplace else and should not @@ -1016,7 +1054,7 @@ SendBaseBackup(BaseBackupCmd *cmd) */ PG_TRY(); { - perform_base_backup(&opt, sink); + perform_base_backup(&opt, sink, ib); } PG_FINALLY(); { @@ -1027,26 +1065,29 @@ SendBaseBackup(BaseBackupCmd *cmd) /* * Inject a file with given name and content in the output tar stream. + * + * "len" can optionally be set to an arbitrary length of data sent. If set + * to -1, the content sent is treated as a string with strlen() as length. */ static void sendFileWithContent(bbsink *sink, const char *filename, const char *content, - backup_manifest_info *manifest) + int len, backup_manifest_info *manifest) { struct stat statbuf; - int bytes_done = 0, - len; + int bytes_done = 0; pg_checksum_context checksum_ctx; if (pg_checksum_init(&checksum_ctx, manifest->checksum_type) < 0) elog(ERROR, "could not initialize checksum of file \"%s\"", filename); - len = strlen(content); + if (len < 0) + len = strlen(content); /* - * Construct a stat struct for the backup_label file we're injecting in - * the tar. + * Construct a stat struct for the file we're injecting in the tar. */ + /* Windows doesn't have the concept of uid and gid */ #ifdef WIN32 statbuf.st_uid = 0; @@ -1078,7 +1119,7 @@ sendFileWithContent(bbsink *sink, const char *filename, const char *content, _tarWritePadding(sink, len); - AddFileToBackupManifest(manifest, NULL, filename, len, + AddFileToBackupManifest(manifest, InvalidOid, filename, len, (pg_time_t) statbuf.st_mtime, &checksum_ctx); } @@ -1090,8 +1131,8 @@ sendFileWithContent(bbsink *sink, const char *filename, const char *content, * Only used to send auxiliary tablespaces, not PGDATA. */ static int64 -sendTablespace(bbsink *sink, char *path, char *spcoid, bool sizeonly, - backup_manifest_info *manifest) +sendTablespace(bbsink *sink, char *path, Oid spcoid, bool sizeonly, + backup_manifest_info *manifest, IncrementalBackupInfo *ib) { int64 size; char pathbuf[MAXPGPATH]; @@ -1125,7 +1166,7 @@ sendTablespace(bbsink *sink, char *path, char *spcoid, bool sizeonly, /* Send all the files in the tablespace version directory */ size += sendDir(sink, pathbuf, strlen(path), sizeonly, NIL, true, manifest, - spcoid); + spcoid, ib); return size; } @@ -1145,7 +1186,7 @@ sendTablespace(bbsink *sink, char *path, char *spcoid, bool sizeonly, static int64 sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, List *tablespaces, bool sendtblspclinks, backup_manifest_info *manifest, - const char *spcoid) + Oid spcoid, IncrementalBackupInfo *ib) { DIR *dir; struct dirent *de; @@ -1153,7 +1194,17 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, struct stat statbuf; int64 size = 0; const char *lastDir; /* Split last dir from parent path. */ - bool isDbDir = false; /* Does this directory contain relations? */ + bool isRelationDir = false; /* Does directory contain relations? */ + bool isGlobalDir = false; + Oid dboid = InvalidOid; + BlockNumber *relative_block_numbers = NULL; + + /* + * Since this array is relatively large, avoid putting it on the stack. + * But we don't need it at all if this is not an incremental backup. + */ + if (ib != NULL) + relative_block_numbers = palloc(sizeof(BlockNumber) * RELSEG_SIZE); /* * Determine if the current path is a database directory that can contain @@ -1180,7 +1231,15 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, strncmp(lastDir - (sizeof(TABLESPACE_VERSION_DIRECTORY) - 1), TABLESPACE_VERSION_DIRECTORY, sizeof(TABLESPACE_VERSION_DIRECTORY) - 1) == 0)) - isDbDir = true; + { + isRelationDir = true; + dboid = atooid(lastDir + 1); + } + } + else if (strcmp(path, "./global") == 0) + { + isRelationDir = true; + isGlobalDir = true; } dir = AllocateDir(path); @@ -1188,9 +1247,10 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, { int excludeIdx; bool excludeFound; - ForkNumber relForkNum; /* Type of fork if file is a relation */ - int relnumchars; /* Chars in filename that are the - * relnumber */ + RelFileNumber relfilenumber = InvalidRelFileNumber; + ForkNumber relForkNum = InvalidForkNumber; + unsigned segno = 0; + bool isRelationFile = false; /* Skip special stuff */ if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) @@ -1202,6 +1262,10 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, strlen(PG_TEMP_FILE_PREFIX)) == 0) continue; + /* Skip macOS system files */ + if (strcmp(de->d_name, ".DS_Store") == 0) + continue; + /* * Check if the postmaster has signaled us to exit, and abort with an * error in that case. The error handler further up will call @@ -1238,40 +1302,40 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, if (excludeFound) continue; + /* + * If there could be non-temporary relation files in this directory, + * try to parse the filename. + */ + if (isRelationDir) + isRelationFile = + parse_filename_for_nontemp_relation(de->d_name, + &relfilenumber, + &relForkNum, &segno); + /* Exclude all forks for unlogged tables except the init fork */ - if (isDbDir && - parse_filename_for_nontemp_relation(de->d_name, &relnumchars, - &relForkNum)) + if (isRelationFile && relForkNum != INIT_FORKNUM) { - /* Never exclude init forks */ - if (relForkNum != INIT_FORKNUM) - { - char initForkFile[MAXPGPATH]; - char relNumber[OIDCHARS + 1]; + char initForkFile[MAXPGPATH]; - /* - * If any other type of fork, check if there is an init fork - * with the same RelFileNumber. If so, the file can be - * excluded. - */ - memcpy(relNumber, de->d_name, relnumchars); - relNumber[relnumchars] = '\0'; - snprintf(initForkFile, sizeof(initForkFile), "%s/%s_init", - path, relNumber); + /* + * If any other type of fork, check if there is an init fork with + * the same RelFileNumber. If so, the file can be excluded. + */ + snprintf(initForkFile, sizeof(initForkFile), "%s/%u_init", + path, relfilenumber); - if (lstat(initForkFile, &statbuf) == 0) - { - elog(DEBUG2, - "unlogged relation file \"%s\" excluded from backup", - de->d_name); + if (lstat(initForkFile, &statbuf) == 0) + { + elog(DEBUG2, + "unlogged relation file \"%s\" excluded from backup", + de->d_name); - continue; - } + continue; } } /* Exclude temporary relations */ - if (isDbDir && looks_like_temp_rel_name(de->d_name)) + if (OidIsValid(dboid) && looks_like_temp_rel_name(de->d_name)) { elog(DEBUG2, "temporary relation file \"%s\" excluded from backup", @@ -1329,11 +1393,13 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, &statbuf, sizeonly); /* - * Also send archive_status directory (by hackishly reusing - * statbuf from above ...). + * Also send archive_status and summaries directories (by + * hackishly reusing statbuf from above ...). */ size += _tarWriteHeader(sink, "./pg_wal/archive_status", NULL, &statbuf, sizeonly); + size += _tarWriteHeader(sink, "./pg_wal/summaries", NULL, + &statbuf, sizeonly); continue; /* don't recurse into pg_wal */ } @@ -1402,16 +1468,64 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, if (!skip_this_dir) size += sendDir(sink, pathbuf, basepathlen, sizeonly, tablespaces, - sendtblspclinks, manifest, spcoid); + sendtblspclinks, manifest, spcoid, ib); } else if (S_ISREG(statbuf.st_mode)) { bool sent = false; + unsigned num_blocks_required = 0; + unsigned truncation_block_length = 0; + char tarfilenamebuf[MAXPGPATH * 2]; + char *tarfilename = pathbuf + basepathlen + 1; + FileBackupMethod method = BACK_UP_FILE_FULLY; + + if (ib != NULL && isRelationFile) + { + Oid relspcoid; + char *lookup_path; + + if (OidIsValid(spcoid)) + { + relspcoid = spcoid; + lookup_path = psprintf("pg_tblspc/%u/%s", spcoid, + tarfilename); + } + else + { + if (isGlobalDir) + relspcoid = GLOBALTABLESPACE_OID; + else + relspcoid = DEFAULTTABLESPACE_OID; + lookup_path = pstrdup(tarfilename); + } + + method = GetFileBackupMethod(ib, lookup_path, dboid, relspcoid, + relfilenumber, relForkNum, + segno, statbuf.st_size, + &num_blocks_required, + relative_block_numbers, + &truncation_block_length); + if (method == BACK_UP_FILE_INCREMENTALLY) + { + statbuf.st_size = + GetIncrementalFileSize(num_blocks_required); + snprintf(tarfilenamebuf, sizeof(tarfilenamebuf), + "%s/INCREMENTAL.%s", + path + basepathlen + 1, + de->d_name); + tarfilename = tarfilenamebuf; + } + + pfree(lookup_path); + } if (!sizeonly) - sent = sendFile(sink, pathbuf, pathbuf + basepathlen + 1, &statbuf, - true, isDbDir ? atooid(lastDir + 1) : InvalidOid, - manifest, spcoid); + sent = sendFile(sink, pathbuf, tarfilename, &statbuf, + true, dboid, spcoid, + relfilenumber, segno, manifest, + num_blocks_required, + method == BACK_UP_FILE_INCREMENTALLY ? relative_block_numbers : NULL, + truncation_block_length); if (sent || sizeonly) { @@ -1429,42 +1543,12 @@ sendDir(bbsink *sink, const char *path, int basepathlen, bool sizeonly, ereport(WARNING, (errmsg("skipping special file \"%s\"", pathbuf))); } - FreeDir(dir); - return size; -} - -/* - * Check if a file should have its checksum validated. - * We validate checksums on files in regular tablespaces - * (including global and default) only, and in those there - * are some files that are explicitly excluded. - */ -static bool -is_checksummed_file(const char *fullpath, const char *filename) -{ - /* Check that the file is in a tablespace */ - if (strncmp(fullpath, "./global/", 9) == 0 || - strncmp(fullpath, "./base/", 7) == 0 || - strncmp(fullpath, "/", 1) == 0) - { - int excludeIdx; - /* Compare file against noChecksumFiles skip list */ - for (excludeIdx = 0; noChecksumFiles[excludeIdx].name != NULL; excludeIdx++) - { - int cmplen = strlen(noChecksumFiles[excludeIdx].name); + if (relative_block_numbers != NULL) + pfree(relative_block_numbers); - if (!noChecksumFiles[excludeIdx].match_prefix) - cmplen++; - if (strncmp(filename, noChecksumFiles[excludeIdx].name, - cmplen) == 0) - return false; - } - - return true; - } - else - return false; + FreeDir(dir); + return size; } /* @@ -1475,28 +1559,30 @@ is_checksummed_file(const char *fullpath, const char *filename) * If dboid is anything other than InvalidOid then any checksum failures * detected will get reported to the cumulative stats system. * + * If the file is to be sent incrementally, then num_incremental_blocks + * should be the number of blocks to be sent, and incremental_blocks + * an array of block numbers relative to the start of the current segment. + * If the whole file is to be sent, then incremental_blocks should be NULL, + * and num_incremental_blocks can have any value, as it will be ignored. + * * Returns true if the file was successfully sent, false if 'missing_ok', * and the file did not exist. */ static bool sendFile(bbsink *sink, const char *readfilename, const char *tarfilename, - struct stat *statbuf, bool missing_ok, Oid dboid, - backup_manifest_info *manifest, const char *spcoid) + struct stat *statbuf, bool missing_ok, Oid dboid, Oid spcoid, + RelFileNumber relfilenumber, unsigned segno, + backup_manifest_info *manifest, unsigned num_incremental_blocks, + BlockNumber *incremental_blocks, unsigned truncation_block_length) { int fd; BlockNumber blkno = 0; - bool block_retry = false; - uint16 checksum; int checksum_failures = 0; off_t cnt; - int i; - pgoff_t len = 0; - char *page; - PageHeader phdr; - int segmentno = 0; - char *segmentpath; + pgoff_t bytes_done = 0; bool verify_checksum = false; pg_checksum_context checksum_ctx; + int ibindex = 0; if (pg_checksum_init(&checksum_ctx, manifest->checksum_type) < 0) elog(ERROR, "could not initialize checksum of file \"%s\"", @@ -1514,35 +1600,75 @@ sendFile(bbsink *sink, const char *readfilename, const char *tarfilename, _tarWriteHeader(sink, tarfilename, NULL, statbuf, false); - if (!noverify_checksums && DataChecksumsEnabled()) + /* + * Checksums are verified in multiples of BLCKSZ, so the buffer length + * should be a multiple of the block size as well. + */ + Assert((sink->bbs_buffer_length % BLCKSZ) == 0); + + /* + * If we weren't told not to verify checksums, and if checksums are + * enabled for this cluster, and if this is a relation file, then verify + * the checksum. + */ + if (!noverify_checksums && DataChecksumsEnabled() && + RelFileNumberIsValid(relfilenumber)) + verify_checksum = true; + + /* + * If we're sending an incremental file, write the file header. + */ + if (incremental_blocks != NULL) { - char *filename; + unsigned magic = INCREMENTAL_MAGIC; + size_t header_bytes_done = 0; + char padding[BLCKSZ]; + size_t paddinglen; + + /* Emit header data. */ + push_to_sink(sink, &checksum_ctx, &header_bytes_done, + &magic, sizeof(magic)); + push_to_sink(sink, &checksum_ctx, &header_bytes_done, + &num_incremental_blocks, sizeof(num_incremental_blocks)); + push_to_sink(sink, &checksum_ctx, &header_bytes_done, + &truncation_block_length, sizeof(truncation_block_length)); + push_to_sink(sink, &checksum_ctx, &header_bytes_done, + incremental_blocks, + sizeof(BlockNumber) * num_incremental_blocks); /* - * Get the filename (excluding path). As last_dir_separator() - * includes the last directory separator, we chop that off by - * incrementing the pointer. + * Add padding to align header to a multiple of BLCKSZ, but only if + * the incremental file has some blocks, and the alignment is actually + * needed (i.e. header is not already a multiple of BLCKSZ). If there + * are no blocks we don't want to make the file unnecessarily large, + * as that might make some filesystem optimizations impossible. */ - filename = last_dir_separator(readfilename) + 1; - - if (is_checksummed_file(readfilename, filename)) + if ((num_incremental_blocks > 0) && (header_bytes_done % BLCKSZ != 0)) { - verify_checksum = true; + paddinglen = (BLCKSZ - (header_bytes_done % BLCKSZ)); - /* - * Cut off at the segment boundary (".") to get the segment number - * in order to mix it into the checksum. - */ - segmentpath = strstr(filename, "."); - if (segmentpath != NULL) - { - segmentno = atoi(segmentpath + 1); - if (segmentno == 0) - ereport(ERROR, - (errmsg("invalid segment number %d in file \"%s\"", - segmentno, filename))); - } + memset(padding, 0, paddinglen); + bytes_done += paddinglen; + + push_to_sink(sink, &checksum_ctx, &header_bytes_done, + padding, paddinglen); + } + + /* Flush out any data still in the buffer so it's again empty. */ + if (header_bytes_done > 0) + { + bbsink_archive_contents(sink, header_bytes_done); + if (pg_checksum_update(&checksum_ctx, + (uint8 *) sink->bbs_buffer, + header_bytes_done) < 0) + elog(ERROR, "could not update checksum of base backup"); } + + /* Update our notion of file position. */ + bytes_done += sizeof(magic); + bytes_done += sizeof(num_incremental_blocks); + bytes_done += sizeof(truncation_block_length); + bytes_done += sizeof(BlockNumber) * num_incremental_blocks; } /* @@ -1551,23 +1677,74 @@ sendFile(bbsink *sink, const char *readfilename, const char *tarfilename, * for a base backup we can ignore such extended data. It will be restored * from WAL. */ - while (len < statbuf->st_size) + while (1) { - size_t remaining = statbuf->st_size - len; + /* + * Determine whether we've read all the data that we need, and if not, + * read some more. + */ + if (incremental_blocks == NULL) + { + size_t remaining = statbuf->st_size - bytes_done; + + /* + * If we've read the required number of bytes, then it's time to + * stop. + */ + if (bytes_done >= statbuf->st_size) + break; + + /* + * Read as many bytes as will fit in the buffer, or however many + * are left to read, whichever is less. + */ + cnt = read_file_data_into_buffer(sink, readfilename, fd, + bytes_done, remaining, + blkno + segno * RELSEG_SIZE, + verify_checksum, + &checksum_failures); + } + else + { + BlockNumber relative_blkno; + + /* + * If we've read all the blocks, then it's time to stop. + */ + if (ibindex >= num_incremental_blocks) + break; + + /* + * Read just one block, whichever one is the next that we're + * supposed to include. + */ + relative_blkno = incremental_blocks[ibindex++]; + cnt = read_file_data_into_buffer(sink, readfilename, fd, + relative_blkno * BLCKSZ, + BLCKSZ, + relative_blkno + segno * RELSEG_SIZE, + verify_checksum, + &checksum_failures); - /* Try to read some more data. */ - cnt = basebackup_read_file(fd, sink->bbs_buffer, - Min(sink->bbs_buffer_length, remaining), - len, readfilename, true); + /* + * If we get a partial read, that must mean that the relation is + * being truncated. Ultimately, it should be truncated to a + * multiple of BLCKSZ, since this path should only be reached for + * relation files, but we might transiently observe an + * intermediate value. + * + * It should be fine to treat this just as if the entire block had + * been truncated away - i.e. fill this and all later blocks with + * zeroes. WAL replay will fix things up. + */ + if (cnt < BLCKSZ) + break; + } /* - * The checksums are verified at block level, so we iterate over the - * buffer in chunks of BLCKSZ, after making sure that - * TAR_SEND_SIZE/buf is divisible by BLCKSZ and we read a multiple of - * BLCKSZ bytes. + * If the amount of data we were able to read was not a multiple of + * BLCKSZ, we cannot verify checksums, which are block-level. */ - Assert((sink->bbs_buffer_length % BLCKSZ) == 0); - if (verify_checksum && (cnt % BLCKSZ != 0)) { ereport(WARNING, @@ -1578,100 +1755,6 @@ sendFile(bbsink *sink, const char *readfilename, const char *tarfilename, verify_checksum = false; } - if (verify_checksum) - { - for (i = 0; i < cnt / BLCKSZ; i++) - { - page = sink->bbs_buffer + BLCKSZ * i; - - /* - * Only check pages which have not been modified since the - * start of the base backup. Otherwise, they might have been - * written only halfway and the checksum would not be valid. - * However, replaying WAL would reinstate the correct page in - * this case. We also skip completely new pages, since they - * don't have a checksum yet. - */ - if (!PageIsNew(page) && PageGetLSN(page) < sink->bbs_state->startptr) - { - checksum = pg_checksum_page((char *) page, blkno + segmentno * RELSEG_SIZE); - phdr = (PageHeader) page; - if (phdr->pd_checksum != checksum) - { - /* - * Retry the block on the first failure. It's - * possible that we read the first 4K page of the - * block just before postgres updated the entire block - * so it ends up looking torn to us. If, before we - * retry the read, the concurrent write of the block - * finishes, the page LSN will be updated and we'll - * realize that we should ignore this block. - * - * There's no guarantee that this will actually - * happen, though: the torn write could take an - * arbitrarily long time to complete. Retrying - * multiple times wouldn't fix this problem, either, - * though it would reduce the chances of it happening - * in practice. The only real fix here seems to be to - * have some kind of interlock that allows us to wait - * until we can be certain that no write to the block - * is in progress. Since we don't have any such thing - * right now, we just do this and hope for the best. - */ - if (block_retry == false) - { - int reread_cnt; - - /* Reread the failed block */ - reread_cnt = - basebackup_read_file(fd, - sink->bbs_buffer + BLCKSZ * i, - BLCKSZ, len + BLCKSZ * i, - readfilename, - false); - if (reread_cnt == 0) - { - /* - * If we hit end-of-file, a concurrent - * truncation must have occurred, so break out - * of this loop just as if the initial fread() - * returned 0. We'll drop through to the same - * code that handles that case. (We must fix - * up cnt first, though.) - */ - cnt = BLCKSZ * i; - break; - } - - /* Set flag so we know a retry was attempted */ - block_retry = true; - - /* Reset loop to validate the block again */ - i--; - continue; - } - - checksum_failures++; - - if (checksum_failures <= 5) - ereport(WARNING, - (errmsg("checksum verification failed in " - "file \"%s\", block %u: calculated " - "%X but expected %X", - readfilename, blkno, checksum, - phdr->pd_checksum))); - if (checksum_failures == 5) - ereport(WARNING, - (errmsg("further checksum verification " - "failures in file \"%s\" will not " - "be reported", readfilename))); - } - } - block_retry = false; - blkno++; - } - } - /* * If we hit end-of-file, a concurrent truncation must have occurred. * That's not an error condition, because WAL replay will fix things @@ -1680,6 +1763,17 @@ sendFile(bbsink *sink, const char *readfilename, const char *tarfilename, if (cnt == 0) break; + /* Update block number and # of bytes done for next loop iteration. */ + blkno += cnt / BLCKSZ; + bytes_done += cnt; + + /* + * Make sure incremental files with block data are properly aligned + * (header is a multiple of BLCKSZ, blocks are BLCKSZ too). + */ + Assert(!((incremental_blocks != NULL && num_incremental_blocks > 0) && + (bytes_done % BLCKSZ != 0))); + /* Archive the data we just read. */ bbsink_archive_contents(sink, cnt); @@ -1687,14 +1781,12 @@ sendFile(bbsink *sink, const char *readfilename, const char *tarfilename, if (pg_checksum_update(&checksum_ctx, (uint8 *) sink->bbs_buffer, cnt) < 0) elog(ERROR, "could not update checksum of base backup"); - - len += cnt; } /* If the file was truncated while we were sending it, pad it with zeros */ - while (len < statbuf->st_size) + while (bytes_done < statbuf->st_size) { - size_t remaining = statbuf->st_size - len; + size_t remaining = statbuf->st_size - bytes_done; size_t nbytes = Min(sink->bbs_buffer_length, remaining); MemSet(sink->bbs_buffer, 0, nbytes); @@ -1703,7 +1795,7 @@ sendFile(bbsink *sink, const char *readfilename, const char *tarfilename, nbytes) < 0) elog(ERROR, "could not update checksum of base backup"); bbsink_archive_contents(sink, nbytes); - len += nbytes; + bytes_done += nbytes; } /* @@ -1711,7 +1803,7 @@ sendFile(bbsink *sink, const char *readfilename, const char *tarfilename, * of data is probably not worth throttling, and is not checksummed * because it's not actually part of the file.) */ - _tarWritePadding(sink, len); + _tarWritePadding(sink, bytes_done); CloseTransientFile(fd); @@ -1734,6 +1826,195 @@ sendFile(bbsink *sink, const char *readfilename, const char *tarfilename, return true; } +/* + * Read some more data from the file into the bbsink's buffer, verifying + * checksums as required. + * + * 'offset' is the file offset from which we should begin to read, and + * 'length' is the amount of data that should be read. The actual amount + * of data read will be less than the requested amount if the bbsink's + * buffer isn't big enough to hold it all, or if the underlying file has + * been truncated. The return value is the number of bytes actually read. + * + * 'blkno' is the block number of the first page in the bbsink's buffer + * relative to the start of the relation. + * + * 'verify_checksum' indicates whether we should try to verify checksums + * for the blocks we read. If we do this, we'll update *checksum_failures + * and issue warnings as appropriate. + */ +static off_t +read_file_data_into_buffer(bbsink *sink, const char *readfilename, int fd, + off_t offset, size_t length, BlockNumber blkno, + bool verify_checksum, int *checksum_failures) +{ + off_t cnt; + int i; + char *page; + + /* Try to read some more data. */ + cnt = basebackup_read_file(fd, sink->bbs_buffer, + Min(sink->bbs_buffer_length, length), + offset, readfilename, true); + + /* Can't verify checksums if read length is not a multiple of BLCKSZ. */ + if (!verify_checksum || (cnt % BLCKSZ) != 0) + return cnt; + + /* Verify checksum for each block. */ + for (i = 0; i < cnt / BLCKSZ; i++) + { + int reread_cnt; + uint16 expected_checksum; + + page = sink->bbs_buffer + BLCKSZ * i; + + /* If the page is OK, go on to the next one. */ + if (verify_page_checksum(page, sink->bbs_state->startptr, blkno + i, + &expected_checksum)) + continue; + + /* + * Retry the block on the first failure. It's possible that we read + * the first 4K page of the block just before postgres updated the + * entire block so it ends up looking torn to us. If, before we retry + * the read, the concurrent write of the block finishes, the page LSN + * will be updated and we'll realize that we should ignore this block. + * + * There's no guarantee that this will actually happen, though: the + * torn write could take an arbitrarily long time to complete. + * Retrying multiple times wouldn't fix this problem, either, though + * it would reduce the chances of it happening in practice. The only + * real fix here seems to be to have some kind of interlock that + * allows us to wait until we can be certain that no write to the + * block is in progress. Since we don't have any such thing right now, + * we just do this and hope for the best. + */ + reread_cnt = + basebackup_read_file(fd, sink->bbs_buffer + BLCKSZ * i, + BLCKSZ, offset + BLCKSZ * i, + readfilename, false); + if (reread_cnt == 0) + { + /* + * If we hit end-of-file, a concurrent truncation must have + * occurred, so reduce cnt to reflect only the blocks already + * processed and break out of this loop. + */ + cnt = BLCKSZ * i; + break; + } + + /* If the page now looks OK, go on to the next one. */ + if (verify_page_checksum(page, sink->bbs_state->startptr, blkno + i, + &expected_checksum)) + continue; + + /* Handle checksum failure. */ + (*checksum_failures)++; + if (*checksum_failures <= 5) + ereport(WARNING, + (errmsg("checksum verification failed in " + "file \"%s\", block %u: calculated " + "%X but expected %X", + readfilename, blkno + i, expected_checksum, + ((PageHeader) page)->pd_checksum))); + if (*checksum_failures == 5) + ereport(WARNING, + (errmsg("further checksum verification " + "failures in file \"%s\" will not " + "be reported", readfilename))); + } + + return cnt; +} + +/* + * Push data into a bbsink. + * + * It's better, when possible, to read data directly into the bbsink's buffer, + * rather than using this function to copy it into the buffer; this function is + * for cases where that approach is not practical. + * + * bytes_done should point to a count of the number of bytes that are + * currently used in the bbsink's buffer. Upon return, the bytes identified by + * data and length will have been copied into the bbsink's buffer, flushing + * as required, and *bytes_done will have been updated accordingly. If the + * buffer was flushed, the previous contents will also have been fed to + * checksum_ctx. + * + * Note that after one or more calls to this function it is the caller's + * responsibility to perform any required final flush. + */ +static void +push_to_sink(bbsink *sink, pg_checksum_context *checksum_ctx, + size_t *bytes_done, void *data, size_t length) +{ + while (length > 0) + { + size_t bytes_to_copy; + + /* + * We use < here rather than <= so that if the data exactly fills the + * remaining buffer space, we trigger a flush now. + */ + if (length < sink->bbs_buffer_length - *bytes_done) + { + /* Append remaining data to buffer. */ + memcpy(sink->bbs_buffer + *bytes_done, data, length); + *bytes_done += length; + return; + } + + /* Copy until buffer is full and flush it. */ + bytes_to_copy = sink->bbs_buffer_length - *bytes_done; + memcpy(sink->bbs_buffer + *bytes_done, data, bytes_to_copy); + data = ((char *) data) + bytes_to_copy; + length -= bytes_to_copy; + bbsink_archive_contents(sink, sink->bbs_buffer_length); + if (pg_checksum_update(checksum_ctx, (uint8 *) sink->bbs_buffer, + sink->bbs_buffer_length) < 0) + elog(ERROR, "could not update checksum"); + *bytes_done = 0; + } +} + +/* + * Try to verify the checksum for the provided page, if it seems appropriate + * to do so. + * + * Returns true if verification succeeds or if we decide not to check it, + * and false if verification fails. When return false, it also sets + * *expected_checksum to the computed value. + */ +static bool +verify_page_checksum(Page page, XLogRecPtr start_lsn, BlockNumber blkno, + uint16 *expected_checksum) +{ + PageHeader phdr; + uint16 checksum; + + /* + * Only check pages which have not been modified since the start of the + * base backup. Otherwise, they might have been written only halfway and + * the checksum would not be valid. However, replaying WAL would + * reinstate the correct page in this case. We also skip completely new + * pages, since they don't have a checksum yet. + */ + if (PageIsNew(page) || PageGetLSN(page) >= start_lsn) + return true; + + /* Perform the actual checksum calculation. */ + checksum = pg_checksum_page(page, blkno); + + /* See whether it matches the value from the page. */ + phdr = (PageHeader) page; + if (phdr->pd_checksum == checksum) + return true; + *expected_checksum = checksum; + return false; +} + static int64 _tarWriteHeader(bbsink *sink, const char *filename, const char *linktarget, struct stat *statbuf, bool sizeonly) @@ -1826,11 +2107,11 @@ convert_link_to_directory(const char *pathbuf, struct stat *statbuf) * * Returns the number of bytes read. */ -static int +static ssize_t basebackup_read_file(int fd, char *buf, size_t nbytes, off_t offset, const char *filename, bool partial_read_ok) { - int rc; + ssize_t rc; pgstat_report_wait_start(WAIT_EVENT_BASEBACKUP_READ); rc = pg_pread(fd, buf, nbytes, offset); @@ -1843,7 +2124,7 @@ basebackup_read_file(int fd, char *buf, size_t nbytes, off_t offset, if (!partial_read_ok && rc > 0 && rc != nbytes) ereport(ERROR, (errcode_for_file_access(), - errmsg("could not read file \"%s\": read %d of %zu", + errmsg("could not read file \"%s\": read %zd of %zu", filename, rc, nbytes))); return rc; diff --git a/src/backend/backup/basebackup_copy.c b/src/backend/backup/basebackup_copy.c index 1db80cde1b2cf..0b4ee5f2a29f6 100644 --- a/src/backend/backup/basebackup_copy.c +++ b/src/backend/backup/basebackup_copy.c @@ -16,7 +16,7 @@ * An older method that sent each archive using a separate COPY OUT * operation is no longer supported. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/backup/basebackup_copy.c @@ -152,7 +152,7 @@ bbsink_copystream_begin_backup(bbsink *sink) SendTablespaceList(state->tablespaces); /* Send a CommandComplete message */ - pq_puttextmessage('C', "SELECT"); + pq_puttextmessage(PqMsg_CommandComplete, "SELECT"); /* Begin COPY stream. This will be used for all archives + manifest. */ SendCopyOutResponse(); @@ -169,7 +169,7 @@ bbsink_copystream_begin_archive(bbsink *sink, const char *archive_name) StringInfoData buf; ti = list_nth(state->tablespaces, state->tablespace_num); - pq_beginmessage(&buf, 'd'); /* CopyData */ + pq_beginmessage(&buf, PqMsg_CopyData); pq_sendbyte(&buf, 'n'); /* New archive */ pq_sendstring(&buf, archive_name); pq_sendstring(&buf, ti->path == NULL ? "" : ti->path); @@ -220,7 +220,7 @@ bbsink_copystream_archive_contents(bbsink *sink, size_t len) { mysink->last_progress_report_time = now; - pq_beginmessage(&buf, 'd'); /* CopyData */ + pq_beginmessage(&buf, PqMsg_CopyData); pq_sendbyte(&buf, 'p'); /* Progress report */ pq_sendint64(&buf, state->bytes_done); pq_endmessage(&buf); @@ -246,7 +246,7 @@ bbsink_copystream_end_archive(bbsink *sink) mysink->bytes_done_at_last_time_check = state->bytes_done; mysink->last_progress_report_time = GetCurrentTimestamp(); - pq_beginmessage(&buf, 'd'); /* CopyData */ + pq_beginmessage(&buf, PqMsg_CopyData); pq_sendbyte(&buf, 'p'); /* Progress report */ pq_sendint64(&buf, state->bytes_done); pq_endmessage(&buf); @@ -261,7 +261,7 @@ bbsink_copystream_begin_manifest(bbsink *sink) { StringInfoData buf; - pq_beginmessage(&buf, 'd'); /* CopyData */ + pq_beginmessage(&buf, PqMsg_CopyData); pq_sendbyte(&buf, 'm'); /* Manifest */ pq_endmessage(&buf); } @@ -318,7 +318,7 @@ SendCopyOutResponse(void) { StringInfoData buf; - pq_beginmessage(&buf, 'H'); + pq_beginmessage(&buf, PqMsg_CopyOutResponse); pq_sendbyte(&buf, 0); /* overall format */ pq_sendint16(&buf, 0); /* natts */ pq_endmessage(&buf); @@ -330,7 +330,7 @@ SendCopyOutResponse(void) static void SendCopyDone(void) { - pq_putemptymessage('c'); + pq_putemptymessage(PqMsg_CopyDone); } /* @@ -368,7 +368,7 @@ SendXlogRecPtrResult(XLogRecPtr ptr, TimeLineID tli) end_tup_output(tstate); /* Send a CommandComplete message */ - pq_puttextmessage('C', "SELECT"); + pq_puttextmessage(PqMsg_CommandComplete, "SELECT"); } /* @@ -407,7 +407,7 @@ SendTablespaceList(List *tablespaces) } else { - values[0] = ObjectIdGetDatum(strtoul(ti->oid, NULL, 10)); + values[0] = ObjectIdGetDatum(ti->oid); values[1] = CStringGetTextDatum(ti->path); } if (ti->size >= 0) diff --git a/src/backend/backup/basebackup_gzip.c b/src/backend/backup/basebackup_gzip.c index b2d5e19ad942b..2b6dc656f9384 100644 --- a/src/backend/backup/basebackup_gzip.c +++ b/src/backend/backup/basebackup_gzip.c @@ -3,7 +3,7 @@ * basebackup_gzip.c * Basebackup sink implementing gzip compression. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/backup/basebackup_gzip.c diff --git a/src/backend/backup/basebackup_incremental.c b/src/backend/backup/basebackup_incremental.c new file mode 100644 index 0000000000000..ceec1f44312e1 --- /dev/null +++ b/src/backend/backup/basebackup_incremental.c @@ -0,0 +1,1046 @@ +/*------------------------------------------------------------------------- + * + * basebackup_incremental.c + * code for incremental backup support + * + * This code isn't actually in charge of taking an incremental backup; + * the actual construction of the incremental backup happens in + * basebackup.c. Here, we're concerned with providing the necessary + * supports for that operation. In particular, we need to parse the + * backup manifest supplied by the user taking the incremental backup + * and extract the required information from it. + * + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/backup/basebackup_incremental.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/timeline.h" +#include "access/xlog.h" +#include "backup/basebackup_incremental.h" +#include "backup/walsummary.h" +#include "common/blkreftable.h" +#include "common/hashfn.h" +#include "common/int.h" +#include "common/parse_manifest.h" +#include "datatype/timestamp.h" +#include "postmaster/walsummarizer.h" +#include "utils/timestamp.h" + +#define BLOCKS_PER_READ 512 + +/* + * We expect to find the last lines of the manifest, including the checksum, + * in the last MIN_CHUNK bytes of the manifest. We trigger an incremental + * parse step if we are about to overflow MAX_CHUNK bytes. + */ +#define MIN_CHUNK 1024 +#define MAX_CHUNK (128 * 1024) + +/* + * Details extracted from the WAL ranges present in the supplied backup manifest. + */ +typedef struct +{ + TimeLineID tli; + XLogRecPtr start_lsn; + XLogRecPtr end_lsn; +} backup_wal_range; + +/* + * Details extracted from the file list present in the supplied backup manifest. + */ +typedef struct +{ + uint32 status; + const char *path; + size_t size; +} backup_file_entry; + +static uint32 hash_string_pointer(const char *s); +#define SH_PREFIX backup_file +#define SH_ELEMENT_TYPE backup_file_entry +#define SH_KEY_TYPE const char * +#define SH_KEY path +#define SH_HASH_KEY(tb, key) hash_string_pointer(key) +#define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0) +#define SH_SCOPE static inline +#define SH_DECLARE +#define SH_DEFINE +#include "lib/simplehash.h" + +struct IncrementalBackupInfo +{ + /* Memory context for this object and its subsidiary objects. */ + MemoryContext mcxt; + + /* Temporary buffer for storing the manifest while parsing it. */ + StringInfoData buf; + + /* WAL ranges extracted from the backup manifest. */ + List *manifest_wal_ranges; + + /* + * Files extracted from the backup manifest. + * + * We don't really need this information, because we use WAL summaries to + * figure out what's changed. It would be unsafe to just rely on the list + * of files that existed before, because it's possible for a file to be + * removed and a new one created with the same name and different + * contents. In such cases, the whole file must still be sent. We can tell + * from the WAL summaries whether that happened, but not from the file + * list. + * + * Nonetheless, this data is useful for sanity checking. If a file that we + * think we shouldn't need to send is not present in the manifest for the + * prior backup, something has gone terribly wrong. We retain the file + * names and sizes, but not the checksums or last modified times, for + * which we have no use. + * + * One significant downside of storing this data is that it consumes + * memory. If that turns out to be a problem, we might have to decide not + * to retain this information, or to make it optional. + */ + backup_file_hash *manifest_files; + + /* + * Block-reference table for the incremental backup. + * + * It's possible that storing the entire block-reference table in memory + * will be a problem for some users. The in-memory format that we're using + * here is pretty efficient, converging to little more than 1 bit per + * block for relation forks with large numbers of modified blocks. It's + * possible, however, that if you try to perform an incremental backup of + * a database with a sufficiently large number of relations on a + * sufficiently small machine, you could run out of memory here. If that + * turns out to be a problem in practice, we'll need to be more clever. + */ + BlockRefTable *brtab; + + /* + * State object for incremental JSON parsing + */ + JsonManifestParseIncrementalState *inc_state; +}; + +static void manifest_process_version(JsonManifestParseContext *context, + int manifest_version); +static void manifest_process_system_identifier(JsonManifestParseContext *context, + uint64 manifest_system_identifier); +static void manifest_process_file(JsonManifestParseContext *context, + const char *pathname, + size_t size, + pg_checksum_type checksum_type, + int checksum_length, + uint8 *checksum_payload); +static void manifest_process_wal_range(JsonManifestParseContext *context, + TimeLineID tli, + XLogRecPtr start_lsn, + XLogRecPtr end_lsn); +static void manifest_report_error(JsonManifestParseContext *context, + const char *fmt,...) + pg_attribute_printf(2, 3) pg_attribute_noreturn(); +static int compare_block_numbers(const void *a, const void *b); + +/* + * Create a new object for storing information extracted from the manifest + * supplied when creating an incremental backup. + */ +IncrementalBackupInfo * +CreateIncrementalBackupInfo(MemoryContext mcxt) +{ + IncrementalBackupInfo *ib; + MemoryContext oldcontext; + JsonManifestParseContext *context; + + oldcontext = MemoryContextSwitchTo(mcxt); + + ib = palloc0(sizeof(IncrementalBackupInfo)); + ib->mcxt = mcxt; + initStringInfo(&ib->buf); + + /* + * It's hard to guess how many files a "typical" installation will have in + * the data directory, but a fresh initdb creates almost 1000 files as of + * this writing, so it seems to make sense for our estimate to + * substantially higher. + */ + ib->manifest_files = backup_file_create(mcxt, 10000, NULL); + + context = palloc0(sizeof(JsonManifestParseContext)); + /* Parse the manifest. */ + context->private_data = ib; + context->version_cb = manifest_process_version; + context->system_identifier_cb = manifest_process_system_identifier; + context->per_file_cb = manifest_process_file; + context->per_wal_range_cb = manifest_process_wal_range; + context->error_cb = manifest_report_error; + + ib->inc_state = json_parse_manifest_incremental_init(context); + + MemoryContextSwitchTo(oldcontext); + + return ib; +} + +/* + * Before taking an incremental backup, the caller must supply the backup + * manifest from a prior backup. Each chunk of manifest data received + * from the client should be passed to this function. + */ +void +AppendIncrementalManifestData(IncrementalBackupInfo *ib, const char *data, + int len) +{ + MemoryContext oldcontext; + + /* Switch to our memory context. */ + oldcontext = MemoryContextSwitchTo(ib->mcxt); + + if (ib->buf.len > MIN_CHUNK && ib->buf.len + len > MAX_CHUNK) + { + /* + * time for an incremental parse. We'll do all but the last MIN_CHUNK + * so that we have enough left for the final piece. + */ + json_parse_manifest_incremental_chunk(ib->inc_state, ib->buf.data, + ib->buf.len - MIN_CHUNK, false); + /* now remove what we just parsed */ + memmove(ib->buf.data, ib->buf.data + (ib->buf.len - MIN_CHUNK), + MIN_CHUNK + 1); + ib->buf.len = MIN_CHUNK; + } + + appendBinaryStringInfo(&ib->buf, data, len); + + /* Switch back to previous memory context. */ + MemoryContextSwitchTo(oldcontext); +} + +/* + * Finalize an IncrementalBackupInfo object after all manifest data has + * been supplied via calls to AppendIncrementalManifestData. + */ +void +FinalizeIncrementalManifest(IncrementalBackupInfo *ib) +{ + MemoryContext oldcontext; + + /* Switch to our memory context. */ + oldcontext = MemoryContextSwitchTo(ib->mcxt); + + /* Parse the last chunk of the manifest */ + json_parse_manifest_incremental_chunk(ib->inc_state, ib->buf.data, + ib->buf.len, true); + + /* Done with the buffer, so release memory. */ + pfree(ib->buf.data); + ib->buf.data = NULL; + + /* Done with inc_state, so release that memory too */ + json_parse_manifest_incremental_shutdown(ib->inc_state); + + /* Switch back to previous memory context. */ + MemoryContextSwitchTo(oldcontext); +} + +/* + * Prepare to take an incremental backup. + * + * Before this function is called, AppendIncrementalManifestData and + * FinalizeIncrementalManifest should have already been called to pass all + * the manifest data to this object. + * + * This function performs sanity checks on the data extracted from the + * manifest and figures out for which WAL ranges we need summaries, and + * whether those summaries are available. Then, it reads and combines the + * data from those summary files. It also updates the backup_state with the + * reference TLI and LSN for the prior backup. + */ +void +PrepareForIncrementalBackup(IncrementalBackupInfo *ib, + BackupState *backup_state) +{ + MemoryContext oldcontext; + List *expectedTLEs; + List *all_wslist, + *required_wslist = NIL; + ListCell *lc; + TimeLineHistoryEntry **tlep; + int num_wal_ranges; + int i; + bool found_backup_start_tli = false; + TimeLineID earliest_wal_range_tli = 0; + XLogRecPtr earliest_wal_range_start_lsn = InvalidXLogRecPtr; + TimeLineID latest_wal_range_tli = 0; + + Assert(ib->buf.data == NULL); + + /* Switch to our memory context. */ + oldcontext = MemoryContextSwitchTo(ib->mcxt); + + /* + * A valid backup manifest must always contain at least one WAL range + * (usually exactly one, unless the backup spanned a timeline switch). + */ + num_wal_ranges = list_length(ib->manifest_wal_ranges); + if (num_wal_ranges == 0) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("manifest contains no required WAL ranges"))); + + /* + * Match up the TLIs that appear in the WAL ranges of the backup manifest + * with those that appear in this server's timeline history. We expect + * every backup_wal_range to match to a TimeLineHistoryEntry; if it does + * not, that's an error. + * + * This loop also decides which of the WAL ranges is the manifest is most + * ancient and which one is the newest, according to the timeline history + * of this server, and stores TLIs of those WAL ranges into + * earliest_wal_range_tli and latest_wal_range_tli. It also updates + * earliest_wal_range_start_lsn to the start LSN of the WAL range for + * earliest_wal_range_tli. + * + * Note that the return value of readTimeLineHistory puts the latest + * timeline at the beginning of the list, not the end. Hence, the earliest + * TLI is the one that occurs nearest the end of the list returned by + * readTimeLineHistory, and the latest TLI is the one that occurs closest + * to the beginning. + */ + expectedTLEs = readTimeLineHistory(backup_state->starttli); + tlep = palloc0(num_wal_ranges * sizeof(TimeLineHistoryEntry *)); + for (i = 0; i < num_wal_ranges; ++i) + { + backup_wal_range *range = list_nth(ib->manifest_wal_ranges, i); + bool saw_earliest_wal_range_tli = false; + bool saw_latest_wal_range_tli = false; + + /* Search this server's history for this WAL range's TLI. */ + foreach(lc, expectedTLEs) + { + TimeLineHistoryEntry *tle = lfirst(lc); + + if (tle->tli == range->tli) + { + tlep[i] = tle; + break; + } + + if (tle->tli == earliest_wal_range_tli) + saw_earliest_wal_range_tli = true; + if (tle->tli == latest_wal_range_tli) + saw_latest_wal_range_tli = true; + } + + /* + * An incremental backup can only be taken relative to a backup that + * represents a previous state of this server. If the backup requires + * WAL from a timeline that's not in our history, that definitely + * isn't the case. + */ + if (tlep[i] == NULL) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("timeline %u found in manifest, but not in this server's history", + range->tli))); + + /* + * If we found this TLI in the server's history before encountering + * the latest TLI seen so far in the server's history, then this TLI + * is the latest one seen so far. + * + * If on the other hand we saw the earliest TLI seen so far before + * finding this TLI, this TLI is earlier than the earliest one seen so + * far. And if this is the first TLI for which we've searched, it's + * also the earliest one seen so far. + * + * On the first loop iteration, both things should necessarily be + * true. + */ + if (!saw_latest_wal_range_tli) + latest_wal_range_tli = range->tli; + if (earliest_wal_range_tli == 0 || saw_earliest_wal_range_tli) + { + earliest_wal_range_tli = range->tli; + earliest_wal_range_start_lsn = range->start_lsn; + } + } + + /* + * Propagate information about the prior backup into the backup_label that + * will be generated for this backup. + */ + backup_state->istartpoint = earliest_wal_range_start_lsn; + backup_state->istarttli = earliest_wal_range_tli; + + /* + * Sanity check start and end LSNs for the WAL ranges in the manifest. + * + * Commonly, there won't be any timeline switches during the prior backup + * at all, but if there are, they should happen at the same LSNs that this + * server switched timelines. + * + * Whether there are any timeline switches during the prior backup or not, + * the prior backup shouldn't require any WAL from a timeline prior to the + * start of that timeline. It also shouldn't require any WAL from later + * than the start of this backup. + * + * If any of these sanity checks fail, one possible explanation is that + * the user has generated WAL on the same timeline with the same LSNs more + * than once. For instance, if two standbys running on timeline 1 were + * both promoted and (due to a broken archiving setup) both selected new + * timeline ID 2, then it's possible that one of these checks might trip. + * + * Note that there are lots of ways for the user to do something very bad + * without tripping any of these checks, and they are not intended to be + * comprehensive. It's pretty hard to see how we could be certain of + * anything here. However, if there's a problem staring us right in the + * face, it's best to report it, so we do. + */ + for (i = 0; i < num_wal_ranges; ++i) + { + backup_wal_range *range = list_nth(ib->manifest_wal_ranges, i); + + if (range->tli == earliest_wal_range_tli) + { + if (range->start_lsn < tlep[i]->begin) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("manifest requires WAL from initial timeline %u starting at %X/%X, but that timeline begins at %X/%X", + range->tli, + LSN_FORMAT_ARGS(range->start_lsn), + LSN_FORMAT_ARGS(tlep[i]->begin)))); + } + else + { + if (range->start_lsn != tlep[i]->begin) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("manifest requires WAL from continuation timeline %u starting at %X/%X, but that timeline begins at %X/%X", + range->tli, + LSN_FORMAT_ARGS(range->start_lsn), + LSN_FORMAT_ARGS(tlep[i]->begin)))); + } + + if (range->tli == latest_wal_range_tli) + { + if (range->end_lsn > backup_state->startpoint) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("manifest requires WAL from final timeline %u ending at %X/%X, but this backup starts at %X/%X", + range->tli, + LSN_FORMAT_ARGS(range->end_lsn), + LSN_FORMAT_ARGS(backup_state->startpoint)), + errhint("This can happen for incremental backups on a standby if there was little activity since the previous backup."))); + } + else + { + if (range->end_lsn != tlep[i]->end) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("manifest requires WAL from non-final timeline %u ending at %X/%X, but this server switched timelines at %X/%X", + range->tli, + LSN_FORMAT_ARGS(range->end_lsn), + LSN_FORMAT_ARGS(tlep[i]->end)))); + } + + } + + /* + * Wait for WAL summarization to catch up to the backup start LSN. This + * will throw an error if the WAL summarizer appears to be stuck. If WAL + * summarization gets disabled while we're waiting, this will return + * immediately, and we'll error out further down if the WAL summaries are + * incomplete. + */ + WaitForWalSummarization(backup_state->startpoint); + + /* + * Retrieve a list of all WAL summaries on any timeline that overlap with + * the LSN range of interest. We could instead call GetWalSummaries() once + * per timeline in the loop that follows, but that would involve reading + * the directory multiple times. It should be mildly faster - and perhaps + * a bit safer - to do it just once. + */ + all_wslist = GetWalSummaries(0, earliest_wal_range_start_lsn, + backup_state->startpoint); + + /* + * We need WAL summaries for everything that happened during the prior + * backup and everything that happened afterward up until the point where + * the current backup started. + */ + foreach(lc, expectedTLEs) + { + TimeLineHistoryEntry *tle = lfirst(lc); + XLogRecPtr tli_start_lsn = tle->begin; + XLogRecPtr tli_end_lsn = tle->end; + XLogRecPtr tli_missing_lsn = InvalidXLogRecPtr; + List *tli_wslist; + + /* + * Working through the history of this server from the current + * timeline backwards, we skip everything until we find the timeline + * where this backup started. Most of the time, this means we won't + * skip anything at all, as it's unlikely that the timeline has + * changed since the beginning of the backup moments ago. + */ + if (tle->tli == backup_state->starttli) + { + found_backup_start_tli = true; + tli_end_lsn = backup_state->startpoint; + } + else if (!found_backup_start_tli) + continue; + + /* + * Find the summaries that overlap the LSN range of interest for this + * timeline. If this is the earliest timeline involved, the range of + * interest begins with the start LSN of the prior backup; otherwise, + * it begins at the LSN at which this timeline came into existence. If + * this is the latest TLI involved, the range of interest ends at the + * start LSN of the current backup; otherwise, it ends at the point + * where we switched from this timeline to the next one. + */ + if (tle->tli == earliest_wal_range_tli) + tli_start_lsn = earliest_wal_range_start_lsn; + tli_wslist = FilterWalSummaries(all_wslist, tle->tli, + tli_start_lsn, tli_end_lsn); + + /* + * There is no guarantee that the WAL summaries we found cover the + * entire range of LSNs for which summaries are required, or indeed + * that we found any WAL summaries at all. Check whether we have a + * problem of that sort. + */ + if (!WalSummariesAreComplete(tli_wslist, tli_start_lsn, tli_end_lsn, + &tli_missing_lsn)) + { + if (XLogRecPtrIsInvalid(tli_missing_lsn)) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("WAL summaries are required on timeline %u from %X/%X to %X/%X, but no summaries for that timeline and LSN range exist", + tle->tli, + LSN_FORMAT_ARGS(tli_start_lsn), + LSN_FORMAT_ARGS(tli_end_lsn)))); + else + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("WAL summaries are required on timeline %u from %X/%X to %X/%X, but the summaries for that timeline and LSN range are incomplete", + tle->tli, + LSN_FORMAT_ARGS(tli_start_lsn), + LSN_FORMAT_ARGS(tli_end_lsn)), + errdetail("The first unsummarized LSN in this range is %X/%X.", + LSN_FORMAT_ARGS(tli_missing_lsn)))); + } + + /* + * Remember that we need to read these summaries. + * + * Technically, it's possible that this could read more files than + * required, since tli_wslist in theory could contain redundant + * summaries. For instance, if we have a summary from 0/10000000 to + * 0/20000000 and also one from 0/00000000 to 0/30000000, then the + * latter subsumes the former and the former could be ignored. + * + * We ignore this possibility because the WAL summarizer only tries to + * generate summaries that do not overlap. If somehow they exist, + * we'll do a bit of extra work but the results should still be + * correct. + */ + required_wslist = list_concat(required_wslist, tli_wslist); + + /* + * Timelines earlier than the one in which the prior backup began are + * not relevant. + */ + if (tle->tli == earliest_wal_range_tli) + break; + } + + /* + * Read all of the required block reference table files and merge all of + * the data into a single in-memory block reference table. + * + * See the comments for struct IncrementalBackupInfo for some thoughts on + * memory usage. + */ + ib->brtab = CreateEmptyBlockRefTable(); + foreach(lc, required_wslist) + { + WalSummaryFile *ws = lfirst(lc); + WalSummaryIO wsio; + BlockRefTableReader *reader; + RelFileLocator rlocator; + ForkNumber forknum; + BlockNumber limit_block; + BlockNumber blocks[BLOCKS_PER_READ]; + + wsio.file = OpenWalSummaryFile(ws, false); + wsio.filepos = 0; + ereport(DEBUG1, + (errmsg_internal("reading WAL summary file \"%s\"", + FilePathName(wsio.file)))); + reader = CreateBlockRefTableReader(ReadWalSummary, &wsio, + FilePathName(wsio.file), + ReportWalSummaryError, NULL); + while (BlockRefTableReaderNextRelation(reader, &rlocator, &forknum, + &limit_block)) + { + BlockRefTableSetLimitBlock(ib->brtab, &rlocator, + forknum, limit_block); + + while (1) + { + unsigned nblocks; + unsigned i; + + nblocks = BlockRefTableReaderGetBlocks(reader, blocks, + BLOCKS_PER_READ); + if (nblocks == 0) + break; + + for (i = 0; i < nblocks; ++i) + BlockRefTableMarkBlockModified(ib->brtab, &rlocator, + forknum, blocks[i]); + } + } + DestroyBlockRefTableReader(reader); + FileClose(wsio.file); + } + + /* Switch back to previous memory context. */ + MemoryContextSwitchTo(oldcontext); +} + +/* + * Get the pathname that should be used when a file is sent incrementally. + * + * The result is a palloc'd string. + */ +char * +GetIncrementalFilePath(Oid dboid, Oid spcoid, RelFileNumber relfilenumber, + ForkNumber forknum, unsigned segno) +{ + char *path; + char *lastslash; + char *ipath; + + path = GetRelationPath(dboid, spcoid, relfilenumber, INVALID_PROC_NUMBER, + forknum); + + lastslash = strrchr(path, '/'); + Assert(lastslash != NULL); + *lastslash = '\0'; + + if (segno > 0) + ipath = psprintf("%s/INCREMENTAL.%s.%u", path, lastslash + 1, segno); + else + ipath = psprintf("%s/INCREMENTAL.%s", path, lastslash + 1); + + pfree(path); + + return ipath; +} + +/* + * How should we back up a particular file as part of an incremental backup? + * + * If the return value is BACK_UP_FILE_FULLY, caller should back up the whole + * file just as if this were not an incremental backup. The contents of the + * relative_block_numbers array are unspecified in this case. + * + * If the return value is BACK_UP_FILE_INCREMENTALLY, caller should include + * an incremental file in the backup instead of the entire file. On return, + * *num_blocks_required will be set to the number of blocks that need to be + * sent, and the actual block numbers will have been stored in + * relative_block_numbers, which should be an array of at least RELSEG_SIZE. + * In addition, *truncation_block_length will be set to the value that should + * be included in the incremental file. + */ +FileBackupMethod +GetFileBackupMethod(IncrementalBackupInfo *ib, const char *path, + Oid dboid, Oid spcoid, + RelFileNumber relfilenumber, ForkNumber forknum, + unsigned segno, size_t size, + unsigned *num_blocks_required, + BlockNumber *relative_block_numbers, + unsigned *truncation_block_length) +{ + BlockNumber limit_block; + BlockNumber start_blkno; + BlockNumber stop_blkno; + RelFileLocator rlocator; + BlockRefTableEntry *brtentry; + unsigned i; + unsigned nblocks; + + /* Should only be called after PrepareForIncrementalBackup. */ + Assert(ib->buf.data == NULL); + + /* + * dboid could be InvalidOid if shared rel, but spcoid and relfilenumber + * should have legal values. + */ + Assert(OidIsValid(spcoid)); + Assert(RelFileNumberIsValid(relfilenumber)); + + /* + * If the file size is too large or not a multiple of BLCKSZ, then + * something weird is happening, so give up and send the whole file. + */ + if ((size % BLCKSZ) != 0 || size / BLCKSZ > RELSEG_SIZE) + return BACK_UP_FILE_FULLY; + + /* + * The free-space map fork is not properly WAL-logged, so we need to + * backup the entire file every time. + */ + if (forknum == FSM_FORKNUM) + return BACK_UP_FILE_FULLY; + + /* + * If this file was not part of the prior backup, back it up fully. + * + * If this file was created after the prior backup and before the start of + * the current backup, then the WAL summary information will tell us to + * back up the whole file. However, if this file was created after the + * start of the current backup, then the WAL summary won't know anything + * about it. Without this logic, we would erroneously conclude that it was + * OK to send it incrementally. + * + * Note that the file could have existed at the time of the prior backup, + * gotten deleted, and then a new file with the same name could have been + * created. In that case, this logic won't prevent the file from being + * backed up incrementally. But, if the deletion happened before the start + * of the current backup, the limit block will be 0, inducing a full + * backup. If the deletion happened after the start of the current backup, + * reconstruction will erroneously combine blocks from the current + * lifespan of the file with blocks from the previous lifespan -- but in + * this type of case, WAL replay to reach backup consistency should remove + * and recreate the file anyway, so the initial bogus contents should not + * matter. + */ + if (backup_file_lookup(ib->manifest_files, path) == NULL) + { + char *ipath; + + ipath = GetIncrementalFilePath(dboid, spcoid, relfilenumber, + forknum, segno); + if (backup_file_lookup(ib->manifest_files, ipath) == NULL) + return BACK_UP_FILE_FULLY; + } + + /* + * Look up the special block reference table entry for the database as a + * whole. + */ + rlocator.spcOid = spcoid; + rlocator.dbOid = dboid; + rlocator.relNumber = 0; + if (BlockRefTableGetEntry(ib->brtab, &rlocator, MAIN_FORKNUM, + &limit_block) != NULL) + { + /* + * According to the WAL summary, this database OID/tablespace OID + * pairing has been created since the previous backup. So, everything + * in it must be backed up fully. + */ + return BACK_UP_FILE_FULLY; + } + + /* Look up the block reference table entry for this relfilenode. */ + rlocator.relNumber = relfilenumber; + brtentry = BlockRefTableGetEntry(ib->brtab, &rlocator, forknum, + &limit_block); + + /* + * If there is no entry, then there have been no WAL-logged changes to the + * relation since the predecessor backup was taken, so we can back it up + * incrementally and need not include any modified blocks. + * + * However, if the file is zero-length, we should do a full backup, + * because an incremental file is always more than zero length, and it's + * silly to take an incremental backup when a full backup would be + * smaller. + */ + if (brtentry == NULL) + { + if (size == 0) + return BACK_UP_FILE_FULLY; + *num_blocks_required = 0; + *truncation_block_length = size / BLCKSZ; + return BACK_UP_FILE_INCREMENTALLY; + } + + /* + * If the limit_block is less than or equal to the point where this + * segment starts, send the whole file. + */ + if (limit_block <= segno * RELSEG_SIZE) + return BACK_UP_FILE_FULLY; + + /* + * Get relevant entries from the block reference table entry. + * + * We shouldn't overflow computing the start or stop block numbers, but if + * it manages to happen somehow, detect it and throw an error. + */ + start_blkno = segno * RELSEG_SIZE; + stop_blkno = start_blkno + (size / BLCKSZ); + if (start_blkno / RELSEG_SIZE != segno || stop_blkno < start_blkno) + ereport(ERROR, + errcode(ERRCODE_INTERNAL_ERROR), + errmsg_internal("overflow computing block number bounds for segment %u with size %zu", + segno, size)); + + /* + * This will write *absolute* block numbers into the output array, but + * we'll transpose them below. + */ + nblocks = BlockRefTableEntryGetBlocks(brtentry, start_blkno, stop_blkno, + relative_block_numbers, RELSEG_SIZE); + Assert(nblocks <= RELSEG_SIZE); + + /* + * If we're going to have to send nearly all of the blocks, then just send + * the whole file, because that won't require much extra storage or + * transfer and will speed up and simplify backup restoration. It's not + * clear what threshold is most appropriate here and perhaps it ought to + * be configurable, but for now we're just going to say that if we'd need + * to send 90% of the blocks anyway, give up and send the whole file. + * + * NB: If you change the threshold here, at least make sure to back up the + * file fully when every single block must be sent, because there's + * nothing good about sending an incremental file in that case. + */ + if (nblocks * BLCKSZ > size * 0.9) + return BACK_UP_FILE_FULLY; + + /* + * Looks like we can send an incremental file, so sort the block numbers + * and then transpose them from absolute block numbers to relative block + * numbers if necessary. + * + * NB: If the block reference table was using the bitmap representation + * for a given chunk, the block numbers in that chunk will already be + * sorted, but when the array-of-offsets representation is used, we can + * receive block numbers here out of order. + */ + qsort(relative_block_numbers, nblocks, sizeof(BlockNumber), + compare_block_numbers); + if (start_blkno != 0) + { + for (i = 0; i < nblocks; ++i) + relative_block_numbers[i] -= start_blkno; + } + *num_blocks_required = nblocks; + + /* + * The truncation block length is the minimum length of the reconstructed + * file. Any block numbers below this threshold that are not present in + * the backup need to be fetched from the prior backup. At or above this + * threshold, blocks should only be included in the result if they are + * present in the backup. (This may require inserting zero blocks if the + * blocks included in the backup are non-consecutive.) + */ + *truncation_block_length = size / BLCKSZ; + if (BlockNumberIsValid(limit_block)) + { + unsigned relative_limit = limit_block - segno * RELSEG_SIZE; + + if (*truncation_block_length < relative_limit) + *truncation_block_length = relative_limit; + } + + /* Send it incrementally. */ + return BACK_UP_FILE_INCREMENTALLY; +} + +/* + * Compute the size for a header of an incremental file containing a given + * number of blocks. The header is rounded to a multiple of BLCKSZ, but + * only if the file will store some block data. + */ +extern size_t +GetIncrementalHeaderSize(unsigned num_blocks_required) +{ + size_t result; + + /* Make sure we're not going to overflow. */ + Assert(num_blocks_required <= RELSEG_SIZE); + + /* + * Three four byte quantities (magic number, truncation block length, + * block count) followed by block numbers. + */ + result = 3 * sizeof(uint32) + (sizeof(BlockNumber) * num_blocks_required); + + /* + * Round the header size to a multiple of BLCKSZ - when not a multiple of + * BLCKSZ, add the missing fraction of a block. But do this only if the + * file will store data for some blocks, otherwise keep it small. + */ + if ((num_blocks_required > 0) && (result % BLCKSZ != 0)) + result += BLCKSZ - (result % BLCKSZ); + + return result; +} + +/* + * Compute the size for an incremental file containing a given number of blocks. + */ +extern size_t +GetIncrementalFileSize(unsigned num_blocks_required) +{ + size_t result; + + /* Make sure we're not going to overflow. */ + Assert(num_blocks_required <= RELSEG_SIZE); + + /* + * Header with three four byte quantities (magic number, truncation block + * length, block count) followed by block numbers, rounded to a multiple + * of BLCKSZ (for files with block data), followed by block contents. + */ + result = GetIncrementalHeaderSize(num_blocks_required); + result += BLCKSZ * num_blocks_required; + + return result; +} + +/* + * Helper function for filemap hash table. + */ +static uint32 +hash_string_pointer(const char *s) +{ + unsigned char *ss = (unsigned char *) s; + + return hash_bytes(ss, strlen(s)); +} + +/* + * This callback to validate the manifest version for incremental backup. + */ +static void +manifest_process_version(JsonManifestParseContext *context, + int manifest_version) +{ + /* Incremental backups don't work with manifest version 1 */ + if (manifest_version == 1) + context->error_cb(context, + "backup manifest version 1 does not support incremental backup"); +} + +/* + * This callback to validate the manifest system identifier against the current + * database server. + */ +static void +manifest_process_system_identifier(JsonManifestParseContext *context, + uint64 manifest_system_identifier) +{ + uint64 system_identifier; + + /* Get system identifier of current system */ + system_identifier = GetSystemIdentifier(); + + if (manifest_system_identifier != system_identifier) + context->error_cb(context, + "system identifier in backup manifest is %llu, but database system identifier is %llu", + (unsigned long long) manifest_system_identifier, + (unsigned long long) system_identifier); +} + +/* + * This callback is invoked for each file mentioned in the backup manifest. + * + * We store the path to each file and the size of each file for sanity-checking + * purposes. For further details, see comments for IncrementalBackupInfo. + */ +static void +manifest_process_file(JsonManifestParseContext *context, + const char *pathname, size_t size, + pg_checksum_type checksum_type, + int checksum_length, + uint8 *checksum_payload) +{ + IncrementalBackupInfo *ib = context->private_data; + backup_file_entry *entry; + bool found; + + entry = backup_file_insert(ib->manifest_files, pathname, &found); + if (!found) + { + entry->path = MemoryContextStrdup(ib->manifest_files->ctx, + pathname); + entry->size = size; + } +} + +/* + * This callback is invoked for each WAL range mentioned in the backup + * manifest. + * + * We're just interested in learning the oldest LSN and the corresponding TLI + * that appear in any WAL range. + */ +static void +manifest_process_wal_range(JsonManifestParseContext *context, + TimeLineID tli, XLogRecPtr start_lsn, + XLogRecPtr end_lsn) +{ + IncrementalBackupInfo *ib = context->private_data; + backup_wal_range *range = palloc(sizeof(backup_wal_range)); + + range->tli = tli; + range->start_lsn = start_lsn; + range->end_lsn = end_lsn; + ib->manifest_wal_ranges = lappend(ib->manifest_wal_ranges, range); +} + +/* + * This callback is invoked if an error occurs while parsing the backup + * manifest. + */ +static void +manifest_report_error(JsonManifestParseContext *context, const char *fmt,...) +{ + StringInfoData errbuf; + + initStringInfo(&errbuf); + + for (;;) + { + va_list ap; + int needed; + + va_start(ap, fmt); + needed = appendStringInfoVA(&errbuf, fmt, ap); + va_end(ap); + if (needed == 0) + break; + enlargeStringInfo(&errbuf, needed); + } + + ereport(ERROR, + errmsg_internal("%s", errbuf.data)); +} + +/* + * Quicksort comparator for block numbers. + */ +static int +compare_block_numbers(const void *a, const void *b) +{ + BlockNumber aa = *(BlockNumber *) a; + BlockNumber bb = *(BlockNumber *) b; + + return pg_cmp_u32(aa, bb); +} diff --git a/src/backend/backup/basebackup_lz4.c b/src/backend/backup/basebackup_lz4.c index 7acb60656493c..aa440aa55dc6f 100644 --- a/src/backend/backup/basebackup_lz4.c +++ b/src/backend/backup/basebackup_lz4.c @@ -3,7 +3,7 @@ * basebackup_lz4.c * Basebackup sink implementing lz4 compression. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/backup/basebackup_lz4.c diff --git a/src/backend/backup/basebackup_progress.c b/src/backend/backup/basebackup_progress.c index c7260dc172f1c..8ff6c6073336a 100644 --- a/src/backend/backup/basebackup_progress.c +++ b/src/backend/backup/basebackup_progress.c @@ -22,7 +22,7 @@ * the logic directly into that file as it's fairly simple, but it seems * cleaner to have everything related to progress reporting in one place.) * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/backup/basebackup_progress.c @@ -31,13 +31,9 @@ */ #include "postgres.h" -#include "backup/basebackup.h" #include "backup/basebackup_sink.h" #include "commands/progress.h" -#include "miscadmin.h" #include "pgstat.h" -#include "storage/latch.h" -#include "utils/timestamp.h" static void bbsink_progress_begin_backup(bbsink *sink); static void bbsink_progress_archive_contents(bbsink *sink, size_t len); diff --git a/src/backend/backup/basebackup_server.c b/src/backend/backup/basebackup_server.c index 2b9d9d2932487..f5c0c61640a94 100644 --- a/src/backend/backup/basebackup_server.c +++ b/src/backend/backup/basebackup_server.c @@ -11,13 +11,11 @@ #include "postgres.h" #include "access/xact.h" -#include "backup/basebackup.h" #include "backup/basebackup_sink.h" #include "catalog/pg_authid.h" #include "miscadmin.h" #include "storage/fd.h" #include "utils/acl.h" -#include "utils/timestamp.h" #include "utils/wait_event.h" typedef struct bbsink_server diff --git a/src/backend/backup/basebackup_sink.c b/src/backend/backup/basebackup_sink.c index 05f33718c8c70..3c51619075865 100644 --- a/src/backend/backup/basebackup_sink.c +++ b/src/backend/backup/basebackup_sink.c @@ -3,7 +3,7 @@ * basebackup_sink.c * Default implementations for bbsink (basebackup sink) callbacks. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * src/backend/backup/basebackup_sink.c * diff --git a/src/backend/backup/basebackup_target.c b/src/backend/backup/basebackup_target.c index 1fa70976b1984..bb50bdfe1d7a1 100644 --- a/src/backend/backup/basebackup_target.c +++ b/src/backend/backup/basebackup_target.c @@ -6,7 +6,7 @@ * Furthermore, new targets can be defined by extensions. This file * contains code to support that functionality. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/backup/basebackup_target.c diff --git a/src/backend/backup/basebackup_throttle.c b/src/backend/backup/basebackup_throttle.c index 32b5e21d69a7b..4477945e61334 100644 --- a/src/backend/backup/basebackup_throttle.c +++ b/src/backend/backup/basebackup_throttle.c @@ -5,7 +5,7 @@ * next base backup sink in the chain at a rate no greater than the * configured maximum. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/backup/basebackup_throttle.c diff --git a/src/backend/backup/basebackup_zstd.c b/src/backend/backup/basebackup_zstd.c index 1bb5820c884f2..0989e92e3c24f 100644 --- a/src/backend/backup/basebackup_zstd.c +++ b/src/backend/backup/basebackup_zstd.c @@ -3,7 +3,7 @@ * basebackup_zstd.c * Basebackup sink implementing zstd compression. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/backup/basebackup_zstd.c @@ -34,7 +34,7 @@ typedef struct bbsink_zstd static void bbsink_zstd_begin_backup(bbsink *sink); static void bbsink_zstd_begin_archive(bbsink *sink, const char *archive_name); -static void bbsink_zstd_archive_contents(bbsink *sink, size_t avail_in); +static void bbsink_zstd_archive_contents(bbsink *sink, size_t len); static void bbsink_zstd_manifest_contents(bbsink *sink, size_t len); static void bbsink_zstd_end_archive(bbsink *sink); static void bbsink_zstd_cleanup(bbsink *sink); @@ -126,8 +126,8 @@ bbsink_zstd_begin_backup(bbsink *sink) if (ZSTD_isError(ret)) ereport(ERROR, errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("could not set compression flag for %s: %s", - "long", ZSTD_getErrorName(ret))); + errmsg("could not enable long-distance mode: %s", + ZSTD_getErrorName(ret))); } /* diff --git a/src/backend/backup/meson.build b/src/backend/backup/meson.build index 11a79bbf80308..79e1f83f8fb03 100644 --- a/src/backend/backup/meson.build +++ b/src/backend/backup/meson.build @@ -1,10 +1,11 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'backup_manifest.c', 'basebackup.c', 'basebackup_copy.c', 'basebackup_gzip.c', + 'basebackup_incremental.c', 'basebackup_lz4.c', 'basebackup_progress.c', 'basebackup_server.c', @@ -12,4 +13,6 @@ backend_sources += files( 'basebackup_target.c', 'basebackup_throttle.c', 'basebackup_zstd.c', + 'walsummary.c', + 'walsummaryfuncs.c', ) diff --git a/src/backend/backup/walsummary.c b/src/backend/backup/walsummary.c new file mode 100644 index 0000000000000..322ae3c3ad115 --- /dev/null +++ b/src/backend/backup/walsummary.c @@ -0,0 +1,353 @@ +/*------------------------------------------------------------------------- + * + * walsummary.c + * Functions for accessing and managing WAL summary data. + * + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group + * + * src/backend/backup/walsummary.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include +#include + +#include "access/xlog_internal.h" +#include "backup/walsummary.h" +#include "common/int.h" +#include "utils/wait_event.h" + +static bool IsWalSummaryFilename(char *filename); +static int ListComparatorForWalSummaryFiles(const ListCell *a, + const ListCell *b); + +/* + * Get a list of WAL summaries. + * + * If tli != 0, only WAL summaries with the indicated TLI will be included. + * + * If start_lsn != InvalidXLogRecPtr, only summaries that end after the + * indicated LSN will be included. + * + * If end_lsn != InvalidXLogRecPtr, only summaries that start before the + * indicated LSN will be included. + * + * The intent is that you can call GetWalSummaries(tli, start_lsn, end_lsn) + * to get all WAL summaries on the indicated timeline that overlap the + * specified LSN range. + */ +List * +GetWalSummaries(TimeLineID tli, XLogRecPtr start_lsn, XLogRecPtr end_lsn) +{ + DIR *sdir; + struct dirent *dent; + List *result = NIL; + + sdir = AllocateDir(XLOGDIR "/summaries"); + while ((dent = ReadDir(sdir, XLOGDIR "/summaries")) != NULL) + { + WalSummaryFile *ws; + uint32 tmp[5]; + TimeLineID file_tli; + XLogRecPtr file_start_lsn; + XLogRecPtr file_end_lsn; + + /* Decode filename, or skip if it's not in the expected format. */ + if (!IsWalSummaryFilename(dent->d_name)) + continue; + sscanf(dent->d_name, "%08X%08X%08X%08X%08X", + &tmp[0], &tmp[1], &tmp[2], &tmp[3], &tmp[4]); + file_tli = tmp[0]; + file_start_lsn = ((uint64) tmp[1]) << 32 | tmp[2]; + file_end_lsn = ((uint64) tmp[3]) << 32 | tmp[4]; + + /* Skip if it doesn't match the filter criteria. */ + if (tli != 0 && tli != file_tli) + continue; + if (!XLogRecPtrIsInvalid(start_lsn) && start_lsn >= file_end_lsn) + continue; + if (!XLogRecPtrIsInvalid(end_lsn) && end_lsn <= file_start_lsn) + continue; + + /* Add it to the list. */ + ws = palloc(sizeof(WalSummaryFile)); + ws->tli = file_tli; + ws->start_lsn = file_start_lsn; + ws->end_lsn = file_end_lsn; + result = lappend(result, ws); + } + FreeDir(sdir); + + return result; +} + +/* + * Build a new list of WAL summaries based on an existing list, but filtering + * out summaries that don't match the search parameters. + * + * If tli != 0, only WAL summaries with the indicated TLI will be included. + * + * If start_lsn != InvalidXLogRecPtr, only summaries that end after the + * indicated LSN will be included. + * + * If end_lsn != InvalidXLogRecPtr, only summaries that start before the + * indicated LSN will be included. + */ +List * +FilterWalSummaries(List *wslist, TimeLineID tli, + XLogRecPtr start_lsn, XLogRecPtr end_lsn) +{ + List *result = NIL; + ListCell *lc; + + /* Loop over input. */ + foreach(lc, wslist) + { + WalSummaryFile *ws = lfirst(lc); + + /* Skip if it doesn't match the filter criteria. */ + if (tli != 0 && tli != ws->tli) + continue; + if (!XLogRecPtrIsInvalid(start_lsn) && start_lsn > ws->end_lsn) + continue; + if (!XLogRecPtrIsInvalid(end_lsn) && end_lsn < ws->start_lsn) + continue; + + /* Add it to the result list. */ + result = lappend(result, ws); + } + + return result; +} + +/* + * Check whether the supplied list of WalSummaryFile objects covers the + * whole range of LSNs from start_lsn to end_lsn. This function ignores + * timelines, so the caller should probably filter using the appropriate + * timeline before calling this. + * + * If the whole range of LSNs is covered, returns true, otherwise false. + * If false is returned, *missing_lsn is set either to InvalidXLogRecPtr + * if there are no WAL summary files in the input list, or to the first LSN + * in the range that is not covered by a WAL summary file in the input list. + */ +bool +WalSummariesAreComplete(List *wslist, XLogRecPtr start_lsn, + XLogRecPtr end_lsn, XLogRecPtr *missing_lsn) +{ + XLogRecPtr current_lsn = start_lsn; + ListCell *lc; + + /* Special case for empty list. */ + if (wslist == NIL) + { + *missing_lsn = InvalidXLogRecPtr; + return false; + } + + /* Make a private copy of the list and sort it by start LSN. */ + wslist = list_copy(wslist); + list_sort(wslist, ListComparatorForWalSummaryFiles); + + /* + * Consider summary files in order of increasing start_lsn, advancing the + * known-summarized range from start_lsn toward end_lsn. + * + * Normally, the summary files should cover non-overlapping WAL ranges, + * but this algorithm is intended to be correct even in case of overlap. + */ + foreach(lc, wslist) + { + WalSummaryFile *ws = lfirst(lc); + + if (ws->start_lsn > current_lsn) + { + /* We found a gap. */ + break; + } + if (ws->end_lsn > current_lsn) + { + /* + * Next summary extends beyond end of previous summary, so extend + * the end of the range known to be summarized. + */ + current_lsn = ws->end_lsn; + + /* + * If the range we know to be summarized has reached the required + * end LSN, we have proved completeness. + */ + if (current_lsn >= end_lsn) + return true; + } + } + + /* + * We either ran out of summary files without reaching the end LSN, or we + * hit a gap in the sequence that resulted in us bailing out of the loop + * above. + */ + *missing_lsn = current_lsn; + return false; +} + +/* + * Open a WAL summary file. + * + * This will throw an error in case of trouble. As an exception, if + * missing_ok = true and the trouble is specifically that the file does + * not exist, it will not throw an error and will return a value less than 0. + */ +File +OpenWalSummaryFile(WalSummaryFile *ws, bool missing_ok) +{ + char path[MAXPGPATH]; + File file; + + snprintf(path, MAXPGPATH, + XLOGDIR "/summaries/%08X%08X%08X%08X%08X.summary", + ws->tli, + LSN_FORMAT_ARGS(ws->start_lsn), + LSN_FORMAT_ARGS(ws->end_lsn)); + + file = PathNameOpenFile(path, O_RDONLY); + if (file < 0 && (errno != EEXIST || !missing_ok)) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\": %m", path))); + + return file; +} + +/* + * Remove a WAL summary file if the last modification time precedes the + * cutoff time. + */ +void +RemoveWalSummaryIfOlderThan(WalSummaryFile *ws, time_t cutoff_time) +{ + char path[MAXPGPATH]; + struct stat statbuf; + + snprintf(path, MAXPGPATH, + XLOGDIR "/summaries/%08X%08X%08X%08X%08X.summary", + ws->tli, + LSN_FORMAT_ARGS(ws->start_lsn), + LSN_FORMAT_ARGS(ws->end_lsn)); + + if (lstat(path, &statbuf) != 0) + { + if (errno == ENOENT) + return; + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not stat file \"%s\": %m", path))); + } + if (statbuf.st_mtime >= cutoff_time) + return; + if (unlink(path) != 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not stat file \"%s\": %m", path))); + ereport(DEBUG2, + (errmsg_internal("removing file \"%s\"", path))); +} + +/* + * Test whether a filename looks like a WAL summary file. + */ +static bool +IsWalSummaryFilename(char *filename) +{ + return strspn(filename, "0123456789ABCDEF") == 40 && + strcmp(filename + 40, ".summary") == 0; +} + +/* + * Data read callback for use with CreateBlockRefTableReader. + */ +int +ReadWalSummary(void *wal_summary_io, void *data, int length) +{ + WalSummaryIO *io = wal_summary_io; + int nbytes; + + nbytes = FileRead(io->file, data, length, io->filepos, + WAIT_EVENT_WAL_SUMMARY_READ); + if (nbytes < 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not read file \"%s\": %m", + FilePathName(io->file)))); + + io->filepos += nbytes; + return nbytes; +} + +/* + * Data write callback for use with WriteBlockRefTable. + */ +int +WriteWalSummary(void *wal_summary_io, void *data, int length) +{ + WalSummaryIO *io = wal_summary_io; + int nbytes; + + nbytes = FileWrite(io->file, data, length, io->filepos, + WAIT_EVENT_WAL_SUMMARY_WRITE); + if (nbytes < 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not write file \"%s\": %m", + FilePathName(io->file)))); + if (nbytes != length) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not write file \"%s\": wrote only %d of %d bytes at offset %u", + FilePathName(io->file), nbytes, + length, (unsigned) io->filepos), + errhint("Check free disk space."))); + + io->filepos += nbytes; + return nbytes; +} + +/* + * Error-reporting callback for use with CreateBlockRefTableReader. + */ +void +ReportWalSummaryError(void *callback_arg, char *fmt,...) +{ + StringInfoData buf; + va_list ap; + int needed; + + initStringInfo(&buf); + for (;;) + { + va_start(ap, fmt); + needed = appendStringInfoVA(&buf, fmt, ap); + va_end(ap); + if (needed == 0) + break; + enlargeStringInfo(&buf, needed); + } + ereport(ERROR, + errcode(ERRCODE_DATA_CORRUPTED), + errmsg_internal("%s", buf.data)); +} + +/* + * Comparator to sort a List of WalSummaryFile objects by start_lsn. + */ +static int +ListComparatorForWalSummaryFiles(const ListCell *a, const ListCell *b) +{ + WalSummaryFile *ws1 = lfirst(a); + WalSummaryFile *ws2 = lfirst(b); + + return pg_cmp_u64(ws1->start_lsn, ws2->start_lsn); +} diff --git a/src/backend/backup/walsummaryfuncs.c b/src/backend/backup/walsummaryfuncs.c new file mode 100644 index 0000000000000..bb6a3a4a36677 --- /dev/null +++ b/src/backend/backup/walsummaryfuncs.c @@ -0,0 +1,208 @@ +/*------------------------------------------------------------------------- + * + * walsummaryfuncs.c + * SQL-callable functions for accessing WAL summary data. + * + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group + * + * src/backend/backup/walsummaryfuncs.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "backup/walsummary.h" +#include "common/blkreftable.h" +#include "funcapi.h" +#include "miscadmin.h" +#include "postmaster/walsummarizer.h" +#include "utils/fmgrprotos.h" +#include "utils/pg_lsn.h" + +#define NUM_WS_ATTS 3 +#define NUM_SUMMARY_ATTS 6 +#define NUM_STATE_ATTS 4 +#define MAX_BLOCKS_PER_CALL 256 + +/* + * List the WAL summary files available in pg_wal/summaries. + */ +Datum +pg_available_wal_summaries(PG_FUNCTION_ARGS) +{ + ReturnSetInfo *rsi; + List *wslist; + ListCell *lc; + Datum values[NUM_WS_ATTS]; + bool nulls[NUM_WS_ATTS]; + + InitMaterializedSRF(fcinfo, 0); + rsi = (ReturnSetInfo *) fcinfo->resultinfo; + + memset(nulls, 0, sizeof(nulls)); + + wslist = GetWalSummaries(0, InvalidXLogRecPtr, InvalidXLogRecPtr); + foreach(lc, wslist) + { + WalSummaryFile *ws = (WalSummaryFile *) lfirst(lc); + HeapTuple tuple; + + CHECK_FOR_INTERRUPTS(); + + values[0] = Int64GetDatum((int64) ws->tli); + values[1] = LSNGetDatum(ws->start_lsn); + values[2] = LSNGetDatum(ws->end_lsn); + + tuple = heap_form_tuple(rsi->setDesc, values, nulls); + tuplestore_puttuple(rsi->setResult, tuple); + } + + return (Datum) 0; +} + +/* + * List the contents of a WAL summary file identified by TLI, start LSN, + * and end LSN. + */ +Datum +pg_wal_summary_contents(PG_FUNCTION_ARGS) +{ + ReturnSetInfo *rsi; + Datum values[NUM_SUMMARY_ATTS]; + bool nulls[NUM_SUMMARY_ATTS]; + WalSummaryFile ws; + WalSummaryIO io; + BlockRefTableReader *reader; + int64 raw_tli; + RelFileLocator rlocator; + ForkNumber forknum; + BlockNumber limit_block; + + InitMaterializedSRF(fcinfo, 0); + rsi = (ReturnSetInfo *) fcinfo->resultinfo; + memset(nulls, 0, sizeof(nulls)); + + /* + * Since the timeline could at least in theory be more than 2^31, and + * since we don't have unsigned types at the SQL level, it is passed as a + * 64-bit integer. Test whether it's out of range. + */ + raw_tli = PG_GETARG_INT64(0); + if (raw_tli < 1 || raw_tli > PG_INT32_MAX) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid timeline %lld", (long long) raw_tli)); + + /* Prepare to read the specified WAL summary file. */ + ws.tli = (TimeLineID) raw_tli; + ws.start_lsn = PG_GETARG_LSN(1); + ws.end_lsn = PG_GETARG_LSN(2); + io.filepos = 0; + io.file = OpenWalSummaryFile(&ws, false); + reader = CreateBlockRefTableReader(ReadWalSummary, &io, + FilePathName(io.file), + ReportWalSummaryError, NULL); + + /* Loop over relation forks. */ + while (BlockRefTableReaderNextRelation(reader, &rlocator, &forknum, + &limit_block)) + { + BlockNumber blocks[MAX_BLOCKS_PER_CALL]; + HeapTuple tuple; + + CHECK_FOR_INTERRUPTS(); + + values[0] = ObjectIdGetDatum(rlocator.relNumber); + values[1] = ObjectIdGetDatum(rlocator.spcOid); + values[2] = ObjectIdGetDatum(rlocator.dbOid); + values[3] = Int16GetDatum((int16) forknum); + + /* + * If the limit block is not InvalidBlockNumber, emit an extra row + * with that block number and limit_block = true. + * + * There is no point in doing this when the limit_block is + * InvalidBlockNumber, because no block with that number or any higher + * number can ever exist. + */ + if (BlockNumberIsValid(limit_block)) + { + values[4] = Int64GetDatum((int64) limit_block); + values[5] = BoolGetDatum(true); + + tuple = heap_form_tuple(rsi->setDesc, values, nulls); + tuplestore_puttuple(rsi->setResult, tuple); + } + + /* Loop over blocks within the current relation fork. */ + while (1) + { + unsigned nblocks; + unsigned i; + + CHECK_FOR_INTERRUPTS(); + + nblocks = BlockRefTableReaderGetBlocks(reader, blocks, + MAX_BLOCKS_PER_CALL); + if (nblocks == 0) + break; + + /* + * For each block that we specifically know to have been modified, + * emit a row with that block number and limit_block = false. + */ + values[5] = BoolGetDatum(false); + for (i = 0; i < nblocks; ++i) + { + values[4] = Int64GetDatum((int64) blocks[i]); + + tuple = heap_form_tuple(rsi->setDesc, values, nulls); + tuplestore_puttuple(rsi->setResult, tuple); + } + } + } + + /* Cleanup */ + DestroyBlockRefTableReader(reader); + FileClose(io.file); + + return (Datum) 0; +} + +/* + * Returns information about the state of the WAL summarizer process. + */ +Datum +pg_get_wal_summarizer_state(PG_FUNCTION_ARGS) +{ + Datum values[NUM_STATE_ATTS]; + bool nulls[NUM_STATE_ATTS]; + TimeLineID summarized_tli; + XLogRecPtr summarized_lsn; + XLogRecPtr pending_lsn; + int summarizer_pid; + TupleDesc tupdesc; + HeapTuple htup; + + GetWalSummarizerState(&summarized_tli, &summarized_lsn, &pending_lsn, + &summarizer_pid); + + if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) + elog(ERROR, "return type must be a row type"); + + memset(nulls, 0, sizeof(nulls)); + + values[0] = Int64GetDatum((int64) summarized_tli); + values[1] = LSNGetDatum(summarized_lsn); + values[2] = LSNGetDatum(pending_lsn); + + if (summarizer_pid < 0) + nulls[3] = true; + else + values[3] = Int32GetDatum(summarizer_pid); + + htup = heap_form_tuple(tupdesc, values, nulls); + + PG_RETURN_DATUM(HeapTupleGetDatum(htup)); +} diff --git a/src/backend/bootstrap/Makefile b/src/backend/bootstrap/Makefile index 606c8021e766b..509b51e648311 100644 --- a/src/backend/bootstrap/Makefile +++ b/src/backend/bootstrap/Makefile @@ -28,5 +28,7 @@ bootparse.c: BISONFLAGS += -d # Force these dependencies to be known even without dependency info built: bootparse.o bootscanner.o: bootparse.h -# bootparse.c and bootscanner.c are in the distribution tarball, so -# they are not cleaned here. +clean: + rm -f bootparse.c \ + bootparse.h \ + bootscanner.c diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y index 81a1b7bfec3f6..3c9c1da0216db 100644 --- a/src/backend/bootstrap/bootparse.y +++ b/src/backend/bootstrap/bootparse.y @@ -4,7 +4,7 @@ * bootparse.y * yacc grammar for the "bootstrap" mode (BKI file format) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/bootstrap/bootscanner.l b/src/backend/bootstrap/bootscanner.l index 6a9d4193f2c8c..31d63ff301596 100644 --- a/src/backend/bootstrap/bootscanner.l +++ b/src/backend/bootstrap/bootscanner.l @@ -4,7 +4,7 @@ * bootscanner.l * a lexical scanner for the bootstrap parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 49e956b2c577f..986f6f1d9ca07 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -4,7 +4,7 @@ * routines to support running postgres in 'bootstrap' mode * bootstrap mode is used to create the initial template database * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -23,24 +23,20 @@ #include "access/tableam.h" #include "access/toast_compression.h" #include "access/xact.h" -#include "access/xlog_internal.h" #include "bootstrap/bootstrap.h" #include "catalog/index.h" #include "catalog/pg_collation.h" #include "catalog/pg_type.h" #include "common/link-canary.h" -#include "libpq/pqsignal.h" #include "miscadmin.h" #include "nodes/makefuncs.h" #include "pg_getopt.h" -#include "storage/bufmgr.h" #include "storage/bufpage.h" -#include "storage/condition_variable.h" #include "storage/ipc.h" #include "storage/proc.h" -#include "tcop/tcopprot.h" #include "utils/builtins.h" #include "utils/fmgroids.h" +#include "utils/guc.h" #include "utils/memutils.h" #include "utils/rel.h" #include "utils/relmapper.h" @@ -280,16 +276,7 @@ BootstrapModeMain(int argc, char *argv[], bool check_only) strlcpy(OutputFileName, optarg, MAXPGPATH); break; case 'X': - { - int WalSegSz = strtoul(optarg, NULL, 0); - - if (!IsValidWalSegSize(WalSegSz)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("-X requires a power of two value between 1 MB and 1 GB"))); - SetConfigOption("wal_segment_size", optarg, PGC_INTERNAL, - PGC_S_DYNAMIC_DEFAULT); - } + SetConfigOption("wal_segment_size", optarg, PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); break; default: write_stderr("Try \"%s --help\" for more information.\n", @@ -354,7 +341,7 @@ BootstrapModeMain(int argc, char *argv[], bool check_only) if (pg_link_canary_is_frontend()) elog(ERROR, "backend is incorrectly linked to frontend functions"); - InitPostgres(NULL, InvalidOid, NULL, InvalidOid, false, false, NULL); + InitPostgres(NULL, InvalidOid, NULL, InvalidOid, 0, NULL); /* Initialize stuff for bootstrap-file processing */ for (i = 0; i < MAXATTR; i++) @@ -561,7 +548,6 @@ DefineAttr(char *name, char *type, int attnum, int nullness) if (OidIsValid(attrtypes[attnum]->attcollation)) attrtypes[attnum]->attcollation = C_COLLATION_OID; - attrtypes[attnum]->attstattarget = -1; attrtypes[attnum]->attcacheoff = -1; attrtypes[attnum]->atttypmod = -1; attrtypes[attnum]->attislocal = true; @@ -914,7 +900,7 @@ AllocateAttribute(void) void index_register(Oid heap, Oid ind, - IndexInfo *indexInfo) + const IndexInfo *indexInfo) { IndexList *newind; MemoryContext oldcxt; diff --git a/src/backend/bootstrap/meson.build b/src/backend/bootstrap/meson.build index aa18de6ba6c95..a8f821e98b445 100644 --- a/src/backend/bootstrap/meson.build +++ b/src/backend/bootstrap/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'bootstrap.c') diff --git a/src/backend/catalog/.gitignore b/src/backend/catalog/.gitignore deleted file mode 100644 index 237ff541659b1..0000000000000 --- a/src/backend/catalog/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/postgres.bki -/schemapg.h -/system_fk_info.h -/system_constraints.sql -/pg_*_d.h -/bki-stamp diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm index 84aaeb002a60f..8e709524cba65 100644 --- a/src/backend/catalog/Catalog.pm +++ b/src/backend/catalog/Catalog.pm @@ -4,7 +4,7 @@ # Perl module that extracts info from catalog files into Perl # data structures # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/backend/catalog/Catalog.pm @@ -14,7 +14,7 @@ package Catalog; use strict; -use warnings; +use warnings FATAL => 'all'; use File::Compare; @@ -91,73 +91,99 @@ sub ParseHeader # Push the data into the appropriate data structure. # Caution: when adding new recognized OID-defining macros, # also update src/include/catalog/renumber_oids.pl. - if (/^DECLARE_TOAST\(\s*(\w+),\s*(\d+),\s*(\d+)\)/) + if (/^DECLARE_TOAST\(\s* + (?\w+),\s* + (?\d+),\s* + (?\d+)\s* + \)/x + ) { - push @{ $catalog{toasting} }, - { parent_table => $1, toast_oid => $2, toast_index_oid => $3 }; + push @{ $catalog{toasting} }, {%+}; } elsif ( - /^DECLARE_TOAST_WITH_MACRO\(\s*(\w+),\s*(\d+),\s*(\d+),\s*(\w+),\s*(\w+)\)/ + /^DECLARE_TOAST_WITH_MACRO\(\s* + (?\w+),\s* + (?\d+),\s* + (?\d+),\s* + (?\w+),\s* + (?\w+)\s* + \)/x ) { - push @{ $catalog{toasting} }, - { - parent_table => $1, - toast_oid => $2, - toast_index_oid => $3, - toast_oid_macro => $4, - toast_index_oid_macro => $5 - }; + push @{ $catalog{toasting} }, {%+}; } elsif ( - /^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s*(\w+),\s*(\d+),\s*(\w+),\s*(.+)\)/ + /^DECLARE_(UNIQUE_)?INDEX(_PKEY)?\(\s* + (?\w+),\s* + (?\d+),\s* + (?\w+),\s* + (?\w+),\s* + (?.+)\s* + \)/x ) { push @{ $catalog{indexing} }, { is_unique => $1 ? 1 : 0, is_pkey => $2 ? 1 : 0, - index_name => $3, - index_oid => $4, - index_oid_macro => $5, - index_decl => $6 + %+, }; } - elsif (/^DECLARE_OID_DEFINING_MACRO\(\s*(\w+),\s*(\d+)\)/) + elsif ( + /^MAKE_SYSCACHE\(\s* + (?\w+),\s* + (?\w+),\s* + (?\w+)\s* + \)/x + ) { - push @{ $catalog{other_oids} }, - { - other_name => $1, - other_oid => $2 - }; + push @{ $catalog{syscaches} }, {%+}; } elsif ( - /^DECLARE_(ARRAY_)?FOREIGN_KEY(_OPT)?\(\s*\(([^)]+)\),\s*(\w+),\s*\(([^)]+)\)\)/ + /^DECLARE_OID_DEFINING_MACRO\(\s* + (?\w+),\s* + (?\d+)\s* + \)/x + ) + { + push @{ $catalog{other_oids} }, {%+}; + } + elsif ( + /^DECLARE_(ARRAY_)?FOREIGN_KEY(_OPT)?\(\s* + \((?[^)]+)\),\s* + (?\w+),\s* + \((?[^)]+)\)\s* + \)/x ) { push @{ $catalog{foreign_keys} }, { is_array => $1 ? 1 : 0, is_opt => $2 ? 1 : 0, - fk_cols => $3, - pk_table => $4, - pk_cols => $5 + %+, }; } - elsif (/^CATALOG\((\w+),(\d+),(\w+)\)/) + elsif ( + /^CATALOG\(\s* + (?\w+),\s* + (?\d+),\s* + (?\w+)\s* + \)/x + ) { - $catalog{catname} = $1; - $catalog{relation_oid} = $2; - $catalog{relation_oid_macro} = $3; + @catalog{ keys %+ } = values %+; $catalog{bootstrap} = /BKI_BOOTSTRAP/ ? ' bootstrap' : ''; $catalog{shared_relation} = /BKI_SHARED_RELATION/ ? ' shared_relation' : ''; - if (/BKI_ROWTYPE_OID\((\d+),(\w+)\)/) + if (/BKI_ROWTYPE_OID\(\s* + (?\d+),\s* + (?\w+)\s* + \)/x + ) { - $catalog{rowtype_oid} = $1; - $catalog{rowtype_oid_clause} = " rowtype_oid $1"; - $catalog{rowtype_oid_macro} = $2; + @catalog{ keys %+ } = values %+; + $catalog{rowtype_oid_clause} = " rowtype_oid $+{rowtype_oid}"; } else { @@ -274,12 +300,14 @@ sub ParseHeader # Parses a file containing Perl data structure literals, returning live data. # -# The parameter $preserve_formatting needs to be set for callers that want +# The parameter $preserve_comments needs to be set for callers that want # to work with non-data lines in the data files, such as comments and blank # lines. If a caller just wants to consume the data, leave it unset. +# (When requested, non-data lines will be returned as array entries that +# are strings not hashes, so extra code is needed to deal with that.) sub ParseData { - my ($input_file, $schema, $preserve_formatting) = @_; + my ($input_file, $schema, $preserve_comments) = @_; open(my $ifd, '<', $input_file) || die "$input_file: $!"; $input_file =~ /(\w+)\.dat$/ @@ -287,85 +315,69 @@ sub ParseData my $catname = $1; my $data = []; - if ($preserve_formatting) + # Scan the input file. + while (<$ifd>) { - # Scan the input file. - while (<$ifd>) - { - my $hash_ref; + my $hash_ref; - if (/{/) + if (/{/) + { + # Capture the hash ref + # NB: Assumes that the next hash ref can't start on the + # same line where the present one ended. + # Not foolproof, but we shouldn't need a full parser, + # since we expect relatively well-behaved input. + + # Quick hack to detect when we have a full hash ref to + # parse. We can't just use a regex because of values in + # pg_aggregate and pg_proc like '{0,0}'. This will need + # work if we ever need to allow unbalanced braces within + # a field value. + my $lcnt = tr/{//; + my $rcnt = tr/}//; + + if ($lcnt == $rcnt) { - # Capture the hash ref - # NB: Assumes that the next hash ref can't start on the - # same line where the present one ended. - # Not foolproof, but we shouldn't need a full parser, - # since we expect relatively well-behaved input. - - # Quick hack to detect when we have a full hash ref to - # parse. We can't just use a regex because of values in - # pg_aggregate and pg_proc like '{0,0}'. This will need - # work if we ever need to allow unbalanced braces within - # a field value. - my $lcnt = tr/{//; - my $rcnt = tr/}//; - - if ($lcnt == $rcnt) - { - # We're treating the input line as a piece of Perl, so we - # need to use string eval here. Tell perlcritic we know what - # we're doing. - eval "\$hash_ref = $_"; ## no critic (ProhibitStringyEval) - if (!ref $hash_ref) - { - die "$input_file: error parsing line $.:\n$_\n"; - } - - # Annotate each hash with the source line number. - $hash_ref->{line_number} = $.; - - # Expand tuples to their full representation. - AddDefaultValues($hash_ref, $schema, $catname); - } - else + # We're treating the input line as a piece of Perl, so we + # need to use string eval here. Tell perlcritic we know what + # we're doing. + eval "\$hash_ref = $_"; ## no critic (ProhibitStringyEval) + if (!ref $hash_ref) { - my $next_line = <$ifd>; - die "$input_file: file ends within Perl hash\n" - if !defined $next_line; - $_ .= $next_line; - redo; + die "$input_file: error parsing line $.:\n$_\n"; } - } - # If we found a hash reference, keep it, unless it is marked as - # autogenerated; in that case it'd duplicate an entry we'll - # autogenerate below. (This makes it safe for reformat_dat_file.pl - # with --full-tuples to print autogenerated entries, which seems like - # useful behavior for debugging.) - # - # Otherwise, we have a non-data string, which we need to keep in - # order to preserve formatting. - if (defined $hash_ref) - { - push @$data, $hash_ref if !$hash_ref->{autogenerated}; + # Annotate each hash with the source line number. + $hash_ref->{line_number} = $.; + + # Expand tuples to their full representation. + AddDefaultValues($hash_ref, $schema, $catname); } else { - push @$data, $_; + my $next_line = <$ifd>; + die "$input_file: file ends within Perl hash\n" + if !defined $next_line; + $_ .= $next_line; + redo; } } - } - else - { - # When we only care about the contents, it's faster to read and eval - # the whole file at once. - local $/; - my $full_file = <$ifd>; - eval "\$data = $full_file" ## no critic (ProhibitStringyEval) - or die "error parsing $input_file\n"; - foreach my $hash_ref (@{$data}) + + # If we found a hash reference, keep it, unless it is marked as + # autogenerated; in that case it'd duplicate an entry we'll + # autogenerate below. (This makes it safe for reformat_dat_file.pl + # with --full-tuples to print autogenerated entries, which seems like + # useful behavior for debugging.) + # + # Otherwise, we have a non-data string, which we keep only if + # the caller requested it. + if (defined $hash_ref) + { + push @$data, $hash_ref if !$hash_ref->{autogenerated}; + } + else { - AddDefaultValues($hash_ref, $schema, $catname); + push @$data, $_ if $preserve_comments; } } diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile index a60107bf9460b..1589a75fd5332 100644 --- a/src/backend/catalog/Makefile +++ b/src/backend/catalog/Makefile @@ -2,7 +2,7 @@ # # Makefile for backend/catalog # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/backend/catalog/Makefile @@ -50,82 +50,8 @@ OBJS = \ include $(top_srcdir)/src/backend/common.mk -# Note: the order of this list determines the order in which the catalog -# header files are assembled into postgres.bki. BKI_BOOTSTRAP catalogs -# must appear first, and pg_statistic before pg_statistic_ext_data, and -# there are reputedly other, undocumented ordering dependencies. -CATALOG_HEADERS := \ - pg_proc.h pg_type.h pg_attribute.h pg_class.h \ - pg_attrdef.h pg_constraint.h pg_inherits.h pg_index.h pg_operator.h \ - pg_opfamily.h pg_opclass.h pg_am.h pg_amop.h pg_amproc.h \ - pg_language.h pg_largeobject_metadata.h pg_largeobject.h pg_aggregate.h \ - pg_statistic.h pg_statistic_ext.h pg_statistic_ext_data.h \ - pg_rewrite.h pg_trigger.h pg_event_trigger.h pg_description.h \ - pg_cast.h pg_enum.h pg_namespace.h pg_conversion.h pg_depend.h \ - pg_database.h pg_db_role_setting.h pg_tablespace.h \ - pg_authid.h pg_auth_members.h pg_shdepend.h pg_shdescription.h \ - pg_ts_config.h pg_ts_config_map.h pg_ts_dict.h \ - pg_ts_parser.h pg_ts_template.h pg_extension.h \ - pg_foreign_data_wrapper.h pg_foreign_server.h pg_user_mapping.h \ - pg_foreign_table.h pg_policy.h pg_replication_origin.h \ - pg_default_acl.h pg_init_privs.h pg_seclabel.h pg_shseclabel.h \ - pg_collation.h pg_parameter_acl.h pg_partitioned_table.h \ - pg_range.h pg_transform.h \ - pg_sequence.h pg_publication.h pg_publication_namespace.h \ - pg_publication_rel.h pg_subscription.h pg_subscription_rel.h - -GENERATED_HEADERS := $(CATALOG_HEADERS:%.h=%_d.h) schemapg.h system_fk_info.h - -POSTGRES_BKI_SRCS := $(addprefix $(top_srcdir)/src/include/catalog/, $(CATALOG_HEADERS)) - -# The .dat files we need can just be listed alphabetically. -POSTGRES_BKI_DATA = $(addprefix $(top_srcdir)/src/include/catalog/,\ - pg_aggregate.dat pg_am.dat pg_amop.dat pg_amproc.dat pg_authid.dat \ - pg_cast.dat pg_class.dat pg_collation.dat pg_conversion.dat \ - pg_database.dat pg_language.dat \ - pg_namespace.dat pg_opclass.dat pg_operator.dat pg_opfamily.dat \ - pg_proc.dat pg_range.dat pg_tablespace.dat \ - pg_ts_config.dat pg_ts_config_map.dat pg_ts_dict.dat pg_ts_parser.dat \ - pg_ts_template.dat pg_type.dat \ - ) - -all: distprep generated-header-symlinks - -distprep: bki-stamp - -.PHONY: generated-header-symlinks - -generated-header-symlinks: $(top_builddir)/src/include/catalog/header-stamp - -# bki-stamp records the last time we ran genbki.pl. We don't rely on -# the timestamps of the individual output files, because the Perl script -# won't update them if they didn't change (to avoid unnecessary recompiles). -# Technically, this should depend on Makefile.global which supplies -# $(MAJORVERSION); but then genbki.pl would need to be re-run after every -# configure run, even in distribution tarballs. So depending on configure.ac -# instead is cheating a bit, but it will achieve the goal of updating the -# version number when it changes. -bki-stamp: genbki.pl Catalog.pm $(POSTGRES_BKI_SRCS) $(POSTGRES_BKI_DATA) $(top_srcdir)/configure.ac $(top_srcdir)/src/include/access/transam.h - $(PERL) $< --include-path=$(top_srcdir)/src/include/ \ - --set-version=$(MAJORVERSION) $(POSTGRES_BKI_SRCS) - touch $@ - -# The generated headers must all be symlinked into builddir/src/include/, -# using absolute links for the reasons explained in src/backend/Makefile. -# We use header-stamp to record that we've done this because the symlinks -# themselves may appear older than bki-stamp. -$(top_builddir)/src/include/catalog/header-stamp: bki-stamp - prereqdir=`cd '$(dir $<)' >/dev/null && pwd` && \ - cd '$(dir $@)' && for file in $(GENERATED_HEADERS); do \ - rm -f $$file && $(LN_S) "$$prereqdir/$$file" . ; \ - done - touch $@ - -# Note: installation of generated headers is handled elsewhere .PHONY: install-data -install-data: bki-stamp installdirs - $(INSTALL_DATA) $(call vpathsearch,postgres.bki) '$(DESTDIR)$(datadir)/postgres.bki' - $(INSTALL_DATA) $(call vpathsearch,system_constraints.sql) '$(DESTDIR)$(datadir)/system_constraints.sql' +install-data: installdirs $(INSTALL_DATA) $(srcdir)/system_functions.sql '$(DESTDIR)$(datadir)/system_functions.sql' $(INSTALL_DATA) $(srcdir)/system_views.sql '$(DESTDIR)$(datadir)/system_views.sql' $(INSTALL_DATA) $(srcdir)/information_schema.sql '$(DESTDIR)$(datadir)/information_schema.sql' @@ -136,11 +62,4 @@ installdirs: .PHONY: uninstall-data uninstall-data: - rm -f $(addprefix '$(DESTDIR)$(datadir)'/, postgres.bki system_constraints.sql system_functions.sql system_views.sql information_schema.sql sql_features.txt) - -# postgres.bki, system_constraints.sql, and the generated headers are -# in the distribution tarball, so they are not cleaned here. -clean: - -maintainer-clean: clean - rm -f bki-stamp postgres.bki system_constraints.sql $(GENERATED_HEADERS) + rm -f $(addprefix '$(DESTDIR)$(datadir)'/, system_functions.sql system_views.sql information_schema.sql sql_features.txt) diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c index bc2ad773c90b5..bc0e259f69f23 100644 --- a/src/backend/catalog/aclchk.c +++ b/src/backend/catalog/aclchk.c @@ -3,7 +3,7 @@ * aclchk.c * Routines to check access control permissions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -13,6 +13,27 @@ * NOTES * See acl.h. * + * The xxx_aclmask() functions in this file are wrappers around + * acl.c's aclmask() function; see that for basic usage information. + * The wrapper functions add object-type-specific lookup capability. + * Generally, they will throw error if the object doesn't exist. + * + * The xxx_aclmask_ext() functions add the ability to not throw + * error if the object doesn't exist. If their "is_missing" argument + * isn't NULL, then when the object isn't found they will set + * *is_missing = true and return zero (no privileges) instead of + * throwing an error. Caller must initialize *is_missing = false. + * + * The xxx_aclcheck() functions are simplified wrappers around the + * corresponding xxx_aclmask() functions, simply returning ACLCHECK_OK + * if any of the privileges specified in "mode" are held, and otherwise + * a suitable error code (in practice, always ACLCHECK_NO_PRIV). + * Again, they will throw error if the object doesn't exist. + * + * The xxx_aclcheck_ext() functions add the ability to not throw + * error if the object doesn't exist. Their "is_missing" argument + * works similarly to the xxx_aclmask_ext() functions. + * *------------------------------------------------------------------------- */ #include "postgres.h" @@ -28,17 +49,10 @@ #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/objectaccess.h" -#include "catalog/pg_aggregate.h" -#include "catalog/pg_am.h" #include "catalog/pg_authid.h" -#include "catalog/pg_cast.h" #include "catalog/pg_class.h" -#include "catalog/pg_collation.h" -#include "catalog/pg_conversion.h" #include "catalog/pg_database.h" #include "catalog/pg_default_acl.h" -#include "catalog/pg_event_trigger.h" -#include "catalog/pg_extension.h" #include "catalog/pg_foreign_data_wrapper.h" #include "catalog/pg_foreign_server.h" #include "catalog/pg_init_privs.h" @@ -46,19 +60,9 @@ #include "catalog/pg_largeobject.h" #include "catalog/pg_largeobject_metadata.h" #include "catalog/pg_namespace.h" -#include "catalog/pg_opclass.h" -#include "catalog/pg_operator.h" -#include "catalog/pg_opfamily.h" #include "catalog/pg_parameter_acl.h" #include "catalog/pg_proc.h" -#include "catalog/pg_statistic_ext.h" -#include "catalog/pg_subscription.h" #include "catalog/pg_tablespace.h" -#include "catalog/pg_transform.h" -#include "catalog/pg_ts_config.h" -#include "catalog/pg_ts_dict.h" -#include "catalog/pg_ts_parser.h" -#include "catalog/pg_ts_template.h" #include "catalog/pg_type.h" #include "commands/dbcommands.h" #include "commands/defrem.h" @@ -71,6 +75,7 @@ #include "nodes/makefuncs.h" #include "parser/parse_func.h" #include "parser/parse_type.h" +#include "storage/lmgr.h" #include "utils/acl.h" #include "utils/aclchk_internal.h" #include "utils/builtins.h" @@ -139,6 +144,9 @@ static AclMode pg_aclmask(ObjectType objtype, Oid object_oid, AttrNumber attnum, Oid roleid, AclMode mask, AclMaskHow how); static AclMode object_aclmask(Oid classid, Oid objectid, Oid roleid, AclMode mask, AclMaskHow how); +static AclMode object_aclmask_ext(Oid classid, Oid objectid, Oid roleid, + AclMode mask, AclMaskHow how, + bool *is_missing); static AclMode pg_attribute_aclmask(Oid table_oid, AttrNumber attnum, Oid roleid, AclMode mask, AclMaskHow how); static AclMode pg_attribute_aclmask_ext(Oid table_oid, AttrNumber attnum, @@ -151,10 +159,12 @@ static AclMode pg_parameter_acl_aclmask(Oid acl_oid, Oid roleid, AclMode mask, AclMaskHow how); static AclMode pg_largeobject_aclmask_snapshot(Oid lobj_oid, Oid roleid, AclMode mask, AclMaskHow how, Snapshot snapshot); -static AclMode pg_namespace_aclmask(Oid nsp_oid, Oid roleid, - AclMode mask, AclMaskHow how); -static AclMode pg_type_aclmask(Oid type_oid, Oid roleid, - AclMode mask, AclMaskHow how); +static AclMode pg_namespace_aclmask_ext(Oid nsp_oid, Oid roleid, + AclMode mask, AclMaskHow how, + bool *is_missing); +static AclMode pg_type_aclmask_ext(Oid type_oid, Oid roleid, + AclMode mask, AclMaskHow how, + bool *is_missing); static void recordExtensionInitPriv(Oid objoid, Oid classoid, int objsubid, Acl *new_acl); static void recordExtensionInitPrivWorker(Oid objoid, Oid classoid, int objsubid, @@ -1438,7 +1448,19 @@ SetDefaultACL(InternalDefaultACL *iacls) /* * RemoveRoleFromObjectACL * - * Used by shdepDropOwned to remove mentions of a role in ACLs + * Used by shdepDropOwned to remove mentions of a role in ACLs. + * + * Notice that this doesn't accept an objsubid parameter, which is a bit bogus + * since the pg_shdepend record that caused us to call it certainly had one. + * If, for example, pg_shdepend records the existence of a permission on + * mytable.mycol, this function will effectively issue a REVOKE ALL ON TABLE + * mytable. That gets the job done because (per SQL spec) such a REVOKE also + * revokes per-column permissions. We could not recreate a situation where + * the role has table-level but not column-level permissions; but it's okay + * (for now anyway) because this is only used when we're dropping the role + * and so all its permissions everywhere must go away. At worst it's a bit + * inefficient if the role has column permissions on several columns of the + * same table. */ void RemoveRoleFromObjectACL(Oid roleid, Oid classid, Oid objid) @@ -1827,7 +1849,7 @@ ExecGrant_Relation(InternalGrant *istmt) HeapTuple tuple; ListCell *cell_colprivs; - tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relOid)); + tuple = SearchSysCacheLocked1(RELOID, ObjectIdGetDatum(relOid)); if (!HeapTupleIsValid(tuple)) elog(ERROR, "cache lookup failed for relation %u", relOid); pg_class_tuple = (Form_pg_class) GETSTRUCT(tuple); @@ -2039,6 +2061,7 @@ ExecGrant_Relation(InternalGrant *istmt) values, nulls, replaces); CatalogTupleUpdate(relation, &newtuple->t_self, newtuple); + UnlockTuple(relation, &tuple->t_self, InplaceUpdateTupleLock); /* Update initial privileges for extensions */ recordExtensionInitPriv(relOid, RelationRelationId, 0, new_acl); @@ -2051,6 +2074,8 @@ ExecGrant_Relation(InternalGrant *istmt) pfree(new_acl); } + else + UnlockTuple(relation, &tuple->t_self, InplaceUpdateTupleLock); /* * Handle column-level privileges, if any were specified or implied. @@ -2164,7 +2189,7 @@ ExecGrant_common(InternalGrant *istmt, Oid classid, AclMode default_privs, Oid *oldmembers; Oid *newmembers; - tuple = SearchSysCache1(cacheid, ObjectIdGetDatum(objectid)); + tuple = SearchSysCacheLocked1(cacheid, ObjectIdGetDatum(objectid)); if (!HeapTupleIsValid(tuple)) elog(ERROR, "cache lookup failed for %s %u", get_object_class_descr(classid), objectid); @@ -2240,6 +2265,7 @@ ExecGrant_common(InternalGrant *istmt, Oid classid, AclMode default_privs, nulls, replaces); CatalogTupleUpdate(relation, &newtuple->t_self, newtuple); + UnlockTuple(relation, &tuple->t_self, InplaceUpdateTupleLock); /* Update initial privileges for extensions */ recordExtensionInitPriv(objectid, classid, 0, new_acl); @@ -2421,11 +2447,17 @@ ExecGrant_Type_check(InternalGrant *istmt, HeapTuple tuple) pg_type_tuple = (Form_pg_type) GETSTRUCT(tuple); + /* Disallow GRANT on dependent types */ if (IsTrueArrayType(pg_type_tuple)) ereport(ERROR, (errcode(ERRCODE_INVALID_GRANT_OPERATION), errmsg("cannot set privileges of array types"), errhint("Set the privileges of the element type instead."))); + if (pg_type_tuple->typtype == TYPTYPE_MULTIRANGE) + ereport(ERROR, + (errcode(ERRCODE_INVALID_GRANT_OPERATION), + errmsg("cannot set privileges of multirange types"), + errhint("Set the privileges of the range type instead."))); /* Used GRANT DOMAIN on a non-domain? */ if (istmt->objtype == OBJECT_DOMAIN && @@ -3068,6 +3100,18 @@ pg_aclmask(ObjectType objtype, Oid object_oid, AttrNumber attnum, Oid roleid, static AclMode object_aclmask(Oid classid, Oid objectid, Oid roleid, AclMode mask, AclMaskHow how) +{ + return object_aclmask_ext(classid, objectid, roleid, mask, how, NULL); +} + +/* + * Generic routine for examining a user's privileges for an object, + * with is_missing + */ +static AclMode +object_aclmask_ext(Oid classid, Oid objectid, Oid roleid, + AclMode mask, AclMaskHow how, + bool *is_missing) { int cacheid; AclMode result; @@ -3081,9 +3125,11 @@ object_aclmask(Oid classid, Oid objectid, Oid roleid, switch (classid) { case NamespaceRelationId: - return pg_namespace_aclmask(objectid, roleid, mask, how); + return pg_namespace_aclmask_ext(objectid, roleid, mask, how, + is_missing); case TypeRelationId: - return pg_type_aclmask(objectid, roleid, mask, how); + return pg_type_aclmask_ext(objectid, roleid, mask, how, + is_missing); } /* Even more special cases */ @@ -3096,16 +3142,26 @@ object_aclmask(Oid classid, Oid objectid, Oid roleid, return mask; /* - * Get the objects's ACL from its catalog + * Get the object's ACL from its catalog */ cacheid = get_object_catcache_oid(classid); tuple = SearchSysCache1(cacheid, ObjectIdGetDatum(objectid)); if (!HeapTupleIsValid(tuple)) - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_DATABASE), - errmsg("%s with OID %u does not exist", get_object_class_descr(classid), objectid))); + { + if (is_missing != NULL) + { + /* return "no privileges" instead of throwing an error */ + *is_missing = true; + return 0; + } + else + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("%s with OID %u does not exist", + get_object_class_descr(classid), objectid))); + } ownerId = DatumGetObjectId(SysCacheGetAttrNotNull(cacheid, tuple, @@ -3153,10 +3209,7 @@ pg_attribute_aclmask(Oid table_oid, AttrNumber attnum, Oid roleid, } /* - * Routine for examining a user's privileges for a column - * - * Does the bulk of the work for pg_attribute_aclmask(), and allows other - * callers to avoid the missing attribute ERROR when is_missing is non-NULL. + * Routine for examining a user's privileges for a column, with is_missing */ static AclMode pg_attribute_aclmask_ext(Oid table_oid, AttrNumber attnum, Oid roleid, @@ -3230,15 +3283,24 @@ pg_attribute_aclmask_ext(Oid table_oid, AttrNumber attnum, Oid roleid, * Must get the relation's ownerId from pg_class. Since we already found * a pg_attribute entry, the only likely reason for this to fail is that a * concurrent DROP of the relation committed since then (which could only - * happen if we don't have lock on the relation). We prefer to report "no - * privileges" rather than failing in such a case, so as to avoid unwanted - * failures in has_column_privilege() tests. + * happen if we don't have lock on the relation). Treat that similarly to + * not finding the attribute entry. */ classTuple = SearchSysCache1(RELOID, ObjectIdGetDatum(table_oid)); if (!HeapTupleIsValid(classTuple)) { ReleaseSysCache(attTuple); - return 0; + if (is_missing != NULL) + { + /* return "no privileges" instead of throwing an error */ + *is_missing = true; + return 0; + } + else + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_TABLE), + errmsg("relation with OID %u does not exist", + table_oid))); } classForm = (Form_pg_class) GETSTRUCT(classTuple); @@ -3271,10 +3333,7 @@ pg_class_aclmask(Oid table_oid, Oid roleid, } /* - * Routine for examining a user's privileges for a table - * - * Does the bulk of the work for pg_class_aclmask(), and allows other - * callers to avoid the missing relation ERROR when is_missing is non-NULL. + * Routine for examining a user's privileges for a table, with is_missing */ static AclMode pg_class_aclmask_ext(Oid table_oid, Oid roleid, AclMode mask, @@ -3600,11 +3659,12 @@ pg_largeobject_aclmask_snapshot(Oid lobj_oid, Oid roleid, } /* - * Routine for examining a user's privileges for a namespace + * Routine for examining a user's privileges for a namespace, with is_missing */ static AclMode -pg_namespace_aclmask(Oid nsp_oid, Oid roleid, - AclMode mask, AclMaskHow how) +pg_namespace_aclmask_ext(Oid nsp_oid, Oid roleid, + AclMode mask, AclMaskHow how, + bool *is_missing) { AclMode result; HeapTuple tuple; @@ -3638,8 +3698,8 @@ pg_namespace_aclmask(Oid nsp_oid, Oid roleid, */ if (isTempNamespace(nsp_oid)) { - if (object_aclcheck(DatabaseRelationId, MyDatabaseId, roleid, - ACL_CREATE_TEMP) == ACLCHECK_OK) + if (object_aclcheck_ext(DatabaseRelationId, MyDatabaseId, roleid, + ACL_CREATE_TEMP, is_missing) == ACLCHECK_OK) return mask & ACL_ALL_RIGHTS_SCHEMA; else return mask & ACL_USAGE; @@ -3650,9 +3710,18 @@ pg_namespace_aclmask(Oid nsp_oid, Oid roleid, */ tuple = SearchSysCache1(NAMESPACEOID, ObjectIdGetDatum(nsp_oid)); if (!HeapTupleIsValid(tuple)) - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_SCHEMA), - errmsg("schema with OID %u does not exist", nsp_oid))); + { + if (is_missing != NULL) + { + /* return "no privileges" instead of throwing an error */ + *is_missing = true; + return 0; + } + else + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_SCHEMA), + errmsg("schema with OID %u does not exist", nsp_oid))); + } ownerId = ((Form_pg_namespace) GETSTRUCT(tuple))->nspowner; @@ -3692,20 +3761,20 @@ pg_namespace_aclmask(Oid nsp_oid, Oid roleid, } /* - * Routine for examining a user's privileges for a type. + * Routine for examining a user's privileges for a type, with is_missing */ static AclMode -pg_type_aclmask(Oid type_oid, Oid roleid, AclMode mask, AclMaskHow how) +pg_type_aclmask_ext(Oid type_oid, Oid roleid, AclMode mask, AclMaskHow how, + bool *is_missing) { AclMode result; HeapTuple tuple; + Form_pg_type typeForm; Datum aclDatum; bool isNull; Acl *acl; Oid ownerId; - Form_pg_type typeForm; - /* Bypass permission checks for superusers */ if (superuser_arg(roleid)) return mask; @@ -3715,10 +3784,19 @@ pg_type_aclmask(Oid type_oid, Oid roleid, AclMode mask, AclMaskHow how) */ tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type_oid)); if (!HeapTupleIsValid(tuple)) - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("type with OID %u does not exist", - type_oid))); + { + if (is_missing != NULL) + { + /* return "no privileges" instead of throwing an error */ + *is_missing = true; + return 0; + } + else + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("type with OID %u does not exist", + type_oid))); + } typeForm = (Form_pg_type) GETSTRUCT(tuple); /* @@ -3732,9 +3810,49 @@ pg_type_aclmask(Oid type_oid, Oid roleid, AclMode mask, AclMaskHow how) ReleaseSysCache(tuple); tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(elttype_oid)); - /* this case is not a user-facing error, so elog not ereport */ if (!HeapTupleIsValid(tuple)) - elog(ERROR, "cache lookup failed for type %u", elttype_oid); + { + if (is_missing != NULL) + { + /* return "no privileges" instead of throwing an error */ + *is_missing = true; + return 0; + } + else + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("type with OID %u does not exist", + elttype_oid))); + } + typeForm = (Form_pg_type) GETSTRUCT(tuple); + } + + /* + * Likewise, multirange types don't manage their own permissions; consult + * the associated range type. (Note we must do this after the array step + * to get the right answer for arrays of multiranges.) + */ + if (typeForm->typtype == TYPTYPE_MULTIRANGE) + { + Oid rangetype = get_multirange_range(typeForm->oid); + + ReleaseSysCache(tuple); + + tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(rangetype)); + if (!HeapTupleIsValid(tuple)) + { + if (is_missing != NULL) + { + /* return "no privileges" instead of throwing an error */ + *is_missing = true; + return 0; + } + else + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("type with OID %u does not exist", + rangetype))); + } typeForm = (Form_pg_type) GETSTRUCT(tuple); } @@ -3774,7 +3892,20 @@ pg_type_aclmask(Oid type_oid, Oid roleid, AclMode mask, AclMaskHow how) AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode) { - if (object_aclmask(classid, objectid, roleid, mode, ACLMASK_ANY) != 0) + return object_aclcheck_ext(classid, objectid, roleid, mode, NULL); +} + +/* + * Exported generic routine for checking a user's access privileges to an + * object, with is_missing + */ +AclResult +object_aclcheck_ext(Oid classid, Oid objectid, + Oid roleid, AclMode mode, + bool *is_missing) +{ + if (object_aclmask_ext(classid, objectid, roleid, mode, ACLMASK_ANY, + is_missing) != 0) return ACLCHECK_OK; else return ACLCHECK_NO_PRIV; @@ -3799,10 +3930,8 @@ pg_attribute_aclcheck(Oid table_oid, AttrNumber attnum, /* - * Exported routine for checking a user's access privileges to a column - * - * Does the bulk of the work for pg_attribute_aclcheck(), and allows other - * callers to avoid the missing attribute ERROR when is_missing is non-NULL. + * Exported routine for checking a user's access privileges to a column, + * with is_missing */ AclResult pg_attribute_aclcheck_ext(Oid table_oid, AttrNumber attnum, @@ -3837,23 +3966,47 @@ pg_attribute_aclcheck_ext(Oid table_oid, AttrNumber attnum, AclResult pg_attribute_aclcheck_all(Oid table_oid, Oid roleid, AclMode mode, AclMaskHow how) +{ + return pg_attribute_aclcheck_all_ext(table_oid, roleid, mode, how, NULL); +} + +/* + * Exported routine for checking a user's access privileges to any/all columns, + * with is_missing + */ +AclResult +pg_attribute_aclcheck_all_ext(Oid table_oid, Oid roleid, + AclMode mode, AclMaskHow how, + bool *is_missing) { AclResult result; HeapTuple classTuple; Form_pg_class classForm; + Oid ownerId; AttrNumber nattrs; AttrNumber curr_att; /* - * Must fetch pg_class row to check number of attributes. As in - * pg_attribute_aclmask, we prefer to return "no privileges" instead of - * throwing an error if we get any unexpected lookup errors. + * Must fetch pg_class row to get owner ID and number of attributes. */ classTuple = SearchSysCache1(RELOID, ObjectIdGetDatum(table_oid)); if (!HeapTupleIsValid(classTuple)) - return ACLCHECK_NO_PRIV; + { + if (is_missing != NULL) + { + /* return "no privileges" instead of throwing an error */ + *is_missing = true; + return ACLCHECK_NO_PRIV; + } + else + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_TABLE), + errmsg("relation with OID %u does not exist", + table_oid))); + } classForm = (Form_pg_class) GETSTRUCT(classTuple); + ownerId = classForm->relowner; nattrs = classForm->relnatts; ReleaseSysCache(classTuple); @@ -3867,11 +4020,20 @@ pg_attribute_aclcheck_all(Oid table_oid, Oid roleid, AclMode mode, for (curr_att = 1; curr_att <= nattrs; curr_att++) { HeapTuple attTuple; + Datum aclDatum; + bool isNull; + Acl *acl; AclMode attmask; attTuple = SearchSysCache2(ATTNUM, ObjectIdGetDatum(table_oid), Int16GetDatum(curr_att)); + + /* + * Lookup failure probably indicates that the table was just dropped, + * but we'll treat it the same as a dropped column rather than + * throwing error. + */ if (!HeapTupleIsValid(attTuple)) continue; @@ -3882,16 +4044,27 @@ pg_attribute_aclcheck_all(Oid table_oid, Oid roleid, AclMode mode, continue; } + aclDatum = SysCacheGetAttr(ATTNUM, attTuple, Anum_pg_attribute_attacl, + &isNull); + /* * Here we hard-wire knowledge that the default ACL for a column * grants no privileges, so that we can fall out quickly in the very * common case where attacl is null. */ - if (heap_attisnull(attTuple, Anum_pg_attribute_attacl, NULL)) + if (isNull) attmask = 0; else - attmask = pg_attribute_aclmask(table_oid, curr_att, roleid, - mode, ACLMASK_ANY); + { + /* detoast column's ACL if necessary */ + acl = DatumGetAclP(aclDatum); + + attmask = aclmask(acl, roleid, ownerId, mode, ACLMASK_ANY); + + /* if we have a detoasted copy, free it */ + if ((Pointer) acl != DatumGetPointer(aclDatum)) + pfree(acl); + } ReleaseSysCache(attTuple); @@ -3926,10 +4099,8 @@ pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode) } /* - * Exported routine for checking a user's access privileges to a table - * - * Does the bulk of the work for pg_class_aclcheck(), and allows other - * callers to avoid the missing relation ERROR when is_missing is non-NULL. + * Exported routine for checking a user's access privileges to a table, + * with is_missing */ AclResult pg_class_aclcheck_ext(Oid table_oid, Oid roleid, @@ -3982,9 +4153,14 @@ object_ownercheck(Oid classid, Oid objectid, Oid roleid) if (superuser_arg(roleid)) return true; + /* For large objects, the catalog to consult is pg_largeobject_metadata */ + if (classid == LargeObjectRelationId) + classid = LargeObjectMetadataRelationId; + cacheid = get_object_catcache_oid(classid); if (cacheid != -1) { + /* we can get the object's tuple from the syscache */ HeapTuple tuple; tuple = SearchSysCache1(cacheid, ObjectIdGetDatum(objectid)); @@ -4001,7 +4177,6 @@ object_ownercheck(Oid classid, Oid objectid, Oid roleid) else { /* for catalogs without an appropriate syscache */ - Relation rel; ScanKeyData entry[1]; SysScanDesc scan; @@ -4321,9 +4496,9 @@ recordExtObjInitPriv(Oid objoid, Oid classoid) ReleaseSysCache(tuple); } - /* pg_largeobject_metadata */ - else if (classoid == LargeObjectMetadataRelationId) + else if (classoid == LargeObjectRelationId) { + /* For large objects, we must consult pg_largeobject_metadata */ Datum aclDatum; bool isNull; HeapTuple tuple; @@ -4366,17 +4541,18 @@ recordExtObjInitPriv(Oid objoid, Oid classoid) /* This will error on unsupported classoid. */ else if (get_object_attnum_acl(classoid) != InvalidAttrNumber) { + int cacheid; Datum aclDatum; bool isNull; HeapTuple tuple; - tuple = SearchSysCache1(get_object_catcache_oid(classoid), - ObjectIdGetDatum(objoid)); + cacheid = get_object_catcache_oid(classoid); + tuple = SearchSysCache1(cacheid, ObjectIdGetDatum(objoid)); if (!HeapTupleIsValid(tuple)) elog(ERROR, "cache lookup failed for %s %u", get_object_class_descr(classoid), objoid); - aclDatum = SysCacheGetAttr(get_object_catcache_oid(classoid), tuple, + aclDatum = SysCacheGetAttr(cacheid, tuple, get_object_attnum_acl(classoid), &isNull); @@ -4506,14 +4682,23 @@ recordExtensionInitPriv(Oid objoid, Oid classoid, int objsubid, Acl *new_acl) * EXTENSION ... ADD/DROP. */ static void -recordExtensionInitPrivWorker(Oid objoid, Oid classoid, int objsubid, Acl *new_acl) +recordExtensionInitPrivWorker(Oid objoid, Oid classoid, int objsubid, + Acl *new_acl) { Relation relation; ScanKeyData key[3]; SysScanDesc scan; HeapTuple tuple; HeapTuple oldtuple; + int noldmembers; + int nnewmembers; + Oid *oldmembers; + Oid *newmembers; + + /* We'll need the role membership of the new ACL. */ + nnewmembers = aclmembers(new_acl, &newmembers); + /* Search pg_init_privs for an existing entry. */ relation = table_open(InitPrivsRelationId, RowExclusiveLock); ScanKeyInit(&key[0], @@ -4541,9 +4726,23 @@ recordExtensionInitPrivWorker(Oid objoid, Oid classoid, int objsubid, Acl *new_a Datum values[Natts_pg_init_privs] = {0}; bool nulls[Natts_pg_init_privs] = {0}; bool replace[Natts_pg_init_privs] = {0}; + Datum oldAclDatum; + bool isNull; + Acl *old_acl; + + /* Update pg_shdepend for roles mentioned in the old/new ACLs. */ + oldAclDatum = heap_getattr(oldtuple, Anum_pg_init_privs_initprivs, + RelationGetDescr(relation), &isNull); + Assert(!isNull); + old_acl = DatumGetAclP(oldAclDatum); + noldmembers = aclmembers(old_acl, &oldmembers); + + updateInitAclDependencies(classoid, objoid, objsubid, + noldmembers, oldmembers, + nnewmembers, newmembers); /* If we have a new ACL to set, then update the row with it. */ - if (new_acl) + if (new_acl && ACL_NUM(new_acl) != 0) { values[Anum_pg_init_privs_initprivs - 1] = PointerGetDatum(new_acl); replace[Anum_pg_init_privs_initprivs - 1] = true; @@ -4555,7 +4754,7 @@ recordExtensionInitPrivWorker(Oid objoid, Oid classoid, int objsubid, Acl *new_a } else { - /* new_acl is NULL, so delete the entry we found. */ + /* new_acl is NULL/empty, so delete the entry we found. */ CatalogTupleDelete(relation, &oldtuple->t_self); } } @@ -4570,7 +4769,7 @@ recordExtensionInitPrivWorker(Oid objoid, Oid classoid, int objsubid, Acl *new_a * If we are passed in a NULL ACL and no entry exists, we can just * fall through and do nothing. */ - if (new_acl) + if (new_acl && ACL_NUM(new_acl) != 0) { /* No entry found, so add it. */ values[Anum_pg_init_privs_objoid - 1] = ObjectIdGetDatum(objoid); @@ -4586,6 +4785,14 @@ recordExtensionInitPrivWorker(Oid objoid, Oid classoid, int objsubid, Acl *new_a tuple = heap_form_tuple(RelationGetDescr(relation), values, nulls); CatalogTupleInsert(relation, tuple); + + /* Update pg_shdepend, too. */ + noldmembers = 0; + oldmembers = NULL; + + updateInitAclDependencies(classoid, objoid, objsubid, + noldmembers, oldmembers, + nnewmembers, newmembers); } } @@ -4596,3 +4803,247 @@ recordExtensionInitPrivWorker(Oid objoid, Oid classoid, int objsubid, Acl *new_a table_close(relation, RowExclusiveLock); } + +/* + * ReplaceRoleInInitPriv + * + * Used by shdepReassignOwned to replace mentions of a role in pg_init_privs. + */ +void +ReplaceRoleInInitPriv(Oid oldroleid, Oid newroleid, + Oid classid, Oid objid, int32 objsubid) +{ + Relation rel; + ScanKeyData key[3]; + SysScanDesc scan; + HeapTuple oldtuple; + Datum oldAclDatum; + bool isNull; + Acl *old_acl; + Acl *new_acl; + HeapTuple newtuple; + int noldmembers; + int nnewmembers; + Oid *oldmembers; + Oid *newmembers; + + /* Search for existing pg_init_privs entry for the target object. */ + rel = table_open(InitPrivsRelationId, RowExclusiveLock); + + ScanKeyInit(&key[0], + Anum_pg_init_privs_objoid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(objid)); + ScanKeyInit(&key[1], + Anum_pg_init_privs_classoid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(classid)); + ScanKeyInit(&key[2], + Anum_pg_init_privs_objsubid, + BTEqualStrategyNumber, F_INT4EQ, + Int32GetDatum(objsubid)); + + scan = systable_beginscan(rel, InitPrivsObjIndexId, true, + NULL, 3, key); + + /* There should exist only one entry or none. */ + oldtuple = systable_getnext(scan); + + if (!HeapTupleIsValid(oldtuple)) + { + /* + * Hmm, why are we here if there's no entry? But pack up and go away + * quietly. + */ + systable_endscan(scan); + table_close(rel, RowExclusiveLock); + return; + } + + /* Get a writable copy of the existing ACL. */ + oldAclDatum = heap_getattr(oldtuple, Anum_pg_init_privs_initprivs, + RelationGetDescr(rel), &isNull); + Assert(!isNull); + old_acl = DatumGetAclPCopy(oldAclDatum); + + /* + * Generate new ACL. This usage of aclnewowner is a bit off-label when + * oldroleid isn't the owner; but it does the job fine. + */ + new_acl = aclnewowner(old_acl, oldroleid, newroleid); + + /* + * If we end with an empty ACL, delete the pg_init_privs entry. (That + * probably can't happen here, but we may as well cover the case.) + */ + if (new_acl == NULL || ACL_NUM(new_acl) == 0) + { + CatalogTupleDelete(rel, &oldtuple->t_self); + } + else + { + Datum values[Natts_pg_init_privs] = {0}; + bool nulls[Natts_pg_init_privs] = {0}; + bool replaces[Natts_pg_init_privs] = {0}; + + /* Update existing entry. */ + values[Anum_pg_init_privs_initprivs - 1] = PointerGetDatum(new_acl); + replaces[Anum_pg_init_privs_initprivs - 1] = true; + + newtuple = heap_modify_tuple(oldtuple, RelationGetDescr(rel), + values, nulls, replaces); + CatalogTupleUpdate(rel, &newtuple->t_self, newtuple); + } + + /* + * Update the shared dependency ACL info. + */ + noldmembers = aclmembers(old_acl, &oldmembers); + nnewmembers = aclmembers(new_acl, &newmembers); + + updateInitAclDependencies(classid, objid, objsubid, + noldmembers, oldmembers, + nnewmembers, newmembers); + + systable_endscan(scan); + + /* prevent error when processing objects multiple times */ + CommandCounterIncrement(); + + table_close(rel, RowExclusiveLock); +} + +/* + * RemoveRoleFromInitPriv + * + * Used by shdepDropOwned to remove mentions of a role in pg_init_privs. + */ +void +RemoveRoleFromInitPriv(Oid roleid, Oid classid, Oid objid, int32 objsubid) +{ + Relation rel; + ScanKeyData key[3]; + SysScanDesc scan; + HeapTuple oldtuple; + int cacheid; + HeapTuple objtuple; + Oid ownerId; + Datum oldAclDatum; + bool isNull; + Acl *old_acl; + Acl *new_acl; + HeapTuple newtuple; + int noldmembers; + int nnewmembers; + Oid *oldmembers; + Oid *newmembers; + + /* Search for existing pg_init_privs entry for the target object. */ + rel = table_open(InitPrivsRelationId, RowExclusiveLock); + + ScanKeyInit(&key[0], + Anum_pg_init_privs_objoid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(objid)); + ScanKeyInit(&key[1], + Anum_pg_init_privs_classoid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(classid)); + ScanKeyInit(&key[2], + Anum_pg_init_privs_objsubid, + BTEqualStrategyNumber, F_INT4EQ, + Int32GetDatum(objsubid)); + + scan = systable_beginscan(rel, InitPrivsObjIndexId, true, + NULL, 3, key); + + /* There should exist only one entry or none. */ + oldtuple = systable_getnext(scan); + + if (!HeapTupleIsValid(oldtuple)) + { + /* + * Hmm, why are we here if there's no entry? But pack up and go away + * quietly. + */ + systable_endscan(scan); + table_close(rel, RowExclusiveLock); + return; + } + + /* Get a writable copy of the existing ACL. */ + oldAclDatum = heap_getattr(oldtuple, Anum_pg_init_privs_initprivs, + RelationGetDescr(rel), &isNull); + Assert(!isNull); + old_acl = DatumGetAclPCopy(oldAclDatum); + + /* + * We need the members of both old and new ACLs so we can correct the + * shared dependency information. Collect data before + * merge_acl_with_grant throws away old_acl. + */ + noldmembers = aclmembers(old_acl, &oldmembers); + + /* Must find out the owner's OID the hard way. */ + cacheid = get_object_catcache_oid(classid); + objtuple = SearchSysCache1(cacheid, ObjectIdGetDatum(objid)); + if (!HeapTupleIsValid(objtuple)) + elog(ERROR, "cache lookup failed for %s %u", + get_object_class_descr(classid), objid); + + ownerId = DatumGetObjectId(SysCacheGetAttrNotNull(cacheid, + objtuple, + get_object_attnum_owner(classid))); + ReleaseSysCache(objtuple); + + /* + * Generate new ACL. Grantor of rights is always the same as the owner. + */ + if (old_acl != NULL) + new_acl = merge_acl_with_grant(old_acl, + false, /* is_grant */ + false, /* grant_option */ + DROP_RESTRICT, + list_make1_oid(roleid), + ACLITEM_ALL_PRIV_BITS, + ownerId, + ownerId); + else + new_acl = NULL; /* this case shouldn't happen, probably */ + + /* If we end with an empty ACL, delete the pg_init_privs entry. */ + if (new_acl == NULL || ACL_NUM(new_acl) == 0) + { + CatalogTupleDelete(rel, &oldtuple->t_self); + } + else + { + Datum values[Natts_pg_init_privs] = {0}; + bool nulls[Natts_pg_init_privs] = {0}; + bool replaces[Natts_pg_init_privs] = {0}; + + /* Update existing entry. */ + values[Anum_pg_init_privs_initprivs - 1] = PointerGetDatum(new_acl); + replaces[Anum_pg_init_privs_initprivs - 1] = true; + + newtuple = heap_modify_tuple(oldtuple, RelationGetDescr(rel), + values, nulls, replaces); + CatalogTupleUpdate(rel, &newtuple->t_self, newtuple); + } + + /* + * Update the shared dependency ACL info. + */ + nnewmembers = aclmembers(new_acl, &newmembers); + + updateInitAclDependencies(classid, objid, objsubid, + noldmembers, oldmembers, + nnewmembers, newmembers); + + systable_endscan(scan); + + /* prevent error when processing objects multiple times */ + CommandCounterIncrement(); + + table_close(rel, RowExclusiveLock); +} diff --git a/src/backend/catalog/catalog.c b/src/backend/catalog/catalog.c index 1bf6c5633cd4e..8aefbcd6c74d8 100644 --- a/src/backend/catalog/catalog.c +++ b/src/backend/catalog/catalog.c @@ -5,7 +5,7 @@ * bits of hard-wired knowledge * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,7 +22,6 @@ #include "access/genam.h" #include "access/htup_details.h" -#include "access/sysattr.h" #include "access/table.h" #include "access/transam.h" #include "catalog/catalog.h" @@ -42,7 +41,6 @@ #include "catalog/pg_tablespace.h" #include "catalog/pg_type.h" #include "miscadmin.h" -#include "storage/fd.h" #include "utils/fmgroids.h" #include "utils/fmgrprotos.h" #include "utils/rel.h" @@ -137,6 +135,36 @@ IsCatalogRelationOid(Oid relid) return (relid < (Oid) FirstUnpinnedObjectId); } +/* + * IsInplaceUpdateRelation + * True iff core code performs inplace updates on the relation. + * + * This is used for assertions and for making the executor follow the + * locking protocol described at README.tuplock section "Locking to write + * inplace-updated tables". Extensions may inplace-update other heap + * tables, but concurrent SQL UPDATE on the same table may overwrite + * those modifications. + * + * The executor can assume these are not partitions or partitioned and + * have no triggers. + */ +bool +IsInplaceUpdateRelation(Relation relation) +{ + return IsInplaceUpdateOid(RelationGetRelid(relation)); +} + +/* + * IsInplaceUpdateOid + * Like the above, but takes an OID as argument. + */ +bool +IsInplaceUpdateOid(Oid relid) +{ + return (relid == RelationRelationId || + relid == DatabaseRelationId); +} + /* * IsToastRelation * True iff relation is a TOAST support relation (or index). @@ -504,7 +532,7 @@ GetNewRelFileNumber(Oid reltablespace, Relation pg_class, char relpersistence) RelFileLocatorBackend rlocator; char *rpath; bool collides; - BackendId backend; + ProcNumber procNumber; /* * If we ever get here during pg_upgrade, there's something wrong; all @@ -516,11 +544,11 @@ GetNewRelFileNumber(Oid reltablespace, Relation pg_class, char relpersistence) switch (relpersistence) { case RELPERSISTENCE_TEMP: - backend = BackendIdForTempRelations(); + procNumber = ProcNumberForTempRelations(); break; case RELPERSISTENCE_UNLOGGED: case RELPERSISTENCE_PERMANENT: - backend = InvalidBackendId; + procNumber = INVALID_PROC_NUMBER; break; default: elog(ERROR, "invalid relpersistence: %c", relpersistence); @@ -534,11 +562,11 @@ GetNewRelFileNumber(Oid reltablespace, Relation pg_class, char relpersistence) InvalidOid : MyDatabaseId; /* - * The relpath will vary based on the backend ID, so we must initialize - * that properly here to make sure that any collisions based on filename - * are properly detected. + * The relpath will vary based on the backend number, so we must + * initialize that properly here to make sure that any collisions based on + * filename are properly detected. */ - rlocator.backend = backend; + rlocator.backend = procNumber; do { diff --git a/src/backend/catalog/dependency.c b/src/backend/catalog/dependency.c index f8a136ba0a102..0489cbabcb8a9 100644 --- a/src/backend/catalog/dependency.c +++ b/src/backend/catalog/dependency.c @@ -4,7 +4,7 @@ * Routines to support inter-object dependencies. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -76,13 +76,12 @@ #include "commands/trigger.h" #include "commands/typecmds.h" #include "funcapi.h" +#include "miscadmin.h" #include "nodes/nodeFuncs.h" #include "parser/parsetree.h" #include "rewrite/rewriteRemove.h" #include "storage/lmgr.h" -#include "utils/acl.h" #include "utils/fmgroids.h" -#include "utils/guc.h" #include "utils/lsyscache.h" #include "utils/syscache.h" @@ -143,60 +142,6 @@ typedef struct List *rtables; /* list of rangetables to resolve Vars */ } find_expr_references_context; -/* - * This constant table maps ObjectClasses to the corresponding catalog OIDs. - * See also getObjectClass(). - */ -static const Oid object_classes[] = { - RelationRelationId, /* OCLASS_CLASS */ - ProcedureRelationId, /* OCLASS_PROC */ - TypeRelationId, /* OCLASS_TYPE */ - CastRelationId, /* OCLASS_CAST */ - CollationRelationId, /* OCLASS_COLLATION */ - ConstraintRelationId, /* OCLASS_CONSTRAINT */ - ConversionRelationId, /* OCLASS_CONVERSION */ - AttrDefaultRelationId, /* OCLASS_DEFAULT */ - LanguageRelationId, /* OCLASS_LANGUAGE */ - LargeObjectRelationId, /* OCLASS_LARGEOBJECT */ - OperatorRelationId, /* OCLASS_OPERATOR */ - OperatorClassRelationId, /* OCLASS_OPCLASS */ - OperatorFamilyRelationId, /* OCLASS_OPFAMILY */ - AccessMethodRelationId, /* OCLASS_AM */ - AccessMethodOperatorRelationId, /* OCLASS_AMOP */ - AccessMethodProcedureRelationId, /* OCLASS_AMPROC */ - RewriteRelationId, /* OCLASS_REWRITE */ - TriggerRelationId, /* OCLASS_TRIGGER */ - NamespaceRelationId, /* OCLASS_SCHEMA */ - StatisticExtRelationId, /* OCLASS_STATISTIC_EXT */ - TSParserRelationId, /* OCLASS_TSPARSER */ - TSDictionaryRelationId, /* OCLASS_TSDICT */ - TSTemplateRelationId, /* OCLASS_TSTEMPLATE */ - TSConfigRelationId, /* OCLASS_TSCONFIG */ - AuthIdRelationId, /* OCLASS_ROLE */ - AuthMemRelationId, /* OCLASS_ROLE_MEMBERSHIP */ - DatabaseRelationId, /* OCLASS_DATABASE */ - TableSpaceRelationId, /* OCLASS_TBLSPACE */ - ForeignDataWrapperRelationId, /* OCLASS_FDW */ - ForeignServerRelationId, /* OCLASS_FOREIGN_SERVER */ - UserMappingRelationId, /* OCLASS_USER_MAPPING */ - DefaultAclRelationId, /* OCLASS_DEFACL */ - ExtensionRelationId, /* OCLASS_EXTENSION */ - EventTriggerRelationId, /* OCLASS_EVENT_TRIGGER */ - ParameterAclRelationId, /* OCLASS_PARAMETER_ACL */ - PolicyRelationId, /* OCLASS_POLICY */ - PublicationNamespaceRelationId, /* OCLASS_PUBLICATION_NAMESPACE */ - PublicationRelationId, /* OCLASS_PUBLICATION */ - PublicationRelRelationId, /* OCLASS_PUBLICATION_REL */ - SubscriptionRelationId, /* OCLASS_SUBSCRIPTION */ - TransformRelationId /* OCLASS_TRANSFORM */ -}; - -/* - * Make sure object_classes is kept up to date with the ObjectClass enum. - */ -StaticAssertDecl(lengthof(object_classes) == LAST_OCLASS + 1, - "object_classes[] must cover all ObjectClasses"); - static void findDependentObjects(const ObjectAddress *object, int objflags, @@ -218,7 +163,7 @@ static void process_function_rte_ref(RangeTblEntry *rte, AttrNumber attnum, find_expr_references_context *context); static void eliminate_duplicate_dependencies(ObjectAddresses *addrs); static int object_address_comparator(const void *a, const void *b); -static void add_object_address(ObjectClass oclass, Oid objectId, int32 subId, +static void add_object_address(Oid classId, Oid objectId, int32 subId, ObjectAddresses *addrs); static void add_exact_object_address_extra(const ObjectAddress *object, const ObjectAddressExtra *extra, @@ -261,7 +206,7 @@ deleteObjectsInList(ObjectAddresses *targetObjects, Relation *depRel, if (extra->flags & DEPFLAG_REVERSE) normal = true; - if (EventTriggerSupportsObjectClass(getObjectClass(thisobj))) + if (EventTriggerSupportsObject(thisobj)) { EventTriggerSQLDropAddObject(thisobj, original, normal); } @@ -524,6 +469,12 @@ findDependentObjects(const ObjectAddress *object, if (stack_address_present_add_flags(object, objflags, stack)) return; + /* + * since this function recurses, it could be driven to stack overflow, + * because of the deep dependency tree, not only due to dependency loops. + */ + check_stack_depth(); + /* * It's also possible that the target object has already been completely * processed and put into targetObjects. If so, again we just add the @@ -1375,7 +1326,9 @@ deleteOneObject(const ObjectAddress *object, Relation *depRel, int flags) /* * Delete any comments, security labels, or initial privileges associated * with this object. (This is a convenient place to do these things, - * rather than having every object type know to do it.) + * rather than having every object type know to do it.) As above, all + * these functions must remove records for sub-objects too if the subid is + * zero. */ DeleteComments(object->objectId, object->classId, object->objectSubId); DeleteSecurityLabel(object); @@ -1398,9 +1351,9 @@ deleteOneObject(const ObjectAddress *object, Relation *depRel, int flags) static void doDeletion(const ObjectAddress *object, int flags) { - switch (getObjectClass(object)) + switch (object->classId) { - case OCLASS_CLASS: + case RelationRelationId: { char relKind = get_rel_relkind(object->objectId); @@ -1431,104 +1384,102 @@ doDeletion(const ObjectAddress *object, int flags) break; } - case OCLASS_PROC: + case ProcedureRelationId: RemoveFunctionById(object->objectId); break; - case OCLASS_TYPE: + case TypeRelationId: RemoveTypeById(object->objectId); break; - case OCLASS_CONSTRAINT: + case ConstraintRelationId: RemoveConstraintById(object->objectId); break; - case OCLASS_DEFAULT: + case AttrDefaultRelationId: RemoveAttrDefaultById(object->objectId); break; - case OCLASS_LARGEOBJECT: + case LargeObjectRelationId: LargeObjectDrop(object->objectId); break; - case OCLASS_OPERATOR: + case OperatorRelationId: RemoveOperatorById(object->objectId); break; - case OCLASS_REWRITE: + case RewriteRelationId: RemoveRewriteRuleById(object->objectId); break; - case OCLASS_TRIGGER: + case TriggerRelationId: RemoveTriggerById(object->objectId); break; - case OCLASS_STATISTIC_EXT: + case StatisticExtRelationId: RemoveStatisticsById(object->objectId); break; - case OCLASS_TSCONFIG: + case TSConfigRelationId: RemoveTSConfigurationById(object->objectId); break; - case OCLASS_EXTENSION: + case ExtensionRelationId: RemoveExtensionById(object->objectId); break; - case OCLASS_POLICY: + case PolicyRelationId: RemovePolicyById(object->objectId); break; - case OCLASS_PUBLICATION_NAMESPACE: + case PublicationNamespaceRelationId: RemovePublicationSchemaById(object->objectId); break; - case OCLASS_PUBLICATION_REL: + case PublicationRelRelationId: RemovePublicationRelById(object->objectId); break; - case OCLASS_PUBLICATION: + case PublicationRelationId: RemovePublicationById(object->objectId); break; - case OCLASS_CAST: - case OCLASS_COLLATION: - case OCLASS_CONVERSION: - case OCLASS_LANGUAGE: - case OCLASS_OPCLASS: - case OCLASS_OPFAMILY: - case OCLASS_AM: - case OCLASS_AMOP: - case OCLASS_AMPROC: - case OCLASS_SCHEMA: - case OCLASS_TSPARSER: - case OCLASS_TSDICT: - case OCLASS_TSTEMPLATE: - case OCLASS_FDW: - case OCLASS_FOREIGN_SERVER: - case OCLASS_USER_MAPPING: - case OCLASS_DEFACL: - case OCLASS_EVENT_TRIGGER: - case OCLASS_TRANSFORM: - case OCLASS_ROLE_MEMBERSHIP: + case CastRelationId: + case CollationRelationId: + case ConversionRelationId: + case LanguageRelationId: + case OperatorClassRelationId: + case OperatorFamilyRelationId: + case AccessMethodRelationId: + case AccessMethodOperatorRelationId: + case AccessMethodProcedureRelationId: + case NamespaceRelationId: + case TSParserRelationId: + case TSDictionaryRelationId: + case TSTemplateRelationId: + case ForeignDataWrapperRelationId: + case ForeignServerRelationId: + case UserMappingRelationId: + case DefaultAclRelationId: + case EventTriggerRelationId: + case TransformRelationId: + case AuthMemRelationId: DropObjectById(object); break; /* * These global object types are not supported here. */ - case OCLASS_ROLE: - case OCLASS_DATABASE: - case OCLASS_TBLSPACE: - case OCLASS_SUBSCRIPTION: - case OCLASS_PARAMETER_ACL: + case AuthIdRelationId: + case DatabaseRelationId: + case TableSpaceRelationId: + case SubscriptionRelationId: + case ParameterAclRelationId: elog(ERROR, "global objects cannot be deleted by doDeletion"); break; - /* - * There's intentionally no default: case here; we want the - * compiler to warn if a new OCLASS hasn't been handled above. - */ + default: + elog(ERROR, "unsupported object class: %u", object->classId); } } @@ -1779,7 +1730,7 @@ find_expr_references_walker(Node *node, if (rte->rtekind == RTE_RELATION) { /* If it's a plain relation, reference this column */ - add_object_address(OCLASS_CLASS, rte->relid, var->varattno, + add_object_address(RelationRelationId, rte->relid, var->varattno, context->addrs); } else if (rte->rtekind == RTE_FUNCTION) @@ -1805,7 +1756,7 @@ find_expr_references_walker(Node *node, Oid objoid; /* A constant must depend on the constant's datatype */ - add_object_address(OCLASS_TYPE, con->consttype, 0, + add_object_address(TypeRelationId, con->consttype, 0, context->addrs); /* @@ -1816,7 +1767,7 @@ find_expr_references_walker(Node *node, */ if (OidIsValid(con->constcollid) && con->constcollid != DEFAULT_COLLATION_OID) - add_object_address(OCLASS_COLLATION, con->constcollid, 0, + add_object_address(CollationRelationId, con->constcollid, 0, context->addrs); /* @@ -1834,7 +1785,7 @@ find_expr_references_walker(Node *node, objoid = DatumGetObjectId(con->constvalue); if (SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(objoid))) - add_object_address(OCLASS_PROC, objoid, 0, + add_object_address(ProcedureRelationId, objoid, 0, context->addrs); break; case REGOPEROID: @@ -1842,42 +1793,42 @@ find_expr_references_walker(Node *node, objoid = DatumGetObjectId(con->constvalue); if (SearchSysCacheExists1(OPEROID, ObjectIdGetDatum(objoid))) - add_object_address(OCLASS_OPERATOR, objoid, 0, + add_object_address(OperatorRelationId, objoid, 0, context->addrs); break; case REGCLASSOID: objoid = DatumGetObjectId(con->constvalue); if (SearchSysCacheExists1(RELOID, ObjectIdGetDatum(objoid))) - add_object_address(OCLASS_CLASS, objoid, 0, + add_object_address(RelationRelationId, objoid, 0, context->addrs); break; case REGTYPEOID: objoid = DatumGetObjectId(con->constvalue); if (SearchSysCacheExists1(TYPEOID, ObjectIdGetDatum(objoid))) - add_object_address(OCLASS_TYPE, objoid, 0, + add_object_address(TypeRelationId, objoid, 0, context->addrs); break; case REGCOLLATIONOID: objoid = DatumGetObjectId(con->constvalue); if (SearchSysCacheExists1(COLLOID, ObjectIdGetDatum(objoid))) - add_object_address(OCLASS_COLLATION, objoid, 0, + add_object_address(CollationRelationId, objoid, 0, context->addrs); break; case REGCONFIGOID: objoid = DatumGetObjectId(con->constvalue); if (SearchSysCacheExists1(TSCONFIGOID, ObjectIdGetDatum(objoid))) - add_object_address(OCLASS_TSCONFIG, objoid, 0, + add_object_address(TSConfigRelationId, objoid, 0, context->addrs); break; case REGDICTIONARYOID: objoid = DatumGetObjectId(con->constvalue); if (SearchSysCacheExists1(TSDICTOID, ObjectIdGetDatum(objoid))) - add_object_address(OCLASS_TSDICT, objoid, 0, + add_object_address(TSDictionaryRelationId, objoid, 0, context->addrs); break; @@ -1885,7 +1836,7 @@ find_expr_references_walker(Node *node, objoid = DatumGetObjectId(con->constvalue); if (SearchSysCacheExists1(NAMESPACEOID, ObjectIdGetDatum(objoid))) - add_object_address(OCLASS_SCHEMA, objoid, 0, + add_object_address(NamespaceRelationId, objoid, 0, context->addrs); break; @@ -1908,19 +1859,19 @@ find_expr_references_walker(Node *node, Param *param = (Param *) node; /* A parameter must depend on the parameter's datatype */ - add_object_address(OCLASS_TYPE, param->paramtype, 0, + add_object_address(TypeRelationId, param->paramtype, 0, context->addrs); /* and its collation, just as for Consts */ if (OidIsValid(param->paramcollid) && param->paramcollid != DEFAULT_COLLATION_OID) - add_object_address(OCLASS_COLLATION, param->paramcollid, 0, + add_object_address(CollationRelationId, param->paramcollid, 0, context->addrs); } else if (IsA(node, FuncExpr)) { FuncExpr *funcexpr = (FuncExpr *) node; - add_object_address(OCLASS_PROC, funcexpr->funcid, 0, + add_object_address(ProcedureRelationId, funcexpr->funcid, 0, context->addrs); /* fall through to examine arguments */ } @@ -1928,7 +1879,7 @@ find_expr_references_walker(Node *node, { OpExpr *opexpr = (OpExpr *) node; - add_object_address(OCLASS_OPERATOR, opexpr->opno, 0, + add_object_address(OperatorRelationId, opexpr->opno, 0, context->addrs); /* fall through to examine arguments */ } @@ -1936,7 +1887,7 @@ find_expr_references_walker(Node *node, { DistinctExpr *distinctexpr = (DistinctExpr *) node; - add_object_address(OCLASS_OPERATOR, distinctexpr->opno, 0, + add_object_address(OperatorRelationId, distinctexpr->opno, 0, context->addrs); /* fall through to examine arguments */ } @@ -1944,7 +1895,7 @@ find_expr_references_walker(Node *node, { NullIfExpr *nullifexpr = (NullIfExpr *) node; - add_object_address(OCLASS_OPERATOR, nullifexpr->opno, 0, + add_object_address(OperatorRelationId, nullifexpr->opno, 0, context->addrs); /* fall through to examine arguments */ } @@ -1952,7 +1903,7 @@ find_expr_references_walker(Node *node, { ScalarArrayOpExpr *opexpr = (ScalarArrayOpExpr *) node; - add_object_address(OCLASS_OPERATOR, opexpr->opno, 0, + add_object_address(OperatorRelationId, opexpr->opno, 0, context->addrs); /* fall through to examine arguments */ } @@ -1960,7 +1911,7 @@ find_expr_references_walker(Node *node, { Aggref *aggref = (Aggref *) node; - add_object_address(OCLASS_PROC, aggref->aggfnoid, 0, + add_object_address(ProcedureRelationId, aggref->aggfnoid, 0, context->addrs); /* fall through to examine arguments */ } @@ -1968,7 +1919,7 @@ find_expr_references_walker(Node *node, { WindowFunc *wfunc = (WindowFunc *) node; - add_object_address(OCLASS_PROC, wfunc->winfnoid, 0, + add_object_address(ProcedureRelationId, wfunc->winfnoid, 0, context->addrs); /* fall through to examine arguments */ } @@ -1984,7 +1935,7 @@ find_expr_references_walker(Node *node, */ if (sbsref->refrestype != sbsref->refcontainertype && sbsref->refrestype != sbsref->refelemtype) - add_object_address(OCLASS_TYPE, sbsref->refrestype, 0, + add_object_address(TypeRelationId, sbsref->refrestype, 0, context->addrs); /* fall through to examine arguments */ } @@ -2009,15 +1960,15 @@ find_expr_references_walker(Node *node, * anywhere else in the expression. */ if (OidIsValid(reltype)) - add_object_address(OCLASS_CLASS, reltype, fselect->fieldnum, + add_object_address(RelationRelationId, reltype, fselect->fieldnum, context->addrs); else - add_object_address(OCLASS_TYPE, fselect->resulttype, 0, + add_object_address(TypeRelationId, fselect->resulttype, 0, context->addrs); /* the collation might not be referenced anywhere else, either */ if (OidIsValid(fselect->resultcollid) && fselect->resultcollid != DEFAULT_COLLATION_OID) - add_object_address(OCLASS_COLLATION, fselect->resultcollid, 0, + add_object_address(CollationRelationId, fselect->resultcollid, 0, context->addrs); } else if (IsA(node, FieldStore)) @@ -2031,11 +1982,11 @@ find_expr_references_walker(Node *node, ListCell *l; foreach(l, fstore->fieldnums) - add_object_address(OCLASS_CLASS, reltype, lfirst_int(l), + add_object_address(RelationRelationId, reltype, lfirst_int(l), context->addrs); } else - add_object_address(OCLASS_TYPE, fstore->resulttype, 0, + add_object_address(TypeRelationId, fstore->resulttype, 0, context->addrs); } else if (IsA(node, RelabelType)) @@ -2043,12 +1994,12 @@ find_expr_references_walker(Node *node, RelabelType *relab = (RelabelType *) node; /* since there is no function dependency, need to depend on type */ - add_object_address(OCLASS_TYPE, relab->resulttype, 0, + add_object_address(TypeRelationId, relab->resulttype, 0, context->addrs); /* the collation might not be referenced anywhere else, either */ if (OidIsValid(relab->resultcollid) && relab->resultcollid != DEFAULT_COLLATION_OID) - add_object_address(OCLASS_COLLATION, relab->resultcollid, 0, + add_object_address(CollationRelationId, relab->resultcollid, 0, context->addrs); } else if (IsA(node, CoerceViaIO)) @@ -2056,12 +2007,12 @@ find_expr_references_walker(Node *node, CoerceViaIO *iocoerce = (CoerceViaIO *) node; /* since there is no exposed function, need to depend on type */ - add_object_address(OCLASS_TYPE, iocoerce->resulttype, 0, + add_object_address(TypeRelationId, iocoerce->resulttype, 0, context->addrs); /* the collation might not be referenced anywhere else, either */ if (OidIsValid(iocoerce->resultcollid) && iocoerce->resultcollid != DEFAULT_COLLATION_OID) - add_object_address(OCLASS_COLLATION, iocoerce->resultcollid, 0, + add_object_address(CollationRelationId, iocoerce->resultcollid, 0, context->addrs); } else if (IsA(node, ArrayCoerceExpr)) @@ -2069,12 +2020,12 @@ find_expr_references_walker(Node *node, ArrayCoerceExpr *acoerce = (ArrayCoerceExpr *) node; /* as above, depend on type */ - add_object_address(OCLASS_TYPE, acoerce->resulttype, 0, + add_object_address(TypeRelationId, acoerce->resulttype, 0, context->addrs); /* the collation might not be referenced anywhere else, either */ if (OidIsValid(acoerce->resultcollid) && acoerce->resultcollid != DEFAULT_COLLATION_OID) - add_object_address(OCLASS_COLLATION, acoerce->resultcollid, 0, + add_object_address(CollationRelationId, acoerce->resultcollid, 0, context->addrs); /* fall through to examine arguments */ } @@ -2083,21 +2034,21 @@ find_expr_references_walker(Node *node, ConvertRowtypeExpr *cvt = (ConvertRowtypeExpr *) node; /* since there is no function dependency, need to depend on type */ - add_object_address(OCLASS_TYPE, cvt->resulttype, 0, + add_object_address(TypeRelationId, cvt->resulttype, 0, context->addrs); } else if (IsA(node, CollateExpr)) { CollateExpr *coll = (CollateExpr *) node; - add_object_address(OCLASS_COLLATION, coll->collOid, 0, + add_object_address(CollationRelationId, coll->collOid, 0, context->addrs); } else if (IsA(node, RowExpr)) { RowExpr *rowexpr = (RowExpr *) node; - add_object_address(OCLASS_TYPE, rowexpr->row_typeid, 0, + add_object_address(TypeRelationId, rowexpr->row_typeid, 0, context->addrs); } else if (IsA(node, RowCompareExpr)) @@ -2107,12 +2058,12 @@ find_expr_references_walker(Node *node, foreach(l, rcexpr->opnos) { - add_object_address(OCLASS_OPERATOR, lfirst_oid(l), 0, + add_object_address(OperatorRelationId, lfirst_oid(l), 0, context->addrs); } foreach(l, rcexpr->opfamilies) { - add_object_address(OCLASS_OPFAMILY, lfirst_oid(l), 0, + add_object_address(OperatorFamilyRelationId, lfirst_oid(l), 0, context->addrs); } /* fall through to examine arguments */ @@ -2121,14 +2072,14 @@ find_expr_references_walker(Node *node, { CoerceToDomain *cd = (CoerceToDomain *) node; - add_object_address(OCLASS_TYPE, cd->resulttype, 0, + add_object_address(TypeRelationId, cd->resulttype, 0, context->addrs); } else if (IsA(node, NextValueExpr)) { NextValueExpr *nve = (NextValueExpr *) node; - add_object_address(OCLASS_CLASS, nve->seqid, 0, + add_object_address(RelationRelationId, nve->seqid, 0, context->addrs); } else if (IsA(node, OnConflictExpr)) @@ -2136,7 +2087,7 @@ find_expr_references_walker(Node *node, OnConflictExpr *onconflict = (OnConflictExpr *) node; if (OidIsValid(onconflict->constraint)) - add_object_address(OCLASS_CONSTRAINT, onconflict->constraint, 0, + add_object_address(ConstraintRelationId, onconflict->constraint, 0, context->addrs); /* fall through to examine arguments */ } @@ -2144,10 +2095,10 @@ find_expr_references_walker(Node *node, { SortGroupClause *sgc = (SortGroupClause *) node; - add_object_address(OCLASS_OPERATOR, sgc->eqop, 0, + add_object_address(OperatorRelationId, sgc->eqop, 0, context->addrs); if (OidIsValid(sgc->sortop)) - add_object_address(OCLASS_OPERATOR, sgc->sortop, 0, + add_object_address(OperatorRelationId, sgc->sortop, 0, context->addrs); return false; } @@ -2156,14 +2107,14 @@ find_expr_references_walker(Node *node, WindowClause *wc = (WindowClause *) node; if (OidIsValid(wc->startInRangeFunc)) - add_object_address(OCLASS_PROC, wc->startInRangeFunc, 0, + add_object_address(ProcedureRelationId, wc->startInRangeFunc, 0, context->addrs); if (OidIsValid(wc->endInRangeFunc)) - add_object_address(OCLASS_PROC, wc->endInRangeFunc, 0, + add_object_address(ProcedureRelationId, wc->endInRangeFunc, 0, context->addrs); if (OidIsValid(wc->inRangeColl) && wc->inRangeColl != DEFAULT_COLLATION_OID) - add_object_address(OCLASS_COLLATION, wc->inRangeColl, 0, + add_object_address(CollationRelationId, wc->inRangeColl, 0, context->addrs); /* fall through to examine substructure */ } @@ -2172,13 +2123,13 @@ find_expr_references_walker(Node *node, CTECycleClause *cc = (CTECycleClause *) node; if (OidIsValid(cc->cycle_mark_type)) - add_object_address(OCLASS_TYPE, cc->cycle_mark_type, 0, + add_object_address(TypeRelationId, cc->cycle_mark_type, 0, context->addrs); if (OidIsValid(cc->cycle_mark_collation)) - add_object_address(OCLASS_COLLATION, cc->cycle_mark_collation, 0, + add_object_address(CollationRelationId, cc->cycle_mark_collation, 0, context->addrs); if (OidIsValid(cc->cycle_mark_neop)) - add_object_address(OCLASS_OPERATOR, cc->cycle_mark_neop, 0, + add_object_address(OperatorRelationId, cc->cycle_mark_neop, 0, context->addrs); /* fall through to examine substructure */ } @@ -2212,7 +2163,7 @@ find_expr_references_walker(Node *node, switch (rte->rtekind) { case RTE_RELATION: - add_object_address(OCLASS_CLASS, rte->relid, 0, + add_object_address(RelationRelationId, rte->relid, 0, context->addrs); break; case RTE_JOIN: @@ -2270,7 +2221,7 @@ find_expr_references_walker(Node *node, if (tle->resjunk) continue; /* ignore junk tlist items */ - add_object_address(OCLASS_CLASS, rte->relid, tle->resno, + add_object_address(RelationRelationId, rte->relid, tle->resno, context->addrs); } } @@ -2281,7 +2232,7 @@ find_expr_references_walker(Node *node, */ foreach(lc, query->constraintDeps) { - add_object_address(OCLASS_CONSTRAINT, lfirst_oid(lc), 0, + add_object_address(ConstraintRelationId, lfirst_oid(lc), 0, context->addrs); } @@ -2315,7 +2266,7 @@ find_expr_references_walker(Node *node, */ foreach(ct, rtfunc->funccoltypes) { - add_object_address(OCLASS_TYPE, lfirst_oid(ct), 0, + add_object_address(TypeRelationId, lfirst_oid(ct), 0, context->addrs); } foreach(ct, rtfunc->funccolcollations) @@ -2323,7 +2274,7 @@ find_expr_references_walker(Node *node, Oid collid = lfirst_oid(ct); if (OidIsValid(collid) && collid != DEFAULT_COLLATION_OID) - add_object_address(OCLASS_COLLATION, collid, 0, + add_object_address(CollationRelationId, collid, 0, context->addrs); } } @@ -2337,7 +2288,7 @@ find_expr_references_walker(Node *node, */ foreach(ct, tf->coltypes) { - add_object_address(OCLASS_TYPE, lfirst_oid(ct), 0, + add_object_address(TypeRelationId, lfirst_oid(ct), 0, context->addrs); } foreach(ct, tf->colcollations) @@ -2345,7 +2296,7 @@ find_expr_references_walker(Node *node, Oid collid = lfirst_oid(ct); if (OidIsValid(collid) && collid != DEFAULT_COLLATION_OID) - add_object_address(OCLASS_COLLATION, collid, 0, + add_object_address(CollationRelationId, collid, 0, context->addrs); } } @@ -2353,7 +2304,7 @@ find_expr_references_walker(Node *node, { TableSampleClause *tsc = (TableSampleClause *) node; - add_object_address(OCLASS_PROC, tsc->tsmhandler, 0, + add_object_address(ProcedureRelationId, tsc->tsmhandler, 0, context->addrs); /* fall through to examine arguments */ } @@ -2388,7 +2339,11 @@ process_function_rte_ref(RangeTblEntry *rte, AttrNumber attnum, { TupleDesc tupdesc; - tupdesc = get_expr_result_tupdesc(rtfunc->funcexpr, true); + /* If it has a coldeflist, it certainly returns RECORD */ + if (rtfunc->funccolnames != NIL) + tupdesc = NULL; /* no need to work hard */ + else + tupdesc = get_expr_result_tupdesc(rtfunc->funcexpr, true); if (tupdesc && tupdesc->tdtypeid != RECORDOID) { /* @@ -2399,7 +2354,7 @@ process_function_rte_ref(RangeTblEntry *rte, AttrNumber attnum, Assert(attnum - atts_done <= tupdesc->natts); if (OidIsValid(reltype)) /* can this fail? */ - add_object_address(OCLASS_CLASS, reltype, + add_object_address(RelationRelationId, reltype, attnum - atts_done, context->addrs); return; @@ -2546,12 +2501,9 @@ new_object_addresses(void) /* * Add an entry to an ObjectAddresses array. - * - * It is convenient to specify the class by ObjectClass rather than directly - * by catalog OID. */ static void -add_object_address(ObjectClass oclass, Oid objectId, int32 subId, +add_object_address(Oid classId, Oid objectId, int32 subId, ObjectAddresses *addrs) { ObjectAddress *item; @@ -2566,7 +2518,7 @@ add_object_address(ObjectClass oclass, Oid objectId, int32 subId, } /* record this item */ item = addrs->refs + addrs->numrefs; - item->classId = object_classes[oclass]; + item->classId = classId; item->objectId = objectId; item->objectSubId = subId; addrs->numrefs++; @@ -2826,153 +2778,6 @@ free_object_addresses(ObjectAddresses *addrs) pfree(addrs); } -/* - * Determine the class of a given object identified by objectAddress. - * - * This function is essentially the reverse mapping for the object_classes[] - * table. We implement it as a function because the OIDs aren't consecutive. - */ -ObjectClass -getObjectClass(const ObjectAddress *object) -{ - /* only pg_class entries can have nonzero objectSubId */ - if (object->classId != RelationRelationId && - object->objectSubId != 0) - elog(ERROR, "invalid non-zero objectSubId for object class %u", - object->classId); - - switch (object->classId) - { - case RelationRelationId: - /* caller must check objectSubId */ - return OCLASS_CLASS; - - case ProcedureRelationId: - return OCLASS_PROC; - - case TypeRelationId: - return OCLASS_TYPE; - - case CastRelationId: - return OCLASS_CAST; - - case CollationRelationId: - return OCLASS_COLLATION; - - case ConstraintRelationId: - return OCLASS_CONSTRAINT; - - case ConversionRelationId: - return OCLASS_CONVERSION; - - case AttrDefaultRelationId: - return OCLASS_DEFAULT; - - case LanguageRelationId: - return OCLASS_LANGUAGE; - - case LargeObjectRelationId: - return OCLASS_LARGEOBJECT; - - case OperatorRelationId: - return OCLASS_OPERATOR; - - case OperatorClassRelationId: - return OCLASS_OPCLASS; - - case OperatorFamilyRelationId: - return OCLASS_OPFAMILY; - - case AccessMethodRelationId: - return OCLASS_AM; - - case AccessMethodOperatorRelationId: - return OCLASS_AMOP; - - case AccessMethodProcedureRelationId: - return OCLASS_AMPROC; - - case RewriteRelationId: - return OCLASS_REWRITE; - - case TriggerRelationId: - return OCLASS_TRIGGER; - - case NamespaceRelationId: - return OCLASS_SCHEMA; - - case StatisticExtRelationId: - return OCLASS_STATISTIC_EXT; - - case TSParserRelationId: - return OCLASS_TSPARSER; - - case TSDictionaryRelationId: - return OCLASS_TSDICT; - - case TSTemplateRelationId: - return OCLASS_TSTEMPLATE; - - case TSConfigRelationId: - return OCLASS_TSCONFIG; - - case AuthIdRelationId: - return OCLASS_ROLE; - - case AuthMemRelationId: - return OCLASS_ROLE_MEMBERSHIP; - - case DatabaseRelationId: - return OCLASS_DATABASE; - - case TableSpaceRelationId: - return OCLASS_TBLSPACE; - - case ForeignDataWrapperRelationId: - return OCLASS_FDW; - - case ForeignServerRelationId: - return OCLASS_FOREIGN_SERVER; - - case UserMappingRelationId: - return OCLASS_USER_MAPPING; - - case DefaultAclRelationId: - return OCLASS_DEFACL; - - case ExtensionRelationId: - return OCLASS_EXTENSION; - - case EventTriggerRelationId: - return OCLASS_EVENT_TRIGGER; - - case ParameterAclRelationId: - return OCLASS_PARAMETER_ACL; - - case PolicyRelationId: - return OCLASS_POLICY; - - case PublicationNamespaceRelationId: - return OCLASS_PUBLICATION_NAMESPACE; - - case PublicationRelationId: - return OCLASS_PUBLICATION; - - case PublicationRelRelationId: - return OCLASS_PUBLICATION_REL; - - case SubscriptionRelationId: - return OCLASS_SUBSCRIPTION; - - case TransformRelationId: - return OCLASS_TRANSFORM; - } - - /* shouldn't get here */ - elog(ERROR, "unrecognized object class: %u", object->classId); - return OCLASS_CLASS; /* keep compiler quiet */ -} - /* * delete initial ACL for extension objects */ @@ -2981,6 +2786,7 @@ DeleteInitPrivs(const ObjectAddress *object) { Relation relation; ScanKeyData key[3]; + int nkeys; SysScanDesc scan; HeapTuple oldtuple; @@ -2994,13 +2800,19 @@ DeleteInitPrivs(const ObjectAddress *object) Anum_pg_init_privs_classoid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(object->classId)); - ScanKeyInit(&key[2], - Anum_pg_init_privs_objsubid, - BTEqualStrategyNumber, F_INT4EQ, - Int32GetDatum(object->objectSubId)); + if (object->objectSubId != 0) + { + ScanKeyInit(&key[2], + Anum_pg_init_privs_objsubid, + BTEqualStrategyNumber, F_INT4EQ, + Int32GetDatum(object->objectSubId)); + nkeys = 3; + } + else + nkeys = 2; scan = systable_beginscan(relation, InitPrivsObjIndexId, true, - NULL, 3, key); + NULL, nkeys, key); while (HeapTupleIsValid(oldtuple = systable_getnext(scan))) CatalogTupleDelete(relation, &oldtuple->t_self); diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl index 4a7205472c165..94afdc5491dd8 100644 --- a/src/backend/catalog/genbki.pl +++ b/src/backend/catalog/genbki.pl @@ -6,7 +6,7 @@ # headers from specially formatted header files and data files. # postgres.bki is used to initialize the postgres template database. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/backend/catalog/genbki.pl @@ -14,7 +14,7 @@ #---------------------------------------------------------------------- use strict; -use warnings; +use warnings FATAL => 'all'; use Getopt::Long; use FindBin; @@ -56,6 +56,8 @@ my %catalog_data; my @toast_decls; my @index_decls; +my %syscaches; +my %syscache_catalogs; my %oidcounts; my @system_constraints; @@ -121,6 +123,9 @@ } } + # Lookup table to get index info by index name + my %indexes; + # If the header file contained toast or index info, build BKI # commands for those, which we'll output later. foreach my $toast (@{ $catalog->{toasting} }) @@ -134,24 +139,45 @@ } foreach my $index (@{ $catalog->{indexing} }) { + $indexes{ $index->{index_name} } = $index; + push @index_decls, - sprintf "declare %sindex %s %s %s\n", + sprintf "declare %sindex %s %s on %s using %s\n", $index->{is_unique} ? 'unique ' : '', $index->{index_name}, $index->{index_oid}, + $index->{table_name}, $index->{index_decl}; $oidcounts{ $index->{index_oid} }++; if ($index->{is_unique}) { - $index->{index_decl} =~ /on (\w+) using/; - my $tblname = $1; push @system_constraints, sprintf "ALTER TABLE %s ADD %s USING INDEX %s;", - $tblname, + $index->{table_name}, $index->{is_pkey} ? "PRIMARY KEY" : "UNIQUE", $index->{index_name}; } } + + # Analyze syscache info + foreach my $syscache (@{ $catalog->{syscaches} }) + { + my $index = $indexes{ $syscache->{index_name} }; + my $tblname = $index->{table_name}; + my $key = $index->{index_decl}; + $key =~ s/^\w+\(//; + $key =~ s/\)$//; + $key =~ s/(\w+)\s+\w+/Anum_${tblname}_$1/g; + + $syscaches{ $syscache->{syscache_name} } = { + table_oid_macro => $catalogs{$tblname}->{relation_oid_macro}, + index_oid_macro => $index->{index_oid_macro}, + key => $key, + nbuckets => $syscache->{syscache_nbuckets}, + }; + + $syscache_catalogs{$catname} = 1; + } } # Complain and exit if we found any duplicate OIDs. @@ -420,6 +446,12 @@ my $constraints_file = $output_path . 'system_constraints.sql'; open my $constraints, '>', $constraints_file . $tmpext or die "can't open $constraints_file$tmpext: $!"; +my $syscache_ids_file = $output_path . 'syscache_ids.h'; +open my $syscache_ids_fh, '>', $syscache_ids_file . $tmpext + or die "can't open $syscache_ids_file$tmpext: $!"; +my $syscache_info_file = $output_path . 'syscache_info.h'; +open my $syscache_info_fh, '>', $syscache_info_file . $tmpext + or die "can't open $syscache_info_file$tmpext: $!"; # Generate postgres.bki and pg_*_d.h headers. @@ -440,25 +472,9 @@ open my $def, '>', $def_file . $tmpext or die "can't open $def_file$tmpext: $!"; - # Opening boilerplate for pg_*_d.h - printf $def <{relation_oid}; - $row{attstattarget} = '0'; morph_row_for_pgattr(\%row, $schema, $attr, 1); print_bki_insert(\%row, $schema); @@ -1122,6 +1147,30 @@ sub assign_next_oid return $result; } +sub print_boilerplate +{ + my ($fh, $fname, $descr) = @_; + printf $fh <natts) { Form_pg_attribute attrs = TupleDescAttr(tupdesc, natts); + const FormExtraData_pg_attribute *attrs_extra = tupdesc_extra ? &tupdesc_extra[natts] : NULL; ExecClearTuple(slot[slotCount]); @@ -749,14 +756,24 @@ InsertPgAttributeTuples(Relation pg_attribute_rel, slot[slotCount]->tts_values[Anum_pg_attribute_attisdropped - 1] = BoolGetDatum(attrs->attisdropped); slot[slotCount]->tts_values[Anum_pg_attribute_attislocal - 1] = BoolGetDatum(attrs->attislocal); slot[slotCount]->tts_values[Anum_pg_attribute_attinhcount - 1] = Int16GetDatum(attrs->attinhcount); - slot[slotCount]->tts_values[Anum_pg_attribute_attstattarget - 1] = Int16GetDatum(attrs->attstattarget); slot[slotCount]->tts_values[Anum_pg_attribute_attcollation - 1] = ObjectIdGetDatum(attrs->attcollation); - if (attoptions && attoptions[natts] != (Datum) 0) - slot[slotCount]->tts_values[Anum_pg_attribute_attoptions - 1] = attoptions[natts]; + if (attrs_extra) + { + slot[slotCount]->tts_values[Anum_pg_attribute_attstattarget - 1] = attrs_extra->attstattarget.value; + slot[slotCount]->tts_isnull[Anum_pg_attribute_attstattarget - 1] = attrs_extra->attstattarget.isnull; + + slot[slotCount]->tts_values[Anum_pg_attribute_attoptions - 1] = attrs_extra->attoptions.value; + slot[slotCount]->tts_isnull[Anum_pg_attribute_attoptions - 1] = attrs_extra->attoptions.isnull; + } else + { + slot[slotCount]->tts_isnull[Anum_pg_attribute_attstattarget - 1] = true; slot[slotCount]->tts_isnull[Anum_pg_attribute_attoptions - 1] = true; + } - /* start out with empty permissions and empty options */ + /* + * The remaining fields are not set for new columns. + */ slot[slotCount]->tts_isnull[Anum_pg_attribute_attacl - 1] = true; slot[slotCount]->tts_isnull[Anum_pg_attribute_attfdwoptions - 1] = true; slot[slotCount]->tts_isnull[Anum_pg_attribute_attmissingval - 1] = true; @@ -818,9 +835,6 @@ AddNewAttributeTuples(Oid new_rel_oid, indstate = CatalogOpenIndexes(rel); - /* set stats detail level to a sane default */ - for (int i = 0; i < natts; i++) - tupdesc->attrs[i].attstattarget = -1; InsertPgAttributeTuples(rel, tupdesc, new_rel_oid, NULL, indstate); /* add dependencies on their datatypes and collations */ @@ -843,9 +857,9 @@ AddNewAttributeTuples(Oid new_rel_oid, } /* - * Next we add the system attributes. Skip OID if rel has no OIDs. Skip - * all for a view or type relation. We don't bother with making datatype - * dependencies here, since presumably all these types are pinned. + * Next we add the system attributes. Skip all for a view or type + * relation. We don't bother with making datatype dependencies here, + * since presumably all these types are pinned. */ if (relkind != RELKIND_VIEW && relkind != RELKIND_COMPOSITE_TYPE) { @@ -1236,6 +1250,13 @@ heap_create_with_catalog(const char *relname, relpersistence); } + /* + * Other sessions' catalog scans can't find this until we commit. Hence, + * it doesn't hurt to hold AccessExclusiveLock. Do it here so callers + * can't accidentally vary in their lock mode or acquisition timing. + */ + LockRelationOid(relid, AccessExclusiveLock); + /* * Determine the relation's initial permissions. */ @@ -1450,9 +1471,11 @@ heap_create_with_catalog(const char *relname, * access method is. * * No need to add an explicit dependency for the toast table, as the - * main table depends on it. + * main table depends on it. Partitioned tables may not have an + * access method set. */ - if (RELKIND_HAS_TABLE_AM(relkind) && relkind != RELKIND_TOASTVALUE) + if ((RELKIND_HAS_TABLE_AM(relkind) && relkind != RELKIND_TOASTVALUE) || + (relkind == RELKIND_PARTITIONED_TABLE && OidIsValid(accessmtd))) { ObjectAddressSet(referenced, AccessMethodRelationId, accessmtd); add_exact_object_address(&referenced, addrs); @@ -1647,6 +1670,9 @@ RemoveAttributeById(Oid relid, AttrNumber attnum) HeapTuple tuple; Form_pg_attribute attStruct; char newattname[NAMEDATALEN]; + Datum valuesAtt[Natts_pg_attribute] = {0}; + bool nullsAtt[Natts_pg_attribute] = {0}; + bool replacesAtt[Natts_pg_attribute] = {0}; /* * Grab an exclusive lock on the target table, which we will NOT release @@ -1666,67 +1692,54 @@ RemoveAttributeById(Oid relid, AttrNumber attnum) attnum, relid); attStruct = (Form_pg_attribute) GETSTRUCT(tuple); - if (attnum < 0) - { - /* System attribute (probably OID) ... just delete the row */ + /* Mark the attribute as dropped */ + attStruct->attisdropped = true; - CatalogTupleDelete(attr_rel, &tuple->t_self); - } - else - { - /* Dropping user attributes is lots harder */ - - /* Mark the attribute as dropped */ - attStruct->attisdropped = true; + /* + * Set the type OID to invalid. A dropped attribute's type link cannot be + * relied on (once the attribute is dropped, the type might be too). + * Fortunately we do not need the type row --- the only really essential + * information is the type's typlen and typalign, which are preserved in + * the attribute's attlen and attalign. We set atttypid to zero here as a + * means of catching code that incorrectly expects it to be valid. + */ + attStruct->atttypid = InvalidOid; - /* - * Set the type OID to invalid. A dropped attribute's type link - * cannot be relied on (once the attribute is dropped, the type might - * be too). Fortunately we do not need the type row --- the only - * really essential information is the type's typlen and typalign, - * which are preserved in the attribute's attlen and attalign. We set - * atttypid to zero here as a means of catching code that incorrectly - * expects it to be valid. - */ - attStruct->atttypid = InvalidOid; + /* Remove any not-null constraint the column may have */ + attStruct->attnotnull = false; - /* Remove any NOT NULL constraint the column may have */ - attStruct->attnotnull = false; + /* Unset this so no one tries to look up the generation expression */ + attStruct->attgenerated = '\0'; - /* We don't want to keep stats for it anymore */ - attStruct->attstattarget = 0; + /* + * Change the column name to something that isn't likely to conflict + */ + snprintf(newattname, sizeof(newattname), + "........pg.dropped.%d........", attnum); + namestrcpy(&(attStruct->attname), newattname); - /* Unset this so no one tries to look up the generation expression */ - attStruct->attgenerated = '\0'; + /* Clear the missing value */ + attStruct->atthasmissing = false; + nullsAtt[Anum_pg_attribute_attmissingval - 1] = true; + replacesAtt[Anum_pg_attribute_attmissingval - 1] = true; - /* - * Change the column name to something that isn't likely to conflict - */ - snprintf(newattname, sizeof(newattname), - "........pg.dropped.%d........", attnum); - namestrcpy(&(attStruct->attname), newattname); + /* + * Clear the other nullable fields. This saves some space in pg_attribute + * and removes no longer useful information. + */ + nullsAtt[Anum_pg_attribute_attstattarget - 1] = true; + replacesAtt[Anum_pg_attribute_attstattarget - 1] = true; + nullsAtt[Anum_pg_attribute_attacl - 1] = true; + replacesAtt[Anum_pg_attribute_attacl - 1] = true; + nullsAtt[Anum_pg_attribute_attoptions - 1] = true; + replacesAtt[Anum_pg_attribute_attoptions - 1] = true; + nullsAtt[Anum_pg_attribute_attfdwoptions - 1] = true; + replacesAtt[Anum_pg_attribute_attfdwoptions - 1] = true; - /* clear the missing value if any */ - if (attStruct->atthasmissing) - { - Datum valuesAtt[Natts_pg_attribute] = {0}; - bool nullsAtt[Natts_pg_attribute] = {0}; - bool replacesAtt[Natts_pg_attribute] = {0}; - - /* update the tuple - set atthasmissing and attmissingval */ - valuesAtt[Anum_pg_attribute_atthasmissing - 1] = - BoolGetDatum(false); - replacesAtt[Anum_pg_attribute_atthasmissing - 1] = true; - valuesAtt[Anum_pg_attribute_attmissingval - 1] = (Datum) 0; - nullsAtt[Anum_pg_attribute_attmissingval - 1] = true; - replacesAtt[Anum_pg_attribute_attmissingval - 1] = true; - - tuple = heap_modify_tuple(tuple, RelationGetDescr(attr_rel), - valuesAtt, nullsAtt, replacesAtt); - } + tuple = heap_modify_tuple(tuple, RelationGetDescr(attr_rel), + valuesAtt, nullsAtt, replacesAtt); - CatalogTupleUpdate(attr_rel, &tuple->t_self, tuple); - } + CatalogTupleUpdate(attr_rel, &tuple->t_self, tuple); /* * Because updating the pg_attribute row will trigger a relcache flush for @@ -1736,8 +1749,7 @@ RemoveAttributeById(Oid relid, AttrNumber attnum) table_close(attr_rel, RowExclusiveLock); - if (attnum > 0) - RemoveStatistics(relid, attnum); + RemoveStatistics(relid, attnum); relation_close(rel, NoLock); } @@ -1992,6 +2004,60 @@ RelationClearMissing(Relation rel) table_close(attr_rel, RowExclusiveLock); } +/* + * StoreAttrMissingVal + * + * Set the missing value of a single attribute. + */ +void +StoreAttrMissingVal(Relation rel, AttrNumber attnum, Datum missingval) +{ + Datum valuesAtt[Natts_pg_attribute] = {0}; + bool nullsAtt[Natts_pg_attribute] = {0}; + bool replacesAtt[Natts_pg_attribute] = {0}; + Relation attrrel; + Form_pg_attribute attStruct; + HeapTuple atttup, + newtup; + + /* This is only supported for plain tables */ + Assert(rel->rd_rel->relkind == RELKIND_RELATION); + + /* Fetch the pg_attribute row */ + attrrel = table_open(AttributeRelationId, RowExclusiveLock); + + atttup = SearchSysCache2(ATTNUM, + ObjectIdGetDatum(RelationGetRelid(rel)), + Int16GetDatum(attnum)); + if (!HeapTupleIsValid(atttup)) /* shouldn't happen */ + elog(ERROR, "cache lookup failed for attribute %d of relation %u", + attnum, RelationGetRelid(rel)); + attStruct = (Form_pg_attribute) GETSTRUCT(atttup); + + /* Make a one-element array containing the value */ + missingval = PointerGetDatum(construct_array(&missingval, + 1, + attStruct->atttypid, + attStruct->attlen, + attStruct->attbyval, + attStruct->attalign)); + + /* Update the pg_attribute row */ + valuesAtt[Anum_pg_attribute_atthasmissing - 1] = BoolGetDatum(true); + replacesAtt[Anum_pg_attribute_atthasmissing - 1] = true; + + valuesAtt[Anum_pg_attribute_attmissingval - 1] = missingval; + replacesAtt[Anum_pg_attribute_attmissingval - 1] = true; + + newtup = heap_modify_tuple(atttup, RelationGetDescr(attrrel), + valuesAtt, nullsAtt, replacesAtt); + CatalogTupleUpdate(attrrel, &newtup->t_self, newtup); + + /* clean up */ + ReleaseSysCache(atttup); + table_close(attrrel, RowExclusiveLock); +} + /* * SetAttrMissing * @@ -2228,6 +2294,8 @@ StoreConstraints(Relation rel, List *cooked_constraints, bool is_internal) * allow_merge: true if check constraints may be merged with existing ones * is_local: true if definition is local, false if it's inherited * is_internal: true if result of some internal process, not a user request + * queryString: used during expression transformation of default values and + * cooked CHECK constraints * * All entries in newColDefaults will be processed. Entries in newConstraints * will be processed only if they are CONSTR_CHECK type. @@ -2259,7 +2327,6 @@ AddRelationNewConstraints(Relation rel, ParseNamespaceItem *nsitem; int numchecks; List *checknames; - ListCell *cell; Node *expr; CookedConstraint *cooked; @@ -2290,9 +2357,8 @@ AddRelationNewConstraints(Relation rel, /* * Process column default expressions. */ - foreach(cell, newColDefaults) + foreach_ptr(RawColumnDefault, colDef, newColDefaults) { - RawColumnDefault *colDef = (RawColumnDefault *) lfirst(cell); Form_pg_attribute atp = TupleDescAttr(rel->rd_att, colDef->attnum - 1); Oid defOid; @@ -2319,12 +2385,8 @@ AddRelationNewConstraints(Relation rel, castNode(Const, expr)->constisnull)) continue; - /* If the DEFAULT is volatile we cannot use a missing value */ - if (colDef->missingMode && contain_volatile_functions((Node *) expr)) - colDef->missingMode = false; - defOid = StoreAttrDefault(rel, colDef->attnum, expr, is_internal, - colDef->missingMode); + false); cooked = (CookedConstraint *) palloc(sizeof(CookedConstraint)); cooked->contype = CONSTR_DEFAULT; @@ -2344,130 +2406,129 @@ AddRelationNewConstraints(Relation rel, */ numchecks = numoldchecks; checknames = NIL; - foreach(cell, newConstraints) + foreach_node(Constraint, cdef, newConstraints) { - Constraint *cdef = (Constraint *) lfirst(cell); - char *ccname; Oid constrOid; - if (cdef->contype != CONSTR_CHECK) - continue; - - if (cdef->raw_expr != NULL) - { - Assert(cdef->cooked_expr == NULL); - - /* - * Transform raw parsetree to executable expression, and verify - * it's valid as a CHECK constraint. - */ - expr = cookConstraint(pstate, cdef->raw_expr, - RelationGetRelationName(rel)); - } - else + if (cdef->contype == CONSTR_CHECK) { - Assert(cdef->cooked_expr != NULL); + char *ccname; - /* - * Here, we assume the parser will only pass us valid CHECK - * expressions, so we do no particular checking. - */ - expr = stringToNode(cdef->cooked_expr); - } - - /* - * Check name uniqueness, or generate a name if none was given. - */ - if (cdef->conname != NULL) - { - ListCell *cell2; - - ccname = cdef->conname; - /* Check against other new constraints */ - /* Needed because we don't do CommandCounterIncrement in loop */ - foreach(cell2, checknames) + if (cdef->raw_expr != NULL) { - if (strcmp((char *) lfirst(cell2), ccname) == 0) - ereport(ERROR, - (errcode(ERRCODE_DUPLICATE_OBJECT), - errmsg("check constraint \"%s\" already exists", - ccname))); + Assert(cdef->cooked_expr == NULL); + + /* + * Transform raw parsetree to executable expression, and + * verify it's valid as a CHECK constraint. + */ + expr = cookConstraint(pstate, cdef->raw_expr, + RelationGetRelationName(rel)); } + else + { + Assert(cdef->cooked_expr != NULL); - /* save name for future checks */ - checknames = lappend(checknames, ccname); + /* + * Here, we assume the parser will only pass us valid CHECK + * expressions, so we do no particular checking. + */ + expr = stringToNode(cdef->cooked_expr); + } /* - * Check against pre-existing constraints. If we are allowed to - * merge with an existing constraint, there's no more to do here. - * (We omit the duplicate constraint from the result, which is - * what ATAddCheckConstraint wants.) - */ - if (MergeWithExistingConstraint(rel, ccname, expr, - allow_merge, is_local, - cdef->initially_valid, - cdef->is_no_inherit)) - continue; - } - else - { - /* - * When generating a name, we want to create "tab_col_check" for a - * column constraint and "tab_check" for a table constraint. We - * no longer have any info about the syntactic positioning of the - * constraint phrase, so we approximate this by seeing whether the - * expression references more than one column. (If the user - * played by the rules, the result is the same...) - * - * Note: pull_var_clause() doesn't descend into sublinks, but we - * eliminated those above; and anyway this only needs to be an - * approximate answer. + * Check name uniqueness, or generate a name if none was given. */ - List *vars; - char *colname; - - vars = pull_var_clause(expr, 0); - - /* eliminate duplicates */ - vars = list_union(NIL, vars); + if (cdef->conname != NULL) + { + ccname = cdef->conname; + /* Check against other new constraints */ + /* Needed because we don't do CommandCounterIncrement in loop */ + foreach_ptr(char, chkname, checknames) + { + if (strcmp(chkname, ccname) == 0) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("check constraint \"%s\" already exists", + ccname))); + } - if (list_length(vars) == 1) - colname = get_attname(RelationGetRelid(rel), - ((Var *) linitial(vars))->varattno, - true); + /* save name for future checks */ + checknames = lappend(checknames, ccname); + + /* + * Check against pre-existing constraints. If we are allowed + * to merge with an existing constraint, there's no more to do + * here. (We omit the duplicate constraint from the result, + * which is what ATAddCheckConstraint wants.) + */ + if (MergeWithExistingConstraint(rel, ccname, expr, + allow_merge, is_local, + cdef->initially_valid, + cdef->is_no_inherit)) + continue; + } else - colname = NULL; - - ccname = ChooseConstraintName(RelationGetRelationName(rel), - colname, - "check", - RelationGetNamespace(rel), - checknames); + { + /* + * When generating a name, we want to create "tab_col_check" + * for a column constraint and "tab_check" for a table + * constraint. We no longer have any info about the syntactic + * positioning of the constraint phrase, so we approximate + * this by seeing whether the expression references more than + * one column. (If the user played by the rules, the result + * is the same...) + * + * Note: pull_var_clause() doesn't descend into sublinks, but + * we eliminated those above; and anyway this only needs to be + * an approximate answer. + */ + List *vars; + char *colname; + + vars = pull_var_clause(expr, 0); + + /* eliminate duplicates */ + vars = list_union(NIL, vars); + + if (list_length(vars) == 1) + colname = get_attname(RelationGetRelid(rel), + ((Var *) linitial(vars))->varattno, + true); + else + colname = NULL; - /* save name for future checks */ - checknames = lappend(checknames, ccname); - } + ccname = ChooseConstraintName(RelationGetRelationName(rel), + colname, + "check", + RelationGetNamespace(rel), + checknames); - /* - * OK, store it. - */ - constrOid = - StoreRelCheck(rel, ccname, expr, cdef->initially_valid, is_local, - is_local ? 0 : 1, cdef->is_no_inherit, is_internal); - - numchecks++; + /* save name for future checks */ + checknames = lappend(checknames, ccname); + } - cooked = (CookedConstraint *) palloc(sizeof(CookedConstraint)); - cooked->contype = CONSTR_CHECK; - cooked->conoid = constrOid; - cooked->name = ccname; - cooked->attnum = 0; - cooked->expr = expr; - cooked->skip_validation = cdef->skip_validation; - cooked->is_local = is_local; - cooked->inhcount = is_local ? 0 : 1; - cooked->is_no_inherit = cdef->is_no_inherit; - cookedConstraints = lappend(cookedConstraints, cooked); + /* + * OK, store it. + */ + constrOid = + StoreRelCheck(rel, ccname, expr, cdef->initially_valid, is_local, + is_local ? 0 : 1, cdef->is_no_inherit, is_internal); + + numchecks++; + + cooked = (CookedConstraint *) palloc(sizeof(CookedConstraint)); + cooked->contype = CONSTR_CHECK; + cooked->conoid = constrOid; + cooked->name = ccname; + cooked->attnum = 0; + cooked->expr = expr; + cooked->skip_validation = cdef->skip_validation; + cooked->is_local = is_local; + cooked->inhcount = is_local ? 0 : 1; + cooked->is_no_inherit = cdef->is_no_inherit; + cookedConstraints = lappend(cookedConstraints, cooked); + } } /* @@ -2760,9 +2821,11 @@ cookDefault(ParseState *pstate, if (attgenerated) { + /* Disallow refs to other generated columns */ check_nested_generated(pstate, expr); - if (contain_mutable_functions(expr)) + /* Disallow mutable functions */ + if (contain_mutable_functions_after_planning((Expr *) expr)) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("generation expression is not immutable"))); @@ -3508,6 +3571,14 @@ StorePartitionBound(Relation rel, Relation parent, PartitionBoundSpec *bound) new_val, new_null, new_repl); /* Also set the flag */ ((Form_pg_class) GETSTRUCT(newtuple))->relispartition = true; + + /* + * We already checked for no inheritance children, but reset + * relhassubclass in case it was left over. + */ + if (rel->rd_rel->relkind == RELKIND_RELATION && rel->rd_rel->relhassubclass) + ((Form_pg_class) GETSTRUCT(newtuple))->relhassubclass = false; + CatalogTupleUpdate(classRel, &newtuple->t_self, newtuple); heap_freetuple(newtuple); table_close(classRel, RowExclusiveLock); diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c index 352e43d0e6133..abd8eef08651a 100644 --- a/src/backend/catalog/index.c +++ b/src/backend/catalog/index.c @@ -3,7 +3,7 @@ * index.c * code to create and destroy POSTGRES index relations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -26,9 +26,7 @@ #include "access/amapi.h" #include "access/heapam.h" #include "access/multixact.h" -#include "access/reloptions.h" #include "access/relscan.h" -#include "access/sysattr.h" #include "access/tableam.h" #include "access/toast_compression.h" #include "access/transam.h" @@ -45,7 +43,6 @@ #include "catalog/pg_am.h" #include "catalog/pg_collation.h" #include "catalog/pg_constraint.h" -#include "catalog/pg_depend.h" #include "catalog/pg_description.h" #include "catalog/pg_inherits.h" #include "catalog/pg_opclass.h" @@ -54,10 +51,10 @@ #include "catalog/pg_trigger.h" #include "catalog/pg_type.h" #include "catalog/storage.h" +#include "catalog/storage_xlog.h" #include "commands/event_trigger.h" #include "commands/progress.h" #include "commands/tablecmds.h" -#include "commands/tablespace.h" #include "commands/trigger.h" #include "executor/executor.h" #include "miscadmin.h" @@ -70,10 +67,8 @@ #include "storage/bufmgr.h" #include "storage/lmgr.h" #include "storage/predicate.h" -#include "storage/procarray.h" #include "storage/smgr.h" #include "utils/builtins.h" -#include "utils/datum.h" #include "utils/fmgroids.h" #include "utils/guc.h" #include "utils/inval.h" @@ -105,20 +100,20 @@ typedef struct /* non-export function prototypes */ static bool relationHasPrimaryKey(Relation rel); static TupleDesc ConstructTupleDescriptor(Relation heapRelation, - IndexInfo *indexInfo, - List *indexColNames, - Oid accessMethodObjectId, - Oid *collationObjectId, - Oid *classObjectId); + const IndexInfo *indexInfo, + const List *indexColNames, + Oid accessMethodId, + const Oid *collationIds, + const Oid *opclassIds); static void InitializeAttributeOids(Relation indexRelation, int numatts, Oid indexoid); -static void AppendAttributeTuples(Relation indexRelation, Datum *attopts); +static void AppendAttributeTuples(Relation indexRelation, const Datum *attopts, const NullableDatum *stattargets); static void UpdateIndexRelation(Oid indexoid, Oid heapoid, Oid parentIndexId, - IndexInfo *indexInfo, - Oid *collationOids, - Oid *classOids, - int16 *coloptions, + const IndexInfo *indexInfo, + const Oid *collationOids, + const Oid *opclassOids, + const int16 *coloptions, bool primary, bool isexclusion, bool immediate, @@ -204,9 +199,9 @@ relationHasPrimaryKey(Relation rel) */ void index_check_primary_key(Relation heapRel, - IndexInfo *indexInfo, + const IndexInfo *indexInfo, bool is_alter_table, - IndexStmt *stmt) + const IndexStmt *stmt) { int i; @@ -283,11 +278,11 @@ index_check_primary_key(Relation heapRel, */ static TupleDesc ConstructTupleDescriptor(Relation heapRelation, - IndexInfo *indexInfo, - List *indexColNames, - Oid accessMethodObjectId, - Oid *collationObjectId, - Oid *classObjectId) + const IndexInfo *indexInfo, + const List *indexColNames, + Oid accessMethodId, + const Oid *collationIds, + const Oid *opclassIds) { int numatts = indexInfo->ii_NumIndexAttrs; int numkeyatts = indexInfo->ii_NumIndexKeyAttrs; @@ -300,7 +295,7 @@ ConstructTupleDescriptor(Relation heapRelation, int i; /* We need access to the index AM's API struct */ - amroutine = GetIndexAmRoutineByAmId(accessMethodObjectId, false); + amroutine = GetIndexAmRoutineByAmId(accessMethodId, false); /* ... and to the table's tuple descriptor */ heapTupDesc = RelationGetDescr(heapRelation); @@ -325,11 +320,9 @@ ConstructTupleDescriptor(Relation heapRelation, MemSet(to, 0, ATTRIBUTE_FIXED_PART_SIZE); to->attnum = i + 1; - to->attstattarget = -1; to->attcacheoff = -1; to->attislocal = true; - to->attcollation = (i < numkeyatts) ? - collationObjectId[i] : InvalidOid; + to->attcollation = (i < numkeyatts) ? collationIds[i] : InvalidOid; /* * Set the attribute name as specified by caller. @@ -435,10 +428,9 @@ ConstructTupleDescriptor(Relation heapRelation, if (i < indexInfo->ii_NumIndexKeyAttrs) { - tuple = SearchSysCache1(CLAOID, ObjectIdGetDatum(classObjectId[i])); + tuple = SearchSysCache1(CLAOID, ObjectIdGetDatum(opclassIds[i])); if (!HeapTupleIsValid(tuple)) - elog(ERROR, "cache lookup failed for opclass %u", - classObjectId[i]); + elog(ERROR, "cache lookup failed for opclass %u", opclassIds[i]); opclassTup = (Form_pg_opclass) GETSTRUCT(tuple); if (OidIsValid(opclassTup->opckeytype)) keyType = opclassTup->opckeytype; @@ -515,11 +507,30 @@ InitializeAttributeOids(Relation indexRelation, * ---------------------------------------------------------------- */ static void -AppendAttributeTuples(Relation indexRelation, Datum *attopts) +AppendAttributeTuples(Relation indexRelation, const Datum *attopts, const NullableDatum *stattargets) { Relation pg_attribute; CatalogIndexState indstate; TupleDesc indexTupDesc; + FormExtraData_pg_attribute *attrs_extra = NULL; + + if (attopts) + { + attrs_extra = palloc0_array(FormExtraData_pg_attribute, indexRelation->rd_att->natts); + + for (int i = 0; i < indexRelation->rd_att->natts; i++) + { + if (attopts[i]) + attrs_extra[i].attoptions.value = attopts[i]; + else + attrs_extra[i].attoptions.isnull = true; + + if (stattargets) + attrs_extra[i].attstattarget = stattargets[i]; + else + attrs_extra[i].attstattarget.isnull = true; + } + } /* * open the attribute relation and its indexes @@ -533,7 +544,7 @@ AppendAttributeTuples(Relation indexRelation, Datum *attopts) */ indexTupDesc = RelationGetDescr(indexRelation); - InsertPgAttributeTuples(pg_attribute, indexTupDesc, InvalidOid, attopts, indstate); + InsertPgAttributeTuples(pg_attribute, indexTupDesc, InvalidOid, attrs_extra, indstate); CatalogCloseIndexes(indstate); @@ -550,10 +561,10 @@ static void UpdateIndexRelation(Oid indexoid, Oid heapoid, Oid parentIndexId, - IndexInfo *indexInfo, - Oid *collationOids, - Oid *classOids, - int16 *coloptions, + const IndexInfo *indexInfo, + const Oid *collationOids, + const Oid *opclassOids, + const int16 *coloptions, bool primary, bool isexclusion, bool immediate, @@ -580,7 +591,7 @@ UpdateIndexRelation(Oid indexoid, for (i = 0; i < indexInfo->ii_NumIndexAttrs; i++) indkey->values[i] = indexInfo->ii_IndexAttrNumbers[i]; indcollation = buildoidvector(collationOids, indexInfo->ii_NumIndexKeyAttrs); - indclass = buildoidvector(classOids, indexInfo->ii_NumIndexKeyAttrs); + indclass = buildoidvector(opclassOids, indexInfo->ii_NumIndexKeyAttrs); indoption = buildint2vector(coloptions, indexInfo->ii_NumIndexKeyAttrs); /* @@ -678,10 +689,10 @@ UpdateIndexRelation(Oid indexoid, * May be nonzero to attach an existing valid build. * indexInfo: same info executor uses to insert into the index * indexColNames: column names to use for index (List of char *) - * accessMethodObjectId: OID of index AM to use + * accessMethodId: OID of index AM to use * tableSpaceId: OID of tablespace to use - * collationObjectId: array of collation OIDs, one per index column - * classObjectId: array of index opclass OIDs, one per index column + * collationIds: array of collation OIDs, one per index column + * opclassIds: array of index opclass OIDs, one per index column * coloptions: array of per-index-column indoption settings * reloptions: AM-specific options * flags: bitmask that can include any combination of these bits: @@ -717,12 +728,14 @@ index_create(Relation heapRelation, Oid parentConstraintId, RelFileNumber relFileNumber, IndexInfo *indexInfo, - List *indexColNames, - Oid accessMethodObjectId, + const List *indexColNames, + Oid accessMethodId, Oid tableSpaceId, - Oid *collationObjectId, - Oid *classObjectId, - int16 *coloptions, + const Oid *collationIds, + const Oid *opclassIds, + const Datum *opclassOptions, + const int16 *coloptions, + const NullableDatum *stattargets, Datum reloptions, bits16 flags, bits16 constr_flags, @@ -805,8 +818,8 @@ index_create(Relation heapRelation, */ for (i = 0; i < indexInfo->ii_NumIndexKeyAttrs; i++) { - Oid collation = collationObjectId[i]; - Oid opclass = classObjectId[i]; + Oid collation = collationIds[i]; + Oid opclass = opclassIds[i]; if (collation) { @@ -907,9 +920,9 @@ index_create(Relation heapRelation, indexTupDesc = ConstructTupleDescriptor(heapRelation, indexInfo, indexColNames, - accessMethodObjectId, - collationObjectId, - classObjectId); + accessMethodId, + collationIds, + opclassIds); /* * Allocate an OID for the index, unless we were told what to use. @@ -963,7 +976,7 @@ index_create(Relation heapRelation, tableSpaceId, indexRelationId, relFileNumber, - accessMethodObjectId, + accessMethodId, indexTupDesc, relkind, relpersistence, @@ -992,7 +1005,7 @@ index_create(Relation heapRelation, * XXX should have a cleaner way to create cataloged indexes */ indexRelation->rd_rel->relowner = heapRelation->rd_rel->relowner; - indexRelation->rd_rel->relam = accessMethodObjectId; + indexRelation->rd_rel->relam = accessMethodId; indexRelation->rd_rel->relispartition = OidIsValid(parentIndexRelid); /* @@ -1017,7 +1030,7 @@ index_create(Relation heapRelation, /* * append ATTRIBUTE tuples for the index */ - AppendAttributeTuples(indexRelation, indexInfo->ii_OpclassOptions); + AppendAttributeTuples(indexRelation, opclassOptions, stattargets); /* ---------------- * update pg_index @@ -1029,7 +1042,7 @@ index_create(Relation heapRelation, */ UpdateIndexRelation(indexRelationId, heapRelationId, parentIndexRelid, indexInfo, - collationObjectId, classObjectId, coloptions, + collationIds, opclassIds, coloptions, isprimary, is_exclusion, (constr_flags & INDEX_CONSTR_CREATE_DEFERRABLE) == 0, !concurrent && !invalid, @@ -1045,6 +1058,7 @@ index_create(Relation heapRelation, if (OidIsValid(parentIndexRelid)) { StoreSingleInheritance(indexRelationId, parentIndexRelid, 1); + LockRelationOid(parentIndexRelid, ShareUpdateExclusiveLock); SetRelationHasSubclass(parentIndexRelid, true); } @@ -1158,11 +1172,9 @@ index_create(Relation heapRelation, /* The default collation is pinned, so don't bother recording it */ for (i = 0; i < indexInfo->ii_NumIndexKeyAttrs; i++) { - if (OidIsValid(collationObjectId[i]) && - collationObjectId[i] != DEFAULT_COLLATION_OID) + if (OidIsValid(collationIds[i]) && collationIds[i] != DEFAULT_COLLATION_OID) { - ObjectAddressSet(referenced, CollationRelationId, - collationObjectId[i]); + ObjectAddressSet(referenced, CollationRelationId, collationIds[i]); add_exact_object_address(&referenced, addrs); } } @@ -1170,7 +1182,7 @@ index_create(Relation heapRelation, /* Store dependency on operator classes */ for (i = 0; i < indexInfo->ii_NumIndexKeyAttrs; i++) { - ObjectAddressSet(referenced, OperatorClassRelationId, classObjectId[i]); + ObjectAddressSet(referenced, OperatorClassRelationId, opclassIds[i]); add_exact_object_address(&referenced, addrs); } @@ -1227,10 +1239,10 @@ index_create(Relation heapRelation, indexRelation->rd_index->indnkeyatts = indexInfo->ii_NumIndexKeyAttrs; /* Validate opclass-specific options */ - if (indexInfo->ii_OpclassOptions) + if (opclassOptions) for (i = 0; i < indexInfo->ii_NumIndexKeyAttrs; i++) (void) index_opclass_options(indexRelation, i + 1, - indexInfo->ii_OpclassOptions[i], + opclassOptions[i], true); /* @@ -1294,9 +1306,11 @@ index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId, classTuple; Datum indclassDatum, colOptionDatum, - optionDatum; + reloptionsDatum; + Datum *opclassOptions; oidvector *indclass; int2vector *indcoloptions; + NullableDatum *stattargets; bool isnull; List *indexColNames = NIL; List *indexExprs = NIL; @@ -1328,12 +1342,12 @@ index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId, Anum_pg_index_indoption); indcoloptions = (int2vector *) DatumGetPointer(colOptionDatum); - /* Fetch options of index if any */ - classTuple = SearchSysCache1(RELOID, oldIndexId); + /* Fetch reloptions of index if any */ + classTuple = SearchSysCache1(RELOID, ObjectIdGetDatum(oldIndexId)); if (!HeapTupleIsValid(classTuple)) elog(ERROR, "cache lookup failed for relation %u", oldIndexId); - optionDatum = SysCacheGetAttr(RELOID, classTuple, - Anum_pg_class_reloptions, &isnull); + reloptionsDatum = SysCacheGetAttr(RELOID, classTuple, + Anum_pg_class_reloptions, &isnull); /* * Fetch the list of expressions and predicates directly from the @@ -1396,13 +1410,26 @@ index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId, newInfo->ii_IndexAttrNumbers[i] = oldInfo->ii_IndexAttrNumbers[i]; } - /* Extract opclass parameters for each attribute, if any */ - if (oldInfo->ii_OpclassOptions != NULL) + /* Extract opclass options for each attribute */ + opclassOptions = palloc0(sizeof(Datum) * newInfo->ii_NumIndexAttrs); + for (int i = 0; i < newInfo->ii_NumIndexAttrs; i++) + opclassOptions[i] = get_attoptions(oldIndexId, i + 1); + + /* Extract statistic targets for each attribute */ + stattargets = palloc0_array(NullableDatum, newInfo->ii_NumIndexAttrs); + for (int i = 0; i < newInfo->ii_NumIndexAttrs; i++) { - newInfo->ii_OpclassOptions = palloc0(sizeof(Datum) * - newInfo->ii_NumIndexAttrs); - for (int i = 0; i < newInfo->ii_NumIndexAttrs; i++) - newInfo->ii_OpclassOptions[i] = get_attoptions(oldIndexId, i + 1); + HeapTuple tp; + Datum dat; + + tp = SearchSysCache2(ATTNUM, ObjectIdGetDatum(oldIndexId), Int16GetDatum(i + 1)); + if (!HeapTupleIsValid(tp)) + elog(ERROR, "cache lookup failed for attribute %d of relation %u", + i + 1, oldIndexId); + dat = SysCacheGetAttr(ATTNUM, tp, Anum_pg_attribute_attstattarget, &isnull); + ReleaseSysCache(tp); + stattargets[i].value = dat; + stattargets[i].isnull = isnull; } /* @@ -1424,8 +1451,10 @@ index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId, tablespaceOid, indexRelation->rd_indcollation, indclass->values, + opclassOptions, indcoloptions->values, - optionDatum, + stattargets, + reloptionsDatum, INDEX_CREATE_SKIP_BUILD | INDEX_CREATE_CONCURRENT, 0, true, /* allow table to be a system catalog? */ @@ -1475,6 +1504,7 @@ index_concurrently_build(Oid heapRelationId, SetUserIdAndSecContext(heapRel->rd_rel->relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); indexRelation = index_open(indexRelationId, RowExclusiveLock); @@ -1767,62 +1797,6 @@ index_concurrently_swap(Oid newIndexId, Oid oldIndexId, const char *oldName) /* Copy data of pg_statistic from the old index to the new one */ CopyStatistics(oldIndexId, newIndexId); - /* Copy pg_attribute.attstattarget for each index attribute */ - { - HeapTuple attrTuple; - Relation pg_attribute; - SysScanDesc scan; - ScanKeyData key[1]; - - pg_attribute = table_open(AttributeRelationId, RowExclusiveLock); - ScanKeyInit(&key[0], - Anum_pg_attribute_attrelid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(newIndexId)); - scan = systable_beginscan(pg_attribute, AttributeRelidNumIndexId, - true, NULL, 1, key); - - while (HeapTupleIsValid((attrTuple = systable_getnext(scan)))) - { - Form_pg_attribute att = (Form_pg_attribute) GETSTRUCT(attrTuple); - Datum repl_val[Natts_pg_attribute]; - bool repl_null[Natts_pg_attribute]; - bool repl_repl[Natts_pg_attribute]; - int attstattarget; - HeapTuple newTuple; - - /* Ignore dropped columns */ - if (att->attisdropped) - continue; - - /* - * Get attstattarget from the old index and refresh the new value. - */ - attstattarget = get_attstattarget(oldIndexId, att->attnum); - - /* no need for a refresh if both match */ - if (attstattarget == att->attstattarget) - continue; - - memset(repl_val, 0, sizeof(repl_val)); - memset(repl_null, false, sizeof(repl_null)); - memset(repl_repl, false, sizeof(repl_repl)); - - repl_repl[Anum_pg_attribute_attstattarget - 1] = true; - repl_val[Anum_pg_attribute_attstattarget - 1] = Int16GetDatum(attstattarget); - - newTuple = heap_modify_tuple(attrTuple, - RelationGetDescr(pg_attribute), - repl_val, repl_null, repl_repl); - CatalogTupleUpdate(pg_attribute, &newTuple->t_self, newTuple); - - heap_freetuple(newTuple); - } - - systable_endscan(scan); - table_close(pg_attribute, RowExclusiveLock); - } - /* Close relations */ table_close(pg_class, RowExclusiveLock); table_close(pg_index, RowExclusiveLock); @@ -1907,7 +1881,7 @@ ObjectAddress index_constraint_create(Relation heapRelation, Oid indexRelationId, Oid parentConstraintId, - IndexInfo *indexInfo, + const IndexInfo *indexInfo, const char *constraintName, char constraintType, bits16 constr_flags, @@ -2468,8 +2442,6 @@ BuildIndexInfo(Relation index) &ii->ii_ExclusionStrats); } - ii->ii_OpclassOptions = RelationGetIndexRawAttOptions(index); - return ii; } @@ -2536,10 +2508,10 @@ BuildDummyIndexInfo(Relation index) * Use build_attrmap_by_name(index2, index1) to build the attmap. */ bool -CompareIndexInfo(IndexInfo *info1, IndexInfo *info2, - Oid *collations1, Oid *collations2, - Oid *opfamilies1, Oid *opfamilies2, - AttrMap *attmap) +CompareIndexInfo(const IndexInfo *info1, const IndexInfo *info2, + const Oid *collations1, const Oid *collations2, + const Oid *opfamilies1, const Oid *opfamilies2, + const AttrMap *attmap) { int i; @@ -2563,7 +2535,7 @@ CompareIndexInfo(IndexInfo *info1, IndexInfo *info2, /* * and columns match through the attribute map (actual attribute numbers - * might differ!) Note that this implies that index columns that are + * might differ!) Note that this checks that index columns that are * expressions appear in the same positions. We will next compare the * expressions themselves. */ @@ -2572,13 +2544,22 @@ CompareIndexInfo(IndexInfo *info1, IndexInfo *info2, if (attmap->maplen < info2->ii_IndexAttrNumbers[i]) elog(ERROR, "incorrect attribute map"); - /* ignore expressions at this stage */ - if ((info1->ii_IndexAttrNumbers[i] != InvalidAttrNumber) && - (attmap->attnums[info2->ii_IndexAttrNumbers[i] - 1] != - info1->ii_IndexAttrNumbers[i])) - return false; + /* ignore expressions for now (but check their collation/opfamily) */ + if (!(info1->ii_IndexAttrNumbers[i] == InvalidAttrNumber && + info2->ii_IndexAttrNumbers[i] == InvalidAttrNumber)) + { + /* fail if just one index has an expression in this column */ + if (info1->ii_IndexAttrNumbers[i] == InvalidAttrNumber || + info2->ii_IndexAttrNumbers[i] == InvalidAttrNumber) + return false; + + /* both are columns, so check for match after mapping */ + if (attmap->attnums[info2->ii_IndexAttrNumbers[i] - 1] != + info1->ii_IndexAttrNumbers[i]) + return false; + } - /* collation and opfamily is not valid for including columns */ + /* collation and opfamily are not valid for included columns */ if (i >= info1->ii_NumIndexKeyAttrs) continue; @@ -2801,12 +2782,51 @@ index_update_stats(Relation rel, bool hasindex, double reltuples) { + bool update_stats; + BlockNumber relpages = 0; /* keep compiler quiet */ + BlockNumber relallvisible = 0; Oid relid = RelationGetRelid(rel); Relation pg_class; + ScanKeyData key[1]; HeapTuple tuple; + void *state; Form_pg_class rd_rel; bool dirty; + /* + * As a special hack, if we are dealing with an empty table and the + * existing reltuples is -1, we leave that alone. This ensures that + * creating an index as part of CREATE TABLE doesn't cause the table to + * prematurely look like it's been vacuumed. The rd_rel we modify may + * differ from rel->rd_rel due to e.g. commit of concurrent GRANT, but the + * commands that change reltuples take locks conflicting with ours. (Even + * if a command changed reltuples under a weaker lock, this affects only + * statistics for an empty table.) + */ + if (reltuples == 0 && rel->rd_rel->reltuples < 0) + reltuples = -1; + + /* + * Don't update statistics during binary upgrade, because the indexes are + * created before the data is moved into place. + */ + update_stats = reltuples >= 0 && !IsBinaryUpgrade; + + /* + * Finish I/O and visibility map buffer locks before + * systable_inplace_update_begin() locks the pg_class buffer. The rd_rel + * we modify may differ from rel->rd_rel due to e.g. commit of concurrent + * GRANT, but no command changes a relkind from non-index to index. (Even + * if one did, relallvisible doesn't break functionality.) + */ + if (update_stats) + { + relpages = RelationGetNumberOfBlocks(rel); + + if (rel->rd_rel->relkind != RELKIND_INDEX) + visibilitymap_count(rel, &relallvisible, NULL); + } + /* * We always update the pg_class row using a non-transactional, * overwrite-in-place update. There are several reasons for this: @@ -2837,33 +2857,12 @@ index_update_stats(Relation rel, pg_class = table_open(RelationRelationId, RowExclusiveLock); - /* - * Make a copy of the tuple to update. Normally we use the syscache, but - * we can't rely on that during bootstrap or while reindexing pg_class - * itself. - */ - if (IsBootstrapProcessingMode() || - ReindexIsProcessingHeap(RelationRelationId)) - { - /* don't assume syscache will work */ - TableScanDesc pg_class_scan; - ScanKeyData key[1]; - - ScanKeyInit(&key[0], - Anum_pg_class_oid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(relid)); - - pg_class_scan = table_beginscan_catalog(pg_class, 1, key); - tuple = heap_getnext(pg_class_scan, ForwardScanDirection); - tuple = heap_copytuple(tuple); - table_endscan(pg_class_scan); - } - else - { - /* normal case, use syscache */ - tuple = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relid)); - } + ScanKeyInit(&key[0], + Anum_pg_class_oid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(relid)); + systable_inplace_update_begin(pg_class, ClassOidIndexId, true, NULL, + 1, key, &tuple, &state); if (!HeapTupleIsValid(tuple)) elog(ERROR, "could not find tuple for relation %u", relid); @@ -2872,15 +2871,6 @@ index_update_stats(Relation rel, /* Should this be a more comprehensive test? */ Assert(rd_rel->relkind != RELKIND_PARTITIONED_INDEX); - /* - * As a special hack, if we are dealing with an empty table and the - * existing reltuples is -1, we leave that alone. This ensures that - * creating an index as part of CREATE TABLE doesn't cause the table to - * prematurely look like it's been vacuumed. - */ - if (reltuples == 0 && rd_rel->reltuples < 0) - reltuples = -1; - /* Apply required updates, if any, to copied tuple */ dirty = false; @@ -2890,16 +2880,8 @@ index_update_stats(Relation rel, dirty = true; } - if (reltuples >= 0) + if (update_stats) { - BlockNumber relpages = RelationGetNumberOfBlocks(rel); - BlockNumber relallvisible; - - if (rd_rel->relkind != RELKIND_INDEX) - visibilitymap_count(rel, &relallvisible, NULL); - else /* don't bother for indexes */ - relallvisible = 0; - if (rd_rel->relpages != (int32) relpages) { rd_rel->relpages = (int32) relpages; @@ -2922,11 +2904,12 @@ index_update_stats(Relation rel, */ if (dirty) { - heap_inplace_update(pg_class, tuple); + systable_inplace_update_finish(state, tuple); /* the above sends a cache inval message */ } else { + systable_inplace_update_cancel(state); /* no need to change tuple, but force relcache inval anyway */ CacheInvalidateRelcacheByTuple(tuple); } @@ -2975,12 +2958,12 @@ index_build(Relation heapRelation, /* * Determine worker process details for parallel CREATE INDEX. Currently, - * only btree has support for parallel builds. + * only btree and BRIN have support for parallel builds. * * Note that planner considers parallel safety for us. */ if (parallel && IsNormalProcessingMode() && - indexRelation->rd_rel->relam == BTREE_AM_OID) + indexRelation->rd_indam->amcanbuildparallel) indexInfo->ii_ParallelWorkers = plan_create_index_workers(RelationGetRelid(heapRelation), RelationGetRelid(indexRelation)); @@ -3006,6 +2989,7 @@ index_build(Relation heapRelation, SetUserIdAndSecContext(heapRelation->rd_rel->relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); /* Set up initial progress report status */ { @@ -3044,18 +3028,18 @@ index_build(Relation heapRelation, !smgrexists(RelationGetSmgr(indexRelation), INIT_FORKNUM)) { smgrcreate(RelationGetSmgr(indexRelation), INIT_FORKNUM, false); + log_smgrcreate(&indexRelation->rd_locator, INIT_FORKNUM); indexRelation->rd_indam->ambuildempty(indexRelation); } /* * If we found any potentially broken HOT chains, mark the index as not * being usable until the current transaction is below the event horizon. - * See src/backend/access/heap/README.HOT for discussion. Also set this - * if early pruning/vacuuming is enabled for the heap relation. While it - * might become safe to use the index earlier based on actual cleanup - * activity and other active transactions, the test for that would be much - * more complex and would require some form of blocking, so keep it simple - * and fast by just using the current transaction. + * See src/backend/access/heap/README.HOT for discussion. While it might + * become safe to use the index earlier based on actual cleanup activity + * and other active transactions, the test for that would be much more + * complex and would require some form of blocking, so keep it simple and + * fast by just using the current transaction. * * However, when reindexing an existing index, we should do nothing here. * Any HOT chains that are broken with respect to the index must predate @@ -3067,7 +3051,7 @@ index_build(Relation heapRelation, * * We also need not set indcheckxmin during a concurrent index build, * because we won't set indisvalid true until all transactions that care - * about the broken HOT chains or early pruning/vacuuming are gone. + * about the broken HOT chains are gone. * * Therefore, this code path can only be taken during non-concurrent * CREATE INDEX. Thus the fact that heap_update will set the pg_index @@ -3076,7 +3060,7 @@ index_build(Relation heapRelation, * about any concurrent readers of the tuple; no other transaction can see * it yet. */ - if ((indexInfo->ii_BrokenHotChain || EarlyPruningEnabled(heapRelation)) && + if (indexInfo->ii_BrokenHotChain && !isreindex && !indexInfo->ii_Concurrent) { @@ -3341,6 +3325,7 @@ validate_index(Oid heapId, Oid indexId, Snapshot snapshot) SetUserIdAndSecContext(heapRelation->rd_rel->relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); indexRelation = index_open(indexId, RowExclusiveLock); @@ -3412,6 +3397,9 @@ validate_index(Oid heapId, Oid indexId, Snapshot snapshot) /* Done with tuplesort object */ tuplesort_end(state.tuplesort); + /* Make sure to release resources cached in indexInfo (if needed). */ + index_insert_cleanup(indexRelation, indexInfo); + elog(DEBUG2, "validate_index found %.0f heap tuples, %.0f index tuples; inserted %.0f missing tuples", state.htups, state.itups, state.tups_inserted); @@ -3556,8 +3544,9 @@ IndexGetRelation(Oid indexId, bool missing_ok) * reindex_index - This routine is used to recreate a single index */ void -reindex_index(Oid indexId, bool skip_constraint_checks, char persistence, - ReindexParams *params) +reindex_index(const ReindexStmt *stmt, Oid indexId, + bool skip_constraint_checks, char persistence, + const ReindexParams *params) { Relation iRel, heapRelation; @@ -3601,6 +3590,7 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence, SetUserIdAndSecContext(heapRelation->rd_rel->relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); if (progress) { @@ -3622,12 +3612,43 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence, * Open the target index relation and get an exclusive lock on it, to * ensure that no one else is touching this particular index. */ - iRel = index_open(indexId, AccessExclusiveLock); + if ((params->options & REINDEXOPT_MISSING_OK) != 0) + iRel = try_index_open(indexId, AccessExclusiveLock); + else + iRel = index_open(indexId, AccessExclusiveLock); + + /* if index relation is gone, leave */ + if (!iRel) + { + /* Roll back any GUC changes */ + AtEOXact_GUC(false, save_nestlevel); + + /* Restore userid and security context */ + SetUserIdAndSecContext(save_userid, save_sec_context); + + /* Close parent heap relation, but keep locks */ + table_close(heapRelation, NoLock); + return; + } if (progress) pgstat_progress_update_param(PROGRESS_CREATEIDX_ACCESS_METHOD_OID, iRel->rd_rel->relam); + /* + * If a statement is available, telling that this comes from a REINDEX + * command, collect the index for event triggers. + */ + if (stmt) + { + ObjectAddress address; + + ObjectAddressSet(address, RelationRelationId, indexId); + EventTriggerCollectSimpleCommand(address, + InvalidObjectAddress, + (Node *) stmt); + } + /* * Partitioned indexes should never get processed here, as they have no * physical storage. @@ -3761,11 +3782,6 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence, * reindexing pg_index itself, we must not try to update tuples in it. * pg_index's indexes should always have these flags in their clean state, * so that won't happen. - * - * If early pruning/vacuuming is enabled for the heap relation, the - * usability horizon must be advanced to the current transaction on every - * build or rebuild. pg_index is OK in this regard because catalog tables - * are not subject to early cleanup. */ if (!skipped_constraint) { @@ -3773,7 +3789,6 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence, HeapTuple indexTuple; Form_pg_index indexForm; bool index_bad; - bool early_pruning_enabled = EarlyPruningEnabled(heapRelation); pg_index = table_open(IndexRelationId, RowExclusiveLock); @@ -3787,12 +3802,11 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence, !indexForm->indisready || !indexForm->indislive); if (index_bad || - (indexForm->indcheckxmin && !indexInfo->ii_BrokenHotChain) || - early_pruning_enabled) + (indexForm->indcheckxmin && !indexInfo->ii_BrokenHotChain)) { - if (!indexInfo->ii_BrokenHotChain && !early_pruning_enabled) + if (!indexInfo->ii_BrokenHotChain) indexForm->indcheckxmin = false; - else if (index_bad || early_pruning_enabled) + else if (index_bad) indexForm->indcheckxmin = true; indexForm->indisvalid = true; indexForm->indisready = true; @@ -3870,13 +3884,14 @@ reindex_index(Oid indexId, bool skip_constraint_checks, char persistence, * index rebuild. */ bool -reindex_relation(Oid relid, int flags, ReindexParams *params) +reindex_relation(const ReindexStmt *stmt, Oid relid, int flags, + const ReindexParams *params) { Relation rel; Oid toast_relid; List *indexIds; char persistence; - bool result; + bool result = false; ListCell *indexId; int i; @@ -3906,9 +3921,8 @@ reindex_relation(Oid relid, int flags, ReindexParams *params) toast_relid = rel->rd_rel->reltoastrelid; /* - * Get the list of index OIDs for this relation. (We trust to the - * relcache to get this with a sequential scan if ignoring system - * indexes.) + * Get the list of index OIDs for this relation. (We trust the relcache + * to get this with a sequential scan if ignoring system indexes.) */ indexIds = RelationGetIndexList(rel); @@ -3924,6 +3938,35 @@ reindex_relation(Oid relid, int flags, ReindexParams *params) CommandCounterIncrement(); } + /* + * Reindex the toast table, if any, before the main table. + * + * This helps in cases where a corruption in the toast table's index would + * otherwise error and stop REINDEX TABLE command when it tries to fetch a + * toasted datum. This way. the toast table's index is rebuilt and fixed + * before it is used for reindexing the main table. + * + * It is critical to call reindex_relation() *after* the call to + * RelationGetIndexList() returning the list of indexes on the relation, + * because reindex_relation() will call CommandCounterIncrement() after + * every reindex_index(). See REINDEX_REL_SUPPRESS_INDEX_USE for more + * details. + */ + if ((flags & REINDEX_REL_PROCESS_TOAST) && OidIsValid(toast_relid)) + { + /* + * Note that this should fail if the toast relation is missing, so + * reset REINDEXOPT_MISSING_OK. Even if a new tablespace is set for + * the parent relation, the indexes on its toast table are not moved. + * This rule is enforced by setting tablespaceOid to InvalidOid. + */ + ReindexParams newparams = *params; + + newparams.options &= ~(REINDEXOPT_MISSING_OK); + newparams.tablespaceOid = InvalidOid; + result |= reindex_relation(stmt, toast_relid, flags, &newparams); + } + /* * Compute persistence of indexes: same as that of owning rel, unless * caller specified otherwise. @@ -3955,10 +3998,18 @@ reindex_relation(Oid relid, int flags, ReindexParams *params) errmsg("cannot reindex invalid index \"%s.%s\" on TOAST table, skipping", get_namespace_name(indexNamespaceId), get_rel_name(indexOid)))); + + /* + * Remove this invalid toast index from the reindex pending list, + * as it is skipped here due to the hard failure that would happen + * in reindex_index(), should we try to process it. + */ + if (flags & REINDEX_REL_SUPPRESS_INDEX_USE) + RemoveReindexPending(indexOid); continue; } - reindex_index(indexOid, !(flags & REINDEX_REL_CHECK_CONSTRAINTS), + reindex_index(stmt, indexOid, !(flags & REINDEX_REL_CHECK_CONSTRAINTS), persistence, params); CommandCounterIncrement(); @@ -3977,26 +4028,7 @@ reindex_relation(Oid relid, int flags, ReindexParams *params) */ table_close(rel, NoLock); - result = (indexIds != NIL); - - /* - * If the relation has a secondary toast rel, reindex that too while we - * still hold the lock on the main table. - */ - if ((flags & REINDEX_REL_PROCESS_TOAST) && OidIsValid(toast_relid)) - { - /* - * Note that this should fail if the toast relation is missing, so - * reset REINDEXOPT_MISSING_OK. Even if a new tablespace is set for - * the parent relation, the indexes on its toast table are not moved. - * This rule is enforced by setting tablespaceOid to InvalidOid. - */ - ReindexParams newparams = *params; - - newparams.options &= ~(REINDEXOPT_MISSING_OK); - newparams.tablespaceOid = InvalidOid; - result |= reindex_relation(toast_relid, flags, &newparams); - } + result |= (indexIds != NIL); return result; } @@ -4175,9 +4207,9 @@ SerializeReindexState(Size maxsize, char *start_address) * Restore reindex state in a parallel worker. */ void -RestoreReindexState(void *reindexstate) +RestoreReindexState(const void *reindexstate) { - SerializedReindexState *sistate = (SerializedReindexState *) reindexstate; + const SerializedReindexState *sistate = (const SerializedReindexState *) reindexstate; int c = 0; MemoryContext oldcontext; diff --git a/src/backend/catalog/indexing.c b/src/backend/catalog/indexing.c index 522da0ac8556f..d0d1abda58af3 100644 --- a/src/backend/catalog/indexing.c +++ b/src/backend/catalog/indexing.c @@ -4,7 +4,7 @@ * This file contains routines to support indexes defined on system * catalogs. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/catalog/information_schema.sql b/src/backend/catalog/information_schema.sql index 8bcd42467a190..c4145131ce413 100644 --- a/src/backend/catalog/information_schema.sql +++ b/src/backend/catalog/information_schema.sql @@ -2,7 +2,7 @@ * SQL Information Schema * as defined in ISO/IEC 9075-11:2023 * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * src/backend/catalog/information_schema.sql * @@ -43,11 +43,8 @@ SET search_path TO information_schema; CREATE FUNCTION _pg_expandarray(IN anyarray, OUT x anyelement, OUT n int) RETURNS SETOF RECORD LANGUAGE sql STRICT IMMUTABLE PARALLEL SAFE - AS 'select $1[s], - s operator(pg_catalog.-) pg_catalog.array_lower($1,1) operator(pg_catalog.+) 1 - from pg_catalog.generate_series(pg_catalog.array_lower($1,1), - pg_catalog.array_upper($1,1), - 1) as g(s)'; + ROWS 100 SUPPORT pg_catalog.array_unnest_support + AS 'SELECT * FROM pg_catalog.unnest($1) WITH ORDINALITY'; /* Given an index's OID and an underlying-table column number, return the * column's position in the index (NULL if not there) */ @@ -435,8 +432,7 @@ CREATE VIEW check_constraints AS SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog, CAST(rs.nspname AS sql_identifier) AS constraint_schema, CAST(con.conname AS sql_identifier) AS constraint_name, - CAST(substring(pg_get_constraintdef(con.oid) from 7) AS character_data) - AS check_clause + CAST(pg_get_expr(con.conbin, coalesce(c.oid, 0)) AS character_data) AS check_clause FROM pg_constraint con LEFT OUTER JOIN pg_namespace rs ON (rs.oid = con.connamespace) LEFT OUTER JOIN pg_class c ON (c.oid = con.conrelid) @@ -445,7 +441,22 @@ CREATE VIEW check_constraints AS AND con.contype = 'c' UNION - -- not-null constraints + -- not-null constraints on domains + + SELECT current_database()::information_schema.sql_identifier AS constraint_catalog, + rs.nspname::information_schema.sql_identifier AS constraint_schema, + con.conname::information_schema.sql_identifier AS constraint_name, + pg_catalog.format('%s IS NOT NULL', coalesce(at.attname, 'VALUE'))::information_schema.character_data AS check_clause + FROM pg_constraint con + LEFT JOIN pg_namespace rs ON rs.oid = con.connamespace + LEFT JOIN pg_class c ON c.oid = con.conrelid + LEFT JOIN pg_type t ON t.oid = con.contypid + LEFT JOIN pg_attribute at ON (con.conrelid = at.attrelid AND con.conkey[1] = at.attnum) + WHERE pg_has_role(coalesce(c.relowner, t.typowner), 'USAGE'::text) + AND con.contype = 'n' + + UNION + -- not-null constraints on relations SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog, CAST(n.nspname AS sql_identifier) AS constraint_schema, @@ -2741,8 +2752,6 @@ CREATE VIEW element_types AS CAST(null AS character_data) AS interval_type, CAST(null AS cardinal_number) AS interval_precision, - CAST(null AS character_data) AS domain_default, -- XXX maybe a bug in the standard - CAST(current_database() AS sql_identifier) AS udt_catalog, CAST(nbt.nspname AS sql_identifier) AS udt_schema, CAST(bt.typname AS sql_identifier) AS udt_name, diff --git a/src/backend/catalog/meson.build b/src/backend/catalog/meson.build index fa6609e577951..2f3ded8a0e7c4 100644 --- a/src/backend/catalog/meson.build +++ b/src/backend/catalog/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'aclchk.c', diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index 69ab1b8e4b898..30807f9190474 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -9,7 +9,7 @@ * and implementing search-path-controlled searches. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -24,6 +24,7 @@ #include "access/xact.h" #include "access/xlog.h" #include "catalog/dependency.h" +#include "catalog/namespace.h" #include "catalog/objectaccess.h" #include "catalog/pg_authid.h" #include "catalog/pg_collation.h" @@ -41,14 +42,14 @@ #include "catalog/pg_ts_template.h" #include "catalog/pg_type.h" #include "commands/dbcommands.h" +#include "common/hashfn_unstable.h" #include "funcapi.h" #include "mb/pg_wchar.h" #include "miscadmin.h" #include "nodes/makefuncs.h" -#include "parser/parse_func.h" #include "storage/ipc.h" #include "storage/lmgr.h" -#include "storage/sinvaladt.h" +#include "storage/procarray.h" #include "utils/acl.h" #include "utils/builtins.h" #include "utils/catcache.h" @@ -67,9 +68,7 @@ * may be included: * * 1. If a TEMP table namespace has been initialized in this session, it - * is implicitly searched first. (The only time this doesn't happen is - * when we are obeying an override search path spec that says not to use the - * temp namespace, or the temp namespace is included in the explicit list.) + * is implicitly searched first. * * 2. The system catalog namespace is always searched. If the system * namespace is present in the explicit path then it will be searched in @@ -108,19 +107,16 @@ * namespace (if it exists), preceded by the user's personal namespace * (if one exists). * - * We support a stack of "override" search path settings for use within - * specific sections of backend code. namespace_search_path is ignored - * whenever the override stack is nonempty. activeSearchPath is always - * the actually active path; it points either to the search list of the - * topmost stack entry, or to baseSearchPath which is the list derived - * from namespace_search_path. + * activeSearchPath is always the actually active path; it points to + * baseSearchPath which is the list derived from namespace_search_path. * - * If baseSearchPathValid is false, then baseSearchPath (and other - * derived variables) need to be recomputed from namespace_search_path. - * We mark it invalid upon an assignment to namespace_search_path or receipt - * of a syscache invalidation event for pg_namespace. The recomputation - * is done during the next non-overridden lookup attempt. Note that an - * override spec is never subject to recomputation. + * If baseSearchPathValid is false, then baseSearchPath (and other derived + * variables) need to be recomputed from namespace_search_path, or retrieved + * from the search path cache if there haven't been any syscache + * invalidations. We mark it invalid upon an assignment to + * namespace_search_path or receipt of a syscache invalidation event for + * pg_namespace or pg_authid. The recomputation is done during the next + * lookup attempt. * * Any namespaces mentioned in namespace_search_path that are not readable * by the current user ID are simply left out of baseSearchPath; so @@ -161,16 +157,31 @@ static Oid namespaceUser = InvalidOid; /* The above four values are valid only if baseSearchPathValid */ static bool baseSearchPathValid = true; -/* Override requests are remembered in a stack of OverrideStackEntry structs */ +/* + * Storage for search path cache. Clear searchPathCacheValid as a simple + * way to invalidate *all* the cache entries, not just the active one. + */ +static bool searchPathCacheValid = false; +static MemoryContext SearchPathCacheContext = NULL; + +typedef struct SearchPathCacheKey +{ + const char *searchPath; + Oid roleid; +} SearchPathCacheKey; -typedef struct +typedef struct SearchPathCacheEntry { - List *searchPath; /* the desired search path */ - Oid creationNamespace; /* the desired creation namespace */ - int nestLevel; /* subtransaction nesting level */ -} OverrideStackEntry; + SearchPathCacheKey key; + List *oidlist; /* namespace OIDs that pass ACL checks */ + List *finalPath; /* cached final computed search path */ + Oid firstNS; /* first explicitly-listed namespace */ + bool temp_missing; + bool forceRecompute; /* force recompute of finalPath */ -static List *overrideStack = NIL; + /* needed for simplehash */ + char status; +} SearchPathCacheEntry; /* * myTempNamespace is InvalidOid until and unless a TEMP namespace is set up @@ -201,16 +212,207 @@ char *namespace_search_path = NULL; /* Local functions */ +static bool RelationIsVisibleExt(Oid relid, bool *is_missing); +static bool TypeIsVisibleExt(Oid typid, bool *is_missing); +static bool FunctionIsVisibleExt(Oid funcid, bool *is_missing); +static bool OperatorIsVisibleExt(Oid oprid, bool *is_missing); +static bool OpclassIsVisibleExt(Oid opcid, bool *is_missing); +static bool OpfamilyIsVisibleExt(Oid opfid, bool *is_missing); +static bool CollationIsVisibleExt(Oid collid, bool *is_missing); +static bool ConversionIsVisibleExt(Oid conid, bool *is_missing); +static bool StatisticsObjIsVisibleExt(Oid stxid, bool *is_missing); +static bool TSParserIsVisibleExt(Oid prsId, bool *is_missing); +static bool TSDictionaryIsVisibleExt(Oid dictId, bool *is_missing); +static bool TSTemplateIsVisibleExt(Oid tmplId, bool *is_missing); +static bool TSConfigIsVisibleExt(Oid cfgid, bool *is_missing); static void recomputeNamespacePath(void); static void AccessTempTableNamespace(bool force); static void InitTempTableNamespace(void); static void RemoveTempRelations(Oid tempNamespaceId); static void RemoveTempRelationsCallback(int code, Datum arg); -static void NamespaceCallback(Datum arg, int cacheid, uint32 hashvalue); +static void InvalidationCallback(Datum arg, int cacheid, uint32 hashvalue); static bool MatchNamedCall(HeapTuple proctup, int nargs, List *argnames, bool include_out_arguments, int pronargs, int **argnumbers); +/* + * Recomputing the namespace path can be costly when done frequently, such as + * when a function has search_path set in proconfig. Add a search path cache + * that can be used by recomputeNamespacePath(). + * + * The cache is also used to remember already-validated strings in + * check_search_path() to avoid the need to call SplitIdentifierString() + * repeatedly. + * + * The search path cache is based on a wrapper around a simplehash hash table + * (nsphash, defined below). The spcache wrapper deals with OOM while trying + * to initialize a key, optimizes repeated lookups of the same key, and also + * offers a more convenient API. + */ + +static inline uint32 +spcachekey_hash(SearchPathCacheKey key) +{ + fasthash_state hs; + int sp_len; + + fasthash_init(&hs, 0); + + hs.accum = key.roleid; + fasthash_combine(&hs); + + /* + * Combine search path into the hash and save the length for tweaking the + * final mix. + */ + sp_len = fasthash_accum_cstring(&hs, key.searchPath); + + return fasthash_final32(&hs, sp_len); +} + +static inline bool +spcachekey_equal(SearchPathCacheKey a, SearchPathCacheKey b) +{ + return a.roleid == b.roleid && + strcmp(a.searchPath, b.searchPath) == 0; +} + +#define SH_PREFIX nsphash +#define SH_ELEMENT_TYPE SearchPathCacheEntry +#define SH_KEY_TYPE SearchPathCacheKey +#define SH_KEY key +#define SH_HASH_KEY(tb, key) spcachekey_hash(key) +#define SH_EQUAL(tb, a, b) spcachekey_equal(a, b) +#define SH_SCOPE static inline +#define SH_DECLARE +#define SH_DEFINE +#include "lib/simplehash.h" + +/* + * We only expect a small number of unique search_path strings to be used. If + * this cache grows to an unreasonable size, reset it to avoid steady-state + * memory growth. Most likely, only a few of those entries will benefit from + * the cache, and the cache will be quickly repopulated with such entries. + */ +#define SPCACHE_RESET_THRESHOLD 256 + +static nsphash_hash *SearchPathCache = NULL; +static SearchPathCacheEntry *LastSearchPathCacheEntry = NULL; + +/* + * Create or reset search_path cache as necessary. + */ +static void +spcache_init(void) +{ + if (SearchPathCache && searchPathCacheValid && + SearchPathCache->members < SPCACHE_RESET_THRESHOLD) + return; + + searchPathCacheValid = false; + baseSearchPathValid = false; + + /* + * Make sure we don't leave dangling pointers if a failure happens during + * initialization. + */ + SearchPathCache = NULL; + LastSearchPathCacheEntry = NULL; + + if (SearchPathCacheContext == NULL) + { + /* Make the context we'll keep search path cache hashtable in */ + SearchPathCacheContext = AllocSetContextCreate(TopMemoryContext, + "search_path processing cache", + ALLOCSET_DEFAULT_SIZES); + } + else + { + MemoryContextReset(SearchPathCacheContext); + } + + /* arbitrary initial starting size of 16 elements */ + SearchPathCache = nsphash_create(SearchPathCacheContext, 16, NULL); + searchPathCacheValid = true; +} + +/* + * Look up entry in search path cache without inserting. Returns NULL if not + * present. + */ +static SearchPathCacheEntry * +spcache_lookup(const char *searchPath, Oid roleid) +{ + if (LastSearchPathCacheEntry && + LastSearchPathCacheEntry->key.roleid == roleid && + strcmp(LastSearchPathCacheEntry->key.searchPath, searchPath) == 0) + { + return LastSearchPathCacheEntry; + } + else + { + SearchPathCacheEntry *entry; + SearchPathCacheKey cachekey = { + .searchPath = searchPath, + .roleid = roleid + }; + + entry = nsphash_lookup(SearchPathCache, cachekey); + if (entry) + LastSearchPathCacheEntry = entry; + return entry; + } +} + +/* + * Look up or insert entry in search path cache. + * + * Initialize key safely, so that OOM does not leave an entry without a valid + * key. Caller must ensure that non-key contents are properly initialized. + */ +static SearchPathCacheEntry * +spcache_insert(const char *searchPath, Oid roleid) +{ + if (LastSearchPathCacheEntry && + LastSearchPathCacheEntry->key.roleid == roleid && + strcmp(LastSearchPathCacheEntry->key.searchPath, searchPath) == 0) + { + return LastSearchPathCacheEntry; + } + else + { + SearchPathCacheEntry *entry; + SearchPathCacheKey cachekey = { + .searchPath = searchPath, + .roleid = roleid + }; + + /* + * searchPath is not saved in SearchPathCacheContext. First perform a + * lookup, and copy searchPath only if we need to create a new entry. + */ + entry = nsphash_lookup(SearchPathCache, cachekey); + + if (!entry) + { + bool found; + + cachekey.searchPath = MemoryContextStrdup(SearchPathCacheContext, searchPath); + entry = nsphash_insert(SearchPathCache, cachekey, &found); + Assert(!found); + + entry->oidlist = NIL; + entry->finalPath = NIL; + entry->firstNS = InvalidOid; + entry->temp_missing = false; + entry->forceRecompute = false; + /* do not touch entry->status, used by simplehash */ + } + + LastSearchPathCacheEntry = entry; + return entry; + } +} /* * RangeVarGetRelidExtended @@ -709,6 +911,18 @@ RelnameGetRelid(const char *relname) */ bool RelationIsVisible(Oid relid) +{ + return RelationIsVisibleExt(relid, NULL); +} + +/* + * RelationIsVisibleExt + * As above, but if the relation isn't found and is_missing is not NULL, + * then set *is_missing = true and return false instead of throwing + * an error. (Caller must initialize *is_missing = false.) + */ +static bool +RelationIsVisibleExt(Oid relid, bool *is_missing) { HeapTuple reltup; Form_pg_class relform; @@ -717,7 +931,14 @@ RelationIsVisible(Oid relid) reltup = SearchSysCache1(RELOID, ObjectIdGetDatum(relid)); if (!HeapTupleIsValid(reltup)) + { + if (is_missing != NULL) + { + *is_missing = true; + return false; + } elog(ERROR, "cache lookup failed for relation %u", relid); + } relform = (Form_pg_class) GETSTRUCT(reltup); recomputeNamespacePath(); @@ -817,6 +1038,18 @@ TypenameGetTypidExtended(const char *typname, bool temp_ok) */ bool TypeIsVisible(Oid typid) +{ + return TypeIsVisibleExt(typid, NULL); +} + +/* + * TypeIsVisibleExt + * As above, but if the type isn't found and is_missing is not NULL, + * then set *is_missing = true and return false instead of throwing + * an error. (Caller must initialize *is_missing = false.) + */ +static bool +TypeIsVisibleExt(Oid typid, bool *is_missing) { HeapTuple typtup; Form_pg_type typform; @@ -825,7 +1058,14 @@ TypeIsVisible(Oid typid) typtup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid)); if (!HeapTupleIsValid(typtup)) + { + if (is_missing != NULL) + { + *is_missing = true; + return false; + } elog(ERROR, "cache lookup failed for type %u", typid); + } typform = (Form_pg_type) GETSTRUCT(typtup); recomputeNamespacePath(); @@ -1454,6 +1694,18 @@ MatchNamedCall(HeapTuple proctup, int nargs, List *argnames, */ bool FunctionIsVisible(Oid funcid) +{ + return FunctionIsVisibleExt(funcid, NULL); +} + +/* + * FunctionIsVisibleExt + * As above, but if the function isn't found and is_missing is not NULL, + * then set *is_missing = true and return false instead of throwing + * an error. (Caller must initialize *is_missing = false.) + */ +static bool +FunctionIsVisibleExt(Oid funcid, bool *is_missing) { HeapTuple proctup; Form_pg_proc procform; @@ -1462,7 +1714,14 @@ FunctionIsVisible(Oid funcid) proctup = SearchSysCache1(PROCOID, ObjectIdGetDatum(funcid)); if (!HeapTupleIsValid(proctup)) + { + if (is_missing != NULL) + { + *is_missing = true; + return false; + } elog(ERROR, "cache lookup failed for function %u", funcid); + } procform = (Form_pg_proc) GETSTRUCT(proctup); recomputeNamespacePath(); @@ -1788,6 +2047,18 @@ OpernameGetCandidates(List *names, char oprkind, bool missing_schema_ok) */ bool OperatorIsVisible(Oid oprid) +{ + return OperatorIsVisibleExt(oprid, NULL); +} + +/* + * OperatorIsVisibleExt + * As above, but if the operator isn't found and is_missing is not NULL, + * then set *is_missing = true and return false instead of throwing + * an error. (Caller must initialize *is_missing = false.) + */ +static bool +OperatorIsVisibleExt(Oid oprid, bool *is_missing) { HeapTuple oprtup; Form_pg_operator oprform; @@ -1796,7 +2067,14 @@ OperatorIsVisible(Oid oprid) oprtup = SearchSysCache1(OPEROID, ObjectIdGetDatum(oprid)); if (!HeapTupleIsValid(oprtup)) + { + if (is_missing != NULL) + { + *is_missing = true; + return false; + } elog(ERROR, "cache lookup failed for operator %u", oprid); + } oprform = (Form_pg_operator) GETSTRUCT(oprtup); recomputeNamespacePath(); @@ -1874,6 +2152,18 @@ OpclassnameGetOpcid(Oid amid, const char *opcname) */ bool OpclassIsVisible(Oid opcid) +{ + return OpclassIsVisibleExt(opcid, NULL); +} + +/* + * OpclassIsVisibleExt + * As above, but if the opclass isn't found and is_missing is not NULL, + * then set *is_missing = true and return false instead of throwing + * an error. (Caller must initialize *is_missing = false.) + */ +static bool +OpclassIsVisibleExt(Oid opcid, bool *is_missing) { HeapTuple opctup; Form_pg_opclass opcform; @@ -1882,7 +2172,14 @@ OpclassIsVisible(Oid opcid) opctup = SearchSysCache1(CLAOID, ObjectIdGetDatum(opcid)); if (!HeapTupleIsValid(opctup)) + { + if (is_missing != NULL) + { + *is_missing = true; + return false; + } elog(ERROR, "cache lookup failed for opclass %u", opcid); + } opcform = (Form_pg_opclass) GETSTRUCT(opctup); recomputeNamespacePath(); @@ -1957,6 +2254,18 @@ OpfamilynameGetOpfid(Oid amid, const char *opfname) */ bool OpfamilyIsVisible(Oid opfid) +{ + return OpfamilyIsVisibleExt(opfid, NULL); +} + +/* + * OpfamilyIsVisibleExt + * As above, but if the opfamily isn't found and is_missing is not NULL, + * then set *is_missing = true and return false instead of throwing + * an error. (Caller must initialize *is_missing = false.) + */ +static bool +OpfamilyIsVisibleExt(Oid opfid, bool *is_missing) { HeapTuple opftup; Form_pg_opfamily opfform; @@ -1965,7 +2274,14 @@ OpfamilyIsVisible(Oid opfid) opftup = SearchSysCache1(OPFAMILYOID, ObjectIdGetDatum(opfid)); if (!HeapTupleIsValid(opftup)) + { + if (is_missing != NULL) + { + *is_missing = true; + return false; + } elog(ERROR, "cache lookup failed for opfamily %u", opfid); + } opfform = (Form_pg_opfamily) GETSTRUCT(opftup); recomputeNamespacePath(); @@ -2089,6 +2405,18 @@ CollationGetCollid(const char *collname) */ bool CollationIsVisible(Oid collid) +{ + return CollationIsVisibleExt(collid, NULL); +} + +/* + * CollationIsVisibleExt + * As above, but if the collation isn't found and is_missing is not NULL, + * then set *is_missing = true and return false instead of throwing + * an error. (Caller must initialize *is_missing = false.) + */ +static bool +CollationIsVisibleExt(Oid collid, bool *is_missing) { HeapTuple colltup; Form_pg_collation collform; @@ -2097,7 +2425,14 @@ CollationIsVisible(Oid collid) colltup = SearchSysCache1(COLLOID, ObjectIdGetDatum(collid)); if (!HeapTupleIsValid(colltup)) + { + if (is_missing != NULL) + { + *is_missing = true; + return false; + } elog(ERROR, "cache lookup failed for collation %u", collid); + } collform = (Form_pg_collation) GETSTRUCT(colltup); recomputeNamespacePath(); @@ -2172,6 +2507,18 @@ ConversionGetConid(const char *conname) */ bool ConversionIsVisible(Oid conid) +{ + return ConversionIsVisibleExt(conid, NULL); +} + +/* + * ConversionIsVisibleExt + * As above, but if the conversion isn't found and is_missing is not NULL, + * then set *is_missing = true and return false instead of throwing + * an error. (Caller must initialize *is_missing = false.) + */ +static bool +ConversionIsVisibleExt(Oid conid, bool *is_missing) { HeapTuple contup; Form_pg_conversion conform; @@ -2180,7 +2527,14 @@ ConversionIsVisible(Oid conid) contup = SearchSysCache1(CONVOID, ObjectIdGetDatum(conid)); if (!HeapTupleIsValid(contup)) + { + if (is_missing != NULL) + { + *is_missing = true; + return false; + } elog(ERROR, "cache lookup failed for conversion %u", conid); + } conform = (Form_pg_conversion) GETSTRUCT(contup); recomputeNamespacePath(); @@ -2275,16 +2629,35 @@ get_statistics_object_oid(List *names, bool missing_ok) * for the unqualified statistics object name". */ bool -StatisticsObjIsVisible(Oid relid) +StatisticsObjIsVisible(Oid stxid) +{ + return StatisticsObjIsVisibleExt(stxid, NULL); +} + +/* + * StatisticsObjIsVisibleExt + * As above, but if the statistics object isn't found and is_missing is + * not NULL, then set *is_missing = true and return false instead of + * throwing an error. (Caller must initialize *is_missing = false.) + */ +static bool +StatisticsObjIsVisibleExt(Oid stxid, bool *is_missing) { HeapTuple stxtup; Form_pg_statistic_ext stxform; Oid stxnamespace; bool visible; - stxtup = SearchSysCache1(STATEXTOID, ObjectIdGetDatum(relid)); + stxtup = SearchSysCache1(STATEXTOID, ObjectIdGetDatum(stxid)); if (!HeapTupleIsValid(stxtup)) - elog(ERROR, "cache lookup failed for statistics object %u", relid); + { + if (is_missing != NULL) + { + *is_missing = true; + return false; + } + elog(ERROR, "cache lookup failed for statistics object %u", stxid); + } stxform = (Form_pg_statistic_ext) GETSTRUCT(stxtup); recomputeNamespacePath(); @@ -2399,6 +2772,18 @@ get_ts_parser_oid(List *names, bool missing_ok) */ bool TSParserIsVisible(Oid prsId) +{ + return TSParserIsVisibleExt(prsId, NULL); +} + +/* + * TSParserIsVisibleExt + * As above, but if the parser isn't found and is_missing is not NULL, + * then set *is_missing = true and return false instead of throwing + * an error. (Caller must initialize *is_missing = false.) + */ +static bool +TSParserIsVisibleExt(Oid prsId, bool *is_missing) { HeapTuple tup; Form_pg_ts_parser form; @@ -2407,7 +2792,14 @@ TSParserIsVisible(Oid prsId) tup = SearchSysCache1(TSPARSEROID, ObjectIdGetDatum(prsId)); if (!HeapTupleIsValid(tup)) + { + if (is_missing != NULL) + { + *is_missing = true; + return false; + } elog(ERROR, "cache lookup failed for text search parser %u", prsId); + } form = (Form_pg_ts_parser) GETSTRUCT(tup); recomputeNamespacePath(); @@ -2525,6 +2917,18 @@ get_ts_dict_oid(List *names, bool missing_ok) */ bool TSDictionaryIsVisible(Oid dictId) +{ + return TSDictionaryIsVisibleExt(dictId, NULL); +} + +/* + * TSDictionaryIsVisibleExt + * As above, but if the dictionary isn't found and is_missing is not NULL, + * then set *is_missing = true and return false instead of throwing + * an error. (Caller must initialize *is_missing = false.) + */ +static bool +TSDictionaryIsVisibleExt(Oid dictId, bool *is_missing) { HeapTuple tup; Form_pg_ts_dict form; @@ -2533,8 +2937,15 @@ TSDictionaryIsVisible(Oid dictId) tup = SearchSysCache1(TSDICTOID, ObjectIdGetDatum(dictId)); if (!HeapTupleIsValid(tup)) + { + if (is_missing != NULL) + { + *is_missing = true; + return false; + } elog(ERROR, "cache lookup failed for text search dictionary %u", dictId); + } form = (Form_pg_ts_dict) GETSTRUCT(tup); recomputeNamespacePath(); @@ -2652,6 +3063,18 @@ get_ts_template_oid(List *names, bool missing_ok) */ bool TSTemplateIsVisible(Oid tmplId) +{ + return TSTemplateIsVisibleExt(tmplId, NULL); +} + +/* + * TSTemplateIsVisibleExt + * As above, but if the template isn't found and is_missing is not NULL, + * then set *is_missing = true and return false instead of throwing + * an error. (Caller must initialize *is_missing = false.) + */ +static bool +TSTemplateIsVisibleExt(Oid tmplId, bool *is_missing) { HeapTuple tup; Form_pg_ts_template form; @@ -2660,7 +3083,14 @@ TSTemplateIsVisible(Oid tmplId) tup = SearchSysCache1(TSTEMPLATEOID, ObjectIdGetDatum(tmplId)); if (!HeapTupleIsValid(tup)) + { + if (is_missing != NULL) + { + *is_missing = true; + return false; + } elog(ERROR, "cache lookup failed for text search template %u", tmplId); + } form = (Form_pg_ts_template) GETSTRUCT(tup); recomputeNamespacePath(); @@ -2778,6 +3208,18 @@ get_ts_config_oid(List *names, bool missing_ok) */ bool TSConfigIsVisible(Oid cfgid) +{ + return TSConfigIsVisibleExt(cfgid, NULL); +} + +/* + * TSConfigIsVisibleExt + * As above, but if the configuration isn't found and is_missing is not + * NULL, then set *is_missing = true and return false instead of throwing + * an error. (Caller must initialize *is_missing = false.) + */ +static bool +TSConfigIsVisibleExt(Oid cfgid, bool *is_missing) { HeapTuple tup; Form_pg_ts_config form; @@ -2786,8 +3228,15 @@ TSConfigIsVisible(Oid cfgid) tup = SearchSysCache1(TSCONFIGOID, ObjectIdGetDatum(cfgid)); if (!HeapTupleIsValid(tup)) + { + if (is_missing != NULL) + { + *is_missing = true; + return false; + } elog(ERROR, "cache lookup failed for text search configuration %u", cfgid); + } form = (Form_pg_ts_config) GETSTRUCT(tup); recomputeNamespacePath(); @@ -2849,7 +3298,7 @@ TSConfigIsVisible(Oid cfgid) * *nspname_p is set to NULL if there is no explicit schema name. */ void -DeconstructQualifiedName(List *names, +DeconstructQualifiedName(const List *names, char **nspname_p, char **objname_p) { @@ -3035,7 +3484,7 @@ CheckSetNamespace(Oid oldNspOid, Oid nspOid) * if we have to create or clean out the temp namespace. */ Oid -QualifiedNameGetCreationNamespace(List *names, char **objname_p) +QualifiedNameGetCreationNamespace(const List *names, char **objname_p) { char *schemaname; Oid namespaceId; @@ -3102,7 +3551,7 @@ get_namespace_oid(const char *nspname, bool missing_ok) * Utility routine to convert a qualified-name list into RangeVar form. */ RangeVar * -makeRangeVarFromNameList(List *names) +makeRangeVarFromNameList(const List *names) { RangeVar *rel = makeRangeVar(NULL, NULL, -1); @@ -3142,7 +3591,7 @@ makeRangeVarFromNameList(List *names) * but we also allow A_Star for the convenience of ColumnRef processing. */ char * -NameListToString(List *names) +NameListToString(const List *names) { StringInfoData string; ListCell *l; @@ -3176,7 +3625,7 @@ NameListToString(List *names) * so the string could be re-parsed (eg, by textToQualifiedNameList). */ char * -NameListToQuotedString(List *names) +NameListToQuotedString(const List *names) { StringInfoData string; ListCell *l; @@ -3280,18 +3729,18 @@ TempNamespaceStatus checkTempNamespaceStatus(Oid namespaceId) { PGPROC *proc; - int backendId; + ProcNumber procNumber; Assert(OidIsValid(MyDatabaseId)); - backendId = GetTempNamespaceBackendId(namespaceId); + procNumber = GetTempNamespaceProcNumber(namespaceId); /* No such namespace, or its name shows it's not temp? */ - if (backendId == InvalidBackendId) + if (procNumber == INVALID_PROC_NUMBER) return TEMP_NAMESPACE_NOT_TEMP; /* Is the backend alive? */ - proc = BackendIdGetProc(backendId); + proc = ProcNumberGetProc(procNumber); if (proc == NULL) return TEMP_NAMESPACE_IDLE; @@ -3308,13 +3757,13 @@ checkTempNamespaceStatus(Oid namespaceId) } /* - * GetTempNamespaceBackendId - if the given namespace is a temporary-table - * namespace (either my own, or another backend's), return the BackendId + * GetTempNamespaceProcNumber - if the given namespace is a temporary-table + * namespace (either my own, or another backend's), return the proc number * that owns it. Temporary-toast-table namespaces are included, too. - * If it isn't a temp namespace, return InvalidBackendId. + * If it isn't a temp namespace, return INVALID_PROC_NUMBER. */ -int -GetTempNamespaceBackendId(Oid namespaceId) +ProcNumber +GetTempNamespaceProcNumber(Oid namespaceId) { int result; char *nspname; @@ -3322,13 +3771,13 @@ GetTempNamespaceBackendId(Oid namespaceId) /* See if the namespace name starts with "pg_temp_" or "pg_toast_temp_" */ nspname = get_namespace_name(namespaceId); if (!nspname) - return InvalidBackendId; /* no such namespace? */ + return INVALID_PROC_NUMBER; /* no such namespace? */ if (strncmp(nspname, "pg_temp_", 8) == 0) result = atoi(nspname + 8); else if (strncmp(nspname, "pg_toast_temp_", 14) == 0) result = atoi(nspname + 14); else - result = InvalidBackendId; + result = INVALID_PROC_NUMBER; pfree(nspname); return result; } @@ -3388,21 +3837,21 @@ SetTempNamespaceState(Oid tempNamespaceId, Oid tempToastNamespaceId) */ baseSearchPathValid = false; /* may need to rebuild list */ + searchPathCacheValid = false; } /* - * GetOverrideSearchPath - fetch current search path definition in form - * used by PushOverrideSearchPath. + * GetSearchPathMatcher - fetch current search path definition. * * The result structure is allocated in the specified memory context * (which might or might not be equal to CurrentMemoryContext); but any * junk created by revalidation calculations will be in CurrentMemoryContext. */ -OverrideSearchPath * -GetOverrideSearchPath(MemoryContext context) +SearchPathMatcher * +GetSearchPathMatcher(MemoryContext context) { - OverrideSearchPath *result; + SearchPathMatcher *result; List *schemas; MemoryContext oldcxt; @@ -3410,7 +3859,7 @@ GetOverrideSearchPath(MemoryContext context) oldcxt = MemoryContextSwitchTo(context); - result = (OverrideSearchPath *) palloc0(sizeof(OverrideSearchPath)); + result = (SearchPathMatcher *) palloc0(sizeof(SearchPathMatcher)); schemas = list_copy(activeSearchPath); while (schemas && linitial_oid(schemas) != activeCreationNamespace) { @@ -3432,16 +3881,16 @@ GetOverrideSearchPath(MemoryContext context) } /* - * CopyOverrideSearchPath - copy the specified OverrideSearchPath. + * CopySearchPathMatcher - copy the specified SearchPathMatcher. * * The result structure is allocated in CurrentMemoryContext. */ -OverrideSearchPath * -CopyOverrideSearchPath(OverrideSearchPath *path) +SearchPathMatcher * +CopySearchPathMatcher(SearchPathMatcher *path) { - OverrideSearchPath *result; + SearchPathMatcher *result; - result = (OverrideSearchPath *) palloc(sizeof(OverrideSearchPath)); + result = (SearchPathMatcher *) palloc(sizeof(SearchPathMatcher)); result->schemas = list_copy(path->schemas); result->addCatalog = path->addCatalog; result->addTemp = path->addTemp; @@ -3451,7 +3900,7 @@ CopyOverrideSearchPath(OverrideSearchPath *path) } /* - * OverrideSearchPathMatchesCurrent - does path match current setting? + * SearchPathMatchesCurrentEnvironment - does path match current environment? * * This is tested over and over in some common code paths, and in the typical * scenario where the active search path seldom changes, it'll always succeed. @@ -3459,7 +3908,7 @@ CopyOverrideSearchPath(OverrideSearchPath *path) * whenever the active search path changes. */ bool -OverrideSearchPathMatchesCurrent(OverrideSearchPath *path) +SearchPathMatchesCurrentEnvironment(SearchPathMatcher *path) { ListCell *lc, *lcp; @@ -3512,132 +3961,6 @@ OverrideSearchPathMatchesCurrent(OverrideSearchPath *path) return true; } -/* - * PushOverrideSearchPath - temporarily override the search path - * - * Do not use this function; almost any usage introduces a security - * vulnerability. It exists for the benefit of legacy code running in - * non-security-sensitive environments. - * - * We allow nested overrides, hence the push/pop terminology. The GUC - * search_path variable is ignored while an override is active. - * - * It's possible that newpath->useTemp is set but there is no longer any - * active temp namespace, if the path was saved during a transaction that - * created a temp namespace and was later rolled back. In that case we just - * ignore useTemp. A plausible alternative would be to create a new temp - * namespace, but for existing callers that's not necessary because an empty - * temp namespace wouldn't affect their results anyway. - * - * It's also worth noting that other schemas listed in newpath might not - * exist anymore either. We don't worry about this because OIDs that match - * no existing namespace will simply not produce any hits during searches. - */ -void -PushOverrideSearchPath(OverrideSearchPath *newpath) -{ - OverrideStackEntry *entry; - List *oidlist; - Oid firstNS; - MemoryContext oldcxt; - - /* - * Copy the list for safekeeping, and insert implicitly-searched - * namespaces as needed. This code should track recomputeNamespacePath. - */ - oldcxt = MemoryContextSwitchTo(TopMemoryContext); - - oidlist = list_copy(newpath->schemas); - - /* - * Remember the first member of the explicit list. - */ - if (oidlist == NIL) - firstNS = InvalidOid; - else - firstNS = linitial_oid(oidlist); - - /* - * Add any implicitly-searched namespaces to the list. Note these go on - * the front, not the back; also notice that we do not check USAGE - * permissions for these. - */ - if (newpath->addCatalog) - oidlist = lcons_oid(PG_CATALOG_NAMESPACE, oidlist); - - if (newpath->addTemp && OidIsValid(myTempNamespace)) - oidlist = lcons_oid(myTempNamespace, oidlist); - - /* - * Build the new stack entry, then insert it at the head of the list. - */ - entry = (OverrideStackEntry *) palloc(sizeof(OverrideStackEntry)); - entry->searchPath = oidlist; - entry->creationNamespace = firstNS; - entry->nestLevel = GetCurrentTransactionNestLevel(); - - overrideStack = lcons(entry, overrideStack); - - /* And make it active. */ - activeSearchPath = entry->searchPath; - activeCreationNamespace = entry->creationNamespace; - activeTempCreationPending = false; /* XXX is this OK? */ - - /* - * We always increment activePathGeneration when pushing/popping an - * override path. In current usage, these actions always change the - * effective path state, so there's no value in checking to see if it - * didn't change. - */ - activePathGeneration++; - - MemoryContextSwitchTo(oldcxt); -} - -/* - * PopOverrideSearchPath - undo a previous PushOverrideSearchPath - * - * Any push during a (sub)transaction will be popped automatically at abort. - * But it's caller error if a push isn't popped in normal control flow. - */ -void -PopOverrideSearchPath(void) -{ - OverrideStackEntry *entry; - - /* Sanity checks. */ - if (overrideStack == NIL) - elog(ERROR, "bogus PopOverrideSearchPath call"); - entry = (OverrideStackEntry *) linitial(overrideStack); - if (entry->nestLevel != GetCurrentTransactionNestLevel()) - elog(ERROR, "bogus PopOverrideSearchPath call"); - - /* Pop the stack and free storage. */ - overrideStack = list_delete_first(overrideStack); - list_free(entry->searchPath); - pfree(entry); - - /* Activate the next level down. */ - if (overrideStack) - { - entry = (OverrideStackEntry *) linitial(overrideStack); - activeSearchPath = entry->searchPath; - activeCreationNamespace = entry->creationNamespace; - activeTempCreationPending = false; /* XXX is this OK? */ - } - else - { - /* If not baseSearchPathValid, this is useless but harmless */ - activeSearchPath = baseSearchPath; - activeCreationNamespace = baseCreationNamespace; - activeTempCreationPending = baseTempCreationPending; - } - - /* As above, the generation always increments. */ - activePathGeneration++; -} - - /* * get_collation_oid - find a collation by possibly qualified name * @@ -3778,32 +4101,19 @@ FindDefaultConversionProc(int32 for_encoding, int32 to_encoding) } /* - * recomputeNamespacePath - recompute path derived variables if needed. + * Look up namespace IDs and perform ACL checks. Return newly-allocated list. */ -static void -recomputeNamespacePath(void) +static List * +preprocessNamespacePath(const char *searchPath, Oid roleid, + bool *temp_missing) { - Oid roleid = GetUserId(); char *rawname; List *namelist; List *oidlist; - List *newpath; ListCell *l; - bool temp_missing; - Oid firstNS; - bool pathChanged; - MemoryContext oldcxt; - - /* Do nothing if an override search spec is active. */ - if (overrideStack) - return; - - /* Do nothing if path is already valid. */ - if (baseSearchPathValid && namespaceUser == roleid) - return; - /* Need a modifiable copy of namespace_search_path string */ - rawname = pstrdup(namespace_search_path); + /* Need a modifiable copy */ + rawname = pstrdup(searchPath); /* Parse string into list of identifiers */ if (!SplitIdentifierString(rawname, ',', &namelist)) @@ -3820,7 +4130,7 @@ recomputeNamespacePath(void) * already been accepted.) Don't make duplicate entries, either. */ oidlist = NIL; - temp_missing = false; + *temp_missing = false; foreach(l, namelist) { char *curname = (char *) lfirst(l); @@ -3840,10 +4150,8 @@ recomputeNamespacePath(void) namespaceId = get_namespace_oid(rname, true); ReleaseSysCache(tuple); if (OidIsValid(namespaceId) && - !list_member_oid(oidlist, namespaceId) && object_aclcheck(NamespaceRelationId, namespaceId, roleid, - ACL_USAGE) == ACLCHECK_OK && - InvokeNamespaceSearchHook(namespaceId, false)) + ACL_USAGE) == ACLCHECK_OK) oidlist = lappend_oid(oidlist, namespaceId); } } @@ -3851,16 +4159,12 @@ recomputeNamespacePath(void) { /* pg_temp --- substitute temp namespace, if any */ if (OidIsValid(myTempNamespace)) - { - if (!list_member_oid(oidlist, myTempNamespace) && - InvokeNamespaceSearchHook(myTempNamespace, false)) - oidlist = lappend_oid(oidlist, myTempNamespace); - } + oidlist = lappend_oid(oidlist, myTempNamespace); else { /* If it ought to be the creation namespace, set flag */ if (oidlist == NIL) - temp_missing = true; + *temp_missing = true; } } else @@ -3868,61 +4172,165 @@ recomputeNamespacePath(void) /* normal namespace reference */ namespaceId = get_namespace_oid(curname, true); if (OidIsValid(namespaceId) && - !list_member_oid(oidlist, namespaceId) && object_aclcheck(NamespaceRelationId, namespaceId, roleid, - ACL_USAGE) == ACLCHECK_OK && - InvokeNamespaceSearchHook(namespaceId, false)) + ACL_USAGE) == ACLCHECK_OK) oidlist = lappend_oid(oidlist, namespaceId); } } + pfree(rawname); + list_free(namelist); + + return oidlist; +} + +/* + * Remove duplicates, run namespace search hooks, and prepend + * implicitly-searched namespaces. Return newly-allocated list. + * + * If an object_access_hook is present, this must always be recalculated. It + * may seem that duplicate elimination is not dependent on the result of the + * hook, but if a hook returns different results on different calls for the + * same namespace ID, then it could affect the order in which that namespace + * appears in the final list. + */ +static List * +finalNamespacePath(List *oidlist, Oid *firstNS) +{ + List *finalPath = NIL; + ListCell *lc; + + foreach(lc, oidlist) + { + Oid namespaceId = lfirst_oid(lc); + + if (!list_member_oid(finalPath, namespaceId)) + { + if (InvokeNamespaceSearchHook(namespaceId, false)) + finalPath = lappend_oid(finalPath, namespaceId); + } + } + /* * Remember the first member of the explicit list. (Note: this is * nominally wrong if temp_missing, but we need it anyway to distinguish * explicit from implicit mention of pg_catalog.) */ - if (oidlist == NIL) - firstNS = InvalidOid; + if (finalPath == NIL) + *firstNS = InvalidOid; else - firstNS = linitial_oid(oidlist); + *firstNS = linitial_oid(finalPath); /* * Add any implicitly-searched namespaces to the list. Note these go on * the front, not the back; also notice that we do not check USAGE * permissions for these. */ - if (!list_member_oid(oidlist, PG_CATALOG_NAMESPACE)) - oidlist = lcons_oid(PG_CATALOG_NAMESPACE, oidlist); + if (!list_member_oid(finalPath, PG_CATALOG_NAMESPACE)) + finalPath = lcons_oid(PG_CATALOG_NAMESPACE, finalPath); if (OidIsValid(myTempNamespace) && - !list_member_oid(oidlist, myTempNamespace)) - oidlist = lcons_oid(myTempNamespace, oidlist); + !list_member_oid(finalPath, myTempNamespace)) + finalPath = lcons_oid(myTempNamespace, finalPath); + + return finalPath; +} + +/* + * Retrieve search path information from the cache; or if not there, fill + * it. The returned entry is valid only until the next call to this function. + */ +static const SearchPathCacheEntry * +cachedNamespacePath(const char *searchPath, Oid roleid) +{ + MemoryContext oldcxt; + SearchPathCacheEntry *entry; + + spcache_init(); + + entry = spcache_insert(searchPath, roleid); + + /* + * An OOM may have resulted in a cache entry with missing 'oidlist' or + * 'finalPath', so just compute whatever is missing. + */ + + if (entry->oidlist == NIL) + { + oldcxt = MemoryContextSwitchTo(SearchPathCacheContext); + entry->oidlist = preprocessNamespacePath(searchPath, roleid, + &entry->temp_missing); + MemoryContextSwitchTo(oldcxt); + } /* - * We want to detect the case where the effective value of the base search - * path variables didn't change. As long as we're doing so, we can avoid - * copying the OID list unnecessarily. + * If a hook is set, we must recompute finalPath from the oidlist each + * time, because the hook may affect the result. This is still much faster + * than recomputing from the string (and doing catalog lookups and ACL + * checks). */ - if (baseCreationNamespace == firstNS && - baseTempCreationPending == temp_missing && - equal(oidlist, baseSearchPath)) + if (entry->finalPath == NIL || object_access_hook || + entry->forceRecompute) + { + list_free(entry->finalPath); + entry->finalPath = NIL; + + oldcxt = MemoryContextSwitchTo(SearchPathCacheContext); + entry->finalPath = finalNamespacePath(entry->oidlist, + &entry->firstNS); + MemoryContextSwitchTo(oldcxt); + + /* + * If an object_access_hook is set when finalPath is calculated, the + * result may be affected by the hook. Force recomputation of + * finalPath the next time this cache entry is used, even if the + * object_access_hook is not set at that time. + */ + entry->forceRecompute = object_access_hook ? true : false; + } + + return entry; +} + +/* + * recomputeNamespacePath - recompute path derived variables if needed. + */ +static void +recomputeNamespacePath(void) +{ + Oid roleid = GetUserId(); + bool pathChanged; + const SearchPathCacheEntry *entry; + + /* Do nothing if path is already valid. */ + if (baseSearchPathValid && namespaceUser == roleid) + return; + + entry = cachedNamespacePath(namespace_search_path, roleid); + + if (baseCreationNamespace == entry->firstNS && + baseTempCreationPending == entry->temp_missing && + equal(entry->finalPath, baseSearchPath)) { pathChanged = false; } else { + MemoryContext oldcxt; + List *newpath; + pathChanged = true; /* Must save OID list in permanent storage. */ oldcxt = MemoryContextSwitchTo(TopMemoryContext); - newpath = list_copy(oidlist); + newpath = list_copy(entry->finalPath); MemoryContextSwitchTo(oldcxt); /* Now safe to assign to state variables. */ list_free(baseSearchPath); baseSearchPath = newpath; - baseCreationNamespace = firstNS; - baseTempCreationPending = temp_missing; + baseCreationNamespace = entry->firstNS; + baseTempCreationPending = entry->temp_missing; } /* Mark the path valid. */ @@ -3936,18 +4344,10 @@ recomputeNamespacePath(void) /* * Bump the generation only if something actually changed. (Notice that - * what we compared to was the old state of the base path variables; so - * this does not deal with the situation where we have just popped an - * override path and restored the prior state of the base path. Instead - * we rely on the override-popping logic to have bumped the generation.) + * what we compared to was the old state of the base path variables.) */ if (pathChanged) activePathGeneration++; - - /* Clean up. */ - pfree(rawname); - list_free(namelist); - list_free(oidlist); } /* @@ -4015,8 +4415,8 @@ InitTempTableNamespace(void) /* * Do not allow a Hot Standby session to make temp tables. Aside from * problems with modifying the system catalogs, there is a naming - * conflict: pg_temp_N belongs to the session with BackendId N on the - * primary, not to a hot standby session with the same BackendId. We + * conflict: pg_temp_N belongs to the session with proc number N on the + * primary, not to a hot standby session with the same proc number. We * should not be able to get here anyway due to XactReadOnly checks, but * let's just make real sure. Note that this also backstops various * operations that allow XactReadOnly transactions to modify temp tables; @@ -4033,7 +4433,7 @@ InitTempTableNamespace(void) (errcode(ERRCODE_READ_ONLY_SQL_TRANSACTION), errmsg("cannot create temporary tables during a parallel operation"))); - snprintf(namespaceName, sizeof(namespaceName), "pg_temp_%d", MyBackendId); + snprintf(namespaceName, sizeof(namespaceName), "pg_temp_%d", MyProcNumber); namespaceId = get_namespace_oid(namespaceName, true); if (!OidIsValid(namespaceId)) @@ -4066,7 +4466,7 @@ InitTempTableNamespace(void) * dropping a parent table should make its toast table go away.) */ snprintf(namespaceName, sizeof(namespaceName), "pg_toast_temp_%d", - MyBackendId); + MyProcNumber); toastspaceId = get_namespace_oid(namespaceName, true); if (!OidIsValid(toastspaceId)) @@ -4102,6 +4502,7 @@ InitTempTableNamespace(void) myTempNamespaceSubID = GetCurrentSubTransactionId(); baseSearchPathValid = false; /* need to rebuild list */ + searchPathCacheValid = false; } /* @@ -4127,6 +4528,7 @@ AtEOXact_Namespace(bool isCommit, bool parallel) myTempNamespace = InvalidOid; myTempToastNamespace = InvalidOid; baseSearchPathValid = false; /* need to rebuild list */ + searchPathCacheValid = false; /* * Reset the temporary namespace flag in MyProc. We assume that @@ -4142,29 +4544,6 @@ AtEOXact_Namespace(bool isCommit, bool parallel) myTempNamespaceSubID = InvalidSubTransactionId; } - /* - * Clean up if someone failed to do PopOverrideSearchPath - */ - if (overrideStack) - { - if (isCommit) - elog(WARNING, "leaked override search path"); - while (overrideStack) - { - OverrideStackEntry *entry; - - entry = (OverrideStackEntry *) linitial(overrideStack); - overrideStack = list_delete_first(overrideStack); - list_free(entry->searchPath); - pfree(entry); - } - /* If not baseSearchPathValid, this is useless but harmless */ - activeSearchPath = baseSearchPath; - activeCreationNamespace = baseCreationNamespace; - activeTempCreationPending = baseTempCreationPending; - /* Always bump generation --- see note in recomputeNamespacePath */ - activePathGeneration++; - } } /* @@ -4179,7 +4558,6 @@ void AtEOSubXact_Namespace(bool isCommit, SubTransactionId mySubid, SubTransactionId parentSubid) { - OverrideStackEntry *entry; if (myTempNamespaceSubID == mySubid) { @@ -4192,6 +4570,7 @@ AtEOSubXact_Namespace(bool isCommit, SubTransactionId mySubid, myTempNamespace = InvalidOid; myTempToastNamespace = InvalidOid; baseSearchPathValid = false; /* need to rebuild list */ + searchPathCacheValid = false; /* * Reset the temporary namespace flag in MyProc. We assume that @@ -4205,51 +4584,6 @@ AtEOSubXact_Namespace(bool isCommit, SubTransactionId mySubid, MyProc->tempNamespaceId = InvalidOid; } } - - /* - * Clean up if someone failed to do PopOverrideSearchPath - */ - while (overrideStack) - { - entry = (OverrideStackEntry *) linitial(overrideStack); - if (entry->nestLevel < GetCurrentTransactionNestLevel()) - break; - if (isCommit) - elog(WARNING, "leaked override search path"); - overrideStack = list_delete_first(overrideStack); - list_free(entry->searchPath); - pfree(entry); - /* Always bump generation --- see note in recomputeNamespacePath */ - activePathGeneration++; - } - - /* Activate the next level down. */ - if (overrideStack) - { - entry = (OverrideStackEntry *) linitial(overrideStack); - activeSearchPath = entry->searchPath; - activeCreationNamespace = entry->creationNamespace; - activeTempCreationPending = false; /* XXX is this OK? */ - - /* - * It's probably unnecessary to bump generation here, but this should - * not be a performance-critical case, so better to be over-cautious. - */ - activePathGeneration++; - } - else - { - /* If not baseSearchPathValid, this is useless but harmless */ - activeSearchPath = baseSearchPath; - activeCreationNamespace = baseCreationNamespace; - activeTempCreationPending = baseTempCreationPending; - - /* - * If we popped an override stack entry, then we already bumped the - * generation above. If we did not, then the above assignments did - * nothing and we need not bump the generation. - */ - } } /* @@ -4322,11 +4656,38 @@ ResetTempTableNamespace(void) bool check_search_path(char **newval, void **extra, GucSource source) { + Oid roleid = InvalidOid; + const char *searchPath = *newval; char *rawname; List *namelist; + bool use_cache = (SearchPathCacheContext != NULL); - /* Need a modifiable copy of string */ - rawname = pstrdup(*newval); + /* + * We used to try to check that the named schemas exist, but there are + * many valid use-cases for having search_path settings that include + * schemas that don't exist; and often, we are not inside a transaction + * here and so can't consult the system catalogs anyway. So now, the only + * requirement is syntactic validity of the identifier list. + * + * Checking only the syntactic validity also allows us to use the search + * path cache (if available) to avoid calling SplitIdentifierString() on + * the same string repeatedly. + */ + if (use_cache) + { + spcache_init(); + + roleid = GetUserId(); + + if (spcache_lookup(searchPath, roleid) != NULL) + return true; + } + + /* + * Ensure validity check succeeds before creating cache entry. + */ + + rawname = pstrdup(searchPath); /* need a modifiable copy */ /* Parse string into list of identifiers */ if (!SplitIdentifierString(rawname, ',', &namelist)) @@ -4337,18 +4698,13 @@ check_search_path(char **newval, void **extra, GucSource source) list_free(namelist); return false; } - - /* - * We used to try to check that the named schemas exist, but there are - * many valid use-cases for having search_path settings that include - * schemas that don't exist; and often, we are not inside a transaction - * here and so can't consult the system catalogs anyway. So now, the only - * requirement is syntactic validity of the identifier list. - */ - pfree(rawname); list_free(namelist); + /* OK to create empty cache entry */ + if (use_cache) + (void) spcache_insert(searchPath, roleid); + return true; } @@ -4356,10 +4712,17 @@ check_search_path(char **newval, void **extra, GucSource source) void assign_search_path(const char *newval, void *extra) { + /* don't access search_path during bootstrap */ + Assert(!IsBootstrapProcessingMode()); + /* * We mark the path as needing recomputation, but don't do anything until * it's needed. This avoids trying to do database access during GUC * initialization, or outside a transaction. + * + * This does not invalidate the search path cache, so if this value had + * been previously set and no syscache invalidations happened, + * recomputation may not be necessary. */ baseSearchPathValid = false; } @@ -4396,25 +4759,49 @@ InitializeSearchPath(void) { /* * In normal mode, arrange for a callback on any syscache invalidation - * of pg_namespace rows. + * that will affect the search_path cache. */ + + /* namespace name or ACLs may have changed */ CacheRegisterSyscacheCallback(NAMESPACEOID, - NamespaceCallback, + InvalidationCallback, + (Datum) 0); + + /* role name may affect the meaning of "$user" */ + CacheRegisterSyscacheCallback(AUTHOID, + InvalidationCallback, + (Datum) 0); + + /* role membership may affect ACLs */ + CacheRegisterSyscacheCallback(AUTHMEMROLEMEM, + InvalidationCallback, + (Datum) 0); + + /* database owner may affect ACLs */ + CacheRegisterSyscacheCallback(DATABASEOID, + InvalidationCallback, (Datum) 0); + /* Force search path to be recomputed on next use */ baseSearchPathValid = false; + searchPathCacheValid = false; } } /* - * NamespaceCallback + * InvalidationCallback * Syscache inval callback function */ static void -NamespaceCallback(Datum arg, int cacheid, uint32 hashvalue) +InvalidationCallback(Datum arg, int cacheid, uint32 hashvalue) { - /* Force search path to be recomputed on next use */ + /* + * Force search path to be recomputed on next use, also invalidating the + * search path cache (because namespace names, ACLs, or role names may + * have changed). + */ baseSearchPathValid = false; + searchPathCacheValid = false; } /* @@ -4500,152 +4887,189 @@ fetch_search_path_array(Oid *sarray, int sarray_len) * condition errors when a query that's scanning a catalog using an MVCC * snapshot uses one of these functions. The underlying IsVisible functions * always use an up-to-date snapshot and so might see the object as already - * gone when it's still visible to the transaction snapshot. (There is no race - * condition in the current coding because we don't accept sinval messages - * between the SearchSysCacheExists test and the subsequent lookup.) + * gone when it's still visible to the transaction snapshot. */ Datum pg_table_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); + bool result; + bool is_missing = false; - if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(oid))) - PG_RETURN_NULL(); + result = RelationIsVisibleExt(oid, &is_missing); - PG_RETURN_BOOL(RelationIsVisible(oid)); + if (is_missing) + PG_RETURN_NULL(); + PG_RETURN_BOOL(result); } Datum pg_type_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); + bool result; + bool is_missing = false; - if (!SearchSysCacheExists1(TYPEOID, ObjectIdGetDatum(oid))) - PG_RETURN_NULL(); + result = TypeIsVisibleExt(oid, &is_missing); - PG_RETURN_BOOL(TypeIsVisible(oid)); + if (is_missing) + PG_RETURN_NULL(); + PG_RETURN_BOOL(result); } Datum pg_function_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); + bool result; + bool is_missing = false; - if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(oid))) - PG_RETURN_NULL(); + result = FunctionIsVisibleExt(oid, &is_missing); - PG_RETURN_BOOL(FunctionIsVisible(oid)); + if (is_missing) + PG_RETURN_NULL(); + PG_RETURN_BOOL(result); } Datum pg_operator_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); + bool result; + bool is_missing = false; - if (!SearchSysCacheExists1(OPEROID, ObjectIdGetDatum(oid))) - PG_RETURN_NULL(); + result = OperatorIsVisibleExt(oid, &is_missing); - PG_RETURN_BOOL(OperatorIsVisible(oid)); + if (is_missing) + PG_RETURN_NULL(); + PG_RETURN_BOOL(result); } Datum pg_opclass_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); + bool result; + bool is_missing = false; - if (!SearchSysCacheExists1(CLAOID, ObjectIdGetDatum(oid))) - PG_RETURN_NULL(); + result = OpclassIsVisibleExt(oid, &is_missing); - PG_RETURN_BOOL(OpclassIsVisible(oid)); + if (is_missing) + PG_RETURN_NULL(); + PG_RETURN_BOOL(result); } Datum pg_opfamily_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); + bool result; + bool is_missing = false; - if (!SearchSysCacheExists1(OPFAMILYOID, ObjectIdGetDatum(oid))) - PG_RETURN_NULL(); + result = OpfamilyIsVisibleExt(oid, &is_missing); - PG_RETURN_BOOL(OpfamilyIsVisible(oid)); + if (is_missing) + PG_RETURN_NULL(); + PG_RETURN_BOOL(result); } Datum pg_collation_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); + bool result; + bool is_missing = false; - if (!SearchSysCacheExists1(COLLOID, ObjectIdGetDatum(oid))) - PG_RETURN_NULL(); + result = CollationIsVisibleExt(oid, &is_missing); - PG_RETURN_BOOL(CollationIsVisible(oid)); + if (is_missing) + PG_RETURN_NULL(); + PG_RETURN_BOOL(result); } Datum pg_conversion_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); + bool result; + bool is_missing = false; - if (!SearchSysCacheExists1(CONVOID, ObjectIdGetDatum(oid))) - PG_RETURN_NULL(); + result = ConversionIsVisibleExt(oid, &is_missing); - PG_RETURN_BOOL(ConversionIsVisible(oid)); + if (is_missing) + PG_RETURN_NULL(); + PG_RETURN_BOOL(result); } Datum pg_statistics_obj_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); + bool result; + bool is_missing = false; - if (!SearchSysCacheExists1(STATEXTOID, ObjectIdGetDatum(oid))) - PG_RETURN_NULL(); + result = StatisticsObjIsVisibleExt(oid, &is_missing); - PG_RETURN_BOOL(StatisticsObjIsVisible(oid)); + if (is_missing) + PG_RETURN_NULL(); + PG_RETURN_BOOL(result); } Datum pg_ts_parser_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); + bool result; + bool is_missing = false; - if (!SearchSysCacheExists1(TSPARSEROID, ObjectIdGetDatum(oid))) - PG_RETURN_NULL(); + result = TSParserIsVisibleExt(oid, &is_missing); - PG_RETURN_BOOL(TSParserIsVisible(oid)); + if (is_missing) + PG_RETURN_NULL(); + PG_RETURN_BOOL(result); } Datum pg_ts_dict_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); + bool result; + bool is_missing = false; - if (!SearchSysCacheExists1(TSDICTOID, ObjectIdGetDatum(oid))) - PG_RETURN_NULL(); + result = TSDictionaryIsVisibleExt(oid, &is_missing); - PG_RETURN_BOOL(TSDictionaryIsVisible(oid)); + if (is_missing) + PG_RETURN_NULL(); + PG_RETURN_BOOL(result); } Datum pg_ts_template_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); + bool result; + bool is_missing = false; - if (!SearchSysCacheExists1(TSTEMPLATEOID, ObjectIdGetDatum(oid))) - PG_RETURN_NULL(); + result = TSTemplateIsVisibleExt(oid, &is_missing); - PG_RETURN_BOOL(TSTemplateIsVisible(oid)); + if (is_missing) + PG_RETURN_NULL(); + PG_RETURN_BOOL(result); } Datum pg_ts_config_is_visible(PG_FUNCTION_ARGS) { Oid oid = PG_GETARG_OID(0); + bool result; + bool is_missing = false; - if (!SearchSysCacheExists1(TSCONFIGOID, ObjectIdGetDatum(oid))) - PG_RETURN_NULL(); + result = TSConfigIsVisibleExt(oid, &is_missing); - PG_RETURN_BOOL(TSConfigIsVisible(oid)); + if (is_missing) + PG_RETURN_NULL(); + PG_RETURN_BOOL(result); } Datum diff --git a/src/backend/catalog/objectaccess.c b/src/backend/catalog/objectaccess.c index 2181978d2d046..0e606ddd895f3 100644 --- a/src/backend/catalog/objectaccess.c +++ b/src/backend/catalog/objectaccess.c @@ -3,7 +3,7 @@ * objectaccess.c * functions for object_access_hook on various events * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * ------------------------------------------------------------------------- diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index 95fefc7565bfb..bbd9b78050d61 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -3,7 +3,7 @@ * objectaddress.c * functions for working with ObjectAddresses * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,7 +18,6 @@ #include "access/genam.h" #include "access/htup_details.h" #include "access/relation.h" -#include "access/sysattr.h" #include "access/table.h" #include "catalog/catalog.h" #include "catalog/objectaddress.h" @@ -34,7 +33,6 @@ #include "catalog/pg_conversion.h" #include "catalog/pg_database.h" #include "catalog/pg_default_acl.h" -#include "catalog/pg_enum.h" #include "catalog/pg_event_trigger.h" #include "catalog/pg_extension.h" #include "catalog/pg_foreign_data_wrapper.h" @@ -75,7 +73,6 @@ #include "foreign/foreign.h" #include "funcapi.h" #include "miscadmin.h" -#include "nodes/makefuncs.h" #include "parser/parse_func.h" #include "parser/parse_oper.h" #include "parser/parse_type.h" @@ -132,7 +129,7 @@ static const ObjectPropertyType ObjectProperty[] = InvalidAttrNumber, InvalidAttrNumber, InvalidAttrNumber, - -1, + OBJECT_ACCESS_METHOD, true }, { @@ -174,7 +171,7 @@ static const ObjectPropertyType ObjectProperty[] = InvalidAttrNumber, InvalidAttrNumber, InvalidAttrNumber, - -1, + OBJECT_CAST, false }, { @@ -384,7 +381,7 @@ static const ObjectPropertyType ObjectProperty[] = InvalidAttrNumber, InvalidAttrNumber, InvalidAttrNumber, - -1, + OBJECT_ROLE, true }, { @@ -412,7 +409,7 @@ static const ObjectPropertyType ObjectProperty[] = InvalidAttrNumber, InvalidAttrNumber, InvalidAttrNumber, - -1, + OBJECT_RULE, false }, { @@ -462,8 +459,14 @@ static const ObjectPropertyType ObjectProperty[] = TransformRelationId, TransformOidIndexId, TRFOID, + -1, + Anum_pg_transform_oid, InvalidAttrNumber, - Anum_pg_transform_oid + InvalidAttrNumber, + InvalidAttrNumber, + InvalidAttrNumber, + OBJECT_TRANSFORM, + false }, { "trigger", @@ -476,7 +479,7 @@ static const ObjectPropertyType ObjectProperty[] = InvalidAttrNumber, InvalidAttrNumber, InvalidAttrNumber, - -1, + OBJECT_TRIGGER, false }, { @@ -490,7 +493,7 @@ static const ObjectPropertyType ObjectProperty[] = InvalidAttrNumber, InvalidAttrNumber, InvalidAttrNumber, - -1, + OBJECT_POLICY, false }, { @@ -546,7 +549,7 @@ static const ObjectPropertyType ObjectProperty[] = Anum_pg_ts_parser_prsnamespace, InvalidAttrNumber, InvalidAttrNumber, - -1, + OBJECT_TSPARSER, true }, { @@ -560,7 +563,7 @@ static const ObjectPropertyType ObjectProperty[] = Anum_pg_ts_template_tmplnamespace, InvalidAttrNumber, InvalidAttrNumber, - -1, + OBJECT_TSTEMPLATE, true, }, { @@ -652,7 +655,6 @@ static const struct object_type_map ObjectTypeMap[] = { - /* OCLASS_CLASS, all kinds of relations */ { "table", OBJECT_TABLE }, @@ -701,7 +703,6 @@ static const struct object_type_map { "foreign table column", OBJECT_COLUMN }, - /* OCLASS_PROC */ { "aggregate", OBJECT_AGGREGATE }, @@ -711,162 +712,123 @@ static const struct object_type_map { "procedure", OBJECT_PROCEDURE }, - /* OCLASS_TYPE */ { "type", OBJECT_TYPE }, - /* OCLASS_CAST */ { "cast", OBJECT_CAST }, - /* OCLASS_COLLATION */ { "collation", OBJECT_COLLATION }, - /* OCLASS_CONSTRAINT */ { "table constraint", OBJECT_TABCONSTRAINT }, { "domain constraint", OBJECT_DOMCONSTRAINT }, - /* OCLASS_CONVERSION */ { "conversion", OBJECT_CONVERSION }, - /* OCLASS_DEFAULT */ { "default value", OBJECT_DEFAULT }, - /* OCLASS_LANGUAGE */ { "language", OBJECT_LANGUAGE }, - /* OCLASS_LARGEOBJECT */ { "large object", OBJECT_LARGEOBJECT }, - /* OCLASS_OPERATOR */ { "operator", OBJECT_OPERATOR }, - /* OCLASS_OPCLASS */ { "operator class", OBJECT_OPCLASS }, - /* OCLASS_OPFAMILY */ { "operator family", OBJECT_OPFAMILY }, - /* OCLASS_AM */ { "access method", OBJECT_ACCESS_METHOD }, - /* OCLASS_AMOP */ { "operator of access method", OBJECT_AMOP }, - /* OCLASS_AMPROC */ { "function of access method", OBJECT_AMPROC }, - /* OCLASS_REWRITE */ { "rule", OBJECT_RULE }, - /* OCLASS_TRIGGER */ { "trigger", OBJECT_TRIGGER }, - /* OCLASS_SCHEMA */ { "schema", OBJECT_SCHEMA }, - /* OCLASS_TSPARSER */ { "text search parser", OBJECT_TSPARSER }, - /* OCLASS_TSDICT */ { "text search dictionary", OBJECT_TSDICTIONARY }, - /* OCLASS_TSTEMPLATE */ { "text search template", OBJECT_TSTEMPLATE }, - /* OCLASS_TSCONFIG */ { "text search configuration", OBJECT_TSCONFIGURATION }, - /* OCLASS_ROLE */ { "role", OBJECT_ROLE }, - /* OCLASS_ROLE_MEMBERSHIP */ { "role membership", -1 /* unmapped */ }, - /* OCLASS_DATABASE */ { "database", OBJECT_DATABASE }, - /* OCLASS_TBLSPACE */ { "tablespace", OBJECT_TABLESPACE }, - /* OCLASS_FDW */ { "foreign-data wrapper", OBJECT_FDW }, - /* OCLASS_FOREIGN_SERVER */ { "server", OBJECT_FOREIGN_SERVER }, - /* OCLASS_USER_MAPPING */ { "user mapping", OBJECT_USER_MAPPING }, - /* OCLASS_DEFACL */ { "default acl", OBJECT_DEFACL }, - /* OCLASS_EXTENSION */ { "extension", OBJECT_EXTENSION }, - /* OCLASS_EVENT_TRIGGER */ { "event trigger", OBJECT_EVENT_TRIGGER }, - /* OCLASS_PARAMETER_ACL */ { "parameter ACL", OBJECT_PARAMETER_ACL }, - /* OCLASS_POLICY */ { "policy", OBJECT_POLICY }, - /* OCLASS_PUBLICATION */ { "publication", OBJECT_PUBLICATION }, - /* OCLASS_PUBLICATION_NAMESPACE */ { "publication namespace", OBJECT_PUBLICATION_NAMESPACE }, - /* OCLASS_PUBLICATION_REL */ { "publication relation", OBJECT_PUBLICATION_REL }, - /* OCLASS_SUBSCRIPTION */ { "subscription", OBJECT_SUBSCRIPTION }, - /* OCLASS_TRANSFORM */ { "transform", OBJECT_TRANSFORM }, - /* OCLASS_STATISTIC_EXT */ { "statistics object", OBJECT_STATISTIC_EXT } @@ -2817,6 +2779,22 @@ get_object_property_data(Oid class_id) */ HeapTuple get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId) +{ + return + get_catalog_object_by_oid_extended(catalog, oidcol, objectId, false); +} + +/* + * Same as get_catalog_object_by_oid(), but with an additional "locktup" + * argument controlling whether to acquire a LOCKTAG_TUPLE at mode + * InplaceUpdateTupleLock. See README.tuplock section "Locking to write + * inplace-updated tables". + */ +HeapTuple +get_catalog_object_by_oid_extended(Relation catalog, + AttrNumber oidcol, + Oid objectId, + bool locktup) { HeapTuple tuple; Oid classId = RelationGetRelid(catalog); @@ -2824,7 +2802,12 @@ get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId) if (oidCacheId > 0) { - tuple = SearchSysCacheCopy1(oidCacheId, ObjectIdGetDatum(objectId)); + if (locktup) + tuple = SearchSysCacheLockedCopy1(oidCacheId, + ObjectIdGetDatum(objectId)); + else + tuple = SearchSysCacheCopy1(oidCacheId, + ObjectIdGetDatum(objectId)); if (!HeapTupleIsValid(tuple)) /* should not happen */ return NULL; } @@ -2849,6 +2832,10 @@ get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId) systable_endscan(scan); return NULL; } + + if (locktup) + LockTuple(catalog, &tuple->t_self, InplaceUpdateTupleLock); + tuple = heap_copytuple(tuple); systable_endscan(scan); @@ -2919,9 +2906,9 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) initStringInfo(&buffer); - switch (getObjectClass(object)) + switch (object->classId) { - case OCLASS_CLASS: + case RelationRelationId: if (object->objectSubId == 0) getRelationDescription(&buffer, object->objectId, missing_ok); else @@ -2944,7 +2931,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) } break; - case OCLASS_PROC: + case ProcedureRelationId: { bits16 flags = FORMAT_PROC_INVALID_AS_NULL; char *proname = format_procedure_extended(object->objectId, @@ -2957,7 +2944,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_TYPE: + case TypeRelationId: { bits16 flags = FORMAT_TYPE_INVALID_AS_NULL; char *typname = format_type_extended(object->objectId, -1, @@ -2970,7 +2957,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_CAST: + case CastRelationId: { Relation castDesc; ScanKeyData skey[1]; @@ -3012,7 +2999,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_COLLATION: + case CollationRelationId: { HeapTuple collTup; Form_pg_collation coll; @@ -3043,7 +3030,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_CONSTRAINT: + case ConstraintRelationId: { HeapTuple conTup; Form_pg_constraint con; @@ -3081,7 +3068,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_CONVERSION: + case ConversionRelationId: { HeapTuple conTup; Form_pg_conversion conv; @@ -3112,7 +3099,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_DEFAULT: + case AttrDefaultRelationId: { ObjectAddress colobject; @@ -3132,7 +3119,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_LANGUAGE: + case LanguageRelationId: { char *langname = get_language_name(object->objectId, missing_ok); @@ -3143,14 +3130,14 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_LARGEOBJECT: + case LargeObjectRelationId: if (!LargeObjectExists(object->objectId)) break; appendStringInfo(&buffer, _("large object %u"), object->objectId); break; - case OCLASS_OPERATOR: + case OperatorRelationId: { bits16 flags = FORMAT_OPERATOR_INVALID_AS_NULL; char *oprname = format_operator_extended(object->objectId, @@ -3163,7 +3150,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_OPCLASS: + case OperatorClassRelationId: { HeapTuple opcTup; Form_pg_opclass opcForm; @@ -3206,11 +3193,11 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_OPFAMILY: + case OperatorFamilyRelationId: getOpFamilyDescription(&buffer, object->objectId, missing_ok); break; - case OCLASS_AM: + case AccessMethodRelationId: { HeapTuple tup; @@ -3230,7 +3217,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_AMOP: + case AccessMethodOperatorRelationId: { Relation amopDesc; HeapTuple tup; @@ -3268,6 +3255,12 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) initStringInfo(&opfam); getOpFamilyDescription(&opfam, amopForm->amopfamily, false); + /* + * We use FORMAT_TYPE_ALLOW_INVALID here so as not to fail + * completely if the type links are dangling, which is a form + * of catalog corruption that could occur due to old bugs. + */ + /*------ translator: %d is the operator strategy (a number), the first two %s's are data type names, the third %s is the @@ -3275,8 +3268,10 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) textual form of the operator with arguments. */ appendStringInfo(&buffer, _("operator %d (%s, %s) of %s: %s"), amopForm->amopstrategy, - format_type_be(amopForm->amoplefttype), - format_type_be(amopForm->amoprighttype), + format_type_extended(amopForm->amoplefttype, + -1, FORMAT_TYPE_ALLOW_INVALID), + format_type_extended(amopForm->amoprighttype, + -1, FORMAT_TYPE_ALLOW_INVALID), opfam.data, format_operator(amopForm->amopopr)); @@ -3287,7 +3282,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_AMPROC: + case AccessMethodProcedureRelationId: { Relation amprocDesc; ScanKeyData skey[1]; @@ -3325,6 +3320,12 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) initStringInfo(&opfam); getOpFamilyDescription(&opfam, amprocForm->amprocfamily, false); + /* + * We use FORMAT_TYPE_ALLOW_INVALID here so as not to fail + * completely if the type links are dangling, which is a form + * of catalog corruption that could occur due to old bugs. + */ + /*------ translator: %d is the function number, the first two %s's are data type names, the third %s is the description of the @@ -3332,8 +3333,10 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) function with arguments. */ appendStringInfo(&buffer, _("function %d (%s, %s) of %s: %s"), amprocForm->amprocnum, - format_type_be(amprocForm->amproclefttype), - format_type_be(amprocForm->amprocrighttype), + format_type_extended(amprocForm->amproclefttype, + -1, FORMAT_TYPE_ALLOW_INVALID), + format_type_extended(amprocForm->amprocrighttype, + -1, FORMAT_TYPE_ALLOW_INVALID), opfam.data, format_procedure(amprocForm->amproc)); @@ -3344,7 +3347,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_REWRITE: + case RewriteRelationId: { Relation ruleDesc; ScanKeyData skey[1]; @@ -3390,7 +3393,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_TRIGGER: + case TriggerRelationId: { Relation trigDesc; ScanKeyData skey[1]; @@ -3436,7 +3439,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_SCHEMA: + case NamespaceRelationId: { char *nspname; @@ -3452,7 +3455,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_STATISTIC_EXT: + case StatisticExtRelationId: { HeapTuple stxTup; Form_pg_statistic_ext stxForm; @@ -3484,7 +3487,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_TSPARSER: + case TSParserRelationId: { HeapTuple tup; Form_pg_ts_parser prsForm; @@ -3514,7 +3517,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_TSDICT: + case TSDictionaryRelationId: { HeapTuple tup; Form_pg_ts_dict dictForm; @@ -3545,7 +3548,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_TSTEMPLATE: + case TSTemplateRelationId: { HeapTuple tup; Form_pg_ts_template tmplForm; @@ -3576,7 +3579,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_TSCONFIG: + case TSConfigRelationId: { HeapTuple tup; Form_pg_ts_config cfgForm; @@ -3607,7 +3610,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_ROLE: + case AuthIdRelationId: { char *username = GetUserNameFromId(object->objectId, missing_ok); @@ -3617,7 +3620,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_ROLE_MEMBERSHIP: + case AuthMemRelationId: { Relation amDesc; ScanKeyData skey[1]; @@ -3659,7 +3662,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_DATABASE: + case DatabaseRelationId: { char *datname; @@ -3675,7 +3678,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_TBLSPACE: + case TableSpaceRelationId: { char *tblspace; @@ -3691,7 +3694,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_FDW: + case ForeignDataWrapperRelationId: { ForeignDataWrapper *fdw; @@ -3702,7 +3705,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_FOREIGN_SERVER: + case ForeignServerRelationId: { ForeignServer *srv; @@ -3712,7 +3715,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_USER_MAPPING: + case UserMappingRelationId: { HeapTuple tup; Oid useid; @@ -3746,7 +3749,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_DEFACL: + case DefaultAclRelationId: { Relation defaclrel; ScanKeyData skey[1]; @@ -3854,7 +3857,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_EXTENSION: + case ExtensionRelationId: { char *extname; @@ -3870,7 +3873,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_EVENT_TRIGGER: + case EventTriggerRelationId: { HeapTuple tup; @@ -3889,7 +3892,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_PARAMETER_ACL: + case ParameterAclRelationId: { HeapTuple tup; Datum nameDatum; @@ -3912,7 +3915,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_POLICY: + case PolicyRelationId: { Relation policy_rel; ScanKeyData skey[1]; @@ -3958,7 +3961,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_PUBLICATION: + case PublicationRelationId: { char *pubname = get_publication_name(object->objectId, missing_ok); @@ -3968,7 +3971,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_PUBLICATION_NAMESPACE: + case PublicationNamespaceRelationId: { char *pubname; char *nspname; @@ -3984,7 +3987,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_PUBLICATION_REL: + case PublicationRelRelationId: { HeapTuple tup; char *pubname; @@ -4015,7 +4018,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_SUBSCRIPTION: + case SubscriptionRelationId: { char *subname = get_subscription_name(object->objectId, missing_ok); @@ -4025,7 +4028,7 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - case OCLASS_TRANSFORM: + case TransformRelationId: { HeapTuple trfTup; Form_pg_transform trfForm; @@ -4050,10 +4053,8 @@ getObjectDescription(const ObjectAddress *object, bool missing_ok) break; } - /* - * There's intentionally no default: case here; we want the - * compiler to warn if a new OCLASS hasn't been handled above. - */ + default: + elog(ERROR, "unsupported object class: %u", object->classId); } /* an empty buffer is equivalent to no object found */ @@ -4415,180 +4416,178 @@ getObjectTypeDescription(const ObjectAddress *object, bool missing_ok) initStringInfo(&buffer); - switch (getObjectClass(object)) + switch (object->classId) { - case OCLASS_CLASS: + case RelationRelationId: getRelationTypeDescription(&buffer, object->objectId, object->objectSubId, missing_ok); break; - case OCLASS_PROC: + case ProcedureRelationId: getProcedureTypeDescription(&buffer, object->objectId, missing_ok); break; - case OCLASS_TYPE: + case TypeRelationId: appendStringInfoString(&buffer, "type"); break; - case OCLASS_CAST: + case CastRelationId: appendStringInfoString(&buffer, "cast"); break; - case OCLASS_COLLATION: + case CollationRelationId: appendStringInfoString(&buffer, "collation"); break; - case OCLASS_CONSTRAINT: + case ConstraintRelationId: getConstraintTypeDescription(&buffer, object->objectId, missing_ok); break; - case OCLASS_CONVERSION: + case ConversionRelationId: appendStringInfoString(&buffer, "conversion"); break; - case OCLASS_DEFAULT: + case AttrDefaultRelationId: appendStringInfoString(&buffer, "default value"); break; - case OCLASS_LANGUAGE: + case LanguageRelationId: appendStringInfoString(&buffer, "language"); break; - case OCLASS_LARGEOBJECT: + case LargeObjectRelationId: appendStringInfoString(&buffer, "large object"); break; - case OCLASS_OPERATOR: + case OperatorRelationId: appendStringInfoString(&buffer, "operator"); break; - case OCLASS_OPCLASS: + case OperatorClassRelationId: appendStringInfoString(&buffer, "operator class"); break; - case OCLASS_OPFAMILY: + case OperatorFamilyRelationId: appendStringInfoString(&buffer, "operator family"); break; - case OCLASS_AM: + case AccessMethodRelationId: appendStringInfoString(&buffer, "access method"); break; - case OCLASS_AMOP: + case AccessMethodOperatorRelationId: appendStringInfoString(&buffer, "operator of access method"); break; - case OCLASS_AMPROC: + case AccessMethodProcedureRelationId: appendStringInfoString(&buffer, "function of access method"); break; - case OCLASS_REWRITE: + case RewriteRelationId: appendStringInfoString(&buffer, "rule"); break; - case OCLASS_TRIGGER: + case TriggerRelationId: appendStringInfoString(&buffer, "trigger"); break; - case OCLASS_SCHEMA: + case NamespaceRelationId: appendStringInfoString(&buffer, "schema"); break; - case OCLASS_STATISTIC_EXT: + case StatisticExtRelationId: appendStringInfoString(&buffer, "statistics object"); break; - case OCLASS_TSPARSER: + case TSParserRelationId: appendStringInfoString(&buffer, "text search parser"); break; - case OCLASS_TSDICT: + case TSDictionaryRelationId: appendStringInfoString(&buffer, "text search dictionary"); break; - case OCLASS_TSTEMPLATE: + case TSTemplateRelationId: appendStringInfoString(&buffer, "text search template"); break; - case OCLASS_TSCONFIG: + case TSConfigRelationId: appendStringInfoString(&buffer, "text search configuration"); break; - case OCLASS_ROLE: + case AuthIdRelationId: appendStringInfoString(&buffer, "role"); break; - case OCLASS_ROLE_MEMBERSHIP: + case AuthMemRelationId: appendStringInfoString(&buffer, "role membership"); break; - case OCLASS_DATABASE: + case DatabaseRelationId: appendStringInfoString(&buffer, "database"); break; - case OCLASS_TBLSPACE: + case TableSpaceRelationId: appendStringInfoString(&buffer, "tablespace"); break; - case OCLASS_FDW: + case ForeignDataWrapperRelationId: appendStringInfoString(&buffer, "foreign-data wrapper"); break; - case OCLASS_FOREIGN_SERVER: + case ForeignServerRelationId: appendStringInfoString(&buffer, "server"); break; - case OCLASS_USER_MAPPING: + case UserMappingRelationId: appendStringInfoString(&buffer, "user mapping"); break; - case OCLASS_DEFACL: + case DefaultAclRelationId: appendStringInfoString(&buffer, "default acl"); break; - case OCLASS_EXTENSION: + case ExtensionRelationId: appendStringInfoString(&buffer, "extension"); break; - case OCLASS_EVENT_TRIGGER: + case EventTriggerRelationId: appendStringInfoString(&buffer, "event trigger"); break; - case OCLASS_PARAMETER_ACL: + case ParameterAclRelationId: appendStringInfoString(&buffer, "parameter ACL"); break; - case OCLASS_POLICY: + case PolicyRelationId: appendStringInfoString(&buffer, "policy"); break; - case OCLASS_PUBLICATION: + case PublicationRelationId: appendStringInfoString(&buffer, "publication"); break; - case OCLASS_PUBLICATION_NAMESPACE: + case PublicationNamespaceRelationId: appendStringInfoString(&buffer, "publication namespace"); break; - case OCLASS_PUBLICATION_REL: + case PublicationRelRelationId: appendStringInfoString(&buffer, "publication relation"); break; - case OCLASS_SUBSCRIPTION: + case SubscriptionRelationId: appendStringInfoString(&buffer, "subscription"); break; - case OCLASS_TRANSFORM: + case TransformRelationId: appendStringInfoString(&buffer, "transform"); break; - /* - * There's intentionally no default: case here; we want the - * compiler to warn if a new OCLASS hasn't been handled above. - */ + default: + elog(ERROR, "unsupported object class: %u", object->classId); } /* the result can never be empty */ @@ -4774,9 +4773,9 @@ getObjectIdentityParts(const ObjectAddress *object, *objargs = NIL; } - switch (getObjectClass(object)) + switch (object->classId) { - case OCLASS_CLASS: + case RelationRelationId: { char *attr = NULL; @@ -4809,7 +4808,7 @@ getObjectIdentityParts(const ObjectAddress *object, } break; - case OCLASS_PROC: + case ProcedureRelationId: { bits16 flags = FORMAT_PROC_FORCE_QUALIFY | FORMAT_PROC_INVALID_AS_NULL; char *proname = format_procedure_extended(object->objectId, @@ -4825,7 +4824,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_TYPE: + case TypeRelationId: { bits16 flags = FORMAT_TYPE_INVALID_AS_NULL | FORMAT_TYPE_FORCE_QUALIFY; char *typeout; @@ -4841,7 +4840,7 @@ getObjectIdentityParts(const ObjectAddress *object, } break; - case OCLASS_CAST: + case CastRelationId: { Relation castRel; HeapTuple tup; @@ -4878,7 +4877,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_COLLATION: + case CollationRelationId: { HeapTuple collTup; Form_pg_collation coll; @@ -4905,7 +4904,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_CONSTRAINT: + case ConstraintRelationId: { HeapTuple conTup; Form_pg_constraint con; @@ -4952,7 +4951,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_CONVERSION: + case ConversionRelationId: { HeapTuple conTup; Form_pg_conversion conForm; @@ -4979,7 +4978,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_DEFAULT: + case AttrDefaultRelationId: { ObjectAddress colobject; @@ -5000,7 +4999,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_LANGUAGE: + case LanguageRelationId: { HeapTuple langTup; Form_pg_language langForm; @@ -5022,7 +5021,8 @@ getObjectIdentityParts(const ObjectAddress *object, ReleaseSysCache(langTup); break; } - case OCLASS_LARGEOBJECT: + + case LargeObjectRelationId: if (!LargeObjectExists(object->objectId)) break; appendStringInfo(&buffer, "%u", @@ -5031,7 +5031,7 @@ getObjectIdentityParts(const ObjectAddress *object, *objname = list_make1(psprintf("%u", object->objectId)); break; - case OCLASS_OPERATOR: + case OperatorRelationId: { bits16 flags = FORMAT_OPERATOR_FORCE_QUALIFY | FORMAT_OPERATOR_INVALID_AS_NULL; char *oprname = format_operator_extended(object->objectId, @@ -5046,7 +5046,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_OPCLASS: + case OperatorClassRelationId: { HeapTuple opcTup; Form_pg_opclass opcForm; @@ -5087,12 +5087,12 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_OPFAMILY: + case OperatorFamilyRelationId: getOpFamilyIdentity(&buffer, object->objectId, objname, missing_ok); break; - case OCLASS_AM: + case AccessMethodRelationId: { char *amname; @@ -5110,7 +5110,7 @@ getObjectIdentityParts(const ObjectAddress *object, } break; - case OCLASS_AMOP: + case AccessMethodOperatorRelationId: { Relation amopDesc; HeapTuple tup; @@ -5172,7 +5172,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_AMPROC: + case AccessMethodProcedureRelationId: { Relation amprocDesc; ScanKeyData skey[1]; @@ -5234,7 +5234,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_REWRITE: + case RewriteRelationId: { Relation ruleDesc; HeapTuple tup; @@ -5267,7 +5267,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_TRIGGER: + case TriggerRelationId: { Relation trigDesc; HeapTuple tup; @@ -5300,7 +5300,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_SCHEMA: + case NamespaceRelationId: { char *nspname; @@ -5319,7 +5319,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_STATISTIC_EXT: + case StatisticExtRelationId: { HeapTuple tup; Form_pg_statistic_ext formStatistic; @@ -5346,7 +5346,7 @@ getObjectIdentityParts(const ObjectAddress *object, } break; - case OCLASS_TSPARSER: + case TSParserRelationId: { HeapTuple tup; Form_pg_ts_parser formParser; @@ -5373,7 +5373,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_TSDICT: + case TSDictionaryRelationId: { HeapTuple tup; Form_pg_ts_dict formDict; @@ -5400,7 +5400,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_TSTEMPLATE: + case TSTemplateRelationId: { HeapTuple tup; Form_pg_ts_template formTmpl; @@ -5427,7 +5427,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_TSCONFIG: + case TSConfigRelationId: { HeapTuple tup; Form_pg_ts_config formCfg; @@ -5454,7 +5454,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_ROLE: + case AuthIdRelationId: { char *username; @@ -5468,7 +5468,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_ROLE_MEMBERSHIP: + case AuthMemRelationId: { Relation authMemDesc; ScanKeyData skey[1]; @@ -5511,7 +5511,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_DATABASE: + case DatabaseRelationId: { char *datname; @@ -5530,7 +5530,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_TBLSPACE: + case TableSpaceRelationId: { char *tblspace; @@ -5549,7 +5549,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_FDW: + case ForeignDataWrapperRelationId: { ForeignDataWrapper *fdw; @@ -5564,7 +5564,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_FOREIGN_SERVER: + case ForeignServerRelationId: { ForeignServer *srv; @@ -5580,7 +5580,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_USER_MAPPING: + case UserMappingRelationId: { HeapTuple tup; Oid useid; @@ -5620,7 +5620,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_DEFACL: + case DefaultAclRelationId: { Relation defaclrel; ScanKeyData skey[1]; @@ -5707,7 +5707,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_EXTENSION: + case ExtensionRelationId: { char *extname; @@ -5725,7 +5725,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_EVENT_TRIGGER: + case EventTriggerRelationId: { HeapTuple tup; Form_pg_event_trigger trigForm; @@ -5749,7 +5749,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_PARAMETER_ACL: + case ParameterAclRelationId: { HeapTuple tup; Datum nameDatum; @@ -5774,7 +5774,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_POLICY: + case PolicyRelationId: { Relation polDesc; HeapTuple tup; @@ -5807,7 +5807,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_PUBLICATION: + case PublicationRelationId: { char *pubname; @@ -5822,7 +5822,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_PUBLICATION_NAMESPACE: + case PublicationNamespaceRelationId: { char *pubname; char *nspname; @@ -5846,7 +5846,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_PUBLICATION_REL: + case PublicationRelRelationId: { HeapTuple tup; char *pubname; @@ -5875,7 +5875,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_SUBSCRIPTION: + case SubscriptionRelationId: { char *subname; @@ -5890,7 +5890,7 @@ getObjectIdentityParts(const ObjectAddress *object, break; } - case OCLASS_TRANSFORM: + case TransformRelationId: { Relation transformDesc; HeapTuple tup; @@ -5932,10 +5932,8 @@ getObjectIdentityParts(const ObjectAddress *object, } break; - /* - * There's intentionally no default: case here; we want the - * compiler to warn if a new OCLASS hasn't been handled above. - */ + default: + elog(ERROR, "unsupported object class: %u", object->classId); } if (!missing_ok) @@ -5946,8 +5944,8 @@ getObjectIdentityParts(const ObjectAddress *object, * cases above leave it as NIL. */ if (objname && *objname == NIL) - elog(ERROR, "requested object address for unsupported object class %d: text result \"%s\"", - (int) getObjectClass(object), buffer.data); + elog(ERROR, "requested object address for unsupported object class %u: text result \"%s\"", + object->classId, buffer.data); } else { diff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c index f8780ce57da0d..018aad445d174 100644 --- a/src/backend/catalog/partition.c +++ b/src/backend/catalog/partition.c @@ -3,7 +3,7 @@ * partition.c * Partitioning related data structures and functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,7 +25,6 @@ #include "catalog/pg_partitioned_table.h" #include "nodes/makefuncs.h" #include "optimizer/optimizer.h" -#include "partitioning/partbounds.h" #include "rewrite/rewriteManip.h" #include "utils/fmgroids.h" #include "utils/partcache.h" @@ -123,7 +122,9 @@ get_partition_parent_worker(Relation inhRel, Oid relid, bool *detach_pending) * get_partition_ancestors * Obtain ancestors of given relation * - * Returns a list of ancestors of the given relation. + * Returns a list of ancestors of the given relation. The list is ordered: + * The first element is the immediate parent and the last one is the topmost + * parent in the partition hierarchy. * * Note: Because this function assumes that the relation whose OID is passed * as an argument and each ancestor will have precisely one parent, it should diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c index ebc44547432b3..90fc7db949f5c 100644 --- a/src/backend/catalog/pg_aggregate.c +++ b/src/backend/catalog/pg_aggregate.c @@ -3,7 +3,7 @@ * pg_aggregate.c * routines to support manipulation of the pg_aggregate relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/catalog/pg_attrdef.c b/src/backend/catalog/pg_attrdef.c index ade0b6d8e6705..65296bd9e0555 100644 --- a/src/backend/catalog/pg_attrdef.c +++ b/src/backend/catalog/pg_attrdef.c @@ -3,7 +3,7 @@ * pg_attrdef.c * routines to support manipulation of the pg_attrdef relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -120,6 +120,12 @@ StoreAttrDefault(Relation rel, AttrNumber attnum, valuesAtt[Anum_pg_attribute_atthasdef - 1] = true; replacesAtt[Anum_pg_attribute_atthasdef - 1] = true; + /* + * Note: this code is dead so far as core Postgres is concerned, + * because no caller passes add_column_mode = true anymore. We keep + * it in back branches on the slight chance that some extension is + * depending on it. + */ if (rel->rd_rel->relkind == RELKIND_RELATION && add_column_mode && !attgenerated) { diff --git a/src/backend/catalog/pg_cast.c b/src/backend/catalog/pg_cast.c index 1fee83c71bf2b..5a5b855d51415 100644 --- a/src/backend/catalog/pg_cast.c +++ b/src/backend/catalog/pg_cast.c @@ -3,7 +3,7 @@ * pg_cast.c * routines to support manipulation of the pg_cast relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/catalog/pg_class.c b/src/backend/catalog/pg_class.c index d9921ad70c8a0..e05b0bbb2e025 100644 --- a/src/backend/catalog/pg_class.c +++ b/src/backend/catalog/pg_class.c @@ -3,7 +3,7 @@ * pg_class.c * routines to support manipulation of the pg_class relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/catalog/pg_collation.c b/src/backend/catalog/pg_collation.c index fd022e6fc2885..7f2f7012299df 100644 --- a/src/backend/catalog/pg_collation.c +++ b/src/backend/catalog/pg_collation.c @@ -3,7 +3,7 @@ * pg_collation.c * routines to support manipulation of the pg_collation relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -14,9 +14,7 @@ */ #include "postgres.h" -#include "access/genam.h" #include "access/htup_details.h" -#include "access/sysattr.h" #include "access/table.h" #include "catalog/catalog.h" #include "catalog/dependency.h" @@ -26,8 +24,6 @@ #include "catalog/pg_namespace.h" #include "mb/pg_wchar.h" #include "utils/builtins.h" -#include "utils/fmgroids.h" -#include "utils/pg_locale.h" #include "utils/rel.h" #include "utils/syscache.h" @@ -49,7 +45,7 @@ CollationCreate(const char *collname, Oid collnamespace, bool collisdeterministic, int32 collencoding, const char *collcollate, const char *collctype, - const char *colliculocale, + const char *colllocale, const char *collicurules, const char *collversion, bool if_not_exists, @@ -68,7 +64,10 @@ CollationCreate(const char *collname, Oid collnamespace, Assert(collname); Assert(collnamespace); Assert(collowner); - Assert((collcollate && collctype) || colliculocale); + Assert((collprovider == COLLPROVIDER_LIBC && + collcollate && collctype && !colllocale) || + (collprovider != COLLPROVIDER_LIBC && + !collcollate && !collctype && colllocale)); /* * Make sure there is no existing collation of same name & encoding. @@ -191,10 +190,10 @@ CollationCreate(const char *collname, Oid collnamespace, values[Anum_pg_collation_collctype - 1] = CStringGetTextDatum(collctype); else nulls[Anum_pg_collation_collctype - 1] = true; - if (colliculocale) - values[Anum_pg_collation_colliculocale - 1] = CStringGetTextDatum(colliculocale); + if (colllocale) + values[Anum_pg_collation_colllocale - 1] = CStringGetTextDatum(colllocale); else - nulls[Anum_pg_collation_colliculocale - 1] = true; + nulls[Anum_pg_collation_colllocale - 1] = true; if (collicurules) values[Anum_pg_collation_collicurules - 1] = CStringGetTextDatum(collicurules); else diff --git a/src/backend/catalog/pg_constraint.c b/src/backend/catalog/pg_constraint.c index 4002317f70502..b6fd46b019fee 100644 --- a/src/backend/catalog/pg_constraint.c +++ b/src/backend/catalog/pg_constraint.c @@ -3,7 +3,7 @@ * pg_constraint.c * routines to support manipulation of the pg_constraint relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,7 +18,6 @@ #include "access/htup_details.h" #include "access/sysattr.h" #include "access/table.h" -#include "access/xact.h" #include "catalog/catalog.h" #include "catalog/dependency.h" #include "catalog/indexing.h" @@ -27,7 +26,6 @@ #include "catalog/pg_operator.h" #include "catalog/pg_type.h" #include "commands/defrem.h" -#include "commands/tablecmds.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/fmgroids.h" @@ -120,8 +118,9 @@ CreateConstraintEntry(const char *constraintName, if (foreignNKeys > 0) { Datum *fkdatums; + int nkeys = Max(foreignNKeys, numFkDeleteSetCols); - fkdatums = (Datum *) palloc(foreignNKeys * sizeof(Datum)); + fkdatums = (Datum *) palloc(nkeys * sizeof(Datum)); for (i = 0; i < foreignNKeys; i++) fkdatums[i] = Int16GetDatum(foreignKey[i]); confkeyArray = construct_array_builtin(fkdatums, foreignNKeys, INT2OID); @@ -562,6 +561,50 @@ ChooseConstraintName(const char *name1, const char *name2, return conname; } +/* + * Find and return the pg_constraint tuple that implements a validated + * not-null constraint for the given domain. + */ +HeapTuple +findDomainNotNullConstraint(Oid typid) +{ + Relation pg_constraint; + HeapTuple conTup, + retval = NULL; + SysScanDesc scan; + ScanKeyData key; + + pg_constraint = table_open(ConstraintRelationId, AccessShareLock); + ScanKeyInit(&key, + Anum_pg_constraint_contypid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(typid)); + scan = systable_beginscan(pg_constraint, ConstraintRelidTypidNameIndexId, + true, NULL, 1, &key); + + while (HeapTupleIsValid(conTup = systable_getnext(scan))) + { + Form_pg_constraint con = (Form_pg_constraint) GETSTRUCT(conTup); + + /* + * We're looking for a NOTNULL constraint that's marked validated. + */ + if (con->contype != CONSTRAINT_NOTNULL) + continue; + if (!con->convalidated) + continue; + + /* Found it */ + retval = heap_copytuple(conTup); + break; + } + + systable_endscan(scan); + table_close(pg_constraint, AccessShareLock); + + return retval; +} + /* * Delete a single constraint record. */ @@ -990,7 +1033,7 @@ get_relation_constraint_attnos(Oid relid, const char *conname, /* * Return the OID of the constraint enforced by the given index in the - * given relation; or InvalidOid if no such index is catalogued. + * given relation; or InvalidOid if no such index is cataloged. * * Much like get_constraint_index, this function is concerned only with the * one constraint that "owns" the given index. Therefore, constraints of diff --git a/src/backend/catalog/pg_conversion.c b/src/backend/catalog/pg_conversion.c index 65e9f355d2178..0770878eac582 100644 --- a/src/backend/catalog/pg_conversion.c +++ b/src/backend/catalog/pg_conversion.c @@ -3,7 +3,7 @@ * pg_conversion.c * routines to support manipulation of the pg_conversion relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -14,10 +14,8 @@ */ #include "postgres.h" -#include "access/heapam.h" #include "access/htup_details.h" -#include "access/sysattr.h" -#include "access/tableam.h" +#include "access/table.h" #include "catalog/catalog.h" #include "catalog/dependency.h" #include "catalog/indexing.h" @@ -28,7 +26,6 @@ #include "mb/pg_wchar.h" #include "utils/builtins.h" #include "utils/catcache.h" -#include "utils/fmgroids.h" #include "utils/rel.h" #include "utils/syscache.h" diff --git a/src/backend/catalog/pg_db_role_setting.c b/src/backend/catalog/pg_db_role_setting.c index 2f4267fc5fa3f..8c20f519fc05e 100644 --- a/src/backend/catalog/pg_db_role_setting.c +++ b/src/backend/catalog/pg_db_role_setting.c @@ -2,7 +2,7 @@ * pg_db_role_setting.c * Routines to support manipulation of the pg_db_role_setting relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/catalog/pg_depend.c b/src/backend/catalog/pg_depend.c index 02e0ce71a077c..cfd7ef51dfa29 100644 --- a/src/backend/catalog/pg_depend.c +++ b/src/backend/catalog/pg_depend.c @@ -3,7 +3,7 @@ * pg_depend.c * routines to support manipulation of the pg_depend relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,10 +23,12 @@ #include "catalog/pg_constraint.h" #include "catalog/pg_depend.h" #include "catalog/pg_extension.h" +#include "catalog/partition.h" #include "commands/extension.h" #include "miscadmin.h" #include "utils/fmgroids.h" #include "utils/lsyscache.h" +#include "utils/syscache.h" #include "utils/rel.h" @@ -941,10 +943,29 @@ getOwnedSequences(Oid relid) * Get owned identity sequence, error if not exactly one. */ Oid -getIdentitySequence(Oid relid, AttrNumber attnum, bool missing_ok) +getIdentitySequence(Relation rel, AttrNumber attnum, bool missing_ok) { - List *seqlist = getOwnedSequences_internal(relid, attnum, DEPENDENCY_INTERNAL); + Oid relid = RelationGetRelid(rel); + List *seqlist; + /* + * The identity sequence is associated with the topmost partitioned table, + * which might have column order different than the given partition. + */ + if (RelationGetForm(rel)->relispartition) + { + List *ancestors = get_partition_ancestors(relid); + const char *attname = get_attname(relid, attnum, false); + + relid = llast_oid(ancestors); + attnum = get_attnum(relid, attname); + if (attnum == InvalidAttrNumber) + elog(ERROR, "cache lookup failed for attribute \"%s\" of relation %u", + attname, relid); + list_free(ancestors); + } + + seqlist = getOwnedSequences_internal(relid, attnum, DEPENDENCY_INTERNAL); if (list_length(seqlist) > 1) elog(ERROR, "more than one owned sequence found"); else if (seqlist == NIL) diff --git a/src/backend/catalog/pg_enum.c b/src/backend/catalog/pg_enum.c index 3c328664b2cfa..54cededac1bf3 100644 --- a/src/backend/catalog/pg_enum.c +++ b/src/backend/catalog/pg_enum.c @@ -3,7 +3,7 @@ * pg_enum.c * routines to support manipulation of the pg_enum relation * - * Copyright (c) 2006-2023, PostgreSQL Global Development Group + * Copyright (c) 2006-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -36,17 +36,35 @@ Oid binary_upgrade_next_pg_enum_oid = InvalidOid; /* - * Hash table of enum value OIDs created during the current transaction by - * AddEnumLabel. We disallow using these values until the transaction is + * We keep two transaction-lifespan hash tables, one containing the OIDs + * of enum types made in the current transaction, and one containing the + * OIDs of enum values created during the current transaction by + * AddEnumLabel (but only if their enum type is not in the first hash). + * + * We disallow using enum values in the second hash until the transaction is * committed; otherwise, they might get into indexes where we can't clean * them up, and then if the transaction rolls back we have a broken index. * (See comments for check_safe_enum_use() in enum.c.) Values created by * EnumValuesCreate are *not* entered into the table; we assume those are * created during CREATE TYPE, so they can't go away unless the enum type * itself does. + * + * The motivation for treating enum values as safe if their type OID is + * in the first hash is to allow CREATE TYPE AS ENUM; ALTER TYPE ADD VALUE; + * followed by a use of the value in the same transaction. This pattern + * is really just as safe as creating the value during CREATE TYPE. + * We need to support this because pg_dump in binary upgrade mode produces + * commands like that. But currently we only support it when the commands + * are at the outermost transaction level, which is as much as we need for + * pg_dump. We could track subtransaction nesting of the commands to + * analyze things more precisely, but for now we don't bother. */ -static HTAB *uncommitted_enums = NULL; +static HTAB *uncommitted_enum_types = NULL; +static HTAB *uncommitted_enum_values = NULL; +static void init_uncommitted_enum_types(void); +static void init_uncommitted_enum_values(void); +static bool EnumTypeUncommitted(Oid typ_id); static void RenumberEnumType(Relation pg_enum, HeapTuple *existing, int nelems); static int sort_order_cmp(const void *p1, const void *p2); @@ -56,6 +74,11 @@ static int sort_order_cmp(const void *p1, const void *p2); * Create an entry in pg_enum for each of the supplied enum values. * * vals is a list of String values. + * + * We assume that this is called only by CREATE TYPE AS ENUM, and that it + * will be called even if the vals list is empty. So we can enter the + * enum type's OID into uncommitted_enum_types here, rather than needing + * another entry point to do it. */ void EnumValuesCreate(Oid enumTypeOid, List *vals) @@ -70,6 +93,21 @@ EnumValuesCreate(Oid enumTypeOid, List *vals) CatalogIndexState indstate; TupleTableSlot **slot; + /* + * Remember the type OID as being made in the current transaction, but not + * if we're in a subtransaction. (We could remember the OID anyway, in + * case a subsequent ALTER ADD VALUE occurs at outer level. But that + * usage pattern seems unlikely enough that we'd probably just be wasting + * hashtable maintenance effort.) + */ + if (GetCurrentTransactionNestLevel() == 1) + { + if (uncommitted_enum_types == NULL) + init_uncommitted_enum_types(); + (void) hash_search(uncommitted_enum_types, &enumTypeOid, + HASH_ENTER, NULL); + } + num_elems = list_length(vals); /* @@ -211,20 +249,37 @@ EnumValuesDelete(Oid enumTypeOid) } /* - * Initialize the uncommitted enum table for this transaction. + * Initialize the uncommitted enum types table for this transaction. + */ +static void +init_uncommitted_enum_types(void) +{ + HASHCTL hash_ctl; + + hash_ctl.keysize = sizeof(Oid); + hash_ctl.entrysize = sizeof(Oid); + hash_ctl.hcxt = TopTransactionContext; + uncommitted_enum_types = hash_create("Uncommitted enum types", + 32, + &hash_ctl, + HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); +} + +/* + * Initialize the uncommitted enum values table for this transaction. */ static void -init_uncommitted_enums(void) +init_uncommitted_enum_values(void) { HASHCTL hash_ctl; hash_ctl.keysize = sizeof(Oid); hash_ctl.entrysize = sizeof(Oid); hash_ctl.hcxt = TopTransactionContext; - uncommitted_enums = hash_create("Uncommitted enums", - 32, - &hash_ctl, - HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); + uncommitted_enum_values = hash_create("Uncommitted enum values", + 32, + &hash_ctl, + HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); } /* @@ -520,12 +575,27 @@ AddEnumLabel(Oid enumTypeOid, table_close(pg_enum, RowExclusiveLock); - /* Set up the uncommitted enum table if not already done in this tx */ - if (uncommitted_enums == NULL) - init_uncommitted_enums(); + /* + * If the enum type itself is uncommitted, we need not enter the new enum + * value into uncommitted_enum_values, because the type won't survive if + * the value doesn't. (This is basically the same reasoning as for values + * made directly by CREATE TYPE AS ENUM.) However, apply this rule only + * when we are not inside a subtransaction; if we're more deeply nested + * than the CREATE TYPE then the conclusion doesn't hold. We could expend + * more effort to track the subtransaction level of CREATE TYPE, but for + * now we're only concerned about making the world safe for pg_dump in + * binary upgrade mode, and that won't use subtransactions. + */ + if (GetCurrentTransactionNestLevel() == 1 && + EnumTypeUncommitted(enumTypeOid)) + return; + + /* Set up the uncommitted values table if not already done in this tx */ + if (uncommitted_enum_values == NULL) + init_uncommitted_enum_values(); /* Add the new value to the table */ - (void) hash_search(uncommitted_enums, &newOid, HASH_ENTER, NULL); + (void) hash_search(uncommitted_enum_values, &newOid, HASH_ENTER, NULL); } @@ -614,19 +684,37 @@ RenameEnumLabel(Oid enumTypeOid, /* - * Test if the given enum value is in the table of uncommitted enums. + * Test if the given type OID is in the table of uncommitted enum types. + */ +static bool +EnumTypeUncommitted(Oid typ_id) +{ + bool found; + + /* If we've made no uncommitted types table, it's not in the table */ + if (uncommitted_enum_types == NULL) + return false; + + /* Else, is it in the table? */ + (void) hash_search(uncommitted_enum_types, &typ_id, HASH_FIND, &found); + return found; +} + + +/* + * Test if the given enum value is in the table of uncommitted enum values. */ bool EnumUncommitted(Oid enum_id) { bool found; - /* If we've made no uncommitted table, all values are safe */ - if (uncommitted_enums == NULL) + /* If we've made no uncommitted values table, it's not in the table */ + if (uncommitted_enum_values == NULL) return false; /* Else, is it in the table? */ - (void) hash_search(uncommitted_enums, &enum_id, HASH_FIND, &found); + (void) hash_search(uncommitted_enum_values, &enum_id, HASH_FIND, &found); return found; } @@ -638,11 +726,12 @@ void AtEOXact_Enum(void) { /* - * Reset the uncommitted table, as all our enum values are now committed. - * The memory will go away automatically when TopTransactionContext is - * freed; it's sufficient to clear our pointer. + * Reset the uncommitted tables, as all our tuples are now committed. The + * memory will go away automatically when TopTransactionContext is freed; + * it's sufficient to clear our pointers. */ - uncommitted_enums = NULL; + uncommitted_enum_types = NULL; + uncommitted_enum_values = NULL; } @@ -723,15 +812,15 @@ sort_order_cmp(const void *p1, const void *p2) Size EstimateUncommittedEnumsSpace(void) { - size_t entries; + size_t entries = 0; - if (uncommitted_enums) - entries = hash_get_num_entries(uncommitted_enums); - else - entries = 0; + if (uncommitted_enum_types) + entries += hash_get_num_entries(uncommitted_enum_types); + if (uncommitted_enum_values) + entries += hash_get_num_entries(uncommitted_enum_values); - /* Add one for the terminator. */ - return sizeof(Oid) * (entries + 1); + /* Add two for the terminators. */ + return sizeof(Oid) * (entries + 2); } void @@ -740,30 +829,44 @@ SerializeUncommittedEnums(void *space, Size size) Oid *serialized = (Oid *) space; /* - * Make sure the hash table hasn't changed in size since the caller + * Make sure the hash tables haven't changed in size since the caller * reserved the space. */ Assert(size == EstimateUncommittedEnumsSpace()); - /* Write out all the values from the hash table, if there is one. */ - if (uncommitted_enums) + /* Write out all the OIDs from the types hash table, if there is one. */ + if (uncommitted_enum_types) { HASH_SEQ_STATUS status; Oid *value; - hash_seq_init(&status, uncommitted_enums); + hash_seq_init(&status, uncommitted_enum_types); while ((value = (Oid *) hash_seq_search(&status))) *serialized++ = *value; } /* Write out the terminator. */ - *serialized = InvalidOid; + *serialized++ = InvalidOid; + + /* Write out all the OIDs from the values hash table, if there is one. */ + if (uncommitted_enum_values) + { + HASH_SEQ_STATUS status; + Oid *value; + + hash_seq_init(&status, uncommitted_enum_values); + while ((value = (Oid *) hash_seq_search(&status))) + *serialized++ = *value; + } + + /* Write out the terminator. */ + *serialized++ = InvalidOid; /* * Make sure the amount of space we actually used matches what was * estimated. */ - Assert((char *) (serialized + 1) == ((char *) space) + size); + Assert((char *) serialized == ((char *) space) + size); } void @@ -771,20 +874,33 @@ RestoreUncommittedEnums(void *space) { Oid *serialized = (Oid *) space; - Assert(!uncommitted_enums); + Assert(!uncommitted_enum_types); + Assert(!uncommitted_enum_values); /* - * As a special case, if the list is empty then don't even bother to - * create the hash table. This is the usual case, since enum alteration - * is expected to be rare. + * If either list is empty then don't even bother to create that hash + * table. This is the common case, since most transactions don't create + * or alter enums. */ - if (!OidIsValid(*serialized)) - return; - - /* Read all the values into a new hash table. */ - init_uncommitted_enums(); - do + if (OidIsValid(*serialized)) { - hash_search(uncommitted_enums, serialized++, HASH_ENTER, NULL); - } while (OidIsValid(*serialized)); + /* Read all the types into a new hash table. */ + init_uncommitted_enum_types(); + do + { + (void) hash_search(uncommitted_enum_types, serialized++, + HASH_ENTER, NULL); + } while (OidIsValid(*serialized)); + } + serialized++; + if (OidIsValid(*serialized)) + { + /* Read all the values into a new hash table. */ + init_uncommitted_enum_values(); + do + { + (void) hash_search(uncommitted_enum_values, serialized++, + HASH_ENTER, NULL); + } while (OidIsValid(*serialized)); + } } diff --git a/src/backend/catalog/pg_inherits.c b/src/backend/catalog/pg_inherits.c index da969bd2f9eea..836b4bfd894b8 100644 --- a/src/backend/catalog/pg_inherits.c +++ b/src/backend/catalog/pg_inherits.c @@ -8,7 +8,7 @@ * Perhaps someday that code should be moved here, but it'd have to be * disentangled from other stuff such as pg_depend updates. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -28,7 +28,6 @@ #include "storage/lmgr.h" #include "utils/builtins.h" #include "utils/fmgroids.h" -#include "utils/memutils.h" #include "utils/snapmgr.h" #include "utils/syscache.h" diff --git a/src/backend/catalog/pg_largeobject.c b/src/backend/catalog/pg_largeobject.c index 5bc8b763e2741..e235f7c5e680e 100644 --- a/src/backend/catalog/pg_largeobject.c +++ b/src/backend/catalog/pg_largeobject.c @@ -3,7 +3,7 @@ * pg_largeobject.c * routines to support manipulation of the pg_largeobject relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -16,15 +16,12 @@ #include "access/genam.h" #include "access/htup_details.h" -#include "access/sysattr.h" #include "access/table.h" #include "catalog/catalog.h" -#include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/pg_largeobject.h" #include "catalog/pg_largeobject_metadata.h" #include "miscadmin.h" -#include "utils/acl.h" #include "utils/fmgroids.h" #include "utils/rel.h" diff --git a/src/backend/catalog/pg_namespace.c b/src/backend/catalog/pg_namespace.c index 697ca32d831fa..3ce6e3800919e 100644 --- a/src/backend/catalog/pg_namespace.c +++ b/src/backend/catalog/pg_namespace.c @@ -3,7 +3,7 @@ * pg_namespace.c * routines to support manipulation of the pg_namespace relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/catalog/pg_operator.c b/src/backend/catalog/pg_operator.c index 95918a77a153f..65b45a424a276 100644 --- a/src/backend/catalog/pg_operator.c +++ b/src/backend/catalog/pg_operator.c @@ -3,7 +3,7 @@ * pg_operator.c * routines to support manipulation of the pg_operator relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -44,11 +44,6 @@ static Oid OperatorGet(const char *operatorName, Oid rightObjectId, bool *defined); -static Oid OperatorLookup(List *operatorName, - Oid leftObjectId, - Oid rightObjectId, - bool *defined); - static Oid OperatorShellMake(const char *operatorName, Oid operatorNamespace, Oid leftTypeId, @@ -57,8 +52,7 @@ static Oid OperatorShellMake(const char *operatorName, static Oid get_other_operator(List *otherOp, Oid otherLeftTypeId, Oid otherRightTypeId, const char *operatorName, Oid operatorNamespace, - Oid leftTypeId, Oid rightTypeId, - bool isCommutator); + Oid leftTypeId, Oid rightTypeId); /* @@ -166,7 +160,7 @@ OperatorGet(const char *operatorName, * * *defined is set true if defined (not a shell) */ -static Oid +Oid OperatorLookup(List *operatorName, Oid leftObjectId, Oid rightObjectId, @@ -361,53 +355,17 @@ OperatorCreate(const char *operatorName, errmsg("\"%s\" is not a valid operator name", operatorName))); - if (!(OidIsValid(leftTypeId) && OidIsValid(rightTypeId))) - { - /* If it's not a binary op, these things mustn't be set: */ - if (commutatorName) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("only binary operators can have commutators"))); - if (OidIsValid(joinId)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("only binary operators can have join selectivity"))); - if (canMerge) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("only binary operators can merge join"))); - if (canHash) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("only binary operators can hash"))); - } - operResultType = get_func_rettype(procedureId); - if (operResultType != BOOLOID) - { - /* If it's not a boolean op, these things mustn't be set: */ - if (negatorName) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("only boolean operators can have negators"))); - if (OidIsValid(restrictionId)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("only boolean operators can have restriction selectivity"))); - if (OidIsValid(joinId)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("only boolean operators can have join selectivity"))); - if (canMerge) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("only boolean operators can merge join"))); - if (canHash) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("only boolean operators can hash"))); - } + OperatorValidateParams(leftTypeId, + rightTypeId, + operResultType, + commutatorName != NIL, + negatorName != NIL, + OidIsValid(restrictionId), + OidIsValid(joinId), + canMerge, + canHash); operatorObjectId = OperatorGet(operatorName, operatorNamespace, @@ -442,8 +400,7 @@ OperatorCreate(const char *operatorName, commutatorId = get_other_operator(commutatorName, rightTypeId, leftTypeId, operatorName, operatorNamespace, - leftTypeId, rightTypeId, - true); + leftTypeId, rightTypeId); /* Permission check: must own other operator */ if (OidIsValid(commutatorId) && @@ -452,8 +409,9 @@ OperatorCreate(const char *operatorName, NameListToString(commutatorName)); /* - * self-linkage to this operator; will fix below. Note that only - * self-linkage for commutation makes sense. + * If self-linkage to the new operator is requested, we'll fix it + * below. (In case of self-linkage to an existing shell operator, we + * need do nothing special.) */ if (!OidIsValid(commutatorId)) selfCommutator = true; @@ -467,14 +425,24 @@ OperatorCreate(const char *operatorName, negatorId = get_other_operator(negatorName, leftTypeId, rightTypeId, operatorName, operatorNamespace, - leftTypeId, rightTypeId, - false); + leftTypeId, rightTypeId); /* Permission check: must own other operator */ if (OidIsValid(negatorId) && !object_ownercheck(OperatorRelationId, negatorId, GetUserId())) aclcheck_error(ACLCHECK_NOT_OWNER, OBJECT_OPERATOR, NameListToString(negatorName)); + + /* + * Prevent self negation, as it doesn't make sense. It's self + * negation if result is InvalidOid (negator would be the same + * operator but it doesn't exist yet) or operatorObjectId (we are + * replacing a shell that would need to be its own negator). + */ + if (!OidIsValid(negatorId) || negatorId == operatorObjectId) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("operator cannot be its own negator"))); } else negatorId = InvalidOid; @@ -548,11 +516,6 @@ OperatorCreate(const char *operatorName, /* Add dependencies for the entry */ address = makeOperatorDependencies(tup, true, isUpdate); - /* Post creation hook for new operator */ - InvokeObjectPostCreateHook(OperatorRelationId, operatorObjectId, 0); - - table_close(pg_operator_desc, RowExclusiveLock); - /* * If a commutator and/or negator link is provided, update the other * operator(s) to point at this one, if they don't already have a link. @@ -570,21 +533,95 @@ OperatorCreate(const char *operatorName, if (OidIsValid(commutatorId) || OidIsValid(negatorId)) OperatorUpd(operatorObjectId, commutatorId, negatorId, false); + /* Post creation hook for new operator */ + InvokeObjectPostCreateHook(OperatorRelationId, operatorObjectId, 0); + + table_close(pg_operator_desc, RowExclusiveLock); + return address; } /* - * Try to lookup another operator (commutator, etc) + * OperatorValidateParams * - * If not found, check to see if it is exactly the operator we are trying - * to define; if so, return InvalidOid. (Note that this case is only - * sensible for a commutator, so we error out otherwise.) If it is not - * the same operator, create a shell operator. + * Check that an operator with argument types leftTypeId and rightTypeId, + * returning operResultType, can have the attributes that are set to true. + * Raise an error for any disallowed attribute. + * + * Note: in ALTER OPERATOR, we only bother to pass "true" for attributes + * the command is trying to set, not those that may already be set. + * This is OK as long as the attribute checks are independent. + */ +void +OperatorValidateParams(Oid leftTypeId, + Oid rightTypeId, + Oid operResultType, + bool hasCommutator, + bool hasNegator, + bool hasRestrictionSelectivity, + bool hasJoinSelectivity, + bool canMerge, + bool canHash) +{ + if (!(OidIsValid(leftTypeId) && OidIsValid(rightTypeId))) + { + /* If it's not a binary op, these things mustn't be set: */ + if (hasCommutator) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("only binary operators can have commutators"))); + if (hasJoinSelectivity) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("only binary operators can have join selectivity"))); + if (canMerge) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("only binary operators can merge join"))); + if (canHash) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("only binary operators can hash"))); + } + + if (operResultType != BOOLOID) + { + /* If it's not a boolean op, these things mustn't be set: */ + if (hasNegator) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("only boolean operators can have negators"))); + if (hasRestrictionSelectivity) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("only boolean operators can have restriction selectivity"))); + if (hasJoinSelectivity) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("only boolean operators can have join selectivity"))); + if (canMerge) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("only boolean operators can merge join"))); + if (canHash) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("only boolean operators can hash"))); + } +} + +/* + * Try to lookup another operator (commutator, etc); return its OID + * + * If not found, check to see if it would be the same operator we are trying + * to define; if so, return InvalidOid. (Caller must decide whether + * that is sensible.) If it is not the same operator, create a shell + * operator. */ static Oid get_other_operator(List *otherOp, Oid otherLeftTypeId, Oid otherRightTypeId, const char *operatorName, Oid operatorNamespace, - Oid leftTypeId, Oid rightTypeId, bool isCommutator) + Oid leftTypeId, Oid rightTypeId) { Oid other_oid; bool otherDefined; @@ -611,14 +648,7 @@ get_other_operator(List *otherOp, Oid otherLeftTypeId, Oid otherRightTypeId, otherLeftTypeId == leftTypeId && otherRightTypeId == rightTypeId) { - /* - * self-linkage to this operator; caller will fix later. Note that - * only self-linkage for commutation makes sense. - */ - if (!isCommutator) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("operator cannot be its own negator or sort operator"))); + /* self-linkage to new operator; caller must handle this */ return InvalidOid; } @@ -643,7 +673,7 @@ get_other_operator(List *otherOp, Oid otherLeftTypeId, Oid otherRightTypeId, * For a given operator, look up its negator and commutator operators. * When isDelete is false, update their negator and commutator fields to * point back to the given operator; when isDelete is true, update those - * fields to no longer point back to the given operator. + * fields to be InvalidOid. * * The !isDelete case solves a problem for users who need to insert two new * operators that are the negator or commutator of each other, while the @@ -681,17 +711,40 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId, bool isDelete) bool update_commutator = false; /* - * Out of due caution, we only change the commutator's oprcom field if - * it has the exact value we expected: InvalidOid when creating an - * operator, or baseId when dropping one. + * We can skip doing anything if the commutator's oprcom field is + * already what we want. While that's not expected in the isDelete + * case, it's perfectly possible when filling in a shell operator. */ - if (isDelete && t->oprcom == baseId) + if (isDelete && OidIsValid(t->oprcom)) { t->oprcom = InvalidOid; update_commutator = true; } - else if (!isDelete && !OidIsValid(t->oprcom)) + else if (!isDelete && t->oprcom != baseId) { + /* + * If commutator's oprcom field is already set to point to some + * third operator, it's an error. Changing its link would be + * unsafe, and letting the inconsistency stand would not be good + * either. This might be indicative of catalog corruption, so + * don't assume t->oprcom is necessarily a valid operator. + */ + if (OidIsValid(t->oprcom)) + { + char *thirdop = get_opname(t->oprcom); + + if (thirdop != NULL) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("commutator operator %s is already the commutator of operator %s", + NameStr(t->oprname), thirdop))); + else + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("commutator operator %s is already the commutator of operator %u", + NameStr(t->oprname), t->oprcom))); + } + t->oprcom = baseId; update_commutator = true; } @@ -726,17 +779,40 @@ OperatorUpd(Oid baseId, Oid commId, Oid negId, bool isDelete) bool update_negator = false; /* - * Out of due caution, we only change the negator's oprnegate field if - * it has the exact value we expected: InvalidOid when creating an - * operator, or baseId when dropping one. + * We can skip doing anything if the negator's oprnegate field is + * already what we want. While that's not expected in the isDelete + * case, it's perfectly possible when filling in a shell operator. */ - if (isDelete && t->oprnegate == baseId) + if (isDelete && OidIsValid(t->oprnegate)) { t->oprnegate = InvalidOid; update_negator = true; } - else if (!isDelete && !OidIsValid(t->oprnegate)) + else if (!isDelete && t->oprnegate != baseId) { + /* + * If negator's oprnegate field is already set to point to some + * third operator, it's an error. Changing its link would be + * unsafe, and letting the inconsistency stand would not be good + * either. This might be indicative of catalog corruption, so + * don't assume t->oprnegate is necessarily a valid operator. + */ + if (OidIsValid(t->oprnegate)) + { + char *thirdop = get_opname(t->oprnegate); + + if (thirdop != NULL) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("negator operator %s is already the negator of operator %s", + NameStr(t->oprname), thirdop))); + else + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("negator operator %s is already the negator of operator %u", + NameStr(t->oprname), t->oprnegate))); + } + t->oprnegate = baseId; update_negator = true; } diff --git a/src/backend/catalog/pg_parameter_acl.c b/src/backend/catalog/pg_parameter_acl.c index 073392e2c4fec..e50f2666643e4 100644 --- a/src/backend/catalog/pg_parameter_acl.c +++ b/src/backend/catalog/pg_parameter_acl.c @@ -3,7 +3,7 @@ * pg_parameter_acl.c * routines to support manipulation of the pg_parameter_acl relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -17,12 +17,9 @@ #include "access/table.h" #include "catalog/catalog.h" #include "catalog/indexing.h" -#include "catalog/objectaccess.h" -#include "catalog/pg_namespace.h" #include "catalog/pg_parameter_acl.h" #include "utils/builtins.h" #include "utils/guc.h" -#include "utils/pg_locale.h" #include "utils/rel.h" #include "utils/syscache.h" @@ -82,11 +79,7 @@ ParameterAclCreate(const char *parameter) * To prevent cluttering pg_parameter_acl with useless entries, insist * that the name be valid. */ - if (!check_GUC_name_for_parameter_acl(parameter)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_NAME), - errmsg("invalid parameter name \"%s\"", - parameter))); + check_GUC_name_for_parameter_acl(parameter); /* Convert name to the form it should have in pg_parameter_acl. */ parname = convert_GUC_name_for_parameter_acl(parameter); diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c index b5fd364003676..528c17cd7f676 100644 --- a/src/backend/catalog/pg_proc.c +++ b/src/backend/catalog/pg_proc.c @@ -3,7 +3,7 @@ * pg_proc.c * routines to support manipulation of the pg_proc relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -32,9 +32,7 @@ #include "mb/pg_wchar.h" #include "miscadmin.h" #include "nodes/nodeFuncs.h" -#include "parser/analyze.h" #include "parser/parse_coerce.h" -#include "parser/parse_type.h" #include "pgstat.h" #include "rewrite/rewriteHandler.h" #include "tcop/pquery.h" @@ -439,7 +437,7 @@ ProcedureCreate(const char *procedureName, if (olddesc == NULL && newdesc == NULL) /* ok, both are runtime-defined RECORDs */ ; else if (olddesc == NULL || newdesc == NULL || - !equalTupleDescs(olddesc, newdesc)) + !equalRowTypes(olddesc, newdesc)) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), errmsg("cannot change return type of existing function"), @@ -961,6 +959,7 @@ fmgr_sql_validator(PG_FUNCTION_ARGS) (void) check_sql_fn_retval(querytree_list, rettype, rettupdesc, + proc->prokind, false, NULL); } diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index c488b6370b62f..0602398a54546 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -3,7 +3,7 @@ * pg_publication.c * publication C API manipulation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -18,15 +18,12 @@ #include "access/heapam.h" #include "access/htup_details.h" #include "access/tableam.h" -#include "access/xact.h" #include "catalog/catalog.h" #include "catalog/dependency.h" -#include "catalog/index.h" #include "catalog/indexing.h" #include "catalog/namespace.h" -#include "catalog/partition.h" -#include "catalog/objectaccess.h" #include "catalog/objectaddress.h" +#include "catalog/partition.h" #include "catalog/pg_inherits.h" #include "catalog/pg_namespace.h" #include "catalog/pg_publication.h" @@ -35,12 +32,10 @@ #include "catalog/pg_type.h" #include "commands/publicationcmds.h" #include "funcapi.h" -#include "miscadmin.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/catcache.h" #include "utils/fmgroids.h" -#include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/syscache.h" diff --git a/src/backend/catalog/pg_range.c b/src/backend/catalog/pg_range.c index 7f7d56277f968..501a6ba41060b 100644 --- a/src/backend/catalog/pg_range.c +++ b/src/backend/catalog/pg_range.c @@ -3,7 +3,7 @@ * pg_range.c * routines to support manipulation of the pg_range relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/catalog/pg_shdepend.c b/src/backend/catalog/pg_shdepend.c index 91c7f3426f95c..753afb88453dc 100644 --- a/src/backend/catalog/pg_shdepend.c +++ b/src/backend/catalog/pg_shdepend.c @@ -3,7 +3,7 @@ * pg_shdepend.c * routines to support manipulation of the pg_shdepend relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -33,7 +33,6 @@ #include "catalog/pg_foreign_server.h" #include "catalog/pg_language.h" #include "catalog/pg_largeobject.h" -#include "catalog/pg_largeobject_metadata.h" #include "catalog/pg_namespace.h" #include "catalog/pg_opclass.h" #include "catalog/pg_operator.h" @@ -48,14 +47,10 @@ #include "catalog/pg_type.h" #include "catalog/pg_user_mapping.h" #include "commands/alter.h" -#include "commands/collationcmds.h" -#include "commands/conversioncmds.h" #include "commands/dbcommands.h" #include "commands/defrem.h" #include "commands/event_trigger.h" -#include "commands/extension.h" #include "commands/policy.h" -#include "commands/proclang.h" #include "commands/publicationcmds.h" #include "commands/schemacmds.h" #include "commands/subscriptioncmds.h" @@ -73,7 +68,7 @@ typedef enum { LOCAL_OBJECT, SHARED_OBJECT, - REMOTE_OBJECT + REMOTE_OBJECT, } SharedDependencyObjectType; typedef struct @@ -89,6 +84,11 @@ static void shdepChangeDep(Relation sdepRel, Oid classid, Oid objid, int32 objsubid, Oid refclassid, Oid refobjid, SharedDependencyType deptype); +static void updateAclDependenciesWorker(Oid classId, Oid objectId, + int32 objsubId, Oid ownerId, + SharedDependencyType deptype, + int noldmembers, Oid *oldmembers, + int nnewmembers, Oid *newmembers); static void shdepAddDependency(Relation sdepRel, Oid classId, Oid objectId, int32 objsubId, Oid refclassId, Oid refobjId, @@ -103,6 +103,9 @@ static void storeObjectDescription(StringInfo descs, ObjectAddress *object, SharedDependencyType deptype, int count); +static void shdepReassignOwned_Owner(Form_pg_shdepend sdepForm, Oid newrole); +static void shdepReassignOwned_InitAcl(Form_pg_shdepend sdepForm, + Oid oldrole, Oid newrole); /* @@ -345,6 +348,12 @@ changeDependencyOnOwner(Oid classId, Oid objectId, Oid newOwnerId) AuthIdRelationId, newOwnerId, SHARED_DEPENDENCY_ACL); + /* + * However, nothing need be done about SHARED_DEPENDENCY_INITACL entries, + * since those exist whether or not the role is the object's owner, and + * ALTER OWNER does not modify the underlying pg_init_privs entry. + */ + table_close(sdepRel, RowExclusiveLock); } @@ -483,6 +492,40 @@ updateAclDependencies(Oid classId, Oid objectId, int32 objsubId, Oid ownerId, int noldmembers, Oid *oldmembers, int nnewmembers, Oid *newmembers) +{ + updateAclDependenciesWorker(classId, objectId, objsubId, + ownerId, SHARED_DEPENDENCY_ACL, + noldmembers, oldmembers, + nnewmembers, newmembers); +} + +/* + * updateInitAclDependencies + * Update the pg_shdepend info for a pg_init_privs entry. + * + * Exactly like updateAclDependencies, except we are considering a + * pg_init_privs ACL for the specified object. Since recording of + * pg_init_privs role dependencies is the same for owners and non-owners, + * we do not need an ownerId argument. + */ +void +updateInitAclDependencies(Oid classId, Oid objectId, int32 objsubId, + int noldmembers, Oid *oldmembers, + int nnewmembers, Oid *newmembers) +{ + updateAclDependenciesWorker(classId, objectId, objsubId, + InvalidOid, /* ownerId will not be consulted */ + SHARED_DEPENDENCY_INITACL, + noldmembers, oldmembers, + nnewmembers, newmembers); +} + +/* Common code for the above two functions */ +static void +updateAclDependenciesWorker(Oid classId, Oid objectId, int32 objsubId, + Oid ownerId, SharedDependencyType deptype, + int noldmembers, Oid *oldmembers, + int nnewmembers, Oid *newmembers) { Relation sdepRel; int i; @@ -505,11 +548,13 @@ updateAclDependencies(Oid classId, Oid objectId, int32 objsubId, Oid roleid = newmembers[i]; /* - * Skip the owner: he has an OWNER shdep entry instead. (This is - * not just a space optimization; it makes ALTER OWNER easier. See - * notes in changeDependencyOnOwner.) + * For SHARED_DEPENDENCY_ACL entries, skip the owner: she has an + * OWNER shdep entry instead. (This is not just a space + * optimization; it makes ALTER OWNER easier. See notes in + * changeDependencyOnOwner.) But for INITACL entries, we record + * the owner too. */ - if (roleid == ownerId) + if (deptype == SHARED_DEPENDENCY_ACL && roleid == ownerId) continue; /* Skip pinned roles; they don't need dependency entries */ @@ -518,7 +563,7 @@ updateAclDependencies(Oid classId, Oid objectId, int32 objsubId, shdepAddDependency(sdepRel, classId, objectId, objsubId, AuthIdRelationId, roleid, - SHARED_DEPENDENCY_ACL); + deptype); } /* Drop no-longer-used old dependencies */ @@ -526,8 +571,8 @@ updateAclDependencies(Oid classId, Oid objectId, int32 objsubId, { Oid roleid = oldmembers[i]; - /* Skip the owner, same as above */ - if (roleid == ownerId) + /* Skip the owner for ACL entries, same as above */ + if (deptype == SHARED_DEPENDENCY_ACL && roleid == ownerId) continue; /* Skip pinned roles */ @@ -537,7 +582,7 @@ updateAclDependencies(Oid classId, Oid objectId, int32 objsubId, shdepDropDependency(sdepRel, classId, objectId, objsubId, false, /* exact match on objsubId */ AuthIdRelationId, roleid, - SHARED_DEPENDENCY_ACL); + deptype); } table_close(sdepRel, RowExclusiveLock); @@ -1254,6 +1299,8 @@ storeObjectDescription(StringInfo descs, appendStringInfo(descs, _("owner of %s"), objdesc); else if (deptype == SHARED_DEPENDENCY_ACL) appendStringInfo(descs, _("privileges for %s"), objdesc); + else if (deptype == SHARED_DEPENDENCY_INITACL) + appendStringInfo(descs, _("initial privileges for %s"), objdesc); else if (deptype == SHARED_DEPENDENCY_POLICY) appendStringInfo(descs, _("target of %s"), objdesc); else if (deptype == SHARED_DEPENDENCY_TABLESPACE) @@ -1436,6 +1483,21 @@ shdepDropOwned(List *roleids, DropBehavior behavior) add_exact_object_address(&obj, deleteobjs); } break; + case SHARED_DEPENDENCY_INITACL: + + /* + * Any mentions of the role that remain in pg_init_privs + * entries are just dropped. This is the same policy as + * we apply to regular ACLs. + */ + + /* Shouldn't see a role grant here */ + Assert(sdepForm->classid != AuthMemRelationId); + RemoveRoleFromInitPriv(roleid, + sdepForm->classid, + sdepForm->objid, + sdepForm->objsubid); + break; } } @@ -1530,12 +1592,8 @@ shdepReassignOwned(List *roleids, Oid newrole) sdepForm->dbid != InvalidOid) continue; - /* We leave non-owner dependencies alone */ - if (sdepForm->deptype != SHARED_DEPENDENCY_OWNER) - continue; - /* - * The various ALTER OWNER routines tend to leak memory in + * The various DDL routines called here tend to leak memory in * CurrentMemoryContext. That's not a problem when they're only * called once per command; but in this usage where we might be * touching many objects, it can amount to a serious memory leak. @@ -1546,105 +1604,156 @@ shdepReassignOwned(List *roleids, Oid newrole) ALLOCSET_DEFAULT_SIZES); oldcxt = MemoryContextSwitchTo(cxt); - /* Issue the appropriate ALTER OWNER call */ - switch (sdepForm->classid) + /* Perform the appropriate processing */ + switch (sdepForm->deptype) { - case TypeRelationId: - AlterTypeOwner_oid(sdepForm->objid, newrole, true); + case SHARED_DEPENDENCY_OWNER: + shdepReassignOwned_Owner(sdepForm, newrole); break; - - case NamespaceRelationId: - AlterSchemaOwner_oid(sdepForm->objid, newrole); + case SHARED_DEPENDENCY_INITACL: + shdepReassignOwned_InitAcl(sdepForm, roleid, newrole); break; - - case RelationRelationId: - - /* - * Pass recursing = true so that we don't fail on indexes, - * owned sequences, etc when we happen to visit them - * before their parent table. - */ - ATExecChangeOwner(sdepForm->objid, newrole, true, AccessExclusiveLock); + case SHARED_DEPENDENCY_ACL: + case SHARED_DEPENDENCY_POLICY: + case SHARED_DEPENDENCY_TABLESPACE: + /* Nothing to do for these entry types */ break; + default: + elog(ERROR, "unrecognized dependency type: %d", + (int) sdepForm->deptype); + break; + } - case DefaultAclRelationId: + /* Clean up */ + MemoryContextSwitchTo(oldcxt); + MemoryContextDelete(cxt); - /* - * Ignore default ACLs; they should be handled by DROP - * OWNED, not REASSIGN OWNED. - */ - break; + /* Make sure the next iteration will see my changes */ + CommandCounterIncrement(); + } - case UserMappingRelationId: - /* ditto */ - break; + systable_endscan(scan); + } - case ForeignServerRelationId: - AlterForeignServerOwner_oid(sdepForm->objid, newrole); - break; + table_close(sdepRel, RowExclusiveLock); +} - case ForeignDataWrapperRelationId: - AlterForeignDataWrapperOwner_oid(sdepForm->objid, newrole); - break; +/* + * shdepReassignOwned_Owner + * + * shdepReassignOwned's processing of SHARED_DEPENDENCY_OWNER entries + */ +static void +shdepReassignOwned_Owner(Form_pg_shdepend sdepForm, Oid newrole) +{ + /* Issue the appropriate ALTER OWNER call */ + switch (sdepForm->classid) + { + case TypeRelationId: + AlterTypeOwner_oid(sdepForm->objid, newrole, true); + break; - case EventTriggerRelationId: - AlterEventTriggerOwner_oid(sdepForm->objid, newrole); - break; + case NamespaceRelationId: + AlterSchemaOwner_oid(sdepForm->objid, newrole); + break; - case PublicationRelationId: - AlterPublicationOwner_oid(sdepForm->objid, newrole); - break; + case RelationRelationId: - case SubscriptionRelationId: - AlterSubscriptionOwner_oid(sdepForm->objid, newrole); - break; + /* + * Pass recursing = true so that we don't fail on indexes, owned + * sequences, etc when we happen to visit them before their parent + * table. + */ + ATExecChangeOwner(sdepForm->objid, newrole, true, AccessExclusiveLock); + break; - /* Generic alter owner cases */ - case CollationRelationId: - case ConversionRelationId: - case OperatorRelationId: - case ProcedureRelationId: - case LanguageRelationId: - case LargeObjectRelationId: - case OperatorFamilyRelationId: - case OperatorClassRelationId: - case ExtensionRelationId: - case StatisticExtRelationId: - case TableSpaceRelationId: - case DatabaseRelationId: - case TSConfigRelationId: - case TSDictionaryRelationId: - { - Oid classId = sdepForm->classid; - Relation catalog; + case DefaultAclRelationId: - if (classId == LargeObjectRelationId) - classId = LargeObjectMetadataRelationId; + /* + * Ignore default ACLs; they should be handled by DROP OWNED, not + * REASSIGN OWNED. + */ + break; - catalog = table_open(classId, RowExclusiveLock); + case UserMappingRelationId: + /* ditto */ + break; - AlterObjectOwner_internal(catalog, sdepForm->objid, - newrole); + case ForeignServerRelationId: + AlterForeignServerOwner_oid(sdepForm->objid, newrole); + break; - table_close(catalog, NoLock); - } - break; + case ForeignDataWrapperRelationId: + AlterForeignDataWrapperOwner_oid(sdepForm->objid, newrole); + break; - default: - elog(ERROR, "unexpected classid %u", sdepForm->classid); - break; - } + case EventTriggerRelationId: + AlterEventTriggerOwner_oid(sdepForm->objid, newrole); + break; - /* Clean up */ - MemoryContextSwitchTo(oldcxt); - MemoryContextDelete(cxt); + case PublicationRelationId: + AlterPublicationOwner_oid(sdepForm->objid, newrole); + break; - /* Make sure the next iteration will see my changes */ - CommandCounterIncrement(); - } + case SubscriptionRelationId: + AlterSubscriptionOwner_oid(sdepForm->objid, newrole); + break; - systable_endscan(scan); + /* Generic alter owner cases */ + case CollationRelationId: + case ConversionRelationId: + case OperatorRelationId: + case ProcedureRelationId: + case LanguageRelationId: + case LargeObjectRelationId: + case OperatorFamilyRelationId: + case OperatorClassRelationId: + case ExtensionRelationId: + case StatisticExtRelationId: + case TableSpaceRelationId: + case DatabaseRelationId: + case TSConfigRelationId: + case TSDictionaryRelationId: + AlterObjectOwner_internal(sdepForm->classid, + sdepForm->objid, + newrole); + break; + + default: + elog(ERROR, "unexpected classid %u", sdepForm->classid); + break; } +} - table_close(sdepRel, RowExclusiveLock); +/* + * shdepReassignOwned_InitAcl + * + * shdepReassignOwned's processing of SHARED_DEPENDENCY_INITACL entries + */ +static void +shdepReassignOwned_InitAcl(Form_pg_shdepend sdepForm, Oid oldrole, Oid newrole) +{ + /* + * Currently, REASSIGN OWNED replaces mentions of oldrole with newrole in + * pg_init_privs entries, just as it does in the object's regular ACL. + * This is less than ideal, since pg_init_privs ought to retain a + * historical record of the situation at the end of CREATE EXTENSION. + * However, there are two big stumbling blocks to doing something + * different: + * + * 1. If we don't replace the references, what is to happen if the old + * role gets dropped? (DROP OWNED's current answer is to just delete the + * pg_init_privs entry, which is surely ahistorical.) + * + * 2. It's unlikely that pg_dump will cope nicely with pg_init_privs + * entries that are based on a different owner than the object now has --- + * the more so given that pg_init_privs doesn't record the original owner + * explicitly. (This problem actually exists anyway given that a bare + * ALTER OWNER won't update pg_init_privs, but we don't need REASSIGN + * OWNED making it worse.) + */ + ReplaceRoleInInitPriv(oldrole, newrole, + sdepForm->classid, + sdepForm->objid, + sdepForm->objsubid); } diff --git a/src/backend/catalog/pg_subscription.c b/src/backend/catalog/pg_subscription.c index d07f88ce2807a..9efc9159f2c22 100644 --- a/src/backend/catalog/pg_subscription.c +++ b/src/backend/catalog/pg_subscription.c @@ -3,7 +3,7 @@ * pg_subscription.c * replication subscriptions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -18,13 +18,11 @@ #include "access/heapam.h" #include "access/htup_details.h" #include "access/tableam.h" -#include "access/xact.h" #include "catalog/indexing.h" #include "catalog/pg_subscription.h" #include "catalog/pg_subscription_rel.h" #include "catalog/pg_type.h" #include "miscadmin.h" -#include "nodes/makefuncs.h" #include "storage/lmgr.h" #include "utils/array.h" #include "utils/builtins.h" @@ -73,6 +71,7 @@ GetSubscription(Oid subid, bool missing_ok) sub->disableonerr = subform->subdisableonerr; sub->passwordrequired = subform->subpasswordrequired; sub->runasowner = subform->subrunasowner; + sub->failover = subform->subfailover; /* Get conninfo */ datum = SysCacheGetAttrNotNull(SUBSCRIPTIONOID, @@ -108,6 +107,9 @@ GetSubscription(Oid subid, bool missing_ok) Anum_pg_subscription_suborigin); sub->origin = TextDatumGetCString(datum); + /* Is the subscription owner a superuser? */ + sub->ownersuperuser = superuser_arg(sub->owner); + ReleaseSysCache(tup); return sub; @@ -225,10 +227,14 @@ textarray_to_stringlist(ArrayType *textarray) /* * Add new state record for a subscription table. + * + * If retain_lock is true, then don't release the locks taken in this function. + * We normally release the locks at the end of transaction but in binary-upgrade + * mode, we expect to release those immediately. */ void AddSubscriptionRelState(Oid subid, Oid relid, char state, - XLogRecPtr sublsn) + XLogRecPtr sublsn, bool retain_lock) { Relation rel; HeapTuple tup; @@ -266,7 +272,15 @@ AddSubscriptionRelState(Oid subid, Oid relid, char state, heap_freetuple(tup); /* Cleanup. */ - table_close(rel, NoLock); + if (retain_lock) + { + table_close(rel, NoLock); + } + else + { + table_close(rel, RowExclusiveLock); + UnlockSharedObject(SubscriptionRelationId, subid, 0, AccessShareLock); + } } /* diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c index 7fbda5301f12a..395dec8ed88e8 100644 --- a/src/backend/catalog/pg_type.c +++ b/src/backend/catalog/pg_type.c @@ -3,7 +3,7 @@ * pg_type.c * routines to support manipulation of the pg_type relation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -30,7 +30,6 @@ #include "commands/typecmds.h" #include "mb/pg_wchar.h" #include "miscadmin.h" -#include "parser/scansup.h" #include "utils/acl.h" #include "utils/builtins.h" #include "utils/fmgroids.h" @@ -326,14 +325,15 @@ TypeCreate(Oid newTypeOid, errmsg("fixed-size types must have storage PLAIN"))); /* - * This is a dependent type if it's an implicitly-created array type, or - * if it's a relation rowtype that's not a composite type. For such types - * we'll leave the ACL empty, and we'll skip creating some dependency - * records because there will be a dependency already through the - * depended-on type or relation. (Caution: this is closely intertwined - * with some behavior in GenerateTypeDependencies.) + * This is a dependent type if it's an implicitly-created array type or + * multirange type, or if it's a relation rowtype that's not a composite + * type. For such types we'll leave the ACL empty, and we'll skip + * creating some dependency records because there will be a dependency + * already through the depended-on type or relation. (Caution: this is + * closely intertwined with some behavior in GenerateTypeDependencies.) */ isDependentType = isImplicitArray || + typeType == TYPTYPE_MULTIRANGE || (OidIsValid(relationOid) && relationKind != RELKIND_COMPOSITE_TYPE); /* @@ -534,11 +534,12 @@ TypeCreate(Oid newTypeOid, * relationKind and isImplicitArray are likewise somewhat expensive to deduce * from the tuple, so we make callers pass those (they're not optional). * - * isDependentType is true if this is an implicit array or relation rowtype; - * that means it doesn't need its own dependencies on owner etc. + * isDependentType is true if this is an implicit array, multirange, or + * relation rowtype; that means it doesn't need its own dependencies on owner + * etc. * * We make an extension-membership dependency if we're in an extension - * script and makeExtensionDep is true (and isDependentType isn't true). + * script and makeExtensionDep is true. * makeExtensionDep should be true when creating a new type or replacing a * shell type, but not for ALTER TYPE on an existing type. Passing false * causes the type's extension membership to be left alone. @@ -598,31 +599,43 @@ GenerateTypeDependencies(HeapTuple typeTuple, ObjectAddressSet(myself, TypeRelationId, typeObjectId); /* - * Make dependencies on namespace, owner, ACL, extension. + * Make dependencies on namespace, owner, ACL. * * Skip these for a dependent type, since it will have such dependencies - * indirectly through its depended-on type or relation. + * indirectly through its depended-on type or relation. An exception is + * that multiranges need their own namespace dependency, since we don't + * force them to be in the same schema as their range type. */ - /* placeholder for all normal dependencies */ + /* collects normal dependencies for bulk recording */ addrs_normal = new_object_addresses(); - if (!isDependentType) + if (!isDependentType || typeForm->typtype == TYPTYPE_MULTIRANGE) { ObjectAddressSet(referenced, NamespaceRelationId, typeForm->typnamespace); - recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL); + add_exact_object_address(&referenced, addrs_normal); + } + if (!isDependentType) + { recordDependencyOnOwner(TypeRelationId, typeObjectId, typeForm->typowner); recordDependencyOnNewAcl(TypeRelationId, typeObjectId, 0, typeForm->typowner, typacl); - - if (makeExtensionDep) - recordDependencyOnCurrentExtension(&myself, rebuild); } + /* + * Make extension dependency if requested. + * + * We used to skip this for dependent types, but it seems better to record + * their extension membership explicitly; otherwise code such as + * postgres_fdw's shippability test will be fooled. + */ + if (makeExtensionDep) + recordDependencyOnCurrentExtension(&myself, rebuild); + /* Normal dependencies on the I/O and support functions */ if (OidIsValid(typeForm->typinput)) { @@ -727,6 +740,16 @@ GenerateTypeDependencies(HeapTuple typeTuple, recordDependencyOn(&myself, &referenced, isImplicitArray ? DEPENDENCY_INTERNAL : DEPENDENCY_NORMAL); } + + /* + * Note: you might expect that we should record an internal dependency of + * a multirange on its range type here, by analogy with the cases above. + * But instead, that is done by RangeCreate(), which also handles + * recording of other range-type-specific dependencies. That's pretty + * bogus. It's okay for now, because there are no cases where we need to + * regenerate the dependencies of a range or multirange type. But someday + * we might need to move that logic here to allow such regeneration. + */ } /* diff --git a/src/backend/catalog/sql_features.txt b/src/backend/catalog/sql_features.txt index b33065d7bf7c8..c002f37202f58 100644 --- a/src/backend/catalog/sql_features.txt +++ b/src/backend/catalog/sql_features.txt @@ -231,7 +231,6 @@ F292 UNIQUE null treatment YES F301 CORRESPONDING in query expressions NO F302 INTERSECT table operator YES F303 INTERSECT DISTINCT table operator YES -F302 INTERSECT table operator 02 INTERSECT ALL table operator YES F304 EXCEPT ALL table operator YES F305 INTERSECT ALL table operator YES F311 Schema definition statement YES @@ -548,15 +547,15 @@ T811 Basic SQL/JSON constructor functions YES T812 SQL/JSON: JSON_OBJECTAGG YES T813 SQL/JSON: JSON_ARRAYAGG with ORDER BY YES T814 Colon in JSON_OBJECT or JSON_OBJECTAGG YES -T821 Basic SQL/JSON query operators NO +T821 Basic SQL/JSON query operators YES T822 SQL/JSON: IS JSON WITH UNIQUE KEYS predicate YES -T823 SQL/JSON: PASSING clause NO +T823 SQL/JSON: PASSING clause YES T824 JSON_TABLE: specific PLAN clause NO -T825 SQL/JSON: ON EMPTY and ON ERROR clauses NO -T826 General value expression in ON ERROR or ON EMPTY clauses NO -T827 JSON_TABLE: sibling NESTED COLUMNS clauses NO -T828 JSON_QUERY NO -T829 JSON_QUERY: array wrapper options NO +T825 SQL/JSON: ON EMPTY and ON ERROR clauses YES +T826 General value expression in ON ERROR or ON EMPTY clauses YES +T827 JSON_TABLE: sibling NESTED COLUMNS clauses YES +T828 JSON_QUERY YES +T829 JSON_QUERY: array wrapper options YES T830 Enforcing unique keys in SQL/JSON constructor functions YES T831 SQL/JSON path language: strict mode YES T832 SQL/JSON path language: item method YES @@ -574,20 +573,20 @@ T861 SQL/JSON simplified accessor: case-sensitive JSON member accessor NO T862 SQL/JSON simplified accessor: wildcard member accessor NO T863 SQL/JSON simplified accessor: single-quoted string literal as member accessor NO T864 SQL/JSON simplified accessor NO -T865 SQL/JSON item method: bigint() NO -T866 SQL/JSON item method: boolean() NO -T867 SQL/JSON item method: date() NO -T868 SQL/JSON item method: decimal() NO -T869 SQL/JSON item method: decimal() with precision and scale NO -T870 SQL/JSON item method: integer() NO -T871 SQL/JSON item method: number() NO -T872 SQL/JSON item method: string() NO -T873 SQL/JSON item method: time() NO -T874 SQL/JSON item method: time_tz() NO -T875 SQL/JSON item method: time precision NO -T876 SQL/JSON item method: timestamp() NO -T877 SQL/JSON item method: timestamp_tz() NO -T878 SQL/JSON item method: timestamp precision NO +T865 SQL/JSON item method: bigint() YES +T866 SQL/JSON item method: boolean() YES +T867 SQL/JSON item method: date() YES +T868 SQL/JSON item method: decimal() YES +T869 SQL/JSON item method: decimal() with precision and scale YES +T870 SQL/JSON item method: integer() YES +T871 SQL/JSON item method: number() YES +T872 SQL/JSON item method: string() YES +T873 SQL/JSON item method: time() YES +T874 SQL/JSON item method: time_tz() YES +T875 SQL/JSON item method: time precision YES +T876 SQL/JSON item method: timestamp() YES +T877 SQL/JSON item method: timestamp_tz() YES +T878 SQL/JSON item method: timestamp precision YES T879 JSON in equality operations YES with jsonb T880 JSON in grouping operations YES with jsonb T881 JSON in ordering operations NO with jsonb, partially supported @@ -633,7 +632,7 @@ X034 XMLAgg YES X035 XMLAgg: ORDER BY option YES X036 XMLComment YES X037 XMLPI YES -X038 XMLText NO +X038 XMLText YES supported except for RETURNING X040 Basic table mapping YES X041 Basic table mapping: null absent YES X042 Basic table mapping: null as nil YES diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index 2add0534891ba..a3e554e372e2e 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -3,7 +3,7 @@ * storage.c * code to create and destroy physical storage for relations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,7 +19,6 @@ #include "postgres.h" -#include "access/parallel.h" #include "access/visibilitymap.h" #include "access/xact.h" #include "access/xlog.h" @@ -28,7 +27,9 @@ #include "catalog/storage.h" #include "catalog/storage_xlog.h" #include "miscadmin.h" +#include "storage/bulk_write.h" #include "storage/freespace.h" +#include "storage/proc.h" #include "storage/smgr.h" #include "utils/hsearch.h" #include "utils/memutils.h" @@ -60,7 +61,7 @@ int wal_skip_threshold = 2048; /* in kilobytes */ typedef struct PendingRelDelete { RelFileLocator rlocator; /* relation that may need to be deleted */ - BackendId backend; /* InvalidBackendId if not a temp rel */ + ProcNumber procNumber; /* INVALID_PROC_NUMBER if not a temp rel */ bool atCommit; /* T=delete at commit; F=delete at abort */ int nestLevel; /* xact nesting level of request */ struct PendingRelDelete *next; /* linked-list link */ @@ -121,7 +122,7 @@ RelationCreateStorage(RelFileLocator rlocator, char relpersistence, bool register_delete) { SMgrRelation srel; - BackendId backend; + ProcNumber procNumber; bool needs_wal; Assert(!IsInParallelMode()); /* couldn't update pendingSyncHash */ @@ -129,15 +130,15 @@ RelationCreateStorage(RelFileLocator rlocator, char relpersistence, switch (relpersistence) { case RELPERSISTENCE_TEMP: - backend = BackendIdForTempRelations(); + procNumber = ProcNumberForTempRelations(); needs_wal = false; break; case RELPERSISTENCE_UNLOGGED: - backend = InvalidBackendId; + procNumber = INVALID_PROC_NUMBER; needs_wal = false; break; case RELPERSISTENCE_PERMANENT: - backend = InvalidBackendId; + procNumber = INVALID_PROC_NUMBER; needs_wal = true; break; default: @@ -145,7 +146,7 @@ RelationCreateStorage(RelFileLocator rlocator, char relpersistence, return NULL; /* placate compiler */ } - srel = smgropen(rlocator, backend); + srel = smgropen(rlocator, procNumber); smgrcreate(srel, MAIN_FORKNUM, false); if (needs_wal) @@ -162,7 +163,7 @@ RelationCreateStorage(RelFileLocator rlocator, char relpersistence, pending = (PendingRelDelete *) MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete)); pending->rlocator = rlocator; - pending->backend = backend; + pending->procNumber = procNumber; pending->atCommit = false; /* delete if abort */ pending->nestLevel = GetCurrentTransactionNestLevel(); pending->next = pendingDeletes; @@ -171,7 +172,7 @@ RelationCreateStorage(RelFileLocator rlocator, char relpersistence, if (relpersistence == RELPERSISTENCE_PERMANENT && !XLogIsNeeded()) { - Assert(backend == InvalidBackendId); + Assert(procNumber == INVALID_PROC_NUMBER); AddPendingSync(&rlocator); } @@ -210,7 +211,7 @@ RelationDropStorage(Relation rel) pending = (PendingRelDelete *) MemoryContextAlloc(TopMemoryContext, sizeof(PendingRelDelete)); pending->rlocator = rel->rd_locator; - pending->backend = rel->rd_backend; + pending->procNumber = rel->rd_backend; pending->atCommit = true; /* delete if commit */ pending->nestLevel = GetCurrentTransactionNestLevel(); pending->next = pendingDeletes; @@ -290,6 +291,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks) bool vm; bool need_fsm_vacuum = false; ForkNumber forks[MAX_FORKNUM]; + BlockNumber old_blocks[MAX_FORKNUM]; BlockNumber blocks[MAX_FORKNUM]; int nforks = 0; SMgrRelation reln; @@ -305,6 +307,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks) /* Prepare for truncation of MAIN fork of the relation */ forks[nforks] = MAIN_FORKNUM; + old_blocks[nforks] = smgrnblocks(reln, MAIN_FORKNUM); blocks[nforks] = nblocks; nforks++; @@ -316,6 +319,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks) if (BlockNumberIsValid(blocks[nforks])) { forks[nforks] = FSM_FORKNUM; + old_blocks[nforks] = smgrnblocks(reln, FSM_FORKNUM); nforks++; need_fsm_vacuum = true; } @@ -329,6 +333,7 @@ RelationTruncate(Relation rel, BlockNumber nblocks) if (BlockNumberIsValid(blocks[nforks])) { forks[nforks] = VISIBILITYMAP_FORKNUM; + old_blocks[nforks] = smgrnblocks(reln, VISIBILITYMAP_FORKNUM); nforks++; } } @@ -336,30 +341,49 @@ RelationTruncate(Relation rel, BlockNumber nblocks) RelationPreTruncate(rel); /* - * Make sure that a concurrent checkpoint can't complete while truncation - * is in progress. + * The code which follows can interact with concurrent checkpoints in two + * separate ways. * - * The truncation operation might drop buffers that the checkpoint + * First, the truncation operation might drop buffers that the checkpoint * otherwise would have flushed. If it does, then it's essential that the * files actually get truncated on disk before the checkpoint record is * written. Otherwise, if reply begins from that checkpoint, the * to-be-truncated blocks might still exist on disk but have older * contents than expected, which can cause replay to fail. It's OK for the * blocks to not exist on disk at all, but not for them to have the wrong - * contents. + * contents. For this reason, we need to set DELAY_CHKPT_COMPLETE while + * this code executes. + * + * Second, the call to smgrtruncate() below will in turn call + * RegisterSyncRequest(). We need the sync request created by that call to + * be processed before the checkpoint completes. CheckPointGuts() will + * call ProcessSyncRequests(), but if we register our sync request after + * that happens, then the WAL record for the truncation could end up + * preceding the checkpoint record, while the actual sync doesn't happen + * until the next checkpoint. To prevent that, we need to set + * DELAY_CHKPT_START here. That way, if the XLOG_SMGR_TRUNCATE precedes + * the redo pointer of a concurrent checkpoint, we're guaranteed that the + * corresponding sync request will be processed before the checkpoint + * completes. */ - Assert((MyProc->delayChkptFlags & DELAY_CHKPT_COMPLETE) == 0); - MyProc->delayChkptFlags |= DELAY_CHKPT_COMPLETE; + Assert((MyProc->delayChkptFlags & (DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE)) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE; /* - * We WAL-log the truncation before actually truncating, which means - * trouble if the truncation fails. If we then crash, the WAL replay - * likely isn't going to succeed in the truncation either, and cause a - * PANIC. It's tempting to put a critical section here, but that cure - * would be worse than the disease. It would turn a usually harmless - * failure to truncate, that might spell trouble at WAL replay, into a - * certain PANIC. + * We WAL-log the truncation first and then truncate in a critical + * section. Truncation drops buffers, even if dirty, and then truncates + * disk files. All of that work needs to complete before the lock is + * released, or else old versions of pages on disk that are missing recent + * changes would become accessible again. We'll try the whole operation + * again in crash recovery if we panic, but even then we can't give up + * because we don't want standbys' relation sizes to diverge and break + * replay or visibility invariants downstream. The critical section also + * suppresses interrupts. + * + * (See also pg_visibilitymap.c if changing this code.) */ + START_CRIT_SECTION(); + if (RelationNeedsWAL(rel)) { /* @@ -383,10 +407,10 @@ RelationTruncate(Relation rel, BlockNumber nblocks) * hit the disk before the WAL record, and the truncation of the FSM * or visibility map. If we crashed during that window, we'd be left * with a truncated heap, but the FSM or visibility map would still - * contain entries for the non-existent heap pages. + * contain entries for the non-existent heap pages, and standbys would + * also never replay the truncation. */ - if (fsm || vm) - XLogFlush(lsn); + XLogFlush(lsn); } /* @@ -394,10 +418,12 @@ RelationTruncate(Relation rel, BlockNumber nblocks) * longer exist after truncation is complete, and then truncate the * corresponding files on disk. */ - smgrtruncate(RelationGetSmgr(rel), forks, nforks, blocks); + smgrtruncate2(RelationGetSmgr(rel), forks, nforks, old_blocks, blocks); + + END_CRIT_SECTION(); /* We've done all the critical work, so checkpoints are OK now. */ - MyProc->delayChkptFlags &= ~DELAY_CHKPT_COMPLETE; + MyProc->delayChkptFlags &= ~(DELAY_CHKPT_START | DELAY_CHKPT_COMPLETE); /* * Update upper-level FSM pages to account for the truncation. This is @@ -451,14 +477,11 @@ void RelationCopyStorage(SMgrRelation src, SMgrRelation dst, ForkNumber forkNum, char relpersistence) { - PGIOAlignedBlock buf; - Page page; bool use_wal; bool copying_initfork; BlockNumber nblocks; BlockNumber blkno; - - page = (Page) buf.data; + BulkWriteState *bulkstate; /* * The init fork for an unlogged relation in many respects has to be @@ -477,16 +500,21 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst, use_wal = XLogIsNeeded() && (relpersistence == RELPERSISTENCE_PERMANENT || copying_initfork); + bulkstate = smgr_bulk_start_smgr(dst, forkNum, use_wal); + nblocks = smgrnblocks(src, forkNum); for (blkno = 0; blkno < nblocks; blkno++) { + BulkWriteBuffer buf; + /* If we got a cancel signal during the copy of the data, quit */ CHECK_FOR_INTERRUPTS(); - smgrread(src, forkNum, blkno, buf.data); + buf = smgr_bulk_get_buf(bulkstate); + smgrread(src, forkNum, blkno, (Page) buf); - if (!PageIsVerifiedExtended(page, blkno, + if (!PageIsVerifiedExtended((Page) buf, blkno, PIV_LOG_WARNING | PIV_REPORT_STAT)) { /* @@ -507,34 +535,13 @@ RelationCopyStorage(SMgrRelation src, SMgrRelation dst, } /* - * WAL-log the copied page. Unfortunately we don't know what kind of a - * page this is, so we have to log the full page including any unused - * space. + * Queue the page for WAL-logging and writing out. Unfortunately we + * don't know what kind of a page this is, so we have to log the full + * page including any unused space. */ - if (use_wal) - log_newpage(&dst->smgr_rlocator.locator, forkNum, blkno, page, false); - - PageSetChecksumInplace(page, blkno); - - /* - * Now write the page. We say skipFsync = true because there's no - * need for smgr to schedule an fsync for this write; we'll do it - * ourselves below. - */ - smgrextend(dst, forkNum, blkno, buf.data, true); + smgr_bulk_write(bulkstate, blkno, buf, false); } - - /* - * When we WAL-logged rel pages, we must nonetheless fsync them. The - * reason is that since we're copying outside shared buffers, a CHECKPOINT - * occurring during the copy has no way to flush the previously written - * data to disk (indeed it won't know the new rel even exists). A crash - * later on would replay WAL from the checkpoint, therefore it wouldn't - * replay our earlier WAL entries. If we do not fsync those pages here, - * they might still not be on disk when the crash occurs. - */ - if (use_wal || copying_initfork) - smgrimmedsync(dst, forkNum); + smgr_bulk_finish(bulkstate); } /* @@ -678,7 +685,7 @@ smgrDoPendingDeletes(bool isCommit) { SMgrRelation srel; - srel = smgropen(pending->rlocator, pending->backend); + srel = smgropen(pending->rlocator, pending->procNumber); /* allocate the initial array, or extend it, if needed */ if (maxrels == 0) @@ -756,15 +763,15 @@ smgrDoPendingSyncs(bool isCommit, bool isParallelWorker) { ForkNumber fork; BlockNumber nblocks[MAX_FORKNUM + 1]; - BlockNumber total_blocks = 0; + uint64 total_blocks = 0; SMgrRelation srel; - srel = smgropen(pendingsync->rlocator, InvalidBackendId); + srel = smgropen(pendingsync->rlocator, INVALID_PROC_NUMBER); /* * We emit newpage WAL records for smaller relations. * - * Small WAL records have a chance to be emitted along with other + * Small WAL records have a chance to be flushed along with other * backends' WAL records. We emit WAL records instead of syncing for * files that are smaller than a certain threshold, expecting faster * commit. The threshold is defined by the GUC wal_skip_threshold. @@ -800,7 +807,7 @@ smgrDoPendingSyncs(bool isCommit, bool isParallelWorker) * main fork is longer than ever but FSM fork gets shorter. */ if (pendingsync->is_truncated || - total_blocks * BLCKSZ / 1024 >= wal_skip_threshold) + total_blocks >= wal_skip_threshold * (uint64) 1024 / BLCKSZ) { /* allocate the initial array, or extend it, if needed */ if (maxrels == 0) @@ -878,7 +885,7 @@ smgrGetPendingDeletes(bool forCommit, RelFileLocator **ptr) for (pending = pendingDeletes; pending != NULL; pending = pending->next) { if (pending->nestLevel >= nestLevel && pending->atCommit == forCommit - && pending->backend == InvalidBackendId) + && pending->procNumber == INVALID_PROC_NUMBER) nrels++; } if (nrels == 0) @@ -891,7 +898,7 @@ smgrGetPendingDeletes(bool forCommit, RelFileLocator **ptr) for (pending = pendingDeletes; pending != NULL; pending = pending->next) { if (pending->nestLevel >= nestLevel && pending->atCommit == forCommit - && pending->backend == InvalidBackendId) + && pending->procNumber == INVALID_PROC_NUMBER) { *rptr = pending->rlocator; rptr++; @@ -968,7 +975,7 @@ smgr_redo(XLogReaderState *record) xl_smgr_create *xlrec = (xl_smgr_create *) XLogRecGetData(record); SMgrRelation reln; - reln = smgropen(xlrec->rlocator, InvalidBackendId); + reln = smgropen(xlrec->rlocator, INVALID_PROC_NUMBER); smgrcreate(reln, xlrec->forkNum, true); } else if (info == XLOG_SMGR_TRUNCATE) @@ -978,10 +985,11 @@ smgr_redo(XLogReaderState *record) Relation rel; ForkNumber forks[MAX_FORKNUM]; BlockNumber blocks[MAX_FORKNUM]; + BlockNumber old_blocks[MAX_FORKNUM]; int nforks = 0; bool need_fsm_vacuum = false; - reln = smgropen(xlrec->rlocator, InvalidBackendId); + reln = smgropen(xlrec->rlocator, INVALID_PROC_NUMBER); /* * Forcibly create relation if it doesn't exist (which suggests that @@ -1012,6 +1020,7 @@ smgr_redo(XLogReaderState *record) if ((xlrec->flags & SMGR_TRUNCATE_HEAP) != 0) { forks[nforks] = MAIN_FORKNUM; + old_blocks[nforks] = smgrnblocks(reln, MAIN_FORKNUM); blocks[nforks] = xlrec->blkno; nforks++; @@ -1029,6 +1038,7 @@ smgr_redo(XLogReaderState *record) if (BlockNumberIsValid(blocks[nforks])) { forks[nforks] = FSM_FORKNUM; + old_blocks[nforks] = smgrnblocks(reln, FSM_FORKNUM); nforks++; need_fsm_vacuum = true; } @@ -1040,13 +1050,18 @@ smgr_redo(XLogReaderState *record) if (BlockNumberIsValid(blocks[nforks])) { forks[nforks] = VISIBILITYMAP_FORKNUM; + old_blocks[nforks] = smgrnblocks(reln, VISIBILITYMAP_FORKNUM); nforks++; } } /* Do the real work to truncate relation forks */ if (nforks > 0) - smgrtruncate(reln, forks, nforks, blocks); + { + START_CRIT_SECTION(); + smgrtruncate2(reln, forks, nforks, old_blocks, blocks); + END_CRIT_SECTION(); + } /* * Update upper-level FSM pages to account for the truncation. This is diff --git a/src/backend/catalog/system_functions.sql b/src/backend/catalog/system_functions.sql index 07c0d89c4f864..ae099e328c245 100644 --- a/src/backend/catalog/system_functions.sql +++ b/src/backend/catalog/system_functions.sql @@ -1,11 +1,11 @@ /* * PostgreSQL System Functions * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/backend/catalog/system_functions.sql * - * This file redefines certain built-in functions that it's impractical + * This file redefines certain built-in functions that are impractical * to fully define in pg_proc.dat. In most cases that's because they use * SQL-standard function bodies and/or default expressions. The node * tree representations of those are too unreadable, platform-dependent, @@ -446,6 +446,26 @@ LANGUAGE INTERNAL VOLATILE ROWS 1000 COST 1000 AS 'pg_logical_slot_peek_binary_changes'; +CREATE OR REPLACE FUNCTION pg_logical_emit_message( + transactional boolean, + prefix text, + message text, + flush boolean DEFAULT false) +RETURNS pg_lsn +LANGUAGE INTERNAL +STRICT VOLATILE +AS 'pg_logical_emit_message_text'; + +CREATE OR REPLACE FUNCTION pg_logical_emit_message( + transactional boolean, + prefix text, + message bytea, + flush boolean DEFAULT false) +RETURNS pg_lsn +LANGUAGE INTERNAL +STRICT VOLATILE +AS 'pg_logical_emit_message_bytea'; + CREATE OR REPLACE FUNCTION pg_create_physical_replication_slot( IN slot_name name, IN immediately_reserve boolean DEFAULT false, IN temporary boolean DEFAULT false, @@ -459,6 +479,7 @@ CREATE OR REPLACE FUNCTION pg_create_logical_replication_slot( IN slot_name name, IN plugin name, IN temporary boolean DEFAULT false, IN twophase boolean DEFAULT false, + IN failover boolean DEFAULT false, OUT slot_name name, OUT lsn pg_lsn) RETURNS RECORD LANGUAGE INTERNAL @@ -601,6 +622,20 @@ LANGUAGE internal STRICT IMMUTABLE PARALLEL SAFE AS 'unicode_is_normalized'; +CREATE OR REPLACE FUNCTION + pg_stat_reset_shared(target text DEFAULT NULL) +RETURNS void +LANGUAGE INTERNAL +CALLED ON NULL INPUT VOLATILE PARALLEL SAFE +AS 'pg_stat_reset_shared'; + +CREATE OR REPLACE FUNCTION + pg_stat_reset_slru(target text DEFAULT NULL) +RETURNS void +LANGUAGE INTERNAL +CALLED ON NULL INPUT VOLATILE PARALLEL SAFE +AS 'pg_stat_reset_slru'; + -- -- The default permissions for functions mean that anyone can execute them. -- A number of functions shouldn't be executable by just anyone, but rather @@ -742,6 +777,10 @@ GRANT EXECUTE ON FUNCTION pg_ls_logicalmapdir() TO pg_monitor; GRANT EXECUTE ON FUNCTION pg_ls_replslotdir(text) TO pg_monitor; +GRANT EXECUTE ON FUNCTION pg_current_logfile() TO pg_monitor; + +GRANT EXECUTE ON FUNCTION pg_current_logfile(text) TO pg_monitor; + GRANT pg_read_all_settings TO pg_monitor; GRANT pg_read_all_stats TO pg_monitor; diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index c18fea8362dff..efb29adeb39cc 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -1,7 +1,7 @@ /* * PostgreSQL System Views * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/backend/catalog/system_views.sql * @@ -243,7 +243,28 @@ CREATE VIEW pg_stats WITH (security_barrier) AS WHEN stakind3 = 5 THEN stanumbers3 WHEN stakind4 = 5 THEN stanumbers4 WHEN stakind5 = 5 THEN stanumbers5 - END AS elem_count_histogram + END AS elem_count_histogram, + CASE + WHEN stakind1 = 6 THEN stavalues1 + WHEN stakind2 = 6 THEN stavalues2 + WHEN stakind3 = 6 THEN stavalues3 + WHEN stakind4 = 6 THEN stavalues4 + WHEN stakind5 = 6 THEN stavalues5 + END AS range_length_histogram, + CASE + WHEN stakind1 = 6 THEN stanumbers1[1] + WHEN stakind2 = 6 THEN stanumbers2[1] + WHEN stakind3 = 6 THEN stanumbers3[1] + WHEN stakind4 = 6 THEN stanumbers4[1] + WHEN stakind5 = 6 THEN stanumbers5[1] + END AS range_empty_frac, + CASE + WHEN stakind1 = 7 THEN stavalues1 + WHEN stakind2 = 7 THEN stavalues2 + WHEN stakind3 = 7 THEN stavalues3 + WHEN stakind4 = 7 THEN stavalues4 + WHEN stakind5 = 7 THEN stavalues5 + END AS range_bounds_histogram FROM pg_statistic s JOIN pg_class c ON (c.oid = s.starelid) JOIN pg_attribute a ON (c.oid = attrelid AND attnum = s.staattnum) LEFT JOIN pg_namespace n ON (n.oid = c.relnamespace) @@ -284,12 +305,7 @@ CREATE VIEW pg_stats_ext WITH (security_barrier) AS array_agg(base_frequency) AS most_common_base_freqs FROM pg_mcv_list_items(sd.stxdmcv) ) m ON sd.stxdmcv IS NOT NULL - WHERE NOT EXISTS - ( SELECT 1 - FROM unnest(stxkeys) k - JOIN pg_attribute a - ON (a.attrelid = s.stxrelid AND a.attnum = k) - WHERE NOT has_column_privilege(c.oid, a.attnum, 'select') ) + WHERE pg_has_role(c.relowner, 'USAGE') AND (c.relrowsecurity = false OR NOT row_security_active(c.oid)); CREATE VIEW pg_stats_ext_exprs WITH (security_barrier) AS @@ -359,7 +375,9 @@ CREATE VIEW pg_stats_ext_exprs WITH (security_barrier) AS JOIN LATERAL ( SELECT unnest(pg_get_statisticsobjdef_expressions(s.oid)) AS expr, unnest(sd.stxdexpr)::pg_statistic AS a - ) stat ON (stat.expr IS NOT NULL); + ) stat ON (stat.expr IS NOT NULL) + WHERE pg_has_role(c.relowner, 'USAGE') + AND (c.relrowsecurity = false OR NOT row_security_active(c.oid)); -- unprivileged users may read pg_statistic_ext but not pg_statistic_ext_data REVOKE ALL ON pg_statistic_ext_data FROM public; @@ -949,6 +967,7 @@ CREATE VIEW pg_stat_subscription AS SELECT su.oid AS subid, su.subname, + st.worker_type, st.pid, st.leader_pid, st.relid, @@ -1001,7 +1020,11 @@ CREATE VIEW pg_replication_slots AS L.wal_status, L.safe_wal_size, L.two_phase, - L.conflicting + L.inactive_since, + L.conflicting, + L.invalidation_reason, + L.failover, + L.synced FROM pg_get_replication_slots() AS L LEFT JOIN pg_database D ON (L.datoid = D.oid); @@ -1110,18 +1133,23 @@ CREATE VIEW pg_stat_archiver AS CREATE VIEW pg_stat_bgwriter AS SELECT - pg_stat_get_bgwriter_timed_checkpoints() AS checkpoints_timed, - pg_stat_get_bgwriter_requested_checkpoints() AS checkpoints_req, - pg_stat_get_checkpoint_write_time() AS checkpoint_write_time, - pg_stat_get_checkpoint_sync_time() AS checkpoint_sync_time, - pg_stat_get_bgwriter_buf_written_checkpoints() AS buffers_checkpoint, pg_stat_get_bgwriter_buf_written_clean() AS buffers_clean, pg_stat_get_bgwriter_maxwritten_clean() AS maxwritten_clean, - pg_stat_get_buf_written_backend() AS buffers_backend, - pg_stat_get_buf_fsync_backend() AS buffers_backend_fsync, pg_stat_get_buf_alloc() AS buffers_alloc, pg_stat_get_bgwriter_stat_reset_time() AS stats_reset; +CREATE VIEW pg_stat_checkpointer AS + SELECT + pg_stat_get_checkpointer_num_timed() AS num_timed, + pg_stat_get_checkpointer_num_requested() AS num_requested, + pg_stat_get_checkpointer_restartpoints_timed() AS restartpoints_timed, + pg_stat_get_checkpointer_restartpoints_requested() AS restartpoints_req, + pg_stat_get_checkpointer_restartpoints_performed() AS restartpoints_done, + pg_stat_get_checkpointer_write_time() AS write_time, + pg_stat_get_checkpointer_sync_time() AS sync_time, + pg_stat_get_checkpointer_buffers_written() AS buffers_written, + pg_stat_get_checkpointer_stat_reset_time() AS stats_reset; + CREATE VIEW pg_stat_io AS SELECT b.backend_type, @@ -1192,7 +1220,9 @@ CREATE VIEW pg_stat_progress_vacuum AS END AS phase, S.param2 AS heap_blks_total, S.param3 AS heap_blks_scanned, S.param4 AS heap_blks_vacuumed, S.param5 AS index_vacuum_count, - S.param6 AS max_dead_tuples, S.param7 AS num_dead_tuples + S.param6 AS max_dead_tuple_bytes, S.param7 AS dead_tuple_bytes, + S.param8 AS num_dead_item_ids, S.param9 AS indexes_total, + S.param10 AS indexes_processed FROM pg_stat_get_progress_info('VACUUM') AS S LEFT JOIN pg_database D ON S.datid = D.oid; @@ -1290,7 +1320,8 @@ CREATE VIEW pg_stat_progress_copy AS S.param1 AS bytes_processed, S.param2 AS bytes_total, S.param3 AS tuples_processed, - S.param4 AS tuples_excluded + S.param4 AS tuples_excluded, + S.param7 AS tuples_skipped FROM pg_stat_get_progress_info('COPY') AS S LEFT JOIN pg_database D ON S.datid = D.oid; @@ -1328,7 +1359,7 @@ REVOKE ALL ON pg_replication_origin_status FROM public; REVOKE ALL ON pg_subscription FROM public; GRANT SELECT (oid, subdbid, subskiplsn, subname, subowner, subenabled, subbinary, substream, subtwophasestate, subdisableonerr, - subpasswordrequired, subrunasowner, + subpasswordrequired, subrunasowner, subfailover, subslotname, subsynccommit, subpublications, suborigin) ON pg_subscription TO public; @@ -1341,3 +1372,6 @@ CREATE VIEW pg_stat_subscription_stats AS ss.stats_reset FROM pg_subscription as s, pg_stat_get_subscription_stats(s.oid) as ss; + +CREATE VIEW pg_wait_events AS + SELECT * FROM pg_get_wait_events(); diff --git a/src/backend/catalog/toasting.c b/src/backend/catalog/toasting.c index ab12b0b9de570..ad3082c62aca8 100644 --- a/src/backend/catalog/toasting.c +++ b/src/backend/catalog/toasting.c @@ -4,7 +4,7 @@ * This file contains routines to support creation of toast tables * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -26,12 +26,10 @@ #include "catalog/pg_am.h" #include "catalog/pg_namespace.h" #include "catalog/pg_opclass.h" -#include "catalog/pg_type.h" #include "catalog/toasting.h" #include "miscadmin.h" #include "nodes/makefuncs.h" -#include "storage/lock.h" -#include "utils/builtins.h" +#include "utils/fmgroids.h" #include "utils/rel.h" #include "utils/syscache.h" @@ -142,8 +140,8 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, char toast_relname[NAMEDATALEN]; char toast_idxname[NAMEDATALEN]; IndexInfo *indexInfo; - Oid collationObjectId[2]; - Oid classObjectId[2]; + Oid collationIds[2]; + Oid opclassIds[2]; int16 coloptions[2]; ObjectAddress baseobject, toastobject; @@ -299,7 +297,6 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, indexInfo->ii_ExclusionOps = NULL; indexInfo->ii_ExclusionProcs = NULL; indexInfo->ii_ExclusionStrats = NULL; - indexInfo->ii_OpclassOptions = NULL; indexInfo->ii_Unique = true; indexInfo->ii_NullsNotDistinct = false; indexInfo->ii_ReadyForInserts = true; @@ -312,11 +309,11 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, indexInfo->ii_AmCache = NULL; indexInfo->ii_Context = CurrentMemoryContext; - collationObjectId[0] = InvalidOid; - collationObjectId[1] = InvalidOid; + collationIds[0] = InvalidOid; + collationIds[1] = InvalidOid; - classObjectId[0] = OID_BTREE_OPS_OID; - classObjectId[1] = INT4_BTREE_OPS_OID; + opclassIds[0] = OID_BTREE_OPS_OID; + opclassIds[1] = INT4_BTREE_OPS_OID; coloptions[0] = 0; coloptions[1] = 0; @@ -327,7 +324,7 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, list_make2("chunk_id", "chunk_seq"), BTREE_AM_OID, rel->rd_rel->reltablespace, - collationObjectId, classObjectId, coloptions, (Datum) 0, + collationIds, opclassIds, NULL, coloptions, NULL, (Datum) 0, INDEX_CREATE_IS_PRIMARY, 0, true, true, NULL); table_close(toast_rel, NoLock); @@ -337,21 +334,36 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid, */ class_rel = table_open(RelationRelationId, RowExclusiveLock); - reltup = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relOid)); - if (!HeapTupleIsValid(reltup)) - elog(ERROR, "cache lookup failed for relation %u", relOid); - - ((Form_pg_class) GETSTRUCT(reltup))->reltoastrelid = toast_relid; - if (!IsBootstrapProcessingMode()) { /* normal case, use a transactional update */ + reltup = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relOid)); + if (!HeapTupleIsValid(reltup)) + elog(ERROR, "cache lookup failed for relation %u", relOid); + + ((Form_pg_class) GETSTRUCT(reltup))->reltoastrelid = toast_relid; + CatalogTupleUpdate(class_rel, &reltup->t_self, reltup); } else { /* While bootstrapping, we cannot UPDATE, so overwrite in-place */ - heap_inplace_update(class_rel, reltup); + + ScanKeyData key[1]; + void *state; + + ScanKeyInit(&key[0], + Anum_pg_class_oid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(relOid)); + systable_inplace_update_begin(class_rel, ClassOidIndexId, true, + NULL, 1, key, &reltup, &state); + if (!HeapTupleIsValid(reltup)) + elog(ERROR, "cache lookup failed for relation %u", relOid); + + ((Form_pg_class) GETSTRUCT(reltup))->reltoastrelid = toast_relid; + + systable_inplace_update_finish(state, reltup); } heap_freetuple(reltup); diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c index fda9d1aa77e0a..fde5a2a0e0496 100644 --- a/src/backend/commands/aggregatecmds.c +++ b/src/backend/commands/aggregatecmds.c @@ -4,7 +4,7 @@ * * Routines for aggregate-manipulation commands * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,21 +22,17 @@ */ #include "postgres.h" -#include "access/htup_details.h" -#include "catalog/dependency.h" +#include "catalog/namespace.h" #include "catalog/pg_aggregate.h" #include "catalog/pg_namespace.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" -#include "commands/alter.h" #include "commands/defrem.h" #include "miscadmin.h" -#include "parser/parse_func.h" #include "parser/parse_type.h" #include "utils/acl.h" #include "utils/builtins.h" #include "utils/lsyscache.h" -#include "utils/syscache.h" static char extractModify(DefElem *defel); diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c index e95dc31bde358..132283b1ef2ed 100644 --- a/src/backend/commands/alter.c +++ b/src/backend/commands/alter.c @@ -3,7 +3,7 @@ * alter.c * Drivers for generic alter commands * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -16,7 +16,6 @@ #include "access/htup_details.h" #include "access/relation.h" -#include "access/sysattr.h" #include "access/table.h" #include "catalog/dependency.h" #include "catalog/indexing.h" @@ -33,6 +32,7 @@ #include "catalog/pg_largeobject_metadata.h" #include "catalog/pg_namespace.h" #include "catalog/pg_opclass.h" +#include "catalog/pg_operator.h" #include "catalog/pg_opfamily.h" #include "catalog/pg_proc.h" #include "catalog/pg_statistic_ext.h" @@ -43,13 +43,11 @@ #include "catalog/pg_ts_template.h" #include "commands/alter.h" #include "commands/collationcmds.h" -#include "commands/conversioncmds.h" #include "commands/dbcommands.h" #include "commands/defrem.h" #include "commands/event_trigger.h" #include "commands/extension.h" #include "commands/policy.h" -#include "commands/proclang.h" #include "commands/publicationcmds.h" #include "commands/schemacmds.h" #include "commands/subscriptioncmds.h" @@ -59,12 +57,11 @@ #include "commands/typecmds.h" #include "commands/user.h" #include "miscadmin.h" -#include "parser/parse_func.h" #include "replication/logicalworker.h" #include "rewrite/rewriteDefine.h" -#include "tcop/utility.h" +#include "storage/lmgr.h" +#include "utils/acl.h" #include "utils/builtins.h" -#include "utils/fmgroids.h" #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/syscache.h" @@ -295,7 +292,8 @@ AlterObjectRename_internal(Relation rel, Oid objectId, const char *new_name) } else if (classId == SubscriptionRelationId) { - if (SearchSysCacheExists2(SUBSCRIPTIONNAME, MyDatabaseId, + if (SearchSysCacheExists2(SUBSCRIPTIONNAME, + ObjectIdGetDatum(MyDatabaseId), CStringGetDatum(new_name))) report_name_conflict(classId, new_name); @@ -601,32 +599,26 @@ ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt, /* * Change an object's namespace given its classOid and object Oid. * - * Objects that don't have a namespace should be ignored. + * Objects that don't have a namespace should be ignored, as should + * dependent types such as array types. * * This function is currently used only by ALTER EXTENSION SET SCHEMA, - * so it only needs to cover object types that can be members of an - * extension, and it doesn't have to deal with certain special cases - * such as not wanting to process array types --- those should never - * be direct members of an extension anyway. Nonetheless, we insist - * on listing all OCLASS types in the switch. + * so it only needs to cover object kinds that can be members of an + * extension, and it can silently ignore dependent types --- we assume + * those will be moved when their parent object is moved. * * Returns the OID of the object's previous namespace, or InvalidOid if - * object doesn't have a schema. + * object doesn't have a schema or was ignored due to being a dependent type. */ Oid AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid, ObjectAddresses *objsMoved) { Oid oldNspOid = InvalidOid; - ObjectAddress dep; - dep.classId = classId; - dep.objectId = objid; - dep.objectSubId = 0; - - switch (getObjectClass(&dep)) + switch (classId) { - case OCLASS_CLASS: + case RelationRelationId: { Relation rel; @@ -639,21 +631,21 @@ AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid, break; } - case OCLASS_TYPE: - oldNspOid = AlterTypeNamespace_oid(objid, nspOid, objsMoved); + case TypeRelationId: + oldNspOid = AlterTypeNamespace_oid(objid, nspOid, true, objsMoved); break; - case OCLASS_PROC: - case OCLASS_COLLATION: - case OCLASS_CONVERSION: - case OCLASS_OPERATOR: - case OCLASS_OPCLASS: - case OCLASS_OPFAMILY: - case OCLASS_STATISTIC_EXT: - case OCLASS_TSPARSER: - case OCLASS_TSDICT: - case OCLASS_TSTEMPLATE: - case OCLASS_TSCONFIG: + case ProcedureRelationId: + case CollationRelationId: + case ConversionRelationId: + case OperatorRelationId: + case OperatorClassRelationId: + case OperatorFamilyRelationId: + case StatisticExtRelationId: + case TSParserRelationId: + case TSDictionaryRelationId: + case TSTemplateRelationId: + case TSConfigRelationId: { Relation catalog; @@ -666,41 +658,9 @@ AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid, } break; - case OCLASS_CAST: - case OCLASS_CONSTRAINT: - case OCLASS_DEFAULT: - case OCLASS_LANGUAGE: - case OCLASS_LARGEOBJECT: - case OCLASS_AM: - case OCLASS_AMOP: - case OCLASS_AMPROC: - case OCLASS_REWRITE: - case OCLASS_TRIGGER: - case OCLASS_SCHEMA: - case OCLASS_ROLE: - case OCLASS_ROLE_MEMBERSHIP: - case OCLASS_DATABASE: - case OCLASS_TBLSPACE: - case OCLASS_FDW: - case OCLASS_FOREIGN_SERVER: - case OCLASS_USER_MAPPING: - case OCLASS_DEFACL: - case OCLASS_EXTENSION: - case OCLASS_EVENT_TRIGGER: - case OCLASS_PARAMETER_ACL: - case OCLASS_POLICY: - case OCLASS_PUBLICATION: - case OCLASS_PUBLICATION_NAMESPACE: - case OCLASS_PUBLICATION_REL: - case OCLASS_SUBSCRIPTION: - case OCLASS_TRANSFORM: + default: /* ignore object types that don't have schema-qualified names */ - break; - - /* - * There's intentionally no default: case here; we want the - * compiler to warn if a new OCLASS hasn't been handled above. - */ + Assert(get_object_attnum_namespace(classId) == InvalidAttrNumber); } return oldNspOid; @@ -847,9 +807,11 @@ AlterObjectNamespace_internal(Relation rel, Oid objid, Oid nspOid) pfree(nulls); pfree(replaces); - /* update dependencies to point to the new schema */ - changeDependencyFor(classId, objid, - NamespaceRelationId, oldNspOid, nspOid); + /* update dependency to point to the new schema */ + if (changeDependencyFor(classId, objid, + NamespaceRelationId, oldNspOid, nspOid) != 1) + elog(ERROR, "could not change schema dependency for object %u", + objid); InvokeObjectPostAlterHook(classId, objid, 0); @@ -915,9 +877,7 @@ ExecAlterOwnerStmt(AlterOwnerStmt *stmt) case OBJECT_TSDICTIONARY: case OBJECT_TSCONFIGURATION: { - Relation catalog; Relation relation; - Oid classId; ObjectAddress address; address = get_object_address(stmt->objectType, @@ -926,20 +886,9 @@ ExecAlterOwnerStmt(AlterOwnerStmt *stmt) AccessExclusiveLock, false); Assert(relation == NULL); - classId = address.classId; - /* - * XXX - get_object_address returns Oid of pg_largeobject - * catalog for OBJECT_LARGEOBJECT because of historical - * reasons. Fix up it here. - */ - if (classId == LargeObjectRelationId) - classId = LargeObjectMetadataRelationId; - - catalog = table_open(classId, RowExclusiveLock); - - AlterObjectOwner_internal(catalog, address.objectId, newowner); - table_close(catalog, RowExclusiveLock); + AlterObjectOwner_internal(address.classId, address.objectId, + newowner); return address; } @@ -957,26 +906,35 @@ ExecAlterOwnerStmt(AlterOwnerStmt *stmt) * cases (won't work for tables, nor other cases where we need to do more than * change the ownership column of a single catalog entry). * - * rel: catalog relation containing object (RowExclusiveLock'd by caller) + * classId: OID of catalog containing object * objectId: OID of object to change the ownership of * new_ownerId: OID of new object owner + * + * This will work on large objects, but we have to beware of the fact that + * classId isn't the OID of the catalog to modify in that case. */ void -AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) +AlterObjectOwner_internal(Oid classId, Oid objectId, Oid new_ownerId) { - Oid classId = RelationGetRelid(rel); - AttrNumber Anum_oid = get_object_attnum_oid(classId); - AttrNumber Anum_owner = get_object_attnum_owner(classId); - AttrNumber Anum_namespace = get_object_attnum_namespace(classId); - AttrNumber Anum_acl = get_object_attnum_acl(classId); - AttrNumber Anum_name = get_object_attnum_name(classId); + /* For large objects, the catalog to modify is pg_largeobject_metadata */ + Oid catalogId = (classId == LargeObjectRelationId) ? LargeObjectMetadataRelationId : classId; + AttrNumber Anum_oid = get_object_attnum_oid(catalogId); + AttrNumber Anum_owner = get_object_attnum_owner(catalogId); + AttrNumber Anum_namespace = get_object_attnum_namespace(catalogId); + AttrNumber Anum_acl = get_object_attnum_acl(catalogId); + AttrNumber Anum_name = get_object_attnum_name(catalogId); + Relation rel; HeapTuple oldtup; Datum datum; bool isnull; Oid old_ownerId; Oid namespaceId = InvalidOid; - oldtup = get_catalog_object_by_oid(rel, Anum_oid, objectId); + rel = table_open(catalogId, RowExclusiveLock); + + /* Search tuple and lock it. */ + oldtup = + get_catalog_object_by_oid_extended(rel, Anum_oid, objectId, true); if (oldtup == NULL) elog(ERROR, "cache lookup failed for object %u of catalog \"%s\"", objectId, RelationGetRelationName(rel)); @@ -1023,7 +981,8 @@ AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) snprintf(namebuf, sizeof(namebuf), "%u", objectId); objname = namebuf; } - aclcheck_error(ACLCHECK_NOT_OWNER, get_object_type(classId, objectId), + aclcheck_error(ACLCHECK_NOT_OWNER, + get_object_type(catalogId, objectId), objname); } /* Must be able to become new owner */ @@ -1075,9 +1034,9 @@ AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) /* Perform actual update */ CatalogTupleUpdate(rel, &newtup->t_self, newtup); + UnlockTuple(rel, &oldtup->t_self, InplaceUpdateTupleLock); + /* Update owner dependency reference */ - if (classId == LargeObjectMetadataRelationId) - classId = LargeObjectRelationId; changeDependencyOnOwner(classId, objectId, new_ownerId); /* Release memory */ @@ -1085,6 +1044,11 @@ AlterObjectOwner_internal(Relation rel, Oid objectId, Oid new_ownerId) pfree(nulls); pfree(replaces); } + else + UnlockTuple(rel, &oldtup->t_self, InplaceUpdateTupleLock); + /* Note the post-alter hook gets classId not catalogId */ InvokeObjectPostAlterHook(classId, objectId, 0); + + table_close(rel, RowExclusiveLock); } diff --git a/src/backend/commands/amcmds.c b/src/backend/commands/amcmds.c index 2050619123c2c..aaa0f9a1dc8c9 100644 --- a/src/backend/commands/amcmds.c +++ b/src/backend/commands/amcmds.c @@ -3,7 +3,7 @@ * amcmds.c * Routines for SQL commands that manipulate access methods. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -167,7 +167,7 @@ get_index_am_oid(const char *amname, bool missing_ok) /* * get_table_am_oid - given an access method name, look up its OID - * and verify it corresponds to an table AM. + * and verify it corresponds to a table AM. */ Oid get_table_am_oid(const char *amname, bool missing_ok) diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index fc9a371f9be79..c590a2adc35c0 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -3,7 +3,7 @@ * analyze.c * the Postgres statistics generator * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -20,20 +20,15 @@ #include "access/genam.h" #include "access/multixact.h" #include "access/relation.h" -#include "access/sysattr.h" #include "access/table.h" #include "access/tableam.h" #include "access/transam.h" #include "access/tupconvert.h" #include "access/visibilitymap.h" #include "access/xact.h" -#include "catalog/catalog.h" #include "catalog/index.h" #include "catalog/indexing.h" -#include "catalog/pg_collation.h" #include "catalog/pg_inherits.h" -#include "catalog/pg_namespace.h" -#include "catalog/pg_statistic_ext.h" #include "commands/dbcommands.h" #include "commands/progress.h" #include "commands/tablecmds.h" @@ -50,14 +45,9 @@ #include "statistics/extended_stats_internal.h" #include "statistics/statistics.h" #include "storage/bufmgr.h" -#include "storage/lmgr.h" -#include "storage/proc.h" #include "storage/procarray.h" -#include "utils/acl.h" #include "utils/attoptcache.h" -#include "utils/builtins.h" #include "utils/datum.h" -#include "utils/fmgroids.h" #include "utils/guc.h" #include "utils/lsyscache.h" #include "utils/memutils.h" @@ -348,9 +338,10 @@ do_analyze_rel(Relation onerel, VacuumParams *params, SetUserIdAndSecContext(onerel->rd_rel->relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); /* measure elapsed time iff autovacuum logging requires it */ - if (IsAutoVacuumWorkerProcess() && params->log_min_duration >= 0) + if (AmAutoVacuumWorkerProcess() && params->log_min_duration >= 0) { if (track_io_timing) { @@ -572,7 +563,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params, * If the appropriate flavor of the n_distinct option is * specified, override with the corresponding value. */ - aopt = get_attribute_options(onerel->rd_id, stats->attr->attnum); + aopt = get_attribute_options(onerel->rd_id, stats->tupattnum); if (aopt != NULL) { float8 n_distinct; @@ -582,7 +573,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params, stats->stadistinct = n_distinct; } - MemoryContextResetAndDeleteChildren(col_context); + MemoryContextReset(col_context); } if (nindexes > 0) @@ -633,9 +624,16 @@ do_analyze_rel(Relation onerel, VacuumParams *params, { BlockNumber relallvisible; - visibilitymap_count(onerel, &relallvisible, NULL); + if (RELKIND_HAS_STORAGE(onerel->rd_rel->relkind)) + visibilitymap_count(onerel, &relallvisible, NULL); + else + relallvisible = 0; - /* Update pg_class for table relation */ + /* + * Update pg_class for table relation. CCI first, in case acquirefunc + * updated pg_class. + */ + CommandCounterIncrement(); vac_update_relstats(onerel, relpages, totalrows, @@ -670,6 +668,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params, * Partitioned tables don't have storage, so we don't set any fields * in their pg_class entries except for reltuples and relhasindex. */ + CommandCounterIncrement(); vac_update_relstats(onerel, -1, totalrows, 0, hasindex, InvalidTransactionId, InvalidMultiXactId, @@ -725,7 +724,7 @@ do_analyze_rel(Relation onerel, VacuumParams *params, vac_close_indexes(nindexes, Irel, NoLock); /* Log the action if appropriate */ - if (IsAutoVacuumWorkerProcess() && params->log_min_duration >= 0) + if (AmAutoVacuumWorkerProcess() && params->log_min_duration >= 0) { TimestampTz endtime = GetCurrentTimestamp(); @@ -927,7 +926,7 @@ compute_index_stats(Relation onerel, double totalrows, for (i = 0; i < attr_cnt; i++) { VacAttrStats *stats = thisdata->vacattrstats[i]; - int attnum = stats->attr->attnum; + int attnum = stats->tupattnum; if (isnull[attnum - 1]) { @@ -971,7 +970,7 @@ compute_index_stats(Relation onerel, double totalrows, numindexrows, totalindexrows); - MemoryContextResetAndDeleteChildren(col_context); + MemoryContextReset(col_context); } } @@ -980,7 +979,7 @@ compute_index_stats(Relation onerel, double totalrows, ExecDropSingleTupleTableSlot(slot); FreeExecutorState(estate); - MemoryContextResetAndDeleteChildren(ind_context); + MemoryContextReset(ind_context); } MemoryContextSwitchTo(old_context); @@ -1000,6 +999,10 @@ static VacAttrStats * examine_attribute(Relation onerel, int attnum, Node *index_expr) { Form_pg_attribute attr = TupleDescAttr(onerel->rd_att, attnum - 1); + int attstattarget; + HeapTuple atttuple; + Datum dat; + bool isnull; HeapTuple typtuple; VacAttrStats *stats; int i; @@ -1009,17 +1012,28 @@ examine_attribute(Relation onerel, int attnum, Node *index_expr) if (attr->attisdropped) return NULL; + /* + * Get attstattarget value. Set to -1 if null. (Analyze functions expect + * -1 to mean use default_statistics_target; see for example + * std_typanalyze.) + */ + atttuple = SearchSysCache2(ATTNUM, ObjectIdGetDatum(RelationGetRelid(onerel)), Int16GetDatum(attnum)); + if (!HeapTupleIsValid(atttuple)) + elog(ERROR, "cache lookup failed for attribute %d of relation %u", + attnum, RelationGetRelid(onerel)); + dat = SysCacheGetAttr(ATTNUM, atttuple, Anum_pg_attribute_attstattarget, &isnull); + attstattarget = isnull ? -1 : DatumGetInt16(dat); + ReleaseSysCache(atttuple); + /* Don't analyze column if user has specified not to */ - if (attr->attstattarget == 0) + if (attstattarget == 0) return NULL; /* - * Create the VacAttrStats struct. Note that we only have a copy of the - * fixed fields of the pg_attribute tuple. + * Create the VacAttrStats struct. */ stats = (VacAttrStats *) palloc0(sizeof(VacAttrStats)); - stats->attr = (Form_pg_attribute) palloc(ATTRIBUTE_FIXED_PART_SIZE); - memcpy(stats->attr, attr, ATTRIBUTE_FIXED_PART_SIZE); + stats->attstattarget = attstattarget; /* * When analyzing an expression index, believe the expression tree's type @@ -1086,7 +1100,6 @@ examine_attribute(Relation onerel, int attnum, Node *index_expr) if (!ok || stats->compute_stats == NULL || stats->minrows <= 0) { heap_freetuple(typtuple); - pfree(stats->attr); pfree(stats); return NULL; } @@ -1094,6 +1107,20 @@ examine_attribute(Relation onerel, int attnum, Node *index_expr) return stats; } +/* + * Read stream callback returning the next BlockNumber as chosen by the + * BlockSampling algorithm. + */ +static BlockNumber +block_sampling_read_stream_next(ReadStream *stream, + void *callback_private_data, + void *per_buffer_data) +{ + BlockSamplerData *bs = callback_private_data; + + return BlockSampler_HasMore(bs) ? BlockSampler_Next(bs) : InvalidBlockNumber; +} + /* * acquire_sample_rows -- acquire a random sample of rows from the table * @@ -1146,10 +1173,7 @@ acquire_sample_rows(Relation onerel, int elevel, TableScanDesc scan; BlockNumber nblocks; BlockNumber blksdone = 0; -#ifdef USE_PREFETCH - int prefetch_maximum = 0; /* blocks to prefetch if enabled */ - BlockSamplerData prefetch_bs; -#endif + ReadStream *stream; Assert(targrows > 0); @@ -1162,13 +1186,6 @@ acquire_sample_rows(Relation onerel, int elevel, randseed = pg_prng_uint32(&pg_global_prng_state); nblocks = BlockSampler_Init(&bs, totalblocks, targrows, randseed); -#ifdef USE_PREFETCH - prefetch_maximum = get_tablespace_maintenance_io_concurrency(onerel->rd_rel->reltablespace); - /* Create another BlockSampler, using the same seed, for prefetching */ - if (prefetch_maximum) - (void) BlockSampler_Init(&prefetch_bs, totalblocks, targrows, randseed); -#endif - /* Report sampling block numbers */ pgstat_progress_update_param(PROGRESS_ANALYZE_BLOCKS_TOTAL, nblocks); @@ -1179,71 +1196,19 @@ acquire_sample_rows(Relation onerel, int elevel, scan = table_beginscan_analyze(onerel); slot = table_slot_create(onerel, NULL); -#ifdef USE_PREFETCH - - /* - * If we are doing prefetching, then go ahead and tell the kernel about - * the first set of pages we are going to want. This also moves our - * iterator out ahead of the main one being used, where we will keep it so - * that we're always pre-fetching out prefetch_maximum number of blocks - * ahead. - */ - if (prefetch_maximum) - { - for (int i = 0; i < prefetch_maximum; i++) - { - BlockNumber prefetch_block; - - if (!BlockSampler_HasMore(&prefetch_bs)) - break; - - prefetch_block = BlockSampler_Next(&prefetch_bs); - PrefetchBuffer(scan->rs_rd, MAIN_FORKNUM, prefetch_block); - } - } -#endif + stream = read_stream_begin_relation(READ_STREAM_MAINTENANCE, + vac_strategy, + scan->rs_rd, + MAIN_FORKNUM, + block_sampling_read_stream_next, + &bs, + 0); /* Outer loop over blocks to sample */ - while (BlockSampler_HasMore(&bs)) + while (table_scan_analyze_next_block(scan, stream)) { - bool block_accepted; - BlockNumber targblock = BlockSampler_Next(&bs); -#ifdef USE_PREFETCH - BlockNumber prefetch_targblock = InvalidBlockNumber; - - /* - * Make sure that every time the main BlockSampler is moved forward - * that our prefetch BlockSampler also gets moved forward, so that we - * always stay out ahead. - */ - if (prefetch_maximum && BlockSampler_HasMore(&prefetch_bs)) - prefetch_targblock = BlockSampler_Next(&prefetch_bs); -#endif - vacuum_delay_point(); - block_accepted = table_scan_analyze_next_block(scan, targblock, vac_strategy); - -#ifdef USE_PREFETCH - - /* - * When pre-fetching, after we get a block, tell the kernel about the - * next one we will want, if there's any left. - * - * We want to do this even if the table_scan_analyze_next_block() call - * above decides against analyzing the block it picked. - */ - if (prefetch_maximum && prefetch_targblock != InvalidBlockNumber) - PrefetchBuffer(scan->rs_rd, MAIN_FORKNUM, prefetch_targblock); -#endif - - /* - * Don't analyze if table_scan_analyze_next_block() indicated this - * block is unsuitable for analyzing. - */ - if (!block_accepted) - continue; - while (table_scan_analyze_next_tuple(scan, OldestXmin, &liverows, &deadrows, slot)) { /* @@ -1293,6 +1258,8 @@ acquire_sample_rows(Relation onerel, int elevel, ++blksdone); } + read_stream_end(stream); + ExecDropSingleTupleTableSlot(slot); table_endscan(scan); @@ -1533,8 +1500,25 @@ acquire_inherited_sample_rows(Relation onerel, int elevel, AcquireSampleRowsFunc acquirefunc = acquirefuncs[i]; double childblocks = relblocks[i]; - pgstat_progress_update_param(PROGRESS_ANALYZE_CURRENT_CHILD_TABLE_RELID, - RelationGetRelid(childrel)); + /* + * Report progress. The sampling function will normally report blocks + * done/total, but we need to reset them to 0 here, so that they don't + * show an old value until that. + */ + { + const int progress_index[] = { + PROGRESS_ANALYZE_CURRENT_CHILD_TABLE_RELID, + PROGRESS_ANALYZE_BLOCKS_DONE, + PROGRESS_ANALYZE_BLOCKS_TOTAL + }; + const int64 progress_vals[] = { + RelationGetRelid(childrel), + 0, + 0, + }; + + pgstat_progress_update_multi_param(3, progress_index, progress_vals); + } if (childblocks > 0) { @@ -1556,8 +1540,8 @@ acquire_inherited_sample_rows(Relation onerel, int elevel, /* We may need to convert from child's rowtype to parent's */ if (childrows > 0 && - !equalTupleDescs(RelationGetDescr(childrel), - RelationGetDescr(onerel))) + !equalRowTypes(RelationGetDescr(childrel), + RelationGetDescr(onerel))) { TupleConversionMap *map; @@ -1659,7 +1643,7 @@ update_attstats(Oid relid, bool inh, int natts, VacAttrStats **vacattrstats) } values[Anum_pg_statistic_starelid - 1] = ObjectIdGetDatum(relid); - values[Anum_pg_statistic_staattnum - 1] = Int16GetDatum(stats->attr->attnum); + values[Anum_pg_statistic_staattnum - 1] = Int16GetDatum(stats->tupattnum); values[Anum_pg_statistic_stainherit - 1] = BoolGetDatum(inh); values[Anum_pg_statistic_stanullfrac - 1] = Float4GetDatum(stats->stanullfrac); values[Anum_pg_statistic_stawidth - 1] = Int32GetDatum(stats->stawidth); @@ -1725,7 +1709,7 @@ update_attstats(Oid relid, bool inh, int natts, VacAttrStats **vacattrstats) /* Is there already a pg_statistic tuple for this attribute? */ oldtup = SearchSysCache3(STATRELATTINH, ObjectIdGetDatum(relid), - Int16GetDatum(stats->attr->attnum), + Int16GetDatum(stats->tupattnum), BoolGetDatum(inh)); /* Open index information when we know we need it */ @@ -1860,15 +1844,13 @@ static int analyze_mcv_list(int *mcv_counts, bool std_typanalyze(VacAttrStats *stats) { - Form_pg_attribute attr = stats->attr; Oid ltopr; Oid eqopr; StdAnalyzeData *mystats; /* If the attstattarget column is negative, use the default value */ - /* NB: it is okay to scribble on stats->attr since it's a copy */ - if (attr->attstattarget < 0) - attr->attstattarget = default_statistics_target; + if (stats->attstattarget < 0) + stats->attstattarget = default_statistics_target; /* Look for default "<" and "=" operators for column's type */ get_sort_group_operators(stats->attrtypid, @@ -1909,21 +1891,21 @@ std_typanalyze(VacAttrStats *stats) * know it at this point. *-------------------- */ - stats->minrows = 300 * attr->attstattarget; + stats->minrows = 300 * stats->attstattarget; } else if (OidIsValid(eqopr)) { /* We can still recognize distinct values */ stats->compute_stats = compute_distinct_stats; /* Might as well use the same minrows as above */ - stats->minrows = 300 * attr->attstattarget; + stats->minrows = 300 * stats->attstattarget; } else { /* Can't do much but the trivial stuff */ stats->compute_stats = compute_trivial_stats; /* Might as well use the same minrows as above */ - stats->minrows = 300 * attr->attstattarget; + stats->minrows = 300 * stats->attstattarget; } return true; @@ -2051,7 +2033,7 @@ compute_distinct_stats(VacAttrStatsP stats, TrackItem *track; int track_cnt, track_max; - int num_mcv = stats->attr->attstattarget; + int num_mcv = stats->attstattarget; StdAnalyzeData *mystats = (StdAnalyzeData *) stats->extra_data; /* @@ -2392,8 +2374,8 @@ compute_scalar_stats(VacAttrStatsP stats, int *tupnoLink; ScalarMCVItem *track; int track_cnt = 0; - int num_mcv = stats->attr->attstattarget; - int num_bins = stats->attr->attstattarget; + int num_mcv = stats->attstattarget; + int num_bins = stats->attstattarget; StdAnalyzeData *mystats = (StdAnalyzeData *) stats->extra_data; values = (ScalarItem *) palloc(samplerows * sizeof(ScalarItem)); diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index ef909cf4e082d..3d7d1e9becad8 100644 --- a/src/backend/commands/async.c +++ b/src/backend/commands/async.c @@ -3,7 +3,7 @@ * async.c * Asynchronous notification: NOTIFY, LISTEN, UNLISTEN * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -103,12 +103,11 @@ * until we reach either a notification from an uncommitted transaction or * the head pointer's position. * - * 6. To avoid SLRU wraparound and limit disk space consumption, the tail - * pointer needs to be advanced so that old pages can be truncated. - * This is relatively expensive (notably, it requires an exclusive lock), - * so we don't want to do it often. We make sending backends do this work - * if they advanced the queue head into a new page, but only once every - * QUEUE_CLEANUP_DELAY pages. + * 6. To limit disk space consumption, the tail pointer needs to be advanced + * so that old pages can be truncated. This is relatively expensive + * (notably, it requires an exclusive lock), so we don't want to do it + * often. We make sending backends do this work if they advanced the queue + * head into a new page, but only once every QUEUE_CLEANUP_DELAY pages. * * An application that listens on the same channel it notifies will get * NOTIFY messages for its own NOTIFYs. These can be ignored, if not useful, @@ -117,10 +116,10 @@ * frontend during startup.) The above design guarantees that notifies from * other backends will never be missed by ignoring self-notifies. * - * The amount of shared memory used for notify management (NUM_NOTIFY_BUFFERS) + * The amount of shared memory used for notify management (notify_buffers) * can be varied without affecting anything but performance. The maximum * amount of notification data that can be queued at one time is determined - * by slru.c's wraparound limit; see QUEUE_MAX_PAGE below. + * by max_notify_queue_pages GUC. *------------------------------------------------------------------------- */ @@ -143,12 +142,10 @@ #include "miscadmin.h" #include "storage/ipc.h" #include "storage/lmgr.h" -#include "storage/proc.h" -#include "storage/procarray.h" #include "storage/procsignal.h" -#include "storage/sinval.h" #include "tcop/tcopprot.h" #include "utils/builtins.h" +#include "utils/guc_hooks.h" #include "utils/memutils.h" #include "utils/ps_status.h" #include "utils/snapmgr.h" @@ -196,7 +193,7 @@ typedef struct AsyncQueueEntry */ typedef struct QueuePosition { - int page; /* SLRU page number */ + int64 page; /* SLRU page number */ int offset; /* byte offset within page */ } QueuePosition; @@ -235,7 +232,7 @@ typedef struct QueuePosition * * Resist the temptation to make this really large. While that would save * work in some places, it would add cost in others. In particular, this - * should likely be less than NUM_NOTIFY_BUFFERS, to ensure that backends + * should likely be less than notify_buffers, to ensure that backends * catch up before the pages they'll need to read fall out of SLRU cache. */ #define QUEUE_CLEANUP_DELAY 4 @@ -247,7 +244,7 @@ typedef struct QueueBackendStatus { int32 pid; /* either a PID or InvalidPid */ Oid dboid; /* backend's database OID, or InvalidOid */ - BackendId nextListener; /* id of next listener, or InvalidBackendId */ + ProcNumber nextListener; /* id of next listener, or INVALID_PROC_NUMBER */ QueuePosition pos; /* backend has read queue up to here */ } QueueBackendStatus; @@ -267,18 +264,18 @@ typedef struct QueueBackendStatus * both NotifyQueueLock and NotifyQueueTailLock in EXCLUSIVE mode, backends * can change the tail pointers. * - * NotifySLRULock is used as the control lock for the pg_notify SLRU buffers. + * SLRU buffer pool is divided in banks and bank wise SLRU lock is used as + * the control lock for the pg_notify SLRU buffers. * In order to avoid deadlocks, whenever we need multiple locks, we first get - * NotifyQueueTailLock, then NotifyQueueLock, and lastly NotifySLRULock. + * NotifyQueueTailLock, then NotifyQueueLock, and lastly SLRU bank lock. * * Each backend uses the backend[] array entry with index equal to its - * BackendId (which can range from 1 to MaxBackends). We rely on this to make - * SendProcSignal fast. + * ProcNumber. We rely on this to make SendProcSignal fast. * * The backend[] array entries for actively-listening backends are threaded * together using firstListener and the nextListener links, so that we can * scan them without having to iterate over inactive entries. We keep this - * list in order by BackendId so that the scan is cache-friendly when there + * list in order by ProcNumber so that the scan is cache-friendly when there * are many active entries. */ typedef struct AsyncQueueControl @@ -286,12 +283,12 @@ typedef struct AsyncQueueControl QueuePosition head; /* head points to the next free location */ QueuePosition tail; /* tail must be <= the queue position of every * listening backend */ - int stopPage; /* oldest unrecycled page; must be <= + int64 stopPage; /* oldest unrecycled page; must be <= * tail.page */ - BackendId firstListener; /* id of first listener, or InvalidBackendId */ + ProcNumber firstListener; /* id of first listener, or + * INVALID_PROC_NUMBER */ TimestampTz lastQueueFillWarn; /* time of last queue-full msg */ QueueBackendStatus backend[FLEXIBLE_ARRAY_MEMBER]; - /* backend[0] is not used; used entries are from [1] to [MaxBackends] */ } AsyncQueueControl; static AsyncQueueControl *asyncQueueControl; @@ -312,23 +309,8 @@ static SlruCtlData NotifyCtlData; #define NotifyCtl (&NotifyCtlData) #define QUEUE_PAGESIZE BLCKSZ -#define QUEUE_FULL_WARN_INTERVAL 5000 /* warn at most once every 5s */ -/* - * Use segments 0000 through FFFF. Each contains SLRU_PAGES_PER_SEGMENT pages - * which gives us the pages from 0 to SLRU_PAGES_PER_SEGMENT * 0x10000 - 1. - * We could use as many segments as SlruScanDirectory() allows, but this gives - * us so much space already that it doesn't seem worth the trouble. - * - * The most data we can have in the queue at a time is QUEUE_MAX_PAGE/2 - * pages, because more than that would confuse slru.c into thinking there - * was a wraparound condition. With the default BLCKSZ this means there - * can be up to 8GB of queued-and-not-read data. - * - * Note: it's possible to redefine QUEUE_MAX_PAGE with a smaller multiple of - * SLRU_PAGES_PER_SEGMENT, for easier testing of queue-full behaviour. - */ -#define QUEUE_MAX_PAGE (SLRU_PAGES_PER_SEGMENT * 0x10000 - 1) +#define QUEUE_FULL_WARN_INTERVAL 5000 /* warn at most once every 5s */ /* * listenChannels identifies the channels we are actually listening to @@ -351,7 +333,7 @@ typedef enum { LISTEN_LISTEN, LISTEN_UNLISTEN, - LISTEN_UNLISTEN_ALL + LISTEN_UNLISTEN_ALL, } ListenActionKind; typedef struct @@ -414,10 +396,10 @@ typedef struct NotificationList #define MIN_HASHABLE_NOTIFIES 16 /* threshold to build hashtab */ -typedef struct NotificationHash +struct NotificationHash { Notification *event; /* => the actual Notification struct */ -} NotificationHash; +}; static NotificationList *pendingNotifies = NULL; @@ -439,12 +421,15 @@ static bool amRegisteredListener = false; /* have we advanced to a page that's a multiple of QUEUE_CLEANUP_DELAY? */ static bool tryAdvanceTail = false; -/* GUC parameter */ +/* GUC parameters */ bool Trace_notify = false; +/* For 8 KB pages this gives 8 GB of disk space */ +int max_notify_queue_pages = 1048576; + /* local function prototypes */ -static int asyncQueuePageDiff(int p, int q); -static bool asyncQueuePagePrecedes(int p, int q); +static inline int64 asyncQueuePageDiff(int64 p, int64 q); +static inline bool asyncQueuePagePrecedes(int64 p, int64 q); static void queue_listen(ListenActionKind action, const char *channel); static void Async_UnlistenOnExit(int code, Datum arg); static void Exec_ListenPreCommit(void); @@ -474,39 +459,23 @@ static int notification_match(const void *key1, const void *key2, Size keysize); static void ClearPendingActionsAndNotifies(void); /* - * Compute the difference between two queue page numbers (i.e., p - q), - * accounting for wraparound. + * Compute the difference between two queue page numbers. + * Previously this function accounted for a wraparound. */ -static int -asyncQueuePageDiff(int p, int q) +static inline int64 +asyncQueuePageDiff(int64 p, int64 q) { - int diff; - - /* - * We have to compare modulo (QUEUE_MAX_PAGE+1)/2. Both inputs should be - * in the range 0..QUEUE_MAX_PAGE. - */ - Assert(p >= 0 && p <= QUEUE_MAX_PAGE); - Assert(q >= 0 && q <= QUEUE_MAX_PAGE); - - diff = p - q; - if (diff >= ((QUEUE_MAX_PAGE + 1) / 2)) - diff -= QUEUE_MAX_PAGE + 1; - else if (diff < -((QUEUE_MAX_PAGE + 1) / 2)) - diff += QUEUE_MAX_PAGE + 1; - return diff; + return p - q; } /* - * Is p < q, accounting for wraparound? - * - * Since asyncQueueIsFull() blocks creation of a page that could precede any - * extant page, we need not assess entries within a page. + * Determines whether p precedes q. + * Previously this function accounted for a wraparound. */ -static bool -asyncQueuePagePrecedes(int p, int q) +static inline bool +asyncQueuePagePrecedes(int64 p, int64 q) { - return asyncQueuePageDiff(p, q) < 0; + return p < q; } /* @@ -518,10 +487,10 @@ AsyncShmemSize(void) Size size; /* This had better match AsyncShmemInit */ - size = mul_size(MaxBackends + 1, sizeof(QueueBackendStatus)); + size = mul_size(MaxBackends, sizeof(QueueBackendStatus)); size = add_size(size, offsetof(AsyncQueueControl, backend)); - size = add_size(size, SimpleLruShmemSize(NUM_NOTIFY_BUFFERS, 0)); + size = add_size(size, SimpleLruShmemSize(notify_buffers, 0)); return size; } @@ -537,11 +506,8 @@ AsyncShmemInit(void) /* * Create or attach to the AsyncQueueControl structure. - * - * The used entries in the backend[] array run from 1 to MaxBackends; the - * zero'th entry is unused but must be allocated. */ - size = mul_size(MaxBackends + 1, sizeof(QueueBackendStatus)); + size = mul_size(MaxBackends, sizeof(QueueBackendStatus)); size = add_size(size, offsetof(AsyncQueueControl, backend)); asyncQueueControl = (AsyncQueueControl *) @@ -553,25 +519,25 @@ AsyncShmemInit(void) SET_QUEUE_POS(QUEUE_HEAD, 0, 0); SET_QUEUE_POS(QUEUE_TAIL, 0, 0); QUEUE_STOP_PAGE = 0; - QUEUE_FIRST_LISTENER = InvalidBackendId; + QUEUE_FIRST_LISTENER = INVALID_PROC_NUMBER; asyncQueueControl->lastQueueFillWarn = 0; - /* zero'th entry won't be used, but let's initialize it anyway */ - for (int i = 0; i <= MaxBackends; i++) + for (int i = 0; i < MaxBackends; i++) { QUEUE_BACKEND_PID(i) = InvalidPid; QUEUE_BACKEND_DBOID(i) = InvalidOid; - QUEUE_NEXT_LISTENER(i) = InvalidBackendId; + QUEUE_NEXT_LISTENER(i) = INVALID_PROC_NUMBER; SET_QUEUE_POS(QUEUE_BACKEND_POS(i), 0, 0); } } /* - * Set up SLRU management of the pg_notify data. + * Set up SLRU management of the pg_notify data. Note that long segment + * names are used in order to avoid wraparound. */ NotifyCtl->PagePrecedes = asyncQueuePagePrecedes; - SimpleLruInit(NotifyCtl, "Notify", NUM_NOTIFY_BUFFERS, 0, - NotifySLRULock, "pg_notify", LWTRANCHE_NOTIFY_BUFFER, - SYNC_HANDLER_NONE); + SimpleLruInit(NotifyCtl, "notify", notify_buffers, 0, + "pg_notify", LWTRANCHE_NOTIFY_BUFFER, LWTRANCHE_NOTIFY_SLRU, + SYNC_HANDLER_NONE, true); if (!found) { @@ -1076,7 +1042,7 @@ Exec_ListenPreCommit(void) { QueuePosition head; QueuePosition max; - BackendId prevListener; + ProcNumber prevListener; /* * Nothing to do if we are already listening to something, nor if we @@ -1121,28 +1087,28 @@ Exec_ListenPreCommit(void) LWLockAcquire(NotifyQueueLock, LW_EXCLUSIVE); head = QUEUE_HEAD; max = QUEUE_TAIL; - prevListener = InvalidBackendId; - for (BackendId i = QUEUE_FIRST_LISTENER; i > 0; i = QUEUE_NEXT_LISTENER(i)) + prevListener = INVALID_PROC_NUMBER; + for (ProcNumber i = QUEUE_FIRST_LISTENER; i != INVALID_PROC_NUMBER; i = QUEUE_NEXT_LISTENER(i)) { if (QUEUE_BACKEND_DBOID(i) == MyDatabaseId) max = QUEUE_POS_MAX(max, QUEUE_BACKEND_POS(i)); /* Also find last listening backend before this one */ - if (i < MyBackendId) + if (i < MyProcNumber) prevListener = i; } - QUEUE_BACKEND_POS(MyBackendId) = max; - QUEUE_BACKEND_PID(MyBackendId) = MyProcPid; - QUEUE_BACKEND_DBOID(MyBackendId) = MyDatabaseId; + QUEUE_BACKEND_POS(MyProcNumber) = max; + QUEUE_BACKEND_PID(MyProcNumber) = MyProcPid; + QUEUE_BACKEND_DBOID(MyProcNumber) = MyDatabaseId; /* Insert backend into list of listeners at correct position */ - if (prevListener > 0) + if (prevListener != INVALID_PROC_NUMBER) { - QUEUE_NEXT_LISTENER(MyBackendId) = QUEUE_NEXT_LISTENER(prevListener); - QUEUE_NEXT_LISTENER(prevListener) = MyBackendId; + QUEUE_NEXT_LISTENER(MyProcNumber) = QUEUE_NEXT_LISTENER(prevListener); + QUEUE_NEXT_LISTENER(prevListener) = MyProcNumber; } else { - QUEUE_NEXT_LISTENER(MyBackendId) = QUEUE_FIRST_LISTENER; - QUEUE_FIRST_LISTENER = MyBackendId; + QUEUE_NEXT_LISTENER(MyProcNumber) = QUEUE_FIRST_LISTENER; + QUEUE_FIRST_LISTENER = MyProcNumber; } LWLockRelease(NotifyQueueLock); @@ -1274,23 +1240,23 @@ asyncQueueUnregister(void) */ LWLockAcquire(NotifyQueueLock, LW_EXCLUSIVE); /* Mark our entry as invalid */ - QUEUE_BACKEND_PID(MyBackendId) = InvalidPid; - QUEUE_BACKEND_DBOID(MyBackendId) = InvalidOid; + QUEUE_BACKEND_PID(MyProcNumber) = InvalidPid; + QUEUE_BACKEND_DBOID(MyProcNumber) = InvalidOid; /* and remove it from the list */ - if (QUEUE_FIRST_LISTENER == MyBackendId) - QUEUE_FIRST_LISTENER = QUEUE_NEXT_LISTENER(MyBackendId); + if (QUEUE_FIRST_LISTENER == MyProcNumber) + QUEUE_FIRST_LISTENER = QUEUE_NEXT_LISTENER(MyProcNumber); else { - for (BackendId i = QUEUE_FIRST_LISTENER; i > 0; i = QUEUE_NEXT_LISTENER(i)) + for (ProcNumber i = QUEUE_FIRST_LISTENER; i != INVALID_PROC_NUMBER; i = QUEUE_NEXT_LISTENER(i)) { - if (QUEUE_NEXT_LISTENER(i) == MyBackendId) + if (QUEUE_NEXT_LISTENER(i) == MyProcNumber) { - QUEUE_NEXT_LISTENER(i) = QUEUE_NEXT_LISTENER(MyBackendId); + QUEUE_NEXT_LISTENER(i) = QUEUE_NEXT_LISTENER(MyProcNumber); break; } } } - QUEUE_NEXT_LISTENER(MyBackendId) = InvalidBackendId; + QUEUE_NEXT_LISTENER(MyProcNumber) = INVALID_PROC_NUMBER; LWLockRelease(NotifyQueueLock); /* mark ourselves as no longer listed in the global array */ @@ -1305,27 +1271,11 @@ asyncQueueUnregister(void) static bool asyncQueueIsFull(void) { - int nexthead; - int boundary; + int64 headPage = QUEUE_POS_PAGE(QUEUE_HEAD); + int64 tailPage = QUEUE_POS_PAGE(QUEUE_TAIL); + int64 occupied = headPage - tailPage; - /* - * The queue is full if creating a new head page would create a page that - * logically precedes the current global tail pointer, ie, the head - * pointer would wrap around compared to the tail. We cannot create such - * a head page for fear of confusing slru.c. For safety we round the tail - * pointer back to a segment boundary (truncation logic in - * asyncQueueAdvanceTail does not do this, so doing it here is optional). - * - * Note that this test is *not* dependent on how much space there is on - * the current head page. This is necessary because asyncQueueAddEntries - * might try to create the next head page in any case. - */ - nexthead = QUEUE_POS_PAGE(QUEUE_HEAD) + 1; - if (nexthead > QUEUE_MAX_PAGE) - nexthead = 0; /* wrap around */ - boundary = QUEUE_STOP_PAGE; - boundary -= boundary % SLRU_PAGES_PER_SEGMENT; - return asyncQueuePagePrecedes(nexthead, boundary); + return occupied >= max_notify_queue_pages; } /* @@ -1336,7 +1286,7 @@ asyncQueueIsFull(void) static bool asyncQueueAdvance(volatile QueuePosition *position, int entryLength) { - int pageno = QUEUE_POS_PAGE(*position); + int64 pageno = QUEUE_POS_PAGE(*position); int offset = QUEUE_POS_OFFSET(*position); bool pageJump = false; @@ -1355,8 +1305,6 @@ asyncQueueAdvance(volatile QueuePosition *position, int entryLength) if (offset + QUEUEALIGN(AsyncQueueEntryEmptySize) > QUEUE_PAGESIZE) { pageno++; - if (pageno > QUEUE_MAX_PAGE) - pageno = 0; /* wrap around */ offset = 0; pageJump = true; } @@ -1402,19 +1350,17 @@ asyncQueueNotificationToEntry(Notification *n, AsyncQueueEntry *qe) * Eventually we will return NULL indicating all is done. * * We are holding NotifyQueueLock already from the caller and grab - * NotifySLRULock locally in this function. + * page specific SLRU bank lock locally in this function. */ static ListCell * asyncQueueAddEntries(ListCell *nextNotify) { AsyncQueueEntry qe; QueuePosition queue_head; - int pageno; + int64 pageno; int offset; int slotno; - - /* We hold both NotifyQueueLock and NotifySLRULock during this operation */ - LWLockAcquire(NotifySLRULock, LW_EXCLUSIVE); + LWLock *prevlock; /* * We work with a local copy of QUEUE_HEAD, which we write back to shared @@ -1433,11 +1379,13 @@ asyncQueueAddEntries(ListCell *nextNotify) * If this is the first write since the postmaster started, we need to * initialize the first page of the async SLRU. Otherwise, the current * page should be initialized already, so just fetch it. - * - * (We could also take the first path when the SLRU position has just - * wrapped around, but re-zeroing the page is harmless in that case.) */ pageno = QUEUE_POS_PAGE(queue_head); + prevlock = SimpleLruGetBankLock(NotifyCtl, pageno); + + /* We hold both NotifyQueueLock and SLRU bank lock during this operation */ + LWLockAcquire(prevlock, LW_EXCLUSIVE); + if (QUEUE_POS_IS_ZERO(queue_head)) slotno = SimpleLruZeroPage(NotifyCtl, pageno); else @@ -1483,6 +1431,17 @@ asyncQueueAddEntries(ListCell *nextNotify) /* Advance queue_head appropriately, and detect if page is full */ if (asyncQueueAdvance(&(queue_head), qe.length)) { + LWLock *lock; + + pageno = QUEUE_POS_PAGE(queue_head); + lock = SimpleLruGetBankLock(NotifyCtl, pageno); + if (lock != prevlock) + { + LWLockRelease(prevlock); + LWLockAcquire(lock, LW_EXCLUSIVE); + prevlock = lock; + } + /* * Page is full, so we're done here, but first fill the next page * with zeroes. The reason to do this is to ensure that slru.c's @@ -1509,7 +1468,7 @@ asyncQueueAddEntries(ListCell *nextNotify) /* Success, so update the global QUEUE_HEAD */ QUEUE_HEAD = queue_head; - LWLockRelease(NotifySLRULock); + LWLockRelease(prevlock); return nextNotify; } @@ -1546,22 +1505,14 @@ pg_notification_queue_usage(PG_FUNCTION_ARGS) static double asyncQueueUsage(void) { - int headPage = QUEUE_POS_PAGE(QUEUE_HEAD); - int tailPage = QUEUE_POS_PAGE(QUEUE_TAIL); - int occupied; - - occupied = headPage - tailPage; + int64 headPage = QUEUE_POS_PAGE(QUEUE_HEAD); + int64 tailPage = QUEUE_POS_PAGE(QUEUE_TAIL); + int64 occupied = headPage - tailPage; if (occupied == 0) return (double) 0; /* fast exit for common case */ - if (occupied < 0) - { - /* head has wrapped around, tail not yet */ - occupied += QUEUE_MAX_PAGE + 1; - } - - return (double) occupied / (double) ((QUEUE_MAX_PAGE + 1) / 2); + return (double) occupied / (double) max_notify_queue_pages; } /* @@ -1590,7 +1541,7 @@ asyncQueueFillWarning(void) QueuePosition min = QUEUE_HEAD; int32 minPid = InvalidPid; - for (BackendId i = QUEUE_FIRST_LISTENER; i > 0; i = QUEUE_NEXT_LISTENER(i)) + for (ProcNumber i = QUEUE_FIRST_LISTENER; i != INVALID_PROC_NUMBER; i = QUEUE_NEXT_LISTENER(i)) { Assert(QUEUE_BACKEND_PID(i) != InvalidPid); min = QUEUE_POS_MIN(min, QUEUE_BACKEND_POS(i)); @@ -1621,7 +1572,7 @@ asyncQueueFillWarning(void) * behind. Waken them anyway if they're far enough behind, so that they'll * advance their queue position pointers, allowing the global tail to advance. * - * Since we know the BackendId and the Pid the signaling is quite cheap. + * Since we know the ProcNumber and the Pid the signaling is quite cheap. * * This is called during CommitTransaction(), so it's important for it * to have very low probability of failure. @@ -1630,7 +1581,7 @@ static void SignalBackends(void) { int32 *pids; - BackendId *ids; + ProcNumber *procnos; int count; /* @@ -1642,11 +1593,11 @@ SignalBackends(void) * preallocate the arrays? They're not that large, though. */ pids = (int32 *) palloc(MaxBackends * sizeof(int32)); - ids = (BackendId *) palloc(MaxBackends * sizeof(BackendId)); + procnos = (ProcNumber *) palloc(MaxBackends * sizeof(ProcNumber)); count = 0; LWLockAcquire(NotifyQueueLock, LW_EXCLUSIVE); - for (BackendId i = QUEUE_FIRST_LISTENER; i > 0; i = QUEUE_NEXT_LISTENER(i)) + for (ProcNumber i = QUEUE_FIRST_LISTENER; i != INVALID_PROC_NUMBER; i = QUEUE_NEXT_LISTENER(i)) { int32 pid = QUEUE_BACKEND_PID(i); QueuePosition pos; @@ -1674,7 +1625,7 @@ SignalBackends(void) } /* OK, need to signal this one */ pids[count] = pid; - ids[count] = i; + procnos[count] = i; count++; } LWLockRelease(NotifyQueueLock); @@ -1700,12 +1651,12 @@ SignalBackends(void) * NotifyQueueLock; which is unlikely but certainly possible. So we * just log a low-level debug message if it happens. */ - if (SendProcSignal(pid, PROCSIG_NOTIFY_INTERRUPT, ids[i]) < 0) + if (SendProcSignal(pid, PROCSIG_NOTIFY_INTERRUPT, procnos[i]) < 0) elog(DEBUG3, "could not signal backend with PID %d: %m", pid); } pfree(pids); - pfree(ids); + pfree(procnos); } /* @@ -1913,8 +1864,8 @@ asyncQueueReadAllNotifications(void) /* Fetch current state */ LWLockAcquire(NotifyQueueLock, LW_SHARED); /* Assert checks that we have a valid state entry */ - Assert(MyProcPid == QUEUE_BACKEND_PID(MyBackendId)); - pos = QUEUE_BACKEND_POS(MyBackendId); + Assert(MyProcPid == QUEUE_BACKEND_PID(MyProcNumber)); + pos = QUEUE_BACKEND_POS(MyProcNumber); head = QUEUE_HEAD; LWLockRelease(NotifyQueueLock); @@ -1981,16 +1932,16 @@ asyncQueueReadAllNotifications(void) do { - int curpage = QUEUE_POS_PAGE(pos); + int64 curpage = QUEUE_POS_PAGE(pos); int curoffset = QUEUE_POS_OFFSET(pos); int slotno; int copysize; /* * We copy the data from SLRU into a local buffer, so as to avoid - * holding the NotifySLRULock while we are examining the entries - * and possibly transmitting them to our frontend. Copy only the - * part of the page we will actually inspect. + * holding the SLRU lock while we are examining the entries and + * possibly transmitting them to our frontend. Copy only the part + * of the page we will actually inspect. */ slotno = SimpleLruReadPage_ReadOnly(NotifyCtl, curpage, InvalidTransactionId); @@ -2010,7 +1961,7 @@ asyncQueueReadAllNotifications(void) NotifyCtl->shared->page_buffer[slotno] + curoffset, copysize); /* Release lock that we got from SimpleLruReadPage_ReadOnly() */ - LWLockRelease(NotifySLRULock); + LWLockRelease(SimpleLruGetBankLock(NotifyCtl, curpage)); /* * Process messages up to the stop position, end of page, or an @@ -2036,7 +1987,7 @@ asyncQueueReadAllNotifications(void) { /* Update shared state */ LWLockAcquire(NotifyQueueLock, LW_SHARED); - QUEUE_BACKEND_POS(MyBackendId) = pos; + QUEUE_BACKEND_POS(MyProcNumber) = pos; LWLockRelease(NotifyQueueLock); } PG_END_TRY(); @@ -2051,7 +2002,7 @@ asyncQueueReadAllNotifications(void) * * The current page must have been fetched into page_buffer from shared * memory. (We could access the page right in shared memory, but that - * would imply holding the NotifySLRULock throughout this routine.) + * would imply holding the SLRU bank lock throughout this routine.) * * We stop if we reach the "stop" position, or reach a notification from an * uncommitted transaction, or reach the end of the page. @@ -2157,9 +2108,9 @@ static void asyncQueueAdvanceTail(void) { QueuePosition min; - int oldtailpage; - int newtailpage; - int boundary; + int64 oldtailpage; + int64 newtailpage; + int64 boundary; /* Restrict task to one backend per cluster; see SimpleLruTruncate(). */ LWLockAcquire(NotifyQueueTailLock, LW_EXCLUSIVE); @@ -2183,7 +2134,7 @@ asyncQueueAdvanceTail(void) */ LWLockAcquire(NotifyQueueLock, LW_EXCLUSIVE); min = QUEUE_HEAD; - for (BackendId i = QUEUE_FIRST_LISTENER; i > 0; i = QUEUE_NEXT_LISTENER(i)) + for (ProcNumber i = QUEUE_FIRST_LISTENER; i != INVALID_PROC_NUMBER; i = QUEUE_NEXT_LISTENER(i)) { Assert(QUEUE_BACKEND_PID(i) != InvalidPid); min = QUEUE_POS_MIN(min, QUEUE_BACKEND_POS(i)); @@ -2204,16 +2155,11 @@ asyncQueueAdvanceTail(void) if (asyncQueuePagePrecedes(oldtailpage, boundary)) { /* - * SimpleLruTruncate() will ask for NotifySLRULock but will also + * SimpleLruTruncate() will ask for SLRU bank locks but will also * release the lock again. */ SimpleLruTruncate(NotifyCtl, newtailpage); - /* - * Update QUEUE_STOP_PAGE. This changes asyncQueueIsFull()'s verdict - * for the segment immediately prior to the old tail, allowing fresh - * data into that segment. - */ LWLockAcquire(NotifyQueueLock, LW_EXCLUSIVE); QUEUE_STOP_PAGE = newtailpage; LWLockRelease(NotifyQueueLock); @@ -2236,6 +2182,8 @@ asyncQueueAdvanceTail(void) static void ProcessIncomingNotify(bool flush) { + MemoryContext oldcontext; + /* We *must* reset the flag */ notifyInterruptPending = false; @@ -2250,14 +2198,21 @@ ProcessIncomingNotify(bool flush) /* * We must run asyncQueueReadAllNotifications inside a transaction, else - * bad things happen if it gets an error. + * bad things happen if it gets an error. However, we need to preserve + * the caller's memory context (typically MessageContext). */ + oldcontext = CurrentMemoryContext; + StartTransactionCommand(); asyncQueueReadAllNotifications(); CommitTransactionCommand(); + /* Caller's context had better not have been transaction-local */ + Assert(MemoryContextIsValid(oldcontext)); + MemoryContextSwitchTo(oldcontext); + /* * If this isn't an end-of-command case, we must flush the notify messages * to ensure frontend gets them promptly. @@ -2281,7 +2236,7 @@ NotifyMyFrontEnd(const char *channel, const char *payload, int32 srcPid) { StringInfoData buf; - pq_beginmessage(&buf, 'A'); + pq_beginmessage(&buf, PqMsg_NotificationResponse); pq_sendint32(&buf, srcPid); pq_sendstring(&buf, channel); pq_sendstring(&buf, payload); @@ -2353,7 +2308,7 @@ AddEventToPendingNotifies(Notification *n) /* Create the hash table */ hash_ctl.keysize = sizeof(Notification *); - hash_ctl.entrysize = sizeof(NotificationHash); + hash_ctl.entrysize = sizeof(struct NotificationHash); hash_ctl.hash = notification_hash; hash_ctl.match = notification_match; hash_ctl.hcxt = CurTransactionContext; @@ -2367,15 +2322,13 @@ AddEventToPendingNotifies(Notification *n) foreach(l, pendingNotifies->events) { Notification *oldn = (Notification *) lfirst(l); - NotificationHash *hentry; bool found; - hentry = (NotificationHash *) hash_search(pendingNotifies->hashtab, - &oldn, - HASH_ENTER, - &found); + (void) hash_search(pendingNotifies->hashtab, + &oldn, + HASH_ENTER, + &found); Assert(!found); - hentry->event = oldn; } } @@ -2385,15 +2338,13 @@ AddEventToPendingNotifies(Notification *n) /* Add event to the hash table if needed */ if (pendingNotifies->hashtab != NULL) { - NotificationHash *hentry; bool found; - hentry = (NotificationHash *) hash_search(pendingNotifies->hashtab, - &n, - HASH_ENTER, - &found); + (void) hash_search(pendingNotifies->hashtab, + &n, + HASH_ENTER, + &found); Assert(!found); - hentry->event = n; } } @@ -2444,3 +2395,12 @@ ClearPendingActionsAndNotifies(void) pendingActions = NULL; pendingNotifies = NULL; } + +/* + * GUC check_hook for notify_buffers + */ +bool +check_notify_buffers(int *newval, void **extra, GucSource source) +{ + return check_slru_buffers("notify_buffers", newval); +} diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 03b24ab90f156..78f96789b0e84 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -6,7 +6,7 @@ * There is hardly anything left of Paul Brown's original implementation... * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * @@ -25,14 +25,12 @@ #include "access/toast_internals.h" #include "access/transam.h" #include "access/xact.h" -#include "access/xlog.h" #include "catalog/catalog.h" #include "catalog/dependency.h" #include "catalog/heap.h" #include "catalog/index.h" #include "catalog/namespace.h" #include "catalog/objectaccess.h" -#include "catalog/partition.h" #include "catalog/pg_am.h" #include "catalog/pg_database.h" #include "catalog/pg_inherits.h" @@ -58,7 +56,6 @@ #include "utils/relmapper.h" #include "utils/snapmgr.h" #include "utils/syscache.h" -#include "utils/tuplesort.h" /* * This struct is used to pass around the information on tables to be @@ -355,6 +352,7 @@ cluster_rel(Oid tableOid, Oid indexOid, ClusterParams *params) SetUserIdAndSecContext(OldHeap->rd_rel->relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); /* * Since we may open a new transaction for each relation, we have to check @@ -921,18 +919,24 @@ copy_table_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose, * FreezeXid will become the table's new relfrozenxid, and that mustn't go * backwards, so take the max. */ - if (TransactionIdIsValid(OldHeap->rd_rel->relfrozenxid) && - TransactionIdPrecedes(cutoffs.FreezeLimit, - OldHeap->rd_rel->relfrozenxid)) - cutoffs.FreezeLimit = OldHeap->rd_rel->relfrozenxid; + { + TransactionId relfrozenxid = OldHeap->rd_rel->relfrozenxid; + + if (TransactionIdIsValid(relfrozenxid) && + TransactionIdPrecedes(cutoffs.FreezeLimit, relfrozenxid)) + cutoffs.FreezeLimit = relfrozenxid; + } /* * MultiXactCutoff, similarly, shouldn't go backwards either. */ - if (MultiXactIdIsValid(OldHeap->rd_rel->relminmxid) && - MultiXactIdPrecedes(cutoffs.MultiXactCutoff, - OldHeap->rd_rel->relminmxid)) - cutoffs.MultiXactCutoff = OldHeap->rd_rel->relminmxid; + { + MultiXactId relminmxid = OldHeap->rd_rel->relminmxid; + + if (MultiXactIdIsValid(relminmxid) && + MultiXactIdPrecedes(cutoffs.MultiXactCutoff, relminmxid)) + cutoffs.MultiXactCutoff = relminmxid; + } /* * Decide whether to use an indexscan or seqscan-and-optional-sort to scan @@ -1273,7 +1277,7 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class, AccessMethodRelationId, relam1, relam2) != 1) - elog(ERROR, "failed to change access method dependency for relation \"%s.%s\"", + elog(ERROR, "could not change access method dependency for relation \"%s.%s\"", get_namespace_name(get_rel_namespace(r1)), get_rel_name(r1)); if (changeDependencyFor(RelationRelationId, @@ -1281,7 +1285,7 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class, AccessMethodRelationId, relam2, relam1) != 1) - elog(ERROR, "failed to change access method dependency for relation \"%s.%s\"", + elog(ERROR, "could not change access method dependency for relation \"%s.%s\"", get_namespace_name(get_rel_namespace(r2)), get_rel_name(r2)); } @@ -1424,25 +1428,6 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class, heap_freetuple(reltup2); table_close(relRelation, RowExclusiveLock); - - /* - * Close both relcache entries' smgr links. We need this kluge because - * both links will be invalidated during upcoming CommandCounterIncrement. - * Whichever of the rels is the second to be cleared will have a dangling - * reference to the other's smgr entry. Rather than trying to avoid this - * by ordering operations just so, it's easiest to close the links first. - * (Fortunately, since one of the entries is local in our transaction, - * it's sufficient to clear out our own relcache this way; the problem - * cannot arise for other backends when they see our update on the - * non-transient relation.) - * - * Caution: the placement of this step interacts with the decision to - * handle toast rels by recursion. When we are trying to rebuild pg_class - * itself, the smgr close on pg_class must happen after all accesses in - * this function. - */ - RelationCloseSmgrByOid(r1); - RelationCloseSmgrByOid(r2); } /* @@ -1520,7 +1505,7 @@ finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap, pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE, PROGRESS_CLUSTER_PHASE_REBUILD_INDEX); - reindex_relation(OIDOldHeap, reindex_flags, &reindex_params); + reindex_relation(NULL, OIDOldHeap, reindex_flags, &reindex_params); /* Report that we are now doing clean up */ pgstat_progress_update_param(PROGRESS_CLUSTER_PHASE, diff --git a/src/backend/commands/collationcmds.c b/src/backend/commands/collationcmds.c index efb8b4d289f8e..63ef9a08411b0 100644 --- a/src/backend/commands/collationcmds.c +++ b/src/backend/commands/collationcmds.c @@ -3,7 +3,7 @@ * collationcmds.c * collation-related commands support code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -17,14 +17,12 @@ #include "access/htup_details.h" #include "access/table.h" #include "access/xact.h" -#include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/namespace.h" #include "catalog/objectaccess.h" #include "catalog/pg_collation.h" #include "catalog/pg_database.h" #include "catalog/pg_namespace.h" -#include "commands/alter.h" #include "commands/collationcmds.h" #include "commands/comment.h" #include "commands/dbcommands.h" @@ -68,7 +66,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e DefElem *versionEl = NULL; char *collcollate; char *collctype; - char *colliculocale; + const char *colllocale; char *collicurules; bool collisdeterministic; int collencoding; @@ -159,11 +157,11 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e else collctype = NULL; - datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_colliculocale, &isnull); + datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_colllocale, &isnull); if (!isnull) - colliculocale = TextDatumGetCString(datum); + colllocale = TextDatumGetCString(datum); else - colliculocale = NULL; + colllocale = NULL; /* * When the ICU locale comes from an existing collation, do not @@ -196,7 +194,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e collcollate = NULL; collctype = NULL; - colliculocale = NULL; + colllocale = NULL; collicurules = NULL; if (providerEl) @@ -215,7 +213,9 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e if (collproviderstr) { - if (pg_strcasecmp(collproviderstr, "icu") == 0) + if (pg_strcasecmp(collproviderstr, "builtin") == 0) + collprovider = COLLPROVIDER_BUILTIN; + else if (pg_strcasecmp(collproviderstr, "icu") == 0) collprovider = COLLPROVIDER_ICU; else if (pg_strcasecmp(collproviderstr, "libc") == 0) collprovider = COLLPROVIDER_LIBC; @@ -236,7 +236,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e collctype = defGetString(localeEl); } else - colliculocale = defGetString(localeEl); + colllocale = defGetString(localeEl); } if (lccollateEl) @@ -245,24 +245,38 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e if (lcctypeEl) collctype = defGetString(lcctypeEl); - if (collprovider == COLLPROVIDER_LIBC) + if (collprovider == COLLPROVIDER_BUILTIN) + { + if (!colllocale) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("parameter \"%s\" must be specified", + "locale"))); + + colllocale = builtin_validate_locale(GetDatabaseEncoding(), + colllocale); + } + else if (collprovider == COLLPROVIDER_LIBC) { if (!collcollate) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("parameter \"lc_collate\" must be specified"))); + errmsg("parameter \"%s\" must be specified", + "lc_collate"))); if (!collctype) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("parameter \"lc_ctype\" must be specified"))); + errmsg("parameter \"%s\" must be specified", + "lc_ctype"))); } else if (collprovider == COLLPROVIDER_ICU) { - if (!colliculocale) + if (!colllocale) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("parameter \"locale\" must be specified"))); + errmsg("parameter \"%s\" must be specified", + "locale"))); /* * During binary upgrade, preserve the locale string. Otherwise, @@ -270,20 +284,20 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e */ if (!IsBinaryUpgrade) { - char *langtag = icu_language_tag(colliculocale, + char *langtag = icu_language_tag(colllocale, icu_validation_level); - if (langtag && strcmp(colliculocale, langtag) != 0) + if (langtag && strcmp(colllocale, langtag) != 0) { ereport(NOTICE, (errmsg("using standard form \"%s\" for ICU locale \"%s\"", - langtag, colliculocale))); + langtag, colllocale))); - colliculocale = langtag; + colllocale = langtag; } } - icu_validate_locale(colliculocale); + icu_validate_locale(colllocale); } /* @@ -302,7 +316,11 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("ICU rules cannot be specified unless locale provider is ICU"))); - if (collprovider == COLLPROVIDER_ICU) + if (collprovider == COLLPROVIDER_BUILTIN) + { + collencoding = builtin_locale_encoding(colllocale); + } + else if (collprovider == COLLPROVIDER_ICU) { #ifdef USE_ICU /* @@ -331,7 +349,16 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e } if (!collversion) - collversion = get_collation_actual_version(collprovider, collprovider == COLLPROVIDER_ICU ? colliculocale : collcollate); + { + const char *locale; + + if (collprovider == COLLPROVIDER_LIBC) + locale = collcollate; + else + locale = colllocale; + + collversion = get_collation_actual_version(collprovider, locale); + } newoid = CollationCreate(collName, collNamespace, @@ -341,7 +368,7 @@ DefineCollation(ParseState *pstate, List *names, List *parameters, bool if_not_e collencoding, collcollate, collctype, - colliculocale, + colllocale, collicurules, collversion, if_not_exists, @@ -416,7 +443,9 @@ AlterCollation(AlterCollationStmt *stmt) if (collOid == DEFAULT_COLLATION_OID) ereport(ERROR, (errmsg("cannot refresh version of default collation"), - errhint("Use ALTER DATABASE ... REFRESH COLLATION VERSION instead."))); + /* translator: %s is an SQL command */ + errhint("Use %s instead.", + "ALTER DATABASE ... REFRESH COLLATION VERSION"))); if (!object_ownercheck(CollationRelationId, collOid, GetUserId())) aclcheck_error(ACLCHECK_NOT_OWNER, OBJECT_COLLATION, @@ -430,8 +459,13 @@ AlterCollation(AlterCollationStmt *stmt) datum = SysCacheGetAttr(COLLOID, tup, Anum_pg_collation_collversion, &isnull); oldversion = isnull ? NULL : TextDatumGetCString(datum); - datum = SysCacheGetAttrNotNull(COLLOID, tup, collForm->collprovider == COLLPROVIDER_ICU ? Anum_pg_collation_colliculocale : Anum_pg_collation_collcollate); - newversion = get_collation_actual_version(collForm->collprovider, TextDatumGetCString(datum)); + if (collForm->collprovider == COLLPROVIDER_LIBC) + datum = SysCacheGetAttrNotNull(COLLOID, tup, Anum_pg_collation_collcollate); + else + datum = SysCacheGetAttrNotNull(COLLOID, tup, Anum_pg_collation_colllocale); + + newversion = get_collation_actual_version(collForm->collprovider, + TextDatumGetCString(datum)); /* cannot change from NULL to non-NULL or vice versa */ if ((!oldversion && newversion) || (oldversion && !newversion)) @@ -495,11 +529,16 @@ pg_collation_actual_version(PG_FUNCTION_ARGS) provider = ((Form_pg_database) GETSTRUCT(dbtup))->datlocprovider; - datum = SysCacheGetAttrNotNull(DATABASEOID, dbtup, - provider == COLLPROVIDER_ICU ? - Anum_pg_database_daticulocale : Anum_pg_database_datcollate); - - locale = TextDatumGetCString(datum); + if (provider == COLLPROVIDER_LIBC) + { + datum = SysCacheGetAttrNotNull(DATABASEOID, dbtup, Anum_pg_database_datcollate); + locale = TextDatumGetCString(datum); + } + else + { + datum = SysCacheGetAttrNotNull(DATABASEOID, dbtup, Anum_pg_database_datlocale); + locale = TextDatumGetCString(datum); + } ReleaseSysCache(dbtup); } @@ -516,11 +555,17 @@ pg_collation_actual_version(PG_FUNCTION_ARGS) provider = ((Form_pg_collation) GETSTRUCT(colltp))->collprovider; Assert(provider != COLLPROVIDER_DEFAULT); - datum = SysCacheGetAttrNotNull(COLLOID, colltp, - provider == COLLPROVIDER_ICU ? - Anum_pg_collation_colliculocale : Anum_pg_collation_collcollate); - locale = TextDatumGetCString(datum); + if (provider == COLLPROVIDER_LIBC) + { + datum = SysCacheGetAttrNotNull(COLLOID, colltp, Anum_pg_collation_collcollate); + locale = TextDatumGetCString(datum); + } + else + { + datum = SysCacheGetAttrNotNull(COLLOID, colltp, Anum_pg_collation_colllocale); + locale = TextDatumGetCString(datum); + } ReleaseSysCache(colltp); } @@ -534,7 +579,7 @@ pg_collation_actual_version(PG_FUNCTION_ARGS) /* will we use "locale -a" in pg_import_system_collations? */ -#if defined(HAVE_LOCALE_T) && !defined(WIN32) +#if !defined(WIN32) #define READ_LOCALE_A_OUTPUT #endif diff --git a/src/backend/commands/comment.c b/src/backend/commands/comment.c index 26c4d59202f9f..e9d50fc7d876f 100644 --- a/src/backend/commands/comment.c +++ b/src/backend/commands/comment.c @@ -4,7 +4,7 @@ * * PostgreSQL object comments utility code. * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/commands/comment.c diff --git a/src/backend/commands/constraint.c b/src/backend/commands/constraint.c index 35c4451fc063b..f7dc42f7452c7 100644 --- a/src/backend/commands/constraint.c +++ b/src/backend/commands/constraint.c @@ -3,7 +3,7 @@ * constraint.c * PostgreSQL CONSTRAINT support code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -14,13 +14,11 @@ #include "postgres.h" #include "access/genam.h" -#include "access/heapam.h" #include "access/tableam.h" #include "catalog/index.h" #include "commands/trigger.h" #include "executor/executor.h" -#include "utils/builtins.h" -#include "utils/rel.h" +#include "utils/fmgrprotos.h" #include "utils/snapmgr.h" @@ -176,6 +174,9 @@ unique_key_recheck(PG_FUNCTION_ARGS) index_insert(indexRel, values, isnull, &checktid, trigdata->tg_relation, UNIQUE_CHECK_EXISTING, false, indexInfo); + + /* Cleanup cache possibly initialized by index_insert. */ + index_insert_cleanup(indexRel, indexInfo); } else { diff --git a/src/backend/commands/conversioncmds.c b/src/backend/commands/conversioncmds.c index a4c7aa9608521..ddd5d1d1c54a2 100644 --- a/src/backend/commands/conversioncmds.c +++ b/src/backend/commands/conversioncmds.c @@ -3,7 +3,7 @@ * conversioncmds.c * conversion creation command support code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -14,23 +14,16 @@ */ #include "postgres.h" -#include "access/htup_details.h" -#include "catalog/dependency.h" -#include "catalog/indexing.h" #include "catalog/pg_conversion.h" #include "catalog/pg_namespace.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" -#include "commands/alter.h" #include "commands/conversioncmds.h" #include "mb/pg_wchar.h" #include "miscadmin.h" #include "parser/parse_func.h" #include "utils/acl.h" -#include "utils/builtins.h" #include "utils/lsyscache.h" -#include "utils/rel.h" -#include "utils/syscache.h" /* * CREATE CONVERSION diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index f14fae330837c..e557982071da5 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -3,7 +3,7 @@ * copy.c * Implements the COPY utility command * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -33,11 +33,9 @@ #include "parser/parse_collate.h" #include "parser/parse_expr.h" #include "parser/parse_relation.h" -#include "rewrite/rewriteHandler.h" #include "utils/acl.h" #include "utils/builtins.h" #include "utils/lsyscache.h" -#include "utils/memutils.h" #include "utils/rel.h" #include "utils/rls.h" @@ -283,12 +281,6 @@ DoCopy(ParseState *pstate, const CopyStmt *stmt, { Assert(stmt->query); - /* MERGE is allowed by parser, but unimplemented. Reject for now */ - if (IsA(stmt->query, MergeStmt)) - ereport(ERROR, - errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("MERGE not supported in COPY")); - query = makeNode(RawStmt); query->stmt = stmt->query; query->stmt_location = stmt_location; @@ -394,6 +386,63 @@ defGetCopyHeaderChoice(DefElem *def, bool is_from) return COPY_HEADER_FALSE; /* keep compiler quiet */ } +/* + * Extract a CopyOnErrorChoice value from a DefElem. + */ +static CopyOnErrorChoice +defGetCopyOnErrorChoice(DefElem *def, ParseState *pstate, bool is_from) +{ + char *sval = defGetString(def); + + if (!is_from) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR, + second %s is a COPY with direction, e.g. COPY TO */ + errmsg("COPY %s cannot be used with %s", "ON_ERROR", "COPY TO"), + parser_errposition(pstate, def->location))); + + /* + * Allow "stop", or "ignore" values. + */ + if (pg_strcasecmp(sval, "stop") == 0) + return COPY_ON_ERROR_STOP; + if (pg_strcasecmp(sval, "ignore") == 0) + return COPY_ON_ERROR_IGNORE; + + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR */ + errmsg("COPY %s \"%s\" not recognized", "ON_ERROR", sval), + parser_errposition(pstate, def->location))); + return COPY_ON_ERROR_STOP; /* keep compiler quiet */ +} + +/* + * Extract a CopyLogVerbosityChoice value from a DefElem. + */ +static CopyLogVerbosityChoice +defGetCopyLogVerbosityChoice(DefElem *def, ParseState *pstate) +{ + char *sval; + + /* + * Allow "default", or "verbose" values. + */ + sval = defGetString(def); + if (pg_strcasecmp(sval, "default") == 0) + return COPY_LOG_VERBOSITY_DEFAULT; + if (pg_strcasecmp(sval, "verbose") == 0) + return COPY_LOG_VERBOSITY_VERBOSE; + + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR */ + errmsg("COPY %s \"%s\" not recognized", "LOG_VERBOSITY", sval), + parser_errposition(pstate, def->location))); + return COPY_LOG_VERBOSITY_DEFAULT; /* keep compiler quiet */ +} + /* * Process the statement option list for COPY. * @@ -419,6 +468,8 @@ ProcessCopyOptions(ParseState *pstate, bool format_specified = false; bool freeze_specified = false; bool header_specified = false; + bool on_error_specified = false; + bool log_verbosity_specified = false; ListCell *option; /* Support external use for option sanity checking */ @@ -512,9 +563,11 @@ ProcessCopyOptions(ParseState *pstate, } else if (strcmp(defel->defname, "force_not_null") == 0) { - if (opts_out->force_notnull) + if (opts_out->force_notnull || opts_out->force_notnull_all) errorConflictingDefElem(defel, pstate); - if (defel->arg && IsA(defel->arg, List)) + if (defel->arg && IsA(defel->arg, A_Star)) + opts_out->force_notnull_all = true; + else if (defel->arg && IsA(defel->arg, List)) opts_out->force_notnull = castNode(List, defel->arg); else ereport(ERROR, @@ -525,9 +578,11 @@ ProcessCopyOptions(ParseState *pstate, } else if (strcmp(defel->defname, "force_null") == 0) { - if (opts_out->force_null) + if (opts_out->force_null || opts_out->force_null_all) errorConflictingDefElem(defel, pstate); - if (defel->arg && IsA(defel->arg, List)) + if (defel->arg && IsA(defel->arg, A_Star)) + opts_out->force_null_all = true; + else if (defel->arg && IsA(defel->arg, List)) opts_out->force_null = castNode(List, defel->arg); else ereport(ERROR, @@ -567,6 +622,20 @@ ProcessCopyOptions(ParseState *pstate, defel->defname), parser_errposition(pstate, defel->location))); } + else if (strcmp(defel->defname, "on_error") == 0) + { + if (on_error_specified) + errorConflictingDefElem(defel, pstate); + on_error_specified = true; + opts_out->on_error = defGetCopyOnErrorChoice(defel, pstate, is_from); + } + else if (strcmp(defel->defname, "log_verbosity") == 0) + { + if (log_verbosity_specified) + errorConflictingDefElem(defel, pstate); + log_verbosity_specified = true; + opts_out->log_verbosity = defGetCopyLogVerbosityChoice(defel, pstate); + } else ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -582,17 +651,23 @@ ProcessCopyOptions(ParseState *pstate, if (opts_out->binary && opts_out->delim) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("cannot specify DELIMITER in BINARY mode"))); + /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */ + errmsg("cannot specify %s in BINARY mode", "DELIMITER"))); if (opts_out->binary && opts_out->null_print) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("cannot specify NULL in BINARY mode"))); + errmsg("cannot specify %s in BINARY mode", "NULL"))); if (opts_out->binary && opts_out->default_print) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("cannot specify DEFAULT in BINARY mode"))); + errmsg("cannot specify %s in BINARY mode", "DEFAULT"))); + + if (opts_out->binary && opts_out->on_error != COPY_ON_ERROR_STOP) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("only ON_ERROR STOP is allowed in BINARY mode"))); /* Set defaults for omitted options */ if (!opts_out->delim) @@ -661,13 +736,15 @@ ProcessCopyOptions(ParseState *pstate, if (opts_out->binary && opts_out->header_line) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot specify HEADER in BINARY mode"))); + /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */ + errmsg("cannot specify %s in BINARY mode", "HEADER"))); /* Check quote */ if (!opts_out->csv_mode && opts_out->quote != NULL) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("COPY quote available only in CSV mode"))); + /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */ + errmsg("COPY %s requires CSV mode", "QUOTE"))); if (opts_out->csv_mode && strlen(opts_out->quote) != 1) ereport(ERROR, @@ -683,7 +760,8 @@ ProcessCopyOptions(ParseState *pstate, if (!opts_out->csv_mode && opts_out->escape != NULL) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("COPY escape available only in CSV mode"))); + /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */ + errmsg("COPY %s requires CSV mode", "ESCAPE"))); if (opts_out->csv_mode && strlen(opts_out->escape) != 1) ereport(ERROR, @@ -694,65 +772,101 @@ ProcessCopyOptions(ParseState *pstate, if (!opts_out->csv_mode && (opts_out->force_quote || opts_out->force_quote_all)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("COPY force quote available only in CSV mode"))); + /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */ + errmsg("COPY %s requires CSV mode", "FORCE_QUOTE"))); if ((opts_out->force_quote || opts_out->force_quote_all) && is_from) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("COPY force quote only available using COPY TO"))); + /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR, + second %s is a COPY with direction, e.g. COPY TO */ + errmsg("COPY %s cannot be used with %s", "FORCE_QUOTE", + "COPY FROM"))); /* Check force_notnull */ - if (!opts_out->csv_mode && opts_out->force_notnull != NIL) + if (!opts_out->csv_mode && (opts_out->force_notnull != NIL || + opts_out->force_notnull_all)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("COPY force not null available only in CSV mode"))); - if (opts_out->force_notnull != NIL && !is_from) + /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */ + errmsg("COPY %s requires CSV mode", "FORCE_NOT_NULL"))); + if ((opts_out->force_notnull != NIL || opts_out->force_notnull_all) && + !is_from) ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("COPY force not null only available using COPY FROM"))); + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR, + second %s is a COPY with direction, e.g. COPY TO */ + errmsg("COPY %s cannot be used with %s", "FORCE_NOT_NULL", + "COPY TO"))); /* Check force_null */ - if (!opts_out->csv_mode && opts_out->force_null != NIL) + if (!opts_out->csv_mode && (opts_out->force_null != NIL || + opts_out->force_null_all)) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("COPY force null available only in CSV mode"))); + /*- translator: %s is the name of a COPY option, e.g. ON_ERROR */ + errmsg("COPY %s requires CSV mode", "FORCE_NULL"))); - if (opts_out->force_null != NIL && !is_from) + if ((opts_out->force_null != NIL || opts_out->force_null_all) && + !is_from) ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("COPY force null only available using COPY FROM"))); + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR, + second %s is a COPY with direction, e.g. COPY TO */ + errmsg("COPY %s cannot be used with %s", "FORCE_NULL", + "COPY TO"))); /* Don't allow the delimiter to appear in the null string. */ if (strchr(opts_out->null_print, opts_out->delim[0]) != NULL) ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("COPY delimiter must not appear in the NULL specification"))); + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + /*- translator: %s is the name of a COPY option, e.g. NULL */ + errmsg("COPY delimiter character must not appear in the %s specification", + "NULL"))); /* Don't allow the CSV quote char to appear in the null string. */ if (opts_out->csv_mode && strchr(opts_out->null_print, opts_out->quote[0]) != NULL) ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("CSV quote character must not appear in the NULL specification"))); + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + /*- translator: %s is the name of a COPY option, e.g. NULL */ + errmsg("CSV quote character must not appear in the %s specification", + "NULL"))); + + /* Check freeze */ + if (opts_out->freeze && !is_from) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR, + second %s is a COPY with direction, e.g. COPY TO */ + errmsg("COPY %s cannot be used with %s", "FREEZE", + "COPY TO"))); if (opts_out->default_print) { if (!is_from) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("COPY DEFAULT only available using COPY FROM"))); + /*- translator: first %s is the name of a COPY option, e.g. ON_ERROR, + second %s is a COPY with direction, e.g. COPY TO */ + errmsg("COPY %s cannot be used with %s", "DEFAULT", + "COPY TO"))); /* Don't allow the delimiter to appear in the default string. */ if (strchr(opts_out->default_print, opts_out->delim[0]) != NULL) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("COPY delimiter must not appear in the DEFAULT specification"))); + /*- translator: %s is the name of a COPY option, e.g. NULL */ + errmsg("COPY delimiter character must not appear in the %s specification", + "DEFAULT"))); /* Don't allow the CSV quote char to appear in the default string. */ if (opts_out->csv_mode && strchr(opts_out->default_print, opts_out->quote[0]) != NULL) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("CSV quote character must not appear in the DEFAULT specification"))); + /*- translator: %s is the name of a COPY option, e.g. NULL */ + errmsg("CSV quote character must not appear in the %s specification", + "DEFAULT"))); /* Don't allow the NULL and DEFAULT string to be the same */ if (opts_out->null_print_len == opts_out->default_print_len && diff --git a/src/backend/commands/copyfrom.c b/src/backend/commands/copyfrom.c index 80bca79cd0ed8..f25af1fa1e8f1 100644 --- a/src/backend/commands/copyfrom.c +++ b/src/backend/commands/copyfrom.c @@ -9,7 +9,7 @@ * Reading data from the input file or client and parsing it into Datums * is handled in copyfromparse.c. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,10 +25,8 @@ #include #include "access/heapam.h" -#include "access/htup_details.h" #include "access/tableam.h" #include "access/xact.h" -#include "access/xlog.h" #include "catalog/namespace.h" #include "commands/copy.h" #include "commands/copyfrom_internal.h" @@ -39,9 +37,9 @@ #include "executor/nodeModifyTable.h" #include "executor/tuptable.h" #include "foreign/fdwapi.h" -#include "libpq/libpq.h" -#include "libpq/pqformat.h" +#include "mb/pg_wchar.h" #include "miscadmin.h" +#include "nodes/miscnodes.h" #include "optimizer/optimizer.h" #include "pgstat.h" #include "rewrite/rewriteHandler.h" @@ -103,8 +101,6 @@ typedef struct CopyMultiInsertInfo /* non-export function prototypes */ -static char *limit_printout_length(const char *str); - static void ClosePipeFromProgram(CopyFromState cstate); /* @@ -143,7 +139,7 @@ CopyFromErrorCallback(void *arg) /* error is relevant to a particular column */ char *attval; - attval = limit_printout_length(cstate->cur_attval); + attval = CopyLimitPrintoutLength(cstate->cur_attval); errcontext("COPY %s, line %llu, column %s: \"%s\"", cstate->cur_relname, (unsigned long long) cstate->cur_lineno, @@ -170,7 +166,7 @@ CopyFromErrorCallback(void *arg) { char *lineval; - lineval = limit_printout_length(cstate->line_buf.data); + lineval = CopyLimitPrintoutLength(cstate->line_buf.data); errcontext("COPY %s, line %llu: \"%s\"", cstate->cur_relname, (unsigned long long) cstate->cur_lineno, lineval); @@ -191,8 +187,8 @@ CopyFromErrorCallback(void *arg) * * Returns a pstrdup'd copy of the input. */ -static char * -limit_printout_length(const char *str) +char * +CopyLimitPrintoutLength(const char *str) { #define MAX_COPY_DATA_DISPLAY 100 @@ -649,6 +645,7 @@ CopyFrom(CopyFromState cstate) CopyMultiInsertInfo multiInsertInfo = {0}; /* pacify compiler */ int64 processed = 0; int64 excluded = 0; + int64 skipped = 0; bool has_before_insert_row_trig; bool has_instead_insert_row_trig; bool leafpart_use_multi_insert = false; @@ -656,6 +653,9 @@ CopyFrom(CopyFromState cstate) Assert(cstate->rel); Assert(list_length(cstate->range_table) == 1); + if (cstate->opts.on_error != COPY_ON_ERROR_STOP) + Assert(cstate->escontext); + /* * The target must be a plain, foreign, or partitioned relation, or have * an INSTEAD OF INSERT row trigger. (Currently, such triggers are only @@ -762,7 +762,7 @@ CopyFrom(CopyFromState cstate) ExecInitResultRelation(estate, resultRelInfo, 1); /* Verify the named relation is a valid target for INSERT */ - CheckValidResultRel(resultRelInfo, CMD_INSERT); + CheckValidResultRel(resultRelInfo, CMD_INSERT, NIL); ExecOpenIndices(resultRelInfo, false); @@ -887,6 +887,9 @@ CopyFrom(CopyFromState cstate) * Can't support multi-inserts if there are any volatile function * expressions in WHERE clause. Similarly to the trigger case above, * such expressions may query the table we're inserting into. + * + * Note: the whereClause was already preprocessed in DoCopy(), so it's + * okay to use contain_volatile_functions() directly. */ insertMethod = CIM_SINGLE; } @@ -989,6 +992,29 @@ CopyFrom(CopyFromState cstate) if (!NextCopyFrom(cstate, econtext, myslot->tts_values, myslot->tts_isnull)) break; + if (cstate->opts.on_error != COPY_ON_ERROR_STOP && + cstate->escontext->error_occurred) + { + /* + * Soft error occurred, skip this tuple and deal with error + * information according to ON_ERROR. + */ + if (cstate->opts.on_error == COPY_ON_ERROR_IGNORE) + + /* + * Just make ErrorSaveContext ready for the next NextCopyFrom. + * Since we don't set details_wanted and error_data is not to + * be filled, just resetting error_occurred is enough. + */ + cstate->escontext->error_occurred = false; + + /* Report that this tuple was skipped by the ON_ERROR clause */ + pgstat_progress_update_param(PROGRESS_COPY_TUPLES_SKIPPED, + ++skipped); + + continue; + } + ExecStoreVirtualTuple(myslot); /* @@ -1281,6 +1307,14 @@ CopyFrom(CopyFromState cstate) /* Done, clean up */ error_context_stack = errcallback.previous; + if (cstate->opts.on_error != COPY_ON_ERROR_STOP && + cstate->num_errors > 0) + ereport(NOTICE, + errmsg_plural("%llu row was skipped due to data type incompatibility", + "%llu rows were skipped due to data type incompatibility", + (unsigned long long) cstate->num_errors, + (unsigned long long) cstate->num_errors)); + if (bistate != NULL) FreeBulkInsertState(bistate); @@ -1393,7 +1427,9 @@ BeginCopyFrom(ParseState *pstate, /* Convert FORCE_NOT_NULL name list to per-column flags, check validity */ cstate->opts.force_notnull_flags = (bool *) palloc0(num_phys_attrs * sizeof(bool)); - if (cstate->opts.force_notnull) + if (cstate->opts.force_notnull_all) + MemSet(cstate->opts.force_notnull_flags, true, num_phys_attrs * sizeof(bool)); + else if (cstate->opts.force_notnull) { List *attnums; ListCell *cur; @@ -1408,15 +1444,35 @@ BeginCopyFrom(ParseState *pstate, if (!list_member_int(cstate->attnumlist, attnum)) ereport(ERROR, (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), - errmsg("FORCE_NOT_NULL column \"%s\" not referenced by COPY", - NameStr(attr->attname)))); + /*- translator: first %s is the name of a COPY option, e.g. FORCE_NOT_NULL */ + errmsg("%s column \"%s\" not referenced by COPY", + "FORCE_NOT_NULL", NameStr(attr->attname)))); cstate->opts.force_notnull_flags[attnum - 1] = true; } } + /* Set up soft error handler for ON_ERROR */ + if (cstate->opts.on_error != COPY_ON_ERROR_STOP) + { + cstate->escontext = makeNode(ErrorSaveContext); + cstate->escontext->type = T_ErrorSaveContext; + cstate->escontext->error_occurred = false; + + /* + * Currently we only support COPY_ON_ERROR_IGNORE. We'll add other + * options later + */ + if (cstate->opts.on_error == COPY_ON_ERROR_IGNORE) + cstate->escontext->details_wanted = false; + } + else + cstate->escontext = NULL; + /* Convert FORCE_NULL name list to per-column flags, check validity */ cstate->opts.force_null_flags = (bool *) palloc0(num_phys_attrs * sizeof(bool)); - if (cstate->opts.force_null) + if (cstate->opts.force_null_all) + MemSet(cstate->opts.force_null_flags, true, num_phys_attrs * sizeof(bool)); + else if (cstate->opts.force_null) { List *attnums; ListCell *cur; @@ -1431,8 +1487,9 @@ BeginCopyFrom(ParseState *pstate, if (!list_member_int(cstate->attnumlist, attnum)) ereport(ERROR, (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), - errmsg("FORCE_NULL column \"%s\" not referenced by COPY", - NameStr(attr->attname)))); + /*- translator: first %s is the name of a COPY option, e.g. FORCE_NOT_NULL */ + errmsg("%s column \"%s\" not referenced by COPY", + "FORCE_NULL", NameStr(attr->attname)))); cstate->opts.force_null_flags[attnum - 1] = true; } } @@ -1481,6 +1538,12 @@ BeginCopyFrom(ParseState *pstate, cstate->need_transcoding = true; cstate->conversion_proc = FindDefaultConversionProc(cstate->file_encoding, GetDatabaseEncoding()); + if (!OidIsValid(cstate->conversion_proc)) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_FUNCTION), + errmsg("default conversion function for encoding \"%s\" to \"%s\" does not exist", + pg_encoding_to_char(cstate->file_encoding), + pg_encoding_to_char(GetDatabaseEncoding())))); } cstate->copy_src = COPY_FILE; /* default */ @@ -1533,8 +1596,6 @@ BeginCopyFrom(ParseState *pstate, cstate->rteperminfos = pstate->p_rteperminfos; } - tupDesc = RelationGetDescr(cstate->rel); - num_phys_attrs = tupDesc->natts; num_defaults = 0; volatile_defexprs = false; @@ -1569,7 +1630,14 @@ BeginCopyFrom(ParseState *pstate, /* Get default info if available */ defexprs[attnum - 1] = NULL; - if (!att->attgenerated) + /* + * We only need the default values for columns that do not appear in + * the column list, unless the DEFAULT option was given. We never need + * default values for generated columns. + */ + if ((cstate->opts.default_print != NULL || + !list_member_int(cstate->attnumlist, attnum)) && + !att->attgenerated) { Expr *defexpr = (Expr *) build_column_default(cstate->rel, attnum); @@ -1601,7 +1669,8 @@ BeginCopyFrom(ParseState *pstate, * known to be safe for use with the multi-insert * optimization. Hence we use this special case function * checker rather than the standard check for - * contain_volatile_functions(). + * contain_volatile_functions(). Note also that we already + * ran the expression through expression_planner(). */ if (!volatile_defexprs) volatile_defexprs = contain_volatile_functions_not_nextval((Node *) defexpr); @@ -1609,6 +1678,7 @@ BeginCopyFrom(ParseState *pstate, } } + cstate->defaults = (bool *) palloc0(tupDesc->natts * sizeof(bool)); /* initialize progress */ pgstat_progress_start_command(PROGRESS_COMMAND_COPY, diff --git a/src/backend/commands/copyfromparse.c b/src/backend/commands/copyfromparse.c index 3853902a16ebc..97a4c387a3058 100644 --- a/src/backend/commands/copyfromparse.c +++ b/src/backend/commands/copyfromparse.c @@ -47,7 +47,7 @@ * and 'attribute_buf' are expanded on demand, to hold the longest line * encountered so far. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -70,10 +70,10 @@ #include "libpq/pqformat.h" #include "mb/pg_wchar.h" #include "miscadmin.h" +#include "nodes/miscnodes.h" #include "pgstat.h" #include "port/pg_bswap.h" #include "utils/builtins.h" -#include "utils/memutils.h" #include "utils/rel.h" #define ISOCTAL(c) (((c) >= '0') && ((c) <= '7')) @@ -174,7 +174,7 @@ ReceiveCopyBegin(CopyFromState cstate) int16 format = (cstate->opts.binary ? 1 : 0); int i; - pq_beginmessage(&buf, 'G'); + pq_beginmessage(&buf, PqMsg_CopyInResponse); pq_sendbyte(&buf, format); /* overall format */ pq_sendint16(&buf, natts); for (i = 0; i < natts; i++) @@ -279,13 +279,13 @@ CopyGetData(CopyFromState cstate, void *databuf, int minread, int maxread) /* Validate message type and set packet size limit */ switch (mtype) { - case 'd': /* CopyData */ + case PqMsg_CopyData: maxmsglen = PQ_LARGE_MESSAGE_LIMIT; break; - case 'c': /* CopyDone */ - case 'f': /* CopyFail */ - case 'H': /* Flush */ - case 'S': /* Sync */ + case PqMsg_CopyDone: + case PqMsg_CopyFail: + case PqMsg_Flush: + case PqMsg_Sync: maxmsglen = PQ_SMALL_MESSAGE_LIMIT; break; default: @@ -305,20 +305,20 @@ CopyGetData(CopyFromState cstate, void *databuf, int minread, int maxread) /* ... and process it */ switch (mtype) { - case 'd': /* CopyData */ + case PqMsg_CopyData: break; - case 'c': /* CopyDone */ + case PqMsg_CopyDone: /* COPY IN correctly terminated by frontend */ cstate->raw_reached_eof = true; return bytesread; - case 'f': /* CopyFail */ + case PqMsg_CopyFail: ereport(ERROR, (errcode(ERRCODE_QUERY_CANCELED), errmsg("COPY from stdin failed: %s", pq_getmsgstring(cstate->fe_msgbuf)))); break; - case 'H': /* Flush */ - case 'S': /* Sync */ + case PqMsg_Flush: + case PqMsg_Sync: /* * Ignore Flush/Sync for the convenience of client @@ -871,7 +871,7 @@ NextCopyFrom(CopyFromState cstate, ExprContext *econtext, /* Initialize all values for row to NULL */ MemSet(values, 0, num_phys_attrs * sizeof(Datum)); MemSet(nulls, true, num_phys_attrs * sizeof(bool)); - cstate->defaults = (bool *) palloc0(num_phys_attrs * sizeof(bool)); + MemSet(cstate->defaults, false, num_phys_attrs * sizeof(bool)); if (!cstate->opts.binary) { @@ -955,11 +955,56 @@ NextCopyFrom(CopyFromState cstate, ExprContext *econtext, values[m] = ExecEvalExpr(defexprs[m], econtext, &nulls[m]); } - else - values[m] = InputFunctionCall(&in_functions[m], - string, - typioparams[m], - att->atttypmod); + + /* + * If ON_ERROR is specified with IGNORE, skip rows with soft + * errors + */ + else if (!InputFunctionCallSafe(&in_functions[m], + string, + typioparams[m], + att->atttypmod, + (Node *) cstate->escontext, + &values[m])) + { + Assert(cstate->opts.on_error != COPY_ON_ERROR_STOP); + + cstate->num_errors++; + + if (cstate->opts.log_verbosity == COPY_LOG_VERBOSITY_VERBOSE) + { + /* + * Since we emit line number and column info in the below + * notice message, we suppress error context information + * other than the relation name. + */ + Assert(!cstate->relname_only); + cstate->relname_only = true; + + if (cstate->cur_attval) + { + char *attval; + + attval = CopyLimitPrintoutLength(cstate->cur_attval); + ereport(NOTICE, + errmsg("skipping row due to data type incompatibility at line %llu for column \"%s\": \"%s\"", + (unsigned long long) cstate->cur_lineno, + cstate->cur_attname, + attval)); + pfree(attval); + } + else + ereport(NOTICE, + errmsg("skipping row due to data type incompatibility at line %llu for column \"%s\": null input", + (unsigned long long) cstate->cur_lineno, + cstate->cur_attname)); + + /* reset relname_only */ + cstate->relname_only = false; + } + + return true; + } cstate->cur_attname = NULL; cstate->cur_attval = NULL; @@ -1040,8 +1085,6 @@ NextCopyFrom(CopyFromState cstate, ExprContext *econtext, &nulls[defmap[i]]); } - pfree(cstate->defaults); - return true; } @@ -1163,9 +1206,6 @@ CopyReadLineText(CopyFromState cstate) * value and are put in line_buf. We keep just enough state to know if we * are currently in a quoted field or not. * - * These four characters, and the CSV escape and quote characters, are - * assumed the same in frontend and backend encodings. - * * The input has already been converted to the database encoding. All * supported server encodings have the property that all bytes in a * multi-byte sequence have the high bit set, so a multibyte character @@ -1703,8 +1743,8 @@ CopyReadAttributesText(CopyFromState cstate) ereport(ERROR, (errcode(ERRCODE_BAD_COPY_FILE_FORMAT), - errmsg("unexpected DEFAULT in COPY data"), - errdetail("Column \"%s\" has no DEFAULT value.", + errmsg("unexpected default marker in COPY data"), + errdetail("Column \"%s\" has no default value.", NameStr(att->attname)))); } } @@ -1918,8 +1958,8 @@ CopyReadAttributesCSV(CopyFromState cstate) ereport(ERROR, (errcode(ERRCODE_BAD_COPY_FILE_FORMAT), - errmsg("unexpected DEFAULT in COPY data"), - errdetail("Column \"%s\" has no DEFAULT value.", + errmsg("unexpected default marker in COPY data"), + errdetail("Column \"%s\" has no default value.", NameStr(att->attname)))); } } diff --git a/src/backend/commands/copyto.c b/src/backend/commands/copyto.c index 9e4b2437a572a..84dc465cbae24 100644 --- a/src/backend/commands/copyto.c +++ b/src/backend/commands/copyto.c @@ -3,7 +3,7 @@ * copyto.c * COPY TO file/program/client * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,11 +18,7 @@ #include #include -#include "access/heapam.h" -#include "access/htup_details.h" #include "access/tableam.h" -#include "access/xact.h" -#include "access/xlog.h" #include "commands/copy.h" #include "commands/progress.h" #include "executor/execdesc.h" @@ -32,14 +28,11 @@ #include "libpq/pqformat.h" #include "mb/pg_wchar.h" #include "miscadmin.h" -#include "optimizer/optimizer.h" #include "pgstat.h" -#include "rewrite/rewriteHandler.h" #include "storage/fd.h" #include "tcop/tcopprot.h" #include "utils/lsyscache.h" #include "utils/memutils.h" -#include "utils/partcache.h" #include "utils/rel.h" #include "utils/snapmgr.h" @@ -51,7 +44,7 @@ typedef enum CopyDest { COPY_FILE, /* to file (or a piped program) */ COPY_FRONTEND, /* to frontend */ - COPY_CALLBACK /* to callback function */ + COPY_CALLBACK, /* to callback function */ } CopyDest; /* @@ -119,7 +112,7 @@ static void ClosePipeToProgram(CopyToState cstate); static void CopyOneRowTo(CopyToState cstate, TupleTableSlot *slot); static void CopyAttributeOutText(CopyToState cstate, const char *string); static void CopyAttributeOutCSV(CopyToState cstate, const char *string, - bool use_quote, bool single_attr); + bool use_quote); /* Low-level communications functions */ static void SendCopyBegin(CopyToState cstate); @@ -144,7 +137,7 @@ SendCopyBegin(CopyToState cstate) int16 format = (cstate->opts.binary ? 1 : 0); int i; - pq_beginmessage(&buf, 'H'); + pq_beginmessage(&buf, PqMsg_CopyOutResponse); pq_sendbyte(&buf, format); /* overall format */ pq_sendint16(&buf, natts); for (i = 0; i < natts; i++) @@ -159,7 +152,7 @@ SendCopyEnd(CopyToState cstate) /* Shouldn't have any unsent data */ Assert(cstate->fe_msgbuf->len == 0); /* Send Copy Done message */ - pq_putemptymessage('c'); + pq_putemptymessage(PqMsg_CopyDone); } /*---------- @@ -247,7 +240,7 @@ CopySendEndOfRow(CopyToState cstate) CopySendChar(cstate, '\n'); /* Dump the accumulated row as one CopyData message */ - (void) pq_putmessage('d', fe_msgbuf->data, fe_msgbuf->len); + (void) pq_putmessage(PqMsg_CopyData, fe_msgbuf->data, fe_msgbuf->len); break; case COPY_CALLBACK: cstate->data_dest_cb(fe_msgbuf->data, fe_msgbuf->len); @@ -482,7 +475,7 @@ BeginCopyTo(ParseState *pstate, if (q->querySource == QSRC_NON_INSTEAD_RULE) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("DO ALSO rules are not supported for the COPY"))); + errmsg("DO ALSO rules are not supported for COPY"))); } ereport(ERROR, @@ -499,7 +492,11 @@ BeginCopyTo(ParseState *pstate, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("COPY (SELECT INTO) is not supported"))); - Assert(query->utilityStmt == NULL); + /* The only other utility command we could see is NOTIFY */ + if (query->utilityStmt != NULL) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("COPY query must not be a utility command"))); /* * Similarly the grammar doesn't enforce the presence of a RETURNING @@ -510,7 +507,8 @@ BeginCopyTo(ParseState *pstate, { Assert(query->commandType == CMD_INSERT || query->commandType == CMD_UPDATE || - query->commandType == CMD_DELETE); + query->commandType == CMD_DELETE || + query->commandType == CMD_MERGE); ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -582,10 +580,7 @@ BeginCopyTo(ParseState *pstate, cstate->opts.force_quote_flags = (bool *) palloc0(num_phys_attrs * sizeof(bool)); if (cstate->opts.force_quote_all) { - int i; - - for (i = 0; i < num_phys_attrs; i++) - cstate->opts.force_quote_flags[i] = true; + MemSet(cstate->opts.force_quote_flags, true, num_phys_attrs * sizeof(bool)); } else if (cstate->opts.force_quote) { @@ -602,8 +597,9 @@ BeginCopyTo(ParseState *pstate, if (!list_member_int(cstate->attnumlist, attnum)) ereport(ERROR, (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), - errmsg("FORCE_QUOTE column \"%s\" not referenced by COPY", - NameStr(attr->attname)))); + /*- translator: %s is the name of a COPY option, e.g. FORCE_NOT_NULL */ + errmsg("%s column \"%s\" not referenced by COPY", + "FORCE_QUOTE", NameStr(attr->attname)))); cstate->opts.force_quote_flags[attnum - 1] = true; } } @@ -615,13 +611,15 @@ BeginCopyTo(ParseState *pstate, cstate->file_encoding = cstate->opts.file_encoding; /* - * Set up encoding conversion info. Even if the file and server encodings - * are the same, we must apply pg_any_to_server() to validate data in - * multibyte encodings. + * Set up encoding conversion info if the file and server encodings differ + * (see also pg_server_to_any). */ - cstate->need_transcoding = - (cstate->file_encoding != GetDatabaseEncoding() || - pg_database_encoding_max_length() > 1); + if (cstate->file_encoding == GetDatabaseEncoding() || + cstate->file_encoding == PG_SQL_ASCII) + cstate->need_transcoding = false; + else + cstate->need_transcoding = true; + /* See Multibyte encoding comment above */ cstate->encoding_embeds_ascii = PG_ENCODING_IS_CLIENT_ONLY(cstate->file_encoding); @@ -840,8 +838,7 @@ DoCopyTo(CopyToState cstate) colname = NameStr(TupleDescAttr(tupDesc, attnum - 1)->attname); if (cstate->opts.csv_mode) - CopyAttributeOutCSV(cstate, colname, false, - list_length(cstate->attnumlist) == 1); + CopyAttributeOutCSV(cstate, colname, false); else CopyAttributeOutText(cstate, colname); } @@ -955,8 +952,7 @@ CopyOneRowTo(CopyToState cstate, TupleTableSlot *slot) value); if (cstate->opts.csv_mode) CopyAttributeOutCSV(cstate, string, - cstate->opts.force_quote_flags[attnum - 1], - list_length(cstate->attnumlist) == 1); + cstate->opts.force_quote_flags[attnum - 1]); else CopyAttributeOutText(cstate, string); } @@ -1142,7 +1138,7 @@ CopyAttributeOutText(CopyToState cstate, const char *string) */ static void CopyAttributeOutCSV(CopyToState cstate, const char *string, - bool use_quote, bool single_attr) + bool use_quote) { const char *ptr; const char *start; @@ -1150,6 +1146,7 @@ CopyAttributeOutCSV(CopyToState cstate, const char *string, char delimc = cstate->opts.delim[0]; char quotec = cstate->opts.quote[0]; char escapec = cstate->opts.escape[0]; + bool single_attr = (list_length(cstate->attnumlist) == 1); /* force quoting if it matches null_print (before conversion!) */ if (!use_quote && strcmp(string, cstate->opts.null_print) == 0) diff --git a/src/backend/commands/createas.c b/src/backend/commands/createas.c index e91920ca14a12..2c8a93b6e56f8 100644 --- a/src/backend/commands/createas.c +++ b/src/backend/commands/createas.c @@ -13,7 +13,7 @@ * we must return a tuples-processed count in the QueryCompletion. (We no * longer do that for CTAS ... WITH NO DATA, however.) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,12 +25,9 @@ #include "postgres.h" #include "access/heapam.h" -#include "access/htup_details.h" #include "access/reloptions.h" -#include "access/sysattr.h" #include "access/tableam.h" #include "access/xact.h" -#include "access/xlog.h" #include "catalog/namespace.h" #include "catalog/toasting.h" #include "commands/createas.h" @@ -41,9 +38,7 @@ #include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" -#include "parser/parse_clause.h" #include "rewrite/rewriteHandler.h" -#include "storage/smgr.h" #include "tcop/tcopprot.h" #include "utils/builtins.h" #include "utils/lsyscache.h" @@ -230,10 +225,8 @@ ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt *stmt, Query *query = castNode(Query, stmt->query); IntoClause *into = stmt->into; bool is_matview = (into->viewQuery != NULL); + bool do_refresh = false; DestReceiver *dest; - Oid save_userid = InvalidOid; - int save_sec_context = 0; - int save_nestlevel = 0; ObjectAddress address; List *rewritten; PlannedStmt *plan; @@ -268,18 +261,13 @@ ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt *stmt, Assert(query->commandType == CMD_SELECT); /* - * For materialized views, lock down security-restricted operations and - * arrange to make GUC variable changes local to this command. This is - * not necessary for security, but this keeps the behavior similar to - * REFRESH MATERIALIZED VIEW. Otherwise, one could create a materialized - * view not possible to refresh. + * For materialized views, always skip data during table creation, and use + * REFRESH instead (see below). */ if (is_matview) { - GetUserIdAndSecContext(&save_userid, &save_sec_context); - SetUserIdAndSecContext(save_userid, - save_sec_context | SECURITY_RESTRICTED_OPERATION); - save_nestlevel = NewGUCNestLevel(); + do_refresh = !into->skipData; + into->skipData = true; } if (into->skipData) @@ -351,13 +339,18 @@ ExecCreateTableAs(ParseState *pstate, CreateTableAsStmt *stmt, PopActiveSnapshot(); } - if (is_matview) + /* + * For materialized views, reuse the REFRESH logic, which locks down + * security-restricted operations and restricts the search_path. This + * reduces the chance that a subsequent refresh will fail. + */ + if (do_refresh) { - /* Roll back any GUC changes */ - AtEOXact_GUC(false, save_nestlevel); + RefreshMatViewByOid(address.objectId, false, false, + pstate->p_sourcetext, NULL, qc); - /* Restore userid and security context */ - SetUserIdAndSecContext(save_userid, save_sec_context); + if (qc) + qc->commandTag = CMDTAG_SELECT; } return address; diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index 09f1ab41ad371..2505b3084b069 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -8,7 +8,7 @@ * stepping on each others' toes. Formerly we used table-level locks * on pg_database, but that's too coarse-grained. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -64,7 +64,6 @@ #include "utils/acl.h" #include "utils/builtins.h" #include "utils/fmgroids.h" -#include "utils/guc.h" #include "utils/pg_locale.h" #include "utils/relmapper.h" #include "utils/snapmgr.h" @@ -83,7 +82,7 @@ typedef enum CreateDBStrategy { CREATEDB_WAL_LOG, - CREATEDB_FILE_COPY + CREATEDB_FILE_COPY, } CreateDBStrategy; typedef struct @@ -116,9 +115,9 @@ static void movedb(const char *dbname, const char *tblspcname); static void movedb_failure_callback(int code, Datum arg); static bool get_db_info(const char *name, LOCKMODE lockmode, Oid *dbIdP, Oid *ownerIdP, - int *encodingP, bool *dbIsTemplateP, bool *dbAllowConnP, + int *encodingP, bool *dbIsTemplateP, bool *dbAllowConnP, bool *dbHasLoginEvtP, TransactionId *dbFrozenXidP, MultiXactId *dbMinMultiP, - Oid *dbTablespace, char **dbCollate, char **dbCtype, char **dbIculocale, + Oid *dbTablespace, char **dbCollate, char **dbCtype, char **dbLocale, char **dbIcurules, char *dbLocProvider, char **dbCollversion); @@ -276,7 +275,7 @@ ScanSourceDatabasePgClass(Oid tbid, Oid dbid, char *srcpath) rlocator.dbOid = dbid; rlocator.relNumber = relfilenumber; - smgr = smgropen(rlocator, InvalidBackendId); + smgr = smgropen(rlocator, INVALID_PROC_NUMBER); nblocks = smgrnblocks(smgr, MAIN_FORKNUM); smgrclose(smgr); @@ -462,35 +461,12 @@ CreateDirAndVersionFile(char *dbpath, Oid dbid, Oid tsid, bool isRedo) char buf[16]; /* - * Prepare version data before starting a critical section. - * - * Note that we don't have to copy this from the source database; there's - * only one legal value. + * Note that we don't have to copy version data from the source database; + * there's only one legal value. */ sprintf(buf, "%s\n", PG_MAJORVERSION); nbytes = strlen(PG_MAJORVERSION) + 1; - /* If we are not in WAL replay then write the WAL. */ - if (!isRedo) - { - xl_dbase_create_wal_log_rec xlrec; - XLogRecPtr lsn; - - START_CRIT_SECTION(); - - xlrec.db_id = dbid; - xlrec.tablespace_id = tsid; - - XLogBeginInsert(); - XLogRegisterData((char *) (&xlrec), - sizeof(xl_dbase_create_wal_log_rec)); - - lsn = XLogInsert(RM_DBASE_ID, XLOG_DBASE_CREATE_WAL_LOG); - - /* As always, WAL must hit the disk before the data update does. */ - XLogFlush(lsn); - } - /* Create database directory. */ if (MakePGDirectory(dbpath) < 0) { @@ -531,12 +507,35 @@ CreateDirAndVersionFile(char *dbpath, Oid dbid, Oid tsid, bool isRedo) } pgstat_report_wait_end(); + pgstat_report_wait_start(WAIT_EVENT_VERSION_FILE_SYNC); + if (pg_fsync(fd) != 0) + ereport(data_sync_elevel(ERROR), + (errcode_for_file_access(), + errmsg("could not fsync file \"%s\": %m", versionfile))); + fsync_fname(dbpath, true); + pgstat_report_wait_end(); + /* Close the version file. */ CloseTransientFile(fd); - /* Critical section done. */ + /* If we are not in WAL replay then write the WAL. */ if (!isRedo) + { + xl_dbase_create_wal_log_rec xlrec; + + START_CRIT_SECTION(); + + xlrec.db_id = dbid; + xlrec.tablespace_id = tsid; + + XLogBeginInsert(); + XLogRegisterData((char *) (&xlrec), + sizeof(xl_dbase_create_wal_log_rec)); + + (void) XLogInsert(RM_DBASE_ID, XLOG_DBASE_CREATE_WAL_LOG); + END_CRIT_SECTION(); + } } /* @@ -675,11 +674,12 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) int src_encoding = -1; char *src_collate = NULL; char *src_ctype = NULL; - char *src_iculocale = NULL; + char *src_locale = NULL; char *src_icurules = NULL; char src_locprovider = '\0'; char *src_collversion = NULL; bool src_istemplate; + bool src_hasloginevt = false; bool src_allowconn; TransactionId src_frozenxid = InvalidTransactionId; MultiXactId src_minmxid = InvalidMultiXactId; @@ -697,6 +697,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) DefElem *dtemplate = NULL; DefElem *dencoding = NULL; DefElem *dlocale = NULL; + DefElem *dbuiltinlocale = NULL; DefElem *dcollate = NULL; DefElem *dctype = NULL; DefElem *diculocale = NULL; @@ -712,14 +713,14 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) const char *dbtemplate = NULL; char *dbcollate = NULL; char *dbctype = NULL; - char *dbiculocale = NULL; + const char *dblocale = NULL; char *dbicurules = NULL; char dblocprovider = '\0'; char *canonname; int encoding = -1; bool dbistemplate = false; bool dballowconnections = true; - int dbconnlimit = -1; + int dbconnlimit = DATCONNLIMIT_UNLIMITED; char *dbcollversion = NULL; int notherbackends; int npreparedxacts; @@ -761,6 +762,12 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) errorConflictingDefElem(defel, pstate); dlocale = defel; } + else if (strcmp(defel->defname, "builtin_locale") == 0) + { + if (dbuiltinlocale) + errorConflictingDefElem(defel, pstate); + dbuiltinlocale = defel; + } else if (strcmp(defel->defname, "lc_collate") == 0) { if (dcollate) @@ -896,20 +903,25 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) { dbcollate = defGetString(dlocale); dbctype = defGetString(dlocale); + dblocale = defGetString(dlocale); } + if (dbuiltinlocale && dbuiltinlocale->arg) + dblocale = defGetString(dbuiltinlocale); if (dcollate && dcollate->arg) dbcollate = defGetString(dcollate); if (dctype && dctype->arg) dbctype = defGetString(dctype); if (diculocale && diculocale->arg) - dbiculocale = defGetString(diculocale); + dblocale = defGetString(diculocale); if (dicurules && dicurules->arg) dbicurules = defGetString(dicurules); if (dlocprovider && dlocprovider->arg) { char *locproviderstr = defGetString(dlocprovider); - if (pg_strcasecmp(locproviderstr, "icu") == 0) + if (pg_strcasecmp(locproviderstr, "builtin") == 0) + dblocprovider = COLLPROVIDER_BUILTIN; + else if (pg_strcasecmp(locproviderstr, "icu") == 0) dblocprovider = COLLPROVIDER_ICU; else if (pg_strcasecmp(locproviderstr, "libc") == 0) dblocprovider = COLLPROVIDER_LIBC; @@ -926,7 +938,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) if (dconnlimit && dconnlimit->arg) { dbconnlimit = defGetInt32(dconnlimit); - if (dbconnlimit < -1) + if (dbconnlimit < DATCONNLIMIT_UNLIMITED) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid connection limit: %d", dbconnlimit))); @@ -968,15 +980,25 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) if (!get_db_info(dbtemplate, ShareLock, &src_dboid, &src_owner, &src_encoding, - &src_istemplate, &src_allowconn, + &src_istemplate, &src_allowconn, &src_hasloginevt, &src_frozenxid, &src_minmxid, &src_deftablespace, - &src_collate, &src_ctype, &src_iculocale, &src_icurules, &src_locprovider, + &src_collate, &src_ctype, &src_locale, &src_icurules, &src_locprovider, &src_collversion)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_DATABASE), errmsg("template database \"%s\" does not exist", dbtemplate))); + /* + * If the source database was in the process of being dropped, we can't + * use it as a template. + */ + if (database_is_invalid_oid(src_dboid)) + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot use invalid database \"%s\" as template", dbtemplate), + errhint("Use DROP DATABASE to drop invalid databases.")); + /* * Permission check: to copy a DB that's not marked datistemplate, you * must be superuser or the owner thereof. @@ -996,15 +1018,15 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) char *strategy; strategy = defGetString(dstrategy); - if (strcmp(strategy, "wal_log") == 0) + if (pg_strcasecmp(strategy, "wal_log") == 0) dbstrategy = CREATEDB_WAL_LOG; - else if (strcmp(strategy, "file_copy") == 0) + else if (pg_strcasecmp(strategy, "file_copy") == 0) dbstrategy = CREATEDB_FILE_COPY; else ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid create database strategy \"%s\"", strategy), - errhint("Valid strategies are \"wal_log\", and \"file_copy\"."))); + errhint("Valid strategies are \"wal_log\" and \"file_copy\"."))); } /* If encoding or locales are defaulted, use source's setting */ @@ -1016,14 +1038,9 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) dbctype = src_ctype; if (dblocprovider == '\0') dblocprovider = src_locprovider; - if (dbiculocale == NULL && dblocprovider == COLLPROVIDER_ICU) - { - if (dlocale && dlocale->arg) - dbiculocale = defGetString(dlocale); - else - dbiculocale = src_iculocale; - } - if (dbicurules == NULL && dblocprovider == COLLPROVIDER_ICU) + if (dblocale == NULL) + dblocale = src_locale; + if (dbicurules == NULL) dbicurules = src_icurules; /* Some encodings are client only */ @@ -1048,7 +1065,43 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) check_encoding_locale_matches(encoding, dbcollate, dbctype); - if (dblocprovider == COLLPROVIDER_ICU) + /* validate provider-specific parameters */ + if (dblocprovider != COLLPROVIDER_BUILTIN) + { + if (dbuiltinlocale) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("BUILTIN_LOCALE cannot be specified unless locale provider is builtin"))); + } + + if (dblocprovider != COLLPROVIDER_ICU) + { + if (diculocale) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("ICU locale cannot be specified unless locale provider is ICU"))); + + if (dbicurules) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("ICU rules cannot be specified unless locale provider is ICU"))); + } + + /* validate and canonicalize locale for the provider */ + if (dblocprovider == COLLPROVIDER_BUILTIN) + { + /* + * This would happen if template0 uses the libc provider but the new + * database uses builtin. + */ + if (!dblocale) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("LOCALE or BUILTIN_LOCALE must be specified"))); + + dblocale = builtin_validate_locale(encoding, dblocale); + } + else if (dblocprovider == COLLPROVIDER_ICU) { if (!(is_encoding_supported_by_icu(encoding))) ereport(ERROR, @@ -1060,7 +1113,7 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) * This would happen if template0 uses the libc provider but the new * database uses icu. */ - if (!dbiculocale) + if (!dblocale) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("LOCALE or ICU_LOCALE must be specified"))); @@ -1070,35 +1123,27 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) * database, preserve locale string. Otherwise, canonicalize to a * language tag. */ - if (!IsBinaryUpgrade && dbiculocale != src_iculocale) + if (!IsBinaryUpgrade && dblocale != src_locale) { - char *langtag = icu_language_tag(dbiculocale, + char *langtag = icu_language_tag(dblocale, icu_validation_level); - if (langtag && strcmp(dbiculocale, langtag) != 0) + if (langtag && strcmp(dblocale, langtag) != 0) { ereport(NOTICE, (errmsg("using standard form \"%s\" for ICU locale \"%s\"", - langtag, dbiculocale))); + langtag, dblocale))); - dbiculocale = langtag; + dblocale = langtag; } } - icu_validate_locale(dbiculocale); + icu_validate_locale(dblocale); } - else - { - if (dbiculocale) - ereport(ERROR, - (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("ICU locale cannot be specified unless locale provider is ICU"))); - if (dbicurules) - ereport(ERROR, - (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("ICU rules cannot be specified unless locale provider is ICU"))); - } + /* for libc, locale comes from datcollate and datctype */ + if (dblocprovider == COLLPROVIDER_LIBC) + dblocale = NULL; /* * Check that the new encoding and locale settings match the source @@ -1146,13 +1191,13 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) char *val1; char *val2; - Assert(dbiculocale); - Assert(src_iculocale); - if (strcmp(dbiculocale, src_iculocale) != 0) + Assert(dblocale); + Assert(src_locale); + if (strcmp(dblocale, src_locale) != 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)", - dbiculocale, src_iculocale), + dblocale, src_locale), errhint("Use the same ICU locale as in the template database, or use template0 as template."))); val1 = dbicurules; @@ -1185,8 +1230,14 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) if (src_collversion && !dcollversion) { char *actual_versionstr; + const char *locale; - actual_versionstr = get_collation_actual_version(dblocprovider, dblocprovider == COLLPROVIDER_ICU ? dbiculocale : dbcollate); + if (dblocprovider == COLLPROVIDER_LIBC) + locale = dbcollate; + else + locale = dblocale; + + actual_versionstr = get_collation_actual_version(dblocprovider, locale); if (!actual_versionstr) ereport(ERROR, (errmsg("template database \"%s\" has a collation version, but no actual collation version could be determined", @@ -1214,7 +1265,16 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) * collation version, which is normally only the case for template0. */ if (dbcollversion == NULL) - dbcollversion = get_collation_actual_version(dblocprovider, dblocprovider == COLLPROVIDER_ICU ? dbiculocale : dbcollate); + { + const char *locale; + + if (dblocprovider == COLLPROVIDER_LIBC) + locale = dbcollate; + else + locale = dblocale; + + dbcollversion = get_collation_actual_version(dblocprovider, locale); + } /* Resolve default tablespace for new database */ if (dtablespacename && dtablespacename->arg) @@ -1353,8 +1413,8 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) * block on the unique index, and fail after we commit). */ - Assert((dblocprovider == COLLPROVIDER_ICU && dbiculocale) || - (dblocprovider != COLLPROVIDER_ICU && !dbiculocale)); + Assert((dblocprovider != COLLPROVIDER_LIBC && dblocale) || + (dblocprovider == COLLPROVIDER_LIBC && !dblocale)); /* Form tuple */ new_record[Anum_pg_database_oid - 1] = ObjectIdGetDatum(dboid); @@ -1365,16 +1425,17 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) new_record[Anum_pg_database_datlocprovider - 1] = CharGetDatum(dblocprovider); new_record[Anum_pg_database_datistemplate - 1] = BoolGetDatum(dbistemplate); new_record[Anum_pg_database_datallowconn - 1] = BoolGetDatum(dballowconnections); + new_record[Anum_pg_database_dathasloginevt - 1] = BoolGetDatum(src_hasloginevt); new_record[Anum_pg_database_datconnlimit - 1] = Int32GetDatum(dbconnlimit); new_record[Anum_pg_database_datfrozenxid - 1] = TransactionIdGetDatum(src_frozenxid); new_record[Anum_pg_database_datminmxid - 1] = TransactionIdGetDatum(src_minmxid); new_record[Anum_pg_database_dattablespace - 1] = ObjectIdGetDatum(dst_deftablespace); new_record[Anum_pg_database_datcollate - 1] = CStringGetTextDatum(dbcollate); new_record[Anum_pg_database_datctype - 1] = CStringGetTextDatum(dbctype); - if (dbiculocale) - new_record[Anum_pg_database_daticulocale - 1] = CStringGetTextDatum(dbiculocale); + if (dblocale) + new_record[Anum_pg_database_datlocale - 1] = CStringGetTextDatum(dblocale); else - new_record_nulls[Anum_pg_database_daticulocale - 1] = true; + new_record_nulls[Anum_pg_database_datlocale - 1] = true; if (dbicurules) new_record[Anum_pg_database_daticurules - 1] = CStringGetTextDatum(dbicurules); else @@ -1576,6 +1637,9 @@ dropdb(const char *dbname, bool missing_ok, bool force) bool db_istemplate; Relation pgdbrel; HeapTuple tup; + ScanKeyData scankey; + void *inplace_state; + Form_pg_database datform; int notherbackends; int npreparedxacts; int nslots, @@ -1592,7 +1656,7 @@ dropdb(const char *dbname, bool missing_ok, bool force) pgdbrel = table_open(DatabaseRelationId, RowExclusiveLock); if (!get_db_info(dbname, AccessExclusiveLock, &db_id, NULL, NULL, - &db_istemplate, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) + &db_istemplate, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) { if (!missing_ok) { @@ -1691,17 +1755,6 @@ dropdb(const char *dbname, bool missing_ok, bool force) dbname), errdetail_busy_db(notherbackends, npreparedxacts))); - /* - * Remove the database's tuple from pg_database. - */ - tup = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(db_id)); - if (!HeapTupleIsValid(tup)) - elog(ERROR, "cache lookup failed for database %u", db_id); - - CatalogTupleDelete(pgdbrel, &tup->t_self); - - ReleaseSysCache(tup); - /* * Delete any comments or security labels associated with the database. */ @@ -1718,6 +1771,42 @@ dropdb(const char *dbname, bool missing_ok, bool force) */ dropDatabaseDependencies(db_id); + /* + * Tell the cumulative stats system to forget it immediately, too. + */ + pgstat_drop_database(db_id); + + /* + * Except for the deletion of the catalog row, subsequent actions are not + * transactional (consider DropDatabaseBuffers() discarding modified + * buffers). But we might crash or get interrupted below. To prevent + * accesses to a database with invalid contents, mark the database as + * invalid using an in-place update. + * + * We need to flush the WAL before continuing, to guarantee the + * modification is durable before performing irreversible filesystem + * operations. + */ + ScanKeyInit(&scankey, + Anum_pg_database_datname, + BTEqualStrategyNumber, F_NAMEEQ, + CStringGetDatum(dbname)); + systable_inplace_update_begin(pgdbrel, DatabaseNameIndexId, true, + NULL, 1, &scankey, &tup, &inplace_state); + if (!HeapTupleIsValid(tup)) + elog(ERROR, "cache lookup failed for database %u", db_id); + datform = (Form_pg_database) GETSTRUCT(tup); + datform->datconnlimit = DATCONNLIMIT_INVALID_DB; + systable_inplace_update_finish(inplace_state, tup); + XLogFlush(XactLastRecEnd); + + /* + * Also delete the tuple - transactionally. If this transaction commits, + * the row will be gone, but if we fail, dropdb() can be invoked again. + */ + CatalogTupleDelete(pgdbrel, &tup->t_self); + heap_freetuple(tup); + /* * Drop db-specific replication slots. */ @@ -1730,11 +1819,6 @@ dropdb(const char *dbname, bool missing_ok, bool force) */ DropDatabaseBuffers(db_id); - /* - * Tell the cumulative stats system to forget it immediately, too. - */ - pgstat_drop_database(db_id); - /* * Tell checkpointer to forget any pending fsync and unlink requests for * files in the database; else the fsyncs will fail at next checkpoint, or @@ -1780,6 +1864,7 @@ RenameDatabase(const char *oldname, const char *newname) { Oid db_id; HeapTuple newtup; + ItemPointerData otid; Relation rel; int notherbackends; int npreparedxacts; @@ -1791,7 +1876,7 @@ RenameDatabase(const char *oldname, const char *newname) */ rel = table_open(DatabaseRelationId, RowExclusiveLock); - if (!get_db_info(oldname, AccessExclusiveLock, &db_id, NULL, NULL, + if (!get_db_info(oldname, AccessExclusiveLock, &db_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_DATABASE), @@ -1851,11 +1936,13 @@ RenameDatabase(const char *oldname, const char *newname) errdetail_busy_db(notherbackends, npreparedxacts))); /* rename */ - newtup = SearchSysCacheCopy1(DATABASEOID, ObjectIdGetDatum(db_id)); + newtup = SearchSysCacheLockedCopy1(DATABASEOID, ObjectIdGetDatum(db_id)); if (!HeapTupleIsValid(newtup)) elog(ERROR, "cache lookup failed for database %u", db_id); + otid = newtup->t_self; namestrcpy(&(((Form_pg_database) GETSTRUCT(newtup))->datname), newname); - CatalogTupleUpdate(rel, &newtup->t_self, newtup); + CatalogTupleUpdate(rel, &otid, newtup); + UnlockTuple(rel, &otid, InplaceUpdateTupleLock); InvokeObjectPostAlterHook(DatabaseRelationId, db_id, 0); @@ -1901,7 +1988,7 @@ movedb(const char *dbname, const char *tblspcname) */ pgdbrel = table_open(DatabaseRelationId, RowExclusiveLock); - if (!get_db_info(dbname, AccessExclusiveLock, &db_id, NULL, NULL, + if (!get_db_info(dbname, AccessExclusiveLock, &db_id, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &src_tblspcoid, NULL, NULL, NULL, NULL, NULL, NULL)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_DATABASE), @@ -2104,6 +2191,7 @@ movedb(const char *dbname, const char *tblspcname) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_DATABASE), errmsg("database \"%s\" does not exist", dbname))); + LockTuple(pgdbrel, &oldtuple->t_self, InplaceUpdateTupleLock); new_record[Anum_pg_database_dattablespace - 1] = ObjectIdGetDatum(dst_tblspcoid); new_record_repl[Anum_pg_database_dattablespace - 1] = true; @@ -2112,6 +2200,7 @@ movedb(const char *dbname, const char *tblspcname) new_record, new_record_nulls, new_record_repl); CatalogTupleUpdate(pgdbrel, &oldtuple->t_self, newtuple); + UnlockTuple(pgdbrel, &oldtuple->t_self, InplaceUpdateTupleLock); InvokeObjectPostAlterHook(DatabaseRelationId, db_id, 0); @@ -2248,7 +2337,7 @@ AlterDatabase(ParseState *pstate, AlterDatabaseStmt *stmt, bool isTopLevel) ListCell *option; bool dbistemplate = false; bool dballowconnections = true; - int dbconnlimit = -1; + int dbconnlimit = DATCONNLIMIT_UNLIMITED; DefElem *distemplate = NULL; DefElem *dallowconnections = NULL; DefElem *dconnlimit = NULL; @@ -2319,7 +2408,7 @@ AlterDatabase(ParseState *pstate, AlterDatabaseStmt *stmt, bool isTopLevel) if (dconnlimit && dconnlimit->arg) { dbconnlimit = defGetInt32(dconnlimit); - if (dbconnlimit < -1) + if (dbconnlimit < DATCONNLIMIT_UNLIMITED) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid connection limit: %d", dbconnlimit))); @@ -2342,10 +2431,19 @@ AlterDatabase(ParseState *pstate, AlterDatabaseStmt *stmt, bool isTopLevel) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_DATABASE), errmsg("database \"%s\" does not exist", stmt->dbname))); + LockTuple(rel, &tuple->t_self, InplaceUpdateTupleLock); datform = (Form_pg_database) GETSTRUCT(tuple); dboid = datform->oid; + if (database_is_invalid_form(datform)) + { + ereport(FATAL, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot alter invalid database \"%s\"", stmt->dbname), + errhint("Use DROP DATABASE to drop invalid databases.")); + } + if (!object_ownercheck(DatabaseRelationId, dboid, GetUserId())) aclcheck_error(ACLCHECK_NOT_OWNER, OBJECT_DATABASE, stmt->dbname); @@ -2383,6 +2481,7 @@ AlterDatabase(ParseState *pstate, AlterDatabaseStmt *stmt, bool isTopLevel) newtuple = heap_modify_tuple(tuple, RelationGetDescr(rel), new_record, new_record_nulls, new_record_repl); CatalogTupleUpdate(rel, &tuple->t_self, newtuple); + UnlockTuple(rel, &tuple->t_self, InplaceUpdateTupleLock); InvokeObjectPostAlterHook(DatabaseRelationId, dboid, 0); @@ -2432,14 +2531,26 @@ AlterDatabaseRefreshColl(AlterDatabaseRefreshCollStmt *stmt) if (!object_ownercheck(DatabaseRelationId, db_id, GetUserId())) aclcheck_error(ACLCHECK_NOT_OWNER, OBJECT_DATABASE, stmt->dbname); + LockTuple(rel, &tuple->t_self, InplaceUpdateTupleLock); datum = heap_getattr(tuple, Anum_pg_database_datcollversion, RelationGetDescr(rel), &isnull); oldversion = isnull ? NULL : TextDatumGetCString(datum); - datum = heap_getattr(tuple, datForm->datlocprovider == COLLPROVIDER_ICU ? Anum_pg_database_daticulocale : Anum_pg_database_datcollate, RelationGetDescr(rel), &isnull); - if (isnull) - elog(ERROR, "unexpected null in pg_database"); - newversion = get_collation_actual_version(datForm->datlocprovider, TextDatumGetCString(datum)); + if (datForm->datlocprovider == COLLPROVIDER_LIBC) + { + datum = heap_getattr(tuple, Anum_pg_database_datcollate, RelationGetDescr(rel), &isnull); + if (isnull) + elog(ERROR, "unexpected null in pg_database"); + } + else + { + datum = heap_getattr(tuple, Anum_pg_database_datlocale, RelationGetDescr(rel), &isnull); + if (isnull) + elog(ERROR, "unexpected null in pg_database"); + } + + newversion = get_collation_actual_version(datForm->datlocprovider, + TextDatumGetCString(datum)); /* cannot change from NULL to non-NULL or vice versa */ if ((!oldversion && newversion) || (oldversion && !newversion)) @@ -2449,6 +2560,7 @@ AlterDatabaseRefreshColl(AlterDatabaseRefreshCollStmt *stmt) bool nulls[Natts_pg_database] = {0}; bool replaces[Natts_pg_database] = {0}; Datum values[Natts_pg_database] = {0}; + HeapTuple newtuple; ereport(NOTICE, (errmsg("changing version from %s to %s", @@ -2457,14 +2569,15 @@ AlterDatabaseRefreshColl(AlterDatabaseRefreshCollStmt *stmt) values[Anum_pg_database_datcollversion - 1] = CStringGetTextDatum(newversion); replaces[Anum_pg_database_datcollversion - 1] = true; - tuple = heap_modify_tuple(tuple, RelationGetDescr(rel), - values, nulls, replaces); - CatalogTupleUpdate(rel, &tuple->t_self, tuple); - heap_freetuple(tuple); + newtuple = heap_modify_tuple(tuple, RelationGetDescr(rel), + values, nulls, replaces); + CatalogTupleUpdate(rel, &tuple->t_self, newtuple); + heap_freetuple(newtuple); } else ereport(NOTICE, (errmsg("version has not changed"))); + UnlockTuple(rel, &tuple->t_self, InplaceUpdateTupleLock); InvokeObjectPostAlterHook(DatabaseRelationId, db_id, 0); @@ -2576,6 +2689,8 @@ AlterDatabaseOwner(const char *dbname, Oid newOwnerId) (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("permission denied to change owner of database"))); + LockTuple(rel, &tuple->t_self, InplaceUpdateTupleLock); + repl_repl[Anum_pg_database_datdba - 1] = true; repl_val[Anum_pg_database_datdba - 1] = ObjectIdGetDatum(newOwnerId); @@ -2597,6 +2712,7 @@ AlterDatabaseOwner(const char *dbname, Oid newOwnerId) newtuple = heap_modify_tuple(tuple, RelationGetDescr(rel), repl_val, repl_null, repl_repl); CatalogTupleUpdate(rel, &newtuple->t_self, newtuple); + UnlockTuple(rel, &tuple->t_self, InplaceUpdateTupleLock); heap_freetuple(newtuple); @@ -2634,8 +2750,13 @@ pg_database_collation_actual_version(PG_FUNCTION_ARGS) datlocprovider = ((Form_pg_database) GETSTRUCT(tp))->datlocprovider; - datum = SysCacheGetAttrNotNull(DATABASEOID, tp, datlocprovider == COLLPROVIDER_ICU ? Anum_pg_database_daticulocale : Anum_pg_database_datcollate); - version = get_collation_actual_version(datlocprovider, TextDatumGetCString(datum)); + if (datlocprovider == COLLPROVIDER_LIBC) + datum = SysCacheGetAttrNotNull(DATABASEOID, tp, Anum_pg_database_datcollate); + else + datum = SysCacheGetAttrNotNull(DATABASEOID, tp, Anum_pg_database_datlocale); + + version = get_collation_actual_version(datlocprovider, + TextDatumGetCString(datum)); ReleaseSysCache(tp); @@ -2659,9 +2780,9 @@ pg_database_collation_actual_version(PG_FUNCTION_ARGS) static bool get_db_info(const char *name, LOCKMODE lockmode, Oid *dbIdP, Oid *ownerIdP, - int *encodingP, bool *dbIsTemplateP, bool *dbAllowConnP, + int *encodingP, bool *dbIsTemplateP, bool *dbAllowConnP, bool *dbHasLoginEvtP, TransactionId *dbFrozenXidP, MultiXactId *dbMinMultiP, - Oid *dbTablespace, char **dbCollate, char **dbCtype, char **dbIculocale, + Oid *dbTablespace, char **dbCollate, char **dbCtype, char **dbLocale, char **dbIcurules, char *dbLocProvider, char **dbCollversion) @@ -2744,6 +2865,9 @@ get_db_info(const char *name, LOCKMODE lockmode, /* allowed as template? */ if (dbIsTemplateP) *dbIsTemplateP = dbform->datistemplate; + /* Has on login event trigger? */ + if (dbHasLoginEvtP) + *dbHasLoginEvtP = dbform->dathasloginevt; /* allowing connections? */ if (dbAllowConnP) *dbAllowConnP = dbform->datallowconn; @@ -2769,13 +2893,13 @@ get_db_info(const char *name, LOCKMODE lockmode, datum = SysCacheGetAttrNotNull(DATABASEOID, tuple, Anum_pg_database_datctype); *dbCtype = TextDatumGetCString(datum); } - if (dbIculocale) + if (dbLocale) { - datum = SysCacheGetAttr(DATABASEOID, tuple, Anum_pg_database_daticulocale, &isnull); + datum = SysCacheGetAttr(DATABASEOID, tuple, Anum_pg_database_datlocale, &isnull); if (isnull) - *dbIculocale = NULL; + *dbLocale = NULL; else - *dbIculocale = TextDatumGetCString(datum); + *dbLocale = TextDatumGetCString(datum); } if (dbIcurules) { @@ -3064,6 +3188,42 @@ get_database_name(Oid dbid) return result; } + +/* + * While dropping a database the pg_database row is marked invalid, but the + * catalog contents still exist. Connections to such a database are not + * allowed. + */ +bool +database_is_invalid_form(Form_pg_database datform) +{ + return datform->datconnlimit == DATCONNLIMIT_INVALID_DB; +} + + +/* + * Convenience wrapper around database_is_invalid_form() + */ +bool +database_is_invalid_oid(Oid dboid) +{ + HeapTuple dbtup; + Form_pg_database dbform; + bool invalid; + + dbtup = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(dboid)); + if (!HeapTupleIsValid(dbtup)) + elog(ERROR, "cache lookup failed for database %u", dboid); + dbform = (Form_pg_database) GETSTRUCT(dbtup); + + invalid = database_is_invalid_form(dbform); + + ReleaseSysCache(dbtup); + + return invalid; +} + + /* * recovery_create_dbdir() * @@ -3173,7 +3333,7 @@ dbase_redo(XLogReaderState *record) */ FlushDatabaseBuffers(xlrec->src_db_id); - /* Close all sgmr fds in all backends. */ + /* Close all smgr fds in all backends. */ WaitForProcSignalBarrier(EmitProcSignalBarrier(PROCSIGNAL_BARRIER_SMGRRELEASE)); /* @@ -3239,7 +3399,7 @@ dbase_redo(XLogReaderState *record) /* Clean out the xlog relcache too */ XLogDropDatabase(xlrec->db_id); - /* Close all sgmr fds in all backends. */ + /* Close all smgr fds in all backends. */ WaitForProcSignalBarrier(EmitProcSignalBarrier(PROCSIGNAL_BARRIER_SMGRRELEASE)); for (i = 0; i < xlrec->ntablespaces; i++) diff --git a/src/backend/commands/define.c b/src/backend/commands/define.c index 0c03e90a09960..43f50066ea061 100644 --- a/src/backend/commands/define.c +++ b/src/backend/commands/define.c @@ -4,7 +4,7 @@ * Support routines for various kinds of object creation. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -39,8 +39,7 @@ #include "commands/defrem.h" #include "nodes/makefuncs.h" #include "parser/parse_type.h" -#include "parser/scansup.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" /* * Extract a string value (otherwise uninterpreted) from a DefElem. diff --git a/src/backend/commands/discard.c b/src/backend/commands/discard.c index 296dc82d2ee77..92d983ac74817 100644 --- a/src/backend/commands/discard.c +++ b/src/backend/commands/discard.c @@ -3,7 +3,7 @@ * discard.c * The implementation of the DISCARD command * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/commands/dropcmds.c b/src/backend/commands/dropcmds.c index 469a6c2ee968b..85eec7e394779 100644 --- a/src/backend/commands/dropcmds.c +++ b/src/backend/commands/dropcmds.c @@ -3,7 +3,7 @@ * dropcmds.c * handle various "DROP" operations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -14,23 +14,18 @@ */ #include "postgres.h" -#include "access/htup_details.h" #include "access/table.h" #include "access/xact.h" #include "catalog/dependency.h" #include "catalog/namespace.h" #include "catalog/objectaddress.h" -#include "catalog/pg_class.h" #include "catalog/pg_namespace.h" #include "catalog/pg_proc.h" #include "commands/defrem.h" #include "miscadmin.h" -#include "nodes/makefuncs.h" #include "parser/parse_type.h" #include "utils/acl.h" -#include "utils/builtins.h" #include "utils/lsyscache.h" -#include "utils/syscache.h" static void does_not_exist_skipping(ObjectType objtype, diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index d4b00d1a828a4..05a6de68ba3b0 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -3,7 +3,7 @@ * event_trigger.c * PostgreSQL EVENT TRIGGER support code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -13,6 +13,7 @@ */ #include "postgres.h" +#include "access/heapam.h" #include "access/htup_details.h" #include "access/table.h" #include "access/xact.h" @@ -20,15 +21,19 @@ #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/objectaccess.h" +#include "catalog/pg_authid.h" +#include "catalog/pg_auth_members.h" +#include "catalog/pg_database.h" #include "catalog/pg_event_trigger.h" #include "catalog/pg_namespace.h" #include "catalog/pg_opclass.h" #include "catalog/pg_opfamily.h" +#include "catalog/pg_parameter_acl.h" #include "catalog/pg_proc.h" +#include "catalog/pg_tablespace.h" #include "catalog/pg_trigger.h" #include "catalog/pg_ts_config.h" #include "catalog/pg_type.h" -#include "commands/dbcommands.h" #include "commands/event_trigger.h" #include "commands/extension.h" #include "commands/trigger.h" @@ -37,15 +42,18 @@ #include "miscadmin.h" #include "parser/parse_func.h" #include "pgstat.h" +#include "storage/lmgr.h" #include "tcop/deparse_utility.h" #include "tcop/utility.h" #include "utils/acl.h" #include "utils/builtins.h" #include "utils/evtcache.h" #include "utils/fmgroids.h" +#include "utils/fmgrprotos.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/rel.h" +#include "utils/snapmgr.h" #include "utils/syscache.h" typedef struct EventTriggerQueryState @@ -72,6 +80,9 @@ typedef struct EventTriggerQueryState static EventTriggerQueryState *currentEventTriggerState = NULL; +/* GUC parameter */ +bool event_triggers = true; + /* Support for dropped objects */ typedef struct SQLDropObject { @@ -100,6 +111,7 @@ static void validate_table_rewrite_tags(const char *filtervar, List *taglist); static void EventTriggerInvoke(List *fn_oid_list, EventTriggerData *trigdata); static const char *stringify_grant_objtype(ObjectType objtype); static const char *stringify_adefprivs_objtype(ObjectType objtype); +static void SetDatabaseHasLoginEventTriggers(void); /* * Create an event trigger. @@ -130,6 +142,7 @@ CreateEventTrigger(CreateEventTrigStmt *stmt) if (strcmp(stmt->eventname, "ddl_command_start") != 0 && strcmp(stmt->eventname, "ddl_command_end") != 0 && strcmp(stmt->eventname, "sql_drop") != 0 && + strcmp(stmt->eventname, "login") != 0 && strcmp(stmt->eventname, "table_rewrite") != 0) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -162,6 +175,10 @@ CreateEventTrigger(CreateEventTrigStmt *stmt) else if (strcmp(stmt->eventname, "table_rewrite") == 0 && tags != NULL) validate_table_rewrite_tags("tag", tags); + else if (strcmp(stmt->eventname, "login") == 0 && tags != NULL) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("tag filtering is not supported for login event triggers"))); /* * Give user a nice error message if an event trigger of the same name @@ -293,6 +310,13 @@ insert_event_trigger_tuple(const char *trigname, const char *eventname, Oid evtO CatalogTupleInsert(tgrel, tuple); heap_freetuple(tuple); + /* + * Login event triggers have an additional flag in pg_database to enable + * faster lookups in hot codepaths. Set the flag unless already True. + */ + if (strcmp(eventname, "login") == 0) + SetDatabaseHasLoginEventTriggers(); + /* Depend on owner. */ recordDependencyOnOwner(EventTriggerRelationId, trigoid, evtOwner); @@ -354,6 +378,44 @@ filter_list_to_array(List *filterlist) return PointerGetDatum(construct_array_builtin(data, l, TEXTOID)); } +/* + * Set pg_database.dathasloginevt flag for current database indicating that + * current database has on login event triggers. + */ +void +SetDatabaseHasLoginEventTriggers(void) +{ + /* Set dathasloginevt flag in pg_database */ + Form_pg_database db; + Relation pg_db = table_open(DatabaseRelationId, RowExclusiveLock); + ItemPointerData otid; + HeapTuple tuple; + + /* + * Use shared lock to prevent a conflict with EventTriggerOnLogin() trying + * to reset pg_database.dathasloginevt flag. Note, this lock doesn't + * effectively blocks database or other objection. It's just custom lock + * tag used to prevent multiple backends changing + * pg_database.dathasloginevt flag. + */ + LockSharedObject(DatabaseRelationId, MyDatabaseId, 0, AccessExclusiveLock); + + tuple = SearchSysCacheLockedCopy1(DATABASEOID, ObjectIdGetDatum(MyDatabaseId)); + if (!HeapTupleIsValid(tuple)) + elog(ERROR, "cache lookup failed for database %u", MyDatabaseId); + otid = tuple->t_self; + db = (Form_pg_database) GETSTRUCT(tuple); + if (!db->dathasloginevt) + { + db->dathasloginevt = true; + CatalogTupleUpdate(pg_db, &otid, tuple); + CommandCounterIncrement(); + } + UnlockTuple(pg_db, &otid, InplaceUpdateTupleLock); + table_close(pg_db, RowExclusiveLock); + heap_freetuple(tuple); +} + /* * ALTER EVENT TRIGGER foo ENABLE|DISABLE|ENABLE ALWAYS|REPLICA */ @@ -388,6 +450,14 @@ AlterEventTrigger(AlterEventTrigStmt *stmt) CatalogTupleUpdate(tgrel, &tup->t_self, tup); + /* + * Login event triggers have an additional flag in pg_database to enable + * faster lookups in hot codepaths. Set the flag unless already True. + */ + if (namestrcmp(&evtForm->evtevent, "login") == 0 && + tgenabled != TRIGGER_DISABLED) + SetDatabaseHasLoginEventTriggers(); + InvokeObjectPostAlterHook(EventTriggerRelationId, trigoid, 0); @@ -546,6 +616,15 @@ filter_event_trigger(CommandTag tag, EventTriggerCacheItem *item) return true; } +static CommandTag +EventTriggerGetTag(Node *parsetree, EventTriggerEvent event) +{ + if (event == EVT_Login) + return CMDTAG_LOGIN; + else + return CreateCommandTag(parsetree); +} + /* * Setup for running triggers for the given event. Return value is an OID list * of functions to run; if there are any, trigdata is filled with an @@ -554,7 +633,7 @@ filter_event_trigger(CommandTag tag, EventTriggerCacheItem *item) static List * EventTriggerCommonSetup(Node *parsetree, EventTriggerEvent event, const char *eventstr, - EventTriggerData *trigdata) + EventTriggerData *trigdata, bool unfiltered) { CommandTag tag; List *cachelist; @@ -579,10 +658,12 @@ EventTriggerCommonSetup(Node *parsetree, { CommandTag dbgtag; - dbgtag = CreateCommandTag(parsetree); + dbgtag = EventTriggerGetTag(parsetree, event); + if (event == EVT_DDLCommandStart || event == EVT_DDLCommandEnd || - event == EVT_SQLDrop) + event == EVT_SQLDrop || + event == EVT_Login) { if (!command_tag_event_trigger_ok(dbgtag)) elog(ERROR, "unexpected command tag \"%s\"", GetCommandTagName(dbgtag)); @@ -601,7 +682,7 @@ EventTriggerCommonSetup(Node *parsetree, return NIL; /* Get the command tag. */ - tag = CreateCommandTag(parsetree); + tag = EventTriggerGetTag(parsetree, event); /* * Filter list of event triggers by command tag, and copy them into our @@ -614,14 +695,14 @@ EventTriggerCommonSetup(Node *parsetree, { EventTriggerCacheItem *item = lfirst(lc); - if (filter_event_trigger(tag, item)) + if (unfiltered || filter_event_trigger(tag, item)) { /* We must plan to fire this trigger. */ runlist = lappend_oid(runlist, item->fnoid); } } - /* don't spend any more time on this if no functions to run */ + /* Don't spend any more time on this if no functions to run */ if (runlist == NIL) return NIL; @@ -657,14 +738,17 @@ EventTriggerDDLCommandStart(Node *parsetree) * wherein event triggers are disabled. (Or we could implement * heapscan-and-sort logic for that case, but having disaster recovery * scenarios depend on code that's otherwise untested isn't appetizing.) + * + * Additionally, event triggers can be disabled with a superuser-only GUC + * to make fixing database easier as per 1 above. */ - if (!IsUnderPostmaster) + if (!IsUnderPostmaster || !event_triggers) return; runlist = EventTriggerCommonSetup(parsetree, EVT_DDLCommandStart, "ddl_command_start", - &trigdata); + &trigdata, false); if (runlist == NIL) return; @@ -692,9 +776,9 @@ EventTriggerDDLCommandEnd(Node *parsetree) /* * See EventTriggerDDLCommandStart for a discussion about why event - * triggers are disabled in single user mode. + * triggers are disabled in single user mode or via GUC. */ - if (!IsUnderPostmaster) + if (!IsUnderPostmaster || !event_triggers) return; /* @@ -712,7 +796,7 @@ EventTriggerDDLCommandEnd(Node *parsetree) runlist = EventTriggerCommonSetup(parsetree, EVT_DDLCommandEnd, "ddl_command_end", - &trigdata); + &trigdata, false); if (runlist == NIL) return; @@ -740,9 +824,9 @@ EventTriggerSQLDrop(Node *parsetree) /* * See EventTriggerDDLCommandStart for a discussion about why event - * triggers are disabled in single user mode. + * triggers are disabled in single user mode or via a GUC. */ - if (!IsUnderPostmaster) + if (!IsUnderPostmaster || !event_triggers) return; /* @@ -758,7 +842,7 @@ EventTriggerSQLDrop(Node *parsetree) runlist = EventTriggerCommonSetup(parsetree, EVT_SQLDrop, "sql_drop", - &trigdata); + &trigdata, false); /* * Nothing to do if run list is empty. Note this typically can't happen, @@ -799,6 +883,119 @@ EventTriggerSQLDrop(Node *parsetree) list_free(runlist); } +/* + * Fire login event triggers if any are present. The dathasloginevt + * pg_database flag is left unchanged when an event trigger is dropped to avoid + * complicating the codepath in the case of multiple event triggers. This + * function will instead unset the flag if no trigger is defined. + */ +void +EventTriggerOnLogin(void) +{ + List *runlist; + EventTriggerData trigdata; + + /* + * See EventTriggerDDLCommandStart for a discussion about why event + * triggers are disabled in single user mode or via a GUC. We also need a + * database connection (some background workers don't have it). + */ + if (!IsUnderPostmaster || !event_triggers || + !OidIsValid(MyDatabaseId) || !MyDatabaseHasLoginEventTriggers) + return; + + StartTransactionCommand(); + runlist = EventTriggerCommonSetup(NULL, + EVT_Login, "login", + &trigdata, false); + + if (runlist != NIL) + { + /* + * Event trigger execution may require an active snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + + /* Run the triggers. */ + EventTriggerInvoke(runlist, &trigdata); + + /* Cleanup. */ + list_free(runlist); + + PopActiveSnapshot(); + } + + /* + * There is no active login event trigger, but our + * pg_database.dathasloginevt is set. Try to unset this flag. We use the + * lock to prevent concurrent SetDatabaseHasLoginEventTriggers(), but we + * don't want to hang the connection waiting on the lock. Thus, we are + * just trying to acquire the lock conditionally. + */ + else if (ConditionalLockSharedObject(DatabaseRelationId, MyDatabaseId, + 0, AccessExclusiveLock)) + { + /* + * The lock is held. Now we need to recheck that login event triggers + * list is still empty. Once the list is empty, we know that even if + * there is a backend which concurrently inserts/enables a login event + * trigger, it will update pg_database.dathasloginevt *afterwards*. + */ + runlist = EventTriggerCommonSetup(NULL, + EVT_Login, "login", + &trigdata, true); + + if (runlist == NIL) + { + Relation pg_db = table_open(DatabaseRelationId, RowExclusiveLock); + HeapTuple tuple; + void *state; + Form_pg_database db; + ScanKeyData key[1]; + + /* Fetch a copy of the tuple to scribble on */ + ScanKeyInit(&key[0], + Anum_pg_database_oid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(MyDatabaseId)); + + systable_inplace_update_begin(pg_db, DatabaseOidIndexId, true, + NULL, 1, key, &tuple, &state); + + if (!HeapTupleIsValid(tuple)) + elog(ERROR, "could not find tuple for database %u", MyDatabaseId); + + db = (Form_pg_database) GETSTRUCT(tuple); + if (db->dathasloginevt) + { + db->dathasloginevt = false; + + /* + * Do an "in place" update of the pg_database tuple. Doing + * this instead of regular updates serves two purposes. First, + * that avoids possible waiting on the row-level lock. Second, + * that avoids dealing with TOAST. + * + * Changes made by inplace update may be lost due to + * concurrent normal updates; see inplace-inval.spec. However, + * we are OK with that. The subsequent connections will still + * have a chance to set "dathasloginevt" to false. + */ + systable_inplace_update_finish(state, tuple); + } + else + systable_inplace_update_cancel(state); + table_close(pg_db, RowExclusiveLock); + heap_freetuple(tuple); + } + else + { + list_free(runlist); + } + } + CommitTransactionCommand(); +} + /* * Fire table_rewrite triggers. @@ -811,9 +1008,9 @@ EventTriggerTableRewrite(Node *parsetree, Oid tableOid, int reason) /* * See EventTriggerDDLCommandStart for a discussion about why event - * triggers are disabled in single user mode. + * triggers are disabled in single user mode or via a GUC. */ - if (!IsUnderPostmaster) + if (!IsUnderPostmaster || !event_triggers) return; /* @@ -829,7 +1026,7 @@ EventTriggerTableRewrite(Node *parsetree, Oid tableOid, int reason) runlist = EventTriggerCommonSetup(parsetree, EVT_TableRewrite, "table_rewrite", - &trigdata); + &trigdata, false); if (runlist == NIL) return; @@ -930,6 +1127,8 @@ EventTriggerInvoke(List *fn_oid_list, EventTriggerData *trigdata) /* * Do event triggers support this object type? + * + * See also event trigger support matrix in event-trigger.sgml. */ bool EventTriggerSupportsObjectType(ObjectType obtype) @@ -940,133 +1139,39 @@ EventTriggerSupportsObjectType(ObjectType obtype) case OBJECT_TABLESPACE: case OBJECT_ROLE: case OBJECT_PARAMETER_ACL: - /* no support for global objects */ + /* no support for global objects (except subscriptions) */ return false; case OBJECT_EVENT_TRIGGER: /* no support for event triggers on event triggers */ return false; - case OBJECT_ACCESS_METHOD: - case OBJECT_AGGREGATE: - case OBJECT_AMOP: - case OBJECT_AMPROC: - case OBJECT_ATTRIBUTE: - case OBJECT_CAST: - case OBJECT_COLUMN: - case OBJECT_COLLATION: - case OBJECT_CONVERSION: - case OBJECT_DEFACL: - case OBJECT_DEFAULT: - case OBJECT_DOMAIN: - case OBJECT_DOMCONSTRAINT: - case OBJECT_EXTENSION: - case OBJECT_FDW: - case OBJECT_FOREIGN_SERVER: - case OBJECT_FOREIGN_TABLE: - case OBJECT_FUNCTION: - case OBJECT_INDEX: - case OBJECT_LANGUAGE: - case OBJECT_LARGEOBJECT: - case OBJECT_MATVIEW: - case OBJECT_OPCLASS: - case OBJECT_OPERATOR: - case OBJECT_OPFAMILY: - case OBJECT_POLICY: - case OBJECT_PROCEDURE: - case OBJECT_PUBLICATION: - case OBJECT_PUBLICATION_NAMESPACE: - case OBJECT_PUBLICATION_REL: - case OBJECT_ROUTINE: - case OBJECT_RULE: - case OBJECT_SCHEMA: - case OBJECT_SEQUENCE: - case OBJECT_SUBSCRIPTION: - case OBJECT_STATISTIC_EXT: - case OBJECT_TABCONSTRAINT: - case OBJECT_TABLE: - case OBJECT_TRANSFORM: - case OBJECT_TRIGGER: - case OBJECT_TSCONFIGURATION: - case OBJECT_TSDICTIONARY: - case OBJECT_TSPARSER: - case OBJECT_TSTEMPLATE: - case OBJECT_TYPE: - case OBJECT_USER_MAPPING: - case OBJECT_VIEW: + default: return true; - - /* - * There's intentionally no default: case here; we want the - * compiler to warn if a new ObjectType hasn't been handled above. - */ } - - /* Shouldn't get here, but if we do, say "no support" */ - return false; } /* * Do event triggers support this object class? + * + * See also event trigger support matrix in event-trigger.sgml. */ bool -EventTriggerSupportsObjectClass(ObjectClass objclass) +EventTriggerSupportsObject(const ObjectAddress *object) { - switch (objclass) + switch (object->classId) { - case OCLASS_DATABASE: - case OCLASS_TBLSPACE: - case OCLASS_ROLE: - case OCLASS_ROLE_MEMBERSHIP: - case OCLASS_PARAMETER_ACL: - /* no support for global objects */ + case DatabaseRelationId: + case TableSpaceRelationId: + case AuthIdRelationId: + case AuthMemRelationId: + case ParameterAclRelationId: + /* no support for global objects (except subscriptions) */ return false; - case OCLASS_EVENT_TRIGGER: + case EventTriggerRelationId: /* no support for event triggers on event triggers */ return false; - case OCLASS_CLASS: - case OCLASS_PROC: - case OCLASS_TYPE: - case OCLASS_CAST: - case OCLASS_COLLATION: - case OCLASS_CONSTRAINT: - case OCLASS_CONVERSION: - case OCLASS_DEFAULT: - case OCLASS_LANGUAGE: - case OCLASS_LARGEOBJECT: - case OCLASS_OPERATOR: - case OCLASS_OPCLASS: - case OCLASS_OPFAMILY: - case OCLASS_AM: - case OCLASS_AMOP: - case OCLASS_AMPROC: - case OCLASS_REWRITE: - case OCLASS_TRIGGER: - case OCLASS_SCHEMA: - case OCLASS_STATISTIC_EXT: - case OCLASS_TSPARSER: - case OCLASS_TSDICT: - case OCLASS_TSTEMPLATE: - case OCLASS_TSCONFIG: - case OCLASS_FDW: - case OCLASS_FOREIGN_SERVER: - case OCLASS_USER_MAPPING: - case OCLASS_DEFACL: - case OCLASS_EXTENSION: - case OCLASS_POLICY: - case OCLASS_PUBLICATION: - case OCLASS_PUBLICATION_NAMESPACE: - case OCLASS_PUBLICATION_REL: - case OCLASS_SUBSCRIPTION: - case OCLASS_TRANSFORM: + default: return true; - - /* - * There's intentionally no default: case here; we want the - * compiler to warn if a new OCLASS hasn't been handled above. - */ } - - /* Shouldn't get here, but if we do, say "no support" */ - return false; } /* @@ -1178,7 +1283,7 @@ EventTriggerSQLDropAddObject(const ObjectAddress *object, bool original, bool no if (!currentEventTriggerState) return; - Assert(EventTriggerSupportsObjectClass(getObjectClass(object))); + Assert(EventTriggerSupportsObject(object)); /* don't report temp schemas except my own */ if (object->classId == NamespaceRelationId && diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 8570b14f6217b..8086607710eb8 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -3,7 +3,7 @@ * explain.c * Explain query execution plans * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * IDENTIFICATION @@ -18,9 +18,10 @@ #include "commands/createas.h" #include "commands/defrem.h" #include "commands/prepare.h" -#include "executor/nodeHash.h" #include "foreign/fdwapi.h" #include "jit/jit.h" +#include "libpq/pqformat.h" +#include "libpq/protocol.h" #include "nodes/extensible.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" @@ -48,18 +49,34 @@ ExplainOneQuery_hook_type ExplainOneQuery_hook = NULL; explain_get_index_name_hook_type explain_get_index_name_hook = NULL; +/* Instrumentation data for SERIALIZE option */ +typedef struct SerializeMetrics +{ + uint64 bytesSent; /* # of bytes serialized */ + instr_time timeSpent; /* time spent serializing */ + BufferUsage bufferUsage; /* buffers accessed during serialization */ +} SerializeMetrics; + /* OR-able flags for ExplainXMLTag() */ #define X_OPENING 0 #define X_CLOSING 1 #define X_CLOSE_IMMEDIATE 2 #define X_NOWHITESPACE 4 +/* + * Various places within need to convert bytes to kilobytes. Round these up + * to the next whole kilobyte. + */ +#define BYTES_TO_KILOBYTES(b) (((b) + 1023) / 1024) + static void ExplainOneQuery(Query *query, int cursorOptions, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv); static void ExplainPrintJIT(ExplainState *es, int jit_flags, JitInstrumentation *ji); +static void ExplainPrintSerialize(ExplainState *es, + SerializeMetrics *metrics); static void report_triggers(ResultRelInfo *rInfo, bool show_relname, ExplainState *es); static double elapsed_time(instr_time *starttime); @@ -117,11 +134,12 @@ static void show_tidbitmap_info(BitmapHeapScanState *planstate, static void show_instrumentation_count(const char *qlabel, int which, PlanState *planstate, ExplainState *es); static void show_foreignscan_info(ForeignScanState *fsstate, ExplainState *es); -static void show_eval_params(Bitmapset *bms_params, ExplainState *es); static const char *explain_get_index_name(Oid indexId); -static void show_buffer_usage(ExplainState *es, const BufferUsage *usage, - bool planning); +static bool peek_buffer_usage(ExplainState *es, const BufferUsage *usage); +static void show_buffer_usage(ExplainState *es, const BufferUsage *usage); static void show_wal_usage(ExplainState *es, const WalUsage *usage); +static void show_memory_counters(ExplainState *es, + const MemoryContextCounters *mem_counters); static void ExplainIndexScanDetails(Oid indexid, ScanDirection indexorderdir, ExplainState *es); static void ExplainScanTarget(Scan *plan, ExplainState *es); @@ -153,6 +171,7 @@ static void ExplainIndentText(ExplainState *es); static void ExplainJSONLineEnding(ExplainState *es); static void ExplainYAMLLineStarting(ExplainState *es); static void escape_yaml(StringInfo buf, const char *str); +static SerializeMetrics GetSerializationMetrics(DestReceiver *dest); @@ -202,6 +221,33 @@ ExplainQuery(ParseState *pstate, ExplainStmt *stmt, summary_set = true; es->summary = defGetBoolean(opt); } + else if (strcmp(opt->defname, "memory") == 0) + es->memory = defGetBoolean(opt); + else if (strcmp(opt->defname, "serialize") == 0) + { + if (opt->arg) + { + char *p = defGetString(opt); + + if (strcmp(p, "off") == 0 || strcmp(p, "none") == 0) + es->serialize = EXPLAIN_SERIALIZE_NONE; + else if (strcmp(p, "text") == 0) + es->serialize = EXPLAIN_SERIALIZE_TEXT; + else if (strcmp(p, "binary") == 0) + es->serialize = EXPLAIN_SERIALIZE_BINARY; + else + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized value for EXPLAIN option \"%s\": \"%s\"", + opt->defname, p), + parser_errposition(pstate, opt->location))); + } + else + { + /* SERIALIZE without an argument is taken as 'text' */ + es->serialize = EXPLAIN_SERIALIZE_TEXT; + } + } else if (strcmp(opt->defname, "format") == 0) { char *p = defGetString(opt); @@ -244,6 +290,12 @@ ExplainQuery(ParseState *pstate, ExplainStmt *stmt, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("EXPLAIN option TIMING requires ANALYZE"))); + /* check that serialize is used with EXPLAIN ANALYZE */ + if (es->serialize != EXPLAIN_SERIALIZE_NONE && !es->analyze) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("EXPLAIN option SERIALIZE requires ANALYZE"))); + /* check that GENERIC_PLAN is not used with EXPLAIN ANALYZE */ if (es->generic && es->analyze) ereport(ERROR, @@ -391,34 +443,72 @@ ExplainOneQuery(Query *query, int cursorOptions, (*ExplainOneQuery_hook) (query, cursorOptions, into, es, queryString, params, queryEnv); else + standard_ExplainOneQuery(query, cursorOptions, into, es, + queryString, params, queryEnv); +} + +/* + * standard_ExplainOneQuery - + * print out the execution plan for one Query, without calling a hook. + */ +void +standard_ExplainOneQuery(Query *query, int cursorOptions, + IntoClause *into, ExplainState *es, + const char *queryString, ParamListInfo params, + QueryEnvironment *queryEnv) +{ + PlannedStmt *plan; + instr_time planstart, + planduration; + BufferUsage bufusage_start, + bufusage; + MemoryContextCounters mem_counters; + MemoryContext planner_ctx = NULL; + MemoryContext saved_ctx = NULL; + + if (es->memory) { - PlannedStmt *plan; - instr_time planstart, - planduration; - BufferUsage bufusage_start, - bufusage; + /* + * Create a new memory context to measure planner's memory consumption + * accurately. Note that if the planner were to be modified to use a + * different memory context type, here we would be changing that to + * AllocSet, which might be undesirable. However, we don't have a way + * to create a context of the same type as another, so we pray and + * hope that this is OK. + */ + planner_ctx = AllocSetContextCreate(CurrentMemoryContext, + "explain analyze planner context", + ALLOCSET_DEFAULT_SIZES); + saved_ctx = MemoryContextSwitchTo(planner_ctx); + } - if (es->buffers) - bufusage_start = pgBufferUsage; - INSTR_TIME_SET_CURRENT(planstart); + if (es->buffers) + bufusage_start = pgBufferUsage; + INSTR_TIME_SET_CURRENT(planstart); - /* plan the query */ - plan = pg_plan_query(query, queryString, cursorOptions, params); + /* plan the query */ + plan = pg_plan_query(query, queryString, cursorOptions, params); - INSTR_TIME_SET_CURRENT(planduration); - INSTR_TIME_SUBTRACT(planduration, planstart); + INSTR_TIME_SET_CURRENT(planduration); + INSTR_TIME_SUBTRACT(planduration, planstart); - /* calc differences of buffer counters. */ - if (es->buffers) - { - memset(&bufusage, 0, sizeof(BufferUsage)); - BufferUsageAccumDiff(&bufusage, &pgBufferUsage, &bufusage_start); - } + if (es->memory) + { + MemoryContextSwitchTo(saved_ctx); + MemoryContextMemConsumed(planner_ctx, &mem_counters); + } - /* run it (if needed) and produce output */ - ExplainOnePlan(plan, into, es, queryString, params, queryEnv, - &planduration, (es->buffers ? &bufusage : NULL)); + /* calc differences of buffer counters. */ + if (es->buffers) + { + memset(&bufusage, 0, sizeof(BufferUsage)); + BufferUsageAccumDiff(&bufusage, &pgBufferUsage, &bufusage_start); } + + /* run it (if needed) and produce output */ + ExplainOnePlan(plan, into, es, queryString, params, queryEnv, + &planduration, (es->buffers ? &bufusage : NULL), + es->memory ? &mem_counters : NULL); } /* @@ -527,7 +617,8 @@ void ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv, const instr_time *planduration, - const BufferUsage *bufusage) + const BufferUsage *bufusage, + const MemoryContextCounters *mem_counters) { DestReceiver *dest; QueryDesc *queryDesc; @@ -535,6 +626,7 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, double totaltime = 0; int eflags; int instrument_option = 0; + SerializeMetrics serializeMetrics = {0}; Assert(plannedstmt->commandType != CMD_UTILITY); @@ -563,11 +655,17 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, UpdateActiveSnapshotCommandId(); /* - * Normally we discard the query's output, but if explaining CREATE TABLE - * AS, we'd better use the appropriate tuple receiver. + * We discard the output if we have no use for it. If we're explaining + * CREATE TABLE AS, we'd better use the appropriate tuple receiver, while + * the SERIALIZE option requires its own tuple receiver. (If you specify + * SERIALIZE while explaining CREATE TABLE AS, you'll see zeroes for the + * results, which is appropriate since no data would have gone to the + * client.) */ if (into) dest = CreateIntoRelDestReceiver(into); + else if (es->serialize != EXPLAIN_SERIALIZE_NONE) + dest = CreateExplainSerializeDestReceiver(es); else dest = None_Receiver; @@ -610,16 +708,39 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, totaltime += elapsed_time(&starttime); } + /* grab serialization metrics before we destroy the DestReceiver */ + if (es->serialize != EXPLAIN_SERIALIZE_NONE) + serializeMetrics = GetSerializationMetrics(dest); + + /* call the DestReceiver's destroy method even during explain */ + dest->rDestroy(dest); + ExplainOpenGroup("Query", NULL, true, es); /* Create textual dump of plan tree */ ExplainPrintPlan(es, queryDesc); - /* Show buffer usage in planning */ - if (bufusage) + /* Show buffer and/or memory usage in planning */ + if (peek_buffer_usage(es, bufusage) || mem_counters) { ExplainOpenGroup("Planning", "Planning", true, es); - show_buffer_usage(es, bufusage, true); + + if (es->format == EXPLAIN_FORMAT_TEXT) + { + ExplainIndentText(es); + appendStringInfoString(es->str, "Planning:\n"); + es->indent++; + } + + if (bufusage) + show_buffer_usage(es, bufusage); + + if (mem_counters) + show_memory_counters(es, mem_counters); + + if (es->format == EXPLAIN_FORMAT_TEXT) + es->indent--; + ExplainCloseGroup("Planning", "Planning", true, es); } @@ -643,6 +764,10 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, if (es->costs) ExplainPrintJITSummary(es, queryDesc); + /* Print info about serialization of output */ + if (es->serialize != EXPLAIN_SERIALIZE_NONE) + ExplainPrintSerialize(es, &serializeMetrics); + /* * Close down the query and free resources. Include time for this in the * total execution time (although it should be pretty minimal). @@ -893,6 +1018,7 @@ ExplainPrintJIT(ExplainState *es, int jit_flags, JitInstrumentation *ji) /* calculate total time */ INSTR_TIME_SET_ZERO(total_time); + /* don't add deform_counter, it's included in generation_counter */ INSTR_TIME_ADD(total_time, ji->generation_counter); INSTR_TIME_ADD(total_time, ji->inlining_counter); INSTR_TIME_ADD(total_time, ji->optimization_counter); @@ -920,8 +1046,9 @@ ExplainPrintJIT(ExplainState *es, int jit_flags, JitInstrumentation *ji) { ExplainIndentText(es); appendStringInfo(es->str, - "Timing: %s %.3f ms, %s %.3f ms, %s %.3f ms, %s %.3f ms, %s %.3f ms\n", + "Timing: %s %.3f ms (%s %.3f ms), %s %.3f ms, %s %.3f ms, %s %.3f ms, %s %.3f ms\n", "Generation", 1000.0 * INSTR_TIME_GET_DOUBLE(ji->generation_counter), + "Deform", 1000.0 * INSTR_TIME_GET_DOUBLE(ji->deform_counter), "Inlining", 1000.0 * INSTR_TIME_GET_DOUBLE(ji->inlining_counter), "Optimization", 1000.0 * INSTR_TIME_GET_DOUBLE(ji->optimization_counter), "Emission", 1000.0 * INSTR_TIME_GET_DOUBLE(ji->emission_counter), @@ -945,9 +1072,15 @@ ExplainPrintJIT(ExplainState *es, int jit_flags, JitInstrumentation *ji) { ExplainOpenGroup("Timing", "Timing", true, es); - ExplainPropertyFloat("Generation", "ms", + ExplainOpenGroup("Generation", "Generation", true, es); + ExplainPropertyFloat("Deform", "ms", + 1000.0 * INSTR_TIME_GET_DOUBLE(ji->deform_counter), + 3, es); + ExplainPropertyFloat("Total", "ms", 1000.0 * INSTR_TIME_GET_DOUBLE(ji->generation_counter), 3, es); + ExplainCloseGroup("Generation", "Generation", true, es); + ExplainPropertyFloat("Inlining", "ms", 1000.0 * INSTR_TIME_GET_DOUBLE(ji->inlining_counter), 3, es); @@ -968,6 +1101,62 @@ ExplainPrintJIT(ExplainState *es, int jit_flags, JitInstrumentation *ji) ExplainCloseGroup("JIT", "JIT", true, es); } +/* + * ExplainPrintSerialize - + * Append information about query output volume to es->str. + */ +static void +ExplainPrintSerialize(ExplainState *es, SerializeMetrics *metrics) +{ + const char *format; + + /* We shouldn't get called for EXPLAIN_SERIALIZE_NONE */ + if (es->serialize == EXPLAIN_SERIALIZE_TEXT) + format = "text"; + else + { + Assert(es->serialize == EXPLAIN_SERIALIZE_BINARY); + format = "binary"; + } + + ExplainOpenGroup("Serialization", "Serialization", true, es); + + if (es->format == EXPLAIN_FORMAT_TEXT) + { + ExplainIndentText(es); + if (es->timing) + appendStringInfo(es->str, "Serialization: time=%.3f ms output=" UINT64_FORMAT "kB format=%s\n", + 1000.0 * INSTR_TIME_GET_DOUBLE(metrics->timeSpent), + BYTES_TO_KILOBYTES(metrics->bytesSent), + format); + else + appendStringInfo(es->str, "Serialization: output=" UINT64_FORMAT "kB format=%s\n", + BYTES_TO_KILOBYTES(metrics->bytesSent), + format); + + if (es->buffers && peek_buffer_usage(es, &metrics->bufferUsage)) + { + es->indent++; + show_buffer_usage(es, &metrics->bufferUsage); + es->indent--; + } + } + else + { + if (es->timing) + ExplainPropertyFloat("Time", "ms", + 1000.0 * INSTR_TIME_GET_DOUBLE(metrics->timeSpent), + 3, es); + ExplainPropertyUInteger("Output Volume", "kB", + BYTES_TO_KILOBYTES(metrics->bytesSent), es); + ExplainPropertyText("Format", format, es); + if (es->buffers) + show_buffer_usage(es, &metrics->bufferUsage); + } + + ExplainCloseGroup("Serialization", "Serialization", true, es); +} + /* * ExplainQueryText - * add a "Query Text" node that contains the actual text of the query @@ -1848,10 +2037,6 @@ ExplainNode(PlanState *planstate, List *ancestors, ExplainPropertyInteger("Workers Planned", NULL, gather->num_workers, es); - /* Show params evaluated at gather node */ - if (gather->initParam) - show_eval_params(gather->initParam, es); - if (es->analyze) { int nworkers; @@ -1876,10 +2061,6 @@ ExplainNode(PlanState *planstate, List *ancestors, ExplainPropertyInteger("Workers Planned", NULL, gm->num_workers, es); - /* Show params evaluated at gather-merge node */ - if (gm->initParam) - show_eval_params(gm->initParam, es); - if (es->analyze) { int nworkers; @@ -2098,7 +2279,7 @@ ExplainNode(PlanState *planstate, List *ancestors, /* Show buffer/WAL usage */ if (es->buffers && planstate->instrument) - show_buffer_usage(es, &planstate->instrument->bufusage, false); + show_buffer_usage(es, &planstate->instrument->bufusage); if (es->wal && planstate->instrument) show_wal_usage(es, &planstate->instrument->walusage); @@ -2117,7 +2298,7 @@ ExplainNode(PlanState *planstate, List *ancestors, ExplainOpenWorker(n, es); if (es->buffers) - show_buffer_usage(es, &instrument->bufusage, false); + show_buffer_usage(es, &instrument->bufusage); if (es->wal) show_wal_usage(es, &instrument->walusage); ExplainCloseWorker(n, es); @@ -2387,7 +2568,7 @@ show_sort_keys(SortState *sortstate, List *ancestors, ExplainState *es) } /* - * Show the sort keys for a IncrementalSort node. + * Show the sort keys for an IncrementalSort node. */ static void show_incremental_sort_keys(IncrementalSortState *incrsortstate, @@ -3101,7 +3282,7 @@ show_hash_info(HashState *hashstate, ExplainState *es) if (hinstrument.nbatch > 0) { - long spacePeakKb = (hinstrument.space_peak + 1023) / 1024; + uint64 spacePeakKb = BYTES_TO_KILOBYTES(hinstrument.space_peak); if (es->format != EXPLAIN_FORMAT_TEXT) { @@ -3113,15 +3294,15 @@ show_hash_info(HashState *hashstate, ExplainState *es) hinstrument.nbatch, es); ExplainPropertyInteger("Original Hash Batches", NULL, hinstrument.nbatch_original, es); - ExplainPropertyInteger("Peak Memory Usage", "kB", - spacePeakKb, es); + ExplainPropertyUInteger("Peak Memory Usage", "kB", + spacePeakKb, es); } else if (hinstrument.nbatch_original != hinstrument.nbatch || hinstrument.nbuckets_original != hinstrument.nbuckets) { ExplainIndentText(es); appendStringInfo(es->str, - "Buckets: %d (originally %d) Batches: %d (originally %d) Memory Usage: %ldkB\n", + "Buckets: %d (originally %d) Batches: %d (originally %d) Memory Usage: " UINT64_FORMAT "kB\n", hinstrument.nbuckets, hinstrument.nbuckets_original, hinstrument.nbatch, @@ -3132,7 +3313,7 @@ show_hash_info(HashState *hashstate, ExplainState *es) { ExplainIndentText(es); appendStringInfo(es->str, - "Buckets: %d Batches: %d Memory Usage: %ldkB\n", + "Buckets: %d Batches: %d Memory Usage: " UINT64_FORMAT "kB\n", hinstrument.nbuckets, hinstrument.nbatch, spacePeakKb); } @@ -3202,9 +3383,9 @@ show_memoize_info(MemoizeState *mstate, List *ancestors, ExplainState *es) * when mem_peak is 0. */ if (mstate->stats.mem_peak > 0) - memPeakKb = (mstate->stats.mem_peak + 1023) / 1024; + memPeakKb = BYTES_TO_KILOBYTES(mstate->stats.mem_peak); else - memPeakKb = (mstate->mem_used + 1023) / 1024; + memPeakKb = BYTES_TO_KILOBYTES(mstate->mem_used); if (es->format != EXPLAIN_FORMAT_TEXT) { @@ -3253,7 +3434,7 @@ show_memoize_info(MemoizeState *mstate, List *ancestors, ExplainState *es) * MemoizeInstrumentation.mem_peak field for us. No need to do the * zero checks like we did for the serial case above. */ - memPeakKb = (si->mem_peak + 1023) / 1024; + memPeakKb = BYTES_TO_KILOBYTES(si->mem_peak); if (es->format == EXPLAIN_FORMAT_TEXT) { @@ -3290,7 +3471,7 @@ static void show_hashagg_info(AggState *aggstate, ExplainState *es) { Agg *agg = (Agg *) aggstate->ss.ps.plan; - int64 memPeakKb = (aggstate->hash_mem_peak + 1023) / 1024; + int64 memPeakKb = BYTES_TO_KILOBYTES(aggstate->hash_mem_peak); if (agg->aggstrategy != AGG_HASHED && agg->aggstrategy != AGG_MIXED) @@ -3371,7 +3552,7 @@ show_hashagg_info(AggState *aggstate, ExplainState *es) continue; hash_disk_used = sinstrument->hash_disk_used; hash_batches_used = sinstrument->hash_batches_used; - memPeakKb = (sinstrument->hash_mem_peak + 1023) / 1024; + memPeakKb = BYTES_TO_KILOBYTES(sinstrument->hash_mem_peak); if (es->workers_state) ExplainOpenWorker(n, es); @@ -3484,29 +3665,6 @@ show_foreignscan_info(ForeignScanState *fsstate, ExplainState *es) } } -/* - * Show initplan params evaluated at Gather or Gather Merge node. - */ -static void -show_eval_params(Bitmapset *bms_params, ExplainState *es) -{ - int paramid = -1; - List *params = NIL; - - Assert(bms_params); - - while ((paramid = bms_next_member(bms_params, paramid)) >= 0) - { - char param[32]; - - snprintf(param, sizeof(param), "$%d", paramid); - params = lappend(params, pstrdup(param)); - } - - if (params) - ExplainPropertyList("Params Evaluated", params, es); -} - /* * Fetch the name of an index in an EXPLAIN * @@ -3537,10 +3695,52 @@ explain_get_index_name(Oid indexId) } /* - * Show buffer usage details. + * Return whether show_buffer_usage would have anything to print, if given + * the same 'usage' data. Note that when the format is anything other than + * text, we print even if the counters are all zeroes. + */ +static bool +peek_buffer_usage(ExplainState *es, const BufferUsage *usage) +{ + bool has_shared; + bool has_local; + bool has_temp; + bool has_shared_timing; + bool has_local_timing; + bool has_temp_timing; + + if (usage == NULL) + return false; + + if (es->format != EXPLAIN_FORMAT_TEXT) + return true; + + has_shared = (usage->shared_blks_hit > 0 || + usage->shared_blks_read > 0 || + usage->shared_blks_dirtied > 0 || + usage->shared_blks_written > 0); + has_local = (usage->local_blks_hit > 0 || + usage->local_blks_read > 0 || + usage->local_blks_dirtied > 0 || + usage->local_blks_written > 0); + has_temp = (usage->temp_blks_read > 0 || + usage->temp_blks_written > 0); + has_shared_timing = (!INSTR_TIME_IS_ZERO(usage->shared_blk_read_time) || + !INSTR_TIME_IS_ZERO(usage->shared_blk_write_time)); + has_local_timing = (!INSTR_TIME_IS_ZERO(usage->local_blk_read_time) || + !INSTR_TIME_IS_ZERO(usage->local_blk_write_time)); + has_temp_timing = (!INSTR_TIME_IS_ZERO(usage->temp_blk_read_time) || + !INSTR_TIME_IS_ZERO(usage->temp_blk_write_time)); + + return has_shared || has_local || has_temp || has_shared_timing || + has_local_timing || has_temp_timing; +} + +/* + * Show buffer usage details. This better be sync with peek_buffer_usage. */ static void -show_buffer_usage(ExplainState *es, const BufferUsage *usage, bool planning) +show_buffer_usage(ExplainState *es, const BufferUsage *usage) { if (es->format == EXPLAIN_FORMAT_TEXT) { @@ -3554,20 +3754,12 @@ show_buffer_usage(ExplainState *es, const BufferUsage *usage, bool planning) usage->local_blks_written > 0); bool has_temp = (usage->temp_blks_read > 0 || usage->temp_blks_written > 0); - bool has_timing = (!INSTR_TIME_IS_ZERO(usage->blk_read_time) || - !INSTR_TIME_IS_ZERO(usage->blk_write_time)); + bool has_shared_timing = (!INSTR_TIME_IS_ZERO(usage->shared_blk_read_time) || + !INSTR_TIME_IS_ZERO(usage->shared_blk_write_time)); + bool has_local_timing = (!INSTR_TIME_IS_ZERO(usage->local_blk_read_time) || + !INSTR_TIME_IS_ZERO(usage->local_blk_write_time)); bool has_temp_timing = (!INSTR_TIME_IS_ZERO(usage->temp_blk_read_time) || !INSTR_TIME_IS_ZERO(usage->temp_blk_write_time)); - bool show_planning = (planning && (has_shared || - has_local || has_temp || has_timing || - has_temp_timing)); - - if (show_planning) - { - ExplainIndentText(es); - appendStringInfoString(es->str, "Planning:\n"); - es->indent++; - } /* Show only positive counter values. */ if (has_shared || has_local || has_temp) @@ -3625,20 +3817,32 @@ show_buffer_usage(ExplainState *es, const BufferUsage *usage, bool planning) } /* As above, show only positive counter values. */ - if (has_timing || has_temp_timing) + if (has_shared_timing || has_local_timing || has_temp_timing) { ExplainIndentText(es); appendStringInfoString(es->str, "I/O Timings:"); - if (has_timing) + if (has_shared_timing) + { + appendStringInfoString(es->str, " shared"); + if (!INSTR_TIME_IS_ZERO(usage->shared_blk_read_time)) + appendStringInfo(es->str, " read=%0.3f", + INSTR_TIME_GET_MILLISEC(usage->shared_blk_read_time)); + if (!INSTR_TIME_IS_ZERO(usage->shared_blk_write_time)) + appendStringInfo(es->str, " write=%0.3f", + INSTR_TIME_GET_MILLISEC(usage->shared_blk_write_time)); + if (has_local_timing || has_temp_timing) + appendStringInfoChar(es->str, ','); + } + if (has_local_timing) { - appendStringInfoString(es->str, " shared/local"); - if (!INSTR_TIME_IS_ZERO(usage->blk_read_time)) + appendStringInfoString(es->str, " local"); + if (!INSTR_TIME_IS_ZERO(usage->local_blk_read_time)) appendStringInfo(es->str, " read=%0.3f", - INSTR_TIME_GET_MILLISEC(usage->blk_read_time)); - if (!INSTR_TIME_IS_ZERO(usage->blk_write_time)) + INSTR_TIME_GET_MILLISEC(usage->local_blk_read_time)); + if (!INSTR_TIME_IS_ZERO(usage->local_blk_write_time)) appendStringInfo(es->str, " write=%0.3f", - INSTR_TIME_GET_MILLISEC(usage->blk_write_time)); + INSTR_TIME_GET_MILLISEC(usage->local_blk_write_time)); if (has_temp_timing) appendStringInfoChar(es->str, ','); } @@ -3654,9 +3858,6 @@ show_buffer_usage(ExplainState *es, const BufferUsage *usage, bool planning) } appendStringInfoChar(es->str, '\n'); } - - if (show_planning) - es->indent--; } else { @@ -3682,11 +3883,17 @@ show_buffer_usage(ExplainState *es, const BufferUsage *usage, bool planning) usage->temp_blks_written, es); if (track_io_timing) { - ExplainPropertyFloat("I/O Read Time", "ms", - INSTR_TIME_GET_MILLISEC(usage->blk_read_time), + ExplainPropertyFloat("Shared I/O Read Time", "ms", + INSTR_TIME_GET_MILLISEC(usage->shared_blk_read_time), + 3, es); + ExplainPropertyFloat("Shared I/O Write Time", "ms", + INSTR_TIME_GET_MILLISEC(usage->shared_blk_write_time), 3, es); - ExplainPropertyFloat("I/O Write Time", "ms", - INSTR_TIME_GET_MILLISEC(usage->blk_write_time), + ExplainPropertyFloat("Local I/O Read Time", "ms", + INSTR_TIME_GET_MILLISEC(usage->local_blk_read_time), + 3, es); + ExplainPropertyFloat("Local I/O Write Time", "ms", + INSTR_TIME_GET_MILLISEC(usage->local_blk_write_time), 3, es); ExplainPropertyFloat("Temp I/O Read Time", "ms", INSTR_TIME_GET_MILLISEC(usage->temp_blk_read_time), @@ -3736,6 +3943,32 @@ show_wal_usage(ExplainState *es, const WalUsage *usage) } } +/* + * Show memory usage details. + */ +static void +show_memory_counters(ExplainState *es, const MemoryContextCounters *mem_counters) +{ + int64 memUsedkB = BYTES_TO_KILOBYTES(mem_counters->totalspace - + mem_counters->freespace); + int64 memAllocatedkB = BYTES_TO_KILOBYTES(mem_counters->totalspace); + + if (es->format == EXPLAIN_FORMAT_TEXT) + { + ExplainIndentText(es); + appendStringInfo(es->str, + "Memory: used=" INT64_FORMAT "kB allocated=" INT64_FORMAT "kB", + memUsedkB, memAllocatedkB); + appendStringInfoChar(es->str, '\n'); + } + else + { + ExplainPropertyInteger("Memory Used", "kB", memUsedkB, es); + ExplainPropertyInteger("Memory Allocated", "kB", memAllocatedkB, es); + } +} + + /* * Add some additional details about an IndexScan or IndexOnlyScan */ @@ -3861,9 +4094,24 @@ ExplainTargetRel(Plan *plan, Index rti, ExplainState *es) } break; case T_TableFuncScan: - Assert(rte->rtekind == RTE_TABLEFUNC); - objectname = "xmltable"; - objecttag = "Table Function Name"; + { + TableFunc *tablefunc = ((TableFuncScan *) plan)->tablefunc; + + Assert(rte->rtekind == RTE_TABLEFUNC); + switch (tablefunc->functype) + { + case TFT_XMLTABLE: + objectname = "xmltable"; + break; + case TFT_JSON_TABLE: + objectname = "json_table"; + break; + default: + elog(ERROR, "invalid TableFunc type %d", + (int) tablefunc->functype); + } + objecttag = "Table Function Name"; + } break; case T_ValuesScan: Assert(rte->rtekind == RTE_VALUES); @@ -5052,3 +5300,293 @@ escape_yaml(StringInfo buf, const char *str) { escape_json(buf, str); } + + +/* + * DestReceiver functions for SERIALIZE option + * + * A DestReceiver for query tuples, that serializes passed rows into RowData + * messages while measuring the resources expended and total serialized size, + * while never sending the data to the client. This allows measuring the + * overhead of deTOASTing and datatype out/sendfuncs, which are not otherwise + * exercisable without actually hitting the network. + */ +typedef struct SerializeDestReceiver +{ + DestReceiver pub; + ExplainState *es; /* this EXPLAIN statement's ExplainState */ + int8 format; /* text or binary, like pq wire protocol */ + TupleDesc attrinfo; /* the output tuple desc */ + int nattrs; /* current number of columns */ + FmgrInfo *finfos; /* precomputed call info for output fns */ + MemoryContext tmpcontext; /* per-row temporary memory context */ + StringInfoData buf; /* buffer to hold the constructed message */ + SerializeMetrics metrics; /* collected metrics */ +} SerializeDestReceiver; + +/* + * Get the function lookup info that we'll need for output. + * + * This is a subset of what printtup_prepare_info() does. We don't need to + * cope with format choices varying across columns, so it's slightly simpler. + */ +static void +serialize_prepare_info(SerializeDestReceiver *receiver, + TupleDesc typeinfo, int nattrs) +{ + /* get rid of any old data */ + if (receiver->finfos) + pfree(receiver->finfos); + receiver->finfos = NULL; + + receiver->attrinfo = typeinfo; + receiver->nattrs = nattrs; + if (nattrs <= 0) + return; + + receiver->finfos = (FmgrInfo *) palloc0(nattrs * sizeof(FmgrInfo)); + + for (int i = 0; i < nattrs; i++) + { + FmgrInfo *finfo = receiver->finfos + i; + Form_pg_attribute attr = TupleDescAttr(typeinfo, i); + Oid typoutput; + Oid typsend; + bool typisvarlena; + + if (receiver->format == 0) + { + /* wire protocol format text */ + getTypeOutputInfo(attr->atttypid, + &typoutput, + &typisvarlena); + fmgr_info(typoutput, finfo); + } + else if (receiver->format == 1) + { + /* wire protocol format binary */ + getTypeBinaryOutputInfo(attr->atttypid, + &typsend, + &typisvarlena); + fmgr_info(typsend, finfo); + } + else + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unsupported format code: %d", receiver->format))); + } +} + +/* + * serializeAnalyzeReceive - collect tuples for EXPLAIN (SERIALIZE) + * + * This should match printtup() in printtup.c as closely as possible, + * except for the addition of measurement code. + */ +static bool +serializeAnalyzeReceive(TupleTableSlot *slot, DestReceiver *self) +{ + TupleDesc typeinfo = slot->tts_tupleDescriptor; + SerializeDestReceiver *myState = (SerializeDestReceiver *) self; + MemoryContext oldcontext; + StringInfo buf = &myState->buf; + int natts = typeinfo->natts; + instr_time start, + end; + BufferUsage instr_start; + + /* only measure time, buffers if requested */ + if (myState->es->timing) + INSTR_TIME_SET_CURRENT(start); + if (myState->es->buffers) + instr_start = pgBufferUsage; + + /* Set or update my derived attribute info, if needed */ + if (myState->attrinfo != typeinfo || myState->nattrs != natts) + serialize_prepare_info(myState, typeinfo, natts); + + /* Make sure the tuple is fully deconstructed */ + slot_getallattrs(slot); + + /* Switch into per-row context so we can recover memory below */ + oldcontext = MemoryContextSwitchTo(myState->tmpcontext); + + /* + * Prepare a DataRow message (note buffer is in per-query context) + * + * Note that we fill a StringInfo buffer the same as printtup() does, so + * as to capture the costs of manipulating the strings accurately. + */ + pq_beginmessage_reuse(buf, PqMsg_DataRow); + + pq_sendint16(buf, natts); + + /* + * send the attributes of this tuple + */ + for (int i = 0; i < natts; i++) + { + FmgrInfo *finfo = myState->finfos + i; + Datum attr = slot->tts_values[i]; + + if (slot->tts_isnull[i]) + { + pq_sendint32(buf, -1); + continue; + } + + if (myState->format == 0) + { + /* Text output */ + char *outputstr; + + outputstr = OutputFunctionCall(finfo, attr); + pq_sendcountedtext(buf, outputstr, strlen(outputstr)); + } + else + { + /* Binary output */ + bytea *outputbytes; + + outputbytes = SendFunctionCall(finfo, attr); + pq_sendint32(buf, VARSIZE(outputbytes) - VARHDRSZ); + pq_sendbytes(buf, VARDATA(outputbytes), + VARSIZE(outputbytes) - VARHDRSZ); + } + } + + /* + * We mustn't call pq_endmessage_reuse(), since that would actually send + * the data to the client. Just count the data, instead. We can leave + * the buffer alone; it'll be reset on the next iteration (as would also + * happen in printtup()). + */ + myState->metrics.bytesSent += buf->len; + + /* Return to caller's context, and flush row's temporary memory */ + MemoryContextSwitchTo(oldcontext); + MemoryContextReset(myState->tmpcontext); + + /* Update timing data */ + if (myState->es->timing) + { + INSTR_TIME_SET_CURRENT(end); + INSTR_TIME_ACCUM_DIFF(myState->metrics.timeSpent, end, start); + } + + /* Update buffer metrics */ + if (myState->es->buffers) + BufferUsageAccumDiff(&myState->metrics.bufferUsage, + &pgBufferUsage, + &instr_start); + + return true; +} + +/* + * serializeAnalyzeStartup - start up the serializeAnalyze receiver + */ +static void +serializeAnalyzeStartup(DestReceiver *self, int operation, TupleDesc typeinfo) +{ + SerializeDestReceiver *receiver = (SerializeDestReceiver *) self; + + Assert(receiver->es != NULL); + + switch (receiver->es->serialize) + { + case EXPLAIN_SERIALIZE_NONE: + Assert(false); + break; + case EXPLAIN_SERIALIZE_TEXT: + receiver->format = 0; /* wire protocol format text */ + break; + case EXPLAIN_SERIALIZE_BINARY: + receiver->format = 1; /* wire protocol format binary */ + break; + } + + /* Create per-row temporary memory context */ + receiver->tmpcontext = AllocSetContextCreate(CurrentMemoryContext, + "SerializeTupleReceive", + ALLOCSET_DEFAULT_SIZES); + + /* The output buffer is re-used across rows, as in printtup.c */ + initStringInfo(&receiver->buf); + + /* Initialize results counters */ + memset(&receiver->metrics, 0, sizeof(SerializeMetrics)); + INSTR_TIME_SET_ZERO(receiver->metrics.timeSpent); +} + +/* + * serializeAnalyzeShutdown - shut down the serializeAnalyze receiver + */ +static void +serializeAnalyzeShutdown(DestReceiver *self) +{ + SerializeDestReceiver *receiver = (SerializeDestReceiver *) self; + + if (receiver->finfos) + pfree(receiver->finfos); + receiver->finfos = NULL; + + if (receiver->buf.data) + pfree(receiver->buf.data); + receiver->buf.data = NULL; + + if (receiver->tmpcontext) + MemoryContextDelete(receiver->tmpcontext); + receiver->tmpcontext = NULL; +} + +/* + * serializeAnalyzeDestroy - destroy the serializeAnalyze receiver + */ +static void +serializeAnalyzeDestroy(DestReceiver *self) +{ + pfree(self); +} + +/* + * Build a DestReceiver for EXPLAIN (SERIALIZE) instrumentation. + */ +DestReceiver * +CreateExplainSerializeDestReceiver(ExplainState *es) +{ + SerializeDestReceiver *self; + + self = (SerializeDestReceiver *) palloc0(sizeof(SerializeDestReceiver)); + + self->pub.receiveSlot = serializeAnalyzeReceive; + self->pub.rStartup = serializeAnalyzeStartup; + self->pub.rShutdown = serializeAnalyzeShutdown; + self->pub.rDestroy = serializeAnalyzeDestroy; + self->pub.mydest = DestExplainSerialize; + + self->es = es; + + return (DestReceiver *) self; +} + +/* + * GetSerializationMetrics - collect metrics + * + * We have to be careful here since the receiver could be an IntoRel + * receiver if the subject statement is CREATE TABLE AS. In that + * case, return all-zeroes stats. + */ +static SerializeMetrics +GetSerializationMetrics(DestReceiver *dest) +{ + SerializeMetrics empty; + + if (dest->mydest == DestExplainSerialize) + return ((SerializeDestReceiver *) dest)->metrics; + + memset(&empty, 0, sizeof(SerializeMetrics)); + INSTR_TIME_SET_ZERO(empty.timeSpent); + + return empty; +} diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c index 0eabe18335ec7..1643c8c69a0d8 100644 --- a/src/backend/commands/extension.c +++ b/src/backend/commands/extension.c @@ -12,7 +12,7 @@ * postgresql.conf. An extension also has an installation script file, * containing SQL commands to create the extension's objects. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -32,7 +32,6 @@ #include "access/genam.h" #include "access/htup_details.h" #include "access/relation.h" -#include "access/sysattr.h" #include "access/table.h" #include "access/xact.h" #include "catalog/catalog.h" @@ -55,7 +54,6 @@ #include "funcapi.h" #include "mb/pg_wchar.h" #include "miscadmin.h" -#include "nodes/makefuncs.h" #include "storage/fd.h" #include "tcop/utility.h" #include "utils/acl.h" @@ -131,6 +129,9 @@ static void ApplyExtensionUpdates(Oid extensionOid, char *origSchemaName, bool cascade, bool is_create); +static void ExecAlterExtensionContentsRecurse(AlterExtensionContentsStmt *stmt, + ObjectAddress extension, + ObjectAddress object); static char *read_whole_file(const char *filename, int *length); @@ -967,11 +968,6 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control, * searched anyway. (Listing pg_catalog explicitly in a non-first * position would be bad for security.) Finally add pg_temp to ensure * that temp objects can't take precedence over others. - * - * Note: it might look tempting to use PushOverrideSearchPath for this, - * but we cannot do that. We have to actually set the search_path GUC in - * case the extension script examines or changes it. In any case, the - * GUC_ACTION_SAVE method is just as convenient. */ initStringInfo(&pathbuf); appendStringInfoString(&pathbuf, quote_identifier(schemaName)); @@ -1001,6 +997,16 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control, char *c_sql = read_extension_script_file(control, filename); Datum t_sql; + /* + * We filter each substitution through quote_identifier(). When the + * arg contains one of the following characters, no one collection of + * quoting can work inside $$dollar-quoted string literals$$, + * 'single-quoted string literals', and outside of any literal. To + * avoid a security snare for extension authors, error on substitution + * for arguments containing these. + */ + const char *quoting_relevant_chars = "\"$'\\"; + /* We use various functions that want to operate on text datums */ t_sql = CStringGetTextDatum(c_sql); @@ -1030,6 +1036,11 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control, t_sql, CStringGetTextDatum("@extowner@"), CStringGetTextDatum(qUserName)); + if (strpbrk(userName, quoting_relevant_chars)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("invalid character in extension owner: must not contain any of \"%s\"", + quoting_relevant_chars))); } /* @@ -1041,6 +1052,7 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control, */ if (!control->relocatable) { + Datum old = t_sql; const char *qSchemaName = quote_identifier(schemaName); t_sql = DirectFunctionCall3Coll(replace_text, @@ -1048,6 +1060,11 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control, t_sql, CStringGetTextDatum("@extschema@"), CStringGetTextDatum(qSchemaName)); + if (t_sql != old && strpbrk(schemaName, quoting_relevant_chars)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("invalid character in extension \"%s\" schema: must not contain any of \"%s\"", + control->name, quoting_relevant_chars))); } /* @@ -1057,6 +1074,7 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control, Assert(list_length(control->requires) == list_length(requiredSchemas)); forboth(lc, control->requires, lc2, requiredSchemas) { + Datum old = t_sql; char *reqextname = (char *) lfirst(lc); Oid reqschema = lfirst_oid(lc2); char *schemaName = get_namespace_name(reqschema); @@ -1069,6 +1087,11 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control, t_sql, CStringGetTextDatum(repltoken), CStringGetTextDatum(qSchemaName)); + if (t_sql != old && strpbrk(schemaName, quoting_relevant_chars)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("invalid character in extension \"%s\" schema: must not contain any of \"%s\"", + reqextname, quoting_relevant_chars))); } /* @@ -2750,7 +2773,7 @@ AlterExtensionNamespace(const char *extensionName, const char *newschema, Oid *o { Oid extensionOid; Oid nspOid; - Oid oldNspOid = InvalidOid; + Oid oldNspOid; AclResult aclresult; Relation extRel; ScanKeyData key[2]; @@ -2833,6 +2856,9 @@ AlterExtensionNamespace(const char *extensionName, const char *newschema, Oid *o objsMoved = new_object_addresses(); + /* store the OID of the namespace to-be-changed */ + oldNspOid = extForm->extnamespace; + /* * Scan pg_depend to find objects that depend directly on the extension, * and alter each one's schema. @@ -2912,15 +2938,9 @@ AlterExtensionNamespace(const char *extensionName, const char *newschema, Oid *o nspOid, objsMoved); - /* - * Remember previous namespace of first object that has one - */ - if (oldNspOid == InvalidOid && dep_oldNspOid != InvalidOid) - oldNspOid = dep_oldNspOid; - /* * If not all the objects had the same old namespace (ignoring any - * that are not in namespaces), complain. + * that are not in namespaces or are dependent types), complain. */ if (dep_oldNspOid != InvalidOid && dep_oldNspOid != oldNspOid) ereport(ERROR, @@ -2947,9 +2967,11 @@ AlterExtensionNamespace(const char *extensionName, const char *newschema, Oid *o table_close(extRel, RowExclusiveLock); - /* update dependencies to point to the new schema */ - changeDependencyFor(ExtensionRelationId, extensionOid, - NamespaceRelationId, oldNspOid, nspOid); + /* update dependency to point to the new schema */ + if (changeDependencyFor(ExtensionRelationId, extensionOid, + NamespaceRelationId, oldNspOid, nspOid) != 1) + elog(ERROR, "could not change schema dependency for extension %s", + NameStr(extForm->extname)); InvokeObjectPostAlterHook(ExtensionRelationId, extensionOid, 0); @@ -3273,7 +3295,6 @@ ExecAlterExtensionContentsStmt(AlterExtensionContentsStmt *stmt, ObjectAddress extension; ObjectAddress object; Relation relation; - Oid oldExtension; switch (stmt->objtype) { @@ -3328,6 +3349,38 @@ ExecAlterExtensionContentsStmt(AlterExtensionContentsStmt *stmt, check_object_ownership(GetUserId(), stmt->objtype, object, stmt->object, relation); + /* Do the update, recursing to any dependent objects */ + ExecAlterExtensionContentsRecurse(stmt, extension, object); + + /* Finish up */ + InvokeObjectPostAlterHook(ExtensionRelationId, extension.objectId, 0); + + /* + * If get_object_address() opened the relation for us, we close it to keep + * the reference count correct - but we retain any locks acquired by + * get_object_address() until commit time, to guard against concurrent + * activity. + */ + if (relation != NULL) + relation_close(relation, NoLock); + + return extension; +} + +/* + * ExecAlterExtensionContentsRecurse + * Subroutine for ExecAlterExtensionContentsStmt + * + * Do the bare alteration of object's membership in extension, + * without permission checks. Recurse to dependent objects, if any. + */ +static void +ExecAlterExtensionContentsRecurse(AlterExtensionContentsStmt *stmt, + ObjectAddress extension, + ObjectAddress object) +{ + Oid oldExtension; + /* * Check existing extension membership. */ @@ -3411,18 +3464,47 @@ ExecAlterExtensionContentsStmt(AlterExtensionContentsStmt *stmt, removeExtObjInitPriv(object.objectId, object.classId); } - InvokeObjectPostAlterHook(ExtensionRelationId, extension.objectId, 0); - /* - * If get_object_address() opened the relation for us, we close it to keep - * the reference count correct - but we retain any locks acquired by - * get_object_address() until commit time, to guard against concurrent - * activity. + * Recurse to any dependent objects; currently, this includes the array + * type of a base type, the multirange type associated with a range type, + * and the rowtype of a table. */ - if (relation != NULL) - relation_close(relation, NoLock); + if (object.classId == TypeRelationId) + { + ObjectAddress depobject; - return extension; + depobject.classId = TypeRelationId; + depobject.objectSubId = 0; + + /* If it has an array type, update that too */ + depobject.objectId = get_array_type(object.objectId); + if (OidIsValid(depobject.objectId)) + ExecAlterExtensionContentsRecurse(stmt, extension, depobject); + + /* If it is a range type, update the associated multirange too */ + if (type_is_range(object.objectId)) + { + depobject.objectId = get_range_multirange(object.objectId); + if (!OidIsValid(depobject.objectId)) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("could not find multirange type for data type %s", + format_type_be(object.objectId)))); + ExecAlterExtensionContentsRecurse(stmt, extension, depobject); + } + } + if (object.classId == RelationRelationId) + { + ObjectAddress depobject; + + depobject.classId = TypeRelationId; + depobject.objectSubId = 0; + + /* It might not have a rowtype, but if it does, update that */ + depobject.objectId = get_rel_type_id(object.objectId); + if (OidIsValid(depobject.objectId)) + ExecAlterExtensionContentsRecurse(stmt, extension, depobject); + } } /* diff --git a/src/backend/commands/foreigncmds.c b/src/backend/commands/foreigncmds.c index 0ecff545a9e42..cf61bbac1fa10 100644 --- a/src/backend/commands/foreigncmds.c +++ b/src/backend/commands/foreigncmds.c @@ -3,7 +3,7 @@ * foreigncmds.c * foreign-data wrapper/server creation/manipulation commands * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index 49c7864c7cfaa..d43b89d3efa00 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -5,7 +5,7 @@ * Routines for CREATE and DROP FUNCTION commands and CREATE and DROP * CAST commands. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -32,9 +32,7 @@ */ #include "postgres.h" -#include "access/genam.h" #include "access/htup_details.h" -#include "access/sysattr.h" #include "access/table.h" #include "catalog/catalog.h" #include "catalog/dependency.h" @@ -47,15 +45,14 @@ #include "catalog/pg_proc.h" #include "catalog/pg_transform.h" #include "catalog/pg_type.h" -#include "commands/alter.h" #include "commands/defrem.h" #include "commands/extension.h" #include "commands/proclang.h" -#include "executor/execdesc.h" #include "executor/executor.h" #include "executor/functions.h" #include "funcapi.h" #include "miscadmin.h" +#include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" #include "parser/analyze.h" #include "parser/parse_coerce.h" @@ -68,10 +65,8 @@ #include "tcop/utility.h" #include "utils/acl.h" #include "utils/builtins.h" -#include "utils/fmgroids.h" #include "utils/guc.h" #include "utils/lsyscache.h" -#include "utils/memutils.h" #include "utils/rel.h" #include "utils/snapmgr.h" #include "utils/syscache.h" @@ -1450,9 +1445,13 @@ AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt) /* Add or replace dependency on support function */ if (OidIsValid(procForm->prosupport)) - changeDependencyFor(ProcedureRelationId, funcOid, - ProcedureRelationId, procForm->prosupport, - newsupport); + { + if (changeDependencyFor(ProcedureRelationId, funcOid, + ProcedureRelationId, procForm->prosupport, + newsupport) != 1) + elog(ERROR, "could not change support dependency for function %s", + get_func_name(funcOid)); + } else { ObjectAddress referenced; @@ -1690,13 +1689,18 @@ CreateCast(CreateCastStmt *stmt) errmsg("source and target data types are not physically compatible"))); /* - * We know that composite, enum and array types are never binary- - * compatible with each other. They all have OIDs embedded in them. + * We know that composite, array, range and enum types are never + * binary-compatible with each other. They all have OIDs embedded in + * them. * * Theoretically you could build a user-defined base type that is - * binary-compatible with a composite, enum, or array type. But we - * disallow that too, as in practice such a cast is surely a mistake. - * You can always work around that by writing a cast function. + * binary-compatible with such a type. But we disallow it anyway, as + * in practice such a cast is surely a mistake. You can always work + * around that by writing a cast function. + * + * NOTE: if we ever have a kind of container type that doesn't need to + * be rejected for this reason, we'd likely need to recursively apply + * all of these same checks to the contained type(s). */ if (sourcetyptype == TYPTYPE_COMPOSITE || targettyptype == TYPTYPE_COMPOSITE) @@ -1704,18 +1708,26 @@ CreateCast(CreateCastStmt *stmt) (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("composite data types are not binary-compatible"))); - if (sourcetyptype == TYPTYPE_ENUM || - targettyptype == TYPTYPE_ENUM) - ereport(ERROR, - (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("enum data types are not binary-compatible"))); - if (OidIsValid(get_element_type(sourcetypeid)) || OidIsValid(get_element_type(targettypeid))) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("array data types are not binary-compatible"))); + if (sourcetyptype == TYPTYPE_RANGE || + targettyptype == TYPTYPE_RANGE || + sourcetyptype == TYPTYPE_MULTIRANGE || + targettyptype == TYPTYPE_MULTIRANGE) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("range data types are not binary-compatible"))); + + if (sourcetyptype == TYPTYPE_ENUM || + targettyptype == TYPTYPE_ENUM) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("enum data types are not binary-compatible"))); + /* * We also disallow creating binary-compatibility casts involving * domains. Casting from a domain to its base type is already @@ -2366,5 +2378,32 @@ CallStmtResultDesc(CallStmt *stmt) ReleaseSysCache(tuple); + /* + * The result of build_function_result_tupdesc_t has the right column + * names, but it just has the declared output argument types, which is the + * wrong thing in polymorphic cases. Get the correct types by examining + * stmt->outargs. We intentionally keep the atttypmod as -1 and the + * attcollation as the type's default, since that's always the appropriate + * thing for function outputs; there's no point in considering any + * additional info available from outargs. Note that tupdesc is null if + * there are no outargs. + */ + if (tupdesc) + { + Assert(tupdesc->natts == list_length(stmt->outargs)); + for (int i = 0; i < tupdesc->natts; i++) + { + Form_pg_attribute att = TupleDescAttr(tupdesc, i); + Node *outarg = (Node *) list_nth(stmt->outargs, i); + + TupleDescInitEntry(tupdesc, + i + 1, + NameStr(att->attname), + exprType(outarg), + -1, + 0); + } + } + return tupdesc; } diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 9bc97e1fc2113..f7fe1fae91c19 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -3,7 +3,7 @@ * indexcmds.c * POSTGRES define and remove index code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,8 +25,10 @@ #include "catalog/catalog.h" #include "catalog/index.h" #include "catalog/indexing.h" +#include "catalog/namespace.h" #include "catalog/pg_am.h" #include "catalog/pg_authid.h" +#include "catalog/pg_collation.h" #include "catalog/pg_constraint.h" #include "catalog/pg_database.h" #include "catalog/pg_inherits.h" @@ -48,8 +50,8 @@ #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" #include "parser/parse_coerce.h" -#include "parser/parse_func.h" #include "parser/parse_oper.h" +#include "parser/parse_utilcmd.h" #include "partitioning/partdesc.h" #include "pgstat.h" #include "rewrite/rewriteManip.h" @@ -61,6 +63,7 @@ #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/guc.h" +#include "utils/injection_point.h" #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/memutils.h" @@ -72,42 +75,45 @@ /* non-export function prototypes */ -static bool CompareOpclassOptions(Datum *opts1, Datum *opts2, int natts); +static bool CompareOpclassOptions(const Datum *opts1, const Datum *opts2, int natts); static void CheckPredicate(Expr *predicate); static void ComputeIndexAttrs(IndexInfo *indexInfo, - Oid *typeOidP, - Oid *collationOidP, - Oid *classOidP, - int16 *colOptionP, - List *attList, - List *exclusionOpNames, + Oid *typeOids, + Oid *collationOids, + Oid *opclassOids, + Datum *opclassOptions, + int16 *colOptions, + const List *attList, + const List *exclusionOpNames, Oid relId, - const char *accessMethodName, Oid accessMethodId, + const char *accessMethodName, + Oid accessMethodId, bool amcanorder, bool isconstraint, Oid ddl_userid, int ddl_sec_context, int *ddl_save_nestlevel); static char *ChooseIndexName(const char *tabname, Oid namespaceId, - List *colnames, List *exclusionOpNames, + const List *colnames, const List *exclusionOpNames, bool primary, bool isconstraint); -static char *ChooseIndexNameAddition(List *colnames); -static List *ChooseIndexColumnNames(List *indexElems); -static void ReindexIndex(RangeVar *indexRelation, ReindexParams *params, +static char *ChooseIndexNameAddition(const List *colnames); +static List *ChooseIndexColumnNames(const List *indexElems); +static void ReindexIndex(const ReindexStmt *stmt, const ReindexParams *params, bool isTopLevel); static void RangeVarCallbackForReindexIndex(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg); -static Oid ReindexTable(RangeVar *relation, ReindexParams *params, +static Oid ReindexTable(const ReindexStmt *stmt, const ReindexParams *params, bool isTopLevel); -static void ReindexMultipleTables(const char *objectName, - ReindexObjectType objectKind, ReindexParams *params); +static void ReindexMultipleTables(const ReindexStmt *stmt, + const ReindexParams *params); static void reindex_error_callback(void *arg); -static void ReindexPartitions(Oid relid, ReindexParams *params, - bool isTopLevel); -static void ReindexMultipleInternal(List *relids, - ReindexParams *params); -static bool ReindexRelationConcurrently(Oid relationOid, - ReindexParams *params); +static void ReindexPartitions(const ReindexStmt *stmt, Oid relid, + const ReindexParams *params, bool isTopLevel); +static void ReindexMultipleInternal(const ReindexStmt *stmt, const List *relids, + const ReindexParams *params); +static bool ReindexRelationConcurrently(const ReindexStmt *stmt, + Oid relationOid, + const ReindexParams *params); static void update_relispartition(Oid relationId, bool newval); static inline void set_indexsafe_procflags(void); @@ -170,13 +176,14 @@ typedef struct ReindexErrorInfo bool CheckIndexCompatible(Oid oldId, const char *accessMethodName, - List *attributeList, - List *exclusionOpNames) + const List *attributeList, + const List *exclusionOpNames) { bool isconstraint; - Oid *typeObjectId; - Oid *collationObjectId; - Oid *classObjectId; + Oid *typeIds; + Oid *collationIds; + Oid *opclassIds; + Datum *opclassOptions; Oid accessMethodId; Oid relationId; HeapTuple tuple; @@ -235,12 +242,13 @@ CheckIndexCompatible(Oid oldId, indexInfo = makeIndexInfo(numberOfAttributes, numberOfAttributes, accessMethodId, NIL, NIL, false, false, false, false, amsummarizing); - typeObjectId = palloc_array(Oid, numberOfAttributes); - collationObjectId = palloc_array(Oid, numberOfAttributes); - classObjectId = palloc_array(Oid, numberOfAttributes); + typeIds = palloc_array(Oid, numberOfAttributes); + collationIds = palloc_array(Oid, numberOfAttributes); + opclassIds = palloc_array(Oid, numberOfAttributes); + opclassOptions = palloc_array(Datum, numberOfAttributes); coloptions = palloc_array(int16, numberOfAttributes); ComputeIndexAttrs(indexInfo, - typeObjectId, collationObjectId, classObjectId, + typeIds, collationIds, opclassIds, opclassOptions, coloptions, attributeList, exclusionOpNames, relationId, accessMethodName, accessMethodId, @@ -275,10 +283,8 @@ CheckIndexCompatible(Oid oldId, d = SysCacheGetAttrNotNull(INDEXRELID, tuple, Anum_pg_index_indclass); old_indclass = (oidvector *) DatumGetPointer(d); - ret = (memcmp(old_indclass->values, classObjectId, - old_natts * sizeof(Oid)) == 0 && - memcmp(old_indcollation->values, collationObjectId, - old_natts * sizeof(Oid)) == 0); + ret = (memcmp(old_indclass->values, opclassIds, old_natts * sizeof(Oid)) == 0 && + memcmp(old_indcollation->values, collationIds, old_natts * sizeof(Oid)) == 0); ReleaseSysCache(tuple); @@ -289,8 +295,8 @@ CheckIndexCompatible(Oid oldId, irel = index_open(oldId, AccessShareLock); /* caller probably has a lock */ for (i = 0; i < old_natts; i++) { - if (IsPolymorphicType(get_opclass_input_type(classObjectId[i])) && - TupleDescAttr(irel->rd_att, i)->atttypid != typeObjectId[i]) + if (IsPolymorphicType(get_opclass_input_type(opclassIds[i])) && + TupleDescAttr(irel->rd_att, i)->atttypid != typeIds[i]) { ret = false; break; @@ -300,13 +306,14 @@ CheckIndexCompatible(Oid oldId, /* Any change in opclass options break compatibility. */ if (ret) { - Datum *opclassOptions = RelationGetIndexRawAttOptions(irel); + Datum *oldOpclassOptions = palloc_array(Datum, old_natts); - ret = CompareOpclassOptions(opclassOptions, - indexInfo->ii_OpclassOptions, old_natts); + for (i = 0; i < old_natts; i++) + oldOpclassOptions[i] = get_attoptions(oldId, i + 1); - if (opclassOptions) - pfree(opclassOptions); + ret = CompareOpclassOptions(oldOpclassOptions, opclassOptions, old_natts); + + pfree(oldOpclassOptions); } /* Any change in exclusion operator selections breaks compatibility. */ @@ -330,7 +337,7 @@ CheckIndexCompatible(Oid oldId, op_input_types(indexInfo->ii_ExclusionOps[i], &left, &right); if ((IsPolymorphicType(left) || IsPolymorphicType(right)) && - TupleDescAttr(irel->rd_att, i)->atttypid != typeObjectId[i]) + TupleDescAttr(irel->rd_att, i)->atttypid != typeIds[i]) { ret = false; break; @@ -350,13 +357,15 @@ CheckIndexCompatible(Oid oldId, * datums. Both elements of arrays and array themselves can be NULL. */ static bool -CompareOpclassOptions(Datum *opts1, Datum *opts2, int natts) +CompareOpclassOptions(const Datum *opts1, const Datum *opts2, int natts) { int i; + FmgrInfo fm; if (!opts1 && !opts2) return true; + fmgr_info(F_ARRAY_EQ, &fm); for (i = 0; i < natts; i++) { Datum opt1 = opts1 ? opts1[i] : (Datum) 0; @@ -372,8 +381,12 @@ CompareOpclassOptions(Datum *opts1, Datum *opts2, int natts) else if (opt2 == (Datum) 0) return false; - /* Compare non-NULL text[] datums. */ - if (!DatumGetBool(DirectFunctionCall2(array_eq, opt1, opt2))) + /* + * Compare non-NULL text[] datums. Use C collation to enforce binary + * equivalence of texts, because we don't know anything about the + * semantics of opclass options. + */ + if (!DatumGetBool(FunctionCall2Coll(&fm, C_COLLATION_OID, opt1, opt2))) return false; } @@ -469,7 +482,7 @@ WaitForOlderSnapshots(TransactionId limitXmin, bool progress) /* If requested, publish who we're going to wait for. */ if (progress) { - PGPROC *holder = BackendIdGetProc(old_snapshots[i].backendId); + PGPROC *holder = ProcNumberGetProc(old_snapshots[i].procNumber); if (holder) pgstat_progress_update_param(PROGRESS_WAITFOR_CURRENT_PID, @@ -501,7 +514,7 @@ WaitForOlderSnapshots(TransactionId limitXmin, bool progress) * consider offering one DDL command for catalog setup and a separate DDL * command for steps that run opaque expressions. * - * 'relationId': the OID of the heap relation on which the index is to be + * 'tableId': the OID of the table relation on which the index is to be * created * 'stmt': IndexStmt describing the properties of the new index. * 'indexRelationId': normally InvalidOid, but during bootstrap can be @@ -524,7 +537,7 @@ WaitForOlderSnapshots(TransactionId limitXmin, bool progress) * Returns the object address of the created index. */ ObjectAddress -DefineIndex(Oid relationId, +DefineIndex(Oid tableId, IndexStmt *stmt, Oid indexRelationId, Oid parentIndexId, @@ -539,9 +552,10 @@ DefineIndex(Oid relationId, bool concurrent; char *indexRelationName; char *accessMethodName; - Oid *typeObjectId; - Oid *collationObjectId; - Oid *classObjectId; + Oid *typeIds; + Oid *collationIds; + Oid *opclassIds; + Datum *opclassOptions; Oid accessMethodId; Oid namespaceId; Oid tablespaceId; @@ -576,6 +590,8 @@ DefineIndex(Oid relationId, root_save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); + /* * Some callers need us to run with an empty default_tablespace; this is a * necessary hack to be able to reproduce catalog state accurately when @@ -593,7 +609,7 @@ DefineIndex(Oid relationId, * is more efficient. Do this before any use of the concurrent option is * done. */ - if (stmt->concurrent && get_rel_persistence(relationId) != RELPERSISTENCE_TEMP) + if (stmt->concurrent && get_rel_persistence(tableId) != RELPERSISTENCE_TEMP) concurrent = true; else concurrent = false; @@ -604,8 +620,7 @@ DefineIndex(Oid relationId, */ if (!OidIsValid(parentIndexId)) { - pgstat_progress_start_command(PROGRESS_COMMAND_CREATE_INDEX, - relationId); + pgstat_progress_start_command(PROGRESS_COMMAND_CREATE_INDEX, tableId); pgstat_progress_update_param(PROGRESS_CREATEIDX_COMMAND, concurrent ? PROGRESS_CREATEIDX_COMMAND_CREATE_CONCURRENTLY : @@ -650,7 +665,7 @@ DefineIndex(Oid relationId, * index build; but for concurrent builds we allow INSERT/UPDATE/DELETE * (but not VACUUM). * - * NB: Caller is responsible for making sure that relationId refers to the + * NB: Caller is responsible for making sure that tableId refers to the * relation on which the index should be built; except in bootstrap mode, * this will typically require the caller to have already locked the * relation. To avoid lock upgrade hazards, that lock should be at least @@ -661,7 +676,7 @@ DefineIndex(Oid relationId, * functions will need to be updated, too. */ lockmode = concurrent ? ShareUpdateExclusiveLock : ShareLock; - rel = table_open(relationId, lockmode); + rel = table_open(tableId, lockmode); /* * Switch to the table owner's userid, so that any index functions are run @@ -713,11 +728,6 @@ DefineIndex(Oid relationId, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot create index on partitioned table \"%s\" concurrently", RelationGetRelationName(rel)))); - if (stmt->excludeOpNames) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot create exclusion constraints on partitioned table \"%s\"", - RelationGetRelationName(rel)))); } /* @@ -905,14 +915,15 @@ DefineIndex(Oid relationId, concurrent, amissummarizing); - typeObjectId = palloc_array(Oid, numberOfAttributes); - collationObjectId = palloc_array(Oid, numberOfAttributes); - classObjectId = palloc_array(Oid, numberOfAttributes); + typeIds = palloc_array(Oid, numberOfAttributes); + collationIds = palloc_array(Oid, numberOfAttributes); + opclassIds = palloc_array(Oid, numberOfAttributes); + opclassOptions = palloc_array(Datum, numberOfAttributes); coloptions = palloc_array(int16, numberOfAttributes); ComputeIndexAttrs(indexInfo, - typeObjectId, collationObjectId, classObjectId, + typeIds, collationIds, opclassIds, opclassOptions, coloptions, allIndexParams, - stmt->excludeOpNames, relationId, + stmt->excludeOpNames, tableId, accessMethodName, accessMethodId, amcanorder, stmt->isconstraint, root_save_userid, root_save_sec_context, &root_save_nestlevel); @@ -924,15 +935,16 @@ DefineIndex(Oid relationId, index_check_primary_key(rel, indexInfo, is_alter_table, stmt); /* - * If this table is partitioned and we're creating a unique index or a - * primary key, make sure that the partition key is a subset of the - * index's columns. Otherwise it would be possible to violate uniqueness - * by putting values that ought to be unique in different partitions. + * If this table is partitioned and we're creating a unique index, primary + * key, or exclusion constraint, make sure that the partition key is a + * subset of the index's columns. Otherwise it would be possible to + * violate uniqueness by putting values that ought to be unique in + * different partitions. * * We could lift this limitation if we had global indexes, but those have * their own problems, so this is a useful feature combination. */ - if (partitioned && (stmt->unique || stmt->primary)) + if (partitioned && (stmt->unique || stmt->excludeOpNames)) { PartitionKey key = RelationGetPartitionKey(rel); const char *constraint_type; @@ -942,7 +954,7 @@ DefineIndex(Oid relationId, constraint_type = "PRIMARY KEY"; else if (stmt->unique) constraint_type = "UNIQUE"; - else if (stmt->excludeOpNames != NIL) + else if (stmt->excludeOpNames) constraint_type = "EXCLUDE"; else { @@ -985,11 +997,11 @@ DefineIndex(Oid relationId, * We'll need to be able to identify the equality operators * associated with index columns, too. We know what to do with * btree opclasses; if there are ever any other index types that - * support unique indexes, this logic will need extension. + * support unique indexes, this logic will need extension. But if + * we have an exclusion constraint, it already knows the + * operators, so we don't have to infer them. */ - if (accessMethodId == BTREE_AM_OID) - eq_strategy = BTEqualStrategyNumber; - else + if (stmt->unique && accessMethodId != BTREE_AM_OID) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot match partition key to an index using access method \"%s\"", @@ -1012,25 +1024,52 @@ DefineIndex(Oid relationId, { if (key->partattrs[i] == indexInfo->ii_IndexAttrNumbers[j]) { - /* Matched the column, now what about the equality op? */ + /* + * Matched the column, now what about the collation and + * equality op? + */ Oid idx_opfamily; Oid idx_opcintype; - if (get_opclass_opfamily_and_input_type(classObjectId[j], + if (key->partcollation[i] != collationIds[j]) + continue; + + if (get_opclass_opfamily_and_input_type(opclassIds[j], &idx_opfamily, &idx_opcintype)) { - Oid idx_eqop; + Oid idx_eqop = InvalidOid; + + if (stmt->unique) + idx_eqop = get_opfamily_member(idx_opfamily, + idx_opcintype, + idx_opcintype, + BTEqualStrategyNumber); + else if (stmt->excludeOpNames) + idx_eqop = indexInfo->ii_ExclusionOps[j]; + Assert(idx_eqop); - idx_eqop = get_opfamily_member(idx_opfamily, - idx_opcintype, - idx_opcintype, - eq_strategy); if (ptkey_eqop == idx_eqop) { found = true; break; } + else if (stmt->excludeOpNames) + { + /* + * We found a match, but it's not an equality + * operator. Instead of failing below with an + * error message about a missing column, fail now + * and explain that the operator is wrong. + */ + Form_pg_attribute att = TupleDescAttr(RelationGetDescr(rel), key->partattrs[i] - 1); + + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot match partition key to index on column \"%s\" using non-equal operator \"%s\"", + NameStr(att->attname), + get_opname(indexInfo->ii_ExclusionOps[j])))); + } } } } @@ -1102,7 +1141,7 @@ DefineIndex(Oid relationId, constraint_type = "PRIMARY KEY"; else if (stmt->unique) constraint_type = "UNIQUE"; - else if (stmt->excludeOpNames != NIL) + else if (stmt->excludeOpNames) constraint_type = "EXCLUDE"; else { @@ -1165,8 +1204,8 @@ DefineIndex(Oid relationId, parentConstraintId, stmt->oldNumber, indexInfo, indexColNames, accessMethodId, tablespaceId, - collationObjectId, classObjectId, - coloptions, reloptions, + collationIds, opclassIds, opclassOptions, + coloptions, NULL, reloptions, flags, constr_flags, allowSystemTableMods, !check_rights, &createdConstraintId); @@ -1200,6 +1239,7 @@ DefineIndex(Oid relationId, */ AtEOXact_GUC(false, root_save_nestlevel); root_save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); /* Add any requested comment */ if (stmt->idxcomment != NULL) @@ -1246,8 +1286,7 @@ DefineIndex(Oid relationId, */ if (total_parts < 0) { - List *children = find_all_inheritors(relationId, - NoLock, NULL); + List *children = find_all_inheritors(tableId, NoLock, NULL); total_parts = list_length(children) - 1; list_free(children); @@ -1300,6 +1339,7 @@ DefineIndex(Oid relationId, SetUserIdAndSecContext(childrel->rd_rel->relowner, child_save_sec_context | SECURITY_RESTRICTED_OPERATION); child_save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); /* * Don't try to create indexes on foreign tables, though. Skip @@ -1413,54 +1453,20 @@ DefineIndex(Oid relationId, */ if (!found) { - IndexStmt *childStmt = copyObject(stmt); - bool found_whole_row; - ListCell *lc; - - /* - * We can't use the same index name for the child index, - * so clear idxname to let the recursive invocation choose - * a new name. Likewise, the existing target relation - * field is wrong, and if indexOid or oldNumber are set, - * they mustn't be applied to the child either. - */ - childStmt->idxname = NULL; - childStmt->relation = NULL; - childStmt->indexOid = InvalidOid; - childStmt->oldNumber = InvalidRelFileNumber; - childStmt->oldCreateSubid = InvalidSubTransactionId; - childStmt->oldFirstRelfilelocatorSubid = InvalidSubTransactionId; + IndexStmt *childStmt; + ObjectAddress childAddr; /* - * Adjust any Vars (both in expressions and in the index's - * WHERE clause) to match the partition's column numbering - * in case it's different from the parent's. + * Build an IndexStmt describing the desired child index + * in the same way that we do during ATTACH PARTITION. + * Notably, we rely on generateClonedIndexStmt to produce + * a search-path-independent representation, which the + * original IndexStmt might not be. */ - foreach(lc, childStmt->indexParams) - { - IndexElem *ielem = lfirst(lc); - - /* - * If the index parameter is an expression, we must - * translate it to contain child Vars. - */ - if (ielem->expr) - { - ielem->expr = - map_variable_attnos((Node *) ielem->expr, - 1, 0, attmap, - InvalidOid, - &found_whole_row); - if (found_whole_row) - elog(ERROR, "cannot convert whole-row table reference"); - } - } - childStmt->whereClause = - map_variable_attnos(stmt->whereClause, 1, 0, - attmap, - InvalidOid, &found_whole_row); - if (found_whole_row) - elog(ERROR, "cannot convert whole-row table reference"); + childStmt = generateClonedIndexStmt(NULL, + parentIndex, + attmap, + NULL); /* * Recurse as the starting user ID. Callee will use that @@ -1469,15 +1475,25 @@ DefineIndex(Oid relationId, Assert(GetUserId() == child_save_userid); SetUserIdAndSecContext(root_save_userid, root_save_sec_context); - DefineIndex(childRelid, childStmt, - InvalidOid, /* no predefined OID */ - indexRelationId, /* this is our child */ - createdConstraintId, - -1, - is_alter_table, check_rights, check_not_in_use, - skip_build, quiet); + childAddr = + DefineIndex(childRelid, childStmt, + InvalidOid, /* no predefined OID */ + indexRelationId, /* this is our child */ + createdConstraintId, + -1, + is_alter_table, check_rights, + check_not_in_use, + skip_build, quiet); SetUserIdAndSecContext(child_save_userid, child_save_sec_context); + + /* + * Check if the index just created is valid or not, as it + * could be possible that it has been switched as invalid + * when recursing across multiple partition levels. + */ + if (!get_index_isvalid(childAddr.objectId)) + invalidate_parent = true; } free_attrmap(attmap); @@ -1507,6 +1523,12 @@ DefineIndex(Oid relationId, ReleaseSysCache(tup); table_close(pg_index, RowExclusiveLock); heap_freetuple(newtup); + + /* + * CCI here to make this update visible, in case this recurses + * across multiple partition levels. + */ + CommandCounterIncrement(); } } @@ -1641,7 +1663,7 @@ DefineIndex(Oid relationId, PushActiveSnapshot(GetTransactionSnapshot()); /* Perform concurrent build of index */ - index_concurrently_build(relationId, indexRelationId); + index_concurrently_build(tableId, indexRelationId); /* we can do away with our snapshot */ PopActiveSnapshot(); @@ -1687,7 +1709,7 @@ DefineIndex(Oid relationId, /* * Scan the index and the heap, insert any missing index entries. */ - validate_index(relationId, indexRelationId, snapshot); + validate_index(tableId, indexRelationId, snapshot); /* * Drop the reference snapshot. We must do this before waiting out other @@ -1755,33 +1777,6 @@ DefineIndex(Oid relationId, } -/* - * CheckMutability - * Test whether given expression is mutable - */ -static bool -CheckMutability(Expr *expr) -{ - /* - * First run the expression through the planner. This has a couple of - * important consequences. First, function default arguments will get - * inserted, which may affect volatility (consider "default now()"). - * Second, inline-able functions will get inlined, which may allow us to - * conclude that the function is really less volatile than it's marked. As - * an example, polymorphic functions must be marked with the most volatile - * behavior that they have for any input type, but once we inline the - * function we may be able to conclude that it's not so volatile for the - * particular input type we're dealing with. - * - * We assume here that expression_planner() won't scribble on its input. - */ - expr = expression_planner(expr); - - /* Now we can search for non-immutable functions */ - return contain_mutable_functions((Node *) expr); -} - - /* * CheckPredicate * Checks that the given partial-index predicate is valid. @@ -1805,7 +1800,7 @@ CheckPredicate(Expr *predicate) * A predicate using mutable functions is probably wrong, for the same * reasons that we don't allow an index expression to use one. */ - if (CheckMutability(predicate)) + if (contain_mutable_functions_after_planning(predicate)) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("functions in index predicate must be marked IMMUTABLE"))); @@ -1822,12 +1817,13 @@ CheckPredicate(Expr *predicate) */ static void ComputeIndexAttrs(IndexInfo *indexInfo, - Oid *typeOidP, - Oid *collationOidP, - Oid *classOidP, - int16 *colOptionP, - List *attList, /* list of IndexElem's */ - List *exclusionOpNames, + Oid *typeOids, + Oid *collationOids, + Oid *opclassOids, + Datum *opclassOptions, + int16 *colOptions, + const List *attList, /* list of IndexElem's */ + const List *exclusionOpNames, Oid relId, const char *accessMethodName, Oid accessMethodId, @@ -1948,14 +1944,14 @@ ComputeIndexAttrs(IndexInfo *indexInfo, * same data every time, it's not clear what the index entries * mean at all. */ - if (CheckMutability((Expr *) expr)) + if (contain_mutable_functions_after_planning((Expr *) expr)) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("functions in index expression must be marked IMMUTABLE"))); } } - typeOidP[attn] = atttype; + typeOids[attn] = atttype; /* * Included columns have no collation, no opclass and no ordering @@ -1980,9 +1976,10 @@ ComputeIndexAttrs(IndexInfo *indexInfo, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("including column does not support NULLS FIRST/LAST options"))); - classOidP[attn] = InvalidOid; - colOptionP[attn] = 0; - collationOidP[attn] = InvalidOid; + opclassOids[attn] = InvalidOid; + opclassOptions[attn] = (Datum) 0; + colOptions[attn] = 0; + collationOids[attn] = InvalidOid; attn++; continue; @@ -2005,6 +2002,7 @@ ComputeIndexAttrs(IndexInfo *indexInfo, { SetUserIdAndSecContext(save_userid, save_sec_context); *ddl_save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); } } @@ -2031,7 +2029,7 @@ ComputeIndexAttrs(IndexInfo *indexInfo, format_type_be(atttype)))); } - collationOidP[attn] = attcollation; + collationOids[attn] = attcollation; /* * Identify the opclass to use. Use of ddl_userid is necessary due to @@ -2044,14 +2042,15 @@ ComputeIndexAttrs(IndexInfo *indexInfo, AtEOXact_GUC(false, *ddl_save_nestlevel); SetUserIdAndSecContext(ddl_userid, ddl_sec_context); } - classOidP[attn] = ResolveOpClass(attribute->opclass, - atttype, - accessMethodName, - accessMethodId); + opclassOids[attn] = ResolveOpClass(attribute->opclass, + atttype, + accessMethodName, + accessMethodId); if (OidIsValid(ddl_userid)) { SetUserIdAndSecContext(save_userid, save_sec_context); *ddl_save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); } /* @@ -2082,6 +2081,7 @@ ComputeIndexAttrs(IndexInfo *indexInfo, { SetUserIdAndSecContext(save_userid, save_sec_context); *ddl_save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); } /* @@ -2099,7 +2099,7 @@ ComputeIndexAttrs(IndexInfo *indexInfo, /* * Operator must be a member of the right opfamily, too */ - opfamily = get_opclass_family(classOidP[attn]); + opfamily = get_opclass_family(opclassOids[attn]); strat = get_op_opfamily_strategy(opid, opfamily); if (strat == 0) { @@ -2137,20 +2137,20 @@ ComputeIndexAttrs(IndexInfo *indexInfo, * zero for any un-ordered index, while ordered indexes have DESC and * NULLS FIRST/LAST options. */ - colOptionP[attn] = 0; + colOptions[attn] = 0; if (amcanorder) { /* default ordering is ASC */ if (attribute->ordering == SORTBY_DESC) - colOptionP[attn] |= INDOPTION_DESC; + colOptions[attn] |= INDOPTION_DESC; /* default null ordering is LAST for ASC, FIRST for DESC */ if (attribute->nulls_ordering == SORTBY_NULLS_DEFAULT) { if (attribute->ordering == SORTBY_DESC) - colOptionP[attn] |= INDOPTION_NULLS_FIRST; + colOptions[attn] |= INDOPTION_NULLS_FIRST; } else if (attribute->nulls_ordering == SORTBY_NULLS_FIRST) - colOptionP[attn] |= INDOPTION_NULLS_FIRST; + colOptions[attn] |= INDOPTION_NULLS_FIRST; } else { @@ -2172,14 +2172,12 @@ ComputeIndexAttrs(IndexInfo *indexInfo, { Assert(attn < nkeycols); - if (!indexInfo->ii_OpclassOptions) - indexInfo->ii_OpclassOptions = - palloc0_array(Datum, indexInfo->ii_NumIndexAttrs); - - indexInfo->ii_OpclassOptions[attn] = + opclassOptions[attn] = transformRelOptions((Datum) 0, attribute->opclassopts, NULL, NULL, false, false); } + else + opclassOptions[attn] = (Datum) 0; attn++; } @@ -2192,7 +2190,7 @@ ComputeIndexAttrs(IndexInfo *indexInfo, * partition key definitions. */ Oid -ResolveOpClass(List *opclass, Oid attrType, +ResolveOpClass(const List *opclass, Oid attrType, const char *accessMethodName, Oid accessMethodId) { char *schemaname; @@ -2509,7 +2507,7 @@ ChooseRelationName(const char *name1, const char *name2, */ static char * ChooseIndexName(const char *tabname, Oid namespaceId, - List *colnames, List *exclusionOpNames, + const List *colnames, const List *exclusionOpNames, bool primary, bool isconstraint) { char *indexname; @@ -2563,7 +2561,7 @@ ChooseIndexName(const char *tabname, Oid namespaceId, * ChooseExtendedStatisticNameAddition. */ static char * -ChooseIndexNameAddition(List *colnames) +ChooseIndexNameAddition(const List *colnames) { char buf[NAMEDATALEN * 2]; int buflen = 0; @@ -2597,7 +2595,7 @@ ChooseIndexNameAddition(List *colnames) * Returns a List of plain strings (char *, not String nodes). */ static List * -ChooseIndexColumnNames(List *indexElems) +ChooseIndexColumnNames(const List *indexElems) { List *result = NIL; ListCell *lc; @@ -2658,7 +2656,7 @@ ChooseIndexColumnNames(List *indexElems) * each subroutine of REINDEX. */ void -ExecReindex(ParseState *pstate, ReindexStmt *stmt, bool isTopLevel) +ExecReindex(ParseState *pstate, const ReindexStmt *stmt, bool isTopLevel) { ReindexParams params = {0}; ListCell *lc; @@ -2720,10 +2718,10 @@ ExecReindex(ParseState *pstate, ReindexStmt *stmt, bool isTopLevel) switch (stmt->kind) { case REINDEX_OBJECT_INDEX: - ReindexIndex(stmt->relation, ¶ms, isTopLevel); + ReindexIndex(stmt, ¶ms, isTopLevel); break; case REINDEX_OBJECT_TABLE: - ReindexTable(stmt->relation, ¶ms, isTopLevel); + ReindexTable(stmt, ¶ms, isTopLevel); break; case REINDEX_OBJECT_SCHEMA: case REINDEX_OBJECT_SYSTEM: @@ -2739,7 +2737,7 @@ ExecReindex(ParseState *pstate, ReindexStmt *stmt, bool isTopLevel) (stmt->kind == REINDEX_OBJECT_SCHEMA) ? "REINDEX SCHEMA" : (stmt->kind == REINDEX_OBJECT_SYSTEM) ? "REINDEX SYSTEM" : "REINDEX DATABASE"); - ReindexMultipleTables(stmt->name, stmt->kind, ¶ms); + ReindexMultipleTables(stmt, ¶ms); break; default: elog(ERROR, "unrecognized object type: %d", @@ -2753,8 +2751,9 @@ ExecReindex(ParseState *pstate, ReindexStmt *stmt, bool isTopLevel) * Recreate a specific index. */ static void -ReindexIndex(RangeVar *indexRelation, ReindexParams *params, bool isTopLevel) +ReindexIndex(const ReindexStmt *stmt, const ReindexParams *params, bool isTopLevel) { + const RangeVar *indexRelation = stmt->relation; struct ReindexIndexCallbackState state; Oid indOid; char persistence; @@ -2787,16 +2786,16 @@ ReindexIndex(RangeVar *indexRelation, ReindexParams *params, bool isTopLevel) relkind = get_rel_relkind(indOid); if (relkind == RELKIND_PARTITIONED_INDEX) - ReindexPartitions(indOid, params, isTopLevel); + ReindexPartitions(stmt, indOid, params, isTopLevel); else if ((params->options & REINDEXOPT_CONCURRENTLY) != 0 && persistence != RELPERSISTENCE_TEMP) - ReindexRelationConcurrently(indOid, params); + ReindexRelationConcurrently(stmt, indOid, params); else { ReindexParams newparams = *params; newparams.options |= REINDEXOPT_REPORT_PROGRESS; - reindex_index(indOid, false, persistence, &newparams); + reindex_index(stmt, indOid, false, persistence, &newparams); } } @@ -2882,10 +2881,11 @@ RangeVarCallbackForReindexIndex(const RangeVar *relation, * Recreate all indexes of a table (and of its toast table, if any) */ static Oid -ReindexTable(RangeVar *relation, ReindexParams *params, bool isTopLevel) +ReindexTable(const ReindexStmt *stmt, const ReindexParams *params, bool isTopLevel) { Oid heapOid; bool result; + const RangeVar *relation = stmt->relation; /* * The lock level used here should match reindex_relation(). @@ -2902,11 +2902,11 @@ ReindexTable(RangeVar *relation, ReindexParams *params, bool isTopLevel) RangeVarCallbackMaintainsTable, NULL); if (get_rel_relkind(heapOid) == RELKIND_PARTITIONED_TABLE) - ReindexPartitions(heapOid, params, isTopLevel); + ReindexPartitions(stmt, heapOid, params, isTopLevel); else if ((params->options & REINDEXOPT_CONCURRENTLY) != 0 && get_rel_persistence(heapOid) != RELPERSISTENCE_TEMP) { - result = ReindexRelationConcurrently(heapOid, params); + result = ReindexRelationConcurrently(stmt, heapOid, params); if (!result) ereport(NOTICE, @@ -2918,7 +2918,7 @@ ReindexTable(RangeVar *relation, ReindexParams *params, bool isTopLevel) ReindexParams newparams = *params; newparams.options |= REINDEXOPT_REPORT_PROGRESS; - result = reindex_relation(heapOid, + result = reindex_relation(stmt, heapOid, REINDEX_REL_PROCESS_TOAST | REINDEX_REL_CHECK_CONSTRAINTS, &newparams); @@ -2940,9 +2940,9 @@ ReindexTable(RangeVar *relation, ReindexParams *params, bool isTopLevel) * That means this must not be called within a user transaction block! */ static void -ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind, - ReindexParams *params) +ReindexMultipleTables(const ReindexStmt *stmt, const ReindexParams *params) { + Oid objectOid; Relation relationRelation; TableScanDesc scan; @@ -2954,6 +2954,8 @@ ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind, int num_keys; bool concurrent_warning = false; bool tablespace_warning = false; + const char *objectName = stmt->name; + const ReindexObjectType objectKind = stmt->kind; Assert(objectKind == REINDEX_OBJECT_SCHEMA || objectKind == REINDEX_OBJECT_SYSTEM || @@ -3148,7 +3150,7 @@ ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind, * Process each relation listed in a separate transaction. Note that this * commits and then starts a new transaction immediately. */ - ReindexMultipleInternal(relids, params); + ReindexMultipleInternal(stmt, relids, params); MemoryContextDelete(private_context); } @@ -3178,7 +3180,7 @@ reindex_error_callback(void *arg) * by the caller. */ static void -ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) +ReindexPartitions(const ReindexStmt *stmt, Oid relid, const ReindexParams *params, bool isTopLevel) { List *partitions = NIL; char relkind = get_rel_relkind(relid); @@ -3254,7 +3256,7 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) * Process each partition listed in a separate transaction. Note that * this commits and then starts a new transaction immediately. */ - ReindexMultipleInternal(partitions, params); + ReindexMultipleInternal(stmt, partitions, params); /* * Clean up working storage --- note we must do this after @@ -3272,7 +3274,7 @@ ReindexPartitions(Oid relid, ReindexParams *params, bool isTopLevel) * and starts a new transaction when finished. */ static void -ReindexMultipleInternal(List *relids, ReindexParams *params) +ReindexMultipleInternal(const ReindexStmt *stmt, const List *relids, const ReindexParams *params) { ListCell *l; @@ -3331,7 +3333,9 @@ ReindexMultipleInternal(List *relids, ReindexParams *params) ReindexParams newparams = *params; newparams.options |= REINDEXOPT_MISSING_OK; - (void) ReindexRelationConcurrently(relid, &newparams); + (void) ReindexRelationConcurrently(stmt, relid, &newparams); + if (ActiveSnapshotSet()) + PopActiveSnapshot(); /* ReindexRelationConcurrently() does the verbose output */ } else if (relkind == RELKIND_INDEX) @@ -3340,7 +3344,7 @@ ReindexMultipleInternal(List *relids, ReindexParams *params) newparams.options |= REINDEXOPT_REPORT_PROGRESS | REINDEXOPT_MISSING_OK; - reindex_index(relid, false, relpersistence, &newparams); + reindex_index(stmt, relid, false, relpersistence, &newparams); PopActiveSnapshot(); /* reindex_index() does the verbose output */ } @@ -3351,7 +3355,7 @@ ReindexMultipleInternal(List *relids, ReindexParams *params) newparams.options |= REINDEXOPT_REPORT_PROGRESS | REINDEXOPT_MISSING_OK; - result = reindex_relation(relid, + result = reindex_relation(stmt, relid, REINDEX_REL_PROCESS_TOAST | REINDEX_REL_CHECK_CONSTRAINTS, &newparams); @@ -3396,7 +3400,7 @@ ReindexMultipleInternal(List *relids, ReindexParams *params) * anyway, and a non-concurrent reindex is more efficient. */ static bool -ReindexRelationConcurrently(Oid relationOid, ReindexParams *params) +ReindexRelationConcurrently(const ReindexStmt *stmt, Oid relationOid, const ReindexParams *params) { typedef struct ReindexIndexInfo { @@ -3509,10 +3513,11 @@ ReindexRelationConcurrently(Oid relationOid, ReindexParams *params) if (!indexRelation->rd_index->indisvalid) ereport(WARNING, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot reindex invalid index \"%s.%s\" concurrently, skipping", + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("skipping reindex of invalid index \"%s.%s\"", get_namespace_name(get_rel_namespace(cellOid)), - get_rel_name(cellOid)))); + get_rel_name(cellOid)), + errhint("Use DROP INDEX or REINDEX INDEX."))); else if (indexRelation->rd_index->indisexclusion) ereport(WARNING, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), @@ -3561,10 +3566,11 @@ ReindexRelationConcurrently(Oid relationOid, ReindexParams *params) if (!indexRelation->rd_index->indisvalid) ereport(WARNING, - (errcode(ERRCODE_INDEX_CORRUPTED), - errmsg("cannot reindex invalid index \"%s.%s\" concurrently, skipping", + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("skipping reindex of invalid index \"%s.%s\"", get_namespace_name(get_rel_namespace(cellOid)), - get_rel_name(cellOid)))); + get_rel_name(cellOid)), + errhint("Use DROP INDEX or REINDEX INDEX."))); else { ReindexIndexInfo *idx; @@ -3683,10 +3689,7 @@ ReindexRelationConcurrently(Oid relationOid, ReindexParams *params) * session until this operation completes. */ if (indexIds == NIL) - { - PopActiveSnapshot(); return false; - } /* It's not a shared catalog, so refuse to move it to shared tablespace */ if (params->tablespaceOid == GLOBALTABLESPACE_OID) @@ -3750,10 +3753,19 @@ ReindexRelationConcurrently(Oid relationOid, ReindexParams *params) SetUserIdAndSecContext(heapRel->rd_rel->relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); /* determine safety of this index for set_indexsafe_procflags */ - idx->safe = (indexRel->rd_indexprs == NIL && - indexRel->rd_indpred == NIL); + idx->safe = (RelationGetIndexExpressions(indexRel) == NIL && + RelationGetIndexPredicate(indexRel) == NIL); + +#ifdef USE_INJECTION_POINTS + if (idx->safe) + INJECTION_POINT("reindex-conc-index-safe"); + else + INJECTION_POINT("reindex-conc-index-not-safe"); +#endif + idx->tableId = RelationGetRelid(heapRel); idx->amId = indexRel->rd_rel->relam; @@ -3761,8 +3773,7 @@ ReindexRelationConcurrently(Oid relationOid, ReindexParams *params) if (indexRel->rd_rel->relpersistence == RELPERSISTENCE_TEMP) elog(ERROR, "cannot reindex a temporary table concurrently"); - pgstat_progress_start_command(PROGRESS_COMMAND_CREATE_INDEX, - idx->tableId); + pgstat_progress_start_command(PROGRESS_COMMAND_CREATE_INDEX, idx->tableId); progress_vals[0] = PROGRESS_CREATEIDX_COMMAND_REINDEX_CONCURRENTLY; progress_vals[1] = 0; /* initializing */ @@ -3834,6 +3845,20 @@ ReindexRelationConcurrently(Oid relationOid, ReindexParams *params) SetUserIdAndSecContext(save_userid, save_sec_context); table_close(heapRel, NoLock); + + /* + * If a statement is available, telling that this comes from a REINDEX + * command, collect the new index for event triggers. + */ + if (stmt) + { + ObjectAddress address; + + ObjectAddressSet(address, RelationRelationId, newIndexId); + EventTriggerCollectSimpleCommand(address, + InvalidObjectAddress, + (Node *) stmt); + } } /* @@ -3987,8 +4012,7 @@ ReindexRelationConcurrently(Oid relationOid, ReindexParams *params) * Update progress for the index to build, with the correct parent * table involved. */ - pgstat_progress_start_command(PROGRESS_COMMAND_CREATE_INDEX, - newidx->tableId); + pgstat_progress_start_command(PROGRESS_COMMAND_CREATE_INDEX, newidx->tableId); progress_vals[0] = PROGRESS_CREATEIDX_COMMAND_REINDEX_CONCURRENTLY; progress_vals[1] = PROGRESS_CREATEIDX_PHASE_VALIDATE_IDXSCAN; progress_vals[2] = newidx->indexId; @@ -4317,7 +4341,10 @@ IndexSetParentIndex(Relation partitionIdx, Oid parentOid) /* set relhassubclass if an index partition has been added to the parent */ if (OidIsValid(parentOid)) + { + LockRelationOid(parentOid, ShareUpdateExclusiveLock); SetRelationHasSubclass(parentOid, true); + } /* set relispartition correctly on the partition */ update_relispartition(partRelid, OidIsValid(parentOid)); @@ -4368,14 +4395,17 @@ update_relispartition(Oid relationId, bool newval) { HeapTuple tup; Relation classRel; + ItemPointerData otid; classRel = table_open(RelationRelationId, RowExclusiveLock); - tup = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relationId)); + tup = SearchSysCacheLockedCopy1(RELOID, ObjectIdGetDatum(relationId)); if (!HeapTupleIsValid(tup)) elog(ERROR, "cache lookup failed for relation %u", relationId); + otid = tup->t_self; Assert(((Form_pg_class) GETSTRUCT(tup))->relispartition != newval); ((Form_pg_class) GETSTRUCT(tup))->relispartition = newval; - CatalogTupleUpdate(classRel, &tup->t_self, tup); + CatalogTupleUpdate(classRel, &otid, tup); + UnlockTuple(classRel, &otid, InplaceUpdateTupleLock); heap_freetuple(tup); table_close(classRel, RowExclusiveLock); } diff --git a/src/backend/commands/lockcmds.c b/src/backend/commands/lockcmds.c index 92662cbbc8768..cd20ae76badbc 100644 --- a/src/backend/commands/lockcmds.c +++ b/src/backend/commands/lockcmds.c @@ -3,7 +3,7 @@ * lockcmds.c * LOCK command support code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -21,7 +21,6 @@ #include "commands/lockcmds.h" #include "miscadmin.h" #include "nodes/nodeFuncs.h" -#include "parser/parse_clause.h" #include "rewrite/rewriteHandler.h" #include "storage/lmgr.h" #include "utils/acl.h" diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c index f9a3bdfc3abbf..6bb64be274141 100644 --- a/src/backend/commands/matview.c +++ b/src/backend/commands/matview.c @@ -3,7 +3,7 @@ * matview.c * materialized view support * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -20,13 +20,10 @@ #include "access/multixact.h" #include "access/tableam.h" #include "access/xact.h" -#include "access/xlog.h" -#include "catalog/catalog.h" #include "catalog/indexing.h" #include "catalog/namespace.h" #include "catalog/pg_am.h" #include "catalog/pg_opclass.h" -#include "catalog/pg_operator.h" #include "commands/cluster.h" #include "commands/matview.h" #include "commands/tablecmds.h" @@ -34,11 +31,9 @@ #include "executor/executor.h" #include "executor/spi.h" #include "miscadmin.h" -#include "parser/parse_relation.h" #include "pgstat.h" #include "rewrite/rewriteHandler.h" #include "storage/lmgr.h" -#include "storage/smgr.h" #include "tcop/tcopprot.h" #include "utils/builtins.h" #include "utils/lsyscache.h" @@ -117,15 +112,44 @@ SetMatViewPopulatedState(Relation relation, bool newstate) /* * ExecRefreshMatView -- execute a REFRESH MATERIALIZED VIEW command * + * If WITH NO DATA was specified, this is effectively like a TRUNCATE; + * otherwise it is like a TRUNCATE followed by an INSERT using the SELECT + * statement associated with the materialized view. The statement node's + * skipData field shows whether the clause was used. + */ +ObjectAddress +ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, + ParamListInfo params, QueryCompletion *qc) +{ + Oid matviewOid; + LOCKMODE lockmode; + + /* Determine strength of lock needed. */ + lockmode = stmt->concurrent ? ExclusiveLock : AccessExclusiveLock; + + /* + * Get a lock until end of transaction. + */ + matviewOid = RangeVarGetRelidExtended(stmt->relation, + lockmode, 0, + RangeVarCallbackMaintainsTable, + NULL); + + return RefreshMatViewByOid(matviewOid, stmt->skipData, stmt->concurrent, + queryString, params, qc); +} + +/* + * RefreshMatViewByOid -- refresh materialized view by OID + * * This refreshes the materialized view by creating a new table and swapping * the relfilenumbers of the new table and the old materialized view, so the OID * of the original materialized view is preserved. Thus we do not lose GRANT * nor references to this materialized view. * - * If WITH NO DATA was specified, this is effectively like a TRUNCATE; - * otherwise it is like a TRUNCATE followed by an INSERT using the SELECT - * statement associated with the materialized view. The statement node's - * skipData field shows whether the clause was used. + * If skipData is true, this is effectively like a TRUNCATE; otherwise it is + * like a TRUNCATE followed by an INSERT using the SELECT statement associated + * with the materialized view. * * Indexes are rebuilt too, via REINDEX. Since we are effectively bulk-loading * the new heap, it's better to create the indexes afterwards than to fill them @@ -135,10 +159,10 @@ SetMatViewPopulatedState(Relation relation, bool newstate) * reflect the result set of the materialized view's query. */ ObjectAddress -ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, - ParamListInfo params, QueryCompletion *qc) +RefreshMatViewByOid(Oid matviewOid, bool skipData, bool concurrent, + const char *queryString, ParamListInfo params, + QueryCompletion *qc) { - Oid matviewOid; Relation matviewRel; RewriteRule *rule; List *actions; @@ -148,25 +172,12 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, Oid OIDNewHeap; DestReceiver *dest; uint64 processed = 0; - bool concurrent; - LOCKMODE lockmode; char relpersistence; Oid save_userid; int save_sec_context; int save_nestlevel; ObjectAddress address; - /* Determine strength of lock needed. */ - concurrent = stmt->concurrent; - lockmode = concurrent ? ExclusiveLock : AccessExclusiveLock; - - /* - * Get a lock until end of transaction. - */ - matviewOid = RangeVarGetRelidExtended(stmt->relation, - lockmode, 0, - RangeVarCallbackMaintainsTable, - NULL); matviewRel = table_open(matviewOid, NoLock); relowner = matviewRel->rd_rel->relowner; @@ -179,6 +190,7 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, SetUserIdAndSecContext(relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); /* Make sure it is a materialized view. */ if (matviewRel->rd_rel->relkind != RELKIND_MATVIEW) @@ -194,7 +206,7 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, errmsg("CONCURRENTLY cannot be used when the materialized view is not populated"))); /* Check that conflicting options have not been specified. */ - if (concurrent && stmt->skipData) + if (concurrent && skipData) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("%s and %s options cannot be used together", @@ -279,7 +291,7 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, * Tentatively mark the matview as populated or not (this will roll back * if we fail later). */ - SetMatViewPopulatedState(matviewRel, !stmt->skipData); + SetMatViewPopulatedState(matviewRel, !skipData); /* Concurrent refresh builds new data in temp tablespace, and does diff. */ if (concurrent) @@ -305,7 +317,7 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, dest = CreateTransientRelDestReceiver(OIDNewHeap); /* Generate the data, if wanted. */ - if (!stmt->skipData) + if (!skipData) processed = refresh_matview_datafill(dest, dataQuery, queryString); /* Make the matview match the newly generated data. */ @@ -337,7 +349,7 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, * inserts and deletes it issues get counted by lower-level code.) */ pgstat_count_truncate(matviewRel); - if (!stmt->skipData) + if (!skipData) pgstat_count_heap_insert(matviewRel, processed); } @@ -657,13 +669,35 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner, SPI_getvalue(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1)))); } + /* + * Create the temporary "diff" table. + * + * Temporarily switch out of the SECURITY_RESTRICTED_OPERATION context, + * because you cannot create temp tables in SRO context. For extra + * paranoia, add the composite type column only after switching back to + * SRO context. + */ SetUserIdAndSecContext(relowner, save_sec_context | SECURITY_LOCAL_USERID_CHANGE); + resetStringInfo(&querybuf); + appendStringInfo(&querybuf, + "CREATE TEMP TABLE %s (tid pg_catalog.tid)", + diffname); + if (SPI_exec(querybuf.data, 0) != SPI_OK_UTILITY) + elog(ERROR, "SPI_exec failed: %s", querybuf.data); + SetUserIdAndSecContext(relowner, + save_sec_context | SECURITY_RESTRICTED_OPERATION); + resetStringInfo(&querybuf); + appendStringInfo(&querybuf, + "ALTER TABLE %s ADD COLUMN newdata %s", + diffname, tempname); + if (SPI_exec(querybuf.data, 0) != SPI_OK_UTILITY) + elog(ERROR, "SPI_exec failed: %s", querybuf.data); - /* Start building the query for creating the diff table. */ + /* Start building the query for populating the diff table. */ resetStringInfo(&querybuf); appendStringInfo(&querybuf, - "CREATE TEMP TABLE %s AS " + "INSERT INTO %s " "SELECT mv.ctid AS tid, newdata.*::%s AS newdata " "FROM %s mv FULL JOIN %s newdata ON (", diffname, tempname, matviewname, tempname); @@ -780,22 +814,22 @@ refresh_by_match_merge(Oid matviewOid, Oid tempOid, Oid relowner, * * ExecRefreshMatView() checks that after taking the exclusive lock on the * matview. So at least one unique index is guaranteed to exist here - * because the lock is still being held; so an Assert seems sufficient. + * because the lock is still being held. (One known exception is if a + * function called as part of refreshing the matview drops the index. + * That's a pretty silly thing to do.) */ - Assert(foundUniqueIndex); + if (!foundUniqueIndex) + elog(ERROR, "could not find suitable unique index on materialized view"); appendStringInfoString(&querybuf, " AND newdata.* OPERATOR(pg_catalog.*=) mv.*) " "WHERE newdata.* IS NULL OR mv.* IS NULL " "ORDER BY tid"); - /* Create the temporary "diff" table. */ - if (SPI_exec(querybuf.data, 0) != SPI_OK_UTILITY) + /* Populate the temporary "diff" table. */ + if (SPI_exec(querybuf.data, 0) != SPI_OK_INSERT) elog(ERROR, "SPI_exec failed: %s", querybuf.data); - SetUserIdAndSecContext(relowner, - save_sec_context | SECURITY_RESTRICTED_OPERATION); - /* * We have no further use for data from the "full-data" temp table, but we * must keep it around because its type is referenced from the diff table. diff --git a/src/backend/commands/meson.build b/src/backend/commands/meson.build index 42cced9ebe9c5..6dd00a4abdeaf 100644 --- a/src/backend/commands/meson.build +++ b/src/backend/commands/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'aggregatecmds.c', diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c index 5f7ee238863ea..d024c547cc2fb 100644 --- a/src/backend/commands/opclasscmds.c +++ b/src/backend/commands/opclasscmds.c @@ -4,7 +4,7 @@ * * Routines for opclass (and opfamily) manipulation commands * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -21,7 +21,6 @@ #include "access/hash.h" #include "access/htup_details.h" #include "access/nbtree.h" -#include "access/sysattr.h" #include "access/table.h" #include "catalog/catalog.h" #include "catalog/dependency.h" @@ -36,13 +35,13 @@ #include "catalog/pg_opfamily.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" -#include "commands/alter.h" #include "commands/defrem.h" #include "commands/event_trigger.h" #include "miscadmin.h" #include "parser/parse_func.h" #include "parser/parse_oper.h" #include "parser/parse_type.h" +#include "utils/acl.h" #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/lsyscache.h" @@ -66,6 +65,7 @@ static void storeOperators(List *opfamilyname, Oid amoid, Oid opfamilyoid, List *operators, bool isAdd); static void storeProcedures(List *opfamilyname, Oid amoid, Oid opfamilyoid, List *procedures, bool isAdd); +static bool typeDepNeeded(Oid typid, OpFamilyMember *member); static void dropOperators(List *opfamilyname, Oid amoid, Oid opfamilyoid, List *operators); static void dropProcedures(List *opfamilyname, Oid amoid, Oid opfamilyoid, @@ -1508,6 +1508,29 @@ storeOperators(List *opfamilyname, Oid amoid, Oid opfamilyoid, recordDependencyOn(&myself, &referenced, op->ref_is_hard ? DEPENDENCY_INTERNAL : DEPENDENCY_AUTO); + if (typeDepNeeded(op->lefttype, op)) + { + referenced.classId = TypeRelationId; + referenced.objectId = op->lefttype; + referenced.objectSubId = 0; + + /* see comments in amapi.h about dependency strength */ + recordDependencyOn(&myself, &referenced, + op->ref_is_hard ? DEPENDENCY_NORMAL : DEPENDENCY_AUTO); + } + + if (op->lefttype != op->righttype && + typeDepNeeded(op->righttype, op)) + { + referenced.classId = TypeRelationId; + referenced.objectId = op->righttype; + referenced.objectSubId = 0; + + /* see comments in amapi.h about dependency strength */ + recordDependencyOn(&myself, &referenced, + op->ref_is_hard ? DEPENDENCY_NORMAL : DEPENDENCY_AUTO); + } + /* A search operator also needs a dep on the referenced opfamily */ if (OidIsValid(op->sortfamily)) { @@ -1609,6 +1632,29 @@ storeProcedures(List *opfamilyname, Oid amoid, Oid opfamilyoid, recordDependencyOn(&myself, &referenced, proc->ref_is_hard ? DEPENDENCY_INTERNAL : DEPENDENCY_AUTO); + if (typeDepNeeded(proc->lefttype, proc)) + { + referenced.classId = TypeRelationId; + referenced.objectId = proc->lefttype; + referenced.objectSubId = 0; + + /* see comments in amapi.h about dependency strength */ + recordDependencyOn(&myself, &referenced, + proc->ref_is_hard ? DEPENDENCY_NORMAL : DEPENDENCY_AUTO); + } + + if (proc->lefttype != proc->righttype && + typeDepNeeded(proc->righttype, proc)) + { + referenced.classId = TypeRelationId; + referenced.objectId = proc->righttype; + referenced.objectSubId = 0; + + /* see comments in amapi.h about dependency strength */ + recordDependencyOn(&myself, &referenced, + proc->ref_is_hard ? DEPENDENCY_NORMAL : DEPENDENCY_AUTO); + } + /* Post create hook of access method procedure */ InvokeObjectPostCreateHook(AccessMethodProcedureRelationId, entryoid, 0); @@ -1617,6 +1663,57 @@ storeProcedures(List *opfamilyname, Oid amoid, Oid opfamilyoid, table_close(rel, RowExclusiveLock); } +/* + * Detect whether a pg_amop or pg_amproc entry needs an explicit dependency + * on its lefttype or righttype. + * + * We make such a dependency unless the entry has an indirect dependency + * via its referenced operator or function. That's nearly always true + * for operators, but might well not be true for support functions. + */ +static bool +typeDepNeeded(Oid typid, OpFamilyMember *member) +{ + bool result = true; + + /* + * If the type is pinned, we don't need a dependency. This is a bit of a + * layering violation perhaps (recordDependencyOn would ignore the request + * anyway), but it's a cheap test and will frequently save a syscache + * lookup here. + */ + if (IsPinnedObject(TypeRelationId, typid)) + return false; + + /* Nope, so check the input types of the function or operator. */ + if (member->is_func) + { + Oid *argtypes; + int nargs; + + (void) get_func_signature(member->object, &argtypes, &nargs); + for (int i = 0; i < nargs; i++) + { + if (typid == argtypes[i]) + { + result = false; /* match, no dependency needed */ + break; + } + } + pfree(argtypes); + } + else + { + Oid lefttype, + righttype; + + op_input_types(member->object, &lefttype, &righttype); + if (typid == lefttype || typid == righttype) + result = false; /* match, no dependency needed */ + } + return result; +} + /* * Remove operator entries from an opfamily. diff --git a/src/backend/commands/operatorcmds.c b/src/backend/commands/operatorcmds.c index cd7f83136f721..5872a3e1922dd 100644 --- a/src/backend/commands/operatorcmds.c +++ b/src/backend/commands/operatorcmds.c @@ -4,7 +4,7 @@ * * Routines for operator manipulation commands * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -33,27 +33,27 @@ #include "access/htup_details.h" #include "access/table.h" -#include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/objectaccess.h" #include "catalog/pg_namespace.h" #include "catalog/pg_operator.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" -#include "commands/alter.h" #include "commands/defrem.h" #include "miscadmin.h" #include "parser/parse_func.h" #include "parser/parse_oper.h" #include "parser/parse_type.h" #include "utils/acl.h" -#include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/syscache.h" static Oid ValidateRestrictionEstimator(List *restrictionName); static Oid ValidateJoinEstimator(List *joinName); +static Oid ValidateOperatorReference(List *name, + Oid leftTypeId, + Oid rightTypeId); /* * DefineOperator @@ -359,6 +359,53 @@ ValidateJoinEstimator(List *joinName) return joinOid; } +/* + * Look up and return the OID of an operator, + * given a possibly-qualified name and left and right type IDs. + * + * Verifies that the operator is defined (not a shell) and owned by + * the current user, so that we have permission to associate it with + * the operator being altered. Rejecting shell operators is a policy + * choice to help catch mistakes, rather than something essential. + */ +static Oid +ValidateOperatorReference(List *name, + Oid leftTypeId, + Oid rightTypeId) +{ + Oid oid; + bool defined; + + oid = OperatorLookup(name, + leftTypeId, + rightTypeId, + &defined); + + /* These message strings are chosen to match parse_oper.c */ + if (!OidIsValid(oid)) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_FUNCTION), + errmsg("operator does not exist: %s", + op_signature_string(name, + leftTypeId, + rightTypeId)))); + + if (!defined) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_FUNCTION), + errmsg("operator is only a shell: %s", + op_signature_string(name, + leftTypeId, + rightTypeId)))); + + if (!object_ownercheck(OperatorRelationId, oid, GetUserId())) + aclcheck_error(ACLCHECK_NOT_OWNER, OBJECT_OPERATOR, + NameListToString(name)); + + return oid; +} + + /* * Guts of operator deletion. */ @@ -406,6 +453,10 @@ RemoveOperatorById(Oid operOid) * routine implementing ALTER OPERATOR SET (option = ...). * * Currently, only RESTRICT and JOIN estimator functions can be changed. + * COMMUTATOR, NEGATOR, MERGES, and HASHES attributes can be set if they + * have not been set previously. (Changing or removing one of these + * attributes could invalidate existing plans, which seems more trouble + * than it's worth.) */ ObjectAddress AlterOperator(AlterOperatorStmt *stmt) @@ -426,6 +477,14 @@ AlterOperator(AlterOperatorStmt *stmt) List *joinName = NIL; /* optional join sel. function */ bool updateJoin = false; Oid joinOid; + List *commutatorName = NIL; /* optional commutator operator name */ + Oid commutatorOid; + List *negatorName = NIL; /* optional negator operator name */ + Oid negatorOid; + bool canMerge = false; + bool updateMerges = false; + bool canHash = false; + bool updateHashes = false; /* Look up the operator */ oprId = LookupOperWithArgs(stmt->opername, false); @@ -456,6 +515,24 @@ AlterOperator(AlterOperatorStmt *stmt) joinName = param; updateJoin = true; } + else if (strcmp(defel->defname, "commutator") == 0) + { + commutatorName = defGetQualifiedName(defel); + } + else if (strcmp(defel->defname, "negator") == 0) + { + negatorName = defGetQualifiedName(defel); + } + else if (strcmp(defel->defname, "merges") == 0) + { + canMerge = defGetBoolean(defel); + updateMerges = true; + } + else if (strcmp(defel->defname, "hashes") == 0) + { + canHash = defGetBoolean(defel); + updateHashes = true; + } /* * The rest of the options that CREATE accepts cannot be changed. @@ -464,11 +541,7 @@ AlterOperator(AlterOperatorStmt *stmt) else if (strcmp(defel->defname, "leftarg") == 0 || strcmp(defel->defname, "rightarg") == 0 || strcmp(defel->defname, "function") == 0 || - strcmp(defel->defname, "procedure") == 0 || - strcmp(defel->defname, "commutator") == 0 || - strcmp(defel->defname, "negator") == 0 || - strcmp(defel->defname, "hashes") == 0 || - strcmp(defel->defname, "merges") == 0) + strcmp(defel->defname, "procedure") == 0) { ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -488,7 +561,7 @@ AlterOperator(AlterOperatorStmt *stmt) NameStr(oprForm->oprname)); /* - * Look up restriction and join estimators if specified + * Look up OIDs for any parameters specified */ if (restrictionName) restrictionOid = ValidateRestrictionEstimator(restrictionName); @@ -499,28 +572,79 @@ AlterOperator(AlterOperatorStmt *stmt) else joinOid = InvalidOid; - /* Perform additional checks, like OperatorCreate does */ - if (!(OidIsValid(oprForm->oprleft) && OidIsValid(oprForm->oprright))) + if (commutatorName) { - /* If it's not a binary op, these things mustn't be set: */ - if (OidIsValid(joinOid)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("only binary operators can have join selectivity"))); + /* commutator has reversed arg types */ + commutatorOid = ValidateOperatorReference(commutatorName, + oprForm->oprright, + oprForm->oprleft); + + /* + * We don't need to do anything extra for a self commutator as in + * OperatorCreate, since the operator surely exists already. + */ } + else + commutatorOid = InvalidOid; - if (oprForm->oprresult != BOOLOID) + if (negatorName) { - if (OidIsValid(restrictionOid)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("only boolean operators can have restriction selectivity"))); - if (OidIsValid(joinOid)) + negatorOid = ValidateOperatorReference(negatorName, + oprForm->oprleft, + oprForm->oprright); + + /* Must reject self-negation */ + if (negatorOid == oprForm->oid) ereport(ERROR, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), - errmsg("only boolean operators can have join selectivity"))); + errmsg("operator cannot be its own negator"))); + } + else + { + negatorOid = InvalidOid; } + /* + * Check that we're not changing any attributes that might be depended on + * by plans, while allowing no-op updates. + */ + if (OidIsValid(commutatorOid) && OidIsValid(oprForm->oprcom) && + commutatorOid != oprForm->oprcom) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("operator attribute \"%s\" cannot be changed if it has already been set", + "commutator"))); + + if (OidIsValid(negatorOid) && OidIsValid(oprForm->oprnegate) && + negatorOid != oprForm->oprnegate) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("operator attribute \"%s\" cannot be changed if it has already been set", + "negator"))); + + if (updateMerges && oprForm->oprcanmerge && !canMerge) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("operator attribute \"%s\" cannot be changed if it has already been set", + "merges"))); + + if (updateHashes && oprForm->oprcanhash && !canHash) + ereport(ERROR, + (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), + errmsg("operator attribute \"%s\" cannot be changed if it has already been set", + "hashes"))); + + /* Perform additional checks, like OperatorCreate does */ + OperatorValidateParams(oprForm->oprleft, + oprForm->oprright, + oprForm->oprresult, + OidIsValid(commutatorOid), + OidIsValid(negatorOid), + OidIsValid(restrictionOid), + OidIsValid(joinOid), + canMerge, + canHash); + /* Update the tuple */ for (i = 0; i < Natts_pg_operator; ++i) { @@ -531,12 +655,32 @@ AlterOperator(AlterOperatorStmt *stmt) if (updateRestriction) { replaces[Anum_pg_operator_oprrest - 1] = true; - values[Anum_pg_operator_oprrest - 1] = restrictionOid; + values[Anum_pg_operator_oprrest - 1] = ObjectIdGetDatum(restrictionOid); } if (updateJoin) { replaces[Anum_pg_operator_oprjoin - 1] = true; - values[Anum_pg_operator_oprjoin - 1] = joinOid; + values[Anum_pg_operator_oprjoin - 1] = ObjectIdGetDatum(joinOid); + } + if (OidIsValid(commutatorOid)) + { + replaces[Anum_pg_operator_oprcom - 1] = true; + values[Anum_pg_operator_oprcom - 1] = ObjectIdGetDatum(commutatorOid); + } + if (OidIsValid(negatorOid)) + { + replaces[Anum_pg_operator_oprnegate - 1] = true; + values[Anum_pg_operator_oprnegate - 1] = ObjectIdGetDatum(negatorOid); + } + if (updateMerges) + { + replaces[Anum_pg_operator_oprcanmerge - 1] = true; + values[Anum_pg_operator_oprcanmerge - 1] = BoolGetDatum(canMerge); + } + if (updateHashes) + { + replaces[Anum_pg_operator_oprcanhash - 1] = true; + values[Anum_pg_operator_oprcanhash - 1] = BoolGetDatum(canHash); } tup = heap_modify_tuple(tup, RelationGetDescr(catalog), @@ -546,6 +690,9 @@ AlterOperator(AlterOperatorStmt *stmt) address = makeOperatorDependencies(tup, false, true); + if (OidIsValid(commutatorOid) || OidIsValid(negatorOid)) + OperatorUpd(oprId, commutatorOid, negatorOid, false); + InvokeObjectPostAlterHook(OperatorRelationId, oprId, 0); table_close(catalog, NoLock); diff --git a/src/backend/commands/policy.c b/src/backend/commands/policy.c index 76a45e56bf913..6ff3eba8249d7 100644 --- a/src/backend/commands/policy.c +++ b/src/backend/commands/policy.c @@ -3,7 +3,7 @@ * policy.c * Commands for manipulating policies. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/commands/policy.c @@ -16,7 +16,6 @@ #include "access/htup.h" #include "access/htup_details.h" #include "access/relation.h" -#include "access/sysattr.h" #include "access/table.h" #include "access/xact.h" #include "catalog/catalog.h" @@ -29,7 +28,6 @@ #include "catalog/pg_type.h" #include "commands/policy.h" #include "miscadmin.h" -#include "nodes/makefuncs.h" #include "nodes/pg_list.h" #include "parser/parse_clause.h" #include "parser/parse_collate.h" @@ -37,7 +35,6 @@ #include "parser/parse_relation.h" #include "rewrite/rewriteManip.h" #include "rewrite/rowsecurity.h" -#include "storage/lock.h" #include "utils/acl.h" #include "utils/array.h" #include "utils/builtins.h" diff --git a/src/backend/commands/portalcmds.c b/src/backend/commands/portalcmds.c index 73ed7aa2f0ad4..4f6acf67198dd 100644 --- a/src/backend/commands/portalcmds.c +++ b/src/backend/commands/portalcmds.c @@ -9,7 +9,7 @@ * storage management for portals (but doesn't run any queries in them). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/commands/prepare.c b/src/backend/commands/prepare.c index 18f70319fc4eb..5e85585e9dd61 100644 --- a/src/backend/commands/prepare.c +++ b/src/backend/commands/prepare.c @@ -7,7 +7,7 @@ * accessed via the extended FE/BE query protocol. * * - * Copyright (c) 2002-2023, PostgreSQL Global Development Group + * Copyright (c) 2002-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/commands/prepare.c @@ -23,14 +23,11 @@ #include "commands/createas.h" #include "commands/prepare.h" #include "funcapi.h" -#include "miscadmin.h" #include "nodes/nodeFuncs.h" -#include "parser/analyze.h" #include "parser/parse_coerce.h" #include "parser/parse_collate.h" #include "parser/parse_expr.h" #include "parser/parse_type.h" -#include "rewrite/rewriteHandler.h" #include "tcop/pquery.h" #include "tcop/utility.h" #include "utils/builtins.h" @@ -583,6 +580,19 @@ ExplainExecuteQuery(ExecuteStmt *execstmt, IntoClause *into, ExplainState *es, instr_time planduration; BufferUsage bufusage_start, bufusage; + MemoryContextCounters mem_counters; + MemoryContext planner_ctx = NULL; + MemoryContext saved_ctx = NULL; + + if (es->memory) + { + /* See ExplainOneQuery about this */ + Assert(IsA(CurrentMemoryContext, AllocSetContext)); + planner_ctx = AllocSetContextCreate(CurrentMemoryContext, + "explain analyze planner context", + ALLOCSET_DEFAULT_SIZES); + saved_ctx = MemoryContextSwitchTo(planner_ctx); + } if (es->buffers) bufusage_start = pgBufferUsage; @@ -624,6 +634,12 @@ ExplainExecuteQuery(ExecuteStmt *execstmt, IntoClause *into, ExplainState *es, INSTR_TIME_SET_CURRENT(planduration); INSTR_TIME_SUBTRACT(planduration, planstart); + if (es->memory) + { + MemoryContextSwitchTo(saved_ctx); + MemoryContextMemConsumed(planner_ctx, &mem_counters); + } + /* calc differences of buffer counters. */ if (es->buffers) { @@ -640,7 +656,8 @@ ExplainExecuteQuery(ExecuteStmt *execstmt, IntoClause *into, ExplainState *es, if (pstmt->commandType != CMD_UTILITY) ExplainOnePlan(pstmt, into, es, query_string, paramLI, queryEnv, - &planduration, (es->buffers ? &bufusage : NULL)); + &planduration, (es->buffers ? &bufusage : NULL), + es->memory ? &mem_counters : NULL); else ExplainOneUtility(pstmt->utilityStmt, into, es, query_string, paramLI, queryEnv); diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c index 1debc9693e104..881f90017efd2 100644 --- a/src/backend/commands/proclang.c +++ b/src/backend/commands/proclang.c @@ -3,7 +3,7 @@ * proclang.c * PostgreSQL LANGUAGE support code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -19,10 +19,8 @@ #include "catalog/indexing.h" #include "catalog/objectaccess.h" #include "catalog/pg_language.h" -#include "catalog/pg_namespace.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" -#include "commands/defrem.h" #include "commands/proclang.h" #include "miscadmin.h" #include "parser/parse_func.h" diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index f4ba572697a26..6ea709988ee7d 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -3,7 +3,7 @@ * publicationcmds.c * publication manipulation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -14,7 +14,6 @@ #include "postgres.h" -#include "access/genam.h" #include "access/htup_details.h" #include "access/table.h" #include "access/xact.h" @@ -23,7 +22,6 @@ #include "catalog/namespace.h" #include "catalog/objectaccess.h" #include "catalog/objectaddress.h" -#include "catalog/partition.h" #include "catalog/pg_database.h" #include "catalog/pg_inherits.h" #include "catalog/pg_namespace.h" @@ -31,12 +29,10 @@ #include "catalog/pg_publication.h" #include "catalog/pg_publication_namespace.h" #include "catalog/pg_publication_rel.h" -#include "catalog/pg_type.h" #include "commands/dbcommands.h" #include "commands/defrem.h" #include "commands/event_trigger.h" #include "commands/publicationcmds.h" -#include "funcapi.h" #include "miscadmin.h" #include "nodes/nodeFuncs.h" #include "parser/parse_clause.h" @@ -44,10 +40,7 @@ #include "parser/parse_relation.h" #include "storage/lmgr.h" #include "utils/acl.h" -#include "utils/array.h" #include "utils/builtins.h" -#include "utils/catcache.h" -#include "utils/fmgroids.h" #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/rel.h" @@ -865,8 +858,8 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) if (wal_level != WAL_LEVEL_LOGICAL) ereport(WARNING, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("wal_level is insufficient to publish logical changes"), - errhint("Set wal_level to \"logical\" before creating subscriptions."))); + errmsg("\"wal_level\" is insufficient to publish logical changes"), + errhint("Set \"wal_level\" to \"logical\" before creating subscriptions."))); return myself; } diff --git a/src/backend/commands/schemacmds.c b/src/backend/commands/schemacmds.c index 6eb3dc6bab60f..233f8ad1d4473 100644 --- a/src/backend/commands/schemacmds.c +++ b/src/backend/commands/schemacmds.c @@ -3,7 +3,7 @@ * schemacmds.c * schema creation/manipulation commands * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/commands/seclabel.c b/src/backend/commands/seclabel.c index 7ff16e3276367..5607273bf9ff0 100644 --- a/src/backend/commands/seclabel.c +++ b/src/backend/commands/seclabel.c @@ -3,7 +3,7 @@ * seclabel.c * routines to support security label feature. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * ------------------------------------------------------------------------- diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index ef014496782ad..2b64a480e161e 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -3,7 +3,7 @@ * sequence.c * PostgreSQL sequences support code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,6 +18,7 @@ #include "access/htup_details.h" #include "access/multixact.h" #include "access/relation.h" +#include "access/sequence.h" #include "access/table.h" #include "access/transam.h" #include "access/xact.h" @@ -172,40 +173,27 @@ DefineSequence(ParseState *pstate, CreateSeqStmt *seq) stmt->tableElts = NIL; for (i = SEQ_COL_FIRSTCOL; i <= SEQ_COL_LASTCOL; i++) { - ColumnDef *coldef = makeNode(ColumnDef); - - coldef->inhcount = 0; - coldef->is_local = true; - coldef->is_not_null = true; - coldef->is_from_type = false; - coldef->storage = 0; - coldef->raw_default = NULL; - coldef->cooked_default = NULL; - coldef->collClause = NULL; - coldef->collOid = InvalidOid; - coldef->constraints = NIL; - coldef->location = -1; - - null[i - 1] = false; + ColumnDef *coldef = NULL; switch (i) { case SEQ_COL_LASTVAL: - coldef->typeName = makeTypeNameFromOid(INT8OID, -1); - coldef->colname = "last_value"; + coldef = makeColumnDef("last_value", INT8OID, -1, InvalidOid); value[i - 1] = Int64GetDatumFast(seqdataform.last_value); break; case SEQ_COL_LOG: - coldef->typeName = makeTypeNameFromOid(INT8OID, -1); - coldef->colname = "log_cnt"; + coldef = makeColumnDef("log_cnt", INT8OID, -1, InvalidOid); value[i - 1] = Int64GetDatum((int64) 0); break; case SEQ_COL_CALLED: - coldef->typeName = makeTypeNameFromOid(BOOLOID, -1); - coldef->colname = "is_called"; + coldef = makeColumnDef("is_called", BOOLOID, -1, InvalidOid); value[i - 1] = BoolGetDatum(false); break; } + + coldef->is_not_null = true; + null[i - 1] = false; + stmt->tableElts = lappend(stmt->tableElts, coldef); } @@ -221,7 +209,7 @@ DefineSequence(ParseState *pstate, CreateSeqStmt *seq) seqoid = address.objectId; Assert(seqoid != InvalidOid); - rel = table_open(seqoid, AccessExclusiveLock); + rel = sequence_open(seqoid, AccessExclusiveLock); tupDesc = RelationGetDescr(rel); /* now initialize the sequence's data */ @@ -232,7 +220,7 @@ DefineSequence(ParseState *pstate, CreateSeqStmt *seq) if (owned_by) process_owned_by(rel, owned_by, seq->for_identity); - table_close(rel, NoLock); + sequence_close(rel, NoLock); /* fill in pg_sequence */ rel = table_open(SequenceRelationId, RowExclusiveLock); @@ -337,7 +325,7 @@ ResetSequence(Oid seq_relid) /* Note that we do not change the currval() state */ elm->cached = elm->last; - relation_close(seq_rel, NoLock); + sequence_close(seq_rel, NoLock); } /* @@ -355,7 +343,7 @@ fill_seq_with_data(Relation rel, HeapTuple tuple) { SMgrRelation srel; - srel = smgropen(rel->rd_locator, InvalidBackendId); + srel = smgropen(rel->rd_locator, INVALID_PROC_NUMBER); smgrcreate(srel, INIT_FORKNUM, false); log_smgrcreate(&rel->rd_locator, INIT_FORKNUM); fill_seq_fork_with_data(rel, tuple, INIT_FORKNUM); @@ -377,7 +365,7 @@ fill_seq_fork_with_data(Relation rel, HeapTuple tuple, ForkNumber forkNum) /* Initialize first page of relation with special magic number */ - buf = ExtendBufferedRel(EB_REL(rel), forkNum, NULL, + buf = ExtendBufferedRel(BMR_REL(rel), forkNum, NULL, EB_LOCK_FIRST | EB_SKIP_EXTENSION_LOCK); Assert(BufferGetBlockNumber(buf) == 0); @@ -487,7 +475,7 @@ AlterSequence(ParseState *pstate, AlterSeqStmt *stmt) seqform = (Form_pg_sequence) GETSTRUCT(seqtuple); - /* lock page's buffer and read tuple into new sequence structure */ + /* lock page buffer and read tuple into new sequence structure */ (void) read_seq_tuple(seqrel, &buf, &datatuple); /* copy the existing sequence data tuple, so it can be modified locally */ @@ -501,10 +489,6 @@ AlterSequence(ParseState *pstate, AlterSeqStmt *stmt) seqform, newdataform, &need_seq_rewrite, &owned_by); - /* Clear local cache so that we don't think we have cached numbers */ - /* Note that we do not change the currval() state */ - elm->cached = elm->last; - /* If needed, rewrite the sequence relation itself */ if (need_seq_rewrite) { @@ -532,6 +516,10 @@ AlterSequence(ParseState *pstate, AlterSeqStmt *stmt) fill_seq_with_data(seqrel, newdatatuple); } + /* Clear local cache so that we don't think we have cached numbers */ + /* Note that we do not change the currval() state */ + elm->cached = elm->last; + /* process OWNED BY if given */ if (owned_by) process_owned_by(seqrel, owned_by, stmt->for_identity); @@ -544,7 +532,7 @@ AlterSequence(ParseState *pstate, AlterSeqStmt *stmt) ObjectAddressSet(address, RelationRelationId, relid); table_close(rel, RowExclusiveLock); - relation_close(seqrel, NoLock); + sequence_close(seqrel, NoLock); return address; } @@ -557,6 +545,13 @@ SequenceChangePersistence(Oid relid, char newrelpersistence) Buffer buf; HeapTupleData seqdatatuple; + /* + * ALTER SEQUENCE acquires this lock earlier. If we're processing an + * owned sequence for ALTER TABLE, lock now. Without the lock, we'd + * discard increments from nextval() calls (in other sessions) between + * this function's buffer unlock and this transaction's commit. + */ + LockRelationOid(relid, AccessExclusiveLock); init_sequence(relid, &elm, &seqrel); /* check the comment above nextval_internal()'s equivalent call. */ @@ -568,7 +563,7 @@ SequenceChangePersistence(Oid relid, char newrelpersistence) fill_seq_with_data(seqrel, &seqdatatuple); UnlockReleaseBuffer(buf); - relation_close(seqrel, NoLock); + sequence_close(seqrel, NoLock); } void @@ -675,7 +670,7 @@ nextval_internal(Oid relid, bool check_permissions) Assert(elm->last_valid); Assert(elm->increment != 0); elm->last += elm->increment; - relation_close(seqrel, NoLock); + sequence_close(seqrel, NoLock); last_used_seq = elm; return elm->last; } @@ -691,11 +686,10 @@ nextval_internal(Oid relid, bool check_permissions) cycle = pgsform->seqcycle; ReleaseSysCache(pgstuple); - /* lock page' buffer and read tuple */ + /* lock page buffer and read tuple */ seq = read_seq_tuple(seqrel, &buf, &seqdatatuple); page = BufferGetPage(buf); - elm->increment = incby; last = next = result = seq->last_value; fetch = cache; log = seq->log_cnt; @@ -793,6 +787,7 @@ nextval_internal(Oid relid, bool check_permissions) Assert(log >= 0); /* save info in local cache */ + elm->increment = incby; elm->last = result; /* last returned number */ elm->cached = last; /* last fetched number */ elm->last_valid = true; @@ -862,7 +857,7 @@ nextval_internal(Oid relid, bool check_permissions) UnlockReleaseBuffer(buf); - relation_close(seqrel, NoLock); + sequence_close(seqrel, NoLock); return result; } @@ -893,7 +888,7 @@ currval_oid(PG_FUNCTION_ARGS) result = elm->last; - relation_close(seqrel, NoLock); + sequence_close(seqrel, NoLock); PG_RETURN_INT64(result); } @@ -928,7 +923,7 @@ lastval(PG_FUNCTION_ARGS) RelationGetRelationName(seqrel)))); result = last_used_seq->last; - relation_close(seqrel, NoLock); + sequence_close(seqrel, NoLock); PG_RETURN_INT64(result); } @@ -987,7 +982,7 @@ do_setval(Oid relid, int64 next, bool iscalled) */ PreventCommandIfParallelMode("setval()"); - /* lock page' buffer and read tuple */ + /* lock page buffer and read tuple */ seq = read_seq_tuple(seqrel, &buf, &seqdatatuple); if ((next < minv) || (next > maxv)) @@ -1043,7 +1038,7 @@ do_setval(Oid relid, int64 next, bool iscalled) UnlockReleaseBuffer(buf); - relation_close(seqrel, NoLock); + sequence_close(seqrel, NoLock); } /* @@ -1089,7 +1084,7 @@ setval3_oid(PG_FUNCTION_ARGS) static Relation lock_and_open_sequence(SeqTable seq) { - LocalTransactionId thislxid = MyProc->lxid; + LocalTransactionId thislxid = MyProc->vxid.lxid; /* Get the lock if not already held in this xact */ if (seq->lxid != thislxid) @@ -1108,7 +1103,7 @@ lock_and_open_sequence(SeqTable seq) } /* We now know we have the lock, and can safely open the rel */ - return relation_open(seq->relid, NoLock); + return sequence_open(seq->relid, NoLock); } /* @@ -1165,12 +1160,6 @@ init_sequence(Oid relid, SeqTable *p_elm, Relation *p_rel) */ seqrel = lock_and_open_sequence(elm); - if (seqrel->rd_rel->relkind != RELKIND_SEQUENCE) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not a sequence", - RelationGetRelationName(seqrel)))); - /* * If the sequence has been transactionally replaced since we last saw it, * discard any cached-but-unissued values. We do not touch the currval() @@ -1358,7 +1347,10 @@ init_params(ParseState *pstate, List *options, bool for_identity, /* * The parser allows this, but it is only for identity columns, in * which case it is filtered out in parse_utilcmd.c. We only get - * here if someone puts it into a CREATE SEQUENCE. + * here if someone puts it into a CREATE SEQUENCE, where it'd be + * redundant. (The same is true for the equally-nonstandard + * LOGGED and UNLOGGED options, but for those, the default error + * below seems sufficient.) */ ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -1718,7 +1710,7 @@ sequence_options(Oid relid) Form_pg_sequence pgsform; List *options = NIL; - pgstuple = SearchSysCache1(SEQRELID, relid); + pgstuple = SearchSysCache1(SEQRELID, ObjectIdGetDatum(relid)); if (!HeapTupleIsValid(pgstuple)) elog(ERROR, "cache lookup failed for sequence %u", relid); pgsform = (Form_pg_sequence) GETSTRUCT(pgstuple); @@ -1766,7 +1758,7 @@ pg_sequence_parameters(PG_FUNCTION_ARGS) memset(isnull, 0, sizeof(isnull)); - pgstuple = SearchSysCache1(SEQRELID, relid); + pgstuple = SearchSysCache1(SEQRELID, ObjectIdGetDatum(relid)); if (!HeapTupleIsValid(pgstuple)) elog(ERROR, "cache lookup failed for sequence %u", relid); pgsform = (Form_pg_sequence) GETSTRUCT(pgstuple); @@ -1795,11 +1787,8 @@ pg_sequence_last_value(PG_FUNCTION_ARGS) Oid relid = PG_GETARG_OID(0); SeqTable elm; Relation seqrel; - Buffer buf; - HeapTupleData seqtuple; - Form_pg_sequence_data seq; - bool is_called; - int64 result; + bool is_called = false; + int64 result = 0; /* open and lock sequence */ init_sequence(relid, &elm, &seqrel); @@ -1810,13 +1799,29 @@ pg_sequence_last_value(PG_FUNCTION_ARGS) errmsg("permission denied for sequence %s", RelationGetRelationName(seqrel)))); - seq = read_seq_tuple(seqrel, &buf, &seqtuple); + /* + * We return NULL for other sessions' temporary sequences. The + * pg_sequences system view already filters those out, but this offers a + * defense against ERRORs in case someone invokes this function directly. + * + * Also, for the benefit of the pg_sequences view, we return NULL for + * unlogged sequences on standbys instead of throwing an error. + */ + if (!RELATION_IS_OTHER_TEMP(seqrel) && + (RelationIsPermanent(seqrel) || !RecoveryInProgress())) + { + Buffer buf; + HeapTupleData seqtuple; + Form_pg_sequence_data seq; + + seq = read_seq_tuple(seqrel, &buf, &seqtuple); - is_called = seq->is_called; - result = seq->last_value; + is_called = seq->is_called; + result = seq->last_value; - UnlockReleaseBuffer(buf); - relation_close(seqrel, NoLock); + UnlockReleaseBuffer(buf); + } + sequence_close(seqrel, NoLock); if (is_called) PG_RETURN_INT64(result); diff --git a/src/backend/commands/statscmds.c b/src/backend/commands/statscmds.c index 26ebd0819d625..1db3ef69d22fc 100644 --- a/src/backend/commands/statscmds.c +++ b/src/backend/commands/statscmds.c @@ -3,7 +3,7 @@ * statscmds.c * Commands for creating and altering extended statistics objects * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -14,9 +14,7 @@ */ #include "postgres.h" -#include "access/heapam.h" #include "access/relation.h" -#include "access/relscan.h" #include "access/table.h" #include "catalog/catalog.h" #include "catalog/dependency.h" @@ -32,11 +30,10 @@ #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" #include "statistics/statistics.h" +#include "utils/acl.h" #include "utils/builtins.h" -#include "utils/lsyscache.h" -#include "utils/fmgroids.h" #include "utils/inval.h" -#include "utils/memutils.h" +#include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/syscache.h" #include "utils/typcache.h" @@ -498,9 +495,9 @@ CreateStatistics(CreateStatsStmt *stmt) values[Anum_pg_statistic_ext_stxrelid - 1] = ObjectIdGetDatum(relid); values[Anum_pg_statistic_ext_stxname - 1] = NameGetDatum(&stxname); values[Anum_pg_statistic_ext_stxnamespace - 1] = ObjectIdGetDatum(namespaceId); - values[Anum_pg_statistic_ext_stxstattarget - 1] = Int32GetDatum(-1); values[Anum_pg_statistic_ext_stxowner - 1] = ObjectIdGetDatum(stxowner); values[Anum_pg_statistic_ext_stxkeys - 1] = PointerGetDatum(stxkeys); + nulls[Anum_pg_statistic_ext_stxstattarget - 1] = true; values[Anum_pg_statistic_ext_stxkind - 1] = PointerGetDatum(stxkind); values[Anum_pg_statistic_ext_stxexprs - 1] = exprsDatum; @@ -609,23 +606,36 @@ AlterStatistics(AlterStatsStmt *stmt) bool repl_null[Natts_pg_statistic_ext]; bool repl_repl[Natts_pg_statistic_ext]; ObjectAddress address; - int newtarget = stmt->stxstattarget; + int newtarget = 0; + bool newtarget_default; - /* Limit statistics target to a sane range */ - if (newtarget < -1) + /* -1 was used in previous versions for the default setting */ + if (stmt->stxstattarget && intVal(stmt->stxstattarget) != -1) { - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("statistics target %d is too low", - newtarget))); + newtarget = intVal(stmt->stxstattarget); + newtarget_default = false; } - else if (newtarget > 10000) + else + newtarget_default = true; + + if (!newtarget_default) { - newtarget = 10000; - ereport(WARNING, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("lowering statistics target to %d", - newtarget))); + /* Limit statistics target to a sane range */ + if (newtarget < 0) + { + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("statistics target %d is too low", + newtarget))); + } + else if (newtarget > MAX_STATISTICS_TARGET) + { + newtarget = MAX_STATISTICS_TARGET; + ereport(WARNING, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("lowering statistics target to %d", + newtarget))); + } } /* lookup OID of the statistics object */ @@ -676,7 +686,10 @@ AlterStatistics(AlterStatsStmt *stmt) /* replace the stxstattarget column */ repl_repl[Anum_pg_statistic_ext_stxstattarget - 1] = true; - repl_val[Anum_pg_statistic_ext_stxstattarget - 1] = Int32GetDatum(newtarget); + if (!newtarget_default) + repl_val[Anum_pg_statistic_ext_stxstattarget - 1] = Int16GetDatum(newtarget); + else + repl_null[Anum_pg_statistic_ext_stxstattarget - 1] = true; newtup = heap_modify_tuple(oldtup, RelationGetDescr(rel), repl_val, repl_null, repl_repl); @@ -734,18 +747,11 @@ void RemoveStatisticsById(Oid statsOid) { Relation relation; + Relation rel; HeapTuple tup; Form_pg_statistic_ext statext; Oid relid; - /* - * First delete the pg_statistic_ext_data tuples holding the actual - * statistical data. There might be data with/without inheritance, so - * attempt deleting both. - */ - RemoveStatisticsDataById(statsOid, true); - RemoveStatisticsDataById(statsOid, false); - /* * Delete the pg_statistic_ext tuple. Also send out a cache inval on the * associated table, so that dependent plans will be rebuilt. @@ -760,12 +766,26 @@ RemoveStatisticsById(Oid statsOid) statext = (Form_pg_statistic_ext) GETSTRUCT(tup); relid = statext->stxrelid; + /* + * Delete the pg_statistic_ext_data tuples holding the actual statistical + * data. There might be data with/without inheritance, so attempt deleting + * both. We lock the user table first, to prevent other processes (e.g. + * DROP STATISTICS) from removing the row concurrently. + */ + rel = table_open(relid, ShareUpdateExclusiveLock); + + RemoveStatisticsDataById(statsOid, true); + RemoveStatisticsDataById(statsOid, false); + CacheInvalidateRelcacheByRelid(relid); CatalogTupleDelete(relation, &tup->t_self); ReleaseSysCache(tup); + /* Keep lock until the end of the transaction. */ + table_close(rel, NoLock); + table_close(relation, RowExclusiveLock); } diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 54895ba929a98..9467f58a23df3 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -3,7 +3,7 @@ * subscriptioncmds.c * subscription catalog manipulation functions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -69,8 +69,9 @@ #define SUBOPT_DISABLE_ON_ERR 0x00000400 #define SUBOPT_PASSWORD_REQUIRED 0x00000800 #define SUBOPT_RUN_AS_OWNER 0x00001000 -#define SUBOPT_LSN 0x00002000 -#define SUBOPT_ORIGIN 0x00004000 +#define SUBOPT_FAILOVER 0x00002000 +#define SUBOPT_LSN 0x00004000 +#define SUBOPT_ORIGIN 0x00008000 /* check if the 'val' has 'bits' set */ #define IsSet(val, bits) (((val) & (bits)) == (bits)) @@ -95,6 +96,7 @@ typedef struct SubOpts bool disableonerr; bool passwordrequired; bool runasowner; + bool failover; char *origin; XLogRecPtr lsn; } SubOpts; @@ -155,6 +157,8 @@ parse_subscription_options(ParseState *pstate, List *stmt_options, opts->passwordrequired = true; if (IsSet(supported_opts, SUBOPT_RUN_AS_OWNER)) opts->runasowner = false; + if (IsSet(supported_opts, SUBOPT_FAILOVER)) + opts->failover = false; if (IsSet(supported_opts, SUBOPT_ORIGIN)) opts->origin = pstrdup(LOGICALREP_ORIGIN_ANY); @@ -303,6 +307,15 @@ parse_subscription_options(ParseState *pstate, List *stmt_options, opts->specified_opts |= SUBOPT_RUN_AS_OWNER; opts->runasowner = defGetBoolean(defel); } + else if (IsSet(supported_opts, SUBOPT_FAILOVER) && + strcmp(defel->defname, "failover") == 0) + { + if (IsSet(opts->specified_opts, SUBOPT_FAILOVER)) + errorConflictingDefElem(defel, pstate); + + opts->specified_opts |= SUBOPT_FAILOVER; + opts->failover = defGetBoolean(defel); + } else if (IsSet(supported_opts, SUBOPT_ORIGIN) && strcmp(defel->defname, "origin") == 0) { @@ -486,8 +499,7 @@ check_publications(WalReceiverConn *wrconn, List *publications) appendStringInfoChar(cmd, ')'); res = walrcv_exec(wrconn, cmd->data, 1, tableRow); - pfree(cmd->data); - pfree(cmd); + destroyStringInfo(cmd); if (res->status != WALRCV_OK_TUPLES) ereport(ERROR, @@ -591,7 +603,7 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, SUBOPT_SYNCHRONOUS_COMMIT | SUBOPT_BINARY | SUBOPT_STREAMING | SUBOPT_TWOPHASE_COMMIT | SUBOPT_DISABLE_ON_ERR | SUBOPT_PASSWORD_REQUIRED | - SUBOPT_RUN_AS_OWNER | SUBOPT_ORIGIN); + SUBOPT_RUN_AS_OWNER | SUBOPT_FAILOVER | SUBOPT_ORIGIN); parse_subscription_options(pstate, stmt->options, supported_opts, &opts); /* @@ -697,6 +709,7 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, values[Anum_pg_subscription_subdisableonerr - 1] = BoolGetDatum(opts.disableonerr); values[Anum_pg_subscription_subpasswordrequired - 1] = BoolGetDatum(opts.passwordrequired); values[Anum_pg_subscription_subrunasowner - 1] = BoolGetDatum(opts.runasowner); + values[Anum_pg_subscription_subfailover - 1] = BoolGetDatum(opts.failover); values[Anum_pg_subscription_subconninfo - 1] = CStringGetTextDatum(conninfo); if (opts.slot_name) @@ -737,7 +750,7 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, /* Try to connect to the publisher. */ must_use_password = !superuser_arg(owner) && opts.passwordrequired; - wrconn = walrcv_connect(conninfo, true, must_use_password, + wrconn = walrcv_connect(conninfo, true, true, must_use_password, stmt->subname, &err); if (!wrconn) ereport(ERROR, @@ -773,7 +786,7 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, rv->schemaname, rv->relname); AddSubscriptionRelState(subid, relid, table_state, - InvalidXLogRecPtr); + InvalidXLogRecPtr, true); } /* @@ -807,7 +820,7 @@ CreateSubscription(ParseState *pstate, CreateSubscriptionStmt *stmt, twophase_enabled = true; walrcv_create_slot(wrconn, opts.slot_name, false, twophase_enabled, - CRS_NOEXPORT_SNAPSHOT, NULL); + opts.failover, CRS_NOEXPORT_SNAPSHOT, NULL); if (twophase_enabled) UpdateTwoPhaseState(subid, LOGICALREP_TWOPHASE_STATE_ENABLED); @@ -869,8 +882,8 @@ AlterSubscription_refresh(Subscription *sub, bool copy_data, load_file("libpqwalreceiver", false); /* Try to connect to the publisher. */ - must_use_password = !superuser_arg(sub->owner) && sub->passwordrequired; - wrconn = walrcv_connect(sub->conninfo, true, must_use_password, + must_use_password = sub->passwordrequired && !sub->ownersuperuser; + wrconn = walrcv_connect(sub->conninfo, true, true, must_use_password, sub->name, &err); if (!wrconn) ereport(ERROR, @@ -943,7 +956,7 @@ AlterSubscription_refresh(Subscription *sub, bool copy_data, { AddSubscriptionRelState(sub->oid, relid, copy_data ? SUBREL_STATE_INIT : SUBREL_STATE_READY, - InvalidXLogRecPtr); + InvalidXLogRecPtr, true); ereport(DEBUG1, (errmsg_internal("table \"%s.%s\" added to subscription \"%s\"", rv->schemaname, rv->relname, sub->name))); @@ -1132,7 +1145,8 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, SUBOPT_SYNCHRONOUS_COMMIT | SUBOPT_BINARY | SUBOPT_STREAMING | SUBOPT_DISABLE_ON_ERR | SUBOPT_PASSWORD_REQUIRED | - SUBOPT_RUN_AS_OWNER | SUBOPT_ORIGIN); + SUBOPT_RUN_AS_OWNER | SUBOPT_FAILOVER | + SUBOPT_ORIGIN); parse_subscription_options(pstate, stmt->options, supported_opts, &opts); @@ -1204,6 +1218,44 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, = true; } + if (IsSet(opts.specified_opts, SUBOPT_RUN_AS_OWNER)) + { + values[Anum_pg_subscription_subrunasowner - 1] = + BoolGetDatum(opts.runasowner); + replaces[Anum_pg_subscription_subrunasowner - 1] = true; + } + + if (IsSet(opts.specified_opts, SUBOPT_FAILOVER)) + { + if (!sub->slotname) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot set option \"%s\" for a subscription that does not have a slot name", + "failover"))); + + /* + * Do not allow changing the failover state if the + * subscription is enabled. This is because the failover + * state of the slot on the publisher cannot be modified + * if the slot is currently acquired by the apply worker. + */ + if (sub->enabled) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot set %s for enabled subscription", + "failover"))); + + /* + * The changed failover option of the slot can't be rolled + * back. + */ + PreventInTransactionBlock(isTopLevel, "ALTER SUBSCRIPTION ... SET (failover)"); + + values[Anum_pg_subscription_subfailover - 1] = + BoolGetDatum(opts.failover); + replaces[Anum_pg_subscription_subfailover - 1] = true; + } + if (IsSet(opts.specified_opts, SUBOPT_ORIGIN)) { values[Anum_pg_subscription_suborigin - 1] = @@ -1242,7 +1294,7 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, load_file("libpqwalreceiver", false); /* Check the connection info string. */ walrcv_check_conninfo(stmt->conninfo, - sub->passwordrequired && !superuser_arg(sub->owner)); + sub->passwordrequired && !sub->ownersuperuser); values[Anum_pg_subscription_subconninfo - 1] = CStringGetTextDatum(stmt->conninfo); @@ -1446,6 +1498,42 @@ AlterSubscription(ParseState *pstate, AlterSubscriptionStmt *stmt, heap_freetuple(tup); } + /* + * Try to acquire the connection necessary for altering slot. + * + * This has to be at the end because otherwise if there is an error while + * doing the database operations we won't be able to rollback altered + * slot. + */ + if (replaces[Anum_pg_subscription_subfailover - 1]) + { + bool must_use_password; + char *err; + WalReceiverConn *wrconn; + + /* Load the library providing us libpq calls. */ + load_file("libpqwalreceiver", false); + + /* Try to connect to the publisher. */ + must_use_password = sub->passwordrequired && !sub->ownersuperuser; + wrconn = walrcv_connect(sub->conninfo, true, true, must_use_password, + sub->name, &err); + if (!wrconn) + ereport(ERROR, + (errcode(ERRCODE_CONNECTION_FAILURE), + errmsg("could not connect to the publisher: %s", err))); + + PG_TRY(); + { + walrcv_alter_slot(wrconn, sub->slotname, opts.failover); + } + PG_FINALLY(); + { + walrcv_disconnect(wrconn); + } + PG_END_TRY(); + } + table_close(rel, RowExclusiveLock); ObjectAddressSet(myself, SubscriptionRelationId, subid); @@ -1646,6 +1734,12 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) ReplicationOriginNameForLogicalRep(subid, InvalidOid, originname, sizeof(originname)); replorigin_drop_by_name(originname, true, false); + /* + * Tell the cumulative stats system that the subscription is getting + * dropped. + */ + pgstat_drop_subscription(subid); + /* * If there is no slot associated with the subscription, we can finish * here. @@ -1669,7 +1763,7 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) */ load_file("libpqwalreceiver", false); - wrconn = walrcv_connect(conninfo, true, must_use_password, + wrconn = walrcv_connect(conninfo, true, true, must_use_password, subname, &err); if (wrconn == NULL) { @@ -1734,12 +1828,6 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel) } PG_END_TRY(); - /* - * Tell the cumulative stats system that the subscription is getting - * dropped. - */ - pgstat_drop_subscription(subid); - table_close(rel, NoLock); } @@ -1924,11 +2012,12 @@ AlterSubscriptionOwner_oid(Oid subid, Oid newOwnerId) } /* - * Check and log a warning if the publisher has subscribed to the same table - * from some other publisher. This check is required only if "copy_data = true" - * and "origin = none" for CREATE SUBSCRIPTION and - * ALTER SUBSCRIPTION ... REFRESH statements to notify the user that data - * having origin might have been copied. + * Check and log a warning if the publisher has subscribed to the same table, + * its partition ancestors (if it's a partition), or its partition children (if + * it's a partitioned table), from some other publishers. This check is + * required only if "copy_data = true" and "origin = none" for CREATE + * SUBSCRIPTION and ALTER SUBSCRIPTION ... REFRESH statements to notify the + * user that data having origin might have been copied. * * This check need not be performed on the tables that are already added * because incremental sync for those tables will happen through WAL and the @@ -1958,7 +2047,9 @@ check_publications_origin(WalReceiverConn *wrconn, List *publications, "SELECT DISTINCT P.pubname AS pubname\n" "FROM pg_publication P,\n" " LATERAL pg_get_publication_tables(P.pubname) GPT\n" - " JOIN pg_subscription_rel PS ON (GPT.relid = PS.srrelid),\n" + " JOIN pg_subscription_rel PS ON (GPT.relid = PS.srrelid OR" + " GPT.relid IN (SELECT relid FROM pg_partition_ancestors(PS.srrelid) UNION" + " SELECT relid FROM pg_partition_tree(PS.srrelid))),\n" " pg_class C JOIN pg_namespace N ON (N.oid = C.relnamespace)\n" "WHERE C.oid = GPT.relid AND P.pubname IN ("); get_publications_str(publications, &cmd, true); @@ -2023,8 +2114,8 @@ check_publications_origin(WalReceiverConn *wrconn, List *publications, errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("subscription \"%s\" requested copy_data with origin = NONE but might copy data that had a different origin", subname), - errdetail_plural("Subscribed publication %s is subscribing to other publications.", - "Subscribed publications %s are subscribing to other publications.", + errdetail_plural("The subscription being created subscribes to a publication (%s) that contains tables that are written to by other subscriptions.", + "The subscription being created subscribes to publications (%s) that contain tables that are written to by other subscriptions.", list_length(publist), pubnames->data), errhint("Verify that initial data copied from the publisher tables did not come from other origins.")); } diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index d985278ac6b4e..e6606e5e57a4c 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -3,7 +3,7 @@ * tablecmds.c * Commands for creating and altering table structures and settings * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -43,6 +43,10 @@ #include "catalog/pg_largeobject.h" #include "catalog/pg_namespace.h" #include "catalog/pg_opclass.h" +#include "catalog/pg_policy.h" +#include "catalog/pg_proc.h" +#include "catalog/pg_publication_rel.h" +#include "catalog/pg_rewrite.h" #include "catalog/pg_statistic_ext.h" #include "catalog/pg_tablespace.h" #include "catalog/pg_trigger.h" @@ -54,13 +58,13 @@ #include "commands/comment.h" #include "commands/defrem.h" #include "commands/event_trigger.h" -#include "commands/policy.h" #include "commands/sequence.h" #include "commands/tablecmds.h" #include "commands/tablespace.h" #include "commands/trigger.h" #include "commands/typecmds.h" #include "commands/user.h" +#include "commands/vacuum.h" #include "executor/executor.h" #include "foreign/fdwapi.h" #include "foreign/foreign.h" @@ -69,11 +73,9 @@ #include "nodes/nodeFuncs.h" #include "nodes/parsenodes.h" #include "optimizer/optimizer.h" -#include "parser/parse_clause.h" #include "parser/parse_coerce.h" #include "parser/parse_collate.h" #include "parser/parse_expr.h" -#include "parser/parse_oper.h" #include "parser/parse_relation.h" #include "parser/parse_type.h" #include "parser/parse_utilcmd.h" @@ -141,20 +143,25 @@ static List *on_commits = NIL; * a pass determined by subcommand type. */ -#define AT_PASS_UNSET -1 /* UNSET will cause ERROR */ -#define AT_PASS_DROP 0 /* DROP (all flavors) */ -#define AT_PASS_ALTER_TYPE 1 /* ALTER COLUMN TYPE */ -#define AT_PASS_OLD_INDEX 2 /* re-add existing indexes */ -#define AT_PASS_OLD_CONSTR 3 /* re-add existing constraints */ -/* We could support a RENAME COLUMN pass here, but not currently used */ -#define AT_PASS_ADD_COL 4 /* ADD COLUMN */ -#define AT_PASS_ADD_CONSTR 5 /* ADD constraints (initial examination) */ -#define AT_PASS_COL_ATTRS 6 /* set column attributes, eg NOT NULL */ -#define AT_PASS_ADD_INDEXCONSTR 7 /* ADD index-based constraints */ -#define AT_PASS_ADD_INDEX 8 /* ADD indexes */ -#define AT_PASS_ADD_OTHERCONSTR 9 /* ADD other constraints, defaults */ -#define AT_PASS_MISC 10 /* other stuff */ -#define AT_NUM_PASSES 11 +typedef enum AlterTablePass +{ + AT_PASS_UNSET = -1, /* UNSET will cause ERROR */ + AT_PASS_DROP, /* DROP (all flavors) */ + AT_PASS_ALTER_TYPE, /* ALTER COLUMN TYPE */ + AT_PASS_ADD_COL, /* ADD COLUMN */ + AT_PASS_SET_EXPRESSION, /* ALTER SET EXPRESSION */ + AT_PASS_OLD_INDEX, /* re-add existing indexes */ + AT_PASS_OLD_CONSTR, /* re-add existing constraints */ + /* We could support a RENAME COLUMN pass here, but not currently used */ + AT_PASS_ADD_CONSTR, /* ADD constraints (initial examination) */ + AT_PASS_COL_ATTRS, /* set column attributes, eg NOT NULL */ + AT_PASS_ADD_INDEXCONSTR, /* ADD index-based constraints */ + AT_PASS_ADD_INDEX, /* ADD indexes */ + AT_PASS_ADD_OTHERCONSTR, /* ADD other constraints, defaults */ + AT_PASS_MISC, /* other stuff */ +} AlterTablePass; + +#define AT_NUM_PASSES (AT_PASS_MISC + 1) typedef struct AlteredTableInfo { @@ -180,7 +187,9 @@ typedef struct AlteredTableInfo List *afterStmts; /* List of utility command parsetrees */ bool verify_new_notnull; /* T if we should recheck NOT NULL */ int rewrite; /* Reason for forced rewrite, if any */ - Oid newAccessMethod; /* new access method; 0 means no change */ + bool chgAccessMethod; /* T if SET ACCESS METHOD is used */ + Oid newAccessMethod; /* new access method; 0 means no change, + * if above is true */ Oid newTableSpace; /* new tablespace; 0 means no change */ bool chgPersistence; /* T if SET LOGGED/UNLOGGED is used */ char newrelpersistence; /* if above is true */ @@ -199,7 +208,7 @@ typedef struct AlteredTableInfo } AlteredTableInfo; /* Struct describing one new constraint to check in Phase 3 scan */ -/* Note: new NOT NULL constraints are handled elsewhere */ +/* Note: new not-null constraints are handled elsewhere */ typedef struct NewConstraint { char *name; /* Constraint name, or NULL if none */ @@ -336,6 +345,14 @@ typedef struct ForeignTruncateInfo List *rels; } ForeignTruncateInfo; +/* Partial or complete FK creation in addFkConstraint() */ +typedef enum addFkConstraintSides +{ + addFkReferencedSide, + addFkReferencingSide, + addFkBothSides, +} addFkConstraintSides; + /* * Partition tables are expected to be dropped when the parent partitioned * table gets dropped. Hence for partitioning we use AUTO dependency. @@ -349,17 +366,19 @@ static void truncate_check_perms(Oid relid, Form_pg_class reltuple); static void truncate_check_activity(Relation rel); static void RangeVarCallbackForTruncate(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg); -static List *MergeAttributes(List *schema, List *supers, char relpersistence, +static List *MergeAttributes(List *columns, const List *supers, char relpersistence, bool is_partition, List **supconstr); -static bool MergeCheckConstraint(List *constraints, char *name, Node *expr); -static void MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel); +static List *MergeCheckConstraint(List *constraints, const char *name, Node *expr); +static void MergeChildAttribute(List *inh_columns, int exist_attno, int newcol_attno, const ColumnDef *newdef); +static ColumnDef *MergeInheritedAttribute(List *inh_columns, int exist_attno, const ColumnDef *newdef); +static void MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel, bool ispartition); static void MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel); static void StoreCatalogInheritance(Oid relationId, List *supers, bool child_is_partition); static void StoreCatalogInheritance1(Oid relationId, Oid parentOid, int32 seqNumber, Relation inhRelation, bool child_is_partition); -static int findAttrByName(const char *attributeName, List *schema); +static int findAttrByName(const char *attributeName, const List *columns); static void AlterIndexNamespaces(Relation classRel, Relation rel, Oid oldNspOid, Oid newNspOid, ObjectAddresses *objsMoved); static void AlterSeqNamespaces(Relation classRel, Relation rel, @@ -388,6 +407,7 @@ static CoercionPathType findFkeyCast(Oid targetTypeId, Oid sourceTypeId, static void validateForeignKeyConstraint(char *conname, Relation rel, Relation pkrel, Oid pkindOid, Oid constraintOid); +static void CheckAlterTableIsSafe(Relation rel); static void ATController(AlterTableStmt *parsetree, Relation rel, List *cmds, bool recurse, LOCKMODE lockmode, AlterTableUtilityContext *context); @@ -397,12 +417,12 @@ static void ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, static void ATRewriteCatalogs(List **wqueue, LOCKMODE lockmode, AlterTableUtilityContext *context); static void ATExecCmd(List **wqueue, AlteredTableInfo *tab, - AlterTableCmd *cmd, LOCKMODE lockmode, int cur_pass, + AlterTableCmd *cmd, LOCKMODE lockmode, AlterTablePass cur_pass, AlterTableUtilityContext *context); static AlterTableCmd *ATParseTransformCmd(List **wqueue, AlteredTableInfo *tab, Relation rel, AlterTableCmd *cmd, bool recurse, LOCKMODE lockmode, - int cur_pass, + AlterTablePass cur_pass, AlterTableUtilityContext *context); static void ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, @@ -425,7 +445,7 @@ static void ATPrepAddColumn(List **wqueue, Relation rel, bool recurse, bool recu static ObjectAddress ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, AlterTableCmd **cmd, bool recurse, bool recursing, - LOCKMODE lockmode, int cur_pass, + LOCKMODE lockmode, AlterTablePass cur_pass, AlterTableUtilityContext *context); static bool check_for_column_name_collision(Relation rel, const char *colname, bool if_not_exists); @@ -449,10 +469,13 @@ static ObjectAddress ATExecColumnDefault(Relation rel, const char *colName, static ObjectAddress ATExecCookedColumnDefault(Relation rel, AttrNumber attnum, Node *newDefault); static ObjectAddress ATExecAddIdentity(Relation rel, const char *colName, - Node *def, LOCKMODE lockmode); + Node *def, LOCKMODE lockmode, bool recurse, bool recursing); static ObjectAddress ATExecSetIdentity(Relation rel, const char *colName, - Node *def, LOCKMODE lockmode); -static ObjectAddress ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE lockmode); + Node *def, LOCKMODE lockmode, bool recurse, bool recursing); +static ObjectAddress ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE lockmode, + bool recurse, bool recursing); +static ObjectAddress ATExecSetExpression(AlteredTableInfo *tab, Relation rel, const char *colName, + Node *newExpr, LOCKMODE lockmode); static void ATPrepDropExpression(Relation rel, AlterTableCmd *cmd, bool recurse, bool recursing, LOCKMODE lockmode); static ObjectAddress ATExecDropExpression(Relation rel, const char *colName, bool missing_ok, LOCKMODE lockmode); static ObjectAddress ATExecSetStatistics(Relation rel, const char *colName, int16 colNum, @@ -489,16 +512,25 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo * Relation rel, Constraint *fkconstraint, bool recurse, bool recursing, LOCKMODE lockmode); -static ObjectAddress addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, - Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, - int numfks, int16 *pkattnum, int16 *fkattnum, - Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, - int numfkdelsetcols, int16 *fkdelsetcols, - bool old_check_ok, - Oid parentDelTrigger, Oid parentUpdTrigger); -static void validateFkOnDeleteSetColumns(int numfks, const int16 *fkattnums, - int numfksetcols, const int16 *fksetcolsattnums, +static int validateFkOnDeleteSetColumns(int numfks, const int16 *fkattnums, + int numfksetcols, int16 *fksetcolsattnums, List *fksetcols); +static ObjectAddress addFkConstraint(addFkConstraintSides fkside, + char *constraintname, + Constraint *fkconstraint, Relation rel, + Relation pkrel, Oid indexOid, + Oid parentConstr, + int numfks, int16 *pkattnum, int16 *fkattnum, + Oid *pfeqoperators, Oid *ppeqoperators, + Oid *ffeqoperators, int numfkdelsetcols, + int16 *fkdelsetcols, bool is_internal); +static void addFkRecurseReferenced(Constraint *fkconstraint, + Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, + int numfks, int16 *pkattnum, int16 *fkattnum, + Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, + int numfkdelsetcols, int16 *fkdelsetcols, + bool old_check_ok, + Oid parentDelTrigger, Oid parentUpdTrigger); static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, @@ -549,6 +581,8 @@ static void ATPrepAlterColumnType(List **wqueue, static bool ATColumnChangeRequiresRewrite(Node *expr, AttrNumber varattno); static ObjectAddress ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, AlterTableCmd *cmd, LOCKMODE lockmode); +static void RememberAllDependentForRebuilding(AlteredTableInfo *tab, AlterTableType subtype, + Relation rel, AttrNumber attnum, const char *colName); static void RememberConstraintForRebuilding(Oid conoid, AlteredTableInfo *tab); static void RememberIndexForRebuilding(Oid indoid, AlteredTableInfo *tab); static void RememberStatisticsForRebuilding(Oid stxoid, AlteredTableInfo *tab); @@ -557,7 +591,7 @@ static void ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, static void ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, char *cmd, List **wqueue, LOCKMODE lockmode, bool rewrite); -static void RebuildConstraintComment(AlteredTableInfo *tab, int pass, +static void RebuildConstraintComment(AlteredTableInfo *tab, AlterTablePass pass, Oid objid, Relation rel, List *domname, const char *conname); static void TryReuseIndex(Oid oldId, IndexStmt *stmt); @@ -572,6 +606,7 @@ static ObjectAddress ATExecClusterOn(Relation rel, const char *indexName, LOCKMODE lockmode); static void ATExecDropCluster(Relation rel, LOCKMODE lockmode); static void ATPrepSetAccessMethod(AlteredTableInfo *tab, Relation rel, const char *amname); +static void ATExecSetAccessMethodNoStorage(Relation rel, Oid newAccessMethodId); static bool ATPrepChangePersistence(Relation rel, bool toLogged); static void ATPrepSetTableSpace(AlteredTableInfo *tab, Relation rel, const char *tablespacename, LOCKMODE lockmode); @@ -610,13 +645,13 @@ static PartitionSpec *transformPartitionSpec(Relation rel, PartitionSpec *partsp static void ComputePartitionAttrs(ParseState *pstate, Relation rel, List *partParams, AttrNumber *partattrs, List **partexprs, Oid *partopclass, Oid *partcollation, PartitionStrategy strategy); -static void CreateInheritance(Relation child_rel, Relation parent_rel); +static void CreateInheritance(Relation child_rel, Relation parent_rel, bool ispartition); static void RemoveInheritance(Relation child_rel, Relation parent_rel, bool expect_detached); static ObjectAddress ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, AlterTableUtilityContext *context); -static void AttachPartitionEnsureIndexes(Relation rel, Relation attachrel); +static void AttachPartitionEnsureIndexes(List **wqueue, Relation rel, Relation attachrel); static void QueuePartitionConstraintValidation(List **wqueue, Relation scanrel, List *partConstraint, bool validate_default); @@ -636,7 +671,7 @@ static void refuseDupeIndexAttach(Relation parentIdx, Relation partIdx, Relation partitionTbl); static List *GetParentedForeignKeyRefs(Relation partition); static void ATDetachCheckNoForeignKeyRefs(Relation partition); -static char GetAttributeCompression(Oid atttypid, char *compression); +static char GetAttributeCompression(Oid atttypid, const char *compression); static char GetAttributeStorage(Oid atttypid, const char *storagemode); @@ -681,7 +716,6 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, Oid ofTypeId; ObjectAddress address; LOCKMODE parentLockmode; - const char *accessMethod = NULL; Oid accessMethodId = InvalidOid; /* @@ -785,10 +819,6 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, } else if (stmt->partbound) { - /* - * For partitions, when no other tablespace is specified, we default - * the tablespace to the parent partitioned table's. - */ Assert(list_length(inheritOids) == 1); tablespaceId = get_rel_tablespace(linitial_oid(inheritOids)); } @@ -866,7 +896,7 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, /* * Create a tuple descriptor from the relation schema. Note that this - * deals with column names, types, and NOT NULL constraints, but not + * deals with column names, types, and not-null constraints, but not * default values or CHECK constraints; we handle those below. */ descriptor = BuildDescForRelation(stmt->tableElts); @@ -926,40 +956,29 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, cookedDefaults = lappend(cookedDefaults, cooked); attr->atthasdef = true; } - - if (colDef->identity) - attr->attidentity = colDef->identity; - - if (colDef->generated) - attr->attgenerated = colDef->generated; - - if (colDef->compression) - attr->attcompression = GetAttributeCompression(attr->atttypid, - colDef->compression); - - if (colDef->storage_name) - attr->attstorage = GetAttributeStorage(attr->atttypid, colDef->storage_name); } /* - * If the statement hasn't specified an access method, but we're defining - * a type of relation that needs one, use the default. + * For relations with table AM and partitioned tables, select access + * method to use: an explicitly indicated one, or (in the case of a + * partitioned table) the parent's, if it has one. */ if (stmt->accessMethod != NULL) { - accessMethod = stmt->accessMethod; - - if (partitioned) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("specifying a table access method is not supported on a partitioned table"))); + Assert(RELKIND_HAS_TABLE_AM(relkind) || relkind == RELKIND_PARTITIONED_TABLE); + accessMethodId = get_table_am_oid(stmt->accessMethod, false); } - else if (RELKIND_HAS_TABLE_AM(relkind)) - accessMethod = default_table_access_method; + else if (RELKIND_HAS_TABLE_AM(relkind) || relkind == RELKIND_PARTITIONED_TABLE) + { + if (stmt->partbound) + { + Assert(list_length(inheritOids) == 1); + accessMethodId = get_rel_relam(linitial_oid(inheritOids)); + } - /* look up the access method, verify it is for a table */ - if (accessMethod != NULL) - accessMethodId = get_table_am_oid(accessMethod, false); + if (RELKIND_HAS_TABLE_AM(relkind) && !OidIsValid(accessMethodId)) + accessMethodId = get_table_am_oid(default_table_access_method, false); + } /* * Create the relation. Inherited defaults and constraints are passed in @@ -1261,6 +1280,111 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, return address; } +/* + * BuildDescForRelation + * + * Given a list of ColumnDef nodes, build a TupleDesc. + * + * Note: tdtypeid will need to be filled in later on. + */ +TupleDesc +BuildDescForRelation(const List *columns) +{ + int natts; + AttrNumber attnum; + ListCell *l; + TupleDesc desc; + bool has_not_null; + char *attname; + Oid atttypid; + int32 atttypmod; + Oid attcollation; + int attdim; + + /* + * allocate a new tuple descriptor + */ + natts = list_length(columns); + desc = CreateTemplateTupleDesc(natts); + has_not_null = false; + + attnum = 0; + + foreach(l, columns) + { + ColumnDef *entry = lfirst(l); + AclResult aclresult; + Form_pg_attribute att; + + /* + * for each entry in the list, get the name and type information from + * the list and have TupleDescInitEntry fill in the attribute + * information we need. + */ + attnum++; + + attname = entry->colname; + typenameTypeIdAndMod(NULL, entry->typeName, &atttypid, &atttypmod); + + aclresult = object_aclcheck(TypeRelationId, atttypid, GetUserId(), ACL_USAGE); + if (aclresult != ACLCHECK_OK) + aclcheck_error_type(aclresult, atttypid); + + attcollation = GetColumnDefCollation(NULL, entry, atttypid); + attdim = list_length(entry->typeName->arrayBounds); + if (attdim > PG_INT16_MAX) + ereport(ERROR, + errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("too many array dimensions")); + + if (entry->typeName->setof) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("column \"%s\" cannot be declared SETOF", + attname))); + + TupleDescInitEntry(desc, attnum, attname, + atttypid, atttypmod, attdim); + att = TupleDescAttr(desc, attnum - 1); + + /* Override TupleDescInitEntry's settings as requested */ + TupleDescInitEntryCollation(desc, attnum, attcollation); + + /* Fill in additional stuff not handled by TupleDescInitEntry */ + att->attnotnull = entry->is_not_null; + has_not_null |= entry->is_not_null; + att->attislocal = entry->is_local; + att->attinhcount = entry->inhcount; + att->attidentity = entry->identity; + att->attgenerated = entry->generated; + att->attcompression = GetAttributeCompression(att->atttypid, entry->compression); + if (entry->storage) + att->attstorage = entry->storage; + else if (entry->storage_name) + att->attstorage = GetAttributeStorage(att->atttypid, entry->storage_name); + } + + if (has_not_null) + { + TupleConstr *constr = (TupleConstr *) palloc0(sizeof(TupleConstr)); + + constr->has_not_null = true; + constr->has_generated_stored = false; + constr->defval = NULL; + constr->missing = NULL; + constr->num_defval = 0; + constr->check = NULL; + constr->num_check = 0; + desc->constr = constr; + } + else + { + desc->constr = NULL; + } + + return desc; +} + /* * Emit the right error or warning message for a "DROP" command issued on a * non-existent relation @@ -1987,10 +2111,7 @@ ExecuteTruncateGuts(List *explicit_rels, /* Find or create cached entry for the foreign table */ ft_info = hash_search(ft_htab, &serverid, HASH_ENTER, &found); if (!found) - { - ft_info->serverid = serverid; ft_info->rels = NIL; - } /* * Save the foreign table in the entry of the server that the @@ -2055,7 +2176,7 @@ ExecuteTruncateGuts(List *explicit_rels, /* * Reconstruct the indexes to match, and we're done. */ - reindex_relation(heap_relid, REINDEX_REL_PROCESS_TOAST, + reindex_relation(NULL, heap_relid, REINDEX_REL_PROCESS_TOAST, &reindex_params); } @@ -2289,7 +2410,7 @@ storage_name(char c) * Returns new schema given initial schema and superclasses. * * Input arguments: - * 'schema' is the column/attribute definition for the table. (It's a list + * 'columns' is the column/attribute definition for the table. (It's a list * of ColumnDef's.) It is destructively changed. * 'supers' is a list of OIDs of parent relations, already locked by caller. * 'relpersistence' is the persistence type of the table. @@ -2326,7 +2447,7 @@ storage_name(char c) * If the same attribute name appears multiple times, then it appears * in the result table in the proper location for its first appearance. * - * Constraints (including NOT NULL constraints) for the child table + * Constraints (including not-null constraints) for the child table * are the union of all relevant constraints, from both the child schema * and parent tables. * @@ -2346,16 +2467,16 @@ storage_name(char c) *---------- */ static List * -MergeAttributes(List *schema, List *supers, char relpersistence, +MergeAttributes(List *columns, const List *supers, char relpersistence, bool is_partition, List **supconstr) { - List *inhSchema = NIL; + List *inh_columns = NIL; List *constraints = NIL; bool have_bogus_defaults = false; int child_attno; static Node bogus_marker = {0}; /* marks conflicting defaults */ - List *saved_schema = NIL; - ListCell *entry; + List *saved_columns = NIL; + ListCell *lc; /* * Check for and reject tables with too many columns. We perform this @@ -2368,7 +2489,7 @@ MergeAttributes(List *schema, List *supers, char relpersistence, * Note that we also need to check that we do not exceed this figure after * including columns from inherited relations. */ - if (list_length(schema) > MaxHeapAttributeNumber) + if (list_length(columns) > MaxHeapAttributeNumber) ereport(ERROR, (errcode(ERRCODE_TOO_MANY_COLUMNS), errmsg("tables can have at most %d columns", @@ -2382,15 +2503,15 @@ MergeAttributes(List *schema, List *supers, char relpersistence, * sense to assume such conflicts are errors. * * We don't use foreach() here because we have two nested loops over the - * schema list, with possible element deletions in the inner one. If we + * columns list, with possible element deletions in the inner one. If we * used foreach_delete_current() it could only fix up the state of one of * the loops, so it seems cleaner to use looping over list indexes for * both loops. Note that any deletion will happen beyond where the outer * loop is, so its index never needs adjustment. */ - for (int coldefpos = 0; coldefpos < list_length(schema); coldefpos++) + for (int coldefpos = 0; coldefpos < list_length(columns); coldefpos++) { - ColumnDef *coldef = list_nth_node(ColumnDef, schema, coldefpos); + ColumnDef *coldef = list_nth_node(ColumnDef, columns, coldefpos); if (!is_partition && coldef->typeName == NULL) { @@ -2407,9 +2528,9 @@ MergeAttributes(List *schema, List *supers, char relpersistence, } /* restpos scans all entries beyond coldef; incr is in loop body */ - for (int restpos = coldefpos + 1; restpos < list_length(schema);) + for (int restpos = coldefpos + 1; restpos < list_length(columns);) { - ColumnDef *restdef = list_nth_node(ColumnDef, schema, restpos); + ColumnDef *restdef = list_nth_node(ColumnDef, columns, restpos); if (strcmp(coldef->colname, restdef->colname) == 0) { @@ -2423,7 +2544,7 @@ MergeAttributes(List *schema, List *supers, char relpersistence, coldef->cooked_default = restdef->cooked_default; coldef->constraints = restdef->constraints; coldef->is_from_type = false; - schema = list_delete_nth_cell(schema, restpos); + columns = list_delete_nth_cell(columns, restpos); } else ereport(ERROR, @@ -2443,26 +2564,24 @@ MergeAttributes(List *schema, List *supers, char relpersistence, */ if (is_partition) { - saved_schema = schema; - schema = NIL; + saved_columns = columns; + columns = NIL; } /* * Scan the parents left-to-right, and merge their attributes to form a - * list of inherited attributes (inhSchema). Also check to see if we need - * to inherit an OID column. + * list of inherited columns (inh_columns). */ child_attno = 0; - foreach(entry, supers) + foreach(lc, supers) { - Oid parent = lfirst_oid(entry); + Oid parent = lfirst_oid(lc); Relation relation; TupleDesc tupleDesc; TupleConstr *constr; AttrMap *newattmap; List *inherited_defaults; List *cols_with_defaults; - AttrNumber parent_attno; ListCell *lc1; ListCell *lc2; @@ -2481,8 +2600,7 @@ MergeAttributes(List *schema, List *supers, char relpersistence, * We do not allow partitioned tables and partitions to participate in * regular inheritance. */ - if (relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE && - !is_partition) + if (relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !is_partition) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot inherit from partitioned table \"%s\"", @@ -2553,14 +2671,15 @@ MergeAttributes(List *schema, List *supers, char relpersistence, /* We can't process inherited defaults until newattmap is complete. */ inherited_defaults = cols_with_defaults = NIL; - for (parent_attno = 1; parent_attno <= tupleDesc->natts; + for (AttrNumber parent_attno = 1; parent_attno <= tupleDesc->natts; parent_attno++) { Form_pg_attribute attribute = TupleDescAttr(tupleDesc, parent_attno - 1); char *attributeName = NameStr(attribute->attname); int exist_attno; - ColumnDef *def; + ColumnDef *newdef; + ColumnDef *mergeddef; /* * Ignore dropped columns in the parent. @@ -2569,138 +2688,56 @@ MergeAttributes(List *schema, List *supers, char relpersistence, continue; /* leave newattmap->attnums entry as zero */ /* - * Does it conflict with some previously inherited column? + * Create new column definition + */ + newdef = makeColumnDef(attributeName, attribute->atttypid, + attribute->atttypmod, attribute->attcollation); + newdef->is_not_null = attribute->attnotnull; + newdef->storage = attribute->attstorage; + newdef->generated = attribute->attgenerated; + if (CompressionMethodIsValid(attribute->attcompression)) + newdef->compression = + pstrdup(GetCompressionMethodName(attribute->attcompression)); + + /* + * Regular inheritance children are independent enough not to + * inherit identity columns. But partitions are integral part of + * a partitioned table and inherit identity column. + */ + if (is_partition) + newdef->identity = attribute->attidentity; + + /* + * Does it match some previously considered column from another + * parent? */ - exist_attno = findAttrByName(attributeName, inhSchema); + exist_attno = findAttrByName(attributeName, inh_columns); if (exist_attno > 0) { - Oid defTypeId; - int32 deftypmod; - Oid defCollId; - /* * Yes, try to merge the two column definitions. */ - ereport(NOTICE, - (errmsg("merging multiple inherited definitions of column \"%s\"", - attributeName))); - def = (ColumnDef *) list_nth(inhSchema, exist_attno - 1); - - /* - * Must have the same type and typmod - */ - typenameTypeIdAndMod(NULL, def->typeName, &defTypeId, &deftypmod); - if (defTypeId != attribute->atttypid || - deftypmod != attribute->atttypmod) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("inherited column \"%s\" has a type conflict", - attributeName), - errdetail("%s versus %s", - format_type_with_typemod(defTypeId, - deftypmod), - format_type_with_typemod(attribute->atttypid, - attribute->atttypmod)))); - - /* - * Must have the same collation - */ - defCollId = GetColumnDefCollation(NULL, def, defTypeId); - if (defCollId != attribute->attcollation) - ereport(ERROR, - (errcode(ERRCODE_COLLATION_MISMATCH), - errmsg("inherited column \"%s\" has a collation conflict", - attributeName), - errdetail("\"%s\" versus \"%s\"", - get_collation_name(defCollId), - get_collation_name(attribute->attcollation)))); - - /* - * Copy/check storage parameter - */ - if (def->storage == 0) - def->storage = attribute->attstorage; - else if (def->storage != attribute->attstorage) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("inherited column \"%s\" has a storage parameter conflict", - attributeName), - errdetail("%s versus %s", - storage_name(def->storage), - storage_name(attribute->attstorage)))); - - /* - * Copy/check compression parameter - */ - if (CompressionMethodIsValid(attribute->attcompression)) - { - const char *compression = - GetCompressionMethodName(attribute->attcompression); - - if (def->compression == NULL) - def->compression = pstrdup(compression); - else if (strcmp(def->compression, compression) != 0) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("column \"%s\" has a compression method conflict", - attributeName), - errdetail("%s versus %s", def->compression, compression))); - } - - /* - * Merge of NOT NULL constraints = OR 'em together - */ - def->is_not_null |= attribute->attnotnull; + mergeddef = MergeInheritedAttribute(inh_columns, exist_attno, newdef); - /* - * Check for GENERATED conflicts - */ - if (def->generated != attribute->attgenerated) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("inherited column \"%s\" has a generation conflict", - attributeName))); + newattmap->attnums[parent_attno - 1] = exist_attno; /* - * Default and other constraints are handled below + * Partitions have only one parent, so conflict should never + * occur. */ - - def->inhcount++; - if (def->inhcount < 0) - ereport(ERROR, - errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("too many inheritance parents")); - - newattmap->attnums[parent_attno - 1] = exist_attno; + Assert(!is_partition); } else { /* * No, create a new inherited column */ - def = makeNode(ColumnDef); - def->colname = pstrdup(attributeName); - def->typeName = makeTypeNameFromOid(attribute->atttypid, - attribute->atttypmod); - def->inhcount = 1; - def->is_local = false; - def->is_not_null = attribute->attnotnull; - def->is_from_type = false; - def->storage = attribute->attstorage; - def->raw_default = NULL; - def->cooked_default = NULL; - def->generated = attribute->attgenerated; - def->collClause = NULL; - def->collOid = attribute->attcollation; - def->constraints = NIL; - def->location = -1; - if (CompressionMethodIsValid(attribute->attcompression)) - def->compression = - pstrdup(GetCompressionMethodName(attribute->attcompression)); - else - def->compression = NULL; - inhSchema = lappend(inhSchema, def); + newdef->inhcount = 1; + newdef->is_local = false; + inh_columns = lappend(inh_columns, newdef); + newattmap->attnums[parent_attno - 1] = ++child_attno; + mergeddef = newdef; } /* @@ -2708,22 +2745,9 @@ MergeAttributes(List *schema, List *supers, char relpersistence, */ if (attribute->atthasdef) { - Node *this_default = NULL; - - /* Find default in constraint structure */ - if (constr != NULL) - { - AttrDefault *attrdef = constr->defval; + Node *this_default; - for (int i = 0; i < constr->num_defval; i++) - { - if (attrdef[i].adnum == parent_attno) - { - this_default = stringToNode(attrdef[i].adbin); - break; - } - } - } + this_default = TupleDescGetDefault(tupleDesc, parent_attno); if (this_default == NULL) elog(ERROR, "default expression not found for attribute %d of relation \"%s\"", parent_attno, RelationGetRelationName(relation)); @@ -2735,7 +2759,7 @@ MergeAttributes(List *schema, List *supers, char relpersistence, * all the inherited default expressions for the moment. */ inherited_defaults = lappend(inherited_defaults, this_default); - cols_with_defaults = lappend(cols_with_defaults, def); + cols_with_defaults = lappend(cols_with_defaults, mergeddef); } } @@ -2773,7 +2797,7 @@ MergeAttributes(List *schema, List *supers, char relpersistence, * If we already had a default from some prior parent, check to * see if they are the same. If so, no problem; if not, mark the * column as having a bogus default. Below, we will complain if - * the bogus default isn't overridden by the child schema. + * the bogus default isn't overridden by the child columns. */ Assert(def->raw_default == NULL); if (def->cooked_default == NULL) @@ -2793,9 +2817,8 @@ MergeAttributes(List *schema, List *supers, char relpersistence, if (constr && constr->num_check > 0) { ConstrCheck *check = constr->check; - int i; - for (i = 0; i < constr->num_check; i++) + for (int i = 0; i < constr->num_check; i++) { char *name = check[i].ccname; Node *expr; @@ -2824,24 +2847,7 @@ MergeAttributes(List *schema, List *supers, char relpersistence, name, RelationGetRelationName(relation)))); - /* check for duplicate */ - if (!MergeCheckConstraint(constraints, name, expr)) - { - /* nope, this is a new one */ - CookedConstraint *cooked; - - cooked = (CookedConstraint *) palloc(sizeof(CookedConstraint)); - cooked->contype = CONSTR_CHECK; - cooked->conoid = InvalidOid; /* until created */ - cooked->name = pstrdup(name); - cooked->attnum = 0; /* not used for constraints */ - cooked->expr = expr; - cooked->skip_validation = false; - cooked->is_local = false; - cooked->inhcount = 1; - cooked->is_no_inherit = false; - constraints = lappend(constraints, cooked); - } + constraints = MergeCheckConstraint(constraints, name, expr); } } @@ -2856,192 +2862,56 @@ MergeAttributes(List *schema, List *supers, char relpersistence, } /* - * If we had no inherited attributes, the result schema is just the + * If we had no inherited attributes, the result columns are just the * explicitly declared columns. Otherwise, we need to merge the declared - * columns into the inherited schema list. Although, we never have any + * columns into the inherited column list. Although, we never have any * explicitly declared columns if the table is a partition. */ - if (inhSchema != NIL) + if (inh_columns != NIL) { - int schema_attno = 0; + int newcol_attno = 0; - foreach(entry, schema) + foreach(lc, columns) { - ColumnDef *newdef = lfirst(entry); + ColumnDef *newdef = lfirst_node(ColumnDef, lc); char *attributeName = newdef->colname; int exist_attno; - schema_attno++; + /* + * Partitions have only one parent and have no column definitions + * of their own, so conflict should never occur. + */ + Assert(!is_partition); + + newcol_attno++; /* - * Does it conflict with some previously inherited column? + * Does it match some inherited column? */ - exist_attno = findAttrByName(attributeName, inhSchema); + exist_attno = findAttrByName(attributeName, inh_columns); if (exist_attno > 0) { - ColumnDef *def; - Oid defTypeId, - newTypeId; - int32 deftypmod, - newtypmod; - Oid defcollid, - newcollid; - - /* - * Partitions have only one parent and have no column - * definitions of their own, so conflict should never occur. - */ - Assert(!is_partition); - /* * Yes, try to merge the two column definitions. */ - if (exist_attno == schema_attno) - ereport(NOTICE, - (errmsg("merging column \"%s\" with inherited definition", - attributeName))); - else - ereport(NOTICE, - (errmsg("moving and merging column \"%s\" with inherited definition", attributeName), - errdetail("User-specified column moved to the position of the inherited column."))); - def = (ColumnDef *) list_nth(inhSchema, exist_attno - 1); - - /* - * Must have the same type and typmod - */ - typenameTypeIdAndMod(NULL, def->typeName, &defTypeId, &deftypmod); - typenameTypeIdAndMod(NULL, newdef->typeName, &newTypeId, &newtypmod); - if (defTypeId != newTypeId || deftypmod != newtypmod) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("column \"%s\" has a type conflict", - attributeName), - errdetail("%s versus %s", - format_type_with_typemod(defTypeId, - deftypmod), - format_type_with_typemod(newTypeId, - newtypmod)))); - - /* - * Must have the same collation - */ - defcollid = GetColumnDefCollation(NULL, def, defTypeId); - newcollid = GetColumnDefCollation(NULL, newdef, newTypeId); - if (defcollid != newcollid) - ereport(ERROR, - (errcode(ERRCODE_COLLATION_MISMATCH), - errmsg("column \"%s\" has a collation conflict", - attributeName), - errdetail("\"%s\" versus \"%s\"", - get_collation_name(defcollid), - get_collation_name(newcollid)))); - - /* - * Identity is never inherited. The new column can have an - * identity definition, so we always just take that one. - */ - def->identity = newdef->identity; - - /* - * Copy storage parameter - */ - if (def->storage == 0) - def->storage = newdef->storage; - else if (newdef->storage != 0 && def->storage != newdef->storage) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("column \"%s\" has a storage parameter conflict", - attributeName), - errdetail("%s versus %s", - storage_name(def->storage), - storage_name(newdef->storage)))); - - /* - * Copy compression parameter - */ - if (def->compression == NULL) - def->compression = newdef->compression; - else if (newdef->compression != NULL) - { - if (strcmp(def->compression, newdef->compression) != 0) - ereport(ERROR, - (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("column \"%s\" has a compression method conflict", - attributeName), - errdetail("%s versus %s", def->compression, newdef->compression))); - } - - /* - * Merge of NOT NULL constraints = OR 'em together - */ - def->is_not_null |= newdef->is_not_null; - - /* - * Check for conflicts related to generated columns. - * - * If the parent column is generated, the child column will be - * made a generated column if it isn't already. If it is a - * generated column, we'll take its generation expression in - * preference to the parent's. We must check that the child - * column doesn't specify a default value or identity, which - * matches the rules for a single column in parse_utilcmd.c. - * - * Conversely, if the parent column is not generated, the - * child column can't be either. (We used to allow that, but - * it results in being able to override the generation - * expression via UPDATEs through the parent.) - */ - if (def->generated) - { - if (newdef->raw_default && !newdef->generated) - ereport(ERROR, - (errcode(ERRCODE_INVALID_COLUMN_DEFINITION), - errmsg("column \"%s\" inherits from generated column but specifies default", - def->colname))); - if (newdef->identity) - ereport(ERROR, - (errcode(ERRCODE_INVALID_COLUMN_DEFINITION), - errmsg("column \"%s\" inherits from generated column but specifies identity", - def->colname))); - } - else - { - if (newdef->generated) - ereport(ERROR, - (errcode(ERRCODE_INVALID_COLUMN_DEFINITION), - errmsg("child column \"%s\" specifies generation expression", - def->colname), - errhint("A child table column cannot be generated unless its parent column is."))); - } - - /* - * If new def has a default, override previous default - */ - if (newdef->raw_default != NULL) - { - def->raw_default = newdef->raw_default; - def->cooked_default = newdef->cooked_default; - } - - /* Mark the column as locally defined */ - def->is_local = true; + MergeChildAttribute(inh_columns, exist_attno, newcol_attno, newdef); } else { /* - * No, attach new column to result schema + * No, attach new column unchanged to result columns. */ - inhSchema = lappend(inhSchema, newdef); + inh_columns = lappend(inh_columns, newdef); } } - schema = inhSchema; + columns = inh_columns; /* * Check that we haven't exceeded the legal # of columns after merging * in inherited columns. */ - if (list_length(schema) > MaxHeapAttributeNumber) + if (list_length(columns) > MaxHeapAttributeNumber) ereport(ERROR, (errcode(ERRCODE_TOO_MANY_COLUMNS), errmsg("tables can have at most %d columns", @@ -3051,18 +2921,18 @@ MergeAttributes(List *schema, List *supers, char relpersistence, /* * Now that we have the column definition list for a partition, we can * check whether the columns referenced in the column constraint specs - * actually exist. Also, we merge parent's NOT NULL constraints and + * actually exist. Also, we merge parent's not-null constraints and * defaults into each corresponding column definition. */ if (is_partition) { - foreach(entry, saved_schema) + foreach(lc, saved_columns) { - ColumnDef *restdef = lfirst(entry); + ColumnDef *restdef = lfirst(lc); bool found = false; ListCell *l; - foreach(l, schema) + foreach(l, columns) { ColumnDef *coldef = lfirst(l); @@ -3135,9 +3005,9 @@ MergeAttributes(List *schema, List *supers, char relpersistence, */ if (have_bogus_defaults) { - foreach(entry, schema) + foreach(lc, columns) { - ColumnDef *def = lfirst(entry); + ColumnDef *def = lfirst(lc); if (def->cooked_default == &bogus_marker) { @@ -3158,7 +3028,8 @@ MergeAttributes(List *schema, List *supers, char relpersistence, } *supconstr = constraints; - return schema; + + return columns; } @@ -3171,13 +3042,17 @@ MergeAttributes(List *schema, List *supers, char relpersistence, * * constraints is a list of CookedConstraint structs for previous constraints. * - * Returns true if merged (constraint is a duplicate), or false if it's - * got a so-far-unique name, or throws error if conflict. + * If the new constraint matches an existing one, then the existing + * constraint's inheritance count is updated. If there is a conflict (same + * name but different expression), throw an error. If the constraint neither + * matches nor conflicts with an existing one, a new constraint is appended to + * the list. */ -static bool -MergeCheckConstraint(List *constraints, char *name, Node *expr) +static List * +MergeCheckConstraint(List *constraints, const char *name, Node *expr) { ListCell *lc; + CookedConstraint *newcon; foreach(lc, constraints) { @@ -3191,13 +3066,13 @@ MergeCheckConstraint(List *constraints, char *name, Node *expr) if (equal(expr, ccon->expr)) { - /* OK to merge */ + /* OK to merge constraint with existing */ ccon->inhcount++; if (ccon->inhcount < 0) ereport(ERROR, errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("too many inheritance parents")); - return true; + return constraints; } ereport(ERROR, @@ -3206,66 +3081,360 @@ MergeCheckConstraint(List *constraints, char *name, Node *expr) name))); } - return false; + /* + * Constraint couldn't be merged with an existing one and also didn't + * conflict with an existing one, so add it as a new one to the list. + */ + newcon = palloc0_object(CookedConstraint); + newcon->contype = CONSTR_CHECK; + newcon->name = pstrdup(name); + newcon->expr = expr; + newcon->inhcount = 1; + return lappend(constraints, newcon); } - /* - * StoreCatalogInheritance - * Updates the system catalogs with proper inheritance information. + * MergeChildAttribute + * Merge given child attribute definition into given inherited attribute. * - * supers is a list of the OIDs of the new relation's direct ancestors. + * Input arguments: + * 'inh_columns' is the list of inherited ColumnDefs. + * 'exist_attno' is the number of the inherited attribute in inh_columns + * 'newcol_attno' is the attribute number in child table's schema definition + * 'newdef' is the column/attribute definition from the child table. + * + * The ColumnDef in 'inh_columns' list is modified. The child attribute's + * ColumnDef remains unchanged. + * + * Notes: + * - The attribute is merged according to the rules laid out in the prologue + * of MergeAttributes(). + * - If matching inherited attribute exists but the child attribute can not be + * merged into it, the function throws respective errors. + * - A partition can not have its own column definitions. Hence this function + * is applicable only to a regular inheritance child. */ static void -StoreCatalogInheritance(Oid relationId, List *supers, - bool child_is_partition) +MergeChildAttribute(List *inh_columns, int exist_attno, int newcol_attno, const ColumnDef *newdef) { - Relation relation; - int32 seqNumber; - ListCell *entry; + char *attributeName = newdef->colname; + ColumnDef *inhdef; + Oid inhtypeid, + newtypeid; + int32 inhtypmod, + newtypmod; + Oid inhcollid, + newcollid; + + if (exist_attno == newcol_attno) + ereport(NOTICE, + (errmsg("merging column \"%s\" with inherited definition", + attributeName))); + else + ereport(NOTICE, + (errmsg("moving and merging column \"%s\" with inherited definition", attributeName), + errdetail("User-specified column moved to the position of the inherited column."))); + + inhdef = list_nth_node(ColumnDef, inh_columns, exist_attno - 1); /* - * sanity checks + * Must have the same type and typmod */ - Assert(OidIsValid(relationId)); + typenameTypeIdAndMod(NULL, inhdef->typeName, &inhtypeid, &inhtypmod); + typenameTypeIdAndMod(NULL, newdef->typeName, &newtypeid, &newtypmod); + if (inhtypeid != newtypeid || inhtypmod != newtypmod) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("column \"%s\" has a type conflict", + attributeName), + errdetail("%s versus %s", + format_type_with_typemod(inhtypeid, inhtypmod), + format_type_with_typemod(newtypeid, newtypmod)))); - if (supers == NIL) - return; + /* + * Must have the same collation + */ + inhcollid = GetColumnDefCollation(NULL, inhdef, inhtypeid); + newcollid = GetColumnDefCollation(NULL, newdef, newtypeid); + if (inhcollid != newcollid) + ereport(ERROR, + (errcode(ERRCODE_COLLATION_MISMATCH), + errmsg("column \"%s\" has a collation conflict", + attributeName), + errdetail("\"%s\" versus \"%s\"", + get_collation_name(inhcollid), + get_collation_name(newcollid)))); /* - * Store INHERITS information in pg_inherits using direct ancestors only. - * Also enter dependencies on the direct ancestors, and make sure they are - * marked with relhassubclass = true. - * - * (Once upon a time, both direct and indirect ancestors were found here - * and then entered into pg_ipl. Since that catalog doesn't exist - * anymore, there's no need to look for indirect ancestors.) + * Identity is never inherited by a regular inheritance child. Pick + * child's identity definition if there's one. */ - relation = table_open(InheritsRelationId, RowExclusiveLock); + inhdef->identity = newdef->identity; - seqNumber = 1; - foreach(entry, supers) + /* + * Copy storage parameter + */ + if (inhdef->storage == 0) + inhdef->storage = newdef->storage; + else if (newdef->storage != 0 && inhdef->storage != newdef->storage) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("column \"%s\" has a storage parameter conflict", + attributeName), + errdetail("%s versus %s", + storage_name(inhdef->storage), + storage_name(newdef->storage)))); + + /* + * Copy compression parameter + */ + if (inhdef->compression == NULL) + inhdef->compression = newdef->compression; + else if (newdef->compression != NULL) { - Oid parentOid = lfirst_oid(entry); + if (strcmp(inhdef->compression, newdef->compression) != 0) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("column \"%s\" has a compression method conflict", + attributeName), + errdetail("%s versus %s", inhdef->compression, newdef->compression))); + } - StoreCatalogInheritance1(relationId, parentOid, seqNumber, relation, - child_is_partition); - seqNumber++; + /* + * Merge of not-null constraints = OR 'em together + */ + inhdef->is_not_null |= newdef->is_not_null; + + /* + * Check for conflicts related to generated columns. + * + * If the parent column is generated, the child column will be made a + * generated column if it isn't already. If it is a generated column, + * we'll take its generation expression in preference to the parent's. We + * must check that the child column doesn't specify a default value or + * identity, which matches the rules for a single column in + * parse_utilcmd.c. + * + * Conversely, if the parent column is not generated, the child column + * can't be either. (We used to allow that, but it results in being able + * to override the generation expression via UPDATEs through the parent.) + */ + if (inhdef->generated) + { + if (newdef->raw_default && !newdef->generated) + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_DEFINITION), + errmsg("column \"%s\" inherits from generated column but specifies default", + inhdef->colname))); + if (newdef->identity) + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_DEFINITION), + errmsg("column \"%s\" inherits from generated column but specifies identity", + inhdef->colname))); + } + else + { + if (newdef->generated) + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_DEFINITION), + errmsg("child column \"%s\" specifies generation expression", + inhdef->colname), + errhint("A child table column cannot be generated unless its parent column is."))); } - table_close(relation, RowExclusiveLock); + /* + * If new def has a default, override previous default + */ + if (newdef->raw_default != NULL) + { + inhdef->raw_default = newdef->raw_default; + inhdef->cooked_default = newdef->cooked_default; + } + + /* Mark the column as locally defined */ + inhdef->is_local = true; } /* - * Make catalog entries showing relationId as being an inheritance child - * of parentOid. inhRelation is the already-opened pg_inherits catalog. + * MergeInheritedAttribute + * Merge given parent attribute definition into specified attribute + * inherited from the previous parents. + * + * Input arguments: + * 'inh_columns' is the list of previously inherited ColumnDefs. + * 'exist_attno' is the number the existing matching attribute in inh_columns. + * 'newdef' is the new parent column/attribute definition to be merged. + * + * The matching ColumnDef in 'inh_columns' list is modified and returned. + * + * Notes: + * - The attribute is merged according to the rules laid out in the prologue + * of MergeAttributes(). + * - If matching inherited attribute exists but the new attribute can not be + * merged into it, the function throws respective errors. + * - A partition inherits from only a single parent. Hence this function is + * applicable only to a regular inheritance. */ -static void -StoreCatalogInheritance1(Oid relationId, Oid parentOid, - int32 seqNumber, Relation inhRelation, - bool child_is_partition) +static ColumnDef * +MergeInheritedAttribute(List *inh_columns, + int exist_attno, + const ColumnDef *newdef) { - ObjectAddress childobject, + char *attributeName = newdef->colname; + ColumnDef *prevdef; + Oid prevtypeid, + newtypeid; + int32 prevtypmod, + newtypmod; + Oid prevcollid, + newcollid; + + ereport(NOTICE, + (errmsg("merging multiple inherited definitions of column \"%s\"", + attributeName))); + prevdef = list_nth_node(ColumnDef, inh_columns, exist_attno - 1); + + /* + * Must have the same type and typmod + */ + typenameTypeIdAndMod(NULL, prevdef->typeName, &prevtypeid, &prevtypmod); + typenameTypeIdAndMod(NULL, newdef->typeName, &newtypeid, &newtypmod); + if (prevtypeid != newtypeid || prevtypmod != newtypmod) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("inherited column \"%s\" has a type conflict", + attributeName), + errdetail("%s versus %s", + format_type_with_typemod(prevtypeid, prevtypmod), + format_type_with_typemod(newtypeid, newtypmod)))); + + /* + * Merge of not-null constraints = OR 'em together + */ + prevdef->is_not_null |= newdef->is_not_null; + + /* + * Must have the same collation + */ + prevcollid = GetColumnDefCollation(NULL, prevdef, prevtypeid); + newcollid = GetColumnDefCollation(NULL, newdef, newtypeid); + if (prevcollid != newcollid) + ereport(ERROR, + (errcode(ERRCODE_COLLATION_MISMATCH), + errmsg("inherited column \"%s\" has a collation conflict", + attributeName), + errdetail("\"%s\" versus \"%s\"", + get_collation_name(prevcollid), + get_collation_name(newcollid)))); + + /* + * Copy/check storage parameter + */ + if (prevdef->storage == 0) + prevdef->storage = newdef->storage; + else if (prevdef->storage != newdef->storage) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("inherited column \"%s\" has a storage parameter conflict", + attributeName), + errdetail("%s versus %s", + storage_name(prevdef->storage), + storage_name(newdef->storage)))); + + /* + * Copy/check compression parameter + */ + if (prevdef->compression == NULL) + prevdef->compression = newdef->compression; + else if (newdef->compression != NULL) + { + if (strcmp(prevdef->compression, newdef->compression) != 0) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("column \"%s\" has a compression method conflict", + attributeName), + errdetail("%s versus %s", + prevdef->compression, newdef->compression))); + } + + /* + * Check for GENERATED conflicts + */ + if (prevdef->generated != newdef->generated) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("inherited column \"%s\" has a generation conflict", + attributeName))); + + /* + * Default and other constraints are handled by the caller. + */ + + prevdef->inhcount++; + if (prevdef->inhcount < 0) + ereport(ERROR, + errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("too many inheritance parents")); + + return prevdef; +} + +/* + * StoreCatalogInheritance + * Updates the system catalogs with proper inheritance information. + * + * supers is a list of the OIDs of the new relation's direct ancestors. + */ +static void +StoreCatalogInheritance(Oid relationId, List *supers, + bool child_is_partition) +{ + Relation relation; + int32 seqNumber; + ListCell *entry; + + /* + * sanity checks + */ + Assert(OidIsValid(relationId)); + + if (supers == NIL) + return; + + /* + * Store INHERITS information in pg_inherits using direct ancestors only. + * Also enter dependencies on the direct ancestors, and make sure they are + * marked with relhassubclass = true. + * + * (Once upon a time, both direct and indirect ancestors were found here + * and then entered into pg_ipl. Since that catalog doesn't exist + * anymore, there's no need to look for indirect ancestors.) + */ + relation = table_open(InheritsRelationId, RowExclusiveLock); + + seqNumber = 1; + foreach(entry, supers) + { + Oid parentOid = lfirst_oid(entry); + + StoreCatalogInheritance1(relationId, parentOid, seqNumber, relation, + child_is_partition); + seqNumber++; + } + + table_close(relation, RowExclusiveLock); +} + +/* + * Make catalog entries showing relationId as being an inheritance child + * of parentOid. inhRelation is the already-opened pg_inherits catalog. + */ +static void +StoreCatalogInheritance1(Oid relationId, Oid parentOid, + int32 seqNumber, Relation inhRelation, + bool child_is_partition) +{ + ObjectAddress childobject, parentobject; /* store the pg_inherits row */ @@ -3300,22 +3469,20 @@ StoreCatalogInheritance1(Oid relationId, Oid parentOid, } /* - * Look for an existing schema entry with the given name. + * Look for an existing column entry with the given name. * - * Returns the index (starting with 1) if attribute already exists in schema, + * Returns the index (starting with 1) if attribute already exists in columns, * 0 if it doesn't. */ static int -findAttrByName(const char *attributeName, List *schema) +findAttrByName(const char *attributeName, const List *columns) { - ListCell *s; + ListCell *lc; int i = 1; - foreach(s, schema) + foreach(lc, columns) { - ColumnDef *def = lfirst(s); - - if (strcmp(attributeName, def->colname) == 0) + if (strcmp(attributeName, lfirst_node(ColumnDef, lc)->colname) == 0) return i; i++; @@ -3328,8 +3495,15 @@ findAttrByName(const char *attributeName, List *schema) * SetRelationHasSubclass * Set the value of the relation's relhassubclass field in pg_class. * - * NOTE: caller must be holding an appropriate lock on the relation. - * ShareUpdateExclusiveLock is sufficient. + * It's always safe to set this field to true, because all SQL commands are + * ready to see true and then find no children. On the other hand, commands + * generally assume zero children if this is false. + * + * Caller must hold any self-exclusive lock until end of transaction. If the + * new value is false, caller must have acquired that lock before reading the + * evidence that justified the false value. That way, it properly waits if + * another backend is simultaneously concluding no need to change the tuple + * (new and old values are true). * * NOTE: an important side-effect of this operation is that an SI invalidation * message is sent out to all backends --- including me --- causing plans @@ -3344,6 +3518,11 @@ SetRelationHasSubclass(Oid relationId, bool relhassubclass) HeapTuple tuple; Form_pg_class classtuple; + Assert(CheckRelationOidLockedByMe(relationId, + ShareUpdateExclusiveLock, false) || + CheckRelationOidLockedByMe(relationId, + ShareRowExclusiveLock, true)); + /* * Fetch a modifiable copy of the tuple, modify it, update pg_class. */ @@ -3442,6 +3621,7 @@ SetRelationTableSpace(Relation rel, { Relation pg_class; HeapTuple tuple; + ItemPointerData otid; Form_pg_class rd_rel; Oid reloid = RelationGetRelid(rel); @@ -3450,9 +3630,10 @@ SetRelationTableSpace(Relation rel, /* Get a modifiable copy of the relation's pg_class row. */ pg_class = table_open(RelationRelationId, RowExclusiveLock); - tuple = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(reloid)); + tuple = SearchSysCacheLockedCopy1(RELOID, ObjectIdGetDatum(reloid)); if (!HeapTupleIsValid(tuple)) elog(ERROR, "cache lookup failed for relation %u", reloid); + otid = tuple->t_self; rd_rel = (Form_pg_class) GETSTRUCT(tuple); /* Update the pg_class row. */ @@ -3460,7 +3641,8 @@ SetRelationTableSpace(Relation rel, InvalidOid : newTableSpaceId; if (RelFileNumberIsValid(newRelFilenumber)) rd_rel->relfilenode = newRelFilenumber; - CatalogTupleUpdate(pg_class, &tuple->t_self, tuple); + CatalogTupleUpdate(pg_class, &otid, tuple); + UnlockTuple(pg_class, &otid, InplaceUpdateTupleLock); /* * Record dependency on tablespace. This is only required for relations @@ -3954,6 +4136,7 @@ RenameRelationInternal(Oid myrelid, const char *newrelname, bool is_internal, bo { Relation targetrelation; Relation relrelation; /* for RELATION relation */ + ItemPointerData otid; HeapTuple reltup; Form_pg_class relform; Oid namespaceId; @@ -3976,9 +4159,10 @@ RenameRelationInternal(Oid myrelid, const char *newrelname, bool is_internal, bo */ relrelation = table_open(RelationRelationId, RowExclusiveLock); - reltup = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(myrelid)); + reltup = SearchSysCacheLockedCopy1(RELOID, ObjectIdGetDatum(myrelid)); if (!HeapTupleIsValid(reltup)) /* shouldn't happen */ elog(ERROR, "cache lookup failed for relation %u", myrelid); + otid = reltup->t_self; relform = (Form_pg_class) GETSTRUCT(reltup); if (get_relname_relid(newrelname, namespaceId) != InvalidOid) @@ -4003,7 +4187,8 @@ RenameRelationInternal(Oid myrelid, const char *newrelname, bool is_internal, bo */ namestrcpy(&(relform->relname), newrelname); - CatalogTupleUpdate(relrelation, &reltup->t_self, reltup); + CatalogTupleUpdate(relrelation, &otid, reltup); + UnlockTuple(relrelation, &otid, InplaceUpdateTupleLock); InvokeObjectPostAlterHookArg(RelationRelationId, myrelid, 0, InvalidOid, is_internal); @@ -4115,6 +4300,37 @@ CheckTableNotInUse(Relation rel, const char *stmt) stmt, RelationGetRelationName(rel)))); } +/* + * CheckAlterTableIsSafe + * Verify that it's safe to allow ALTER TABLE on this relation. + * + * This consists of CheckTableNotInUse() plus a check that the relation + * isn't another session's temp table. We must split out the temp-table + * check because there are callers of CheckTableNotInUse() that don't want + * that, notably DROP TABLE. (We must allow DROP or we couldn't clean out + * an orphaned temp schema.) Compare truncate_check_activity(). + */ +static void +CheckAlterTableIsSafe(Relation rel) +{ + /* + * Don't allow ALTER on temp tables of other backends. Their local buffer + * manager is not going to cope if we need to change the table's contents. + * Even if we don't, there may be optimizations that assume temp tables + * aren't subject to such interference. + */ + if (RELATION_IS_OTHER_TEMP(rel)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot alter temporary tables of other sessions"))); + + /* + * Also check for active uses of the relation in the current transaction, + * including open scans and pending AFTER trigger events. + */ + CheckTableNotInUse(rel, "ALTER TABLE"); +} + /* * AlterTableLookupRelation * Look up, and lock, the OID for the relation named by an alter table @@ -4188,7 +4404,7 @@ AlterTable(AlterTableStmt *stmt, LOCKMODE lockmode, /* Caller is required to provide an adequate lock. */ rel = relation_open(context->relid, NoLock); - CheckTableNotInUse(rel, "ALTER TABLE"); + CheckAlterTableIsSafe(rel); ATController(stmt, rel, stmt->cmds, stmt->relation->inh, lockmode, context); } @@ -4361,6 +4577,7 @@ AlterTableGetLockLevel(List *cmds) case AT_AddIdentity: case AT_DropIdentity: case AT_SetIdentity: + case AT_SetExpression: case AT_DropExpression: case AT_SetCompression: cmd_lockmode = AccessExclusiveLock; @@ -4564,7 +4781,7 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, AlterTableUtilityContext *context) { AlteredTableInfo *tab; - int pass = AT_PASS_UNSET; + AlterTablePass pass = AT_PASS_UNSET; /* Find or create work queue entry for this table */ tab = ATGetQueueEntry(wqueue, rel); @@ -4636,18 +4853,24 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, break; case AT_AddIdentity: ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE); - /* This command never recurses */ + /* Set up recursion for phase 2; no other prep needed */ + if (recurse) + cmd->recurse = true; pass = AT_PASS_ADD_OTHERCONSTR; break; case AT_SetIdentity: ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE); - /* This command never recurses */ + /* Set up recursion for phase 2; no other prep needed */ + if (recurse) + cmd->recurse = true; /* This should run after AddIdentity, so do it in MISC pass */ pass = AT_PASS_MISC; break; case AT_DropIdentity: ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_VIEW | ATT_FOREIGN_TABLE); - /* This command never recurses */ + /* Set up recursion for phase 2; no other prep needed */ + if (recurse) + cmd->recurse = true; pass = AT_PASS_DROP; break; case AT_DropNotNull: /* ALTER COLUMN DROP NOT NULL */ @@ -4669,6 +4892,11 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, /* No command-specific prep needed */ pass = AT_PASS_COL_ATTRS; break; + case AT_SetExpression: /* ALTER COLUMN SET EXPRESSION */ + ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); + ATSimpleRecursion(wqueue, rel, cmd, recurse, lockmode, context); + pass = AT_PASS_SET_EXPRESSION; + break; case AT_DropExpression: /* ALTER COLUMN DROP EXPRESSION */ ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_FOREIGN_TABLE); ATSimpleRecursion(wqueue, rel, cmd, recurse, lockmode, context); @@ -4803,14 +5031,8 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, case AT_SetAccessMethod: /* SET ACCESS METHOD */ ATSimplePermissions(cmd->subtype, rel, ATT_TABLE | ATT_MATVIEW); - /* partitioned tables don't have an access method */ - if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("cannot change access method of a partitioned table"))); - /* check if another access method change was already requested */ - if (OidIsValid(tab->newAccessMethod)) + if (tab->chgAccessMethod) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot have multiple SET ACCESS METHOD subcommands"))); @@ -4936,7 +5158,6 @@ static void ATRewriteCatalogs(List **wqueue, LOCKMODE lockmode, AlterTableUtilityContext *context) { - int pass; ListCell *ltab; /* @@ -4946,7 +5167,7 @@ ATRewriteCatalogs(List **wqueue, LOCKMODE lockmode, * re-adding of the foreign key constraint to the other table). Work can * only be propagated into later passes, however. */ - for (pass = 0; pass < AT_NUM_PASSES; pass++) + for (AlterTablePass pass = 0; pass < AT_NUM_PASSES; pass++) { /* Go through each table that needs to be processed */ foreach(ltab, *wqueue) @@ -4971,11 +5192,11 @@ ATRewriteCatalogs(List **wqueue, LOCKMODE lockmode, lockmode, pass, context); /* - * After the ALTER TYPE pass, do cleanup work (this is not done in - * ATExecAlterColumnType since it should be done only once if - * multiple columns of a table are altered). + * After the ALTER TYPE or SET EXPRESSION pass, do cleanup work + * (this is not done in ATExecAlterColumnType since it should be + * done only once if multiple columns of a table are altered). */ - if (pass == AT_PASS_ALTER_TYPE) + if (pass == AT_PASS_ALTER_TYPE || pass == AT_PASS_SET_EXPRESSION) ATPostAlterTypeCleanup(wqueue, tab, lockmode); if (tab->rel) @@ -5009,7 +5230,7 @@ ATRewriteCatalogs(List **wqueue, LOCKMODE lockmode, */ static void ATExecCmd(List **wqueue, AlteredTableInfo *tab, - AlterTableCmd *cmd, LOCKMODE lockmode, int cur_pass, + AlterTableCmd *cmd, LOCKMODE lockmode, AlterTablePass cur_pass, AlterTableUtilityContext *context) { ObjectAddress address = InvalidObjectAddress; @@ -5033,16 +5254,16 @@ ATExecCmd(List **wqueue, AlteredTableInfo *tab, cmd = ATParseTransformCmd(wqueue, tab, rel, cmd, false, lockmode, cur_pass, context); Assert(cmd != NULL); - address = ATExecAddIdentity(rel, cmd->name, cmd->def, lockmode); + address = ATExecAddIdentity(rel, cmd->name, cmd->def, lockmode, cmd->recurse, false); break; case AT_SetIdentity: cmd = ATParseTransformCmd(wqueue, tab, rel, cmd, false, lockmode, cur_pass, context); Assert(cmd != NULL); - address = ATExecSetIdentity(rel, cmd->name, cmd->def, lockmode); + address = ATExecSetIdentity(rel, cmd->name, cmd->def, lockmode, cmd->recurse, false); break; case AT_DropIdentity: - address = ATExecDropIdentity(rel, cmd->name, cmd->missing_ok, lockmode); + address = ATExecDropIdentity(rel, cmd->name, cmd->missing_ok, lockmode, cmd->recurse, false); break; case AT_DropNotNull: /* ALTER COLUMN DROP NOT NULL */ address = ATExecDropNotNull(rel, cmd->name, lockmode); @@ -5053,6 +5274,9 @@ ATExecCmd(List **wqueue, AlteredTableInfo *tab, case AT_CheckNotNull: /* check column is already marked NOT NULL */ ATExecCheckNotNull(tab, rel, cmd->name, lockmode); break; + case AT_SetExpression: + address = ATExecSetExpression(tab, rel, cmd->name, cmd->def, lockmode); + break; case AT_DropExpression: address = ATExecDropExpression(rel, cmd->name, cmd->missing_ok, lockmode); break; @@ -5161,7 +5385,14 @@ ATExecCmd(List **wqueue, AlteredTableInfo *tab, /* nothing to do here, oid columns don't exist anymore */ break; case AT_SetAccessMethod: /* SET ACCESS METHOD */ - /* handled specially in Phase 3 */ + + /* + * Only do this for partitioned tables, for which this is just a + * catalog change. Tables with storage are handled by Phase 3. + */ + if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE && + tab->chgAccessMethod) + ATExecSetAccessMethodNoStorage(rel, tab->newAccessMethod); break; case AT_SetTableSpace: /* SET TABLESPACE */ @@ -5335,7 +5566,7 @@ ATExecCmd(List **wqueue, AlteredTableInfo *tab, static AlterTableCmd * ATParseTransformCmd(List **wqueue, AlteredTableInfo *tab, Relation rel, AlterTableCmd *cmd, bool recurse, LOCKMODE lockmode, - int cur_pass, AlterTableUtilityContext *context) + AlterTablePass cur_pass, AlterTableUtilityContext *context) { AlterTableCmd *newcmd = NULL; AlterTableStmt *atstmt = makeNode(AlterTableStmt); @@ -5373,7 +5604,7 @@ ATParseTransformCmd(List **wqueue, AlteredTableInfo *tab, Relation rel, foreach(lc, atstmt->cmds) { AlterTableCmd *cmd2 = lfirst_node(AlterTableCmd, lc); - int pass; + AlterTablePass pass; /* * This switch need only cover the subcommand types that can be added @@ -5545,7 +5776,9 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, /* * Don't allow rewrite on temp tables of other backends ... their - * local buffer manager is not going to cope. + * local buffer manager is not going to cope. (This is redundant + * with the check in CheckAlterTableIsSafe, but for safety we'll + * check here too.) */ if (RELATION_IS_OTHER_TEMP(OldHeap)) ereport(ERROR, @@ -5565,7 +5798,7 @@ ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, * Select destination access method (same as original unless user * requested a change) */ - if (OidIsValid(tab->newAccessMethod)) + if (tab->chgAccessMethod) NewAccessMethod = tab->newAccessMethod; else NewAccessMethod = OldHeap->rd_rel->relam; @@ -5845,7 +6078,7 @@ ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode) { /* * If we are rebuilding the tuples OR if we added any new but not - * verified NOT NULL constraints, check all not-null constraints. This + * verified not-null constraints, check all not-null constraints. This * is a bit of overkill but it minimizes risk of bugs, and * heap_attisnull is a pretty cheap test anyway. */ @@ -6151,6 +6384,7 @@ ATGetQueueEntry(List **wqueue, Relation rel) tab->relkind = rel->rd_rel->relkind; tab->oldDesc = CreateTupleDescCopyConstr(RelationGetDescr(rel)); tab->newAccessMethod = InvalidOid; + tab->chgAccessMethod = false; tab->newTableSpace = InvalidOid; tab->newrelpersistence = RELPERSISTENCE_PERMANENT; tab->chgPersistence = false; @@ -6175,6 +6409,8 @@ alter_table_type_to_string(AlterTableType cmdtype) return "ALTER COLUMN ... DROP NOT NULL"; case AT_SetNotNull: return "ALTER COLUMN ... SET NOT NULL"; + case AT_SetExpression: + return "ALTER COLUMN ... SET EXPRESSION"; case AT_DropExpression: return "ALTER COLUMN ... DROP EXPRESSION"; case AT_CheckNotNull: @@ -6409,7 +6645,7 @@ ATSimpleRecursion(List **wqueue, Relation rel, continue; /* find_all_inheritors already got lock */ childrel = relation_open(childrelid, NoLock); - CheckTableNotInUse(childrel, "ALTER TABLE"); + CheckAlterTableIsSafe(childrel); ATPrepCmd(wqueue, childrel, cmd, false, true, lockmode, context); relation_close(childrel, NoLock); } @@ -6418,7 +6654,7 @@ ATSimpleRecursion(List **wqueue, Relation rel, /* * Obtain list of partitions of the given table, locking them all at the given - * lockmode and ensuring that they all pass CheckTableNotInUse. + * lockmode and ensuring that they all pass CheckAlterTableIsSafe. * * This function is a no-op if the given relation is not a partitioned table; * in particular, nothing is done if it's a legacy inheritance parent. @@ -6439,7 +6675,7 @@ ATCheckPartitionsNotInUse(Relation rel, LOCKMODE lockmode) /* find_all_inheritors already got lock */ childrel = table_open(lfirst_oid(cell), NoLock); - CheckTableNotInUse(childrel, "ALTER TABLE"); + CheckAlterTableIsSafe(childrel); table_close(childrel, NoLock); } list_free(inh); @@ -6472,7 +6708,7 @@ ATTypedTableRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, Relation childrel; childrel = relation_open(childrelid, lockmode); - CheckTableNotInUse(childrel, "ALTER TABLE"); + CheckAlterTableIsSafe(childrel); ATPrepCmd(wqueue, childrel, cmd, true, true, lockmode, context); relation_close(childrel, NoLock); } @@ -6774,9 +7010,8 @@ ATPrepAddColumn(List **wqueue, Relation rel, bool recurse, bool recursing, */ static ObjectAddress ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, - AlterTableCmd **cmd, - bool recurse, bool recursing, - LOCKMODE lockmode, int cur_pass, + AlterTableCmd **cmd, bool recurse, bool recursing, + LOCKMODE lockmode, AlterTablePass cur_pass, AlterTableUtilityContext *context) { Oid myrelid = RelationGetRelid(rel); @@ -6785,22 +7020,18 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, Relation pgclass, attrdesc; HeapTuple reltup; - FormData_pg_attribute attribute; + Form_pg_attribute attribute; int newattnum; char relkind; - HeapTuple typeTuple; - Oid typeOid; - int32 typmod; - Oid collOid; - Form_pg_type tform; Expr *defval; List *children; ListCell *child; AlterTableCmd *childcmd; - AclResult aclresult; ObjectAddress address; TupleDesc tupdesc; - FormData_pg_attribute *aattr[] = {&attribute}; + + /* since this function recurses, it could be driven to stack overflow */ + check_stack_depth(); /* At top level, permission check was done in ATPrepCmd, else do it */ if (recursing) @@ -6866,6 +7097,10 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, colDef->colname, RelationGetRelationName(rel)))); table_close(attrdesc, RowExclusiveLock); + + /* Make the child column change visible */ + CommandCounterIncrement(); + return InvalidObjectAddress; } } @@ -6897,11 +7132,17 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, } /* - * Cannot add identity column if table has children, because identity does - * not inherit. (Adding column and identity separately will work.) + * Regular inheritance children are independent enough not to inherit the + * identity column from parent hence cannot recursively add identity + * column if the table has inheritance children. + * + * Partitions, on the other hand, are integral part of a partitioned table + * and inherit identity column. Hence propagate identity column down the + * partition hierarchy. */ if (colDef->identity && recurse && + rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE && find_inheritance_children(myrelid, NoLock) != NIL) ereport(ERROR, (errcode(ERRCODE_INVALID_TABLE_DEFINITION), @@ -6922,59 +7163,21 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, errmsg("tables can have at most %d columns", MaxHeapAttributeNumber))); - typeTuple = typenameType(NULL, colDef->typeName, &typmod); - tform = (Form_pg_type) GETSTRUCT(typeTuple); - typeOid = tform->oid; + /* + * Construct new attribute's pg_attribute entry. + */ + tupdesc = BuildDescForRelation(list_make1(colDef)); - aclresult = object_aclcheck(TypeRelationId, typeOid, GetUserId(), ACL_USAGE); - if (aclresult != ACLCHECK_OK) - aclcheck_error_type(aclresult, typeOid); + attribute = TupleDescAttr(tupdesc, 0); - collOid = GetColumnDefCollation(NULL, colDef, typeOid); + /* Fix up attribute number */ + attribute->attnum = newattnum; /* make sure datatype is legal for a column */ - CheckAttributeType(colDef->colname, typeOid, collOid, + CheckAttributeType(NameStr(attribute->attname), attribute->atttypid, attribute->attcollation, list_make1_oid(rel->rd_rel->reltype), 0); - /* - * Construct new attribute's pg_attribute entry. (Variable-length fields - * are handled by InsertPgAttributeTuples().) - */ - attribute.attrelid = myrelid; - namestrcpy(&(attribute.attname), colDef->colname); - attribute.atttypid = typeOid; - attribute.attstattarget = (newattnum > 0) ? -1 : 0; - attribute.attlen = tform->typlen; - attribute.attnum = newattnum; - if (list_length(colDef->typeName->arrayBounds) > PG_INT16_MAX) - ereport(ERROR, - errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("too many array dimensions")); - attribute.attndims = list_length(colDef->typeName->arrayBounds); - attribute.atttypmod = typmod; - attribute.attbyval = tform->typbyval; - attribute.attalign = tform->typalign; - if (colDef->storage_name) - attribute.attstorage = GetAttributeStorage(typeOid, colDef->storage_name); - else - attribute.attstorage = tform->typstorage; - attribute.attcompression = GetAttributeCompression(typeOid, - colDef->compression); - attribute.attnotnull = colDef->is_not_null; - attribute.atthasdef = false; - attribute.atthasmissing = false; - attribute.attidentity = colDef->identity; - attribute.attgenerated = colDef->generated; - attribute.attisdropped = false; - attribute.attislocal = colDef->is_local; - attribute.attinhcount = colDef->inhcount; - attribute.attcollation = collOid; - - ReleaseSysCache(typeTuple); - - tupdesc = CreateTupleDesc(lengthof(aattr), (FormData_pg_attribute **) &aattr); - InsertPgAttributeTuples(attrdesc, tupdesc, myrelid, NULL, NULL); table_close(attrdesc, RowExclusiveLock); @@ -7004,16 +7207,9 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, RawColumnDefault *rawEnt; rawEnt = (RawColumnDefault *) palloc(sizeof(RawColumnDefault)); - rawEnt->attnum = attribute.attnum; + rawEnt->attnum = attribute->attnum; rawEnt->raw_default = copyObject(colDef->raw_default); - - /* - * Attempt to skip a complete table rewrite by storing the specified - * DEFAULT value outside of the heap. This may be disabled inside - * AddRelationNewConstraints if the optimization cannot be applied. - */ - rawEnt->missingMode = (!colDef->generated); - + rawEnt->missingMode = false; /* XXX vestigial */ rawEnt->generated = colDef->generated; /* @@ -7025,13 +7221,6 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, /* Make the additional catalog changes visible */ CommandCounterIncrement(); - - /* - * Did the request for a missing value work? If not we'll have to do a - * rewrite - */ - if (!rawEnt->missingMode) - tab->rewrite |= AT_REWRITE_DEFAULT_VAL; } /* @@ -7044,13 +7233,13 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, * the effect of NULL values in the new column. * * An exception occurs when the new column is of a domain type: the domain - * might have a NOT NULL constraint, or a check constraint that indirectly + * might have a not-null constraint, or a check constraint that indirectly * rejects nulls. If there are any domain constraints then we construct * an explicit NULL default value that will be passed through * CoerceToDomain processing. (This is a tad inefficient, since it causes - * rewriting the table which we really don't have to do, but the present - * design of domain processing doesn't offer any simple way of checking - * the constraints more directly.) + * rewriting the table which we really wouldn't have to do; but we do it + * to preserve the historical behavior that such a failure will be raised + * only if the table currently contains some rows.) * * Note: we use build_column_default, and not just the cooked default * returned by AddRelationNewConstraints, so that the right thing happens @@ -7067,8 +7256,11 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, * is certainly not going to touch them. System attributes don't have * interesting defaults, either. */ - if (RELKIND_HAS_STORAGE(relkind) && attribute.attnum > 0) + if (RELKIND_HAS_STORAGE(relkind)) { + bool has_domain_constraints; + bool has_missing = false; + /* * For an identity column, we can't use build_column_default(), * because the sequence ownership isn't set yet. So do it manually. @@ -7078,31 +7270,30 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, NextValueExpr *nve = makeNode(NextValueExpr); nve->seqid = RangeVarGetRelid(colDef->identitySequence, NoLock, false); - nve->typeId = typeOid; + nve->typeId = attribute->atttypid; defval = (Expr *) nve; - - /* must do a rewrite for identity columns */ - tab->rewrite |= AT_REWRITE_DEFAULT_VAL; } else - defval = (Expr *) build_column_default(rel, attribute.attnum); + defval = (Expr *) build_column_default(rel, attribute->attnum); - if (!defval && DomainHasConstraints(typeOid)) + /* Build CoerceToDomain(NULL) expression if needed */ + has_domain_constraints = DomainHasConstraints(attribute->atttypid); + if (!defval && has_domain_constraints) { Oid baseTypeId; int32 baseTypeMod; Oid baseTypeColl; - baseTypeMod = typmod; - baseTypeId = getBaseTypeAndTypmod(typeOid, &baseTypeMod); + baseTypeMod = attribute->atttypmod; + baseTypeId = getBaseTypeAndTypmod(attribute->atttypid, &baseTypeMod); baseTypeColl = get_typcollation(baseTypeId); defval = (Expr *) makeNullConst(baseTypeId, baseTypeMod, baseTypeColl); defval = (Expr *) coerce_to_target_type(NULL, (Node *) defval, baseTypeId, - typeOid, - typmod, + attribute->atttypid, + attribute->atttypmod, COERCION_ASSIGNMENT, COERCE_IMPLICIT_CAST, -1); @@ -7114,18 +7305,63 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, { NewColumnValue *newval; + /* Prepare defval for execution, either here or in Phase 3 */ + defval = expression_planner(defval); + + /* Add the new default to the newvals list */ newval = (NewColumnValue *) palloc0(sizeof(NewColumnValue)); - newval->attnum = attribute.attnum; - newval->expr = expression_planner(defval); + newval->attnum = attribute->attnum; + newval->expr = defval; newval->is_generated = (colDef->generated != '\0'); tab->newvals = lappend(tab->newvals, newval); - } - if (DomainHasConstraints(typeOid)) - tab->rewrite |= AT_REWRITE_DEFAULT_VAL; + /* + * Attempt to skip a complete table rewrite by storing the + * specified DEFAULT value outside of the heap. This is only + * allowed for plain relations and non-generated columns, and the + * default expression can't be volatile (stable is OK). Note that + * contain_volatile_functions deems CoerceToDomain immutable, but + * here we consider that coercion to a domain with constraints is + * volatile; else it might fail even when the table is empty. + */ + if (rel->rd_rel->relkind == RELKIND_RELATION && + !colDef->generated && + !has_domain_constraints && + !contain_volatile_functions((Node *) defval)) + { + EState *estate; + ExprState *exprState; + Datum missingval; + bool missingIsNull; + + /* Evaluate the default expression */ + estate = CreateExecutorState(); + exprState = ExecPrepareExpr(defval, estate); + missingval = ExecEvalExpr(exprState, + GetPerTupleExprContext(estate), + &missingIsNull); + /* If it turns out NULL, nothing to do; else store it */ + if (!missingIsNull) + { + StoreAttrMissingVal(rel, attribute->attnum, missingval); + /* Make the additional catalog change visible */ + CommandCounterIncrement(); + has_missing = true; + } + FreeExecutorState(estate); + } + else + { + /* + * Failed to use missing mode. We have to do a table rewrite + * to install the value. + */ + tab->rewrite |= AT_REWRITE_DEFAULT_VAL; + } + } - if (!TupleDescAttr(rel->rd_att, attribute.attnum - 1)->atthasmissing) + if (!has_missing) { /* * If the new column is NOT NULL, and there is no missing value, @@ -7138,8 +7374,8 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, /* * Add needed dependency entries for the new column. */ - add_column_datatype_dependency(myrelid, newattnum, attribute.atttypid); - add_column_collation_dependency(myrelid, newattnum, attribute.attcollation); + add_column_datatype_dependency(myrelid, newattnum, attribute->atttypid); + add_column_collation_dependency(myrelid, newattnum, attribute->attcollation); /* * Propagate to children as appropriate. Unlike most other ALTER @@ -7177,7 +7413,7 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, /* find_inheritance_children already got lock */ childrel = table_open(childrelid, NoLock); - CheckTableNotInUse(childrel, "ALTER TABLE"); + CheckAlterTableIsSafe(childrel); /* Find or create work queue entry for this table */ childtab = ATGetQueueEntry(wqueue, childrel); @@ -7324,7 +7560,6 @@ ATExecDropNotNull(Relation rel, const char *colName, LOCKMODE lockmode) AttrNumber attnum; Relation attr_rel; List *indexoidlist; - ListCell *indexoidscan; ObjectAddress address; /* @@ -7364,12 +7599,10 @@ ATExecDropNotNull(Relation rel, const char *colName, LOCKMODE lockmode) /* Loop over all indexes on the relation */ indexoidlist = RelationGetIndexList(rel); - foreach(indexoidscan, indexoidlist) + foreach_oid(indexoid, indexoidlist) { - Oid indexoid = lfirst_oid(indexoidscan); HeapTuple indexTuple; Form_pg_index indexStruct; - int i; indexTuple = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(indexoid)); if (!HeapTupleIsValid(indexTuple)) @@ -7387,7 +7620,7 @@ ATExecDropNotNull(Relation rel, const char *colName, LOCKMODE lockmode) * as replica identity and see if it matches the to-be-altered * attribute. */ - for (i = 0; i < indexStruct->indnkeyatts; i++) + for (int i = 0; i < indexStruct->indnkeyatts; i++) { if (indexStruct->indkey.values[i] == attnum) { @@ -7567,7 +7800,7 @@ ATExecSetNotNull(AlteredTableInfo *tab, Relation rel, * Ordinarily phase 3 must ensure that no NULLs exist in columns that * are set NOT NULL; however, if we can find a constraint which proves * this then we can skip that. We needn't bother looking if we've - * already found that we must verify some other NOT NULL constraint. + * already found that we must verify some other not-null constraint. */ if (!tab->verify_new_notnull && !NotNullImpliedByRelConstraints(rel, (Form_pg_attribute) GETSTRUCT(tuple))) @@ -7615,9 +7848,9 @@ ATExecCheckNotNull(AlteredTableInfo *tab, Relation rel, if (!HeapTupleIsValid(tuple)) ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_COLUMN), - errmsg("column \"%s\" of relation \"%s\" does not exist", - colName, RelationGetRelationName(rel)))); + errcode(ERRCODE_UNDEFINED_COLUMN), + errmsg("column \"%s\" of relation \"%s\" does not exist", + colName, RelationGetRelationName(rel))); if (!((Form_pg_attribute) GETSTRUCT(tuple))->attnotnull) ereport(ERROR, @@ -7701,15 +7934,20 @@ ATExecColumnDefault(Relation rel, const char *colName, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("column \"%s\" of relation \"%s\" is an identity column", colName, RelationGetRelationName(rel)), - newDefault ? 0 : errhint("Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead."))); + /* translator: %s is an SQL ALTER command */ + newDefault ? 0 : errhint("Use %s instead.", + "ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY"))); if (TupleDescAttr(tupdesc, attnum - 1)->attgenerated) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("column \"%s\" of relation \"%s\" is a generated column", colName, RelationGetRelationName(rel)), - newDefault || TupleDescAttr(tupdesc, attnum - 1)->attgenerated != ATTRIBUTE_GENERATED_STORED ? 0 : - errhint("Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead."))); + newDefault ? + /* translator: %s is an SQL ALTER command */ + errhint("Use %s instead.", "ALTER TABLE ... ALTER COLUMN ... SET EXPRESSION") : + (TupleDescAttr(tupdesc, attnum - 1)->attgenerated == ATTRIBUTE_GENERATED_STORED ? + errhint("Use %s instead.", "ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION") : 0))); /* * Remove any old default for the column. We use RESTRICT here for @@ -7783,7 +8021,7 @@ ATExecCookedColumnDefault(Relation rel, AttrNumber attnum, */ static ObjectAddress ATExecAddIdentity(Relation rel, const char *colName, - Node *def, LOCKMODE lockmode) + Node *def, LOCKMODE lockmode, bool recurse, bool recursing) { Relation attrelation; HeapTuple tuple; @@ -7791,6 +8029,19 @@ ATExecAddIdentity(Relation rel, const char *colName, AttrNumber attnum; ObjectAddress address; ColumnDef *cdef = castNode(ColumnDef, def); + bool ispartitioned; + + ispartitioned = (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE); + if (ispartitioned && !recurse) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("cannot add identity to a column of only the partitioned table"), + errhint("Do not specify the ONLY keyword."))); + + if (rel->rd_rel->relispartition && !recursing) + ereport(ERROR, + errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("cannot add identity to a column of a partition")); attrelation = table_open(AttributeRelationId, RowExclusiveLock); @@ -7845,6 +8096,27 @@ ATExecAddIdentity(Relation rel, const char *colName, table_close(attrelation, RowExclusiveLock); + /* + * Recurse to propagate the identity column to partitions. Identity is + * not inherited in regular inheritance children. + */ + if (recurse && ispartitioned) + { + List *children; + ListCell *lc; + + children = find_inheritance_children(RelationGetRelid(rel), lockmode); + + foreach(lc, children) + { + Relation childrel; + + childrel = table_open(lfirst_oid(lc), NoLock); + ATExecAddIdentity(childrel, colName, def, lockmode, recurse, true); + table_close(childrel, NoLock); + } + } + return address; } @@ -7854,7 +8126,8 @@ ATExecAddIdentity(Relation rel, const char *colName, * Return the address of the affected column. */ static ObjectAddress -ATExecSetIdentity(Relation rel, const char *colName, Node *def, LOCKMODE lockmode) +ATExecSetIdentity(Relation rel, const char *colName, Node *def, + LOCKMODE lockmode, bool recurse, bool recursing) { ListCell *option; DefElem *generatedEl = NULL; @@ -7863,6 +8136,19 @@ ATExecSetIdentity(Relation rel, const char *colName, Node *def, LOCKMODE lockmod AttrNumber attnum; Relation attrelation; ObjectAddress address; + bool ispartitioned; + + ispartitioned = (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE); + if (ispartitioned && !recurse) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("cannot change identity column of only the partitioned table"), + errhint("Do not specify the ONLY keyword."))); + + if (rel->rd_rel->relispartition && !recursing) + ereport(ERROR, + errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("cannot change identity column of a partition")); foreach(option, castNode(List, def)) { @@ -7927,6 +8213,27 @@ ATExecSetIdentity(Relation rel, const char *colName, Node *def, LOCKMODE lockmod heap_freetuple(tuple); table_close(attrelation, RowExclusiveLock); + /* + * Recurse to propagate the identity change to partitions. Identity is not + * inherited in regular inheritance children. + */ + if (generatedEl && recurse && ispartitioned) + { + List *children; + ListCell *lc; + + children = find_inheritance_children(RelationGetRelid(rel), lockmode); + + foreach(lc, children) + { + Relation childrel; + + childrel = table_open(lfirst_oid(lc), NoLock); + ATExecSetIdentity(childrel, colName, def, lockmode, recurse, true); + table_close(childrel, NoLock); + } + } + return address; } @@ -7936,7 +8243,8 @@ ATExecSetIdentity(Relation rel, const char *colName, Node *def, LOCKMODE lockmod * Return the address of the affected column. */ static ObjectAddress -ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE lockmode) +ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE lockmode, + bool recurse, bool recursing) { HeapTuple tuple; Form_pg_attribute attTup; @@ -7945,6 +8253,19 @@ ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE ObjectAddress address; Oid seqid; ObjectAddress seqaddress; + bool ispartitioned; + + ispartitioned = (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE); + if (ispartitioned && !recurse) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("cannot drop identity from a column of only the partitioned table"), + errhint("Do not specify the ONLY keyword."))); + + if (rel->rd_rel->relispartition && !recursing) + ereport(ERROR, + errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("cannot drop identity from a column of a partition")); attrelation = table_open(AttributeRelationId, RowExclusiveLock); tuple = SearchSysCacheCopyAttName(RelationGetRelid(rel), colName); @@ -7993,22 +8314,161 @@ ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE table_close(attrelation, RowExclusiveLock); - /* drop the internal sequence */ - seqid = getIdentitySequence(RelationGetRelid(rel), attnum, false); - deleteDependencyRecordsForClass(RelationRelationId, seqid, - RelationRelationId, DEPENDENCY_INTERNAL); - CommandCounterIncrement(); - seqaddress.classId = RelationRelationId; - seqaddress.objectId = seqid; - seqaddress.objectSubId = 0; - performDeletion(&seqaddress, DROP_RESTRICT, PERFORM_DELETION_INTERNAL); + /* + * Recurse to drop the identity from column in partitions. Identity is + * not inherited in regular inheritance children so ignore them. + */ + if (recurse && ispartitioned) + { + List *children; + ListCell *lc; - return address; -} + children = find_inheritance_children(RelationGetRelid(rel), lockmode); -/* - * ALTER TABLE ALTER COLUMN DROP EXPRESSION - */ + foreach(lc, children) + { + Relation childrel; + + childrel = table_open(lfirst_oid(lc), NoLock); + ATExecDropIdentity(childrel, colName, false, lockmode, recurse, true); + table_close(childrel, NoLock); + } + } + + if (!recursing) + { + /* drop the internal sequence */ + seqid = getIdentitySequence(rel, attnum, false); + deleteDependencyRecordsForClass(RelationRelationId, seqid, + RelationRelationId, DEPENDENCY_INTERNAL); + CommandCounterIncrement(); + seqaddress.classId = RelationRelationId; + seqaddress.objectId = seqid; + seqaddress.objectSubId = 0; + performDeletion(&seqaddress, DROP_RESTRICT, PERFORM_DELETION_INTERNAL); + } + + return address; +} + +/* + * ALTER TABLE ALTER COLUMN SET EXPRESSION + * + * Return the address of the affected column. + */ +static ObjectAddress +ATExecSetExpression(AlteredTableInfo *tab, Relation rel, const char *colName, + Node *newExpr, LOCKMODE lockmode) +{ + HeapTuple tuple; + Form_pg_attribute attTup; + AttrNumber attnum; + Oid attrdefoid; + ObjectAddress address; + Expr *defval; + NewColumnValue *newval; + RawColumnDefault *rawEnt; + + tuple = SearchSysCacheAttName(RelationGetRelid(rel), colName); + if (!HeapTupleIsValid(tuple)) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_COLUMN), + errmsg("column \"%s\" of relation \"%s\" does not exist", + colName, RelationGetRelationName(rel)))); + + attTup = (Form_pg_attribute) GETSTRUCT(tuple); + attnum = attTup->attnum; + + if (attnum <= 0) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot alter system column \"%s\"", + colName))); + + if (attTup->attgenerated != ATTRIBUTE_GENERATED_STORED) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("column \"%s\" of relation \"%s\" is not a generated column", + colName, RelationGetRelationName(rel)))); + ReleaseSysCache(tuple); + + /* + * Clear all the missing values if we're rewriting the table, since this + * renders them pointless. + */ + RelationClearMissing(rel); + + /* make sure we don't conflict with later attribute modifications */ + CommandCounterIncrement(); + + /* + * Find everything that depends on the column (constraints, indexes, etc), + * and record enough information to let us recreate the objects after + * rewrite. + */ + RememberAllDependentForRebuilding(tab, AT_SetExpression, rel, attnum, colName); + + /* + * Drop the dependency records of the GENERATED expression, in particular + * its INTERNAL dependency on the column, which would otherwise cause + * dependency.c to refuse to perform the deletion. + */ + attrdefoid = GetAttrDefaultOid(RelationGetRelid(rel), attnum); + if (!OidIsValid(attrdefoid)) + elog(ERROR, "could not find attrdef tuple for relation %u attnum %d", + RelationGetRelid(rel), attnum); + (void) deleteDependencyRecordsFor(AttrDefaultRelationId, attrdefoid, false); + + /* Make above changes visible */ + CommandCounterIncrement(); + + /* + * Get rid of the GENERATED expression itself. We use RESTRICT here for + * safety, but at present we do not expect anything to depend on the + * expression. + */ + RemoveAttrDefault(RelationGetRelid(rel), attnum, DROP_RESTRICT, + false, false); + + /* Prepare to store the new expression, in the catalogs */ + rawEnt = (RawColumnDefault *) palloc(sizeof(RawColumnDefault)); + rawEnt->attnum = attnum; + rawEnt->raw_default = newExpr; + rawEnt->missingMode = false; + rawEnt->generated = ATTRIBUTE_GENERATED_STORED; + + /* Store the generated expression */ + AddRelationNewConstraints(rel, list_make1(rawEnt), NIL, + false, true, false, NULL); + + /* Make above new expression visible */ + CommandCounterIncrement(); + + /* Prepare for table rewrite */ + defval = (Expr *) build_column_default(rel, attnum); + + newval = (NewColumnValue *) palloc0(sizeof(NewColumnValue)); + newval->attnum = attnum; + newval->expr = expression_planner(defval); + newval->is_generated = true; + + tab->newvals = lappend(tab->newvals, newval); + tab->rewrite |= AT_REWRITE_DEFAULT_VAL; + + /* Drop any pg_statistic entry for the column */ + RemoveStatistics(RelationGetRelid(rel), attnum); + + InvokeObjectPostAlterHook(RelationRelationId, + RelationGetRelid(rel), attnum); + + ObjectAddressSubSet(address, RelationRelationId, + RelationGetRelid(rel), attnum); + return address; +} + +/* + * ALTER TABLE ALTER COLUMN DROP EXPRESSION + */ static void ATPrepDropExpression(Relation rel, AlterTableCmd *cmd, bool recurse, bool recursing, LOCKMODE lockmode) { @@ -8149,12 +8609,17 @@ ATExecDropExpression(Relation rel, const char *colName, bool missing_ok, LOCKMOD static ObjectAddress ATExecSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newValue, LOCKMODE lockmode) { - int newtarget; + int newtarget = 0; + bool newtarget_default; Relation attrelation; - HeapTuple tuple; + HeapTuple tuple, + newtuple; Form_pg_attribute attrtuple; AttrNumber attnum; ObjectAddress address; + Datum repl_val[Natts_pg_attribute]; + bool repl_null[Natts_pg_attribute]; + bool repl_repl[Natts_pg_attribute]; /* * We allow referencing columns by numbers only for indexes, since table @@ -8167,33 +8632,42 @@ ATExecSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newVa (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot refer to non-index column by number"))); - Assert(IsA(newValue, Integer)); - newtarget = intVal(newValue); - - /* - * Limit target to a sane range - */ - if (newtarget < -1) + /* -1 was used in previous versions for the default setting */ + if (newValue && intVal(newValue) != -1) { - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("statistics target %d is too low", - newtarget))); + newtarget = intVal(newValue); + newtarget_default = false; } - else if (newtarget > 10000) + else + newtarget_default = true; + + if (!newtarget_default) { - newtarget = 10000; - ereport(WARNING, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("lowering statistics target to %d", - newtarget))); + /* + * Limit target to a sane range + */ + if (newtarget < 0) + { + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("statistics target %d is too low", + newtarget))); + } + else if (newtarget > MAX_STATISTICS_TARGET) + { + newtarget = MAX_STATISTICS_TARGET; + ereport(WARNING, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("lowering statistics target to %d", + newtarget))); + } } attrelation = table_open(AttributeRelationId, RowExclusiveLock); if (colName) { - tuple = SearchSysCacheCopyAttName(RelationGetRelid(rel), colName); + tuple = SearchSysCacheAttName(RelationGetRelid(rel), colName); if (!HeapTupleIsValid(tuple)) ereport(ERROR, @@ -8203,7 +8677,7 @@ ATExecSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newVa } else { - tuple = SearchSysCacheCopyAttNum(RelationGetRelid(rel), colNum); + tuple = SearchSysCacheAttNum(RelationGetRelid(rel), colNum); if (!HeapTupleIsValid(tuple)) ereport(ERROR, @@ -8237,16 +8711,27 @@ ATExecSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newVa errhint("Alter statistics on table column instead."))); } - attrtuple->attstattarget = newtarget; - - CatalogTupleUpdate(attrelation, &tuple->t_self, tuple); + /* Build new tuple. */ + memset(repl_null, false, sizeof(repl_null)); + memset(repl_repl, false, sizeof(repl_repl)); + if (!newtarget_default) + repl_val[Anum_pg_attribute_attstattarget - 1] = newtarget; + else + repl_null[Anum_pg_attribute_attstattarget - 1] = true; + repl_repl[Anum_pg_attribute_attstattarget - 1] = true; + newtuple = heap_modify_tuple(tuple, RelationGetDescr(attrelation), + repl_val, repl_null, repl_repl); + CatalogTupleUpdate(attrelation, &tuple->t_self, newtuple); InvokeObjectPostAlterHook(RelationRelationId, RelationGetRelid(rel), attrtuple->attnum); ObjectAddressSubSet(address, RelationRelationId, RelationGetRelid(rel), attnum); - heap_freetuple(tuple); + + heap_freetuple(newtuple); + + ReleaseSysCache(tuple); table_close(attrelation, RowExclusiveLock); @@ -8509,6 +8994,10 @@ ATExecDropColumn(List **wqueue, Relation rel, const char *colName, /* Initialize addrs on the first invocation */ Assert(!recursing || addrs != NULL); + + /* since this function recurses, it could be driven to stack overflow */ + check_stack_depth(); + if (!recursing) addrs = new_object_addresses(); @@ -8601,7 +9090,7 @@ ATExecDropColumn(List **wqueue, Relation rel, const char *colName, /* find_inheritance_children already got lock */ childrel = table_open(childrelid, NoLock); - CheckTableNotInUse(childrel, "ALTER TABLE"); + CheckAlterTableIsSafe(childrel); tuple = SearchSysCacheCopyAttName(childrelid, colName); if (!HeapTupleIsValid(tuple)) /* shouldn't happen */ @@ -9084,7 +9573,7 @@ ATAddCheckConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, /* find_inheritance_children already got lock */ childrel = table_open(childrelid, NoLock); - CheckTableNotInUse(childrel, "ALTER TABLE"); + CheckAlterTableIsSafe(childrel); /* Find or create work queue entry for this table */ childtab = ATGetQueueEntry(wqueue, childrel); @@ -9227,9 +9716,10 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, numfkdelsetcols = transformColumnNameList(RelationGetRelid(rel), fkconstraint->fk_del_set_cols, fkdelsetcols, NULL); - validateFkOnDeleteSetColumns(numfks, fkattnum, - numfkdelsetcols, fkdelsetcols, - fkconstraint->fk_del_set_cols); + numfkdelsetcols = validateFkOnDeleteSetColumns(numfks, fkattnum, + numfkdelsetcols, + fkdelsetcols, + fkconstraint->fk_del_set_cols); /* * If the attribute list for the referenced table was omitted, lookup the @@ -9492,25 +9982,37 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, ffeqoperators[i] = ffeqop; } - /* - * Create all the constraint and trigger objects, recursing to partitions - * as necessary. First handle the referenced side. - */ - address = addFkRecurseReferenced(wqueue, fkconstraint, rel, pkrel, - indexOid, - InvalidOid, /* no parent constraint */ - numfks, - pkattnum, - fkattnum, - pfeqoperators, - ppeqoperators, - ffeqoperators, - numfkdelsetcols, - fkdelsetcols, - old_check_ok, - InvalidOid, InvalidOid); - - /* Now handle the referencing side. */ + /* First, create the constraint catalog entry itself. */ + address = addFkConstraint(addFkBothSides, + fkconstraint->conname, fkconstraint, rel, pkrel, + indexOid, + InvalidOid, /* no parent constraint */ + numfks, + pkattnum, + fkattnum, + pfeqoperators, + ppeqoperators, + ffeqoperators, + numfkdelsetcols, + fkdelsetcols, + false); + + /* Next process the action triggers at the referenced side and recurse */ + addFkRecurseReferenced(fkconstraint, rel, pkrel, + indexOid, + address.objectId, + numfks, + pkattnum, + fkattnum, + pfeqoperators, + ppeqoperators, + ffeqoperators, + numfkdelsetcols, + fkdelsetcols, + old_check_ok, + InvalidOid, InvalidOid); + + /* Lastly create the check triggers at the referencing side and recurse */ addFkRecurseReferencing(wqueue, fkconstraint, rel, pkrel, indexOid, address.objectId, @@ -9538,17 +10040,23 @@ ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, * validateFkOnDeleteSetColumns * Verifies that columns used in ON DELETE SET NULL/DEFAULT (...) * column lists are valid. + * + * If there are duplicates in the fksetcolsattnums[] array, this silently + * removes the dups. The new count of numfksetcols is returned. */ -void +static int validateFkOnDeleteSetColumns(int numfks, const int16 *fkattnums, - int numfksetcols, const int16 *fksetcolsattnums, + int numfksetcols, int16 *fksetcolsattnums, List *fksetcols) { + int numcolsout = 0; + for (int i = 0; i < numfksetcols; i++) { int16 setcol_attnum = fksetcolsattnums[i]; bool seen = false; + /* Make sure it's in fkattnums[] */ for (int j = 0; j < numfks; j++) { if (fkattnums[j] == setcol_attnum) @@ -9566,50 +10074,59 @@ validateFkOnDeleteSetColumns(int numfks, const int16 *fkattnums, (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), errmsg("column \"%s\" referenced in ON DELETE SET action must be part of foreign key", col))); } + + /* Now check for dups */ + seen = false; + for (int j = 0; j < numcolsout; j++) + { + if (fksetcolsattnums[j] == setcol_attnum) + { + seen = true; + break; + } + } + if (!seen) + fksetcolsattnums[numcolsout++] = setcol_attnum; } + return numcolsout; } /* - * addFkRecurseReferenced - * subroutine for ATAddForeignKeyConstraint; recurses on the referenced - * side of the constraint - * - * Create pg_constraint rows for the referenced side of the constraint, - * referencing the parent of the referencing side; also create action triggers - * on leaf partitions. If the table is partitioned, recurse to handle each - * partition. + * addFkConstraint + * Install pg_constraint entries to implement a foreign key constraint. + * Caller must separately invoke addFkRecurseReferenced and + * addFkRecurseReferencing, as appropriate, to install pg_trigger entries + * and (for partitioned tables) recurse to partitions. * - * wqueue is the ALTER TABLE work queue; can be NULL when not running as part - * of an ALTER TABLE sequence. - * fkconstraint is the constraint being added. - * rel is the root referencing relation. - * pkrel is the referenced relation; might be a partition, if recursing. - * indexOid is the OID of the index (on pkrel) implementing this constraint. - * parentConstr is the OID of a parent constraint; InvalidOid if this is a - * top-level constraint. - * numfks is the number of columns in the foreign key - * pkattnum is the attnum array of referenced attributes. - * fkattnum is the attnum array of referencing attributes. - * numfkdelsetcols is the number of columns in the ON DELETE SET NULL/DEFAULT + * fkside: the side of the FK (or both) to create. Caller should + * call addFkRecurseReferenced if this is addFkReferencedSide, + * addFkRecurseReferencing if it's addFkReferencingSide, or both if it's + * addFkBothSides. + * constraintname: the base name for the constraint being added, + * copied to fkconstraint->conname if the latter is not set + * fkconstraint: the constraint being added + * rel: the root referencing relation + * pkrel: the referenced relation; might be a partition, if recursing + * indexOid: the OID of the index (on pkrel) implementing this constraint + * parentConstr: the OID of a parent constraint; InvalidOid if this is a + * top-level constraint + * numfks: the number of columns in the foreign key + * pkattnum: the attnum array of referenced attributes + * fkattnum: the attnum array of referencing attributes + * pf/pp/ffeqoperators: OID array of operators between columns + * numfkdelsetcols: the number of columns in the ON DELETE SET NULL/DEFAULT * (...) clause - * fkdelsetcols is the attnum array of the columns in the ON DELETE SET + * fkdelsetcols: the attnum array of the columns in the ON DELETE SET * NULL/DEFAULT clause - * pf/pp/ffeqoperators are OID array of operators between columns. - * old_check_ok signals that this constraint replaces an existing one that - * was already validated (thus this one doesn't need validation). - * parentDelTrigger and parentUpdTrigger, when being recursively called on - * a partition, are the OIDs of the parent action triggers for DELETE and - * UPDATE respectively. */ static ObjectAddress -addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, - Relation pkrel, Oid indexOid, Oid parentConstr, - int numfks, - int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, - Oid *ppeqoperators, Oid *ffeqoperators, - int numfkdelsetcols, int16 *fkdelsetcols, - bool old_check_ok, - Oid parentDelTrigger, Oid parentUpdTrigger) +addFkConstraint(addFkConstraintSides fkside, + char *constraintname, Constraint *fkconstraint, + Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, + int numfks, int16 *pkattnum, + int16 *fkattnum, Oid *pfeqoperators, Oid *ppeqoperators, + Oid *ffeqoperators, int numfkdelsetcols, int16 *fkdelsetcols, + bool is_internal) { ObjectAddress address; Oid constrOid; @@ -9617,8 +10134,6 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, bool conislocal; int coninhcount; bool connoinherit; - Oid deleteTriggerOid, - updateTriggerOid; /* * Verify relkind for each referenced partition. At the top level, this @@ -9637,13 +10152,16 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, */ if (ConstraintNameIsUsed(CONSTRAINT_RELATION, RelationGetRelid(rel), - fkconstraint->conname)) + constraintname)) conname = ChooseConstraintName(RelationGetRelationName(rel), ChooseForeignKeyConstraintNameAddition(fkconstraint->fk_attrs), "fkey", RelationGetNamespace(rel), NIL); else - conname = fkconstraint->conname; + conname = constraintname; + + if (fkconstraint->conname == NULL) + fkconstraint->conname = pstrdup(conname); if (OidIsValid(parentConstr)) { @@ -9695,33 +10213,107 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, conislocal, /* islocal */ coninhcount, /* inhcount */ connoinherit, /* conNoInherit */ - false); /* is_internal */ + is_internal); /* is_internal */ ObjectAddressSet(address, ConstraintRelationId, constrOid); /* - * Mark the child constraint as part of the parent constraint; it must not - * be dropped on its own. (This constraint is deleted when the partition - * is detached, but a special check needs to occur that the partition - * contains no referenced values.) + * In partitioning cases, create the dependency entries for this + * constraint. (For non-partitioned cases, relevant entries were created + * by CreateConstraintEntry.) + * + * On the referenced side, we need the constraint to have an internal + * dependency on its parent constraint; this means that this constraint + * cannot be dropped on its own -- only through the parent constraint. It + * also means the containing partition cannot be dropped on its own, but + * it can be detached, at which point this dependency is removed (after + * verifying that no rows are referenced via this FK.) + * + * When processing the referencing side, we link the constraint via the + * special partitioning dependencies: the parent constraint is the primary + * dependent, and the partition on which the foreign key exists is the + * secondary dependency. That way, this constraint is dropped if either + * of these objects is. + * + * Note that this is only necessary for the subsidiary pg_constraint rows + * in partitions; the topmost row doesn't need any of this. */ if (OidIsValid(parentConstr)) { ObjectAddress referenced; ObjectAddressSet(referenced, ConstraintRelationId, parentConstr); - recordDependencyOn(&address, &referenced, DEPENDENCY_INTERNAL); + + Assert(fkside != addFkBothSides); + if (fkside == addFkReferencedSide) + recordDependencyOn(&address, &referenced, DEPENDENCY_INTERNAL); + else + { + recordDependencyOn(&address, &referenced, DEPENDENCY_PARTITION_PRI); + ObjectAddressSet(referenced, RelationRelationId, RelationGetRelid(rel)); + recordDependencyOn(&address, &referenced, DEPENDENCY_PARTITION_SEC); + } } /* make new constraint visible, in case we add more */ CommandCounterIncrement(); + return address; +} + +/* + * addFkRecurseReferenced + * Recursive helper for the referenced side of foreign key creation, + * which creates the action triggers and recurses + * + * If the referenced relation is a plain relation, create the necessary action + * triggers that implement the constraint. If the referenced relation is a + * partitioned table, then we create a pg_constraint row referencing the parent + * of the referencing side for it and recurse on this routine for each + * partition. + * + * fkconstraint: the constraint being added + * rel: the root referencing relation + * pkrel: the referenced relation; might be a partition, if recursing + * indexOid: the OID of the index (on pkrel) implementing this constraint + * parentConstr: the OID of a parent constraint; InvalidOid if this is a + * top-level constraint + * numfks: the number of columns in the foreign key + * pkattnum: the attnum array of referenced attributes + * fkattnum: the attnum array of referencing attributes + * numfkdelsetcols: the number of columns in the ON DELETE SET + * NULL/DEFAULT (...) clause + * fkdelsetcols: the attnum array of the columns in the ON DELETE SET + * NULL/DEFAULT clause + * pf/pp/ffeqoperators: OID array of operators between columns + * old_check_ok: true if this constraint replaces an existing one that + * was already validated (thus this one doesn't need validation) + * parentDelTrigger and parentUpdTrigger: when recursively called on a + * partition, the OIDs of the parent action triggers for DELETE and + * UPDATE respectively. + */ +static void +addFkRecurseReferenced(Constraint *fkconstraint, Relation rel, + Relation pkrel, Oid indexOid, Oid parentConstr, + int numfks, + int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, + Oid *ppeqoperators, Oid *ffeqoperators, + int numfkdelsetcols, int16 *fkdelsetcols, + bool old_check_ok, + Oid parentDelTrigger, Oid parentUpdTrigger) +{ + Oid deleteTriggerOid, + updateTriggerOid; + + Assert(CheckRelationLockedByMe(pkrel, ShareRowExclusiveLock, true)); + Assert(CheckRelationLockedByMe(rel, ShareRowExclusiveLock, true)); + /* * Create the action triggers that enforce the constraint. */ createForeignKeyActionTriggers(rel, RelationGetRelid(pkrel), fkconstraint, - constrOid, indexOid, + parentConstr, indexOid, parentDelTrigger, parentUpdTrigger, &deleteTriggerOid, &updateTriggerOid); @@ -9740,7 +10332,9 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, AttrMap *map; AttrNumber *mapped_pkattnum; Oid partIndexId; + ObjectAddress address; + /* XXX would it be better to acquire these locks beforehand? */ partRel = table_open(pd->oids[i], ShareRowExclusiveLock); /* @@ -9759,13 +10353,23 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, else mapped_pkattnum = pkattnum; - /* do the deed */ + /* Determine the index to use at this level */ partIndexId = index_get_partition(partRel, indexOid); if (!OidIsValid(partIndexId)) elog(ERROR, "index for %u not found in partition %s", indexOid, RelationGetRelationName(partRel)); - addFkRecurseReferenced(wqueue, fkconstraint, rel, partRel, - partIndexId, constrOid, numfks, + + /* Create entry at this level ... */ + address = addFkConstraint(addFkReferencedSide, + fkconstraint->conname, fkconstraint, rel, + partRel, partIndexId, parentConstr, + numfks, mapped_pkattnum, + fkattnum, pfeqoperators, ppeqoperators, + ffeqoperators, numfkdelsetcols, + fkdelsetcols, true); + /* ... and recurse to our children */ + addFkRecurseReferenced(fkconstraint, rel, partRel, + partIndexId, address.objectId, numfks, mapped_pkattnum, fkattnum, pfeqoperators, ppeqoperators, ffeqoperators, numfkdelsetcols, fkdelsetcols, @@ -9781,13 +10385,12 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, } } } - - return address; } /* * addFkRecurseReferencing - * subroutine for ATAddForeignKeyConstraint and CloneFkReferencing + * Recursive helper for the referencing side of foreign key creation, + * which creates the check triggers and recurses * * If the referencing relation is a plain relation, create the necessary check * triggers that implement the constraint, and set up for Phase 3 constraint @@ -9799,27 +10402,27 @@ addFkRecurseReferenced(List **wqueue, Constraint *fkconstraint, Relation rel, * deletions. If it's a partitioned relation, every partition must be so * locked. * - * wqueue is the ALTER TABLE work queue; can be NULL when not running as part - * of an ALTER TABLE sequence. - * fkconstraint is the constraint being added. - * rel is the referencing relation; might be a partition, if recursing. - * pkrel is the root referenced relation. - * indexOid is the OID of the index (on pkrel) implementing this constraint. - * parentConstr is the OID of the parent constraint (there is always one). - * numfks is the number of columns in the foreign key - * pkattnum is the attnum array of referenced attributes. - * fkattnum is the attnum array of referencing attributes. - * pf/pp/ffeqoperators are OID array of operators between columns. - * numfkdelsetcols is the number of columns in the ON DELETE SET NULL/DEFAULT + * wqueue: the ALTER TABLE work queue; NULL when not running as part + * of an ALTER TABLE sequence. + * fkconstraint: the constraint being added + * rel: the referencing relation; might be a partition, if recursing + * pkrel: the root referenced relation + * indexOid: the OID of the index (on pkrel) implementing this constraint + * parentConstr: the OID of the parent constraint (there is always one) + * numfks: the number of columns in the foreign key + * pkattnum: the attnum array of referenced attributes + * fkattnum: the attnum array of referencing attributes + * pf/pp/ffeqoperators: OID array of operators between columns + * numfkdelsetcols: the number of columns in the ON DELETE SET NULL/DEFAULT * (...) clause - * fkdelsetcols is the attnum array of the columns in the ON DELETE SET + * fkdelsetcols: the attnum array of the columns in the ON DELETE SET * NULL/DEFAULT clause - * old_check_ok signals that this constraint replaces an existing one that - * was already validated (thus this one doesn't need validation). - * lockmode is the lockmode to acquire on partitions when recursing. - * parentInsTrigger and parentUpdTrigger, when being recursively called on - * a partition, are the OIDs of the parent check triggers for INSERT and - * UPDATE respectively. + * old_check_ok: true if this constraint replaces an existing one that + * was already validated (thus this one doesn't need validation) + * lockmode: the lockmode to acquire on partitions when recursing + * parentInsTrigger and parentUpdTrigger: when being recursively called on + * a partition, the OIDs of the parent check triggers for INSERT and + * UPDATE respectively. */ static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, @@ -9834,6 +10437,8 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, updateTriggerOid; Assert(OidIsValid(parentConstr)); + Assert(CheckRelationLockedByMe(rel, ShareRowExclusiveLock, true)); + Assert(CheckRelationLockedByMe(pkrel, ShareRowExclusiveLock, true)); if (rel->rd_rel->relkind == RELKIND_FOREIGN_TABLE) ereport(ERROR, @@ -9907,13 +10512,10 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, AttrMap *attmap; AttrNumber mapped_fkattnum[INDEX_MAX_KEYS]; bool attached; - char *conname; - Oid constrOid; - ObjectAddress address, - referenced; + ObjectAddress address; ListCell *cell; - CheckTableNotInUse(partition, "ALTER TABLE"); + CheckAlterTableIsSafe(partition); attmap = build_attrmap_by_name(RelationGetDescr(partition), RelationGetDescr(rel), @@ -9953,65 +10555,18 @@ addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, /* * No luck finding a good constraint to reuse; create our own. */ - if (ConstraintNameIsUsed(CONSTRAINT_RELATION, - RelationGetRelid(partition), - fkconstraint->conname)) - conname = ChooseConstraintName(RelationGetRelationName(partition), - ChooseForeignKeyConstraintNameAddition(fkconstraint->fk_attrs), - "fkey", - RelationGetNamespace(partition), NIL); - else - conname = fkconstraint->conname; - constrOid = - CreateConstraintEntry(conname, - RelationGetNamespace(partition), - CONSTRAINT_FOREIGN, - fkconstraint->deferrable, - fkconstraint->initdeferred, - fkconstraint->initially_valid, - parentConstr, - partitionId, - mapped_fkattnum, - numfks, - numfks, - InvalidOid, - indexOid, - RelationGetRelid(pkrel), - pkattnum, - pfeqoperators, - ppeqoperators, - ffeqoperators, - numfks, - fkconstraint->fk_upd_action, - fkconstraint->fk_del_action, - fkdelsetcols, - numfkdelsetcols, - fkconstraint->fk_matchtype, - NULL, - NULL, - NULL, - false, - 1, - false, - false); - - /* - * Give this constraint partition-type dependencies on the parent - * constraint as well as the table. - */ - ObjectAddressSet(address, ConstraintRelationId, constrOid); - ObjectAddressSet(referenced, ConstraintRelationId, parentConstr); - recordDependencyOn(&address, &referenced, DEPENDENCY_PARTITION_PRI); - ObjectAddressSet(referenced, RelationRelationId, partitionId); - recordDependencyOn(&address, &referenced, DEPENDENCY_PARTITION_SEC); - - /* Make all this visible before recursing */ - CommandCounterIncrement(); + address = addFkConstraint(addFkReferencingSide, + fkconstraint->conname, fkconstraint, + partition, pkrel, indexOid, parentConstr, + numfks, pkattnum, + mapped_fkattnum, pfeqoperators, + ppeqoperators, ffeqoperators, + numfkdelsetcols, fkdelsetcols, true); /* call ourselves to finalize the creation and we're done */ addFkRecurseReferencing(wqueue, fkconstraint, partition, pkrel, indexOid, - constrOid, + address.objectId, numfks, pkattnum, mapped_fkattnum, @@ -10053,14 +10608,14 @@ CloneForeignKeyConstraints(List **wqueue, Relation parentRel, Assert(parentRel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE); /* - * Clone constraints for which the parent is on the referenced side. + * First, clone constraints where the parent is on the referencing side. */ - CloneFkReferenced(parentRel, partitionRel); + CloneFkReferencing(wqueue, parentRel, partitionRel); /* - * Now clone constraints where the parent is on the referencing side. + * Clone constraints for which the parent is on the referenced side. */ - CloneFkReferencing(wqueue, parentRel, partitionRel); + CloneFkReferenced(parentRel, partitionRel); } /* @@ -10071,8 +10626,6 @@ CloneForeignKeyConstraints(List **wqueue, Relation parentRel, * clone those constraints to the given partition. This is to be called * when the partition is being created or attached. * - * This ignores self-referencing FKs; those are handled by CloneFkReferencing. - * * This recurses to partitions, if the relation being attached is partitioned. * Recursion is done by calling addFkRecurseReferenced. */ @@ -10144,10 +10697,11 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel) int numfkdelsetcols; AttrNumber confdelsetcols[INDEX_MAX_KEYS]; Constraint *fkconstraint; + ObjectAddress address; Oid deleteTriggerOid, updateTriggerOid; - tuple = SearchSysCache1(CONSTROID, constrOid); + tuple = SearchSysCache1(CONSTROID, ObjectIdGetDatum(constrOid)); if (!HeapTupleIsValid(tuple)) elog(ERROR, "cache lookup failed for constraint %u", constrOid); constrForm = (Form_pg_constraint) GETSTRUCT(tuple); @@ -10162,24 +10716,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel) continue; } - /* - * Don't clone self-referencing foreign keys, which can be in the - * partitioned table or in the partition-to-be. - */ - if (constrForm->conrelid == RelationGetRelid(parentRel) || - constrForm->conrelid == RelationGetRelid(partitionRel)) - { - ReleaseSysCache(tuple); - continue; - } - - /* - * Because we're only expanding the key space at the referenced side, - * we don't need to prevent any operation in the referencing table, so - * AccessShareLock suffices (assumes that dropping the constraint - * acquires AEL). - */ - fkRel = table_open(constrForm->conrelid, AccessShareLock); + /* We need the same lock level that CreateTrigger will acquire */ + fkRel = table_open(constrForm->conrelid, ShareRowExclusiveLock); indexOid = constrForm->conindid; DeconstructFkConstraintRow(tuple, @@ -10243,12 +10781,19 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel) constrForm->confrelid, constrForm->conrelid, &deleteTriggerOid, &updateTriggerOid); - addFkRecurseReferenced(NULL, - fkconstraint, + /* Add this constraint ... */ + address = addFkConstraint(addFkReferencedSide, + fkconstraint->conname, fkconstraint, fkRel, + partitionRel, partIndexId, constrOid, + numfks, mapped_confkey, + conkey, conpfeqop, conppeqop, conffeqop, + numfkdelsetcols, confdelsetcols, false); + /* ... and recurse */ + addFkRecurseReferenced(fkconstraint, fkRel, partitionRel, partIndexId, - constrOid, + address.objectId, numfks, mapped_confkey, conkey, @@ -10278,8 +10823,8 @@ CloneFkReferenced(Relation parentRel, Relation partitionRel) * child. * * If wqueue is given, it is used to set up phase-3 verification for each - * cloned constraint; if omitted, we assume that such verification is not - * needed (example: the partition is being created anew). + * cloned constraint; omit it if such verification is not needed + * (example: the partition is being created anew). */ static void CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) @@ -10295,9 +10840,26 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) { ForeignKeyCacheInfo *fk = lfirst(cell); - clone = lappend_oid(clone, fk->conoid); - } - + /* + * Refuse to attach a table as partition that this partitioned table + * already has a foreign key to. This isn't useful schema, which is + * proven by the fact that there have been no user complaints that + * it's already impossible to achieve this in the opposite direction, + * i.e., creating a foreign key that references a partition. This + * restriction allows us to dodge some complexities around + * pg_constraint and pg_trigger row creations that would be needed + * during ATTACH/DETACH for this kind of relationship. + */ + if (fk->confrelid == RelationGetRelid(partRel)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"", + RelationGetRelationName(partRel), + get_constraint_name(fk->conoid)))); + + clone = lappend_oid(clone, fk->conoid); + } + /* * Silently do nothing if there's nothing to do. In particular, this * avoids throwing a spurious error for foreign tables. @@ -10346,14 +10908,12 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) Constraint *fkconstraint; bool attached; Oid indexOid; - Oid constrOid; - ObjectAddress address, - referenced; + ObjectAddress address; ListCell *lc; Oid insertTriggerOid, updateTriggerOid; - tuple = SearchSysCache1(CONSTROID, parentConstrOid); + tuple = SearchSysCache1(CONSTROID, ObjectIdGetDatum(parentConstrOid)); if (!HeapTupleIsValid(tuple)) elog(ERROR, "cache lookup failed for constraint %u", parentConstrOid); @@ -10445,7 +11005,7 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) fkconstraint->old_conpfeqop = NIL; fkconstraint->old_pktable_oid = InvalidOid; fkconstraint->skip_validation = false; - fkconstraint->initially_valid = true; + fkconstraint->initially_valid = constrForm->convalidated; for (int i = 0; i < numfks; i++) { Form_pg_attribute att; @@ -10455,71 +11015,29 @@ CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel) fkconstraint->fk_attrs = lappend(fkconstraint->fk_attrs, makeString(NameStr(att->attname))); } - if (ConstraintNameIsUsed(CONSTRAINT_RELATION, - RelationGetRelid(partRel), - NameStr(constrForm->conname))) - fkconstraint->conname = - ChooseConstraintName(RelationGetRelationName(partRel), - ChooseForeignKeyConstraintNameAddition(fkconstraint->fk_attrs), - "fkey", - RelationGetNamespace(partRel), NIL); - else - fkconstraint->conname = pstrdup(NameStr(constrForm->conname)); indexOid = constrForm->conindid; - constrOid = - CreateConstraintEntry(fkconstraint->conname, - constrForm->connamespace, - CONSTRAINT_FOREIGN, - fkconstraint->deferrable, - fkconstraint->initdeferred, - constrForm->convalidated, - parentConstrOid, - RelationGetRelid(partRel), - mapped_conkey, - numfks, - numfks, - InvalidOid, /* not a domain constraint */ - indexOid, - constrForm->confrelid, /* same foreign rel */ - confkey, - conpfeqop, - conppeqop, - conffeqop, - numfks, - fkconstraint->fk_upd_action, - fkconstraint->fk_del_action, - confdelsetcols, - numfkdelsetcols, - fkconstraint->fk_matchtype, - NULL, - NULL, - NULL, - false, /* islocal */ - 1, /* inhcount */ - false, /* conNoInherit */ - true); - - /* Set up partition dependencies for the new constraint */ - ObjectAddressSet(address, ConstraintRelationId, constrOid); - ObjectAddressSet(referenced, ConstraintRelationId, parentConstrOid); - recordDependencyOn(&address, &referenced, DEPENDENCY_PARTITION_PRI); - ObjectAddressSet(referenced, RelationRelationId, - RelationGetRelid(partRel)); - recordDependencyOn(&address, &referenced, DEPENDENCY_PARTITION_SEC); + + /* Create the pg_constraint entry at this level */ + address = addFkConstraint(addFkReferencingSide, + NameStr(constrForm->conname), fkconstraint, + partRel, pkrel, indexOid, parentConstrOid, + numfks, confkey, + mapped_conkey, conpfeqop, + conppeqop, conffeqop, + numfkdelsetcols, confdelsetcols, + false); /* Done with the cloned constraint's tuple */ ReleaseSysCache(tuple); - /* Make all this visible before recursing */ - CommandCounterIncrement(); - + /* Create the check triggers, and recurse to partitions, if any */ addFkRecurseReferencing(wqueue, fkconstraint, partRel, pkrel, indexOid, - constrOid, + address.objectId, numfks, confkey, mapped_conkey, @@ -10683,6 +11201,81 @@ tryAttachPartitionForeignKey(ForeignKeyCacheInfo *fk, TriggerSetParentTrigger(trigrel, updateTriggerOid, parentUpdTrigger, partRelid); + /* + * If the referenced table is partitioned, then the partition we're + * attaching now has extra pg_constraint rows and action triggers that are + * no longer needed. Remove those. + */ + if (get_rel_relkind(fk->confrelid) == RELKIND_PARTITIONED_TABLE) + { + Relation pg_constraint = table_open(ConstraintRelationId, RowShareLock); + ObjectAddresses *objs; + HeapTuple consttup; + + ScanKeyInit(&key, + Anum_pg_constraint_conrelid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(fk->conrelid)); + + scan = systable_beginscan(pg_constraint, + ConstraintRelidTypidNameIndexId, + true, NULL, 1, &key); + objs = new_object_addresses(); + while ((consttup = systable_getnext(scan)) != NULL) + { + Form_pg_constraint conform = (Form_pg_constraint) GETSTRUCT(consttup); + + if (conform->conparentid != fk->conoid) + continue; + else + { + ObjectAddress addr; + SysScanDesc scan2; + ScanKeyData key2; + int n PG_USED_FOR_ASSERTS_ONLY; + + ObjectAddressSet(addr, ConstraintRelationId, conform->oid); + add_exact_object_address(&addr, objs); + + /* + * First we must delete the dependency record that binds the + * constraint records together. + */ + n = deleteDependencyRecordsForSpecific(ConstraintRelationId, + conform->oid, + DEPENDENCY_INTERNAL, + ConstraintRelationId, + fk->conoid); + Assert(n == 1); /* actually only one is expected */ + + /* + * Now search for the triggers for this constraint and set + * them up for deletion too + */ + ScanKeyInit(&key2, + Anum_pg_trigger_tgconstraint, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(conform->oid)); + scan2 = systable_beginscan(trigrel, TriggerConstraintIndexId, + true, NULL, 1, &key2); + while ((trigtup = systable_getnext(scan2)) != NULL) + { + ObjectAddressSet(addr, TriggerRelationId, + ((Form_pg_trigger) GETSTRUCT(trigtup))->oid); + add_exact_object_address(&addr, objs); + } + systable_endscan(scan2); + } + } + /* make the dependency deletions visible */ + CommandCounterIncrement(); + performMultipleDeletions(objs, DROP_RESTRICT, + PERFORM_DELETION_INTERNAL); + systable_endscan(scan); + + table_close(pg_constraint, RowShareLock); + } + CommandCounterIncrement(); return true; } @@ -10911,7 +11504,7 @@ ATExecAlterConstraint(Relation rel, AlterTableCmd *cmd, bool recurse, ancestorname && ancestortable ? errdetail("Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\".", cmdcon->conname, ancestorname, ancestortable) : 0, - errhint("You may alter the constraint it derives from, instead."))); + errhint("You may alter the constraint it derives from instead."))); } /* @@ -10966,6 +11559,9 @@ ATExecAlterConstrRecurse(Constraint *cmdcon, Relation conrel, Relation tgrel, Oid refrelid; bool changed = false; + /* since this function recurses, it could be driven to stack overflow */ + check_stack_depth(); + currcon = (Form_pg_constraint) GETSTRUCT(contuple); conoid = currcon->oid; refrelid = currcon->confrelid; @@ -11435,15 +12031,19 @@ transformFkeyGetPrimaryKey(Relation pkrel, Oid *indexOid, /* * transformFkeyCheckAttrs - * - * Make sure that the attributes of a referenced table belong to a unique - * (or primary key) constraint. Return the OID of the index supporting - * the constraint, as well as the opclasses associated with the index - * columns. + * Validate that the 'attnums' columns in the 'pkrel' relation are valid to + * reference as part of a foreign key constraint. + * + * Returns the OID of the unique index supporting the constraint and + * populates the caller-provided 'opclasses' array with the opclasses + * associated with the index columns. + * + * Raises an ERROR on validation failure. */ static Oid transformFkeyCheckAttrs(Relation pkrel, int numattrs, int16 *attnums, - Oid *opclasses) /* output parameter */ + Oid *opclasses) { Oid indexoid = InvalidOid; bool found = false; @@ -11959,7 +12559,6 @@ ATExecDropConstraint(Relation rel, const char *constrName, bool missing_ok, LOCKMODE lockmode) { List *children; - ListCell *child; Relation conrel; Form_pg_constraint con; SysScanDesc scan; @@ -12024,7 +12623,7 @@ ATExecDropConstraint(Relation rel, const char *constrName, /* Must match lock taken by RemoveTriggerById: */ frel = table_open(con->confrelid, AccessExclusiveLock); - CheckTableNotInUse(frel, "ALTER TABLE"); + CheckAlterTableIsSafe(frel); table_close(frel, NoLock); } @@ -12094,15 +12693,14 @@ ATExecDropConstraint(Relation rel, const char *constrName, errmsg("cannot remove constraint from only the partitioned table when partitions exist"), errhint("Do not specify the ONLY keyword."))); - foreach(child, children) + foreach_oid(childrelid, children) { - Oid childrelid = lfirst_oid(child); Relation childrel; HeapTuple copy_tuple; /* find_inheritance_children already got lock */ childrel = table_open(childrelid, NoLock); - CheckTableNotInUse(childrel, "ALTER TABLE"); + CheckAlterTableIsSafe(childrel); ScanKeyInit(&skey[0], Anum_pg_constraint_conrelid, @@ -12249,6 +12847,16 @@ ATPrepAlterColumnType(List **wqueue, errmsg("cannot alter system column \"%s\"", colName))); + /* + * Cannot specify USING when altering type of a generated column, because + * that would violate the generation expression. + */ + if (attTup->attgenerated && def->cooked_default) + ereport(ERROR, + (errcode(ERRCODE_INVALID_COLUMN_DEFINITION), + errmsg("cannot specify USING when altering type of generated column"), + errdetail("Column \"%s\" is a generated column.", colName))); + /* * Don't alter inherited columns. At outer level, there had better not be * any inherited definition; when recursing, we assume this was checked at @@ -12325,11 +12933,12 @@ ATPrepAlterColumnType(List **wqueue, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("column \"%s\" cannot be cast automatically to type %s", colName, format_type_be(targettype)), + !attTup->attgenerated ? /* translator: USING is SQL, don't translate it */ errhint("You might need to specify \"USING %s::%s\".", quote_identifier(colName), format_type_with_typemod(targettype, - targettypmod)))); + targettypmod)) : 0)); } /* Fix collations after all else */ @@ -12405,7 +13014,7 @@ ATPrepAlterColumnType(List **wqueue, /* find_all_inheritors already got lock */ childrel = relation_open(childrelid, NoLock); - CheckTableNotInUse(childrel, "ALTER TABLE"); + CheckAlterTableIsSafe(childrel); /* * Verify that the child doesn't have any inherited definitions of @@ -12649,215 +13258,15 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, * the info before executing ALTER TYPE, though, else the deparser will * get confused. */ - depRel = table_open(DependRelationId, RowExclusiveLock); - - ScanKeyInit(&key[0], - Anum_pg_depend_refclassid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(RelationRelationId)); - ScanKeyInit(&key[1], - Anum_pg_depend_refobjid, - BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(RelationGetRelid(rel))); - ScanKeyInit(&key[2], - Anum_pg_depend_refobjsubid, - BTEqualStrategyNumber, F_INT4EQ, - Int32GetDatum((int32) attnum)); - - scan = systable_beginscan(depRel, DependReferenceIndexId, true, - NULL, 3, key); - - while (HeapTupleIsValid(depTup = systable_getnext(scan))) - { - Form_pg_depend foundDep = (Form_pg_depend) GETSTRUCT(depTup); - ObjectAddress foundObject; - - foundObject.classId = foundDep->classid; - foundObject.objectId = foundDep->objid; - foundObject.objectSubId = foundDep->objsubid; - - switch (getObjectClass(&foundObject)) - { - case OCLASS_CLASS: - { - char relKind = get_rel_relkind(foundObject.objectId); - - if (relKind == RELKIND_INDEX || - relKind == RELKIND_PARTITIONED_INDEX) - { - Assert(foundObject.objectSubId == 0); - RememberIndexForRebuilding(foundObject.objectId, tab); - } - else if (relKind == RELKIND_SEQUENCE) - { - /* - * This must be a SERIAL column's sequence. We need - * not do anything to it. - */ - Assert(foundObject.objectSubId == 0); - } - else - { - /* Not expecting any other direct dependencies... */ - elog(ERROR, "unexpected object depending on column: %s", - getObjectDescription(&foundObject, false)); - } - break; - } - - case OCLASS_CONSTRAINT: - Assert(foundObject.objectSubId == 0); - RememberConstraintForRebuilding(foundObject.objectId, tab); - break; - - case OCLASS_REWRITE: - /* XXX someday see if we can cope with revising views */ - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot alter type of a column used by a view or rule"), - errdetail("%s depends on column \"%s\"", - getObjectDescription(&foundObject, false), - colName))); - break; - - case OCLASS_TRIGGER: - - /* - * A trigger can depend on a column because the column is - * specified as an update target, or because the column is - * used in the trigger's WHEN condition. The first case would - * not require any extra work, but the second case would - * require updating the WHEN expression, which will take a - * significant amount of new code. Since we can't easily tell - * which case applies, we punt for both. FIXME someday. - */ - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot alter type of a column used in a trigger definition"), - errdetail("%s depends on column \"%s\"", - getObjectDescription(&foundObject, false), - colName))); - break; - - case OCLASS_POLICY: - - /* - * A policy can depend on a column because the column is - * specified in the policy's USING or WITH CHECK qual - * expressions. It might be possible to rewrite and recheck - * the policy expression, but punt for now. It's certainly - * easy enough to remove and recreate the policy; still, FIXME - * someday. - */ - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot alter type of a column used in a policy definition"), - errdetail("%s depends on column \"%s\"", - getObjectDescription(&foundObject, false), - colName))); - break; - - case OCLASS_DEFAULT: - { - ObjectAddress col = GetAttrDefaultColumnAddress(foundObject.objectId); - - if (col.objectId == RelationGetRelid(rel) && - col.objectSubId == attnum) - { - /* - * Ignore the column's own default expression, which - * we will deal with below. - */ - Assert(defaultexpr); - } - else - { - /* - * This must be a reference from the expression of a - * generated column elsewhere in the same table. - * Changing the type of a column that is used by a - * generated column is not allowed by SQL standard, so - * just punt for now. It might be doable with some - * thinking and effort. - */ - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot alter type of a column used by a generated column"), - errdetail("Column \"%s\" is used by generated column \"%s\".", - colName, - get_attname(col.objectId, - col.objectSubId, - false)))); - } - break; - } - - case OCLASS_STATISTIC_EXT: - - /* - * Give the extended-stats machinery a chance to fix anything - * that this column type change would break. - */ - RememberStatisticsForRebuilding(foundObject.objectId, tab); - break; - - case OCLASS_PROC: - case OCLASS_TYPE: - case OCLASS_CAST: - case OCLASS_COLLATION: - case OCLASS_CONVERSION: - case OCLASS_LANGUAGE: - case OCLASS_LARGEOBJECT: - case OCLASS_OPERATOR: - case OCLASS_OPCLASS: - case OCLASS_OPFAMILY: - case OCLASS_AM: - case OCLASS_AMOP: - case OCLASS_AMPROC: - case OCLASS_SCHEMA: - case OCLASS_TSPARSER: - case OCLASS_TSDICT: - case OCLASS_TSTEMPLATE: - case OCLASS_TSCONFIG: - case OCLASS_ROLE: - case OCLASS_ROLE_MEMBERSHIP: - case OCLASS_DATABASE: - case OCLASS_TBLSPACE: - case OCLASS_FDW: - case OCLASS_FOREIGN_SERVER: - case OCLASS_USER_MAPPING: - case OCLASS_DEFACL: - case OCLASS_EXTENSION: - case OCLASS_EVENT_TRIGGER: - case OCLASS_PARAMETER_ACL: - case OCLASS_PUBLICATION: - case OCLASS_PUBLICATION_NAMESPACE: - case OCLASS_PUBLICATION_REL: - case OCLASS_SUBSCRIPTION: - case OCLASS_TRANSFORM: - - /* - * We don't expect any of these sorts of objects to depend on - * a column. - */ - elog(ERROR, "unexpected object depending on column: %s", - getObjectDescription(&foundObject, false)); - break; - - /* - * There's intentionally no default: case here; we want the - * compiler to warn if a new OCLASS hasn't been handled above. - */ - } - } - - systable_endscan(scan); + RememberAllDependentForRebuilding(tab, AT_AlterColumnType, rel, attnum, colName); /* * Now scan for dependencies of this column on other things. The only * things we should find are the dependency on the column datatype and * possibly a collation dependency. Those can be removed. */ + depRel = table_open(DependRelationId, RowExclusiveLock); + ScanKeyInit(&key[0], Anum_pg_depend_classid, BTEqualStrategyNumber, F_OIDEQ, @@ -12993,56 +13402,283 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, */ RemoveStatistics(RelationGetRelid(rel), attnum); - InvokeObjectPostAlterHook(RelationRelationId, - RelationGetRelid(rel), attnum); + InvokeObjectPostAlterHook(RelationRelationId, + RelationGetRelid(rel), attnum); + + /* + * Update the default, if present, by brute force --- remove and re-add + * the default. Probably unsafe to take shortcuts, since the new version + * may well have additional dependencies. (It's okay to do this now, + * rather than after other ALTER TYPE commands, since the default won't + * depend on other column types.) + */ + if (defaultexpr) + { + /* + * If it's a GENERATED default, drop its dependency records, in + * particular its INTERNAL dependency on the column, which would + * otherwise cause dependency.c to refuse to perform the deletion. + */ + if (attTup->attgenerated) + { + Oid attrdefoid = GetAttrDefaultOid(RelationGetRelid(rel), attnum); + + if (!OidIsValid(attrdefoid)) + elog(ERROR, "could not find attrdef tuple for relation %u attnum %d", + RelationGetRelid(rel), attnum); + (void) deleteDependencyRecordsFor(AttrDefaultRelationId, attrdefoid, false); + } + + /* + * Make updates-so-far visible, particularly the new pg_attribute row + * which will be updated again. + */ + CommandCounterIncrement(); + + /* + * We use RESTRICT here for safety, but at present we do not expect + * anything to depend on the default. + */ + RemoveAttrDefault(RelationGetRelid(rel), attnum, DROP_RESTRICT, true, + true); + + StoreAttrDefault(rel, attnum, defaultexpr, true, false); + } + + ObjectAddressSubSet(address, RelationRelationId, + RelationGetRelid(rel), attnum); + + /* Cleanup */ + heap_freetuple(heapTup); + + return address; +} + +/* + * Subroutine for ATExecAlterColumnType and ATExecSetExpression: Find everything + * that depends on the column (constraints, indexes, etc), and record enough + * information to let us recreate the objects. + */ +static void +RememberAllDependentForRebuilding(AlteredTableInfo *tab, AlterTableType subtype, + Relation rel, AttrNumber attnum, const char *colName) +{ + Relation depRel; + ScanKeyData key[3]; + SysScanDesc scan; + HeapTuple depTup; + + Assert(subtype == AT_AlterColumnType || subtype == AT_SetExpression); + + depRel = table_open(DependRelationId, RowExclusiveLock); + + ScanKeyInit(&key[0], + Anum_pg_depend_refclassid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(RelationRelationId)); + ScanKeyInit(&key[1], + Anum_pg_depend_refobjid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(RelationGetRelid(rel))); + ScanKeyInit(&key[2], + Anum_pg_depend_refobjsubid, + BTEqualStrategyNumber, F_INT4EQ, + Int32GetDatum((int32) attnum)); + + scan = systable_beginscan(depRel, DependReferenceIndexId, true, + NULL, 3, key); + + while (HeapTupleIsValid(depTup = systable_getnext(scan))) + { + Form_pg_depend foundDep = (Form_pg_depend) GETSTRUCT(depTup); + ObjectAddress foundObject; + + foundObject.classId = foundDep->classid; + foundObject.objectId = foundDep->objid; + foundObject.objectSubId = foundDep->objsubid; + + switch (foundObject.classId) + { + case RelationRelationId: + { + char relKind = get_rel_relkind(foundObject.objectId); + + if (relKind == RELKIND_INDEX || + relKind == RELKIND_PARTITIONED_INDEX) + { + Assert(foundObject.objectSubId == 0); + RememberIndexForRebuilding(foundObject.objectId, tab); + } + else if (relKind == RELKIND_SEQUENCE) + { + /* + * This must be a SERIAL column's sequence. We need + * not do anything to it. + */ + Assert(foundObject.objectSubId == 0); + } + else + { + /* Not expecting any other direct dependencies... */ + elog(ERROR, "unexpected object depending on column: %s", + getObjectDescription(&foundObject, false)); + } + break; + } + + case ConstraintRelationId: + Assert(foundObject.objectSubId == 0); + RememberConstraintForRebuilding(foundObject.objectId, tab); + break; + + case ProcedureRelationId: + + /* + * A new-style SQL function can depend on a column, if that + * column is referenced in the parsed function body. Ideally + * we'd automatically update the function by deparsing and + * reparsing it, but that's risky and might well fail anyhow. + * FIXME someday. + * + * This is only a problem for AT_AlterColumnType, not + * AT_SetExpression. + */ + if (subtype == AT_AlterColumnType) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot alter type of a column used by a function or procedure"), + errdetail("%s depends on column \"%s\"", + getObjectDescription(&foundObject, false), + colName))); + break; + + case RewriteRelationId: + + /* + * View/rule bodies have pretty much the same issues as + * function bodies. FIXME someday. + */ + if (subtype == AT_AlterColumnType) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot alter type of a column used by a view or rule"), + errdetail("%s depends on column \"%s\"", + getObjectDescription(&foundObject, false), + colName))); + break; + + case TriggerRelationId: + + /* + * A trigger can depend on a column because the column is + * specified as an update target, or because the column is + * used in the trigger's WHEN condition. The first case would + * not require any extra work, but the second case would + * require updating the WHEN expression, which has the same + * issues as above. Since we can't easily tell which case + * applies, we punt for both. FIXME someday. + */ + if (subtype == AT_AlterColumnType) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot alter type of a column used in a trigger definition"), + errdetail("%s depends on column \"%s\"", + getObjectDescription(&foundObject, false), + colName))); + break; + + case PolicyRelationId: + + /* + * A policy can depend on a column because the column is + * specified in the policy's USING or WITH CHECK qual + * expressions. It might be possible to rewrite and recheck + * the policy expression, but punt for now. It's certainly + * easy enough to remove and recreate the policy; still, FIXME + * someday. + */ + if (subtype == AT_AlterColumnType) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot alter type of a column used in a policy definition"), + errdetail("%s depends on column \"%s\"", + getObjectDescription(&foundObject, false), + colName))); + break; + + case AttrDefaultRelationId: + { + ObjectAddress col = GetAttrDefaultColumnAddress(foundObject.objectId); + + if (col.objectId == RelationGetRelid(rel) && + col.objectSubId == attnum) + { + /* + * Ignore the column's own default expression. The + * caller deals with it. + */ + } + else + { + /* + * This must be a reference from the expression of a + * generated column elsewhere in the same table. + * Changing the type/generated expression of a column + * that is used by a generated column is not allowed + * by SQL standard, so just punt for now. It might be + * doable with some thinking and effort. + */ + if (subtype == AT_AlterColumnType) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot alter type of a column used by a generated column"), + errdetail("Column \"%s\" is used by generated column \"%s\".", + colName, + get_attname(col.objectId, + col.objectSubId, + false)))); + } + break; + } + + case StatisticExtRelationId: - /* - * Update the default, if present, by brute force --- remove and re-add - * the default. Probably unsafe to take shortcuts, since the new version - * may well have additional dependencies. (It's okay to do this now, - * rather than after other ALTER TYPE commands, since the default won't - * depend on other column types.) - */ - if (defaultexpr) - { - /* - * If it's a GENERATED default, drop its dependency records, in - * particular its INTERNAL dependency on the column, which would - * otherwise cause dependency.c to refuse to perform the deletion. - */ - if (attTup->attgenerated) - { - Oid attrdefoid = GetAttrDefaultOid(RelationGetRelid(rel), attnum); + /* + * Give the extended-stats machinery a chance to fix anything + * that this column type change would break. + */ + RememberStatisticsForRebuilding(foundObject.objectId, tab); + break; - if (!OidIsValid(attrdefoid)) - elog(ERROR, "could not find attrdef tuple for relation %u attnum %d", - RelationGetRelid(rel), attnum); - (void) deleteDependencyRecordsFor(AttrDefaultRelationId, attrdefoid, false); - } + case PublicationRelRelationId: - /* - * Make updates-so-far visible, particularly the new pg_attribute row - * which will be updated again. - */ - CommandCounterIncrement(); + /* + * Column reference in a PUBLICATION ... FOR TABLE ... WHERE + * clause. Same issues as above. FIXME someday. + */ + if (subtype == AT_AlterColumnType) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot alter type of a column used by a publication WHERE clause"), + errdetail("%s depends on column \"%s\"", + getObjectDescription(&foundObject, false), + colName))); + break; - /* - * We use RESTRICT here for safety, but at present we do not expect - * anything to depend on the default. - */ - RemoveAttrDefault(RelationGetRelid(rel), attnum, DROP_RESTRICT, true, - true); + default: - StoreAttrDefault(rel, attnum, defaultexpr, true, false); + /* + * We don't expect any other sorts of objects to depend on a + * column. + */ + elog(ERROR, "unexpected object depending on column: %s", + getObjectDescription(&foundObject, false)); + break; + } } - ObjectAddressSubSet(address, RelationRelationId, - RelationGetRelid(rel), attnum); - - /* Cleanup */ - heap_freetuple(heapTup); - - return address; + systable_endscan(scan); + table_close(depRel, NoLock); } /* @@ -13194,11 +13830,11 @@ RememberStatisticsForRebuilding(Oid stxoid, AlteredTableInfo *tab) } /* - * Cleanup after we've finished all the ALTER TYPE operations for a - * particular relation. We have to drop and recreate all the indexes - * and constraints that depend on the altered columns. We do the - * actual dropping here, but re-creation is managed by adding work - * queue entries to do those steps later. + * Cleanup after we've finished all the ALTER TYPE or SET EXPRESSION + * operations for a particular relation. We have to drop and recreate all the + * indexes and constraints that depend on the altered columns. We do the + * actual dropping here, but re-creation is managed by adding work queue + * entries to do those steps later. */ static void ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) @@ -13585,7 +14221,7 @@ ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, char *cmd, * entry; but callers already have them so might as well pass them.) */ static void -RebuildConstraintComment(AlteredTableInfo *tab, int pass, Oid objid, +RebuildConstraintComment(AlteredTableInfo *tab, AlterTablePass pass, Oid objid, Relation rel, List *domname, const char *conname) { @@ -13723,7 +14359,7 @@ ATExecAlterColumnGenericOptions(Relation rel, /* First, determine FDW validator associated to the foreign table. */ ftrel = table_open(ForeignTableRelationId, AccessShareLock); - tuple = SearchSysCache1(FOREIGNTABLEREL, rel->rd_id); + tuple = SearchSysCache1(FOREIGNTABLEREL, ObjectIdGetDatum(rel->rd_id)); if (!HeapTupleIsValid(tuple)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), @@ -13860,7 +14496,7 @@ ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing, LOCKMODE lock (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot change owner of index \"%s\"", NameStr(tuple_class->relname)), - errhint("Change the ownership of the index's table, instead."))); + errhint("Change the ownership of the index's table instead."))); /* quick hack to exit via the no-op path */ newOwnerId = tuple_class->relowner; } @@ -13872,7 +14508,7 @@ ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing, LOCKMODE lock (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot change owner of index \"%s\"", NameStr(tuple_class->relname)), - errhint("Change the ownership of the index's table, instead."))); + errhint("Change the ownership of the index's table instead."))); break; case RELKIND_SEQUENCE: if (!recursing && @@ -13900,7 +14536,9 @@ ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing, LOCKMODE lock (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("\"%s\" is a composite type", NameStr(tuple_class->relname)), - errhint("Use ALTER TYPE instead."))); + /* translator: %s is an SQL ALTER command */ + errhint("Use %s instead.", + "ALTER TYPE"))); break; case RELKIND_TOASTVALUE: if (recursing) @@ -14227,23 +14865,128 @@ ATExecDropCluster(Relation rel, LOCKMODE lockmode) /* * Preparation phase for SET ACCESS METHOD * - * Check that access method exists. If it is the same as the table's current - * access method, it is a no-op. Otherwise, a table rewrite is necessary. + * Check that the access method exists and determine whether a change is + * actually needed. */ static void ATPrepSetAccessMethod(AlteredTableInfo *tab, Relation rel, const char *amname) { Oid amoid; - /* Check that the table access method exists */ - amoid = get_table_am_oid(amname, false); + /* + * Look up the access method name and check that it differs from the + * table's current AM. If DEFAULT was specified for a partitioned table + * (amname is NULL), set it to InvalidOid to reset the catalogued AM. + */ + if (amname != NULL) + amoid = get_table_am_oid(amname, false); + else if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + amoid = InvalidOid; + else + amoid = get_table_am_oid(default_table_access_method, false); + /* if it's a match, phase 3 doesn't need to do anything */ if (rel->rd_rel->relam == amoid) return; /* Save info for Phase 3 to do the real work */ tab->rewrite |= AT_REWRITE_ACCESS_METHOD; tab->newAccessMethod = amoid; + tab->chgAccessMethod = true; +} + +/* + * Special handling of ALTER TABLE SET ACCESS METHOD for relations with no + * storage that have an interest in preserving AM. + * + * Since these have no storage, setting the access method is a catalog only + * operation. + */ +static void +ATExecSetAccessMethodNoStorage(Relation rel, Oid newAccessMethodId) +{ + Relation pg_class; + Oid oldAccessMethodId; + HeapTuple tuple; + Form_pg_class rd_rel; + Oid reloid = RelationGetRelid(rel); + + /* + * Shouldn't be called on relations having storage; these are processed in + * phase 3. + */ + Assert(!RELKIND_HAS_STORAGE(rel->rd_rel->relkind)); + + /* Get a modifiable copy of the relation's pg_class row. */ + pg_class = table_open(RelationRelationId, RowExclusiveLock); + + tuple = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(reloid)); + if (!HeapTupleIsValid(tuple)) + elog(ERROR, "cache lookup failed for relation %u", reloid); + rd_rel = (Form_pg_class) GETSTRUCT(tuple); + + /* Update the pg_class row. */ + oldAccessMethodId = rd_rel->relam; + rd_rel->relam = newAccessMethodId; + + /* Leave if no update required */ + if (rd_rel->relam == oldAccessMethodId) + { + heap_freetuple(tuple); + table_close(pg_class, RowExclusiveLock); + return; + } + + CatalogTupleUpdate(pg_class, &tuple->t_self, tuple); + + /* + * Update the dependency on the new access method. No dependency is added + * if the new access method is InvalidOid (default case). Be very careful + * that this has to compare the previous value stored in pg_class with the + * new one. + */ + if (!OidIsValid(oldAccessMethodId) && OidIsValid(rd_rel->relam)) + { + ObjectAddress relobj, + referenced; + + /* + * New access method is defined and there was no dependency + * previously, so record a new one. + */ + ObjectAddressSet(relobj, RelationRelationId, reloid); + ObjectAddressSet(referenced, AccessMethodRelationId, rd_rel->relam); + recordDependencyOn(&relobj, &referenced, DEPENDENCY_NORMAL); + } + else if (OidIsValid(oldAccessMethodId) && + !OidIsValid(rd_rel->relam)) + { + /* + * There was an access method defined, and no new one, so just remove + * the existing dependency. + */ + deleteDependencyRecordsForClass(RelationRelationId, reloid, + AccessMethodRelationId, + DEPENDENCY_NORMAL); + } + else + { + Assert(OidIsValid(oldAccessMethodId) && + OidIsValid(rd_rel->relam)); + + /* Both are valid, so update the dependency */ + changeDependencyFor(RelationRelationId, reloid, + AccessMethodRelationId, + oldAccessMethodId, rd_rel->relam); + } + + /* make the relam and dependency changes visible */ + CommandCounterIncrement(); + + InvokeObjectPostAlterHook(RelationRelationId, RelationGetRelid(rel), 0); + + heap_freetuple(tuple); + table_close(pg_class, RowExclusiveLock); } /* @@ -14302,7 +15045,7 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation, /* Fetch heap tuple */ relid = RelationGetRelid(rel); - tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid)); + tuple = SearchSysCacheLocked1(RELOID, ObjectIdGetDatum(relid)); if (!HeapTupleIsValid(tuple)) elog(ERROR, "cache lookup failed for relation %u", relid); @@ -14406,6 +15149,7 @@ ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation, repl_val, repl_null, repl_repl); CatalogTupleUpdate(pgclass, &newtuple->t_self, newtuple); + UnlockTuple(pgclass, &tuple->t_self, InplaceUpdateTupleLock); InvokeObjectPostAlterHook(RelationRelationId, RelationGetRelid(rel), 0); @@ -14781,8 +15525,6 @@ index_copy_data(Relation rel, RelFileLocator newrlocator) { SMgrRelation dstrel; - dstrel = smgropen(newrlocator, rel->rd_backend); - /* * Since we copy the file directly without looking at the shared buffers, * we'd better first flush out any pages of the source relation that are @@ -14798,7 +15540,7 @@ index_copy_data(Relation rel, RelFileLocator newrlocator) * NOTE: any conflict in relfilenumber value will be caught in * RelationCreateStorage(). */ - RelationCreateStorage(newrlocator, rel->rd_rel->relpersistence, true); + dstrel = RelationCreateStorage(newrlocator, rel->rd_rel->relpersistence, true); /* copy main fork */ RelationCopyStorage(RelationGetSmgr(rel), dstrel, MAIN_FORKNUM, @@ -14843,6 +15585,9 @@ ATExecEnableDisableTrigger(Relation rel, const char *trigname, EnableDisableTrigger(rel, trigname, InvalidOid, fires_when, skip_system, recurse, lockmode); + + InvokeObjectPostAlterHook(RelationRelationId, + RelationGetRelid(rel), 0); } /* @@ -14855,6 +15600,9 @@ ATExecEnableDisableRule(Relation rel, const char *rulename, char fires_when, LOCKMODE lockmode) { EnableDisableRule(rel, rulename, fires_when); + + InvokeObjectPostAlterHook(RelationRelationId, + RelationGetRelid(rel), 0); } /* @@ -14980,7 +15728,7 @@ ATExecAddInherit(Relation child_rel, RangeVar *parent, LOCKMODE lockmode) errdetail("ROW triggers with transition tables are not supported in inheritance hierarchies."))); /* OK to create inheritance */ - CreateInheritance(child_rel, parent_rel); + CreateInheritance(child_rel, parent_rel, false); ObjectAddressSet(address, RelationRelationId, RelationGetRelid(parent_rel)); @@ -14999,7 +15747,7 @@ ATExecAddInherit(Relation child_rel, RangeVar *parent, LOCKMODE lockmode) * Common to ATExecAddInherit() and ATExecAttachPartition(). */ static void -CreateInheritance(Relation child_rel, Relation parent_rel) +CreateInheritance(Relation child_rel, Relation parent_rel, bool ispartition) { Relation catalogRelation; SysScanDesc scan; @@ -15044,7 +15792,7 @@ CreateInheritance(Relation child_rel, Relation parent_rel) systable_endscan(scan); /* Match up the columns and bump attinhcount as needed */ - MergeAttributesIntoExisting(child_rel, parent_rel); + MergeAttributesIntoExisting(child_rel, parent_rel, ispartition); /* Match up the constraints and bump coninhcount as needed */ MergeConstraintsIntoExisting(child_rel, parent_rel); @@ -15122,87 +15870,79 @@ constraints_equivalent(HeapTuple a, HeapTuple b, TupleDesc tupleDesc) * the child must be as well. Defaults are not compared, however. */ static void -MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel) +MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel, bool ispartition) { Relation attrrel; - AttrNumber parent_attno; - int parent_natts; - TupleDesc tupleDesc; - HeapTuple tuple; - bool child_is_partition = false; + TupleDesc parent_desc; attrrel = table_open(AttributeRelationId, RowExclusiveLock); + parent_desc = RelationGetDescr(parent_rel); - tupleDesc = RelationGetDescr(parent_rel); - parent_natts = tupleDesc->natts; - - /* If parent_rel is a partitioned table, child_rel must be a partition */ - if (parent_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) - child_is_partition = true; - - for (parent_attno = 1; parent_attno <= parent_natts; parent_attno++) + for (AttrNumber parent_attno = 1; parent_attno <= parent_desc->natts; parent_attno++) { - Form_pg_attribute attribute = TupleDescAttr(tupleDesc, - parent_attno - 1); - char *attributeName = NameStr(attribute->attname); + Form_pg_attribute parent_att = TupleDescAttr(parent_desc, parent_attno - 1); + char *parent_attname = NameStr(parent_att->attname); + HeapTuple tuple; /* Ignore dropped columns in the parent. */ - if (attribute->attisdropped) + if (parent_att->attisdropped) continue; /* Find same column in child (matching on column name). */ - tuple = SearchSysCacheCopyAttName(RelationGetRelid(child_rel), - attributeName); + tuple = SearchSysCacheCopyAttName(RelationGetRelid(child_rel), parent_attname); if (HeapTupleIsValid(tuple)) { - /* Check they are same type, typmod, and collation */ - Form_pg_attribute childatt = (Form_pg_attribute) GETSTRUCT(tuple); + Form_pg_attribute child_att = (Form_pg_attribute) GETSTRUCT(tuple); - if (attribute->atttypid != childatt->atttypid || - attribute->atttypmod != childatt->atttypmod) + if (parent_att->atttypid != child_att->atttypid || + parent_att->atttypmod != child_att->atttypmod) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("child table \"%s\" has different type for column \"%s\"", - RelationGetRelationName(child_rel), - attributeName))); + RelationGetRelationName(child_rel), parent_attname))); - if (attribute->attcollation != childatt->attcollation) + if (parent_att->attcollation != child_att->attcollation) ereport(ERROR, (errcode(ERRCODE_COLLATION_MISMATCH), errmsg("child table \"%s\" has different collation for column \"%s\"", - RelationGetRelationName(child_rel), - attributeName))); + RelationGetRelationName(child_rel), parent_attname))); /* * Check child doesn't discard NOT NULL property. (Other * constraints are checked elsewhere.) */ - if (attribute->attnotnull && !childatt->attnotnull) + if (parent_att->attnotnull && !child_att->attnotnull) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("column \"%s\" in child table must be marked NOT NULL", - attributeName))); + parent_attname))); /* * Child column must be generated if and only if parent column is. */ - if (attribute->attgenerated && !childatt->attgenerated) + if (parent_att->attgenerated && !child_att->attgenerated) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("column \"%s\" in child table must be a generated column", - attributeName))); - if (childatt->attgenerated && !attribute->attgenerated) + errmsg("column \"%s\" in child table must be a generated column", parent_attname))); + if (child_att->attgenerated && !parent_att->attgenerated) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("column \"%s\" in child table must not be a generated column", - attributeName))); + errmsg("column \"%s\" in child table must not be a generated column", parent_attname))); + + /* + * Regular inheritance children are independent enough not to + * inherit identity columns. But partitions are integral part of + * a partitioned table and inherit identity column. + */ + if (ispartition) + child_att->attidentity = parent_att->attidentity; /* * OK, bump the child column's inheritance count. (If we fail * later on, this change will just roll back.) */ - childatt->attinhcount++; - if (childatt->attinhcount < 0) + child_att->attinhcount++; + if (child_att->attinhcount < 0) ereport(ERROR, errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("too many inheritance parents")); @@ -15212,10 +15952,10 @@ MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel) * is same in all partitions. (Note: there are only inherited * attributes in partitions) */ - if (child_is_partition) + if (parent_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) { - Assert(childatt->attinhcount == 1); - childatt->attislocal = false; + Assert(child_att->attinhcount == 1); + child_att->attislocal = false; } CatalogTupleUpdate(attrrel, &tuple->t_self, tuple); @@ -15225,8 +15965,7 @@ MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel) { ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("child table is missing column \"%s\"", - attributeName))); + errmsg("child table is missing column \"%s\"", parent_attname))); } } @@ -15253,26 +15992,20 @@ MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel) static void MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel) { - Relation catalog_relation; - TupleDesc tuple_desc; + Relation constraintrel; SysScanDesc parent_scan; ScanKeyData parent_key; HeapTuple parent_tuple; - bool child_is_partition = false; - - catalog_relation = table_open(ConstraintRelationId, RowExclusiveLock); - tuple_desc = RelationGetDescr(catalog_relation); + Oid parent_relid = RelationGetRelid(parent_rel); - /* If parent_rel is a partitioned table, child_rel must be a partition */ - if (parent_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) - child_is_partition = true; + constraintrel = table_open(ConstraintRelationId, RowExclusiveLock); /* Outer loop scans through the parent's constraint definitions */ ScanKeyInit(&parent_key, Anum_pg_constraint_conrelid, BTEqualStrategyNumber, F_OIDEQ, - ObjectIdGetDatum(RelationGetRelid(parent_rel))); - parent_scan = systable_beginscan(catalog_relation, ConstraintRelidTypidNameIndexId, + ObjectIdGetDatum(parent_relid)); + parent_scan = systable_beginscan(constraintrel, ConstraintRelidTypidNameIndexId, true, NULL, 1, &parent_key); while (HeapTupleIsValid(parent_tuple = systable_getnext(parent_scan))) @@ -15295,7 +16028,7 @@ MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel) Anum_pg_constraint_conrelid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(RelationGetRelid(child_rel))); - child_scan = systable_beginscan(catalog_relation, ConstraintRelidTypidNameIndexId, + child_scan = systable_beginscan(constraintrel, ConstraintRelidTypidNameIndexId, true, NULL, 1, &child_key); while (HeapTupleIsValid(child_tuple = systable_getnext(child_scan))) @@ -15310,20 +16043,18 @@ MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel) NameStr(child_con->conname)) != 0) continue; - if (!constraints_equivalent(parent_tuple, child_tuple, tuple_desc)) + if (!constraints_equivalent(parent_tuple, child_tuple, RelationGetDescr(constraintrel))) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("child table \"%s\" has different definition for check constraint \"%s\"", - RelationGetRelationName(child_rel), - NameStr(parent_con->conname)))); + RelationGetRelationName(child_rel), NameStr(parent_con->conname)))); /* If the child constraint is "no inherit" then cannot merge */ if (child_con->connoinherit) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"", - NameStr(child_con->conname), - RelationGetRelationName(child_rel)))); + NameStr(child_con->conname), RelationGetRelationName(child_rel)))); /* * If the child constraint is "not valid" then cannot merge with a @@ -15333,8 +16064,7 @@ MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel) ereport(ERROR, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"", - NameStr(child_con->conname), - RelationGetRelationName(child_rel)))); + NameStr(child_con->conname), RelationGetRelationName(child_rel)))); /* * OK, bump the child constraint's inheritance count. (If we fail @@ -15353,13 +16083,13 @@ MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel) * inherited only once since it cannot have multiple parents and * it is never considered local. */ - if (child_is_partition) + if (parent_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) { Assert(child_con->coninhcount == 1); child_con->conislocal = false; } - CatalogTupleUpdate(catalog_relation, &child_copy->t_self, child_copy); + CatalogTupleUpdate(constraintrel, &child_copy->t_self, child_copy); heap_freetuple(child_copy); found = true; @@ -15376,7 +16106,7 @@ MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel) } systable_endscan(parent_scan); - table_close(catalog_relation, RowExclusiveLock); + table_close(constraintrel, RowExclusiveLock); } /* @@ -15519,11 +16249,9 @@ RemoveInheritance(Relation child_rel, Relation parent_rel, bool expect_detached) constraintTuple; List *connames; bool found; - bool child_is_partition = false; + bool is_partitioning; - /* If parent_rel is a partitioned table, child_rel must be a partition */ - if (parent_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) - child_is_partition = true; + is_partitioning = (parent_rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE); found = DeleteInheritsTuple(RelationGetRelid(child_rel), RelationGetRelid(parent_rel), @@ -15531,7 +16259,7 @@ RemoveInheritance(Relation child_rel, Relation parent_rel, bool expect_detached) RelationGetRelationName(child_rel)); if (!found) { - if (child_is_partition) + if (is_partitioning) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_TABLE), errmsg("relation \"%s\" is not a partition of relation \"%s\"", @@ -15621,15 +16349,14 @@ RemoveInheritance(Relation child_rel, Relation parent_rel, bool expect_detached) { Form_pg_constraint con = (Form_pg_constraint) GETSTRUCT(constraintTuple); bool match; - ListCell *lc; if (con->contype != CONSTRAINT_CHECK) continue; match = false; - foreach(lc, connames) + foreach_ptr(char, chkname, connames) { - if (strcmp(NameStr(con->conname), (char *) lfirst(lc)) == 0) + if (strcmp(NameStr(con->conname), chkname) == 0) { match = true; break; @@ -15661,7 +16388,7 @@ RemoveInheritance(Relation child_rel, Relation parent_rel, bool expect_detached) drop_parent_dependency(RelationGetRelid(child_rel), RelationRelationId, RelationGetRelid(parent_rel), - child_dependency_type(child_is_partition)); + child_dependency_type(is_partitioning)); /* * Post alter hook of this inherits. Since object_access_hook doesn't take @@ -16134,6 +16861,9 @@ ATExecSetRowSecurity(Relation rel, bool rls) ((Form_pg_class) GETSTRUCT(tuple))->relrowsecurity = rls; CatalogTupleUpdate(pg_class, &tuple->t_self, tuple); + InvokeObjectPostAlterHook(RelationRelationId, + RelationGetRelid(rel), 0); + table_close(pg_class, RowExclusiveLock); heap_freetuple(tuple); } @@ -16160,6 +16890,9 @@ ATExecForceNoForceRowSecurity(Relation rel, bool force_rls) ((Form_pg_class) GETSTRUCT(tuple))->relforcerowsecurity = force_rls; CatalogTupleUpdate(pg_class, &tuple->t_self, tuple); + InvokeObjectPostAlterHook(RelationRelationId, + RelationGetRelid(rel), 0); + table_close(pg_class, RowExclusiveLock); heap_freetuple(tuple); } @@ -16186,7 +16919,8 @@ ATExecGenericOptions(Relation rel, List *options) ftrel = table_open(ForeignTableRelationId, RowExclusiveLock); - tuple = SearchSysCacheCopy1(FOREIGNTABLEREL, rel->rd_id); + tuple = SearchSysCacheCopy1(FOREIGNTABLEREL, + ObjectIdGetDatum(rel->rd_id)); if (!HeapTupleIsValid(tuple)) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), @@ -16533,20 +17267,18 @@ AlterTableNamespaceInternal(Relation rel, Oid oldNspOid, Oid nspOid, /* Fix the table's row type too, if it has one */ if (OidIsValid(rel->rd_rel->reltype)) - AlterTypeNamespaceInternal(rel->rd_rel->reltype, - nspOid, false, false, objsMoved); + AlterTypeNamespaceInternal(rel->rd_rel->reltype, nspOid, + false, /* isImplicitArray */ + false, /* ignoreDependent */ + false, /* errorOnTableType */ + objsMoved); /* Fix other dependent stuff */ - if (rel->rd_rel->relkind == RELKIND_RELATION || - rel->rd_rel->relkind == RELKIND_MATVIEW || - rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) - { - AlterIndexNamespaces(classRel, rel, oldNspOid, nspOid, objsMoved); - AlterSeqNamespaces(classRel, rel, oldNspOid, nspOid, - objsMoved, AccessExclusiveLock); - AlterConstraintNamespaces(RelationGetRelid(rel), oldNspOid, nspOid, - false, objsMoved); - } + AlterIndexNamespaces(classRel, rel, oldNspOid, nspOid, objsMoved); + AlterSeqNamespaces(classRel, rel, oldNspOid, nspOid, + objsMoved, AccessExclusiveLock); + AlterConstraintNamespaces(RelationGetRelid(rel), oldNspOid, nspOid, + false, objsMoved); table_close(classRel, RowExclusiveLock); } @@ -16567,7 +17299,8 @@ AlterRelationNamespaceInternal(Relation classRel, Oid relOid, ObjectAddress thisobj; bool already_done = false; - classTup = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relOid)); + /* no rel lock for relkind=c so use LOCKTAG_TUPLE */ + classTup = SearchSysCacheLockedCopy1(RELOID, ObjectIdGetDatum(relOid)); if (!HeapTupleIsValid(classTup)) elog(ERROR, "cache lookup failed for relation %u", relOid); classForm = (Form_pg_class) GETSTRUCT(classTup); @@ -16586,6 +17319,8 @@ AlterRelationNamespaceInternal(Relation classRel, Oid relOid, already_done = object_address_present(&thisobj, objsMoved); if (!already_done && oldNspOid != newNspOid) { + ItemPointerData otid = classTup->t_self; + /* check for duplicate name (more friendly than unique-index failure) */ if (get_relname_relid(NameStr(classForm->relname), newNspOid) != InvalidOid) @@ -16598,7 +17333,9 @@ AlterRelationNamespaceInternal(Relation classRel, Oid relOid, /* classTup is a copy, so OK to scribble on */ classForm->relnamespace = newNspOid; - CatalogTupleUpdate(classRel, &classTup->t_self, classTup); + CatalogTupleUpdate(classRel, &otid, classTup); + UnlockTuple(classRel, &otid, InplaceUpdateTupleLock); + /* Update dependency on schema if caller said so */ if (hasDependEntry && @@ -16607,9 +17344,11 @@ AlterRelationNamespaceInternal(Relation classRel, Oid relOid, NamespaceRelationId, oldNspOid, newNspOid) != 1) - elog(ERROR, "failed to change schema dependency for relation \"%s\"", + elog(ERROR, "could not change schema dependency for relation \"%s\"", NameStr(classForm->relname)); } + else + UnlockTuple(classRel, &classTup->t_self, InplaceUpdateTupleLock); if (!already_done) { add_exact_object_address(&thisobj, objsMoved); @@ -16880,6 +17619,12 @@ PreCommit_on_commit_actions(void) add_exact_object_address(&object, targetObjects); } + /* + * Object deletion might involve toast table access (to clean up + * toasted catalog entries), so ensure we have a valid snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + /* * Since this is an automatic drop, rather than one directly initiated * by the user, we pass the PERFORM_DELETION_INTERNAL flag. @@ -16887,6 +17632,8 @@ PreCommit_on_commit_actions(void) performMultipleDeletions(targetObjects, DROP_CASCADE, PERFORM_DELETION_INTERNAL | PERFORM_DELETION_QUIETLY); + PopActiveSnapshot(); + #ifdef USE_ASSERT_CHECKING /* @@ -17009,7 +17756,9 @@ RangeVarCallbackMaintainsTable(const RangeVar *relation, /* Check permissions */ aclresult = pg_class_aclcheck(relId, GetUserId(), ACL_MAINTAIN); if (aclresult != ACLCHECK_OK) - aclcheck_error(aclresult, OBJECT_TABLE, relation->relname); + aclcheck_error(aclresult, + get_relkind_objtype(get_rel_relkind(relId)), + relation->relname); } /* @@ -17172,7 +17921,9 @@ RangeVarCallbackForAlterRelation(const RangeVar *rv, Oid relid, Oid oldrelid, ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("\"%s\" is a composite type", rv->relname), - errhint("Use ALTER TYPE instead."))); + /* translator: %s is an SQL ALTER command */ + errhint("Use %s instead.", + "ALTER TYPE"))); /* * Don't allow ALTER TABLE .. SET SCHEMA on relations that can't be moved @@ -17191,7 +17942,9 @@ RangeVarCallbackForAlterRelation(const RangeVar *rv, Oid relid, Oid oldrelid, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot change schema of composite type \"%s\"", rv->relname), - errhint("Use ALTER TYPE instead."))); + /* translator: %s is an SQL ALTER command */ + errhint("Use %s instead.", + "ALTER TYPE"))); else if (relkind == RELKIND_TOASTVALUE) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), @@ -17367,30 +18120,6 @@ ComputePartitionAttrs(ParseState *pstate, Relation rel, List *partParams, AttrNu partattrs[attn] = 0; /* marks the column as expression */ *partexprs = lappend(*partexprs, expr); - /* - * Try to simplify the expression before checking for - * mutability. The main practical value of doing it in this - * order is that an inline-able SQL-language function will be - * accepted if its expansion is immutable, whether or not the - * function itself is marked immutable. - * - * Note that expression_planner does not change the passed in - * expression destructively and we have already saved the - * expression to be stored into the catalog above. - */ - expr = (Node *) expression_planner((Expr *) expr); - - /* - * Partition expression cannot contain mutable functions, - * because a given row must always map to the same partition - * as long as there is no change in the partition boundary - * structure. - */ - if (contain_mutable_functions(expr)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), - errmsg("functions in partition key expression must be marked IMMUTABLE"))); - /* * transformPartitionSpec() should have already rejected * subqueries, aggregates, window functions, and SRFs, based @@ -17432,6 +18161,32 @@ ComputePartitionAttrs(ParseState *pstate, Relation rel, List *partParams, AttrNu parser_errposition(pstate, pelem->location))); } + /* + * Preprocess the expression before checking for mutability. + * This is essential for the reasons described in + * contain_mutable_functions_after_planning. However, we call + * expression_planner for ourselves rather than using that + * function, because if constant-folding reduces the + * expression to a constant, we'd like to know that so we can + * complain below. + * + * Like contain_mutable_functions_after_planning, assume that + * expression_planner won't scribble on its input, so this + * won't affect the partexprs entry we saved above. + */ + expr = (Node *) expression_planner((Expr *) expr); + + /* + * Partition expressions cannot contain mutable functions, + * because a given row must always map to the same partition + * as long as there is no change in the partition boundary + * structure. + */ + if (contain_mutable_functions(expr)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), + errmsg("functions in partition key expression must be marked IMMUTABLE"))); + /* * While it is not exactly *wrong* for a partition expression * to be a constant, it seems better to reject such keys. @@ -17519,7 +18274,7 @@ ComputePartitionAttrs(ParseState *pstate, Relation rel, List *partParams, AttrNu * Do scanrel's existing constraints imply the partition constraint? * * "Existing constraints" include its check constraints and column-level - * NOT NULL constraints. partConstraint describes the partition constraint, + * not-null constraints. partConstraint describes the partition constraint, * in implicit-AND form. */ bool @@ -17847,7 +18602,10 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot attach temporary relation of another session as partition"))); - /* Check if there are any columns in attachrel that aren't in the parent */ + /* + * Check if attachrel has any identity columns or any columns that aren't + * in the parent. + */ tupleDesc = RelationGetDescr(attachrel); natts = tupleDesc->natts; for (attno = 1; attno <= natts; attno++) @@ -17859,6 +18617,13 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, if (attribute->attisdropped) continue; + if (attribute->attidentity) + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("table \"%s\" being attached contains an identity column \"%s\"", + RelationGetRelationName(attachrel), attributeName), + errdetail("The new partition may not contain an identity column.")); + /* Try to find the column in parent (matching on column name) */ if (!SearchSysCacheExists2(ATTNAME, ObjectIdGetDatum(RelationGetRelid(rel)), @@ -17893,13 +18658,13 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, cmd->bound, pstate); /* OK to create inheritance. Rest of the checks performed there */ - CreateInheritance(attachrel, rel); + CreateInheritance(attachrel, rel, true); /* Update the pg_class entry. */ StorePartitionBound(attachrel, rel, cmd->bound); /* Ensure there exists a correct set of indexes in the partition. */ - AttachPartitionEnsureIndexes(rel, attachrel); + AttachPartitionEnsureIndexes(wqueue, rel, attachrel); /* and triggers */ CloneRowTriggersToPartition(rel, attachrel); @@ -18012,13 +18777,12 @@ ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, * partitioned table. */ static void -AttachPartitionEnsureIndexes(Relation rel, Relation attachrel) +AttachPartitionEnsureIndexes(List **wqueue, Relation rel, Relation attachrel) { List *idxes; List *attachRelIdxs; Relation *attachrelIdxRels; IndexInfo **attachInfos; - int i; ListCell *cell; MemoryContext cxt; MemoryContext oldcxt; @@ -18034,14 +18798,12 @@ AttachPartitionEnsureIndexes(Relation rel, Relation attachrel) attachInfos = palloc(sizeof(IndexInfo *) * list_length(attachRelIdxs)); /* Build arrays of all existing indexes and their IndexInfos */ - i = 0; - foreach(cell, attachRelIdxs) + foreach_oid(cldIdxId, attachRelIdxs) { - Oid cldIdxId = lfirst_oid(cell); + int i = foreach_current_index(cldIdxId); attachrelIdxRels[i] = index_open(cldIdxId, AccessShareLock); attachInfos[i] = BuildIndexInfo(attachrelIdxRels[i]); - i++; } /* @@ -18107,7 +18869,7 @@ AttachPartitionEnsureIndexes(Relation rel, Relation attachrel) * the first matching, valid, unattached one we find, if any, as * partition of the parent index. If we find one, we're done. */ - for (i = 0; i < list_length(attachRelIdxs); i++) + for (int i = 0; i < list_length(attachRelIdxs); i++) { Oid cldIdxId = RelationGetRelid(attachrelIdxRels[i]); Oid cldConstrOid = InvalidOid; @@ -18141,6 +18903,11 @@ AttachPartitionEnsureIndexes(Relation rel, Relation attachrel) /* no dice */ if (!OidIsValid(cldConstrOid)) continue; + + /* Ensure they're both the same type of constraint */ + if (get_constraint_type(constraintOid) != + get_constraint_type(cldConstrOid)) + continue; } /* bingo. */ @@ -18179,7 +18946,7 @@ AttachPartitionEnsureIndexes(Relation rel, Relation attachrel) out: /* Clean up. */ - for (i = 0; i < list_length(attachRelIdxs); i++) + for (int i = 0; i < list_length(attachRelIdxs); i++) index_close(attachrelIdxRels[i], AccessShareLock); MemoryContextSwitchTo(oldcxt); MemoryContextDelete(cxt); @@ -18532,6 +19299,7 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, HeapTuple tuple, newtuple; Relation trigrel = NULL; + List *fkoids = NIL; if (concurrent) { @@ -18552,12 +19320,28 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, fks = copyObject(RelationGetFKeyList(partRel)); if (fks != NIL) trigrel = table_open(TriggerRelationId, RowExclusiveLock); + + /* + * It's possible that the partition being detached has a foreign key that + * references a partitioned table. When that happens, there are multiple + * pg_constraint rows for the partition: one points to the partitioned + * table itself, while the others point to each of its partitions. Only + * the topmost one is to be considered here; the child constraints must be + * left alone, because conceptually those aren't coming from our parent + * partitioned table, but from this partition itself. + * + * We implement this by collecting all the constraint OIDs in a first scan + * of the FK array, and skipping in the loop below those constraints whose + * parents are listed here. + */ + foreach_node(ForeignKeyCacheInfo, fk, fks) + fkoids = lappend_oid(fkoids, fk->conoid); + foreach(cell, fks) { ForeignKeyCacheInfo *fk = lfirst(cell); HeapTuple contup; Form_pg_constraint conform; - Constraint *fkconstraint; Oid insertTriggerOid, updateTriggerOid; @@ -18566,15 +19350,22 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, elog(ERROR, "cache lookup failed for constraint %u", fk->conoid); conform = (Form_pg_constraint) GETSTRUCT(contup); - /* consider only the inherited foreign keys */ + /* + * Consider only inherited foreign keys, and only if their parents + * aren't in the list. + */ if (conform->contype != CONSTRAINT_FOREIGN || - !OidIsValid(conform->conparentid)) + !OidIsValid(conform->conparentid) || + list_member_oid(fkoids, conform->conparentid)) { ReleaseSysCache(contup); continue; } - /* unset conparentid and adjust conislocal, coninhcount, etc. */ + /* + * The constraint on this table must be marked no longer a child of + * the parent's constraint, as do its check triggers. + */ ConstraintSetParentConstraint(fk->conoid, InvalidOid, InvalidOid); /* @@ -18592,33 +19383,87 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, RelationGetRelid(partRel)); /* - * Make the action triggers on the referenced relation. When this was - * a partition the action triggers pointed to the parent rel (they - * still do), but now we need separate ones of our own. + * Lastly, create the action triggers on the referenced table, using + * addFkRecurseReferenced, which requires some elaborate setup (so put + * it in a separate block). While at it, if the table is partitioned, + * that function will recurse to create the pg_constraint rows and + * action triggers for each partition. + * + * Note there's no need to do addFkConstraint() here, because the + * pg_constraint row already exists. */ - fkconstraint = makeNode(Constraint); - fkconstraint->contype = CONSTRAINT_FOREIGN; - fkconstraint->conname = pstrdup(NameStr(conform->conname)); - fkconstraint->deferrable = conform->condeferrable; - fkconstraint->initdeferred = conform->condeferred; - fkconstraint->location = -1; - fkconstraint->pktable = NULL; - fkconstraint->fk_attrs = NIL; - fkconstraint->pk_attrs = NIL; - fkconstraint->fk_matchtype = conform->confmatchtype; - fkconstraint->fk_upd_action = conform->confupdtype; - fkconstraint->fk_del_action = conform->confdeltype; - fkconstraint->fk_del_set_cols = NIL; - fkconstraint->old_conpfeqop = NIL; - fkconstraint->old_pktable_oid = InvalidOid; - fkconstraint->skip_validation = false; - fkconstraint->initially_valid = true; + { + Constraint *fkconstraint; + int numfks; + AttrNumber conkey[INDEX_MAX_KEYS]; + AttrNumber confkey[INDEX_MAX_KEYS]; + Oid conpfeqop[INDEX_MAX_KEYS]; + Oid conppeqop[INDEX_MAX_KEYS]; + Oid conffeqop[INDEX_MAX_KEYS]; + int numfkdelsetcols; + AttrNumber confdelsetcols[INDEX_MAX_KEYS]; + Relation refdRel; + + DeconstructFkConstraintRow(contup, + &numfks, + conkey, + confkey, + conpfeqop, + conppeqop, + conffeqop, + &numfkdelsetcols, + confdelsetcols); + + /* Create a synthetic node we'll use throughout */ + fkconstraint = makeNode(Constraint); + fkconstraint->contype = CONSTRAINT_FOREIGN; + fkconstraint->conname = pstrdup(NameStr(conform->conname)); + fkconstraint->deferrable = conform->condeferrable; + fkconstraint->initdeferred = conform->condeferred; + fkconstraint->skip_validation = true; + fkconstraint->initially_valid = true; + /* a few irrelevant fields omitted here */ + fkconstraint->pktable = NULL; + fkconstraint->fk_attrs = NIL; + fkconstraint->pk_attrs = NIL; + fkconstraint->fk_matchtype = conform->confmatchtype; + fkconstraint->fk_upd_action = conform->confupdtype; + fkconstraint->fk_del_action = conform->confdeltype; + fkconstraint->fk_del_set_cols = NIL; + fkconstraint->old_conpfeqop = NIL; + fkconstraint->old_pktable_oid = InvalidOid; + fkconstraint->location = -1; + + /* set up colnames, used to generate the constraint name */ + for (int i = 0; i < numfks; i++) + { + Form_pg_attribute att; + + att = TupleDescAttr(RelationGetDescr(partRel), + conkey[i] - 1); + + fkconstraint->fk_attrs = lappend(fkconstraint->fk_attrs, + makeString(NameStr(att->attname))); + } + + refdRel = table_open(fk->confrelid, ShareRowExclusiveLock); - createForeignKeyActionTriggers(partRel, conform->confrelid, - fkconstraint, fk->conoid, - conform->conindid, - InvalidOid, InvalidOid, - NULL, NULL); + addFkRecurseReferenced(fkconstraint, partRel, + refdRel, + conform->conindid, + fk->conoid, + numfks, + confkey, + conkey, + conpfeqop, + conppeqop, + conffeqop, + numfkdelsetcols, + confdelsetcols, + true, + InvalidOid, InvalidOid); + table_close(refdRel, NoLock); /* keep lock till end of xact */ + } ReleaseSysCache(contup); } @@ -18652,22 +19497,31 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, foreach(cell, indexes) { Oid idxid = lfirst_oid(cell); + Oid parentidx; Relation idx; Oid constrOid; + Oid parentConstrOid; if (!has_superclass(idxid)) continue; - Assert((IndexGetRelation(get_partition_parent(idxid, false), false) == - RelationGetRelid(rel))); + parentidx = get_partition_parent(idxid, false); + Assert((IndexGetRelation(parentidx, false) == RelationGetRelid(rel))); idx = index_open(idxid, AccessExclusiveLock); IndexSetParentIndex(idx, InvalidOid); - /* If there's a constraint associated with the index, detach it too */ + /* + * If there's a constraint associated with the index, detach it too. + * Careful: it is possible for a constraint index in a partition to be + * the child of a non-constraint index, so verify whether the parent + * index does actually have a constraint. + */ constrOid = get_relation_idx_constraint_oid(RelationGetRelid(partRel), idxid); - if (OidIsValid(constrOid)) + parentConstrOid = get_relation_idx_constraint_oid(RelationGetRelid(rel), + parentidx); + if (OidIsValid(parentConstrOid) && OidIsValid(constrOid)) ConstraintSetParentConstraint(constrOid, InvalidOid, InvalidOid); index_close(idx, NoLock); @@ -18697,6 +19551,18 @@ DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, heap_freetuple(newtuple); table_close(classRel, RowExclusiveLock); + /* + * Drop identity property from all identity columns of partition. + */ + for (int attno = 0; attno < RelationGetNumberOfAttributes(partRel); attno++) + { + Form_pg_attribute attr = TupleDescAttr(partRel->rd_att, attno); + + if (!attr->attisdropped && attr->attidentity) + ATExecDropIdentity(partRel, NameStr(attr->attname), false, + AccessExclusiveLock, true, true); + } + if (OidIsValid(defaultPartOid)) { /* @@ -19176,17 +20042,24 @@ validatePartitionedIndex(Relation partedIdx, Relation partedTbl) if (tuples == RelationGetPartitionDesc(partedTbl, true)->nparts) { Relation idxRel; - HeapTuple newtup; + HeapTuple indTup; + Form_pg_index indexForm; idxRel = table_open(IndexRelationId, RowExclusiveLock); + indTup = SearchSysCacheCopy1(INDEXRELID, + ObjectIdGetDatum(RelationGetRelid(partedIdx))); + if (!HeapTupleIsValid(indTup)) + elog(ERROR, "cache lookup failed for index %u", + RelationGetRelid(partedIdx)); + indexForm = (Form_pg_index) GETSTRUCT(indTup); - newtup = heap_copytuple(partedIdx->rd_indextuple); - ((Form_pg_index) GETSTRUCT(newtup))->indisvalid = true; + indexForm->indisvalid = true; updated = true; - CatalogTupleUpdate(idxRel, &partedIdx->rd_indextuple->t_self, newtup); + CatalogTupleUpdate(idxRel, &indTup->t_self, indTup); table_close(idxRel, RowExclusiveLock); + heap_freetuple(indTup); } /* @@ -19323,7 +20196,7 @@ ATDetachCheckNoForeignKeyRefs(Relation partition) * resolve column compression specification to compression method. */ static char -GetAttributeCompression(Oid atttypid, char *compression) +GetAttributeCompression(Oid atttypid, const char *compression) { char cmethod; diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c index 13b0dee1468b1..113b480731595 100644 --- a/src/backend/commands/tablespace.c +++ b/src/backend/commands/tablespace.c @@ -35,7 +35,7 @@ * and munge the system catalogs of the new database. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -53,7 +53,6 @@ #include "access/heapam.h" #include "access/htup_details.h" #include "access/reloptions.h" -#include "access/sysattr.h" #include "access/tableam.h" #include "access/xact.h" #include "access/xloginsert.h" @@ -62,25 +61,20 @@ #include "catalog/catalog.h" #include "catalog/dependency.h" #include "catalog/indexing.h" -#include "catalog/namespace.h" #include "catalog/objectaccess.h" -#include "catalog/pg_namespace.h" #include "catalog/pg_tablespace.h" #include "commands/comment.h" #include "commands/seclabel.h" -#include "commands/tablecmds.h" #include "commands/tablespace.h" #include "common/file_perm.h" #include "miscadmin.h" #include "postmaster/bgwriter.h" #include "storage/fd.h" -#include "storage/lmgr.h" #include "storage/standby.h" #include "utils/acl.h" #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/guc_hooks.h" -#include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/rel.h" #include "utils/varlena.h" diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 4b295f8da5e44..ea5cc10919d9c 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -3,7 +3,7 @@ * trigger.c * PostgreSQL TRIGGERs support code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -22,7 +22,6 @@ #include "access/xact.h" #include "catalog/catalog.h" #include "catalog/dependency.h" -#include "catalog/index.h" #include "catalog/indexing.h" #include "catalog/objectaccess.h" #include "catalog/partition.h" @@ -32,10 +31,8 @@ #include "catalog/pg_trigger.h" #include "catalog/pg_type.h" #include "commands/dbcommands.h" -#include "commands/defrem.h" #include "commands/trigger.h" #include "executor/executor.h" -#include "executor/execPartition.h" #include "miscadmin.h" #include "nodes/bitmapset.h" #include "nodes/makefuncs.h" @@ -44,16 +41,12 @@ #include "parser/parse_collate.h" #include "parser/parse_func.h" #include "parser/parse_relation.h" -#include "parser/parsetree.h" #include "partitioning/partdesc.h" #include "pgstat.h" #include "rewrite/rewriteManip.h" -#include "storage/bufmgr.h" #include "storage/lmgr.h" -#include "tcop/utility.h" #include "utils/acl.h" #include "utils/builtins.h" -#include "utils/bytea.h" #include "utils/fmgroids.h" #include "utils/guc_hooks.h" #include "utils/inval.h" @@ -2978,10 +2971,6 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, * received in newslot. Neither we nor our callers have any further * interest in the passed-in tuple, so it's okay to overwrite newslot * with the newer data. - * - * (Typically, newslot was also generated by ExecGetUpdateNewTuple, so - * that epqslot_clean will be that same slot and the copy step below - * is not needed.) */ if (epqslot_candidate != NULL) { @@ -2990,14 +2979,36 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, epqslot_clean = ExecGetUpdateNewTuple(relinfo, epqslot_candidate, oldslot); - if (newslot != epqslot_clean) + /* + * Typically, the caller's newslot was also generated by + * ExecGetUpdateNewTuple, so that epqslot_clean will be the same + * slot and copying is not needed. But do the right thing if it + * isn't. + */ + if (unlikely(newslot != epqslot_clean)) ExecCopySlot(newslot, epqslot_clean); + + /* + * At this point newslot contains a virtual tuple that may + * reference some fields of oldslot's tuple in some disk buffer. + * If that tuple is in a different page than the original target + * tuple, then our only pin on that buffer is oldslot's, and we're + * about to release it. Hence we'd better materialize newslot to + * ensure it doesn't contain references into an unpinned buffer. + * (We'd materialize it below anyway, but too late for safety.) + */ + ExecMaterializeSlot(newslot); } + /* + * Here we convert oldslot to a materialized slot holding trigtuple. + * Neither slot passed to the triggers will hold any buffer pin. + */ trigtuple = ExecFetchSlotHeapTuple(oldslot, true, &should_free_trig); } else { + /* Put the FDW-supplied tuple into oldslot to unify the cases */ ExecForceStoreHeapTuple(fdw_trigtuple, oldslot, false); trigtuple = fdw_trigtuple; } @@ -3976,6 +3987,30 @@ afterTriggerCheckState(AfterTriggerShared evtshared) return ((evtshared->ats_event & AFTER_TRIGGER_INITDEFERRED) != 0); } +/* ---------- + * afterTriggerCopyBitmap() + * + * Copy bitmap into AfterTriggerEvents memory context, which is where the after + * trigger events are kept. + * ---------- + */ +static Bitmapset * +afterTriggerCopyBitmap(Bitmapset *src) +{ + Bitmapset *dst; + MemoryContext oldcxt; + + if (src == NULL) + return NULL; + + oldcxt = MemoryContextSwitchTo(afterTriggers.event_cxt); + + dst = bms_copy(src); + + MemoryContextSwitchTo(oldcxt); + + return dst; +} /* ---------- * afterTriggerAddEvent() @@ -4069,16 +4104,21 @@ afterTriggerAddEvent(AfterTriggerEventList *events, (char *) newshared >= chunk->endfree; newshared--) { + /* compare fields roughly by probability of them being different */ if (newshared->ats_tgoid == evtshared->ats_tgoid && - newshared->ats_relid == evtshared->ats_relid && newshared->ats_event == evtshared->ats_event && + newshared->ats_firing_id == 0 && newshared->ats_table == evtshared->ats_table && - newshared->ats_firing_id == 0) + newshared->ats_relid == evtshared->ats_relid && + bms_equal(newshared->ats_modifiedcols, + evtshared->ats_modifiedcols)) break; } if ((char *) newshared < chunk->endfree) { *newshared = *evtshared; + /* now we must make a suitably-long-lived copy of the bitmap */ + newshared->ats_modifiedcols = afterTriggerCopyBitmap(evtshared->ats_modifiedcols); newshared->ats_firing_id = 0; /* just to be sure */ chunk->endfree = (char *) newshared; } @@ -4247,8 +4287,12 @@ AfterTriggerExecute(EState *estate, bool should_free_new = false; /* - * Locate trigger in trigdesc. + * Locate trigger in trigdesc. It might not be present, and in fact the + * trigdesc could be NULL, if the trigger was dropped since the event was + * queued. In that case, silently do nothing. */ + if (trigdesc == NULL) + return; for (tgindx = 0; tgindx < trigdesc->numtriggers; tgindx++) { if (trigdesc->triggers[tgindx].tgoid == tgoid) @@ -4258,7 +4302,7 @@ AfterTriggerExecute(EState *estate, } } if (LocTriggerData.tg_trigger == NULL) - elog(ERROR, "could not find trigger %u", tgoid); + return; /* * If doing EXPLAIN ANALYZE, start charging time to this trigger. We want @@ -4639,6 +4683,7 @@ afterTriggerInvokeEvents(AfterTriggerEventList *events, /* Catch calls with insufficient relcache refcounting */ Assert(!RelationHasReferenceCountZero(rel)); trigdesc = rInfo->ri_TrigDesc; + /* caution: trigdesc could be NULL here */ finfo = rInfo->ri_TrigFunctions; instr = rInfo->ri_TrigInstrument; if (slot1 != NULL) @@ -4654,9 +4699,6 @@ afterTriggerInvokeEvents(AfterTriggerEventList *events, slot2 = MakeSingleTupleTableSlot(rel->rd_att, &TTSOpsMinimalTuple); } - if (trigdesc == NULL) /* should not happen */ - elog(ERROR, "relation %u has no triggers", - evtshared->ats_relid); } /* @@ -4922,10 +4964,10 @@ MakeTransitionCaptureState(TriggerDesc *trigdesc, Oid relid, CmdType cmdType) /* Now build the TransitionCaptureState struct, in caller's context */ state = (TransitionCaptureState *) palloc0(sizeof(TransitionCaptureState)); - state->tcs_delete_old_table = trigdesc->trig_delete_old_table; - state->tcs_update_old_table = trigdesc->trig_update_old_table; - state->tcs_update_new_table = trigdesc->trig_update_new_table; - state->tcs_insert_new_table = trigdesc->trig_insert_new_table; + state->tcs_delete_old_table = need_old_del; + state->tcs_update_old_table = need_old_upd; + state->tcs_update_new_table = need_new_upd; + state->tcs_insert_new_table = need_new_ins; state->tcs_private = table; return state; diff --git a/src/backend/commands/tsearchcmds.c b/src/backend/commands/tsearchcmds.c index 23e62a31a18fd..b7b5019f1e07b 100644 --- a/src/backend/commands/tsearchcmds.c +++ b/src/backend/commands/tsearchcmds.c @@ -4,7 +4,7 @@ * * Routines for tsearch manipulation commands * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -33,7 +33,6 @@ #include "catalog/pg_ts_parser.h" #include "catalog/pg_ts_template.h" #include "catalog/pg_type.h" -#include "commands/alter.h" #include "commands/defrem.h" #include "commands/event_trigger.h" #include "common/string.h" @@ -41,13 +40,20 @@ #include "nodes/makefuncs.h" #include "parser/parse_func.h" #include "tsearch/ts_cache.h" -#include "tsearch/ts_utils.h" +#include "tsearch/ts_public.h" +#include "utils/acl.h" #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/syscache.h" +/* Single entry of List returned by getTokenTypes() */ +typedef struct +{ + int num; /* token type number */ + char *name; /* token type name */ +} TSTokenTypeItem; static void MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, HeapTuple tup, Relation relMap); @@ -1192,22 +1198,45 @@ AlterTSConfiguration(AlterTSConfigurationStmt *stmt) } /* - * Translate a list of token type names to an array of token type numbers + * Check whether a token type name is a member of a TSTokenTypeItem list. */ -static int * +static bool +tstoken_list_member(char *token_name, List *tokens) +{ + ListCell *c; + bool found = false; + + foreach(c, tokens) + { + TSTokenTypeItem *ts = (TSTokenTypeItem *) lfirst(c); + + if (strcmp(token_name, ts->name) == 0) + { + found = true; + break; + } + } + + return found; +} + +/* + * Translate a list of token type names to a list of unique TSTokenTypeItem. + * + * Duplicated entries list are removed from tokennames. + */ +static List * getTokenTypes(Oid prsId, List *tokennames) { TSParserCacheEntry *prs = lookup_ts_parser_cache(prsId); LexDescr *list; - int *res, - i, - ntoken; + List *result = NIL; + int ntoken; ListCell *tn; ntoken = list_length(tokennames); if (ntoken == 0) - return NULL; - res = (int *) palloc(sizeof(int) * ntoken); + return NIL; if (!OidIsValid(prs->lextypeOid)) elog(ERROR, "method lextype isn't defined for text search parser %u", @@ -1217,19 +1246,26 @@ getTokenTypes(Oid prsId, List *tokennames) list = (LexDescr *) DatumGetPointer(OidFunctionCall1(prs->lextypeOid, (Datum) 0)); - i = 0; foreach(tn, tokennames) { String *val = lfirst_node(String, tn); bool found = false; int j; + /* Skip if this token is already in the result */ + if (tstoken_list_member(strVal(val), result)) + continue; + j = 0; while (list && list[j].lexid) { if (strcmp(strVal(val), list[j].alias) == 0) { - res[i] = list[j].lexid; + TSTokenTypeItem *ts = (TSTokenTypeItem *) palloc0(sizeof(TSTokenTypeItem)); + + ts->num = list[j].lexid; + ts->name = pstrdup(strVal(val)); + result = lappend(result, ts); found = true; break; } @@ -1240,10 +1276,9 @@ getTokenTypes(Oid prsId, List *tokennames) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("token type \"%s\" does not exist", strVal(val)))); - i++; } - return res; + return result; } /* @@ -1261,8 +1296,8 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, int i; int j; Oid prsId; - int *tokens, - ntoken; + List *tokens = NIL; + int ntoken; Oid *dictIds; int ndict; ListCell *c; @@ -1273,15 +1308,17 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, prsId = tsform->cfgparser; tokens = getTokenTypes(prsId, stmt->tokentype); - ntoken = list_length(stmt->tokentype); + ntoken = list_length(tokens); if (stmt->override) { /* * delete maps for tokens if they exist and command was ALTER */ - for (i = 0; i < ntoken; i++) + foreach(c, tokens) { + TSTokenTypeItem *ts = (TSTokenTypeItem *) lfirst(c); + ScanKeyInit(&skey[0], Anum_pg_ts_config_map_mapcfg, BTEqualStrategyNumber, F_OIDEQ, @@ -1289,7 +1326,7 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, ScanKeyInit(&skey[1], Anum_pg_ts_config_map_maptokentype, BTEqualStrategyNumber, F_INT4EQ, - Int32GetDatum(tokens[i])); + Int32GetDatum(ts->num)); scan = systable_beginscan(relMap, TSConfigMapIndexId, true, NULL, 2, skey); @@ -1346,9 +1383,11 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, { bool tokmatch = false; - for (j = 0; j < ntoken; j++) + foreach(c, tokens) { - if (cfgmap->maptokentype == tokens[j]) + TSTokenTypeItem *ts = (TSTokenTypeItem *) lfirst(c); + + if (cfgmap->maptokentype == ts->num) { tokmatch = true; break; @@ -1401,8 +1440,10 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, /* * Insertion of new entries */ - for (i = 0; i < ntoken; i++) + foreach(c, tokens) { + TSTokenTypeItem *ts = (TSTokenTypeItem *) lfirst(c); + for (j = 0; j < ndict; j++) { ExecClearTuple(slot[slotCount]); @@ -1411,7 +1452,7 @@ MakeConfigurationMapping(AlterTSConfigurationStmt *stmt, slot[slotCount]->tts_tupleDescriptor->natts * sizeof(bool)); slot[slotCount]->tts_values[Anum_pg_ts_config_map_mapcfg - 1] = ObjectIdGetDatum(cfgId); - slot[slotCount]->tts_values[Anum_pg_ts_config_map_maptokentype - 1] = Int32GetDatum(tokens[i]); + slot[slotCount]->tts_values[Anum_pg_ts_config_map_maptokentype - 1] = Int32GetDatum(ts->num); slot[slotCount]->tts_values[Anum_pg_ts_config_map_mapseqno - 1] = Int32GetDatum(j + 1); slot[slotCount]->tts_values[Anum_pg_ts_config_map_mapdict - 1] = ObjectIdGetDatum(dictIds[j]); @@ -1455,9 +1496,8 @@ DropConfigurationMapping(AlterTSConfigurationStmt *stmt, ScanKeyData skey[2]; SysScanDesc scan; HeapTuple maptup; - int i; Oid prsId; - int *tokens; + List *tokens = NIL; ListCell *c; tsform = (Form_pg_ts_config) GETSTRUCT(tup); @@ -1466,10 +1506,9 @@ DropConfigurationMapping(AlterTSConfigurationStmt *stmt, tokens = getTokenTypes(prsId, stmt->tokentype); - i = 0; - foreach(c, stmt->tokentype) + foreach(c, tokens) { - String *val = lfirst_node(String, c); + TSTokenTypeItem *ts = (TSTokenTypeItem *) lfirst(c); bool found = false; ScanKeyInit(&skey[0], @@ -1479,7 +1518,7 @@ DropConfigurationMapping(AlterTSConfigurationStmt *stmt, ScanKeyInit(&skey[1], Anum_pg_ts_config_map_maptokentype, BTEqualStrategyNumber, F_INT4EQ, - Int32GetDatum(tokens[i])); + Int32GetDatum(ts->num)); scan = systable_beginscan(relMap, TSConfigMapIndexId, true, NULL, 2, skey); @@ -1499,17 +1538,15 @@ DropConfigurationMapping(AlterTSConfigurationStmt *stmt, ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), errmsg("mapping for token type \"%s\" does not exist", - strVal(val)))); + ts->name))); } else { ereport(NOTICE, (errmsg("mapping for token type \"%s\" does not exist, skipping", - strVal(val)))); + ts->name))); } } - - i++; } EventTriggerCollectAlterTSConfig(stmt, cfgId, NULL, 0); diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index 216482095d2b5..2a1e71333568e 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -3,7 +3,7 @@ * typecmds.c * Routines for SQL commands that manipulate types (and domains). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -32,8 +32,9 @@ #include "postgres.h" #include "access/genam.h" -#include "access/heapam.h" #include "access/htup_details.h" +#include "access/relation.h" +#include "access/table.h" #include "access/tableam.h" #include "access/xact.h" #include "catalog/binary_upgrade.h" @@ -68,7 +69,6 @@ #include "utils/fmgroids.h" #include "utils/inval.h" #include "utils/lsyscache.h" -#include "utils/memutils.h" #include "utils/rel.h" #include "utils/ruleutils.h" #include "utils/snapmgr.h" @@ -126,15 +126,19 @@ static Oid findTypeSubscriptingFunction(List *procname, Oid typeOid); static Oid findRangeSubOpclass(List *opcname, Oid subtype); static Oid findRangeCanonicalFunction(List *procname, Oid typeOid); static Oid findRangeSubtypeDiffFunction(List *procname, Oid subtype); -static void validateDomainConstraint(Oid domainoid, char *ccbin); +static void validateDomainCheckConstraint(Oid domainoid, const char *ccbin); +static void validateDomainNotNullConstraint(Oid domainoid); static List *get_rels_with_domain(Oid domainOid, LOCKMODE lockmode); static void checkEnumOwner(HeapTuple tup); -static char *domainAddConstraint(Oid domainOid, Oid domainNamespace, - Oid baseTypeOid, - int typMod, Constraint *constr, - const char *domainName, ObjectAddress *constrAddr); +static char *domainAddCheckConstraint(Oid domainOid, Oid domainNamespace, + Oid baseTypeOid, + int typMod, Constraint *constr, + const char *domainName, ObjectAddress *constrAddr); static Node *replace_domain_constraint_value(ParseState *pstate, ColumnRef *cref); +static void domainAddNotNullConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid, + int typMod, Constraint *constr, + const char *domainName, ObjectAddress *constrAddr); static void AlterTypeRecurse(Oid typeOid, bool isImplicitArray, HeapTuple tup, Relation catalog, AlterTypeRecurseParams *atparams); @@ -1105,9 +1109,15 @@ DefineDomain(CreateDomainStmt *stmt) switch (constr->contype) { case CONSTR_CHECK: - domainAddConstraint(address.objectId, domainNamespace, - basetypeoid, basetypeMod, - constr, domainName, NULL); + domainAddCheckConstraint(address.objectId, domainNamespace, + basetypeoid, basetypeMod, + constr, domainName, NULL); + break; + + case CONSTR_NOTNULL: + domainAddNotNullConstraint(address.objectId, domainNamespace, + basetypeoid, basetypeMod, + constr, domainName, NULL); break; /* Other constraint types were fully processed above */ @@ -2723,66 +2733,32 @@ AlterDomainNotNull(List *names, bool notNull) return address; } - /* Adding a NOT NULL constraint requires checking existing columns */ if (notNull) { - List *rels; - ListCell *rt; + Constraint *constr; - /* Fetch relation list with attributes based on this domain */ - /* ShareLock is sufficient to prevent concurrent data changes */ + constr = makeNode(Constraint); + constr->contype = CONSTR_NOTNULL; + constr->initially_valid = true; + constr->location = -1; - rels = get_rels_with_domain(domainoid, ShareLock); + domainAddNotNullConstraint(domainoid, typTup->typnamespace, + typTup->typbasetype, typTup->typtypmod, + constr, NameStr(typTup->typname), NULL); - foreach(rt, rels) - { - RelToCheck *rtc = (RelToCheck *) lfirst(rt); - Relation testrel = rtc->rel; - TupleDesc tupdesc = RelationGetDescr(testrel); - TupleTableSlot *slot; - TableScanDesc scan; - Snapshot snapshot; - - /* Scan all tuples in this relation */ - snapshot = RegisterSnapshot(GetLatestSnapshot()); - scan = table_beginscan(testrel, snapshot, 0, NULL); - slot = table_slot_create(testrel, NULL); - while (table_scan_getnextslot(scan, ForwardScanDirection, slot)) - { - int i; - - /* Test attributes that are of the domain */ - for (i = 0; i < rtc->natts; i++) - { - int attnum = rtc->atts[i]; - Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1); + validateDomainNotNullConstraint(domainoid); + } + else + { + HeapTuple conTup; + ObjectAddress conobj; - if (slot_attisnull(slot, attnum)) - { - /* - * In principle the auxiliary information for this - * error should be errdatatype(), but errtablecol() - * seems considerably more useful in practice. Since - * this code only executes in an ALTER DOMAIN command, - * the client should already know which domain is in - * question. - */ - ereport(ERROR, - (errcode(ERRCODE_NOT_NULL_VIOLATION), - errmsg("column \"%s\" of table \"%s\" contains null values", - NameStr(attr->attname), - RelationGetRelationName(testrel)), - errtablecol(testrel, attnum))); - } - } - } - ExecDropSingleTupleTableSlot(slot); - table_endscan(scan); - UnregisterSnapshot(snapshot); + conTup = findDomainNotNullConstraint(domainoid); + if (conTup == NULL) + elog(ERROR, "could not find not-null constraint on domain \"%s\"", NameStr(typTup->typname)); - /* Close each rel after processing, but keep lock */ - table_close(testrel, NoLock); - } + ObjectAddressSet(conobj, ConstraintRelationId, ((Form_pg_constraint) GETSTRUCT(conTup))->oid); + performDeletion(&conobj, DROP_RESTRICT, 0); } /* @@ -2863,10 +2839,17 @@ AlterDomainDropConstraint(List *names, const char *constrName, /* There can be at most one matching row */ if ((contup = systable_getnext(conscan)) != NULL) { + Form_pg_constraint construct = (Form_pg_constraint) GETSTRUCT(contup); ObjectAddress conobj; + if (construct->contype == CONSTRAINT_NOTNULL) + { + ((Form_pg_type) GETSTRUCT(tup))->typnotnull = false; + CatalogTupleUpdate(rel, &tup->t_self, tup); + } + conobj.classId = ConstraintRelationId; - conobj.objectId = ((Form_pg_constraint) GETSTRUCT(contup))->oid; + conobj.objectId = construct->oid; conobj.objectSubId = 0; performDeletion(&conobj, behavior, 0); @@ -2921,7 +2904,7 @@ AlterDomainAddConstraint(List *names, Node *newConstraint, Form_pg_type typTup; Constraint *constr; char *ccbin; - ObjectAddress address; + ObjectAddress address = InvalidObjectAddress; /* Make a TypeName so we can use standard type lookup machinery */ typename = makeTypeNameFromNameList(names); @@ -2947,6 +2930,7 @@ AlterDomainAddConstraint(List *names, Node *newConstraint, switch (constr->contype) { case CONSTR_CHECK: + case CONSTR_NOTNULL: /* processed below */ break; @@ -2989,29 +2973,52 @@ AlterDomainAddConstraint(List *names, Node *newConstraint, break; } - /* - * Since all other constraint types throw errors, this must be a check - * constraint. First, process the constraint expression and add an entry - * to pg_constraint. - */ + if (constr->contype == CONSTR_CHECK) + { + /* + * First, process the constraint expression and add an entry to + * pg_constraint. + */ - ccbin = domainAddConstraint(domainoid, typTup->typnamespace, - typTup->typbasetype, typTup->typtypmod, - constr, NameStr(typTup->typname), constrAddr); + ccbin = domainAddCheckConstraint(domainoid, typTup->typnamespace, + typTup->typbasetype, typTup->typtypmod, + constr, NameStr(typTup->typname), constrAddr); - /* - * If requested to validate the constraint, test all values stored in the - * attributes based on the domain the constraint is being added to. - */ - if (!constr->skip_validation) - validateDomainConstraint(domainoid, ccbin); - /* - * We must send out an sinval message for the domain, to ensure that any - * dependent plans get rebuilt. Since this command doesn't change the - * domain's pg_type row, that won't happen automatically; do it manually. - */ - CacheInvalidateHeapTuple(typrel, tup, NULL); + /* + * If requested to validate the constraint, test all values stored in + * the attributes based on the domain the constraint is being added + * to. + */ + if (!constr->skip_validation) + validateDomainCheckConstraint(domainoid, ccbin); + + /* + * We must send out an sinval message for the domain, to ensure that + * any dependent plans get rebuilt. Since this command doesn't change + * the domain's pg_type row, that won't happen automatically; do it + * manually. + */ + CacheInvalidateHeapTuple(typrel, tup, NULL); + } + else if (constr->contype == CONSTR_NOTNULL) + { + /* Is the domain already set NOT NULL? */ + if (typTup->typnotnull) + { + table_close(typrel, RowExclusiveLock); + return address; + } + domainAddNotNullConstraint(domainoid, typTup->typnamespace, + typTup->typbasetype, typTup->typtypmod, + constr, NameStr(typTup->typname), constrAddr); + + if (!constr->skip_validation) + validateDomainNotNullConstraint(domainoid); + + typTup->typnotnull = true; + CatalogTupleUpdate(typrel, &tup->t_self, tup); + } ObjectAddressSet(address, TypeRelationId, domainoid); @@ -3096,7 +3103,7 @@ AlterDomainValidateConstraint(List *names, const char *constrName) val = SysCacheGetAttrNotNull(CONSTROID, tuple, Anum_pg_constraint_conbin); conbin = TextDatumGetCString(val); - validateDomainConstraint(domainoid, conbin); + validateDomainCheckConstraint(domainoid, conbin); /* * Now update the catalog, while we have the door open. @@ -3122,8 +3129,76 @@ AlterDomainValidateConstraint(List *names, const char *constrName) return address; } +/* + * Verify that all columns currently using the domain are not null. + */ +static void +validateDomainNotNullConstraint(Oid domainoid) +{ + List *rels; + ListCell *rt; + + /* Fetch relation list with attributes based on this domain */ + /* ShareLock is sufficient to prevent concurrent data changes */ + + rels = get_rels_with_domain(domainoid, ShareLock); + + foreach(rt, rels) + { + RelToCheck *rtc = (RelToCheck *) lfirst(rt); + Relation testrel = rtc->rel; + TupleDesc tupdesc = RelationGetDescr(testrel); + TupleTableSlot *slot; + TableScanDesc scan; + Snapshot snapshot; + + /* Scan all tuples in this relation */ + snapshot = RegisterSnapshot(GetLatestSnapshot()); + scan = table_beginscan(testrel, snapshot, 0, NULL); + slot = table_slot_create(testrel, NULL); + while (table_scan_getnextslot(scan, ForwardScanDirection, slot)) + { + int i; + + /* Test attributes that are of the domain */ + for (i = 0; i < rtc->natts; i++) + { + int attnum = rtc->atts[i]; + Form_pg_attribute attr = TupleDescAttr(tupdesc, attnum - 1); + + if (slot_attisnull(slot, attnum)) + { + /* + * In principle the auxiliary information for this error + * should be errdatatype(), but errtablecol() seems + * considerably more useful in practice. Since this code + * only executes in an ALTER DOMAIN command, the client + * should already know which domain is in question. + */ + ereport(ERROR, + (errcode(ERRCODE_NOT_NULL_VIOLATION), + errmsg("column \"%s\" of table \"%s\" contains null values", + NameStr(attr->attname), + RelationGetRelationName(testrel)), + errtablecol(testrel, attnum))); + } + } + } + ExecDropSingleTupleTableSlot(slot); + table_endscan(scan); + UnregisterSnapshot(snapshot); + + /* Close each rel after processing, but keep lock */ + table_close(testrel, NoLock); + } +} + +/* + * Verify that all columns currently using the domain satisfy the given check + * constraint expression. + */ static void -validateDomainConstraint(Oid domainoid, char *ccbin) +validateDomainCheckConstraint(Oid domainoid, const char *ccbin) { Expr *expr = (Expr *) stringToNode(ccbin); List *rels; @@ -3429,12 +3504,12 @@ checkDomainOwner(HeapTuple tup) } /* - * domainAddConstraint - code shared between CREATE and ALTER DOMAIN + * domainAddCheckConstraint - code shared between CREATE and ALTER DOMAIN */ static char * -domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid, - int typMod, Constraint *constr, - const char *domainName, ObjectAddress *constrAddr) +domainAddCheckConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid, + int typMod, Constraint *constr, + const char *domainName, ObjectAddress *constrAddr) { Node *expr; char *ccbin; @@ -3442,6 +3517,8 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid, CoerceToDomainValue *domVal; Oid ccoid; + Assert(constr->contype == CONSTR_CHECK); + /* * Assign or validate constraint name */ @@ -3561,9 +3638,10 @@ replace_domain_constraint_value(ParseState *pstate, ColumnRef *cref) { /* * Check for a reference to "value", and if that's what it is, replace - * with a CoerceToDomainValue as prepared for us by domainAddConstraint. - * (We handle VALUE as a name, not a keyword, to avoid breaking a lot of - * applications that have used VALUE as a column name in the past.) + * with a CoerceToDomainValue as prepared for us by + * domainAddCheckConstraint. (We handle VALUE as a name, not a keyword, to + * avoid breaking a lot of applications that have used VALUE as a column + * name in the past.) */ if (list_length(cref->fields) == 1) { @@ -3583,6 +3661,78 @@ replace_domain_constraint_value(ParseState *pstate, ColumnRef *cref) return NULL; } +/* + * domainAddNotNullConstraint - code shared between CREATE and ALTER DOMAIN + */ +static void +domainAddNotNullConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid, + int typMod, Constraint *constr, + const char *domainName, ObjectAddress *constrAddr) +{ + Oid ccoid; + + Assert(constr->contype == CONSTR_NOTNULL); + + /* + * Assign or validate constraint name + */ + if (constr->conname) + { + if (ConstraintNameIsUsed(CONSTRAINT_DOMAIN, + domainOid, + constr->conname)) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("constraint \"%s\" for domain \"%s\" already exists", + constr->conname, domainName))); + } + else + constr->conname = ChooseConstraintName(domainName, + NULL, + "not_null", + domainNamespace, + NIL); + + /* + * Store the constraint in pg_constraint + */ + ccoid = + CreateConstraintEntry(constr->conname, /* Constraint Name */ + domainNamespace, /* namespace */ + CONSTRAINT_NOTNULL, /* Constraint Type */ + false, /* Is Deferrable */ + false, /* Is Deferred */ + !constr->skip_validation, /* Is Validated */ + InvalidOid, /* no parent constraint */ + InvalidOid, /* not a relation constraint */ + NULL, + 0, + 0, + domainOid, /* domain constraint */ + InvalidOid, /* no associated index */ + InvalidOid, /* Foreign key fields */ + NULL, + NULL, + NULL, + NULL, + 0, + ' ', + ' ', + NULL, + 0, + ' ', + NULL, /* not an exclusion constraint */ + NULL, + NULL, + true, /* is local */ + 0, /* inhcount */ + false, /* connoinherit */ + false); /* is_internal */ + + if (constrAddr) + ObjectAddressSet(*constrAddr, ConstraintRelationId, ccoid); +} + /* * Execute ALTER TYPE RENAME @@ -3633,7 +3783,9 @@ RenameType(RenameStmt *stmt) (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("%s is a table's row type", format_type_be(typeOid)), - errhint("Use ALTER TABLE instead."))); + /* translator: %s is an SQL ALTER command */ + errhint("Use %s instead.", + "ALTER TABLE"))); /* don't allow direct alteration of array types, either */ if (IsTrueArrayType(typTup)) @@ -3644,6 +3796,8 @@ RenameType(RenameStmt *stmt) errhint("You can alter type %s, which will alter the array type as well.", format_type_be(typTup->typelem)))); + /* we do allow separate renaming of multirange types, though */ + /* * If type is composite we need to rename associated pg_class entry too. * RenameRelationInternal will call RenameTypeInternal automatically. @@ -3714,7 +3868,9 @@ AlterTypeOwner(List *names, Oid newOwnerId, ObjectType objecttype) (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("%s is a table's row type", format_type_be(typeOid)), - errhint("Use ALTER TABLE instead."))); + /* translator: %s is an SQL ALTER command */ + errhint("Use %s instead.", + "ALTER TABLE"))); /* don't allow direct alteration of array types, either */ if (IsTrueArrayType(typTup)) @@ -3725,6 +3881,21 @@ AlterTypeOwner(List *names, Oid newOwnerId, ObjectType objecttype) errhint("You can alter type %s, which will alter the array type as well.", format_type_be(typTup->typelem)))); + /* don't allow direct alteration of multirange types, either */ + if (typTup->typtype == TYPTYPE_MULTIRANGE) + { + Oid rangetype = get_multirange_range(typeOid); + + /* We don't expect get_multirange_range to fail, but cope if so */ + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("cannot alter multirange type %s", + format_type_be(typeOid)), + OidIsValid(rangetype) ? + errhint("You can alter type %s, which will alter the multirange type as well.", + format_type_be(rangetype)) : 0)); + } + /* * If the new owner is the same as the existing owner, consider the * command to have succeeded. This is for dump restoration purposes. @@ -3764,13 +3935,13 @@ AlterTypeOwner(List *names, Oid newOwnerId, ObjectType objecttype) /* * AlterTypeOwner_oid - change type owner unconditionally * - * This function recurses to handle a pg_class entry, if necessary. It - * invokes any necessary access object hooks. If hasDependEntry is true, this - * function modifies the pg_shdepend entry appropriately (this should be - * passed as false only for table rowtypes and array types). + * This function recurses to handle dependent types (arrays and multiranges). + * It invokes any necessary access object hooks. If hasDependEntry is true, + * this function modifies the pg_shdepend entry appropriately (this should be + * passed as false only for table rowtypes and dependent types). * * This is used by ALTER TABLE/TYPE OWNER commands, as well as by REASSIGN - * OWNED BY. It assumes the caller has done all needed check. + * OWNED BY. It assumes the caller has done all needed checks. */ void AlterTypeOwner_oid(Oid typeOid, Oid newOwnerId, bool hasDependEntry) @@ -3810,7 +3981,7 @@ AlterTypeOwner_oid(Oid typeOid, Oid newOwnerId, bool hasDependEntry) * AlterTypeOwnerInternal - bare-bones type owner change. * * This routine simply modifies the owner of a pg_type entry, and recurses - * to handle a possible array type. + * to handle any dependent types. */ void AlterTypeOwnerInternal(Oid typeOid, Oid newOwnerId) @@ -3860,6 +4031,19 @@ AlterTypeOwnerInternal(Oid typeOid, Oid newOwnerId) if (OidIsValid(typTup->typarray)) AlterTypeOwnerInternal(typTup->typarray, newOwnerId); + /* If it is a range type, update the associated multirange too */ + if (typTup->typtype == TYPTYPE_RANGE) + { + Oid multirange_typeid = get_range_multirange(typeOid); + + if (!OidIsValid(multirange_typeid)) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("could not find multirange type for data type %s", + format_type_be(typeOid)))); + AlterTypeOwnerInternal(multirange_typeid, newOwnerId); + } + /* Clean up */ table_close(rel, RowExclusiveLock); } @@ -3882,7 +4066,7 @@ AlterTypeNamespace(List *names, const char *newschema, ObjectType objecttype, typename = makeTypeNameFromNameList(names); typeOid = typenameTypeId(NULL, typename); - /* Don't allow ALTER DOMAIN on a type */ + /* Don't allow ALTER DOMAIN on a non-domain type */ if (objecttype == OBJECT_DOMAIN && get_typtype(typeOid) != TYPTYPE_DOMAIN) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), @@ -3893,7 +4077,7 @@ AlterTypeNamespace(List *names, const char *newschema, ObjectType objecttype, nspOid = LookupCreationNamespace(newschema); objsMoved = new_object_addresses(); - oldNspOid = AlterTypeNamespace_oid(typeOid, nspOid, objsMoved); + oldNspOid = AlterTypeNamespace_oid(typeOid, nspOid, false, objsMoved); free_object_addresses(objsMoved); if (oldschema) @@ -3904,8 +4088,21 @@ AlterTypeNamespace(List *names, const char *newschema, ObjectType objecttype, return myself; } +/* + * ALTER TYPE SET SCHEMA, where the caller has already looked up the OIDs + * of the type and the target schema and checked the schema's privileges. + * + * If ignoreDependent is true, we silently ignore dependent types + * (array types and table rowtypes) rather than raising errors. + * + * This entry point is exported for use by AlterObjectNamespace_oid, + * which doesn't want errors when it passes OIDs of dependent types. + * + * Returns the type's old namespace OID, or InvalidOid if we did nothing. + */ Oid -AlterTypeNamespace_oid(Oid typeOid, Oid nspOid, ObjectAddresses *objsMoved) +AlterTypeNamespace_oid(Oid typeOid, Oid nspOid, bool ignoreDependent, + ObjectAddresses *objsMoved) { Oid elemOid; @@ -3916,15 +4113,23 @@ AlterTypeNamespace_oid(Oid typeOid, Oid nspOid, ObjectAddresses *objsMoved) /* don't allow direct alteration of array types */ elemOid = get_element_type(typeOid); if (OidIsValid(elemOid) && get_array_type(elemOid) == typeOid) + { + if (ignoreDependent) + return InvalidOid; ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("cannot alter array type %s", format_type_be(typeOid)), errhint("You can alter type %s, which will alter the array type as well.", format_type_be(elemOid)))); + } /* and do the work */ - return AlterTypeNamespaceInternal(typeOid, nspOid, false, true, objsMoved); + return AlterTypeNamespaceInternal(typeOid, nspOid, + false, /* isImplicitArray */ + ignoreDependent, /* ignoreDependent */ + true, /* errorOnTableType */ + objsMoved); } /* @@ -3936,15 +4141,21 @@ AlterTypeNamespace_oid(Oid typeOid, Oid nspOid, ObjectAddresses *objsMoved) * if any. isImplicitArray should be true only when doing this internal * recursion (outside callers must never try to move an array type directly). * + * If ignoreDependent is true, we silently don't process table types. + * * If errorOnTableType is true, the function errors out if the type is * a table type. ALTER TABLE has to be used to move a table to a new - * namespace. + * namespace. (This flag is ignored if ignoreDependent is true.) + * + * We also do nothing if the type is already listed in *objsMoved. + * After a successful move, we add the type to *objsMoved. * - * Returns the type's old namespace OID. + * Returns the type's old namespace OID, or InvalidOid if we did nothing. */ Oid AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, bool isImplicitArray, + bool ignoreDependent, bool errorOnTableType, ObjectAddresses *objsMoved) { @@ -3999,13 +4210,21 @@ AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, get_rel_relkind(typform->typrelid) == RELKIND_COMPOSITE_TYPE); /* Enforce not-table-type if requested */ - if (typform->typtype == TYPTYPE_COMPOSITE && !isCompositeType && - errorOnTableType) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("%s is a table's row type", - format_type_be(typeOid)), - errhint("Use ALTER TABLE instead."))); + if (typform->typtype == TYPTYPE_COMPOSITE && !isCompositeType) + { + if (ignoreDependent) + { + table_close(rel, RowExclusiveLock); + return InvalidOid; + } + if (errorOnTableType) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("%s is a table's row type", + format_type_be(typeOid)), + /* translator: %s is an SQL ALTER command */ + errhint("Use %s instead.", "ALTER TABLE"))); + } if (oldNspOid != nspOid) { @@ -4059,7 +4278,7 @@ AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, !isImplicitArray) if (changeDependencyFor(TypeRelationId, typeOid, NamespaceRelationId, oldNspOid, nspOid) != 1) - elog(ERROR, "failed to change schema dependency for type %s", + elog(ERROR, "could not change schema dependency for type \"%s\"", format_type_be(typeOid)); InvokeObjectPostAlterHook(TypeRelationId, typeOid, 0); @@ -4072,7 +4291,11 @@ AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, /* Recursively alter the associated array type, if any */ if (OidIsValid(arrayOid)) - AlterTypeNamespaceInternal(arrayOid, nspOid, true, true, objsMoved); + AlterTypeNamespaceInternal(arrayOid, nspOid, + true, /* isImplicitArray */ + false, /* ignoreDependent */ + true, /* errorOnTableType */ + objsMoved); return oldNspOid; } diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index 6b42d4fc34a73..aed01cf4cae9e 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -3,7 +3,7 @@ * user.c * Commands for manipulating roles (formerly called users). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/commands/user.c @@ -38,7 +38,6 @@ #include "utils/catcache.h" #include "utils/fmgroids.h" #include "utils/syscache.h" -#include "utils/timestamp.h" #include "utils/varlena.h" /* @@ -64,7 +63,7 @@ typedef enum RRG_REMOVE_ADMIN_OPTION, RRG_REMOVE_INHERIT_OPTION, RRG_REMOVE_SET_OPTION, - RRG_DELETE_GRANT + RRG_DELETE_GRANT, } RevokeRoleGrantAction; /* Potentially set by pg_upgrade_support functions */ @@ -818,12 +817,12 @@ AlterRole(ParseState *pstate, AlterRoleStmt *stmt) "BYPASSRLS", "BYPASSRLS"))); } - /* To add members to a role, you need ADMIN OPTION. */ + /* To add or drop members, you need ADMIN OPTION. */ if (drolemembers && !is_admin_of_role(currentUserId, roleid)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("permission denied to alter role"), - errdetail("Only roles with the %s option on role \"%s\" may add members.", + errdetail("Only roles with the %s option on role \"%s\" may add or drop members.", "ADMIN", rolename))); /* Convert validuntil to internal form */ @@ -868,7 +867,7 @@ AlterRole(ParseState *pstate, AlterRoleStmt *stmt) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("permission denied to alter role"), - errdetail("The bootstrap user must have the %s attribute.", + errdetail("The bootstrap superuser must have the %s attribute.", "SUPERUSER"))); new_record[Anum_pg_authid_rolsuper - 1] = BoolGetDatum(should_be_super); @@ -1093,7 +1092,7 @@ DropRole(DropRoleStmt *stmt) Relation pg_authid_rel, pg_auth_members_rel; ListCell *item; - List *role_addresses = NIL; + List *role_oids = NIL; if (!have_createrole_privilege()) ereport(ERROR, @@ -1119,7 +1118,6 @@ DropRole(DropRoleStmt *stmt) ScanKeyData scankey; SysScanDesc sscan; Oid roleid; - ObjectAddress *role_address; if (rolspec->roletype != ROLESPEC_CSTRING) ereport(ERROR, @@ -1260,21 +1258,16 @@ DropRole(DropRoleStmt *stmt) */ CommandCounterIncrement(); - /* Looks tentatively OK, add it to the list. */ - role_address = palloc(sizeof(ObjectAddress)); - role_address->classId = AuthIdRelationId; - role_address->objectId = roleid; - role_address->objectSubId = 0; - role_addresses = lappend(role_addresses, role_address); + /* Looks tentatively OK, add it to the list if not there yet. */ + role_oids = list_append_unique_oid(role_oids, roleid); } /* * Second pass over the roles to be removed. */ - foreach(item, role_addresses) + foreach(item, role_oids) { - ObjectAddress *role_address = lfirst(item); - Oid roleid = role_address->objectId; + Oid roleid = lfirst_oid(item); HeapTuple tuple; Form_pg_authid roleform; char *detail; @@ -1935,7 +1928,7 @@ AddRoleMems(Oid currentUserId, const char *rolename, Oid roleid, HeapTuple mrtup; Form_pg_authid mrform; - mrtup = SearchSysCache1(AUTHOID, memberid); + mrtup = SearchSysCache1(AUTHOID, ObjectIdGetDatum(memberid)); if (!HeapTupleIsValid(mrtup)) elog(ERROR, "cache lookup failed for role %u", memberid); mrform = (Form_pg_authid) GETSTRUCT(mrtup); @@ -2560,6 +2553,8 @@ check_createrole_self_grant(char **newval, void **extra, GucSource source) list_free(elemlist); result = (unsigned *) guc_malloc(LOG, sizeof(unsigned)); + if (!result) + return false; *result = options; *extra = result; diff --git a/src/backend/commands/vacuum.c b/src/backend/commands/vacuum.c index 7fe6a54c068f4..9f3af7a22c82e 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -12,7 +12,7 @@ * CLUSTER, handled in cluster.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -34,11 +34,10 @@ #include "access/tableam.h" #include "access/transam.h" #include "access/xact.h" -#include "catalog/namespace.h" #include "catalog/index.h" +#include "catalog/namespace.h" #include "catalog/pg_database.h" #include "catalog/pg_inherits.h" -#include "catalog/pg_namespace.h" #include "commands/cluster.h" #include "commands/defrem.h" #include "commands/vacuum.h" @@ -58,7 +57,6 @@ #include "utils/guc.h" #include "utils/guc_hooks.h" #include "utils/memutils.h" -#include "utils/pg_rusage.h" #include "utils/snapmgr.h" #include "utils/syscache.h" @@ -118,7 +116,6 @@ static bool vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, static double compute_parallel_delay(void); static VacOptValue get_vacoptval_from_boolean(DefElem *def); static bool vac_tid_reaped(ItemPointer itemptr, void *state); -static int vac_cmp_itemptr(const void *left, const void *right); /* * GUC check function to ensure GUC value specified is within the allowable @@ -172,6 +169,9 @@ ExecVacuum(ParseState *pstate, VacuumStmt *vacstmt, bool isTopLevel) /* By default parallel vacuum is enabled */ params.nworkers = 0; + /* Will be set later if we recurse to a TOAST table. */ + params.toast_parent = InvalidOid; + /* * Set this to an invalid value so it is clear whether or not a * BUFFER_USAGE_LIMIT was specified when making the access strategy. @@ -564,7 +564,7 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, else { Assert(params->options & VACOPT_ANALYZE); - if (IsAutoVacuumWorkerProcess()) + if (AmAutoVacuumWorkerProcess()) use_own_xacts = true; else if (in_outer_xact) use_own_xacts = false; @@ -642,6 +642,8 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (use_own_xacts) { PopActiveSnapshot(); + /* standard_ProcessUtility() does CCI if !use_own_xacts */ + CommandCounterIncrement(); CommitTransactionCommand(); } else @@ -710,13 +712,6 @@ vacuum_is_permitted_for_relation(Oid relid, Form_pg_class reltuple, Assert((options & (VACOPT_VACUUM | VACOPT_ANALYZE)) != 0); - /* - * Privilege checks are bypassed in some cases (e.g., when recursing to a - * relation's TOAST table). - */ - if (options & VACOPT_SKIP_PRIVS) - return true; - /*---------- * A role has privileges to vacuum or analyze the relation if any of the * following are true: @@ -724,7 +719,8 @@ vacuum_is_permitted_for_relation(Oid relid, Form_pg_class reltuple, * - the role has the MAINTAIN privilege on the relation *---------- */ - if ((object_ownercheck(DatabaseRelationId, MyDatabaseId, GetUserId()) && !reltuple->relisshared) || + if ((object_ownercheck(DatabaseRelationId, MyDatabaseId, GetUserId()) && + !reltuple->relisshared) || pg_class_aclcheck(relid, GetUserId(), ACL_MAINTAIN) == ACLCHECK_OK) return true; @@ -812,7 +808,7 @@ vacuum_open_relation(Oid relid, RangeVar *relation, bits32 options, * statements in the permission checks; otherwise, only log if the caller * so requested. */ - if (!IsAutoVacuumWorkerProcess()) + if (!AmAutoVacuumWorkerProcess()) elevel = WARNING; else if (verbose) elevel = LOG; @@ -899,7 +895,7 @@ expand_vacuum_rel(VacuumRelation *vrel, MemoryContext vac_context, * Since autovacuum workers supply OIDs when calling vacuum(), no * autovacuum worker should reach this code. */ - Assert(!IsAutoVacuumWorkerProcess()); + Assert(!AmAutoVacuumWorkerProcess()); /* * We transiently take AccessShareLock to protect the syscache lookup @@ -1113,25 +1109,6 @@ vacuum_get_cutoffs(Relation rel, const VacuumParams *params, */ cutoffs->OldestXmin = GetOldestNonRemovableTransactionId(rel); - if (OldSnapshotThresholdActive()) - { - TransactionId limit_xmin; - TimestampTz limit_ts; - - if (TransactionIdLimitedForOldSnapshots(cutoffs->OldestXmin, rel, - &limit_xmin, &limit_ts)) - { - /* - * TODO: We should only set the threshold if we are pruning on the - * basis of the increased limits. Not as crucial here as it is - * for opportunistic pruning (which often happens at a much higher - * frequency), but would still be a significant improvement. - */ - SetOldSnapshotThresholdTimestamp(limit_ts, limit_xmin); - cutoffs->OldestXmin = limit_xmin; - } - } - Assert(TransactionIdIsNormal(cutoffs->OldestXmin)); /* Acquire OldestMxact */ @@ -1225,7 +1202,7 @@ vacuum_get_cutoffs(Relation rel, const VacuumParams *params, aggressiveXIDCutoff = nextXID - freeze_table_age; if (!TransactionIdIsNormal(aggressiveXIDCutoff)) aggressiveXIDCutoff = FirstNormalTransactionId; - if (TransactionIdPrecedesOrEquals(rel->rd_rel->relfrozenxid, + if (TransactionIdPrecedesOrEquals(cutoffs->relfrozenxid, aggressiveXIDCutoff)) return true; @@ -1246,7 +1223,7 @@ vacuum_get_cutoffs(Relation rel, const VacuumParams *params, aggressiveMXIDCutoff = nextMXID - multixact_freeze_table_age; if (aggressiveMXIDCutoff < FirstMultiXactId) aggressiveMXIDCutoff = FirstMultiXactId; - if (MultiXactIdPrecedesOrEquals(rel->rd_rel->relminmxid, + if (MultiXactIdPrecedesOrEquals(cutoffs->relminmxid, aggressiveMXIDCutoff)) return true; @@ -1430,7 +1407,9 @@ vac_update_relstats(Relation relation, { Oid relid = RelationGetRelid(relation); Relation rd; + ScanKeyData key[1]; HeapTuple ctup; + void *inplace_state; Form_pg_class pgcform; bool dirty, futurexid, @@ -1441,7 +1420,12 @@ vac_update_relstats(Relation relation, rd = table_open(RelationRelationId, RowExclusiveLock); /* Fetch a copy of the tuple to scribble on */ - ctup = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relid)); + ScanKeyInit(&key[0], + Anum_pg_class_oid, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(relid)); + systable_inplace_update_begin(rd, ClassOidIndexId, true, + NULL, 1, key, &ctup, &inplace_state); if (!HeapTupleIsValid(ctup)) elog(ERROR, "pg_class entry for relid %u vanished during vacuuming", relid); @@ -1549,7 +1533,9 @@ vac_update_relstats(Relation relation, /* If anything changed, write out the tuple. */ if (dirty) - heap_inplace_update(rd, ctup); + systable_inplace_update_finish(inplace_state, ctup); + else + systable_inplace_update_cancel(inplace_state); table_close(rd, RowExclusiveLock); @@ -1601,6 +1587,7 @@ vac_update_datfrozenxid(void) bool bogus = false; bool dirty = false; ScanKeyData key[1]; + void *inplace_state; /* * Restrict this task to one backend per database. This avoids race @@ -1636,6 +1623,8 @@ vac_update_datfrozenxid(void) /* * We must seqscan pg_class to find the minimum Xid, because there is no * index that can help us here. + * + * See vac_truncate_clog() for the race condition to prevent. */ relation = table_open(RelationRelationId, AccessShareLock); @@ -1644,7 +1633,9 @@ vac_update_datfrozenxid(void) while ((classTup = systable_getnext(scan)) != NULL) { - Form_pg_class classForm = (Form_pg_class) GETSTRUCT(classTup); + volatile FormData_pg_class *classForm = (Form_pg_class) GETSTRUCT(classTup); + TransactionId relfrozenxid = classForm->relfrozenxid; + TransactionId relminmxid = classForm->relminmxid; /* * Only consider relations able to hold unfrozen XIDs (anything else @@ -1654,8 +1645,8 @@ vac_update_datfrozenxid(void) classForm->relkind != RELKIND_MATVIEW && classForm->relkind != RELKIND_TOASTVALUE) { - Assert(!TransactionIdIsValid(classForm->relfrozenxid)); - Assert(!MultiXactIdIsValid(classForm->relminmxid)); + Assert(!TransactionIdIsValid(relfrozenxid)); + Assert(!MultiXactIdIsValid(relminmxid)); continue; } @@ -1674,34 +1665,34 @@ vac_update_datfrozenxid(void) * before those relations have been scanned and cleaned up. */ - if (TransactionIdIsValid(classForm->relfrozenxid)) + if (TransactionIdIsValid(relfrozenxid)) { - Assert(TransactionIdIsNormal(classForm->relfrozenxid)); + Assert(TransactionIdIsNormal(relfrozenxid)); /* check for values in the future */ - if (TransactionIdPrecedes(lastSaneFrozenXid, classForm->relfrozenxid)) + if (TransactionIdPrecedes(lastSaneFrozenXid, relfrozenxid)) { bogus = true; break; } /* determine new horizon */ - if (TransactionIdPrecedes(classForm->relfrozenxid, newFrozenXid)) - newFrozenXid = classForm->relfrozenxid; + if (TransactionIdPrecedes(relfrozenxid, newFrozenXid)) + newFrozenXid = relfrozenxid; } - if (MultiXactIdIsValid(classForm->relminmxid)) + if (MultiXactIdIsValid(relminmxid)) { /* check for values in the future */ - if (MultiXactIdPrecedes(lastSaneMinMulti, classForm->relminmxid)) + if (MultiXactIdPrecedes(lastSaneMinMulti, relminmxid)) { bogus = true; break; } /* determine new horizon */ - if (MultiXactIdPrecedes(classForm->relminmxid, newMinMulti)) - newMinMulti = classForm->relminmxid; + if (MultiXactIdPrecedes(relminmxid, newMinMulti)) + newMinMulti = relminmxid; } } @@ -1720,20 +1711,18 @@ vac_update_datfrozenxid(void) relation = table_open(DatabaseRelationId, RowExclusiveLock); /* - * Get the pg_database tuple to scribble on. Note that this does not - * directly rely on the syscache to avoid issues with flattened toast - * values for the in-place update. + * Fetch a copy of the tuple to scribble on. We could check the syscache + * tuple first. If that concluded !dirty, we'd avoid waiting on + * concurrent heap_update() and would avoid exclusive-locking the buffer. + * For now, don't optimize that. */ ScanKeyInit(&key[0], Anum_pg_database_oid, BTEqualStrategyNumber, F_OIDEQ, ObjectIdGetDatum(MyDatabaseId)); - scan = systable_beginscan(relation, DatabaseOidIndexId, true, - NULL, 1, key); - tuple = systable_getnext(scan); - tuple = heap_copytuple(tuple); - systable_endscan(scan); + systable_inplace_update_begin(relation, DatabaseOidIndexId, true, + NULL, 1, key, &tuple, &inplace_state); if (!HeapTupleIsValid(tuple)) elog(ERROR, "could not find tuple for database %u", MyDatabaseId); @@ -1767,7 +1756,9 @@ vac_update_datfrozenxid(void) newMinMulti = dbform->datminmxid; if (dirty) - heap_inplace_update(relation, tuple); + systable_inplace_update_finish(inplace_state, tuple); + else + systable_inplace_update_cancel(inplace_state); heap_freetuple(tuple); table_close(relation, RowExclusiveLock); @@ -1853,6 +1844,20 @@ vac_truncate_clog(TransactionId frozenXID, Assert(TransactionIdIsNormal(datfrozenxid)); Assert(MultiXactIdIsValid(datminmxid)); + /* + * If database is in the process of getting dropped, or has been + * interrupted while doing so, no connections to it are possible + * anymore. Therefore we don't need to take it into account here. + * Which is good, because it can't be processed by autovacuum either. + */ + if (database_is_invalid_form((Form_pg_database) dbform)) + { + elog(DEBUG2, + "skipping invalid database \"%s\" while computing relfrozenxid", + NameStr(dbform->datname)); + continue; + } + /* * If things are working properly, no database should have a * datfrozenxid or datminmxid that is "in the future". However, such @@ -1896,12 +1901,16 @@ vac_truncate_clog(TransactionId frozenXID, ereport(WARNING, (errmsg("some databases have not been vacuumed in over 2 billion transactions"), errdetail("You might have already suffered transaction-wraparound data loss."))); + LWLockRelease(WrapLimitsVacuumLock); return; } /* chicken out if data is bogus in any other way */ if (bogus) + { + LWLockRelease(WrapLimitsVacuumLock); return; + } /* * Advance the oldest value for commit timestamps before truncating, so @@ -1958,6 +1967,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, LOCKMODE lmode; Relation rel; LockRelId lockrelid; + Oid priv_relid; Oid toast_relid; Oid save_userid; int save_sec_context; @@ -2033,6 +2043,16 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, return false; } + /* + * When recursing to a TOAST table, check privileges on the parent. NB: + * This is only safe to do because we hold a session lock on the main + * relation that prevents concurrent deletion. + */ + if (OidIsValid(params->toast_parent)) + priv_relid = params->toast_parent; + else + priv_relid = RelationGetRelid(rel); + /* * Check if relation needs to be skipped based on privileges. This check * happens also when building the relation list to vacuum for a manual @@ -2040,7 +2060,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, * happen across multiple transactions where privileges could have changed * in-between. Make sure to only generate logs for VACUUM in this case. */ - if (!vacuum_is_permitted_for_relation(RelationGetRelid(rel), + if (!vacuum_is_permitted_for_relation(priv_relid, rel->rd_rel, params->options & ~VACOPT_ANALYZE)) { @@ -2171,6 +2191,7 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, SetUserIdAndSecContext(rel->rd_rel->relowner, save_sec_context | SECURITY_RESTRICTED_OPERATION); save_nestlevel = NewGUCNestLevel(); + RestrictSearchPath(); /* * If PROCESS_MAIN is set (the default), it's time to vacuum the main @@ -2230,12 +2251,13 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, /* * Force VACOPT_PROCESS_MAIN so vacuum_rel() processes it. Likewise, - * set VACOPT_SKIP_PRIVS since privileges on the main relation are - * sufficient to process it. + * set toast_parent so that the privilege checks are done on the main + * relation. NB: This is only safe to do because we hold a session + * lock on the main relation that prevents concurrent deletion. */ memcpy(&toast_vacuum_params, params, sizeof(VacuumParams)); toast_vacuum_params.options |= VACOPT_PROCESS_MAIN; - toast_vacuum_params.options |= VACOPT_SKIP_PRIVS; + toast_vacuum_params.toast_parent = relid; vacuum_rel(toast_relid, NULL, &toast_vacuum_params, bstrategy); } @@ -2344,7 +2366,7 @@ vacuum_delay_point(void) * [autovacuum_]vacuum_cost_delay to take effect while a table is being * vacuumed or analyzed. */ - if (ConfigReloadPending && IsAutoVacuumWorkerProcess()) + if (ConfigReloadPending && AmAutoVacuumWorkerProcess()) { ConfigReloadPending = false; ProcessConfigFile(PGC_SIGHUP); @@ -2482,16 +2504,16 @@ get_vacoptval_from_boolean(DefElem *def) */ IndexBulkDeleteResult * vac_bulkdel_one_index(IndexVacuumInfo *ivinfo, IndexBulkDeleteResult *istat, - VacDeadItems *dead_items) + TidStore *dead_items, VacDeadItemsInfo *dead_items_info) { /* Do bulk deletion */ istat = index_bulk_delete(ivinfo, istat, vac_tid_reaped, (void *) dead_items); ereport(ivinfo->message_level, - (errmsg("scanned index \"%s\" to remove %d row versions", + (errmsg("scanned index \"%s\" to remove %lld row versions", RelationGetRelationName(ivinfo->index), - dead_items->num_items))); + (long long) dead_items_info->num_items))); return istat; } @@ -2522,82 +2544,15 @@ vac_cleanup_one_index(IndexVacuumInfo *ivinfo, IndexBulkDeleteResult *istat) return istat; } -/* - * Returns the total required space for VACUUM's dead_items array given a - * max_items value. - */ -Size -vac_max_items_to_alloc_size(int max_items) -{ - Assert(max_items <= MAXDEADITEMS(MaxAllocSize)); - - return offsetof(VacDeadItems, items) + sizeof(ItemPointerData) * max_items; -} - /* * vac_tid_reaped() -- is a particular tid deletable? * * This has the right signature to be an IndexBulkDeleteCallback. - * - * Assumes dead_items array is sorted (in ascending TID order). */ static bool vac_tid_reaped(ItemPointer itemptr, void *state) { - VacDeadItems *dead_items = (VacDeadItems *) state; - int64 litem, - ritem, - item; - ItemPointer res; - - litem = itemptr_encode(&dead_items->items[0]); - ritem = itemptr_encode(&dead_items->items[dead_items->num_items - 1]); - item = itemptr_encode(itemptr); - - /* - * Doing a simple bound check before bsearch() is useful to avoid the - * extra cost of bsearch(), especially if dead items on the heap are - * concentrated in a certain range. Since this function is called for - * every index tuple, it pays to be really fast. - */ - if (item < litem || item > ritem) - return false; - - res = (ItemPointer) bsearch(itemptr, - dead_items->items, - dead_items->num_items, - sizeof(ItemPointerData), - vac_cmp_itemptr); - - return (res != NULL); -} - -/* - * Comparator routines for use with qsort() and bsearch(). - */ -static int -vac_cmp_itemptr(const void *left, const void *right) -{ - BlockNumber lblk, - rblk; - OffsetNumber loff, - roff; - - lblk = ItemPointerGetBlockNumber((ItemPointer) left); - rblk = ItemPointerGetBlockNumber((ItemPointer) right); - - if (lblk < rblk) - return -1; - if (lblk > rblk) - return 1; - - loff = ItemPointerGetOffsetNumber((ItemPointer) left); - roff = ItemPointerGetOffsetNumber((ItemPointer) right); - - if (loff < roff) - return -1; - if (loff > roff) - return 1; + TidStore *dead_items = (TidStore *) state; - return 0; + return TidStoreIsMember(dead_items, itemptr); } diff --git a/src/backend/commands/vacuumparallel.c b/src/backend/commands/vacuumparallel.c index a79067fd461de..f02fc8296f1b7 100644 --- a/src/backend/commands/vacuumparallel.c +++ b/src/backend/commands/vacuumparallel.c @@ -9,14 +9,14 @@ * In a parallel vacuum, we perform both index bulk deletion and index cleanup * with parallel worker processes. Individual indexes are processed by one * vacuum process. ParallelVacuumState contains shared information as well as - * the memory space for storing dead items allocated in the DSM segment. We + * the memory space for storing dead items allocated in the DSA area. We * launch parallel worker processes at the start of parallel index * bulk-deletion and index cleanup and once all indexes are processed, the * parallel worker processes exit. Each time we process indexes in parallel, * the parallel context is re-initialized so that the same DSM can be used for * multiple passes of index bulk-deletion and index cleanup. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -29,8 +29,9 @@ #include "access/amapi.h" #include "access/table.h" #include "access/xact.h" -#include "catalog/index.h" +#include "commands/progress.h" #include "commands/vacuum.h" +#include "executor/instrument.h" #include "optimizer/paths.h" #include "pgstat.h" #include "storage/bufmgr.h" @@ -44,11 +45,10 @@ * use small integers. */ #define PARALLEL_VACUUM_KEY_SHARED 1 -#define PARALLEL_VACUUM_KEY_DEAD_ITEMS 2 -#define PARALLEL_VACUUM_KEY_QUERY_TEXT 3 -#define PARALLEL_VACUUM_KEY_BUFFER_USAGE 4 -#define PARALLEL_VACUUM_KEY_WAL_USAGE 5 -#define PARALLEL_VACUUM_KEY_INDEX_STATS 6 +#define PARALLEL_VACUUM_KEY_QUERY_TEXT 2 +#define PARALLEL_VACUUM_KEY_BUFFER_USAGE 3 +#define PARALLEL_VACUUM_KEY_WAL_USAGE 4 +#define PARALLEL_VACUUM_KEY_INDEX_STATS 5 /* * Shared information among parallel workers. So this is allocated in the DSM @@ -109,6 +109,15 @@ typedef struct PVShared /* Counter for vacuuming and cleanup */ pg_atomic_uint32 idx; + + /* DSA handle where the TidStore lives */ + dsa_handle dead_items_dsa_handle; + + /* DSA pointer to the shared TidStore */ + dsa_pointer dead_items_handle; + + /* Statistics of shared dead items */ + VacDeadItemsInfo dead_items_info; } PVShared; /* Status used during parallel index vacuum or cleanup */ @@ -117,7 +126,7 @@ typedef enum PVIndVacStatus PARALLEL_INDVAC_STATUS_INITIAL = 0, PARALLEL_INDVAC_STATUS_NEED_BULKDELETE, PARALLEL_INDVAC_STATUS_NEED_CLEANUP, - PARALLEL_INDVAC_STATUS_COMPLETED + PARALLEL_INDVAC_STATUS_COMPLETED, } PVIndVacStatus; /* @@ -175,7 +184,7 @@ struct ParallelVacuumState PVIndStats *indstats; /* Shared dead items space among parallel vacuum workers */ - VacDeadItems *dead_items; + TidStore *dead_items; /* Points to buffer usage area in DSM */ BufferUsage *buffer_usage; @@ -231,20 +240,19 @@ static void parallel_vacuum_error_callback(void *arg); */ ParallelVacuumState * parallel_vacuum_init(Relation rel, Relation *indrels, int nindexes, - int nrequested_workers, int max_items, + int nrequested_workers, int vac_work_mem, int elevel, BufferAccessStrategy bstrategy) { ParallelVacuumState *pvs; ParallelContext *pcxt; PVShared *shared; - VacDeadItems *dead_items; + TidStore *dead_items; PVIndStats *indstats; BufferUsage *buffer_usage; WalUsage *wal_usage; bool *will_parallel_vacuum; Size est_indstats_len; Size est_shared_len; - Size est_dead_items_len; int nindexes_mwm = 0; int parallel_workers = 0; int querylen; @@ -293,11 +301,6 @@ parallel_vacuum_init(Relation rel, Relation *indrels, int nindexes, shm_toc_estimate_chunk(&pcxt->estimator, est_shared_len); shm_toc_estimate_keys(&pcxt->estimator, 1); - /* Estimate size for dead_items -- PARALLEL_VACUUM_KEY_DEAD_ITEMS */ - est_dead_items_len = vac_max_items_to_alloc_size(max_items); - shm_toc_estimate_chunk(&pcxt->estimator, est_dead_items_len); - shm_toc_estimate_keys(&pcxt->estimator, 1); - /* * Estimate space for BufferUsage and WalUsage -- * PARALLEL_VACUUM_KEY_BUFFER_USAGE and PARALLEL_VACUUM_KEY_WAL_USAGE. @@ -370,6 +373,14 @@ parallel_vacuum_init(Relation rel, Relation *indrels, int nindexes, (nindexes_mwm > 0) ? maintenance_work_mem / Min(parallel_workers, nindexes_mwm) : maintenance_work_mem; + shared->dead_items_info.max_bytes = vac_work_mem * 1024L; + + /* Prepare DSA space for dead items */ + dead_items = TidStoreCreateShared(shared->dead_items_info.max_bytes, + LWTRANCHE_PARALLEL_VACUUM_DSA); + pvs->dead_items = dead_items; + shared->dead_items_handle = TidStoreGetHandle(dead_items); + shared->dead_items_dsa_handle = dsa_get_handle(TidStoreGetDSA(dead_items)); /* Use the same buffer size for all workers */ shared->ring_nbuffers = GetAccessStrategyBufferCount(bstrategy); @@ -381,15 +392,6 @@ parallel_vacuum_init(Relation rel, Relation *indrels, int nindexes, shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_SHARED, shared); pvs->shared = shared; - /* Prepare the dead_items space */ - dead_items = (VacDeadItems *) shm_toc_allocate(pcxt->toc, - est_dead_items_len); - dead_items->max_items = max_items; - dead_items->num_items = 0; - MemSet(dead_items->items, 0, sizeof(ItemPointerData) * max_items); - shm_toc_insert(pcxt->toc, PARALLEL_VACUUM_KEY_DEAD_ITEMS, dead_items); - pvs->dead_items = dead_items; - /* * Allocate space for each worker's BufferUsage and WalUsage; no need to * initialize @@ -447,6 +449,8 @@ parallel_vacuum_end(ParallelVacuumState *pvs, IndexBulkDeleteResult **istats) istats[i] = NULL; } + TidStoreDestroy(pvs->dead_items); + DestroyParallelContext(pvs->pcxt); ExitParallelMode(); @@ -454,13 +458,39 @@ parallel_vacuum_end(ParallelVacuumState *pvs, IndexBulkDeleteResult **istats) pfree(pvs); } -/* Returns the dead items space */ -VacDeadItems * -parallel_vacuum_get_dead_items(ParallelVacuumState *pvs) +/* + * Returns the dead items space and dead items information. + */ +TidStore * +parallel_vacuum_get_dead_items(ParallelVacuumState *pvs, VacDeadItemsInfo **dead_items_info_p) { + *dead_items_info_p = &(pvs->shared->dead_items_info); return pvs->dead_items; } +/* Forget all items in dead_items */ +void +parallel_vacuum_reset_dead_items(ParallelVacuumState *pvs) +{ + VacDeadItemsInfo *dead_items_info = &(pvs->shared->dead_items_info); + + /* + * Free the current tidstore and return allocated DSA segments to the + * operating system. Then we recreate the tidstore with the same max_bytes + * limitation we just used. + */ + TidStoreDestroy(pvs->dead_items); + pvs->dead_items = TidStoreCreateShared(dead_items_info->max_bytes, + LWTRANCHE_PARALLEL_VACUUM_DSA); + + /* Update the DSA pointer for dead_items to the new one */ + pvs->shared->dead_items_dsa_handle = dsa_get_handle(TidStoreGetDSA(pvs->dead_items)); + pvs->shared->dead_items_handle = TidStoreGetHandle(pvs->dead_items); + + /* Reset the counter */ + dead_items_info->num_items = 0; +} + /* * Do parallel index bulk-deletion with parallel workers. */ @@ -631,7 +661,7 @@ parallel_vacuum_process_all_indexes(ParallelVacuumState *pvs, int num_index_scan vacuum)); } - /* Reset the parallel index processing counter */ + /* Reset the parallel index processing and progress counters */ pg_atomic_write_u32(&(pvs->shared->idx), 0); /* Setup the shared cost-based vacuum delay and launch workers */ @@ -860,7 +890,8 @@ parallel_vacuum_process_one_index(ParallelVacuumState *pvs, Relation indrel, switch (indstats->status) { case PARALLEL_INDVAC_STATUS_NEED_BULKDELETE: - istat_res = vac_bulkdel_one_index(&ivinfo, istat, pvs->dead_items); + istat_res = vac_bulkdel_one_index(&ivinfo, istat, pvs->dead_items, + &pvs->shared->dead_items_info); break; case PARALLEL_INDVAC_STATUS_NEED_CLEANUP: istat_res = vac_cleanup_one_index(&ivinfo, istat); @@ -902,6 +933,12 @@ parallel_vacuum_process_one_index(ParallelVacuumState *pvs, Relation indrel, pvs->status = PARALLEL_INDVAC_STATUS_COMPLETED; pfree(pvs->indname); pvs->indname = NULL; + + /* + * Call the parallel variant of pgstat_progress_incr_param so workers can + * report progress of index vacuum to the leader. + */ + pgstat_progress_parallel_incr_param(PROGRESS_VACUUM_INDEXES_PROCESSED, 1); } /* @@ -954,7 +991,7 @@ parallel_vacuum_main(dsm_segment *seg, shm_toc *toc) Relation *indrels; PVIndStats *indstats; PVShared *shared; - VacDeadItems *dead_items; + TidStore *dead_items; BufferUsage *buffer_usage; WalUsage *wal_usage; int nindexes; @@ -998,10 +1035,9 @@ parallel_vacuum_main(dsm_segment *seg, shm_toc *toc) PARALLEL_VACUUM_KEY_INDEX_STATS, false); - /* Set dead_items space */ - dead_items = (VacDeadItems *) shm_toc_lookup(toc, - PARALLEL_VACUUM_KEY_DEAD_ITEMS, - false); + /* Find dead_items in shared memory */ + dead_items = TidStoreAttach(shared->dead_items_dsa_handle, + shared->dead_items_handle); /* Set cost-based vacuum delay */ VacuumUpdateCosts(); @@ -1049,6 +1085,8 @@ parallel_vacuum_main(dsm_segment *seg, shm_toc *toc) InstrEndParallelQuery(&buffer_usage[ParallelWorkerNumber], &wal_usage[ParallelWorkerNumber]); + TidStoreDetach(dead_items); + /* Pop the error context stack */ error_context_stack = errcallback.previous; diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c index f0f2e07655241..aee6bbd4f442f 100644 --- a/src/backend/commands/variable.c +++ b/src/backend/commands/variable.c @@ -4,7 +4,7 @@ * Routines for handling specialized SET variables. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -32,8 +32,8 @@ #include "storage/bufmgr.h" #include "utils/acl.h" #include "utils/backend_status.h" -#include "utils/builtins.h" #include "utils/datetime.h" +#include "utils/fmgrprotos.h" #include "utils/guc_hooks.h" #include "utils/snapmgr.h" #include "utils/syscache.h" @@ -479,7 +479,7 @@ show_log_timezone(void) */ /* - * GUC check_hook for assign_timezone_abbreviations + * GUC check_hook for timezone_abbreviations */ bool check_timezone_abbreviations(char **newval, void **extra, GucSource source) @@ -511,7 +511,7 @@ check_timezone_abbreviations(char **newval, void **extra, GucSource source) } /* - * GUC assign_hook for assign_timezone_abbreviations + * GUC assign_hook for timezone_abbreviations */ void assign_timezone_abbreviations(const char *newval, void *extra) @@ -778,7 +778,7 @@ assign_client_encoding(const char *newval, void *extra) */ ereport(ERROR, (errcode(ERRCODE_INVALID_TRANSACTION_STATE), - errmsg("cannot change client_encoding during a parallel operation"))); + errmsg("cannot change \"client_encoding\" during a parallel operation"))); } /* We do not expect an error if PrepareClientEncoding succeeded */ @@ -811,40 +811,78 @@ check_session_authorization(char **newval, void **extra, GucSource source) if (*newval == NULL) return true; - if (!IsTransactionState()) + if (InitializingParallelWorker) { /* - * Can't do catalog lookups, so fail. The result of this is that - * session_authorization cannot be set in postgresql.conf, which seems - * like a good thing anyway, so we don't work hard to avoid it. + * In parallel worker initialization, we want to copy the leader's + * state even if it no longer matches the catalogs. ParallelWorkerMain + * already installed the correct role OID and superuser state. */ - return false; + roleid = GetSessionUserId(); + is_superuser = GetSessionUserIsSuperuser(); } - - /* Look up the username */ - roleTup = SearchSysCache1(AUTHNAME, PointerGetDatum(*newval)); - if (!HeapTupleIsValid(roleTup)) + else { + if (!IsTransactionState()) + { + /* + * Can't do catalog lookups, so fail. The result of this is that + * session_authorization cannot be set in postgresql.conf, which + * seems like a good thing anyway, so we don't work hard to avoid + * it. + */ + return false; + } + /* * When source == PGC_S_TEST, we don't throw a hard error for a - * nonexistent user name, only a NOTICE. See comments in guc.h. + * nonexistent user name or insufficient privileges, only a NOTICE. + * See comments in guc.h. */ - if (source == PGC_S_TEST) + + /* Look up the username */ + roleTup = SearchSysCache1(AUTHNAME, PointerGetDatum(*newval)); + if (!HeapTupleIsValid(roleTup)) { - ereport(NOTICE, - (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("role \"%s\" does not exist", *newval))); - return true; + if (source == PGC_S_TEST) + { + ereport(NOTICE, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("role \"%s\" does not exist", *newval))); + return true; + } + GUC_check_errmsg("role \"%s\" does not exist", *newval); + return false; } - GUC_check_errmsg("role \"%s\" does not exist", *newval); - return false; - } - roleform = (Form_pg_authid) GETSTRUCT(roleTup); - roleid = roleform->oid; - is_superuser = roleform->rolsuper; + roleform = (Form_pg_authid) GETSTRUCT(roleTup); + roleid = roleform->oid; + is_superuser = roleform->rolsuper; + + ReleaseSysCache(roleTup); - ReleaseSysCache(roleTup); + /* + * Only superusers may SET SESSION AUTHORIZATION a role other than + * itself. Note that in case of multiple SETs in a single session, the + * original authenticated user's superuserness is what matters. + */ + if (roleid != GetAuthenticatedUserId() && + !superuser_arg(GetAuthenticatedUserId())) + { + if (source == PGC_S_TEST) + { + ereport(NOTICE, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("permission will be denied to set session authorization \"%s\"", + *newval))); + return true; + } + GUC_check_errcode(ERRCODE_INSUFFICIENT_PRIVILEGE); + GUC_check_errmsg("permission denied to set session authorization \"%s\"", + *newval); + return false; + } + } /* Set up "extra" struct for assign_session_authorization to use */ myextra = (role_auth_extra *) guc_malloc(LOG, sizeof(role_auth_extra)); @@ -894,6 +932,16 @@ check_role(char **newval, void **extra, GucSource source) roleid = InvalidOid; is_superuser = false; } + else if (InitializingParallelWorker) + { + /* + * In parallel worker initialization, we want to copy the leader's + * state even if it no longer matches the catalogs. ParallelWorkerMain + * already installed the correct role OID and superuser state. + */ + roleid = GetCurrentRoleId(); + is_superuser = current_role_is_superuser; + } else { if (!IsTransactionState()) @@ -933,13 +981,8 @@ check_role(char **newval, void **extra, GucSource source) ReleaseSysCache(roleTup); - /* - * Verify that session user is allowed to become this role, but skip - * this in parallel mode, where we must blindly recreate the parallel - * leader's state. - */ - if (!InitializingParallelWorker && - !member_can_set_role(GetSessionUserId(), roleid)) + /* Verify that session user is allowed to become this role */ + if (!member_can_set_role(GetSessionUserId(), roleid)) { if (source == PGC_S_TEST) { @@ -1039,6 +1082,8 @@ check_application_name(char **newval, void **extra, GucSource source) return false; } + guc_free(*newval); + pfree(clean); *newval = ret; return true; @@ -1075,6 +1120,8 @@ check_cluster_name(char **newval, void **extra, GucSource source) return false; } + guc_free(*newval); + pfree(clean); *newval = ret; return true; @@ -1178,7 +1225,7 @@ check_effective_io_concurrency(int *newval, void **extra, GucSource source) #ifndef USE_PREFETCH if (*newval != 0) { - GUC_check_errdetail("effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()."); + GUC_check_errdetail("\"effective_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()."); return false; } #endif /* USE_PREFETCH */ @@ -1191,7 +1238,7 @@ check_maintenance_io_concurrency(int *newval, void **extra, GucSource source) #ifndef USE_PREFETCH if (*newval != 0) { - GUC_check_errdetail("maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()."); + GUC_check_errdetail("\"maintenance_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()."); return false; } #endif /* USE_PREFETCH */ diff --git a/src/backend/commands/view.c b/src/backend/commands/view.c index 9bd77546b9dc2..fdad83383245f 100644 --- a/src/backend/commands/view.c +++ b/src/backend/commands/view.c @@ -3,7 +3,7 @@ * view.c * use rewrite rules to construct views * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -17,25 +17,20 @@ #include "access/relation.h" #include "access/xact.h" #include "catalog/namespace.h" -#include "commands/defrem.h" #include "commands/tablecmds.h" #include "commands/view.h" -#include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "parser/analyze.h" #include "parser/parse_relation.h" #include "rewrite/rewriteDefine.h" #include "rewrite/rewriteHandler.h" -#include "rewrite/rewriteManip.h" #include "rewrite/rewriteSupport.h" -#include "utils/acl.h" #include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/rel.h" -#include "utils/syscache.h" -static void checkViewTupleDesc(TupleDesc newdesc, TupleDesc olddesc); +static void checkViewColumns(TupleDesc newdesc, TupleDesc olddesc); /*--------------------------------------------------------------------- * DefineVirtualRelation @@ -135,7 +130,7 @@ DefineVirtualRelation(RangeVar *relation, List *tlist, bool replace, * column list. */ descriptor = BuildDescForRelation(attrList); - checkViewTupleDesc(descriptor, rel->rd_att); + checkViewColumns(descriptor, rel->rd_att); /* * If new attributes have been added, we must add pg_attribute entries @@ -263,13 +258,13 @@ DefineVirtualRelation(RangeVar *relation, List *tlist, bool replace, } /* - * Verify that tupledesc associated with proposed new view definition - * matches tupledesc of old view. This is basically a cut-down version - * of equalTupleDescs(), with code added to generate specific complaints. - * Also, we allow the new tupledesc to have more columns than the old. + * Verify that the columns associated with proposed new view definition match + * the columns of the old view. This is similar to equalRowTypes(), with code + * added to generate specific complaints. Also, we allow the new view to have + * more columns than the old. */ static void -checkViewTupleDesc(TupleDesc newdesc, TupleDesc olddesc) +checkViewColumns(TupleDesc newdesc, TupleDesc olddesc) { int i; diff --git a/src/backend/executor/README b/src/backend/executor/README index 17775a49e2681..642d63be613b6 100644 --- a/src/backend/executor/README +++ b/src/backend/executor/README @@ -26,7 +26,7 @@ unnecessarily (for example, Sort does not rescan its input if no parameters of the input have changed, since it can just reread its stored sorted data). For a SELECT, it is only necessary to deliver the top-level result tuples -to the client. For INSERT/UPDATE/DELETE, the actual table modification +to the client. For INSERT/UPDATE/DELETE/MERGE, the actual table modification operations happen in a top-level ModifyTable plan node. If the query includes a RETURNING clause, the ModifyTable node delivers the computed RETURNING rows as output, otherwise it returns nothing. Handling INSERT @@ -353,8 +353,8 @@ EvalPlanQual (READ COMMITTED Update Checking) For simple SELECTs, the executor need only pay attention to tuples that are valid according to the snapshot seen by the current transaction (ie, they were inserted by a previously committed transaction, and not deleted by any -previously committed transaction). However, for UPDATE and DELETE it is not -cool to modify or delete a tuple that's been modified by an open or +previously committed transaction). However, for UPDATE, DELETE, and MERGE it +is not cool to modify or delete a tuple that's been modified by an open or concurrently-committed transaction. If we are running in SERIALIZABLE isolation level then we just raise an error when this condition is seen to occur. In READ COMMITTED isolation level, we must work a lot harder. @@ -378,14 +378,14 @@ we're doing UPDATE). If no tuple is returned, then the modified tuple(s) fail the quals, so we ignore the current result tuple and continue the original query. -In UPDATE/DELETE, only the target relation needs to be handled this way. +In UPDATE/DELETE/MERGE, only the target relation needs to be handled this way. In SELECT FOR UPDATE, there may be multiple relations flagged FOR UPDATE, so we obtain lock on the current tuple version in each such relation before executing the recheck. It is also possible that there are relations in the query that are not -to be locked (they are neither the UPDATE/DELETE target nor specified to -be locked in SELECT FOR UPDATE/SHARE). When re-running the test query +to be locked (they are neither the UPDATE/DELETE/MERGE target nor specified +to be locked in SELECT FOR UPDATE/SHARE). When re-running the test query we want to use the same rows from these relations that were joined to the locked rows. For ordinary relations this can be implemented relatively cheaply by including the row TID in the join outputs and re-fetching that diff --git a/src/backend/executor/execAmi.c b/src/backend/executor/execAmi.c index 9d18ce8c6b2f9..3289e3e021996 100644 --- a/src/backend/executor/execAmi.c +++ b/src/backend/executor/execAmi.c @@ -3,7 +3,7 @@ * execAmi.c * miscellaneous executor access method routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/executor/execAmi.c @@ -14,7 +14,7 @@ #include "access/amapi.h" #include "access/htup_details.h" -#include "executor/execdebug.h" +#include "catalog/pg_class.h" #include "executor/nodeAgg.h" #include "executor/nodeAppend.h" #include "executor/nodeBitmapAnd.h" @@ -59,9 +59,7 @@ #include "executor/nodeWindowAgg.h" #include "executor/nodeWorktablescan.h" #include "nodes/extensible.h" -#include "nodes/nodeFuncs.h" #include "nodes/pathnodes.h" -#include "utils/rel.h" #include "utils/syscache.h" static bool IndexSupportsBackwardScan(Oid indexid); diff --git a/src/backend/executor/execAsync.c b/src/backend/executor/execAsync.c index 5c04db663923a..6129b80337045 100644 --- a/src/backend/executor/execAsync.c +++ b/src/backend/executor/execAsync.c @@ -3,7 +3,7 @@ * execAsync.c * Support routines for asynchronous execution * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/executor/execCurrent.c b/src/backend/executor/execCurrent.c index 96c4bfb6ad333..70c62ac1108c5 100644 --- a/src/backend/executor/execCurrent.c +++ b/src/backend/executor/execCurrent.c @@ -3,7 +3,7 @@ * execCurrent.c * executor support for WHERE CURRENT OF cursor * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/executor/execCurrent.c diff --git a/src/backend/executor/execExpr.c b/src/backend/executor/execExpr.c index e6e616865c231..1e3b93a69d871 100644 --- a/src/backend/executor/execExpr.c +++ b/src/backend/executor/execExpr.c @@ -19,7 +19,7 @@ * and "Expression Evaluation" sections. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -47,7 +47,8 @@ #include "utils/acl.h" #include "utils/array.h" #include "utils/builtins.h" -#include "utils/datum.h" +#include "utils/jsonfuncs.h" +#include "utils/jsonpath.h" #include "utils/lsyscache.h" #include "utils/typcache.h" @@ -87,6 +88,13 @@ static void ExecBuildAggTransCall(ExprState *state, AggState *aggstate, FunctionCallInfo fcinfo, AggStatePerTrans pertrans, int transno, int setno, int setoff, bool ishash, bool nullcheck); +static void ExecInitJsonExpr(JsonExpr *jsexpr, ExprState *state, + Datum *resv, bool *resnull, + ExprEvalStep *scratch); +static void ExecInitJsonCoercion(ExprState *state, JsonReturning *returning, + ErrorSaveContext *escontext, bool omit_quotes, + bool exists_coerce, + Datum *resv, bool *resnull); /* @@ -215,7 +223,6 @@ ExecInitQual(List *qual, PlanState *parent) ExprState *state; ExprEvalStep scratch = {0}; List *adjust_jumps = NIL; - ListCell *lc; /* short-circuit (here and in ExecQual) for empty restriction list */ if (qual == NIL) @@ -249,10 +256,8 @@ ExecInitQual(List *qual, PlanState *parent) scratch.resvalue = &state->resvalue; scratch.resnull = &state->resnull; - foreach(lc, qual) + foreach_ptr(Expr, node, qual) { - Expr *node = (Expr *) lfirst(lc); - /* first evaluate expression */ ExecInitExprRec(node, state, &state->resvalue, &state->resnull); @@ -264,9 +269,9 @@ ExecInitQual(List *qual, PlanState *parent) } /* adjust jump targets */ - foreach(lc, adjust_jumps) + foreach_int(jump, adjust_jumps) { - ExprEvalStep *as = &state->steps[lfirst_int(lc)]; + ExprEvalStep *as = &state->steps[jump]; Assert(as->opcode == EEOP_QUAL); Assert(as->d.qualexpr.jumpdone == -1); @@ -1110,6 +1115,19 @@ ExecInitExprRec(Expr *node, ExprState *state, break; } + case T_MergeSupportFunc: + { + /* must be in a MERGE, else something messed up */ + if (!state->parent || + !IsA(state->parent, ModifyTableState) || + ((ModifyTableState *) state->parent)->operation != CMD_MERGE) + elog(ERROR, "MergeSupportFunc found in non-merge plan node"); + + scratch.opcode = EEOP_MERGE_SUPPORT_FUNC; + ExprEvalPushStep(state, &scratch); + break; + } + case T_SubscriptingRef: { SubscriptingRef *sbsref = (SubscriptingRef *) node; @@ -1170,6 +1188,14 @@ ExecInitExprRec(Expr *node, ExprState *state, op->args, op->opfuncid, op->inputcollid, state); + /* + * If first argument is of varlena type, we'll need to ensure + * that the value passed to the comparison function is a + * read-only pointer. + */ + scratch.d.func.make_ro = + (get_typlen(exprType((Node *) linitial(op->args))) == -1); + /* * Change opcode of call instruction to EEOP_NULLIF. * @@ -1562,7 +1588,10 @@ ExecInitExprRec(Expr *node, ExprState *state, * We don't check permissions here as a type's input/output * function are assumed to be executable by everyone. */ - scratch.opcode = EEOP_IOCOERCE; + if (state->escontext == NULL) + scratch.opcode = EEOP_IOCOERCE; + else + scratch.opcode = EEOP_IOCOERCE_SAFE; /* lookup the source type's output function */ scratch.d.iocoerce.finfo_out = palloc0(sizeof(FmgrInfo)); @@ -1598,6 +1627,8 @@ ExecInitExprRec(Expr *node, ExprState *state, fcinfo_in->args[2].value = Int32GetDatum(-1); fcinfo_in->args[2].isnull = false; + fcinfo_in->context = (Node *) state->escontext; + ExprEvalPushStep(state, &scratch); break; } @@ -2294,21 +2325,10 @@ ExecInitExprRec(Expr *node, ExprState *state, { JsonValueExpr *jve = (JsonValueExpr *) node; + Assert(jve->raw_expr != NULL); ExecInitExprRec(jve->raw_expr, state, resv, resnull); - - if (jve->formatted_expr) - { - Datum *innermost_caseval = state->innermost_caseval; - bool *innermost_isnull = state->innermost_casenull; - - state->innermost_caseval = resv; - state->innermost_casenull = resnull; - - ExecInitExprRec(jve->formatted_expr, state, resv, resnull); - - state->innermost_caseval = innermost_caseval; - state->innermost_casenull = innermost_isnull; - } + Assert(jve->formatted_expr != NULL); + ExecInitExprRec(jve->formatted_expr, state, resv, resnull); break; } @@ -2324,6 +2344,12 @@ ExecInitExprRec(Expr *node, ExprState *state, { ExecInitExprRec(ctor->func, state, resv, resnull); } + else if ((ctor->type == JSCTOR_JSON_PARSE && !ctor->unique) || + ctor->type == JSCTOR_JSON_SERIALIZE) + { + /* Use the value of the first argument as result */ + ExecInitExprRec(linitial(args), state, resv, resnull); + } else { JsonConstructorExprState *jcstate; @@ -2362,6 +2388,29 @@ ExecInitExprRec(Expr *node, ExprState *state, argno++; } + /* prepare type cache for datum_to_json[b]() */ + if (ctor->type == JSCTOR_JSON_SCALAR) + { + bool is_jsonb = + ctor->returning->format->format_type == JS_FORMAT_JSONB; + + jcstate->arg_type_cache = + palloc(sizeof(*jcstate->arg_type_cache) * nargs); + + for (int i = 0; i < nargs; i++) + { + JsonTypeCategory category; + Oid outfuncid; + Oid typid = jcstate->arg_types[i]; + + json_categorize_type(typid, is_jsonb, + &category, &outfuncid); + + jcstate->arg_type_cache[i].outfuncid = outfuncid; + jcstate->arg_type_cache[i].category = (int) category; + } + } + ExprEvalPushStep(state, &scratch); } @@ -2394,6 +2443,23 @@ ExecInitExprRec(Expr *node, ExprState *state, break; } + case T_JsonExpr: + { + JsonExpr *jsexpr = castNode(JsonExpr, node); + + /* + * No need to initialize a full JsonExprState For + * JSON_TABLE(), because the upstream caller tfuncFetchRows() + * is only interested in the value of formatted_expr. + */ + if (jsexpr->op == JSON_TABLE_OP) + ExecInitExprRec((Expr *) jsexpr->formatted_expr, state, + resv, resnull); + else + ExecInitJsonExpr(jsexpr, state, resv, resnull, &scratch); + break; + } + case T_NullTest: { NullTest *ntest = (NullTest *) node; @@ -3289,6 +3355,7 @@ ExecInitCoerceToDomain(ExprEvalStep *scratch, CoerceToDomain *ctest, /* we'll allocate workspace only if needed */ scratch->d.domaincheck.checkvalue = NULL; scratch->d.domaincheck.checknull = NULL; + scratch->d.domaincheck.escontext = state->escontext; /* * Evaluate argument - it's fine to directly store it into resv/resnull, @@ -4161,3 +4228,333 @@ ExecBuildParamSetEqual(TupleDesc desc, return state; } + +/* + * Push steps to evaluate a JsonExpr and its various subsidiary expressions. + */ +static void +ExecInitJsonExpr(JsonExpr *jsexpr, ExprState *state, + Datum *resv, bool *resnull, + ExprEvalStep *scratch) +{ + JsonExprState *jsestate = palloc0(sizeof(JsonExprState)); + ListCell *argexprlc; + ListCell *argnamelc; + List *jumps_return_null = NIL; + List *jumps_to_end = NIL; + ListCell *lc; + ErrorSaveContext *escontext; + bool returning_domain = + get_typtype(jsexpr->returning->typid) == TYPTYPE_DOMAIN; + + Assert(jsexpr->on_error != NULL); + + jsestate->jsexpr = jsexpr; + + /* + * Evaluate formatted_expr storing the result into + * jsestate->formatted_expr. + */ + ExecInitExprRec((Expr *) jsexpr->formatted_expr, state, + &jsestate->formatted_expr.value, + &jsestate->formatted_expr.isnull); + + /* JUMP to return NULL if formatted_expr evaluates to NULL */ + jumps_return_null = lappend_int(jumps_return_null, state->steps_len); + scratch->opcode = EEOP_JUMP_IF_NULL; + scratch->resnull = &jsestate->formatted_expr.isnull; + scratch->d.jump.jumpdone = -1; /* set below */ + ExprEvalPushStep(state, scratch); + + /* + * Evaluate pathspec expression storing the result into + * jsestate->pathspec. + */ + ExecInitExprRec((Expr *) jsexpr->path_spec, state, + &jsestate->pathspec.value, + &jsestate->pathspec.isnull); + + /* JUMP to return NULL if path_spec evaluates to NULL */ + jumps_return_null = lappend_int(jumps_return_null, state->steps_len); + scratch->opcode = EEOP_JUMP_IF_NULL; + scratch->resnull = &jsestate->pathspec.isnull; + scratch->d.jump.jumpdone = -1; /* set below */ + ExprEvalPushStep(state, scratch); + + /* Steps to compute PASSING args. */ + jsestate->args = NIL; + forboth(argexprlc, jsexpr->passing_values, + argnamelc, jsexpr->passing_names) + { + Expr *argexpr = (Expr *) lfirst(argexprlc); + String *argname = lfirst_node(String, argnamelc); + JsonPathVariable *var = palloc(sizeof(*var)); + + var->name = argname->sval; + var->namelen = strlen(var->name); + var->typid = exprType((Node *) argexpr); + var->typmod = exprTypmod((Node *) argexpr); + + ExecInitExprRec((Expr *) argexpr, state, &var->value, &var->isnull); + + jsestate->args = lappend(jsestate->args, var); + } + + /* Step for jsonpath evaluation; see ExecEvalJsonExprPath(). */ + scratch->opcode = EEOP_JSONEXPR_PATH; + scratch->resvalue = resv; + scratch->resnull = resnull; + scratch->d.jsonexpr.jsestate = jsestate; + ExprEvalPushStep(state, scratch); + + /* + * Step to return NULL after jumping to skip the EEOP_JSONEXPR_PATH step + * when either formatted_expr or pathspec is NULL. Adjust jump target + * addresses of JUMPs that we added above. + */ + foreach(lc, jumps_return_null) + { + ExprEvalStep *as = &state->steps[lfirst_int(lc)]; + + as->d.jump.jumpdone = state->steps_len; + } + scratch->opcode = EEOP_CONST; + scratch->resvalue = resv; + scratch->resnull = resnull; + scratch->d.constval.value = (Datum) 0; + scratch->d.constval.isnull = true; + ExprEvalPushStep(state, scratch); + + escontext = jsexpr->on_error->btype != JSON_BEHAVIOR_ERROR ? + &jsestate->escontext : NULL; + + /* + * To handle coercion errors softly, use the following ErrorSaveContext to + * pass to ExecInitExprRec() when initializing the coercion expressions + * and in the EEOP_JSONEXPR_COERCION step. + */ + jsestate->escontext.type = T_ErrorSaveContext; + + /* + * Steps to coerce the result value computed by EEOP_JSONEXPR_PATH or the + * NULL returned on NULL input as described above. + */ + jsestate->jump_eval_coercion = -1; + if (jsexpr->use_json_coercion) + { + jsestate->jump_eval_coercion = state->steps_len; + + ExecInitJsonCoercion(state, jsexpr->returning, escontext, + jsexpr->omit_quotes, + jsexpr->op == JSON_EXISTS_OP, + resv, resnull); + } + else if (jsexpr->use_io_coercion) + { + /* + * Here we only need to initialize the FunctionCallInfo for the target + * type's input function, which is called by ExecEvalJsonExprPath() + * itself, so no additional step is necessary. + */ + Oid typinput; + Oid typioparam; + FmgrInfo *finfo; + FunctionCallInfo fcinfo; + + getTypeInputInfo(jsexpr->returning->typid, &typinput, &typioparam); + finfo = palloc0(sizeof(FmgrInfo)); + fcinfo = palloc0(SizeForFunctionCallInfo(3)); + fmgr_info(typinput, finfo); + fmgr_info_set_expr((Node *) jsexpr->returning, finfo); + InitFunctionCallInfoData(*fcinfo, finfo, 3, InvalidOid, NULL, NULL); + + /* + * We can preload the second and third arguments for the input + * function, since they're constants. + */ + fcinfo->args[1].value = ObjectIdGetDatum(typioparam); + fcinfo->args[1].isnull = false; + fcinfo->args[2].value = Int32GetDatum(jsexpr->returning->typmod); + fcinfo->args[2].isnull = false; + fcinfo->context = (Node *) escontext; + + jsestate->input_fcinfo = fcinfo; + } + + /* + * Add a special step, if needed, to check if the coercion evaluation ran + * into an error but was not thrown because the ON ERROR behavior is not + * ERROR. It will set jsestate->error if an error did occur. + */ + if (jsestate->jump_eval_coercion >= 0 && escontext != NULL) + { + scratch->opcode = EEOP_JSONEXPR_COERCION_FINISH; + scratch->d.jsonexpr.jsestate = jsestate; + ExprEvalPushStep(state, scratch); + } + + jsestate->jump_empty = jsestate->jump_error = -1; + + /* + * Step to check jsestate->error and return the ON ERROR expression if + * there is one. This handles both the errors that occur during jsonpath + * evaluation in EEOP_JSONEXPR_PATH and subsequent coercion evaluation. + * + * Speed up common cases by avoiding extra steps for a NULL-valued ON + * ERROR expression unless RETURNING a domain type, where constraints must + * be checked. ExecEvalJsonExprPath() already returns NULL on error, + * making additional steps unnecessary in typical scenarios. Note that the + * default ON ERROR behavior for JSON_VALUE() and JSON_QUERY() is to + * return NULL. + */ + if (jsexpr->on_error->btype != JSON_BEHAVIOR_ERROR && + (!(IsA(jsexpr->on_error->expr, Const) && + ((Const *) jsexpr->on_error->expr)->constisnull) || + returning_domain)) + { + ErrorSaveContext *saved_escontext; + + jsestate->jump_error = state->steps_len; + + /* JUMP to end if false, that is, skip the ON ERROR expression. */ + jumps_to_end = lappend_int(jumps_to_end, state->steps_len); + scratch->opcode = EEOP_JUMP_IF_NOT_TRUE; + scratch->resvalue = &jsestate->error.value; + scratch->resnull = &jsestate->error.isnull; + scratch->d.jump.jumpdone = -1; /* set below */ + ExprEvalPushStep(state, scratch); + + /* + * Steps to evaluate the ON ERROR expression; handle errors softly to + * rethrow them in COERCION_FINISH step that will be added later. + */ + saved_escontext = state->escontext; + state->escontext = escontext; + ExecInitExprRec((Expr *) jsexpr->on_error->expr, + state, resv, resnull); + state->escontext = saved_escontext; + + /* Step to coerce the ON ERROR expression if needed */ + if (jsexpr->on_error->coerce) + ExecInitJsonCoercion(state, jsexpr->returning, escontext, + jsexpr->omit_quotes, false, + resv, resnull); + + /* + * Add a COERCION_FINISH step to check for errors that may occur when + * coercing and rethrow them. + */ + if (jsexpr->on_error->coerce || + IsA(jsexpr->on_error->expr, CoerceViaIO) || + IsA(jsexpr->on_error->expr, CoerceToDomain)) + { + scratch->opcode = EEOP_JSONEXPR_COERCION_FINISH; + scratch->resvalue = resv; + scratch->resnull = resnull; + scratch->d.jsonexpr.jsestate = jsestate; + ExprEvalPushStep(state, scratch); + } + + /* JUMP to end to skip the ON EMPTY steps added below. */ + jumps_to_end = lappend_int(jumps_to_end, state->steps_len); + scratch->opcode = EEOP_JUMP; + scratch->d.jump.jumpdone = -1; + ExprEvalPushStep(state, scratch); + } + + /* + * Step to check jsestate->empty and return the ON EMPTY expression if + * there is one. + * + * See the comment above for details on the optimization for NULL-valued + * expressions. + */ + if (jsexpr->on_empty != NULL && + jsexpr->on_empty->btype != JSON_BEHAVIOR_ERROR && + (!(IsA(jsexpr->on_empty->expr, Const) && + ((Const *) jsexpr->on_empty->expr)->constisnull) || + returning_domain)) + { + ErrorSaveContext *saved_escontext; + + jsestate->jump_empty = state->steps_len; + + /* JUMP to end if false, that is, skip the ON EMPTY expression. */ + jumps_to_end = lappend_int(jumps_to_end, state->steps_len); + scratch->opcode = EEOP_JUMP_IF_NOT_TRUE; + scratch->resvalue = &jsestate->empty.value; + scratch->resnull = &jsestate->empty.isnull; + scratch->d.jump.jumpdone = -1; /* set below */ + ExprEvalPushStep(state, scratch); + + /* + * Steps to evaluate the ON EMPTY expression; handle errors softly to + * rethrow them in COERCION_FINISH step that will be added later. + */ + saved_escontext = state->escontext; + state->escontext = escontext; + ExecInitExprRec((Expr *) jsexpr->on_empty->expr, + state, resv, resnull); + state->escontext = saved_escontext; + + /* Step to coerce the ON EMPTY expression if needed */ + if (jsexpr->on_empty->coerce) + ExecInitJsonCoercion(state, jsexpr->returning, escontext, + jsexpr->omit_quotes, false, + resv, resnull); + + /* + * Add a COERCION_FINISH step to check for errors that may occur when + * coercing and rethrow them. + */ + if (jsexpr->on_empty->coerce || + IsA(jsexpr->on_empty->expr, CoerceViaIO) || + IsA(jsexpr->on_empty->expr, CoerceToDomain)) + { + + scratch->opcode = EEOP_JSONEXPR_COERCION_FINISH; + scratch->resvalue = resv; + scratch->resnull = resnull; + scratch->d.jsonexpr.jsestate = jsestate; + ExprEvalPushStep(state, scratch); + } + } + + foreach(lc, jumps_to_end) + { + ExprEvalStep *as = &state->steps[lfirst_int(lc)]; + + as->d.jump.jumpdone = state->steps_len; + } + + jsestate->jump_end = state->steps_len; +} + +/* + * Initialize a EEOP_JSONEXPR_COERCION step to coerce the value given in resv + * to the given RETURNING type. + */ +static void +ExecInitJsonCoercion(ExprState *state, JsonReturning *returning, + ErrorSaveContext *escontext, bool omit_quotes, + bool exists_coerce, + Datum *resv, bool *resnull) +{ + ExprEvalStep scratch = {0}; + + /* For json_populate_type() */ + scratch.opcode = EEOP_JSONEXPR_COERCION; + scratch.resvalue = resv; + scratch.resnull = resnull; + scratch.d.jsonexpr_coercion.targettype = returning->typid; + scratch.d.jsonexpr_coercion.targettypmod = returning->typmod; + scratch.d.jsonexpr_coercion.json_coercion_cache = NULL; + scratch.d.jsonexpr_coercion.escontext = escontext; + scratch.d.jsonexpr_coercion.omit_quotes = omit_quotes; + scratch.d.jsonexpr_coercion.exists_coerce = exists_coerce; + scratch.d.jsonexpr_coercion.exists_cast_to_int = exists_coerce && + getBaseType(returning->typid) == INT4OID; + scratch.d.jsonexpr_coercion.exists_check_domain = exists_coerce && + DomainHasConstraints(returning->typid); + ExprEvalPushStep(state, &scratch); +} diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index 851946a9272a5..a55ad77256629 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -46,7 +46,7 @@ * exported rather than being "static" in this file.) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -63,8 +63,8 @@ #include "executor/nodeSubplan.h" #include "funcapi.h" #include "miscadmin.h" +#include "nodes/miscnodes.h" #include "nodes/nodeFuncs.h" -#include "parser/parsetree.h" #include "pgstat.h" #include "utils/array.h" #include "utils/builtins.h" @@ -72,8 +72,8 @@ #include "utils/datum.h" #include "utils/expandedrecord.h" #include "utils/json.h" -#include "utils/jsonb.h" #include "utils/jsonfuncs.h" +#include "utils/jsonpath.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/timestamp.h" @@ -180,6 +180,7 @@ static pg_attribute_always_inline void ExecAggPlainTransByRef(AggState *aggstate AggStatePerGroup pergroup, ExprContext *aggcontext, int setno); +static char *ExecGetJsonValueItemString(JsonbValue *item, bool *resnull); /* * ScalarArrayOpExprHashEntry @@ -452,6 +453,7 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) &&CASE_EEOP_CASE_TESTVAL, &&CASE_EEOP_MAKE_READONLY, &&CASE_EEOP_IOCOERCE, + &&CASE_EEOP_IOCOERCE_SAFE, &&CASE_EEOP_DISTINCT, &&CASE_EEOP_NOT_DISTINCT, &&CASE_EEOP_NULLIF, @@ -480,9 +482,13 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) &&CASE_EEOP_XMLEXPR, &&CASE_EEOP_JSON_CONSTRUCTOR, &&CASE_EEOP_IS_JSON, + &&CASE_EEOP_JSONEXPR_PATH, + &&CASE_EEOP_JSONEXPR_COERCION, + &&CASE_EEOP_JSONEXPR_COERCION_FINISH, &&CASE_EEOP_AGGREF, &&CASE_EEOP_GROUPING_FUNC, &&CASE_EEOP_WINDOW_FUNC, + &&CASE_EEOP_MERGE_SUPPORT_FUNC, &&CASE_EEOP_SUBPLAN, &&CASE_EEOP_AGG_STRICT_DESERIALIZE, &&CASE_EEOP_AGG_DESERIALIZE, @@ -1150,6 +1156,9 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) * Evaluate a CoerceViaIO node. This can be quite a hot path, so * inline as much work as possible. The source value is in our * result variable. + * + * Also look at ExecEvalCoerceViaIOSafe() if you change anything + * here. */ char *str; @@ -1205,6 +1214,12 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) EEO_NEXT(); } + EEO_CASE(EEOP_IOCOERCE_SAFE) + { + ExecEvalCoerceViaIOSafe(state, op); + EEO_NEXT(); + } + EEO_CASE(EEOP_DISTINCT) { /* @@ -1280,12 +1295,24 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) * The arguments are already evaluated into fcinfo->args. */ FunctionCallInfo fcinfo = op->d.func.fcinfo_data; + Datum save_arg0 = fcinfo->args[0].value; /* if either argument is NULL they can't be equal */ if (!fcinfo->args[0].isnull && !fcinfo->args[1].isnull) { Datum result; + /* + * If first argument is of varlena type, it might be an + * expanded datum. We need to ensure that the value passed to + * the comparison function is a read-only pointer. However, + * if we end by returning the first argument, that will be the + * original read-write pointer if it was read-write. + */ + if (op->d.func.make_ro) + fcinfo->args[0].value = + MakeExpandedObjectReadOnlyInternal(save_arg0); + fcinfo->isnull = false; result = op->d.func.fn_addr(fcinfo); @@ -1300,7 +1327,7 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) } /* Arguments aren't equal, so return the first one */ - *op->resvalue = fcinfo->args[0].value; + *op->resvalue = save_arg0; *op->resnull = fcinfo->args[0].isnull; EEO_NEXT(); @@ -1543,6 +1570,28 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) EEO_NEXT(); } + EEO_CASE(EEOP_JSONEXPR_PATH) + { + /* too complex for an inline implementation */ + EEO_JUMP(ExecEvalJsonExprPath(state, op, econtext)); + } + + EEO_CASE(EEOP_JSONEXPR_COERCION) + { + /* too complex for an inline implementation */ + ExecEvalJsonCoercion(state, op, econtext); + + EEO_NEXT(); + } + + EEO_CASE(EEOP_JSONEXPR_COERCION_FINISH) + { + /* too complex for an inline implementation */ + ExecEvalJsonCoercionFinish(state, op); + + EEO_NEXT(); + } + EEO_CASE(EEOP_AGGREF) { /* @@ -1582,6 +1631,14 @@ ExecInterpExpr(ExprState *state, ExprContext *econtext, bool *isnull) EEO_NEXT(); } + EEO_CASE(EEOP_MERGE_SUPPORT_FUNC) + { + /* too complex/uncommon for an inline implementation */ + ExecEvalMergeSupportFunc(state, op, econtext); + + EEO_NEXT(); + } + EEO_CASE(EEOP_SUBPLAN) { /* too complex for an inline implementation */ @@ -2510,6 +2567,71 @@ ExecEvalParamExtern(ExprState *state, ExprEvalStep *op, ExprContext *econtext) errmsg("no value found for parameter %d", paramId))); } +/* + * Evaluate a CoerceViaIO node in soft-error mode. + * + * The source value is in op's result variable. + * + * Note: This implements EEOP_IOCOERCE_SAFE. If you change anything here, + * also look at the inline code for EEOP_IOCOERCE. + */ +void +ExecEvalCoerceViaIOSafe(ExprState *state, ExprEvalStep *op) +{ + char *str; + + /* call output function (similar to OutputFunctionCall) */ + if (*op->resnull) + { + /* output functions are not called on nulls */ + str = NULL; + } + else + { + FunctionCallInfo fcinfo_out; + + fcinfo_out = op->d.iocoerce.fcinfo_data_out; + fcinfo_out->args[0].value = *op->resvalue; + fcinfo_out->args[0].isnull = false; + + fcinfo_out->isnull = false; + str = DatumGetCString(FunctionCallInvoke(fcinfo_out)); + + /* OutputFunctionCall assumes result isn't null */ + Assert(!fcinfo_out->isnull); + } + + /* call input function (similar to InputFunctionCallSafe) */ + if (!op->d.iocoerce.finfo_in->fn_strict || str != NULL) + { + FunctionCallInfo fcinfo_in; + + fcinfo_in = op->d.iocoerce.fcinfo_data_in; + fcinfo_in->args[0].value = PointerGetDatum(str); + fcinfo_in->args[0].isnull = *op->resnull; + /* second and third arguments are already set up */ + + /* ErrorSaveContext must be present. */ + Assert(IsA(fcinfo_in->context, ErrorSaveContext)); + + fcinfo_in->isnull = false; + *op->resvalue = FunctionCallInvoke(fcinfo_in); + + if (SOFT_ERROR_OCCURRED(fcinfo_in->context)) + { + *op->resnull = true; + *op->resvalue = (Datum) 0; + return; + } + + /* Should get null result if and only if str is NULL */ + if (str == NULL) + Assert(*op->resnull); + else + Assert(!*op->resnull); + } +} + /* * Evaluate a SQLValueFunction expression. */ @@ -3730,7 +3852,7 @@ void ExecEvalConstraintNotNull(ExprState *state, ExprEvalStep *op) { if (*op->resnull) - ereport(ERROR, + errsave((Node *) op->d.domaincheck.escontext, (errcode(ERRCODE_NOT_NULL_VIOLATION), errmsg("domain %s does not allow null values", format_type_be(op->d.domaincheck.resulttype)), @@ -3745,7 +3867,7 @@ ExecEvalConstraintCheck(ExprState *state, ExprEvalStep *op) { if (!*op->d.domaincheck.checknull && !DatumGetBool(*op->d.domaincheck.checkvalue)) - ereport(ERROR, + errsave((Node *) op->d.domaincheck.escontext, (errcode(ERRCODE_CHECK_VIOLATION), errmsg("value for domain %s violates check constraint \"%s\"", format_type_be(op->d.domaincheck.resulttype), @@ -4002,6 +4124,47 @@ ExecEvalJsonConstructor(ExprState *state, ExprEvalStep *op, jcstate->arg_types, jcstate->constructor->absent_on_null, jcstate->constructor->unique); + else if (ctor->type == JSCTOR_JSON_SCALAR) + { + if (jcstate->arg_nulls[0]) + { + res = (Datum) 0; + isnull = true; + } + else + { + Datum value = jcstate->arg_values[0]; + Oid outfuncid = jcstate->arg_type_cache[0].outfuncid; + JsonTypeCategory category = (JsonTypeCategory) + jcstate->arg_type_cache[0].category; + + if (is_jsonb) + res = datum_to_jsonb(value, category, outfuncid); + else + res = datum_to_json(value, category, outfuncid); + } + } + else if (ctor->type == JSCTOR_JSON_PARSE) + { + if (jcstate->arg_nulls[0]) + { + res = (Datum) 0; + isnull = true; + } + else + { + Datum value = jcstate->arg_values[0]; + text *js = DatumGetTextP(value); + + if (is_jsonb) + res = jsonb_from_text(js, true); + else + { + (void) json_validate(js, true, true); + res = value; + } + } + } else elog(ERROR, "invalid JsonConstructorExpr type %d", ctor->type); @@ -4097,6 +4260,422 @@ ExecEvalJsonIsPredicate(ExprState *state, ExprEvalStep *op) *op->resvalue = BoolGetDatum(res); } +/* + * Evaluate a jsonpath against a document, both of which must have been + * evaluated and their values saved in op->d.jsonexpr.jsestate. + * + * If an error occurs during JsonPath* evaluation or when coercing its result + * to the RETURNING type, JsonExprState.error is set to true, provided the + * ON ERROR behavior is not ERROR. Similarly, if JsonPath{Query|Value}() found + * no matching items, JsonExprState.empty is set to true, provided the ON EMPTY + * behavior is not ERROR. That is to signal to the subsequent steps that check + * those flags to return the ON ERROR / ON EMPTY expression. + * + * Return value is the step address to be performed next. It will be one of + * jump_error, jump_empty, jump_eval_coercion, or jump_end, all given in + * op->d.jsonexpr.jsestate. + */ +int +ExecEvalJsonExprPath(ExprState *state, ExprEvalStep *op, + ExprContext *econtext) +{ + JsonExprState *jsestate = op->d.jsonexpr.jsestate; + JsonExpr *jsexpr = jsestate->jsexpr; + Datum item; + JsonPath *path; + bool throw_error = jsexpr->on_error->btype == JSON_BEHAVIOR_ERROR; + bool error = false, + empty = false; + int jump_eval_coercion = jsestate->jump_eval_coercion; + char *val_string = NULL; + + item = jsestate->formatted_expr.value; + path = DatumGetJsonPathP(jsestate->pathspec.value); + + /* Set error/empty to false. */ + memset(&jsestate->error, 0, sizeof(NullableDatum)); + memset(&jsestate->empty, 0, sizeof(NullableDatum)); + + /* Also reset ErrorSaveContext contents for the next row. */ + if (jsestate->escontext.details_wanted) + { + jsestate->escontext.error_data = NULL; + jsestate->escontext.details_wanted = false; + } + jsestate->escontext.error_occurred = false; + + switch (jsexpr->op) + { + case JSON_EXISTS_OP: + { + bool exists = JsonPathExists(item, path, + !throw_error ? &error : NULL, + jsestate->args); + + if (!error) + { + *op->resnull = false; + *op->resvalue = BoolGetDatum(exists); + } + } + break; + + case JSON_QUERY_OP: + *op->resvalue = JsonPathQuery(item, path, jsexpr->wrapper, &empty, + !throw_error ? &error : NULL, + jsestate->args, + jsexpr->column_name); + + *op->resnull = (DatumGetPointer(*op->resvalue) == NULL); + break; + + case JSON_VALUE_OP: + { + JsonbValue *jbv = JsonPathValue(item, path, &empty, + !throw_error ? &error : NULL, + jsestate->args, + jsexpr->column_name); + + if (jbv == NULL) + { + /* Will be coerced with json_populate_type(), if needed. */ + *op->resvalue = (Datum) 0; + *op->resnull = true; + } + else if (!error && !empty) + { + if (jsexpr->returning->typid == JSONOID || + jsexpr->returning->typid == JSONBOID) + { + val_string = DatumGetCString(DirectFunctionCall1(jsonb_out, + JsonbPGetDatum(JsonbValueToJsonb(jbv)))); + } + else if (jsexpr->use_json_coercion) + { + *op->resvalue = JsonbPGetDatum(JsonbValueToJsonb(jbv)); + *op->resnull = false; + } + else + { + val_string = ExecGetJsonValueItemString(jbv, op->resnull); + + /* + * Simply convert to the default RETURNING type (text) + * if no coercion needed. + */ + if (!jsexpr->use_io_coercion) + *op->resvalue = DirectFunctionCall1(textin, + CStringGetDatum(val_string)); + } + } + break; + } + + /* JSON_TABLE_OP can't happen here */ + + default: + elog(ERROR, "unrecognized SQL/JSON expression op %d", + (int) jsexpr->op); + return false; + } + + /* + * Coerce the result value to the RETURNING type by calling its input + * function. + */ + if (!*op->resnull && jsexpr->use_io_coercion) + { + FunctionCallInfo fcinfo; + + Assert(jump_eval_coercion == -1); + fcinfo = jsestate->input_fcinfo; + Assert(fcinfo != NULL); + Assert(val_string != NULL); + fcinfo->args[0].value = PointerGetDatum(val_string); + fcinfo->args[0].isnull = *op->resnull; + + /* + * Second and third arguments are already set up in + * ExecInitJsonExpr(). + */ + + fcinfo->isnull = false; + *op->resvalue = FunctionCallInvoke(fcinfo); + if (SOFT_ERROR_OCCURRED(&jsestate->escontext)) + error = true; + } + + /* + * When setting up the ErrorSaveContext (if needed) for capturing the + * errors that occur when coercing the JsonBehavior expression, set + * details_wanted to be able to show the actual error message as the + * DETAIL of the error message that tells that it is the JsonBehavior + * expression that caused the error; see ExecEvalJsonCoercionFinish(). + */ + + /* Handle ON EMPTY. */ + if (empty) + { + *op->resvalue = (Datum) 0; + *op->resnull = true; + if (jsexpr->on_empty) + { + if (jsexpr->on_empty->btype != JSON_BEHAVIOR_ERROR) + { + jsestate->empty.value = BoolGetDatum(true); + /* Set up to catch coercion errors of the ON EMPTY value. */ + jsestate->escontext.error_occurred = false; + jsestate->escontext.details_wanted = true; + /* Jump to end if the ON EMPTY behavior is to return NULL */ + return jsestate->jump_empty >= 0 ? jsestate->jump_empty : jsestate->jump_end; + } + } + else if (jsexpr->on_error->btype != JSON_BEHAVIOR_ERROR) + { + jsestate->error.value = BoolGetDatum(true); + /* Set up to catch coercion errors of the ON ERROR value. */ + jsestate->escontext.error_occurred = false; + jsestate->escontext.details_wanted = true; + Assert(!throw_error); + /* Jump to end if the ON ERROR behavior is to return NULL */ + return jsestate->jump_error >= 0 ? jsestate->jump_error : jsestate->jump_end; + } + + if (jsexpr->column_name) + ereport(ERROR, + errcode(ERRCODE_NO_SQL_JSON_ITEM), + errmsg("no SQL/JSON item found for specified path of column \"%s\"", + jsexpr->column_name)); + else + ereport(ERROR, + errcode(ERRCODE_NO_SQL_JSON_ITEM), + errmsg("no SQL/JSON item found for specified path")); + } + + /* + * ON ERROR. Wouldn't get here if the behavior is ERROR, because they + * would have already been thrown. + */ + if (error) + { + Assert(!throw_error); + *op->resvalue = (Datum) 0; + *op->resnull = true; + jsestate->error.value = BoolGetDatum(true); + /* Set up to catch coercion errors of the ON ERROR value. */ + jsestate->escontext.error_occurred = false; + jsestate->escontext.details_wanted = true; + /* Jump to end if the ON ERROR behavior is to return NULL */ + return jsestate->jump_error >= 0 ? jsestate->jump_error : jsestate->jump_end; + } + + return jump_eval_coercion >= 0 ? jump_eval_coercion : jsestate->jump_end; +} + +/* + * Convert the given JsonbValue to its C string representation + * + * *resnull is set if the JsonbValue is a jbvNull. + */ +static char * +ExecGetJsonValueItemString(JsonbValue *item, bool *resnull) +{ + *resnull = false; + + /* get coercion state reference and datum of the corresponding SQL type */ + switch (item->type) + { + case jbvNull: + *resnull = true; + return NULL; + + case jbvString: + { + char *str = palloc(item->val.string.len + 1); + + memcpy(str, item->val.string.val, item->val.string.len); + str[item->val.string.len] = '\0'; + return str; + } + + case jbvNumeric: + return DatumGetCString(DirectFunctionCall1(numeric_out, + NumericGetDatum(item->val.numeric))); + + case jbvBool: + return DatumGetCString(DirectFunctionCall1(boolout, + BoolGetDatum(item->val.boolean))); + + case jbvDatetime: + switch (item->val.datetime.typid) + { + case DATEOID: + return DatumGetCString(DirectFunctionCall1(date_out, + item->val.datetime.value)); + case TIMEOID: + return DatumGetCString(DirectFunctionCall1(time_out, + item->val.datetime.value)); + case TIMETZOID: + return DatumGetCString(DirectFunctionCall1(timetz_out, + item->val.datetime.value)); + case TIMESTAMPOID: + return DatumGetCString(DirectFunctionCall1(timestamp_out, + item->val.datetime.value)); + case TIMESTAMPTZOID: + return DatumGetCString(DirectFunctionCall1(timestamptz_out, + item->val.datetime.value)); + default: + elog(ERROR, "unexpected jsonb datetime type oid %u", + item->val.datetime.typid); + } + break; + + case jbvArray: + case jbvObject: + case jbvBinary: + return DatumGetCString(DirectFunctionCall1(jsonb_out, + JsonbPGetDatum(JsonbValueToJsonb(item)))); + + default: + elog(ERROR, "unexpected jsonb value type %d", item->type); + } + + Assert(false); + *resnull = true; + return NULL; +} + +/* + * Coerce a jsonb value produced by ExecEvalJsonExprPath() or an ON ERROR / + * ON EMPTY behavior expression to the target type. + * + * Any soft errors that occur here will be checked by + * EEOP_JSONEXPR_COERCION_FINISH that will run after this. + */ +void +ExecEvalJsonCoercion(ExprState *state, ExprEvalStep *op, + ExprContext *econtext) +{ + ErrorSaveContext *escontext = op->d.jsonexpr_coercion.escontext; + + /* + * Prepare to call json_populate_type() to coerce the boolean result of + * JSON_EXISTS_OP to the target type. If the the target type is integer + * or a domain over integer, call the boolean-to-integer cast function + * instead, because the integer's input function (which is what + * json_populate_type() calls to coerce to scalar target types) doesn't + * accept boolean literals as valid input. We only have a special case + * for integer and domains thereof as it seems common to use those types + * for EXISTS columns in JSON_TABLE(). + */ + if (op->d.jsonexpr_coercion.exists_coerce) + { + if (op->d.jsonexpr_coercion.exists_cast_to_int) + { + /* Check domain constraints if any. */ + if (op->d.jsonexpr_coercion.exists_check_domain && + !domain_check_safe(*op->resvalue, *op->resnull, + op->d.jsonexpr_coercion.targettype, + &op->d.jsonexpr_coercion.json_coercion_cache, + econtext->ecxt_per_query_memory, + (Node *) escontext)) + { + *op->resnull = true; + *op->resvalue = (Datum) 0; + } + else + *op->resvalue = DirectFunctionCall1(bool_int4, *op->resvalue); + return; + } + + *op->resvalue = DirectFunctionCall1(jsonb_in, + DatumGetBool(*op->resvalue) ? + CStringGetDatum("true") : + CStringGetDatum("false")); + } + + *op->resvalue = json_populate_type(*op->resvalue, JSONBOID, + op->d.jsonexpr_coercion.targettype, + op->d.jsonexpr_coercion.targettypmod, + &op->d.jsonexpr_coercion.json_coercion_cache, + econtext->ecxt_per_query_memory, + op->resnull, + op->d.jsonexpr_coercion.omit_quotes, + (Node *) escontext); +} + +static char * +GetJsonBehaviorValueString(JsonBehavior *behavior) +{ + /* + * The order of array elements must correspond to the order of + * JsonBehaviorType members. + */ + const char *behavior_names[] = + { + "NULL", + "ERROR", + "EMPTY", + "TRUE", + "FALSE", + "UNKNOWN", + "EMPTY ARRAY", + "EMPTY OBJECT", + "DEFAULT" + }; + + return pstrdup(behavior_names[behavior->btype]); +} + +/* + * Checks if an error occurred in ExecEvalJsonCoercion(). If so, this sets + * JsonExprState.error to trigger the ON ERROR handling steps, unless the + * error is thrown when coercing a JsonBehavior value. + */ +void +ExecEvalJsonCoercionFinish(ExprState *state, ExprEvalStep *op) +{ + JsonExprState *jsestate = op->d.jsonexpr.jsestate; + + if (SOFT_ERROR_OCCURRED(&jsestate->escontext)) + { + /* + * jsestate->error or jsetate->empty being set means that the error + * occurred when coercing the JsonBehavior value. Throw the error in + * that case with the actual coercion error message shown in the + * DETAIL part. + */ + if (DatumGetBool(jsestate->error.value)) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + /*- translator: first %s is a SQL/JSON clause (e.g. ON ERROR) */ + errmsg("could not coerce %s expression (%s) to the RETURNING type", + "ON ERROR", + GetJsonBehaviorValueString(jsestate->jsexpr->on_error)), + errdetail("%s", jsestate->escontext.error_data->message))); + else if (DatumGetBool(jsestate->empty.value)) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + /*- translator: first %s is a SQL/JSON clause (e.g. ON ERROR) */ + errmsg("could not coerce %s expression (%s) to the RETURNING type", + "ON EMPTY", + GetJsonBehaviorValueString(jsestate->jsexpr->on_empty)), + errdetail("%s", jsestate->escontext.error_data->message))); + + *op->resvalue = (Datum) 0; + *op->resnull = true; + + jsestate->error.value = BoolGetDatum(true); + + /* + * Reset for next use such as for catching errors when coercing a + * JsonBehavior expression. + */ + jsestate->escontext.error_occurred = false; + jsestate->escontext.error_occurred = false; + jsestate->escontext.details_wanted = true; + } +} /* * ExecEvalGroupingFunc @@ -4129,6 +4708,45 @@ ExecEvalGroupingFunc(ExprState *state, ExprEvalStep *op) *op->resnull = false; } +/* + * ExecEvalMergeSupportFunc + * + * Returns information about the current MERGE action for its RETURNING list. + */ +void +ExecEvalMergeSupportFunc(ExprState *state, ExprEvalStep *op, + ExprContext *econtext) +{ + ModifyTableState *mtstate = castNode(ModifyTableState, state->parent); + MergeActionState *relaction = mtstate->mt_merge_action; + + if (!relaction) + elog(ERROR, "no merge action in progress"); + + /* Return the MERGE action ("INSERT", "UPDATE", or "DELETE") */ + switch (relaction->mas_action->commandType) + { + case CMD_INSERT: + *op->resvalue = PointerGetDatum(cstring_to_text_with_len("INSERT", 6)); + *op->resnull = false; + break; + case CMD_UPDATE: + *op->resvalue = PointerGetDatum(cstring_to_text_with_len("UPDATE", 6)); + *op->resnull = false; + break; + case CMD_DELETE: + *op->resvalue = PointerGetDatum(cstring_to_text_with_len("DELETE", 6)); + *op->resnull = false; + break; + case CMD_NOTHING: + elog(ERROR, "unexpected merge action: DO NOTHING"); + break; + default: + elog(ERROR, "unrecognized commandType: %d", + (int) relaction->mas_action->commandType); + } +} + /* * Hand off evaluation of a subplan to nodeSubplan.c */ @@ -4538,12 +5156,16 @@ ExecEvalPreOrderedDistinctSingle(AggState *aggstate, AggStatePerTrans pertrans) /* * ExecEvalPreOrderedDistinctMulti * Returns true when the aggregate input is distinct from the previous - * input and returns false when the input matches the previous input. + * input and returns false when the input matches the previous input, or + * when there was no previous input. */ bool ExecEvalPreOrderedDistinctMulti(AggState *aggstate, AggStatePerTrans pertrans) { ExprContext *tmpcontext = aggstate->tmpcontext; + bool isdistinct = false; /* for now */ + TupleTableSlot *save_outer; + TupleTableSlot *save_inner; for (int i = 0; i < pertrans->numTransInputs; i++) { @@ -4555,6 +5177,10 @@ ExecEvalPreOrderedDistinctMulti(AggState *aggstate, AggStatePerTrans pertrans) pertrans->sortslot->tts_nvalid = pertrans->numInputs; ExecStoreVirtualTuple(pertrans->sortslot); + /* save the previous slots before we overwrite them */ + save_outer = tmpcontext->ecxt_outertuple; + save_inner = tmpcontext->ecxt_innertuple; + tmpcontext->ecxt_outertuple = pertrans->sortslot; tmpcontext->ecxt_innertuple = pertrans->uniqslot; @@ -4566,9 +5192,15 @@ ExecEvalPreOrderedDistinctMulti(AggState *aggstate, AggStatePerTrans pertrans) pertrans->haslast = true; ExecCopySlot(pertrans->uniqslot, pertrans->sortslot); - return true; + + isdistinct = true; } - return false; + + /* restore the original slots */ + tmpcontext->ecxt_outertuple = save_outer; + tmpcontext->ecxt_innertuple = save_inner; + + return isdistinct; } /* diff --git a/src/backend/executor/execGrouping.c b/src/backend/executor/execGrouping.c index bc9f9b142ae17..7f6d7703b4c6a 100644 --- a/src/backend/executor/execGrouping.c +++ b/src/backend/executor/execGrouping.c @@ -3,7 +3,7 @@ * execGrouping.c * executor utility routines for grouping, hashing, and aggregation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,7 +19,6 @@ #include "executor/executor.h" #include "miscadmin.h" #include "utils/lsyscache.h" -#include "utils/memutils.h" static int TupleHashTableMatch(struct tuplehash_hash *tb, const MinimalTuple tuple1, const MinimalTuple tuple2); static inline uint32 TupleHashTableHash_internal(struct tuplehash_hash *tb, @@ -225,9 +224,8 @@ BuildTupleHashTableExt(PlanState *parent, allow_jit = metacxt != tablecxt; /* build comparator for all columns */ - /* XXX: should we support non-minimal tuples for the inputslot? */ hashtable->tab_eq_func = ExecBuildGroupingEqual(inputDesc, inputDesc, - &TTSOpsMinimalTuple, &TTSOpsMinimalTuple, + NULL, &TTSOpsMinimalTuple, numCols, keyColIdx, eqfuncoids, collations, allow_jit ? parent : NULL); diff --git a/src/backend/executor/execIndexing.c b/src/backend/executor/execIndexing.c index 1d82b64b89784..9f05b3654c186 100644 --- a/src/backend/executor/execIndexing.c +++ b/src/backend/executor/execIndexing.c @@ -95,7 +95,7 @@ * with the higher XID backs out. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -121,21 +121,21 @@ typedef enum { CEOUC_WAIT, CEOUC_NOWAIT, - CEOUC_LIVELOCK_PREVENTING_WAIT + CEOUC_LIVELOCK_PREVENTING_WAIT, } CEOUC_WAIT_MODE; static bool check_exclusion_or_unique_constraint(Relation heap, Relation index, IndexInfo *indexInfo, ItemPointer tupleid, - Datum *values, bool *isnull, + const Datum *values, const bool *isnull, EState *estate, bool newIndex, CEOUC_WAIT_MODE waitMode, bool violationOK, ItemPointer conflictTid); -static bool index_recheck_constraint(Relation index, Oid *constr_procs, - Datum *existing_values, bool *existing_isnull, - Datum *new_values); +static bool index_recheck_constraint(Relation index, const Oid *constr_procs, + const Datum *existing_values, const bool *existing_isnull, + const Datum *new_values); static bool index_unchanged_by_update(ResultRelInfo *resultRelInfo, EState *estate, IndexInfo *indexInfo, Relation indexRelation); @@ -233,15 +233,20 @@ ExecCloseIndices(ResultRelInfo *resultRelInfo) int i; int numIndices; RelationPtr indexDescs; + IndexInfo **indexInfos; numIndices = resultRelInfo->ri_NumIndices; indexDescs = resultRelInfo->ri_IndexRelationDescs; + indexInfos = resultRelInfo->ri_IndexRelationInfo; for (i = 0; i < numIndices; i++) { if (indexDescs[i] == NULL) continue; /* shouldn't happen? */ + /* Give the index a chance to do some post-insert cleanup */ + index_insert_cleanup(indexDescs[i], indexInfos[i]); + /* Drop lock acquired by ExecOpenIndices */ index_close(indexDescs[i], RowExclusiveLock); } @@ -684,7 +689,7 @@ static bool check_exclusion_or_unique_constraint(Relation heap, Relation index, IndexInfo *indexInfo, ItemPointer tupleid, - Datum *values, bool *isnull, + const Datum *values, const bool *isnull, EState *estate, bool newIndex, CEOUC_WAIT_MODE waitMode, bool violationOK, @@ -910,7 +915,7 @@ void check_exclusion_constraint(Relation heap, Relation index, IndexInfo *indexInfo, ItemPointer tupleid, - Datum *values, bool *isnull, + const Datum *values, const bool *isnull, EState *estate, bool newIndex) { (void) check_exclusion_or_unique_constraint(heap, index, indexInfo, tupleid, @@ -924,9 +929,9 @@ check_exclusion_constraint(Relation heap, Relation index, * exclusion condition against the new_values. Returns true if conflict. */ static bool -index_recheck_constraint(Relation index, Oid *constr_procs, - Datum *existing_values, bool *existing_isnull, - Datum *new_values) +index_recheck_constraint(Relation index, const Oid *constr_procs, + const Datum *existing_values, const bool *existing_isnull, + const Datum *new_values) { int indnkeyatts = IndexRelationGetNumberOfKeyAttributes(index); int i; diff --git a/src/backend/executor/execJunk.c b/src/backend/executor/execJunk.c index 81840ebf20af7..b962c3138345f 100644 --- a/src/backend/executor/execJunk.c +++ b/src/backend/executor/execJunk.c @@ -3,7 +3,7 @@ * execJunk.c * Junk attribute support stuff.... * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 4c5a7bbf620a9..8048b810e51e5 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -26,7 +26,7 @@ * before ExecutorEnd. This can be omitted only in case of EXPLAIN, * which should also omit ExecutorRun. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -37,35 +37,27 @@ */ #include "postgres.h" -#include "access/heapam.h" -#include "access/htup_details.h" #include "access/sysattr.h" +#include "access/table.h" #include "access/tableam.h" -#include "access/transam.h" #include "access/xact.h" #include "catalog/namespace.h" #include "catalog/partition.h" -#include "catalog/pg_publication.h" #include "commands/matview.h" #include "commands/trigger.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeSubplan.h" #include "foreign/fdwapi.h" -#include "jit/jit.h" #include "mb/pg_wchar.h" #include "miscadmin.h" #include "parser/parse_relation.h" -#include "parser/parsetree.h" -#include "storage/bufmgr.h" -#include "storage/lmgr.h" +#include "rewrite/rewriteHandler.h" #include "tcop/utility.h" #include "utils/acl.h" #include "utils/backend_status.h" #include "utils/lsyscache.h" -#include "utils/memutils.h" #include "utils/partcache.h" #include "utils/rls.h" -#include "utils/ruleutils.h" #include "utils/snapmgr.h" @@ -83,14 +75,12 @@ static void InitPlan(QueryDesc *queryDesc, int eflags); static void CheckValidRowMarkRel(Relation rel, RowMarkType markType); static void ExecPostprocessPlan(EState *estate); static void ExecEndPlan(PlanState *planstate, EState *estate); -static void ExecutePlan(EState *estate, PlanState *planstate, - bool use_parallel_mode, +static void ExecutePlan(QueryDesc *queryDesc, CmdType operation, bool sendTuples, uint64 numberTuples, ScanDirection direction, - DestReceiver *dest, - bool execute_once); + DestReceiver *dest); static bool ExecCheckOneRelPerms(RTEPermissionInfo *perminfo); static bool ExecCheckPermissionsModified(Oid relOid, Oid userid, Bitmapset *modifiedCols, @@ -132,10 +122,12 @@ void ExecutorStart(QueryDesc *queryDesc, int eflags) { /* - * In some cases (e.g. an EXECUTE statement) a query execution will skip - * parse analysis, which means that the query_id won't be reported. Note - * that it's harmless to report the query_id multiple times, as the call - * will be ignored if the top level query_id has already been reported. + * In some cases (e.g. an EXECUTE statement or an execute message with the + * extended query protocol) the query_id won't be reported, so do it now. + * + * Note that it's harmless to report the query_id multiple times, as the + * call will be ignored if the top level query_id has already been + * reported. */ pgstat_report_query_id(queryDesc->plannedstmt->queryId, false); @@ -155,6 +147,9 @@ standard_ExecutorStart(QueryDesc *queryDesc, int eflags) Assert(queryDesc != NULL); Assert(queryDesc->estate == NULL); + /* caller must ensure the query's snapshot is active */ + Assert(GetActiveSnapshot() == queryDesc->snapshot); + /* * If the transaction is read-only, we need to check if any writes are * planned to non-temporary tables. EXPLAIN is considered read-only. @@ -286,6 +281,9 @@ standard_ExecutorStart(QueryDesc *queryDesc, int eflags) * retrieved tuples, not for instance to those inserted/updated/deleted * by a ModifyTable plan node. * + * execute_once is ignored, and is present only to avoid an API break + * in stable branches. + * * There is no return value, but output tuples (if any) are sent to * the destination receiver specified in the QueryDesc; and the number * of tuples processed at the top level can be found in @@ -327,6 +325,9 @@ standard_ExecutorRun(QueryDesc *queryDesc, Assert(estate != NULL); Assert(!(estate->es_top_eflags & EXEC_FLAG_EXPLAIN_ONLY)); + /* caller must ensure the query's snapshot is active */ + Assert(GetActiveSnapshot() == estate->es_snapshot); + /* * Switch into per-query memory context */ @@ -357,21 +358,12 @@ standard_ExecutorRun(QueryDesc *queryDesc, * run plan */ if (!ScanDirectionIsNoMovement(direction)) - { - if (execute_once && queryDesc->already_executed) - elog(ERROR, "can't re-execute query flagged for single execution"); - queryDesc->already_executed = true; - - ExecutePlan(estate, - queryDesc->planstate, - queryDesc->plannedstmt->parallelModeNeeded, + ExecutePlan(queryDesc, operation, sendTuples, count, direction, - dest, - execute_once); - } + dest); /* * Update es_total_processed to keep track of the number of tuples @@ -1017,16 +1009,24 @@ InitPlan(QueryDesc *queryDesc, int eflags) * Generally the parser and/or planner should have noticed any such mistake * already, but let's make sure. * + * For MERGE, mergeActions is the list of actions that may be performed. The + * result relation is required to support every action, regardless of whether + * or not they are all executed. + * * Note: when changing this function, you probably also need to look at * CheckValidRowMarkRel. */ void -CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation) +CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation, + List *mergeActions) { Relation resultRel = resultRelInfo->ri_RelationDesc; - TriggerDesc *trigDesc = resultRel->trigdesc; FdwRoutine *fdwroutine; + /* Expect a fully-formed ResultRelInfo from InitResultRelInfo(). */ + Assert(resultRelInfo->ri_needLockTagTuple == + IsInplaceUpdateRelation(resultRel)); + switch (resultRel->rd_rel->relkind) { case RELKIND_RELATION: @@ -1048,42 +1048,14 @@ CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation) case RELKIND_VIEW: /* - * Okay only if there's a suitable INSTEAD OF trigger. Messages - * here should match rewriteHandler.c's rewriteTargetView and - * RewriteQuery, except that we omit errdetail because we haven't - * got the information handy (and given that we really shouldn't - * get here anyway, it's not worth great exertion to get). + * Okay only if there's a suitable INSTEAD OF trigger. Otherwise, + * complain, but omit errdetail because we haven't got the + * information handy (and given that it really shouldn't happen, + * it's not worth great exertion to get). */ - switch (operation) - { - case CMD_INSERT: - if (!trigDesc || !trigDesc->trig_insert_instead_row) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("cannot insert into view \"%s\"", - RelationGetRelationName(resultRel)), - errhint("To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule."))); - break; - case CMD_UPDATE: - if (!trigDesc || !trigDesc->trig_update_instead_row) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("cannot update view \"%s\"", - RelationGetRelationName(resultRel)), - errhint("To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule."))); - break; - case CMD_DELETE: - if (!trigDesc || !trigDesc->trig_delete_instead_row) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("cannot delete from view \"%s\"", - RelationGetRelationName(resultRel)), - errhint("To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule."))); - break; - default: - elog(ERROR, "unrecognized CmdType: %d", (int) operation); - break; - } + if (!view_has_instead_trigger(resultRel, operation, mergeActions)) + error_view_not_updatable(resultRel, operation, mergeActions, + NULL); break; case RELKIND_MATVIEW: if (!MatViewIncrementalMaintenanceIsEnabled()) @@ -1235,6 +1207,8 @@ InitResultRelInfo(ResultRelInfo *resultRelInfo, resultRelInfo->ri_NumIndices = 0; resultRelInfo->ri_IndexRelationDescs = NULL; resultRelInfo->ri_IndexRelationInfo = NULL; + resultRelInfo->ri_needLockTagTuple = + IsInplaceUpdateRelation(resultRelationDesc); /* make a copy so as not to depend on relcache info not changing... */ resultRelInfo->ri_TrigDesc = CopyTriggerDesc(resultRelationDesc->trigdesc); if (resultRelInfo->ri_TrigDesc) @@ -1277,8 +1251,10 @@ InitResultRelInfo(ResultRelInfo *resultRelInfo, resultRelInfo->ri_ReturningSlot = NULL; resultRelInfo->ri_TrigOldSlot = NULL; resultRelInfo->ri_TrigNewSlot = NULL; - resultRelInfo->ri_matchedMergeAction = NIL; - resultRelInfo->ri_notMatchedMergeAction = NIL; + resultRelInfo->ri_MergeActions[MERGE_WHEN_MATCHED] = NIL; + resultRelInfo->ri_MergeActions[MERGE_WHEN_NOT_MATCHED_BY_SOURCE] = NIL; + resultRelInfo->ri_MergeActions[MERGE_WHEN_NOT_MATCHED_BY_TARGET] = NIL; + resultRelInfo->ri_MergeJoinCondition = NULL; /* * Only ExecInitPartitionInfo() and ExecInitPartitionDispatchInfo() pass @@ -1616,22 +1592,19 @@ ExecCloseRangeTableRelations(EState *estate) * moving in the specified direction. * * Runs to completion if numberTuples is 0 - * - * Note: the ctid attribute is a 'junk' attribute that is removed before the - * user can see it * ---------------------------------------------------------------- */ static void -ExecutePlan(EState *estate, - PlanState *planstate, - bool use_parallel_mode, +ExecutePlan(QueryDesc *queryDesc, CmdType operation, bool sendTuples, uint64 numberTuples, ScanDirection direction, - DestReceiver *dest, - bool execute_once) + DestReceiver *dest) { + EState *estate = queryDesc->estate; + PlanState *planstate = queryDesc->planstate; + bool use_parallel_mode; TupleTableSlot *slot; uint64 current_tuple_count; @@ -1646,11 +1619,17 @@ ExecutePlan(EState *estate, estate->es_direction = direction; /* - * If the plan might potentially be executed multiple times, we must force - * it to run without parallelism, because we might exit early. + * Set up parallel mode if appropriate. + * + * Parallel mode only supports complete execution of a plan. If we've + * already partially executed it, or if the caller asks us to exit early, + * we must force the plan to run without parallelism. */ - if (!execute_once) + if (queryDesc->already_executed || numberTuples != 0) use_parallel_mode = false; + else + use_parallel_mode = queryDesc->plannedstmt->parallelModeNeeded; + queryDesc->already_executed = true; estate->es_use_parallel_mode = use_parallel_mode; if (use_parallel_mode) @@ -1849,7 +1828,7 @@ ExecPartitionCheck(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, econtext->ecxt_scantuple = slot; /* - * As in case of the catalogued constraints, we treat a NULL result as + * As in case of the cataloged constraints, we treat a NULL result as * success here, not a failure. */ success = ExecCheck(resultRelInfo->ri_PartitionCheckExpr, econtext); @@ -2650,13 +2629,15 @@ bool EvalPlanQualFetchRowMark(EPQState *epqstate, Index rti, TupleTableSlot *slot) { ExecAuxRowMark *earm = epqstate->relsubs_rowmark[rti - 1]; - ExecRowMark *erm = earm->rowmark; + ExecRowMark *erm; Datum datum; bool isNull; Assert(earm != NULL); Assert(epqstate->origslot != NULL); + erm = earm->rowmark; + if (RowMarkRequiresRowShareLock(erm->markType)) elog(ERROR, "EvalPlanQual doesn't support locking rowmarks"); diff --git a/src/backend/executor/execParallel.c b/src/backend/executor/execParallel.c index cc2b8ccab70d4..8c53d1834e9f8 100644 --- a/src/backend/executor/execParallel.c +++ b/src/backend/executor/execParallel.c @@ -3,7 +3,7 @@ * execParallel.c * Support routines for parallel execution. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * This file contains routines that are intended to support setting up, @@ -43,12 +43,10 @@ #include "jit/jit.h" #include "nodes/nodeFuncs.h" #include "pgstat.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/datum.h" #include "utils/dsa.h" #include "utils/lsyscache.h" -#include "utils/memutils.h" #include "utils/snapmgr.h" /* @@ -722,6 +720,13 @@ ExecInitParallelPlan(PlanState *planstate, EState *estate, shm_toc_estimate_chunk(&pcxt->estimator, dsa_minsize); shm_toc_estimate_keys(&pcxt->estimator, 1); + /* + * InitializeParallelDSM() passes the active snapshot to the parallel + * worker, which uses it to set es_snapshot. Make sure we don't set + * es_snapshot differently in the child. + */ + Assert(GetActiveSnapshot() == estate->es_snapshot); + /* Everyone's had a chance to ask for space, so now create the DSM. */ InitializeParallelDSM(pcxt); diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c index eb8a87fd632d3..a3602b816871e 100644 --- a/src/backend/executor/execPartition.c +++ b/src/backend/executor/execPartition.c @@ -3,7 +3,7 @@ * execPartition.c * Support routines for partitioning. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -16,15 +16,12 @@ #include "access/table.h" #include "access/tableam.h" #include "catalog/partition.h" -#include "catalog/pg_inherits.h" -#include "catalog/pg_type.h" #include "executor/execPartition.h" #include "executor/executor.h" #include "executor/nodeModifyTable.h" #include "foreign/fdwapi.h" #include "mb/pg_wchar.h" #include "miscadmin.h" -#include "nodes/makefuncs.h" #include "partitioning/partbounds.h" #include "partitioning/partdesc.h" #include "partitioning/partprune.h" @@ -361,7 +358,7 @@ ExecFindPartition(ModifyTableState *mtstate, if (rri) { /* Verify this ResultRelInfo allows INSERTs */ - CheckValidResultRel(rri, CMD_INSERT); + CheckValidResultRel(rri, CMD_INSERT, NIL); /* * Initialize information needed to insert this and @@ -527,7 +524,7 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, * partition-key becomes a DELETE+INSERT operation, so this check is still * required when the operation is CMD_UPDATE. */ - CheckValidResultRel(leaf_part_rri, CMD_INSERT); + CheckValidResultRel(leaf_part_rri, CMD_INSERT, NIL); /* * Open partition indices. The user may have asked to check for conflicts @@ -612,8 +609,8 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, * Build the RETURNING projection for the partition. Note that we didn't * build the returningList for partitions within the planner, but simple * translation of varattnos will suffice. This only occurs for the INSERT - * case or in the case of UPDATE tuple routing where we didn't find a - * result rel to reuse. + * case or in the case of UPDATE/MERGE tuple routing where we didn't find + * a result rel to reuse. */ if (node && node->returningLists != NIL) { @@ -622,11 +619,13 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, List *returningList; /* See the comment above for WCO lists. */ - /* (except no RETURNING support for MERGE yet) */ Assert((node->operation == CMD_INSERT && list_length(node->returningLists) == 1 && list_length(node->resultRelations) == 1) || (node->operation == CMD_UPDATE && + list_length(node->returningLists) == + list_length(node->resultRelations)) || + (node->operation == CMD_MERGE && list_length(node->returningLists) == list_length(node->resultRelations))); @@ -873,7 +872,7 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, * reference and make copy for this relation, converting stuff that * references attribute numbers to match this relation's. * - * This duplicates much of the logic in ExecInitMerge(), so something + * This duplicates much of the logic in ExecInitMerge(), so if something * changes there, look here too. */ if (node && node->operation == CMD_MERGE) @@ -881,6 +880,7 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, List *firstMergeActionList = linitial(node->mergeActionLists); ListCell *lc; ExprContext *econtext = mtstate->ps.ps_ExprContext; + Node *joinCondition; if (part_attmap == NULL) part_attmap = @@ -891,23 +891,31 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, if (unlikely(!leaf_part_rri->ri_projectNewInfoValid)) ExecInitMergeTupleSlots(mtstate, leaf_part_rri); + /* Initialize state for join condition checking. */ + joinCondition = + map_variable_attnos(linitial(node->mergeJoinConditions), + firstVarno, 0, + part_attmap, + RelationGetForm(partrel)->reltype, + &found_whole_row); + /* We ignore the value of found_whole_row. */ + leaf_part_rri->ri_MergeJoinCondition = + ExecInitQual((List *) joinCondition, &mtstate->ps); + foreach(lc, firstMergeActionList) { /* Make a copy for this relation to be safe. */ MergeAction *action = copyObject(lfirst(lc)); MergeActionState *action_state; - List **list; /* Generate the action's state for this relation */ action_state = makeNode(MergeActionState); action_state->mas_action = action; /* And put the action in the appropriate list */ - if (action->matched) - list = &leaf_part_rri->ri_matchedMergeAction; - else - list = &leaf_part_rri->ri_notMatchedMergeAction; - *list = lappend(*list, action_state); + leaf_part_rri->ri_MergeActions[action->matchKind] = + lappend(leaf_part_rri->ri_MergeActions[action->matchKind], + action_state); switch (action->commandType) { @@ -944,6 +952,8 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, NULL); break; case CMD_DELETE: + case CMD_NOTHING: + /* Nothing to do */ break; default: @@ -1863,7 +1873,7 @@ CreatePartitionPruneState(PlanState *planstate, PartitionPruneInfo *pruneinfo) int i; ExprContext *econtext = planstate->ps_ExprContext; - /* For data reading, executor always omits detached partitions */ + /* For data reading, executor always includes detached partitions */ if (estate->es_partition_directory == NULL) estate->es_partition_directory = CreatePartitionDirectory(estate->es_query_cxt, false); @@ -1934,37 +1944,31 @@ CreatePartitionPruneState(PlanState *planstate, PartitionPruneInfo *pruneinfo) /* * Initialize the subplan_map and subpart_map. * - * Because we request detached partitions to be included, and - * detaching waits for old transactions, it is safe to assume that - * no partitions have disappeared since this query was planned. + * The set of partitions that exist now might not be the same that + * existed when the plan was made. The normal case is that it is; + * optimize for that case with a quick comparison, and just copy + * the subplan_map and make subpart_map point to the one in + * PruneInfo. * - * However, new partitions may have been added. + * For the case where they aren't identical, we could have more + * partitions on either side; or even exactly the same number of + * them on both but the set of OIDs doesn't match fully. Handle + * this by creating new subplan_map and subpart_map arrays that + * corresponds to the ones in the PruneInfo where the new + * partition descriptor's OIDs match. Any that don't match can be + * set to -1, as if they were pruned. By construction, both + * arrays are in partition bounds order. */ - Assert(partdesc->nparts >= pinfo->nparts); pprune->nparts = partdesc->nparts; pprune->subplan_map = palloc(sizeof(int) * partdesc->nparts); - if (partdesc->nparts == pinfo->nparts) + + if (partdesc->nparts == pinfo->nparts && + memcmp(partdesc->oids, pinfo->relid_map, + sizeof(int) * partdesc->nparts) == 0) { - /* - * There are no new partitions, so this is simple. We can - * simply point to the subpart_map from the plan, but we must - * copy the subplan_map since we may change it later. - */ pprune->subpart_map = pinfo->subpart_map; memcpy(pprune->subplan_map, pinfo->subplan_map, sizeof(int) * pinfo->nparts); - - /* - * Double-check that the list of unpruned relations has not - * changed. (Pruned partitions are not in relid_map[].) - */ -#ifdef USE_ASSERT_CHECKING - for (int k = 0; k < pinfo->nparts; k++) - { - Assert(partdesc->oids[k] == pinfo->relid_map[k] || - pinfo->subplan_map[k] == -1); - } -#endif } else { @@ -1972,22 +1976,18 @@ CreatePartitionPruneState(PlanState *planstate, PartitionPruneInfo *pruneinfo) int pp_idx; /* - * Some new partitions have appeared since plan time, and - * those are reflected in our PartitionDesc but were not - * present in the one used to construct subplan_map and - * subpart_map. So we must construct new and longer arrays - * where the partitions that were originally present map to - * the same sub-structures, and any added partitions map to - * -1, as if the new partitions had been pruned. + * When the partition arrays are not identical, there could be + * some new ones but it's also possible that one was removed; + * we cope with both situations by walking the arrays and + * discarding those that don't match. * - * Note: pinfo->relid_map[] may contain InvalidOid entries for - * partitions pruned by the planner. We cannot tell exactly - * which of the partdesc entries these correspond to, but we - * don't have to; just skip over them. The non-pruned - * relid_map entries, however, had better be a subset of the - * partdesc entries and in the same order. + * If the number of partitions on both sides match, it's still + * possible that one partition has been detached and another + * attached. Cope with that by creating a map that skips any + * mismatches. */ pprune->subpart_map = palloc(sizeof(int) * partdesc->nparts); + for (pp_idx = 0; pp_idx < partdesc->nparts; pp_idx++) { /* Skip any InvalidOid relid_map entries */ @@ -1995,6 +1995,7 @@ CreatePartitionPruneState(PlanState *planstate, PartitionPruneInfo *pruneinfo) !OidIsValid(pinfo->relid_map[pd_idx])) pd_idx++; + recheck: if (pd_idx < pinfo->nparts && pinfo->relid_map[pd_idx] == partdesc->oids[pp_idx]) { @@ -2004,24 +2005,43 @@ CreatePartitionPruneState(PlanState *planstate, PartitionPruneInfo *pruneinfo) pprune->subpart_map[pp_idx] = pinfo->subpart_map[pd_idx]; pd_idx++; + continue; } - else + + /* + * There isn't an exact match in the corresponding + * positions of both arrays. Peek ahead in + * pinfo->relid_map to see if we have a match for the + * current partition in partdesc. Normally if a match + * exists it's just one element ahead, and it means the + * planner saw one extra partition that we no longer see + * now (its concurrent detach finished just in between); + * so we skip that one by updating pd_idx to the new + * location and jumping above. We can then continue to + * match the rest of the elements after skipping the OID + * with no match; no future matches are tried for the + * element that was skipped, because we know the arrays to + * be in the same order. + * + * If we don't see a match anywhere in the rest of the + * pinfo->relid_map array, that means we see an element + * now that the planner didn't see, so mark that one as + * pruned and move on. + */ + for (int pd_idx2 = pd_idx + 1; pd_idx2 < pinfo->nparts; pd_idx2++) { - /* this partdesc entry is not in the plan */ - pprune->subplan_map[pp_idx] = -1; - pprune->subpart_map[pp_idx] = -1; + if (pd_idx2 >= pinfo->nparts) + break; + if (pinfo->relid_map[pd_idx2] == partdesc->oids[pp_idx]) + { + pd_idx = pd_idx2; + goto recheck; + } } - } - /* - * It might seem that we need to skip any trailing InvalidOid - * entries in pinfo->relid_map before checking that we scanned - * all of the relid_map. But we will have skipped them above, - * because they must correspond to some partdesc->oids - * entries; we just couldn't tell which. - */ - if (pd_idx != pinfo->nparts) - elog(ERROR, "could not match partition child tables to plan elements"); + pprune->subpart_map[pp_idx] = -1; + pprune->subplan_map[pp_idx] = -1; + } } /* present_parts is also subject to later modification */ @@ -2108,7 +2128,7 @@ InitPartitionPruneContext(PartitionPruneContext *context, foreach(lc, pruning_steps) { PartitionPruneStepOp *step = (PartitionPruneStepOp *) lfirst(lc); - ListCell *lc2; + ListCell *lc2 = list_head(step->exprs); int keyno; /* not needed for other step kinds */ @@ -2117,34 +2137,39 @@ InitPartitionPruneContext(PartitionPruneContext *context, Assert(list_length(step->exprs) <= partnatts); - keyno = 0; - foreach(lc2, step->exprs) + for (keyno = 0; keyno < partnatts; keyno++) { - Expr *expr = (Expr *) lfirst(lc2); + if (bms_is_member(keyno, step->nullkeys)) + continue; - /* not needed for Consts */ - if (!IsA(expr, Const)) + if (lc2 != NULL) { - int stateidx = PruneCxtStateIdx(partnatts, - step->step.step_id, - keyno); + Expr *expr = lfirst(lc2); - /* - * When planstate is NULL, pruning_steps is known not to - * contain any expressions that depend on the parent plan. - * Information of any available EXTERN parameters must be - * passed explicitly in that case, which the caller must have - * made available via econtext. - */ - if (planstate == NULL) - context->exprstates[stateidx] = - ExecInitExprWithParams(expr, - econtext->ecxt_param_list_info); - else - context->exprstates[stateidx] = - ExecInitExpr(expr, context->planstate); + /* not needed for Consts */ + if (!IsA(expr, Const)) + { + int stateidx = PruneCxtStateIdx(partnatts, + step->step.step_id, + keyno); + + /* + * When planstate is NULL, pruning_steps is known not to + * contain any expressions that depend on the parent plan. + * Information of any available EXTERN parameters must be + * passed explicitly in that case, which the caller must + * have made available via econtext. + */ + if (planstate == NULL) + context->exprstates[stateidx] = + ExecInitExprWithParams(expr, + econtext->ecxt_param_list_info); + else + context->exprstates[stateidx] = + ExecInitExpr(expr, context->planstate); + } + lc2 = lnext(step->exprs, lc2); } - keyno++; } } } diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c index 4d288bc8d41f5..6e48062f56a7a 100644 --- a/src/backend/executor/execProcnode.c +++ b/src/backend/executor/execProcnode.c @@ -7,7 +7,7 @@ * ExecProcNode, or ExecEndNode on its subnodes and do the appropriate * processing. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -667,22 +667,10 @@ ExecEndNode(PlanState *node) ExecEndTableFuncScan((TableFuncScanState *) node); break; - case T_ValuesScanState: - ExecEndValuesScan((ValuesScanState *) node); - break; - case T_CteScanState: ExecEndCteScan((CteScanState *) node); break; - case T_NamedTuplestoreScanState: - ExecEndNamedTuplestoreScan((NamedTuplestoreScanState *) node); - break; - - case T_WorkTableScanState: - ExecEndWorkTableScan((WorkTableScanState *) node); - break; - case T_ForeignScanState: ExecEndForeignScan((ForeignScanState *) node); break; @@ -757,6 +745,12 @@ ExecEndNode(PlanState *node) ExecEndLimit((LimitState *) node); break; + /* No clean up actions for these nodes. */ + case T_ValuesScanState: + case T_NamedTuplestoreScanState: + case T_WorkTableScanState: + break; + default: elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); break; diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c index 9dd716846157b..cb1202e450678 100644 --- a/src/backend/executor/execReplication.c +++ b/src/backend/executor/execReplication.c @@ -3,7 +3,7 @@ * execReplication.c * miscellaneous executor routines for logical replication * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -19,19 +19,14 @@ #include "access/tableam.h" #include "access/transam.h" #include "access/xact.h" +#include "catalog/pg_am_d.h" #include "commands/trigger.h" #include "executor/executor.h" #include "executor/nodeModifyTable.h" -#include "nodes/nodeFuncs.h" -#include "parser/parse_relation.h" -#include "parser/parsetree.h" #include "replication/logicalrelation.h" -#include "storage/bufmgr.h" #include "storage/lmgr.h" #include "utils/builtins.h" -#include "utils/datum.h" #include "utils/lsyscache.h" -#include "utils/memutils.h" #include "utils/rel.h" #include "utils/snapmgr.h" #include "utils/syscache.h" @@ -41,15 +36,58 @@ static bool tuples_equal(TupleTableSlot *slot1, TupleTableSlot *slot2, TypeCacheEntry **eq); +/* + * Returns the fixed strategy number, if any, of the equality operator for the + * given index access method, otherwise, InvalidStrategy. + * + * Currently, only Btree and Hash indexes are supported. The other index access + * methods don't have a fixed strategy for equality operation - instead, the + * support routines of each operator class interpret the strategy numbers + * according to the operator class's definition. + */ +StrategyNumber +get_equal_strategy_number_for_am(Oid am) +{ + int ret; + + switch (am) + { + case BTREE_AM_OID: + ret = BTEqualStrategyNumber; + break; + case HASH_AM_OID: + ret = HTEqualStrategyNumber; + break; + default: + /* XXX: Only Btree and Hash indexes are supported */ + ret = InvalidStrategy; + break; + } + + return ret; +} + +/* + * Return the appropriate strategy number which corresponds to the equality + * operator. + */ +static StrategyNumber +get_equal_strategy_number(Oid opclass) +{ + Oid am = get_opclass_method(opclass); + + return get_equal_strategy_number_for_am(am); +} + /* * Setup a ScanKey for a search in the relation 'rel' for a tuple 'key' that * is setup to match 'rel' (*NOT* idxrel!). * * Returns how many columns to use for the index scan. * - * This is not generic routine, it expects the idxrel to be a btree, non-partial - * and have at least one column reference (i.e. cannot consist of only - * expressions). + * This is not generic routine, idxrel must be PK, RI, or an index that can be + * used for REPLICA IDENTITY FULL table. See FindUsableIndexForReplicaIdentityFull() + * for details. * * By definition, replication identity of a rel meets all limitations associated * with that. Note that any other index could also meet these limitations. @@ -77,6 +115,7 @@ build_replindex_scan_key(ScanKey skey, Relation rel, Relation idxrel, Oid opfamily; RegProcedure regop; int table_attno = indkey->values[index_attoff]; + StrategyNumber eq_strategy; if (!AttributeNumberIsValid(table_attno)) { @@ -93,20 +132,22 @@ build_replindex_scan_key(ScanKey skey, Relation rel, Relation idxrel, */ optype = get_opclass_input_type(opclass->values[index_attoff]); opfamily = get_opclass_family(opclass->values[index_attoff]); + eq_strategy = get_equal_strategy_number(opclass->values[index_attoff]); operator = get_opfamily_member(opfamily, optype, optype, - BTEqualStrategyNumber); + eq_strategy); + if (!OidIsValid(operator)) elog(ERROR, "missing operator %d(%u,%u) in opfamily %u", - BTEqualStrategyNumber, optype, optype, opfamily); + eq_strategy, optype, optype, opfamily); regop = get_opcode(operator); /* Initialize the scankey. */ ScanKeyInit(&skey[skey_attoff], index_attoff + 1, - BTEqualStrategyNumber, + eq_strategy, regop, searchslot->tts_values[table_attno - 1]); @@ -175,16 +216,7 @@ RelationFindReplTupleByIndex(Relation rel, Oid idxoid, if (!isIdxSafeToSkipDuplicates) { if (eq == NULL) - { -#ifdef USE_ASSERT_CHECKING - /* apply assertions only once for the input idxoid */ - IndexInfo *indexInfo = BuildIndexInfo(idxrel); - - Assert(IsIndexUsableForReplicaIdentityFull(indexInfo)); -#endif - eq = palloc0(sizeof(*eq) * outslot->tts_tupleDescriptor->natts); - } if (!tuples_equal(outslot, searchslot, eq)) continue; @@ -218,7 +250,7 @@ RelationFindReplTupleByIndex(Relation rel, Oid idxoid, PushActiveSnapshot(GetLatestSnapshot()); - res = table_tuple_lock(rel, &(outslot->tts_tid), GetLatestSnapshot(), + res = table_tuple_lock(rel, &(outslot->tts_tid), GetActiveSnapshot(), outslot, GetCurrentCommandId(false), lockmode, @@ -402,7 +434,7 @@ RelationFindReplTupleSeq(Relation rel, LockTupleMode lockmode, PushActiveSnapshot(GetLatestSnapshot()); - res = table_tuple_lock(rel, &(outslot->tts_tid), GetLatestSnapshot(), + res = table_tuple_lock(rel, &(outslot->tts_tid), GetActiveSnapshot(), outslot, GetCurrentCommandId(false), lockmode, @@ -527,8 +559,12 @@ ExecSimpleRelationUpdate(ResultRelInfo *resultRelInfo, Relation rel = resultRelInfo->ri_RelationDesc; ItemPointer tid = &(searchslot->tts_tid); - /* For now we support only tables. */ + /* + * We support only non-system tables, with + * check_publication_add_relation() accountable. + */ Assert(rel->rd_rel->relkind == RELKIND_RELATION); + Assert(!IsCatalogRelation(rel)); CheckCmdReplicaIdentity(rel, CMD_UPDATE); diff --git a/src/backend/executor/execSRF.c b/src/backend/executor/execSRF.c index 73bf9152a4b87..862d3085f8328 100644 --- a/src/backend/executor/execSRF.c +++ b/src/backend/executor/execSRF.c @@ -7,7 +7,7 @@ * common code for calling set-returning functions according to the * ReturnSetInfo API. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -21,7 +21,6 @@ #include "access/htup_details.h" #include "catalog/objectaccess.h" #include "catalog/pg_proc.h" -#include "executor/execdebug.h" #include "funcapi.h" #include "miscadmin.h" #include "nodes/nodeFuncs.h" diff --git a/src/backend/executor/execScan.c b/src/backend/executor/execScan.c index a47c8f5f71287..f52e28c58e9a2 100644 --- a/src/backend/executor/execScan.c +++ b/src/backend/executor/execScan.c @@ -7,7 +7,7 @@ * stuff - checking the qualification and projecting the tuple * appropriately. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -20,7 +20,6 @@ #include "executor/executor.h" #include "miscadmin.h" -#include "utils/memutils.h" diff --git a/src/backend/executor/execTuples.c b/src/backend/executor/execTuples.c index fda20ec3183eb..00dc3396156c5 100644 --- a/src/backend/executor/execTuples.c +++ b/src/backend/executor/execTuples.c @@ -46,7 +46,7 @@ * to avoid physically constructing projection tuples in many cases. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -60,6 +60,7 @@ #include "access/heaptoast.h" #include "access/htup_details.h" #include "access/tupdesc_details.h" +#include "access/xact.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "nodes/nodeFuncs.h" @@ -148,6 +149,22 @@ tts_virtual_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull) return 0; /* silence compiler warnings */ } +/* + * VirtualTupleTableSlots never have storage tuples. We generally + * shouldn't get here, but provide a user-friendly message if we do. + */ +static bool +tts_virtual_is_current_xact_tuple(TupleTableSlot *slot) +{ + Assert(!TTS_EMPTY(slot)); + + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("don't have transaction information for this type of tuple"))); + + return false; /* silence compiler warnings */ +} + /* * To materialize a virtual slot all the datums that aren't passed by value * have to be copied into the slot's memory context. To do so, compute the @@ -253,8 +270,6 @@ tts_virtual_copyslot(TupleTableSlot *dstslot, TupleTableSlot *srcslot) { TupleDesc srcdesc = srcslot->tts_tupleDescriptor; - Assert(srcdesc->natts <= dstslot->tts_tupleDescriptor->natts); - tts_virtual_clear(dstslot); slot_getallattrs(srcslot); @@ -356,6 +371,29 @@ tts_heap_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull) slot->tts_tupleDescriptor, isnull); } +static bool +tts_heap_is_current_xact_tuple(TupleTableSlot *slot) +{ + HeapTupleTableSlot *hslot = (HeapTupleTableSlot *) slot; + TransactionId xmin; + + Assert(!TTS_EMPTY(slot)); + + /* + * In some code paths it's possible to get here with a non-materialized + * slot, in which case we can't check if tuple is created by the current + * transaction. + */ + if (!hslot->tuple) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("don't have a storage tuple in this context"))); + + xmin = HeapTupleHeaderGetRawXmin(hslot->tuple->t_data); + + return TransactionIdIsCurrentTransactionId(xmin); +} + static void tts_heap_materialize(TupleTableSlot *slot) { @@ -511,6 +549,10 @@ tts_minimal_getsomeattrs(TupleTableSlot *slot, int natts) slot_deform_heap_tuple(slot, mslot->tuple, &mslot->off, natts); } +/* + * MinimalTupleTableSlots never provide system attributes. We generally + * shouldn't get here, but provide a user-friendly message if we do. + */ static Datum tts_minimal_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull) { @@ -523,6 +565,23 @@ tts_minimal_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull) return 0; /* silence compiler warnings */ } +/* + * Within MinimalTuple abstraction transaction information is unavailable. + * We generally shouldn't get here, but provide a user-friendly message if + * we do. + */ +static bool +tts_minimal_is_current_xact_tuple(TupleTableSlot *slot) +{ + Assert(!TTS_EMPTY(slot)); + + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("don't have transaction information for this type of tuple"))); + + return false; /* silence compiler warnings */ +} + static void tts_minimal_materialize(TupleTableSlot *slot) { @@ -716,6 +775,29 @@ tts_buffer_heap_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull) slot->tts_tupleDescriptor, isnull); } +static bool +tts_buffer_is_current_xact_tuple(TupleTableSlot *slot) +{ + BufferHeapTupleTableSlot *bslot = (BufferHeapTupleTableSlot *) slot; + TransactionId xmin; + + Assert(!TTS_EMPTY(slot)); + + /* + * In some code paths it's possible to get here with a non-materialized + * slot, in which case we can't check if tuple is created by the current + * transaction. + */ + if (!bslot->base.tuple) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("don't have a storage tuple in this context"))); + + xmin = HeapTupleHeaderGetRawXmin(bslot->base.tuple->t_data); + + return TransactionIdIsCurrentTransactionId(xmin); +} + static void tts_buffer_heap_materialize(TupleTableSlot *slot) { @@ -1031,6 +1113,7 @@ const TupleTableSlotOps TTSOpsVirtual = { .getsomeattrs = tts_virtual_getsomeattrs, .getsysattr = tts_virtual_getsysattr, .materialize = tts_virtual_materialize, + .is_current_xact_tuple = tts_virtual_is_current_xact_tuple, .copyslot = tts_virtual_copyslot, /* @@ -1050,6 +1133,7 @@ const TupleTableSlotOps TTSOpsHeapTuple = { .clear = tts_heap_clear, .getsomeattrs = tts_heap_getsomeattrs, .getsysattr = tts_heap_getsysattr, + .is_current_xact_tuple = tts_heap_is_current_xact_tuple, .materialize = tts_heap_materialize, .copyslot = tts_heap_copyslot, .get_heap_tuple = tts_heap_get_heap_tuple, @@ -1067,6 +1151,7 @@ const TupleTableSlotOps TTSOpsMinimalTuple = { .clear = tts_minimal_clear, .getsomeattrs = tts_minimal_getsomeattrs, .getsysattr = tts_minimal_getsysattr, + .is_current_xact_tuple = tts_minimal_is_current_xact_tuple, .materialize = tts_minimal_materialize, .copyslot = tts_minimal_copyslot, @@ -1084,6 +1169,7 @@ const TupleTableSlotOps TTSOpsBufferHeapTuple = { .clear = tts_buffer_heap_clear, .getsomeattrs = tts_buffer_heap_getsomeattrs, .getsysattr = tts_buffer_heap_getsysattr, + .is_current_xact_tuple = tts_buffer_is_current_xact_tuple, .materialize = tts_buffer_heap_materialize, .copyslot = tts_buffer_heap_copyslot, .get_heap_tuple = tts_buffer_heap_get_heap_tuple, @@ -2273,7 +2359,7 @@ begin_tup_output_tupdesc(DestReceiver *dest, * write a single tuple */ void -do_tup_output(TupOutputState *tstate, Datum *values, bool *isnull) +do_tup_output(TupOutputState *tstate, const Datum *values, const bool *isnull) { TupleTableSlot *slot = tstate->slot; int natts = slot->tts_tupleDescriptor->natts; diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index c06b228858335..d8dd36685c534 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -3,7 +3,7 @@ * execUtils.c * miscellaneous executor utility routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -46,18 +46,13 @@ #include "postgres.h" #include "access/parallel.h" -#include "access/relscan.h" #include "access/table.h" #include "access/tableam.h" -#include "access/transam.h" #include "executor/executor.h" -#include "executor/execPartition.h" #include "executor/nodeModifyTable.h" #include "jit/jit.h" #include "mb/pg_wchar.h" #include "miscadmin.h" -#include "nodes/nodeFuncs.h" -#include "parser/parsetree.h" #include "parser/parse_relation.h" #include "partitioning/partdesc.h" #include "storage/lmgr.h" @@ -638,32 +633,6 @@ tlist_matches_tupdesc(PlanState *ps, List *tlist, int varno, TupleDesc tupdesc) return true; } -/* ---------------- - * ExecFreeExprContext - * - * A plan node's ExprContext should be freed explicitly during executor - * shutdown because there may be shutdown callbacks to call. (Other resources - * made by the above routines, such as projection info, don't need to be freed - * explicitly because they're just memory in the per-query memory context.) - * - * However ... there is no particular need to do it during ExecEndNode, - * because FreeExecutorState will free any remaining ExprContexts within - * the EState. Letting FreeExecutorState do it allows the ExprContexts to - * be freed in reverse order of creation, rather than order of creation as - * will happen if we delete them here, which saves O(N^2) work in the list - * cleanup inside FreeExprContext. - * ---------------- - */ -void -ExecFreeExprContext(PlanState *planstate) -{ - /* - * Per above discussion, don't actually delete the ExprContext. We do - * unlink it from the plan node, though. - */ - planstate->ps_ExprContext = NULL; -} - /* ---------------------------------------------------------------- * Scan node support @@ -787,7 +756,7 @@ ExecInitRangeTable(EState *estate, List *rangeTable, List *permInfos) * ExecGetRangeTableRelation * Open the Relation for a range table entry, if not already done * - * The Relations will be closed again in ExecEndPlan(). + * The Relations will be closed in ExecEndPlan(). */ Relation ExecGetRangeTableRelation(EState *estate, Index rti) diff --git a/src/backend/executor/functions.c b/src/backend/executor/functions.c index f55424eb5ad8a..39880663307b0 100644 --- a/src/backend/executor/functions.c +++ b/src/backend/executor/functions.c @@ -3,7 +3,7 @@ * functions.c * Execution of SQL-language functions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -59,7 +59,7 @@ typedef struct */ typedef enum { - F_EXEC_START, F_EXEC_RUN, F_EXEC_DONE + F_EXEC_START, F_EXEC_RUN, F_EXEC_DONE, } ExecStatus; typedef struct execution_state @@ -492,6 +492,7 @@ init_execution_state(List *queryTree_list, stmt->utilityStmt = queryTree->utilityStmt; stmt->stmt_location = queryTree->stmt_location; stmt->stmt_len = queryTree->stmt_len; + stmt->queryId = queryTree->queryId; } else stmt = pg_plan_query(queryTree, @@ -746,6 +747,7 @@ init_sql_fcache(FunctionCallInfo fcinfo, Oid collation, bool lazyEvalOK) fcache->returnsTuple = check_sql_fn_retval(queryTree_list, rettype, rettupdesc, + procedureStruct->prokind, false, &resulttlist); @@ -799,7 +801,7 @@ init_sql_fcache(FunctionCallInfo fcinfo, Oid collation, bool lazyEvalOK) lazyEvalOK); /* Mark fcache with time of creation to show it's valid */ - fcache->lxid = MyProc->lxid; + fcache->lxid = MyProc->vxid.lxid; fcache->subxid = GetCurrentSubTransactionId(); ReleaseSysCache(procedureTuple); @@ -1081,7 +1083,7 @@ fmgr_sql(PG_FUNCTION_ARGS) if (fcache != NULL) { - if (fcache->lxid != MyProc->lxid || + if (fcache->lxid != MyProc->vxid.lxid || !SubTransactionIsActive(fcache->subxid)) { /* It's stale; unlink and delete */ @@ -1606,6 +1608,7 @@ check_sql_fn_statements(List *queryTreeLists) bool check_sql_fn_retval(List *queryTreeLists, Oid rettype, TupleDesc rettupdesc, + char prokind, bool insertDroppedCols, List **resultTargetList) { @@ -1625,7 +1628,7 @@ check_sql_fn_retval(List *queryTreeLists, /* * If it's declared to return VOID, we don't care what's in the function. - * (This takes care of the procedure case, as well.) + * (This takes care of procedures with no output parameters, as well.) */ if (rettype == VOIDOID) return false; @@ -1660,8 +1663,8 @@ check_sql_fn_retval(List *queryTreeLists, /* * If it's a plain SELECT, it returns whatever the targetlist says. - * Otherwise, if it's INSERT/UPDATE/DELETE with RETURNING, it returns - * that. Otherwise, the function return type must be VOID. + * Otherwise, if it's INSERT/UPDATE/DELETE/MERGE with RETURNING, it + * returns that. Otherwise, the function return type must be VOID. * * Note: eventually replace this test with QueryReturnsTuples? We'd need * a more general method of determining the output type, though. Also, it @@ -1679,7 +1682,8 @@ check_sql_fn_retval(List *queryTreeLists, else if (parse && (parse->commandType == CMD_INSERT || parse->commandType == CMD_UPDATE || - parse->commandType == CMD_DELETE) && + parse->commandType == CMD_DELETE || + parse->commandType == CMD_MERGE) && parse->returningList) { tlist = parse->returningList; @@ -1693,7 +1697,7 @@ check_sql_fn_retval(List *queryTreeLists, (errcode(ERRCODE_INVALID_FUNCTION_DEFINITION), errmsg("return type mismatch in function declared to return %s", format_type_be(rettype)), - errdetail("Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING."))); + errdetail("Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE RETURNING."))); return false; /* keep compiler quiet */ } @@ -1780,8 +1784,13 @@ check_sql_fn_retval(List *queryTreeLists, * or not the record type really matches. For the moment we rely on * runtime type checking to catch any discrepancy, but it'd be nice to * do better at parse time. + * + * We must *not* do this for a procedure, however. Procedures with + * output parameter(s) have rettype RECORD, and the CALL code expects + * to get results corresponding to the list of output parameters, even + * when there's just one parameter that's composite. */ - if (tlistlen == 1) + if (tlistlen == 1 && prokind != PROKIND_PROCEDURE) { TargetEntry *tle = (TargetEntry *) linitial(tlist); @@ -1963,6 +1972,12 @@ check_sql_fn_retval(List *queryTreeLists, rtr->rtindex = 1; newquery->jointree = makeFromExpr(list_make1(rtr), NULL); + /* + * Make sure the new query is marked as having row security if the + * original one does. + */ + newquery->hasRowSecurity = parse->hasRowSecurity; + /* Replace original query in the correct element of the query list */ lfirst(parse_cell) = newquery; } diff --git a/src/backend/executor/instrument.c b/src/backend/executor/instrument.c index ee78a5749d2d1..268ae8a945f2a 100644 --- a/src/backend/executor/instrument.c +++ b/src/backend/executor/instrument.c @@ -4,7 +4,7 @@ * functions for instrumentation of plan execution * * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/executor/instrument.c @@ -235,8 +235,10 @@ BufferUsageAdd(BufferUsage *dst, const BufferUsage *add) dst->local_blks_written += add->local_blks_written; dst->temp_blks_read += add->temp_blks_read; dst->temp_blks_written += add->temp_blks_written; - INSTR_TIME_ADD(dst->blk_read_time, add->blk_read_time); - INSTR_TIME_ADD(dst->blk_write_time, add->blk_write_time); + INSTR_TIME_ADD(dst->shared_blk_read_time, add->shared_blk_read_time); + INSTR_TIME_ADD(dst->shared_blk_write_time, add->shared_blk_write_time); + INSTR_TIME_ADD(dst->local_blk_read_time, add->local_blk_read_time); + INSTR_TIME_ADD(dst->local_blk_write_time, add->local_blk_write_time); INSTR_TIME_ADD(dst->temp_blk_read_time, add->temp_blk_read_time); INSTR_TIME_ADD(dst->temp_blk_write_time, add->temp_blk_write_time); } @@ -257,10 +259,14 @@ BufferUsageAccumDiff(BufferUsage *dst, dst->local_blks_written += add->local_blks_written - sub->local_blks_written; dst->temp_blks_read += add->temp_blks_read - sub->temp_blks_read; dst->temp_blks_written += add->temp_blks_written - sub->temp_blks_written; - INSTR_TIME_ACCUM_DIFF(dst->blk_read_time, - add->blk_read_time, sub->blk_read_time); - INSTR_TIME_ACCUM_DIFF(dst->blk_write_time, - add->blk_write_time, sub->blk_write_time); + INSTR_TIME_ACCUM_DIFF(dst->shared_blk_read_time, + add->shared_blk_read_time, sub->shared_blk_read_time); + INSTR_TIME_ACCUM_DIFF(dst->shared_blk_write_time, + add->shared_blk_write_time, sub->shared_blk_write_time); + INSTR_TIME_ACCUM_DIFF(dst->local_blk_read_time, + add->local_blk_read_time, sub->local_blk_read_time); + INSTR_TIME_ACCUM_DIFF(dst->local_blk_write_time, + add->local_blk_write_time, sub->local_blk_write_time); INSTR_TIME_ACCUM_DIFF(dst->temp_blk_read_time, add->temp_blk_read_time, sub->temp_blk_read_time); INSTR_TIME_ACCUM_DIFF(dst->temp_blk_write_time, diff --git a/src/backend/executor/meson.build b/src/backend/executor/meson.build index 65f9457c9b1bd..b511a429adf14 100644 --- a/src/backend/executor/meson.build +++ b/src/backend/executor/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'execAmi.c', diff --git a/src/backend/executor/nodeAgg.c b/src/backend/executor/nodeAgg.c index 468db94fe5ba0..53ead77ece8cb 100644 --- a/src/backend/executor/nodeAgg.c +++ b/src/backend/executor/nodeAgg.c @@ -237,7 +237,7 @@ * to filter expressions having to be evaluated early, and allows to JIT * the entire expression into one native function. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -260,7 +260,6 @@ #include "executor/nodeAgg.h" #include "lib/hyperloglog.h" #include "miscadmin.h" -#include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" #include "parser/parse_agg.h" @@ -4357,16 +4356,6 @@ ExecEndAgg(AggState *node) if (node->hashcontext) ReScanExprContext(node->hashcontext); - /* - * We don't actually free any ExprContexts here (see comment in - * ExecFreeExprContext), just unlinking the output one from the plan node - * suffices. - */ - ExecFreeExprContext(&node->ss.ps); - - /* clean up tuple table */ - ExecClearTuple(node->ss.ss_ScanTupleSlot); - outerPlan = outerPlanState(node); ExecEndNode(outerPlan); } diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c index 609df6b9e626f..6d5bee668c437 100644 --- a/src/backend/executor/nodeAppend.c +++ b/src/backend/executor/nodeAppend.c @@ -3,7 +3,7 @@ * nodeAppend.c * routines to handle append nodes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -58,8 +58,8 @@ #include "postgres.h" #include "executor/execAsync.h" -#include "executor/execdebug.h" #include "executor/execPartition.h" +#include "executor/executor.h" #include "executor/nodeAppend.h" #include "miscadmin.h" #include "pgstat.h" @@ -1016,7 +1016,7 @@ ExecAppendAsyncRequest(AppendState *node, TupleTableSlot **result) static void ExecAppendAsyncEventWait(AppendState *node) { - int nevents = node->as_nasyncplans + 1; + int nevents = node->as_nasyncplans + 2; long timeout = node->as_syncdone ? -1 : 0; WaitEvent occurred_event[EVENT_BUFFER_SIZE]; int noccurred; @@ -1025,7 +1025,8 @@ ExecAppendAsyncEventWait(AppendState *node) /* We should never be called when there are no valid async subplans. */ Assert(node->as_nasyncremain > 0); - node->as_eventset = CreateWaitEventSet(CurrentMemoryContext, nevents); + Assert(node->as_eventset == NULL); + node->as_eventset = CreateWaitEventSet(CurrentResourceOwner, nevents); AddWaitEventToSet(node->as_eventset, WL_EXIT_ON_PM_DEATH, PGINVALID_SOCKET, NULL, NULL); @@ -1040,8 +1041,8 @@ ExecAppendAsyncEventWait(AppendState *node) } /* - * No need for further processing if there are no configured events other - * than the postmaster death event. + * No need for further processing if none of the subplans configured any + * events. */ if (GetNumRegisteredWaitEvents(node->as_eventset) == 1) { @@ -1050,7 +1051,22 @@ ExecAppendAsyncEventWait(AppendState *node) return; } - /* We wait on at most EVENT_BUFFER_SIZE events. */ + /* + * Add the process latch to the set, so that we wake up to process the + * standard interrupts with CHECK_FOR_INTERRUPTS(). + * + * NOTE: For historical reasons, it's important that this is added to the + * WaitEventSet after the ExecAsyncConfigureWait() calls. Namely, + * postgres_fdw calls "GetNumRegisteredWaitEvents(set) == 1" to check if + * any other events are in the set. That's a poor design, it's + * questionable for postgres_fdw to be doing that in the first place, but + * we cannot change it now. The pattern has possibly been copied to other + * extensions too. + */ + AddWaitEventToSet(node->as_eventset, WL_LATCH_SET, PGINVALID_SOCKET, + MyLatch, NULL); + + /* Return at most EVENT_BUFFER_SIZE events in one call. */ if (nevents > EVENT_BUFFER_SIZE) nevents = EVENT_BUFFER_SIZE; @@ -1091,6 +1107,13 @@ ExecAppendAsyncEventWait(AppendState *node) ExecAsyncNotify(areq); } } + + /* Handle standard interrupts */ + if ((w->events & WL_LATCH_SET) != 0) + { + ResetLatch(MyLatch); + CHECK_FOR_INTERRUPTS(); + } } } diff --git a/src/backend/executor/nodeBitmapAnd.c b/src/backend/executor/nodeBitmapAnd.c index 4c5eb2b23b29e..9c9c66687218c 100644 --- a/src/backend/executor/nodeBitmapAnd.c +++ b/src/backend/executor/nodeBitmapAnd.c @@ -3,7 +3,7 @@ * nodeBitmapAnd.c * routines to handle BitmapAnd nodes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -28,7 +28,7 @@ #include "postgres.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeBitmapAnd.h" diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index f35df0b8bfb47..3d26d96cadd71 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -16,7 +16,7 @@ * required index qual conditions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -39,15 +39,12 @@ #include "access/relscan.h" #include "access/tableam.h" -#include "access/transam.h" #include "access/visibilitymap.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeBitmapHeapscan.h" #include "miscadmin.h" #include "pgstat.h" #include "storage/bufmgr.h" -#include "storage/predicate.h" -#include "utils/memutils.h" #include "utils/rel.h" #include "utils/snapmgr.h" #include "utils/spccache.h" @@ -55,7 +52,7 @@ static TupleTableSlot *BitmapHeapNext(BitmapHeapScanState *node); static inline void BitmapDoneInitializingSharedState(ParallelBitmapHeapState *pstate); static inline void BitmapAdjustPrefetchIterator(BitmapHeapScanState *node, - TBMIterateResult *tbmres); + BlockNumber blockno); static inline void BitmapAdjustPrefetchTarget(BitmapHeapScanState *node); static inline void BitmapPrefetch(BitmapHeapScanState *node, TableScanDesc scan); @@ -181,12 +178,55 @@ BitmapHeapNext(BitmapHeapScanState *node) } #endif /* USE_PREFETCH */ } + + /* + * If this is the first scan of the underlying table, create the table + * scan descriptor and begin the scan. + */ + if (!scan) + { + bool need_tuples = true; + + /* + * Unfortunately it turns out that the below optimization does not + * take the removal of TIDs by a concurrent vacuum into + * account. The concurrent vacuum can remove dead TIDs and make + * pages ALL_VISIBLE while those dead TIDs are referenced in the + * bitmap. This would lead to a !need_tuples scan returning too + * many tuples. + * + * In the back-branches, we therefore simply disable the + * optimization. Removing all the relevant code would be too + * invasive (and a major backpatching pain). + */ +#ifdef NOT_ANYMORE + /* + * We can potentially skip fetching heap pages if we do not need + * any columns of the table, either for checking non-indexable + * quals or for returning data. This test is a bit simplistic, as + * it checks the stronger condition that there's no qual or return + * tlist at all. But in most cases it's probably not worth working + * harder than that. + */ + need_tuples = (node->ss.ps.plan->qual != NIL || + node->ss.ps.plan->targetlist != NIL); +#endif + + scan = table_beginscan_bm(node->ss.ss_currentRelation, + node->ss.ps.state->es_snapshot, + 0, + NULL, + need_tuples); + + node->ss.ss_currentScanDesc = scan; + } + node->initialized = true; } for (;;) { - bool skip_fetch; + bool valid_block; CHECK_FOR_INTERRUPTS(); @@ -205,44 +245,21 @@ BitmapHeapNext(BitmapHeapScanState *node) break; } - BitmapAdjustPrefetchIterator(node, tbmres); + BitmapAdjustPrefetchIterator(node, tbmres->blockno); - /* - * We can skip fetching the heap page if we don't need any fields - * from the heap, and the bitmap entries don't need rechecking, - * and all tuples on the page are visible to our transaction. - * - * XXX: It's a layering violation that we do these checks above - * tableam, they should probably moved below it at some point. - */ - skip_fetch = (node->can_skip_fetch && - !tbmres->recheck && - VM_ALL_VISIBLE(node->ss.ss_currentRelation, - tbmres->blockno, - &node->vmbuffer)); + valid_block = table_scan_bitmap_next_block(scan, tbmres); - if (skip_fetch) - { - /* can't be lossy in the skip_fetch case */ - Assert(tbmres->ntuples >= 0); + if (tbmres->ntuples >= 0) + node->exact_pages++; + else + node->lossy_pages++; - /* - * The number of tuples on this page is put into - * node->return_empty_tuples. - */ - node->return_empty_tuples = tbmres->ntuples; - } - else if (!table_scan_bitmap_next_block(scan, tbmres)) + if (!valid_block) { /* AM doesn't think this block is valid, skip */ continue; } - if (tbmres->ntuples >= 0) - node->exact_pages++; - else - node->lossy_pages++; - /* Adjust the prefetch target */ BitmapAdjustPrefetchTarget(node); } @@ -280,52 +297,33 @@ BitmapHeapNext(BitmapHeapScanState *node) * should happen only when we have determined there is still something * to do on the current page, else we may uselessly prefetch the same * page we are just about to request for real. - * - * XXX: It's a layering violation that we do these checks above - * tableam, they should probably moved below it at some point. */ BitmapPrefetch(node, scan); - if (node->return_empty_tuples > 0) + /* + * Attempt to fetch tuple from AM. + */ + if (!table_scan_bitmap_next_tuple(scan, tbmres, slot)) { - /* - * If we don't have to fetch the tuple, just return nulls. - */ - ExecStoreAllNullTuple(slot); - - if (--node->return_empty_tuples == 0) - { - /* no more tuples to return in the next round */ - node->tbmres = tbmres = NULL; - } + /* nothing more to look at on this page */ + node->tbmres = tbmres = NULL; + continue; } - else + + /* + * If we are using lossy info, we have to recheck the qual conditions + * at every tuple. + */ + if (tbmres->recheck) { - /* - * Attempt to fetch tuple from AM. - */ - if (!table_scan_bitmap_next_tuple(scan, tbmres, slot)) + econtext->ecxt_scantuple = slot; + if (!ExecQualAndReset(node->bitmapqualorig, econtext)) { - /* nothing more to look at on this page */ - node->tbmres = tbmres = NULL; + /* Fails recheck, so drop it and loop back for another */ + InstrCountFiltered2(node, 1); + ExecClearTuple(slot); continue; } - - /* - * If we are using lossy info, we have to recheck the qual - * conditions at every tuple. - */ - if (tbmres->recheck) - { - econtext->ecxt_scantuple = slot; - if (!ExecQualAndReset(node->bitmapqualorig, econtext)) - { - /* Fails recheck, so drop it and loop back for another */ - InstrCountFiltered2(node, 1); - ExecClearTuple(slot); - continue; - } - } } /* OK to return this tuple */ @@ -358,7 +356,7 @@ BitmapDoneInitializingSharedState(ParallelBitmapHeapState *pstate) */ static inline void BitmapAdjustPrefetchIterator(BitmapHeapScanState *node, - TBMIterateResult *tbmres) + BlockNumber blockno) { #ifdef USE_PREFETCH ParallelBitmapHeapState *pstate = node->pstate; @@ -377,7 +375,7 @@ BitmapAdjustPrefetchIterator(BitmapHeapScanState *node, /* Do not let the prefetch iterator get behind the main one */ TBMIterateResult *tbmpre = tbm_iterate(prefetch_iterator); - if (tbmpre == NULL || tbmpre->blockno != tbmres->blockno) + if (tbmpre == NULL || tbmpre->blockno != blockno) elog(ERROR, "prefetch and main iterators are out of sync"); } return; @@ -491,14 +489,9 @@ BitmapPrefetch(BitmapHeapScanState *node, TableScanDesc scan) * skip this prefetch call, but continue to run the prefetch * logic normally. (Would it be better not to increment * prefetch_pages?) - * - * This depends on the assumption that the index AM will - * report the same recheck flag for this future heap page as - * it did for the current heap page; which is not a certainty - * but is true in many cases. */ - skip_fetch = (node->can_skip_fetch && - (node->tbmres ? !node->tbmres->recheck : false) && + skip_fetch = (!(scan->rs_flags & SO_NEED_TUPLES) && + !tbmpre->recheck && VM_ALL_VISIBLE(node->ss.ss_currentRelation, tbmpre->blockno, &node->pvmbuffer)); @@ -548,8 +541,8 @@ BitmapPrefetch(BitmapHeapScanState *node, TableScanDesc scan) } /* As above, skip prefetch if we expect not to need page */ - skip_fetch = (node->can_skip_fetch && - (node->tbmres ? !node->tbmres->recheck : false) && + skip_fetch = (!(scan->rs_flags & SO_NEED_TUPLES) && + !tbmpre->recheck && VM_ALL_VISIBLE(node->ss.ss_currentRelation, tbmpre->blockno, &node->pvmbuffer)); @@ -604,7 +597,8 @@ ExecReScanBitmapHeapScan(BitmapHeapScanState *node) PlanState *outerPlan = outerPlanState(node); /* rescan to release any page pin */ - table_rescan(node->ss.ss_currentScanDesc, NULL); + if (node->ss.ss_currentScanDesc) + table_rescan(node->ss.ss_currentScanDesc, NULL); /* release bitmaps and buffers if any */ if (node->tbmiterator) @@ -617,8 +611,6 @@ ExecReScanBitmapHeapScan(BitmapHeapScanState *node) tbm_end_shared_iterate(node->shared_prefetch_iterator); if (node->tbm) tbm_free(node->tbm); - if (node->vmbuffer != InvalidBuffer) - ReleaseBuffer(node->vmbuffer); if (node->pvmbuffer != InvalidBuffer) ReleaseBuffer(node->pvmbuffer); node->tbm = NULL; @@ -628,7 +620,6 @@ ExecReScanBitmapHeapScan(BitmapHeapScanState *node) node->initialized = false; node->shared_tbmiterator = NULL; node->shared_prefetch_iterator = NULL; - node->vmbuffer = InvalidBuffer; node->pvmbuffer = InvalidBuffer; ExecScanReScan(&node->ss); @@ -655,18 +646,6 @@ ExecEndBitmapHeapScan(BitmapHeapScanState *node) */ scanDesc = node->ss.ss_currentScanDesc; - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->ss.ps); - - /* - * clear out tuple table slots - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); - /* * close down subplans */ @@ -685,15 +664,15 @@ ExecEndBitmapHeapScan(BitmapHeapScanState *node) tbm_end_shared_iterate(node->shared_tbmiterator); if (node->shared_prefetch_iterator) tbm_end_shared_iterate(node->shared_prefetch_iterator); - if (node->vmbuffer != InvalidBuffer) - ReleaseBuffer(node->vmbuffer); if (node->pvmbuffer != InvalidBuffer) ReleaseBuffer(node->pvmbuffer); /* * close heap scan */ - table_endscan(scanDesc); + if (scanDesc) + table_endscan(scanDesc); + } /* ---------------------------------------------------------------- @@ -728,30 +707,17 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags) scanstate->tbm = NULL; scanstate->tbmiterator = NULL; scanstate->tbmres = NULL; - scanstate->return_empty_tuples = 0; - scanstate->vmbuffer = InvalidBuffer; scanstate->pvmbuffer = InvalidBuffer; scanstate->exact_pages = 0; scanstate->lossy_pages = 0; scanstate->prefetch_iterator = NULL; scanstate->prefetch_pages = 0; scanstate->prefetch_target = 0; - scanstate->pscan_len = 0; scanstate->initialized = false; scanstate->shared_tbmiterator = NULL; scanstate->shared_prefetch_iterator = NULL; scanstate->pstate = NULL; - /* - * We can potentially skip fetching heap pages if we do not need any - * columns of the table, either for checking non-indexable quals or for - * returning data. This test is a bit simplistic, as it checks the - * stronger condition that there's no qual or return tlist at all. But in - * most cases it's probably not worth working harder than that. - */ - scanstate->can_skip_fetch = (node->scan.plan.qual == NIL && - node->scan.plan.targetlist == NIL); - /* * Miscellaneous initialization * @@ -799,11 +765,6 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags) scanstate->ss.ss_currentRelation = currentRelation; - scanstate->ss.ss_currentScanDesc = table_beginscan_bm(currentRelation, - estate->es_snapshot, - 0, - NULL); - /* * all done. */ @@ -856,13 +817,7 @@ void ExecBitmapHeapEstimate(BitmapHeapScanState *node, ParallelContext *pcxt) { - EState *estate = node->ss.ps.state; - - node->pscan_len = add_size(offsetof(ParallelBitmapHeapState, - phs_snapshot_data), - EstimateSnapshotSpace(estate->es_snapshot)); - - shm_toc_estimate_chunk(&pcxt->estimator, node->pscan_len); + shm_toc_estimate_chunk(&pcxt->estimator, sizeof(ParallelBitmapHeapState)); shm_toc_estimate_keys(&pcxt->estimator, 1); } @@ -877,14 +832,13 @@ ExecBitmapHeapInitializeDSM(BitmapHeapScanState *node, ParallelContext *pcxt) { ParallelBitmapHeapState *pstate; - EState *estate = node->ss.ps.state; dsa_area *dsa = node->ss.ps.state->es_query_dsa; /* If there's no DSA, there are no workers; initialize nothing. */ if (dsa == NULL) return; - pstate = shm_toc_allocate(pcxt->toc, node->pscan_len); + pstate = shm_toc_allocate(pcxt->toc, sizeof(ParallelBitmapHeapState)); pstate->tbmiterator = 0; pstate->prefetch_iterator = 0; @@ -896,7 +850,6 @@ ExecBitmapHeapInitializeDSM(BitmapHeapScanState *node, pstate->state = BM_INITIAL; ConditionVariableInit(&pstate->cv); - SerializeSnapshot(estate->es_snapshot, pstate->phs_snapshot_data); shm_toc_insert(pcxt->toc, node->ss.ps.plan->plan_node_id, pstate); node->pstate = pstate; @@ -942,13 +895,9 @@ ExecBitmapHeapInitializeWorker(BitmapHeapScanState *node, ParallelWorkerContext *pwcxt) { ParallelBitmapHeapState *pstate; - Snapshot snapshot; Assert(node->ss.ps.state->es_query_dsa != NULL); pstate = shm_toc_lookup(pwcxt->toc, node->ss.ps.plan->plan_node_id, false); node->pstate = pstate; - - snapshot = RestoreSnapshot(pstate->phs_snapshot_data); - table_scan_update_snapshot(node->ss.ss_currentScanDesc, snapshot); } diff --git a/src/backend/executor/nodeBitmapIndexscan.c b/src/backend/executor/nodeBitmapIndexscan.c index 83ec9ede899ec..6df8e17ec84ca 100644 --- a/src/backend/executor/nodeBitmapIndexscan.c +++ b/src/backend/executor/nodeBitmapIndexscan.c @@ -3,7 +3,7 @@ * nodeBitmapIndexscan.c * Routines to support bitmapped index scans of relations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,11 +22,10 @@ #include "postgres.h" #include "access/genam.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeBitmapIndexscan.h" #include "executor/nodeIndexscan.h" #include "miscadmin.h" -#include "utils/memutils.h" /* ---------------------------------------------------------------- @@ -184,14 +183,6 @@ ExecEndBitmapIndexScan(BitmapIndexScanState *node) indexRelationDesc = node->biss_RelationDesc; indexScanDesc = node->biss_ScanDesc; - /* - * Free the exprcontext ... now dead code, see ExecFreeExprContext - */ -#ifdef NOT_USED - if (node->biss_RuntimeContext) - FreeExprContext(node->biss_RuntimeContext, true); -#endif - /* * close the index relation (no-op if we didn't open it) */ diff --git a/src/backend/executor/nodeBitmapOr.c b/src/backend/executor/nodeBitmapOr.c index 0bf8af9652a73..7029536c64382 100644 --- a/src/backend/executor/nodeBitmapOr.c +++ b/src/backend/executor/nodeBitmapOr.c @@ -3,7 +3,7 @@ * nodeBitmapOr.c * routines to handle BitmapOr nodes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -28,7 +28,7 @@ #include "postgres.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeBitmapOr.h" #include "miscadmin.h" diff --git a/src/backend/executor/nodeCtescan.c b/src/backend/executor/nodeCtescan.c index cc4c4243e2fb5..8081eed887b0b 100644 --- a/src/backend/executor/nodeCtescan.c +++ b/src/backend/executor/nodeCtescan.c @@ -3,7 +3,7 @@ * nodeCtescan.c * routines to handle CteScan nodes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -15,7 +15,7 @@ #include "postgres.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeCtescan.h" #include "miscadmin.h" @@ -287,18 +287,6 @@ ExecInitCteScan(CteScan *node, EState *estate, int eflags) void ExecEndCteScan(CteScanState *node) { - /* - * Free exprcontext - */ - ExecFreeExprContext(&node->ss.ps); - - /* - * clean out the tuple table - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); - /* * If I am the leader, free the tuplestore. */ diff --git a/src/backend/executor/nodeCustom.c b/src/backend/executor/nodeCustom.c index bd42c65b29385..e559cd23464bc 100644 --- a/src/backend/executor/nodeCustom.c +++ b/src/backend/executor/nodeCustom.c @@ -3,7 +3,7 @@ * nodeCustom.c * Routines to handle execution of custom scan node * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * ------------------------------------------------------------------------ @@ -17,9 +17,6 @@ #include "nodes/execnodes.h" #include "nodes/extensible.h" #include "nodes/plannodes.h" -#include "parser/parsetree.h" -#include "utils/hsearch.h" -#include "utils/memutils.h" #include "utils/rel.h" static TupleTableSlot *ExecCustomScan(PlanState *pstate); @@ -129,13 +126,6 @@ ExecEndCustomScan(CustomScanState *node) { Assert(node->methods->EndCustomScan != NULL); node->methods->EndCustomScan(node); - - /* Free the exprcontext */ - ExecFreeExprContext(&node->ss.ps); - - /* Clean out the tuple table */ - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); } void diff --git a/src/backend/executor/nodeForeignscan.c b/src/backend/executor/nodeForeignscan.c index c2139acca0752..fe4ae55c0f68a 100644 --- a/src/backend/executor/nodeForeignscan.c +++ b/src/backend/executor/nodeForeignscan.c @@ -3,7 +3,7 @@ * nodeForeignscan.c * Routines to support scans of foreign tables * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,7 +25,6 @@ #include "executor/executor.h" #include "executor/nodeForeignscan.h" #include "foreign/fdwapi.h" -#include "utils/memutils.h" #include "utils/rel.h" static TupleTableSlot *ForeignNext(ForeignScanState *node); @@ -312,14 +311,6 @@ ExecEndForeignScan(ForeignScanState *node) /* Shut down any outer plan. */ if (outerPlanState(node)) ExecEndNode(outerPlanState(node)); - - /* Free the exprcontext */ - ExecFreeExprContext(&node->ss.ps); - - /* clean out the tuple table */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); } /* ---------------------------------------------------------------- diff --git a/src/backend/executor/nodeFunctionscan.c b/src/backend/executor/nodeFunctionscan.c index dd06ef8aee868..3fdd1c51e1c2c 100644 --- a/src/backend/executor/nodeFunctionscan.c +++ b/src/backend/executor/nodeFunctionscan.c @@ -3,7 +3,7 @@ * nodeFunctionscan.c * Support routines for scanning RangeFunctions (functions in rangetable). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -26,7 +26,6 @@ #include "executor/nodeFunctionscan.h" #include "funcapi.h" #include "nodes/nodeFuncs.h" -#include "utils/builtins.h" #include "utils/memutils.h" @@ -344,8 +343,6 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags) Node *funcexpr = rtfunc->funcexpr; int colcount = rtfunc->funccolcount; FunctionScanPerFuncState *fs = &scanstate->funcstates[i]; - TypeFuncClass functypclass; - Oid funcrettype; TupleDesc tupdesc; fs->setexpr = @@ -362,39 +359,18 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags) fs->rowcount = -1; /* - * Now determine if the function returns a simple or composite type, - * and build an appropriate tupdesc. Note that in the composite case, - * the function may now return more columns than it did when the plan - * was made; we have to ignore any columns beyond "colcount". + * Now build a tupdesc showing the result type we expect from the + * function. If we have a coldeflist then that takes priority (note + * the parser enforces that there is one if the function's nominal + * output type is RECORD). Otherwise use get_expr_result_type. + * + * Note that if the function returns a named composite type, that may + * now contain more or different columns than it did when the plan was + * made. For both that and the RECORD case, we need to check tuple + * compatibility. ExecMakeTableFunctionResult handles some of this, + * and CheckVarSlotCompatibility provides a backstop. */ - functypclass = get_expr_result_type(funcexpr, - &funcrettype, - &tupdesc); - - if (functypclass == TYPEFUNC_COMPOSITE || - functypclass == TYPEFUNC_COMPOSITE_DOMAIN) - { - /* Composite data type, e.g. a table's row type */ - Assert(tupdesc); - Assert(tupdesc->natts >= colcount); - /* Must copy it out of typcache for safety */ - tupdesc = CreateTupleDescCopy(tupdesc); - } - else if (functypclass == TYPEFUNC_SCALAR) - { - /* Base data type, i.e. scalar */ - tupdesc = CreateTemplateTupleDesc(1); - TupleDescInitEntry(tupdesc, - (AttrNumber) 1, - NULL, /* don't care about the name here */ - funcrettype, - -1, - 0); - TupleDescInitEntryCollation(tupdesc, - (AttrNumber) 1, - exprCollation(funcexpr)); - } - else if (functypclass == TYPEFUNC_RECORD) + if (rtfunc->funccolnames != NIL) { tupdesc = BuildDescFromLists(rtfunc->funccolnames, rtfunc->funccoltypes, @@ -410,8 +386,40 @@ ExecInitFunctionScan(FunctionScan *node, EState *estate, int eflags) } else { - /* crummy error message, but parser should have caught this */ - elog(ERROR, "function in FROM has unsupported return type"); + TypeFuncClass functypclass; + Oid funcrettype; + + functypclass = get_expr_result_type(funcexpr, + &funcrettype, + &tupdesc); + + if (functypclass == TYPEFUNC_COMPOSITE || + functypclass == TYPEFUNC_COMPOSITE_DOMAIN) + { + /* Composite data type, e.g. a table's row type */ + Assert(tupdesc); + /* Must copy it out of typcache for safety */ + tupdesc = CreateTupleDescCopy(tupdesc); + } + else if (functypclass == TYPEFUNC_SCALAR) + { + /* Base data type, i.e. scalar */ + tupdesc = CreateTemplateTupleDesc(1); + TupleDescInitEntry(tupdesc, + (AttrNumber) 1, + NULL, /* don't care about the name here */ + funcrettype, + -1, + 0); + TupleDescInitEntryCollation(tupdesc, + (AttrNumber) 1, + exprCollation(funcexpr)); + } + else + { + /* crummy error message, but parser should have caught this */ + elog(ERROR, "function in FROM has unsupported return type"); + } } fs->tupdesc = tupdesc; @@ -523,18 +531,6 @@ ExecEndFunctionScan(FunctionScanState *node) { int i; - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->ss.ps); - - /* - * clean out the tuple table - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); - /* * Release slots and tuplestore resources */ @@ -542,9 +538,6 @@ ExecEndFunctionScan(FunctionScanState *node) { FunctionScanPerFuncState *fs = &node->funcstates[i]; - if (fs->func_slot) - ExecClearTuple(fs->func_slot); - if (fs->tstore != NULL) { tuplestore_end(node->funcstates[i].tstore); diff --git a/src/backend/executor/nodeGather.c b/src/backend/executor/nodeGather.c index 307fc10eea7bd..5d4ffe989cb23 100644 --- a/src/backend/executor/nodeGather.c +++ b/src/backend/executor/nodeGather.c @@ -3,7 +3,7 @@ * nodeGather.c * Support routines for scanning a plan via multiple workers. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * A Gather executor launches parallel workers to run multiple copies of a @@ -30,18 +30,13 @@ #include "postgres.h" -#include "access/relscan.h" -#include "access/xact.h" -#include "executor/execdebug.h" #include "executor/execParallel.h" +#include "executor/executor.h" #include "executor/nodeGather.h" -#include "executor/nodeSubplan.h" #include "executor/tqueue.h" #include "miscadmin.h" #include "optimizer/optimizer.h" -#include "pgstat.h" -#include "utils/memutils.h" -#include "utils/rel.h" +#include "utils/wait_event.h" static TupleTableSlot *ExecGather(PlanState *pstate); @@ -250,9 +245,6 @@ ExecEndGather(GatherState *node) { ExecEndNode(outerPlanState(node)); /* let children clean up first */ ExecShutdownGather(node); - ExecFreeExprContext(&node->ps); - if (node->ps.ps_ResultTupleSlot) - ExecClearTuple(node->ps.ps_ResultTupleSlot); } /* diff --git a/src/backend/executor/nodeGatherMerge.c b/src/backend/executor/nodeGatherMerge.c index 9d5e1a46e9e2a..45f6017c29ef8 100644 --- a/src/backend/executor/nodeGatherMerge.c +++ b/src/backend/executor/nodeGatherMerge.c @@ -3,7 +3,7 @@ * nodeGatherMerge.c * Scan a plan in multiple workers, and do order-preserving merge. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -14,18 +14,13 @@ #include "postgres.h" -#include "access/relscan.h" -#include "access/xact.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/execParallel.h" #include "executor/nodeGatherMerge.h" -#include "executor/nodeSubplan.h" #include "executor/tqueue.h" #include "lib/binaryheap.h" #include "miscadmin.h" #include "optimizer/optimizer.h" -#include "utils/memutils.h" -#include "utils/rel.h" /* * When we read tuples from workers, it's a good idea to read several at once @@ -290,9 +285,6 @@ ExecEndGatherMerge(GatherMergeState *node) { ExecEndNode(outerPlanState(node)); /* let children clean up first */ ExecShutdownGatherMerge(node); - ExecFreeExprContext(&node->ps); - if (node->ps.ps_ResultTupleSlot) - ExecClearTuple(node->ps.ps_ResultTupleSlot); } /* ---------------------------------------------------------------- diff --git a/src/backend/executor/nodeGroup.c b/src/backend/executor/nodeGroup.c index 25a1618952e6b..da32bec1811ca 100644 --- a/src/backend/executor/nodeGroup.c +++ b/src/backend/executor/nodeGroup.c @@ -3,7 +3,7 @@ * nodeGroup.c * Routines to handle group nodes (used for queries with GROUP BY clause). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,7 +25,6 @@ #include "executor/executor.h" #include "executor/nodeGroup.h" #include "miscadmin.h" -#include "utils/memutils.h" /* @@ -228,11 +227,6 @@ ExecEndGroup(GroupState *node) { PlanState *outerPlan; - ExecFreeExprContext(&node->ss.ps); - - /* clean up tuple table */ - ExecClearTuple(node->ss.ss_ScanTupleSlot); - outerPlan = outerPlanState(node); ExecEndNode(outerPlan); } diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index 8b5c35b82b884..adcc8af0396b4 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -3,7 +3,7 @@ * nodeHash.c * Routines to hash relations for hashjoin * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -30,19 +30,18 @@ #include "access/parallel.h" #include "catalog/pg_statistic.h" #include "commands/tablespace.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/hashjoin.h" #include "executor/nodeHash.h" #include "executor/nodeHashjoin.h" #include "miscadmin.h" -#include "pgstat.h" #include "port/atomics.h" #include "port/pg_bitutils.h" #include "utils/dynahash.h" -#include "utils/guc.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/syscache.h" +#include "utils/wait_event.h" static void ExecHashIncreaseNumBatches(HashJoinTable hashtable); static void ExecHashIncreaseNumBuckets(HashJoinTable hashtable); @@ -415,11 +414,6 @@ ExecEndHash(HashState *node) { PlanState *outerPlan; - /* - * free exprcontext - */ - ExecFreeExprContext(&node->ps); - /* * shut down the subplan */ @@ -1160,6 +1154,7 @@ ExecParallelHashIncreaseNumBatches(HashJoinTable hashtable) double dtuples; double dbuckets; int new_nbuckets; + uint32 max_buckets; /* * We probably also need a smaller bucket array. How many @@ -1172,9 +1167,17 @@ ExecParallelHashIncreaseNumBatches(HashJoinTable hashtable) * array. */ dtuples = (old_batch0->ntuples * 2.0) / new_nbatch; + + /* + * We need to calculate the maximum number of buckets to + * stay within the MaxAllocSize boundary. Round the + * maximum number to the previous power of 2 given that + * later we round the number to the next power of 2. + */ + max_buckets = pg_prevpower2_32((uint32) + (MaxAllocSize / sizeof(dsa_pointer_atomic))); dbuckets = ceil(dtuples / NTUP_PER_BUCKET); - dbuckets = Min(dbuckets, - MaxAllocSize / sizeof(dsa_pointer_atomic)); + dbuckets = Min(dbuckets, max_buckets); new_nbuckets = (int) dbuckets; new_nbuckets = Max(new_nbuckets, 1024); new_nbuckets = pg_nextpower2_32(new_nbuckets); @@ -1241,6 +1244,7 @@ ExecParallelHashIncreaseNumBatches(HashJoinTable hashtable) if (BarrierArriveAndWait(&pstate->grow_batches_barrier, WAIT_EVENT_HASH_GROW_BATCHES_DECIDE)) { + ParallelHashJoinBatch *old_batches; bool space_exhausted = false; bool extreme_skew_detected = false; @@ -1248,25 +1252,31 @@ ExecParallelHashIncreaseNumBatches(HashJoinTable hashtable) ExecParallelHashEnsureBatchAccessors(hashtable); ExecParallelHashTableSetCurrentBatch(hashtable, 0); + old_batches = dsa_get_address(hashtable->area, pstate->old_batches); + /* Are any of the new generation of batches exhausted? */ for (int i = 0; i < hashtable->nbatch; ++i) { - ParallelHashJoinBatch *batch = hashtable->batches[i].shared; + ParallelHashJoinBatch *batch; + ParallelHashJoinBatch *old_batch; + int parent; + batch = hashtable->batches[i].shared; if (batch->space_exhausted || batch->estimated_size > pstate->space_allowed) - { - int parent; - space_exhausted = true; + parent = i % pstate->old_nbatch; + old_batch = NthParallelHashJoinBatch(old_batches, parent); + if (old_batch->space_exhausted || + batch->estimated_size > pstate->space_allowed) + { /* * Did this batch receive ALL of the tuples from its * parent batch? That would indicate that further * repartitioning isn't going to help (the hash values * are probably all the same). */ - parent = i % pstate->old_nbatch; if (batch->ntuples == hashtable->batches[parent].shared->old_ntuples) extreme_skew_detected = true; } diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index 980746128bcbe..96014f5bf7d24 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -3,7 +3,7 @@ * nodeHashjoin.c * Routines to handle hash join nodes * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -169,9 +169,8 @@ #include "executor/nodeHash.h" #include "executor/nodeHashjoin.h" #include "miscadmin.h" -#include "pgstat.h" -#include "utils/memutils.h" #include "utils/sharedtuplestore.h" +#include "utils/wait_event.h" /* @@ -566,20 +565,21 @@ ExecHashJoinImpl(PlanState *pstate, bool parallel) } /* - * In a right-antijoin, we never return a matched tuple. - * And we need to stay on the current outer tuple to - * continue scanning the inner side for matches. + * If we only need to consider the first matching inner + * tuple, then advance to next outer tuple after we've + * processed this one. */ - if (node->js.jointype == JOIN_RIGHT_ANTI) - continue; + if (node->js.single_match) + node->hj_JoinState = HJ_NEED_NEW_OUTER; /* - * If we only need to join to the first matching inner - * tuple, then consider returning this one, but after that - * continue with next outer tuple. + * In a right-antijoin, we never return a matched tuple. + * If it's not an inner_unique join, we need to stay on + * the current outer tuple to continue scanning the inner + * side for matches. */ - if (node->js.single_match) - node->hj_JoinState = HJ_NEED_NEW_OUTER; + if (node->js.jointype == JOIN_RIGHT_ANTI) + continue; if (otherqual == NULL || ExecQual(otherqual, econtext)) return ExecProject(node->js.ps.ps_ProjInfo); @@ -867,18 +867,6 @@ ExecEndHashJoin(HashJoinState *node) node->hj_HashTable = NULL; } - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->js.ps); - - /* - * clean out the tuple table - */ - ExecClearTuple(node->js.ps.ps_ResultTupleSlot); - ExecClearTuple(node->hj_OuterTupleSlot); - ExecClearTuple(node->hj_HashTupleSlot); - /* * clean up subtrees */ @@ -1318,7 +1306,7 @@ ExecParallelHashJoinNewBatch(HashJoinState *hjstate) * The data recorded in the file for each tuple is its hash value, * then the tuple in MinimalTuple format. * - * fileptr points to a batch file in one of the the hashtable arrays. + * fileptr points to a batch file in one of the hashtable arrays. * * The batch files (and their buffers) are allocated in the spill context * created for the hashtable. @@ -1621,8 +1609,13 @@ void ExecHashJoinReInitializeDSM(HashJoinState *state, ParallelContext *pcxt) { int plan_node_id = state->js.ps.plan->plan_node_id; - ParallelHashJoinState *pstate = - shm_toc_lookup(pcxt->toc, plan_node_id, false); + ParallelHashJoinState *pstate; + + /* Nothing to do if we failed to create a DSM segment. */ + if (pcxt->seg == NULL) + return; + + pstate = shm_toc_lookup(pcxt->toc, plan_node_id, false); /* * It would be possible to reuse the shared hash table in single-batch diff --git a/src/backend/executor/nodeIncrementalSort.c b/src/backend/executor/nodeIncrementalSort.c index 34257ce34be9d..2ce5ed5ec8cd4 100644 --- a/src/backend/executor/nodeIncrementalSort.c +++ b/src/backend/executor/nodeIncrementalSort.c @@ -3,7 +3,7 @@ * nodeIncrementalSort.c * Routines to handle incremental sorting of relations. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -78,7 +78,6 @@ #include "postgres.h" -#include "access/htup_details.h" #include "executor/execdebug.h" #include "executor/nodeIncrementalSort.h" #include "miscadmin.h" @@ -1079,11 +1078,6 @@ ExecEndIncrementalSort(IncrementalSortState *node) { SO_printf("ExecEndIncrementalSort: shutting down sort node\n"); - /* clean out the scan tuple */ - ExecClearTuple(node->ss.ss_ScanTupleSlot); - /* must drop pointer to sort result tuple */ - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - /* must drop standalone tuple slots from outer node */ ExecDropSingleTupleTableSlot(node->group_pivot); ExecDropSingleTupleTableSlot(node->transfer_tuple); @@ -1140,7 +1134,6 @@ ExecReScanIncrementalSort(IncrementalSortState *node) node->outerNodeDone = false; node->n_fullsort_remaining = 0; node->bound_Done = 0; - node->presorted_keys = NULL; node->execution_status = INCSORT_LOADFULLSORT; @@ -1153,15 +1146,9 @@ ExecReScanIncrementalSort(IncrementalSortState *node) * cause a leak. */ if (node->fullsort_state != NULL) - { tuplesort_reset(node->fullsort_state); - node->fullsort_state = NULL; - } if (node->prefixsort_state != NULL) - { tuplesort_reset(node->prefixsort_state); - node->prefixsort_state = NULL; - } /* * If chgParam of subnode is not null, then the plan will be re-scanned by diff --git a/src/backend/executor/nodeIndexonlyscan.c b/src/backend/executor/nodeIndexonlyscan.c index 0b43a9b969901..b49194c0167af 100644 --- a/src/backend/executor/nodeIndexonlyscan.c +++ b/src/backend/executor/nodeIndexonlyscan.c @@ -3,7 +3,7 @@ * nodeIndexonlyscan.c * Routines to support index-only scans * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -35,19 +35,20 @@ #include "access/tableam.h" #include "access/tupdesc.h" #include "access/visibilitymap.h" -#include "executor/execdebug.h" +#include "catalog/pg_type.h" +#include "executor/executor.h" #include "executor/nodeIndexonlyscan.h" #include "executor/nodeIndexscan.h" #include "miscadmin.h" #include "storage/bufmgr.h" #include "storage/predicate.h" -#include "utils/memutils.h" +#include "utils/builtins.h" #include "utils/rel.h" static TupleTableSlot *IndexOnlyNext(IndexOnlyScanState *node); -static void StoreIndexTuple(TupleTableSlot *slot, IndexTuple itup, - TupleDesc itupdesc); +static void StoreIndexTuple(IndexOnlyScanState *node, TupleTableSlot *slot, + IndexTuple itup, TupleDesc itupdesc); /* ---------------------------------------------------------------- @@ -206,7 +207,7 @@ IndexOnlyNext(IndexOnlyScanState *node) ExecForceStoreHeapTuple(scandesc->xs_hitup, slot, false); } else if (scandesc->xs_itup) - StoreIndexTuple(slot, scandesc->xs_itup, scandesc->xs_itupdesc); + StoreIndexTuple(node, slot, scandesc->xs_itup, scandesc->xs_itupdesc); else elog(ERROR, "no data returned for index-only scan"); @@ -264,7 +265,8 @@ IndexOnlyNext(IndexOnlyScanState *node) * right now we don't need it elsewhere. */ static void -StoreIndexTuple(TupleTableSlot *slot, IndexTuple itup, TupleDesc itupdesc) +StoreIndexTuple(IndexOnlyScanState *node, TupleTableSlot *slot, + IndexTuple itup, TupleDesc itupdesc) { /* * Note: we must use the tupdesc supplied by the AM in index_deform_tuple, @@ -277,6 +279,37 @@ StoreIndexTuple(TupleTableSlot *slot, IndexTuple itup, TupleDesc itupdesc) ExecClearTuple(slot); index_deform_tuple(itup, itupdesc, slot->tts_values, slot->tts_isnull); + + /* + * Copy all name columns stored as cstrings back into a NAMEDATALEN byte + * sized allocation. We mark this branch as unlikely as generally "name" + * is used only for the system catalogs and this would have to be a user + * query running on those or some other user table with an index on a name + * column. + */ + if (unlikely(node->ioss_NameCStringAttNums != NULL)) + { + int attcount = node->ioss_NameCStringCount; + + for (int idx = 0; idx < attcount; idx++) + { + int attnum = node->ioss_NameCStringAttNums[idx]; + Name name; + + /* skip null Datums */ + if (slot->tts_isnull[attnum]) + continue; + + /* allocate the NAMEDATALEN and copy the datum into that memory */ + name = (Name) MemoryContextAlloc(node->ss.ps.ps_ExprContext->ecxt_per_tuple_memory, + NAMEDATALEN); + + /* use namestrcpy to zero-pad all trailing bytes */ + namestrcpy(name, DatumGetCString(slot->tts_values[attnum])); + slot->tts_values[attnum] = NameGetDatum(name); + } + } + ExecStoreVirtualTuple(slot); } @@ -380,22 +413,6 @@ ExecEndIndexOnlyScan(IndexOnlyScanState *node) node->ioss_VMBuffer = InvalidBuffer; } - /* - * Free the exprcontext(s) ... now dead code, see ExecFreeExprContext - */ -#ifdef NOT_USED - ExecFreeExprContext(&node->ss.ps); - if (node->ioss_RuntimeContext) - FreeExprContext(node->ioss_RuntimeContext, true); -#endif - - /* - * clear out tuple table slots - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); - /* * close the index relation (no-op if we didn't open it) */ @@ -490,8 +507,11 @@ ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags) { IndexOnlyScanState *indexstate; Relation currentRelation; + Relation indexRelation; LOCKMODE lockmode; TupleDesc tupDesc; + int indnkeyatts; + int namecount; /* * create state structure @@ -564,7 +584,8 @@ ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags) /* Open the index relation. */ lockmode = exec_rt_fetch(node->scan.scanrelid, estate)->rellockmode; - indexstate->ioss_RelationDesc = index_open(node->indexid, lockmode); + indexRelation = index_open(node->indexid, lockmode); + indexstate->ioss_RelationDesc = indexRelation; /* * Initialize index-specific scan state @@ -577,7 +598,7 @@ ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags) * build the index scan keys from the index qualification */ ExecIndexBuildScanKeys((PlanState *) indexstate, - indexstate->ioss_RelationDesc, + indexRelation, node->indexqual, false, &indexstate->ioss_ScanKeys, @@ -591,7 +612,7 @@ ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags) * any ORDER BY exprs have to be turned into scankeys in the same way */ ExecIndexBuildScanKeys((PlanState *) indexstate, - indexstate->ioss_RelationDesc, + indexRelation, node->indexorderby, true, &indexstate->ioss_OrderByKeys, @@ -620,6 +641,49 @@ ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags) indexstate->ioss_RuntimeContext = NULL; } + indexstate->ioss_NameCStringAttNums = NULL; + indnkeyatts = indexRelation->rd_index->indnkeyatts; + namecount = 0; + + /* + * The "name" type for btree uses text_ops which results in storing + * cstrings in the indexed keys rather than names. Here we detect that in + * a generic way in case other index AMs want to do the same optimization. + * Check for opclasses with an opcintype of NAMEOID and an index tuple + * descriptor with CSTRINGOID. If any of these are found, create an array + * marking the index attribute number of each of them. StoreIndexTuple() + * handles copying the name Datums into a NAMEDATALEN-byte allocation. + */ + + /* First, count the number of such index keys */ + for (int attnum = 0; attnum < indnkeyatts; attnum++) + { + if (indexRelation->rd_att->attrs[attnum].atttypid == CSTRINGOID && + indexRelation->rd_opcintype[attnum] == NAMEOID) + namecount++; + } + + if (namecount > 0) + { + int idx = 0; + + /* + * Now create an array to mark the attribute numbers of the keys that + * need to be converted from cstring to name. + */ + indexstate->ioss_NameCStringAttNums = (AttrNumber *) + palloc(sizeof(AttrNumber) * namecount); + + for (int attnum = 0; attnum < indnkeyatts; attnum++) + { + if (indexRelation->rd_att->attrs[attnum].atttypid == CSTRINGOID && + indexRelation->rd_opcintype[attnum] == NAMEOID) + indexstate->ioss_NameCStringAttNums[idx++] = (AttrNumber) attnum; + } + } + + indexstate->ioss_NameCStringCount = namecount; + /* * all done. */ @@ -645,6 +709,8 @@ ExecIndexOnlyScanEstimate(IndexOnlyScanState *node, EState *estate = node->ss.ps.state; node->ioss_PscanLen = index_parallelscan_estimate(node->ioss_RelationDesc, + node->ioss_NumScanKeys, + node->ioss_NumOrderByKeys, estate->es_snapshot); shm_toc_estimate_chunk(&pcxt->estimator, node->ioss_PscanLen); shm_toc_estimate_keys(&pcxt->estimator, 1); diff --git a/src/backend/executor/nodeIndexscan.c b/src/backend/executor/nodeIndexscan.c index 4540c7781d2d2..8000feff4c9f9 100644 --- a/src/backend/executor/nodeIndexscan.c +++ b/src/backend/executor/nodeIndexscan.c @@ -3,7 +3,7 @@ * nodeIndexscan.c * Routines to support indexed scans of relations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -33,7 +33,7 @@ #include "access/relscan.h" #include "access/tableam.h" #include "catalog/pg_am.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeIndexscan.h" #include "lib/pairingheap.h" #include "miscadmin.h" @@ -41,7 +41,6 @@ #include "utils/array.h" #include "utils/datum.h" #include "utils/lsyscache.h" -#include "utils/memutils.h" #include "utils/rel.h" /* @@ -794,22 +793,6 @@ ExecEndIndexScan(IndexScanState *node) indexRelationDesc = node->iss_RelationDesc; indexScanDesc = node->iss_ScanDesc; - /* - * Free the exprcontext(s) ... now dead code, see ExecFreeExprContext - */ -#ifdef NOT_USED - ExecFreeExprContext(&node->ss.ps); - if (node->iss_RuntimeContext) - FreeExprContext(node->iss_RuntimeContext, true); -#endif - - /* - * clear out tuple table slots - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); - /* * close the index relation (no-op if we didn't open it) */ @@ -1661,6 +1644,8 @@ ExecIndexScanEstimate(IndexScanState *node, EState *estate = node->ss.ps.state; node->iss_PscanLen = index_parallelscan_estimate(node->iss_RelationDesc, + node->iss_NumScanKeys, + node->iss_NumOrderByKeys, estate->es_snapshot); shm_toc_estimate_chunk(&pcxt->estimator, node->iss_PscanLen); shm_toc_estimate_keys(&pcxt->estimator, 1); diff --git a/src/backend/executor/nodeLimit.c b/src/backend/executor/nodeLimit.c index 425fbfc405fda..e6f1fb15629fe 100644 --- a/src/backend/executor/nodeLimit.c +++ b/src/backend/executor/nodeLimit.c @@ -3,7 +3,7 @@ * nodeLimit.c * Routines to handle limiting of query results where appropriate * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -24,7 +24,6 @@ #include "executor/executor.h" #include "executor/nodeLimit.h" #include "miscadmin.h" -#include "nodes/nodeFuncs.h" static void recompute_limits(LimitState *node); static int64 compute_tuples_needed(LimitState *node); @@ -534,7 +533,6 @@ ExecInitLimit(Limit *node, EState *estate, int eflags) void ExecEndLimit(LimitState *node) { - ExecFreeExprContext(&node->ps); ExecEndNode(outerPlanState(node)); } diff --git a/src/backend/executor/nodeLockRows.c b/src/backend/executor/nodeLockRows.c index e459971d32ec9..41754ddfea9f5 100644 --- a/src/backend/executor/nodeLockRows.c +++ b/src/backend/executor/nodeLockRows.c @@ -3,7 +3,7 @@ * nodeLockRows.c * Routines to handle FOR UPDATE/FOR SHARE row locking * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/executor/nodeMaterial.c b/src/backend/executor/nodeMaterial.c index 09632678b0332..22e1787fbdd8d 100644 --- a/src/backend/executor/nodeMaterial.c +++ b/src/backend/executor/nodeMaterial.c @@ -3,7 +3,7 @@ * nodeMaterial.c * Routines to handle materialization nodes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -239,11 +239,6 @@ ExecInitMaterial(Material *node, EState *estate, int eflags) void ExecEndMaterial(MaterialState *node) { - /* - * clean out the tuple table - */ - ExecClearTuple(node->ss.ss_ScanTupleSlot); - /* * Release tuplestore resources */ diff --git a/src/backend/executor/nodeMemoize.c b/src/backend/executor/nodeMemoize.c index 4f04269e2621b..45157ffb9c7ab 100644 --- a/src/backend/executor/nodeMemoize.c +++ b/src/backend/executor/nodeMemoize.c @@ -3,7 +3,7 @@ * nodeMemoize.c * Routines to handle caching of results from parameterized nodes * - * Portions Copyright (c) 2021-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2021-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -13,7 +13,7 @@ * Memoize nodes are intended to sit above parameterized nodes in the plan * tree in order to cache results from them. The intention here is that a * repeat scan with a parameter value that has already been seen by the node - * can fetch tuples from the cache rather than having to re-scan the outer + * can fetch tuples from the cache rather than having to re-scan the inner * node all over again. The query planner may choose to make use of one of * these when it thinks rescans for previously seen values are likely enough * to warrant adding the additional node. @@ -158,10 +158,14 @@ static uint32 MemoizeHash_hash(struct memoize_hash *tb, const MemoizeKey *key) { MemoizeState *mstate = (MemoizeState *) tb->private_data; + ExprContext *econtext = mstate->ss.ps.ps_ExprContext; + MemoryContext oldcontext; TupleTableSlot *pslot = mstate->probeslot; uint32 hashkey = 0; int numkeys = mstate->nkeys; + oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory); + if (mstate->binary_mode) { for (int i = 0; i < numkeys; i++) @@ -203,6 +207,7 @@ MemoizeHash_hash(struct memoize_hash *tb, const MemoizeKey *key) } } + MemoryContextSwitchTo(oldcontext); return murmurhash32(hashkey); } @@ -226,7 +231,11 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1, if (mstate->binary_mode) { + MemoryContext oldcontext; int numkeys = mstate->nkeys; + bool match = true; + + oldcontext = MemoryContextSwitchTo(econtext->ecxt_per_tuple_memory); slot_getallattrs(tslot); slot_getallattrs(pslot); @@ -236,7 +245,10 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1, FormData_pg_attribute *attr; if (tslot->tts_isnull[i] != pslot->tts_isnull[i]) - return false; + { + match = false; + break; + } /* both NULL? they're equal */ if (tslot->tts_isnull[i]) @@ -246,24 +258,32 @@ MemoizeHash_equal(struct memoize_hash *tb, const MemoizeKey *key1, attr = &tslot->tts_tupleDescriptor->attrs[i]; if (!datum_image_eq(tslot->tts_values[i], pslot->tts_values[i], attr->attbyval, attr->attlen)) - return false; + { + match = false; + break; + } } - return true; + + MemoryContextSwitchTo(oldcontext); + return match; } else { econtext->ecxt_innertuple = tslot; econtext->ecxt_outertuple = pslot; - return ExecQualAndReset(mstate->cache_eq_expr, econtext); + return ExecQual(mstate->cache_eq_expr, econtext); } } /* - * Initialize the hash table to empty. + * Initialize the hash table to empty. The MemoizeState's hashtable field + * must point to NULL. */ static void build_hash_table(MemoizeState *mstate, uint32 size) { + Assert(mstate->hashtable == NULL); + /* Make a guess at a good size when we're not given a valid size. */ if (size == 0) size = 1024; @@ -381,8 +401,10 @@ remove_cache_entry(MemoizeState *mstate, MemoizeEntry *entry) static void cache_purge_all(MemoizeState *mstate) { - uint64 evictions = mstate->hashtable->members; - PlanState *pstate = (PlanState *) mstate; + uint64 evictions = 0; + + if (mstate->hashtable != NULL) + evictions = mstate->hashtable->members; /* * Likely the most efficient way to remove all items is to just reset the @@ -391,8 +413,8 @@ cache_purge_all(MemoizeState *mstate) */ MemoryContextReset(mstate->tableContext); - /* Make the hash table the same size as the original size */ - build_hash_table(mstate, ((Memoize *) pstate->plan)->est_entries); + /* NULLify so we recreate the table on the next call */ + mstate->hashtable = NULL; /* reset the LRU list */ dlist_init(&mstate->lru_list); @@ -675,9 +697,18 @@ static TupleTableSlot * ExecMemoize(PlanState *pstate) { MemoizeState *node = castNode(MemoizeState, pstate); + ExprContext *econtext = node->ss.ps.ps_ExprContext; PlanState *outerNode; TupleTableSlot *slot; + CHECK_FOR_INTERRUPTS(); + + /* + * Reset per-tuple memory context to free any expression evaluation + * storage allocated in the previous tuple cycle. + */ + ResetExprContext(econtext); + switch (node->mstatus) { case MEMO_CACHE_LOOKUP: @@ -688,6 +719,10 @@ ExecMemoize(PlanState *pstate) Assert(node->entry == NULL); + /* first call? we'll need a hash table. */ + if (unlikely(node->hashtable == NULL)) + build_hash_table(node, ((Memoize *) pstate->plan)->est_entries); + /* * We're only ever in this state for the first call of the * scan. Here we have a look to see if we've already seen the @@ -1032,8 +1067,11 @@ ExecInitMemoize(Memoize *node, EState *estate, int eflags) /* Zero the statistics counters */ memset(&mstate->stats, 0, sizeof(MemoizeInstrumentation)); - /* Allocate and set up the actual cache */ - build_hash_table(mstate, node->est_entries); + /* + * Because it may require a large allocation, we delay building of the + * hash table until executor run. + */ + mstate->hashtable = NULL; return mstate; } @@ -1043,6 +1081,7 @@ ExecEndMemoize(MemoizeState *node) { #ifdef USE_ASSERT_CHECKING /* Validate the memory accounting code is correct in assert builds. */ + if (node->hashtable != NULL) { int count; uint64 mem = 0; @@ -1091,15 +1130,6 @@ ExecEndMemoize(MemoizeState *node) /* Remove the cache context */ MemoryContextDelete(node->tableContext); - ExecClearTuple(node->ss.ss_ScanTupleSlot); - /* must drop pointer to cache result tuple */ - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - - /* - * free exprcontext - */ - ExecFreeExprContext(&node->ss.ps); - /* * shut down the subplan */ diff --git a/src/backend/executor/nodeMergeAppend.c b/src/backend/executor/nodeMergeAppend.c index 21b5726e6edc2..e1b9b984a7a32 100644 --- a/src/backend/executor/nodeMergeAppend.c +++ b/src/backend/executor/nodeMergeAppend.c @@ -3,7 +3,7 @@ * nodeMergeAppend.c * routines to handle MergeAppend nodes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -38,7 +38,7 @@ #include "postgres.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/execPartition.h" #include "executor/nodeMergeAppend.h" #include "lib/binaryheap.h" diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c index 00f96d045e0bb..29c54fcd7538b 100644 --- a/src/backend/executor/nodeMergejoin.c +++ b/src/backend/executor/nodeMergejoin.c @@ -3,7 +3,7 @@ * nodeMergejoin.c * routines supporting merge joins * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -97,7 +97,6 @@ #include "executor/nodeMergejoin.h" #include "miscadmin.h" #include "utils/lsyscache.h" -#include "utils/memutils.h" /* @@ -145,7 +144,7 @@ typedef enum { MJEVAL_MATCHABLE, /* normal, potentially matchable tuple */ MJEVAL_NONMATCHABLE, /* tuple cannot join because it has a null */ - MJEVAL_ENDOFJOIN /* end of input (physical or effective) */ + MJEVAL_ENDOFJOIN, /* end of input (physical or effective) */ } MJEvalResult; @@ -806,20 +805,21 @@ ExecMergeJoin(PlanState *pstate) } /* - * In a right-antijoin, we never return a matched tuple. - * And we need to stay on the current outer tuple to - * continue scanning the inner side for matches. + * If we only need to consider the first matching inner + * tuple, then advance to next outer tuple after we've + * processed this one. */ - if (node->js.jointype == JOIN_RIGHT_ANTI) - break; + if (node->js.single_match) + node->mj_JoinState = EXEC_MJ_NEXTOUTER; /* - * If we only need to join to the first matching inner - * tuple, then consider returning this one, but after that - * continue with next outer tuple. + * In a right-antijoin, we never return a matched tuple. + * If it's not an inner_unique join, we need to stay on + * the current outer tuple to continue scanning the inner + * side for matches. */ - if (node->js.single_match) - node->mj_JoinState = EXEC_MJ_NEXTOUTER; + if (node->js.jointype == JOIN_RIGHT_ANTI) + break; qualResult = (otherqual == NULL || ExecQual(otherqual, econtext)); @@ -1643,17 +1643,6 @@ ExecEndMergeJoin(MergeJoinState *node) MJ1_printf("ExecEndMergeJoin: %s\n", "ending node processing"); - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->js.ps); - - /* - * clean out the tuple table - */ - ExecClearTuple(node->js.ps.ps_ResultTupleSlot); - ExecClearTuple(node->mj_MarkedTupleSlot); - /* * shut down the subplans */ diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 2a5fec8d017e5..d499f8422e8cc 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -3,7 +3,7 @@ * nodeModifyTable.c * routines to handle ModifyTable nodes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -24,29 +24,37 @@ * values plus row-locating info for UPDATE and MERGE cases, or just the * row-locating info for DELETE cases. * - * MERGE runs a join between the source relation and the target - * table; if any WHEN NOT MATCHED clauses are present, then the - * join is an outer join. In this case, any unmatched tuples will - * have NULL row-locating info, and only INSERT can be run. But for - * matched tuples, then row-locating info is used to determine the - * tuple to UPDATE or DELETE. When all clauses are WHEN MATCHED, - * then an inner join is used, so all tuples contain row-locating info. + * The relation to modify can be an ordinary table, a foreign table, or a + * view. If it's a view, either it has sufficient INSTEAD OF triggers or + * this node executes only MERGE ... DO NOTHING. If the original MERGE + * targeted a view not in one of those two categories, earlier processing + * already pointed the ModifyTable result relation to an underlying + * relation of that other view. This node does process + * ri_WithCheckOptions, which may have expressions from those other, + * automatically updatable views. + * + * MERGE runs a join between the source relation and the target table. + * If any WHEN NOT MATCHED [BY TARGET] clauses are present, then the join + * is an outer join that might output tuples without a matching target + * tuple. In this case, any unmatched target tuples will have NULL + * row-locating info, and only INSERT can be run. But for matched target + * tuples, the row-locating info is used to determine the tuple to UPDATE + * or DELETE. When all clauses are WHEN MATCHED or WHEN NOT MATCHED BY + * SOURCE, all tuples produced by the join will include a matching target + * tuple, so all tuples contain row-locating info. * * If the query specifies RETURNING, then the ModifyTable returns a * RETURNING tuple after completing each row insert, update, or delete. * It must be called again to continue the operation. Without RETURNING, * we just loop within the node until all the work is done, then - * return NULL. This avoids useless call/return overhead. (MERGE does - * not support RETURNING.) + * return NULL. This avoids useless call/return overhead. */ #include "postgres.h" -#include "access/heapam.h" #include "access/htup_details.h" #include "access/tableam.h" #include "access/xact.h" -#include "catalog/catalog.h" #include "commands/trigger.h" #include "executor/execPartition.h" #include "executor/executor.h" @@ -56,12 +64,11 @@ #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" #include "rewrite/rewriteHandler.h" -#include "storage/bufmgr.h" #include "storage/lmgr.h" #include "utils/builtins.h" #include "utils/datum.h" -#include "utils/memutils.h" #include "utils/rel.h" +#include "utils/snapmgr.h" typedef struct MTTargetRelLookup @@ -88,9 +95,6 @@ typedef struct ModifyTableContext */ TupleTableSlot *planSlot; - /* MERGE specific */ - MergeActionState *relaction; /* MERGE action in progress */ - /* * Information about the changes that were made concurrently to a tuple * being updated or deleted @@ -109,7 +113,6 @@ typedef struct ModifyTableContext */ typedef struct UpdateContext { - bool updated; /* did UPDATE actually occur? */ bool crossPartUpdate; /* was it a cross-partition update? */ TU_UpdateIndexes updateIndexes; /* Which index updates are required? */ @@ -151,15 +154,18 @@ static TupleTableSlot *ExecPrepareTupleRouting(ModifyTableState *mtstate, static TupleTableSlot *ExecMerge(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ItemPointer tupleid, + HeapTuple oldtuple, bool canSetTag); static void ExecInitMerge(ModifyTableState *mtstate, EState *estate); -static bool ExecMergeMatched(ModifyTableContext *context, - ResultRelInfo *resultRelInfo, - ItemPointer tupleid, - bool canSetTag); -static void ExecMergeNotMatched(ModifyTableContext *context, - ResultRelInfo *resultRelInfo, - bool canSetTag); +static TupleTableSlot *ExecMergeMatched(ModifyTableContext *context, + ResultRelInfo *resultRelInfo, + ItemPointer tupleid, + HeapTuple oldtuple, + bool canSetTag, + bool *matched); +static TupleTableSlot *ExecMergeNotMatched(ModifyTableContext *context, + ResultRelInfo *resultRelInfo, + bool canSetTag); /* @@ -199,33 +205,53 @@ ExecCheckPlanOutput(Relation resultRel, List *targetList) attr = TupleDescAttr(resultDesc, attno); attno++; - if (!attr->attisdropped) + /* + * Special cases here should match planner's expand_insert_targetlist. + */ + if (attr->attisdropped) { - /* Normal case: demand type match */ - if (exprType((Node *) tle->expr) != attr->atttypid) + /* + * For a dropped column, we can't check atttypid (it's likely 0). + * In any case the planner has most likely inserted an INT4 null. + * What we insist on is just *some* NULL constant. + */ + if (!IsA(tle->expr, Const) || + !((Const *) tle->expr)->constisnull) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("table row type and query-specified row type do not match"), - errdetail("Table has type %s at ordinal position %d, but query expects %s.", - format_type_be(attr->atttypid), - attno, - format_type_be(exprType((Node *) tle->expr))))); + errdetail("Query provides a value for a dropped column at ordinal position %d.", + attno))); } - else + else if (attr->attgenerated) { /* - * For a dropped column, we can't check atttypid (it's likely 0). - * In any case the planner has most likely inserted an INT4 null. - * What we insist on is just *some* NULL constant. + * For a generated column, the planner will have inserted a null + * of the column's base type (to avoid possibly failing on domain + * not-null constraints). It doesn't seem worth insisting on that + * exact type though, since a null value is type-independent. As + * above, just insist on *some* NULL constant. */ if (!IsA(tle->expr, Const) || !((Const *) tle->expr)->constisnull) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("table row type and query-specified row type do not match"), - errdetail("Query provides a value for a dropped column at ordinal position %d.", + errdetail("Query provides a value for a generated column at ordinal position %d.", attno))); } + else + { + /* Normal case: demand type match */ + if (exprType((Node *) tle->expr) != attr->atttypid) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("table row type and query-specified row type do not match"), + errdetail("Table has type %s at ordinal position %d, but query expects %s.", + format_type_be(attr->atttypid), + attno, + format_type_be(exprType((Node *) tle->expr))))); + } } if (attno != resultDesc->natts) ereport(ERROR, @@ -979,7 +1005,7 @@ ExecInsert(ModifyTableContext *context, if (mtstate->operation == CMD_UPDATE) wco_kind = WCO_RLS_UPDATE_CHECK; else if (mtstate->operation == CMD_MERGE) - wco_kind = (context->relaction->mas_action->commandType == CMD_UPDATE) ? + wco_kind = (mtstate->mt_merge_action->mas_action->commandType == CMD_UPDATE) ? WCO_RLS_UPDATE_CHECK : WCO_RLS_INSERT_CHECK; else wco_kind = WCO_RLS_INSERT_CHECK; @@ -1401,18 +1427,18 @@ ExecDeleteEpilogue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, * DELETE is like UPDATE, except that we delete the tuple and no * index modifications are needed. * - * When deleting from a table, tupleid identifies the tuple to - * delete and oldtuple is NULL. When deleting from a view, - * oldtuple is passed to the INSTEAD OF triggers and identifies - * what to delete, and tupleid is invalid. When deleting from a - * foreign table, tupleid is invalid; the FDW has to figure out - * which row to delete using data from the planSlot. oldtuple is - * passed to foreign table triggers; it is NULL when the foreign - * table has no relevant triggers. We use tupleDeleted to indicate - * whether the tuple is actually deleted, callers can use it to - * decide whether to continue the operation. When this DELETE is a - * part of an UPDATE of partition-key, then the slot returned by - * EvalPlanQual() is passed back using output parameter epqreturnslot. + * When deleting from a table, tupleid identifies the tuple to delete and + * oldtuple is NULL. When deleting through a view INSTEAD OF trigger, + * oldtuple is passed to the triggers and identifies what to delete, and + * tupleid is invalid. When deleting from a foreign table, tupleid is + * invalid; the FDW has to figure out which row to delete using data from + * the planSlot. oldtuple is passed to foreign table triggers; it is + * NULL when the foreign table has no relevant triggers. We use + * tupleDeleted to indicate whether the tuple is actually deleted, + * callers can use it to decide whether to continue the operation. When + * this DELETE is a part of an UPDATE of partition-key, then the slot + * returned by EvalPlanQual() is passed back using output parameter + * epqreturnslot. * * Returns RETURNING result if any, otherwise NULL. * ---------------------------------------------------------------- @@ -1425,6 +1451,7 @@ ExecDelete(ModifyTableContext *context, bool processReturning, bool changingPart, bool canSetTag, + TM_Result *tmresult, bool *tupleDeleted, TupleTableSlot **epqreturnslot) { @@ -1441,7 +1468,7 @@ ExecDelete(ModifyTableContext *context, * done if it says we are. */ if (!ExecDeletePrologue(context, resultRelInfo, tupleid, oldtuple, - epqreturnslot, NULL)) + epqreturnslot, tmresult)) return NULL; /* INSTEAD OF ROW DELETE Triggers */ @@ -1496,6 +1523,9 @@ ExecDelete(ModifyTableContext *context, ldelete: result = ExecDeleteAct(context, resultRelInfo, tupleid, changingPart); + if (tmresult) + *tmresult = result; + switch (result) { case TM_SelfModified: @@ -1734,6 +1764,7 @@ ExecCrossPartitionUpdate(ModifyTableContext *context, TupleTableSlot *slot, bool canSetTag, UpdateContext *updateCxt, + TM_Result *tmresult, TupleTableSlot **retry_slot, TupleTableSlot **inserted_tuple, ResultRelInfo **insert_destrel) @@ -1797,7 +1828,7 @@ ExecCrossPartitionUpdate(ModifyTableContext *context, false, /* processReturning */ true, /* changingPart */ false, /* canSetTag */ - &tuple_deleted, &epqslot); + tmresult, &tuple_deleted, &epqslot); /* * For some reason if DELETE didn't happen (e.g. trigger prevented it, or @@ -1828,8 +1859,8 @@ ExecCrossPartitionUpdate(ModifyTableContext *context, * additional rechecking, and might end up executing a different * action entirely). */ - if (context->relaction != NULL) - return false; + if (mtstate->operation == CMD_MERGE) + return *tmresult == TM_Ok; else if (TupIsNull(epqslot)) return true; else @@ -2031,12 +2062,12 @@ ExecUpdateAct(ModifyTableContext *context, ResultRelInfo *resultRelInfo, if (ExecCrossPartitionUpdate(context, resultRelInfo, tupleid, oldtuple, slot, canSetTag, updateCxt, + &result, &retry_slot, &inserted_tuple, &insert_destrel)) { /* success! */ - updateCxt->updated = true; updateCxt->crossPartUpdate = true; /* @@ -2069,8 +2100,8 @@ ExecUpdateAct(ModifyTableContext *context, ResultRelInfo *resultRelInfo, * No luck, a retry is needed. If running MERGE, we do not do so * here; instead let it handle that on its own rules. */ - if (context->relaction != NULL) - return TM_Updated; + if (context->mtstate->operation == CMD_MERGE) + return result; /* * ExecCrossPartitionUpdate installed an updated version of the new @@ -2105,8 +2136,6 @@ ExecUpdateAct(ModifyTableContext *context, ResultRelInfo *resultRelInfo, true /* wait for commit */ , &context->tmfd, &updateCxt->lockmode, &updateCxt->updateIndexes); - if (result == TM_Ok) - updateCxt->updated = true; return result; } @@ -2238,21 +2267,22 @@ ExecCrossPartitionUpdateForeignKey(ModifyTableContext *context, * is, we don't want to get stuck in an infinite loop * which corrupts your database.. * - * When updating a table, tupleid identifies the tuple to - * update and oldtuple is NULL. When updating a view, oldtuple - * is passed to the INSTEAD OF triggers and identifies what to - * update, and tupleid is invalid. When updating a foreign table, - * tupleid is invalid; the FDW has to figure out which row to - * update using data from the planSlot. oldtuple is passed to - * foreign table triggers; it is NULL when the foreign table has - * no relevant triggers. + * When updating a table, tupleid identifies the tuple to update and + * oldtuple is NULL. When updating through a view INSTEAD OF trigger, + * oldtuple is passed to the triggers and identifies what to update, and + * tupleid is invalid. When updating a foreign table, tupleid is + * invalid; the FDW has to figure out which row to update using data from + * the planSlot. oldtuple is passed to foreign table triggers; it is + * NULL when the foreign table has no relevant triggers. * * slot contains the new tuple value to be stored. * planSlot is the output of the ModifyTable's subplan; we use it * to access values from other input tables (for RETURNING), * row-ID junk columns, etc. * - * Returns RETURNING result if any, otherwise NULL. + * Returns RETURNING result if any, otherwise NULL. On exit, if tupleid + * had identified the tuple to update, it will identify the tuple + * actually updated after EvalPlanQual. * ---------------------------------------------------------------- */ static TupleTableSlot * @@ -2311,6 +2341,8 @@ ExecUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, } else { + ItemPointerData lockedtid; + /* * If we generate a new candidate tuple after EvalPlanQual testing, we * must loop back here to try again. (We don't need to redo triggers, @@ -2319,6 +2351,7 @@ ExecUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, * to do them again.) */ redo_act: + lockedtid = *tupleid; result = ExecUpdateAct(context, resultRelInfo, tupleid, oldtuple, slot, canSetTag, &updateCxt); @@ -2412,6 +2445,14 @@ ExecUpdate(ModifyTableContext *context, ResultRelInfo *resultRelInfo, ExecInitUpdateProjection(context->mtstate, resultRelInfo); + if (resultRelInfo->ri_needLockTagTuple) + { + UnlockTuple(resultRelationDesc, + &lockedtid, InplaceUpdateTupleLock); + LockTuple(resultRelationDesc, + tupleid, InplaceUpdateTupleLock); + } + /* Fetch the most recent version of old tuple. */ oldSlot = resultRelInfo->ri_oldTupleSlot; if (!table_tuple_fetch_row_version(resultRelationDesc, @@ -2516,6 +2557,14 @@ ExecOnConflictUpdate(ModifyTableContext *context, TransactionId xmin; bool isnull; + /* + * Parse analysis should have blocked ON CONFLICT for all system + * relations, which includes these. There's no fundamental obstacle to + * supporting this; we'd just need to handle LOCKTAG_TUPLE like the other + * ExecUpdate() caller. + */ + Assert(!resultRelInfo->ri_needLockTagTuple); + /* Determine lock mode to use */ lockmode = ExecUpdateLockMode(context->estate, resultRelInfo); @@ -2710,136 +2759,217 @@ ExecOnConflictUpdate(ModifyTableContext *context, */ static TupleTableSlot * ExecMerge(ModifyTableContext *context, ResultRelInfo *resultRelInfo, - ItemPointer tupleid, bool canSetTag) + ItemPointer tupleid, HeapTuple oldtuple, bool canSetTag) { + TupleTableSlot *rslot = NULL; bool matched; /*----- - * If we are dealing with a WHEN MATCHED case (tupleid is valid), we - * execute the first action for which the additional WHEN MATCHED AND + * If we are dealing with a WHEN MATCHED case, tupleid or oldtuple is + * valid, depending on whether the result relation is a table or a view. + * We execute the first action for which the additional WHEN MATCHED AND * quals pass. If an action without quals is found, that action is * executed. * - * Similarly, if we are dealing with WHEN NOT MATCHED case, we look at - * the given WHEN NOT MATCHED actions in sequence until one passes. + * Similarly, in the WHEN NOT MATCHED BY SOURCE case, tupleid or oldtuple + * is valid, and we look at the given WHEN NOT MATCHED BY SOURCE actions + * in sequence until one passes. This is almost identical to the WHEN + * MATCHED case, and both cases are handled by ExecMergeMatched(). + * + * Finally, in the WHEN NOT MATCHED [BY TARGET] case, both tupleid and + * oldtuple are invalid, and we look at the given WHEN NOT MATCHED [BY + * TARGET] actions in sequence until one passes. * * Things get interesting in case of concurrent update/delete of the * target tuple. Such concurrent update/delete is detected while we are - * executing a WHEN MATCHED action. + * executing a WHEN MATCHED or WHEN NOT MATCHED BY SOURCE action. * * A concurrent update can: * - * 1. modify the target tuple so that it no longer satisfies the - * additional quals attached to the current WHEN MATCHED action + * 1. modify the target tuple so that the results from checking any + * additional quals attached to WHEN MATCHED or WHEN NOT MATCHED BY + * SOURCE actions potentially change, but the result from the join + * quals does not change. * - * In this case, we are still dealing with a WHEN MATCHED case. - * We recheck the list of WHEN MATCHED actions from the start and - * choose the first one that satisfies the new target tuple. + * In this case, we are still dealing with the same kind of match + * (MATCHED or NOT MATCHED BY SOURCE). We recheck the same list of + * actions from the start and choose the first one that satisfies the + * new target tuple. * - * 2. modify the target tuple so that the join quals no longer pass and - * hence the source tuple no longer has a match. + * 2. modify the target tuple in the WHEN MATCHED case so that the join + * quals no longer pass and hence the source and target tuples no + * longer match. * - * In this case, the source tuple no longer matches the target tuple, - * so we now instead find a qualifying WHEN NOT MATCHED action to - * execute. + * In this case, we are now dealing with a NOT MATCHED case, and we + * process both WHEN NOT MATCHED BY SOURCE and WHEN NOT MATCHED [BY + * TARGET] actions. First ExecMergeMatched() processes the list of + * WHEN NOT MATCHED BY SOURCE actions in sequence until one passes, + * then ExecMergeNotMatched() processes any WHEN NOT MATCHED [BY + * TARGET] actions in sequence until one passes. Thus we may execute + * two actions; one of each kind. * - * XXX Hmmm, what if the updated tuple would now match one that was - * considered NOT MATCHED so far? + * Thus we support concurrent updates that turn MATCHED candidate rows + * into NOT MATCHED rows. However, we do not attempt to support cases + * that would turn NOT MATCHED rows into MATCHED rows, or which would + * cause a target row to match a different source row. * - * A concurrent delete changes a WHEN MATCHED case to WHEN NOT MATCHED. + * A concurrent delete changes a WHEN MATCHED case to WHEN NOT MATCHED + * [BY TARGET]. * - * ExecMergeMatched takes care of following the update chain and - * re-finding the qualifying WHEN MATCHED action, as long as the updated - * target tuple still satisfies the join quals, i.e., it remains a WHEN - * MATCHED case. If the tuple gets deleted or the join quals fail, it - * returns and we try ExecMergeNotMatched. Given that ExecMergeMatched - * always make progress by following the update chain and we never switch - * from ExecMergeNotMatched to ExecMergeMatched, there is no risk of a - * livelock. + * ExecMergeMatched() takes care of following the update chain and + * re-finding the qualifying WHEN MATCHED or WHEN NOT MATCHED BY SOURCE + * action, as long as the target tuple still exists. If the target tuple + * gets deleted or a concurrent update causes the join quals to fail, it + * returns a matched status of false and we call ExecMergeNotMatched(). + * Given that ExecMergeMatched() always makes progress by following the + * update chain and we never switch from ExecMergeNotMatched() to + * ExecMergeMatched(), there is no risk of a livelock. */ - matched = tupleid != NULL; + matched = tupleid != NULL || oldtuple != NULL; if (matched) - matched = ExecMergeMatched(context, resultRelInfo, tupleid, canSetTag); + rslot = ExecMergeMatched(context, resultRelInfo, tupleid, oldtuple, + canSetTag, &matched); /* - * Either we were dealing with a NOT MATCHED tuple or ExecMergeMatched() - * returned "false", indicating the previously MATCHED tuple no longer - * matches. + * Deal with the NOT MATCHED case (either a NOT MATCHED tuple from the + * join, or a previously MATCHED tuple for which ExecMergeMatched() set + * "matched" to false, indicating that it no longer matches). */ if (!matched) - ExecMergeNotMatched(context, resultRelInfo, canSetTag); + { + /* + * If a concurrent update turned a MATCHED case into a NOT MATCHED + * case, and we have both WHEN NOT MATCHED BY SOURCE and WHEN NOT + * MATCHED [BY TARGET] actions, and there is a RETURNING clause, + * ExecMergeMatched() may have already executed a WHEN NOT MATCHED BY + * SOURCE action, and computed the row to return. If so, we cannot + * execute a WHEN NOT MATCHED [BY TARGET] action now, so mark it as + * pending (to be processed on the next call to ExecModifyTable()). + * Otherwise, just process the action now. + */ + if (rslot == NULL) + rslot = ExecMergeNotMatched(context, resultRelInfo, canSetTag); + else + context->mtstate->mt_merge_pending_not_matched = context->planSlot; + } - /* No RETURNING support yet */ - return NULL; + return rslot; } /* - * Check and execute the first qualifying MATCHED action. The current target - * tuple is identified by tupleid. + * Check and execute the first qualifying MATCHED or NOT MATCHED BY SOURCE + * action, depending on whether the join quals are satisfied. If the target + * relation is a table, the current target tuple is identified by tupleid. + * Otherwise, if the target relation is a view, oldtuple is the current target + * tuple from the view. * - * We start from the first WHEN MATCHED action and check if the WHEN quals - * pass, if any. If the WHEN quals for the first action do not pass, we - * check the second, then the third and so on. If we reach to the end, no - * action is taken and we return true, indicating that no further action is - * required for this tuple. + * We start from the first WHEN MATCHED or WHEN NOT MATCHED BY SOURCE action + * and check if the WHEN quals pass, if any. If the WHEN quals for the first + * action do not pass, we check the second, then the third and so on. If we + * reach the end without finding a qualifying action, we return NULL. + * Otherwise, we execute the qualifying action and return its RETURNING + * result, if any, or NULL. * - * If we do find a qualifying action, then we attempt to execute the action. + * On entry, "*matched" is assumed to be true. If a concurrent update or + * delete is detected that causes the join quals to no longer pass, we set it + * to false, indicating that the caller should process any NOT MATCHED [BY + * TARGET] actions. * - * If the tuple is concurrently updated, EvalPlanQual is run with the updated - * tuple to recheck the join quals. Note that the additional quals associated - * with individual actions are evaluated by this routine via ExecQual, while - * EvalPlanQual checks for the join quals. If EvalPlanQual tells us that the - * updated tuple still passes the join quals, then we restart from the first - * action to look for a qualifying action. Otherwise, we return false -- - * meaning that a NOT MATCHED action must now be executed for the current - * source tuple. + * After a concurrent update, we restart from the first action to look for a + * new qualifying action to execute. If the join quals originally passed, and + * the concurrent update caused them to no longer pass, then we switch from + * the MATCHED to the NOT MATCHED BY SOURCE list of actions before restarting + * (and setting "*matched" to false). As a result we may execute a WHEN NOT + * MATCHED BY SOURCE action, and set "*matched" to false, causing the caller + * to also execute a WHEN NOT MATCHED [BY TARGET] action. */ -static bool +static TupleTableSlot * ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, - ItemPointer tupleid, bool canSetTag) + ItemPointer tupleid, HeapTuple oldtuple, bool canSetTag, + bool *matched) { ModifyTableState *mtstate = context->mtstate; - TupleTableSlot *newslot; + List **mergeActions = resultRelInfo->ri_MergeActions; + ItemPointerData lockedtid; + List *actionStates; + TupleTableSlot *newslot = NULL; + TupleTableSlot *rslot = NULL; EState *estate = context->estate; ExprContext *econtext = mtstate->ps.ps_ExprContext; bool isNull; EPQState *epqstate = &mtstate->mt_epqstate; ListCell *l; + /* Expect matched to be true on entry */ + Assert(*matched); + /* - * If there are no WHEN MATCHED actions, we are done. + * If there are no WHEN MATCHED or WHEN NOT MATCHED BY SOURCE actions, we + * are done. */ - if (resultRelInfo->ri_matchedMergeAction == NIL) - return true; + if (mergeActions[MERGE_WHEN_MATCHED] == NIL && + mergeActions[MERGE_WHEN_NOT_MATCHED_BY_SOURCE] == NIL) + return NULL; /* * Make tuple and any needed join variables available to ExecQual and * ExecProject. The target's existing tuple is installed in the scantuple. - * Again, this target relation's slot is required only in the case of a - * MATCHED tuple and UPDATE/DELETE actions. + * This target relation's slot is required only in the case of a MATCHED + * or NOT MATCHED BY SOURCE tuple and UPDATE/DELETE actions. */ econtext->ecxt_scantuple = resultRelInfo->ri_oldTupleSlot; econtext->ecxt_innertuple = context->planSlot; econtext->ecxt_outertuple = NULL; -lmerge_matched: + /* + * This routine is only invoked for matched target rows, so we should + * either have the tupleid of the target row, or an old tuple from the + * target wholerow junk attr. + */ + Assert(tupleid != NULL || oldtuple != NULL); + ItemPointerSetInvalid(&lockedtid); + if (oldtuple != NULL) + { + Assert(!resultRelInfo->ri_needLockTagTuple); + ExecForceStoreHeapTuple(oldtuple, resultRelInfo->ri_oldTupleSlot, + false); + } + else + { + if (resultRelInfo->ri_needLockTagTuple) + { + /* + * This locks even for CMD_DELETE, for CMD_NOTHING, and for tuples + * that don't match mas_whenqual. MERGE on system catalogs is a + * minor use case, so don't bother optimizing those. + */ + LockTuple(resultRelInfo->ri_RelationDesc, tupleid, + InplaceUpdateTupleLock); + lockedtid = *tupleid; + } + if (!table_tuple_fetch_row_version(resultRelInfo->ri_RelationDesc, + tupleid, + SnapshotAny, + resultRelInfo->ri_oldTupleSlot)) + elog(ERROR, "failed to fetch the target tuple"); + } /* - * This routine is only invoked for matched rows, and we must have found - * the tupleid of the target row in that case; fetch that tuple. + * Test the join condition. If it's satisfied, perform a MATCHED action. + * Otherwise, perform a NOT MATCHED BY SOURCE action. * - * We use SnapshotAny for this because we might get called again after - * EvalPlanQual returns us a new tuple, which may not be visible to our - * MVCC snapshot. + * Note that this join condition will be NULL if there are no NOT MATCHED + * BY SOURCE actions --- see transform_MERGE_to_join(). In that case, we + * need only consider MATCHED actions here. */ + if (ExecQual(resultRelInfo->ri_MergeJoinCondition, econtext)) + actionStates = mergeActions[MERGE_WHEN_MATCHED]; + else + actionStates = mergeActions[MERGE_WHEN_NOT_MATCHED_BY_SOURCE]; - if (!table_tuple_fetch_row_version(resultRelInfo->ri_RelationDesc, - tupleid, - SnapshotAny, - resultRelInfo->ri_oldTupleSlot)) - elog(ERROR, "failed to fetch the target tuple"); +lmerge_matched: - foreach(l, resultRelInfo->ri_matchedMergeAction) + foreach(l, actionStates) { MergeActionState *relaction = (MergeActionState *) lfirst(l); CmdType commandType = relaction->mas_action->commandType; @@ -2861,13 +2991,14 @@ ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, * UPDATE/DELETE RLS policies. If those checks fail, we throw an * error. * - * The WITH CHECK quals are applied in ExecUpdate() and hence we need - * not do anything special to handle them. + * The WITH CHECK quals for UPDATE RLS policies are applied in + * ExecUpdateAct() and hence we need not do anything special to handle + * them. * * NOTE: We must do this after WHEN quals are evaluated, so that we * check policies only when they matter. */ - if (resultRelInfo->ri_WithCheckOptions) + if (resultRelInfo->ri_WithCheckOptions && commandType != CMD_NOTHING) { ExecWithCheckOptions(commandType == CMD_UPDATE ? WCO_RLS_MERGE_UPDATE_CHECK : WCO_RLS_MERGE_DELETE_CHECK, @@ -2888,17 +3019,51 @@ ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, */ newslot = ExecProject(relaction->mas_proj); - context->relaction = relaction; + mtstate->mt_merge_action = relaction; if (!ExecUpdatePrologue(context, resultRelInfo, tupleid, NULL, newslot, &result)) { if (result == TM_Ok) - return true; /* "do nothing" */ + goto out; /* "do nothing" */ + break; /* concurrent update/delete */ } - result = ExecUpdateAct(context, resultRelInfo, tupleid, NULL, - newslot, false, &updateCxt); - if (result == TM_Ok && updateCxt.updated) + + /* INSTEAD OF ROW UPDATE Triggers */ + if (resultRelInfo->ri_TrigDesc && + resultRelInfo->ri_TrigDesc->trig_update_instead_row) + { + if (!ExecIRUpdateTriggers(estate, resultRelInfo, + oldtuple, newslot)) + goto out; /* "do nothing" */ + } + else + { + /* checked ri_needLockTagTuple above */ + Assert(oldtuple == NULL); + + result = ExecUpdateAct(context, resultRelInfo, tupleid, + NULL, newslot, canSetTag, + &updateCxt); + + /* + * As in ExecUpdate(), if ExecUpdateAct() reports that a + * cross-partition update was done, then there's nothing + * else for us to do --- the UPDATE has been turned into a + * DELETE and an INSERT, and we must not perform any of + * the usual post-update tasks. Also, the RETURNING tuple + * (if any) has been projected, so we can just return + * that. + */ + if (updateCxt.crossPartUpdate) + { + mtstate->mt_merge_updated += 1; + rslot = context->cpUpdateReturningSlot; + goto out; + } + } + + if (result == TM_Ok) { ExecUpdateEpilogue(context, &updateCxt, resultRelInfo, tupleid, NULL, newslot); @@ -2907,15 +3072,33 @@ ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, break; case CMD_DELETE: - context->relaction = relaction; + mtstate->mt_merge_action = relaction; if (!ExecDeletePrologue(context, resultRelInfo, tupleid, NULL, NULL, &result)) { if (result == TM_Ok) - return true; /* "do nothing" */ + goto out; /* "do nothing" */ + break; /* concurrent update/delete */ } - result = ExecDeleteAct(context, resultRelInfo, tupleid, false); + + /* INSTEAD OF ROW DELETE Triggers */ + if (resultRelInfo->ri_TrigDesc && + resultRelInfo->ri_TrigDesc->trig_delete_instead_row) + { + if (!ExecIRDeleteTriggers(estate, resultRelInfo, + oldtuple)) + goto out; /* "do nothing" */ + } + else + { + /* checked ri_needLockTagTuple above */ + Assert(oldtuple == NULL); + + result = ExecDeleteAct(context, resultRelInfo, tupleid, + false); + } + if (result == TM_Ok) { ExecDeleteEpilogue(context, resultRelInfo, tupleid, NULL, @@ -2930,7 +3113,7 @@ ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, break; default: - elog(ERROR, "unknown action in MERGE WHEN MATCHED clause"); + elog(ERROR, "unknown action in MERGE WHEN clause"); } switch (result) @@ -2945,8 +3128,29 @@ ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, case TM_SelfModified: /* - * The SQL standard disallows this for MERGE. + * The target tuple was already updated or deleted by the + * current command, or by a later command in the current + * transaction. The former case is explicitly disallowed by + * the SQL standard for MERGE, which insists that the MERGE + * join condition should not join a target row to more than + * one source row. + * + * The latter case arises if the tuple is modified by a + * command in a BEFORE trigger, or perhaps by a command in a + * volatile function used in the query. In such situations we + * should not ignore the MERGE action, but it is equally + * unsafe to proceed. We don't want to discard the original + * MERGE action while keeping the triggered actions based on + * it; and it would be no better to allow the original MERGE + * action while discarding the updates that it triggered. So + * throwing an error is the only safe course. */ + if (context->tmfd.cmax != estate->es_output_cid) + ereport(ERROR, + (errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION), + errmsg("tuple to be updated or deleted was already modified by an operation triggered by the current command"), + errhint("Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows."))); + if (TransactionIdIsCurrentTransactionId(context->tmfd.xmax)) ereport(ERROR, (errcode(ERRCODE_CARDINALITY_VIOLATION), @@ -2954,6 +3158,7 @@ ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, errmsg("%s command cannot affect row a second time", "MERGE"), errhint("Ensure that not more than one source row matches any one target row."))); + /* This shouldn't happen */ elog(ERROR, "attempted to update or delete invisible tuple"); break; @@ -2965,13 +3170,15 @@ ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, errmsg("could not serialize access due to concurrent delete"))); /* - * If the tuple was already deleted, return to let caller - * handle it under NOT MATCHED clauses. + * If the tuple was already deleted, set matched to false to + * let caller handle it under NOT MATCHED [BY TARGET] clauses. */ - return false; + *matched = false; + goto out; case TM_Updated: { + bool was_matched; Relation resultRelationDesc; TupleTableSlot *epqslot, *inputslot; @@ -2979,19 +3186,23 @@ ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, /* * The target tuple was concurrently updated by some other - * transaction. Run EvalPlanQual() with the new version of - * the tuple. If it does not return a tuple, then we - * switch to the NOT MATCHED list of actions. If it does - * return a tuple and the join qual is still satisfied, - * then we just need to recheck the MATCHED actions, - * starting from the top, and execute the first qualifying - * action. + * transaction. If we are currently processing a MATCHED + * action, use EvalPlanQual() with the new version of the + * tuple and recheck the join qual, to detect a change + * from the MATCHED to the NOT MATCHED cases. If we are + * already processing a NOT MATCHED BY SOURCE action, we + * skip this (cannot switch from NOT MATCHED BY SOURCE to + * MATCHED). */ + was_matched = relaction->mas_action->matchKind == MERGE_WHEN_MATCHED; resultRelationDesc = resultRelInfo->ri_RelationDesc; lockmode = ExecUpdateLockMode(estate, resultRelInfo); - inputslot = EvalPlanQualSlot(epqstate, resultRelationDesc, - resultRelInfo->ri_RangeTableIndex); + if (was_matched) + inputslot = EvalPlanQualSlot(epqstate, resultRelationDesc, + resultRelInfo->ri_RangeTableIndex); + else + inputslot = resultRelInfo->ri_oldTupleSlot; result = table_tuple_lock(resultRelationDesc, tupleid, estate->es_snapshot, @@ -3002,28 +3213,9 @@ ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, switch (result) { case TM_Ok: - epqslot = EvalPlanQual(epqstate, - resultRelationDesc, - resultRelInfo->ri_RangeTableIndex, - inputslot); /* - * If we got no tuple, or the tuple we get has a - * NULL ctid, go back to caller: this one is not a - * MATCHED tuple anymore, so they can retry with - * NOT MATCHED actions. - */ - if (TupIsNull(epqslot)) - return false; - - (void) ExecGetJunkAttribute(epqslot, - resultRelInfo->ri_RowIdAttNo, - &isNull); - if (isNull) - return false; - - /* - * When a tuple was updated and migrated to + * If the tuple was updated and migrated to * another partition concurrently, the current * MERGE implementation can't follow. There's * probably a better way to handle this case, but @@ -3034,54 +3226,118 @@ ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, if (ItemPointerIndicatesMovedPartitions(&context->tmfd.ctid)) ereport(ERROR, (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), - errmsg("tuple to be deleted was already moved to another partition due to concurrent update"))); + errmsg("tuple to be merged was already moved to another partition due to concurrent update"))); /* - * A non-NULL ctid means that we are still dealing - * with MATCHED case. Restart the loop so that we - * apply all the MATCHED rules again, to ensure - * that the first qualifying WHEN MATCHED action - * is executed. - * - * Update tupleid to that of the new tuple, for - * the refetch we do at the top. + * If this was a MATCHED case, use EvalPlanQual() + * to recheck the join condition. + */ + if (was_matched) + { + epqslot = EvalPlanQual(epqstate, + resultRelationDesc, + resultRelInfo->ri_RangeTableIndex, + inputslot); + + /* + * If the subplan didn't return a tuple, then + * we must be dealing with an inner join for + * which the join condition no longer matches. + * This can only happen if there are no NOT + * MATCHED actions, and so there is nothing + * more to do. + */ + if (TupIsNull(epqslot)) + goto out; + + /* + * If we got a NULL ctid from the subplan, the + * join quals no longer pass and we switch to + * the NOT MATCHED BY SOURCE case. + */ + (void) ExecGetJunkAttribute(epqslot, + resultRelInfo->ri_RowIdAttNo, + &isNull); + if (isNull) + *matched = false; + + /* + * Otherwise, recheck the join quals to see if + * we need to switch to the NOT MATCHED BY + * SOURCE case. + */ + if (resultRelInfo->ri_needLockTagTuple) + { + if (ItemPointerIsValid(&lockedtid)) + UnlockTuple(resultRelInfo->ri_RelationDesc, &lockedtid, + InplaceUpdateTupleLock); + LockTuple(resultRelInfo->ri_RelationDesc, &context->tmfd.ctid, + InplaceUpdateTupleLock); + lockedtid = context->tmfd.ctid; + } + if (!table_tuple_fetch_row_version(resultRelationDesc, + &context->tmfd.ctid, + SnapshotAny, + resultRelInfo->ri_oldTupleSlot)) + elog(ERROR, "failed to fetch the target tuple"); + + if (*matched) + *matched = ExecQual(resultRelInfo->ri_MergeJoinCondition, + econtext); + + /* Switch lists, if necessary */ + if (!*matched) + actionStates = mergeActions[MERGE_WHEN_NOT_MATCHED_BY_SOURCE]; + } + + /* + * Loop back and process the MATCHED or NOT + * MATCHED BY SOURCE actions from the start. */ - ItemPointerCopy(&context->tmfd.ctid, tupleid); goto lmerge_matched; case TM_Deleted: /* * tuple already deleted; tell caller to run NOT - * MATCHED actions + * MATCHED [BY TARGET] actions */ - return false; + *matched = false; + goto out; case TM_SelfModified: /* * This can be reached when following an update * chain from a tuple updated by another session, - * reaching a tuple that was already updated in - * this transaction. If previously modified by - * this command, ignore the redundant update, - * otherwise error out. - * - * See also response to TM_SelfModified in - * ExecUpdate(). + * reaching a tuple that was already updated or + * deleted by the current command, or by a later + * command in the current transaction. As above, + * this should always be treated as an error. */ if (context->tmfd.cmax != estate->es_output_cid) ereport(ERROR, (errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION), errmsg("tuple to be updated or deleted was already modified by an operation triggered by the current command"), errhint("Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows."))); - return false; + + if (TransactionIdIsCurrentTransactionId(context->tmfd.xmax)) + ereport(ERROR, + (errcode(ERRCODE_CARDINALITY_VIOLATION), + /* translator: %s is a SQL command name */ + errmsg("%s command cannot affect row a second time", + "MERGE"), + errhint("Ensure that not more than one source row matches any one target row."))); + + /* This shouldn't happen */ + elog(ERROR, "attempted to update or delete invisible tuple"); + goto out; default: /* see table_tuple_lock call in ExecDelete() */ elog(ERROR, "unexpected table_tuple_lock status: %u", result); - return false; + goto out; } } @@ -3093,6 +3349,31 @@ ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, break; } + /* Process RETURNING if present */ + if (resultRelInfo->ri_projectReturning) + { + switch (commandType) + { + case CMD_UPDATE: + rslot = ExecProcessReturning(resultRelInfo, newslot, + context->planSlot); + break; + + case CMD_DELETE: + rslot = ExecProcessReturning(resultRelInfo, + resultRelInfo->ri_oldTupleSlot, + context->planSlot); + break; + + case CMD_NOTHING: + break; + + default: + elog(ERROR, "unrecognized commandType: %d", + (int) commandType); + } + } + /* * We've activated one of the WHEN clauses, so we don't search * further. This is required behaviour, not an optimization. @@ -3103,19 +3384,24 @@ ExecMergeMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, /* * Successfully executed an action or no qualifying action was found. */ - return true; +out: + if (ItemPointerIsValid(&lockedtid)) + UnlockTuple(resultRelInfo->ri_RelationDesc, &lockedtid, + InplaceUpdateTupleLock); + return rslot; } /* - * Execute the first qualifying NOT MATCHED action. + * Execute the first qualifying NOT MATCHED [BY TARGET] action. */ -static void +static TupleTableSlot * ExecMergeNotMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, bool canSetTag) { ModifyTableState *mtstate = context->mtstate; ExprContext *econtext = mtstate->ps.ps_ExprContext; - List *actionStates = NIL; + List *actionStates; + TupleTableSlot *rslot = NULL; ListCell *l; /* @@ -3127,7 +3413,7 @@ ExecMergeNotMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, * XXX does this mean that we can avoid creating copies of actionStates on * partitioned tables, for not-matched actions? */ - actionStates = resultRelInfo->ri_notMatchedMergeAction; + actionStates = resultRelInfo->ri_MergeActions[MERGE_WHEN_NOT_MATCHED_BY_TARGET]; /* * Make source tuple available to ExecQual and ExecProject. We don't need @@ -3165,10 +3451,10 @@ ExecMergeNotMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, * so we don't need to map the tuple here. */ newslot = ExecProject(action->mas_proj); - context->relaction = action; + mtstate->mt_merge_action = action; - (void) ExecInsert(context, mtstate->rootResultRelInfo, newslot, - canSetTag, NULL, NULL); + rslot = ExecInsert(context, mtstate->rootResultRelInfo, + newslot, canSetTag, NULL, NULL); mtstate->mt_merge_inserted += 1; break; case CMD_NOTHING: @@ -3184,6 +3470,8 @@ ExecMergeNotMatched(ModifyTableContext *context, ResultRelInfo *resultRelInfo, */ break; } + + return rslot; } /* @@ -3219,9 +3507,11 @@ ExecInitMerge(ModifyTableState *mtstate, EState *estate) foreach(lc, node->mergeActionLists) { List *mergeActionList = lfirst(lc); + Node *joinCondition; TupleDesc relationDesc; ListCell *l; + joinCondition = (Node *) list_nth(node->mergeJoinConditions, i); resultRelInfo = mtstate->resultRelInfo + i; i++; relationDesc = RelationGetDescr(resultRelInfo->ri_RelationDesc); @@ -3230,13 +3520,16 @@ ExecInitMerge(ModifyTableState *mtstate, EState *estate) if (unlikely(!resultRelInfo->ri_projectNewInfoValid)) ExecInitMergeTupleSlots(mtstate, resultRelInfo); + /* initialize state for join condition checking */ + resultRelInfo->ri_MergeJoinCondition = + ExecInitQual((List *) joinCondition, &mtstate->ps); + foreach(l, mergeActionList) { MergeAction *action = (MergeAction *) lfirst(l); MergeActionState *action_state; TupleTableSlot *tgtslot; TupleDesc tgtdesc; - List **list; /* * Build action merge state for this rel. (For partitions, @@ -3248,15 +3541,12 @@ ExecInitMerge(ModifyTableState *mtstate, EState *estate) &mtstate->ps); /* - * We create two lists - one for WHEN MATCHED actions and one for - * WHEN NOT MATCHED actions - and stick the MergeActionState into - * the appropriate list. + * We create three lists - one for each MergeMatchKind - and stick + * the MergeActionState into the appropriate list. */ - if (action_state->mas_action->matched) - list = &resultRelInfo->ri_matchedMergeAction; - else - list = &resultRelInfo->ri_notMatchedMergeAction; - *list = lappend(*list, action_state); + resultRelInfo->ri_MergeActions[action->matchKind] = + lappend(resultRelInfo->ri_MergeActions[action->matchKind], + action_state); switch (action->commandType) { @@ -3330,7 +3620,7 @@ ExecInitMerge(ModifyTableState *mtstate, EState *estate) case CMD_NOTHING: break; default: - elog(ERROR, "unknown operation"); + elog(ERROR, "unknown action in MERGE WHEN clause"); break; } } @@ -3549,6 +3839,7 @@ ExecModifyTable(PlanState *pstate) HeapTupleData oldtupdata; HeapTuple oldtuple; ItemPointer tupleid; + bool tuplock; CHECK_FOR_INTERRUPTS(); @@ -3613,6 +3904,31 @@ ExecModifyTable(PlanState *pstate) if (pstate->ps_ExprContext) ResetExprContext(pstate->ps_ExprContext); + /* + * If there is a pending MERGE ... WHEN NOT MATCHED [BY TARGET] action + * to execute, do so now --- see the comments in ExecMerge(). + */ + if (node->mt_merge_pending_not_matched != NULL) + { + context.planSlot = node->mt_merge_pending_not_matched; + + slot = ExecMergeNotMatched(&context, node->resultRelInfo, + node->canSetTag); + + /* Clear the pending action */ + node->mt_merge_pending_not_matched = NULL; + + /* + * If we got a RETURNING result, return it to the caller. We'll + * continue the work on next call. + */ + if (slot) + return slot; + + continue; /* continue with the next tuple */ + } + + /* Fetch the next row from subplan */ context.planSlot = ExecProcNode(subplanstate); /* No more tuples to process? */ @@ -3646,8 +3962,17 @@ ExecModifyTable(PlanState *pstate) { EvalPlanQualSetSlot(&node->mt_epqstate, context.planSlot); - ExecMerge(&context, node->resultRelInfo, NULL, node->canSetTag); - continue; /* no RETURNING support yet */ + slot = ExecMerge(&context, node->resultRelInfo, + NULL, NULL, node->canSetTag); + + /* + * If we got a RETURNING result, return it to the caller. + * We'll continue the work on next call. + */ + if (slot) + return slot; + + continue; /* continue with the next tuple */ } elog(ERROR, "tableoid is NULL"); @@ -3724,8 +4049,17 @@ ExecModifyTable(PlanState *pstate) { EvalPlanQualSetSlot(&node->mt_epqstate, context.planSlot); - ExecMerge(&context, node->resultRelInfo, NULL, node->canSetTag); - continue; /* no RETURNING support yet */ + slot = ExecMerge(&context, node->resultRelInfo, + NULL, NULL, node->canSetTag); + + /* + * If we got a RETURNING result, return it to the + * caller. We'll continue the work on next call. + */ + if (slot) + return slot; + + continue; /* continue with the next tuple */ } elog(ERROR, "ctid is NULL"); @@ -3757,9 +4091,36 @@ ExecModifyTable(PlanState *pstate) datum = ExecGetJunkAttribute(slot, resultRelInfo->ri_RowIdAttNo, &isNull); - /* shouldn't ever get a null result... */ + + /* + * For commands other than MERGE, any tuples having a null row + * identifier are errors. For MERGE, we may need to handle + * them as WHEN NOT MATCHED clauses if any, so do that. + * + * Note that we use the node's toplevel resultRelInfo, not any + * specific partition's. + */ if (isNull) + { + if (operation == CMD_MERGE) + { + EvalPlanQualSetSlot(&node->mt_epqstate, context.planSlot); + + slot = ExecMerge(&context, node->resultRelInfo, + NULL, NULL, node->canSetTag); + + /* + * If we got a RETURNING result, return it to the + * caller. We'll continue the work on next call. + */ + if (slot) + return slot; + + continue; /* continue with the next tuple */ + } + elog(ERROR, "wholerow is NULL"); + } oldtupdata.t_data = DatumGetHeapTupleHeader(datum); oldtupdata.t_len = @@ -3791,6 +4152,8 @@ ExecModifyTable(PlanState *pstate) break; case CMD_UPDATE: + tuplock = false; + /* Initialize projection info if first time for this table */ if (unlikely(!resultRelInfo->ri_projectNewInfoValid)) ExecInitUpdateProjection(node, resultRelInfo); @@ -3802,6 +4165,7 @@ ExecModifyTable(PlanState *pstate) oldSlot = resultRelInfo->ri_oldTupleSlot; if (oldtuple != NULL) { + Assert(!resultRelInfo->ri_needLockTagTuple); /* Use the wholerow junk attr as the old tuple. */ ExecForceStoreHeapTuple(oldtuple, oldSlot, false); } @@ -3810,6 +4174,11 @@ ExecModifyTable(PlanState *pstate) /* Fetch the most recent version of old tuple. */ Relation relation = resultRelInfo->ri_RelationDesc; + if (resultRelInfo->ri_needLockTagTuple) + { + LockTuple(relation, tupleid, InplaceUpdateTupleLock); + tuplock = true; + } if (!table_tuple_fetch_row_version(relation, tupleid, SnapshotAny, oldSlot)) @@ -3817,20 +4186,23 @@ ExecModifyTable(PlanState *pstate) } slot = ExecGetUpdateNewTuple(resultRelInfo, context.planSlot, oldSlot); - context.relaction = NULL; /* Now apply the update. */ slot = ExecUpdate(&context, resultRelInfo, tupleid, oldtuple, slot, node->canSetTag); + if (tuplock) + UnlockTuple(resultRelInfo->ri_RelationDesc, tupleid, + InplaceUpdateTupleLock); break; case CMD_DELETE: slot = ExecDelete(&context, resultRelInfo, tupleid, oldtuple, - true, false, node->canSetTag, NULL, NULL); + true, false, node->canSetTag, NULL, NULL, NULL); break; case CMD_MERGE: - slot = ExecMerge(&context, resultRelInfo, tupleid, node->canSetTag); + slot = ExecMerge(&context, resultRelInfo, tupleid, oldtuple, + node->canSetTag); break; default: @@ -3953,6 +4325,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) mtstate->resultRelInfo = (ResultRelInfo *) palloc(nrels * sizeof(ResultRelInfo)); + mtstate->mt_merge_pending_not_matched = NULL; mtstate->mt_merge_inserted = 0; mtstate->mt_merge_updated = 0; mtstate->mt_merge_deleted = 0; @@ -3965,10 +4338,10 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) * must be converted, and * - the root partitioned table used for tuple routing. * - * If it's a partitioned table, the root partition doesn't appear - * elsewhere in the plan and its RT index is given explicitly in - * node->rootRelation. Otherwise (i.e. table inheritance) the target - * relation is the first relation in the node->resultRelations list. + * If it's a partitioned or inherited table, the root partition or + * appendrel RTE doesn't appear elsewhere in the plan and its RT index is + * given explicitly in node->rootRelation. Otherwise, the target relation + * is the sole relation in the node->resultRelations list. *---------- */ if (node->rootRelation > 0) @@ -3979,6 +4352,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) } else { + Assert(list_length(node->resultRelations) == 1); mtstate->rootResultRelInfo = mtstate->resultRelInfo; ExecInitResultRelation(estate, mtstate->resultRelInfo, linitial_int(node->resultRelations)); @@ -4007,6 +4381,10 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) foreach(l, node->resultRelations) { Index resultRelation = lfirst_int(l); + List *mergeActions = NIL; + + if (node->mergeActionLists) + mergeActions = list_nth(node->mergeActionLists, i); if (resultRelInfo != mtstate->rootResultRelInfo) { @@ -4028,7 +4406,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) /* * Verify result relation is a valid target for the current operation */ - CheckValidResultRel(resultRelInfo, operation); + CheckValidResultRel(resultRelInfo, operation, mergeActions); resultRelInfo++; i++; @@ -4104,8 +4482,6 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) } else { - /* No support for MERGE */ - Assert(operation != CMD_MERGE); /* Other valid target relkinds must provide wholerow */ resultRelInfo->ri_RowIdAttNo = ExecFindJunkAttributeInTlist(subplan->targetlist, @@ -4283,9 +4659,9 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) /* * If we have any secondary relations in an UPDATE or DELETE, they need to - * be treated like non-locked relations in SELECT FOR UPDATE, ie, the - * EvalPlanQual mechanism needs to be told about them. Locate the - * relevant ExecRowMarks. + * be treated like non-locked relations in SELECT FOR UPDATE, i.e., the + * EvalPlanQual mechanism needs to be told about them. This also goes for + * the source relations in a MERGE. Locate the relevant ExecRowMarks. */ arowmarks = NIL; foreach(l, node->rowMarks) @@ -4445,17 +4821,6 @@ ExecEndModifyTable(ModifyTableState *node) ExecDropSingleTupleTableSlot(node->mt_root_tuple_slot); } - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->ps); - - /* - * clean out the tuple table - */ - if (node->ps.ps_ResultTupleSlot) - ExecClearTuple(node->ps.ps_ResultTupleSlot); - /* * Terminate EPQ execution if active */ diff --git a/src/backend/executor/nodeNamedtuplestorescan.c b/src/backend/executor/nodeNamedtuplestorescan.c index 46832ad82fbcc..580f235248bf2 100644 --- a/src/backend/executor/nodeNamedtuplestorescan.c +++ b/src/backend/executor/nodeNamedtuplestorescan.c @@ -3,7 +3,7 @@ * nodeNamedtuplestorescan.c * routines to handle NamedTuplestoreScan nodes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -15,9 +15,8 @@ #include "postgres.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeNamedtuplestorescan.h" -#include "miscadmin.h" #include "utils/queryenvironment.h" static TupleTableSlot *NamedTuplestoreScanNext(NamedTuplestoreScanState *node); @@ -155,28 +154,6 @@ ExecInitNamedTuplestoreScan(NamedTuplestoreScan *node, EState *estate, int eflag return scanstate; } -/* ---------------------------------------------------------------- - * ExecEndNamedTuplestoreScan - * - * frees any storage allocated through C routines. - * ---------------------------------------------------------------- - */ -void -ExecEndNamedTuplestoreScan(NamedTuplestoreScanState *node) -{ - /* - * Free exprcontext - */ - ExecFreeExprContext(&node->ss.ps); - - /* - * clean out the tuple table - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); -} - /* ---------------------------------------------------------------- * ExecReScanNamedTuplestoreScan * diff --git a/src/backend/executor/nodeNestloop.c b/src/backend/executor/nodeNestloop.c index b3d52e69ecb70..7f4bf6c4dbb5f 100644 --- a/src/backend/executor/nodeNestloop.c +++ b/src/backend/executor/nodeNestloop.c @@ -3,7 +3,7 @@ * nodeNestloop.c * routines to support nest-loop joins * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -24,7 +24,6 @@ #include "executor/execdebug.h" #include "executor/nodeNestloop.h" #include "miscadmin.h" -#include "utils/memutils.h" /* ---------------------------------------------------------------- @@ -364,16 +363,6 @@ ExecEndNestLoop(NestLoopState *node) NL1_printf("ExecEndNestLoop: %s\n", "ending node processing"); - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->js.ps); - - /* - * clean out the tuple table - */ - ExecClearTuple(node->js.ps.ps_ResultTupleSlot); - /* * close down subplans */ diff --git a/src/backend/executor/nodeProjectSet.c b/src/backend/executor/nodeProjectSet.c index f6ff3dc44c1ca..e483730015224 100644 --- a/src/backend/executor/nodeProjectSet.c +++ b/src/backend/executor/nodeProjectSet.c @@ -11,7 +11,7 @@ * can't be inside more-complex expressions. If that'd otherwise be * the case, the planner adds additional ProjectSet nodes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -26,7 +26,6 @@ #include "executor/nodeProjectSet.h" #include "miscadmin.h" #include "nodes/nodeFuncs.h" -#include "utils/memutils.h" static TupleTableSlot *ExecProjectSRF(ProjectSetState *node, bool continuing); @@ -72,20 +71,22 @@ ExecProjectSet(PlanState *pstate) return resultSlot; } - /* - * Reset argument context to free any expression evaluation storage - * allocated in the previous tuple cycle. Note this can't happen until - * we're done projecting out tuples from a scan tuple, as ValuePerCall - * functions are allowed to reference the arguments for each returned - * tuple. - */ - MemoryContextReset(node->argcontext); - /* * Get another input tuple and project SRFs from it. */ for (;;) { + /* + * Reset argument context to free any expression evaluation storage + * allocated in the previous tuple cycle. Note this can't happen + * until we're done projecting out tuples from a scan tuple, as + * ValuePerCall functions are allowed to reference the arguments for + * each returned tuple. However, if we loop around after finding that + * no rows are produced from a scan tuple, we should reset, to avoid + * leaking memory when many successive scan tuples produce no rows. + */ + MemoryContextReset(node->argcontext); + /* * Retrieve tuples from the outer plan until there are no more. */ @@ -111,6 +112,12 @@ ExecProjectSet(PlanState *pstate) */ if (resultSlot) return resultSlot; + + /* + * When we do loop back, we'd better reset the econtext again, just in + * case the SRF leaked some memory there. + */ + ResetExprContext(econtext); } return NULL; @@ -320,16 +327,6 @@ ExecInitProjectSet(ProjectSet *node, EState *estate, int eflags) void ExecEndProjectSet(ProjectSetState *node) { - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->ps); - - /* - * clean out the tuple table - */ - ExecClearTuple(node->ps.ps_ResultTupleSlot); - /* * shut down subplans */ diff --git a/src/backend/executor/nodeRecursiveunion.c b/src/backend/executor/nodeRecursiveunion.c index e781003934129..c7f8a19fa44fc 100644 --- a/src/backend/executor/nodeRecursiveunion.c +++ b/src/backend/executor/nodeRecursiveunion.c @@ -7,7 +7,7 @@ * already seen. The hash key is computed from the grouping columns. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,7 +18,7 @@ */ #include "postgres.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeRecursiveunion.h" #include "miscadmin.h" #include "utils/memutils.h" @@ -317,7 +317,7 @@ ExecReScanRecursiveUnion(RecursiveUnionState *node) /* Release any hashtable storage */ if (node->tableContext) - MemoryContextResetAndDeleteChildren(node->tableContext); + MemoryContextReset(node->tableContext); /* Empty hashtable if needed */ if (plan->numCols > 0) diff --git a/src/backend/executor/nodeResult.c b/src/backend/executor/nodeResult.c index 4219712d306f9..348361e7f4431 100644 --- a/src/backend/executor/nodeResult.c +++ b/src/backend/executor/nodeResult.c @@ -34,7 +34,7 @@ * plan normally and pass back the results. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -48,7 +48,6 @@ #include "executor/executor.h" #include "executor/nodeResult.h" #include "miscadmin.h" -#include "utils/memutils.h" /* ---------------------------------------------------------------- @@ -240,16 +239,6 @@ ExecInitResult(Result *node, EState *estate, int eflags) void ExecEndResult(ResultState *node) { - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->ps); - - /* - * clean out the tuple table - */ - ExecClearTuple(node->ps.ps_ResultTupleSlot); - /* * shut down subplans */ diff --git a/src/backend/executor/nodeSamplescan.c b/src/backend/executor/nodeSamplescan.c index d7e22b1dbbaeb..714b076e64689 100644 --- a/src/backend/executor/nodeSamplescan.c +++ b/src/backend/executor/nodeSamplescan.c @@ -3,7 +3,7 @@ * nodeSamplescan.c * Support routines for sample scans of relations (table sampling). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -20,11 +20,7 @@ #include "common/pg_prng.h" #include "executor/executor.h" #include "executor/nodeSamplescan.h" -#include "miscadmin.h" -#include "pgstat.h" -#include "storage/bufmgr.h" -#include "storage/predicate.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/rel.h" static TupleTableSlot *SampleNext(SampleScanState *node); @@ -188,18 +184,6 @@ ExecEndSampleScan(SampleScanState *node) if (node->tsmroutine->EndSampleScan) node->tsmroutine->EndSampleScan(node); - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->ss.ps); - - /* - * clean out the tuple table - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); - /* * close heap scan */ diff --git a/src/backend/executor/nodeSeqscan.c b/src/backend/executor/nodeSeqscan.c index 4da0f28f7baa6..7cb12a11c2d84 100644 --- a/src/backend/executor/nodeSeqscan.c +++ b/src/backend/executor/nodeSeqscan.c @@ -3,7 +3,7 @@ * nodeSeqscan.c * Support routines for sequential scans of relations. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -29,7 +29,7 @@ #include "access/relscan.h" #include "access/tableam.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeSeqscan.h" #include "utils/rel.h" @@ -190,18 +190,6 @@ ExecEndSeqScan(SeqScanState *node) */ scanDesc = node->ss.ss_currentScanDesc; - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->ss.ps); - - /* - * clean out the tuple table - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); - /* * close heap scan */ diff --git a/src/backend/executor/nodeSetOp.c b/src/backend/executor/nodeSetOp.c index 4bc2406b89817..a8ac68b482601 100644 --- a/src/backend/executor/nodeSetOp.c +++ b/src/backend/executor/nodeSetOp.c @@ -32,7 +32,7 @@ * input group. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -582,13 +582,9 @@ ExecInitSetOp(SetOp *node, EState *estate, int eflags) void ExecEndSetOp(SetOpState *node) { - /* clean up tuple table */ - ExecClearTuple(node->ps.ps_ResultTupleSlot); - /* free subsidiary stuff including hashtable */ if (node->tableContext) MemoryContextDelete(node->tableContext); - ExecFreeExprContext(&node->ps); ExecEndNode(outerPlanState(node)); } @@ -635,7 +631,7 @@ ExecReScanSetOp(SetOpState *node) /* Release any hashtable storage */ if (node->tableContext) - MemoryContextResetAndDeleteChildren(node->tableContext); + MemoryContextReset(node->tableContext); /* And rebuild empty hashtable if needed */ if (((SetOp *) node->ps.plan)->strategy == SETOP_HASHED) diff --git a/src/backend/executor/nodeSort.c b/src/backend/executor/nodeSort.c index c6c72c6e67852..3fc925d7b48e5 100644 --- a/src/backend/executor/nodeSort.c +++ b/src/backend/executor/nodeSort.c @@ -3,7 +3,7 @@ * nodeSort.c * Routines to handle sorting of relations. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -303,13 +303,6 @@ ExecEndSort(SortState *node) SO1_printf("ExecEndSort: %s\n", "shutting down sort node"); - /* - * clean out the tuple table - */ - ExecClearTuple(node->ss.ss_ScanTupleSlot); - /* must drop pointer to sort result tuple */ - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - /* * Release tuplesort resources */ diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c index c136f75ac2493..9697b1f396d56 100644 --- a/src/backend/executor/nodeSubplan.c +++ b/src/backend/executor/nodeSubplan.c @@ -11,7 +11,7 @@ * subplans, which are re-evaluated every time their result is required. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/executor/nodeSubqueryscan.c b/src/backend/executor/nodeSubqueryscan.c index 42471bfc041c7..782097eaf296e 100644 --- a/src/backend/executor/nodeSubqueryscan.c +++ b/src/backend/executor/nodeSubqueryscan.c @@ -7,7 +7,7 @@ * we need two sets of code. Ought to look at trying to unify the cases. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -27,7 +27,7 @@ */ #include "postgres.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeSubqueryscan.h" static TupleTableSlot *SubqueryNext(SubqueryScanState *node); @@ -167,18 +167,6 @@ ExecInitSubqueryScan(SubqueryScan *node, EState *estate, int eflags) void ExecEndSubqueryScan(SubqueryScanState *node) { - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->ss.ps); - - /* - * clean out the upper tuple table - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); - /* * close down subquery */ diff --git a/src/backend/executor/nodeTableFuncscan.c b/src/backend/executor/nodeTableFuncscan.c index 791cbd2372400..f483221bb8efe 100644 --- a/src/backend/executor/nodeTableFuncscan.c +++ b/src/backend/executor/nodeTableFuncscan.c @@ -3,7 +3,7 @@ * nodeTableFuncscan.c * Support routines for scanning RangeTableFunc (XMLTABLE like functions). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -28,6 +28,7 @@ #include "miscadmin.h" #include "nodes/execnodes.h" #include "utils/builtins.h" +#include "utils/jsonpath.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/xml.h" @@ -161,8 +162,9 @@ ExecInitTableFuncScan(TableFuncScan *node, EState *estate, int eflags) scanstate->ss.ps.qual = ExecInitQual(node->scan.plan.qual, &scanstate->ss.ps); - /* Only XMLTABLE is supported currently */ - scanstate->routine = &XmlTableRoutine; + /* Only XMLTABLE and JSON_TABLE are supported currently */ + scanstate->routine = + tf->functype == TFT_XMLTABLE ? &XmlTableRoutine : &JsonbTableRoutine; scanstate->perTableCxt = AllocSetContextCreate(CurrentMemoryContext, @@ -182,6 +184,10 @@ ExecInitTableFuncScan(TableFuncScan *node, EState *estate, int eflags) ExecInitExprList(tf->colexprs, (PlanState *) scanstate); scanstate->coldefexprs = ExecInitExprList(tf->coldefexprs, (PlanState *) scanstate); + scanstate->colvalexprs = + ExecInitExprList(tf->colvalexprs, (PlanState *) scanstate); + scanstate->passingvalexprs = + ExecInitExprList(tf->passingvalexprs, (PlanState *) scanstate); scanstate->notnulls = tf->notnulls; @@ -213,18 +219,6 @@ ExecInitTableFuncScan(TableFuncScan *node, EState *estate, int eflags) void ExecEndTableFuncScan(TableFuncScanState *node) { - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->ss.ps); - - /* - * clean out the tuple table - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); - /* * Release tuplestore resources */ @@ -286,11 +280,12 @@ tfuncFetchRows(TableFuncScanState *tstate, ExprContext *econtext) /* * Each call to fetch a new set of rows - of which there may be very many - * if XMLTABLE is being used in a lateral join - will allocate a possibly - * substantial amount of memory, so we cannot use the per-query context - * here. perTableCxt now serves the same function as "argcontext" does in - * FunctionScan - a place to store per-one-call (i.e. one result table) - * lifetime data (as opposed to per-query or per-result-tuple). + * if XMLTABLE or JSON_TABLE is being used in a lateral join - will + * allocate a possibly substantial amount of memory, so we cannot use the + * per-query context here. perTableCxt now serves the same function as + * "argcontext" does in FunctionScan - a place to store per-one-call (i.e. + * one result table) lifetime data (as opposed to per-query or + * per-result-tuple). */ MemoryContextSwitchTo(tstate->perTableCxt); @@ -381,14 +376,20 @@ tfuncInitialize(TableFuncScanState *tstate, ExprContext *econtext, Datum doc) routine->SetNamespace(tstate, ns_name, ns_uri); } - /* Install the row filter expression into the table builder context */ - value = ExecEvalExpr(tstate->rowexpr, econtext, &isnull); - if (isnull) - ereport(ERROR, - (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), - errmsg("row filter expression must not be null"))); + /* + * Install the row filter expression, if any, into the table builder + * context. + */ + if (routine->SetRowFilter) + { + value = ExecEvalExpr(tstate->rowexpr, econtext, &isnull); + if (isnull) + ereport(ERROR, + (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), + errmsg("row filter expression must not be null"))); - routine->SetRowFilter(tstate, TextDatumGetCString(value)); + routine->SetRowFilter(tstate, TextDatumGetCString(value)); + } /* * Install the column filter expressions into the table builder context. diff --git a/src/backend/executor/nodeTidrangescan.c b/src/backend/executor/nodeTidrangescan.c index 2124c55ef53ec..9aa7683d7e373 100644 --- a/src/backend/executor/nodeTidrangescan.c +++ b/src/backend/executor/nodeTidrangescan.c @@ -3,7 +3,7 @@ * nodeTidrangescan.c * Routines to support TID range scans of relations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,10 +18,9 @@ #include "access/sysattr.h" #include "access/tableam.h" #include "catalog/pg_operator.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeTidrangescan.h" #include "nodes/nodeFuncs.h" -#include "storage/bufmgr.h" #include "utils/rel.h" @@ -39,7 +38,7 @@ typedef enum { TIDEXPR_UPPER_BOUND, - TIDEXPR_LOWER_BOUND + TIDEXPR_LOWER_BOUND, } TidExprType; /* Upper or lower range bound for scan */ @@ -331,18 +330,6 @@ ExecEndTidRangeScan(TidRangeScanState *node) if (scan != NULL) table_endscan(scan); - - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->ss.ps); - - /* - * clear out tuple table slots - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); } /* ---------------------------------------------------------------- diff --git a/src/backend/executor/nodeTidscan.c b/src/backend/executor/nodeTidscan.c index 862bd0330bc7b..864a9013b624c 100644 --- a/src/backend/executor/nodeTidscan.c +++ b/src/backend/executor/nodeTidscan.c @@ -3,7 +3,7 @@ * nodeTidscan.c * Routines to support direct tid scans of relations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,12 +25,11 @@ #include "access/sysattr.h" #include "access/tableam.h" #include "catalog/pg_type.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeTidscan.h" #include "lib/qunique.h" #include "miscadmin.h" #include "nodes/nodeFuncs.h" -#include "storage/bufmgr.h" #include "utils/array.h" #include "utils/rel.h" @@ -472,18 +471,6 @@ ExecEndTidScan(TidScanState *node) { if (node->ss.ss_currentScanDesc) table_endscan(node->ss.ss_currentScanDesc); - - /* - * Free the exprcontext - */ - ExecFreeExprContext(&node->ss.ps); - - /* - * clear out tuple table slots - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); } /* ---------------------------------------------------------------- diff --git a/src/backend/executor/nodeUnique.c b/src/backend/executor/nodeUnique.c index 45035d74fa719..a125923e9359f 100644 --- a/src/backend/executor/nodeUnique.c +++ b/src/backend/executor/nodeUnique.c @@ -11,7 +11,7 @@ * (It's debatable whether the savings justifies carrying two plan node * types, though.) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -36,7 +36,6 @@ #include "executor/executor.h" #include "executor/nodeUnique.h" #include "miscadmin.h" -#include "utils/memutils.h" /* ---------------------------------------------------------------- @@ -168,11 +167,6 @@ ExecInitUnique(Unique *node, EState *estate, int eflags) void ExecEndUnique(UniqueState *node) { - /* clean up tuple table */ - ExecClearTuple(node->ps.ps_ResultTupleSlot); - - ExecFreeExprContext(&node->ps); - ExecEndNode(outerPlanState(node)); } diff --git a/src/backend/executor/nodeValuesscan.c b/src/backend/executor/nodeValuesscan.c index 32ace6301754c..92948917a08b4 100644 --- a/src/backend/executor/nodeValuesscan.c +++ b/src/backend/executor/nodeValuesscan.c @@ -4,7 +4,7 @@ * Support routines for scanning Values lists * ("VALUES (...), (...), ..." in rangetable). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,7 +18,6 @@ * ExecValuesScan scans a values list. * ExecValuesNext retrieve next tuple in sequential order. * ExecInitValuesScan creates and initializes a valuesscan node. - * ExecEndValuesScan releases any storage allocated. * ExecReScanValuesScan rescans the values list */ #include "postgres.h" @@ -319,30 +318,6 @@ ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags) return scanstate; } -/* ---------------------------------------------------------------- - * ExecEndValuesScan - * - * frees any storage allocated through C routines. - * ---------------------------------------------------------------- - */ -void -ExecEndValuesScan(ValuesScanState *node) -{ - /* - * Free both exprcontexts - */ - ExecFreeExprContext(&node->ss.ps); - node->ss.ps.ps_ExprContext = node->rowcontext; - ExecFreeExprContext(&node->ss.ps); - - /* - * clean out the tuple table - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); -} - /* ---------------------------------------------------------------- * ExecReScanValuesScan * diff --git a/src/backend/executor/nodeWindowAgg.c b/src/backend/executor/nodeWindowAgg.c index 310ac23e3a134..96c117c546775 100644 --- a/src/backend/executor/nodeWindowAgg.c +++ b/src/backend/executor/nodeWindowAgg.c @@ -23,7 +23,7 @@ * aggregate function over all rows in the current row's window frame. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -216,7 +216,7 @@ initialize_windowaggregate(WindowAggState *winstate, * it, so we must leave it to the caller to reset at an appropriate time. */ if (peraggstate->aggcontext != winstate->aggcontext) - MemoryContextResetAndDeleteChildren(peraggstate->aggcontext); + MemoryContextReset(peraggstate->aggcontext); if (peraggstate->initValueIsNull) peraggstate->transValue = peraggstate->initValue; @@ -875,7 +875,7 @@ eval_windowaggregates(WindowAggState *winstate) * result for it, else we'll leak memory. */ if (numaggs_restart > 0) - MemoryContextResetAndDeleteChildren(winstate->aggcontext); + MemoryContextReset(winstate->aggcontext); for (i = 0; i < numaggs; i++) { peraggstate = &winstate->peragg[i]; @@ -1351,12 +1351,12 @@ release_partition(WindowAggState *winstate) * any aggregate temp data). We don't rely on retail pfree because some * aggregates might have allocated data we don't have direct pointers to. */ - MemoryContextResetAndDeleteChildren(winstate->partcontext); - MemoryContextResetAndDeleteChildren(winstate->aggcontext); + MemoryContextReset(winstate->partcontext); + MemoryContextReset(winstate->aggcontext); for (i = 0; i < winstate->numaggs; i++) { if (winstate->peragg[i].aggcontext != winstate->aggcontext) - MemoryContextResetAndDeleteChildren(winstate->peragg[i].aggcontext); + MemoryContextReset(winstate->peragg[i].aggcontext); } if (winstate->buffer) @@ -2296,6 +2296,23 @@ ExecWindowAgg(PlanState *pstate) */ if (winstate->use_pass_through) { + /* + * When switching into a pass-through mode, we'd better + * NULLify the aggregate results as these are no longer + * updated and NULLifying them avoids the old stale + * results lingering. Some of these might be byref types + * so we can't have them pointing to free'd memory. The + * planner insisted that quals used in the runcondition + * are strict, so the top-level WindowAgg will always + * filter these NULLs out in the filter clause. + */ + numfuncs = winstate->numfuncs; + for (i = 0; i < numfuncs; i++) + { + econtext->ecxt_aggvalues[i] = (Datum) 0; + econtext->ecxt_aggnulls[i] = true; + } + /* * STRICT pass-through mode is required for the top window * when there is a PARTITION BY clause. Otherwise we must @@ -2310,24 +2327,6 @@ ExecWindowAgg(PlanState *pstate) else { winstate->status = WINDOWAGG_PASSTHROUGH; - - /* - * If we're not the top-window, we'd better NULLify - * the aggregate results. In pass-through mode we no - * longer update these and this avoids the old stale - * results lingering. Some of these might be byref - * types so we can't have them pointing to free'd - * memory. The planner insisted that quals used in - * the runcondition are strict, so the top-level - * WindowAgg will filter these NULLs out in the filter - * clause. - */ - numfuncs = winstate->numfuncs; - for (i = 0; i < numfuncs; i++) - { - econtext->ecxt_aggvalues[i] = (Datum) 0; - econtext->ecxt_aggnulls[i] = true; - } } } else @@ -2399,6 +2398,9 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags) winstate->ss.ps.state = estate; winstate->ss.ps.ExecProcNode = ExecWindowAgg; + /* copy frame options to state node for easy access */ + winstate->frameOptions = frameOptions; + /* * Create expression contexts. We need two, one for per-input-tuple * processing and one for per-output-tuple processing. We cheat a little @@ -2649,9 +2651,6 @@ ExecInitWindowAgg(WindowAgg *node, EState *estate, int eflags) /* Set the status to running */ winstate->status = WINDOWAGG_RUN; - /* copy frame options to state node for easy access */ - winstate->frameOptions = frameOptions; - /* initialize frame bound offset expressions */ winstate->startOffset = ExecInitExpr((Expr *) node->startOffset, (PlanState *) winstate); @@ -2686,23 +2685,6 @@ ExecEndWindowAgg(WindowAggState *node) release_partition(node); - ExecClearTuple(node->ss.ss_ScanTupleSlot); - ExecClearTuple(node->first_part_slot); - ExecClearTuple(node->agg_row_slot); - ExecClearTuple(node->temp_slot_1); - ExecClearTuple(node->temp_slot_2); - if (node->framehead_slot) - ExecClearTuple(node->framehead_slot); - if (node->frametail_slot) - ExecClearTuple(node->frametail_slot); - - /* - * Free both the expr contexts. - */ - ExecFreeExprContext(&node->ss.ps); - node->ss.ps.ps_ExprContext = node->tmpcontext; - ExecFreeExprContext(&node->ss.ps); - for (i = 0; i < node->numaggs; i++) { if (node->peragg[i].aggcontext != node->aggcontext) @@ -2802,7 +2784,7 @@ initialize_peragg(WindowAggState *winstate, WindowFunc *wfunc, /* * Figure out whether we want to use the moving-aggregate implementation, - * and collect the right set of fields from the pg_attribute entry. + * and collect the right set of fields from the pg_aggregate entry. * * It's possible that an aggregate would supply a safe moving-aggregate * implementation and an unsafe normal one, in which case our hand is diff --git a/src/backend/executor/nodeWorktablescan.c b/src/backend/executor/nodeWorktablescan.c index 0c13448236a80..3f883d8ff6638 100644 --- a/src/backend/executor/nodeWorktablescan.c +++ b/src/backend/executor/nodeWorktablescan.c @@ -3,7 +3,7 @@ * nodeWorktablescan.c * routines to handle WorkTableScan nodes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -15,7 +15,7 @@ #include "postgres.h" -#include "executor/execdebug.h" +#include "executor/executor.h" #include "executor/nodeWorktablescan.h" static TupleTableSlot *WorkTableScanNext(WorkTableScanState *node); @@ -181,28 +181,6 @@ ExecInitWorkTableScan(WorkTableScan *node, EState *estate, int eflags) return scanstate; } -/* ---------------------------------------------------------------- - * ExecEndWorkTableScan - * - * frees any storage allocated through C routines. - * ---------------------------------------------------------------- - */ -void -ExecEndWorkTableScan(WorkTableScanState *node) -{ - /* - * Free exprcontext - */ - ExecFreeExprContext(&node->ss.ps); - - /* - * clean out the tuple table - */ - if (node->ss.ps.ps_ResultTupleSlot) - ExecClearTuple(node->ss.ps.ps_ResultTupleSlot); - ExecClearTuple(node->ss.ss_ScanTupleSlot); -} - /* ---------------------------------------------------------------- * ExecReScanWorkTableScan * diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index 33975687b3828..cf07d47e958f3 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -3,7 +3,7 @@ * spi.c * Server Programming Interface * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,7 +23,6 @@ #include "commands/trigger.h" #include "executor/executor.h" #include "executor/spi_priv.h" -#include "miscadmin.h" #include "tcop/pquery.h" #include "tcop/utility.h" #include "utils/builtins.h" @@ -335,13 +334,13 @@ _SPI_rollback(bool chain) MemoryContext oldcontext = CurrentMemoryContext; SavedTransactionCharacteristics savetc; - /* see under SPI_commit() */ + /* see comments in _SPI_commit() */ if (_SPI_current->atomic) ereport(ERROR, (errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION), errmsg("invalid transaction termination"))); - /* see under SPI_commit() */ + /* see comments in _SPI_commit() */ if (IsSubTransaction()) ereport(ERROR, (errcode(ERRCODE_INVALID_TRANSACTION_TERMINATION), @@ -547,7 +546,7 @@ AtEOSubXact_SPI(bool isCommit, SubTransactionId mySubid) if (_SPI_current->execSubid >= mySubid) { _SPI_current->execSubid = InvalidSubTransactionId; - MemoryContextResetAndDeleteChildren(_SPI_current->execCxt); + MemoryContextReset(_SPI_current->execCxt); } /* throw away any tuple tables created within current subxact */ @@ -583,8 +582,11 @@ SPI_inside_nonatomic_context(void) { if (_SPI_current == NULL) return false; /* not in any SPI context at all */ + /* these tests must match _SPI_commit's opinion of what's atomic: */ if (_SPI_current->atomic) return false; /* it's atomic (ie function not procedure) */ + if (IsSubTransaction()) + return false; /* if within subtransaction, it's atomic */ return true; } @@ -2033,6 +2035,8 @@ SPI_result_code_string(int code) return "SPI_OK_TD_REGISTER"; case SPI_OK_MERGE: return "SPI_OK_MERGE"; + case SPI_OK_MERGE_RETURNING: + return "SPI_OK_MERGE_RETURNING"; } /* Unrecognized code ... return something useful ... */ sprintf(buf, "Unrecognized SPI code %d", code); @@ -2043,6 +2047,8 @@ SPI_result_code_string(int code) * SPI_plan_get_plan_sources --- get a SPI plan's underlying list of * CachedPlanSources. * + * CAUTION: there is no check on whether the CachedPlanSources are up-to-date. + * * This is exported so that PL/pgSQL can use it (this beats letting PL/pgSQL * look directly into the SPIPlan for itself). It's not documented in * spi.sgml because we'd just as soon not have too many places using this. @@ -2398,6 +2404,7 @@ _SPI_execute_plan(SPIPlanPtr plan, const SPIExecuteOptions *options, uint64 my_processed = 0; SPITupleTable *my_tuptable = NULL; int res = 0; + bool allow_nonatomic; bool pushed_active_snap = false; ResourceOwner plan_owner = options->owner; SPICallbackArg spicallbackarg; @@ -2405,6 +2412,15 @@ _SPI_execute_plan(SPIPlanPtr plan, const SPIExecuteOptions *options, CachedPlan *cplan = NULL; ListCell *lc1; + /* + * We allow nonatomic behavior only if options->allow_nonatomic is set + * *and* the SPI_OPT_NONATOMIC flag was given when connecting and we are + * not inside a subtransaction. The latter two tests match whether + * _SPI_commit() would allow a commit; see there for more commentary. + */ + allow_nonatomic = options->allow_nonatomic && + !_SPI_current->atomic && !IsSubTransaction(); + /* * Setup error traceback support for ereport() */ @@ -2424,12 +2440,17 @@ _SPI_execute_plan(SPIPlanPtr plan, const SPIExecuteOptions *options, * snapshot != InvalidSnapshot, read_only = false: use the given snapshot, * modified by advancing its command ID before each querytree. * - * snapshot == InvalidSnapshot, read_only = true: use the entry-time - * ActiveSnapshot, if any (if there isn't one, we run with no snapshot). + * snapshot == InvalidSnapshot, read_only = true: do nothing for queries + * that require no snapshot. For those that do, ensure that a Portal + * snapshot exists; then use that, or use the entry-time ActiveSnapshot if + * that exists and is different. * - * snapshot == InvalidSnapshot, read_only = false: take a full new - * snapshot for each user command, and advance its command ID before each - * querytree within the command. + * snapshot == InvalidSnapshot, read_only = false: do nothing for queries + * that require no snapshot. For those that do, ensure that a Portal + * snapshot exists; then, in atomic execution (!allow_nonatomic) take a + * full new snapshot for each user command, and advance its command ID + * before each querytree within the command. In allow_nonatomic mode we + * just use the Portal snapshot unmodified. * * In the first two cases, we can just push the snap onto the stack once * for the whole plan list. @@ -2439,6 +2460,7 @@ _SPI_execute_plan(SPIPlanPtr plan, const SPIExecuteOptions *options, */ if (snapshot != InvalidSnapshot) { + /* this intentionally tests the options field not the derived value */ Assert(!options->allow_nonatomic); if (options->read_only) { @@ -2584,7 +2606,7 @@ _SPI_execute_plan(SPIPlanPtr plan, const SPIExecuteOptions *options, * Skip it when doing non-atomic execution, though (we rely * entirely on the Portal snapshot in that case). */ - if (!options->read_only && !options->allow_nonatomic) + if (!options->read_only && !allow_nonatomic) { if (pushed_active_snap) PopActiveSnapshot(); @@ -2684,14 +2706,13 @@ _SPI_execute_plan(SPIPlanPtr plan, const SPIExecuteOptions *options, QueryCompletion qc; /* - * If the SPI context is atomic, or we were not told to allow - * nonatomic operations, tell ProcessUtility this is an atomic - * execution context. + * If we're not allowing nonatomic operations, tell + * ProcessUtility this is an atomic execution context. */ - if (_SPI_current->atomic || !options->allow_nonatomic) - context = PROCESS_UTILITY_QUERY; - else + if (allow_nonatomic) context = PROCESS_UTILITY_QUERY_NONATOMIC; + else + context = PROCESS_UTILITY_QUERY; InitializeQueryCompletion(&qc); ProcessUtility(stmt, @@ -2886,7 +2907,10 @@ _SPI_pquery(QueryDesc *queryDesc, bool fire_triggers, uint64 tcount) res = SPI_OK_UPDATE; break; case CMD_MERGE: - res = SPI_OK_MERGE; + if (queryDesc->plannedstmt->hasReturning) + res = SPI_OK_MERGE_RETURNING; + else + res = SPI_OK_MERGE; break; default: return SPI_ERROR_OPUNKNOWN; @@ -3083,7 +3107,7 @@ _SPI_end_call(bool use_exec) /* mark Executor context no longer in use */ _SPI_current->execSubid = InvalidSubTransactionId; /* and free Executor memory */ - MemoryContextResetAndDeleteChildren(_SPI_current->execCxt); + MemoryContextReset(_SPI_current->execCxt); } return 0; diff --git a/src/backend/executor/tqueue.c b/src/backend/executor/tqueue.c index efaa3114a441a..ae3ef69ca9f73 100644 --- a/src/backend/executor/tqueue.c +++ b/src/backend/executor/tqueue.c @@ -8,7 +8,7 @@ * * A TupleQueueReader reads tuples from a shm_mq and returns the tuples. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/executor/tstoreReceiver.c b/src/backend/executor/tstoreReceiver.c index b54bac7241d79..de4646b5c26ef 100644 --- a/src/backend/executor/tstoreReceiver.c +++ b/src/backend/executor/tstoreReceiver.c @@ -11,7 +11,7 @@ * Also optionally, we can apply a tuple conversion map before storing. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/foreign/foreign.c b/src/backend/foreign/foreign.c index ca3ad55b628f1..bb67d9f92b8a7 100644 --- a/src/backend/foreign/foreign.c +++ b/src/backend/foreign/foreign.c @@ -3,7 +3,7 @@ * foreign.c * support for foreign-data wrappers, servers and user mappings. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/foreign/foreign.c @@ -21,8 +21,8 @@ #include "foreign/fdwapi.h" #include "foreign/foreign.h" #include "funcapi.h" -#include "lib/stringinfo.h" #include "miscadmin.h" +#include "tcop/tcopprot.h" #include "utils/builtins.h" #include "utils/memutils.h" #include "utils/rel.h" @@ -217,10 +217,14 @@ GetUserMapping(Oid userid, Oid serverid) } if (!HeapTupleIsValid(tp)) + { + ForeignServer *server = GetForeignServer(serverid); + ereport(ERROR, (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("user mapping not found for \"%s\"", - MappingUserName(userid)))); + errmsg("user mapping not found for user \"%s\", server \"%s\"", + MappingUserName(userid), server->servername))); + } um = (UserMapping *) palloc(sizeof(UserMapping)); um->umid = ((Form_pg_user_mapping) GETSTRUCT(tp))->oid; @@ -323,6 +327,15 @@ GetFdwRoutine(Oid fdwhandler) Datum datum; FdwRoutine *routine; + /* Check if the access to foreign tables is restricted */ + if (unlikely((restrict_nonsystem_relation_kind & RESTRICT_RELKIND_FOREIGN_TABLE) != 0)) + { + /* there must not be built-in FDW handler */ + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("access to non-system foreign table is restricted"))); + } + datum = OidFunctionCall0(fdwhandler); routine = (FdwRoutine *) DatumGetPointer(datum); diff --git a/src/backend/foreign/meson.build b/src/backend/foreign/meson.build index 6638a6a5d874d..dc511867ab494 100644 --- a/src/backend/foreign/meson.build +++ b/src/backend/foreign/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'foreign.c' diff --git a/src/backend/jit/jit.c b/src/backend/jit/jit.c index fd1cf184c8e58..815b58f33c547 100644 --- a/src/backend/jit/jit.c +++ b/src/backend/jit/jit.c @@ -8,7 +8,7 @@ * should end up here. * * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/jit/jit.c @@ -21,12 +21,12 @@ #include #include -#include "executor/execExpr.h" #include "fmgr.h" #include "jit/jit.h" #include "miscadmin.h" +#include "nodes/execnodes.h" +#include "portability/instr_time.h" #include "utils/fmgrprotos.h" -#include "utils/resowner_private.h" /* GUCs */ bool jit_enabled = true; @@ -46,7 +46,6 @@ static bool provider_failed_loading = false; static bool provider_init(void); -static bool file_exists(const char *name); /* @@ -90,7 +89,7 @@ provider_init(void) */ snprintf(path, MAXPGPATH, "%s/%s%s", pkglib_path, jit_provider, DLSUFFIX); elog(DEBUG1, "probing availability of JIT provider at %s", path); - if (!file_exists(path)) + if (!pg_file_exists(path)) { elog(DEBUG1, "provider not available, disabling JIT for current session"); @@ -140,7 +139,6 @@ jit_release_context(JitContext *context) if (provider_successfully_loaded) provider.release_context(context); - ResourceOwnerForgetJIT(context->resowner, PointerGetDatum(context)); pfree(context); } @@ -185,24 +183,8 @@ InstrJitAgg(JitInstrumentation *dst, JitInstrumentation *add) { dst->created_functions += add->created_functions; INSTR_TIME_ADD(dst->generation_counter, add->generation_counter); + INSTR_TIME_ADD(dst->deform_counter, add->deform_counter); INSTR_TIME_ADD(dst->inlining_counter, add->inlining_counter); INSTR_TIME_ADD(dst->optimization_counter, add->optimization_counter); INSTR_TIME_ADD(dst->emission_counter, add->emission_counter); } - -static bool -file_exists(const char *name) -{ - struct stat st; - - Assert(name != NULL); - - if (stat(name, &st) == 0) - return !S_ISDIR(st.st_mode); - else if (!(errno == ENOENT || errno == ENOTDIR)) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not access file \"%s\": %m", name))); - - return false; -} diff --git a/src/backend/jit/llvm/Makefile b/src/backend/jit/llvm/Makefile index 2da122a391e58..e9fd195cc227c 100644 --- a/src/backend/jit/llvm/Makefile +++ b/src/backend/jit/llvm/Makefile @@ -47,7 +47,8 @@ OBJS += \ llvmjit.o \ llvmjit_error.o \ llvmjit_inline.o \ - llvmjit_wrap.o + llvmjit_wrap.o \ + SectionMemoryManager.o # Code generation OBJS += \ @@ -71,6 +72,6 @@ uninstall-types: include $(top_srcdir)/src/Makefile.shlib -clean distclean maintainer-clean: clean-lib +clean distclean: clean-lib rm -f $(OBJS) rm -f llvmjit_types.bc diff --git a/src/backend/jit/llvm/SectionMemoryManager.LICENSE b/src/backend/jit/llvm/SectionMemoryManager.LICENSE new file mode 100644 index 0000000000000..fa6ac54000703 --- /dev/null +++ b/src/backend/jit/llvm/SectionMemoryManager.LICENSE @@ -0,0 +1,279 @@ +============================================================================== +The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: +============================================================================== + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +---- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. + +============================================================================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + diff --git a/src/backend/jit/llvm/SectionMemoryManager.cpp b/src/backend/jit/llvm/SectionMemoryManager.cpp new file mode 100644 index 0000000000000..c4fbf15a961c2 --- /dev/null +++ b/src/backend/jit/llvm/SectionMemoryManager.cpp @@ -0,0 +1,412 @@ +/* + * This file is from https://github.com/llvm/llvm-project/pull/71968 + * with minor modifications to avoid name clash and work with older + * LLVM versions. The llvm::backport::SectionMemoryManager class is a + * drop-in replacement for llvm::SectionMemoryManager, for use with + * llvm::RuntimeDyld. It fixes a memory layout bug on large memory + * ARM systems (see pull request for details). If the LLVM project + * eventually commits the change, we may need to resynchronize our + * copy with any further modifications, but they would be unlikely to + * backport it into the LLVM versions that we target so we would still + * need this copy. + * + * In the future we will switch to using JITLink instead of + * RuntimeDyld where possible, and later remove this code (.cpp, .h, + * .LICENSE) after all LLVM versions that we target allow it. + * + * This file is a modified copy of a part of the LLVM source code that + * we would normally access from the LLVM library. It is therefore + * covered by the license at https://llvm.org/LICENSE.txt, reproduced + * verbatim in SectionMemoryManager.LICENSE in fulfillment of clause + * 4a. The bugfix changes from the pull request are also covered, per + * clause 5. + */ + +//===- SectionMemoryManager.cpp - Memory manager for MCJIT/RtDyld *- C++ -*-==// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements the section-based memory manager used by the MCJIT +// execution engine and RuntimeDyld +// +//===----------------------------------------------------------------------===// + +#include "jit/llvmjit_backport.h" + +#ifdef USE_LLVM_BACKPORT_SECTION_MEMORY_MANAGER + +#include "jit/SectionMemoryManager.h" +#include "llvm/Support/MathExtras.h" +#include "llvm/Support/Process.h" + +namespace llvm { +namespace backport { + +bool SectionMemoryManager::hasSpace(const MemoryGroup &MemGroup, + uintptr_t Size) const { + for (const FreeMemBlock &FreeMB : MemGroup.FreeMem) { + if (FreeMB.Free.allocatedSize() >= Size) + return true; + } + return false; +} + +#if LLVM_VERSION_MAJOR < 16 +void SectionMemoryManager::reserveAllocationSpace(uintptr_t CodeSize, + uint32_t CodeAlign_i, + uintptr_t RODataSize, + uint32_t RODataAlign_i, + uintptr_t RWDataSize, + uint32_t RWDataAlign_i) { + Align CodeAlign(CodeAlign_i); + Align RODataAlign(RODataAlign_i); + Align RWDataAlign(RWDataAlign_i); +#else +void SectionMemoryManager::reserveAllocationSpace( + uintptr_t CodeSize, Align CodeAlign, uintptr_t RODataSize, + Align RODataAlign, uintptr_t RWDataSize, Align RWDataAlign) { +#endif + if (CodeSize == 0 && RODataSize == 0 && RWDataSize == 0) + return; + + static const size_t PageSize = sys::Process::getPageSizeEstimate(); + + // Code alignment needs to be at least the stub alignment - however, we + // don't have an easy way to get that here so as a workaround, we assume + // it's 8, which is the largest value I observed across all platforms. + constexpr uint64_t StubAlign = 8; + CodeAlign = Align(std::max(CodeAlign.value(), StubAlign)); + RODataAlign = Align(std::max(RODataAlign.value(), StubAlign)); + RWDataAlign = Align(std::max(RWDataAlign.value(), StubAlign)); + + // Get space required for each section. Use the same calculation as + // allocateSection because we need to be able to satisfy it. + uint64_t RequiredCodeSize = alignTo(CodeSize, CodeAlign) + CodeAlign.value(); + uint64_t RequiredRODataSize = + alignTo(RODataSize, RODataAlign) + RODataAlign.value(); + uint64_t RequiredRWDataSize = + alignTo(RWDataSize, RWDataAlign) + RWDataAlign.value(); + + if (hasSpace(CodeMem, RequiredCodeSize) && + hasSpace(RODataMem, RequiredRODataSize) && + hasSpace(RWDataMem, RequiredRWDataSize)) { + // Sufficient space in contiguous block already available. + return; + } + + // MemoryManager does not have functions for releasing memory after it's + // allocated. Normally it tries to use any excess blocks that were allocated + // due to page alignment, but if we have insufficient free memory for the + // request this can lead to allocating disparate memory that can violate the + // ARM ABI. Clear free memory so only the new allocations are used, but do + // not release allocated memory as it may still be in-use. + CodeMem.FreeMem.clear(); + RODataMem.FreeMem.clear(); + RWDataMem.FreeMem.clear(); + + // Round up to the nearest page size. Blocks must be page-aligned. + RequiredCodeSize = alignTo(RequiredCodeSize, PageSize); + RequiredRODataSize = alignTo(RequiredRODataSize, PageSize); + RequiredRWDataSize = alignTo(RequiredRWDataSize, PageSize); + uint64_t RequiredSize = + RequiredCodeSize + RequiredRODataSize + RequiredRWDataSize; + + std::error_code ec; + sys::MemoryBlock MB = MMapper->allocateMappedMemory( + AllocationPurpose::RWData, RequiredSize, nullptr, + sys::Memory::MF_READ | sys::Memory::MF_WRITE, ec); + if (ec) { + return; + } + // CodeMem will arbitrarily own this MemoryBlock to handle cleanup. + CodeMem.AllocatedMem.push_back(MB); + uintptr_t Addr = (uintptr_t)MB.base(); + FreeMemBlock FreeMB; + FreeMB.PendingPrefixIndex = (unsigned)-1; + + if (CodeSize > 0) { + assert(isAddrAligned(CodeAlign, (void *)Addr)); + FreeMB.Free = sys::MemoryBlock((void *)Addr, RequiredCodeSize); + CodeMem.FreeMem.push_back(FreeMB); + Addr += RequiredCodeSize; + } + + if (RODataSize > 0) { + assert(isAddrAligned(RODataAlign, (void *)Addr)); + FreeMB.Free = sys::MemoryBlock((void *)Addr, RequiredRODataSize); + RODataMem.FreeMem.push_back(FreeMB); + Addr += RequiredRODataSize; + } + + if (RWDataSize > 0) { + assert(isAddrAligned(RWDataAlign, (void *)Addr)); + FreeMB.Free = sys::MemoryBlock((void *)Addr, RequiredRWDataSize); + RWDataMem.FreeMem.push_back(FreeMB); + } +} + +uint8_t *SectionMemoryManager::allocateDataSection(uintptr_t Size, + unsigned Alignment, + unsigned SectionID, + StringRef SectionName, + bool IsReadOnly) { + if (IsReadOnly) + return allocateSection(SectionMemoryManager::AllocationPurpose::ROData, + Size, Alignment); + return allocateSection(SectionMemoryManager::AllocationPurpose::RWData, Size, + Alignment); +} + +uint8_t *SectionMemoryManager::allocateCodeSection(uintptr_t Size, + unsigned Alignment, + unsigned SectionID, + StringRef SectionName) { + return allocateSection(SectionMemoryManager::AllocationPurpose::Code, Size, + Alignment); +} + +uint8_t *SectionMemoryManager::allocateSection( + SectionMemoryManager::AllocationPurpose Purpose, uintptr_t Size, + unsigned Alignment) { + if (!Alignment) + Alignment = 16; + + assert(!(Alignment & (Alignment - 1)) && "Alignment must be a power of two."); + + uintptr_t RequiredSize = Alignment * ((Size + Alignment - 1) / Alignment + 1); + uintptr_t Addr = 0; + + MemoryGroup &MemGroup = [&]() -> MemoryGroup & { + switch (Purpose) { + case AllocationPurpose::Code: + return CodeMem; + case AllocationPurpose::ROData: + return RODataMem; + case AllocationPurpose::RWData: + return RWDataMem; + } + llvm_unreachable("Unknown SectionMemoryManager::AllocationPurpose"); + }(); + + // Look in the list of free memory regions and use a block there if one + // is available. + for (FreeMemBlock &FreeMB : MemGroup.FreeMem) { + if (FreeMB.Free.allocatedSize() >= RequiredSize) { + Addr = (uintptr_t)FreeMB.Free.base(); + uintptr_t EndOfBlock = Addr + FreeMB.Free.allocatedSize(); + // Align the address. + Addr = (Addr + Alignment - 1) & ~(uintptr_t)(Alignment - 1); + + if (FreeMB.PendingPrefixIndex == (unsigned)-1) { + // The part of the block we're giving out to the user is now pending + MemGroup.PendingMem.push_back(sys::MemoryBlock((void *)Addr, Size)); + + // Remember this pending block, such that future allocations can just + // modify it rather than creating a new one + FreeMB.PendingPrefixIndex = MemGroup.PendingMem.size() - 1; + } else { + sys::MemoryBlock &PendingMB = + MemGroup.PendingMem[FreeMB.PendingPrefixIndex]; + PendingMB = sys::MemoryBlock(PendingMB.base(), + Addr + Size - (uintptr_t)PendingMB.base()); + } + + // Remember how much free space is now left in this block + FreeMB.Free = + sys::MemoryBlock((void *)(Addr + Size), EndOfBlock - Addr - Size); + return (uint8_t *)Addr; + } + } + + // No pre-allocated free block was large enough. Allocate a new memory region. + // Note that all sections get allocated as read-write. The permissions will + // be updated later based on memory group. + // + // FIXME: It would be useful to define a default allocation size (or add + // it as a constructor parameter) to minimize the number of allocations. + // + // FIXME: Initialize the Near member for each memory group to avoid + // interleaving. + std::error_code ec; + sys::MemoryBlock MB = MMapper->allocateMappedMemory( + Purpose, RequiredSize, &MemGroup.Near, + sys::Memory::MF_READ | sys::Memory::MF_WRITE, ec); + if (ec) { + // FIXME: Add error propagation to the interface. + return nullptr; + } + + // Save this address as the basis for our next request + MemGroup.Near = MB; + + // Copy the address to all the other groups, if they have not + // been initialized. + if (CodeMem.Near.base() == nullptr) + CodeMem.Near = MB; + if (RODataMem.Near.base() == nullptr) + RODataMem.Near = MB; + if (RWDataMem.Near.base() == nullptr) + RWDataMem.Near = MB; + + // Remember that we allocated this memory + MemGroup.AllocatedMem.push_back(MB); + Addr = (uintptr_t)MB.base(); + uintptr_t EndOfBlock = Addr + MB.allocatedSize(); + + // Align the address. + Addr = (Addr + Alignment - 1) & ~(uintptr_t)(Alignment - 1); + + // The part of the block we're giving out to the user is now pending + MemGroup.PendingMem.push_back(sys::MemoryBlock((void *)Addr, Size)); + + // The allocateMappedMemory may allocate much more memory than we need. In + // this case, we store the unused memory as a free memory block. + unsigned FreeSize = EndOfBlock - Addr - Size; + if (FreeSize > 16) { + FreeMemBlock FreeMB; + FreeMB.Free = sys::MemoryBlock((void *)(Addr + Size), FreeSize); + FreeMB.PendingPrefixIndex = (unsigned)-1; + MemGroup.FreeMem.push_back(FreeMB); + } + + // Return aligned address + return (uint8_t *)Addr; +} + +bool SectionMemoryManager::finalizeMemory(std::string *ErrMsg) { + // FIXME: Should in-progress permissions be reverted if an error occurs? + std::error_code ec; + + // Make code memory executable. + ec = applyMemoryGroupPermissions(CodeMem, + sys::Memory::MF_READ | sys::Memory::MF_EXEC); + if (ec) { + if (ErrMsg) { + *ErrMsg = ec.message(); + } + return true; + } + + // Make read-only data memory read-only. + ec = applyMemoryGroupPermissions(RODataMem, sys::Memory::MF_READ); + if (ec) { + if (ErrMsg) { + *ErrMsg = ec.message(); + } + return true; + } + + // Read-write data memory already has the correct permissions + + // Some platforms with separate data cache and instruction cache require + // explicit cache flush, otherwise JIT code manipulations (like resolved + // relocations) will get to the data cache but not to the instruction cache. + invalidateInstructionCache(); + + return false; +} + +static sys::MemoryBlock trimBlockToPageSize(sys::MemoryBlock M) { + static const size_t PageSize = sys::Process::getPageSizeEstimate(); + + size_t StartOverlap = + (PageSize - ((uintptr_t)M.base() % PageSize)) % PageSize; + + size_t TrimmedSize = M.allocatedSize(); + TrimmedSize -= StartOverlap; + TrimmedSize -= TrimmedSize % PageSize; + + sys::MemoryBlock Trimmed((void *)((uintptr_t)M.base() + StartOverlap), + TrimmedSize); + + assert(((uintptr_t)Trimmed.base() % PageSize) == 0); + assert((Trimmed.allocatedSize() % PageSize) == 0); + assert(M.base() <= Trimmed.base() && + Trimmed.allocatedSize() <= M.allocatedSize()); + + return Trimmed; +} + +std::error_code +SectionMemoryManager::applyMemoryGroupPermissions(MemoryGroup &MemGroup, + unsigned Permissions) { + for (sys::MemoryBlock &MB : MemGroup.PendingMem) + if (std::error_code EC = MMapper->protectMappedMemory(MB, Permissions)) + return EC; + + MemGroup.PendingMem.clear(); + + // Now go through free blocks and trim any of them that don't span the entire + // page because one of the pending blocks may have overlapped it. + for (FreeMemBlock &FreeMB : MemGroup.FreeMem) { + FreeMB.Free = trimBlockToPageSize(FreeMB.Free); + // We cleared the PendingMem list, so all these pointers are now invalid + FreeMB.PendingPrefixIndex = (unsigned)-1; + } + + // Remove all blocks which are now empty + erase_if(MemGroup.FreeMem, [](FreeMemBlock &FreeMB) { + return FreeMB.Free.allocatedSize() == 0; + }); + + return std::error_code(); +} + +void SectionMemoryManager::invalidateInstructionCache() { + for (sys::MemoryBlock &Block : CodeMem.PendingMem) + sys::Memory::InvalidateInstructionCache(Block.base(), + Block.allocatedSize()); +} + +SectionMemoryManager::~SectionMemoryManager() { + for (MemoryGroup *Group : {&CodeMem, &RWDataMem, &RODataMem}) { + for (sys::MemoryBlock &Block : Group->AllocatedMem) + MMapper->releaseMappedMemory(Block); + } +} + +SectionMemoryManager::MemoryMapper::~MemoryMapper() = default; + +void SectionMemoryManager::anchor() {} + +namespace { +// Trivial implementation of SectionMemoryManager::MemoryMapper that just calls +// into sys::Memory. +class DefaultMMapper final : public SectionMemoryManager::MemoryMapper { +public: + sys::MemoryBlock + allocateMappedMemory(SectionMemoryManager::AllocationPurpose Purpose, + size_t NumBytes, const sys::MemoryBlock *const NearBlock, + unsigned Flags, std::error_code &EC) override { + return sys::Memory::allocateMappedMemory(NumBytes, NearBlock, Flags, EC); + } + + std::error_code protectMappedMemory(const sys::MemoryBlock &Block, + unsigned Flags) override { + return sys::Memory::protectMappedMemory(Block, Flags); + } + + std::error_code releaseMappedMemory(sys::MemoryBlock &M) override { + return sys::Memory::releaseMappedMemory(M); + } +}; +} // namespace + +SectionMemoryManager::SectionMemoryManager(MemoryMapper *UnownedMM, + bool ReserveAlloc) + : MMapper(UnownedMM), OwnedMMapper(nullptr), + ReserveAllocation(ReserveAlloc) { + if (!MMapper) { + OwnedMMapper = std::make_unique(); + MMapper = OwnedMMapper.get(); + } +} + +} // namespace backport +} // namespace llvm + +#endif diff --git a/src/backend/jit/llvm/llvmjit.c b/src/backend/jit/llvm/llvmjit.c index 04ae3052a8261..503c8bc840a7f 100644 --- a/src/backend/jit/llvm/llvmjit.c +++ b/src/backend/jit/llvm/llvmjit.c @@ -3,7 +3,7 @@ * llvmjit.c * Core part of the LLVM JIT provider. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/jit/llvm/llvmjit.c @@ -18,6 +18,9 @@ #include #include #include +#if LLVM_VERSION_MAJOR > 16 +#include +#endif #if LLVM_VERSION_MAJOR > 11 #include #include @@ -27,20 +30,23 @@ #endif #include #include +#if LLVM_VERSION_MAJOR < 17 #include #include #include -#if LLVM_VERSION_MAJOR > 6 #include #endif #include "jit/llvmjit.h" +#include "jit/llvmjit_backport.h" #include "jit/llvmjit_emit.h" #include "miscadmin.h" #include "portability/instr_time.h" #include "storage/ipc.h" #include "utils/memutils.h" -#include "utils/resowner_private.h" +#include "utils/resowner.h" + +#define LLVMJIT_LLVM_CONTEXT_REUSE_MAX 100 /* Handle of a module emitted via ORC JIT */ typedef struct LLVMJitHandle @@ -61,23 +67,14 @@ LLVMTypeRef TypeParamBool; LLVMTypeRef TypeStorageBool; LLVMTypeRef TypePGFunction; LLVMTypeRef StructNullableDatum; -LLVMTypeRef StructHeapTupleFieldsField3; -LLVMTypeRef StructHeapTupleFields; -LLVMTypeRef StructHeapTupleHeaderData; -LLVMTypeRef StructHeapTupleDataChoice; LLVMTypeRef StructHeapTupleData; LLVMTypeRef StructMinimalTupleData; -LLVMTypeRef StructItemPointerData; -LLVMTypeRef StructBlockId; -LLVMTypeRef StructFormPgAttribute; -LLVMTypeRef StructTupleConstr; LLVMTypeRef StructTupleDescData; LLVMTypeRef StructTupleTableSlot; +LLVMTypeRef StructHeapTupleHeaderData; LLVMTypeRef StructHeapTupleTableSlot; LLVMTypeRef StructMinimalTupleTableSlot; LLVMTypeRef StructMemoryContextData; -LLVMTypeRef StructPGFinfoRecord; -LLVMTypeRef StructFmgrInfo; LLVMTypeRef StructFunctionCallInfoData; LLVMTypeRef StructExprContext; LLVMTypeRef StructExprEvalStep; @@ -85,15 +82,25 @@ LLVMTypeRef StructExprState; LLVMTypeRef StructAggState; LLVMTypeRef StructAggStatePerGroupData; LLVMTypeRef StructAggStatePerTransData; +LLVMTypeRef StructPlanState; LLVMValueRef AttributeTemplate; +LLVMValueRef ExecEvalSubroutineTemplate; +LLVMValueRef ExecEvalBoolSubroutineTemplate; -LLVMModuleRef llvm_types_module = NULL; +static LLVMModuleRef llvm_types_module = NULL; static bool llvm_session_initialized = false; static size_t llvm_generation = 0; + +/* number of LLVMJitContexts that currently are in use */ +static size_t llvm_jit_context_in_use_count = 0; + +/* how many times has the current LLVMContextRef been used */ +static size_t llvm_llvm_context_reuse_count = 0; static const char *llvm_triple = NULL; static const char *llvm_layout = NULL; +static LLVMContextRef llvm_context; static LLVMTargetRef llvm_targetref; @@ -114,6 +121,8 @@ static void llvm_compile_module(LLVMJitContext *context); static void llvm_optimize_module(LLVMJitContext *context, LLVMModuleRef module); static void llvm_create_types(void); +static void llvm_set_target(void); +static void llvm_recreate_llvm_context(void); static uint64_t llvm_resolve_symbol(const char *name, void *ctx); #if LLVM_VERSION_MAJOR > 11 @@ -121,6 +130,30 @@ static LLVMOrcLLJITRef llvm_create_jit_instance(LLVMTargetMachineRef tm); static char *llvm_error_message(LLVMErrorRef error); #endif /* LLVM_VERSION_MAJOR > 11 */ +/* ResourceOwner callbacks to hold JitContexts */ +static void ResOwnerReleaseJitContext(Datum res); + +static const ResourceOwnerDesc jit_resowner_desc = +{ + .name = "LLVM JIT context", + .release_phase = RESOURCE_RELEASE_BEFORE_LOCKS, + .release_priority = RELEASE_PRIO_JIT_CONTEXTS, + .ReleaseResource = ResOwnerReleaseJitContext, + .DebugPrint = NULL /* the default message is fine */ +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberJIT(ResourceOwner owner, LLVMJitContext *handle) +{ + ResourceOwnerRemember(owner, PointerGetDatum(handle), &jit_resowner_desc); +} +static inline void +ResourceOwnerForgetJIT(ResourceOwner owner, LLVMJitContext *handle) +{ + ResourceOwnerForget(owner, PointerGetDatum(handle), &jit_resowner_desc); +} + PG_MODULE_MAGIC; @@ -135,6 +168,63 @@ _PG_jit_provider_init(JitProviderCallbacks *cb) cb->compile_expr = llvm_compile_expr; } + +/* + * Every now and then create a new LLVMContextRef. Unfortunately, during every + * round of inlining, types may "leak" (they can still be found/used via the + * context, but new types will be created the next time in inlining is + * performed). To prevent that from slowly accumulating problematic amounts of + * memory, recreate the LLVMContextRef we use. We don't want to do so too + * often, as that implies some overhead (particularly re-loading the module + * summaries / modules is fairly expensive). A future TODO would be to make + * this more finegrained and only drop/recreate the LLVMContextRef when we know + * there has been inlining. If we can get the size of the context from LLVM + * then that might be a better way to determine when to drop/recreate rather + * then the usagecount heuristic currently employed. + */ +static void +llvm_recreate_llvm_context(void) +{ + if (!llvm_context) + elog(ERROR, "Trying to recreate a non-existing context"); + + /* + * We can only safely recreate the LLVM context if no other code is being + * JITed, otherwise we'd release the types in use for that. + */ + if (llvm_jit_context_in_use_count > 0) + { + llvm_llvm_context_reuse_count++; + return; + } + + if (llvm_llvm_context_reuse_count <= LLVMJIT_LLVM_CONTEXT_REUSE_MAX) + { + llvm_llvm_context_reuse_count++; + return; + } + + /* + * Need to reset the modules that the inlining code caches before + * disposing of the context. LLVM modules exist within a specific LLVM + * context, therefore disposing of the context before resetting the cache + * would lead to dangling pointers to modules. + */ + llvm_inline_reset_caches(); + + LLVMContextDispose(llvm_context); + llvm_context = LLVMContextCreate(); + llvm_llvm_context_reuse_count = 0; + + /* + * Re-build cached type information, so code generation code can rely on + * that information to be present (also prevents the variables to be + * dangling references). + */ + llvm_create_types(); +} + + /* * Create a context for JITing work. * @@ -151,15 +241,19 @@ llvm_create_context(int jitFlags) llvm_session_initialize(); - ResourceOwnerEnlargeJIT(CurrentResourceOwner); + llvm_recreate_llvm_context(); + + ResourceOwnerEnlarge(CurrentResourceOwner); context = MemoryContextAllocZero(TopMemoryContext, sizeof(LLVMJitContext)); context->base.flags = jitFlags; /* ensure cleanup */ - context->base.resowner = CurrentResourceOwner; - ResourceOwnerRememberJIT(CurrentResourceOwner, PointerGetDatum(context)); + context->resowner = CurrentResourceOwner; + ResourceOwnerRememberJIT(CurrentResourceOwner, context); + + llvm_jit_context_in_use_count++; return context; } @@ -170,9 +264,15 @@ llvm_create_context(int jitFlags) static void llvm_release_context(JitContext *context) { - LLVMJitContext *llvm_context = (LLVMJitContext *) context; + LLVMJitContext *llvm_jit_context = (LLVMJitContext *) context; ListCell *lc; + /* + * Consider as cleaned up even if we skip doing so below, that way we can + * verify the tracking is correct (see llvm_shutdown()). + */ + llvm_jit_context_in_use_count--; + /* * When this backend is exiting, don't clean up LLVM. As an error might * have occurred from within LLVM, we do not want to risk reentering. All @@ -183,13 +283,13 @@ llvm_release_context(JitContext *context) llvm_enter_fatal_on_oom(); - if (llvm_context->module) + if (llvm_jit_context->module) { - LLVMDisposeModule(llvm_context->module); - llvm_context->module = NULL; + LLVMDisposeModule(llvm_jit_context->module); + llvm_jit_context->module = NULL; } - foreach(lc, llvm_context->handles) + foreach(lc, llvm_jit_context->handles) { LLVMJitHandle *jit_handle = (LLVMJitHandle *) lfirst(lc); @@ -219,8 +319,13 @@ llvm_release_context(JitContext *context) pfree(jit_handle); } - list_free(llvm_context->handles); - llvm_context->handles = NIL; + list_free(llvm_jit_context->handles); + llvm_jit_context->handles = NIL; + + llvm_leave_fatal_on_oom(); + + if (llvm_jit_context->resowner) + ResourceOwnerForgetJIT(llvm_jit_context->resowner, llvm_jit_context); } /* @@ -238,7 +343,7 @@ llvm_mutable_module(LLVMJitContext *context) { context->compiled = false; context->module_generation = llvm_generation++; - context->module = LLVMModuleCreateWithName("pg"); + context->module = LLVMModuleCreateWithNameInContext("pg", llvm_context); LLVMSetTarget(context->module, llvm_triple); LLVMSetDataLayout(context->module, llvm_layout); } @@ -275,10 +380,7 @@ llvm_expand_funcname(struct LLVMJitContext *context, const char *basename) void * llvm_get_function(LLVMJitContext *context, const char *funcname) { -#if LLVM_VERSION_MAJOR > 11 || \ - defined(HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN) && HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN ListCell *lc; -#endif llvm_assert_in_fatal_section(); @@ -326,7 +428,7 @@ llvm_get_function(LLVMJitContext *context, const char *funcname) if (addr) return (void *) (uintptr_t) addr; } -#elif defined(HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN) && HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN +#else foreach(lc, context->handles) { LLVMOrcTargetAddress addr; @@ -338,28 +440,6 @@ llvm_get_function(LLVMJitContext *context, const char *funcname) if (addr) return (void *) (uintptr_t) addr; } -#elif LLVM_VERSION_MAJOR < 5 - { - LLVMOrcTargetAddress addr; - - if ((addr = LLVMOrcGetSymbolAddress(llvm_opt0_orc, funcname))) - return (void *) (uintptr_t) addr; - if ((addr = LLVMOrcGetSymbolAddress(llvm_opt3_orc, funcname))) - return (void *) (uintptr_t) addr; - } -#else - { - LLVMOrcTargetAddress addr; - - if (LLVMOrcGetSymbolAddress(llvm_opt0_orc, &addr, funcname)) - elog(ERROR, "failed to look up symbol \"%s\"", funcname); - if (addr) - return (void *) (uintptr_t) addr; - if (LLVMOrcGetSymbolAddress(llvm_opt3_orc, &addr, funcname)) - elog(ERROR, "failed to look up symbol \"%s\"", funcname); - if (addr) - return (void *) (uintptr_t) addr; - } #endif elog(ERROR, "failed to JIT: %s", funcname); @@ -382,11 +462,7 @@ llvm_pg_var_type(const char *varname) if (!v_srcvar) elog(ERROR, "variable %s not in llvmjit_types.c", varname); - /* look at the contained type */ - typ = LLVMTypeOf(v_srcvar); - Assert(typ != NULL && LLVMGetTypeKind(typ) == LLVMPointerTypeKind); - typ = LLVMGetElementType(typ); - Assert(typ != NULL); + typ = LLVMGlobalGetValueType(v_srcvar); return typ; } @@ -398,12 +474,14 @@ llvm_pg_var_type(const char *varname) LLVMTypeRef llvm_pg_var_func_type(const char *varname) { - LLVMTypeRef typ = llvm_pg_var_type(varname); + LLVMValueRef v_srcvar; + LLVMTypeRef typ; - /* look at the contained type */ - Assert(LLVMGetTypeKind(typ) == LLVMPointerTypeKind); - typ = LLVMGetElementType(typ); - Assert(typ != NULL && LLVMGetTypeKind(typ) == LLVMFunctionTypeKind); + v_srcvar = LLVMGetNamedFunction(llvm_types_module, varname); + if (!v_srcvar) + elog(ERROR, "function %s not in llvmjit_types.c", varname); + + typ = LLVMGetFunctionType(v_srcvar); return typ; } @@ -433,7 +511,7 @@ llvm_pg_func(LLVMModuleRef mod, const char *funcname) v_fn = LLVMAddFunction(mod, funcname, - LLVMGetElementType(LLVMTypeOf(v_srcfn))); + LLVMGetFunctionType(v_srcfn)); llvm_copy_attributes(v_srcfn, v_fn); return v_fn; @@ -449,12 +527,8 @@ llvm_copy_attributes_at_index(LLVMValueRef v_from, LLVMValueRef v_to, uint32 ind int num_attributes; LLVMAttributeRef *attrs; - num_attributes = LLVMGetAttributeCountAtIndexPG(v_from, index); + num_attributes = LLVMGetAttributeCountAtIndex(v_from, index); - /* - * Not just for efficiency: LLVM <= 3.9 crashes when - * LLVMGetAttributesAtIndex() is called for an index with 0 attributes. - */ if (num_attributes == 0) return; @@ -479,8 +553,11 @@ llvm_copy_attributes(LLVMValueRef v_from, LLVMValueRef v_to) /* copy function attributes */ llvm_copy_attributes_at_index(v_from, v_to, LLVMAttributeFunctionIndex); - /* and the return value attributes */ - llvm_copy_attributes_at_index(v_from, v_to, LLVMAttributeReturnIndex); + if (LLVMGetTypeKind(LLVMGetFunctionReturnType(v_to)) != LLVMVoidTypeKind) + { + /* and the return value attributes */ + llvm_copy_attributes_at_index(v_from, v_to, LLVMAttributeReturnIndex); + } /* and each function parameter's attribute */ param_count = LLVMCountParams(v_from); @@ -529,7 +606,7 @@ llvm_function_reference(LLVMJitContext *context, fcinfo->flinfo->fn_oid); v_fn = LLVMGetNamedGlobal(mod, funcname); if (v_fn != 0) - return LLVMBuildLoad(builder, v_fn, ""); + return l_load(builder, TypePGFunction, v_fn, ""); v_fn_addr = l_ptr_const(fcinfo->flinfo->fn_addr, TypePGFunction); @@ -539,7 +616,7 @@ llvm_function_reference(LLVMJitContext *context, LLVMSetLinkage(v_fn, LLVMPrivateLinkage); LLVMSetUnnamedAddr(v_fn, true); - return LLVMBuildLoad(builder, v_fn, ""); + return l_load(builder, TypePGFunction, v_fn, ""); } /* check if function already has been added */ @@ -547,7 +624,7 @@ llvm_function_reference(LLVMJitContext *context, if (v_fn != 0) return v_fn; - v_fn = LLVMAddFunction(mod, funcname, LLVMGetElementType(TypePGFunction)); + v_fn = LLVMAddFunction(mod, funcname, LLVMGetFunctionType(AttributeTemplate)); return v_fn; } @@ -558,6 +635,7 @@ llvm_function_reference(LLVMJitContext *context, static void llvm_optimize_module(LLVMJitContext *context, LLVMModuleRef module) { +#if LLVM_VERSION_MAJOR < 17 LLVMPassManagerBuilderRef llvm_pmb; LLVMPassManagerRef llvm_mpm; LLVMPassManagerRef llvm_fpm; @@ -621,6 +699,31 @@ llvm_optimize_module(LLVMJitContext *context, LLVMModuleRef module) LLVMDisposePassManager(llvm_mpm); LLVMPassManagerBuilderDispose(llvm_pmb); +#else + LLVMPassBuilderOptionsRef options; + LLVMErrorRef err; + const char *passes; + + if (context->base.flags & PGJIT_OPT3) + passes = "default"; + else + passes = "default,mem2reg"; + + options = LLVMCreatePassBuilderOptions(); + +#ifdef LLVM_PASS_DEBUG + LLVMPassBuilderOptionsSetDebugLogging(options, 1); +#endif + + LLVMPassBuilderOptionsSetInlinerThreshold(options, 512); + + err = LLVMRunPasses(module, passes, NULL, options); + + if (err) + elog(ERROR, "failed to JIT module: %s", llvm_error_message(err)); + + LLVMDisposePassBuilderOptions(options); +#endif } /* @@ -720,11 +823,9 @@ llvm_compile_module(LLVMJitContext *context) elog(ERROR, "failed to JIT module: %s", llvm_error_message(error)); - handle->lljit = compile_orc; - /* LLVMOrcLLJITAddLLVMIRModuleWithRT takes ownership of the module */ } -#elif LLVM_VERSION_MAJOR > 6 +#else { handle->stack = compile_orc; if (LLVMOrcAddEagerlyCompiledIR(compile_orc, &handle->orc_handle, context->module, @@ -733,26 +834,6 @@ llvm_compile_module(LLVMJitContext *context) /* LLVMOrcAddEagerlyCompiledIR takes ownership of the module */ } -#elif LLVM_VERSION_MAJOR > 4 - { - LLVMSharedModuleRef smod; - - smod = LLVMOrcMakeSharedModule(context->module); - handle->stack = compile_orc; - if (LLVMOrcAddEagerlyCompiledIR(compile_orc, &handle->orc_handle, smod, - llvm_resolve_symbol, NULL)) - elog(ERROR, "failed to JIT module"); - - LLVMOrcDisposeSharedModuleRef(smod); - } -#else /* LLVM 4.0 and 3.9 */ - { - handle->stack = compile_orc; - handle->orc_handle = LLVMOrcAddEagerlyCompiledIR(compile_orc, context->module, - llvm_resolve_symbol, NULL); - - LLVMDisposeModule(context->module); - } #endif INSTR_TIME_SET_CURRENT(endtime); @@ -798,13 +879,24 @@ llvm_session_initialize(void) LLVMInitializeNativeAsmPrinter(); LLVMInitializeNativeAsmParser(); + if (llvm_context == NULL) + { + llvm_context = LLVMContextCreate(); + + llvm_jit_context_in_use_count = 0; + llvm_llvm_context_reuse_count = 0; + } + /* - * When targeting an LLVM version with opaque pointers enabled by default, - * turn them off for the context we build our code in. We don't need to - * do so for other contexts (e.g. llvm_ts_context). Once the IR is - * generated, it carries the necessary information. + * When targeting LLVM 15, turn off opaque pointers for the context we + * build our code in. We don't need to do so for other contexts (e.g. + * llvm_ts_context). Once the IR is generated, it carries the necessary + * information. + * + * For 16 and above, opaque pointers must be used, and we have special + * code for that. */ -#if LLVM_VERSION_MAJOR > 14 +#if LLVM_VERSION_MAJOR == 15 LLVMContextSetOpaquePointers(LLVMGetGlobalContext(), false); #endif @@ -814,6 +906,11 @@ llvm_session_initialize(void) */ llvm_create_types(); + /* + * Extract target information from loaded module. + */ + llvm_set_target(); + if (LLVMGetTargetFromTriple(llvm_triple, &llvm_targetref, &error) != 0) { elog(FATAL, "failed to query triple %s", error); @@ -909,6 +1006,10 @@ llvm_shutdown(int code, Datum arg) return; } + if (llvm_jit_context_in_use_count != 0) + elog(PANIC, "LLVMJitContext in use count not 0 at exit (is %zu)", + llvm_jit_context_in_use_count); + #if LLVM_VERSION_MAJOR > 11 { if (llvm_opt3_orc) @@ -933,20 +1034,12 @@ llvm_shutdown(int code, Datum arg) if (llvm_opt3_orc) { -#if defined(HAVE_DECL_LLVMORCREGISTERPERF) && HAVE_DECL_LLVMORCREGISTERPERF - if (jit_profiling_support) - LLVMOrcUnregisterPerf(llvm_opt3_orc); -#endif LLVMOrcDisposeInstance(llvm_opt3_orc); llvm_opt3_orc = NULL; } if (llvm_opt0_orc) { -#if defined(HAVE_DECL_LLVMORCREGISTERPERF) && HAVE_DECL_LLVMORCREGISTERPERF - if (jit_profiling_support) - LLVMOrcUnregisterPerf(llvm_opt0_orc); -#endif LLVMOrcDisposeInstance(llvm_opt0_orc); llvm_opt0_orc = NULL; } @@ -966,19 +1059,28 @@ load_return_type(LLVMModuleRef mod, const char *name) if (!value) elog(ERROR, "function %s is unknown", name); - /* get type of function pointer */ - typ = LLVMTypeOf(value); - Assert(typ != NULL); - /* dereference pointer */ - typ = LLVMGetElementType(typ); - Assert(typ != NULL); - /* and look at return type */ - typ = LLVMGetReturnType(typ); - Assert(typ != NULL); + typ = LLVMGetFunctionReturnType(value); /* in llvmjit_wrap.cpp */ return typ; } +/* + * Load triple & layout from clang emitted file so we're guaranteed to be + * compatible. + */ +static void +llvm_set_target(void) +{ + if (!llvm_types_module) + elog(ERROR, "failed to extract target information, llvmjit_types.c not loaded"); + + if (llvm_triple == NULL) + llvm_triple = pstrdup(LLVMGetTarget(llvm_types_module)); + + if (llvm_layout == NULL) + llvm_layout = pstrdup(LLVMGetDataLayoutStr(llvm_types_module)); +} + /* * Load required information, types, function signatures from llvmjit_types.c * and make them available in global variables. @@ -1002,19 +1104,12 @@ llvm_create_types(void) } /* eagerly load contents, going to need it all */ - if (LLVMParseBitcode2(buf, &llvm_types_module)) + if (LLVMParseBitcodeInContext2(llvm_context, buf, &llvm_types_module)) { - elog(ERROR, "LLVMParseBitcode2 of %s failed", path); + elog(ERROR, "LLVMParseBitcodeInContext2 of %s failed", path); } LLVMDisposeMemoryBuffer(buf); - /* - * Load triple & layout from clang emitted file so we're guaranteed to be - * compatible. - */ - llvm_triple = pstrdup(LLVMGetTarget(llvm_types_module)); - llvm_layout = pstrdup(LLVMGetDataLayoutStr(llvm_types_module)); - TypeSizeT = llvm_pg_var_type("TypeSizeT"); TypeParamBool = load_return_type(llvm_types_module, "FunctionReturningBool"); TypeStorageBool = llvm_pg_var_type("TypeStorageBool"); @@ -1029,12 +1124,17 @@ llvm_create_types(void) StructHeapTupleTableSlot = llvm_pg_var_type("StructHeapTupleTableSlot"); StructMinimalTupleTableSlot = llvm_pg_var_type("StructMinimalTupleTableSlot"); StructHeapTupleData = llvm_pg_var_type("StructHeapTupleData"); + StructHeapTupleHeaderData = llvm_pg_var_type("StructHeapTupleHeaderData"); StructTupleDescData = llvm_pg_var_type("StructTupleDescData"); StructAggState = llvm_pg_var_type("StructAggState"); StructAggStatePerGroupData = llvm_pg_var_type("StructAggStatePerGroupData"); StructAggStatePerTransData = llvm_pg_var_type("StructAggStatePerTransData"); + StructPlanState = llvm_pg_var_type("StructPlanState"); + StructMinimalTupleData = llvm_pg_var_type("StructMinimalTupleData"); AttributeTemplate = LLVMGetNamedFunction(llvm_types_module, "AttributeTemplate"); + ExecEvalSubroutineTemplate = LLVMGetNamedFunction(llvm_types_module, "ExecEvalSubroutineTemplate"); + ExecEvalBoolSubroutineTemplate = LLVMGetNamedFunction(llvm_types_module, "ExecEvalBoolSubroutineTemplate"); } /* @@ -1174,8 +1274,14 @@ llvm_log_jit_error(void *ctx, LLVMErrorRef error) static LLVMOrcObjectLayerRef llvm_create_object_layer(void *Ctx, LLVMOrcExecutionSessionRef ES, const char *Triple) { +#ifdef USE_LLVM_BACKPORT_SECTION_MEMORY_MANAGER + LLVMOrcObjectLayerRef objlayer = + LLVMOrcCreateRTDyldObjectLinkingLayerWithSafeSectionMemoryManager(ES); +#else LLVMOrcObjectLayerRef objlayer = LLVMOrcCreateRTDyldObjectLinkingLayerWithSectionMemoryManager(ES); +#endif + #if defined(HAVE_DECL_LLVMCREATEGDBREGISTRATIONLISTENER) && HAVE_DECL_LLVMCREATEGDBREGISTRATIONLISTENER if (jit_debugging_support) @@ -1266,3 +1372,15 @@ llvm_error_message(LLVMErrorRef error) } #endif /* LLVM_VERSION_MAJOR > 11 */ + +/* + * ResourceOwner callbacks + */ +static void +ResOwnerReleaseJitContext(Datum res) +{ + LLVMJitContext *context = (LLVMJitContext *) DatumGetPointer(res); + + context->resowner = NULL; + jit_release_context(&context->base); +} diff --git a/src/backend/jit/llvm/llvmjit_deform.c b/src/backend/jit/llvm/llvmjit_deform.c index 15d4a7b431a25..b07f8e7f75675 100644 --- a/src/backend/jit/llvm/llvmjit_deform.c +++ b/src/backend/jit/llvm/llvmjit_deform.c @@ -7,7 +7,7 @@ * knowledge of the tuple descriptor. Fixed column widths, NOT NULLness, etc * can be taken advantage of. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -37,6 +37,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, char *funcname; LLVMModuleRef mod; + LLVMContextRef lc; LLVMBuilderRef b; LLVMTypeRef deform_sig; @@ -99,6 +100,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, return NULL; mod = llvm_mutable_module(context); + lc = LLVMGetModuleContext(mod); funcname = llvm_expand_funcname(context, "deform"); @@ -133,8 +135,8 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, param_types[0] = l_ptr(StructTupleTableSlot); - deform_sig = LLVMFunctionType(LLVMVoidType(), param_types, - lengthof(param_types), 0); + deform_sig = LLVMFunctionType(LLVMVoidTypeInContext(lc), + param_types, lengthof(param_types), 0); } v_deform_fn = LLVMAddFunction(mod, funcname, deform_sig); LLVMSetLinkage(v_deform_fn, LLVMInternalLinkage); @@ -142,17 +144,17 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, llvm_copy_attributes(AttributeTemplate, v_deform_fn); b_entry = - LLVMAppendBasicBlock(v_deform_fn, "entry"); + LLVMAppendBasicBlockInContext(lc, v_deform_fn, "entry"); b_adjust_unavail_cols = - LLVMAppendBasicBlock(v_deform_fn, "adjust_unavail_cols"); + LLVMAppendBasicBlockInContext(lc, v_deform_fn, "adjust_unavail_cols"); b_find_start = - LLVMAppendBasicBlock(v_deform_fn, "find_startblock"); + LLVMAppendBasicBlockInContext(lc, v_deform_fn, "find_startblock"); b_out = - LLVMAppendBasicBlock(v_deform_fn, "outblock"); + LLVMAppendBasicBlockInContext(lc, v_deform_fn, "outblock"); b_dead = - LLVMAppendBasicBlock(v_deform_fn, "deadblock"); + LLVMAppendBasicBlockInContext(lc, v_deform_fn, "deadblock"); - b = LLVMCreateBuilder(); + b = LLVMCreateBuilderInContext(lc); attcheckattnoblocks = palloc(sizeof(LLVMBasicBlockRef) * natts); attstartblocks = palloc(sizeof(LLVMBasicBlockRef) * natts); @@ -171,13 +173,13 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, v_slot = LLVMGetParam(v_deform_fn, 0); v_tts_values = - l_load_struct_gep(b, v_slot, FIELDNO_TUPLETABLESLOT_VALUES, + l_load_struct_gep(b, StructTupleTableSlot, v_slot, FIELDNO_TUPLETABLESLOT_VALUES, "tts_values"); v_tts_nulls = - l_load_struct_gep(b, v_slot, FIELDNO_TUPLETABLESLOT_ISNULL, + l_load_struct_gep(b, StructTupleTableSlot, v_slot, FIELDNO_TUPLETABLESLOT_ISNULL, "tts_ISNULL"); - v_flagsp = LLVMBuildStructGEP(b, v_slot, FIELDNO_TUPLETABLESLOT_FLAGS, ""); - v_nvalidp = LLVMBuildStructGEP(b, v_slot, FIELDNO_TUPLETABLESLOT_NVALID, ""); + v_flagsp = l_struct_gep(b, StructTupleTableSlot, v_slot, FIELDNO_TUPLETABLESLOT_FLAGS, ""); + v_nvalidp = l_struct_gep(b, StructTupleTableSlot, v_slot, FIELDNO_TUPLETABLESLOT_NVALID, ""); if (ops == &TTSOpsHeapTuple || ops == &TTSOpsBufferHeapTuple) { @@ -188,9 +190,9 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, v_slot, l_ptr(StructHeapTupleTableSlot), "heapslot"); - v_slotoffp = LLVMBuildStructGEP(b, v_heapslot, FIELDNO_HEAPTUPLETABLESLOT_OFF, ""); + v_slotoffp = l_struct_gep(b, StructHeapTupleTableSlot, v_heapslot, FIELDNO_HEAPTUPLETABLESLOT_OFF, ""); v_tupleheaderp = - l_load_struct_gep(b, v_heapslot, FIELDNO_HEAPTUPLETABLESLOT_TUPLE, + l_load_struct_gep(b, StructHeapTupleTableSlot, v_heapslot, FIELDNO_HEAPTUPLETABLESLOT_TUPLE, "tupleheader"); } else if (ops == &TTSOpsMinimalTuple) @@ -202,9 +204,15 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, v_slot, l_ptr(StructMinimalTupleTableSlot), "minimalslot"); - v_slotoffp = LLVMBuildStructGEP(b, v_minimalslot, FIELDNO_MINIMALTUPLETABLESLOT_OFF, ""); + v_slotoffp = l_struct_gep(b, + StructMinimalTupleTableSlot, + v_minimalslot, + FIELDNO_MINIMALTUPLETABLESLOT_OFF, ""); v_tupleheaderp = - l_load_struct_gep(b, v_minimalslot, FIELDNO_MINIMALTUPLETABLESLOT_TUPLE, + l_load_struct_gep(b, + StructMinimalTupleTableSlot, + v_minimalslot, + FIELDNO_MINIMALTUPLETABLESLOT_TUPLE, "tupleheader"); } else @@ -214,21 +222,29 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, } v_tuplep = - l_load_struct_gep(b, v_tupleheaderp, FIELDNO_HEAPTUPLEDATA_DATA, + l_load_struct_gep(b, + StructHeapTupleData, + v_tupleheaderp, + FIELDNO_HEAPTUPLEDATA_DATA, "tuple"); v_bits = LLVMBuildBitCast(b, - LLVMBuildStructGEP(b, v_tuplep, - FIELDNO_HEAPTUPLEHEADERDATA_BITS, - ""), - l_ptr(LLVMInt8Type()), + l_struct_gep(b, + StructHeapTupleHeaderData, + v_tuplep, + FIELDNO_HEAPTUPLEHEADERDATA_BITS, + ""), + l_ptr(LLVMInt8TypeInContext(lc)), "t_bits"); v_infomask1 = - l_load_struct_gep(b, v_tuplep, + l_load_struct_gep(b, + StructHeapTupleHeaderData, + v_tuplep, FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK, "infomask1"); v_infomask2 = l_load_struct_gep(b, + StructHeapTupleHeaderData, v_tuplep, FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK2, "infomask2"); @@ -236,14 +252,14 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, v_hasnulls = LLVMBuildICmp(b, LLVMIntNE, LLVMBuildAnd(b, - l_int16_const(HEAP_HASNULL), + l_int16_const(lc, HEAP_HASNULL), v_infomask1, ""), - l_int16_const(0), + l_int16_const(lc, 0), "hasnulls"); /* t_infomask2 & HEAP_NATTS_MASK */ v_maxatt = LLVMBuildAnd(b, - l_int16_const(HEAP_NATTS_MASK), + l_int16_const(lc, HEAP_NATTS_MASK), v_infomask2, "maxatt"); @@ -253,19 +269,21 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, */ v_hoff = LLVMBuildZExt(b, - l_load_struct_gep(b, v_tuplep, + l_load_struct_gep(b, + StructHeapTupleHeaderData, + v_tuplep, FIELDNO_HEAPTUPLEHEADERDATA_HOFF, ""), - LLVMInt32Type(), "t_hoff"); + LLVMInt32TypeInContext(lc), "t_hoff"); - v_tupdata_base = - LLVMBuildGEP(b, - LLVMBuildBitCast(b, - v_tuplep, - l_ptr(LLVMInt8Type()), - ""), - &v_hoff, 1, - "v_tupdata_base"); + v_tupdata_base = l_gep(b, + LLVMInt8TypeInContext(lc), + LLVMBuildBitCast(b, + v_tuplep, + l_ptr(LLVMInt8TypeInContext(lc)), + ""), + &v_hoff, 1, + "v_tupdata_base"); /* * Load tuple start offset from slot. Will be reset below in case there's @@ -274,7 +292,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, { LLVMValueRef v_off_start; - v_off_start = LLVMBuildLoad(b, v_slotoffp, "v_slot_off"); + v_off_start = l_load(b, LLVMInt32TypeInContext(lc), v_slotoffp, "v_slot_off"); v_off_start = LLVMBuildZExt(b, v_off_start, TypeSizeT, ""); LLVMBuildStore(b, v_off_start, v_offp); } @@ -314,12 +332,13 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, else { LLVMValueRef v_params[3]; + LLVMValueRef f; /* branch if not all columns available */ LLVMBuildCondBr(b, LLVMBuildICmp(b, LLVMIntULT, v_maxatt, - l_int16_const(natts), + l_int16_const(lc, natts), ""), b_adjust_unavail_cols, b_find_start); @@ -328,16 +347,18 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, LLVMPositionBuilderAtEnd(b, b_adjust_unavail_cols); v_params[0] = v_slot; - v_params[1] = LLVMBuildZExt(b, v_maxatt, LLVMInt32Type(), ""); - v_params[2] = l_int32_const(natts); - LLVMBuildCall(b, llvm_pg_func(mod, "slot_getmissingattrs"), - v_params, lengthof(v_params), ""); + v_params[1] = LLVMBuildZExt(b, v_maxatt, LLVMInt32TypeInContext(lc), ""); + v_params[2] = l_int32_const(lc, natts); + f = llvm_pg_func(mod, "slot_getmissingattrs"); + l_call(b, + LLVMGetFunctionType(f), f, + v_params, lengthof(v_params), ""); LLVMBuildBr(b, b_find_start); } LLVMPositionBuilderAtEnd(b, b_find_start); - v_nvalid = LLVMBuildLoad(b, v_nvalidp, ""); + v_nvalid = l_load(b, LLVMInt16TypeInContext(lc), v_nvalidp, ""); /* * Build switch to go from nvalid to the right startblock. Callers @@ -352,7 +373,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, for (attnum = 0; attnum < natts; attnum++) { - LLVMValueRef v_attno = l_int16_const(attnum); + LLVMValueRef v_attno = l_int16_const(lc, attnum); LLVMAddCase(v_switch, v_attno, attcheckattnoblocks[attnum]); } @@ -375,7 +396,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, Form_pg_attribute att = TupleDescAttr(desc, attnum); LLVMValueRef v_incby; int alignto; - LLVMValueRef l_attno = l_int16_const(attnum); + LLVMValueRef l_attno = l_int16_const(lc, attnum); LLVMValueRef v_attdatap; LLVMValueRef v_resultp; @@ -436,14 +457,14 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, else b_next = attcheckattnoblocks[attnum + 1]; - v_nullbyteno = l_int32_const(attnum >> 3); - v_nullbytemask = l_int8_const(1 << ((attnum) & 0x07)); - v_nullbyte = l_load_gep1(b, v_bits, v_nullbyteno, "attnullbyte"); + v_nullbyteno = l_int32_const(lc, attnum >> 3); + v_nullbytemask = l_int8_const(lc, 1 << ((attnum) & 0x07)); + v_nullbyte = l_load_gep1(b, LLVMInt8TypeInContext(lc), v_bits, v_nullbyteno, "attnullbyte"); v_nullbit = LLVMBuildICmp(b, LLVMIntEQ, LLVMBuildAnd(b, v_nullbyte, v_nullbytemask, ""), - l_int8_const(0), + l_int8_const(lc, 0), "attisnull"); v_attisnull = LLVMBuildAnd(b, v_hasnulls, v_nullbit, ""); @@ -454,12 +475,12 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, /* store null-byte */ LLVMBuildStore(b, - l_int8_const(1), - LLVMBuildGEP(b, v_tts_nulls, &l_attno, 1, "")); + l_int8_const(lc, 1), + l_gep(b, LLVMInt8TypeInContext(lc), v_tts_nulls, &l_attno, 1, "")); /* store zero datum */ LLVMBuildStore(b, l_sizet_const(0), - LLVMBuildGEP(b, v_tts_values, &l_attno, 1, "")); + l_gep(b, TypeSizeT, v_tts_values, &l_attno, 1, "")); LLVMBuildBr(b, b_next); attguaranteedalign = false; @@ -518,13 +539,13 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, /* don't know if short varlena or not */ attguaranteedalign = false; - v_off = LLVMBuildLoad(b, v_offp, ""); + v_off = l_load(b, TypeSizeT, v_offp, ""); v_possible_padbyte = - l_load_gep1(b, v_tupdata_base, v_off, "padbyte"); + l_load_gep1(b, LLVMInt8TypeInContext(lc), v_tupdata_base, v_off, "padbyte"); v_ispad = LLVMBuildICmp(b, LLVMIntEQ, - v_possible_padbyte, l_int8_const(0), + v_possible_padbyte, l_int8_const(lc, 0), "ispadbyte"); LLVMBuildCondBr(b, v_ispad, attalignblocks[attnum], @@ -540,7 +561,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, /* translation of alignment code (cf TYPEALIGN()) */ { LLVMValueRef v_off_aligned; - LLVMValueRef v_off = LLVMBuildLoad(b, v_offp, ""); + LLVMValueRef v_off = l_load(b, TypeSizeT, v_offp, ""); /* ((ALIGNVAL) - 1) */ LLVMValueRef v_alignval = l_sizet_const(alignto - 1); @@ -629,18 +650,18 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, /* compute address to load data from */ { - LLVMValueRef v_off = LLVMBuildLoad(b, v_offp, ""); + LLVMValueRef v_off = l_load(b, TypeSizeT, v_offp, ""); v_attdatap = - LLVMBuildGEP(b, v_tupdata_base, &v_off, 1, ""); + l_gep(b, LLVMInt8TypeInContext(lc), v_tupdata_base, &v_off, 1, ""); } /* compute address to store value at */ - v_resultp = LLVMBuildGEP(b, v_tts_values, &l_attno, 1, ""); + v_resultp = l_gep(b, TypeSizeT, v_tts_values, &l_attno, 1, ""); /* store null-byte (false) */ - LLVMBuildStore(b, l_int8_const(0), - LLVMBuildGEP(b, v_tts_nulls, &l_attno, 1, "")); + LLVMBuildStore(b, l_int8_const(lc, 0), + l_gep(b, TypeStorageBool, v_tts_nulls, &l_attno, 1, "")); /* * Store datum. For byval: datums copy the value, extend to Datum's @@ -649,12 +670,12 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, if (att->attbyval) { LLVMValueRef v_tmp_loaddata; - LLVMTypeRef vartypep = - LLVMPointerType(LLVMIntType(att->attlen * 8), 0); + LLVMTypeRef vartype = LLVMIntTypeInContext(lc, att->attlen * 8); + LLVMTypeRef vartypep = LLVMPointerType(vartype, 0); v_tmp_loaddata = LLVMBuildPointerCast(b, v_attdatap, vartypep, ""); - v_tmp_loaddata = LLVMBuildLoad(b, v_tmp_loaddata, "attr_byval"); + v_tmp_loaddata = l_load(b, vartype, v_tmp_loaddata, "attr_byval"); v_tmp_loaddata = LLVMBuildZExt(b, v_tmp_loaddata, TypeSizeT, ""); LLVMBuildStore(b, v_tmp_loaddata, v_resultp); @@ -679,18 +700,20 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, } else if (att->attlen == -1) { - v_incby = LLVMBuildCall(b, - llvm_pg_func(mod, "varsize_any"), - &v_attdatap, 1, - "varsize_any"); + v_incby = l_call(b, + llvm_pg_var_func_type("varsize_any"), + llvm_pg_func(mod, "varsize_any"), + &v_attdatap, 1, + "varsize_any"); l_callsite_ro(v_incby); l_callsite_alwaysinline(v_incby); } else if (att->attlen == -2) { - v_incby = LLVMBuildCall(b, - llvm_pg_func(mod, "strlen"), - &v_attdatap, 1, "strlen"); + v_incby = l_call(b, + llvm_pg_var_func_type("strlen"), + llvm_pg_func(mod, "strlen"), + &v_attdatap, 1, "strlen"); l_callsite_ro(v_incby); @@ -710,7 +733,7 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, } else { - LLVMValueRef v_off = LLVMBuildLoad(b, v_offp, ""); + LLVMValueRef v_off = l_load(b, TypeSizeT, v_offp, ""); v_off = LLVMBuildAdd(b, v_off, v_incby, "increment_offset"); LLVMBuildStore(b, v_off, v_offp); @@ -736,14 +759,14 @@ slot_compile_deform(LLVMJitContext *context, TupleDesc desc, LLVMPositionBuilderAtEnd(b, b_out); { - LLVMValueRef v_off = LLVMBuildLoad(b, v_offp, ""); + LLVMValueRef v_off = l_load(b, TypeSizeT, v_offp, ""); LLVMValueRef v_flags; - LLVMBuildStore(b, l_int16_const(natts), v_nvalidp); - v_off = LLVMBuildTrunc(b, v_off, LLVMInt32Type(), ""); + LLVMBuildStore(b, l_int16_const(lc, natts), v_nvalidp); + v_off = LLVMBuildTrunc(b, v_off, LLVMInt32TypeInContext(lc), ""); LLVMBuildStore(b, v_off, v_slotoffp); - v_flags = LLVMBuildLoad(b, v_flagsp, "tts_flags"); - v_flags = LLVMBuildOr(b, v_flags, l_int16_const(TTS_FLAG_SLOW), ""); + v_flags = l_load(b, LLVMInt16TypeInContext(lc), v_flagsp, "tts_flags"); + v_flags = LLVMBuildOr(b, v_flags, l_int16_const(lc, TTS_FLAG_SLOW), ""); LLVMBuildStore(b, v_flags, v_flagsp); LLVMBuildRetVoid(b); } diff --git a/src/backend/jit/llvm/llvmjit_error.cpp b/src/backend/jit/llvm/llvmjit_error.cpp index ea40f5a12479c..ebe2f1baa10f8 100644 --- a/src/backend/jit/llvm/llvmjit_error.cpp +++ b/src/backend/jit/llvm/llvmjit_error.cpp @@ -6,7 +6,7 @@ * Unfortunately neither (re)setting the C++ new handler, nor the LLVM OOM * handler are exposed to C. Therefore this file wraps the necessary code. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/jit/llvm/llvmjit_error.cpp @@ -29,12 +29,10 @@ static int fatal_new_handler_depth = 0; static std::new_handler old_new_handler = NULL; static void fatal_system_new_handler(void); -#if LLVM_VERSION_MAJOR > 4 static void fatal_llvm_new_handler(void *user_data, const char *reason, bool gen_crash_diag); #if LLVM_VERSION_MAJOR < 14 static void fatal_llvm_new_handler(void *user_data, const std::string& reason, bool gen_crash_diag); #endif -#endif static void fatal_llvm_error_handler(void *user_data, const char *reason, bool gen_crash_diag); #if LLVM_VERSION_MAJOR < 14 static void fatal_llvm_error_handler(void *user_data, const std::string& reason, bool gen_crash_diag); @@ -65,9 +63,7 @@ llvm_enter_fatal_on_oom(void) if (fatal_new_handler_depth == 0) { old_new_handler = std::set_new_handler(fatal_system_new_handler); -#if LLVM_VERSION_MAJOR > 4 llvm::install_bad_alloc_error_handler(fatal_llvm_new_handler); -#endif llvm::install_fatal_error_handler(fatal_llvm_error_handler); } fatal_new_handler_depth++; @@ -83,9 +79,7 @@ llvm_leave_fatal_on_oom(void) if (fatal_new_handler_depth == 0) { std::set_new_handler(old_new_handler); -#if LLVM_VERSION_MAJOR > 4 llvm::remove_bad_alloc_error_handler(); -#endif llvm::remove_fatal_error_handler(); } } @@ -110,9 +104,7 @@ llvm_reset_after_error(void) if (fatal_new_handler_depth != 0) { std::set_new_handler(old_new_handler); -#if LLVM_VERSION_MAJOR > 4 llvm::remove_bad_alloc_error_handler(); -#endif llvm::remove_fatal_error_handler(); } fatal_new_handler_depth = 0; @@ -133,7 +125,6 @@ fatal_system_new_handler(void) errdetail("while in LLVM"))); } -#if LLVM_VERSION_MAJOR > 4 static void fatal_llvm_new_handler(void *user_data, const char *reason, @@ -153,7 +144,6 @@ fatal_llvm_new_handler(void *user_data, fatal_llvm_new_handler(user_data, reason.c_str(), gen_crash_diag); } #endif -#endif static void fatal_llvm_error_handler(void *user_data, diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index 00d7b8110b9eb..b9fdd444a2522 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -3,7 +3,7 @@ * llvmjit_expr.c * JIT compile expressions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -84,6 +84,7 @@ llvm_compile_expr(ExprState *state) LLVMBuilderRef b; LLVMModuleRef mod; + LLVMContextRef lc; LLVMValueRef eval_fn; LLVMBasicBlockRef entry; LLVMBasicBlockRef *opblocks; @@ -121,7 +122,9 @@ llvm_compile_expr(ExprState *state) LLVMValueRef v_aggnulls; instr_time starttime; + instr_time deform_starttime; instr_time endtime; + instr_time deform_endtime; llvm_enter_fatal_on_oom(); @@ -143,19 +146,20 @@ llvm_compile_expr(ExprState *state) INSTR_TIME_SET_CURRENT(starttime); mod = llvm_mutable_module(context); + lc = LLVMGetModuleContext(mod); - b = LLVMCreateBuilder(); + b = LLVMCreateBuilderInContext(lc); funcname = llvm_expand_funcname(context, "evalexpr"); /* create function */ eval_fn = LLVMAddFunction(mod, funcname, - llvm_pg_var_func_type("TypeExprStateEvalFunc")); + llvm_pg_var_func_type("ExecInterpExprStillValid")); LLVMSetLinkage(eval_fn, LLVMExternalLinkage); LLVMSetVisibility(eval_fn, LLVMDefaultVisibility); llvm_copy_attributes(AttributeTemplate, eval_fn); - entry = LLVMAppendBasicBlock(eval_fn, "entry"); + entry = LLVMAppendBasicBlockInContext(lc, eval_fn, "entry"); /* build state */ v_state = LLVMGetParam(eval_fn, 0); @@ -164,61 +168,95 @@ llvm_compile_expr(ExprState *state) LLVMPositionBuilderAtEnd(b, entry); - v_tmpvaluep = LLVMBuildStructGEP(b, v_state, - FIELDNO_EXPRSTATE_RESVALUE, - "v.state.resvalue"); - v_tmpisnullp = LLVMBuildStructGEP(b, v_state, - FIELDNO_EXPRSTATE_RESNULL, - "v.state.resnull"); - v_parent = l_load_struct_gep(b, v_state, + v_tmpvaluep = l_struct_gep(b, + StructExprState, + v_state, + FIELDNO_EXPRSTATE_RESVALUE, + "v.state.resvalue"); + v_tmpisnullp = l_struct_gep(b, + StructExprState, + v_state, + FIELDNO_EXPRSTATE_RESNULL, + "v.state.resnull"); + v_parent = l_load_struct_gep(b, + StructExprState, + v_state, FIELDNO_EXPRSTATE_PARENT, "v.state.parent"); /* build global slots */ - v_scanslot = l_load_struct_gep(b, v_econtext, + v_scanslot = l_load_struct_gep(b, + StructExprContext, + v_econtext, FIELDNO_EXPRCONTEXT_SCANTUPLE, "v_scanslot"); - v_innerslot = l_load_struct_gep(b, v_econtext, + v_innerslot = l_load_struct_gep(b, + StructExprContext, + v_econtext, FIELDNO_EXPRCONTEXT_INNERTUPLE, "v_innerslot"); - v_outerslot = l_load_struct_gep(b, v_econtext, + v_outerslot = l_load_struct_gep(b, + StructExprContext, + v_econtext, FIELDNO_EXPRCONTEXT_OUTERTUPLE, "v_outerslot"); - v_resultslot = l_load_struct_gep(b, v_state, + v_resultslot = l_load_struct_gep(b, + StructExprState, + v_state, FIELDNO_EXPRSTATE_RESULTSLOT, "v_resultslot"); /* build global values/isnull pointers */ - v_scanvalues = l_load_struct_gep(b, v_scanslot, + v_scanvalues = l_load_struct_gep(b, + StructTupleTableSlot, + v_scanslot, FIELDNO_TUPLETABLESLOT_VALUES, "v_scanvalues"); - v_scannulls = l_load_struct_gep(b, v_scanslot, + v_scannulls = l_load_struct_gep(b, + StructTupleTableSlot, + v_scanslot, FIELDNO_TUPLETABLESLOT_ISNULL, "v_scannulls"); - v_innervalues = l_load_struct_gep(b, v_innerslot, + v_innervalues = l_load_struct_gep(b, + StructTupleTableSlot, + v_innerslot, FIELDNO_TUPLETABLESLOT_VALUES, "v_innervalues"); - v_innernulls = l_load_struct_gep(b, v_innerslot, + v_innernulls = l_load_struct_gep(b, + StructTupleTableSlot, + v_innerslot, FIELDNO_TUPLETABLESLOT_ISNULL, "v_innernulls"); - v_outervalues = l_load_struct_gep(b, v_outerslot, + v_outervalues = l_load_struct_gep(b, + StructTupleTableSlot, + v_outerslot, FIELDNO_TUPLETABLESLOT_VALUES, "v_outervalues"); - v_outernulls = l_load_struct_gep(b, v_outerslot, + v_outernulls = l_load_struct_gep(b, + StructTupleTableSlot, + v_outerslot, FIELDNO_TUPLETABLESLOT_ISNULL, "v_outernulls"); - v_resultvalues = l_load_struct_gep(b, v_resultslot, + v_resultvalues = l_load_struct_gep(b, + StructTupleTableSlot, + v_resultslot, FIELDNO_TUPLETABLESLOT_VALUES, "v_resultvalues"); - v_resultnulls = l_load_struct_gep(b, v_resultslot, + v_resultnulls = l_load_struct_gep(b, + StructTupleTableSlot, + v_resultslot, FIELDNO_TUPLETABLESLOT_ISNULL, "v_resultnulls"); /* aggvalues/aggnulls */ - v_aggvalues = l_load_struct_gep(b, v_econtext, + v_aggvalues = l_load_struct_gep(b, + StructExprContext, + v_econtext, FIELDNO_EXPRCONTEXT_AGGVALUES, "v.econtext.aggvalues"); - v_aggnulls = l_load_struct_gep(b, v_econtext, + v_aggnulls = l_load_struct_gep(b, + StructExprContext, + v_econtext, FIELDNO_EXPRCONTEXT_AGGNULLS, "v.econtext.aggnulls"); @@ -252,8 +290,8 @@ llvm_compile_expr(ExprState *state) LLVMValueRef v_tmpisnull; LLVMValueRef v_tmpvalue; - v_tmpvalue = LLVMBuildLoad(b, v_tmpvaluep, ""); - v_tmpisnull = LLVMBuildLoad(b, v_tmpisnullp, ""); + v_tmpvalue = l_load(b, TypeSizeT, v_tmpvaluep, ""); + v_tmpisnull = l_load(b, TypeStorageBool, v_tmpisnullp, ""); LLVMBuildStore(b, v_tmpisnull, v_isnullp); @@ -296,12 +334,14 @@ llvm_compile_expr(ExprState *state) * whether deforming is required. */ v_nvalid = - l_load_struct_gep(b, v_slot, + l_load_struct_gep(b, + StructTupleTableSlot, + v_slot, FIELDNO_TUPLETABLESLOT_NVALID, ""); LLVMBuildCondBr(b, LLVMBuildICmp(b, LLVMIntUGE, v_nvalid, - l_int16_const(op->d.fetch.last_var), + l_int16_const(lc, op->d.fetch.last_var), ""), opblocks[opno + 1], b_fetch); @@ -315,10 +355,14 @@ llvm_compile_expr(ExprState *state) */ if (tts_ops && desc && (context->base.flags & PGJIT_DEFORM)) { + INSTR_TIME_SET_CURRENT(deform_starttime); l_jit_deform = slot_compile_deform(context, desc, tts_ops, op->d.fetch.last_var); + INSTR_TIME_SET_CURRENT(deform_endtime); + INSTR_TIME_ACCUM_DIFF(context->base.instr.deform_counter, + deform_endtime, deform_starttime); } if (l_jit_deform) @@ -327,19 +371,22 @@ llvm_compile_expr(ExprState *state) params[0] = v_slot; - LLVMBuildCall(b, l_jit_deform, - params, lengthof(params), ""); + l_call(b, + LLVMGetFunctionType(l_jit_deform), + l_jit_deform, + params, lengthof(params), ""); } else { LLVMValueRef params[2]; params[0] = v_slot; - params[1] = l_int32_const(op->d.fetch.last_var); + params[1] = l_int32_const(lc, op->d.fetch.last_var); - LLVMBuildCall(b, - llvm_pg_func(mod, "slot_getsomeattrs_int"), - params, lengthof(params), ""); + l_call(b, + llvm_pg_var_func_type("slot_getsomeattrs_int"), + llvm_pg_func(mod, "slot_getsomeattrs_int"), + params, lengthof(params), ""); } LLVMBuildBr(b, opblocks[opno + 1]); @@ -372,9 +419,9 @@ llvm_compile_expr(ExprState *state) v_nulls = v_scannulls; } - v_attnum = l_int32_const(op->d.var.attnum); - value = l_load_gep1(b, v_values, v_attnum, ""); - isnull = l_load_gep1(b, v_nulls, v_attnum, ""); + v_attnum = l_int32_const(lc, op->d.var.attnum); + value = l_load_gep1(b, TypeSizeT, v_values, v_attnum, ""); + isnull = l_load_gep1(b, TypeStorageBool, v_nulls, v_attnum, ""); LLVMBuildStore(b, value, v_resvaluep); LLVMBuildStore(b, isnull, v_resnullp); @@ -438,16 +485,20 @@ llvm_compile_expr(ExprState *state) } /* load data */ - v_attnum = l_int32_const(op->d.assign_var.attnum); - v_value = l_load_gep1(b, v_values, v_attnum, ""); - v_isnull = l_load_gep1(b, v_nulls, v_attnum, ""); + v_attnum = l_int32_const(lc, op->d.assign_var.attnum); + v_value = l_load_gep1(b, TypeSizeT, v_values, v_attnum, ""); + v_isnull = l_load_gep1(b, TypeStorageBool, v_nulls, v_attnum, ""); /* compute addresses of targets */ - v_resultnum = l_int32_const(op->d.assign_var.resultnum); - v_rvaluep = LLVMBuildGEP(b, v_resultvalues, - &v_resultnum, 1, ""); - v_risnullp = LLVMBuildGEP(b, v_resultnulls, - &v_resultnum, 1, ""); + v_resultnum = l_int32_const(lc, op->d.assign_var.resultnum); + v_rvaluep = l_gep(b, + TypeSizeT, + v_resultvalues, + &v_resultnum, 1, ""); + v_risnullp = l_gep(b, + TypeStorageBool, + v_resultnulls, + &v_resultnum, 1, ""); /* and store */ LLVMBuildStore(b, v_value, v_rvaluep); @@ -468,15 +519,15 @@ llvm_compile_expr(ExprState *state) size_t resultnum = op->d.assign_tmp.resultnum; /* load data */ - v_value = LLVMBuildLoad(b, v_tmpvaluep, ""); - v_isnull = LLVMBuildLoad(b, v_tmpisnullp, ""); + v_value = l_load(b, TypeSizeT, v_tmpvaluep, ""); + v_isnull = l_load(b, TypeStorageBool, v_tmpisnullp, ""); /* compute addresses of targets */ - v_resultnum = l_int32_const(resultnum); + v_resultnum = l_int32_const(lc, resultnum); v_rvaluep = - LLVMBuildGEP(b, v_resultvalues, &v_resultnum, 1, ""); + l_gep(b, TypeSizeT, v_resultvalues, &v_resultnum, 1, ""); v_risnullp = - LLVMBuildGEP(b, v_resultnulls, &v_resultnum, 1, ""); + l_gep(b, TypeStorageBool, v_resultnulls, &v_resultnum, 1, ""); /* store nullness */ LLVMBuildStore(b, v_isnull, v_risnullp); @@ -500,9 +551,10 @@ llvm_compile_expr(ExprState *state) LLVMPositionBuilderAtEnd(b, b_notnull); v_params[0] = v_value; v_value = - LLVMBuildCall(b, - llvm_pg_func(mod, "MakeExpandedObjectReadOnlyInternal"), - v_params, lengthof(v_params), ""); + l_call(b, + llvm_pg_var_func_type("MakeExpandedObjectReadOnlyInternal"), + llvm_pg_func(mod, "MakeExpandedObjectReadOnlyInternal"), + v_params, lengthof(v_params), ""); /* * Falling out of the if () with builder in b_notnull, @@ -665,8 +717,8 @@ llvm_compile_expr(ExprState *state) if (opcode == EEOP_BOOL_AND_STEP_FIRST) LLVMBuildStore(b, l_sbool_const(0), v_boolanynullp); - v_boolnull = LLVMBuildLoad(b, v_resnullp, ""); - v_boolvalue = LLVMBuildLoad(b, v_resvaluep, ""); + v_boolnull = l_load(b, TypeStorageBool, v_resnullp, ""); + v_boolvalue = l_load(b, TypeSizeT, v_resvaluep, ""); /* set resnull to boolnull */ LLVMBuildStore(b, v_boolnull, v_resnullp); @@ -707,7 +759,7 @@ llvm_compile_expr(ExprState *state) /* Build block that continues if bool is TRUE. */ LLVMPositionBuilderAtEnd(b, b_boolcont); - v_boolanynull = LLVMBuildLoad(b, v_boolanynullp, ""); + v_boolanynull = l_load(b, TypeStorageBool, v_boolanynullp, ""); /* set value to NULL if any previous values were NULL */ LLVMBuildCondBr(b, @@ -761,8 +813,8 @@ llvm_compile_expr(ExprState *state) if (opcode == EEOP_BOOL_OR_STEP_FIRST) LLVMBuildStore(b, l_sbool_const(0), v_boolanynullp); - v_boolnull = LLVMBuildLoad(b, v_resnullp, ""); - v_boolvalue = LLVMBuildLoad(b, v_resvaluep, ""); + v_boolnull = l_load(b, TypeStorageBool, v_resnullp, ""); + v_boolvalue = l_load(b, TypeSizeT, v_resvaluep, ""); /* set resnull to boolnull */ LLVMBuildStore(b, v_boolnull, v_resnullp); @@ -802,7 +854,7 @@ llvm_compile_expr(ExprState *state) /* build block that continues if bool is FALSE */ LLVMPositionBuilderAtEnd(b, b_boolcont); - v_boolanynull = LLVMBuildLoad(b, v_boolanynullp, ""); + v_boolanynull = l_load(b, TypeStorageBool, v_boolanynullp, ""); /* set value to NULL if any previous values were NULL */ LLVMBuildCondBr(b, @@ -826,8 +878,8 @@ llvm_compile_expr(ExprState *state) LLVMValueRef v_boolnull; LLVMValueRef v_negbool; - v_boolnull = LLVMBuildLoad(b, v_resnullp, ""); - v_boolvalue = LLVMBuildLoad(b, v_resvaluep, ""); + v_boolnull = l_load(b, TypeStorageBool, v_resnullp, ""); + v_boolvalue = l_load(b, TypeSizeT, v_resvaluep, ""); v_negbool = LLVMBuildZExt(b, LLVMBuildICmp(b, LLVMIntEQ, @@ -854,8 +906,8 @@ llvm_compile_expr(ExprState *state) b_qualfail = l_bb_before_v(opblocks[opno + 1], "op.%d.qualfail", opno); - v_resvalue = LLVMBuildLoad(b, v_resvaluep, ""); - v_resnull = LLVMBuildLoad(b, v_resnullp, ""); + v_resvalue = l_load(b, TypeSizeT, v_resvaluep, ""); + v_resnull = l_load(b, TypeStorageBool, v_resnullp, ""); v_nullorfalse = LLVMBuildOr(b, @@ -893,7 +945,7 @@ llvm_compile_expr(ExprState *state) /* Transfer control if current result is null */ - v_resnull = LLVMBuildLoad(b, v_resnullp, ""); + v_resnull = l_load(b, TypeStorageBool, v_resnullp, ""); LLVMBuildCondBr(b, LLVMBuildICmp(b, LLVMIntEQ, v_resnull, @@ -909,7 +961,7 @@ llvm_compile_expr(ExprState *state) /* Transfer control if current result is non-null */ - v_resnull = LLVMBuildLoad(b, v_resnullp, ""); + v_resnull = l_load(b, TypeStorageBool, v_resnullp, ""); LLVMBuildCondBr(b, LLVMBuildICmp(b, LLVMIntEQ, v_resnull, @@ -928,8 +980,8 @@ llvm_compile_expr(ExprState *state) /* Transfer control if current result is null or false */ - v_resvalue = LLVMBuildLoad(b, v_resvaluep, ""); - v_resnull = LLVMBuildLoad(b, v_resnullp, ""); + v_resvalue = l_load(b, TypeSizeT, v_resvaluep, ""); + v_resnull = l_load(b, TypeStorageBool, v_resnullp, ""); v_nullorfalse = LLVMBuildOr(b, @@ -948,7 +1000,7 @@ llvm_compile_expr(ExprState *state) case EEOP_NULLTEST_ISNULL: { - LLVMValueRef v_resnull = LLVMBuildLoad(b, v_resnullp, ""); + LLVMValueRef v_resnull = l_load(b, TypeStorageBool, v_resnullp, ""); LLVMValueRef v_resvalue; v_resvalue = @@ -967,7 +1019,7 @@ llvm_compile_expr(ExprState *state) case EEOP_NULLTEST_ISNOTNULL: { - LLVMValueRef v_resnull = LLVMBuildLoad(b, v_resnullp, ""); + LLVMValueRef v_resnull = l_load(b, TypeStorageBool, v_resnullp, ""); LLVMValueRef v_resvalue; v_resvalue = @@ -1003,7 +1055,7 @@ llvm_compile_expr(ExprState *state) { LLVMBasicBlockRef b_isnull, b_notnull; - LLVMValueRef v_resnull = LLVMBuildLoad(b, v_resnullp, ""); + LLVMValueRef v_resnull = l_load(b, TypeStorageBool, v_resnullp, ""); b_isnull = l_bb_before_v(opblocks[opno + 1], "op.%d.isnull", opno); @@ -1047,7 +1099,7 @@ llvm_compile_expr(ExprState *state) else { LLVMValueRef v_value = - LLVMBuildLoad(b, v_resvaluep, ""); + l_load(b, TypeSizeT, v_resvaluep, ""); v_value = LLVMBuildZExt(b, LLVMBuildICmp(b, LLVMIntEQ, @@ -1075,20 +1127,19 @@ llvm_compile_expr(ExprState *state) case EEOP_PARAM_CALLBACK: { - LLVMTypeRef v_functype; LLVMValueRef v_func; LLVMValueRef v_params[3]; - v_functype = llvm_pg_var_func_type("TypeExecEvalSubroutine"); v_func = l_ptr_const(op->d.cparam.paramfunc, - LLVMPointerType(v_functype, 0)); + llvm_pg_var_type("TypeExecEvalSubroutine")); v_params[0] = v_state; v_params[1] = l_ptr_const(op, l_ptr(StructExprEvalStep)); v_params[2] = v_econtext; - LLVMBuildCall(b, - v_func, - v_params, lengthof(v_params), ""); + l_call(b, + LLVMGetFunctionType(ExecEvalSubroutineTemplate), + v_func, + v_params, lengthof(v_params), ""); LLVMBuildBr(b, opblocks[opno + 1]); break; @@ -1097,21 +1148,20 @@ llvm_compile_expr(ExprState *state) case EEOP_SBSREF_SUBSCRIPTS: { int jumpdone = op->d.sbsref_subscript.jumpdone; - LLVMTypeRef v_functype; LLVMValueRef v_func; LLVMValueRef v_params[3]; LLVMValueRef v_ret; - v_functype = llvm_pg_var_func_type("TypeExecEvalBoolSubroutine"); v_func = l_ptr_const(op->d.sbsref_subscript.subscriptfunc, - LLVMPointerType(v_functype, 0)); + llvm_pg_var_type("TypeExecEvalBoolSubroutine")); v_params[0] = v_state; v_params[1] = l_ptr_const(op, l_ptr(StructExprEvalStep)); v_params[2] = v_econtext; - v_ret = LLVMBuildCall(b, - v_func, - v_params, lengthof(v_params), ""); + v_ret = l_call(b, + LLVMGetFunctionType(ExecEvalBoolSubroutineTemplate), + v_func, + v_params, lengthof(v_params), ""); v_ret = LLVMBuildZExt(b, v_ret, TypeStorageBool, ""); LLVMBuildCondBr(b, @@ -1126,20 +1176,19 @@ llvm_compile_expr(ExprState *state) case EEOP_SBSREF_ASSIGN: case EEOP_SBSREF_FETCH: { - LLVMTypeRef v_functype; LLVMValueRef v_func; LLVMValueRef v_params[3]; - v_functype = llvm_pg_var_func_type("TypeExecEvalSubroutine"); v_func = l_ptr_const(op->d.sbsref.subscriptfunc, - LLVMPointerType(v_functype, 0)); + llvm_pg_var_type("TypeExecEvalSubroutine")); v_params[0] = v_state; v_params[1] = l_ptr_const(op, l_ptr(StructExprEvalStep)); v_params[2] = v_econtext; - LLVMBuildCall(b, - v_func, - v_params, lengthof(v_params), ""); + l_call(b, + LLVMGetFunctionType(ExecEvalSubroutineTemplate), + v_func, + v_params, lengthof(v_params), ""); LLVMBuildBr(b, opblocks[opno + 1]); break; @@ -1174,8 +1223,8 @@ llvm_compile_expr(ExprState *state) /* if casetest != NULL */ LLVMPositionBuilderAtEnd(b, b_avail); - v_casevalue = LLVMBuildLoad(b, v_casevaluep, ""); - v_casenull = LLVMBuildLoad(b, v_casenullp, ""); + v_casevalue = l_load(b, TypeSizeT, v_casevaluep, ""); + v_casenull = l_load(b, TypeStorageBool, v_casenullp, ""); LLVMBuildStore(b, v_casevalue, v_resvaluep); LLVMBuildStore(b, v_casenull, v_resnullp); LLVMBuildBr(b, opblocks[opno + 1]); @@ -1183,10 +1232,14 @@ llvm_compile_expr(ExprState *state) /* if casetest == NULL */ LLVMPositionBuilderAtEnd(b, b_notavail); v_casevalue = - l_load_struct_gep(b, v_econtext, + l_load_struct_gep(b, + StructExprContext, + v_econtext, FIELDNO_EXPRCONTEXT_CASEDATUM, ""); v_casenull = - l_load_struct_gep(b, v_econtext, + l_load_struct_gep(b, + StructExprContext, + v_econtext, FIELDNO_EXPRCONTEXT_CASENULL, ""); LLVMBuildStore(b, v_casevalue, v_resvaluep); LLVMBuildStore(b, v_casenull, v_resnullp); @@ -1211,7 +1264,7 @@ llvm_compile_expr(ExprState *state) v_nullp = l_ptr_const(op->d.make_readonly.isnull, l_ptr(TypeStorageBool)); - v_null = LLVMBuildLoad(b, v_nullp, ""); + v_null = l_load(b, TypeStorageBool, v_nullp, ""); /* store null isnull value in result */ LLVMBuildStore(b, v_null, v_resnullp); @@ -1228,13 +1281,14 @@ llvm_compile_expr(ExprState *state) v_valuep = l_ptr_const(op->d.make_readonly.value, l_ptr(TypeSizeT)); - v_value = LLVMBuildLoad(b, v_valuep, ""); + v_value = l_load(b, TypeSizeT, v_valuep, ""); v_params[0] = v_value; v_ret = - LLVMBuildCall(b, - llvm_pg_func(mod, "MakeExpandedObjectReadOnlyInternal"), - v_params, lengthof(v_params), ""); + l_call(b, + llvm_pg_var_func_type("MakeExpandedObjectReadOnlyInternal"), + llvm_pg_func(mod, "MakeExpandedObjectReadOnlyInternal"), + v_params, lengthof(v_params), ""); LLVMBuildStore(b, v_ret, v_resvaluep); LLVMBuildBr(b, opblocks[opno + 1]); @@ -1280,12 +1334,14 @@ llvm_compile_expr(ExprState *state) v_fcinfo_in = l_ptr_const(fcinfo_in, l_ptr(StructFunctionCallInfoData)); v_fcinfo_in_isnullp = - LLVMBuildStructGEP(b, v_fcinfo_in, - FIELDNO_FUNCTIONCALLINFODATA_ISNULL, - "v_fcinfo_in_isnull"); + l_struct_gep(b, + StructFunctionCallInfoData, + v_fcinfo_in, + FIELDNO_FUNCTIONCALLINFODATA_ISNULL, + "v_fcinfo_in_isnull"); /* output functions are not called on nulls */ - v_resnull = LLVMBuildLoad(b, v_resnullp, ""); + v_resnull = l_load(b, TypeStorageBool, v_resnullp, ""); LLVMBuildCondBr(b, LLVMBuildICmp(b, LLVMIntEQ, v_resnull, l_sbool_const(1), ""), @@ -1297,7 +1353,7 @@ llvm_compile_expr(ExprState *state) LLVMBuildBr(b, b_input); LLVMPositionBuilderAtEnd(b, b_calloutput); - v_resvalue = LLVMBuildLoad(b, v_resvaluep, ""); + v_resvalue = l_load(b, TypeSizeT, v_resvaluep, ""); /* set arg[0] */ LLVMBuildStore(b, @@ -1307,8 +1363,10 @@ llvm_compile_expr(ExprState *state) l_sbool_const(0), l_funcnullp(b, v_fcinfo_out, 0)); /* and call output function (can never return NULL) */ - v_output = LLVMBuildCall(b, v_fn_out, &v_fcinfo_out, - 1, "funccall_coerce_out"); + v_output = l_call(b, + LLVMGetFunctionType(v_fn_out), + v_fn_out, &v_fcinfo_out, + 1, "funccall_coerce_out"); LLVMBuildBr(b, b_input); /* build block handling input function call */ @@ -1362,8 +1420,10 @@ llvm_compile_expr(ExprState *state) /* reset fcinfo_in->isnull */ LLVMBuildStore(b, l_sbool_const(0), v_fcinfo_in_isnullp); /* and call function */ - v_retval = LLVMBuildCall(b, v_fn_in, &v_fcinfo_in, 1, - "funccall_iocoerce_in"); + v_retval = l_call(b, + LLVMGetFunctionType(v_fn_in), + v_fn_in, &v_fcinfo_in, 1, + "funccall_iocoerce_in"); LLVMBuildStore(b, v_retval, v_resvaluep); @@ -1371,6 +1431,12 @@ llvm_compile_expr(ExprState *state) break; } + case EEOP_IOCOERCE_SAFE: + build_EvalXFunc(b, mod, "ExecEvalCoerceViaIOSafe", + v_state, op); + LLVMBuildBr(b, opblocks[opno + 1]); + break; + case EEOP_DISTINCT: case EEOP_NOT_DISTINCT: { @@ -1496,6 +1562,9 @@ llvm_compile_expr(ExprState *state) v_fcinfo = l_ptr_const(fcinfo, l_ptr(StructFunctionCallInfoData)); + /* save original arg[0] */ + v_arg0 = l_funcvalue(b, v_fcinfo, 0); + /* if either argument is NULL they can't be equal */ v_argnull0 = l_funcnull(b, v_fcinfo, 0); v_argnull1 = l_funcnull(b, v_fcinfo, 1); @@ -1512,7 +1581,6 @@ llvm_compile_expr(ExprState *state) /* one (or both) of the arguments are null, return arg[0] */ LLVMPositionBuilderAtEnd(b, b_hasnull); - v_arg0 = l_funcvalue(b, v_fcinfo, 0); LLVMBuildStore(b, v_argnull0, v_resnullp); LLVMBuildStore(b, v_arg0, v_resvaluep); LLVMBuildBr(b, opblocks[opno + 1]); @@ -1520,12 +1588,35 @@ llvm_compile_expr(ExprState *state) /* build block to invoke function and check result */ LLVMPositionBuilderAtEnd(b, b_nonull); + /* + * If first argument is of varlena type, it might be an + * expanded datum. We need to ensure that the value + * passed to the comparison function is a read-only + * pointer. However, if we end by returning the first + * argument, that will be the original read-write pointer + * if it was read-write. + */ + if (op->d.func.make_ro) + { + LLVMValueRef v_params[1]; + LLVMValueRef v_arg0_ro; + + v_params[0] = v_arg0; + v_arg0_ro = + l_call(b, + llvm_pg_var_func_type("MakeExpandedObjectReadOnlyInternal"), + llvm_pg_func(mod, "MakeExpandedObjectReadOnlyInternal"), + v_params, lengthof(v_params), ""); + LLVMBuildStore(b, v_arg0_ro, + l_funcvaluep(b, v_fcinfo, 0)); + } + v_retval = BuildV1Call(context, b, mod, fcinfo, &v_fcinfo_isnull); /* - * If result not null, and arguments are equal return null - * (same result as if there'd been NULLs, hence reuse - * b_hasnull). + * If result not null and arguments are equal return null, + * else return arg[0] (same result as if there'd been + * NULLs, hence reuse b_hasnull). */ v_argsequal = LLVMBuildAnd(b, LLVMBuildICmp(b, LLVMIntEQ, @@ -1696,8 +1787,8 @@ llvm_compile_expr(ExprState *state) */ v_cmpresult = LLVMBuildTrunc(b, - LLVMBuildLoad(b, v_resvaluep, ""), - LLVMInt32Type(), ""); + l_load(b, TypeSizeT, v_resvaluep, ""), + LLVMInt32TypeInContext(lc), ""); switch (rctype) { @@ -1723,7 +1814,7 @@ llvm_compile_expr(ExprState *state) v_result = LLVMBuildICmp(b, predicate, v_cmpresult, - l_int32_const(0), + l_int32_const(lc, 0), ""); v_result = LLVMBuildZExt(b, v_result, TypeSizeT, ""); @@ -1789,8 +1880,8 @@ llvm_compile_expr(ExprState *state) /* if casetest != NULL */ LLVMPositionBuilderAtEnd(b, b_avail); - v_casevalue = LLVMBuildLoad(b, v_casevaluep, ""); - v_casenull = LLVMBuildLoad(b, v_casenullp, ""); + v_casevalue = l_load(b, TypeSizeT, v_casevaluep, ""); + v_casenull = l_load(b, TypeStorageBool, v_casenullp, ""); LLVMBuildStore(b, v_casevalue, v_resvaluep); LLVMBuildStore(b, v_casenull, v_resnullp); LLVMBuildBr(b, opblocks[opno + 1]); @@ -1798,11 +1889,15 @@ llvm_compile_expr(ExprState *state) /* if casetest == NULL */ LLVMPositionBuilderAtEnd(b, b_notavail); v_casevalue = - l_load_struct_gep(b, v_econtext, + l_load_struct_gep(b, + StructExprContext, + v_econtext, FIELDNO_EXPRCONTEXT_DOMAINDATUM, ""); v_casenull = - l_load_struct_gep(b, v_econtext, + l_load_struct_gep(b, + StructExprContext, + v_econtext, FIELDNO_EXPRCONTEXT_DOMAINNULL, ""); LLVMBuildStore(b, v_casevalue, v_resvaluep); @@ -1860,17 +1955,125 @@ llvm_compile_expr(ExprState *state) LLVMBuildBr(b, opblocks[opno + 1]); break; + case EEOP_JSONEXPR_PATH: + { + JsonExprState *jsestate = op->d.jsonexpr.jsestate; + LLVMValueRef v_ret; + + /* + * Call ExecEvalJsonExprPath(). It returns the address of + * the step to perform next. + */ + v_ret = build_EvalXFunc(b, mod, "ExecEvalJsonExprPath", + v_state, op, v_econtext); + + /* + * Build a switch to map the return value (v_ret above), + * which is a runtime value of the step address to perform + * next, to either jump_empty, jump_error, + * jump_eval_coercion, or jump_end. + */ + if (jsestate->jump_empty >= 0 || + jsestate->jump_error >= 0 || + jsestate->jump_eval_coercion >= 0) + { + LLVMValueRef v_jump_empty; + LLVMValueRef v_jump_error; + LLVMValueRef v_jump_coercion; + LLVMValueRef v_switch; + LLVMBasicBlockRef b_done, + b_empty, + b_error, + b_coercion; + + b_empty = + l_bb_before_v(opblocks[opno + 1], + "op.%d.jsonexpr_empty", opno); + b_error = + l_bb_before_v(opblocks[opno + 1], + "op.%d.jsonexpr_error", opno); + b_coercion = + l_bb_before_v(opblocks[opno + 1], + "op.%d.jsonexpr_coercion", opno); + b_done = + l_bb_before_v(opblocks[opno + 1], + "op.%d.jsonexpr_done", opno); + + v_switch = LLVMBuildSwitch(b, + v_ret, + b_done, + 3); + /* Returned jsestate->jump_empty? */ + if (jsestate->jump_empty >= 0) + { + v_jump_empty = l_int32_const(lc, jsestate->jump_empty); + LLVMAddCase(v_switch, v_jump_empty, b_empty); + } + /* ON EMPTY code */ + LLVMPositionBuilderAtEnd(b, b_empty); + if (jsestate->jump_empty >= 0) + LLVMBuildBr(b, opblocks[jsestate->jump_empty]); + else + LLVMBuildUnreachable(b); + + /* Returned jsestate->jump_error? */ + if (jsestate->jump_error >= 0) + { + v_jump_error = l_int32_const(lc, jsestate->jump_error); + LLVMAddCase(v_switch, v_jump_error, b_error); + } + /* ON ERROR code */ + LLVMPositionBuilderAtEnd(b, b_error); + if (jsestate->jump_error >= 0) + LLVMBuildBr(b, opblocks[jsestate->jump_error]); + else + LLVMBuildUnreachable(b); + + /* Returned jsestate->jump_eval_coercion? */ + if (jsestate->jump_eval_coercion >= 0) + { + v_jump_coercion = l_int32_const(lc, jsestate->jump_eval_coercion); + LLVMAddCase(v_switch, v_jump_coercion, b_coercion); + } + /* jump_eval_coercion code */ + LLVMPositionBuilderAtEnd(b, b_coercion); + if (jsestate->jump_eval_coercion >= 0) + LLVMBuildBr(b, opblocks[jsestate->jump_eval_coercion]); + else + LLVMBuildUnreachable(b); + + LLVMPositionBuilderAtEnd(b, b_done); + } + + LLVMBuildBr(b, opblocks[jsestate->jump_end]); + break; + } + + case EEOP_JSONEXPR_COERCION: + build_EvalXFunc(b, mod, "ExecEvalJsonCoercion", + v_state, op, v_econtext); + + LLVMBuildBr(b, opblocks[opno + 1]); + break; + + case EEOP_JSONEXPR_COERCION_FINISH: + build_EvalXFunc(b, mod, "ExecEvalJsonCoercionFinish", + v_state, op); + + LLVMBuildBr(b, opblocks[opno + 1]); + break; + case EEOP_AGGREF: { LLVMValueRef v_aggno; LLVMValueRef value, isnull; - v_aggno = l_int32_const(op->d.aggref.aggno); + v_aggno = l_int32_const(lc, op->d.aggref.aggno); /* load agg value / null */ - value = l_load_gep1(b, v_aggvalues, v_aggno, "aggvalue"); - isnull = l_load_gep1(b, v_aggnulls, v_aggno, "aggnull"); + value = l_load_gep1(b, TypeSizeT, v_aggvalues, v_aggno, "aggvalue"); + isnull = l_load_gep1(b, TypeStorageBool, v_aggnulls, v_aggno, "aggnull"); /* and store result */ LLVMBuildStore(b, value, v_resvaluep); @@ -1900,13 +2103,13 @@ llvm_compile_expr(ExprState *state) * expression). So load it from memory each time round. */ v_wfuncnop = l_ptr_const(&wfunc->wfuncno, - l_ptr(LLVMInt32Type())); - v_wfuncno = LLVMBuildLoad(b, v_wfuncnop, "v_wfuncno"); + l_ptr(LLVMInt32TypeInContext(lc))); + v_wfuncno = l_load(b, LLVMInt32TypeInContext(lc), v_wfuncnop, "v_wfuncno"); /* load window func value / null */ - value = l_load_gep1(b, v_aggvalues, v_wfuncno, + value = l_load_gep1(b, TypeSizeT, v_aggvalues, v_wfuncno, "windowvalue"); - isnull = l_load_gep1(b, v_aggnulls, v_wfuncno, + isnull = l_load_gep1(b, TypeStorageBool, v_aggnulls, v_wfuncno, "windownull"); LLVMBuildStore(b, value, v_resvaluep); @@ -1916,6 +2119,12 @@ llvm_compile_expr(ExprState *state) break; } + case EEOP_MERGE_SUPPORT_FUNC: + build_EvalXFunc(b, mod, "ExecEvalMergeSupportFunc", + v_state, op, v_econtext); + LLVMBuildBr(b, opblocks[opno + 1]); + break; + case EEOP_SUBPLAN: build_EvalXFunc(b, mod, "ExecEvalSubPlan", v_state, op, v_econtext); @@ -2008,7 +2217,7 @@ llvm_compile_expr(ExprState *state) /* strict function, check for NULL args */ for (int argno = 0; argno < nargs; argno++) { - LLVMValueRef v_argno = l_int32_const(argno); + LLVMValueRef v_argno = l_int32_const(lc, argno); LLVMValueRef v_argisnull; LLVMBasicBlockRef b_argnotnull; @@ -2020,14 +2229,14 @@ llvm_compile_expr(ExprState *state) b_argnotnull = b_checknulls[argno + 1]; if (opcode == EEOP_AGG_STRICT_INPUT_CHECK_NULLS) - v_argisnull = l_load_gep1(b, v_nullsp, v_argno, ""); + v_argisnull = l_load_gep1(b, TypeStorageBool, v_nullsp, v_argno, ""); else { LLVMValueRef v_argn; - v_argn = LLVMBuildGEP(b, v_argsp, &v_argno, 1, ""); + v_argn = l_gep(b, StructNullableDatum, v_argsp, &v_argno, 1, ""); v_argisnull = - l_load_struct_gep(b, v_argn, + l_load_struct_gep(b, StructNullableDatum, v_argn, FIELDNO_NULLABLE_DATUM_ISNULL, ""); } @@ -2061,13 +2270,16 @@ llvm_compile_expr(ExprState *state) v_aggstatep = LLVMBuildBitCast(b, v_parent, l_ptr(StructAggState), ""); - v_allpergroupsp = l_load_struct_gep(b, v_aggstatep, + v_allpergroupsp = l_load_struct_gep(b, + StructAggState, + v_aggstatep, FIELDNO_AGGSTATE_ALL_PERGROUPS, "aggstate.all_pergroups"); - v_setoff = l_int32_const(op->d.agg_plain_pergroup_nullcheck.setoff); + v_setoff = l_int32_const(lc, op->d.agg_plain_pergroup_nullcheck.setoff); - v_pergroup_allaggs = l_load_gep1(b, v_allpergroupsp, v_setoff, ""); + v_pergroup_allaggs = l_load_gep1(b, l_ptr(StructAggStatePerGroupData), + v_allpergroupsp, v_setoff, ""); LLVMBuildCondBr(b, LLVMBuildICmp(b, LLVMIntEQ, @@ -2130,15 +2342,19 @@ llvm_compile_expr(ExprState *state) * [op->d.agg_trans.setoff] [op->d.agg_trans.transno]; */ v_allpergroupsp = - l_load_struct_gep(b, v_aggstatep, + l_load_struct_gep(b, + StructAggState, + v_aggstatep, FIELDNO_AGGSTATE_ALL_PERGROUPS, "aggstate.all_pergroups"); - v_setoff = l_int32_const(op->d.agg_trans.setoff); - v_transno = l_int32_const(op->d.agg_trans.transno); + v_setoff = l_int32_const(lc, op->d.agg_trans.setoff); + v_transno = l_int32_const(lc, op->d.agg_trans.transno); v_pergroupp = - LLVMBuildGEP(b, - l_load_gep1(b, v_allpergroupsp, v_setoff, ""), - &v_transno, 1, ""); + l_gep(b, + StructAggStatePerGroupData, + l_load_gep1(b, l_ptr(StructAggStatePerGroupData), + v_allpergroupsp, v_setoff, ""), + &v_transno, 1, ""); if (opcode == EEOP_AGG_PLAIN_TRANS_INIT_STRICT_BYVAL || @@ -2149,7 +2365,9 @@ llvm_compile_expr(ExprState *state) LLVMBasicBlockRef b_no_init; v_notransvalue = - l_load_struct_gep(b, v_pergroupp, + l_load_struct_gep(b, + StructAggStatePerGroupData, + v_pergroupp, FIELDNO_AGGSTATEPERGROUPDATA_NOTRANSVALUE, "notransvalue"); @@ -2178,10 +2396,11 @@ llvm_compile_expr(ExprState *state) params[2] = v_pergroupp; params[3] = v_aggcontext; - LLVMBuildCall(b, - llvm_pg_func(mod, "ExecAggInitGroup"), - params, lengthof(params), - ""); + l_call(b, + llvm_pg_var_func_type("ExecAggInitGroup"), + llvm_pg_func(mod, "ExecAggInitGroup"), + params, lengthof(params), + ""); LLVMBuildBr(b, opblocks[opno + 1]); } @@ -2200,7 +2419,9 @@ llvm_compile_expr(ExprState *state) b_strictpass = l_bb_before_v(opblocks[opno + 1], "op.%d.strictpass", opno); v_transnull = - l_load_struct_gep(b, v_pergroupp, + l_load_struct_gep(b, + StructAggStatePerGroupData, + v_pergroupp, FIELDNO_AGGSTATEPERGROUPDATA_TRANSVALUEISNULL, "transnull"); @@ -2220,24 +2441,27 @@ llvm_compile_expr(ExprState *state) l_ptr(StructExprContext)); v_current_setp = - LLVMBuildStructGEP(b, - v_aggstatep, - FIELDNO_AGGSTATE_CURRENT_SET, - "aggstate.current_set"); + l_struct_gep(b, + StructAggState, + v_aggstatep, + FIELDNO_AGGSTATE_CURRENT_SET, + "aggstate.current_set"); v_curaggcontext = - LLVMBuildStructGEP(b, - v_aggstatep, - FIELDNO_AGGSTATE_CURAGGCONTEXT, - "aggstate.curaggcontext"); + l_struct_gep(b, + StructAggState, + v_aggstatep, + FIELDNO_AGGSTATE_CURAGGCONTEXT, + "aggstate.curaggcontext"); v_current_pertransp = - LLVMBuildStructGEP(b, - v_aggstatep, - FIELDNO_AGGSTATE_CURPERTRANS, - "aggstate.curpertrans"); + l_struct_gep(b, + StructAggState, + v_aggstatep, + FIELDNO_AGGSTATE_CURPERTRANS, + "aggstate.curpertrans"); /* set aggstate globals */ LLVMBuildStore(b, v_aggcontext, v_curaggcontext); - LLVMBuildStore(b, l_int32_const(op->d.agg_trans.setno), + LLVMBuildStore(b, l_int32_const(lc, op->d.agg_trans.setno), v_current_setp); LLVMBuildStore(b, v_pertransp, v_current_pertransp); @@ -2249,19 +2473,25 @@ llvm_compile_expr(ExprState *state) /* store transvalue in fcinfo->args[0] */ v_transvaluep = - LLVMBuildStructGEP(b, v_pergroupp, - FIELDNO_AGGSTATEPERGROUPDATA_TRANSVALUE, - "transvalue"); + l_struct_gep(b, + StructAggStatePerGroupData, + v_pergroupp, + FIELDNO_AGGSTATEPERGROUPDATA_TRANSVALUE, + "transvalue"); v_transnullp = - LLVMBuildStructGEP(b, v_pergroupp, - FIELDNO_AGGSTATEPERGROUPDATA_TRANSVALUEISNULL, - "transnullp"); + l_struct_gep(b, + StructAggStatePerGroupData, + v_pergroupp, + FIELDNO_AGGSTATEPERGROUPDATA_TRANSVALUEISNULL, + "transnullp"); LLVMBuildStore(b, - LLVMBuildLoad(b, v_transvaluep, - "transvalue"), + l_load(b, + TypeSizeT, + v_transvaluep, + "transvalue"), l_funcvaluep(b, v_fcinfo, 0)); LLVMBuildStore(b, - LLVMBuildLoad(b, v_transnullp, "transnull"), + l_load(b, TypeStorageBool, v_transnullp, "transnull"), l_funcnullp(b, v_fcinfo, 0)); /* and invoke transition function */ @@ -2294,8 +2524,8 @@ llvm_compile_expr(ExprState *state) b_nocall = l_bb_before_v(opblocks[opno + 1], "op.%d.transnocall", opno); - v_transvalue = LLVMBuildLoad(b, v_transvaluep, ""); - v_transnull = LLVMBuildLoad(b, v_transnullp, ""); + v_transvalue = l_load(b, TypeSizeT, v_transvaluep, ""); + v_transnull = l_load(b, TypeStorageBool, v_transnullp, ""); /* * DatumGetPointer(newVal) != @@ -2321,9 +2551,11 @@ llvm_compile_expr(ExprState *state) v_fn = llvm_pg_func(mod, "ExecAggCopyTransValue"); v_newval = - LLVMBuildCall(b, v_fn, - params, lengthof(params), - ""); + l_call(b, + LLVMGetFunctionType(v_fn), + v_fn, + params, lengthof(params), + ""); /* store trans value */ LLVMBuildStore(b, v_newval, v_transvaluep); @@ -2359,7 +2591,7 @@ llvm_compile_expr(ExprState *state) v_args[0] = l_ptr_const(aggstate, l_ptr(StructAggState)); v_args[1] = l_ptr_const(pertrans, l_ptr(StructAggStatePerTransData)); - v_ret = LLVMBuildCall(b, v_fn, v_args, 2, ""); + v_ret = l_call(b, LLVMGetFunctionType(v_fn), v_fn, v_args, 2, ""); v_ret = LLVMBuildZExt(b, v_ret, TypeStorageBool, ""); LLVMBuildCondBr(b, @@ -2383,7 +2615,7 @@ llvm_compile_expr(ExprState *state) v_args[0] = l_ptr_const(aggstate, l_ptr(StructAggState)); v_args[1] = l_ptr_const(pertrans, l_ptr(StructAggStatePerTransData)); - v_ret = LLVMBuildCall(b, v_fn, v_args, 2, ""); + v_ret = l_call(b, LLVMGetFunctionType(v_fn), v_fn, v_args, 2, ""); v_ret = LLVMBuildZExt(b, v_ret, TypeStorageBool, ""); LLVMBuildCondBr(b, @@ -2473,23 +2705,28 @@ BuildV1Call(LLVMJitContext *context, LLVMBuilderRef b, LLVMModuleRef mod, FunctionCallInfo fcinfo, LLVMValueRef *v_fcinfo_isnull) { + LLVMContextRef lc; LLVMValueRef v_fn; LLVMValueRef v_fcinfo_isnullp; LLVMValueRef v_retval; LLVMValueRef v_fcinfo; + lc = LLVMGetModuleContext(mod); + v_fn = llvm_function_reference(context, b, mod, fcinfo); v_fcinfo = l_ptr_const(fcinfo, l_ptr(StructFunctionCallInfoData)); - v_fcinfo_isnullp = LLVMBuildStructGEP(b, v_fcinfo, - FIELDNO_FUNCTIONCALLINFODATA_ISNULL, - "v_fcinfo_isnull"); + v_fcinfo_isnullp = l_struct_gep(b, + StructFunctionCallInfoData, + v_fcinfo, + FIELDNO_FUNCTIONCALLINFODATA_ISNULL, + "v_fcinfo_isnull"); LLVMBuildStore(b, l_sbool_const(0), v_fcinfo_isnullp); - v_retval = LLVMBuildCall(b, v_fn, &v_fcinfo, 1, "funccall"); + v_retval = l_call(b, LLVMGetFunctionType(AttributeTemplate), v_fn, &v_fcinfo, 1, "funccall"); if (v_fcinfo_isnull) - *v_fcinfo_isnull = LLVMBuildLoad(b, v_fcinfo_isnullp, ""); + *v_fcinfo_isnull = l_load(b, TypeStorageBool, v_fcinfo_isnullp, ""); /* * Add lifetime-end annotation, signaling that writes to memory don't have @@ -2499,13 +2736,13 @@ BuildV1Call(LLVMJitContext *context, LLVMBuilderRef b, LLVMValueRef v_lifetime = create_LifetimeEnd(mod); LLVMValueRef params[2]; - params[0] = l_int64_const(sizeof(NullableDatum) * fcinfo->nargs); - params[1] = l_ptr_const(fcinfo->args, l_ptr(LLVMInt8Type())); - LLVMBuildCall(b, v_lifetime, params, lengthof(params), ""); + params[0] = l_int64_const(lc, sizeof(NullableDatum) * fcinfo->nargs); + params[1] = l_ptr_const(fcinfo->args, l_ptr(LLVMInt8TypeInContext(lc))); + l_call(b, LLVMGetFunctionType(v_lifetime), v_lifetime, params, lengthof(params), ""); - params[0] = l_int64_const(sizeof(fcinfo->isnull)); - params[1] = l_ptr_const(&fcinfo->isnull, l_ptr(LLVMInt8Type())); - LLVMBuildCall(b, v_lifetime, params, lengthof(params), ""); + params[0] = l_int64_const(lc, sizeof(fcinfo->isnull)); + params[1] = l_ptr_const(&fcinfo->isnull, l_ptr(LLVMInt8TypeInContext(lc))); + l_call(b, LLVMGetFunctionType(v_lifetime), v_lifetime, params, lengthof(params), ""); } return v_retval; @@ -2537,7 +2774,7 @@ build_EvalXFuncInt(LLVMBuilderRef b, LLVMModuleRef mod, const char *funcname, for (int i = 0; i < nargs; i++) params[argno++] = v_args[i]; - v_ret = LLVMBuildCall(b, v_fn, params, argno, ""); + v_ret = l_call(b, LLVMGetFunctionType(v_fn), v_fn, params, argno, ""); pfree(params); @@ -2550,24 +2787,21 @@ create_LifetimeEnd(LLVMModuleRef mod) LLVMTypeRef sig; LLVMValueRef fn; LLVMTypeRef param_types[2]; + LLVMContextRef lc; - /* LLVM 5+ has a variadic pointer argument */ -#if LLVM_VERSION_MAJOR < 5 - const char *nm = "llvm.lifetime.end"; -#else + /* variadic pointer argument */ const char *nm = "llvm.lifetime.end.p0i8"; -#endif fn = LLVMGetNamedFunction(mod, nm); if (fn) return fn; - param_types[0] = LLVMInt64Type(); - param_types[1] = l_ptr(LLVMInt8Type()); + lc = LLVMGetModuleContext(mod); + param_types[0] = LLVMInt64TypeInContext(lc); + param_types[1] = l_ptr(LLVMInt8TypeInContext(lc)); - sig = LLVMFunctionType(LLVMVoidType(), - param_types, lengthof(param_types), - false); + sig = LLVMFunctionType(LLVMVoidTypeInContext(lc), param_types, + lengthof(param_types), false); fn = LLVMAddFunction(mod, nm, sig); LLVMSetFunctionCallConv(fn, LLVMCCallConv); diff --git a/src/backend/jit/llvm/llvmjit_inline.cpp b/src/backend/jit/llvm/llvmjit_inline.cpp index c765add8564c8..2007eb523c9b6 100644 --- a/src/backend/jit/llvm/llvmjit_inline.cpp +++ b/src/backend/jit/llvm/llvmjit_inline.cpp @@ -11,7 +11,7 @@ * so for all external functions, all the referenced functions (and * prerequisites) will be imported. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/llvmjit/llvmjit_inline.cpp @@ -49,12 +49,7 @@ extern "C" #include #include #include -#if LLVM_VERSION_MAJOR > 3 #include -#else -#include -#include -#endif #include #include #include @@ -114,12 +109,12 @@ typedef llvm::StringMap > SummaryCache llvm::ManagedStatic summary_cache; -static std::unique_ptr llvm_build_inline_plan(llvm::Module *mod); +static std::unique_ptr llvm_build_inline_plan(LLVMContextRef lc, llvm::Module *mod); static void llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline); -static llvm::Module* load_module_cached(llvm::StringRef modPath); -static std::unique_ptr load_module(llvm::StringRef Identifier); +static llvm::Module* load_module_cached(LLVMContextRef c, llvm::StringRef modPath); +static std::unique_ptr load_module(LLVMContextRef c, llvm::StringRef Identifier); static std::unique_ptr llvm_load_summary(llvm::StringRef path); @@ -152,6 +147,18 @@ summaries_for_guid(const InlineSearchPath& path, llvm::GlobalValue::GUID guid); #define ilog(...) (void) 0 #endif +/* + * Reset inlining related state. This needs to be called before the currently + * used LLVMContextRef is disposed (and a new one create), otherwise we would + * have dangling references to deleted modules. + */ +void +llvm_inline_reset_caches(void) +{ + module_cache->clear(); + summary_cache->clear(); +} + /* * Perform inlining of external function references in M based on a simple * cost based analysis. @@ -159,9 +166,10 @@ summaries_for_guid(const InlineSearchPath& path, llvm::GlobalValue::GUID guid); void llvm_inline(LLVMModuleRef M) { + LLVMContextRef lc = LLVMGetModuleContext(M); llvm::Module *mod = llvm::unwrap(M); - std::unique_ptr globalsToInline = llvm_build_inline_plan(mod); + std::unique_ptr globalsToInline = llvm_build_inline_plan(lc, mod); if (!globalsToInline) return; llvm_execute_inline_plan(mod, globalsToInline.get()); @@ -172,7 +180,7 @@ llvm_inline(LLVMModuleRef M) * mod. */ static std::unique_ptr -llvm_build_inline_plan(llvm::Module *mod) +llvm_build_inline_plan(LLVMContextRef lc, llvm::Module *mod) { std::unique_ptr globalsToInline(new ImportMapTy()); FunctionInlineStates functionStates; @@ -254,14 +262,12 @@ llvm_build_inline_plan(llvm::Module *mod) fs = llvm::cast(gvs); -#if LLVM_VERSION_MAJOR > 3 if (gvs->notEligibleToImport()) { ilog(DEBUG1, "ineligibile to import %s due to summary", symbolName.data()); continue; } -#endif if ((int) fs->instCount() > inlineState.costLimit) { @@ -271,7 +277,7 @@ llvm_build_inline_plan(llvm::Module *mod) continue; } - defMod = load_module_cached(modPath); + defMod = load_module_cached(lc, modPath); if (defMod->materializeMetadata()) elog(FATAL, "failed to materialize metadata"); @@ -445,16 +451,9 @@ llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline) } -#if LLVM_VERSION_MAJOR > 4 -#define IRMOVE_PARAMS , /*IsPerformingImport=*/false -#elif LLVM_VERSION_MAJOR > 3 -#define IRMOVE_PARAMS , /*LinkModuleInlineAsm=*/false, /*IsPerformingImport=*/false -#else -#define IRMOVE_PARAMS -#endif if (Mover.move(std::move(importMod), GlobalsToImport.getArrayRef(), - [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {} - IRMOVE_PARAMS)) + [](llvm::GlobalValue &, llvm::IRMover::ValueAdder) {}, + /*IsPerformingImport=*/false)) elog(FATAL, "function import failed with linker error"); } } @@ -466,20 +465,20 @@ llvm_execute_inline_plan(llvm::Module *mod, ImportMapTy *globalsToInline) * the cache state would get corrupted. */ static llvm::Module* -load_module_cached(llvm::StringRef modPath) +load_module_cached(LLVMContextRef lc, llvm::StringRef modPath) { auto it = module_cache->find(modPath); if (it == module_cache->end()) { it = module_cache->insert( - std::make_pair(modPath, load_module(modPath))).first; + std::make_pair(modPath, load_module(lc, modPath))).first; } return it->second.get(); } static std::unique_ptr -load_module(llvm::StringRef Identifier) +load_module(LLVMContextRef lc, llvm::StringRef Identifier) { LLVMMemoryBufferRef buf; LLVMModuleRef mod; @@ -491,7 +490,7 @@ load_module(llvm::StringRef Identifier) if (LLVMCreateMemoryBufferWithContentsOfFile(path, &buf, &msg)) elog(FATAL, "failed to open bitcode file \"%s\": %s", path, msg); - if (LLVMGetBitcodeModuleInContext2(LLVMGetGlobalContext(), buf, &mod)) + if (LLVMGetBitcodeModuleInContext2(lc, buf, &mod)) elog(FATAL, "failed to parse bitcode in file \"%s\"", path); /* @@ -780,7 +779,6 @@ llvm_load_summary(llvm::StringRef path) { llvm::MemoryBufferRef ref(*MBOrErr.get().get()); -#if LLVM_VERSION_MAJOR > 3 llvm::Expected > IndexOrErr = llvm::getModuleSummaryIndex(ref); if (IndexOrErr) @@ -788,15 +786,6 @@ llvm_load_summary(llvm::StringRef path) elog(FATAL, "failed to load summary \"%s\": %s", path.data(), toString(IndexOrErr.takeError()).c_str()); -#else - llvm::ErrorOr > IndexOrErr = - llvm::getModuleSummaryIndex(ref, [](const llvm::DiagnosticInfo &) {}); - if (IndexOrErr) - return std::move(IndexOrErr.get()); - elog(FATAL, "failed to load summary \"%s\": %s", - path.data(), - IndexOrErr.getError().message().c_str()); -#endif } return nullptr; } @@ -808,7 +797,10 @@ static void add_module_to_inline_search_path(InlineSearchPath& searchpath, llvm::StringRef modpath) { /* only extension in libdir are candidates for inlining for now */ - if (!modpath.startswith("$libdir/")) +#if LLVM_VERSION_MAJOR < 16 +#define starts_with startswith +#endif + if (!modpath.starts_with("$libdir/")) return; /* if there's no match, attempt to load */ @@ -840,22 +832,12 @@ summaries_for_guid(const InlineSearchPath& path, llvm::GlobalValue::GUID guid) for (auto index : path) { -#if LLVM_VERSION_MAJOR > 4 llvm::ValueInfo funcVI = index->getValueInfo(guid); /* if index doesn't know function, we don't have a body, continue */ if (funcVI) for (auto &gv : funcVI.getSummaryList()) matches.push_back(gv.get()); -#else - const llvm::const_gvsummary_iterator &I = - index->findGlobalValueSummaryList(guid); - if (I != index->end()) - { - for (auto &gv : I->second) - matches.push_back(gv.get()); - } -#endif } return matches; diff --git a/src/backend/jit/llvm/llvmjit_types.c b/src/backend/jit/llvm/llvmjit_types.c index 41ac4c6f45c68..f93c383fd52c5 100644 --- a/src/backend/jit/llvm/llvmjit_types.c +++ b/src/backend/jit/llvm/llvmjit_types.c @@ -16,7 +16,7 @@ * bitcode. * * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/jit/llvm/llvmjit_types.c @@ -48,7 +48,7 @@ PGFunction TypePGFunction; size_t TypeSizeT; bool TypeStorageBool; -ExprStateEvalFunc TypeExprStateEvalFunc; + ExecEvalSubroutine TypeExecEvalSubroutine; ExecEvalBoolSubroutine TypeExecEvalBoolSubroutine; @@ -61,11 +61,14 @@ ExprEvalStep StructExprEvalStep; ExprState StructExprState; FunctionCallInfoBaseData StructFunctionCallInfoData; HeapTupleData StructHeapTupleData; +HeapTupleHeaderData StructHeapTupleHeaderData; MemoryContextData StructMemoryContextData; TupleTableSlot StructTupleTableSlot; HeapTupleTableSlot StructHeapTupleTableSlot; MinimalTupleTableSlot StructMinimalTupleTableSlot; TupleDescData StructTupleDescData; +PlanState StructPlanState; +MinimalTupleData StructMinimalTupleData; /* @@ -77,9 +80,42 @@ extern Datum AttributeTemplate(PG_FUNCTION_ARGS); Datum AttributeTemplate(PG_FUNCTION_ARGS) { + AssertVariableIsOfType(&AttributeTemplate, PGFunction); + PG_RETURN_NULL(); } +/* + * And some more "templates" to give us examples of function types + * corresponding to function pointer types. + */ + +extern void ExecEvalSubroutineTemplate(ExprState *state, + struct ExprEvalStep *op, + ExprContext *econtext); +void +ExecEvalSubroutineTemplate(ExprState *state, + struct ExprEvalStep *op, + ExprContext *econtext) +{ + AssertVariableIsOfType(&ExecEvalSubroutineTemplate, + ExecEvalSubroutine); +} + +extern bool ExecEvalBoolSubroutineTemplate(ExprState *state, + struct ExprEvalStep *op, + ExprContext *econtext); +bool +ExecEvalBoolSubroutineTemplate(ExprState *state, + struct ExprEvalStep *op, + ExprContext *econtext) +{ + AssertVariableIsOfType(&ExecEvalBoolSubroutineTemplate, + ExecEvalBoolSubroutine); + + return false; +} + /* * Clang represents stdbool.h style booleans that are returned by functions * differently (as i1) than stored ones (as i8). Therefore we do not just need @@ -119,6 +155,7 @@ void *referenced_functions[] = ExecEvalFuncExprFusage, ExecEvalFuncExprStrictFusage, ExecEvalGroupingFunc, + ExecEvalMergeSupportFunc, ExecEvalMinMax, ExecEvalNextValueExpr, ExecEvalParamExec, @@ -126,6 +163,7 @@ void *referenced_functions[] = ExecEvalRow, ExecEvalRowNotNull, ExecEvalRowNull, + ExecEvalCoerceViaIOSafe, ExecEvalSQLValueFunction, ExecEvalScalarArrayOp, ExecEvalHashedScalarArrayOp, @@ -135,9 +173,13 @@ void *referenced_functions[] = ExecEvalXmlExpr, ExecEvalJsonConstructor, ExecEvalJsonIsPredicate, + ExecEvalJsonCoercion, + ExecEvalJsonCoercionFinish, + ExecEvalJsonExprPath, MakeExpandedObjectReadOnlyInternal, slot_getmissingattrs, slot_getsomeattrs_int, strlen, varsize_any, + ExecInterpExprStillValid, }; diff --git a/src/backend/jit/llvm/llvmjit_wrap.cpp b/src/backend/jit/llvm/llvmjit_wrap.cpp index 05199a49566f3..1d061cfaa8443 100644 --- a/src/backend/jit/llvm/llvmjit_wrap.cpp +++ b/src/backend/jit/llvm/llvmjit_wrap.cpp @@ -3,7 +3,7 @@ * llvmjit_wrap.cpp * Parts of the LLVM interface not (yet) exposed to C. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/llvm/llvmjit_wrap.cpp @@ -21,58 +21,43 @@ extern "C" /* Avoid macro clash with LLVM's C++ headers */ #undef Min -#include #include -#include -#include #include "jit/llvmjit.h" +#include "jit/llvmjit_backport.h" + +#ifdef USE_LLVM_BACKPORT_SECTION_MEMORY_MANAGER +#include +#include +#include "jit/SectionMemoryManager.h" +#include +#endif /* * C-API extensions. */ -#if defined(HAVE_DECL_LLVMGETHOSTCPUNAME) && !HAVE_DECL_LLVMGETHOSTCPUNAME -char *LLVMGetHostCPUName(void) { - return strdup(llvm::sys::getHostCPUName().data()); -} -#endif - -#if defined(HAVE_DECL_LLVMGETHOSTCPUFEATURES) && !HAVE_DECL_LLVMGETHOSTCPUFEATURES -char *LLVMGetHostCPUFeatures(void) { - llvm::SubtargetFeatures Features; - llvm::StringMap HostFeatures; - - if (llvm::sys::getHostCPUFeatures(HostFeatures)) - for (auto &F : HostFeatures) - Features.AddFeature(F.first(), F.second); - - return strdup(Features.getString().c_str()); +LLVMTypeRef +LLVMGetFunctionReturnType(LLVMValueRef r) +{ + return llvm::wrap(llvm::unwrap(r)->getReturnType()); } -#endif -/* - * Like LLVM's LLVMGetAttributeCountAtIndex(), works around a bug in LLVM 3.9. - * - * In LLVM <= 3.9, LLVMGetAttributeCountAtIndex() segfaults if there are no - * attributes at an index (fixed in LLVM commit ce9bb1097dc2). - */ -unsigned -LLVMGetAttributeCountAtIndexPG(LLVMValueRef F, uint32 Idx) +LLVMTypeRef +LLVMGetFunctionType(LLVMValueRef r) { - /* - * This is more expensive, so only do when using a problematic LLVM - * version. - */ -#if LLVM_VERSION_MAJOR < 4 - if (!llvm::unwrap(F)->getAttributes().hasAttributes(Idx)) - return 0; -#endif + return llvm::wrap(llvm::unwrap(r)->getFunctionType()); +} + +#ifdef USE_LLVM_BACKPORT_SECTION_MEMORY_MANAGER +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(llvm::orc::ExecutionSession, LLVMOrcExecutionSessionRef) +DEFINE_SIMPLE_CONVERSION_FUNCTIONS(llvm::orc::ObjectLayer, LLVMOrcObjectLayerRef); - /* - * There is no nice public API to determine the count nicely, so just - * always fall back to LLVM's C API. - */ - return LLVMGetAttributeCountAtIndex(F, Idx); +LLVMOrcObjectLayerRef +LLVMOrcCreateRTDyldObjectLinkingLayerWithSafeSectionMemoryManager(LLVMOrcExecutionSessionRef ES) +{ + return wrap(new llvm::orc::RTDyldObjectLinkingLayer( + *unwrap(ES), [] { return std::make_unique(nullptr, true); })); } +#endif diff --git a/src/backend/jit/llvm/meson.build b/src/backend/jit/llvm/meson.build index a6524c06fe3ef..b76e2e7054721 100644 --- a/src/backend/jit/llvm/meson.build +++ b/src/backend/jit/llvm/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not llvm.found() subdir_done() @@ -14,6 +14,7 @@ llvmjit_sources += files( 'llvmjit_error.cpp', 'llvmjit_inline.cpp', 'llvmjit_wrap.cpp', + 'SectionMemoryManager.cpp', ) # Code generation @@ -60,9 +61,10 @@ endif # XXX: Need to determine proper version of the function cflags for clang bitcode_cflags = ['-fno-strict-aliasing', '-fwrapv'] -if llvm.version().version_compare('>=15.0') +if llvm.version().version_compare('=15.0') bitcode_cflags += ['-Xclang', '-no-opaque-pointers'] endif +bitcode_cflags += get_option('c_args') bitcode_cflags += cppflags # XXX: Worth improving on the logic to find directories here diff --git a/src/backend/jit/meson.build b/src/backend/jit/meson.build index 88bacda218c84..42951a87944fb 100644 --- a/src/backend/jit/meson.build +++ b/src/backend/jit/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'jit.c' diff --git a/src/backend/lib/Makefile b/src/backend/lib/Makefile index 9dad31398aed0..b6cefd9cca094 100644 --- a/src/backend/lib/Makefile +++ b/src/backend/lib/Makefile @@ -13,7 +13,6 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global OBJS = \ - binaryheap.o \ bipartite_match.o \ bloomfilter.o \ dshash.o \ diff --git a/src/backend/lib/bipartite_match.c b/src/backend/lib/bipartite_match.c index c9d2096cee311..e01514e96ea98 100644 --- a/src/backend/lib/bipartite_match.c +++ b/src/backend/lib/bipartite_match.c @@ -7,7 +7,7 @@ * * https://en.wikipedia.org/w/index.php?title=Hopcroft%E2%80%93Karp_algorithm&oldid=593898016 * - * Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Copyright (c) 2015-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/bipartite_match.c diff --git a/src/backend/lib/bloomfilter.c b/src/backend/lib/bloomfilter.c index 77ac8e2619a7b..360d21ca45be5 100644 --- a/src/backend/lib/bloomfilter.c +++ b/src/backend/lib/bloomfilter.c @@ -24,7 +24,7 @@ * caller many authoritative lookups, such as expensive probes of a much larger * on-disk structure. * - * Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Copyright (c) 2018-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/bloomfilter.c diff --git a/src/backend/lib/dshash.c b/src/backend/lib/dshash.c index 14ed2d87bba60..06deb610245e2 100644 --- a/src/backend/lib/dshash.c +++ b/src/backend/lib/dshash.c @@ -20,7 +20,7 @@ * Future versions may support iterators and incremental resizing; for now * the implementation is minimalist. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -33,10 +33,8 @@ #include "common/hashfn.h" #include "lib/dshash.h" -#include "storage/ipc.h" #include "storage/lwlock.h" #include "utils/dsa.h" -#include "utils/memutils.h" /* * An item in the hash table. This wraps the user's entry object in an @@ -188,6 +186,8 @@ static bool delete_item_from_bucket(dshash_table *hash_table, static inline dshash_hash hash_key(dshash_table *hash_table, const void *key); static inline bool equal_keys(dshash_table *hash_table, const void *a, const void *b); +static inline void copy_key(dshash_table *hash_table, void *dest, + const void *src); #define PARTITION_LOCK(hash_table, i) \ (&(hash_table)->control->partitions[(i)].lock) @@ -200,7 +200,7 @@ static inline bool equal_keys(dshash_table *hash_table, * Create a new hash table backed by the given dynamic shared area, with the * given parameters. The returned object is allocated in backend-local memory * using the current MemoryContext. 'arg' will be passed through to the - * compare and hash functions. + * compare, hash, and copy functions. */ dshash_table * dshash_create(dsa_area *area, const dshash_parameters *params, void *arg) @@ -583,6 +583,49 @@ dshash_memhash(const void *v, size_t size, void *arg) return tag_hash(v, size); } +/* + * A copy function that forwards to memcpy. + */ +void +dshash_memcpy(void *dest, const void *src, size_t size, void *arg) +{ + (void) memcpy(dest, src, size); +} + +/* + * A compare function that forwards to strcmp. + */ +int +dshash_strcmp(const void *a, const void *b, size_t size, void *arg) +{ + Assert(strlen((const char *) a) < size); + Assert(strlen((const char *) b) < size); + + return strcmp((const char *) a, (const char *) b); +} + +/* + * A hash function that forwards to string_hash. + */ +dshash_hash +dshash_strhash(const void *v, size_t size, void *arg) +{ + Assert(strlen((const char *) v) < size); + + return string_hash((const char *) v, size); +} + +/* + * A copy function that forwards to strcpy. + */ +void +dshash_strcpy(void *dest, const void *src, size_t size, void *arg) +{ + Assert(strlen((const char *) src) < size); + + (void) strcpy((char *) dest, (const char *) src); +} + /* * Sequentially scan through dshash table and return all the elements one by * one, return NULL when all elements have been returned. @@ -844,8 +887,10 @@ resize(dshash_table *hash_table, size_t new_size_log2) Assert(new_size_log2 == hash_table->control->size_log2 + 1); /* Allocate the space for the new table. */ - new_buckets_shared = dsa_allocate0(hash_table->area, - sizeof(dsa_pointer) * new_size); + new_buckets_shared = + dsa_allocate_extended(hash_table->area, + sizeof(dsa_pointer) * new_size, + DSA_ALLOC_HUGE | DSA_ALLOC_ZERO); new_buckets = dsa_get_address(hash_table->area, new_buckets_shared); /* @@ -949,7 +994,7 @@ insert_into_bucket(dshash_table *hash_table, hash_table->params.entry_size + MAXALIGN(sizeof(dshash_table_item))); item = dsa_get_address(hash_table->area, item_pointer); - memcpy(ENTRY_FROM_ITEM(item), key, hash_table->params.key_size); + copy_key(hash_table, ENTRY_FROM_ITEM(item), key); insert_item_into_bucket(hash_table, item_pointer, item, bucket); return item; } @@ -1032,3 +1077,14 @@ equal_keys(dshash_table *hash_table, const void *a, const void *b) hash_table->params.key_size, hash_table->arg) == 0; } + +/* + * Copy a key. + */ +static inline void +copy_key(dshash_table *hash_table, void *dest, const void *src) +{ + hash_table->params.copy_function(dest, src, + hash_table->params.key_size, + hash_table->arg); +} diff --git a/src/backend/lib/hyperloglog.c b/src/backend/lib/hyperloglog.c index 4702b2fadee88..0c4191af8f56e 100644 --- a/src/backend/lib/hyperloglog.c +++ b/src/backend/lib/hyperloglog.c @@ -3,7 +3,7 @@ * hyperloglog.c * HyperLogLog cardinality estimator * - * Portions Copyright (c) 2014-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2014-2024, PostgreSQL Global Development Group * * Based on Hideaki Ohno's C++ implementation. This is probably not ideally * suited to estimating the cardinality of very large sets; in particular, we diff --git a/src/backend/lib/ilist.c b/src/backend/lib/ilist.c index aeb7f75cd0c3b..ce6306f0c233b 100644 --- a/src/backend/lib/ilist.c +++ b/src/backend/lib/ilist.c @@ -3,7 +3,7 @@ * ilist.c * support for integrated/inline doubly- and singly- linked lists * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/lib/integerset.c b/src/backend/lib/integerset.c index f2d696d4b2036..9f1d4db52b2df 100644 --- a/src/backend/lib/integerset.c +++ b/src/backend/lib/integerset.c @@ -61,7 +61,7 @@ * (https://doi.org/10.1002/spe.948) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -71,7 +71,6 @@ */ #include "postgres.h" -#include "access/htup_details.h" #include "lib/integerset.h" #include "port/pg_bitutils.h" #include "utils/memutils.h" diff --git a/src/backend/lib/knapsack.c b/src/backend/lib/knapsack.c index 9fba708533bf6..5aa8f3791b415 100644 --- a/src/backend/lib/knapsack.c +++ b/src/backend/lib/knapsack.c @@ -15,7 +15,7 @@ * allows approximate solutions in polynomial time (the general case of the * exact problem is NP-hard). * - * Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Copyright (c) 2017-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/knapsack.c @@ -28,9 +28,7 @@ #include #include "lib/knapsack.h" -#include "miscadmin.h" #include "nodes/bitmapset.h" -#include "utils/builtins.h" #include "utils/memutils.h" /* @@ -89,10 +87,7 @@ DiscreteKnapsack(int max_weight, int num_items, { /* copy sets[ow] to sets[j] without realloc */ if (j != ow) - { - sets[j] = bms_del_members(sets[j], sets[j]); - sets[j] = bms_add_members(sets[j], sets[ow]); - } + sets[j] = bms_replace_members(sets[j], sets[ow]); sets[j] = bms_add_member(sets[j], i); diff --git a/src/backend/lib/meson.build b/src/backend/lib/meson.build index 974cab87763f2..956536078e4fd 100644 --- a/src/backend/lib/meson.build +++ b/src/backend/lib/meson.build @@ -1,7 +1,6 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( - 'binaryheap.c', 'bipartite_match.c', 'bloomfilter.c', 'dshash.c', diff --git a/src/backend/lib/pairingheap.c b/src/backend/lib/pairingheap.c index 8325bc88a7d02..fe1deba13ec3c 100644 --- a/src/backend/lib/pairingheap.c +++ b/src/backend/lib/pairingheap.c @@ -14,7 +14,7 @@ * The pairing heap: a new form of self-adjusting heap. * Algorithmica 1, 1 (January 1986), pages 111-129. DOI: 10.1007/BF01840439 * - * Portions Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/pairingheap.c diff --git a/src/backend/lib/rbtree.c b/src/backend/lib/rbtree.c index f362dce220ffa..19ae7482321e5 100644 --- a/src/backend/lib/rbtree.c +++ b/src/backend/lib/rbtree.c @@ -17,7 +17,7 @@ * longest path from root to leaf is only about twice as long as the shortest, * so lookups are guaranteed to run in O(lg n) time. * - * Copyright (c) 2009-2023, PostgreSQL Global Development Group + * Copyright (c) 2009-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/lib/rbtree.c diff --git a/src/backend/libpq/auth-sasl.c b/src/backend/libpq/auth-sasl.c index 684680897bcd3..08b24d90b4bf6 100644 --- a/src/backend/libpq/auth-sasl.c +++ b/src/backend/libpq/auth-sasl.c @@ -3,7 +3,7 @@ * auth-sasl.c * Routines to handle authentication via SASL * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -87,7 +87,7 @@ CheckSASLAuth(const pg_be_sasl_mech *mech, Port *port, char *shadow_pass, { pq_startmsgread(); mtype = pq_getbyte(); - if (mtype != 'p') + if (mtype != PqMsg_SASLResponse) { /* Only log error if client didn't disconnect. */ if (mtype != EOF) diff --git a/src/backend/libpq/auth-scram.c b/src/backend/libpq/auth-scram.c index 9b286aa4d7fad..416195991486d 100644 --- a/src/backend/libpq/auth-scram.c +++ b/src/backend/libpq/auth-scram.c @@ -80,7 +80,7 @@ * general, after logging in, but let's do what we can here. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/libpq/auth-scram.c @@ -92,20 +92,15 @@ #include #include "access/xlog.h" -#include "catalog/pg_authid.h" #include "catalog/pg_control.h" #include "common/base64.h" #include "common/hmac.h" #include "common/saslprep.h" #include "common/scram-common.h" #include "common/sha2.h" -#include "libpq/auth.h" #include "libpq/crypt.h" #include "libpq/sasl.h" #include "libpq/scram.h" -#include "miscadmin.h" -#include "utils/builtins.h" -#include "utils/timestamp.h" static void scram_get_mechanisms(Port *port, StringInfo buf); static void *scram_init(Port *port, const char *selected_mech, @@ -129,7 +124,7 @@ typedef enum { SCRAM_AUTH_INIT, SCRAM_AUTH_SALT_SENT, - SCRAM_AUTH_FINISHED + SCRAM_AUTH_FINISHED, } scram_state_enum; typedef struct @@ -209,10 +204,9 @@ scram_get_mechanisms(Port *port, StringInfo buf) /* * Advertise the mechanisms in decreasing order of importance. So the * channel-binding variants go first, if they are supported. Channel - * binding is only supported with SSL, and only if the SSL implementation - * has a function to get the certificate's hash. + * binding is only supported with SSL. */ -#ifdef HAVE_BE_TLS_GET_CERTIFICATE_HASH +#ifdef USE_SSL if (port->ssl_in_use) { appendStringInfoString(buf, SCRAM_SHA_256_PLUS_NAME); @@ -251,13 +245,12 @@ scram_init(Port *port, const char *selected_mech, const char *shadow_pass) /* * Parse the selected mechanism. * - * Note that if we don't support channel binding, either because the SSL - * implementation doesn't support it or we're not using SSL at all, we - * would not have advertised the PLUS variant in the first place. If the - * client nevertheless tries to select it, it's a protocol violation like - * selecting any other SASL mechanism we don't support. + * Note that if we don't support channel binding, or if we're not using + * SSL at all, we would not have advertised the PLUS variant in the first + * place. If the client nevertheless tries to select it, it's a protocol + * violation like selecting any other SASL mechanism we don't support. */ -#ifdef HAVE_BE_TLS_GET_CERTIFICATE_HASH +#ifdef USE_SSL if (strcmp(selected_mech, SCRAM_SHA_256_PLUS_NAME) == 0 && port->ssl_in_use) state->channel_binding_in_use = true; else @@ -1010,7 +1003,7 @@ read_client_first_message(scram_state *state, const char *input) errmsg("malformed SCRAM message"), errdetail("The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not include channel binding data."))); -#ifdef HAVE_BE_TLS_GET_CERTIFICATE_HASH +#ifdef USE_SSL if (state->port->ssl_in_use) ereport(ERROR, (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION), @@ -1306,7 +1299,7 @@ read_client_final_message(scram_state *state, const char *input) channel_binding = read_attr_value(&p, 'c'); if (state->channel_binding_in_use) { -#ifdef HAVE_BE_TLS_GET_CERTIFICATE_HASH +#ifdef USE_SSL const char *cbind_data = NULL; size_t cbind_data_len = 0; size_t cbind_header_len; diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c index a98b934a8e21d..2b607c52704ca 100644 --- a/src/backend/libpq/auth.c +++ b/src/backend/libpq/auth.c @@ -3,7 +3,7 @@ * auth.c * Routines to handle network authentication * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -37,9 +37,7 @@ #include "postmaster/postmaster.h" #include "replication/walsender.h" #include "storage/ipc.h" -#include "utils/guc.h" #include "utils/memutils.h" -#include "utils/timestamp.h" /*---------------------------------------------------------------- * Global authentication functions @@ -312,7 +310,7 @@ auth_failed(Port *port, int status, const char *logdetail) break; } - cdetail = psprintf(_("Connection matched %s line %d: \"%s\""), + cdetail = psprintf(_("Connection matched file \"%s\" line %d: \"%s\""), port->hba->sourcefile, port->hba->linenumber, port->hba->rawline); if (logdetail) @@ -645,6 +643,22 @@ ClientAuthentication(Port *port) #endif } + if (Log_connections && status == STATUS_OK && + !MyClientConnectionInfo.authn_id) + { + /* + * Normally, if log_connections is set, the call to set_authn_id() + * will log the connection. However, if that function is never + * called, perhaps because the trust method is in use, then we handle + * the logging here instead. + */ + ereport(LOG, + errmsg("connection authenticated: user=\"%s\" method=%s " + "(%s:%d)", + port->user_name, hba_authname(port->hba->auth_method), + port->hba->sourcefile, port->hba->linenumber)); + } + if (ClientAuthentication_hook) (*ClientAuthentication_hook) (port, status); @@ -665,7 +679,7 @@ sendAuthRequest(Port *port, AuthRequest areq, const char *extradata, int extrale CHECK_FOR_INTERRUPTS(); - pq_beginmessage(&buf, 'R'); + pq_beginmessage(&buf, PqMsg_AuthenticationRequest); pq_sendint32(&buf, (int32) areq); if (extralen > 0) pq_sendbytes(&buf, extradata, extralen); @@ -698,7 +712,7 @@ recv_password_packet(Port *port) /* Expect 'p' message type */ mtype = pq_getbyte(); - if (mtype != 'p') + if (mtype != PqMsg_PasswordMessage) { /* * If the client just disconnects without offering a password, don't @@ -849,15 +863,13 @@ CheckPWChallengeAuth(Port *port, const char **logdetail) if (shadow_pass) pfree(shadow_pass); - - /* - * If get_role_password() returned error, return error, even if the - * authentication succeeded. - */ - if (!shadow_pass) + else { + /* + * If get_role_password() returned error, authentication better not + * have succeeded. + */ Assert(auth_result != STATUS_OK); - return STATUS_ERROR; } if (auth_result == STATUS_OK) @@ -873,11 +885,6 @@ CheckMD5Auth(Port *port, char *shadow_pass, const char **logdetail) char *passwd; int result; - if (Db_user_namespace) - ereport(FATAL, - (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION), - errmsg("MD5 authentication is not supported when \"db_user_namespace\" is enabled"))); - /* include the salt to use for computing the response */ if (!pg_strong_random(md5Salt, 4)) { @@ -966,7 +973,7 @@ pg_GSS_recvauth(Port *port) CHECK_FOR_INTERRUPTS(); mtype = pq_getbyte(); - if (mtype != 'p') + if (mtype != PqMsg_GSSResponse) { /* Only log error if client didn't disconnect. */ if (mtype != EOF) @@ -1237,7 +1244,7 @@ pg_SSPI_recvauth(Port *port) { pq_startmsgread(); mtype = pq_getbyte(); - if (mtype != 'p') + if (mtype != PqMsg_GSSResponse) { if (sspictx != NULL) { @@ -2611,31 +2618,6 @@ CheckLDAPAuth(Port *port) pfree(filter); ldap_memfree(dn); ldap_msgfree(search_message); - - /* Unbind and disconnect from the LDAP server */ - r = ldap_unbind_s(ldap); - if (r != LDAP_SUCCESS) - { - ereport(LOG, - (errmsg("could not unbind after searching for user \"%s\" on server \"%s\"", - fulluser, server_name))); - pfree(passwd); - pfree(fulluser); - return STATUS_ERROR; - } - - /* - * Need to re-initialize the LDAP connection, so that we can bind to - * it with a different username. - */ - if (InitializeLDAPConnection(port, &ldap) == STATUS_ERROR) - { - pfree(passwd); - pfree(fulluser); - - /* Error message already sent */ - return STATUS_ERROR; - } } else fulluser = psprintf("%s%s%s", diff --git a/src/backend/libpq/be-fsstubs.c b/src/backend/libpq/be-fsstubs.c index d189044a4fc2c..27d317dfdc087 100644 --- a/src/backend/libpq/be-fsstubs.c +++ b/src/backend/libpq/be-fsstubs.c @@ -3,7 +3,7 @@ * be-fsstubs.c * Builtin functions for open/close/read/write operations on large objects * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -43,7 +43,7 @@ #include #include "access/xact.h" -#include "catalog/pg_largeobject_metadata.h" +#include "catalog/pg_largeobject.h" #include "libpq/be-fsstubs.h" #include "libpq/libpq-fs.h" #include "miscadmin.h" @@ -323,7 +323,7 @@ be_lo_unlink(PG_FUNCTION_ARGS) * relevant FDs. */ if (!lo_compat_privileges && - !object_ownercheck(LargeObjectMetadataRelationId, lobjId, GetUserId())) + !object_ownercheck(LargeObjectRelationId, lobjId, GetUserId())) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("must be owner of large object %u", lobjId))); @@ -859,18 +859,6 @@ be_lo_put(PG_FUNCTION_ARGS) lo_cleanup_needed = true; loDesc = inv_open(loOid, INV_WRITE, CurrentMemoryContext); - - /* Permission check */ - if (!lo_compat_privileges && - pg_largeobject_aclcheck_snapshot(loDesc->id, - GetUserId(), - ACL_UPDATE, - loDesc->snapshot) != ACLCHECK_OK) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("permission denied for large object %u", - loDesc->id))); - inv_seek(loDesc, offset, SEEK_SET); written = inv_write(loDesc, VARDATA_ANY(str), VARSIZE_ANY_EXHDR(str)); Assert(written == VARSIZE_ANY_EXHDR(str)); diff --git a/src/backend/libpq/be-gssapi-common.c b/src/backend/libpq/be-gssapi-common.c index 64d41e529150f..005bf2717680b 100644 --- a/src/backend/libpq/be-gssapi-common.c +++ b/src/backend/libpq/be-gssapi-common.c @@ -3,7 +3,7 @@ * be-gssapi-common.c * Common code for GSSAPI authentication and encryption * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/libpq/be-secure-common.c b/src/backend/libpq/be-secure-common.c index ab5e2dfa2bffe..0cb201acb1e50 100644 --- a/src/backend/libpq/be-secure-common.c +++ b/src/backend/libpq/be-secure-common.c @@ -8,7 +8,7 @@ * communications code calls, this file contains support routines that are * used by the library-specific implementations such as be-secure-openssl.c. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -85,12 +85,16 @@ run_ssl_passphrase_command(const char *prompt, bool is_server_start, char *buf, } else if (pclose_rc != 0) { + char *reason; + explicit_bzero(buf, size); + reason = wait_result_to_str(pclose_rc); ereport(loglevel, (errcode_for_file_access(), errmsg("command \"%s\" failed", command), - errdetail_internal("%s", wait_result_to_str(pclose_rc)))); + errdetail_internal("%s", reason))); + pfree(reason); goto error; } diff --git a/src/backend/libpq/be-secure-gssapi.c b/src/backend/libpq/be-secure-gssapi.c index cda9376d5a2f0..bc04e78abba14 100644 --- a/src/backend/libpq/be-secure-gssapi.c +++ b/src/backend/libpq/be-secure-gssapi.c @@ -3,7 +3,7 @@ * be-secure-gssapi.c * GSSAPI encryption support * - * Portions Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/libpq/be-secure-gssapi.c @@ -60,8 +60,8 @@ static char *PqGSSSendBuffer; /* Encrypted data waiting to be sent */ static int PqGSSSendLength; /* End of data available in PqGSSSendBuffer */ static int PqGSSSendNext; /* Next index to send a byte from * PqGSSSendBuffer */ -static int PqGSSSendConsumed; /* Number of *unencrypted* bytes consumed for - * current contents of PqGSSSendBuffer */ +static int PqGSSSendConsumed; /* Number of source bytes encrypted but not + * yet reported as sent */ static char *PqGSSRecvBuffer; /* Received, encrypted data */ static int PqGSSRecvLength; /* End of data available in PqGSSRecvBuffer */ @@ -83,8 +83,8 @@ static uint32 PqGSSMaxPktSize; /* Maximum size we can encrypt and fit the * * On success, returns the number of data bytes consumed (possibly less than * len). On failure, returns -1 with errno set appropriately. For retryable - * errors, caller should call again (passing the same data) once the socket - * is ready. + * errors, caller should call again (passing the same or more data) once the + * socket is ready. * * Dealing with fatal errors here is a bit tricky: we can't invoke elog(FATAL) * since it would try to write to the client, probably resulting in infinite @@ -98,19 +98,25 @@ be_gssapi_write(Port *port, void *ptr, size_t len) minor; gss_buffer_desc input, output; - size_t bytes_sent = 0; size_t bytes_to_encrypt; size_t bytes_encrypted; gss_ctx_id_t gctx = port->gss->ctx; /* - * When we get a failure, we must not tell the caller we have successfully - * transmitted everything, else it won't retry. Hence a "success" - * (positive) return value must only count source bytes corresponding to - * fully-transmitted encrypted packets. The amount of source data - * corresponding to the current partly-transmitted packet is remembered in + * When we get a retryable failure, we must not tell the caller we have + * successfully transmitted everything, else it won't retry. For + * simplicity, we claim we haven't transmitted anything until we have + * successfully transmitted all "len" bytes. Between calls, the amount of + * the current input data that's already been encrypted and placed into + * PqGSSSendBuffer (and perhaps transmitted) is remembered in * PqGSSSendConsumed. On a retry, the caller *must* be sending that data * again, so if it offers a len less than that, something is wrong. + * + * Note: it may seem attractive to report partial write completion once + * we've successfully sent any encrypted packets. However, that can cause + * problems for callers; notably, pqPutMsgEnd's heuristic to send only + * full 8K blocks interacts badly with such a hack. We won't save much, + * typically, by letting callers discard data early, so don't risk it. */ if (len < PqGSSSendConsumed) { @@ -118,6 +124,7 @@ be_gssapi_write(Port *port, void *ptr, size_t len) errno = ECONNRESET; return -1; } + /* Discount whatever source data we already encrypted. */ bytes_to_encrypt = len - PqGSSSendConsumed; bytes_encrypted = PqGSSSendConsumed; @@ -146,33 +153,20 @@ be_gssapi_write(Port *port, void *ptr, size_t len) ret = secure_raw_write(port, PqGSSSendBuffer + PqGSSSendNext, amount); if (ret <= 0) - { - /* - * Report any previously-sent data; if there was none, reflect - * the secure_raw_write result up to our caller. When there - * was some, we're effectively assuming that any interesting - * failure condition will recur on the next try. - */ - if (bytes_sent) - return bytes_sent; return ret; - } /* * Check if this was a partial write, and if so, move forward that * far in our buffer and try again. */ - if (ret != amount) + if (ret < amount) { PqGSSSendNext += ret; continue; } - /* We've successfully sent whatever data was in that packet. */ - bytes_sent += PqGSSSendConsumed; - - /* All encrypted data was sent, our buffer is empty now. */ - PqGSSSendLength = PqGSSSendNext = PqGSSSendConsumed = 0; + /* We've successfully sent whatever data was in the buffer. */ + PqGSSSendLength = PqGSSSendNext = 0; } /* @@ -196,7 +190,10 @@ be_gssapi_write(Port *port, void *ptr, size_t len) output.value = NULL; output.length = 0; - /* Create the next encrypted packet */ + /* + * Create the next encrypted packet. Any failure here is considered a + * hard failure, so we return -1 even if some data has been sent. + */ major = gss_wrap(&minor, gctx, 1, GSS_C_QOP_DEFAULT, &input, &conf_state, &output); if (major != GSS_S_COMPLETE) @@ -239,10 +236,13 @@ be_gssapi_write(Port *port, void *ptr, size_t len) } /* If we get here, our counters should all match up. */ - Assert(bytes_sent == len); - Assert(bytes_sent == bytes_encrypted); + Assert(len == PqGSSSendConsumed); + Assert(len == bytes_encrypted); + + /* We're reporting all the data as sent, so reset PqGSSSendConsumed. */ + PqGSSSendConsumed = 0; - return bytes_sent; + return bytes_encrypted; } /* diff --git a/src/backend/libpq/be-secure-openssl.c b/src/backend/libpq/be-secure-openssl.c index 05276ab95cee0..486a66b0bf135 100644 --- a/src/backend/libpq/be-secure-openssl.c +++ b/src/backend/libpq/be-secure-openssl.c @@ -4,7 +4,7 @@ * functions for OpenSSL support in the backend. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -67,6 +67,12 @@ static int ssl_external_passwd_cb(char *buf, int size, int rwflag, void *userdat static int dummy_ssl_passwd_cb(char *buf, int size, int rwflag, void *userdata); static int verify_cb(int ok, X509_STORE_CTX *ctx); static void info_cb(const SSL *ssl, int type, int args); +static int alpn_cb(SSL *ssl, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *userdata); static bool initialize_dh(SSL_CTX *context, bool isServerStart); static bool initialize_ecdh(SSL_CTX *context, bool isServerStart); static const char *SSLerrmessage(unsigned long ecode); @@ -252,7 +258,18 @@ be_tls_init(bool isServerStart) } } - /* disallow SSL session tickets */ + /* + * Disallow SSL session tickets. OpenSSL use both stateful and stateless + * tickets for TLSv1.3, and stateless ticket for TLSv1.2. SSL_OP_NO_TICKET + * is available since 0.9.8f but only turns off stateless tickets. In + * order to turn off stateful tickets we need SSL_CTX_set_num_tickets, + * which is available since OpenSSL 1.1.1. LibreSSL 3.5.4 (from OpenBSD + * 7.1) introduced this API for compatibility, but doesn't support session + * tickets at all so it's a no-op there. + */ +#ifdef HAVE_SSL_CTX_SET_NUM_TICKETS + SSL_CTX_set_num_tickets(context, 0); +#endif SSL_CTX_set_options(context, SSL_OP_NO_TICKET); /* disallow SSL session caching, too */ @@ -261,15 +278,20 @@ be_tls_init(bool isServerStart) /* disallow SSL compression */ SSL_CTX_set_options(context, SSL_OP_NO_COMPRESSION); -#ifdef SSL_OP_NO_RENEGOTIATION - /* - * Disallow SSL renegotiation, option available since 1.1.0h. This - * concerns only TLSv1.2 and older protocol versions, as TLSv1.3 has no - * support for renegotiation. + * Disallow SSL renegotiation. This concerns only TLSv1.2 and older + * protocol versions, as TLSv1.3 has no support for renegotiation. + * SSL_OP_NO_RENEGOTIATION is available in OpenSSL since 1.1.0h (via a + * backport from 1.1.1). SSL_OP_NO_CLIENT_RENEGOTIATION is available in + * LibreSSL since 2.5.1 disallowing all client-initiated renegotiation + * (this is usually on by default). */ +#ifdef SSL_OP_NO_RENEGOTIATION SSL_CTX_set_options(context, SSL_OP_NO_RENEGOTIATION); #endif +#ifdef SSL_OP_NO_CLIENT_RENEGOTIATION + SSL_CTX_set_options(context, SSL_OP_NO_CLIENT_RENEGOTIATION); +#endif /* set up ephemeral DH and ECDH keys */ if (!initialize_dh(context, isServerStart)) @@ -432,6 +454,9 @@ be_tls_open_server(Port *port) /* set up debugging/info callback */ SSL_CTX_set_info_callback(SSL_context, info_cb); + /* enable ALPN */ + SSL_CTX_set_alpn_select_cb(SSL_context, alpn_cb, port); + if (!(port->ssl = SSL_new(SSL_context))) { ereport(COMMERROR, @@ -460,6 +485,7 @@ be_tls_open_server(Port *port) * per-thread error queue following another call to an OpenSSL I/O * routine. */ + errno = 0; ERR_clear_error(); r = SSL_accept(port->ssl); if (r <= 0) @@ -496,7 +522,7 @@ be_tls_open_server(Port *port) WAIT_EVENT_SSL_OPEN_SERVER); goto aloop; case SSL_ERROR_SYSCALL: - if (r < 0) + if (r < 0 && errno != 0) ereport(COMMERROR, (errcode_for_socket_access(), errmsg("could not accept SSL connection: %m"))); @@ -532,6 +558,8 @@ be_tls_open_server(Port *port) case SSL_R_TLSV1_ALERT_PROTOCOL_VERSION: #ifdef SSL_R_VERSION_TOO_HIGH case SSL_R_VERSION_TOO_HIGH: +#endif +#ifdef SSL_R_VERSION_TOO_LOW case SSL_R_VERSION_TOO_LOW: #endif give_proto_hint = true; @@ -570,6 +598,32 @@ be_tls_open_server(Port *port) return -1; } + /* Get the protocol selected by ALPN */ + port->alpn_used = false; + { + const unsigned char *selected; + unsigned int len; + + SSL_get0_alpn_selected(port->ssl, &selected, &len); + + /* If ALPN is used, check that we negotiated the expected protocol */ + if (selected != NULL) + { + if (len == strlen(PG_ALPN_PROTOCOL) && + memcmp(selected, PG_ALPN_PROTOCOL, strlen(PG_ALPN_PROTOCOL)) == 0) + { + port->alpn_used = true; + } + else + { + /* shouldn't happen */ + ereport(COMMERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("received SSL connection request with unexpected ALPN protocol"))); + } + } + } + /* Get client certificate, if available. */ port->peer = SSL_get_peer_certificate(port->ssl); @@ -620,8 +674,11 @@ be_tls_open_server(Port *port) bio = BIO_new(BIO_s_mem()); if (!bio) { - pfree(port->peer_cn); - port->peer_cn = NULL; + if (port->peer_cn != NULL) + { + pfree(port->peer_cn); + port->peer_cn = NULL; + } return -1; } @@ -632,12 +689,15 @@ be_tls_open_server(Port *port) * which make regular expression matching a bit easier. Also note that * it prints the Subject fields in reverse order. */ - X509_NAME_print_ex(bio, x509name, 0, XN_FLAG_RFC2253); - if (BIO_get_mem_ptr(bio, &bio_buf) <= 0) + if (X509_NAME_print_ex(bio, x509name, 0, XN_FLAG_RFC2253) == -1 || + BIO_get_mem_ptr(bio, &bio_buf) <= 0) { BIO_free(bio); - pfree(port->peer_cn); - port->peer_cn = NULL; + if (port->peer_cn != NULL) + { + pfree(port->peer_cn); + port->peer_cn = NULL; + } return -1; } peer_dn = MemoryContextAlloc(TopMemoryContext, bio_buf->length + 1); @@ -651,8 +711,11 @@ be_tls_open_server(Port *port) (errcode(ERRCODE_PROTOCOL_VIOLATION), errmsg("SSL certificate's distinguished name contains embedded null"))); pfree(peer_dn); - pfree(port->peer_cn); - port->peer_cn = NULL; + if (port->peer_cn != NULL) + { + pfree(port->peer_cn); + port->peer_cn = NULL; + } return -1; } @@ -723,7 +786,7 @@ be_tls_read(Port *port, void *ptr, size_t len, int *waitfor) break; case SSL_ERROR_SYSCALL: /* leave it to caller to ereport the value of errno */ - if (n != -1) + if (n != -1 || errno == 0) { errno = ECONNRESET; n = -1; @@ -781,8 +844,14 @@ be_tls_write(Port *port, void *ptr, size_t len, int *waitfor) n = -1; break; case SSL_ERROR_SYSCALL: - /* leave it to caller to ereport the value of errno */ - if (n != -1) + + /* + * Leave it to caller to ereport the value of errno. However, if + * errno is still zero then assume it's a read EOF situation, and + * report ECONNRESET. (This seems possible because SSL_write can + * also do reads.) + */ + if (n != -1 || errno == 0) { errno = ECONNRESET; n = -1; @@ -831,15 +900,8 @@ be_tls_write(Port *port, void *ptr, size_t len, int *waitfor) * * These functions are closely modelled on the standard socket BIO in OpenSSL; * see sock_read() and sock_write() in OpenSSL's crypto/bio/bss_sock.c. - * XXX OpenSSL 1.0.1e considers many more errcodes than just EINTR as reasons - * to retry; do we need to adopt their logic for that? */ -#ifndef HAVE_BIO_GET_DATA -#define BIO_get_data(bio) (bio->ptr) -#define BIO_set_data(bio, data) (bio->ptr = data) -#endif - static BIO_METHOD *my_bio_methods = NULL; static int @@ -849,7 +911,7 @@ my_sock_read(BIO *h, char *buf, int size) if (buf != NULL) { - res = secure_raw_read(((Port *) BIO_get_data(h)), buf, size); + res = secure_raw_read(((Port *) BIO_get_app_data(h)), buf, size); BIO_clear_retry_flags(h); if (res <= 0) { @@ -869,7 +931,7 @@ my_sock_write(BIO *h, const char *buf, int size) { int res = 0; - res = secure_raw_write(((Port *) BIO_get_data(h)), buf, size); + res = secure_raw_write(((Port *) BIO_get_app_data(h)), buf, size); BIO_clear_retry_flags(h); if (res <= 0) { @@ -945,7 +1007,7 @@ my_SSL_set_fd(Port *port, int fd) SSLerr(SSL_F_SSL_SET_FD, ERR_R_BUF_LIB); goto err; } - BIO_set_data(bio, port); + BIO_set_app_data(bio, port); BIO_set_fd(bio, fd, BIO_NOCLOSE); SSL_set_bio(port->ssl, bio, bio); @@ -1250,6 +1312,52 @@ info_cb(const SSL *ssl, int type, int args) } } +/* See pqcomm.h comments on OpenSSL implementation of ALPN (RFC 7301) */ +static const unsigned char alpn_protos[] = PG_ALPN_PROTOCOL_VECTOR; + +/* + * Server callback for ALPN negotiation. We use the standard "helper" function + * even though currently we only accept one value. + */ +static int +alpn_cb(SSL *ssl, + const unsigned char **out, + unsigned char *outlen, + const unsigned char *in, + unsigned int inlen, + void *userdata) +{ + /* + * Why does OpenSSL provide a helper function that requires a nonconst + * vector when the callback is declared to take a const vector? What are + * we to do with that? + */ + int retval; + + Assert(userdata != NULL); + Assert(out != NULL); + Assert(outlen != NULL); + Assert(in != NULL); + + retval = SSL_select_next_proto((unsigned char **) out, outlen, + alpn_protos, sizeof(alpn_protos), + in, inlen); + if (*out == NULL || *outlen > sizeof(alpn_protos) || *outlen <= 0) + return SSL_TLSEXT_ERR_NOACK; /* can't happen */ + + if (retval == OPENSSL_NPN_NEGOTIATED) + return SSL_TLSEXT_ERR_OK; + else + { + /* + * The client doesn't support our protocol. Reject the connection + * with TLS "no_application_protocol" alert, per RFC 7301. + */ + return SSL_TLSEXT_ERR_ALERT_FATAL; + } +} + + /* * Set DH parameters for generating ephemeral DH keys. The * DH parameters can take a long time to compute, so they must be @@ -1339,9 +1447,9 @@ initialize_ecdh(SSL_CTX *context, bool isServerStart) * * ERR_get_error() is used by caller to get errcode to pass here. * - * Some caution is needed here since ERR_reason_error_string will - * return NULL if it doesn't recognize the error code. We don't - * want to return NULL ever. + * Some caution is needed here since ERR_reason_error_string will return NULL + * if it doesn't recognize the error code, or (in OpenSSL >= 3) if the code + * represents a system errno value. We don't want to return NULL ever. */ static const char * SSLerrmessage(unsigned long ecode) @@ -1354,6 +1462,20 @@ SSLerrmessage(unsigned long ecode) errreason = ERR_reason_error_string(ecode); if (errreason != NULL) return errreason; + + /* + * In OpenSSL 3.0.0 and later, ERR_reason_error_string does not map system + * errno values anymore. (See OpenSSL source code for the explanation.) + * We can cover that shortcoming with this bit of code. Older OpenSSL + * versions don't have the ERR_SYSTEM_ERROR macro, but that's okay because + * they don't have the shortcoming either. + */ +#ifdef ERR_SYSTEM_ERROR + if (ERR_SYSTEM_ERROR(ecode)) + return strerror(ERR_GET_REASON(ecode)); +#endif + + /* No choice but to report the numeric ecode */ snprintf(errbuf, sizeof(errbuf), _("SSL error code %lu"), ecode); return errbuf; } @@ -1429,7 +1551,6 @@ be_tls_get_peer_serial(Port *port, char *ptr, size_t len) ptr[0] = '\0'; } -#if defined(HAVE_X509_GET_SIGNATURE_NID) || defined(HAVE_X509_GET_SIGNATURE_INFO) char * be_tls_get_certificate_hash(Port *port, size_t *len) { @@ -1488,7 +1609,6 @@ be_tls_get_certificate_hash(Port *port, size_t *len) return cert_hash; } -#endif /* * Convert an X509 subject name to a cstring. diff --git a/src/backend/libpq/be-secure.c b/src/backend/libpq/be-secure.c index a0f7084018339..1663f36b6b80d 100644 --- a/src/backend/libpq/be-secure.c +++ b/src/backend/libpq/be-secure.c @@ -6,7 +6,7 @@ * message integrity and endpoint authentication. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -29,11 +29,8 @@ #include "libpq/libpq.h" #include "miscadmin.h" -#include "pgstat.h" -#include "storage/ipc.h" -#include "storage/proc.h" #include "tcop/tcopprot.h" -#include "utils/memutils.h" +#include "utils/wait_event.h" char *ssl_library; char *ssl_cert_file; @@ -112,18 +109,51 @@ secure_loaded_verify_locations(void) int secure_open_server(Port *port) { +#ifdef USE_SSL int r = 0; + ssize_t len; + + /* push unencrypted buffered data back through SSL setup */ + len = pq_buffer_remaining_data(); + if (len > 0) + { + char *buf = palloc(len); + + pq_startmsgread(); + if (pq_getbytes(buf, len) == EOF) + return STATUS_ERROR; /* shouldn't be possible */ + pq_endmsgread(); + port->raw_buf = buf; + port->raw_buf_remaining = len; + port->raw_buf_consumed = 0; + } + Assert(pq_buffer_remaining_data() == 0); -#ifdef USE_SSL r = be_tls_open_server(port); + if (port->raw_buf_remaining > 0) + { + /* + * This shouldn't be possible -- it would mean the client sent + * encrypted data before we established a session key... + */ + elog(LOG, "buffered unencrypted data remains after negotiating SSL connection"); + return STATUS_ERROR; + } + if (port->raw_buf != NULL) + { + pfree(port->raw_buf); + port->raw_buf = NULL; + } + ereport(DEBUG2, (errmsg_internal("SSL connection from DN:\"%s\" CN:\"%s\"", port->peer_dn ? port->peer_dn : "(anonymous)", port->peer_cn ? port->peer_cn : "(anonymous)"))); -#endif - return r; +#else + return 0; +#endif } /* @@ -235,6 +265,19 @@ secure_raw_read(Port *port, void *ptr, size_t len) { ssize_t n; + /* Read from the "unread" buffered data first. c.f. libpq-be.h */ + if (port->raw_buf_remaining > 0) + { + /* consume up to len bytes from the raw_buf */ + if (len > port->raw_buf_remaining) + len = port->raw_buf_remaining; + Assert(port->raw_buf); + memcpy(ptr, port->raw_buf + port->raw_buf_consumed, len); + port->raw_buf_consumed += len; + port->raw_buf_remaining -= len; + return len; + } + /* * Try to read from the socket without blocking. If it succeeds we're * done, otherwise we'll wait for the socket using the latch mechanism. diff --git a/src/backend/libpq/crypt.c b/src/backend/libpq/crypt.c index ef496a0bea995..629e51e00be9e 100644 --- a/src/backend/libpq/crypt.c +++ b/src/backend/libpq/crypt.c @@ -4,7 +4,7 @@ * Functions for dealing with encrypted passwords stored in * pg_authid.rolpassword. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/libpq/crypt.c @@ -20,7 +20,6 @@ #include "common/scram-common.h" #include "libpq/crypt.h" #include "libpq/scram.h" -#include "miscadmin.h" #include "utils/builtins.h" #include "utils/syscache.h" #include "utils/timestamp.h" diff --git a/src/backend/libpq/hba.c b/src/backend/libpq/hba.c index f89f138f3c01e..18271def2e8c1 100644 --- a/src/backend/libpq/hba.c +++ b/src/backend/libpq/hba.c @@ -5,7 +5,7 @@ * wherein you authenticate a user by seeing what IP address the system * says he comes from and choosing authentication method based on it). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -26,24 +26,19 @@ #include #include -#include "access/htup_details.h" #include "catalog/pg_collation.h" -#include "catalog/pg_type.h" #include "common/ip.h" #include "common/string.h" -#include "funcapi.h" +#include "libpq/hba.h" #include "libpq/ifaddr.h" -#include "libpq/libpq.h" -#include "miscadmin.h" +#include "libpq/libpq-be.h" #include "postmaster/postmaster.h" #include "regex/regex.h" #include "replication/walsender.h" #include "storage/fd.h" #include "utils/acl.h" -#include "utils/builtins.h" #include "utils/conffiles.h" #include "utils/guc.h" -#include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/varlena.h" @@ -56,8 +51,6 @@ #endif -#define MAX_TOKEN 256 - /* callback data for check_network_callback */ typedef struct check_network_data { @@ -161,8 +154,8 @@ pg_isblank(const char c) * commas, beginning of line, and end of line. Blank means space or tab. * * Tokens can be delimited by double quotes (this allows the inclusion of - * blanks or '#', but not newlines). As in SQL, write two double-quotes - * to represent a double quote. + * commas, blanks, and '#', but not newlines). As in SQL, write two + * double-quotes to represent a double quote. * * Comments (started by an unquoted '#') are skipped, i.e. the remainder * of the line is ignored. @@ -171,8 +164,8 @@ pg_isblank(const char c) * Thus, if a continuation occurs within quoted text or a comment, the * quoted text or comment is considered to continue to the next line.) * - * The token, if any, is returned at *buf (a buffer of size bufsz), and - * *lineptr is advanced past the token. + * The token, if any, is returned into buf (replacing any previous + * contents), and *lineptr is advanced past the token. * * Also, we set *initial_quote to indicate whether there was quoting before * the first character. (We use that to prevent "@x" from being treated @@ -180,30 +173,25 @@ pg_isblank(const char c) * we want to allow that to support embedded spaces in file paths.) * * We set *terminating_comma to indicate whether the token is terminated by a - * comma (which is not returned). + * comma (which is not returned, nor advanced over). * - * In event of an error, log a message at ereport level elevel, and also - * set *err_msg to a string describing the error. Currently the only - * possible error is token too long for buf. + * The only possible error condition is lack of terminating quote, but we + * currently do not detect that, but just return the rest of the line. * - * If successful: store null-terminated token at *buf and return true. - * If no more tokens on line: set *buf = '\0' and return false. - * If error: fill buf with truncated or misformatted token and return false. + * If successful: store dequoted token in buf and return true. + * If no more tokens on line: set buf to empty and return false. */ static bool -next_token(char **lineptr, char *buf, int bufsz, - bool *initial_quote, bool *terminating_comma, - int elevel, char **err_msg) +next_token(char **lineptr, StringInfo buf, + bool *initial_quote, bool *terminating_comma) { int c; - char *start_buf = buf; - char *end_buf = buf + (bufsz - 1); bool in_quote = false; bool was_quote = false; bool saw_quote = false; - Assert(end_buf > start_buf); - + /* Initialize output parameters */ + resetStringInfo(buf); *initial_quote = false; *terminating_comma = false; @@ -226,22 +214,6 @@ next_token(char **lineptr, char *buf, int bufsz, break; } - if (buf >= end_buf) - { - *buf = '\0'; - ereport(elevel, - (errcode(ERRCODE_CONFIG_FILE_ERROR), - errmsg("authentication file token too long, skipping: \"%s\"", - start_buf))); - *err_msg = "authentication file token too long"; - /* Discard remainder of line */ - while ((c = (*(*lineptr)++)) != '\0') - ; - /* Un-eat the '\0', in case we're called again */ - (*lineptr)--; - return false; - } - /* we do not pass back a terminating comma in the token */ if (c == ',' && !in_quote) { @@ -250,7 +222,7 @@ next_token(char **lineptr, char *buf, int bufsz, } if (c != '"' || was_quote) - *buf++ = c; + appendStringInfoChar(buf, c); /* Literal double-quote is two double-quotes */ if (in_quote && c == '"') @@ -262,7 +234,7 @@ next_token(char **lineptr, char *buf, int bufsz, { in_quote = !in_quote; saw_quote = true; - if (buf == start_buf) + if (buf->len == 0) *initial_quote = true; } @@ -275,9 +247,7 @@ next_token(char **lineptr, char *buf, int bufsz, */ (*lineptr)--; - *buf = '\0'; - - return (saw_quote || buf > start_buf); + return (saw_quote || buf->len > 0); } /* @@ -409,21 +379,22 @@ static List * next_field_expand(const char *filename, char **lineptr, int elevel, int depth, char **err_msg) { - char buf[MAX_TOKEN]; + StringInfoData buf; bool trailing_comma; bool initial_quote; List *tokens = NIL; + initStringInfo(&buf); + do { - if (!next_token(lineptr, buf, sizeof(buf), - &initial_quote, &trailing_comma, - elevel, err_msg)) + if (!next_token(lineptr, &buf, + &initial_quote, &trailing_comma)) break; /* Is this referencing a file? */ - if (!initial_quote && buf[0] == '@' && buf[1] != '\0') - tokens = tokenize_expand_file(tokens, filename, buf + 1, + if (!initial_quote && buf.len > 1 && buf.data[0] == '@') + tokens = tokenize_expand_file(tokens, filename, buf.data + 1, elevel, depth + 1, err_msg); else { @@ -434,11 +405,13 @@ next_field_expand(const char *filename, char **lineptr, * for the list of tokens. */ oldcxt = MemoryContextSwitchTo(tokenize_context); - tokens = lappend(tokens, make_auth_token(buf, initial_quote)); + tokens = lappend(tokens, make_auth_token(buf.data, initial_quote)); MemoryContextSwitchTo(oldcxt); } } while (trailing_comma && (*err_msg == NULL)); + pfree(buf.data); + return tokens; } @@ -1405,7 +1378,7 @@ parse_hba_line(TokenizedAuthLine *tok_line, int elevel) ereport(elevel, (errcode(ERRCODE_CONFIG_FILE_ERROR), errmsg("hostssl record cannot match because SSL is disabled"), - errhint("Set ssl = on in postgresql.conf."), + errhint("Set \"ssl = on\" in postgresql.conf."), errcontext("line %d of configuration file \"%s\"", line_num, file_name))); *err_msg = "hostssl record cannot match because SSL is disabled"; @@ -1741,19 +1714,7 @@ parse_hba_line(TokenizedAuthLine *tok_line, int elevel) else if (strcmp(token->string, "reject") == 0) parsedline->auth_method = uaReject; else if (strcmp(token->string, "md5") == 0) - { - if (Db_user_namespace) - { - ereport(elevel, - (errcode(ERRCODE_CONFIG_FILE_ERROR), - errmsg("MD5 authentication is not supported when \"db_user_namespace\" is enabled"), - errcontext("line %d of configuration file \"%s\"", - line_num, file_name))); - *err_msg = "MD5 authentication is not supported when \"db_user_namespace\" is enabled"; - return NULL; - } parsedline->auth_method = uaMD5; - } else if (strcmp(token->string, "scram-sha-256") == 0) parsedline->auth_method = uaSCRAM; else if (strcmp(token->string, "pam") == 0) diff --git a/src/backend/libpq/ifaddr.c b/src/backend/libpq/ifaddr.c index 46d7032d79430..4c25af7ac3be1 100644 --- a/src/backend/libpq/ifaddr.c +++ b/src/backend/libpq/ifaddr.c @@ -3,7 +3,7 @@ * ifaddr.c * IP netmask calculations, and enumerating network interfaces. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/libpq/meson.build b/src/backend/libpq/meson.build index 74a226c2bddfd..7c65314512caa 100644 --- a/src/backend/libpq/meson.build +++ b/src/backend/libpq/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'auth-sasl.c', diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index da5bb5fc5d3bf..daa0696146d0e 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -17,7 +17,7 @@ * the backend's "backend/libpq" is quite separate from "interfaces/libpq". * All that remains is similarities of names to trap the unwary... * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/libpq/pqcomm.c @@ -29,11 +29,10 @@ * INTERFACE ROUTINES * * setup/teardown: - * StreamServerPort - Open postmaster's server port - * StreamConnection - Create new connection with client - * StreamClose - Close a client/backend connection + * ListenServerPort - Open postmaster's server port + * AcceptConnection - Accept new connection with client * TouchSocketFiles - Protect socket files against /tmp cleaners - * pq_init - initialize libpq at backend startup + * pq_init - initialize libpq at backend startup * socket_comm_reset - reset libpq during error recovery * socket_close - shutdown libpq at backend exit * @@ -121,8 +120,8 @@ static List *sock_paths = NIL; static char *PqSendBuffer; static int PqSendBufferSize; /* Size send buffer */ -static int PqSendPointer; /* Next index to store a byte in PqSendBuffer */ -static int PqSendStart; /* Next index to send a byte in PqSendBuffer */ +static size_t PqSendPointer; /* Next index to store a byte in PqSendBuffer */ +static size_t PqSendStart; /* Next index to send a byte in PqSendBuffer */ static char PqRecvBuffer[PQ_RECV_BUFFER_SIZE]; static int PqRecvPointer; /* Next index to read a byte from PqRecvBuffer */ @@ -144,19 +143,21 @@ static int socket_flush_if_writable(void); static bool socket_is_send_pending(void); static int socket_putmessage(char msgtype, const char *s, size_t len); static void socket_putmessage_noblock(char msgtype, const char *s, size_t len); -static int internal_putbytes(const char *s, size_t len); -static int internal_flush(void); +static inline int internal_putbytes(const char *s, size_t len); +static inline int internal_flush(void); +static pg_noinline int internal_flush_buffer(const char *buf, size_t *start, + size_t *end); static int Lock_AF_UNIX(const char *unixSocketDir, const char *unixSocketPath); static int Setup_AF_UNIX(const char *sock_path); static const PQcommMethods PqCommSocketMethods = { - socket_comm_reset, - socket_flush, - socket_flush_if_writable, - socket_is_send_pending, - socket_putmessage, - socket_putmessage_noblock + .comm_reset = socket_comm_reset, + .flush = socket_flush, + .flush_if_writable = socket_flush_if_writable, + .is_send_pending = socket_is_send_pending, + .putmessage = socket_putmessage, + .putmessage_noblock = socket_putmessage_noblock }; const PQcommMethods *PqCommMethods = &PqCommSocketMethods; @@ -168,12 +169,111 @@ WaitEventSet *FeBeWaitSet; * pq_init - initialize libpq at backend startup * -------------------------------- */ -void -pq_init(void) +Port * +pq_init(ClientSocket *client_sock) { + Port *port; int socket_pos PG_USED_FOR_ASSERTS_ONLY; int latch_pos PG_USED_FOR_ASSERTS_ONLY; + /* allocate the Port struct and copy the ClientSocket contents to it */ + port = palloc0(sizeof(Port)); + port->sock = client_sock->sock; + memcpy(&port->raddr.addr, &client_sock->raddr.addr, client_sock->raddr.salen); + port->raddr.salen = client_sock->raddr.salen; + + /* fill in the server (local) address */ + port->laddr.salen = sizeof(port->laddr.addr); + if (getsockname(port->sock, + (struct sockaddr *) &port->laddr.addr, + &port->laddr.salen) < 0) + { + ereport(FATAL, + (errmsg("%s() failed: %m", "getsockname"))); + } + + /* select NODELAY and KEEPALIVE options if it's a TCP connection */ + if (port->laddr.addr.ss_family != AF_UNIX) + { + int on; +#ifdef WIN32 + int oldopt; + int optlen; + int newopt; +#endif + +#ifdef TCP_NODELAY + on = 1; + if (setsockopt(port->sock, IPPROTO_TCP, TCP_NODELAY, + (char *) &on, sizeof(on)) < 0) + { + ereport(FATAL, + (errmsg("%s(%s) failed: %m", "setsockopt", "TCP_NODELAY"))); + } +#endif + on = 1; + if (setsockopt(port->sock, SOL_SOCKET, SO_KEEPALIVE, + (char *) &on, sizeof(on)) < 0) + { + ereport(FATAL, + (errmsg("%s(%s) failed: %m", "setsockopt", "SO_KEEPALIVE"))); + } + +#ifdef WIN32 + + /* + * This is a Win32 socket optimization. The OS send buffer should be + * large enough to send the whole Postgres send buffer in one go, or + * performance suffers. The Postgres send buffer can be enlarged if a + * very large message needs to be sent, but we won't attempt to + * enlarge the OS buffer if that happens, so somewhat arbitrarily + * ensure that the OS buffer is at least PQ_SEND_BUFFER_SIZE * 4. + * (That's 32kB with the current default). + * + * The default OS buffer size used to be 8kB in earlier Windows + * versions, but was raised to 64kB in Windows 2012. So it shouldn't + * be necessary to change it in later versions anymore. Changing it + * unnecessarily can even reduce performance, because setting + * SO_SNDBUF in the application disables the "dynamic send buffering" + * feature that was introduced in Windows 7. So before fiddling with + * SO_SNDBUF, check if the current buffer size is already large enough + * and only increase it if necessary. + * + * See https://support.microsoft.com/kb/823764/EN-US/ and + * https://msdn.microsoft.com/en-us/library/bb736549%28v=vs.85%29.aspx + */ + optlen = sizeof(oldopt); + if (getsockopt(port->sock, SOL_SOCKET, SO_SNDBUF, (char *) &oldopt, + &optlen) < 0) + { + ereport(FATAL, + (errmsg("%s(%s) failed: %m", "getsockopt", "SO_SNDBUF"))); + } + newopt = PQ_SEND_BUFFER_SIZE * 4; + if (oldopt < newopt) + { + if (setsockopt(port->sock, SOL_SOCKET, SO_SNDBUF, (char *) &newopt, + sizeof(newopt)) < 0) + { + ereport(FATAL, + (errmsg("%s(%s) failed: %m", "setsockopt", "SO_SNDBUF"))); + } + } +#endif + + /* + * Also apply the current keepalive parameters. If we fail to set a + * parameter, don't error out, because these aren't universally + * supported. (Note: you might think we need to reset the GUC + * variables to 0 in such a case, but it's not necessary because the + * show hooks for these variables report the truth anyway.) + */ + (void) pq_setkeepalivesidle(tcp_keepalives_idle, port); + (void) pq_setkeepalivesinterval(tcp_keepalives_interval, port); + (void) pq_setkeepalivescount(tcp_keepalives_count, port); + (void) pq_settcpusertimeout(tcp_user_timeout, port); + } + /* initialize state variables */ PqSendBufferSize = PQ_SEND_BUFFER_SIZE; PqSendBuffer = MemoryContextAlloc(TopMemoryContext, PqSendBufferSize); @@ -189,27 +289,23 @@ pq_init(void) * nonblocking mode and use latches to implement blocking semantics if * needed. That allows us to provide safely interruptible reads and * writes. - * - * Use COMMERROR on failure, because ERROR would try to send the error to - * the client, which might require changing the mode again, leading to - * infinite recursion. */ #ifndef WIN32 - if (!pg_set_noblock(MyProcPort->sock)) - ereport(COMMERROR, + if (!pg_set_noblock(port->sock)) + ereport(FATAL, (errmsg("could not set socket to nonblocking mode: %m"))); #endif #ifndef WIN32 /* Don't give the socket to any subprograms we execute. */ - if (fcntl(MyProcPort->sock, F_SETFD, FD_CLOEXEC) < 0) + if (fcntl(port->sock, F_SETFD, FD_CLOEXEC) < 0) elog(FATAL, "fcntl(F_SETFD) failed on socket: %m"); #endif - FeBeWaitSet = CreateWaitEventSet(TopMemoryContext, FeBeWaitSetNEvents); + FeBeWaitSet = CreateWaitEventSet(NULL, FeBeWaitSetNEvents); socket_pos = AddWaitEventToSet(FeBeWaitSet, WL_SOCKET_WRITEABLE, - MyProcPort->sock, NULL, NULL); + port->sock, NULL, NULL); latch_pos = AddWaitEventToSet(FeBeWaitSet, WL_LATCH_SET, PGINVALID_SOCKET, MyLatch, NULL); AddWaitEventToSet(FeBeWaitSet, WL_POSTMASTER_DEATH, PGINVALID_SOCKET, @@ -221,6 +317,8 @@ pq_init(void) */ Assert(socket_pos == FeBeWaitSetSocketPos); Assert(latch_pos == FeBeWaitSetLatchPos); + + return port; } /* -------------------------------- @@ -295,32 +393,30 @@ socket_close(int code, Datum arg) -/* - * Streams -- wrapper around Unix socket system calls - * - * - * Stream functions are used for vanilla TCP connection protocol. +/* -------------------------------- + * Postmaster functions to handle sockets. + * -------------------------------- */ - /* - * StreamServerPort -- open a "listening" port to accept connections. + * ListenServerPort -- open a "listening" port to accept connections. * * family should be AF_UNIX or AF_UNSPEC; portNumber is the port number. * For AF_UNIX ports, hostName should be NULL and unixSocketDir must be * specified. For TCP ports, hostName is either NULL for all interfaces or * the interface to listen on, and unixSocketDir is ignored (can be NULL). * - * Successfully opened sockets are added to the ListenSocket[] array (of - * length MaxListen), at the first position that isn't PGINVALID_SOCKET. + * Successfully opened sockets are appended to the ListenSockets[] array. On + * entry, *NumListenSockets holds the number of elements currently in the + * array, and it is updated to reflect the opened sockets. MaxListen is the + * allocated size of the array. * * RETURNS: STATUS_OK or STATUS_ERROR */ - int -StreamServerPort(int family, const char *hostName, unsigned short portNumber, +ListenServerPort(int family, const char *hostName, unsigned short portNumber, const char *unixSocketDir, - pgsocket ListenSocket[], int MaxListen) + pgsocket ListenSockets[], int *NumListenSockets, int MaxListen) { pgsocket fd; int err; @@ -335,7 +431,6 @@ StreamServerPort(int family, const char *hostName, unsigned short portNumber, struct addrinfo *addrs = NULL, *addr; struct addrinfo hint; - int listen_index = 0; int added = 0; char unixSocketPath[MAXPGPATH]; #if !defined(WIN32) || defined(IPV6_V6ONLY) @@ -401,12 +496,7 @@ StreamServerPort(int family, const char *hostName, unsigned short portNumber, } /* See if there is still room to add 1 more socket. */ - for (; listen_index < MaxListen; listen_index++) - { - if (ListenSocket[listen_index] == PGINVALID_SOCKET) - break; - } - if (listen_index >= MaxListen) + if (*NumListenSockets == MaxListen) { ereport(LOG, (errmsg("could not bind to all requested addresses: MAXLISTEN (%d) exceeded", @@ -458,6 +548,9 @@ StreamServerPort(int family, const char *hostName, unsigned short portNumber, } #ifndef WIN32 + /* Don't give the listen socket to any subprograms we execute. */ + if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0) + elog(FATAL, "fcntl(F_SETFD) failed on socket: %m"); /* * Without the SO_REUSEADDR flag, a new postmaster can't be started @@ -570,7 +663,8 @@ StreamServerPort(int family, const char *hostName, unsigned short portNumber, (errmsg("listening on %s address \"%s\", port %d", familyDesc, addrDesc, (int) portNumber))); - ListenSocket[listen_index] = fd; + ListenSockets[*NumListenSockets] = fd; + (*NumListenSockets)++; added++; } @@ -637,7 +731,7 @@ Setup_AF_UNIX(const char *sock_path) if (Unix_socket_group[0] != '\0') { #ifdef WIN32 - elog(WARNING, "configuration item unix_socket_group is not supported on this platform"); + elog(WARNING, "configuration item \"unix_socket_group\" is not supported on this platform"); #else char *endptr; unsigned long val; @@ -686,8 +780,9 @@ Setup_AF_UNIX(const char *sock_path) /* - * StreamConnection -- create a new connection with client using - * server port. Set port->sock to the FD of the new connection. + * AcceptConnection -- accept a new connection with client using + * server port. Fills *client_sock with the FD and endpoint info + * of the new connection. * * ASSUME: that this doesn't need to be non-blocking because * the Postmaster waits for the socket to be ready to accept(). @@ -695,13 +790,13 @@ Setup_AF_UNIX(const char *sock_path) * RETURNS: STATUS_OK or STATUS_ERROR */ int -StreamConnection(pgsocket server_fd, Port *port) +AcceptConnection(pgsocket server_fd, ClientSocket *client_sock) { /* accept connection and fill in the client (remote) address */ - port->raddr.salen = sizeof(port->raddr.addr); - if ((port->sock = accept(server_fd, - (struct sockaddr *) &port->raddr.addr, - &port->raddr.salen)) == PGINVALID_SOCKET) + client_sock->raddr.salen = sizeof(client_sock->raddr.addr); + if ((client_sock->sock = accept(server_fd, + (struct sockaddr *) &client_sock->raddr.addr, + &client_sock->raddr.salen)) == PGINVALID_SOCKET) { ereport(LOG, (errcode_for_socket_access(), @@ -718,122 +813,9 @@ StreamConnection(pgsocket server_fd, Port *port) return STATUS_ERROR; } - /* fill in the server (local) address */ - port->laddr.salen = sizeof(port->laddr.addr); - if (getsockname(port->sock, - (struct sockaddr *) &port->laddr.addr, - &port->laddr.salen) < 0) - { - ereport(LOG, - (errmsg("%s() failed: %m", "getsockname"))); - return STATUS_ERROR; - } - - /* select NODELAY and KEEPALIVE options if it's a TCP connection */ - if (port->laddr.addr.ss_family != AF_UNIX) - { - int on; -#ifdef WIN32 - int oldopt; - int optlen; - int newopt; -#endif - -#ifdef TCP_NODELAY - on = 1; - if (setsockopt(port->sock, IPPROTO_TCP, TCP_NODELAY, - (char *) &on, sizeof(on)) < 0) - { - ereport(LOG, - (errmsg("%s(%s) failed: %m", "setsockopt", "TCP_NODELAY"))); - return STATUS_ERROR; - } -#endif - on = 1; - if (setsockopt(port->sock, SOL_SOCKET, SO_KEEPALIVE, - (char *) &on, sizeof(on)) < 0) - { - ereport(LOG, - (errmsg("%s(%s) failed: %m", "setsockopt", "SO_KEEPALIVE"))); - return STATUS_ERROR; - } - -#ifdef WIN32 - - /* - * This is a Win32 socket optimization. The OS send buffer should be - * large enough to send the whole Postgres send buffer in one go, or - * performance suffers. The Postgres send buffer can be enlarged if a - * very large message needs to be sent, but we won't attempt to - * enlarge the OS buffer if that happens, so somewhat arbitrarily - * ensure that the OS buffer is at least PQ_SEND_BUFFER_SIZE * 4. - * (That's 32kB with the current default). - * - * The default OS buffer size used to be 8kB in earlier Windows - * versions, but was raised to 64kB in Windows 2012. So it shouldn't - * be necessary to change it in later versions anymore. Changing it - * unnecessarily can even reduce performance, because setting - * SO_SNDBUF in the application disables the "dynamic send buffering" - * feature that was introduced in Windows 7. So before fiddling with - * SO_SNDBUF, check if the current buffer size is already large enough - * and only increase it if necessary. - * - * See https://support.microsoft.com/kb/823764/EN-US/ and - * https://msdn.microsoft.com/en-us/library/bb736549%28v=vs.85%29.aspx - */ - optlen = sizeof(oldopt); - if (getsockopt(port->sock, SOL_SOCKET, SO_SNDBUF, (char *) &oldopt, - &optlen) < 0) - { - ereport(LOG, - (errmsg("%s(%s) failed: %m", "getsockopt", "SO_SNDBUF"))); - return STATUS_ERROR; - } - newopt = PQ_SEND_BUFFER_SIZE * 4; - if (oldopt < newopt) - { - if (setsockopt(port->sock, SOL_SOCKET, SO_SNDBUF, (char *) &newopt, - sizeof(newopt)) < 0) - { - ereport(LOG, - (errmsg("%s(%s) failed: %m", "setsockopt", "SO_SNDBUF"))); - return STATUS_ERROR; - } - } -#endif - - /* - * Also apply the current keepalive parameters. If we fail to set a - * parameter, don't error out, because these aren't universally - * supported. (Note: you might think we need to reset the GUC - * variables to 0 in such a case, but it's not necessary because the - * show hooks for these variables report the truth anyway.) - */ - (void) pq_setkeepalivesidle(tcp_keepalives_idle, port); - (void) pq_setkeepalivesinterval(tcp_keepalives_interval, port); - (void) pq_setkeepalivescount(tcp_keepalives_count, port); - (void) pq_settcpusertimeout(tcp_user_timeout, port); - } - return STATUS_OK; } -/* - * StreamClose -- close a client/backend connection - * - * NOTE: this is NOT used to terminate a session; it is just used to release - * the file descriptor in a process that should no longer have the socket - * open. (For example, the postmaster calls this after passing ownership - * of the connection to a child process.) It is expected that someone else - * still has the socket open. So, we only want to close the descriptor, - * we do NOT want to send anything to the far end. - */ -void -StreamClose(pgsocket sock) -{ - closesocket(sock); -} - /* * TouchSocketFiles -- mark socket files as recently accessed * @@ -936,6 +918,8 @@ pq_recvbuf(void) { int r; + errno = 0; + r = secure_read(MyProcPort, PqRecvBuffer + PqRecvLength, PQ_RECV_BUFFER_SIZE - PqRecvLength); @@ -948,10 +932,13 @@ pq_recvbuf(void) * Careful: an ereport() that tries to write to the client would * cause recursion to here, leading to stack overflow and core * dump! This message must go *only* to the postmaster log. + * + * If errno is zero, assume it's EOF and let the caller complain. */ - ereport(COMMERROR, - (errcode_for_socket_access(), - errmsg("could not receive data from client: %m"))); + if (errno != 0) + ereport(COMMERROR, + (errcode_for_socket_access(), + errmsg("could not receive data from client: %m"))); return EOF; } if (r == 0) @@ -1028,6 +1015,8 @@ pq_getbyte_if_available(unsigned char *c) /* Put the socket into non-blocking mode */ socket_set_nonblocking(true); + errno = 0; + r = secure_read(MyProcPort, c, 1); if (r < 0) { @@ -1044,10 +1033,13 @@ pq_getbyte_if_available(unsigned char *c) * Careful: an ereport() that tries to write to the client would * cause recursion to here, leading to stack overflow and core * dump! This message must go *only* to the postmaster log. + * + * If errno is zero, assume it's EOF and let the caller complain. */ - ereport(COMMERROR, - (errcode_for_socket_access(), - errmsg("could not receive data from client: %m"))); + if (errno != 0) + ereport(COMMERROR, + (errcode_for_socket_access(), + errmsg("could not receive data from client: %m"))); r = EOF; } } @@ -1124,15 +1116,17 @@ pq_discardbytes(size_t len) } /* -------------------------------- - * pq_buffer_has_data - is any buffered data available to read? + * pq_buffer_remaining_data - return number of bytes in receive buffer * - * This will *not* attempt to read more data. + * This will *not* attempt to read more data. And reading up to that number of + * bytes should not cause reading any more data either. * -------------------------------- */ -bool -pq_buffer_has_data(void) +ssize_t +pq_buffer_remaining_data(void) { - return (PqRecvPointer < PqRecvLength); + Assert(PqRecvLength >= PqRecvPointer); + return (PqRecvLength - PqRecvPointer); } @@ -1278,11 +1272,9 @@ pq_getmessage(StringInfo s, int maxlen) } -static int +static inline int internal_putbytes(const char *s, size_t len) { - size_t amount; - while (len > 0) { /* If buffer is full, then flush it out */ @@ -1292,14 +1284,33 @@ internal_putbytes(const char *s, size_t len) if (internal_flush()) return EOF; } - amount = PqSendBufferSize - PqSendPointer; - if (amount > len) - amount = len; - memcpy(PqSendBuffer + PqSendPointer, s, amount); - PqSendPointer += amount; - s += amount; - len -= amount; + + /* + * If the buffer is empty and data length is larger than the buffer + * size, send it without buffering. Otherwise, copy as much data as + * possible into the buffer. + */ + if (len >= PqSendBufferSize && PqSendStart == PqSendPointer) + { + size_t start = 0; + + socket_set_nonblocking(false); + if (internal_flush_buffer(s, &start, &len)) + return EOF; + } + else + { + size_t amount = PqSendBufferSize - PqSendPointer; + + if (amount > len) + amount = len; + memcpy(PqSendBuffer + PqSendPointer, s, amount); + PqSendPointer += amount; + s += amount; + len -= amount; + } } + return 0; } @@ -1331,19 +1342,32 @@ socket_flush(void) * and the socket is in non-blocking mode), or EOF if trouble. * -------------------------------- */ -static int +static inline int internal_flush(void) +{ + return internal_flush_buffer(PqSendBuffer, &PqSendStart, &PqSendPointer); +} + +/* -------------------------------- + * internal_flush_buffer - flush the given buffer content + * + * Returns 0 if OK (meaning everything was sent, or operation would block + * and the socket is in non-blocking mode), or EOF if trouble. + * -------------------------------- + */ +static pg_noinline int +internal_flush_buffer(const char *buf, size_t *start, size_t *end) { static int last_reported_send_errno = 0; - char *bufptr = PqSendBuffer + PqSendStart; - char *bufend = PqSendBuffer + PqSendPointer; + const char *bufptr = buf + *start; + const char *bufend = buf + *end; while (bufptr < bufend) { int r; - r = secure_write(MyProcPort, bufptr, bufend - bufptr); + r = secure_write(MyProcPort, (char *) bufptr, bufend - bufptr); if (r <= 0) { @@ -1383,7 +1407,7 @@ internal_flush(void) * flag that'll cause the next CHECK_FOR_INTERRUPTS to terminate * the connection. */ - PqSendStart = PqSendPointer = 0; + *start = *end = 0; ClientConnectionLost = 1; InterruptPending = 1; return EOF; @@ -1391,10 +1415,10 @@ internal_flush(void) last_reported_send_errno = 0; /* reset after any successful send */ bufptr += r; - PqSendStart += r; + *start += r; } - PqSendStart = PqSendPointer = 0; + *start = *end = 0; return 0; } diff --git a/src/backend/libpq/pqformat.c b/src/backend/libpq/pqformat.c index d712c80b5e76b..aa9433bb3b240 100644 --- a/src/backend/libpq/pqformat.c +++ b/src/backend/libpq/pqformat.c @@ -21,7 +21,7 @@ * are different. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/libpq/pqformat.c @@ -133,30 +133,27 @@ pq_sendbytes(StringInfo buf, const void *data, int datalen) * pq_sendcountedtext - append a counted text string (with character set conversion) * * The data sent to the frontend by this routine is a 4-byte count field - * followed by the string. The count includes itself or not, as per the - * countincludesself flag (pre-3.0 protocol requires it to include itself). - * The passed text string need not be null-terminated, and the data sent - * to the frontend isn't either. + * followed by the string. The count does not include itself, as required by + * protocol version 3.0. The passed text string need not be null-terminated, + * and the data sent to the frontend isn't either. * -------------------------------- */ void -pq_sendcountedtext(StringInfo buf, const char *str, int slen, - bool countincludesself) +pq_sendcountedtext(StringInfo buf, const char *str, int slen) { - int extra = countincludesself ? 4 : 0; char *p; p = pg_server_to_client(str, slen); if (p != str) /* actual conversion has been done? */ { slen = strlen(p); - pq_sendint32(buf, slen + extra); + pq_sendint32(buf, slen); appendBinaryStringInfoNT(buf, p, slen); pfree(p); } else { - pq_sendint32(buf, slen + extra); + pq_sendint32(buf, slen); appendBinaryStringInfoNT(buf, str, slen); } } diff --git a/src/backend/libpq/pqmq.c b/src/backend/libpq/pqmq.c index 39e77ef945d02..00a44ca803fb4 100644 --- a/src/backend/libpq/pqmq.c +++ b/src/backend/libpq/pqmq.c @@ -3,7 +3,7 @@ * pqmq.c * Use the frontend/backend protocol for communication over a shm_mq * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/libpq/pqmq.c @@ -26,7 +26,7 @@ static shm_mq_handle *pq_mq_handle; static bool pq_mq_busy = false; static pid_t pq_mq_parallel_leader_pid = 0; -static pid_t pq_mq_parallel_leader_backend_id = InvalidBackendId; +static pid_t pq_mq_parallel_leader_proc_number = INVALID_PROC_NUMBER; static void pq_cleanup_redirect_to_shm_mq(dsm_segment *seg, Datum arg); static void mq_comm_reset(void); @@ -37,12 +37,12 @@ static int mq_putmessage(char msgtype, const char *s, size_t len); static void mq_putmessage_noblock(char msgtype, const char *s, size_t len); static const PQcommMethods PqCommMqMethods = { - mq_comm_reset, - mq_flush, - mq_flush_if_writable, - mq_is_send_pending, - mq_putmessage, - mq_putmessage_noblock + .comm_reset = mq_comm_reset, + .flush = mq_flush, + .flush_if_writable = mq_flush_if_writable, + .is_send_pending = mq_is_send_pending, + .putmessage = mq_putmessage, + .putmessage_noblock = mq_putmessage_noblock }; /* @@ -75,11 +75,11 @@ pq_cleanup_redirect_to_shm_mq(dsm_segment *seg, Datum arg) * message data via the shm_mq. */ void -pq_set_parallel_leader(pid_t pid, BackendId backend_id) +pq_set_parallel_leader(pid_t pid, ProcNumber procNumber) { Assert(PqCommMethods == &PqCommMqMethods); pq_mq_parallel_leader_pid = pid; - pq_mq_parallel_leader_backend_id = backend_id; + pq_mq_parallel_leader_proc_number = procNumber; } static void @@ -168,13 +168,13 @@ mq_putmessage(char msgtype, const char *s, size_t len) if (IsLogicalParallelApplyWorker()) SendProcSignal(pq_mq_parallel_leader_pid, PROCSIG_PARALLEL_APPLY_MESSAGE, - pq_mq_parallel_leader_backend_id); + pq_mq_parallel_leader_proc_number); else { Assert(IsParallelWorker()); SendProcSignal(pq_mq_parallel_leader_pid, PROCSIG_PARALLEL_MESSAGE, - pq_mq_parallel_leader_backend_id); + pq_mq_parallel_leader_proc_number); } } @@ -182,7 +182,7 @@ mq_putmessage(char msgtype, const char *s, size_t len) break; (void) WaitLatch(MyLatch, WL_LATCH_SET | WL_EXIT_ON_PM_DEATH, 0, - WAIT_EVENT_MQ_PUT_MESSAGE); + WAIT_EVENT_MESSAGE_QUEUE_PUT_MESSAGE); ResetLatch(MyLatch); CHECK_FOR_INTERRUPTS(); } diff --git a/src/backend/libpq/pqsignal.c b/src/backend/libpq/pqsignal.c index d233e3a2fd72e..22a16c50b2150 100644 --- a/src/backend/libpq/pqsignal.c +++ b/src/backend/libpq/pqsignal.c @@ -3,7 +3,7 @@ * pqsignal.c * Backend signal(2) support (see also src/port/pqsignal.c) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/main/main.c b/src/backend/main/main.c index ed11e8be7fab7..f14fb7c2aabce 100644 --- a/src/backend/main/main.c +++ b/src/backend/main/main.c @@ -9,7 +9,7 @@ * proper FooMain() routine for the incarnation. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -32,9 +32,9 @@ #include "bootstrap/bootstrap.h" #include "common/username.h" +#include "miscadmin.h" #include "port/atomics.h" #include "postmaster/postmaster.h" -#include "storage/spin.h" #include "tcop/tcopprot.h" #include "utils/help_config.h" #include "utils/memutils.h" @@ -97,6 +97,7 @@ main(int argc, char *argv[]) * localization of messages may not work right away, and messages won't go * anywhere but stderr until GUC settings get loaded. */ + MyProcPid = getpid(); MemoryContextInit(); /* @@ -186,7 +187,7 @@ main(int argc, char *argv[]) else if (argc > 1 && strcmp(argv[1], "--boot") == 0) BootstrapModeMain(argc, argv, false); #ifdef EXEC_BACKEND - else if (argc > 1 && strncmp(argv[1], "--fork", 6) == 0) + else if (argc > 1 && strncmp(argv[1], "--forkchild", 11) == 0) SubPostmasterMain(argc, argv); #endif else if (argc > 1 && strcmp(argv[1], "--describe-config") == 0) @@ -288,12 +289,6 @@ startup_hacks(const char *progname) _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); } #endif /* WIN32 */ - - /* - * Initialize dummy_spinlock, in case we are on a platform where we have - * to use the fallback implementation of pg_memory_barrier(). - */ - SpinLockInit(&dummy_spinlock); } diff --git a/src/backend/main/meson.build b/src/backend/main/meson.build index 461a8c4b67ff6..fa8bf8af8badd 100644 --- a/src/backend/main/meson.build +++ b/src/backend/main/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group main_file = files('main.c') backend_sources += main_file diff --git a/src/backend/meson.build b/src/backend/meson.build index 88a35e96763f7..78c57268142c2 100644 --- a/src/backend/meson.build +++ b/src/backend/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_build_deps = [backend_code] backend_sources = [] @@ -72,7 +72,7 @@ postgres_lib = static_library('postgres_lib', if cc.get_id() == 'msvc' postgres_def = custom_target('postgres.def', - command: [perl, files('../tools/msvc/gendef.pl'), + command: [perl, files('../tools/msvc_gendef.pl'), '--arch', host_cpu, '--tempdir', '@PRIVATE_DIR@', '--deffile', '@OUTPUT@', @@ -91,21 +91,6 @@ if cc.get_id() == 'msvc' # be restricted to b_pch=true. backend_link_with += postgres_lib -elif host_system == 'aix' - # The '.' argument leads mkldexport.sh to emit "#! .", which refers to the - # main executable, allowing extension libraries to resolve their undefined - # symbols to symbols in the postgres binary. - postgres_imp = custom_target('postgres.imp', - command: [files('port/aix/mkldexport.sh'), '@INPUT@', '.'], - input: postgres_lib, - output: 'postgres.imp', - capture: true, - install: true, - install_dir: dir_lib, - build_by_default: false, - ) - backend_link_args += '-Wl,-bE:@0@'.format(postgres_imp.full_path()) - backend_link_depends += postgres_imp endif backend_input = [] @@ -148,7 +133,7 @@ postgres = executable('postgres', link_with: backend_link_with, link_depends: backend_link_depends, export_dynamic: true, - implib: true, + implib: 'postgres', dependencies: backend_build_deps, kwargs: default_bin_args, ) diff --git a/src/backend/nls.mk b/src/backend/nls.mk index 8263527c8514d..6c2716149d99b 100644 --- a/src/backend/nls.mk +++ b/src/backend/nls.mk @@ -2,27 +2,32 @@ CATALOG_NAME = postgres GETTEXT_FILES = + gettext-files GETTEXT_TRIGGERS = $(BACKEND_COMMON_GETTEXT_TRIGGERS) \ - GUC_check_errmsg \ - GUC_check_errdetail \ - GUC_check_errhint \ - write_stderr \ - yyerror \ - jsonpath_yyerror:3 \ - parser_yyerror \ - replication_yyerror \ - scanner_yyerror \ - syncrep_yyerror \ - report_invalid_record:2 \ - ereport_startup_progress + GUC_check_errmsg \ + GUC_check_errdetail \ + GUC_check_errhint \ + write_stderr \ + yyerror \ + jsonpath_yyerror:3 \ + parser_yyerror \ + replication_yyerror \ + scanner_yyerror \ + syncrep_yyerror \ + report_invalid_record:2 \ + ereport_startup_progress \ + json_token_error:2 \ + json_manifest_parse_failure:2 \ + error_cb:2 GETTEXT_FLAGS = $(BACKEND_COMMON_GETTEXT_FLAGS) \ - GUC_check_errmsg:1:c-format \ - GUC_check_errdetail:1:c-format \ - GUC_check_errhint:1:c-format \ - write_stderr:1:c-format \ - report_invalid_record:2:c-format \ - ereport_startup_progress:1:c-format + GUC_check_errmsg:1:c-format \ + GUC_check_errdetail:1:c-format \ + GUC_check_errhint:1:c-format \ + write_stderr:1:c-format \ + report_invalid_record:2:c-format \ + ereport_startup_progress:1:c-format \ + json_token_error:2:c-format \ + error_cb:2:c-format -gettext-files: distprep +gettext-files: generated-parser-sources generated-headers find $(srcdir) $(srcdir)/../common $(srcdir)/../port -name '*.c' -print | LC_ALL=C sort >$@ my-clean: diff --git a/src/backend/nodes/Makefile b/src/backend/nodes/Makefile index 0a95e683d0f96..66bbad8e6e02d 100644 --- a/src/backend/nodes/Makefile +++ b/src/backend/nodes/Makefile @@ -23,7 +23,6 @@ OBJS = \ makefuncs.o \ multibitmapset.o \ nodeFuncs.o \ - nodes.o \ outfuncs.o \ params.o \ print.o \ @@ -65,9 +64,7 @@ node_headers = \ # see also catalog/Makefile for an explanation of these make rules -all: distprep generated-header-symlinks - -distprep: node-support-stamp +all: generated-header-symlinks .PHONY: generated-header-symlinks @@ -81,14 +78,12 @@ node-support-stamp: gen_node_support.pl $(addprefix $(top_srcdir)/src/include/,$ $(PERL) $^ touch $@ -# These generated headers must be symlinked into builddir/src/include/, -# using absolute links for the reasons explained in src/backend/Makefile. +# These generated headers must be symlinked into src/include/. # We use header-stamp to record that we've done this because the symlinks # themselves may appear older than node-support-stamp. $(top_builddir)/src/include/nodes/header-stamp: node-support-stamp - prereqdir=`cd '$(dir $<)' >/dev/null && pwd` && \ cd '$(dir $@)' && for file in nodetags.h; do \ - rm -f $$file && $(LN_S) "$$prereqdir/$$file" . ; \ + rm -f $$file && $(LN_S) "../../../$(subdir)/$$file" . ; \ done touch $@ @@ -98,5 +93,5 @@ outfuncs.o: outfuncs.c outfuncs.funcs.c outfuncs.switch.c | node-support-stamp queryjumblefuncs.o: queryjumblefuncs.c queryjumblefuncs.funcs.c queryjumblefuncs.switch.c | node-support-stamp readfuncs.o: readfuncs.c readfuncs.funcs.c readfuncs.switch.c | node-support-stamp -maintainer-clean: clean +clean: rm -f node-support-stamp $(addsuffix funcs.funcs.c,copy equal out queryjumble read) $(addsuffix funcs.switch.c,copy equal out queryjumble read) nodetags.h diff --git a/src/backend/nodes/bitmapset.c b/src/backend/nodes/bitmapset.c index 7ba3cf635b1e2..cd05c642b0441 100644 --- a/src/backend/nodes/bitmapset.c +++ b/src/backend/nodes/bitmapset.c @@ -5,11 +5,31 @@ * * A bitmap set can represent any set of nonnegative integers, although * it is mainly intended for sets where the maximum value is not large, - * say at most a few hundred. By convention, we always represent the - * empty set by a NULL pointer. + * say at most a few hundred. By convention, we always represent a set with + * the minimum possible number of words, i.e, there are never any trailing + * zero words. Enforcing this requires that an empty set is represented as + * NULL. Because an empty Bitmapset is represented as NULL, a non-NULL + * Bitmapset always has at least 1 Bitmapword. We can exploit this fact to + * speed up various loops over the Bitmapset's words array by using "do while" + * loops instead of "for" loops. This means the code does not waste time + * checking the loop condition before the first iteration. For Bitmapsets + * containing only a single word (likely the majority of them) this halves the + * number of loop condition checks. * + * Callers must ensure that the set returned by functions in this file which + * adjust the members of an existing set is assigned to all pointers pointing + * to that existing set. No guarantees are made that we'll ever modify the + * existing set in-place and return it. * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * To help find bugs caused by callers failing to record the return value of + * the function which manipulates an existing set, we support building with + * REALLOCATE_BITMAPSETS. This results in the set being reallocated each time + * the set is altered and the existing being pfreed. This is useful as if any + * references still exist to the old set, we're more likely to notice as + * any users of the old set will be accessing pfree'd memory. This option is + * only intended to be used for debugging. + * + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/nodes/bitmapset.c @@ -51,21 +71,49 @@ #define HAS_MULTIPLE_ONES(x) ((bitmapword) RIGHTMOST_ONE(x) != (x)) -/* Select appropriate bit-twiddling functions for bitmap word size */ -#if BITS_PER_BITMAPWORD == 32 -#define bmw_leftmost_one_pos(w) pg_leftmost_one_pos32(w) -#define bmw_rightmost_one_pos(w) pg_rightmost_one_pos32(w) -#define bmw_popcount(w) pg_popcount32(w) -#elif BITS_PER_BITMAPWORD == 64 -#define bmw_leftmost_one_pos(w) pg_leftmost_one_pos64(w) -#define bmw_rightmost_one_pos(w) pg_rightmost_one_pos64(w) -#define bmw_popcount(w) pg_popcount64(w) -#else -#error "invalid BITS_PER_BITMAPWORD" +#ifdef USE_ASSERT_CHECKING +/* + * bms_is_valid_set - for cassert builds to check for valid sets + */ +static bool +bms_is_valid_set(const Bitmapset *a) +{ + /* NULL is the correct representation of an empty set */ + if (a == NULL) + return true; + + /* check the node tag is set correctly. pfree'd pointer, maybe? */ + if (!IsA(a, Bitmapset)) + return false; + + /* trailing zero words are not allowed */ + if (a->words[a->nwords - 1] == 0) + return false; + + return true; +} #endif -static bool bms_is_empty_internal(const Bitmapset *a); +#ifdef REALLOCATE_BITMAPSETS +/* + * bms_copy_and_free + * Only required in REALLOCATE_BITMAPSETS builds. Provide a simple way + * to return a freshly allocated set and pfree the original. + * + * Note: callers which accept multiple sets must be careful when calling this + * function to clone one parameter as other parameters may point to the same + * set. A good option is to call this just before returning the resulting + * set. + */ +static Bitmapset * +bms_copy_and_free(Bitmapset *a) +{ + Bitmapset *c = bms_copy(a); + bms_free(a); + return c; +} +#endif /* * bms_copy - make a palloc'd copy of a bitmapset @@ -76,8 +124,11 @@ bms_copy(const Bitmapset *a) Bitmapset *result; size_t size; + Assert(bms_is_valid_set(a)); + if (a == NULL) return NULL; + size = BITMAPSET_SIZE(a->nwords); result = (Bitmapset *) palloc(size); memcpy(result, a, size); @@ -85,20 +136,16 @@ bms_copy(const Bitmapset *a) } /* - * bms_equal - are two bitmapsets equal? - * - * This is logical not physical equality; in particular, a NULL pointer will - * be reported as equal to a palloc'd value containing no members. + * bms_equal - are two bitmapsets equal? or both NULL? */ bool bms_equal(const Bitmapset *a, const Bitmapset *b) { - const Bitmapset *shorter; - const Bitmapset *longer; - int shortlen; - int longlen; int i; + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + /* Handle cases where either input is NULL */ if (a == NULL) { @@ -108,30 +155,19 @@ bms_equal(const Bitmapset *a, const Bitmapset *b) } else if (b == NULL) return false; - /* Identify shorter and longer input */ - if (a->nwords <= b->nwords) - { - shorter = a; - longer = b; - } - else - { - shorter = b; - longer = a; - } - /* And process */ - shortlen = shorter->nwords; - for (i = 0; i < shortlen; i++) - { - if (shorter->words[i] != longer->words[i]) - return false; - } - longlen = longer->nwords; - for (; i < longlen; i++) + + /* can't be equal if the word counts don't match */ + if (a->nwords != b->nwords) + return false; + + /* check each word matches */ + i = 0; + do { - if (longer->words[i] != 0) + if (a->words[i] != b->words[i]) return false; - } + } while (++i < a->nwords); + return true; } @@ -146,36 +182,30 @@ bms_equal(const Bitmapset *a, const Bitmapset *b) int bms_compare(const Bitmapset *a, const Bitmapset *b) { - int shortlen; int i; + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + /* Handle cases where either input is NULL */ if (a == NULL) return (b == NULL) ? 0 : -1; else if (b == NULL) return +1; - /* Handle cases where one input is longer than the other */ - shortlen = Min(a->nwords, b->nwords); - for (i = shortlen; i < a->nwords; i++) - { - if (a->words[i] != 0) - return +1; - } - for (i = shortlen; i < b->nwords; i++) - { - if (b->words[i] != 0) - return -1; - } - /* Process words in common */ - i = shortlen; - while (--i >= 0) + + /* the set with the most words must be greater */ + if (a->nwords != b->nwords) + return (a->nwords > b->nwords) ? +1 : -1; + + i = a->nwords - 1; + do { bitmapword aw = a->words[i]; bitmapword bw = b->words[i]; if (aw != bw) return (aw > bw) ? +1 : -1; - } + } while (--i >= 0); return 0; } @@ -214,13 +244,8 @@ bms_free(Bitmapset *a) /* - * These operations all make a freshly palloc'd result, - * leaving their inputs untouched - */ - - -/* - * bms_union - set union + * bms_union - create and return a new set containing all members from both + * input sets. Both inputs are left unmodified. */ Bitmapset * bms_union(const Bitmapset *a, const Bitmapset *b) @@ -230,6 +255,9 @@ bms_union(const Bitmapset *a, const Bitmapset *b) int otherlen; int i; + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + /* Handle cases where either input is NULL */ if (a == NULL) return bms_copy(b); @@ -248,25 +276,34 @@ bms_union(const Bitmapset *a, const Bitmapset *b) } /* And union the shorter input into the result */ otherlen = other->nwords; - for (i = 0; i < otherlen; i++) + i = 0; + do + { result->words[i] |= other->words[i]; + } while (++i < otherlen); return result; } /* - * bms_intersect - set intersection + * bms_intersect - create and return a new set containing members which both + * input sets have in common. Both inputs are left unmodified. */ Bitmapset * bms_intersect(const Bitmapset *a, const Bitmapset *b) { Bitmapset *result; const Bitmapset *other; + int lastnonzero; int resultlen; int i; + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + /* Handle cases where either input is NULL */ if (a == NULL || b == NULL) return NULL; + /* Identify shorter and longer input; copy the shorter one */ if (a->nwords <= b->nwords) { @@ -280,27 +317,40 @@ bms_intersect(const Bitmapset *a, const Bitmapset *b) } /* And intersect the longer input with the result */ resultlen = result->nwords; - for (i = 0; i < resultlen; i++) + lastnonzero = -1; + i = 0; + do + { result->words[i] &= other->words[i]; + + if (result->words[i] != 0) + lastnonzero = i; + } while (++i < resultlen); /* If we computed an empty result, we must return NULL */ - if (bms_is_empty_internal(result)) + if (lastnonzero == -1) { pfree(result); return NULL; } + + /* get rid of trailing zero words */ + result->nwords = lastnonzero + 1; return result; } /* - * bms_difference - set difference (ie, A without members of B) + * bms_difference - create and return a new set containing all the members of + * 'a' without the members of 'b'. */ Bitmapset * bms_difference(const Bitmapset *a, const Bitmapset *b) { Bitmapset *result; - int shortlen; int i; + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + /* Handle cases where either input is NULL */ if (a == NULL) return NULL; @@ -317,10 +367,40 @@ bms_difference(const Bitmapset *a, const Bitmapset *b) /* Copy the left input */ result = bms_copy(a); + /* And remove b's bits from result */ - shortlen = Min(a->nwords, b->nwords); - for (i = 0; i < shortlen; i++) - result->words[i] &= ~b->words[i]; + if (result->nwords > b->nwords) + { + /* + * We'll never need to remove trailing zero words when 'a' has more + * words than 'b' as the additional words must be non-zero. + */ + i = 0; + do + { + result->words[i] &= ~b->words[i]; + } while (++i < b->nwords); + } + else + { + int lastnonzero = -1; + + /* we may need to remove trailing zero words from the result. */ + i = 0; + do + { + result->words[i] &= ~b->words[i]; + + /* remember the last non-zero word */ + if (result->words[i] != 0) + lastnonzero = i; + } while (++i < result->nwords); + + /* trim off trailing zero words */ + result->nwords = lastnonzero + 1; + } + Assert(result->nwords != 0); + /* Need not check for empty result, since we handled that case above */ return result; } @@ -331,32 +411,28 @@ bms_difference(const Bitmapset *a, const Bitmapset *b) bool bms_is_subset(const Bitmapset *a, const Bitmapset *b) { - int shortlen; - int longlen; int i; + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + /* Handle cases where either input is NULL */ if (a == NULL) return true; /* empty set is a subset of anything */ if (b == NULL) return false; - /* Check common words */ - shortlen = Min(a->nwords, b->nwords); - for (i = 0; i < shortlen; i++) + + /* 'a' can't be a subset of 'b' if it contains more words */ + if (a->nwords > b->nwords) + return false; + + /* Check all 'a' members are set in 'b' */ + i = 0; + do { if ((a->words[i] & ~b->words[i]) != 0) return false; - } - /* Check extra words */ - if (a->nwords > b->nwords) - { - longlen = a->nwords; - for (; i < longlen; i++) - { - if (a->words[i] != 0) - return false; - } - } + } while (++i < a->nwords); return true; } @@ -370,9 +446,11 @@ bms_subset_compare(const Bitmapset *a, const Bitmapset *b) { BMS_Comparison result; int shortlen; - int longlen; int i; + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + /* Handle cases where either input is NULL */ if (a == NULL) { @@ -382,10 +460,12 @@ bms_subset_compare(const Bitmapset *a, const Bitmapset *b) } if (b == NULL) return BMS_SUBSET2; + /* Check common words */ result = BMS_EQUAL; /* status so far */ shortlen = Min(a->nwords, b->nwords); - for (i = 0; i < shortlen; i++) + i = 0; + do { bitmapword aword = a->words[i]; bitmapword bword = b->words[i]; @@ -404,35 +484,21 @@ bms_subset_compare(const Bitmapset *a, const Bitmapset *b) return BMS_DIFFERENT; result = BMS_SUBSET1; } - } + } while (++i < shortlen); /* Check extra words */ if (a->nwords > b->nwords) { - longlen = a->nwords; - for (; i < longlen; i++) - { - if (a->words[i] != 0) - { - /* a is not a subset of b */ - if (result == BMS_SUBSET1) - return BMS_DIFFERENT; - result = BMS_SUBSET2; - } - } + /* if a has more words then a is not a subset of b */ + if (result == BMS_SUBSET1) + return BMS_DIFFERENT; + return BMS_SUBSET2; } else if (a->nwords < b->nwords) { - longlen = b->nwords; - for (; i < longlen; i++) - { - if (b->words[i] != 0) - { - /* b is not a subset of a */ - if (result == BMS_SUBSET2) - return BMS_DIFFERENT; - result = BMS_SUBSET1; - } - } + /* if b has more words then b is not a subset of a */ + if (result == BMS_SUBSET2) + return BMS_DIFFERENT; + return BMS_SUBSET1; } return result; } @@ -446,11 +512,14 @@ bms_is_member(int x, const Bitmapset *a) int wordnum, bitnum; + Assert(bms_is_valid_set(a)); + /* XXX better to just return false for x<0 ? */ if (x < 0) elog(ERROR, "negative bitmapset member not allowed"); if (a == NULL) return false; + wordnum = WORDNUM(x); bitnum = BITNUM(x); if (wordnum >= a->nwords) @@ -475,6 +544,8 @@ bms_member_index(Bitmapset *a, int x) int result = 0; bitmapword mask; + Assert(bms_is_valid_set(a)); + /* return -1 if not a member of the bitmap */ if (!bms_is_member(x, a)) return -1; @@ -513,16 +584,20 @@ bms_overlap(const Bitmapset *a, const Bitmapset *b) int shortlen; int i; + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + /* Handle cases where either input is NULL */ if (a == NULL || b == NULL) return false; /* Check words in common */ shortlen = Min(a->nwords, b->nwords); - for (i = 0; i < shortlen; i++) + i = 0; + do { if ((a->words[i] & b->words[i]) != 0) return true; - } + } while (++i < shortlen); return false; } @@ -536,6 +611,8 @@ bms_overlap_list(const Bitmapset *a, const List *b) int wordnum, bitnum; + Assert(bms_is_valid_set(a)); + if (a == NULL || b == NIL) return false; @@ -563,27 +640,26 @@ bms_overlap_list(const Bitmapset *a, const List *b) bool bms_nonempty_difference(const Bitmapset *a, const Bitmapset *b) { - int shortlen; int i; + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + /* Handle cases where either input is NULL */ if (a == NULL) return false; if (b == NULL) return true; - /* Check words in common */ - shortlen = Min(a->nwords, b->nwords); - for (i = 0; i < shortlen; i++) + /* if 'a' has more words then it must contain additional members */ + if (a->nwords > b->nwords) + return true; + /* Check all 'a' members are set in 'b' */ + i = 0; + do { if ((a->words[i] & ~b->words[i]) != 0) return true; - } - /* Check extra words in a */ - for (; i < a->nwords; i++) - { - if (a->words[i] != 0) - return true; - } + } while (++i < a->nwords); return false; } @@ -599,10 +675,14 @@ bms_singleton_member(const Bitmapset *a) int nwords; int wordnum; + Assert(bms_is_valid_set(a)); + if (a == NULL) elog(ERROR, "bitmapset is empty"); + nwords = a->nwords; - for (wordnum = 0; wordnum < nwords; wordnum++) + wordnum = 0; + do { bitmapword w = a->words[wordnum]; @@ -613,9 +693,10 @@ bms_singleton_member(const Bitmapset *a) result = wordnum * BITS_PER_BITMAPWORD; result += bmw_rightmost_one_pos(w); } - } - if (result < 0) - elog(ERROR, "bitmapset is empty"); + } while (++wordnum < nwords); + + /* we don't expect non-NULL sets to be empty */ + Assert(result >= 0); return result; } @@ -637,10 +718,14 @@ bms_get_singleton_member(const Bitmapset *a, int *member) int nwords; int wordnum; + Assert(bms_is_valid_set(a)); + if (a == NULL) return false; + nwords = a->nwords; - for (wordnum = 0; wordnum < nwords; wordnum++) + wordnum = 0; + do { bitmapword w = a->words[wordnum]; @@ -651,9 +736,10 @@ bms_get_singleton_member(const Bitmapset *a, int *member) result = wordnum * BITS_PER_BITMAPWORD; result += bmw_rightmost_one_pos(w); } - } - if (result < 0) - return false; + } while (++wordnum < nwords); + + /* we don't expect non-NULL sets to be empty */ + Assert(result >= 0); *member = result; return true; } @@ -668,17 +754,21 @@ bms_num_members(const Bitmapset *a) int nwords; int wordnum; + Assert(bms_is_valid_set(a)); + if (a == NULL) return 0; + nwords = a->nwords; - for (wordnum = 0; wordnum < nwords; wordnum++) + wordnum = 0; + do { bitmapword w = a->words[wordnum]; /* No need to count the bits in a zero word */ if (w != 0) result += bmw_popcount(w); - } + } while (++wordnum < nwords); return result; } @@ -694,10 +784,14 @@ bms_membership(const Bitmapset *a) int nwords; int wordnum; + Assert(bms_is_valid_set(a)); + if (a == NULL) return BMS_EMPTY_SET; + nwords = a->nwords; - for (wordnum = 0; wordnum < nwords; wordnum++) + wordnum = 0; + do { bitmapword w = a->words[wordnum]; @@ -707,49 +801,15 @@ bms_membership(const Bitmapset *a) return BMS_MULTIPLE; result = BMS_SINGLETON; } - } + } while (++wordnum < nwords); return result; } -/* - * bms_is_empty_internal - is a set empty? - * - * This is now used only locally, to detect cases where a function has - * computed an empty set that we must now get rid of. Hence, we can - * assume the input isn't NULL. - */ -static bool -bms_is_empty_internal(const Bitmapset *a) -{ - int nwords; - int wordnum; - - nwords = a->nwords; - for (wordnum = 0; wordnum < nwords; wordnum++) - { - bitmapword w = a->words[wordnum]; - - if (w != 0) - return false; - } - return true; -} - - -/* - * These operations all "recycle" their non-const inputs, ie, either - * return the modified input or pfree it if it can't hold the result. - * - * These should generally be used in the style - * - * foo = bms_add_member(foo, x); - */ - /* * bms_add_member - add a specified member to set * - * Input set is modified or recycled! + * 'a' is recycled when possible. */ Bitmapset * bms_add_member(Bitmapset *a, int x) @@ -757,10 +817,13 @@ bms_add_member(Bitmapset *a, int x) int wordnum, bitnum; + Assert(bms_is_valid_set(a)); + if (x < 0) elog(ERROR, "negative bitmapset member not allowed"); if (a == NULL) return bms_make_singleton(x); + wordnum = WORDNUM(x); bitnum = BITNUM(x); @@ -773,11 +836,24 @@ bms_add_member(Bitmapset *a, int x) a = (Bitmapset *) repalloc(a, BITMAPSET_SIZE(wordnum + 1)); a->nwords = wordnum + 1; /* zero out the enlarged portion */ - for (i = oldnwords; i < a->nwords; i++) + i = oldnwords; + do + { a->words[i] = 0; + } while (++i < a->nwords); } a->words[wordnum] |= ((bitmapword) 1 << bitnum); + +#ifdef REALLOCATE_BITMAPSETS + + /* + * There's no guarantee that the repalloc returned a new pointer, so copy + * and free unconditionally here. + */ + a = bms_copy_and_free(a); +#endif + return a; } @@ -786,7 +862,7 @@ bms_add_member(Bitmapset *a, int x) * * No error if x is not currently a member of set * - * Input set is modified in-place! + * 'a' is recycled when possible. */ Bitmapset * bms_del_member(Bitmapset *a, int x) @@ -794,17 +870,40 @@ bms_del_member(Bitmapset *a, int x) int wordnum, bitnum; + Assert(bms_is_valid_set(a)); + if (x < 0) elog(ERROR, "negative bitmapset member not allowed"); if (a == NULL) return NULL; + wordnum = WORDNUM(x); bitnum = BITNUM(x); - if (wordnum < a->nwords) - a->words[wordnum] &= ~((bitmapword) 1 << bitnum); - /* If we computed an empty result, we must return NULL */ - if (bms_is_empty_internal(a)) + +#ifdef REALLOCATE_BITMAPSETS + a = bms_copy_and_free(a); +#endif + + /* member can't exist. Return 'a' unmodified */ + if (unlikely(wordnum >= a->nwords)) + return a; + + a->words[wordnum] &= ~((bitmapword) 1 << bitnum); + + /* when last word becomes empty, trim off all trailing empty words */ + if (a->words[wordnum] == 0 && wordnum == a->nwords - 1) { + /* find the last non-empty word and make that the new final word */ + for (int i = wordnum - 1; i >= 0; i--) + { + if (a->words[i] != 0) + { + a->nwords = i + 1; + return a; + } + } + + /* the set is now empty */ pfree(a); return NULL; } @@ -812,7 +911,7 @@ bms_del_member(Bitmapset *a, int x) } /* - * bms_add_members - like bms_union, but left input is recycled + * bms_add_members - like bms_union, but left input is recycled when possible */ Bitmapset * bms_add_members(Bitmapset *a, const Bitmapset *b) @@ -822,11 +921,20 @@ bms_add_members(Bitmapset *a, const Bitmapset *b) int otherlen; int i; + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + /* Handle cases where either input is NULL */ if (a == NULL) return bms_copy(b); if (b == NULL) + { +#ifdef REALLOCATE_BITMAPSETS + a = bms_copy_and_free(a); +#endif + return a; + } /* Identify shorter and longer input; copy the longer one if needed */ if (a->nwords < b->nwords) { @@ -840,13 +948,65 @@ bms_add_members(Bitmapset *a, const Bitmapset *b) } /* And union the shorter input into the result */ otherlen = other->nwords; - for (i = 0; i < otherlen; i++) + i = 0; + do + { result->words[i] |= other->words[i]; + } while (++i < otherlen); if (result != a) pfree(a); +#ifdef REALLOCATE_BITMAPSETS + else + result = bms_copy_and_free(result); +#endif + return result; } +/* + * bms_replace_members + * Remove all existing members from 'a' and repopulate the set with members + * from 'b', recycling 'a', when possible. + */ +Bitmapset * +bms_replace_members(Bitmapset *a, const Bitmapset *b) +{ + int i; + + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + + if (a == NULL) + return bms_copy(b); + if (b == NULL) + { + pfree(a); + return NULL; + } + + if (a->nwords < b->nwords) + a = (Bitmapset *) repalloc(a, BITMAPSET_SIZE(b->nwords)); + + i = 0; + do + { + a->words[i] = b->words[i]; + } while (++i < b->nwords); + + a->nwords = b->nwords; + +#ifdef REALLOCATE_BITMAPSETS + + /* + * There's no guarantee that the repalloc returned a new pointer, so copy + * and free unconditionally here. + */ + a = bms_copy_and_free(a); +#endif + + return a; +} + /* * bms_add_range * Add members in the range of 'lower' to 'upper' to the set. @@ -864,9 +1024,17 @@ bms_add_range(Bitmapset *a, int lower, int upper) ushiftbits, wordnum; + Assert(bms_is_valid_set(a)); + /* do nothing if nothing is called for, without further checking */ if (upper < lower) + { +#ifdef REALLOCATE_BITMAPSETS + a = bms_copy_and_free(a); +#endif + return a; + } if (lower < 0) elog(ERROR, "negative bitmapset member not allowed"); @@ -887,8 +1055,11 @@ bms_add_range(Bitmapset *a, int lower, int upper) a = (Bitmapset *) repalloc(a, BITMAPSET_SIZE(uwordnum + 1)); a->nwords = uwordnum + 1; /* zero out the enlarged portion */ - for (i = oldnwords; i < a->nwords; i++) + i = oldnwords; + do + { a->words[i] = 0; + } while (++i < a->nwords); } wordnum = lwordnum = WORDNUM(lower); @@ -918,18 +1089,32 @@ bms_add_range(Bitmapset *a, int lower, int upper) a->words[uwordnum] |= (~(bitmapword) 0) >> ushiftbits; } +#ifdef REALLOCATE_BITMAPSETS + + /* + * There's no guarantee that the repalloc returned a new pointer, so copy + * and free unconditionally here. + */ + a = bms_copy_and_free(a); +#endif + return a; } /* - * bms_int_members - like bms_intersect, but left input is recycled + * bms_int_members - like bms_intersect, but left input is recycled when + * possible */ Bitmapset * bms_int_members(Bitmapset *a, const Bitmapset *b) { + int lastnonzero; int shortlen; int i; + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + /* Handle cases where either input is NULL */ if (a == NULL) return NULL; @@ -938,50 +1123,108 @@ bms_int_members(Bitmapset *a, const Bitmapset *b) pfree(a); return NULL; } + /* Intersect b into a; we need never copy */ shortlen = Min(a->nwords, b->nwords); - for (i = 0; i < shortlen; i++) + lastnonzero = -1; + i = 0; + do + { a->words[i] &= b->words[i]; - for (; i < a->nwords; i++) - a->words[i] = 0; + + if (a->words[i] != 0) + lastnonzero = i; + } while (++i < shortlen); + /* If we computed an empty result, we must return NULL */ - if (bms_is_empty_internal(a)) + if (lastnonzero == -1) { pfree(a); return NULL; } + + /* get rid of trailing zero words */ + a->nwords = lastnonzero + 1; + +#ifdef REALLOCATE_BITMAPSETS + a = bms_copy_and_free(a); +#endif + return a; } /* - * bms_del_members - like bms_difference, but left input is recycled + * bms_del_members - delete members in 'a' that are set in 'b'. 'a' is + * recycled when possible. */ Bitmapset * bms_del_members(Bitmapset *a, const Bitmapset *b) { - int shortlen; int i; + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + /* Handle cases where either input is NULL */ if (a == NULL) return NULL; if (b == NULL) + { +#ifdef REALLOCATE_BITMAPSETS + a = bms_copy_and_free(a); +#endif + return a; + } + /* Remove b's bits from a; we need never copy */ - shortlen = Min(a->nwords, b->nwords); - for (i = 0; i < shortlen; i++) - a->words[i] &= ~b->words[i]; - /* If we computed an empty result, we must return NULL */ - if (bms_is_empty_internal(a)) + if (a->nwords > b->nwords) { - pfree(a); - return NULL; + /* + * We'll never need to remove trailing zero words when 'a' has more + * words than 'b'. + */ + i = 0; + do + { + a->words[i] &= ~b->words[i]; + } while (++i < b->nwords); + } + else + { + int lastnonzero = -1; + + /* we may need to remove trailing zero words from the result. */ + i = 0; + do + { + a->words[i] &= ~b->words[i]; + + /* remember the last non-zero word */ + if (a->words[i] != 0) + lastnonzero = i; + } while (++i < a->nwords); + + /* check if 'a' has become empty */ + if (lastnonzero == -1) + { + pfree(a); + return NULL; + } + + /* trim off any trailing zero words */ + a->nwords = lastnonzero + 1; } + +#ifdef REALLOCATE_BITMAPSETS + a = bms_copy_and_free(a); +#endif + return a; } /* - * bms_join - like bms_union, but *both* inputs are recycled + * bms_join - like bms_union, but *either* input *may* be recycled */ Bitmapset * bms_join(Bitmapset *a, Bitmapset *b) @@ -991,11 +1234,27 @@ bms_join(Bitmapset *a, Bitmapset *b) int otherlen; int i; + Assert(bms_is_valid_set(a)); + Assert(bms_is_valid_set(b)); + /* Handle cases where either input is NULL */ if (a == NULL) + { +#ifdef REALLOCATE_BITMAPSETS + b = bms_copy_and_free(b); +#endif + return b; + } if (b == NULL) + { +#ifdef REALLOCATE_BITMAPSETS + a = bms_copy_and_free(a); +#endif + return a; + } + /* Identify shorter and longer input; use longer one as result */ if (a->nwords < b->nwords) { @@ -1009,10 +1268,18 @@ bms_join(Bitmapset *a, Bitmapset *b) } /* And union the shorter input into the result */ otherlen = other->nwords; - for (i = 0; i < otherlen; i++) + i = 0; + do + { result->words[i] |= other->words[i]; + } while (++i < otherlen); if (other != result) /* pure paranoia */ pfree(other); + +#ifdef REALLOCATE_BITMAPSETS + result = bms_copy_and_free(result); +#endif + return result; } @@ -1042,6 +1309,8 @@ bms_next_member(const Bitmapset *a, int prevbit) int wordnum; bitmapword mask; + Assert(bms_is_valid_set(a)); + if (a == NULL) return -2; nwords = a->nwords; @@ -1101,6 +1370,8 @@ bms_prev_member(const Bitmapset *a, int prevbit) int ushiftbits; bitmapword mask; + Assert(bms_is_valid_set(a)); + /* * If set is NULL or if there are no more bits to the right then we've * nothing to do. @@ -1140,28 +1411,16 @@ bms_prev_member(const Bitmapset *a, int prevbit) /* * bms_hash_value - compute a hash key for a Bitmapset - * - * Note: we must ensure that any two bitmapsets that are bms_equal() will - * hash to the same value; in practice this means that trailing all-zero - * words must not affect the result. Hence we strip those before applying - * hash_any(). */ uint32 bms_hash_value(const Bitmapset *a) { - int lastword; + Assert(bms_is_valid_set(a)); if (a == NULL) return 0; /* All empty sets hash to 0 */ - for (lastword = a->nwords; --lastword >= 0;) - { - if (a->words[lastword] != 0) - break; - } - if (lastword < 0) - return 0; /* All empty sets hash to 0 */ return DatumGetUInt32(hash_any((const unsigned char *) a->words, - (lastword + 1) * sizeof(bitmapword))); + a->nwords * sizeof(bitmapword))); } /* diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index f2568ff5e6a8d..74b7def804056 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -4,7 +4,7 @@ * Copy functions for Postgres tree nodes. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 06d498f029627..7caae4d48b050 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -8,7 +8,7 @@ * "x" to be considered equal() to another reference to "x" in the query. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/nodes/extensible.c b/src/backend/nodes/extensible.c index 962cbc5cfa8d8..b4353d6d840b7 100644 --- a/src/backend/nodes/extensible.c +++ b/src/backend/nodes/extensible.c @@ -10,7 +10,7 @@ * and GetExtensibleNodeMethods to get information about a previously * registered type of extensible node. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/nodes/gen_node_support.pl b/src/backend/nodes/gen_node_support.pl index 72c79635781ed..bdda4fbb91864 100644 --- a/src/backend/nodes/gen_node_support.pl +++ b/src/backend/nodes/gen_node_support.pl @@ -8,7 +8,7 @@ # - readfuncs # - outfuncs # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/backend/nodes/gen_node_support.pl @@ -16,7 +16,7 @@ #---------------------------------------------------------------------- use strict; -use warnings; +use warnings FATAL => 'all'; use File::Basename; use Getopt::Long; @@ -106,8 +106,8 @@ sub elem # In HEAD, these variables should be left undef, since we don't promise # ABI stability during development. -my $last_nodetag = undef; -my $last_nodetag_no = undef; +my $last_nodetag = 'WindowObjectData'; +my $last_nodetag_no = 474; # output file names my @output_files; @@ -149,7 +149,7 @@ sub elem # they otherwise don't participate in node support. my @extra_tags = qw( IntList OidList XidList - AllocSetContext GenerationContext SlabContext + AllocSetContext GenerationContext SlabContext BumpContext TIDBitmap WindowObjectData ); @@ -585,7 +585,7 @@ sub elem * %s * Generated node infrastructure code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * NOTES @@ -777,7 +777,7 @@ sub elem print $eff "\tCOMPARE_BITMAPSET_FIELD($f);\n" unless $equal_ignore; } - elsif ($t eq 'int' && $f =~ 'location$') + elsif ($t eq 'ParseLoc') { print $cff "\tCOPY_LOCATION_FIELD($f);\n" unless $copy_ignore; print $eff "\tCOMPARE_LOCATION_FIELD($f);\n" unless $equal_ignore; @@ -1010,7 +1010,7 @@ sub elem print $off "\tWRITE_BOOL_FIELD($f);\n"; print $rff "\tREAD_BOOL_FIELD($f);\n" unless $no_read; } - elsif ($t eq 'int' && $f =~ 'location$') + elsif ($t eq 'ParseLoc') { print $off "\tWRITE_LOCATION_FIELD($f);\n"; print $rff "\tREAD_LOCATION_FIELD($f);\n" unless $no_read; @@ -1303,7 +1303,7 @@ sub elem print $jff "\tJUMBLE_NODE($f);\n" unless $query_jumble_ignore; } - elsif ($t eq 'int' && $f =~ 'location$') + elsif ($t eq 'ParseLoc') { # Track the node's location only if directly requested. if ($query_jumble_location) diff --git a/src/backend/nodes/list.c b/src/backend/nodes/list.c index 750ee5a7e559e..e2615ab10503c 100644 --- a/src/backend/nodes/list.c +++ b/src/backend/nodes/list.c @@ -6,7 +6,7 @@ * See comments in pg_list.h. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -17,6 +17,7 @@ */ #include "postgres.h" +#include "common/int.h" #include "nodes/pg_list.h" #include "port/pg_bitutils.h" #include "utils/memdebug.h" @@ -1692,11 +1693,7 @@ list_int_cmp(const ListCell *p1, const ListCell *p2) int v1 = lfirst_int(p1); int v2 = lfirst_int(p2); - if (v1 < v2) - return -1; - if (v1 > v2) - return 1; - return 0; + return pg_cmp_s32(v1, v2); } /* @@ -1708,9 +1705,5 @@ list_oid_cmp(const ListCell *p1, const ListCell *p2) Oid v1 = lfirst_oid(p1); Oid v2 = lfirst_oid(p2); - if (v1 < v2) - return -1; - if (v1 > v2) - return 1; - return 0; + return pg_cmp_u32(v1, v2); } diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c index 39e1884cf436c..9f3b4f200fb0c 100644 --- a/src/backend/nodes/makefuncs.c +++ b/src/backend/nodes/makefuncs.c @@ -4,7 +4,7 @@ * creator functions for various nodes. The functions here are for the * most frequently created nodes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,7 +19,6 @@ #include "catalog/pg_type.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" -#include "utils/errcodes.h" #include "utils/lsyscache.h" @@ -160,6 +159,53 @@ makeWholeRowVar(RangeTblEntry *rte, varlevelsup); break; + case RTE_SUBQUERY: + + /* + * For a standard subquery, the Var should be of RECORD type. + * However, if we're looking at a subquery that was expanded from + * a view or SRF (only possible during planning), we must use the + * appropriate rowtype, so that the resulting Var has the same + * type that we would have produced from the original RTE. + */ + if (OidIsValid(rte->relid)) + { + /* Subquery was expanded from a view */ + toid = get_rel_type_id(rte->relid); + if (!OidIsValid(toid)) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("relation \"%s\" does not have a composite type", + get_rel_name(rte->relid)))); + } + else if (rte->functions) + { + /* + * Subquery was expanded from a set-returning function. That + * would not have happened if there's more than one function + * or ordinality was requested. We also needn't worry about + * the allowScalar case, since the planner doesn't use that. + * Otherwise this must match the RTE_FUNCTION code below. + */ + Assert(!allowScalar); + fexpr = ((RangeTblFunction *) linitial(rte->functions))->funcexpr; + toid = exprType(fexpr); + if (!type_is_rowtype(toid)) + toid = RECORDOID; + } + else + { + /* Normal subquery-in-FROM */ + toid = RECORDOID; + } + result = makeVar(varno, + InvalidAttrNumber, + toid, + -1, + InvalidOid, + varlevelsup); + break; + case RTE_FUNCTION: /* @@ -216,8 +262,8 @@ makeWholeRowVar(RangeTblEntry *rte, default: /* - * RTE is a join, subselect, tablefunc, or VALUES. We represent - * this as a whole-row Var of RECORD type. (Note that in most + * RTE is a join, tablefunc, VALUES, CTE, etc. We represent these + * cases as a whole-row Var of RECORD type. (Note that in most * cases the Var will be expanded to a RowExpr during planning, * but that is not our concern here.) */ @@ -538,6 +584,22 @@ makeFuncExpr(Oid funcid, Oid rettype, List *args, return funcexpr; } +/* + * makeStringConst - + * build a A_Const node of type T_String for given string + */ +Node * +makeStringConst(char *str, int location) +{ + A_Const *n = makeNode(A_Const); + + n->val.sval.type = T_String; + n->val.sval.sval = str; + n->location = location; + + return (Node *) n; +} + /* * makeDefElem - * build a DefElem node @@ -777,9 +839,6 @@ makeIndexInfo(int numattrs, int numkeyattrs, Oid amoid, List *expressions, n->ii_ExclusionProcs = NULL; n->ii_ExclusionStrats = NULL; - /* opclass options */ - n->ii_OpclassOptions = NULL; - /* speculative inserts */ n->ii_UniqueOps = NULL; n->ii_UniqueProcs = NULL; @@ -848,36 +907,32 @@ makeJsonFormat(JsonFormatType type, JsonEncoding encoding, int location) * creates a JsonValueExpr node */ JsonValueExpr * -makeJsonValueExpr(Expr *expr, JsonFormat *format) +makeJsonValueExpr(Expr *raw_expr, Expr *formatted_expr, + JsonFormat *format) { JsonValueExpr *jve = makeNode(JsonValueExpr); - jve->raw_expr = expr; - jve->formatted_expr = NULL; + jve->raw_expr = raw_expr; + jve->formatted_expr = formatted_expr; jve->format = format; return jve; } /* - * makeJsonEncoding - - * converts JSON encoding name to enum JsonEncoding + * makeJsonBehavior - + * creates a JsonBehavior node */ -JsonEncoding -makeJsonEncoding(char *name) +JsonBehavior * +makeJsonBehavior(JsonBehaviorType btype, Node *expr, int location) { - if (!pg_strcasecmp(name, "utf8")) - return JS_ENC_UTF8; - if (!pg_strcasecmp(name, "utf16")) - return JS_ENC_UTF16; - if (!pg_strcasecmp(name, "utf32")) - return JS_ENC_UTF32; + JsonBehavior *behavior = makeNode(JsonBehavior); - ereport(ERROR, - errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("unrecognized JSON encoding: %s", name)); + behavior->btype = btype; + behavior->expr = expr; + behavior->location = location; - return JS_ENC_DEFAULT; + return behavior; } /* @@ -913,3 +968,40 @@ makeJsonIsPredicate(Node *expr, JsonFormat *format, JsonValueType item_type, return (Node *) n; } + +/* + * makeJsonTablePathSpec - + * Make JsonTablePathSpec node from given path string and name (if any) + */ +JsonTablePathSpec * +makeJsonTablePathSpec(char *string, char *name, int string_location, + int name_location) +{ + JsonTablePathSpec *pathspec = makeNode(JsonTablePathSpec); + + Assert(string != NULL); + pathspec->string = makeStringConst(string, string_location); + if (name != NULL) + pathspec->name = pstrdup(name); + + pathspec->name_location = name_location; + pathspec->location = string_location; + + return pathspec; +} + +/* + * makeJsonTablePath - + * Make JsonTablePath node for given path string and name + */ +JsonTablePath * +makeJsonTablePath(Const *pathvalue, char *pathname) +{ + JsonTablePath *path = makeNode(JsonTablePath); + + Assert(IsA(pathvalue, Const)); + path->value = pathvalue; + path->name = pathname; + + return path; +} diff --git a/src/backend/nodes/meson.build b/src/backend/nodes/meson.build index 31467a12d3b59..49626f160e16e 100644 --- a/src/backend/nodes/meson.build +++ b/src/backend/nodes/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'bitmapset.c', @@ -7,7 +7,6 @@ backend_sources += files( 'makefuncs.c', 'multibitmapset.c', 'nodeFuncs.c', - 'nodes.c', 'params.c', 'print.c', 'read.c', diff --git a/src/backend/nodes/multibitmapset.c b/src/backend/nodes/multibitmapset.c index accd6f243ef45..610d634e59fb0 100644 --- a/src/backend/nodes/multibitmapset.c +++ b/src/backend/nodes/multibitmapset.c @@ -18,7 +18,7 @@ * a small fraction of that has been built out; we'll add more as needed. * * - * Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/nodes/multibitmapset.c diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c index c41e6bb984cdd..d2e2af4f8116d 100644 --- a/src/backend/nodes/nodeFuncs.c +++ b/src/backend/nodes/nodeFuncs.c @@ -3,7 +3,7 @@ * nodeFuncs.c * Various general-purpose manipulations of Node trees * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,7 +18,6 @@ #include "catalog/pg_type.h" #include "miscadmin.h" #include "nodes/execnodes.h" -#include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "nodes/pathnodes.h" #include "utils/builtins.h" @@ -67,6 +66,9 @@ exprType(const Node *expr) case T_WindowFunc: type = ((const WindowFunc *) expr)->wintype; break; + case T_MergeSupportFunc: + type = ((const MergeSupportFunc *) expr)->msftype; + break; case T_SubscriptingRef: type = ((const SubscriptingRef *) expr)->refrestype; break; @@ -225,9 +227,7 @@ exprType(const Node *expr) { const JsonValueExpr *jve = (const JsonValueExpr *) expr; - type = exprType((Node *) - (jve->formatted_expr ? jve->formatted_expr : - jve->raw_expr)); + type = exprType((Node *) jve->formatted_expr); } break; case T_JsonConstructorExpr: @@ -236,6 +236,20 @@ exprType(const Node *expr) case T_JsonIsPredicate: type = BOOLOID; break; + case T_JsonExpr: + { + const JsonExpr *jexpr = (const JsonExpr *) expr; + + type = jexpr->returning->typid; + break; + } + case T_JsonBehavior: + { + const JsonBehavior *behavior = (const JsonBehavior *) expr; + + type = exprType(behavior->expr); + break; + } case T_NullTest: type = BOOLOID; break; @@ -495,6 +509,20 @@ exprTypmod(const Node *expr) return exprTypmod((Node *) ((const JsonValueExpr *) expr)->formatted_expr); case T_JsonConstructorExpr: return ((const JsonConstructorExpr *) expr)->returning->typmod; + case T_JsonExpr: + { + const JsonExpr *jexpr = (const JsonExpr *) expr; + + return jexpr->returning->typmod; + } + break; + case T_JsonBehavior: + { + const JsonBehavior *behavior = (const JsonBehavior *) expr; + + return exprTypmod(behavior->expr); + } + break; case T_CoerceToDomain: return ((const CoerceToDomain *) expr)->resulttypmod; case T_CoerceToDomainValue: @@ -812,6 +840,9 @@ exprCollation(const Node *expr) case T_WindowFunc: coll = ((const WindowFunc *) expr)->wincollid; break; + case T_MergeSupportFunc: + coll = ((const MergeSupportFunc *) expr)->msfcollid; + break; case T_SubscriptingRef: coll = ((const SubscriptingRef *) expr)->refcollid; break; @@ -971,6 +1002,23 @@ exprCollation(const Node *expr) /* IS JSON's result is boolean ... */ coll = InvalidOid; /* ... so it has no collation */ break; + case T_JsonExpr: + { + const JsonExpr *jsexpr = (JsonExpr *) expr; + + coll = jsexpr->collation; + } + break; + case T_JsonBehavior: + { + const JsonBehavior *behavior = (JsonBehavior *) expr; + + if (behavior->expr) + coll = exprCollation(behavior->expr); + else + coll = InvalidOid; + } + break; case T_NullTest: /* NullTest's result is boolean ... */ coll = InvalidOid; /* ... so it has no collation */ @@ -1087,6 +1135,9 @@ exprSetCollation(Node *expr, Oid collation) case T_WindowFunc: ((WindowFunc *) expr)->wincollid = collation; break; + case T_MergeSupportFunc: + ((MergeSupportFunc *) expr)->msfcollid = collation; + break; case T_SubscriptingRef: ((SubscriptingRef *) expr)->refcollid = collation; break; @@ -1207,6 +1258,21 @@ exprSetCollation(Node *expr, Oid collation) case T_JsonIsPredicate: Assert(!OidIsValid(collation)); /* result is always boolean */ break; + case T_JsonExpr: + { + JsonExpr *jexpr = (JsonExpr *) expr; + + jexpr->collation = collation; + } + break; + case T_JsonBehavior: + { + JsonBehavior *behavior = (JsonBehavior *) expr; + + if (behavior->expr) + exprSetCollation(behavior->expr, collation); + } + break; case T_NullTest: /* NullTest's result is boolean ... */ Assert(!OidIsValid(collation)); /* ... so never set a collation */ @@ -1345,6 +1411,9 @@ exprLocation(const Node *expr) /* function name should always be the first thing */ loc = ((const WindowFunc *) expr)->location; break; + case T_MergeSupportFunc: + loc = ((const MergeSupportFunc *) expr)->location; + break; case T_SubscriptingRef: /* just use container argument's location */ loc = exprLocation((Node *) ((const SubscriptingRef *) expr)->refexpr); @@ -1510,6 +1579,18 @@ exprLocation(const Node *expr) case T_JsonIsPredicate: loc = ((const JsonIsPredicate *) expr)->location; break; + case T_JsonExpr: + { + const JsonExpr *jsexpr = (const JsonExpr *) expr; + + /* consider both function name and leftmost arg */ + loc = leftmostLoc(jsexpr->location, + exprLocation(jsexpr->formatted_expr)); + } + break; + case T_JsonBehavior: + loc = exprLocation(((JsonBehavior *) expr)->expr); + break; case T_NullTest: { const NullTest *nexpr = (const NullTest *) expr; @@ -2037,6 +2118,7 @@ expression_tree_walker_impl(Node *node, case T_RangeTblRef: case T_SortGroupClause: case T_CTESearchClause: + case T_MergeSupportFunc: /* primitive node types with no expression subnodes */ break; case T_WithCheckOption: @@ -2075,6 +2157,16 @@ expression_tree_walker_impl(Node *node, return true; if (WALK(expr->aggfilter)) return true; + if (WALK(expr->runCondition)) + return true; + } + break; + case T_WindowFuncRunCondition: + { + WindowFuncRunCondition *expr = (WindowFuncRunCondition *) node; + + if (WALK(expr->arg)) + return true; } break; case T_SubscriptingRef: @@ -2262,6 +2354,31 @@ expression_tree_walker_impl(Node *node, break; case T_JsonIsPredicate: return WALK(((JsonIsPredicate *) node)->expr); + case T_JsonExpr: + { + JsonExpr *jexpr = (JsonExpr *) node; + + if (WALK(jexpr->formatted_expr)) + return true; + if (WALK(jexpr->path_spec)) + return true; + if (WALK(jexpr->passing_values)) + return true; + /* we assume walker doesn't care about passing_names */ + if (WALK(jexpr->on_empty)) + return true; + if (WALK(jexpr->on_error)) + return true; + } + break; + case T_JsonBehavior: + { + JsonBehavior *behavior = (JsonBehavior *) node; + + if (WALK(behavior->expr)) + return true; + } + break; case T_NullTest: return WALK(((NullTest *) node)->arg); case T_BooleanTest: @@ -2533,6 +2650,10 @@ expression_tree_walker_impl(Node *node, return true; if (WALK(tf->coldefexprs)) return true; + if (WALK(tf->colvalexprs)) + return true; + if (WALK(tf->passingvalexprs)) + return true; } break; default: @@ -2584,6 +2705,8 @@ query_tree_walker_impl(Query *query, return true; if (WALK(query->mergeActionList)) return true; + if (WALK(query->mergeJoinCondition)) + return true; if (WALK(query->returningList)) return true; if (WALK(query->jointree)) @@ -2867,6 +2990,7 @@ expression_tree_mutator_impl(Node *node, case T_RangeTblRef: case T_SortGroupClause: case T_CTESearchClause: + case T_MergeSupportFunc: return (Node *) copyObject(node); case T_WithCheckOption: { @@ -2927,6 +3051,16 @@ expression_tree_mutator_impl(Node *node, return (Node *) newnode; } break; + case T_WindowFuncRunCondition: + { + WindowFuncRunCondition *wfuncrc = (WindowFuncRunCondition *) node; + WindowFuncRunCondition *newnode; + + FLATCOPY(newnode, wfuncrc, WindowFuncRunCondition); + MUTATE(newnode->arg, wfuncrc->arg, Expr *); + return (Node *) newnode; + } + break; case T_SubscriptingRef: { SubscriptingRef *sbsref = (SubscriptingRef *) node; @@ -3261,6 +3395,31 @@ expression_tree_mutator_impl(Node *node, return (Node *) newnode; } + case T_JsonExpr: + { + JsonExpr *jexpr = (JsonExpr *) node; + JsonExpr *newnode; + + FLATCOPY(newnode, jexpr, JsonExpr); + MUTATE(newnode->formatted_expr, jexpr->formatted_expr, Node *); + MUTATE(newnode->path_spec, jexpr->path_spec, Node *); + MUTATE(newnode->passing_values, jexpr->passing_values, List *); + /* assume mutator does not care about passing_names */ + MUTATE(newnode->on_empty, jexpr->on_empty, JsonBehavior *); + MUTATE(newnode->on_error, jexpr->on_error, JsonBehavior *); + return (Node *) newnode; + } + break; + case T_JsonBehavior: + { + JsonBehavior *behavior = (JsonBehavior *) node; + JsonBehavior *newnode; + + FLATCOPY(newnode, behavior, JsonBehavior); + MUTATE(newnode->expr, behavior->expr, Node *); + return (Node *) newnode; + } + break; case T_NullTest: { NullTest *ntest = (NullTest *) node; @@ -3553,6 +3712,8 @@ expression_tree_mutator_impl(Node *node, MUTATE(newnode->rowexpr, tf->rowexpr, Node *); MUTATE(newnode->colexprs, tf->colexprs, List *); MUTATE(newnode->coldefexprs, tf->coldefexprs, List *); + MUTATE(newnode->colvalexprs, tf->colvalexprs, List *); + MUTATE(newnode->passingvalexprs, tf->passingvalexprs, List *); return (Node *) newnode; } break; @@ -3605,6 +3766,7 @@ query_tree_mutator_impl(Query *query, MUTATE(query->withCheckOptions, query->withCheckOptions, List *); MUTATE(query->onConflict, query->onConflict, OnConflictExpr *); MUTATE(query->mergeActionList, query->mergeActionList, List *); + MUTATE(query->mergeJoinCondition, query->mergeJoinCondition, Node *); MUTATE(query->returningList, query->returningList, List *); MUTATE(query->jointree, query->jointree, FromExpr *); MUTATE(query->setOperations, query->setOperations, Node *); @@ -3829,6 +3991,7 @@ raw_expression_tree_walker_impl(Node *node, case T_ParamRef: case T_A_Const: case T_A_Star: + case T_MergeSupportFunc: /* primitive node types with no subnodes */ break; case T_Alias: @@ -3901,6 +4064,36 @@ raw_expression_tree_walker_impl(Node *node, return true; } break; + case T_JsonParseExpr: + { + JsonParseExpr *jpe = (JsonParseExpr *) node; + + if (WALK(jpe->expr)) + return true; + if (WALK(jpe->output)) + return true; + } + break; + case T_JsonScalarExpr: + { + JsonScalarExpr *jse = (JsonScalarExpr *) node; + + if (WALK(jse->expr)) + return true; + if (WALK(jse->output)) + return true; + } + break; + case T_JsonSerializeExpr: + { + JsonSerializeExpr *jse = (JsonSerializeExpr *) node; + + if (WALK(jse->expr)) + return true; + if (WALK(jse->output)) + return true; + } + break; case T_JsonConstructorExpr: { JsonConstructorExpr *ctor = (JsonConstructorExpr *) node; @@ -3917,6 +4110,66 @@ raw_expression_tree_walker_impl(Node *node, break; case T_JsonIsPredicate: return WALK(((JsonIsPredicate *) node)->expr); + case T_JsonArgument: + return WALK(((JsonArgument *) node)->val); + case T_JsonFuncExpr: + { + JsonFuncExpr *jfe = (JsonFuncExpr *) node; + + if (WALK(jfe->context_item)) + return true; + if (WALK(jfe->pathspec)) + return true; + if (WALK(jfe->passing)) + return true; + if (WALK(jfe->output)) + return true; + if (WALK(jfe->on_empty)) + return true; + if (WALK(jfe->on_error)) + return true; + } + break; + case T_JsonBehavior: + { + JsonBehavior *jb = (JsonBehavior *) node; + + if (WALK(jb->expr)) + return true; + } + break; + case T_JsonTable: + { + JsonTable *jt = (JsonTable *) node; + + if (WALK(jt->context_item)) + return true; + if (WALK(jt->pathspec)) + return true; + if (WALK(jt->passing)) + return true; + if (WALK(jt->columns)) + return true; + if (WALK(jt->on_error)) + return true; + } + break; + case T_JsonTableColumn: + { + JsonTableColumn *jtc = (JsonTableColumn *) node; + + if (WALK(jtc->typeName)) + return true; + if (WALK(jtc->on_empty)) + return true; + if (WALK(jtc->on_error)) + return true; + if (WALK(jtc->columns)) + return true; + } + break; + case T_JsonTablePathSpec: + return WALK(((JsonTablePathSpec *) node)->string); case T_NullTest: return WALK(((NullTest *) node)->arg); case T_BooleanTest: @@ -4019,6 +4272,8 @@ raw_expression_tree_walker_impl(Node *node, return true; if (WALK(stmt->mergeWhenClauses)) return true; + if (WALK(stmt->returningList)) + return true; if (WALK(stmt->withClause)) return true; } diff --git a/src/backend/nodes/nodes.c b/src/backend/nodes/nodes.c deleted file mode 100644 index 1913a4bdf7d3e..0000000000000 --- a/src/backend/nodes/nodes.c +++ /dev/null @@ -1,31 +0,0 @@ -/*------------------------------------------------------------------------- - * - * nodes.c - * support code for nodes (now that we have removed the home-brew - * inheritance system, our support code for nodes is much simpler) - * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * - * IDENTIFICATION - * src/backend/nodes/nodes.c - * - * HISTORY - * Andrew Yu Oct 20, 1994 file creation - * - *------------------------------------------------------------------------- - */ -#include "postgres.h" - -#include "nodes/nodes.h" - -/* - * Support for newNode() macro - * - * In a GCC build there is no need for the global variable newNodeMacroHolder. - * However, we create it anyway, to support the case of a non-GCC-built - * loadable module being loaded into a GCC-built backend. - */ - -Node *newNodeMacroHolder; diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 955286513d24f..3337b77ae6d7a 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -3,7 +3,7 @@ * outfuncs.c * Output functions for Postgres tree nodes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,6 +25,9 @@ #include "nodes/pg_list.h" #include "utils/datum.h" +/* State flag that determines how nodeToStringInternal() should treat location fields */ +static bool write_location_fields = false; + static void outChar(StringInfo str, char c); static void outDouble(StringInfo str, double d); @@ -88,7 +91,7 @@ static void outDouble(StringInfo str, double d); /* Write a parse location field (actually same as INT case) */ #define WRITE_LOCATION_FIELD(fldname) \ - appendStringInfo(str, " :" CppAsString(fldname) " %d", node->fldname) + appendStringInfo(str, " :" CppAsString(fldname) " %d", write_location_fields ? node->fldname : -1) /* Write a Node field */ #define WRITE_NODE_FIELD(fldname) \ @@ -494,7 +497,6 @@ _outRangeTblEntry(StringInfo str, const RangeTblEntry *node) { WRITE_NODE_TYPE("RANGETBLENTRY"); - /* put alias + eref first to make dump more legible */ WRITE_NODE_FIELD(alias); WRITE_NODE_FIELD(eref); WRITE_ENUM_FIELD(rtekind, RTEKind); @@ -503,16 +505,18 @@ _outRangeTblEntry(StringInfo str, const RangeTblEntry *node) { case RTE_RELATION: WRITE_OID_FIELD(relid); + WRITE_BOOL_FIELD(inh); WRITE_CHAR_FIELD(relkind); WRITE_INT_FIELD(rellockmode); - WRITE_NODE_FIELD(tablesample); WRITE_UINT_FIELD(perminfoindex); + WRITE_NODE_FIELD(tablesample); break; case RTE_SUBQUERY: WRITE_NODE_FIELD(subquery); WRITE_BOOL_FIELD(security_barrier); /* we re-use these RELATION fields, too: */ WRITE_OID_FIELD(relid); + WRITE_BOOL_FIELD(inh); WRITE_CHAR_FIELD(relkind); WRITE_INT_FIELD(rellockmode); WRITE_UINT_FIELD(perminfoindex); @@ -564,7 +568,6 @@ _outRangeTblEntry(StringInfo str, const RangeTblEntry *node) } WRITE_BOOL_FIELD(lateral); - WRITE_BOOL_FIELD(inh); WRITE_BOOL_FIELD(inFromCl); WRITE_NODE_FIELD(securityQuals); } @@ -680,8 +683,13 @@ _outString(StringInfo str, const String *node) static void _outBitString(StringInfo str, const BitString *node) { - /* internal representation already has leading 'b' */ - appendStringInfoString(str, node->bsval); + /* + * The lexer will always produce a string starting with 'b' or 'x'. There + * might be characters following that that need escaping, but outToken + * won't escape the 'b' or 'x'. This is relied on by nodeTokenType. + */ + Assert(node->bsval[0] == 'b' || node->bsval[0] == 'x'); + outToken(str, node->bsval); } static void @@ -699,127 +707,6 @@ _outA_Const(StringInfo str, const A_Const *node) WRITE_LOCATION_FIELD(location); } -static void -_outConstraint(StringInfo str, const Constraint *node) -{ - WRITE_NODE_TYPE("CONSTRAINT"); - - WRITE_STRING_FIELD(conname); - WRITE_BOOL_FIELD(deferrable); - WRITE_BOOL_FIELD(initdeferred); - WRITE_LOCATION_FIELD(location); - - appendStringInfoString(str, " :contype "); - switch (node->contype) - { - case CONSTR_NULL: - appendStringInfoString(str, "NULL"); - break; - - case CONSTR_NOTNULL: - appendStringInfoString(str, "NOT_NULL"); - break; - - case CONSTR_DEFAULT: - appendStringInfoString(str, "DEFAULT"); - WRITE_NODE_FIELD(raw_expr); - WRITE_STRING_FIELD(cooked_expr); - break; - - case CONSTR_IDENTITY: - appendStringInfoString(str, "IDENTITY"); - WRITE_NODE_FIELD(options); - WRITE_CHAR_FIELD(generated_when); - break; - - case CONSTR_GENERATED: - appendStringInfoString(str, "GENERATED"); - WRITE_NODE_FIELD(raw_expr); - WRITE_STRING_FIELD(cooked_expr); - WRITE_CHAR_FIELD(generated_when); - break; - - case CONSTR_CHECK: - appendStringInfoString(str, "CHECK"); - WRITE_BOOL_FIELD(is_no_inherit); - WRITE_NODE_FIELD(raw_expr); - WRITE_STRING_FIELD(cooked_expr); - WRITE_BOOL_FIELD(skip_validation); - WRITE_BOOL_FIELD(initially_valid); - break; - - case CONSTR_PRIMARY: - appendStringInfoString(str, "PRIMARY_KEY"); - WRITE_NODE_FIELD(keys); - WRITE_NODE_FIELD(including); - WRITE_NODE_FIELD(options); - WRITE_STRING_FIELD(indexname); - WRITE_STRING_FIELD(indexspace); - WRITE_BOOL_FIELD(reset_default_tblspc); - /* access_method and where_clause not currently used */ - break; - - case CONSTR_UNIQUE: - appendStringInfoString(str, "UNIQUE"); - WRITE_BOOL_FIELD(nulls_not_distinct); - WRITE_NODE_FIELD(keys); - WRITE_NODE_FIELD(including); - WRITE_NODE_FIELD(options); - WRITE_STRING_FIELD(indexname); - WRITE_STRING_FIELD(indexspace); - WRITE_BOOL_FIELD(reset_default_tblspc); - /* access_method and where_clause not currently used */ - break; - - case CONSTR_EXCLUSION: - appendStringInfoString(str, "EXCLUSION"); - WRITE_NODE_FIELD(exclusions); - WRITE_NODE_FIELD(including); - WRITE_NODE_FIELD(options); - WRITE_STRING_FIELD(indexname); - WRITE_STRING_FIELD(indexspace); - WRITE_BOOL_FIELD(reset_default_tblspc); - WRITE_STRING_FIELD(access_method); - WRITE_NODE_FIELD(where_clause); - break; - - case CONSTR_FOREIGN: - appendStringInfoString(str, "FOREIGN_KEY"); - WRITE_NODE_FIELD(pktable); - WRITE_NODE_FIELD(fk_attrs); - WRITE_NODE_FIELD(pk_attrs); - WRITE_CHAR_FIELD(fk_matchtype); - WRITE_CHAR_FIELD(fk_upd_action); - WRITE_CHAR_FIELD(fk_del_action); - WRITE_NODE_FIELD(fk_del_set_cols); - WRITE_NODE_FIELD(old_conpfeqop); - WRITE_OID_FIELD(old_pktable_oid); - WRITE_BOOL_FIELD(skip_validation); - WRITE_BOOL_FIELD(initially_valid); - break; - - case CONSTR_ATTR_DEFERRABLE: - appendStringInfoString(str, "ATTR_DEFERRABLE"); - break; - - case CONSTR_ATTR_NOT_DEFERRABLE: - appendStringInfoString(str, "ATTR_NOT_DEFERRABLE"); - break; - - case CONSTR_ATTR_DEFERRED: - appendStringInfoString(str, "ATTR_DEFERRED"); - break; - - case CONSTR_ATTR_IMMEDIATE: - appendStringInfoString(str, "ATTR_IMMEDIATE"); - break; - - default: - elog(ERROR, "unrecognized ConstrType: %d", (int) node->contype); - break; - } -} - /* * outNode - @@ -873,18 +760,46 @@ outNode(StringInfo str, const void *obj) /* * nodeToString - * returns the ascii representation of the Node as a palloc'd string + * + * write_loc_fields determines whether location fields are output with their + * actual value rather than -1. The actual value can be useful for debugging, + * but for most uses, the actual value is not useful, since the original query + * string is no longer available. */ -char * -nodeToString(const void *obj) +static char * +nodeToStringInternal(const void *obj, bool write_loc_fields) { StringInfoData str; + bool save_write_location_fields; + + save_write_location_fields = write_location_fields; + write_location_fields = write_loc_fields; /* see stringinfo.h for an explanation of this maneuver */ initStringInfo(&str); outNode(&str, obj); + + write_location_fields = save_write_location_fields; + return str.data; } +/* + * Externally visible entry points + */ +char * +nodeToString(const void *obj) +{ + return nodeToStringInternal(obj, false); +} + +char * +nodeToStringWithLocations(const void *obj) +{ + return nodeToStringInternal(obj, true); +} + + /* * bmsToString - * returns the ascii representation of the Bitmapset as a palloc'd string diff --git a/src/backend/nodes/params.c b/src/backend/nodes/params.c index 3413e96f54ee1..cf54ffbe0d923 100644 --- a/src/backend/nodes/params.c +++ b/src/backend/nodes/params.c @@ -4,7 +4,7 @@ * Support for finding the values associated with Param nodes. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/nodes/print.c b/src/backend/nodes/print.c index 2bee73ac4ec68..02798f4482d04 100644 --- a/src/backend/nodes/print.c +++ b/src/backend/nodes/print.c @@ -3,7 +3,7 @@ * print.c * various print routines (used mostly for debugging) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -38,7 +38,7 @@ print(const void *obj) char *s; char *f; - s = nodeToString(obj); + s = nodeToStringWithLocations(obj); f = format_node_dump(s); pfree(s); printf("%s\n", f); @@ -56,7 +56,7 @@ pprint(const void *obj) char *s; char *f; - s = nodeToString(obj); + s = nodeToStringWithLocations(obj); f = pretty_format_node_dump(s); pfree(s); printf("%s\n", f); @@ -74,7 +74,7 @@ elog_node_display(int lev, const char *title, const void *obj, bool pretty) char *s; char *f; - s = nodeToString(obj); + s = nodeToStringWithLocations(obj); if (pretty) f = pretty_format_node_dump(s); else diff --git a/src/backend/nodes/queryjumblefuncs.c b/src/backend/nodes/queryjumblefuncs.c index 281907a4d83d3..129fb447099fe 100644 --- a/src/backend/nodes/queryjumblefuncs.c +++ b/src/backend/nodes/queryjumblefuncs.c @@ -21,7 +21,7 @@ * tree(s) generated from the query. The executor can then use this value * to blame query costs on the proper queryId. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -42,7 +42,13 @@ /* GUC parameters */ int compute_query_id = COMPUTE_QUERY_ID_AUTO; -/* True when compute_query_id is ON, or AUTO and a module requests them */ +/* + * True when compute_query_id is ON or AUTO, and a module requests them. + * + * Note that IsQueryIdEnabled() should be used instead of checking + * query_id_enabled or compute_query_id directly when we want to know + * whether query identifiers are computed in the core or not. + */ bool query_id_enabled = false; static void AppendJumble(JumbleState *jstate, @@ -51,7 +57,6 @@ static void RecordConstLocation(JumbleState *jstate, int location); static void _jumbleNode(JumbleState *jstate, Node *node); static void _jumbleA_Const(JumbleState *jstate, Node *node); static void _jumbleList(JumbleState *jstate, Node *node); -static void _jumbleRangeTblEntry(JumbleState *jstate, Node *node); /* * Given a possibly multi-statement source string, confine our attention to the @@ -347,51 +352,3 @@ _jumbleA_Const(JumbleState *jstate, Node *node) } } } - -static void -_jumbleRangeTblEntry(JumbleState *jstate, Node *node) -{ - RangeTblEntry *expr = (RangeTblEntry *) node; - - JUMBLE_FIELD(rtekind); - switch (expr->rtekind) - { - case RTE_RELATION: - JUMBLE_FIELD(relid); - JUMBLE_NODE(tablesample); - JUMBLE_FIELD(inh); - break; - case RTE_SUBQUERY: - JUMBLE_NODE(subquery); - break; - case RTE_JOIN: - JUMBLE_FIELD(jointype); - break; - case RTE_FUNCTION: - JUMBLE_NODE(functions); - break; - case RTE_TABLEFUNC: - JUMBLE_NODE(tablefunc); - break; - case RTE_VALUES: - JUMBLE_NODE(values_lists); - break; - case RTE_CTE: - - /* - * Depending on the CTE name here isn't ideal, but it's the only - * info we have to identify the referenced WITH item. - */ - JUMBLE_STRING(ctename); - JUMBLE_FIELD(ctelevelsup); - break; - case RTE_NAMEDTUPLESTORE: - JUMBLE_STRING(enrname); - break; - case RTE_RESULT: - break; - default: - elog(ERROR, "unrecognized RTE kind: %d", (int) expr->rtekind); - break; - } -} diff --git a/src/backend/nodes/read.c b/src/backend/nodes/read.c index 813eda3e739da..4eb42445c528b 100644 --- a/src/backend/nodes/read.c +++ b/src/backend/nodes/read.c @@ -4,7 +4,7 @@ * routines to convert a string (legal ascii representation of node) back * to nodes * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -498,14 +498,9 @@ nodeRead(const char *token, int tok_len) result = (Node *) makeString(debackslash(token + 1, tok_len - 2)); break; case T_BitString: - { - char *val = palloc(tok_len + 1); - - memcpy(val, token, tok_len); - val[tok_len] = '\0'; - result = (Node *) makeBitString(val); - break; - } + /* need to remove backslashes, but there are no quotes */ + result = (Node *) makeBitString(debackslash(token, tok_len)); + break; default: elog(ERROR, "unrecognized node type: %d", (int) type); result = NULL; /* keep compiler happy */ diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index 97e43cbb49c9b..c4d01a441a030 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -3,7 +3,7 @@ * readfuncs.c * Reader functions for Postgres tree nodes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -343,148 +343,11 @@ _readA_Const(void) READ_DONE(); } -/* - * _readConstraint - */ -static Constraint * -_readConstraint(void) -{ - READ_LOCALS(Constraint); - - READ_STRING_FIELD(conname); - READ_BOOL_FIELD(deferrable); - READ_BOOL_FIELD(initdeferred); - READ_LOCATION_FIELD(location); - - token = pg_strtok(&length); /* skip :contype */ - token = pg_strtok(&length); /* get field value */ - if (length == 4 && strncmp(token, "NULL", 4) == 0) - local_node->contype = CONSTR_NULL; - else if (length == 8 && strncmp(token, "NOT_NULL", 8) == 0) - local_node->contype = CONSTR_NOTNULL; - else if (length == 7 && strncmp(token, "DEFAULT", 7) == 0) - local_node->contype = CONSTR_DEFAULT; - else if (length == 8 && strncmp(token, "IDENTITY", 8) == 0) - local_node->contype = CONSTR_IDENTITY; - else if (length == 9 && strncmp(token, "GENERATED", 9) == 0) - local_node->contype = CONSTR_GENERATED; - else if (length == 5 && strncmp(token, "CHECK", 5) == 0) - local_node->contype = CONSTR_CHECK; - else if (length == 11 && strncmp(token, "PRIMARY_KEY", 11) == 0) - local_node->contype = CONSTR_PRIMARY; - else if (length == 6 && strncmp(token, "UNIQUE", 6) == 0) - local_node->contype = CONSTR_UNIQUE; - else if (length == 9 && strncmp(token, "EXCLUSION", 9) == 0) - local_node->contype = CONSTR_EXCLUSION; - else if (length == 11 && strncmp(token, "FOREIGN_KEY", 11) == 0) - local_node->contype = CONSTR_FOREIGN; - else if (length == 15 && strncmp(token, "ATTR_DEFERRABLE", 15) == 0) - local_node->contype = CONSTR_ATTR_DEFERRABLE; - else if (length == 19 && strncmp(token, "ATTR_NOT_DEFERRABLE", 19) == 0) - local_node->contype = CONSTR_ATTR_NOT_DEFERRABLE; - else if (length == 13 && strncmp(token, "ATTR_DEFERRED", 13) == 0) - local_node->contype = CONSTR_ATTR_DEFERRED; - else if (length == 14 && strncmp(token, "ATTR_IMMEDIATE", 14) == 0) - local_node->contype = CONSTR_ATTR_IMMEDIATE; - - switch (local_node->contype) - { - case CONSTR_NULL: - case CONSTR_NOTNULL: - /* no extra fields */ - break; - - case CONSTR_DEFAULT: - READ_NODE_FIELD(raw_expr); - READ_STRING_FIELD(cooked_expr); - break; - - case CONSTR_IDENTITY: - READ_NODE_FIELD(options); - READ_CHAR_FIELD(generated_when); - break; - - case CONSTR_GENERATED: - READ_NODE_FIELD(raw_expr); - READ_STRING_FIELD(cooked_expr); - READ_CHAR_FIELD(generated_when); - break; - - case CONSTR_CHECK: - READ_BOOL_FIELD(is_no_inherit); - READ_NODE_FIELD(raw_expr); - READ_STRING_FIELD(cooked_expr); - READ_BOOL_FIELD(skip_validation); - READ_BOOL_FIELD(initially_valid); - break; - - case CONSTR_PRIMARY: - READ_NODE_FIELD(keys); - READ_NODE_FIELD(including); - READ_NODE_FIELD(options); - READ_STRING_FIELD(indexname); - READ_STRING_FIELD(indexspace); - READ_BOOL_FIELD(reset_default_tblspc); - /* access_method and where_clause not currently used */ - break; - - case CONSTR_UNIQUE: - READ_BOOL_FIELD(nulls_not_distinct); - READ_NODE_FIELD(keys); - READ_NODE_FIELD(including); - READ_NODE_FIELD(options); - READ_STRING_FIELD(indexname); - READ_STRING_FIELD(indexspace); - READ_BOOL_FIELD(reset_default_tblspc); - /* access_method and where_clause not currently used */ - break; - - case CONSTR_EXCLUSION: - READ_NODE_FIELD(exclusions); - READ_NODE_FIELD(including); - READ_NODE_FIELD(options); - READ_STRING_FIELD(indexname); - READ_STRING_FIELD(indexspace); - READ_BOOL_FIELD(reset_default_tblspc); - READ_STRING_FIELD(access_method); - READ_NODE_FIELD(where_clause); - break; - - case CONSTR_FOREIGN: - READ_NODE_FIELD(pktable); - READ_NODE_FIELD(fk_attrs); - READ_NODE_FIELD(pk_attrs); - READ_CHAR_FIELD(fk_matchtype); - READ_CHAR_FIELD(fk_upd_action); - READ_CHAR_FIELD(fk_del_action); - READ_NODE_FIELD(fk_del_set_cols); - READ_NODE_FIELD(old_conpfeqop); - READ_OID_FIELD(old_pktable_oid); - READ_BOOL_FIELD(skip_validation); - READ_BOOL_FIELD(initially_valid); - break; - - case CONSTR_ATTR_DEFERRABLE: - case CONSTR_ATTR_NOT_DEFERRABLE: - case CONSTR_ATTR_DEFERRED: - case CONSTR_ATTR_IMMEDIATE: - /* no extra fields */ - break; - - default: - elog(ERROR, "unrecognized ConstrType: %d", (int) local_node->contype); - break; - } - - READ_DONE(); -} - static RangeTblEntry * _readRangeTblEntry(void) { READ_LOCALS(RangeTblEntry); - /* put alias + eref first to make dump more legible */ READ_NODE_FIELD(alias); READ_NODE_FIELD(eref); READ_ENUM_FIELD(rtekind, RTEKind); @@ -493,16 +356,18 @@ _readRangeTblEntry(void) { case RTE_RELATION: READ_OID_FIELD(relid); + READ_BOOL_FIELD(inh); READ_CHAR_FIELD(relkind); READ_INT_FIELD(rellockmode); - READ_NODE_FIELD(tablesample); READ_UINT_FIELD(perminfoindex); + READ_NODE_FIELD(tablesample); break; case RTE_SUBQUERY: READ_NODE_FIELD(subquery); READ_BOOL_FIELD(security_barrier); /* we re-use these RELATION fields, too: */ READ_OID_FIELD(relid); + READ_BOOL_FIELD(inh); READ_CHAR_FIELD(relkind); READ_INT_FIELD(rellockmode); READ_UINT_FIELD(perminfoindex); @@ -564,7 +429,6 @@ _readRangeTblEntry(void) } READ_BOOL_FIELD(lateral); - READ_BOOL_FIELD(inh); READ_BOOL_FIELD(inFromCl); READ_NODE_FIELD(securityQuals); diff --git a/src/backend/nodes/tidbitmap.c b/src/backend/nodes/tidbitmap.c index 29a18584410a5..e8ab5d78fcc7c 100644 --- a/src/backend/nodes/tidbitmap.c +++ b/src/backend/nodes/tidbitmap.c @@ -29,7 +29,7 @@ * and a non-lossy page. * * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/nodes/tidbitmap.c @@ -42,6 +42,7 @@ #include "access/htup_details.h" #include "common/hashfn.h" +#include "common/int.h" #include "nodes/bitmapset.h" #include "nodes/tidbitmap.h" #include "storage/lwlock.h" @@ -129,7 +130,7 @@ typedef enum { TBM_EMPTY, /* no hashtable, nentries == 0 */ TBM_ONE_PAGE, /* entry1 contains the single entry */ - TBM_HASH /* pagetable is valid, entry1 is not */ + TBM_HASH, /* pagetable is valid, entry1 is not */ } TBMStatus; /* @@ -139,7 +140,7 @@ typedef enum { TBM_NOT_ITERATING, /* not yet converted to page and chunk array */ TBM_ITERATING_PRIVATE, /* converted to local page and chunk array */ - TBM_ITERATING_SHARED /* converted to shared page and chunk array */ + TBM_ITERATING_SHARED, /* converted to shared page and chunk array */ } TBMIteratingState; /* @@ -1425,11 +1426,7 @@ tbm_comparator(const void *left, const void *right) BlockNumber l = (*((PagetableEntry *const *) left))->blockno; BlockNumber r = (*((PagetableEntry *const *) right))->blockno; - if (l < r) - return -1; - else if (l > r) - return 1; - return 0; + return pg_cmp_u32(l, r); } /* diff --git a/src/backend/nodes/value.c b/src/backend/nodes/value.c index f11074970ee2a..5a18f4035b57f 100644 --- a/src/backend/nodes/value.c +++ b/src/backend/nodes/value.c @@ -4,7 +4,7 @@ * implementation of value nodes * * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/optimizer/geqo/geqo_copy.c b/src/backend/optimizer/geqo/geqo_copy.c index 4e67e6994f55d..af98e9f0a4179 100644 --- a/src/backend/optimizer/geqo/geqo_copy.c +++ b/src/backend/optimizer/geqo/geqo_copy.c @@ -2,7 +2,7 @@ * * geqo_copy.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/optimizer/geqo/geqo_copy.c diff --git a/src/backend/optimizer/geqo/geqo_cx.c b/src/backend/optimizer/geqo/geqo_cx.c index 34cc53af53e58..12cffb66415a4 100644 --- a/src/backend/optimizer/geqo/geqo_cx.c +++ b/src/backend/optimizer/geqo/geqo_cx.c @@ -35,11 +35,13 @@ #include "postgres.h" -#include "optimizer/geqo_random.h" -#include "optimizer/geqo_recombination.h" +#include "optimizer/geqo.h" #if defined(CX) +#include "optimizer/geqo_random.h" +#include "optimizer/geqo_recombination.h" + /* cx * * cycle crossover diff --git a/src/backend/optimizer/geqo/geqo_erx.c b/src/backend/optimizer/geqo/geqo_erx.c index 21ad7854118bb..af289f7eeb713 100644 --- a/src/backend/optimizer/geqo/geqo_erx.c +++ b/src/backend/optimizer/geqo/geqo_erx.c @@ -32,11 +32,13 @@ #include "postgres.h" -#include "optimizer/geqo_random.h" -#include "optimizer/geqo_recombination.h" +#include "optimizer/geqo.h" #if defined(ERX) +#include "optimizer/geqo_random.h" +#include "optimizer/geqo_recombination.h" + static int gimme_edge(PlannerInfo *root, Gene gene1, Gene gene2, Edge *edge_table); static void remove_gene(PlannerInfo *root, Gene gene, Edge edge, Edge *edge_table); static Gene gimme_gene(PlannerInfo *root, Edge edge, Edge *edge_table); diff --git a/src/backend/optimizer/geqo/geqo_eval.c b/src/backend/optimizer/geqo/geqo_eval.c index a694ac4a1305a..d2f7f4e5f3c0f 100644 --- a/src/backend/optimizer/geqo/geqo_eval.c +++ b/src/backend/optimizer/geqo/geqo_eval.c @@ -3,7 +3,7 @@ * geqo_eval.c * Routines to evaluate query trees * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/optimizer/geqo/geqo_eval.c diff --git a/src/backend/optimizer/geqo/geqo_main.c b/src/backend/optimizer/geqo/geqo_main.c index e67c971b13902..0c5540e2af445 100644 --- a/src/backend/optimizer/geqo/geqo_main.c +++ b/src/backend/optimizer/geqo/geqo_main.c @@ -4,7 +4,7 @@ * solution to the query optimization problem * by means of a Genetic Algorithm (GA) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/optimizer/geqo/geqo_main.c @@ -26,10 +26,15 @@ #include +#include "optimizer/geqo.h" + #include "optimizer/geqo_misc.h" +#if defined(CX) #include "optimizer/geqo_mutation.h" +#endif #include "optimizer/geqo_pool.h" #include "optimizer/geqo_random.h" +#include "optimizer/geqo_recombination.h" #include "optimizer/geqo_selection.h" diff --git a/src/backend/optimizer/geqo/geqo_misc.c b/src/backend/optimizer/geqo/geqo_misc.c index 2ae55b96bcfc6..f9e1ca6fd4515 100644 --- a/src/backend/optimizer/geqo/geqo_misc.c +++ b/src/backend/optimizer/geqo/geqo_misc.c @@ -3,7 +3,7 @@ * geqo_misc.c * misc. printout and debug stuff * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/optimizer/geqo/geqo_misc.c diff --git a/src/backend/optimizer/geqo/geqo_mutation.c b/src/backend/optimizer/geqo/geqo_mutation.c index 2af0295d6945b..56e8445e4ea57 100644 --- a/src/backend/optimizer/geqo/geqo_mutation.c +++ b/src/backend/optimizer/geqo/geqo_mutation.c @@ -32,11 +32,13 @@ /*************************************************************/ #include "postgres.h" -#include "optimizer/geqo_mutation.h" -#include "optimizer/geqo_random.h" +#include "optimizer/geqo.h" #if defined(CX) /* currently used only in CX mode */ +#include "optimizer/geqo_mutation.h" +#include "optimizer/geqo_random.h" + void geqo_mutation(PlannerInfo *root, Gene *tour, int num_gene) { diff --git a/src/backend/optimizer/geqo/geqo_ox1.c b/src/backend/optimizer/geqo/geqo_ox1.c index ede7abb417772..a5487269778fd 100644 --- a/src/backend/optimizer/geqo/geqo_ox1.c +++ b/src/backend/optimizer/geqo/geqo_ox1.c @@ -34,11 +34,13 @@ /*************************************************************/ #include "postgres.h" -#include "optimizer/geqo_random.h" -#include "optimizer/geqo_recombination.h" +#include "optimizer/geqo.h" #if defined(OX1) +#include "optimizer/geqo_random.h" +#include "optimizer/geqo_recombination.h" + /* ox1 * * position crossover diff --git a/src/backend/optimizer/geqo/geqo_ox2.c b/src/backend/optimizer/geqo/geqo_ox2.c index 080dbc076cc0f..6b703576f5ad2 100644 --- a/src/backend/optimizer/geqo/geqo_ox2.c +++ b/src/backend/optimizer/geqo/geqo_ox2.c @@ -34,11 +34,13 @@ /*************************************************************/ #include "postgres.h" -#include "optimizer/geqo_random.h" -#include "optimizer/geqo_recombination.h" +#include "optimizer/geqo.h" #if defined(OX2) +#include "optimizer/geqo_random.h" +#include "optimizer/geqo_recombination.h" + /* ox2 * * position crossover diff --git a/src/backend/optimizer/geqo/geqo_pmx.c b/src/backend/optimizer/geqo/geqo_pmx.c index e44fd0bae5ad9..01d5571192543 100644 --- a/src/backend/optimizer/geqo/geqo_pmx.c +++ b/src/backend/optimizer/geqo/geqo_pmx.c @@ -34,11 +34,13 @@ /*************************************************************/ #include "postgres.h" -#include "optimizer/geqo_random.h" -#include "optimizer/geqo_recombination.h" +#include "optimizer/geqo.h" #if defined(PMX) +#include "optimizer/geqo_random.h" +#include "optimizer/geqo_recombination.h" + /* pmx * * partially matched crossover diff --git a/src/backend/optimizer/geqo/geqo_pool.c b/src/backend/optimizer/geqo/geqo_pool.c index e45bd7286b276..0ec97d5a3f14c 100644 --- a/src/backend/optimizer/geqo/geqo_pool.c +++ b/src/backend/optimizer/geqo/geqo_pool.c @@ -3,7 +3,7 @@ * geqo_pool.c * Genetic Algorithm (GA) pool stuff * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/optimizer/geqo/geqo_pool.c diff --git a/src/backend/optimizer/geqo/geqo_px.c b/src/backend/optimizer/geqo/geqo_px.c index 914296b53d236..662a17c843709 100644 --- a/src/backend/optimizer/geqo/geqo_px.c +++ b/src/backend/optimizer/geqo/geqo_px.c @@ -34,11 +34,13 @@ /*************************************************************/ #include "postgres.h" -#include "optimizer/geqo_random.h" -#include "optimizer/geqo_recombination.h" +#include "optimizer/geqo.h" #if defined(PX) +#include "optimizer/geqo_random.h" +#include "optimizer/geqo_recombination.h" + /* px * * position crossover diff --git a/src/backend/optimizer/geqo/geqo_random.c b/src/backend/optimizer/geqo/geqo_random.c index f9b999d39aec3..510105c7eeeb7 100644 --- a/src/backend/optimizer/geqo/geqo_random.c +++ b/src/backend/optimizer/geqo/geqo_random.c @@ -3,7 +3,7 @@ * geqo_random.c * random number generator * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/optimizer/geqo/geqo_random.c diff --git a/src/backend/optimizer/geqo/geqo_selection.c b/src/backend/optimizer/geqo/geqo_selection.c index 1881ca5ccd1fc..c6d270f1f8535 100644 --- a/src/backend/optimizer/geqo/geqo_selection.c +++ b/src/backend/optimizer/geqo/geqo_selection.c @@ -3,7 +3,7 @@ * geqo_selection.c * linear selection scheme for the genetic query optimizer * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/optimizer/geqo/geqo_selection.c diff --git a/src/backend/optimizer/geqo/meson.build b/src/backend/optimizer/geqo/meson.build index cccd588dd3b78..fdc22d787567e 100644 --- a/src/backend/optimizer/geqo/meson.build +++ b/src/backend/optimizer/geqo/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'geqo_copy.c', diff --git a/src/backend/optimizer/meson.build b/src/backend/optimizer/meson.build index d340ffb68a1d9..ff9e519b128c4 100644 --- a/src/backend/optimizer/meson.build +++ b/src/backend/optimizer/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group subdir('geqo') subdir('path') diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c index 9bdc70c702e19..4895cee994429 100644 --- a/src/backend/optimizer/path/allpaths.c +++ b/src/backend/optimizer/path/allpaths.c @@ -3,7 +3,7 @@ * allpaths.c * Routines to find possible search paths for processing a query * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -35,18 +35,15 @@ #include "optimizer/clauses.h" #include "optimizer/cost.h" #include "optimizer/geqo.h" -#include "optimizer/inherit.h" #include "optimizer/optimizer.h" #include "optimizer/pathnode.h" #include "optimizer/paths.h" #include "optimizer/plancat.h" #include "optimizer/planner.h" -#include "optimizer/restrictinfo.h" #include "optimizer/tlist.h" #include "parser/parse_clause.h" #include "parser/parsetree.h" #include "partitioning/partbounds.h" -#include "partitioning/partprune.h" #include "port/pg_bitutils.h" #include "rewrite/rewriteManip.h" #include "utils/lsyscache.h" @@ -74,7 +71,7 @@ typedef enum pushdown_safe_type { PUSHDOWN_UNSAFE, /* unsafe to push qual into subquery */ PUSHDOWN_SAFE, /* safe to push qual into subquery */ - PUSHDOWN_WINDOWCLAUSE_RUNCOND /* unsafe, but may work as WindowClause + PUSHDOWN_WINDOWCLAUSE_RUNCOND, /* unsafe, but may work as WindowClause * run condition */ } pushdown_safe_type; @@ -563,7 +560,7 @@ set_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, set_cheapest(rel); #ifdef OPTIMIZER_DEBUG - debug_print_rel(root, rel); + pprint(rel); #endif } @@ -1307,6 +1304,8 @@ add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel, { List *subpaths = NIL; bool subpaths_valid = true; + List *startup_subpaths = NIL; + bool startup_subpaths_valid = true; List *partial_subpaths = NIL; List *pa_partial_subpaths = NIL; List *pa_nonpartial_subpaths = NIL; @@ -1346,6 +1345,23 @@ add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel, else subpaths_valid = false; + /* + * When the planner is considering cheap startup plans, we'll also + * collect all the cheapest_startup_paths (if set) and build an + * AppendPath containing those as subpaths. + */ + if (rel->consider_startup && childrel->cheapest_startup_path != NULL) + { + /* cheapest_startup_path must not be a parameterized path. */ + Assert(childrel->cheapest_startup_path->param_info == NULL); + accumulate_append_subpath(childrel->cheapest_startup_path, + &startup_subpaths, + NULL); + } + else + startup_subpaths_valid = false; + + /* Same idea, but for a partial plan. */ if (childrel->partial_pathlist != NIL) { @@ -1478,6 +1494,11 @@ add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel, NIL, NULL, 0, false, -1)); + /* build an AppendPath for the cheap startup paths, if valid */ + if (startup_subpaths_valid) + add_path(rel, (Path *) create_append_path(root, rel, startup_subpaths, + NIL, NIL, NULL, 0, false, -1)); + /* * Consider an append of unordered, unparameterized partial paths. Make * it parallel-aware if possible. @@ -2159,35 +2180,13 @@ set_dummy_rel_pathlist(RelOptInfo *rel) /* * We set the cheapest-path fields immediately, just in case they were - * pointing at some discarded path. This is redundant when we're called - * from set_rel_size(), but not when called from elsewhere, and doing it - * twice is harmless anyway. + * pointing at some discarded path. This is redundant in current usage + * because set_rel_pathlist will do it later, but it's cheap so we keep it + * for safety and consistency with mark_dummy_rel. */ set_cheapest(rel); } -/* quick-and-dirty test to see if any joining is needed */ -static bool -has_multiple_baserels(PlannerInfo *root) -{ - int num_base_rels = 0; - Index rti; - - for (rti = 1; rti < root->simple_rel_array_size; rti++) - { - RelOptInfo *brel = root->simple_rel_array[rti]; - - if (brel == NULL) - continue; - - /* ignore RTEs that are "other rels" */ - if (brel->reloptkind == RELOPT_BASEREL) - if (++num_base_rels > 1) - return true; - } - return false; -} - /* * find_window_run_conditions * Determine if 'wfunc' is really a WindowFunc and call its prosupport @@ -2206,7 +2205,7 @@ has_multiple_baserels(PlannerInfo *root) * the run condition will handle all of the required filtering. * * Returns true if 'opexpr' was found to be useful and was added to the - * WindowClauses runCondition. We also set *keep_original accordingly and add + * WindowFunc's runCondition. We also set *keep_original accordingly and add * 'attno' to *run_cond_attrs offset by FirstLowInvalidHeapAttributeNumber. * If the 'opexpr' cannot be used then we set *keep_original to true and * return false. @@ -2359,7 +2358,7 @@ find_window_run_conditions(Query *subquery, RangeTblEntry *rte, Index rti, *keep_original = true; runopexpr = opexpr; - /* determine the operator to use for the runCondition qual */ + /* determine the operator to use for the WindowFuncRunCondition */ runoperator = get_opfamily_member(opinfo->opfamily_id, opinfo->oplefttype, opinfo->oprighttype, @@ -2370,27 +2369,15 @@ find_window_run_conditions(Query *subquery, RangeTblEntry *rte, Index rti, if (runopexpr != NULL) { - Expr *newexpr; + WindowFuncRunCondition *wfuncrc; - /* - * Build the qual required for the run condition keeping the - * WindowFunc on the same side as it was originally. - */ - if (wfunc_left) - newexpr = make_opclause(runoperator, - runopexpr->opresulttype, - runopexpr->opretset, (Expr *) wfunc, - otherexpr, runopexpr->opcollid, - runopexpr->inputcollid); - else - newexpr = make_opclause(runoperator, - runopexpr->opresulttype, - runopexpr->opretset, - otherexpr, (Expr *) wfunc, - runopexpr->opcollid, - runopexpr->inputcollid); + wfuncrc = makeNode(WindowFuncRunCondition); + wfuncrc->opno = runoperator; + wfuncrc->inputcollid = runopexpr->inputcollid; + wfuncrc->wfunc_left = wfunc_left; + wfuncrc->arg = copyObject(otherexpr); - wclause->runCondition = lappend(wclause->runCondition, newexpr); + wfunc->runCondition = lappend(wfunc->runCondition, wfuncrc); /* record that this attno was used in a run condition */ *run_cond_attrs = bms_add_member(*run_cond_attrs, @@ -2404,9 +2391,9 @@ find_window_run_conditions(Query *subquery, RangeTblEntry *rte, Index rti, /* * check_and_push_window_quals - * Check if 'clause' is a qual that can be pushed into a WindowFunc's - * WindowClause as a 'runCondition' qual. These, when present, allow - * some unnecessary work to be skipped during execution. + * Check if 'clause' is a qual that can be pushed into a WindowFunc + * as a 'runCondition' qual. These, when present, allow some unnecessary + * work to be skipped during execution. * * 'run_cond_attrs' will be populated with all targetlist resnos of subquery * targets (offset by FirstLowInvalidHeapAttributeNumber) that we pushed @@ -2637,7 +2624,7 @@ set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel, root->hasHavingQual || parse->distinctClause || parse->sortClause || - has_multiple_baserels(root)) + bms_membership(root->all_baserels) == BMS_MULTIPLE) tuple_fraction = 0.0; /* default case */ else tuple_fraction = root->tuple_fraction; @@ -2646,9 +2633,8 @@ set_subquery_pathlist(PlannerInfo *root, RelOptInfo *rel, Assert(root->plan_params == NIL); /* Generate a subroot and Paths for the subquery */ - rel->subroot = subquery_planner(root->glob, subquery, - root, - false, tuple_fraction); + rel->subroot = subquery_planner(root->glob, subquery, root, false, + tuple_fraction, NULL); /* Isolate the params needed by this specific subplan */ rel->subplan_params = root->plan_params; @@ -2873,16 +2859,19 @@ set_tablefunc_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte) static void set_cte_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte) { + Path *ctepath; Plan *cteplan; PlannerInfo *cteroot; Index levelsup; + List *pathkeys; int ndx; ListCell *lc; int plan_id; Relids required_outer; /* - * Find the referenced CTE, and locate the plan previously made for it. + * Find the referenced CTE, and locate the path and plan previously made + * for it. */ levelsup = rte->ctelevelsup; cteroot = root; @@ -2914,11 +2903,20 @@ set_cte_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte) plan_id = list_nth_int(cteroot->cte_plan_ids, ndx); if (plan_id <= 0) elog(ERROR, "no plan was made for CTE \"%s\"", rte->ctename); + + Assert(list_length(root->glob->subpaths) == list_length(root->glob->subplans)); + ctepath = (Path *) list_nth(root->glob->subpaths, plan_id - 1); cteplan = (Plan *) list_nth(root->glob->subplans, plan_id - 1); /* Mark rel with estimated output rows, width, etc */ set_cte_size_estimates(root, rel, cteplan->plan_rows); + /* Convert the ctepath's pathkeys to outer query's representation */ + pathkeys = convert_subquery_pathkeys(root, + rel, + ctepath->pathkeys, + cteplan->targetlist); + /* * We don't support pushing join clauses into the quals of a CTE scan, but * it could still have required parameterization due to LATERAL refs in @@ -2927,7 +2925,7 @@ set_cte_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte) required_outer = rel->lateral_relids; /* Generate appropriate path */ - add_path(rel, create_ctescan_path(root, rel, required_outer)); + add_path(rel, create_ctescan_path(root, rel, pathkeys, required_outer)); } /* @@ -2955,9 +2953,6 @@ set_namedtuplestore_pathlist(PlannerInfo *root, RelOptInfo *rel, /* Generate appropriate path */ add_path(rel, create_namedtuplestorescan_path(root, rel, required_outer)); - - /* Select cheapest path (pretty easy in this case...) */ - set_cheapest(rel); } /* @@ -2985,9 +2980,6 @@ set_result_pathlist(PlannerInfo *root, RelOptInfo *rel, /* Generate appropriate path */ add_path(rel, create_resultscan_path(root, rel, required_outer)); - - /* Select cheapest path (pretty easy in this case...) */ - set_cheapest(rel); } /* @@ -3051,10 +3043,10 @@ set_worktable_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte) * * If we're generating paths for a scan or join relation, override_rows will * be false, and we'll just use the relation's size estimate. When we're - * being called for a partially-grouped path, though, we need to override - * the rowcount estimate. (It's not clear that the particular value we're - * using here is actually best, but the underlying rel has no estimate so - * we must do something.) + * being called for a partially-grouped or partially-distinct path, though, we + * need to override the rowcount estimate. (It's not clear that the + * particular value we're using here is actually best, but the underlying rel + * has no estimate so we must do something.) */ void generate_gather_paths(PlannerInfo *root, RelOptInfo *rel, bool override_rows) @@ -3473,7 +3465,8 @@ standard_join_search(PlannerInfo *root, int levels_needed, List *initial_rels) /* * Except for the topmost scan/join rel, consider gathering * partial paths. We'll do the same for the topmost scan/join rel - * once we know the final targetlist (see grouping_planner). + * once we know the final targetlist (see grouping_planner's and + * its call to apply_scanjoin_target_to_paths). */ if (!bms_equal(rel->relids, root->all_query_rels)) generate_useful_gather_paths(root, rel, false); @@ -3482,7 +3475,7 @@ standard_join_search(PlannerInfo *root, int levels_needed, List *initial_rels) set_cheapest(rel); #ifdef OPTIMIZER_DEBUG - debug_print_rel(root, rel); + pprint(rel); #endif } } @@ -4350,7 +4343,7 @@ generate_partitionwise_join_paths(PlannerInfo *root, RelOptInfo *rel) continue; #ifdef OPTIMIZER_DEBUG - debug_print_rel(root, child_rel); + pprint(child_rel); #endif live_children = lappend(live_children, child_rel); @@ -4367,322 +4360,3 @@ generate_partitionwise_join_paths(PlannerInfo *root, RelOptInfo *rel) add_paths_to_append_rel(root, rel, live_children); list_free(live_children); } - - -/***************************************************************************** - * DEBUG SUPPORT - *****************************************************************************/ - -#ifdef OPTIMIZER_DEBUG - -static void -print_relids(PlannerInfo *root, Relids relids) -{ - int x; - bool first = true; - - x = -1; - while ((x = bms_next_member(relids, x)) >= 0) - { - if (!first) - printf(" "); - if (x < root->simple_rel_array_size && - root->simple_rte_array[x]) - printf("%s", root->simple_rte_array[x]->eref->aliasname); - else - printf("%d", x); - first = false; - } -} - -static void -print_restrictclauses(PlannerInfo *root, List *clauses) -{ - ListCell *l; - - foreach(l, clauses) - { - RestrictInfo *c = lfirst(l); - - print_expr((Node *) c->clause, root->parse->rtable); - if (lnext(clauses, l)) - printf(", "); - } -} - -static void -print_path(PlannerInfo *root, Path *path, int indent) -{ - const char *ptype; - bool join = false; - Path *subpath = NULL; - int i; - - switch (nodeTag(path)) - { - case T_Path: - switch (path->pathtype) - { - case T_SeqScan: - ptype = "SeqScan"; - break; - case T_SampleScan: - ptype = "SampleScan"; - break; - case T_FunctionScan: - ptype = "FunctionScan"; - break; - case T_TableFuncScan: - ptype = "TableFuncScan"; - break; - case T_ValuesScan: - ptype = "ValuesScan"; - break; - case T_CteScan: - ptype = "CteScan"; - break; - case T_NamedTuplestoreScan: - ptype = "NamedTuplestoreScan"; - break; - case T_Result: - ptype = "Result"; - break; - case T_WorkTableScan: - ptype = "WorkTableScan"; - break; - default: - ptype = "???Path"; - break; - } - break; - case T_IndexPath: - ptype = "IdxScan"; - break; - case T_BitmapHeapPath: - ptype = "BitmapHeapScan"; - break; - case T_BitmapAndPath: - ptype = "BitmapAndPath"; - break; - case T_BitmapOrPath: - ptype = "BitmapOrPath"; - break; - case T_TidPath: - ptype = "TidScan"; - break; - case T_SubqueryScanPath: - ptype = "SubqueryScan"; - break; - case T_ForeignPath: - ptype = "ForeignScan"; - break; - case T_CustomPath: - ptype = "CustomScan"; - break; - case T_NestPath: - ptype = "NestLoop"; - join = true; - break; - case T_MergePath: - ptype = "MergeJoin"; - join = true; - break; - case T_HashPath: - ptype = "HashJoin"; - join = true; - break; - case T_AppendPath: - ptype = "Append"; - break; - case T_MergeAppendPath: - ptype = "MergeAppend"; - break; - case T_GroupResultPath: - ptype = "GroupResult"; - break; - case T_MaterialPath: - ptype = "Material"; - subpath = ((MaterialPath *) path)->subpath; - break; - case T_MemoizePath: - ptype = "Memoize"; - subpath = ((MemoizePath *) path)->subpath; - break; - case T_UniquePath: - ptype = "Unique"; - subpath = ((UniquePath *) path)->subpath; - break; - case T_GatherPath: - ptype = "Gather"; - subpath = ((GatherPath *) path)->subpath; - break; - case T_GatherMergePath: - ptype = "GatherMerge"; - subpath = ((GatherMergePath *) path)->subpath; - break; - case T_ProjectionPath: - ptype = "Projection"; - subpath = ((ProjectionPath *) path)->subpath; - break; - case T_ProjectSetPath: - ptype = "ProjectSet"; - subpath = ((ProjectSetPath *) path)->subpath; - break; - case T_SortPath: - ptype = "Sort"; - subpath = ((SortPath *) path)->subpath; - break; - case T_IncrementalSortPath: - ptype = "IncrementalSort"; - subpath = ((SortPath *) path)->subpath; - break; - case T_GroupPath: - ptype = "Group"; - subpath = ((GroupPath *) path)->subpath; - break; - case T_UpperUniquePath: - ptype = "UpperUnique"; - subpath = ((UpperUniquePath *) path)->subpath; - break; - case T_AggPath: - ptype = "Agg"; - subpath = ((AggPath *) path)->subpath; - break; - case T_GroupingSetsPath: - ptype = "GroupingSets"; - subpath = ((GroupingSetsPath *) path)->subpath; - break; - case T_MinMaxAggPath: - ptype = "MinMaxAgg"; - break; - case T_WindowAggPath: - ptype = "WindowAgg"; - subpath = ((WindowAggPath *) path)->subpath; - break; - case T_SetOpPath: - ptype = "SetOp"; - subpath = ((SetOpPath *) path)->subpath; - break; - case T_RecursiveUnionPath: - ptype = "RecursiveUnion"; - break; - case T_LockRowsPath: - ptype = "LockRows"; - subpath = ((LockRowsPath *) path)->subpath; - break; - case T_ModifyTablePath: - ptype = "ModifyTable"; - break; - case T_LimitPath: - ptype = "Limit"; - subpath = ((LimitPath *) path)->subpath; - break; - default: - ptype = "???Path"; - break; - } - - for (i = 0; i < indent; i++) - printf("\t"); - printf("%s", ptype); - - if (path->parent) - { - printf("("); - print_relids(root, path->parent->relids); - printf(")"); - } - if (path->param_info) - { - printf(" required_outer ("); - print_relids(root, path->param_info->ppi_req_outer); - printf(")"); - } - printf(" rows=%.0f cost=%.2f..%.2f\n", - path->rows, path->startup_cost, path->total_cost); - - if (path->pathkeys) - { - for (i = 0; i < indent; i++) - printf("\t"); - printf(" pathkeys: "); - print_pathkeys(path->pathkeys, root->parse->rtable); - } - - if (join) - { - JoinPath *jp = (JoinPath *) path; - - for (i = 0; i < indent; i++) - printf("\t"); - printf(" clauses: "); - print_restrictclauses(root, jp->joinrestrictinfo); - printf("\n"); - - if (IsA(path, MergePath)) - { - MergePath *mp = (MergePath *) path; - - for (i = 0; i < indent; i++) - printf("\t"); - printf(" sortouter=%d sortinner=%d materializeinner=%d\n", - ((mp->outersortkeys) ? 1 : 0), - ((mp->innersortkeys) ? 1 : 0), - ((mp->materialize_inner) ? 1 : 0)); - } - - print_path(root, jp->outerjoinpath, indent + 1); - print_path(root, jp->innerjoinpath, indent + 1); - } - - if (subpath) - print_path(root, subpath, indent + 1); -} - -void -debug_print_rel(PlannerInfo *root, RelOptInfo *rel) -{ - ListCell *l; - - printf("RELOPTINFO ("); - print_relids(root, rel->relids); - printf("): rows=%.0f width=%d\n", rel->rows, rel->reltarget->width); - - if (rel->baserestrictinfo) - { - printf("\tbaserestrictinfo: "); - print_restrictclauses(root, rel->baserestrictinfo); - printf("\n"); - } - - if (rel->joininfo) - { - printf("\tjoininfo: "); - print_restrictclauses(root, rel->joininfo); - printf("\n"); - } - - printf("\tpath list:\n"); - foreach(l, rel->pathlist) - print_path(root, lfirst(l), 1); - if (rel->cheapest_parameterized_paths) - { - printf("\n\tcheapest parameterized paths:\n"); - foreach(l, rel->cheapest_parameterized_paths) - print_path(root, lfirst(l), 1); - } - if (rel->cheapest_startup_path) - { - printf("\n\tcheapest startup path:\n"); - print_path(root, rel->cheapest_startup_path, 1); - } - if (rel->cheapest_total_path) - { - printf("\n\tcheapest total path:\n"); - print_path(root, rel->cheapest_total_path, 1); - } - printf("\n"); - fflush(stdout); -} - -#endif /* OPTIMIZER_DEBUG */ diff --git a/src/backend/optimizer/path/clausesel.c b/src/backend/optimizer/path/clausesel.c index 435438a17358e..0ab021c1e89aa 100644 --- a/src/backend/optimizer/path/clausesel.c +++ b/src/backend/optimizer/path/clausesel.c @@ -3,7 +3,7 @@ * clausesel.c * Routines to compute clause selectivities * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -14,10 +14,8 @@ */ #include "postgres.h" -#include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "optimizer/clauses.h" -#include "optimizer/cost.h" #include "optimizer/optimizer.h" #include "optimizer/pathnode.h" #include "optimizer/plancat.h" diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index ef475d95a18c8..52ebdd90fcbc9 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -60,7 +60,7 @@ * values. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -91,7 +91,6 @@ #include "optimizer/paths.h" #include "optimizer/placeholder.h" #include "optimizer/plancat.h" -#include "optimizer/planmain.h" #include "optimizer/restrictinfo.h" #include "parser/parsetree.h" #include "utils/lsyscache.h" @@ -218,6 +217,35 @@ clamp_row_est(double nrows) return nrows; } +/* + * clamp_width_est + * Force a tuple-width estimate to a sane value. + * + * The planner represents datatype width and tuple width estimates as int32. + * When summing column width estimates to create a tuple width estimate, + * it's possible to reach integer overflow in edge cases. To ensure sane + * behavior, we form such sums in int64 arithmetic and then apply this routine + * to clamp to int32 range. + */ +int32 +clamp_width_est(int64 tuple_width) +{ + /* + * Anything more than MaxAllocSize is clearly bogus, since we could not + * create a tuple that large. + */ + if (tuple_width > MaxAllocSize) + return (int32) MaxAllocSize; + + /* + * Unlike clamp_row_est, we just Assert that the value isn't negative, + * rather than masking such errors. + */ + Assert(tuple_width >= 0); + + return (int32) tuple_width; +} + /* * clamp_cardinality_to_long * Cast a Cardinality value to a sane long value. @@ -1227,7 +1255,7 @@ cost_tidscan(Path *path, PlannerInfo *root, QualCost qpqual_cost; Cost cpu_per_tuple; QualCost tid_qual_cost; - int ntuples; + double ntuples; ListCell *l; double spc_random_page_cost; @@ -1254,7 +1282,7 @@ cost_tidscan(Path *path, PlannerInfo *root, ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) qual; Node *arraynode = (Node *) lsecond(saop->args); - ntuples += estimate_array_length(arraynode); + ntuples += estimate_array_length(root, arraynode); } else if (IsA(qual, CurrentOfExpr)) { @@ -2809,6 +2837,226 @@ cost_agg(Path *path, PlannerInfo *root, path->total_cost = total_cost; } +/* + * get_windowclause_startup_tuples + * Estimate how many tuples we'll need to fetch from a WindowAgg's + * subnode before we can output the first WindowAgg tuple. + * + * How many tuples need to be read depends on the WindowClause. For example, + * a WindowClause with no PARTITION BY and no ORDER BY requires that all + * subnode tuples are read and aggregated before the WindowAgg can output + * anything. If there's a PARTITION BY, then we only need to look at tuples + * in the first partition. Here we attempt to estimate just how many + * 'input_tuples' the WindowAgg will need to read for the given WindowClause + * before the first tuple can be output. + */ +static double +get_windowclause_startup_tuples(PlannerInfo *root, WindowClause *wc, + double input_tuples) +{ + int frameOptions = wc->frameOptions; + double partition_tuples; + double return_tuples; + double peer_tuples; + + /* + * First, figure out how many partitions there are likely to be and set + * partition_tuples according to that estimate. + */ + if (wc->partitionClause != NIL) + { + double num_partitions; + List *partexprs = get_sortgrouplist_exprs(wc->partitionClause, + root->parse->targetList); + + num_partitions = estimate_num_groups(root, partexprs, input_tuples, + NULL, NULL); + list_free(partexprs); + + partition_tuples = input_tuples / num_partitions; + } + else + { + /* all tuples belong to the same partition */ + partition_tuples = input_tuples; + } + + /* estimate the number of tuples in each peer group */ + if (wc->orderClause != NIL) + { + double num_groups; + List *orderexprs; + + orderexprs = get_sortgrouplist_exprs(wc->orderClause, + root->parse->targetList); + + /* estimate out how many peer groups there are in the partition */ + num_groups = estimate_num_groups(root, orderexprs, + partition_tuples, NULL, + NULL); + list_free(orderexprs); + peer_tuples = partition_tuples / num_groups; + } + else + { + /* no ORDER BY so only 1 tuple belongs in each peer group */ + peer_tuples = 1.0; + } + + if (frameOptions & FRAMEOPTION_END_UNBOUNDED_FOLLOWING) + { + /* include all partition rows */ + return_tuples = partition_tuples; + } + else if (frameOptions & FRAMEOPTION_END_CURRENT_ROW) + { + if (frameOptions & FRAMEOPTION_ROWS) + { + /* just count the current row */ + return_tuples = 1.0; + } + else if (frameOptions & (FRAMEOPTION_RANGE | FRAMEOPTION_GROUPS)) + { + /* + * When in RANGE/GROUPS mode, it's more complex. If there's no + * ORDER BY, then all rows in the partition are peers, otherwise + * we'll need to read the first group of peers. + */ + if (wc->orderClause == NIL) + return_tuples = partition_tuples; + else + return_tuples = peer_tuples; + } + else + { + /* + * Something new we don't support yet? This needs attention. + * We'll just return 1.0 in the meantime. + */ + Assert(false); + return_tuples = 1.0; + } + } + else if (frameOptions & FRAMEOPTION_END_OFFSET_PRECEDING) + { + /* + * BETWEEN ... AND N PRECEDING will only need to read the WindowAgg's + * subnode after N ROWS/RANGES/GROUPS. N can be 0, but not negative, + * so we'll just assume only the current row needs to be read to fetch + * the first WindowAgg row. + */ + return_tuples = 1.0; + } + else if (frameOptions & FRAMEOPTION_END_OFFSET_FOLLOWING) + { + Const *endOffset = (Const *) wc->endOffset; + double end_offset_value; + + /* try and figure out the value specified in the endOffset. */ + if (IsA(endOffset, Const)) + { + if (endOffset->constisnull) + { + /* + * NULLs are not allowed, but currently, there's no code to + * error out if there's a NULL Const. We'll only discover + * this during execution. For now, just pretend everything is + * fine and assume that just the first row/range/group will be + * needed. + */ + end_offset_value = 1.0; + } + else + { + switch (endOffset->consttype) + { + case INT2OID: + end_offset_value = + (double) DatumGetInt16(endOffset->constvalue); + break; + case INT4OID: + end_offset_value = + (double) DatumGetInt32(endOffset->constvalue); + break; + case INT8OID: + end_offset_value = + (double) DatumGetInt64(endOffset->constvalue); + break; + default: + end_offset_value = + partition_tuples / peer_tuples * + DEFAULT_INEQ_SEL; + break; + } + } + } + else + { + /* + * When the end bound is not a Const, we'll just need to guess. We + * just make use of DEFAULT_INEQ_SEL. + */ + end_offset_value = + partition_tuples / peer_tuples * DEFAULT_INEQ_SEL; + } + + if (frameOptions & FRAMEOPTION_ROWS) + { + /* include the N FOLLOWING and the current row */ + return_tuples = end_offset_value + 1.0; + } + else if (frameOptions & (FRAMEOPTION_RANGE | FRAMEOPTION_GROUPS)) + { + /* include N FOLLOWING ranges/group and the initial range/group */ + return_tuples = peer_tuples * (end_offset_value + 1.0); + } + else + { + /* + * Something new we don't support yet? This needs attention. + * We'll just return 1.0 in the meantime. + */ + Assert(false); + return_tuples = 1.0; + } + } + else + { + /* + * Something new we don't support yet? This needs attention. We'll + * just return 1.0 in the meantime. + */ + Assert(false); + return_tuples = 1.0; + } + + if (wc->partitionClause != NIL || wc->orderClause != NIL) + { + /* + * Cap the return value to the estimated partition tuples and account + * for the extra tuple WindowAgg will need to read to confirm the next + * tuple does not belong to the same partition or peer group. + */ + return_tuples = Min(return_tuples + 1.0, partition_tuples); + } + else + { + /* + * Cap the return value so it's never higher than the expected tuples + * in the partition. + */ + return_tuples = Min(return_tuples, partition_tuples); + } + + /* + * We needn't worry about any EXCLUDE options as those only exclude rows + * from being aggregated, not from being read from the WindowAgg's + * subnode. + */ + + return clamp_row_est(return_tuples); +} + /* * cost_windowagg * Determines and returns the cost of performing a WindowAgg plan node, @@ -2818,14 +3066,20 @@ cost_agg(Path *path, PlannerInfo *root, */ void cost_windowagg(Path *path, PlannerInfo *root, - List *windowFuncs, int numPartCols, int numOrderCols, + List *windowFuncs, WindowClause *winclause, Cost input_startup_cost, Cost input_total_cost, double input_tuples) { Cost startup_cost; Cost total_cost; + double startup_tuples; + int numPartCols; + int numOrderCols; ListCell *lc; + numPartCols = list_length(winclause->partitionClause); + numOrderCols = list_length(winclause->orderClause); + startup_cost = input_startup_cost; total_cost = input_total_cost; @@ -2880,6 +3134,21 @@ cost_windowagg(Path *path, PlannerInfo *root, path->rows = input_tuples; path->startup_cost = startup_cost; path->total_cost = total_cost; + + /* + * Also, take into account how many tuples we need to read from the + * subnode in order to produce the first tuple from the WindowAgg. To do + * this we proportion the run cost (total cost not including startup cost) + * over the estimated startup tuples. We already included the startup + * cost of the subnode, so we only need to do this when the estimated + * startup tuples is above 1.0. + */ + startup_tuples = get_windowclause_startup_tuples(root, winclause, + input_tuples); + + if (startup_tuples > 1.0) + path->startup_cost += (total_cost - startup_cost) / input_tuples * + (startup_tuples - 1.0); } /* @@ -4366,6 +4635,9 @@ cost_rescan(PlannerInfo *root, Path *path, * preferred since it allows caching of the results.) * The result includes both a one-time (startup) component, * and a per-evaluation component. + * + * Note: in some code paths root can be passed as NULL, resulting in + * slightly worse estimates. */ void cost_qual_eval(QualCost *cost, List *quals, PlannerInfo *root) @@ -4500,7 +4772,7 @@ cost_qual_eval_walker(Node *node, cost_qual_eval_context *context) Node *arraynode = (Node *) lsecond(saop->args); QualCost sacosts; QualCost hcosts; - int estarraylen = estimate_array_length(arraynode); + double estarraylen = estimate_array_length(context->root, arraynode); set_sa_opfuncid(saop); sacosts.startup = sacosts.per_tuple = 0; @@ -4538,7 +4810,7 @@ cost_qual_eval_walker(Node *node, cost_qual_eval_context *context) */ context->total.startup += sacosts.startup; context->total.per_tuple += sacosts.per_tuple * - estimate_array_length(arraynode) * 0.5; + estimate_array_length(context->root, arraynode) * 0.5; } } else if (IsA(node, Aggref) || @@ -4589,7 +4861,7 @@ cost_qual_eval_walker(Node *node, cost_qual_eval_context *context) context->total.startup += perelemcost.startup; if (perelemcost.per_tuple > 0) context->total.per_tuple += perelemcost.per_tuple * - estimate_array_length((Node *) acoerce->arg); + estimate_array_length(context->root, (Node *) acoerce->arg); } else if (IsA(node, RowCompareExpr)) { @@ -4609,7 +4881,8 @@ cost_qual_eval_walker(Node *node, cost_qual_eval_context *context) IsA(node, SQLValueFunction) || IsA(node, XmlExpr) || IsA(node, CoerceToDomain) || - IsA(node, NextValueExpr)) + IsA(node, NextValueExpr) || + IsA(node, JsonExpr)) { /* Treat all these as having cost 1 */ context->total.per_tuple += cpu_operator_cost; @@ -4780,23 +5053,7 @@ compute_semi_anti_join_factors(PlannerInfo *root, /* * Also get the normal inner-join selectivity of the join clauses. */ - norm_sjinfo.type = T_SpecialJoinInfo; - norm_sjinfo.min_lefthand = outerrel->relids; - norm_sjinfo.min_righthand = innerrel->relids; - norm_sjinfo.syn_lefthand = outerrel->relids; - norm_sjinfo.syn_righthand = innerrel->relids; - norm_sjinfo.jointype = JOIN_INNER; - norm_sjinfo.ojrelid = 0; - norm_sjinfo.commute_above_l = NULL; - norm_sjinfo.commute_above_r = NULL; - norm_sjinfo.commute_below_l = NULL; - norm_sjinfo.commute_below_r = NULL; - /* we don't bother trying to make the remaining fields valid */ - norm_sjinfo.lhs_strict = false; - norm_sjinfo.semi_can_btree = false; - norm_sjinfo.semi_can_hash = false; - norm_sjinfo.semi_operators = NIL; - norm_sjinfo.semi_rhs_exprs = NIL; + init_dummy_sjinfo(&norm_sjinfo, outerrel->relids, innerrel->relids); nselec = clauselist_selectivity(root, joinquals, @@ -4949,23 +5206,8 @@ approx_tuple_count(PlannerInfo *root, JoinPath *path, List *quals) /* * Make up a SpecialJoinInfo for JOIN_INNER semantics. */ - sjinfo.type = T_SpecialJoinInfo; - sjinfo.min_lefthand = path->outerjoinpath->parent->relids; - sjinfo.min_righthand = path->innerjoinpath->parent->relids; - sjinfo.syn_lefthand = path->outerjoinpath->parent->relids; - sjinfo.syn_righthand = path->innerjoinpath->parent->relids; - sjinfo.jointype = JOIN_INNER; - sjinfo.ojrelid = 0; - sjinfo.commute_above_l = NULL; - sjinfo.commute_above_r = NULL; - sjinfo.commute_below_l = NULL; - sjinfo.commute_below_r = NULL; - /* we don't bother trying to make the remaining fields valid */ - sjinfo.lhs_strict = false; - sjinfo.semi_can_btree = false; - sjinfo.semi_can_hash = false; - sjinfo.semi_operators = NIL; - sjinfo.semi_rhs_exprs = NIL; + init_dummy_sjinfo(&sjinfo, path->outerjoinpath->parent->relids, + path->innerjoinpath->parent->relids); /* Get the approximate selectivity */ foreach(l, quals) @@ -5860,7 +6102,7 @@ static void set_rel_width(PlannerInfo *root, RelOptInfo *rel) { Oid reloid = planner_rt_fetch(rel->relid, root)->relid; - int32 tuple_width = 0; + int64 tuple_width = 0; bool have_wholerow_var = false; ListCell *lc; @@ -5972,7 +6214,7 @@ set_rel_width(PlannerInfo *root, RelOptInfo *rel) */ if (have_wholerow_var) { - int32 wholerow_width = MAXALIGN(SizeofHeapTupleHeader); + int64 wholerow_width = MAXALIGN(SizeofHeapTupleHeader); if (reloid != InvalidOid) { @@ -5989,7 +6231,7 @@ set_rel_width(PlannerInfo *root, RelOptInfo *rel) wholerow_width += rel->attr_widths[i - rel->min_attr]; } - rel->attr_widths[0 - rel->min_attr] = wholerow_width; + rel->attr_widths[0 - rel->min_attr] = clamp_width_est(wholerow_width); /* * Include the whole-row Var as part of the output tuple. Yes, that @@ -5998,8 +6240,7 @@ set_rel_width(PlannerInfo *root, RelOptInfo *rel) tuple_width += wholerow_width; } - Assert(tuple_width >= 0); - rel->reltarget->width = tuple_width; + rel->reltarget->width = clamp_width_est(tuple_width); } /* @@ -6017,7 +6258,7 @@ set_rel_width(PlannerInfo *root, RelOptInfo *rel) PathTarget * set_pathtarget_cost_width(PlannerInfo *root, PathTarget *target) { - int32 tuple_width = 0; + int64 tuple_width = 0; ListCell *lc; /* Vars are assumed to have cost zero, but other exprs do not */ @@ -6041,8 +6282,7 @@ set_pathtarget_cost_width(PlannerInfo *root, PathTarget *target) } } - Assert(tuple_width >= 0); - target->width = tuple_width; + target->width = clamp_width_est(tuple_width); return target; } @@ -6152,12 +6392,20 @@ get_parallel_divisor(Path *path) /* * compute_bitmap_pages + * Estimate number of pages fetched from heap in a bitmap heap scan. + * + * 'baserel' is the relation to be scanned + * 'bitmapqual' is a tree of IndexPaths, BitmapAndPaths, and BitmapOrPaths + * 'loop_count' is the number of repetitions of the indexscan to factor into + * estimates of caching behavior * - * compute number of pages fetched from heap in bitmap heap scan. + * If cost_p isn't NULL, the indexTotalCost estimate is returned in *cost_p. + * If tuples_p isn't NULL, the tuples_fetched estimate is returned in *tuples_p. */ double -compute_bitmap_pages(PlannerInfo *root, RelOptInfo *baserel, Path *bitmapqual, - int loop_count, Cost *cost, double *tuple) +compute_bitmap_pages(PlannerInfo *root, RelOptInfo *baserel, + Path *bitmapqual, double loop_count, + Cost *cost_p, double *tuples_p) { Cost indexTotalCost; Selectivity indexSelectivity; @@ -6247,10 +6495,10 @@ compute_bitmap_pages(PlannerInfo *root, RelOptInfo *baserel, Path *bitmapqual, (lossy_pages / heap_pages) * baserel->tuples); } - if (cost) - *cost = indexTotalCost; - if (tuple) - *tuple = tuples_fetched; + if (cost_p) + *cost_p = indexTotalCost; + if (tuples_p) + *tuples_p = tuples_fetched; return pages_fetched; } diff --git a/src/backend/optimizer/path/equivclass.c b/src/backend/optimizer/path/equivclass.c index 7fa502d6e25d5..503eb0f3c9455 100644 --- a/src/backend/optimizer/path/equivclass.c +++ b/src/backend/optimizer/path/equivclass.c @@ -6,7 +6,7 @@ * See src/backend/optimizer/README for discussion of EquivalenceClasses. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -38,7 +38,6 @@ static EquivalenceMember *add_eq_member(EquivalenceClass *ec, JoinDomain *jdomain, EquivalenceMember *parent, Oid datatype); -static bool is_exprlist_member(Expr *node, List *exprs); static void generate_base_implied_equalities_const(PlannerInfo *root, EquivalenceClass *ec); static void generate_base_implied_equalities_no_const(PlannerInfo *root, @@ -806,9 +805,18 @@ find_ec_member_matching_expr(EquivalenceClass *ec, * expressions appearing in "exprs"; return NULL if no match. * * "exprs" can be either a list of bare expression trees, or a list of - * TargetEntry nodes. Either way, it should contain Vars and possibly - * Aggrefs and WindowFuncs, which are matched to the corresponding elements - * of the EquivalenceClass's expressions. + * TargetEntry nodes. Typically it will contain Vars and possibly Aggrefs + * and WindowFuncs; however, when considering an appendrel member the list + * could contain arbitrary expressions. We consider an EC member to be + * computable if all the Vars, PlaceHolderVars, Aggrefs, and WindowFuncs + * it needs are present in "exprs". + * + * There is some subtlety in that definition: for example, if an EC member is + * Var_A + 1 while what is in "exprs" is Var_A + 2, it's still computable. + * This works because in the final plan tree, the EC member's expression will + * be computed as part of the same plan node targetlist that is currently + * represented by "exprs". So if we have Var_A available for the existing + * tlist member, it must be OK to use it in the EC expression too. * * Unlike find_ec_member_matching_expr, there's no special provision here * for binary-compatible relabeling. This is intentional: if we have to @@ -828,12 +836,24 @@ find_computable_ec_member(PlannerInfo *root, Relids relids, bool require_parallel_safe) { + List *exprvars; ListCell *lc; + /* + * Pull out the Vars and quasi-Vars present in "exprs". In the typical + * non-appendrel case, this is just another representation of the same + * list. However, it does remove the distinction between the case of a + * list of plain expressions and a list of TargetEntrys. + */ + exprvars = pull_var_clause((Node *) exprs, + PVC_INCLUDE_AGGREGATES | + PVC_INCLUDE_WINDOWFUNCS | + PVC_INCLUDE_PLACEHOLDERS); + foreach(lc, ec->ec_members) { EquivalenceMember *em = (EquivalenceMember *) lfirst(lc); - List *exprvars; + List *emvars; ListCell *lc2; /* @@ -851,18 +871,18 @@ find_computable_ec_member(PlannerInfo *root, continue; /* - * Match if all Vars and quasi-Vars are available in "exprs". + * Match if all Vars and quasi-Vars are present in "exprs". */ - exprvars = pull_var_clause((Node *) em->em_expr, - PVC_INCLUDE_AGGREGATES | - PVC_INCLUDE_WINDOWFUNCS | - PVC_INCLUDE_PLACEHOLDERS); - foreach(lc2, exprvars) + emvars = pull_var_clause((Node *) em->em_expr, + PVC_INCLUDE_AGGREGATES | + PVC_INCLUDE_WINDOWFUNCS | + PVC_INCLUDE_PLACEHOLDERS); + foreach(lc2, emvars) { - if (!is_exprlist_member(lfirst(lc2), exprs)) + if (!list_member(exprvars, lfirst(lc2))) break; } - list_free(exprvars); + list_free(emvars); if (lc2) continue; /* we hit a non-available Var */ @@ -880,31 +900,6 @@ find_computable_ec_member(PlannerInfo *root, return NULL; } -/* - * is_exprlist_member - * Subroutine for find_computable_ec_member: is "node" in "exprs"? - * - * Per the requirements of that function, "exprs" might or might not have - * TargetEntry superstructure. - */ -static bool -is_exprlist_member(Expr *node, List *exprs) -{ - ListCell *lc; - - foreach(lc, exprs) - { - Expr *expr = (Expr *) lfirst(lc); - - if (expr && IsA(expr, TargetEntry)) - expr = ((TargetEntry *) expr)->expr; - - if (equal(node, expr)) - return true; - } - return false; -} - /* * relation_can_be_sorted_early * Can this relation be sorted on this EC before the final output step? @@ -1885,6 +1880,21 @@ create_join_clause(PlannerInfo *root, rightem->em_relids), ec->ec_min_security); + /* + * If either EM is a child, force the clause's clause_relids to include + * the relid(s) of the child rel. In normal cases it would already, but + * not if we are considering appendrel child relations with pseudoconstant + * translated variables (i.e., UNION ALL sub-selects with constant output + * items). We must do this so that join_clause_is_movable_into() will + * think that the clause should be evaluated at the correct place. + */ + if (leftem->em_is_child) + rinfo->clause_relids = bms_add_members(rinfo->clause_relids, + leftem->em_relids); + if (rightem->em_is_child) + rinfo->clause_relids = bms_add_members(rinfo->clause_relids, + rightem->em_relids); + /* If it's a child clause, copy the parent's rinfo_serial */ if (parent_rinfo) rinfo->rinfo_serial = parent_rinfo->rinfo_serial; @@ -2856,6 +2866,67 @@ add_child_join_rel_equivalences(PlannerInfo *root, MemoryContextSwitchTo(oldcontext); } +/* + * add_setop_child_rel_equivalences + * Add equivalence members for each non-resjunk target in 'child_tlist' + * to the EquivalenceClass in the corresponding setop_pathkey's pk_eclass. + * + * 'root' is the PlannerInfo belonging to the top-level set operation. + * 'child_rel' is the RelOptInfo of the child relation we're adding + * EquivalenceMembers for. + * 'child_tlist' is the target list for the setop child relation. The target + * list expressions are what we add as EquivalenceMembers. + * 'setop_pathkeys' is a list of PathKeys which must contain an entry for each + * non-resjunk target in 'child_tlist'. + */ +void +add_setop_child_rel_equivalences(PlannerInfo *root, RelOptInfo *child_rel, + List *child_tlist, List *setop_pathkeys) +{ + ListCell *lc; + ListCell *lc2 = list_head(setop_pathkeys); + + foreach(lc, child_tlist) + { + TargetEntry *tle = lfirst_node(TargetEntry, lc); + EquivalenceMember *parent_em; + PathKey *pk; + + if (tle->resjunk) + continue; + + if (lc2 == NULL) + elog(ERROR, "too few pathkeys for set operation"); + + pk = lfirst_node(PathKey, lc2); + parent_em = linitial(pk->pk_eclass->ec_members); + + /* + * We can safely pass the parent member as the first member in the + * ec_members list as this is added first in generate_union_paths, + * likewise, the JoinDomain can be that of the initial member of the + * Pathkey's EquivalenceClass. + */ + add_eq_member(pk->pk_eclass, + tle->expr, + child_rel->relids, + parent_em->em_jdomain, + parent_em, + exprType((Node *) tle->expr)); + + lc2 = lnext(setop_pathkeys, lc2); + } + + /* + * transformSetOperationStmt() ensures that the targetlist never contains + * any resjunk columns, so all eclasses that exist in 'root' must have + * received a new member in the loop above. Add them to the child_rel's + * eclass_indexes. + */ + child_rel->eclass_indexes = bms_add_range(child_rel->eclass_indexes, 0, + list_length(root->eq_classes) - 1); +} + /* * generate_implied_equalities_for_column diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c index 0065c8992bd5e..c0fcc7d78dfca 100644 --- a/src/backend/optimizer/path/indxpath.c +++ b/src/backend/optimizer/path/indxpath.c @@ -4,7 +4,7 @@ * Routines to determine which indexes are usable for scanning a * given relation, and create Paths accordingly. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -45,7 +45,7 @@ typedef enum { ST_INDEXSCAN, /* must support amgettuple */ ST_BITMAPSCAN, /* must support amgetbitmap */ - ST_ANYSCAN /* either is okay */ + ST_ANYSCAN, /* either is okay */ } ScanTypeControl; /* Data structure for collecting qual clauses that match an index */ @@ -106,8 +106,7 @@ static List *build_index_paths(PlannerInfo *root, RelOptInfo *rel, IndexOptInfo *index, IndexClauseSet *clauses, bool useful_predicate, ScanTypeControl scantype, - bool *skip_nonnative_saop, - bool *skip_lower_saop); + bool *skip_nonnative_saop); static List *build_paths_for_OR(PlannerInfo *root, RelOptInfo *rel, List *clauses, List *other_clauses); static List *generate_bitmap_or_paths(PlannerInfo *root, RelOptInfo *rel, @@ -706,8 +705,6 @@ eclass_already_used(EquivalenceClass *parent_ec, Relids oldrelids, * index AM supports them natively, we should just include them in simple * index paths. If not, we should exclude them while building simple index * paths, and then make a separate attempt to include them in bitmap paths. - * Furthermore, we should consider excluding lower-order ScalarArrayOpExpr - * quals so as to create ordered paths. */ static void get_index_paths(PlannerInfo *root, RelOptInfo *rel, @@ -716,37 +713,17 @@ get_index_paths(PlannerInfo *root, RelOptInfo *rel, { List *indexpaths; bool skip_nonnative_saop = false; - bool skip_lower_saop = false; ListCell *lc; /* * Build simple index paths using the clauses. Allow ScalarArrayOpExpr - * clauses only if the index AM supports them natively, and skip any such - * clauses for index columns after the first (so that we produce ordered - * paths if possible). + * clauses only if the index AM supports them natively. */ indexpaths = build_index_paths(root, rel, index, clauses, index->predOK, ST_ANYSCAN, - &skip_nonnative_saop, - &skip_lower_saop); - - /* - * If we skipped any lower-order ScalarArrayOpExprs on an index with an AM - * that supports them, then try again including those clauses. This will - * produce paths with more selectivity but no ordering. - */ - if (skip_lower_saop) - { - indexpaths = list_concat(indexpaths, - build_index_paths(root, rel, - index, clauses, - index->predOK, - ST_ANYSCAN, - &skip_nonnative_saop, - NULL)); - } + &skip_nonnative_saop); /* * Submit all the ones that can form plain IndexScan plans to add_path. (A @@ -784,7 +761,6 @@ get_index_paths(PlannerInfo *root, RelOptInfo *rel, index, clauses, false, ST_BITMAPSCAN, - NULL, NULL); *bitindexpaths = list_concat(*bitindexpaths, indexpaths); } @@ -817,27 +793,19 @@ get_index_paths(PlannerInfo *root, RelOptInfo *rel, * to true if we found any such clauses (caller must initialize the variable * to false). If it's NULL, we do not ignore ScalarArrayOpExpr clauses. * - * If skip_lower_saop is non-NULL, we ignore ScalarArrayOpExpr clauses for - * non-first index columns, and we set *skip_lower_saop to true if we found - * any such clauses (caller must initialize the variable to false). If it's - * NULL, we do not ignore non-first ScalarArrayOpExpr clauses, but they will - * result in considering the scan's output to be unordered. - * * 'rel' is the index's heap relation * 'index' is the index for which we want to generate paths * 'clauses' is the collection of indexable clauses (IndexClause nodes) * 'useful_predicate' indicates whether the index has a useful predicate * 'scantype' indicates whether we need plain or bitmap scan support * 'skip_nonnative_saop' indicates whether to accept SAOP if index AM doesn't - * 'skip_lower_saop' indicates whether to accept non-first-column SAOP */ static List * build_index_paths(PlannerInfo *root, RelOptInfo *rel, IndexOptInfo *index, IndexClauseSet *clauses, bool useful_predicate, ScanTypeControl scantype, - bool *skip_nonnative_saop, - bool *skip_lower_saop) + bool *skip_nonnative_saop) { List *result = NIL; IndexPath *ipath; @@ -848,12 +816,13 @@ build_index_paths(PlannerInfo *root, RelOptInfo *rel, List *orderbyclausecols; List *index_pathkeys; List *useful_pathkeys; - bool found_lower_saop_clause; bool pathkeys_possibly_useful; bool index_is_ordered; bool index_only_scan; int indexcol; + Assert(skip_nonnative_saop != NULL || scantype == ST_BITMAPSCAN); + /* * Check that index supports the desired scan type(s) */ @@ -880,19 +849,11 @@ build_index_paths(PlannerInfo *root, RelOptInfo *rel, * on by btree and possibly other places.) The list can be empty, if the * index AM allows that. * - * found_lower_saop_clause is set true if we accept a ScalarArrayOpExpr - * index clause for a non-first index column. This prevents us from - * assuming that the scan result is ordered. (Actually, the result is - * still ordered if there are equality constraints for all earlier - * columns, but it seems too expensive and non-modular for this code to be - * aware of that refinement.) - * * We also build a Relids set showing which outer rels are required by the * selected clauses. Any lateral_relids are included in that, but not * otherwise accounted for. */ index_clauses = NIL; - found_lower_saop_clause = false; outer_relids = bms_copy(rel->lateral_relids); for (indexcol = 0; indexcol < index->nkeycolumns; indexcol++) { @@ -903,30 +864,18 @@ build_index_paths(PlannerInfo *root, RelOptInfo *rel, IndexClause *iclause = (IndexClause *) lfirst(lc); RestrictInfo *rinfo = iclause->rinfo; - /* We might need to omit ScalarArrayOpExpr clauses */ - if (IsA(rinfo->clause, ScalarArrayOpExpr)) + if (skip_nonnative_saop && !index->amsearcharray && + IsA(rinfo->clause, ScalarArrayOpExpr)) { - if (!index->amsearcharray) - { - if (skip_nonnative_saop) - { - /* Ignore because not supported by index */ - *skip_nonnative_saop = true; - continue; - } - /* Caller had better intend this only for bitmap scan */ - Assert(scantype == ST_BITMAPSCAN); - } - if (indexcol > 0) - { - if (skip_lower_saop) - { - /* Caller doesn't want to lose index ordering */ - *skip_lower_saop = true; - continue; - } - found_lower_saop_clause = true; - } + /* + * Caller asked us to generate IndexPaths that omit any + * ScalarArrayOpExpr clauses when the underlying index AM + * lacks native support. + * + * We must omit this clause (and tell caller about it). + */ + *skip_nonnative_saop = true; + continue; } /* OK to include this clause */ @@ -956,11 +905,9 @@ build_index_paths(PlannerInfo *root, RelOptInfo *rel, /* * 2. Compute pathkeys describing index's ordering, if any, then see how * many of them are actually useful for this query. This is not relevant - * if we are only trying to build bitmap indexscans, nor if we have to - * assume the scan is unordered. + * if we are only trying to build bitmap indexscans. */ pathkeys_possibly_useful = (scantype != ST_BITMAPSCAN && - !found_lower_saop_clause && has_useful_pathkeys(root, rel)); index_is_ordered = (index->sortopfamily != NULL); if (index_is_ordered && pathkeys_possibly_useful) @@ -974,14 +921,20 @@ build_index_paths(PlannerInfo *root, RelOptInfo *rel, } else if (index->amcanorderbyop && pathkeys_possibly_useful) { - /* see if we can generate ordering operators for query_pathkeys */ + /* + * See if we can generate ordering operators for query_pathkeys or at + * least some prefix thereof. Matching to just a prefix of the + * query_pathkeys will allow an incremental sort to be considered on + * the index's partially sorted results. + */ match_pathkeys_to_index(index, root->query_pathkeys, &orderbyclauses, &orderbyclausecols); - if (orderbyclauses) + if (list_length(root->query_pathkeys) == list_length(orderbyclauses)) useful_pathkeys = root->query_pathkeys; else - useful_pathkeys = NIL; + useful_pathkeys = list_copy_head(root->query_pathkeys, + list_length(orderbyclauses)); } else { @@ -1206,7 +1159,6 @@ build_paths_for_OR(PlannerInfo *root, RelOptInfo *rel, index, &clauseset, useful_predicate, ST_BITMAPSCAN, - NULL, NULL); result = list_concat(result, indexpaths); } @@ -3051,24 +3003,24 @@ expand_indexqual_rowcompare(PlannerInfo *root, /* * match_pathkeys_to_index - * Test whether an index can produce output ordered according to the - * given pathkeys using "ordering operators". - * - * If it can, return a list of suitable ORDER BY expressions, each of the form - * "indexedcol operator pseudoconstant", along with an integer list of the - * index column numbers (zero based) that each clause would be used with. - * NIL lists are returned if the ordering is not achievable this way. - * - * On success, the result list is ordered by pathkeys, and in fact is - * one-to-one with the requested pathkeys. + * For the given 'index' and 'pathkeys', output a list of suitable ORDER + * BY expressions, each of the form "indexedcol operator pseudoconstant", + * along with an integer list of the index column numbers (zero based) + * that each clause would be used with. + * + * This attempts to find an ORDER BY and index column number for all items in + * the pathkey list, however, if we're unable to match any given pathkey to an + * index column, we return just the ones matched by the function so far. This + * allows callers who are interested in partial matches to get them. Callers + * can determine a partial match vs a full match by checking the outputted + * list lengths. A full match will have one item in the output lists for each + * item in the given 'pathkeys' list. */ static void match_pathkeys_to_index(IndexOptInfo *index, List *pathkeys, List **orderby_clauses_p, List **clause_columns_p) { - List *orderby_clauses = NIL; - List *clause_columns = NIL; ListCell *lc1; *orderby_clauses_p = NIL; /* set default results */ @@ -3084,10 +3036,6 @@ match_pathkeys_to_index(IndexOptInfo *index, List *pathkeys, bool found = false; ListCell *lc2; - /* - * Note: for any failure to match, we just return NIL immediately. - * There is no value in matching just some of the pathkeys. - */ /* Pathkey must request default sort order for the target opfamily */ if (pathkey->pk_strategy != BTLessStrategyNumber || @@ -3133,8 +3081,8 @@ match_pathkeys_to_index(IndexOptInfo *index, List *pathkeys, pathkey->pk_opfamily); if (expr) { - orderby_clauses = lappend(orderby_clauses, expr); - clause_columns = lappend_int(clause_columns, indexcol); + *orderby_clauses_p = lappend(*orderby_clauses_p, expr); + *clause_columns_p = lappend_int(*clause_columns_p, indexcol); found = true; break; } @@ -3144,12 +3092,13 @@ match_pathkeys_to_index(IndexOptInfo *index, List *pathkeys, break; } - if (!found) /* fail if no match for this pathkey */ + /* + * Return the matches found so far when this pathkey couldn't be + * matched to the index. + */ + if (!found) return; } - - *orderby_clauses_p = orderby_clauses; /* success! */ - *clause_columns_p = clause_columns; } /* diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c index f047ad9ba4688..5be8da9e09501 100644 --- a/src/backend/optimizer/path/joinpath.c +++ b/src/backend/optimizer/path/joinpath.c @@ -3,7 +3,7 @@ * joinpath.c * Routines to find all possible paths for processing a set of joins * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -30,8 +30,9 @@ set_join_pathlist_hook_type set_join_pathlist_hook = NULL; /* - * Paths parameterized by the parent can be considered to be parameterized by - * any of its child. + * Paths parameterized by a parent rel can be considered to be parameterized + * by any of its children, when we are performing partitionwise joins. These + * macros simplify checking for such cases. Beware multiple eval of args. */ #define PATH_PARAM_BY_PARENT(path, rel) \ ((path)->param_info && bms_overlap(PATH_REQ_OUTER(path), \ @@ -333,7 +334,10 @@ add_paths_to_joinrel(PlannerInfo *root, jointype, &extra); /* - * 6. Finally, give extensions a chance to manipulate the path list. + * 6. Finally, give extensions a chance to manipulate the path list. They + * could add new paths (such as CustomPaths) by calling add_path(), or + * add_partial_path() if parallel aware. They could also delete or modify + * paths added by the core code. */ if (set_join_pathlist_hook) set_join_pathlist_hook(root, joinrel, outerrel, innerrel, @@ -489,8 +493,16 @@ paraminfo_get_equal_hashops(PlannerInfo *root, ParamPathInfo *param_info, return false; } - *operators = lappend_oid(*operators, hasheqoperator); - *param_exprs = lappend(*param_exprs, expr); + /* + * 'expr' may already exist as a parameter from a previous item in + * ppi_clauses. No need to include it again, however we'd better + * ensure we do switch into binary mode if required. See below. + */ + if (!list_member(*param_exprs, expr)) + { + *operators = lappend_oid(*operators, hasheqoperator); + *param_exprs = lappend(*param_exprs, expr); + } /* * When the join operator is not hashable then it's possible that @@ -514,7 +526,7 @@ paraminfo_get_equal_hashops(PlannerInfo *root, ParamPathInfo *param_info, Node *expr = (Node *) lfirst(lc); TypeCacheEntry *typentry; - /* Reject if there are any volatile functions in PHVs */ + /* Reject if there are any volatile functions in lateral vars */ if (contain_volatile_functions(expr)) { list_free(*operators); @@ -533,8 +545,16 @@ paraminfo_get_equal_hashops(PlannerInfo *root, ParamPathInfo *param_info, return false; } - *operators = lappend_oid(*operators, typentry->eq_opr); - *param_exprs = lappend(*param_exprs, expr); + /* + * 'expr' may already exist as a parameter from the ppi_clauses. No + * need to include it again, however we'd better ensure we do switch + * into binary mode. + */ + if (!list_member(*param_exprs, expr)) + { + *operators = lappend_oid(*operators, typentry->eq_opr); + *param_exprs = lappend(*param_exprs, expr); + } /* * We must go into binary mode as we don't have too much of an idea of @@ -632,7 +652,7 @@ get_memoize_path(PlannerInfo *root, RelOptInfo *innerrel, */ if (extra->inner_unique && (inner_path->param_info == NULL || - list_length(inner_path->param_info->ppi_clauses) < + bms_num_members(inner_path->param_info->ppi_serials) < list_length(extra->restrictlist))) return NULL; @@ -652,6 +672,23 @@ get_memoize_path(PlannerInfo *root, RelOptInfo *innerrel, return NULL; } + /* + * Also check the parameterized path restrictinfos for volatile functions. + * Indexed functions must be immutable so shouldn't have any volatile + * functions, however, with a lateral join the inner scan may not be an + * index scan. + */ + if (inner_path->param_info != NULL) + { + foreach(lc, inner_path->param_info->ppi_clauses) + { + RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc); + + if (contain_volatile_functions((Node *) rinfo)) + return NULL; + } + } + /* Check if we have hash ops for each parameter to the path */ if (paraminfo_get_equal_hashops(root, inner_path->param_info, @@ -710,8 +747,11 @@ try_nestloop_path(PlannerInfo *root, return; /* - * Paths are parameterized by top-level parents, so run parameterization - * tests on the parent relids. + * Any parameterization of the input paths refers to topmost parents of + * the relevant relations, because reparameterize_path_by_child() hasn't + * been called yet. So we must consider topmost parents of the relations + * being joined, too, while determining parameterization of the result and + * checking for disallowed parameterization cases. */ if (innerrel->top_parent_relids) innerrelids = innerrel->top_parent_relids; @@ -745,6 +785,20 @@ try_nestloop_path(PlannerInfo *root, /* If we got past that, we shouldn't have any unsafe outer-join refs */ Assert(!have_unsafe_outer_join_ref(root, outerrelids, inner_paramrels)); + /* + * If the inner path is parameterized, it is parameterized by the topmost + * parent of the outer rel, not the outer rel itself. We will need to + * translate the parameterization, if this path is chosen, during + * create_plan(). Here we just check whether we will be able to perform + * the translation, and if not avoid creating a nestloop path. + */ + if (PATH_PARAM_BY_PARENT(inner_path, outer_path->parent) && + !path_is_reparameterizable_by_child(inner_path, outer_path->parent)) + { + bms_free(required_outer); + return; + } + /* * Do a precheck to quickly eliminate obviously-inferior paths. We * calculate a cheap lower bound on the path's cost and then use @@ -761,27 +815,6 @@ try_nestloop_path(PlannerInfo *root, workspace.startup_cost, workspace.total_cost, pathkeys, required_outer)) { - /* - * If the inner path is parameterized, it is parameterized by the - * topmost parent of the outer rel, not the outer rel itself. Fix - * that. - */ - if (PATH_PARAM_BY_PARENT(inner_path, outer_path->parent)) - { - inner_path = reparameterize_path_by_child(root, inner_path, - outer_path->parent); - - /* - * If we could not translate the path, we can't create nest loop - * path. - */ - if (!inner_path) - { - bms_free(required_outer); - return; - } - } - add_path(joinrel, (Path *) create_nestloop_path(root, joinrel, @@ -844,6 +877,17 @@ try_partial_nestloop_path(PlannerInfo *root, return; } + /* + * If the inner path is parameterized, it is parameterized by the topmost + * parent of the outer rel, not the outer rel itself. We will need to + * translate the parameterization, if this path is chosen, during + * create_plan(). Here we just check whether we will be able to perform + * the translation, and if not avoid creating a nestloop path. + */ + if (PATH_PARAM_BY_PARENT(inner_path, outer_path->parent) && + !path_is_reparameterizable_by_child(inner_path, outer_path->parent)) + return; + /* * Before creating a path, get a quick lower bound on what it is likely to * cost. Bail out right away if it looks terrible. @@ -853,22 +897,6 @@ try_partial_nestloop_path(PlannerInfo *root, if (!add_partial_path_precheck(joinrel, workspace.total_cost, pathkeys)) return; - /* - * If the inner path is parameterized, it is parameterized by the topmost - * parent of the outer rel, not the outer rel itself. Fix that. - */ - if (PATH_PARAM_BY_PARENT(inner_path, outer_path->parent)) - { - inner_path = reparameterize_path_by_child(root, inner_path, - outer_path->parent); - - /* - * If we could not translate the path, we can't create nest loop path. - */ - if (!inner_path) - return; - } - /* Might be good enough to be worth trying, so let's try it. */ add_partial_path(joinrel, (Path *) create_nestloop_path(root, diff --git a/src/backend/optimizer/path/joinrels.c b/src/backend/optimizer/path/joinrels.c index 2feab2184f433..d4c5738e965a0 100644 --- a/src/backend/optimizer/path/joinrels.c +++ b/src/backend/optimizer/path/joinrels.c @@ -3,7 +3,7 @@ * joinrels.c * Routines to determine which relations should be joined * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,8 +25,8 @@ static void make_rels_by_clause_joins(PlannerInfo *root, RelOptInfo *old_rel, - List *other_rels_list, - ListCell *other_rels); + List *other_rels, + int first_rel_idx); static void make_rels_by_clauseless_joins(PlannerInfo *root, RelOptInfo *old_rel, List *other_rels); @@ -45,6 +45,8 @@ static void try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, static SpecialJoinInfo *build_child_join_sjinfo(PlannerInfo *root, SpecialJoinInfo *parent_sjinfo, Relids left_relids, Relids right_relids); +static void free_child_join_sjinfo(SpecialJoinInfo *child_sjinfo, + SpecialJoinInfo *parent_sjinfo); static void compute_partition_bounds(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, RelOptInfo *joinrel, SpecialJoinInfo *parent_sjinfo, @@ -93,6 +95,8 @@ join_search_one_level(PlannerInfo *root, int level) if (old_rel->joininfo != NIL || old_rel->has_eclass_joins || has_join_restriction(root, old_rel)) { + int first_rel; + /* * There are join clauses or join order restrictions relevant to * this rel, so consider joins between this rel and (only) those @@ -106,24 +110,12 @@ join_search_one_level(PlannerInfo *root, int level) * to each initial rel they don't already include but have a join * clause or restriction with. */ - List *other_rels_list; - ListCell *other_rels; - if (level == 2) /* consider remaining initial rels */ - { - other_rels_list = joinrels[level - 1]; - other_rels = lnext(other_rels_list, r); - } - else /* consider all initial rels */ - { - other_rels_list = joinrels[1]; - other_rels = list_head(other_rels_list); - } + first_rel = foreach_current_index(r) + 1; + else + first_rel = 0; - make_rels_by_clause_joins(root, - old_rel, - other_rels_list, - other_rels); + make_rels_by_clause_joins(root, old_rel, joinrels[1], first_rel); } else { @@ -167,8 +159,7 @@ join_search_one_level(PlannerInfo *root, int level) foreach(r, joinrels[k]) { RelOptInfo *old_rel = (RelOptInfo *) lfirst(r); - List *other_rels_list; - ListCell *other_rels; + int first_rel; ListCell *r2; /* @@ -180,19 +171,12 @@ join_search_one_level(PlannerInfo *root, int level) !has_join_restriction(root, old_rel)) continue; - if (k == other_level) - { - /* only consider remaining rels */ - other_rels_list = joinrels[k]; - other_rels = lnext(other_rels_list, r); - } + if (k == other_level) /* only consider remaining rels */ + first_rel = foreach_current_index(r) + 1; else - { - other_rels_list = joinrels[other_level]; - other_rels = list_head(other_rels_list); - } + first_rel = 0; - for_each_cell(r2, other_rels_list, other_rels) + for_each_from(r2, joinrels[other_level], first_rel) { RelOptInfo *new_rel = (RelOptInfo *) lfirst(r2); @@ -286,9 +270,8 @@ join_search_one_level(PlannerInfo *root, int level) * automatically ensures that each new joinrel is only added to the list once. * * 'old_rel' is the relation entry for the relation to be joined - * 'other_rels_list': a list containing the other - * rels to be considered for joining - * 'other_rels': the first cell to be considered + * 'other_rels': a list containing the other rels to be considered for joining + * 'first_rel_idx': the first rel to be considered in 'other_rels' * * Currently, this is only used with initial rels in other_rels, but it * will work for joining to joinrels too. @@ -296,12 +279,12 @@ join_search_one_level(PlannerInfo *root, int level) static void make_rels_by_clause_joins(PlannerInfo *root, RelOptInfo *old_rel, - List *other_rels_list, - ListCell *other_rels) + List *other_rels, + int first_rel_idx) { ListCell *l; - for_each_cell(l, other_rels_list, other_rels) + for_each_from(l, other_rels, first_rel_idx) { RelOptInfo *other_rel = (RelOptInfo *) lfirst(l); @@ -672,6 +655,39 @@ join_is_legal(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, return true; } +/* + * init_dummy_sjinfo + * Populate the given SpecialJoinInfo for a plain inner join between the + * left and right relations specified by left_relids and right_relids + * respectively. + * + * Normally, an inner join does not have a SpecialJoinInfo node associated with + * it. But some functions involved in join planning require one containing at + * least the information of which relations are being joined. So we initialize + * that information here. + */ +void +init_dummy_sjinfo(SpecialJoinInfo *sjinfo, Relids left_relids, + Relids right_relids) +{ + sjinfo->type = T_SpecialJoinInfo; + sjinfo->min_lefthand = left_relids; + sjinfo->min_righthand = right_relids; + sjinfo->syn_lefthand = left_relids; + sjinfo->syn_righthand = right_relids; + sjinfo->jointype = JOIN_INNER; + sjinfo->ojrelid = 0; + sjinfo->commute_above_l = NULL; + sjinfo->commute_above_r = NULL; + sjinfo->commute_below_l = NULL; + sjinfo->commute_below_r = NULL; + /* we don't bother trying to make the remaining fields valid */ + sjinfo->lhs_strict = false; + sjinfo->semi_can_btree = false; + sjinfo->semi_can_hash = false; + sjinfo->semi_operators = NIL; + sjinfo->semi_rhs_exprs = NIL; +} /* * make_join_rel @@ -735,23 +751,7 @@ make_join_rel(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2) if (sjinfo == NULL) { sjinfo = &sjinfo_data; - sjinfo->type = T_SpecialJoinInfo; - sjinfo->min_lefthand = rel1->relids; - sjinfo->min_righthand = rel2->relids; - sjinfo->syn_lefthand = rel1->relids; - sjinfo->syn_righthand = rel2->relids; - sjinfo->jointype = JOIN_INNER; - sjinfo->ojrelid = 0; - sjinfo->commute_above_l = NULL; - sjinfo->commute_above_r = NULL; - sjinfo->commute_below_l = NULL; - sjinfo->commute_below_r = NULL; - /* we don't bother trying to make the remaining fields valid */ - sjinfo->lhs_strict = false; - sjinfo->semi_can_btree = false; - sjinfo->semi_can_hash = false; - sjinfo->semi_operators = NIL; - sjinfo->semi_rhs_exprs = NIL; + init_dummy_sjinfo(sjinfo, rel1->relids, rel2->relids); } /* @@ -1543,7 +1543,6 @@ try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, SpecialJoinInfo *child_sjinfo; List *child_restrictlist; RelOptInfo *child_joinrel; - Relids child_joinrelids; AppendRelInfo **appinfos; int nappinfos; @@ -1640,13 +1639,11 @@ try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, child_rel1->relids, child_rel2->relids); - /* Build correct join relids for child join */ - child_joinrelids = bms_union(child_rel1->relids, child_rel2->relids); - child_joinrelids = add_outer_joins_to_relids(root, child_joinrelids, - child_sjinfo, NULL); - /* Find the AppendRelInfo structures */ - appinfos = find_appinfos_by_relids(root, child_joinrelids, &nappinfos); + appinfos = find_appinfos_by_relids(root, + bms_union(child_rel1->relids, + child_rel2->relids), + &nappinfos); /* * Construct restrictions applicable to the child join from those @@ -1656,8 +1653,8 @@ try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, (List *) adjust_appendrel_attrs(root, (Node *) parent_restrictlist, nappinfos, appinfos); - pfree(appinfos); + /* Find or construct the child join's RelOptInfo */ child_joinrel = joinrel->part_rels[cnt_parts]; if (!child_joinrel) { @@ -1670,11 +1667,18 @@ try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, child_joinrel->relids); } - Assert(bms_equal(child_joinrel->relids, child_joinrelids)); + /* Assert we got the right one */ + Assert(bms_equal(child_joinrel->relids, + adjust_child_relids(joinrel->relids, + nappinfos, appinfos))); + /* And make paths for the child join */ populate_joinrel_with_paths(root, child_rel1, child_rel2, child_joinrel, child_sjinfo, child_restrictlist); + + pfree(appinfos); + free_child_join_sjinfo(child_sjinfo, parent_sjinfo); } } @@ -1682,6 +1686,9 @@ try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, * Construct the SpecialJoinInfo for a child-join by translating * SpecialJoinInfo for the join between parents. left_relids and right_relids * are the relids of left and right side of the join respectively. + * + * If translations are added to or removed from this function, consider + * updating free_child_join_sjinfo() accordingly. */ static SpecialJoinInfo * build_child_join_sjinfo(PlannerInfo *root, SpecialJoinInfo *parent_sjinfo, @@ -1693,6 +1700,14 @@ build_child_join_sjinfo(PlannerInfo *root, SpecialJoinInfo *parent_sjinfo, AppendRelInfo **right_appinfos; int right_nappinfos; + /* Dummy SpecialJoinInfos can be created without any translation. */ + if (parent_sjinfo->jointype == JOIN_INNER) + { + Assert(parent_sjinfo->ojrelid == 0); + init_dummy_sjinfo(sjinfo, left_relids, right_relids); + return sjinfo; + } + memcpy(sjinfo, parent_sjinfo, sizeof(SpecialJoinInfo)); left_appinfos = find_appinfos_by_relids(root, left_relids, &left_nappinfos); @@ -1721,6 +1736,52 @@ build_child_join_sjinfo(PlannerInfo *root, SpecialJoinInfo *parent_sjinfo, return sjinfo; } +/* + * free_child_join_sjinfo + * Free memory consumed by a SpecialJoinInfo created by + * build_child_join_sjinfo() + * + * Only members that are translated copies of their counterpart in the parent + * SpecialJoinInfo are freed here. + */ +static void +free_child_join_sjinfo(SpecialJoinInfo *child_sjinfo, + SpecialJoinInfo *parent_sjinfo) +{ + /* + * Dummy SpecialJoinInfos of inner joins do not have any translated fields + * and hence no fields that to be freed. + */ + if (child_sjinfo->jointype != JOIN_INNER) + { + if (child_sjinfo->min_lefthand != parent_sjinfo->min_lefthand) + bms_free(child_sjinfo->min_lefthand); + + if (child_sjinfo->min_righthand != parent_sjinfo->min_righthand) + bms_free(child_sjinfo->min_righthand); + + if (child_sjinfo->syn_lefthand != parent_sjinfo->syn_lefthand) + bms_free(child_sjinfo->syn_lefthand); + + if (child_sjinfo->syn_righthand != parent_sjinfo->syn_righthand) + bms_free(child_sjinfo->syn_righthand); + + Assert(child_sjinfo->commute_above_l == parent_sjinfo->commute_above_l); + Assert(child_sjinfo->commute_above_r == parent_sjinfo->commute_above_r); + Assert(child_sjinfo->commute_below_l == parent_sjinfo->commute_below_l); + Assert(child_sjinfo->commute_below_r == parent_sjinfo->commute_below_r); + + Assert(child_sjinfo->semi_operators == parent_sjinfo->semi_operators); + + /* + * semi_rhs_exprs may in principle be freed, but a simple pfree() does + * not suffice, so we leave it alone. + */ + } + + pfree(child_sjinfo); +} + /* * compute_partition_bounds * Compute the partition bounds for a join rel from those for inputs diff --git a/src/backend/optimizer/path/meson.build b/src/backend/optimizer/path/meson.build index b8871fd2d22e1..b09fbe44669b9 100644 --- a/src/backend/optimizer/path/meson.build +++ b/src/backend/optimizer/path/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'allpaths.c', diff --git a/src/backend/optimizer/path/pathkeys.c b/src/backend/optimizer/path/pathkeys.c index e53ea842248bd..416fc4e240bb7 100644 --- a/src/backend/optimizer/path/pathkeys.c +++ b/src/backend/optimizer/path/pathkeys.c @@ -7,7 +7,7 @@ * the nature and use of path keys. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -19,15 +19,16 @@ #include "access/stratnum.h" #include "catalog/pg_opfamily.h" -#include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" -#include "nodes/plannodes.h" +#include "optimizer/cost.h" #include "optimizer/optimizer.h" #include "optimizer/pathnode.h" #include "optimizer/paths.h" #include "partitioning/partbounds.h" #include "utils/lsyscache.h" +/* Consider reordering of GROUP BY keys? */ +bool enable_group_by_reordering = true; static bool pathkey_is_redundant(PathKey *new_pathkey, List *pathkeys); static bool matches_boolean_partition_clause(RestrictInfo *rinfo, @@ -350,6 +351,202 @@ pathkeys_contained_in(List *keys1, List *keys2) return false; } +/* + * group_keys_reorder_by_pathkeys + * Reorder GROUP BY pathkeys and clauses to match the input pathkeys. + * + * 'pathkeys' is an input list of pathkeys + * '*group_pathkeys' and '*group_clauses' are pathkeys and clauses lists to + * reorder. The pointers are redirected to new lists, original lists + * stay untouched. + * 'num_groupby_pathkeys' is the number of first '*group_pathkeys' items to + * search matching pathkeys. + * + * Returns the number of GROUP BY keys with a matching pathkey. + */ +static int +group_keys_reorder_by_pathkeys(List *pathkeys, List **group_pathkeys, + List **group_clauses, + int num_groupby_pathkeys) +{ + List *new_group_pathkeys = NIL, + *new_group_clauses = NIL; + List *grouping_pathkeys; + ListCell *lc; + int n; + + if (pathkeys == NIL || *group_pathkeys == NIL) + return 0; + + /* + * We're going to search within just the first num_groupby_pathkeys of + * *group_pathkeys. The thing is that root->group_pathkeys is passed as + * *group_pathkeys containing grouping pathkeys altogether with aggregate + * pathkeys. If we process aggregate pathkeys we could get an invalid + * result of get_sortgroupref_clause_noerr(), because their + * pathkey->pk_eclass->ec_sortref doesn't reference query targetlist. So, + * we allocate a separate list of pathkeys for lookups. + */ + grouping_pathkeys = list_copy_head(*group_pathkeys, num_groupby_pathkeys); + + /* + * Walk the pathkeys (determining ordering of the input path) and see if + * there's a matching GROUP BY key. If we find one, we append it to the + * list, and do the same for the clauses. + * + * Once we find the first pathkey without a matching GROUP BY key, the + * rest of the pathkeys are useless and can't be used to evaluate the + * grouping, so we abort the loop and ignore the remaining pathkeys. + */ + foreach(lc, pathkeys) + { + PathKey *pathkey = (PathKey *) lfirst(lc); + SortGroupClause *sgc; + + /* + * Pathkeys are built in a way that allows simply comparing pointers. + * Give up if we can't find the matching pointer. Also give up if + * there is no sortclause reference for some reason. + */ + if (foreach_current_index(lc) >= num_groupby_pathkeys || + !list_member_ptr(grouping_pathkeys, pathkey) || + pathkey->pk_eclass->ec_sortref == 0) + break; + + /* + * Since 1349d27 pathkey coming from underlying node can be in the + * root->group_pathkeys but not in the processed_groupClause. So, we + * should be careful here. + */ + sgc = get_sortgroupref_clause_noerr(pathkey->pk_eclass->ec_sortref, + *group_clauses); + if (!sgc) + /* The grouping clause does not cover this pathkey */ + break; + + /* + * Sort group clause should have an ordering operator as long as there + * is an associated pathkey. + */ + Assert(OidIsValid(sgc->sortop)); + + new_group_pathkeys = lappend(new_group_pathkeys, pathkey); + new_group_clauses = lappend(new_group_clauses, sgc); + } + + /* remember the number of pathkeys with a matching GROUP BY key */ + n = list_length(new_group_pathkeys); + + /* append the remaining group pathkeys (will be treated as not sorted) */ + *group_pathkeys = list_concat_unique_ptr(new_group_pathkeys, + *group_pathkeys); + *group_clauses = list_concat_unique_ptr(new_group_clauses, + *group_clauses); + + list_free(grouping_pathkeys); + return n; +} + +/* + * get_useful_group_keys_orderings + * Determine which orderings of GROUP BY keys are potentially interesting. + * + * Returns a list of GroupByOrdering items, each representing an interesting + * ordering of GROUP BY keys. Each item stores pathkeys and clauses in the + * matching order. + * + * The function considers (and keeps) following GROUP BY orderings: + * + * - GROUP BY keys as ordered by preprocess_groupclause() to match target + * ORDER BY clause (as much as possible), + * - GROUP BY keys reordered to match 'path' ordering (as much as possible). + */ +List * +get_useful_group_keys_orderings(PlannerInfo *root, Path *path) +{ + Query *parse = root->parse; + List *infos = NIL; + GroupByOrdering *info; + + List *pathkeys = root->group_pathkeys; + List *clauses = root->processed_groupClause; + + /* always return at least the original pathkeys/clauses */ + info = makeNode(GroupByOrdering); + info->pathkeys = pathkeys; + info->clauses = clauses; + infos = lappend(infos, info); + + /* + * Should we try generating alternative orderings of the group keys? If + * not, we produce only the order specified in the query, i.e. the + * optimization is effectively disabled. + */ + if (!enable_group_by_reordering) + return infos; + + /* + * Grouping sets have own and more complex logic to decide the ordering. + */ + if (parse->groupingSets) + return infos; + + /* + * If the path is sorted in some way, try reordering the group keys to + * match the path as much of the ordering as possible. Then thanks to + * incremental sort we would get this sort as cheap as possible. + */ + if (path->pathkeys && + !pathkeys_contained_in(path->pathkeys, root->group_pathkeys)) + { + int n; + + n = group_keys_reorder_by_pathkeys(path->pathkeys, &pathkeys, &clauses, + root->num_groupby_pathkeys); + + if (n > 0 && + (enable_incremental_sort || n == root->num_groupby_pathkeys) && + compare_pathkeys(pathkeys, root->group_pathkeys) != PATHKEYS_EQUAL) + { + info = makeNode(GroupByOrdering); + info->pathkeys = pathkeys; + info->clauses = clauses; + + infos = lappend(infos, info); + } + } + +#ifdef USE_ASSERT_CHECKING + { + GroupByOrdering *pinfo = linitial_node(GroupByOrdering, infos); + ListCell *lc; + + /* Test consistency of info structures */ + for_each_from(lc, infos, 1) + { + ListCell *lc1, + *lc2; + + info = lfirst_node(GroupByOrdering, lc); + + Assert(list_length(info->clauses) == list_length(pinfo->clauses)); + Assert(list_length(info->pathkeys) == list_length(pinfo->pathkeys)); + Assert(list_difference(info->clauses, pinfo->clauses) == NIL); + Assert(list_difference_ptr(info->pathkeys, pinfo->pathkeys) == NIL); + + forboth(lc1, info->clauses, lc2, info->pathkeys) + { + SortGroupClause *sgc = lfirst_node(SortGroupClause, lc1); + PathKey *pk = lfirst_node(PathKey, lc2); + + Assert(pk->pk_eclass->ec_sortref == sgc->tleSortGroupRef); + } + } + } +#endif + return infos; +} + /* * pathkeys_count_contained_in * Same as pathkeys_contained_in, but also sets length of longest @@ -407,7 +604,8 @@ pathkeys_count_contained_in(List *keys1, List *keys2, int *n_common) /* * get_cheapest_path_for_pathkeys * Find the cheapest path (according to the specified criterion) that - * satisfies the given pathkeys and parameterization. + * satisfies the given pathkeys and parameterization, and is parallel-safe + * if required. * Return NULL if no such path. * * 'paths' is a list of possible paths that all generate the same relation @@ -429,6 +627,10 @@ get_cheapest_path_for_pathkeys(List *paths, List *pathkeys, { Path *path = (Path *) lfirst(l); + /* If required, reject paths that are not parallel-safe */ + if (require_parallel_safe && !path->parallel_safe) + continue; + /* * Since cost comparison is a lot cheaper than pathkey comparison, do * that first. (XXX is that still true?) @@ -437,9 +639,6 @@ get_cheapest_path_for_pathkeys(List *paths, List *pathkeys, compare_path_costs(matched_path, path, cost_criterion) <= 0) continue; - if (require_parallel_safe && !path->parallel_safe) - continue; - if (pathkeys_contained_in(pathkeys, path->pathkeys) && bms_is_subset(PATH_REQ_OUTER(path), required_outer)) matched_path = path; @@ -1139,7 +1338,8 @@ make_pathkeys_for_sortclauses(PlannerInfo *root, &sortclauses, tlist, false, - &sortable); + &sortable, + false); /* It's caller error if not all clauses were sortable */ Assert(sortable); return result; @@ -1163,13 +1363,17 @@ make_pathkeys_for_sortclauses(PlannerInfo *root, * to remove any clauses that can be proven redundant via the eclass logic. * Even though we'll have to hash in that case, we might as well not hash * redundant columns.) + * + * If set_ec_sortref is true then sets the value of the pathkey's + * EquivalenceClass unless it's already initialized. */ List * make_pathkeys_for_sortclauses_extended(PlannerInfo *root, List **sortclauses, List *tlist, bool remove_redundant, - bool *sortable) + bool *sortable, + bool set_ec_sortref) { List *pathkeys = NIL; ListCell *l; @@ -1193,6 +1397,15 @@ make_pathkeys_for_sortclauses_extended(PlannerInfo *root, sortcl->nulls_first, sortcl->tleSortGroupRef, true); + if (pathkey->pk_eclass->ec_sortref == 0 && set_ec_sortref) + { + /* + * Copy the sortref if it hasn't been set yet. That may happen if + * the EquivalenceClass was constructed from a WHERE clause, i.e. + * it doesn't have a target reference at all. + */ + pathkey->pk_eclass->ec_sortref = sortcl->tleSortGroupRef; + } /* Canonical form eliminates redundant ordering keys */ if (!pathkey_is_redundant(pathkey, pathkeys)) @@ -1925,13 +2138,67 @@ pathkeys_useful_for_ordering(PlannerInfo *root, List *pathkeys) { int n_common_pathkeys; - if (root->query_pathkeys == NIL) - return 0; /* no special ordering requested */ + (void) pathkeys_count_contained_in(root->query_pathkeys, pathkeys, + &n_common_pathkeys); - if (pathkeys == NIL) - return 0; /* unordered path */ + return n_common_pathkeys; +} - (void) pathkeys_count_contained_in(root->query_pathkeys, pathkeys, +/* + * pathkeys_useful_for_grouping + * Count the number of pathkeys that are useful for grouping (instead of + * explicit sort) + * + * Group pathkeys could be reordered to benefit from the ordering. The + * ordering may not be "complete" and may require incremental sort, but that's + * fine. So we simply count prefix pathkeys with a matching group key, and + * stop once we find the first pathkey without a match. + * + * So e.g. with pathkeys (a,b,c) and group keys (a,b,e) this determines (a,b) + * pathkeys are useful for grouping, and we might do incremental sort to get + * path ordered by (a,b,e). + * + * This logic is necessary to retain paths with ordering not matching grouping + * keys directly, without the reordering. + * + * Returns the length of pathkey prefix with matching group keys. + */ +static int +pathkeys_useful_for_grouping(PlannerInfo *root, List *pathkeys) +{ + ListCell *key; + int n = 0; + + /* no special ordering requested for grouping */ + if (root->group_pathkeys == NIL) + return 0; + + /* walk the pathkeys and search for matching group key */ + foreach(key, pathkeys) + { + PathKey *pathkey = (PathKey *) lfirst(key); + + /* no matching group key, we're done */ + if (!list_member_ptr(root->group_pathkeys, pathkey)) + break; + + n++; + } + + return n; +} + +/* + * pathkeys_useful_for_setop + * Count the number of leading common pathkeys root's 'setop_pathkeys' in + * 'pathkeys'. + */ +static int +pathkeys_useful_for_setop(PlannerInfo *root, List *pathkeys) +{ + int n_common_pathkeys; + + (void) pathkeys_count_contained_in(root->setop_pathkeys, pathkeys, &n_common_pathkeys); return n_common_pathkeys; @@ -1951,6 +2218,12 @@ truncate_useless_pathkeys(PlannerInfo *root, nuseful = pathkeys_useful_for_merging(root, rel, pathkeys); nuseful2 = pathkeys_useful_for_ordering(root, pathkeys); + if (nuseful2 > nuseful) + nuseful = nuseful2; + nuseful2 = pathkeys_useful_for_grouping(root, pathkeys); + if (nuseful2 > nuseful) + nuseful = nuseful2; + nuseful2 = pathkeys_useful_for_setop(root, pathkeys); if (nuseful2 > nuseful) nuseful = nuseful2; @@ -1986,6 +2259,8 @@ has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel) { if (rel->joininfo != NIL || rel->has_eclass_joins) return true; /* might be able to use pathkeys for merging */ + if (root->group_pathkeys != NIL) + return true; /* might be able to use pathkeys for grouping */ if (root->query_pathkeys != NIL) return true; /* might be able to use them for ordering */ return false; /* definitely useless */ diff --git a/src/backend/optimizer/path/tidpath.c b/src/backend/optimizer/path/tidpath.c index 05ad585a8fe5d..eb11bc79c7998 100644 --- a/src/backend/optimizer/path/tidpath.c +++ b/src/backend/optimizer/path/tidpath.c @@ -27,7 +27,7 @@ * "CTID relop pseudoconstant", where relop is one of >,>=,<,<=, and * AND-clauses composed of such conditions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -42,7 +42,6 @@ #include "catalog/pg_operator.h" #include "catalog/pg_type.h" #include "nodes/nodeFuncs.h" -#include "optimizer/clauses.h" #include "optimizer/optimizer.h" #include "optimizer/pathnode.h" #include "optimizer/paths.h" @@ -226,42 +225,37 @@ IsCurrentOfClause(RestrictInfo *rinfo, RelOptInfo *rel) } /* - * Extract a set of CTID conditions from the given RestrictInfo - * - * Returns a List of CTID qual RestrictInfos for the specified rel (with - * implicit OR semantics across the list), or NIL if there are no usable - * conditions. + * Is the RestrictInfo usable as a CTID qual for the specified rel? * * This function considers only base cases; AND/OR combination is handled - * below. Therefore the returned List never has more than one element. - * (Using a List may seem a bit weird, but it simplifies the caller.) + * below. */ -static List * -TidQualFromRestrictInfo(PlannerInfo *root, RestrictInfo *rinfo, RelOptInfo *rel) +static bool +RestrictInfoIsTidQual(PlannerInfo *root, RestrictInfo *rinfo, RelOptInfo *rel) { /* * We may ignore pseudoconstant clauses (they can't contain Vars, so could * not match anyway). */ if (rinfo->pseudoconstant) - return NIL; + return false; /* * If clause must wait till after some lower-security-level restriction * clause, reject it. */ if (!restriction_is_securely_promotable(rinfo, rel)) - return NIL; + return false; /* - * Check all base cases. If we get a match, return the clause. + * Check all base cases. */ if (IsTidEqualClause(rinfo, rel) || IsTidEqualAnyClause(root, rinfo, rel) || IsCurrentOfClause(rinfo, rel)) - return list_make1(rinfo); + return true; - return NIL; + return false; } /* @@ -271,12 +265,22 @@ TidQualFromRestrictInfo(PlannerInfo *root, RestrictInfo *rinfo, RelOptInfo *rel) * implicit OR semantics across the list), or NIL if there are no usable * equality conditions. * - * This function is just concerned with handling AND/OR recursion. + * This function is mainly concerned with handling AND/OR recursion. + * However, we do have a special rule to enforce: if there is a CurrentOfExpr + * qual, we *must* return that and only that, else the executor may fail. + * Ordinarily a CurrentOfExpr would be all alone anyway because of grammar + * restrictions, but it is possible for RLS quals to appear AND'ed with it. + * It's even possible (if fairly useless) for the RLS quals to be CTID quals. + * So we must scan the whole rlist to see if there's a CurrentOfExpr. Since + * we have to do that, we also apply some very-trivial preference rules about + * which of the other possibilities should be chosen, in the unlikely event + * that there's more than one choice. */ static List * TidQualFromRestrictInfoList(PlannerInfo *root, List *rlist, RelOptInfo *rel) { - List *rlst = NIL; + RestrictInfo *tidclause = NULL; /* best simple CTID qual so far */ + List *orlist = NIL; /* best OR'ed CTID qual so far */ ListCell *l; foreach(l, rlist) @@ -285,6 +289,7 @@ TidQualFromRestrictInfoList(PlannerInfo *root, List *rlist, RelOptInfo *rel) if (restriction_is_or_clause(rinfo)) { + List *rlst = NIL; ListCell *j; /* @@ -309,7 +314,10 @@ TidQualFromRestrictInfoList(PlannerInfo *root, List *rlist, RelOptInfo *rel) RestrictInfo *ri = castNode(RestrictInfo, orarg); Assert(!restriction_is_or_clause(ri)); - sublist = TidQualFromRestrictInfo(root, ri, rel); + if (RestrictInfoIsTidQual(root, ri, rel)) + sublist = list_make1(ri); + else + sublist = NIL; } /* @@ -327,25 +335,44 @@ TidQualFromRestrictInfoList(PlannerInfo *root, List *rlist, RelOptInfo *rel) */ rlst = list_concat(rlst, sublist); } + + if (rlst) + { + /* + * Accept the OR'ed list if it's the first one, or if it's + * shorter than the previous one. + */ + if (orlist == NIL || list_length(rlst) < list_length(orlist)) + orlist = rlst; + } } else { /* Not an OR clause, so handle base cases */ - rlst = TidQualFromRestrictInfo(root, rinfo, rel); - } + if (RestrictInfoIsTidQual(root, rinfo, rel)) + { + /* We can stop immediately if it's a CurrentOfExpr */ + if (IsCurrentOfClause(rinfo, rel)) + return list_make1(rinfo); - /* - * Stop as soon as we find any usable CTID condition. In theory we - * could get CTID equality conditions from different AND'ed clauses, - * in which case we could try to pick the most efficient one. In - * practice, such usage seems very unlikely, so we don't bother; we - * just exit as soon as we find the first candidate. - */ - if (rlst) - break; + /* + * Otherwise, remember the first non-OR CTID qual. We could + * try to apply some preference order if there's more than + * one, but such usage seems very unlikely, so don't bother. + */ + if (tidclause == NULL) + tidclause = rinfo; + } + } } - return rlst; + /* + * Prefer any singleton CTID qual to an OR'ed list. Again, it seems + * unlikely to be worth thinking harder than that. + */ + if (tidclause) + return list_make1(tidclause); + return orlist; } /* @@ -406,7 +433,7 @@ BuildParameterizedTidPaths(PlannerInfo *root, RelOptInfo *rel, List *clauses) * might find a suitable ScalarArrayOpExpr in the rel's joininfo list, * but it seems unlikely to be worth expending the cycles to check. * And we definitely won't find a CurrentOfExpr here. Hence, we don't - * use TidQualFromRestrictInfo; but this must match that function + * use RestrictInfoIsTidQual; but this must match that function * otherwise. */ if (rinfo->pseudoconstant || diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index 5f3cce873a06a..c3fd4a81f8a61 100644 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@ -11,7 +11,7 @@ * is that we have to work harder to clean up after ourselves when we modify * the query, since the derived data structures have to be updated too. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,14 +23,12 @@ #include "postgres.h" #include "nodes/nodeFuncs.h" -#include "optimizer/clauses.h" #include "optimizer/joininfo.h" #include "optimizer/optimizer.h" #include "optimizer/pathnode.h" #include "optimizer/paths.h" #include "optimizer/planmain.h" #include "optimizer/restrictinfo.h" -#include "optimizer/tlist.h" #include "utils/lsyscache.h" /* local functions */ @@ -293,8 +291,8 @@ join_is_removable(PlannerInfo *root, SpecialJoinInfo *sjinfo) continue; /* not mergejoinable */ /* - * Check if clause has the form "outer op inner" or "inner op outer", - * and if so mark which side is inner. + * Check if the clause has the form "outer op inner" or "inner op + * outer", and if so mark which side is inner. */ if (!clause_sides_match_join(restrictinfo, sjinfo->min_lefthand, innerrel->relids)) @@ -392,6 +390,17 @@ remove_rel_from_query(PlannerInfo *root, int relid, SpecialJoinInfo *sjinfo) { SpecialJoinInfo *sjinf = (SpecialJoinInfo *) lfirst(l); + /* + * initsplan.c is fairly cavalier about allowing SpecialJoinInfos' + * lefthand/righthand relid sets to be shared with other data + * structures. Ensure that we don't modify the original relid sets. + * (The commute_xxx sets are always per-SpecialJoinInfo though.) + */ + sjinf->min_lefthand = bms_copy(sjinf->min_lefthand); + sjinf->min_righthand = bms_copy(sjinf->min_righthand); + sjinf->syn_lefthand = bms_copy(sjinf->syn_lefthand); + sjinf->syn_righthand = bms_copy(sjinf->syn_righthand); + /* Now remove relid and ojrelid bits from the sets: */ sjinf->min_lefthand = bms_del_member(sjinf->min_lefthand, relid); sjinf->min_righthand = bms_del_member(sjinf->min_righthand, relid); sjinf->syn_lefthand = bms_del_member(sjinf->syn_lefthand, relid); @@ -553,8 +562,11 @@ static void remove_rel_from_restrictinfo(RestrictInfo *rinfo, int relid, int ojrelid) { /* - * The clause_relids probably aren't shared with anything else, but let's - * copy them just to be sure. + * initsplan.c is fairly cavalier about allowing RestrictInfos to share + * relid sets with other RestrictInfos, and SpecialJoinInfos too. Make + * sure this RestrictInfo has its own relid sets before we modify them. + * (In present usage, clause_relids is probably not shared, but + * required_relids could be; let's not assume anything.) */ rinfo->clause_relids = bms_copy(rinfo->clause_relids); rinfo->clause_relids = bms_del_member(rinfo->clause_relids, relid); diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 4bb38160b338a..c0af10ebd34c3 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -5,7 +5,7 @@ * Planning is complete, we just need to convert the selected * Path into a Plan. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -29,6 +29,7 @@ #include "optimizer/cost.h" #include "optimizer/optimizer.h" #include "optimizer/paramassign.h" +#include "optimizer/pathnode.h" #include "optimizer/paths.h" #include "optimizer/placeholder.h" #include "optimizer/plancat.h" @@ -40,6 +41,7 @@ #include "parser/parse_clause.h" #include "parser/parsetree.h" #include "partitioning/partprune.h" +#include "tcop/tcopprot.h" #include "utils/lsyscache.h" @@ -311,7 +313,8 @@ static ModifyTable *make_modifytable(PlannerInfo *root, Plan *subplan, List *updateColnosLists, List *withCheckOptionLists, List *returningLists, List *rowMarks, OnConflictExpr *onconflict, - List *mergeActionLists, int epqParam); + List *mergeActionLists, List *mergeJoinConditions, + int epqParam); static GatherMerge *create_gather_merge_plan(PlannerInfo *root, GatherMergePath *best_path); @@ -599,8 +602,27 @@ create_scan_plan(PlannerInfo *root, Path *best_path, int flags) * Detect whether we have any pseudoconstant quals to deal with. Then, if * we'll need a gating Result node, it will be able to project, so there * are no requirements on the child's tlist. + * + * If this replaces a join, it must be a foreign scan or a custom scan, + * and the FDW or the custom scan provider would have stored in the best + * path the list of RestrictInfo nodes to apply to the join; check against + * that list in that case. */ - gating_clauses = get_gating_quals(root, scan_clauses); + if (IS_JOIN_REL(rel)) + { + List *join_clauses; + + Assert(best_path->pathtype == T_ForeignScan || + best_path->pathtype == T_CustomScan); + if (best_path->pathtype == T_ForeignScan) + join_clauses = ((ForeignPath *) best_path)->fdw_restrictinfo; + else + join_clauses = ((CustomPath *) best_path)->custom_restrictinfo; + + gating_clauses = get_gating_quals(root, join_clauses); + } + else + gating_clauses = get_gating_quals(root, scan_clauses); if (gating_clauses) flags = 0; @@ -2005,7 +2027,7 @@ create_projection_plan(PlannerInfo *root, ProjectionPath *best_path, int flags) * Convert our subpath to a Plan and determine whether we need a Result * node. * - * In most cases where we don't need to project, creation_projection_path + * In most cases where we don't need to project, create_projection_path * will have set dummypp, but not always. First, some createplan.c * routines change the tlists of their nodes. (An example is that * create_merge_append_plan might add resjunk sort columns to a @@ -2623,12 +2645,7 @@ create_windowagg_plan(PlannerInfo *root, WindowAggPath *best_path) /* * Convert SortGroupClause lists into arrays of attr indexes and equality - * operators, as wanted by executor. (Note: in principle, it's possible - * to drop some of the sort columns, if they were proved redundant by - * pathkey logic. However, it doesn't seem worth going out of our way to - * optimize such cases. In any case, we must *not* remove the ordering - * column for RANGE OFFSET cases, as the executor needs that for in_range - * tests even if it's known to be equal to some partitioning column.) + * operators, as wanted by executor. */ partColIdx = (AttrNumber *) palloc(sizeof(AttrNumber) * numPart); partOperators = (Oid *) palloc(sizeof(Oid) * numPart); @@ -2683,7 +2700,7 @@ create_windowagg_plan(PlannerInfo *root, WindowAggPath *best_path) wc->inRangeColl, wc->inRangeAsc, wc->inRangeNullsFirst, - wc->runCondition, + best_path->runCondition, best_path->qual, best_path->topwindow, subplan); @@ -2821,6 +2838,7 @@ create_modifytable_plan(PlannerInfo *root, ModifyTablePath *best_path) best_path->rowMarks, best_path->onconflict, best_path->mergeActionLists, + best_path->mergeJoinConditions, best_path->epqParam); copy_generic_path_info(&plan->plan, &best_path->path); @@ -3706,13 +3724,22 @@ create_subqueryscan_plan(PlannerInfo *root, SubqueryScanPath *best_path, /* Reduce RestrictInfo list to bare expressions; ignore pseudoconstants */ scan_clauses = extract_actual_clauses(scan_clauses, false); - /* Replace any outer-relation variables with nestloop params */ + /* + * Replace any outer-relation variables with nestloop params. + * + * We must provide nestloop params for both lateral references of the + * subquery and outer vars in the scan_clauses. It's better to assign the + * former first, because that code path requires specific param IDs, while + * replace_nestloop_params can adapt to the IDs assigned by + * process_subquery_nestloop_params. This avoids possibly duplicating + * nestloop params when the same Var is needed for both reasons. + */ if (best_path->path.param_info) { - scan_clauses = (List *) - replace_nestloop_params(root, (Node *) scan_clauses); process_subquery_nestloop_params(root, rel->subplan_params); + scan_clauses = (List *) + replace_nestloop_params(root, (Node *) scan_clauses); } scan_plan = make_subqueryscan(tlist, @@ -4332,6 +4359,22 @@ create_nestloop_plan(PlannerInfo *root, List *nestParams; Relids saveOuterRels = root->curOuterRels; + /* + * If the inner path is parameterized by the topmost parent of the outer + * rel rather than the outer rel itself, fix that. (Nothing happens here + * if it is not so parameterized.) + */ + best_path->jpath.innerjoinpath = + reparameterize_path_by_child(root, + best_path->jpath.innerjoinpath, + best_path->jpath.outerjoinpath->parent); + + /* + * Failure here probably means that reparameterize_path_by_child() is not + * in sync with path_is_reparameterizable_by_child(). + */ + Assert(best_path->jpath.innerjoinpath != NULL); + /* NestLoop can project, so no need to be picky about child tlists */ outer_plan = create_plan_recurse(root, best_path->jpath.outerjoinpath, 0); @@ -6486,6 +6529,8 @@ materialize_finished_plan(Plan *subplan) { Plan *matplan; Path matpath; /* dummy for result of cost_material */ + Cost initplan_cost; + bool unsafe_initplans; matplan = (Plan *) make_material(subplan); @@ -6493,20 +6538,25 @@ materialize_finished_plan(Plan *subplan) * XXX horrid kluge: if there are any initPlans attached to the subplan, * move them up to the Material node, which is now effectively the top * plan node in its query level. This prevents failure in - * SS_finalize_plan(), which see for comments. We don't bother adjusting - * the subplan's cost estimate for this. + * SS_finalize_plan(), which see for comments. */ matplan->initPlan = subplan->initPlan; subplan->initPlan = NIL; + /* Move the initplans' cost delta, as well */ + SS_compute_initplan_cost(matplan->initPlan, + &initplan_cost, &unsafe_initplans); + subplan->startup_cost -= initplan_cost; + subplan->total_cost -= initplan_cost; + /* Set cost data */ cost_material(&matpath, subplan->startup_cost, subplan->total_cost, subplan->plan_rows, subplan->plan_width); - matplan->startup_cost = matpath.startup_cost; - matplan->total_cost = matpath.total_cost; + matplan->startup_cost = matpath.startup_cost + initplan_cost; + matplan->total_cost = matpath.total_cost + initplan_cost; matplan->plan_rows = subplan->plan_rows; matplan->plan_width = subplan->plan_width; matplan->parallel_aware = false; @@ -6984,7 +7034,8 @@ make_modifytable(PlannerInfo *root, Plan *subplan, List *updateColnosLists, List *withCheckOptionLists, List *returningLists, List *rowMarks, OnConflictExpr *onconflict, - List *mergeActionLists, int epqParam) + List *mergeActionLists, List *mergeJoinConditions, + int epqParam) { ModifyTable *node = makeNode(ModifyTable); List *fdw_private_list; @@ -7054,6 +7105,7 @@ make_modifytable(PlannerInfo *root, Plan *subplan, node->returningLists = returningLists; node->rowMarks = rowMarks; node->mergeActionLists = mergeActionLists; + node->mergeJoinConditions = mergeJoinConditions; node->epqParam = epqParam; /* @@ -7090,7 +7142,19 @@ make_modifytable(PlannerInfo *root, Plan *subplan, if (rte->rtekind == RTE_RELATION && rte->relkind == RELKIND_FOREIGN_TABLE) + { + /* Check if the access to foreign tables is restricted */ + if (unlikely((restrict_nonsystem_relation_kind & RESTRICT_RELKIND_FOREIGN_TABLE) != 0)) + { + /* there must not be built-in foreign tables */ + Assert(rte->relid >= FirstNormalObjectId); + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("access to non-system foreign table is restricted"))); + } + fdwroutine = GetFdwRoutineByRelId(rte->relid); + } else fdwroutine = NULL; } diff --git a/src/backend/optimizer/plan/initsplan.c b/src/backend/optimizer/plan/initsplan.c index b31d8921211e0..0d748973a4eb2 100644 --- a/src/backend/optimizer/plan/initsplan.c +++ b/src/backend/optimizer/plan/initsplan.c @@ -3,7 +3,7 @@ * initsplan.c * Target list, qualification, joininfo initialization routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -14,7 +14,6 @@ */ #include "postgres.h" -#include "catalog/pg_class.h" #include "catalog/pg_type.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" @@ -28,11 +27,11 @@ #include "optimizer/placeholder.h" #include "optimizer/planmain.h" #include "optimizer/planner.h" -#include "optimizer/prep.h" #include "optimizer/restrictinfo.h" #include "parser/analyze.h" #include "rewrite/rewriteManip.h" #include "utils/lsyscache.h" +#include "utils/rel.h" #include "utils/typcache.h" /* These parameters are set by GUC */ @@ -1928,8 +1927,8 @@ deconstruct_distribute_oj_quals(PlannerInfo *root, * jtitems list to be ordered that way. * * We first strip out all the nullingrels bits corresponding to - * commutating joins below this one, and then successively put them - * back as we crawl up the join stack. + * commuting joins below this one, and then successively put them back + * as we crawl up the join stack. */ quals = jtitem->oj_joinclauses; if (!bms_is_empty(joins_below)) @@ -2618,6 +2617,252 @@ check_redundant_nullability_qual(PlannerInfo *root, Node *clause) return false; } +/* + * add_base_clause_to_rel + * Add 'restrictinfo' as a baserestrictinfo to the base relation denoted + * by 'relid'. We offer some simple prechecks to try to determine if the + * qual is always true, in which case we ignore it rather than add it. + * If we detect the qual is always false, we replace it with + * constant-FALSE. + */ +static void +add_base_clause_to_rel(PlannerInfo *root, Index relid, + RestrictInfo *restrictinfo) +{ + RelOptInfo *rel = find_base_rel(root, relid); + RangeTblEntry *rte = root->simple_rte_array[relid]; + + Assert(bms_membership(restrictinfo->required_relids) == BMS_SINGLETON); + + /* + * For inheritance parent tables, we must always record the RestrictInfo + * in baserestrictinfo as is. If we were to transform or skip adding it, + * then the original wouldn't be available in apply_child_basequals. Since + * there are two RangeTblEntries for inheritance parents, one with + * inh==true and the other with inh==false, we're still able to apply this + * optimization to the inh==false one. The inh==true one is what + * apply_child_basequals() sees, whereas the inh==false one is what's used + * for the scan node in the final plan. + * + * We make an exception to this for partitioned tables. For these, we + * always apply the constant-TRUE and constant-FALSE transformations. A + * qual which is either of these for a partitioned table must also be that + * for all of its child partitions. + */ + if (!rte->inh || rte->relkind == RELKIND_PARTITIONED_TABLE) + { + /* Don't add the clause if it is always true */ + if (restriction_is_always_true(root, restrictinfo)) + return; + + /* + * Substitute the origin qual with constant-FALSE if it is provably + * always false. + * + * Note that we need to keep the same rinfo_serial, since it is in + * practice the same condition. We also need to reset the + * last_rinfo_serial counter, which is essential to ensure that the + * RestrictInfos for the "same" qual condition get identical serial + * numbers (see deconstruct_distribute_oj_quals). + */ + if (restriction_is_always_false(root, restrictinfo)) + { + int save_rinfo_serial = restrictinfo->rinfo_serial; + int save_last_rinfo_serial = root->last_rinfo_serial; + + restrictinfo = make_restrictinfo(root, + (Expr *) makeBoolConst(false, false), + restrictinfo->is_pushed_down, + restrictinfo->has_clone, + restrictinfo->is_clone, + restrictinfo->pseudoconstant, + 0, /* security_level */ + restrictinfo->required_relids, + restrictinfo->incompatible_relids, + restrictinfo->outer_relids); + restrictinfo->rinfo_serial = save_rinfo_serial; + root->last_rinfo_serial = save_last_rinfo_serial; + } + } + + /* Add clause to rel's restriction list */ + rel->baserestrictinfo = lappend(rel->baserestrictinfo, restrictinfo); + + /* Update security level info */ + rel->baserestrict_min_security = Min(rel->baserestrict_min_security, + restrictinfo->security_level); +} + +/* + * expr_is_nonnullable + * Check to see if the Expr cannot be NULL + * + * If the Expr is a simple Var that is defined NOT NULL and meanwhile is not + * nulled by any outer joins, then we can know that it cannot be NULL. + */ +static bool +expr_is_nonnullable(PlannerInfo *root, Expr *expr) +{ + RelOptInfo *rel; + Var *var; + + /* For now only check simple Vars */ + if (!IsA(expr, Var)) + return false; + + var = (Var *) expr; + + /* could the Var be nulled by any outer joins? */ + if (!bms_is_empty(var->varnullingrels)) + return false; + + /* system columns cannot be NULL */ + if (var->varattno < 0) + return true; + + /* is the column defined NOT NULL? */ + rel = find_base_rel(root, var->varno); + if (var->varattno > 0 && + bms_is_member(var->varattno, rel->notnullattnums)) + return true; + + return false; +} + +/* + * restriction_is_always_true + * Check to see if the RestrictInfo is always true. + * + * Currently we only check for NullTest quals and OR clauses that include + * NullTest quals. We may extend it in the future. + */ +bool +restriction_is_always_true(PlannerInfo *root, + RestrictInfo *restrictinfo) +{ + /* + * For a clone clause, we don't have a reliable way to determine if the + * input expression of a NullTest is non-nullable: nullingrel bits in + * clone clauses may not reflect reality, so we dare not draw conclusions + * from clones about whether Vars are guaranteed not-null. + */ + if (restrictinfo->has_clone || restrictinfo->is_clone) + return false; + + /* Check for NullTest qual */ + if (IsA(restrictinfo->clause, NullTest)) + { + NullTest *nulltest = (NullTest *) restrictinfo->clause; + + /* is this NullTest an IS_NOT_NULL qual? */ + if (nulltest->nulltesttype != IS_NOT_NULL) + return false; + + /* + * Empty rows can appear NULL in some contexts and NOT NULL in others, + * so avoid this optimization for row expressions. + */ + if (nulltest->argisrow) + return false; + + return expr_is_nonnullable(root, nulltest->arg); + } + + /* If it's an OR, check its sub-clauses */ + if (restriction_is_or_clause(restrictinfo)) + { + ListCell *lc; + + Assert(is_orclause(restrictinfo->orclause)); + + /* + * if any of the given OR branches is provably always true then the + * entire condition is true. + */ + foreach(lc, ((BoolExpr *) restrictinfo->orclause)->args) + { + Node *orarg = (Node *) lfirst(lc); + + if (!IsA(orarg, RestrictInfo)) + continue; + + if (restriction_is_always_true(root, (RestrictInfo *) orarg)) + return true; + } + } + + return false; +} + +/* + * restriction_is_always_false + * Check to see if the RestrictInfo is always false. + * + * Currently we only check for NullTest quals and OR clauses that include + * NullTest quals. We may extend it in the future. + */ +bool +restriction_is_always_false(PlannerInfo *root, + RestrictInfo *restrictinfo) +{ + /* + * For a clone clause, we don't have a reliable way to determine if the + * input expression of a NullTest is non-nullable: nullingrel bits in + * clone clauses may not reflect reality, so we dare not draw conclusions + * from clones about whether Vars are guaranteed not-null. + */ + if (restrictinfo->has_clone || restrictinfo->is_clone) + return false; + + /* Check for NullTest qual */ + if (IsA(restrictinfo->clause, NullTest)) + { + NullTest *nulltest = (NullTest *) restrictinfo->clause; + + /* is this NullTest an IS_NULL qual? */ + if (nulltest->nulltesttype != IS_NULL) + return false; + + /* + * Empty rows can appear NULL in some contexts and NOT NULL in others, + * so avoid this optimization for row expressions. + */ + if (nulltest->argisrow) + return false; + + return expr_is_nonnullable(root, nulltest->arg); + } + + /* If it's an OR, check its sub-clauses */ + if (restriction_is_or_clause(restrictinfo)) + { + ListCell *lc; + + Assert(is_orclause(restrictinfo->orclause)); + + /* + * Currently, when processing OR expressions, we only return true when + * all of the OR branches are always false. This could perhaps be + * expanded to remove OR branches that are provably false. This may + * be a useful thing to do as it could result in the OR being left + * with a single arg. That's useful as it would allow the OR + * condition to be replaced with its single argument which may allow + * use of an index for faster filtering on the remaining condition. + */ + foreach(lc, ((BoolExpr *) restrictinfo->orclause)->args) + { + Node *orarg = (Node *) lfirst(lc); + + if (!IsA(orarg, RestrictInfo) || + !restriction_is_always_false(root, (RestrictInfo *) orarg)) + return false; + } + return true; + } + + return false; +} + /* * distribute_restrictinfo_to_rels * Push a completed RestrictInfo into the proper restriction or join @@ -2632,27 +2877,21 @@ distribute_restrictinfo_to_rels(PlannerInfo *root, RestrictInfo *restrictinfo) { Relids relids = restrictinfo->required_relids; - RelOptInfo *rel; - switch (bms_membership(relids)) + if (!bms_is_empty(relids)) { - case BMS_SINGLETON: + int relid; + if (bms_get_singleton_member(relids, &relid)) + { /* * There is only one relation participating in the clause, so it * is a restriction clause for that relation. */ - rel = find_base_rel(root, bms_singleton_member(relids)); - - /* Add clause to rel's restriction list */ - rel->baserestrictinfo = lappend(rel->baserestrictinfo, - restrictinfo); - /* Update security level info */ - rel->baserestrict_min_security = Min(rel->baserestrict_min_security, - restrictinfo->security_level); - break; - case BMS_MULTIPLE: - + add_base_clause_to_rel(root, relid, restrictinfo); + } + else + { /* * The clause is a join clause, since there is more than one rel * in its relid set. @@ -2675,15 +2914,15 @@ distribute_restrictinfo_to_rels(PlannerInfo *root, * Add clause to the join lists of all the relevant relations. */ add_join_clause_to_rels(root, restrictinfo, relids); - break; - default: - - /* - * clause references no rels, and therefore we have no place to - * attach it. Shouldn't get here if callers are working properly. - */ - elog(ERROR, "cannot cope with variable-free clause"); - break; + } + } + else + { + /* + * clause references no rels, and therefore we have no place to attach + * it. Shouldn't get here if callers are working properly. + */ + elog(ERROR, "cannot cope with variable-free clause"); } } diff --git a/src/backend/optimizer/plan/meson.build b/src/backend/optimizer/plan/meson.build index ddcad0543a557..c3b191cdf8199 100644 --- a/src/backend/optimizer/plan/meson.build +++ b/src/backend/optimizer/plan/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'analyzejoins.c', diff --git a/src/backend/optimizer/plan/planagg.c b/src/backend/optimizer/plan/planagg.c index a6090167f5acc..afb5445b77b94 100644 --- a/src/backend/optimizer/plan/planagg.c +++ b/src/backend/optimizer/plan/planagg.c @@ -17,7 +17,7 @@ * scan all the rows anyway. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -33,7 +33,6 @@ #include "catalog/pg_type.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" -#include "optimizer/clauses.h" #include "optimizer/cost.h" #include "optimizer/optimizer.h" #include "optimizer/pathnode.h" diff --git a/src/backend/optimizer/plan/planmain.c b/src/backend/optimizer/plan/planmain.c index 7afd434c60158..e17d31a5c3ec3 100644 --- a/src/backend/optimizer/plan/planmain.c +++ b/src/backend/optimizer/plan/planmain.c @@ -9,7 +9,7 @@ * shorn of features like subselects, inheritance, aggregates, grouping, * and so on. (Those are the things planner.c deals with.) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,7 +22,6 @@ #include "optimizer/appendinfo.h" #include "optimizer/clauses.h" -#include "optimizer/inherit.h" #include "optimizer/optimizer.h" #include "optimizer/orclauses.h" #include "optimizer/pathnode.h" @@ -112,14 +111,17 @@ query_planner(PlannerInfo *root, * quals are parallel-restricted. (We need not check * final_rel->reltarget because it's empty at this point. * Anything parallel-restricted in the query tlist will be - * dealt with later.) This is normally pretty silly, because - * a Result-only plan would never be interesting to - * parallelize. However, if debug_parallel_query is on, then - * we want to execute the Result in a parallel worker if - * possible, so we must do this. + * dealt with later.) We should always do this in a subquery, + * since it might be useful to use the subquery in parallel + * paths in the parent level. At top level this is normally + * not worth the cycles, because a Result-only plan would + * never be interesting to parallelize. However, if + * debug_parallel_query is on, then we want to execute the + * Result in a parallel worker if possible, so we must check. */ if (root->glob->parallelModeOK && - debug_parallel_query != DEBUG_PARALLEL_OFF) + (root->query_level > 1 || + debug_parallel_query != DEBUG_PARALLEL_OFF)) final_rel->consider_parallel = is_parallel_safe(root, parse->jointree->quals); diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 1e4dd27dbafbe..72a26695f06b6 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -3,7 +3,7 @@ * planner.c * The query optimizer external interface. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,18 +19,15 @@ #include #include "access/genam.h" -#include "access/htup_details.h" #include "access/parallel.h" #include "access/sysattr.h" #include "access/table.h" -#include "access/xact.h" #include "catalog/pg_aggregate.h" #include "catalog/pg_constraint.h" #include "catalog/pg_inherits.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "executor/executor.h" -#include "executor/nodeAgg.h" #include "foreign/fdwapi.h" #include "jit/jit.h" #include "lib/bipartite_match.h" @@ -45,7 +42,6 @@ #include "optimizer/appendinfo.h" #include "optimizer/clauses.h" #include "optimizer/cost.h" -#include "optimizer/inherit.h" #include "optimizer/optimizer.h" #include "optimizer/paramassign.h" #include "optimizer/pathnode.h" @@ -58,15 +54,13 @@ #include "optimizer/tlist.h" #include "parser/analyze.h" #include "parser/parse_agg.h" +#include "parser/parse_clause.h" #include "parser/parse_relation.h" #include "parser/parsetree.h" #include "partitioning/partdesc.h" -#include "rewrite/rewriteManip.h" -#include "storage/dsm_impl.h" #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/selfuncs.h" -#include "utils/syscache.h" /* GUC parameters */ double cursor_tuple_fraction = DEFAULT_CURSOR_TUPLE_FRACTION; @@ -126,12 +120,15 @@ typedef struct { List *activeWindows; /* active windows, if any */ grouping_sets_data *gset_data; /* grouping sets data, if any */ + SetOperationStmt *setop; /* parent set operation or NULL if not a + * subquery belonging to a set operation */ } standard_qp_extra; /* Local functions */ static Node *preprocess_expression(PlannerInfo *root, Node *expr, int kind); static void preprocess_qual_conditions(PlannerInfo *root, Node *jtnode); -static void grouping_planner(PlannerInfo *root, double tuple_fraction); +static void grouping_planner(PlannerInfo *root, double tuple_fraction, + SetOperationStmt *setops); static grouping_sets_data *preprocess_grouping_sets(PlannerInfo *root); static List *remap_to_groupclause_idx(List *groupClause, List *gsets, int *tleref_to_colnum_map); @@ -190,10 +187,12 @@ static void create_one_window_path(PlannerInfo *root, WindowFuncLists *wflists, List *activeWindows); static RelOptInfo *create_distinct_paths(PlannerInfo *root, - RelOptInfo *input_rel); + RelOptInfo *input_rel, + PathTarget *target); static void create_partial_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel, - RelOptInfo *final_distinct_rel); + RelOptInfo *final_distinct_rel, + PathTarget *target); static RelOptInfo *create_final_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel, RelOptInfo *distinct_rel); @@ -254,6 +253,8 @@ static bool group_by_has_partkey(RelOptInfo *input_rel, List *targetList, List *groupClause); static int common_prefix_cmp(const void *a, const void *b); +static List *generate_setop_child_grouplist(SetOperationStmt *op, + List *targetlist); /***************************************************************************** @@ -306,6 +307,7 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions, glob->boundParams = boundParams; glob->subplans = NIL; + glob->subpaths = NIL; glob->subroots = NIL; glob->rewindPlanIDs = NULL; glob->finalrtable = NIL; @@ -330,11 +332,13 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions, * functions are present in the query tree. * * (Note that we do allow CREATE TABLE AS, SELECT INTO, and CREATE - * MATERIALIZED VIEW to use parallel plans, but as of now, only the leader - * backend writes into a completely new table. In the future, we can - * extend it to allow workers to write into the table. However, to allow - * parallel updates and deletes, we have to solve other problems, - * especially around combo CIDs.) + * MATERIALIZED VIEW to use parallel plans, but this is safe only because + * the command is writing into a completely new table which workers won't + * be able to see. If the workers could see the table, the fact that + * group locking would cause them to ignore the leader's heavyweight GIN + * page locks would make this unsafe. We'll have to fix that somehow if + * we want to allow parallel inserts in general; updates and deletes have + * additional problems especially around combo CIDs.) * * For now, we don't try to use parallel mode if we're running inside a * parallel worker. We might eventually be able to relax this @@ -408,8 +412,7 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions, } /* primary planning entry point (may recurse for subqueries) */ - root = subquery_planner(glob, parse, NULL, - false, tuple_fraction); + root = subquery_planner(glob, parse, NULL, false, tuple_fraction, NULL); /* Select best Path and turn it into a Plan */ final_rel = fetch_upper_rel(root, UPPERREL_FINAL, NULL); @@ -430,16 +433,23 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions, /* * Optionally add a Gather node for testing purposes, provided this is * actually a safe thing to do. - */ - if (debug_parallel_query != DEBUG_PARALLEL_OFF && top_plan->parallel_safe) + * + * We can add Gather even when top_plan has parallel-safe initPlans, but + * then we have to move the initPlans to the Gather node because of + * SS_finalize_plan's limitations. That would cause cosmetic breakage of + * regression tests when debug_parallel_query = regress, because initPlans + * that would normally appear on the top_plan move to the Gather, causing + * them to disappear from EXPLAIN output. That doesn't seem worth kluging + * EXPLAIN to hide, so skip it when debug_parallel_query = regress. + */ + if (debug_parallel_query != DEBUG_PARALLEL_OFF && + top_plan->parallel_safe && + (top_plan->initPlan == NIL || + debug_parallel_query != DEBUG_PARALLEL_REGRESS)) { Gather *gather = makeNode(Gather); - - /* - * Top plan must not have any initPlans, else it shouldn't have been - * marked parallel-safe. - */ - Assert(top_plan->initPlan == NIL); + Cost initplan_cost; + bool unsafe_initplans; gather->plan.targetlist = top_plan->targetlist; gather->plan.qual = NIL; @@ -449,6 +459,10 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions, gather->single_copy = true; gather->invisible = (debug_parallel_query == DEBUG_PARALLEL_REGRESS); + /* Transfer any initPlans to the new top node */ + gather->plan.initPlan = top_plan->initPlan; + top_plan->initPlan = NIL; + /* * Since this Gather has no parallel-aware descendants to signal to, * we don't need a rescan Param. @@ -468,6 +482,15 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions, gather->plan.parallel_aware = false; gather->plan.parallel_safe = false; + /* + * Delete the initplans' cost from top_plan. We needn't add it to the + * Gather node, since the above coding already included it there. + */ + SS_compute_initplan_cost(gather->plan.initPlan, + &initplan_cost, &unsafe_initplans); + top_plan->startup_cost -= initplan_cost; + top_plan->total_cost -= initplan_cost; + /* use parallel mode for parallel plans. */ root->glob->parallelModeNeeded = true; @@ -580,6 +603,10 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions, * hasRecursion is true if this is a recursive WITH query. * tuple_fraction is the fraction of tuples we expect will be retrieved. * tuple_fraction is interpreted as explained for grouping_planner, below. + * setops is used for set operation subqueries to provide the subquery with + * the context in which it's being used so that Paths correctly sorted for the + * set operation can be generated. NULL when not planning a set operation + * child. * * Basically, this routine does the stuff that should only be done once * per Query object. It then calls grouping_planner. At one time, @@ -598,9 +625,9 @@ standard_planner(Query *parse, const char *query_string, int cursorOptions, *-------------------- */ PlannerInfo * -subquery_planner(PlannerGlobal *glob, Query *parse, - PlannerInfo *parent_root, - bool hasRecursion, double tuple_fraction) +subquery_planner(PlannerGlobal *glob, Query *parse, PlannerInfo *parent_root, + bool hasRecursion, double tuple_fraction, + SetOperationStmt *setops) { PlannerInfo *root; List *newWithCheckOptions; @@ -843,9 +870,6 @@ subquery_planner(PlannerGlobal *glob, Query *parse, EXPRKIND_LIMIT); wc->endOffset = preprocess_expression(root, wc->endOffset, EXPRKIND_LIMIT); - wc->runCondition = (List *) preprocess_expression(root, - (Node *) wc->runCondition, - EXPRKIND_TARGET); } parse->limitOffset = preprocess_expression(root, parse->limitOffset, @@ -888,6 +912,9 @@ subquery_planner(PlannerGlobal *glob, Query *parse, EXPRKIND_QUAL); } + parse->mergeJoinCondition = + preprocess_expression(root, parse->mergeJoinCondition, EXPRKIND_QUAL); + root->append_rel_list = (List *) preprocess_expression(root, (Node *) root->append_rel_list, EXPRKIND_APPINFO); @@ -1059,7 +1086,7 @@ subquery_planner(PlannerGlobal *glob, Query *parse, /* * Do the main planning. */ - grouping_planner(root, tuple_fraction); + grouping_planner(root, tuple_fraction, setops); /* * Capture the set of outer-level param IDs we have access to, for use in @@ -1257,7 +1284,11 @@ preprocess_phv_expression(PlannerInfo *root, Expr *expr) * 0 < tuple_fraction < 1: expect the given fraction of tuples available * from the plan to be retrieved * tuple_fraction >= 1: tuple_fraction is the absolute number of tuples - * expected to be retrieved (ie, a LIMIT specification) + * expected to be retrieved (ie, a LIMIT specification). + * setops is used for set operation subqueries to provide the subquery with + * the context in which it's being used so that Paths correctly sorted for the + * set operation can be generated. NULL when not planning a set operation + * child. * * Returns nothing; the useful output is in the Paths we attach to the * (UPPERREL_FINAL, NULL) upperrel in *root. In addition, @@ -1268,7 +1299,8 @@ preprocess_phv_expression(PlannerInfo *root, Expr *expr) *-------------------- */ static void -grouping_planner(PlannerInfo *root, double tuple_fraction) +grouping_planner(PlannerInfo *root, double tuple_fraction, + SetOperationStmt *setops) { Query *parse = root->parse; int64 offset_est = 0; @@ -1303,17 +1335,6 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) if (parse->setOperations) { - /* - * If there's a top-level ORDER BY, assume we have to fetch all the - * tuples. This might be too simplistic given all the hackery below - * to possibly avoid the sort; but the odds of accurate estimates here - * are pretty low anyway. XXX try to get rid of this in favor of - * letting plan_set_operations generate both fast-start and - * cheapest-total paths. - */ - if (parse->sortClause) - root->tuple_fraction = 0.0; - /* * Construct Paths for set operations. The results will not need any * work except perhaps a top-level sort and/or LIMIT. Note that any @@ -1483,6 +1504,12 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) qp_extra.activeWindows = activeWindows; qp_extra.gset_data = gset_data; + /* + * If we're a subquery for a set operation, store the SetOperationStmt + * in qp_extra. + */ + qp_extra.setop = setops; + /* * Generate the best unsorted and presorted paths for the scan/join * portion of this Query, ie the processing represented by the @@ -1622,8 +1649,8 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) */ root->upper_targets[UPPERREL_FINAL] = final_target; root->upper_targets[UPPERREL_ORDERED] = final_target; - root->upper_targets[UPPERREL_PARTIAL_DISTINCT] = sort_input_target; root->upper_targets[UPPERREL_DISTINCT] = sort_input_target; + root->upper_targets[UPPERREL_PARTIAL_DISTINCT] = sort_input_target; root->upper_targets[UPPERREL_WINDOW] = sort_input_target; root->upper_targets[UPPERREL_GROUP_AGG] = grouping_target; @@ -1673,7 +1700,8 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) if (parse->distinctClause) { current_rel = create_distinct_paths(root, - current_rel); + current_rel, + sort_input_target); } } /* end of if (setOperations) */ @@ -1769,6 +1797,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) List *withCheckOptionLists = NIL; List *returningLists = NIL; List *mergeActionLists = NIL; + List *mergeJoinConditions = NIL; List *rowMarks; if (bms_membership(root->all_result_relids) == BMS_MULTIPLE) @@ -1778,6 +1807,9 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) parse->resultRelation); int resultRelation = -1; + /* Pass the root result rel forward to the executor. */ + rootRelation = parse->resultRelation; + /* Add only leaf children to ModifyTable. */ while ((resultRelation = bms_next_member(root->leaf_result_relids, resultRelation)) >= 0) @@ -1872,6 +1904,19 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) mergeActionLists = lappend(mergeActionLists, mergeActionList); } + if (parse->commandType == CMD_MERGE) + { + Node *mergeJoinCondition = parse->mergeJoinCondition; + + if (this_result_rel != top_result_rel) + mergeJoinCondition = + adjust_appendrel_attrs_multilevel(root, + mergeJoinCondition, + this_result_rel, + top_result_rel); + mergeJoinConditions = lappend(mergeJoinConditions, + mergeJoinCondition); + } } if (resultRelations == NIL) @@ -1896,11 +1941,14 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) returningLists = list_make1(parse->returningList); if (parse->mergeActionList) mergeActionLists = list_make1(parse->mergeActionList); + if (parse->commandType == CMD_MERGE) + mergeJoinConditions = list_make1(parse->mergeJoinCondition); } } else { /* Single-relation INSERT/UPDATE/DELETE/MERGE. */ + rootRelation = 0; /* there's no separate root rel */ resultRelations = list_make1_int(parse->resultRelation); if (parse->commandType == CMD_UPDATE) updateColnosLists = list_make1(root->update_colnos); @@ -1910,18 +1958,10 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) returningLists = list_make1(parse->returningList); if (parse->mergeActionList) mergeActionLists = list_make1(parse->mergeActionList); + if (parse->commandType == CMD_MERGE) + mergeJoinConditions = list_make1(parse->mergeJoinCondition); } - /* - * If target is a partition root table, we need to mark the - * ModifyTable node appropriately for that. - */ - if (rt_fetch(parse->resultRelation, parse->rtable)->relkind == - RELKIND_PARTITIONED_TABLE) - rootRelation = parse->resultRelation; - else - rootRelation = 0; - /* * If there was a FOR [KEY] UPDATE/SHARE clause, the LockRows node * will have dealt with fetching non-locked marked rows, else we @@ -1947,6 +1987,7 @@ grouping_planner(PlannerInfo *root, double tuple_fraction) rowMarks, parse->onConflict, mergeActionLists, + mergeJoinConditions, assign_special_exec_param(root)); } @@ -2240,11 +2281,12 @@ preprocess_rowmarks(PlannerInfo *root) else { /* - * We only need rowmarks for UPDATE, DELETE, or FOR [KEY] + * We only need rowmarks for UPDATE, DELETE, MERGE, or FOR [KEY] * UPDATE/SHARE. */ if (parse->commandType != CMD_UPDATE && - parse->commandType != CMD_DELETE) + parse->commandType != CMD_DELETE && + parse->commandType != CMD_MERGE) return; } @@ -2785,11 +2827,13 @@ remove_useless_groupby_columns(PlannerInfo *root) * (which in itself is semantically insignificant) to match ORDER BY, * thereby allowing a single sort operation to both implement the ORDER BY * requirement and set up for a Unique step that implements GROUP BY. + * We also consider partial match between GROUP BY and ORDER BY elements, + * which could allow to implement ORDER BY using the incremental sort. * - * In principle it might be interesting to consider other orderings of the - * GROUP BY elements, which could match the sort ordering of other - * possible plans (eg an indexscan) and thereby reduce cost. We don't - * bother with that, though. Hashed grouping will frequently win anyway. + * We also consider other orderings of the GROUP BY elements, which could + * match the sort ordering of other possible plans (eg an indexscan) and + * thereby reduce cost. This is implemented during the generation of grouping + * paths. See get_useful_group_keys_orderings() for details. * * Note: we need no comparable processing of the distinctClause because * the parser already enforced that that matches ORDER BY. @@ -2808,7 +2852,6 @@ preprocess_groupclause(PlannerInfo *root, List *force) { Query *parse = root->parse; List *new_groupclause = NIL; - bool partial_match; ListCell *sl; ListCell *gl; @@ -2854,20 +2897,16 @@ preprocess_groupclause(PlannerInfo *root, List *force) break; /* no match, so stop scanning */ } - /* Did we match all of the ORDER BY list, or just some of it? */ - partial_match = (sl != NULL); /* If no match at all, no point in reordering GROUP BY */ if (new_groupclause == NIL) return list_copy(parse->groupClause); /* - * Add any remaining GROUP BY items to the new list, but only if we were - * able to make a complete match. In other words, we only rearrange the - * GROUP BY list if the result is that one list is a prefix of the other - * --- otherwise there's no possibility of a common sort. Also, give up - * if there are any non-sortable GROUP BY items, since then there's no - * hope anyway. + * Add any remaining GROUP BY items to the new list. We don't require a + * complete match, because even partial match allows ORDER BY to be + * implemented using incremental sort. Also, give up if there are any + * non-sortable GROUP BY items, since then there's no hope anyway. */ foreach(gl, parse->groupClause) { @@ -2875,8 +2914,6 @@ preprocess_groupclause(PlannerInfo *root, List *force) if (list_member_ptr(new_groupclause, gc)) continue; /* it matched an ORDER BY item */ - if (partial_match) /* give up, no common sort possible */ - return list_copy(parse->groupClause); if (!OidIsValid(gc->sortop)) /* give up, GROUP BY can't be sorted */ return list_copy(parse->groupClause); new_groupclause = lappend(new_groupclause, gc); @@ -3243,10 +3280,53 @@ adjust_group_pathkeys_for_groupagg(PlannerInfo *root) if (AGGKIND_IS_ORDERED_SET(aggref->aggkind)) continue; - /* only add aggregates with a DISTINCT or ORDER BY */ - if (aggref->aggdistinct != NIL || aggref->aggorder != NIL) - unprocessed_aggs = bms_add_member(unprocessed_aggs, - foreach_current_index(lc)); + /* Skip unless there's a DISTINCT or ORDER BY clause */ + if (aggref->aggdistinct == NIL && aggref->aggorder == NIL) + continue; + + /* Additional safety checks are needed if there's a FILTER clause */ + if (aggref->aggfilter != NULL) + { + ListCell *lc2; + bool allow_presort = true; + + /* + * When the Aggref has a FILTER clause, it's possible that the + * filter removes rows that cannot be sorted because the + * expression to sort by results in an error during its + * evaluation. This is a problem for presorting as that happens + * before the FILTER, whereas without presorting, the Aggregate + * node will apply the FILTER *before* sorting. So that we never + * try to sort anything that might error, here we aim to skip over + * any Aggrefs with arguments with expressions which, when + * evaluated, could cause an ERROR. Vars and Consts are ok. There + * may be more cases that should be allowed, but more thought + * needs to be given. Err on the side of caution. + */ + foreach(lc2, aggref->args) + { + TargetEntry *tle = (TargetEntry *) lfirst(lc2); + Expr *expr = tle->expr; + + while (IsA(expr, RelabelType)) + expr = (Expr *) (castNode(RelabelType, expr))->arg; + + /* Common case, Vars and Consts are ok */ + if (IsA(expr, Var) || IsA(expr, Const)) + continue; + + /* Unsupported. Don't try to presort for this Aggref */ + allow_presort = false; + break; + } + + /* Skip unsupported Aggrefs */ + if (!allow_presort) + continue; + } + + unprocessed_aggs = bms_add_member(unprocessed_aggs, + foreach_current_index(lc)); } /* @@ -3440,12 +3520,17 @@ standard_qp_callback(PlannerInfo *root, void *extra) */ bool sortable; + /* + * Convert group clauses into pathkeys. Set the ec_sortref field of + * EquivalenceClass'es if it's not set yet. + */ root->group_pathkeys = make_pathkeys_for_sortclauses_extended(root, &root->processed_groupClause, tlist, true, - &sortable); + &sortable, + true); if (!sortable) { /* Can't sort; no point in considering aggregate ordering either */ @@ -3495,7 +3580,8 @@ standard_qp_callback(PlannerInfo *root, void *extra) &root->processed_distinctClause, tlist, true, - &sortable); + &sortable, + false); if (!sortable) root->distinct_pathkeys = NIL; } @@ -3507,6 +3593,28 @@ standard_qp_callback(PlannerInfo *root, void *extra) parse->sortClause, tlist); + /* setting setop_pathkeys might be useful to the union planner */ + if (qp_extra->setop != NULL && + set_operation_ordered_results_useful(qp_extra->setop)) + { + List *groupClauses; + bool sortable; + + groupClauses = generate_setop_child_grouplist(qp_extra->setop, tlist); + + root->setop_pathkeys = + make_pathkeys_for_sortclauses_extended(root, + &groupClauses, + tlist, + false, + &sortable, + false); + if (!sortable) + root->setop_pathkeys = NIL; + } + else + root->setop_pathkeys = NIL; + /* * Figure out whether we want a sorted result from query_planner. * @@ -3516,7 +3624,9 @@ standard_qp_callback(PlannerInfo *root, void *extra) * sortable DISTINCT clause that's more rigorous than the ORDER BY clause, * we try to produce output that's sufficiently well sorted for the * DISTINCT. Otherwise, if there is an ORDER BY clause, we want to sort - * by the ORDER BY clause. + * by the ORDER BY clause. Otherwise, if we're a subquery being planned + * for a set operation which can benefit from presorted results and have a + * sortable targetlist, we want to sort by the target list. * * Note: if we have both ORDER BY and GROUP BY, and ORDER BY is a superset * of GROUP BY, it would be tempting to request sort by ORDER BY --- but @@ -3534,6 +3644,8 @@ standard_qp_callback(PlannerInfo *root, void *extra) root->query_pathkeys = root->distinct_pathkeys; else if (root->sort_pathkeys) root->query_pathkeys = root->sort_pathkeys; + else if (root->setop_pathkeys != NIL) + root->query_pathkeys = root->setop_pathkeys; else root->query_pathkeys = NIL; } @@ -3948,9 +4060,10 @@ create_ordinary_grouping_paths(PlannerInfo *root, RelOptInfo *input_rel, * If this is the topmost relation or if the parent relation is doing * full partitionwise aggregation, then we can do full partitionwise * aggregation provided that the GROUP BY clause contains all of the - * partitioning columns at this level. Otherwise, we can do at most - * partial partitionwise aggregation. But if partial aggregation is - * not supported in general then we can't use it for partitionwise + * partitioning columns at this level and the collation used by GROUP + * BY matches the partitioning collation. Otherwise, we can do at + * most partial partitionwise aggregation. But if partial aggregation + * is not supported in general then we can't use it for partitionwise * aggregation either. * * Check parse->groupClause not processed_groupClause, because it's @@ -4544,9 +4657,11 @@ create_one_window_path(PlannerInfo *root, { WindowClause *wc = lfirst_node(WindowClause, l); List *window_pathkeys; + List *runcondition = NIL; int presorted_keys; bool is_sorted; bool topwindow; + ListCell *lc2; window_pathkeys = make_pathkeys_for_window(root, wc, @@ -4593,7 +4708,7 @@ create_one_window_path(PlannerInfo *root, * Note: a WindowFunc adds nothing to the target's eval costs; but * we do need to account for the increase in tlist width. */ - ListCell *lc2; + int64 tuple_width = window_target->width; window_target = copy_pathtarget(window_target); foreach(lc2, wflists->windowFuncs[wc->winref]) @@ -4601,8 +4716,9 @@ create_one_window_path(PlannerInfo *root, WindowFunc *wfunc = lfirst_node(WindowFunc, lc2); add_column_to_pathtarget(window_target, (Expr *) wfunc, 0); - window_target->width += get_typavgwidth(wfunc->wintype, -1); + tuple_width += get_typavgwidth(wfunc->wintype, -1); } + window_target->width = clamp_width_est(tuple_width); } else { @@ -4614,17 +4730,53 @@ create_one_window_path(PlannerInfo *root, topwindow = foreach_current_index(l) == list_length(activeWindows) - 1; /* - * Accumulate all of the runConditions from each intermediate - * WindowClause. The top-level WindowAgg must pass these as a qual so - * that it filters out unwanted tuples correctly. + * Collect the WindowFuncRunConditions from each WindowFunc and + * convert them into OpExprs */ - if (!topwindow) - topqual = list_concat(topqual, wc->runCondition); + foreach(lc2, wflists->windowFuncs[wc->winref]) + { + ListCell *lc3; + WindowFunc *wfunc = lfirst_node(WindowFunc, lc2); + + foreach(lc3, wfunc->runCondition) + { + WindowFuncRunCondition *wfuncrc = + lfirst_node(WindowFuncRunCondition, lc3); + Expr *opexpr; + Expr *leftop; + Expr *rightop; + + if (wfuncrc->wfunc_left) + { + leftop = (Expr *) copyObject(wfunc); + rightop = copyObject(wfuncrc->arg); + } + else + { + leftop = copyObject(wfuncrc->arg); + rightop = (Expr *) copyObject(wfunc); + } + + opexpr = make_opclause(wfuncrc->opno, + BOOLOID, + false, + leftop, + rightop, + InvalidOid, + wfuncrc->inputcollid); + + runcondition = lappend(runcondition, opexpr); + + if (!topwindow) + topqual = lappend(topqual, opexpr); + } + } path = (Path *) create_windowagg_path(root, window_rel, path, window_target, wflists->windowFuncs[wc->winref], - wc, topwindow ? topqual : NIL, topwindow); + runcondition, wc, + topwindow ? topqual : NIL, topwindow); } add_path(window_rel, path); @@ -4636,12 +4788,14 @@ create_one_window_path(PlannerInfo *root, * Build a new upperrel containing Paths for SELECT DISTINCT evaluation. * * input_rel: contains the source-data Paths + * target: the pathtarget for the result Paths to compute * * Note: input paths should already compute the desired pathtarget, since * Sort/Unique won't project anything. */ static RelOptInfo * -create_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel) +create_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel, + PathTarget *target) { RelOptInfo *distinct_rel; @@ -4669,7 +4823,7 @@ create_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel) create_final_distinct_paths(root, input_rel, distinct_rel); /* now build distinct paths based on input_rel's partial_pathlist */ - create_partial_distinct_paths(root, input_rel, distinct_rel); + create_partial_distinct_paths(root, input_rel, distinct_rel, target); /* Give a helpful error if we failed to create any paths */ if (distinct_rel->pathlist == NIL) @@ -4711,7 +4865,8 @@ create_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel) */ static void create_partial_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel, - RelOptInfo *final_distinct_rel) + RelOptInfo *final_distinct_rel, + PathTarget *target) { RelOptInfo *partial_distinct_rel; Query *parse; @@ -4732,7 +4887,7 @@ create_partial_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel, partial_distinct_rel = fetch_upper_rel(root, UPPERREL_PARTIAL_DISTINCT, NULL); - partial_distinct_rel->reltarget = root->upper_targets[UPPERREL_PARTIAL_DISTINCT]; + partial_distinct_rel->reltarget = target; partial_distinct_rel->consider_parallel = input_rel->consider_parallel; /* @@ -4805,11 +4960,45 @@ create_partial_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel, -1.0); } - add_partial_path(partial_distinct_rel, (Path *) - create_upper_unique_path(root, partial_distinct_rel, - sorted_path, - list_length(root->distinct_pathkeys), - numDistinctRows)); + /* + * An empty distinct_pathkeys means all tuples have the same value + * for the DISTINCT clause. See create_final_distinct_paths() + */ + if (root->distinct_pathkeys == NIL) + { + Node *limitCount; + + limitCount = (Node *) makeConst(INT8OID, -1, InvalidOid, + sizeof(int64), + Int64GetDatum(1), false, + FLOAT8PASSBYVAL); + + /* + * Apply a LimitPath onto the partial path to restrict the + * tuples from each worker to 1. create_final_distinct_paths + * will need to apply an additional LimitPath to restrict this + * to a single row after the Gather node. If the query + * already has a LIMIT clause, then we could end up with three + * Limit nodes in the final plan. Consolidating the top two + * of these could be done, but does not seem worth troubling + * over. + */ + add_partial_path(partial_distinct_rel, (Path *) + create_limit_path(root, partial_distinct_rel, + sorted_path, + NULL, + limitCount, + LIMIT_OPTION_COUNT, + 0, 1)); + } + else + { + add_partial_path(partial_distinct_rel, (Path *) + create_upper_unique_path(root, partial_distinct_rel, + sorted_path, + list_length(root->distinct_pathkeys), + numDistinctRows)); + } } } @@ -4853,7 +5042,7 @@ create_partial_distinct_paths(PlannerInfo *root, RelOptInfo *input_rel, if (partial_distinct_rel->partial_pathlist != NIL) { - generate_gather_paths(root, partial_distinct_rel, true); + generate_useful_gather_paths(root, partial_distinct_rel, true); set_cheapest(partial_distinct_rel); /* @@ -5170,8 +5359,9 @@ create_ordered_paths(PlannerInfo *root, * have generated order-preserving Gather Merge plans which can be used * without sorting if they happen to match the sort_pathkeys, and the loop * above will have handled those as well. However, there's one more - * possibility: it may make sense to sort the cheapest partial path - * according to the required output order and then use Gather Merge. + * possibility: it may make sense to sort the cheapest partial path or + * incrementally sort any partial path that is partially sorted according + * to the required output order and then use Gather Merge. */ if (ordered_rel->consider_parallel && root->sort_pathkeys != NIL && input_rel->partial_pathlist != NIL) @@ -5180,97 +5370,65 @@ create_ordered_paths(PlannerInfo *root, cheapest_partial_path = linitial(input_rel->partial_pathlist); - /* - * If cheapest partial path doesn't need a sort, this is redundant - * with what's already been tried. - */ - if (!pathkeys_contained_in(root->sort_pathkeys, - cheapest_partial_path->pathkeys)) + foreach(lc, input_rel->partial_pathlist) { - Path *path; + Path *input_path = (Path *) lfirst(lc); + Path *sorted_path; + bool is_sorted; + int presorted_keys; double total_groups; - path = (Path *) create_sort_path(root, - ordered_rel, - cheapest_partial_path, - root->sort_pathkeys, - limit_tuples); - - total_groups = cheapest_partial_path->rows * - cheapest_partial_path->parallel_workers; - path = (Path *) - create_gather_merge_path(root, ordered_rel, - path, - path->pathtarget, - root->sort_pathkeys, NULL, - &total_groups); - - /* Add projection step if needed */ - if (path->pathtarget != target) - path = apply_projection_to_path(root, ordered_rel, - path, target); - - add_path(ordered_rel, path); - } - - /* - * Consider incremental sort with a gather merge on partial paths. - * - * We can also skip the entire loop when we only have a single-item - * sort_pathkeys because then we can't possibly have a presorted - * prefix of the list without having the list be fully sorted. - */ - if (enable_incremental_sort && list_length(root->sort_pathkeys) > 1) - { - foreach(lc, input_rel->partial_pathlist) - { - Path *input_path = (Path *) lfirst(lc); - Path *sorted_path; - bool is_sorted; - int presorted_keys; - double total_groups; - - /* - * We don't care if this is the cheapest partial path - we - * can't simply skip it, because it may be partially sorted in - * which case we want to consider adding incremental sort - * (instead of full sort, which is what happens above). - */ - - is_sorted = pathkeys_count_contained_in(root->sort_pathkeys, - input_path->pathkeys, - &presorted_keys); + is_sorted = pathkeys_count_contained_in(root->sort_pathkeys, + input_path->pathkeys, + &presorted_keys); - /* No point in adding incremental sort on fully sorted paths. */ - if (is_sorted) - continue; + if (is_sorted) + continue; - if (presorted_keys == 0) - continue; + /* + * Try at least sorting the cheapest path and also try + * incrementally sorting any path which is partially sorted + * already (no need to deal with paths which have presorted keys + * when incremental sort is disabled unless it's the cheapest + * partial path). + */ + if (input_path != cheapest_partial_path && + (presorted_keys == 0 || !enable_incremental_sort)) + continue; - /* Since we have presorted keys, consider incremental sort. */ + /* + * We've no need to consider both a sort and incremental sort. + * We'll just do a sort if there are no presorted keys and an + * incremental sort when there are presorted keys. + */ + if (presorted_keys == 0 || !enable_incremental_sort) + sorted_path = (Path *) create_sort_path(root, + ordered_rel, + input_path, + root->sort_pathkeys, + limit_tuples); + else sorted_path = (Path *) create_incremental_sort_path(root, ordered_rel, input_path, root->sort_pathkeys, presorted_keys, limit_tuples); - total_groups = input_path->rows * - input_path->parallel_workers; - sorted_path = (Path *) - create_gather_merge_path(root, ordered_rel, - sorted_path, - sorted_path->pathtarget, - root->sort_pathkeys, NULL, - &total_groups); - - /* Add projection step if needed */ - if (sorted_path->pathtarget != target) - sorted_path = apply_projection_to_path(root, ordered_rel, - sorted_path, target); - - add_path(ordered_rel, sorted_path); - } + total_groups = input_path->rows * + input_path->parallel_workers; + sorted_path = (Path *) + create_gather_merge_path(root, ordered_rel, + sorted_path, + sorted_path->pathtarget, + root->sort_pathkeys, NULL, + &total_groups); + + /* Add projection step if needed */ + if (sorted_path->pathtarget != target) + sorted_path = apply_projection_to_path(root, ordered_rel, + sorted_path, target); + + add_path(ordered_rel, sorted_path); } } @@ -5999,6 +6157,9 @@ make_window_input_target(PlannerInfo *root, * Create a pathkeys list describing the required input ordering * for the given WindowClause. * + * Modifies wc's partitionClause to remove any clauses which are deemed + * redundant by the pathkey logic. + * * The required ordering is first the PARTITION keys, then the ORDER keys. * In the future we might try to implement windowing using hashing, in which * case the ordering could be relaxed, but for now we always sort. @@ -6007,8 +6168,7 @@ static List * make_pathkeys_for_window(PlannerInfo *root, WindowClause *wc, List *tlist) { - List *window_pathkeys; - List *window_sortclauses; + List *window_pathkeys = NIL; /* Throw error if can't sort */ if (!grouping_is_sortable(wc->partitionClause)) @@ -6022,12 +6182,46 @@ make_pathkeys_for_window(PlannerInfo *root, WindowClause *wc, errmsg("could not implement window ORDER BY"), errdetail("Window ordering columns must be of sortable datatypes."))); - /* Okay, make the combined pathkeys */ - window_sortclauses = list_concat_copy(wc->partitionClause, wc->orderClause); - window_pathkeys = make_pathkeys_for_sortclauses(root, - window_sortclauses, - tlist); - list_free(window_sortclauses); + /* + * First fetch the pathkeys for the PARTITION BY clause. We can safely + * remove any clauses from the wc->partitionClause for redundant pathkeys. + */ + if (wc->partitionClause != NIL) + { + bool sortable; + + window_pathkeys = make_pathkeys_for_sortclauses_extended(root, + &wc->partitionClause, + tlist, + true, + &sortable, + false); + + Assert(sortable); + } + + /* + * In principle, we could also consider removing redundant ORDER BY items + * too as doing so does not alter the result of peer row checks done by + * the executor. However, we must *not* remove the ordering column for + * RANGE OFFSET cases, as the executor needs that for in_range tests even + * if it's known to be equal to some partitioning column. + */ + if (wc->orderClause != NIL) + { + List *orderby_pathkeys; + + orderby_pathkeys = make_pathkeys_for_sortclauses(root, + wc->orderClause, + tlist); + + /* Okay, make the combined pathkeys */ + if (window_pathkeys != NIL) + window_pathkeys = append_pathkeys(window_pathkeys, orderby_pathkeys); + else + window_pathkeys = orderby_pathkeys; + } + return window_pathkeys; } @@ -6617,7 +6811,8 @@ plan_cluster_use_sort(Oid tableOid, Oid indexOid) * CREATE INDEX should request for use * * tableOid is the table on which the index is to be built. indexOid is the - * OID of an index to be created or reindexed (which must be a btree index). + * OID of an index to be created or reindexed (which must be an index with + * support for parallel builds - currently btree or BRIN). * * Return value is the number of parallel worker processes to request. It * may be unsafe to proceed if this is 0. Note that this does not include the @@ -6755,6 +6950,58 @@ plan_create_index_workers(Oid tableOid, Oid indexOid) return parallel_workers; } +/* + * make_ordered_path + * Return a path ordered by 'pathkeys' based on the given 'path'. May + * return NULL if it doesn't make sense to generate an ordered path in + * this case. + */ +static Path * +make_ordered_path(PlannerInfo *root, RelOptInfo *rel, Path *path, + Path *cheapest_path, List *pathkeys) +{ + bool is_sorted; + int presorted_keys; + + is_sorted = pathkeys_count_contained_in(pathkeys, + path->pathkeys, + &presorted_keys); + + if (!is_sorted) + { + /* + * Try at least sorting the cheapest path and also try incrementally + * sorting any path which is partially sorted already (no need to deal + * with paths which have presorted keys when incremental sort is + * disabled unless it's the cheapest input path). + */ + if (path != cheapest_path && + (presorted_keys == 0 || !enable_incremental_sort)) + return NULL; + + /* + * We've no need to consider both a sort and incremental sort. We'll + * just do a sort if there are no presorted keys and an incremental + * sort when there are presorted keys. + */ + if (presorted_keys == 0 || !enable_incremental_sort) + path = (Path *) create_sort_path(root, + rel, + path, + pathkeys, + -1.0); + else + path = (Path *) create_incremental_sort_path(root, + rel, + path, + pathkeys, + presorted_keys, + -1.0); + } + + return path; +} + /* * add_paths_to_grouping_rel * @@ -6785,90 +7032,75 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, */ foreach(lc, input_rel->pathlist) { + ListCell *lc2; Path *path = (Path *) lfirst(lc); - bool is_sorted; - int presorted_keys; + Path *path_save = path; + List *pathkey_orderings = NIL; - is_sorted = pathkeys_count_contained_in(root->group_pathkeys, - path->pathkeys, - &presorted_keys); + /* generate alternative group orderings that might be useful */ + pathkey_orderings = get_useful_group_keys_orderings(root, path); - if (!is_sorted) + Assert(list_length(pathkey_orderings) > 0); + + foreach(lc2, pathkey_orderings) { - /* - * Try at least sorting the cheapest path and also try - * incrementally sorting any path which is partially sorted - * already (no need to deal with paths which have presorted - * keys when incremental sort is disabled unless it's the - * cheapest input path). - */ - if (path != cheapest_path && - (presorted_keys == 0 || !enable_incremental_sort)) - continue; + GroupByOrdering *info = (GroupByOrdering *) lfirst(lc2); - /* - * We've no need to consider both a sort and incremental sort. - * We'll just do a sort if there are no presorted keys and an - * incremental sort when there are presorted keys. - */ - if (presorted_keys == 0 || !enable_incremental_sort) - path = (Path *) create_sort_path(root, - grouped_rel, - path, - root->group_pathkeys, - -1.0); - else - path = (Path *) create_incremental_sort_path(root, - grouped_rel, - path, - root->group_pathkeys, - presorted_keys, - -1.0); - } + /* restore the path (we replace it in the loop) */ + path = path_save; - /* Now decide what to stick atop it */ - if (parse->groupingSets) - { - consider_groupingsets_paths(root, grouped_rel, - path, true, can_hash, - gd, agg_costs, dNumGroups); - } - else if (parse->hasAggs) - { - /* - * We have aggregation, possibly with plain GROUP BY. Make an - * AggPath. - */ - add_path(grouped_rel, (Path *) - create_agg_path(root, + path = make_ordered_path(root, grouped_rel, path, - grouped_rel->reltarget, - parse->groupClause ? AGG_SORTED : AGG_PLAIN, - AGGSPLIT_SIMPLE, - root->processed_groupClause, - havingQual, - agg_costs, - dNumGroups)); - } - else if (parse->groupClause) - { - /* - * We have GROUP BY without aggregation or grouping sets. Make - * a GroupPath. - */ - add_path(grouped_rel, (Path *) - create_group_path(root, - grouped_rel, - path, - root->processed_groupClause, - havingQual, - dNumGroups)); - } - else - { - /* Other cases should have been handled above */ - Assert(false); + cheapest_path, + info->pathkeys); + if (path == NULL) + continue; + + /* Now decide what to stick atop it */ + if (parse->groupingSets) + { + consider_groupingsets_paths(root, grouped_rel, + path, true, can_hash, + gd, agg_costs, dNumGroups); + } + else if (parse->hasAggs) + { + /* + * We have aggregation, possibly with plain GROUP BY. Make + * an AggPath. + */ + add_path(grouped_rel, (Path *) + create_agg_path(root, + grouped_rel, + path, + grouped_rel->reltarget, + parse->groupClause ? AGG_SORTED : AGG_PLAIN, + AGGSPLIT_SIMPLE, + info->clauses, + havingQual, + agg_costs, + dNumGroups)); + } + else if (parse->groupClause) + { + /* + * We have GROUP BY without aggregation or grouping sets. + * Make a GroupPath. + */ + add_path(grouped_rel, (Path *) + create_group_path(root, + grouped_rel, + path, + info->clauses, + havingQual, + dNumGroups)); + } + else + { + /* Other cases should have been handled above */ + Assert(false); + } } } @@ -6880,69 +7112,55 @@ add_paths_to_grouping_rel(PlannerInfo *root, RelOptInfo *input_rel, { foreach(lc, partially_grouped_rel->pathlist) { + ListCell *lc2; Path *path = (Path *) lfirst(lc); - bool is_sorted; - int presorted_keys; + Path *path_save = path; + List *pathkey_orderings = NIL; + + /* generate alternative group orderings that might be useful */ + pathkey_orderings = get_useful_group_keys_orderings(root, path); - is_sorted = pathkeys_count_contained_in(root->group_pathkeys, - path->pathkeys, - &presorted_keys); + Assert(list_length(pathkey_orderings) > 0); - if (!is_sorted) + /* process all potentially interesting grouping reorderings */ + foreach(lc2, pathkey_orderings) { - /* - * Try at least sorting the cheapest path and also try - * incrementally sorting any path which is partially - * sorted already (no need to deal with paths which have - * presorted keys when incremental sort is disabled unless - * it's the cheapest input path). - */ - if (path != partially_grouped_rel->cheapest_total_path && - (presorted_keys == 0 || !enable_incremental_sort)) - continue; + GroupByOrdering *info = (GroupByOrdering *) lfirst(lc2); - /* - * We've no need to consider both a sort and incremental - * sort. We'll just do a sort if there are no pre-sorted - * keys and an incremental sort when there are presorted - * keys. - */ - if (presorted_keys == 0 || !enable_incremental_sort) - path = (Path *) create_sort_path(root, - grouped_rel, - path, - root->group_pathkeys, - -1.0); - else - path = (Path *) create_incremental_sort_path(root, - grouped_rel, - path, - root->group_pathkeys, - presorted_keys, - -1.0); - } + /* restore the path (we replace it in the loop) */ + path = path_save; - if (parse->hasAggs) - add_path(grouped_rel, (Path *) - create_agg_path(root, + path = make_ordered_path(root, grouped_rel, path, - grouped_rel->reltarget, - parse->groupClause ? AGG_SORTED : AGG_PLAIN, - AGGSPLIT_FINAL_DESERIAL, - root->processed_groupClause, - havingQual, - agg_final_costs, - dNumGroups)); - else - add_path(grouped_rel, (Path *) - create_group_path(root, - grouped_rel, - path, - root->processed_groupClause, - havingQual, - dNumGroups)); + partially_grouped_rel->cheapest_total_path, + info->pathkeys); + + if (path == NULL) + continue; + + if (parse->hasAggs) + add_path(grouped_rel, (Path *) + create_agg_path(root, + grouped_rel, + path, + grouped_rel->reltarget, + parse->groupClause ? AGG_SORTED : AGG_PLAIN, + AGGSPLIT_FINAL_DESERIAL, + info->clauses, + havingQual, + agg_final_costs, + dNumGroups)); + else + add_path(grouped_rel, (Path *) + create_group_path(root, + grouped_rel, + path, + info->clauses, + havingQual, + dNumGroups)); + } } } } @@ -7145,66 +7363,54 @@ create_partial_grouping_paths(PlannerInfo *root, */ foreach(lc, input_rel->pathlist) { + ListCell *lc2; Path *path = (Path *) lfirst(lc); - bool is_sorted; - int presorted_keys; + Path *path_save = path; + List *pathkey_orderings = NIL; - is_sorted = pathkeys_count_contained_in(root->group_pathkeys, - path->pathkeys, - &presorted_keys); - if (!is_sorted) + /* generate alternative group orderings that might be useful */ + pathkey_orderings = get_useful_group_keys_orderings(root, path); + + Assert(list_length(pathkey_orderings) > 0); + + /* process all potentially interesting grouping reorderings */ + foreach(lc2, pathkey_orderings) { - /* - * Try at least sorting the cheapest path and also try - * incrementally sorting any path which is partially sorted - * already (no need to deal with paths which have presorted - * keys when incremental sort is disabled unless it's the - * cheapest input path). - */ - if (path != cheapest_total_path && - (presorted_keys == 0 || !enable_incremental_sort)) - continue; + GroupByOrdering *info = (GroupByOrdering *) lfirst(lc2); - /* - * We've no need to consider both a sort and incremental sort. - * We'll just do a sort if there are no presorted keys and an - * incremental sort when there are presorted keys. - */ - if (presorted_keys == 0 || !enable_incremental_sort) - path = (Path *) create_sort_path(root, - partially_grouped_rel, - path, - root->group_pathkeys, - -1.0); - else - path = (Path *) create_incremental_sort_path(root, - partially_grouped_rel, - path, - root->group_pathkeys, - presorted_keys, - -1.0); - } + /* restore the path (we replace it in the loop) */ + path = path_save; - if (parse->hasAggs) - add_path(partially_grouped_rel, (Path *) - create_agg_path(root, + path = make_ordered_path(root, partially_grouped_rel, path, - partially_grouped_rel->reltarget, - parse->groupClause ? AGG_SORTED : AGG_PLAIN, - AGGSPLIT_INITIAL_SERIAL, - root->processed_groupClause, - NIL, - agg_partial_costs, - dNumPartialGroups)); - else - add_path(partially_grouped_rel, (Path *) - create_group_path(root, - partially_grouped_rel, - path, - root->processed_groupClause, - NIL, - dNumPartialGroups)); + cheapest_total_path, + info->pathkeys); + + if (path == NULL) + continue; + + if (parse->hasAggs) + add_path(partially_grouped_rel, (Path *) + create_agg_path(root, + partially_grouped_rel, + path, + partially_grouped_rel->reltarget, + parse->groupClause ? AGG_SORTED : AGG_PLAIN, + AGGSPLIT_INITIAL_SERIAL, + info->clauses, + NIL, + agg_partial_costs, + dNumPartialGroups)); + else + add_path(partially_grouped_rel, (Path *) + create_group_path(root, + partially_grouped_rel, + path, + info->clauses, + NIL, + dNumPartialGroups)); + } } } @@ -7213,67 +7419,55 @@ create_partial_grouping_paths(PlannerInfo *root, /* Similar to above logic, but for partial paths. */ foreach(lc, input_rel->partial_pathlist) { + ListCell *lc2; Path *path = (Path *) lfirst(lc); - bool is_sorted; - int presorted_keys; + Path *path_save = path; + List *pathkey_orderings = NIL; - is_sorted = pathkeys_count_contained_in(root->group_pathkeys, - path->pathkeys, - &presorted_keys); + /* generate alternative group orderings that might be useful */ + pathkey_orderings = get_useful_group_keys_orderings(root, path); + + Assert(list_length(pathkey_orderings) > 0); - if (!is_sorted) + /* process all potentially interesting grouping reorderings */ + foreach(lc2, pathkey_orderings) { - /* - * Try at least sorting the cheapest path and also try - * incrementally sorting any path which is partially sorted - * already (no need to deal with paths which have presorted - * keys when incremental sort is disabled unless it's the - * cheapest input path). - */ - if (path != cheapest_partial_path && - (presorted_keys == 0 || !enable_incremental_sort)) + GroupByOrdering *info = (GroupByOrdering *) lfirst(lc2); + + + /* restore the path (we replace it in the loop) */ + path = path_save; + + path = make_ordered_path(root, + partially_grouped_rel, + path, + cheapest_partial_path, + info->pathkeys); + + if (path == NULL) continue; - /* - * We've no need to consider both a sort and incremental sort. - * We'll just do a sort if there are no presorted keys and an - * incremental sort when there are presorted keys. - */ - if (presorted_keys == 0 || !enable_incremental_sort) - path = (Path *) create_sort_path(root, + if (parse->hasAggs) + add_partial_path(partially_grouped_rel, (Path *) + create_agg_path(root, partially_grouped_rel, path, - root->group_pathkeys, - -1.0); + partially_grouped_rel->reltarget, + parse->groupClause ? AGG_SORTED : AGG_PLAIN, + AGGSPLIT_INITIAL_SERIAL, + info->clauses, + NIL, + agg_partial_costs, + dNumPartialPartialGroups)); else - path = (Path *) create_incremental_sort_path(root, - partially_grouped_rel, - path, - root->group_pathkeys, - presorted_keys, - -1.0); + add_partial_path(partially_grouped_rel, (Path *) + create_group_path(root, + partially_grouped_rel, + path, + info->clauses, + NIL, + dNumPartialPartialGroups)); } - - if (parse->hasAggs) - add_partial_path(partially_grouped_rel, (Path *) - create_agg_path(root, - partially_grouped_rel, - path, - partially_grouped_rel->reltarget, - parse->groupClause ? AGG_SORTED : AGG_PLAIN, - AGGSPLIT_INITIAL_SERIAL, - root->processed_groupClause, - NIL, - agg_partial_costs, - dNumPartialPartialGroups)); - else - add_partial_path(partially_grouped_rel, (Path *) - create_group_path(root, - partially_grouped_rel, - path, - root->processed_groupClause, - NIL, - dNumPartialPartialGroups)); } } @@ -7352,46 +7546,24 @@ gather_grouping_paths(PlannerInfo *root, RelOptInfo *rel) { ListCell *lc; Path *cheapest_partial_path; + List *groupby_pathkeys; + + /* + * This occurs after any partial aggregation has taken place, so trim off + * any pathkeys added for ORDER BY / DISTINCT aggregates. + */ + if (list_length(root->group_pathkeys) > root->num_groupby_pathkeys) + groupby_pathkeys = list_copy_head(root->group_pathkeys, + root->num_groupby_pathkeys); + else + groupby_pathkeys = root->group_pathkeys; /* Try Gather for unordered paths and Gather Merge for ordered ones. */ generate_useful_gather_paths(root, rel, true); - /* Try cheapest partial path + explicit Sort + Gather Merge. */ cheapest_partial_path = linitial(rel->partial_pathlist); - if (!pathkeys_contained_in(root->group_pathkeys, - cheapest_partial_path->pathkeys)) - { - Path *path; - double total_groups; - total_groups = - cheapest_partial_path->rows * cheapest_partial_path->parallel_workers; - path = (Path *) create_sort_path(root, rel, cheapest_partial_path, - root->group_pathkeys, - -1.0); - path = (Path *) - create_gather_merge_path(root, - rel, - path, - rel->reltarget, - root->group_pathkeys, - NULL, - &total_groups); - - add_path(rel, path); - } - - /* - * Consider incremental sort on all partial paths, if enabled. - * - * We can also skip the entire loop when we only have a single-item - * group_pathkeys because then we can't possibly have a presorted prefix - * of the list without having the list be fully sorted. - */ - if (!enable_incremental_sort || list_length(root->group_pathkeys) == 1) - return; - - /* also consider incremental sort on partial paths, if enabled */ + /* XXX Shouldn't this also consider the group-key-reordering? */ foreach(lc, rel->partial_pathlist) { Path *path = (Path *) lfirst(lc); @@ -7399,29 +7571,48 @@ gather_grouping_paths(PlannerInfo *root, RelOptInfo *rel) int presorted_keys; double total_groups; - is_sorted = pathkeys_count_contained_in(root->group_pathkeys, + is_sorted = pathkeys_count_contained_in(groupby_pathkeys, path->pathkeys, &presorted_keys); if (is_sorted) continue; - if (presorted_keys == 0) + /* + * Try at least sorting the cheapest path and also try incrementally + * sorting any path which is partially sorted already (no need to deal + * with paths which have presorted keys when incremental sort is + * disabled unless it's the cheapest input path). + */ + if (path != cheapest_partial_path && + (presorted_keys == 0 || !enable_incremental_sort)) continue; - path = (Path *) create_incremental_sort_path(root, - rel, - path, - root->group_pathkeys, - presorted_keys, - -1.0); + total_groups = path->rows * path->parallel_workers; + + /* + * We've no need to consider both a sort and incremental sort. We'll + * just do a sort if there are no presorted keys and an incremental + * sort when there are presorted keys. + */ + if (presorted_keys == 0 || !enable_incremental_sort) + path = (Path *) create_sort_path(root, rel, path, + groupby_pathkeys, + -1.0); + else + path = (Path *) create_incremental_sort_path(root, + rel, + path, + groupby_pathkeys, + presorted_keys, + -1.0); path = (Path *) create_gather_merge_path(root, rel, path, rel->reltarget, - root->group_pathkeys, + groupby_pathkeys, NULL, &total_groups); @@ -7853,8 +8044,8 @@ create_partitionwise_grouping_paths(PlannerInfo *root, /* * group_by_has_partkey * - * Returns true, if all the partition keys of the given relation are part of - * the GROUP BY clauses, false otherwise. + * Returns true if all the partition keys of the given relation are part of + * the GROUP BY clauses, including having matching collation, false otherwise. */ static bool group_by_has_partkey(RelOptInfo *input_rel, @@ -7882,13 +8073,40 @@ group_by_has_partkey(RelOptInfo *input_rel, foreach(lc, partexprs) { + ListCell *lg; Expr *partexpr = lfirst(lc); + Oid partcoll = input_rel->part_scheme->partcollation[cnt]; - if (list_member(groupexprs, partexpr)) + foreach(lg, groupexprs) { - found = true; - break; + Expr *groupexpr = lfirst(lg); + Oid groupcoll = exprCollation((Node *) groupexpr); + + /* + * Note: we can assume there is at most one RelabelType node; + * eval_const_expressions() will have simplified if more than + * one. + */ + if (IsA(groupexpr, RelabelType)) + groupexpr = ((RelabelType *) groupexpr)->arg; + + if (equal(groupexpr, partexpr)) + { + /* + * Reject a match if the grouping collation does not match + * the partitioning collation. + */ + if (OidIsValid(partcoll) && OidIsValid(groupcoll) && + partcoll != groupcoll) + return false; + + found = true; + break; + } } + + if (found) + break; } /* @@ -7901,3 +8119,63 @@ group_by_has_partkey(RelOptInfo *input_rel, return true; } + +/* + * generate_setop_child_grouplist + * Build a SortGroupClause list defining the sort/grouping properties + * of the child of a set operation. + * + * This is similar to generate_setop_grouplist() but differs as the setop + * child query's targetlist entries may already have a tleSortGroupRef + * assigned for other purposes, such as GROUP BYs. Here we keep the + * SortGroupClause list in the same order as 'op' groupClauses and just adjust + * the tleSortGroupRef to reference the TargetEntry's 'ressortgroupref'. If + * any of the columns in the targetlist don't match to the setop's colTypes + * then we return an empty list. This may leave some TLEs with unreferenced + * ressortgroupref markings, but that's harmless. + */ +static List * +generate_setop_child_grouplist(SetOperationStmt *op, List *targetlist) +{ + List *grouplist = copyObject(op->groupClauses); + ListCell *lg; + ListCell *lt; + ListCell *ct; + + lg = list_head(grouplist); + ct = list_head(op->colTypes); + foreach(lt, targetlist) + { + TargetEntry *tle = (TargetEntry *) lfirst(lt); + SortGroupClause *sgc; + Oid coltype; + + /* resjunk columns could have sortgrouprefs. Leave these alone */ + if (tle->resjunk) + continue; + + /* + * We expect every non-resjunk target to have a SortGroupClause and + * colTypes. + */ + Assert(lg != NULL); + Assert(ct != NULL); + sgc = (SortGroupClause *) lfirst(lg); + coltype = lfirst_oid(ct); + + /* reject if target type isn't the same as the setop target type */ + if (coltype != exprType((Node *) tle->expr)) + return NIL; + + lg = lnext(grouplist, lg); + ct = lnext(op->colTypes, ct); + + /* assign a tleSortGroupRef, or reuse the existing one */ + sgc->tleSortGroupRef = assignSortGroupRef(tle, targetlist); + } + + Assert(lg == NULL); + Assert(ct == NULL); + + return grouplist; +} diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index c63758cb2b728..69ff384fce92a 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -4,7 +4,7 @@ * Post-processing of a completed plan tree: fix references to subplan * vars, compute regproc values for operators, etc * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,10 +23,10 @@ #include "optimizer/pathnode.h" #include "optimizer/planmain.h" #include "optimizer/planner.h" +#include "optimizer/subselect.h" #include "optimizer/tlist.h" #include "parser/parse_relation.h" #include "tcop/utility.h" -#include "utils/lsyscache.h" #include "utils/syscache.h" @@ -34,7 +34,7 @@ typedef enum { NRM_EQUAL, /* expect exact match of nullingrels */ NRM_SUBSET, /* actual Var may have a subset of input */ - NRM_SUPERSET /* actual Var may have a superset of input */ + NRM_SUPERSET, /* actual Var may have a superset of input */ } NullingRelsMatch; typedef struct @@ -1143,7 +1143,9 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset) */ if (splan->mergeActionLists != NIL) { + List *newMJC = NIL; ListCell *lca, + *lcj, *lcr; /* @@ -1164,10 +1166,12 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset) itlist = build_tlist_index(subplan->targetlist); - forboth(lca, splan->mergeActionLists, - lcr, splan->resultRelations) + forthree(lca, splan->mergeActionLists, + lcj, splan->mergeJoinConditions, + lcr, splan->resultRelations) { List *mergeActionList = lfirst(lca); + Node *mergeJoinCondition = lfirst(lcj); Index resultrel = lfirst_int(lcr); foreach(l, mergeActionList) @@ -1192,7 +1196,19 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset) NRM_EQUAL, NUM_EXEC_QUAL(plan)); } + + /* Fix join condition too. */ + mergeJoinCondition = (Node *) + fix_join_expr(root, + (List *) mergeJoinCondition, + NULL, itlist, + resultrel, + rtoffset, + NRM_EQUAL, + NUM_EXEC_QUAL(plan)); + newMJC = lappend(newMJC, mergeJoinCondition); } + splan->mergeJoinConditions = newMJC; } splan->nominalRelation += rtoffset; @@ -1519,19 +1535,30 @@ clean_up_removed_plan_level(Plan *parent, Plan *child) { /* * We have to be sure we don't lose any initplans, so move any that were - * attached to the parent plan to the child. If we do move any, the child - * is no longer parallel-safe. + * attached to the parent plan to the child. If any are parallel-unsafe, + * the child is no longer parallel-safe. As a cosmetic matter, also add + * the initplans' run costs to the child's costs. */ if (parent->initPlan) - child->parallel_safe = false; + { + Cost initplan_cost; + bool unsafe_initplans; - /* - * Attach plans this way so that parent's initplans are processed before - * any pre-existing initplans of the child. Probably doesn't matter, but - * let's preserve the ordering just in case. - */ - child->initPlan = list_concat(parent->initPlan, - child->initPlan); + SS_compute_initplan_cost(parent->initPlan, + &initplan_cost, &unsafe_initplans); + child->startup_cost += initplan_cost; + child->total_cost += initplan_cost; + if (unsafe_initplans) + child->parallel_safe = false; + + /* + * Attach plans this way so that parent's initplans are processed + * before any pre-existing initplans of the child. Probably doesn't + * matter, but let's preserve the ordering just in case. + */ + child->initPlan = list_concat(parent->initPlan, + child->initPlan); + } /* * We also have to transfer the parent's column labeling info into the @@ -1767,6 +1794,12 @@ set_append_references(PlannerInfo *root, PartitionedRelPruneInfo *pinfo = lfirst(l2); pinfo->rtindex += rtoffset; + pinfo->initial_pruning_steps = + fix_scan_list(root, pinfo->initial_pruning_steps, + rtoffset, 1); + pinfo->exec_pruning_steps = + fix_scan_list(root, pinfo->exec_pruning_steps, + rtoffset, 1); } } } @@ -1843,6 +1876,12 @@ set_mergeappend_references(PlannerInfo *root, PartitionedRelPruneInfo *pinfo = lfirst(l2); pinfo->rtindex += rtoffset; + pinfo->initial_pruning_steps = + fix_scan_list(root, pinfo->initial_pruning_steps, + rtoffset, 1); + pinfo->exec_pruning_steps = + fix_scan_list(root, pinfo->exec_pruning_steps, + rtoffset, 1); } } } @@ -1979,10 +2018,10 @@ fix_expr_common(PlannerInfo *root, Node *node) set_sa_opfuncid(saop); record_plan_function_dependency(root, saop->opfuncid); - if (!OidIsValid(saop->hashfuncid)) + if (OidIsValid(saop->hashfuncid)) record_plan_function_dependency(root, saop->hashfuncid); - if (!OidIsValid(saop->negfuncid)) + if (OidIsValid(saop->negfuncid)) record_plan_function_dependency(root, saop->negfuncid); } else if (IsA(node, Const)) @@ -2181,22 +2220,14 @@ fix_scan_expr_mutator(Node *node, fix_scan_expr_context *context) if (IsA(node, Aggref)) { Aggref *aggref = (Aggref *) node; + Param *aggparam; /* See if the Aggref should be replaced by a Param */ - if (context->root->minmax_aggs != NIL && - list_length(aggref->args) == 1) + aggparam = find_minmax_agg_replacement_param(context->root, aggref); + if (aggparam != NULL) { - TargetEntry *curTarget = (TargetEntry *) linitial(aggref->args); - ListCell *lc; - - foreach(lc, context->root->minmax_aggs) - { - MinMaxAggInfo *mminfo = (MinMaxAggInfo *) lfirst(lc); - - if (mminfo->aggfnoid == aggref->aggfnoid && - equal(mminfo->target, curTarget->expr)) - return (Node *) copyObject(mminfo->param); - } + /* Make a copy of the Param for paranoia's sake */ + return (Node *) copyObject(aggparam); } /* If no match, just fall through to process it normally */ } @@ -2756,11 +2787,11 @@ build_tlist_index_other_vars(List *tlist, int ignore_rel) * Also ensure that varnosyn is incremented by rtoffset. * If no match, return NULL. * - * In debugging builds, we cross-check the varnullingrels of the subplan - * output Var based on nrm_match. Most call sites should pass NRM_EQUAL - * indicating we expect an exact match. However, there are places where - * we haven't cleaned things up completely, and we have to settle for - * allowing subset or superset matches. + * We cross-check the varnullingrels of the subplan output Var based on + * nrm_match. Most call sites should pass NRM_EQUAL indicating we expect + * an exact match. However, there are places where we haven't cleaned + * things up completely, and we have to settle for allowing subset or + * superset matches. */ static Var * search_indexed_tlist_for_var(Var *var, indexed_tlist *itlist, @@ -2932,7 +2963,14 @@ search_indexed_tlist_for_sortgroupref(Expr *node, { TargetEntry *tle = (TargetEntry *) lfirst(lc); - /* The equal() check should be redundant, but let's be paranoid */ + /* + * Usually the equal() check is redundant, but in setop plans it may + * not be, since prepunion.c assigns ressortgroupref equal to the + * column resno without regard to whether that matches the topmost + * level's sortgrouprefs and without regard to whether any implicit + * coercions are added in the setop tree. We might have to clean that + * up someday; but for now, just ignore any false matches. + */ if (tle->ressortgroupref == sortgroupref && equal(node, tle->expr)) { @@ -3225,22 +3263,14 @@ fix_upper_expr_mutator(Node *node, fix_upper_expr_context *context) if (IsA(node, Aggref)) { Aggref *aggref = (Aggref *) node; + Param *aggparam; /* See if the Aggref should be replaced by a Param */ - if (context->root->minmax_aggs != NIL && - list_length(aggref->args) == 1) + aggparam = find_minmax_agg_replacement_param(context->root, aggref); + if (aggparam != NULL) { - TargetEntry *curTarget = (TargetEntry *) linitial(aggref->args); - ListCell *lc; - - foreach(lc, context->root->minmax_aggs) - { - MinMaxAggInfo *mminfo = (MinMaxAggInfo *) lfirst(lc); - - if (mminfo->aggfnoid == aggref->aggfnoid && - equal(mminfo->target, curTarget->expr)) - return (Node *) copyObject(mminfo->param); - } + /* Make a copy of the Param for paranoia's sake */ + return (Node *) copyObject(aggparam); } /* If no match, just fall through to process it normally */ } @@ -3395,6 +3425,38 @@ set_windowagg_runcondition_references(PlannerInfo *root, return newlist; } +/* + * find_minmax_agg_replacement_param + * If the given Aggref is one that we are optimizing into a subquery + * (cf. planagg.c), then return the Param that should replace it. + * Else return NULL. + * + * This is exported so that SS_finalize_plan can use it before setrefs.c runs. + * Note that it will not find anything until we have built a Plan from a + * MinMaxAggPath, as root->minmax_aggs will never be filled otherwise. + */ +Param * +find_minmax_agg_replacement_param(PlannerInfo *root, Aggref *aggref) +{ + if (root->minmax_aggs != NIL && + list_length(aggref->args) == 1) + { + TargetEntry *curTarget = (TargetEntry *) linitial(aggref->args); + ListCell *lc; + + foreach(lc, root->minmax_aggs) + { + MinMaxAggInfo *mminfo = (MinMaxAggInfo *) lfirst(lc); + + if (mminfo->aggfnoid == aggref->aggfnoid && + equal(mminfo->target, curTarget->expr)) + return mminfo->param; + } + } + return NULL; +} + + /***************************************************************************** * QUERY DEPENDENCY MANAGEMENT *****************************************************************************/ @@ -3537,8 +3599,27 @@ extract_query_dependencies_walker(Node *node, PlannerInfo *context) if (query->commandType == CMD_UTILITY) { /* - * Ignore utility statements, except those (such as EXPLAIN) that - * contain a parsed-but-not-planned query. + * This logic must handle any utility command for which parse + * analysis was nontrivial (cf. stmt_requires_parse_analysis). + * + * Notably, CALL requires its own processing. + */ + if (IsA(query->utilityStmt, CallStmt)) + { + CallStmt *callstmt = (CallStmt *) query->utilityStmt; + + /* We need not examine funccall, just the transformed exprs */ + (void) extract_query_dependencies_walker((Node *) callstmt->funcexpr, + context); + (void) extract_query_dependencies_walker((Node *) callstmt->outargs, + context); + return false; + } + + /* + * Ignore other utility statements, except those (such as EXPLAIN) + * that contain a parsed-but-not-planned query. For those, we + * just need to transfer our attention to the contained query. */ query = UtilityContainsQuery(query->utilityStmt); if (query == NULL) diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c index da2d8abe015ae..6d003cc8e5cbe 100644 --- a/src/backend/optimizer/plan/subselect.c +++ b/src/backend/optimizer/plan/subselect.c @@ -6,7 +6,7 @@ * This module deals with SubLinks and CTEs, but not subquery RTEs (i.e., * not sub-SELECT-in-FROM cases). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -65,8 +65,8 @@ typedef struct inline_cte_walker_context } inline_cte_walker_context; -static Node *build_subplan(PlannerInfo *root, Plan *plan, PlannerInfo *subroot, - List *plan_params, +static Node *build_subplan(PlannerInfo *root, Plan *plan, Path *path, + PlannerInfo *subroot, List *plan_params, SubLinkType subLinkType, int subLinkId, Node *testexpr, List *testexpr_paramids, bool unknownEqFalse); @@ -218,9 +218,8 @@ make_subplan(PlannerInfo *root, Query *orig_subquery, Assert(root->plan_params == NIL); /* Generate Paths for the subquery */ - subroot = subquery_planner(root->glob, subquery, - root, - false, tuple_fraction); + subroot = subquery_planner(root->glob, subquery, root, false, + tuple_fraction, NULL); /* Isolate the params needed by this specific subplan */ plan_params = root->plan_params; @@ -236,7 +235,8 @@ make_subplan(PlannerInfo *root, Query *orig_subquery, plan = create_plan(subroot, best_path); /* And convert to SubPlan or InitPlan format. */ - result = build_subplan(root, plan, subroot, plan_params, + result = build_subplan(root, plan, best_path, + subroot, plan_params, subLinkType, subLinkId, testexpr, NIL, isTopQual); @@ -265,9 +265,8 @@ make_subplan(PlannerInfo *root, Query *orig_subquery, if (subquery) { /* Generate Paths for the ANY subquery; we'll need all rows */ - subroot = subquery_planner(root->glob, subquery, - root, - false, 0.0); + subroot = subquery_planner(root->glob, subquery, root, false, 0.0, + NULL); /* Isolate the params needed by this specific subplan */ plan_params = root->plan_params; @@ -288,8 +287,8 @@ make_subplan(PlannerInfo *root, Query *orig_subquery, /* ... and convert to SubPlan format */ hashplan = castNode(SubPlan, - build_subplan(root, plan, subroot, - plan_params, + build_subplan(root, plan, best_path, + subroot, plan_params, ANY_SUBLINK, 0, newtestexpr, paramIds, @@ -317,8 +316,8 @@ make_subplan(PlannerInfo *root, Query *orig_subquery, * make it an InitPlan, as explained in the comments for make_subplan. */ static Node * -build_subplan(PlannerInfo *root, Plan *plan, PlannerInfo *subroot, - List *plan_params, +build_subplan(PlannerInfo *root, Plan *plan, Path *path, + PlannerInfo *subroot, List *plan_params, SubLinkType subLinkType, int subLinkId, Node *testexpr, List *testexpr_paramids, bool unknownEqFalse) @@ -539,9 +538,10 @@ build_subplan(PlannerInfo *root, Plan *plan, PlannerInfo *subroot, } /* - * Add the subplan and its PlannerInfo to the global lists. + * Add the subplan, its path, and its PlannerInfo to the global lists. */ root->glob->subplans = lappend(root->glob->subplans, plan); + root->glob->subpaths = lappend(root->glob->subpaths, path); root->glob->subroots = lappend(root->glob->subroots, subroot); splan->plan_id = list_length(root->glob->subplans); @@ -560,22 +560,9 @@ build_subplan(PlannerInfo *root, Plan *plan, PlannerInfo *subroot, splan->plan_id); /* Label the subplan for EXPLAIN purposes */ - splan->plan_name = palloc(32 + 12 * list_length(splan->setParam)); - sprintf(splan->plan_name, "%s %d", - isInitPlan ? "InitPlan" : "SubPlan", - splan->plan_id); - if (splan->setParam) - { - char *ptr = splan->plan_name + strlen(splan->plan_name); - - ptr += sprintf(ptr, " (returns "); - foreach(lc, splan->setParam) - { - ptr += sprintf(ptr, "$%d%s", - lfirst_int(lc), - lnext(splan->setParam, lc) ? "," : ")"); - } - } + splan->plan_name = psprintf("%s %d", + isInitPlan ? "InitPlan" : "SubPlan", + splan->plan_id); /* Lastly, fill in the cost estimates for use later */ cost_subplan(root, splan, plan); @@ -978,9 +965,8 @@ SS_process_ctes(PlannerInfo *root) * Generate Paths for the CTE query. Always plan for full retrieval * --- we don't have enough info to predict otherwise. */ - subroot = subquery_planner(root->glob, subquery, - root, - cte->cterecursive, 0.0); + subroot = subquery_planner(root->glob, subquery, root, + cte->cterecursive, 0.0, NULL); /* * Since the current query level doesn't yet contain any RTEs, it @@ -1016,8 +1002,7 @@ SS_process_ctes(PlannerInfo *root) /* * CTE scans are not considered for parallelism (cf - * set_rel_consider_parallel), and even if they were, initPlans aren't - * parallel-safe. + * set_rel_consider_parallel). */ splan->parallel_safe = false; splan->setParam = NIL; @@ -1043,9 +1028,10 @@ SS_process_ctes(PlannerInfo *root) splan->setParam = list_make1_int(paramid); /* - * Add the subplan and its PlannerInfo to the global lists. + * Add the subplan, its path, and its PlannerInfo to the global lists. */ root->glob->subplans = lappend(root->glob->subplans, plan); + root->glob->subpaths = lappend(root->glob->subpaths, best_path); root->glob->subroots = lappend(root->glob->subroots, subroot); splan->plan_id = list_length(root->glob->subplans); @@ -1279,14 +1265,23 @@ convert_ANY_sublink_to_join(PlannerInfo *root, SubLink *sublink, List *subquery_vars; Node *quals; ParseState *pstate; + Relids sub_ref_outer_relids; + bool use_lateral; Assert(sublink->subLinkType == ANY_SUBLINK); /* - * The sub-select must not refer to any Vars of the parent query. (Vars of - * higher levels should be okay, though.) + * If the sub-select contains any Vars of the parent query, we treat it as + * LATERAL. (Vars from higher levels don't matter here.) */ - if (contain_vars_of_level((Node *) subselect, 1)) + sub_ref_outer_relids = pull_varnos_of_level(NULL, (Node *) subselect, 1); + use_lateral = !bms_is_empty(sub_ref_outer_relids); + + /* + * Can't convert if the sub-select contains parent-level Vars of relations + * not in available_rels. + */ + if (!bms_is_subset(sub_ref_outer_relids, available_rels)) return NULL; /* @@ -1324,7 +1319,7 @@ convert_ANY_sublink_to_join(PlannerInfo *root, SubLink *sublink, nsitem = addRangeTableEntryForSubquery(pstate, subselect, makeAlias("ANY_subquery", NIL), - false, + use_lateral, false); rte = nsitem->p_rte; parse->rtable = lappend(parse->rtable, rte); @@ -1847,7 +1842,8 @@ convert_EXISTS_to_ANY(PlannerInfo *root, Query *subselect, /* * Replace correlation vars (uplevel vars) with Params. * - * Uplevel PlaceHolderVars and aggregates are replaced, too. + * Uplevel PlaceHolderVars, aggregates, GROUPING() expressions, and + * MergeSupportFuncs are replaced, too. * * Note: it is critical that this runs immediately after SS_process_sublinks. * Since we do not recurse into the arguments of uplevel PHVs and aggregates, @@ -1901,6 +1897,12 @@ replace_correlation_vars_mutator(Node *node, PlannerInfo *root) if (((GroupingFunc *) node)->agglevelsup > 0) return (Node *) replace_outer_grouping(root, (GroupingFunc *) node); } + if (IsA(node, MergeSupportFunc)) + { + if (root->parse->commandType != CMD_MERGE) + return (Node *) replace_outer_merge_support(root, + (MergeSupportFunc *) node); + } return expression_tree_mutator(node, replace_correlation_vars_mutator, (void *) root); @@ -2120,8 +2122,8 @@ SS_identify_outer_params(PlannerInfo *root) * If any initPlans have been created in the current query level, they will * get attached to the Plan tree created from whichever Path we select from * the given rel. Increment all that rel's Paths' costs to account for them, - * and make sure the paths get marked as parallel-unsafe, since we can't - * currently transmit initPlans to parallel workers. + * and if any of the initPlans are parallel-unsafe, mark all the rel's Paths + * parallel-unsafe as well. * * This is separate from SS_attach_initplans because we might conditionally * create more initPlans during create_plan(), depending on which Path we @@ -2132,6 +2134,7 @@ void SS_charge_for_initplans(PlannerInfo *root, RelOptInfo *final_rel) { Cost initplan_cost; + bool unsafe_initplans; ListCell *lc; /* Nothing to do if no initPlans */ @@ -2140,17 +2143,10 @@ SS_charge_for_initplans(PlannerInfo *root, RelOptInfo *final_rel) /* * Compute the cost increment just once, since it will be the same for all - * Paths. We assume each initPlan gets run once during top plan startup. - * This is a conservative overestimate, since in fact an initPlan might be - * executed later than plan startup, or even not at all. + * Paths. Also check for parallel-unsafe initPlans. */ - initplan_cost = 0; - foreach(lc, root->init_plans) - { - SubPlan *initsubplan = (SubPlan *) lfirst(lc); - - initplan_cost += initsubplan->startup_cost + initsubplan->per_call_cost; - } + SS_compute_initplan_cost(root->init_plans, + &initplan_cost, &unsafe_initplans); /* * Now adjust the costs and parallel_safe flags. @@ -2161,19 +2157,71 @@ SS_charge_for_initplans(PlannerInfo *root, RelOptInfo *final_rel) path->startup_cost += initplan_cost; path->total_cost += initplan_cost; - path->parallel_safe = false; + if (unsafe_initplans) + path->parallel_safe = false; } /* - * Forget about any partial paths and clear consider_parallel, too; - * they're not usable if we attached an initPlan. + * Adjust partial paths' costs too, or forget them entirely if we must + * consider the rel parallel-unsafe. */ - final_rel->partial_pathlist = NIL; - final_rel->consider_parallel = false; + if (unsafe_initplans) + { + final_rel->partial_pathlist = NIL; + final_rel->consider_parallel = false; + } + else + { + foreach(lc, final_rel->partial_pathlist) + { + Path *path = (Path *) lfirst(lc); + + path->startup_cost += initplan_cost; + path->total_cost += initplan_cost; + } + } /* We needn't do set_cheapest() here, caller will do it */ } +/* + * SS_compute_initplan_cost - count up the cost delta for some initplans + * + * The total cost returned in *initplan_cost_p should be added to both the + * startup and total costs of the plan node the initplans get attached to. + * We also report whether any of the initplans are not parallel-safe. + * + * The primary user of this is SS_charge_for_initplans, but it's also + * used in adjusting costs when we move initplans to another plan node. + */ +void +SS_compute_initplan_cost(List *init_plans, + Cost *initplan_cost_p, + bool *unsafe_initplans_p) +{ + Cost initplan_cost; + bool unsafe_initplans; + ListCell *lc; + + /* + * We assume each initPlan gets run once during top plan startup. This is + * a conservative overestimate, since in fact an initPlan might be + * executed later than plan startup, or even not at all. + */ + initplan_cost = 0; + unsafe_initplans = false; + foreach(lc, init_plans) + { + SubPlan *initsubplan = lfirst_node(SubPlan, lc); + + initplan_cost += initsubplan->startup_cost + initsubplan->per_call_cost; + if (!initsubplan->parallel_safe) + unsafe_initplans = true; + } + *initplan_cost_p = initplan_cost; + *unsafe_initplans_p = unsafe_initplans; +} + /* * SS_attach_initplans - attach initplans to topmost plan node * @@ -2835,8 +2883,8 @@ finalize_plan(PlannerInfo *root, Plan *plan, } /* - * finalize_primnode: add IDs of all PARAM_EXEC params appearing in the given - * expression tree to the result set. + * finalize_primnode: add IDs of all PARAM_EXEC params that appear (or will + * appear) in the given expression tree to the result set. */ static bool finalize_primnode(Node *node, finalize_primnode_context *context) @@ -2853,7 +2901,26 @@ finalize_primnode(Node *node, finalize_primnode_context *context) } return false; /* no more to do here */ } - if (IsA(node, SubPlan)) + else if (IsA(node, Aggref)) + { + /* + * Check to see if the aggregate will be replaced by a Param + * referencing a subquery output during setrefs.c. If so, we must + * account for that Param here. (For various reasons, it's not + * convenient to perform that substitution earlier than setrefs.c, nor + * to perform this processing after setrefs.c. Thus we need a wart + * here.) + */ + Aggref *aggref = (Aggref *) node; + Param *aggparam; + + aggparam = find_minmax_agg_replacement_param(context->root, aggref); + if (aggparam != NULL) + context->paramids = bms_add_member(context->paramids, + aggparam->paramid); + /* Fall through to examine the agg's arguments */ + } + else if (IsA(node, SubPlan)) { SubPlan *subplan = (SubPlan *) node; Plan *plan = planner_subplan_get_plan(context->root, subplan); @@ -2954,9 +3021,14 @@ SS_make_initplan_from_plan(PlannerInfo *root, SubPlan *node; /* - * Add the subplan and its PlannerInfo to the global lists. + * Add the subplan and its PlannerInfo, as well as a dummy path entry, to + * the global lists. Ideally we'd save a real path, but right now our + * sole caller doesn't build a path that exactly matches the plan. Since + * we're not currently going to need the path for an initplan, it's not + * worth requiring construction of such a path. */ root->glob->subplans = lappend(root->glob->subplans, plan); + root->glob->subpaths = lappend(root->glob->subpaths, NULL); root->glob->subroots = lappend(root->glob->subroots, subroot); /* @@ -2967,10 +3039,10 @@ SS_make_initplan_from_plan(PlannerInfo *root, node = makeNode(SubPlan); node->subLinkType = EXPR_SUBLINK; node->plan_id = list_length(root->glob->subplans); - node->plan_name = psprintf("InitPlan %d (returns $%d)", - node->plan_id, prm->paramid); + node->plan_name = psprintf("InitPlan %d", node->plan_id); get_first_col_type(plan, &node->firstColType, &node->firstColTypmod, &node->firstColCollation); + node->parallel_safe = plan->parallel_safe; node->setParam = list_make1_int(prm->paramid); root->init_plans = lappend(root->init_plans, node); diff --git a/src/backend/optimizer/prep/meson.build b/src/backend/optimizer/prep/meson.build index aa83ed3be7312..ac37c98e13b27 100644 --- a/src/backend/optimizer/prep/meson.build +++ b/src/backend/optimizer/prep/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'prepagg.c', diff --git a/src/backend/optimizer/prep/prepagg.c b/src/backend/optimizer/prep/prepagg.c index 806078311c6e7..4606df379a82e 100644 --- a/src/backend/optimizer/prep/prepagg.c +++ b/src/backend/optimizer/prep/prepagg.c @@ -22,7 +22,7 @@ * at executor startup. The Agg nodes are constructed much later in the * planning, however, so it's not trivial. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -39,7 +39,6 @@ #include "catalog/pg_type.h" #include "nodes/nodeFuncs.h" #include "nodes/pathnodes.h" -#include "optimizer/clauses.h" #include "optimizer/cost.h" #include "optimizer/optimizer.h" #include "optimizer/plancat.h" diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index 73ff40721c974..2c6faad4daefe 100644 --- a/src/backend/optimizer/prep/prepjointree.c +++ b/src/backend/optimizer/prep/prepjointree.c @@ -14,7 +14,7 @@ * remove_useless_result_rtes * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -42,6 +42,17 @@ #include "rewrite/rewriteManip.h" +typedef struct nullingrel_info +{ + /* + * For each leaf RTE, nullingrels[rti] is the set of relids of outer joins + * that potentially null that RTE. + */ + Relids *nullingrels; + /* Length of range table (maximum index in nullingrels[]) */ + int rtlength; /* used only for assertion checks */ +} nullingrel_info; + typedef struct pullup_replace_vars_context { PlannerInfo *root; @@ -49,6 +60,8 @@ typedef struct pullup_replace_vars_context RangeTblEntry *target_rte; /* RTE of subquery */ Relids relids; /* relids within subquery, as numbered after * pullup (set only if target_rte->lateral) */ + nullingrel_info *nullinfo; /* per-RTE nullingrel info (set only if + * target_rte->lateral) */ bool *outer_hasSubLinks; /* -> outer query's hasSubLinks */ int varno; /* varno of subquery */ bool wrap_non_vars; /* do we need all non-Var outputs to be PHVs? */ @@ -142,6 +155,9 @@ static void substitute_phv_relids(Node *node, static void fix_append_rel_relids(PlannerInfo *root, int varno, Relids subrelids); static Node *find_jointree_node_for_rel(Node *jtnode, int relid); +static nullingrel_info *get_nullingrels(Query *parse); +static void get_nullingrels_recurse(Node *jtnode, Relids upper_nullingrels, + nullingrel_info *info); /* @@ -153,9 +169,14 @@ transform_MERGE_to_join(Query *parse) { RangeTblEntry *joinrte; JoinExpr *joinexpr; + bool have_action[NUM_MERGE_MATCH_KINDS]; JoinType jointype; int joinrti; List *vars; + RangeTblRef *rtr; + FromExpr *target; + Node *source; + int sourcerti; if (parse->commandType != CMD_MERGE) return; @@ -164,11 +185,27 @@ transform_MERGE_to_join(Query *parse) vars = NIL; /* - * When any WHEN NOT MATCHED THEN INSERT clauses exist, we need to use an - * outer join so that we process all unmatched tuples from the source - * relation. If none exist, we can use an inner join. + * Work out what kind of join is required. If there any WHEN NOT MATCHED + * BY SOURCE/TARGET actions, an outer join is required so that we process + * all unmatched tuples from the source and/or target relations. + * Otherwise, we can use an inner join. */ - if (parse->mergeUseOuterJoin) + have_action[MERGE_WHEN_MATCHED] = false; + have_action[MERGE_WHEN_NOT_MATCHED_BY_SOURCE] = false; + have_action[MERGE_WHEN_NOT_MATCHED_BY_TARGET] = false; + + foreach_node(MergeAction, action, parse->mergeActionList) + { + if (action->commandType != CMD_NOTHING) + have_action[action->matchKind] = true; + } + + if (have_action[MERGE_WHEN_NOT_MATCHED_BY_SOURCE] && + have_action[MERGE_WHEN_NOT_MATCHED_BY_TARGET]) + jointype = JOIN_FULL; + else if (have_action[MERGE_WHEN_NOT_MATCHED_BY_SOURCE]) + jointype = JOIN_LEFT; + else if (have_action[MERGE_WHEN_NOT_MATCHED_BY_TARGET]) jointype = JOIN_RIGHT; else jointype = JOIN_INNER; @@ -198,23 +235,146 @@ transform_MERGE_to_join(Query *parse) /* * Create a JOIN between the target and the source relation. + * + * Here the target is identified by parse->mergeTargetRelation. For a + * regular table, this will equal parse->resultRelation, but for a + * trigger-updatable view, it will be the expanded view subquery that we + * need to pull data from. + * + * The source relation is in parse->jointree->fromlist, but any quals in + * parse->jointree->quals are restrictions on the target relation (if the + * target relation is an auto-updatable view). */ + /* target rel, with any quals */ + rtr = makeNode(RangeTblRef); + rtr->rtindex = parse->mergeTargetRelation; + target = makeFromExpr(list_make1(rtr), parse->jointree->quals); + + /* source rel (expect exactly one -- see transformMergeStmt()) */ + Assert(list_length(parse->jointree->fromlist) == 1); + source = linitial(parse->jointree->fromlist); + + /* + * index of source rel (expect either a RangeTblRef or a JoinExpr -- see + * transformFromClauseItem()). + */ + if (IsA(source, RangeTblRef)) + sourcerti = ((RangeTblRef *) source)->rtindex; + else if (IsA(source, JoinExpr)) + sourcerti = ((JoinExpr *) source)->rtindex; + else + { + elog(ERROR, "unrecognized source node type: %d", + (int) nodeTag(source)); + sourcerti = 0; /* keep compiler quiet */ + } + + /* Join the source and target */ joinexpr = makeNode(JoinExpr); joinexpr->jointype = jointype; joinexpr->isNatural = false; - joinexpr->larg = (Node *) makeNode(RangeTblRef); - ((RangeTblRef *) joinexpr->larg)->rtindex = parse->resultRelation; - joinexpr->rarg = linitial(parse->jointree->fromlist); /* original join */ + joinexpr->larg = (Node *) target; + joinexpr->rarg = source; joinexpr->usingClause = NIL; joinexpr->join_using_alias = NULL; - /* The quals are removed from the jointree and into this specific join */ - joinexpr->quals = parse->jointree->quals; + joinexpr->quals = parse->mergeJoinCondition; joinexpr->alias = NULL; joinexpr->rtindex = joinrti; /* Make the new join be the sole entry in the query's jointree */ parse->jointree->fromlist = list_make1(joinexpr); parse->jointree->quals = NULL; + + /* + * If necessary, mark parse->targetlist entries that refer to the target + * as nullable by the join. Normally the targetlist will be empty for a + * MERGE, but if the target is a trigger-updatable view, it will contain a + * whole-row Var referring to the expanded view query. + */ + if (parse->targetList != NIL && + (jointype == JOIN_RIGHT || jointype == JOIN_FULL)) + parse->targetList = (List *) + add_nulling_relids((Node *) parse->targetList, + bms_make_singleton(parse->mergeTargetRelation), + bms_make_singleton(joinrti)); + + /* + * If the source relation is on the outer side of the join, mark any + * source relation Vars in the join condition, actions, and RETURNING list + * as nullable by the join. These Vars will be added to the targetlist by + * preprocess_targetlist(), so it's important to mark them correctly here. + * + * It might seem that this is not necessary for Vars in the join + * condition, since it is inside the join, but it is also needed above the + * join (in the ModifyTable node) to distinguish between the MATCHED and + * NOT MATCHED BY SOURCE cases -- see ExecMergeMatched(). Note that this + * creates a modified copy of the join condition, for use above the join, + * without modifying the the original join condition, inside the join. + */ + if (jointype == JOIN_LEFT || jointype == JOIN_FULL) + { + parse->mergeJoinCondition = + add_nulling_relids(parse->mergeJoinCondition, + bms_make_singleton(sourcerti), + bms_make_singleton(joinrti)); + + foreach_node(MergeAction, action, parse->mergeActionList) + { + action->qual = + add_nulling_relids(action->qual, + bms_make_singleton(sourcerti), + bms_make_singleton(joinrti)); + + action->targetList = (List *) + add_nulling_relids((Node *) action->targetList, + bms_make_singleton(sourcerti), + bms_make_singleton(joinrti)); + } + + parse->returningList = (List *) + add_nulling_relids((Node *) parse->returningList, + bms_make_singleton(sourcerti), + bms_make_singleton(joinrti)); + } + + /* + * If there are any WHEN NOT MATCHED BY SOURCE actions, the executor will + * use the join condition to distinguish between MATCHED and NOT MATCHED + * BY SOURCE cases. Otherwise, it's no longer needed, and we set it to + * NULL, saving cycles during planning and execution. + * + * We need to be careful though: the executor evaluates this condition + * using the output of the join subplan node, which nulls the output from + * the source relation when the join condition doesn't match. That risks + * producing incorrect results when rechecking using a "non-strict" join + * condition, such as "src.col IS NOT DISTINCT FROM tgt.col". To guard + * against that, we add an additional "src IS NOT NULL" check to the join + * condition, so that it does the right thing when performing a recheck + * based on the output of the join subplan. + */ + if (have_action[MERGE_WHEN_NOT_MATCHED_BY_SOURCE]) + { + Var *var; + NullTest *ntest; + + /* source wholerow Var (nullable by the new join) */ + var = makeWholeRowVar(rt_fetch(sourcerti, parse->rtable), + sourcerti, 0, false); + var->varnullingrels = bms_make_singleton(joinrti); + + /* "src IS NOT NULL" check */ + ntest = makeNode(NullTest); + ntest->arg = (Expr *) var; + ntest->nulltesttype = IS_NOT_NULL; + ntest->argisrow = false; + ntest->location = -1; + + /* combine it with the original join condition */ + parse->mergeJoinCondition = + (Node *) make_and_qual((Node *) ntest, parse->mergeJoinCondition); + } + else + parse->mergeJoinCondition = NULL; /* join condition not needed */ } /* @@ -748,8 +908,14 @@ preprocess_function_rtes(PlannerInfo *root) rte->rtekind = RTE_SUBQUERY; rte->subquery = funcquery; rte->security_barrier = false; - /* Clear fields that should not be set in a subquery RTE */ - rte->functions = NIL; + + /* + * Clear fields that should not be set in a subquery RTE. + * However, we leave rte->functions filled in for the moment, + * in case makeWholeRowVar needs to consult it. We'll clear + * it in setrefs.c (see add_rte_to_flat_rtable) so that this + * abuse of the data structure doesn't escape the planner. + */ rte->funcordinality = false; } } @@ -1115,10 +1281,16 @@ pull_up_simple_subquery(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte, rvcontext.targetlist = subquery->targetList; rvcontext.target_rte = rte; if (rte->lateral) + { rvcontext.relids = get_relids_in_jointree((Node *) subquery->jointree, true, true); - else /* won't need relids */ + rvcontext.nullinfo = get_nullingrels(parse); + } + else /* won't need these values */ + { rvcontext.relids = NULL; + rvcontext.nullinfo = NULL; + } rvcontext.outer_hasSubLinks = &parse->hasSubLinks; rvcontext.varno = varno; /* this flag will be set below, if needed */ @@ -1580,6 +1752,9 @@ is_simple_subquery(PlannerInfo *root, Query *subquery, RangeTblEntry *rte, * such refs to be wrapped in PlaceHolderVars, even when they're below * the nearest outer join? But it's a pretty hokey usage, so not * clear this is worth sweating over.) + * + * If you change this, see also the comments about lateral references + * in pullup_replace_vars_callback(). */ if (lowest_outer_join != NULL) { @@ -1664,7 +1839,8 @@ pull_up_simple_values(PlannerInfo *root, Node *jtnode, RangeTblEntry *rte) rvcontext.root = root; rvcontext.targetlist = tlist; rvcontext.target_rte = rte; - rvcontext.relids = NULL; + rvcontext.relids = NULL; /* can't be any lateral references here */ + rvcontext.nullinfo = NULL; rvcontext.outer_hasSubLinks = &parse->hasSubLinks; rvcontext.varno = varno; rvcontext.wrap_non_vars = false; @@ -1805,6 +1981,10 @@ pull_up_constant_function(PlannerInfo *root, Node *jtnode, if (rtf->funccolcount != 1) return jtnode; /* definitely composite */ + /* If it has a coldeflist, it certainly returns RECORD */ + if (rtf->funccolnames != NIL) + return jtnode; /* must be a one-column RECORD type */ + functypclass = get_expr_result_type(rtf->funcexpr, &funcrettype, &tupdesc); @@ -1822,9 +2002,10 @@ pull_up_constant_function(PlannerInfo *root, Node *jtnode, /* * Since this function was reduced to a Const, it doesn't contain any * lateral references, even if it's marked as LATERAL. This means we - * don't need to fill relids. + * don't need to fill relids or nullinfo. */ rvcontext.relids = NULL; + rvcontext.nullinfo = NULL; rvcontext.outer_hasSubLinks = &parse->hasSubLinks; rvcontext.varno = ((RangeTblRef *) jtnode)->rtindex; @@ -2122,14 +2303,6 @@ perform_pullup_replace_vars(PlannerInfo *root, parse->returningList = (List *) pullup_replace_vars((Node *) parse->returningList, rvcontext); - foreach(lc, parse->windowClause) - { - WindowClause *wc = lfirst_node(WindowClause, lc); - - if (wc->runCondition != NIL) - wc->runCondition = (List *) - pullup_replace_vars((Node *) wc->runCondition, rvcontext); - } if (parse->onConflict) { parse->onConflict->onConflictSet = (List *) @@ -2155,6 +2328,8 @@ perform_pullup_replace_vars(PlannerInfo *root, pullup_replace_vars((Node *) action->targetList, rvcontext); } } + parse->mergeJoinCondition = pullup_replace_vars(parse->mergeJoinCondition, + rvcontext); replace_vars_in_jointree((Node *) parse->jointree, rvcontext); Assert(parse->setOperations == NULL); parse->havingQual = pullup_replace_vars(parse->havingQual, rvcontext); @@ -2435,17 +2610,67 @@ pullup_replace_vars_callback(Var *var, else if (newnode && IsA(newnode, PlaceHolderVar) && ((PlaceHolderVar *) newnode)->phlevelsup == 0) { - /* No need to wrap a PlaceHolderVar with another one, either */ - wrap = false; + /* The same rules apply for a PlaceHolderVar */ + if (rcon->target_rte->lateral && + !bms_is_subset(((PlaceHolderVar *) newnode)->phrels, + rcon->relids)) + wrap = true; + else + wrap = false; + } + else if (rcon->wrap_non_vars) + { + /* Caller told us to wrap all non-Vars in a PlaceHolderVar */ + wrap = true; } else { /* - * Must wrap, either because we need a place to insert - * varnullingrels or because caller told us to wrap - * everything. + * If the node contains Var(s) or PlaceHolderVar(s) of the + * subquery being pulled up, and does not contain any + * non-strict constructs, then instead of adding a PHV on top + * we can add the required nullingrels to those Vars/PHVs. + * (This is fundamentally a generalization of the above cases + * for bare Vars and PHVs.) + * + * This test is somewhat expensive, but it avoids pessimizing + * the plan in cases where the nullingrels get removed again + * later by outer join reduction. + * + * Note that we don't force wrapping of expressions containing + * lateral references, so long as they also contain Vars/PHVs + * of the subquery. This is okay because of the restriction + * to strict constructs: if the subquery's Vars/PHVs have been + * forced to NULL by an outer join then the end result of the + * expression will be NULL too, regardless of the lateral + * references. So it's not necessary to force the expression + * to be evaluated below the outer join. This can be a very + * valuable optimization, because it may allow us to avoid + * using a nested loop to pass the lateral reference down. + * + * This analysis could be tighter: in particular, a non-strict + * construct hidden within a lower-level PlaceHolderVar is not + * reason to add another PHV. But for now it doesn't seem + * worth the code to be more exact. + * + * For a LATERAL subquery, we have to check the actual var + * membership of the node, but if it's non-lateral then any + * level-zero var must belong to the subquery. */ - wrap = true; + if ((rcon->target_rte->lateral ? + bms_overlap(pull_varnos(rcon->root, newnode), + rcon->relids) : + contain_vars_of_level(newnode, 0)) && + !contain_nonstrict_functions(newnode)) + { + /* No wrap needed */ + wrap = false; + } + else + { + /* Else wrap it in a PlaceHolderVar */ + wrap = true; + } } if (wrap) @@ -2466,18 +2691,14 @@ pullup_replace_vars_callback(Var *var, } } - /* Must adjust varlevelsup if replaced Var is within a subquery */ - if (var->varlevelsup > 0) - IncrementVarSublevelsUp(newnode, var->varlevelsup, 0); - - /* Propagate any varnullingrels into the replacement Var or PHV */ + /* Propagate any varnullingrels into the replacement expression */ if (var->varnullingrels != NULL) { if (IsA(newnode, Var)) { Var *newvar = (Var *) newnode; - Assert(newvar->varlevelsup == var->varlevelsup); + Assert(newvar->varlevelsup == 0); newvar->varnullingrels = bms_add_members(newvar->varnullingrels, var->varnullingrels); } @@ -2485,14 +2706,73 @@ pullup_replace_vars_callback(Var *var, { PlaceHolderVar *newphv = (PlaceHolderVar *) newnode; - Assert(newphv->phlevelsup == var->varlevelsup); + Assert(newphv->phlevelsup == 0); newphv->phnullingrels = bms_add_members(newphv->phnullingrels, var->varnullingrels); } else - elog(ERROR, "failed to wrap a non-Var"); + { + /* + * There should be Vars/PHVs within the expression that we can + * modify. Vars/PHVs of the subquery should have the full + * var->varnullingrels added to them, but if there are lateral + * references within the expression, those must be marked with + * only the nullingrels that potentially apply to them. (This + * corresponds to the fact that the expression will now be + * evaluated at the join level of the Var that we are replacing: + * the lateral references may have bubbled up through fewer outer + * joins than the subquery's Vars have. Per the discussion above, + * we'll still get the right answers.) That relid set could be + * different for different lateral relations, so we have to do + * this work for each one. + * + * (Currently, the restrictions in is_simple_subquery() mean that + * at most we have to remove the lowest outer join's relid from + * the nullingrels of a lateral reference. However, we might + * relax those restrictions someday, so let's do this right.) + */ + if (rcon->target_rte->lateral) + { + nullingrel_info *nullinfo = rcon->nullinfo; + Relids lvarnos; + int lvarno; + + /* + * Identify lateral varnos used within newnode. We must do + * this before injecting var->varnullingrels into the tree. + */ + lvarnos = pull_varnos(rcon->root, newnode); + lvarnos = bms_del_members(lvarnos, rcon->relids); + /* For each one, add relevant nullingrels if any */ + lvarno = -1; + while ((lvarno = bms_next_member(lvarnos, lvarno)) >= 0) + { + Relids lnullingrels; + + Assert(lvarno > 0 && lvarno <= nullinfo->rtlength); + lnullingrels = bms_intersect(var->varnullingrels, + nullinfo->nullingrels[lvarno]); + if (!bms_is_empty(lnullingrels)) + newnode = add_nulling_relids(newnode, + bms_make_singleton(lvarno), + lnullingrels); + } + } + + /* Finally, deal with Vars/PHVs of the subquery itself */ + newnode = add_nulling_relids(newnode, + rcon->relids, + var->varnullingrels); + /* Assert we did put the varnullingrels into the expression */ + Assert(bms_is_subset(var->varnullingrels, + pull_varnos(rcon->root, newnode))); + } } + /* Must adjust varlevelsup if replaced Var is within a subquery */ + if (var->varlevelsup > 0) + IncrementVarSublevelsUp(newnode, var->varlevelsup, 0); + return newnode; } @@ -3917,3 +4197,94 @@ find_jointree_node_for_rel(Node *jtnode, int relid) (int) nodeTag(jtnode)); return NULL; } + +/* + * get_nullingrels: collect info about which outer joins null which relations + * + * The result struct contains, for each leaf relation used in the query, + * the set of relids of outer joins that potentially null that rel. + */ +static nullingrel_info * +get_nullingrels(Query *parse) +{ + nullingrel_info *result = palloc_object(nullingrel_info); + + result->rtlength = list_length(parse->rtable); + result->nullingrels = palloc0_array(Relids, result->rtlength + 1); + get_nullingrels_recurse((Node *) parse->jointree, NULL, result); + return result; +} + +/* + * Recursive guts of get_nullingrels(). + * + * Note: at any recursion level, the passed-down upper_nullingrels must be + * treated as a constant, but it can be stored directly into *info + * if we're at leaf level. Upper recursion levels do not free their mutated + * copies of the nullingrels, because those are probably referenced by + * at least one leaf rel. + */ +static void +get_nullingrels_recurse(Node *jtnode, Relids upper_nullingrels, + nullingrel_info *info) +{ + if (jtnode == NULL) + return; + if (IsA(jtnode, RangeTblRef)) + { + int varno = ((RangeTblRef *) jtnode)->rtindex; + + Assert(varno > 0 && varno <= info->rtlength); + info->nullingrels[varno] = upper_nullingrels; + } + else if (IsA(jtnode, FromExpr)) + { + FromExpr *f = (FromExpr *) jtnode; + ListCell *l; + + foreach(l, f->fromlist) + { + get_nullingrels_recurse(lfirst(l), upper_nullingrels, info); + } + } + else if (IsA(jtnode, JoinExpr)) + { + JoinExpr *j = (JoinExpr *) jtnode; + Relids local_nullingrels; + + switch (j->jointype) + { + case JOIN_INNER: + get_nullingrels_recurse(j->larg, upper_nullingrels, info); + get_nullingrels_recurse(j->rarg, upper_nullingrels, info); + break; + case JOIN_LEFT: + case JOIN_SEMI: + case JOIN_ANTI: + local_nullingrels = bms_add_member(bms_copy(upper_nullingrels), + j->rtindex); + get_nullingrels_recurse(j->larg, upper_nullingrels, info); + get_nullingrels_recurse(j->rarg, local_nullingrels, info); + break; + case JOIN_FULL: + local_nullingrels = bms_add_member(bms_copy(upper_nullingrels), + j->rtindex); + get_nullingrels_recurse(j->larg, local_nullingrels, info); + get_nullingrels_recurse(j->rarg, local_nullingrels, info); + break; + case JOIN_RIGHT: + local_nullingrels = bms_add_member(bms_copy(upper_nullingrels), + j->rtindex); + get_nullingrels_recurse(j->larg, local_nullingrels, info); + get_nullingrels_recurse(j->rarg, upper_nullingrels, info); + break; + default: + elog(ERROR, "unrecognized join type: %d", + (int) j->jointype); + break; + } + } + else + elog(ERROR, "unrecognized node type: %d", + (int) nodeTag(jtnode)); +} diff --git a/src/backend/optimizer/prep/prepqual.c b/src/backend/optimizer/prep/prepqual.c index 9f08b27c3b58c..cbcf83f847327 100644 --- a/src/backend/optimizer/prep/prepqual.c +++ b/src/backend/optimizer/prep/prepqual.c @@ -19,7 +19,7 @@ * tree after local transformations that might introduce nested AND/ORs. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -34,7 +34,6 @@ #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" -#include "optimizer/prep.h" #include "utils/lsyscache.h" diff --git a/src/backend/optimizer/prep/preptlist.c b/src/backend/optimizer/prep/preptlist.c index 9d46488ef7c85..35358b085d506 100644 --- a/src/backend/optimizer/prep/preptlist.c +++ b/src/backend/optimizer/prep/preptlist.c @@ -25,7 +25,7 @@ * rewriter's work is more concerned with SQL semantics. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -44,9 +44,11 @@ #include "optimizer/tlist.h" #include "parser/parse_coerce.h" #include "parser/parsetree.h" +#include "utils/lsyscache.h" #include "utils/rel.h" -static List *expand_insert_targetlist(List *tlist, Relation rel); +static List *expand_insert_targetlist(PlannerInfo *root, List *tlist, + Relation rel); /* @@ -102,7 +104,7 @@ preprocess_targetlist(PlannerInfo *root) */ tlist = parse->targetList; if (command_type == CMD_INSERT) - tlist = expand_insert_targetlist(tlist, target_relation); + tlist = expand_insert_targetlist(root, tlist, target_relation); else if (command_type == CMD_UPDATE) root->update_colnos = extract_update_targetlist_colnos(tlist); @@ -134,6 +136,7 @@ preprocess_targetlist(PlannerInfo *root) if (command_type == CMD_MERGE) { ListCell *l; + List *vars; /* * For MERGE, handle targetlist of each MergeAction separately. Give @@ -144,11 +147,11 @@ preprocess_targetlist(PlannerInfo *root) foreach(l, parse->mergeActionList) { MergeAction *action = (MergeAction *) lfirst(l); - List *vars; ListCell *l2; if (action->commandType == CMD_INSERT) - action->targetList = expand_insert_targetlist(action->targetList, + action->targetList = expand_insert_targetlist(root, + action->targetList, target_relation); else if (action->commandType == CMD_UPDATE) action->updateColnos = @@ -182,6 +185,30 @@ preprocess_targetlist(PlannerInfo *root) } list_free(vars); } + + /* + * Add resjunk entries for any Vars and PlaceHolderVars used in the + * join condition that belong to relations other than the target. We + * don't expect to see any aggregates or window functions here. + */ + vars = pull_var_clause(parse->mergeJoinCondition, + PVC_INCLUDE_PLACEHOLDERS); + foreach(l, vars) + { + Var *var = (Var *) lfirst(l); + TargetEntry *tle; + + if (IsA(var, Var) && var->varno == result_relation) + continue; /* don't need it */ + + if (tlist_member((Expr *) var, tlist)) + continue; /* already got it */ + + tle = makeTargetEntry((Expr *) var, + list_length(tlist) + 1, + NULL, true); + tlist = lappend(tlist, tle); + } } /* @@ -352,7 +379,7 @@ extract_update_targetlist_colnos(List *tlist) * but now this code is only applied to INSERT targetlists. */ static List * -expand_insert_targetlist(List *tlist, Relation rel) +expand_insert_targetlist(PlannerInfo *root, List *tlist, Relation rel) { List *new_tlist = NIL; ListCell *tlist_item; @@ -393,9 +420,8 @@ expand_insert_targetlist(List *tlist, Relation rel) * * INSERTs should insert NULL in this case. (We assume the * rewriter would have inserted any available non-NULL default - * value.) Also, if the column isn't dropped, apply any domain - * constraints that might exist --- this is to catch domain NOT - * NULL. + * value.) Also, normally we must apply any domain constraints + * that might exist --- this is to catch domain NOT NULL. * * When generating a NULL constant for a dropped column, we label * it INT4 (any other guaranteed-to-exist datatype would do as @@ -405,29 +431,17 @@ expand_insert_targetlist(List *tlist, Relation rel) * representation is datatype-independent. This could perhaps * confuse code comparing the finished plan to the target * relation, however. + * + * Another exception is that if the column is generated, the value + * we produce here will be ignored, and we don't want to risk + * throwing an error. So in that case we *don't* want to apply + * domain constraints, so we must produce a NULL of the base type. + * Again, code comparing the finished plan to the target relation + * must account for this. */ - Oid atttype = att_tup->atttypid; - Oid attcollation = att_tup->attcollation; Node *new_expr; - if (!att_tup->attisdropped) - { - new_expr = (Node *) makeConst(atttype, - -1, - attcollation, - att_tup->attlen, - (Datum) 0, - true, /* isnull */ - att_tup->attbyval); - new_expr = coerce_to_domain(new_expr, - InvalidOid, -1, - atttype, - COERCION_IMPLICIT, - COERCE_IMPLICIT_CAST, - -1, - false); - } - else + if (att_tup->attisdropped) { /* Insert NULL for dropped column */ new_expr = (Node *) makeConst(INT4OID, @@ -438,6 +452,33 @@ expand_insert_targetlist(List *tlist, Relation rel) true, /* isnull */ true /* byval */ ); } + else if (att_tup->attgenerated) + { + /* Generated column, insert a NULL of the base type */ + Oid baseTypeId = att_tup->atttypid; + int32 baseTypeMod = att_tup->atttypmod; + + baseTypeId = getBaseTypeAndTypmod(baseTypeId, &baseTypeMod); + new_expr = (Node *) makeConst(baseTypeId, + baseTypeMod, + att_tup->attcollation, + att_tup->attlen, + (Datum) 0, + true, /* isnull */ + att_tup->attbyval); + } + else + { + /* Normal column, insert a NULL of the column datatype */ + new_expr = coerce_null_to_domain(att_tup->atttypid, + att_tup->atttypmod, + att_tup->attcollation, + att_tup->attlen, + att_tup->attbyval); + /* Must run expression preprocessing on any non-const nodes */ + if (!IsA(new_expr, Const)) + new_expr = eval_const_expressions(root, new_expr); + } new_tle = makeTargetEntry((Expr *) new_expr, attrno, diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c index 0c68ec011bef8..d4c683b6b4625 100644 --- a/src/backend/optimizer/prep/prepunion.c +++ b/src/backend/optimizer/prep/prepunion.c @@ -12,7 +12,7 @@ * case, but most of the heavy lifting for that is done elsewhere, * notably in prepjointree.c and allpaths.c. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -24,9 +24,6 @@ #include "postgres.h" #include "access/htup_details.h" -#include "access/sysattr.h" -#include "catalog/partition.h" -#include "catalog/pg_inherits.h" #include "catalog/pg_type.h" #include "miscadmin.h" #include "nodes/makefuncs.h" @@ -34,16 +31,11 @@ #include "optimizer/cost.h" #include "optimizer/pathnode.h" #include "optimizer/paths.h" -#include "optimizer/planmain.h" #include "optimizer/planner.h" #include "optimizer/prep.h" #include "optimizer/tlist.h" #include "parser/parse_coerce.h" -#include "parser/parsetree.h" -#include "utils/lsyscache.h" -#include "utils/rel.h" #include "utils/selfuncs.h" -#include "utils/syscache.h" static RelOptInfo *recurse_set_operations(Node *setOp, PlannerInfo *root, @@ -51,11 +43,15 @@ static RelOptInfo *recurse_set_operations(Node *setOp, PlannerInfo *root, bool junkOK, int flag, List *refnames_tlist, List **pTargetList, - double *pNumGroups); + bool *istrivial_tlist); static RelOptInfo *generate_recursion_path(SetOperationStmt *setOp, PlannerInfo *root, List *refnames_tlist, List **pTargetList); +static void build_setop_child_paths(PlannerInfo *root, RelOptInfo *rel, + bool trivial_tlist, List *child_tlist, + List *interesting_pathkeys, + double *pNumGroups); static RelOptInfo *generate_union_paths(SetOperationStmt *op, PlannerInfo *root, List *refnames_tlist, List **pTargetList); @@ -65,9 +61,8 @@ static RelOptInfo *generate_nonunion_paths(SetOperationStmt *op, PlannerInfo *ro static List *plan_union_children(PlannerInfo *root, SetOperationStmt *top_union, List *refnames_tlist, - List **tlist_list); -static Path *make_union_unique(SetOperationStmt *op, Path *path, List *tlist, - PlannerInfo *root); + List **tlist_list, + List **istrivial_tlist); static void postprocess_setop_rel(PlannerInfo *root, RelOptInfo *rel); static bool choose_hashed_setop(PlannerInfo *root, List *groupClauses, Path *input_path, @@ -122,10 +117,10 @@ plan_set_operations(PlannerInfo *root) Assert(parse->distinctClause == NIL); /* - * In the outer query level, we won't have any true equivalences to deal - * with; but we do want to be able to make pathkeys, which will require - * single-member EquivalenceClasses. Indicate that EC merging is complete - * so that pathkeys.c won't complain. + * In the outer query level, equivalence classes are limited to classes + * which define that the top-level target entry is equivalent to the + * corresponding child target entry. There won't be any equivalence class + * merging. Mark that merging is complete to allow us to make pathkeys. */ Assert(root->eq_classes == NIL); root->ec_merging_done = true; @@ -160,6 +155,8 @@ plan_set_operations(PlannerInfo *root) } else { + bool trivial_tlist; + /* * Recurse on setOperations tree to generate paths for set ops. The * final output paths should have just the column types shown as the @@ -171,7 +168,7 @@ plan_set_operations(PlannerInfo *root) true, -1, leftmostQuery->targetList, &top_tlist, - NULL); + &trivial_tlist); } /* Must return the built tlist into root->processed_tlist. */ @@ -180,6 +177,31 @@ plan_set_operations(PlannerInfo *root) return setop_rel; } +/* + * set_operation_ordered_results_useful + * Return true if the given SetOperationStmt can be executed by utilizing + * paths that provide sorted input according to the setop's targetlist. + * Returns false when sorted paths are not any more useful then unsorted + * ones. + */ +bool +set_operation_ordered_results_useful(SetOperationStmt *setop) +{ + /* + * Paths sorted by the targetlist are useful for UNION as we can opt to + * MergeAppend the sorted paths then Unique them. Ordered paths are no + * more useful than unordered ones for UNION ALL. + */ + if (!setop->all && setop->op == SETOP_UNION) + return true; + + /* + * EXCEPT / EXCEPT ALL / INTERSECT / INTERSECT ALL cannot yet utilize + * correctly sorted input paths. + */ + return false; +} + /* * recurse_set_operations * Recursively handle one step in a tree of set operations @@ -192,8 +214,8 @@ plan_set_operations(PlannerInfo *root) * * Returns a RelOptInfo for the subtree, as well as these output parameters: * *pTargetList: receives the fully-fledged tlist for the subtree's top plan - * *pNumGroups: if not NULL, we estimate the number of distinct groups - * in the result, and store it there + * *istrivial_tlist: true if, and only if, datatypes between parent and child + * match. * * The pTargetList output parameter is mostly redundant with the pathtarget * of the returned RelOptInfo, but for the moment we need it because much of @@ -210,9 +232,11 @@ recurse_set_operations(Node *setOp, PlannerInfo *root, bool junkOK, int flag, List *refnames_tlist, List **pTargetList, - double *pNumGroups) + bool *istrivial_tlist) { - RelOptInfo *rel = NULL; /* keep compiler quiet */ + RelOptInfo *rel; + + *istrivial_tlist = true; /* for now */ /* Guard against stack overflow due to overly complex setop nests */ check_stack_depth(); @@ -221,11 +245,9 @@ recurse_set_operations(Node *setOp, PlannerInfo *root, { RangeTblRef *rtr = (RangeTblRef *) setOp; RangeTblEntry *rte = root->simple_rte_array[rtr->rtindex]; + SetOperationStmt *setops; Query *subquery = rte->subquery; PlannerInfo *subroot; - RelOptInfo *final_rel; - Path *subpath; - Path *path; List *tlist; bool trivial_tlist; @@ -237,11 +259,16 @@ recurse_set_operations(Node *setOp, PlannerInfo *root, /* plan_params should not be in use in current query level */ Assert(root->plan_params == NIL); + /* + * Pass the set operation details to the subquery_planner to have it + * consider generating Paths correctly ordered for the set operation. + */ + setops = castNode(SetOperationStmt, root->parse->setOperations); + /* Generate a subroot and Paths for the subquery */ - subroot = rel->subroot = subquery_planner(root->glob, subquery, - root, - false, - root->tuple_fraction); + subroot = rel->subroot = subquery_planner(root->glob, subquery, root, + false, root->tuple_fraction, + setops); /* * It should not be possible for the primitive query to contain any @@ -262,90 +289,7 @@ recurse_set_operations(Node *setOp, PlannerInfo *root, /* Return the fully-fledged tlist to caller, too */ *pTargetList = tlist; - - /* - * Mark rel with estimated output rows, width, etc. Note that we have - * to do this before generating outer-query paths, else - * cost_subqueryscan is not happy. - */ - set_subquery_size_estimates(root, rel); - - /* - * Since we may want to add a partial path to this relation, we must - * set its consider_parallel flag correctly. - */ - final_rel = fetch_upper_rel(subroot, UPPERREL_FINAL, NULL); - rel->consider_parallel = final_rel->consider_parallel; - - /* - * For the moment, we consider only a single Path for the subquery. - * This should change soon (make it look more like - * set_subquery_pathlist). - */ - subpath = get_cheapest_fractional_path(final_rel, - root->tuple_fraction); - - /* - * Stick a SubqueryScanPath atop that. - * - * We don't bother to determine the subquery's output ordering since - * it won't be reflected in the set-op result anyhow; so just label - * the SubqueryScanPath with nil pathkeys. (XXX that should change - * soon too, likely.) - */ - path = (Path *) create_subqueryscan_path(root, rel, subpath, - trivial_tlist, - NIL, NULL); - - add_path(rel, path); - - /* - * If we have a partial path for the child relation, we can use that - * to build a partial path for this relation. But there's no point in - * considering any path but the cheapest. - */ - if (rel->consider_parallel && bms_is_empty(rel->lateral_relids) && - final_rel->partial_pathlist != NIL) - { - Path *partial_subpath; - Path *partial_path; - - partial_subpath = linitial(final_rel->partial_pathlist); - partial_path = (Path *) - create_subqueryscan_path(root, rel, partial_subpath, - trivial_tlist, - NIL, NULL); - add_partial_path(rel, partial_path); - } - - /* - * Estimate number of groups if caller wants it. If the subquery used - * grouping or aggregation, its output is probably mostly unique - * anyway; otherwise do statistical estimation. - * - * XXX you don't really want to know about this: we do the estimation - * using the subquery's original targetlist expressions, not the - * subroot->processed_tlist which might seem more appropriate. The - * reason is that if the subquery is itself a setop, it may return a - * processed_tlist containing "varno 0" Vars generated by - * generate_append_tlist, and those would confuse estimate_num_groups - * mightily. We ought to get rid of the "varno 0" hack, but that - * requires a redesign of the parsetree representation of setops, so - * that there can be an RTE corresponding to each setop's output. - */ - if (pNumGroups) - { - if (subquery->groupClause || subquery->groupingSets || - subquery->distinctClause || - subroot->hasHavingQual || subquery->hasAggs) - *pNumGroups = subpath->rows; - else - *pNumGroups = estimate_num_groups(subroot, - get_tlist_exprs(subquery->targetList, false), - subpath->rows, - NULL, - NULL); - } + *istrivial_tlist = trivial_tlist; } else if (IsA(setOp, SetOperationStmt)) { @@ -360,8 +304,6 @@ recurse_set_operations(Node *setOp, PlannerInfo *root, rel = generate_nonunion_paths(op, root, refnames_tlist, pTargetList); - if (pNumGroups) - *pNumGroups = rel->rows; /* * If necessary, add a Result node to project the caller-requested @@ -391,6 +333,7 @@ recurse_set_operations(Node *setOp, PlannerInfo *root, *pTargetList, refnames_tlist, &trivial_tlist); + *istrivial_tlist = trivial_tlist; target = create_pathtarget(root, *pTargetList); /* Apply projection to each path */ @@ -421,16 +364,16 @@ recurse_set_operations(Node *setOp, PlannerInfo *root, lfirst(lc) = path; } } + postprocess_setop_rel(root, rel); } else { elog(ERROR, "unrecognized node type: %d", (int) nodeTag(setOp)); *pTargetList = NIL; + rel = NULL; /* keep compiler quiet */ } - postprocess_setop_rel(root, rel); - return rel; } @@ -449,7 +392,9 @@ generate_recursion_path(SetOperationStmt *setOp, PlannerInfo *root, Path *lpath; Path *rpath; List *lpath_tlist; + bool lpath_trivial_tlist; List *rpath_tlist; + bool rpath_trivial_tlist; List *tlist; List *groupList; double dNumGroups; @@ -469,7 +414,10 @@ generate_recursion_path(SetOperationStmt *setOp, PlannerInfo *root, false, -1, refnames_tlist, &lpath_tlist, - NULL); + &lpath_trivial_tlist); + if (lrel->rtekind == RTE_SUBQUERY) + build_setop_child_paths(root, lrel, lpath_trivial_tlist, lpath_tlist, + NIL, NULL); lpath = lrel->cheapest_total_path; /* The right path will want to look at the left one ... */ root->non_recursive_path = lpath; @@ -478,7 +426,10 @@ generate_recursion_path(SetOperationStmt *setOp, PlannerInfo *root, false, -1, refnames_tlist, &rpath_tlist, - NULL); + &rpath_trivial_tlist); + if (rrel->rtekind == RTE_SUBQUERY) + build_setop_child_paths(root, rrel, rpath_trivial_tlist, rpath_tlist, + NIL, NULL); rpath = rrel->cheapest_total_path; root->non_recursive_path = NULL; @@ -540,6 +491,204 @@ generate_recursion_path(SetOperationStmt *setOp, PlannerInfo *root, return result_rel; } +/* + * build_setop_child_paths + * Build paths for the set op child relation denoted by 'rel'. + * + * interesting_pathkeys: if not NIL, also include paths that suit these + * pathkeys, sorting any unsorted paths as required. + * *pNumGroups: if not NULL, we estimate the number of distinct groups + * in the result, and store it there. + */ +static void +build_setop_child_paths(PlannerInfo *root, RelOptInfo *rel, + bool trivial_tlist, List *child_tlist, + List *interesting_pathkeys, double *pNumGroups) +{ + RelOptInfo *final_rel; + List *setop_pathkeys = rel->subroot->setop_pathkeys; + ListCell *lc; + + /* it can't be a set op child rel if it's not a subquery */ + Assert(rel->rtekind == RTE_SUBQUERY); + + /* when sorting is needed, add child rel equivalences */ + if (interesting_pathkeys != NIL) + add_setop_child_rel_equivalences(root, + rel, + child_tlist, + interesting_pathkeys); + + /* + * Mark rel with estimated output rows, width, etc. Note that we have to + * do this before generating outer-query paths, else cost_subqueryscan is + * not happy. + */ + set_subquery_size_estimates(root, rel); + + /* + * Since we may want to add a partial path to this relation, we must set + * its consider_parallel flag correctly. + */ + final_rel = fetch_upper_rel(rel->subroot, UPPERREL_FINAL, NULL); + rel->consider_parallel = final_rel->consider_parallel; + + /* Generate subquery scan paths for any interesting path in final_rel */ + foreach(lc, final_rel->pathlist) + { + Path *subpath = (Path *) lfirst(lc); + List *pathkeys; + Path *cheapest_input_path = final_rel->cheapest_total_path; + bool is_sorted; + int presorted_keys; + + /* + * Include the cheapest path as-is so that the set operation can be + * cheaply implemented using a method which does not require the input + * to be sorted. + */ + if (subpath == cheapest_input_path) + { + /* Convert subpath's pathkeys to outer representation */ + pathkeys = convert_subquery_pathkeys(root, rel, subpath->pathkeys, + make_tlist_from_pathtarget(subpath->pathtarget)); + + /* Generate outer path using this subpath */ + add_path(rel, (Path *) create_subqueryscan_path(root, + rel, + subpath, + trivial_tlist, + pathkeys, + NULL)); + } + + /* skip dealing with sorted paths if the setop doesn't need them */ + if (interesting_pathkeys == NIL) + continue; + + /* + * Create paths to suit final sort order required for setop_pathkeys. + * Here we'll sort the cheapest input path (if not sorted already) and + * incremental sort any paths which are partially sorted. + */ + is_sorted = pathkeys_count_contained_in(setop_pathkeys, + subpath->pathkeys, + &presorted_keys); + + if (!is_sorted) + { + double limittuples = rel->subroot->limit_tuples; + + /* + * Try at least sorting the cheapest path and also try + * incrementally sorting any path which is partially sorted + * already (no need to deal with paths which have presorted keys + * when incremental sort is disabled unless it's the cheapest + * input path). + */ + if (subpath != cheapest_input_path && + (presorted_keys == 0 || !enable_incremental_sort)) + continue; + + /* + * We've no need to consider both a sort and incremental sort. + * We'll just do a sort if there are no presorted keys and an + * incremental sort when there are presorted keys. + */ + if (presorted_keys == 0 || !enable_incremental_sort) + subpath = (Path *) create_sort_path(rel->subroot, + final_rel, + subpath, + setop_pathkeys, + limittuples); + else + subpath = (Path *) create_incremental_sort_path(rel->subroot, + final_rel, + subpath, + setop_pathkeys, + presorted_keys, + limittuples); + } + + /* + * subpath is now sorted, so add it to the pathlist. We already added + * the cheapest_input_path above, so don't add it again unless we just + * sorted it. + */ + if (subpath != cheapest_input_path) + { + /* Convert subpath's pathkeys to outer representation */ + pathkeys = convert_subquery_pathkeys(root, rel, subpath->pathkeys, + make_tlist_from_pathtarget(subpath->pathtarget)); + + /* Generate outer path using this subpath */ + add_path(rel, (Path *) create_subqueryscan_path(root, + rel, + subpath, + trivial_tlist, + pathkeys, + NULL)); + } + } + + /* if consider_parallel is false, there should be no partial paths */ + Assert(final_rel->consider_parallel || + final_rel->partial_pathlist == NIL); + + /* + * If we have a partial path for the child relation, we can use that to + * build a partial path for this relation. But there's no point in + * considering any path but the cheapest. + */ + if (rel->consider_parallel && bms_is_empty(rel->lateral_relids) && + final_rel->partial_pathlist != NIL) + { + Path *partial_subpath; + Path *partial_path; + + partial_subpath = linitial(final_rel->partial_pathlist); + partial_path = (Path *) + create_subqueryscan_path(root, rel, partial_subpath, + trivial_tlist, + NIL, NULL); + add_partial_path(rel, partial_path); + } + + postprocess_setop_rel(root, rel); + + /* + * Estimate number of groups if caller wants it. If the subquery used + * grouping or aggregation, its output is probably mostly unique anyway; + * otherwise do statistical estimation. + * + * XXX you don't really want to know about this: we do the estimation + * using the subquery's original targetlist expressions, not the + * subroot->processed_tlist which might seem more appropriate. The reason + * is that if the subquery is itself a setop, it may return a + * processed_tlist containing "varno 0" Vars generated by + * generate_append_tlist, and those would confuse estimate_num_groups + * mightily. We ought to get rid of the "varno 0" hack, but that requires + * a redesign of the parsetree representation of setops, so that there can + * be an RTE corresponding to each setop's output. + */ + if (pNumGroups) + { + PlannerInfo *subroot = rel->subroot; + Query *subquery = subroot->parse; + + if (subquery->groupClause || subquery->groupingSets || + subquery->distinctClause || subroot->hasHavingQual || + subquery->hasAggs) + *pNumGroups = rel->cheapest_total_path->rows; + else + *pNumGroups = estimate_num_groups(subroot, + get_tlist_exprs(subquery->targetList, false), + rel->cheapest_total_path->rows, + NULL, + NULL); + } +} + /* * Generate paths for a UNION or UNION ALL node */ @@ -550,41 +699,38 @@ generate_union_paths(SetOperationStmt *op, PlannerInfo *root, { Relids relids = NULL; RelOptInfo *result_rel; - double save_fraction = root->tuple_fraction; ListCell *lc; - List *pathlist = NIL; + ListCell *lc2; + ListCell *lc3; + List *cheapest_pathlist = NIL; + List *ordered_pathlist = NIL; List *partial_pathlist = NIL; bool partial_paths_valid = true; bool consider_parallel = true; List *rellist; List *tlist_list; + List *trivial_tlist_list; List *tlist; - Path *path; - - /* - * If plain UNION, tell children to fetch all tuples. - * - * Note: in UNION ALL, we pass the top-level tuple_fraction unmodified to - * each arm of the UNION ALL. One could make a case for reducing the - * tuple fraction for later arms (discounting by the expected size of the - * earlier arms' results) but it seems not worth the trouble. The normal - * case where tuple_fraction isn't already zero is a LIMIT at top level, - * and passing it down as-is is usually enough to get the desired result - * of preferring fast-start plans. - */ - if (!op->all) - root->tuple_fraction = 0.0; + List *groupList = NIL; + Path *apath; + Path *gpath = NULL; + bool try_sorted = false; + List *union_pathkeys = NIL; /* * If any of my children are identical UNION nodes (same op, all-flag, and - * colTypes) then they can be merged into this node so that we generate - * only one Append and unique-ification for the lot. Recurse to find such - * nodes and compute their children's paths. + * colTypes/colCollations) then they can be merged into this node so that + * we generate only one Append/MergeAppend and unique-ification for the + * lot. Recurse to find such nodes. */ - rellist = plan_union_children(root, op, refnames_tlist, &tlist_list); + rellist = plan_union_children(root, + op, + refnames_tlist, + &tlist_list, + &trivial_tlist_list); /* - * Generate tlist for Append plan node. + * Generate tlist for Append/MergeAppend plan node. * * The tlist for an Append plan isn't important as far as the Append is * concerned, but we must make it look real anyway for the benefit of the @@ -592,15 +738,71 @@ generate_union_paths(SetOperationStmt *op, PlannerInfo *root, */ tlist = generate_append_tlist(op->colTypes, op->colCollations, false, tlist_list, refnames_tlist); - *pTargetList = tlist; + /* For UNIONs (not UNION ALL), try sorting, if sorting is possible */ + if (!op->all) + { + /* Identify the grouping semantics */ + groupList = generate_setop_grouplist(op, tlist); + + if (grouping_is_sortable(op->groupClauses)) + { + try_sorted = true; + /* Determine the pathkeys for sorting by the whole target list */ + union_pathkeys = make_pathkeys_for_sortclauses(root, groupList, + tlist); + + root->query_pathkeys = union_pathkeys; + } + } + + /* + * Now that we've got the append target list, we can build the union child + * paths. + */ + forthree(lc, rellist, lc2, trivial_tlist_list, lc3, tlist_list) + { + RelOptInfo *rel = lfirst(lc); + bool trivial_tlist = lfirst_int(lc2); + List *child_tlist = lfirst_node(List, lc3); + + /* only build paths for the union children */ + if (rel->rtekind == RTE_SUBQUERY) + build_setop_child_paths(root, rel, trivial_tlist, child_tlist, + union_pathkeys, NULL); + } + /* Build path lists and relid set. */ foreach(lc, rellist) { RelOptInfo *rel = lfirst(lc); + Path *ordered_path; - pathlist = lappend(pathlist, rel->cheapest_total_path); + cheapest_pathlist = lappend(cheapest_pathlist, + rel->cheapest_total_path); + + if (try_sorted) + { + ordered_path = get_cheapest_path_for_pathkeys(rel->pathlist, + union_pathkeys, + NULL, + TOTAL_COST, + false); + + if (ordered_path != NULL) + ordered_pathlist = lappend(ordered_pathlist, ordered_path); + else + { + /* + * If we can't find a sorted path, just give up trying to + * generate a list of correctly sorted child paths. This can + * happen when type coercion was added to the targetlist due + * to mismatching types from the union children. + */ + try_sorted = false; + } + } if (consider_parallel) { @@ -623,28 +825,21 @@ generate_union_paths(SetOperationStmt *op, PlannerInfo *root, result_rel = fetch_upper_rel(root, UPPERREL_SETOP, relids); result_rel->reltarget = create_pathtarget(root, tlist); result_rel->consider_parallel = consider_parallel; + result_rel->consider_startup = (root->tuple_fraction > 0); /* - * Append the child results together. - */ - path = (Path *) create_append_path(root, result_rel, pathlist, NIL, - NIL, NULL, 0, false, -1); - - /* - * For UNION ALL, we just need the Append path. For UNION, need to add - * node(s) to remove duplicates. + * Append the child results together using the cheapest paths from each + * union child. */ - if (!op->all) - path = make_union_unique(op, path, tlist, root); - - add_path(result_rel, path); + apath = (Path *) create_append_path(root, result_rel, cheapest_pathlist, + NIL, NIL, NULL, 0, false, -1); /* * Estimate number of groups. For now we just assume the output is unique * --- this is certainly true for the UNION case, and we want worst-case * estimates anyway. */ - result_rel->rows = path->rows; + result_rel->rows = apath->rows; /* * Now consider doing the same thing using the partial paths plus Append @@ -652,7 +847,7 @@ generate_union_paths(SetOperationStmt *op, PlannerInfo *root, */ if (partial_paths_valid) { - Path *ppath; + Path *papath; int parallel_workers = 0; /* Find the highest number of workers requested for any subpath. */ @@ -681,21 +876,137 @@ generate_union_paths(SetOperationStmt *op, PlannerInfo *root, } Assert(parallel_workers > 0); - ppath = (Path *) + papath = (Path *) create_append_path(root, result_rel, NIL, partial_pathlist, - NIL, NULL, - parallel_workers, enable_parallel_append, - -1); - ppath = (Path *) - create_gather_path(root, result_rel, ppath, + NIL, NULL, parallel_workers, + enable_parallel_append, -1); + gpath = (Path *) + create_gather_path(root, result_rel, papath, result_rel->reltarget, NULL, NULL); - if (!op->all) - ppath = make_union_unique(op, ppath, tlist, root); - add_path(result_rel, ppath); } - /* Undo effects of possibly forcing tuple_fraction to 0 */ - root->tuple_fraction = save_fraction; + if (!op->all) + { + double dNumGroups; + bool can_sort = grouping_is_sortable(groupList); + bool can_hash = grouping_is_hashable(groupList); + + /* + * XXX for the moment, take the number of distinct groups as equal to + * the total input size, i.e., the worst case. This is too + * conservative, but it's not clear how to get a decent estimate of + * the true size. One should note as well the propensity of novices + * to write UNION rather than UNION ALL even when they don't expect + * any duplicates... + */ + dNumGroups = apath->rows; + + if (can_hash) + { + Path *path; + + /* + * Try a hash aggregate plan on 'apath'. This is the cheapest + * available path containing each append child. + */ + path = (Path *) create_agg_path(root, + result_rel, + apath, + create_pathtarget(root, tlist), + AGG_HASHED, + AGGSPLIT_SIMPLE, + groupList, + NIL, + NULL, + dNumGroups); + add_path(result_rel, path); + + /* Try hash aggregate on the Gather path, if valid */ + if (gpath != NULL) + { + /* Hashed aggregate plan --- no sort needed */ + path = (Path *) create_agg_path(root, + result_rel, + gpath, + create_pathtarget(root, tlist), + AGG_HASHED, + AGGSPLIT_SIMPLE, + groupList, + NIL, + NULL, + dNumGroups); + add_path(result_rel, path); + } + } + + if (can_sort) + { + Path *path = apath; + + /* Try Sort -> Unique on the Append path */ + if (groupList != NIL) + path = (Path *) create_sort_path(root, result_rel, path, + make_pathkeys_for_sortclauses(root, groupList, tlist), + -1.0); + + path = (Path *) create_upper_unique_path(root, + result_rel, + path, + list_length(path->pathkeys), + dNumGroups); + + add_path(result_rel, path); + + /* Try Sort -> Unique on the Gather path, if set */ + if (gpath != NULL) + { + path = gpath; + + path = (Path *) create_sort_path(root, result_rel, path, + make_pathkeys_for_sortclauses(root, groupList, tlist), + -1.0); + + path = (Path *) create_upper_unique_path(root, + result_rel, + path, + list_length(path->pathkeys), + dNumGroups); + add_path(result_rel, path); + } + } + + /* + * Try making a MergeAppend path if we managed to find a path with the + * correct pathkeys in each union child query. + */ + if (try_sorted && groupList != NIL) + { + Path *path; + + path = (Path *) create_merge_append_path(root, + result_rel, + ordered_pathlist, + union_pathkeys, + NULL); + + /* and make the MergeAppend unique */ + path = (Path *) create_upper_unique_path(root, + result_rel, + path, + list_length(tlist), + dNumGroups); + + add_path(result_rel, path); + } + } + else + { + /* UNION ALL */ + add_path(result_rel, apath); + + if (gpath != NULL) + add_path(result_rel, gpath); + } return result_rel; } @@ -721,6 +1032,8 @@ generate_nonunion_paths(SetOperationStmt *op, PlannerInfo *root, *tlist, *groupList, *pathlist; + bool lpath_trivial_tlist, + rpath_trivial_tlist; double dLeftGroups, dRightGroups, dNumGroups, @@ -740,14 +1053,26 @@ generate_nonunion_paths(SetOperationStmt *op, PlannerInfo *root, false, 0, refnames_tlist, &lpath_tlist, - &dLeftGroups); + &lpath_trivial_tlist); + if (lrel->rtekind == RTE_SUBQUERY) + build_setop_child_paths(root, lrel, lpath_trivial_tlist, lpath_tlist, + NIL, &dLeftGroups); + else + dLeftGroups = lrel->rows; + lpath = lrel->cheapest_total_path; rrel = recurse_set_operations(op->rarg, root, op->colTypes, op->colCollations, false, 1, refnames_tlist, &rpath_tlist, - &dRightGroups); + &rpath_trivial_tlist); + if (rrel->rtekind == RTE_SUBQUERY) + build_setop_child_paths(root, rrel, rpath_trivial_tlist, rpath_tlist, + NIL, &dRightGroups); + else + dRightGroups = rrel->rows; + rpath = rrel->cheapest_total_path; /* Undo effects of forcing tuple_fraction to 0 */ @@ -868,29 +1193,31 @@ generate_nonunion_paths(SetOperationStmt *op, PlannerInfo *root, } /* - * Pull up children of a UNION node that are identically-propertied UNIONs. + * Pull up children of a UNION node that are identically-propertied UNIONs, + * and perform planning of the queries underneath the N-way UNION. + * + * The result is a list of RelOptInfos containing Paths for sub-nodes, with + * one entry for each descendant that is a leaf query or non-identical setop. + * We also return parallel lists of the childrens' targetlists and + * is-trivial-tlist flags. * * NOTE: we can also pull a UNION ALL up into a UNION, since the distinct * output rows will be lost anyway. - * - * NOTE: currently, we ignore collations while determining if a child has - * the same properties. This is semantically sound only so long as all - * collations have the same notion of equality. It is valid from an - * implementation standpoint because we don't care about the ordering of - * a UNION child's result: UNION ALL results are always unordered, and - * generate_union_paths will force a fresh sort if the top level is a UNION. */ static List * plan_union_children(PlannerInfo *root, SetOperationStmt *top_union, List *refnames_tlist, - List **tlist_list) + List **tlist_list, + List **istrivial_tlist) { List *pending_rels = list_make1(top_union); List *result = NIL; List *child_tlist; + bool trivial_tlist; *tlist_list = NIL; + *istrivial_tlist = NIL; while (pending_rels != NIL) { @@ -904,7 +1231,8 @@ plan_union_children(PlannerInfo *root, if (op->op == top_union->op && (op->all == top_union->all || op->all) && - equal(op->colTypes, top_union->colTypes)) + equal(op->colTypes, top_union->colTypes) && + equal(op->colCollations, top_union->colCollations)) { /* Same UNION, so fold children into parent */ pending_rels = lcons(op->rarg, pending_rels); @@ -929,75 +1257,14 @@ plan_union_children(PlannerInfo *root, false, -1, refnames_tlist, &child_tlist, - NULL)); + &trivial_tlist)); *tlist_list = lappend(*tlist_list, child_tlist); + *istrivial_tlist = lappend_int(*istrivial_tlist, trivial_tlist); } return result; } -/* - * Add nodes to the given path tree to unique-ify the result of a UNION. - */ -static Path * -make_union_unique(SetOperationStmt *op, Path *path, List *tlist, - PlannerInfo *root) -{ - RelOptInfo *result_rel = fetch_upper_rel(root, UPPERREL_SETOP, NULL); - List *groupList; - double dNumGroups; - - /* Identify the grouping semantics */ - groupList = generate_setop_grouplist(op, tlist); - - /* - * XXX for the moment, take the number of distinct groups as equal to the - * total input size, ie, the worst case. This is too conservative, but - * it's not clear how to get a decent estimate of the true size. One - * should note as well the propensity of novices to write UNION rather - * than UNION ALL even when they don't expect any duplicates... - */ - dNumGroups = path->rows; - - /* Decide whether to hash or sort */ - if (choose_hashed_setop(root, groupList, path, - dNumGroups, dNumGroups, - "UNION")) - { - /* Hashed aggregate plan --- no sort needed */ - path = (Path *) create_agg_path(root, - result_rel, - path, - create_pathtarget(root, tlist), - AGG_HASHED, - AGGSPLIT_SIMPLE, - groupList, - NIL, - NULL, - dNumGroups); - } - else - { - /* Sort and Unique */ - if (groupList) - path = (Path *) - create_sort_path(root, - result_rel, - path, - make_pathkeys_for_sortclauses(root, - groupList, - tlist), - -1.0); - path = (Path *) create_upper_unique_path(root, - result_rel, - path, - list_length(path->pathkeys), - dNumGroups); - } - - return path; -} - /* * postprocess_setop_rel - perform steps required after adding paths */ diff --git a/src/backend/optimizer/util/appendinfo.c b/src/backend/optimizer/util/appendinfo.c index f456b3b0a4488..6ba4eba224a58 100644 --- a/src/backend/optimizer/util/appendinfo.c +++ b/src/backend/optimizer/util/appendinfo.c @@ -3,7 +3,7 @@ * appendinfo.c * Routines for mapping between append parent(s) and children * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -891,8 +891,7 @@ add_row_identity_columns(PlannerInfo *root, Index rtindex, Assert(commandType == CMD_UPDATE || commandType == CMD_DELETE || commandType == CMD_MERGE); - if (commandType == CMD_MERGE || - relkind == RELKIND_RELATION || + if (relkind == RELKIND_RELATION || relkind == RELKIND_MATVIEW || relkind == RELKIND_PARTITIONED_TABLE) { diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index 7f453b04f8bed..2a599f84086fc 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -3,7 +3,7 @@ * clauses.c * routines to manipulate qualification clauses * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -20,8 +20,6 @@ #include "postgres.h" #include "access/htup_details.h" -#include "catalog/pg_aggregate.h" -#include "catalog/pg_class.h" #include "catalog/pg_language.h" #include "catalog/pg_operator.h" #include "catalog/pg_proc.h" @@ -41,7 +39,6 @@ #include "optimizer/plancat.h" #include "optimizer/planmain.h" #include "parser/analyze.h" -#include "parser/parse_agg.h" #include "parser/parse_coerce.h" #include "parser/parse_func.h" #include "rewrite/rewriteHandler.h" @@ -53,6 +50,7 @@ #include "utils/fmgroids.h" #include "utils/json.h" #include "utils/jsonb.h" +#include "utils/jsonpath.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/syscache.h" @@ -360,6 +358,11 @@ contain_subplans_walker(Node *node, void *context) * mistakenly think that something like "WHERE random() < 0.5" can be treated * as a constant qualification. * + * This will give the right answer only for clauses that have been put + * through expression preprocessing. Callers outside the planner typically + * should use contain_mutable_functions_after_planning() instead, for the + * reasons given there. + * * We will recursively look into Query nodes (i.e., SubLink sub-selects) * but not into SubPlans. See comments for contain_volatile_functions(). */ @@ -412,6 +415,25 @@ contain_mutable_functions_walker(Node *node, void *context) /* Check all subnodes */ } + if (IsA(node, JsonExpr)) + { + JsonExpr *jexpr = castNode(JsonExpr, node); + Const *cnst; + + if (!IsA(jexpr->path_spec, Const)) + return true; + + cnst = castNode(Const, jexpr->path_spec); + + Assert(cnst->consttype == JSONPATHOID); + if (cnst->constisnull) + return false; + + if (jspIsMutable(DatumGetJsonPathP(cnst->constvalue), + jexpr->passing_names, jexpr->passing_values)) + return true; + } + if (IsA(node, SQLValueFunction)) { /* all variants of SQLValueFunction are stable */ @@ -446,6 +468,34 @@ contain_mutable_functions_walker(Node *node, void *context) context); } +/* + * contain_mutable_functions_after_planning + * Test whether given expression contains mutable functions. + * + * This is a wrapper for contain_mutable_functions() that is safe to use from + * outside the planner. The difference is that it first runs the expression + * through expression_planner(). There are two key reasons why we need that: + * + * First, function default arguments will get inserted, which may affect + * volatility (consider "default now()"). + * + * Second, inline-able functions will get inlined, which may allow us to + * conclude that the function is really less volatile than it's marked. + * As an example, polymorphic functions must be marked with the most volatile + * behavior that they have for any input type, but once we inline the + * function we may be able to conclude that it's not so volatile for the + * particular input type we're dealing with. + */ +bool +contain_mutable_functions_after_planning(Expr *expr) +{ + /* We assume here that expression_planner() won't scribble on its input */ + expr = expression_planner(expr); + + /* Now we can search for non-immutable functions */ + return contain_mutable_functions((Node *) expr); +} + /***************************************************************************** * Check clauses for volatile functions @@ -459,6 +509,11 @@ contain_mutable_functions_walker(Node *node, void *context) * volatile function) is found. This test prevents, for example, * invalid conversions of volatile expressions into indexscan quals. * + * This will give the right answer only for clauses that have been put + * through expression preprocessing. Callers outside the planner typically + * should use contain_volatile_functions_after_planning() instead, for the + * reasons given there. + * * We will recursively look into Query nodes (i.e., SubLink sub-selects) * but not into SubPlans. This is a bit odd, but intentional. If we are * looking at a SubLink, we are probably deciding whether a query tree @@ -582,6 +637,34 @@ contain_volatile_functions_walker(Node *node, void *context) context); } +/* + * contain_volatile_functions_after_planning + * Test whether given expression contains volatile functions. + * + * This is a wrapper for contain_volatile_functions() that is safe to use from + * outside the planner. The difference is that it first runs the expression + * through expression_planner(). There are two key reasons why we need that: + * + * First, function default arguments will get inserted, which may affect + * volatility (consider "default random()"). + * + * Second, inline-able functions will get inlined, which may allow us to + * conclude that the function is really less volatile than it's marked. + * As an example, polymorphic functions must be marked with the most volatile + * behavior that they have for any input type, but once we inline the + * function we may be able to conclude that it's not so volatile for the + * particular input type we're dealing with. + */ +bool +contain_volatile_functions_after_planning(Expr *expr) +{ + /* We assume here that expression_planner() won't scribble on its input */ + expr = expression_planner(expr); + + /* Now we can search for volatile functions */ + return contain_volatile_functions((Node *) expr); +} + /* * Special purpose version of contain_volatile_functions() for use in COPY: * ignore nextval(), but treat all other functions normally. @@ -2243,7 +2326,7 @@ convert_saop_to_hashed_saop_walker(Node *node, void *context) /* Looks good. Fill in the hash functions */ saop->hashfuncid = lefthashfunc; } - return true; + return false; } } else /* !saop->useOr */ @@ -2281,7 +2364,7 @@ convert_saop_to_hashed_saop_walker(Node *node, void *context) */ saop->negfuncid = get_opcode(negator); } - return true; + return false; } } } @@ -2357,6 +2440,10 @@ static Node * eval_const_expressions_mutator(Node *node, eval_const_expressions_context *context) { + + /* since this function recurses, it could be driven to stack overflow */ + check_stack_depth(); + if (node == NULL) return NULL; switch (nodeTag(node)) @@ -2479,6 +2566,7 @@ eval_const_expressions_mutator(Node *node, newexpr->inputcollid = expr->inputcollid; newexpr->args = args; newexpr->aggfilter = aggfilter; + newexpr->runCondition = expr->runCondition; newexpr->winref = expr->winref; newexpr->winstar = expr->winstar; newexpr->winagg = expr->winagg; @@ -2827,26 +2915,25 @@ eval_const_expressions_mutator(Node *node, case T_JsonValueExpr: { JsonValueExpr *jve = (JsonValueExpr *) node; - Node *raw; - - raw = eval_const_expressions_mutator((Node *) jve->raw_expr, - context); - if (raw && IsA(raw, Const)) - { - Node *formatted; - Node *save_case_val = context->case_val; - - context->case_val = raw; + Node *raw_expr = (Node *) jve->raw_expr; + Node *formatted_expr = (Node *) jve->formatted_expr; - formatted = eval_const_expressions_mutator((Node *) jve->formatted_expr, - context); + /* + * If we can fold formatted_expr to a constant, we can elide + * the JsonValueExpr altogether. Otherwise we must process + * raw_expr too. But JsonFormat is a flat node and requires + * no simplification, only copying. + */ + formatted_expr = eval_const_expressions_mutator(formatted_expr, + context); + if (formatted_expr && IsA(formatted_expr, Const)) + return formatted_expr; - context->case_val = save_case_val; + raw_expr = eval_const_expressions_mutator(raw_expr, context); - if (formatted && IsA(formatted, Const)) - return formatted; - } - break; + return (Node *) makeJsonValueExpr((Expr *) raw_expr, + (Expr *) formatted_expr, + copyObject(jve->format)); } case T_SubPlan: @@ -3309,12 +3396,19 @@ eval_const_expressions_mutator(Node *node, fselect->resulttype, fselect->resulttypmod, fselect->resultcollid)) - return (Node *) makeVar(((Var *) arg)->varno, - fselect->fieldnum, - fselect->resulttype, - fselect->resulttypmod, - fselect->resultcollid, - ((Var *) arg)->varlevelsup); + { + Var *newvar; + + newvar = makeVar(((Var *) arg)->varno, + fselect->fieldnum, + fselect->resulttype, + fselect->resulttypmod, + fselect->resultcollid, + ((Var *) arg)->varlevelsup); + /* New Var is nullable by same rels as the old one */ + newvar->varnullingrels = ((Var *) arg)->varnullingrels; + return (Node *) newvar; + } } if (arg && IsA(arg, RowExpr)) { @@ -4350,12 +4444,11 @@ evaluate_function(Oid funcid, Oid result_type, int32 result_typmod, * Can't simplify if it returns RECORD. The immediate problem is that it * will be needing an expected tupdesc which we can't supply here. * - * In the case where it has OUT parameters, it could get by without an - * expected tupdesc, but we still have issues: get_expr_result_type() - * doesn't know how to extract type info from a RECORD constant, and in - * the case of a NULL function result there doesn't seem to be any clean - * way to fix that. In view of the likelihood of there being still other - * gotchas, seems best to leave the function call unreduced. + * In the case where it has OUT parameters, we could build an expected + * tupdesc from those, but there may be other gotchas lurking. In + * particular, if the function were to return NULL, we would produce a + * null constant with no remaining indication of which concrete record + * type it is. For now, seems best to leave the function call unreduced. */ if (funcform->prorettype == RECORDOID) return NULL; @@ -4646,6 +4739,7 @@ inline_function(Oid funcid, Oid result_type, Oid result_collid, querytree_list = list_make1(querytree); if (check_sql_fn_retval(list_make1(querytree_list), result_type, rettupdesc, + funcform->prokind, false, NULL)) goto fail; /* reject whole-tuple-result cases */ @@ -5155,16 +5249,20 @@ inline_set_returning_function(PlannerInfo *root, RangeTblEntry *rte) } /* - * Also resolve the actual function result tupdesc, if composite. If the - * function is just declared to return RECORD, dig the info out of the AS - * clause. + * Also resolve the actual function result tupdesc, if composite. If we + * have a coldeflist, believe that; otherwise use get_expr_result_type. + * (This logic should match ExecInitFunctionScan.) */ - functypclass = get_expr_result_type((Node *) fexpr, NULL, &rettupdesc); - if (functypclass == TYPEFUNC_RECORD) + if (rtfunc->funccolnames != NIL) + { + functypclass = TYPEFUNC_RECORD; rettupdesc = BuildDescFromLists(rtfunc->funccolnames, rtfunc->funccoltypes, rtfunc->funccoltypmods, rtfunc->funccolcollations); + } + else + functypclass = get_expr_result_type((Node *) fexpr, NULL, &rettupdesc); /* * The single command must be a plain SELECT. @@ -5188,6 +5286,7 @@ inline_set_returning_function(PlannerInfo *root, RangeTblEntry *rte) */ if (!check_sql_fn_retval(list_make1(querytree_list), fexpr->funcresulttype, rettupdesc, + funcform->prokind, true, NULL) && (functypclass == TYPEFUNC_COMPOSITE || functypclass == TYPEFUNC_COMPOSITE_DOMAIN || diff --git a/src/backend/optimizer/util/inherit.c b/src/backend/optimizer/util/inherit.c index 94de855a22787..c5b906a9d4368 100644 --- a/src/backend/optimizer/util/inherit.c +++ b/src/backend/optimizer/util/inherit.c @@ -3,7 +3,7 @@ * inherit.c * Routines to process child relations in inheritance trees * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -386,8 +386,17 @@ expand_partitioned_rtentry(PlannerInfo *root, RelOptInfo *relinfo, Index childRTindex; RelOptInfo *childrelinfo; - /* Open rel, acquiring required locks */ - childrel = table_open(childOID, lockmode); + /* + * Open rel, acquiring required locks. If a partition was recently + * detached and subsequently dropped, then opening it will fail. In + * this case, behave as though the partition had been pruned. + */ + childrel = try_table_open(childOID, lockmode); + if (childrel == NULL) + { + relinfo->live_parts = bms_del_member(relinfo->live_parts, i); + continue; + } /* * Temporary partitions belonging to other sessions should have been @@ -457,7 +466,8 @@ expand_single_inheritance_child(PlannerInfo *root, RangeTblEntry *parentrte, Index *childRTindex_p) { Query *parse = root->parse; - Oid parentOID = RelationGetRelid(parentrel); + Oid parentOID PG_USED_FOR_ASSERTS_ONLY = + RelationGetRelid(parentrel); Oid childOID = RelationGetRelid(childrel); RangeTblEntry *childrte; Index childRTindex; @@ -494,13 +504,8 @@ expand_single_inheritance_child(PlannerInfo *root, RangeTblEntry *parentrte, childrte->inh = false; childrte->securityQuals = NIL; - /* - * No permission checking for the child RTE unless it's the parent - * relation in its child role, which only applies to traditional - * inheritance. - */ - if (childOID != parentOID) - childrte->perminfoindex = 0; + /* No permission checking for child RTEs. */ + childrte->perminfoindex = 0; /* Link not-yet-fully-filled child RTE into data structures */ parse->rtable = lappend(parse->rtable, childrte); @@ -826,11 +831,13 @@ expand_appendrel_subquery(PlannerInfo *root, RelOptInfo *rel, /* * apply_child_basequals * Populate childrel's base restriction quals from parent rel's quals, - * translating them using appinfo. + * translating Vars using appinfo and re-checking for quals which are + * constant-TRUE or constant-FALSE when applied to this child relation. * * If any of the resulting clauses evaluate to constant false or NULL, we * return false and don't apply any quals. Caller should mark the relation as - * a dummy rel in this case, since it doesn't need to be scanned. + * a dummy rel in this case, since it doesn't need to be scanned. Constant + * true quals are ignored. */ bool apply_child_basequals(PlannerInfo *root, RelOptInfo *parentrel, @@ -879,6 +886,7 @@ apply_child_basequals(PlannerInfo *root, RelOptInfo *parentrel, { Node *onecq = (Node *) lfirst(lc2); bool pseudoconstant; + RestrictInfo *childrinfo; /* check for pseudoconstant (no Vars or volatile functions) */ pseudoconstant = @@ -890,15 +898,23 @@ apply_child_basequals(PlannerInfo *root, RelOptInfo *parentrel, root->hasPseudoConstantQuals = true; } /* reconstitute RestrictInfo with appropriate properties */ - childquals = lappend(childquals, - make_restrictinfo(root, - (Expr *) onecq, - rinfo->is_pushed_down, - rinfo->has_clone, - rinfo->is_clone, - pseudoconstant, - rinfo->security_level, - NULL, NULL, NULL)); + childrinfo = make_restrictinfo(root, + (Expr *) onecq, + rinfo->is_pushed_down, + rinfo->has_clone, + rinfo->is_clone, + pseudoconstant, + rinfo->security_level, + NULL, NULL, NULL); + + /* Restriction is proven always false */ + if (restriction_is_always_false(root, childrinfo)) + return false; + /* Restriction is proven always true, so drop it */ + if (restriction_is_always_true(root, childrinfo)) + continue; + + childquals = lappend(childquals, childrinfo); /* track minimum security level among child quals */ cq_min_security = Min(cq_min_security, rinfo->security_level); } diff --git a/src/backend/optimizer/util/joininfo.c b/src/backend/optimizer/util/joininfo.c index 968a5a488effa..65993bd6599d3 100644 --- a/src/backend/optimizer/util/joininfo.c +++ b/src/backend/optimizer/util/joininfo.c @@ -3,7 +3,7 @@ * joininfo.c * joininfo list manipulation routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -14,9 +14,12 @@ */ #include "postgres.h" +#include "nodes/makefuncs.h" #include "optimizer/joininfo.h" #include "optimizer/pathnode.h" #include "optimizer/paths.h" +#include "optimizer/planmain.h" +#include "optimizer/restrictinfo.h" /* @@ -98,6 +101,39 @@ add_join_clause_to_rels(PlannerInfo *root, { int cur_relid; + /* Don't add the clause if it is always true */ + if (restriction_is_always_true(root, restrictinfo)) + return; + + /* + * Substitute the origin qual with constant-FALSE if it is provably always + * false. + * + * Note that we need to keep the same rinfo_serial, since it is in + * practice the same condition. We also need to reset the + * last_rinfo_serial counter, which is essential to ensure that the + * RestrictInfos for the "same" qual condition get identical serial + * numbers (see deconstruct_distribute_oj_quals). + */ + if (restriction_is_always_false(root, restrictinfo)) + { + int save_rinfo_serial = restrictinfo->rinfo_serial; + int save_last_rinfo_serial = root->last_rinfo_serial; + + restrictinfo = make_restrictinfo(root, + (Expr *) makeBoolConst(false, false), + restrictinfo->is_pushed_down, + restrictinfo->has_clone, + restrictinfo->is_clone, + restrictinfo->pseudoconstant, + 0, /* security_level */ + restrictinfo->required_relids, + restrictinfo->incompatible_relids, + restrictinfo->outer_relids); + restrictinfo->rinfo_serial = save_rinfo_serial; + root->last_rinfo_serial = save_last_rinfo_serial; + } + cur_relid = -1; while ((cur_relid = bms_next_member(join_relids, cur_relid)) >= 0) { diff --git a/src/backend/optimizer/util/meson.build b/src/backend/optimizer/util/meson.build index cc776e1090c75..75312c4a3a94a 100644 --- a/src/backend/optimizer/util/meson.build +++ b/src/backend/optimizer/util/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'appendinfo.c', diff --git a/src/backend/optimizer/util/orclauses.c b/src/backend/optimizer/util/orclauses.c index 6ef9d14b902a3..5e2bf26ec43dc 100644 --- a/src/backend/optimizer/util/orclauses.c +++ b/src/backend/optimizer/util/orclauses.c @@ -3,7 +3,7 @@ * orclauses.c * Routines to extract restriction OR clauses from join OR clauses * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -17,10 +17,9 @@ #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" -#include "optimizer/clauses.h" -#include "optimizer/cost.h" #include "optimizer/optimizer.h" #include "optimizer/orclauses.h" +#include "optimizer/paths.h" #include "optimizer/restrictinfo.h" @@ -327,24 +326,10 @@ consider_new_or_clause(PlannerInfo *root, RelOptInfo *rel, * Make up a SpecialJoinInfo for JOIN_INNER semantics. (Compare * approx_tuple_count() in costsize.c.) */ - sjinfo.type = T_SpecialJoinInfo; - sjinfo.min_lefthand = bms_difference(join_or_rinfo->clause_relids, - rel->relids); - sjinfo.min_righthand = rel->relids; - sjinfo.syn_lefthand = sjinfo.min_lefthand; - sjinfo.syn_righthand = sjinfo.min_righthand; - sjinfo.jointype = JOIN_INNER; - sjinfo.ojrelid = 0; - sjinfo.commute_above_l = NULL; - sjinfo.commute_above_r = NULL; - sjinfo.commute_below_l = NULL; - sjinfo.commute_below_r = NULL; - /* we don't bother trying to make the remaining fields valid */ - sjinfo.lhs_strict = false; - sjinfo.semi_can_btree = false; - sjinfo.semi_can_hash = false; - sjinfo.semi_operators = NIL; - sjinfo.semi_rhs_exprs = NIL; + init_dummy_sjinfo(&sjinfo, + bms_difference(join_or_rinfo->clause_relids, + rel->relids), + rel->relids); /* Compute inner-join size */ orig_selec = clause_selectivity(root, (Node *) join_or_rinfo, diff --git a/src/backend/optimizer/util/paramassign.c b/src/backend/optimizer/util/paramassign.c index d6a923b0b68d6..f461fedf194e3 100644 --- a/src/backend/optimizer/util/paramassign.c +++ b/src/backend/optimizer/util/paramassign.c @@ -40,7 +40,7 @@ * doesn't really save much executor work anyway. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -90,7 +90,8 @@ assign_param_for_var(PlannerInfo *root, Var *var) pvar->varattno == var->varattno && pvar->vartype == var->vartype && pvar->vartypmod == var->vartypmod && - pvar->varcollid == var->varcollid) + pvar->varcollid == var->varcollid && + bms_equal(pvar->varnullingrels, var->varnullingrels)) return pitem->paramId; } } @@ -306,6 +307,57 @@ replace_outer_grouping(PlannerInfo *root, GroupingFunc *grp) return retval; } +/* + * Generate a Param node to replace the given MergeSupportFunc expression + * which is expected to be in the RETURNING list of an upper-level MERGE + * query. Record the need for the MergeSupportFunc in the proper upper-level + * root->plan_params. + */ +Param * +replace_outer_merge_support(PlannerInfo *root, MergeSupportFunc *msf) +{ + Param *retval; + PlannerParamItem *pitem; + Oid ptype = exprType((Node *) msf); + + Assert(root->parse->commandType != CMD_MERGE); + + /* + * The parser should have ensured that the MergeSupportFunc is in the + * RETURNING list of an upper-level MERGE query, so find that query. + */ + do + { + root = root->parent_root; + if (root == NULL) + elog(ERROR, "MergeSupportFunc found outside MERGE"); + } while (root->parse->commandType != CMD_MERGE); + + /* + * It does not seem worthwhile to try to de-duplicate references to outer + * MergeSupportFunc expressions. Just make a new slot every time. + */ + msf = copyObject(msf); + + pitem = makeNode(PlannerParamItem); + pitem->item = (Node *) msf; + pitem->paramId = list_length(root->glob->paramExecTypes); + root->glob->paramExecTypes = lappend_oid(root->glob->paramExecTypes, + ptype); + + root->plan_params = lappend(root->plan_params, pitem); + + retval = makeNode(Param); + retval->paramkind = PARAM_EXEC; + retval->paramid = pitem->paramId; + retval->paramtype = ptype; + retval->paramtypmod = -1; + retval->paramcollid = InvalidOid; + retval->location = msf->location; + + return retval; +} + /* * Generate a Param node to replace the given Var, * which is expected to come from some upper NestLoop plan node. diff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.c index 5f5596841c86a..c42742d2c7bfc 100644 --- a/src/backend/optimizer/util/pathnode.c +++ b/src/backend/optimizer/util/pathnode.c @@ -3,7 +3,7 @@ * pathnode.c * Routines to manipulate pathlists and create path nodes * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,7 +19,6 @@ #include "foreign/fdwapi.h" #include "miscadmin.h" #include "nodes/extensible.h" -#include "nodes/nodeFuncs.h" #include "optimizer/appendinfo.h" #include "optimizer/clauses.h" #include "optimizer/cost.h" @@ -27,11 +26,8 @@ #include "optimizer/pathnode.h" #include "optimizer/paths.h" #include "optimizer/planmain.h" -#include "optimizer/prep.h" -#include "optimizer/restrictinfo.h" #include "optimizer/tlist.h" #include "parser/parsetree.h" -#include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/selfuncs.h" @@ -40,7 +36,7 @@ typedef enum COSTS_EQUAL, /* path costs are fuzzily equal */ COSTS_BETTER1, /* first path is cheaper than second */ COSTS_BETTER2, /* second path is cheaper than first */ - COSTS_DIFFERENT /* neither path dominates the other on cost */ + COSTS_DIFFERENT, /* neither path dominates the other on cost */ } PathCostComparison; /* @@ -56,6 +52,8 @@ static int append_startup_cost_compare(const ListCell *a, const ListCell *b); static List *reparameterize_pathlist_by_child(PlannerInfo *root, List *pathlist, RelOptInfo *child_rel); +static bool pathlist_is_reparameterizable_by_child(List *pathlist, + RelOptInfo *child_rel); /***************************************************************************** @@ -1237,6 +1235,10 @@ create_tidrangescan_path(PlannerInfo *root, RelOptInfo *rel, * * Note that we must handle subpaths = NIL, representing a dummy access path. * Also, there are callers that pass root = NULL. + * + * 'rows', when passed as a non-negative number, will be used to overwrite the + * returned path's row estimate. Otherwise, the row estimate is calculated + * by totalling the row estimates from the 'subpaths' list. */ AppendPath * create_append_path(PlannerInfo *root, @@ -1470,7 +1472,7 @@ create_merge_append_path(PlannerInfo *root, root, pathkeys, subpath->total_cost, - subpath->parent->tuples, + subpath->rows, subpath->pathtarget->width, 0.0, work_mem, @@ -1616,7 +1618,7 @@ create_memoize_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, pathnode->param_exprs = param_exprs; pathnode->singlerow = singlerow; pathnode->binary_mode = binary_mode; - pathnode->calls = calls; + pathnode->calls = clamp_row_est(calls); /* * For now we set est_entries to 0. cost_memoize_rescan() does all the @@ -1703,8 +1705,14 @@ create_unique_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, pathnode->path.pathkeys = NIL; pathnode->subpath = subpath; - pathnode->in_operators = sjinfo->semi_operators; - pathnode->uniq_exprs = sjinfo->semi_rhs_exprs; + + /* + * Under GEQO and when planning child joins, the sjinfo might be + * short-lived, so we'd better make copies of data structures we extract + * from it. + */ + pathnode->in_operators = copyObject(sjinfo->semi_operators); + pathnode->uniq_exprs = copyObject(sjinfo->semi_rhs_exprs); /* * If the input is a relation and it has a unique index that proves the @@ -2113,7 +2121,8 @@ create_valuesscan_path(PlannerInfo *root, RelOptInfo *rel, * returning the pathnode. */ Path * -create_ctescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer) +create_ctescan_path(PlannerInfo *root, RelOptInfo *rel, + List *pathkeys, Relids required_outer) { Path *pathnode = makeNode(Path); @@ -2125,7 +2134,7 @@ create_ctescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer) pathnode->parallel_aware = false; pathnode->parallel_safe = rel->consider_parallel; pathnode->parallel_workers = 0; - pathnode->pathkeys = NIL; /* XXX for now, result is always unordered */ + pathnode->pathkeys = pathkeys; cost_ctescan(pathnode, root, rel, pathnode->param_info); @@ -2229,6 +2238,7 @@ create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel, List *pathkeys, Relids required_outer, Path *fdw_outerpath, + List *fdw_restrictinfo, List *fdw_private) { ForeignPath *pathnode = makeNode(ForeignPath); @@ -2250,6 +2260,7 @@ create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel, pathnode->path.pathkeys = pathkeys; pathnode->fdw_outerpath = fdw_outerpath; + pathnode->fdw_restrictinfo = fdw_restrictinfo; pathnode->fdw_private = fdw_private; return pathnode; @@ -2273,6 +2284,7 @@ create_foreign_join_path(PlannerInfo *root, RelOptInfo *rel, List *pathkeys, Relids required_outer, Path *fdw_outerpath, + List *fdw_restrictinfo, List *fdw_private) { ForeignPath *pathnode = makeNode(ForeignPath); @@ -2300,6 +2312,7 @@ create_foreign_join_path(PlannerInfo *root, RelOptInfo *rel, pathnode->path.pathkeys = pathkeys; pathnode->fdw_outerpath = fdw_outerpath; + pathnode->fdw_restrictinfo = fdw_restrictinfo; pathnode->fdw_private = fdw_private; return pathnode; @@ -2322,6 +2335,7 @@ create_foreign_upper_path(PlannerInfo *root, RelOptInfo *rel, double rows, Cost startup_cost, Cost total_cost, List *pathkeys, Path *fdw_outerpath, + List *fdw_restrictinfo, List *fdw_private) { ForeignPath *pathnode = makeNode(ForeignPath); @@ -2345,6 +2359,7 @@ create_foreign_upper_path(PlannerInfo *root, RelOptInfo *rel, pathnode->path.pathkeys = pathkeys; pathnode->fdw_outerpath = fdw_outerpath; + pathnode->fdw_restrictinfo = fdw_restrictinfo; pathnode->fdw_private = fdw_private; return pathnode; @@ -2354,6 +2369,9 @@ create_foreign_upper_path(PlannerInfo *root, RelOptInfo *rel, * calc_nestloop_required_outer * Compute the required_outer set for a nestloop join path * + * Note: when considering a child join, the inputs nonetheless use top-level + * parent relids + * * Note: result must not share storage with either input */ Relids @@ -2388,11 +2406,30 @@ calc_non_nestloop_required_outer(Path *outer_path, Path *inner_path) { Relids outer_paramrels = PATH_REQ_OUTER(outer_path); Relids inner_paramrels = PATH_REQ_OUTER(inner_path); + Relids innerrelids PG_USED_FOR_ASSERTS_ONLY; + Relids outerrelids PG_USED_FOR_ASSERTS_ONLY; Relids required_outer; + /* + * Any parameterization of the input paths refers to topmost parents of + * the relevant relations, because reparameterize_path_by_child() hasn't + * been called yet. So we must consider topmost parents of the relations + * being joined, too, while checking for disallowed parameterization + * cases. + */ + if (inner_path->parent->top_parent_relids) + innerrelids = inner_path->parent->top_parent_relids; + else + innerrelids = inner_path->parent->relids; + + if (outer_path->parent->top_parent_relids) + outerrelids = outer_path->parent->top_parent_relids; + else + outerrelids = outer_path->parent->relids; + /* neither path can require rels from the other */ - Assert(!bms_overlap(outer_paramrels, inner_path->parent->relids)); - Assert(!bms_overlap(inner_paramrels, outer_path->parent->relids)); + Assert(!bms_overlap(outer_paramrels, innerrelids)); + Assert(!bms_overlap(inner_paramrels, outerrelids)); /* form the union ... */ required_outer = bms_union(outer_paramrels, inner_paramrels); /* we do not need an explicit test for empty; bms_union gets it right */ @@ -2430,6 +2467,16 @@ create_nestloop_path(PlannerInfo *root, { NestPath *pathnode = makeNode(NestPath); Relids inner_req_outer = PATH_REQ_OUTER(inner_path); + Relids outerrelids; + + /* + * Paths are parameterized by top-level parents, so run parameterization + * tests on the parent relids. + */ + if (outer_path->parent->top_parent_relids) + outerrelids = outer_path->parent->top_parent_relids; + else + outerrelids = outer_path->parent->relids; /* * If the inner path is parameterized by the outer, we must drop any @@ -2439,7 +2486,7 @@ create_nestloop_path(PlannerInfo *root, * estimates for this path. We detect such clauses by checking for serial * number match to clauses already enforced in the inner path. */ - if (bms_overlap(inner_req_outer, outer_path->parent->relids)) + if (bms_overlap(inner_req_outer, outerrelids)) { Bitmapset *enforced_serials = get_param_path_clause_serials(inner_path); List *jclauses = NIL; @@ -3127,10 +3174,26 @@ create_agg_path(PlannerInfo *root, pathnode->path.parallel_safe = rel->consider_parallel && subpath->parallel_safe; pathnode->path.parallel_workers = subpath->parallel_workers; + if (aggstrategy == AGG_SORTED) - pathnode->path.pathkeys = subpath->pathkeys; /* preserves order */ + { + /* + * Attempt to preserve the order of the subpath. Additional pathkeys + * may have been added in adjust_group_pathkeys_for_groupagg() to + * support ORDER BY / DISTINCT aggregates. Pathkeys added there + * belong to columns within the aggregate function, so we must strip + * these additional pathkeys off as those columns are unavailable + * above the aggregate node. + */ + if (list_length(subpath->pathkeys) > root->num_groupby_pathkeys) + pathnode->path.pathkeys = list_copy_head(subpath->pathkeys, + root->num_groupby_pathkeys); + else + pathnode->path.pathkeys = subpath->pathkeys; /* preserves order */ + } else pathnode->path.pathkeys = NIL; /* output is unordered */ + pathnode->subpath = subpath; pathnode->aggstrategy = aggstrategy; @@ -3348,8 +3411,7 @@ create_minmaxagg_path(PlannerInfo *root, /* For now, assume we are above any joins, so no parameterization */ pathnode->path.param_info = NULL; pathnode->path.parallel_aware = false; - /* A MinMaxAggPath implies use of initplans, so cannot be parallel-safe */ - pathnode->path.parallel_safe = false; + pathnode->path.parallel_safe = true; /* might change below */ pathnode->path.parallel_workers = 0; /* Result is one unordered row */ pathnode->path.rows = 1; @@ -3358,13 +3420,15 @@ create_minmaxagg_path(PlannerInfo *root, pathnode->mmaggregates = mmaggregates; pathnode->quals = quals; - /* Calculate cost of all the initplans ... */ + /* Calculate cost of all the initplans, and check parallel safety */ initplan_cost = 0; foreach(lc, mmaggregates) { MinMaxAggInfo *mminfo = (MinMaxAggInfo *) lfirst(lc); initplan_cost += mminfo->pathcost; + if (!mminfo->path->parallel_safe) + pathnode->path.parallel_safe = false; } /* add tlist eval cost for each output row, plus cpu_tuple_cost */ @@ -3385,6 +3449,17 @@ create_minmaxagg_path(PlannerInfo *root, pathnode->path.total_cost += qual_cost.startup + qual_cost.per_tuple; } + /* + * If the initplans were all parallel-safe, also check safety of the + * target and quals. (The Result node itself isn't parallelizable, but if + * we are in a subquery then it can be useful for the outer query to know + * that this one is parallel-safe.) + */ + if (pathnode->path.parallel_safe) + pathnode->path.parallel_safe = + is_parallel_safe(root, (Node *) target->exprs) && + is_parallel_safe(root, (Node *) quals); + return pathnode; } @@ -3396,6 +3471,7 @@ create_minmaxagg_path(PlannerInfo *root, * 'subpath' is the path representing the source of data * 'target' is the PathTarget to be computed * 'windowFuncs' is a list of WindowFunc structs + * 'runCondition' is a list of OpExprs to short-circuit WindowAgg execution * 'winclause' is a WindowClause that is common to all the WindowFuncs * 'qual' WindowClause.runconditions from lower-level WindowAggPaths. * Must always be NIL when topwindow == false @@ -3411,6 +3487,7 @@ create_windowagg_path(PlannerInfo *root, Path *subpath, PathTarget *target, List *windowFuncs, + List *runCondition, WindowClause *winclause, List *qual, bool topwindow) @@ -3435,6 +3512,7 @@ create_windowagg_path(PlannerInfo *root, pathnode->subpath = subpath; pathnode->winclause = winclause; pathnode->qual = qual; + pathnode->runCondition = runCondition; pathnode->topwindow = topwindow; /* @@ -3445,8 +3523,7 @@ create_windowagg_path(PlannerInfo *root, */ cost_windowagg(&pathnode->path, root, windowFuncs, - list_length(winclause->partitionClause), - list_length(winclause->orderClause), + winclause, subpath->startup_cost, subpath->total_cost, subpath->rows); @@ -3630,7 +3707,7 @@ create_lockrows_path(PlannerInfo *root, RelOptInfo *rel, * 'operation' is the operation type * 'canSetTag' is true if we set the command tag/es_processed * 'nominalRelation' is the parent RT index for use of EXPLAIN - * 'rootRelation' is the partitioned table root RT index, or 0 if none + * 'rootRelation' is the partitioned/inherited table root RTI, or 0 if none * 'partColsUpdated' is true if any partitioning columns are being updated, * either from the target relation or a descendent partitioned table. * 'resultRelations' is an integer list of actual RT indexes of target rel(s) @@ -3642,6 +3719,7 @@ create_lockrows_path(PlannerInfo *root, RelOptInfo *rel, * 'onconflict' is the ON CONFLICT clause, or NULL * 'epqParam' is the ID of Param for EvalPlanQual re-eval * 'mergeActionLists' is a list of lists of MERGE actions (one per rel) + * 'mergeJoinConditions' is a list of join conditions for MERGE (one per rel) */ ModifyTablePath * create_modifytable_path(PlannerInfo *root, RelOptInfo *rel, @@ -3653,7 +3731,8 @@ create_modifytable_path(PlannerInfo *root, RelOptInfo *rel, List *updateColnosLists, List *withCheckOptionLists, List *returningLists, List *rowMarks, OnConflictExpr *onconflict, - List *mergeActionLists, int epqParam) + List *mergeActionLists, List *mergeJoinConditions, + int epqParam) { ModifyTablePath *pathnode = makeNode(ModifyTablePath); @@ -3721,6 +3800,7 @@ create_modifytable_path(PlannerInfo *root, RelOptInfo *rel, pathnode->onconflict = onconflict; pathnode->epqParam = epqParam; pathnode->mergeActionLists = mergeActionLists; + pathnode->mergeJoinConditions = mergeJoinConditions; return pathnode; } @@ -4012,34 +4092,39 @@ reparameterize_path(PlannerInfo *root, Path *path, * Given a path parameterized by the parent of the given child relation, * translate the path to be parameterized by the given child relation. * - * The function creates a new path of the same type as the given path, but - * parameterized by the given child relation. Most fields from the original - * path can simply be flat-copied, but any expressions must be adjusted to - * refer to the correct varnos, and any paths must be recursively - * reparameterized. Other fields that refer to specific relids also need - * adjustment. + * Most fields in the path are not changed, but any expressions must be + * adjusted to refer to the correct varnos, and any subpaths must be + * recursively reparameterized. Other fields that refer to specific relids + * also need adjustment. * * The cost, number of rows, width and parallel path properties depend upon - * path->parent, which does not change during the translation. Hence those - * members are copied as they are. + * path->parent, which does not change during the translation. So we need + * not change those. * * Currently, only a few path types are supported here, though more could be * added at need. We return NULL if we can't reparameterize the given path. + * + * Note that this function can change referenced RangeTblEntries, RelOptInfos + * and IndexOptInfos as well as the Path structures. Therefore, it's only safe + * to call during create_plan(), when we have made a final choice of which Path + * to use for each RangeTblEntry/RelOptInfo/IndexOptInfo. + * + * Keep this code in sync with path_is_reparameterizable_by_child()! */ Path * reparameterize_path_by_child(PlannerInfo *root, Path *path, RelOptInfo *child_rel) { - -#define FLAT_COPY_PATH(newnode, node, nodetype) \ - ( (newnode) = makeNode(nodetype), \ - memcpy((newnode), (node), sizeof(nodetype)) ) + Path *new_path; + ParamPathInfo *new_ppi; + ParamPathInfo *old_ppi; + Relids required_outer; #define ADJUST_CHILD_ATTRS(node) \ - ((node) = \ - (List *) adjust_appendrel_attrs_multilevel(root, (Node *) (node), \ - child_rel, \ - child_rel->top_parent)) + ((node) = (void *) adjust_appendrel_attrs_multilevel(root, \ + (Node *) (node), \ + child_rel, \ + child_rel->top_parent)) #define REPARAMETERIZE_CHILD_PATH(path) \ do { \ @@ -4059,21 +4144,16 @@ do { \ } \ } while(0) - Path *new_path; - ParamPathInfo *new_ppi; - ParamPathInfo *old_ppi; - Relids required_outer; - /* - * If the path is not parameterized by parent of the given relation, it - * doesn't need reparameterization. + * If the path is not parameterized by the parent of the given relation, + * it doesn't need reparameterization. */ if (!path->param_info || !bms_overlap(PATH_REQ_OUTER(path), child_rel->top_parent_relids)) return path; /* - * If possible, reparameterize the given path, making a copy. + * If possible, reparameterize the given path. * * This function is currently only applied to the inner side of a nestloop * join that is being partitioned by the partitionwise-join code. Hence, @@ -4087,14 +4167,28 @@ do { \ switch (nodeTag(path)) { case T_Path: - FLAT_COPY_PATH(new_path, path, Path); + new_path = path; + ADJUST_CHILD_ATTRS(new_path->parent->baserestrictinfo); + if (path->pathtype == T_SampleScan) + { + Index scan_relid = path->parent->relid; + RangeTblEntry *rte; + + /* it should be a base rel with a tablesample clause... */ + Assert(scan_relid > 0); + rte = planner_rt_fetch(scan_relid, root); + Assert(rte->rtekind == RTE_RELATION); + Assert(rte->tablesample != NULL); + + ADJUST_CHILD_ATTRS(rte->tablesample); + } break; case T_IndexPath: { - IndexPath *ipath; + IndexPath *ipath = (IndexPath *) path; - FLAT_COPY_PATH(ipath, path, IndexPath); + ADJUST_CHILD_ATTRS(ipath->indexinfo->indrestrictinfo); ADJUST_CHILD_ATTRS(ipath->indexclauses); new_path = (Path *) ipath; } @@ -4102,9 +4196,9 @@ do { \ case T_BitmapHeapPath: { - BitmapHeapPath *bhpath; + BitmapHeapPath *bhpath = (BitmapHeapPath *) path; - FLAT_COPY_PATH(bhpath, path, BitmapHeapPath); + ADJUST_CHILD_ATTRS(bhpath->path.parent->baserestrictinfo); REPARAMETERIZE_CHILD_PATH(bhpath->bitmapqual); new_path = (Path *) bhpath; } @@ -4112,9 +4206,8 @@ do { \ case T_BitmapAndPath: { - BitmapAndPath *bapath; + BitmapAndPath *bapath = (BitmapAndPath *) path; - FLAT_COPY_PATH(bapath, path, BitmapAndPath); REPARAMETERIZE_CHILD_PATH_LIST(bapath->bitmapquals); new_path = (Path *) bapath; } @@ -4122,9 +4215,8 @@ do { \ case T_BitmapOrPath: { - BitmapOrPath *bopath; + BitmapOrPath *bopath = (BitmapOrPath *) path; - FLAT_COPY_PATH(bopath, path, BitmapOrPath); REPARAMETERIZE_CHILD_PATH_LIST(bopath->bitmapquals); new_path = (Path *) bopath; } @@ -4132,12 +4224,14 @@ do { \ case T_ForeignPath: { - ForeignPath *fpath; + ForeignPath *fpath = (ForeignPath *) path; ReparameterizeForeignPathByChild_function rfpc_func; - FLAT_COPY_PATH(fpath, path, ForeignPath); + ADJUST_CHILD_ATTRS(fpath->path.parent->baserestrictinfo); if (fpath->fdw_outerpath) REPARAMETERIZE_CHILD_PATH(fpath->fdw_outerpath); + if (fpath->fdw_restrictinfo) + ADJUST_CHILD_ATTRS(fpath->fdw_restrictinfo); /* Hand over to FDW if needed. */ rfpc_func = @@ -4151,10 +4245,12 @@ do { \ case T_CustomPath: { - CustomPath *cpath; + CustomPath *cpath = (CustomPath *) path; - FLAT_COPY_PATH(cpath, path, CustomPath); + ADJUST_CHILD_ATTRS(cpath->path.parent->baserestrictinfo); REPARAMETERIZE_CHILD_PATH_LIST(cpath->custom_paths); + if (cpath->custom_restrictinfo) + ADJUST_CHILD_ATTRS(cpath->custom_restrictinfo); if (cpath->methods && cpath->methods->ReparameterizeCustomPathByChild) cpath->custom_private = @@ -4167,12 +4263,9 @@ do { \ case T_NestPath: { - JoinPath *jpath; - NestPath *npath; - - FLAT_COPY_PATH(npath, path, NestPath); + NestPath *npath = (NestPath *) path; + JoinPath *jpath = (JoinPath *) npath; - jpath = (JoinPath *) npath; REPARAMETERIZE_CHILD_PATH(jpath->outerjoinpath); REPARAMETERIZE_CHILD_PATH(jpath->innerjoinpath); ADJUST_CHILD_ATTRS(jpath->joinrestrictinfo); @@ -4182,12 +4275,9 @@ do { \ case T_MergePath: { - JoinPath *jpath; - MergePath *mpath; - - FLAT_COPY_PATH(mpath, path, MergePath); + MergePath *mpath = (MergePath *) path; + JoinPath *jpath = (JoinPath *) mpath; - jpath = (JoinPath *) mpath; REPARAMETERIZE_CHILD_PATH(jpath->outerjoinpath); REPARAMETERIZE_CHILD_PATH(jpath->innerjoinpath); ADJUST_CHILD_ATTRS(jpath->joinrestrictinfo); @@ -4198,12 +4288,9 @@ do { \ case T_HashPath: { - JoinPath *jpath; - HashPath *hpath; + HashPath *hpath = (HashPath *) path; + JoinPath *jpath = (JoinPath *) hpath; - FLAT_COPY_PATH(hpath, path, HashPath); - - jpath = (JoinPath *) hpath; REPARAMETERIZE_CHILD_PATH(jpath->outerjoinpath); REPARAMETERIZE_CHILD_PATH(jpath->innerjoinpath); ADJUST_CHILD_ATTRS(jpath->joinrestrictinfo); @@ -4214,9 +4301,8 @@ do { \ case T_AppendPath: { - AppendPath *apath; + AppendPath *apath = (AppendPath *) path; - FLAT_COPY_PATH(apath, path, AppendPath); REPARAMETERIZE_CHILD_PATH_LIST(apath->subpaths); new_path = (Path *) apath; } @@ -4224,9 +4310,8 @@ do { \ case T_MaterialPath: { - MaterialPath *mpath; + MaterialPath *mpath = (MaterialPath *) path; - FLAT_COPY_PATH(mpath, path, MaterialPath); REPARAMETERIZE_CHILD_PATH(mpath->subpath); new_path = (Path *) mpath; } @@ -4234,9 +4319,8 @@ do { \ case T_MemoizePath: { - MemoizePath *mpath; + MemoizePath *mpath = (MemoizePath *) path; - FLAT_COPY_PATH(mpath, path, MemoizePath); REPARAMETERIZE_CHILD_PATH(mpath->subpath); ADJUST_CHILD_ATTRS(mpath->param_exprs); new_path = (Path *) mpath; @@ -4245,16 +4329,14 @@ do { \ case T_GatherPath: { - GatherPath *gpath; + GatherPath *gpath = (GatherPath *) path; - FLAT_COPY_PATH(gpath, path, GatherPath); REPARAMETERIZE_CHILD_PATH(gpath->subpath); new_path = (Path *) gpath; } break; default: - /* We don't know how to reparameterize this path. */ return NULL; } @@ -4314,9 +4396,147 @@ do { \ return new_path; } +/* + * path_is_reparameterizable_by_child + * Given a path parameterized by the parent of the given child relation, + * see if it can be translated to be parameterized by the child relation. + * + * This must return true if and only if reparameterize_path_by_child() + * would succeed on this path. Currently it's sufficient to verify that + * the path and all of its subpaths (if any) are of the types handled by + * that function. However, subpaths that are not parameterized can be + * disregarded since they won't require translation. + */ +bool +path_is_reparameterizable_by_child(Path *path, RelOptInfo *child_rel) +{ +#define REJECT_IF_PATH_NOT_REPARAMETERIZABLE(path) \ +do { \ + if (!path_is_reparameterizable_by_child(path, child_rel)) \ + return false; \ +} while(0) + +#define REJECT_IF_PATH_LIST_NOT_REPARAMETERIZABLE(pathlist) \ +do { \ + if (!pathlist_is_reparameterizable_by_child(pathlist, child_rel)) \ + return false; \ +} while(0) + + /* + * If the path is not parameterized by the parent of the given relation, + * it doesn't need reparameterization. + */ + if (!path->param_info || + !bms_overlap(PATH_REQ_OUTER(path), child_rel->top_parent_relids)) + return true; + + /* + * Check that the path type is one that reparameterize_path_by_child() can + * handle, and recursively check subpaths. + */ + switch (nodeTag(path)) + { + case T_Path: + case T_IndexPath: + break; + + case T_BitmapHeapPath: + { + BitmapHeapPath *bhpath = (BitmapHeapPath *) path; + + REJECT_IF_PATH_NOT_REPARAMETERIZABLE(bhpath->bitmapqual); + } + break; + + case T_BitmapAndPath: + { + BitmapAndPath *bapath = (BitmapAndPath *) path; + + REJECT_IF_PATH_LIST_NOT_REPARAMETERIZABLE(bapath->bitmapquals); + } + break; + + case T_BitmapOrPath: + { + BitmapOrPath *bopath = (BitmapOrPath *) path; + + REJECT_IF_PATH_LIST_NOT_REPARAMETERIZABLE(bopath->bitmapquals); + } + break; + + case T_ForeignPath: + { + ForeignPath *fpath = (ForeignPath *) path; + + if (fpath->fdw_outerpath) + REJECT_IF_PATH_NOT_REPARAMETERIZABLE(fpath->fdw_outerpath); + } + break; + + case T_CustomPath: + { + CustomPath *cpath = (CustomPath *) path; + + REJECT_IF_PATH_LIST_NOT_REPARAMETERIZABLE(cpath->custom_paths); + } + break; + + case T_NestPath: + case T_MergePath: + case T_HashPath: + { + JoinPath *jpath = (JoinPath *) path; + + REJECT_IF_PATH_NOT_REPARAMETERIZABLE(jpath->outerjoinpath); + REJECT_IF_PATH_NOT_REPARAMETERIZABLE(jpath->innerjoinpath); + } + break; + + case T_AppendPath: + { + AppendPath *apath = (AppendPath *) path; + + REJECT_IF_PATH_LIST_NOT_REPARAMETERIZABLE(apath->subpaths); + } + break; + + case T_MaterialPath: + { + MaterialPath *mpath = (MaterialPath *) path; + + REJECT_IF_PATH_NOT_REPARAMETERIZABLE(mpath->subpath); + } + break; + + case T_MemoizePath: + { + MemoizePath *mpath = (MemoizePath *) path; + + REJECT_IF_PATH_NOT_REPARAMETERIZABLE(mpath->subpath); + } + break; + + case T_GatherPath: + { + GatherPath *gpath = (GatherPath *) path; + + REJECT_IF_PATH_NOT_REPARAMETERIZABLE(gpath->subpath); + } + break; + + default: + /* We don't know how to reparameterize this path. */ + return false; + } + + return true; +} + /* * reparameterize_pathlist_by_child * Helper function to reparameterize a list of paths by given child rel. + * + * Returns NIL to indicate failure, so pathlist had better not be NIL. */ static List * reparameterize_pathlist_by_child(PlannerInfo *root, @@ -4342,3 +4562,23 @@ reparameterize_pathlist_by_child(PlannerInfo *root, return result; } + +/* + * pathlist_is_reparameterizable_by_child + * Helper function to check if a list of paths can be reparameterized. + */ +static bool +pathlist_is_reparameterizable_by_child(List *pathlist, RelOptInfo *child_rel) +{ + ListCell *lc; + + foreach(lc, pathlist) + { + Path *path = (Path *) lfirst(lc); + + if (!path_is_reparameterizable_by_child(path, child_rel)) + return false; + } + + return true; +} diff --git a/src/backend/optimizer/util/placeholder.c b/src/backend/optimizer/util/placeholder.c index b1723578e6f9d..81abadd6db3e8 100644 --- a/src/backend/optimizer/util/placeholder.c +++ b/src/backend/optimizer/util/placeholder.c @@ -4,7 +4,7 @@ * PlaceHolderVar and PlaceHolderInfo manipulation routines * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -375,6 +375,7 @@ add_placeholders_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel, SpecialJoinInfo *sjinfo) { Relids relids = joinrel->relids; + int64 tuple_width = joinrel->reltarget->width; ListCell *lc; foreach(lc, root->placeholder_list) @@ -419,7 +420,7 @@ add_placeholders_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel, cost_qual_eval_node(&cost, (Node *) phv->phexpr, root); joinrel->reltarget->cost.startup += cost.startup; joinrel->reltarget->cost.per_tuple += cost.per_tuple; - joinrel->reltarget->width += phinfo->ph_width; + tuple_width += phinfo->ph_width; } } @@ -443,6 +444,8 @@ add_placeholders_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel, phinfo->ph_lateral); } } + + joinrel->reltarget->width = clamp_width_est(tuple_width); } /* diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index 39932d3c2d27c..86655f05dc8d6 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -4,7 +4,7 @@ * routines for accessing the system catalogs * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -36,17 +36,16 @@ #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "nodes/supportnodes.h" -#include "optimizer/clauses.h" #include "optimizer/cost.h" #include "optimizer/optimizer.h" #include "optimizer/plancat.h" -#include "optimizer/prep.h" #include "parser/parse_relation.h" #include "parser/parsetree.h" #include "partitioning/partdesc.h" #include "rewrite/rewriteManip.h" #include "statistics/statistics.h" #include "storage/bufmgr.h" +#include "tcop/tcopprot.h" #include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/partcache.h" @@ -163,6 +162,36 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, rel->attr_widths = (int32 *) palloc0((rel->max_attr - rel->min_attr + 1) * sizeof(int32)); + /* + * Record which columns are defined as NOT NULL. We leave this + * unpopulated for non-partitioned inheritance parent relations as it's + * ambiguous as to what it means. Some child tables may have a NOT NULL + * constraint for a column while others may not. We could work harder and + * build a unioned set of all child relations notnullattnums, but there's + * currently no need. The RelOptInfo corresponding to the !inh + * RangeTblEntry does get populated. + */ + if (!inhparent || relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + { + for (int i = 0; i < relation->rd_att->natts; i++) + { + FormData_pg_attribute *attr = &relation->rd_att->attrs[i]; + + if (attr->attnotnull) + { + rel->notnullattnums = bms_add_member(rel->notnullattnums, + attr->attnum); + + /* + * Per RemoveAttributeById(), dropped columns will have their + * attnotnull unset, so we needn't check for dropped columns + * in the above condition. + */ + Assert(!attr->attisdropped); + } + } + } + /* * Estimate relation size --- unless it's an inheritance parent, in which * case the size we want is not the rel's own size but the size of its @@ -500,6 +529,17 @@ get_relation_info(PlannerInfo *root, Oid relationObjectId, bool inhparent, /* Grab foreign-table info using the relcache, while we have it */ if (relation->rd_rel->relkind == RELKIND_FOREIGN_TABLE) { + /* Check if the access to foreign tables is restricted */ + if (unlikely((restrict_nonsystem_relation_kind & RESTRICT_RELKIND_FOREIGN_TABLE) != 0)) + { + /* there must not be built-in foreign tables */ + Assert(RelationGetRelid(relation) >= FirstNormalObjectId); + + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("access to non-system foreign table is restricted"))); + } + rel->serverid = GetForeignServerIdByRelId(RelationGetRelid(relation)); rel->fdwroutine = GetFdwRoutineForRelation(relation, true); } @@ -667,6 +707,7 @@ infer_arbiter_indexes(PlannerInfo *root) OnConflictExpr *onconflict = root->parse->onConflict; /* Iteration state */ + Index varno; RangeTblEntry *rte; Relation relation; Oid indexOidFromConstraint = InvalidOid; @@ -695,7 +736,8 @@ infer_arbiter_indexes(PlannerInfo *root) * the rewriter or when expand_inherited_rtentry() added it to the query's * rangetable. */ - rte = rt_fetch(root->parse->resultRelation, root->parse->rtable); + varno = root->parse->resultRelation; + rte = rt_fetch(varno, root->parse->rtable); relation = table_open(rte->relid, NoLock); @@ -829,6 +871,9 @@ infer_arbiter_indexes(PlannerInfo *root) /* Expression attributes (if any) must match */ idxExprs = RelationGetIndexExpressions(idxRel); + if (idxExprs && varno != 1) + ChangeVarNodes((Node *) idxExprs, 1, varno, 0); + foreach(el, onconflict->arbiterElems) { InferenceElem *elem = (InferenceElem *) lfirst(el); @@ -880,6 +925,8 @@ infer_arbiter_indexes(PlannerInfo *root) * CONFLICT's WHERE clause. */ predExprs = RelationGetIndexPredicate(idxRel); + if (predExprs && varno != 1) + ChangeVarNodes((Node *) predExprs, 1, varno, 0); if (!predicate_implied_by(predExprs, (List *) onconflict->arbiterWhere, false)) goto next; @@ -1137,7 +1184,7 @@ estimate_rel_size(Relation rel, int32 *attr_widths, int32 get_rel_data_width(Relation rel, int32 *attr_widths) { - int32 tuple_width = 0; + int64 tuple_width = 0; int i; for (i = 1; i <= RelationGetNumberOfAttributes(rel); i++) @@ -1167,7 +1214,7 @@ get_rel_data_width(Relation rel, int32 *attr_widths) tuple_width += item_width; } - return tuple_width; + return clamp_width_est(tuple_width); } /* @@ -1549,16 +1596,17 @@ relation_excluded_by_constraints(PlannerInfo *root, /* * Regardless of the setting of constraint_exclusion, detect - * constant-FALSE-or-NULL restriction clauses. Because const-folding will - * reduce "anything AND FALSE" to just "FALSE", any such case should - * result in exactly one baserestrictinfo entry. This doesn't fire very - * often, but it seems cheap enough to be worth doing anyway. (Without - * this, we'd miss some optimizations that 9.5 and earlier found via much - * more roundabout methods.) + * constant-FALSE-or-NULL restriction clauses. Although const-folding + * will reduce "anything AND FALSE" to just "FALSE", the baserestrictinfo + * list can still have other members besides the FALSE constant, due to + * qual pushdown and other mechanisms; so check them all. This doesn't + * fire very often, but it seems cheap enough to be worth doing anyway. + * (Without this, we'd miss some optimizations that 9.5 and earlier found + * via much more roundabout methods.) */ - if (list_length(rel->baserestrictinfo) == 1) + foreach(lc, rel->baserestrictinfo) { - RestrictInfo *rinfo = (RestrictInfo *) linitial(rel->baserestrictinfo); + RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc); Expr *clause = rinfo->clause; if (clause && IsA(clause, Const) && diff --git a/src/backend/optimizer/util/predtest.c b/src/backend/optimizer/util/predtest.c index 237c8838743ba..50ea80773677f 100644 --- a/src/backend/optimizer/util/predtest.c +++ b/src/backend/optimizer/util/predtest.c @@ -4,7 +4,7 @@ * Routines to attempt to prove logical implications between predicate * expressions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -51,7 +51,7 @@ typedef enum { CLASS_ATOM, /* expression that's not AND or OR */ CLASS_AND, /* expression with AND semantics */ - CLASS_OR /* expression with OR semantics */ + CLASS_OR, /* expression with OR semantics */ } PredClass; typedef struct PredIterInfoData *PredIterInfo; @@ -948,7 +948,7 @@ boolexpr_startup_fn(Node *clause, PredIterInfo info) typedef struct { OpExpr opexpr; - Const constexpr; + Const const_expr; int next_elem; int num_elems; Datum *elem_values; @@ -992,13 +992,13 @@ arrayconst_startup_fn(Node *clause, PredIterInfo info) state->opexpr.args = list_copy(saop->args); /* Set up a dummy Const node to hold the per-element values */ - state->constexpr.xpr.type = T_Const; - state->constexpr.consttype = ARR_ELEMTYPE(arrayval); - state->constexpr.consttypmod = -1; - state->constexpr.constcollid = arrayconst->constcollid; - state->constexpr.constlen = elmlen; - state->constexpr.constbyval = elmbyval; - lsecond(state->opexpr.args) = &state->constexpr; + state->const_expr.xpr.type = T_Const; + state->const_expr.consttype = ARR_ELEMTYPE(arrayval); + state->const_expr.consttypmod = -1; + state->const_expr.constcollid = arrayconst->constcollid; + state->const_expr.constlen = elmlen; + state->const_expr.constbyval = elmbyval; + lsecond(state->opexpr.args) = &state->const_expr; /* Initialize iteration state */ state->next_elem = 0; @@ -1011,8 +1011,8 @@ arrayconst_next_fn(PredIterInfo info) if (state->next_elem >= state->num_elems) return NULL; - state->constexpr.constvalue = state->elem_values[state->next_elem]; - state->constexpr.constisnull = state->elem_nulls[state->next_elem]; + state->const_expr.constvalue = state->elem_values[state->next_elem]; + state->const_expr.constisnull = state->elem_nulls[state->next_elem]; state->next_elem++; return (Node *) &(state->opexpr); } @@ -1087,38 +1087,12 @@ arrayexpr_cleanup_fn(PredIterInfo info) } -/*---------- +/* * predicate_implied_by_simple_clause * Does the predicate implication test for a "simple clause" predicate * and a "simple clause" restriction. * * We return true if able to prove the implication, false if not. - * - * We have several strategies for determining whether one simple clause - * implies another: - * - * A simple and general way is to see if they are equal(); this works for any - * kind of expression, and for either implication definition. (Actually, - * there is an implied assumption that the functions in the expression are - * immutable --- but this was checked for the predicate by the caller.) - * - * Another way that always works is that for boolean x, "x = TRUE" is - * equivalent to "x", likewise "x = FALSE" is equivalent to "NOT x". - * These can be worth checking because, while we preferentially simplify - * boolean comparisons down to "x" and "NOT x", the other form has to be - * dealt with anyway in the context of index conditions. - * - * If the predicate is of the form "foo IS NOT NULL", and we are considering - * strong implication, we can conclude that the predicate is implied if the - * clause is strict for "foo", i.e., it must yield false or NULL when "foo" - * is NULL. In that case truth of the clause ensures that "foo" isn't NULL. - * (Again, this is a safe conclusion because "foo" must be immutable.) - * This doesn't work for weak implication, though. - * - * Finally, if both clauses are binary operator expressions, we may be able - * to prove something using the system's knowledge about operators; those - * proof rules are encapsulated in operator_predicate_proof(). - *---------- */ static bool predicate_implied_by_simple_clause(Expr *predicate, Node *clause, @@ -1127,97 +1101,125 @@ predicate_implied_by_simple_clause(Expr *predicate, Node *clause, /* Allow interrupting long proof attempts */ CHECK_FOR_INTERRUPTS(); - /* First try the equal() test */ + /* + * A simple and general rule is that a clause implies itself, hence we + * check if they are equal(); this works for any kind of expression, and + * for either implication definition. (Actually, there is an implied + * assumption that the functions in the expression are immutable --- but + * this was checked for the predicate by the caller.) + */ if (equal((Node *) predicate, clause)) return true; - /* Next see if clause is boolean equality to a constant */ - if (is_opclause(clause) && - ((OpExpr *) clause)->opno == BooleanEqualOperator) + /* Next we have some clause-type-specific strategies */ + switch (nodeTag(clause)) { - OpExpr *op = (OpExpr *) clause; - Node *rightop; - - Assert(list_length(op->args) == 2); - rightop = lsecond(op->args); - /* We might never see a null Const here, but better check anyway */ - if (rightop && IsA(rightop, Const) && - !((Const *) rightop)->constisnull) - { - Node *leftop = linitial(op->args); - - if (DatumGetBool(((Const *) rightop)->constvalue)) + case T_OpExpr: { - /* X = true implies X */ - if (equal(predicate, leftop)) - return true; + OpExpr *op = (OpExpr *) clause; + + /*---------- + * For boolean x, "x = TRUE" is equivalent to "x", likewise + * "x = FALSE" is equivalent to "NOT x". These can be worth + * checking because, while we preferentially simplify boolean + * comparisons down to "x" and "NOT x", the other form has to + * be dealt with anyway in the context of index conditions. + * + * We could likewise check whether the predicate is boolean + * equality to a constant; but there are no known use-cases + * for that at the moment, assuming that the predicate has + * been through constant-folding. + *---------- + */ + if (op->opno == BooleanEqualOperator) + { + Node *rightop; + + Assert(list_length(op->args) == 2); + rightop = lsecond(op->args); + /* We might never see null Consts here, but better check */ + if (rightop && IsA(rightop, Const) && + !((Const *) rightop)->constisnull) + { + Node *leftop = linitial(op->args); + + if (DatumGetBool(((Const *) rightop)->constvalue)) + { + /* X = true implies X */ + if (equal(predicate, leftop)) + return true; + } + else + { + /* X = false implies NOT X */ + if (is_notclause(predicate) && + equal(get_notclausearg(predicate), leftop)) + return true; + } + } + } } - else + break; + default: + break; + } + + /* ... and some predicate-type-specific ones */ + switch (nodeTag(predicate)) + { + case T_NullTest: { - /* X = false implies NOT X */ - if (is_notclause(predicate) && - equal(get_notclausearg(predicate), leftop)) - return true; + NullTest *predntest = (NullTest *) predicate; + + switch (predntest->nulltesttype) + { + case IS_NOT_NULL: + + /* + * If the predicate is of the form "foo IS NOT NULL", + * and we are considering strong implication, we can + * conclude that the predicate is implied if the + * clause is strict for "foo", i.e., it must yield + * false or NULL when "foo" is NULL. In that case + * truth of the clause ensures that "foo" isn't NULL. + * (Again, this is a safe conclusion because "foo" + * must be immutable.) This doesn't work for weak + * implication, though. Also, "row IS NOT NULL" does + * not act in the simple way we have in mind. + */ + if (!weak && + !predntest->argisrow && + clause_is_strict_for(clause, + (Node *) predntest->arg, + true)) + return true; + break; + case IS_NULL: + break; + } } - } + break; + default: + break; } /* - * We could likewise check whether the predicate is boolean equality to a - * constant; but there are no known use-cases for that at the moment, - * assuming that the predicate has been through constant-folding. + * Finally, if both clauses are binary operator expressions, we may be + * able to prove something using the system's knowledge about operators; + * those proof rules are encapsulated in operator_predicate_proof(). */ - - /* Next try the IS NOT NULL case */ - if (!weak && - predicate && IsA(predicate, NullTest)) - { - NullTest *ntest = (NullTest *) predicate; - - /* row IS NOT NULL does not act in the simple way we have in mind */ - if (ntest->nulltesttype == IS_NOT_NULL && - !ntest->argisrow) - { - /* strictness of clause for foo implies foo IS NOT NULL */ - if (clause_is_strict_for(clause, (Node *) ntest->arg, true)) - return true; - } - return false; /* we can't succeed below... */ - } - - /* Else try operator-related knowledge */ return operator_predicate_proof(predicate, clause, false, weak); } -/*---------- +/* * predicate_refuted_by_simple_clause * Does the predicate refutation test for a "simple clause" predicate * and a "simple clause" restriction. * * We return true if able to prove the refutation, false if not. * - * Unlike the implication case, checking for equal() clauses isn't helpful. - * But relation_excluded_by_constraints() checks for self-contradictions in a - * list of clauses, so that we may get here with predicate and clause being - * actually pointer-equal, and that is worth eliminating quickly. - * - * When the predicate is of the form "foo IS NULL", we can conclude that - * the predicate is refuted if the clause is strict for "foo" (see notes for - * implication case), or is "foo IS NOT NULL". That works for either strong - * or weak refutation. - * - * A clause "foo IS NULL" refutes a predicate "foo IS NOT NULL" in all cases. - * If we are considering weak refutation, it also refutes a predicate that - * is strict for "foo", since then the predicate must yield false or NULL - * (and since "foo" appears in the predicate, it's known immutable). - * - * (The main motivation for covering these IS [NOT] NULL cases is to support - * using IS NULL/IS NOT NULL as partition-defining constraints.) - * - * Finally, if both clauses are binary operator expressions, we may be able - * to prove something using the system's knowledge about operators; those - * proof rules are encapsulated in operator_predicate_proof(). - *---------- + * The main motivation for covering IS [NOT] NULL cases is to support using + * IS NULL/IS NOT NULL as partition-defining constraints. */ static bool predicate_refuted_by_simple_clause(Expr *predicate, Node *clause, @@ -1226,61 +1228,152 @@ predicate_refuted_by_simple_clause(Expr *predicate, Node *clause, /* Allow interrupting long proof attempts */ CHECK_FOR_INTERRUPTS(); - /* A simple clause can't refute itself */ - /* Worth checking because of relation_excluded_by_constraints() */ + /* + * A simple clause can't refute itself, so unlike the implication case, + * checking for equal() clauses isn't helpful. + * + * But relation_excluded_by_constraints() checks for self-contradictions + * in a list of clauses, so that we may get here with predicate and clause + * being actually pointer-equal, and that is worth eliminating quickly. + */ if ((Node *) predicate == clause) return false; - /* Try the predicate-IS-NULL case */ - if (predicate && IsA(predicate, NullTest) && - ((NullTest *) predicate)->nulltesttype == IS_NULL) + /* Next we have some clause-type-specific strategies */ + switch (nodeTag(clause)) { - Expr *isnullarg = ((NullTest *) predicate)->arg; + case T_NullTest: + { + NullTest *clausentest = (NullTest *) clause; - /* row IS NULL does not act in the simple way we have in mind */ - if (((NullTest *) predicate)->argisrow) - return false; + /* row IS NULL does not act in the simple way we have in mind */ + if (clausentest->argisrow) + return false; - /* strictness of clause for foo refutes foo IS NULL */ - if (clause_is_strict_for(clause, (Node *) isnullarg, true)) - return true; - - /* foo IS NOT NULL refutes foo IS NULL */ - if (clause && IsA(clause, NullTest) && - ((NullTest *) clause)->nulltesttype == IS_NOT_NULL && - !((NullTest *) clause)->argisrow && - equal(((NullTest *) clause)->arg, isnullarg)) - return true; + switch (clausentest->nulltesttype) + { + case IS_NULL: + { + switch (nodeTag(predicate)) + { + case T_NullTest: + { + NullTest *predntest = (NullTest *) predicate; + + /* + * row IS NULL does not act in the + * simple way we have in mind + */ + if (predntest->argisrow) + return false; + + /* + * foo IS NULL refutes foo IS NOT + * NULL, at least in the non-row case, + * for both strong and weak refutation + */ + if (predntest->nulltesttype == IS_NOT_NULL && + equal(predntest->arg, clausentest->arg)) + return true; + } + break; + default: + break; + } - return false; /* we can't succeed below... */ + /* + * foo IS NULL weakly refutes any predicate that + * is strict for foo, since then the predicate + * must yield false or NULL (and since foo appears + * in the predicate, it's known immutable). + */ + if (weak && + clause_is_strict_for((Node *) predicate, + (Node *) clausentest->arg, + true)) + return true; + + return false; /* we can't succeed below... */ + } + break; + case IS_NOT_NULL: + break; + } + } + break; + default: + break; } - /* Try the clause-IS-NULL case */ - if (clause && IsA(clause, NullTest) && - ((NullTest *) clause)->nulltesttype == IS_NULL) + /* ... and some predicate-type-specific ones */ + switch (nodeTag(predicate)) { - Expr *isnullarg = ((NullTest *) clause)->arg; + case T_NullTest: + { + NullTest *predntest = (NullTest *) predicate; - /* row IS NULL does not act in the simple way we have in mind */ - if (((NullTest *) clause)->argisrow) - return false; + /* row IS NULL does not act in the simple way we have in mind */ + if (predntest->argisrow) + return false; - /* foo IS NULL refutes foo IS NOT NULL */ - if (predicate && IsA(predicate, NullTest) && - ((NullTest *) predicate)->nulltesttype == IS_NOT_NULL && - !((NullTest *) predicate)->argisrow && - equal(((NullTest *) predicate)->arg, isnullarg)) - return true; + switch (predntest->nulltesttype) + { + case IS_NULL: + { + switch (nodeTag(clause)) + { + case T_NullTest: + { + NullTest *clausentest = (NullTest *) clause; + + /* + * row IS NULL does not act in the + * simple way we have in mind + */ + if (clausentest->argisrow) + return false; + + /* + * foo IS NOT NULL refutes foo IS NULL + * for both strong and weak refutation + */ + if (clausentest->nulltesttype == IS_NOT_NULL && + equal(clausentest->arg, predntest->arg)) + return true; + } + break; + default: + break; + } - /* foo IS NULL weakly refutes any predicate that is strict for foo */ - if (weak && - clause_is_strict_for((Node *) predicate, (Node *) isnullarg, true)) - return true; + /* + * When the predicate is of the form "foo IS + * NULL", we can conclude that the predicate is + * refuted if the clause is strict for "foo" (see + * notes for implication case). That works for + * either strong or weak refutation. + */ + if (clause_is_strict_for(clause, + (Node *) predntest->arg, + true)) + return true; + } + break; + case IS_NOT_NULL: + break; + } - return false; /* we can't succeed below... */ + return false; /* we can't succeed below... */ + } + break; + default: + break; } - /* Else try operator-related knowledge */ + /* + * Finally, if both clauses are binary operator expressions, we may be + * able to prove something using the system's knowledge about operators. + */ return operator_predicate_proof(predicate, clause, true, weak); } diff --git a/src/backend/optimizer/util/relnode.c b/src/backend/optimizer/util/relnode.c index 15e3910b79af8..610093fe915ed 100644 --- a/src/backend/optimizer/util/relnode.c +++ b/src/backend/optimizer/util/relnode.c @@ -3,7 +3,7 @@ * relnode.c * Relation-node lookup/construction routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,14 +22,15 @@ #include "optimizer/clauses.h" #include "optimizer/cost.h" #include "optimizer/inherit.h" +#include "optimizer/optimizer.h" #include "optimizer/pathnode.h" #include "optimizer/paths.h" #include "optimizer/placeholder.h" #include "optimizer/plancat.h" #include "optimizer/restrictinfo.h" #include "optimizer/tlist.h" -#include "rewrite/rewriteManip.h" #include "parser/parse_relation.h" +#include "rewrite/rewriteManip.h" #include "utils/hsearch.h" #include "utils/lsyscache.h" @@ -221,6 +222,7 @@ build_simple_rel(PlannerInfo *root, int relid, RelOptInfo *parent) rel->relid = relid; rel->rtekind = rte->rtekind; /* min_attr, max_attr, attr_needed, attr_widths are set below */ + rel->notnullattnums = NULL; rel->lateral_vars = NIL; rel->indexlist = NIL; rel->statlist = NIL; @@ -371,10 +373,20 @@ build_simple_rel(PlannerInfo *root, int relid, RelOptInfo *parent) } /* - * Copy the parent's quals to the child, with appropriate substitution of - * variables. If any constant false or NULL clauses turn up, we can mark - * the child as dummy right away. (We must do this immediately so that - * pruning works correctly when recursing in expand_partitioned_rtentry.) + * We must apply the partially filled in RelOptInfo before calling + * apply_child_basequals due to some transformations within that function + * which require the RelOptInfo to be available in the simple_rel_array. + */ + root->simple_rel_array[relid] = rel; + + /* + * Apply the parent's quals to the child, with appropriate substitution of + * variables. If the resulting clause is constant-FALSE or NULL after + * applying transformations, apply_child_basequals returns false to + * indicate that scanning this relation won't yield any rows. In this + * case, we mark the child as dummy right away. (We must do this + * immediately so that pruning works correctly when recursing in + * expand_partitioned_rtentry.) */ if (parent) { @@ -384,16 +396,13 @@ build_simple_rel(PlannerInfo *root, int relid, RelOptInfo *parent) if (!apply_child_basequals(root, parent, rel, rte, appinfo)) { /* - * Some restriction clause reduced to constant FALSE or NULL after - * substitution, so this child need not be scanned. + * Restriction clause reduced to constant FALSE or NULL. Mark as + * dummy so we won't scan this relation. */ mark_dummy_rel(rel); } } - /* Save the finished struct in the query's simple_rel_array */ - root->simple_rel_array[relid] = rel; - return rel; } @@ -406,9 +415,8 @@ find_base_rel(PlannerInfo *root, int relid) { RelOptInfo *rel; - Assert(relid > 0); - - if (relid < root->simple_rel_array_size) + /* use an unsigned comparison to prevent negative array element access */ + if ((uint32) relid < (uint32) root->simple_rel_array_size) { rel = root->simple_rel_array[relid]; if (rel) @@ -420,6 +428,19 @@ find_base_rel(PlannerInfo *root, int relid) return NULL; /* keep compiler quiet */ } +/* + * find_base_rel_noerr + * Find a base or otherrel relation entry, returning NULL if there's none + */ +RelOptInfo * +find_base_rel_noerr(PlannerInfo *root, int relid) +{ + /* use an unsigned comparison to prevent negative array element access */ + if ((uint32) relid < (uint32) root->simple_rel_array_size) + return root->simple_rel_array[relid]; + return NULL; +} + /* * find_base_rel_ignore_join * Find a base or otherrel relation entry, which must already exist. @@ -432,9 +453,8 @@ find_base_rel(PlannerInfo *root, int relid) RelOptInfo * find_base_rel_ignore_join(PlannerInfo *root, int relid) { - Assert(relid > 0); - - if (relid < root->simple_rel_array_size) + /* use an unsigned comparison to prevent negative array element access */ + if ((uint32) relid < (uint32) root->simple_rel_array_size) { RelOptInfo *rel; RangeTblEntry *rte; @@ -707,6 +727,7 @@ build_join_rel(PlannerInfo *root, joinrel->max_attr = 0; joinrel->attr_needed = NULL; joinrel->attr_widths = NULL; + joinrel->notnullattnums = NULL; joinrel->nulling_relids = NULL; joinrel->lateral_vars = NIL; joinrel->lateral_referencers = NULL; @@ -871,10 +892,19 @@ build_child_join_rel(PlannerInfo *root, RelOptInfo *outer_rel, /* The parent joinrel should have consider_partitionwise_join set. */ Assert(parent_joinrel->consider_partitionwise_join); + /* + * Find the AppendRelInfo structures for the child baserels. We'll need + * these for computing the child join's relid set, and later for mapping + * Vars to the child rel. + */ + appinfos = find_appinfos_by_relids(root, + bms_union(outer_rel->relids, + inner_rel->relids), + &nappinfos); + joinrel->reloptkind = RELOPT_OTHER_JOINREL; - joinrel->relids = bms_union(outer_rel->relids, inner_rel->relids); - joinrel->relids = add_outer_joins_to_relids(root, joinrel->relids, sjinfo, - NULL); + joinrel->relids = adjust_child_relids(parent_joinrel->relids, + nappinfos, appinfos); joinrel->rows = 0; /* cheap startup cost is interesting iff not all tuples to be retrieved */ joinrel->consider_startup = (root->tuple_fraction > 0); @@ -896,6 +926,7 @@ build_child_join_rel(PlannerInfo *root, RelOptInfo *outer_rel, joinrel->max_attr = 0; joinrel->attr_needed = NULL; joinrel->attr_widths = NULL; + joinrel->notnullattnums = NULL; joinrel->nulling_relids = NULL; joinrel->lateral_vars = NIL; joinrel->lateral_referencers = NULL; @@ -935,9 +966,6 @@ build_child_join_rel(PlannerInfo *root, RelOptInfo *outer_rel, /* Compute information relevant to foreign relations. */ set_foreign_rel_properties(joinrel, outer_rel, inner_rel); - /* Compute information needed for mapping Vars to the child rel */ - appinfos = find_appinfos_by_relids(root, joinrel->relids, &nappinfos); - /* Set up reltarget struct */ build_child_join_reltarget(root, parent_joinrel, joinrel, nappinfos, appinfos); @@ -1088,6 +1116,7 @@ build_joinrel_tlist(PlannerInfo *root, RelOptInfo *joinrel, bool can_null) { Relids relids = joinrel->relids; + int64 tuple_width = joinrel->reltarget->width; ListCell *vars; ListCell *lc; @@ -1140,7 +1169,7 @@ build_joinrel_tlist(PlannerInfo *root, RelOptInfo *joinrel, joinrel->reltarget->exprs = lappend(joinrel->reltarget->exprs, phv); /* Bubbling up the precomputed result has cost zero */ - joinrel->reltarget->width += phinfo->ph_width; + tuple_width += phinfo->ph_width; } continue; } @@ -1161,7 +1190,7 @@ build_joinrel_tlist(PlannerInfo *root, RelOptInfo *joinrel, list_nth(root->row_identity_vars, var->varattno - 1); /* Update reltarget width estimate from RowIdentityVarInfo */ - joinrel->reltarget->width += ridinfo->rowidwidth; + tuple_width += ridinfo->rowidwidth; } else { @@ -1177,7 +1206,7 @@ build_joinrel_tlist(PlannerInfo *root, RelOptInfo *joinrel, continue; /* nope, skip it */ /* Update reltarget width estimate from baserel's attr_widths */ - joinrel->reltarget->width += baserel->attr_widths[ndx]; + tuple_width += baserel->attr_widths[ndx]; } /* @@ -1217,6 +1246,8 @@ build_joinrel_tlist(PlannerInfo *root, RelOptInfo *joinrel, /* Vars have cost zero, so no need to adjust reltarget->cost */ } + + joinrel->reltarget->width = clamp_width_est(tuple_width); } /* @@ -1529,6 +1560,7 @@ get_baserel_parampathinfo(PlannerInfo *root, RelOptInfo *baserel, ParamPathInfo *ppi; Relids joinrelids; List *pclauses; + List *eqclauses; Bitmapset *pserials; double rows; ListCell *lc; @@ -1564,14 +1596,25 @@ get_baserel_parampathinfo(PlannerInfo *root, RelOptInfo *baserel, /* * Add in joinclauses generated by EquivalenceClasses, too. (These - * necessarily satisfy join_clause_is_movable_into.) + * necessarily satisfy join_clause_is_movable_into; but in assert-enabled + * builds, let's verify that.) */ - pclauses = list_concat(pclauses, - generate_join_implied_equalities(root, - joinrelids, - required_outer, - baserel, - NULL)); + eqclauses = generate_join_implied_equalities(root, + joinrelids, + required_outer, + baserel, + NULL); +#ifdef USE_ASSERT_CHECKING + foreach(lc, eqclauses) + { + RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc); + + Assert(join_clause_is_movable_into(rinfo, + baserel->relids, + joinrelids)); + } +#endif + pclauses = list_concat(pclauses, eqclauses); /* Compute set of serial numbers of the enforced clauses */ pserials = NULL; @@ -2145,6 +2188,10 @@ have_partkey_equi_join(PlannerInfo *root, RelOptInfo *joinrel, if (ipk1 != ipk2) continue; + /* Reject if the partition key collation differs from the clause's. */ + if (rel1->part_scheme->partcollation[ipk1] != opexpr->inputcollid) + return false; + /* * The clause allows partitionwise join only if it uses the same * operator family as that specified by the partition key. diff --git a/src/backend/optimizer/util/restrictinfo.c b/src/backend/optimizer/util/restrictinfo.c index d6d26a2b515cf..0b406e93342d3 100644 --- a/src/backend/optimizer/util/restrictinfo.c +++ b/src/backend/optimizer/util/restrictinfo.c @@ -3,7 +3,7 @@ * restrictinfo.c * RestrictInfo node manipulation routines. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/optimizer/util/tlist.c b/src/backend/optimizer/util/tlist.c index c672b338c0d03..7ef7f34d8b5d6 100644 --- a/src/backend/optimizer/util/tlist.c +++ b/src/backend/optimizer/util/tlist.c @@ -3,7 +3,7 @@ * tlist.c * Target list manipulation routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/optimizer/util/var.c b/src/backend/optimizer/util/var.c index c55c5f805b302..844fc30978b21 100644 --- a/src/backend/optimizer/util/var.c +++ b/src/backend/optimizer/util/var.c @@ -9,7 +9,7 @@ * contains variables. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/parser/Makefile b/src/backend/parser/Makefile index 9f1c4022bbe00..3162a01f302d4 100644 --- a/src/backend/parser/Makefile +++ b/src/backend/parser/Makefile @@ -23,6 +23,7 @@ OBJS = \ parse_enr.o \ parse_expr.o \ parse_func.o \ + parse_jsontable.o \ parse_merge.o \ parse_node.o \ parse_oper.o \ @@ -64,8 +65,8 @@ scan.c: FLEX_FIX_WARNING=yes # Force these dependencies to be known even without dependency info built: gram.o scan.o parser.o: gram.h - -# gram.c, gram.h, and scan.c are in the distribution tarball, so they -# are not cleaned here. -clean distclean maintainer-clean: +clean: + rm -f gram.c \ + gram.h \ + scan.c rm -f lex.backup diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 4006632092786..28fed9d87f6bc 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -14,7 +14,7 @@ * contain optimizable statements, which we should transform. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/parser/analyze.c @@ -48,10 +48,8 @@ #include "parser/parse_target.h" #include "parser/parse_type.h" #include "parser/parsetree.h" -#include "rewrite/rewriteManip.h" #include "utils/backend_status.h" #include "utils/builtins.h" -#include "utils/guc.h" #include "utils/rel.h" #include "utils/syscache.h" @@ -74,7 +72,6 @@ static void determineRecursiveColTypes(ParseState *pstate, Node *larg, List *nrtargetlist); static Query *transformReturnStmt(ParseState *pstate, ReturnStmt *stmt); static Query *transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt); -static List *transformReturningList(ParseState *pstate, List *returningList); static Query *transformPLAssignStmt(ParseState *pstate, PLAssignStmt *stmt); static Query *transformDeclareCursorStmt(ParseState *pstate, @@ -335,6 +332,11 @@ transformStmt(ParseState *pstate, Node *parseTree) } #endif /* RAW_EXPRESSION_COVERAGE_TEST */ + /* + * Caution: when changing the set of statement types that have non-default + * processing here, see also stmt_requires_parse_analysis() and + * analyze_requires_snapshot(). + */ switch (nodeTag(parseTree)) { /* @@ -421,14 +423,22 @@ transformStmt(ParseState *pstate, Node *parseTree) } /* - * analyze_requires_snapshot - * Returns true if a snapshot must be set before doing parse analysis - * on the given raw parse tree. + * stmt_requires_parse_analysis + * Returns true if parse analysis will do anything non-trivial + * with the given raw parse tree. + * + * Generally, this should return true for any statement type for which + * transformStmt() does more than wrap a CMD_UTILITY Query around it. + * When it returns false, the caller can assume that there is no situation + * in which parse analysis of the raw statement could need to be re-done. * - * Classification here should match transformStmt(). + * Currently, since the rewriter and planner do nothing for CMD_UTILITY + * Queries, a false result means that the entire parse analysis/rewrite/plan + * pipeline will never need to be re-done. If that ever changes, callers + * will likely need adjustment. */ bool -analyze_requires_snapshot(RawStmt *parseTree) +stmt_requires_parse_analysis(RawStmt *parseTree) { bool result; @@ -442,6 +452,7 @@ analyze_requires_snapshot(RawStmt *parseTree) case T_UpdateStmt: case T_MergeStmt: case T_SelectStmt: + case T_ReturnStmt: case T_PLAssignStmt: result = true; break; @@ -452,12 +463,12 @@ analyze_requires_snapshot(RawStmt *parseTree) case T_DeclareCursorStmt: case T_ExplainStmt: case T_CreateTableAsStmt: - /* yes, because we must analyze the contained statement */ + case T_CallStmt: result = true; break; default: - /* other utility statements don't have any real parse analysis */ + /* all other statements just get wrapped in a CMD_UTILITY Query */ result = false; break; } @@ -465,6 +476,30 @@ analyze_requires_snapshot(RawStmt *parseTree) return result; } +/* + * analyze_requires_snapshot + * Returns true if a snapshot must be set before doing parse analysis + * on the given raw parse tree. + */ +bool +analyze_requires_snapshot(RawStmt *parseTree) +{ + /* + * Currently, this should return true in exactly the same cases that + * stmt_requires_parse_analysis() does, so we just invoke that function + * rather than duplicating it. We keep the two entry points separate for + * clarity of callers, since from the callers' standpoint these are + * different conditions. + * + * While there may someday be a statement type for which transformStmt() + * does something nontrivial and yet no snapshot is needed for that + * processing, it seems likely that making such a choice would be fragile. + * If you want to install an exception, document the reasoning for it in a + * comment. + */ + return stmt_requires_parse_analysis(parseTree); +} + /* * transformDeleteStmt - * transforms a Delete Statement @@ -515,7 +550,8 @@ transformDeleteStmt(ParseState *pstate, DeleteStmt *stmt) qual = transformWhereClause(pstate, stmt->whereClause, EXPR_KIND_WHERE, "WHERE"); - qry->returningList = transformReturningList(pstate, stmt->returningList); + qry->returningList = transformReturningList(pstate, stmt->returningList, + EXPR_KIND_RETURNING); /* done building the range table and jointree */ qry->rtable = pstate->p_rtable; @@ -942,7 +978,8 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt) /* Process RETURNING, if any. */ if (stmt->returningList) qry->returningList = transformReturningList(pstate, - stmt->returningList); + stmt->returningList, + EXPR_KIND_RETURNING); /* done building the range table and jointree */ qry->rtable = pstate->p_rtable; @@ -1034,17 +1071,28 @@ transformInsertRow(ParseState *pstate, List *exprlist, if (strip_indirection) { + /* + * We need to remove top-level FieldStores and SubscriptingRefs, + * as well as any CoerceToDomain appearing above one of those --- + * but not a CoerceToDomain that isn't above one of those. + */ while (expr) { - if (IsA(expr, FieldStore)) + Expr *subexpr = expr; + + while (IsA(subexpr, CoerceToDomain)) { - FieldStore *fstore = (FieldStore *) expr; + subexpr = ((CoerceToDomain *) subexpr)->arg; + } + if (IsA(subexpr, FieldStore)) + { + FieldStore *fstore = (FieldStore *) subexpr; expr = (Expr *) linitial(fstore->newvals); } - else if (IsA(expr, SubscriptingRef)) + else if (IsA(subexpr, SubscriptingRef)) { - SubscriptingRef *sbsref = (SubscriptingRef *) expr; + SubscriptingRef *sbsref = (SubscriptingRef *) subexpr; if (sbsref->refassgnexpr == NULL) break; @@ -1842,7 +1890,8 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt) * For now, we don't support resjunk sort clauses on the output of a * setOperation tree --- you can only use the SQL92-spec options of * selecting an output column by name or number. Enforce by checking that - * transformSortClause doesn't add any items to tlist. + * transformSortClause doesn't add any items to tlist. Note, if changing + * this, add_setop_child_rel_equivalences() will need to be updated. */ tllen = list_length(qry->targetList); @@ -2407,7 +2456,8 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt) qual = transformWhereClause(pstate, stmt->whereClause, EXPR_KIND_WHERE, "WHERE"); - qry->returningList = transformReturningList(pstate, stmt->returningList); + qry->returningList = transformReturningList(pstate, stmt->returningList, + EXPR_KIND_RETURNING); /* * Now we are done with SELECT-like processing, and can get on with @@ -2480,6 +2530,9 @@ transformUpdateTargetList(ParseState *pstate, List *origTlist) errmsg("column \"%s\" of relation \"%s\" does not exist", origTarget->name, RelationGetRelationName(pstate->p_target_relation)), + (origTarget->indirection != NIL && + strcmp(origTarget->name, pstate->p_target_nsitem->p_names->aliasname) == 0) ? + errhint("SET target columns cannot be qualified with the relation name.") : 0, parser_errposition(pstate, origTarget->location))); updateTargetListEntry(pstate, tle, origTarget->name, @@ -2501,10 +2554,11 @@ transformUpdateTargetList(ParseState *pstate, List *origTlist) /* * transformReturningList - - * handle a RETURNING clause in INSERT/UPDATE/DELETE + * handle a RETURNING clause in INSERT/UPDATE/DELETE/MERGE */ -static List * -transformReturningList(ParseState *pstate, List *returningList) +List * +transformReturningList(ParseState *pstate, List *returningList, + ParseExprKind exprKind) { List *rlist; int save_next_resno; @@ -2521,7 +2575,7 @@ transformReturningList(ParseState *pstate, List *returningList) pstate->p_next_resno = 1; /* transform RETURNING identically to a SELECT targetlist */ - rlist = transformTargetList(pstate, returningList, EXPR_KIND_RETURNING); + rlist = transformTargetList(pstate, returningList, exprKind); /* * Complain if the nonempty tlist expanded to nothing (which is possible diff --git a/src/backend/parser/check_keywords.pl b/src/backend/parser/check_keywords.pl index e9b6f40eaa61b..3542e8d1eb644 100644 --- a/src/backend/parser/check_keywords.pl +++ b/src/backend/parser/check_keywords.pl @@ -4,10 +4,10 @@ # Usage: check_keywords.pl gram.y kwlist.h # src/backend/parser/check_keywords.pl -# Copyright (c) 2009-2023, PostgreSQL Global Development Group +# Copyright (c) 2009-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; my $gram_filename = $ARGV[0]; my $kwlist_filename = $ARGV[1]; diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 39ab7eac0d1d1..08e2195fa48a4 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -6,7 +6,7 @@ * gram.y * POSTGRESQL BISON rules/actions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -170,7 +170,6 @@ static void updateRawStmtEnd(RawStmt *rs, int end_location); static Node *makeColumnRef(char *colname, List *indirection, int location, core_yyscan_t yyscanner); static Node *makeTypeCast(Node *arg, TypeName *typename, int location); -static Node *makeStringConst(char *str, int location); static Node *makeStringConstCast(char *str, int location, TypeName *typename); static Node *makeIntConst(int val, int location); static Node *makeFloatConst(char *str, int location); @@ -275,6 +274,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); struct SelectLimit *selectlimit; SetQuantifier setquantifier; struct GroupClause *groupclause; + MergeMatchKind mergematch; MergeWhenClause *mergewhen; struct KeyActions *keyactions; struct KeyAction *keyaction; @@ -337,6 +337,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type alter_table_cmds alter_type_cmds %type alter_identity_column_option_list %type alter_identity_column_option +%type set_statistics_value +%type set_access_method_name %type createdb_opt_list createdb_opt_items copy_opt_list transaction_mode_list @@ -514,13 +516,14 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type opt_on_conflict %type merge_insert merge_update merge_delete +%type merge_when_tgt_matched merge_when_tgt_not_matched %type merge_when_clause opt_merge_when_condition %type merge_when_list %type generic_set set_rest set_rest_more generic_reset reset_rest SetResetClause FunctionSetResetClause -%type TableElement TypedTableElement ConstraintElem TableFuncElement +%type TableElement TypedTableElement ConstraintElem DomainConstraintElem TableFuncElement %type columnDef columnOptions %type def_elem reloption_elem old_aggr_elem operator_def_elem %type def_arg columnElem where_clause where_or_current_clause @@ -566,7 +569,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type copy_options %type Typename SimpleTypename ConstTypename - GenericType Numeric opt_float + GenericType Numeric opt_float JsonType Character ConstCharacter CharacterWithLength CharacterWithoutLength ConstDatetime ConstInterval @@ -591,7 +594,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type col_name_keyword reserved_keyword %type bare_label_keyword -%type TableConstraint TableLikeClause +%type DomainConstraint TableConstraint TableLikeClause %type TableLikeOptionList TableLikeOption %type column_compression opt_column_compression column_storage opt_column_storage %type ColQualList @@ -645,23 +648,34 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type hash_partbound %type hash_partbound_elem +%type json_format_clause + json_format_clause_opt + json_value_expr + json_returning_clause_opt + json_name_and_value + json_aggregate_func + json_argument + json_behavior + json_on_error_clause_opt + json_table + json_table_column_definition + json_table_column_path_clause_opt +%type json_name_and_value_list + json_value_expr_list + json_array_aggregate_order_by_clause_opt + json_arguments + json_behavior_clause_opt + json_passing_clause_opt + json_table_column_definition_list +%type json_table_path_name_opt +%type json_behavior_type + json_predicate_type_constraint + json_quotes_clause_opt + json_wrapper_behavior +%type json_key_uniqueness_constraint_opt + json_object_constructor_null_clause_opt + json_array_constructor_null_clause_opt -%type json_format_clause_opt - json_value_expr - json_output_clause_opt - json_name_and_value - json_aggregate_func - -%type json_name_and_value_list - json_value_expr_list - json_array_aggregate_order_by_clause_opt - -%type json_encoding_clause_opt - json_predicate_type_constraint - -%type json_key_uniqueness_constraint_opt - json_object_constructor_null_clause_opt - json_array_constructor_null_clause_opt /* * Non-keyword token types. These are hard-wired into the "flex" lexer. @@ -698,7 +712,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); CACHE CALL CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE CLUSTER COALESCE COLLATE COLLATION COLUMN COLUMNS COMMENT COMMENTS COMMIT - COMMITTED COMPRESSION CONCURRENTLY CONFIGURATION CONFLICT + COMMITTED COMPRESSION CONCURRENTLY CONDITIONAL CONFIGURATION CONFLICT CONNECTION CONSTRAINT CONSTRAINTS CONTENT_P CONTINUE_P CONVERSION_P COPY COST CREATE CROSS CSV CUBE CURRENT_P CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA @@ -709,8 +723,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP - EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT - EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION + EACH ELSE EMPTY_P ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ERROR_P ESCAPE + EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION EXTENSION EXTERNAL EXTRACT FALSE_P FAMILY FETCH FILTER FINALIZE FIRST_P FLOAT_P FOLLOWING FOR @@ -725,32 +739,33 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION - JOIN JSON JSON_ARRAY JSON_ARRAYAGG JSON_OBJECT JSON_OBJECTAGG + JOIN JSON JSON_ARRAY JSON_ARRAYAGG JSON_EXISTS JSON_OBJECT JSON_OBJECTAGG + JSON_QUERY JSON_SCALAR JSON_SERIALIZE JSON_TABLE JSON_VALUE - KEY KEYS + KEEP KEY KEYS LABEL LANGUAGE LARGE_P LAST_P LATERAL_P LEADING LEAKPROOF LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOCKED LOGGED - MAPPING MATCH MATCHED MATERIALIZED MAXVALUE MERGE METHOD + MAPPING MATCH MATCHED MATERIALIZED MAXVALUE MERGE MERGE_ACTION METHOD MINUTE_P MINVALUE MODE MONTH_P MOVE - NAME_P NAMES NATIONAL NATURAL NCHAR NEW NEXT NFC NFD NFKC NFKD NO NONE - NORMALIZE NORMALIZED + NAME_P NAMES NATIONAL NATURAL NCHAR NESTED NEW NEXT NFC NFD NFKC NFKD NO + NONE NORMALIZE NORMALIZED NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF NULLS_P NUMERIC - OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OPTIONS OR + OBJECT_P OF OFF OFFSET OIDS OLD OMIT ON ONLY OPERATOR OPTION OPTIONS OR ORDER ORDINALITY OTHERS OUT_P OUTER_P OVER OVERLAPS OVERLAY OVERRIDING OWNED OWNER - PARALLEL PARAMETER PARSER PARTIAL PARTITION PASSING PASSWORD - PLACING PLANS POLICY + PARALLEL PARAMETER PARSER PARTIAL PARTITION PASSING PASSWORD PATH + PLACING PLAN PLANS POLICY POSITION PRECEDING PRECISION PRESERVE PREPARE PREPARED PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE PROCEDURES PROGRAM PUBLICATION - QUOTE + QUOTE QUOTES RANGE READ REAL REASSIGN RECHECK RECURSIVE REF_P REFERENCES REFERENCING REFRESH REINDEX RELATIVE_P RELEASE RENAME REPEATABLE REPLACE REPLICA @@ -760,16 +775,16 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); SAVEPOINT SCALAR SCHEMA SCHEMAS SCROLL SEARCH SECOND_P SECURITY SELECT SEQUENCE SEQUENCES SERIALIZABLE SERVER SESSION SESSION_USER SET SETS SETOF SHARE SHOW - SIMILAR SIMPLE SKIP SMALLINT SNAPSHOT SOME SQL_P STABLE STANDALONE_P - START STATEMENT STATISTICS STDIN STDOUT STORAGE STORED STRICT_P STRIP_P + SIMILAR SIMPLE SKIP SMALLINT SNAPSHOT SOME SOURCE SQL_P STABLE STANDALONE_P + START STATEMENT STATISTICS STDIN STDOUT STORAGE STORED STRICT_P STRING_P STRIP_P SUBSCRIPTION SUBSTRING SUPPORT SYMMETRIC SYSID SYSTEM_P SYSTEM_USER - TABLE TABLES TABLESAMPLE TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN + TABLE TABLES TABLESAMPLE TABLESPACE TARGET TEMP TEMPLATE TEMPORARY TEXT_P THEN TIES TIME TIMESTAMP TO TRAILING TRANSACTION TRANSFORM TREAT TRIGGER TRIM TRUE_P TRUNCATE TRUSTED TYPE_P TYPES_P - UESCAPE UNBOUNDED UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN + UESCAPE UNBOUNDED UNCONDITIONAL UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNLOGGED UNTIL UPDATE USER USING VACUUM VALID VALIDATE VALIDATOR VALUE_P VALUES VARCHAR VARIADIC VARYING @@ -812,7 +827,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); /* Precedence: lowest to highest */ -%nonassoc SET /* see relation_expr_opt_alias */ %left UNION EXCEPT %left INTERSECT %left OR @@ -823,18 +837,23 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %nonassoc BETWEEN IN_P LIKE ILIKE SIMILAR NOT_LA %nonassoc ESCAPE /* ESCAPE must be just above LIKE/ILIKE/SIMILAR */ -/* SQL/JSON related keywords */ -%nonassoc UNIQUE JSON -%nonassoc KEYS OBJECT_P SCALAR VALUE_P -%nonassoc WITH WITHOUT - /* - * To support target_el without AS, it used to be necessary to assign IDENT an - * explicit precedence just less than Op. While that's not really necessary - * since we removed postfix operators, it's still helpful to do so because - * there are some other unreserved keywords that need precedence assignments. - * If those keywords have the same precedence as IDENT then they clearly act - * the same as non-keywords, reducing the risk of unwanted precedence effects. + * Sometimes it is necessary to assign precedence to keywords that are not + * really part of the operator hierarchy, in order to resolve grammar + * ambiguities. It's best to avoid doing so whenever possible, because such + * assignments have global effect and may hide ambiguities besides the one + * you intended to solve. (Attaching a precedence to a single rule with + * %prec is far safer and should be preferred.) If you must give precedence + * to a new keyword, try very hard to give it the same precedence as IDENT. + * If the keyword has IDENT's precedence then it clearly acts the same as + * non-keywords and other similar keywords, thus reducing the risk of + * unexpected precedence effects. + * + * We used to need to assign IDENT an explicit precedence just less than Op, + * to support target_el without AS. While that's not really necessary since + * we removed postfix operators, we continue to do so because it provides a + * reference point for a precedence level that we can assign to other + * keywords that lack a natural precedence level. * * We need to do this for PARTITION, RANGE, ROWS, and GROUPS to support * opt_existing_window_name (see comment there). @@ -852,15 +871,27 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); * an explicit priority lower than '(', so that a rule with CUBE '(' will shift * rather than reducing a conflicting rule that takes CUBE as a function name. * Using the same precedence as IDENT seems right for the reasons given above. + * + * SET is likewise assigned the same precedence as IDENT, to support the + * relation_expr_opt_alias production (see comment there). + * + * KEYS, OBJECT_P, SCALAR, VALUE_P, WITH, and WITHOUT are similarly assigned + * the same precedence as IDENT. This allows resolving conflicts in the + * json_predicate_type_constraint and json_key_uniqueness_constraint_opt + * productions (see comments there). + * + * Like the UNBOUNDED PRECEDING/FOLLOWING case, NESTED is assigned a lower + * precedence than PATH to fix ambiguity in the json_table production. */ -%nonassoc UNBOUNDED /* ideally would have same precedence as IDENT */ +%nonassoc UNBOUNDED NESTED /* ideally would have same precedence as IDENT */ %nonassoc IDENT PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP + SET KEYS OBJECT_P SCALAR VALUE_P WITH WITHOUT PATH %left Op OPERATOR /* multi-character ops and user-defined operators */ %left '+' '-' %left '*' '/' '%' %left '^' /* Unary Operators */ -%left AT /* sets precedence for AT TIME ZONE */ +%left AT /* sets precedence for AT TIME ZONE, AT LOCAL */ %left COLLATE %right UMINUS %left '[' ']' @@ -2406,6 +2437,16 @@ alter_table_cmd: n->name = $3; $$ = (Node *) n; } + /* ALTER TABLE ALTER [COLUMN] SET EXPRESSION AS */ + | ALTER opt_column ColId SET EXPRESSION AS '(' a_expr ')' + { + AlterTableCmd *n = makeNode(AlterTableCmd); + + n->subtype = AT_SetExpression; + n->name = $3; + n->def = $8; + $$ = (Node *) n; + } /* ALTER TABLE ALTER [COLUMN] DROP EXPRESSION */ | ALTER opt_column ColId DROP EXPRESSION { @@ -2425,18 +2466,18 @@ alter_table_cmd: n->missing_ok = true; $$ = (Node *) n; } - /* ALTER TABLE ALTER [COLUMN] SET STATISTICS */ - | ALTER opt_column ColId SET STATISTICS SignedIconst + /* ALTER TABLE ALTER [COLUMN] SET STATISTICS */ + | ALTER opt_column ColId SET STATISTICS set_statistics_value { AlterTableCmd *n = makeNode(AlterTableCmd); n->subtype = AT_SetStatistics; n->name = $3; - n->def = (Node *) makeInteger($6); + n->def = $6; $$ = (Node *) n; } - /* ALTER TABLE ALTER [COLUMN] SET STATISTICS */ - | ALTER opt_column Iconst SET STATISTICS SignedIconst + /* ALTER TABLE ALTER [COLUMN] SET STATISTICS */ + | ALTER opt_column Iconst SET STATISTICS set_statistics_value { AlterTableCmd *n = makeNode(AlterTableCmd); @@ -2448,7 +2489,7 @@ alter_table_cmd: n->subtype = AT_SetStatistics; n->num = (int16) $3; - n->def = (Node *) makeInteger($6); + n->def = $6; $$ = (Node *) n; } /* ALTER TABLE ALTER [COLUMN] SET ( column_parameter = value [, ... ] ) */ @@ -2608,7 +2649,7 @@ alter_table_cmd: n->def = (Node *) c; c->contype = CONSTR_FOREIGN; /* others not supported, yet */ c->conname = $3; - processCASbits($4, @4, "ALTER CONSTRAINT statement", + processCASbits($4, @4, "FOREIGN KEY", &c->deferrable, &c->initdeferred, NULL, NULL, yyscanner); @@ -2837,8 +2878,8 @@ alter_table_cmd: n->newowner = $3; $$ = (Node *) n; } - /* ALTER TABLE SET ACCESS METHOD */ - | SET ACCESS METHOD name + /* ALTER TABLE SET ACCESS METHOD { | DEFAULT } */ + | SET ACCESS METHOD set_access_method_name { AlterTableCmd *n = makeNode(AlterTableCmd); @@ -3049,6 +3090,16 @@ alter_identity_column_option: } ; +set_statistics_value: + SignedIconst { $$ = (Node *) makeInteger($1); } + | DEFAULT { $$ = NULL; } + ; + +set_access_method_name: + ColId { $$ = $1; } + | DEFAULT { $$ = NULL; } + ; + PartitionBoundSpec: /* a HASH partition */ FOR VALUES WITH '(' hash_partbound ')' @@ -3421,10 +3472,18 @@ copy_opt_item: { $$ = makeDefElem("force_not_null", (Node *) $4, @1); } + | FORCE NOT NULL_P '*' + { + $$ = makeDefElem("force_not_null", (Node *) makeNode(A_Star), @1); + } | FORCE NULL_P columnList { $$ = makeDefElem("force_null", (Node *) $3, @1); } + | FORCE NULL_P '*' + { + $$ = makeDefElem("force_null", (Node *) makeNode(A_Star), @1); + } | ENCODING Sconst { $$ = makeDefElem("encoding", (Node *) makeString($2), @1); @@ -3477,6 +3536,7 @@ copy_generic_opt_arg: opt_boolean_or_string { $$ = (Node *) makeString($1); } | NumericOnly { $$ = (Node *) $1; } | '*' { $$ = (Node *) makeNode(A_Star); } + | DEFAULT { $$ = (Node *) makeString("default"); } | '(' copy_generic_opt_arg_list ')' { $$ = (Node *) $2; } | /* EMPTY */ { $$ = NULL; } ; @@ -4191,6 +4251,60 @@ ConstraintElem: } ; +/* + * DomainConstraint is separate from TableConstraint because the syntax for + * NOT NULL constraints is different. For table constraints, we need to + * accept a column name, but for domain constraints, we don't. (We could + * accept something like NOT NULL VALUE, but that seems weird.) CREATE DOMAIN + * (which uses ColQualList) has for a long time accepted NOT NULL without a + * column name, so it makes sense that ALTER DOMAIN (which uses + * DomainConstraint) does as well. None of these syntaxes are per SQL + * standard; we are just living with the bits of inconsistency that have built + * up over time. + */ +DomainConstraint: + CONSTRAINT name DomainConstraintElem + { + Constraint *n = castNode(Constraint, $3); + + n->conname = $2; + n->location = @1; + $$ = (Node *) n; + } + | DomainConstraintElem { $$ = $1; } + ; + +DomainConstraintElem: + CHECK '(' a_expr ')' ConstraintAttributeSpec + { + Constraint *n = makeNode(Constraint); + + n->contype = CONSTR_CHECK; + n->location = @1; + n->raw_expr = $3; + n->cooked_expr = NULL; + processCASbits($5, @5, "CHECK", + NULL, NULL, &n->skip_validation, + &n->is_no_inherit, yyscanner); + n->initially_valid = !n->skip_validation; + $$ = (Node *) n; + } + | NOT NULL_P ConstraintAttributeSpec + { + Constraint *n = makeNode(Constraint); + + n->contype = CONSTR_NOTNULL; + n->location = @1; + n->keys = list_make1(makeString("value")); + /* no NOT VALID support yet */ + processCASbits($3, @3, "NOT NULL", + NULL, NULL, NULL, + &n->is_no_inherit, yyscanner); + n->initially_valid = true; + $$ = (Node *) n; + } + ; + opt_no_inherit: NO INHERIT { $$ = true; } | /* EMPTY */ { $$ = false; } ; @@ -4545,7 +4659,7 @@ stats_param: ColId *****************************************************************************/ AlterStatsStmt: - ALTER STATISTICS any_name SET STATISTICS SignedIconst + ALTER STATISTICS any_name SET STATISTICS set_statistics_value { AlterStatsStmt *n = makeNode(AlterStatsStmt); @@ -4554,7 +4668,7 @@ AlterStatsStmt: n->stxstattarget = $6; $$ = (Node *) n; } - | ALTER STATISTICS IF_P EXISTS any_name SET STATISTICS SignedIconst + | ALTER STATISTICS IF_P EXISTS any_name SET STATISTICS set_statistics_value { AlterStatsStmt *n = makeNode(AlterStatsStmt); @@ -4794,6 +4908,10 @@ SeqOptElem: AS SimpleTypename { $$ = makeDefElem("increment", (Node *) $3, @1); } + | LOGGED + { + $$ = makeDefElem("logged", NULL, @1); + } | MAXVALUE NumericOnly { $$ = makeDefElem("maxvalue", (Node *) $2, @1); @@ -4816,7 +4934,6 @@ SeqOptElem: AS SimpleTypename } | SEQUENCE NAME_P any_name { - /* not documented, only used by pg_dump */ $$ = makeDefElem("sequence_name", (Node *) $3, @1); } | START opt_with NumericOnly @@ -4831,6 +4948,10 @@ SeqOptElem: AS SimpleTypename { $$ = makeDefElem("restart", (Node *) $3, @1); } + | UNLOGGED + { + $$ = makeDefElem("unlogged", NULL, @1); + } ; opt_by: BY @@ -6389,6 +6510,33 @@ AlterEnumStmt: n->skipIfNewValExists = false; $$ = (Node *) n; } + | ALTER TYPE_P any_name DROP VALUE_P Sconst + { + /* + * The following problems must be solved before this can be + * implemented: + * + * - There must be no instance of the target value in + * any table. + * + * - The value must not appear in any catalog metadata, + * such as stored view expressions or column defaults. + * + * - The value must not appear in any non-leaf page of a + * btree (and similar issues with other index types). + * This is problematic because a value could persist + * there long after it's gone from user-visible data. + * + * - Concurrent sessions must not be able to insert the + * value while the preceding conditions are being checked. + * + * - Possibly more... + */ + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("dropping an enum value is not implemented"), + parser_errposition(@4))); + } ; opt_if_not_exists: IF_P NOT EXISTS { $$ = true; } @@ -10101,6 +10249,8 @@ operator_def_elem: ColLabel '=' NONE { $$ = makeDefElem($1, NULL, @1); } | ColLabel '=' operator_def_arg { $$ = makeDefElem($1, (Node *) $3, @1); } + | ColLabel + { $$ = makeDefElem($1, NULL, @1); } ; /* must be similar enough to def_arg to avoid reduce/reduce conflicts */ @@ -10843,6 +10993,7 @@ TransactionStmt: n->kind = TRANS_STMT_ROLLBACK; n->options = NIL; n->chain = $3; + n->location = -1; $$ = (Node *) n; } | START TRANSACTION transaction_mode_list_or_empty @@ -10851,6 +11002,7 @@ TransactionStmt: n->kind = TRANS_STMT_START; n->options = $3; + n->location = -1; $$ = (Node *) n; } | COMMIT opt_transaction opt_transaction_chain @@ -10860,6 +11012,7 @@ TransactionStmt: n->kind = TRANS_STMT_COMMIT; n->options = NIL; n->chain = $3; + n->location = -1; $$ = (Node *) n; } | ROLLBACK opt_transaction opt_transaction_chain @@ -10869,6 +11022,7 @@ TransactionStmt: n->kind = TRANS_STMT_ROLLBACK; n->options = NIL; n->chain = $3; + n->location = -1; $$ = (Node *) n; } | SAVEPOINT ColId @@ -10877,6 +11031,7 @@ TransactionStmt: n->kind = TRANS_STMT_SAVEPOINT; n->savepoint_name = $2; + n->location = @2; $$ = (Node *) n; } | RELEASE SAVEPOINT ColId @@ -10885,6 +11040,7 @@ TransactionStmt: n->kind = TRANS_STMT_RELEASE; n->savepoint_name = $3; + n->location = @3; $$ = (Node *) n; } | RELEASE ColId @@ -10893,6 +11049,7 @@ TransactionStmt: n->kind = TRANS_STMT_RELEASE; n->savepoint_name = $2; + n->location = @2; $$ = (Node *) n; } | ROLLBACK opt_transaction TO SAVEPOINT ColId @@ -10901,6 +11058,7 @@ TransactionStmt: n->kind = TRANS_STMT_ROLLBACK_TO; n->savepoint_name = $5; + n->location = @5; $$ = (Node *) n; } | ROLLBACK opt_transaction TO ColId @@ -10909,6 +11067,7 @@ TransactionStmt: n->kind = TRANS_STMT_ROLLBACK_TO; n->savepoint_name = $4; + n->location = @4; $$ = (Node *) n; } | PREPARE TRANSACTION Sconst @@ -10917,6 +11076,7 @@ TransactionStmt: n->kind = TRANS_STMT_PREPARE; n->gid = $3; + n->location = @3; $$ = (Node *) n; } | COMMIT PREPARED Sconst @@ -10925,6 +11085,7 @@ TransactionStmt: n->kind = TRANS_STMT_COMMIT_PREPARED; n->gid = $3; + n->location = @3; $$ = (Node *) n; } | ROLLBACK PREPARED Sconst @@ -10933,6 +11094,7 @@ TransactionStmt: n->kind = TRANS_STMT_ROLLBACK_PREPARED; n->gid = $3; + n->location = @3; $$ = (Node *) n; } ; @@ -10944,6 +11106,7 @@ TransactionStmtLegacy: n->kind = TRANS_STMT_BEGIN; n->options = $3; + n->location = -1; $$ = (Node *) n; } | END_P opt_transaction opt_transaction_chain @@ -10953,6 +11116,7 @@ TransactionStmtLegacy: n->kind = TRANS_STMT_COMMIT; n->options = NIL; n->chain = $3; + n->location = -1; $$ = (Node *) n; } ; @@ -11385,7 +11549,7 @@ AlterDomainStmt: $$ = (Node *) n; } /* ALTER DOMAIN ADD CONSTRAINT ... */ - | ALTER DOMAIN_P any_name ADD_P TableConstraint + | ALTER DOMAIN_P any_name ADD_P DomainConstraint { AlterDomainStmt *n = makeNode(AlterDomainStmt); @@ -11556,35 +11720,44 @@ CreateConversionStmt: /***************************************************************************** * * QUERY: - * CLUSTER [VERBOSE] [ USING ] - * CLUSTER [ (options) ] [ USING ] - * CLUSTER [VERBOSE] + * CLUSTER (options) [ [ USING ] ] + * CLUSTER [VERBOSE] [ [ USING ] ] * CLUSTER [VERBOSE] ON (for pre-8.3) * *****************************************************************************/ ClusterStmt: - CLUSTER opt_verbose qualified_name cluster_index_specification + CLUSTER '(' utility_option_list ')' qualified_name cluster_index_specification { ClusterStmt *n = makeNode(ClusterStmt); - n->relation = $3; - n->indexname = $4; - n->params = NIL; - if ($2) - n->params = lappend(n->params, makeDefElem("verbose", NULL, @2)); + n->relation = $5; + n->indexname = $6; + n->params = $3; $$ = (Node *) n; } - - | CLUSTER '(' utility_option_list ')' qualified_name cluster_index_specification + | CLUSTER '(' utility_option_list ')' { ClusterStmt *n = makeNode(ClusterStmt); - n->relation = $5; - n->indexname = $6; + n->relation = NULL; + n->indexname = NULL; n->params = $3; $$ = (Node *) n; } + /* unparenthesized VERBOSE kept for pre-14 compatibility */ + | CLUSTER opt_verbose qualified_name cluster_index_specification + { + ClusterStmt *n = makeNode(ClusterStmt); + + n->relation = $3; + n->indexname = $4; + n->params = NIL; + if ($2) + n->params = lappend(n->params, makeDefElem("verbose", NULL, @2)); + $$ = (Node *) n; + } + /* unparenthesized VERBOSE kept for pre-17 compatibility */ | CLUSTER opt_verbose { ClusterStmt *n = makeNode(ClusterStmt); @@ -11915,6 +12088,8 @@ DeallocateStmt: DEALLOCATE name DeallocateStmt *n = makeNode(DeallocateStmt); n->name = $2; + n->isall = false; + n->location = @2; $$ = (Node *) n; } | DEALLOCATE PREPARE name @@ -11922,6 +12097,8 @@ DeallocateStmt: DEALLOCATE name DeallocateStmt *n = makeNode(DeallocateStmt); n->name = $3; + n->isall = false; + n->location = @3; $$ = (Node *) n; } | DEALLOCATE ALL @@ -11929,6 +12106,8 @@ DeallocateStmt: DEALLOCATE name DeallocateStmt *n = makeNode(DeallocateStmt); n->name = NULL; + n->isall = true; + n->location = -1; $$ = (Node *) n; } | DEALLOCATE PREPARE ALL @@ -11936,6 +12115,8 @@ DeallocateStmt: DEALLOCATE name DeallocateStmt *n = makeNode(DeallocateStmt); n->name = NULL; + n->isall = true; + n->location = -1; $$ = (Node *) n; } ; @@ -12249,6 +12430,7 @@ MergeStmt: USING table_ref ON a_expr merge_when_list + returning_clause { MergeStmt *m = makeNode(MergeStmt); @@ -12257,6 +12439,7 @@ MergeStmt: m->sourceRelation = $6; m->joinCondition = $8; m->mergeWhenClauses = $9; + m->returningList = $10; $$ = (Node *) m; } @@ -12267,50 +12450,66 @@ merge_when_list: | merge_when_list merge_when_clause { $$ = lappend($1,$2); } ; +/* + * A WHEN clause may be WHEN MATCHED, WHEN NOT MATCHED BY SOURCE, or WHEN NOT + * MATCHED [BY TARGET]. The first two cases match target tuples, and support + * UPDATE/DELETE/DO NOTHING actions. The third case does not match target + * tuples, and only supports INSERT/DO NOTHING actions. + */ merge_when_clause: - WHEN MATCHED opt_merge_when_condition THEN merge_update + merge_when_tgt_matched opt_merge_when_condition THEN merge_update { - $5->matched = true; - $5->condition = $3; + $4->matchKind = $1; + $4->condition = $2; - $$ = (Node *) $5; + $$ = (Node *) $4; } - | WHEN MATCHED opt_merge_when_condition THEN merge_delete + | merge_when_tgt_matched opt_merge_when_condition THEN merge_delete { - $5->matched = true; - $5->condition = $3; + $4->matchKind = $1; + $4->condition = $2; - $$ = (Node *) $5; + $$ = (Node *) $4; } - | WHEN NOT MATCHED opt_merge_when_condition THEN merge_insert + | merge_when_tgt_not_matched opt_merge_when_condition THEN merge_insert { - $6->matched = false; - $6->condition = $4; + $4->matchKind = $1; + $4->condition = $2; - $$ = (Node *) $6; + $$ = (Node *) $4; } - | WHEN MATCHED opt_merge_when_condition THEN DO NOTHING + | merge_when_tgt_matched opt_merge_when_condition THEN DO NOTHING { MergeWhenClause *m = makeNode(MergeWhenClause); - m->matched = true; + m->matchKind = $1; m->commandType = CMD_NOTHING; - m->condition = $3; + m->condition = $2; $$ = (Node *) m; } - | WHEN NOT MATCHED opt_merge_when_condition THEN DO NOTHING + | merge_when_tgt_not_matched opt_merge_when_condition THEN DO NOTHING { MergeWhenClause *m = makeNode(MergeWhenClause); - m->matched = false; + m->matchKind = $1; m->commandType = CMD_NOTHING; - m->condition = $4; + m->condition = $2; $$ = (Node *) m; } ; +merge_when_tgt_matched: + WHEN MATCHED { $$ = MERGE_WHEN_MATCHED; } + | WHEN NOT MATCHED BY SOURCE { $$ = MERGE_WHEN_NOT_MATCHED_BY_SOURCE; } + ; + +merge_when_tgt_not_matched: + WHEN NOT MATCHED { $$ = MERGE_WHEN_NOT_MATCHED_BY_TARGET; } + | WHEN NOT MATCHED BY TARGET { $$ = MERGE_WHEN_NOT_MATCHED_BY_TARGET; } + ; + opt_merge_when_condition: AND a_expr { $$ = $2; } | { $$ = NULL; } @@ -13317,6 +13516,21 @@ table_ref: relation_expr opt_alias_clause $2->alias = $4; $$ = (Node *) $2; } + | json_table opt_alias_clause + { + JsonTable *jt = castNode(JsonTable, $1); + + jt->alias = $2; + $$ = (Node *) jt; + } + | LATERAL_P json_table opt_alias_clause + { + JsonTable *jt = castNode(JsonTable, $2); + + jt->alias = $3; + jt->lateral = true; + $$ = (Node *) jt; + } ; @@ -13884,6 +14098,8 @@ xmltable_column_option_el: { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(true), @1); } | NULL_P { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(false), @1); } + | PATH b_expr + { $$ = makeDefElem("path", $2, @1); } ; xml_namespace_list: @@ -13912,6 +14128,152 @@ xml_namespace_el: } ; +json_table: + JSON_TABLE '(' + json_value_expr ',' a_expr json_table_path_name_opt + json_passing_clause_opt + COLUMNS '(' json_table_column_definition_list ')' + json_on_error_clause_opt + ')' + { + JsonTable *n = makeNode(JsonTable); + char *pathstring; + + n->context_item = (JsonValueExpr *) $3; + if (!IsA($5, A_Const) || + castNode(A_Const, $5)->val.node.type != T_String) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("only string constants are supported in JSON_TABLE path specification"), + parser_errposition(@5)); + pathstring = castNode(A_Const, $5)->val.sval.sval; + n->pathspec = makeJsonTablePathSpec(pathstring, $6, @5, @6); + n->passing = $7; + n->columns = $10; + n->on_error = (JsonBehavior *) $12; + n->location = @1; + $$ = (Node *) n; + } + ; + +json_table_path_name_opt: + AS name { $$ = $2; } + | /* empty */ { $$ = NULL; } + ; + +json_table_column_definition_list: + json_table_column_definition + { $$ = list_make1($1); } + | json_table_column_definition_list ',' json_table_column_definition + { $$ = lappend($1, $3); } + ; + +json_table_column_definition: + ColId FOR ORDINALITY + { + JsonTableColumn *n = makeNode(JsonTableColumn); + + n->coltype = JTC_FOR_ORDINALITY; + n->name = $1; + n->location = @1; + $$ = (Node *) n; + } + | ColId Typename + json_table_column_path_clause_opt + json_wrapper_behavior + json_quotes_clause_opt + json_behavior_clause_opt + { + JsonTableColumn *n = makeNode(JsonTableColumn); + + n->coltype = JTC_REGULAR; + n->name = $1; + n->typeName = $2; + n->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1); + n->pathspec = (JsonTablePathSpec *) $3; + n->wrapper = $4; + n->quotes = $5; + n->on_empty = (JsonBehavior *) linitial($6); + n->on_error = (JsonBehavior *) lsecond($6); + n->location = @1; + $$ = (Node *) n; + } + | ColId Typename json_format_clause + json_table_column_path_clause_opt + json_wrapper_behavior + json_quotes_clause_opt + json_behavior_clause_opt + { + JsonTableColumn *n = makeNode(JsonTableColumn); + + n->coltype = JTC_FORMATTED; + n->name = $1; + n->typeName = $2; + n->format = (JsonFormat *) $3; + n->pathspec = (JsonTablePathSpec *) $4; + n->wrapper = $5; + n->quotes = $6; + n->on_empty = (JsonBehavior *) linitial($7); + n->on_error = (JsonBehavior *) lsecond($7); + n->location = @1; + $$ = (Node *) n; + } + | ColId Typename + EXISTS json_table_column_path_clause_opt + json_on_error_clause_opt + { + JsonTableColumn *n = makeNode(JsonTableColumn); + + n->coltype = JTC_EXISTS; + n->name = $1; + n->typeName = $2; + n->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1); + n->wrapper = JSW_NONE; + n->quotes = JS_QUOTES_UNSPEC; + n->pathspec = (JsonTablePathSpec *) $4; + n->on_empty = NULL; + n->on_error = (JsonBehavior *) $5; + n->location = @1; + $$ = (Node *) n; + } + | NESTED path_opt Sconst + COLUMNS '(' json_table_column_definition_list ')' + { + JsonTableColumn *n = makeNode(JsonTableColumn); + + n->coltype = JTC_NESTED; + n->pathspec = (JsonTablePathSpec *) + makeJsonTablePathSpec($3, NULL, @3, -1); + n->columns = $6; + n->location = @1; + $$ = (Node *) n; + } + | NESTED path_opt Sconst AS name + COLUMNS '(' json_table_column_definition_list ')' + { + JsonTableColumn *n = makeNode(JsonTableColumn); + + n->coltype = JTC_NESTED; + n->pathspec = (JsonTablePathSpec *) + makeJsonTablePathSpec($3, $5, @3, @5); + n->columns = $8; + n->location = @1; + $$ = (Node *) n; + } + ; + +path_opt: + PATH + | /* EMPTY */ + ; + +json_table_column_path_clause_opt: + PATH Sconst + { $$ = (Node *) makeJsonTablePathSpec($2, NULL, @2, -1); } + | /* EMPTY */ + { $$ = NULL; } + ; + /***************************************************************************** * * Type syntax @@ -13984,6 +14346,7 @@ SimpleTypename: $$->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1), makeIntConst($3, @3)); } + | JsonType { $$ = $1; } ; /* We have a separate ConstTypename to allow defaulting fixed-length @@ -14002,6 +14365,7 @@ ConstTypename: | ConstBit { $$ = $1; } | ConstCharacter { $$ = $1; } | ConstDatetime { $$ = $1; } + | JsonType { $$ = $1; } ; /* @@ -14370,6 +14734,13 @@ interval_second: } ; +JsonType: + JSON + { + $$ = SystemTypeName("json"); + $$->location = @1; + } + ; /***************************************************************************** * @@ -14418,6 +14789,13 @@ a_expr: c_expr { $$ = $1; } COERCE_SQL_SYNTAX, @2); } + | a_expr AT LOCAL %prec AT + { + $$ = (Node *) makeFuncCall(SystemFuncName("timezone"), + list_make1($1), + COERCE_SQL_SYNTAX, + -1); + } /* * These operators must be called out explicitly in order to make use * of bison's automatic operator-precedence handling. All other @@ -14850,12 +15228,11 @@ a_expr: c_expr { $$ = $1; } /* * Required by SQL/JSON, but there are conflicts | a_expr - FORMAT_LA JSON json_encoding_clause_opt + json_format_clause IS json_predicate_type_constraint json_key_uniqueness_constraint_opt %prec IS { - $3.location = @2; - $$ = makeJsonIsPredicate($1, $3, $5, $6, @1); + $$ = makeJsonIsPredicate($1, $2, $4, $5, @1); } */ | a_expr IS NOT @@ -14869,13 +15246,12 @@ a_expr: c_expr { $$ = $1; } /* * Required by SQL/JSON, but there are conflicts | a_expr - FORMAT_LA JSON json_encoding_clause_opt + json_format_clause IS NOT json_predicate_type_constraint json_key_uniqueness_constraint_opt %prec IS { - $3.location = @2; - $$ = makeNotExpr(makeJsonIsPredicate($1, $3, $6, $7, @1), @1); + $$ = makeNotExpr(makeJsonIsPredicate($1, $2, $5, $6, @1), @1); } */ | DEFAULT @@ -15246,7 +15622,7 @@ func_expr: func_application within_group_clause filter_clause over_clause ; /* - * As func_expr but does not accept WINDOW functions directly + * Like func_expr but does not accept WINDOW functions directly * (but they can still be contained in arguments for functions etc). * Use this when window expressions are not allowed, where needed to * disambiguate the grammar (e.g. in CREATE INDEX). @@ -15564,7 +15940,7 @@ func_expr_common_subexpr: | JSON_OBJECT '(' json_name_and_value_list json_object_constructor_null_clause_opt json_key_uniqueness_constraint_opt - json_output_clause_opt ')' + json_returning_clause_opt ')' { JsonObjectConstructor *n = makeNode(JsonObjectConstructor); @@ -15575,7 +15951,7 @@ func_expr_common_subexpr: n->location = @1; $$ = (Node *) n; } - | JSON_OBJECT '(' json_output_clause_opt ')' + | JSON_OBJECT '(' json_returning_clause_opt ')' { JsonObjectConstructor *n = makeNode(JsonObjectConstructor); @@ -15589,7 +15965,7 @@ func_expr_common_subexpr: | JSON_ARRAY '(' json_value_expr_list json_array_constructor_null_clause_opt - json_output_clause_opt + json_returning_clause_opt ')' { JsonArrayConstructor *n = makeNode(JsonArrayConstructor); @@ -15604,7 +15980,7 @@ func_expr_common_subexpr: select_no_parens json_format_clause_opt /* json_array_constructor_null_clause_opt */ - json_output_clause_opt + json_returning_clause_opt ')' { JsonArrayQueryConstructor *n = makeNode(JsonArrayQueryConstructor); @@ -15617,7 +15993,7 @@ func_expr_common_subexpr: $$ = (Node *) n; } | JSON_ARRAY '(' - json_output_clause_opt + json_returning_clause_opt ')' { JsonArrayConstructor *n = makeNode(JsonArrayConstructor); @@ -15628,7 +16004,100 @@ func_expr_common_subexpr: n->location = @1; $$ = (Node *) n; } - ; + | JSON '(' json_value_expr json_key_uniqueness_constraint_opt ')' + { + JsonParseExpr *n = makeNode(JsonParseExpr); + + n->expr = (JsonValueExpr *) $3; + n->unique_keys = $4; + n->output = NULL; + n->location = @1; + $$ = (Node *) n; + } + | JSON_SCALAR '(' a_expr ')' + { + JsonScalarExpr *n = makeNode(JsonScalarExpr); + + n->expr = (Expr *) $3; + n->output = NULL; + n->location = @1; + $$ = (Node *) n; + } + | JSON_SERIALIZE '(' json_value_expr json_returning_clause_opt ')' + { + JsonSerializeExpr *n = makeNode(JsonSerializeExpr); + + n->expr = (JsonValueExpr *) $3; + n->output = (JsonOutput *) $4; + n->location = @1; + $$ = (Node *) n; + } + | MERGE_ACTION '(' ')' + { + MergeSupportFunc *m = makeNode(MergeSupportFunc); + + m->msftype = TEXTOID; + m->location = @1; + $$ = (Node *) m; + } + | JSON_QUERY '(' + json_value_expr ',' a_expr json_passing_clause_opt + json_returning_clause_opt + json_wrapper_behavior + json_quotes_clause_opt + json_behavior_clause_opt + ')' + { + JsonFuncExpr *n = makeNode(JsonFuncExpr); + + n->op = JSON_QUERY_OP; + n->context_item = (JsonValueExpr *) $3; + n->pathspec = $5; + n->passing = $6; + n->output = (JsonOutput *) $7; + n->wrapper = $8; + n->quotes = $9; + n->on_empty = (JsonBehavior *) linitial($10); + n->on_error = (JsonBehavior *) lsecond($10); + n->location = @1; + $$ = (Node *) n; + } + | JSON_EXISTS '(' + json_value_expr ',' a_expr json_passing_clause_opt + json_on_error_clause_opt + ')' + { + JsonFuncExpr *n = makeNode(JsonFuncExpr); + + n->op = JSON_EXISTS_OP; + n->context_item = (JsonValueExpr *) $3; + n->pathspec = $5; + n->passing = $6; + n->output = NULL; + n->on_error = (JsonBehavior *) $7; + n->location = @1; + $$ = (Node *) n; + } + | JSON_VALUE '(' + json_value_expr ',' a_expr json_passing_clause_opt + json_returning_clause_opt + json_behavior_clause_opt + ')' + { + JsonFuncExpr *n = makeNode(JsonFuncExpr); + + n->op = JSON_VALUE_OP; + n->context_item = (JsonValueExpr *) $3; + n->pathspec = $5; + n->passing = $6; + n->output = (JsonOutput *) $7; + n->on_empty = (JsonBehavior *) linitial($8); + n->on_error = (JsonBehavior *) lsecond($8); + n->location = @1; + $$ = (Node *) n; + } + ; + /* * SQL/XML support @@ -16353,17 +16822,114 @@ opt_asymmetric: ASYMMETRIC ; /* SQL/JSON support */ +json_passing_clause_opt: + PASSING json_arguments { $$ = $2; } + | /*EMPTY*/ { $$ = NIL; } + ; + +json_arguments: + json_argument { $$ = list_make1($1); } + | json_arguments ',' json_argument { $$ = lappend($1, $3); } + ; + +json_argument: + json_value_expr AS ColLabel + { + JsonArgument *n = makeNode(JsonArgument); + + n->val = (JsonValueExpr *) $1; + n->name = $3; + $$ = (Node *) n; + } + ; + +/* ARRAY is a noise word */ +json_wrapper_behavior: + WITHOUT WRAPPER { $$ = JSW_NONE; } + | WITHOUT ARRAY WRAPPER { $$ = JSW_NONE; } + | WITH WRAPPER { $$ = JSW_UNCONDITIONAL; } + | WITH ARRAY WRAPPER { $$ = JSW_UNCONDITIONAL; } + | WITH CONDITIONAL ARRAY WRAPPER { $$ = JSW_CONDITIONAL; } + | WITH UNCONDITIONAL ARRAY WRAPPER { $$ = JSW_UNCONDITIONAL; } + | WITH CONDITIONAL WRAPPER { $$ = JSW_CONDITIONAL; } + | WITH UNCONDITIONAL WRAPPER { $$ = JSW_UNCONDITIONAL; } + | /* empty */ { $$ = JSW_UNSPEC; } + ; + +json_behavior: + DEFAULT a_expr + { $$ = (Node *) makeJsonBehavior(JSON_BEHAVIOR_DEFAULT, $2, @1); } + | json_behavior_type + { $$ = (Node *) makeJsonBehavior($1, NULL, @1); } + ; + +json_behavior_type: + ERROR_P { $$ = JSON_BEHAVIOR_ERROR; } + | NULL_P { $$ = JSON_BEHAVIOR_NULL; } + | TRUE_P { $$ = JSON_BEHAVIOR_TRUE; } + | FALSE_P { $$ = JSON_BEHAVIOR_FALSE; } + | UNKNOWN { $$ = JSON_BEHAVIOR_UNKNOWN; } + | EMPTY_P ARRAY { $$ = JSON_BEHAVIOR_EMPTY_ARRAY; } + | EMPTY_P OBJECT_P { $$ = JSON_BEHAVIOR_EMPTY_OBJECT; } + /* non-standard, for Oracle compatibility only */ + | EMPTY_P { $$ = JSON_BEHAVIOR_EMPTY_ARRAY; } + ; + +json_behavior_clause_opt: + json_behavior ON EMPTY_P + { $$ = list_make2($1, NULL); } + | json_behavior ON ERROR_P + { $$ = list_make2(NULL, $1); } + | json_behavior ON EMPTY_P json_behavior ON ERROR_P + { $$ = list_make2($1, $4); } + | /* EMPTY */ + { $$ = list_make2(NULL, NULL); } + ; + +json_on_error_clause_opt: + json_behavior ON ERROR_P + { $$ = $1; } + | /* EMPTY */ + { $$ = NULL; } + ; + json_value_expr: a_expr json_format_clause_opt { - $$ = (Node *) makeJsonValueExpr((Expr *) $1, castNode(JsonFormat, $2)); + /* formatted_expr will be set during parse-analysis. */ + $$ = (Node *) makeJsonValueExpr((Expr *) $1, NULL, + castNode(JsonFormat, $2)); } ; +json_format_clause: + FORMAT_LA JSON ENCODING name + { + int encoding; + + if (!pg_strcasecmp($4, "utf8")) + encoding = JS_ENC_UTF8; + else if (!pg_strcasecmp($4, "utf16")) + encoding = JS_ENC_UTF16; + else if (!pg_strcasecmp($4, "utf32")) + encoding = JS_ENC_UTF32; + else + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized JSON encoding: %s", $4)); + + $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, encoding, @1); + } + | FORMAT_LA JSON + { + $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, JS_ENC_DEFAULT, @1); + } + ; + json_format_clause_opt: - FORMAT_LA JSON json_encoding_clause_opt + json_format_clause { - $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, $3, @1); + $$ = $1; } | /* EMPTY */ { @@ -16371,12 +16937,15 @@ json_format_clause_opt: } ; -json_encoding_clause_opt: - ENCODING name { $$ = makeJsonEncoding($2); } - | /* EMPTY */ { $$ = JS_ENC_DEFAULT; } +json_quotes_clause_opt: + KEEP QUOTES ON SCALAR STRING_P { $$ = JS_QUOTES_KEEP; } + | KEEP QUOTES { $$ = JS_QUOTES_KEEP; } + | OMIT QUOTES ON SCALAR STRING_P { $$ = JS_QUOTES_OMIT; } + | OMIT QUOTES { $$ = JS_QUOTES_OMIT; } + | /* EMPTY */ { $$ = JS_QUOTES_UNSPEC; } ; -json_output_clause_opt: +json_returning_clause_opt: RETURNING Typename json_format_clause_opt { JsonOutput *n = makeNode(JsonOutput); @@ -16389,21 +16958,35 @@ json_output_clause_opt: | /* EMPTY */ { $$ = NULL; } ; +/* + * We must assign the only-JSON production a precedence less than IDENT in + * order to favor shifting over reduction when JSON is followed by VALUE_P, + * OBJECT_P, or SCALAR. (ARRAY doesn't need that treatment, because it's a + * fully reserved word.) Because json_predicate_type_constraint is always + * followed by json_key_uniqueness_constraint_opt, we also need the only-JSON + * production to have precedence less than WITH and WITHOUT. UNBOUNDED isn't + * really related to this syntax, but it's a convenient choice because it + * already has a precedence less than IDENT for other reasons. + */ json_predicate_type_constraint: - JSON { $$ = JS_TYPE_ANY; } + JSON %prec UNBOUNDED { $$ = JS_TYPE_ANY; } | JSON VALUE_P { $$ = JS_TYPE_ANY; } | JSON ARRAY { $$ = JS_TYPE_ARRAY; } | JSON OBJECT_P { $$ = JS_TYPE_OBJECT; } | JSON SCALAR { $$ = JS_TYPE_SCALAR; } ; -/* KEYS is a noise word here */ +/* + * KEYS is a noise word here. To avoid shift/reduce conflicts, assign the + * KEYS-less productions a precedence less than IDENT (i.e., less than KEYS). + * This prevents reducing them when the next token is KEYS. + */ json_key_uniqueness_constraint_opt: WITH UNIQUE KEYS { $$ = true; } - | WITH UNIQUE { $$ = true; } + | WITH UNIQUE %prec UNBOUNDED { $$ = true; } | WITHOUT UNIQUE KEYS { $$ = false; } - | WITHOUT UNIQUE { $$ = false; } - | /* EMPTY */ %prec KEYS { $$ = false; } + | WITHOUT UNIQUE %prec UNBOUNDED { $$ = false; } + | /* EMPTY */ %prec UNBOUNDED { $$ = false; } ; json_name_and_value_list: @@ -16449,7 +17032,7 @@ json_aggregate_func: json_name_and_value json_object_constructor_null_clause_opt json_key_uniqueness_constraint_opt - json_output_clause_opt + json_returning_clause_opt ')' { JsonObjectAgg *n = makeNode(JsonObjectAgg); @@ -16467,7 +17050,7 @@ json_aggregate_func: json_value_expr json_array_aggregate_order_by_clause_opt json_array_constructor_null_clause_opt - json_output_clause_opt + json_returning_clause_opt ')' { JsonArrayAgg *n = makeNode(JsonArrayAgg); @@ -16978,6 +17561,7 @@ unreserved_keyword: | COMMIT | COMMITTED | COMPRESSION + | CONDITIONAL | CONFIGURATION | CONFLICT | CONNECTION @@ -17014,10 +17598,12 @@ unreserved_keyword: | DOUBLE_P | DROP | EACH + | EMPTY_P | ENABLE_P | ENCODING | ENCRYPTED | ENUM_P + | ERROR_P | ESCAPE | EVENT | EXCLUDE @@ -17067,7 +17653,7 @@ unreserved_keyword: | INSTEAD | INVOKER | ISOLATION - | JSON + | KEEP | KEY | KEYS | LABEL @@ -17097,6 +17683,7 @@ unreserved_keyword: | MOVE | NAME_P | NAMES + | NESTED | NEW | NEXT | NFC @@ -17114,6 +17701,7 @@ unreserved_keyword: | OFF | OIDS | OLD + | OMIT | OPERATOR | OPTION | OPTIONS @@ -17130,6 +17718,8 @@ unreserved_keyword: | PARTITION | PASSING | PASSWORD + | PATH + | PLAN | PLANS | POLICY | PRECEDING @@ -17144,6 +17734,7 @@ unreserved_keyword: | PROGRAM | PUBLICATION | QUOTE + | QUOTES | RANGE | READ | REASSIGN @@ -17192,6 +17783,7 @@ unreserved_keyword: | SIMPLE | SKIP | SNAPSHOT + | SOURCE | SQL_P | STABLE | STANDALONE_P @@ -17203,6 +17795,7 @@ unreserved_keyword: | STORAGE | STORED | STRICT_P + | STRING_P | STRIP_P | SUBSCRIPTION | SUPPORT @@ -17210,6 +17803,7 @@ unreserved_keyword: | SYSTEM_P | TABLES | TABLESPACE + | TARGET | TEMP | TEMPLATE | TEMPORARY @@ -17225,6 +17819,7 @@ unreserved_keyword: | UESCAPE | UNBOUNDED | UNCOMMITTED + | UNCONDITIONAL | UNENCRYPTED | UNKNOWN | UNLISTEN @@ -17282,11 +17877,19 @@ col_name_keyword: | INT_P | INTEGER | INTERVAL + | JSON | JSON_ARRAY | JSON_ARRAYAGG + | JSON_EXISTS | JSON_OBJECT | JSON_OBJECTAGG + | JSON_QUERY + | JSON_SCALAR + | JSON_SERIALIZE + | JSON_TABLE + | JSON_VALUE | LEAST + | MERGE_ACTION | NATIONAL | NCHAR | NONE @@ -17518,6 +18121,7 @@ bare_label_keyword: | COMMITTED | COMPRESSION | CONCURRENTLY + | CONDITIONAL | CONFIGURATION | CONFLICT | CONNECTION @@ -17570,11 +18174,13 @@ bare_label_keyword: | DROP | EACH | ELSE + | EMPTY_P | ENABLE_P | ENCODING | ENCRYPTED | END_P | ENUM_P + | ERROR_P | ESCAPE | EVENT | EXCLUDE @@ -17644,8 +18250,15 @@ bare_label_keyword: | JSON | JSON_ARRAY | JSON_ARRAYAGG + | JSON_EXISTS | JSON_OBJECT | JSON_OBJECTAGG + | JSON_QUERY + | JSON_SCALAR + | JSON_SERIALIZE + | JSON_TABLE + | JSON_VALUE + | KEEP | KEY | KEYS | LABEL @@ -17674,6 +18287,7 @@ bare_label_keyword: | MATERIALIZED | MAXVALUE | MERGE + | MERGE_ACTION | METHOD | MINVALUE | MODE @@ -17683,6 +18297,7 @@ bare_label_keyword: | NATIONAL | NATURAL | NCHAR + | NESTED | NEW | NEXT | NFC @@ -17706,6 +18321,7 @@ bare_label_keyword: | OFF | OIDS | OLD + | OMIT | ONLY | OPERATOR | OPTION @@ -17726,7 +18342,9 @@ bare_label_keyword: | PARTITION | PASSING | PASSWORD + | PATH | PLACING + | PLAN | PLANS | POLICY | POSITION @@ -17743,6 +18361,7 @@ bare_label_keyword: | PROGRAM | PUBLICATION | QUOTE + | QUOTES | RANGE | READ | REAL @@ -17800,6 +18419,7 @@ bare_label_keyword: | SMALLINT | SNAPSHOT | SOME + | SOURCE | SQL_P | STABLE | STANDALONE_P @@ -17811,6 +18431,7 @@ bare_label_keyword: | STORAGE | STORED | STRICT_P + | STRING_P | STRIP_P | SUBSCRIPTION | SUBSTRING @@ -17823,6 +18444,7 @@ bare_label_keyword: | TABLES | TABLESAMPLE | TABLESPACE + | TARGET | TEMP | TEMPLATE | TEMPORARY @@ -17845,6 +18467,7 @@ bare_label_keyword: | UESCAPE | UNBOUNDED | UNCOMMITTED + | UNCONDITIONAL | UNENCRYPTED | UNIQUE | UNKNOWN @@ -17991,18 +18614,6 @@ makeTypeCast(Node *arg, TypeName *typename, int location) return (Node *) n; } -static Node * -makeStringConst(char *str, int location) -{ - A_Const *n = makeNode(A_Const); - - n->val.sval.type = T_String; - n->val.sval.sval = str; - n->location = location; - - return (Node *) n; -} - static Node * makeStringConstCast(char *str, int location, TypeName *typename) { @@ -18283,7 +18894,7 @@ insertSelectOptions(SelectStmt *stmt, parser_errposition(exprLocation(limitClause->limitCount)))); stmt->limitCount = limitClause->limitCount; } - if (limitClause && limitClause->limitOption != LIMIT_OPTION_DEFAULT) + if (limitClause) { if (stmt->limitOption) ereport(ERROR, diff --git a/src/backend/parser/gramparse.h b/src/backend/parser/gramparse.h index 1b9fef3e57743..d85017fb22af0 100644 --- a/src/backend/parser/gramparse.h +++ b/src/backend/parser/gramparse.h @@ -8,7 +8,7 @@ * Definitions that are needed outside the core parser should be in parser.h. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/parser/gramparse.h diff --git a/src/backend/parser/meson.build b/src/backend/parser/meson.build index 94517a7f7de4e..573d70b3d1b12 100644 --- a/src/backend/parser/meson.build +++ b/src/backend/parser/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'analyze.c', @@ -10,6 +10,7 @@ backend_sources += files( 'parse_enr.c', 'parse_expr.c', 'parse_func.c', + 'parse_jsontable.c', 'parse_merge.c', 'parse_node.c', 'parse_oper.c', diff --git a/src/backend/parser/parse_agg.c b/src/backend/parser/parse_agg.c index 85cd47b7aecbb..be88909da222d 100644 --- a/src/backend/parser/parse_agg.c +++ b/src/backend/parser/parse_agg.c @@ -3,7 +3,7 @@ * parse_agg.c * handle aggregates and window functions in parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,6 +18,7 @@ #include "catalog/pg_aggregate.h" #include "catalog/pg_constraint.h" #include "catalog/pg_type.h" +#include "common/int.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" @@ -111,18 +112,6 @@ transformAggregateCall(ParseState *pstate, Aggref *agg, int save_next_resno; ListCell *lc; - /* - * Before separating the args into direct and aggregated args, make a list - * of their data type OIDs for use later. - */ - foreach(lc, args) - { - Expr *arg = (Expr *) lfirst(lc); - - argtypes = lappend_oid(argtypes, exprType((Node *) arg)); - } - agg->aggargtypes = argtypes; - if (AGGKIND_IS_ORDERED_SET(agg->aggkind)) { /* @@ -234,6 +223,29 @@ transformAggregateCall(ParseState *pstate, Aggref *agg, agg->aggorder = torder; agg->aggdistinct = tdistinct; + /* + * Now build the aggargtypes list with the type OIDs of the direct and + * aggregated args, ignoring any resjunk entries that might have been + * added by ORDER BY/DISTINCT processing. We can't do this earlier + * because said processing can modify some args' data types, in particular + * by resolving previously-unresolved "unknown" literals. + */ + foreach(lc, agg->aggdirectargs) + { + Expr *arg = (Expr *) lfirst(lc); + + argtypes = lappend_oid(argtypes, exprType((Node *) arg)); + } + foreach(lc, tlist) + { + TargetEntry *tle = (TargetEntry *) lfirst(lc); + + if (tle->resjunk) + continue; /* ignore junk */ + argtypes = lappend_oid(argtypes, exprType((Node *) tle->expr)); + } + agg->aggargtypes = argtypes; + check_agglevels_and_constraints(pstate, (Node *) agg); } @@ -364,8 +376,6 @@ check_agglevels_and_constraints(ParseState *pstate, Node *expr) break; case EXPR_KIND_FROM_SUBSELECT: - /* Should only be possible in a LATERAL subquery */ - Assert(pstate->p_lateral_active); /* * Aggregate/grouping scope rules make it worth being explicit @@ -456,6 +466,7 @@ check_agglevels_and_constraints(ParseState *pstate, Node *expr) errkind = true; break; case EXPR_KIND_RETURNING: + case EXPR_KIND_MERGE_RETURNING: errkind = true; break; case EXPR_KIND_VALUES: @@ -903,6 +914,7 @@ transformWindowFuncCall(ParseState *pstate, WindowFunc *wfunc, errkind = true; break; case EXPR_KIND_RETURNING: + case EXPR_KIND_MERGE_RETURNING: errkind = true; break; case EXPR_KIND_VALUES: @@ -1749,7 +1761,7 @@ cmp_list_len_asc(const ListCell *a, const ListCell *b) int la = list_length((const List *) lfirst(a)); int lb = list_length((const List *) lfirst(b)); - return (la > lb) ? 1 : (la == lb) ? 0 : -1; + return pg_cmp_s32(la, lb); } /* list_sort comparator to sort sub-lists by length and contents */ @@ -1949,7 +1961,7 @@ resolve_aggregate_transtype(Oid aggfuncid, /* * agg_args_support_sendreceive - * Returns true if all non-byval of aggref's arg types have send and + * Returns true if all non-byval types of aggref's args have send and * receive functions. */ bool @@ -1964,6 +1976,15 @@ agg_args_support_sendreceive(Aggref *aggref) TargetEntry *tle = (TargetEntry *) lfirst(lc); Oid type = exprType((Node *) tle->expr); + /* + * RECORD is a special case: it has typsend/typreceive functions, but + * record_recv only works if passed the correct typmod to identify the + * specific anonymous record type. array_agg_deserialize cannot do + * that, so we have to disclaim support for the case. + */ + if (type == RECORDOID) + return false; + typeTuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type)); if (!HeapTupleIsValid(typeTuple)) elog(ERROR, "cache lookup failed for type %u", type); diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index f61f794755269..8118036495b2b 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -3,7 +3,7 @@ * parse_clause.c * handle clauses in parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -20,10 +20,8 @@ #include "access/table.h" #include "access/tsmapi.h" #include "catalog/catalog.h" -#include "catalog/heap.h" #include "catalog/pg_am.h" #include "catalog/pg_amproc.h" -#include "catalog/pg_collation.h" #include "catalog/pg_constraint.h" #include "catalog/pg_type.h" #include "commands/defrem.h" @@ -697,7 +695,11 @@ transformRangeTableFunc(ParseState *pstate, RangeTableFunc *rtf) char **names; int colno; - /* Currently only XMLTABLE is supported */ + /* + * Currently we only support XMLTABLE here. See transformJsonTable() for + * JSON_TABLE support. + */ + tf->functype = TFT_XMLTABLE; constructName = "XMLTABLE"; docType = XMLOID; @@ -1104,13 +1106,17 @@ transformFromClauseItem(ParseState *pstate, Node *n, rtr->rtindex = nsitem->p_rtindex; return (Node *) rtr; } - else if (IsA(n, RangeTableFunc)) + else if (IsA(n, RangeTableFunc) || IsA(n, JsonTable)) { /* table function is like a plain relation */ RangeTblRef *rtr; ParseNamespaceItem *nsitem; - nsitem = transformRangeTableFunc(pstate, (RangeTableFunc *) n); + if (IsA(n, JsonTable)) + nsitem = transformJsonTable(pstate, (JsonTable *) n); + else + nsitem = transformRangeTableFunc(pstate, (RangeTableFunc *) n); + *top_nsitem = nsitem; *namespace = list_make1(nsitem); rtr = makeNode(RangeTblRef); @@ -1573,6 +1579,7 @@ transformFromClauseItem(ParseState *pstate, Node *n, jnsitem->p_names = j->join_using_alias; jnsitem->p_rte = nsitem->p_rte; jnsitem->p_rtindex = nsitem->p_rtindex; + jnsitem->p_perminfo = NULL; /* no need to copy the first N columns, just use res_nscolumns */ jnsitem->p_nscolumns = res_nscolumns; /* set default visibility flags; might get changed later */ @@ -2949,7 +2956,6 @@ transformWindowDefinitions(ParseState *pstate, rangeopfamily, rangeopcintype, &wc->endInRangeFunc, windef->endOffset); - wc->runCondition = NIL; wc->winref = winref; result = lappend(result, wc); diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index 52787b67943af..2051f9f11a673 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -3,7 +3,7 @@ * parse_coerce.c * handle type coercions/conversions for parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -1263,6 +1263,43 @@ coerce_to_specific_type(ParseState *pstate, Node *node, constructName); } +/* + * coerce_null_to_domain() + * Build a NULL constant, then wrap it in CoerceToDomain + * if the desired type is a domain type. This allows any + * NOT NULL domain constraint to be enforced at runtime. + */ +Node * +coerce_null_to_domain(Oid typid, int32 typmod, Oid collation, + int typlen, bool typbyval) +{ + Node *result; + Oid baseTypeId; + int32 baseTypeMod = typmod; + + /* + * The constant must appear to have the domain's base type/typmod, else + * coerce_to_domain() will apply a length coercion which is useless. + */ + baseTypeId = getBaseTypeAndTypmod(typid, &baseTypeMod); + result = (Node *) makeConst(baseTypeId, + baseTypeMod, + collation, + typlen, + (Datum) 0, + true, /* isnull */ + typbyval); + if (typid != baseTypeId) + result = coerce_to_domain(result, + baseTypeId, baseTypeMod, + typid, + COERCION_IMPLICIT, + COERCE_IMPLICIT_CAST, + -1, + false); + return result; +} + /* * parser_coercion_errposition - report coercion error location, if possible * diff --git a/src/backend/parser/parse_collate.c b/src/backend/parser/parse_collate.c index 9f6afc351cedc..44529bb49e64b 100644 --- a/src/backend/parser/parse_collate.c +++ b/src/backend/parser/parse_collate.c @@ -29,7 +29,7 @@ * at runtime. If we knew exactly which functions require collation * information, we could throw those errors at parse time instead. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -58,7 +58,7 @@ typedef enum COLLATE_NONE, /* expression is of a noncollatable datatype */ COLLATE_IMPLICIT, /* collation was derived implicitly */ COLLATE_CONFLICT, /* we had a conflict of implicit collations */ - COLLATE_EXPLICIT /* collation was derived explicitly */ + COLLATE_EXPLICIT, /* collation was derived explicitly */ } CollateStrength; typedef struct diff --git a/src/backend/parser/parse_cte.c b/src/backend/parser/parse_cte.c index c5b1a49725c56..6ad9259823dd0 100644 --- a/src/backend/parser/parse_cte.c +++ b/src/backend/parser/parse_cte.c @@ -3,7 +3,7 @@ * parse_cte.c * handle CTEs (common table expressions) in parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -35,7 +35,7 @@ typedef enum RECURSION_SUBLINK, /* inside a sublink */ RECURSION_OUTERJOIN, /* inside nullable side of an outer join */ RECURSION_INTERSECT, /* underneath INTERSECT (ALL) */ - RECURSION_EXCEPT /* underneath EXCEPT (ALL) */ + RECURSION_EXCEPT, /* underneath EXCEPT (ALL) */ } RecursionContext; /* Associated error messages --- each must have one %s for CTE name */ @@ -88,6 +88,7 @@ static void analyzeCTE(ParseState *pstate, CommonTableExpr *cte); /* Dependency processing functions */ static void makeDependencyGraph(CteState *cstate); static bool makeDependencyGraphWalker(Node *node, CteState *cstate); +static void WalkInnerWith(Node *stmt, WithClause *withClause, CteState *cstate); static void TopologicalSort(ParseState *pstate, CteItem *items, int numitems); /* Recursion validity checker functions */ @@ -126,13 +127,6 @@ transformWithClause(ParseState *pstate, WithClause *withClause) CommonTableExpr *cte = (CommonTableExpr *) lfirst(lc); ListCell *rest; - /* MERGE is allowed by parser, but unimplemented. Reject for now */ - if (IsA(cte->ctequery, MergeStmt)) - ereport(ERROR, - errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("MERGE not supported in WITH query"), - parser_errposition(pstate, cte->location)); - for_each_cell(rest, withClause->ctes, lnext(withClause->ctes, lc)) { CommonTableExpr *cte2 = (CommonTableExpr *) lfirst(rest); @@ -153,7 +147,8 @@ transformWithClause(ParseState *pstate, WithClause *withClause) /* must be a data-modifying statement */ Assert(IsA(cte->ctequery, InsertStmt) || IsA(cte->ctequery, UpdateStmt) || - IsA(cte->ctequery, DeleteStmt)); + IsA(cte->ctequery, DeleteStmt) || + IsA(cte->ctequery, MergeStmt)); pstate->p_hasModifyingCTE = true; } @@ -731,58 +726,69 @@ makeDependencyGraphWalker(Node *node, CteState *cstate) if (IsA(node, SelectStmt)) { SelectStmt *stmt = (SelectStmt *) node; - ListCell *lc; if (stmt->withClause) { - if (stmt->withClause->recursive) - { - /* - * In the RECURSIVE case, all query names of the WITH are - * visible to all WITH items as well as the main query. So - * push them all on, process, pop them all off. - */ - cstate->innerwiths = lcons(stmt->withClause->ctes, - cstate->innerwiths); - foreach(lc, stmt->withClause->ctes) - { - CommonTableExpr *cte = (CommonTableExpr *) lfirst(lc); + /* Examine the WITH clause and the SelectStmt */ + WalkInnerWith(node, stmt->withClause, cstate); + /* We're done examining the SelectStmt */ + return false; + } + /* if no WITH clause, just fall through for normal processing */ + } + else if (IsA(node, InsertStmt)) + { + InsertStmt *stmt = (InsertStmt *) node; - (void) makeDependencyGraphWalker(cte->ctequery, cstate); - } - (void) raw_expression_tree_walker(node, - makeDependencyGraphWalker, - (void *) cstate); - cstate->innerwiths = list_delete_first(cstate->innerwiths); - } - else - { - /* - * In the non-RECURSIVE case, query names are visible to the - * WITH items after them and to the main query. - */ - cstate->innerwiths = lcons(NIL, cstate->innerwiths); - foreach(lc, stmt->withClause->ctes) - { - CommonTableExpr *cte = (CommonTableExpr *) lfirst(lc); - ListCell *cell1; + if (stmt->withClause) + { + /* Examine the WITH clause and the InsertStmt */ + WalkInnerWith(node, stmt->withClause, cstate); + /* We're done examining the InsertStmt */ + return false; + } + /* if no WITH clause, just fall through for normal processing */ + } + else if (IsA(node, DeleteStmt)) + { + DeleteStmt *stmt = (DeleteStmt *) node; - (void) makeDependencyGraphWalker(cte->ctequery, cstate); - /* note that recursion could mutate innerwiths list */ - cell1 = list_head(cstate->innerwiths); - lfirst(cell1) = lappend((List *) lfirst(cell1), cte); - } - (void) raw_expression_tree_walker(node, - makeDependencyGraphWalker, - (void *) cstate); - cstate->innerwiths = list_delete_first(cstate->innerwiths); - } - /* We're done examining the SelectStmt */ + if (stmt->withClause) + { + /* Examine the WITH clause and the DeleteStmt */ + WalkInnerWith(node, stmt->withClause, cstate); + /* We're done examining the DeleteStmt */ return false; } /* if no WITH clause, just fall through for normal processing */ } - if (IsA(node, WithClause)) + else if (IsA(node, UpdateStmt)) + { + UpdateStmt *stmt = (UpdateStmt *) node; + + if (stmt->withClause) + { + /* Examine the WITH clause and the UpdateStmt */ + WalkInnerWith(node, stmt->withClause, cstate); + /* We're done examining the UpdateStmt */ + return false; + } + /* if no WITH clause, just fall through for normal processing */ + } + else if (IsA(node, MergeStmt)) + { + MergeStmt *stmt = (MergeStmt *) node; + + if (stmt->withClause) + { + /* Examine the WITH clause and the MergeStmt */ + WalkInnerWith(node, stmt->withClause, cstate); + /* We're done examining the MergeStmt */ + return false; + } + /* if no WITH clause, just fall through for normal processing */ + } + else if (IsA(node, WithClause)) { /* * Prevent raw_expression_tree_walker from recursing directly into a @@ -796,6 +802,60 @@ makeDependencyGraphWalker(Node *node, CteState *cstate) (void *) cstate); } +/* + * makeDependencyGraphWalker's recursion into a statement having a WITH clause. + * + * This subroutine is concerned with updating the innerwiths list correctly + * based on the visibility rules for CTE names. + */ +static void +WalkInnerWith(Node *stmt, WithClause *withClause, CteState *cstate) +{ + ListCell *lc; + + if (withClause->recursive) + { + /* + * In the RECURSIVE case, all query names of the WITH are visible to + * all WITH items as well as the main query. So push them all on, + * process, pop them all off. + */ + cstate->innerwiths = lcons(withClause->ctes, cstate->innerwiths); + foreach(lc, withClause->ctes) + { + CommonTableExpr *cte = (CommonTableExpr *) lfirst(lc); + + (void) makeDependencyGraphWalker(cte->ctequery, cstate); + } + (void) raw_expression_tree_walker(stmt, + makeDependencyGraphWalker, + (void *) cstate); + cstate->innerwiths = list_delete_first(cstate->innerwiths); + } + else + { + /* + * In the non-RECURSIVE case, query names are visible to the WITH + * items after them and to the main query. + */ + cstate->innerwiths = lcons(NIL, cstate->innerwiths); + foreach(lc, withClause->ctes) + { + CommonTableExpr *cte = (CommonTableExpr *) lfirst(lc); + ListCell *cell1; + + (void) makeDependencyGraphWalker(cte->ctequery, cstate); + /* note that recursion could mutate innerwiths list */ + cell1 = list_head(cstate->innerwiths); + lfirst(cell1) = lappend((List *) lfirst(cell1), cte); + } + (void) raw_expression_tree_walker(stmt, + makeDependencyGraphWalker, + (void *) cstate); + cstate->innerwiths = list_delete_first(cstate->innerwiths); + } +} + /* * Sort by dependencies, using a standard topological sort operation */ @@ -883,25 +943,14 @@ checkWellFormedRecursion(CteState *cstate) cte->ctename), parser_errposition(cstate->pstate, cte->location))); - /* The left-hand operand mustn't contain self-reference at all */ - cstate->curitem = i; - cstate->innerwiths = NIL; - cstate->selfrefcount = 0; - cstate->context = RECURSION_NONRECURSIVETERM; - checkWellFormedRecursionWalker((Node *) stmt->larg, cstate); - Assert(cstate->innerwiths == NIL); - - /* Right-hand operand should contain one reference in a valid place */ - cstate->curitem = i; - cstate->innerwiths = NIL; - cstate->selfrefcount = 0; - cstate->context = RECURSION_OK; - checkWellFormedRecursionWalker((Node *) stmt->rarg, cstate); - Assert(cstate->innerwiths == NIL); - if (cstate->selfrefcount != 1) /* shouldn't happen */ - elog(ERROR, "missing recursive reference"); - - /* WITH mustn't contain self-reference, either */ + /* + * Really, we should insist that there not be a top-level WITH, since + * syntactically that would enclose the UNION. However, we've not + * done so in the past and it's probably too late to change. Settle + * for insisting that WITH not contain a self-reference. Test this + * before examining the UNION arms, to avoid issuing confusing errors + * in such cases. + */ if (stmt->withClause) { cstate->curitem = i; @@ -918,7 +967,9 @@ checkWellFormedRecursion(CteState *cstate) * don't make sense because it's impossible to figure out what they * mean when we have only part of the recursive query's results. (If * we did allow them, we'd have to check for recursive references - * inside these subtrees.) + * inside these subtrees. As for WITH, we have to do this before + * examining the UNION arms, to avoid issuing confusing errors if + * there is a recursive reference here.) */ if (stmt->sortClause) ereport(ERROR, @@ -944,6 +995,28 @@ checkWellFormedRecursion(CteState *cstate) errmsg("FOR UPDATE/SHARE in a recursive query is not implemented"), parser_errposition(cstate->pstate, exprLocation((Node *) stmt->lockingClause)))); + + /* + * Now we can get on with checking the UNION operands themselves. + * + * The left-hand operand mustn't contain a self-reference at all. + */ + cstate->curitem = i; + cstate->innerwiths = NIL; + cstate->selfrefcount = 0; + cstate->context = RECURSION_NONRECURSIVETERM; + checkWellFormedRecursionWalker((Node *) stmt->larg, cstate); + Assert(cstate->innerwiths == NIL); + + /* Right-hand operand should contain one reference in a valid place */ + cstate->curitem = i; + cstate->innerwiths = NIL; + cstate->selfrefcount = 0; + cstate->context = RECURSION_OK; + checkWellFormedRecursionWalker((Node *) stmt->rarg, cstate); + Assert(cstate->innerwiths == NIL); + if (cstate->selfrefcount != 1) /* shouldn't happen */ + elog(ERROR, "missing recursive reference"); } } diff --git a/src/backend/parser/parse_enr.c b/src/backend/parser/parse_enr.c index 608bf9c646fde..420d37cb868ae 100644 --- a/src/backend/parser/parse_enr.c +++ b/src/backend/parser/parse_enr.c @@ -3,7 +3,7 @@ * parse_enr.c * parser support routines dealing with ephemeral named relations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 346fd272b6d17..8423542021f30 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -3,7 +3,7 @@ * parse_expr.c * handle expressions in parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -37,6 +37,7 @@ #include "utils/builtins.h" #include "utils/date.h" #include "utils/fmgroids.h" +#include "utils/jsonb.h" #include "utils/lsyscache.h" #include "utils/timestamp.h" #include "utils/xml.h" @@ -54,6 +55,7 @@ static Node *transformAExprDistinct(ParseState *pstate, A_Expr *a); static Node *transformAExprNullIf(ParseState *pstate, A_Expr *a); static Node *transformAExprIn(ParseState *pstate, A_Expr *a); static Node *transformAExprBetween(ParseState *pstate, A_Expr *a); +static Node *transformMergeSupportFunc(ParseState *pstate, MergeSupportFunc *f); static Node *transformBoolExpr(ParseState *pstate, BoolExpr *a); static Node *transformFuncCall(ParseState *pstate, FuncCall *fn); static Node *transformMultiAssignRef(ParseState *pstate, MultiAssignRef *maref); @@ -86,6 +88,18 @@ static Node *transformJsonArrayQueryConstructor(ParseState *pstate, static Node *transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg); static Node *transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg); static Node *transformJsonIsPredicate(ParseState *pstate, JsonIsPredicate *pred); +static Node *transformJsonParseExpr(ParseState *pstate, JsonParseExpr *jsexpr); +static Node *transformJsonScalarExpr(ParseState *pstate, JsonScalarExpr *jsexpr); +static Node *transformJsonSerializeExpr(ParseState *pstate, + JsonSerializeExpr *expr); +static Node *transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func); +static void transformJsonPassingArgs(ParseState *pstate, const char *constructName, + JsonFormatType format, List *args, + List **passing_values, List **passing_names); +static JsonBehavior *transformJsonBehavior(ParseState *pstate, JsonBehavior *behavior, + JsonBehaviorType default_behavior, + JsonReturning *returning); +static Node *GetJsonBehaviorConst(JsonBehaviorType btype, int location); static Node *make_row_comparison_op(ParseState *pstate, List *opname, List *largs, List *rargs, int location); static Node *make_row_distinct_op(ParseState *pstate, List *opname, @@ -223,6 +237,11 @@ transformExprRecurse(ParseState *pstate, Node *expr) result = transformGroupingFunc(pstate, (GroupingFunc *) expr); break; + case T_MergeSupportFunc: + result = transformMergeSupportFunc(pstate, + (MergeSupportFunc *) expr); + break; + case T_NamedArgExpr: { NamedArgExpr *na = (NamedArgExpr *) expr; @@ -337,6 +356,22 @@ transformExprRecurse(ParseState *pstate, Node *expr) result = transformJsonIsPredicate(pstate, (JsonIsPredicate *) expr); break; + case T_JsonParseExpr: + result = transformJsonParseExpr(pstate, (JsonParseExpr *) expr); + break; + + case T_JsonScalarExpr: + result = transformJsonScalarExpr(pstate, (JsonScalarExpr *) expr); + break; + + case T_JsonSerializeExpr: + result = transformJsonSerializeExpr(pstate, (JsonSerializeExpr *) expr); + break; + + case T_JsonFuncExpr: + result = transformJsonFuncExpr(pstate, (JsonFuncExpr *) expr); + break; + default: /* should not reach here */ elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr)); @@ -525,6 +560,7 @@ transformColumnRef(ParseState *pstate, ColumnRef *cref) case EXPR_KIND_LIMIT: case EXPR_KIND_OFFSET: case EXPR_KIND_RETURNING: + case EXPR_KIND_MERGE_RETURNING: case EXPR_KIND_VALUES: case EXPR_KIND_VALUES_SINGLE: case EXPR_KIND_CHECK_CONSTRAINT: @@ -1063,7 +1099,8 @@ transformAExprNullIf(ParseState *pstate, A_Expr *a) if (result->opresulttype != BOOLOID) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("NULLIF requires = operator to yield boolean"), + /* translator: %s is name of a SQL construct, eg NULLIF */ + errmsg("%s requires = operator to yield boolean", "NULLIF"), parser_errposition(pstate, a->location))); if (result->opretset) ereport(ERROR, @@ -1337,6 +1374,31 @@ transformAExprBetween(ParseState *pstate, A_Expr *a) return transformExprRecurse(pstate, result); } +static Node * +transformMergeSupportFunc(ParseState *pstate, MergeSupportFunc *f) +{ + /* + * All we need to do is check that we're in the RETURNING list of a MERGE + * command. If so, we just return the node as-is. + */ + if (pstate->p_expr_kind != EXPR_KIND_MERGE_RETURNING) + { + ParseState *parent_pstate = pstate->parentParseState; + + while (parent_pstate && + parent_pstate->p_expr_kind != EXPR_KIND_MERGE_RETURNING) + parent_pstate = parent_pstate->parentParseState; + + if (!parent_pstate) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("MERGE_ACTION() can only be used in the RETURNING list of a MERGE command"), + parser_errposition(pstate, f->location)); + } + + return (Node *) f; +} + static Node * transformBoolExpr(ParseState *pstate, BoolExpr *a) { @@ -1751,6 +1813,7 @@ transformSubLink(ParseState *pstate, SubLink *sublink) case EXPR_KIND_LIMIT: case EXPR_KIND_OFFSET: case EXPR_KIND_RETURNING: + case EXPR_KIND_MERGE_RETURNING: case EXPR_KIND_VALUES: case EXPR_KIND_VALUES_SINGLE: case EXPR_KIND_CYCLE_MARK: @@ -1992,10 +2055,18 @@ transformArrayExpr(ParseState *pstate, A_ArrayExpr *a, /* * Check for sub-array expressions, if we haven't already found - * one. + * one. Note we don't accept domain-over-array as a sub-array, + * nor int2vector nor oidvector; those have constraints that don't + * map well to being treated as a sub-array. */ - if (!newa->multidims && type_is_array(exprType(newe))) - newa->multidims = true; + if (!newa->multidims) + { + Oid newetype = exprType(newe); + + if (newetype != INT2VECTOROID && newetype != OIDVECTOROID && + type_is_array(newetype)) + newa->multidims = true; + } } newelems = lappend(newelems, newe); @@ -2998,7 +3069,9 @@ make_distinct_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree, if (((OpExpr *) result)->opresulttype != BOOLOID) ereport(ERROR, (errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg("IS DISTINCT FROM requires = operator to yield boolean"), + /* translator: %s is name of a SQL construct, eg NULLIF */ + errmsg("%s requires = operator to yield boolean", + "IS DISTINCT FROM"), parser_errposition(pstate, location))); if (((OpExpr *) result)->opretset) ereport(ERROR, @@ -3099,6 +3172,7 @@ ParseExprKindName(ParseExprKind exprKind) case EXPR_KIND_OFFSET: return "OFFSET"; case EXPR_KIND_RETURNING: + case EXPR_KIND_MERGE_RETURNING: return "RETURNING"; case EXPR_KIND_VALUES: case EXPR_KIND_VALUES_SINGLE: @@ -3202,28 +3276,18 @@ makeJsonByteaToTextConversion(Node *expr, JsonFormat *format, int location) return (Node *) fexpr; } -/* - * Make a CaseTestExpr node. - */ -static Node * -makeCaseTestExpr(Node *expr) -{ - CaseTestExpr *placeholder = makeNode(CaseTestExpr); - - placeholder->typeId = exprType(expr); - placeholder->typeMod = exprTypmod(expr); - placeholder->collation = exprCollation(expr); - - return (Node *) placeholder; -} - /* * Transform JSON value expression using specified input JSON format or - * default format otherwise. + * default format otherwise, coercing to the targettype if needed. + * + * Returned expression is either ve->raw_expr coerced to text (if needed) or + * a JsonValueExpr with formatted_expr set to the coerced copy of raw_expr + * if the specified format and the targettype requires it. */ static Node * -transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, - JsonFormatType default_format) +transformJsonValueExpr(ParseState *pstate, const char *constructName, + JsonValueExpr *ve, JsonFormatType default_format, + Oid targettype, bool isarg) { Node *expr = transformExprRecurse(pstate, (Node *) ve->raw_expr); Node *rawexpr; @@ -3233,12 +3297,8 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, char typcategory; bool typispreferred; - /* - * Using JSON_VALUE here is slightly bogus: perhaps we need to be passed a - * JsonConstructorType so that we can use one of JSON_OBJECTAGG, etc. - */ if (exprType(expr) == UNKNOWNOID) - expr = coerce_to_specific_type(pstate, expr, TEXTOID, "JSON_VALUE"); + expr = coerce_to_specific_type(pstate, expr, TEXTOID, constructName); rawexpr = expr; exprtype = exprType(expr); @@ -3255,34 +3315,68 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, parser_errposition(pstate, ve->format->location)); if (exprtype == JSONOID || exprtype == JSONBOID) - { format = JS_FORMAT_DEFAULT; /* do not format json[b] types */ - ereport(WARNING, - errmsg("FORMAT JSON has no effect for json and jsonb types"), - parser_errposition(pstate, ve->format->location)); - } else format = ve->format->format_type; } + else if (isarg) + { + /* + * Special treatment for PASSING arguments. + * + * Pass types supported by GetJsonPathVar() / JsonItemFromDatum() + * directly without converting to json[b]. + */ + switch (exprtype) + { + case BOOLOID: + case NUMERICOID: + case INT2OID: + case INT4OID: + case INT8OID: + case FLOAT4OID: + case FLOAT8OID: + case TEXTOID: + case VARCHAROID: + case DATEOID: + case TIMEOID: + case TIMETZOID: + case TIMESTAMPOID: + case TIMESTAMPTZOID: + return expr; + + default: + if (typcategory == TYPCATEGORY_STRING) + return expr; + /* else convert argument to json[b] type */ + break; + } + + format = default_format; + } else if (exprtype == JSONOID || exprtype == JSONBOID) format = JS_FORMAT_DEFAULT; /* do not format json[b] types */ else format = default_format; - if (format != JS_FORMAT_DEFAULT) + if (format != JS_FORMAT_DEFAULT || + (OidIsValid(targettype) && exprtype != targettype)) { - Oid targettype = format == JS_FORMAT_JSONB ? JSONBOID : JSONOID; - Node *orig = makeCaseTestExpr(expr); Node *coerced; + bool only_allow_cast = OidIsValid(targettype); - expr = orig; - - if (exprtype != BYTEAOID && typcategory != TYPCATEGORY_STRING) + /* + * PASSING args are handled appropriately by GetJsonPathVar() / + * JsonItemFromDatum(). + */ + if (!isarg && + !only_allow_cast && + exprtype != BYTEAOID && typcategory != TYPCATEGORY_STRING) ereport(ERROR, errcode(ERRCODE_DATATYPE_MISMATCH), - errmsg(ve->format->format_type == JS_FORMAT_DEFAULT ? - "cannot use non-string types with implicit FORMAT JSON clause" : - "cannot use non-string types with explicit FORMAT JSON clause"), + ve->format->format_type == JS_FORMAT_DEFAULT ? + errmsg("cannot use non-string types with implicit FORMAT JSON clause") : + errmsg("cannot use non-string types with explicit FORMAT JSON clause"), parser_errposition(pstate, ve->format->location >= 0 ? ve->format->location : location)); @@ -3293,6 +3387,9 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, exprtype = TEXTOID; } + if (!OidIsValid(targettype)) + targettype = format == JS_FORMAT_JSONB ? JSONBOID : JSONOID; + /* Try to coerce to the target type. */ coerced = coerce_to_target_type(pstate, expr, exprtype, targettype, -1, @@ -3303,18 +3400,31 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, if (!coerced) { /* If coercion failed, use to_json()/to_jsonb() functions. */ - Oid fnoid = targettype == JSONOID ? F_TO_JSON : F_TO_JSONB; - FuncExpr *fexpr = makeFuncExpr(fnoid, targettype, - list_make1(expr), - InvalidOid, InvalidOid, - COERCE_EXPLICIT_CALL); + FuncExpr *fexpr; + Oid fnoid; + + /* + * Though only allow a cast when the target type is specified by + * the caller. + */ + if (only_allow_cast) + ereport(ERROR, + (errcode(ERRCODE_CANNOT_COERCE), + errmsg("cannot cast type %s to %s", + format_type_be(exprtype), + format_type_be(targettype)), + parser_errposition(pstate, location))); + + fnoid = targettype == JSONOID ? F_TO_JSON : F_TO_JSONB; + fexpr = makeFuncExpr(fnoid, targettype, list_make1(expr), + InvalidOid, InvalidOid, COERCE_EXPLICIT_CALL); fexpr->location = location; coerced = (Node *) fexpr; } - if (coerced == orig) + if (coerced == expr) expr = rawexpr; else { @@ -3326,6 +3436,10 @@ transformJsonValueExpr(ParseState *pstate, JsonValueExpr *ve, } } + /* If returning a JsonValueExpr, formatted_expr must have been set. */ + Assert(!IsA(expr, JsonValueExpr) || + ((JsonValueExpr *) expr)->formatted_expr != NULL); + return expr; } @@ -3409,6 +3523,11 @@ transformJsonOutput(ParseState *pstate, const JsonOutput *output, errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("returning SETOF types is not supported in SQL/JSON functions")); + if (get_typtype(ret->typid) == TYPTYPE_PSEUDO) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("returning pseudo-types is not supported in SQL/JSON functions")); + if (ret->format->format_type == JS_FORMAT_DEFAULT) /* assign JSONB format when returning jsonb, or JSON format otherwise */ ret->format->format_type = @@ -3502,12 +3621,19 @@ coerceJsonFuncExpr(ParseState *pstate, Node *expr, return (Node *) fexpr; } - /* try to coerce expression to the output type */ + /* + * For other cases, try to coerce expression to the output type using + * assignment-level casts, erroring out if none available. This basically + * allows coercing the jsonb value to any string type (typcategory = 'S'). + * + * Requesting assignment-level here means that typmod / length coercion + * assumes implicit coercion which is the behavior we want; see + * build_coercion_expression(). + */ res = coerce_to_target_type(pstate, expr, exprtype, returning->typid, returning->typmod, - /* XXX throwing errors when casting to char(N) */ - COERCION_EXPLICIT, - COERCE_EXPLICIT_CAST, + COERCION_ASSIGNMENT, + COERCE_IMPLICIT_CAST, location); if (!res && report_error) @@ -3541,8 +3667,22 @@ makeJsonConstructorExpr(ParseState *pstate, JsonConstructorType type, jsctor->absent_on_null = absent_on_null; jsctor->location = location; + /* + * Coerce to the RETURNING type and format, if needed. We abuse + * CaseTestExpr here as placeholder to pass the result of either + * evaluating 'fexpr' or whatever is produced by ExecEvalJsonConstructor() + * that is of type JSON or JSONB to the coercion function. + */ if (fexpr) - placeholder = makeCaseTestExpr((Node *) fexpr); + { + CaseTestExpr *cte = makeNode(CaseTestExpr); + + cte->typeId = exprType((Node *) fexpr); + cte->typeMod = exprTypmod((Node *) fexpr); + cte->collation = exprCollation((Node *) fexpr); + + placeholder = (Node *) cte; + } else { CaseTestExpr *cte = makeNode(CaseTestExpr); @@ -3566,11 +3706,9 @@ makeJsonConstructorExpr(ParseState *pstate, JsonConstructorType type, /* * Transform JSON_OBJECT() constructor. * - * JSON_OBJECT() is transformed into json[b]_build_object[_ext]() call - * depending on the output JSON format. The first two arguments of - * json[b]_build_object_ext() are absent_on_null and check_unique. - * - * Then function call result is coerced to the target type. + * JSON_OBJECT() is transformed into a JsonConstructorExpr node of type + * JSCTOR_JSON_OBJECT. The result is coerced to the target type given + * by ctor->output. */ static Node * transformJsonObjectConstructor(ParseState *pstate, JsonObjectConstructor *ctor) @@ -3588,8 +3726,10 @@ transformJsonObjectConstructor(ParseState *pstate, JsonObjectConstructor *ctor) { JsonKeyValue *kv = castNode(JsonKeyValue, lfirst(lc)); Node *key = transformExprRecurse(pstate, (Node *) kv->key); - Node *val = transformJsonValueExpr(pstate, kv->value, - JS_FORMAT_DEFAULT); + Node *val = transformJsonValueExpr(pstate, "JSON_OBJECT()", + kv->value, + JS_FORMAT_DEFAULT, + InvalidOid, false); args = lappend(args, key); args = lappend(args, val); @@ -3624,7 +3764,7 @@ transformJsonArrayQueryConstructor(ParseState *pstate, /* Transform query only for counting target list entries. */ qpstate = make_parsestate(pstate); - query = transformStmt(qpstate, ctor->query); + query = transformStmt(qpstate, copyObject(ctor->query)); if (count_nonjunk_tlist_entries(query->targetList) != 1) ereport(ERROR, @@ -3638,7 +3778,12 @@ transformJsonArrayQueryConstructor(ParseState *pstate, makeString(pstrdup("a"))); colref->location = ctor->location; - agg->arg = makeJsonValueExpr((Expr *) colref, ctor->format); + /* + * No formatting necessary, so set formatted_expr to be the same as + * raw_expr. + */ + agg->arg = makeJsonValueExpr((Expr *) colref, (Expr *) colref, + ctor->format); agg->absent_on_null = ctor->absent_on_null; agg->constructor = makeNode(JsonAggConstructor); agg->constructor->agg_order = NIL; @@ -3697,6 +3842,7 @@ transformJsonAggConstructor(ParseState *pstate, JsonAggConstructor *agg_ctor, /* wincollid and inputcollid will be set by parse_collate.c */ wfunc->args = args; wfunc->aggfilter = aggfilter; + wfunc->runCondition = NIL; /* winref will be set by transformWindowFuncCall */ wfunc->winstar = false; wfunc->winagg = true; @@ -3752,10 +3898,11 @@ transformJsonAggConstructor(ParseState *pstate, JsonAggConstructor *agg_ctor, /* * Transform JSON_OBJECTAGG() aggregate function. * - * JSON_OBJECTAGG() is transformed into - * json[b]_objectagg[_unique][_strict](key, value) call depending on - * the output JSON format. Then the function call result is coerced to the - * target output type. + * JSON_OBJECTAGG() is transformed into a JsonConstructorExpr node of type + * JSCTOR_JSON_OBJECTAGG, which at runtime becomes a + * json[b]_object_agg[_unique][_strict](agg->arg->key, agg->arg->value) call + * depending on the output JSON format. The result is coerced to the target + * type given by agg->constructor->output. */ static Node * transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg) @@ -3768,7 +3915,10 @@ transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg) Oid aggtype; key = transformExprRecurse(pstate, (Node *) agg->arg->key); - val = transformJsonValueExpr(pstate, agg->arg->value, JS_FORMAT_DEFAULT); + val = transformJsonValueExpr(pstate, "JSON_OBJECTAGG()", + agg->arg->value, + JS_FORMAT_DEFAULT, + InvalidOid, false); args = list_make2(key, val); returning = transformJsonConstructorOutput(pstate, agg->constructor->output, @@ -3812,9 +3962,11 @@ transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg) /* * Transform JSON_ARRAYAGG() aggregate function. * - * JSON_ARRAYAGG() is transformed into json[b]_agg[_strict]() call depending - * on the output JSON format and absent_on_null. Then the function call result - * is coerced to the target output type. + * JSON_ARRAYAGG() is transformed into a JsonConstructorExpr node of type + * JSCTOR_JSON_ARRAYAGG, which at runtime becomes a + * json[b]_object_agg[_unique][_strict](agg->arg) call depending on the output + * JSON format. The result is coerced to the target type given by + * agg->constructor->output. */ static Node * transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg) @@ -3824,7 +3976,8 @@ transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg) Oid aggfnoid; Oid aggtype; - arg = transformJsonValueExpr(pstate, agg->arg, JS_FORMAT_DEFAULT); + arg = transformJsonValueExpr(pstate, "JSON_ARRAYAGG()", agg->arg, + JS_FORMAT_DEFAULT, InvalidOid, false); returning = transformJsonConstructorOutput(pstate, agg->constructor->output, list_make1(arg)); @@ -3849,11 +4002,9 @@ transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg) /* * Transform JSON_ARRAY() constructor. * - * JSON_ARRAY() is transformed into json[b]_build_array[_ext]() call - * depending on the output JSON format. The first argument of - * json[b]_build_array_ext() is absent_on_null. - * - * Then function call result is coerced to the target type. + * JSON_ARRAY() is transformed into a JsonConstructorExpr node of type + * JSCTOR_JSON_ARRAY. The result is coerced to the target type given + * by ctor->output. */ static Node * transformJsonArrayConstructor(ParseState *pstate, JsonArrayConstructor *ctor) @@ -3870,8 +4021,9 @@ transformJsonArrayConstructor(ParseState *pstate, JsonArrayConstructor *ctor) foreach(lc, ctor->exprs) { JsonValueExpr *jsval = castNode(JsonValueExpr, lfirst(lc)); - Node *val = transformJsonValueExpr(pstate, jsval, - JS_FORMAT_DEFAULT); + Node *val = transformJsonValueExpr(pstate, "JSON_ARRAY()", + jsval, JS_FORMAT_DEFAULT, + InvalidOid, false); args = lappend(args, val); } @@ -3898,13 +4050,11 @@ transformJsonParseArg(ParseState *pstate, Node *jsexpr, JsonFormat *format, { JsonValueExpr *jve; - expr = makeCaseTestExpr(raw_expr); + expr = raw_expr; expr = makeJsonByteaToTextConversion(expr, format, exprLocation(expr)); *exprtype = TEXTOID; - jve = makeJsonValueExpr((Expr *) raw_expr, format); - - jve->formatted_expr = (Expr *) expr; + jve = makeJsonValueExpr((Expr *) raw_expr, (Expr *) expr, format); expr = (Node *) jve; } else @@ -3954,3 +4104,790 @@ transformJsonIsPredicate(ParseState *pstate, JsonIsPredicate *pred) return makeJsonIsPredicate(expr, NULL, pred->item_type, pred->unique_keys, pred->location); } + +/* + * Transform the RETURNING clause of a JSON_*() expression if there is one and + * create one if not. + */ +static JsonReturning * +transformJsonReturning(ParseState *pstate, JsonOutput *output, const char *fname) +{ + JsonReturning *returning; + + if (output) + { + returning = transformJsonOutput(pstate, output, false); + + Assert(OidIsValid(returning->typid)); + + if (returning->typid != JSONOID && returning->typid != JSONBOID) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("cannot use type %s in RETURNING clause of %s", + format_type_be(returning->typid), fname), + errhint("Try returning json or jsonb."), + parser_errposition(pstate, output->typeName->location))); + } + else + { + /* Output type is JSON by default. */ + Oid targettype = JSONOID; + JsonFormatType format = JS_FORMAT_JSON; + + returning = makeNode(JsonReturning); + returning->format = makeJsonFormat(format, JS_ENC_DEFAULT, -1); + returning->typid = targettype; + returning->typmod = -1; + } + + return returning; +} + +/* + * Transform a JSON() expression. + * + * JSON() is transformed into a JsonConstructorExpr of type JSCTOR_JSON_PARSE, + * which validates the input expression value as JSON. + */ +static Node * +transformJsonParseExpr(ParseState *pstate, JsonParseExpr *jsexpr) +{ + JsonOutput *output = jsexpr->output; + JsonReturning *returning; + Node *arg; + + returning = transformJsonReturning(pstate, output, "JSON()"); + + if (jsexpr->unique_keys) + { + /* + * Coerce string argument to text and then to json[b] in the executor + * node with key uniqueness check. + */ + JsonValueExpr *jve = jsexpr->expr; + Oid arg_type; + + arg = transformJsonParseArg(pstate, (Node *) jve->raw_expr, jve->format, + &arg_type); + + if (arg_type != TEXTOID) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("cannot use non-string types with WITH UNIQUE KEYS clause"), + parser_errposition(pstate, jsexpr->location))); + } + else + { + /* + * Coerce argument to target type using CAST for compatibility with PG + * function-like CASTs. + */ + arg = transformJsonValueExpr(pstate, "JSON()", jsexpr->expr, + JS_FORMAT_JSON, returning->typid, false); + } + + return makeJsonConstructorExpr(pstate, JSCTOR_JSON_PARSE, list_make1(arg), NULL, + returning, jsexpr->unique_keys, false, + jsexpr->location); +} + +/* + * Transform a JSON_SCALAR() expression. + * + * JSON_SCALAR() is transformed into a JsonConstructorExpr of type + * JSCTOR_JSON_SCALAR, which converts the input SQL scalar value into + * a json[b] value. + */ +static Node * +transformJsonScalarExpr(ParseState *pstate, JsonScalarExpr *jsexpr) +{ + Node *arg = transformExprRecurse(pstate, (Node *) jsexpr->expr); + JsonOutput *output = jsexpr->output; + JsonReturning *returning; + + returning = transformJsonReturning(pstate, output, "JSON_SCALAR()"); + + if (exprType(arg) == UNKNOWNOID) + arg = coerce_to_specific_type(pstate, arg, TEXTOID, "JSON_SCALAR"); + + return makeJsonConstructorExpr(pstate, JSCTOR_JSON_SCALAR, list_make1(arg), NULL, + returning, false, false, jsexpr->location); +} + +/* + * Transform a JSON_SERIALIZE() expression. + * + * JSON_SERIALIZE() is transformed into a JsonConstructorExpr of type + * JSCTOR_JSON_SERIALIZE which converts the input JSON value into a character + * or bytea string. + */ +static Node * +transformJsonSerializeExpr(ParseState *pstate, JsonSerializeExpr *expr) +{ + JsonReturning *returning; + Node *arg = transformJsonValueExpr(pstate, "JSON_SERIALIZE()", + expr->expr, + JS_FORMAT_JSON, + InvalidOid, false); + + if (expr->output) + { + returning = transformJsonOutput(pstate, expr->output, true); + + if (returning->typid != BYTEAOID) + { + char typcategory; + bool typispreferred; + + get_type_category_preferred(returning->typid, &typcategory, + &typispreferred); + if (typcategory != TYPCATEGORY_STRING) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("cannot use type %s in RETURNING clause of %s", + format_type_be(returning->typid), + "JSON_SERIALIZE()"), + errhint("Try returning a string type or bytea."))); + } + } + else + { + /* RETURNING TEXT FORMAT JSON is by default */ + returning = makeNode(JsonReturning); + returning->format = makeJsonFormat(JS_FORMAT_JSON, JS_ENC_DEFAULT, -1); + returning->typid = TEXTOID; + returning->typmod = -1; + } + + return makeJsonConstructorExpr(pstate, JSCTOR_JSON_SERIALIZE, list_make1(arg), + NULL, returning, false, false, expr->location); +} + +/* + * Transform JSON_VALUE, JSON_QUERY, JSON_EXISTS, JSON_TABLE functions into + * a JsonExpr node. + */ +static Node * +transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func) +{ + JsonExpr *jsexpr; + Node *path_spec; + const char *func_name = NULL; + JsonFormatType default_format; + + switch (func->op) + { + case JSON_EXISTS_OP: + func_name = "JSON_EXISTS"; + default_format = JS_FORMAT_DEFAULT; + break; + case JSON_QUERY_OP: + func_name = "JSON_QUERY"; + default_format = JS_FORMAT_JSONB; + break; + case JSON_VALUE_OP: + func_name = "JSON_VALUE"; + default_format = JS_FORMAT_DEFAULT; + break; + case JSON_TABLE_OP: + func_name = "JSON_TABLE"; + default_format = JS_FORMAT_JSONB; + break; + default: + elog(ERROR, "invalid JsonFuncExpr op %d", (int) func->op); + default_format = JS_FORMAT_DEFAULT; /* keep compiler quiet */ + break; + } + + /* + * Even though the syntax allows it, FORMAT JSON specification in + * RETURNING is meaningless except for JSON_QUERY(). Flag if not + * JSON_QUERY(). + */ + if (func->output && func->op != JSON_QUERY_OP) + { + JsonFormat *format = func->output->returning->format; + + if (format->format_type != JS_FORMAT_DEFAULT || + format->encoding != JS_ENC_DEFAULT) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("cannot specify FORMAT JSON in RETURNING clause of %s()", + func_name), + parser_errposition(pstate, format->location)); + } + + /* OMIT QUOTES is meaningless when strings are wrapped. */ + if (func->op == JSON_QUERY_OP) + { + if (func->quotes == JS_QUOTES_OMIT && + (func->wrapper == JSW_CONDITIONAL || + func->wrapper == JSW_UNCONDITIONAL)) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used"), + parser_errposition(pstate, func->location)); + if (func->on_empty != NULL && + func->on_empty->btype != JSON_BEHAVIOR_ERROR && + func->on_empty->btype != JSON_BEHAVIOR_NULL && + func->on_empty->btype != JSON_BEHAVIOR_EMPTY && + func->on_empty->btype != JSON_BEHAVIOR_EMPTY_ARRAY && + func->on_empty->btype != JSON_BEHAVIOR_EMPTY_OBJECT && + func->on_empty->btype != JSON_BEHAVIOR_DEFAULT) + { + if (func->column_name == NULL) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errmsg("invalid %s behavior", "ON EMPTY"), + /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), + second %s is a SQL/JSON function name (e.g. JSON_QUERY) */ + errdetail("Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s.", + "ON EMPTY", "JSON_QUERY()"), + parser_errposition(pstate, func->on_empty->location)); + else + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errmsg("invalid %s behavior for column \"%s\"", + "ON EMPTY", func->column_name), + /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errdetail("Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns.", + "ON EMPTY"), + parser_errposition(pstate, func->on_empty->location)); + } + if (func->on_error != NULL && + func->on_error->btype != JSON_BEHAVIOR_ERROR && + func->on_error->btype != JSON_BEHAVIOR_NULL && + func->on_error->btype != JSON_BEHAVIOR_EMPTY && + func->on_error->btype != JSON_BEHAVIOR_EMPTY_ARRAY && + func->on_error->btype != JSON_BEHAVIOR_EMPTY_OBJECT && + func->on_error->btype != JSON_BEHAVIOR_DEFAULT) + { + if (func->column_name == NULL) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errmsg("invalid %s behavior", "ON ERROR"), + /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), + second %s is a SQL/JSON function name (e.g. JSON_QUERY) */ + errdetail("Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s.", + "ON ERROR", "JSON_QUERY()"), + parser_errposition(pstate, func->on_error->location)); + else + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errmsg("invalid %s behavior for column \"%s\"", + "ON ERROR", func->column_name), + /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errdetail("Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns.", + "ON ERROR"), + parser_errposition(pstate, func->on_error->location)); + } + } + + /* Check that ON ERROR/EMPTY behavior values are valid for the function. */ + if (func->op == JSON_EXISTS_OP && + func->on_error != NULL && + func->on_error->btype != JSON_BEHAVIOR_ERROR && + func->on_error->btype != JSON_BEHAVIOR_TRUE && + func->on_error->btype != JSON_BEHAVIOR_FALSE && + func->on_error->btype != JSON_BEHAVIOR_UNKNOWN) + { + if (func->column_name == NULL) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errmsg("invalid %s behavior", "ON ERROR"), + errdetail("Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s.", + "ON ERROR", "JSON_EXISTS()"), + parser_errposition(pstate, func->on_error->location)); + else + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: first %s is name a SQL/JSON clause (eg. ON EMPTY) */ + errmsg("invalid %s behavior for column \"%s\"", + "ON ERROR", func->column_name), + /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errdetail("Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns.", + "ON ERROR"), + parser_errposition(pstate, func->on_error->location)); + } + if (func->op == JSON_VALUE_OP) + { + if (func->on_empty != NULL && + func->on_empty->btype != JSON_BEHAVIOR_ERROR && + func->on_empty->btype != JSON_BEHAVIOR_NULL && + func->on_empty->btype != JSON_BEHAVIOR_DEFAULT) + { + if (func->column_name == NULL) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errmsg("invalid %s behavior", "ON EMPTY"), + /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), + second %s is a SQL/JSON function name (e.g. JSON_QUERY) */ + errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s.", + "ON EMPTY", "JSON_VALUE()"), + parser_errposition(pstate, func->on_empty->location)); + else + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errmsg("invalid %s behavior for column \"%s\"", + "ON EMPTY", func->column_name), + /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns.", + "ON EMPTY"), + parser_errposition(pstate, func->on_empty->location)); + } + if (func->on_error != NULL && + func->on_error->btype != JSON_BEHAVIOR_ERROR && + func->on_error->btype != JSON_BEHAVIOR_NULL && + func->on_error->btype != JSON_BEHAVIOR_DEFAULT) + { + if (func->column_name == NULL) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errmsg("invalid %s behavior", "ON ERROR"), + /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), + second %s is a SQL/JSON function name (e.g. JSON_QUERY) */ + errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s.", + "ON ERROR", "JSON_VALUE()"), + parser_errposition(pstate, func->on_error->location)); + else + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errmsg("invalid %s behavior for column \"%s\"", + "ON ERROR", func->column_name), + /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */ + errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns.", + "ON ERROR"), + parser_errposition(pstate, func->on_error->location)); + } + } + + jsexpr = makeNode(JsonExpr); + jsexpr->location = func->location; + jsexpr->op = func->op; + jsexpr->column_name = func->column_name; + + /* + * jsonpath machinery can only handle jsonb documents, so coerce the input + * if not already of jsonb type. + */ + jsexpr->formatted_expr = transformJsonValueExpr(pstate, func_name, + func->context_item, + default_format, + JSONBOID, + false); + jsexpr->format = func->context_item->format; + + path_spec = transformExprRecurse(pstate, func->pathspec); + path_spec = coerce_to_target_type(pstate, path_spec, exprType(path_spec), + JSONPATHOID, -1, + COERCION_EXPLICIT, COERCE_IMPLICIT_CAST, + exprLocation(path_spec)); + if (path_spec == NULL) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("JSON path expression must be of type %s, not of type %s", + "jsonpath", format_type_be(exprType(path_spec))), + parser_errposition(pstate, exprLocation(path_spec)))); + jsexpr->path_spec = path_spec; + + /* Transform and coerce the PASSING arguments to jsonb. */ + transformJsonPassingArgs(pstate, func_name, + JS_FORMAT_JSONB, + func->passing, + &jsexpr->passing_values, + &jsexpr->passing_names); + + /* Transform the JsonOutput into JsonReturning. */ + jsexpr->returning = transformJsonOutput(pstate, func->output, false); + + switch (func->op) + { + case JSON_EXISTS_OP: + /* JSON_EXISTS returns boolean by default. */ + if (!OidIsValid(jsexpr->returning->typid)) + { + jsexpr->returning->typid = BOOLOID; + jsexpr->returning->typmod = -1; + } + + /* JSON_TABLE() COLUMNS can specify a non-boolean type. */ + if (jsexpr->returning->typid != BOOLOID) + jsexpr->use_json_coercion = true; + + jsexpr->on_error = transformJsonBehavior(pstate, func->on_error, + JSON_BEHAVIOR_FALSE, + jsexpr->returning); + break; + + case JSON_QUERY_OP: + /* JSON_QUERY returns jsonb by default. */ + if (!OidIsValid(jsexpr->returning->typid)) + { + JsonReturning *ret = jsexpr->returning; + + ret->typid = JSONBOID; + ret->typmod = -1; + } + + /* + * Keep quotes on scalar strings by default, omitting them only if + * OMIT QUOTES is specified. + */ + jsexpr->omit_quotes = (func->quotes == JS_QUOTES_OMIT); + jsexpr->wrapper = func->wrapper; + + /* + * Set up to coerce the result value of JsonPathValue() to the + * RETURNING type (default or user-specified), if needed. Also if + * OMIT QUOTES is specified. + */ + if (jsexpr->returning->typid != JSONBOID || jsexpr->omit_quotes) + jsexpr->use_json_coercion = true; + + /* Assume NULL ON EMPTY when ON EMPTY is not specified. */ + jsexpr->on_empty = transformJsonBehavior(pstate, func->on_empty, + JSON_BEHAVIOR_NULL, + jsexpr->returning); + /* Assume NULL ON ERROR when ON ERROR is not specified. */ + jsexpr->on_error = transformJsonBehavior(pstate, func->on_error, + JSON_BEHAVIOR_NULL, + jsexpr->returning); + break; + + case JSON_VALUE_OP: + /* JSON_VALUE returns text by default. */ + if (!OidIsValid(jsexpr->returning->typid)) + { + jsexpr->returning->typid = TEXTOID; + jsexpr->returning->typmod = -1; + } + + /* + * Override whatever transformJsonOutput() set these to, which + * assumes that output type to be jsonb. + */ + jsexpr->returning->format->format_type = JS_FORMAT_DEFAULT; + jsexpr->returning->format->encoding = JS_ENC_DEFAULT; + + /* Always omit quotes from scalar strings. */ + jsexpr->omit_quotes = true; + + /* + * Set up to coerce the result value of JsonPathValue() to the + * RETURNING type (default or user-specified), if needed. + */ + if (jsexpr->returning->typid != TEXTOID) + { + if (get_typtype(jsexpr->returning->typid) == TYPTYPE_DOMAIN && + DomainHasConstraints(jsexpr->returning->typid)) + jsexpr->use_json_coercion = true; + else + jsexpr->use_io_coercion = true; + } + + /* Assume NULL ON EMPTY when ON EMPTY is not specified. */ + jsexpr->on_empty = transformJsonBehavior(pstate, func->on_empty, + JSON_BEHAVIOR_NULL, + jsexpr->returning); + /* Assume NULL ON ERROR when ON ERROR is not specified. */ + jsexpr->on_error = transformJsonBehavior(pstate, func->on_error, + JSON_BEHAVIOR_NULL, + jsexpr->returning); + break; + + case JSON_TABLE_OP: + if (!OidIsValid(jsexpr->returning->typid)) + { + jsexpr->returning->typid = exprType(jsexpr->formatted_expr); + jsexpr->returning->typmod = -1; + } + + /* + * Assume EMPTY ARRAY ON ERROR when ON ERROR is not specified. + * + * ON EMPTY cannot be specified at the top level but it can be for + * the individual columns. + */ + jsexpr->on_error = transformJsonBehavior(pstate, func->on_error, + JSON_BEHAVIOR_EMPTY_ARRAY, + jsexpr->returning); + break; + + default: + elog(ERROR, "invalid JsonFuncExpr op %d", (int) func->op); + break; + } + + return (Node *) jsexpr; +} + +/* + * Transform a SQL/JSON PASSING clause. + */ +static void +transformJsonPassingArgs(ParseState *pstate, const char *constructName, + JsonFormatType format, List *args, + List **passing_values, List **passing_names) +{ + ListCell *lc; + + *passing_values = NIL; + *passing_names = NIL; + + foreach(lc, args) + { + JsonArgument *arg = castNode(JsonArgument, lfirst(lc)); + Node *expr = transformJsonValueExpr(pstate, constructName, + arg->val, format, + InvalidOid, true); + + *passing_values = lappend(*passing_values, expr); + *passing_names = lappend(*passing_names, makeString(arg->name)); + } +} + +/* + * Recursively checks if the given expression, or its sub-node in some cases, + * is valid for using as an ON ERROR / ON EMPTY DEFAULT expression. + */ +static bool +ValidJsonBehaviorDefaultExpr(Node *expr, void *context) +{ + if (expr == NULL) + return false; + + switch (nodeTag(expr)) + { + /* Acceptable expression nodes */ + case T_Const: + case T_FuncExpr: + case T_OpExpr: + return true; + + /* Acceptable iff arg of the following nodes is one of the above */ + case T_CoerceViaIO: + case T_CoerceToDomain: + case T_ArrayCoerceExpr: + case T_ConvertRowtypeExpr: + case T_RelabelType: + case T_CollateExpr: + return expression_tree_walker(expr, ValidJsonBehaviorDefaultExpr, + context); + default: + break; + } + + return false; +} + +/* + * Transform a JSON BEHAVIOR clause. + */ +static JsonBehavior * +transformJsonBehavior(ParseState *pstate, JsonBehavior *behavior, + JsonBehaviorType default_behavior, + JsonReturning *returning) +{ + JsonBehaviorType btype = default_behavior; + Node *expr = NULL; + bool coerce_at_runtime = false; + int location = -1; + + if (behavior) + { + btype = behavior->btype; + location = behavior->location; + if (btype == JSON_BEHAVIOR_DEFAULT) + { + expr = transformExprRecurse(pstate, behavior->expr); + if (!ValidJsonBehaviorDefaultExpr(expr, NULL)) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("can only specify a constant, non-aggregate function, or operator expression for DEFAULT"), + parser_errposition(pstate, exprLocation(expr)))); + if (contain_var_clause(expr)) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("DEFAULT expression must not contain column references"), + parser_errposition(pstate, exprLocation(expr)))); + if (expression_returns_set(expr)) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("DEFAULT expression must not return a set"), + parser_errposition(pstate, exprLocation(expr)))); + } + } + + if (expr == NULL && btype != JSON_BEHAVIOR_ERROR) + expr = GetJsonBehaviorConst(btype, location); + + /* + * Try to coerce the expression if needed. + * + * Use runtime coercion using json_populate_type() if the expression is + * NULL, jsonb-valued, or boolean-valued (unless the target type is + * integer or domain over integer, in which case use the + * boolean-to-integer cast function). + * + * For other non-NULL expressions, try to find a cast and error out if one + * is not found. + */ + if (expr && exprType(expr) != returning->typid) + { + bool isnull = (IsA(expr, Const) && ((Const *) expr)->constisnull); + + if (isnull || + exprType(expr) == JSONBOID || + (exprType(expr) == BOOLOID && + getBaseType(returning->typid) != INT4OID)) + { + coerce_at_runtime = true; + + /* + * json_populate_type() expects to be passed a jsonb value, so gin + * up a Const containing the appropriate boolean value represented + * as jsonb, discarding the original Const containing a plain + * boolean. + */ + if (exprType(expr) == BOOLOID) + { + char *val = btype == JSON_BEHAVIOR_TRUE ? "true" : "false"; + + expr = (Node *) makeConst(JSONBOID, -1, InvalidOid, -1, + DirectFunctionCall1(jsonb_in, + CStringGetDatum(val)), + false, false); + } + } + else + { + Node *coerced_expr; + char typcategory = TypeCategory(returning->typid); + + /* + * Use an assignment cast if coercing to a string type so that + * build_coercion_expression() assumes implicit coercion when + * coercing the typmod, so that inputs exceeding length cause an + * error instead of silent truncation. + */ + coerced_expr = + coerce_to_target_type(pstate, expr, exprType(expr), + returning->typid, returning->typmod, + (typcategory == TYPCATEGORY_STRING || + typcategory == TYPCATEGORY_BITSTRING) ? + COERCION_ASSIGNMENT : + COERCION_EXPLICIT, + COERCE_EXPLICIT_CAST, + exprLocation((Node *) behavior)); + + if (coerced_expr == NULL) + { + /* + * Provide a HINT if the expression comes from a DEFAULT + * clause. + */ + if (btype == JSON_BEHAVIOR_DEFAULT) + ereport(ERROR, + errcode(ERRCODE_CANNOT_COERCE), + errmsg("cannot cast behavior expression of type %s to %s", + format_type_be(exprType(expr)), + format_type_be(returning->typid)), + errhint("You will need to explicitly cast the expression to type %s.", + format_type_be(returning->typid)), + parser_errposition(pstate, exprLocation(expr))); + else + ereport(ERROR, + errcode(ERRCODE_CANNOT_COERCE), + errmsg("cannot cast behavior expression of type %s to %s", + format_type_be(exprType(expr)), + format_type_be(returning->typid)), + parser_errposition(pstate, exprLocation(expr))); + } + + expr = coerced_expr; + } + } + + if (behavior) + behavior->expr = expr; + else + behavior = makeJsonBehavior(btype, expr, location); + + behavior->coerce = coerce_at_runtime; + + return behavior; +} + +/* + * Returns a Const node holding the value for the given non-ERROR + * JsonBehaviorType. + */ +static Node * +GetJsonBehaviorConst(JsonBehaviorType btype, int location) +{ + Datum val = (Datum) 0; + Oid typid = JSONBOID; + int len = -1; + bool isbyval = false; + bool isnull = false; + Const *con; + + switch (btype) + { + case JSON_BEHAVIOR_EMPTY_ARRAY: + val = DirectFunctionCall1(jsonb_in, CStringGetDatum("[]")); + break; + + case JSON_BEHAVIOR_EMPTY_OBJECT: + val = DirectFunctionCall1(jsonb_in, CStringGetDatum("{}")); + break; + + case JSON_BEHAVIOR_TRUE: + val = BoolGetDatum(true); + typid = BOOLOID; + len = sizeof(bool); + isbyval = true; + break; + + case JSON_BEHAVIOR_FALSE: + val = BoolGetDatum(false); + typid = BOOLOID; + len = sizeof(bool); + isbyval = true; + break; + + case JSON_BEHAVIOR_NULL: + case JSON_BEHAVIOR_UNKNOWN: + case JSON_BEHAVIOR_EMPTY: + val = (Datum) 0; + isnull = true; + typid = INT4OID; + len = sizeof(int32); + isbyval = true; + break; + + /* These two behavior types are handled by the caller. */ + case JSON_BEHAVIOR_DEFAULT: + case JSON_BEHAVIOR_ERROR: + Assert(false); + break; + + default: + elog(ERROR, "unrecognized SQL/JSON behavior %d", btype); + break; + } + + con = makeConst(typid, -1, InvalidOid, len, val, isnull, isbyval); + con->location = location; + + return (Node *) con; +} diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c index b3f0b6a137a05..9b23344a3b1ac 100644 --- a/src/backend/parser/parse_func.c +++ b/src/backend/parser/parse_func.c @@ -3,7 +3,7 @@ * parse_func.c * handle function calls in parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -39,7 +39,7 @@ typedef enum { FUNCLOOKUP_NOSUCHFUNC, - FUNCLOOKUP_AMBIGUOUS + FUNCLOOKUP_AMBIGUOUS, } FuncLookupError; static void unify_hypothetical_args(ParseState *pstate, @@ -834,6 +834,7 @@ ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, wfunc->winstar = agg_star; wfunc->winagg = (fdresult == FUNCDETAIL_AGGREGATE); wfunc->aggfilter = agg_filter; + wfunc->runCondition = NIL; wfunc->location = location; /* @@ -2599,6 +2600,7 @@ check_srf_call_placement(ParseState *pstate, Node *last_srf, int location) errkind = true; break; case EXPR_KIND_RETURNING: + case EXPR_KIND_MERGE_RETURNING: errkind = true; break; case EXPR_KIND_VALUES: diff --git a/src/backend/parser/parse_jsontable.c b/src/backend/parser/parse_jsontable.c new file mode 100644 index 0000000000000..6d4e4968202e7 --- /dev/null +++ b/src/backend/parser/parse_jsontable.c @@ -0,0 +1,543 @@ +/*------------------------------------------------------------------------- + * + * parse_jsontable.c + * parsing of JSON_TABLE + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/parser/parse_jsontable.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "catalog/pg_collation.h" +#include "catalog/pg_type.h" +#include "miscadmin.h" +#include "nodes/makefuncs.h" +#include "nodes/nodeFuncs.h" +#include "optimizer/optimizer.h" +#include "parser/parse_clause.h" +#include "parser/parse_collate.h" +#include "parser/parse_expr.h" +#include "parser/parse_relation.h" +#include "parser/parse_type.h" +#include "utils/builtins.h" +#include "utils/json.h" +#include "utils/lsyscache.h" + +/* Context for transformJsonTableColumns() */ +typedef struct JsonTableParseContext +{ + ParseState *pstate; + JsonTable *jt; + TableFunc *tf; + List *pathNames; /* list of all path and columns names */ + int pathNameId; /* path name id counter */ +} JsonTableParseContext; + +static JsonTablePlan *transformJsonTableColumns(JsonTableParseContext *cxt, + List *columns, + List *passingArgs, + JsonTablePathSpec *pathspec); +static JsonTablePlan *transformJsonTableNestedColumns(JsonTableParseContext *cxt, + List *passingArgs, + List *columns); +static JsonFuncExpr *transformJsonTableColumn(JsonTableColumn *jtc, + Node *contextItemExpr, + List *passingArgs); +static bool isCompositeType(Oid typid); +static JsonTablePlan *makeJsonTablePathScan(JsonTablePathSpec *pathspec, + bool errorOnError, + int colMin, int colMax, + JsonTablePlan *childplan); +static void CheckDuplicateColumnOrPathNames(JsonTableParseContext *cxt, + List *columns); +static bool LookupPathOrColumnName(JsonTableParseContext *cxt, char *name); +static char *generateJsonTablePathName(JsonTableParseContext *cxt); +static JsonTablePlan *makeJsonTableSiblingJoin(JsonTablePlan *lplan, + JsonTablePlan *rplan); + +/* + * transformJsonTable - + * Transform a raw JsonTable into TableFunc + * + * Mainly, this transforms the JSON_TABLE() document-generating expression + * (jt->context_item) and the column-generating expressions (jt->columns) to + * populate TableFunc.docexpr and TableFunc.colvalexprs, respectively. Also, + * the PASSING values (jt->passing) are transformed and added into + * TableFunc.passingvalexprs. + */ +ParseNamespaceItem * +transformJsonTable(ParseState *pstate, JsonTable *jt) +{ + TableFunc *tf; + JsonFuncExpr *jfe; + JsonExpr *je; + JsonTablePathSpec *rootPathSpec = jt->pathspec; + bool is_lateral; + JsonTableParseContext cxt = {pstate}; + + Assert(IsA(rootPathSpec->string, A_Const) && + castNode(A_Const, rootPathSpec->string)->val.node.type == T_String); + + if (jt->on_error && + jt->on_error->btype != JSON_BEHAVIOR_ERROR && + jt->on_error->btype != JSON_BEHAVIOR_EMPTY && + jt->on_error->btype != JSON_BEHAVIOR_EMPTY_ARRAY) + ereport(ERROR, + errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid %s behavior", "ON ERROR"), + errdetail("Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause."), + parser_errposition(pstate, jt->on_error->location)); + + cxt.pathNameId = 0; + if (rootPathSpec->name == NULL) + rootPathSpec->name = generateJsonTablePathName(&cxt); + cxt.pathNames = list_make1(rootPathSpec->name); + CheckDuplicateColumnOrPathNames(&cxt, jt->columns); + + /* + * We make lateral_only names of this level visible, whether or not the + * RangeTableFunc is explicitly marked LATERAL. This is needed for SQL + * spec compliance and seems useful on convenience grounds for all + * functions in FROM. + * + * (LATERAL can't nest within a single pstate level, so we don't need + * save/restore logic here.) + */ + Assert(!pstate->p_lateral_active); + pstate->p_lateral_active = true; + + tf = makeNode(TableFunc); + tf->functype = TFT_JSON_TABLE; + + /* + * Transform JsonFuncExpr representing the top JSON_TABLE context_item and + * pathspec into a dummy JSON_TABLE_OP JsonExpr. + */ + jfe = makeNode(JsonFuncExpr); + jfe->op = JSON_TABLE_OP; + jfe->context_item = jt->context_item; + jfe->pathspec = (Node *) rootPathSpec->string; + jfe->passing = jt->passing; + jfe->on_empty = NULL; + jfe->on_error = jt->on_error; + jfe->location = jt->location; + tf->docexpr = transformExpr(pstate, (Node *) jfe, EXPR_KIND_FROM_FUNCTION); + + /* + * Create a JsonTablePlan that will generate row pattern that becomes + * source data for JSON path expressions in jt->columns. This also adds + * the columns' transformed JsonExpr nodes into tf->colvalexprs. + */ + cxt.jt = jt; + cxt.tf = tf; + tf->plan = (Node *) transformJsonTableColumns(&cxt, jt->columns, + jt->passing, + rootPathSpec); + + /* + * Copy the transformed PASSING arguments into the TableFunc node, because + * they are evaluated separately from the JsonExpr that we just put in + * TableFunc.docexpr. JsonExpr.passing_values is still kept around for + * get_json_table(). + */ + je = (JsonExpr *) tf->docexpr; + tf->passingvalexprs = copyObject(je->passing_values); + + tf->ordinalitycol = -1; /* undefine ordinality column number */ + tf->location = jt->location; + + pstate->p_lateral_active = false; + + /* + * Mark the RTE as LATERAL if the user said LATERAL explicitly, or if + * there are any lateral cross-references in it. + */ + is_lateral = jt->lateral || contain_vars_of_level((Node *) tf, 0); + + return addRangeTableEntryForTableFunc(pstate, + tf, jt->alias, is_lateral, true); +} + +/* + * Check if a column / path name is duplicated in the given shared list of + * names. + */ +static void +CheckDuplicateColumnOrPathNames(JsonTableParseContext *cxt, + List *columns) +{ + ListCell *lc1; + + foreach(lc1, columns) + { + JsonTableColumn *jtc = castNode(JsonTableColumn, lfirst(lc1)); + + if (jtc->coltype == JTC_NESTED) + { + if (jtc->pathspec->name) + { + if (LookupPathOrColumnName(cxt, jtc->pathspec->name)) + ereport(ERROR, + errcode(ERRCODE_DUPLICATE_ALIAS), + errmsg("duplicate JSON_TABLE column or path name: %s", + jtc->pathspec->name), + parser_errposition(cxt->pstate, + jtc->pathspec->name_location)); + cxt->pathNames = lappend(cxt->pathNames, jtc->pathspec->name); + } + + CheckDuplicateColumnOrPathNames(cxt, jtc->columns); + } + else + { + if (LookupPathOrColumnName(cxt, jtc->name)) + ereport(ERROR, + errcode(ERRCODE_DUPLICATE_ALIAS), + errmsg("duplicate JSON_TABLE column or path name: %s", + jtc->name), + parser_errposition(cxt->pstate, jtc->location)); + cxt->pathNames = lappend(cxt->pathNames, jtc->name); + } + } +} + +/* + * Lookup a column/path name in the given name list, returning true if already + * there. + */ +static bool +LookupPathOrColumnName(JsonTableParseContext *cxt, char *name) +{ + ListCell *lc; + + foreach(lc, cxt->pathNames) + { + if (strcmp(name, (const char *) lfirst(lc)) == 0) + return true; + } + + return false; +} + +/* Generate a new unique JSON_TABLE path name. */ +static char * +generateJsonTablePathName(JsonTableParseContext *cxt) +{ + char namebuf[32]; + char *name = namebuf; + + snprintf(namebuf, sizeof(namebuf), "json_table_path_%d", + cxt->pathNameId++); + + name = pstrdup(name); + cxt->pathNames = lappend(cxt->pathNames, name); + + return name; +} + +/* + * Create a JsonTablePlan that will supply the source row for 'columns' + * using 'pathspec' and append the columns' transformed JsonExpr nodes and + * their type/collation information to cxt->tf. + */ +static JsonTablePlan * +transformJsonTableColumns(JsonTableParseContext *cxt, List *columns, + List *passingArgs, + JsonTablePathSpec *pathspec) +{ + ParseState *pstate = cxt->pstate; + JsonTable *jt = cxt->jt; + TableFunc *tf = cxt->tf; + ListCell *col; + bool ordinality_found = false; + bool errorOnError = jt->on_error && + jt->on_error->btype == JSON_BEHAVIOR_ERROR; + Oid contextItemTypid = exprType(tf->docexpr); + int colMin, + colMax; + JsonTablePlan *childplan; + + /* Start of column range */ + colMin = list_length(tf->colvalexprs); + + foreach(col, columns) + { + JsonTableColumn *rawc = castNode(JsonTableColumn, lfirst(col)); + Oid typid; + int32 typmod; + Oid typcoll = InvalidOid; + Node *colexpr; + + if (rawc->coltype != JTC_NESTED) + { + Assert(rawc->name); + tf->colnames = lappend(tf->colnames, + makeString(pstrdup(rawc->name))); + } + + /* + * Determine the type and typmod for the new column. FOR ORDINALITY + * columns are INTEGER by standard; the others are user-specified. + */ + switch (rawc->coltype) + { + case JTC_FOR_ORDINALITY: + if (ordinality_found) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("only one FOR ORDINALITY column is allowed"), + parser_errposition(pstate, rawc->location))); + ordinality_found = true; + colexpr = NULL; + typid = INT4OID; + typmod = -1; + break; + + case JTC_REGULAR: + typenameTypeIdAndMod(pstate, rawc->typeName, &typid, &typmod); + + /* + * Use JTC_FORMATTED so as to use JSON_QUERY for this column + * if the specified type is one that's better handled using + * JSON_QUERY() or if non-default WRAPPER or QUOTES behavior + * is specified. + */ + if (isCompositeType(typid) || + rawc->quotes != JS_QUOTES_UNSPEC || + rawc->wrapper != JSW_UNSPEC) + rawc->coltype = JTC_FORMATTED; + + /* FALLTHROUGH */ + case JTC_FORMATTED: + case JTC_EXISTS: + { + JsonFuncExpr *jfe; + CaseTestExpr *param = makeNode(CaseTestExpr); + + param->collation = InvalidOid; + param->typeId = contextItemTypid; + param->typeMod = -1; + + jfe = transformJsonTableColumn(rawc, (Node *) param, + passingArgs); + + colexpr = transformExpr(pstate, (Node *) jfe, + EXPR_KIND_FROM_FUNCTION); + assign_expr_collations(pstate, colexpr); + + typid = exprType(colexpr); + typmod = exprTypmod(colexpr); + typcoll = exprCollation(colexpr); + break; + } + + case JTC_NESTED: + continue; + + default: + elog(ERROR, "unknown JSON_TABLE column type: %d", (int) rawc->coltype); + break; + } + + tf->coltypes = lappend_oid(tf->coltypes, typid); + tf->coltypmods = lappend_int(tf->coltypmods, typmod); + tf->colcollations = lappend_oid(tf->colcollations, typcoll); + tf->colvalexprs = lappend(tf->colvalexprs, colexpr); + } + + /* End of column range. */ + if (list_length(tf->colvalexprs) == colMin) + { + /* No columns in this Scan beside the nested ones. */ + colMax = colMin = -1; + } + else + colMax = list_length(tf->colvalexprs) - 1; + + /* Recursively transform nested columns */ + childplan = transformJsonTableNestedColumns(cxt, passingArgs, columns); + + /* Create a "parent" scan responsible for all columns handled above. */ + return makeJsonTablePathScan(pathspec, errorOnError, colMin, colMax, + childplan); +} + +/* + * Check if the type is "composite" for the purpose of checking whether to use + * JSON_VALUE() or JSON_QUERY() for a given JsonTableColumn. + */ +static bool +isCompositeType(Oid typid) +{ + char typtype = get_typtype(typid); + + return typid == JSONOID || + typid == JSONBOID || + typid == RECORDOID || + type_is_array(typid) || + typtype == TYPTYPE_COMPOSITE || + /* domain over one of the above? */ + (typtype == TYPTYPE_DOMAIN && + isCompositeType(getBaseType(typid))); +} + +/* + * Transform JSON_TABLE column definition into a JsonFuncExpr + * This turns: + * - regular column into JSON_VALUE() + * - FORMAT JSON column into JSON_QUERY() + * - EXISTS column into JSON_EXISTS() + */ +static JsonFuncExpr * +transformJsonTableColumn(JsonTableColumn *jtc, Node *contextItemExpr, + List *passingArgs) +{ + Node *pathspec; + JsonFuncExpr *jfexpr = makeNode(JsonFuncExpr); + + if (jtc->coltype == JTC_REGULAR) + jfexpr->op = JSON_VALUE_OP; + else if (jtc->coltype == JTC_EXISTS) + jfexpr->op = JSON_EXISTS_OP; + else + jfexpr->op = JSON_QUERY_OP; + + /* Pass the column name so any runtime JsonExpr errors can print it. */ + Assert(jtc->name != NULL); + jfexpr->column_name = pstrdup(jtc->name); + + jfexpr->context_item = makeJsonValueExpr((Expr *) contextItemExpr, NULL, + makeJsonFormat(JS_FORMAT_DEFAULT, + JS_ENC_DEFAULT, + -1)); + if (jtc->pathspec) + pathspec = (Node *) jtc->pathspec->string; + else + { + /* Construct default path as '$."column_name"' */ + StringInfoData path; + + initStringInfo(&path); + + appendStringInfoString(&path, "$."); + escape_json(&path, jtc->name); + + pathspec = makeStringConst(path.data, -1); + } + jfexpr->pathspec = pathspec; + jfexpr->passing = passingArgs; + jfexpr->output = makeNode(JsonOutput); + jfexpr->output->typeName = jtc->typeName; + jfexpr->output->returning = makeNode(JsonReturning); + jfexpr->output->returning->format = jtc->format; + jfexpr->on_empty = jtc->on_empty; + jfexpr->on_error = jtc->on_error; + jfexpr->quotes = jtc->quotes; + jfexpr->wrapper = jtc->wrapper; + jfexpr->location = jtc->location; + + return jfexpr; +} + +/* + * Recursively transform nested columns and create child plan(s) that will be + * used to evaluate their row patterns. + */ +static JsonTablePlan * +transformJsonTableNestedColumns(JsonTableParseContext *cxt, + List *passingArgs, + List *columns) +{ + JsonTablePlan *plan = NULL; + ListCell *lc; + + /* + * If there are multiple NESTED COLUMNS clauses in 'columns', their + * respective plans will be combined using a "sibling join" plan, which + * effectively does a UNION of the sets of rows coming from each nested + * plan. + */ + foreach(lc, columns) + { + JsonTableColumn *jtc = castNode(JsonTableColumn, lfirst(lc)); + JsonTablePlan *nested; + + if (jtc->coltype != JTC_NESTED) + continue; + + if (jtc->pathspec->name == NULL) + jtc->pathspec->name = generateJsonTablePathName(cxt); + + nested = transformJsonTableColumns(cxt, jtc->columns, passingArgs, + jtc->pathspec); + + if (plan) + plan = makeJsonTableSiblingJoin(plan, nested); + else + plan = nested; + } + + return plan; +} + +/* + * Create a JsonTablePlan for given path and ON ERROR behavior. + * + * colMin and colMin give the range of columns computed by this scan in the + * global flat list of column expressions that will be passed to the + * JSON_TABLE's TableFunc. Both are -1 when all of columns are nested and + * thus computed by 'childplan'. + */ +static JsonTablePlan * +makeJsonTablePathScan(JsonTablePathSpec *pathspec, bool errorOnError, + int colMin, int colMax, + JsonTablePlan *childplan) +{ + JsonTablePathScan *scan = makeNode(JsonTablePathScan); + char *pathstring; + Const *value; + + Assert(IsA(pathspec->string, A_Const)); + pathstring = castNode(A_Const, pathspec->string)->val.sval.sval; + value = makeConst(JSONPATHOID, -1, InvalidOid, -1, + DirectFunctionCall1(jsonpath_in, + CStringGetDatum(pathstring)), + false, false); + + scan->plan.type = T_JsonTablePathScan; + scan->path = makeJsonTablePath(value, pathspec->name); + scan->errorOnError = errorOnError; + + scan->child = childplan; + + scan->colMin = colMin; + scan->colMax = colMax; + + return (JsonTablePlan *) scan; +} + +/* + * Create a JsonTablePlan that will perform a join of the rows coming from + * 'lplan' and 'rplan'. + * + * The default way of "joining" the rows is to perform a UNION between the + * sets of rows from 'lplan' and 'rplan'. + */ +static JsonTablePlan * +makeJsonTableSiblingJoin(JsonTablePlan *lplan, JsonTablePlan *rplan) +{ + JsonTableSiblingJoin *join = makeNode(JsonTableSiblingJoin); + + join->plan.type = T_JsonTableSiblingJoin; + join->lplan = lplan; + join->rplan = rplan; + + return (JsonTablePlan *) join; +} diff --git a/src/backend/parser/parse_merge.c b/src/backend/parser/parse_merge.c index 91b1156d9918d..87df79027d7fb 100644 --- a/src/backend/parser/parse_merge.c +++ b/src/backend/parser/parse_merge.c @@ -3,7 +3,7 @@ * parse_merge.c * handle merge-statement in parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -16,20 +16,17 @@ #include "postgres.h" #include "access/sysattr.h" -#include "miscadmin.h" #include "nodes/makefuncs.h" #include "parser/analyze.h" -#include "parser/parse_collate.h" -#include "parser/parsetree.h" -#include "parser/parser.h" #include "parser/parse_clause.h" +#include "parser/parse_collate.h" #include "parser/parse_cte.h" #include "parser/parse_expr.h" #include "parser/parse_merge.h" #include "parser/parse_relation.h" #include "parser/parse_target.h" +#include "parser/parsetree.h" #include "utils/rel.h" -#include "utils/relcache.h" static void setNamespaceForMergeWhen(ParseState *pstate, MergeWhenClause *mergeWhenClause, @@ -43,9 +40,9 @@ static void setNamespaceVisibilityForRTE(List *namespace, RangeTblEntry *rte, * Make appropriate changes to the namespace visibility while transforming * individual action's quals and targetlist expressions. In particular, for * INSERT actions we must only see the source relation (since INSERT action is - * invoked for NOT MATCHED tuples and hence there is no target tuple to deal - * with). On the other hand, UPDATE and DELETE actions can see both source and - * target relations. + * invoked for NOT MATCHED [BY TARGET] tuples and hence there is no target + * tuple to deal with). On the other hand, UPDATE and DELETE actions can see + * both source and target relations, unless invoked for NOT MATCHED BY SOURCE. * * Also, since the internal join node can hide the source and target * relations, we must explicitly make the respective relation as visible so @@ -61,7 +58,7 @@ setNamespaceForMergeWhen(ParseState *pstate, MergeWhenClause *mergeWhenClause, targetRelRTE = rt_fetch(targetRTI, pstate->p_rtable); sourceRelRTE = rt_fetch(sourceRTI, pstate->p_rtable); - if (mergeWhenClause->matched) + if (mergeWhenClause->matchKind == MERGE_WHEN_MATCHED) { Assert(mergeWhenClause->commandType == CMD_UPDATE || mergeWhenClause->commandType == CMD_DELETE || @@ -73,11 +70,25 @@ setNamespaceForMergeWhen(ParseState *pstate, MergeWhenClause *mergeWhenClause, setNamespaceVisibilityForRTE(pstate->p_namespace, sourceRelRTE, true, true); } - else + else if (mergeWhenClause->matchKind == MERGE_WHEN_NOT_MATCHED_BY_SOURCE) + { + /* + * NOT MATCHED BY SOURCE actions can see the target relation, but they + * can't see the source relation. + */ + Assert(mergeWhenClause->commandType == CMD_UPDATE || + mergeWhenClause->commandType == CMD_DELETE || + mergeWhenClause->commandType == CMD_NOTHING); + setNamespaceVisibilityForRTE(pstate->p_namespace, + targetRelRTE, true, true); + setNamespaceVisibilityForRTE(pstate->p_namespace, + sourceRelRTE, false, false); + } + else /* MERGE_WHEN_NOT_MATCHED_BY_TARGET */ { /* - * NOT MATCHED actions can't see target relation, but they can see - * source relation. + * NOT MATCHED [BY TARGET] actions can't see target relation, but they + * can see source relation. */ Assert(mergeWhenClause->commandType == CMD_INSERT || mergeWhenClause->commandType == CMD_NOTHING); @@ -98,10 +109,9 @@ transformMergeStmt(ParseState *pstate, MergeStmt *stmt) Query *qry = makeNode(Query); ListCell *l; AclMode targetPerms = ACL_NO_RIGHTS; - bool is_terminal[2]; + bool is_terminal[NUM_MERGE_MATCH_KINDS]; Index sourceRTI; List *mergeActionList; - Node *joinExpr; ParseNamespaceItem *nsitem; /* There can't be any outer WITH to worry about */ @@ -125,15 +135,19 @@ transformMergeStmt(ParseState *pstate, MergeStmt *stmt) /* * Check WHEN clauses for permissions and sanity */ - is_terminal[0] = false; - is_terminal[1] = false; + is_terminal[MERGE_WHEN_MATCHED] = false; + is_terminal[MERGE_WHEN_NOT_MATCHED_BY_SOURCE] = false; + is_terminal[MERGE_WHEN_NOT_MATCHED_BY_TARGET] = false; foreach(l, stmt->mergeWhenClauses) { MergeWhenClause *mergeWhenClause = (MergeWhenClause *) lfirst(l); - int when_type = (mergeWhenClause->matched ? 0 : 1); /* - * Collect action types so we can check target permissions + * Collect permissions to check, according to action types. We require + * SELECT privileges for DO NOTHING because it'd be irregular to have + * a target relation with zero privileges checked, in case DO NOTHING + * is the only action. There's no damage from that: any meaningful + * MERGE command requires at least some access to the table anyway. */ switch (mergeWhenClause->commandType) { @@ -147,6 +161,7 @@ transformMergeStmt(ParseState *pstate, MergeStmt *stmt) targetPerms |= ACL_DELETE; break; case CMD_NOTHING: + targetPerms |= ACL_SELECT; break; default: elog(ERROR, "unknown action in MERGE WHEN clause"); @@ -155,40 +170,39 @@ transformMergeStmt(ParseState *pstate, MergeStmt *stmt) /* * Check for unreachable WHEN clauses */ - if (is_terminal[when_type]) + if (is_terminal[mergeWhenClause->matchKind]) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("unreachable WHEN clause specified after unconditional WHEN clause"))); if (mergeWhenClause->condition == NULL) - is_terminal[when_type] = true; + is_terminal[mergeWhenClause->matchKind] = true; } /* * Set up the MERGE target table. The target table is added to the * namespace below and to joinlist in transform_MERGE_to_join, so don't do * it here. + * + * Initially mergeTargetRelation is the same as resultRelation, so data is + * read from the table being updated. However, that might be changed by + * the rewriter, if the target is a trigger-updatable view, to allow + * target data to be read from the expanded view query while updating the + * original view relation. */ qry->resultRelation = setTargetTable(pstate, stmt->relation, stmt->relation->inh, false, targetPerms); + qry->mergeTargetRelation = qry->resultRelation; - /* - * MERGE is unsupported in various cases - */ + /* The target relation must be a table or a view */ if (pstate->p_target_relation->rd_rel->relkind != RELKIND_RELATION && - pstate->p_target_relation->rd_rel->relkind != RELKIND_PARTITIONED_TABLE) + pstate->p_target_relation->rd_rel->relkind != RELKIND_PARTITIONED_TABLE && + pstate->p_target_relation->rd_rel->relkind != RELKIND_VIEW) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot execute MERGE on relation \"%s\"", RelationGetRelationName(pstate->p_target_relation)), errdetail_relkind_not_supported(pstate->p_target_relation->rd_rel->relkind))); - if (pstate->p_target_relation->rd_rules != NULL && - pstate->p_target_relation->rd_rules->numLocks > 0) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot execute MERGE on relation \"%s\"", - RelationGetRelationName(pstate->p_target_relation)), - errdetail("MERGE is not supported for relations with rules."))); /* Now transform the source relation to produce the source RTE. */ transformFromClause(pstate, @@ -222,16 +236,19 @@ transformMergeStmt(ParseState *pstate, MergeStmt *stmt) * side, so add that to the namespace. */ addNSItemToQuery(pstate, pstate->p_target_nsitem, false, true, true); - joinExpr = transformExpr(pstate, stmt->joinCondition, - EXPR_KIND_JOIN_ON); + qry->mergeJoinCondition = transformExpr(pstate, stmt->joinCondition, + EXPR_KIND_JOIN_ON); /* * Create the temporary query's jointree using the joinlist we built using - * just the source relation; the target relation is not included. The - * quals we use are the join conditions to the merge target. The join + * just the source relation; the target relation is not included. The join * will be constructed fully by transform_MERGE_to_join. */ - qry->jointree = makeFromExpr(pstate->p_joinlist, joinExpr); + qry->jointree = makeFromExpr(pstate->p_joinlist, NULL); + + /* Transform the RETURNING list, if any */ + qry->returningList = transformReturningList(pstate, stmt->returningList, + EXPR_KIND_MERGE_RETURNING); /* * We now have a good query shape, so now look at the WHEN conditions and @@ -255,11 +272,7 @@ transformMergeStmt(ParseState *pstate, MergeStmt *stmt) action = makeNode(MergeAction); action->commandType = mergeWhenClause->commandType; - action->matched = mergeWhenClause->matched; - - /* Use an outer join if any INSERT actions exist in the command. */ - if (action->commandType == CMD_INSERT) - qry->mergeUseOuterJoin = true; + action->matchKind = mergeWhenClause->matchKind; /* * Set namespace for the specific action. This must be done before @@ -390,9 +403,6 @@ transformMergeStmt(ParseState *pstate, MergeStmt *stmt) qry->mergeActionList = mergeActionList; - /* RETURNING could potentially be added in the future, but not in SQL std */ - qry->returningList = NULL; - qry->hasTargetSRFs = false; qry->hasSubLinks = pstate->p_hasSubLinks; diff --git a/src/backend/parser/parse_node.c b/src/backend/parser/parse_node.c index 5020b9f081015..9361b5252d89a 100644 --- a/src/backend/parser/parse_node.c +++ b/src/backend/parser/parse_node.c @@ -3,7 +3,7 @@ * parse_node.c * various routines that make nodes for querytrees * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,14 +22,9 @@ #include "nodes/miscnodes.h" #include "nodes/nodeFuncs.h" #include "nodes/subscripting.h" -#include "parser/parse_coerce.h" -#include "parser/parse_expr.h" -#include "parser/parse_relation.h" -#include "parser/parsetree.h" +#include "parser/parse_node.h" #include "utils/builtins.h" #include "utils/lsyscache.h" -#include "utils/syscache.h" -#include "utils/varbit.h" static void pcb_error_callback(void *arg); diff --git a/src/backend/parser/parse_oper.c b/src/backend/parser/parse_oper.c index bdc8f8e26afcf..8dcc831c76fd5 100644 --- a/src/backend/parser/parse_oper.c +++ b/src/backend/parser/parse_oper.c @@ -3,7 +3,7 @@ * parse_oper.c * handle operator things for parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -70,9 +70,7 @@ static FuncDetailCode oper_select_candidate(int nargs, Oid *input_typeids, FuncCandidateList candidates, Oid *operOid); -static const char *op_signature_string(List *op, char oprkind, - Oid arg1, Oid arg2); -static void op_error(ParseState *pstate, List *op, char oprkind, +static void op_error(ParseState *pstate, List *op, Oid arg1, Oid arg2, FuncDetailCode fdresult, int location); static bool make_oper_cache_key(ParseState *pstate, OprCacheKey *key, @@ -110,26 +108,16 @@ LookupOperName(ParseState *pstate, List *opername, Oid oprleft, Oid oprright, /* we don't use op_error here because only an exact match is wanted */ if (!noError) { - char oprkind; - - if (!OidIsValid(oprleft)) - oprkind = 'l'; - else if (OidIsValid(oprright)) - oprkind = 'b'; - else - { + if (!OidIsValid(oprright)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("postfix operators are not supported"), parser_errposition(pstate, location))); - oprkind = 0; /* keep compiler quiet */ - } ereport(ERROR, (errcode(ERRCODE_UNDEFINED_FUNCTION), errmsg("operator does not exist: %s", - op_signature_string(opername, oprkind, - oprleft, oprright)), + op_signature_string(opername, oprleft, oprright)), parser_errposition(pstate, location))); } @@ -446,7 +434,7 @@ oper(ParseState *pstate, List *opname, Oid ltypeId, Oid rtypeId, make_oper_cache_entry(&key, operOid); } else if (!noError) - op_error(pstate, opname, 'b', ltypeId, rtypeId, fdresult, location); + op_error(pstate, opname, ltypeId, rtypeId, fdresult, location); return (Operator) tup; } @@ -483,7 +471,7 @@ compatible_oper(ParseState *pstate, List *op, Oid arg1, Oid arg2, ereport(ERROR, (errcode(ERRCODE_UNDEFINED_FUNCTION), errmsg("operator requires run-time type coercion: %s", - op_signature_string(op, 'b', arg1, arg2)), + op_signature_string(op, arg1, arg2)), parser_errposition(pstate, location))); return (Operator) NULL; @@ -597,7 +585,7 @@ left_oper(ParseState *pstate, List *op, Oid arg, bool noError, int location) make_oper_cache_entry(&key, operOid); } else if (!noError) - op_error(pstate, op, 'l', InvalidOid, arg, fdresult, location); + op_error(pstate, op, InvalidOid, arg, fdresult, location); return (Operator) tup; } @@ -610,14 +598,14 @@ left_oper(ParseState *pstate, List *op, Oid arg, bool noError, int location) * This is typically used in the construction of operator-not-found error * messages. */ -static const char * -op_signature_string(List *op, char oprkind, Oid arg1, Oid arg2) +const char * +op_signature_string(List *op, Oid arg1, Oid arg2) { StringInfoData argbuf; initStringInfo(&argbuf); - if (oprkind != 'l') + if (OidIsValid(arg1)) appendStringInfo(&argbuf, "%s ", format_type_be(arg1)); appendStringInfoString(&argbuf, NameListToString(op)); @@ -631,7 +619,7 @@ op_signature_string(List *op, char oprkind, Oid arg1, Oid arg2) * op_error - utility routine to complain about an unresolvable operator */ static void -op_error(ParseState *pstate, List *op, char oprkind, +op_error(ParseState *pstate, List *op, Oid arg1, Oid arg2, FuncDetailCode fdresult, int location) { @@ -639,7 +627,7 @@ op_error(ParseState *pstate, List *op, char oprkind, ereport(ERROR, (errcode(ERRCODE_AMBIGUOUS_FUNCTION), errmsg("operator is not unique: %s", - op_signature_string(op, oprkind, arg1, arg2)), + op_signature_string(op, arg1, arg2)), errhint("Could not choose a best candidate operator. " "You might need to add explicit type casts."), parser_errposition(pstate, location))); @@ -647,7 +635,7 @@ op_error(ParseState *pstate, List *op, char oprkind, ereport(ERROR, (errcode(ERRCODE_UNDEFINED_FUNCTION), errmsg("operator does not exist: %s", - op_signature_string(op, oprkind, arg1, arg2)), + op_signature_string(op, arg1, arg2)), (!arg1 || !arg2) ? errhint("No operator matches the given name and argument type. " "You might need to add an explicit type cast.") : @@ -713,7 +701,6 @@ make_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree, (errcode(ERRCODE_UNDEFINED_FUNCTION), errmsg("operator is only a shell: %s", op_signature_string(opname, - opform->oprkind, opform->oprleft, opform->oprright)), parser_errposition(pstate, location))); @@ -827,7 +814,6 @@ make_scalar_array_op(ParseState *pstate, List *opname, (errcode(ERRCODE_UNDEFINED_FUNCTION), errmsg("operator is only a shell: %s", op_signature_string(opname, - opform->oprkind, opform->oprleft, opform->oprright)), parser_errposition(pstate, location))); diff --git a/src/backend/parser/parse_param.c b/src/backend/parser/parse_param.c index 2240284f21cf5..dbf1a7dff089b 100644 --- a/src/backend/parser/parse_param.c +++ b/src/backend/parser/parse_param.c @@ -12,7 +12,7 @@ * Note that other approaches to parameters are possible using the parser * hooks defined in ParseState. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 41d60494b9771..2f64eaf0e371a 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -3,7 +3,7 @@ * parse_relation.c * parser support routines dealing with relations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -1392,6 +1392,7 @@ buildNSItemFromLists(RangeTblEntry *rte, Index rtindex, nsitem->p_names = rte->eref; nsitem->p_rte = rte; nsitem->p_rtindex = rtindex; + nsitem->p_perminfo = NULL; nsitem->p_nscolumns = nscolumns; /* set default visibility flags; might get changed later */ nsitem->p_rel_visible = true; @@ -1499,6 +1500,7 @@ addRangeTableEntry(ParseState *pstate, */ rel = parserOpenTable(pstate, relation, lockmode); rte->relid = RelationGetRelid(rel); + rte->inh = inh; rte->relkind = rel->rd_rel->relkind; rte->rellockmode = lockmode; @@ -1516,7 +1518,6 @@ addRangeTableEntry(ParseState *pstate, * which is the right thing for all except target tables. */ rte->lateral = false; - rte->inh = inh; rte->inFromCl = inFromCl; perminfo = addRTEPermissionInfo(&pstate->p_rteperminfos, rte); @@ -1584,6 +1585,7 @@ addRangeTableEntryForRelation(ParseState *pstate, rte->rtekind = RTE_RELATION; rte->alias = alias; rte->relid = RelationGetRelid(rel); + rte->inh = inh; rte->relkind = rel->rd_rel->relkind; rte->rellockmode = lockmode; @@ -1601,7 +1603,6 @@ addRangeTableEntryForRelation(ParseState *pstate, * which is the right thing for all except target tables. */ rte->lateral = false; - rte->inh = inh; rte->inFromCl = inFromCl; perminfo = addRTEPermissionInfo(&pstate->p_rteperminfos, rte); @@ -1699,7 +1700,6 @@ addRangeTableEntryForSubquery(ParseState *pstate, * addRTEPermissionInfo(). */ rte->lateral = lateral; - rte->inh = false; /* never true for subqueries */ rte->inFromCl = inFromCl; /* @@ -2022,7 +2022,6 @@ addRangeTableEntryForFunction(ParseState *pstate, * ExecCheckPermissions()), so no need to perform addRTEPermissionInfo(). */ rte->lateral = lateral; - rte->inh = false; /* never true for functions */ rte->inFromCl = inFromCl; /* @@ -2072,8 +2071,6 @@ addRangeTableEntryForTableFunc(ParseState *pstate, Assert(list_length(tf->coltypmods) == list_length(tf->colnames)); Assert(list_length(tf->colcollations) == list_length(tf->colnames)); - refname = alias ? alias->aliasname : pstrdup("xmltable"); - rte->rtekind = RTE_TABLEFUNC; rte->relid = InvalidOid; rte->subquery = NULL; @@ -2083,6 +2080,8 @@ addRangeTableEntryForTableFunc(ParseState *pstate, rte->colcollations = tf->colcollations; rte->alias = alias; + refname = alias ? alias->aliasname : + pstrdup(tf->functype == TFT_XMLTABLE ? "xmltable" : "json_table"); eref = alias ? copyObject(alias) : makeAlias(refname, NIL); numaliases = list_length(eref->colnames); @@ -2095,7 +2094,7 @@ addRangeTableEntryForTableFunc(ParseState *pstate, ereport(ERROR, (errcode(ERRCODE_INVALID_COLUMN_REFERENCE), errmsg("%s function has %d columns available but %d columns specified", - "XMLTABLE", + tf->functype == TFT_XMLTABLE ? "XMLTABLE" : "JSON_TABLE", list_length(tf->colnames), numaliases))); rte->eref = eref; @@ -2107,7 +2106,6 @@ addRangeTableEntryForTableFunc(ParseState *pstate, * ExecCheckPermissions()), so no need to perform addRTEPermissionInfo(). */ rte->lateral = lateral; - rte->inh = false; /* never true for tablefunc RTEs */ rte->inFromCl = inFromCl; /* @@ -2188,7 +2186,6 @@ addRangeTableEntryForValues(ParseState *pstate, * addRTEPermissionInfo(). */ rte->lateral = lateral; - rte->inh = false; /* never true for values RTEs */ rte->inFromCl = inFromCl; /* @@ -2279,7 +2276,6 @@ addRangeTableEntryForJoin(ParseState *pstate, * addRTEPermissionInfo(). */ rte->lateral = false; - rte->inh = false; /* never true for joins */ rte->inFromCl = inFromCl; /* @@ -2345,9 +2341,10 @@ addRangeTableEntryForCTE(ParseState *pstate, cte->cterefcount++; /* - * We throw error if the CTE is INSERT/UPDATE/DELETE without RETURNING. - * This won't get checked in case of a self-reference, but that's OK - * because data-modifying CTEs aren't allowed to be recursive anyhow. + * We throw error if the CTE is INSERT/UPDATE/DELETE/MERGE without + * RETURNING. This won't get checked in case of a self-reference, but + * that's OK because data-modifying CTEs aren't allowed to be recursive + * anyhow. */ if (IsA(cte->ctequery, Query)) { @@ -2424,7 +2421,6 @@ addRangeTableEntryForCTE(ParseState *pstate, * addRTEPermissionInfo(). */ rte->lateral = false; - rte->inh = false; /* never true for subqueries */ rte->inFromCl = inFromCl; /* @@ -2544,7 +2540,6 @@ addRangeTableEntryForENR(ParseState *pstate, * addRTEPermissionInfo(). */ rte->lateral = false; - rte->inh = false; /* never true for ENRs */ rte->inFromCl = inFromCl; /* @@ -2743,12 +2738,17 @@ expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up, { RangeTblFunction *rtfunc = (RangeTblFunction *) lfirst(lc); TypeFuncClass functypclass; - Oid funcrettype; - TupleDesc tupdesc; + Oid funcrettype = InvalidOid; + TupleDesc tupdesc = NULL; + + /* If it has a coldeflist, it returns RECORD */ + if (rtfunc->funccolnames != NIL) + functypclass = TYPEFUNC_RECORD; + else + functypclass = get_expr_result_type(rtfunc->funcexpr, + &funcrettype, + &tupdesc); - functypclass = get_expr_result_type(rtfunc->funcexpr, - &funcrettype, - &tupdesc); if (functypclass == TYPEFUNC_COMPOSITE || functypclass == TYPEFUNC_COMPOSITE_DOMAIN) { @@ -3374,6 +3374,10 @@ get_rte_attribute_is_dropped(RangeTblEntry *rte, AttrNumber attnum) { TupleDesc tupdesc; + /* If it has a coldeflist, it returns RECORD */ + if (rtfunc->funccolnames != NIL) + return false; /* can't have any dropped columns */ + tupdesc = get_expr_result_tupdesc(rtfunc->funcexpr, true); if (tupdesc) diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index 4cca97ff9c18b..ee6fcd0503a03 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -3,7 +3,7 @@ * parse_target.c * handle target lists * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -14,6 +14,7 @@ */ #include "postgres.h" +#include "catalog/namespace.h" #include "catalog/pg_type.h" #include "commands/dbcommands.h" #include "funcapi.h" @@ -22,7 +23,6 @@ #include "nodes/nodeFuncs.h" #include "parser/parse_coerce.h" #include "parser/parse_expr.h" -#include "parser/parse_func.h" #include "parser/parse_relation.h" #include "parser/parse_target.h" #include "parser/parse_type.h" @@ -30,7 +30,6 @@ #include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/rel.h" -#include "utils/typcache.h" static void markTargetListOrigin(ParseState *pstate, TargetEntry *tle, Var *var, int levelsup); @@ -821,7 +820,16 @@ transformAssignmentIndirection(ParseState *pstate, fstore->fieldnums = list_make1_int(attnum); fstore->resulttype = baseTypeId; - /* If target is a domain, apply constraints */ + /* + * If target is a domain, apply constraints. Notice that this + * isn't totally right: the expression tree we build would check + * the domain's constraints on a composite value with only this + * one field populated or updated, possibly leading to an unwanted + * failure. The rewriter will merge together any subfield + * assignments to the same table column, resulting in the domain's + * constraints being checked only once after we've assigned to all + * the fields that the INSERT or UPDATE means to. + */ if (baseTypeId != targetTypeId) return coerce_to_domain((Node *) fstore, baseTypeId, baseTypeMod, @@ -967,7 +975,12 @@ transformAssignmentSubscripts(ParseState *pstate, result = (Node *) sbsref; - /* If target was a domain over container, need to coerce up to the domain */ + /* + * If target was a domain over container, need to coerce up to the domain. + * As in transformAssignmentIndirection, this coercion is premature if the + * query assigns to multiple elements of the container; but we'll fix that + * during query rewrite. + */ if (containerType != targetTypeId) { Oid resulttype = exprType(result); @@ -1499,7 +1512,8 @@ ExpandRowReference(ParseState *pstate, Node *expr, * drill down to find the ultimate defining expression and attempt to infer * the tupdesc from it. We ereport if we can't determine the tupdesc. * - * levelsup is an extra offset to interpret the Var's varlevelsup correctly. + * levelsup is an extra offset to interpret the Var's varlevelsup correctly + * when recursing. Outside callers should pass zero. */ TupleDesc expandRecordVariable(ParseState *pstate, Var *var, int levelsup) @@ -1587,10 +1601,17 @@ expandRecordVariable(ParseState *pstate, Var *var, int levelsup) /* * Recurse into the sub-select to see what its Var refers * to. We have to build an additional level of ParseState - * to keep in step with varlevelsup in the subselect. + * to keep in step with varlevelsup in the subselect; + * furthermore, the subquery RTE might be from an outer + * query level, in which case the ParseState for the + * subselect must have that outer level as parent. */ ParseState mypstate = {0}; + Index levelsup; + /* this loop must work, since GetRTEByRangeTablePosn did */ + for (levelsup = 0; levelsup < netlevelsup; levelsup++) + pstate = pstate->parentParseState; mypstate.parentParseState = pstate; mypstate.p_rtable = rte->subquery->rtable; /* don't bother filling the rest of the fake pstate */ @@ -1641,12 +1662,11 @@ expandRecordVariable(ParseState *pstate, Var *var, int levelsup) * Recurse into the CTE to see what its Var refers to. We * have to build an additional level of ParseState to keep * in step with varlevelsup in the CTE; furthermore it - * could be an outer CTE. + * could be an outer CTE (compare SUBQUERY case above). */ - ParseState mypstate; + ParseState mypstate = {0}; Index levelsup; - MemSet(&mypstate, 0, sizeof(mypstate)); /* this loop must work, since GetCTEForRTE did */ for (levelsup = 0; levelsup < rte->ctelevelsup + netlevelsup; @@ -1800,6 +1820,10 @@ FigureColnameInternal(Node *node, char **name) /* make GROUPING() act like a regular function */ *name = "grouping"; return 2; + case T_MergeSupportFunc: + /* make MERGE_ACTION() act like a regular function */ + *name = "merge_action"; + return 2; case T_SubLink: switch (((SubLink *) node)->subLinkType) { @@ -1953,6 +1977,18 @@ FigureColnameInternal(Node *node, char **name) /* make XMLSERIALIZE act like a regular function */ *name = "xmlserialize"; return 2; + case T_JsonParseExpr: + /* make JSON act like a regular function */ + *name = "json"; + return 2; + case T_JsonScalarExpr: + /* make JSON_SCALAR act like a regular function */ + *name = "json_scalar"; + return 2; + case T_JsonSerializeExpr: + /* make JSON_SERIALIZE act like a regular function */ + *name = "json_serialize"; + return 2; case T_JsonObjectConstructor: /* make JSON_OBJECT act like a regular function */ *name = "json_object"; @@ -1970,6 +2006,25 @@ FigureColnameInternal(Node *node, char **name) /* make JSON_ARRAYAGG act like a regular function */ *name = "json_arrayagg"; return 2; + case T_JsonFuncExpr: + /* make SQL/JSON functions act like a regular function */ + switch (((JsonFuncExpr *) node)->op) + { + case JSON_EXISTS_OP: + *name = "json_exists"; + return 2; + case JSON_QUERY_OP: + *name = "json_query"; + return 2; + case JSON_VALUE_OP: + *name = "json_value"; + return 2; + /* JSON_TABLE_OP can't happen here. */ + default: + elog(ERROR, "unrecognized JsonExpr op: %d", + (int) ((JsonFuncExpr *) node)->op); + } + break; default: break; } diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c index be75dc6ab07e2..c1a937a43b4df 100644 --- a/src/backend/parser/parse_type.c +++ b/src/backend/parser/parse_type.c @@ -3,7 +3,7 @@ * parse_type.c * handle type operations for parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -537,7 +537,7 @@ LookupCollation(ParseState *pstate, List *collnames, int location) * pstate is only used for error location purposes, and can be NULL. */ Oid -GetColumnDefCollation(ParseState *pstate, ColumnDef *coldef, Oid typeOid) +GetColumnDefCollation(ParseState *pstate, const ColumnDef *coldef, Oid typeOid) { Oid result; Oid typcollation = get_typcollation(typeOid); @@ -742,7 +742,7 @@ typeStringToTypeName(const char *str, Node *escontext) ErrorContextCallback ptserrcontext; /* make sure we give useful error for empty input */ - if (strspn(str, " \t\n\r\f") == strlen(str)) + if (strspn(str, " \t\n\r\f\v") == strlen(str)) goto fail; /* diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index d67580fc77a77..eaf46ab687144 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -12,7 +12,7 @@ * respective utility commands. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/parser/parse_utilcmd.c @@ -84,7 +84,6 @@ typedef struct List *fkconstraints; /* FOREIGN KEY constraints */ List *ixconstraints; /* index-creating constraints */ List *likeclauses; /* LIKE clauses that need post-processing */ - List *extstats; /* cloned extended statistics */ List *blist; /* "before list" of things to do before * creating the table */ List *alist; /* "after list" of things to do after creating @@ -117,13 +116,14 @@ static void transformTableLikeClause(CreateStmtContext *cxt, static void transformOfType(CreateStmtContext *cxt, TypeName *ofTypename); static CreateStatsStmt *generateClonedExtStatsStmt(RangeVar *heapRel, - Oid heapRelid, Oid source_statsid); + Oid heapRelid, + Oid source_statsid, + const AttrMap *attmap); static List *get_collation(Oid collation, Oid actual_datatype); static List *get_opclass(Oid opclass, Oid actual_datatype); static void transformIndexConstraints(CreateStmtContext *cxt); static IndexStmt *transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt); -static void transformExtendedStatistics(CreateStmtContext *cxt); static void transformFKConstraints(CreateStmtContext *cxt, bool skipValidation, bool isAddConstraint); @@ -243,7 +243,6 @@ transformCreateStmt(CreateStmt *stmt, const char *queryString) cxt.fkconstraints = NIL; cxt.ixconstraints = NIL; cxt.likeclauses = NIL; - cxt.extstats = NIL; cxt.blist = NIL; cxt.alist = NIL; cxt.pkey = NULL; @@ -336,11 +335,6 @@ transformCreateStmt(CreateStmt *stmt, const char *queryString) */ transformCheckConstraints(&cxt, !cxt.isforeign); - /* - * Postprocess extended statistics. - */ - transformExtendedStatistics(&cxt); - /* * Output results. */ @@ -371,30 +365,22 @@ generateSerialExtraStmts(CreateStmtContext *cxt, ColumnDef *column, { ListCell *option; DefElem *nameEl = NULL; + DefElem *loggedEl = NULL; Oid snamespaceid; char *snamespace; char *sname; + char seqpersistence; CreateSeqStmt *seqstmt; AlterSeqStmt *altseqstmt; List *attnamelist; - int nameEl_idx = -1; /* Make a copy of this as we may end up modifying it in the code below */ seqoptions = list_copy(seqoptions); /* - * Determine namespace and name to use for the sequence. - * - * First, check if a sequence name was passed in as an option. This is - * used by pg_dump. Else, generate a name. - * - * Although we use ChooseRelationName, it's not guaranteed that the - * selected sequence name won't conflict; given sufficiently long field - * names, two different serial columns in the same table could be assigned - * the same sequence name, and we'd not notice since we aren't creating - * the sequence quite yet. In practice this seems quite unlikely to be a - * problem, especially since few people would need two serial columns in - * one table. + * Check for non-SQL-standard options (not supported within CREATE + * SEQUENCE, because they'd be redundant), and remove them from the + * seqoptions list if found. */ foreach(option, seqoptions) { @@ -405,12 +391,24 @@ generateSerialExtraStmts(CreateStmtContext *cxt, ColumnDef *column, if (nameEl) errorConflictingDefElem(defel, cxt->pstate); nameEl = defel; - nameEl_idx = foreach_current_index(option); + seqoptions = foreach_delete_current(seqoptions, option); + } + else if (strcmp(defel->defname, "logged") == 0 || + strcmp(defel->defname, "unlogged") == 0) + { + if (loggedEl) + errorConflictingDefElem(defel, cxt->pstate); + loggedEl = defel; + seqoptions = foreach_delete_current(seqoptions, option); } } + /* + * Determine namespace and name to use for the sequence. + */ if (nameEl) { + /* Use specified name */ RangeVar *rv = makeRangeVarFromNameList(castNode(List, nameEl->arg)); snamespace = rv->schemaname; @@ -424,11 +422,20 @@ generateSerialExtraStmts(CreateStmtContext *cxt, ColumnDef *column, snamespace = get_namespace_name(snamespaceid); } sname = rv->relname; - /* Remove the SEQUENCE NAME item from seqoptions */ - seqoptions = list_delete_nth_cell(seqoptions, nameEl_idx); } else { + /* + * Generate a name. + * + * Although we use ChooseRelationName, it's not guaranteed that the + * selected sequence name won't conflict; given sufficiently long + * field names, two different serial columns in the same table could + * be assigned the same sequence name, and we'd not notice since we + * aren't creating the sequence quite yet. In practice this seems + * quite unlikely to be a problem, especially since few people would + * need two serial columns in one table. + */ if (cxt->rel) snamespaceid = RelationGetNamespace(cxt->rel); else @@ -449,6 +456,30 @@ generateSerialExtraStmts(CreateStmtContext *cxt, ColumnDef *column, cxt->stmtType, sname, cxt->relation->relname, column->colname))); + /* + * Determine the persistence of the sequence. By default we copy the + * persistence of the table, but if LOGGED or UNLOGGED was specified, use + * that (as long as the table isn't TEMP). + * + * For CREATE TABLE, we get the persistence from cxt->relation, which + * comes from the CreateStmt in progress. For ALTER TABLE, the parser + * won't set cxt->relation->relpersistence, but we have cxt->rel as the + * existing table, so we copy the persistence from there. + */ + seqpersistence = cxt->rel ? cxt->rel->rd_rel->relpersistence : cxt->relation->relpersistence; + if (loggedEl) + { + if (seqpersistence == RELPERSISTENCE_TEMP) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("cannot set logged status of a temporary sequence"), + parser_errposition(cxt->pstate, loggedEl->location))); + else if (strcmp(loggedEl->defname, "logged") == 0) + seqpersistence = RELPERSISTENCE_PERMANENT; + else + seqpersistence = RELPERSISTENCE_UNLOGGED; + } + /* * Build a CREATE SEQUENCE command to create the sequence object, and add * it to the list of things to be done before this CREATE/ALTER TABLE. @@ -456,7 +487,7 @@ generateSerialExtraStmts(CreateStmtContext *cxt, ColumnDef *column, seqstmt = makeNode(CreateSeqStmt); seqstmt->for_identity = for_identity; seqstmt->sequence = makeRangeVar(snamespace, sname, -1); - seqstmt->sequence->relpersistence = cxt->relation->relpersistence; + seqstmt->sequence->relpersistence = seqpersistence; seqstmt->options = seqoptions; /* @@ -900,12 +931,6 @@ transformTableConstraint(CreateStmtContext *cxt, Constraint *constraint) errmsg("exclusion constraints are not supported on foreign tables"), parser_errposition(cxt->pstate, constraint->location))); - if (cxt->ispartitioned) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("exclusion constraints are not supported on partitioned tables"), - parser_errposition(cxt->pstate, - constraint->location))); cxt->ixconstraints = lappend(cxt->ixconstraints, constraint); break; @@ -1019,7 +1044,6 @@ transformTableLikeClause(CreateStmtContext *cxt, TableLikeClause *table_like_cla { Form_pg_attribute attribute = TupleDescAttr(tupleDesc, parent_attno - 1); - char *attributeName = NameStr(attribute->attname); ColumnDef *def; /* @@ -1031,24 +1055,12 @@ transformTableLikeClause(CreateStmtContext *cxt, TableLikeClause *table_like_cla /* * Create a new column, which is marked as NOT inherited. * - * For constraints, ONLY the NOT NULL constraint is inherited by the + * For constraints, ONLY the not-null constraint is inherited by the * new column definition per SQL99. */ - def = makeNode(ColumnDef); - def->colname = pstrdup(attributeName); - def->typeName = makeTypeNameFromOid(attribute->atttypid, - attribute->atttypmod); - def->inhcount = 0; - def->is_local = true; + def = makeColumnDef(NameStr(attribute->attname), attribute->atttypid, + attribute->atttypmod, attribute->attcollation); def->is_not_null = attribute->attnotnull; - def->is_from_type = false; - def->storage = 0; - def->raw_default = NULL; - def->cooked_default = NULL; - def->collClause = NULL; - def->collOid = attribute->attcollation; - def->constraints = NIL; - def->location = -1; /* * Add to column list @@ -1076,7 +1088,7 @@ transformTableLikeClause(CreateStmtContext *cxt, TableLikeClause *table_like_cla * find sequence owned by old column; extract sequence parameters; * build new create sequence command */ - seq_relid = getIdentitySequence(RelationGetRelid(relation), attribute->attnum, false); + seq_relid = getIdentitySequence(relation, attribute->attnum, false); seq_options = sequence_options(seq_relid); generateSerialExtraStmts(cxt, def, InvalidOid, seq_options, @@ -1118,61 +1130,25 @@ transformTableLikeClause(CreateStmtContext *cxt, TableLikeClause *table_like_cla } /* - * We cannot yet deal with defaults, CHECK constraints, or indexes, since - * we don't yet know what column numbers the copied columns will have in - * the finished table. If any of those options are specified, add the - * LIKE clause to cxt->likeclauses so that expandTableLikeClause will be - * called after we do know that. Also, remember the relation OID so that - * expandTableLikeClause is certain to open the same table. + * We cannot yet deal with defaults, CHECK constraints, indexes, or + * statistics, since we don't yet know what column numbers the copied + * columns will have in the finished table. If any of those options are + * specified, add the LIKE clause to cxt->likeclauses so that + * expandTableLikeClause will be called after we do know that. Also, + * remember the relation OID so that expandTableLikeClause is certain to + * open the same table. */ if (table_like_clause->options & (CREATE_TABLE_LIKE_DEFAULTS | CREATE_TABLE_LIKE_GENERATED | CREATE_TABLE_LIKE_CONSTRAINTS | - CREATE_TABLE_LIKE_INDEXES)) + CREATE_TABLE_LIKE_INDEXES | + CREATE_TABLE_LIKE_STATISTICS)) { table_like_clause->relationOid = RelationGetRelid(relation); cxt->likeclauses = lappend(cxt->likeclauses, table_like_clause); } - /* - * We may copy extended statistics if requested, since the representation - * of CreateStatsStmt doesn't depend on column numbers. - */ - if (table_like_clause->options & CREATE_TABLE_LIKE_STATISTICS) - { - List *parent_extstats; - ListCell *l; - - parent_extstats = RelationGetStatExtList(relation); - - foreach(l, parent_extstats) - { - Oid parent_stat_oid = lfirst_oid(l); - CreateStatsStmt *stats_stmt; - - stats_stmt = generateClonedExtStatsStmt(cxt->relation, - RelationGetRelid(relation), - parent_stat_oid); - - /* Copy comment on statistics object, if requested */ - if (table_like_clause->options & CREATE_TABLE_LIKE_COMMENTS) - { - comment = GetComment(parent_stat_oid, StatisticExtRelationId, 0); - - /* - * We make use of CreateStatsStmt's stxcomment option, so as - * not to need to know now what name the statistics will have. - */ - stats_stmt->stxcomment = comment; - } - - cxt->extstats = lappend(cxt->extstats, stats_stmt); - } - - list_free(parent_extstats); - } - /* * Close the parent rel, but keep our AccessShareLock on it until xact * commit. That will prevent someone else from deleting or ALTERing the @@ -1260,20 +1236,11 @@ expandTableLikeClause(RangeVar *heapRel, TableLikeClause *table_like_clause) (table_like_clause->options & CREATE_TABLE_LIKE_GENERATED) : (table_like_clause->options & CREATE_TABLE_LIKE_DEFAULTS))) { - Node *this_default = NULL; - AttrDefault *attrdef = constr->defval; + Node *this_default; AlterTableCmd *atsubcmd; bool found_whole_row; - /* Find default in constraint structure */ - for (int i = 0; i < constr->num_defval; i++) - { - if (attrdef[i].adnum == parent_attno) - { - this_default = stringToNode(attrdef[i].adbin); - break; - } - } + this_default = TupleDescGetDefault(tupleDesc, parent_attno); if (this_default == NULL) elog(ERROR, "default expression not found for attribute %d of relation \"%s\"", parent_attno, RelationGetRelationName(relation)); @@ -1439,6 +1406,44 @@ expandTableLikeClause(RangeVar *heapRel, TableLikeClause *table_like_clause) } } + /* + * Process extended statistics if required. + */ + if (table_like_clause->options & CREATE_TABLE_LIKE_STATISTICS) + { + List *parent_extstats; + ListCell *l; + + parent_extstats = RelationGetStatExtList(relation); + + foreach(l, parent_extstats) + { + Oid parent_stat_oid = lfirst_oid(l); + CreateStatsStmt *stats_stmt; + + stats_stmt = generateClonedExtStatsStmt(heapRel, + RelationGetRelid(childrel), + parent_stat_oid, + attmap); + + /* Copy comment on statistics object, if requested */ + if (table_like_clause->options & CREATE_TABLE_LIKE_COMMENTS) + { + comment = GetComment(parent_stat_oid, StatisticExtRelationId, 0); + + /* + * We make use of CreateStatsStmt's stxcomment option, so as + * not to need to know now what name the statistics will have. + */ + stats_stmt->stxcomment = comment; + } + + result = lappend(result, stats_stmt); + } + + list_free(parent_extstats); + } + /* Done with child rel */ table_close(childrel, NoLock); @@ -1476,20 +1481,10 @@ transformOfType(CreateStmtContext *cxt, TypeName *ofTypename) if (attr->attisdropped) continue; - n = makeNode(ColumnDef); - n->colname = pstrdup(NameStr(attr->attname)); - n->typeName = makeTypeNameFromOid(attr->atttypid, attr->atttypmod); - n->inhcount = 0; - n->is_local = true; - n->is_not_null = false; + n = makeColumnDef(NameStr(attr->attname), attr->atttypid, + attr->atttypmod, attr->attcollation); n->is_from_type = true; - n->storage = 0; - n->raw_default = NULL; - n->cooked_default = NULL; - n->collClause = NULL; - n->collOid = attr->attcollation; - n->constraints = NIL; - n->location = -1; + cxt->columns = lappend(cxt->columns, n); } ReleaseTupleDesc(tupdesc); @@ -1863,10 +1858,12 @@ generateClonedIndexStmt(RangeVar *heapRel, Relation source_idx, * Generate a CreateStatsStmt node using information from an already existing * extended statistic "source_statsid", for the rel identified by heapRel and * heapRelid. + * + * Attribute numbers in expression Vars are adjusted according to attmap. */ static CreateStatsStmt * generateClonedExtStatsStmt(RangeVar *heapRel, Oid heapRelid, - Oid source_statsid) + Oid source_statsid, const AttrMap *attmap) { HeapTuple ht_stats; Form_pg_statistic_ext statsrec; @@ -1949,10 +1946,19 @@ generateClonedExtStatsStmt(RangeVar *heapRel, Oid heapRelid, foreach(lc, exprs) { + Node *expr = (Node *) lfirst(lc); StatsElem *selem = makeNode(StatsElem); + bool found_whole_row; + + /* Adjust Vars to match new table's column numbering */ + expr = map_variable_attnos(expr, + 1, 0, + attmap, + InvalidOid, + &found_whole_row); selem->name = NULL; - selem->expr = (Node *) lfirst(lc); + selem->expr = expr; def_names = lappend(def_names, selem); } @@ -2147,7 +2153,7 @@ transformIndexConstraints(CreateStmtContext *cxt) * transformIndexConstraints. * * We return an IndexStmt. For a PRIMARY KEY constraint, we additionally - * produce NOT NULL constraints, either by marking ColumnDefs in cxt->columns + * produce not-null constraints, either by marking ColumnDefs in cxt->columns * as is_not_null or by adding an ALTER TABLE SET NOT NULL command to * cxt->alist. */ @@ -2434,7 +2440,7 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt) { /* * column is defined in the new table. For PRIMARY KEY, we - * can apply the NOT NULL constraint cheaply here ... unless + * can apply the not-null constraint cheaply here ... unless * the column is marked is_from_type, in which case marking it * here would be ineffective (see MergeAttributes). */ @@ -2450,7 +2456,7 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt) /* * column will be a system column in the new table, so accept * it. System columns can't ever be null, so no need to worry - * about PRIMARY/NOT NULL constraint. + * about PRIMARY/not-null constraint. */ found = true; } @@ -2678,19 +2684,6 @@ transformIndexConstraint(Constraint *constraint, CreateStmtContext *cxt) return index; } -/* - * transformExtendedStatistics - * Handle extended statistic objects - * - * Right now, there's nothing to do here, so we just append the list to - * the existing "after" list. - */ -static void -transformExtendedStatistics(CreateStmtContext *cxt) -{ - cxt->alist = list_concat(cxt->alist, cxt->extstats); -} - /* * transformCheckConstraints * handle CHECK constraints @@ -3329,7 +3322,6 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt, cxt.fkconstraints = NIL; cxt.ixconstraints = NIL; cxt.likeclauses = NIL; - cxt.extstats = NIL; cxt.blist = NIL; cxt.alist = NIL; cxt.pkey = NULL; @@ -3404,28 +3396,36 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt, /* * For identity column, create ALTER SEQUENCE command to - * change the data type of the sequence. + * change the data type of the sequence. Identity sequence + * is associated with the top level partitioned table. + * Hence ignore partitions. */ - attnum = get_attnum(relid, cmd->name); - if (attnum == InvalidAttrNumber) - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_COLUMN), - errmsg("column \"%s\" of relation \"%s\" does not exist", - cmd->name, RelationGetRelationName(rel)))); - - if (attnum > 0 && - TupleDescAttr(tupdesc, attnum - 1)->attidentity) + if (!RelationGetForm(rel)->relispartition) { - Oid seq_relid = getIdentitySequence(relid, attnum, false); - Oid typeOid = typenameTypeId(pstate, def->typeName); - AlterSeqStmt *altseqstmt = makeNode(AlterSeqStmt); - - altseqstmt->sequence = makeRangeVar(get_namespace_name(get_rel_namespace(seq_relid)), - get_rel_name(seq_relid), - -1); - altseqstmt->options = list_make1(makeDefElem("as", (Node *) makeTypeNameFromOid(typeOid, -1), -1)); - altseqstmt->for_identity = true; - cxt.blist = lappend(cxt.blist, altseqstmt); + attnum = get_attnum(relid, cmd->name); + if (attnum == InvalidAttrNumber) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_COLUMN), + errmsg("column \"%s\" of relation \"%s\" does not exist", + cmd->name, RelationGetRelationName(rel)))); + + if (attnum > 0 && + TupleDescAttr(tupdesc, attnum - 1)->attidentity) + { + Oid seq_relid = getIdentitySequence(rel, attnum, false); + Oid typeOid = typenameTypeId(pstate, def->typeName); + AlterSeqStmt *altseqstmt = makeNode(AlterSeqStmt); + + altseqstmt->sequence + = makeRangeVar(get_namespace_name(get_rel_namespace(seq_relid)), + get_rel_name(seq_relid), + -1); + altseqstmt->options = list_make1(makeDefElem("as", + (Node *) makeTypeNameFromOid(typeOid, -1), + -1)); + altseqstmt->for_identity = true; + cxt.blist = lappend(cxt.blist, altseqstmt); + } } newcmds = lappend(newcmds, cmd); @@ -3491,7 +3491,7 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt, errmsg("column \"%s\" of relation \"%s\" does not exist", cmd->name, RelationGetRelationName(rel)))); - seq_relid = getIdentitySequence(relid, attnum, true); + seq_relid = getIdentitySequence(rel, attnum, true); if (seq_relid) { @@ -3598,20 +3598,17 @@ transformAlterTableStmt(Oid relid, AlterTableStmt *stmt, { newcmd = makeNode(AlterTableCmd); newcmd->subtype = AT_AddConstraint; - newcmd->def = (Node *) lfirst(l); + newcmd->def = (Node *) lfirst_node(Constraint, l); newcmds = lappend(newcmds, newcmd); } foreach(l, cxt.fkconstraints) { newcmd = makeNode(AlterTableCmd); newcmd->subtype = AT_AddConstraint; - newcmd->def = (Node *) lfirst(l); + newcmd->def = (Node *) lfirst_node(Constraint, l); newcmds = lappend(newcmds, newcmd); } - /* Append extended statistics objects */ - transformExtendedStatistics(&cxt); - /* Close rel */ relation_close(rel, NoLock); diff --git a/src/backend/parser/parser.c b/src/backend/parser/parser.c index e17c310cc1a31..118488c3f30f2 100644 --- a/src/backend/parser/parser.c +++ b/src/backend/parser/parser.c @@ -10,7 +10,7 @@ * analyze.c and related files. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -21,8 +21,8 @@ #include "postgres.h" -#include "mb/pg_wchar.h" #include "gramparse.h" +#include "mb/pg_wchar.h" #include "parser/parser.h" #include "parser/scansup.h" @@ -56,12 +56,12 @@ raw_parser(const char *str, RawParseMode mode) { /* this array is indexed by RawParseMode enum */ static const int mode_token[] = { - 0, /* RAW_PARSE_DEFAULT */ - MODE_TYPE_NAME, /* RAW_PARSE_TYPE_NAME */ - MODE_PLPGSQL_EXPR, /* RAW_PARSE_PLPGSQL_EXPR */ - MODE_PLPGSQL_ASSIGN1, /* RAW_PARSE_PLPGSQL_ASSIGN1 */ - MODE_PLPGSQL_ASSIGN2, /* RAW_PARSE_PLPGSQL_ASSIGN2 */ - MODE_PLPGSQL_ASSIGN3 /* RAW_PARSE_PLPGSQL_ASSIGN3 */ + [RAW_PARSE_DEFAULT] = 0, + [RAW_PARSE_TYPE_NAME] = MODE_TYPE_NAME, + [RAW_PARSE_PLPGSQL_EXPR] = MODE_PLPGSQL_EXPR, + [RAW_PARSE_PLPGSQL_ASSIGN1] = MODE_PLPGSQL_ASSIGN1, + [RAW_PARSE_PLPGSQL_ASSIGN2] = MODE_PLPGSQL_ASSIGN2, + [RAW_PARSE_PLPGSQL_ASSIGN3] = MODE_PLPGSQL_ASSIGN3, }; yyextra.have_lookahead = true; diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l index b2216a9eacd10..c97db946110ab 100644 --- a/src/backend/parser/scan.l +++ b/src/backend/parser/scan.l @@ -22,7 +22,7 @@ * Postgres 9.2, this check is made automatically by the Makefile.) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -213,16 +213,16 @@ extern void core_yyset_column(int column_no, yyscan_t yyscanner); * versions of Postgres failed to recognize -- as a comment if the input * did not end with a newline. * - * XXX perhaps \f (formfeed) should be treated as a newline as well? + * non_newline_space tracks all the other space characters except newlines. * * XXX if you change the set of whitespace characters, fix scanner_isspace() * to agree. */ -space [ \t\n\r\f] -horiz_space [ \t\f] -newline [\n\r] -non_newline [^\n\r] +space [ \t\n\r\f\v] +non_newline_space [ \t\f\v] +newline [\n\r] +non_newline [^\n\r] comment ("--"{non_newline}*) @@ -236,8 +236,8 @@ whitespace ({space}+|{comment}) */ special_whitespace ({space}+|{comment}{newline}) -horiz_whitespace ({horiz_space}|{comment}) -whitespace_with_newline ({horiz_whitespace}*{newline}{special_whitespace}*) +non_newline_whitespace ({non_newline_space}|{comment}) +whitespace_with_newline ({non_newline_whitespace}*{newline}{special_whitespace}*) quote ' /* If we see {quote} then {quotecontinue}, the quoted string continues */ @@ -407,20 +407,35 @@ octfail 0[oO]_? binfail 0[bB]_? numeric (({decinteger}\.{decinteger}?)|(\.{decinteger})) -numericfail {decdigit}+\.\. +numericfail {decinteger}\.\. real ({decinteger}|{numeric})[Ee][-+]?{decinteger} realfail ({decinteger}|{numeric})[Ee][-+] -decinteger_junk {decinteger}{ident_start} -hexinteger_junk {hexinteger}{ident_start} -octinteger_junk {octinteger}{ident_start} -bininteger_junk {bininteger}{ident_start} -numeric_junk {numeric}{ident_start} -real_junk {real}{ident_start} +/* Positional parameters don't accept underscores. */ +param \${decdigit}+ -param \${decinteger} -param_junk \${decinteger}{ident_start} +/* + * An identifier immediately following an integer literal is disallowed because + * in some cases it's ambiguous what is meant: for example, 0x1234 could be + * either a hexinteger or a decinteger "0" and an identifier "x1234". We can + * detect such problems by seeing if integer_junk matches a longer substring + * than any of the XXXinteger patterns (decinteger, hexinteger, octinteger, + * bininteger). One "junk" pattern is sufficient because + * {decinteger}{identifier} will match all the same strings we'd match with + * {hexinteger}{identifier} etc. + * + * Note that the rule for integer_junk must appear after the ones for + * XXXinteger to make this work correctly: 0x1234 will match both hexinteger + * and integer_junk, and we need hexinteger to be chosen in that case. + * + * Also disallow strings matched by numeric_junk, real_junk and param_junk + * for consistency. + */ +integer_junk {decinteger}{identifier} +numeric_junk {numeric}{identifier} +real_junk {real}{identifier} +param_junk \${decdigit}+{identifier} other . @@ -564,7 +579,7 @@ other . ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("unsafe use of string constant with Unicode escapes"), - errdetail("String constants with Unicode escapes cannot be used when standard_conforming_strings is off."), + errdetail("String constants with Unicode escapes cannot be used when \"standard_conforming_strings\" is off."), lexer_errposition())); BEGIN(xus); startlit(); @@ -1048,19 +1063,7 @@ other . SET_YYLLOC(); yyerror("trailing junk after numeric literal"); } -{decinteger_junk} { - SET_YYLLOC(); - yyerror("trailing junk after numeric literal"); - } -{hexinteger_junk} { - SET_YYLLOC(); - yyerror("trailing junk after numeric literal"); - } -{octinteger_junk} { - SET_YYLLOC(); - yyerror("trailing junk after numeric literal"); - } -{bininteger_junk} { +{integer_junk} { SET_YYLLOC(); yyerror("trailing junk after numeric literal"); } @@ -1414,6 +1417,8 @@ unescape_single_char(unsigned char c, core_yyscan_t yyscanner) return '\r'; case 't': return '\t'; + case 'v': + return '\v'; default: /* check for backslash followed by non-7-bit-ASCII */ if (c == '\0' || IS_HIGHBIT_SET(c)) diff --git a/src/backend/parser/scansup.c b/src/backend/parser/scansup.c index ed67f5f5fe25d..164e61ef8bb30 100644 --- a/src/backend/parser/scansup.c +++ b/src/backend/parser/scansup.c @@ -3,7 +3,7 @@ * scansup.c * scanner support routines used by the core lexer * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -121,6 +121,7 @@ scanner_isspace(char ch) ch == '\t' || ch == '\n' || ch == '\r' || + ch == '\v' || ch == '\f') return true; return false; diff --git a/src/backend/partitioning/meson.build b/src/backend/partitioning/meson.build index d4a38d6b5fd44..34aec359f83ae 100644 --- a/src/backend/partitioning/meson.build +++ b/src/backend/partitioning/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'partbounds.c', diff --git a/src/backend/partitioning/partbounds.c b/src/backend/partitioning/partbounds.c index 7c5d9110fb09d..c28639d2e3f4f 100644 --- a/src/backend/partitioning/partbounds.c +++ b/src/backend/partitioning/partbounds.c @@ -3,7 +3,7 @@ * partbounds.c * Support routines for manipulating partition bounds * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -30,7 +30,6 @@ #include "parser/parse_coerce.h" #include "partitioning/partbounds.h" #include "partitioning/partdesc.h" -#include "partitioning/partprune.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/datum.h" @@ -4313,7 +4312,7 @@ get_qual_for_range(Relation parent, PartitionBoundSpec *spec, Datum datum; PartitionBoundSpec *bspec; - tuple = SearchSysCache1(RELOID, inhrelid); + tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(inhrelid)); if (!HeapTupleIsValid(tuple)) elog(ERROR, "cache lookup failed for relation %u", inhrelid); @@ -4720,8 +4719,8 @@ get_range_nulltest(PartitionKey key) * Compute the hash value for given partition key values. */ uint64 -compute_partition_hash_value(int partnatts, FmgrInfo *partsupfunc, Oid *partcollation, - Datum *values, bool *isnull) +compute_partition_hash_value(int partnatts, FmgrInfo *partsupfunc, const Oid *partcollation, + const Datum *values, const bool *isnull) { int i; uint64 rowHash = 0; diff --git a/src/backend/partitioning/partdesc.c b/src/backend/partitioning/partdesc.c index 7a2b5e57ff428..b4e0ed0e710a0 100644 --- a/src/backend/partitioning/partdesc.c +++ b/src/backend/partitioning/partdesc.c @@ -3,7 +3,7 @@ * partdesc.c * Support routines for manipulating partition descriptors * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -21,8 +21,6 @@ #include "catalog/pg_inherits.h" #include "partitioning/partbounds.h" #include "partitioning/partdesc.h" -#include "storage/bufmgr.h" -#include "storage/sinval.h" #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/hsearch.h" @@ -31,6 +29,7 @@ #include "utils/memutils.h" #include "utils/partcache.h" #include "utils/rel.h" +#include "utils/snapmgr.h" #include "utils/syscache.h" typedef struct PartitionDirectoryData @@ -146,16 +145,19 @@ RelationBuildPartitionDesc(Relation rel, bool omit_detached) ListCell *cell; int i, nparts; + bool retried = false; PartitionKey key = RelationGetPartitionKey(rel); MemoryContext new_pdcxt; MemoryContext oldcxt; int *mapping; +retry: + /* * Get partition oids from pg_inherits. This uses a single snapshot to * fetch the list of children, so while more children may be getting added - * concurrently, whatever this function returns will be accurate as of - * some well-defined point in time. + * or removed concurrently, whatever this function returns will be + * accurate as of some well-defined point in time. */ detached_exist = false; detached_xmin = InvalidTransactionId; @@ -183,7 +185,7 @@ RelationBuildPartitionDesc(Relation rel, bool omit_detached) PartitionBoundSpec *boundspec = NULL; /* Try fetching the tuple from the catcache, for speed. */ - tuple = SearchSysCache1(RELOID, inhrelid); + tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(inhrelid)); if (HeapTupleIsValid(tuple)) { Datum datum; @@ -198,26 +200,33 @@ RelationBuildPartitionDesc(Relation rel, bool omit_detached) } /* - * The system cache may be out of date; if so, we may find no pg_class - * tuple or an old one where relpartbound is NULL. In that case, try - * the table directly. We can't just AcceptInvalidationMessages() and - * retry the system cache lookup because it's possible that a - * concurrent ATTACH PARTITION operation has removed itself from the - * ProcArray but not yet added invalidation messages to the shared - * queue; InvalidateSystemCaches() would work, but seems excessive. + * Two problems are possible here. First, a concurrent ATTACH + * PARTITION might be in the process of adding a new partition, but + * the syscache doesn't have it, or its copy of it does not yet have + * its relpartbound set. We cannot just AcceptInvalidationMessages(), + * because the other process might have already removed itself from + * the ProcArray but not yet added its invalidation messages to the + * shared queue. We solve this problem by reading pg_class directly + * for the desired tuple. + * + * If the partition recently detached is also dropped, we get no tuple + * from the scan. In that case, we also retry, and next time through + * here, we don't see that partition anymore. * - * Note that this algorithm assumes that PartitionBoundSpec we manage - * to fetch is the right one -- so this is only good enough for - * concurrent ATTACH PARTITION, not concurrent DETACH PARTITION or - * some hypothetical operation that changes the partition bounds. + * The other problem is that DETACH CONCURRENTLY is in the process of + * removing a partition, which happens in two steps: first it marks it + * as "detach pending", commits, then unsets relpartbound. If + * find_inheritance_children_extended included that partition but we + * below we see that DETACH CONCURRENTLY has reset relpartbound for + * it, we'd see an inconsistent view. (The inconsistency is seen + * because table_open below reads invalidation messages.) We protect + * against this by retrying find_inheritance_children_extended(). */ if (boundspec == NULL) { Relation pg_class; SysScanDesc scan; ScanKeyData key[1]; - Datum datum; - bool isnull; pg_class = table_open(RelationRelationId, AccessShareLock); ScanKeyInit(&key[0], @@ -226,13 +235,44 @@ RelationBuildPartitionDesc(Relation rel, bool omit_detached) ObjectIdGetDatum(inhrelid)); scan = systable_beginscan(pg_class, ClassOidIndexId, true, NULL, 1, key); + + /* + * We could get one tuple from the scan (the normal case), or zero + * tuples if the table has been dropped meanwhile. + */ tuple = systable_getnext(scan); - datum = heap_getattr(tuple, Anum_pg_class_relpartbound, - RelationGetDescr(pg_class), &isnull); - if (!isnull) - boundspec = stringToNode(TextDatumGetCString(datum)); + if (HeapTupleIsValid(tuple)) + { + Datum datum; + bool isnull; + + datum = heap_getattr(tuple, Anum_pg_class_relpartbound, + RelationGetDescr(pg_class), &isnull); + if (!isnull) + boundspec = stringToNode(TextDatumGetCString(datum)); + } systable_endscan(scan); table_close(pg_class, AccessShareLock); + + /* + * If we still don't get a relpartbound value (either because + * boundspec is null or because there was no tuple), then it must + * be because of DETACH CONCURRENTLY. Restart from the top, as + * explained above. We only do this once, for two reasons: first, + * only one DETACH CONCURRENTLY session could affect us at a time, + * since each of them would have to wait for the snapshot under + * which this is running; and second, to avoid possible infinite + * loops in case of catalog corruption. + * + * Note that the current memory context is short-lived enough, so + * we needn't worry about memory leaks here. + */ + if (!boundspec && !retried) + { + AcceptInvalidationMessages(); + retried = true; + goto retry; + } } /* Sanity checks. */ diff --git a/src/backend/partitioning/partprune.c b/src/backend/partitioning/partprune.c index 7179b22a057d7..9a1a7faac7ad9 100644 --- a/src/backend/partitioning/partprune.c +++ b/src/backend/partitioning/partprune.c @@ -25,7 +25,7 @@ * * See gen_partprune_steps_internal() for more details on step generation. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -52,7 +52,6 @@ #include "parser/parsetree.h" #include "partitioning/partbounds.h" #include "partitioning/partprune.h" -#include "rewrite/rewriteManip.h" #include "utils/array.h" #include "utils/lsyscache.h" @@ -82,7 +81,7 @@ typedef enum PartClauseMatchStatus PARTCLAUSE_MATCH_NULLNESS, PARTCLAUSE_MATCH_STEPS, PARTCLAUSE_MATCH_CONTRADICT, - PARTCLAUSE_UNSUPPORTED + PARTCLAUSE_UNSUPPORTED, } PartClauseMatchStatus; /* @@ -93,7 +92,7 @@ typedef enum PartClauseTarget { PARTTARGET_PLANNER, /* want to prune during planning */ PARTTARGET_INITIAL, /* want to prune during executor startup */ - PARTTARGET_EXEC /* want to prune during each plan node scan */ + PARTTARGET_EXEC, /* want to prune during each plan node scan */ } PartClauseTarget; /* @@ -167,7 +166,6 @@ static List *get_steps_using_prefix(GeneratePruningStepsContext *context, bool step_op_is_ne, Expr *step_lastexpr, Oid step_lastcmpfn, - int step_lastkeyno, Bitmapset *step_nullkeys, List *prefix); static List *get_steps_using_prefix_recurse(GeneratePruningStepsContext *context, @@ -175,7 +173,6 @@ static List *get_steps_using_prefix_recurse(GeneratePruningStepsContext *context bool step_op_is_ne, Expr *step_lastexpr, Oid step_lastcmpfn, - int step_lastkeyno, Bitmapset *step_nullkeys, List *prefix, ListCell *start, @@ -202,7 +199,7 @@ static PartClauseMatchStatus match_boolean_partition_clause(Oid partopfamily, Expr *clause, Expr *partkey, Expr **outconst, - bool *noteq); + bool *notclause); static void partkey_datum_from_expr(PartitionPruneContext *context, Expr *expr, int stateidx, Datum *value, bool *isnull); @@ -1531,7 +1528,6 @@ gen_prune_steps_from_opexps(GeneratePruningStepsContext *context, pc->op_is_ne, pc->expr, pc->cmpfn, - 0, NULL, NIL); opsteps = list_concat(opsteps, pc_steps); @@ -1657,7 +1653,6 @@ gen_prune_steps_from_opexps(GeneratePruningStepsContext *context, pc->op_is_ne, pc->expr, pc->cmpfn, - pc->keyno, NULL, prefix); opsteps = list_concat(opsteps, pc_steps); @@ -1731,7 +1726,6 @@ gen_prune_steps_from_opexps(GeneratePruningStepsContext *context, false, pc->expr, pc->cmpfn, - pc->keyno, nullkeys, prefix); opsteps = list_concat(opsteps, pc_steps); @@ -1803,23 +1797,75 @@ match_clause_to_partition_key(GeneratePruningStepsContext *context, Oid partopfamily = part_scheme->partopfamily[partkeyidx], partcoll = part_scheme->partcollation[partkeyidx]; Expr *expr; - bool noteq; + bool notclause; /* * Recognize specially shaped clauses that match a Boolean partition key. */ boolmatchstatus = match_boolean_partition_clause(partopfamily, clause, - partkey, &expr, ¬eq); + partkey, &expr, + ¬clause); if (boolmatchstatus == PARTCLAUSE_MATCH_CLAUSE) { PartClauseInfo *partclause; + /* + * For bool tests in the form of partkey IS NOT true and IS NOT false, + * we invert these clauses. Effectively, "partkey IS NOT true" + * becomes "partkey IS false OR partkey IS NULL". We do this by + * building an OR BoolExpr and forming a clause just like that and + * punt it off to gen_partprune_steps_internal() to generate pruning + * steps. + */ + if (notclause) + { + List *new_clauses; + List *or_clause; + BooleanTest *new_booltest = (BooleanTest *) copyObject(clause); + NullTest *nulltest; + + /* We expect 'notclause' to only be set to true for BooleanTests */ + Assert(IsA(clause, BooleanTest)); + + /* reverse the bool test */ + if (new_booltest->booltesttype == IS_NOT_TRUE) + new_booltest->booltesttype = IS_FALSE; + else if (new_booltest->booltesttype == IS_NOT_FALSE) + new_booltest->booltesttype = IS_TRUE; + else + { + /* + * We only expect match_boolean_partition_clause to return + * PARTCLAUSE_MATCH_CLAUSE for IS_NOT_TRUE and IS_NOT_FALSE. + */ + Assert(false); + } + + nulltest = makeNode(NullTest); + nulltest->arg = copyObject(partkey); + nulltest->nulltesttype = IS_NULL; + nulltest->argisrow = false; + nulltest->location = -1; + + new_clauses = list_make2(new_booltest, nulltest); + or_clause = list_make1(makeBoolExpr(OR_EXPR, new_clauses, -1)); + + /* Finally, generate steps */ + *clause_steps = gen_partprune_steps_internal(context, or_clause); + + if (context->contradictory) + return PARTCLAUSE_MATCH_CONTRADICT; /* shouldn't happen */ + else if (*clause_steps == NIL) + return PARTCLAUSE_UNSUPPORTED; /* step generation failed */ + return PARTCLAUSE_MATCH_STEPS; + } + partclause = (PartClauseInfo *) palloc(sizeof(PartClauseInfo)); partclause->keyno = partkeyidx; /* Do pruning with the Boolean equality operator. */ partclause->opno = BooleanEqualOperator; - partclause->op_is_ne = noteq; + partclause->op_is_ne = false; partclause->expr = expr; /* We know that expr is of Boolean type. */ partclause->cmpfn = part_scheme->partsupfunc[partkeyidx].fn_oid; @@ -1829,6 +1875,15 @@ match_clause_to_partition_key(GeneratePruningStepsContext *context, return PARTCLAUSE_MATCH_CLAUSE; } + else if (boolmatchstatus == PARTCLAUSE_MATCH_NULLNESS) + { + /* + * Handle IS UNKNOWN and IS NOT UNKNOWN. These just logically + * translate to IS NULL and IS NOT NULL. + */ + *clause_is_not_null = notclause; + return PARTCLAUSE_MATCH_NULLNESS; + } else if (IsA(clause, OpExpr) && list_length(((OpExpr *) clause)->args) == 2) { @@ -1889,9 +1944,11 @@ match_clause_to_partition_key(GeneratePruningStepsContext *context, * whatsoever, but their negators (equality) are. We can use one of * those if we find it, but only for list partitioning. * - * Note: we report NOMATCH on failure, in case a later partkey has the - * same expression but different opfamily. That's unlikely, but not - * much more so than duplicate expressions with different collations. + * Note: we report NOMATCH on failure if the negator isn't the + * equality operator for the partkey's opfamily as other partkeys may + * have the same expression but different opfamily. That's unlikely, + * but not much more so than duplicate expressions with different + * collations. */ if (op_in_opfamily(opno, partopfamily)) { @@ -1901,8 +1958,9 @@ match_clause_to_partition_key(GeneratePruningStepsContext *context, } else { + /* not supported for anything apart from LIST partitioned tables */ if (part_scheme->strategy != PARTITION_STRATEGY_LIST) - return PARTCLAUSE_NOMATCH; + return PARTCLAUSE_UNSUPPORTED; /* See if the negator is equality */ negator = get_negator(opno); @@ -2350,25 +2408,31 @@ match_clause_to_partition_key(GeneratePruningStepsContext *context, /* * get_steps_using_prefix - * Generate list of PartitionPruneStepOp steps each consisting of given - * opstrategy - * - * To generate steps, step_lastexpr and step_lastcmpfn are appended to - * expressions and cmpfns, respectively, extracted from the clauses in - * 'prefix'. Actually, since 'prefix' may contain multiple clauses for the - * same partition key column, we must generate steps for various combinations - * of the clauses of different keys. - * - * For list/range partitioning, callers must ensure that step_nullkeys is - * NULL, and that prefix contains at least one clause for each of the - * partition keys earlier than one specified in step_lastkeyno if it's - * greater than zero. For hash partitioning, step_nullkeys is allowed to be - * non-NULL, but they must ensure that prefix contains at least one clause - * for each of the partition keys other than those specified in step_nullkeys - * and step_lastkeyno. - * - * For both cases, callers must also ensure that clauses in prefix are sorted - * in ascending order of their partition key numbers. + * Generate a list of PartitionPruneStepOps based on the given input. + * + * 'step_lastexpr' and 'step_lastcmpfn' are the Expr and comparison function + * belonging to the final partition key that we have a clause for. 'prefix' + * is a list of PartClauseInfos for partition key numbers prior to the given + * 'step_lastexpr' and 'step_lastcmpfn'. 'prefix' may contain multiple + * PartClauseInfos belonging to a single partition key. We will generate a + * PartitionPruneStepOp for each combination of the given PartClauseInfos + * using, at most, one PartClauseInfo per partition key. + * + * For LIST and RANGE partitioned tables, callers must ensure that + * step_nullkeys is NULL, and that prefix contains at least one clause for + * each of the partition keys prior to the key that 'step_lastexpr' and + * 'step_lastcmpfn' belong to. + * + * For HASH partitioned tables, callers must ensure that 'prefix' contains at + * least one clause for each of the partition keys apart from the final key + * (the expr and comparison function for the final key are in 'step_lastexpr' + * and 'step_lastcmpfn'). A bit set in step_nullkeys can substitute clauses + * in the 'prefix' list for any given key. If a bit is set in 'step_nullkeys' + * for a given key, then there must be no PartClauseInfo for that key in the + * 'prefix' list. + * + * For each of the above cases, callers must ensure that PartClauseInfos in + * 'prefix' are sorted in ascending order of keyno. */ static List * get_steps_using_prefix(GeneratePruningStepsContext *context, @@ -2376,14 +2440,17 @@ get_steps_using_prefix(GeneratePruningStepsContext *context, bool step_op_is_ne, Expr *step_lastexpr, Oid step_lastcmpfn, - int step_lastkeyno, Bitmapset *step_nullkeys, List *prefix) { + /* step_nullkeys must be empty for RANGE and LIST partitioned tables */ Assert(step_nullkeys == NULL || context->rel->part_scheme->strategy == PARTITION_STRATEGY_HASH); - /* Quick exit if there are no values to prefix with. */ + /* + * No recursive processing is required when 'prefix' is an empty list. + * This occurs when there is only 1 partition key column. + */ if (prefix == NIL) { PartitionPruneStep *step; @@ -2397,13 +2464,12 @@ get_steps_using_prefix(GeneratePruningStepsContext *context, return list_make1(step); } - /* Recurse to generate steps for various combinations. */ + /* Recurse to generate steps for every combination of clauses. */ return get_steps_using_prefix_recurse(context, step_opstrategy, step_op_is_ne, step_lastexpr, step_lastcmpfn, - step_lastkeyno, step_nullkeys, prefix, list_head(prefix), @@ -2412,13 +2478,17 @@ get_steps_using_prefix(GeneratePruningStepsContext *context, /* * get_steps_using_prefix_recurse - * Recursively generate combinations of clauses for different partition - * keys and start generating steps upon reaching clauses for the greatest - * column that is less than the one for which we're currently generating - * steps (that is, step_lastkeyno) + * Generate and return a list of PartitionPruneStepOps using the 'prefix' + * list of PartClauseInfos starting at the 'start' cell. * - * 'prefix' is the list of PartClauseInfos. - * 'start' is where we should start iterating for the current invocation. + * When 'prefix' contains multiple PartClauseInfos for a single partition key + * we create a PartitionPruneStepOp for each combination of duplicated + * PartClauseInfos. The returned list will contain a PartitionPruneStepOp + * for each unique combination of input PartClauseInfos containing at most one + * PartClauseInfo per partition key. + * + * 'prefix' is the input list of PartClauseInfos sorted by keyno. + * 'start' marks the cell that searching the 'prefix' list should start from. * 'step_exprs' and 'step_cmpfns' each contains the expressions and cmpfns * we've generated so far from the clauses for the previous part keys. */ @@ -2428,7 +2498,6 @@ get_steps_using_prefix_recurse(GeneratePruningStepsContext *context, bool step_op_is_ne, Expr *step_lastexpr, Oid step_lastcmpfn, - int step_lastkeyno, Bitmapset *step_nullkeys, List *prefix, ListCell *start, @@ -2438,23 +2507,25 @@ get_steps_using_prefix_recurse(GeneratePruningStepsContext *context, List *result = NIL; ListCell *lc; int cur_keyno; + int final_keyno; /* Actually, recursion would be limited by PARTITION_MAX_KEYS. */ check_stack_depth(); - /* Check if we need to recurse. */ Assert(start != NULL); cur_keyno = ((PartClauseInfo *) lfirst(start))->keyno; - if (cur_keyno < step_lastkeyno - 1) + final_keyno = ((PartClauseInfo *) llast(prefix))->keyno; + + /* Check if we need to recurse. */ + if (cur_keyno < final_keyno) { PartClauseInfo *pc; ListCell *next_start; /* - * For each clause with cur_keyno, add its expr and cmpfn to - * step_exprs and step_cmpfns, respectively, and recurse after setting - * next_start to the ListCell of the first clause for the next - * partition key. + * Find the first PartClauseInfo belonging to the next partition key, + * the next recursive call must start iteration of the prefix list + * from that point. */ for_each_cell(lc, prefix, start) { @@ -2463,8 +2534,15 @@ get_steps_using_prefix_recurse(GeneratePruningStepsContext *context, if (pc->keyno > cur_keyno) break; } + + /* record where to start iterating in the next recursive call */ next_start = lc; + /* + * For each PartClauseInfo with keyno set to cur_keyno, add its expr + * and cmpfn to step_exprs and step_cmpfns, respectively, and recurse + * using 'next_start' as the starting point in the 'prefix' list. + */ for_each_cell(lc, prefix, start) { List *moresteps; @@ -2484,6 +2562,7 @@ get_steps_using_prefix_recurse(GeneratePruningStepsContext *context, } else { + /* check the 'prefix' list is sorted correctly */ Assert(pc->keyno > cur_keyno); break; } @@ -2493,7 +2572,6 @@ get_steps_using_prefix_recurse(GeneratePruningStepsContext *context, step_op_is_ne, step_lastexpr, step_lastcmpfn, - step_lastkeyno, step_nullkeys, prefix, next_start, @@ -2512,8 +2590,8 @@ get_steps_using_prefix_recurse(GeneratePruningStepsContext *context, * each clause with cur_keyno, which is all clauses from here onward * till the end of the list. Note that for hash partitioning, * step_nullkeys is allowed to be non-empty, in which case step_exprs - * would only contain expressions for the earlier partition keys that - * are not specified in step_nullkeys. + * would only contain expressions for the partition keys that are not + * specified in step_nullkeys. */ Assert(list_length(step_exprs) == cur_keyno || !bms_is_empty(step_nullkeys)); @@ -2857,7 +2935,7 @@ get_matching_list_bounds(PartitionPruneContext *context, * multiple pruning steps might exclude it, so we infer its inclusion * elsewhere. * - * 'opstrategy' if non-zero must be a btree strategy number. + * 'opstrategy' must be a btree strategy number. * * 'values' contains Datums indexed by the partition key to use for pruning. * @@ -3582,22 +3660,23 @@ perform_pruning_combine_step(PartitionPruneContext *context, * match_boolean_partition_clause * * If we're able to match the clause to the partition key as specially-shaped - * boolean clause, set *outconst to a Const containing a true or false value, - * set *noteq according to if the clause was in the "not" form, i.e. "is not - * true" or "is not false", and return PARTCLAUSE_MATCH_CLAUSE. Returns - * PARTCLAUSE_UNSUPPORTED if the clause is not a boolean clause or if the - * boolean clause is unsuitable for partition pruning. Returns - * PARTCLAUSE_NOMATCH if it's a bool quals but just does not match this - * partition key. *outconst is set to NULL in the latter two cases. + * boolean clause, set *outconst to a Const containing a true, false or NULL + * value, set *notclause according to if the clause was in the "not" form, + * i.e. "IS NOT TRUE", "IS NOT FALSE" or "IS NOT UNKNOWN" and return + * PARTCLAUSE_MATCH_CLAUSE for "IS [NOT] (TRUE|FALSE)" clauses and + * PARTCLAUSE_MATCH_NULLNESS for "IS [NOT] UNKNOWN" clauses. Otherwise, + * return PARTCLAUSE_UNSUPPORTED if the clause cannot be used for partition + * pruning, and PARTCLAUSE_NOMATCH for supported clauses that do not match this + * 'partkey'. */ static PartClauseMatchStatus match_boolean_partition_clause(Oid partopfamily, Expr *clause, Expr *partkey, - Expr **outconst, bool *noteq) + Expr **outconst, bool *notclause) { Expr *leftop; *outconst = NULL; - *noteq = false; + *notclause = false; /* * Partitioning currently can only use built-in AMs, so checking for @@ -3610,11 +3689,6 @@ match_boolean_partition_clause(Oid partopfamily, Expr *clause, Expr *partkey, { BooleanTest *btest = (BooleanTest *) clause; - /* Only IS [NOT] TRUE/FALSE are any good to us */ - if (btest->booltesttype == IS_UNKNOWN || - btest->booltesttype == IS_NOT_UNKNOWN) - return PARTCLAUSE_UNSUPPORTED; - leftop = btest->arg; if (IsA(leftop, RelabelType)) leftop = ((RelabelType *) leftop)->arg; @@ -3624,23 +3698,28 @@ match_boolean_partition_clause(Oid partopfamily, Expr *clause, Expr *partkey, switch (btest->booltesttype) { case IS_NOT_TRUE: - *noteq = true; + *notclause = true; /* fall through */ case IS_TRUE: *outconst = (Expr *) makeBoolConst(true, false); - break; + return PARTCLAUSE_MATCH_CLAUSE; case IS_NOT_FALSE: - *noteq = true; + *notclause = true; /* fall through */ case IS_FALSE: *outconst = (Expr *) makeBoolConst(false, false); - break; + return PARTCLAUSE_MATCH_CLAUSE; + case IS_NOT_UNKNOWN: + *notclause = true; + /* fall through */ + case IS_UNKNOWN: + return PARTCLAUSE_MATCH_NULLNESS; default: return PARTCLAUSE_UNSUPPORTED; } } - if (*outconst) - return PARTCLAUSE_MATCH_CLAUSE; + /* does not match partition key */ + return PARTCLAUSE_NOMATCH; } else { @@ -3656,12 +3735,11 @@ match_boolean_partition_clause(Oid partopfamily, Expr *clause, Expr *partkey, *outconst = (Expr *) makeBoolConst(!is_not_clause, false); else if (equal(negate_clause((Node *) leftop), partkey)) *outconst = (Expr *) makeBoolConst(is_not_clause, false); + else + return PARTCLAUSE_NOMATCH; - if (*outconst) - return PARTCLAUSE_MATCH_CLAUSE; + return PARTCLAUSE_MATCH_CLAUSE; } - - return PARTCLAUSE_NOMATCH; } /* diff --git a/src/backend/po/LINGUAS b/src/backend/po/LINGUAS index a27ddd5ceaf56..77f03dafcf63e 100644 --- a/src/backend/po/LINGUAS +++ b/src/backend/po/LINGUAS @@ -1 +1 @@ -de es fr id it ja ko pl pt_BR ru sv tr uk zh_CN +de es fr id it ja ka ko pl pt_BR ru sv tr uk zh_CN diff --git a/src/backend/po/de.po b/src/backend/po/de.po index e3d9daa0413d2..63f99a49f56d2 100644 --- a/src/backend/po/de.po +++ b/src/backend/po/de.po @@ -1,14 +1,14 @@ # German message translation file for PostgreSQL server -# Peter Eisentraut , 2001 - 2023. +# Peter Eisentraut , 2001 - 2025. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 16\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-06-24 21:41+0000\n" -"PO-Revision-Date: 2023-06-26 09:43+0200\n" +"POT-Creation-Date: 2025-05-01 10:59+0000\n" +"PO-Revision-Date: 2025-05-01 21:09+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -17,6 +17,11 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +#: ../common/binaryheap.c:121 ../common/binaryheap.c:159 +#, c-format +msgid "out of binary heap slots" +msgstr "alle Slots für Binary-Heaps belegt" + #: ../common/compression.c:132 ../common/compression.c:141 #: ../common/compression.c:150 #, c-format @@ -74,64 +79,66 @@ msgstr "Komprimierungsalgorithmus »%s« unterstützt keinen Long-Distance-Modus msgid "not recorded" msgstr "nicht aufgezeichnet" -#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 -#: commands/copyfrom.c:1669 commands/extension.c:3456 utils/adt/genfile.c:123 +#: ../common/controldata_utils.c:93 ../common/controldata_utils.c:97 +#: commands/copyfrom.c:1739 commands/extension.c:3538 utils/adt/genfile.c:123 +#: utils/time/snapmgr.c:1430 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" -#: ../common/controldata_utils.c:84 ../common/controldata_utils.c:86 +#: ../common/controldata_utils.c:108 ../common/controldata_utils.c:110 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1346 access/transam/xlog.c:3193 -#: access/transam/xlog.c:3996 access/transam/xlogrecovery.c:1199 -#: access/transam/xlogrecovery.c:1291 access/transam/xlogrecovery.c:1328 -#: access/transam/xlogrecovery.c:1388 backup/basebackup.c:1842 -#: commands/extension.c:3466 libpq/hba.c:791 replication/logical/origin.c:745 -#: replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5050 -#: replication/logical/snapbuild.c:2027 replication/slot.c:1946 -#: replication/slot.c:1987 replication/walsender.c:643 +#: access/transam/twophase.c:1353 access/transam/xlog.c:3477 +#: access/transam/xlog.c:4341 access/transam/xlogrecovery.c:1238 +#: access/transam/xlogrecovery.c:1336 access/transam/xlogrecovery.c:1373 +#: access/transam/xlogrecovery.c:1440 backup/basebackup.c:2123 +#: backup/walsummary.c:283 commands/extension.c:3548 libpq/hba.c:764 +#: replication/logical/origin.c:745 replication/logical/origin.c:781 +#: replication/logical/reorderbuffer.c:5113 +#: replication/logical/snapbuild.c:2091 replication/slot.c:2236 +#: replication/slot.c:2277 replication/walsender.c:659 #: storage/file/buffile.c:470 storage/file/copydir.c:185 -#: utils/adt/genfile.c:197 utils/adt/misc.c:984 utils/cache/relmapper.c:827 +#: utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 #, c-format msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" -#: ../common/controldata_utils.c:92 ../common/controldata_utils.c:95 -#: access/transam/xlog.c:3198 access/transam/xlog.c:4001 -#: backup/basebackup.c:1846 replication/logical/origin.c:750 -#: replication/logical/origin.c:789 replication/logical/snapbuild.c:2032 -#: replication/slot.c:1950 replication/slot.c:1991 replication/walsender.c:648 -#: utils/cache/relmapper.c:831 +#: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 +#: access/transam/xlog.c:3482 access/transam/xlog.c:4346 +#: replication/logical/origin.c:750 replication/logical/origin.c:789 +#: replication/logical/snapbuild.c:2096 replication/slot.c:2240 +#: replication/slot.c:2281 replication/walsender.c:664 +#: utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" -#: ../common/controldata_utils.c:104 ../common/controldata_utils.c:108 -#: ../common/controldata_utils.c:233 ../common/controldata_utils.c:236 -#: access/heap/rewriteheap.c:1175 access/heap/rewriteheap.c:1280 +#: ../common/controldata_utils.c:128 ../common/controldata_utils.c:132 +#: ../common/controldata_utils.c:277 ../common/controldata_utils.c:280 +#: access/heap/rewriteheap.c:1141 access/heap/rewriteheap.c:1246 #: access/transam/timeline.c:392 access/transam/timeline.c:438 -#: access/transam/timeline.c:512 access/transam/twophase.c:1358 -#: access/transam/twophase.c:1770 access/transam/xlog.c:3039 -#: access/transam/xlog.c:3233 access/transam/xlog.c:3238 -#: access/transam/xlog.c:3374 access/transam/xlog.c:3966 -#: access/transam/xlog.c:4885 commands/copyfrom.c:1729 commands/copyto.c:332 +#: access/transam/timeline.c:512 access/transam/twophase.c:1365 +#: access/transam/twophase.c:1784 access/transam/xlog.c:3323 +#: access/transam/xlog.c:3517 access/transam/xlog.c:3522 +#: access/transam/xlog.c:3658 access/transam/xlog.c:4311 +#: access/transam/xlog.c:5246 commands/copyfrom.c:1799 commands/copyto.c:325 #: libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 #: replication/logical/origin.c:683 replication/logical/origin.c:822 -#: replication/logical/reorderbuffer.c:5102 -#: replication/logical/snapbuild.c:1798 replication/logical/snapbuild.c:1922 -#: replication/slot.c:1837 replication/slot.c:1998 replication/walsender.c:658 -#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:782 -#: storage/file/fd.c:3700 storage/file/fd.c:3806 utils/cache/relmapper.c:839 -#: utils/cache/relmapper.c:945 +#: replication/logical/reorderbuffer.c:5165 +#: replication/logical/snapbuild.c:1858 replication/logical/snapbuild.c:1982 +#: replication/slot.c:2126 replication/slot.c:2288 replication/walsender.c:674 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:828 +#: storage/file/fd.c:3753 storage/file/fd.c:3859 utils/cache/relmapper.c:841 +#: utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" msgstr "konnte Datei »%s« nicht schließen: %m" -#: ../common/controldata_utils.c:124 +#: ../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "falsche Byte-Reihenfolge" -#: ../common/controldata_utils.c:126 +#: ../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -145,141 +152,157 @@ msgstr "" "diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n" "wäre inkompatibel mit diesem Datenverzeichnis." -#: ../common/controldata_utils.c:181 ../common/controldata_utils.c:186 -#: ../common/file_utils.c:228 ../common/file_utils.c:287 -#: ../common/file_utils.c:361 access/heap/rewriteheap.c:1263 -#: access/transam/timeline.c:111 access/transam/timeline.c:251 -#: access/transam/timeline.c:348 access/transam/twophase.c:1302 -#: access/transam/xlog.c:2946 access/transam/xlog.c:3109 -#: access/transam/xlog.c:3148 access/transam/xlog.c:3341 -#: access/transam/xlog.c:3986 access/transam/xlogrecovery.c:4179 -#: access/transam/xlogrecovery.c:4282 access/transam/xlogutils.c:838 -#: backup/basebackup.c:538 backup/basebackup.c:1512 libpq/hba.c:651 -#: postmaster/syslogger.c:1560 replication/logical/origin.c:735 -#: replication/logical/reorderbuffer.c:3706 -#: replication/logical/reorderbuffer.c:4257 -#: replication/logical/reorderbuffer.c:5030 -#: replication/logical/snapbuild.c:1753 replication/logical/snapbuild.c:1863 -#: replication/slot.c:1918 replication/walsender.c:616 -#: replication/walsender.c:2731 storage/file/copydir.c:151 -#: storage/file/fd.c:757 storage/file/fd.c:3457 storage/file/fd.c:3687 -#: storage/file/fd.c:3777 storage/smgr/md.c:660 utils/cache/relmapper.c:816 -#: utils/cache/relmapper.c:924 utils/error/elog.c:2082 -#: utils/init/miscinit.c:1530 utils/init/miscinit.c:1664 -#: utils/init/miscinit.c:1741 utils/misc/guc.c:4600 utils/misc/guc.c:4650 +#: ../common/controldata_utils.c:225 ../common/controldata_utils.c:230 +#: ../common/file_utils.c:70 ../common/file_utils.c:347 +#: ../common/file_utils.c:406 ../common/file_utils.c:480 +#: access/heap/rewriteheap.c:1229 access/transam/timeline.c:111 +#: access/transam/timeline.c:251 access/transam/timeline.c:348 +#: access/transam/twophase.c:1309 access/transam/xlog.c:3230 +#: access/transam/xlog.c:3393 access/transam/xlog.c:3432 +#: access/transam/xlog.c:3625 access/transam/xlog.c:4331 +#: access/transam/xlogrecovery.c:4264 access/transam/xlogrecovery.c:4367 +#: access/transam/xlogutils.c:836 backup/basebackup.c:547 +#: backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:624 +#: postmaster/syslogger.c:1511 replication/logical/origin.c:735 +#: replication/logical/reorderbuffer.c:3766 +#: replication/logical/reorderbuffer.c:4320 +#: replication/logical/reorderbuffer.c:5093 +#: replication/logical/snapbuild.c:1813 replication/logical/snapbuild.c:1923 +#: replication/slot.c:2208 replication/walsender.c:632 +#: replication/walsender.c:3081 storage/file/copydir.c:151 +#: storage/file/fd.c:803 storage/file/fd.c:3510 storage/file/fd.c:3740 +#: storage/file/fd.c:3830 storage/smgr/md.c:661 utils/cache/relmapper.c:818 +#: utils/cache/relmapper.c:935 utils/error/elog.c:2124 +#: utils/init/miscinit.c:1580 utils/init/miscinit.c:1714 +#: utils/init/miscinit.c:1791 utils/misc/guc.c:4777 utils/misc/guc.c:4827 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: ../common/controldata_utils.c:202 ../common/controldata_utils.c:205 -#: access/transam/twophase.c:1743 access/transam/twophase.c:1752 -#: access/transam/xlog.c:8755 access/transam/xlogfuncs.c:708 -#: backup/basebackup_server.c:175 backup/basebackup_server.c:268 -#: postmaster/postmaster.c:5570 postmaster/syslogger.c:1571 -#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 -#: utils/cache/relmapper.c:936 +#: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 +#: access/transam/twophase.c:1757 access/transam/twophase.c:1766 +#: access/transam/xlog.c:9280 access/transam/xlogfuncs.c:698 +#: backup/basebackup_server.c:173 backup/basebackup_server.c:266 +#: backup/walsummary.c:304 postmaster/postmaster.c:4127 +#: postmaster/syslogger.c:1522 postmaster/syslogger.c:1535 +#: postmaster/syslogger.c:1548 utils/cache/relmapper.c:947 #, c-format msgid "could not write file \"%s\": %m" msgstr "konnte Datei »%s« nicht schreiben: %m" -#: ../common/controldata_utils.c:219 ../common/controldata_utils.c:224 -#: ../common/file_utils.c:299 ../common/file_utils.c:369 -#: access/heap/rewriteheap.c:959 access/heap/rewriteheap.c:1169 -#: access/heap/rewriteheap.c:1274 access/transam/timeline.c:432 -#: access/transam/timeline.c:506 access/transam/twophase.c:1764 -#: access/transam/xlog.c:3032 access/transam/xlog.c:3227 -#: access/transam/xlog.c:3959 access/transam/xlog.c:8145 -#: access/transam/xlog.c:8190 backup/basebackup_server.c:209 -#: replication/logical/snapbuild.c:1791 replication/slot.c:1823 -#: replication/slot.c:1928 storage/file/fd.c:774 storage/file/fd.c:3798 -#: storage/smgr/md.c:1132 storage/smgr/md.c:1177 storage/sync/sync.c:451 -#: utils/misc/guc.c:4370 +#: ../common/controldata_utils.c:263 ../common/controldata_utils.c:268 +#: ../common/file_utils.c:418 ../common/file_utils.c:488 +#: access/heap/rewriteheap.c:925 access/heap/rewriteheap.c:1135 +#: access/heap/rewriteheap.c:1240 access/transam/timeline.c:432 +#: access/transam/timeline.c:506 access/transam/twophase.c:1778 +#: access/transam/xlog.c:3316 access/transam/xlog.c:3511 +#: access/transam/xlog.c:4304 access/transam/xlog.c:8655 +#: access/transam/xlog.c:8700 backup/basebackup_server.c:207 +#: commands/dbcommands.c:514 replication/logical/snapbuild.c:1851 +#: replication/slot.c:2112 replication/slot.c:2218 storage/file/fd.c:820 +#: storage/file/fd.c:3851 storage/smgr/md.c:1331 storage/smgr/md.c:1376 +#: storage/sync/sync.c:446 utils/misc/guc.c:4530 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" -#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:133 -#: ../common/cryptohash_openssl.c:332 ../common/exec.c:550 ../common/exec.c:595 -#: ../common/exec.c:687 ../common/hmac.c:309 ../common/hmac.c:325 -#: ../common/hmac_openssl.c:132 ../common/hmac_openssl.c:327 -#: ../common/md5_common.c:155 ../common/psprintf.c:143 -#: ../common/scram-common.c:258 ../common/stringinfo.c:305 ../port/path.c:751 -#: ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1411 -#: access/transam/xlogrecovery.c:589 lib/dshash.c:253 libpq/auth.c:1345 -#: libpq/auth.c:1389 libpq/auth.c:1946 libpq/be-secure-gssapi.c:524 -#: postmaster/bgworker.c:352 postmaster/bgworker.c:934 -#: postmaster/postmaster.c:2534 postmaster/postmaster.c:4127 -#: postmaster/postmaster.c:5495 postmaster/postmaster.c:5866 -#: replication/libpqwalreceiver/libpqwalreceiver.c:308 -#: replication/logical/logical.c:208 replication/walsender.c:686 -#: storage/buffer/localbuf.c:601 storage/file/fd.c:866 storage/file/fd.c:1397 -#: storage/file/fd.c:1558 storage/file/fd.c:2478 storage/ipc/procarray.c:1449 -#: storage/ipc/procarray.c:2232 storage/ipc/procarray.c:2239 -#: storage/ipc/procarray.c:2738 storage/ipc/procarray.c:3374 -#: utils/adt/formatting.c:1690 utils/adt/formatting.c:1812 -#: utils/adt/formatting.c:1935 utils/adt/pg_locale.c:469 -#: utils/adt/pg_locale.c:633 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:514 -#: utils/hash/dynahash.c:614 utils/hash/dynahash.c:1111 utils/mb/mbutils.c:402 -#: utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 utils/mb/mbutils.c:842 -#: utils/misc/guc.c:640 utils/misc/guc.c:665 utils/misc/guc.c:1053 -#: utils/misc/guc.c:4348 utils/misc/tzparser.c:476 utils/mmgr/aset.c:445 -#: utils/mmgr/dsa.c:713 utils/mmgr/dsa.c:735 utils/mmgr/dsa.c:816 -#: utils/mmgr/generation.c:205 utils/mmgr/mcxt.c:1046 utils/mmgr/mcxt.c:1082 -#: utils/mmgr/mcxt.c:1120 utils/mmgr/mcxt.c:1158 utils/mmgr/mcxt.c:1246 -#: utils/mmgr/mcxt.c:1277 utils/mmgr/mcxt.c:1313 utils/mmgr/mcxt.c:1502 -#: utils/mmgr/mcxt.c:1547 utils/mmgr/mcxt.c:1604 utils/mmgr/slab.c:366 +#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:158 +#: ../common/cryptohash_openssl.c:356 ../common/exec.c:562 ../common/exec.c:607 +#: ../common/exec.c:699 ../common/hmac.c:309 ../common/hmac.c:325 +#: ../common/hmac_openssl.c:160 ../common/hmac_openssl.c:357 +#: ../common/md5_common.c:156 ../common/parse_manifest.c:157 +#: ../common/parse_manifest.c:852 ../common/psprintf.c:143 +#: ../common/scram-common.c:268 ../common/stringinfo.c:314 ../port/path.c:828 +#: ../port/path.c:865 ../port/path.c:882 access/transam/twophase.c:1418 +#: access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1352 +#: libpq/auth.c:1396 libpq/auth.c:1953 libpq/be-secure-gssapi.c:524 +#: postmaster/bgworker.c:355 postmaster/bgworker.c:945 +#: postmaster/postmaster.c:3560 postmaster/postmaster.c:4021 +#: postmaster/postmaster.c:4383 postmaster/walsummarizer.c:935 +#: replication/libpqwalreceiver/libpqwalreceiver.c:387 +#: replication/logical/logical.c:210 replication/walsender.c:839 +#: storage/buffer/localbuf.c:606 storage/file/fd.c:912 storage/file/fd.c:1443 +#: storage/file/fd.c:1604 storage/file/fd.c:2531 storage/ipc/procarray.c:1465 +#: storage/ipc/procarray.c:2219 storage/ipc/procarray.c:2226 +#: storage/ipc/procarray.c:2731 storage/ipc/procarray.c:3435 +#: utils/adt/formatting.c:1725 utils/adt/formatting.c:1873 +#: utils/adt/formatting.c:2075 utils/adt/pg_locale.c:532 +#: utils/adt/pg_locale.c:696 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:517 +#: utils/hash/dynahash.c:617 utils/hash/dynahash.c:1100 utils/mb/mbutils.c:401 +#: utils/mb/mbutils.c:429 utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 +#: utils/misc/guc.c:649 utils/misc/guc.c:674 utils/misc/guc.c:1062 +#: utils/misc/guc.c:4508 utils/misc/tzparser.c:477 utils/mmgr/aset.c:451 +#: utils/mmgr/bump.c:183 utils/mmgr/dsa.c:707 utils/mmgr/dsa.c:729 +#: utils/mmgr/dsa.c:810 utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1154 +#: utils/mmgr/slab.c:370 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" #: ../common/cryptohash.c:266 ../common/cryptohash.c:272 -#: ../common/cryptohash_openssl.c:344 ../common/cryptohash_openssl.c:352 -#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:339 -#: ../common/hmac_openssl.c:347 +#: ../common/cryptohash_openssl.c:368 ../common/cryptohash_openssl.c:376 +#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:369 +#: ../common/hmac_openssl.c:377 msgid "success" msgstr "Erfolg" -#: ../common/cryptohash.c:268 ../common/cryptohash_openssl.c:346 -#: ../common/hmac_openssl.c:341 +#: ../common/cryptohash.c:268 ../common/cryptohash_openssl.c:370 +#: ../common/hmac_openssl.c:371 msgid "destination buffer too small" msgstr "Zielpuffer ist zu klein" -#: ../common/cryptohash_openssl.c:348 ../common/hmac_openssl.c:343 +#: ../common/cryptohash_openssl.c:372 ../common/hmac_openssl.c:373 msgid "OpenSSL failure" msgstr "OpenSSL-Fehler" -#: ../common/exec.c:172 +#: ../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "ungültige Programmdatei »%s«: %m" -#: ../common/exec.c:215 +#: ../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "konnte Programmdatei »%s« nicht lesen: %m" -#: ../common/exec.c:223 +#: ../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "konnte kein »%s« zum Ausführen finden" -#: ../common/exec.c:250 +#: ../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "konnte Pfad »%s« nicht in absolute Form auflösen: %m" -#: ../common/exec.c:412 libpq/pqcomm.c:728 storage/ipc/latch.c:1128 -#: storage/ipc/latch.c:1308 storage/ipc/latch.c:1541 storage/ipc/latch.c:1703 -#: storage/ipc/latch.c:1829 +#: ../common/exec.c:382 commands/collationcmds.c:876 commands/copyfrom.c:1723 +#: commands/copyto.c:654 libpq/be-secure-common.c:59 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "konnte Befehl »%s« nicht ausführen: %m" + +#: ../common/exec.c:394 libpq/be-secure-common.c:71 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "konnte nicht von Befehl »%s« lesen: %m" + +#: ../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "Befehl »%s« gab keine Daten zurück" + +#: ../common/exec.c:424 libpq/pqcomm.c:192 storage/ipc/latch.c:1169 +#: storage/ipc/latch.c:1349 storage/ipc/latch.c:1589 storage/ipc/latch.c:1751 +#: storage/ipc/latch.c:1877 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 #: ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 -#: ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 -#: ../port/path.c:808 utils/misc/ps_status.c:168 utils/misc/ps_status.c:176 -#: utils/misc/ps_status.c:203 utils/misc/ps_status.c:211 +#: ../common/psprintf.c:145 ../port/path.c:830 ../port/path.c:867 +#: ../port/path.c:884 utils/misc/ps_status.c:193 utils/misc/ps_status.c:201 +#: utils/misc/ps_status.c:228 utils/misc/ps_status.c:236 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" @@ -289,39 +312,51 @@ msgstr "Speicher aufgebraucht\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" -#: ../common/file_utils.c:87 ../common/file_utils.c:447 -#: ../common/file_utils.c:451 access/transam/twophase.c:1314 -#: access/transam/xlogarchive.c:112 access/transam/xlogarchive.c:229 -#: backup/basebackup.c:346 backup/basebackup.c:544 backup/basebackup.c:615 -#: commands/copyfrom.c:1679 commands/copyto.c:702 commands/extension.c:3445 -#: commands/tablespace.c:810 commands/tablespace.c:899 postmaster/pgarch.c:590 -#: replication/logical/snapbuild.c:1649 storage/file/fd.c:1922 -#: storage/file/fd.c:2008 storage/file/fd.c:3511 utils/adt/dbsize.c:106 -#: utils/adt/dbsize.c:258 utils/adt/dbsize.c:338 utils/adt/genfile.c:483 -#: utils/adt/genfile.c:658 utils/adt/misc.c:340 +#: ../common/file_utils.c:76 storage/file/fd.c:3516 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" + +#: ../common/file_utils.c:120 ../common/file_utils.c:566 +#: ../common/file_utils.c:570 access/transam/twophase.c:1321 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 +#: backup/basebackup.c:355 backup/basebackup.c:553 backup/basebackup.c:624 +#: backup/walsummary.c:247 backup/walsummary.c:254 commands/copyfrom.c:1749 +#: commands/copyto.c:700 commands/extension.c:3527 commands/tablespace.c:804 +#: commands/tablespace.c:893 postmaster/pgarch.c:680 +#: replication/logical/snapbuild.c:1709 replication/logical/snapbuild.c:2212 +#: storage/file/fd.c:1968 storage/file/fd.c:2054 storage/file/fd.c:3564 +#: utils/adt/dbsize.c:105 utils/adt/dbsize.c:257 utils/adt/dbsize.c:337 +#: utils/adt/genfile.c:437 utils/adt/genfile.c:612 utils/adt/misc.c:340 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" -#: ../common/file_utils.c:162 ../common/pgfnames.c:48 ../common/rmtree.c:63 -#: commands/tablespace.c:734 commands/tablespace.c:744 -#: postmaster/postmaster.c:1561 storage/file/fd.c:2880 -#: storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:338 +#: ../common/file_utils.c:130 ../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" + +#: ../common/file_utils.c:151 ../common/file_utils.c:281 +#: ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 +#: commands/tablespace.c:738 postmaster/postmaster.c:1470 +#: storage/file/fd.c:2933 storage/file/reinit.c:126 utils/adt/misc.c:256 +#: utils/misc/tzparser.c:339 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: ../common/file_utils.c:196 ../common/pgfnames.c:69 ../common/rmtree.c:104 -#: storage/file/fd.c:2892 +#: ../common/file_utils.c:169 ../common/file_utils.c:315 +#: ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2945 #, c-format msgid "could not read directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht lesen: %m" -#: ../common/file_utils.c:379 access/transam/xlogarchive.c:383 -#: postmaster/pgarch.c:746 postmaster/syslogger.c:1608 -#: replication/logical/snapbuild.c:1810 replication/slot.c:723 -#: replication/slot.c:1709 replication/slot.c:1851 storage/file/fd.c:792 -#: utils/time/snapmgr.c:1284 +#: ../common/file_utils.c:498 access/transam/xlogarchive.c:389 +#: postmaster/pgarch.c:834 postmaster/syslogger.c:1559 +#: replication/logical/snapbuild.c:1870 replication/slot.c:936 +#: replication/slot.c:1998 replication/slot.c:2140 storage/file/fd.c:838 +#: utils/time/snapmgr.c:1255 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" @@ -330,90 +365,102 @@ msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" msgid "internal error" msgstr "interner Fehler" -#: ../common/jsonapi.c:1144 +#: ../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "Parser mit rekursivem Abstieg kann inkrementellen Lexer nicht benutzen." + +#: ../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "Inkrementeller Parser benötigt inkrementellen Lexer." + +#: ../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON zu tief geschachtelt, maximale erlaubte Tiefe ist 6400." + +#: ../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "Escape-Sequenz »\\%s« ist nicht gültig." +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "Escape-Sequenz »\\%.*s« ist nicht gültig." -#: ../common/jsonapi.c:1147 +#: ../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Zeichen mit Wert 0x%02x muss escapt werden." -#: ../common/jsonapi.c:1150 +#: ../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "Ende der Eingabe erwartet, aber »%s« gefunden." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "Ende der Eingabe erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:1153 +#: ../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "Array-Element oder »]« erwartet, aber »%s« gefunden." +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "Array-Element oder »]« erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:1156 +#: ../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "»,« oder »]« erwartet, aber »%s« gefunden." +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "»,« oder »]« erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:1159 +#: ../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "»:« erwartet, aber »%s« gefunden." +msgid "Expected \":\", but found \"%.*s\"." +msgstr "»:« erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:1162 +#: ../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "JSON-Wert erwartet, aber »%s« gefunden." +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "JSON-Wert erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:1165 +#: ../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "Die Eingabezeichenkette endete unerwartet." -#: ../common/jsonapi.c:1167 +#: ../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "Zeichenkette oder »}« erwartet, aber »%s« gefunden." +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "Zeichenkette oder »}« erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:1170 +#: ../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "»,« oder »}« erwartet, aber »%s« gefunden." +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "»,« oder »}« erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:1173 +#: ../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "Zeichenkette erwartet, aber »%s« gefunden." +msgid "Expected string, but found \"%.*s\"." +msgstr "Zeichenkette erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:1176 +#: ../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "Token »%s« ist ungültig." +msgid "Token \"%.*s\" is invalid." +msgstr "Token »%.*s« ist ungültig." -#: ../common/jsonapi.c:1179 jsonpath_scan.l:597 +#: ../common/jsonapi.c:2164 jsonpath_scan.l:608 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kann nicht in »text« umgewandelt werden." -#: ../common/jsonapi.c:1181 +#: ../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "Nach »\\u« müssen vier Hexadezimalziffern folgen." -#: ../common/jsonapi.c:1184 +#: ../common/jsonapi.c:2169 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Unicode-Escape-Werte können nicht für Code-Punkt-Werte über 007F verwendet werden, wenn die Kodierung nicht UTF8 ist." -#: ../common/jsonapi.c:1187 +#: ../common/jsonapi.c:2178 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "Unicode-Escape-Wert konnte nicht in die Serverkodierung %s umgewandelt werden." -#: ../common/jsonapi.c:1190 jsonpath_scan.l:630 +#: ../common/jsonapi.c:2185 jsonpath_scan.l:641 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicode-High-Surrogate darf nicht auf ein High-Surrogate folgen." -#: ../common/jsonapi.c:1192 jsonpath_scan.l:641 jsonpath_scan.l:651 -#: jsonpath_scan.l:702 +#: ../common/jsonapi.c:2187 jsonpath_scan.l:652 jsonpath_scan.l:662 +#: jsonpath_scan.l:713 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicode-Low-Surrogate muss auf ein High-Surrogate folgen." @@ -438,11 +485,168 @@ msgstr "Detail: " msgid "hint: " msgstr "Tipp: " +#: ../common/parse_manifest.c:159 ../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "konnte Prüfsumme des Manifests nicht initialisieren" + +#: ../common/parse_manifest.c:203 ../common/parse_manifest.c:260 +msgid "manifest ended unexpectedly" +msgstr "Manifest endete unerwartet" + +#: ../common/parse_manifest.c:209 ../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "konnte Prüfsumme des Manifests nicht aktualisieren" + +#: ../common/parse_manifest.c:301 +msgid "unexpected object start" +msgstr "unerwarteter Objektstart" + +#: ../common/parse_manifest.c:336 +msgid "unexpected object end" +msgstr "unerwartetes Objektende" + +#: ../common/parse_manifest.c:365 +msgid "unexpected array start" +msgstr "unerwarteter Array-Start" + +#: ../common/parse_manifest.c:390 +msgid "unexpected array end" +msgstr "unerwartetes Array-Ende" + +#: ../common/parse_manifest.c:417 +msgid "expected version indicator" +msgstr "unerwartete Versionskennzeichnung" + +#: ../common/parse_manifest.c:453 +msgid "unrecognized top-level field" +msgstr "unbekanntes Feld auf oberster Ebene" + +#: ../common/parse_manifest.c:472 +msgid "unexpected file field" +msgstr "unerwartetes Feld für Datei" + +#: ../common/parse_manifest.c:486 +msgid "unexpected WAL range field" +msgstr "unerwartetes Feld für WAL-Bereich" + +#: ../common/parse_manifest.c:492 +msgid "unexpected object field" +msgstr "unbekanntes Feld für Objekt" + +#: ../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "unerwarteter Skalar" + +#: ../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "Manifestversion ist keine ganze Zahl" + +#: ../common/parse_manifest.c:612 +msgid "unexpected manifest version" +msgstr "unerwartete Manifestversion" + +#: ../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "Systemidentifikator im Manifest ist keine ganze Zahl" + +#: ../common/parse_manifest.c:661 +msgid "missing path name" +msgstr "fehlender Pfadname" + +#: ../common/parse_manifest.c:664 +msgid "both path name and encoded path name" +msgstr "sowohl Pfadname als auch kodierter Pfadname angegeben" + +#: ../common/parse_manifest.c:666 +msgid "missing size" +msgstr "Größenangabe fehlt" + +#: ../common/parse_manifest.c:669 +msgid "checksum without algorithm" +msgstr "Prüfsumme ohne Algorithmus" + +#: ../common/parse_manifest.c:683 +msgid "could not decode file name" +msgstr "konnte Dateinamen nicht dekodieren" + +#: ../common/parse_manifest.c:693 +msgid "file size is not an integer" +msgstr "Dateigröße ist keine ganze Zahl" + +#: ../common/parse_manifest.c:699 backup/basebackup.c:870 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "unbekannter Prüfsummenalgorithmus: »%s«" + +#: ../common/parse_manifest.c:718 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "ungültige Prüfsumme für Datei »%s«: »%s«" + +#: ../common/parse_manifest.c:761 +msgid "missing timeline" +msgstr "Zeitleiste fehlt" + +#: ../common/parse_manifest.c:763 +msgid "missing start LSN" +msgstr "Start-LSN fehlt" + +#: ../common/parse_manifest.c:765 +msgid "missing end LSN" +msgstr "End-LSN fehlt" + +#: ../common/parse_manifest.c:771 +msgid "timeline is not an integer" +msgstr "Zeitleiste ist keine ganze Zahl" + +#: ../common/parse_manifest.c:774 +msgid "could not parse start LSN" +msgstr "konnte Start-LSN nicht parsen" + +#: ../common/parse_manifest.c:777 +msgid "could not parse end LSN" +msgstr "konnte End-LSN nicht parsen" + +#: ../common/parse_manifest.c:842 +msgid "expected at least 2 lines" +msgstr "mindestens 2 Zeilen erwartet" + +#: ../common/parse_manifest.c:845 +msgid "last line not newline-terminated" +msgstr "letzte Zeile nicht durch Newline abgeschlossen" + +#: ../common/parse_manifest.c:864 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "konnte Prüfsumme des Manifests nicht abschließen" + +#: ../common/parse_manifest.c:868 +#, c-format +msgid "manifest has no checksum" +msgstr "Manifest hat keine Prüfsumme" + +#: ../common/parse_manifest.c:872 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "ungültige Manifestprüfsumme: »%s«" + +#: ../common/parse_manifest.c:876 +#, c-format +msgid "manifest checksum mismatch" +msgstr "Manifestprüfsumme stimmt nicht überein" + +#: ../common/parse_manifest.c:891 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "konnte Backup-Manifest nicht parsen: %s" + #: ../common/percentrepl.c:79 ../common/percentrepl.c:85 #: ../common/percentrepl.c:118 ../common/percentrepl.c:124 -#: postmaster/postmaster.c:2208 utils/misc/guc.c:3118 utils/misc/guc.c:3154 -#: utils/misc/guc.c:3224 utils/misc/guc.c:4547 utils/misc/guc.c:6721 -#: utils/misc/guc.c:6762 +#: tcop/backend_startup.c:741 utils/misc/guc.c:3167 utils/misc/guc.c:3208 +#: utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6931 +#: utils/misc/guc.c:6972 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "ungültiger Wert für Parameter »%s«: »%s«" @@ -502,45 +706,45 @@ msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu msgid "could not get exit code from subprocess: error code %lu" msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu" -#: ../common/rmtree.c:95 access/heap/rewriteheap.c:1248 -#: access/transam/twophase.c:1703 access/transam/xlogarchive.c:120 -#: access/transam/xlogarchive.c:393 postmaster/postmaster.c:1143 -#: postmaster/syslogger.c:1537 replication/logical/origin.c:591 -#: replication/logical/reorderbuffer.c:4526 -#: replication/logical/snapbuild.c:1691 replication/logical/snapbuild.c:2121 -#: replication/slot.c:1902 storage/file/fd.c:832 storage/file/fd.c:3325 -#: storage/file/fd.c:3387 storage/file/reinit.c:262 storage/ipc/dsm.c:316 -#: storage/smgr/md.c:380 storage/smgr/md.c:439 storage/sync/sync.c:248 -#: utils/time/snapmgr.c:1608 +#: ../common/rmtree.c:97 access/heap/rewriteheap.c:1214 +#: access/transam/twophase.c:1717 access/transam/xlogarchive.c:119 +#: access/transam/xlogarchive.c:399 postmaster/postmaster.c:1048 +#: postmaster/syslogger.c:1488 replication/logical/origin.c:591 +#: replication/logical/reorderbuffer.c:4589 +#: replication/logical/snapbuild.c:1751 replication/logical/snapbuild.c:2185 +#: replication/slot.c:2192 storage/file/fd.c:878 storage/file/fd.c:3378 +#: storage/file/fd.c:3440 storage/file/reinit.c:261 storage/ipc/dsm.c:343 +#: storage/smgr/md.c:381 storage/smgr/md.c:440 storage/sync/sync.c:243 +#: utils/time/snapmgr.c:1591 #, c-format msgid "could not remove file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" -#: ../common/rmtree.c:122 commands/tablespace.c:773 commands/tablespace.c:786 -#: commands/tablespace.c:821 commands/tablespace.c:911 storage/file/fd.c:3317 -#: storage/file/fd.c:3726 +#: ../common/rmtree.c:124 commands/tablespace.c:767 commands/tablespace.c:780 +#: commands/tablespace.c:815 commands/tablespace.c:905 storage/file/fd.c:3370 +#: storage/file/fd.c:3779 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht löschen: %m" -#: ../common/scram-common.c:271 +#: ../common/scram-common.c:281 msgid "could not encode salt" msgstr "konnte Salt nicht kodieren" -#: ../common/scram-common.c:287 +#: ../common/scram-common.c:297 msgid "could not encode stored key" msgstr "konnte Stored Key nicht kodieren" -#: ../common/scram-common.c:304 +#: ../common/scram-common.c:314 msgid "could not encode server key" msgstr "konnte Server Key nicht kodieren" -#: ../common/stringinfo.c:306 +#: ../common/stringinfo.c:315 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." msgstr "Kann Zeichenkettenpuffer mit %d Bytes nicht um %d Bytes vergrößern." -#: ../common/stringinfo.c:310 +#: ../common/stringinfo.c:319 #, c-format msgid "" "out of memory\n" @@ -556,7 +760,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "konnte effektive Benutzer-ID %ld nicht nachschlagen: %s" -#: ../common/username.c:45 libpq/auth.c:1881 +#: ../common/username.c:45 libpq/auth.c:1888 msgid "user does not exist" msgstr "Benutzer existiert nicht" @@ -648,22 +852,22 @@ msgstr "Versuche werden für 30 Sekunden wiederholt." msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "Möglicherweise stört eine Antivirus-, Datensicherungs- oder ähnliche Software das Datenbanksystem." -#: ../port/path.c:775 +#: ../port/path.c:852 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %m\n" #: ../port/strerror.c:72 #, c-format msgid "operating system error %d" msgstr "Betriebssystemfehler %d" -#: ../port/thread.c:50 ../port/thread.c:86 +#: ../port/user.c:43 ../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "konnte lokale Benutzer-ID %d nicht nachschlagen: %s" -#: ../port/thread.c:55 ../port/thread.c:91 +#: ../port/user.c:48 ../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "lokaler Benutzer mit ID %d existiert nicht" @@ -683,115 +887,104 @@ msgstr "konnte SID der PowerUsers-Gruppe nicht ermitteln: Fehlercode %lu\n" msgid "could not check access token membership: error code %lu\n" msgstr "konnte Access-Token-Mitgliedschaft nicht prüfen: Fehlercode %lu\n" -#: access/brin/brin.c:216 +#: access/brin/brin.c:405 #, c-format msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "Aufforderung für BRIN-Range-Summarization für Index »%s« Seite %u wurde nicht aufgezeichnet" -#: access/brin/brin.c:1036 access/brin/brin.c:1137 access/gin/ginfast.c:1035 -#: access/transam/xlogfuncs.c:189 access/transam/xlogfuncs.c:214 -#: access/transam/xlogfuncs.c:247 access/transam/xlogfuncs.c:286 -#: access/transam/xlogfuncs.c:307 access/transam/xlogfuncs.c:328 -#: access/transam/xlogfuncs.c:398 access/transam/xlogfuncs.c:456 +#: access/brin/brin.c:1387 access/brin/brin.c:1495 access/gin/ginfast.c:1040 +#: access/transam/xlogfuncs.c:183 access/transam/xlogfuncs.c:208 +#: access/transam/xlogfuncs.c:241 access/transam/xlogfuncs.c:280 +#: access/transam/xlogfuncs.c:301 access/transam/xlogfuncs.c:322 +#: access/transam/xlogfuncs.c:388 access/transam/xlogfuncs.c:446 #, c-format msgid "recovery is in progress" msgstr "Wiederherstellung läuft" -#: access/brin/brin.c:1037 access/brin/brin.c:1138 +#: access/brin/brin.c:1388 access/brin/brin.c:1496 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "Während der Wiederherstellung können keine BRIN-Kontrollfunktionen ausgeführt werden." -#: access/brin/brin.c:1042 access/brin/brin.c:1143 +#: access/brin/brin.c:1393 access/brin/brin.c:1501 #, c-format msgid "block number out of range: %lld" msgstr "Blocknummer ist außerhalb des gültigen Bereichs: %lld" -#: access/brin/brin.c:1086 access/brin/brin.c:1169 +#: access/brin/brin.c:1438 access/brin/brin.c:1527 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "»%s« ist kein BRIN-Index" -#: access/brin/brin.c:1102 access/brin/brin.c:1185 +#: access/brin/brin.c:1454 access/brin/brin.c:1543 #, c-format msgid "could not open parent table of index \"%s\"" msgstr "konnte Basistabelle von Index »%s« nicht öffnen" -#: access/brin/brin_bloom.c:750 access/brin/brin_bloom.c:792 -#: access/brin/brin_minmax_multi.c:3011 access/brin/brin_minmax_multi.c:3148 -#: statistics/dependencies.c:663 statistics/dependencies.c:716 -#: statistics/mcv.c:1484 statistics/mcv.c:1515 statistics/mvdistinct.c:344 -#: statistics/mvdistinct.c:397 utils/adt/pseudotypes.c:43 -#: utils/adt/pseudotypes.c:77 utils/adt/tsgistidx.c:93 +#: access/brin/brin.c:1463 access/brin/brin.c:1559 access/gin/ginfast.c:1085 +#: parser/parse_utilcmd.c:2277 #, c-format -msgid "cannot accept a value of type %s" -msgstr "kann keinen Wert vom Typ %s annehmen" +msgid "index \"%s\" is not valid" +msgstr "Index »%s« ist nicht gültig" -#: access/brin/brin_minmax_multi.c:2171 access/brin/brin_minmax_multi.c:2178 -#: access/brin/brin_minmax_multi.c:2185 utils/adt/timestamp.c:941 -#: utils/adt/timestamp.c:1518 utils/adt/timestamp.c:2708 -#: utils/adt/timestamp.c:2778 utils/adt/timestamp.c:2795 -#: utils/adt/timestamp.c:2848 utils/adt/timestamp.c:2887 -#: utils/adt/timestamp.c:3184 utils/adt/timestamp.c:3189 -#: utils/adt/timestamp.c:3194 utils/adt/timestamp.c:3244 -#: utils/adt/timestamp.c:3251 utils/adt/timestamp.c:3258 -#: utils/adt/timestamp.c:3278 utils/adt/timestamp.c:3285 -#: utils/adt/timestamp.c:3292 utils/adt/timestamp.c:3322 -#: utils/adt/timestamp.c:3330 utils/adt/timestamp.c:3374 -#: utils/adt/timestamp.c:3796 utils/adt/timestamp.c:3920 -#: utils/adt/timestamp.c:4440 +#: access/brin/brin_bloom.c:785 access/brin/brin_bloom.c:827 +#: access/brin/brin_minmax_multi.c:2984 access/brin/brin_minmax_multi.c:3121 +#: statistics/dependencies.c:661 statistics/dependencies.c:714 +#: statistics/mcv.c:1480 statistics/mcv.c:1511 statistics/mvdistinct.c:343 +#: statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:40 +#: utils/adt/pseudotypes.c:74 utils/adt/tsgistidx.c:94 #, c-format -msgid "interval out of range" -msgstr "interval-Wert ist außerhalb des gültigen Bereichs" +msgid "cannot accept a value of type %s" +msgstr "kann keinen Wert vom Typ %s annehmen" -#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 -#: access/brin/brin_pageops.c:852 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1442 access/spgist/spgdoinsert.c:2002 -#: access/spgist/spgdoinsert.c:2279 +#: access/brin/brin_pageops.c:75 access/brin/brin_pageops.c:361 +#: access/brin/brin_pageops.c:851 access/gin/ginentrypage.c:109 +#: access/gist/gist.c:1470 access/spgist/spgdoinsert.c:2001 +#: access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "Größe %zu der Indexzeile überschreitet Maximum %zu für Index »%s«" -#: access/brin/brin_revmap.c:393 access/brin/brin_revmap.c:399 +#: access/brin/brin_revmap.c:383 access/brin/brin_revmap.c:389 #, c-format msgid "corrupted BRIN index: inconsistent range map" msgstr "verfälschter BRIN-Index: inkonsistente Range-Map" -#: access/brin/brin_revmap.c:593 +#: access/brin/brin_revmap.c:583 #, c-format msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" msgstr "unerwarteter Seitentyp 0x%04X in BRIN-Index »%s« Block %u" -#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:151 -#: access/gist/gistvalidate.c:153 access/hash/hashvalidate.c:139 +#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:149 +#: access/gist/gistvalidate.c:152 access/hash/hashvalidate.c:139 #: access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with invalid support number %d" msgstr "Operatorfamilie »%s« für Zugriffsmethode %s enthält Funktion %s mit ungültiger Support-Nummer %d" -#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:163 -#: access/gist/gistvalidate.c:165 access/hash/hashvalidate.c:118 +#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:161 +#: access/gist/gistvalidate.c:164 access/hash/hashvalidate.c:118 #: access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with wrong signature for support number %d" msgstr "Operatorfamilie »%s« für Zugriffsmethode %s enthält Funktion %s mit falscher Signatur für Support-Nummer %d" -#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:182 -#: access/gist/gistvalidate.c:185 access/hash/hashvalidate.c:160 +#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:180 +#: access/gist/gistvalidate.c:184 access/hash/hashvalidate.c:160 #: access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with invalid strategy number %d" msgstr "Operatorfamilie »%s« für Zugriffsmethode %s enthält Operator %s mit ungültiger Strategienummer %d" -#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:195 +#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:193 #: access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 #: access/spgist/spgvalidate.c:237 #, c-format msgid "operator family \"%s\" of access method %s contains invalid ORDER BY specification for operator %s" msgstr "Operatorfamilie »%s« für Zugriffsmethode %s enthält ungültige ORDER-BY-Angabe für Operator %s" -#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:208 -#: access/gist/gistvalidate.c:233 access/hash/hashvalidate.c:186 +#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:206 +#: access/gist/gistvalidate.c:232 access/hash/hashvalidate.c:186 #: access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with wrong signature" @@ -814,38 +1007,38 @@ msgstr "in Operatorfamilie »%s« für Zugriffsmethode %s fehlen Support-Funktio msgid "operator class \"%s\" of access method %s is missing operator(s)" msgstr "in Operatorklasse »%s« für Zugriffsmethode %s fehlen Operatoren" -#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 -#: access/gist/gistvalidate.c:274 +#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:248 +#: access/gist/gistvalidate.c:273 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d" msgstr "in Operatorklasse »%s« für Zugriffsmethode %s fehlt Support-Funktion %d" -#: access/common/attmap.c:122 +#: access/common/attmap.c:121 #, c-format msgid "Returned type %s does not match expected type %s in column %d." msgstr "Zurückgegebener Typ %1$s stimmt in Spalte %3$d nicht mit erwartetem Typ %2$s überein." -#: access/common/attmap.c:150 +#: access/common/attmap.c:149 #, c-format msgid "Number of returned columns (%d) does not match expected column count (%d)." msgstr "Anzahl der zurückgegebenen Spalten (%d) entspricht nicht der erwarteten Spaltenanzahl (%d)." -#: access/common/attmap.c:234 access/common/attmap.c:246 +#: access/common/attmap.c:233 access/common/attmap.c:245 #, c-format msgid "could not convert row type" msgstr "konnte Zeilentyp nicht umwandeln" -#: access/common/attmap.c:235 +#: access/common/attmap.c:234 #, c-format msgid "Attribute \"%s\" of type %s does not match corresponding attribute of type %s." msgstr "Attribut »%s« von Typ %s stimmt nicht mit dem entsprechenden Attribut von Typ %s überein." -#: access/common/attmap.c:247 +#: access/common/attmap.c:246 #, c-format msgid "Attribute \"%s\" of type %s does not exist in type %s." msgstr "Attribut »%s« von Typ %s existiert nicht in Typ %s." -#: access/common/heaptuple.c:1036 access/common/heaptuple.c:1371 +#: access/common/heaptuple.c:1132 access/common/heaptuple.c:1467 #, c-format msgid "number of columns (%d) exceeds limit (%d)" msgstr "Anzahl der Spalten (%d) überschreitet Maximum (%d)" @@ -855,122 +1048,110 @@ msgstr "Anzahl der Spalten (%d) überschreitet Maximum (%d)" msgid "number of index columns (%d) exceeds limit (%d)" msgstr "Anzahl der Indexspalten (%d) überschreitet Maximum (%d)" -#: access/common/indextuple.c:209 access/spgist/spgutils.c:950 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:970 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "Indexzeile benötigt %zu Bytes, Maximalgröße ist %zu" -#: access/common/printtup.c:292 tcop/fastpath.c:107 tcop/fastpath.c:454 -#: tcop/postgres.c:1944 +#: access/common/printtup.c:292 commands/explain.c:5376 tcop/fastpath.c:107 +#: tcop/fastpath.c:454 tcop/postgres.c:1956 #, c-format msgid "unsupported format code: %d" msgstr "nicht unterstützter Formatcode: %d" -#: access/common/reloptions.c:521 access/common/reloptions.c:532 +#: access/common/reloptions.c:519 access/common/reloptions.c:530 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "Gültige Werte sind »on«, »off« und »auto«." -#: access/common/reloptions.c:543 +#: access/common/reloptions.c:541 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Gültige Werte sind »local« und »cascaded«." -#: access/common/reloptions.c:691 +#: access/common/reloptions.c:689 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "Wertebereich des Typs für benutzerdefinierte Relationsparameter überschritten" -#: access/common/reloptions.c:1233 +#: access/common/reloptions.c:1231 #, c-format msgid "RESET must not include values for parameters" msgstr "RESET darf keinen Parameterwert enthalten" -#: access/common/reloptions.c:1265 +#: access/common/reloptions.c:1263 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "unbekannter Parameter-Namensraum »%s«" -#: access/common/reloptions.c:1302 commands/variable.c:1167 +#: access/common/reloptions.c:1300 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "Tabellen mit WITH OIDS werden nicht unterstützt" -#: access/common/reloptions.c:1470 +#: access/common/reloptions.c:1468 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "unbekannter Parameter »%s«" -#: access/common/reloptions.c:1582 +#: access/common/reloptions.c:1580 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "Parameter »%s« mehrmals angegeben" -#: access/common/reloptions.c:1598 +#: access/common/reloptions.c:1596 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "ungültiger Wert für Boole’sche Option »%s«: »%s«" -#: access/common/reloptions.c:1610 +#: access/common/reloptions.c:1608 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "ungültiger Wert für ganzzahlige Option »%s«: »%s«" -#: access/common/reloptions.c:1616 access/common/reloptions.c:1636 +#: access/common/reloptions.c:1614 access/common/reloptions.c:1634 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "Wert %s ist außerhalb des gültigen Bereichs für Option »%s«" -#: access/common/reloptions.c:1618 +#: access/common/reloptions.c:1616 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Gültige Werte sind zwischen »%d« und »%d«." -#: access/common/reloptions.c:1630 +#: access/common/reloptions.c:1628 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "ungültiger Wert für Gleitkommaoption »%s«: »%s«" -#: access/common/reloptions.c:1638 +#: access/common/reloptions.c:1636 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Gültige Werte sind zwischen »%f« und »%f«." -#: access/common/reloptions.c:1660 +#: access/common/reloptions.c:1658 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "ungültiger Wert für Enum-Option »%s«: »%s«" -#: access/common/reloptions.c:1991 +#: access/common/reloptions.c:1989 #, c-format msgid "cannot specify storage parameters for a partitioned table" msgstr "für eine partitionierte Tabelle können keine Storage-Parameter angegeben werden" -#: access/common/reloptions.c:1992 +#: access/common/reloptions.c:1990 #, c-format -msgid "Specify storage parameters for its leaf partitions, instead." -msgstr "" +msgid "Specify storage parameters for its leaf partitions instead." +msgstr "Geben Sie Storage-Parameter stattdessen für ihre Blattpartitionen an." -#: access/common/toast_compression.c:33 +#: access/common/toast_compression.c:31 #, c-format msgid "compression method lz4 not supported" msgstr "Komprimierungsmethode lz4 nicht unterstützt" -#: access/common/toast_compression.c:34 +#: access/common/toast_compression.c:32 #, c-format msgid "This functionality requires the server to be built with lz4 support." msgstr "Diese Funktionalität verlangt, dass der Server mit lz4-Unterstützung gebaut wird." -#: access/common/tupdesc.c:837 commands/tablecmds.c:6953 -#: commands/tablecmds.c:12973 -#, c-format -msgid "too many array dimensions" -msgstr "zu viele Array-Dimensionen" - -#: access/common/tupdesc.c:842 parser/parse_clause.c:772 -#: parser/parse_relation.c:1912 -#, c-format -msgid "column \"%s\" cannot be declared SETOF" -msgstr "Spalte »%s« kann nicht als SETOF deklariert werden" - #: access/gin/ginbulk.c:44 #, c-format msgid "posting list is too long" @@ -978,20 +1159,20 @@ msgstr "Posting-Liste ist zu lang" #: access/gin/ginbulk.c:45 #, c-format -msgid "Reduce maintenance_work_mem." -msgstr "Reduzieren Sie maintenance_work_mem." +msgid "Reduce \"maintenance_work_mem\"." +msgstr "Reduzieren Sie »maintenance_work_mem«." -#: access/gin/ginfast.c:1036 +#: access/gin/ginfast.c:1041 #, c-format msgid "GIN pending list cannot be cleaned up during recovery." msgstr "GIN-Pending-Liste kann nicht während der Wiederherstellung aufgeräumt werden." -#: access/gin/ginfast.c:1043 +#: access/gin/ginfast.c:1048 #, c-format msgid "\"%s\" is not a GIN index" msgstr "»%s« ist kein GIN-Index" -#: access/gin/ginfast.c:1054 +#: access/gin/ginfast.c:1059 #, c-format msgid "cannot access temporary indexes of other sessions" msgstr "auf temporäre Indexe anderer Sitzungen kann nicht zugegriffen werden" @@ -1001,60 +1182,60 @@ msgstr "auf temporäre Indexe anderer Sitzungen kann nicht zugegriffen werden" msgid "failed to re-find tuple within index \"%s\"" msgstr "konnte Tupel mit Index »%s« nicht erneut finden" -#: access/gin/ginscan.c:431 +#: access/gin/ginscan.c:436 #, c-format msgid "old GIN indexes do not support whole-index scans nor searches for nulls" msgstr "alte GIN-Indexe unterstützen keine Scans des ganzen Index oder Suchen nach NULL-Werten" -#: access/gin/ginscan.c:432 +#: access/gin/ginscan.c:437 #, c-format msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Um das zu reparieren, führen Sie REINDEX INDEX \"%s\" aus." -#: access/gin/ginutil.c:146 executor/execExpr.c:2169 -#: utils/adt/arrayfuncs.c:3996 utils/adt/arrayfuncs.c:6683 -#: utils/adt/rowtypes.c:984 +#: access/gin/ginutil.c:147 executor/execExpr.c:2200 +#: utils/adt/arrayfuncs.c:4016 utils/adt/arrayfuncs.c:6714 +#: utils/adt/rowtypes.c:974 #, c-format msgid "could not identify a comparison function for type %s" msgstr "konnte keine Vergleichsfunktion für Typ %s ermitteln" -#: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 +#: access/gin/ginvalidate.c:90 access/gist/gistvalidate.c:92 #: access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 #, c-format msgid "operator family \"%s\" of access method %s contains support function %s with different left and right input types" msgstr "Operatorfamilie »%s« für Zugriffsmethode %s enthält Support-Funktion %s mit unterschiedlichen linken und rechten Eingabetypen" -#: access/gin/ginvalidate.c:260 +#: access/gin/ginvalidate.c:258 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d or %d" msgstr "in Operatorklasse »%s« für Zugriffsmethode %s fehlt Support-Funktion %d oder %d" -#: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:350 +#: access/gin/ginvalidate.c:331 access/gist/gistvalidate.c:349 #: access/spgist/spgvalidate.c:387 #, c-format msgid "support function number %d is invalid for access method %s" msgstr "Support-Funktionsnummer %d ist ungültig für Zugriffsmethode %s" -#: access/gist/gist.c:759 access/gist/gistvacuum.c:426 +#: access/gist/gist.c:760 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "Index »%s« enthält ein inneres Tupel, das als ungültig markiert ist" -#: access/gist/gist.c:761 access/gist/gistvacuum.c:428 +#: access/gist/gist.c:762 access/gist/gistvacuum.c:428 #, c-format msgid "This is caused by an incomplete page split at crash recovery before upgrading to PostgreSQL 9.1." msgstr "Das kommt von einem unvollständigen Page-Split bei der Crash-Recovery vor dem Upgrade auf PostgreSQL 9.1." -#: access/gist/gist.c:762 access/gist/gistutil.c:801 access/gist/gistutil.c:812 -#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:227 -#: access/hash/hashutil.c:238 access/hash/hashutil.c:250 -#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:813 +#: access/gist/gist.c:763 access/gist/gistutil.c:800 access/gist/gistutil.c:811 +#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:226 +#: access/hash/hashutil.c:237 access/hash/hashutil.c:249 +#: access/hash/hashutil.c:270 access/nbtree/nbtpage.c:813 #: access/nbtree/nbtpage.c:824 #, c-format msgid "Please REINDEX it." msgstr "Bitte führen Sie REINDEX für den Index aus." -#: access/gist/gist.c:1176 +#: access/gist/gist.c:1203 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "repariere unvollständiges Teilen in Index »%s«, Block %u" @@ -1069,52 +1250,52 @@ msgstr "Picksplit-Methode für Spalte %d von Index »%s« fehlgeschlagen" msgid "The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command." msgstr "Der Index ist nicht optimal. Um ihn zu optimieren, kontaktieren Sie einen Entwickler oder versuchen Sie, die Spalte als die zweite im CREATE-INDEX-Befehl zu verwenden." -#: access/gist/gistutil.c:798 access/hash/hashutil.c:224 +#: access/gist/gistutil.c:797 access/hash/hashutil.c:223 #: access/nbtree/nbtpage.c:810 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "Index »%s« enthält unerwartete Nullseite bei Block %u" -#: access/gist/gistutil.c:809 access/hash/hashutil.c:235 -#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:821 +#: access/gist/gistutil.c:808 access/hash/hashutil.c:234 +#: access/hash/hashutil.c:246 access/nbtree/nbtpage.c:821 #, c-format msgid "index \"%s\" contains corrupted page at block %u" msgstr "Index »%s« enthält korrupte Seite bei Block %u" -#: access/gist/gistvalidate.c:203 +#: access/gist/gistvalidate.c:202 #, c-format msgid "operator family \"%s\" of access method %s contains unsupported ORDER BY specification for operator %s" msgstr "Operatorfamilie »%s« für Zugriffsmethode %s enthält nicht unterstützte ORDER-BY-Angabe für Operator %s" -#: access/gist/gistvalidate.c:214 +#: access/gist/gistvalidate.c:213 #, c-format msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY opfamily specification for operator %s" msgstr "Operatorfamilie »%s« für Zugriffsmethode %s enthält ungültige ORDER-BY-Operatorfamilienangabe für Operator %s" -#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:333 -#: utils/adt/varchar.c:1009 utils/adt/varchar.c:1064 +#: access/hash/hashfunc.c:277 access/hash/hashfunc.c:333 +#: utils/adt/varchar.c:1008 utils/adt/varchar.c:1065 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "konnte die für das Zeichenketten-Hashing zu verwendende Sortierfolge nicht bestimmen" -#: access/hash/hashfunc.c:280 access/hash/hashfunc.c:334 catalog/heap.c:668 -#: catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:2023 commands/tablecmds.c:17464 commands/view.c:86 -#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1648 -#: utils/adt/formatting.c:1770 utils/adt/formatting.c:1893 utils/adt/like.c:191 -#: utils/adt/like_support.c:1025 utils/adt/varchar.c:739 -#: utils/adt/varchar.c:1010 utils/adt/varchar.c:1065 utils/adt/varlena.c:1518 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 catalog/heap.c:673 +#: catalog/heap.c:679 commands/createas.c:201 commands/createas.c:508 +#: commands/indexcmds.c:2021 commands/tablecmds.c:18232 commands/view.c:81 +#: regex/regc_pg_locale.c:245 utils/adt/formatting.c:1653 +#: utils/adt/formatting.c:1801 utils/adt/formatting.c:1991 utils/adt/like.c:189 +#: utils/adt/like_support.c:1024 utils/adt/varchar.c:738 +#: utils/adt/varchar.c:1009 utils/adt/varchar.c:1066 utils/adt/varlena.c:1521 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "Verwenden Sie die COLLATE-Klausel, um die Sortierfolge explizit zu setzen." -#: access/hash/hashinsert.c:86 +#: access/hash/hashinsert.c:84 #, c-format msgid "index row size %zu exceeds hash maximum %zu" msgstr "Größe der Indexzeile %zu überschreitet Maximum für Hash-Index %zu" -#: access/hash/hashinsert.c:88 access/spgist/spgdoinsert.c:2006 -#: access/spgist/spgdoinsert.c:2283 access/spgist/spgutils.c:1011 +#: access/hash/hashinsert.c:86 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1031 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "Werte, die größer sind als eine Pufferseite, können nicht indiziert werden." @@ -1129,17 +1310,17 @@ msgstr "ungültige Überlaufblocknummer %u" msgid "out of overflow pages in hash index \"%s\"" msgstr "keine Überlaufseiten in Hash-Index »%s« mehr" -#: access/hash/hashsearch.c:315 +#: access/hash/hashsearch.c:311 #, c-format msgid "hash indexes do not support whole-index scans" msgstr "Hash-Indexe unterstützen keine Scans des ganzen Index" -#: access/hash/hashutil.c:263 +#: access/hash/hashutil.c:262 #, c-format msgid "index \"%s\" is not a hash index" msgstr "Index »%s« ist kein Hash-Index" -#: access/hash/hashutil.c:269 +#: access/hash/hashutil.c:268 #, c-format msgid "index \"%s\" has wrong hash version" msgstr "Index »%s« hat falsche Hash-Version" @@ -1154,229 +1335,235 @@ msgstr "in Operatorfamilie »%s« für Zugriffsmethode %s fehlt Support-Funktion msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "in Operatorfamilie »%s« für Zugriffsmethode %s fehlen typübergreifende Operatoren" -#: access/heap/heapam.c:2026 +#: access/heap/heapam.c:2206 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "in einem parallelen Arbeitsprozess können keine Tupel eingefügt werden" -#: access/heap/heapam.c:2545 +#: access/heap/heapam.c:2725 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "während einer parallelen Operation können keine Tupel gelöscht werden" -#: access/heap/heapam.c:2592 +#: access/heap/heapam.c:2772 #, c-format msgid "attempted to delete invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu löschen" -#: access/heap/heapam.c:3035 access/heap/heapam.c:5902 +#: access/heap/heapam.c:3220 access/heap/heapam.c:6501 access/index/genam.c:818 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "während einer parallelen Operation können keine Tupel aktualisiert werden" -#: access/heap/heapam.c:3163 +#: access/heap/heapam.c:3397 #, c-format msgid "attempted to update invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu aktualisieren" -#: access/heap/heapam.c:4550 access/heap/heapam.c:4588 -#: access/heap/heapam.c:4853 access/heap/heapam_handler.c:467 +#: access/heap/heapam.c:4908 access/heap/heapam.c:4946 +#: access/heap/heapam.c:5211 access/heap/heapam_handler.c:468 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "konnte Sperre für Zeile in Relation »%s« nicht setzen" -#: access/heap/heapam_handler.c:412 +#: access/heap/heapam.c:6314 commands/trigger.c:3340 +#: executor/nodeModifyTable.c:2396 executor/nodeModifyTable.c:2487 +#, c-format +msgid "tuple to be updated was already modified by an operation triggered by the current command" +msgstr "das zu aktualisierende Tupel wurde schon durch eine vom aktuellen Befehl ausgelöste Operation verändert" + +#: access/heap/heapam_handler.c:413 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update" msgstr "das zu sperrende Tupel wurde schon durch ein gleichzeitiges Update in eine andere Partition verschoben" -#: access/heap/hio.c:517 access/heap/rewriteheap.c:659 +#: access/heap/hio.c:535 access/heap/rewriteheap.c:640 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "Zeile ist zu groß: Größe ist %zu, Maximalgröße ist %zu" -#: access/heap/rewriteheap.c:919 +#: access/heap/rewriteheap.c:885 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "konnte nicht in Datei »%s« schreiben, %d von %d geschrieben: %m" -#: access/heap/rewriteheap.c:1011 access/heap/rewriteheap.c:1128 +#: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 #: access/transam/timeline.c:329 access/transam/timeline.c:481 -#: access/transam/xlog.c:2971 access/transam/xlog.c:3162 -#: access/transam/xlog.c:3938 access/transam/xlog.c:8744 -#: access/transam/xlogfuncs.c:702 backup/basebackup_server.c:151 -#: backup/basebackup_server.c:244 commands/dbcommands.c:518 -#: postmaster/postmaster.c:4554 postmaster/postmaster.c:5557 -#: replication/logical/origin.c:603 replication/slot.c:1770 -#: storage/file/copydir.c:157 storage/smgr/md.c:232 utils/time/snapmgr.c:1263 +#: access/transam/xlog.c:3255 access/transam/xlog.c:3446 +#: access/transam/xlog.c:4283 access/transam/xlog.c:9269 +#: access/transam/xlogfuncs.c:692 backup/basebackup_server.c:149 +#: backup/basebackup_server.c:242 commands/dbcommands.c:494 +#: postmaster/launch_backend.c:340 postmaster/postmaster.c:4114 +#: postmaster/walsummarizer.c:1212 replication/logical/origin.c:603 +#: replication/slot.c:2059 storage/file/copydir.c:157 storage/smgr/md.c:230 +#: utils/time/snapmgr.c:1234 #, c-format msgid "could not create file \"%s\": %m" msgstr "konnte Datei »%s« nicht erstellen: %m" -#: access/heap/rewriteheap.c:1138 +#: access/heap/rewriteheap.c:1104 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "konnte Datei »%s« nicht auf %u kürzen: %m" -#: access/heap/rewriteheap.c:1156 access/transam/timeline.c:384 +#: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:498 -#: access/transam/xlog.c:3021 access/transam/xlog.c:3218 -#: access/transam/xlog.c:3950 commands/dbcommands.c:530 -#: postmaster/postmaster.c:4564 postmaster/postmaster.c:4574 +#: access/transam/xlog.c:3305 access/transam/xlog.c:3502 +#: access/transam/xlog.c:4295 commands/dbcommands.c:506 +#: postmaster/launch_backend.c:351 postmaster/launch_backend.c:363 #: replication/logical/origin.c:615 replication/logical/origin.c:657 -#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1767 -#: replication/slot.c:1805 storage/file/buffile.c:545 -#: storage/file/copydir.c:197 utils/init/miscinit.c:1605 -#: utils/init/miscinit.c:1616 utils/init/miscinit.c:1624 utils/misc/guc.c:4331 -#: utils/misc/guc.c:4362 utils/misc/guc.c:5490 utils/misc/guc.c:5508 -#: utils/time/snapmgr.c:1268 utils/time/snapmgr.c:1275 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1827 +#: replication/slot.c:2094 storage/file/buffile.c:545 +#: storage/file/copydir.c:197 utils/init/miscinit.c:1655 +#: utils/init/miscinit.c:1666 utils/init/miscinit.c:1674 utils/misc/guc.c:4491 +#: utils/misc/guc.c:4522 utils/misc/guc.c:5675 utils/misc/guc.c:5693 +#: utils/time/snapmgr.c:1239 utils/time/snapmgr.c:1246 #, c-format msgid "could not write to file \"%s\": %m" msgstr "konnte nicht in Datei »%s« schreiben: %m" -#: access/heap/vacuumlazy.c:482 +#: access/heap/vacuumlazy.c:473 #, c-format msgid "aggressively vacuuming \"%s.%s.%s\"" msgstr "aggressives Vacuum von »%s.%s.%s«" -#: access/heap/vacuumlazy.c:487 +#: access/heap/vacuumlazy.c:478 #, c-format msgid "vacuuming \"%s.%s.%s\"" msgstr "Vacuum von »%s.%s.%s«" -#: access/heap/vacuumlazy.c:635 +#: access/heap/vacuumlazy.c:626 #, c-format msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" msgstr "beende Vacuum der Tabelle »%s.%s.%s«: Index-Scans: %d\n" -#: access/heap/vacuumlazy.c:646 +#: access/heap/vacuumlazy.c:637 #, c-format msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisches aggressives Vacuum um Überlauf zu verhindern in der Tabelle »%s.%s.%s«: Index-Scans: %d\n" -#: access/heap/vacuumlazy.c:648 +#: access/heap/vacuumlazy.c:639 #, c-format msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisches Vacuum um Überlauf zu verhindern in der Tabelle »%s.%s.%s«: Index-Scans: %d\n" -#: access/heap/vacuumlazy.c:653 +#: access/heap/vacuumlazy.c:644 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisches aggressives Vacuum der Tabelle »%s.%s.%s«: Index-Scans: %d\n" -#: access/heap/vacuumlazy.c:655 +#: access/heap/vacuumlazy.c:646 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisches Vacuum der Tabelle »%s.%s.%s«: Index-Scans: %d\n" -#: access/heap/vacuumlazy.c:662 +#: access/heap/vacuumlazy.c:653 #, c-format msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" msgstr "Seiten: %u entfernt, %u verbleiben, %u gescannt (%.2f%% der Gesamtzahl)\n" -#: access/heap/vacuumlazy.c:669 +#: access/heap/vacuumlazy.c:660 #, c-format msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" msgstr "Tupel: %lld entfernt, %lld verbleiben, %lld sind tot aber noch nicht entfernbar\n" -#: access/heap/vacuumlazy.c:675 +#: access/heap/vacuumlazy.c:666 #, c-format msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" msgstr "verpasste Tupel: %lld tot von %u Seiten nicht entfernt wegen Cleanup-Lock-Konflikt\n" -#: access/heap/vacuumlazy.c:681 +#: access/heap/vacuumlazy.c:672 #, c-format msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" msgstr "entfernbare Obergrenze: %u, was %d XIDs alt war als die Operation endete\n" -#: access/heap/vacuumlazy.c:688 +#: access/heap/vacuumlazy.c:679 #, c-format msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" msgstr "neue relfrozenxid: %u, was %d XIDs vor dem vorherigen Wert ist\n" -#: access/heap/vacuumlazy.c:696 +#: access/heap/vacuumlazy.c:687 #, c-format msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" msgstr "neue relminmxid: %u, was %d MXIDs vor dem vorherigen Wert ist\n" -#: access/heap/vacuumlazy.c:699 -#, fuzzy, c-format -#| msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" +#: access/heap/vacuumlazy.c:690 +#, c-format msgid "frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n" -msgstr "in %u Seiten der Tabelle (%.2f%% der Gesamtzahl) wurden %lld tote Item-Bezeichner entfernt\n" +msgstr "eingefroren: in %u Seiten der Tabelle (%.2f%% der Gesamtzahl) wurden %lld Tupel eingefroren\n" -#: access/heap/vacuumlazy.c:707 +#: access/heap/vacuumlazy.c:698 msgid "index scan not needed: " msgstr "Index-Scan nicht benötigt: " -#: access/heap/vacuumlazy.c:709 +#: access/heap/vacuumlazy.c:700 msgid "index scan needed: " msgstr "Index-Scan benötigt: " -#: access/heap/vacuumlazy.c:711 +#: access/heap/vacuumlazy.c:702 #, c-format msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" msgstr "in %u Seiten der Tabelle (%.2f%% der Gesamtzahl) wurden %lld tote Item-Bezeichner entfernt\n" -#: access/heap/vacuumlazy.c:716 +#: access/heap/vacuumlazy.c:707 msgid "index scan bypassed: " msgstr "Index-Scan umgangen: " -#: access/heap/vacuumlazy.c:718 +#: access/heap/vacuumlazy.c:709 msgid "index scan bypassed by failsafe: " msgstr "Index-Scan umgangen durch Ausfallsicherung: " -#: access/heap/vacuumlazy.c:720 +#: access/heap/vacuumlazy.c:711 #, c-format msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" msgstr "%u Seiten der Tabelle (%.2f%% der Gesamtzahl) haben %lld tote Item-Bezeichner\n" -#: access/heap/vacuumlazy.c:735 +#: access/heap/vacuumlazy.c:726 #, c-format msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" msgstr "Index »%s«: Seiten: %u gesamt, %u neu gelöscht, %u gegenwärtig gelöscht, %u wiederverwendbar\n" -#: access/heap/vacuumlazy.c:747 commands/analyze.c:795 +#: access/heap/vacuumlazy.c:738 commands/analyze.c:794 #, c-format msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" msgstr "I/O-Zeitmessungen: Lesen: %.3f ms, Schreiben: %.3f ms\n" -#: access/heap/vacuumlazy.c:757 commands/analyze.c:798 +#: access/heap/vacuumlazy.c:748 commands/analyze.c:797 #, c-format msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" msgstr "durchschn. Leserate: %.3f MB/s, durchschn. Schreibrate: %.3f MB/s\n" -#: access/heap/vacuumlazy.c:760 commands/analyze.c:800 +#: access/heap/vacuumlazy.c:751 commands/analyze.c:799 #, c-format msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" msgstr "Puffer-Verwendung: %lld Treffer, %lld Verfehlen, %lld geändert\n" -#: access/heap/vacuumlazy.c:765 +#: access/heap/vacuumlazy.c:756 #, c-format msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" msgstr "WAL-Benutzung: %lld Einträge, %lld Full Page Images, %llu Bytes\n" -#: access/heap/vacuumlazy.c:769 commands/analyze.c:804 +#: access/heap/vacuumlazy.c:760 commands/analyze.c:803 #, c-format msgid "system usage: %s" msgstr "Systembenutzung: %s" -#: access/heap/vacuumlazy.c:2482 +#: access/heap/vacuumlazy.c:2173 #, c-format msgid "table \"%s\": removed %lld dead item identifiers in %u pages" msgstr "Tabelle »%s«: %lld tote Item-Bezeichner in %u Seiten entfernt" -#: access/heap/vacuumlazy.c:2642 +#: access/heap/vacuumlazy.c:2327 #, c-format msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" msgstr "umgehe nicht essentielle Wartung der Tabelle »%s.%s.%s« als Ausfallsicherung nach %d Index-Scans" -#: access/heap/vacuumlazy.c:2645 +#: access/heap/vacuumlazy.c:2330 #, c-format msgid "The table's relfrozenxid or relminmxid is too far in the past." msgstr "relfrozenxid oder relminmxid der Tabelle ist zu weit in der Vergangenheit." -#: access/heap/vacuumlazy.c:2646 +#: access/heap/vacuumlazy.c:2331 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1385,67 +1572,67 @@ msgstr "" "Erhöhen Sie eventuell die Konfigurationsparameter »maintenance_work_mem« oder »autovacuum_work_mem«.\n" "Sie müssen möglicherweise auch andere Wege in Betracht ziehen, wie VACUUM mit der Benutzung von Transaktions-IDs mithalten kann." -#: access/heap/vacuumlazy.c:2891 +#: access/heap/vacuumlazy.c:2593 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "»%s«: Truncate wird gestoppt wegen Sperrkonflikt" -#: access/heap/vacuumlazy.c:2961 +#: access/heap/vacuumlazy.c:2663 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "Tabelle »%s«: von %u auf %u Seiten verkürzt" -#: access/heap/vacuumlazy.c:3023 +#: access/heap/vacuumlazy.c:2725 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "Tabelle »%s«: Truncate wird ausgesetzt wegen Sperrkonflikt" -#: access/heap/vacuumlazy.c:3183 +#: access/heap/vacuumlazy.c:2844 #, c-format msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" msgstr "Paralleloption für Vacuum von »%s« wird deaktiviert --- Vacuum in temporären Tabellen kann nicht parallel ausgeführt werden" -#: access/heap/vacuumlazy.c:3399 +#: access/heap/vacuumlazy.c:3111 #, c-format msgid "while scanning block %u offset %u of relation \"%s.%s\"" msgstr "beim Scannen von Block %u Offset %u von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3402 +#: access/heap/vacuumlazy.c:3114 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "beim Scannen von Block %u von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3406 +#: access/heap/vacuumlazy.c:3118 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "beim Scannen von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3414 +#: access/heap/vacuumlazy.c:3126 #, c-format msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" msgstr "beim Vacuum von Block %u Offset %u von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3417 +#: access/heap/vacuumlazy.c:3129 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "beim Vacuum von Block %u von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3421 +#: access/heap/vacuumlazy.c:3133 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "beim Vacuum von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3426 commands/vacuumparallel.c:1074 +#: access/heap/vacuumlazy.c:3138 commands/vacuumparallel.c:1112 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "beim Vacuum von Index »%s« von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3431 commands/vacuumparallel.c:1080 +#: access/heap/vacuumlazy.c:3143 commands/vacuumparallel.c:1118 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "beim Säubern von Index »%s« von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3437 +#: access/heap/vacuumlazy.c:3149 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "beim Trunkieren von Relation »%s.%s« auf %u Blöcke" @@ -1460,19 +1647,24 @@ msgstr "Zugriffsmethode »%s« ist nicht vom Typ %s" msgid "index access method \"%s\" does not have a handler" msgstr "Indexzugriffsmethode »%s« hat keinen Handler" -#: access/index/genam.c:490 +#: access/index/genam.c:489 #, c-format msgid "transaction aborted during system catalog scan" msgstr "Transaktion während eines Systemkatalog-Scans abgebrochen" -#: access/index/indexam.c:142 catalog/objectaddress.c:1394 -#: commands/indexcmds.c:2852 commands/tablecmds.c:272 commands/tablecmds.c:296 -#: commands/tablecmds.c:17165 commands/tablecmds.c:18933 +#: access/index/genam.c:657 access/index/indexam.c:82 +#, c-format +msgid "cannot access index \"%s\" while it is being reindexed" +msgstr "auf Index »%s« kann nicht zugegriffen werden, während er reindiziert wird" + +#: access/index/indexam.c:203 catalog/objectaddress.c:1356 +#: commands/indexcmds.c:2851 commands/tablecmds.c:281 commands/tablecmds.c:305 +#: commands/tablecmds.c:17927 commands/tablecmds.c:19816 #, c-format msgid "\"%s\" is not an index" msgstr "»%s« ist kein Index" -#: access/index/indexam.c:979 +#: access/index/indexam.c:1028 #, c-format msgid "operator class %s has no options" msgstr "Operatorklasse %s hat keine Optionen" @@ -1493,7 +1685,7 @@ msgid "This may be because of a non-immutable index expression." msgstr "Das kann daran liegen, dass der Indexausdruck nicht »immutable« ist." #: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 -#: parser/parse_utilcmd.c:2317 +#: parser/parse_utilcmd.c:2323 #, c-format msgid "index \"%s\" is not a btree" msgstr "Index »%s« ist kein B-Tree" @@ -1503,27 +1695,27 @@ msgstr "Index »%s« ist kein B-Tree" msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" msgstr "keine Versionsübereinstimmung in Index »%s«: Dateiversion %d, aktuelle Version %d, kleinste unterstützte Version %d" -#: access/nbtree/nbtpage.c:1866 +#: access/nbtree/nbtpage.c:1861 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "Index »%s« enthält eine halbtote interne Seite" -#: access/nbtree/nbtpage.c:1868 +#: access/nbtree/nbtpage.c:1863 #, c-format msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." msgstr "Die Ursache kann ein unterbrochenes VACUUM in Version 9.3 oder älter vor dem Upgrade sein. Bitte REINDEX durchführen." -#: access/nbtree/nbtutils.c:2662 +#: access/nbtree/nbtutils.c:5108 #, c-format msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" msgstr "Größe %zu der Indexzeile überschreitet btree-Version %u Maximum %zu für Index »%s«" -#: access/nbtree/nbtutils.c:2668 +#: access/nbtree/nbtutils.c:5114 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "Indexzeile verweist auf Tupel (%u,%u) in Relation »%s«." -#: access/nbtree/nbtutils.c:2672 +#: access/nbtree/nbtutils.c:5118 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1537,12 +1729,18 @@ msgstr "" msgid "operator family \"%s\" of access method %s is missing support function for types %s and %s" msgstr "in Operatorfamilie »%s« für Zugriffsmethode %s fehlt Support-Funktion für Typen %s und %s" +#: access/sequence/sequence.c:75 access/table/table.c:145 +#: optimizer/util/plancat.c:144 +#, c-format +msgid "cannot open relation \"%s\"" +msgstr "kann Relation »%s« nicht öffnen" + #: access/spgist/spgutils.c:245 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "Compress-Methode muss definiert sein, wenn der Leaf-Typ verschieden vom Eingabetyp ist" -#: access/spgist/spgutils.c:1008 +#: access/spgist/spgutils.c:1028 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "innere Tupelgröße %zu überschreitet SP-GiST-Maximum %zu" @@ -1557,68 +1755,64 @@ msgstr "SP-GiST-Leaf-Datentyp %s stimmt nicht mit deklariertem Typ %s überein" msgid "operator family \"%s\" of access method %s is missing support function %d for type %s" msgstr "in Operatorfamilie »%s« für Zugriffsmethode %s fehlt Support-Funktion %d für Typ %s" -#: access/table/table.c:145 optimizer/util/plancat.c:145 -#, c-format -msgid "cannot open relation \"%s\"" -msgstr "kann Relation »%s« nicht öffnen" - -#: access/table/tableam.c:265 +#: access/table/tableam.c:256 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "tid (%u, %u) ist nicht gültig für Relation »%s«" -#: access/table/tableamapi.c:116 +#: access/table/tableamapi.c:109 #, c-format -msgid "%s cannot be empty." -msgstr "%s kann nicht leer sein." +msgid "\"%s\" cannot be empty." +msgstr "»%s« kann nicht leer sein." -#: access/table/tableamapi.c:123 access/transam/xlogrecovery.c:4774 +#: access/table/tableamapi.c:116 access/transam/xlogrecovery.c:4859 #, c-format -msgid "%s is too long (maximum %d characters)." -msgstr "%s ist zu lang (maximal %d Zeichen)." +msgid "\"%s\" is too long (maximum %d characters)." +msgstr "»%s« ist zu lang (maximal %d Zeichen)." -#: access/table/tableamapi.c:146 +#: access/table/tableamapi.c:139 #, c-format msgid "table access method \"%s\" does not exist" msgstr "Tabellenzugriffsmethode »%s« existiert nicht" -#: access/table/tableamapi.c:151 +#: access/table/tableamapi.c:144 #, c-format msgid "Table access method \"%s\" does not exist." msgstr "Tabellenzugriffsmethode »%s« existiert nicht." -#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:152 +#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:151 #, c-format msgid "sample percentage must be between 0 and 100" msgstr "Stichprobenprozentsatz muss zwischen 0 und 100 sein" -#: access/transam/commit_ts.c:279 +#: access/transam/commit_ts.c:287 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "Commit-Timestamp von Transaktion %u kann nicht abgefragt werden" -#: access/transam/commit_ts.c:377 +#: access/transam/commit_ts.c:385 #, c-format msgid "could not get commit timestamp data" msgstr "konnte Commit-Timestamp-Daten nicht auslesen" -#: access/transam/commit_ts.c:379 +#: access/transam/commit_ts.c:387 #, c-format msgid "Make sure the configuration parameter \"%s\" is set on the primary server." msgstr "Stellen Sie sicher, dass der Konfigurationsparameter »%s« auf dem Primärserver gesetzt ist." -#: access/transam/commit_ts.c:381 +#: access/transam/commit_ts.c:389 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Stellen Sie sicher, dass der Konfigurationsparameter »%s« gesetzt ist." -#: access/transam/multixact.c:1023 +#: access/transam/multixact.c:1091 #, c-format -msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"" -msgstr "Datenbank nimmt keine Befehle an, die neue MultiXactIds erzeugen, um Datenverlust wegen Transaktionsnummernüberlauf in Datenbank »%s« zu vermeiden" +msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database \"%s\"" +msgstr "Datenbank nimmt keine Befehle an, die neue MultiXactIds zuweisen, um Datenverlust wegen Transaktionsnummernüberlauf in Datenbank »%s« zu vermeiden" -#: access/transam/multixact.c:1025 access/transam/multixact.c:1032 -#: access/transam/multixact.c:1056 access/transam/multixact.c:1065 +#: access/transam/multixact.c:1093 access/transam/multixact.c:1100 +#: access/transam/multixact.c:1124 access/transam/multixact.c:1133 +#: access/transam/varsup.c:158 access/transam/varsup.c:165 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" @@ -1627,244 +1821,247 @@ msgstr "" "Führen Sie ein datenbankweites VACUUM in dieser Datenbank aus.\n" "Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen oder unbenutzte Replikations-Slots löschen." -#: access/transam/multixact.c:1030 +#: access/transam/multixact.c:1098 #, c-format -msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u" -msgstr "Datenbank nimmt keine Befehle an, die neue MultiXactIds erzeugen, um Datenverlust wegen Transaktionsnummernüberlauf in Datenbank mit OID %u zu vermeiden" +msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database with OID %u" +msgstr "Datenbank nimmt keine Befehle an, die neue MultiXactIds zuweisen, um Datenverlust wegen Transaktionsnummernüberlauf in Datenbank mit OID %u zu vermeiden" -#: access/transam/multixact.c:1051 access/transam/multixact.c:2333 +#: access/transam/multixact.c:1119 access/transam/multixact.c:2474 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" msgstr[0] "Datenbank »%s« muss gevacuumt werden, bevor %u weitere MultiXactId aufgebraucht ist" msgstr[1] "Datenbank »%s« muss gevacuumt werden, bevor %u weitere MultiXactIds aufgebraucht sind" -#: access/transam/multixact.c:1060 access/transam/multixact.c:2342 +#: access/transam/multixact.c:1128 access/transam/multixact.c:2483 #, c-format msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" msgstr[0] "Datenbank mit OID %u muss gevacuumt werden, bevor %u weitere MultiXactId aufgebraucht ist" msgstr[1] "Datenbank mit OID %u muss gevacuumt werden, bevor %u weitere MultiXactIds aufgebraucht sind" -#: access/transam/multixact.c:1121 +#: access/transam/multixact.c:1189 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "Grenzwert für Multixact-»Members« überschritten" -#: access/transam/multixact.c:1122 +#: access/transam/multixact.c:1190 #, c-format msgid "This command would create a multixact with %u members, but the remaining space is only enough for %u member." msgid_plural "This command would create a multixact with %u members, but the remaining space is only enough for %u members." msgstr[0] "Dieser Befehl würde eine Multixact mit %u Mitgliedern erzeugen, aber es ist nur genug Platz für %u Mitglied." msgstr[1] "Dieser Befehl würde eine Multixact mit %u Mitgliedern erzeugen, aber es ist nur genug Platz für %u Mitglieder." -#: access/transam/multixact.c:1127 +#: access/transam/multixact.c:1195 #, c-format -msgid "Execute a database-wide VACUUM in database with OID %u with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." -msgstr "Führen Sie ein datenbankweites VACUUM in der Datenbank mit OID %u aus, mit reduzierten Einstellungen für vacuum_multixact_freeze_min_age und vacuum_multixact_freeze_table_age." +msgid "Execute a database-wide VACUUM in database with OID %u with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." +msgstr "Führen Sie ein datenbankweites VACUUM in der Datenbank mit OID %u aus, mit reduzierten Einstellungen für »vacuum_multixact_freeze_min_age« und »vacuum_multixact_freeze_table_age«." -#: access/transam/multixact.c:1158 +#: access/transam/multixact.c:1226 #, c-format msgid "database with OID %u must be vacuumed before %d more multixact member is used" msgid_plural "database with OID %u must be vacuumed before %d more multixact members are used" msgstr[0] "Datenbank mit OID %u muss gevacuumt werden, bevor %d weiteres Multixact-Mitglied aufgebraucht ist" msgstr[1] "Datenbank mit OID %u muss gevacuumt werden, bevor %d weitere Multixact-Mitglieder aufgebraucht sind" -#: access/transam/multixact.c:1163 +#: access/transam/multixact.c:1231 #, c-format -msgid "Execute a database-wide VACUUM in that database with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." -msgstr "Führen Sie ein datenbankweites VACUUM in dieser Datenbank aus, mit reduzierten Einstellungen für vacuum_multixact_freeze_min_age und vacuum_multixact_freeze_table_age." +msgid "Execute a database-wide VACUUM in that database with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." +msgstr "Führen Sie ein datenbankweites VACUUM in dieser Datenbank aus, mit reduzierten Einstellungen für »vacuum_multixact_freeze_min_age« und »vacuum_multixact_freeze_table_age«." -#: access/transam/multixact.c:1302 +#: access/transam/multixact.c:1371 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %u existiert nicht mehr -- anscheinender Überlauf" -#: access/transam/multixact.c:1308 +#: access/transam/multixact.c:1377 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %u wurde noch nicht erzeugt -- anscheinender Überlauf" -#: access/transam/multixact.c:2338 access/transam/multixact.c:2347 -#: access/transam/varsup.c:151 access/transam/varsup.c:158 -#: access/transam/varsup.c:466 access/transam/varsup.c:473 +#: access/transam/multixact.c:2479 access/transam/multixact.c:2488 #, c-format msgid "" -"To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" +"To avoid MultiXactId assignment failures, execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." msgstr "" -"Um ein Abschalten der Datenbank zu vermeiden, führen Sie ein komplettes VACUUM über diese Datenbank aus.\n" +"Um Scheitern von MultiXactId-Zuweisungen zu vermeiden, führen Sie ein komplettes VACUUM über diese Datenbank aus.\n" "Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen oder unbenutzte Replikations-Slots löschen." -#: access/transam/multixact.c:2622 +#: access/transam/multixact.c:2767 #, c-format msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" msgstr "MultiXact-Member-Wraparound-Schutz ist deaktiviert, weil die älteste gecheckpointete MultiXact %u nicht auf der Festplatte existiert" -#: access/transam/multixact.c:2644 +#: access/transam/multixact.c:2789 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "MultiXact-Member-Wraparound-Schutz ist jetzt aktiviert" -#: access/transam/multixact.c:3027 +#: access/transam/multixact.c:3180 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "älteste MultiXact %u nicht gefunden, älteste ist MultiXact %u, Truncate wird ausgelassen" -#: access/transam/multixact.c:3045 +#: access/transam/multixact.c:3198 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" msgstr "kann nicht bis MultiXact %u trunkieren, weil sie nicht auf der Festplatte existiert, Trunkierung wird ausgelassen" -#: access/transam/multixact.c:3359 +#: access/transam/multixact.c:3517 #, c-format msgid "invalid MultiXactId: %u" msgstr "ungültige MultiXactId: %u" -#: access/transam/parallel.c:729 access/transam/parallel.c:848 +#: access/transam/parallel.c:748 access/transam/parallel.c:867 #, c-format msgid "parallel worker failed to initialize" msgstr "Initialisierung von parallelem Arbeitsprozess fehlgeschlagen" -#: access/transam/parallel.c:730 access/transam/parallel.c:849 +#: access/transam/parallel.c:749 access/transam/parallel.c:868 #, c-format msgid "More details may be available in the server log." msgstr "Weitere Einzelheiten sind möglicherweise im Serverlog zu finden." -#: access/transam/parallel.c:910 +#: access/transam/parallel.c:929 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "Postmaster beendete während einer parallelen Transaktion" -#: access/transam/parallel.c:1097 +#: access/transam/parallel.c:1116 #, c-format msgid "lost connection to parallel worker" msgstr "Verbindung mit parallelem Arbeitsprozess verloren" -#: access/transam/parallel.c:1163 access/transam/parallel.c:1165 +#: access/transam/parallel.c:1172 access/transam/parallel.c:1174 msgid "parallel worker" msgstr "paralleler Arbeitsprozess" -#: access/transam/parallel.c:1319 +#: access/transam/parallel.c:1344 replication/logical/applyparallelworker.c:890 #, c-format msgid "could not map dynamic shared memory segment" msgstr "konnte dynamisches Shared-Memory-Segment nicht mappen" -#: access/transam/parallel.c:1324 +#: access/transam/parallel.c:1349 replication/logical/applyparallelworker.c:896 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "ungültige magische Zahl in dynamischem Shared-Memory-Segment" -#: access/transam/rmgr.c:84 +#: access/transam/rmgr.c:93 #, c-format msgid "resource manager with ID %d not registered" -msgstr "Resouce-Manager mit ID %d nicht registriert" +msgstr "Resource-Manager mit ID %d nicht registriert" -#: access/transam/rmgr.c:85 +#: access/transam/rmgr.c:94 #, c-format -msgid "Include the extension module that implements this resource manager in shared_preload_libraries." -msgstr "Fügen Sie das Erweiterungsmodul, das diesen Resource-Manager implementiert, in shared_preload_libraries ein." +msgid "Include the extension module that implements this resource manager in \"shared_preload_libraries\"." +msgstr "Fügen Sie das Erweiterungsmodul, das diesen Resource-Manager implementiert, in »shared_preload_libraries« ein." -#: access/transam/rmgr.c:101 +#: access/transam/rmgr.c:110 #, c-format msgid "custom resource manager name is invalid" -msgstr "Custom-Resouce-Manager-Name ist ungültig" +msgstr "Custom-Resource-Manager-Name ist ungültig" -#: access/transam/rmgr.c:102 +#: access/transam/rmgr.c:111 #, c-format msgid "Provide a non-empty name for the custom resource manager." msgstr "Geben Sie einen nicht leeren Namen für den Custom-Resource-Manager an." -#: access/transam/rmgr.c:105 +#: access/transam/rmgr.c:114 #, c-format msgid "custom resource manager ID %d is out of range" -msgstr "Custom-Resouce-Manager-ID %d ist außerhalb des gültigen Bereichs" +msgstr "Custom-Resource-Manager-ID %d ist außerhalb des gültigen Bereichs" -#: access/transam/rmgr.c:106 +#: access/transam/rmgr.c:115 #, c-format msgid "Provide a custom resource manager ID between %d and %d." msgstr "Geben Sie eine Custom-Resource-Manager-ID zwischen %d und %d an." -#: access/transam/rmgr.c:111 access/transam/rmgr.c:116 -#: access/transam/rmgr.c:128 +#: access/transam/rmgr.c:120 access/transam/rmgr.c:125 +#: access/transam/rmgr.c:137 #, c-format msgid "failed to register custom resource manager \"%s\" with ID %d" -msgstr "konnte Custom-Resouce-Manager »%s« mit ID %d nicht registrieren" +msgstr "konnte Custom-Resource-Manager »%s« mit ID %d nicht registrieren" -#: access/transam/rmgr.c:112 +#: access/transam/rmgr.c:121 #, c-format -msgid "Custom resource manager must be registered while initializing modules in shared_preload_libraries." -msgstr "Custom-Resource-Manager muss beim Initialisieren von Modulen in shared_preload_libraries registriert werden." +msgid "Custom resource manager must be registered while initializing modules in \"shared_preload_libraries\"." +msgstr "Custom-Resource-Manager muss beim Initialisieren von Modulen in »shared_preload_libraries« registriert werden." -#: access/transam/rmgr.c:117 +#: access/transam/rmgr.c:126 #, c-format msgid "Custom resource manager \"%s\" already registered with the same ID." -msgstr "Custom-Resouce-Manager »%s« ist schon mit der gleichen ID registriert." +msgstr "Custom-Resource-Manager »%s« ist schon mit der gleichen ID registriert." -#: access/transam/rmgr.c:129 +#: access/transam/rmgr.c:138 #, c-format msgid "Existing resource manager with ID %d has the same name." msgstr "Bestehender Resource-Manager mit ID %d hat den gleichen Namen." -#: access/transam/rmgr.c:135 +#: access/transam/rmgr.c:144 #, c-format msgid "registered custom resource manager \"%s\" with ID %d" -msgstr "Custom-Resouce-Manager »%s« mit ID %d wurde registriert" +msgstr "Custom-Resource-Manager »%s« mit ID %d wurde registriert" + +#: access/transam/slru.c:361 +#, c-format +msgid "\"%s\" must be a multiple of %d" +msgstr "»%s« muss ein Vielfaches von %d sein" -#: access/transam/slru.c:714 +#: access/transam/slru.c:830 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "Datei »%s« existiert nicht, wird als Nullen eingelesen" -#: access/transam/slru.c:946 access/transam/slru.c:952 -#: access/transam/slru.c:960 access/transam/slru.c:965 -#: access/transam/slru.c:972 access/transam/slru.c:977 -#: access/transam/slru.c:984 access/transam/slru.c:991 +#: access/transam/slru.c:1059 access/transam/slru.c:1065 +#: access/transam/slru.c:1073 access/transam/slru.c:1078 +#: access/transam/slru.c:1085 access/transam/slru.c:1090 +#: access/transam/slru.c:1097 access/transam/slru.c:1104 #, c-format msgid "could not access status of transaction %u" msgstr "konnte auf den Status von Transaktion %u nicht zugreifen" -#: access/transam/slru.c:947 +#: access/transam/slru.c:1060 #, c-format msgid "Could not open file \"%s\": %m." msgstr "Konnte Datei »%s« nicht öffnen: %m." -#: access/transam/slru.c:953 +#: access/transam/slru.c:1066 #, c-format msgid "Could not seek in file \"%s\" to offset %d: %m." msgstr "Konnte Positionszeiger in Datei »%s« nicht auf %d setzen: %m." -#: access/transam/slru.c:961 +#: access/transam/slru.c:1074 #, c-format msgid "Could not read from file \"%s\" at offset %d: %m." msgstr "Konnte nicht aus Datei »%s« bei Position %d lesen: %m." -#: access/transam/slru.c:966 +#: access/transam/slru.c:1079 #, c-format msgid "Could not read from file \"%s\" at offset %d: read too few bytes." msgstr "Konnte nicht aus Datei »%s« bei Position %d lesen: zu wenige Bytes gelesen." -#: access/transam/slru.c:973 +#: access/transam/slru.c:1086 #, c-format msgid "Could not write to file \"%s\" at offset %d: %m." msgstr "Konnte nicht in Datei »%s« bei Position %d schreiben: %m." -#: access/transam/slru.c:978 +#: access/transam/slru.c:1091 #, c-format msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." msgstr "Konnte nicht in Datei »%s« bei Position %d schreiben: zu wenige Bytes geschrieben." -#: access/transam/slru.c:985 +#: access/transam/slru.c:1098 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "Konnte Datei »%s« nicht fsyncen: %m." -#: access/transam/slru.c:992 +#: access/transam/slru.c:1105 #, c-format msgid "Could not close file \"%s\": %m." msgstr "Konnte Datei »%s« nicht schließen: %m." -#: access/transam/slru.c:1253 +#: access/transam/slru.c:1431 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "konnte Verzeichnis »%s« nicht leeren: anscheinender Überlauf" @@ -1909,772 +2106,824 @@ msgstr "Zeitleisten-IDs müssen kleiner als die Zeitleisten-ID des Kindes sein." msgid "requested timeline %u is not in this server's history" msgstr "angeforderte Zeitleiste %u ist nicht in der History dieses Servers" -#: access/transam/twophase.c:385 +#: access/transam/twophase.c:368 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "Transaktionsbezeichner »%s« ist zu lang" -#: access/transam/twophase.c:392 +#: access/transam/twophase.c:375 #, c-format msgid "prepared transactions are disabled" msgstr "vorbereitete Transaktionen sind abgeschaltet" -#: access/transam/twophase.c:393 +#: access/transam/twophase.c:376 #, c-format -msgid "Set max_prepared_transactions to a nonzero value." -msgstr "Setzen Sie max_prepared_transactions auf einen Wert höher als null." +msgid "Set \"max_prepared_transactions\" to a nonzero value." +msgstr "Setzen Sie »max_prepared_transactions« auf einen Wert höher als null." -#: access/transam/twophase.c:412 +#: access/transam/twophase.c:395 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "Transaktionsbezeichner »%s« wird bereits verwendet" -#: access/transam/twophase.c:421 access/transam/twophase.c:2484 +#: access/transam/twophase.c:404 access/transam/twophase.c:2531 #, c-format msgid "maximum number of prepared transactions reached" msgstr "maximale Anzahl vorbereiteter Transaktionen erreicht" -#: access/transam/twophase.c:422 access/transam/twophase.c:2485 +#: access/transam/twophase.c:405 access/transam/twophase.c:2532 #, c-format -msgid "Increase max_prepared_transactions (currently %d)." -msgstr "Erhöhen Sie max_prepared_transactions (aktuell %d)." +msgid "Increase \"max_prepared_transactions\" (currently %d)." +msgstr "Erhöhen Sie »max_prepared_transactions« (aktuell %d)." -#: access/transam/twophase.c:598 +#: access/transam/twophase.c:580 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "vorbereitete Transaktion mit Bezeichner »%s« ist beschäftigt" -#: access/transam/twophase.c:604 +#: access/transam/twophase.c:586 #, c-format msgid "permission denied to finish prepared transaction" msgstr "keine Berechtigung, um vorbereitete Transaktion abzuschließen" -#: access/transam/twophase.c:605 +#: access/transam/twophase.c:587 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "Sie müssen Superuser oder der Benutzer sein, der die Transaktion vorbereitet hat." -#: access/transam/twophase.c:616 +#: access/transam/twophase.c:598 #, c-format msgid "prepared transaction belongs to another database" msgstr "vorbereitete Transaktion gehört zu einer anderen Datenbank" -#: access/transam/twophase.c:617 +#: access/transam/twophase.c:599 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "Verbinden Sie sich mit der Datenbank, wo die Transaktion vorbereitet wurde, um sie zu beenden." -#: access/transam/twophase.c:632 +#: access/transam/twophase.c:614 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "vorbereitete Transaktion mit Bezeichner »%s« existiert nicht" -#: access/transam/twophase.c:1167 +#: access/transam/twophase.c:1174 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "maximale Länge der Zweiphasen-Statusdatei überschritten" -#: access/transam/twophase.c:1322 +#: access/transam/twophase.c:1329 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" msgstr[0] "falsche Größe von Datei »%s«: %lld Byte" msgstr[1] "falsche Größe von Datei »%s«: %lld Bytes" -#: access/transam/twophase.c:1331 +#: access/transam/twophase.c:1338 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "falsche Ausrichtung des CRC-Offsets für Datei »%s«" -#: access/transam/twophase.c:1349 +#: access/transam/twophase.c:1356 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "konnte Datei »%s« nicht lesen: %d von %lld gelesen" -#: access/transam/twophase.c:1364 +#: access/transam/twophase.c:1371 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "ungültige magische Zahl in Datei »%s gespeichert«" -#: access/transam/twophase.c:1370 +#: access/transam/twophase.c:1377 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "ungültige Größe in Datei »%s« gespeichert" -#: access/transam/twophase.c:1382 +#: access/transam/twophase.c:1389 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "berechnete CRC-Prüfsumme stimmt nicht mit dem Wert in Datei »%s« überein" -#: access/transam/twophase.c:1412 access/transam/xlogrecovery.c:590 -#: replication/logical/logical.c:209 replication/walsender.c:687 +#: access/transam/twophase.c:1419 access/transam/xlogrecovery.c:565 +#: postmaster/walsummarizer.c:936 replication/logical/logical.c:211 +#: replication/walsender.c:840 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Fehlgeschlagen beim Anlegen eines WAL-Leseprozessors." -#: access/transam/twophase.c:1422 +#: access/transam/twophase.c:1429 #, c-format msgid "could not read two-phase state from WAL at %X/%X: %s" msgstr "konnte Zweiphasen-Status nicht aus dem WAL bei %X/%X lesen: %s" -#: access/transam/twophase.c:1427 +#: access/transam/twophase.c:1434 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "konnte Zweiphasen-Status nicht aus dem WAL bei %X/%X lesen" -#: access/transam/twophase.c:1435 +#: access/transam/twophase.c:1442 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "erwartete Zweiphasen-Status-Daten sind nicht im WAL bei %X/%X vorhanden" -#: access/transam/twophase.c:1731 +#: access/transam/twophase.c:1745 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "konnte Datei »%s« nicht neu erzeugen: %m" -#: access/transam/twophase.c:1858 +#: access/transam/twophase.c:1872 #, c-format msgid "%u two-phase state file was written for a long-running prepared transaction" msgid_plural "%u two-phase state files were written for long-running prepared transactions" msgstr[0] "%u Zweiphasen-Statusdatei wurde für eine lange laufende vorbereitete Transaktion geschrieben" msgstr[1] "%u Zweiphasen-Statusdateien wurden für lange laufende vorbereitete Transaktionen geschrieben" -#: access/transam/twophase.c:2092 +#: access/transam/twophase.c:2107 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "Wiederherstellung der vorbereiteten Transaktion %u aus dem Shared Memory" -#: access/transam/twophase.c:2185 +#: access/transam/twophase.c:2200 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "entferne abgelaufene Zweiphasen-Statusdatei für Transaktion %u" -#: access/transam/twophase.c:2192 +#: access/transam/twophase.c:2207 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "entferne abgelaufenen Zweiphasen-Status aus dem Speicher für Transaktion %u" -#: access/transam/twophase.c:2205 +#: access/transam/twophase.c:2220 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "entferne zukünftige Zweiphasen-Statusdatei für Transaktion %u" -#: access/transam/twophase.c:2212 +#: access/transam/twophase.c:2227 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "entferne zukünftigen Zweiphasen-Status aus dem Speicher für Transaktion %u" -#: access/transam/twophase.c:2237 +#: access/transam/twophase.c:2252 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "verfälschte Zweiphasen-Statusdatei für Transaktion %u" -#: access/transam/twophase.c:2242 +#: access/transam/twophase.c:2257 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "verfälschter Zweiphasen-Status im Speicher für Transaktion %u" -#: access/transam/varsup.c:129 +#: access/transam/twophase.c:2514 #, c-format -msgid "database is not accepting commands to avoid wraparound data loss in database \"%s\"" -msgstr "Datenbank nimmt keine Befehle an, um Datenverlust wegen Transaktionsnummernüberlauf in Datenbank »%s« zu vermeiden" +msgid "could not recover two-phase state file for transaction %u" +msgstr "konnte Zweiphasen-Statusdatei für Transaktion %u nicht wiederherstellen" -#: access/transam/varsup.c:131 access/transam/varsup.c:138 +#: access/transam/twophase.c:2516 #, c-format -msgid "" -"Stop the postmaster and vacuum that database in single-user mode.\n" -"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." -msgstr "" -"Halten Sie den Postmaster an und führen Sie in dieser Datenbank VACUUM im Einzelbenutzermodus aus.\n" -"Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen oder unbenutzte Replikations-Slots löschen." +msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." +msgstr "Zweiphasen-Statusdatei wurde in WAL-Eintrag %X/%X gefunden, aber diese Transaktion wurde schon von der Festplatte wiederhergestellt." + +#: access/transam/twophase.c:2524 storage/file/fd.c:514 utils/fmgr/dfmgr.c:209 +#, c-format +msgid "could not access file \"%s\": %m" +msgstr "konnte nicht auf Datei »%s« zugreifen: %m" + +#: access/transam/varsup.c:156 +#, c-format +msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database \"%s\"" +msgstr "Datenbank nimmt keine Befehle an, die neue Transaktions-IDs zuweisen, um Datenverlust wegen Transaktionsnummernüberlauf in Datenbank »%s« zu vermeiden" -#: access/transam/varsup.c:136 +#: access/transam/varsup.c:163 #, c-format -msgid "database is not accepting commands to avoid wraparound data loss in database with OID %u" -msgstr "Datenbank nimmt keine Befehle an, um Datenverlust wegen Transaktionsnummernüberlauf in Datenbank mit OID %u zu vermeiden" +msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database with OID %u" +msgstr "Datenbank nimmt keine Befehle an, die neue Transaktions-IDs zuweisen, um Datenverlust wegen Transaktionsnummernüberlauf in Datenbank mit OID %u zu vermeiden" -#: access/transam/varsup.c:148 access/transam/varsup.c:463 +#: access/transam/varsup.c:175 access/transam/varsup.c:490 #, c-format msgid "database \"%s\" must be vacuumed within %u transactions" msgstr "Datenbank »%s« muss innerhalb von %u Transaktionen gevacuumt werden" -#: access/transam/varsup.c:155 access/transam/varsup.c:470 +#: access/transam/varsup.c:178 +#, c-format +msgid "" +"To avoid transaction ID assignment failures, execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"Um ein Fehler bei der Zuweisung von Transaktions-IDs zu vermeiden, führen Sie ein komplettes VACUUM über diese Datenbank aus.\n" +"Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen oder unbenutzte Replikations-Slots löschen." + +#: access/transam/varsup.c:182 access/transam/varsup.c:497 #, c-format msgid "database with OID %u must be vacuumed within %u transactions" msgstr "Datenbank mit OID %u muss innerhalb von %u Transaktionen gevacuumt werden" -#: access/transam/xact.c:1102 +#: access/transam/varsup.c:185 access/transam/varsup.c:493 +#: access/transam/varsup.c:500 +#, c-format +msgid "" +"To avoid XID assignment failures, execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"Um ein Fehler bei der Zuweisung von XIDs zu vermeiden, führen Sie ein komplettes VACUUM über diese Datenbank aus.\n" +"Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen oder unbenutzte Replikations-Slots löschen." + +#: access/transam/xact.c:649 +#, c-format +msgid "cannot assign transaction IDs during a parallel operation" +msgstr "während einer parallelen Operation können keine Transaktions-IDs zugewiesen werden" + +#: access/transam/xact.c:840 +#, c-format +msgid "cannot modify data in a parallel worker" +msgstr "in einem parallelen Arbeitsprozess können keine Daten modifiziert werden" + +#: access/transam/xact.c:1115 +#, c-format +msgid "cannot start commands during a parallel operation" +msgstr "während einer parallelen Operation können keine Befehle gestartet werden" + +#: access/transam/xact.c:1123 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "kann nicht mehr als 2^32-2 Befehle in einer Transaktion ausführen" -#: access/transam/xact.c:1643 +#: access/transam/xact.c:1664 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "maximale Anzahl committeter Subtransaktionen (%d) überschritten" -#: access/transam/xact.c:2513 +#: access/transam/xact.c:2561 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "PREPARE kann nicht für eine Transaktion ausgeführt werden, die temporäre Objekte bearbeitet hat" -#: access/transam/xact.c:2523 +#: access/transam/xact.c:2571 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "PREPARE kann nicht für eine Transaktion ausgeführt werden, die Snapshots exportiert hat" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3489 +#: access/transam/xact.c:3593 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s kann nicht in einem Transaktionsblock laufen" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3499 +#: access/transam/xact.c:3603 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s kann nicht in einer Subtransaktion laufen" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3509 +#: access/transam/xact.c:3613 #, c-format msgid "%s cannot be executed within a pipeline" msgstr "%s kann nicht innerhalb einer Pipeline ausgeführt werden" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3519 +#: access/transam/xact.c:3623 #, c-format msgid "%s cannot be executed from a function" msgstr "%s kann nicht aus einer Funktion ausgeführt werden" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3590 access/transam/xact.c:3915 -#: access/transam/xact.c:3994 access/transam/xact.c:4117 -#: access/transam/xact.c:4268 access/transam/xact.c:4337 -#: access/transam/xact.c:4448 +#: access/transam/xact.c:3694 access/transam/xact.c:4019 +#: access/transam/xact.c:4098 access/transam/xact.c:4221 +#: access/transam/xact.c:4372 access/transam/xact.c:4441 +#: access/transam/xact.c:4552 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s kann nur in Transaktionsblöcken verwendet werden" -#: access/transam/xact.c:3801 +#: access/transam/xact.c:3905 #, c-format msgid "there is already a transaction in progress" msgstr "eine Transaktion ist bereits begonnen" -#: access/transam/xact.c:3920 access/transam/xact.c:3999 -#: access/transam/xact.c:4122 +#: access/transam/xact.c:4024 access/transam/xact.c:4103 +#: access/transam/xact.c:4226 #, c-format msgid "there is no transaction in progress" msgstr "keine Transaktion offen" -#: access/transam/xact.c:4010 +#: access/transam/xact.c:4114 #, c-format msgid "cannot commit during a parallel operation" msgstr "während einer parallelen Operation kann nicht committet werden" -#: access/transam/xact.c:4133 +#: access/transam/xact.c:4237 #, c-format msgid "cannot abort during a parallel operation" msgstr "während einer parallelen Operation kann nicht abgebrochen werden" -#: access/transam/xact.c:4232 +#: access/transam/xact.c:4336 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "während einer parallelen Operation können keine Sicherungspunkte definiert werden" -#: access/transam/xact.c:4319 +#: access/transam/xact.c:4423 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "während einer parallelen Operation können keine Sicherungspunkte freigegeben werden" -#: access/transam/xact.c:4329 access/transam/xact.c:4380 -#: access/transam/xact.c:4440 access/transam/xact.c:4489 +#: access/transam/xact.c:4433 access/transam/xact.c:4484 +#: access/transam/xact.c:4544 access/transam/xact.c:4593 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "Sicherungspunkt »%s« existiert nicht" -#: access/transam/xact.c:4386 access/transam/xact.c:4495 +#: access/transam/xact.c:4490 access/transam/xact.c:4599 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "Sicherungspunkt »%s« existiert nicht innerhalb der aktuellen Sicherungspunktebene" -#: access/transam/xact.c:4428 +#: access/transam/xact.c:4532 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "während einer parallelen Operation kann nicht auf einen Sicherungspunkt zurückgerollt werden" -#: access/transam/xact.c:4556 -#, c-format -msgid "cannot start subtransactions during a parallel operation" -msgstr "während einer parallelen Operation können keine Subtransaktionen gestartet werden" - -#: access/transam/xact.c:4624 -#, c-format -msgid "cannot commit subtransactions during a parallel operation" -msgstr "während einer parallelen Operation können keine Subtransaktionen committet werden" - -#: access/transam/xact.c:5270 +#: access/transam/xact.c:5376 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "kann nicht mehr als 2^32-1 Subtransaktionen in einer Transaktion haben" -#: access/transam/xlog.c:1466 +#: access/transam/xlog.c:1542 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" msgstr "Flush hinter das Ende des erzeugten WAL angefordert; Anforderung %X/%X, aktuelle Position %X/%X" +#: access/transam/xlog.c:1769 +#, c-format +msgid "cannot read past end of generated WAL: requested %X/%X, current position %X/%X" +msgstr "kann nicht hinter das Ende des erzeugten WAL lesen: Anforderung %X/%X, aktuelle Position %X/%X" + +#: access/transam/xlog.c:2210 access/transam/xlog.c:4501 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "Die WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein." + #: access/transam/xlog.c:2228 #, c-format -msgid "could not write to log file %s at offset %u, length %zu: %m" -msgstr "konnte nicht in Logdatei %s bei Position %u, Länge %zu schreiben: %m" +msgid "\"%s\" must be set to -1 during binary upgrade mode." +msgstr "»%s« muss im Binary-Upgrade-Modus auf -1 gesetzt sein." + +#: access/transam/xlog.c:2477 +#, c-format +msgid "could not write to log file \"%s\" at offset %u, length %zu: %m" +msgstr "konnte nicht in Logdatei »%s« bei Position %u, Länge %zu schreiben: %m" -#: access/transam/xlog.c:3455 access/transam/xlogutils.c:833 -#: replication/walsender.c:2725 +#: access/transam/xlog.c:3739 access/transam/xlogutils.c:831 +#: replication/walsender.c:3075 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "das angeforderte WAL-Segment %s wurde schon entfernt" -#: access/transam/xlog.c:3739 +#: access/transam/xlog.c:4061 #, c-format msgid "could not rename file \"%s\": %m" msgstr "konnte Datei »%s« nicht umbenennen: %m" -#: access/transam/xlog.c:3781 access/transam/xlog.c:3791 +#: access/transam/xlog.c:4104 access/transam/xlog.c:4115 +#: access/transam/xlog.c:4136 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "benötigtes WAL-Verzeichnis »%s« existiert nicht" -#: access/transam/xlog.c:3797 +#: access/transam/xlog.c:4121 access/transam/xlog.c:4142 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "erzeuge fehlendes WAL-Verzeichnis »%s«" -#: access/transam/xlog.c:3800 commands/dbcommands.c:3102 +#: access/transam/xlog.c:4125 access/transam/xlog.c:4145 +#: commands/dbcommands.c:3262 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "konnte fehlendes Verzeichnis »%s« nicht erzeugen: %m" -#: access/transam/xlog.c:3867 +#: access/transam/xlog.c:4212 #, c-format msgid "could not generate secret authorization token" msgstr "konnte geheimes Autorisierungstoken nicht erzeugen" -#: access/transam/xlog.c:4017 access/transam/xlog.c:4026 -#: access/transam/xlog.c:4050 access/transam/xlog.c:4057 -#: access/transam/xlog.c:4064 access/transam/xlog.c:4069 -#: access/transam/xlog.c:4076 access/transam/xlog.c:4083 -#: access/transam/xlog.c:4090 access/transam/xlog.c:4097 -#: access/transam/xlog.c:4104 access/transam/xlog.c:4111 -#: access/transam/xlog.c:4120 access/transam/xlog.c:4127 -#: utils/init/miscinit.c:1762 +#: access/transam/xlog.c:4363 access/transam/xlog.c:4373 +#: access/transam/xlog.c:4399 access/transam/xlog.c:4407 +#: access/transam/xlog.c:4415 access/transam/xlog.c:4421 +#: access/transam/xlog.c:4429 access/transam/xlog.c:4437 +#: access/transam/xlog.c:4445 access/transam/xlog.c:4453 +#: access/transam/xlog.c:4461 access/transam/xlog.c:4469 +#: access/transam/xlog.c:4479 access/transam/xlog.c:4487 +#: utils/init/miscinit.c:1812 #, c-format msgid "database files are incompatible with server" msgstr "Datenbankdateien sind inkompatibel mit Server" -#: access/transam/xlog.c:4018 +#: access/transam/xlog.c:4364 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "Der Datenbank-Cluster wurde mit PG_CONTROL_VERSION %d (0x%08x) initialisiert, aber der Server wurde mit PG_CONTROL_VERSION %d (0x%08x) kompiliert." -#: access/transam/xlog.c:4022 +#: access/transam/xlog.c:4368 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "Das Problem könnte eine falsche Byte-Reihenfolge sein. Es sieht so aus, dass Sie initdb ausführen müssen." -#: access/transam/xlog.c:4027 +#: access/transam/xlog.c:4374 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "Der Datenbank-Cluster wurde mit PG_CONTROL_VERSION %d initialisiert, aber der Server wurde mit PG_CONTROL_VERSION %d kompiliert." -#: access/transam/xlog.c:4030 access/transam/xlog.c:4054 -#: access/transam/xlog.c:4061 access/transam/xlog.c:4066 +#: access/transam/xlog.c:4377 access/transam/xlog.c:4403 +#: access/transam/xlog.c:4411 access/transam/xlog.c:4417 #, c-format msgid "It looks like you need to initdb." msgstr "Es sieht so aus, dass Sie initdb ausführen müssen." -#: access/transam/xlog.c:4041 +#: access/transam/xlog.c:4389 #, c-format msgid "incorrect checksum in control file" msgstr "falsche Prüfsumme in Kontrolldatei" -#: access/transam/xlog.c:4051 +#: access/transam/xlog.c:4400 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "Der Datenbank-Cluster wurde mit CATALOG_VERSION_NO %d initialisiert, aber der Server wurde mit CATALOG_VERSION_NO %d kompiliert." -#: access/transam/xlog.c:4058 +#: access/transam/xlog.c:4408 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "Der Datenbank-Cluster wurde mit MAXALIGN %d initialisiert, aber der Server wurde mit MAXALIGN %d kompiliert." -#: access/transam/xlog.c:4065 +#: access/transam/xlog.c:4416 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "Der Datenbank-Cluster verwendet anscheinend ein anderes Fließkommazahlenformat als das Serverprogramm." -#: access/transam/xlog.c:4070 +#: access/transam/xlog.c:4422 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "Der Datenbank-Cluster wurde mit BLCKSZ %d initialisiert, aber der Server wurde mit BLCKSZ %d kompiliert." -#: access/transam/xlog.c:4073 access/transam/xlog.c:4080 -#: access/transam/xlog.c:4087 access/transam/xlog.c:4094 -#: access/transam/xlog.c:4101 access/transam/xlog.c:4108 -#: access/transam/xlog.c:4115 access/transam/xlog.c:4123 -#: access/transam/xlog.c:4130 +#: access/transam/xlog.c:4425 access/transam/xlog.c:4433 +#: access/transam/xlog.c:4441 access/transam/xlog.c:4449 +#: access/transam/xlog.c:4457 access/transam/xlog.c:4465 +#: access/transam/xlog.c:4473 access/transam/xlog.c:4482 +#: access/transam/xlog.c:4490 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Es sieht so aus, dass Sie neu kompilieren oder initdb ausführen müssen." -#: access/transam/xlog.c:4077 +#: access/transam/xlog.c:4430 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "Der Datenbank-Cluster wurde mit RELSEG_SIZE %d initialisiert, aber der Server wurde mit RELSEGSIZE %d kompiliert." -#: access/transam/xlog.c:4084 +#: access/transam/xlog.c:4438 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "Der Datenbank-Cluster wurde mit XLOG_BLCKSZ %d initialisiert, aber der Server wurde mit XLOG_BLCKSZ %d kompiliert." -#: access/transam/xlog.c:4091 +#: access/transam/xlog.c:4446 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "Der Datenbank-Cluster wurde mit NAMEDATALEN %d initialisiert, aber der Server wurde mit NAMEDATALEN %d kompiliert." -#: access/transam/xlog.c:4098 +#: access/transam/xlog.c:4454 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "Der Datenbank-Cluster wurde mit INDEX_MAX_KEYS %d initialisiert, aber der Server wurde mit INDEX_MAX_KEYS %d kompiliert." -#: access/transam/xlog.c:4105 +#: access/transam/xlog.c:4462 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "Der Datenbank-Cluster wurde mit TOAST_MAX_CHUNK_SIZE %d initialisiert, aber der Server wurde mit TOAST_MAX_CHUNK_SIZE %d kompiliert." -#: access/transam/xlog.c:4112 +#: access/transam/xlog.c:4470 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "Der Datenbank-Cluster wurde mit LOBLKSIZE %d initialisiert, aber der Server wurde mit LOBLKSIZE %d kompiliert." -#: access/transam/xlog.c:4121 +#: access/transam/xlog.c:4480 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "Der Datenbank-Cluster wurde ohne USE_FLOAT8_BYVAL initialisiert, aber der Server wurde mit USE_FLOAT8_BYVAL kompiliert." -#: access/transam/xlog.c:4128 +#: access/transam/xlog.c:4488 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "Der Datenbank-Cluster wurde mit USE_FLOAT8_BYVAL initialisiert, aber der Server wurde ohne USE_FLOAT8_BYVAL kompiliert." -#: access/transam/xlog.c:4137 +#: access/transam/xlog.c:4497 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" -msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Byte an" -msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Bytes an" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "ungültige WAL-Segmentgröße in Kontrolldatei (%d Byte)" +msgstr[1] "ungültige WAL-Segmentgröße in Kontrolldatei (%d Bytes)" -#: access/transam/xlog.c:4149 +#: access/transam/xlog.c:4510 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "»min_wal_size« muss mindestens zweimal so groß wie »wal_segment_size« sein" -#: access/transam/xlog.c:4153 +#: access/transam/xlog.c:4514 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "»max_wal_size« muss mindestens zweimal so groß wie »wal_segment_size« sein" -#: access/transam/xlog.c:4308 catalog/namespace.c:4335 -#: commands/tablespace.c:1216 commands/user.c:2536 commands/variable.c:72 -#: utils/error/elog.c:2205 +#: access/transam/xlog.c:4662 catalog/namespace.c:4696 +#: commands/tablespace.c:1210 commands/user.c:2529 commands/variable.c:72 +#: replication/slot.c:2446 tcop/postgres.c:3715 utils/error/elog.c:2247 #, c-format msgid "List syntax is invalid." msgstr "Die Listensyntax ist ungültig." -#: access/transam/xlog.c:4354 commands/user.c:2552 commands/variable.c:173 -#: utils/error/elog.c:2231 +#: access/transam/xlog.c:4708 commands/user.c:2545 commands/variable.c:173 +#: tcop/postgres.c:3731 utils/error/elog.c:2273 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Unbekanntes Schlüsselwort: »%s«." -#: access/transam/xlog.c:4768 +#: access/transam/xlog.c:5129 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "konnte Bootstrap-Write-Ahead-Log-Datei nicht schreiben: %m" -#: access/transam/xlog.c:4776 +#: access/transam/xlog.c:5137 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "konnte Bootstrap-Write-Ahead-Log-Datei nicht fsyncen: %m" -#: access/transam/xlog.c:4782 +#: access/transam/xlog.c:5143 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "konnte Bootstrap-Write-Ahead-Log-Datei nicht schließen: %m" -#: access/transam/xlog.c:4999 +#: access/transam/xlog.c:5368 #, c-format -msgid "WAL was generated with wal_level=minimal, cannot continue recovering" -msgstr "WAL wurde mit wal_level=minimal erzeugt, Wiederherstellung kann nicht fortgesetzt werden" +msgid "WAL was generated with \"wal_level=minimal\", cannot continue recovering" +msgstr "WAL wurde mit »wal_level=minimal« erzeugt, Wiederherstellung kann nicht fortgesetzt werden" -#: access/transam/xlog.c:5000 +#: access/transam/xlog.c:5369 #, c-format -msgid "This happens if you temporarily set wal_level=minimal on the server." -msgstr "Das passiert, wenn auf dem Server vorübergehend wal_level=minimal gesetzt wurde." +msgid "This happens if you temporarily set \"wal_level=minimal\" on the server." +msgstr "Das passiert, wenn auf dem Server vorübergehend »wal_level=minimal« gesetzt wurde." -#: access/transam/xlog.c:5001 +#: access/transam/xlog.c:5370 #, c-format -msgid "Use a backup taken after setting wal_level to higher than minimal." -msgstr "Verwenden Sie ein Backup, das durchgeführt wurde, nachdem wal_level auf höher als minimal gesetzt wurde." +msgid "Use a backup taken after setting \"wal_level\" to higher than \"minimal\"." +msgstr "Verwenden Sie ein Backup, das durchgeführt wurde, nachdem »wal_level« auf höher als »minimal« gesetzt wurde." -#: access/transam/xlog.c:5065 +#: access/transam/xlog.c:5435 #, c-format msgid "control file contains invalid checkpoint location" msgstr "Kontrolldatei enthält ungültige Checkpoint-Position" -#: access/transam/xlog.c:5076 +#: access/transam/xlog.c:5446 #, c-format msgid "database system was shut down at %s" msgstr "Datenbanksystem wurde am %s heruntergefahren" -#: access/transam/xlog.c:5082 +#: access/transam/xlog.c:5452 #, c-format msgid "database system was shut down in recovery at %s" msgstr "Datenbanksystem wurde während der Wiederherstellung am %s heruntergefahren" -#: access/transam/xlog.c:5088 +#: access/transam/xlog.c:5458 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "Datenbanksystem wurde beim Herunterfahren unterbrochen; letzte bekannte Aktion am %s" -#: access/transam/xlog.c:5094 +#: access/transam/xlog.c:5464 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "Datenbanksystem wurde während der Wiederherstellung am %s unterbrochen" -#: access/transam/xlog.c:5096 +#: access/transam/xlog.c:5466 #, c-format msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." msgstr "Das bedeutet wahrscheinlich, dass einige Daten verfälscht sind und Sie die letzte Datensicherung zur Wiederherstellung verwenden müssen." -#: access/transam/xlog.c:5102 +#: access/transam/xlog.c:5472 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "Datenbanksystem wurde während der Wiederherstellung bei Logzeit %s unterbrochen" -#: access/transam/xlog.c:5104 +#: access/transam/xlog.c:5474 #, c-format msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." msgstr "Wenn dies mehr als einmal vorgekommen ist, dann sind einige Daten möglicherweise verfälscht und Sie müssen ein früheres Wiederherstellungsziel wählen." -#: access/transam/xlog.c:5110 +#: access/transam/xlog.c:5480 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "Datenbanksystem wurde unterbrochen; letzte bekannte Aktion am %s" -#: access/transam/xlog.c:5116 +#: access/transam/xlog.c:5487 #, c-format msgid "control file contains invalid database cluster state" msgstr "Kontrolldatei enthält ungültigen Datenbankclusterstatus" -#: access/transam/xlog.c:5500 +#: access/transam/xlog.c:5875 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL endet vor dem Ende der Online-Sicherung" -#: access/transam/xlog.c:5501 +#: access/transam/xlog.c:5876 #, c-format msgid "All WAL generated while online backup was taken must be available at recovery." msgstr "Der komplette WAL, der während der Online-Sicherung erzeugt wurde, muss bei der Wiederherstellung verfügbar sein." -#: access/transam/xlog.c:5504 +#: access/transam/xlog.c:5880 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL endet vor einem konsistenten Wiederherstellungspunkt" -#: access/transam/xlog.c:5550 +#: access/transam/xlog.c:5926 #, c-format msgid "selected new timeline ID: %u" msgstr "gewählte neue Zeitleisten-ID: %u" -#: access/transam/xlog.c:5583 +#: access/transam/xlog.c:5959 #, c-format msgid "archive recovery complete" msgstr "Wiederherstellung aus Archiv abgeschlossen" -#: access/transam/xlog.c:6189 +#: access/transam/xlog.c:6612 #, c-format msgid "shutting down" msgstr "fahre herunter" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6228 +#: access/transam/xlog.c:6651 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "Restart-Punkt beginnt:%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6240 +#: access/transam/xlog.c:6663 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "Checkpoint beginnt:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6305 +#: access/transam/xlog.c:6728 #, c-format msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "Restart-Punkt komplett: %d Puffer geschrieben (%.1f%%); %d WAL-Datei(en) hinzugefügt, %d entfernt, %d wiederverwendet; Schreiben=%ld,%03d s, Sync=%ld,%03d s, gesamt=%ld,%03d s; sync. Dateien=%d, längste=%ld,%03d s, Durchschnitt=%ld.%03d s; Entfernung=%d kB, Schätzung=%d kB; LSN=%X/%X, Redo-LSN=%X/%X" -#: access/transam/xlog.c:6328 +#: access/transam/xlog.c:6751 #, c-format msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "Checkpoint komplett: %d Puffer geschrieben (%.1f%%); %d WAL-Datei(en) hinzugefügt, %d entfernt, %d wiederverwendet; Schreiben=%ld,%03d s, Sync=%ld,%03d s, gesamt=%ld,%03d s; sync. Dateien=%d, längste=%ld,%03d s, Durchschnitt=%ld.%03d s; Entfernung=%d kB, Schätzung=%d kB; LSN=%X/%X, Redo-LSN=%X/%X" -#: access/transam/xlog.c:6766 +#: access/transam/xlog.c:7233 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "gleichzeitige Write-Ahead-Log-Aktivität während das Datenbanksystem herunterfährt" -#: access/transam/xlog.c:7327 +#: access/transam/xlog.c:7818 #, c-format msgid "recovery restart point at %X/%X" msgstr "Recovery-Restart-Punkt bei %X/%X" -#: access/transam/xlog.c:7329 +#: access/transam/xlog.c:7820 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Die letzte vollständige Transaktion war bei Logzeit %s." -#: access/transam/xlog.c:7577 +#: access/transam/xlog.c:8082 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "Restore-Punkt »%s« erzeugt bei %X/%X" -#: access/transam/xlog.c:7784 +#: access/transam/xlog.c:8289 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "Online-Sicherung wurde storniert, Wiederherstellung kann nicht fortgesetzt werden" -#: access/transam/xlog.c:7841 +#: access/transam/xlog.c:8347 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im Shutdown-Checkpoint-Datensatz" -#: access/transam/xlog.c:7899 +#: access/transam/xlog.c:8405 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im Online-Checkpoint-Datensatz" -#: access/transam/xlog.c:7928 +#: access/transam/xlog.c:8434 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "unerwartete Zeitleisten-ID %u (sollte %u sein) im End-of-Recovery-Datensatz" -#: access/transam/xlog.c:8195 +#: access/transam/xlog.c:8705 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "konnte Write-Through-Logdatei »%s« nicht fsyncen: %m" -#: access/transam/xlog.c:8200 +#: access/transam/xlog.c:8710 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fdatasyncen: %m" -#: access/transam/xlog.c:8285 access/transam/xlog.c:8608 +#: access/transam/xlog.c:8797 access/transam/xlog.c:9133 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "WAL-Level nicht ausreichend, um Online-Sicherung durchzuführen" -#: access/transam/xlog.c:8286 access/transam/xlog.c:8609 -#: access/transam/xlogfuncs.c:254 +#: access/transam/xlog.c:8798 access/transam/xlogfuncs.c:248 #, c-format -msgid "wal_level must be set to \"replica\" or \"logical\" at server start." -msgstr "wal_level muss beim Serverstart auf »replica« oder »logical« gesetzt werden." +msgid "\"wal_level\" must be set to \"replica\" or \"logical\" at server start." +msgstr "»wal_level« muss beim Serverstart auf »replica« oder »logical« gesetzt werden." -#: access/transam/xlog.c:8291 +#: access/transam/xlog.c:8803 #, c-format msgid "backup label too long (max %d bytes)" msgstr "Backup-Label zu lang (maximal %d Bytes)" -#: access/transam/xlog.c:8412 +#: access/transam/xlog.c:8924 #, c-format -msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "mit full_page_writes=off erzeugtes WAL wurde seit dem letzten Restart-Punkt zurückgespielt" +msgid "WAL generated with \"full_page_writes=off\" was replayed since last restartpoint" +msgstr "mit »full_page_writes=off« erzeugtes WAL wurde seit dem letzten Restart-Punkt zurückgespielt" -#: access/transam/xlog.c:8414 access/transam/xlog.c:8697 +#: access/transam/xlog.c:8926 access/transam/xlog.c:9222 #, c-format -msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." -msgstr "Das bedeutet, dass die aktuelle Datensicherung auf dem Standby-Server verfälscht ist und nicht verwendet werden sollte. Schalten Sie auf dem Primärserver full_page_writes ein, führen Sie dort CHECKPOINT aus und versuchen Sie dann die Online-Sicherung erneut." +msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable \"full_page_writes\" and run CHECKPOINT on the primary, and then try an online backup again." +msgstr "Das bedeutet, dass die aktuelle Datensicherung auf dem Standby-Server verfälscht ist und nicht verwendet werden sollte. Schalten Sie auf dem Primärserver »full_page_writes« ein, führen Sie dort CHECKPOINT aus und versuchen Sie dann die Online-Sicherung erneut." -#: access/transam/xlog.c:8481 backup/basebackup.c:1351 utils/adt/misc.c:354 +#: access/transam/xlog.c:9006 backup/basebackup.c:1417 utils/adt/misc.c:354 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m" -#: access/transam/xlog.c:8488 backup/basebackup.c:1356 utils/adt/misc.c:359 +#: access/transam/xlog.c:9013 backup/basebackup.c:1422 utils/adt/misc.c:359 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "Ziel für symbolische Verknüpfung »%s« ist zu lang" -#: access/transam/xlog.c:8647 backup/basebackup.c:1217 +#: access/transam/xlog.c:9134 +#, c-format +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "wal_level muss beim Serverstart auf »replica« oder »logical« gesetzt werden." + +#: access/transam/xlog.c:9172 backup/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "der Standby-Server wurde während der Online-Sicherung zum Primärserver befördert" -#: access/transam/xlog.c:8648 backup/basebackup.c:1218 +#: access/transam/xlog.c:9173 backup/basebackup.c:1282 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "Das bedeutet, dass die aktuelle Online-Sicherung verfälscht ist und nicht verwendet werden sollte. Versuchen Sie, eine neue Online-Sicherung durchzuführen." -#: access/transam/xlog.c:8695 +#: access/transam/xlog.c:9220 #, c-format -msgid "WAL generated with full_page_writes=off was replayed during online backup" -msgstr "mit full_page_writes=off erzeugtes WAL wurde während der Online-Sicherung zurückgespielt" +msgid "WAL generated with \"full_page_writes=off\" was replayed during online backup" +msgstr "mit »full_page_writes=off« erzeugtes WAL wurde während der Online-Sicherung zurückgespielt" -#: access/transam/xlog.c:8811 +#: access/transam/xlog.c:9336 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "Basissicherung beendet, warte bis die benötigten WAL-Segmente archiviert sind" -#: access/transam/xlog.c:8825 +#: access/transam/xlog.c:9350 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "warte immer noch, bis alle benötigten WAL-Segmente archiviert sind (%d Sekunden abgelaufen)" -#: access/transam/xlog.c:8827 +#: access/transam/xlog.c:9352 #, c-format -msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." -msgstr "Prüfen Sie, ob das archive_command korrekt ausgeführt wird. Dieser Sicherungsvorgang kann gefahrlos abgebrochen werden, aber die Datenbanksicherung wird ohne die fehlenden WAL-Segmente nicht benutzbar sein." +msgid "Check that your \"archive_command\" is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." +msgstr "Prüfen Sie, ob das »archive_command« korrekt ausgeführt wird. Dieser Sicherungsvorgang kann gefahrlos abgebrochen werden, aber die Datenbanksicherung wird ohne die fehlenden WAL-Segmente nicht benutzbar sein." -#: access/transam/xlog.c:8834 +#: access/transam/xlog.c:9359 #, c-format msgid "all required WAL segments have been archived" msgstr "alle benötigten WAL-Segmente wurden archiviert" -#: access/transam/xlog.c:8838 +#: access/transam/xlog.c:9363 #, c-format msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" msgstr "WAL-Archivierung ist nicht eingeschaltet; Sie müssen dafür sorgen, dass alle benötigten WAL-Segmente auf andere Art kopiert werden, um die Sicherung abzuschließen" -#: access/transam/xlog.c:8877 +#: access/transam/xlog.c:9402 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "Backup wird abgebrochen, weil Backend-Prozess beendete, bevor pg_backup_stop aufgerufen wurde" -#: access/transam/xlogarchive.c:207 +#: access/transam/xlogarchive.c:213 #, c-format msgid "archive file \"%s\" has wrong size: %lld instead of %lld" msgstr "Archivdatei »%s« hat falsche Größe: %lld statt %lld" -#: access/transam/xlogarchive.c:216 +#: access/transam/xlogarchive.c:222 #, c-format msgid "restored log file \"%s\" from archive" msgstr "Logdatei »%s« aus Archiv wiederhergestellt" -#: access/transam/xlogarchive.c:230 +#: access/transam/xlogarchive.c:236 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "restore_command endete mit Statuscode null, aber stat() schlug fehlt." +msgid "\"restore_command\" returned a zero exit status, but stat() failed." +msgstr "»restore_command« endete mit Statuscode null, aber stat() schlug fehlt." -#: access/transam/xlogarchive.c:262 +#: access/transam/xlogarchive.c:268 #, c-format msgid "could not restore file \"%s\" from archive: %s" msgstr "konnte Datei »%s« nicht aus Archiv wiederherstellen: %s" @@ -2682,930 +2931,960 @@ msgstr "konnte Datei »%s« nicht aus Archiv wiederherstellen: %s" #. translator: First %s represents a postgresql.conf parameter name like #. "recovery_end_command", the 2nd is the value of that parameter, the #. third an already translated error message. -#: access/transam/xlogarchive.c:340 +#: access/transam/xlogarchive.c:346 #, c-format msgid "%s \"%s\": %s" msgstr "%s »%s«: %s" -#: access/transam/xlogarchive.c:450 access/transam/xlogarchive.c:530 +#: access/transam/xlogarchive.c:456 access/transam/xlogarchive.c:536 #, c-format msgid "could not create archive status file \"%s\": %m" msgstr "konnte Archivstatusdatei »%s« nicht erstellen: %m" -#: access/transam/xlogarchive.c:458 access/transam/xlogarchive.c:538 +#: access/transam/xlogarchive.c:464 access/transam/xlogarchive.c:544 #, c-format msgid "could not write archive status file \"%s\": %m" msgstr "konnte Archivstatusdatei »%s« nicht schreiben: %m" -#: access/transam/xlogfuncs.c:75 backup/basebackup.c:973 +#: access/transam/xlogfuncs.c:69 backup/basebackup.c:997 #, c-format msgid "a backup is already in progress in this session" msgstr "ein Backup läuft bereits in dieser Sitzung" -#: access/transam/xlogfuncs.c:146 +#: access/transam/xlogfuncs.c:140 #, c-format msgid "backup is not in progress" msgstr "es läuft kein Backup" -#: access/transam/xlogfuncs.c:147 +#: access/transam/xlogfuncs.c:141 #, c-format msgid "Did you call pg_backup_start()?" msgstr "Haben Sie pg_backup_start() ausgeführt?" -#: access/transam/xlogfuncs.c:190 access/transam/xlogfuncs.c:248 -#: access/transam/xlogfuncs.c:287 access/transam/xlogfuncs.c:308 -#: access/transam/xlogfuncs.c:329 +#: access/transam/xlogfuncs.c:184 access/transam/xlogfuncs.c:242 +#: access/transam/xlogfuncs.c:281 access/transam/xlogfuncs.c:302 +#: access/transam/xlogfuncs.c:323 #, c-format msgid "WAL control functions cannot be executed during recovery." msgstr "Während der Wiederherstellung können keine WAL-Kontrollfunktionen ausgeführt werden." -#: access/transam/xlogfuncs.c:215 access/transam/xlogfuncs.c:399 -#: access/transam/xlogfuncs.c:457 +#: access/transam/xlogfuncs.c:209 access/transam/xlogfuncs.c:389 +#: access/transam/xlogfuncs.c:447 #, c-format msgid "%s cannot be executed during recovery." msgstr "%s kann nicht während der Wiederherstellung ausgeführt werden." -#: access/transam/xlogfuncs.c:221 +#: access/transam/xlogfuncs.c:215 #, c-format -msgid "pg_log_standby_snapshot() can only be used if wal_level >= replica" -msgstr "pg_log_standby_snapshot() kann nur verwendet werden, wenn wal_level >= replica" +msgid "pg_log_standby_snapshot() can only be used if \"wal_level\" >= \"replica\"" +msgstr "pg_log_standby_snapshot() kann nur verwendet werden, wenn »wal_level« >= »replica«" -#: access/transam/xlogfuncs.c:253 +#: access/transam/xlogfuncs.c:247 #, c-format msgid "WAL level not sufficient for creating a restore point" msgstr "WAL-Level nicht ausreichend, um Restore-Punkt anzulegen" -#: access/transam/xlogfuncs.c:261 +#: access/transam/xlogfuncs.c:255 #, c-format msgid "value too long for restore point (maximum %d characters)" msgstr "Wert zu lang für Restore-Punkt (maximal %d Zeichen)" -#: access/transam/xlogfuncs.c:496 +#: access/transam/xlogfuncs.c:486 #, c-format msgid "invalid WAL file name \"%s\"" msgstr "ungültiger WAL-Dateiname »%s«" -#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:562 -#: access/transam/xlogfuncs.c:586 access/transam/xlogfuncs.c:609 -#: access/transam/xlogfuncs.c:689 +#: access/transam/xlogfuncs.c:522 access/transam/xlogfuncs.c:552 +#: access/transam/xlogfuncs.c:576 access/transam/xlogfuncs.c:599 +#: access/transam/xlogfuncs.c:679 #, c-format msgid "recovery is not in progress" msgstr "Wiederherstellung läuft nicht" -#: access/transam/xlogfuncs.c:533 access/transam/xlogfuncs.c:563 -#: access/transam/xlogfuncs.c:587 access/transam/xlogfuncs.c:610 -#: access/transam/xlogfuncs.c:690 +#: access/transam/xlogfuncs.c:523 access/transam/xlogfuncs.c:553 +#: access/transam/xlogfuncs.c:577 access/transam/xlogfuncs.c:600 +#: access/transam/xlogfuncs.c:680 #, c-format msgid "Recovery control functions can only be executed during recovery." msgstr "Wiederherstellungskontrollfunktionen können nur während der Wiederherstellung ausgeführt werden." -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 +#: access/transam/xlogfuncs.c:528 access/transam/xlogfuncs.c:558 #, c-format msgid "standby promotion is ongoing" msgstr "Beförderung des Standby läuft" -#: access/transam/xlogfuncs.c:539 access/transam/xlogfuncs.c:569 +#: access/transam/xlogfuncs.c:529 access/transam/xlogfuncs.c:559 #, c-format msgid "%s cannot be executed after promotion is triggered." msgstr "%s kann nicht ausgeführt werden, nachdem eine Beförderung angestoßen wurde." -#: access/transam/xlogfuncs.c:695 +#: access/transam/xlogfuncs.c:685 #, c-format msgid "\"wait_seconds\" must not be negative or zero" msgstr "»wait_seconds« darf nicht negativ oder null sein" -#: access/transam/xlogfuncs.c:715 storage/ipc/signalfuncs.c:260 +#: access/transam/xlogfuncs.c:707 storage/ipc/signalfuncs.c:265 #, c-format msgid "failed to send signal to postmaster: %m" msgstr "konnte Signal nicht an Postmaster senden: %m" -#: access/transam/xlogfuncs.c:751 +#: access/transam/xlogfuncs.c:739 libpq/be-secure.c:237 libpq/be-secure.c:346 +#, c-format +msgid "terminating connection due to unexpected postmaster exit" +msgstr "Verbindung wird abgebrochen wegen unerwartetem Ende des Postmasters" + +#: access/transam/xlogfuncs.c:740 +#, c-format +msgid "while waiting on promotion" +msgstr "beim Warten auf Beförderung" + +#: access/transam/xlogfuncs.c:744 #, c-format msgid "server did not promote within %d second" msgid_plural "server did not promote within %d seconds" msgstr[0] "Befördern des Servers wurde nicht innerhalb von %d Sekunde abgeschlossen" msgstr[1] "Befördern des Servers wurde nicht innerhalb von %d Sekunden abgeschlossen" -#: access/transam/xlogprefetcher.c:1092 +#: access/transam/xlogprefetcher.c:1088 #, c-format -msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." -msgstr "recovery_prefetch wird auf Plattformen ohne posix_fadvise() nicht unterstützt." +msgid "\"recovery_prefetch\" is not supported on platforms that lack posix_fadvise()." +msgstr "»recovery_prefetch« wird auf Plattformen ohne posix_fadvise() nicht unterstützt." -#: access/transam/xlogreader.c:626 +#: access/transam/xlogreader.c:619 #, c-format msgid "invalid record offset at %X/%X: expected at least %u, got %u" msgstr "ungültiger Datensatz-Offset bei %X/%X: mindestens %u erwartet, %u erhalten" -#: access/transam/xlogreader.c:635 +#: access/transam/xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "Contrecord angefordert von %X/%X" -#: access/transam/xlogreader.c:676 access/transam/xlogreader.c:1123 +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "ungültige Datensatzlänge bei %X/%X: mindestens %u erwartet, %u erhalten" -#: access/transam/xlogreader.c:705 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "Speicher aufgebraucht beim Versuch einen Datensatz mit Länge %u zu dekodieren" - -#: access/transam/xlogreader.c:727 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "Datensatzlänge %u bei %X/%X ist zu lang" - -#: access/transam/xlogreader.c:776 +#: access/transam/xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "keine Contrecord-Flag bei %X/%X" -#: access/transam/xlogreader.c:789 +#: access/transam/xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "ungültige Contrecord-Länge %u (erwartet %lld) bei %X/%X" -#: access/transam/xlogreader.c:924 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "Contrecord fehlt bei %X/%X" - -#: access/transam/xlogreader.c:1131 +#: access/transam/xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ungültige Resource-Manager-ID %u bei %X/%X" -#: access/transam/xlogreader.c:1144 access/transam/xlogreader.c:1160 +#: access/transam/xlogreader.c:1155 access/transam/xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "Datensatz mit falschem Prev-Link %X/%X bei %X/%X" -#: access/transam/xlogreader.c:1196 +#: access/transam/xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "ungültige Resource-Manager-Datenprüfsumme in Datensatz bei %X/%X" -#: access/transam/xlogreader.c:1230 +#: access/transam/xlogreader.c:1243 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "ungültige magische Zahl %04X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: access/transam/xlogreader.c:1245 access/transam/xlogreader.c:1287 +#: access/transam/xlogreader.c:1258 access/transam/xlogreader.c:1300 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "ungültige Info-Bits %04X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: access/transam/xlogreader.c:1261 +#: access/transam/xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: Datenbanksystemidentifikator in WAL-Datei ist %llu, Datenbanksystemidentifikator in pg_control ist %llu" -#: access/transam/xlogreader.c:1269 +#: access/transam/xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche Segmentgröße im Seitenkopf" -#: access/transam/xlogreader.c:1275 +#: access/transam/xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche XLOG_BLCKSZ im Seitenkopf" -#: access/transam/xlogreader.c:1307 +#: access/transam/xlogreader.c:1320 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "unerwartete Pageaddr %X/%X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: access/transam/xlogreader.c:1333 +#: access/transam/xlogreader.c:1346 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "Zeitleisten-ID %u außer der Reihe (nach %u) in WAL-Segment %s, LSN %X/%X, Offset %u" -#: access/transam/xlogreader.c:1739 +#: access/transam/xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u außer der Reihe bei %X/%X" -#: access/transam/xlogreader.c:1763 +#: access/transam/xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA gesetzt, aber keine Daten enthalten bei %X/%X" -#: access/transam/xlogreader.c:1770 +#: access/transam/xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA nicht gesetzt, aber Datenlänge ist %u bei %X/%X" -#: access/transam/xlogreader.c:1806 +#: access/transam/xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE gesetzt, aber Loch Offset %u Länge %u Block-Abbild-Länge %u bei %X/%X" -#: access/transam/xlogreader.c:1822 +#: access/transam/xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE nicht gesetzt, aber Loch Offset %u Länge %u bei %X/%X" -#: access/transam/xlogreader.c:1836 +#: access/transam/xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X" -#: access/transam/xlogreader.c:1851 +#: access/transam/xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X" -#: access/transam/xlogreader.c:1867 +#: access/transam/xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL gesetzt, aber keine vorangehende Relation bei %X/%X" -#: access/transam/xlogreader.c:1879 +#: access/transam/xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ungültige block_id %u bei %X/%X" -#: access/transam/xlogreader.c:1946 +#: access/transam/xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "Datensatz mit ungültiger Länge bei %X/%X" -#: access/transam/xlogreader.c:1972 +#: access/transam/xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "konnte Backup-Block mit ID %d nicht im WAL-Eintrag finden" -#: access/transam/xlogreader.c:2056 +#: access/transam/xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "konnte Abbild bei %X/%X mit ungültigem angegebenen Block %d nicht wiederherstellen" -#: access/transam/xlogreader.c:2063 +#: access/transam/xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "konnte Abbild mit ungültigem Zustand bei %X/%X nicht wiederherstellen, Block %d" -#: access/transam/xlogreader.c:2090 access/transam/xlogreader.c:2107 +#: access/transam/xlogreader.c:2100 access/transam/xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit %s, nicht unterstützt von dieser Installation, Block %d" -#: access/transam/xlogreader.c:2116 +#: access/transam/xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit unbekannter Methode, Block %d" -#: access/transam/xlogreader.c:2124 +#: access/transam/xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d" -#: access/transam/xlogrecovery.c:547 -#, c-format -msgid "entering standby mode" -msgstr "Standby-Modus eingeschaltet" - -#: access/transam/xlogrecovery.c:550 -#, c-format -msgid "starting point-in-time recovery to XID %u" -msgstr "starte Point-in-Time-Recovery bis XID %u" - -#: access/transam/xlogrecovery.c:554 -#, c-format -msgid "starting point-in-time recovery to %s" -msgstr "starte Point-in-Time-Recovery bis %s" - -#: access/transam/xlogrecovery.c:558 -#, c-format -msgid "starting point-in-time recovery to \"%s\"" -msgstr "starte Point-in-Time-Recovery bis »%s«" - -#: access/transam/xlogrecovery.c:562 -#, c-format -msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" -msgstr "starte Point-in-Time-Recovery bis WAL-Position (LSN) »%X/%X«" - -#: access/transam/xlogrecovery.c:566 -#, c-format -msgid "starting point-in-time recovery to earliest consistent point" -msgstr "starte Point-in-Time-Recovery bis zum frühesten konsistenten Punkt" - -#: access/transam/xlogrecovery.c:569 +#: access/transam/xlogrecovery.c:617 #, c-format -msgid "starting archive recovery" -msgstr "starte Wiederherstellung aus Archiv" +msgid "starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on timeline ID %u" +msgstr "starte Wiederherstellung aus Backup mit Redo-LSN %X/%X, Checkpoint-LSN %X/%X, auf Zeitleisten-ID %u" -#: access/transam/xlogrecovery.c:653 +#: access/transam/xlogrecovery.c:649 #, c-format -msgid "could not find redo location referenced by checkpoint record" -msgstr "konnte die vom Checkpoint-Datensatz referenzierte Redo-Position nicht finden" +msgid "could not find redo location %X/%X referenced by checkpoint record at %X/%X" +msgstr "konnte die Redo-Position %X/%X, die vom Checkpoint-Datensatz bei %X/%X referenziert wird, nicht finden" -#: access/transam/xlogrecovery.c:654 access/transam/xlogrecovery.c:664 +#: access/transam/xlogrecovery.c:651 access/transam/xlogrecovery.c:662 #, c-format msgid "" -"If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" +"If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/standby.signal\" and add required recovery options.\n" "If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" "Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." msgstr "" -"Wenn Sie gerade ein Backup wiederherstellen, dann erzeugen Sie »%s/recovery.signal« und setzen Sie die notwendigen Recovery-Optionen.\n" +"Wenn Sie gerade ein Backup wiederherstellen, dann erzeugen Sie »%s/recovery.signal« oder »%s/standby.signal« und setzen Sie die notwendigen Recovery-Optionen.\n" "Wenn Sie gerade kein Backup wiederherstellen, dann versuchen Sie, die Datei »%s/backup_label« zu entfernen.\n" "Vorsicht: Wenn ein Backup wiederhergestellt wird und »%s/backup_label« gelöscht wird, dann wird das den Cluster verfälschen." -#: access/transam/xlogrecovery.c:663 +#: access/transam/xlogrecovery.c:660 #, c-format -msgid "could not locate required checkpoint record" -msgstr "konnte den nötigen Checkpoint-Datensatz nicht finden" +msgid "could not locate required checkpoint record at %X/%X" +msgstr "konnte den nötigen Checkpoint-Datensatz bei %X/%X nicht finden" -#: access/transam/xlogrecovery.c:692 commands/tablespace.c:670 +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:664 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m" -#: access/transam/xlogrecovery.c:724 access/transam/xlogrecovery.c:730 +#: access/transam/xlogrecovery.c:723 access/transam/xlogrecovery.c:729 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "ignoriere Datei »%s«, weil keine Datei »%s« existiert" -#: access/transam/xlogrecovery.c:726 +#: access/transam/xlogrecovery.c:725 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "Datei »%s« wurde in »%s« umbenannt." -#: access/transam/xlogrecovery.c:732 +#: access/transam/xlogrecovery.c:731 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "Konnte Datei »%s« nicht in »%s« umbenennen: %m." -#: access/transam/xlogrecovery.c:786 +#: access/transam/xlogrecovery.c:770 +#, c-format +msgid "restarting backup recovery with redo LSN %X/%X" +msgstr "starte Wiederherstellung aus Backup neu mit Redo-LSN %X/%X" + +#: access/transam/xlogrecovery.c:795 +#, c-format +msgid "could not locate a valid checkpoint record at %X/%X" +msgstr "konnte keinen gültigen Checkpoint-Datensatz bei %X/%X finden" + +#: access/transam/xlogrecovery.c:806 +#, c-format +msgid "entering standby mode" +msgstr "Standby-Modus eingeschaltet" + +#: access/transam/xlogrecovery.c:809 +#, c-format +msgid "starting point-in-time recovery to XID %u" +msgstr "starte Point-in-Time-Recovery bis XID %u" + +#: access/transam/xlogrecovery.c:813 +#, c-format +msgid "starting point-in-time recovery to %s" +msgstr "starte Point-in-Time-Recovery bis %s" + +#: access/transam/xlogrecovery.c:817 +#, c-format +msgid "starting point-in-time recovery to \"%s\"" +msgstr "starte Point-in-Time-Recovery bis »%s«" + +#: access/transam/xlogrecovery.c:821 +#, c-format +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "starte Point-in-Time-Recovery bis WAL-Position (LSN) »%X/%X«" + +#: access/transam/xlogrecovery.c:825 #, c-format -msgid "could not locate a valid checkpoint record" -msgstr "konnte keinen gültigen Checkpoint-Datensatz finden" +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "starte Point-in-Time-Recovery bis zum frühesten konsistenten Punkt" + +#: access/transam/xlogrecovery.c:828 +#, c-format +msgid "starting archive recovery" +msgstr "starte Wiederherstellung aus Archiv" -#: access/transam/xlogrecovery.c:810 +#: access/transam/xlogrecovery.c:849 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "angeforderte Zeitleiste %u ist kein Kind der History dieses Servers" -#: access/transam/xlogrecovery.c:812 +#: access/transam/xlogrecovery.c:851 #, c-format msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." msgstr "Neuester Checkpoint ist bei %X/%X auf Zeitleiste %u, aber in der History der angeforderten Zeitleiste zweigte der Server von dieser Zeitleiste bei %X/%X ab." -#: access/transam/xlogrecovery.c:826 +#: access/transam/xlogrecovery.c:865 #, c-format msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" msgstr "angeforderte Zeitleiste %u enthält nicht den minimalen Wiederherstellungspunkt %X/%X auf Zeitleiste %u" -#: access/transam/xlogrecovery.c:854 +#: access/transam/xlogrecovery.c:893 #, c-format msgid "invalid next transaction ID" msgstr "ungültige nächste Transaktions-ID" -#: access/transam/xlogrecovery.c:859 +#: access/transam/xlogrecovery.c:898 #, c-format msgid "invalid redo in checkpoint record" msgstr "ungültiges Redo im Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:870 +#: access/transam/xlogrecovery.c:909 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "ungültiger Redo-Datensatz im Shutdown-Checkpoint" -#: access/transam/xlogrecovery.c:899 +#: access/transam/xlogrecovery.c:938 #, c-format msgid "database system was not properly shut down; automatic recovery in progress" msgstr "Datenbanksystem wurde nicht richtig heruntergefahren; automatische Wiederherstellung läuft" -#: access/transam/xlogrecovery.c:903 +#: access/transam/xlogrecovery.c:942 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "Wiederherstellung nach Absturz beginnt in Zeitleiste %u und hat Zielzeitleiste %u" -#: access/transam/xlogrecovery.c:946 +#: access/transam/xlogrecovery.c:985 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "Daten in backup_label stimmen nicht mit Kontrolldatei überein" -#: access/transam/xlogrecovery.c:947 +#: access/transam/xlogrecovery.c:986 #, c-format msgid "This means that the backup is corrupted and you will have to use another backup for recovery." msgstr "Das bedeutet, dass die Datensicherung verfälscht ist und Sie eine andere Datensicherung zur Wiederherstellung verwenden werden müssen." -#: access/transam/xlogrecovery.c:1001 +#: access/transam/xlogrecovery.c:1040 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "Verwendung von Recovery-Befehlsdatei »%s« wird nicht unterstützt" -#: access/transam/xlogrecovery.c:1066 +#: access/transam/xlogrecovery.c:1105 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "Standby-Modus wird von Servern im Einzelbenutzermodus nicht unterstützt" -#: access/transam/xlogrecovery.c:1083 +#: access/transam/xlogrecovery.c:1122 #, c-format -msgid "specified neither primary_conninfo nor restore_command" -msgstr "weder primary_conninfo noch restore_command angegeben" +msgid "specified neither \"primary_conninfo\" nor \"restore_command\"" +msgstr "weder »primary_conninfo« noch »restore_command« angegeben" -#: access/transam/xlogrecovery.c:1084 +#: access/transam/xlogrecovery.c:1123 #, c-format msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." msgstr "Der Datenbankserver prüft das Unterverzeichnis pg_wal regelmäßig auf dort abgelegte Dateien." -#: access/transam/xlogrecovery.c:1092 +#: access/transam/xlogrecovery.c:1131 #, c-format -msgid "must specify restore_command when standby mode is not enabled" -msgstr "restore_command muss angegeben werden, wenn der Standby-Modus nicht eingeschaltet ist" +msgid "must specify \"restore_command\" when standby mode is not enabled" +msgstr "»restore_command« muss angegeben werden, wenn der Standby-Modus nicht eingeschaltet ist" -#: access/transam/xlogrecovery.c:1130 +#: access/transam/xlogrecovery.c:1169 #, c-format msgid "recovery target timeline %u does not exist" msgstr "recovery_target_timeline %u existiert nicht" -#: access/transam/xlogrecovery.c:1213 access/transam/xlogrecovery.c:1220 -#: access/transam/xlogrecovery.c:1279 access/transam/xlogrecovery.c:1359 -#: access/transam/xlogrecovery.c:1383 +#: access/transam/xlogrecovery.c:1252 access/transam/xlogrecovery.c:1259 +#: access/transam/xlogrecovery.c:1318 access/transam/xlogrecovery.c:1406 +#: access/transam/xlogrecovery.c:1415 access/transam/xlogrecovery.c:1435 #, c-format msgid "invalid data in file \"%s\"" msgstr "ungültige Daten in Datei »%s«" -#: access/transam/xlogrecovery.c:1280 +#: access/transam/xlogrecovery.c:1319 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "Gelesene Zeitleisten-ID ist %u, aber %u wurde erwartet." -#: access/transam/xlogrecovery.c:1662 +#: access/transam/xlogrecovery.c:1330 +#, c-format +msgid "this is an incremental backup, not a data directory" +msgstr "dies ist ein inkrementelles Backup, kein Datenverzeichnis" + +#: access/transam/xlogrecovery.c:1331 +#, c-format +msgid "Use pg_combinebackup to reconstruct a valid data directory." +msgstr "Verwenden Sie pg_combinebackup, um ein gültiges Datenverzeichnis zu rekonstruieren." + +#: access/transam/xlogrecovery.c:1717 +#, c-format +msgid "unexpected record type found at redo point %X/%X" +msgstr "unerwarteter Datensatztyp bei Redo-Position %X/%X gefunden" + +#: access/transam/xlogrecovery.c:1740 #, c-format msgid "redo starts at %X/%X" msgstr "Redo beginnt bei %X/%X" -#: access/transam/xlogrecovery.c:1675 +#: access/transam/xlogrecovery.c:1753 #, c-format msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" msgstr "Redo im Gang, abgelaufene Zeit: %ld.%02d s, aktuelle LSN: %X/%X" -#: access/transam/xlogrecovery.c:1767 +#: access/transam/xlogrecovery.c:1843 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "angeforderter Recovery-Endpunkt ist vor konsistentem Recovery-Punkt" -#: access/transam/xlogrecovery.c:1799 +#: access/transam/xlogrecovery.c:1875 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "Redo fertig bei %X/%X Systembenutzung: %s" -#: access/transam/xlogrecovery.c:1805 +#: access/transam/xlogrecovery.c:1881 #, c-format msgid "last completed transaction was at log time %s" msgstr "letzte vollständige Transaktion war bei Logzeit %s" -#: access/transam/xlogrecovery.c:1814 +#: access/transam/xlogrecovery.c:1890 #, c-format msgid "redo is not required" msgstr "Redo nicht nötig" -#: access/transam/xlogrecovery.c:1825 +#: access/transam/xlogrecovery.c:1901 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "Wiederherstellung endete bevor das konfigurierte Wiederherstellungsziel erreicht wurde" -#: access/transam/xlogrecovery.c:2019 +#: access/transam/xlogrecovery.c:2095 #, c-format msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" msgstr "fehlender Contrecord bei %X/%X erfolgreich übersprungen, überschrieben am %s" -#: access/transam/xlogrecovery.c:2086 +#: access/transam/xlogrecovery.c:2162 #, c-format msgid "unexpected directory entry \"%s\" found in %s" msgstr "unerwarteter Verzeichniseintrag »%s« in %s gefunden" -#: access/transam/xlogrecovery.c:2088 +#: access/transam/xlogrecovery.c:2164 #, c-format msgid "All directory entries in pg_tblspc/ should be symbolic links." msgstr "Alle Verzeichniseinträge in pg_tblspc/ sollten symbolische Verknüpfungen sein." -#: access/transam/xlogrecovery.c:2089 +#: access/transam/xlogrecovery.c:2165 #, c-format -msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." -msgstr "Entfernen Sie diese Verzeichnisse oder setzen Sie allow_in_place_tablespaces vorrübergehend auf ON, damit die Wiederherstellung abschließen kann." +msgid "Remove those directories, or set \"allow_in_place_tablespaces\" to ON transiently to let recovery complete." +msgstr "Entfernen Sie diese Verzeichnisse oder setzen Sie »allow_in_place_tablespaces« vorrübergehend auf ON, damit die Wiederherstellung abschließen kann." -#: access/transam/xlogrecovery.c:2163 +#: access/transam/xlogrecovery.c:2217 +#, c-format +msgid "completed backup recovery with redo LSN %X/%X and end LSN %X/%X" +msgstr "Wiederherstellung aus Backup abgeschlossen mit Redo-LSN %X/%X und End-LSN %X/%X" + +#: access/transam/xlogrecovery.c:2247 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "konsistenter Wiederherstellungszustand erreicht bei %X/%X" #. translator: %s is a WAL record description -#: access/transam/xlogrecovery.c:2201 +#: access/transam/xlogrecovery.c:2285 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "WAL-Redo bei %X/%X für %s" -#: access/transam/xlogrecovery.c:2299 +#: access/transam/xlogrecovery.c:2383 #, c-format msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" msgstr "unerwartete vorherige Zeitleisten-ID %u (aktuelle Zeitleisten-ID %u) im Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:2308 +#: access/transam/xlogrecovery.c:2392 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "unerwartete Zeitleisten-ID %u (nach %u) im Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:2324 +#: access/transam/xlogrecovery.c:2408 #, c-format msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" msgstr "unerwartete Zeitleisten-ID %u in Checkpoint-Datensatz, bevor der minimale Wiederherstellungspunkt %X/%X auf Zeitleiste %u erreicht wurde" -#: access/transam/xlogrecovery.c:2508 access/transam/xlogrecovery.c:2784 +#: access/transam/xlogrecovery.c:2592 access/transam/xlogrecovery.c:2868 #, c-format msgid "recovery stopping after reaching consistency" msgstr "Wiederherstellung beendet nachdem Konsistenz erreicht wurde" -#: access/transam/xlogrecovery.c:2529 +#: access/transam/xlogrecovery.c:2613 #, c-format msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" msgstr "Wiederherstellung beendet vor WAL-Position (LSN) »%X/%X«" -#: access/transam/xlogrecovery.c:2619 +#: access/transam/xlogrecovery.c:2703 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "Wiederherstellung beendet vor Commit der Transaktion %u, Zeit %s" -#: access/transam/xlogrecovery.c:2626 +#: access/transam/xlogrecovery.c:2710 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "Wiederherstellung beendet vor Abbruch der Transaktion %u, Zeit %s" -#: access/transam/xlogrecovery.c:2679 +#: access/transam/xlogrecovery.c:2763 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "Wiederherstellung beendet bei Restore-Punkt »%s«, Zeit %s" -#: access/transam/xlogrecovery.c:2697 +#: access/transam/xlogrecovery.c:2781 #, c-format msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" msgstr "Wiederherstellung beendet nach WAL-Position (LSN) »%X/%X«" -#: access/transam/xlogrecovery.c:2764 +#: access/transam/xlogrecovery.c:2848 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "Wiederherstellung beendet nach Commit der Transaktion %u, Zeit %s" -#: access/transam/xlogrecovery.c:2772 +#: access/transam/xlogrecovery.c:2856 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "Wiederherstellung beendet nach Abbruch der Transaktion %u, Zeit %s" -#: access/transam/xlogrecovery.c:2853 +#: access/transam/xlogrecovery.c:2937 #, c-format msgid "pausing at the end of recovery" msgstr "pausiere am Ende der Wiederherstellung" -#: access/transam/xlogrecovery.c:2854 +#: access/transam/xlogrecovery.c:2938 #, c-format msgid "Execute pg_wal_replay_resume() to promote." msgstr "Führen Sie pg_wal_replay_resume() aus, um den Server zum Primärserver zu befördern." -#: access/transam/xlogrecovery.c:2857 access/transam/xlogrecovery.c:4594 +#: access/transam/xlogrecovery.c:2941 access/transam/xlogrecovery.c:4679 #, c-format msgid "recovery has paused" msgstr "Wiederherstellung wurde pausiert" -#: access/transam/xlogrecovery.c:2858 +#: access/transam/xlogrecovery.c:2942 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "Führen Sie pg_wal_replay_resume() aus um fortzusetzen." -#: access/transam/xlogrecovery.c:3121 +#: access/transam/xlogrecovery.c:3205 #, c-format msgid "unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u" msgstr "unerwartete Zeitleisten-ID %u in WAL-Segment %s, LSN %X/%X, Offset %u" -#: access/transam/xlogrecovery.c:3329 +#: access/transam/xlogrecovery.c:3413 #, c-format msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: %m" msgstr "konnte nicht aus WAL-Segment %s, LSN %X/%X, Position %u lesen: %m" -#: access/transam/xlogrecovery.c:3336 +#: access/transam/xlogrecovery.c:3420 #, c-format msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu" msgstr "konnte nicht aus WAL-Segment %s, LSN %X/%X, Position %u lesen: %d von %zu gelesen" -#: access/transam/xlogrecovery.c:3976 +#: access/transam/xlogrecovery.c:4061 #, c-format msgid "invalid checkpoint location" msgstr "ungültige Checkpoint-Position" -#: access/transam/xlogrecovery.c:3986 +#: access/transam/xlogrecovery.c:4071 #, c-format msgid "invalid checkpoint record" msgstr "ungültiger Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:3992 +#: access/transam/xlogrecovery.c:4077 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "ungültige Resource-Manager-ID im Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:4000 +#: access/transam/xlogrecovery.c:4085 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "ungültige xl_info im Checkpoint-Datensatz" -#: access/transam/xlogrecovery.c:4006 +#: access/transam/xlogrecovery.c:4091 #, c-format msgid "invalid length of checkpoint record" msgstr "ungültige Länge des Checkpoint-Datensatzes" -#: access/transam/xlogrecovery.c:4060 +#: access/transam/xlogrecovery.c:4145 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "neue Zeitleiste %u ist kein Kind der Datenbanksystemzeitleiste %u" -#: access/transam/xlogrecovery.c:4074 +#: access/transam/xlogrecovery.c:4159 #, c-format msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" msgstr "neue Zeitleiste %u zweigte von der aktuellen Datenbanksystemzeitleiste %u vor dem aktuellen Wiederherstellungspunkt %X/%X ab" -#: access/transam/xlogrecovery.c:4093 +#: access/transam/xlogrecovery.c:4178 #, c-format msgid "new target timeline is %u" msgstr "neue Zielzeitleiste ist %u" -#: access/transam/xlogrecovery.c:4296 +#: access/transam/xlogrecovery.c:4381 #, c-format msgid "WAL receiver process shutdown requested" msgstr "Herunterfahren des WAL-Receiver-Prozesses verlangt" -#: access/transam/xlogrecovery.c:4356 +#: access/transam/xlogrecovery.c:4441 #, c-format msgid "received promote request" msgstr "Anforderung zum Befördern empfangen" -#: access/transam/xlogrecovery.c:4585 +#: access/transam/xlogrecovery.c:4670 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "Hot Standby ist nicht möglich wegen unzureichender Parametereinstellungen" -#: access/transam/xlogrecovery.c:4586 access/transam/xlogrecovery.c:4613 -#: access/transam/xlogrecovery.c:4643 +#: access/transam/xlogrecovery.c:4671 access/transam/xlogrecovery.c:4698 +#: access/transam/xlogrecovery.c:4728 #, c-format msgid "%s = %d is a lower setting than on the primary server, where its value was %d." msgstr "%s = %d ist eine niedrigere Einstellung als auf dem Primärserver, wo der Wert %d war." -#: access/transam/xlogrecovery.c:4595 +#: access/transam/xlogrecovery.c:4680 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "Wenn die Wiederherstellungspause beendet wird, wird der Server herunterfahren." -#: access/transam/xlogrecovery.c:4596 +#: access/transam/xlogrecovery.c:4681 #, c-format msgid "You can then restart the server after making the necessary configuration changes." msgstr "Sie können den Server dann neu starten, nachdem die nötigen Konfigurationsänderungen getätigt worden sind." -#: access/transam/xlogrecovery.c:4607 +#: access/transam/xlogrecovery.c:4692 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "Beförderung ist nicht möglich wegen unzureichender Parametereinstellungen" -#: access/transam/xlogrecovery.c:4617 +#: access/transam/xlogrecovery.c:4702 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "Starten Sie den Server neu, nachdem die nötigen Konfigurationsänderungen getätigt worden sind." -#: access/transam/xlogrecovery.c:4641 +#: access/transam/xlogrecovery.c:4726 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "Wiederherstellung abgebrochen wegen unzureichender Parametereinstellungen" -#: access/transam/xlogrecovery.c:4647 +#: access/transam/xlogrecovery.c:4732 #, c-format msgid "You can restart the server after making the necessary configuration changes." msgstr "Sie können den Server neu starten, nachdem die nötigen Konfigurationsänderungen getätigt worden sind." -#: access/transam/xlogrecovery.c:4689 +#: access/transam/xlogrecovery.c:4774 #, c-format msgid "multiple recovery targets specified" msgstr "mehrere Wiederherstellungsziele angegeben" -#: access/transam/xlogrecovery.c:4690 +#: access/transam/xlogrecovery.c:4775 #, c-format -msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." -msgstr "Höchstens eins aus recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid darf gesetzt sein." +msgid "At most one of \"recovery_target\", \"recovery_target_lsn\", \"recovery_target_name\", \"recovery_target_time\", \"recovery_target_xid\" may be set." +msgstr "Höchstens eins aus »recovery_target«, »recovery_target_lsn«, »recovery_target_name«, »recovery_target_time«, »recovery_target_xid« darf gesetzt sein." -#: access/transam/xlogrecovery.c:4701 +#: access/transam/xlogrecovery.c:4786 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Der einzige erlaubte Wert ist »immediate«." -#: access/transam/xlogrecovery.c:4853 utils/adt/timestamp.c:186 -#: utils/adt/timestamp.c:439 +#: access/transam/xlogrecovery.c:4938 utils/adt/timestamp.c:202 +#: utils/adt/timestamp.c:455 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp ist außerhalb des gültigen Bereichs: »%s«" -#: access/transam/xlogrecovery.c:4898 +#: access/transam/xlogrecovery.c:4983 #, c-format -msgid "recovery_target_timeline is not a valid number." -msgstr "recovery_target_timeline ist keine gültige Zahl." +msgid "\"recovery_target_timeline\" is not a valid number." +msgstr "»recovery_target_timeline« ist keine gültige Zahl." -#: access/transam/xlogutils.c:1039 +#: access/transam/xlogutils.c:1032 #, c-format msgid "could not read from WAL segment %s, offset %d: %m" msgstr "konnte nicht aus WAL-Segment %s, Position %d lesen: %m" -#: access/transam/xlogutils.c:1046 +#: access/transam/xlogutils.c:1039 #, c-format msgid "could not read from WAL segment %s, offset %d: read %d of %d" msgstr "konnte nicht aus WAL-Segment %s, Position %d lesen: %d von %d gelesen" -#: archive/shell_archive.c:96 +#: archive/shell_archive.c:98 #, c-format msgid "archive command failed with exit code %d" msgstr "Archivbefehl ist fehlgeschlagen mit Statuscode %d" -#: archive/shell_archive.c:98 archive/shell_archive.c:108 -#: archive/shell_archive.c:114 archive/shell_archive.c:123 +#: archive/shell_archive.c:100 archive/shell_archive.c:110 +#: archive/shell_archive.c:116 archive/shell_archive.c:125 #, c-format msgid "The failed archive command was: %s" msgstr "Der fehlgeschlagene Archivbefehl war: %s" -#: archive/shell_archive.c:105 +#: archive/shell_archive.c:107 #, c-format msgid "archive command was terminated by exception 0x%X" msgstr "Archivbefehl wurde durch Ausnahme 0x%X beendet" -#: archive/shell_archive.c:107 postmaster/postmaster.c:3675 +#: archive/shell_archive.c:109 postmaster/postmaster.c:3095 #, c-format msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." msgstr "Sehen Sie die Beschreibung des Hexadezimalwerts in der C-Include-Datei »ntstatus.h« nach." -#: archive/shell_archive.c:112 +#: archive/shell_archive.c:114 #, c-format msgid "archive command was terminated by signal %d: %s" msgstr "Archivbefehl wurde von Signal %d beendet: %s" -#: archive/shell_archive.c:121 +#: archive/shell_archive.c:123 #, c-format msgid "archive command exited with unrecognized status %d" msgstr "Archivbefehl hat mit unbekanntem Status %d beendet" -#: backup/backup_manifest.c:253 +#: backup/backup_manifest.c:254 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "End-Zeitleiste %u wurde erwartet, aber Zeitleiste %u wurde gefunden" -#: backup/backup_manifest.c:277 +#: backup/backup_manifest.c:278 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "Start-Zeitleiste %u wurde erwartet, aber Zeitleiste %u wurde gefunden" -#: backup/backup_manifest.c:304 +#: backup/backup_manifest.c:305 #, c-format msgid "start timeline %u not found in history of timeline %u" msgstr "Start-Zeitleiste %u nicht in der History der Zeitleiste %u gefunden" -#: backup/backup_manifest.c:355 +#: backup/backup_manifest.c:356 #, c-format msgid "could not rewind temporary file" msgstr "konnte Position in temporärer Datei nicht auf Anfang setzen" -#: backup/basebackup.c:470 +#: backup/basebackup.c:479 #, c-format msgid "could not find any WAL files" msgstr "konnte keine WAL-Dateien finden" -#: backup/basebackup.c:485 backup/basebackup.c:500 backup/basebackup.c:509 +#: backup/basebackup.c:494 backup/basebackup.c:509 backup/basebackup.c:518 #, c-format msgid "could not find WAL file \"%s\"" msgstr "konnte WAL-Datei »%s« nicht finden" -#: backup/basebackup.c:551 backup/basebackup.c:576 +#: backup/basebackup.c:560 backup/basebackup.c:585 #, c-format msgid "unexpected WAL file size \"%s\"" msgstr "unerwartete WAL-Dateigröße »%s«" -#: backup/basebackup.c:646 +#: backup/basebackup.c:656 #, c-format msgid "%lld total checksum verification failure" msgid_plural "%lld total checksum verification failures" msgstr[0] "%lld Prüfsummenfehler insgesamt" msgstr[1] "%lld Prüfsummenfehler insgesamt" -#: backup/basebackup.c:653 +#: backup/basebackup.c:663 #, c-format msgid "checksum verification failure during base backup" msgstr "Prüfsummenüberprüfung bei der Basissicherung fehlgeschlagen" -#: backup/basebackup.c:722 backup/basebackup.c:731 backup/basebackup.c:742 -#: backup/basebackup.c:759 backup/basebackup.c:768 backup/basebackup.c:779 -#: backup/basebackup.c:796 backup/basebackup.c:805 backup/basebackup.c:817 -#: backup/basebackup.c:841 backup/basebackup.c:855 backup/basebackup.c:866 -#: backup/basebackup.c:877 backup/basebackup.c:890 +#: backup/basebackup.c:733 backup/basebackup.c:742 backup/basebackup.c:753 +#: backup/basebackup.c:770 backup/basebackup.c:779 backup/basebackup.c:788 +#: backup/basebackup.c:803 backup/basebackup.c:820 backup/basebackup.c:829 +#: backup/basebackup.c:841 backup/basebackup.c:865 backup/basebackup.c:879 +#: backup/basebackup.c:890 backup/basebackup.c:901 backup/basebackup.c:914 #, c-format msgid "duplicate option \"%s\"" msgstr "doppelte Option »%s«" -#: backup/basebackup.c:750 +#: backup/basebackup.c:761 #, c-format msgid "unrecognized checkpoint type: \"%s\"" msgstr "unbekannter Checkpoint-Typ: »%s«" -#: backup/basebackup.c:785 +#: backup/basebackup.c:793 +#, c-format +msgid "incremental backups cannot be taken unless WAL summarization is enabled" +msgstr "inkrementelle Backups können nicht durchgeführt werden, wenn WAL-Zusammenfassung nicht eingeschaltet ist" + +#: backup/basebackup.c:809 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d ist außerhalb des gültigen Bereichs für Parameter »%s« (%d ... %d)" -#: backup/basebackup.c:830 +#: backup/basebackup.c:854 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "unbekannte Manifestoption: »%s«" -#: backup/basebackup.c:846 -#, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "unbekannter Prüfsummenalgorithmus: »%s«" - -#: backup/basebackup.c:881 +#: backup/basebackup.c:905 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "unbekannter Komprimierungsalgorithmus: »%s«" -#: backup/basebackup.c:897 +#: backup/basebackup.c:921 #, c-format msgid "unrecognized base backup option: \"%s\"" msgstr "unbekannte Base-Backup-Option: »%s«" -#: backup/basebackup.c:908 +#: backup/basebackup.c:932 #, c-format msgid "manifest checksums require a backup manifest" msgstr "Manifest-Prüfsummen benötigen ein Backup-Manifest" -#: backup/basebackup.c:917 +#: backup/basebackup.c:941 #, c-format msgid "target detail cannot be used without target" msgstr "Zieldetail kann nicht ohne Ziel verwendet werden" -#: backup/basebackup.c:926 backup/basebackup_target.c:218 +#: backup/basebackup.c:950 backup/basebackup_target.c:218 #, c-format msgid "target \"%s\" does not accept a target detail" msgstr "Ziel »%s« akzeptiert kein Zieldetail" -#: backup/basebackup.c:937 +#: backup/basebackup.c:961 #, c-format msgid "compression detail cannot be specified unless compression is enabled" msgstr "Komprimierungsdetail kann nicht angegeben werden, wenn Komprimierung nicht eingeschaltet ist" -#: backup/basebackup.c:950 +#: backup/basebackup.c:974 #, c-format msgid "invalid compression specification: %s" msgstr "ungültige Komprimierungsangabe: %s" -#: backup/basebackup.c:1116 backup/basebackup.c:1294 +#: backup/basebackup.c:1024 +#, c-format +msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" +msgstr "UPLOAD_MANIFEST muss vor einem inkrementellen BASE_BACKUP ausgeführt werden" + +#: backup/basebackup.c:1157 backup/basebackup.c:1358 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "konnte »stat« für Datei oder Verzeichnis »%s« nicht ausführen: %m" -#: backup/basebackup.c:1430 +#: backup/basebackup.c:1544 #, c-format msgid "skipping special file \"%s\"" msgstr "überspringe besondere Datei »%s«" -#: backup/basebackup.c:1542 -#, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "ungültige Segmentnummer %d in Datei »%s«" - -#: backup/basebackup.c:1574 +#: backup/basebackup.c:1751 #, c-format msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" msgstr "konnte Prüfsumme in Datei »%s«, Block %u nicht überprüfen: gelesene Puffergröße %d und Seitengröße %d sind verschieden" -#: backup/basebackup.c:1658 +#: backup/basebackup.c:1813 +#, c-format +msgid "file \"%s\" has a total of %d checksum verification failure" +msgid_plural "file \"%s\" has a total of %d checksum verification failures" +msgstr[0] "Datei »%s« hat insgesamt %d Prüfsummenfehler" +msgstr[1] "Datei »%s« hat insgesamt %d Prüfsummenfehler" + +#: backup/basebackup.c:1917 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" msgstr "Prüfsummenüberprüfung fehlgeschlagen in Datei »%s«, Block %u: berechnet %X, aber erwartet %X" -#: backup/basebackup.c:1665 +#: backup/basebackup.c:1924 #, c-format msgid "further checksum verification failures in file \"%s\" will not be reported" msgstr "weitere Prüfsummenfehler in Datei »%s« werden nicht berichtet werden" -#: backup/basebackup.c:1721 -#, c-format -msgid "file \"%s\" has a total of %d checksum verification failure" -msgid_plural "file \"%s\" has a total of %d checksum verification failures" -msgstr[0] "Datei »%s« hat insgesamt %d Prüfsummenfehler" -msgstr[1] "Datei »%s« hat insgesamt %d Prüfsummenfehler" - -#: backup/basebackup.c:1767 +#: backup/basebackup.c:2048 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "Dateiname zu lang für Tar-Format: »%s«" -#: backup/basebackup.c:1772 +#: backup/basebackup.c:2053 #, c-format msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" msgstr "Ziel der symbolischen Verknüpfung zu lang für Tar-Format: Dateiname »%s«, Ziel »%s«" +#: backup/basebackup.c:2127 +#, c-format +msgid "could not read file \"%s\": read %zd of %zu" +msgstr "konnte Datei »%s« nicht lesen: %zd von %zu gelesen" + #: backup/basebackup_gzip.c:67 #, c-format msgid "gzip compression is not supported by this build" @@ -3616,53 +3895,114 @@ msgstr "gzip-Komprimierung wird von dieser Installation nicht unterstützt" msgid "could not initialize compression library" msgstr "konnte Komprimierungsbibliothek nicht initialisieren" +#: backup/basebackup_incremental.c:294 +#, c-format +msgid "manifest contains no required WAL ranges" +msgstr "Manifest enthält keine benötigten WAL-Bereiche" + +#: backup/basebackup_incremental.c:349 +#, c-format +msgid "timeline %u found in manifest, but not in this server's history" +msgstr "Zeitleiste %u wurde im Manifest gefunden, aber nicht in der History dieses Servers" + +#: backup/basebackup_incremental.c:414 +#, c-format +msgid "manifest requires WAL from initial timeline %u starting at %X/%X, but that timeline begins at %X/%X" +msgstr "Manifest benötigt WAL aus der initialen Zeitleiste %u beginnend bei %X/%X, aber diese Zeitleiste beginnt bei %X/%X" + +#: backup/basebackup_incremental.c:424 +#, c-format +msgid "manifest requires WAL from continuation timeline %u starting at %X/%X, but that timeline begins at %X/%X" +msgstr "Manifest benötigt WAL aus der Fortsetzungszeitleiste %u beginnend bei %X/%X, aber diese Zeitleiste beginnt bei %X/%X" + +#: backup/basebackup_incremental.c:435 +#, c-format +msgid "manifest requires WAL from final timeline %u ending at %X/%X, but this backup starts at %X/%X" +msgstr "Manifest benötigt WAL aus der finalen Zeitleiste %u endend bei %X/%X, aber dieses Backup startet bei %X/%X" + +#: backup/basebackup_incremental.c:439 +#, c-format +msgid "This can happen for incremental backups on a standby if there was little activity since the previous backup." +msgstr "Das kann für inkrementelle Backups auf einem Standby passieren, wenn es wenig Aktivität seit dem letzten Backup gab." + +#: backup/basebackup_incremental.c:446 +#, c-format +msgid "manifest requires WAL from non-final timeline %u ending at %X/%X, but this server switched timelines at %X/%X" +msgstr "Manifest benötigt WAL aus der nicht-finalen Zeitleiste %u endend bei %X/%X, aber dieser Server hat die Zeitleiste bei %X/%X gewechselt" + +#: backup/basebackup_incremental.c:527 +#, c-format +msgid "WAL summaries are required on timeline %u from %X/%X to %X/%X, but no summaries for that timeline and LSN range exist" +msgstr "WAL-Zusammenfassungen auf Zeitleiste %u von %X/%X bis %X/%X werden benötigt, aber für diese Zeitleiste und diesen LSN-Bereich existieren keine Zusammenfassungen." + +#: backup/basebackup_incremental.c:534 +#, c-format +msgid "WAL summaries are required on timeline %u from %X/%X to %X/%X, but the summaries for that timeline and LSN range are incomplete" +msgstr "WAL-Zusammenfassungen auf Zeitleiste %u von %X/%X bis %X/%X werden benötigt, aber die Zusammenfassungen für diese Zeitleiste und diesen LSN-Bereich sind unvollständig." + +#: backup/basebackup_incremental.c:538 +#, c-format +msgid "The first unsummarized LSN in this range is %X/%X." +msgstr "Die erste nicht zusammengefasste LSN in diesem Bereich ist %X/%X." + +#: backup/basebackup_incremental.c:938 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "Backup-Manifest Version 1 unterstützt kein inkrementelles Backup" + +#: backup/basebackup_incremental.c:956 +#, c-format +msgid "system identifier in backup manifest is %llu, but database system identifier is %llu" +msgstr "Systemidentifikator im Backup-Manifest ist %llu, aber Datenbanksystemidentifikator ist %llu" + #: backup/basebackup_lz4.c:67 #, c-format msgid "lz4 compression is not supported by this build" msgstr "lz4-Komprimierung wird von dieser Installation nicht unterstützt" -#: backup/basebackup_server.c:75 +#: backup/basebackup_server.c:73 #, c-format msgid "permission denied to create backup stored on server" msgstr "keine Berechtigung, um auf dem Server abgelegtes Backup zu erzeugen" -#: backup/basebackup_server.c:76 +#: backup/basebackup_server.c:74 #, c-format msgid "Only roles with privileges of the \"%s\" role may create a backup stored on the server." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können ein auf dem Server abgelegtes Backup erzeugen." -#: backup/basebackup_server.c:91 +#: backup/basebackup_server.c:89 #, c-format msgid "relative path not allowed for backup stored on server" msgstr "relativer Pfad nicht erlaubt für auf dem Server abgelegtes Backup" -#: backup/basebackup_server.c:104 commands/dbcommands.c:501 -#: commands/tablespace.c:163 commands/tablespace.c:179 -#: commands/tablespace.c:599 commands/tablespace.c:644 replication/slot.c:1697 +#: backup/basebackup_server.c:102 commands/dbcommands.c:477 +#: commands/tablespace.c:157 commands/tablespace.c:173 +#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:1986 #: storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" -#: backup/basebackup_server.c:117 +#: backup/basebackup_server.c:115 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "Verzeichnis »%s« existiert aber ist nicht leer" -#: backup/basebackup_server.c:125 utils/init/postinit.c:1150 +#: backup/basebackup_server.c:123 utils/init/postinit.c:1178 #, c-format msgid "could not access directory \"%s\": %m" msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" -#: backup/basebackup_server.c:177 backup/basebackup_server.c:184 -#: backup/basebackup_server.c:270 backup/basebackup_server.c:277 -#: storage/smgr/md.c:501 storage/smgr/md.c:508 storage/smgr/md.c:590 -#: storage/smgr/md.c:612 storage/smgr/md.c:862 +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 +#: backup/basebackup_server.c:268 backup/basebackup_server.c:275 +#: backup/walsummary.c:312 storage/smgr/md.c:502 storage/smgr/md.c:509 +#: storage/smgr/md.c:591 storage/smgr/md.c:613 storage/smgr/md.c:999 #, c-format msgid "Check free disk space." msgstr "Prüfen Sie den freien Festplattenplatz." -#: backup/basebackup_server.c:181 backup/basebackup_server.c:274 +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 +#: backup/walsummary.c:309 #, c-format msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" msgstr "konnte Datei »%s« nicht schreiben: es wurden nur %d von %d Bytes bei Offset %u geschrieben" @@ -3688,714 +4028,724 @@ msgid "could not set compression worker count to %d: %s" msgstr "konnte Komprimierungs-Worker-Anzahl nicht auf %d setzen: %s" #: backup/basebackup_zstd.c:129 -#, fuzzy, c-format -#| msgid "could not set compression level %d: %s" -msgid "could not set compression flag for %s: %s" -msgstr "konnte Komprimierungsniveau %d nicht setzen: %s" +#, c-format +msgid "could not enable long-distance mode: %s" +msgstr "konnte Long-Distance-Modus nicht einschalten: %s" + +#: backup/walsummaryfuncs.c:95 +#, c-format +msgid "invalid timeline %lld" +msgstr "ungültige Zeitleiste %lld" -#: bootstrap/bootstrap.c:243 postmaster/postmaster.c:721 tcop/postgres.c:3819 +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:623 tcop/postgres.c:3946 #, c-format msgid "--%s requires a value" msgstr "--%s benötigt einen Wert" -#: bootstrap/bootstrap.c:248 postmaster/postmaster.c:726 tcop/postgres.c:3824 +#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:628 tcop/postgres.c:3951 #, c-format msgid "-c %s requires a value" msgstr "-c %s benötigt einen Wert" -#: bootstrap/bootstrap.c:289 -#, c-format -msgid "-X requires a power of two value between 1 MB and 1 GB" -msgstr "-X benötigt eine Zweierpotenz zwischen 1 MB und 1 GB" - -#: bootstrap/bootstrap.c:295 postmaster/postmaster.c:844 -#: postmaster/postmaster.c:857 +#: bootstrap/bootstrap.c:282 postmaster/postmaster.c:746 +#: postmaster/postmaster.c:759 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" -#: bootstrap/bootstrap.c:304 +#: bootstrap/bootstrap.c:291 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s: ungültige Kommandozeilenargumente\n" -#: catalog/aclchk.c:201 +#: catalog/aclchk.c:211 #, c-format msgid "grant options can only be granted to roles" msgstr "Grant-Optionen können nur Rollen gewährt werden" -#: catalog/aclchk.c:323 +#: catalog/aclchk.c:333 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "es wurden keine Privilegien für Spalte »%s« von Relation »%s« gewährt" -#: catalog/aclchk.c:328 +#: catalog/aclchk.c:338 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "es wurden keine Privilegien für »%s« gewährt" -#: catalog/aclchk.c:336 +#: catalog/aclchk.c:346 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "es wurden nicht alle Priviligien für Spalte »%s« von Relation »%s« gewährt" -#: catalog/aclchk.c:341 +#: catalog/aclchk.c:351 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "es wurden nicht alle Priviligien für »%s« gewährt" -#: catalog/aclchk.c:352 +#: catalog/aclchk.c:362 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "es konnten keine Privilegien für Spalte »%s« von Relation »%s« entzogen werden" -#: catalog/aclchk.c:357 +#: catalog/aclchk.c:367 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "es konnten keine Privilegien für »%s« entzogen werden" -#: catalog/aclchk.c:365 +#: catalog/aclchk.c:375 #, c-format msgid "not all privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "es konnten nicht alle Privilegien für Spalte »%s« von Relation »%s« entzogen werden" -#: catalog/aclchk.c:370 +#: catalog/aclchk.c:380 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "es konnten nicht alle Privilegien für »%s« entzogen werden" -#: catalog/aclchk.c:402 +#: catalog/aclchk.c:412 #, c-format msgid "grantor must be current user" msgstr "Grantor muss aktueller Benutzer sein" -#: catalog/aclchk.c:470 catalog/aclchk.c:1045 +#: catalog/aclchk.c:480 catalog/aclchk.c:1055 #, c-format msgid "invalid privilege type %s for relation" msgstr "ungültiger Privilegtyp %s für Relation" -#: catalog/aclchk.c:474 catalog/aclchk.c:1049 +#: catalog/aclchk.c:484 catalog/aclchk.c:1059 #, c-format msgid "invalid privilege type %s for sequence" msgstr "ungültiger Privilegtyp %s für Sequenz" -#: catalog/aclchk.c:478 +#: catalog/aclchk.c:488 #, c-format msgid "invalid privilege type %s for database" msgstr "ungültiger Privilegtyp %s für Datenbank" -#: catalog/aclchk.c:482 +#: catalog/aclchk.c:492 #, c-format msgid "invalid privilege type %s for domain" msgstr "ungültiger Privilegtyp %s für Domäne" -#: catalog/aclchk.c:486 catalog/aclchk.c:1053 +#: catalog/aclchk.c:496 catalog/aclchk.c:1063 #, c-format msgid "invalid privilege type %s for function" msgstr "ungültiger Privilegtyp %s für Funktion" -#: catalog/aclchk.c:490 +#: catalog/aclchk.c:500 #, c-format msgid "invalid privilege type %s for language" msgstr "ungültiger Privilegtyp %s für Sprache" -#: catalog/aclchk.c:494 +#: catalog/aclchk.c:504 #, c-format msgid "invalid privilege type %s for large object" msgstr "ungültiger Privilegtyp %s für Large Object" -#: catalog/aclchk.c:498 catalog/aclchk.c:1069 +#: catalog/aclchk.c:508 catalog/aclchk.c:1079 #, c-format msgid "invalid privilege type %s for schema" msgstr "ungültiger Privilegtyp %s für Schema" -#: catalog/aclchk.c:502 catalog/aclchk.c:1057 +#: catalog/aclchk.c:512 catalog/aclchk.c:1067 #, c-format msgid "invalid privilege type %s for procedure" msgstr "ungültiger Privilegtyp %s für Prozedur" -#: catalog/aclchk.c:506 catalog/aclchk.c:1061 +#: catalog/aclchk.c:516 catalog/aclchk.c:1071 #, c-format msgid "invalid privilege type %s for routine" msgstr "ungültiger Privilegtyp %s für Routine" -#: catalog/aclchk.c:510 +#: catalog/aclchk.c:520 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "ungültiger Privilegtyp %s für Tablespace" -#: catalog/aclchk.c:514 catalog/aclchk.c:1065 +#: catalog/aclchk.c:524 catalog/aclchk.c:1075 #, c-format msgid "invalid privilege type %s for type" msgstr "ungültiger Privilegtyp %s für Typ" -#: catalog/aclchk.c:518 +#: catalog/aclchk.c:528 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "ungültiger Privilegtyp %s für Fremddaten-Wrapper" -#: catalog/aclchk.c:522 +#: catalog/aclchk.c:532 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "ungültiger Privilegtyp %s für Fremdserver" -#: catalog/aclchk.c:526 +#: catalog/aclchk.c:536 #, c-format msgid "invalid privilege type %s for parameter" msgstr "ungültiger Privilegtyp %s für Parameter" -#: catalog/aclchk.c:565 +#: catalog/aclchk.c:575 #, c-format msgid "column privileges are only valid for relations" msgstr "Spaltenprivilegien sind nur für Relation gültig" -#: catalog/aclchk.c:728 catalog/aclchk.c:3570 catalog/objectaddress.c:1092 -#: catalog/pg_largeobject.c:116 storage/large_object/inv_api.c:287 +#: catalog/aclchk.c:738 catalog/aclchk.c:3629 catalog/objectaddress.c:1054 +#: catalog/pg_largeobject.c:113 storage/large_object/inv_api.c:285 #, c-format msgid "large object %u does not exist" msgstr "Large Object %u existiert nicht" -#: catalog/aclchk.c:1102 +#: catalog/aclchk.c:1112 #, c-format msgid "default privileges cannot be set for columns" msgstr "Vorgabeprivilegien können nicht für Spalten gesetzt werden" -#: catalog/aclchk.c:1138 +#: catalog/aclchk.c:1148 #, c-format msgid "permission denied to change default privileges" msgstr "keine Berechtigung, um Vorgabeprivilegien zu ändern" -#: catalog/aclchk.c:1256 +#: catalog/aclchk.c:1266 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "Klausel IN SCHEMA kann nicht verwendet werden, wenn GRANT/REVOKE ON SCHEMAS verwendet wird" -#: catalog/aclchk.c:1595 catalog/catalog.c:631 catalog/objectaddress.c:1561 -#: catalog/pg_publication.c:533 commands/analyze.c:389 commands/copy.c:837 -#: commands/sequence.c:1663 commands/tablecmds.c:7339 commands/tablecmds.c:7495 -#: commands/tablecmds.c:7545 commands/tablecmds.c:7619 -#: commands/tablecmds.c:7689 commands/tablecmds.c:7801 -#: commands/tablecmds.c:7895 commands/tablecmds.c:7954 -#: commands/tablecmds.c:8043 commands/tablecmds.c:8073 -#: commands/tablecmds.c:8201 commands/tablecmds.c:8283 -#: commands/tablecmds.c:8417 commands/tablecmds.c:8525 -#: commands/tablecmds.c:12240 commands/tablecmds.c:12421 -#: commands/tablecmds.c:12582 commands/tablecmds.c:13744 -#: commands/tablecmds.c:16273 commands/trigger.c:949 parser/analyze.c:2480 -#: parser/parse_relation.c:737 parser/parse_target.c:1054 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3413 -#: parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2884 -#: utils/adt/ruleutils.c:2799 +#: catalog/aclchk.c:1617 catalog/catalog.c:659 catalog/objectaddress.c:1523 +#: catalog/pg_publication.c:528 commands/analyze.c:380 commands/copy.c:951 +#: commands/sequence.c:1655 commands/tablecmds.c:7574 commands/tablecmds.c:7728 +#: commands/tablecmds.c:7778 commands/tablecmds.c:7852 +#: commands/tablecmds.c:7922 commands/tablecmds.c:8052 +#: commands/tablecmds.c:8181 commands/tablecmds.c:8275 +#: commands/tablecmds.c:8376 commands/tablecmds.c:8503 +#: commands/tablecmds.c:8533 commands/tablecmds.c:8675 +#: commands/tablecmds.c:8768 commands/tablecmds.c:8902 +#: commands/tablecmds.c:9014 commands/tablecmds.c:12851 +#: commands/tablecmds.c:13043 commands/tablecmds.c:13204 +#: commands/tablecmds.c:14393 commands/tablecmds.c:17020 commands/trigger.c:942 +#: parser/analyze.c:2530 parser/parse_relation.c:737 parser/parse_target.c:1067 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3409 +#: parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2923 +#: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "Spalte »%s« von Relation »%s« existiert nicht" -#: catalog/aclchk.c:1840 +#: catalog/aclchk.c:1862 #, c-format msgid "\"%s\" is an index" msgstr "»%s« ist ein Index" -#: catalog/aclchk.c:1847 commands/tablecmds.c:13901 commands/tablecmds.c:17174 +#: catalog/aclchk.c:1869 commands/tablecmds.c:14550 commands/tablecmds.c:17936 #, c-format msgid "\"%s\" is a composite type" msgstr "»%s« ist ein zusammengesetzter Typ" -#: catalog/aclchk.c:1855 catalog/objectaddress.c:1401 commands/sequence.c:1171 -#: commands/tablecmds.c:254 commands/tablecmds.c:17138 utils/adt/acl.c:2092 -#: utils/adt/acl.c:2122 utils/adt/acl.c:2154 utils/adt/acl.c:2186 -#: utils/adt/acl.c:2214 utils/adt/acl.c:2244 +#: catalog/aclchk.c:1877 catalog/objectaddress.c:1363 commands/tablecmds.c:263 +#: commands/tablecmds.c:17900 utils/adt/acl.c:2107 utils/adt/acl.c:2137 +#: utils/adt/acl.c:2170 utils/adt/acl.c:2206 utils/adt/acl.c:2237 +#: utils/adt/acl.c:2268 #, c-format msgid "\"%s\" is not a sequence" msgstr "»%s« ist keine Sequenz" -#: catalog/aclchk.c:1893 +#: catalog/aclchk.c:1915 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "Sequenz »%s« unterstützt nur die Privilegien USAGE, SELECT und UPDATE" -#: catalog/aclchk.c:1910 +#: catalog/aclchk.c:1932 #, c-format msgid "invalid privilege type %s for table" msgstr "ungültiger Privilegtyp %s für Tabelle" -#: catalog/aclchk.c:2072 +#: catalog/aclchk.c:2097 #, c-format msgid "invalid privilege type %s for column" msgstr "ungültiger Privilegtyp %s für Spalte" -#: catalog/aclchk.c:2085 +#: catalog/aclchk.c:2110 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "Sequenz »%s« unterstützt nur den Spaltenprivilegientyp SELECT" -#: catalog/aclchk.c:2275 +#: catalog/aclchk.c:2301 #, c-format msgid "language \"%s\" is not trusted" msgstr "Sprache »%s« ist nicht »trusted«" -#: catalog/aclchk.c:2277 +#: catalog/aclchk.c:2303 #, c-format msgid "GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages." msgstr "GRANT und REVOKE sind für nicht vertrauenswürdige Sprachen nicht erlaubt, weil nur Superuser nicht vertrauenswürdige Sprachen verwenden können." -#: catalog/aclchk.c:2427 +#: catalog/aclchk.c:2454 #, c-format msgid "cannot set privileges of array types" msgstr "für Array-Typen können keine Privilegien gesetzt werden" -#: catalog/aclchk.c:2428 +#: catalog/aclchk.c:2455 #, c-format msgid "Set the privileges of the element type instead." msgstr "Setzen Sie stattdessen die Privilegien des Elementtyps." -#: catalog/aclchk.c:2435 catalog/objectaddress.c:1667 +#: catalog/aclchk.c:2459 +#, c-format +msgid "cannot set privileges of multirange types" +msgstr "für Multirange-Typen können keine Privilegien gesetzt werden" + +#: catalog/aclchk.c:2460 +#, c-format +msgid "Set the privileges of the range type instead." +msgstr "Setzen Sie stattdessen die Privilegien des Range-Typs." + +#: catalog/aclchk.c:2467 catalog/objectaddress.c:1629 #, c-format msgid "\"%s\" is not a domain" msgstr "»%s« ist keine Domäne" -#: catalog/aclchk.c:2621 +#: catalog/aclchk.c:2653 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "unbekannter Privilegtyp »%s«" -#: catalog/aclchk.c:2688 +#: catalog/aclchk.c:2720 #, c-format msgid "permission denied for aggregate %s" msgstr "keine Berechtigung für Aggregatfunktion %s" -#: catalog/aclchk.c:2691 +#: catalog/aclchk.c:2723 #, c-format msgid "permission denied for collation %s" msgstr "keine Berechtigung für Sortierfolge %s" -#: catalog/aclchk.c:2694 +#: catalog/aclchk.c:2726 #, c-format msgid "permission denied for column %s" msgstr "keine Berechtigung für Spalte %s" -#: catalog/aclchk.c:2697 +#: catalog/aclchk.c:2729 #, c-format msgid "permission denied for conversion %s" msgstr "keine Berechtigung für Konversion %s" -#: catalog/aclchk.c:2700 +#: catalog/aclchk.c:2732 #, c-format msgid "permission denied for database %s" msgstr "keine Berechtigung für Datenbank %s" -#: catalog/aclchk.c:2703 +#: catalog/aclchk.c:2735 #, c-format msgid "permission denied for domain %s" msgstr "keine Berechtigung für Domäne %s" -#: catalog/aclchk.c:2706 +#: catalog/aclchk.c:2738 #, c-format msgid "permission denied for event trigger %s" msgstr "keine Berechtigung für Ereignistrigger %s" -#: catalog/aclchk.c:2709 +#: catalog/aclchk.c:2741 #, c-format msgid "permission denied for extension %s" msgstr "keine Berechtigung für Erweiterung %s" -#: catalog/aclchk.c:2712 +#: catalog/aclchk.c:2744 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "keine Berechtigung für Fremddaten-Wrapper %s" -#: catalog/aclchk.c:2715 +#: catalog/aclchk.c:2747 #, c-format msgid "permission denied for foreign server %s" msgstr "keine Berechtigung für Fremdserver %s" -#: catalog/aclchk.c:2718 +#: catalog/aclchk.c:2750 #, c-format msgid "permission denied for foreign table %s" msgstr "keine Berechtigung für Fremdtabelle %s" -#: catalog/aclchk.c:2721 +#: catalog/aclchk.c:2753 #, c-format msgid "permission denied for function %s" msgstr "keine Berechtigung für Funktion %s" -#: catalog/aclchk.c:2724 +#: catalog/aclchk.c:2756 #, c-format msgid "permission denied for index %s" msgstr "keine Berechtigung für Index %s" -#: catalog/aclchk.c:2727 +#: catalog/aclchk.c:2759 #, c-format msgid "permission denied for language %s" msgstr "keine Berechtigung für Sprache %s" -#: catalog/aclchk.c:2730 +#: catalog/aclchk.c:2762 #, c-format msgid "permission denied for large object %s" msgstr "keine Berechtigung für Large Object %s" -#: catalog/aclchk.c:2733 +#: catalog/aclchk.c:2765 #, c-format msgid "permission denied for materialized view %s" msgstr "keine Berechtigung für materialisierte Sicht %s" -#: catalog/aclchk.c:2736 +#: catalog/aclchk.c:2768 #, c-format msgid "permission denied for operator class %s" msgstr "keine Berechtigung für Operatorklasse %s" -#: catalog/aclchk.c:2739 +#: catalog/aclchk.c:2771 #, c-format msgid "permission denied for operator %s" msgstr "keine Berechtigung für Operator %s" -#: catalog/aclchk.c:2742 +#: catalog/aclchk.c:2774 #, c-format msgid "permission denied for operator family %s" msgstr "keine Berechtigung für Operatorfamilie %s" -#: catalog/aclchk.c:2745 +#: catalog/aclchk.c:2777 #, c-format msgid "permission denied for parameter %s" msgstr "keine Berechtigung für Parameter %s" -#: catalog/aclchk.c:2748 +#: catalog/aclchk.c:2780 #, c-format msgid "permission denied for policy %s" msgstr "keine Berechtigung für Policy %s" -#: catalog/aclchk.c:2751 +#: catalog/aclchk.c:2783 #, c-format msgid "permission denied for procedure %s" msgstr "keine Berechtigung für Prozedur %s" -#: catalog/aclchk.c:2754 +#: catalog/aclchk.c:2786 #, c-format msgid "permission denied for publication %s" msgstr "keine Berechtigung für Publikation %s" -#: catalog/aclchk.c:2757 +#: catalog/aclchk.c:2789 #, c-format msgid "permission denied for routine %s" msgstr "keine Berechtigung für Routine %s" -#: catalog/aclchk.c:2760 +#: catalog/aclchk.c:2792 #, c-format msgid "permission denied for schema %s" msgstr "keine Berechtigung für Schema %s" -#: catalog/aclchk.c:2763 commands/sequence.c:659 commands/sequence.c:885 -#: commands/sequence.c:927 commands/sequence.c:968 commands/sequence.c:1761 -#: commands/sequence.c:1810 +#: catalog/aclchk.c:2795 commands/sequence.c:654 commands/sequence.c:880 +#: commands/sequence.c:922 commands/sequence.c:963 commands/sequence.c:1753 +#: commands/sequence.c:1799 #, c-format msgid "permission denied for sequence %s" msgstr "keine Berechtigung für Sequenz %s" -#: catalog/aclchk.c:2766 +#: catalog/aclchk.c:2798 #, c-format msgid "permission denied for statistics object %s" msgstr "keine Berechtigung für Statistikobjekt %s" -#: catalog/aclchk.c:2769 +#: catalog/aclchk.c:2801 #, c-format msgid "permission denied for subscription %s" msgstr "keine Berechtigung für Subskription %s" -#: catalog/aclchk.c:2772 +#: catalog/aclchk.c:2804 #, c-format msgid "permission denied for table %s" msgstr "keine Berechtigung für Tabelle %s" -#: catalog/aclchk.c:2775 +#: catalog/aclchk.c:2807 #, c-format msgid "permission denied for tablespace %s" msgstr "keine Berechtigung für Tablespace %s" -#: catalog/aclchk.c:2778 +#: catalog/aclchk.c:2810 #, c-format msgid "permission denied for text search configuration %s" msgstr "keine Berechtigung für Textsuchekonfiguration %s" -#: catalog/aclchk.c:2781 +#: catalog/aclchk.c:2813 #, c-format msgid "permission denied for text search dictionary %s" msgstr "keine Berechtigung für Textsuchewörterbuch %s" -#: catalog/aclchk.c:2784 +#: catalog/aclchk.c:2816 #, c-format msgid "permission denied for type %s" msgstr "keine Berechtigung für Typ %s" -#: catalog/aclchk.c:2787 +#: catalog/aclchk.c:2819 #, c-format msgid "permission denied for view %s" msgstr "keine Berechtigung für Sicht %s" -#: catalog/aclchk.c:2823 +#: catalog/aclchk.c:2855 #, c-format msgid "must be owner of aggregate %s" msgstr "Berechtigung nur für Eigentümer der Aggregatfunktion %s" -#: catalog/aclchk.c:2826 +#: catalog/aclchk.c:2858 #, c-format msgid "must be owner of collation %s" msgstr "Berechtigung nur für Eigentümer der Sortierfolge %s" -#: catalog/aclchk.c:2829 +#: catalog/aclchk.c:2861 #, c-format msgid "must be owner of conversion %s" msgstr "Berechtigung nur für Eigentümer der Konversion %s" -#: catalog/aclchk.c:2832 +#: catalog/aclchk.c:2864 #, c-format msgid "must be owner of database %s" msgstr "Berechtigung nur für Eigentümer der Datenbank %s" -#: catalog/aclchk.c:2835 +#: catalog/aclchk.c:2867 #, c-format msgid "must be owner of domain %s" msgstr "Berechtigung nur für Eigentümer der Domäne %s" -#: catalog/aclchk.c:2838 +#: catalog/aclchk.c:2870 #, c-format msgid "must be owner of event trigger %s" msgstr "Berechtigung nur für Eigentümer des Ereignistriggers %s" -#: catalog/aclchk.c:2841 +#: catalog/aclchk.c:2873 #, c-format msgid "must be owner of extension %s" msgstr "Berechtigung nur für Eigentümer der Erweiterung %s" -#: catalog/aclchk.c:2844 +#: catalog/aclchk.c:2876 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "Berechtigung nur für Eigentümer des Fremddaten-Wrappers %s" -#: catalog/aclchk.c:2847 +#: catalog/aclchk.c:2879 #, c-format msgid "must be owner of foreign server %s" msgstr "Berechtigung nur für Eigentümer des Fremdservers %s" -#: catalog/aclchk.c:2850 +#: catalog/aclchk.c:2882 #, c-format msgid "must be owner of foreign table %s" msgstr "Berechtigung nur für Eigentümer der Fremdtabelle %s" -#: catalog/aclchk.c:2853 +#: catalog/aclchk.c:2885 #, c-format msgid "must be owner of function %s" msgstr "Berechtigung nur für Eigentümer der Funktion %s" -#: catalog/aclchk.c:2856 +#: catalog/aclchk.c:2888 #, c-format msgid "must be owner of index %s" msgstr "Berechtigung nur für Eigentümer des Index %s" -#: catalog/aclchk.c:2859 +#: catalog/aclchk.c:2891 #, c-format msgid "must be owner of language %s" msgstr "Berechtigung nur für Eigentümer der Sprache %s" -#: catalog/aclchk.c:2862 +#: catalog/aclchk.c:2894 #, c-format msgid "must be owner of large object %s" msgstr "Berechtigung nur für Eigentümer des Large Object %s" -#: catalog/aclchk.c:2865 +#: catalog/aclchk.c:2897 #, c-format msgid "must be owner of materialized view %s" msgstr "Berechtigung nur für Eigentümer der materialisierten Sicht %s" -#: catalog/aclchk.c:2868 +#: catalog/aclchk.c:2900 #, c-format msgid "must be owner of operator class %s" msgstr "Berechtigung nur für Eigentümer der Operatorklasse %s" -#: catalog/aclchk.c:2871 +#: catalog/aclchk.c:2903 #, c-format msgid "must be owner of operator %s" msgstr "Berechtigung nur für Eigentümer des Operators %s" -#: catalog/aclchk.c:2874 +#: catalog/aclchk.c:2906 #, c-format msgid "must be owner of operator family %s" msgstr "Berechtigung nur für Eigentümer der Operatorfamilie %s" -#: catalog/aclchk.c:2877 +#: catalog/aclchk.c:2909 #, c-format msgid "must be owner of procedure %s" msgstr "Berechtigung nur für Eigentümer der Prozedur %s" -#: catalog/aclchk.c:2880 +#: catalog/aclchk.c:2912 #, c-format msgid "must be owner of publication %s" msgstr "Berechtigung nur für Eigentümer der Publikation %s" -#: catalog/aclchk.c:2883 +#: catalog/aclchk.c:2915 #, c-format msgid "must be owner of routine %s" msgstr "Berechtigung nur für Eigentümer der Routine %s" -#: catalog/aclchk.c:2886 +#: catalog/aclchk.c:2918 #, c-format msgid "must be owner of sequence %s" msgstr "Berechtigung nur für Eigentümer der Sequenz %s" -#: catalog/aclchk.c:2889 +#: catalog/aclchk.c:2921 #, c-format msgid "must be owner of subscription %s" msgstr "Berechtigung nur für Eigentümer der Subskription %s" -#: catalog/aclchk.c:2892 +#: catalog/aclchk.c:2924 #, c-format msgid "must be owner of table %s" msgstr "Berechtigung nur für Eigentümer der Tabelle %s" -#: catalog/aclchk.c:2895 +#: catalog/aclchk.c:2927 #, c-format msgid "must be owner of type %s" msgstr "Berechtigung nur für Eigentümer des Typs %s" -#: catalog/aclchk.c:2898 +#: catalog/aclchk.c:2930 #, c-format msgid "must be owner of view %s" msgstr "Berechtigung nur für Eigentümer der Sicht %s" -#: catalog/aclchk.c:2901 +#: catalog/aclchk.c:2933 #, c-format msgid "must be owner of schema %s" msgstr "Berechtigung nur für Eigentümer des Schemas %s" -#: catalog/aclchk.c:2904 +#: catalog/aclchk.c:2936 #, c-format msgid "must be owner of statistics object %s" msgstr "Berechtigung nur für Eigentümer des Statistikobjekts %s" -#: catalog/aclchk.c:2907 +#: catalog/aclchk.c:2939 #, c-format msgid "must be owner of tablespace %s" msgstr "Berechtigung nur für Eigentümer des Tablespace %s" -#: catalog/aclchk.c:2910 +#: catalog/aclchk.c:2942 #, c-format msgid "must be owner of text search configuration %s" msgstr "Berechtigung nur für Eigentümer der Textsuchekonfiguration %s" -#: catalog/aclchk.c:2913 +#: catalog/aclchk.c:2945 #, c-format msgid "must be owner of text search dictionary %s" msgstr "Berechtigung nur für Eigentümer des Textsuchewörterbuches %s" -#: catalog/aclchk.c:2927 +#: catalog/aclchk.c:2959 #, c-format msgid "must be owner of relation %s" msgstr "Berechtigung nur für Eigentümer der Relation %s" -#: catalog/aclchk.c:2973 +#: catalog/aclchk.c:3005 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "keine Berechtigung für Spalte »%s« von Relation »%s«" -#: catalog/aclchk.c:3108 catalog/aclchk.c:3994 catalog/aclchk.c:4026 +#: catalog/aclchk.c:3162 catalog/aclchk.c:4170 catalog/aclchk.c:4201 #, c-format msgid "%s with OID %u does not exist" msgstr "%s mit OID %u existiert nicht" -#: catalog/aclchk.c:3192 catalog/aclchk.c:3211 +#: catalog/aclchk.c:3245 catalog/aclchk.c:3264 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "Attribut %d der Relation mit OID %u existiert nicht" -#: catalog/aclchk.c:3306 +#: catalog/aclchk.c:3302 catalog/aclchk.c:3365 catalog/aclchk.c:4004 #, c-format msgid "relation with OID %u does not exist" msgstr "Relation mit OID %u existiert nicht" -#: catalog/aclchk.c:3491 +#: catalog/aclchk.c:3550 #, c-format msgid "parameter ACL with OID %u does not exist" msgstr "Parameter-ACL mit OID %u existiert nicht" -#: catalog/aclchk.c:3655 commands/collationcmds.c:808 -#: commands/publicationcmds.c:1746 +#: catalog/aclchk.c:3723 commands/collationcmds.c:853 +#: commands/publicationcmds.c:1739 #, c-format msgid "schema with OID %u does not exist" msgstr "Schema mit OID %u existiert nicht" -#: catalog/aclchk.c:3720 utils/cache/typcache.c:385 utils/cache/typcache.c:440 +#: catalog/aclchk.c:3797 catalog/aclchk.c:3824 catalog/aclchk.c:3853 +#: utils/cache/typcache.c:392 utils/cache/typcache.c:447 #, c-format msgid "type with OID %u does not exist" msgstr "Typ mit OID %u existiert nicht" -#: catalog/catalog.c:449 +#: catalog/catalog.c:477 #, c-format msgid "still searching for an unused OID in relation \"%s\"" msgstr "suche immer noch nach einer unbenutzten OID in in Relation »%s«" -#: catalog/catalog.c:451 +#: catalog/catalog.c:479 #, c-format msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." msgstr[0] "OID-Kandidaten wurden %llu mal geprüft, aber es wurde bisher keine unbenutzte OID gefunden." msgstr[1] "OID-Kandidaten wurden %llu mal geprüft, aber es wurde bisher keine unbenutzte OID gefunden." -#: catalog/catalog.c:476 +#: catalog/catalog.c:504 #, c-format msgid "new OID has been assigned in relation \"%s\" after %llu retry" msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" msgstr[0] "neue OID in Relation »%s« wurde zugewiesen nach %llu Versuch" msgstr[1] "neue OID in Relation »%s« wurde zugewiesen nach %llu Versuchen" -#: catalog/catalog.c:609 catalog/catalog.c:676 +#: catalog/catalog.c:637 catalog/catalog.c:704 #, c-format msgid "must be superuser to call %s()" msgstr "nur Superuser können %s() aufrufen" -#: catalog/catalog.c:618 +#: catalog/catalog.c:646 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() kann nur mit Systemkatalogen verwendet werden" -#: catalog/catalog.c:623 parser/parse_utilcmd.c:2264 +#: catalog/catalog.c:651 parser/parse_utilcmd.c:2270 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "Index »%s« gehört nicht zu Tabelle »%s«" -#: catalog/catalog.c:640 +#: catalog/catalog.c:668 #, c-format msgid "column \"%s\" is not of type oid" msgstr "Spalte »%s« hat nicht Typ oid" -#: catalog/catalog.c:647 +#: catalog/catalog.c:675 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "»%s« ist kein Index für Spalte »%s«" -#: catalog/dependency.c:546 catalog/pg_shdepend.c:658 +#: catalog/dependency.c:497 catalog/pg_shdepend.c:703 #, c-format msgid "cannot drop %s because it is required by the database system" msgstr "kann %s nicht löschen, wird vom Datenbanksystem benötigt" -#: catalog/dependency.c:838 catalog/dependency.c:1065 +#: catalog/dependency.c:789 catalog/dependency.c:1016 #, c-format msgid "cannot drop %s because %s requires it" msgstr "kann %s nicht löschen, wird von %s benötigt" -#: catalog/dependency.c:840 catalog/dependency.c:1067 +#: catalog/dependency.c:791 catalog/dependency.c:1018 #, c-format msgid "You can drop %s instead." msgstr "Sie können stattdessen %s löschen." -#: catalog/dependency.c:1146 catalog/dependency.c:1155 +#: catalog/dependency.c:1097 catalog/dependency.c:1106 #, c-format msgid "%s depends on %s" msgstr "%s hängt von %s ab" -#: catalog/dependency.c:1170 catalog/dependency.c:1179 +#: catalog/dependency.c:1121 catalog/dependency.c:1130 #, c-format msgid "drop cascades to %s" msgstr "Löschvorgang löscht ebenfalls %s" -#: catalog/dependency.c:1187 catalog/pg_shdepend.c:823 +#: catalog/dependency.c:1138 catalog/pg_shdepend.c:868 #, c-format msgid "" "\n" @@ -4410,714 +4760,715 @@ msgstr[1] "" "\n" "und %d weitere Objekte (Liste im Serverlog)" -#: catalog/dependency.c:1199 +#: catalog/dependency.c:1150 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "kann %s nicht löschen, weil andere Objekte davon abhängen" -#: catalog/dependency.c:1202 catalog/dependency.c:1209 -#: catalog/dependency.c:1220 commands/tablecmds.c:1335 -#: commands/tablecmds.c:14386 commands/tablespace.c:466 commands/user.c:1309 -#: commands/vacuum.c:211 commands/view.c:446 libpq/auth.c:326 -#: replication/logical/applyparallelworker.c:1044 replication/syncrep.c:1017 -#: storage/lmgr/deadlock.c:1135 storage/lmgr/proc.c:1358 utils/misc/guc.c:3120 -#: utils/misc/guc.c:3156 utils/misc/guc.c:3226 utils/misc/guc.c:6615 -#: utils/misc/guc.c:6649 utils/misc/guc.c:6683 utils/misc/guc.c:6726 -#: utils/misc/guc.c:6768 +#: catalog/dependency.c:1153 catalog/dependency.c:1160 +#: catalog/dependency.c:1171 commands/tablecmds.c:1459 +#: commands/tablecmds.c:15142 commands/tablespace.c:460 commands/user.c:1302 +#: commands/vacuum.c:211 commands/view.c:441 executor/execExprInterp.c:4655 +#: executor/execExprInterp.c:4663 libpq/auth.c:324 +#: replication/logical/applyparallelworker.c:1041 replication/syncrep.c:1078 +#: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1432 utils/misc/guc.c:3169 +#: utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6825 +#: utils/misc/guc.c:6859 utils/misc/guc.c:6893 utils/misc/guc.c:6936 +#: utils/misc/guc.c:6978 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1203 catalog/dependency.c:1210 +#: catalog/dependency.c:1154 catalog/dependency.c:1161 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Verwenden Sie DROP ... CASCADE, um die abhängigen Objekte ebenfalls zu löschen." -#: catalog/dependency.c:1207 +#: catalog/dependency.c:1158 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "kann gewünschte Objekte nicht löschen, weil andere Objekte davon abhängen" -#: catalog/dependency.c:1215 +#: catalog/dependency.c:1166 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" msgstr[0] "Löschvorgang löscht ebenfalls %d weiteres Objekt" msgstr[1] "Löschvorgang löscht ebenfalls %d weitere Objekte" -#: catalog/dependency.c:1899 +#: catalog/dependency.c:1850 #, c-format msgid "constant of the type %s cannot be used here" msgstr "Konstante vom Typ %s kann hier nicht verwendet werden" -#: catalog/dependency.c:2420 parser/parse_relation.c:3403 -#: parser/parse_relation.c:3413 +#: catalog/dependency.c:2375 parser/parse_relation.c:3407 +#: parser/parse_relation.c:3417 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "Spalte %d von Relation »%s« existiert nicht" -#: catalog/heap.c:324 +#: catalog/heap.c:326 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "keine Berechtigung, um »%s.%s« zu erzeugen" -#: catalog/heap.c:326 +#: catalog/heap.c:328 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Änderungen an Systemkatalogen sind gegenwärtig nicht erlaubt." -#: catalog/heap.c:466 commands/tablecmds.c:2374 commands/tablecmds.c:3047 -#: commands/tablecmds.c:6922 +#: catalog/heap.c:468 commands/tablecmds.c:2495 commands/tablecmds.c:2917 +#: commands/tablecmds.c:7163 #, c-format msgid "tables can have at most %d columns" msgstr "Tabellen können höchstens %d Spalten haben" -#: catalog/heap.c:484 commands/tablecmds.c:7229 +#: catalog/heap.c:486 commands/tablecmds.c:7465 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "Spaltenname »%s« steht im Konflikt mit dem Namen einer Systemspalte" -#: catalog/heap.c:500 +#: catalog/heap.c:502 #, c-format msgid "column name \"%s\" specified more than once" msgstr "Spaltenname »%s« mehrmals angegeben" #. translator: first %s is an integer not a name -#: catalog/heap.c:575 +#: catalog/heap.c:580 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "Partitionierungsschlüsselspalte %s hat Pseudotyp %s" -#: catalog/heap.c:580 +#: catalog/heap.c:585 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "Spalte »%s« hat Pseudotyp %s" -#: catalog/heap.c:611 +#: catalog/heap.c:616 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "zusammengesetzter Typ %s kann nicht Teil von sich selbst werden" #. translator: first %s is an integer not a name -#: catalog/heap.c:666 +#: catalog/heap.c:671 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "für Partitionierungsschlüsselspalte %s mit sortierbarem Typ %s wurde keine Sortierfolge abgeleitet" -#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:677 commands/createas.c:198 commands/createas.c:505 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "für Spalte »%s« mit sortierbarem Typ %s wurde keine Sortierfolge abgeleitet" -#: catalog/heap.c:1148 catalog/index.c:886 commands/createas.c:408 -#: commands/tablecmds.c:3987 +#: catalog/heap.c:1162 catalog/index.c:899 commands/createas.c:401 +#: commands/tablecmds.c:4171 #, c-format msgid "relation \"%s\" already exists" msgstr "Relation »%s« existiert bereits" -#: catalog/heap.c:1164 catalog/pg_type.c:434 catalog/pg_type.c:782 -#: catalog/pg_type.c:954 commands/typecmds.c:249 commands/typecmds.c:261 -#: commands/typecmds.c:754 commands/typecmds.c:1169 commands/typecmds.c:1395 -#: commands/typecmds.c:1575 commands/typecmds.c:2546 +#: catalog/heap.c:1178 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: catalog/pg_type.c:977 commands/typecmds.c:253 commands/typecmds.c:265 +#: commands/typecmds.c:758 commands/typecmds.c:1179 commands/typecmds.c:1405 +#: commands/typecmds.c:1585 commands/typecmds.c:2556 #, c-format msgid "type \"%s\" already exists" msgstr "Typ »%s« existiert bereits" -#: catalog/heap.c:1165 +#: catalog/heap.c:1179 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "Eine Relation hat einen zugehörigen Typ mit dem selben Namen, daher müssen Sie einen Namen wählen, der nicht mit einem bestehenden Typ kollidiert." -#: catalog/heap.c:1205 +#: catalog/heap.c:1219 #, c-format msgid "toast relfilenumber value not set when in binary upgrade mode" msgstr "TOAST-Relfile-Nummer-Wert ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/heap.c:1216 +#: catalog/heap.c:1230 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "Heap-OID-Wert für pg_class ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/heap.c:1226 +#: catalog/heap.c:1240 #, c-format msgid "relfilenumber value not set when in binary upgrade mode" msgstr "Relfile-Nummer-Wert ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/heap.c:2119 +#: catalog/heap.c:2185 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "zur partitionierten Tabelle »%s« kann kein NO-INHERIT-Constraint hinzugefügt werden" -#: catalog/heap.c:2393 +#: catalog/heap.c:2452 #, c-format msgid "check constraint \"%s\" already exists" msgstr "Check-Constraint »%s« existiert bereits" -#: catalog/heap.c:2563 catalog/index.c:900 catalog/pg_constraint.c:682 -#: commands/tablecmds.c:8900 +#: catalog/heap.c:2624 catalog/index.c:913 catalog/pg_constraint.c:725 +#: commands/tablecmds.c:9389 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "Constraint »%s« existiert bereits für Relation »%s«" -#: catalog/heap.c:2570 +#: catalog/heap.c:2631 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "Constraint »%s« kollidiert mit nicht vererbtem Constraint für Relation »%s«" -#: catalog/heap.c:2581 +#: catalog/heap.c:2642 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "Constraint »%s« kollidiert mit vererbtem Constraint für Relation »%s«" -#: catalog/heap.c:2591 +#: catalog/heap.c:2652 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "Constraint »%s« kollidiert mit NOT-VALID-Constraint für Relation »%s«" -#: catalog/heap.c:2596 +#: catalog/heap.c:2657 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "Constraint »%s« wird mit geerbter Definition zusammengeführt" -#: catalog/heap.c:2622 catalog/pg_constraint.c:811 commands/tablecmds.c:2672 -#: commands/tablecmds.c:3199 commands/tablecmds.c:6858 -#: commands/tablecmds.c:15208 commands/tablecmds.c:15349 +#: catalog/heap.c:2683 catalog/pg_constraint.c:854 commands/tablecmds.c:3074 +#: commands/tablecmds.c:3377 commands/tablecmds.c:7089 +#: commands/tablecmds.c:15961 commands/tablecmds.c:16092 #, c-format msgid "too many inheritance parents" msgstr "zu viele Elterntabellen" -#: catalog/heap.c:2706 +#: catalog/heap.c:2767 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "generierte Spalte »%s« kann nicht im Spaltengenerierungsausdruck verwendet werden" -#: catalog/heap.c:2708 +#: catalog/heap.c:2769 #, c-format msgid "A generated column cannot reference another generated column." msgstr "Eine generierte Spalte kann nicht auf eine andere generierte Spalte verweisen." -#: catalog/heap.c:2714 +#: catalog/heap.c:2775 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "Variable mit Verweis auf die ganze Zeile kann nicht im Spaltengenerierungsausdruck verwendet werden" -#: catalog/heap.c:2715 +#: catalog/heap.c:2776 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "Dadurch würde die generierte Spalte von ihrem eigenen Wert abhängen." -#: catalog/heap.c:2768 +#: catalog/heap.c:2831 #, c-format msgid "generation expression is not immutable" msgstr "Generierungsausdruck ist nicht »immutable«" -#: catalog/heap.c:2796 rewrite/rewriteHandler.c:1297 +#: catalog/heap.c:2859 rewrite/rewriteHandler.c:1276 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "Spalte »%s« hat Typ %s, aber der Vorgabeausdruck hat Typ %s" -#: catalog/heap.c:2801 commands/prepare.c:334 parser/analyze.c:2704 -#: parser/parse_target.c:593 parser/parse_target.c:874 -#: parser/parse_target.c:884 rewrite/rewriteHandler.c:1302 +#: catalog/heap.c:2864 commands/prepare.c:331 parser/analyze.c:2758 +#: parser/parse_target.c:592 parser/parse_target.c:882 +#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1281 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Sie müssen den Ausdruck umschreiben oder eine Typumwandlung vornehmen." -#: catalog/heap.c:2848 +#: catalog/heap.c:2911 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "nur Verweise auf Tabelle »%s« sind im Check-Constraint zugelassen" -#: catalog/heap.c:3154 +#: catalog/heap.c:3217 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "nicht unterstützte Kombination aus ON COMMIT und Fremdschlüssel" -#: catalog/heap.c:3155 +#: catalog/heap.c:3218 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "Tabelle »%s« verweist auf »%s«, aber sie haben nicht die gleiche ON-COMMIT-Einstellung." -#: catalog/heap.c:3160 +#: catalog/heap.c:3223 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "kann eine Tabelle, die in einen Fremdschlüssel-Constraint eingebunden ist, nicht leeren" -#: catalog/heap.c:3161 +#: catalog/heap.c:3224 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Tabelle »%s« verweist auf »%s«." -#: catalog/heap.c:3163 +#: catalog/heap.c:3226 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Leeren Sie die Tabelle »%s« gleichzeitig oder verwenden Sie TRUNCATE ... CASCADE." -#: catalog/index.c:224 parser/parse_utilcmd.c:2170 +#: catalog/index.c:219 parser/parse_utilcmd.c:2176 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "mehrere Primärschlüssel für Tabelle »%s« nicht erlaubt" -#: catalog/index.c:238 +#: catalog/index.c:233 #, c-format msgid "primary keys cannot use NULLS NOT DISTINCT indexes" msgstr "Primärschlüssel können keine NULLS-NOT-DISTINCT-Indexe verwenden" -#: catalog/index.c:255 +#: catalog/index.c:250 #, c-format msgid "primary keys cannot be expressions" msgstr "Primärschlüssel können keine Ausdrücke sein" -#: catalog/index.c:272 +#: catalog/index.c:267 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "Primärschlüsselspalte »%s« ist nicht als NOT NULL markiert" -#: catalog/index.c:785 catalog/index.c:1941 +#: catalog/index.c:798 catalog/index.c:1915 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "benutzerdefinierte Indexe für Systemkatalogtabellen werden nicht unterstützt" -#: catalog/index.c:825 +#: catalog/index.c:838 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "nichtdeterministische Sortierfolgen werden von Operatorklasse »%s« nicht unterstützt" -#: catalog/index.c:840 +#: catalog/index.c:853 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "nebenläufige Indexerzeugung für Systemkatalogtabellen wird nicht unterstützt" -#: catalog/index.c:849 catalog/index.c:1317 +#: catalog/index.c:862 catalog/index.c:1331 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "nebenläufige Indexerzeugung für Exclusion-Constraints wird nicht unterstützt" -#: catalog/index.c:858 +#: catalog/index.c:871 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "Cluster-globale Indexe können nicht nach initdb erzeugt werden" -#: catalog/index.c:878 commands/createas.c:423 commands/sequence.c:158 +#: catalog/index.c:891 commands/createas.c:416 commands/sequence.c:159 #: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "Relation »%s« existiert bereits, wird übersprungen" -#: catalog/index.c:928 +#: catalog/index.c:941 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "Index-OID-Wert für pg_class ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/index.c:938 utils/cache/relcache.c:3730 +#: catalog/index.c:951 utils/cache/relcache.c:3791 #, c-format msgid "index relfilenumber value not set when in binary upgrade mode" msgstr "Index-Relfile-Nummer-Wert ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/index.c:2240 +#: catalog/index.c:2214 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY muss die erste Aktion in einer Transaktion sein" -#: catalog/index.c:3647 +#: catalog/index.c:3668 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht reindizieren" -#: catalog/index.c:3658 commands/indexcmds.c:3620 +#: catalog/index.c:3679 commands/indexcmds.c:3626 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "ungültiger Index einer TOAST-Tabelle kann nicht reindiziert werden" -#: catalog/index.c:3674 commands/indexcmds.c:3500 commands/indexcmds.c:3644 -#: commands/tablecmds.c:3402 +#: catalog/index.c:3695 commands/indexcmds.c:3504 commands/indexcmds.c:3650 +#: commands/tablecmds.c:3581 #, c-format msgid "cannot move system relation \"%s\"" msgstr "Systemrelation »%s« kann nicht verschoben werden" -#: catalog/index.c:3818 +#: catalog/index.c:3832 #, c-format msgid "index \"%s\" was reindexed" msgstr "Index »%s« wurde neu indiziert" -#: catalog/index.c:3955 +#: catalog/index.c:3998 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "ungültiger Index »%s.%s« einer TOAST-Tabelle kann nicht reindizert werden, wird übersprungen" -#: catalog/namespace.c:260 catalog/namespace.c:464 catalog/namespace.c:556 -#: commands/trigger.c:5687 +#: catalog/namespace.c:462 catalog/namespace.c:666 catalog/namespace.c:758 +#: commands/trigger.c:5729 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: »%s.%s.%s«" -#: catalog/namespace.c:317 +#: catalog/namespace.c:519 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "temporäre Tabellen können keinen Schemanamen angeben" -#: catalog/namespace.c:398 +#: catalog/namespace.c:600 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" msgstr "konnte Sperre für Relation »%s.%s« nicht setzen" -#: catalog/namespace.c:403 commands/lockcmds.c:144 commands/lockcmds.c:224 +#: catalog/namespace.c:605 commands/lockcmds.c:143 commands/lockcmds.c:223 #, c-format msgid "could not obtain lock on relation \"%s\"" msgstr "konnte Sperre für Relation »%s« nicht setzen" -#: catalog/namespace.c:431 parser/parse_relation.c:1429 +#: catalog/namespace.c:633 parser/parse_relation.c:1430 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "Relation »%s.%s« existiert nicht" -#: catalog/namespace.c:436 parser/parse_relation.c:1442 -#: parser/parse_relation.c:1450 utils/adt/regproc.c:913 +#: catalog/namespace.c:638 parser/parse_relation.c:1443 +#: parser/parse_relation.c:1451 utils/adt/regproc.c:913 #, c-format msgid "relation \"%s\" does not exist" msgstr "Relation »%s« existiert nicht" -#: catalog/namespace.c:502 catalog/namespace.c:3073 commands/extension.c:1584 -#: commands/extension.c:1590 +#: catalog/namespace.c:704 catalog/namespace.c:3522 commands/extension.c:1607 +#: commands/extension.c:1613 #, c-format msgid "no schema has been selected to create in" msgstr "kein Schema für die Objekterzeugung ausgewählt" -#: catalog/namespace.c:654 catalog/namespace.c:667 +#: catalog/namespace.c:856 catalog/namespace.c:869 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "kann keine Relationen in temporären Schemas anderer Sitzungen erzeugen" -#: catalog/namespace.c:658 +#: catalog/namespace.c:860 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "kann keine temporäre Relation in einem nicht-temporären Schema erzeugen" -#: catalog/namespace.c:673 +#: catalog/namespace.c:875 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "nur temporäre Relationen können in temporären Schemas erzeugt werden" -#: catalog/namespace.c:2265 +#: catalog/namespace.c:2619 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "Statistikobjekt »%s« existiert nicht" -#: catalog/namespace.c:2388 +#: catalog/namespace.c:2761 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "Textsucheparser »%s« existiert nicht" -#: catalog/namespace.c:2514 utils/adt/regproc.c:1439 +#: catalog/namespace.c:2906 utils/adt/regproc.c:1459 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "Textsuchewörterbuch »%s« existiert nicht" -#: catalog/namespace.c:2641 +#: catalog/namespace.c:3052 #, c-format msgid "text search template \"%s\" does not exist" msgstr "Textsuchevorlage »%s« existiert nicht" -#: catalog/namespace.c:2767 commands/tsearchcmds.c:1162 -#: utils/adt/regproc.c:1329 utils/cache/ts_cache.c:635 +#: catalog/namespace.c:3197 commands/tsearchcmds.c:1168 +#: utils/adt/regproc.c:1349 utils/cache/ts_cache.c:635 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "Textsuchekonfiguration »%s« existiert nicht" -#: catalog/namespace.c:2880 parser/parse_expr.c:832 parser/parse_target.c:1246 +#: catalog/namespace.c:3329 parser/parse_expr.c:868 parser/parse_target.c:1259 #, c-format msgid "cross-database references are not implemented: %s" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s" -#: catalog/namespace.c:2886 gram.y:18570 gram.y:18610 parser/parse_expr.c:839 -#: parser/parse_target.c:1253 +#: catalog/namespace.c:3335 gram.y:19181 gram.y:19221 parser/parse_expr.c:875 +#: parser/parse_target.c:1266 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "falscher qualifizierter Name (zu viele Namensteile): %s" -#: catalog/namespace.c:3016 +#: catalog/namespace.c:3465 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "Objekte können nicht in oder aus temporären Schemas verschoben werden" -#: catalog/namespace.c:3022 +#: catalog/namespace.c:3471 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "Objekte können nicht in oder aus TOAST-Schemas verschoben werden" -#: catalog/namespace.c:3095 commands/schemacmds.c:264 commands/schemacmds.c:344 -#: commands/tablecmds.c:1280 utils/adt/regproc.c:1668 +#: catalog/namespace.c:3544 commands/schemacmds.c:264 commands/schemacmds.c:344 +#: commands/tablecmds.c:1404 utils/adt/regproc.c:1688 #, c-format msgid "schema \"%s\" does not exist" msgstr "Schema »%s« existiert nicht" -#: catalog/namespace.c:3126 +#: catalog/namespace.c:3575 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "falscher Relationsname (zu viele Namensteile): %s" -#: catalog/namespace.c:3693 utils/adt/regproc.c:1056 +#: catalog/namespace.c:4016 utils/adt/regproc.c:1056 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "Sortierfolge »%s« für Kodierung »%s« existiert nicht" -#: catalog/namespace.c:3748 +#: catalog/namespace.c:4071 #, c-format msgid "conversion \"%s\" does not exist" msgstr "Konversion »%s« existiert nicht" -#: catalog/namespace.c:4012 +#: catalog/namespace.c:4412 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "keine Berechtigung, um temporäre Tabellen in Datenbank »%s« zu erzeugen" -#: catalog/namespace.c:4028 +#: catalog/namespace.c:4428 #, c-format msgid "cannot create temporary tables during recovery" msgstr "während der Wiederherstellung können keine temporären Tabellen erzeugt werden" -#: catalog/namespace.c:4034 +#: catalog/namespace.c:4434 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "während einer parallelen Operation können keine temporären Tabellen erzeugt werden" -#: catalog/objectaddress.c:1409 commands/policy.c:96 commands/policy.c:376 -#: commands/tablecmds.c:248 commands/tablecmds.c:290 commands/tablecmds.c:2206 -#: commands/tablecmds.c:12357 +#: catalog/objectaddress.c:1371 commands/policy.c:93 commands/policy.c:373 +#: commands/tablecmds.c:257 commands/tablecmds.c:299 commands/tablecmds.c:2327 +#: commands/tablecmds.c:12979 #, c-format msgid "\"%s\" is not a table" msgstr "»%s« ist keine Tabelle" -#: catalog/objectaddress.c:1416 commands/tablecmds.c:260 -#: commands/tablecmds.c:17143 commands/view.c:119 +#: catalog/objectaddress.c:1378 commands/tablecmds.c:269 +#: commands/tablecmds.c:17905 commands/view.c:114 #, c-format msgid "\"%s\" is not a view" msgstr "»%s« ist keine Sicht" -#: catalog/objectaddress.c:1423 commands/matview.c:187 commands/tablecmds.c:266 -#: commands/tablecmds.c:17148 +#: catalog/objectaddress.c:1385 commands/matview.c:199 commands/tablecmds.c:275 +#: commands/tablecmds.c:17910 #, c-format msgid "\"%s\" is not a materialized view" msgstr "»%s« ist keine materialisierte Sicht" -#: catalog/objectaddress.c:1430 commands/tablecmds.c:284 -#: commands/tablecmds.c:17153 +#: catalog/objectaddress.c:1392 commands/tablecmds.c:293 +#: commands/tablecmds.c:17915 #, c-format msgid "\"%s\" is not a foreign table" msgstr "»%s« ist keine Fremdtabelle" -#: catalog/objectaddress.c:1471 +#: catalog/objectaddress.c:1433 #, c-format msgid "must specify relation and object name" msgstr "Relations- und Objektname müssen angegeben werden" -#: catalog/objectaddress.c:1547 catalog/objectaddress.c:1600 +#: catalog/objectaddress.c:1509 catalog/objectaddress.c:1562 #, c-format msgid "column name must be qualified" msgstr "Spaltenname muss qualifiziert werden" -#: catalog/objectaddress.c:1619 +#: catalog/objectaddress.c:1581 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "Vorgabewert für Spalte »%s« von Relation »%s« existiert nicht" -#: catalog/objectaddress.c:1656 commands/functioncmds.c:137 -#: commands/tablecmds.c:276 commands/typecmds.c:274 commands/typecmds.c:3689 +#: catalog/objectaddress.c:1618 commands/functioncmds.c:132 +#: commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3843 #: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 -#: utils/adt/acl.c:4449 +#: utils/adt/acl.c:4560 #, c-format msgid "type \"%s\" does not exist" msgstr "Typ »%s« existiert nicht" -#: catalog/objectaddress.c:1775 +#: catalog/objectaddress.c:1737 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "Operator %d (%s, %s) von %s existiert nicht" -#: catalog/objectaddress.c:1806 +#: catalog/objectaddress.c:1768 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "Funktion %d (%s, %s) von %s existiert nicht" -#: catalog/objectaddress.c:1857 catalog/objectaddress.c:1883 +#: catalog/objectaddress.c:1819 catalog/objectaddress.c:1845 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "Benutzerabbildung für Benutzer »%s« auf Server »%s« existiert nicht" -#: catalog/objectaddress.c:1872 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:700 +#: catalog/objectaddress.c:1834 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:713 #, c-format msgid "server \"%s\" does not exist" msgstr "Server »%s« existiert nicht" -#: catalog/objectaddress.c:1939 +#: catalog/objectaddress.c:1901 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "Publikationsrelation »%s« in Publikation »%s« existiert nicht" -#: catalog/objectaddress.c:1986 +#: catalog/objectaddress.c:1948 #, c-format msgid "publication schema \"%s\" in publication \"%s\" does not exist" msgstr "Publikationsschema »%s« in Publikation »%s« existiert nicht" -#: catalog/objectaddress.c:2044 +#: catalog/objectaddress.c:2006 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "unbekannter Standard-ACL-Objekttyp »%c«" -#: catalog/objectaddress.c:2045 +#: catalog/objectaddress.c:2007 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "Gültige Objekttypen sind »%c«, »%c«, »%c«, »%c«, »%c«." -#: catalog/objectaddress.c:2096 +#: catalog/objectaddress.c:2058 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "Standard-ACL für Benutzer »%s« in Schema »%s« für %s existiert nicht" -#: catalog/objectaddress.c:2101 +#: catalog/objectaddress.c:2063 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "Standard-ACL für Benutzer »%s« für %s existiert nicht" -#: catalog/objectaddress.c:2127 catalog/objectaddress.c:2184 -#: catalog/objectaddress.c:2239 +#: catalog/objectaddress.c:2089 catalog/objectaddress.c:2146 +#: catalog/objectaddress.c:2201 #, c-format msgid "name or argument lists may not contain nulls" msgstr "Namens- oder Argumentlisten dürfen keine NULL-Werte enthalten" -#: catalog/objectaddress.c:2161 +#: catalog/objectaddress.c:2123 #, c-format msgid "unsupported object type \"%s\"" msgstr "nicht unterstützter Objekttyp »%s«" -#: catalog/objectaddress.c:2180 catalog/objectaddress.c:2197 -#: catalog/objectaddress.c:2262 catalog/objectaddress.c:2346 +#: catalog/objectaddress.c:2142 catalog/objectaddress.c:2159 +#: catalog/objectaddress.c:2224 catalog/objectaddress.c:2308 #, c-format msgid "name list length must be exactly %d" msgstr "Länge der Namensliste muss genau %d sein" -#: catalog/objectaddress.c:2201 +#: catalog/objectaddress.c:2163 #, c-format msgid "large object OID may not be null" msgstr "Large-Object-OID darf nicht NULL sein" -#: catalog/objectaddress.c:2210 catalog/objectaddress.c:2280 -#: catalog/objectaddress.c:2287 +#: catalog/objectaddress.c:2172 catalog/objectaddress.c:2242 +#: catalog/objectaddress.c:2249 #, c-format msgid "name list length must be at least %d" msgstr "Länge der Namensliste muss mindestens %d sein" -#: catalog/objectaddress.c:2273 catalog/objectaddress.c:2294 +#: catalog/objectaddress.c:2235 catalog/objectaddress.c:2256 #, c-format msgid "argument list length must be exactly %d" msgstr "Länge der Argumentliste muss genau %d sein" -#: catalog/objectaddress.c:2508 libpq/be-fsstubs.c:329 +#: catalog/objectaddress.c:2470 libpq/be-fsstubs.c:329 #, c-format msgid "must be owner of large object %u" msgstr "Berechtigung nur für Eigentümer des Large Object %u" -#: catalog/objectaddress.c:2523 commands/functioncmds.c:1561 +#: catalog/objectaddress.c:2485 commands/functioncmds.c:1560 #, c-format msgid "must be owner of type %s or type %s" msgstr "Berechtigung nur für Eigentümer des Typs %s oder des Typs %s" -#: catalog/objectaddress.c:2550 catalog/objectaddress.c:2559 -#: catalog/objectaddress.c:2565 +#: catalog/objectaddress.c:2512 catalog/objectaddress.c:2521 +#: catalog/objectaddress.c:2527 #, c-format msgid "permission denied" msgstr "keine Berechtigung" -#: catalog/objectaddress.c:2551 catalog/objectaddress.c:2560 +#: catalog/objectaddress.c:2513 catalog/objectaddress.c:2522 #, c-format msgid "The current user must have the %s attribute." msgstr "Der aktuelle Benutzer muss das %s-Attribut haben." -#: catalog/objectaddress.c:2566 +#: catalog/objectaddress.c:2528 #, c-format msgid "The current user must have the %s option on role \"%s\"." msgstr "Der aktuelle Benutzer muss die %s-Option für Rolle »%s« haben." -#: catalog/objectaddress.c:2580 +#: catalog/objectaddress.c:2542 #, c-format msgid "must be superuser" msgstr "Berechtigung nur für Superuser" -#: catalog/objectaddress.c:2649 +#: catalog/objectaddress.c:2611 #, c-format msgid "unrecognized object type \"%s\"" msgstr "unbekannter Objekttyp »%s«" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2941 +#: catalog/objectaddress.c:2928 #, c-format msgid "column %s of %s" msgstr "Spalte %s von %s" -#: catalog/objectaddress.c:2956 +#: catalog/objectaddress.c:2943 #, c-format msgid "function %s" msgstr "Funktion %s" -#: catalog/objectaddress.c:2969 +#: catalog/objectaddress.c:2956 #, c-format msgid "type %s" msgstr "Typ %s" -#: catalog/objectaddress.c:3006 +#: catalog/objectaddress.c:2993 #, c-format msgid "cast from %s to %s" msgstr "Typumwandlung von %s in %s" -#: catalog/objectaddress.c:3039 +#: catalog/objectaddress.c:3026 #, c-format msgid "collation %s" msgstr "Sortierfolge %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3070 +#: catalog/objectaddress.c:3057 #, c-format msgid "constraint %s on %s" msgstr "Constraint %s für %s" -#: catalog/objectaddress.c:3076 +#: catalog/objectaddress.c:3063 #, c-format msgid "constraint %s" msgstr "Constraint %s" -#: catalog/objectaddress.c:3108 +#: catalog/objectaddress.c:3095 #, c-format msgid "conversion %s" msgstr "Konversion %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3130 +#: catalog/objectaddress.c:3117 #, c-format msgid "default value for %s" msgstr "Vorgabewert für %s" -#: catalog/objectaddress.c:3141 +#: catalog/objectaddress.c:3128 #, c-format msgid "language %s" msgstr "Sprache %s" -#: catalog/objectaddress.c:3149 +#: catalog/objectaddress.c:3136 #, c-format msgid "large object %u" msgstr "Large Object %u" -#: catalog/objectaddress.c:3162 +#: catalog/objectaddress.c:3149 #, c-format msgid "operator %s" msgstr "Operator %s" -#: catalog/objectaddress.c:3199 +#: catalog/objectaddress.c:3186 #, c-format msgid "operator class %s for access method %s" msgstr "Operatorklasse %s für Zugriffsmethode %s" -#: catalog/objectaddress.c:3227 +#: catalog/objectaddress.c:3214 #, c-format msgid "access method %s" msgstr "Zugriffsmethode %s" @@ -5126,7 +5477,7 @@ msgstr "Zugriffsmethode %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3276 +#: catalog/objectaddress.c:3269 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "Operator %d (%s, %s) von %s: %s" @@ -5135,236 +5486,236 @@ msgstr "Operator %d (%s, %s) von %s: %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3333 +#: catalog/objectaddress.c:3334 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "Funktion %d (%s, %s) von %s: %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3385 +#: catalog/objectaddress.c:3388 #, c-format msgid "rule %s on %s" msgstr "Regel %s für %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3431 +#: catalog/objectaddress.c:3434 #, c-format msgid "trigger %s on %s" msgstr "Trigger %s für %s" -#: catalog/objectaddress.c:3451 +#: catalog/objectaddress.c:3454 #, c-format msgid "schema %s" msgstr "Schema %s" -#: catalog/objectaddress.c:3479 +#: catalog/objectaddress.c:3482 #, c-format msgid "statistics object %s" msgstr "Statistikobjekt %s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3513 #, c-format msgid "text search parser %s" msgstr "Textsucheparser %s" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3544 #, c-format msgid "text search dictionary %s" msgstr "Textsuchewörterbuch %s" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3575 #, c-format msgid "text search template %s" msgstr "Textsuchevorlage %s" -#: catalog/objectaddress.c:3603 +#: catalog/objectaddress.c:3606 #, c-format msgid "text search configuration %s" msgstr "Textsuchekonfiguration %s" -#: catalog/objectaddress.c:3616 +#: catalog/objectaddress.c:3619 #, c-format msgid "role %s" msgstr "Rolle %s" -#: catalog/objectaddress.c:3653 catalog/objectaddress.c:5505 +#: catalog/objectaddress.c:3656 catalog/objectaddress.c:5505 #, c-format msgid "membership of role %s in role %s" msgstr "Mitgliedschaft von Rolle %s in Rolle %s" -#: catalog/objectaddress.c:3674 +#: catalog/objectaddress.c:3677 #, c-format msgid "database %s" msgstr "Datenbank %s" -#: catalog/objectaddress.c:3690 +#: catalog/objectaddress.c:3693 #, c-format msgid "tablespace %s" msgstr "Tablespace %s" -#: catalog/objectaddress.c:3701 +#: catalog/objectaddress.c:3704 #, c-format msgid "foreign-data wrapper %s" msgstr "Fremddaten-Wrapper %s" -#: catalog/objectaddress.c:3711 +#: catalog/objectaddress.c:3714 #, c-format msgid "server %s" msgstr "Server %s" -#: catalog/objectaddress.c:3744 +#: catalog/objectaddress.c:3747 #, c-format msgid "user mapping for %s on server %s" msgstr "Benutzerabbildung für %s auf Server %s" -#: catalog/objectaddress.c:3796 +#: catalog/objectaddress.c:3799 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "Vorgabeprivilegien für neue Relationen von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3800 +#: catalog/objectaddress.c:3803 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "Vorgabeprivilegien für neue Relationen von Rolle %s" -#: catalog/objectaddress.c:3806 +#: catalog/objectaddress.c:3809 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "Vorgabeprivilegien für neue Sequenzen von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3810 +#: catalog/objectaddress.c:3813 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "Vorgabeprivilegien für neue Sequenzen von Rolle %s" -#: catalog/objectaddress.c:3816 +#: catalog/objectaddress.c:3819 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "Vorgabeprivilegien für neue Funktionen von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3820 +#: catalog/objectaddress.c:3823 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "Vorgabeprivilegien für neue Funktionen von Rolle %s" -#: catalog/objectaddress.c:3826 +#: catalog/objectaddress.c:3829 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "Vorgabeprivilegien für neue Typen von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3830 +#: catalog/objectaddress.c:3833 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "Vorgabeprivilegien für neue Typen von Rolle %s" -#: catalog/objectaddress.c:3836 +#: catalog/objectaddress.c:3839 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "Vorgabeprivilegien für neue Schemas von Rolle %s" -#: catalog/objectaddress.c:3843 +#: catalog/objectaddress.c:3846 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "Vorgabeprivilegien von Rolle %s in Schema %s" -#: catalog/objectaddress.c:3847 +#: catalog/objectaddress.c:3850 #, c-format msgid "default privileges belonging to role %s" msgstr "Vorgabeprivilegien von Rolle %s" -#: catalog/objectaddress.c:3869 +#: catalog/objectaddress.c:3872 #, c-format msgid "extension %s" msgstr "Erweiterung %s" -#: catalog/objectaddress.c:3886 +#: catalog/objectaddress.c:3889 #, c-format msgid "event trigger %s" msgstr "Ereignistrigger %s" -#: catalog/objectaddress.c:3910 +#: catalog/objectaddress.c:3913 #, c-format msgid "parameter %s" msgstr "Parameter %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3953 +#: catalog/objectaddress.c:3956 #, c-format msgid "policy %s on %s" msgstr "Policy %s für %s" -#: catalog/objectaddress.c:3967 +#: catalog/objectaddress.c:3970 #, c-format msgid "publication %s" msgstr "Publikation %s" -#: catalog/objectaddress.c:3980 +#: catalog/objectaddress.c:3983 #, c-format msgid "publication of schema %s in publication %s" msgstr "Publikation von Schema %s in Publikation %s" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:4011 +#: catalog/objectaddress.c:4014 #, c-format msgid "publication of %s in publication %s" msgstr "Publikation von %s in Publikation %s" -#: catalog/objectaddress.c:4024 +#: catalog/objectaddress.c:4027 #, c-format msgid "subscription %s" msgstr "Subskription %s" -#: catalog/objectaddress.c:4045 +#: catalog/objectaddress.c:4048 #, c-format msgid "transform for %s language %s" msgstr "Transformation %s für Sprache %s" -#: catalog/objectaddress.c:4116 +#: catalog/objectaddress.c:4117 #, c-format msgid "table %s" msgstr "Tabelle %s" -#: catalog/objectaddress.c:4121 +#: catalog/objectaddress.c:4122 #, c-format msgid "index %s" msgstr "Index %s" -#: catalog/objectaddress.c:4125 +#: catalog/objectaddress.c:4126 #, c-format msgid "sequence %s" msgstr "Sequenz %s" -#: catalog/objectaddress.c:4129 +#: catalog/objectaddress.c:4130 #, c-format msgid "toast table %s" msgstr "TOAST-Tabelle %s" -#: catalog/objectaddress.c:4133 +#: catalog/objectaddress.c:4134 #, c-format msgid "view %s" msgstr "Sicht %s" -#: catalog/objectaddress.c:4137 +#: catalog/objectaddress.c:4138 #, c-format msgid "materialized view %s" msgstr "materialisierte Sicht %s" -#: catalog/objectaddress.c:4141 +#: catalog/objectaddress.c:4142 #, c-format msgid "composite type %s" msgstr "zusammengesetzter Typ %s" -#: catalog/objectaddress.c:4145 +#: catalog/objectaddress.c:4146 #, c-format msgid "foreign table %s" msgstr "Fremdtabelle %s" -#: catalog/objectaddress.c:4150 +#: catalog/objectaddress.c:4151 #, c-format msgid "relation %s" msgstr "Relation %s" -#: catalog/objectaddress.c:4191 +#: catalog/objectaddress.c:4192 #, c-format msgid "operator family %s for access method %s" msgstr "Operatorfamilie %s für Zugriffsmethode %s" @@ -5406,7 +5757,7 @@ msgstr "Anfangswert darf nicht ausgelassen werden, wenn Übergangsfunktion strik msgid "return type of inverse transition function %s is not %s" msgstr "Rückgabetyp der inversen Übergangsfunktion %s ist nicht %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3009 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2991 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "Striktheit der vorwärtigen und inversen Übergangsfunktionen einer Aggregatfunktion müssen übereinstimmen" @@ -5421,7 +5772,7 @@ msgstr "Abschlussfunktion mit zusätzlichen Argumenten darf nicht als STRICT dek msgid "return type of combine function %s is not %s" msgstr "Rückgabetyp der Kombinierfunktion %s ist nicht %s" -#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3903 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3902 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "Kombinierfunktion mit Übergangstyp %s darf nicht als STRICT deklariert sein" @@ -5436,12 +5787,12 @@ msgstr "Rückgabetyp der Serialisierungsfunktion %s ist nicht %s" msgid "return type of deserialization function %s is not %s" msgstr "Rückgabetyp der Deserialisierungsfunktion %s ist nicht %s" -#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:191 catalog/pg_proc.c:225 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:189 catalog/pg_proc.c:223 #, c-format msgid "cannot determine result data type" msgstr "kann Ergebnisdatentyp nicht bestimmen" -#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:204 catalog/pg_proc.c:233 +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:202 catalog/pg_proc.c:231 #, c-format msgid "unsafe use of pseudo-type \"internal\"" msgstr "unsichere Verwendung des Pseudotyps »internal«" @@ -5456,7 +5807,7 @@ msgstr "Moving-Aggregat-Implementierung gibt Typ %s zurück, aber die normale Im msgid "sort operator can only be specified for single-argument aggregates" msgstr "Sortieroperator kann nur für Aggregatfunktionen mit einem Argument angegeben werden" -#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:384 #, c-format msgid "cannot change routine kind" msgstr "kann Routinenart nicht ändern" @@ -5481,13 +5832,13 @@ msgstr "»%s« ist eine Hypothetical-Set-Aggregatfunktion." msgid "cannot change number of direct arguments of an aggregate function" msgstr "die Anzahl direkter Argumente einer Aggregatfunktion kann nicht geändert werden" -#: catalog/pg_aggregate.c:858 commands/functioncmds.c:691 -#: commands/typecmds.c:1975 commands/typecmds.c:2021 commands/typecmds.c:2073 -#: commands/typecmds.c:2110 commands/typecmds.c:2144 commands/typecmds.c:2178 -#: commands/typecmds.c:2212 commands/typecmds.c:2241 commands/typecmds.c:2328 -#: commands/typecmds.c:2370 parser/parse_func.c:417 parser/parse_func.c:448 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:686 +#: commands/typecmds.c:1985 commands/typecmds.c:2031 commands/typecmds.c:2083 +#: commands/typecmds.c:2120 commands/typecmds.c:2154 commands/typecmds.c:2188 +#: commands/typecmds.c:2222 commands/typecmds.c:2251 commands/typecmds.c:2338 +#: commands/typecmds.c:2380 parser/parse_func.c:417 parser/parse_func.c:448 #: parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 -#: parser/parse_func.c:631 parser/parse_func.c:2171 parser/parse_func.c:2444 +#: parser/parse_func.c:631 parser/parse_func.c:2172 parser/parse_func.c:2445 #, c-format msgid "function %s does not exist" msgstr "Funktion %s existiert nicht" @@ -5562,133 +5913,133 @@ msgstr "Diese Operation wird für partitionierte Tabellen nicht unterstützt." msgid "This operation is not supported for partitioned indexes." msgstr "Diese Operation wird für partitionierte Indexe nicht unterstützt." -#: catalog/pg_collation.c:102 catalog/pg_collation.c:160 +#: catalog/pg_collation.c:101 catalog/pg_collation.c:159 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "Sortierfolge »%s« existiert bereits, wird übersprungen" -#: catalog/pg_collation.c:104 +#: catalog/pg_collation.c:103 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" msgstr "Sortierfolge »%s« für Kodierung »%s« existiert bereits, wird übersprungen" -#: catalog/pg_collation.c:112 catalog/pg_collation.c:167 +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 #, c-format msgid "collation \"%s\" already exists" msgstr "Sortierfolge »%s« existiert bereits" -#: catalog/pg_collation.c:114 +#: catalog/pg_collation.c:113 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "Sortierfolge »%s« für Kodierung »%s« existiert bereits" -#: catalog/pg_constraint.c:690 +#: catalog/pg_constraint.c:733 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "Constraint »%s« für Domäne %s existiert bereits" -#: catalog/pg_constraint.c:890 catalog/pg_constraint.c:983 +#: catalog/pg_constraint.c:933 catalog/pg_constraint.c:1026 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "Constraint »%s« für Tabelle »%s« existiert nicht" -#: catalog/pg_constraint.c:1083 +#: catalog/pg_constraint.c:1126 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "Constraint »%s« für Domäne %s existiert nicht" -#: catalog/pg_conversion.c:67 +#: catalog/pg_conversion.c:64 #, c-format msgid "conversion \"%s\" already exists" msgstr "Konversion »%s« existiert bereits" -#: catalog/pg_conversion.c:80 +#: catalog/pg_conversion.c:77 #, c-format msgid "default conversion for %s to %s already exists" msgstr "Standardumwandlung von %s nach %s existiert bereits" -#: catalog/pg_depend.c:222 commands/extension.c:3344 +#: catalog/pg_depend.c:224 commands/extension.c:3397 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s ist schon Mitglied der Erweiterung »%s«" -#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3384 +#: catalog/pg_depend.c:231 catalog/pg_depend.c:282 commands/extension.c:3437 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s ist kein Mitglied der Erweiterung »%s«" -#: catalog/pg_depend.c:232 +#: catalog/pg_depend.c:234 #, c-format msgid "An extension is not allowed to replace an object that it does not own." msgstr "Eine Erweiterung darf kein Objekt ersetzen, das ihr nicht gehört." -#: catalog/pg_depend.c:283 +#: catalog/pg_depend.c:285 #, c-format msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." msgstr "Eine Erweiterung darf CREATE .. IF NOT EXISTS zum Überspringen der Erzeugung eines Objekts nur verwenden, wenn ihr das vorhandene Objekt schon gehört." -#: catalog/pg_depend.c:646 +#: catalog/pg_depend.c:648 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "kann Abhängigkeit von %s nicht entfernen, weil es ein Systemobjekt ist" -#: catalog/pg_enum.c:137 catalog/pg_enum.c:259 catalog/pg_enum.c:554 +#: catalog/pg_enum.c:175 catalog/pg_enum.c:314 catalog/pg_enum.c:624 #, c-format msgid "invalid enum label \"%s\"" msgstr "ungültiges Enum-Label »%s«" -#: catalog/pg_enum.c:138 catalog/pg_enum.c:260 catalog/pg_enum.c:555 +#: catalog/pg_enum.c:176 catalog/pg_enum.c:315 catalog/pg_enum.c:625 #, c-format msgid "Labels must be %d bytes or less." msgstr "Labels müssen %d oder weniger Bytes haben." -#: catalog/pg_enum.c:288 +#: catalog/pg_enum.c:343 #, c-format msgid "enum label \"%s\" already exists, skipping" msgstr "Enum-Label »%s« existiert bereits, wird übersprungen" -#: catalog/pg_enum.c:295 catalog/pg_enum.c:598 +#: catalog/pg_enum.c:350 catalog/pg_enum.c:668 #, c-format msgid "enum label \"%s\" already exists" msgstr "Enum-Label »%s« existiert bereits" -#: catalog/pg_enum.c:350 catalog/pg_enum.c:593 +#: catalog/pg_enum.c:405 catalog/pg_enum.c:663 #, c-format msgid "\"%s\" is not an existing enum label" msgstr "»%s« ist kein existierendes Enum-Label" -#: catalog/pg_enum.c:408 +#: catalog/pg_enum.c:463 #, c-format msgid "pg_enum OID value not set when in binary upgrade mode" msgstr "OID-Wert für pg_enum ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/pg_enum.c:418 +#: catalog/pg_enum.c:473 #, c-format msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" msgstr "ALTER TYPE ADD BEFORE/AFTER ist mit Binary Upgrade inkompatibel" -#: catalog/pg_inherits.c:593 +#: catalog/pg_inherits.c:592 #, c-format msgid "cannot detach partition \"%s\"" msgstr "Partition »%s« kann nicht abgetrennt werden" -#: catalog/pg_inherits.c:595 +#: catalog/pg_inherits.c:594 #, c-format msgid "The partition is being detached concurrently or has an unfinished detach." msgstr "Die Partition wird nebenläufig abgetrennt oder hat eine unfertige Abtrennoperation." -#: catalog/pg_inherits.c:596 commands/tablecmds.c:4583 -#: commands/tablecmds.c:15464 +#: catalog/pg_inherits.c:595 commands/tablecmds.c:4800 +#: commands/tablecmds.c:16207 #, c-format msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." msgstr "Verwendet Sie ALTER TABLE ... DETACH PARTITION ... FINALIZE, um die unerledigte Abtrennoperation abzuschließen." -#: catalog/pg_inherits.c:600 +#: catalog/pg_inherits.c:599 #, c-format msgid "cannot complete detaching partition \"%s\"" msgstr "kann Abtrennen der Partition »%s« nicht abschließen" -#: catalog/pg_inherits.c:602 +#: catalog/pg_inherits.c:601 #, c-format msgid "There's no pending concurrent detach." msgstr "Es gibt keine unerledigte nebenläufige Abtrennoperation." @@ -5698,114 +6049,129 @@ msgstr "Es gibt keine unerledigte nebenläufige Abtrennoperation." msgid "schema \"%s\" already exists" msgstr "Schema »%s« existiert bereits" -#: catalog/pg_operator.c:219 catalog/pg_operator.c:361 +#: catalog/pg_operator.c:213 catalog/pg_operator.c:355 #, c-format msgid "\"%s\" is not a valid operator name" msgstr "»%s« ist kein gültiger Operatorname" -#: catalog/pg_operator.c:370 +#: catalog/pg_operator.c:379 +#, c-format +msgid "operator %s already exists" +msgstr "Operator %s existiert bereits" + +#: catalog/pg_operator.c:445 commands/operatorcmds.c:600 +#, c-format +msgid "operator cannot be its own negator" +msgstr "Operator kann nicht sein eigener Negator sein" + +#: catalog/pg_operator.c:572 #, c-format msgid "only binary operators can have commutators" msgstr "nur binäre Operatoren können Kommutatoren haben" -#: catalog/pg_operator.c:374 commands/operatorcmds.c:509 +#: catalog/pg_operator.c:576 #, c-format msgid "only binary operators can have join selectivity" msgstr "nur binäre Operatoren können Join-Selectivity haben" -#: catalog/pg_operator.c:378 +#: catalog/pg_operator.c:580 #, c-format msgid "only binary operators can merge join" msgstr "nur binäre Operatoren können an einem Merge-Verbund teilnehmen" -#: catalog/pg_operator.c:382 +#: catalog/pg_operator.c:584 #, c-format msgid "only binary operators can hash" msgstr "nur binäre Operatoren können eine Hash-Funktion haben" -#: catalog/pg_operator.c:393 +#: catalog/pg_operator.c:593 #, c-format msgid "only boolean operators can have negators" msgstr "nur Boole’sche Operatoren können Negatoren haben" -#: catalog/pg_operator.c:397 commands/operatorcmds.c:517 +#: catalog/pg_operator.c:597 #, c-format msgid "only boolean operators can have restriction selectivity" msgstr "nur Boole’sche Operatoren können Restriction-Selectivity haben" -#: catalog/pg_operator.c:401 commands/operatorcmds.c:521 +#: catalog/pg_operator.c:601 #, c-format msgid "only boolean operators can have join selectivity" msgstr "nur Boole’sche Operatoren können Join-Selectivity haben" -#: catalog/pg_operator.c:405 +#: catalog/pg_operator.c:605 #, c-format msgid "only boolean operators can merge join" msgstr "nur Boole’sche Operatoren können an einem Merge-Verbund teilnehmen" -#: catalog/pg_operator.c:409 +#: catalog/pg_operator.c:609 #, c-format msgid "only boolean operators can hash" msgstr "nur Boole’sche Operatoren können eine Hash-Funktion haben" -#: catalog/pg_operator.c:421 +#: catalog/pg_operator.c:739 #, c-format -msgid "operator %s already exists" -msgstr "Operator %s existiert bereits" +msgid "commutator operator %s is already the commutator of operator %s" +msgstr "Kommutator-Operator %s ist bereits der Kommutator des Operators %s" -#: catalog/pg_operator.c:621 +#: catalog/pg_operator.c:744 #, c-format -msgid "operator cannot be its own negator or sort operator" -msgstr "Operator kann nicht sein eigener Negator oder Sortierungsoperator sein" +msgid "commutator operator %s is already the commutator of operator %u" +msgstr "Kommutator-Operator %s ist bereits der Kommutator des Operators %u" -#: catalog/pg_parameter_acl.c:53 +#: catalog/pg_operator.c:807 #, c-format -msgid "parameter ACL \"%s\" does not exist" -msgstr "Parameter-ACL »%s« existiert nicht" +msgid "negator operator %s is already the negator of operator %s" +msgstr "Negator-Operator %s ist bereits der Negator des Operators %s" + +#: catalog/pg_operator.c:812 +#, c-format +msgid "negator operator %s is already the negator of operator %u" +msgstr "Negator-Operator %s ist bereits der Negator des Operators %u" -#: catalog/pg_parameter_acl.c:88 +#: catalog/pg_parameter_acl.c:50 #, c-format -msgid "invalid parameter name \"%s\"" -msgstr "ungültiger Parametername »%s«" +msgid "parameter ACL \"%s\" does not exist" +msgstr "Parameter-ACL »%s« existiert nicht" -#: catalog/pg_proc.c:132 parser/parse_func.c:2233 +#: catalog/pg_proc.c:130 parser/parse_func.c:2234 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" msgstr[0] "Funktionen können nicht mehr als %d Argument haben" msgstr[1] "Funktionen können nicht mehr als %d Argumente haben" -#: catalog/pg_proc.c:376 +#: catalog/pg_proc.c:374 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "Funktion »%s« existiert bereits mit den selben Argumenttypen" -#: catalog/pg_proc.c:388 +#: catalog/pg_proc.c:386 #, c-format msgid "\"%s\" is an aggregate function." msgstr "»%s« ist eine Aggregatfunktion." -#: catalog/pg_proc.c:390 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is a function." msgstr "»%s« ist eine Funktion." -#: catalog/pg_proc.c:392 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a procedure." msgstr "»%s« ist eine Prozedur." -#: catalog/pg_proc.c:394 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a window function." msgstr "»%s« ist eine Fensterfunktion." -#: catalog/pg_proc.c:414 +#: catalog/pg_proc.c:412 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "man kann nicht ändern, ob eine Prozedur Ausgabeparameter hat" -#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 +#: catalog/pg_proc.c:413 catalog/pg_proc.c:443 #, c-format msgid "cannot change return type of existing function" msgstr "kann Rückgabetyp einer bestehenden Funktion nicht ändern" @@ -5814,114 +6180,114 @@ msgstr "kann Rückgabetyp einer bestehenden Funktion nicht ändern" #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: catalog/pg_proc.c:421 catalog/pg_proc.c:448 catalog/pg_proc.c:493 -#: catalog/pg_proc.c:519 catalog/pg_proc.c:543 +#: catalog/pg_proc.c:419 catalog/pg_proc.c:446 catalog/pg_proc.c:491 +#: catalog/pg_proc.c:517 catalog/pg_proc.c:541 #, c-format msgid "Use %s %s first." msgstr "Verwenden Sie zuerst %s %s." -#: catalog/pg_proc.c:446 +#: catalog/pg_proc.c:444 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "Der von OUT-Parametern bestimmte Zeilentyp ist verschieden." -#: catalog/pg_proc.c:490 +#: catalog/pg_proc.c:488 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "kann Name des Eingabeparameters »%s« nicht ändern" -#: catalog/pg_proc.c:517 +#: catalog/pg_proc.c:515 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "kann Parametervorgabewerte einer bestehenden Funktion nicht entfernen" -#: catalog/pg_proc.c:541 +#: catalog/pg_proc.c:539 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "kann Datentyp eines bestehenden Parametervorgabewerts nicht ändern" -#: catalog/pg_proc.c:752 +#: catalog/pg_proc.c:750 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "es gibt keine eingebaute Funktion namens %s" -#: catalog/pg_proc.c:845 +#: catalog/pg_proc.c:843 #, c-format msgid "SQL functions cannot return type %s" msgstr "SQL-Funktionen können keinen Rückgabetyp »%s« haben" -#: catalog/pg_proc.c:860 +#: catalog/pg_proc.c:858 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "SQL-Funktionen können keine Argumente vom Typ »%s« haben" -#: catalog/pg_proc.c:987 executor/functions.c:1466 +#: catalog/pg_proc.c:986 executor/functions.c:1468 #, c-format msgid "SQL function \"%s\"" msgstr "SQL-Funktion »%s«" -#: catalog/pg_publication.c:71 catalog/pg_publication.c:79 -#: catalog/pg_publication.c:87 catalog/pg_publication.c:93 +#: catalog/pg_publication.c:66 catalog/pg_publication.c:74 +#: catalog/pg_publication.c:82 catalog/pg_publication.c:88 #, c-format msgid "cannot add relation \"%s\" to publication" msgstr "Relation »%s« kann nicht zu Publikation hinzugefügt werden" -#: catalog/pg_publication.c:81 +#: catalog/pg_publication.c:76 #, c-format msgid "This operation is not supported for system tables." msgstr "Diese Operation wird für Systemtabellen nicht unterstützt." -#: catalog/pg_publication.c:89 +#: catalog/pg_publication.c:84 #, c-format msgid "This operation is not supported for temporary tables." msgstr "Diese Operation wird für temporäre Tabellen nicht unterstützt." -#: catalog/pg_publication.c:95 +#: catalog/pg_publication.c:90 #, c-format msgid "This operation is not supported for unlogged tables." msgstr "Diese Operation wird für ungeloggte Tabellen nicht unterstützt." -#: catalog/pg_publication.c:109 catalog/pg_publication.c:117 +#: catalog/pg_publication.c:104 catalog/pg_publication.c:112 #, c-format msgid "cannot add schema \"%s\" to publication" msgstr "Schema »%s« kann nicht zu Publikation hinzugefügt werden" -#: catalog/pg_publication.c:111 +#: catalog/pg_publication.c:106 #, c-format msgid "This operation is not supported for system schemas." msgstr "Diese Operation wird für Systemschemas nicht unterstützt." -#: catalog/pg_publication.c:119 +#: catalog/pg_publication.c:114 #, c-format msgid "Temporary schemas cannot be replicated." msgstr "Temporäre Schemas können nicht repliziert werden." -#: catalog/pg_publication.c:397 +#: catalog/pg_publication.c:392 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "Relation »%s« ist schon Mitglied der Publikation »%s«" -#: catalog/pg_publication.c:539 +#: catalog/pg_publication.c:534 #, c-format msgid "cannot use system column \"%s\" in publication column list" msgstr "Systemspalte »%s« kann nicht in der Publikationspaltenliste verwendet werden" -#: catalog/pg_publication.c:545 +#: catalog/pg_publication.c:540 #, c-format msgid "cannot use generated column \"%s\" in publication column list" msgstr "generierte Spalte »%s« kann nicht in der Publikationsspaltenliste verwendet werden" -#: catalog/pg_publication.c:551 +#: catalog/pg_publication.c:546 #, c-format msgid "duplicate column \"%s\" in publication column list" msgstr "doppelte Spalte »%s« in Publikationsspaltenliste" -#: catalog/pg_publication.c:641 +#: catalog/pg_publication.c:636 #, c-format msgid "schema \"%s\" is already member of publication \"%s\"" msgstr "Schema »%s« ist schon Mitglied der Publikation »%s«" -#: catalog/pg_shdepend.c:830 +#: catalog/pg_shdepend.c:875 #, c-format msgid "" "\n" @@ -5936,65 +6302,70 @@ msgstr[1] "" "\n" "und Objekte in %d anderen Datenbanken (Liste im Serverlog)" -#: catalog/pg_shdepend.c:1177 +#: catalog/pg_shdepend.c:1222 #, c-format msgid "role %u was concurrently dropped" msgstr "Rolle %u wurde gleichzeitig gelöscht" -#: catalog/pg_shdepend.c:1189 +#: catalog/pg_shdepend.c:1234 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "Tablespace %u wurde gleichzeitig gelöscht" -#: catalog/pg_shdepend.c:1203 +#: catalog/pg_shdepend.c:1248 #, c-format msgid "database %u was concurrently dropped" msgstr "Datenbank %u wurde gleichzeitig gelöscht" -#: catalog/pg_shdepend.c:1254 +#: catalog/pg_shdepend.c:1299 #, c-format msgid "owner of %s" msgstr "Eigentümer von %s" -#: catalog/pg_shdepend.c:1256 +#: catalog/pg_shdepend.c:1301 #, c-format msgid "privileges for %s" msgstr "Privilegien für %s" -#: catalog/pg_shdepend.c:1258 +#: catalog/pg_shdepend.c:1303 +#, c-format +msgid "initial privileges for %s" +msgstr "initiale Privilegien für %s" + +#: catalog/pg_shdepend.c:1305 #, c-format msgid "target of %s" msgstr "Ziel von %s" -#: catalog/pg_shdepend.c:1260 +#: catalog/pg_shdepend.c:1307 #, c-format msgid "tablespace for %s" msgstr "Tablespace für %s" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1268 +#: catalog/pg_shdepend.c:1315 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" msgstr[0] "%d Objekt in %s" msgstr[1] "%d Objekte in %s" -#: catalog/pg_shdepend.c:1332 +#: catalog/pg_shdepend.c:1379 #, c-format msgid "cannot drop objects owned by %s because they are required by the database system" msgstr "kann Objekte, die %s gehören, nicht löschen, weil sie vom Datenbanksystem benötigt werden" -#: catalog/pg_shdepend.c:1498 +#: catalog/pg_shdepend.c:1560 #, c-format msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "kann den Eigentümer von den Objekten, die %s gehören, nicht ändern, weil die Objekte vom Datenbanksystem benötigt werden" -#: catalog/pg_subscription.c:424 +#: catalog/pg_subscription.c:438 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "konnte Relation-Mapping für Subskription »%s« nicht löschen" -#: catalog/pg_subscription.c:426 +#: catalog/pg_subscription.c:440 #, c-format msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." msgstr "Tabellensynchronisierung für Relation »%s« ist im Gang und hat Status »%c«." @@ -6002,227 +6373,227 @@ msgstr "Tabellensynchronisierung für Relation »%s« ist im Gang und hat Status #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command #. -#: catalog/pg_subscription.c:433 +#: catalog/pg_subscription.c:447 #, c-format msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." msgstr "Verwenden Sie %s um die Subskription zu aktivieren, falls noch nicht aktiviert, oder %s um die Subskription zu löschen." -#: catalog/pg_type.c:134 catalog/pg_type.c:474 +#: catalog/pg_type.c:133 catalog/pg_type.c:474 #, c-format msgid "pg_type OID value not set when in binary upgrade mode" msgstr "OID-Wert für pg_type ist im Binary-Upgrade-Modus nicht gesetzt" -#: catalog/pg_type.c:254 +#: catalog/pg_type.c:253 #, c-format msgid "invalid type internal size %d" msgstr "ungültige interne Typgröße %d" -#: catalog/pg_type.c:270 catalog/pg_type.c:278 catalog/pg_type.c:286 -#: catalog/pg_type.c:295 +#: catalog/pg_type.c:269 catalog/pg_type.c:277 catalog/pg_type.c:285 +#: catalog/pg_type.c:294 #, c-format msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" msgstr "Ausrichtung »%c« ist ungültig für Typen mit Wertübergabe mit Größe %d" -#: catalog/pg_type.c:302 +#: catalog/pg_type.c:301 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "interne Größe %d ist ungültig für Typen mit Wertübergabe" -#: catalog/pg_type.c:312 catalog/pg_type.c:318 +#: catalog/pg_type.c:311 catalog/pg_type.c:317 #, c-format msgid "alignment \"%c\" is invalid for variable-length type" msgstr "Ausrichtung »%c« ist ungültig für Typen variabler Länge" -#: catalog/pg_type.c:326 commands/typecmds.c:4140 +#: catalog/pg_type.c:325 commands/typecmds.c:4363 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "Typen mit fester Größe müssen Storage-Typ PLAIN haben" -#: catalog/pg_type.c:955 +#: catalog/pg_type.c:978 #, c-format msgid "Failed while creating a multirange type for type \"%s\"." msgstr "Fehler während der Erzeugung eines Multirange-Typs für Typ »%s«." -#: catalog/pg_type.c:956 +#: catalog/pg_type.c:979 #, c-format msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." msgstr "Sie können einen Multirange-Typnamen manuell angeben, mit dem Attribut »multirange_type_name«." -#: catalog/storage.c:505 storage/buffer/bufmgr.c:1145 +#: catalog/storage.c:533 storage/buffer/bufmgr.c:1540 #, c-format msgid "invalid page in block %u of relation %s" msgstr "ungültige Seite in Block %u von Relation %s" -#: commands/aggregatecmds.c:171 +#: commands/aggregatecmds.c:167 #, c-format msgid "only ordered-set aggregates can be hypothetical" msgstr "nur Ordered-Set-Aggregatfunktionen können Hypothetical-Set-Aggregatfunktionen sein" -#: commands/aggregatecmds.c:196 +#: commands/aggregatecmds.c:192 #, c-format msgid "aggregate attribute \"%s\" not recognized" msgstr "Attribut »%s« für Aggregatfunktion unbekannt" -#: commands/aggregatecmds.c:206 +#: commands/aggregatecmds.c:202 #, c-format msgid "aggregate stype must be specified" msgstr "»stype« für Aggregatfunktion muss angegeben werden" -#: commands/aggregatecmds.c:210 +#: commands/aggregatecmds.c:206 #, c-format msgid "aggregate sfunc must be specified" msgstr "»sfunc« für Aggregatfunktion muss angegeben werden" -#: commands/aggregatecmds.c:222 +#: commands/aggregatecmds.c:218 #, c-format msgid "aggregate msfunc must be specified when mstype is specified" msgstr "»msfunc« für Aggregatfunktion muss angegeben werden, wenn »mstype« angegeben ist" -#: commands/aggregatecmds.c:226 +#: commands/aggregatecmds.c:222 #, c-format msgid "aggregate minvfunc must be specified when mstype is specified" msgstr "»minvfunc« für Aggregatfunktion muss angegeben werden, wenn »mstype« angegeben ist" -#: commands/aggregatecmds.c:233 +#: commands/aggregatecmds.c:229 #, c-format msgid "aggregate msfunc must not be specified without mstype" msgstr "»msfunc« für Aggregatfunktion darf nicht angegeben werden, wenn »mstype« nicht angegeben ist" -#: commands/aggregatecmds.c:237 +#: commands/aggregatecmds.c:233 #, c-format msgid "aggregate minvfunc must not be specified without mstype" msgstr "»minvfunc« für Aggregatfunktion darf nicht angegeben werden, wenn »mstype« nicht angegeben ist" -#: commands/aggregatecmds.c:241 +#: commands/aggregatecmds.c:237 #, c-format msgid "aggregate mfinalfunc must not be specified without mstype" msgstr "»mfinalfunc« für Aggregatfunktion darf nicht angegeben werden, wenn »mstype« nicht angegeben ist" -#: commands/aggregatecmds.c:245 +#: commands/aggregatecmds.c:241 #, c-format msgid "aggregate msspace must not be specified without mstype" msgstr "»msspace« für Aggregatfunktion darf nicht angegeben werden, wenn »mstype« nicht angegeben ist" -#: commands/aggregatecmds.c:249 +#: commands/aggregatecmds.c:245 #, c-format msgid "aggregate minitcond must not be specified without mstype" msgstr "»minitcond« für Aggregatfunktion darf nicht angegeben werden, wenn »mstype« nicht angegeben ist" -#: commands/aggregatecmds.c:278 +#: commands/aggregatecmds.c:274 #, c-format msgid "aggregate input type must be specified" msgstr "Eingabetyp für Aggregatfunktion muss angegeben werden" -#: commands/aggregatecmds.c:308 +#: commands/aggregatecmds.c:304 #, c-format msgid "basetype is redundant with aggregate input type specification" msgstr "Angabe »basetype« ist überflüssig bei Angabe des Eingabetyps der Aggregatfunktion" -#: commands/aggregatecmds.c:351 commands/aggregatecmds.c:392 +#: commands/aggregatecmds.c:347 commands/aggregatecmds.c:388 #, c-format msgid "aggregate transition data type cannot be %s" msgstr "Übergangsdatentyp von Aggregatfunktion kann nicht %s sein" -#: commands/aggregatecmds.c:363 +#: commands/aggregatecmds.c:359 #, c-format msgid "serialization functions may be specified only when the aggregate transition data type is %s" msgstr "Serialisierungsfunktionen dürfen nur angegeben werden, wenn der Übergangsdatentyp der Aggregatfunktion %s ist" -#: commands/aggregatecmds.c:373 +#: commands/aggregatecmds.c:369 #, c-format msgid "must specify both or neither of serialization and deserialization functions" msgstr "Serialisierungs- und Deserialisierungsfunktionen müssen zusammen angegeben werden" -#: commands/aggregatecmds.c:438 commands/functioncmds.c:639 +#: commands/aggregatecmds.c:434 commands/functioncmds.c:634 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "Parameter »parallel« muss SAFE, RESTRICTED oder UNSAFE sein" -#: commands/aggregatecmds.c:494 +#: commands/aggregatecmds.c:490 #, c-format msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" msgstr "Parameter »%s« muss READ_ONLY, SHAREABLE oder READ_WRITE sein" -#: commands/alter.c:86 commands/event_trigger.c:174 +#: commands/alter.c:83 commands/event_trigger.c:191 #, c-format msgid "event trigger \"%s\" already exists" msgstr "Ereignistrigger »%s« existiert bereits" -#: commands/alter.c:89 commands/foreigncmds.c:593 +#: commands/alter.c:86 commands/foreigncmds.c:593 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "Fremddaten-Wrapper »%s« existiert bereits" -#: commands/alter.c:92 commands/foreigncmds.c:884 +#: commands/alter.c:89 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "Server »%s« existiert bereits" -#: commands/alter.c:95 commands/proclang.c:133 +#: commands/alter.c:92 commands/proclang.c:131 #, c-format msgid "language \"%s\" already exists" msgstr "Sprache »%s« existiert bereits" -#: commands/alter.c:98 commands/publicationcmds.c:771 +#: commands/alter.c:95 commands/publicationcmds.c:764 #, c-format msgid "publication \"%s\" already exists" msgstr "Publikation »%s« existiert bereits" -#: commands/alter.c:101 commands/subscriptioncmds.c:657 +#: commands/alter.c:98 commands/subscriptioncmds.c:669 #, c-format msgid "subscription \"%s\" already exists" msgstr "Subskription »%s« existiert bereits" -#: commands/alter.c:124 +#: commands/alter.c:121 #, c-format msgid "conversion \"%s\" already exists in schema \"%s\"" msgstr "Konversion »%s« existiert bereits in Schema »%s«" -#: commands/alter.c:128 +#: commands/alter.c:125 #, c-format msgid "statistics object \"%s\" already exists in schema \"%s\"" msgstr "Statistikobjekt »%s« existiert bereits in Schema »%s«" -#: commands/alter.c:132 +#: commands/alter.c:129 #, c-format msgid "text search parser \"%s\" already exists in schema \"%s\"" msgstr "Textsucheparser »%s« existiert bereits in Schema »%s«" -#: commands/alter.c:136 +#: commands/alter.c:133 #, c-format msgid "text search dictionary \"%s\" already exists in schema \"%s\"" msgstr "Textsuchewörterbuch »%s« existiert bereits in Schema »%s«" -#: commands/alter.c:140 +#: commands/alter.c:137 #, c-format msgid "text search template \"%s\" already exists in schema \"%s\"" msgstr "Textsuchevorlage »%s« existiert bereits in Schema »%s«" -#: commands/alter.c:144 +#: commands/alter.c:141 #, c-format msgid "text search configuration \"%s\" already exists in schema \"%s\"" msgstr "Textsuchekonfiguration »%s« existiert bereits in Schema »%s«" -#: commands/alter.c:217 +#: commands/alter.c:214 #, c-format msgid "must be superuser to rename %s" msgstr "nur Superuser können %s umbenennen" -#: commands/alter.c:259 commands/subscriptioncmds.c:636 -#: commands/subscriptioncmds.c:1116 commands/subscriptioncmds.c:1198 -#: commands/subscriptioncmds.c:1830 +#: commands/alter.c:256 commands/subscriptioncmds.c:648 +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1212 +#: commands/subscriptioncmds.c:1918 #, c-format msgid "password_required=false is superuser-only" -msgstr "" +msgstr "password_required=false ist nur für Superuser" -#: commands/alter.c:260 commands/subscriptioncmds.c:637 -#: commands/subscriptioncmds.c:1117 commands/subscriptioncmds.c:1199 -#: commands/subscriptioncmds.c:1831 +#: commands/alter.c:257 commands/subscriptioncmds.c:649 +#: commands/subscriptioncmds.c:1130 commands/subscriptioncmds.c:1213 +#: commands/subscriptioncmds.c:1919 #, c-format msgid "Subscriptions with the password_required option set to false may only be created or modified by the superuser." -msgstr "" +msgstr "Subskriptionen mit der Option password_required auf falsch gesetzt können nur vom Superuser erzeugt oder geändert werden." -#: commands/alter.c:775 +#: commands/alter.c:735 #, c-format msgid "must be superuser to set schema of %s" msgstr "nur Superuser können Schema von %s setzen" @@ -6242,7 +6613,7 @@ msgstr "Nur Superuser können Zugriffsmethoden anlegen." msgid "access method \"%s\" already exists" msgstr "Zugriffsmethode »%s« existiert bereits" -#: commands/amcmds.c:154 commands/indexcmds.c:217 commands/indexcmds.c:840 +#: commands/amcmds.c:154 commands/indexcmds.c:224 commands/indexcmds.c:850 #: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" @@ -6253,174 +6624,174 @@ msgstr "Zugriffsmethode »%s« existiert nicht" msgid "handler function is not specified" msgstr "keine Handler-Funktion angegeben" -#: commands/amcmds.c:264 commands/event_trigger.c:183 -#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:709 -#: parser/parse_clause.c:941 +#: commands/amcmds.c:264 commands/event_trigger.c:200 +#: commands/foreigncmds.c:489 commands/proclang.c:78 commands/trigger.c:702 +#: parser/parse_clause.c:943 #, c-format msgid "function %s must return type %s" msgstr "Funktion %s muss Rückgabetyp %s haben" -#: commands/analyze.c:227 +#: commands/analyze.c:217 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "überspringe »%s« --- kann diese Fremdtabelle nicht analysieren" -#: commands/analyze.c:244 +#: commands/analyze.c:234 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "überspringe »%s« --- kann Nicht-Tabellen oder besondere Systemtabellen nicht analysieren" -#: commands/analyze.c:324 +#: commands/analyze.c:314 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "analysiere Vererbungsbaum von »%s.%s«" -#: commands/analyze.c:329 +#: commands/analyze.c:319 #, c-format msgid "analyzing \"%s.%s\"" msgstr "analysiere »%s.%s«" -#: commands/analyze.c:394 +#: commands/analyze.c:385 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "Spalte »%s« von Relation »%s« erscheint mehrmals" -#: commands/analyze.c:786 +#: commands/analyze.c:785 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" msgstr "automatisches Analysieren der Tabelle »%s.%s.%s«\n" -#: commands/analyze.c:1333 +#: commands/analyze.c:1300 #, c-format msgid "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead rows; %d rows in sample, %.0f estimated total rows" msgstr "»%s«: %d von %u Seiten gelesen, enthalten %.0f lebende Zeilen und %.0f tote Zeilen; %d Zeilen in Stichprobe, schätzungsweise %.0f Zeilen insgesamt" -#: commands/analyze.c:1417 +#: commands/analyze.c:1384 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" msgstr "überspringe Analysieren des Vererbungsbaums »%s.%s« --- dieser Vererbungsbaum enthält keine abgeleiteten Tabellen" -#: commands/analyze.c:1515 +#: commands/analyze.c:1482 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no analyzable child tables" msgstr "überspringe Analysieren des Vererbungsbaums »%s.%s« --- dieser Vererbungsbaum enthält keine analysierbaren abgeleiteten Tabellen" -#: commands/async.c:646 +#: commands/async.c:612 #, c-format msgid "channel name cannot be empty" msgstr "Kanalname kann nicht leer sein" -#: commands/async.c:652 +#: commands/async.c:618 #, c-format msgid "channel name too long" msgstr "Kanalname zu lang" -#: commands/async.c:657 +#: commands/async.c:623 #, c-format msgid "payload string too long" msgstr "Payload-Zeichenkette zu lang" -#: commands/async.c:876 +#: commands/async.c:842 #, c-format msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" msgstr "PREPARE kann nicht in einer Transaktion ausgeführt werden, die LISTEN, UNLISTEN oder NOTIFY ausgeführt hat" -#: commands/async.c:980 +#: commands/async.c:946 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "zu viele Benachrichtigungen in NOTIFY-Schlange" -#: commands/async.c:1602 +#: commands/async.c:1553 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "NOTIFY-Schlange ist %.0f%% voll" -#: commands/async.c:1604 +#: commands/async.c:1555 #, c-format msgid "The server process with PID %d is among those with the oldest transactions." msgstr "Der Serverprozess mit PID %d gehört zu denen mit den ältesten Transaktionen." -#: commands/async.c:1607 +#: commands/async.c:1558 #, c-format msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "Die NOTIFY-Schlange kann erst geleert werden, wenn dieser Prozess seine aktuelle Transaktion beendet." -#: commands/cluster.c:131 +#: commands/cluster.c:128 #, c-format msgid "unrecognized CLUSTER option \"%s\"" msgstr "unbekannte CLUSTER-Option »%s«" -#: commands/cluster.c:162 commands/cluster.c:435 +#: commands/cluster.c:159 commands/cluster.c:433 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht clustern" -#: commands/cluster.c:180 +#: commands/cluster.c:177 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "es gibt keinen bereits geclusterten Index für Tabelle »%s«" -#: commands/cluster.c:194 commands/tablecmds.c:14200 commands/tablecmds.c:16043 +#: commands/cluster.c:191 commands/tablecmds.c:14851 commands/tablecmds.c:16783 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "Index »%s« für Tabelle »%s« existiert nicht" -#: commands/cluster.c:424 +#: commands/cluster.c:422 #, c-format msgid "cannot cluster a shared catalog" msgstr "globaler Katalog kann nicht geclustert werden" -#: commands/cluster.c:439 +#: commands/cluster.c:437 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "temporäre Tabellen anderer Sitzungen können nicht gevacuumt werden" -#: commands/cluster.c:515 commands/tablecmds.c:16053 +#: commands/cluster.c:513 commands/tablecmds.c:16793 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "»%s« ist kein Index für Tabelle »%s«" -#: commands/cluster.c:523 +#: commands/cluster.c:521 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "kann nicht anhand des Index »%s« clustern, weil die Indexmethode Clustern nicht unterstützt" -#: commands/cluster.c:535 +#: commands/cluster.c:533 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "kann nicht anhand des partiellen Index »%s« clustern" -#: commands/cluster.c:549 +#: commands/cluster.c:547 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "kann nicht anhand des ungültigen Index »%s« clustern" -#: commands/cluster.c:573 +#: commands/cluster.c:571 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "ein Index kann nicht als anhand einer partitionierten Tabelle geclustert markiert werden" -#: commands/cluster.c:952 +#: commands/cluster.c:956 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "clustere »%s.%s« durch Index-Scan von »%s«" -#: commands/cluster.c:958 +#: commands/cluster.c:962 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "clustere »%s.%s« durch sequenziellen Scan und Sortieren" -#: commands/cluster.c:963 +#: commands/cluster.c:967 #, c-format msgid "vacuuming \"%s.%s\"" msgstr "Vacuum von »%s.%s«" -#: commands/cluster.c:990 +#: commands/cluster.c:994 #, c-format msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" msgstr "»%s.%s«: %.0f entfernbare, %.0f nicht entfernbare Zeilenversionen in %u Seiten gefunden" -#: commands/cluster.c:995 +#: commands/cluster.c:999 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -6429,38 +6800,39 @@ msgstr "" "%.0f tote Zeilenversionen können noch nicht entfernt werden.\n" "%s." -#: commands/cluster.c:1730 +#: commands/cluster.c:1744 #, c-format msgid "permission denied to cluster \"%s\", skipping it" -msgstr "keine Berechtigung für Cluster von »%s«, wird übersprungen" +msgstr "keine Berechtigung für Clustern von »%s«, wird übersprungen" -#: commands/collationcmds.c:112 +#: commands/collationcmds.c:110 #, c-format msgid "collation attribute \"%s\" not recognized" msgstr "Attribut »%s« für Sortierfolge unbekannt" -#: commands/collationcmds.c:125 commands/collationcmds.c:131 -#: commands/define.c:389 commands/tablecmds.c:7876 -#: replication/pgoutput/pgoutput.c:310 replication/pgoutput/pgoutput.c:333 -#: replication/pgoutput/pgoutput.c:347 replication/pgoutput/pgoutput.c:357 -#: replication/pgoutput/pgoutput.c:367 replication/pgoutput/pgoutput.c:377 -#: replication/pgoutput/pgoutput.c:387 replication/walsender.c:996 -#: replication/walsender.c:1018 replication/walsender.c:1028 +#: commands/collationcmds.c:123 commands/collationcmds.c:129 +#: commands/define.c:388 commands/tablecmds.c:8162 +#: replication/pgoutput/pgoutput.c:314 replication/pgoutput/pgoutput.c:337 +#: replication/pgoutput/pgoutput.c:351 replication/pgoutput/pgoutput.c:361 +#: replication/pgoutput/pgoutput.c:371 replication/pgoutput/pgoutput.c:381 +#: replication/pgoutput/pgoutput.c:393 replication/walsender.c:1150 +#: replication/walsender.c:1172 replication/walsender.c:1182 +#: replication/walsender.c:1191 replication/walsender.c:1430 #, c-format msgid "conflicting or redundant options" msgstr "widersprüchliche oder überflüssige Optionen" -#: commands/collationcmds.c:126 +#: commands/collationcmds.c:124 #, c-format msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." msgstr "LOCALE kann nicht zusammen mit LC_COLLATE oder LC_CTYPE angegeben werden." -#: commands/collationcmds.c:132 +#: commands/collationcmds.c:130 #, c-format msgid "FROM cannot be specified together with any other options." msgstr "FROM kann nicht zusammen mit anderen Optionen angegeben werden." -#: commands/collationcmds.c:191 +#: commands/collationcmds.c:189 #, c-format msgid "collation \"default\" cannot be copied" msgstr "Sortierfolge »default« kann nicht kopiert werden" @@ -6470,103 +6842,94 @@ msgstr "Sortierfolge »default« kann nicht kopiert werden" msgid "unrecognized collation provider: %s" msgstr "unbekannter Sortierfolgen-Provider: %s" -#: commands/collationcmds.c:253 -#, c-format -msgid "parameter \"lc_collate\" must be specified" -msgstr "Parameter »lc_collate« muss angegeben werden" - -#: commands/collationcmds.c:258 -#, c-format -msgid "parameter \"lc_ctype\" must be specified" -msgstr "Parameter »lc_ctype« muss angegeben werden" - -#: commands/collationcmds.c:265 +#: commands/collationcmds.c:253 commands/collationcmds.c:264 +#: commands/collationcmds.c:270 commands/collationcmds.c:278 #, c-format -msgid "parameter \"locale\" must be specified" -msgstr "Parameter »locale« muss angegeben werden" +msgid "parameter \"%s\" must be specified" +msgstr "Parameter »%s« muss angegeben werden" -#: commands/collationcmds.c:279 commands/dbcommands.c:1081 +#: commands/collationcmds.c:293 commands/dbcommands.c:1134 #, c-format msgid "using standard form \"%s\" for ICU locale \"%s\"" msgstr "verwende Standardform »%s« für ICU-Locale »%s«" -#: commands/collationcmds.c:298 +#: commands/collationcmds.c:312 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "nichtdeterministische Sortierfolgen werden von diesem Provider nicht unterstützt" -#: commands/collationcmds.c:303 commands/dbcommands.c:1100 +#: commands/collationcmds.c:317 commands/dbcommands.c:1087 #, c-format msgid "ICU rules cannot be specified unless locale provider is ICU" msgstr "ICU-Regeln können nur angegeben werden, wenn der Locale-Provider ICU ist" -#: commands/collationcmds.c:322 +#: commands/collationcmds.c:340 #, c-format msgid "current database's encoding is not supported with this provider" msgstr "Kodierung der aktuellen Datenbank wird von diesem Provider nicht unterstützt" -#: commands/collationcmds.c:382 +#: commands/collationcmds.c:409 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "Sortierfolge »%s« für Kodierung »%s« existiert bereits in Schema »%s«" -#: commands/collationcmds.c:393 +#: commands/collationcmds.c:420 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "Sortierfolge »%s« existiert bereits in Schema »%s«" -#: commands/collationcmds.c:418 +#: commands/collationcmds.c:445 #, c-format msgid "cannot refresh version of default collation" msgstr "Version der Standardsortierfolge kann nicht aufgefrischt werden" -#: commands/collationcmds.c:419 +#. translator: %s is an SQL command +#. translator: %s is an SQL ALTER command +#: commands/collationcmds.c:447 commands/subscriptioncmds.c:1376 +#: commands/tablecmds.c:7938 commands/tablecmds.c:7948 +#: commands/tablecmds.c:7950 commands/tablecmds.c:14553 +#: commands/tablecmds.c:17938 commands/tablecmds.c:17959 +#: commands/typecmds.c:3787 commands/typecmds.c:3872 commands/typecmds.c:4226 #, c-format -msgid "Use ALTER DATABASE ... REFRESH COLLATION VERSION instead." -msgstr "Verwenden Sie stattdessen ALTER DATABASE ... REFRESH COLLATION VERSION." +msgid "Use %s instead." +msgstr "Verwenden Sie stattdessen %s." -#: commands/collationcmds.c:446 commands/dbcommands.c:2454 +#: commands/collationcmds.c:480 commands/dbcommands.c:2566 #, c-format msgid "changing version from %s to %s" msgstr "Version wird von %s in %s geändert" -#: commands/collationcmds.c:461 commands/dbcommands.c:2467 +#: commands/collationcmds.c:495 commands/dbcommands.c:2579 #, c-format msgid "version has not changed" msgstr "Version hat sich nicht geändert" -#: commands/collationcmds.c:494 commands/dbcommands.c:2633 +#: commands/collationcmds.c:528 commands/dbcommands.c:2749 #, c-format msgid "database with OID %u does not exist" msgstr "Datenbank mit OID %u existiert nicht" -#: commands/collationcmds.c:515 +#: commands/collationcmds.c:554 #, c-format msgid "collation with OID %u does not exist" msgstr "Sortierfolge mit OID %u existiert nicht" -#: commands/collationcmds.c:803 +#: commands/collationcmds.c:848 #, c-format msgid "must be superuser to import system collations" msgstr "nur Superuser können Systemsortierfolgen importieren" -#: commands/collationcmds.c:831 commands/copyfrom.c:1653 commands/copyto.c:656 -#: libpq/be-secure-common.c:59 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "konnte Befehl »%s« nicht ausführen: %m" - -#: commands/collationcmds.c:923 commands/collationcmds.c:1008 +#: commands/collationcmds.c:968 commands/collationcmds.c:1053 #, c-format msgid "no usable system locales were found" msgstr "keine brauchbaren System-Locales gefunden" -#: commands/comment.c:61 commands/dbcommands.c:1601 commands/dbcommands.c:1798 -#: commands/dbcommands.c:1908 commands/dbcommands.c:2106 -#: commands/dbcommands.c:2344 commands/dbcommands.c:2427 -#: commands/dbcommands.c:2537 commands/dbcommands.c:3037 -#: utils/init/postinit.c:1021 utils/init/postinit.c:1126 -#: utils/init/postinit.c:1143 +#: commands/comment.c:61 commands/dbcommands.c:1665 commands/dbcommands.c:1883 +#: commands/dbcommands.c:1995 commands/dbcommands.c:2193 +#: commands/dbcommands.c:2433 commands/dbcommands.c:2526 +#: commands/dbcommands.c:2650 commands/dbcommands.c:3161 +#: utils/init/postinit.c:1034 utils/init/postinit.c:1098 +#: utils/init/postinit.c:1171 #, c-format msgid "database \"%s\" does not exist" msgstr "Datenbank »%s« existiert nicht" @@ -6576,309 +6939,264 @@ msgstr "Datenbank »%s« existiert nicht" msgid "cannot set comment on relation \"%s\"" msgstr "Kommentar von Relation »%s« kann nicht gesetzt werden" -#: commands/constraint.c:63 utils/adt/ri_triggers.c:2028 +#: commands/constraint.c:61 utils/adt/ri_triggers.c:2019 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "Funktion »%s« wurde nicht von Triggermanager aufgerufen" -#: commands/constraint.c:70 utils/adt/ri_triggers.c:2037 +#: commands/constraint.c:68 utils/adt/ri_triggers.c:2028 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "Funktion »%s« muss AFTER ROW ausgelöst werden" -#: commands/constraint.c:84 +#: commands/constraint.c:82 #, c-format msgid "function \"%s\" must be fired for INSERT or UPDATE" msgstr "Funktion »%s« muss von INSERT oder UPDATE ausgelöst werden" -#: commands/conversioncmds.c:69 +#: commands/conversioncmds.c:62 #, c-format msgid "source encoding \"%s\" does not exist" msgstr "Quellkodierung »%s« existiert nicht" -#: commands/conversioncmds.c:76 +#: commands/conversioncmds.c:69 #, c-format msgid "destination encoding \"%s\" does not exist" msgstr "Zielkodierung »%s« existiert nicht" -#: commands/conversioncmds.c:89 +#: commands/conversioncmds.c:82 #, c-format msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" msgstr "Kodierungsumwandlung nach oder von »SQL_ASCII« wird nicht unterstützt" -#: commands/conversioncmds.c:102 +#: commands/conversioncmds.c:95 #, c-format msgid "encoding conversion function %s must return type %s" msgstr "Kodierungskonversionsfunktion %s muss Typ %s zurückgeben" -#: commands/conversioncmds.c:132 +#: commands/conversioncmds.c:125 #, c-format msgid "encoding conversion function %s returned incorrect result for empty input" msgstr "Kodierungskonversionsfunktion %s hat falsches Ergebnis für leere Eingabe zurückgegeben" -#: commands/copy.c:86 +#: commands/copy.c:84 #, c-format msgid "permission denied to COPY to or from an external program" msgstr "keine Berechtigung für COPY mit externem Programm" -#: commands/copy.c:87 +#: commands/copy.c:85 #, c-format msgid "Only roles with privileges of the \"%s\" role may COPY to or from an external program." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können COPY mit externen Programmen verwenden." -#: commands/copy.c:89 commands/copy.c:100 commands/copy.c:109 +#: commands/copy.c:87 commands/copy.c:98 commands/copy.c:107 #, c-format msgid "Anyone can COPY to stdout or from stdin. psql's \\copy command also works for anyone." msgstr "Jeder kann COPY mit STDOUT oder STDIN verwenden. Der Befehl \\copy in psql funktioniert auch für jeden." -#: commands/copy.c:97 +#: commands/copy.c:95 #, c-format msgid "permission denied to COPY from a file" msgstr "keine Berechtigung für COPY aus einer Datei" -#: commands/copy.c:98 +#: commands/copy.c:96 #, c-format msgid "Only roles with privileges of the \"%s\" role may COPY from a file." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können mit COPY aus einer Datei lesen." -#: commands/copy.c:106 +#: commands/copy.c:104 #, c-format msgid "permission denied to COPY to a file" msgstr "keine Berechtigung für COPY in eine Datei" -#: commands/copy.c:107 +#: commands/copy.c:105 #, c-format msgid "Only roles with privileges of the \"%s\" role may COPY to a file." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können mit COPY in eine Datei schreiben." -#: commands/copy.c:195 +#: commands/copy.c:193 #, c-format msgid "COPY FROM not supported with row-level security" msgstr "COPY FROM wird nicht unterstützt mit Sicherheit auf Zeilenebene" -#: commands/copy.c:196 +#: commands/copy.c:194 #, c-format msgid "Use INSERT statements instead." msgstr "Verwenden Sie stattdessen INSERT-Anweisungen." -#: commands/copy.c:290 -#, c-format -msgid "MERGE not supported in COPY" -msgstr "MERGE wird in COPY nicht unterstützt" - -#: commands/copy.c:383 +#: commands/copy.c:375 #, c-format msgid "cannot use \"%s\" with HEADER in COPY TO" msgstr "»%s« kann nicht mit HEADER in COPY TO verwendet werden" -#: commands/copy.c:392 +#: commands/copy.c:384 #, c-format msgid "%s requires a Boolean value or \"match\"" msgstr "%s erfordert einen Boole’schen Wert oder »match«" -#: commands/copy.c:451 +#. translator: first %s is the name of a COPY option, e.g. ON_ERROR, +#. second %s is a COPY with direction, e.g. COPY TO +#: commands/copy.c:402 commands/copy.c:782 commands/copy.c:798 +#: commands/copy.c:815 commands/copy.c:841 commands/copy.c:851 +#, c-format +msgid "COPY %s cannot be used with %s" +msgstr "COPY %s kann nicht mit %s verwendet werden" + +#. translator: first %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:416 commands/copy.c:441 +#, c-format +msgid "COPY %s \"%s\" not recognized" +msgstr "COPY %s »%s« nicht erkannt" + +#: commands/copy.c:502 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "COPY-Format »%s« nicht erkannt" -#: commands/copy.c:509 commands/copy.c:522 commands/copy.c:535 -#: commands/copy.c:554 +#: commands/copy.c:560 commands/copy.c:575 commands/copy.c:590 +#: commands/copy.c:609 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "Argument von Option »%s« muss eine Liste aus Spaltennamen sein" -#: commands/copy.c:566 +#: commands/copy.c:621 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "Argument von Option »%s« muss ein gültiger Kodierungsname sein" -#: commands/copy.c:573 commands/dbcommands.c:859 commands/dbcommands.c:2292 +#: commands/copy.c:642 commands/dbcommands.c:866 commands/dbcommands.c:2381 #, c-format msgid "option \"%s\" not recognized" msgstr "Option »%s« nicht erkannt" -#: commands/copy.c:585 -#, c-format -msgid "cannot specify DELIMITER in BINARY mode" -msgstr "DELIMITER kann nicht im BINARY-Modus angegeben werden" - -#: commands/copy.c:590 +#. translator: %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:655 commands/copy.c:660 commands/copy.c:665 +#: commands/copy.c:740 #, c-format -msgid "cannot specify NULL in BINARY mode" -msgstr "NULL kann nicht im BINARY-Modus angegeben werden" +msgid "cannot specify %s in BINARY mode" +msgstr "%s kann nicht im BINARY-Modus angegeben werden" -#: commands/copy.c:595 +#: commands/copy.c:670 #, c-format -msgid "cannot specify DEFAULT in BINARY mode" -msgstr "DEFAULT kann nicht im BINARY-Modus angegeben werden" +msgid "only ON_ERROR STOP is allowed in BINARY mode" +msgstr "nur ON_ERROR STOP ist im BINARY-Modus erlaubt" -#: commands/copy.c:617 +#: commands/copy.c:692 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "DELIMITER für COPY muss ein einzelnes Ein-Byte-Zeichen sein" -#: commands/copy.c:624 +#: commands/copy.c:699 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "COPY-Trennzeichen kann nicht Newline oder Carriage Return sein" -#: commands/copy.c:630 +#: commands/copy.c:705 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "COPY NULL-Darstellung kann nicht Newline oder Carriage Return enthalten" -#: commands/copy.c:640 +#: commands/copy.c:715 #, c-format msgid "COPY default representation cannot use newline or carriage return" msgstr "COPY DEFAULT-Darstellung kann nicht Newline oder Carriage Return enthalten" -#: commands/copy.c:658 +#: commands/copy.c:733 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "DELIMITER für COPY darf nicht »%s« sein" -#: commands/copy.c:664 -#, c-format -msgid "cannot specify HEADER in BINARY mode" -msgstr "HEADER kann nicht im BINARY-Modus angegeben werden" - -#: commands/copy.c:670 +#. translator: %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:747 commands/copy.c:764 commands/copy.c:776 +#: commands/copy.c:791 commands/copy.c:807 #, c-format -msgid "COPY quote available only in CSV mode" -msgstr "Quote-Zeichen für COPY ist nur im CSV-Modus verfügbar" +msgid "COPY %s requires CSV mode" +msgstr "COPY %s benötigt CSV-Modus" -#: commands/copy.c:675 +#: commands/copy.c:752 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "Quote-Zeichen für COPY muss ein einzelnes Ein-Byte-Zeichen sein" -#: commands/copy.c:680 +#: commands/copy.c:757 #, c-format msgid "COPY delimiter and quote must be different" msgstr "DELIMITER und QUOTE für COPY müssen verschieden sein" -#: commands/copy.c:686 -#, c-format -msgid "COPY escape available only in CSV mode" -msgstr "Escape-Zeichen für COPY ist nur im CSV-Modus verfügbar" - -#: commands/copy.c:691 +#: commands/copy.c:769 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "Escape-Zeichen für COPY muss ein einzelnes Ein-Byte-Zeichen sein" -#: commands/copy.c:697 -#, c-format -msgid "COPY force quote available only in CSV mode" -msgstr "FORCE_QUOTE für COPY ist nur im CSV-Modus verfügbar" - -#: commands/copy.c:701 -#, c-format -msgid "COPY force quote only available using COPY TO" -msgstr "FORCE_QUOTE ist nur bei COPY TO verfügbar" - -#: commands/copy.c:707 -#, c-format -msgid "COPY force not null available only in CSV mode" -msgstr "FORCE_NOT_NULL für COPY ist nur im CSV-Modus verfügbar" - -#: commands/copy.c:711 -#, c-format -msgid "COPY force not null only available using COPY FROM" -msgstr "FORCE_NOT_NULL ist nur bei COPY FROM verfügbar" - -#: commands/copy.c:717 -#, c-format -msgid "COPY force null available only in CSV mode" -msgstr "FORCE_NULL für COPY ist nur im CSV-Modus verfügbar" - -#: commands/copy.c:722 +#. translator: %s is the name of a COPY option, e.g. NULL +#: commands/copy.c:823 commands/copy.c:859 #, c-format -msgid "COPY force null only available using COPY FROM" -msgstr "FORCE_NULL ist nur bei COPY FROM verfügbar" +msgid "COPY delimiter character must not appear in the %s specification" +msgstr "Trennzeichen für COPY darf nicht in der %s-Darstellung erscheinen" -#: commands/copy.c:728 +#. translator: %s is the name of a COPY option, e.g. NULL +#: commands/copy.c:832 commands/copy.c:868 #, c-format -msgid "COPY delimiter must not appear in the NULL specification" -msgstr "Trennzeichen für COPY darf nicht in der NULL-Darstellung erscheinen" +msgid "CSV quote character must not appear in the %s specification" +msgstr "CSV-Quote-Zeichen darf nicht in der %s-Darstellung erscheinen" -#: commands/copy.c:735 -#, c-format -msgid "CSV quote character must not appear in the NULL specification" -msgstr "CSV-Quote-Zeichen darf nicht in der NULL-Darstellung erscheinen" - -#: commands/copy.c:742 -#, c-format -msgid "COPY DEFAULT only available using COPY FROM" -msgstr "COPY DEFAULT ist nur bei COPY FROM verfügbar" - -#: commands/copy.c:748 -#, c-format -msgid "COPY delimiter must not appear in the DEFAULT specification" -msgstr "Trennzeichen für COPY darf nicht in der DEFAULT-Darstellung erscheinen" - -#: commands/copy.c:755 -#, c-format -msgid "CSV quote character must not appear in the DEFAULT specification" -msgstr "CSV-Quote-Zeichen darf nicht in der DEFAULT-Darstellung erscheinen" - -#: commands/copy.c:763 +#: commands/copy.c:877 #, c-format msgid "NULL specification and DEFAULT specification cannot be the same" msgstr "NULL-Darstellung und DEFAULT-Darstellung können nicht gleich sein" -#: commands/copy.c:825 +#: commands/copy.c:939 #, c-format msgid "column \"%s\" is a generated column" msgstr "Spalte »%s« ist eine generierte Spalte" -#: commands/copy.c:827 +#: commands/copy.c:941 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "Generierte Spalten können nicht in COPY verwendet werden." -#: commands/copy.c:842 commands/indexcmds.c:1894 commands/statscmds.c:242 -#: commands/tablecmds.c:2405 commands/tablecmds.c:3127 -#: commands/tablecmds.c:3626 parser/parse_relation.c:3688 -#: parser/parse_relation.c:3698 parser/parse_relation.c:3716 -#: parser/parse_relation.c:3723 parser/parse_relation.c:3737 -#: utils/adt/tsvector_op.c:2855 +#: commands/copy.c:956 commands/indexcmds.c:1890 commands/statscmds.c:239 +#: commands/tablecmds.c:2526 commands/tablecmds.c:2997 +#: commands/tablecmds.c:3808 parser/parse_relation.c:3692 +#: parser/parse_relation.c:3702 parser/parse_relation.c:3720 +#: parser/parse_relation.c:3727 parser/parse_relation.c:3741 +#: utils/adt/tsvector_op.c:2853 #, c-format msgid "column \"%s\" does not exist" msgstr "Spalte »%s« existiert nicht" -#: commands/copy.c:849 commands/tablecmds.c:2431 commands/trigger.c:958 -#: parser/parse_target.c:1070 parser/parse_target.c:1081 +#: commands/copy.c:963 commands/tablecmds.c:2552 commands/trigger.c:951 +#: parser/parse_target.c:1083 parser/parse_target.c:1094 #, c-format msgid "column \"%s\" specified more than once" msgstr "Spalte »%s« mehrmals angegeben" -#: commands/copyfrom.c:122 +#: commands/copyfrom.c:118 #, c-format msgid "COPY %s" msgstr "COPY %s" -#: commands/copyfrom.c:130 +#: commands/copyfrom.c:126 #, c-format msgid "COPY %s, line %llu, column %s" msgstr "COPY %s, Zeile %llu, Spalte %s" -#: commands/copyfrom.c:135 commands/copyfrom.c:181 +#: commands/copyfrom.c:131 commands/copyfrom.c:177 #, c-format msgid "COPY %s, line %llu" msgstr "COPY %s, Zeile %llu" -#: commands/copyfrom.c:147 +#: commands/copyfrom.c:143 #, c-format msgid "COPY %s, line %llu, column %s: \"%s\"" msgstr "COPY %s, Zeile %llu, Spalte %s: »%s«" -#: commands/copyfrom.c:157 +#: commands/copyfrom.c:153 #, c-format msgid "COPY %s, line %llu, column %s: null input" msgstr "COPY %s, Zeile %llu, Spalte %s: NULL Eingabe" -#: commands/copyfrom.c:174 +#: commands/copyfrom.c:170 #, c-format msgid "COPY %s, line %llu: \"%s\"" msgstr "COPY %s, Zeile %llu: »%s«" @@ -6923,32 +7241,41 @@ msgstr "COPY FREEZE kann nicht durchgeführt werden wegen vorheriger Aktivität msgid "cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction" msgstr "COPY FREEZE kann nicht durchgeführt werden, weil die Tabelle nicht in der aktuellen Transaktion erzeugt oder geleert wurde" -#: commands/copyfrom.c:1411 +#: commands/copyfrom.c:1313 #, c-format -msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" -msgstr "Spalte »%s« mit FORCE_NOT_NULL wird von COPY nicht verwendet" +msgid "%llu row was skipped due to data type incompatibility" +msgid_plural "%llu rows were skipped due to data type incompatibility" +msgstr[0] "%llu Zeile wurde übersprungen wegen Datentypinkompatibilität" +msgstr[1] "%llu Zeilen wurden übersprungen wegen Datentypinkompatibilität" -#: commands/copyfrom.c:1434 +#. translator: first %s is the name of a COPY option, e.g. FORCE_NOT_NULL +#. translator: %s is the name of a COPY option, e.g. FORCE_NOT_NULL +#: commands/copyfrom.c:1448 commands/copyfrom.c:1491 commands/copyto.c:601 #, c-format -msgid "FORCE_NULL column \"%s\" not referenced by COPY" -msgstr "Spalte »%s« mit FORCE_NULL wird von COPY nicht verwendet" +msgid "%s column \"%s\" not referenced by COPY" +msgstr "Spalte »%s« mit %s wird von COPY nicht verwendet" -#: commands/copyfrom.c:1672 +#: commands/copyfrom.c:1544 utils/mb/mbutils.c:385 +#, c-format +msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" +msgstr "Standardumwandlung von Kodierung »%s« nach »%s« existiert nicht" + +#: commands/copyfrom.c:1742 #, c-format msgid "COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \\copy." msgstr "Mit COPY FROM liest der PostgreSQL-Serverprozess eine Datei. Möglicherweise möchten Sie Funktionalität auf Client-Seite verwenden, wie zum Beispiel \\copy in psql." -#: commands/copyfrom.c:1685 commands/copyto.c:708 +#: commands/copyfrom.c:1755 commands/copyto.c:706 #, c-format msgid "\"%s\" is a directory" msgstr "»%s« ist ein Verzeichnis" -#: commands/copyfrom.c:1753 commands/copyto.c:306 libpq/be-secure-common.c:83 +#: commands/copyfrom.c:1823 commands/copyto.c:299 libpq/be-secure-common.c:83 #, c-format msgid "could not close pipe to external command: %m" msgstr "konnte Pipe zu externem Programm nicht schließen: %m" -#: commands/copyfrom.c:1768 commands/copyto.c:311 +#: commands/copyfrom.c:1838 commands/copyto.c:304 #, c-format msgid "program \"%s\" failed" msgstr "Programm »%s« fehlgeschlagen" @@ -6989,17 +7316,17 @@ msgid "could not read from COPY file: %m" msgstr "konnte nicht aus COPY-Datei lesen: %m" #: commands/copyfromparse.c:278 commands/copyfromparse.c:303 -#: tcop/postgres.c:377 +#: replication/walsender.c:760 replication/walsender.c:786 tcop/postgres.c:381 #, c-format msgid "unexpected EOF on client connection with an open transaction" msgstr "unerwartetes EOF auf Client-Verbindung mit einer offenen Transaktion" -#: commands/copyfromparse.c:294 +#: commands/copyfromparse.c:294 replication/walsender.c:776 #, c-format msgid "unexpected message type 0x%02X during COPY from stdin" msgstr "unerwarteter Messagetyp 0x%02X während COPY FROM STDIN" -#: commands/copyfromparse.c:317 +#: commands/copyfromparse.c:317 replication/walsender.c:807 #, c-format msgid "COPY from stdin failed: %s" msgstr "COPY FROM STDIN fehlgeschlagen: %s" @@ -7019,8 +7346,8 @@ msgstr "Spaltenname in Kopfzeile Feld %d stimmt nicht überein: NULL-Wert (»%s msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" msgstr "Spaltenname in Kopfzeile Feld %d stimmt nicht überein: »%s« erhalten, »%s« erwartet" -#: commands/copyfromparse.c:892 commands/copyfromparse.c:1514 -#: commands/copyfromparse.c:1770 +#: commands/copyfromparse.c:892 commands/copyfromparse.c:1554 +#: commands/copyfromparse.c:1810 #, c-format msgid "extra data after last expected column" msgstr "zusätzliche Daten nach letzter erwarteter Spalte" @@ -7030,1122 +7357,1177 @@ msgstr "zusätzliche Daten nach letzter erwarteter Spalte" msgid "missing data for column \"%s\"" msgstr "fehlende Daten für Spalte »%s«" -#: commands/copyfromparse.c:999 +#: commands/copyfromparse.c:990 +#, c-format +msgid "skipping row due to data type incompatibility at line %llu for column \"%s\": \"%s\"" +msgstr "Zeile wird übersprungen wegen Datentypinkompatibilität auf Zeile %llu für Spalte »%s«: »%s«" + +#: commands/copyfromparse.c:998 +#, c-format +msgid "skipping row due to data type incompatibility at line %llu for column \"%s\": null input" +msgstr "Zeile wird übersprungen wegen Datentypinkompatibilität auf Zeile %llu für Spalte »%s«: Eingabe ist NULL" + +#: commands/copyfromparse.c:1044 #, c-format msgid "received copy data after EOF marker" msgstr "COPY-Daten nach EOF-Markierung empfangen" -#: commands/copyfromparse.c:1006 +#: commands/copyfromparse.c:1051 #, c-format msgid "row field count is %d, expected %d" msgstr "Feldanzahl in Zeile ist %d, erwartet wurden %d" -#: commands/copyfromparse.c:1296 commands/copyfromparse.c:1313 +#: commands/copyfromparse.c:1336 commands/copyfromparse.c:1353 #, c-format msgid "literal carriage return found in data" msgstr "Carriage-Return-Zeichen in Daten gefunden" -#: commands/copyfromparse.c:1297 commands/copyfromparse.c:1314 +#: commands/copyfromparse.c:1337 commands/copyfromparse.c:1354 #, c-format msgid "unquoted carriage return found in data" msgstr "ungequotetes Carriage-Return-Zeichen in Daten gefunden" -#: commands/copyfromparse.c:1299 commands/copyfromparse.c:1316 +#: commands/copyfromparse.c:1339 commands/copyfromparse.c:1356 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "Verwenden Sie »\\r«, um ein Carriage-Return-Zeichen darzustellen." -#: commands/copyfromparse.c:1300 commands/copyfromparse.c:1317 +#: commands/copyfromparse.c:1340 commands/copyfromparse.c:1357 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "Verwenden Sie ein gequotetes CSV-Feld, um ein Carriage-Return-Zeichen darzustellen." -#: commands/copyfromparse.c:1329 +#: commands/copyfromparse.c:1369 #, c-format msgid "literal newline found in data" msgstr "Newline-Zeichen in Daten gefunden" -#: commands/copyfromparse.c:1330 +#: commands/copyfromparse.c:1370 #, c-format msgid "unquoted newline found in data" msgstr "ungequotetes Newline-Zeichen in Daten gefunden" -#: commands/copyfromparse.c:1332 +#: commands/copyfromparse.c:1372 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "Verwenden Sie »\\n«, um ein Newline-Zeichen darzustellen." -#: commands/copyfromparse.c:1333 +#: commands/copyfromparse.c:1373 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "Verwenden Sie ein gequotetes CSV-Feld, um ein Newline-Zeichen darzustellen." -#: commands/copyfromparse.c:1379 commands/copyfromparse.c:1415 +#: commands/copyfromparse.c:1419 commands/copyfromparse.c:1455 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "COPY-Ende-Markierung stimmt nicht mit vorherigem Newline-Stil überein" -#: commands/copyfromparse.c:1388 commands/copyfromparse.c:1404 +#: commands/copyfromparse.c:1428 commands/copyfromparse.c:1444 #, c-format msgid "end-of-copy marker corrupt" msgstr "COPY-Ende-Markierung verfälscht" -#: commands/copyfromparse.c:1706 commands/copyfromparse.c:1921 -#, fuzzy, c-format -#| msgid "unexpected EOF in COPY data" -msgid "unexpected DEFAULT in COPY data" -msgstr "unerwartetes EOF in COPY-Daten" +#: commands/copyfromparse.c:1746 commands/copyfromparse.c:1961 +#, c-format +msgid "unexpected default marker in COPY data" +msgstr "unerwartete Default-Markierung in COPY-Daten" -#: commands/copyfromparse.c:1707 commands/copyfromparse.c:1922 -#, fuzzy, c-format -#| msgid "column \"%s\" can only be updated to DEFAULT" -msgid "Column \"%s\" has no DEFAULT value." -msgstr "Spalte »%s« kann nur auf DEFAULT aktualisiert werden" +#: commands/copyfromparse.c:1747 commands/copyfromparse.c:1962 +#, c-format +msgid "Column \"%s\" has no default value." +msgstr "Spalte »%s« hat keinen Vorgabewert." -#: commands/copyfromparse.c:1854 +#: commands/copyfromparse.c:1894 #, c-format msgid "unterminated CSV quoted field" msgstr "Quotes in CSV-Feld nicht abgeschlossen" -#: commands/copyfromparse.c:1956 commands/copyfromparse.c:1975 +#: commands/copyfromparse.c:1996 commands/copyfromparse.c:2015 #, c-format msgid "unexpected EOF in COPY data" msgstr "unerwartetes EOF in COPY-Daten" -#: commands/copyfromparse.c:1965 +#: commands/copyfromparse.c:2005 #, c-format msgid "invalid field size" msgstr "ungültige Feldgröße" -#: commands/copyfromparse.c:1988 +#: commands/copyfromparse.c:2028 #, c-format msgid "incorrect binary data format" msgstr "falsches Binärdatenformat" -#: commands/copyto.c:236 +#: commands/copyto.c:229 #, c-format msgid "could not write to COPY program: %m" msgstr "konnte nicht zum COPY-Programm schreiben: %m" -#: commands/copyto.c:241 +#: commands/copyto.c:234 #, c-format msgid "could not write to COPY file: %m" msgstr "konnte nicht in COPY-Datei schreiben: %m" -#: commands/copyto.c:386 +#: commands/copyto.c:379 #, c-format msgid "cannot copy from view \"%s\"" msgstr "kann nicht aus Sicht »%s« kopieren" -#: commands/copyto.c:388 commands/copyto.c:394 commands/copyto.c:400 -#: commands/copyto.c:411 +#: commands/copyto.c:381 commands/copyto.c:387 commands/copyto.c:393 +#: commands/copyto.c:404 #, c-format msgid "Try the COPY (SELECT ...) TO variant." msgstr "Versuchen Sie die Variante COPY (SELECT ...) TO." -#: commands/copyto.c:392 +#: commands/copyto.c:385 #, c-format msgid "cannot copy from materialized view \"%s\"" msgstr "kann nicht aus materialisierter Sicht »%s« kopieren" -#: commands/copyto.c:398 +#: commands/copyto.c:391 #, c-format msgid "cannot copy from foreign table \"%s\"" msgstr "kann nicht aus Fremdtabelle »%s« kopieren" -#: commands/copyto.c:404 +#: commands/copyto.c:397 #, c-format msgid "cannot copy from sequence \"%s\"" msgstr "kann nicht aus Sequenz »%s« kopieren" -#: commands/copyto.c:409 +#: commands/copyto.c:402 #, c-format msgid "cannot copy from partitioned table \"%s\"" msgstr "kann nicht aus partitionierter Tabelle »%s« kopieren" -#: commands/copyto.c:415 +#: commands/copyto.c:408 #, c-format msgid "cannot copy from non-table relation \"%s\"" msgstr "kann nicht aus Relation »%s«, die keine Tabelle ist, kopieren" -#: commands/copyto.c:467 +#: commands/copyto.c:460 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for COPY" msgstr "DO-INSTEAD-NOTHING-Regeln werden für COPY nicht unterstützt" -#: commands/copyto.c:481 +#: commands/copyto.c:474 #, c-format msgid "conditional DO INSTEAD rules are not supported for COPY" msgstr "DO-INSTEAD-Regeln mit Bedingung werden für COPY nicht unterstützt" -#: commands/copyto.c:485 +#: commands/copyto.c:478 #, c-format -msgid "DO ALSO rules are not supported for the COPY" +msgid "DO ALSO rules are not supported for COPY" msgstr "DO-ALSO-Regeln werden für COPY nicht unterstützt" -#: commands/copyto.c:490 +#: commands/copyto.c:483 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for COPY" msgstr "DO-INSTEAD-Regeln mit mehreren Anweisungen werden für COPY nicht unterstützt" -#: commands/copyto.c:500 +#: commands/copyto.c:493 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO) wird nicht unterstützt" -#: commands/copyto.c:517 +#: commands/copyto.c:499 +#, c-format +msgid "COPY query must not be a utility command" +msgstr "COPY-Anfrage darf kein Utility-Befehl sein" + +#: commands/copyto.c:515 #, c-format msgid "COPY query must have a RETURNING clause" msgstr "COPY-Anfrage muss eine RETURNING-Klausel haben" -#: commands/copyto.c:546 +#: commands/copyto.c:544 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "die von der COPY-Anweisung verwendete Relation hat sich geändert" -#: commands/copyto.c:605 -#, c-format -msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" -msgstr "FORCE_QUOTE-Spalte »%s« wird von COPY nicht verwendet" - -#: commands/copyto.c:673 +#: commands/copyto.c:671 #, c-format msgid "relative path not allowed for COPY to file" msgstr "relativer Pfad bei COPY in Datei nicht erlaubt" -#: commands/copyto.c:692 +#: commands/copyto.c:690 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "konnte Datei »%s« nicht zum Schreiben öffnen: %m" -#: commands/copyto.c:695 +#: commands/copyto.c:693 #, c-format msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." msgstr "Mit COPY TO schreibt der PostgreSQL-Serverprozess eine Datei. Möglicherweise möchten Sie Funktionalität auf Client-Seite verwenden, wie zum Beispiel \\copy in psql." -#: commands/createas.c:215 commands/createas.c:523 +#: commands/createas.c:210 commands/createas.c:516 #, c-format msgid "too many column names were specified" msgstr "zu viele Spaltennamen wurden angegeben" -#: commands/createas.c:546 +#: commands/createas.c:539 #, c-format msgid "policies not yet implemented for this command" msgstr "Policys sind für diesen Befehl noch nicht implementiert" -#: commands/dbcommands.c:822 +#: commands/dbcommands.c:829 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION wird nicht mehr unterstützt" -#: commands/dbcommands.c:823 +#: commands/dbcommands.c:830 #, c-format msgid "Consider using tablespaces instead." msgstr "Verwenden Sie stattdessen Tablespaces." -#: commands/dbcommands.c:848 +#: commands/dbcommands.c:855 #, c-format msgid "OIDs less than %u are reserved for system objects" msgstr "OIDs kleiner als %u sind für Systemobjekte reserviert" -#: commands/dbcommands.c:879 utils/adt/ascii.c:146 +#: commands/dbcommands.c:886 utils/adt/ascii.c:146 #, c-format msgid "%d is not a valid encoding code" msgstr "%d ist kein gültiger Kodierungscode" -#: commands/dbcommands.c:890 utils/adt/ascii.c:128 +#: commands/dbcommands.c:897 utils/adt/ascii.c:128 #, c-format msgid "%s is not a valid encoding name" msgstr "%s ist kein gültiger Kodierungsname" -#: commands/dbcommands.c:919 +#: commands/dbcommands.c:931 #, c-format msgid "unrecognized locale provider: %s" msgstr "unbekannter Locale-Provider: %s" -#: commands/dbcommands.c:932 commands/dbcommands.c:2325 commands/user.c:300 -#: commands/user.c:740 +#: commands/dbcommands.c:944 commands/dbcommands.c:2414 commands/user.c:299 +#: commands/user.c:739 #, c-format msgid "invalid connection limit: %d" msgstr "ungültige Verbindungshöchstgrenze: %d" -#: commands/dbcommands.c:953 +#: commands/dbcommands.c:965 #, c-format msgid "permission denied to create database" msgstr "keine Berechtigung, um Datenbank zu erzeugen" -#: commands/dbcommands.c:977 +#: commands/dbcommands.c:989 #, c-format msgid "template database \"%s\" does not exist" msgstr "Template-Datenbank »%s« existiert nicht" -#: commands/dbcommands.c:989 +#: commands/dbcommands.c:999 +#, c-format +msgid "cannot use invalid database \"%s\" as template" +msgstr "ungültige Datenbank »%s« kann nicht als Template verwendet werden" + +#: commands/dbcommands.c:1000 commands/dbcommands.c:2444 +#: utils/init/postinit.c:1113 +#, c-format +msgid "Use DROP DATABASE to drop invalid databases." +msgstr "Verwenden Sie DROP DATABASE, um ungültige Datenbanken zu löschen." + +#: commands/dbcommands.c:1011 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "keine Berechtigung, um Datenbank »%s« zu kopieren" -#: commands/dbcommands.c:1006 +#: commands/dbcommands.c:1028 #, c-format msgid "invalid create database strategy \"%s\"" msgstr "ungültige Datenbankerzeugungsstrategie »%s«" -#: commands/dbcommands.c:1007 +#: commands/dbcommands.c:1029 #, c-format -msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgid "Valid strategies are \"wal_log\" and \"file_copy\"." msgstr "Gültige Strategien sind »wal_log« und »file_copy«." -#: commands/dbcommands.c:1033 +#: commands/dbcommands.c:1050 #, c-format msgid "invalid server encoding %d" msgstr "ungültige Serverkodierung %d" -#: commands/dbcommands.c:1039 +#: commands/dbcommands.c:1056 #, c-format msgid "invalid LC_COLLATE locale name: \"%s\"" msgstr "ungültiger LC_COLLATE-Locale-Name: »%s«" -#: commands/dbcommands.c:1040 commands/dbcommands.c:1046 +#: commands/dbcommands.c:1057 commands/dbcommands.c:1063 #, c-format msgid "If the locale name is specific to ICU, use ICU_LOCALE." msgstr "Wenn der Locale-Name nur für ICU gültig ist, verwenden Sie ICU_LOCALE." -#: commands/dbcommands.c:1045 +#: commands/dbcommands.c:1062 #, c-format msgid "invalid LC_CTYPE locale name: \"%s\"" msgstr "ungültiger LC_CTYPE-Locale-Name: »%s«" -#: commands/dbcommands.c:1056 +#: commands/dbcommands.c:1074 #, c-format -msgid "encoding \"%s\" is not supported with ICU provider" -msgstr "Kodierung »%s« wird vom ICU-Provider nicht unterstützt" +msgid "BUILTIN_LOCALE cannot be specified unless locale provider is builtin" +msgstr "BUILTIN_LOCALE kann nur angegeben werden, wenn der Locale-Provider »builtin« ist" -#: commands/dbcommands.c:1066 -#, fuzzy, c-format -#| msgid "ICU locale must be specified" -msgid "LOCALE or ICU_LOCALE must be specified" -msgstr "ICU-Locale muss angegeben werden" - -#: commands/dbcommands.c:1095 +#: commands/dbcommands.c:1082 #, c-format msgid "ICU locale cannot be specified unless locale provider is ICU" msgstr "ICU-Locale kann nur angegeben werden, wenn der Locale-Provider ICU ist" -#: commands/dbcommands.c:1118 +#: commands/dbcommands.c:1100 +#, c-format +msgid "LOCALE or BUILTIN_LOCALE must be specified" +msgstr "LOCALE oder BUILTIN_LOCALE muss angegeben werden" + +#: commands/dbcommands.c:1109 +#, c-format +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "Kodierung »%s« wird vom ICU-Provider nicht unterstützt" + +#: commands/dbcommands.c:1119 +#, c-format +msgid "LOCALE or ICU_LOCALE must be specified" +msgstr "LOCALE oder ICU_LOCALE muss angegeben werden" + +#: commands/dbcommands.c:1163 #, c-format msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" msgstr "neue Kodierung (%s) ist inkompatibel mit der Kodierung der Template-Datenbank (%s)" -#: commands/dbcommands.c:1121 +#: commands/dbcommands.c:1166 #, c-format msgid "Use the same encoding as in the template database, or use template0 as template." msgstr "Verwenden Sie die gleiche Kodierung wie die Template-Datenbank oder verwenden Sie template0 als Template." -#: commands/dbcommands.c:1126 +#: commands/dbcommands.c:1171 #, c-format msgid "new collation (%s) is incompatible with the collation of the template database (%s)" msgstr "neue Sortierreihenfolge (%s) ist inkompatibel mit der Sortierreihenfolge der Template-Datenbank (%s)" -#: commands/dbcommands.c:1128 +#: commands/dbcommands.c:1173 #, c-format msgid "Use the same collation as in the template database, or use template0 as template." msgstr "Verwenden Sie die gleiche Sortierreihenfolge wie die Template-Datenbank oder verwenden Sie template0 als Template." -#: commands/dbcommands.c:1133 +#: commands/dbcommands.c:1178 #, c-format msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" msgstr "neues LC_CTYPE (%s) ist inkompatibel mit dem LC_CTYPE der Template-Datenbank (%s)" -#: commands/dbcommands.c:1135 +#: commands/dbcommands.c:1180 #, c-format msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." msgstr "Verwenden Sie das gleiche LC_CTYPE wie die Template-Datenbank oder verwenden Sie template0 als Template." -#: commands/dbcommands.c:1140 +#: commands/dbcommands.c:1185 #, c-format msgid "new locale provider (%s) does not match locale provider of the template database (%s)" msgstr "neuer Locale-Provider (%s) stimmt nicht mit dem Locale-Provider der Template-Datenbank (%s) überein" -#: commands/dbcommands.c:1142 +#: commands/dbcommands.c:1187 #, c-format msgid "Use the same locale provider as in the template database, or use template0 as template." msgstr "Verwenden Sie den gleichen Locale-Provider wie die Template-Datenbank oder verwenden Sie template0 als Template." -#: commands/dbcommands.c:1154 +#: commands/dbcommands.c:1199 #, c-format msgid "new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)" msgstr "neue ICU-Locale (%s) ist inkompatibel mit der ICU-Locale der Template-Datenbank (%s)" -#: commands/dbcommands.c:1156 +#: commands/dbcommands.c:1201 #, c-format msgid "Use the same ICU locale as in the template database, or use template0 as template." msgstr "Verwenden Sie die gleiche ICU-Locale wie die Template-Datenbank oder verwenden Sie template0 als Template." -#: commands/dbcommands.c:1167 -#, fuzzy, c-format -#| msgid "new collation (%s) is incompatible with the collation of the template database (%s)" +#: commands/dbcommands.c:1212 +#, c-format msgid "new ICU collation rules (%s) are incompatible with the ICU collation rules of the template database (%s)" -msgstr "neue Sortierreihenfolge (%s) ist inkompatibel mit der Sortierreihenfolge der Template-Datenbank (%s)" +msgstr "die neuen ICU-Sortierfolgenregeln (%s) sind inkompatibel mit den ICU-Sortierfolgenregeln der Template-Datenbank (%s)" -#: commands/dbcommands.c:1169 -#, fuzzy, c-format -#| msgid "Use the same collation as in the template database, or use template0 as template." +#: commands/dbcommands.c:1214 +#, c-format msgid "Use the same ICU collation rules as in the template database, or use template0 as template." -msgstr "Verwenden Sie die gleiche Sortierreihenfolge wie die Template-Datenbank oder verwenden Sie template0 als Template." +msgstr "Verwenden Sie die gleichen ICU-Sortierfolgenregeln wie in der Template-Datenbank oder verwenden Sie template0 als Template." -#: commands/dbcommands.c:1192 +#: commands/dbcommands.c:1243 #, c-format msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" msgstr "Template-Datenbank »%s« hat eine Sortierfolgenversion, aber keine tatsächliche Sortierfolgenversion konnte ermittelt werden" -#: commands/dbcommands.c:1197 +#: commands/dbcommands.c:1248 #, c-format msgid "template database \"%s\" has a collation version mismatch" msgstr "Version von Sortierfolge für Template-Datenbank »%s« stimmt nicht überein" -#: commands/dbcommands.c:1199 +#: commands/dbcommands.c:1250 #, c-format msgid "The template database was created using collation version %s, but the operating system provides version %s." msgstr "Die Template-Datenbank wurde mit Sortierfolgenversion %s erzeugt, aber das Betriebssystem hat Version %s." -#: commands/dbcommands.c:1202 +#: commands/dbcommands.c:1253 #, c-format msgid "Rebuild all objects in the template database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." msgstr "Bauen Sie alle Objekte in der Template-Datenbank, die die Standardsortierfolge verwenden, neu und führen Sie ALTER DATABASE %s REFRESH COLLATION VERSION aus, oder bauen Sie PostgreSQL mit der richtigen Bibliotheksversion." -#: commands/dbcommands.c:1238 commands/dbcommands.c:1954 +#: commands/dbcommands.c:1298 commands/dbcommands.c:2041 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "pg_global kann nicht als Standard-Tablespace verwendet werden" -#: commands/dbcommands.c:1264 +#: commands/dbcommands.c:1324 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "kann neuen Standard-Tablespace »%s« nicht setzen" -#: commands/dbcommands.c:1266 +#: commands/dbcommands.c:1326 #, c-format msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." msgstr "Es gibt einen Konflikt, weil Datenbank »%s« schon einige Tabellen in diesem Tablespace hat." -#: commands/dbcommands.c:1296 commands/dbcommands.c:1827 +#: commands/dbcommands.c:1356 commands/dbcommands.c:1912 #, c-format msgid "database \"%s\" already exists" msgstr "Datenbank »%s« existiert bereits" -#: commands/dbcommands.c:1310 +#: commands/dbcommands.c:1370 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "auf Quelldatenbank »%s« wird gerade von anderen Benutzern zugegriffen" -#: commands/dbcommands.c:1332 +#: commands/dbcommands.c:1392 #, c-format msgid "database OID %u is already in use by database \"%s\"" msgstr "Datenbank-OID %u wird bereits von Datenbank »%s« verwendet" -#: commands/dbcommands.c:1338 +#: commands/dbcommands.c:1398 #, c-format msgid "data directory with the specified OID %u already exists" msgstr "Datenverzeichnis mit der angegebenen OID %u existiert bereits" -#: commands/dbcommands.c:1510 commands/dbcommands.c:1525 +#: commands/dbcommands.c:1571 commands/dbcommands.c:1586 +#: utils/adt/pg_locale.c:2588 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "Kodierung »%s« stimmt nicht mit Locale »%s« überein" -#: commands/dbcommands.c:1513 +#: commands/dbcommands.c:1574 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "Die gewählte LC_CTYPE-Einstellung verlangt die Kodierung »%s«." -#: commands/dbcommands.c:1528 +#: commands/dbcommands.c:1589 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "Die gewählte LC_COLLATE-Einstellung verlangt die Kodierung »%s«." -#: commands/dbcommands.c:1608 +#: commands/dbcommands.c:1672 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "Datenbank »%s« existiert nicht, wird übersprungen" -#: commands/dbcommands.c:1632 +#: commands/dbcommands.c:1696 #, c-format msgid "cannot drop a template database" msgstr "Template-Datenbank kann nicht gelöscht werden" -#: commands/dbcommands.c:1638 +#: commands/dbcommands.c:1702 #, c-format msgid "cannot drop the currently open database" msgstr "kann aktuell geöffnete Datenbank nicht löschen" -#: commands/dbcommands.c:1651 +#: commands/dbcommands.c:1715 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "Datenbank »%s« wird von einem aktiven logischen Replikations-Slot verwendet" -#: commands/dbcommands.c:1653 +#: commands/dbcommands.c:1717 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." msgstr[0] "%d Slot ist vorhanden." msgstr[1] "%d Slots sind vorhanden." -#: commands/dbcommands.c:1667 +#: commands/dbcommands.c:1731 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "Datenbank »%s« wird von einer Subskription für logische Replikation verwendet" -#: commands/dbcommands.c:1669 +#: commands/dbcommands.c:1733 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." msgstr[0] "%d Subskription ist vorhanden." msgstr[1] "%d Subskriptionen sind vorhanden." -#: commands/dbcommands.c:1690 commands/dbcommands.c:1849 -#: commands/dbcommands.c:1976 +#: commands/dbcommands.c:1754 commands/dbcommands.c:1934 +#: commands/dbcommands.c:2063 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "auf Datenbank »%s« wird von anderen Benutzern zugegriffen" -#: commands/dbcommands.c:1809 +#: commands/dbcommands.c:1894 #, c-format msgid "permission denied to rename database" msgstr "keine Berechtigung, um Datenbank umzubenennen" -#: commands/dbcommands.c:1838 +#: commands/dbcommands.c:1923 #, c-format msgid "current database cannot be renamed" msgstr "aktuelle Datenbank kann nicht umbenannt werden" -#: commands/dbcommands.c:1932 +#: commands/dbcommands.c:2019 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "kann den Tablespace der aktuell geöffneten Datenbank nicht ändern" -#: commands/dbcommands.c:2038 +#: commands/dbcommands.c:2125 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "einige Relationen von Datenbank »%s« ist bereits in Tablespace »%s«" -#: commands/dbcommands.c:2040 +#: commands/dbcommands.c:2127 #, c-format msgid "You must move them back to the database's default tablespace before using this command." msgstr "Sie müssen sie zurück in den Standard-Tablespace der Datenbank verschieben, bevor Sie diesen Befehl verwenden können." -#: commands/dbcommands.c:2167 commands/dbcommands.c:2875 -#: commands/dbcommands.c:3139 commands/dbcommands.c:3252 +#: commands/dbcommands.c:2256 commands/dbcommands.c:2999 +#: commands/dbcommands.c:3299 commands/dbcommands.c:3412 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "einige nutzlose Dateien wurde möglicherweise im alten Datenbankverzeichnis »%s« zurückgelassen" -#: commands/dbcommands.c:2228 +#: commands/dbcommands.c:2317 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "unbekannte DROP-DATABASE-Option »%s«" -#: commands/dbcommands.c:2306 +#: commands/dbcommands.c:2395 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "Option »%s« kann nicht mit anderen Optionen angegeben werden" -#: commands/dbcommands.c:2362 +#: commands/dbcommands.c:2443 +#, c-format +msgid "cannot alter invalid database \"%s\"" +msgstr "ungültige Datenbank »%s« kann nicht geändert werden" + +#: commands/dbcommands.c:2460 #, c-format msgid "cannot disallow connections for current database" msgstr "Verbindungen mit der aktuellen Datenbank können nicht verboten werden" -#: commands/dbcommands.c:2577 +#: commands/dbcommands.c:2690 #, c-format msgid "permission denied to change owner of database" msgstr "keine Berechtigung, um Eigentümer der Datenbank zu ändern" -#: commands/dbcommands.c:2981 +#: commands/dbcommands.c:3105 #, c-format msgid "There are %d other session(s) and %d prepared transaction(s) using the database." msgstr "%d andere Sitzung(en) und %d vorbereitete Transaktion(en) verwenden die Datenbank." -#: commands/dbcommands.c:2984 +#: commands/dbcommands.c:3108 #, c-format msgid "There is %d other session using the database." msgid_plural "There are %d other sessions using the database." msgstr[0] "%d andere Sitzung verwendet die Datenbank." msgstr[1] "%d andere Sitzungen verwenden die Datenbank." -#: commands/dbcommands.c:2989 storage/ipc/procarray.c:3798 +#: commands/dbcommands.c:3113 storage/ipc/procarray.c:3859 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." msgstr[0] "%d vorbereitete Transaktion verwendet die Datenbank." msgstr[1] "%d vorbereitete Transaktionen verwenden die Datenbank." -#: commands/dbcommands.c:3095 +#: commands/dbcommands.c:3255 #, c-format msgid "missing directory \"%s\"" msgstr "Verzeichnis »%s« fehlt" -#: commands/dbcommands.c:3153 commands/tablespace.c:190 -#: commands/tablespace.c:639 +#: commands/dbcommands.c:3313 commands/tablespace.c:184 +#: commands/tablespace.c:633 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "konnte »stat« für Verzeichnis »%s« nicht ausführen: %m" -#: commands/define.c:54 commands/define.c:258 commands/define.c:290 -#: commands/define.c:318 commands/define.c:364 +#: commands/define.c:53 commands/define.c:257 commands/define.c:289 +#: commands/define.c:317 commands/define.c:363 #, c-format msgid "%s requires a parameter" msgstr "%s erfordert einen Parameter" -#: commands/define.c:87 commands/define.c:98 commands/define.c:192 -#: commands/define.c:210 commands/define.c:225 commands/define.c:243 +#: commands/define.c:86 commands/define.c:97 commands/define.c:191 +#: commands/define.c:209 commands/define.c:224 commands/define.c:242 #, c-format msgid "%s requires a numeric value" msgstr "%s erfordert einen numerischen Wert" -#: commands/define.c:154 +#: commands/define.c:153 #, c-format msgid "%s requires a Boolean value" msgstr "%s erfordert einen Boole’schen Wert" -#: commands/define.c:168 commands/define.c:177 commands/define.c:327 +#: commands/define.c:167 commands/define.c:176 commands/define.c:326 #, c-format msgid "%s requires an integer value" msgstr "%s erfordert einen ganzzahligen Wert" -#: commands/define.c:272 +#: commands/define.c:271 #, c-format msgid "argument of %s must be a name" msgstr "Argument von %s muss ein Name sein" -#: commands/define.c:302 +#: commands/define.c:301 #, c-format msgid "argument of %s must be a type name" msgstr "Argument von %s muss ein Typname sein" -#: commands/define.c:348 +#: commands/define.c:347 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "ungültiges Argument für %s: »%s«" -#: commands/dropcmds.c:101 commands/functioncmds.c:1387 -#: utils/adt/ruleutils.c:2897 +#: commands/dropcmds.c:96 commands/functioncmds.c:1382 +#: utils/adt/ruleutils.c:2910 #, c-format msgid "\"%s\" is an aggregate function" msgstr "»%s« ist eine Aggregatfunktion" -#: commands/dropcmds.c:103 +#: commands/dropcmds.c:98 #, c-format msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "Verwenden Sie DROP AGGREGATE, um Aggregatfunktionen zu löschen." -#: commands/dropcmds.c:158 commands/sequence.c:474 commands/tablecmds.c:3710 -#: commands/tablecmds.c:3868 commands/tablecmds.c:3920 -#: commands/tablecmds.c:16468 tcop/utility.c:1335 +#: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:3892 +#: commands/tablecmds.c:4050 commands/tablecmds.c:4102 +#: commands/tablecmds.c:17215 tcop/utility.c:1325 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "Relation »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1285 +#: commands/dropcmds.c:183 commands/dropcmds.c:282 commands/tablecmds.c:1409 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "Schema »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:277 +#: commands/dropcmds.c:223 commands/dropcmds.c:262 commands/tablecmds.c:286 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "Typ »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:257 +#: commands/dropcmds.c:252 #, c-format msgid "access method \"%s\" does not exist, skipping" msgstr "Zugriffsmethode »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:275 +#: commands/dropcmds.c:270 #, c-format msgid "collation \"%s\" does not exist, skipping" msgstr "Sortierfolge »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:282 +#: commands/dropcmds.c:277 #, c-format msgid "conversion \"%s\" does not exist, skipping" msgstr "Konversion »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:293 commands/statscmds.c:654 +#: commands/dropcmds.c:288 commands/statscmds.c:664 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "Statistikobjekt »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:300 +#: commands/dropcmds.c:295 #, c-format msgid "text search parser \"%s\" does not exist, skipping" msgstr "Textsucheparser »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:307 +#: commands/dropcmds.c:302 #, c-format msgid "text search dictionary \"%s\" does not exist, skipping" msgstr "Textsuchewörterbuch »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:314 +#: commands/dropcmds.c:309 #, c-format msgid "text search template \"%s\" does not exist, skipping" msgstr "Textsuchevorlage »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:321 +#: commands/dropcmds.c:316 #, c-format msgid "text search configuration \"%s\" does not exist, skipping" msgstr "Textsuchekonfiguration »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:326 +#: commands/dropcmds.c:321 #, c-format msgid "extension \"%s\" does not exist, skipping" msgstr "Erweiterung »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:336 +#: commands/dropcmds.c:331 #, c-format msgid "function %s(%s) does not exist, skipping" msgstr "Funktion %s(%s) existiert nicht, wird übersprungen" -#: commands/dropcmds.c:349 +#: commands/dropcmds.c:344 #, c-format msgid "procedure %s(%s) does not exist, skipping" msgstr "Prozedur %s(%s) existiert nicht, wird übersprungen" -#: commands/dropcmds.c:362 +#: commands/dropcmds.c:357 #, c-format msgid "routine %s(%s) does not exist, skipping" msgstr "Routine %s(%s) existiert nicht, wird übersprungen" -#: commands/dropcmds.c:375 +#: commands/dropcmds.c:370 #, c-format msgid "aggregate %s(%s) does not exist, skipping" msgstr "Aggregatfunktion %s(%s) existiert nicht, wird übersprungen" -#: commands/dropcmds.c:388 +#: commands/dropcmds.c:383 #, c-format msgid "operator %s does not exist, skipping" msgstr "Operator %s existiert nicht, wird übersprungen" -#: commands/dropcmds.c:394 +#: commands/dropcmds.c:389 #, c-format msgid "language \"%s\" does not exist, skipping" msgstr "Sprache »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:403 +#: commands/dropcmds.c:398 #, c-format msgid "cast from type %s to type %s does not exist, skipping" msgstr "Typumwandlung von Typ %s in Typ %s existiert nicht, wird übersprungen" -#: commands/dropcmds.c:412 +#: commands/dropcmds.c:407 #, c-format msgid "transform for type %s language \"%s\" does not exist, skipping" msgstr "Transformation für Typ %s Sprache »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:420 +#: commands/dropcmds.c:415 #, c-format msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" msgstr "Trigger »%s« für Relation »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:429 +#: commands/dropcmds.c:424 #, c-format msgid "policy \"%s\" for relation \"%s\" does not exist, skipping" msgstr "Policy »%s« für Relation »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:436 +#: commands/dropcmds.c:431 #, c-format msgid "event trigger \"%s\" does not exist, skipping" msgstr "Ereignistrigger »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:442 +#: commands/dropcmds.c:437 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist, skipping" msgstr "Regel »%s« für Relation »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:449 +#: commands/dropcmds.c:444 #, c-format msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "Fremddaten-Wrapper »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 +#: commands/dropcmds.c:448 commands/foreigncmds.c:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "Server »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:462 +#: commands/dropcmds.c:457 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\", skipping" msgstr "Operatorklasse »%s« existiert nicht für Zugriffsmethode »%s«, wird übersprungen" -#: commands/dropcmds.c:474 +#: commands/dropcmds.c:469 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\", skipping" msgstr "Operatorfamilie »%s« existiert nicht für Zugriffsmethode »%s«, wird übersprungen" -#: commands/dropcmds.c:481 +#: commands/dropcmds.c:476 #, c-format msgid "publication \"%s\" does not exist, skipping" msgstr "Publikation »%s« existiert nicht, wird übersprungen" -#: commands/event_trigger.c:125 +#: commands/event_trigger.c:137 #, c-format msgid "permission denied to create event trigger \"%s\"" msgstr "keine Berechtigung, um Ereignistrigger »%s« zu erzeugen" -#: commands/event_trigger.c:127 +#: commands/event_trigger.c:139 #, c-format msgid "Must be superuser to create an event trigger." msgstr "Nur Superuser können Ereignistrigger anlegen." -#: commands/event_trigger.c:136 +#: commands/event_trigger.c:149 #, c-format msgid "unrecognized event name \"%s\"" msgstr "unbekannter Ereignisname »%s«" -#: commands/event_trigger.c:153 +#: commands/event_trigger.c:166 #, c-format msgid "unrecognized filter variable \"%s\"" msgstr "unbekannte Filtervariable »%s«" -#: commands/event_trigger.c:207 +#: commands/event_trigger.c:181 +#, c-format +msgid "tag filtering is not supported for login event triggers" +msgstr "Tag-Filtern wird für Login-Ereignistrigger nicht unterstützt" + +#: commands/event_trigger.c:224 #, c-format msgid "filter value \"%s\" not recognized for filter variable \"%s\"" msgstr "Filterwert »%s« nicht erkannt für Filtervariable »%s«" #. translator: %s represents an SQL statement name -#: commands/event_trigger.c:213 commands/event_trigger.c:235 +#: commands/event_trigger.c:230 commands/event_trigger.c:252 #, c-format msgid "event triggers are not supported for %s" msgstr "Ereignistrigger für %s werden nicht unterstützt" -#: commands/event_trigger.c:248 +#: commands/event_trigger.c:265 #, c-format msgid "filter variable \"%s\" specified more than once" msgstr "Filtervariable »%s« mehrmals angegeben" -#: commands/event_trigger.c:376 commands/event_trigger.c:420 -#: commands/event_trigger.c:514 +#: commands/event_trigger.c:438 commands/event_trigger.c:490 +#: commands/event_trigger.c:584 #, c-format msgid "event trigger \"%s\" does not exist" msgstr "Ereignistrigger »%s« existiert nicht" -#: commands/event_trigger.c:452 +#: commands/event_trigger.c:522 #, c-format msgid "event trigger with OID %u does not exist" msgstr "Ereignistrigger mit OID %u existiert nicht" -#: commands/event_trigger.c:482 +#: commands/event_trigger.c:552 #, c-format msgid "permission denied to change owner of event trigger \"%s\"" msgstr "keine Berechtigung, um Eigentümer des Ereignistriggers »%s« zu ändern" -#: commands/event_trigger.c:484 +#: commands/event_trigger.c:554 #, c-format msgid "The owner of an event trigger must be a superuser." msgstr "Der Eigentümer eines Ereignistriggers muss ein Superuser sein." -#: commands/event_trigger.c:1304 +#: commands/event_trigger.c:1409 #, c-format msgid "%s can only be called in a sql_drop event trigger function" msgstr "%s kann nur in einer sql_drop-Ereignistriggerfunktion aufgerufen werden" -#: commands/event_trigger.c:1397 commands/event_trigger.c:1418 +#: commands/event_trigger.c:1502 commands/event_trigger.c:1523 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" msgstr "%s kann nur in einer table_rewrite-Ereignistriggerfunktion aufgerufen werden" -#: commands/event_trigger.c:1831 +#: commands/event_trigger.c:1936 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s kann nur in einer Ereignistriggerfunktion aufgerufen werden" -#: commands/explain.c:220 +#: commands/explain.c:241 commands/explain.c:266 #, c-format msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" msgstr "unbekannter Wert für EXPLAIN-Option »%s«: »%s«" -#: commands/explain.c:227 +#: commands/explain.c:273 #, c-format msgid "unrecognized EXPLAIN option \"%s\"" msgstr "unbekannte EXPLAIN-Option »%s«" -#: commands/explain.c:236 +#: commands/explain.c:282 #, c-format msgid "EXPLAIN option WAL requires ANALYZE" msgstr "EXPLAIN-Option WAL erfordert ANALYZE" -#: commands/explain.c:245 +#: commands/explain.c:291 #, c-format msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "EXPLAIN-Option TIMING erfordert ANALYZE" -#: commands/explain.c:251 +#: commands/explain.c:297 +#, c-format +msgid "EXPLAIN option SERIALIZE requires ANALYZE" +msgstr "EXPLAIN-Option SERIALIZE erfordert ANALYZE" + +#: commands/explain.c:303 #, c-format msgid "EXPLAIN options ANALYZE and GENERIC_PLAN cannot be used together" msgstr "EXPLAIN-Optionen ANALYZE und GENERIC_PLAN können nicht zusammen verwendet werden" -#: commands/extension.c:177 commands/extension.c:3009 +#: commands/extension.c:178 commands/extension.c:3031 #, c-format msgid "extension \"%s\" does not exist" msgstr "Erweiterung »%s« existiert nicht" -#: commands/extension.c:276 commands/extension.c:285 commands/extension.c:297 -#: commands/extension.c:307 +#: commands/extension.c:277 commands/extension.c:286 commands/extension.c:298 +#: commands/extension.c:308 #, c-format msgid "invalid extension name: \"%s\"" msgstr "ungültiger Erweiterungsname: »%s«" -#: commands/extension.c:277 +#: commands/extension.c:278 #, c-format msgid "Extension names must not be empty." msgstr "Erweiterungsnamen dürfen nicht leer sein." -#: commands/extension.c:286 +#: commands/extension.c:287 #, c-format msgid "Extension names must not contain \"--\"." msgstr "Erweiterungsnamen dürfen nicht »--« enthalten." -#: commands/extension.c:298 +#: commands/extension.c:299 #, c-format msgid "Extension names must not begin or end with \"-\"." msgstr "Erweiterungsnamen dürfen nicht mit »-« anfangen oder aufhören." -#: commands/extension.c:308 +#: commands/extension.c:309 #, c-format msgid "Extension names must not contain directory separator characters." msgstr "Erweiterungsnamen dürfen keine Verzeichnistrennzeichen enthalten." -#: commands/extension.c:323 commands/extension.c:332 commands/extension.c:341 -#: commands/extension.c:351 +#: commands/extension.c:324 commands/extension.c:333 commands/extension.c:342 +#: commands/extension.c:352 #, c-format msgid "invalid extension version name: \"%s\"" msgstr "ungültiger Erweiterungsversionsname: »%s«" -#: commands/extension.c:324 +#: commands/extension.c:325 #, c-format msgid "Version names must not be empty." msgstr "Versionsnamen dürfen nicht leer sein." -#: commands/extension.c:333 +#: commands/extension.c:334 #, c-format msgid "Version names must not contain \"--\"." msgstr "Versionsnamen dürfen nicht »--« enthalten." -#: commands/extension.c:342 +#: commands/extension.c:343 #, c-format msgid "Version names must not begin or end with \"-\"." msgstr "Versionsnamen dürfen nicht mit »-« anfangen oder aufhören." -#: commands/extension.c:352 +#: commands/extension.c:353 #, c-format msgid "Version names must not contain directory separator characters." msgstr "Versionsnamen dürfen keine Verzeichnistrennzeichen enthalten." -#: commands/extension.c:506 +#: commands/extension.c:507 #, c-format msgid "extension \"%s\" is not available" msgstr "Erweiterung »%s« ist nicht verfügbar" -#: commands/extension.c:507 +#: commands/extension.c:508 #, c-format msgid "Could not open extension control file \"%s\": %m." msgstr "Konnte Erweiterungskontrolldatei »%s« nicht öffnen: %m." -#: commands/extension.c:509 +#: commands/extension.c:510 #, c-format msgid "The extension must first be installed on the system where PostgreSQL is running." msgstr "Die Erweiterung muss zuerst auf dem System, auf dem PostgreSQL läuft, installiert werden." -#: commands/extension.c:513 +#: commands/extension.c:514 #, c-format msgid "could not open extension control file \"%s\": %m" msgstr "konnte Erweiterungskontrolldatei »%s« nicht öffnen: %m" -#: commands/extension.c:536 commands/extension.c:546 +#: commands/extension.c:537 commands/extension.c:547 #, c-format msgid "parameter \"%s\" cannot be set in a secondary extension control file" msgstr "Parameter »%s« kann nicht in einer sekundären Erweitungskontrolldatei gesetzt werden" -#: commands/extension.c:568 commands/extension.c:576 commands/extension.c:584 -#: utils/misc/guc.c:3098 +#: commands/extension.c:569 commands/extension.c:577 commands/extension.c:585 +#: utils/misc/guc.c:3147 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "Parameter »%s« erfordert einen Boole’schen Wert" -#: commands/extension.c:593 +#: commands/extension.c:594 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "»%s« ist kein gültiger Kodierungsname" -#: commands/extension.c:607 commands/extension.c:622 +#: commands/extension.c:608 commands/extension.c:623 #, c-format msgid "parameter \"%s\" must be a list of extension names" msgstr "Parameter »%s« muss eine Liste von Erweiterungsnamen sein" -#: commands/extension.c:629 +#: commands/extension.c:630 #, c-format msgid "unrecognized parameter \"%s\" in file \"%s\"" msgstr "unbekannter Parameter »%s« in Datei »%s«" -#: commands/extension.c:638 +#: commands/extension.c:639 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "Parameter »schema« kann nicht angegeben werden, wenn »relocatable« an ist" -#: commands/extension.c:816 +#: commands/extension.c:817 #, c-format msgid "transaction control statements are not allowed within an extension script" msgstr "Transaktionskontrollanweisungen sind nicht in einem Erweiterungsskript erlaubt" -#: commands/extension.c:896 +#: commands/extension.c:897 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "keine Berechtigung, um Erweiterung »%s« zu erzeugen" -#: commands/extension.c:899 +#: commands/extension.c:900 #, c-format msgid "Must have CREATE privilege on current database to create this extension." msgstr "CREATE-Privileg für die aktuelle Datenbank wird benötigt, um diese Erweiterung anzulegen." -#: commands/extension.c:900 +#: commands/extension.c:901 #, c-format msgid "Must be superuser to create this extension." msgstr "Nur Superuser können diese Erweiterung anlegen." -#: commands/extension.c:904 +#: commands/extension.c:905 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "keine Berechtigung, um Erweiterung »%s« zu aktualisieren" -#: commands/extension.c:907 +#: commands/extension.c:908 #, c-format msgid "Must have CREATE privilege on current database to update this extension." msgstr "CREATE-Privileg für die aktuelle Datenbank wird benötigt, um diese Erweiterung zu aktualisieren." -#: commands/extension.c:908 +#: commands/extension.c:909 #, c-format msgid "Must be superuser to update this extension." msgstr "Nur Superuser können diese Erweiterung aktualisieren." -#: commands/extension.c:1265 +#: commands/extension.c:1042 +#, c-format +msgid "invalid character in extension owner: must not contain any of \"%s\"" +msgstr "ungültiges Zeichen im Erweiterungseigentümer: darf keins aus »%s« enthalten" + +#: commands/extension.c:1066 commands/extension.c:1093 +#, c-format +msgid "invalid character in extension \"%s\" schema: must not contain any of \"%s\"" +msgstr "ungültiges Zeichen in Schema von Erweiterung »%s«: darf keins aus »%s« enthalten" + +#: commands/extension.c:1288 #, c-format msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgstr "Erweiterung »%s« hat keinen Aktualisierungspfad von Version »%s« auf Version »%s«" -#: commands/extension.c:1473 commands/extension.c:3067 +#: commands/extension.c:1496 commands/extension.c:3089 #, c-format msgid "version to install must be specified" msgstr "die zu installierende Version muss angegeben werden" -#: commands/extension.c:1510 +#: commands/extension.c:1533 #, c-format msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" msgstr "Erweiterung »%s« hat kein Installationsskript und keinen Aktualisierungspfad für Version »%s«" -#: commands/extension.c:1544 +#: commands/extension.c:1567 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "Erweiterung »%s« muss in Schema »%s« installiert werden" -#: commands/extension.c:1704 +#: commands/extension.c:1727 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "zyklische Abhängigkeit zwischen Erweiterungen »%s« und »%s« entdeckt" -#: commands/extension.c:1709 +#: commands/extension.c:1732 #, c-format msgid "installing required extension \"%s\"" msgstr "installiere benötigte Erweiterung »%s«" -#: commands/extension.c:1732 +#: commands/extension.c:1755 #, c-format msgid "required extension \"%s\" is not installed" msgstr "benötigte Erweiterung »%s« ist nicht installiert" -#: commands/extension.c:1735 +#: commands/extension.c:1758 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "Verwenden Sie CREATE EXTENSION ... CASCADE, um die benötigten Erweiterungen ebenfalls zu installieren." -#: commands/extension.c:1770 +#: commands/extension.c:1793 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "Erweiterung »%s« existiert bereits, wird übersprungen" -#: commands/extension.c:1777 +#: commands/extension.c:1800 #, c-format msgid "extension \"%s\" already exists" msgstr "Erweiterung »%s« existiert bereits" -#: commands/extension.c:1788 +#: commands/extension.c:1811 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "geschachteltes CREATE EXTENSION wird nicht unterstützt" -#: commands/extension.c:1952 +#: commands/extension.c:1975 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "Erweiterung »%s« kann nicht gelöscht werden, weil sie gerade geändert wird" -#: commands/extension.c:2427 +#: commands/extension.c:2450 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "%s kann nur von einem SQL-Skript aufgerufen werden, das von CREATE EXTENSION ausgeführt wird" -#: commands/extension.c:2439 +#: commands/extension.c:2462 #, c-format msgid "OID %u does not refer to a table" msgstr "OID %u bezieht sich nicht auf eine Tabelle" -#: commands/extension.c:2444 +#: commands/extension.c:2467 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "Tabelle »%s« ist kein Mitglied der anzulegenden Erweiterung" -#: commands/extension.c:2790 +#: commands/extension.c:2813 #, c-format msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" msgstr "kann Erweiterung »%s« nicht in Schema »%s« verschieben, weil die Erweiterung das Schema enthält" -#: commands/extension.c:2831 commands/extension.c:2928 +#: commands/extension.c:2854 commands/extension.c:2948 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "Erweiterung »%s« unterstützt SET SCHEMA nicht" -#: commands/extension.c:2885 -#, fuzzy, c-format -#| msgid "cannot drop extension \"%s\" because it is being modified" +#: commands/extension.c:2911 +#, c-format msgid "cannot SET SCHEMA of extension \"%s\" because other extensions prevent it" -msgstr "Erweiterung »%s« kann nicht gelöscht werden, weil sie gerade geändert wird" +msgstr "SET SCHEMA für Erweiterung »%s« ist nicht möglich, weil andere Erweiterungen es verhindern" -#: commands/extension.c:2887 -#, fuzzy, c-format -#| msgid "relation \"%s\" is not a partition of relation \"%s\"" +#: commands/extension.c:2913 +#, c-format msgid "Extension \"%s\" requests no relocation of extension \"%s\"." -msgstr "Relation »%s« ist keine Partition von Relation »%s«" +msgstr "Erweiterung »%s« verhindert Verlagerung von Erweiterung »%s«." -#: commands/extension.c:2930 +#: commands/extension.c:2950 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "%s ist nicht im Schema der Erweiterung (»%s«)" -#: commands/extension.c:2989 +#: commands/extension.c:3011 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "geschachteltes ALTER EXTENSION wird nicht unterstützt" -#: commands/extension.c:3078 +#: commands/extension.c:3100 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "Version »%s« von Erweiterung »%s« ist bereits installiert" -#: commands/extension.c:3290 +#: commands/extension.c:3311 #, c-format msgid "cannot add an object of this type to an extension" msgstr "ein Objekt dieses Typs kann nicht zu einer Erweiterung hinzugefügt werden" -#: commands/extension.c:3356 +#: commands/extension.c:3409 #, c-format msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "kann Schema »%s« nicht zu Erweiterung »%s« hinzufügen, weil das Schema die Erweiterung enthält" -#: commands/extension.c:3450 +#: commands/extension.c:3491 commands/typecmds.c:4042 utils/fmgr/funcapi.c:725 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "konnte Multirange-Typ für Datentyp %s nicht finden" + +#: commands/extension.c:3532 #, c-format msgid "file \"%s\" is too large" msgstr "Datei »%s« ist zu groß" @@ -8175,7 +8557,7 @@ msgstr "Nur Superuser können den Eigentümer eines Fremddaten-Wrappers ändern. msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "Der Eigentümer eines Fremddaten-Wrappers muss ein Superuser sein." -#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:678 +#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:691 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "Fremddaten-Wrapper »%s« existiert nicht" @@ -8245,7 +8627,7 @@ msgstr "Benutzerabbildung für »%s« existiert nicht für Server »%s«" msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "Benutzerabbildung für »%s« existiert nicht für Server »%s«, wird übersprungen" -#: commands/foreigncmds.c:1507 foreign/foreign.c:391 +#: commands/foreigncmds.c:1507 foreign/foreign.c:404 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "Fremddaten-Wrapper »%s« hat keinen Handler" @@ -8260,523 +8642,528 @@ msgstr "Fremddaten-Wrapper »%s« unterstützt IMPORT FOREIGN SCHEMA nicht" msgid "importing foreign table \"%s\"" msgstr "importiere Fremdtabelle »%s«" -#: commands/functioncmds.c:109 +#: commands/functioncmds.c:104 #, c-format msgid "SQL function cannot return shell type %s" msgstr "SQL-Funktion kann keinen Hüllen-Rückgabetyp %s haben" -#: commands/functioncmds.c:114 +#: commands/functioncmds.c:109 #, c-format msgid "return type %s is only a shell" msgstr "Rückgabetyp %s ist nur eine Hülle" -#: commands/functioncmds.c:143 parser/parse_type.c:354 +#: commands/functioncmds.c:138 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "Typmodifikator kann für Hüllentyp »%s« nicht angegeben werden" -#: commands/functioncmds.c:149 +#: commands/functioncmds.c:144 #, c-format msgid "type \"%s\" is not yet defined" msgstr "Typ »%s« ist noch nicht definiert" -#: commands/functioncmds.c:150 +#: commands/functioncmds.c:145 #, c-format msgid "Creating a shell type definition." msgstr "Hüllentypdefinition wird erzeugt." -#: commands/functioncmds.c:249 +#: commands/functioncmds.c:244 #, c-format msgid "SQL function cannot accept shell type %s" msgstr "SQL-Funktion kann keinen Hüllentyp %s annehmen" -#: commands/functioncmds.c:255 +#: commands/functioncmds.c:250 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "Aggregatfunktion kann keinen Hüllentyp %s annehmen" -#: commands/functioncmds.c:260 +#: commands/functioncmds.c:255 #, c-format msgid "argument type %s is only a shell" msgstr "Argumenttyp %s ist nur eine Hülle" -#: commands/functioncmds.c:270 +#: commands/functioncmds.c:265 #, c-format msgid "type %s does not exist" msgstr "Typ %s existiert nicht" -#: commands/functioncmds.c:284 +#: commands/functioncmds.c:279 #, c-format msgid "aggregates cannot accept set arguments" msgstr "Aggregatfunktionen können keine SETOF-Argumente haben" -#: commands/functioncmds.c:288 +#: commands/functioncmds.c:283 #, c-format msgid "procedures cannot accept set arguments" msgstr "Prozeduren können keine SETOF-Argumente haben" -#: commands/functioncmds.c:292 +#: commands/functioncmds.c:287 #, c-format msgid "functions cannot accept set arguments" msgstr "Funktionen können keine SETOF-Argumente haben" -#: commands/functioncmds.c:302 +#: commands/functioncmds.c:297 #, c-format msgid "VARIADIC parameter must be the last input parameter" msgstr "VARIADIC-Parameter muss der letzte Eingabeparameter sein" -#: commands/functioncmds.c:322 +#: commands/functioncmds.c:317 #, c-format msgid "VARIADIC parameter must be the last parameter" msgstr "VARIADIC-Parameter muss der letzte Parameter sein" -#: commands/functioncmds.c:347 +#: commands/functioncmds.c:342 #, c-format msgid "VARIADIC parameter must be an array" msgstr "VARIADIC-Parameter muss ein Array sein" -#: commands/functioncmds.c:392 +#: commands/functioncmds.c:387 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "Parametername »%s« mehrmals angegeben" -#: commands/functioncmds.c:410 +#: commands/functioncmds.c:405 #, c-format msgid "only input parameters can have default values" msgstr "nur Eingabeparameter können Vorgabewerte haben" -#: commands/functioncmds.c:425 +#: commands/functioncmds.c:420 #, c-format msgid "cannot use table references in parameter default value" msgstr "Tabellenverweise können nicht in Parametervorgabewerten verwendet werden" -#: commands/functioncmds.c:449 +#: commands/functioncmds.c:444 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "Eingabeparameter hinter einem mit Vorgabewert müssen auch einen Vorgabewert haben" -#: commands/functioncmds.c:459 +#: commands/functioncmds.c:454 #, c-format msgid "procedure OUT parameters cannot appear after one with a default value" msgstr "Prozedur-OUT-Parameter können nicht nach einem Parameter mit Vorgabewert stehen" -#: commands/functioncmds.c:601 commands/functioncmds.c:780 +#: commands/functioncmds.c:596 commands/functioncmds.c:775 #, c-format msgid "invalid attribute in procedure definition" msgstr "ungültiges Attribut in Prozedurdefinition" -#: commands/functioncmds.c:697 +#: commands/functioncmds.c:692 #, c-format msgid "support function %s must return type %s" msgstr "Unterstützungsfunktion %s muss Rückgabetyp %s haben" -#: commands/functioncmds.c:708 +#: commands/functioncmds.c:703 #, c-format msgid "must be superuser to specify a support function" msgstr "nur Superuser können eine Support-Funktion angeben" -#: commands/functioncmds.c:829 commands/functioncmds.c:1432 +#: commands/functioncmds.c:824 commands/functioncmds.c:1427 #, c-format msgid "COST must be positive" msgstr "COST muss positiv sein" -#: commands/functioncmds.c:837 commands/functioncmds.c:1440 +#: commands/functioncmds.c:832 commands/functioncmds.c:1435 #, c-format msgid "ROWS must be positive" msgstr "ROWS muss positiv sein" -#: commands/functioncmds.c:866 +#: commands/functioncmds.c:861 #, c-format msgid "no function body specified" msgstr "kein Funktionskörper angegeben" -#: commands/functioncmds.c:871 +#: commands/functioncmds.c:866 #, c-format msgid "duplicate function body specified" msgstr "doppelter Funktionskörper angegeben" -#: commands/functioncmds.c:876 +#: commands/functioncmds.c:871 #, c-format msgid "inline SQL function body only valid for language SQL" msgstr "Inline-SQL-Funktionskörper ist nur gültig für Sprache SQL" -#: commands/functioncmds.c:918 +#: commands/functioncmds.c:913 #, c-format msgid "SQL function with unquoted function body cannot have polymorphic arguments" msgstr "SQL-Funktion mit Funktionsrumpf nicht in Anführungszeichen kann keine polymorphen Argumente haben" -#: commands/functioncmds.c:944 commands/functioncmds.c:963 +#: commands/functioncmds.c:939 commands/functioncmds.c:958 #, c-format msgid "%s is not yet supported in unquoted SQL function body" msgstr "%s ist in SQL-Funktionen nicht in Anführungszeichen noch nicht erlaubt" -#: commands/functioncmds.c:991 +#: commands/functioncmds.c:986 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "nur ein AS-Element benötigt für Sprache »%s«" -#: commands/functioncmds.c:1096 +#: commands/functioncmds.c:1091 #, c-format msgid "no language specified" msgstr "keine Sprache angegeben" -#: commands/functioncmds.c:1104 commands/functioncmds.c:2105 -#: commands/proclang.c:237 +#: commands/functioncmds.c:1099 commands/functioncmds.c:2117 +#: commands/proclang.c:235 #, c-format msgid "language \"%s\" does not exist" msgstr "Sprache »%s« existiert nicht" -#: commands/functioncmds.c:1106 commands/functioncmds.c:2107 +#: commands/functioncmds.c:1101 commands/functioncmds.c:2119 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "Verwenden Sie CREATE EXTENSION, um die Sprache in die Datenbank zu laden." -#: commands/functioncmds.c:1139 commands/functioncmds.c:1424 +#: commands/functioncmds.c:1134 commands/functioncmds.c:1419 #, c-format msgid "only superuser can define a leakproof function" msgstr "nur Superuser können eine »leakproof«-Funktion definieren" -#: commands/functioncmds.c:1190 +#: commands/functioncmds.c:1185 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "Ergebnistyp der Funktion muss %s sein wegen OUT-Parametern" -#: commands/functioncmds.c:1203 +#: commands/functioncmds.c:1198 #, c-format msgid "function result type must be specified" msgstr "Ergebnistyp der Funktion muss angegeben werden" -#: commands/functioncmds.c:1256 commands/functioncmds.c:1444 +#: commands/functioncmds.c:1251 commands/functioncmds.c:1439 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "ROWS ist nicht anwendbar, wenn die Funktion keine Ergebnismenge zurückgibt" -#: commands/functioncmds.c:1547 +#: commands/functioncmds.c:1546 #, c-format msgid "source data type %s is a pseudo-type" msgstr "Quelldatentyp %s ist ein Pseudotyp" -#: commands/functioncmds.c:1553 +#: commands/functioncmds.c:1552 #, c-format msgid "target data type %s is a pseudo-type" msgstr "Zieldatentyp %s ist ein Pseudotyp" -#: commands/functioncmds.c:1577 +#: commands/functioncmds.c:1576 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "Typumwandlung wird ignoriert werden, weil der Quelldatentyp eine Domäne ist" -#: commands/functioncmds.c:1582 +#: commands/functioncmds.c:1581 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "Typumwandlung wird ignoriert werden, weil der Zieldatentyp eine Domäne ist" -#: commands/functioncmds.c:1607 +#: commands/functioncmds.c:1606 #, c-format msgid "cast function must take one to three arguments" msgstr "Typumwandlungsfunktion muss ein bis drei Argumente haben" -#: commands/functioncmds.c:1613 +#: commands/functioncmds.c:1612 #, c-format msgid "argument of cast function must match or be binary-coercible from source data type" msgstr "Argument der Typumwandlungsfunktion muss mit Quelldatentyp übereinstimmen oder in ihn binär-umwandelbar sein" -#: commands/functioncmds.c:1617 +#: commands/functioncmds.c:1616 #, c-format msgid "second argument of cast function must be type %s" msgstr "zweites Argument der Typumwandlungsfunktion muss Typ %s haben" -#: commands/functioncmds.c:1622 +#: commands/functioncmds.c:1621 #, c-format msgid "third argument of cast function must be type %s" msgstr "drittes Argument der Typumwandlungsfunktion muss Typ %s haben" -#: commands/functioncmds.c:1629 +#: commands/functioncmds.c:1628 #, c-format msgid "return data type of cast function must match or be binary-coercible to target data type" msgstr "Rückgabetyp der Typumwandlungsfunktion muss mit Zieldatentyp übereinstimmen oder in ihn binär-umwandelbar sein" -#: commands/functioncmds.c:1640 +#: commands/functioncmds.c:1639 #, c-format msgid "cast function must not be volatile" msgstr "Typumwandlungsfunktion darf nicht VOLATILE sein" -#: commands/functioncmds.c:1645 +#: commands/functioncmds.c:1644 #, c-format msgid "cast function must be a normal function" msgstr "Typumwandlungsfunktion muss eine normale Funktion sein" -#: commands/functioncmds.c:1649 +#: commands/functioncmds.c:1648 #, c-format msgid "cast function must not return a set" msgstr "Typumwandlungsfunktion darf keine Ergebnismenge zurückgeben" -#: commands/functioncmds.c:1675 +#: commands/functioncmds.c:1674 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "nur Superuser können Typumwandlungen mit WITHOUT FUNCTION erzeugen" -#: commands/functioncmds.c:1690 +#: commands/functioncmds.c:1689 #, c-format msgid "source and target data types are not physically compatible" msgstr "Quelldatentyp und Zieldatentyp sind nicht physikalisch kompatibel" -#: commands/functioncmds.c:1705 +#: commands/functioncmds.c:1709 #, c-format msgid "composite data types are not binary-compatible" msgstr "zusammengesetzte Datentypen sind nicht binärkompatibel" -#: commands/functioncmds.c:1711 -#, c-format -msgid "enum data types are not binary-compatible" -msgstr "Enum-Datentypen sind nicht binärkompatibel" - -#: commands/functioncmds.c:1717 +#: commands/functioncmds.c:1715 #, c-format msgid "array data types are not binary-compatible" msgstr "Array-Datentypen sind nicht binärkompatibel" -#: commands/functioncmds.c:1734 +#: commands/functioncmds.c:1723 +#, c-format +msgid "range data types are not binary-compatible" +msgstr "Range-Datentypen sind nicht binärkompatibel" + +#: commands/functioncmds.c:1729 +#, c-format +msgid "enum data types are not binary-compatible" +msgstr "Enum-Datentypen sind nicht binärkompatibel" + +#: commands/functioncmds.c:1746 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "Domänendatentypen dürfen nicht als binärkompatibel markiert werden" -#: commands/functioncmds.c:1744 +#: commands/functioncmds.c:1756 #, c-format msgid "source data type and target data type are the same" msgstr "Quelldatentyp und Zieldatentyp sind der selbe" -#: commands/functioncmds.c:1777 +#: commands/functioncmds.c:1789 #, c-format msgid "transform function must not be volatile" msgstr "Transformationsfunktion darf nicht VOLATILE sein" -#: commands/functioncmds.c:1781 +#: commands/functioncmds.c:1793 #, c-format msgid "transform function must be a normal function" msgstr "Transformationsfunktion muss eine normale Funktion sein" -#: commands/functioncmds.c:1785 +#: commands/functioncmds.c:1797 #, c-format msgid "transform function must not return a set" msgstr "Transformationsfunktion darf keine Ergebnismenge zurückgeben" -#: commands/functioncmds.c:1789 +#: commands/functioncmds.c:1801 #, c-format msgid "transform function must take one argument" msgstr "Transformationsfunktion muss ein Argument haben" -#: commands/functioncmds.c:1793 +#: commands/functioncmds.c:1805 #, c-format msgid "first argument of transform function must be type %s" msgstr "erstes Argument der Transformationsfunktion muss Typ %s haben" -#: commands/functioncmds.c:1832 +#: commands/functioncmds.c:1844 #, c-format msgid "data type %s is a pseudo-type" msgstr "Datentyp %s ist ein Pseudotyp" -#: commands/functioncmds.c:1838 +#: commands/functioncmds.c:1850 #, c-format msgid "data type %s is a domain" msgstr "Datentyp %s ist eine Domäne" -#: commands/functioncmds.c:1878 +#: commands/functioncmds.c:1890 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "Rückgabetyp der FROM-SQL-Funktion muss %s sein" -#: commands/functioncmds.c:1904 +#: commands/functioncmds.c:1916 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "Rückgabetyp der TO-SQL-Funktion muss der zu transformierende Datentyp sein" -#: commands/functioncmds.c:1931 +#: commands/functioncmds.c:1943 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "Transformation für Typ %s Sprache »%s« existiert bereits" -#: commands/functioncmds.c:2017 +#: commands/functioncmds.c:2029 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "Transformation für Typ %s Sprache »%s« existiert nicht" -#: commands/functioncmds.c:2041 +#: commands/functioncmds.c:2053 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "Funktion %s existiert bereits in Schema »%s«" -#: commands/functioncmds.c:2092 +#: commands/functioncmds.c:2104 #, c-format msgid "no inline code specified" msgstr "kein Inline-Code angegeben" -#: commands/functioncmds.c:2138 +#: commands/functioncmds.c:2150 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "Sprache »%s« unterstützt das Ausführen von Inline-Code nicht" -#: commands/functioncmds.c:2233 +#: commands/functioncmds.c:2245 #, c-format msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" msgstr[0] "kann nicht mehr als %d Argument an eine Prozedur übergeben" msgstr[1] "kann nicht mehr als %d Argumente an eine Prozedur übergeben" -#: commands/indexcmds.c:641 +#: commands/indexcmds.c:656 #, c-format msgid "must specify at least one column" msgstr "mindestens eine Spalte muss angegeben werden" -#: commands/indexcmds.c:645 +#: commands/indexcmds.c:660 #, c-format msgid "cannot use more than %d columns in an index" msgstr "Index kann nicht mehr als %d Spalten enthalten" -#: commands/indexcmds.c:688 +#: commands/indexcmds.c:703 #, c-format msgid "cannot create index on relation \"%s\"" msgstr "kann keinen Index für Relation »%s« erzeugen" -#: commands/indexcmds.c:714 +#: commands/indexcmds.c:729 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "kann Index für partitionierte Tabelle »%s« nicht nebenläufig erzeugen" -#: commands/indexcmds.c:719 -#, c-format -msgid "cannot create exclusion constraints on partitioned table \"%s\"" -msgstr "kann keinen Exclusion-Constraint für partitionierte Tabelle »%s« erzeugen" - -#: commands/indexcmds.c:729 +#: commands/indexcmds.c:739 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "kann keine Indexe für temporäre Tabellen anderer Sitzungen erzeugen" -#: commands/indexcmds.c:767 commands/tablecmds.c:784 commands/tablespace.c:1184 +#: commands/indexcmds.c:777 commands/tablecmds.c:818 commands/tablespace.c:1178 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "für partitionierte Relationen kann kein Standard-Tablespace angegeben werden" -#: commands/indexcmds.c:799 commands/tablecmds.c:819 commands/tablecmds.c:3409 +#: commands/indexcmds.c:809 commands/tablecmds.c:849 commands/tablecmds.c:3588 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "nur geteilte Relationen können in den Tablespace »pg_global« gelegt werden" -#: commands/indexcmds.c:832 +#: commands/indexcmds.c:842 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "ersetze Zugriffsmethode »gist« für obsolete Methode »rtree«" -#: commands/indexcmds.c:853 +#: commands/indexcmds.c:863 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "Zugriffsmethode »%s« unterstützt keine Unique Indexe" -#: commands/indexcmds.c:858 +#: commands/indexcmds.c:868 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "Zugriffsmethode »%s« unterstützt keine eingeschlossenen Spalten" -#: commands/indexcmds.c:863 +#: commands/indexcmds.c:873 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "Zugriffsmethode »%s« unterstützt keine mehrspaltigen Indexe" -#: commands/indexcmds.c:868 +#: commands/indexcmds.c:878 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "Zugriffsmethode »%s« unterstützt keine Exclusion-Constraints" -#: commands/indexcmds.c:995 +#: commands/indexcmds.c:1007 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "Partitionierungsschlüssel kann nicht mit Zugriffsmethode »%s« mit einem Index gepaart werden" -#: commands/indexcmds.c:1005 +#: commands/indexcmds.c:1017 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "nicht unterstützter %s-Constraint mit Partitionierungsschlüsseldefinition" -#: commands/indexcmds.c:1007 +#: commands/indexcmds.c:1019 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "%s-Constraints können nicht verwendet werden, wenn Partitionierungsschlüssel Ausdrücke enthalten." -#: commands/indexcmds.c:1046 +#: commands/indexcmds.c:1069 +#, c-format +msgid "cannot match partition key to index on column \"%s\" using non-equal operator \"%s\"" +msgstr "Partitionierungsschlüssel kann nicht mit Nicht-Ist-Gleich-Operator »%s« mit Index für Spalte »%s« gepaart werden" + +#: commands/indexcmds.c:1085 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "Unique-Constraint für partitionierte Tabelle muss alle Partitionierungsspalten enthalten" -#: commands/indexcmds.c:1047 +#: commands/indexcmds.c:1086 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "Im %s-Constraint in Tabelle »%s« fehlt Spalte »%s«, welche Teil des Partitionierungsschlüssels ist." -#: commands/indexcmds.c:1066 commands/indexcmds.c:1085 +#: commands/indexcmds.c:1105 commands/indexcmds.c:1124 #, c-format msgid "index creation on system columns is not supported" msgstr "Indexerzeugung für Systemspalten wird nicht unterstützt" -#: commands/indexcmds.c:1314 tcop/utility.c:1525 +#: commands/indexcmds.c:1354 tcop/utility.c:1515 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "kann keinen Unique Index für partitionierte Tabelle »%s« erzeugen" -#: commands/indexcmds.c:1316 tcop/utility.c:1527 +#: commands/indexcmds.c:1356 tcop/utility.c:1517 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "Tabelle »%s« enthält Partitionen, die Fremdtabellen sind." -#: commands/indexcmds.c:1811 +#: commands/indexcmds.c:1806 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "Funktionen im Indexprädikat müssen als IMMUTABLE markiert sein" -#: commands/indexcmds.c:1889 parser/parse_utilcmd.c:2513 -#: parser/parse_utilcmd.c:2648 +#: commands/indexcmds.c:1885 parser/parse_utilcmd.c:2519 +#: parser/parse_utilcmd.c:2654 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "Spalte »%s«, die im Schlüssel verwendet wird, existiert nicht" -#: commands/indexcmds.c:1913 parser/parse_utilcmd.c:1812 +#: commands/indexcmds.c:1909 parser/parse_utilcmd.c:1807 #, c-format msgid "expressions are not supported in included columns" msgstr "in eingeschlossenen Spalten werden keine Ausdrücke unterstützt" -#: commands/indexcmds.c:1954 +#: commands/indexcmds.c:1950 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "Funktionen im Indexausdruck müssen als IMMUTABLE markiert sein" -#: commands/indexcmds.c:1969 +#: commands/indexcmds.c:1965 #, c-format msgid "including column does not support a collation" msgstr "inkludierte Spalte unterstützt keine Sortierfolge" -#: commands/indexcmds.c:1973 +#: commands/indexcmds.c:1969 #, c-format msgid "including column does not support an operator class" msgstr "inkludierte Spalte unterstützt keine Operatorklasse" -#: commands/indexcmds.c:1977 +#: commands/indexcmds.c:1973 #, c-format msgid "including column does not support ASC/DESC options" msgstr "inkludierte Spalte unterstützt die Optionen ASC/DESC nicht" -#: commands/indexcmds.c:1981 +#: commands/indexcmds.c:1977 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "inkludierte Spalte unterstützt die Optionen NULLS FIRST/LAST nicht" -#: commands/indexcmds.c:2022 +#: commands/indexcmds.c:2020 #, c-format msgid "could not determine which collation to use for index expression" msgstr "konnte die für den Indexausdruck zu verwendende Sortierfolge nicht bestimmen" -#: commands/indexcmds.c:2030 commands/tablecmds.c:17471 commands/typecmds.c:807 -#: parser/parse_expr.c:2722 parser/parse_type.c:568 parser/parse_utilcmd.c:3774 -#: utils/adt/misc.c:586 +#: commands/indexcmds.c:2028 commands/tablecmds.c:18239 commands/typecmds.c:811 +#: parser/parse_expr.c:2793 parser/parse_type.c:568 parser/parse_utilcmd.c:3771 +#: utils/adt/misc.c:630 #, c-format msgid "collations are not supported by type %s" msgstr "Sortierfolgen werden von Typ %s nicht unterstützt" @@ -8811,34 +9198,34 @@ msgstr "Zugriffsmethode »%s« unterstützt die Optionen ASC/DESC nicht" msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "Zugriffsmethode »%s« unterstützt die Optionen NULLS FIRST/LAST nicht" -#: commands/indexcmds.c:2212 commands/tablecmds.c:17496 -#: commands/tablecmds.c:17502 commands/typecmds.c:2301 +#: commands/indexcmds.c:2210 commands/tablecmds.c:18264 +#: commands/tablecmds.c:18270 commands/typecmds.c:2311 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "Datentyp %s hat keine Standardoperatorklasse für Zugriffsmethode »%s«" -#: commands/indexcmds.c:2214 +#: commands/indexcmds.c:2212 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." msgstr "Sie müssen für den Index eine Operatorklasse angeben oder eine Standardoperatorklasse für den Datentyp definieren." -#: commands/indexcmds.c:2243 commands/indexcmds.c:2251 +#: commands/indexcmds.c:2241 commands/indexcmds.c:2249 #: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "Operatorklasse »%s« existiert nicht für Zugriffsmethode »%s«" -#: commands/indexcmds.c:2265 commands/typecmds.c:2289 +#: commands/indexcmds.c:2263 commands/typecmds.c:2299 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "Operatorklasse »%s« akzeptiert Datentyp %s nicht" -#: commands/indexcmds.c:2355 +#: commands/indexcmds.c:2353 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "es gibt mehrere Standardoperatorklassen für Datentyp %s" -#: commands/indexcmds.c:2683 +#: commands/indexcmds.c:2681 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "unbekannte REINDEX-Option »%s«" @@ -8853,103 +9240,108 @@ msgstr "Tabelle »%s« hat keine Indexe, die nebenläufig reindiziert werden kö msgid "table \"%s\" has no indexes to reindex" msgstr "Tabelle »%s« hat keine zu reindizierenden Indexe" -#: commands/indexcmds.c:2972 commands/indexcmds.c:3481 -#: commands/indexcmds.c:3609 +#: commands/indexcmds.c:2974 commands/indexcmds.c:3485 +#: commands/indexcmds.c:3615 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "Systemkataloge können nicht nebenläufig reindiziert werden" -#: commands/indexcmds.c:2996 +#: commands/indexcmds.c:2998 #, c-format msgid "can only reindex the currently open database" msgstr "nur die aktuell geöffnete Datenbank kann reindiziert werden" -#: commands/indexcmds.c:3088 +#: commands/indexcmds.c:3090 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "Systemkataloge können nicht nebenläufig reindiziert werden, werden alle übersprungen" -#: commands/indexcmds.c:3121 +#: commands/indexcmds.c:3123 #, c-format msgid "cannot move system relations, skipping all" msgstr "Systemrelationen können nicht verschoben werden, werden alle übersprungen" -#: commands/indexcmds.c:3167 +#: commands/indexcmds.c:3169 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "beim Reindizieren der partitionierten Tabelle »%s.%s«" -#: commands/indexcmds.c:3170 +#: commands/indexcmds.c:3172 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "beim Reindizieren des partitionierten Index »%s.%s«" -#: commands/indexcmds.c:3361 commands/indexcmds.c:4217 +#: commands/indexcmds.c:3365 commands/indexcmds.c:4241 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "Tabelle »%s.%s« wurde neu indiziert" -#: commands/indexcmds.c:3513 commands/indexcmds.c:3565 +#: commands/indexcmds.c:3517 commands/indexcmds.c:3570 +#, c-format +msgid "skipping reindex of invalid index \"%s.%s\"" +msgstr "Reindizieren des ungültigen Index »%s.%s« wird übersprungen" + +#: commands/indexcmds.c:3520 commands/indexcmds.c:3573 #, c-format -msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" -msgstr "ungültiger Index »%s.%s« kann nicht nebenläufig reindizert werden, wird übersprungen" +msgid "Use DROP INDEX or REINDEX INDEX." +msgstr "Verwenden Sie DROP INDEX oder REINDEX INDEX." -#: commands/indexcmds.c:3519 +#: commands/indexcmds.c:3524 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "Exclusion-Constraint-Index »%s.%s« kann nicht nebenläufig reindizert werden, wird übersprungen" -#: commands/indexcmds.c:3674 +#: commands/indexcmds.c:3680 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "diese Art Relation kann nicht nebenläufig reindiziert werden" -#: commands/indexcmds.c:3695 +#: commands/indexcmds.c:3698 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "nicht geteilte Relation kann nicht nach Tablespace »%s« verschoben werden" -#: commands/indexcmds.c:4198 commands/indexcmds.c:4210 +#: commands/indexcmds.c:4222 commands/indexcmds.c:4234 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "Index »%s.%s« wurde neu indiziert" -#: commands/indexcmds.c:4200 commands/indexcmds.c:4219 +#: commands/indexcmds.c:4224 commands/indexcmds.c:4243 #, c-format msgid "%s." msgstr "%s." -#: commands/lockcmds.c:92 +#: commands/lockcmds.c:91 #, c-format msgid "cannot lock relation \"%s\"" msgstr "kann Relation »%s« nicht sperren" -#: commands/matview.c:194 +#: commands/matview.c:206 #, c-format msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "CONCURRENTLY kann nicht verwendet werden, wenn die materialisierte Sicht nicht befüllt ist" -#: commands/matview.c:200 gram.y:18307 +#: commands/matview.c:212 gram.y:18918 #, c-format msgid "%s and %s options cannot be used together" msgstr "Optionen %s und %s können nicht zusammen verwendet werden" -#: commands/matview.c:257 +#: commands/matview.c:269 #, c-format msgid "cannot refresh materialized view \"%s\" concurrently" msgstr "kann materialisierte Sicht »%s« nicht nebenläufig auffrischen" -#: commands/matview.c:260 +#: commands/matview.c:272 #, c-format msgid "Create a unique index with no WHERE clause on one or more columns of the materialized view." msgstr "Erzeugen Sie einen Unique Index ohne WHERE-Klausel für eine oder mehrere Spalten der materialisierten Sicht." -#: commands/matview.c:654 +#: commands/matview.c:666 #, c-format msgid "new data for materialized view \"%s\" contains duplicate rows without any null columns" msgstr "neue Daten für materialisierte Sicht »%s« enthalten doppelte Zeilen ohne Spalten mit NULL-Werten" -#: commands/matview.c:656 +#: commands/matview.c:668 #, c-format msgid "Row: %s" msgstr "Zeile: %s" @@ -9151,27 +9543,27 @@ msgstr "Operatornummer %d für (%s,%s) einscheint mehrmals" msgid "operator %d(%s,%s) already exists in operator family \"%s\"" msgstr "Operator %d(%s,%s) existiert bereits in Operatorfamilie »%s«" -#: commands/opclasscmds.c:1566 +#: commands/opclasscmds.c:1589 #, c-format msgid "function %d(%s,%s) already exists in operator family \"%s\"" msgstr "Funktion %d(%s,%s) existiert bereits in Operatorfamilie »%s«" -#: commands/opclasscmds.c:1647 +#: commands/opclasscmds.c:1744 #, c-format msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" msgstr "Operator %d(%s,%s) existiert nicht in Operatorfamilie »%s«" -#: commands/opclasscmds.c:1687 +#: commands/opclasscmds.c:1784 #, c-format msgid "function %d(%s,%s) does not exist in operator family \"%s\"" msgstr "Funktion %d(%s,%s) existiert nicht in Operatorfamilie »%s«" -#: commands/opclasscmds.c:1718 +#: commands/opclasscmds.c:1815 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "Operatorklasse »%s« für Zugriffsmethode »%s« existiert bereits in Schema »%s«" -#: commands/opclasscmds.c:1741 +#: commands/opclasscmds.c:1838 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "Operatorfamilie »%s« für Zugriffsmethode »%s« existiert bereits in Schema »%s«" @@ -9181,7 +9573,7 @@ msgstr "Operatorfamilie »%s« für Zugriffsmethode »%s« existiert bereits in msgid "SETOF type not allowed for operator argument" msgstr "SETOF-Typ nicht als Operatorargument erlaubt" -#: commands/operatorcmds.c:154 commands/operatorcmds.c:481 +#: commands/operatorcmds.c:154 commands/operatorcmds.c:554 #, c-format msgid "operator attribute \"%s\" not recognized" msgstr "Operator-Attribut »%s« unbekannt" @@ -9221,53 +9613,70 @@ msgstr "Join-Schätzfunktion %s hat mehrere Übereinstimmungen" msgid "join estimator function %s must return type %s" msgstr "Join-Schätzfunktion %s muss Typ %s zurückgeben" -#: commands/operatorcmds.c:475 +#: commands/operatorcmds.c:388 parser/parse_oper.c:119 parser/parse_oper.c:637 +#: utils/adt/regproc.c:509 utils/adt/regproc.c:683 #, c-format -msgid "operator attribute \"%s\" cannot be changed" +msgid "operator does not exist: %s" +msgstr "Operator existiert nicht: %s" + +#: commands/operatorcmds.c:396 parser/parse_oper.c:702 parser/parse_oper.c:815 +#, c-format +msgid "operator is only a shell: %s" +msgstr "Operator ist nur eine Hülle: %s" + +#: commands/operatorcmds.c:548 +#, c-format +msgid "operator attribute \"%s\" cannot be changed" msgstr "Operator-Attribut »%s« kann nicht geändert werden" -#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 -#: commands/tablecmds.c:1616 commands/tablecmds.c:2219 -#: commands/tablecmds.c:3520 commands/tablecmds.c:6369 -#: commands/tablecmds.c:9181 commands/tablecmds.c:17064 -#: commands/tablecmds.c:17099 commands/trigger.c:323 commands/trigger.c:1339 -#: commands/trigger.c:1449 rewrite/rewriteDefine.c:275 -#: rewrite/rewriteDefine.c:786 rewrite/rewriteRemove.c:80 +#: commands/operatorcmds.c:615 commands/operatorcmds.c:622 +#: commands/operatorcmds.c:628 commands/operatorcmds.c:634 +#, c-format +msgid "operator attribute \"%s\" cannot be changed if it has already been set" +msgstr "Operator-Attribut »%s« kann nicht geändert werden, wenn es schon gesetzt wurde" + +#: commands/policy.c:86 commands/policy.c:379 commands/statscmds.c:146 +#: commands/tablecmds.c:1740 commands/tablecmds.c:2340 +#: commands/tablecmds.c:3702 commands/tablecmds.c:6605 +#: commands/tablecmds.c:9670 commands/tablecmds.c:17826 +#: commands/tablecmds.c:17861 commands/trigger.c:316 commands/trigger.c:1332 +#: commands/trigger.c:1442 rewrite/rewriteDefine.c:268 +#: rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "keine Berechtigung: »%s« ist ein Systemkatalog" -#: commands/policy.c:172 +#: commands/policy.c:169 #, c-format msgid "ignoring specified roles other than PUBLIC" msgstr "angegebene Rollen außer PUBLIC werden ignoriert" -#: commands/policy.c:173 +#: commands/policy.c:170 #, c-format msgid "All roles are members of the PUBLIC role." msgstr "Alle Rollen sind Mitglieder der Rolle PUBLIC." -#: commands/policy.c:606 +#: commands/policy.c:603 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "WITH CHECK kann nicht auf SELECT oder DELETE angewendet werden" -#: commands/policy.c:615 commands/policy.c:918 +#: commands/policy.c:612 commands/policy.c:915 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "für INSERT sind nur WITH-CHECK-Ausdrücke erlaubt" -#: commands/policy.c:689 commands/policy.c:1141 +#: commands/policy.c:686 commands/policy.c:1138 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "Policy »%s« für Tabelle »%s« existiert bereits" -#: commands/policy.c:890 commands/policy.c:1169 commands/policy.c:1240 +#: commands/policy.c:887 commands/policy.c:1166 commands/policy.c:1237 #, c-format msgid "policy \"%s\" for table \"%s\" does not exist" msgstr "Policy »%s« für Tabelle »%s« existiert nicht" -#: commands/policy.c:908 +#: commands/policy.c:905 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "für SELECT und DELETE sind nur USING-Ausdrücke erlaubt" @@ -9283,245 +9692,244 @@ msgid "cannot create a cursor WITH HOLD within security-restricted operation" msgstr "kann WITH-HOLD-Cursor nicht in einer sicherheitsbeschränkten Operation erzeugen" #: commands/portalcmds.c:189 commands/portalcmds.c:242 -#: executor/execCurrent.c:70 utils/adt/xml.c:2844 utils/adt/xml.c:3014 +#: executor/execCurrent.c:70 utils/adt/xml.c:2936 utils/adt/xml.c:3106 #, c-format msgid "cursor \"%s\" does not exist" msgstr "Cursor »%s« existiert nicht" -#: commands/prepare.c:75 +#: commands/prepare.c:72 #, c-format msgid "invalid statement name: must not be empty" msgstr "ungültiger Anweisungsname: darf nicht leer sein" -#: commands/prepare.c:230 commands/prepare.c:235 +#: commands/prepare.c:227 commands/prepare.c:232 #, c-format msgid "prepared statement is not a SELECT" msgstr "vorbereitete Anweisung ist kein SELECT" -#: commands/prepare.c:295 +#: commands/prepare.c:292 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "falsche Anzahl Parameter für vorbereitete Anweisung »%s«" -#: commands/prepare.c:297 +#: commands/prepare.c:294 #, c-format msgid "Expected %d parameters but got %d." msgstr "%d Parameter erwartet aber %d erhalten." -#: commands/prepare.c:330 +#: commands/prepare.c:327 #, c-format msgid "parameter $%d of type %s cannot be coerced to the expected type %s" msgstr "Parameter $%d mit Typ %s kann nicht in erwarteten Typ %s umgewandelt werden" -#: commands/prepare.c:414 +#: commands/prepare.c:411 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "vorbereitete Anweisung »%s« existiert bereits" -#: commands/prepare.c:453 +#: commands/prepare.c:450 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "vorbereitete Anweisung »%s« existiert nicht" -#: commands/proclang.c:68 +#: commands/proclang.c:66 #, c-format msgid "must be superuser to create custom procedural language" msgstr "nur Superuser können maßgeschneiderte prozedurale Sprachen erzeugen" -#: commands/publicationcmds.c:131 postmaster/postmaster.c:1205 -#: postmaster/postmaster.c:1303 storage/file/fd.c:3911 -#: utils/init/miscinit.c:1815 +#: commands/publicationcmds.c:124 postmaster/postmaster.c:1108 +#: postmaster/postmaster.c:1210 utils/init/miscinit.c:1865 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "ungültige Listensyntax für Parameter »%s«" -#: commands/publicationcmds.c:150 +#: commands/publicationcmds.c:143 #, c-format msgid "unrecognized value for publication option \"%s\": \"%s\"" msgstr "unbekannter Wert für Publikationsoption »%s«: »%s«" -#: commands/publicationcmds.c:164 +#: commands/publicationcmds.c:157 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "unbekannter Publikationsparameter: »%s«" -#: commands/publicationcmds.c:205 +#: commands/publicationcmds.c:198 #, c-format msgid "no schema has been selected for CURRENT_SCHEMA" msgstr "kein Schema für CURRENT_SCHEMA ausgewählt" -#: commands/publicationcmds.c:502 +#: commands/publicationcmds.c:495 msgid "System columns are not allowed." msgstr "Systemspalten sind nicht erlaubt." -#: commands/publicationcmds.c:509 commands/publicationcmds.c:514 -#: commands/publicationcmds.c:531 +#: commands/publicationcmds.c:502 commands/publicationcmds.c:507 +#: commands/publicationcmds.c:524 msgid "User-defined operators are not allowed." msgstr "Benutzerdefinierte Operatoren sind nicht erlaubt." -#: commands/publicationcmds.c:555 +#: commands/publicationcmds.c:548 msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." msgstr "Nur Spalten, Konstanten, eingebaute Operatoren, eingebaute Datentypen, eingebaute Sortierfolgen und eingebaute Funktionen, die »immutable« sind, sind erlaubt." -#: commands/publicationcmds.c:567 +#: commands/publicationcmds.c:560 msgid "User-defined types are not allowed." msgstr "Benutzerdefinierte Typen sind nicht erlaubt." -#: commands/publicationcmds.c:570 +#: commands/publicationcmds.c:563 msgid "User-defined or built-in mutable functions are not allowed." msgstr "Benutzerdefinierte Funktionen oder eingebaute Funktionen, die nicht »immutable« sind, sind nicht erlaubt." -#: commands/publicationcmds.c:573 +#: commands/publicationcmds.c:566 msgid "User-defined collations are not allowed." msgstr "Benutzerdefinierte Sortierfolgen sind nicht erlaubt." -#: commands/publicationcmds.c:583 +#: commands/publicationcmds.c:576 #, c-format msgid "invalid publication WHERE expression" msgstr "ungültiger WHERE-Ausdruck für Publikation" -#: commands/publicationcmds.c:636 +#: commands/publicationcmds.c:629 #, c-format msgid "cannot use publication WHERE clause for relation \"%s\"" msgstr "Publikations-WHERE-Ausdruck kann nicht für Relation »%s« verwendet werden" -#: commands/publicationcmds.c:638 +#: commands/publicationcmds.c:631 #, c-format msgid "WHERE clause cannot be used for a partitioned table when %s is false." msgstr "WHERE-Klausel kann nicht für eine partitionierte Tabelle verwendet werden, wenn %s falsch ist." -#: commands/publicationcmds.c:709 commands/publicationcmds.c:723 +#: commands/publicationcmds.c:702 commands/publicationcmds.c:716 #, c-format msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" msgstr "für Relation »%s.%s« in Publikation »%s« kann keine Spaltenliste verwendet werden" -#: commands/publicationcmds.c:712 +#: commands/publicationcmds.c:705 #, c-format msgid "Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements." msgstr "Spaltenlisten können nicht in Publikationen, die FOR-TABLES-IN-SCHEMA-Elemente enthalten, angegeben werden." -#: commands/publicationcmds.c:726 +#: commands/publicationcmds.c:719 #, c-format msgid "Column lists cannot be specified for partitioned tables when %s is false." msgstr "Spaltenlisten können nicht für partitionierte Tabellen angegeben werden, wenn %s falsch ist." -#: commands/publicationcmds.c:761 +#: commands/publicationcmds.c:754 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "nur Superuser können eine Publikation FOR ALL TABLES erzeugen" -#: commands/publicationcmds.c:832 +#: commands/publicationcmds.c:825 #, c-format msgid "must be superuser to create FOR TABLES IN SCHEMA publication" msgstr "nur Superuser können eine Publikation FOR TABLES IN SCHEMA erzeugen" -#: commands/publicationcmds.c:868 +#: commands/publicationcmds.c:861 #, c-format -msgid "wal_level is insufficient to publish logical changes" -msgstr "wal_level ist nicht ausreichend, um logische Veränderungen zu publizieren" +msgid "\"wal_level\" is insufficient to publish logical changes" +msgstr "»wal_level« ist nicht ausreichend, um logische Veränderungen zu publizieren" -#: commands/publicationcmds.c:869 +#: commands/publicationcmds.c:862 #, c-format -msgid "Set wal_level to \"logical\" before creating subscriptions." -msgstr "Setzen Sie wal_level auf »logical« bevor Sie Subskriptionen erzeugen." +msgid "Set \"wal_level\" to \"logical\" before creating subscriptions." +msgstr "Setzen Sie »wal_level« auf »logical« bevor Sie Subskriptionen erzeugen." -#: commands/publicationcmds.c:965 commands/publicationcmds.c:973 +#: commands/publicationcmds.c:958 commands/publicationcmds.c:966 #, c-format msgid "cannot set parameter \"%s\" to false for publication \"%s\"" msgstr "Parameter »%s« kann für Publikation »%s« nicht auf falsch gesetzt werden" -#: commands/publicationcmds.c:968 +#: commands/publicationcmds.c:961 #, c-format msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." msgstr "Die Publikation enthält eine WHERE-Klausel für die partitionierte Tabelle »%s«, was nicht erlaubt ist, wenn »%s« falsch ist." -#: commands/publicationcmds.c:976 +#: commands/publicationcmds.c:969 #, c-format msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." msgstr "Die Publikation enthält eine Spaltenliste für die partitionierte Tabelle »%s«, was nicht erlaubt ist, wenn »%s« falsch ist." -#: commands/publicationcmds.c:1299 +#: commands/publicationcmds.c:1292 #, c-format msgid "cannot add schema to publication \"%s\"" msgstr "Schema kann nicht zu Publikation »%s« hinzugefügt werden" -#: commands/publicationcmds.c:1301 +#: commands/publicationcmds.c:1294 #, c-format msgid "Schemas cannot be added if any tables that specify a column list are already part of the publication." msgstr "Schemas können nicht hinzugefügt werden, wenn Tabellen, die eine Spaltenliste angeben, schon Teil der Publikation sind." -#: commands/publicationcmds.c:1349 +#: commands/publicationcmds.c:1342 #, c-format msgid "must be superuser to add or set schemas" msgstr "nur Superuser können Schemas hinzufügen oder setzen" -#: commands/publicationcmds.c:1358 commands/publicationcmds.c:1366 +#: commands/publicationcmds.c:1351 commands/publicationcmds.c:1359 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "Publikation »%s« ist als FOR ALL TABLES definiert" -#: commands/publicationcmds.c:1360 +#: commands/publicationcmds.c:1353 #, c-format msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." msgstr "In einer FOR-ALL-TABLES-Publikation können keine Schemas hinzugefügt oder entfernt werden." -#: commands/publicationcmds.c:1368 +#: commands/publicationcmds.c:1361 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "In einer FOR-ALL-TABLES-Publikation können keine Tabellen hinzugefügt oder entfernt werden." -#: commands/publicationcmds.c:1392 commands/publicationcmds.c:1431 -#: commands/publicationcmds.c:1968 utils/cache/lsyscache.c:3592 +#: commands/publicationcmds.c:1385 commands/publicationcmds.c:1424 +#: commands/publicationcmds.c:1961 utils/cache/lsyscache.c:3634 #, c-format msgid "publication \"%s\" does not exist" msgstr "Publikation »%s« existiert nicht" -#: commands/publicationcmds.c:1594 commands/publicationcmds.c:1657 +#: commands/publicationcmds.c:1587 commands/publicationcmds.c:1650 #, c-format msgid "conflicting or redundant WHERE clauses for table \"%s\"" msgstr "widersprüchliche oder überflüssige WHERE-Klauseln für Tabelle »%s«" -#: commands/publicationcmds.c:1601 commands/publicationcmds.c:1669 +#: commands/publicationcmds.c:1594 commands/publicationcmds.c:1662 #, c-format msgid "conflicting or redundant column lists for table \"%s\"" msgstr "widersprüchliche oder überflüssige Spaltenlisten für Tabelle »%s«" -#: commands/publicationcmds.c:1803 +#: commands/publicationcmds.c:1796 #, c-format msgid "column list must not be specified in ALTER PUBLICATION ... DROP" msgstr "in ALTER PUBLICATION ... DROP darf keine Spaltenliste angegeben werden" -#: commands/publicationcmds.c:1815 +#: commands/publicationcmds.c:1808 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "Relation »%s« ist nicht Teil der Publikation" -#: commands/publicationcmds.c:1822 +#: commands/publicationcmds.c:1815 #, c-format msgid "cannot use a WHERE clause when removing a table from a publication" msgstr "WHERE-Klausel kann nicht verwendet werden, wenn eine Tabelle aus einer Publikation entfernt wird" -#: commands/publicationcmds.c:1882 +#: commands/publicationcmds.c:1875 #, c-format msgid "tables from schema \"%s\" are not part of the publication" msgstr "Tabellen von Schema »%s« sind nicht Teil der Publikation" -#: commands/publicationcmds.c:1925 commands/publicationcmds.c:1932 +#: commands/publicationcmds.c:1918 commands/publicationcmds.c:1925 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "keine Berechtigung, um Eigentümer der Publikation »%s« zu ändern" -#: commands/publicationcmds.c:1927 +#: commands/publicationcmds.c:1920 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "Der Eigentümer einer FOR-ALL-TABLES-Publikation muss ein Superuser sein." -#: commands/publicationcmds.c:1934 +#: commands/publicationcmds.c:1927 #, c-format msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." msgstr "Der Eigentümer einer FOR-TABLES-IN-SCHEMA-Publikation muss ein Superuser sein." -#: commands/publicationcmds.c:2000 +#: commands/publicationcmds.c:1993 #, c-format msgid "publication with OID %u does not exist" msgstr "Publikation mit OID %u existiert nicht" @@ -9566,3051 +9974,3099 @@ msgstr "Security-Labels werden für diese Art Objekt nicht unterstützt" msgid "cannot set security label on relation \"%s\"" msgstr "Security-Label für Relation »%s« kann nicht gesetzt werden" -#: commands/sequence.c:754 +#: commands/sequence.c:748 #, c-format msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" msgstr "nextval: Maximalwert von Sequenz »%s« erreicht (%lld)" -#: commands/sequence.c:773 +#: commands/sequence.c:767 #, c-format msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" msgstr "nextval: Minimalwert von Sequenz »%s« erreicht (%lld)" -#: commands/sequence.c:891 +#: commands/sequence.c:886 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "currval von Sequenz »%s« ist in dieser Sitzung noch nicht definiert" -#: commands/sequence.c:910 commands/sequence.c:916 +#: commands/sequence.c:905 commands/sequence.c:911 #, c-format msgid "lastval is not yet defined in this session" msgstr "lastval ist in dieser Sitzung noch nicht definiert" -#: commands/sequence.c:996 +#: commands/sequence.c:991 #, c-format msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" msgstr "setval: Wert %lld ist außerhalb des gültigen Bereichs von Sequenz »%s« (%lld..%lld)" -#: commands/sequence.c:1365 +#: commands/sequence.c:1357 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "ungültige Sequenzoption SEQUENCE NAME" -#: commands/sequence.c:1391 +#: commands/sequence.c:1383 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "Typ von Identitätsspalte muss smallint, integer oder bigint sein" -#: commands/sequence.c:1392 +#: commands/sequence.c:1384 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "Sequenztyp muss smallint, integer oder bigint sein" -#: commands/sequence.c:1426 +#: commands/sequence.c:1418 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT darf nicht null sein" -#: commands/sequence.c:1474 +#: commands/sequence.c:1466 #, c-format msgid "MAXVALUE (%lld) is out of range for sequence data type %s" msgstr "MAXVALUE (%lld) ist außerhalb des gültigen Bereichs für Sequenzdatentyp %s" -#: commands/sequence.c:1506 +#: commands/sequence.c:1498 #, c-format msgid "MINVALUE (%lld) is out of range for sequence data type %s" msgstr "MINVALUE (%lld) ist außerhalb des gültigen Bereichs für Sequenzdatentyp %s" -#: commands/sequence.c:1514 +#: commands/sequence.c:1506 #, c-format msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" msgstr "MINVALUE (%lld) muss kleiner als MAXVALUE (%lld) sein" -#: commands/sequence.c:1535 +#: commands/sequence.c:1527 #, c-format msgid "START value (%lld) cannot be less than MINVALUE (%lld)" msgstr "START-Wert (%lld) kann nicht kleiner als MINVALUE (%lld) sein" -#: commands/sequence.c:1541 +#: commands/sequence.c:1533 #, c-format msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" msgstr "START-Wert (%lld) kann nicht größer als MAXVALUE (%lld) sein" -#: commands/sequence.c:1565 +#: commands/sequence.c:1557 #, c-format msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" msgstr "RESTART-Wert (%lld) kann nicht kleiner als MINVALUE (%lld) sein" -#: commands/sequence.c:1571 +#: commands/sequence.c:1563 #, c-format msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" msgstr "RESTART-Wert (%lld) kann nicht größer als MAXVALUE (%lld) sein" -#: commands/sequence.c:1582 +#: commands/sequence.c:1574 #, c-format msgid "CACHE (%lld) must be greater than zero" msgstr "CACHE (%lld) muss größer als null sein" -#: commands/sequence.c:1618 +#: commands/sequence.c:1610 #, c-format msgid "invalid OWNED BY option" msgstr "ungültige OWNED BY Option" -#: commands/sequence.c:1619 +#: commands/sequence.c:1611 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "Geben Sie OWNED BY tabelle.spalte oder OWNED BY NONE an." -#: commands/sequence.c:1644 +#: commands/sequence.c:1636 #, c-format msgid "sequence cannot be owned by relation \"%s\"" msgstr "Sequenz kann nicht mit Relation »%s« verknüpft werden" -#: commands/sequence.c:1652 +#: commands/sequence.c:1644 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "Sequenz muss selben Eigentümer wie die verknüpfte Tabelle haben" -#: commands/sequence.c:1656 +#: commands/sequence.c:1648 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "Sequenz muss im selben Schema wie die verknüpfte Tabelle sein" -#: commands/sequence.c:1678 +#: commands/sequence.c:1670 #, c-format msgid "cannot change ownership of identity sequence" msgstr "kann Eigentümer einer Identitätssequenz nicht ändern" -#: commands/sequence.c:1679 commands/tablecmds.c:13891 -#: commands/tablecmds.c:16488 +#: commands/sequence.c:1671 commands/tablecmds.c:14540 +#: commands/tablecmds.c:17235 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Sequenz »%s« ist mit Tabelle »%s« verknüpft." -#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1886 +#: commands/statscmds.c:106 commands/statscmds.c:115 tcop/utility.c:1883 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "in CREATE STATISTICS ist nur eine einzelne Relation erlaubt" -#: commands/statscmds.c:136 +#: commands/statscmds.c:133 #, c-format msgid "cannot define statistics for relation \"%s\"" msgstr "für Relation »%s« können keine Statistiken definiert werden" -#: commands/statscmds.c:190 +#: commands/statscmds.c:187 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "Statistikobjekt »%s« existiert bereits, wird übersprungen" -#: commands/statscmds.c:198 +#: commands/statscmds.c:195 #, c-format msgid "statistics object \"%s\" already exists" msgstr "Statistikobjekt »%s« existiert bereits" -#: commands/statscmds.c:209 +#: commands/statscmds.c:206 #, c-format msgid "cannot have more than %d columns in statistics" msgstr "Statistiken können nicht mehr als %d Spalten enthalten" -#: commands/statscmds.c:250 commands/statscmds.c:273 commands/statscmds.c:307 +#: commands/statscmds.c:247 commands/statscmds.c:270 commands/statscmds.c:304 #, c-format msgid "statistics creation on system columns is not supported" msgstr "Statistikerzeugung für Systemspalten wird nicht unterstützt" -#: commands/statscmds.c:257 commands/statscmds.c:280 +#: commands/statscmds.c:254 commands/statscmds.c:277 #, c-format msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" msgstr "Spalte »%s« kann nicht in Statistiken verwendet werden, weil ihr Typ %s keine Standardoperatorklasse für btree hat" -#: commands/statscmds.c:324 +#: commands/statscmds.c:321 #, c-format msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" msgstr "Ausdruck kann nicht in multivariaten Statistiken verwendet werden, weil sein Typ %s keine Standardoperatorklasse für btree hat" -#: commands/statscmds.c:345 +#: commands/statscmds.c:342 #, c-format msgid "when building statistics on a single expression, statistics kinds may not be specified" msgstr "wenn Statistiken für einen einzelnen Ausdruck gebaut werden, kann die Statistikart nicht angegeben werden" -#: commands/statscmds.c:374 +#: commands/statscmds.c:371 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "unbekannte Statistikart »%s«" -#: commands/statscmds.c:403 +#: commands/statscmds.c:400 #, c-format msgid "extended statistics require at least 2 columns" msgstr "erweiterte Statistiken benötigen mindestens 2 Spalten" -#: commands/statscmds.c:421 +#: commands/statscmds.c:418 #, c-format msgid "duplicate column name in statistics definition" msgstr "doppelter Spaltenname in Statistikdefinition" -#: commands/statscmds.c:456 +#: commands/statscmds.c:453 #, c-format msgid "duplicate expression in statistics definition" msgstr "doppelter Ausdruck in Statistikdefinition" -#: commands/statscmds.c:619 commands/tablecmds.c:8180 +#: commands/statscmds.c:628 commands/tablecmds.c:8653 #, c-format msgid "statistics target %d is too low" msgstr "Statistikziel %d ist zu niedrig" -#: commands/statscmds.c:627 commands/tablecmds.c:8188 +#: commands/statscmds.c:636 commands/tablecmds.c:8661 #, c-format msgid "lowering statistics target to %d" msgstr "setze Statistikziel auf %d herab" -#: commands/statscmds.c:650 +#: commands/statscmds.c:660 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "Statistikobjekt »%s.%s« existiert nicht, wird übersprungen" -#: commands/subscriptioncmds.c:271 commands/subscriptioncmds.c:359 +#: commands/subscriptioncmds.c:275 commands/subscriptioncmds.c:372 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "unbekannter Subskriptionsparameter: »%s«" -#: commands/subscriptioncmds.c:327 replication/pgoutput/pgoutput.c:398 +#: commands/subscriptioncmds.c:340 replication/pgoutput/pgoutput.c:404 #, c-format msgid "unrecognized origin value: \"%s\"" msgstr "unbekannter Origin-Wert: »%s«" -#: commands/subscriptioncmds.c:350 +#: commands/subscriptioncmds.c:363 #, c-format msgid "invalid WAL location (LSN): %s" msgstr "ungültige WAL-Position (LSN): %s" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:374 commands/subscriptioncmds.c:381 -#: commands/subscriptioncmds.c:388 commands/subscriptioncmds.c:410 -#: commands/subscriptioncmds.c:426 +#: commands/subscriptioncmds.c:387 commands/subscriptioncmds.c:394 +#: commands/subscriptioncmds.c:401 commands/subscriptioncmds.c:423 +#: commands/subscriptioncmds.c:439 #, c-format msgid "%s and %s are mutually exclusive options" msgstr "die Optionen %s und %s schließen einander aus" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:416 commands/subscriptioncmds.c:432 +#: commands/subscriptioncmds.c:429 commands/subscriptioncmds.c:445 #, c-format msgid "subscription with %s must also set %s" msgstr "Subskription mit %s muss auch %s setzen" -#: commands/subscriptioncmds.c:494 +#: commands/subscriptioncmds.c:506 #, c-format msgid "could not receive list of publications from the publisher: %s" msgstr "konnte Liste der Publikationen nicht vom Publikationsserver empfangen: %s" -#: commands/subscriptioncmds.c:526 +#: commands/subscriptioncmds.c:538 #, c-format msgid "publication %s does not exist on the publisher" msgid_plural "publications %s do not exist on the publisher" msgstr[0] "Publikation %s existiert auf dem Publikationsserver nicht" msgstr[1] "Publikationen %s existieren auf dem Publikationsserver nicht" -#: commands/subscriptioncmds.c:614 +#: commands/subscriptioncmds.c:626 #, c-format msgid "permission denied to create subscription" msgstr "keine Berechtigung, um Subskription zu erzeugen" -#: commands/subscriptioncmds.c:615 +#: commands/subscriptioncmds.c:627 #, c-format msgid "Only roles with privileges of the \"%s\" role may create subscriptions." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können Subskriptionen erzeugen." -#: commands/subscriptioncmds.c:745 commands/subscriptioncmds.c:878 -#: replication/logical/tablesync.c:1309 replication/logical/worker.c:4622 +#: commands/subscriptioncmds.c:758 commands/subscriptioncmds.c:891 +#: commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1345 +#: replication/logical/worker.c:4524 #, c-format msgid "could not connect to the publisher: %s" msgstr "konnte nicht mit dem Publikationsserver verbinden: %s" -#: commands/subscriptioncmds.c:816 +#: commands/subscriptioncmds.c:829 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "Replikations-Slot »%s« wurde auf dem Publikationsserver erzeugt" -#: commands/subscriptioncmds.c:828 -#, fuzzy, c-format -#| msgid "subscription has no replication slot set" +#: commands/subscriptioncmds.c:841 +#, c-format msgid "subscription was created, but is not connected" -msgstr "für die Subskription ist kein Replikations-Slot gesetzt" +msgstr "Subskription wurde erzeugt, ist aber nicht verbunden" -#: commands/subscriptioncmds.c:829 +#: commands/subscriptioncmds.c:842 #, c-format msgid "To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription." -msgstr "" +msgstr "Um die Replikation einzuleiten, müssen Sie den Replikations-Slot manuell erzeugen, die Subskription aktivieren und die Subskription auffrischen." -#: commands/subscriptioncmds.c:1096 commands/subscriptioncmds.c:1502 -#: commands/subscriptioncmds.c:1885 utils/cache/lsyscache.c:3642 +#: commands/subscriptioncmds.c:1109 commands/subscriptioncmds.c:1590 +#: commands/subscriptioncmds.c:1973 utils/cache/lsyscache.c:3684 #, c-format msgid "subscription \"%s\" does not exist" msgstr "Subskription »%s« existiert nicht" -#: commands/subscriptioncmds.c:1152 +#: commands/subscriptioncmds.c:1166 commands/subscriptioncmds.c:1245 #, c-format msgid "cannot set %s for enabled subscription" msgstr "für eine aktivierte Subskription kann nicht %s gesetzt werden" -#: commands/subscriptioncmds.c:1227 +#: commands/subscriptioncmds.c:1233 +#, c-format +msgid "cannot set option \"%s\" for a subscription that does not have a slot name" +msgstr "Option »%s« kann nicht für eine Subskription ohne Slot-Name gesetzt werden" + +#: commands/subscriptioncmds.c:1279 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "eine Subskription ohne Slot-Name kann nicht aktiviert werden" -#: commands/subscriptioncmds.c:1271 commands/subscriptioncmds.c:1322 +#: commands/subscriptioncmds.c:1323 commands/subscriptioncmds.c:1374 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION mit Refresh ist für deaktivierte Subskriptionen nicht erlaubt" -#: commands/subscriptioncmds.c:1272 +#: commands/subscriptioncmds.c:1324 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Verwenden Sie ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1281 commands/subscriptioncmds.c:1336 +#: commands/subscriptioncmds.c:1333 commands/subscriptioncmds.c:1388 #, c-format msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" msgstr "ALTER SUBSCRIPTION mit »refresh« und »copy_data« ist nicht erlaubt, wenn »two_phase« eingeschaltet ist" -#: commands/subscriptioncmds.c:1282 +#: commands/subscriptioncmds.c:1334 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "Verwenden Sie ALTER SUBSCRIPTION ... SET PUBLICATION mit refresh = false, oder mit copy_data = false, oder verwenden Sie DROP/CREATE SUBSCRIPTION." #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1324 -#, c-format -msgid "Use %s instead." -msgstr "Verwenden Sie stattdessen %s." - -#. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1338 +#: commands/subscriptioncmds.c:1390 #, c-format msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "Verwenden Sie %s mit refresh = false, oder mit copy_data = false, oder verwenden Sie DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1360 +#: commands/subscriptioncmds.c:1412 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH ist für eine deaktivierte Subskription nicht erlaubt" -#: commands/subscriptioncmds.c:1385 +#: commands/subscriptioncmds.c:1437 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" msgstr "ALTER SUBSCRIPTION ... REFRESH mit »copy_data« ist nicht erlaubt, wenn »two_phase« eingeschaltet ist" -#: commands/subscriptioncmds.c:1386 +#: commands/subscriptioncmds.c:1438 #, c-format msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "Verwenden Sie ALTER SUBSCRIPTION ... REFRESH mit copy_data = false, oder verwenden Sie DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1421 +#: commands/subscriptioncmds.c:1473 #, c-format msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" msgstr "zu überspringende WAL-Position (LSN %X/%X) muss größer als Origin-LSN %X/%X sein" -#: commands/subscriptioncmds.c:1506 +#: commands/subscriptioncmds.c:1594 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "Subskription »%s« existiert nicht, wird übersprungen" -#: commands/subscriptioncmds.c:1775 +#: commands/subscriptioncmds.c:1863 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "Replikations-Slot »%s« auf dem Publikationsserver wurde gelöscht" -#: commands/subscriptioncmds.c:1784 commands/subscriptioncmds.c:1792 +#: commands/subscriptioncmds.c:1872 commands/subscriptioncmds.c:1880 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" msgstr "konnte Replikations-Slot »%s« auf dem Publikationsserver nicht löschen: %s" -#: commands/subscriptioncmds.c:1917 +#: commands/subscriptioncmds.c:2005 #, c-format msgid "subscription with OID %u does not exist" msgstr "Subskription mit OID %u existiert nicht" -#: commands/subscriptioncmds.c:1988 commands/subscriptioncmds.c:2113 +#: commands/subscriptioncmds.c:2079 commands/subscriptioncmds.c:2204 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "konnte Liste der replizierten Tabellen nicht vom Publikationsserver empfangen: %s" -#: commands/subscriptioncmds.c:2024 +#: commands/subscriptioncmds.c:2115 #, c-format msgid "subscription \"%s\" requested copy_data with origin = NONE but might copy data that had a different origin" -msgstr "" +msgstr "Subskription »%s« verlangte copy_data mit origin = NONE, aber könnte Daten kopieren, die einen anderen Origin hatten" -#: commands/subscriptioncmds.c:2026 -#, fuzzy, c-format -#| msgid "relation \"%s\" is not part of the publication" -msgid "Subscribed publication %s is subscribing to other publications." -msgid_plural "Subscribed publications %s are subscribing to other publications." -msgstr[0] "Relation »%s« ist nicht Teil der Publikation" -msgstr[1] "Relation »%s« ist nicht Teil der Publikation" +#: commands/subscriptioncmds.c:2117 +#, c-format +msgid "The subscription being created subscribes to a publication (%s) that contains tables that are written to by other subscriptions." +msgid_plural "The subscription being created subscribes to publications (%s) that contain tables that are written to by other subscriptions." +msgstr[0] "Die zu erzeugende Subskription hat eine Publikation (%s) abonniert, die Tabellen enthält, in die von anderen Subskriptionen geschrieben wird." +msgstr[1] "Die zu erzeugende Subskription hat Publikationen (%s) abonniert, die Tabellen enthalten, in die von anderen Subskriptionen geschrieben wird." -#: commands/subscriptioncmds.c:2029 +#: commands/subscriptioncmds.c:2120 #, c-format msgid "Verify that initial data copied from the publisher tables did not come from other origins." -msgstr "" +msgstr "Überprüfen Sie, dass die von den publizierten Tabellen kopierten initialen Daten nicht von anderen Origins kamen." -#: commands/subscriptioncmds.c:2135 replication/logical/tablesync.c:876 -#: replication/pgoutput/pgoutput.c:1115 +#: commands/subscriptioncmds.c:2226 replication/logical/tablesync.c:906 +#: replication/pgoutput/pgoutput.c:1143 #, c-format msgid "cannot use different column lists for table \"%s.%s\" in different publications" msgstr "für Tabelle »%s.%s« können nicht verschiedene Spaltenlisten für verschiedene Publikationen verwendet werden" -#: commands/subscriptioncmds.c:2185 +#: commands/subscriptioncmds.c:2276 #, c-format msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" msgstr "konnte beim Versuch den Replikations-Slot »%s« zu löschen nicht mit dem Publikationsserver verbinden: %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:2188 -#, fuzzy, c-format -#| msgid "Use %s to disassociate the subscription from the slot." +#: commands/subscriptioncmds.c:2279 +#, c-format msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." -msgstr "Verwenden Sie %s, um die Subskription vom Slot zu trennen." +msgstr "Verwenden Sie %s, um die Subskription zu deaktivieren, und dann %s, um sie vom Slot zu trennen." -#: commands/subscriptioncmds.c:2219 +#: commands/subscriptioncmds.c:2310 #, c-format msgid "publication name \"%s\" used more than once" msgstr "Publikationsname »%s« mehrmals angegeben" -#: commands/subscriptioncmds.c:2263 +#: commands/subscriptioncmds.c:2354 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "Publikation »%s« ist bereits in Subskription »%s«" -#: commands/subscriptioncmds.c:2277 +#: commands/subscriptioncmds.c:2368 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "Publikation »%s« ist nicht in Subskription »%s«" -#: commands/subscriptioncmds.c:2288 +#: commands/subscriptioncmds.c:2379 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "kann nicht alle Publikationen von einer Subskription löschen" -#: commands/subscriptioncmds.c:2345 +#: commands/subscriptioncmds.c:2436 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "%s erfordert einen Boole’schen Wert oder »parallel«" -#: commands/tablecmds.c:246 commands/tablecmds.c:288 +#: commands/tablecmds.c:255 commands/tablecmds.c:297 #, c-format msgid "table \"%s\" does not exist" msgstr "Tabelle »%s« existiert nicht" -#: commands/tablecmds.c:247 commands/tablecmds.c:289 +#: commands/tablecmds.c:256 commands/tablecmds.c:298 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "Tabelle »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:249 commands/tablecmds.c:291 +#: commands/tablecmds.c:258 commands/tablecmds.c:300 msgid "Use DROP TABLE to remove a table." msgstr "Verwenden Sie DROP TABLE, um eine Tabelle zu löschen." -#: commands/tablecmds.c:252 +#: commands/tablecmds.c:261 #, c-format msgid "sequence \"%s\" does not exist" msgstr "Sequenz »%s« existiert nicht" -#: commands/tablecmds.c:253 +#: commands/tablecmds.c:262 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "Sequenz »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:255 +#: commands/tablecmds.c:264 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "Verwenden Sie DROP SEQUENCE, um eine Sequenz zu löschen." -#: commands/tablecmds.c:258 +#: commands/tablecmds.c:267 #, c-format msgid "view \"%s\" does not exist" msgstr "Sicht »%s« existiert nicht" -#: commands/tablecmds.c:259 +#: commands/tablecmds.c:268 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "Sicht »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:261 +#: commands/tablecmds.c:270 msgid "Use DROP VIEW to remove a view." msgstr "Verwenden Sie DROP VIEW, um eine Sicht zu löschen." -#: commands/tablecmds.c:264 +#: commands/tablecmds.c:273 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "materialisierte Sicht »%s« existiert nicht" -#: commands/tablecmds.c:265 +#: commands/tablecmds.c:274 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "materialisierte Sicht »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:267 +#: commands/tablecmds.c:276 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "Verwenden Sie DROP MATERIALIZED VIEW, um eine materialisierte Sicht zu löschen." -#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:18976 -#: parser/parse_utilcmd.c:2245 +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19859 +#: parser/parse_utilcmd.c:2251 #, c-format msgid "index \"%s\" does not exist" msgstr "Index »%s« existiert nicht" -#: commands/tablecmds.c:271 commands/tablecmds.c:295 +#: commands/tablecmds.c:280 commands/tablecmds.c:304 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "Index »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:273 commands/tablecmds.c:297 +#: commands/tablecmds.c:282 commands/tablecmds.c:306 msgid "Use DROP INDEX to remove an index." msgstr "Verwenden Sie DROP INDEX, um einen Index zu löschen." -#: commands/tablecmds.c:278 +#: commands/tablecmds.c:287 #, c-format msgid "\"%s\" is not a type" msgstr "»%s« ist kein Typ" -#: commands/tablecmds.c:279 +#: commands/tablecmds.c:288 msgid "Use DROP TYPE to remove a type." msgstr "Verwenden Sie DROP TYPE, um einen Typen zu löschen." -#: commands/tablecmds.c:282 commands/tablecmds.c:13730 -#: commands/tablecmds.c:16193 +#: commands/tablecmds.c:291 commands/tablecmds.c:14379 +#: commands/tablecmds.c:16940 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "Fremdtabelle »%s« existiert nicht" -#: commands/tablecmds.c:283 +#: commands/tablecmds.c:292 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "Fremdtabelle »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:285 +#: commands/tablecmds.c:294 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Verwenden Sie DROP FOREIGN TABLE, um eine Fremdtabelle zu löschen." -#: commands/tablecmds.c:700 +#: commands/tablecmds.c:734 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT kann nur mit temporären Tabellen verwendet werden" -#: commands/tablecmds.c:731 +#: commands/tablecmds.c:765 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "kann temporäre Tabelle nicht in einer sicherheitsbeschränkten Operation erzeugen" -#: commands/tablecmds.c:767 commands/tablecmds.c:15038 +#: commands/tablecmds.c:801 commands/tablecmds.c:15799 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "von der Relation »%s« würde mehrmals geerbt werden" -#: commands/tablecmds.c:955 -#, c-format -msgid "specifying a table access method is not supported on a partitioned table" -msgstr "Angabe einer Tabellenzugriffsmethode wird für partitionierte Tabellen nicht unterstützt" - -#: commands/tablecmds.c:1048 +#: commands/tablecmds.c:1067 #, c-format msgid "\"%s\" is not partitioned" msgstr "»%s« ist nicht partitioniert" -#: commands/tablecmds.c:1142 +#: commands/tablecmds.c:1161 #, c-format msgid "cannot partition using more than %d columns" msgstr "Partitionierung kann nicht mehr als %d Spalten verwenden" -#: commands/tablecmds.c:1198 +#: commands/tablecmds.c:1217 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "kann keine Fremdpartition der partitionierten Tabelle »%s« erzeugen" -#: commands/tablecmds.c:1200 +#: commands/tablecmds.c:1219 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "Tabelle »%s« enthält Unique Indexe." -#: commands/tablecmds.c:1365 +#: commands/tablecmds.c:1338 commands/tablecmds.c:13395 +#, c-format +msgid "too many array dimensions" +msgstr "zu viele Array-Dimensionen" + +#: commands/tablecmds.c:1343 parser/parse_clause.c:774 +#: parser/parse_relation.c:1912 +#, c-format +msgid "column \"%s\" cannot be declared SETOF" +msgstr "Spalte »%s« kann nicht als SETOF deklariert werden" + +#: commands/tablecmds.c:1489 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY unterstützt das Löschen von mehreren Objekten nicht" -#: commands/tablecmds.c:1369 +#: commands/tablecmds.c:1493 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY unterstützt kein CASCADE" -#: commands/tablecmds.c:1473 +#: commands/tablecmds.c:1597 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "kann partitionierten Index »%s« nicht nebenläufig löschen" -#: commands/tablecmds.c:1761 +#: commands/tablecmds.c:1885 #, c-format msgid "cannot truncate only a partitioned table" msgstr "kann nicht nur eine partitionierte Tabelle leeren" -#: commands/tablecmds.c:1762 +#: commands/tablecmds.c:1886 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "Lassen Sie das Schlüsselwort ONLY weg oder wenden Sie TRUNCATE ONLY direkt auf die Partitionen an." -#: commands/tablecmds.c:1835 +#: commands/tablecmds.c:1959 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "Truncate-Vorgang leert ebenfalls Tabelle »%s«" -#: commands/tablecmds.c:2199 +#: commands/tablecmds.c:2320 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "kann Fremdtabelle »%s« nicht leeren" -#: commands/tablecmds.c:2256 +#: commands/tablecmds.c:2377 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht leeren" -#: commands/tablecmds.c:2488 commands/tablecmds.c:14935 +#: commands/tablecmds.c:2606 commands/tablecmds.c:15696 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "von partitionierter Tabelle »%s« kann nicht geerbt werden" -#: commands/tablecmds.c:2493 +#: commands/tablecmds.c:2611 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "von Partition »%s« kann nicht geerbt werden" -#: commands/tablecmds.c:2501 parser/parse_utilcmd.c:2475 -#: parser/parse_utilcmd.c:2617 +#: commands/tablecmds.c:2619 parser/parse_utilcmd.c:2481 +#: parser/parse_utilcmd.c:2623 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "geerbte Relation »%s« ist keine Tabelle oder Fremdtabelle" -#: commands/tablecmds.c:2513 +#: commands/tablecmds.c:2631 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "eine temporäre Relation kann nicht als Partition der permanenten Relation »%s« erzeugt werden" -#: commands/tablecmds.c:2522 commands/tablecmds.c:14914 +#: commands/tablecmds.c:2640 commands/tablecmds.c:15675 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "von temporärer Relation »%s« kann nicht geerbt werden" -#: commands/tablecmds.c:2532 commands/tablecmds.c:14922 +#: commands/tablecmds.c:2650 commands/tablecmds.c:15683 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "von temporärer Relation einer anderen Sitzung kann nicht geerbt werden" -#: commands/tablecmds.c:2585 +#: commands/tablecmds.c:2791 commands/tablecmds.c:2845 +#: commands/tablecmds.c:13078 parser/parse_utilcmd.c:1265 +#: parser/parse_utilcmd.c:1308 parser/parse_utilcmd.c:1735 +#: parser/parse_utilcmd.c:1843 #, c-format -msgid "merging multiple inherited definitions of column \"%s\"" -msgstr "geerbte Definitionen von Spalte »%s« werden zusammengeführt" +msgid "cannot convert whole-row table reference" +msgstr "kann Verweis auf ganze Zeile der Tabelle nicht umwandeln" -#: commands/tablecmds.c:2597 +#: commands/tablecmds.c:2792 parser/parse_utilcmd.c:1266 #, c-format -msgid "inherited column \"%s\" has a type conflict" -msgstr "geerbte Spalte »%s« hat Typkonflikt" +msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "Generierungsausdruck für Spalte »%s« enthält einen Verweis auf die ganze Zeile der Tabelle »%s«." -#: commands/tablecmds.c:2599 commands/tablecmds.c:2628 -#: commands/tablecmds.c:2647 commands/tablecmds.c:2919 -#: commands/tablecmds.c:2955 commands/tablecmds.c:2971 -#: parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 -#: parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 -#: parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 -#: parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 -#: parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 -#: parser/parse_param.c:223 +#: commands/tablecmds.c:2846 parser/parse_utilcmd.c:1309 #, c-format -msgid "%s versus %s" -msgstr "%s gegen %s" +msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "Constraint »%s« enthält einen Verweis auf die ganze Zeile der Tabelle »%s«." -#: commands/tablecmds.c:2612 +#: commands/tablecmds.c:2956 commands/tablecmds.c:3227 #, c-format -msgid "inherited column \"%s\" has a collation conflict" -msgstr "geerbte Spalte »%s« hat Sortierfolgenkonflikt" +msgid "column \"%s\" inherits from generated column but specifies default" +msgstr "Spalte »%s« erbt von einer generierten Spalte aber hat einen Vorgabewert angegeben" -#: commands/tablecmds.c:2614 commands/tablecmds.c:2935 -#: commands/tablecmds.c:6849 +#: commands/tablecmds.c:2961 commands/tablecmds.c:3232 #, c-format -msgid "\"%s\" versus \"%s\"" -msgstr "»%s« gegen »%s«" +msgid "column \"%s\" inherits from generated column but specifies identity" +msgstr "Spalte »%s« erbt von einer generierten Spalte aber ist als Identitätsspalte definiert" -#: commands/tablecmds.c:2626 +#: commands/tablecmds.c:2969 commands/tablecmds.c:3240 #, c-format -msgid "inherited column \"%s\" has a storage parameter conflict" -msgstr "geerbte Spalte »%s« hat einen Konflikt bei einem Storage-Parameter" +msgid "child column \"%s\" specifies generation expression" +msgstr "abgeleitete Spalte »%s« gibt einen Generierungsausdruck an" -#: commands/tablecmds.c:2645 commands/tablecmds.c:2969 +#: commands/tablecmds.c:2971 commands/tablecmds.c:3242 #, c-format -msgid "column \"%s\" has a compression method conflict" -msgstr "für Spalte »%s« besteht ein Komprimierungsmethodenkonflikt" +msgid "A child table column cannot be generated unless its parent column is." +msgstr "Eine Spalte einer abgeleiteten Tabelle kann nur generiert sein, wenn die Spalte in der Elterntabelle es auch ist." -#: commands/tablecmds.c:2661 +#: commands/tablecmds.c:3017 #, c-format -msgid "inherited column \"%s\" has a generation conflict" -msgstr "geerbte Spalte »%s« hat einen Generierungskonflikt" +msgid "column \"%s\" inherits conflicting generation expressions" +msgstr "Spalte »%s« erbt widersprüchliche Generierungsausdrücke" -#: commands/tablecmds.c:2767 commands/tablecmds.c:2822 -#: commands/tablecmds.c:12456 parser/parse_utilcmd.c:1298 -#: parser/parse_utilcmd.c:1341 parser/parse_utilcmd.c:1740 -#: parser/parse_utilcmd.c:1848 +#: commands/tablecmds.c:3019 #, c-format -msgid "cannot convert whole-row table reference" -msgstr "kann Verweis auf ganze Zeile der Tabelle nicht umwandeln" +msgid "To resolve the conflict, specify a generation expression explicitly." +msgstr "Um den Konflikt zu lösen, geben Sie einen Generierungsausdruck ausdrücklich an." -#: commands/tablecmds.c:2768 parser/parse_utilcmd.c:1299 +#: commands/tablecmds.c:3023 #, c-format -msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." -msgstr "Generierungsausdruck für Spalte »%s« enthält einen Verweis auf die ganze Zeile der Tabelle »%s«." +msgid "column \"%s\" inherits conflicting default values" +msgstr "Spalte »%s« erbt widersprüchliche Vorgabewerte" -#: commands/tablecmds.c:2823 parser/parse_utilcmd.c:1342 +#: commands/tablecmds.c:3025 #, c-format -msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." -msgstr "Constraint »%s« enthält einen Verweis auf die ganze Zeile der Tabelle »%s«." +msgid "To resolve the conflict, specify a default explicitly." +msgstr "Um den Konflikt zu lösen, geben Sie einen Vorgabewert ausdrücklich an." + +#: commands/tablecmds.c:3080 +#, c-format +msgid "check constraint name \"%s\" appears multiple times but with different expressions" +msgstr "Check-Constraint-Name »%s« erscheint mehrmals, aber mit unterschiedlichen Ausdrücken" -#: commands/tablecmds.c:2901 +#: commands/tablecmds.c:3131 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "Spalte »%s« wird mit geerbter Definition zusammengeführt" -#: commands/tablecmds.c:2905 +#: commands/tablecmds.c:3135 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "Spalte »%s« wird verschoben und mit geerbter Definition zusammengeführt" -#: commands/tablecmds.c:2906 +#: commands/tablecmds.c:3136 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "Benutzerdefinierte Spalte wurde auf die Position der geerbten Spalte verschoben." -#: commands/tablecmds.c:2917 +#: commands/tablecmds.c:3148 #, c-format msgid "column \"%s\" has a type conflict" msgstr "für Spalte »%s« besteht ein Typkonflikt" -#: commands/tablecmds.c:2933 +#: commands/tablecmds.c:3150 commands/tablecmds.c:3184 +#: commands/tablecmds.c:3200 commands/tablecmds.c:3307 +#: commands/tablecmds.c:3340 commands/tablecmds.c:3356 +#: parser/parse_coerce.c:2192 parser/parse_coerce.c:2212 +#: parser/parse_coerce.c:2232 parser/parse_coerce.c:2253 +#: parser/parse_coerce.c:2308 parser/parse_coerce.c:2342 +#: parser/parse_coerce.c:2418 parser/parse_coerce.c:2449 +#: parser/parse_coerce.c:2488 parser/parse_coerce.c:2555 +#: parser/parse_param.c:223 #, c-format -msgid "column \"%s\" has a collation conflict" -msgstr "für Spalte »%s« besteht ein Sortierfolgenkonflikt" +msgid "%s versus %s" +msgstr "%s gegen %s" -#: commands/tablecmds.c:2953 +#: commands/tablecmds.c:3162 #, c-format -msgid "column \"%s\" has a storage parameter conflict" -msgstr "für Spalte »%s« besteht ein Konflikt bei einem Storage-Parameter" +msgid "column \"%s\" has a collation conflict" +msgstr "für Spalte »%s« besteht ein Sortierfolgenkonflikt" -#: commands/tablecmds.c:2999 commands/tablecmds.c:3086 +#: commands/tablecmds.c:3164 commands/tablecmds.c:3326 +#: commands/tablecmds.c:7080 #, c-format -msgid "column \"%s\" inherits from generated column but specifies default" -msgstr "Spalte »%s« erbt von einer generierten Spalte aber hat einen Vorgabewert angegeben" +msgid "\"%s\" versus \"%s\"" +msgstr "»%s« gegen »%s«" -#: commands/tablecmds.c:3004 commands/tablecmds.c:3091 +#: commands/tablecmds.c:3182 #, c-format -msgid "column \"%s\" inherits from generated column but specifies identity" -msgstr "Spalte »%s« erbt von einer generierten Spalte aber ist als Identitätsspalte definiert" +msgid "column \"%s\" has a storage parameter conflict" +msgstr "für Spalte »%s« besteht ein Konflikt bei einem Storage-Parameter" -#: commands/tablecmds.c:3012 commands/tablecmds.c:3099 +#: commands/tablecmds.c:3198 commands/tablecmds.c:3354 #, c-format -msgid "child column \"%s\" specifies generation expression" -msgstr "abgeleitete Spalte »%s« gibt einen Generierungsausdruck an" - -#: commands/tablecmds.c:3014 commands/tablecmds.c:3101 -#, fuzzy, c-format -#| msgid "A generated column cannot reference another generated column." -msgid "A child table column cannot be generated unless its parent column is." -msgstr "Eine generierte Spalte kann nicht auf eine andere generierte Spalte verweisen." +msgid "column \"%s\" has a compression method conflict" +msgstr "für Spalte »%s« besteht ein Komprimierungsmethodenkonflikt" -#: commands/tablecmds.c:3147 +#: commands/tablecmds.c:3293 #, c-format -msgid "column \"%s\" inherits conflicting generation expressions" -msgstr "Spalte »%s« erbt widersprüchliche Generierungsausdrücke" +msgid "merging multiple inherited definitions of column \"%s\"" +msgstr "geerbte Definitionen von Spalte »%s« werden zusammengeführt" -#: commands/tablecmds.c:3149 +#: commands/tablecmds.c:3305 #, c-format -msgid "To resolve the conflict, specify a generation expression explicitly." -msgstr "Um den Konflikt zu lösen, geben Sie einen Generierungsausdruck ausdrücklich an." +msgid "inherited column \"%s\" has a type conflict" +msgstr "geerbte Spalte »%s« hat Typkonflikt" -#: commands/tablecmds.c:3153 +#: commands/tablecmds.c:3324 #, c-format -msgid "column \"%s\" inherits conflicting default values" -msgstr "Spalte »%s« erbt widersprüchliche Vorgabewerte" +msgid "inherited column \"%s\" has a collation conflict" +msgstr "geerbte Spalte »%s« hat Sortierfolgenkonflikt" -#: commands/tablecmds.c:3155 +#: commands/tablecmds.c:3338 #, c-format -msgid "To resolve the conflict, specify a default explicitly." -msgstr "Um den Konflikt zu lösen, geben Sie einen Vorgabewert ausdrücklich an." +msgid "inherited column \"%s\" has a storage parameter conflict" +msgstr "geerbte Spalte »%s« hat einen Konflikt bei einem Storage-Parameter" -#: commands/tablecmds.c:3205 +#: commands/tablecmds.c:3366 #, c-format -msgid "check constraint name \"%s\" appears multiple times but with different expressions" -msgstr "Check-Constraint-Name »%s« erscheint mehrmals, aber mit unterschiedlichen Ausdrücken" +msgid "inherited column \"%s\" has a generation conflict" +msgstr "geerbte Spalte »%s« hat einen Generierungskonflikt" -#: commands/tablecmds.c:3418 +#: commands/tablecmds.c:3597 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "temporäre Tabellen anderer Sitzungen können nicht verschoben werden" -#: commands/tablecmds.c:3488 +#: commands/tablecmds.c:3670 #, c-format msgid "cannot rename column of typed table" msgstr "Spalte einer getypten Tabelle kann nicht umbenannt werden" -#: commands/tablecmds.c:3507 +#: commands/tablecmds.c:3689 #, c-format msgid "cannot rename columns of relation \"%s\"" msgstr "Spalten von Relation »%s« können nicht umbenannt werden" -#: commands/tablecmds.c:3602 +#: commands/tablecmds.c:3784 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "vererbte Spalte »%s« muss ebenso in den abgeleiteten Tabellen umbenannt werden" -#: commands/tablecmds.c:3634 +#: commands/tablecmds.c:3816 #, c-format msgid "cannot rename system column \"%s\"" msgstr "Systemspalte »%s« kann nicht umbenannt werden" -#: commands/tablecmds.c:3649 +#: commands/tablecmds.c:3831 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "kann vererbte Spalte »%s« nicht umbenennen" -#: commands/tablecmds.c:3801 +#: commands/tablecmds.c:3983 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "vererbter Constraint »%s« muss ebenso in den abgeleiteten Tabellen umbenannt werden" -#: commands/tablecmds.c:3808 +#: commands/tablecmds.c:3990 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "kann vererbten Constraint »%s« nicht umbenennen" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4105 +#: commands/tablecmds.c:4290 #, c-format msgid "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "%s mit Relation »%s« nicht möglich, weil sie von aktiven Anfragen in dieser Sitzung verwendet wird" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4114 +#: commands/tablecmds.c:4299 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "%s mit Relation »%s« nicht möglich, weil es anstehende Trigger-Ereignisse dafür gibt" -#: commands/tablecmds.c:4581 +#: commands/tablecmds.c:4325 +#, c-format +msgid "cannot alter temporary tables of other sessions" +msgstr "kann temporäre Tabellen anderer Sitzungen nicht ändern" + +#: commands/tablecmds.c:4798 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "kann Partition »%s« mit einer unvollständigen Abtrennoperation nicht ändern" -#: commands/tablecmds.c:4774 commands/tablecmds.c:4789 +#: commands/tablecmds.c:5002 commands/tablecmds.c:5017 #, c-format msgid "cannot change persistence setting twice" msgstr "Persistenzeinstellung kann nicht zweimal geändert werden" -#: commands/tablecmds.c:4810 -#, c-format -msgid "cannot change access method of a partitioned table" -msgstr "Zugriffsmethode einer partitionierten Tabelle kann nicht geändert werden" - -#: commands/tablecmds.c:4816 +#: commands/tablecmds.c:5038 #, c-format msgid "cannot have multiple SET ACCESS METHOD subcommands" msgstr "mehrere SET ACCESS METHOD Unterbefehle sind ungültig" -#: commands/tablecmds.c:5537 +#: commands/tablecmds.c:5768 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "Systemrelation »%s« kann nicht neu geschrieben werden" -#: commands/tablecmds.c:5543 +#: commands/tablecmds.c:5774 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "Tabelle »%s«, die als Katalogtabelle verwendet wird, kann nicht neu geschrieben werden" -#: commands/tablecmds.c:5553 +#: commands/tablecmds.c:5786 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht neu schreiben" -#: commands/tablecmds.c:6048 +#: commands/tablecmds.c:6281 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "Spalte »%s« von Relation »%s« enthält NULL-Werte" -#: commands/tablecmds.c:6065 +#: commands/tablecmds.c:6298 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "Check-Constraint »%s« von Relation »%s« wird von irgendeiner Zeile verletzt" -#: commands/tablecmds.c:6084 partitioning/partbounds.c:3388 +#: commands/tablecmds.c:6317 partitioning/partbounds.c:3387 #, c-format msgid "updated partition constraint for default partition \"%s\" would be violated by some row" msgstr "aktualisierter Partitions-Constraint der Standardpartition »%s« würde von irgendeiner Zeile verletzt werden" -#: commands/tablecmds.c:6090 +#: commands/tablecmds.c:6323 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "Partitions-Constraint von Relation »%s« wird von irgendeiner Zeile verletzt" #. translator: %s is a group of some SQL keywords -#: commands/tablecmds.c:6352 +#: commands/tablecmds.c:6588 #, c-format msgid "ALTER action %s cannot be performed on relation \"%s\"" msgstr "ALTER-Aktion %s kann nicht mit Relation »%s« ausgeführt werden" -#: commands/tablecmds.c:6607 commands/tablecmds.c:6614 +#: commands/tablecmds.c:6843 commands/tablecmds.c:6850 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "kann Typ »%s« nicht ändern, weil Spalte »%s.%s« ihn verwendet" -#: commands/tablecmds.c:6621 +#: commands/tablecmds.c:6857 #, c-format msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "kann Fremdtabelle »%s« nicht ändern, weil Spalte »%s.%s« ihren Zeilentyp verwendet" -#: commands/tablecmds.c:6628 +#: commands/tablecmds.c:6864 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "kann Tabelle »%s« nicht ändern, weil Spalte »%s.%s« ihren Zeilentyp verwendet" -#: commands/tablecmds.c:6684 +#: commands/tablecmds.c:6920 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "kann Typ »%s« nicht ändern, weil er der Typ einer getypten Tabelle ist" -#: commands/tablecmds.c:6686 +#: commands/tablecmds.c:6922 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "Verwenden Sie ALTER ... CASCADE, um die getypten Tabellen ebenfalls zu ändern." -#: commands/tablecmds.c:6732 +#: commands/tablecmds.c:6968 #, c-format msgid "type %s is not a composite type" msgstr "Typ %s ist kein zusammengesetzter Typ" -#: commands/tablecmds.c:6759 +#: commands/tablecmds.c:6995 #, c-format msgid "cannot add column to typed table" msgstr "zu einer getypten Tabelle kann keine Spalte hinzugefügt werden" -#: commands/tablecmds.c:6812 +#: commands/tablecmds.c:7043 #, c-format msgid "cannot add column to a partition" msgstr "zu einer Partition kann keine Spalte hinzugefügt werden" -#: commands/tablecmds.c:6841 commands/tablecmds.c:15165 +#: commands/tablecmds.c:7072 commands/tablecmds.c:15914 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedlichen Typ für Spalte »%s«" -#: commands/tablecmds.c:6847 commands/tablecmds.c:15172 +#: commands/tablecmds.c:7078 commands/tablecmds.c:15920 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedliche Sortierfolge für Spalte »%s«" -#: commands/tablecmds.c:6865 +#: commands/tablecmds.c:7096 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "Definition von Spalte »%s« für abgeleitete Tabelle »%s« wird zusammengeführt" -#: commands/tablecmds.c:6908 +#: commands/tablecmds.c:7149 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "eine Identitätsspalte kann nicht rekursiv zu einer Tabelle hinzugefügt werden, die abgeleitete Tabellen hat" -#: commands/tablecmds.c:7159 +#: commands/tablecmds.c:7395 #, c-format msgid "column must be added to child tables too" msgstr "Spalte muss ebenso in den abgeleiteten Tabellen hinzugefügt werden" -#: commands/tablecmds.c:7237 +#: commands/tablecmds.c:7473 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "Spalte »%s« von Relation »%s« existiert bereits, wird übersprungen" -#: commands/tablecmds.c:7244 +#: commands/tablecmds.c:7480 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "Spalte »%s« von Relation »%s« existiert bereits" -#: commands/tablecmds.c:7310 commands/tablecmds.c:12094 +#: commands/tablecmds.c:7546 commands/tablecmds.c:12706 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "Constraint kann nicht nur von der partitionierten Tabelle entfernt werden, wenn Partitionen existieren" -#: commands/tablecmds.c:7311 commands/tablecmds.c:7628 -#: commands/tablecmds.c:8593 commands/tablecmds.c:12095 +#: commands/tablecmds.c:7547 commands/tablecmds.c:7861 +#: commands/tablecmds.c:8039 commands/tablecmds.c:8146 +#: commands/tablecmds.c:8263 commands/tablecmds.c:9082 +#: commands/tablecmds.c:12707 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Lassen Sie das Schlüsselwort ONLY weg." -#: commands/tablecmds.c:7348 commands/tablecmds.c:7554 -#: commands/tablecmds.c:7696 commands/tablecmds.c:7810 -#: commands/tablecmds.c:7904 commands/tablecmds.c:7963 -#: commands/tablecmds.c:8082 commands/tablecmds.c:8221 -#: commands/tablecmds.c:8291 commands/tablecmds.c:8425 -#: commands/tablecmds.c:12249 commands/tablecmds.c:13753 -#: commands/tablecmds.c:16282 +#: commands/tablecmds.c:7583 commands/tablecmds.c:7787 +#: commands/tablecmds.c:7929 commands/tablecmds.c:8061 +#: commands/tablecmds.c:8190 commands/tablecmds.c:8284 +#: commands/tablecmds.c:8385 commands/tablecmds.c:8542 +#: commands/tablecmds.c:8695 commands/tablecmds.c:8776 +#: commands/tablecmds.c:8910 commands/tablecmds.c:12860 +#: commands/tablecmds.c:14402 commands/tablecmds.c:17029 #, c-format msgid "cannot alter system column \"%s\"" msgstr "Systemspalte »%s« kann nicht geändert werden" -#: commands/tablecmds.c:7354 commands/tablecmds.c:7702 +#: commands/tablecmds.c:7589 commands/tablecmds.c:7935 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "Spalte »%s« von Relation »%s« ist eine Identitätsspalte" -#: commands/tablecmds.c:7397 +#: commands/tablecmds.c:7630 #, c-format msgid "column \"%s\" is in a primary key" msgstr "Spalte »%s« ist in einem Primärschlüssel" -#: commands/tablecmds.c:7402 +#: commands/tablecmds.c:7635 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "Spalte »%s« ist in einem Index, der als Replik-Identität verwendet wird" -#: commands/tablecmds.c:7425 +#: commands/tablecmds.c:7658 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "Spalte »%s« ist in Elterntabelle als NOT NULL markiert" -#: commands/tablecmds.c:7625 commands/tablecmds.c:9077 +#: commands/tablecmds.c:7858 commands/tablecmds.c:9566 #, c-format msgid "constraint must be added to child tables too" msgstr "Constraint muss ebenso in den abgeleiteten Tabellen hinzugefügt werden" -#: commands/tablecmds.c:7626 +#: commands/tablecmds.c:7859 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "Spalte »%s« von Relation »%s« ist nicht bereits NOT NULL." -#: commands/tablecmds.c:7704 -#, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." -msgstr "Verwenden Sie stattdessen ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." - -#: commands/tablecmds.c:7709 +#: commands/tablecmds.c:7944 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "Spalte »%s« von Relation »%s« ist eine generierte Spalte" -#: commands/tablecmds.c:7712 +#: commands/tablecmds.c:8038 +#, c-format +msgid "cannot add identity to a column of only the partitioned table" +msgstr "Identität kann nicht einer Spalte nur in der partitionierten Tabelle hinzugefügt werden" + +#: commands/tablecmds.c:8044 #, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." -msgstr "Verwenden Sie stattdessen ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION." +msgid "cannot add identity to a column of a partition" +msgstr "zu einer Spalte einer Partition kann keine Identität hinzugefügt werden" -#: commands/tablecmds.c:7821 +#: commands/tablecmds.c:8072 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "Spalte »%s« von Relation »%s« muss als NOT NULL deklariert werden, bevor Sie Identitätsspalte werden kann" -#: commands/tablecmds.c:7827 +#: commands/tablecmds.c:8078 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "Spalte »%s« von Relation »%s« ist bereits eine Identitätsspalte" -#: commands/tablecmds.c:7833 +#: commands/tablecmds.c:8084 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "Spalte »%s« von Relation »%s« hat bereits einen Vorgabewert" -#: commands/tablecmds.c:7910 commands/tablecmds.c:7971 +#: commands/tablecmds.c:8145 +#, c-format +msgid "cannot change identity column of only the partitioned table" +msgstr "Identitätsspalte kann nicht nur in der partitionierten Tabelle geändert werden" + +#: commands/tablecmds.c:8151 +#, c-format +msgid "cannot change identity column of a partition" +msgstr "Identitätsspalte einer Partition kann nicht geändert werden" + +#: commands/tablecmds.c:8196 commands/tablecmds.c:8292 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "Spalte »%s« von Relation »%s« ist keine Identitätsspalte" -#: commands/tablecmds.c:7976 +#: commands/tablecmds.c:8262 +#, c-format +msgid "cannot drop identity from a column of only the partitioned table" +msgstr "Identität kann nicht von einer Spalte nur in der partitionierten Tabelle gelöscht werden" + +#: commands/tablecmds.c:8268 +#, c-format +msgid "cannot drop identity from a column of a partition" +msgstr "Identität kann nicht von einer Spalte einer Partition gelöscht werden" + +#: commands/tablecmds.c:8297 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "Spalte »%s« von Relation »%s« ist keine Identitätsspalte, wird übersprungen" -#: commands/tablecmds.c:8029 +#: commands/tablecmds.c:8391 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not a generated column" +msgstr "Spalte »%s« von Relation »%s« ist keine generierte Spalte" + +#: commands/tablecmds.c:8489 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "ALTER TABLE / DROP EXPRESSION muss auch auf abgeleitete Tabellen angewendet werden" -#: commands/tablecmds.c:8051 +#: commands/tablecmds.c:8511 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "Generierungsausdruck von vererbter Spalte kann nicht gelöscht werden" -#: commands/tablecmds.c:8090 +#: commands/tablecmds.c:8550 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "Spalte »%s« von Relation »%s« ist keine gespeicherte generierte Spalte" -#: commands/tablecmds.c:8095 +#: commands/tablecmds.c:8555 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "Spalte »%s« von Relation »%s« ist keine gespeicherte generierte Spalte, wird übersprungen" -#: commands/tablecmds.c:8168 +#: commands/tablecmds.c:8633 #, c-format msgid "cannot refer to non-index column by number" msgstr "auf eine Nicht-Index-Spalte kann nicht per Nummer verwiesen werden" -#: commands/tablecmds.c:8211 +#: commands/tablecmds.c:8685 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "Spalte Nummer %d von Relation »%s« existiert nicht" -#: commands/tablecmds.c:8230 +#: commands/tablecmds.c:8704 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "Statistiken von eingeschlossener Spalte »%s« von Index »%s« können nicht geändert werden" -#: commands/tablecmds.c:8235 +#: commands/tablecmds.c:8709 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "kann Statistiken von Spalte »%s« von Index »%s«, welche kein Ausdruck ist, nicht ändern" -#: commands/tablecmds.c:8237 +#: commands/tablecmds.c:8711 #, c-format msgid "Alter statistics on table column instead." msgstr "Ändern Sie stattdessen die Statistiken für die Tabellenspalte." -#: commands/tablecmds.c:8472 +#: commands/tablecmds.c:8957 #, c-format msgid "cannot drop column from typed table" msgstr "aus einer getypten Tabelle können keine Spalten gelöscht werden" -#: commands/tablecmds.c:8531 +#: commands/tablecmds.c:9020 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "Spalte »%s« von Relation »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:8544 +#: commands/tablecmds.c:9033 #, c-format msgid "cannot drop system column \"%s\"" msgstr "Systemspalte »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:8554 +#: commands/tablecmds.c:9043 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "geerbte Spalte »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:8567 +#: commands/tablecmds.c:9056 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "Spalte »%s« kann nicht gelöscht werden, weil sie Teil des Partitionierungsschlüssels von Relation »%s« ist" -#: commands/tablecmds.c:8592 +#: commands/tablecmds.c:9081 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "Spalte kann nicht nur aus der partitionierten Tabelle gelöscht werden, wenn Partitionen existieren" -#: commands/tablecmds.c:8797 +#: commands/tablecmds.c:9286 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX wird für partitionierte Tabellen nicht unterstützt" -#: commands/tablecmds.c:8822 +#: commands/tablecmds.c:9311 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX benennt Index »%s« um in »%s«" -#: commands/tablecmds.c:9159 +#: commands/tablecmds.c:9648 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "ONLY nicht möglich für Fremdschlüssel für partitionierte Tabelle »%s« verweisend auf Relation »%s«" -#: commands/tablecmds.c:9165 +#: commands/tablecmds.c:9654 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "Hinzufügen von Fremdschlüssel mit NOT VALID nicht möglich für partitionierte Tabelle »%s« verweisend auf Relation »%s«" -#: commands/tablecmds.c:9168 +#: commands/tablecmds.c:9657 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Dieses Feature wird für partitionierte Tabellen noch nicht unterstützt." -#: commands/tablecmds.c:9175 commands/tablecmds.c:9631 +#: commands/tablecmds.c:9664 commands/tablecmds.c:10146 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "Relation »%s«, auf die verwiesen wird, ist keine Tabelle" -#: commands/tablecmds.c:9198 +#: commands/tablecmds.c:9687 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "Constraints für permanente Tabellen dürfen nur auf permanente Tabellen verweisen" -#: commands/tablecmds.c:9205 +#: commands/tablecmds.c:9694 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "Constraints für ungeloggte Tabellen dürfen nur auf permanente oder ungeloggte Tabellen verweisen" -#: commands/tablecmds.c:9211 +#: commands/tablecmds.c:9700 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "Constraints für temporäre Tabellen dürfen nur auf temporäre Tabellen verweisen" -#: commands/tablecmds.c:9215 +#: commands/tablecmds.c:9704 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "Constraints für temporäre Tabellen müssen temporäre Tabellen dieser Sitzung beinhalten" -#: commands/tablecmds.c:9279 commands/tablecmds.c:9285 +#: commands/tablecmds.c:9769 commands/tablecmds.c:9775 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "ungültige %s-Aktion für Fremdschlüssel-Constraint, der eine generierte Spalte enthält" -#: commands/tablecmds.c:9301 +#: commands/tablecmds.c:9791 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "Anzahl der Quell- und Zielspalten im Fremdschlüssel stimmt nicht überein" -#: commands/tablecmds.c:9408 +#: commands/tablecmds.c:9898 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "Fremdschlüssel-Constraint »%s« kann nicht implementiert werden" -#: commands/tablecmds.c:9410 +#: commands/tablecmds.c:9900 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Schlüsselspalten »%s« und »%s« haben inkompatible Typen: %s und %s." -#: commands/tablecmds.c:9567 +#: commands/tablecmds.c:10075 #, c-format msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" msgstr "Spalte »%s«, auf die in der ON-DELETE-SET-Aktion verwiesen wird, muss Teil des Fremdschlüssels sein" -#: commands/tablecmds.c:9841 commands/tablecmds.c:10311 -#: parser/parse_utilcmd.c:791 parser/parse_utilcmd.c:920 +#: commands/tablecmds.c:10446 commands/tablecmds.c:10886 +#: parser/parse_utilcmd.c:822 parser/parse_utilcmd.c:945 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "Fremdschlüssel-Constraints auf Fremdtabellen werden nicht unterstützt" -#: commands/tablecmds.c:10864 commands/tablecmds.c:11142 -#: commands/tablecmds.c:12051 commands/tablecmds.c:12126 +#: commands/tablecmds.c:10869 +#, c-format +msgid "cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"" +msgstr "kann Tabelle »%s« nicht als Partition anfügen, weil auf sie von Fremdschlüssel »%s« verwiesen wird" + +#: commands/tablecmds.c:11470 commands/tablecmds.c:11751 +#: commands/tablecmds.c:12663 commands/tablecmds.c:12737 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "Constraint »%s« von Relation »%s« existiert nicht" -#: commands/tablecmds.c:10871 +#: commands/tablecmds.c:11477 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "Constraint »%s« von Relation »%s« ist kein Fremdschlüssel-Constraint" -#: commands/tablecmds.c:10909 +#: commands/tablecmds.c:11515 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "Constraint »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:10912 +#: commands/tablecmds.c:11518 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "Constraint »%s« ist von Constraint »%s« von Relation »%s« abgeleitet." -#: commands/tablecmds.c:10914 +#: commands/tablecmds.c:11520 #, c-format -msgid "You may alter the constraint it derives from, instead." +msgid "You may alter the constraint it derives from instead." msgstr "Sie können stattdessen den Constraint, von dem er abgeleitet ist, ändern." -#: commands/tablecmds.c:11150 +#: commands/tablecmds.c:11759 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "Constraint »%s« von Relation »%s« ist kein Fremdschlüssel- oder Check-Constraint" -#: commands/tablecmds.c:11227 +#: commands/tablecmds.c:11836 #, c-format msgid "constraint must be validated on child tables too" msgstr "Constraint muss ebenso in den abgeleiteten Tabellen validiert werden" -#: commands/tablecmds.c:11314 +#: commands/tablecmds.c:11923 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "Spalte »%s«, die im Fremdschlüssel verwendet wird, existiert nicht" -#: commands/tablecmds.c:11320 +#: commands/tablecmds.c:11929 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "Systemspalten können nicht in Fremdschlüsseln verwendet werden" -#: commands/tablecmds.c:11324 +#: commands/tablecmds.c:11933 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "Fremdschlüssel kann nicht mehr als %d Schlüssel haben" -#: commands/tablecmds.c:11389 +#: commands/tablecmds.c:11998 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "aufschiebbarer Primärschlüssel kann nicht für Tabelle »%s«, auf die verwiesen wird, verwendet werden" -#: commands/tablecmds.c:11406 +#: commands/tablecmds.c:12015 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "in Tabelle »%s«, auf die verwiesen wird, gibt es keinen Primärschlüssel" -#: commands/tablecmds.c:11470 +#: commands/tablecmds.c:12083 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "die Liste der Spalten, auf die ein Fremdschlüssel verweist, darf keine doppelten Einträge enthalten" -#: commands/tablecmds.c:11562 +#: commands/tablecmds.c:12175 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "aufschiebbarer Unique-Constraint kann nicht für Tabelle »%s«, auf die verwiesen wird, verwendet werden" -#: commands/tablecmds.c:11567 +#: commands/tablecmds.c:12180 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "in Tabelle »%s«, auf die verwiesen wird, gibt es keinen Unique-Constraint, der auf die angegebenen Schlüssel passt" -#: commands/tablecmds.c:12007 +#: commands/tablecmds.c:12619 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "geerbter Constraint »%s« von Relation »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:12057 +#: commands/tablecmds.c:12669 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "Constraint »%s« von Relation »%s« existiert nicht, wird übersprungen" -#: commands/tablecmds.c:12233 +#: commands/tablecmds.c:12844 #, c-format msgid "cannot alter column type of typed table" msgstr "Spaltentyp einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:12260 +#: commands/tablecmds.c:12870 +#, c-format +msgid "cannot specify USING when altering type of generated column" +msgstr "USING kann nicht angegeben werden, wenn der Typ einer generierten Spalte geändert wird" + +#: commands/tablecmds.c:12871 commands/tablecmds.c:18082 +#: commands/tablecmds.c:18172 commands/trigger.c:656 +#: rewrite/rewriteHandler.c:941 rewrite/rewriteHandler.c:976 +#, c-format +msgid "Column \"%s\" is a generated column." +msgstr "Spalte »%s« ist eine generierte Spalte." + +#: commands/tablecmds.c:12881 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "kann vererbte Spalte »%s« nicht ändern" -#: commands/tablecmds.c:12269 +#: commands/tablecmds.c:12890 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "Spalte »%s« kann nicht geändert werden, weil sie Teil des Partitionierungsschlüssels von Relation »%s« ist" -#: commands/tablecmds.c:12319 +#: commands/tablecmds.c:12940 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "Ergebnis der USING-Klausel für Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" -#: commands/tablecmds.c:12322 +#: commands/tablecmds.c:12943 #, c-format msgid "You might need to add an explicit cast." msgstr "Sie müssen möglicherweise eine ausdrückliche Typumwandlung hinzufügen." -#: commands/tablecmds.c:12326 +#: commands/tablecmds.c:12947 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:12329 +#: commands/tablecmds.c:12951 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Sie müssen möglicherweise »USING %s::%s« angeben." -#: commands/tablecmds.c:12428 +#: commands/tablecmds.c:13050 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "geerbte Spalte »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:12457 +#: commands/tablecmds.c:13079 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USING-Ausdruck enthält einen Verweis auf die ganze Zeile der Tabelle." -#: commands/tablecmds.c:12468 +#: commands/tablecmds.c:13090 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "Typ der vererbten Spalte »%s« muss ebenso in den abgeleiteten Tabellen geändert werden" -#: commands/tablecmds.c:12593 +#: commands/tablecmds.c:13215 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "Typ der Spalte »%s« kann nicht zweimal geändert werden" -#: commands/tablecmds.c:12631 +#: commands/tablecmds.c:13253 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "Generierungsausdruck der Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" -#: commands/tablecmds.c:12636 +#: commands/tablecmds.c:13258 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "Vorgabewert der Spalte »%s« kann nicht automatisch in Typ %s umgewandelt werden" -#: commands/tablecmds.c:12717 +#: commands/tablecmds.c:13562 #, c-format -msgid "cannot alter type of a column used by a view or rule" -msgstr "Typ einer Spalte, die von einer Sicht oder Regel verwendet wird, kann nicht geändert werden" +msgid "cannot alter type of a column used by a function or procedure" +msgstr "Typ einer Spalte, die von einer Funktion oder Prozedur verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:12718 commands/tablecmds.c:12737 -#: commands/tablecmds.c:12755 +#: commands/tablecmds.c:13563 commands/tablecmds.c:13578 +#: commands/tablecmds.c:13598 commands/tablecmds.c:13617 +#: commands/tablecmds.c:13676 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s hängt von Spalte »%s« ab" -#: commands/tablecmds.c:12736 +#: commands/tablecmds.c:13577 +#, c-format +msgid "cannot alter type of a column used by a view or rule" +msgstr "Typ einer Spalte, die von einer Sicht oder Regel verwendet wird, kann nicht geändert werden" + +#: commands/tablecmds.c:13597 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "Typ einer Spalte, die in einer Trigger-Definition verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:12754 +#: commands/tablecmds.c:13616 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "Typ einer Spalte, die in einer Policy-Definition verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:12785 +#: commands/tablecmds.c:13647 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "Typ einer Spalte, die von einer generierten Spalte verwendet wird, kann nicht geändert werden" -#: commands/tablecmds.c:12786 +#: commands/tablecmds.c:13648 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Spalte »%s« wird von generierter Spalte »%s« verwendet." -#: commands/tablecmds.c:13861 commands/tablecmds.c:13873 +#: commands/tablecmds.c:13675 +#, c-format +msgid "cannot alter type of a column used by a publication WHERE clause" +msgstr "Typ einer Spalte, die in der WHERE-Klausel einer Publikation verwendet wird, kann nicht geändert werden" + +#: commands/tablecmds.c:14510 commands/tablecmds.c:14522 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "kann Eigentümer des Index »%s« nicht ändern" -#: commands/tablecmds.c:13863 commands/tablecmds.c:13875 +#: commands/tablecmds.c:14512 commands/tablecmds.c:14524 #, c-format -msgid "Change the ownership of the index's table, instead." +msgid "Change the ownership of the index's table instead." msgstr "Ändern Sie stattdessen den Eigentümer der Tabelle des Index." -#: commands/tablecmds.c:13889 +#: commands/tablecmds.c:14538 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "kann Eigentümer der Sequenz »%s« nicht ändern" -#: commands/tablecmds.c:13903 commands/tablecmds.c:17175 -#: commands/tablecmds.c:17194 -#, c-format -msgid "Use ALTER TYPE instead." -msgstr "Verwenden Sie stattdessen ALTER TYPE." - -#: commands/tablecmds.c:13912 +#: commands/tablecmds.c:14563 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "kann Eigentümer der Relation »%s« nicht ändern" -#: commands/tablecmds.c:14274 +#: commands/tablecmds.c:15030 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "mehrere SET TABLESPACE Unterbefehle sind ungültig" -#: commands/tablecmds.c:14351 +#: commands/tablecmds.c:15107 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "für Relation »%s« können keine Optionen gesetzt werden" -#: commands/tablecmds.c:14385 commands/view.c:445 +#: commands/tablecmds.c:15141 commands/view.c:440 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION wird nur für automatisch aktualisierbare Sichten unterstützt" -#: commands/tablecmds.c:14635 +#: commands/tablecmds.c:15392 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "nur Tabellen, Indexe und materialisierte Sichten existieren in Tablespaces" -#: commands/tablecmds.c:14647 +#: commands/tablecmds.c:15404 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "Relationen können nicht in den oder aus dem Tablespace »pg_global« verschoben werden" -#: commands/tablecmds.c:14739 +#: commands/tablecmds.c:15496 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "Abbruch weil Sperre für Relation »%s.%s« nicht verfügbar ist" -#: commands/tablecmds.c:14755 +#: commands/tablecmds.c:15512 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "keine passenden Relationen in Tablespace »%s« gefunden" -#: commands/tablecmds.c:14873 +#: commands/tablecmds.c:15634 #, c-format msgid "cannot change inheritance of typed table" msgstr "Vererbung einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:14878 commands/tablecmds.c:15396 +#: commands/tablecmds.c:15639 commands/tablecmds.c:16139 #, c-format msgid "cannot change inheritance of a partition" msgstr "Vererbung einer Partition kann nicht geändert werden" -#: commands/tablecmds.c:14883 +#: commands/tablecmds.c:15644 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "Vererbung einer partitionierten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:14929 +#: commands/tablecmds.c:15690 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "an temporäre Relation einer anderen Sitzung kann nicht vererbt werden" -#: commands/tablecmds.c:14942 +#: commands/tablecmds.c:15703 #, c-format msgid "cannot inherit from a partition" msgstr "von einer Partition kann nicht geerbt werden" -#: commands/tablecmds.c:14964 commands/tablecmds.c:17815 +#: commands/tablecmds.c:15725 commands/tablecmds.c:18583 #, c-format msgid "circular inheritance not allowed" msgstr "zirkuläre Vererbung ist nicht erlaubt" -#: commands/tablecmds.c:14965 commands/tablecmds.c:17816 +#: commands/tablecmds.c:15726 commands/tablecmds.c:18584 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "»%s« ist schon von »%s« abgeleitet." -#: commands/tablecmds.c:14978 +#: commands/tablecmds.c:15739 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "Trigger »%s« verhindert, dass Tabelle »%s« ein Vererbungskind werden kann" -#: commands/tablecmds.c:14980 +#: commands/tablecmds.c:15741 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "ROW-Trigger mit Übergangstabellen werden in Vererbungshierarchien nicht unterstützt." -#: commands/tablecmds.c:15183 +#: commands/tablecmds.c:15930 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "Spalte »%s« in abgeleiteter Tabelle muss als NOT NULL markiert sein" -#: commands/tablecmds.c:15192 +#: commands/tablecmds.c:15939 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "Spalte »%s« in abgeleiteter Tabelle muss eine generierte Spalte sein" -#: commands/tablecmds.c:15197 +#: commands/tablecmds.c:15943 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "Spalte »%s« in abgeleiteter Tabelle darf keine generierte Spalte sein" -#: commands/tablecmds.c:15228 +#: commands/tablecmds.c:15981 #, c-format msgid "child table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:15316 +#: commands/tablecmds.c:16062 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedliche Definition für Check-Constraint »%s«" -#: commands/tablecmds.c:15324 +#: commands/tablecmds.c:16069 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "Constraint »%s« kollidiert mit nicht vererbtem Constraint für abgeleitete Tabelle »%s«" -#: commands/tablecmds.c:15335 +#: commands/tablecmds.c:16079 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "Constraint »%s« kollidiert mit NOT-VALID-Constraint für abgeleitete Tabelle »%s«" -#: commands/tablecmds.c:15374 +#: commands/tablecmds.c:16117 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "Constraint »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:15460 +#: commands/tablecmds.c:16203 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "Partition »%s« hat schon eine unerledigte Abtrennoperation in der partitionierten Tabelle »%s.%s«" -#: commands/tablecmds.c:15489 commands/tablecmds.c:15537 +#: commands/tablecmds.c:16232 commands/tablecmds.c:16278 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "Relation »%s« ist keine Partition von Relation »%s«" -#: commands/tablecmds.c:15543 +#: commands/tablecmds.c:16284 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "Relation »%s« ist keine Basisrelation von Relation »%s«" -#: commands/tablecmds.c:15771 +#: commands/tablecmds.c:16511 #, c-format msgid "typed tables cannot inherit" msgstr "getypte Tabellen können nicht erben" -#: commands/tablecmds.c:15801 +#: commands/tablecmds.c:16541 #, c-format msgid "table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in Tabelle" -#: commands/tablecmds.c:15812 +#: commands/tablecmds.c:16552 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "Tabelle hat Spalte »%s«, aber Typ benötigt »%s«" -#: commands/tablecmds.c:15821 +#: commands/tablecmds.c:16561 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "Tabelle »%s« hat unterschiedlichen Typ für Spalte »%s«" -#: commands/tablecmds.c:15835 +#: commands/tablecmds.c:16575 #, c-format msgid "table has extra column \"%s\"" msgstr "Tabelle hat zusätzliche Spalte »%s«" -#: commands/tablecmds.c:15887 +#: commands/tablecmds.c:16627 #, c-format msgid "\"%s\" is not a typed table" msgstr "»%s« ist keine getypte Tabelle" -#: commands/tablecmds.c:16061 +#: commands/tablecmds.c:16801 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "nicht eindeutiger Index »%s« kann nicht als Replik-Identität verwendet werden" -#: commands/tablecmds.c:16067 +#: commands/tablecmds.c:16807 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "Index »%s« kann nicht als Replik-Identität verwendet werden, weil er nicht IMMEDIATE ist" -#: commands/tablecmds.c:16073 +#: commands/tablecmds.c:16813 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "Ausdrucksindex »%s« kann nicht als Replik-Identität verwendet werden" -#: commands/tablecmds.c:16079 +#: commands/tablecmds.c:16819 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "partieller Index »%s« kann nicht als Replik-Identität verwendet werden" -#: commands/tablecmds.c:16096 +#: commands/tablecmds.c:16836 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "Index »%s« kann nicht als Replik-Identität verwendet werden, weil Spalte %d eine Systemspalte ist" -#: commands/tablecmds.c:16103 +#: commands/tablecmds.c:16843 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "Index »%s« kann nicht als Replik-Identität verwendet werden, weil Spalte »%s« NULL-Werte akzeptiert" -#: commands/tablecmds.c:16348 +#: commands/tablecmds.c:17095 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "kann den geloggten Status der Tabelle »%s« nicht ändern, weil sie temporär ist" -#: commands/tablecmds.c:16372 +#: commands/tablecmds.c:17119 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "kann Tabelle »%s« nicht in ungeloggt ändern, weil sie Teil einer Publikation ist" -#: commands/tablecmds.c:16374 +#: commands/tablecmds.c:17121 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Ungeloggte Relationen können nicht repliziert werden." -#: commands/tablecmds.c:16419 +#: commands/tablecmds.c:17166 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "konnte Tabelle »%s« nicht in geloggt ändern, weil sie auf die ungeloggte Tabelle »%s« verweist" -#: commands/tablecmds.c:16429 +#: commands/tablecmds.c:17176 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "konnte Tabelle »%s« nicht in ungeloggt ändern, weil sie auf die geloggte Tabelle »%s« verweist" -#: commands/tablecmds.c:16487 +#: commands/tablecmds.c:17234 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "einer Tabelle zugeordnete Sequenz kann nicht in ein anderes Schema verschoben werden" -#: commands/tablecmds.c:16594 +#: commands/tablecmds.c:17342 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "Relation »%s« existiert bereits in Schema »%s«" -#: commands/tablecmds.c:17007 +#: commands/tablecmds.c:17767 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "»%s« ist keine Tabelle oder materialisierte Sicht" -#: commands/tablecmds.c:17158 +#: commands/tablecmds.c:17920 #, c-format msgid "\"%s\" is not a composite type" msgstr "»%s« ist kein zusammengesetzter Typ" -#: commands/tablecmds.c:17186 +#: commands/tablecmds.c:17950 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "kann Schema des Index »%s« nicht ändern" -#: commands/tablecmds.c:17188 commands/tablecmds.c:17200 +#: commands/tablecmds.c:17952 commands/tablecmds.c:17966 #, c-format msgid "Change the schema of the table instead." msgstr "Ändern Sie stattdessen das Schema der Tabelle." -#: commands/tablecmds.c:17192 +#: commands/tablecmds.c:17956 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "kann Schema des zusammengesetzten Typs »%s« nicht ändern" -#: commands/tablecmds.c:17198 +#: commands/tablecmds.c:17964 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "kann Schema der TOAST-Tabelle »%s« nicht ändern" -#: commands/tablecmds.c:17230 +#: commands/tablecmds.c:17996 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "Partitionierungsstrategie »list« kann nicht mit mehr als einer Spalte verwendet werden" -#: commands/tablecmds.c:17296 +#: commands/tablecmds.c:18062 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "Spalte »%s«, die im Partitionierungsschlüssel verwendet wird, existiert nicht" -#: commands/tablecmds.c:17304 +#: commands/tablecmds.c:18070 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "Systemspalte »%s« kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:17315 commands/tablecmds.c:17429 +#: commands/tablecmds.c:18081 commands/tablecmds.c:18171 #, c-format msgid "cannot use generated column in partition key" msgstr "generierte Spalte kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:17316 commands/tablecmds.c:17430 commands/trigger.c:663 -#: rewrite/rewriteHandler.c:936 rewrite/rewriteHandler.c:971 +#: commands/tablecmds.c:18154 #, c-format -msgid "Column \"%s\" is a generated column." -msgstr "Spalte »%s« ist eine generierte Spalte." +msgid "partition key expressions cannot contain system column references" +msgstr "Partitionierungsschlüsselausdruck kann nicht auf Systemspalten verweisen" -#: commands/tablecmds.c:17392 +#: commands/tablecmds.c:18201 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "Funktionen im Partitionierungsschlüsselausdruck müssen als IMMUTABLE markiert sein" -#: commands/tablecmds.c:17412 -#, c-format -msgid "partition key expressions cannot contain system column references" -msgstr "Partitionierungsschlüsselausdruck kann nicht auf Systemspalten verweisen" - -#: commands/tablecmds.c:17442 +#: commands/tablecmds.c:18210 #, c-format msgid "cannot use constant expression as partition key" msgstr "Partitionierungsschlüssel kann kein konstanter Ausdruck sein" -#: commands/tablecmds.c:17463 +#: commands/tablecmds.c:18231 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "konnte die für den Partitionierungsausdruck zu verwendende Sortierfolge nicht bestimmen" -#: commands/tablecmds.c:17498 +#: commands/tablecmds.c:18266 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "Sie müssen eine hash-Operatorklasse angeben oder eine hash-Standardoperatorklasse für den Datentyp definieren." -#: commands/tablecmds.c:17504 +#: commands/tablecmds.c:18272 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "Sie müssen eine btree-Operatorklasse angeben oder eine btree-Standardoperatorklasse für den Datentyp definieren." -#: commands/tablecmds.c:17755 +#: commands/tablecmds.c:18523 #, c-format msgid "\"%s\" is already a partition" msgstr "»%s« ist bereits eine Partition" -#: commands/tablecmds.c:17761 +#: commands/tablecmds.c:18529 #, c-format msgid "cannot attach a typed table as partition" msgstr "eine getypte Tabelle kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:17777 +#: commands/tablecmds.c:18545 #, c-format msgid "cannot attach inheritance child as partition" msgstr "ein Vererbungskind kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:17791 +#: commands/tablecmds.c:18559 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "eine Tabelle mit abgeleiteten Tabellen kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:17825 +#: commands/tablecmds.c:18593 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "eine temporäre Relation kann nicht als Partition an permanente Relation »%s« angefügt werden" -#: commands/tablecmds.c:17833 +#: commands/tablecmds.c:18601 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "eine permanente Relation kann nicht als Partition an temporäre Relation »%s« angefügt werden" -#: commands/tablecmds.c:17841 +#: commands/tablecmds.c:18609 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "kann nicht als Partition an temporäre Relation einer anderen Sitzung anfügen" -#: commands/tablecmds.c:17848 +#: commands/tablecmds.c:18616 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "temporäre Relation einer anderen Sitzung kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:17868 +#: commands/tablecmds.c:18636 +#, c-format +msgid "table \"%s\" being attached contains an identity column \"%s\"" +msgstr "anzufügende Tabelle »%s« enthält eine Identitätsspalte »%s«" + +#: commands/tablecmds.c:18638 +#, c-format +msgid "The new partition may not contain an identity column." +msgstr "Die neue Partition darf keine Identitätsspalte enthalten." + +#: commands/tablecmds.c:18646 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "Tabelle »%s« enthält Spalte »%s«, die nicht in der Elterntabelle »%s« gefunden wurde" -#: commands/tablecmds.c:17871 +#: commands/tablecmds.c:18649 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "Die neue Partition darf nur Spalten enthalten, die auch die Elterntabelle hat." -#: commands/tablecmds.c:17883 +#: commands/tablecmds.c:18661 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "Trigger »%s« verhindert, dass Tabelle »%s« eine Partition werden kann" -#: commands/tablecmds.c:17885 +#: commands/tablecmds.c:18663 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "ROW-Trigger mit Übergangstabellen werden für Partitionen nicht unterstützt." -#: commands/tablecmds.c:18064 +#: commands/tablecmds.c:18839 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "kann Fremdtabelle »%s« nicht als Partition an partitionierte Tabelle »%s« anfügen" -#: commands/tablecmds.c:18067 +#: commands/tablecmds.c:18842 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Partitionierte Tabelle »%s« enthält Unique-Indexe." -#: commands/tablecmds.c:18380 +#: commands/tablecmds.c:19164 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "nebenläufiges Abtrennen einer Partition ist nicht möglich, wenn eine Standardpartition existiert" -#: commands/tablecmds.c:18489 +#: commands/tablecmds.c:19273 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "partitionierte Tabelle »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:18495 +#: commands/tablecmds.c:19279 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "Partition »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:19010 commands/tablecmds.c:19030 -#: commands/tablecmds.c:19051 commands/tablecmds.c:19070 -#: commands/tablecmds.c:19112 +#: commands/tablecmds.c:19893 commands/tablecmds.c:19913 +#: commands/tablecmds.c:19934 commands/tablecmds.c:19953 +#: commands/tablecmds.c:19995 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "kann Index »%s« nicht als Partition an Index »%s« anfügen" -#: commands/tablecmds.c:19013 +#: commands/tablecmds.c:19896 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Index »%s« ist bereits an einen anderen Index angefügt." -#: commands/tablecmds.c:19033 +#: commands/tablecmds.c:19916 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Index »%s« ist kein Index irgendeiner Partition von Tabelle »%s«." -#: commands/tablecmds.c:19054 +#: commands/tablecmds.c:19937 #, c-format msgid "The index definitions do not match." msgstr "Die Indexdefinitionen stimmen nicht überein." -#: commands/tablecmds.c:19073 +#: commands/tablecmds.c:19956 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "Der Index »%s« gehört zu einem Constraint in Tabelle »%s«, aber kein Constraint existiert für Index »%s«." -#: commands/tablecmds.c:19115 +#: commands/tablecmds.c:19998 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "Ein anderer Index ist bereits für Partition »%s« angefügt." -#: commands/tablecmds.c:19344 +#: commands/tablecmds.c:20234 #, c-format msgid "column data type %s does not support compression" msgstr "Spaltendatentyp %s unterstützt keine Komprimierung" -#: commands/tablecmds.c:19351 +#: commands/tablecmds.c:20241 #, c-format msgid "invalid compression method \"%s\"" msgstr "ungültige Komprimierungsmethode »%s«" -#: commands/tablecmds.c:19377 +#: commands/tablecmds.c:20267 #, c-format msgid "invalid storage type \"%s\"" msgstr "ungültiger Storage-Typ »%s«" -#: commands/tablecmds.c:19387 +#: commands/tablecmds.c:20277 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "Spaltendatentyp %s kann nur Storage-Typ PLAIN" -#: commands/tablespace.c:199 commands/tablespace.c:650 +#: commands/tablespace.c:193 commands/tablespace.c:644 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "»%s« existiert, ist aber kein Verzeichnis" -#: commands/tablespace.c:230 +#: commands/tablespace.c:224 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "keine Berechtigung, um Tablespace »%s« zu erzeugen" -#: commands/tablespace.c:232 +#: commands/tablespace.c:226 #, c-format msgid "Must be superuser to create a tablespace." msgstr "Nur Superuser können Tablespaces anlegen." -#: commands/tablespace.c:248 +#: commands/tablespace.c:242 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "Tablespace-Pfad darf keine Apostrophe enthalten" -#: commands/tablespace.c:261 +#: commands/tablespace.c:255 #, c-format msgid "tablespace location must be an absolute path" msgstr "Tablespace-Pfad muss ein absoluter Pfad sein" -#: commands/tablespace.c:273 +#: commands/tablespace.c:267 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "Tablespace-Pfad »%s« ist zu lang" -#: commands/tablespace.c:280 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "Tablespace-Pfad sollte nicht innerhalb des Datenverzeichnisses sein" -#: commands/tablespace.c:289 commands/tablespace.c:976 +#: commands/tablespace.c:283 commands/tablespace.c:970 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "inakzeptabler Tablespace-Name »%s«" -#: commands/tablespace.c:291 commands/tablespace.c:977 +#: commands/tablespace.c:285 commands/tablespace.c:971 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "Der Präfix »pg_« ist für System-Tablespaces reserviert." -#: commands/tablespace.c:310 commands/tablespace.c:998 +#: commands/tablespace.c:304 commands/tablespace.c:992 #, c-format msgid "tablespace \"%s\" already exists" msgstr "Tablespace »%s« existiert bereits" -#: commands/tablespace.c:326 +#: commands/tablespace.c:320 #, c-format msgid "pg_tablespace OID value not set when in binary upgrade mode" msgstr "OID-Wert für pg_tablespace ist im Binary-Upgrade-Modus nicht gesetzt" -#: commands/tablespace.c:431 commands/tablespace.c:959 -#: commands/tablespace.c:1048 commands/tablespace.c:1117 -#: commands/tablespace.c:1263 commands/tablespace.c:1466 +#: commands/tablespace.c:425 commands/tablespace.c:953 +#: commands/tablespace.c:1042 commands/tablespace.c:1111 +#: commands/tablespace.c:1257 commands/tablespace.c:1460 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "Tablespace »%s« existiert nicht" -#: commands/tablespace.c:437 +#: commands/tablespace.c:431 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "Tablespace »%s« existiert nicht, wird übersprungen" -#: commands/tablespace.c:463 +#: commands/tablespace.c:457 #, c-format msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" msgstr "kann Tablespace »%s« nicht löschen, weil andere Objekte davon abhängen" -#: commands/tablespace.c:530 +#: commands/tablespace.c:524 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "Tablespace »%s« ist nicht leer" -#: commands/tablespace.c:617 +#: commands/tablespace.c:611 #, c-format msgid "directory \"%s\" does not exist" msgstr "Verzeichnis »%s« existiert nicht" -#: commands/tablespace.c:618 +#: commands/tablespace.c:612 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "Erzeugen Sie dieses Verzeichnis für den Tablespace bevor Sie den Server neu starten." -#: commands/tablespace.c:623 +#: commands/tablespace.c:617 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "konnte Zugriffsrechte für Verzeichnis »%s« nicht setzen: %m" -#: commands/tablespace.c:655 +#: commands/tablespace.c:649 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "Verzeichnis »%s« ist bereits als Tablespace in Verwendung" -#: commands/tablespace.c:833 commands/tablespace.c:919 +#: commands/tablespace.c:827 commands/tablespace.c:913 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht löschen: %m" -#: commands/tablespace.c:842 commands/tablespace.c:927 +#: commands/tablespace.c:836 commands/tablespace.c:921 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "»%s« ist kein Verzeichnis oder symbolische Verknüpfung" -#: commands/tablespace.c:1122 +#: commands/tablespace.c:1116 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "Tablespace »%s« existiert nicht." -#: commands/tablespace.c:1568 +#: commands/tablespace.c:1562 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "Verzeichnisse für Tablespace %u konnten nicht entfernt werden" -#: commands/tablespace.c:1570 +#: commands/tablespace.c:1564 #, c-format msgid "You can remove the directories manually if necessary." msgstr "Sie können die Verzeichnisse falls nötig manuell entfernen." -#: commands/trigger.c:232 commands/trigger.c:243 +#: commands/trigger.c:225 commands/trigger.c:236 #, c-format msgid "\"%s\" is a table" msgstr "»%s« ist eine Tabelle" -#: commands/trigger.c:234 commands/trigger.c:245 +#: commands/trigger.c:227 commands/trigger.c:238 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Tabellen können keine INSTEAD OF-Trigger haben." -#: commands/trigger.c:266 +#: commands/trigger.c:259 #, c-format msgid "\"%s\" is a partitioned table" msgstr "»%s« ist eine partitionierte Tabelle" -#: commands/trigger.c:268 +#: commands/trigger.c:261 #, c-format msgid "ROW triggers with transition tables are not supported on partitioned tables." msgstr "ROW-Trigger mit Übergangstabellen werden für partitionierte Tabellen nicht unterstützt." -#: commands/trigger.c:280 commands/trigger.c:287 commands/trigger.c:451 +#: commands/trigger.c:273 commands/trigger.c:280 commands/trigger.c:444 #, c-format msgid "\"%s\" is a view" msgstr "»%s« ist eine Sicht" -#: commands/trigger.c:282 +#: commands/trigger.c:275 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "Sichten können keine BEFORE- oder AFTER-Trigger auf Zeilenebene haben." -#: commands/trigger.c:289 +#: commands/trigger.c:282 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "Sichten können keine TRUNCATE-Trigger haben." -#: commands/trigger.c:297 commands/trigger.c:309 commands/trigger.c:444 +#: commands/trigger.c:290 commands/trigger.c:302 commands/trigger.c:437 #, c-format msgid "\"%s\" is a foreign table" msgstr "»%s« ist eine Fremdtabelle" -#: commands/trigger.c:299 +#: commands/trigger.c:292 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "Fremdtabellen können keine INSTEAD OF-Trigger haben." -#: commands/trigger.c:311 +#: commands/trigger.c:304 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Fremdtabellen können keine Constraint-Trigger haben." -#: commands/trigger.c:316 commands/trigger.c:1332 commands/trigger.c:1439 +#: commands/trigger.c:309 commands/trigger.c:1325 commands/trigger.c:1432 #, c-format msgid "relation \"%s\" cannot have triggers" msgstr "Relation »%s« kann keine Trigger haben" -#: commands/trigger.c:387 +#: commands/trigger.c:380 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "TRUNCATE FOR EACH ROW-Trigger werden nicht unterstützt" -#: commands/trigger.c:395 +#: commands/trigger.c:388 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "INSTEAD OF-Trigger müssen FOR EACH ROW sein" -#: commands/trigger.c:399 +#: commands/trigger.c:392 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "INSTEAD OF-Trigger können keine WHEN-Bedingungen haben" -#: commands/trigger.c:403 +#: commands/trigger.c:396 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "INSTEAD OF-Trigger können keine Spaltenlisten haben" -#: commands/trigger.c:432 +#: commands/trigger.c:425 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "Benennung von ROW-Variablen in der REFERENCING-Klausel wird nicht unterstützt" -#: commands/trigger.c:433 +#: commands/trigger.c:426 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "Verwenden Sie OLD TABLE und NEW TABLE, um Übergangstabellen zu benennen." -#: commands/trigger.c:446 +#: commands/trigger.c:439 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Trigger für Fremdtabellen können keine Übergangstabellen haben." -#: commands/trigger.c:453 +#: commands/trigger.c:446 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Trigger für Sichten können keine Übergangstabellen haben." -#: commands/trigger.c:469 +#: commands/trigger.c:462 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "ROW-Trigger mit Übergangstabellen werden für Partitionen nicht unterstützt" -#: commands/trigger.c:473 +#: commands/trigger.c:466 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" msgstr "ROW-Trigger mit Übergangstabellen werden für Vererbungskinder nicht unterstützt" -#: commands/trigger.c:479 +#: commands/trigger.c:472 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "Übergangstabellenname kann nur für einen AFTER-Trigger angegeben werden" -#: commands/trigger.c:484 +#: commands/trigger.c:477 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "TRUNCATE-Trigger mit Übergangstabellen werden nicht unterstützt" -#: commands/trigger.c:501 +#: commands/trigger.c:494 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" msgstr "Übergangstabellen können nicht für Trigger mit mehr als einem Ereignis angegeben werden" -#: commands/trigger.c:512 +#: commands/trigger.c:505 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "Übergangstabellen können nicht für Trigger mit Spaltenlisten angegeben werden" -#: commands/trigger.c:529 +#: commands/trigger.c:522 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE kann nur für INSERT- oder UPDATE-Trigger angegeben werden" -#: commands/trigger.c:534 +#: commands/trigger.c:527 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE kann nicht mehrmals angegeben werden" -#: commands/trigger.c:544 +#: commands/trigger.c:537 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE kann nur für DELETE- oder UPDATE-Trigger angegeben werden" -#: commands/trigger.c:549 +#: commands/trigger.c:542 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE kann nicht mehrmals angegeben werden" -#: commands/trigger.c:559 +#: commands/trigger.c:552 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "Name für OLD TABLE und NEW TABLE kann nicht gleich sein" -#: commands/trigger.c:623 commands/trigger.c:636 +#: commands/trigger.c:616 commands/trigger.c:629 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "WHEN-Bedingung eines Statement-Triggers kann keine Verweise auf Spaltenwerte enthalten" -#: commands/trigger.c:628 +#: commands/trigger.c:621 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "WHEN-Bedingung eines INSERT-Triggers kann keine Verweise auf OLD-Werte enthalten" -#: commands/trigger.c:641 +#: commands/trigger.c:634 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "WHEN-Bedingung eines DELETE-Triggers kann keine Verweise auf NEW-Werte enthalten" -#: commands/trigger.c:646 +#: commands/trigger.c:639 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "WHEN-Bedingung eines BEFORE-Triggers kann keine Verweise auf Systemspalten in NEW enthalten" -#: commands/trigger.c:654 commands/trigger.c:662 +#: commands/trigger.c:647 commands/trigger.c:655 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "WHEN-Bedingung eines BEFORE-Triggers kann keine Verweise auf generierte Spalten in NEW enthalten" -#: commands/trigger.c:655 +#: commands/trigger.c:648 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "Ein Verweis auf die ganze Zeile der Tabelle wird verwendet und die Tabelle enthält generierte Spalten." -#: commands/trigger.c:770 commands/trigger.c:1614 +#: commands/trigger.c:763 commands/trigger.c:1607 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "Trigger »%s« für Relation »%s« existiert bereits" -#: commands/trigger.c:783 +#: commands/trigger.c:776 #, c-format msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" msgstr "Trigger »%s« für Relation »%s« ist ein interner oder abgeleiteter Trigger" -#: commands/trigger.c:802 +#: commands/trigger.c:795 #, c-format msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" msgstr "Trigger »%s« für Relation »%s« ist ein Constraint-Trigger" -#: commands/trigger.c:1404 commands/trigger.c:1557 commands/trigger.c:1838 +#: commands/trigger.c:1397 commands/trigger.c:1550 commands/trigger.c:1831 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "Trigger »%s« für Tabelle »%s« existiert nicht" -#: commands/trigger.c:1529 +#: commands/trigger.c:1522 #, c-format msgid "cannot rename trigger \"%s\" on table \"%s\"" msgstr "Trigger »%s« für Tabelle »%s« kann nicht umbenannt werden" -#: commands/trigger.c:1531 +#: commands/trigger.c:1524 #, c-format msgid "Rename the trigger on the partitioned table \"%s\" instead." msgstr "Benennen Sie stattdessen den Trigger für die partitionierte Tabelle »%s« um." -#: commands/trigger.c:1631 +#: commands/trigger.c:1624 #, c-format msgid "renamed trigger \"%s\" on relation \"%s\"" msgstr "Trigger »%s« für Tabelle »%s« wurde umbenannt" -#: commands/trigger.c:1777 +#: commands/trigger.c:1770 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "keine Berechtigung: »%s« ist ein Systemtrigger" -#: commands/trigger.c:2386 +#: commands/trigger.c:2379 #, c-format msgid "trigger function %u returned null value" msgstr "Triggerfunktion %u gab NULL-Wert zurück" -#: commands/trigger.c:2446 commands/trigger.c:2664 commands/trigger.c:2917 -#: commands/trigger.c:3252 +#: commands/trigger.c:2439 commands/trigger.c:2657 commands/trigger.c:2910 +#: commands/trigger.c:3263 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "Trigger für BEFORE STATEMENT kann keinen Wert zurückgeben" -#: commands/trigger.c:2522 +#: commands/trigger.c:2515 #, c-format msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" msgstr "Verschieben einer Zeile in eine andere Partition durch einen BEFORE-FOR-EACH-ROW-Trigger wird nicht unterstützt" -#: commands/trigger.c:2523 +#: commands/trigger.c:2516 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "Vor der Ausführung von Trigger »%s« gehörte die Zeile in Partition »%s.%s«." -#: commands/trigger.c:3329 executor/nodeModifyTable.c:2363 -#: executor/nodeModifyTable.c:2446 -#, c-format -msgid "tuple to be updated was already modified by an operation triggered by the current command" -msgstr "das zu aktualisierende Tupel wurde schon durch eine vom aktuellen Befehl ausgelöste Operation verändert" - -#: commands/trigger.c:3330 executor/nodeModifyTable.c:1531 -#: executor/nodeModifyTable.c:1605 executor/nodeModifyTable.c:2364 -#: executor/nodeModifyTable.c:2447 executor/nodeModifyTable.c:3077 +#: commands/trigger.c:3341 executor/nodeModifyTable.c:1561 +#: executor/nodeModifyTable.c:1635 executor/nodeModifyTable.c:2397 +#: executor/nodeModifyTable.c:2488 executor/nodeModifyTable.c:3152 +#: executor/nodeModifyTable.c:3322 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "Verwenden Sie einen AFTER-Trigger anstelle eines BEFORE-Triggers, um Änderungen an andere Zeilen zu propagieren." -#: commands/trigger.c:3371 executor/nodeLockRows.c:228 -#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:308 -#: executor/nodeModifyTable.c:1547 executor/nodeModifyTable.c:2381 -#: executor/nodeModifyTable.c:2589 +#: commands/trigger.c:3382 executor/nodeLockRows.c:228 +#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:334 +#: executor/nodeModifyTable.c:1577 executor/nodeModifyTable.c:2414 +#: executor/nodeModifyTable.c:2638 #, c-format msgid "could not serialize access due to concurrent update" msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitiger Aktualisierung" -#: commands/trigger.c:3379 executor/nodeModifyTable.c:1637 -#: executor/nodeModifyTable.c:2464 executor/nodeModifyTable.c:2613 -#: executor/nodeModifyTable.c:2965 +#: commands/trigger.c:3390 executor/nodeModifyTable.c:1667 +#: executor/nodeModifyTable.c:2505 executor/nodeModifyTable.c:2662 +#: executor/nodeModifyTable.c:3170 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitigem Löschen" -#: commands/trigger.c:4555 +#: commands/trigger.c:4599 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "aufgeschobener Trigger kann nicht in einer sicherheitsbeschränkten Operation ausgelöst werden" -#: commands/trigger.c:5738 +#: commands/trigger.c:5780 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "Constraint »%s« ist nicht aufschiebbar" -#: commands/trigger.c:5761 +#: commands/trigger.c:5803 #, c-format msgid "constraint \"%s\" does not exist" msgstr "Constraint »%s« existiert nicht" -#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:635 +#: commands/tsearchcmds.c:124 commands/tsearchcmds.c:641 #, c-format msgid "function %s should return type %s" msgstr "Funktion %s sollte Rückgabetyp %s haben" -#: commands/tsearchcmds.c:194 +#: commands/tsearchcmds.c:200 #, c-format msgid "must be superuser to create text search parsers" msgstr "nur Superuser können Textsucheparser anlegen" -#: commands/tsearchcmds.c:247 +#: commands/tsearchcmds.c:253 #, c-format msgid "text search parser parameter \"%s\" not recognized" msgstr "Textsucheparserparameter »%s« nicht erkannt" -#: commands/tsearchcmds.c:257 +#: commands/tsearchcmds.c:263 #, c-format msgid "text search parser start method is required" msgstr "Textsucheparserstartmethode muss angegeben werden" -#: commands/tsearchcmds.c:262 +#: commands/tsearchcmds.c:268 #, c-format msgid "text search parser gettoken method is required" msgstr "Gettoken-Methode für Textsucheparser muss angegeben werden" -#: commands/tsearchcmds.c:267 +#: commands/tsearchcmds.c:273 #, c-format msgid "text search parser end method is required" msgstr "Textsucheparserendemethode muss angegeben werden" -#: commands/tsearchcmds.c:272 +#: commands/tsearchcmds.c:278 #, c-format msgid "text search parser lextypes method is required" msgstr "Lextypes-Methode für Textsucheparser muss angegeben werden" -#: commands/tsearchcmds.c:366 +#: commands/tsearchcmds.c:372 #, c-format msgid "text search template \"%s\" does not accept options" msgstr "Textsuchevorlage »%s« akzeptiert keine Optionen" -#: commands/tsearchcmds.c:440 +#: commands/tsearchcmds.c:446 #, c-format msgid "text search template is required" msgstr "Textsuchevorlage muss angegeben werden" -#: commands/tsearchcmds.c:701 +#: commands/tsearchcmds.c:707 #, c-format msgid "must be superuser to create text search templates" msgstr "nur Superuser können Textsuchevorlagen erzeugen" -#: commands/tsearchcmds.c:743 +#: commands/tsearchcmds.c:749 #, c-format msgid "text search template parameter \"%s\" not recognized" msgstr "Textsuchevorlageparameter »%s« nicht erkannt" -#: commands/tsearchcmds.c:753 +#: commands/tsearchcmds.c:759 #, c-format msgid "text search template lexize method is required" msgstr "Lexize-Methode für Textsuchevorlage muss angegeben werden" -#: commands/tsearchcmds.c:933 +#: commands/tsearchcmds.c:939 #, c-format msgid "text search configuration parameter \"%s\" not recognized" msgstr "Textsuchekonfigurationsparameter »%s« nicht erkannt" -#: commands/tsearchcmds.c:940 +#: commands/tsearchcmds.c:946 #, c-format msgid "cannot specify both PARSER and COPY options" msgstr "Optionen PARSER und COPY können nicht beide angegeben werden" -#: commands/tsearchcmds.c:976 +#: commands/tsearchcmds.c:982 #, c-format msgid "text search parser is required" msgstr "Textsucheparser muss angegeben werden" -#: commands/tsearchcmds.c:1241 +#: commands/tsearchcmds.c:1277 #, c-format msgid "token type \"%s\" does not exist" msgstr "Tokentyp »%s« existiert nicht" -#: commands/tsearchcmds.c:1501 +#: commands/tsearchcmds.c:1540 #, c-format msgid "mapping for token type \"%s\" does not exist" msgstr "Mapping für Tokentyp »%s« existiert nicht" -#: commands/tsearchcmds.c:1507 +#: commands/tsearchcmds.c:1546 #, c-format msgid "mapping for token type \"%s\" does not exist, skipping" msgstr "Mapping für Tokentyp »%s« existiert nicht, wird übersprungen" -#: commands/tsearchcmds.c:1670 commands/tsearchcmds.c:1785 +#: commands/tsearchcmds.c:1707 commands/tsearchcmds.c:1822 #, c-format msgid "invalid parameter list format: \"%s\"" msgstr "ungültiges Parameterlistenformat: »%s«" -#: commands/typecmds.c:217 +#: commands/typecmds.c:221 #, c-format msgid "must be superuser to create a base type" msgstr "nur Superuser können Basistypen anlegen" -#: commands/typecmds.c:275 +#: commands/typecmds.c:279 #, c-format msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." msgstr "Erzeugen Sie den Typ als Shell-Typ, legen Sie dann die I/O-Funktionen an und führen Sie dann das volle CREATE TYPE aus." -#: commands/typecmds.c:327 commands/typecmds.c:1450 commands/typecmds.c:4257 +#: commands/typecmds.c:331 commands/typecmds.c:1460 commands/typecmds.c:4480 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "Typ-Attribut »%s« nicht erkannt" -#: commands/typecmds.c:382 +#: commands/typecmds.c:386 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "ungültige Typenkategorie »%s«: muss einfacher ASCII-Wert sein" -#: commands/typecmds.c:401 +#: commands/typecmds.c:405 #, c-format msgid "array element type cannot be %s" msgstr "Arrayelementtyp kann nicht %s sein" -#: commands/typecmds.c:433 +#: commands/typecmds.c:437 #, c-format msgid "alignment \"%s\" not recognized" msgstr "Ausrichtung »%s« nicht erkannt" -#: commands/typecmds.c:450 commands/typecmds.c:4131 +#: commands/typecmds.c:454 commands/typecmds.c:4354 #, c-format msgid "storage \"%s\" not recognized" msgstr "Storage-Typ »%s« nicht erkannt" -#: commands/typecmds.c:461 +#: commands/typecmds.c:465 #, c-format msgid "type input function must be specified" msgstr "Typeingabefunktion muss angegeben werden" -#: commands/typecmds.c:465 +#: commands/typecmds.c:469 #, c-format msgid "type output function must be specified" msgstr "Typausgabefunktion muss angegeben werden" -#: commands/typecmds.c:470 +#: commands/typecmds.c:474 #, c-format msgid "type modifier output function is useless without a type modifier input function" msgstr "Typmodifikatorausgabefunktion ist nutzlos ohne Typmodifikatoreingabefunktion" -#: commands/typecmds.c:512 +#: commands/typecmds.c:516 #, c-format msgid "element type cannot be specified without a subscripting function" msgstr "Elementtyp kann nicht ohne eine Subscript-Funktion angeben werden" -#: commands/typecmds.c:781 +#: commands/typecmds.c:785 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "»%s« ist kein gültiger Basistyp für eine Domäne" -#: commands/typecmds.c:879 +#: commands/typecmds.c:883 #, c-format msgid "multiple default expressions" msgstr "mehrere Vorgabeausdrücke" -#: commands/typecmds.c:942 commands/typecmds.c:951 +#: commands/typecmds.c:946 commands/typecmds.c:955 #, c-format msgid "conflicting NULL/NOT NULL constraints" msgstr "wiedersprüchliche NULL/NOT NULL-Constraints" -#: commands/typecmds.c:967 +#: commands/typecmds.c:971 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "Check-Constraints für Domänen können nicht als NO INHERIT markiert werden" -#: commands/typecmds.c:976 commands/typecmds.c:2956 +#: commands/typecmds.c:980 commands/typecmds.c:2940 #, c-format msgid "unique constraints not possible for domains" msgstr "Unique-Constraints sind nicht für Domänen möglich" -#: commands/typecmds.c:982 commands/typecmds.c:2962 +#: commands/typecmds.c:986 commands/typecmds.c:2946 #, c-format msgid "primary key constraints not possible for domains" msgstr "Primärschlüssel-Constraints sind nicht fürDomänen möglich" -#: commands/typecmds.c:988 commands/typecmds.c:2968 +#: commands/typecmds.c:992 commands/typecmds.c:2952 #, c-format msgid "exclusion constraints not possible for domains" msgstr "Exclusion-Constraints sind nicht für Domänen möglich" -#: commands/typecmds.c:994 commands/typecmds.c:2974 +#: commands/typecmds.c:998 commands/typecmds.c:2958 #, c-format msgid "foreign key constraints not possible for domains" msgstr "Fremdschlüssel-Constraints sind nicht für Domänen möglich" -#: commands/typecmds.c:1003 commands/typecmds.c:2983 +#: commands/typecmds.c:1007 commands/typecmds.c:2967 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "Setzen des Constraint-Modus wird für Domänen nicht unterstützt" -#: commands/typecmds.c:1317 utils/cache/typcache.c:2561 +#: commands/typecmds.c:1327 utils/cache/typcache.c:2570 #, c-format msgid "%s is not an enum" msgstr "»%s« ist kein Enum" -#: commands/typecmds.c:1458 +#: commands/typecmds.c:1468 #, c-format msgid "type attribute \"subtype\" is required" msgstr "Typ-Attribut »subtype« muss angegeben werden" -#: commands/typecmds.c:1463 +#: commands/typecmds.c:1473 #, c-format msgid "range subtype cannot be %s" msgstr "Bereichtsuntertyp kann nicht %s sein" -#: commands/typecmds.c:1482 +#: commands/typecmds.c:1492 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "Sortierfolge für Bereichstyp angegeben, aber Untertyp unterstützt keine Sortierfolgen" -#: commands/typecmds.c:1492 +#: commands/typecmds.c:1502 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "Canonical-Funktion kann nicht angegeben werden ohne einen vorher angelegten Shell-Typ" -#: commands/typecmds.c:1493 +#: commands/typecmds.c:1503 #, c-format msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." msgstr "Erzeugen Sie den Typ als Shell-Typ, legen Sie dann die Canonicalization-Funktion an und führen Sie dann das volle CREATE TYPE aus." -#: commands/typecmds.c:1965 +#: commands/typecmds.c:1975 #, c-format msgid "type input function %s has multiple matches" msgstr "Typeingabefunktion %s hat mehrere Übereinstimmungen" -#: commands/typecmds.c:1983 +#: commands/typecmds.c:1993 #, c-format msgid "type input function %s must return type %s" msgstr "Typeingabefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:1999 +#: commands/typecmds.c:2009 #, c-format msgid "type input function %s should not be volatile" msgstr "Typeingabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2027 +#: commands/typecmds.c:2037 #, c-format msgid "type output function %s must return type %s" msgstr "Typausgabefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2034 +#: commands/typecmds.c:2044 #, c-format msgid "type output function %s should not be volatile" msgstr "Typausgabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2063 +#: commands/typecmds.c:2073 #, c-format msgid "type receive function %s has multiple matches" msgstr "Typempfangsfunktion %s hat mehrere Übereinstimmungen" -#: commands/typecmds.c:2081 +#: commands/typecmds.c:2091 #, c-format msgid "type receive function %s must return type %s" msgstr "Typempfangsfunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2088 +#: commands/typecmds.c:2098 #, c-format msgid "type receive function %s should not be volatile" msgstr "Typempfangsfunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2116 +#: commands/typecmds.c:2126 #, c-format msgid "type send function %s must return type %s" msgstr "Typsendefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2123 +#: commands/typecmds.c:2133 #, c-format msgid "type send function %s should not be volatile" msgstr "Typsendefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2150 +#: commands/typecmds.c:2160 #, c-format msgid "typmod_in function %s must return type %s" msgstr "typmod_in-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2157 +#: commands/typecmds.c:2167 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "Typmodifikatoreingabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2184 +#: commands/typecmds.c:2194 #, c-format msgid "typmod_out function %s must return type %s" msgstr "typmod_out-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2191 +#: commands/typecmds.c:2201 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "Typmodifikatorausgabefunktion %s sollte nicht VOLATILE sein" -#: commands/typecmds.c:2218 +#: commands/typecmds.c:2228 #, c-format msgid "type analyze function %s must return type %s" msgstr "Typanalysefunktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2247 +#: commands/typecmds.c:2257 #, c-format msgid "type subscripting function %s must return type %s" msgstr "Typ-Subscript-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2257 +#: commands/typecmds.c:2267 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "benutzerdefinierte Typen können Subscript-Funktion %s nicht verwenden" -#: commands/typecmds.c:2303 +#: commands/typecmds.c:2313 #, c-format msgid "You must specify an operator class for the range type or define a default operator class for the subtype." msgstr "Sie müssen für den Bereichstyp eine Operatorklasse angeben oder eine Standardoperatorklasse für den Untertyp definieren." -#: commands/typecmds.c:2334 +#: commands/typecmds.c:2344 #, c-format msgid "range canonical function %s must return range type" msgstr "Bereichstyp-Canonical-Funktion %s muss Bereichstyp zurückgeben" -#: commands/typecmds.c:2340 +#: commands/typecmds.c:2350 #, c-format msgid "range canonical function %s must be immutable" msgstr "Bereichstyp-Canonical-Funktion %s muss »immutable« sein" -#: commands/typecmds.c:2376 +#: commands/typecmds.c:2386 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "Bereichstyp-Untertyp-Diff-Funktion %s muss Typ %s zurückgeben" -#: commands/typecmds.c:2383 +#: commands/typecmds.c:2393 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "Bereichstyp-Untertyp-Diff-Funktion %s muss »immutable« sein" -#: commands/typecmds.c:2410 +#: commands/typecmds.c:2420 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "Array-OID-Wert für pg_type ist im Binary-Upgrade-Modus nicht gesetzt" -#: commands/typecmds.c:2443 +#: commands/typecmds.c:2453 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "Multirange-OID-Wert für pg_type ist im Binary-Upgrade-Modus nicht gesetzt" -#: commands/typecmds.c:2476 +#: commands/typecmds.c:2486 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "Multirange-Array-OID-Wert für pg_type ist im Binary-Upgrade-Modus nicht gesetzt" -#: commands/typecmds.c:2772 -#, c-format -msgid "column \"%s\" of table \"%s\" contains null values" -msgstr "Spalte »%s« von Tabelle »%s« enthält NULL-Werte" - -#: commands/typecmds.c:2885 commands/typecmds.c:3086 +#: commands/typecmds.c:2868 commands/typecmds.c:3093 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "Constraint »%s« von Domäne »%s« existiert nicht" -#: commands/typecmds.c:2889 +#: commands/typecmds.c:2872 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "Constraint »%s« von Domäne »%s« existiert nicht, wird übersprungen" -#: commands/typecmds.c:3093 +#: commands/typecmds.c:3100 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "Constraint »%s« von Domäne »%s« ist kein Check-Constraint" -#: commands/typecmds.c:3194 +#: commands/typecmds.c:3180 +#, c-format +msgid "column \"%s\" of table \"%s\" contains null values" +msgstr "Spalte »%s« von Tabelle »%s« enthält NULL-Werte" + +#: commands/typecmds.c:3269 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "Spalte »%s« von Tabelle »%s« enthält Werte, die den neuen Constraint verletzen" -#: commands/typecmds.c:3423 commands/typecmds.c:3622 commands/typecmds.c:3703 -#: commands/typecmds.c:3889 +#: commands/typecmds.c:3498 commands/typecmds.c:3772 commands/typecmds.c:3857 +#: commands/typecmds.c:4073 #, c-format msgid "%s is not a domain" msgstr "%s ist keine Domäne" -#: commands/typecmds.c:3455 +#: commands/typecmds.c:3532 commands/typecmds.c:3686 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "Constraint »%s« für Domäne »%s« existiert bereits" -#: commands/typecmds.c:3506 +#: commands/typecmds.c:3583 #, c-format msgid "cannot use table references in domain check constraint" msgstr "Tabellenverweise können in Domänen-Check-Constraints nicht verwendet werden" -#: commands/typecmds.c:3634 commands/typecmds.c:3715 commands/typecmds.c:4006 +#: commands/typecmds.c:3784 commands/typecmds.c:3869 commands/typecmds.c:4223 #, c-format msgid "%s is a table's row type" msgstr "%s ist der Zeilentyp einer Tabelle" -#: commands/typecmds.c:3636 commands/typecmds.c:3717 commands/typecmds.c:4008 -#, c-format -msgid "Use ALTER TABLE instead." -msgstr "Verwenden Sie stattdessen ALTER TABLE." - -#: commands/typecmds.c:3642 commands/typecmds.c:3723 commands/typecmds.c:3921 +#: commands/typecmds.c:3794 commands/typecmds.c:3879 commands/typecmds.c:4121 #, c-format msgid "cannot alter array type %s" msgstr "Array-Typ %s kann nicht verändert werden" -#: commands/typecmds.c:3644 commands/typecmds.c:3725 commands/typecmds.c:3923 +#: commands/typecmds.c:3796 commands/typecmds.c:3881 commands/typecmds.c:4123 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "Sie können den Typ %s ändern, wodurch der Array-Typ ebenfalls geändert wird." -#: commands/typecmds.c:3991 +#: commands/typecmds.c:3892 +#, c-format +msgid "cannot alter multirange type %s" +msgstr "Multirange-Typ %s kann nicht verändert werden" + +#: commands/typecmds.c:3895 +#, c-format +msgid "You can alter type %s, which will alter the multirange type as well." +msgstr "Sie können den Typ %s ändern, wodurch der Multirange-Typ ebenfalls geändert wird." + +#: commands/typecmds.c:4202 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "Typ %s existiert bereits in Schema »%s«" -#: commands/typecmds.c:4159 +#: commands/typecmds.c:4382 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "Storage-Typ eines Typs kann nicht in PLAIN geändert werden" -#: commands/typecmds.c:4252 +#: commands/typecmds.c:4475 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "Typ-Attribut »%s« kann nicht geändert werden" -#: commands/typecmds.c:4270 +#: commands/typecmds.c:4493 #, c-format msgid "must be superuser to alter a type" msgstr "nur Superuser können Typen ändern" -#: commands/typecmds.c:4291 commands/typecmds.c:4300 +#: commands/typecmds.c:4514 commands/typecmds.c:4523 #, c-format msgid "%s is not a base type" msgstr "%s ist kein Basistyp" -#: commands/user.c:201 +#: commands/user.c:200 #, c-format msgid "SYSID can no longer be specified" msgstr "SYSID kann nicht mehr angegeben werden" -#: commands/user.c:319 commands/user.c:325 commands/user.c:331 -#: commands/user.c:337 commands/user.c:343 +#: commands/user.c:318 commands/user.c:324 commands/user.c:330 +#: commands/user.c:336 commands/user.c:342 #, c-format msgid "permission denied to create role" msgstr "keine Berechtigung, um Rolle zu erzeugen" -#: commands/user.c:320 +#: commands/user.c:319 #, c-format msgid "Only roles with the %s attribute may create roles." msgstr "Nur Rollen mit dem %s-Attribut können Rollen erzeugen." -#: commands/user.c:326 commands/user.c:332 commands/user.c:338 -#: commands/user.c:344 +#: commands/user.c:325 commands/user.c:331 commands/user.c:337 +#: commands/user.c:343 #, c-format -msgid "Only roles with the %s attribute may create roles with %s." +msgid "Only roles with the %s attribute may create roles with the %s attribute." msgstr "Nur Rollen mit dem %s-Attribut können Rollen mit dem %s-Attribut erzeugen." -#: commands/user.c:355 commands/user.c:1393 commands/user.c:1400 gram.y:16727 -#: gram.y:16773 utils/adt/acl.c:5409 utils/adt/acl.c:5415 +#: commands/user.c:354 commands/user.c:1386 commands/user.c:1393 gram.y:17310 +#: gram.y:17356 utils/adt/acl.c:5574 utils/adt/acl.c:5580 #, c-format msgid "role name \"%s\" is reserved" msgstr "Rollenname »%s« ist reserviert" -#: commands/user.c:357 commands/user.c:1395 commands/user.c:1402 +#: commands/user.c:356 commands/user.c:1388 commands/user.c:1395 #, c-format msgid "Role names starting with \"pg_\" are reserved." msgstr "Rollennamen, die mit »pg_« anfangen, sind reserviert." -#: commands/user.c:378 commands/user.c:1417 +#: commands/user.c:377 commands/user.c:1410 #, c-format msgid "role \"%s\" already exists" msgstr "Rolle »%s« existiert bereits" -#: commands/user.c:440 commands/user.c:925 +#: commands/user.c:439 commands/user.c:924 #, c-format msgid "empty string is not a valid password, clearing password" msgstr "leere Zeichenkette ist kein gültiges Passwort, Passwort wird entfernt" -#: commands/user.c:469 +#: commands/user.c:468 #, c-format msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "OID-Wert für pg_auth ist im Binary-Upgrade-Modus nicht gesetzt" -#: commands/user.c:653 commands/user.c:1011 +#: commands/user.c:652 commands/user.c:1010 msgid "Cannot alter reserved roles." msgstr "Reservierte Rollen können nicht geändert werden." -#: commands/user.c:760 commands/user.c:766 commands/user.c:782 -#: commands/user.c:790 commands/user.c:804 commands/user.c:810 -#: commands/user.c:816 commands/user.c:825 commands/user.c:870 -#: commands/user.c:1033 commands/user.c:1044 +#: commands/user.c:759 commands/user.c:765 commands/user.c:781 +#: commands/user.c:789 commands/user.c:803 commands/user.c:809 +#: commands/user.c:815 commands/user.c:824 commands/user.c:869 +#: commands/user.c:1032 commands/user.c:1043 #, c-format msgid "permission denied to alter role" msgstr "keine Berechtigung, um Rolle zu ändern" -#: commands/user.c:761 commands/user.c:1034 +#: commands/user.c:760 commands/user.c:1033 #, c-format -msgid "Only roles with the %s attribute may alter roles with %s." +msgid "Only roles with the %s attribute may alter roles with the %s attribute." msgstr "Nur Rollen mit dem %s-Attribut können Rollen mit dem %s-Attribut ändern." -#: commands/user.c:767 commands/user.c:805 commands/user.c:811 -#: commands/user.c:817 +#: commands/user.c:766 commands/user.c:804 commands/user.c:810 +#: commands/user.c:816 #, c-format msgid "Only roles with the %s attribute may change the %s attribute." msgstr "Nur Rollen mit dem %s-Attribut können das %s-Attribut ändern." -#: commands/user.c:783 commands/user.c:1045 +#: commands/user.c:782 commands/user.c:1044 #, c-format msgid "Only roles with the %s attribute and the %s option on role \"%s\" may alter this role." msgstr "Nur Rollen mit dem %s-Attribut und der %s-Option für Rolle »%s« können diese Rolle ändern." -#: commands/user.c:791 +#: commands/user.c:790 #, c-format msgid "To change another role's password, the current user must have the %s attribute and the %s option on the role." msgstr "Um das Passwort einer anderen Rolle zu ändern, muss der aktuelle Benutzer das %s-Attribut und die %s-Option für die Rolle haben." -#: commands/user.c:826 +#: commands/user.c:825 #, c-format -msgid "Only roles with the %s option on role \"%s\" may add members." -msgstr "Nur Rollen mit der %s-Option für Rolle »%s« können Mitglieder hinzufügen." +msgid "Only roles with the %s option on role \"%s\" may add or drop members." +msgstr "Nur Rollen mit der %s-Option für Rolle »%s« können Mitglieder hinzufügen oder entfernen." -#: commands/user.c:871 +#: commands/user.c:870 #, c-format -msgid "The bootstrap user must have the %s attribute." -msgstr "Der Bootstrap-Benutzer muss das %s-Attribut haben." +msgid "The bootstrap superuser must have the %s attribute." +msgstr "Der Bootstrap-Superuser muss das %s-Attribut haben." -#: commands/user.c:1076 +#: commands/user.c:1075 #, c-format msgid "permission denied to alter setting" msgstr "keine Berechtigung, um Einstellung zu ändern" -#: commands/user.c:1077 +#: commands/user.c:1076 #, c-format msgid "Only roles with the %s attribute may alter settings globally." msgstr "Nur Rollen mit dem %s-Attribut können globale Einstellungen ändern." -#: commands/user.c:1101 commands/user.c:1173 commands/user.c:1179 +#: commands/user.c:1100 commands/user.c:1171 commands/user.c:1177 #, c-format msgid "permission denied to drop role" msgstr "keine Berechtigung, um Rolle zu entfernen" -#: commands/user.c:1102 +#: commands/user.c:1101 #, c-format msgid "Only roles with the %s attribute and the %s option on the target roles may drop roles." msgstr "Nur Rollen mit dem %s-Attribut und der %s-Option für die Zielrollen können Rollen entfernen." -#: commands/user.c:1127 +#: commands/user.c:1125 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "in DROP ROLE kann kein Rollenplatzhalter verwendet werden" -#: commands/user.c:1137 commands/user.c:1364 commands/variable.c:836 -#: commands/variable.c:839 commands/variable.c:923 commands/variable.c:926 -#: utils/adt/acl.c:359 utils/adt/acl.c:379 utils/adt/acl.c:5264 -#: utils/adt/acl.c:5312 utils/adt/acl.c:5340 utils/adt/acl.c:5359 -#: utils/adt/regproc.c:1551 utils/init/miscinit.c:757 +#: commands/user.c:1135 commands/user.c:1357 commands/variable.c:851 +#: commands/variable.c:854 commands/variable.c:971 commands/variable.c:974 +#: utils/adt/acl.c:365 utils/adt/acl.c:385 utils/adt/acl.c:5429 +#: utils/adt/acl.c:5477 utils/adt/acl.c:5505 utils/adt/acl.c:5524 +#: utils/adt/regproc.c:1571 utils/init/miscinit.c:799 #, c-format msgid "role \"%s\" does not exist" msgstr "Rolle »%s« existiert nicht" -#: commands/user.c:1142 +#: commands/user.c:1140 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "Rolle »%s« existiert nicht, wird übersprungen" -#: commands/user.c:1155 commands/user.c:1159 +#: commands/user.c:1153 commands/user.c:1157 #, c-format msgid "current user cannot be dropped" msgstr "aktueller Benutzer kann nicht entfernt werden" -#: commands/user.c:1163 +#: commands/user.c:1161 #, c-format msgid "session user cannot be dropped" msgstr "aktueller Sitzungsbenutzer kann nicht entfernt werden" -#: commands/user.c:1174 +#: commands/user.c:1172 #, c-format -msgid "Only roles with the %s attribute may drop roles with %s." +msgid "Only roles with the %s attribute may drop roles with the %s attribute." msgstr "Nur Rollen mit dem %s-Attribut können Rollen mit dem %s-Attribut entfernen." -#: commands/user.c:1180 +#: commands/user.c:1178 #, c-format msgid "Only roles with the %s attribute and the %s option on role \"%s\" may drop this role." msgstr "Nur Rollen mit dem %s-Attribut und der %s-Option für Rolle »%s« können diese Rolle entfernen." -#: commands/user.c:1306 +#: commands/user.c:1299 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "kann Rolle »%s« nicht löschen, weil andere Objekte davon abhängen" -#: commands/user.c:1380 +#: commands/user.c:1373 #, c-format msgid "session user cannot be renamed" msgstr "aktueller Sitzungsbenutzer kann nicht umbenannt werden" -#: commands/user.c:1384 +#: commands/user.c:1377 #, c-format msgid "current user cannot be renamed" msgstr "aktueller Benutzer kann nicht umbenannt werden" -#: commands/user.c:1428 commands/user.c:1438 +#: commands/user.c:1421 commands/user.c:1431 #, c-format msgid "permission denied to rename role" msgstr "keine Berechtigung, um Rolle umzubenennen" -#: commands/user.c:1429 +#: commands/user.c:1422 #, c-format -msgid "Only roles with the %s attribute may rename roles with %s." +msgid "Only roles with the %s attribute may rename roles with the %s attribute." msgstr "Nur Rollen mit dem %s-Attribut können Rollen mit dem %s-Attribut umbenennen." -#: commands/user.c:1439 +#: commands/user.c:1432 #, c-format msgid "Only roles with the %s attribute and the %s option on role \"%s\" may rename this role." msgstr "Nur Rollen mit dem %s-Attribut und der %s-Option für Rolle »%s« können diese Rolle umbenennen." -#: commands/user.c:1461 +#: commands/user.c:1454 #, c-format msgid "MD5 password cleared because of role rename" msgstr "MD5-Passwort wegen Rollenumbenennung gelöscht" -#: commands/user.c:1525 gram.y:1263 +#: commands/user.c:1518 gram.y:1294 #, c-format msgid "unrecognized role option \"%s\"" msgstr "unbekannte Rollenoption »%s«" -#: commands/user.c:1530 +#: commands/user.c:1523 #, c-format msgid "unrecognized value for role option \"%s\": \"%s\"" msgstr "unbekannter Wert für Rollenoption »%s«: »%s«" -#: commands/user.c:1563 +#: commands/user.c:1556 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "bei GRANT/REVOKE ROLE können keine Spaltennamen angegeben werden" -#: commands/user.c:1603 +#: commands/user.c:1596 #, c-format msgid "permission denied to drop objects" msgstr "keine Berechtigung, um Objekte zu löschen" -#: commands/user.c:1604 +#: commands/user.c:1597 #, c-format msgid "Only roles with privileges of role \"%s\" may drop objects owned by it." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können ihr gehörende Objekte löschen." -#: commands/user.c:1632 commands/user.c:1643 +#: commands/user.c:1625 commands/user.c:1636 #, c-format msgid "permission denied to reassign objects" msgstr "keine Berechtigung, um Objekte neu zuzuordnen" -#: commands/user.c:1633 +#: commands/user.c:1626 #, c-format msgid "Only roles with privileges of role \"%s\" may reassign objects owned by it." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können ihr gehörende Objekte neu zuordnen." -#: commands/user.c:1644 +#: commands/user.c:1637 #, c-format msgid "Only roles with privileges of role \"%s\" may reassign objects to it." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können ihr Objekte zuordnen." -#: commands/user.c:1740 +#: commands/user.c:1733 #, c-format msgid "role \"%s\" cannot be a member of any role" msgstr "Rolle »%s« kann kein Mitglied einer Rolle sein" -#: commands/user.c:1753 +#: commands/user.c:1746 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "Rolle »%s« ist ein Mitglied der Rolle »%s«" -#: commands/user.c:1793 commands/user.c:1819 +#: commands/user.c:1786 commands/user.c:1812 #, c-format msgid "%s option cannot be granted back to your own grantor" msgstr "%s-Option kann nicht an den eigenen Grantor gegeben werden" -#: commands/user.c:1896 -#, fuzzy, c-format -#| msgid "role \"%s\" is already a member of role \"%s\"" +#: commands/user.c:1889 +#, c-format msgid "role \"%s\" has already been granted membership in role \"%s\" by role \"%s\"" -msgstr "Rolle »%s« ist schon Mitglied der Rolle »%s«" +msgstr "Rolle »%s« wurde schon Mitgliedschaft in Rolle »%s« durch Rolle »%s« gewährt" -#: commands/user.c:2031 -#, fuzzy, c-format -#| msgid "role \"%s\" is not a member of role \"%s\"" +#: commands/user.c:2024 +#, c-format msgid "role \"%s\" has not been granted membership in role \"%s\" by role \"%s\"" -msgstr "Rolle »%s« ist kein Mitglied der Rolle »%s«" +msgstr "Rolle »%s« wurde keine Mitgliedschaft in Rolle »%s« durch Rolle »%s« gewährt" -#: commands/user.c:2131 +#: commands/user.c:2124 #, c-format msgid "role \"%s\" cannot have explicit members" msgstr "Rolle »%s« kann keine expliziten Mitglieder haben" -#: commands/user.c:2142 commands/user.c:2165 -#, fuzzy, c-format -#| msgid "permission denied to set role \"%s\"" +#: commands/user.c:2135 commands/user.c:2158 +#, c-format msgid "permission denied to grant role \"%s\"" -msgstr "keine Berechtigung, um Rolle »%s« zu setzen" +msgstr "keine Berechtigung, um Rolle »%s« zu gewähren" -#: commands/user.c:2144 +#: commands/user.c:2137 #, c-format -msgid "Only roles with the %s attribute may grant roles with %s." -msgstr "" +msgid "Only roles with the %s attribute may grant roles with the %s attribute." +msgstr "Nur Rollen mit dem %s-Attribut können Rollen mit dem %s-Attribut gewähren." -#: commands/user.c:2149 commands/user.c:2172 -#, fuzzy, c-format -#| msgid "permission denied to set role \"%s\"" +#: commands/user.c:2142 commands/user.c:2165 +#, c-format msgid "permission denied to revoke role \"%s\"" -msgstr "keine Berechtigung, um Rolle »%s« zu setzen" +msgstr "keine Berechtigung, um Rolle »%s« zu entziehen" -#: commands/user.c:2151 +#: commands/user.c:2144 #, c-format -msgid "Only roles with the %s attribute may revoke roles with %s." -msgstr "" +msgid "Only roles with the %s attribute may revoke roles with the %s attribute." +msgstr "Nur Rollen mit dem %s-Attribut können Rollen mit dem %s-Attribut entziehen." -#: commands/user.c:2167 +#: commands/user.c:2160 #, c-format msgid "Only roles with the %s option on role \"%s\" may grant this role." -msgstr "" +msgstr "Nur Rollen mit der %s-Option für Rolle »%s« können diese Rolle gewähren." -#: commands/user.c:2174 +#: commands/user.c:2167 #, c-format msgid "Only roles with the %s option on role \"%s\" may revoke this role." -msgstr "" +msgstr "Nur Rollen mit der %s-Option für Rolle »%s« können diese Rolle entziehen." -#: commands/user.c:2254 commands/user.c:2263 -#, fuzzy, c-format -#| msgid "permission denied to set role \"%s\"" +#: commands/user.c:2247 commands/user.c:2256 +#, c-format msgid "permission denied to grant privileges as role \"%s\"" -msgstr "keine Berechtigung, um Rolle »%s« zu setzen" +msgstr "keine Berechtigung, um Privilegien als Rolle »%s« zu gewähren" -#: commands/user.c:2256 +#: commands/user.c:2249 #, c-format msgid "Only roles with privileges of role \"%s\" may grant privileges as this role." -msgstr "" +msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können Privilegien als diese Rolle gewähren." -#: commands/user.c:2265 -#, fuzzy, c-format -#| msgid "must have admin option on role \"%s\"" +#: commands/user.c:2258 +#, c-format msgid "The grantor must have the %s option on role \"%s\"." -msgstr "Admin-Option für Rolle »%s« wird benötigt" +msgstr "Der Grantor muss die %s-Option für Rolle »%s« haben." -#: commands/user.c:2273 -#, fuzzy, c-format -#| msgid "permission denied to set role \"%s\"" +#: commands/user.c:2266 +#, c-format msgid "permission denied to revoke privileges granted by role \"%s\"" -msgstr "keine Berechtigung, um Rolle »%s« zu setzen" +msgstr "keine Berechtigung, um von Rolle »%s« gewährte Privilegien zu entziehen" -#: commands/user.c:2275 +#: commands/user.c:2268 #, c-format msgid "Only roles with privileges of role \"%s\" may revoke privileges granted by this role." -msgstr "" +msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können von dieser Rolle gewährte Privilegien entziehen." -#: commands/user.c:2498 utils/adt/acl.c:1312 +#: commands/user.c:2491 utils/adt/acl.c:1324 #, c-format msgid "dependent privileges exist" msgstr "abhängige Privilegien existieren" -#: commands/user.c:2499 utils/adt/acl.c:1313 +#: commands/user.c:2492 utils/adt/acl.c:1325 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Verwenden Sie CASCADE, um diese auch zu entziehen." -#: commands/vacuum.c:137 +#: commands/vacuum.c:134 #, c-format msgid "\"vacuum_buffer_usage_limit\" must be 0 or between %d kB and %d kB" msgstr "»vacuum_buffer_usage_limit« muss 0 sein oder zwischen %d kB und %d kB liegen" @@ -12680,44 +13136,42 @@ msgstr "ONLY_DATABASE_STATS kann nicht mit anderen VACUUM-Optionen angegeben wer msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s kann nicht aus VACUUM oder ANALYZE ausgeführt werden" -#: commands/vacuum.c:736 -#, fuzzy, c-format -#| msgid "permission denied for column %s" +#: commands/vacuum.c:732 +#, c-format msgid "permission denied to vacuum \"%s\", skipping it" -msgstr "keine Berechtigung für Spalte %s" +msgstr "keine Berechtigung für Vacuum von »%s«, wird übersprungen" -#: commands/vacuum.c:749 -#, fuzzy, c-format -#| msgid "permission denied to set role \"%s\"" +#: commands/vacuum.c:745 +#, c-format msgid "permission denied to analyze \"%s\", skipping it" -msgstr "keine Berechtigung, um Rolle »%s« zu setzen" +msgstr "keine Berechtigung für Analyze von »%s«, wird übersprungen" -#: commands/vacuum.c:827 commands/vacuum.c:924 +#: commands/vacuum.c:823 commands/vacuum.c:920 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "überspringe Vacuum von »%s« --- Sperre nicht verfügbar" -#: commands/vacuum.c:832 +#: commands/vacuum.c:828 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "überspringe Vacuum von »%s« --- Relation existiert nicht mehr" -#: commands/vacuum.c:848 commands/vacuum.c:929 +#: commands/vacuum.c:844 commands/vacuum.c:925 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "überspringe Analyze von »%s« --- Sperre nicht verfügbar" -#: commands/vacuum.c:853 +#: commands/vacuum.c:849 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "überspringe Analyze von »%s« --- Relation existiert nicht mehr" -#: commands/vacuum.c:1164 +#: commands/vacuum.c:1141 #, c-format msgid "cutoff for removing and freezing tuples is far in the past" -msgstr "" +msgstr "Obergrenze für das Entfernen und Einfrieren von Tuples ist weit in der Vergangenheit" -#: commands/vacuum.c:1165 commands/vacuum.c:1170 +#: commands/vacuum.c:1142 commands/vacuum.c:1147 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -12726,38 +13180,37 @@ msgstr "" "Schließen Sie bald alle offenen Transaktionen, um Überlaufprobleme zu vermeiden.\n" "Eventuell müssen Sie auch alte vorbereitete Transaktionen committen oder zurückrollen oder unbenutzte Replikations-Slots löschen." -#: commands/vacuum.c:1169 -#, fuzzy, c-format -#| msgid "oldest multixact is far in the past" +#: commands/vacuum.c:1146 +#, c-format msgid "cutoff for freezing multixacts is far in the past" -msgstr "älteste Multixact ist weit in der Vergangenheit" +msgstr "Obergrenze für das Einfrieren von Multixacts ist weit in der Vergangenheit" -#: commands/vacuum.c:1897 +#: commands/vacuum.c:1902 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "einige Datenbanken sind seit über 2 Milliarden Transaktionen nicht gevacuumt worden" -#: commands/vacuum.c:1898 +#: commands/vacuum.c:1903 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "Sie haben möglicherweise bereits Daten wegen Transaktionsnummernüberlauf verloren." -#: commands/vacuum.c:2062 +#: commands/vacuum.c:2082 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "überspringe »%s« --- kann Nicht-Tabellen oder besondere Systemtabellen nicht vacuumen" -#: commands/vacuum.c:2492 +#: commands/vacuum.c:2514 #, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "Index »%s« gelesen und %d Zeilenversionen entfernt" +msgid "scanned index \"%s\" to remove %lld row versions" +msgstr "Index »%s« gelesen und %lld Zeilenversionen entfernt" -#: commands/vacuum.c:2511 +#: commands/vacuum.c:2533 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "Index »%s« enthält %.0f Zeilenversionen in %u Seiten" -#: commands/vacuum.c:2515 +#: commands/vacuum.c:2537 #, c-format msgid "" "%.0f index row versions were removed.\n" @@ -12768,14 +13221,14 @@ msgstr "" "%u Indexseiten wurden neu gelöscht.\n" "%u Indexseiten sind gegenwärtig gelöscht, wovon %u gegenwärtig wiederverwendbar sind." -#: commands/vacuumparallel.c:677 +#: commands/vacuumparallel.c:707 #, c-format msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" msgstr[0] "%d parallelen Vacuum-Worker für Index-Vacuum gestartet (geplant: %d)" msgstr[1] "%d parallele Vacuum-Worker für Index-Vacuum gestartet (geplant: %d)" -#: commands/vacuumparallel.c:683 +#: commands/vacuumparallel.c:713 #, c-format msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" @@ -12837,7 +13290,7 @@ msgstr "SET TRANSACTION ISOLATION LEVEL muss vor allen Anfragen aufgerufen werde msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" msgstr "SET TRANSACTION ISOLATION LEVEL kann nicht in einer Subtransaktion aufgerufen werden" -#: commands/variable.c:606 storage/lmgr/predicate.c:1629 +#: commands/variable.c:606 storage/lmgr/predicate.c:1685 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "kann serialisierbaren Modus nicht in einem Hot Standby verwenden" @@ -12869,90 +13322,100 @@ msgstr "»client_encoding« kann jetzt nicht geändert werden." #: commands/variable.c:781 #, c-format -msgid "cannot change client_encoding during a parallel operation" -msgstr "client_encoding kann nicht während einer parallelen Operation geändert werden" +msgid "cannot change \"client_encoding\" during a parallel operation" +msgstr "»client_encoding« kann nicht während einer parallelen Operation geändert werden" + +#: commands/variable.c:876 +#, c-format +msgid "permission will be denied to set session authorization \"%s\"" +msgstr "es wird keine Berechtigung gegeben werden, um Sitzungsautorisierung »%s« zu setzen" -#: commands/variable.c:948 +#: commands/variable.c:881 +#, c-format +msgid "permission denied to set session authorization \"%s\"" +msgstr "keine Berechtigung, um Sitzungsautorisierung »%s« zu setzen" + +#: commands/variable.c:991 #, c-format msgid "permission will be denied to set role \"%s\"" msgstr "Berechtigung fehlt, um Rolle »%s« zu setzen" -#: commands/variable.c:953 +#: commands/variable.c:996 #, c-format msgid "permission denied to set role \"%s\"" msgstr "keine Berechtigung, um Rolle »%s« zu setzen" -#: commands/variable.c:1153 +#: commands/variable.c:1200 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour wird von dieser Installation nicht unterstützt" -#: commands/variable.c:1181 +#: commands/variable.c:1228 #, c-format -msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." -msgstr "effective_io_concurrency muss auf Plattformen ohne posix_fadvise() auf 0 gesetzt sein." +msgid "\"effective_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()." +msgstr "»effective_io_concurrency« muss auf Plattformen ohne posix_fadvise() auf 0 gesetzt sein." -#: commands/variable.c:1194 +#: commands/variable.c:1241 #, c-format -msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." -msgstr "maintenance_io_concurrency muss auf Plattformen ohne posix_fadvise() auf 0 gesetzt sein." +msgid "\"maintenance_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()." +msgstr "»maintenance_io_concurrency« muss auf Plattformen ohne posix_fadvise() auf 0 gesetzt sein." -#: commands/variable.c:1207 +#: commands/variable.c:1254 #, c-format msgid "SSL is not supported by this build" msgstr "SSL wird von dieser Installation nicht unterstützt" -#: commands/view.c:84 +#: commands/view.c:79 #, c-format msgid "could not determine which collation to use for view column \"%s\"" msgstr "konnte die für die Sichtspalte »%s« zu verwendende Sortierfolge nicht bestimmen" -#: commands/view.c:279 commands/view.c:290 +#: commands/view.c:274 commands/view.c:285 #, c-format msgid "cannot drop columns from view" msgstr "aus einer Sicht können keine Spalten gelöscht werden" -#: commands/view.c:295 +#: commands/view.c:290 #, c-format msgid "cannot change name of view column \"%s\" to \"%s\"" msgstr "kann Namen der Sichtspalte »%s« nicht in »%s« ändern" -#: commands/view.c:298 +#: commands/view.c:293 #, c-format msgid "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." msgstr "Verwenden Sie stattdessen ALTER VIEW ... RENAME COLUMN ..., um den Namen einer Sichtspalte zu ändern." -#: commands/view.c:309 +#: commands/view.c:304 #, c-format msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "kann Datentyp der Sichtspalte »%s« nicht von %s in %s ändern" -#: commands/view.c:323 +#: commands/view.c:318 #, c-format msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" msgstr "kann Sortierfolge der Sichtspalte »%s« nicht von »%s« in »%s« ändern" -#: commands/view.c:392 +#: commands/view.c:387 #, c-format msgid "views must not contain SELECT INTO" msgstr "Sichten dürfen kein SELECT INTO enthalten" -#: commands/view.c:404 +#: commands/view.c:399 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "Sichten dürfen keine datenmodifizierenden Anweisungen in WITH enthalten" -#: commands/view.c:474 +#: commands/view.c:469 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "CREATE VIEW gibt mehr Spaltennamen als Spalten an" -#: commands/view.c:482 +#: commands/view.c:477 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "Sichten können nicht ungeloggt sein, weil sie keinen Speicherplatz verwenden" -#: commands/view.c:496 +#: commands/view.c:491 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "Sicht »%s« wird eine temporäre Sicht" @@ -12988,201 +13451,221 @@ msgstr "Cursor »%s« ist nicht auf eine Zeile positioniert" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "Cursor »%s« ist kein einfach aktualisierbarer Scan der Tabelle »%s«" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2497 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2555 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "Typ von Parameter %d (%s) stimmt nicht mit dem überein, als der Plan vorbereitet worden ist (%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2509 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2567 #, c-format msgid "no value found for parameter %d" msgstr "kein Wert für Parameter %d gefunden" -#: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 -#: executor/execExprInterp.c:4229 executor/execExprInterp.c:4246 -#: executor/execExprInterp.c:4345 executor/nodeModifyTable.c:197 -#: executor/nodeModifyTable.c:208 executor/nodeModifyTable.c:225 -#: executor/nodeModifyTable.c:233 +#: executor/execExpr.c:642 executor/execExpr.c:649 executor/execExpr.c:655 +#: executor/execExprInterp.c:4852 executor/execExprInterp.c:4869 +#: executor/execExprInterp.c:4968 executor/nodeModifyTable.c:203 +#: executor/nodeModifyTable.c:222 executor/nodeModifyTable.c:239 +#: executor/nodeModifyTable.c:249 executor/nodeModifyTable.c:259 #, c-format msgid "table row type and query-specified row type do not match" msgstr "Zeilentyp der Tabelle und der von der Anfrage angegebene Zeilentyp stimmen nicht überein" -#: executor/execExpr.c:638 executor/nodeModifyTable.c:198 +#: executor/execExpr.c:643 executor/nodeModifyTable.c:204 #, c-format msgid "Query has too many columns." msgstr "Anfrage hat zu viele Spalten." -#: executor/execExpr.c:645 executor/nodeModifyTable.c:226 +#: executor/execExpr.c:650 executor/nodeModifyTable.c:223 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "Anfrage liefert einen Wert für eine gelöschte Spalte auf Position %d." -#: executor/execExpr.c:651 executor/execExprInterp.c:4247 -#: executor/nodeModifyTable.c:209 +#: executor/execExpr.c:656 executor/execExprInterp.c:4870 +#: executor/nodeModifyTable.c:250 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "Tabelle hat Typ %s auf Position %d, aber Anfrage erwartet %s." -#: executor/execExpr.c:1099 parser/parse_agg.c:827 +#: executor/execExpr.c:1104 parser/parse_agg.c:838 #, c-format msgid "window function calls cannot be nested" msgstr "Aufrufe von Fensterfunktionen können nicht geschachtelt werden" -#: executor/execExpr.c:1618 +#: executor/execExpr.c:1649 #, c-format msgid "target type is not an array" msgstr "Zieltyp ist kein Array" -#: executor/execExpr.c:1958 +#: executor/execExpr.c:1989 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "ROW()-Spalte hat Typ %s statt Typ %s" -#: executor/execExpr.c:2587 executor/execSRF.c:719 parser/parse_func.c:138 -#: parser/parse_func.c:655 parser/parse_func.c:1032 +#: executor/execExpr.c:2653 executor/execSRF.c:718 parser/parse_func.c:138 +#: parser/parse_func.c:655 parser/parse_func.c:1033 #, c-format msgid "cannot pass more than %d argument to a function" msgid_plural "cannot pass more than %d arguments to a function" msgstr[0] "kann nicht mehr als %d Argument an eine Funktion übergeben" msgstr[1] "kann nicht mehr als %d Argumente an eine Funktion übergeben" -#: executor/execExpr.c:2614 executor/execSRF.c:739 executor/functions.c:1066 -#: utils/adt/jsonfuncs.c:3780 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 +#: executor/execExpr.c:2680 executor/execSRF.c:738 executor/functions.c:1068 +#: utils/adt/jsonfuncs.c:4054 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "Funktion mit Mengenergebnis in einem Zusammenhang aufgerufen, der keine Mengenergebnisse verarbeiten kann" -#: executor/execExpr.c:3020 parser/parse_node.c:277 parser/parse_node.c:327 +#: executor/execExpr.c:3086 parser/parse_node.c:272 parser/parse_node.c:322 #, c-format msgid "cannot subscript type %s because it does not support subscripting" msgstr "kann aus Typ %s kein Element auswählen, weil er Subscripting nicht unterstützt" -#: executor/execExpr.c:3148 executor/execExpr.c:3170 +#: executor/execExpr.c:3214 executor/execExpr.c:3236 #, c-format msgid "type %s does not support subscripted assignment" msgstr "Typ %s unterstützt Wertzuweisungen in Elemente nicht" -#: executor/execExprInterp.c:1962 +#: executor/execExprInterp.c:2019 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "Attribut %d von Typ %s wurde gelöscht" -#: executor/execExprInterp.c:1968 +#: executor/execExprInterp.c:2025 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "Attribut %d von Typ %s hat falschen Typ" -#: executor/execExprInterp.c:1970 executor/execExprInterp.c:3103 -#: executor/execExprInterp.c:3149 +#: executor/execExprInterp.c:2027 executor/execExprInterp.c:3226 +#: executor/execExprInterp.c:3272 #, c-format msgid "Table has type %s, but query expects %s." msgstr "Tabelle hat Typ %s, aber Anfrage erwartet %s." -#: executor/execExprInterp.c:2049 utils/adt/expandedrecord.c:99 -#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1743 -#: utils/cache/typcache.c:1902 utils/cache/typcache.c:2049 -#: utils/fmgr/funcapi.c:561 +#: executor/execExprInterp.c:2107 utils/adt/expandedrecord.c:99 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1752 +#: utils/cache/typcache.c:1911 utils/cache/typcache.c:2058 +#: utils/fmgr/funcapi.c:569 #, c-format msgid "type %s is not composite" msgstr "Typ %s ist kein zusammengesetzter Typ" -#: executor/execExprInterp.c:2587 +#: executor/execExprInterp.c:2710 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF wird für diesen Tabellentyp nicht unterstützt" -#: executor/execExprInterp.c:2800 +#: executor/execExprInterp.c:2923 #, c-format msgid "cannot merge incompatible arrays" msgstr "kann inkompatible Arrays nicht verschmelzen" -#: executor/execExprInterp.c:2801 +#: executor/execExprInterp.c:2924 #, c-format msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "Arrayelement mit Typ %s kann nicht in ARRAY-Konstrukt mit Elementtyp %s verwendet werden." -#: executor/execExprInterp.c:2822 utils/adt/arrayfuncs.c:265 -#: utils/adt/arrayfuncs.c:575 utils/adt/arrayfuncs.c:1329 -#: utils/adt/arrayfuncs.c:3483 utils/adt/arrayfuncs.c:5567 -#: utils/adt/arrayfuncs.c:6084 utils/adt/arraysubs.c:150 +#: executor/execExprInterp.c:2945 utils/adt/arrayfuncs.c:1305 +#: utils/adt/arrayfuncs.c:3503 utils/adt/arrayfuncs.c:5593 +#: utils/adt/arrayfuncs.c:6112 utils/adt/arraysubs.c:150 #: utils/adt/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "Anzahl der Arraydimensionen (%d) überschreitet erlaubtes Maximum (%d)" -#: executor/execExprInterp.c:2842 executor/execExprInterp.c:2877 +#: executor/execExprInterp.c:2965 executor/execExprInterp.c:3000 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "mehrdimensionale Arrays müssen Arraysausdrücke mit gleicher Anzahl Dimensionen haben" -#: executor/execExprInterp.c:2854 utils/adt/array_expanded.c:274 -#: utils/adt/arrayfuncs.c:959 utils/adt/arrayfuncs.c:1568 -#: utils/adt/arrayfuncs.c:3285 utils/adt/arrayfuncs.c:3513 -#: utils/adt/arrayfuncs.c:6176 utils/adt/arrayfuncs.c:6517 -#: utils/adt/arrayutils.c:104 utils/adt/arrayutils.c:113 -#: utils/adt/arrayutils.c:120 +#: executor/execExprInterp.c:2977 utils/adt/array_expanded.c:274 +#: utils/adt/arrayfuncs.c:335 utils/adt/arrayfuncs.c:494 +#: utils/adt/arrayfuncs.c:727 utils/adt/arrayfuncs.c:1533 +#: utils/adt/arrayfuncs.c:2341 utils/adt/arrayfuncs.c:2356 +#: utils/adt/arrayfuncs.c:2618 utils/adt/arrayfuncs.c:2634 +#: utils/adt/arrayfuncs.c:2895 utils/adt/arrayfuncs.c:2949 +#: utils/adt/arrayfuncs.c:2964 utils/adt/arrayfuncs.c:3305 +#: utils/adt/arrayfuncs.c:3533 utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:6204 utils/adt/arrayfuncs.c:6548 +#: utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 +#: utils/adt/arrayutils.c:99 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "Arraygröße überschreitet erlaubtes Maximum (%d)" -#: executor/execExprInterp.c:3102 executor/execExprInterp.c:3148 +#: executor/execExprInterp.c:3225 executor/execExprInterp.c:3271 #, c-format msgid "attribute %d has wrong type" msgstr "Attribut %d hat falschen Typ" -#: executor/execExprInterp.c:3730 utils/adt/domains.c:155 +#: executor/execExprInterp.c:3857 utils/adt/domains.c:158 #, c-format msgid "domain %s does not allow null values" msgstr "Domäne %s erlaubt keine NULL-Werte" -#: executor/execExprInterp.c:3745 utils/adt/domains.c:193 +#: executor/execExprInterp.c:3872 utils/adt/domains.c:196 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "Wert für Domäne %s verletzt Check-Constraint »%s«" -#: executor/execExprInterp.c:4230 +#: executor/execExprInterp.c:4447 +#, c-format +msgid "no SQL/JSON item found for specified path of column \"%s\"" +msgstr "kein SQL/JSON-Item für angegebenen Pfad von Spalte »%s« gefunden" + +#: executor/execExprInterp.c:4452 +#, c-format +msgid "no SQL/JSON item found for specified path" +msgstr "kein SQL/JSON-Item für angegebenen Pfad gefunden" + +#. translator: first %s is a SQL/JSON clause (e.g. ON ERROR) +#: executor/execExprInterp.c:4652 executor/execExprInterp.c:4660 +#, c-format +msgid "could not coerce %s expression (%s) to the RETURNING type" +msgstr "konnte %s-Ausdruck (%s) nicht in RETURNING-Typ umwandeln" + +#: executor/execExprInterp.c:4853 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." msgstr[0] "Tabellenzeile enthält %d Attribut, aber Anfrage erwartet %d." msgstr[1] "Tabellenzeile enthält %d Attribute, aber Anfrage erwartet %d." -#: executor/execExprInterp.c:4346 executor/execSRF.c:978 +#: executor/execExprInterp.c:4969 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "Physischer Speicher stimmt nicht überein mit gelöschtem Attribut auf Position %d." -#: executor/execIndexing.c:588 +#: executor/execIndexing.c:593 #, c-format msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" msgstr "ON CONFLICT unterstützt keine aufschiebbaren Unique-Constraints/Exclusion-Constraints als Arbiter" -#: executor/execIndexing.c:865 +#: executor/execIndexing.c:870 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "konnte Exclusion-Constraint »%s« nicht erzeugen" -#: executor/execIndexing.c:868 +#: executor/execIndexing.c:873 #, c-format msgid "Key %s conflicts with key %s." msgstr "Schlüssel %s kollidiert mit Schlüssel %s." -#: executor/execIndexing.c:870 +#: executor/execIndexing.c:875 #, c-format msgid "Key conflicts exist." msgstr "Es bestehen Schlüsselkonflikte." -#: executor/execIndexing.c:876 +#: executor/execIndexing.c:881 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "kollidierender Schlüsselwert verletzt Exclusion-Constraint »%s«" -#: executor/execIndexing.c:879 +#: executor/execIndexing.c:884 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "Schlüssel %s kollidiert mit vorhandenem Schlüssel %s." -#: executor/execIndexing.c:881 +#: executor/execIndexing.c:886 #, c-format msgid "Key conflicts with existing key." msgstr "Der Schlüssel kollidiert mit einem vorhandenen Schlüssel." @@ -13197,302 +13680,276 @@ msgstr "kann Sequenz »%s« nicht ändern" msgid "cannot change TOAST relation \"%s\"" msgstr "kann TOAST-Relation »%s« nicht ändern" -#: executor/execMain.c:1063 rewrite/rewriteHandler.c:3079 -#: rewrite/rewriteHandler.c:3966 -#, c-format -msgid "cannot insert into view \"%s\"" -msgstr "kann nicht in Sicht »%s« einfügen" - -#: executor/execMain.c:1065 rewrite/rewriteHandler.c:3082 -#: rewrite/rewriteHandler.c:3969 -#, c-format -msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." -msgstr "Um Einfügen in die Sicht zu ermöglichen, richten Sie einen INSTEAD OF INSERT Trigger oder eine ON INSERT DO INSTEAD Regel ohne Bedingung ein." - -#: executor/execMain.c:1071 rewrite/rewriteHandler.c:3087 -#: rewrite/rewriteHandler.c:3974 -#, c-format -msgid "cannot update view \"%s\"" -msgstr "kann Sicht »%s« nicht aktualisieren" - -#: executor/execMain.c:1073 rewrite/rewriteHandler.c:3090 -#: rewrite/rewriteHandler.c:3977 -#, c-format -msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." -msgstr "Um Aktualisieren der Sicht zu ermöglichen, richten Sie einen INSTEAD OF UPDATE Trigger oder eine ON UPDATE DO INSTEAD Regel ohne Bedingung ein." - -#: executor/execMain.c:1079 rewrite/rewriteHandler.c:3095 -#: rewrite/rewriteHandler.c:3982 -#, c-format -msgid "cannot delete from view \"%s\"" -msgstr "kann nicht aus Sicht »%s« löschen" - -#: executor/execMain.c:1081 rewrite/rewriteHandler.c:3098 -#: rewrite/rewriteHandler.c:3985 -#, c-format -msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." -msgstr "Um Löschen aus der Sicht zu ermöglichen, richten Sie einen INSTEAD OF DELETE Trigger oder eine ON DELETE DO INSTEAD Regel ohne Bedingung ein." - -#: executor/execMain.c:1092 +#: executor/execMain.c:1064 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "kann materialisierte Sicht »%s« nicht ändern" -#: executor/execMain.c:1104 +#: executor/execMain.c:1076 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "kann nicht in Fremdtabelle »%s« einfügen" -#: executor/execMain.c:1110 +#: executor/execMain.c:1082 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "Fremdtabelle »%s« erlaubt kein Einfügen" -#: executor/execMain.c:1117 +#: executor/execMain.c:1089 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "kann Fremdtabelle »%s« nicht aktualisieren" -#: executor/execMain.c:1123 +#: executor/execMain.c:1095 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "Fremdtabelle »%s« erlaubt kein Aktualisieren" -#: executor/execMain.c:1130 +#: executor/execMain.c:1102 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "kann nicht aus Fremdtabelle »%s« löschen" -#: executor/execMain.c:1136 +#: executor/execMain.c:1108 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "Fremdtabelle »%s« erlaubt kein Löschen" -#: executor/execMain.c:1147 +#: executor/execMain.c:1119 #, c-format msgid "cannot change relation \"%s\"" msgstr "kann Relation »%s« nicht ändern" -#: executor/execMain.c:1174 +#: executor/execMain.c:1146 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "kann Zeilen in Sequenz »%s« nicht sperren" -#: executor/execMain.c:1181 +#: executor/execMain.c:1153 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "kann Zeilen in TOAST-Relation »%s« nicht sperren" -#: executor/execMain.c:1188 +#: executor/execMain.c:1160 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "kann Zeilen in Sicht »%s« nicht sperren" -#: executor/execMain.c:1196 +#: executor/execMain.c:1168 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "kann Zeilen in materialisierter Sicht »%s« nicht sperren" -#: executor/execMain.c:1205 executor/execMain.c:2708 +#: executor/execMain.c:1177 executor/execMain.c:2689 #: executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "kann Zeilen in Fremdtabelle »%s« nicht sperren" -#: executor/execMain.c:1211 +#: executor/execMain.c:1183 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "kann Zeilen in Relation »%s« nicht sperren" -#: executor/execMain.c:1922 +#: executor/execMain.c:1901 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "neue Zeile für Relation »%s« verletzt Partitions-Constraint" -#: executor/execMain.c:1924 executor/execMain.c:2008 executor/execMain.c:2059 -#: executor/execMain.c:2169 +#: executor/execMain.c:1903 executor/execMain.c:1987 executor/execMain.c:2038 +#: executor/execMain.c:2148 #, c-format msgid "Failing row contains %s." msgstr "Fehlgeschlagene Zeile enthält %s." -#: executor/execMain.c:2005 +#: executor/execMain.c:1984 #, c-format msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" msgstr "NULL-Wert in Spalte »%s« von Relation »%s« verletzt Not-Null-Constraint" -#: executor/execMain.c:2057 +#: executor/execMain.c:2036 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "neue Zeile für Relation »%s« verletzt Check-Constraint »%s«" -#: executor/execMain.c:2167 +#: executor/execMain.c:2146 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "neue Zeile verletzt Check-Option für Sicht »%s«" -#: executor/execMain.c:2177 +#: executor/execMain.c:2156 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene »%s« für Tabelle »%s«" -#: executor/execMain.c:2182 +#: executor/execMain.c:2161 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene für Tabelle »%s«" -#: executor/execMain.c:2190 +#: executor/execMain.c:2169 #, c-format msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "Zielzeile verletzt Policy für Sicherheit auf Zeilenebene »%s« (USING-Ausdruck) für Tabelle »%s«" -#: executor/execMain.c:2195 +#: executor/execMain.c:2174 #, c-format msgid "target row violates row-level security policy (USING expression) for table \"%s\"" msgstr "Zielzeile verletzt Policy für Sicherheit auf Zeilenebene (USING-Ausdruck) für Tabelle »%s«" -#: executor/execMain.c:2202 +#: executor/execMain.c:2181 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene »%s« (USING-Ausdruck) für Tabelle »%s«" -#: executor/execMain.c:2207 +#: executor/execMain.c:2186 #, c-format msgid "new row violates row-level security policy (USING expression) for table \"%s\"" msgstr "neue Zeile verletzt Policy für Sicherheit auf Zeilenebene (USING-Ausdruck) für Tabelle »%s«" -#: executor/execPartition.c:330 +#: executor/execPartition.c:327 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "keine Partition von Relation »%s« für die Zeile gefunden" -#: executor/execPartition.c:333 +#: executor/execPartition.c:330 #, c-format msgid "Partition key of the failing row contains %s." msgstr "Partitionierungsschlüssel der fehlgeschlagenen Zeile enthält %s." -#: executor/execReplication.c:240 executor/execReplication.c:424 +#: executor/execReplication.c:272 executor/execReplication.c:456 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update, retrying" msgstr "das zu sperrende Tupel wurde schon durch ein gleichzeitiges Update in eine andere Partition verschoben, versuche erneut" -#: executor/execReplication.c:244 executor/execReplication.c:428 +#: executor/execReplication.c:276 executor/execReplication.c:460 #, c-format msgid "concurrent update, retrying" msgstr "gleichzeitige Aktualisierung, versuche erneut" -#: executor/execReplication.c:250 executor/execReplication.c:434 +#: executor/execReplication.c:282 executor/execReplication.c:466 #, c-format msgid "concurrent delete, retrying" msgstr "gleichzeitiges Löschen, versuche erneut" -#: executor/execReplication.c:320 parser/parse_cte.c:308 -#: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:1348 -#: utils/adt/array_userfuncs.c:1491 utils/adt/arrayfuncs.c:3832 -#: utils/adt/arrayfuncs.c:4387 utils/adt/arrayfuncs.c:6397 -#: utils/adt/rowtypes.c:1230 +#: executor/execReplication.c:352 parser/parse_cte.c:303 +#: parser/parse_oper.c:221 utils/adt/array_userfuncs.c:1334 +#: utils/adt/array_userfuncs.c:1477 utils/adt/arrayfuncs.c:3852 +#: utils/adt/arrayfuncs.c:4407 utils/adt/arrayfuncs.c:6428 +#: utils/adt/rowtypes.c:1220 #, c-format msgid "could not identify an equality operator for type %s" msgstr "konnte keinen Ist-Gleich-Operator für Typ %s ermitteln" -#: executor/execReplication.c:651 executor/execReplication.c:657 +#: executor/execReplication.c:687 executor/execReplication.c:693 #, c-format msgid "cannot update table \"%s\"" msgstr "kann Tabelle »%s« nicht aktualisieren" -#: executor/execReplication.c:653 executor/execReplication.c:665 +#: executor/execReplication.c:689 executor/execReplication.c:701 #, c-format msgid "Column used in the publication WHERE expression is not part of the replica identity." msgstr "Im WHERE-Ausdruck der Publikation verwendete Spalte ist nicht Teil der Replika-Identität." -#: executor/execReplication.c:659 executor/execReplication.c:671 +#: executor/execReplication.c:695 executor/execReplication.c:707 #, c-format msgid "Column list used by the publication does not cover the replica identity." msgstr "Die von der Publikation verwendete Spaltenliste umfasst die Replika-Identität nicht." -#: executor/execReplication.c:663 executor/execReplication.c:669 +#: executor/execReplication.c:699 executor/execReplication.c:705 #, c-format msgid "cannot delete from table \"%s\"" msgstr "kann nicht aus Tabelle »%s« löschen" -#: executor/execReplication.c:689 +#: executor/execReplication.c:725 #, c-format msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" msgstr "Tabelle »%s« kann nicht aktualisiert werden, weil sie keine Replik-Identität hat und Updates publiziert" -#: executor/execReplication.c:691 +#: executor/execReplication.c:727 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Um Aktualisieren der Tabelle zu ermöglichen, setzen Sie REPLICA IDENTITY mit ALTER TABLE." -#: executor/execReplication.c:695 +#: executor/execReplication.c:731 #, c-format msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" msgstr "aus Tabelle »%s« kann nicht gelöscht werden, weil sie keine Replik-Identität hat und Deletes publiziert" -#: executor/execReplication.c:697 +#: executor/execReplication.c:733 #, c-format msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Um Löschen in der Tabelle zu ermöglichen, setzen Sie REPLICA IDENTITY mit ALTER TABLE." -#: executor/execReplication.c:713 +#: executor/execReplication.c:749 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "Relation »%s.%s« kann nicht als Ziel für logische Replikation verwendet werden" -#: executor/execSRF.c:316 +#: executor/execSRF.c:315 #, c-format msgid "rows returned by function are not all of the same row type" msgstr "von Funktion zurückgegebene Zeilen haben nicht alle den selben Zeilentyp" -#: executor/execSRF.c:366 +#: executor/execSRF.c:365 #, c-format msgid "table-function protocol for value-per-call mode was not followed" msgstr "Tabellenfunktionsprotokoll für Value-per-Call-Modus wurde nicht befolgt" -#: executor/execSRF.c:374 executor/execSRF.c:668 +#: executor/execSRF.c:373 executor/execSRF.c:667 #, c-format msgid "table-function protocol for materialize mode was not followed" msgstr "Tabellenfunktionsprotokoll für Materialisierungsmodus wurde nicht befolgt" -#: executor/execSRF.c:381 executor/execSRF.c:686 +#: executor/execSRF.c:380 executor/execSRF.c:685 #, c-format msgid "unrecognized table-function returnMode: %d" msgstr "unbekannter returnMode von Tabellenfunktion: %d" -#: executor/execSRF.c:895 +#: executor/execSRF.c:894 #, c-format msgid "function returning setof record called in context that cannot accept type record" msgstr "Funktion mit Ergebnis SETOF RECORD in einem Zusammenhang aufgerufen, der den Typ RECORD nicht verarbeiten kann" -#: executor/execSRF.c:951 executor/execSRF.c:967 executor/execSRF.c:977 +#: executor/execSRF.c:950 executor/execSRF.c:966 executor/execSRF.c:976 #, c-format msgid "function return row and query-specified return row do not match" msgstr "von Funktion zurückgegebene Zeile und von der Anfrage angegebene zurückzugebende Zeile stimmen nicht überein" -#: executor/execSRF.c:952 +#: executor/execSRF.c:951 #, c-format msgid "Returned row contains %d attribute, but query expects %d." msgid_plural "Returned row contains %d attributes, but query expects %d." msgstr[0] "Zurückgegebene Zeile enthält %d Attribut, aber Anfrage erwartet %d." msgstr[1] "Zurückgegebene Zeile enthält %d Attribute, aber Anfrage erwartet %d." -#: executor/execSRF.c:968 +#: executor/execSRF.c:967 #, c-format msgid "Returned type %s at ordinal position %d, but query expects %s." msgstr "Rückgabetyp war %s auf Position %d, aber Anfrage erwartet %s." -#: executor/execTuples.c:146 executor/execTuples.c:353 -#: executor/execTuples.c:521 executor/execTuples.c:713 +#: executor/execTuples.c:147 executor/execTuples.c:368 +#: executor/execTuples.c:563 executor/execTuples.c:772 #, c-format msgid "cannot retrieve a system column in this context" msgstr "Systemspalte kann in diesem Kontext nicht ausgelesen werden" -#: executor/execUtils.c:744 +#: executor/execTuples.c:163 executor/execTuples.c:580 +#, c-format +msgid "don't have transaction information for this type of tuple" +msgstr "dieser Tupeltyp hat keine Transaktionsinformationen" + +#: executor/execTuples.c:390 executor/execTuples.c:794 +#, c-format +msgid "don't have a storage tuple in this context" +msgstr "in diesem Kontext gibt es kein zu speicherndes Tupel" + +#: executor/execUtils.c:713 #, c-format msgid "materialized view \"%s\" has not been populated" msgstr "materialisierte Sicht »%s« wurde noch nicht befüllt" -#: executor/execUtils.c:746 +#: executor/execUtils.c:715 #, c-format msgid "Use the REFRESH MATERIALIZED VIEW command." msgstr "Verwenden Sie den Befehl REFRESH MATERIALIZED VIEW." @@ -13502,111 +13959,111 @@ msgstr "Verwenden Sie den Befehl REFRESH MATERIALIZED VIEW." msgid "could not determine actual type of argument declared %s" msgstr "konnte tatsächlichen Typ von Argument mit deklarierten Typ %s nicht bestimmen" -#: executor/functions.c:512 +#: executor/functions.c:513 #, c-format msgid "cannot COPY to/from client in an SQL function" msgstr "COPY vom/zum Client funktioniert in einer SQL-Funktion nicht" #. translator: %s is a SQL statement name -#: executor/functions.c:518 +#: executor/functions.c:519 #, c-format msgid "%s is not allowed in an SQL function" msgstr "%s ist in SQL-Funktionen nicht erlaubt" #. translator: %s is a SQL statement name -#: executor/functions.c:526 executor/spi.c:1742 executor/spi.c:2635 +#: executor/functions.c:527 executor/spi.c:1744 executor/spi.c:2657 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s ist in als nicht »volatile« markierten Funktionen nicht erlaubt" -#: executor/functions.c:1450 +#: executor/functions.c:1452 #, c-format msgid "SQL function \"%s\" statement %d" msgstr "SQL-Funktion »%s« Anweisung %d" -#: executor/functions.c:1476 +#: executor/functions.c:1478 #, c-format msgid "SQL function \"%s\" during startup" msgstr "SQL-Funktion »%s« beim Start" -#: executor/functions.c:1561 +#: executor/functions.c:1563 #, c-format msgid "calling procedures with output arguments is not supported in SQL functions" msgstr "Aufruf von Prozeduren mit Ausgabeargumenten wird in SQL-Funktionen nicht unterstützt" -#: executor/functions.c:1694 executor/functions.c:1732 -#: executor/functions.c:1746 executor/functions.c:1836 -#: executor/functions.c:1869 executor/functions.c:1883 +#: executor/functions.c:1698 executor/functions.c:1736 +#: executor/functions.c:1750 executor/functions.c:1845 +#: executor/functions.c:1878 executor/functions.c:1892 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "Rückgabetyp von Funktion stimmt nicht überein; deklariert als %s" -#: executor/functions.c:1696 +#: executor/functions.c:1700 #, c-format -msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." -msgstr "Die letzte Anweisung der Funktion muss ein SELECT oder INSERT/UPDATE/DELETE RETURNING sein." +msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE RETURNING." +msgstr "Die letzte Anweisung der Funktion muss ein SELECT oder INSERT/UPDATE/DELETE/MERGE RETURNING sein." -#: executor/functions.c:1734 +#: executor/functions.c:1738 #, c-format msgid "Final statement must return exactly one column." msgstr "Die letzte Anweisung muss genau eine Spalte zurückgeben." -#: executor/functions.c:1748 +#: executor/functions.c:1752 #, c-format msgid "Actual return type is %s." msgstr "Eigentlicher Rückgabetyp ist %s." -#: executor/functions.c:1838 +#: executor/functions.c:1847 #, c-format msgid "Final statement returns too many columns." msgstr "Die letzte Anweisung gibt zu viele Spalten zurück." -#: executor/functions.c:1871 +#: executor/functions.c:1880 #, c-format msgid "Final statement returns %s instead of %s at column %d." msgstr "Die letzte Anweisung ergibt %s statt %s in Spalte %d." -#: executor/functions.c:1885 +#: executor/functions.c:1894 #, c-format msgid "Final statement returns too few columns." msgstr "Die letzte Anweisung gibt zu wenige Spalten zurück." -#: executor/functions.c:1913 +#: executor/functions.c:1922 #, c-format msgid "return type %s is not supported for SQL functions" msgstr "Rückgabetyp %s wird von SQL-Funktionen nicht unterstützt" -#: executor/nodeAgg.c:3937 executor/nodeWindowAgg.c:2993 +#: executor/nodeAgg.c:3936 executor/nodeWindowAgg.c:2975 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "Aggregatfunktion %u muss kompatiblen Eingabe- und Übergangstyp haben" -#: executor/nodeAgg.c:3967 parser/parse_agg.c:669 parser/parse_agg.c:697 +#: executor/nodeAgg.c:3966 parser/parse_agg.c:680 parser/parse_agg.c:708 #, c-format msgid "aggregate function calls cannot be nested" msgstr "Aufrufe von Aggregatfunktionen können nicht geschachtelt werden" -#: executor/nodeCustom.c:154 executor/nodeCustom.c:165 +#: executor/nodeCustom.c:144 executor/nodeCustom.c:155 #, c-format msgid "custom scan \"%s\" does not support MarkPos" msgstr "Custom-Scan »%s« unterstützt MarkPos nicht" -#: executor/nodeHashjoin.c:1143 executor/nodeHashjoin.c:1173 +#: executor/nodeHashjoin.c:1131 executor/nodeHashjoin.c:1161 #, c-format msgid "could not rewind hash-join temporary file" msgstr "konnte Position in temporärer Datei für Hash-Verbund nicht auf Anfang setzen" -#: executor/nodeIndexonlyscan.c:238 +#: executor/nodeIndexonlyscan.c:239 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "verlustbehaftete Abstandsfunktionen werden in Index-Only-Scans nicht unterstützt" -#: executor/nodeLimit.c:374 +#: executor/nodeLimit.c:373 #, c-format msgid "OFFSET must not be negative" msgstr "OFFSET darf nicht negativ sein" -#: executor/nodeLimit.c:400 +#: executor/nodeLimit.c:399 #, c-format msgid "LIMIT must not be negative" msgstr "LIMIT darf nicht negativ sein" @@ -13621,73 +14078,79 @@ msgstr "RIGHT JOIN wird nur für Merge-Verbund-fähige Verbundbedingungen unters msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOIN wird nur für Merge-Verbund-fähige Verbundbedingungen unterstützt" -#: executor/nodeModifyTable.c:234 +#: executor/nodeModifyTable.c:240 +#, c-format +msgid "Query provides a value for a generated column at ordinal position %d." +msgstr "Anfrage liefert einen Wert für eine generierte Spalte auf Position %d." + +#: executor/nodeModifyTable.c:260 #, c-format msgid "Query has too few columns." msgstr "Anfrage hat zu wenige Spalten." -#: executor/nodeModifyTable.c:1530 executor/nodeModifyTable.c:1604 +#: executor/nodeModifyTable.c:1560 executor/nodeModifyTable.c:1634 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "das zu löschende Tupel wurde schon durch eine vom aktuellen Befehl ausgelöste Operation verändert" -#: executor/nodeModifyTable.c:1758 +#: executor/nodeModifyTable.c:1789 #, c-format msgid "invalid ON UPDATE specification" msgstr "ungültige ON-UPDATE-Angabe" -#: executor/nodeModifyTable.c:1759 +#: executor/nodeModifyTable.c:1790 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "Das Ergebnistupel würde in einer anderen Partition erscheinen als das ursprüngliche Tupel." -#: executor/nodeModifyTable.c:2217 +#: executor/nodeModifyTable.c:2246 #, c-format msgid "cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key" msgstr "Tupel kann nicht zwischen Partitionen bewegt werden, wenn ein Fremdschlüssel direkt auf einen Vorgänger (außer der Wurzel) der Quellpartition verweist" -#: executor/nodeModifyTable.c:2218 +#: executor/nodeModifyTable.c:2247 #, c-format msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "Ein Fremdschlüssel verweist auf den Vorgänger »%s«, aber nicht auf den Wurzelvorgänger »%s«." -#: executor/nodeModifyTable.c:2221 +#: executor/nodeModifyTable.c:2250 #, c-format msgid "Consider defining the foreign key on table \"%s\"." msgstr "Definieren Sie den Fremdschlüssel eventuell für Tabelle »%s«." #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2567 executor/nodeModifyTable.c:2954 +#: executor/nodeModifyTable.c:2616 executor/nodeModifyTable.c:3158 +#: executor/nodeModifyTable.c:3328 #, c-format msgid "%s command cannot affect row a second time" msgstr "Befehl in %s kann eine Zeile nicht ein zweites Mal ändern" -#: executor/nodeModifyTable.c:2569 +#: executor/nodeModifyTable.c:2618 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "Stellen Sie sicher, dass keine im selben Befehl fürs Einfügen vorgesehene Zeilen doppelte Werte haben, die einen Constraint verletzen würden." -#: executor/nodeModifyTable.c:2956 +#: executor/nodeModifyTable.c:3151 executor/nodeModifyTable.c:3321 #, c-format -msgid "Ensure that not more than one source row matches any one target row." -msgstr "Stellen Sie sicher, dass nicht mehr als eine Quellzeile auf jede Zielzeile passt." +msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" +msgstr "das zu aktualisierende oder zu löschende Tupel wurde schon durch eine vom aktuellen Befehl ausgelöste Operation verändert" -#: executor/nodeModifyTable.c:3037 +#: executor/nodeModifyTable.c:3160 executor/nodeModifyTable.c:3330 #, c-format -msgid "tuple to be deleted was already moved to another partition due to concurrent update" -msgstr "das zu löschende Tupel wurde schon durch ein gleichzeitiges Update in eine andere Partition verschoben" +msgid "Ensure that not more than one source row matches any one target row." +msgstr "Stellen Sie sicher, dass nicht mehr als eine Quellzeile auf jede Zielzeile passt." -#: executor/nodeModifyTable.c:3076 +#: executor/nodeModifyTable.c:3229 #, c-format -msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" -msgstr "das zu aktualisierende oder zu löschende Tupel wurde schon durch eine vom aktuellen Befehl ausgelöste Operation verändert" +msgid "tuple to be merged was already moved to another partition due to concurrent update" +msgstr "das zu mergende Tupel wurde schon durch ein gleichzeitiges Update in eine andere Partition verschoben" -#: executor/nodeSamplescan.c:260 +#: executor/nodeSamplescan.c:244 #, c-format msgid "TABLESAMPLE parameter cannot be null" msgstr "Parameter von TABLESAMPLE darf nicht NULL sein" -#: executor/nodeSamplescan.c:272 +#: executor/nodeSamplescan.c:256 #, c-format msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "Parameter von TABLESAMPLE REPEATABLE darf nicht NULL sein" @@ -13698,7 +14161,7 @@ msgstr "Parameter von TABLESAMPLE REPEATABLE darf nicht NULL sein" msgid "more than one row returned by a subquery used as an expression" msgstr "als Ausdruck verwendete Unteranfrage ergab mehr als eine Zeile" -#: executor/nodeTableFuncscan.c:375 +#: executor/nodeTableFuncscan.c:370 #, c-format msgid "namespace URI must not be null" msgstr "Namensraum-URI darf nicht NULL sein" @@ -13708,17 +14171,17 @@ msgstr "Namensraum-URI darf nicht NULL sein" msgid "row filter expression must not be null" msgstr "Zeilenfilterausdruck darf nicht NULL sein" -#: executor/nodeTableFuncscan.c:415 +#: executor/nodeTableFuncscan.c:416 #, c-format msgid "column filter expression must not be null" msgstr "Spaltenfilterausdruck darf nicht NULL sein" -#: executor/nodeTableFuncscan.c:416 +#: executor/nodeTableFuncscan.c:417 #, c-format msgid "Filter for column \"%s\" is null." msgstr "Filter für Spalte »%s« ist NULL." -#: executor/nodeTableFuncscan.c:506 +#: executor/nodeTableFuncscan.c:507 #, c-format msgid "null is not allowed in column \"%s\"" msgstr "NULL ist in Spalte »%s« nicht erlaubt" @@ -13748,84 +14211,84 @@ msgstr "Frame-Ende-Offset darf nicht NULL sein" msgid "frame ending offset must not be negative" msgstr "Frame-Ende-Offset darf nicht negativ sein" -#: executor/nodeWindowAgg.c:2909 +#: executor/nodeWindowAgg.c:2891 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "Aggregatfunktion %s unterstützt die Verwendung als Fensterfunktion nicht" -#: executor/spi.c:242 executor/spi.c:342 +#: executor/spi.c:241 executor/spi.c:341 #, c-format msgid "invalid transaction termination" msgstr "ungültige Transaktionsbeendung" -#: executor/spi.c:257 +#: executor/spi.c:256 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "während eine Subtransaktion aktiv ist kann nicht committet werden" -#: executor/spi.c:348 +#: executor/spi.c:347 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "während eine Subtransaktion aktiv ist kann nicht zurückgerollt werden" -#: executor/spi.c:472 +#: executor/spi.c:471 #, c-format msgid "transaction left non-empty SPI stack" msgstr "Transaktion ließ nicht-leeren SPI-Stack zurück" -#: executor/spi.c:473 executor/spi.c:533 +#: executor/spi.c:472 executor/spi.c:532 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Prüfen Sie, ob Aufrufe von »SPI_finish« fehlen." -#: executor/spi.c:532 +#: executor/spi.c:531 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "Subtransaktion ließ nicht-leeren SPI-Stack zurück" -#: executor/spi.c:1600 +#: executor/spi.c:1602 #, c-format msgid "cannot open multi-query plan as cursor" msgstr "Plan mit mehreren Anfragen kann nicht als Cursor geöffnet werden" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1610 +#: executor/spi.c:1612 #, c-format msgid "cannot open %s query as cursor" msgstr "%s kann nicht als Cursor geöffnet werden" -#: executor/spi.c:1716 +#: executor/spi.c:1718 #, c-format msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE wird nicht unterstützt" -#: executor/spi.c:1717 parser/analyze.c:2874 +#: executor/spi.c:1719 parser/analyze.c:2928 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Scrollbare Cursor müssen READ ONLY sein." -#: executor/spi.c:2474 +#: executor/spi.c:2496 #, c-format msgid "empty query does not return tuples" msgstr "leere Anfrage gibt keine Tupel zurück" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:2548 +#: executor/spi.c:2570 #, c-format msgid "%s query does not return tuples" msgstr "%s-Anfrage gibt keine Tupel zurück" -#: executor/spi.c:2963 +#: executor/spi.c:2987 #, c-format msgid "SQL expression \"%s\"" msgstr "SQL-Ausdruck »%s«" -#: executor/spi.c:2968 +#: executor/spi.c:2992 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "PL/pgSQL-Zuweisung »%s«" -#: executor/spi.c:2971 +#: executor/spi.c:2995 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL-Anweisung »%s«" @@ -13835,399 +14298,420 @@ msgstr "SQL-Anweisung »%s«" msgid "could not send tuple to shared-memory queue" msgstr "konnte Tupel nicht an Shared-Memory-Queue senden" -#: foreign/foreign.c:222 +#: foreign/foreign.c:225 #, c-format -msgid "user mapping not found for \"%s\"" -msgstr "Benutzerabbildung für »%s« nicht gefunden" +msgid "user mapping not found for user \"%s\", server \"%s\"" +msgstr "Benutzerabbildung für Benutzer »%s«, Server »%s« nicht gefunden" -#: foreign/foreign.c:647 storage/file/fd.c:3931 +#: foreign/foreign.c:336 optimizer/plan/createplan.c:7153 +#: optimizer/util/plancat.c:540 +#, c-format +msgid "access to non-system foreign table is restricted" +msgstr "Zugriff auf Nicht-System-Fremdtabelle ist beschränkt" + +#: foreign/foreign.c:660 #, c-format msgid "invalid option \"%s\"" msgstr "ungültige Option »%s«" -#: foreign/foreign.c:649 +#: foreign/foreign.c:662 #, c-format msgid "Perhaps you meant the option \"%s\"." msgstr "Vielleicht meinten Sie die Option »%s«." -#: foreign/foreign.c:651 +#: foreign/foreign.c:664 #, c-format msgid "There are no valid options in this context." msgstr "Es gibt keine gültigen Optionen in diesem Zusammenhang." -#: gram.y:1200 +#: gram.y:1231 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD wird nicht mehr unterstützt" -#: gram.y:1201 +#: gram.y:1232 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "Lassen Sie UNENCRYPTED weg, um das Passwort stattdessen in verschlüsselter Form zu speichern." -#: gram.y:1528 gram.y:1544 +#: gram.y:1559 gram.y:1575 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTS kann keine Schemaelemente enthalten" -#: gram.y:1696 +#: gram.y:1727 #, c-format msgid "current database cannot be changed" msgstr "aktuelle Datenbank kann nicht geändert werden" -#: gram.y:1829 +#: gram.y:1860 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "Zeitzonenintervall muss HOUR oder HOUR TO MINUTE sein" -#: gram.y:2446 +#: gram.y:2487 #, c-format msgid "column number must be in range from 1 to %d" msgstr "Spaltennummer muss im Bereich 1 bis %d sein" -#: gram.y:3042 +#: gram.y:3083 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "Sequenzoption »%s« wird hier nicht unterstützt" -#: gram.y:3071 +#: gram.y:3122 #, c-format msgid "modulus for hash partition provided more than once" msgstr "Modulus für Hashpartition mehrmals angegeben" -#: gram.y:3080 +#: gram.y:3131 #, c-format msgid "remainder for hash partition provided more than once" msgstr "Rest für Hashpartition mehrmals angegeben" -#: gram.y:3087 +#: gram.y:3138 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "unbekannte Hashpartitionsbegrenzungsangabe »%s«" -#: gram.y:3095 +#: gram.y:3146 #, c-format msgid "modulus for hash partition must be specified" msgstr "Modulus für Hashpartition muss angegeben werden" -#: gram.y:3099 +#: gram.y:3150 #, c-format msgid "remainder for hash partition must be specified" msgstr "Rest für Hashpartition muss angegeben werden" -#: gram.y:3307 gram.y:3341 +#: gram.y:3358 gram.y:3392 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUT sind nicht mit PROGRAM erlaubt" -#: gram.y:3313 +#: gram.y:3364 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "mit COPY TO ist keine WHERE-Klausel erlaubt" -#: gram.y:3652 gram.y:3659 gram.y:12824 gram.y:12832 +#: gram.y:3712 gram.y:3719 gram.y:13023 gram.y:13031 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "die Verwendung von GLOBAL beim Erzeugen einer temporären Tabelle ist veraltet" -#: gram.y:3935 +#: gram.y:3995 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "für eine generierte Spalte muss GENERATED ALWAYS angegeben werden" -#: gram.y:4226 utils/adt/ri_triggers.c:2112 +#: gram.y:4340 utils/adt/ri_triggers.c:2103 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "MATCH PARTIAL ist noch nicht implementiert" -#: gram.y:4318 +#: gram.y:4432 #, c-format msgid "a column list with %s is only supported for ON DELETE actions" msgstr "eine Spaltenliste für %s wird nur für ON-DELETE-Aktionen unterstützt" -#: gram.y:5030 +#: gram.y:5151 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM wird nicht mehr unterstützt" -#: gram.y:5728 +#: gram.y:5849 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "unbekannte Zeilensicherheitsoption »%s«" -#: gram.y:5729 +#: gram.y:5850 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "Aktuell werden nur PERMISSIVE und RESTRICTIVE unterstützt." -#: gram.y:5814 +#: gram.y:5935 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER wird nicht unterstützt" -#: gram.y:5851 +#: gram.y:5972 msgid "duplicate trigger events specified" msgstr "mehrere Trigger-Ereignisse angegeben" -#: gram.y:5993 parser/parse_utilcmd.c:3695 parser/parse_utilcmd.c:3721 +#: gram.y:6114 parser/parse_utilcmd.c:3692 parser/parse_utilcmd.c:3718 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "Constraint, der als INITIALLY DEFERRED deklariert wurde, muss DEFERRABLE sein" -#: gram.y:6000 +#: gram.y:6121 #, c-format msgid "conflicting constraint properties" msgstr "widersprüchliche Constraint-Eigentschaften" -#: gram.y:6099 +#: gram.y:6220 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTION ist noch nicht implementiert" -#: gram.y:6507 +#: gram.y:6537 +#, c-format +msgid "dropping an enum value is not implemented" +msgstr "Löschen eines Enum-Werts ist nicht implementiert" + +#: gram.y:6655 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK wird nicht mehr benötigt" -#: gram.y:6508 +#: gram.y:6656 #, c-format msgid "Update your data type." msgstr "Aktualisieren Sie Ihren Datentyp." -#: gram.y:8381 +#: gram.y:8529 #, c-format msgid "aggregates cannot have output arguments" msgstr "Aggregatfunktionen können keine OUT-Argumente haben" -#: gram.y:8844 utils/adt/regproc.c:670 +#: gram.y:8992 utils/adt/regproc.c:670 #, c-format msgid "missing argument" msgstr "Argument fehlt" -#: gram.y:8845 utils/adt/regproc.c:671 +#: gram.y:8993 utils/adt/regproc.c:671 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "Verwenden Sie NONE, um das fehlende Argument eines unären Operators anzugeben." -#: gram.y:11057 gram.y:11076 +#: gram.y:11221 gram.y:11240 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTION wird für rekursive Sichten nicht unterstützt" -#: gram.y:12963 +#: gram.y:13162 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "Syntax LIMIT x,y wird nicht unterstützt" -#: gram.y:12964 +#: gram.y:13163 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "Verwenden Sie die getrennten Klauseln LIMIT und OFFSET." -#: gram.y:13824 +#: gram.y:14038 #, c-format msgid "only one DEFAULT value is allowed" msgstr "nur ein DEFAULT-Wert ist erlaubt" -#: gram.y:13833 +#: gram.y:14047 #, c-format msgid "only one PATH value per column is allowed" msgstr "nur ein PATH-Wert pro Spalte ist erlaubt" -#: gram.y:13842 +#: gram.y:14056 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "widersprüchliche oder überflüssige NULL/NOT NULL-Deklarationen für Spalte »%s«" -#: gram.y:13851 +#: gram.y:14065 #, c-format msgid "unrecognized column option \"%s\"" msgstr "unbekannte Spaltenoption »%s«" -#: gram.y:14105 +#: gram.y:14147 +#, c-format +msgid "only string constants are supported in JSON_TABLE path specification" +msgstr "nur Zeichenkettenkonstanten werden in Pfadangaben in JSON_TABLE unterstützt" + +#: gram.y:14469 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "Präzision von Typ float muss mindestens 1 Bit sein" -#: gram.y:14114 +#: gram.y:14478 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "Präzision von Typ float muss weniger als 54 Bits sein" -#: gram.y:14617 +#: gram.y:14995 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "falsche Anzahl Parameter auf linker Seite von OVERLAPS-Ausdruck" -#: gram.y:14622 +#: gram.y:15000 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "falsche Anzahl Parameter auf rechter Seite von OVERLAPS-Ausdruck" -#: gram.y:14799 +#: gram.y:15177 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE-Prädikat ist noch nicht implementiert" -#: gram.y:15215 +#: gram.y:15591 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "in WITHIN GROUP können nicht mehrere ORDER-BY-Klauseln verwendet werden" -#: gram.y:15220 +#: gram.y:15596 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT kann nicht mit WITHIN GROUP verwendet werden" -#: gram.y:15225 +#: gram.y:15601 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC kann nicht mit WITHIN GROUP verwendet werden" -#: gram.y:15859 gram.y:15883 +#: gram.y:16328 gram.y:16352 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "Frame-Beginn kann nicht UNBOUNDED FOLLOWING sein" -#: gram.y:15864 +#: gram.y:16333 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "Frame der in der folgenden Zeile beginnt kann nicht in der aktuellen Zeile enden" -#: gram.y:15888 +#: gram.y:16357 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "Frame-Ende kann nicht UNBOUNDED PRECEDING sein" -#: gram.y:15894 +#: gram.y:16363 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "Frame der in der aktuellen Zeile beginnt kann keine vorhergehenden Zeilen haben" -#: gram.y:15901 +#: gram.y:16370 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "Frame der in der folgenden Zeile beginnt kann keine vorhergehenden Zeilen haben" -#: gram.y:16660 +#: gram.y:16919 +#, c-format +msgid "unrecognized JSON encoding: %s" +msgstr "unbekannte JSON-Kodierung: %s" + +#: gram.y:17243 #, c-format msgid "type modifier cannot have parameter name" msgstr "Typmodifikator kann keinen Parameternamen haben" -#: gram.y:16666 +#: gram.y:17249 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "Typmodifikator kann kein ORDER BY haben" -#: gram.y:16734 gram.y:16741 gram.y:16748 +#: gram.y:17317 gram.y:17324 gram.y:17331 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s kann hier nicht als Rollenname verwendet werden" -#: gram.y:16838 gram.y:18295 +#: gram.y:17421 gram.y:18906 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIES kann nicht ohne ORDER-BY-Klausel angegeben werden" -#: gram.y:17974 gram.y:18161 +#: gram.y:18597 gram.y:18772 msgid "improper use of \"*\"" msgstr "unzulässige Verwendung von »*«" -#: gram.y:18124 gram.y:18141 tsearch/spell.c:963 tsearch/spell.c:980 -#: tsearch/spell.c:997 tsearch/spell.c:1014 tsearch/spell.c:1079 +#: gram.y:18735 gram.y:18752 tsearch/spell.c:964 tsearch/spell.c:981 +#: tsearch/spell.c:998 tsearch/spell.c:1015 tsearch/spell.c:1081 #, c-format msgid "syntax error" msgstr "Syntaxfehler" -#: gram.y:18225 +#: gram.y:18836 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "eine Ordered-Set-Aggregatfunktion mit einem direkten VARIADIC-Argument muss ein aggregiertes VARIADIC-Argument des selben Datentyps haben" -#: gram.y:18262 +#: gram.y:18873 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "mehrere ORDER-BY-Klauseln sind nicht erlaubt" -#: gram.y:18273 +#: gram.y:18884 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "mehrere OFFSET-Klauseln sind nicht erlaubt" -#: gram.y:18282 +#: gram.y:18893 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "mehrere LIMIT-Klauseln sind nicht erlaubt" -#: gram.y:18291 +#: gram.y:18902 #, c-format msgid "multiple limit options not allowed" msgstr "mehrere Limit-Optionen sind nicht erlaubt" -#: gram.y:18318 +#: gram.y:18929 #, c-format msgid "multiple WITH clauses not allowed" msgstr "mehrere WITH-Klauseln sind nicht erlaubt" -#: gram.y:18511 +#: gram.y:19122 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "OUT- und INOUT-Argumente sind in TABLE-Funktionen nicht erlaubt" -#: gram.y:18644 +#: gram.y:19255 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "mehrere COLLATE-Klauseln sind nicht erlaubt" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18682 gram.y:18695 +#: gram.y:19293 gram.y:19306 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "%s-Constraints können nicht als DEFERRABLE markiert werden" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18708 +#: gram.y:19319 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "%s-Constraints können nicht als NOT VALID markiert werden" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18721 +#: gram.y:19332 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s-Constraints können nicht als NO INHERIT markiert werden" -#: gram.y:18743 +#: gram.y:19354 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "unbekannte Partitionierungsstrategie »%s«" -#: gram.y:18767 +#: gram.y:19378 #, c-format msgid "invalid publication object list" msgstr "ungültige Publikationsobjektliste" -#: gram.y:18768 +#: gram.y:19379 #, c-format msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." msgstr "Entweder TABLE oder TABLES IN SCHEMA muss vor einem alleinstehenden Tabellen- oder Schemanamen angegeben werden." -#: gram.y:18784 +#: gram.y:19395 #, c-format msgid "invalid table name" msgstr "ungültiger Tabellenname" -#: gram.y:18805 +#: gram.y:19416 #, c-format msgid "WHERE clause not allowed for schema" msgstr "für Schemas ist keine WHERE-Klausel erlaubt" -#: gram.y:18812 +#: gram.y:19423 #, c-format msgid "column specification not allowed for schema" msgstr "für Schemas ist keine Spaltenangabe erlaubt" -#: gram.y:18826 +#: gram.y:19437 #, c-format msgid "invalid schema name" msgstr "ungültiger Schemaname" @@ -14272,72 +14756,60 @@ msgstr "Syntaxfehler in Datei »%s«, Zeile %u, bei »%s«" msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "zu viele Syntaxfehler gefunden, Datei »%s« wird aufgegeben" -#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:415 -#, c-format -msgid "could not access file \"%s\": %m" -msgstr "konnte nicht auf Datei »%s« zugreifen: %m" - -#: jsonpath_gram.y:528 jsonpath_scan.l:629 jsonpath_scan.l:640 -#: jsonpath_scan.l:650 jsonpath_scan.l:701 utils/adt/encode.c:492 -#: utils/adt/encode.c:557 utils/adt/jsonfuncs.c:648 utils/adt/varlena.c:331 -#: utils/adt/varlena.c:372 +#: jsonpath_gram.y:266 jsonpath_gram.y:598 jsonpath_scan.l:640 +#: jsonpath_scan.l:651 jsonpath_scan.l:661 jsonpath_scan.l:712 +#: utils/adt/encode.c:492 utils/adt/encode.c:557 utils/adt/jsonfuncs.c:659 +#: utils/adt/varlena.c:333 utils/adt/varlena.c:374 #, c-format msgid "invalid input syntax for type %s" msgstr "ungültige Eingabesyntax für Typ %s" -#: jsonpath_gram.y:529 +#: jsonpath_gram.y:267 +#, c-format +msgid ".decimal() can only have an optional precision[,scale]." +msgstr ".decimal() kann nur optionale Argumente Präzision[,Skala] haben." + +#: jsonpath_gram.y:599 #, c-format msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." msgstr "Unbekanntes Flag-Zeichen »%.*s« in LIKE_REGEX-Prädikat." -#: jsonpath_gram.y:559 tsearch/spell.c:749 utils/adt/regexp.c:224 +#: jsonpath_gram.y:629 tsearch/spell.c:750 utils/adt/regexp.c:223 #, c-format msgid "invalid regular expression: %s" msgstr "ungültiger regulärer Ausdruck: %s" -#: jsonpath_gram.y:607 +#: jsonpath_gram.y:677 #, c-format msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" msgstr "XQuery-Flag »x« (expanded regular expression) ist nicht implementiert" #: jsonpath_scan.l:174 -#, fuzzy -#| msgid "invalid Unicode escape" -msgid "invalid unicode sequence" -msgstr "ungültiges Unicode-Escape" +msgid "invalid Unicode escape sequence" +msgstr "ungültige Unicode-Escape-Sequenz" #: jsonpath_scan.l:180 -#, fuzzy -#| msgid "invalid character" -msgid "invalid hex character sequence" -msgstr "ungültiges Zeichen" +msgid "invalid hexadecimal character sequence" +msgstr "ungültige hexadezimale Zeichensequenz" #: jsonpath_scan.l:195 -#, fuzzy -#| msgid "unexpected end of line" msgid "unexpected end after backslash" -msgstr "unerwartetes Ende der Zeile" +msgstr "unerwartetes Ende nach Backslash" -#: jsonpath_scan.l:201 -#, fuzzy -#| msgid "unexpected end of line" -msgid "unexpected end of quoted string" -msgstr "unerwartetes Ende der Zeile" +#: jsonpath_scan.l:201 repl_scanner.l:211 scan.l:756 +msgid "unterminated quoted string" +msgstr "Zeichenkette in Anführungszeichen nicht abgeschlossen" #: jsonpath_scan.l:228 -#, fuzzy -#| msgid "unexpected end of line" msgid "unexpected end of comment" -msgstr "unerwartetes Ende der Zeile" +msgstr "unerwartetes Kommentarende" #: jsonpath_scan.l:319 -#, fuzzy -#| msgid "numeric_literal" msgid "invalid numeric literal" -msgstr "numerische_Konstante" +msgstr "ungültige numerische Konstante" -#: jsonpath_scan.l:325 jsonpath_scan.l:331 jsonpath_scan.l:337 scan.l:1049 -#: scan.l:1053 scan.l:1057 scan.l:1061 scan.l:1065 scan.l:1069 scan.l:1073 +#: jsonpath_scan.l:325 jsonpath_scan.l:331 jsonpath_scan.l:337 scan.l:1064 +#: scan.l:1068 scan.l:1072 scan.l:1076 msgid "trailing junk after numeric literal" msgstr "Müll folgt auf numerische Konstante" @@ -14353,29 +14825,26 @@ msgstr "%s am Ende der jsonpath-Eingabe" msgid "%s at or near \"%s\" of jsonpath input" msgstr "%s bei »%s« in jsonpath-Eingabe" -#: jsonpath_scan.l:557 -msgid "bogus input" -msgstr "" +#: jsonpath_scan.l:568 +msgid "invalid input" +msgstr "ungültige Eingabe" -#: jsonpath_scan.l:583 -#, fuzzy -#| msgid "invalid hexadecimal digit: \"%.*s\"" +#: jsonpath_scan.l:594 msgid "invalid hexadecimal digit" -msgstr "ungültige hexadezimale Ziffer: »%.*s«" +msgstr "ungültige hexadezimale Ziffer" -#: jsonpath_scan.l:596 utils/adt/jsonfuncs.c:636 +#: jsonpath_scan.l:607 utils/adt/jsonfuncs.c:647 #, c-format msgid "unsupported Unicode escape sequence" msgstr "nicht unterstützte Unicode-Escape-Sequenz" -#: jsonpath_scan.l:614 -#, fuzzy, c-format -#| msgid "could not encode server key" -msgid "could not convert unicode to server encoding" -msgstr "konnte Server Key nicht kodieren" +#: jsonpath_scan.l:625 +#, c-format +msgid "could not convert Unicode to server encoding" +msgstr "konnte Unicode nicht in Serverkodierung umwandeln" -#: lib/dshash.c:254 utils/mmgr/dsa.c:714 utils/mmgr/dsa.c:736 -#: utils/mmgr/dsa.c:817 +#: lib/dshash.c:254 utils/mmgr/dsa.c:708 utils/mmgr/dsa.c:730 +#: utils/mmgr/dsa.c:811 #, c-format msgid "Failed on DSA request of size %zu." msgstr "Fehler bei DSA-Anfrage mit Größe %zu." @@ -14385,706 +14854,700 @@ msgstr "Fehler bei DSA-Anfrage mit Größe %zu." msgid "expected SASL response, got message type %d" msgstr "SASL-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth-scram.c:270 +#: libpq/auth-scram.c:263 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "Client hat einen ungültigen SASL-Authentifizierungsmechanismums gewählt" -#: libpq/auth-scram.c:294 libpq/auth-scram.c:543 libpq/auth-scram.c:554 +#: libpq/auth-scram.c:287 libpq/auth-scram.c:536 libpq/auth-scram.c:547 #, c-format msgid "invalid SCRAM secret for user \"%s\"" msgstr "ungültiges SCRAM-Geheimnis für Benutzer »%s«" -#: libpq/auth-scram.c:305 +#: libpq/auth-scram.c:298 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "Benutzer »%s« hat kein gültiges SCRAM-Geheimnis." -#: libpq/auth-scram.c:385 libpq/auth-scram.c:390 libpq/auth-scram.c:744 -#: libpq/auth-scram.c:752 libpq/auth-scram.c:857 libpq/auth-scram.c:870 -#: libpq/auth-scram.c:880 libpq/auth-scram.c:988 libpq/auth-scram.c:995 -#: libpq/auth-scram.c:1010 libpq/auth-scram.c:1025 libpq/auth-scram.c:1039 -#: libpq/auth-scram.c:1057 libpq/auth-scram.c:1072 libpq/auth-scram.c:1386 -#: libpq/auth-scram.c:1394 +#: libpq/auth-scram.c:378 libpq/auth-scram.c:383 libpq/auth-scram.c:737 +#: libpq/auth-scram.c:745 libpq/auth-scram.c:850 libpq/auth-scram.c:863 +#: libpq/auth-scram.c:873 libpq/auth-scram.c:981 libpq/auth-scram.c:988 +#: libpq/auth-scram.c:1003 libpq/auth-scram.c:1018 libpq/auth-scram.c:1032 +#: libpq/auth-scram.c:1050 libpq/auth-scram.c:1065 libpq/auth-scram.c:1379 +#: libpq/auth-scram.c:1387 #, c-format msgid "malformed SCRAM message" msgstr "fehlerhafte SCRAM-Nachricht" -#: libpq/auth-scram.c:386 +#: libpq/auth-scram.c:379 #, c-format msgid "The message is empty." msgstr "Die Nachricht ist leer." -#: libpq/auth-scram.c:391 +#: libpq/auth-scram.c:384 #, c-format msgid "Message length does not match input length." msgstr "Länge der Nachricht stimmt nicht mit Länge der Eingabe überein." -#: libpq/auth-scram.c:423 +#: libpq/auth-scram.c:416 #, c-format msgid "invalid SCRAM response" msgstr "ungültige SCRAM-Antwort" -#: libpq/auth-scram.c:424 +#: libpq/auth-scram.c:417 #, c-format msgid "Nonce does not match." msgstr "Nonce stimmt nicht überein." -#: libpq/auth-scram.c:500 +#: libpq/auth-scram.c:493 #, c-format msgid "could not generate random salt" msgstr "konnte zufälliges Salt nicht erzeugen" -#: libpq/auth-scram.c:745 +#: libpq/auth-scram.c:738 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "Attribut »%c« wurde erwartet, aber »%s« wurde gefunden." -#: libpq/auth-scram.c:753 libpq/auth-scram.c:881 +#: libpq/auth-scram.c:746 libpq/auth-scram.c:874 #, c-format msgid "Expected character \"=\" for attribute \"%c\"." msgstr "Zeichen »=« für Attribut »%c« wurde erwartet." -#: libpq/auth-scram.c:858 +#: libpq/auth-scram.c:851 #, c-format msgid "Attribute expected, but found end of string." msgstr "Attribut wurde erwartet, aber Ende der Zeichenkette wurde gefunden." -#: libpq/auth-scram.c:871 +#: libpq/auth-scram.c:864 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "Attribut wurde erwartet, aber ungültiges Zeichen »%s« wurde gefunden." -#: libpq/auth-scram.c:989 libpq/auth-scram.c:1011 +#: libpq/auth-scram.c:982 libpq/auth-scram.c:1004 #, c-format msgid "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not include channel binding data." msgstr "Der Client hat SCRAM-SHA-256-PLUS gewählt, aber die SCRAM-Nachricht enthielt keine Channel-Binding-Daten." -#: libpq/auth-scram.c:996 libpq/auth-scram.c:1026 +#: libpq/auth-scram.c:989 libpq/auth-scram.c:1019 #, c-format msgid "Comma expected, but found character \"%s\"." msgstr "Komma wurde erwartet, aber Zeichen »%s« wurde gefunden." -#: libpq/auth-scram.c:1017 +#: libpq/auth-scram.c:1010 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "Fehler bei der Aushandlung von SCRAM-Channel-Binding" -#: libpq/auth-scram.c:1018 +#: libpq/auth-scram.c:1011 #, c-format msgid "The client supports SCRAM channel binding but thinks the server does not. However, this server does support channel binding." msgstr "Der Client unterstützt SCRAM-Channel-Binding aber glaubt dass der Server es nicht tut. Dieser Server unterstützt jedoch Channel-Binding." -#: libpq/auth-scram.c:1040 +#: libpq/auth-scram.c:1033 #, c-format msgid "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM message includes channel binding data." msgstr "Der Client hat SCRAM-SHA-256 ohne Channel-Binding gewählt, aber die SCRAM-Nachricht enthält Channel-Binding-Daten." -#: libpq/auth-scram.c:1051 +#: libpq/auth-scram.c:1044 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "nicht unterstützter SCRAM-Channel-Binding-Typ »%s«" -#: libpq/auth-scram.c:1058 +#: libpq/auth-scram.c:1051 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "Unerwartetes Channel-Binding-Flag »%s«." -#: libpq/auth-scram.c:1068 +#: libpq/auth-scram.c:1061 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "Client verwendet Autorisierungsidentität, was nicht unterstützt wird" -#: libpq/auth-scram.c:1073 +#: libpq/auth-scram.c:1066 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "Unerwartetes Attribut »%s« in »client-first-message«." -#: libpq/auth-scram.c:1089 +#: libpq/auth-scram.c:1082 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "Client verlangt eine nicht unterstützte SCRAM-Erweiterung" -#: libpq/auth-scram.c:1103 +#: libpq/auth-scram.c:1096 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "nicht druckbare Zeichen in SCRAM-Nonce" -#: libpq/auth-scram.c:1234 +#: libpq/auth-scram.c:1227 #, c-format msgid "could not generate random nonce" msgstr "konnte zufällige Nonce nicht erzeugen" -#: libpq/auth-scram.c:1244 +#: libpq/auth-scram.c:1237 #, c-format msgid "could not encode random nonce" msgstr "konnte zufällige Nonce nicht kodieren" -#: libpq/auth-scram.c:1350 +#: libpq/auth-scram.c:1343 #, c-format msgid "SCRAM channel binding check failed" msgstr "SCRAM-Channel-Binding-Prüfung fehlgeschlagen" -#: libpq/auth-scram.c:1368 +#: libpq/auth-scram.c:1361 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "unerwartetes SCRAM-Channel-Binding-Attribut in »client-final-message«" -#: libpq/auth-scram.c:1387 +#: libpq/auth-scram.c:1380 #, c-format msgid "Malformed proof in client-final-message." msgstr "Fehlerhafter Proof in »client-final-message«." -#: libpq/auth-scram.c:1395 +#: libpq/auth-scram.c:1388 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "Müll am Ende der »client-final-message« gefunden." -#: libpq/auth.c:271 +#: libpq/auth.c:269 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "Authentifizierung für Benutzer »%s« fehlgeschlagen: Host abgelehnt" -#: libpq/auth.c:274 +#: libpq/auth.c:272 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "»trust«-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:277 +#: libpq/auth.c:275 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "Ident-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:280 +#: libpq/auth.c:278 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "Peer-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:285 +#: libpq/auth.c:283 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "Passwort-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:290 +#: libpq/auth.c:288 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "GSSAPI-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:293 +#: libpq/auth.c:291 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "SSPI-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:296 +#: libpq/auth.c:294 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "PAM-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:299 +#: libpq/auth.c:297 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "BSD-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:302 +#: libpq/auth.c:300 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "LDAP-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:305 +#: libpq/auth.c:303 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "Zertifikatauthentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:308 +#: libpq/auth.c:306 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "RADIUS-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:311 +#: libpq/auth.c:309 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "Authentifizierung für Benutzer »%s« fehlgeschlagen: ungültige Authentifizierungsmethode" -#: libpq/auth.c:315 -#, fuzzy, c-format -#| msgid "Connection matched pg_hba.conf line %d: \"%s\"" -msgid "Connection matched %s line %d: \"%s\"" -msgstr "Verbindung stimmte mit pg_hba.conf-Zeile %d überein: »%s«" +#: libpq/auth.c:313 +#, c-format +msgid "Connection matched file \"%s\" line %d: \"%s\"" +msgstr "Verbindung stimmte mit Datei »%s« Zeile %d überein: »%s«" -#: libpq/auth.c:359 +#: libpq/auth.c:357 #, c-format msgid "authentication identifier set more than once" msgstr "Authentifizierungsbezeichner mehrmals gesetzt" -#: libpq/auth.c:360 +#: libpq/auth.c:358 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "vorheriger Bezeichner: »%s«; neuer Bezeichner: »%s«" -#: libpq/auth.c:370 +#: libpq/auth.c:368 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "Verbindung authentifiziert: Identität=»%s« Methode=%s (%s:%d)" -#: libpq/auth.c:410 +#: libpq/auth.c:408 #, c-format msgid "client certificates can only be checked if a root certificate store is available" msgstr "Client-Zertifikate können nur überprüft werden, wenn Wurzelzertifikat verfügbar ist" -#: libpq/auth.c:421 +#: libpq/auth.c:419 #, c-format msgid "connection requires a valid client certificate" msgstr "Verbindung erfordert ein gültiges Client-Zertifikat" -#: libpq/auth.c:452 libpq/auth.c:498 +#: libpq/auth.c:450 libpq/auth.c:496 msgid "GSS encryption" msgstr "GSS-Verschlüsselung" -#: libpq/auth.c:455 libpq/auth.c:501 +#: libpq/auth.c:453 libpq/auth.c:499 msgid "SSL encryption" msgstr "SSL-Verschlüsselung" -#: libpq/auth.c:457 libpq/auth.c:503 +#: libpq/auth.c:455 libpq/auth.c:501 msgid "no encryption" msgstr "keine Verschlüsselung" #. translator: last %s describes encryption state -#: libpq/auth.c:463 +#: libpq/auth.c:461 #, c-format msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" msgstr "pg_hba.conf lehnt Replikationsverbindung ab für Host »%s«, Benutzer »%s«, %s" #. translator: last %s describes encryption state -#: libpq/auth.c:470 +#: libpq/auth.c:468 #, c-format msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "pg_hba.conf lehnt Verbindung ab für Host »%s«, Benutzer »%s«, Datenbank »%s«, %s" -#: libpq/auth.c:508 +#: libpq/auth.c:506 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "Auflösung der Client-IP-Adresse ergab »%s«, Vorwärtsauflösung stimmt überein." -#: libpq/auth.c:511 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "Auflösung der Client-IP-Adresse ergab »%s«, Vorwärtsauflösung nicht geprüft." -#: libpq/auth.c:514 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "Auflösung der Client-IP-Adresse ergab »%s«, Vorwärtsauflösung stimmt nicht überein." -#: libpq/auth.c:517 +#: libpq/auth.c:515 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "Konnte Client-Hostnamen »%s« nicht in IP-Adresse übersetzen: %s." -#: libpq/auth.c:522 +#: libpq/auth.c:520 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "Konnte Client-IP-Adresse nicht in einen Hostnamen auflösen: %s." #. translator: last %s describes encryption state -#: libpq/auth.c:530 +#: libpq/auth.c:528 #, c-format msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" msgstr "kein pg_hba.conf-Eintrag für Replikationsverbindung von Host »%s«, Benutzer »%s«, %s" #. translator: last %s describes encryption state -#: libpq/auth.c:538 +#: libpq/auth.c:536 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "kein pg_hba.conf-Eintrag für Host »%s«, Benutzer »%s«, Datenbank »%s«, %s" -#: libpq/auth.c:711 +#: libpq/auth.c:656 +#, c-format +msgid "connection authenticated: user=\"%s\" method=%s (%s:%d)" +msgstr "Verbindung authentifiziert: Benutzer=»%s« Methode=%s (%s:%d)" + +#: libpq/auth.c:725 #, c-format msgid "expected password response, got message type %d" msgstr "Passwort-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth.c:732 +#: libpq/auth.c:746 #, c-format msgid "invalid password packet size" msgstr "ungültige Größe des Passwortpakets" -#: libpq/auth.c:750 +#: libpq/auth.c:764 #, c-format msgid "empty password returned by client" msgstr "Client gab leeres Passwort zurück" -#: libpq/auth.c:879 libpq/hba.c:1749 -#, c-format -msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" -msgstr "MD5-Authentifizierung wird nicht unterstützt, wenn »db_user_namespace« angeschaltet ist" - -#: libpq/auth.c:885 +#: libpq/auth.c:892 #, c-format msgid "could not generate random MD5 salt" msgstr "konnte zufälliges MD5-Salt nicht erzeugen" -#: libpq/auth.c:936 libpq/be-secure-gssapi.c:540 +#: libpq/auth.c:943 libpq/be-secure-gssapi.c:540 #, c-format msgid "could not set environment: %m" msgstr "konnte Umgebung nicht setzen: %m" -#: libpq/auth.c:975 +#: libpq/auth.c:982 #, c-format msgid "expected GSS response, got message type %d" msgstr "GSS-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth.c:1041 +#: libpq/auth.c:1048 msgid "accepting GSS security context failed" msgstr "Annahme des GSS-Sicherheitskontexts fehlgeschlagen" -#: libpq/auth.c:1082 +#: libpq/auth.c:1089 msgid "retrieving GSS user name failed" msgstr "Abfrage des GSS-Benutzernamens fehlgeschlagen" -#: libpq/auth.c:1228 +#: libpq/auth.c:1235 msgid "could not acquire SSPI credentials" msgstr "konnte SSPI-Credentials nicht erhalten" -#: libpq/auth.c:1253 +#: libpq/auth.c:1260 #, c-format msgid "expected SSPI response, got message type %d" msgstr "SSPI-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth.c:1331 +#: libpq/auth.c:1338 msgid "could not accept SSPI security context" msgstr "konnte SSPI-Sicherheitskontext nicht akzeptieren" -#: libpq/auth.c:1372 +#: libpq/auth.c:1379 msgid "could not get token from SSPI security context" msgstr "konnte kein Token vom SSPI-Sicherheitskontext erhalten" -#: libpq/auth.c:1508 libpq/auth.c:1527 +#: libpq/auth.c:1515 libpq/auth.c:1534 #, c-format msgid "could not translate name" msgstr "konnte Namen nicht umwandeln" -#: libpq/auth.c:1540 +#: libpq/auth.c:1547 #, c-format msgid "realm name too long" msgstr "Realm-Name zu lang" -#: libpq/auth.c:1555 +#: libpq/auth.c:1562 #, c-format msgid "translated account name too long" msgstr "umgewandelter Account-Name zu lang" -#: libpq/auth.c:1734 +#: libpq/auth.c:1741 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "konnte Socket für Ident-Verbindung nicht erzeugen: %m" -#: libpq/auth.c:1749 +#: libpq/auth.c:1756 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "konnte nicht mit lokaler Adresse »%s« verbinden: %m" -#: libpq/auth.c:1761 +#: libpq/auth.c:1768 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "konnte nicht mit Ident-Server auf Adresse »%s«, Port %s verbinden: %m" -#: libpq/auth.c:1783 +#: libpq/auth.c:1790 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "konnte Anfrage an Ident-Server auf Adresse »%s«, Port %s nicht senden: %m" -#: libpq/auth.c:1800 +#: libpq/auth.c:1807 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "konnte Antwort von Ident-Server auf Adresse »%s«, Port %s nicht empfangen: %m" -#: libpq/auth.c:1810 +#: libpq/auth.c:1817 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "ungültig formatierte Antwort vom Ident-Server: »%s«" -#: libpq/auth.c:1863 +#: libpq/auth.c:1870 #, c-format msgid "peer authentication is not supported on this platform" msgstr "Peer-Authentifizierung wird auf dieser Plattform nicht unterstützt" -#: libpq/auth.c:1867 +#: libpq/auth.c:1874 #, c-format msgid "could not get peer credentials: %m" msgstr "konnte Credentials von Gegenstelle nicht ermitteln: %m" -#: libpq/auth.c:1879 +#: libpq/auth.c:1886 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "konnte lokale Benutzer-ID %ld nicht nachschlagen: %s" -#: libpq/auth.c:1981 +#: libpq/auth.c:1988 #, c-format msgid "error from underlying PAM layer: %s" msgstr "Fehler von der unteren PAM-Ebene: %s" -#: libpq/auth.c:1992 +#: libpq/auth.c:1999 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "nicht unterstützte PAM-Conversation: %d/»%s«" -#: libpq/auth.c:2049 +#: libpq/auth.c:2056 #, c-format msgid "could not create PAM authenticator: %s" msgstr "konnte PAM-Authenticator nicht erzeugen: %s" -#: libpq/auth.c:2060 +#: libpq/auth.c:2067 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) fehlgeschlagen: %s" -#: libpq/auth.c:2092 +#: libpq/auth.c:2099 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) fehlgeschlagen: %s" -#: libpq/auth.c:2104 +#: libpq/auth.c:2111 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) fehlgeschlagen: %s" -#: libpq/auth.c:2117 +#: libpq/auth.c:2124 #, c-format msgid "pam_authenticate failed: %s" msgstr "pam_authenticate fehlgeschlagen: %s" -#: libpq/auth.c:2130 +#: libpq/auth.c:2137 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt fehlgeschlagen: %s" -#: libpq/auth.c:2141 +#: libpq/auth.c:2148 #, c-format msgid "could not release PAM authenticator: %s" msgstr "konnte PAM-Authenticator nicht freigeben: %s" -#: libpq/auth.c:2221 +#: libpq/auth.c:2228 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "konnte LDAP nicht initialisieren: Fehlercode %d" -#: libpq/auth.c:2258 +#: libpq/auth.c:2265 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "konnte keinen Domain-Namen aus ldapbasedn herauslesen" -#: libpq/auth.c:2266 +#: libpq/auth.c:2273 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "LDAP-Authentifizierung konnte keine DNS-SRV-Einträge für »%s« finden" -#: libpq/auth.c:2268 +#: libpq/auth.c:2275 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Geben Sie einen LDAP-Servernamen explizit an." -#: libpq/auth.c:2320 +#: libpq/auth.c:2327 #, c-format msgid "could not initialize LDAP: %s" msgstr "konnte LDAP nicht initialisieren: %s" -#: libpq/auth.c:2330 +#: libpq/auth.c:2337 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldaps wird mit dieser LDAP-Bibliothek nicht unterstützt" -#: libpq/auth.c:2338 +#: libpq/auth.c:2345 #, c-format msgid "could not initialize LDAP: %m" msgstr "konnte LDAP nicht initialisieren: %m" -#: libpq/auth.c:2348 +#: libpq/auth.c:2355 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "konnte LDAP-Protokollversion nicht setzen: %s" -#: libpq/auth.c:2364 +#: libpq/auth.c:2371 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "konnte LDAP-TLS-Sitzung nicht starten: %s" -#: libpq/auth.c:2441 +#: libpq/auth.c:2448 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP-Server nicht angegeben, und kein ldapbasedn" -#: libpq/auth.c:2448 +#: libpq/auth.c:2455 #, c-format msgid "LDAP server not specified" msgstr "LDAP-Server nicht angegeben" -#: libpq/auth.c:2510 +#: libpq/auth.c:2517 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "ungültiges Zeichen im Benutzernamen für LDAP-Authentifizierung" -#: libpq/auth.c:2527 +#: libpq/auth.c:2534 #, c-format msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" msgstr "erstes LDAP-Binden für ldapbinddn »%s« auf Server »%s« fehlgeschlagen: %s" -#: libpq/auth.c:2557 +#: libpq/auth.c:2564 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "konnte LDAP nicht mit Filter »%s« auf Server »%s« durchsuchen: %s" -#: libpq/auth.c:2573 +#: libpq/auth.c:2580 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAP-Benutzer »%s« existiert nicht" -#: libpq/auth.c:2574 +#: libpq/auth.c:2581 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "LDAP-Suche nach Filter »%s« auf Server »%s« gab keine Einträge zurück." -#: libpq/auth.c:2578 +#: libpq/auth.c:2585 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAP-Benutzer »%s« ist nicht eindeutig" -#: libpq/auth.c:2579 +#: libpq/auth.c:2586 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." msgstr[0] "LDAP-Suche nach Filter »%s« auf Server »%s« gab %d Eintrag zurück." msgstr[1] "LDAP-Suche nach Filter »%s« auf Server »%s« gab %d Einträge zurück." -#: libpq/auth.c:2599 +#: libpq/auth.c:2606 #, c-format msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "konnte DN fÅ©r den ersten Treffer für »%s« auf Server »%s« nicht lesen: %s" -#: libpq/auth.c:2620 -#, c-format -msgid "could not unbind after searching for user \"%s\" on server \"%s\"" -msgstr "Losbinden fehlgeschlagen nach Suche nach Benutzer »%s« auf Server »%s«" - -#: libpq/auth.c:2651 +#: libpq/auth.c:2633 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "LDAP-Login fehlgeschlagen für Benutzer »%s« auf Server »%s«: %s" -#: libpq/auth.c:2683 +#: libpq/auth.c:2665 #, c-format msgid "LDAP diagnostics: %s" msgstr "LDAP-Diagnostik: %s" -#: libpq/auth.c:2721 +#: libpq/auth.c:2703 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "Zertifikatauthentifizierung für Benutzer »%s« fehlgeschlagen: Client-Zertifikat enthält keinen Benutzernamen" -#: libpq/auth.c:2742 +#: libpq/auth.c:2724 #, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" msgstr "Zertifikatauthentifizierung für Benutzer »%s« fehlgeschlagen: konnte Subject-DN nicht abfragen" -#: libpq/auth.c:2765 +#: libpq/auth.c:2747 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" msgstr "Zertifikatüberprüfung (clientcert=verify=full) für Benutzer »%s« fehlgeschlagen: DN stimmt nicht überein" -#: libpq/auth.c:2770 +#: libpq/auth.c:2752 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "Zertifikatüberprüfung (clientcert=verify=full) für Benutzer »%s« fehlgeschlagen: CN stimmt nicht überein" -#: libpq/auth.c:2872 +#: libpq/auth.c:2854 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-Server nicht angegeben" -#: libpq/auth.c:2879 +#: libpq/auth.c:2861 #, c-format msgid "RADIUS secret not specified" msgstr "RADIUS-Geheimnis nicht angegeben" -#: libpq/auth.c:2893 +#: libpq/auth.c:2875 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "RADIUS-Authentifizierung unterstützt keine Passwörter länger als %d Zeichen" -#: libpq/auth.c:2995 libpq/hba.c:2391 +#: libpq/auth.c:2977 libpq/hba.c:2352 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "konnte RADIUS-Servername »%s« nicht in Adresse übersetzen: %s" -#: libpq/auth.c:3009 +#: libpq/auth.c:2991 #, c-format msgid "could not generate random encryption vector" msgstr "konnte zufälligen Verschlüsselungsvektor nicht erzeugen" -#: libpq/auth.c:3046 +#: libpq/auth.c:3028 #, c-format msgid "could not perform MD5 encryption of password: %s" msgstr "konnte MD5-Verschlüsselung des Passworts nicht durchführen: %s" -#: libpq/auth.c:3073 +#: libpq/auth.c:3055 #, c-format msgid "could not create RADIUS socket: %m" msgstr "konnte RADIUS-Socket nicht erstellen: %m" -#: libpq/auth.c:3089 +#: libpq/auth.c:3071 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "konnte lokales RADIUS-Socket nicht binden: %m" -#: libpq/auth.c:3099 +#: libpq/auth.c:3081 #, c-format msgid "could not send RADIUS packet: %m" msgstr "konnte RADIUS-Paket nicht senden: %m" -#: libpq/auth.c:3133 libpq/auth.c:3159 +#: libpq/auth.c:3115 libpq/auth.c:3141 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "Zeitüberschreitung beim Warten auf RADIUS-Antwort von %s" -#: libpq/auth.c:3152 +#: libpq/auth.c:3134 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "konnte Status des RADIUS-Sockets nicht prüfen: %m" -#: libpq/auth.c:3182 +#: libpq/auth.c:3164 #, c-format msgid "could not read RADIUS response: %m" msgstr "konnte RADIUS-Antwort nicht lesen: %m" -#: libpq/auth.c:3190 +#: libpq/auth.c:3172 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "RADIUS-Antwort von %s wurde von falschem Port gesendet: %d" -#: libpq/auth.c:3198 +#: libpq/auth.c:3180 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "RADIUS-Antwort von %s zu kurz: %d" -#: libpq/auth.c:3205 +#: libpq/auth.c:3187 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "RADIUS-Antwort von %s hat verfälschte Länge: %d (tatsächliche Länge %d)" -#: libpq/auth.c:3213 +#: libpq/auth.c:3195 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "RADIUS-Antwort von %s unterscheidet sich von Anfrage: %d (sollte %d sein)" -#: libpq/auth.c:3238 +#: libpq/auth.c:3220 #, c-format msgid "could not perform MD5 encryption of received packet: %s" msgstr "konnte MD5-Verschlüsselung des empfangenen Pakets nicht durchführen: %s" -#: libpq/auth.c:3248 +#: libpq/auth.c:3230 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "RADIUS-Antwort von %s hat falsche MD5-Signatur" -#: libpq/auth.c:3266 +#: libpq/auth.c:3248 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "RADIUS-Antwort von %s hat ungültigen Code (%d) für Benutzer »%s«" @@ -15141,64 +15604,51 @@ msgstr "konnte Serverdatei »%s« nicht schreiben: %m" msgid "large object read request is too large" msgstr "Large-Object-Leseaufforderung ist zu groß" -#: libpq/be-fsstubs.c:816 utils/adt/genfile.c:262 utils/adt/genfile.c:294 -#: utils/adt/genfile.c:315 +#: libpq/be-fsstubs.c:816 utils/adt/genfile.c:248 utils/adt/genfile.c:269 #, c-format msgid "requested length cannot be negative" msgstr "verlangte Länge darf nicht negativ sein" -#: libpq/be-fsstubs.c:871 storage/large_object/inv_api.c:299 -#: storage/large_object/inv_api.c:311 storage/large_object/inv_api.c:508 -#: storage/large_object/inv_api.c:619 storage/large_object/inv_api.c:809 -#, c-format -msgid "permission denied for large object %u" -msgstr "keine Berechtigung für Large Object %u" - -#: libpq/be-secure-common.c:71 -#, c-format -msgid "could not read from command \"%s\": %m" -msgstr "konnte nicht von Befehl »%s« lesen: %m" - -#: libpq/be-secure-common.c:91 +#: libpq/be-secure-common.c:94 #, c-format msgid "command \"%s\" failed" msgstr "Befehl »%s« fehlgeschlagen" -#: libpq/be-secure-common.c:119 +#: libpq/be-secure-common.c:123 #, c-format msgid "could not access private key file \"%s\": %m" msgstr "konnte auf private Schlüsseldatei »%s« nicht zugreifen: %m" -#: libpq/be-secure-common.c:129 +#: libpq/be-secure-common.c:133 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "private Schlüsseldatei »%s« ist keine normale Datei" -#: libpq/be-secure-common.c:155 +#: libpq/be-secure-common.c:159 #, c-format msgid "private key file \"%s\" must be owned by the database user or root" msgstr "private Schlüsseldatei »%s« muss als Eigentümer den Datenbankbenutzer oder »root« haben" -#: libpq/be-secure-common.c:165 +#: libpq/be-secure-common.c:169 #, c-format msgid "private key file \"%s\" has group or world access" msgstr "private Schlüsseldatei »%s« erlaubt Zugriff von Gruppe oder Welt" -#: libpq/be-secure-common.c:167 +#: libpq/be-secure-common.c:171 #, c-format msgid "File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root." msgstr "Dateirechte müssen u=rw (0600) oder weniger sein, wenn der Eigentümer der Datenbankbenutzer ist, oder u=rw,g=r (0640) oder weniger, wenn der Eigentümer »root« ist." -#: libpq/be-secure-gssapi.c:204 +#: libpq/be-secure-gssapi.c:201 msgid "GSSAPI wrap error" msgstr "GSSAPI-Wrap-Fehler" -#: libpq/be-secure-gssapi.c:211 +#: libpq/be-secure-gssapi.c:208 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "ausgehende GSSAPI-Nachricht würde keine Vertraulichkeit verwenden" -#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:634 +#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "Server versuchte übergroßes GSSAPI-Paket zu senden (%zu > %zu)" @@ -15230,816 +15680,810 @@ msgstr "konnte GSSAPI-Sicherheitskontext nicht akzeptieren" msgid "GSSAPI size check error" msgstr "GSSAPI-Fehler bei der Größenprüfung" -#: libpq/be-secure-openssl.c:125 +#: libpq/be-secure-openssl.c:131 #, c-format msgid "could not create SSL context: %s" msgstr "konnte SSL-Kontext nicht erzeugen: %s" -#: libpq/be-secure-openssl.c:151 +#: libpq/be-secure-openssl.c:157 #, c-format msgid "could not load server certificate file \"%s\": %s" msgstr "konnte Serverzertifikatsdatei »%s« nicht laden: %s" -#: libpq/be-secure-openssl.c:171 +#: libpq/be-secure-openssl.c:177 #, c-format msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" msgstr "private Schlüsseldatei »%s« kann nicht neu geladen werden, weil sie eine Passphrase benötigt" -#: libpq/be-secure-openssl.c:176 +#: libpq/be-secure-openssl.c:182 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "konnte private Schlüsseldatei »%s« nicht laden: %s" -#: libpq/be-secure-openssl.c:185 +#: libpq/be-secure-openssl.c:191 #, c-format msgid "check of private key failed: %s" msgstr "Überprüfung des privaten Schlüssels fehlgeschlagen: %s" #. translator: first %s is a GUC option name, second %s is its value -#: libpq/be-secure-openssl.c:198 libpq/be-secure-openssl.c:221 +#: libpq/be-secure-openssl.c:204 libpq/be-secure-openssl.c:227 #, c-format msgid "\"%s\" setting \"%s\" not supported by this build" msgstr "»%s«-Wert »%s« wird von dieser Installation nicht unterstützt" -#: libpq/be-secure-openssl.c:208 +#: libpq/be-secure-openssl.c:214 #, c-format msgid "could not set minimum SSL protocol version" msgstr "konnte minimale SSL-Protokollversion nicht setzen" -#: libpq/be-secure-openssl.c:231 +#: libpq/be-secure-openssl.c:237 #, c-format msgid "could not set maximum SSL protocol version" msgstr "konnte maximale SSL-Protokollversion nicht setzen" -#: libpq/be-secure-openssl.c:247 +#: libpq/be-secure-openssl.c:253 #, c-format msgid "could not set SSL protocol version range" msgstr "konnte SSL-Protokollversionsbereich nicht setzen" -#: libpq/be-secure-openssl.c:248 +#: libpq/be-secure-openssl.c:254 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "»%s« kann nicht höher als »%s« sein" -#: libpq/be-secure-openssl.c:285 +#: libpq/be-secure-openssl.c:307 #, c-format msgid "could not set the cipher list (no valid ciphers available)" msgstr "konnte Cipher-Liste nicht setzen (keine gültigen Ciphers verfügbar)" -#: libpq/be-secure-openssl.c:305 +#: libpq/be-secure-openssl.c:327 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "konnte Root-Zertifikat-Datei »%s« nicht laden: %s" -#: libpq/be-secure-openssl.c:354 +#: libpq/be-secure-openssl.c:376 #, c-format msgid "could not load SSL certificate revocation list file \"%s\": %s" msgstr "konnte SSL-Certificate-Revocation-List-Datei »%s« nicht laden: %s" -#: libpq/be-secure-openssl.c:362 +#: libpq/be-secure-openssl.c:384 #, c-format msgid "could not load SSL certificate revocation list directory \"%s\": %s" msgstr "konnte SSL-Certificate-Revocation-List-Verzeichnis »%s« nicht laden: %s" -#: libpq/be-secure-openssl.c:370 +#: libpq/be-secure-openssl.c:392 #, c-format msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" msgstr "konnte SSL-Certificate-Revocation-List-Datei »%s« oder -Verzeichnis »%s« nicht laden: %s" -#: libpq/be-secure-openssl.c:428 +#: libpq/be-secure-openssl.c:450 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "konnte SSL-Verbindung nicht initialisieren: SSL-Kontext nicht eingerichtet" -#: libpq/be-secure-openssl.c:439 +#: libpq/be-secure-openssl.c:464 #, c-format msgid "could not initialize SSL connection: %s" msgstr "konnte SSL-Verbindung nicht initialisieren: %s" -#: libpq/be-secure-openssl.c:447 +#: libpq/be-secure-openssl.c:472 #, c-format msgid "could not set SSL socket: %s" msgstr "konnte SSL-Socket nicht setzen: %s" -#: libpq/be-secure-openssl.c:502 +#: libpq/be-secure-openssl.c:528 #, c-format msgid "could not accept SSL connection: %m" msgstr "konnte SSL-Verbindung nicht annehmen: %m" -#: libpq/be-secure-openssl.c:506 libpq/be-secure-openssl.c:561 +#: libpq/be-secure-openssl.c:532 libpq/be-secure-openssl.c:589 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "konnte SSL-Verbindung nicht annehmen: EOF entdeckt" -#: libpq/be-secure-openssl.c:545 +#: libpq/be-secure-openssl.c:573 #, c-format msgid "could not accept SSL connection: %s" msgstr "konnte SSL-Verbindung nicht annehmen: %s" -#: libpq/be-secure-openssl.c:549 +#: libpq/be-secure-openssl.c:577 #, c-format msgid "This may indicate that the client does not support any SSL protocol version between %s and %s." msgstr "Das zeigt möglicherweise an, dass der Client keine SSL-Protokollversion zwischen %s und %s unterstützt." -#: libpq/be-secure-openssl.c:566 libpq/be-secure-openssl.c:746 -#: libpq/be-secure-openssl.c:810 +#: libpq/be-secure-openssl.c:594 libpq/be-secure-openssl.c:809 +#: libpq/be-secure-openssl.c:879 #, c-format msgid "unrecognized SSL error code: %d" msgstr "unbekannter SSL-Fehlercode: %d" -#: libpq/be-secure-openssl.c:612 +#: libpq/be-secure-openssl.c:622 +#, c-format +msgid "received SSL connection request with unexpected ALPN protocol" +msgstr "SSL-Verbindungsanfrage mit unerwartetem ALPN-Protokoll erhalten" + +#: libpq/be-secure-openssl.c:666 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "Common-Name im SSL-Zertifikat enthält Null-Byte" -#: libpq/be-secure-openssl.c:652 +#: libpq/be-secure-openssl.c:712 #, c-format msgid "SSL certificate's distinguished name contains embedded null" msgstr "Distinguished Name im SSL-Zertifikat enthält Null-Byte" -#: libpq/be-secure-openssl.c:735 libpq/be-secure-openssl.c:794 +#: libpq/be-secure-openssl.c:798 libpq/be-secure-openssl.c:863 #, c-format msgid "SSL error: %s" msgstr "SSL-Fehler: %s" -#: libpq/be-secure-openssl.c:976 +#: libpq/be-secure-openssl.c:1038 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "konnte DH-Parameterdatei »%s« nicht öffnen: %m" -#: libpq/be-secure-openssl.c:988 +#: libpq/be-secure-openssl.c:1050 #, c-format msgid "could not load DH parameters file: %s" msgstr "konnte DH-Parameterdatei nicht laden: %s" -#: libpq/be-secure-openssl.c:998 +#: libpq/be-secure-openssl.c:1060 #, c-format msgid "invalid DH parameters: %s" msgstr "ungültige DH-Parameter: %s" -#: libpq/be-secure-openssl.c:1007 +#: libpq/be-secure-openssl.c:1069 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "ungültige DH-Parameter: p ist keine Primzahl" -#: libpq/be-secure-openssl.c:1016 +#: libpq/be-secure-openssl.c:1078 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "ungültige DH-Parameter: weder geeigneter Generator noch sichere Primzahl" -#: libpq/be-secure-openssl.c:1152 -#, fuzzy, c-format -#| msgid "certificate authentication failed for user \"%s\"" +#: libpq/be-secure-openssl.c:1214 +#, c-format msgid "Client certificate verification failed at depth %d: %s." -msgstr "Zertifikatauthentifizierung für Benutzer »%s« fehlgeschlagen" +msgstr "Überprüfung des Client-Zertifikats ist auf Tiefe %d fehlgeschlagen: %s." -#: libpq/be-secure-openssl.c:1189 +#: libpq/be-secure-openssl.c:1251 #, c-format msgid "Failed certificate data (unverified): subject \"%s\", serial number %s, issuer \"%s\"." msgstr "Daten des fehlgeschlagenen Zertifikats (nicht verifiziert): Subject »%s«, Seriennummer %s, Aussteller »%s«." -#: libpq/be-secure-openssl.c:1190 +#: libpq/be-secure-openssl.c:1252 msgid "unknown" msgstr "unbekannt" -#: libpq/be-secure-openssl.c:1281 +#: libpq/be-secure-openssl.c:1389 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: konnte DH-Parameter nicht laden" -#: libpq/be-secure-openssl.c:1289 +#: libpq/be-secure-openssl.c:1397 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: konnte DH-Parameter nicht setzen: %s" -#: libpq/be-secure-openssl.c:1316 +#: libpq/be-secure-openssl.c:1424 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: unbekannter Kurvenname: %s" -#: libpq/be-secure-openssl.c:1325 +#: libpq/be-secure-openssl.c:1433 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: konnte Schlüssel nicht erzeugen" -#: libpq/be-secure-openssl.c:1353 +#: libpq/be-secure-openssl.c:1461 msgid "no SSL error reported" msgstr "kein SSL-Fehler berichtet" -#: libpq/be-secure-openssl.c:1357 +#: libpq/be-secure-openssl.c:1479 #, c-format msgid "SSL error code %lu" msgstr "SSL-Fehlercode %lu" -#: libpq/be-secure-openssl.c:1516 +#: libpq/be-secure-openssl.c:1636 #, c-format msgid "could not create BIO" msgstr "konnte BIO nicht erzeugen" -#: libpq/be-secure-openssl.c:1526 +#: libpq/be-secure-openssl.c:1646 #, c-format msgid "could not get NID for ASN1_OBJECT object" msgstr "konnte NID für ASN1_OBJECT-Objekt nicht ermitteln" -#: libpq/be-secure-openssl.c:1534 +#: libpq/be-secure-openssl.c:1654 #, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" msgstr "konnte NID %d nicht in eine ASN1_OBJECT-Struktur umwandeln" -#: libpq/be-secure.c:207 libpq/be-secure.c:303 -#, c-format -msgid "terminating connection due to unexpected postmaster exit" -msgstr "Verbindung wird abgebrochen wegen unerwartetem Ende des Postmasters" - -#: libpq/crypt.c:49 +#: libpq/crypt.c:48 #, c-format msgid "Role \"%s\" does not exist." msgstr "Rolle »%s« existiert nicht." -#: libpq/crypt.c:59 +#: libpq/crypt.c:58 #, c-format msgid "User \"%s\" has no password assigned." msgstr "Benutzer »%s« hat kein Passwort zugewiesen." -#: libpq/crypt.c:77 +#: libpq/crypt.c:76 #, c-format msgid "User \"%s\" has an expired password." msgstr "Benutzer »%s« hat ein abgelaufenes Passwort." -#: libpq/crypt.c:183 +#: libpq/crypt.c:182 #, c-format msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "Benutzer »%s« hat ein Passwort, das nicht mit MD5-Authentifizierung verwendet werden kann." -#: libpq/crypt.c:204 libpq/crypt.c:246 libpq/crypt.c:266 +#: libpq/crypt.c:203 libpq/crypt.c:245 libpq/crypt.c:265 #, c-format msgid "Password does not match for user \"%s\"." msgstr "Passwort stimmt nicht überein für Benutzer »%s«." -#: libpq/crypt.c:285 +#: libpq/crypt.c:284 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "Passwort von Benutzer »%s« hat unbekanntes Format." -#: libpq/hba.c:234 -#, c-format -msgid "authentication file token too long, skipping: \"%s\"" -msgstr "Token in Authentifizierungsdatei zu lang, wird übersprungen: »%s«" - -#: libpq/hba.c:357 +#: libpq/hba.c:327 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "ungültiger regulärer Ausdruck »%s«: %s" -#: libpq/hba.c:359 libpq/hba.c:688 libpq/hba.c:1272 libpq/hba.c:1292 -#: libpq/hba.c:1315 libpq/hba.c:1328 libpq/hba.c:1381 libpq/hba.c:1409 -#: libpq/hba.c:1417 libpq/hba.c:1429 libpq/hba.c:1450 libpq/hba.c:1463 -#: libpq/hba.c:1488 libpq/hba.c:1515 libpq/hba.c:1527 libpq/hba.c:1586 -#: libpq/hba.c:1606 libpq/hba.c:1620 libpq/hba.c:1640 libpq/hba.c:1651 -#: libpq/hba.c:1666 libpq/hba.c:1685 libpq/hba.c:1701 libpq/hba.c:1713 -#: libpq/hba.c:1750 libpq/hba.c:1791 libpq/hba.c:1804 libpq/hba.c:1826 -#: libpq/hba.c:1838 libpq/hba.c:1856 libpq/hba.c:1906 libpq/hba.c:1950 -#: libpq/hba.c:1961 libpq/hba.c:1977 libpq/hba.c:1994 libpq/hba.c:2005 -#: libpq/hba.c:2024 libpq/hba.c:2040 libpq/hba.c:2056 libpq/hba.c:2115 -#: libpq/hba.c:2132 libpq/hba.c:2145 libpq/hba.c:2157 libpq/hba.c:2176 -#: libpq/hba.c:2262 libpq/hba.c:2280 libpq/hba.c:2374 libpq/hba.c:2393 -#: libpq/hba.c:2422 libpq/hba.c:2435 libpq/hba.c:2458 libpq/hba.c:2480 -#: libpq/hba.c:2494 tsearch/ts_locale.c:243 +#: libpq/hba.c:329 libpq/hba.c:661 libpq/hba.c:1245 libpq/hba.c:1265 +#: libpq/hba.c:1288 libpq/hba.c:1301 libpq/hba.c:1354 libpq/hba.c:1382 +#: libpq/hba.c:1390 libpq/hba.c:1402 libpq/hba.c:1423 libpq/hba.c:1436 +#: libpq/hba.c:1461 libpq/hba.c:1488 libpq/hba.c:1500 libpq/hba.c:1559 +#: libpq/hba.c:1579 libpq/hba.c:1593 libpq/hba.c:1613 libpq/hba.c:1624 +#: libpq/hba.c:1639 libpq/hba.c:1658 libpq/hba.c:1674 libpq/hba.c:1686 +#: libpq/hba.c:1752 libpq/hba.c:1765 libpq/hba.c:1787 libpq/hba.c:1799 +#: libpq/hba.c:1817 libpq/hba.c:1867 libpq/hba.c:1911 libpq/hba.c:1922 +#: libpq/hba.c:1938 libpq/hba.c:1955 libpq/hba.c:1966 libpq/hba.c:1985 +#: libpq/hba.c:2001 libpq/hba.c:2017 libpq/hba.c:2076 libpq/hba.c:2093 +#: libpq/hba.c:2106 libpq/hba.c:2118 libpq/hba.c:2137 libpq/hba.c:2223 +#: libpq/hba.c:2241 libpq/hba.c:2335 libpq/hba.c:2354 libpq/hba.c:2383 +#: libpq/hba.c:2396 libpq/hba.c:2419 libpq/hba.c:2441 libpq/hba.c:2455 +#: tsearch/ts_locale.c:241 #, c-format msgid "line %d of configuration file \"%s\"" msgstr "Zeile %d in Konfigurationsdatei »%s«" -#: libpq/hba.c:484 +#: libpq/hba.c:457 #, c-format msgid "skipping missing authentication file \"%s\"" msgstr "fehlende Authentifizierungsdatei »%s« wird übersprungen" -#: libpq/hba.c:636 +#: libpq/hba.c:609 #, c-format msgid "could not open file \"%s\": maximum nesting depth exceeded" msgstr "konnte Datei »%s« nicht öffnen: maximale Verschachtelungstiefe überschritten" -#: libpq/hba.c:1243 +#: libpq/hba.c:1216 #, c-format msgid "error enumerating network interfaces: %m" msgstr "Fehler beim Aufzählen der Netzwerkschnittstellen: %m" #. translator: the second %s is a list of auth methods -#: libpq/hba.c:1270 +#: libpq/hba.c:1243 #, c-format msgid "authentication option \"%s\" is only valid for authentication methods %s" msgstr "Authentifizierungsoption »%s« ist nur gültig für Authentifizierungsmethoden %s" -#: libpq/hba.c:1290 +#: libpq/hba.c:1263 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "Authentifizierungsmethode »%s« benötigt Argument »%s«" -#: libpq/hba.c:1314 +#: libpq/hba.c:1287 #, c-format msgid "missing entry at end of line" msgstr "fehlender Eintrag am Ende der Zeile" -#: libpq/hba.c:1327 +#: libpq/hba.c:1300 #, c-format msgid "multiple values in ident field" msgstr "mehrere Werte in Ident-Feld" -#: libpq/hba.c:1379 +#: libpq/hba.c:1352 #, c-format msgid "multiple values specified for connection type" msgstr "mehrere Werte angegeben für Verbindungstyp" -#: libpq/hba.c:1380 +#: libpq/hba.c:1353 #, c-format msgid "Specify exactly one connection type per line." msgstr "Geben Sie genau einen Verbindungstyp pro Zeile an." -#: libpq/hba.c:1407 +#: libpq/hba.c:1380 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "hostssl-Eintrag kann nicht angewendet werden, weil SSL deaktiviert ist" -#: libpq/hba.c:1408 +#: libpq/hba.c:1381 #, c-format -msgid "Set ssl = on in postgresql.conf." -msgstr "Setzen Sie ssl = on in postgresql.conf." +msgid "Set \"ssl = on\" in postgresql.conf." +msgstr "Setzen Sie »ssl = on« in postgresql.conf." -#: libpq/hba.c:1416 +#: libpq/hba.c:1389 #, c-format msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "hostssl-Eintrag kann nicht angewendet werden, weil SSL von dieser Installation nicht unterstützt wird" -#: libpq/hba.c:1428 +#: libpq/hba.c:1401 #, c-format msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" msgstr "hostgssenc-Eintrag kann nicht angewendet werden, weil GSSAPI von dieser Installation nicht unterstützt wird" -#: libpq/hba.c:1448 +#: libpq/hba.c:1421 #, c-format msgid "invalid connection type \"%s\"" msgstr "ungültiger Verbindungstyp »%s«" -#: libpq/hba.c:1462 +#: libpq/hba.c:1435 #, c-format msgid "end-of-line before database specification" msgstr "Zeilenende vor Datenbankangabe" -#: libpq/hba.c:1487 +#: libpq/hba.c:1460 #, c-format msgid "end-of-line before role specification" msgstr "Zeilenende vor Rollenangabe" -#: libpq/hba.c:1514 +#: libpq/hba.c:1487 #, c-format msgid "end-of-line before IP address specification" msgstr "Zeilenende vor IP-Adressangabe" -#: libpq/hba.c:1525 +#: libpq/hba.c:1498 #, c-format msgid "multiple values specified for host address" msgstr "mehrere Werte für Hostadresse angegeben" -#: libpq/hba.c:1526 +#: libpq/hba.c:1499 #, c-format msgid "Specify one address range per line." msgstr "Geben Sie einen Adressbereich pro Zeile an." -#: libpq/hba.c:1584 +#: libpq/hba.c:1557 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "ungültige IP-Adresse »%s«: %s" -#: libpq/hba.c:1604 +#: libpq/hba.c:1577 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "Angabe von sowohl Hostname als auch CIDR-Maske ist ungültig: »%s«" -#: libpq/hba.c:1618 +#: libpq/hba.c:1591 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "ungültige CIDR-Maske in Adresse »%s«" -#: libpq/hba.c:1638 +#: libpq/hba.c:1611 #, c-format msgid "end-of-line before netmask specification" msgstr "Zeilenende vor Netzmaskenangabe" -#: libpq/hba.c:1639 +#: libpq/hba.c:1612 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "Geben Sie einen Adressbereich in CIDR-Schreibweise oder eine separate Netzmaske an." -#: libpq/hba.c:1650 +#: libpq/hba.c:1623 #, c-format msgid "multiple values specified for netmask" msgstr "mehrere Werte für Netzmaske angegeben" -#: libpq/hba.c:1664 +#: libpq/hba.c:1637 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "ungültige IP-Maske »%s«: %s" -#: libpq/hba.c:1684 +#: libpq/hba.c:1657 #, c-format msgid "IP address and mask do not match" msgstr "IP-Adresse und -Maske passen nicht zusammen" -#: libpq/hba.c:1700 +#: libpq/hba.c:1673 #, c-format msgid "end-of-line before authentication method" msgstr "Zeilenende vor Authentifizierungsmethode" -#: libpq/hba.c:1711 +#: libpq/hba.c:1684 #, c-format msgid "multiple values specified for authentication type" msgstr "mehrere Werte für Authentifizierungstyp angegeben" -#: libpq/hba.c:1712 +#: libpq/hba.c:1685 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Geben Sie genau einen Authentifizierungstyp pro Zeile an." -#: libpq/hba.c:1789 +#: libpq/hba.c:1750 #, c-format msgid "invalid authentication method \"%s\"" msgstr "ungültige Authentifizierungsmethode »%s«" -#: libpq/hba.c:1802 +#: libpq/hba.c:1763 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "ungültige Authentifizierungsmethode »%s«: von dieser Installation nicht unterstützt" -#: libpq/hba.c:1825 +#: libpq/hba.c:1786 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "gssapi-Authentifizierung wird auf lokalen Sockets nicht unterstützt" -#: libpq/hba.c:1837 +#: libpq/hba.c:1798 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "peer-Authentifizierung wird nur auf lokalen Sockets unterstützt" -#: libpq/hba.c:1855 +#: libpq/hba.c:1816 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "cert-Authentifizierung wird nur auf »hostssl«-Verbindungen unterstützt" -#: libpq/hba.c:1905 +#: libpq/hba.c:1866 #, c-format msgid "authentication option not in name=value format: %s" msgstr "Authentifizierungsoption nicht im Format name=wert: %s" -#: libpq/hba.c:1949 +#: libpq/hba.c:1910 #, c-format msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" msgstr "ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter oder ldapurl kann nicht zusammen mit ldapprefix verwendet werden" -#: libpq/hba.c:1960 +#: libpq/hba.c:1921 #, c-format msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" msgstr "Authentifizierungsmethode »ldap« benötigt Argument »ldapbasedn«, »ldapprefix« oder »ldapsuffix«" -#: libpq/hba.c:1976 +#: libpq/hba.c:1937 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "ldapsearchattribute kann nicht zusammen mit ldapsearchfilter verwendet werden" -#: libpq/hba.c:1993 +#: libpq/hba.c:1954 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "List der RADIUS-Server darf nicht leer sein" -#: libpq/hba.c:2004 +#: libpq/hba.c:1965 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "Liste der RADIUS-Geheimnisse darf nicht leer sein" -#: libpq/hba.c:2021 +#: libpq/hba.c:1982 #, c-format msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "die Anzahl der RADIUS-Geheimnisse (%d) muss 1 oder gleich der Anzahl der RADIUS-Server (%d) sein" -#: libpq/hba.c:2037 +#: libpq/hba.c:1998 #, c-format msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "die Anzahl der RADIUS-Ports (%d) muss 1 oder gleich der Anzahl der RADIUS-Server (%d) sein" -#: libpq/hba.c:2053 +#: libpq/hba.c:2014 #, c-format msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "die Anzahl der RADIUS-Bezeichner (%d) muss 1 oder gleich der Anzahl der RADIUS-Server (%d) sein" -#: libpq/hba.c:2105 +#: libpq/hba.c:2066 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi und cert" -#: libpq/hba.c:2114 +#: libpq/hba.c:2075 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert kann nur für »hostssl«-Zeilen konfiguriert werden" -#: libpq/hba.c:2131 +#: libpq/hba.c:2092 #, c-format msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "clientcert akzeptiert »verify-full« nur, wenn »cert«-Authentifizierung verwendet wird" -#: libpq/hba.c:2144 +#: libpq/hba.c:2105 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "ungültiger Wert für clientcert: »%s«" -#: libpq/hba.c:2156 +#: libpq/hba.c:2117 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "clientname kann nur für »hostssl«-Zeilen konfiguriert werden" -#: libpq/hba.c:2175 +#: libpq/hba.c:2136 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "ungültiger Wert für clientname: »%s«" -#: libpq/hba.c:2208 +#: libpq/hba.c:2169 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "konnte LDAP-URL »%s« nicht interpretieren: %s" -#: libpq/hba.c:2219 +#: libpq/hba.c:2180 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "nicht unterstütztes LDAP-URL-Schema: %s" -#: libpq/hba.c:2243 +#: libpq/hba.c:2204 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "LDAP-URLs werden auf dieser Plattform nicht unterstützt" -#: libpq/hba.c:2261 +#: libpq/hba.c:2222 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "ungültiger ldapscheme-Wert: »%s«" -#: libpq/hba.c:2279 +#: libpq/hba.c:2240 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "ungültige LDAP-Portnummer: »%s«" -#: libpq/hba.c:2325 libpq/hba.c:2332 +#: libpq/hba.c:2286 libpq/hba.c:2293 msgid "gssapi and sspi" msgstr "gssapi und sspi" -#: libpq/hba.c:2341 libpq/hba.c:2350 +#: libpq/hba.c:2302 libpq/hba.c:2311 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:2372 +#: libpq/hba.c:2333 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "konnte RADIUS-Serverliste »%s« nicht parsen" -#: libpq/hba.c:2420 +#: libpq/hba.c:2381 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "konnte RADIUS-Portliste »%s« nicht parsen" -#: libpq/hba.c:2434 +#: libpq/hba.c:2395 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "ungültige RADIUS-Portnummer: »%s«" -#: libpq/hba.c:2456 +#: libpq/hba.c:2417 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "konnte RADIUS-Geheimnisliste »%s« nicht parsen" -#: libpq/hba.c:2478 +#: libpq/hba.c:2439 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "konnte RADIUS-Bezeichnerliste »%s« nicht parsen" -#: libpq/hba.c:2492 +#: libpq/hba.c:2453 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "unbekannter Authentifizierungsoptionsname: »%s«" -#: libpq/hba.c:2684 +#: libpq/hba.c:2645 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "Konfigurationsdatei »%s« enthält keine Einträge" -#: libpq/hba.c:2837 +#: libpq/hba.c:2798 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "Suche nach regulärem Ausdruck für »%s« fehlgeschlagen: %s" -#: libpq/hba.c:2861 +#: libpq/hba.c:2822 #, c-format msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" msgstr "regulärer Ausdruck »%s« hat keine Teilausdrücke wie von der Backreference in »%s« verlangt" -#: libpq/hba.c:2964 +#: libpq/hba.c:2925 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "angegebener Benutzername (%s) und authentifizierter Benutzername (%s) stimmen nicht überein" -#: libpq/hba.c:2984 +#: libpq/hba.c:2945 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "kein passender Eintrag in Usermap »%s« für Benutzer »%s«, authentifiziert als »%s«" -#: libpq/pqcomm.c:200 +#: libpq/pqcomm.c:211 libpq/pqcomm.c:219 libpq/pqcomm.c:250 libpq/pqcomm.c:259 +#: libpq/pqcomm.c:1648 libpq/pqcomm.c:1693 libpq/pqcomm.c:1733 +#: libpq/pqcomm.c:1777 libpq/pqcomm.c:1816 libpq/pqcomm.c:1855 +#: libpq/pqcomm.c:1891 libpq/pqcomm.c:1930 +#, c-format +msgid "%s(%s) failed: %m" +msgstr "%s(%s) fehlgeschlagen: %m" + +#: libpq/pqcomm.c:296 #, c-format msgid "could not set socket to nonblocking mode: %m" msgstr "konnte Socket nicht auf nicht-blockierenden Modus umstellen: %m" -#: libpq/pqcomm.c:361 +#: libpq/pqcomm.c:456 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "Unix-Domain-Socket-Pfad »%s« ist zu lang (maximal %d Bytes)" -#: libpq/pqcomm.c:381 +#: libpq/pqcomm.c:476 #, c-format msgid "could not translate host name \"%s\", service \"%s\" to address: %s" msgstr "konnte Hostname »%s«, Dienst »%s« nicht in Adresse übersetzen: %s" -#: libpq/pqcomm.c:385 +#: libpq/pqcomm.c:480 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "konnte Dienst »%s« nicht in Adresse übersetzen: %s" -#: libpq/pqcomm.c:412 +#: libpq/pqcomm.c:502 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "konnte nicht an alle verlangten Adressen binden: MAXLISTEN (%d) überschritten" -#: libpq/pqcomm.c:421 +#: libpq/pqcomm.c:511 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:424 +#: libpq/pqcomm.c:514 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:427 +#: libpq/pqcomm.c:517 msgid "Unix" msgstr "Unix" -#: libpq/pqcomm.c:431 +#: libpq/pqcomm.c:521 #, c-format msgid "unrecognized address family %d" msgstr "unbekannte Adressfamilie %d" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:455 +#: libpq/pqcomm.c:545 #, c-format msgid "could not create %s socket for address \"%s\": %m" msgstr "konnte %s-Socket für Adresse »%s« nicht erzeugen: %m" #. translator: third %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:481 libpq/pqcomm.c:499 +#: libpq/pqcomm.c:574 libpq/pqcomm.c:592 #, c-format msgid "%s(%s) failed for %s address \"%s\": %m" msgstr "%s(%s) für %s-Adresse »%s« fehlgeschlagen: %m" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:522 +#: libpq/pqcomm.c:615 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "konnte %s-Adresse »%s« nicht binden: %m" -#: libpq/pqcomm.c:526 +#: libpq/pqcomm.c:619 #, c-format msgid "Is another postmaster already running on port %d?" msgstr "Läuft bereits ein anderer Postmaster auf Port %d?" -#: libpq/pqcomm.c:528 +#: libpq/pqcomm.c:621 #, c-format msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." msgstr "Läuft bereits ein anderer Postmaster auf Port %d? Wenn nicht, warten Sie einige Sekunden und versuchen Sie erneut." #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:557 +#: libpq/pqcomm.c:650 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "konnte nicht auf %s-Adresse »%s« hören: %m" -#: libpq/pqcomm.c:565 +#: libpq/pqcomm.c:658 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "erwarte Verbindungen auf Unix-Socket »%s«" #. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:570 +#: libpq/pqcomm.c:663 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "erwarte Verbindungen auf %s-Adresse »%s«, Port %d" -#: libpq/pqcomm.c:659 +#: libpq/pqcomm.c:753 #, c-format msgid "group \"%s\" does not exist" msgstr "Gruppe »%s« existiert nicht" -#: libpq/pqcomm.c:669 +#: libpq/pqcomm.c:763 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "konnte Gruppe von Datei »%s« nicht setzen: %m" -#: libpq/pqcomm.c:680 +#: libpq/pqcomm.c:774 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "konnte Zugriffsrechte von Datei »%s« nicht setzen: %m" -#: libpq/pqcomm.c:708 +#: libpq/pqcomm.c:803 #, c-format msgid "could not accept new connection: %m" msgstr "konnte neue Verbindung nicht akzeptieren: %m" -#: libpq/pqcomm.c:748 libpq/pqcomm.c:757 libpq/pqcomm.c:789 libpq/pqcomm.c:799 -#: libpq/pqcomm.c:1624 libpq/pqcomm.c:1669 libpq/pqcomm.c:1709 -#: libpq/pqcomm.c:1753 libpq/pqcomm.c:1792 libpq/pqcomm.c:1831 -#: libpq/pqcomm.c:1867 libpq/pqcomm.c:1906 -#, c-format -msgid "%s(%s) failed: %m" -msgstr "%s(%s) fehlgeschlagen: %m" - -#: libpq/pqcomm.c:903 +#: libpq/pqcomm.c:885 #, c-format msgid "there is no client connection" msgstr "es besteht keine Client-Verbindung" -#: libpq/pqcomm.c:954 libpq/pqcomm.c:1050 +#: libpq/pqcomm.c:941 libpq/pqcomm.c:1042 #, c-format msgid "could not receive data from client: %m" msgstr "konnte Daten vom Client nicht empfangen: %m" -#: libpq/pqcomm.c:1155 tcop/postgres.c:4403 +#: libpq/pqcomm.c:1149 tcop/postgres.c:4533 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "Verbindung wird abgebrochen, weil Protokollsynchronisierung verloren wurde" -#: libpq/pqcomm.c:1221 +#: libpq/pqcomm.c:1215 #, c-format msgid "unexpected EOF within message length word" msgstr "unerwartetes EOF im Message-Längenwort" -#: libpq/pqcomm.c:1231 +#: libpq/pqcomm.c:1225 #, c-format msgid "invalid message length" msgstr "ungültige Message-Länge" -#: libpq/pqcomm.c:1253 libpq/pqcomm.c:1266 +#: libpq/pqcomm.c:1247 libpq/pqcomm.c:1260 #, c-format msgid "incomplete message from client" msgstr "unvollständige Message vom Client" -#: libpq/pqcomm.c:1377 +#: libpq/pqcomm.c:1401 #, c-format msgid "could not send data to client: %m" msgstr "konnte Daten nicht an den Client senden: %m" -#: libpq/pqcomm.c:1592 +#: libpq/pqcomm.c:1616 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s) fehlgeschlagen: Fehlercode %d" -#: libpq/pqcomm.c:1681 +#: libpq/pqcomm.c:1705 #, c-format msgid "setting the keepalive idle time is not supported" msgstr "Setzen der Keepalive-Idle-Zeit wird nicht unterstützt" -#: libpq/pqcomm.c:1765 libpq/pqcomm.c:1840 libpq/pqcomm.c:1915 +#: libpq/pqcomm.c:1789 libpq/pqcomm.c:1864 libpq/pqcomm.c:1939 #, c-format msgid "%s(%s) not supported" msgstr "%s(%s) nicht unterstützt" -#: libpq/pqformat.c:407 +#: libpq/pqformat.c:404 #, c-format msgid "no data left in message" msgstr "keine Daten in Message übrig" -#: libpq/pqformat.c:518 libpq/pqformat.c:536 libpq/pqformat.c:557 -#: utils/adt/array_userfuncs.c:799 utils/adt/arrayfuncs.c:1506 -#: utils/adt/rowtypes.c:615 +#: libpq/pqformat.c:515 libpq/pqformat.c:533 libpq/pqformat.c:554 +#: utils/adt/array_userfuncs.c:797 utils/adt/arrayfuncs.c:1481 +#: utils/adt/rowtypes.c:613 #, c-format msgid "insufficient data left in message" msgstr "nicht genug Daten in Message übrig" -#: libpq/pqformat.c:598 libpq/pqformat.c:627 +#: libpq/pqformat.c:595 libpq/pqformat.c:624 #, c-format msgid "invalid string in message" msgstr "ungültige Zeichenkette in Message" -#: libpq/pqformat.c:643 +#: libpq/pqformat.c:640 #, c-format msgid "invalid message format" msgstr "ungültiges Message-Format" -#: main/main.c:235 +#: main/main.c:236 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: WSAStartup fehlgeschlagen: %d\n" -#: main/main.c:329 +#: main/main.c:324 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -16048,7 +16492,7 @@ msgstr "" "%s ist der PostgreSQL-Server.\n" "\n" -#: main/main.c:330 +#: main/main.c:325 #, c-format msgid "" "Usage:\n" @@ -16059,107 +16503,107 @@ msgstr "" " %s [OPTION]...\n" "\n" -#: main/main.c:331 +#: main/main.c:326 #, c-format msgid "Options:\n" msgstr "Optionen:\n" -#: main/main.c:332 +#: main/main.c:327 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B ZAHL Anzahl der geteilten Puffer\n" -#: main/main.c:333 +#: main/main.c:328 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NAME=WERT setze Konfigurationsparameter\n" -#: main/main.c:334 +#: main/main.c:329 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C NAME Wert des Konfigurationsparameters ausgeben, dann beenden\n" -#: main/main.c:335 +#: main/main.c:330 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 Debug-Level\n" -#: main/main.c:336 +#: main/main.c:331 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D VERZEICHNIS Datenbankverzeichnis\n" -#: main/main.c:337 +#: main/main.c:332 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e verwende europäisches Datumseingabeformat (DMY)\n" -#: main/main.c:338 +#: main/main.c:333 #, c-format msgid " -F turn fsync off\n" msgstr " -F »fsync« ausschalten\n" -#: main/main.c:339 +#: main/main.c:334 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h HOSTNAME horche auf Hostname oder IP-Adresse\n" -#: main/main.c:340 +#: main/main.c:335 #, c-format msgid " -i enable TCP/IP connections (deprecated)\n" msgstr " -i ermögliche TCP/IP-Verbindungen (veraltet)\n" -#: main/main.c:341 +#: main/main.c:336 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k VERZEICHNIS Ort der Unix-Domain-Socket\n" -#: main/main.c:343 +#: main/main.c:338 #, c-format msgid " -l enable SSL connections\n" msgstr " -l ermögliche SSL-Verbindungen\n" -#: main/main.c:345 +#: main/main.c:340 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N ZAHL Anzahl der erlaubten Verbindungen\n" -#: main/main.c:346 +#: main/main.c:341 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT auf dieser Portnummer horchen\n" -#: main/main.c:347 +#: main/main.c:342 #, c-format msgid " -s show statistics after each query\n" msgstr " -s zeige Statistiken nach jeder Anfrage\n" -#: main/main.c:348 +#: main/main.c:343 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S ZAHL setze Speicher für Sortiervorgänge (in kB)\n" -#: main/main.c:349 +#: main/main.c:344 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: main/main.c:350 +#: main/main.c:345 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAME=WERT setze Konfigurationsparameter\n" -#: main/main.c:351 +#: main/main.c:346 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config zeige Konfigurationsparameter und beende\n" -#: main/main.c:352 +#: main/main.c:347 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: main/main.c:354 +#: main/main.c:349 #, c-format msgid "" "\n" @@ -16168,37 +16612,37 @@ msgstr "" "\n" "Entwickleroptionen:\n" -#: main/main.c:355 +#: main/main.c:350 #, c-format msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" msgstr " -f s|i|o|b|t|n|m|h verbiete Verwendung einiger Plantypen\n" -#: main/main.c:356 +#: main/main.c:351 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O erlaube Änderungen an Systemtabellenstruktur\n" -#: main/main.c:357 +#: main/main.c:352 #, c-format msgid " -P disable system indexes\n" msgstr " -P schalte Systemindexe aus\n" -#: main/main.c:358 +#: main/main.c:353 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex zeige Zeitmessung nach jeder Anfrage\n" -#: main/main.c:359 +#: main/main.c:354 #, c-format msgid " -T send SIGABRT to all backend processes if one dies\n" msgstr " -T SIGABRT an alle Backend-Prozesse senden wenn einer stirbt\n" -#: main/main.c:360 +#: main/main.c:355 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr " -W ZAHL warte ZAHL Sekunden, um Debugger starten zu können\n" -#: main/main.c:362 +#: main/main.c:357 #, c-format msgid "" "\n" @@ -16207,39 +16651,39 @@ msgstr "" "\n" "Optionen für Einzelbenutzermodus:\n" -#: main/main.c:363 +#: main/main.c:358 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr " --single wählt den Einzelbenutzermodus (muss erstes Argument sein)\n" -#: main/main.c:364 +#: main/main.c:359 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME Datenbankname (Vorgabe: Benutzername)\n" -#: main/main.c:365 +#: main/main.c:360 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 Debug-Level setzen\n" -#: main/main.c:366 +#: main/main.c:361 #, c-format msgid " -E echo statement before execution\n" msgstr " -E gebe Befehl vor der Ausführung aus\n" -#: main/main.c:367 +#: main/main.c:362 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr "" " -j verwende Zeilenende nicht als Anfrageende im interaktiven\n" " Modus\n" -#: main/main.c:368 main/main.c:374 +#: main/main.c:363 main/main.c:369 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r DATEINAME sende stdout und stderr in genannte Datei\n" -#: main/main.c:370 +#: main/main.c:365 #, c-format msgid "" "\n" @@ -16248,22 +16692,22 @@ msgstr "" "\n" "Optionen für Bootstrap-Modus:\n" -#: main/main.c:371 +#: main/main.c:366 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot wählt den Bootstrap-Modus (muss erstes Argument sein)\n" -#: main/main.c:372 +#: main/main.c:367 #, c-format msgid " --check selects check mode (must be first argument)\n" msgstr " --check wählt den Check-Modus (muss erstes Argument sein)\n" -#: main/main.c:373 +#: main/main.c:368 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr " DBNAME Datenbankname (Pflichtangabe im Bootstrap-Modus)\n" -#: main/main.c:376 +#: main/main.c:371 #, c-format msgid "" "\n" @@ -16280,12 +16724,12 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: main/main.c:380 +#: main/main.c:375 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: main/main.c:391 +#: main/main.c:386 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -16299,12 +16743,12 @@ msgstr "" "Dokumentation finden Sie weitere Informationen darüber, wie der\n" "Server richtig gestartet wird.\n" -#: main/main.c:408 +#: main/main.c:403 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: reelle und effektive Benutzer-IDs müssen übereinstimmen\n" -#: main/main.c:415 +#: main/main.c:410 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -16329,20 +16773,15 @@ msgstr "erweiterbarer Knotentyp »%s« existiert bereits" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods »%s« wurde nicht registriert" -#: nodes/makefuncs.c:153 statistics/extended_stats.c:2335 +#: nodes/makefuncs.c:152 nodes/makefuncs.c:178 statistics/extended_stats.c:2310 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "Relation »%s« hat keinen zusammengesetzten Typ" -#: nodes/makefuncs.c:878 -#, c-format -msgid "unrecognized JSON encoding: %s" -msgstr "unbekannte JSON-Kodierung: %s" - -#: nodes/nodeFuncs.c:116 nodes/nodeFuncs.c:147 parser/parse_coerce.c:2567 -#: parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 -#: parser/parse_expr.c:2049 parser/parse_func.c:710 parser/parse_oper.c:883 -#: utils/fmgr/funcapi.c:661 +#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2604 +#: parser/parse_coerce.c:2742 parser/parse_coerce.c:2789 +#: parser/parse_expr.c:2120 parser/parse_func.c:710 parser/parse_oper.c:869 +#: utils/fmgr/funcapi.c:669 #, c-format msgid "could not find array type for data type %s" msgstr "konnte Arraytyp für Datentyp %s nicht finden" @@ -16362,926 +16801,931 @@ msgstr "unbenanntes Portal mit Parametern: %s" msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN wird nur für Merge- oder Hash-Verbund-fähige Verbundbedingungen unterstützt" -#: optimizer/plan/createplan.c:7111 parser/parse_merge.c:182 -#: parser/parse_merge.c:189 +#: optimizer/plan/createplan.c:7175 parser/parse_merge.c:203 +#: rewrite/rewriteHandler.c:1680 #, c-format msgid "cannot execute MERGE on relation \"%s\"" msgstr "MERGE kann für Relation »%s« nicht ausgeführt werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1408 +#: optimizer/plan/initsplan.c:1407 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s kann nicht auf die nullbare Seite eines äußeren Verbundes angewendet werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1359 parser/analyze.c:1723 parser/analyze.c:1980 -#: parser/analyze.c:3193 +#: optimizer/plan/planner.c:1380 parser/analyze.c:1771 parser/analyze.c:2029 +#: parser/analyze.c:3247 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s ist nicht in UNION/INTERSECT/EXCEPT erlaubt" -#: optimizer/plan/planner.c:2080 optimizer/plan/planner.c:4038 +#: optimizer/plan/planner.c:2121 optimizer/plan/planner.c:4151 #, c-format msgid "could not implement GROUP BY" msgstr "konnte GROUP BY nicht implementieren" -#: optimizer/plan/planner.c:2081 optimizer/plan/planner.c:4039 -#: optimizer/plan/planner.c:4679 optimizer/prep/prepunion.c:1053 +#: optimizer/plan/planner.c:2122 optimizer/plan/planner.c:4152 +#: optimizer/plan/planner.c:4833 optimizer/prep/prepunion.c:1320 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "Einige Datentypen unterstützen nur Hashing, während andere nur Sortieren unterstützen." -#: optimizer/plan/planner.c:4678 +#: optimizer/plan/planner.c:4832 #, c-format msgid "could not implement DISTINCT" msgstr "konnte DISTINCT nicht implementieren" -#: optimizer/plan/planner.c:6017 +#: optimizer/plan/planner.c:6177 #, c-format msgid "could not implement window PARTITION BY" msgstr "konnte PARTITION BY für Fenster nicht implementieren" -#: optimizer/plan/planner.c:6018 +#: optimizer/plan/planner.c:6178 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Fensterpartitionierungsspalten müssen sortierbare Datentypen haben." -#: optimizer/plan/planner.c:6022 +#: optimizer/plan/planner.c:6182 #, c-format msgid "could not implement window ORDER BY" msgstr "konnte ORDER BY für Fenster nicht implementieren" -#: optimizer/plan/planner.c:6023 +#: optimizer/plan/planner.c:6183 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Fenstersortierspalten müssen sortierbare Datentypen haben." -#: optimizer/prep/prepunion.c:516 +#: optimizer/prep/prepunion.c:467 #, c-format msgid "could not implement recursive UNION" msgstr "konnte rekursive UNION nicht implementieren" -#: optimizer/prep/prepunion.c:517 +#: optimizer/prep/prepunion.c:468 #, c-format msgid "All column datatypes must be hashable." msgstr "Alle Spaltendatentypen müssen hashbar sein." #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1052 +#: optimizer/prep/prepunion.c:1319 #, c-format msgid "could not implement %s" msgstr "konnte %s nicht implementieren" -#: optimizer/util/clauses.c:4869 +#: optimizer/util/clauses.c:4963 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL-Funktion »%s« beim Inlining" -#: optimizer/util/plancat.c:154 +#: optimizer/util/plancat.c:153 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "während der Wiederherstellung kann nicht auf temporäre oder ungeloggte Tabellen zugegriffen werden" -#: optimizer/util/plancat.c:726 +#: optimizer/util/plancat.c:768 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "Inferenzangaben mit Unique-Index über die gesamte Zeile werden nicht unterstützt" -#: optimizer/util/plancat.c:743 +#: optimizer/util/plancat.c:785 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "Constraint in der ON-CONFLICT-Klausel hat keinen zugehörigen Index" -#: optimizer/util/plancat.c:793 +#: optimizer/util/plancat.c:835 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE nicht unterstützt mit Exclusion-Constraints" -#: optimizer/util/plancat.c:898 +#: optimizer/util/plancat.c:945 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "es gibt keinen Unique-Constraint oder Exclusion-Constraint, der auf die ON-CONFLICT-Angabe passt" -#: parser/analyze.c:788 parser/analyze.c:1502 +#: parser/analyze.c:824 parser/analyze.c:1550 #, c-format msgid "VALUES lists must all be the same length" msgstr "VALUES-Listen müssen alle die gleiche Länge haben" -#: parser/analyze.c:990 +#: parser/analyze.c:1027 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT hat mehr Ausdrücke als Zielspalten" -#: parser/analyze.c:1008 +#: parser/analyze.c:1045 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT hat mehr Zielspalten als Ausdrücke" -#: parser/analyze.c:1012 +#: parser/analyze.c:1049 #, c-format msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" msgstr "Der einzufügende Wert ist ein Zeilenausdruck mit der gleichen Anzahl Spalten wie von INSERT erwartet. Haben Sie versehentlich zu viele Klammern gesetzt?" -#: parser/analyze.c:1309 parser/analyze.c:1696 +#: parser/analyze.c:1357 parser/analyze.c:1744 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO ist hier nicht erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1625 parser/analyze.c:3425 +#: parser/analyze.c:1673 parser/analyze.c:3479 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s kann nicht auf VALUES angewendet werden" -#: parser/analyze.c:1862 +#: parser/analyze.c:1911 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "ungültige ORDER-BY-Klausel mit UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:1863 +#: parser/analyze.c:1912 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "Es können nur Ergebnisspaltennamen verwendet werden, keine Ausdrücke oder Funktionen." -#: parser/analyze.c:1864 +#: parser/analyze.c:1913 #, c-format msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." msgstr "Fügen Sie den Ausdrück/die Funktion jedem SELECT hinzu oder verlegen Sie die UNION in eine FROM-Klausel." -#: parser/analyze.c:1970 +#: parser/analyze.c:2019 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO ist nur im ersten SELECT von UNION/INTERSECT/EXCEPT erlaubt" -#: parser/analyze.c:2042 +#: parser/analyze.c:2091 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "Teilanweisung von UNION/INTERSECT/EXCEPT kann nicht auf andere Relationen auf der selben Anfrageebene verweisen" -#: parser/analyze.c:2129 +#: parser/analyze.c:2178 #, c-format msgid "each %s query must have the same number of columns" msgstr "jede %s-Anfrage muss die gleiche Anzahl Spalten haben" #: parser/analyze.c:2535 #, c-format +msgid "SET target columns cannot be qualified with the relation name." +msgstr "SET-Zielspalten können nicht mit dem Relationsnamen qualifiziert werden." + +#: parser/analyze.c:2589 +#, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING muss mindestens eine Spalte haben" -#: parser/analyze.c:2638 +#: parser/analyze.c:2692 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" msgstr[0] "Quelle der Wertzuweisung hat %d Spalte zurückgegeben" msgstr[1] "Quelle der Wertzuweisung hat %d Spalten zurückgegeben" -#: parser/analyze.c:2699 +#: parser/analyze.c:2753 #, c-format msgid "variable \"%s\" is of type %s but expression is of type %s" msgstr "Variable »%s« hat Typ %s, aber der Ausdruck hat Typ %s" #. translator: %s is a SQL keyword -#: parser/analyze.c:2824 parser/analyze.c:2832 +#: parser/analyze.c:2878 parser/analyze.c:2886 #, c-format msgid "cannot specify both %s and %s" msgstr "%s und %s können nicht beide angegeben werden" -#: parser/analyze.c:2852 +#: parser/analyze.c:2906 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR darf keine datenmodifizierenden Anweisungen in WITH enthalten" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2860 +#: parser/analyze.c:2914 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s wird nicht unterstützt" -#: parser/analyze.c:2863 +#: parser/analyze.c:2917 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "Haltbare Cursor müssen READ ONLY sein." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2871 +#: parser/analyze.c:2925 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s wird nicht unterstützt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2882 +#: parser/analyze.c:2936 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s ist nicht gültig" -#: parser/analyze.c:2885 +#: parser/analyze.c:2939 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Insensitive Cursor müssen READ ONLY sein." -#: parser/analyze.c:2979 +#: parser/analyze.c:3033 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "materialisierte Sichten dürfen keine datenmodifizierenden Anweisungen in WITH verwenden" -#: parser/analyze.c:2989 +#: parser/analyze.c:3043 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "materialisierte Sichten dürfen keine temporären Tabellen oder Sichten verwenden" -#: parser/analyze.c:2999 +#: parser/analyze.c:3053 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "materialisierte Sichten können nicht unter Verwendung von gebundenen Parametern definiert werden" -#: parser/analyze.c:3011 +#: parser/analyze.c:3065 #, c-format msgid "materialized views cannot be unlogged" msgstr "materialisierte Sichten können nicht ungeloggt sein" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3200 +#: parser/analyze.c:3254 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s ist nicht mit DISTINCT-Klausel erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3207 +#: parser/analyze.c:3261 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s ist nicht mit GROUP-BY-Klausel erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3214 +#: parser/analyze.c:3268 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s ist nicht mit HAVING-Klausel erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3221 +#: parser/analyze.c:3275 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s ist nicht mit Aggregatfunktionen erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3228 +#: parser/analyze.c:3282 #, c-format msgid "%s is not allowed with window functions" msgstr "%s ist nicht mit Fensterfunktionen erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3235 +#: parser/analyze.c:3289 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "%s ist nicht mit Funktionen mit Ergebnismenge in der Targetliste erlaubt" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3334 +#: parser/analyze.c:3388 #, c-format msgid "%s must specify unqualified relation names" msgstr "%s muss unqualifizierte Relationsnamen angeben" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3398 +#: parser/analyze.c:3452 #, c-format msgid "%s cannot be applied to a join" msgstr "%s kann nicht auf einen Verbund angewendet werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3407 +#: parser/analyze.c:3461 #, c-format msgid "%s cannot be applied to a function" msgstr "%s kann nicht auf eine Funktion angewendet werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3416 +#: parser/analyze.c:3470 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s kann nicht auf eine Tabellenfunktion angewendet werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3434 +#: parser/analyze.c:3488 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s kann nicht auf eine WITH-Anfrage angewendet werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3443 +#: parser/analyze.c:3497 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s kann nicht auf einen benannten Tupelstore angewendet werden" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3463 +#: parser/analyze.c:3517 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "Relation »%s« in %s nicht in der FROM-Klausel gefunden" -#: parser/parse_agg.c:221 parser/parse_oper.c:227 +#: parser/parse_agg.c:210 parser/parse_oper.c:215 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "konnte keine Sortieroperator für Typ %s ermitteln" -#: parser/parse_agg.c:223 +#: parser/parse_agg.c:212 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "Aggregatfunktionen mit DISTINCT müssen ihre Eingaben sortieren können." -#: parser/parse_agg.c:258 +#: parser/parse_agg.c:270 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "GROUPING muss weniger als 32 Argumente haben" -#: parser/parse_agg.c:361 +#: parser/parse_agg.c:373 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "Aggregatfunktionen sind in JOIN-Bedingungen nicht erlaubt" -#: parser/parse_agg.c:363 +#: parser/parse_agg.c:375 msgid "grouping operations are not allowed in JOIN conditions" msgstr "Gruppieroperationen sind in JOIN-Bedingungen nicht erlaubt" -#: parser/parse_agg.c:375 +#: parser/parse_agg.c:385 msgid "aggregate functions are not allowed in FROM clause of their own query level" msgstr "Aggregatfunktionen sind nicht in der FROM-Klausel ihrer eigenen Anfrageebene erlaubt" -#: parser/parse_agg.c:377 +#: parser/parse_agg.c:387 msgid "grouping operations are not allowed in FROM clause of their own query level" msgstr "Gruppieroperationen sind nicht in der FROM-Klausel ihrer eigenen Anfrageebene erlaubt" -#: parser/parse_agg.c:382 +#: parser/parse_agg.c:392 msgid "aggregate functions are not allowed in functions in FROM" msgstr "Aggregatfunktionen sind in Funktionen in FROM nicht erlaubt" -#: parser/parse_agg.c:384 +#: parser/parse_agg.c:394 msgid "grouping operations are not allowed in functions in FROM" msgstr "Gruppieroperationen sind in Funktionen in FROM nicht erlaubt" -#: parser/parse_agg.c:392 +#: parser/parse_agg.c:402 msgid "aggregate functions are not allowed in policy expressions" msgstr "Aggregatfunktionen sind in Policy-Ausdrücken nicht erlaubt" -#: parser/parse_agg.c:394 +#: parser/parse_agg.c:404 msgid "grouping operations are not allowed in policy expressions" msgstr "Gruppieroperationen sind in Policy-Ausdrücken nicht erlaubt" -#: parser/parse_agg.c:411 +#: parser/parse_agg.c:421 msgid "aggregate functions are not allowed in window RANGE" msgstr "Aggregatfunktionen sind in der Fenster-RANGE-Klausel nicht erlaubt" -#: parser/parse_agg.c:413 +#: parser/parse_agg.c:423 msgid "grouping operations are not allowed in window RANGE" msgstr "Gruppieroperationen sind in der Fenster-RANGE-Klausel nicht erlaubt" -#: parser/parse_agg.c:418 +#: parser/parse_agg.c:428 msgid "aggregate functions are not allowed in window ROWS" msgstr "Aggregatfunktionen sind in der Fenster-ROWS-Klausel nicht erlaubt" -#: parser/parse_agg.c:420 +#: parser/parse_agg.c:430 msgid "grouping operations are not allowed in window ROWS" msgstr "Gruppieroperationen sind in der Fenster-ROWS-Klausel nicht erlaubt" -#: parser/parse_agg.c:425 +#: parser/parse_agg.c:435 msgid "aggregate functions are not allowed in window GROUPS" msgstr "Aggregatfunktionen sind in der Fenster-GROUPS-Klausel nicht erlaubt" -#: parser/parse_agg.c:427 +#: parser/parse_agg.c:437 msgid "grouping operations are not allowed in window GROUPS" msgstr "Gruppieroperationen sind in der Fenster-GROUPS-Klausel nicht erlaubt" -#: parser/parse_agg.c:440 +#: parser/parse_agg.c:450 msgid "aggregate functions are not allowed in MERGE WHEN conditions" msgstr "Aggregatfunktionen sind in MERGE-WHEN-Bedingungen nicht erlaubt" -#: parser/parse_agg.c:442 +#: parser/parse_agg.c:452 msgid "grouping operations are not allowed in MERGE WHEN conditions" msgstr "Gruppieroperationen sind in MERGE-WHEN-Bedingungen nicht erlaubt" -#: parser/parse_agg.c:468 +#: parser/parse_agg.c:479 msgid "aggregate functions are not allowed in check constraints" msgstr "Aggregatfunktionen sind in Check-Constraints nicht erlaubt" -#: parser/parse_agg.c:470 +#: parser/parse_agg.c:481 msgid "grouping operations are not allowed in check constraints" msgstr "Gruppieroperationen sind in Check-Constraints nicht erlaubt" -#: parser/parse_agg.c:477 +#: parser/parse_agg.c:488 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "Aggregatfunktionen sind in DEFAULT-Ausdrücken nicht erlaubt" -#: parser/parse_agg.c:479 +#: parser/parse_agg.c:490 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "Gruppieroperationen sind in DEFAULT-Ausdrücken nicht erlaubt" -#: parser/parse_agg.c:484 +#: parser/parse_agg.c:495 msgid "aggregate functions are not allowed in index expressions" msgstr "Aggregatfunktionen sind in Indexausdrücken nicht erlaubt" -#: parser/parse_agg.c:486 +#: parser/parse_agg.c:497 msgid "grouping operations are not allowed in index expressions" msgstr "Gruppieroperationen sind in Indexausdrücken nicht erlaubt" -#: parser/parse_agg.c:491 +#: parser/parse_agg.c:502 msgid "aggregate functions are not allowed in index predicates" msgstr "Aggregatfunktionen sind in Indexprädikaten nicht erlaubt" -#: parser/parse_agg.c:493 +#: parser/parse_agg.c:504 msgid "grouping operations are not allowed in index predicates" msgstr "Gruppieroperationen sind in Indexprädikaten nicht erlaubt" -#: parser/parse_agg.c:498 +#: parser/parse_agg.c:509 msgid "aggregate functions are not allowed in statistics expressions" msgstr "Aggregatfunktionen sind in Statistikausdrücken nicht erlaubt" -#: parser/parse_agg.c:500 +#: parser/parse_agg.c:511 msgid "grouping operations are not allowed in statistics expressions" msgstr "Gruppieroperationen sind in Statistikausdrücken nicht erlaubt" -#: parser/parse_agg.c:505 +#: parser/parse_agg.c:516 msgid "aggregate functions are not allowed in transform expressions" msgstr "Aggregatfunktionen sind in Umwandlungsausdrücken nicht erlaubt" -#: parser/parse_agg.c:507 +#: parser/parse_agg.c:518 msgid "grouping operations are not allowed in transform expressions" msgstr "Gruppieroperationen sind in Umwandlungsausdrücken nicht erlaubt" -#: parser/parse_agg.c:512 +#: parser/parse_agg.c:523 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "Aggregatfunktionen sind in EXECUTE-Parametern nicht erlaubt" -#: parser/parse_agg.c:514 +#: parser/parse_agg.c:525 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "Gruppieroperationen sind in EXECUTE-Parametern nicht erlaubt" -#: parser/parse_agg.c:519 +#: parser/parse_agg.c:530 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "Aggregatfunktionen sind in der WHEN-Bedingung eines Triggers nicht erlaubt" -#: parser/parse_agg.c:521 +#: parser/parse_agg.c:532 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "Gruppieroperationen sind in der WHEN-Bedingung eines Triggers nicht erlaubt" -#: parser/parse_agg.c:526 +#: parser/parse_agg.c:537 msgid "aggregate functions are not allowed in partition bound" msgstr "Aggregatfunktionen sind in Partitionsbegrenzungen nicht erlaubt" -#: parser/parse_agg.c:528 +#: parser/parse_agg.c:539 msgid "grouping operations are not allowed in partition bound" msgstr "Gruppieroperationen sind in Partitionsbegrenzungen nicht erlaubt" -#: parser/parse_agg.c:533 +#: parser/parse_agg.c:544 msgid "aggregate functions are not allowed in partition key expressions" msgstr "Aggregatfunktionen sind in Partitionierungsschlüsselausdrücken nicht erlaubt" -#: parser/parse_agg.c:535 +#: parser/parse_agg.c:546 msgid "grouping operations are not allowed in partition key expressions" msgstr "Gruppieroperationen sind in Partitionierungsschlüsselausdrücken nicht erlaubt" -#: parser/parse_agg.c:541 +#: parser/parse_agg.c:552 msgid "aggregate functions are not allowed in column generation expressions" msgstr "Aggregatfunktionen sind in Spaltengenerierungsausdrücken nicht erlaubt" -#: parser/parse_agg.c:543 +#: parser/parse_agg.c:554 msgid "grouping operations are not allowed in column generation expressions" msgstr "Gruppieroperationen sind in Spaltengenerierungsausdrücken nicht erlaubt" -#: parser/parse_agg.c:549 +#: parser/parse_agg.c:560 msgid "aggregate functions are not allowed in CALL arguments" msgstr "Aggregatfunktionen sind in CALL-Argumenten nicht erlaubt" -#: parser/parse_agg.c:551 +#: parser/parse_agg.c:562 msgid "grouping operations are not allowed in CALL arguments" msgstr "Gruppieroperationen sind in CALL-Argumenten nicht erlaubt" -#: parser/parse_agg.c:557 +#: parser/parse_agg.c:568 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "Aggregatfunktionen sind in COPY-FROM-WHERE-Bedingungen nicht erlaubt" -#: parser/parse_agg.c:559 +#: parser/parse_agg.c:570 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "Gruppieroperationen sind in COPY-FROM-WHERE-Bedingungen nicht erlaubt" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:586 parser/parse_clause.c:1955 +#: parser/parse_agg.c:597 parser/parse_clause.c:1962 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "Aggregatfunktionen sind in %s nicht erlaubt" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:589 +#: parser/parse_agg.c:600 #, c-format msgid "grouping operations are not allowed in %s" msgstr "Gruppieroperationen sind in %s nicht erlaubt" -#: parser/parse_agg.c:690 +#: parser/parse_agg.c:701 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "Aggregatfunktion auf äußerer Ebene kann keine Variable einer unteren Ebene in ihren direkten Argumenten haben" -#: parser/parse_agg.c:768 +#: parser/parse_agg.c:779 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "Aufrufe von Aggregatfunktionen können keine Aufrufe von Funktionen mit Ergebnismenge enthalten" -#: parser/parse_agg.c:769 parser/parse_expr.c:1700 parser/parse_expr.c:2182 -#: parser/parse_func.c:884 +#: parser/parse_agg.c:780 parser/parse_expr.c:1762 parser/parse_expr.c:2253 +#: parser/parse_func.c:885 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." msgstr "Sie können möglicherweise die Funktion mit Ergebnismenge in ein LATERAL-FROM-Element verschieben." -#: parser/parse_agg.c:774 +#: parser/parse_agg.c:785 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "Aufrufe von Aggregatfunktionen können keine Aufrufe von Fensterfunktionen enthalten" -#: parser/parse_agg.c:853 +#: parser/parse_agg.c:864 msgid "window functions are not allowed in JOIN conditions" msgstr "Fensterfunktionen sind in JOIN-Bedingungen nicht erlaubt" -#: parser/parse_agg.c:860 +#: parser/parse_agg.c:871 msgid "window functions are not allowed in functions in FROM" msgstr "Fensterfunktionen sind in Funktionen in FROM nicht erlaubt" -#: parser/parse_agg.c:866 +#: parser/parse_agg.c:877 msgid "window functions are not allowed in policy expressions" msgstr "Fensterfunktionen sind in Policy-Ausdrücken nicht erlaubt" -#: parser/parse_agg.c:879 +#: parser/parse_agg.c:890 msgid "window functions are not allowed in window definitions" msgstr "Fensterfunktionen sind in Fensterdefinitionen nicht erlaubt" -#: parser/parse_agg.c:890 +#: parser/parse_agg.c:901 msgid "window functions are not allowed in MERGE WHEN conditions" msgstr "Fensterfunktionen sind in MERGE-WHEN-Bedingungen nicht erlaubt" -#: parser/parse_agg.c:914 +#: parser/parse_agg.c:926 msgid "window functions are not allowed in check constraints" msgstr "Fensterfunktionen sind in Check-Constraints nicht erlaubt" -#: parser/parse_agg.c:918 +#: parser/parse_agg.c:930 msgid "window functions are not allowed in DEFAULT expressions" msgstr "Fensterfunktionen sind in DEFAULT-Ausdrücken nicht erlaubt" -#: parser/parse_agg.c:921 +#: parser/parse_agg.c:933 msgid "window functions are not allowed in index expressions" msgstr "Fensterfunktionen sind in Indexausdrücken nicht erlaubt" -#: parser/parse_agg.c:924 +#: parser/parse_agg.c:936 msgid "window functions are not allowed in statistics expressions" msgstr "Fensterfunktionen sind in Statistikausdrücken nicht erlaubt" -#: parser/parse_agg.c:927 +#: parser/parse_agg.c:939 msgid "window functions are not allowed in index predicates" msgstr "Fensterfunktionen sind in Indexprädikaten nicht erlaubt" -#: parser/parse_agg.c:930 +#: parser/parse_agg.c:942 msgid "window functions are not allowed in transform expressions" msgstr "Fensterfunktionen sind in Umwandlungsausdrücken nicht erlaubt" -#: parser/parse_agg.c:933 +#: parser/parse_agg.c:945 msgid "window functions are not allowed in EXECUTE parameters" msgstr "Fensterfunktionen sind in EXECUTE-Parametern nicht erlaubt" -#: parser/parse_agg.c:936 +#: parser/parse_agg.c:948 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "Fensterfunktionen sind in der WHEN-Bedingung eines Triggers nicht erlaubt" -#: parser/parse_agg.c:939 +#: parser/parse_agg.c:951 msgid "window functions are not allowed in partition bound" msgstr "Fensterfunktionen sind in Partitionsbegrenzungen nicht erlaubt" -#: parser/parse_agg.c:942 +#: parser/parse_agg.c:954 msgid "window functions are not allowed in partition key expressions" msgstr "Fensterfunktionen sind in Partitionierungsschlüsselausdrücken nicht erlaubt" -#: parser/parse_agg.c:945 +#: parser/parse_agg.c:957 msgid "window functions are not allowed in CALL arguments" msgstr "Fensterfunktionen sind in CALL-Argumenten nicht erlaubt" -#: parser/parse_agg.c:948 +#: parser/parse_agg.c:960 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "Fensterfunktionen sind in COPY-FROM-WHERE-Bedingungen nicht erlaubt" -#: parser/parse_agg.c:951 +#: parser/parse_agg.c:963 msgid "window functions are not allowed in column generation expressions" msgstr "Fensterfunktionen sind in Spaltengenerierungsausdrücken nicht erlaubt" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:974 parser/parse_clause.c:1964 +#: parser/parse_agg.c:986 parser/parse_clause.c:1971 #, c-format msgid "window functions are not allowed in %s" msgstr "Fensterfunktionen sind in %s nicht erlaubt" -#: parser/parse_agg.c:1008 parser/parse_clause.c:2797 +#: parser/parse_agg.c:1020 parser/parse_clause.c:2804 #, c-format msgid "window \"%s\" does not exist" msgstr "Fenster »%s« existiert nicht" -#: parser/parse_agg.c:1096 +#: parser/parse_agg.c:1108 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "zu viele Grouping-Sets vorhanden (maximal 4096)" -#: parser/parse_agg.c:1236 +#: parser/parse_agg.c:1248 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "Aggregatfunktionen sind nicht im rekursiven Ausdruck einer rekursiven Anfrage erlaubt" -#: parser/parse_agg.c:1429 +#: parser/parse_agg.c:1441 #, c-format msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" msgstr "Spalte »%s.%s« muss in der GROUP-BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden" -#: parser/parse_agg.c:1432 +#: parser/parse_agg.c:1444 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "Direkte Argumente einer Ordered-Set-Aggregatfunktion dürfen nur gruppierte Spalten verwenden." -#: parser/parse_agg.c:1437 +#: parser/parse_agg.c:1449 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "Unteranfrage verwendet nicht gruppierte Spalte »%s.%s« aus äußerer Anfrage" -#: parser/parse_agg.c:1601 +#: parser/parse_agg.c:1613 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "Argumente von GROUPING müssen Gruppierausdrücke der zugehörigen Anfrageebene sein" -#: parser/parse_clause.c:195 +#: parser/parse_clause.c:193 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "Relation »%s« kann nicht das Ziel einer datenverändernden Anweisung sein" -#: parser/parse_clause.c:571 parser/parse_clause.c:599 parser/parse_func.c:2552 +#: parser/parse_clause.c:569 parser/parse_clause.c:597 parser/parse_func.c:2553 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "Funktionen mit Ergebnismenge müssen auf oberster Ebene von FROM erscheinen" -#: parser/parse_clause.c:611 +#: parser/parse_clause.c:609 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "mehrere Spaltendefinitionslisten für die selbe Funktion sind nicht erlaubt" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:642 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "ROWS FROM() mit mehreren Funktionen kann keine Spaltendefinitionsliste haben" -#: parser/parse_clause.c:645 +#: parser/parse_clause.c:643 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "Geben Sie innerhalb von ROWS FROM() jeder Funktion eine eigene Spaltendefinitionsliste." -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:649 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "UNNEST() mit mehreren Argumenten kann keine Spaltendefinitionsliste haben" -#: parser/parse_clause.c:652 +#: parser/parse_clause.c:650 #, c-format msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." msgstr "Verwenden Sie getrennte UNNEST()-Aufrufe innerhalb von ROWS FROM() und geben Sie jeder eine eigene Spaltendefinitionsliste." -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:657 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY kann nicht mit einer Spaltendefinitionsliste verwendet werden" -#: parser/parse_clause.c:660 +#: parser/parse_clause.c:658 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "Geben Sie die Spaltendefinitionsliste innerhalb von ROWS FROM() an." -#: parser/parse_clause.c:760 +#: parser/parse_clause.c:762 parser/parse_jsontable.c:295 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "nur eine FOR-ORDINALITY-Spalte ist erlaubt" -#: parser/parse_clause.c:821 +#: parser/parse_clause.c:823 #, c-format msgid "column name \"%s\" is not unique" msgstr "Spaltenname »%s« ist nicht eindeutig" -#: parser/parse_clause.c:863 +#: parser/parse_clause.c:865 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "Namensraumname »%s« ist nicht eindeutig" -#: parser/parse_clause.c:873 +#: parser/parse_clause.c:875 #, c-format msgid "only one default namespace is allowed" msgstr "nur ein Standardnamensraum ist erlaubt" -#: parser/parse_clause.c:933 +#: parser/parse_clause.c:935 #, c-format msgid "tablesample method %s does not exist" msgstr "Tablesample-Methode %s existiert nicht" -#: parser/parse_clause.c:955 +#: parser/parse_clause.c:957 #, c-format msgid "tablesample method %s requires %d argument, not %d" msgid_plural "tablesample method %s requires %d arguments, not %d" msgstr[0] "Tablesample-Methode %s benötigt %d Argument, nicht %d" msgstr[1] "Tablesample-Methode %s benötigt %d Argumente, nicht %d" -#: parser/parse_clause.c:989 +#: parser/parse_clause.c:991 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "Tablesample-Methode %s unterstützt REPEATABLE nicht" -#: parser/parse_clause.c:1138 +#: parser/parse_clause.c:1144 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "TABLESAMPLE-Klausel kann nur auf Tabellen und materialisierte Sichten angewendet werden" -#: parser/parse_clause.c:1325 +#: parser/parse_clause.c:1331 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "Spaltenname »%s« erscheint mehrmals in der USING-Klausel" -#: parser/parse_clause.c:1340 +#: parser/parse_clause.c:1346 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "gemeinsamer Spaltenname »%s« erscheint mehrmals in der linken Tabelle" -#: parser/parse_clause.c:1349 +#: parser/parse_clause.c:1355 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "Spalte »%s« aus der USING-Klausel existiert nicht in der linken Tabelle" -#: parser/parse_clause.c:1364 +#: parser/parse_clause.c:1370 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "gemeinsamer Spaltenname »%s« erscheint mehrmals in der rechten Tabelle" -#: parser/parse_clause.c:1373 +#: parser/parse_clause.c:1379 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "Spalte »%s« aus der USING-Klausel existiert nicht in der rechten Tabelle" -#: parser/parse_clause.c:1900 +#: parser/parse_clause.c:1907 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" msgstr "Zeilenzahl in FETCH FIRST ... WITH TIES darf nicht NULL sein" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1925 +#: parser/parse_clause.c:1932 #, c-format msgid "argument of %s must not contain variables" msgstr "Argument von %s darf keine Variablen enthalten" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2090 +#: parser/parse_clause.c:2097 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "%s »%s« ist nicht eindeutig" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2118 +#: parser/parse_clause.c:2125 #, c-format msgid "non-integer constant in %s" msgstr "Konstante in %s ist keine ganze Zahl" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2140 +#: parser/parse_clause.c:2147 #, c-format msgid "%s position %d is not in select list" msgstr "%s Position %d ist nicht in der Select-Liste" -#: parser/parse_clause.c:2579 +#: parser/parse_clause.c:2586 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE ist auf 12 Elemente begrenzt" -#: parser/parse_clause.c:2785 +#: parser/parse_clause.c:2792 #, c-format msgid "window \"%s\" is already defined" msgstr "Fenster »%s« ist bereits definiert" -#: parser/parse_clause.c:2846 +#: parser/parse_clause.c:2853 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "PARTITION-BY-Klausel von Fenster »%s« kann nicht aufgehoben werden" -#: parser/parse_clause.c:2858 +#: parser/parse_clause.c:2865 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "ORDER-BY-Klausel von Fenster »%s« kann nicht aufgehoben werden" -#: parser/parse_clause.c:2888 parser/parse_clause.c:2894 +#: parser/parse_clause.c:2895 parser/parse_clause.c:2901 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "kann Fenster »%s« nicht kopieren, weil es eine Frame-Klausel hat" -#: parser/parse_clause.c:2896 +#: parser/parse_clause.c:2903 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Lassen Sie die Klammern in dieser OVER-Klausel weg." -#: parser/parse_clause.c:2916 +#: parser/parse_clause.c:2923 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "RANGE mit Offset PRECEDING/FOLLOWING benötigt genau eine ORDER-BY-Spalte" -#: parser/parse_clause.c:2939 +#: parser/parse_clause.c:2946 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "GROUPS-Modus erfordert eine ORDER-BY-Klausel" -#: parser/parse_clause.c:3010 +#: parser/parse_clause.c:3016 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "in einer Aggregatfunktion mit DISTINCT müssen ORDER-BY-Ausdrücke in der Argumentliste erscheinen" -#: parser/parse_clause.c:3011 +#: parser/parse_clause.c:3017 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "bei SELECT DISTINCT müssen ORDER-BY-Ausdrücke in der Select-Liste erscheinen" -#: parser/parse_clause.c:3043 +#: parser/parse_clause.c:3049 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "eine Aggregatfunktion mit DISTINCT muss mindestens ein Argument haben" -#: parser/parse_clause.c:3044 +#: parser/parse_clause.c:3050 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT muss mindestens eine Spalte haben" -#: parser/parse_clause.c:3110 parser/parse_clause.c:3142 +#: parser/parse_clause.c:3116 parser/parse_clause.c:3148 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "Ausdrücke in SELECT DISTINCT ON müssen mit den ersten Ausdrücken in ORDER BY übereinstimmen" -#: parser/parse_clause.c:3220 +#: parser/parse_clause.c:3226 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC ist in der ON-CONFLICT-Klausel nicht erlaubt" -#: parser/parse_clause.c:3226 +#: parser/parse_clause.c:3232 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST ist in der ON-CONFLICT-Klausel nicht erlaubt" -#: parser/parse_clause.c:3305 +#: parser/parse_clause.c:3311 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE benötigt Inferenzangabe oder Constraint-Namen" -#: parser/parse_clause.c:3306 +#: parser/parse_clause.c:3312 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Zum Bespiel ON CONFLICT (Spaltenname)." -#: parser/parse_clause.c:3317 +#: parser/parse_clause.c:3323 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT wird nicht mit Systemkatalogtabellen unterstützt" -#: parser/parse_clause.c:3325 +#: parser/parse_clause.c:3331 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT wird nicht unterstützt mit Tabelle »%s«, die als Katalogtabelle verwendet wird" -#: parser/parse_clause.c:3456 +#: parser/parse_clause.c:3462 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "Operator %s ist kein gültiger Sortieroperator" -#: parser/parse_clause.c:3458 +#: parser/parse_clause.c:3464 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "Sortieroperatoren müssen die Mitglieder »<« oder »>« einer »btree«-Operatorfamilie sein." -#: parser/parse_clause.c:3769 +#: parser/parse_clause.c:3775 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "RANGE mit Offset PRECEDING/FOLLOWING wird für Spaltentyp %s nicht unterstützt" -#: parser/parse_clause.c:3775 +#: parser/parse_clause.c:3781 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" msgstr "RANGE mit Offset PRECEDING/FOLLOWING wird für Spaltentyp %s und Offset-Typ %s nicht unterstützt" -#: parser/parse_clause.c:3778 +#: parser/parse_clause.c:3784 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Wandeln Sie den Offset-Wert in einen passenden Typ um." -#: parser/parse_clause.c:3783 +#: parser/parse_clause.c:3789 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" msgstr "RANGE mit Offset PRECEDING/FOLLOWING hat mehrere Interpretationen für Spaltentyp %s und Offset-Typ %s" -#: parser/parse_clause.c:3786 +#: parser/parse_clause.c:3792 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "Wandeln Sie den Offset-Wert in den genauen beabsichtigten Typ um." #: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 #: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 -#: parser/parse_expr.c:2083 parser/parse_expr.c:2691 parser/parse_expr.c:3516 -#: parser/parse_target.c:985 +#: parser/parse_expr.c:2154 parser/parse_expr.c:2762 parser/parse_expr.c:3413 +#: parser/parse_expr.c:3642 parser/parse_target.c:998 #, c-format msgid "cannot cast type %s to %s" msgstr "kann Typ %s nicht in Typ %s umwandeln" @@ -17316,121 +17760,121 @@ msgid "argument of %s must not return a set" msgstr "Argument von %s darf keine Ergebnismenge zurückgeben" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1383 +#: parser/parse_coerce.c:1420 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "%s-Typen %s und %s passen nicht zusammen" -#: parser/parse_coerce.c:1499 +#: parser/parse_coerce.c:1536 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "Argumenttypen %s und %s passen nicht zusammen" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1551 +#: parser/parse_coerce.c:1588 #, c-format msgid "%s could not convert type %s to %s" msgstr "%s konnte Typ %s nicht in %s umwandeln" -#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 -#: parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 -#: parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 +#: parser/parse_coerce.c:2191 parser/parse_coerce.c:2211 +#: parser/parse_coerce.c:2231 parser/parse_coerce.c:2252 +#: parser/parse_coerce.c:2307 parser/parse_coerce.c:2341 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "als »%s« deklarierte Argumente sind nicht alle gleich" -#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 -#: utils/fmgr/funcapi.c:592 +#: parser/parse_coerce.c:2286 parser/parse_coerce.c:2399 +#: utils/fmgr/funcapi.c:600 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "als %s deklariertes Argument ist kein Array sondern Typ %s" -#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 -#: utils/fmgr/funcapi.c:606 +#: parser/parse_coerce.c:2319 parser/parse_coerce.c:2469 +#: utils/fmgr/funcapi.c:614 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "als %s deklariertes Argument ist kein Bereichstyp sondern Typ %s" -#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 -#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:624 utils/fmgr/funcapi.c:689 +#: parser/parse_coerce.c:2353 parser/parse_coerce.c:2433 +#: parser/parse_coerce.c:2566 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "als %s deklariertes Argument ist kein Multirange-Typ sondern Typ %s" -#: parser/parse_coerce.c:2353 +#: parser/parse_coerce.c:2390 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "kann Elementtyp des Arguments mit Typ »anyarray« nicht bestimmen" -#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 -#: parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 +#: parser/parse_coerce.c:2416 parser/parse_coerce.c:2447 +#: parser/parse_coerce.c:2486 parser/parse_coerce.c:2552 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "als %s deklariertes Argument ist nicht mit als %s deklariertem Argument konsistent" -#: parser/parse_coerce.c:2474 +#: parser/parse_coerce.c:2511 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "konnte polymorphischen Typ nicht bestimmen, weil Eingabe Typ %s hat" -#: parser/parse_coerce.c:2488 +#: parser/parse_coerce.c:2525 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "mit »anynonarray« gepaarter Typ ist ein Array-Typ: %s" -#: parser/parse_coerce.c:2498 +#: parser/parse_coerce.c:2535 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "mit »anyenum« gepaarter Typ ist kein Enum-Typ: %s" -#: parser/parse_coerce.c:2559 +#: parser/parse_coerce.c:2596 #, c-format msgid "arguments of anycompatible family cannot be cast to a common type" msgstr "Argumente der anycompatible-Familie können nicht in einen gemeinsamen Typ umgewandelt werden" -#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 -#: parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 -#: parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 +#: parser/parse_coerce.c:2614 parser/parse_coerce.c:2635 +#: parser/parse_coerce.c:2685 parser/parse_coerce.c:2690 +#: parser/parse_coerce.c:2754 parser/parse_coerce.c:2766 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "konnte polymorphischen Typ %s nicht bestimmen, weil Eingabe Typ %s hat" -#: parser/parse_coerce.c:2587 +#: parser/parse_coerce.c:2624 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "anycompatiblerange-Typ %s stimmt nicht mit anycompatible-Typ %s überein" -#: parser/parse_coerce.c:2608 +#: parser/parse_coerce.c:2645 #, c-format msgid "anycompatiblemultirange type %s does not match anycompatible type %s" msgstr "anycompatiblemultirange-Typ %s stimmt nicht mit anycompatible-Typ %s überein" -#: parser/parse_coerce.c:2622 +#: parser/parse_coerce.c:2659 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "mit »anycompatiblenonarray« gepaarter Typ ist ein Array-Typ: %s" -#: parser/parse_coerce.c:2857 +#: parser/parse_coerce.c:2894 #, c-format msgid "A result of type %s requires at least one input of type anyrange or anymultirange." msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anyrange oder anymultirange." -#: parser/parse_coerce.c:2874 +#: parser/parse_coerce.c:2911 #, c-format msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anycompatiblerange oder anycompatiblemultirange." -#: parser/parse_coerce.c:2886 +#: parser/parse_coerce.c:2923 #, c-format msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anyelement, anyarray, anynonarray, anyenum, anyrange oder anymultirange." -#: parser/parse_coerce.c:2898 +#: parser/parse_coerce.c:2935 #, c-format msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." msgstr "Ein Ergebnis mit Typ %s benötigt mindestens eine Eingabe mit Typ anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange oder anycompatiblemultirange." -#: parser/parse_coerce.c:2928 +#: parser/parse_coerce.c:2965 msgid "A result of type internal requires at least one input of type internal." msgstr "Ein Ergebnis mit Typ internal benötigt mindestens eine Eingabe mit Typ internal." @@ -17476,440 +17920,551 @@ msgstr "rekursiver Verweis auf Anfrage »%s« darf nicht in INTERSECT erscheinen msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "rekursiver Verweis auf Anfrage »%s« darf nicht in EXCEPT erscheinen" -#: parser/parse_cte.c:133 -#, c-format -msgid "MERGE not supported in WITH query" -msgstr "MERGE wird in WITH-Anfragen nicht unterstützt" - -#: parser/parse_cte.c:143 +#: parser/parse_cte.c:137 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "WIHT-Anfragename »%s« mehrmals angegeben" -#: parser/parse_cte.c:314 +#: parser/parse_cte.c:309 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "konnte keinen Ist-Ungleich-Operator für Typ %s ermitteln" -#: parser/parse_cte.c:341 +#: parser/parse_cte.c:336 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "WITH-Klausel mit datenmodifizierender Anweisung muss auf der obersten Ebene sein" -#: parser/parse_cte.c:390 +#: parser/parse_cte.c:385 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "Spalte %2$d in rekursiver Anfrage »%1$s« hat Typ %3$s im nicht-rekursiven Teilausdruck aber Typ %4$s insgesamt" -#: parser/parse_cte.c:396 +#: parser/parse_cte.c:391 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Wandeln Sie die Ausgabe des nicht-rekursiven Teilausdrucks in den korrekten Typ um." -#: parser/parse_cte.c:401 +#: parser/parse_cte.c:396 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "Spalte %2$d in rekursiver Anfrage »%1$s« hat Sortierfolge %3$s im nicht-rekursiven Teilausdruck aber Sortierfolge %4$s insgesamt" -#: parser/parse_cte.c:405 +#: parser/parse_cte.c:400 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "Verwenden Sie die COLLATE-Klausel, um die Sortierfolge des nicht-rekursiven Teilsausdrucks zu setzen." -#: parser/parse_cte.c:426 +#: parser/parse_cte.c:421 #, c-format msgid "WITH query is not recursive" msgstr "WITH-Anfrage ist nicht rekursiv" -#: parser/parse_cte.c:457 +#: parser/parse_cte.c:452 #, c-format msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" msgstr "mit einer SEARCH- oder CYCLE-Klausel muss die linke Seite von UNION ein SELECT sein" -#: parser/parse_cte.c:462 +#: parser/parse_cte.c:457 #, c-format msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" msgstr "mit einer SEARCH- oder CYCLE-Klausel muss mit rechte Seite von UNION ein SELECT sein" -#: parser/parse_cte.c:477 +#: parser/parse_cte.c:472 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "Search-Spalte »%s« ist nicht in der Spaltenliste der WITH-Anfrage" -#: parser/parse_cte.c:484 +#: parser/parse_cte.c:479 #, c-format msgid "search column \"%s\" specified more than once" msgstr "Search-Spalte »%s« mehrmals angegeben" -#: parser/parse_cte.c:493 +#: parser/parse_cte.c:488 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" msgstr "Search-Sequenz-Spaltenname »%s« schon in Spaltenliste der WITH-Anfrage verwendet" -#: parser/parse_cte.c:510 +#: parser/parse_cte.c:505 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "Cycle-Spalte »%s« ist nicht in der Spaltenliste der WITH-Anfrage" -#: parser/parse_cte.c:517 +#: parser/parse_cte.c:512 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "Zyklusspalte »%s« mehrmals angegeben" -#: parser/parse_cte.c:526 +#: parser/parse_cte.c:521 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" msgstr "Zyklusmarkierungsspaltenname »%s« schon in Spaltenliste der WITH-Anfrage verwendet" -#: parser/parse_cte.c:533 +#: parser/parse_cte.c:528 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" msgstr "Zykluspfadspaltenname »%s« schon in Spaltenliste der WITH-Anfrage verwendet" -#: parser/parse_cte.c:541 +#: parser/parse_cte.c:536 #, c-format msgid "cycle mark column name and cycle path column name are the same" msgstr "Zyklusmarkierungsspaltenname und Zykluspfadspaltenname sind gleich" -#: parser/parse_cte.c:551 +#: parser/parse_cte.c:546 #, c-format msgid "search sequence column name and cycle mark column name are the same" msgstr "Search-Sequenz-Spaltenname und Zyklusmarkierungsspaltenname sind gleich" -#: parser/parse_cte.c:558 +#: parser/parse_cte.c:553 #, c-format msgid "search sequence column name and cycle path column name are the same" msgstr "Search-Sequenz-Spaltenname und Zykluspfadspaltenname sind gleich" -#: parser/parse_cte.c:642 +#: parser/parse_cte.c:637 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "WITH-Anfrage »%s« hat %d Spalten verfügbar, aber %d Spalten wurden angegeben" -#: parser/parse_cte.c:822 +#: parser/parse_cte.c:882 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "gegenseitige Rekursion zwischen WITH-Elementen ist nicht implementiert" -#: parser/parse_cte.c:874 +#: parser/parse_cte.c:934 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "rekursive Anfrage »%s« darf keine datenmodifizierenden Anweisungen enthalten" -#: parser/parse_cte.c:882 +#: parser/parse_cte.c:942 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "rekursive Anfrage »%s« hat nicht die Form nicht-rekursiver-Ausdruck UNION [ALL] rekursiver-Ausdruck" -#: parser/parse_cte.c:926 +#: parser/parse_cte.c:977 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY in einer rekursiven Anfrage ist nicht implementiert" -#: parser/parse_cte.c:932 +#: parser/parse_cte.c:983 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET in einer rekursiven Anfrage ist nicht implementiert" -#: parser/parse_cte.c:938 +#: parser/parse_cte.c:989 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT in einer rekursiven Anfrage ist nicht implementiert" -#: parser/parse_cte.c:944 +#: parser/parse_cte.c:995 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE in einer rekursiven Anfrage ist nicht implementiert" -#: parser/parse_cte.c:1001 +#: parser/parse_cte.c:1074 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "rekursiver Verweis auf Anfrage »%s« darf nicht mehrmals erscheinen" -#: parser/parse_expr.c:294 +#: parser/parse_expr.c:313 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT ist in diesem Zusammenhang nicht erlaubt" -#: parser/parse_expr.c:371 parser/parse_relation.c:3687 -#: parser/parse_relation.c:3697 parser/parse_relation.c:3715 -#: parser/parse_relation.c:3722 parser/parse_relation.c:3736 +#: parser/parse_expr.c:406 parser/parse_relation.c:3691 +#: parser/parse_relation.c:3701 parser/parse_relation.c:3719 +#: parser/parse_relation.c:3726 parser/parse_relation.c:3740 #, c-format msgid "column %s.%s does not exist" msgstr "Spalte %s.%s existiert nicht" -#: parser/parse_expr.c:383 +#: parser/parse_expr.c:418 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "Spalte »%s« nicht gefunden im Datentyp %s" -#: parser/parse_expr.c:389 +#: parser/parse_expr.c:424 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "konnte Spalte »%s« im Record-Datentyp nicht identifizieren" -#: parser/parse_expr.c:395 +#: parser/parse_expr.c:430 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "Spaltenschreibweise .%s mit Typ %s verwendet, der kein zusammengesetzter Typ ist" -#: parser/parse_expr.c:426 parser/parse_target.c:733 +#: parser/parse_expr.c:461 parser/parse_target.c:732 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "Zeilenexpansion mit »*« wird hier nicht unterstützt" -#: parser/parse_expr.c:548 +#: parser/parse_expr.c:584 msgid "cannot use column reference in DEFAULT expression" msgstr "Spaltenverweise können nicht in DEFAULT-Ausdrücken verwendet werden" -#: parser/parse_expr.c:551 +#: parser/parse_expr.c:587 msgid "cannot use column reference in partition bound expression" msgstr "Spaltenverweise können nicht in Partitionsbegrenzungsausdrücken verwendet werden" -#: parser/parse_expr.c:810 parser/parse_relation.c:833 -#: parser/parse_relation.c:915 parser/parse_target.c:1225 +#: parser/parse_expr.c:846 parser/parse_relation.c:833 +#: parser/parse_relation.c:915 parser/parse_target.c:1238 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "Spaltenverweis »%s« ist nicht eindeutig" -#: parser/parse_expr.c:866 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_expr.c:902 parser/parse_param.c:110 parser/parse_param.c:142 #: parser/parse_param.c:204 parser/parse_param.c:303 #, c-format msgid "there is no parameter $%d" msgstr "es gibt keinen Parameter $%d" -#: parser/parse_expr.c:1066 +#. translator: %s is name of a SQL construct, eg NULLIF +#: parser/parse_expr.c:1103 parser/parse_expr.c:3073 #, c-format -msgid "NULLIF requires = operator to yield boolean" -msgstr "NULLIF erfordert, dass Operator = boolean ergibt" +msgid "%s requires = operator to yield boolean" +msgstr "%s erfordert, dass Operator = boolean ergibt" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1072 parser/parse_expr.c:3007 +#: parser/parse_expr.c:1109 parser/parse_expr.c:3080 #, c-format msgid "%s must not return a set" msgstr "%s darf keine Ergebnismenge zurückgeben" -#: parser/parse_expr.c:1457 parser/parse_expr.c:1489 +#: parser/parse_expr.c:1395 +#, c-format +msgid "MERGE_ACTION() can only be used in the RETURNING list of a MERGE command" +msgstr "MERGE_ACTION() kann nur in der RETURNING-Liste eines MERGE-Befehls verwendet werden" + +#: parser/parse_expr.c:1519 parser/parse_expr.c:1551 #, c-format msgid "number of columns does not match number of values" msgstr "Anzahl der Spalten stimmt nicht mit der Anzahl der Werte überein" -#: parser/parse_expr.c:1503 +#: parser/parse_expr.c:1565 #, c-format msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" msgstr "die Quelle für ein UPDATE-Element mit mehreren Spalten muss ein Sub-SELECT oder ein ROW()-Ausdruck sein" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1698 parser/parse_expr.c:2180 parser/parse_func.c:2677 +#: parser/parse_expr.c:1760 parser/parse_expr.c:2251 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "Funktionen mit Ergebnismenge sind in %s nicht erlaubt" -#: parser/parse_expr.c:1761 +#: parser/parse_expr.c:1824 msgid "cannot use subquery in check constraint" msgstr "Unteranfragen können nicht in Check-Constraints verwendet werden" -#: parser/parse_expr.c:1765 +#: parser/parse_expr.c:1828 msgid "cannot use subquery in DEFAULT expression" msgstr "Unteranfragen können nicht in DEFAULT-Ausdrücken verwendet werden" -#: parser/parse_expr.c:1768 +#: parser/parse_expr.c:1831 msgid "cannot use subquery in index expression" msgstr "Unteranfragen können nicht in Indexausdrücken verwendet werden" -#: parser/parse_expr.c:1771 +#: parser/parse_expr.c:1834 msgid "cannot use subquery in index predicate" msgstr "Unteranfragen können nicht im Indexprädikat verwendet werden" -#: parser/parse_expr.c:1774 +#: parser/parse_expr.c:1837 msgid "cannot use subquery in statistics expression" msgstr "Unteranfragen können nicht in Statistikausdrücken verwendet werden" -#: parser/parse_expr.c:1777 +#: parser/parse_expr.c:1840 msgid "cannot use subquery in transform expression" msgstr "Unteranfragen können in Umwandlungsausdrücken nicht verwendet werden" -#: parser/parse_expr.c:1780 +#: parser/parse_expr.c:1843 msgid "cannot use subquery in EXECUTE parameter" msgstr "Unteranfragen können nicht in EXECUTE-Parameter verwendet werden" -#: parser/parse_expr.c:1783 +#: parser/parse_expr.c:1846 msgid "cannot use subquery in trigger WHEN condition" msgstr "Unteranfragen können nicht in der WHEN-Bedingung eines Triggers verwendet werden" -#: parser/parse_expr.c:1786 +#: parser/parse_expr.c:1849 msgid "cannot use subquery in partition bound" msgstr "Unteranfragen können nicht in Partitionsbegrenzungen verwendet werden" -#: parser/parse_expr.c:1789 +#: parser/parse_expr.c:1852 msgid "cannot use subquery in partition key expression" msgstr "Unteranfragen können nicht in Partitionierungsschlüsselausdrücken verwendet werden" -#: parser/parse_expr.c:1792 +#: parser/parse_expr.c:1855 msgid "cannot use subquery in CALL argument" msgstr "Unteranfragen können nicht in CALL-Argument verwendet werden" -#: parser/parse_expr.c:1795 +#: parser/parse_expr.c:1858 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "Unteranfragen können nicht in COPY-FROM-WHERE-Bedingungen verwendet werden" -#: parser/parse_expr.c:1798 +#: parser/parse_expr.c:1861 msgid "cannot use subquery in column generation expression" msgstr "Unteranfragen können nicht in Spaltengenerierungsausdrücken verwendet werden" -#: parser/parse_expr.c:1851 parser/parse_expr.c:3632 +#: parser/parse_expr.c:1914 parser/parse_expr.c:3772 #, c-format msgid "subquery must return only one column" msgstr "Unteranfrage darf nur eine Spalte zurückgeben" -#: parser/parse_expr.c:1922 +#: parser/parse_expr.c:1985 #, c-format msgid "subquery has too many columns" msgstr "Unteranfrage hat zu viele Spalten" -#: parser/parse_expr.c:1927 +#: parser/parse_expr.c:1990 #, c-format msgid "subquery has too few columns" msgstr "Unteranfrage hat zu wenige Spalten" -#: parser/parse_expr.c:2023 +#: parser/parse_expr.c:2094 #, c-format msgid "cannot determine type of empty array" msgstr "kann Typ eines leeren Arrays nicht bestimmen" -#: parser/parse_expr.c:2024 +#: parser/parse_expr.c:2095 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "Wandeln Sie ausdrücklich in den gewünschten Typ um, zum Beispiel ARRAY[]::integer[]." -#: parser/parse_expr.c:2038 +#: parser/parse_expr.c:2109 #, c-format msgid "could not find element type for data type %s" msgstr "konnte Elementtyp für Datentyp %s nicht finden" -#: parser/parse_expr.c:2121 +#: parser/parse_expr.c:2192 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "ROW-Ausdrücke können höchstens %d Einträge haben" -#: parser/parse_expr.c:2326 +#: parser/parse_expr.c:2397 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "unbenannter XML-Attributwert muss ein Spaltenverweis sein" -#: parser/parse_expr.c:2327 +#: parser/parse_expr.c:2398 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "unbenannter XML-Elementwert muss ein Spaltenverweis sein" -#: parser/parse_expr.c:2342 +#: parser/parse_expr.c:2413 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "XML-Attributname »%s« einscheint mehrmals" -#: parser/parse_expr.c:2450 +#: parser/parse_expr.c:2521 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "kann das Ergebnis von XMLSERIALIZE nicht in Typ %s umwandeln" -#: parser/parse_expr.c:2764 parser/parse_expr.c:2960 +#: parser/parse_expr.c:2835 parser/parse_expr.c:3031 #, c-format msgid "unequal number of entries in row expressions" msgstr "ungleiche Anzahl Einträge in Zeilenausdrücken" -#: parser/parse_expr.c:2774 +#: parser/parse_expr.c:2845 #, c-format msgid "cannot compare rows of zero length" msgstr "kann Zeilen mit Länge null nicht vergleichen" -#: parser/parse_expr.c:2799 +#: parser/parse_expr.c:2870 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "Zeilenvergleichsoperator muss Typ boolean zurückgeben, nicht Typ %s" -#: parser/parse_expr.c:2806 +#: parser/parse_expr.c:2877 #, c-format msgid "row comparison operator must not return a set" msgstr "Zeilenvergleichsoperator darf keine Ergebnismenge zurückgeben" -#: parser/parse_expr.c:2865 parser/parse_expr.c:2906 +#: parser/parse_expr.c:2936 parser/parse_expr.c:2977 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "konnte Interpretation des Zeilenvergleichsoperators %s nicht bestimmen" -#: parser/parse_expr.c:2867 +#: parser/parse_expr.c:2938 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "Zeilenvergleichsoperatoren müssen einer »btree«-Operatorfamilie zugeordnet sein." -#: parser/parse_expr.c:2908 +#: parser/parse_expr.c:2979 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Es gibt mehrere gleichermaßen plausible Kandidaten." -#: parser/parse_expr.c:3001 -#, c-format -msgid "IS DISTINCT FROM requires = operator to yield boolean" -msgstr "IS DISTINCT FROM erfordert, dass Operator = boolean ergibt" - -#: parser/parse_expr.c:3254 +#: parser/parse_expr.c:3314 #, c-format msgid "JSON ENCODING clause is only allowed for bytea input type" -msgstr "" +msgstr "JSON-ENCODING-Klausel ist nur für Eingabetyp bytea erlaubt" -#: parser/parse_expr.c:3261 +#: parser/parse_expr.c:3378 #, c-format -msgid "FORMAT JSON has no effect for json and jsonb types" -msgstr "" +msgid "cannot use non-string types with implicit FORMAT JSON clause" +msgstr "implizite FORMAT-JSON-Klausel kann nicht mit Typen verwendet werden, die keine Zeichenketten sind" -#: parser/parse_expr.c:3284 +#: parser/parse_expr.c:3379 #, c-format -msgid "cannot use non-string types with implicit FORMAT JSON clause" -msgstr "" +msgid "cannot use non-string types with explicit FORMAT JSON clause" +msgstr "explizite FORMAT-JSON-Klausel kann nicht mit Typen verwendet werden, die keine Zeichenketten sind" -#: parser/parse_expr.c:3354 -#, fuzzy, c-format -#| msgid "cannot cast jsonb string to type %s" +#: parser/parse_expr.c:3468 +#, c-format msgid "cannot use JSON format with non-string output types" -msgstr "kann jsonb-Zeichenkette nicht in Typ %s umwandeln" +msgstr "Format JSON kann nicht mit Ausgabetypen verwendet werden, die keine Zeichenketten sind" -#: parser/parse_expr.c:3367 +#: parser/parse_expr.c:3481 #, c-format msgid "cannot set JSON encoding for non-bytea output types" -msgstr "" +msgstr "JSON-Kodierung kann nur für Ausgabetyp bytea gesetzt werden" -#: parser/parse_expr.c:3372 -#, fuzzy, c-format -#| msgid "unsupported format code: %d" +#: parser/parse_expr.c:3486 +#, c-format msgid "unsupported JSON encoding" -msgstr "nicht unterstützter Formatcode: %d" +msgstr "nicht unterstützte JSON-Kodierung" -#: parser/parse_expr.c:3373 +#: parser/parse_expr.c:3487 #, c-format msgid "Only UTF8 JSON encoding is supported." -msgstr "" +msgstr "Nur die JSON-Kodierung UTF8 wird unterstützt." -#: parser/parse_expr.c:3410 -#, fuzzy, c-format -#| msgid "return type %s is not supported for SQL functions" +#: parser/parse_expr.c:3524 +#, c-format msgid "returning SETOF types is not supported in SQL/JSON functions" -msgstr "Rückgabetyp %s wird von SQL-Funktionen nicht unterstützt" +msgstr "Rückgabe von SETOF-Typen wird in SQL/JSON-Funktionen nicht unterstützt" + +#: parser/parse_expr.c:3529 +#, c-format +msgid "returning pseudo-types is not supported in SQL/JSON functions" +msgstr "Rückgabe von Pseudotypen wird in SQL/JSON-Funktionen nicht unterstützt" -#: parser/parse_expr.c:3711 parser/parse_func.c:865 +#: parser/parse_expr.c:3857 parser/parse_func.c:866 #, c-format msgid "aggregate ORDER BY is not implemented for window functions" msgstr "ORDER BY in Aggregatfunktion ist für Fensterfunktionen nicht implementiert" -#: parser/parse_expr.c:3930 +#: parser/parse_expr.c:4080 #, c-format msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" -msgstr "" +msgstr "JSON-FORMAT-ENCODING-Klausel kann nur für Eingabetyp bytea verwendet werden" -#: parser/parse_expr.c:3950 -#, fuzzy, c-format -#| msgid "cannot use subquery in index predicate" +#: parser/parse_expr.c:4100 +#, c-format msgid "cannot use type %s in IS JSON predicate" -msgstr "Unteranfragen können nicht im Indexprädikat verwendet werden" +msgstr "Typ %s kann nicht im IS-JSON-Prädikat verwendet werden" + +#: parser/parse_expr.c:4126 parser/parse_expr.c:4247 +#, c-format +msgid "cannot use type %s in RETURNING clause of %s" +msgstr "Typ %s kann nicht in der RETURNING-Klausel von %s verwendet werden" + +#: parser/parse_expr.c:4128 +#, c-format +msgid "Try returning json or jsonb." +msgstr "Versuchen Sie json oder jsonb zurückzugeben." + +#: parser/parse_expr.c:4176 +#, c-format +msgid "cannot use non-string types with WITH UNIQUE KEYS clause" +msgstr "Klausel WITH UNIQUE KEYS kann nicht mit Typen verwendet werden, die keine Zeichenketten sind" + +#: parser/parse_expr.c:4250 +#, c-format +msgid "Try returning a string type or bytea." +msgstr "Versuchen Sie einen Zeichenkettentyp oder bytea zurückzugeben." + +#: parser/parse_expr.c:4315 +#, c-format +msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" +msgstr "FORMAT JSON kann nicht in der RETURNING-Klausel von %s() angegeben werden" + +#: parser/parse_expr.c:4328 +#, c-format +msgid "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" +msgstr "SQL/JSON-QUOTES-Verhalten darf nicht angegeben werden, wenn WITH WRAPPER verwendet wird" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4342 parser/parse_expr.c:4371 parser/parse_expr.c:4402 +#: parser/parse_expr.c:4428 parser/parse_expr.c:4454 +#: parser/parse_jsontable.c:94 +#, c-format +msgid "invalid %s behavior" +msgstr "ungültiges »%s«-Verhalten" + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4345 parser/parse_expr.c:4374 +#, c-format +msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s." +msgstr "Nur ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT oder DEFAULT-Ausdruck sind erlaubt in %s für %s." + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4352 parser/parse_expr.c:4381 parser/parse_expr.c:4410 +#: parser/parse_expr.c:4438 parser/parse_expr.c:4464 +#, c-format +msgid "invalid %s behavior for column \"%s\"" +msgstr "ungültiges »%s«-Verhalten für Spalte »%s«" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4355 parser/parse_expr.c:4384 +#, c-format +msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns." +msgstr "Nur ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT oder DEFAULT-Ausdruck sind erlaubt in %s für formatierte Spalten." + +#: parser/parse_expr.c:4403 +#, c-format +msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s." +msgstr "Nur ERROR, TRUE, FALSE oder UNKNOWN sind erlaubt in %s für %s." + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4413 +#, c-format +msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns." +msgstr "Nur ERROR, TRUE, FALSE oder UNKNOWN sind erlaubt in %s für EXISTS-Spalten." + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4431 parser/parse_expr.c:4457 +#, c-format +msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s." +msgstr "Nur ERROR, NULL oder DEFAULT-Ausdruck sind erlaubt in %s für %s." + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4441 parser/parse_expr.c:4467 +#, c-format +msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns." +msgstr "Nur ERROR, NULL oder DEFAULT-Ausdruck sind erlaubt in %s für skalare Spalten." + +#: parser/parse_expr.c:4497 +#, c-format +msgid "JSON path expression must be of type %s, not of type %s" +msgstr "JSON-Pfadausdruck muss Typ %s haben, nicht Typ %s" + +#: parser/parse_expr.c:4715 +#, c-format +msgid "can only specify a constant, non-aggregate function, or operator expression for DEFAULT" +msgstr "für DEFAULT kann nur eine Konstante, Nicht-Aggregat-Funktion oder ein Operatorausdruck angegeben werden" + +#: parser/parse_expr.c:4720 +#, c-format +msgid "DEFAULT expression must not contain column references" +msgstr "DEFAULT-Ausdruck darf keine Spaltenverweise enthalten" + +#: parser/parse_expr.c:4725 +#, c-format +msgid "DEFAULT expression must not return a set" +msgstr "DEFAULT-Ausdruck darf keine Ergebnismenge zurückgeben" + +#: parser/parse_expr.c:4801 parser/parse_expr.c:4810 +#, c-format +msgid "cannot cast behavior expression of type %s to %s" +msgstr "kann Verhaltensausdruck nicht von Typ %s in %s umwandeln" + +#: parser/parse_expr.c:4804 +#, c-format +msgid "You will need to explicitly cast the expression to type %s." +msgstr "Sie werden den Ausdruck ausdrücklich in Typ %s umwandeln müssen." #: parser/parse_func.c:194 #, c-format @@ -17921,7 +18476,7 @@ msgstr "Argumentname »%s« mehrmals angegeben" msgid "positional argument cannot follow named argument" msgstr "Positionsargument kann nicht hinter benanntem Argument stehen" -#: parser/parse_func.c:287 parser/parse_func.c:2367 +#: parser/parse_func.c:287 parser/parse_func.c:2368 #, c-format msgid "%s is not a procedure" msgstr "%s ist keine Prozedur" @@ -18040,7 +18595,7 @@ msgstr "Konnte keine beste Kandidatfunktion auswählen. Sie müssen möglicherwe msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." msgstr "Keine Aggregatfunktion stimmt mit dem angegebenen Namen und den Argumenttypen überein. Mõglicherweise steht ORDER BY an der falschen Stelle; ORDER BY muss hinter allen normalen Argumenten der Aggregatfunktion stehen." -#: parser/parse_func.c:622 parser/parse_func.c:2410 +#: parser/parse_func.c:622 parser/parse_func.c:2411 #, c-format msgid "procedure %s does not exist" msgstr "Prozedur %s existiert nicht" @@ -18060,7 +18615,7 @@ msgstr "Keine Funktion stimmt mit dem angegebenen Namen und den Argumenttypen ü msgid "VARIADIC argument must be an array" msgstr "VARIADIC-Argument muss ein Array sein" -#: parser/parse_func.c:791 parser/parse_func.c:855 +#: parser/parse_func.c:791 parser/parse_func.c:856 #, c-format msgid "%s(*) must be used to call a parameterless aggregate function" msgstr "beim Aufruf einer parameterlosen Aggregatfunktion muss %s(*) angegeben werden" @@ -18075,263 +18630,257 @@ msgstr "Aggregatfunktionen können keine Ergebnismengen zurückgeben" msgid "aggregates cannot use named arguments" msgstr "Aggregatfunktionen können keine benannten Argumente verwenden" -#: parser/parse_func.c:845 +#: parser/parse_func.c:846 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "DISTINCT ist für Fensterfunktionen nicht implementiert" -#: parser/parse_func.c:874 +#: parser/parse_func.c:875 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "FILTER ist für Fensterfunktionen, die keine Aggregatfunktionen sind, nicht implementiert" -#: parser/parse_func.c:883 +#: parser/parse_func.c:884 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "Aufrufe von Fensterfunktionen können keine Aufrufe von Funktionen mit Ergebnismenge enthalten" -#: parser/parse_func.c:891 +#: parser/parse_func.c:892 #, c-format msgid "window functions cannot return sets" msgstr "Fensterfunktionen können keine Ergebnismengen zurückgeben" -#: parser/parse_func.c:2166 parser/parse_func.c:2439 +#: parser/parse_func.c:2167 parser/parse_func.c:2440 #, c-format msgid "could not find a function named \"%s\"" msgstr "konnte keine Funktion namens »%s« finden" -#: parser/parse_func.c:2180 parser/parse_func.c:2457 +#: parser/parse_func.c:2181 parser/parse_func.c:2458 #, c-format msgid "function name \"%s\" is not unique" msgstr "Funktionsname »%s« ist nicht eindeutig" -#: parser/parse_func.c:2182 parser/parse_func.c:2460 +#: parser/parse_func.c:2183 parser/parse_func.c:2461 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "Geben Sie eine Argumentliste an, um die Funktion eindeutig auszuwählen." -#: parser/parse_func.c:2226 +#: parser/parse_func.c:2227 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" msgstr[0] "Prozeduren können nicht mehr als %d Argument haben" msgstr[1] "Prozeduren können nicht mehr als %d Argumente haben" -#: parser/parse_func.c:2357 +#: parser/parse_func.c:2358 #, c-format msgid "%s is not a function" msgstr "%s ist keine Funktion" -#: parser/parse_func.c:2377 +#: parser/parse_func.c:2378 #, c-format msgid "function %s is not an aggregate" msgstr "Funktion %s ist keine Aggregatfunktion" -#: parser/parse_func.c:2405 +#: parser/parse_func.c:2406 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "konnte keine Prozedur namens »%s« finden" -#: parser/parse_func.c:2419 +#: parser/parse_func.c:2420 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "konnte keine Aggregatfunktion namens »%s« finden" -#: parser/parse_func.c:2424 +#: parser/parse_func.c:2425 #, c-format msgid "aggregate %s(*) does not exist" msgstr "Aggregatfunktion %s(*) existiert nicht" -#: parser/parse_func.c:2429 +#: parser/parse_func.c:2430 #, c-format msgid "aggregate %s does not exist" msgstr "Aggregatfunktion %s existiert nicht" -#: parser/parse_func.c:2465 +#: parser/parse_func.c:2466 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "Prozedurname »%s« ist nicht eindeutig" -#: parser/parse_func.c:2468 +#: parser/parse_func.c:2469 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "Geben Sie eine Argumentliste an, um die Prozedur eindeutig auszuwählen." -#: parser/parse_func.c:2473 +#: parser/parse_func.c:2474 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "Aggregatfunktionsname »%s« ist nicht eindeutig" -#: parser/parse_func.c:2476 +#: parser/parse_func.c:2477 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "Geben Sie eine Argumentliste an, um die Aggregatfunktion eindeutig auszuwählen." -#: parser/parse_func.c:2481 +#: parser/parse_func.c:2482 #, c-format msgid "routine name \"%s\" is not unique" msgstr "Routinenname »%s« ist nicht eindeutig" -#: parser/parse_func.c:2484 +#: parser/parse_func.c:2485 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "Geben Sie eine Argumentliste an, um die Routine eindeutig auszuwählen." -#: parser/parse_func.c:2539 +#: parser/parse_func.c:2540 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "Funktionen mit Ergebnismenge sind in JOIN-Bedingungen nicht erlaubt" -#: parser/parse_func.c:2560 +#: parser/parse_func.c:2561 msgid "set-returning functions are not allowed in policy expressions" msgstr "Funktionen mit Ergebnismenge sind in Policy-Ausdrücken nicht erlaubt" -#: parser/parse_func.c:2576 +#: parser/parse_func.c:2577 msgid "set-returning functions are not allowed in window definitions" msgstr "Funktionen mit Ergebnismenge sind in Fensterdefinitionen nicht erlaubt" -#: parser/parse_func.c:2613 +#: parser/parse_func.c:2615 msgid "set-returning functions are not allowed in MERGE WHEN conditions" msgstr "Funktionen mit Ergebnismenge sind in MERGE-WHEN-Bedingungen nicht erlaubt" -#: parser/parse_func.c:2617 +#: parser/parse_func.c:2619 msgid "set-returning functions are not allowed in check constraints" msgstr "Funktionen mit Ergebnismenge sind in Check-Constraints nicht erlaubt" -#: parser/parse_func.c:2621 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "Funktionen mit Ergebnismenge sind in DEFAULT-Ausdrücken nicht erlaubt" -#: parser/parse_func.c:2624 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index expressions" msgstr "Funktionen mit Ergebnismenge sind in Indexausdrücken nicht erlaubt" -#: parser/parse_func.c:2627 +#: parser/parse_func.c:2629 msgid "set-returning functions are not allowed in index predicates" msgstr "Funktionen mit Ergebnismenge sind in Indexprädikaten nicht erlaubt" -#: parser/parse_func.c:2630 +#: parser/parse_func.c:2632 msgid "set-returning functions are not allowed in statistics expressions" msgstr "Funktionen mit Ergebnismenge sind in Statistikausdrücken nicht erlaubt" -#: parser/parse_func.c:2633 +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in transform expressions" msgstr "Funktionen mit Ergebnismenge sind in Umwandlungsausdrücken nicht erlaubt" -#: parser/parse_func.c:2636 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "Funktionen mit Ergebnismenge sind in EXECUTE-Parametern nicht erlaubt" -#: parser/parse_func.c:2639 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "Funktionen mit Ergebnismenge sind in der WHEN-Bedingung eines Triggers nicht erlaubt" -#: parser/parse_func.c:2642 +#: parser/parse_func.c:2644 msgid "set-returning functions are not allowed in partition bound" msgstr "Funktionen mit Ergebnismenge sind in Partitionsbegrenzungen nicht erlaubt" -#: parser/parse_func.c:2645 +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in partition key expressions" msgstr "Funktionen mit Ergebnismenge sind in Partitionierungsschlüsselausdrücken nicht erlaubt" -#: parser/parse_func.c:2648 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in CALL arguments" msgstr "Funktionen mit Ergebnismenge sind in CALL-Argumenten nicht erlaubt" -#: parser/parse_func.c:2651 +#: parser/parse_func.c:2653 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "Funktionen mit Ergebnismenge sind in COPY-FROM-WHERE-Bedingungen nicht erlaubt" -#: parser/parse_func.c:2654 +#: parser/parse_func.c:2656 msgid "set-returning functions are not allowed in column generation expressions" msgstr "Funktionen mit Ergebnismenge sind in Spaltengenerierungsausdrücken nicht erlaubt" -#: parser/parse_merge.c:119 +#: parser/parse_jsontable.c:95 +#, c-format +msgid "Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause." +msgstr "Nur EMPTY [ ARRAY ] oder ERROR ist in der ON-ERROR-Klausel auf der obersten Ebene erlaubt." + +#: parser/parse_jsontable.c:189 parser/parse_jsontable.c:203 +#, c-format +msgid "duplicate JSON_TABLE column or path name: %s" +msgstr "doppelter JSON_TABLE-Spalten- oder -Pfadname: %s" + +#: parser/parse_merge.c:129 #, c-format msgid "WITH RECURSIVE is not supported for MERGE statement" msgstr "WITH RECURSIVE wird für die MERGE-Anweisung nicht unterstützt" -#: parser/parse_merge.c:161 +#: parser/parse_merge.c:176 #, c-format msgid "unreachable WHEN clause specified after unconditional WHEN clause" msgstr "unerreichbare WHERE-Klausel nach einer WHERE-Klausel ohne Bedingung angegeben" -#: parser/parse_merge.c:191 -#, c-format -msgid "MERGE is not supported for relations with rules." -msgstr "MERGE wird für Relationen mit Regeln nicht unterstützt." - -#: parser/parse_merge.c:208 +#: parser/parse_merge.c:222 #, c-format msgid "name \"%s\" specified more than once" msgstr "Name »%s« mehrmals angegeben" -#: parser/parse_merge.c:210 +#: parser/parse_merge.c:224 #, c-format msgid "The name is used both as MERGE target table and data source." msgstr "Der Name wird sowohl als MERGE-Zieltabelle als auch als Datenquelle verwendet." -#: parser/parse_node.c:87 +#: parser/parse_node.c:82 #, c-format msgid "target lists can have at most %d entries" msgstr "Targetlisten können höchstens %d Einträge haben" -#: parser/parse_oper.c:123 parser/parse_oper.c:690 +#: parser/parse_oper.c:114 parser/parse_oper.c:678 #, c-format msgid "postfix operators are not supported" msgstr "Postfix-Operatoren werden nicht unterstützt" -#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:509 -#: utils/adt/regproc.c:683 -#, c-format -msgid "operator does not exist: %s" -msgstr "Operator existiert nicht: %s" - -#: parser/parse_oper.c:229 +#: parser/parse_oper.c:217 #, c-format msgid "Use an explicit ordering operator or modify the query." msgstr "Verwenden Sie einen ausdrücklichen Sortieroperator oder ändern Sie die Anfrage." -#: parser/parse_oper.c:485 +#: parser/parse_oper.c:473 #, c-format msgid "operator requires run-time type coercion: %s" msgstr "Operator erfordert Typumwandlung zur Laufzeit: %s" -#: parser/parse_oper.c:641 +#: parser/parse_oper.c:629 #, c-format msgid "operator is not unique: %s" msgstr "Operator ist nicht eindeutig: %s" -#: parser/parse_oper.c:643 +#: parser/parse_oper.c:631 #, c-format msgid "Could not choose a best candidate operator. You might need to add explicit type casts." msgstr "Konnte keinen besten Kandidatoperator auswählen. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen." -#: parser/parse_oper.c:652 +#: parser/parse_oper.c:640 #, c-format msgid "No operator matches the given name and argument type. You might need to add an explicit type cast." msgstr "Kein Operator stimmt mit dem angegebenen Namen und Argumenttyp überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen." -#: parser/parse_oper.c:654 +#: parser/parse_oper.c:642 #, c-format msgid "No operator matches the given name and argument types. You might need to add explicit type casts." msgstr "Kein Operator stimmt mit dem angegebenen Namen und den Argumenttypen überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen." -#: parser/parse_oper.c:714 parser/parse_oper.c:828 -#, c-format -msgid "operator is only a shell: %s" -msgstr "Operator ist nur eine Hülle: %s" - -#: parser/parse_oper.c:816 +#: parser/parse_oper.c:803 #, c-format msgid "op ANY/ALL (array) requires array on right side" msgstr "op ANY/ALL (array) erfordert Array auf der rechten Seite" -#: parser/parse_oper.c:858 +#: parser/parse_oper.c:844 #, c-format msgid "op ANY/ALL (array) requires operator to yield boolean" msgstr "op ANY/ALL (array) erfordert, dass Operator boolean ergibt" -#: parser/parse_oper.c:863 +#: parser/parse_oper.c:849 #, c-format msgid "op ANY/ALL (array) requires operator not to return a set" msgstr "op ANY/ALL (array) erfordert, dass Operator keine Ergebnismenge zurückgibt" @@ -18341,7 +18890,7 @@ msgstr "op ANY/ALL (array) erfordert, dass Operator keine Ergebnismenge zurückg msgid "inconsistent types deduced for parameter $%d" msgstr "inkonsistente Typen für Parameter $%d ermittelt" -#: parser/parse_param.c:309 tcop/postgres.c:740 +#: parser/parse_param.c:309 tcop/postgres.c:744 #, c-format msgid "could not determine data type of parameter $%d" msgstr "konnte Datentyp von Parameter $%d nicht ermitteln" @@ -18361,13 +18910,13 @@ msgstr "Tabellenbezug %u ist nicht eindeutig" msgid "table name \"%s\" specified more than once" msgstr "Tabellenname »%s« mehrmals angegeben" -#: parser/parse_relation.c:494 parser/parse_relation.c:3629 -#: parser/parse_relation.c:3638 +#: parser/parse_relation.c:494 parser/parse_relation.c:3633 +#: parser/parse_relation.c:3642 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "ungültiger Verweis auf FROM-Klausel-Eintrag für Tabelle »%s«" -#: parser/parse_relation.c:498 parser/parse_relation.c:3640 +#: parser/parse_relation.c:498 parser/parse_relation.c:3644 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "Es gibt einen Eintrag für Tabelle »%s«, aber auf ihn kann aus diesem Teil der Anfrage nicht verwiesen werden." @@ -18392,18 +18941,18 @@ msgstr "Systemspalte »%s« kann nicht in Spaltengenerierungsausdruck verwendet msgid "cannot use system column \"%s\" in MERGE WHEN condition" msgstr "Systemspalte »%s« kann nicht in MERGE-WHEN-Bedingung verwendet werden" -#: parser/parse_relation.c:1236 parser/parse_relation.c:1690 -#: parser/parse_relation.c:2387 +#: parser/parse_relation.c:1236 parser/parse_relation.c:1691 +#: parser/parse_relation.c:2384 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "Tabelle »%s« hat %d Spalten, aber %d Spalten wurden angegeben" -#: parser/parse_relation.c:1444 +#: parser/parse_relation.c:1445 #, c-format msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." msgstr "Es gibt ein WITH-Element namens »%s«, aber darauf kann aus diesem Teil der Anfrage kein Bezug genommen werden." -#: parser/parse_relation.c:1446 +#: parser/parse_relation.c:1447 #, c-format msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." msgstr "Verwenden Sie WITH RECURSIVE oder sortieren Sie die WITH-Ausdrücke um, um Vorwärtsreferenzen zu entfernen." @@ -18438,127 +18987,127 @@ msgstr "Spaltendefinitionslisten können höchstens %d Einträge haben" msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "Funktion »%s« in FROM hat nicht unterstützten Rückgabetyp %s" -#: parser/parse_relation.c:1981 parser/parse_relation.c:2067 +#: parser/parse_relation.c:1981 parser/parse_relation.c:2066 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "Funktionen in FROM können höchstens %d Spalten zurückgeben" -#: parser/parse_relation.c:2097 +#: parser/parse_relation.c:2096 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "Funktion %s hat %d Spalten verfügbar, aber %d Spalten wurden angegeben" -#: parser/parse_relation.c:2179 +#: parser/parse_relation.c:2177 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "VALUES-Liste »%s« hat %d Spalten verfügbar, aber %d Spalten wurden angegeben" -#: parser/parse_relation.c:2245 +#: parser/parse_relation.c:2242 #, c-format msgid "joins can have at most %d columns" msgstr "Verbunde können höchstens %d Spalten haben" -#: parser/parse_relation.c:2270 +#: parser/parse_relation.c:2267 #, c-format msgid "join expression \"%s\" has %d columns available but %d columns specified" msgstr "Verbundausdruck »%s« hat %d Spalten verfügbar, aber %d Spalten wurden angegeben" -#: parser/parse_relation.c:2360 +#: parser/parse_relation.c:2357 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "WITH-Anfrage »%s« hat keine RETURNING-Klausel" -#: parser/parse_relation.c:3631 +#: parser/parse_relation.c:3635 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Vielleicht wurde beabsichtigt, auf den Tabellenalias »%s« zu verweisen." -#: parser/parse_relation.c:3643 +#: parser/parse_relation.c:3647 #, c-format msgid "To reference that table, you must mark this subquery with LATERAL." msgstr "Um auf diese Tabelle zu verweisen, müssen Sie diese Unteranfrage mit LATERAL markieren." -#: parser/parse_relation.c:3649 +#: parser/parse_relation.c:3653 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "fehlender Eintrag in FROM-Klausel für Tabelle »%s«" -#: parser/parse_relation.c:3689 +#: parser/parse_relation.c:3693 #, c-format msgid "There are columns named \"%s\", but they are in tables that cannot be referenced from this part of the query." msgstr "Es gibt Spalten namens »%s«, aber sie sind in Tabellen, auf die aus diesem Teil der Anfrage nicht verwiesen werden kann." -#: parser/parse_relation.c:3691 +#: parser/parse_relation.c:3695 #, c-format msgid "Try using a table-qualified name." msgstr "Versuchen Sie, einen tabellenqualifizierten Namen zu verwenden." -#: parser/parse_relation.c:3699 +#: parser/parse_relation.c:3703 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "Es gibt eine Spalte namens »%s« in Tabelle »%s«, aber auf sie kann aus diesem Teil der Anfrage nicht verwiesen werden." -#: parser/parse_relation.c:3702 +#: parser/parse_relation.c:3706 #, c-format msgid "To reference that column, you must mark this subquery with LATERAL." msgstr "Um auf diese Spalte zu verweisen, müssen Sie diese Unteranfrage mit LATERAL markieren." -#: parser/parse_relation.c:3704 +#: parser/parse_relation.c:3708 #, c-format msgid "To reference that column, you must use a table-qualified name." msgstr "Um auf diese Spalte zu verweisen, müssen Sie einen tabellenqualifizierten Namen verwenden." -#: parser/parse_relation.c:3724 +#: parser/parse_relation.c:3728 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "Vielleicht wurde beabsichtigt, auf die Spalte »%s.%s« zu verweisen." -#: parser/parse_relation.c:3738 +#: parser/parse_relation.c:3742 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "Vielleicht wurde beabsichtigt, auf die Spalte »%s.%s« oder die Spalte »%s.%s« zu verweisen." -#: parser/parse_target.c:481 parser/parse_target.c:796 +#: parser/parse_target.c:480 parser/parse_target.c:795 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "kann Systemspalte »%s« keinen Wert zuweisen" -#: parser/parse_target.c:509 +#: parser/parse_target.c:508 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "kann Arrayelement nicht auf DEFAULT setzen" -#: parser/parse_target.c:514 +#: parser/parse_target.c:513 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "kann Subfeld nicht auf DEFAULT setzen" -#: parser/parse_target.c:588 +#: parser/parse_target.c:587 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "Spalte »%s« hat Typ %s, aber der Ausdruck hat Typ %s" -#: parser/parse_target.c:780 +#: parser/parse_target.c:779 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" msgstr "kann Feld »%s« in Spalte »%s« nicht setzen, weil ihr Typ %s kein zusammengesetzter Typ ist" -#: parser/parse_target.c:789 +#: parser/parse_target.c:788 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" msgstr "kann Feld »%s« in Spalte »%s« nicht setzen, weil es keine solche Spalte in Datentyp %s gibt" -#: parser/parse_target.c:869 +#: parser/parse_target.c:877 #, c-format msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" msgstr "Wertzuweisung in Elemente von »%s« erfordert Typ %s, aber Ausdruck hat Typ %s" -#: parser/parse_target.c:879 +#: parser/parse_target.c:887 #, c-format msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "Subfeld »%s« hat Typ %s, aber der Ausdruck hat Typ %s" -#: parser/parse_target.c:1314 +#: parser/parse_target.c:1327 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * ist nicht gültig, wenn keine Tabellen angegeben sind" @@ -18578,8 +19127,8 @@ msgstr "falscher %%TYPE-Verweis (zu viele Namensteile): %s" msgid "type reference %s converted to %s" msgstr "Typverweis %s in %s umgewandelt" -#: parser/parse_type.c:278 parser/parse_type.c:813 utils/cache/typcache.c:390 -#: utils/cache/typcache.c:445 +#: parser/parse_type.c:278 parser/parse_type.c:813 utils/cache/typcache.c:397 +#: utils/cache/typcache.c:452 #, c-format msgid "type \"%s\" is only a shell" msgstr "Typ »%s« ist nur eine Hülle" @@ -18599,330 +19148,325 @@ msgstr "Typmodifikatoren müssen einfache Konstanten oder Bezeichner sein" msgid "invalid type name \"%s\"" msgstr "ungültiger Typname: »%s«" -#: parser/parse_utilcmd.c:264 +#: parser/parse_utilcmd.c:263 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "partitionierte Tabelle kann nicht als Vererbungskind erzeugt werden" -#: parser/parse_utilcmd.c:580 +#: parser/parse_utilcmd.c:475 +#, c-format +msgid "cannot set logged status of a temporary sequence" +msgstr "kann den geloggten Status einer temporären Sequenz nicht ändern" + +#: parser/parse_utilcmd.c:611 #, c-format msgid "array of serial is not implemented" msgstr "Array aus Typ serial ist nicht implementiert" -#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 -#: parser/parse_utilcmd.c:730 +#: parser/parse_utilcmd.c:690 parser/parse_utilcmd.c:702 +#: parser/parse_utilcmd.c:761 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "widersprüchliche NULL/NOT NULL-Deklarationen für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:683 +#: parser/parse_utilcmd.c:714 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "mehrere Vorgabewerte angegeben für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:700 +#: parser/parse_utilcmd.c:731 #, c-format msgid "identity columns are not supported on typed tables" msgstr "Identitätsspalten in getypten Tabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:704 +#: parser/parse_utilcmd.c:735 #, c-format msgid "identity columns are not supported on partitions" msgstr "Identitätsspalten in partitionierten Tabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:713 +#: parser/parse_utilcmd.c:744 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "mehrere Identitätsangaben für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:743 +#: parser/parse_utilcmd.c:774 #, c-format msgid "generated columns are not supported on typed tables" msgstr "generierte Spalten in getypten Tabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:747 +#: parser/parse_utilcmd.c:778 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "mehrere Generierungsklauseln angegeben für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:765 parser/parse_utilcmd.c:880 +#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:911 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "Primärschlüssel für Fremdtabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:774 parser/parse_utilcmd.c:890 +#: parser/parse_utilcmd.c:805 parser/parse_utilcmd.c:921 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "Unique-Constraints auf Fremdtabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:819 +#: parser/parse_utilcmd.c:850 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "sowohl Vorgabewert als auch Identität angegeben für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:827 +#: parser/parse_utilcmd.c:858 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "sowohl Vorgabewert als auch Generierungsausdruck angegeben für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:835 +#: parser/parse_utilcmd.c:866 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "sowohl Identität als auch Generierungsausdruck angegeben für Spalte »%s« von Tabelle »%s«" -#: parser/parse_utilcmd.c:900 +#: parser/parse_utilcmd.c:931 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "Exclusion-Constraints auf Fremdtabellen werden nicht unterstützt" -#: parser/parse_utilcmd.c:906 -#, c-format -msgid "exclusion constraints are not supported on partitioned tables" -msgstr "Exclusion-Constraints auf partitionierten Tabellen werden nicht unterstützt" - -#: parser/parse_utilcmd.c:971 +#: parser/parse_utilcmd.c:996 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE wird für das Erzeugen von Fremdtabellen nicht unterstützt" -#: parser/parse_utilcmd.c:984 +#: parser/parse_utilcmd.c:1009 #, c-format msgid "relation \"%s\" is invalid in LIKE clause" msgstr "Relation »%s« ist ungültig in der LIKE-Klausel" -#: parser/parse_utilcmd.c:1741 parser/parse_utilcmd.c:1849 +#: parser/parse_utilcmd.c:1736 parser/parse_utilcmd.c:1844 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "Index »%s« enthält einen Verweis auf die ganze Zeile der Tabelle." -#: parser/parse_utilcmd.c:2236 +#: parser/parse_utilcmd.c:2242 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "bestehender Index kann nicht in CREATE TABLE verwendet werden" -#: parser/parse_utilcmd.c:2256 +#: parser/parse_utilcmd.c:2262 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "Index »%s« gehört bereits zu einem Constraint" -#: parser/parse_utilcmd.c:2271 -#, c-format -msgid "index \"%s\" is not valid" -msgstr "Index »%s« ist nicht gültig" - -#: parser/parse_utilcmd.c:2277 +#: parser/parse_utilcmd.c:2283 #, c-format msgid "\"%s\" is not a unique index" msgstr "»%s« ist kein Unique Index" -#: parser/parse_utilcmd.c:2278 parser/parse_utilcmd.c:2285 -#: parser/parse_utilcmd.c:2292 parser/parse_utilcmd.c:2369 +#: parser/parse_utilcmd.c:2284 parser/parse_utilcmd.c:2291 +#: parser/parse_utilcmd.c:2298 parser/parse_utilcmd.c:2375 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "Ein Primärschlüssel oder Unique-Constraint kann nicht mit einem solchen Index erzeugt werden." -#: parser/parse_utilcmd.c:2284 +#: parser/parse_utilcmd.c:2290 #, c-format msgid "index \"%s\" contains expressions" msgstr "Index »%s« enthält Ausdrücke" -#: parser/parse_utilcmd.c:2291 +#: parser/parse_utilcmd.c:2297 #, c-format msgid "\"%s\" is a partial index" msgstr "»%s« ist ein partieller Index" -#: parser/parse_utilcmd.c:2303 +#: parser/parse_utilcmd.c:2309 #, c-format msgid "\"%s\" is a deferrable index" msgstr "»%s« ist ein aufschiebbarer Index" -#: parser/parse_utilcmd.c:2304 +#: parser/parse_utilcmd.c:2310 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "Ein nicht aufschiebbarer Constraint kann nicht mit einem aufschiebbaren Index erzeugt werden." -#: parser/parse_utilcmd.c:2368 +#: parser/parse_utilcmd.c:2374 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "Index »%s« Spalte Nummer %d hat nicht das Standardsortierverhalten" -#: parser/parse_utilcmd.c:2525 +#: parser/parse_utilcmd.c:2531 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "Spalte »%s« erscheint zweimal im Primärschlüssel-Constraint" -#: parser/parse_utilcmd.c:2531 +#: parser/parse_utilcmd.c:2537 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "Spalte »%s« erscheint zweimal im Unique-Constraint" -#: parser/parse_utilcmd.c:2878 +#: parser/parse_utilcmd.c:2871 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "Indexausdrücke und -prädikate können nur auf die zu indizierende Tabelle verweisen" -#: parser/parse_utilcmd.c:2950 +#: parser/parse_utilcmd.c:2943 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "Statistikausdrücke können nur auf die referenzierte Tabelle verweisen" -#: parser/parse_utilcmd.c:2993 +#: parser/parse_utilcmd.c:2986 #, c-format msgid "rules on materialized views are not supported" msgstr "Regeln für materialisierte Sichten werden nicht unterstützt" -#: parser/parse_utilcmd.c:3053 +#: parser/parse_utilcmd.c:3046 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "WHERE-Bedingung einer Regel kann keine Verweise auf andere Relationen enthalten" -#: parser/parse_utilcmd.c:3125 +#: parser/parse_utilcmd.c:3118 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "Regeln mit WHERE-Bedingungen können als Aktion nur SELECT, INSERT, UPDATE oder DELETE haben" -#: parser/parse_utilcmd.c:3143 parser/parse_utilcmd.c:3244 -#: rewrite/rewriteHandler.c:539 rewrite/rewriteManip.c:1087 +#: parser/parse_utilcmd.c:3136 parser/parse_utilcmd.c:3237 +#: rewrite/rewriteHandler.c:544 rewrite/rewriteManip.c:1096 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "UNION/INTERSECTION/EXCEPT mit Bedingung sind nicht implementiert" -#: parser/parse_utilcmd.c:3161 +#: parser/parse_utilcmd.c:3154 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON-SELECT-Regel kann nicht OLD verwenden" -#: parser/parse_utilcmd.c:3165 +#: parser/parse_utilcmd.c:3158 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON-SELECT-Regel kann nicht NEW verwenden" -#: parser/parse_utilcmd.c:3174 +#: parser/parse_utilcmd.c:3167 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON-INSERT-Regel kann nicht OLD verwenden" -#: parser/parse_utilcmd.c:3180 +#: parser/parse_utilcmd.c:3173 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON-DELETE-Regel kann nicht NEW verwenden" -#: parser/parse_utilcmd.c:3208 +#: parser/parse_utilcmd.c:3201 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "in WITH-Anfrage kann nicht auf OLD verweisen werden" -#: parser/parse_utilcmd.c:3215 +#: parser/parse_utilcmd.c:3208 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "in WITH-Anfrage kann nicht auf NEW verwiesen werden" -#: parser/parse_utilcmd.c:3667 +#: parser/parse_utilcmd.c:3664 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "falsch platzierte DEFERRABLE-Klausel" -#: parser/parse_utilcmd.c:3672 parser/parse_utilcmd.c:3687 +#: parser/parse_utilcmd.c:3669 parser/parse_utilcmd.c:3684 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "mehrere DEFERRABLE/NOT DEFERRABLE-Klauseln sind nicht erlaubt" -#: parser/parse_utilcmd.c:3682 +#: parser/parse_utilcmd.c:3679 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "falsch platzierte NOT DEFERRABLE-Klausel" -#: parser/parse_utilcmd.c:3703 +#: parser/parse_utilcmd.c:3700 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "falsch platzierte INITIALLY DEFERRED-Klausel" -#: parser/parse_utilcmd.c:3708 parser/parse_utilcmd.c:3734 +#: parser/parse_utilcmd.c:3705 parser/parse_utilcmd.c:3731 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "mehrere INITIALLY IMMEDIATE/DEFERRED-Klauseln sind nicht erlaubt" -#: parser/parse_utilcmd.c:3729 +#: parser/parse_utilcmd.c:3726 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "falsch platzierte INITIALLY IMMEDIATE-Klausel" -#: parser/parse_utilcmd.c:3922 +#: parser/parse_utilcmd.c:3919 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATE gibt ein Schema an (%s) welches nicht gleich dem zu erzeugenden Schema ist (%s)" -#: parser/parse_utilcmd.c:3957 +#: parser/parse_utilcmd.c:3954 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "»%s« ist keine partitionierte Tabelle" -#: parser/parse_utilcmd.c:3964 +#: parser/parse_utilcmd.c:3961 #, c-format msgid "table \"%s\" is not partitioned" msgstr "Tabelle »%s« ist nicht partitioniert" -#: parser/parse_utilcmd.c:3971 +#: parser/parse_utilcmd.c:3968 #, c-format msgid "index \"%s\" is not partitioned" msgstr "Index »%s« ist nicht partitioniert" -#: parser/parse_utilcmd.c:4011 +#: parser/parse_utilcmd.c:4008 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "eine hashpartitionierte Tabelle kann keine Standardpartition haben" -#: parser/parse_utilcmd.c:4028 +#: parser/parse_utilcmd.c:4025 #, c-format msgid "invalid bound specification for a hash partition" msgstr "ungültige Begrenzungsangabe für eine Hash-Partition" -#: parser/parse_utilcmd.c:4034 partitioning/partbounds.c:4803 +#: parser/parse_utilcmd.c:4031 partitioning/partbounds.c:4802 #, c-format msgid "modulus for hash partition must be an integer value greater than zero" msgstr "Modulus für Hashpartition muss eine ganze Zahl größer als null sein" -#: parser/parse_utilcmd.c:4041 partitioning/partbounds.c:4811 +#: parser/parse_utilcmd.c:4038 partitioning/partbounds.c:4810 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "Rest für Hashpartition muss kleiner als Modulus sein" -#: parser/parse_utilcmd.c:4054 +#: parser/parse_utilcmd.c:4051 #, c-format msgid "invalid bound specification for a list partition" msgstr "ungültige Begrenzungsangabe für eine Listenpartition" -#: parser/parse_utilcmd.c:4107 +#: parser/parse_utilcmd.c:4104 #, c-format msgid "invalid bound specification for a range partition" msgstr "ungültige Begrenzungsangabe für eine Bereichspartition" -#: parser/parse_utilcmd.c:4113 +#: parser/parse_utilcmd.c:4110 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROM muss genau einen Wert pro Partitionierungsspalte angeben" -#: parser/parse_utilcmd.c:4117 +#: parser/parse_utilcmd.c:4114 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TO muss genau einen Wert pro Partitionierungsspalte angeben" -#: parser/parse_utilcmd.c:4231 +#: parser/parse_utilcmd.c:4228 #, c-format msgid "cannot specify NULL in range bound" msgstr "NULL kann nicht in der Bereichsgrenze angegeben werden" -#: parser/parse_utilcmd.c:4280 +#: parser/parse_utilcmd.c:4277 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "jede Begrenzung, die auf MAXVALUE folgt, muss auch MAXVALUE sein" -#: parser/parse_utilcmd.c:4287 +#: parser/parse_utilcmd.c:4284 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "jede Begrenzung, die auf MINVALUE folgt, muss auch MINVALUE sein" -#: parser/parse_utilcmd.c:4330 +#: parser/parse_utilcmd.c:4327 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "angegebener Wert kann nicht in Typ %s für Spalte »%s« umgewandelt werden" @@ -18935,12 +19479,12 @@ msgstr "auf UESCAPE muss eine einfache Zeichenkettenkonstante folgen" msgid "invalid Unicode escape character" msgstr "ungültiges Unicode-Escape-Zeichen" -#: parser/parser.c:347 scan.l:1390 +#: parser/parser.c:347 scan.l:1393 #, c-format msgid "invalid Unicode escape value" msgstr "ungültiger Unicode-Escape-Wert" -#: parser/parser.c:494 scan.l:701 utils/adt/varlena.c:6505 +#: parser/parser.c:494 scan.l:716 utils/adt/varlena.c:6640 #, c-format msgid "invalid Unicode escape" msgstr "ungültiges Unicode-Escape" @@ -18950,8 +19494,8 @@ msgstr "ungültiges Unicode-Escape" msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Unicode-Escapes müssen \\XXXX oder \\+XXXXXX sein." -#: parser/parser.c:523 scan.l:662 scan.l:678 scan.l:694 -#: utils/adt/varlena.c:6530 +#: parser/parser.c:523 scan.l:677 scan.l:693 scan.l:709 +#: utils/adt/varlena.c:6665 #, c-format msgid "invalid Unicode surrogate pair" msgstr "ungültiges Unicode-Surrogatpaar" @@ -18961,89 +19505,89 @@ msgstr "ungültiges Unicode-Surrogatpaar" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "Bezeichner »%s« wird auf »%.*s« gekürzt" -#: partitioning/partbounds.c:2921 +#: partitioning/partbounds.c:2920 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "Partition »%s« kollidiert mit bestehender Standardpartition »%s«" -#: partitioning/partbounds.c:2973 partitioning/partbounds.c:2992 -#: partitioning/partbounds.c:3014 +#: partitioning/partbounds.c:2972 partitioning/partbounds.c:2991 +#: partitioning/partbounds.c:3013 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "der Modulus jeder Hashpartition muss ein Faktor des nächstgrößeren Modulus sein" -#: partitioning/partbounds.c:2974 partitioning/partbounds.c:3015 +#: partitioning/partbounds.c:2973 partitioning/partbounds.c:3014 #, c-format msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." msgstr "Der neue Modulus %d ist kein Faktor von %d, dem Modulus der bestehenden Partition »%s«." -#: partitioning/partbounds.c:2993 +#: partitioning/partbounds.c:2992 #, c-format msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." msgstr "Der neue Modulus %d ist nicht durch %d, den Modulus der bestehenden Parition »%s«, teilbar." -#: partitioning/partbounds.c:3128 +#: partitioning/partbounds.c:3127 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "leere Bereichsgrenze angegeben für Partition »%s«" -#: partitioning/partbounds.c:3130 +#: partitioning/partbounds.c:3129 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "Angegebene Untergrenze %s ist größer als oder gleich der Obergrenze %s." -#: partitioning/partbounds.c:3238 +#: partitioning/partbounds.c:3237 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "Partition »%s« würde sich mit Partition »%s« überlappen" -#: partitioning/partbounds.c:3355 +#: partitioning/partbounds.c:3354 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "Scannen von Fremdtabelle »%s«, die eine Partition der Standardpartition »%s« ist, wurde übersprungen" -#: partitioning/partbounds.c:4807 +#: partitioning/partbounds.c:4806 #, c-format msgid "remainder for hash partition must be an integer value greater than or equal to zero" msgstr "Rest für Hashpartition muss eine ganze Zahl größer als oder gleich null sein" -#: partitioning/partbounds.c:4831 +#: partitioning/partbounds.c:4830 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "»%s« ist keine Hash-partitionierte Tabelle" -#: partitioning/partbounds.c:4842 partitioning/partbounds.c:4959 +#: partitioning/partbounds.c:4841 partitioning/partbounds.c:4958 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "Anzahl der Partitionierungsspalten (%d) stimmt nicht mit der Anzahl der angegebenen Partitionierungsschlüssel (%d) überein" -#: partitioning/partbounds.c:4864 +#: partitioning/partbounds.c:4863 #, c-format msgid "column %d of the partition key has type %s, but supplied value is of type %s" msgstr "Spalte %d des Partitionierungsschlüssels hat Typ %s, aber der angegebene Wert hat Typ %s" -#: partitioning/partbounds.c:4896 +#: partitioning/partbounds.c:4895 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "Spalte %d des Partitionierungsschlüssels hat Typ »%s«, aber der angegebene Wert hat Typ »%s«" -#: port/pg_sema.c:209 port/pg_shmem.c:708 port/posix_sema.c:209 -#: port/sysv_sema.c:323 port/sysv_shmem.c:708 +#: port/pg_sema.c:209 port/pg_shmem.c:717 port/posix_sema.c:209 +#: port/sysv_sema.c:329 port/sysv_shmem.c:717 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "konnte »stat« für Datenverzeichnis »%s« nicht ausführen: %m" -#: port/pg_shmem.c:223 port/sysv_shmem.c:223 +#: port/pg_shmem.c:224 port/sysv_shmem.c:224 #, c-format msgid "could not create shared memory segment: %m" msgstr "konnte Shared-Memory-Segment nicht erzeugen: %m" -#: port/pg_shmem.c:224 port/sysv_shmem.c:224 +#: port/pg_shmem.c:225 port/sysv_shmem.c:225 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "Fehlgeschlagener Systemaufruf war shmget(Key=%lu, Größe=%zu, 0%o)." -#: port/pg_shmem.c:228 port/sysv_shmem.c:228 +#: port/pg_shmem.c:229 port/sysv_shmem.c:229 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" @@ -19052,7 +19596,7 @@ msgstr "" "Dieser Fehler bedeutet gewöhnlich, dass das von PostgreSQL angeforderte Shared-Memory-Segment den Kernel-Parameter SHMMAX überschreitet, oder eventuell, dass es kleiner als der Kernel-Parameter SHMMIN ist.\n" "Die PostgreSQL-Dokumentation enthält weitere Informationen über die Konfiguration von Shared Memory." -#: port/pg_shmem.c:235 port/sysv_shmem.c:235 +#: port/pg_shmem.c:236 port/sysv_shmem.c:236 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" @@ -19061,7 +19605,7 @@ msgstr "" "Dieser Fehler bedeutet gewöhnlich, dass das von PostgreSQL angeforderte Shared-Memory-Segment den Kernel-Parameter SHMALL überschreitet. Sie müssen eventuell den Kernel mit einem größeren SHMALL neu konfigurieren.\n" "Die PostgreSQL-Dokumentation enthält weitere Informationen über die Konfiguration von Shared Memory." -#: port/pg_shmem.c:241 port/sysv_shmem.c:241 +#: port/pg_shmem.c:242 port/sysv_shmem.c:242 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" @@ -19070,63 +19614,61 @@ msgstr "" "Dieser Fehler bedeutet *nicht*, dass kein Platz mehr auf der Festplatte ist. Er tritt auf, wenn entweder alle verfügbaren Shared-Memory-IDs aufgebraucht sind, dann müssen den Kernelparameter SHMMNI erhöhen, oder weil die Systemhöchstgrenze für Shared Memory insgesamt erreicht wurde.\n" "Die PostgreSQL-Dokumentation enthält weitere Informationen über die Konfiguration von Shared Memory." -#: port/pg_shmem.c:583 port/sysv_shmem.c:583 port/win32_shmem.c:641 +#: port/pg_shmem.c:584 port/sysv_shmem.c:584 port/win32_shmem.c:646 #, c-format -msgid "huge_page_size must be 0 on this platform." -msgstr "huge_page_size muss auf dieser Plattform 0 sein." +msgid "\"huge_page_size\" must be 0 on this platform." +msgstr "»huge_page_size« muss auf dieser Plattform 0 sein." -#: port/pg_shmem.c:646 port/sysv_shmem.c:646 +#: port/pg_shmem.c:655 port/sysv_shmem.c:655 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "konnte anonymes Shared Memory nicht mappen: %m" -#: port/pg_shmem.c:648 port/sysv_shmem.c:648 +#: port/pg_shmem.c:657 port/sysv_shmem.c:657 #, c-format -msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." -msgstr "" -"Dieser Fehler bedeutet gewöhnlich, dass das von PostgreSQL angeforderte Shared-Memory-Segment den verfügbaren Speicher, Swap-Space oder Huge Pages überschreitet. Um die benötigte Shared-Memory-Größe zu reduzieren (aktuell %zu Bytes), reduzieren Sie den Shared-Memory-Verbrauch von PostgreSQL, beispielsweise indem Sie »shared_buffers« oder »max_connections« reduzieren.\n" -"Die PostgreSQL-Dokumentation enthält weitere Informationen über die Konfiguration von Shared Memory." +msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing \"shared_buffers\" or \"max_connections\"." +msgstr "Dieser Fehler bedeutet gewöhnlich, dass das von PostgreSQL angeforderte Shared-Memory-Segment den verfügbaren Speicher, Swap-Space oder Huge Pages überschreitet. Um die benötigte Shared-Memory-Größe zu reduzieren (aktuell %zu Bytes), reduzieren Sie den Shared-Memory-Verbrauch von PostgreSQL, beispielsweise indem Sie »shared_buffers« oder »max_connections« reduzieren." -#: port/pg_shmem.c:716 port/sysv_shmem.c:716 +#: port/pg_shmem.c:725 port/sysv_shmem.c:725 #, c-format msgid "huge pages not supported on this platform" msgstr "Huge Pages werden auf dieser Plattform nicht unterstützt" -#: port/pg_shmem.c:723 port/sysv_shmem.c:723 +#: port/pg_shmem.c:732 port/sysv_shmem.c:732 #, c-format -msgid "huge pages not supported with the current shared_memory_type setting" -msgstr "Huge Pages werden mit der aktuellen shared_memory_type-Einstellung nicht unterstützt" +msgid "huge pages not supported with the current \"shared_memory_type\" setting" +msgstr "Huge Pages werden mit der aktuellen »shared_memory_type«-Einstellung nicht unterstützt" -#: port/pg_shmem.c:783 port/sysv_shmem.c:783 utils/init/miscinit.c:1351 +#: port/pg_shmem.c:798 port/sysv_shmem.c:798 utils/init/miscinit.c:1401 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "bereits bestehender Shared-Memory-Block (Schlüssel %lu, ID %lu) wird noch benutzt" -#: port/pg_shmem.c:786 port/sysv_shmem.c:786 utils/init/miscinit.c:1353 +#: port/pg_shmem.c:801 port/sysv_shmem.c:801 utils/init/miscinit.c:1403 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "Beenden Sie alle alten Serverprozesse, die zum Datenverzeichnis »%s« gehören." -#: port/sysv_sema.c:120 +#: port/sysv_sema.c:126 #, c-format msgid "could not create semaphores: %m" msgstr "konnte Semaphore nicht erzeugen: %m" -#: port/sysv_sema.c:121 +#: port/sysv_sema.c:127 #, c-format msgid "Failed system call was semget(%lu, %d, 0%o)." msgstr "Fehlgeschlagener Systemaufruf war semget(%lu, %d, 0%o)." -#: port/sysv_sema.c:125 +#: port/sysv_sema.c:131 #, c-format msgid "" -"This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its max_connections parameter.\n" +"This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its \"max_connections\" parameter.\n" "The PostgreSQL documentation contains more information about configuring your system for PostgreSQL." msgstr "" "Dieser Fehler bedeutet *nicht*, dass kein Platz mehr auf der Festplatte ist. Er tritt auf, wenn entweder die Systemhöchstgrenze für die Anzahl Semaphor-Sets (SEMMNI) oder die Systemhöchstgrenze für die Anzahl Semaphore (SEMMNS) überschritten würde. Sie müssen den entsprechenden Kernelparameter erhöhen. Alternativ können Sie den Semaphorverbrauch von PostgreSQL reduzieren indem Sie den Parameter »max_connections« herabsetzen.\n" "Die PostgreSQL-Dokumentation enthält weitere Informationen, wie Sie Ihr System für PostgreSQL konfigurieren können." -#: port/sysv_sema.c:155 +#: port/sysv_sema.c:161 #, c-format msgid "You possibly need to raise your kernel's SEMVMX value to be at least %d. Look into the PostgreSQL documentation for details." msgstr "Sie müssen möglicherweise den Kernelparameter SEMVMX auf mindestens %d erhöhen. Weitere Informationen finden Sie in der PostgreSQL-Dokumentation." @@ -19251,977 +19793,877 @@ msgstr "Fehlgeschlagener Systemaufruf war DuplicateHandle." msgid "Failed system call was MapViewOfFileEx." msgstr "Fehlgeschlagener Systemaufruf war MapViewOfFileEx." -#: postmaster/autovacuum.c:417 -#, c-format -msgid "could not fork autovacuum launcher process: %m" -msgstr "konnte Autovacuum-Launcher-Prozess nicht starten (fork-Fehler): %m" - -#: postmaster/autovacuum.c:764 +#: postmaster/autovacuum.c:686 #, c-format msgid "autovacuum worker took too long to start; canceled" msgstr "Autovacuum-Worker benötigte zu lange zum Starten; abgebrochen" -#: postmaster/autovacuum.c:1489 -#, c-format -msgid "could not fork autovacuum worker process: %m" -msgstr "konnte Autovacuum-Worker-Prozess nicht starten (fork-Fehler): %m" - -#: postmaster/autovacuum.c:2322 +#: postmaster/autovacuum.c:2203 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "Autovacuum: lösche verwaiste temporäre Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2558 +#: postmaster/autovacuum.c:2439 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "automatisches Vacuum der Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2561 +#: postmaster/autovacuum.c:2442 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "automatisches Analysieren der Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2755 +#: postmaster/autovacuum.c:2636 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "verarbeite Arbeitseintrag für Relation »%s.%s.%s«" -#: postmaster/autovacuum.c:3369 +#: postmaster/autovacuum.c:3254 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "Autovacuum wegen Fehlkonfiguration nicht gestartet" -#: postmaster/autovacuum.c:3370 +#: postmaster/autovacuum.c:3255 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Schalten Sie die Option »track_counts« ein." -#: postmaster/bgworker.c:259 +#: postmaster/bgworker.c:260 #, c-format msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" msgstr "inkonsistenter Background-Worker-Zustand (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:669 +#: postmaster/bgworker.c:651 #, c-format msgid "background worker \"%s\": background workers without shared memory access are not supported" msgstr "Background-Worker »%s«: Background-Worker ohne Shared-Memory-Zugriff werden nicht unterstützt" -#: postmaster/bgworker.c:680 +#: postmaster/bgworker.c:662 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "Background-Worker »%s«: kann kein Datenbankzugriff anfordern, wenn er nach Postmaster-Start gestartet hat" -#: postmaster/bgworker.c:694 +#: postmaster/bgworker.c:676 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "Background-Worker »%s«: ungültiges Neustart-Intervall" -#: postmaster/bgworker.c:709 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "Background-Worker »%s«: parallele Arbeitsprozesse dürfen nicht für Neustart konfiguriert sein" -#: postmaster/bgworker.c:733 tcop/postgres.c:3255 +#: postmaster/bgworker.c:715 tcop/postgres.c:3312 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "Background-Worker »%s« wird abgebrochen aufgrund von Anweisung des Administrators" -#: postmaster/bgworker.c:890 +#: postmaster/bgworker.c:888 #, c-format -msgid "background worker \"%s\": must be registered in shared_preload_libraries" -msgstr "Background-Worker »%s«: muss in shared_preload_libraries registriert sein" +msgid "background worker \"%s\": must be registered in \"shared_preload_libraries\"" +msgstr "Background-Worker »%s«: muss in »shared_preload_libraries« registriert sein" -#: postmaster/bgworker.c:902 +#: postmaster/bgworker.c:911 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "Background-Worker »%s«: nur dynamische Background-Worker können Benachrichtigung verlangen" -#: postmaster/bgworker.c:917 +#: postmaster/bgworker.c:926 #, c-format msgid "too many background workers" msgstr "zu viele Background-Worker" -#: postmaster/bgworker.c:918 +#: postmaster/bgworker.c:927 #, c-format msgid "Up to %d background worker can be registered with the current settings." msgid_plural "Up to %d background workers can be registered with the current settings." msgstr[0] "Mit den aktuellen Einstellungen können bis zu %d Background-Worker registriert werden." msgstr[1] "Mit den aktuellen Einstellungen können bis zu %d Background-Worker registriert werden." -#: postmaster/bgworker.c:922 +#: postmaster/bgworker.c:931 postmaster/checkpointer.c:445 #, c-format -msgid "Consider increasing the configuration parameter \"max_worker_processes\"." -msgstr "Erhöhen Sie eventuell den Konfigurationsparameter »max_worker_processes«." +msgid "Consider increasing the configuration parameter \"%s\"." +msgstr "Erhöhen Sie eventuell den Konfigurationsparameter »%s«." -#: postmaster/checkpointer.c:431 +#: postmaster/checkpointer.c:441 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" msgstr[0] "Checkpoints passieren zu oft (alle %d Sekunde)" msgstr[1] "Checkpoints passieren zu oft (alle %d Sekunden)" -#: postmaster/checkpointer.c:435 -#, c-format -msgid "Consider increasing the configuration parameter \"max_wal_size\"." -msgstr "Erhöhen Sie eventuell den Konfigurationsparameter »max_wal_size«." - -#: postmaster/checkpointer.c:1059 +#: postmaster/checkpointer.c:1067 #, c-format msgid "checkpoint request failed" msgstr "Checkpoint-Anforderung fehlgeschlagen" -#: postmaster/checkpointer.c:1060 +#: postmaster/checkpointer.c:1068 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Einzelheiten finden Sie in den letzten Meldungen im Serverlog." -#: postmaster/pgarch.c:416 +#: postmaster/launch_backend.c:381 +#, c-format +msgid "could not execute server process \"%s\": %m" +msgstr "konnte Serverprozess »%s« nicht ausführen: %m" + +#: postmaster/launch_backend.c:434 +#, c-format +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "konnte Backend-Parameter-Datei-Mapping nicht erzeugen: Fehlercode %lu" + +#: postmaster/launch_backend.c:442 +#, c-format +msgid "could not map backend parameter memory: error code %lu" +msgstr "konnte Backend-Parameter-Speicher nicht mappen: Fehlercode %lu" + +#: postmaster/launch_backend.c:459 +#, c-format +msgid "subprocess command line too long" +msgstr "Kommandozeile für Subprozess zu lang" + +#: postmaster/launch_backend.c:477 +#, c-format +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "Aufruf von CreateProcess() fehlgeschlagen: %m (Fehlercode %lu)" + +#: postmaster/launch_backend.c:504 +#, c-format +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "konnte Sicht der Backend-Parameter-Datei nicht unmappen: Fehlercode %lu" + +#: postmaster/launch_backend.c:508 +#, c-format +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "konnte Handle für Backend-Parameter-Datei nicht schließen: Fehlercode %lu" + +#: postmaster/launch_backend.c:530 +#, c-format +msgid "giving up after too many tries to reserve shared memory" +msgstr "Aufgabe nach zu vielen Versuchen, Shared Memory zu reservieren" + +#: postmaster/launch_backend.c:531 +#, c-format +msgid "This might be caused by ASLR or antivirus software." +msgstr "Dies kann durch ASLR oder Antivirus-Software verursacht werden." + +#: postmaster/launch_backend.c:834 +#, c-format +msgid "could not duplicate socket %d for use in backend: error code %d" +msgstr "konnte Socket %d nicht für Verwendung in Backend duplizieren: Fehlercode %d" + +#: postmaster/launch_backend.c:866 +#, c-format +msgid "could not create inherited socket: error code %d\n" +msgstr "konnte geerbtes Socket nicht erzeugen: Fehlercode %d\n" + +#: postmaster/launch_backend.c:895 +#, c-format +msgid "could not open backend variables file \"%s\": %m\n" +msgstr "konnte Servervariablendatei »%s« nicht öffnen: %m\n" + +#: postmaster/launch_backend.c:901 +#, c-format +msgid "could not read from backend variables file \"%s\": %m\n" +msgstr "konnte nicht aus Servervariablendatei »%s« lesen: %m\n" + +#: postmaster/launch_backend.c:912 +#, c-format +msgid "could not read startup data from backend variables file \"%s\": %m\n" +msgstr "konnte Startup-Daten nicht aus Servervariablendatei »%s« lesen: %m\n" + +#: postmaster/launch_backend.c:924 +#, c-format +msgid "could not remove file \"%s\": %m\n" +msgstr "konnte Datei »%s« nicht löschen: %m\n" + +#: postmaster/launch_backend.c:940 +#, c-format +msgid "could not map view of backend variables: error code %lu\n" +msgstr "konnte Sicht der Backend-Variablen nicht mappen: Fehlercode %lu\n" + +#: postmaster/launch_backend.c:959 +#, c-format +msgid "could not unmap view of backend variables: error code %lu\n" +msgstr "konnte Sicht der Backend-Variablen nicht unmappen: Fehlercode %lu\n" + +#: postmaster/launch_backend.c:966 +#, c-format +msgid "could not close handle to backend parameter variables: error code %lu\n" +msgstr "konnte Handle für Backend-Parametervariablen nicht schließen: Fehlercode %lu\n" + +#: postmaster/pgarch.c:428 #, c-format -msgid "archive_mode enabled, yet archiving is not configured" -msgstr "archive_mode ist an, aber Archivierung wurde nicht konfiguriert" +msgid "\"archive_mode\" enabled, yet archiving is not configured" +msgstr "»archive_mode« ist an, aber Archivierung wurde nicht konfiguriert" -#: postmaster/pgarch.c:438 +#: postmaster/pgarch.c:452 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "verwaiste Archivstatusdatei »%s« wurde entfernt" -#: postmaster/pgarch.c:448 +#: postmaster/pgarch.c:462 #, c-format msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" msgstr "Entfernen der verwaisten Archivstatusdatei »%s« schlug zu oft fehl, wird später erneut versucht" -#: postmaster/pgarch.c:484 +#: postmaster/pgarch.c:498 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "Archivieren der Write-Ahead-Log-Datei »%s« schlug zu oft fehl, wird später erneut versucht" -#: postmaster/pgarch.c:791 postmaster/pgarch.c:830 +#: postmaster/pgarch.c:879 postmaster/pgarch.c:918 #, c-format -msgid "both archive_command and archive_library set" -msgstr "sowohl archive_command als auch archive_library ist gesetzt" +msgid "both \"archive_command\" and \"archive_library\" set" +msgstr "sowohl »archive_command« als auch »archive_library« ist gesetzt" -#: postmaster/pgarch.c:792 postmaster/pgarch.c:831 +#: postmaster/pgarch.c:880 postmaster/pgarch.c:919 #, c-format -msgid "Only one of archive_command, archive_library may be set." -msgstr "" +msgid "Only one of \"archive_command\", \"archive_library\" may be set." +msgstr "Einstellungen »archive_command« und »archive_library« dürfen nicht beide gesetzt sein." -#: postmaster/pgarch.c:809 +#: postmaster/pgarch.c:897 #, c-format msgid "restarting archiver process because value of \"archive_library\" was changed" msgstr "Archivierprozess wird neu gestartet, weil der Wert von »archive_library« geändert wurde" -#: postmaster/pgarch.c:846 +#: postmaster/pgarch.c:934 #, c-format msgid "archive modules have to define the symbol %s" msgstr "Archivmodule müssen das Symbol %s definieren" -#: postmaster/pgarch.c:852 +#: postmaster/pgarch.c:940 #, c-format msgid "archive modules must register an archive callback" msgstr "Archivmodule müssen einen Archiv-Callback registrieren" -#: postmaster/postmaster.c:759 +#: postmaster/postmaster.c:661 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: ungültiges Argument für Option -f: »%s«\n" -#: postmaster/postmaster.c:832 +#: postmaster/postmaster.c:734 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: ungültiges Argument für Option -t: »%s«\n" -#: postmaster/postmaster.c:855 +#: postmaster/postmaster.c:757 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: ungültiges Argument: »%s«\n" -#: postmaster/postmaster.c:923 +#: postmaster/postmaster.c:825 +#, c-format +msgid "%s: \"superuser_reserved_connections\" (%d) plus \"reserved_connections\" (%d) must be less than \"max_connections\" (%d)\n" +msgstr "%s: »superuser_reserved_connections« (%d) plus »reserved_connections« (%d) muss kleiner als »max_connections« (%d) sein\n" + +#: postmaster/postmaster.c:833 #, c-format -msgid "%s: superuser_reserved_connections (%d) plus reserved_connections (%d) must be less than max_connections (%d)\n" -msgstr "%s: superuser_reserved_connections (%d) plus reserved_connections (%d) muss kleiner als max_connections (%d) sein\n" +msgid "WAL archival cannot be enabled when \"wal_level\" is \"minimal\"" +msgstr "WAL-Archivierung kann nicht eingeschaltet werden, wenn »wal_level« »minimal« ist" -#: postmaster/postmaster.c:931 +#: postmaster/postmaster.c:836 #, c-format -msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" -msgstr "WAL-Archivierung kann nicht eingeschaltet werden, wenn wal_level »minimal« ist" +msgid "WAL streaming (\"max_wal_senders\" > 0) requires \"wal_level\" to be \"replica\" or \"logical\"" +msgstr "WAL-Streaming (»max_wal_senders« > 0) benötigt »wal_level« »replica« oder »logical«" -#: postmaster/postmaster.c:934 +#: postmaster/postmaster.c:839 #, c-format -msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" -msgstr "WAL-Streaming (max_wal_senders > 0) benötigt wal_level »replica« oder »logical«" +msgid "WAL cannot be summarized when \"wal_level\" is \"minimal\"" +msgstr "WAL kann nicht zusammengefasst werden, wenn »wal_level« »minimal« ist" -#: postmaster/postmaster.c:942 +#: postmaster/postmaster.c:847 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: ungültige datetoken-Tabellen, bitte reparieren\n" -#: postmaster/postmaster.c:1099 +#: postmaster/postmaster.c:1004 #, c-format msgid "could not create I/O completion port for child queue" msgstr "konnte Ein-/Ausgabe-Completion-Port für Child-Queue nicht erzeugen" -#: postmaster/postmaster.c:1164 +#: postmaster/postmaster.c:1069 #, c-format msgid "ending log output to stderr" msgstr "Logausgabe nach stderr endet" -#: postmaster/postmaster.c:1165 +#: postmaster/postmaster.c:1070 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "Die weitere Logausgabe geht an Logziel »%s«." -#: postmaster/postmaster.c:1176 +#: postmaster/postmaster.c:1081 #, c-format msgid "starting %s" msgstr "%s startet" -#: postmaster/postmaster.c:1236 +#: postmaster/postmaster.c:1143 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "konnte Listen-Socket für »%s« nicht erzeugen" -#: postmaster/postmaster.c:1242 +#: postmaster/postmaster.c:1149 #, c-format msgid "could not create any TCP/IP sockets" msgstr "konnte keine TCP/IP-Sockets erstellen" -#: postmaster/postmaster.c:1274 +#: postmaster/postmaster.c:1181 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "DNSServiceRegister() fehlgeschlagen: Fehlercode %ld" -#: postmaster/postmaster.c:1325 +#: postmaster/postmaster.c:1234 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "konnte Unix-Domain-Socket in Verzeichnis »%s« nicht erzeugen" -#: postmaster/postmaster.c:1331 +#: postmaster/postmaster.c:1240 #, c-format msgid "could not create any Unix-domain sockets" msgstr "konnte keine Unix-Domain-Sockets erzeugen" -#: postmaster/postmaster.c:1342 +#: postmaster/postmaster.c:1251 #, c-format msgid "no socket created for listening" msgstr "keine Listen-Socket erzeugt" -#: postmaster/postmaster.c:1373 +#: postmaster/postmaster.c:1282 #, c-format -msgid "%s: could not change permissions of external PID file \"%s\": %s\n" -msgstr "%s: konnte Rechte der externen PID-Datei »%s« nicht ändern: %s\n" +msgid "%s: could not change permissions of external PID file \"%s\": %m\n" +msgstr "%s: konnte Rechte der externen PID-Datei »%s« nicht ändern: %m\n" -#: postmaster/postmaster.c:1377 +#: postmaster/postmaster.c:1286 #, c-format -msgid "%s: could not write external PID file \"%s\": %s\n" -msgstr "%s: konnte externe PID-Datei »%s« nicht schreiben: %s\n" +msgid "%s: could not write external PID file \"%s\": %m\n" +msgstr "%s: konnte externe PID-Datei »%s« nicht schreiben: %m\n" #. translator: %s is a configuration file -#: postmaster/postmaster.c:1405 utils/init/postinit.c:221 +#: postmaster/postmaster.c:1314 utils/init/postinit.c:221 #, c-format msgid "could not load %s" msgstr "konnte %s nicht laden" -#: postmaster/postmaster.c:1431 +#: postmaster/postmaster.c:1342 #, c-format msgid "postmaster became multithreaded during startup" msgstr "Postmaster ist während des Starts multithreaded geworden" -#: postmaster/postmaster.c:1432 +#: postmaster/postmaster.c:1343 postmaster/postmaster.c:3684 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Setzen Sie die Umgebungsvariable LC_ALL auf eine gültige Locale." -#: postmaster/postmaster.c:1533 +#: postmaster/postmaster.c:1442 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: konnte Pfad des eigenen Programs nicht finden" -#: postmaster/postmaster.c:1540 +#: postmaster/postmaster.c:1449 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: konnte kein passendes Programm »postgres« finden" -#: postmaster/postmaster.c:1563 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1472 utils/misc/tzparser.c:341 #, c-format msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." msgstr "Dies kann auf eine unvollständige PostgreSQL-Installation hindeuten, oder darauf, dass die Datei »%s« von ihrer richtigen Stelle verschoben worden ist." -#: postmaster/postmaster.c:1590 +#: postmaster/postmaster.c:1499 #, c-format msgid "" "%s: could not find the database system\n" "Expected to find it in the directory \"%s\",\n" -"but could not open file \"%s\": %s\n" +"but could not open file \"%s\": %m\n" msgstr "" "%s: konnte das Datenbanksystem nicht finden\n" "Es wurde im Verzeichnis »%s« erwartet,\n" -"aber die Datei »%s« konnte nicht geöffnet werden: %s\n" +"aber die Datei »%s« konnte nicht geöffnet werden: %m\n" #. translator: %s is SIGKILL or SIGABRT -#: postmaster/postmaster.c:1887 +#: postmaster/postmaster.c:1789 #, c-format msgid "issuing %s to recalcitrant children" msgstr "%s wird an ungehorsame Kinder gesendet" -#: postmaster/postmaster.c:1909 +#: postmaster/postmaster.c:1811 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "führe sofortiges Herunterfahren durch, weil Sperrdatei im Datenverzeichnis ungültig ist" -#: postmaster/postmaster.c:1984 postmaster/postmaster.c:2012 -#, c-format -msgid "incomplete startup packet" -msgstr "unvollständiges Startpaket" - -#: postmaster/postmaster.c:1996 postmaster/postmaster.c:2029 -#, c-format -msgid "invalid length of startup packet" -msgstr "ungültige Länge des Startpakets" - -#: postmaster/postmaster.c:2058 -#, c-format -msgid "failed to send SSL negotiation response: %m" -msgstr "konnte SSL-Verhandlungsantwort nicht senden: %m" - -#: postmaster/postmaster.c:2076 -#, c-format -msgid "received unencrypted data after SSL request" -msgstr "unverschlüsselte Daten nach SSL-Anforderung empfangen" - -#: postmaster/postmaster.c:2077 postmaster/postmaster.c:2121 -#, c-format -msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." -msgstr "Das könnte entweder ein Fehler in der Client-Software oder ein Hinweis auf einen versuchten Man-in-the-Middle-Angriff sein." - -#: postmaster/postmaster.c:2102 -#, c-format -msgid "failed to send GSSAPI negotiation response: %m" -msgstr "konnte GSSAPI-Verhandlungsantwort nicht senden: %m" - -#: postmaster/postmaster.c:2120 -#, c-format -msgid "received unencrypted data after GSSAPI encryption request" -msgstr "unverschlüsselte Daten nach GSSAPI-Verschlüsselungsanforderung empfangen" - -#: postmaster/postmaster.c:2144 -#, c-format -msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" -msgstr "nicht unterstütztes Frontend-Protokoll %u.%u: Server unterstützt %u.0 bis %u.%u" - -#: postmaster/postmaster.c:2211 -#, c-format -msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." -msgstr "Gültige Werte sind: »false«, 0, »true«, 1, »database«." - -#: postmaster/postmaster.c:2252 -#, c-format -msgid "invalid startup packet layout: expected terminator as last byte" -msgstr "ungültiges Layout des Startpakets: Abschluss als letztes Byte erwartet" - -#: postmaster/postmaster.c:2269 -#, c-format -msgid "no PostgreSQL user name specified in startup packet" -msgstr "kein PostgreSQL-Benutzername im Startpaket angegeben" - -#: postmaster/postmaster.c:2333 -#, c-format -msgid "the database system is starting up" -msgstr "das Datenbanksystem startet" - -#: postmaster/postmaster.c:2339 -#, c-format -msgid "the database system is not yet accepting connections" -msgstr "das Datenbanksystem nimmt noch keine Verbindungen an" - -#: postmaster/postmaster.c:2340 -#, c-format -msgid "Consistent recovery state has not been yet reached." -msgstr "Konsistenter Wiederherstellungszustand wurde noch nicht erreicht." - -#: postmaster/postmaster.c:2344 -#, c-format -msgid "the database system is not accepting connections" -msgstr "das Datenbanksystem nimmt keine Verbindungen an" - -#: postmaster/postmaster.c:2345 -#, c-format -msgid "Hot standby mode is disabled." -msgstr "Hot-Standby-Modus ist deaktiviert." - -#: postmaster/postmaster.c:2350 -#, c-format -msgid "the database system is shutting down" -msgstr "das Datenbanksystem fährt herunter" - -#: postmaster/postmaster.c:2355 -#, c-format -msgid "the database system is in recovery mode" -msgstr "das Datenbanksystem ist im Wiederherstellungsmodus" - -#: postmaster/postmaster.c:2360 storage/ipc/procarray.c:491 -#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:353 -#, c-format -msgid "sorry, too many clients already" -msgstr "tut mir leid, schon zu viele Verbindungen" - -#: postmaster/postmaster.c:2447 +#: postmaster/postmaster.c:1874 #, c-format msgid "wrong key in cancel request for process %d" msgstr "falscher Schlüssel in Stornierungsanfrage für Prozess %d" -#: postmaster/postmaster.c:2459 +#: postmaster/postmaster.c:1886 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "PID %d in Stornierungsanfrage stimmte mit keinem Prozess überein" -#: postmaster/postmaster.c:2726 +#: postmaster/postmaster.c:2106 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "SIGHUP empfangen, Konfigurationsdateien werden neu geladen" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2750 postmaster/postmaster.c:2754 +#: postmaster/postmaster.c:2134 postmaster/postmaster.c:2138 #, c-format msgid "%s was not reloaded" msgstr "%s wurde nicht neu geladen" -#: postmaster/postmaster.c:2764 +#: postmaster/postmaster.c:2148 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL-Konfiguration wurde nicht neu geladen" -#: postmaster/postmaster.c:2854 +#: postmaster/postmaster.c:2234 #, c-format msgid "received smart shutdown request" msgstr "intelligentes Herunterfahren verlangt" -#: postmaster/postmaster.c:2895 +#: postmaster/postmaster.c:2275 #, c-format msgid "received fast shutdown request" msgstr "schnelles Herunterfahren verlangt" -#: postmaster/postmaster.c:2913 +#: postmaster/postmaster.c:2293 #, c-format msgid "aborting any active transactions" msgstr "etwaige aktive Transaktionen werden abgebrochen" -#: postmaster/postmaster.c:2937 +#: postmaster/postmaster.c:2317 #, c-format msgid "received immediate shutdown request" msgstr "sofortiges Herunterfahren verlangt" -#: postmaster/postmaster.c:3013 +#: postmaster/postmaster.c:2389 #, c-format msgid "shutdown at recovery target" msgstr "Herunterfahren beim Wiederherstellungsziel" -#: postmaster/postmaster.c:3031 postmaster/postmaster.c:3067 +#: postmaster/postmaster.c:2407 postmaster/postmaster.c:2443 msgid "startup process" msgstr "Startprozess" -#: postmaster/postmaster.c:3034 +#: postmaster/postmaster.c:2410 #, c-format msgid "aborting startup due to startup process failure" msgstr "Serverstart abgebrochen wegen Startprozessfehler" -#: postmaster/postmaster.c:3107 +#: postmaster/postmaster.c:2485 #, c-format msgid "database system is ready to accept connections" msgstr "Datenbanksystem ist bereit, um Verbindungen anzunehmen" -#: postmaster/postmaster.c:3128 +#: postmaster/postmaster.c:2506 msgid "background writer process" msgstr "Background-Writer-Prozess" -#: postmaster/postmaster.c:3175 +#: postmaster/postmaster.c:2553 msgid "checkpointer process" msgstr "Checkpointer-Prozess" -#: postmaster/postmaster.c:3191 +#: postmaster/postmaster.c:2569 msgid "WAL writer process" msgstr "WAL-Schreibprozess" -#: postmaster/postmaster.c:3206 +#: postmaster/postmaster.c:2584 msgid "WAL receiver process" msgstr "WAL-Receiver-Prozess" -#: postmaster/postmaster.c:3221 +#: postmaster/postmaster.c:2598 +msgid "WAL summarizer process" +msgstr "WAL-Summarizer-Prozess" + +#: postmaster/postmaster.c:2613 msgid "autovacuum launcher process" msgstr "Autovacuum-Launcher-Prozess" -#: postmaster/postmaster.c:3239 +#: postmaster/postmaster.c:2631 msgid "archiver process" msgstr "Archivierprozess" -#: postmaster/postmaster.c:3252 +#: postmaster/postmaster.c:2644 msgid "system logger process" msgstr "Systemlogger-Prozess" -#: postmaster/postmaster.c:3309 +#: postmaster/postmaster.c:2661 +msgid "slot sync worker process" +msgstr "Slot-Sync-Arbeitsprozess" + +#: postmaster/postmaster.c:2717 #, c-format msgid "background worker \"%s\"" msgstr "Background-Worker »%s«" -#: postmaster/postmaster.c:3388 postmaster/postmaster.c:3408 -#: postmaster/postmaster.c:3415 postmaster/postmaster.c:3433 +#: postmaster/postmaster.c:2796 postmaster/postmaster.c:2816 +#: postmaster/postmaster.c:2823 postmaster/postmaster.c:2841 msgid "server process" msgstr "Serverprozess" -#: postmaster/postmaster.c:3487 +#: postmaster/postmaster.c:2895 #, c-format msgid "terminating any other active server processes" msgstr "aktive Serverprozesse werden abgebrochen" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3662 +#: postmaster/postmaster.c:3082 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) beendete mit Status %d" -#: postmaster/postmaster.c:3664 postmaster/postmaster.c:3676 -#: postmaster/postmaster.c:3686 postmaster/postmaster.c:3697 +#: postmaster/postmaster.c:3084 postmaster/postmaster.c:3096 +#: postmaster/postmaster.c:3106 postmaster/postmaster.c:3117 #, c-format msgid "Failed process was running: %s" msgstr "Der fehlgeschlagene Prozess führte aus: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3673 +#: postmaster/postmaster.c:3093 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) wurde durch Ausnahme 0x%X beendet" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3683 +#: postmaster/postmaster.c:3103 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) wurde von Signal %d beendet: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3695 +#: postmaster/postmaster.c:3115 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) beendete mit unbekanntem Status %d" -#: postmaster/postmaster.c:3903 +#: postmaster/postmaster.c:3331 #, c-format msgid "abnormal database system shutdown" msgstr "abnormales Herunterfahren des Datenbanksystems" -#: postmaster/postmaster.c:3929 +#: postmaster/postmaster.c:3357 #, c-format msgid "shutting down due to startup process failure" msgstr "fahre herunter wegen Startprozessfehler" -#: postmaster/postmaster.c:3935 +#: postmaster/postmaster.c:3363 #, c-format -msgid "shutting down because restart_after_crash is off" -msgstr "fahre herunter, weil restart_after_crash aus ist" +msgid "shutting down because \"restart_after_crash\" is off" +msgstr "fahre herunter, weil »restart_after_crash« aus ist" -#: postmaster/postmaster.c:3947 +#: postmaster/postmaster.c:3375 #, c-format msgid "all server processes terminated; reinitializing" msgstr "alle Serverprozesse beendet; initialisiere neu" -#: postmaster/postmaster.c:4141 postmaster/postmaster.c:5459 -#: postmaster/postmaster.c:5857 +#: postmaster/postmaster.c:3574 postmaster/postmaster.c:3985 +#: postmaster/postmaster.c:4374 #, c-format msgid "could not generate random cancel key" msgstr "konnte zufälligen Stornierungsschlüssel nicht erzeugen" -#: postmaster/postmaster.c:4203 +#: postmaster/postmaster.c:3607 #, c-format msgid "could not fork new process for connection: %m" msgstr "konnte neuen Prozess für Verbindung nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:4245 +#: postmaster/postmaster.c:3649 msgid "could not fork new process for connection: " msgstr "konnte neuen Prozess für Verbindung nicht starten (fork-Fehler): " -#: postmaster/postmaster.c:4351 +#: postmaster/postmaster.c:3683 #, c-format -msgid "connection received: host=%s port=%s" -msgstr "Verbindung empfangen: Host=%s Port=%s" +msgid "postmaster became multithreaded" +msgstr "Postmaster ist multithreaded geworden" -#: postmaster/postmaster.c:4356 +#: postmaster/postmaster.c:3752 #, c-format -msgid "connection received: host=%s" -msgstr "Verbindung empfangen: Host=%s" +msgid "database system is ready to accept read-only connections" +msgstr "Datenbanksystem ist bereit, um lesende Verbindungen anzunehmen" -#: postmaster/postmaster.c:4593 +#: postmaster/postmaster.c:3935 #, c-format -msgid "could not execute server process \"%s\": %m" -msgstr "konnte Serverprozess »%s« nicht ausführen: %m" +msgid "could not fork \"%s\" process: %m" +msgstr "konnte »%s«-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:4651 -#, c-format -msgid "could not create backend parameter file mapping: error code %lu" -msgstr "konnte Backend-Parameter-Datei-Mapping nicht erzeugen: Fehlercode %lu" - -#: postmaster/postmaster.c:4660 -#, c-format -msgid "could not map backend parameter memory: error code %lu" -msgstr "konnte Backend-Parameter-Speicher nicht mappen: Fehlercode %lu" - -#: postmaster/postmaster.c:4687 -#, c-format -msgid "subprocess command line too long" -msgstr "Kommandozeile für Subprozess zu lang" - -#: postmaster/postmaster.c:4705 -#, c-format -msgid "CreateProcess() call failed: %m (error code %lu)" -msgstr "Aufruf von CreateProcess() fehlgeschlagen: %m (Fehlercode %lu)" - -#: postmaster/postmaster.c:4732 -#, c-format -msgid "could not unmap view of backend parameter file: error code %lu" -msgstr "konnte Sicht der Backend-Parameter-Datei nicht unmappen: Fehlercode %lu" - -#: postmaster/postmaster.c:4736 -#, c-format -msgid "could not close handle to backend parameter file: error code %lu" -msgstr "konnte Handle für Backend-Parameter-Datei nicht schließen: Fehlercode %lu" - -#: postmaster/postmaster.c:4758 -#, c-format -msgid "giving up after too many tries to reserve shared memory" -msgstr "Aufgabe nach zu vielen Versuchen, Shared Memory zu reservieren" - -#: postmaster/postmaster.c:4759 -#, c-format -msgid "This might be caused by ASLR or antivirus software." -msgstr "Dies kann durch ASLR oder Antivirus-Software verursacht werden." - -#: postmaster/postmaster.c:4932 -#, c-format -msgid "SSL configuration could not be loaded in child process" -msgstr "SSL-Konfiguration konnte im Kindprozess nicht geladen werden" - -#: postmaster/postmaster.c:5057 -#, c-format -msgid "Please report this to <%s>." -msgstr "Bitte berichten Sie dies an <%s>." - -#: postmaster/postmaster.c:5125 -#, c-format -msgid "database system is ready to accept read-only connections" -msgstr "Datenbanksystem ist bereit, um lesende Verbindungen anzunehmen" - -#: postmaster/postmaster.c:5383 -#, c-format -msgid "could not fork startup process: %m" -msgstr "konnte Startprozess nicht starten (fork-Fehler): %m" - -#: postmaster/postmaster.c:5387 -#, c-format -msgid "could not fork archiver process: %m" -msgstr "konnte Archivierer-Prozess nicht starten (fork-Fehler): %m" - -#: postmaster/postmaster.c:5391 -#, c-format -msgid "could not fork background writer process: %m" -msgstr "konnte Background-Writer-Prozess nicht starten (fork-Fehler): %m" - -#: postmaster/postmaster.c:5395 -#, c-format -msgid "could not fork checkpointer process: %m" -msgstr "konnte Checkpointer-Prozess nicht starten (fork-Fehler): %m" - -#: postmaster/postmaster.c:5399 -#, c-format -msgid "could not fork WAL writer process: %m" -msgstr "konnte WAL-Writer-Prozess nicht starten (fork-Fehler): %m" - -#: postmaster/postmaster.c:5403 -#, c-format -msgid "could not fork WAL receiver process: %m" -msgstr "konnte WAL-Receiver-Prozess nicht starten (fork-Fehler): %m" - -#: postmaster/postmaster.c:5407 -#, c-format -msgid "could not fork process: %m" -msgstr "konnte Prozess nicht starten (fork-Fehler): %m" - -#: postmaster/postmaster.c:5608 postmaster/postmaster.c:5635 +#: postmaster/postmaster.c:4173 postmaster/postmaster.c:4207 #, c-format msgid "database connection requirement not indicated during registration" msgstr "die Notwendigkeit, Datenbankverbindungen zu erzeugen, wurde bei der Registrierung nicht angezeigt" -#: postmaster/postmaster.c:5619 postmaster/postmaster.c:5646 +#: postmaster/postmaster.c:4183 postmaster/postmaster.c:4217 #, c-format msgid "invalid processing mode in background worker" msgstr "ungültiger Verarbeitungsmodus in Background-Worker" -#: postmaster/postmaster.c:5731 -#, c-format -msgid "could not fork worker process: %m" -msgstr "konnte Worker-Prozess nicht starten (fork-Fehler): %m" - -#: postmaster/postmaster.c:5843 -#, c-format -msgid "no slot available for new worker process" -msgstr "kein Slot für neuen Worker-Prozess verfügbar" - -#: postmaster/postmaster.c:6174 +#: postmaster/postmaster.c:4277 #, c-format -msgid "could not duplicate socket %d for use in backend: error code %d" -msgstr "konnte Socket %d nicht für Verwendung in Backend duplizieren: Fehlercode %d" - -#: postmaster/postmaster.c:6206 -#, c-format -msgid "could not create inherited socket: error code %d\n" -msgstr "konnte geerbtes Socket nicht erzeugen: Fehlercode %d\n" - -#: postmaster/postmaster.c:6235 -#, c-format -msgid "could not open backend variables file \"%s\": %s\n" -msgstr "konnte Servervariablendatei »%s« nicht öffnen: %s\n" +msgid "could not fork background worker process: %m" +msgstr "konnte Background-Worker-Prozess nicht starten (fork-Fehler): %m" -#: postmaster/postmaster.c:6242 +#: postmaster/postmaster.c:4360 #, c-format -msgid "could not read from backend variables file \"%s\": %s\n" -msgstr "konnte nicht aus Servervariablendatei »%s« lesen: %s\n" +msgid "no slot available for new background worker process" +msgstr "kein Slot für neuen Background-Worker-Prozess verfügbar" -#: postmaster/postmaster.c:6251 -#, c-format -msgid "could not remove file \"%s\": %s\n" -msgstr "konnte Datei »%s« nicht löschen: %s\n" - -#: postmaster/postmaster.c:6268 -#, c-format -msgid "could not map view of backend variables: error code %lu\n" -msgstr "konnte Sicht der Backend-Variablen nicht mappen: Fehlercode %lu\n" - -#: postmaster/postmaster.c:6277 -#, c-format -msgid "could not unmap view of backend variables: error code %lu\n" -msgstr "konnte Sicht der Backend-Variablen nicht unmappen: Fehlercode %lu\n" - -#: postmaster/postmaster.c:6284 -#, c-format -msgid "could not close handle to backend parameter variables: error code %lu\n" -msgstr "konnte Handle für Backend-Parametervariablen nicht schließen: Fehlercode %lu\n" - -#: postmaster/postmaster.c:6443 +#: postmaster/postmaster.c:4623 #, c-format msgid "could not read exit code for process\n" msgstr "konnte Exitcode des Prozesses nicht lesen\n" -#: postmaster/postmaster.c:6485 +#: postmaster/postmaster.c:4665 #, c-format msgid "could not post child completion status\n" msgstr "konnte Child-Completion-Status nicht versenden\n" -#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 +#: postmaster/syslogger.c:529 postmaster/syslogger.c:1173 #, c-format msgid "could not read from logger pipe: %m" msgstr "konnte nicht aus Logger-Pipe lesen: %m" -#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 +#: postmaster/syslogger.c:629 postmaster/syslogger.c:643 #, c-format msgid "could not create pipe for syslog: %m" msgstr "konnte Pipe für Syslog nicht erzeugen: %m" -#: postmaster/syslogger.c:677 +#: postmaster/syslogger.c:712 #, c-format msgid "could not fork system logger: %m" msgstr "konnte Systemlogger nicht starten (fork-Fehler): %m" -#: postmaster/syslogger.c:713 +#: postmaster/syslogger.c:731 #, c-format msgid "redirecting log output to logging collector process" msgstr "Logausgabe wird an Logsammelprozess umgeleitet" -#: postmaster/syslogger.c:714 +#: postmaster/syslogger.c:732 #, c-format msgid "Future log output will appear in directory \"%s\"." msgstr "Die weitere Logausgabe wird im Verzeichnis »%s« erscheinen." -#: postmaster/syslogger.c:722 +#: postmaster/syslogger.c:740 #, c-format msgid "could not redirect stdout: %m" msgstr "konnte Standardausgabe nicht umleiten: %m" -#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 +#: postmaster/syslogger.c:745 postmaster/syslogger.c:762 #, c-format msgid "could not redirect stderr: %m" msgstr "konnte Standardfehlerausgabe nicht umleiten: %m" -#: postmaster/syslogger.c:1177 +#: postmaster/syslogger.c:1128 #, c-format -msgid "could not write to log file: %s\n" -msgstr "konnte nicht in Logdatei schreiben: %s\n" +msgid "could not write to log file: %m\n" +msgstr "konnte nicht in Logdatei schreiben: %m\n" -#: postmaster/syslogger.c:1295 +#: postmaster/syslogger.c:1246 #, c-format msgid "could not open log file \"%s\": %m" msgstr "konnte Logdatei »%s« nicht öffnen: %m" -#: postmaster/syslogger.c:1385 +#: postmaster/syslogger.c:1336 #, c-format msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "automatische Rotation abgeschaltet (SIGHUP zum Wiederanschalten verwenden)" -#: regex/regc_pg_locale.c:242 +#: postmaster/walsummarizer.c:740 +#, c-format +msgid "WAL summarization is not progressing" +msgstr "WAL-Zusammenfassung kommt nicht voran" + +#: postmaster/walsummarizer.c:741 +#, c-format +msgid "Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/%X in memory." +msgstr "Zusammenfassung bis %X/%X wird benötigt, aber sie hängt fest bei %X/%X auf Festplatte und %X/%X im Speicher." + +#: postmaster/walsummarizer.c:755 +#, c-format +msgid "still waiting for WAL summarization through %X/%X after %ld second" +msgid_plural "still waiting for WAL summarization through %X/%X after %ld seconds" +msgstr[0] "warte immer noch auf WAL-Zusammenfassung bis %X/%X nach %ld Sekunde" +msgstr[1] "warte immer noch auf WAL-Zusammenfassung bis %X/%X nach %ld Sekunden" + +#: postmaster/walsummarizer.c:760 +#, c-format +msgid "Summarization has reached %X/%X on disk and %X/%X in memory." +msgstr "Zusammenfassung hat %X/%X auf Festplatte und %X/%X im Speicher erreicht." + +#: postmaster/walsummarizer.c:1000 +#, c-format +msgid "could not find a valid record after %X/%X" +msgstr "konnte keinen gültigen Datensatz nach %X/%X finden" + +#: postmaster/walsummarizer.c:1045 +#, c-format +msgid "could not read WAL from timeline %u at %X/%X: %s" +msgstr "konnte WAL aus Zeitleiste %u bei %X/%X nicht lesen: %s" + +#: postmaster/walsummarizer.c:1051 +#, c-format +msgid "could not read WAL from timeline %u at %X/%X" +msgstr "konnte WAL aus Zeitleiste %u bei %X/%X nicht lesen" + +#: regex/regc_pg_locale.c:244 #, c-format msgid "could not determine which collation to use for regular expression" msgstr "konnte die für den regulären Ausdruck zu verwendende Sortierfolge nicht bestimmen" -#: regex/regc_pg_locale.c:265 +#: regex/regc_pg_locale.c:262 #, c-format msgid "nondeterministic collations are not supported for regular expressions" msgstr "nichtdeterministische Sortierfolgen werden von regulären Ausdrücken nicht unterstützt" -#: repl_gram.y:301 repl_gram.y:333 +#: repl_gram.y:318 repl_gram.y:359 #, c-format msgid "invalid timeline %u" msgstr "ungültige Zeitleiste %u" -#: repl_scanner.l:152 +#: repl_scanner.l:154 msgid "invalid streaming start location" msgstr "ungültige Streaming-Startposition" -#: repl_scanner.l:209 scan.l:741 -msgid "unterminated quoted string" -msgstr "Zeichenkette in Anführungszeichen nicht abgeschlossen" - -#: replication/libpqwalreceiver/libpqwalreceiver.c:197 -#: replication/libpqwalreceiver/libpqwalreceiver.c:280 -#, fuzzy, c-format -#| msgid "Password required" +#: replication/libpqwalreceiver/libpqwalreceiver.c:267 +#: replication/libpqwalreceiver/libpqwalreceiver.c:358 +#, c-format msgid "password is required" -msgstr "Passwort nötig" +msgstr "Passwort wird benötigt" -#: replication/libpqwalreceiver/libpqwalreceiver.c:198 +#: replication/libpqwalreceiver/libpqwalreceiver.c:268 #, c-format msgid "Non-superuser cannot connect if the server does not request a password." -msgstr "" +msgstr "Nicht-Superuser kann nicht verbinden, wenn der Server kein Passwort anfordert." -#: replication/libpqwalreceiver/libpqwalreceiver.c:199 +#: replication/libpqwalreceiver/libpqwalreceiver.c:269 #, c-format -msgid "Target server's authentication method must be changed. or set password_required=false in the subscription attributes." -msgstr "" +msgid "Target server's authentication method must be changed, or set password_required=false in the subscription parameters." +msgstr "Die Authentifizierungsmethode des Zielservers muss geändern werden oder setzen Sie password_required=false in den Subskriptionsparametern." -#: replication/libpqwalreceiver/libpqwalreceiver.c:211 +#: replication/libpqwalreceiver/libpqwalreceiver.c:285 #, c-format msgid "could not clear search path: %s" msgstr "konnte Suchpfad nicht auf leer setzen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:257 +#: replication/libpqwalreceiver/libpqwalreceiver.c:331 +#: replication/libpqwalreceiver/libpqwalreceiver.c:517 #, c-format msgid "invalid connection string syntax: %s" msgstr "ungültige Syntax für Verbindungszeichenkette: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:281 +#: replication/libpqwalreceiver/libpqwalreceiver.c:359 #, c-format msgid "Non-superusers must provide a password in the connection string." -msgstr "" +msgstr "Nicht-Superuser müssen ein Passwort in den Verbindungsparametern angeben." -#: replication/libpqwalreceiver/libpqwalreceiver.c:307 +#: replication/libpqwalreceiver/libpqwalreceiver.c:386 #, c-format msgid "could not parse connection string: %s" msgstr "konnte Verbindungsparameter nicht interpretieren: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:380 +#: replication/libpqwalreceiver/libpqwalreceiver.c:459 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "konnte Datenbanksystemidentifikator und Zeitleisten-ID nicht vom Primärserver empfangen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:392 -#: replication/libpqwalreceiver/libpqwalreceiver.c:635 +#: replication/libpqwalreceiver/libpqwalreceiver.c:476 +#: replication/libpqwalreceiver/libpqwalreceiver.c:763 #, c-format msgid "invalid response from primary server" msgstr "ungültige Antwort vom Primärserver" -#: replication/libpqwalreceiver/libpqwalreceiver.c:393 +#: replication/libpqwalreceiver/libpqwalreceiver.c:477 #, c-format msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." msgstr "Konnte System nicht identifizieren: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet." -#: replication/libpqwalreceiver/libpqwalreceiver.c:478 -#: replication/libpqwalreceiver/libpqwalreceiver.c:485 -#: replication/libpqwalreceiver/libpqwalreceiver.c:515 +#: replication/libpqwalreceiver/libpqwalreceiver.c:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:613 +#: replication/libpqwalreceiver/libpqwalreceiver.c:643 #, c-format msgid "could not start WAL streaming: %s" msgstr "konnte WAL-Streaming nicht starten: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:539 +#: replication/libpqwalreceiver/libpqwalreceiver.c:667 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "konnte End-of-Streaming-Nachricht nicht an Primärserver senden: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:562 +#: replication/libpqwalreceiver/libpqwalreceiver.c:690 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "unerwartete Ergebnismenge nach End-of-Streaming" -#: replication/libpqwalreceiver/libpqwalreceiver.c:577 +#: replication/libpqwalreceiver/libpqwalreceiver.c:705 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "Fehler beim Beenden des COPY-Datenstroms: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:587 +#: replication/libpqwalreceiver/libpqwalreceiver.c:715 #, c-format msgid "error reading result of streaming command: %s" msgstr "Fehler beim Lesen des Ergebnisses von Streaming-Befehl: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:596 -#: replication/libpqwalreceiver/libpqwalreceiver.c:832 +#: replication/libpqwalreceiver/libpqwalreceiver.c:724 +#: replication/libpqwalreceiver/libpqwalreceiver.c:957 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "unerwartetes Ergebnis nach CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:623 +#: replication/libpqwalreceiver/libpqwalreceiver.c:751 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "konnte Zeitleisten-History-Datei nicht vom Primärserver empfangen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:636 +#: replication/libpqwalreceiver/libpqwalreceiver.c:764 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "1 Tupel mit 2 Feldern erwartet, %d Tupel mit %d Feldern erhalten." -#: replication/libpqwalreceiver/libpqwalreceiver.c:795 -#: replication/libpqwalreceiver/libpqwalreceiver.c:848 -#: replication/libpqwalreceiver/libpqwalreceiver.c:855 +#: replication/libpqwalreceiver/libpqwalreceiver.c:920 +#: replication/libpqwalreceiver/libpqwalreceiver.c:973 +#: replication/libpqwalreceiver/libpqwalreceiver.c:980 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "konnte keine Daten vom WAL-Stream empfangen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:875 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1000 #, c-format msgid "could not send data to WAL stream: %s" msgstr "konnte keine Daten an den WAL-Stream senden: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:967 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1101 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "konnte Replikations-Slot »%s« nicht erzeugen: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1013 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1140 +#, c-format +msgid "could not alter replication slot \"%s\": %s" +msgstr "konnte Replikations-Slot »%s« nicht ändern: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1174 #, c-format msgid "invalid query response" msgstr "ungültige Antwort auf Anfrage" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1014 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1175 #, c-format msgid "Expected %d fields, got %d fields." msgstr "%d Felder erwartet, %d Feldern erhalten." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1084 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1245 #, c-format msgid "the query interface requires a database connection" msgstr "Ausführen von Anfragen benötigt eine Datenbankverbindung" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1115 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1277 msgid "empty query" msgstr "leere Anfrage" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1121 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1283 msgid "unexpected pipeline mode" msgstr "unerwarteter Pipeline-Modus" @@ -20230,207 +20672,205 @@ msgstr "unerwarteter Pipeline-Modus" msgid "logical replication parallel apply worker for subscription \"%s\" has finished" msgstr "Parallel-Apply-Worker für logische Replikation für Subskription »%s« hat abschlossen" -#: replication/logical/applyparallelworker.c:825 +#: replication/logical/applyparallelworker.c:822 #, c-format msgid "lost connection to the logical replication apply worker" msgstr "Verbindung mit dem Apply-Worker für logische Replikation verloren" -#: replication/logical/applyparallelworker.c:893 -#, fuzzy, c-format -#| msgid "could not map dynamic shared memory segment" -msgid "unable to map dynamic shared memory segment" -msgstr "konnte dynamisches Shared-Memory-Segment nicht mappen" - -#: replication/logical/applyparallelworker.c:899 -#, fuzzy, c-format -#| msgid "invalid magic number in dynamic shared memory segment" -msgid "bad magic number in dynamic shared memory segment" -msgstr "ungültige magische Zahl in dynamischem Shared-Memory-Segment" - -#: replication/logical/applyparallelworker.c:1027 -#: replication/logical/applyparallelworker.c:1029 -#: replication/logical/worker.c:447 -#, fuzzy -#| msgid "lost connection to parallel worker" +#: replication/logical/applyparallelworker.c:1024 +#: replication/logical/applyparallelworker.c:1026 msgid "logical replication parallel apply worker" -msgstr "Verbindung mit parallelem Arbeitsprozess verloren" +msgstr "Parallel-Apply-Worker für logische Replikation" -#: replication/logical/applyparallelworker.c:1043 -#, fuzzy, c-format -#| msgid "terminating logical replication worker due to timeout" +#: replication/logical/applyparallelworker.c:1040 +#, c-format msgid "logical replication parallel apply worker exited due to error" -msgstr "Arbeitsprozess für logische Replikation wird abgebrochen wegen Zeitüberschreitung" +msgstr "Parallel-Apply-Worker für logische Replikation beendete wegen eines Fehlers" -#: replication/logical/applyparallelworker.c:1130 -#: replication/logical/applyparallelworker.c:1303 +#: replication/logical/applyparallelworker.c:1127 +#: replication/logical/applyparallelworker.c:1300 #, c-format msgid "lost connection to the logical replication parallel apply worker" msgstr "Verbindung mit dem Parallel-Apply-Worker für logische Replikation verloren" -#: replication/logical/applyparallelworker.c:1183 +#: replication/logical/applyparallelworker.c:1180 #, c-format msgid "could not send data to shared-memory queue" msgstr "konnte Daten nicht an Shared-Memory-Queue senden" -#: replication/logical/applyparallelworker.c:1218 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" +#: replication/logical/applyparallelworker.c:1215 +#, c-format msgid "logical replication apply worker will serialize the remaining changes of remote transaction %u to a file" -msgstr "Apply-Worker für logische Replikation für Subskription %u« wird nicht starten, weil die Subskription während des Starts deaktiviert wurde" +msgstr "Apply-Worker für logische Replikation wird die restlichen Änderungen der Remote-Transaktion %u in eine Datei serialisieren" -#: replication/logical/decode.c:180 replication/logical/logical.c:140 -#, fuzzy, c-format -#| msgid "logical decoding requires wal_level >= logical" -msgid "logical decoding on standby requires wal_level >= logical on the primary" -msgstr "logische Dekodierung erfordert wal_level >= logical" +#: replication/logical/decode.c:177 replication/logical/logical.c:141 +#, c-format +msgid "logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary" +msgstr "logische Dekodierung auf dem Standby-Server erfordert »wal_level« >= »logical« auf dem Primärserver" -#: replication/logical/launcher.c:331 +#: replication/logical/launcher.c:334 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "Arbeitsprozesse für logische Replikation können nicht gestartet werden, wenn max_replication_slots = 0" -#: replication/logical/launcher.c:424 +#: replication/logical/launcher.c:427 #, c-format msgid "out of logical replication worker slots" msgstr "alle Slots für Arbeitsprozesse für logische Replikation belegt" -#: replication/logical/launcher.c:425 replication/logical/launcher.c:499 -#: replication/slot.c:1290 storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 -#: storage/lmgr/lock.c:2811 storage/lmgr/lock.c:4196 storage/lmgr/lock.c:4261 -#: storage/lmgr/lock.c:4611 storage/lmgr/predicate.c:2413 -#: storage/lmgr/predicate.c:2428 storage/lmgr/predicate.c:3825 +#: replication/logical/launcher.c:428 replication/logical/launcher.c:514 +#: replication/slot.c:1524 storage/lmgr/lock.c:985 storage/lmgr/lock.c:1023 +#: storage/lmgr/lock.c:2836 storage/lmgr/lock.c:4221 storage/lmgr/lock.c:4286 +#: storage/lmgr/lock.c:4636 storage/lmgr/predicate.c:2469 +#: storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:3881 #, c-format -msgid "You might need to increase %s." -msgstr "Sie müssen möglicherweise %s erhöhen." +msgid "You might need to increase \"%s\"." +msgstr "Sie müssen möglicherweise »%s« erhöhen." -#: replication/logical/launcher.c:498 +#: replication/logical/launcher.c:513 #, c-format msgid "out of background worker slots" msgstr "alle Slots für Background-Worker belegt" -#: replication/logical/launcher.c:705 +#: replication/logical/launcher.c:720 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "Arbeitsprozess-Slot %d für logische Replikation ist leer, kann nicht zugeteilt werden" -#: replication/logical/launcher.c:714 +#: replication/logical/launcher.c:729 #, c-format msgid "logical replication worker slot %d is already used by another worker, cannot attach" msgstr "Arbeitsprozess-Slot %d für logische Replikation wird schon von einem anderen Arbeitsprozess verwendet, kann nicht zugeteilt werden" -#: replication/logical/logical.c:120 +#: replication/logical/logical.c:121 #, c-format -msgid "logical decoding requires wal_level >= logical" -msgstr "logische Dekodierung erfordert wal_level >= logical" +msgid "logical decoding requires \"wal_level\" >= \"logical\"" +msgstr "logische Dekodierung erfordert »wal_level« >= »logical«" -#: replication/logical/logical.c:125 +#: replication/logical/logical.c:126 #, c-format msgid "logical decoding requires a database connection" msgstr "logische Dekodierung benötigt eine Datenbankverbindung" -#: replication/logical/logical.c:363 replication/logical/logical.c:517 +#: replication/logical/logical.c:365 replication/logical/logical.c:519 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "physischer Replikations-Slot kann nicht für logisches Dekodieren verwendet werden" -#: replication/logical/logical.c:368 replication/logical/logical.c:522 +#: replication/logical/logical.c:370 replication/logical/logical.c:529 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "Replikations-Slot »%s« wurde nicht in dieser Datenbank erzeugt" -#: replication/logical/logical.c:375 +#: replication/logical/logical.c:377 #, c-format msgid "cannot create logical replication slot in transaction that has performed writes" msgstr "logischer Replikations-Slot kann nicht in einer Transaktion erzeugt werden, die Schreibvorgänge ausgeführt hat" -#: replication/logical/logical.c:534 replication/logical/logical.c:541 +#: replication/logical/logical.c:540 +#, c-format +msgid "cannot use replication slot \"%s\" for logical decoding" +msgstr "physischer Replikations-Slot »%s« kann nicht für logisches Dekodieren verwendet werden" + +#: replication/logical/logical.c:542 replication/slot.c:798 +#: replication/slot.c:829 +#, c-format +msgid "This replication slot is being synchronized from the primary server." +msgstr "Dieser Replikations-Slot wird vom Primärserver synchronisiert." + +#: replication/logical/logical.c:543 +#, c-format +msgid "Specify another replication slot." +msgstr "Geben Sie einen anderen Replikations-Slot an." + +#: replication/logical/logical.c:554 replication/logical/logical.c:561 #, c-format msgid "can no longer get changes from replication slot \"%s\"" msgstr "aus Replikations-Slot »%s« können keine Änderungen mehr gelesen werden" -#: replication/logical/logical.c:536 +#: replication/logical/logical.c:556 #, c-format msgid "This slot has been invalidated because it exceeded the maximum reserved size." msgstr "Dieser Slot wurde ungültig gemacht, weil er die maximale reservierte Größe überschritten hat." -#: replication/logical/logical.c:543 +#: replication/logical/logical.c:563 #, c-format msgid "This slot has been invalidated because it was conflicting with recovery." msgstr "Dieser Slot wurde ungültig gemacht, weil er mit der Wiederherstellung kollidierte." -#: replication/logical/logical.c:608 +#: replication/logical/logical.c:628 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "starte logisches Dekodieren für Slot »%s«" -#: replication/logical/logical.c:610 +#: replication/logical/logical.c:630 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Streaming beginnt bei Transaktionen, die nach %X/%X committen; lese WAL ab %X/%X." -#: replication/logical/logical.c:758 +#: replication/logical/logical.c:778 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "Slot »%s«, Ausgabe-Plugin »%s«, im Callback %s, zugehörige LSN %X/%X" -#: replication/logical/logical.c:764 +#: replication/logical/logical.c:784 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "Slot »%s«, Ausgabe-Plugin »%s«, im Callback %s" -#: replication/logical/logical.c:935 replication/logical/logical.c:980 -#: replication/logical/logical.c:1025 replication/logical/logical.c:1071 +#: replication/logical/logical.c:955 replication/logical/logical.c:1000 +#: replication/logical/logical.c:1045 replication/logical/logical.c:1091 #, c-format msgid "logical replication at prepare time requires a %s callback" msgstr "logische Replikation bei PREPARE TRANSACTION benötigt einen %s-Callback" -#: replication/logical/logical.c:1303 replication/logical/logical.c:1352 -#: replication/logical/logical.c:1393 replication/logical/logical.c:1479 -#: replication/logical/logical.c:1528 +#: replication/logical/logical.c:1323 replication/logical/logical.c:1372 +#: replication/logical/logical.c:1413 replication/logical/logical.c:1499 +#: replication/logical/logical.c:1548 #, c-format msgid "logical streaming requires a %s callback" msgstr "logisches Streaming benötigt einen %s-Callback" -#: replication/logical/logical.c:1438 +#: replication/logical/logical.c:1458 #, c-format msgid "logical streaming at prepare time requires a %s callback" msgstr "logisches Streaming bei PREPARE TRANSACTION benötigt einen %s-Callback" -#: replication/logical/logicalfuncs.c:126 +#: replication/logical/logicalfuncs.c:123 #, c-format msgid "slot name must not be null" msgstr "Slot-Name darf nicht NULL sein" -#: replication/logical/logicalfuncs.c:142 +#: replication/logical/logicalfuncs.c:139 #, c-format msgid "options array must not be null" msgstr "Optionen-Array darf nicht NULL sein" -#: replication/logical/logicalfuncs.c:159 +#: replication/logical/logicalfuncs.c:156 #, c-format msgid "array must be one-dimensional" msgstr "Array muss eindimensional sein" -#: replication/logical/logicalfuncs.c:165 +#: replication/logical/logicalfuncs.c:162 #, c-format msgid "array must not contain nulls" msgstr "Array darf keine NULL-Werte enthalten" -#: replication/logical/logicalfuncs.c:180 utils/adt/json.c:1484 -#: utils/adt/jsonb.c:1403 +#: replication/logical/logicalfuncs.c:177 utils/adt/json.c:1420 +#: utils/adt/jsonb.c:1304 #, c-format msgid "array must have even number of elements" msgstr "Array muss eine gerade Anzahl Elemente haben" -#: replication/logical/logicalfuncs.c:227 +#: replication/logical/logicalfuncs.c:224 #, c-format msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" msgstr "Ausgabe-Plugin »%s« erzeugt binäre Ausgabe, aber Funktion »%s« erwartet Textdaten" #: replication/logical/origin.c:190 #, c-format -msgid "cannot query or manipulate replication origin when max_replication_slots = 0" -msgstr "Replication-Origin kann nicht abgefragt oder geändert werden, wenn max_replication_slots = 0" +msgid "cannot query or manipulate replication origin when \"max_replication_slots\" is 0" +msgstr "Replication-Origin kann nicht abgefragt oder geändert werden, wenn »max_replication_slots« 0 ist" #: replication/logical/origin.c:195 #, c-format @@ -20464,8 +20904,8 @@ msgstr "Replikations-Checkpoint hat falsche magische Zahl %u statt %u" #: replication/logical/origin.c:798 #, c-format -msgid "could not find free replication state, increase max_replication_slots" -msgstr "konnte keinen freien Replication-State finden, erhöhen Sie max_replication_slots" +msgid "could not find free replication state, increase \"max_replication_slots\"" +msgstr "konnte keinen freien Replication-State finden, erhöhen Sie »max_replication_slots«" #: replication/logical/origin.c:806 #, c-format @@ -20477,1262 +20917,1574 @@ msgstr "Replikationszustand von Knoten %d auf %X/%X wiederhergestellt" msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "Replikations-Slot-Checkpoint hat falsche Prüfsumme %u, erwartet wurde %u" -#: replication/logical/origin.c:944 replication/logical/origin.c:1141 +#: replication/logical/origin.c:944 replication/logical/origin.c:1143 #, c-format msgid "replication origin with ID %d is already active for PID %d" msgstr "Replication-Origin mit ID %d ist bereits aktiv für PID %d" -#: replication/logical/origin.c:955 replication/logical/origin.c:1153 +#: replication/logical/origin.c:955 replication/logical/origin.c:1156 #, c-format msgid "could not find free replication state slot for replication origin with ID %d" msgstr "konnte keinen freien Replication-State-Slot für Replication-Origin mit ID %d finden" -#: replication/logical/origin.c:957 replication/logical/origin.c:1155 -#: replication/slot.c:2086 +#: replication/logical/origin.c:957 replication/logical/origin.c:1158 +#: replication/slot.c:2401 #, c-format -msgid "Increase max_replication_slots and try again." -msgstr "Erhöhen Sie max_replication_slots und versuchen Sie es erneut." +msgid "Increase \"max_replication_slots\" and try again." +msgstr "Erhöhen Sie »max_replication_slots« und versuchen Sie es erneut." -#: replication/logical/origin.c:1112 +#: replication/logical/origin.c:1114 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "kann Replication-Origin nicht einrichten, wenn schon einer eingerichtet ist" -#: replication/logical/origin.c:1196 replication/logical/origin.c:1412 -#: replication/logical/origin.c:1432 +#: replication/logical/origin.c:1199 replication/logical/origin.c:1415 +#: replication/logical/origin.c:1435 #, c-format msgid "no replication origin is configured" msgstr "kein Replication-Origin konfiguriert" -#: replication/logical/origin.c:1282 +#: replication/logical/origin.c:1285 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "Replication-Origin-Name »%s« ist reserviert" -#: replication/logical/origin.c:1284 -#, fuzzy, c-format -#| msgid "Origin names starting with \"pg_\" are reserved." +#: replication/logical/origin.c:1287 +#, c-format msgid "Origin names \"%s\", \"%s\", and names starting with \"pg_\" are reserved." -msgstr "Replication-Origin-Namen, die mit »pg_« anfangen, sind reserviert." +msgstr "Replication-Origin-Namen »%s«, »%s« und Namen, die mit »pg_« anfangen, sind reserviert." -#: replication/logical/relation.c:240 +#: replication/logical/relation.c:242 #, c-format msgid "\"%s\"" msgstr "»%s«" -#: replication/logical/relation.c:243 +#: replication/logical/relation.c:245 #, c-format msgid ", \"%s\"" msgstr ", »%s«" -#: replication/logical/relation.c:249 +#: replication/logical/relation.c:251 #, c-format msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" msgstr[0] "in Zielrelation für logische Replikation »%s.%s« fehlt eine replizierte Spalte: %s" msgstr[1] "in Zielrelation für logische Replikation »%s.%s« fehlen replizierte Spalten: %s" -#: replication/logical/relation.c:304 +#: replication/logical/relation.c:306 #, c-format msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" msgstr "Zielrelation für logische Replikation »%s.%s« verwendet Systemspalten in REPLICA-IDENTITY-Index" -#: replication/logical/relation.c:396 +#: replication/logical/relation.c:398 #, c-format msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "Zielrelation für logische Replikation »%s.%s« existiert nicht" -#: replication/logical/reorderbuffer.c:3936 +#: replication/logical/reorderbuffer.c:3999 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "konnte nicht in Datendatei für XID %u schreiben: %m" -#: replication/logical/reorderbuffer.c:4282 -#: replication/logical/reorderbuffer.c:4307 +#: replication/logical/reorderbuffer.c:4345 +#: replication/logical/reorderbuffer.c:4370 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "konnte nicht aus Reorder-Buffer-Spill-Datei lesen: %m" -#: replication/logical/reorderbuffer.c:4286 -#: replication/logical/reorderbuffer.c:4311 +#: replication/logical/reorderbuffer.c:4349 +#: replication/logical/reorderbuffer.c:4374 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "konnte nicht aus Reorder-Buffer-Spill-Datei lesen: %d statt %u Bytes gelesen" -#: replication/logical/reorderbuffer.c:4561 +#: replication/logical/reorderbuffer.c:4624 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "konnte Datei »%s« nicht löschen, bei Löschen von pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:5057 +#: replication/logical/reorderbuffer.c:5120 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "konnte nicht aus Datei »%s« lesen: %d statt %d Bytes gelesen" -#: replication/logical/snapbuild.c:639 +#: replication/logical/slotsync.c:215 +#, c-format +msgid "could not synchronize replication slot \"%s\" because remote slot precedes local slot" +msgstr "konnte Replikations-Slot »%s« nicht synchronisieren, weil der Remote-Slot dem lokalen vorangeht" + +#: replication/logical/slotsync.c:217 +#, c-format +msgid "The remote slot has LSN %X/%X and catalog xmin %u, but the local slot has LSN %X/%X and catalog xmin %u." +msgstr "Der Remote-Slot hat LSN %X/%X und Katalog-xmin %u, aber der lokale Slot hat LSN %X/%X und Katalog-xmin %u." + +#: replication/logical/slotsync.c:459 +#, c-format +msgid "dropped replication slot \"%s\" of database with OID %u" +msgstr "Replikations-Slot »%s« von Datenbank mit OID %u wurde gelöscht" + +#: replication/logical/slotsync.c:579 +#, c-format +msgid "could not synchronize replication slot \"%s\"" +msgstr "konnte Replikations-Slot »%s« nicht synchronisieren" + +#: replication/logical/slotsync.c:580 +#, c-format +msgid "Logical decoding could not find consistent point from local slot's LSN %X/%X." +msgstr "Logisches Dekodieren konnte keinen konsistenten Punkt von der LSN des lokalen Slots %X/%X finden." + +#: replication/logical/slotsync.c:589 +#, c-format +msgid "newly created replication slot \"%s\" is sync-ready now" +msgstr "neu erzeugter Replikations-Slot »%s« ist jetzt bereit für die Synchronisierung" + +#: replication/logical/slotsync.c:628 +#, c-format +msgid "skipping slot synchronization because the received slot sync LSN %X/%X for slot \"%s\" is ahead of the standby position %X/%X" +msgstr "Slot-Synchronisierung wird übersprungen, weil die empfangene Slot-Sync-LSN %X/%X für Slot »%s« der Position %X/%X des Standbys voraus ist" + +#: replication/logical/slotsync.c:650 +#, c-format +msgid "exiting from slot synchronization because same name slot \"%s\" already exists on the standby" +msgstr "verlasse Slot-Synchronisierung, weil der gleiche Slot »%s« schon auf dem Standby existiert" + +#: replication/logical/slotsync.c:819 +#, c-format +msgid "could not fetch failover logical slots info from the primary server: %s" +msgstr "konnte Informationen über logische Failover-Slots nicht vom Primärserver holen: %s" + +#: replication/logical/slotsync.c:965 +#, c-format +msgid "could not fetch primary_slot_name \"%s\" info from the primary server: %s" +msgstr "konnte Informationen über primary_slot_name »%s« nicht vom Primärserver holen: %s" + +#: replication/logical/slotsync.c:967 +#, c-format +msgid "Check if primary_slot_name is configured correctly." +msgstr "Prüfen Sie, ob primary_slot_name korrekt konfiguriert ist." + +#: replication/logical/slotsync.c:987 +#, c-format +msgid "cannot synchronize replication slots from a standby server" +msgstr "Replikations-Slots können nicht von einem Standby-Server synchronisiert werden" + +#. translator: second %s is a GUC variable name +#: replication/logical/slotsync.c:996 +#, c-format +msgid "replication slot \"%s\" specified by \"%s\" does not exist on primary server" +msgstr "Replikations-Slot »%s«, der in »%s« angegeben ist, existiert auf dem Publikationsserver nicht" + +#. translator: first %s is a connection option; second %s is a GUC +#. variable name +#. +#: replication/logical/slotsync.c:1029 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be specified in \"%s\"" +msgstr "Replikations-Slot-Synchronisierung erfordert, dass »%s« in »%s« angegeben wird" + +#: replication/logical/slotsync.c:1050 +#, c-format +msgid "replication slot synchronization requires \"wal_level\" >= \"logical\"" +msgstr "Replikations-Slot-Synchronisierung erfordert »wal_level« >= »logical«" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1063 replication/logical/slotsync.c:1091 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be set" +msgstr "Replikations-Slot-Synchronisierung erfordert, dass »%s« definiert ist" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1077 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be enabled" +msgstr "Replikations-Slot-Synchronisierung erfordert, dass »%s« eingeschaltet ist" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1129 +#, c-format +msgid "replication slot synchronization worker will shut down because \"%s\" is disabled" +msgstr "Arbeitsprozess für Replikations-Slot-Synchronisierung wird herunterfahren, weil »%s« deaktiviert ist" + +#: replication/logical/slotsync.c:1138 +#, c-format +msgid "replication slot synchronization worker will restart because of a parameter change" +msgstr "Arbeitsprozess für Replikations-Slot-Synchronisierung wird neu starten wegen einer Parameteränderung" + +#: replication/logical/slotsync.c:1162 +#, c-format +msgid "replication slot synchronization worker is shutting down on receiving SIGINT" +msgstr "Arbeitsprozess für Replikations-Slot-Synchronisierung fährt herunter, weil SIGINT empfangen wurde" + +#: replication/logical/slotsync.c:1287 +#, c-format +msgid "cannot synchronize replication slots when standby promotion is ongoing" +msgstr "Replikations-Slots können nicht synchronisiert werden, während die Standby-Beförderung läuft" + +#: replication/logical/slotsync.c:1295 +#, c-format +msgid "cannot synchronize replication slots concurrently" +msgstr "Replikations-Slots können nicht nebenläufig synchronisiert werden" + +#: replication/logical/slotsync.c:1403 +#, c-format +msgid "slot sync worker started" +msgstr "Slot-Sync-Arbeitsprozess gestartet" + +#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:926 +#: replication/walreceiver.c:307 +#, c-format +msgid "could not connect to the primary server: %s" +msgstr "konnte nicht mit dem Primärserver verbinden: %s" + +#: replication/logical/snapbuild.c:653 #, c-format msgid "initial slot snapshot too large" msgstr "initialer Slot-Snapshot ist zu groß" -#: replication/logical/snapbuild.c:693 +#: replication/logical/snapbuild.c:707 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" msgstr[0] "logischer Dekodierungs-Snapshot exportiert: »%s« mit %u Transaktions-ID" msgstr[1] "logischer Dekodierungs-Snapshot exportiert: »%s« mit %u Transaktions-IDs" -#: replication/logical/snapbuild.c:1388 replication/logical/snapbuild.c:1480 -#: replication/logical/snapbuild.c:1992 +#: replication/logical/snapbuild.c:1443 replication/logical/snapbuild.c:1540 +#: replication/logical/snapbuild.c:2056 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "logisches Dekodieren fand konsistenten Punkt bei %X/%X" -#: replication/logical/snapbuild.c:1390 +#: replication/logical/snapbuild.c:1445 #, c-format msgid "There are no running transactions." msgstr "Keine laufenden Transaktionen." -#: replication/logical/snapbuild.c:1432 +#: replication/logical/snapbuild.c:1492 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "logisches Dekodieren fand initialen Startpunkt bei %X/%X" -#: replication/logical/snapbuild.c:1434 replication/logical/snapbuild.c:1458 +#: replication/logical/snapbuild.c:1494 replication/logical/snapbuild.c:1518 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Warten auf Abschluss der Transaktionen (ungefähr %d), die älter als %u sind." -#: replication/logical/snapbuild.c:1456 +#: replication/logical/snapbuild.c:1516 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "logisches Dekodieren fand initialen konsistenten Punkt bei %X/%X" -#: replication/logical/snapbuild.c:1482 +#: replication/logical/snapbuild.c:1542 #, c-format msgid "There are no old transactions anymore." msgstr "Es laufen keine alten Transaktionen mehr." -#: replication/logical/snapbuild.c:1883 +#: replication/logical/snapbuild.c:1943 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "Scanbuild-State-Datei »%s« hat falsche magische Zahl %u statt %u" -#: replication/logical/snapbuild.c:1889 +#: replication/logical/snapbuild.c:1949 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "Snapbuild-State-Datei »%s« hat nicht unterstützte Version: %u statt %u" -#: replication/logical/snapbuild.c:1930 +#: replication/logical/snapbuild.c:1990 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "Prüfsummenfehler bei Snapbuild-State-Datei »%s«: ist %u, sollte %u sein" -#: replication/logical/snapbuild.c:1994 +#: replication/logical/snapbuild.c:2058 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Logische Dekodierung beginnt mit gespeichertem Snapshot." -#: replication/logical/snapbuild.c:2101 +#: replication/logical/snapbuild.c:2165 #, c-format msgid "could not parse file name \"%s\"" msgstr "konnte Dateinamen »%s« nicht parsen" -#: replication/logical/tablesync.c:153 +#: replication/logical/tablesync.c:161 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "Arbeitsprozess für logische Replikation für Tabellensynchronisation für Subskription »%s«, Tabelle »%s« hat abgeschlossen" -#: replication/logical/tablesync.c:622 +#: replication/logical/tablesync.c:641 #, c-format msgid "logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled" msgstr "Apply-Worker für logische Replikation für Subskription »%s« wird neu starten, damit two_phase eingeschaltet werden kann" -#: replication/logical/tablesync.c:797 replication/logical/tablesync.c:939 +#: replication/logical/tablesync.c:827 replication/logical/tablesync.c:969 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "konnte Tabelleninformationen für Tabelle »%s.%s« nicht vom Publikationsserver holen: %s" -#: replication/logical/tablesync.c:804 +#: replication/logical/tablesync.c:834 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "Tabelle »%s.%s« nicht auf dem Publikationsserver gefunden" -#: replication/logical/tablesync.c:862 +#: replication/logical/tablesync.c:892 #, c-format msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" msgstr "konnte Spaltenlisteninformationen für Tabelle »%s.%s« nicht vom Publikationsserver holen: %s" -#: replication/logical/tablesync.c:1041 +#: replication/logical/tablesync.c:1071 #, c-format msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" msgstr "konnte WHERE-Klausel-Informationen für Tabelle »%s.%s« nicht vom Publikationsserver holen: %s" -#: replication/logical/tablesync.c:1192 +#: replication/logical/tablesync.c:1230 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "konnte Kopieren des Anfangsinhalts für Tabelle »%s.%s« nicht starten: %s" -#: replication/logical/tablesync.c:1393 +#: replication/logical/tablesync.c:1429 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "beim Kopieren der Tabelle konnte die Transaktion auf dem Publikationsserver nicht gestartet werden: %s" -#: replication/logical/tablesync.c:1435 +#: replication/logical/tablesync.c:1472 #, c-format msgid "replication origin \"%s\" already exists" msgstr "Replication-Origin »%s« existiert bereits" -#: replication/logical/tablesync.c:1468 replication/logical/worker.c:2387 +#: replication/logical/tablesync.c:1505 replication/logical/worker.c:2363 #, c-format msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" msgstr "Benutzer »%s« kann nicht in eine Relation mit Sicherheit auf Zeilenebene replizieren: »%s«" -#: replication/logical/tablesync.c:1481 +#: replication/logical/tablesync.c:1518 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "beim Kopieren der Tabelle konnte die Transaktion auf dem Publikationsserver nicht beenden werden: %s" -#: replication/logical/worker.c:445 -#, fuzzy -#| msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" -msgid "logical replication table synchronization worker" -msgstr "Arbeitsprozess für logische Replikation für Tabellensynchronisation für Subskription »%s«, Tabelle »%s« hat gestartet" - -#: replication/logical/worker.c:449 -#, fuzzy -#| msgid "out of logical replication worker slots" -msgid "logical replication apply worker" -msgstr "alle Slots für Arbeitsprozesse für logische Replikation belegt" - -#: replication/logical/worker.c:512 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" has started" +#: replication/logical/worker.c:483 +#, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop" -msgstr "Apply-Worker für logische Replikation für Subskription »%s« hat gestartet" +msgstr "Parallel-Apply-Worker für logische Replikation für Subskription »%s« wird anhalten" -#: replication/logical/worker.c:514 +#: replication/logical/worker.c:485 #, c-format msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." -msgstr "" +msgstr "Gestreamte Replikationstransaktionen können erst mit parallelen Apply-Worker-Prozessen verarbeitet werden, wenn alle Tabellen synchronisiert worden sind." -#: replication/logical/worker.c:876 replication/logical/worker.c:991 +#: replication/logical/worker.c:854 replication/logical/worker.c:969 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "falsches Binärdatenformat in Spalte %d in logischer Replikation" -#: replication/logical/worker.c:2526 +#: replication/logical/worker.c:2506 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "Publikationsserver hat nicht die Replikidentitätsspalten gesendet, die von Replikationszielrelation »%s.%s« erwartet wurden" -#: replication/logical/worker.c:2533 +#: replication/logical/worker.c:2513 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "Zielrelation für logische Replikation »%s.%s« hat weder REPLICA-IDENTITY-Index noch Primärschlüssel und die publizierte Relation hat kein REPLICA IDENTITY FULL" #: replication/logical/worker.c:3384 #, c-format -msgid "invalid logical replication message type \"%c\"" -msgstr "ungültiger Nachrichtentyp für logische Replikation »%c«" +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "ungültiger Nachrichtentyp für logische Replikation »??? (%d)«" #: replication/logical/worker.c:3556 #, c-format msgid "data stream from publisher has ended" msgstr "Datenstrom vom Publikationsserver endete" -#: replication/logical/worker.c:3713 +#: replication/logical/worker.c:3710 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "Arbeitsprozess für logische Replikation wird abgebrochen wegen Zeitüberschreitung" -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:3908 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" -msgid "%s for subscription \"%s\" will stop because the subscription was removed" -msgstr "Apply-Worker für logische Replikation für Subskription »%s« wird anhalten, weil die Subskription entfernt wurde" +#: replication/logical/worker.c:3904 +#, c-format +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" +msgstr "Arbeitsprozess für logische Replikation für Subskription »%s« wird anhalten, weil die Subskription entfernt wurde" -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:3922 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" -msgid "%s for subscription \"%s\" will stop because the subscription was disabled" -msgstr "Apply-Worker für logische Replikation für Subskription »%s« wird anhalten, weil die Subskription deaktiviert wurde" +#: replication/logical/worker.c:3918 +#, c-format +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" +msgstr "Arbeitsprozess für logische Replikation für Subskription »%s« wird anhalten, weil die Subskription deaktiviert wurde" -#: replication/logical/worker.c:3953 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" +#: replication/logical/worker.c:3949 +#, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" -msgstr "Apply-Worker für logische Replikation für Subskription »%s« wird neu starten wegen einer Parameteränderung" - -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:3958 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" -msgid "%s for subscription \"%s\" will restart because of a parameter change" -msgstr "Apply-Worker für logische Replikation für Subskription »%s« wird neu starten wegen einer Parameteränderung" - -#. translator: %s is the name of logical replication worker -#: replication/logical/worker.c:4482 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" -msgid "%s for subscription %u will not start because the subscription was removed during startup" -msgstr "Apply-Worker für logische Replikation für Subskription %u« wird nicht starten, weil die Subskription während des Starts deaktiviert wurde" - -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:4498 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" -msgid "%s for subscription \"%s\" will not start because the subscription was disabled during startup" -msgstr "Apply-Worker für logische Replikation für Subskription »%s« wird nicht starten, weil die Subskription während des Starts deaktiviert wurde" - -#: replication/logical/worker.c:4515 +msgstr "Parallel-Apply-Worker für logische Replikation für Subskription »%s« wird anhalten wegen einer Parameteränderung" + +#: replication/logical/worker.c:3953 #, c-format -msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" -msgstr "Arbeitsprozess für logische Replikation für Tabellensynchronisation für Subskription »%s«, Tabelle »%s« hat gestartet" +msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" +msgstr "Arbeitsprozess für logische Replikation für Subskription »%s« wird neu starten wegen einer Parameteränderung" -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:4521 -#, fuzzy, c-format -#| msgid "skip-LSN of subscription \"%s\" cleared" -msgid "%s for subscription \"%s\" has started" -msgstr "Skip-LSN von Subskription »%s« gelöscht" +#: replication/logical/worker.c:3967 +#, c-format +msgid "logical replication parallel apply worker for subscription \"%s\" will stop because the subscription owner's superuser privileges have been revoked" +msgstr "Parallel-Apply-Worker für logische Replikation für Subskription »%s« wird anhalten, weil die Superuser-Privilegien des Eigentümers der Subskription entzogen wurden" + +#: replication/logical/worker.c:3971 +#, c-format +msgid "logical replication worker for subscription \"%s\" will restart because the subscription owner's superuser privileges have been revoked" +msgstr "Arbeitsprozess für logische Replikation für Subskription »%s« wird neu starten, weil die Superuser-Privilegien des Eigentümers der Subskription entzogen wurden" -#: replication/logical/worker.c:4596 +#: replication/logical/worker.c:4499 #, c-format msgid "subscription has no replication slot set" msgstr "für die Subskription ist kein Replikations-Slot gesetzt" -#: replication/logical/worker.c:4763 +#: replication/logical/worker.c:4612 +#, c-format +msgid "logical replication worker for subscription %u will not start because the subscription was removed during startup" +msgstr "Arbeitsprozess für logische Replikation für Subskription %u« wird nicht starten, weil die Subskription während des Starts entfernt wurde" + +#: replication/logical/worker.c:4628 +#, c-format +msgid "logical replication worker for subscription \"%s\" will not start because the subscription was disabled during startup" +msgstr "Arbeitsprozess für logische Replikation für Subskription »%s« wird nicht starten, weil die Subskription während des Starts deaktiviert wurde" + +#: replication/logical/worker.c:4652 +#, c-format +msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" +msgstr "Arbeitsprozess für logische Replikation für Tabellensynchronisation für Subskription »%s«, Tabelle »%s« hat gestartet" + +#: replication/logical/worker.c:4657 +#, c-format +msgid "logical replication apply worker for subscription \"%s\" has started" +msgstr "Apply-Worker für logische Replikation für Subskription »%s« hat gestartet" + +#: replication/logical/worker.c:4779 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "Subskription »%s« wurde wegen eines Fehlers deaktiviert" -#: replication/logical/worker.c:4811 +#: replication/logical/worker.c:4827 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "logische Replikation beginnt Überspringen von Transaktion bei %X/%X" -#: replication/logical/worker.c:4825 +#: replication/logical/worker.c:4841 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "logische Replikation beendet Überspringen von Transaktion bei %X/%X" -#: replication/logical/worker.c:4907 +#: replication/logical/worker.c:4923 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "Skip-LSN von Subskription »%s« gelöscht" -#: replication/logical/worker.c:4908 +#: replication/logical/worker.c:4924 #, c-format msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." msgstr "Die WAL-Endposition (LSN) %X/%X der Remote-Transaktion stimmte nicht mit der Skip-LSN %X/%X überein." -#: replication/logical/worker.c:4934 +#: replication/logical/worker.c:4950 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s«" -#: replication/logical/worker.c:4938 +#: replication/logical/worker.c:4954 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« in Transaktion %u" -#: replication/logical/worker.c:4943 +#: replication/logical/worker.c:4959 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« in Transaktion %u, beendet bei %X/%X" -#: replication/logical/worker.c:4954 +#: replication/logical/worker.c:4970 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« in Transaktion %u" -#: replication/logical/worker.c:4961 +#: replication/logical/worker.c:4977 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« in Transaktion %u, beendet bei %X/%X" -#: replication/logical/worker.c:4972 +#: replication/logical/worker.c:4988 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« Spalte »%s« in Transaktion %u" -#: replication/logical/worker.c:4980 +#: replication/logical/worker.c:4996 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" msgstr "Verarbeiten empfangener Daten für Replication-Origin »%s« bei Nachrichtentyp »%s« für Replikationszielrelation »%s.%s« Spalte »%s« in Transaktion %u, beendet bei %X/%X" -#: replication/pgoutput/pgoutput.c:318 +#: replication/pgoutput/pgoutput.c:322 #, c-format msgid "invalid proto_version" msgstr "ungültige proto_version" -#: replication/pgoutput/pgoutput.c:323 +#: replication/pgoutput/pgoutput.c:327 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version »%s« ist außerhalb des gültigen Bereichs" -#: replication/pgoutput/pgoutput.c:340 +#: replication/pgoutput/pgoutput.c:344 #, c-format msgid "invalid publication_names syntax" msgstr "ungültige Syntax für publication_names" -#: replication/pgoutput/pgoutput.c:443 +#: replication/pgoutput/pgoutput.c:414 replication/pgoutput/pgoutput.c:418 +#, c-format +msgid "option \"%s\" missing" +msgstr "Option »%s« fehlt" + +#: replication/pgoutput/pgoutput.c:478 #, c-format msgid "client sent proto_version=%d but server only supports protocol %d or lower" msgstr "Client sendete proto_version=%d, aber Server unterstützt nur Protokoll %d oder niedriger" -#: replication/pgoutput/pgoutput.c:449 +#: replication/pgoutput/pgoutput.c:484 #, c-format msgid "client sent proto_version=%d but server only supports protocol %d or higher" msgstr "Client sendete proto_version=%d, aber Server unterstützt nur Protokoll %d oder höher" -#: replication/pgoutput/pgoutput.c:455 -#, c-format -msgid "publication_names parameter missing" -msgstr "Parameter »publication_names« fehlt" - -#: replication/pgoutput/pgoutput.c:469 +#: replication/pgoutput/pgoutput.c:499 #, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" msgstr "angeforderte proto_version=%d unterstützt Streaming nicht, benötigt %d oder höher" -#: replication/pgoutput/pgoutput.c:475 +#: replication/pgoutput/pgoutput.c:505 #, c-format msgid "requested proto_version=%d does not support parallel streaming, need %d or higher" msgstr "angeforderte proto_version=%d unterstützt paralleles Streaming nicht, benötigt %d oder höher" -#: replication/pgoutput/pgoutput.c:480 +#: replication/pgoutput/pgoutput.c:510 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "Streaming angefordert, aber wird vom Ausgabe-Plugin nicht unterstützt" -#: replication/pgoutput/pgoutput.c:497 +#: replication/pgoutput/pgoutput.c:524 #, c-format msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" msgstr "angeforderte proto_version=%d unterstützt Zwei-Phasen-Commit nicht, benötigt %d oder höher" -#: replication/pgoutput/pgoutput.c:502 +#: replication/pgoutput/pgoutput.c:529 #, c-format msgid "two-phase commit requested, but not supported by output plugin" msgstr "Zwei-Phasen-Commit angefordert, aber wird vom Ausgabe-Plugin nicht unterstützt" -#: replication/slot.c:207 +#: replication/slot.c:260 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "Replikations-Slot-Name »%s« ist zu kurz" -#: replication/slot.c:216 +#: replication/slot.c:269 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "Replikations-Slot-Name »%s« ist zu lang" -#: replication/slot.c:229 +#: replication/slot.c:282 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "Replikations-Slot-Name »%s« enthält ungültiges Zeichen" -#: replication/slot.c:231 +#: replication/slot.c:284 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "Replikations-Slot-Namen dürfen nur Kleinbuchstaben, Zahlen und Unterstriche enthalten." -#: replication/slot.c:285 +#: replication/slot.c:333 +#, c-format +msgid "cannot enable failover for a replication slot created on the standby" +msgstr "Failover kann nicht für einen auf dem Standby erzeugten Replikations-Slot eingeschaltet werden" + +#: replication/slot.c:345 replication/slot.c:849 +#, c-format +msgid "cannot enable failover for a temporary replication slot" +msgstr "Failover kann nicht für einen temporären Replikations-Slot eingeschaltet werden" + +#: replication/slot.c:370 #, c-format msgid "replication slot \"%s\" already exists" msgstr "Replikations-Slot »%s« existiert bereits" -#: replication/slot.c:295 +#: replication/slot.c:380 #, c-format msgid "all replication slots are in use" msgstr "alle Replikations-Slots sind in Benutzung" -#: replication/slot.c:296 +#: replication/slot.c:381 #, c-format -msgid "Free one or increase max_replication_slots." -msgstr "Geben Sie einen frei oder erhöhen Sie max_replication_slots." +msgid "Free one or increase \"max_replication_slots\"." +msgstr "Geben Sie einen frei oder erhöhen Sie »max_replication_slots«." -#: replication/slot.c:474 replication/slotfuncs.c:736 -#: utils/activity/pgstat_replslot.c:55 utils/adt/genfile.c:774 +#: replication/slot.c:560 replication/slot.c:2467 replication/slotfuncs.c:661 +#: utils/activity/pgstat_replslot.c:56 utils/adt/genfile.c:728 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "Replikations-Slot »%s« existiert nicht" -#: replication/slot.c:520 replication/slot.c:1110 +#: replication/slot.c:606 replication/slot.c:1337 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "Replikations-Slot »%s« ist aktiv für PID %d" -#: replication/slot.c:756 replication/slot.c:1638 replication/slot.c:2021 +#: replication/slot.c:638 +#, c-format +msgid "acquired logical replication slot \"%s\"" +msgstr "logischer Replikations-Slot »%s« wurde akquiriert" + +#: replication/slot.c:640 +#, c-format +msgid "acquired physical replication slot \"%s\"" +msgstr "physischer Replikations-Slot »%s« wurde akquiriert" + +#: replication/slot.c:729 +#, c-format +msgid "released logical replication slot \"%s\"" +msgstr "logischer Replikations-Slot »%s« wurde freigegeben" + +#: replication/slot.c:731 +#, c-format +msgid "released physical replication slot \"%s\"" +msgstr "physischer Replikations-Slot »%s« wurde freigegeben" + +#: replication/slot.c:797 +#, c-format +msgid "cannot drop replication slot \"%s\"" +msgstr "kann Replikations-Slot »%s« nicht löschen" + +#: replication/slot.c:816 +#, c-format +msgid "cannot use %s with a physical replication slot" +msgstr "%s kann nicht mit einem physischem Replikations-Slot verwendet werden" + +#: replication/slot.c:828 +#, c-format +msgid "cannot alter replication slot \"%s\"" +msgstr "Replikations-Slot »%s« kann nicht geändert werden" + +#: replication/slot.c:838 +#, c-format +msgid "cannot enable failover for a replication slot on the standby" +msgstr "Failover kann nicht für einen Replikations-Slot auf dem Standby eingeschaltet werden" + +#: replication/slot.c:969 replication/slot.c:1927 replication/slot.c:2311 #, c-format msgid "could not remove directory \"%s\"" msgstr "konnte Verzeichnis »%s« nicht löschen" -#: replication/slot.c:1145 +#: replication/slot.c:1372 #, c-format -msgid "replication slots can only be used if max_replication_slots > 0" -msgstr "Replikations-Slots können nur verwendet werden, wenn max_replication_slots > 0" +msgid "replication slots can only be used if \"max_replication_slots\" > 0" +msgstr "Replikations-Slots können nur verwendet werden, wenn »max_replication_slots« > 0" -#: replication/slot.c:1150 +#: replication/slot.c:1377 #, c-format -msgid "replication slots can only be used if wal_level >= replica" -msgstr "Replikations-Slots können nur verwendet werden, wenn wal_level >= replica" +msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" +msgstr "Replikations-Slots können nur verwendet werden, wenn »wal_level« >= replica" -#: replication/slot.c:1162 +#: replication/slot.c:1389 #, c-format msgid "permission denied to use replication slots" msgstr "keine Berechtigung, um Replikations-Slots zu verwenden" -#: replication/slot.c:1163 +#: replication/slot.c:1390 #, c-format msgid "Only roles with the %s attribute may use replication slots." msgstr "Nur Rollen mit dem %s-Attribut können Replikations-Slots verwenden." -#: replication/slot.c:1267 +#: replication/slot.c:1498 #, c-format -msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." -msgstr "" +msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu byte." +msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." +msgstr[0] "Die restart_lsn des Slots %X/%X überschreitet das Maximum um %llu Byte." +msgstr[1] "Die restart_lsn des Slots %X/%X überschreitet das Maximum um %llu Bytes." -#: replication/slot.c:1272 -#, fuzzy, c-format -#| msgid "Key %s conflicts with existing key %s." +#: replication/slot.c:1506 +#, c-format msgid "The slot conflicted with xid horizon %u." -msgstr "Schlüssel %s kollidiert mit vorhandenem Schlüssel %s." +msgstr "Der Slot kollidierte mit dem xid-Horizont %u." -#: replication/slot.c:1277 -#, fuzzy -#| msgid "logical decoding requires wal_level >= logical" -msgid "Logical decoding on standby requires wal_level >= logical on the primary server." -msgstr "logische Dekodierung erfordert wal_level >= logical" +#: replication/slot.c:1511 +msgid "Logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary server." +msgstr "Logische Dekodierung auf dem Standby-Server erfordert »wal_level« >= »logical« auf dem Primärserver." -#: replication/slot.c:1285 +#: replication/slot.c:1519 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "Prozess %d wird beendet, um Replikations-Slot »%s« freizugeben" -#: replication/slot.c:1287 -#, fuzzy, c-format -#| msgid "creating replication slot \"%s\"" +#: replication/slot.c:1521 +#, c-format msgid "invalidating obsolete replication slot \"%s\"" -msgstr "erzeuge Replikations-Slot »%s«" +msgstr "obsoleter Replikations-Slot »%s« wird ungültig gemacht" -#: replication/slot.c:1959 +#: replication/slot.c:2249 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "Replikations-Slot-Datei »%s« hat falsche magische Zahl: %u statt %u" -#: replication/slot.c:1966 +#: replication/slot.c:2256 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "Replikations-Slot-Datei »%s« hat nicht unterstützte Version %u" -#: replication/slot.c:1973 +#: replication/slot.c:2263 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "Replikations-Slot-Datei »%s« hat falsche Länge %u" -#: replication/slot.c:2009 +#: replication/slot.c:2299 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "Prüfsummenfehler bei Replikations-Slot-Datei »%s«: ist %u, sollte %u sein" -#: replication/slot.c:2043 +#: replication/slot.c:2335 +#, c-format +msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" +msgstr "logischer Replikations-Slot »%s« existiert, aber »wal_level« < »logical«" + +#: replication/slot.c:2337 +#, c-format +msgid "Change \"wal_level\" to be \"logical\" or higher." +msgstr "Ändern Sie »wal_level« in »logical« oder höher." + +#: replication/slot.c:2349 #, c-format -msgid "logical replication slot \"%s\" exists, but wal_level < logical" -msgstr "logischer Replikations-Slot »%s« existiert, aber wal_level < logical" +msgid "logical replication slot \"%s\" exists on the standby, but \"hot_standby\" = \"off\"" +msgstr "logischer Replikations-Slot »%s« existiert auf dem Standby, aber »hot_standby« = »off«" -#: replication/slot.c:2045 +#: replication/slot.c:2351 #, c-format -msgid "Change wal_level to be logical or higher." -msgstr "Ändern Sie wal_level in logical oder höher." +msgid "Change \"hot_standby\" to be \"on\"." +msgstr "Ändern Sie »hot_standby« auf »on«." -#: replication/slot.c:2049 +#: replication/slot.c:2356 #, c-format -msgid "physical replication slot \"%s\" exists, but wal_level < replica" -msgstr "physischer Replikations-Slot »%s« existiert, aber wal_level < replica" +msgid "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" +msgstr "physischer Replikations-Slot »%s« existiert, aber »wal_level« < »replica«" -#: replication/slot.c:2051 +#: replication/slot.c:2358 #, c-format -msgid "Change wal_level to be replica or higher." -msgstr "Ändern Sie wal_level in replica oder höher." +msgid "Change \"wal_level\" to be \"replica\" or higher." +msgstr "Ändern Sie »wal_level« in »replica« oder höher." -#: replication/slot.c:2085 +#: replication/slot.c:2400 #, c-format msgid "too many replication slots active before shutdown" msgstr "zu viele aktive Replikations-Slots vor dem Herunterfahren" -#: replication/slotfuncs.c:601 +#: replication/slot.c:2475 +#, c-format +msgid "\"%s\" is not a physical replication slot" +msgstr "»%s« ist kein physischer Replikations-Slot" + +#: replication/slot.c:2654 +#, c-format +msgid "replication slot \"%s\" specified in parameter \"%s\" does not exist" +msgstr "Replikations-Slot »%s«, der in Parameter »%s« angegeben ist, existiert nicht" + +#: replication/slot.c:2656 replication/slot.c:2690 replication/slot.c:2705 +#, c-format +msgid "Logical replication is waiting on the standby associated with replication slot \"%s\"." +msgstr "Logische Replikation wartet auf den Standby, der zum Replikations-Slot »%s« gehört." + +#: replication/slot.c:2658 +#, c-format +msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." +msgstr "Erzeugen Sie den Replikations-Slot »%s« oder berichtigen Sie den Parameter »%s«." + +#: replication/slot.c:2668 +#, c-format +msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" +msgstr "logischer Replikations-Slot »%s« kann nicht in Parameter »%s« angegeben werden" + +#: replication/slot.c:2670 +#, c-format +msgid "Logical replication is waiting for correction on replication slot \"%s\"." +msgstr "Logische Replikation wartet auf Korrektur bei Replikations-Slot »%s«." + +#: replication/slot.c:2672 +#, c-format +msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." +msgstr "Entfernen Sie den Replikations-Slot »%s« aus dem Parameter »%s«." + +#: replication/slot.c:2688 +#, c-format +msgid "physical replication slot \"%s\" specified in parameter \"%s\" has been invalidated" +msgstr "der physische Replikations-Slot »%s«, der in Parameter »%s« angegeben wurde, wurde ungültig gemacht" + +#: replication/slot.c:2692 +#, c-format +msgid "Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." +msgstr "Löschen Sie den Replikations-Slot »%s« und erzeugen Sie ihn neu, oder berichtigen Sie den Parameter »%s«." + +#: replication/slot.c:2703 +#, c-format +msgid "replication slot \"%s\" specified in parameter \"%s\" does not have active_pid" +msgstr "der Replikations-Slot »%s«, der in Parameter »%s« angegeben wurde, hat keine active_pid" + +#: replication/slot.c:2707 +#, c-format +msgid "Start the standby associated with the replication slot \"%s\", or amend parameter \"%s\"." +msgstr "Starten Sie den zum Replikations-Slot »%s« gehörenden Standby oder berichtigen Sie den Parameter »%s«." + +#: replication/slotfuncs.c:526 #, c-format msgid "invalid target WAL LSN" msgstr "ungültige Ziel-WAL-LSN" -#: replication/slotfuncs.c:623 +#: replication/slotfuncs.c:548 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "Replikations-Slot »%s« kann nicht vorwärtsgesetzt werden" -#: replication/slotfuncs.c:625 +#: replication/slotfuncs.c:550 #, c-format msgid "This slot has never previously reserved WAL, or it has been invalidated." msgstr "Diese Slot hat nie zuvor WAL reserviert oder er wurde ungültig gemacht." -#: replication/slotfuncs.c:641 +#: replication/slotfuncs.c:566 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "Replikations-Slot kann nicht auf %X/%X vorwärtsgesetzt werden, Minimum ist %X/%X" -#: replication/slotfuncs.c:748 +#: replication/slotfuncs.c:673 #, c-format msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "physischer Replikations-Slot »%s« kann nicht als logischer Replikations-Slot kopiert werden" -#: replication/slotfuncs.c:750 +#: replication/slotfuncs.c:675 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "logischer Replikations-Slot »%s« kann nicht als physischer Replikations-Slot kopiert werden" -#: replication/slotfuncs.c:757 +#: replication/slotfuncs.c:682 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "ein Replikations-Slot, der kein WAL reserviert, kann nicht kopiert werden" -#: replication/slotfuncs.c:834 +#: replication/slotfuncs.c:688 +#, c-format +msgid "cannot copy invalidated replication slot \"%s\"" +msgstr "ungültig gemachter Replikations-Slot »%s« kann nicht kopiert werden" + +#: replication/slotfuncs.c:780 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "konnte Replikations-Slot »%s« nicht kopieren" -#: replication/slotfuncs.c:836 +#: replication/slotfuncs.c:782 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "Der Quell-Replikations-Slot wurde während der Kopieroperation inkompatibel geändert." -#: replication/slotfuncs.c:842 +#: replication/slotfuncs.c:788 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "kann unfertigen Replikations-Slot »%s« nicht kopieren" -#: replication/slotfuncs.c:844 +#: replication/slotfuncs.c:790 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "Versuchen Sie es erneut, wenn confirmed_flush_lsn des Quell-Replikations-Slots gültig ist." -#: replication/syncrep.c:262 +#: replication/slotfuncs.c:802 +#, c-format +msgid "cannot copy replication slot \"%s\"" +msgstr "kann Replikations-Slot »%s« nicht kopieren" + +#: replication/slotfuncs.c:804 +#, c-format +msgid "The source replication slot was invalidated during the copy operation." +msgstr "Der Quell-Replikations-Slot wurde während der Kopieroperation ungültig gemacht." + +#: replication/slotfuncs.c:903 +#, c-format +msgid "replication slots can only be synchronized to a standby server" +msgstr "Replikations-Slots können nur zu einem Standby-Server synchronisiert werden" + +#: replication/syncrep.c:304 #, c-format msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" msgstr "Warten auf synchrone Replikation wird storniert and Verbindung wird abgebrochen, aufgrund von Anweisung des Administrators" -#: replication/syncrep.c:263 replication/syncrep.c:280 +#: replication/syncrep.c:305 replication/syncrep.c:322 #, c-format msgid "The transaction has already committed locally, but might not have been replicated to the standby." msgstr "Die Transaktion wurde lokal bereits committet, aber möglicherweise noch nicht zum Standby repliziert." -#: replication/syncrep.c:279 +#: replication/syncrep.c:321 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "storniere Warten auf synchrone Replikation wegen Benutzeraufforderung" -#: replication/syncrep.c:486 +#: replication/syncrep.c:528 #, c-format -msgid "standby \"%s\" is now a synchronous standby with priority %u" -msgstr "Standby »%s« ist jetzt ein synchroner Standby mit Priorität %u" +msgid "standby \"%s\" is now a synchronous standby with priority %d" +msgstr "Standby »%s« ist jetzt ein synchroner Standby mit Priorität %d" -#: replication/syncrep.c:490 +#: replication/syncrep.c:532 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "Standby »%s« ist jetzt ein Kandidat für synchroner Standby mit Quorum" -#: replication/syncrep.c:1019 +#: replication/syncrep.c:1080 #, c-format -msgid "synchronous_standby_names parser failed" -msgstr "Parser für synchronous_standby_names fehlgeschlagen" +msgid "\"synchronous_standby_names\" parser failed" +msgstr "Parser für »synchronous_standby_names« fehlgeschlagen" -#: replication/syncrep.c:1025 +#: replication/syncrep.c:1086 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "Anzahl synchroner Standbys (%d) muss größer als null sein" -#: replication/walreceiver.c:180 +#: replication/walreceiver.c:176 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "WAL-Receiver-Prozess wird abgebrochen aufgrund von Anweisung des Administrators" -#: replication/walreceiver.c:305 -#, c-format -msgid "could not connect to the primary server: %s" -msgstr "konnte nicht mit dem Primärserver verbinden: %s" - -#: replication/walreceiver.c:352 +#: replication/walreceiver.c:354 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "Datenbanksystemidentifikator unterscheidet sich zwischen Primär- und Standby-Server" -#: replication/walreceiver.c:353 +#: replication/walreceiver.c:355 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "Identifikator des Primärservers ist %s, Identifikator des Standby ist %s." -#: replication/walreceiver.c:364 +#: replication/walreceiver.c:366 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "höchste Zeitleiste %u des primären Servers liegt hinter Wiederherstellungszeitleiste %u zurück" -#: replication/walreceiver.c:417 +#: replication/walreceiver.c:419 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "WAL-Streaming vom Primärserver gestartet bei %X/%X auf Zeitleiste %u" -#: replication/walreceiver.c:421 +#: replication/walreceiver.c:423 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "WAL-Streaming neu gestartet bei %X/%X auf Zeitleiste %u" -#: replication/walreceiver.c:457 +#: replication/walreceiver.c:458 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "kann WAL-Streaming nicht fortsetzen, Wiederherstellung ist bereits beendet" -#: replication/walreceiver.c:501 +#: replication/walreceiver.c:502 #, c-format msgid "replication terminated by primary server" msgstr "Replikation wurde durch Primärserver beendet" -#: replication/walreceiver.c:502 +#: replication/walreceiver.c:503 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "WAL-Ende erreicht auf Zeitleiste %u bei %X/%X." -#: replication/walreceiver.c:592 +#: replication/walreceiver.c:593 #, c-format msgid "terminating walreceiver due to timeout" msgstr "WAL-Receiver-Prozess wird abgebrochen wegen Zeitüberschreitung" -#: replication/walreceiver.c:624 +#: replication/walreceiver.c:625 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "Primärserver enthält kein WAL mehr auf angeforderter Zeitleiste %u" -#: replication/walreceiver.c:640 replication/walreceiver.c:1066 +#: replication/walreceiver.c:641 replication/walreceiver.c:1071 #, c-format msgid "could not close WAL segment %s: %m" msgstr "konnte WAL-Segment %s nicht schließen: %m" -#: replication/walreceiver.c:759 +#: replication/walreceiver.c:760 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "hole Zeitleisten-History-Datei für Zeitleiste %u vom Primärserver" -#: replication/walreceiver.c:954 +#: replication/walreceiver.c:959 #, c-format -msgid "could not write to WAL segment %s at offset %u, length %lu: %m" -msgstr "konnte nicht in WAL-Segment %s bei Position %u, Länge %lu schreiben: %m" +msgid "could not write to WAL segment %s at offset %d, length %lu: %m" +msgstr "konnte nicht in WAL-Segment %s bei Position %d, Länge %lu schreiben: %m" -#: replication/walsender.c:519 +#: replication/walsender.c:535 #, c-format msgid "cannot use %s with a logical replication slot" msgstr "%s kann nicht mit einem logischem Replikations-Slot verwendet werden" -#: replication/walsender.c:623 storage/smgr/md.c:1526 +#: replication/walsender.c:639 storage/smgr/md.c:1735 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "konnte Positionszeiger nicht ans Ende der Datei »%s« setzen: %m" -#: replication/walsender.c:627 +#: replication/walsender.c:643 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "konnte Positionszeiger nicht den Anfang der Datei »%s« setzen: %m" -#: replication/walsender.c:704 +#: replication/walsender.c:857 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "logischer Replikations-Slot kann nicht für physische Replikation verwendet werden" -#: replication/walsender.c:770 +#: replication/walsender.c:923 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "angeforderter Startpunkt %X/%X auf Zeitleiste %u ist nicht in der History dieses Servers" -#: replication/walsender.c:773 +#: replication/walsender.c:926 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "Die History dieses Servers zweigte von Zeitleiste %u bei %X/%X ab." -#: replication/walsender.c:817 +#: replication/walsender.c:970 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "angeforderter Startpunkt %X/%X ist vor der WAL-Flush-Position dieses Servers %X/%X" -#: replication/walsender.c:1010 +#: replication/walsender.c:1164 #, c-format msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" msgstr "unbekannter Wert für CREATE_REPLICATION_SLOT-Option »%s«: »%s«" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1095 +#: replication/walsender.c:1270 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s darf nicht in einer Transaktion aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1105 +#: replication/walsender.c:1280 #, c-format msgid "%s must be called inside a transaction" msgstr "%s muss in einer Transaktion aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1111 +#: replication/walsender.c:1286 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s muss in einer Transaktion im Isolationsmodus REPEATABLE READ aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1116 +#: replication/walsender.c:1291 #, c-format -msgid "%s must be called in a read only transaction" +msgid "%s must be called in a read-only transaction" msgstr "%s muss in einer Read-Only-Transaktion aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1122 +#: replication/walsender.c:1297 #, c-format msgid "%s must be called before any query" msgstr "%s muss vor allen Anfragen aufgerufen werden" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1128 +#: replication/walsender.c:1303 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s darf nicht in einer Subtransaktion aufgerufen werden" -#: replication/walsender.c:1275 +#: replication/walsender.c:1476 #, c-format msgid "terminating walsender process after promotion" msgstr "WAL-Sender-Prozess wird nach Beförderung abgebrochen" -#: replication/walsender.c:1696 +#: replication/walsender.c:2015 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "während der WAL-Sender im Stoppmodus ist können keine neuen Befehle ausgeführt werden" -#: replication/walsender.c:1731 +#: replication/walsender.c:2050 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "im WAL-Sender für physische Replikation können keine SQL-Befehle ausgeführt werden" -#: replication/walsender.c:1764 +#: replication/walsender.c:2083 #, c-format msgid "received replication command: %s" msgstr "Replikationsbefehl empfangen: %s" -#: replication/walsender.c:1772 tcop/fastpath.c:209 tcop/postgres.c:1138 -#: tcop/postgres.c:1496 tcop/postgres.c:1736 tcop/postgres.c:2210 -#: tcop/postgres.c:2648 tcop/postgres.c:2726 +#: replication/walsender.c:2091 tcop/fastpath.c:209 tcop/postgres.c:1142 +#: tcop/postgres.c:1500 tcop/postgres.c:1752 tcop/postgres.c:2234 +#: tcop/postgres.c:2672 tcop/postgres.c:2749 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "aktuelle Transaktion wurde abgebrochen, Befehle werden bis zum Ende der Transaktion ignoriert" -#: replication/walsender.c:1914 replication/walsender.c:1949 +#: replication/walsender.c:2248 replication/walsender.c:2283 #, c-format msgid "unexpected EOF on standby connection" msgstr "unerwartetes EOF auf Standby-Verbindung" -#: replication/walsender.c:1937 +#: replication/walsender.c:2271 #, c-format msgid "invalid standby message type \"%c\"" msgstr "ungültiger Standby-Message-Typ »%c«" -#: replication/walsender.c:2026 +#: replication/walsender.c:2360 #, c-format msgid "unexpected message type \"%c\"" msgstr "unerwarteter Message-Typ »%c«" -#: replication/walsender.c:2439 +#: replication/walsender.c:2774 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "WAL-Sender-Prozess wird abgebrochen wegen Zeitüberschreitung bei der Replikation" -#: rewrite/rewriteDefine.c:111 rewrite/rewriteDefine.c:842 +#: rewrite/rewriteDefine.c:104 rewrite/rewriteDefine.c:835 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "Regel »%s« für Relation »%s« existiert bereits" -#: rewrite/rewriteDefine.c:268 rewrite/rewriteDefine.c:780 +#: rewrite/rewriteDefine.c:261 rewrite/rewriteDefine.c:773 #, c-format msgid "relation \"%s\" cannot have rules" msgstr "Relation »%s« kann keine Regeln haben" -#: rewrite/rewriteDefine.c:299 +#: rewrite/rewriteDefine.c:292 #, c-format msgid "rule actions on OLD are not implemented" msgstr "Regelaktionen für OLD sind nicht implementiert" -#: rewrite/rewriteDefine.c:300 +#: rewrite/rewriteDefine.c:293 #, c-format msgid "Use views or triggers instead." msgstr "Verwenden Sie stattdessen Sichten oder Trigger." -#: rewrite/rewriteDefine.c:304 +#: rewrite/rewriteDefine.c:297 #, c-format msgid "rule actions on NEW are not implemented" msgstr "Regelaktionen für NEW sind nicht implementiert" -#: rewrite/rewriteDefine.c:305 +#: rewrite/rewriteDefine.c:298 #, c-format msgid "Use triggers instead." msgstr "Verwenden Sie stattdessen Trigger." -#: rewrite/rewriteDefine.c:319 +#: rewrite/rewriteDefine.c:312 #, c-format msgid "relation \"%s\" cannot have ON SELECT rules" msgstr "Relation »%s« kann keine ON-SELECT-Regeln haben" -#: rewrite/rewriteDefine.c:329 +#: rewrite/rewriteDefine.c:322 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "INSTEAD-NOTHING-Regeln für SELECT sind nicht implementiert" -#: rewrite/rewriteDefine.c:330 +#: rewrite/rewriteDefine.c:323 #, c-format msgid "Use views instead." msgstr "Verwenden Sie stattdessen Sichten." -#: rewrite/rewriteDefine.c:338 +#: rewrite/rewriteDefine.c:331 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "mehrere Regelaktionen für SELECT-Regeln sind nicht implementiert" -#: rewrite/rewriteDefine.c:348 +#: rewrite/rewriteDefine.c:341 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "Regeln für SELECT müssen als Aktion INSTEAD SELECT haben" -#: rewrite/rewriteDefine.c:356 +#: rewrite/rewriteDefine.c:349 #, c-format msgid "rules on SELECT must not contain data-modifying statements in WITH" msgstr "Regeln für SELECT dürfen keine datenmodifizierenden Anweisungen in WITH enthalten" -#: rewrite/rewriteDefine.c:364 +#: rewrite/rewriteDefine.c:357 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "Ereignisqualifikationen sind nicht implementiert für SELECT-Regeln" -#: rewrite/rewriteDefine.c:391 +#: rewrite/rewriteDefine.c:384 #, c-format msgid "\"%s\" is already a view" msgstr "»%s« ist bereits eine Sicht" -#: rewrite/rewriteDefine.c:415 +#: rewrite/rewriteDefine.c:408 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "Sicht-Regel für »%s« muss »%s« heißen" -#: rewrite/rewriteDefine.c:442 +#: rewrite/rewriteDefine.c:435 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "Regel kann nicht mehrere RETURNING-Listen enthalten" -#: rewrite/rewriteDefine.c:447 +#: rewrite/rewriteDefine.c:440 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "RETURNING-Listen werden in Regeln mit Bedingung nicht unterstützt" -#: rewrite/rewriteDefine.c:451 +#: rewrite/rewriteDefine.c:444 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "RETURNING-Listen werden nur in INSTEAD-Regeln unterstützt" -#: rewrite/rewriteDefine.c:465 +#: rewrite/rewriteDefine.c:458 #, c-format msgid "non-view rule for \"%s\" must not be named \"%s\"" msgstr "Nicht-Sicht-Regel für »%s« darf nicht »%s« heißen" -#: rewrite/rewriteDefine.c:539 +#: rewrite/rewriteDefine.c:532 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "Targetliste von SELECT-Regel hat zu viele Einträge" -#: rewrite/rewriteDefine.c:540 +#: rewrite/rewriteDefine.c:533 #, c-format msgid "RETURNING list has too many entries" msgstr "RETURNING-Liste hat zu viele Einträge" -#: rewrite/rewriteDefine.c:567 +#: rewrite/rewriteDefine.c:560 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "kann Relation mit gelöschten Spalten nicht in Sicht umwandeln" -#: rewrite/rewriteDefine.c:568 +#: rewrite/rewriteDefine.c:561 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "für eine Relation mit gelöschten Spalten kann keine RETURNING-Liste erzeugt werden" -#: rewrite/rewriteDefine.c:574 +#: rewrite/rewriteDefine.c:567 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "Spaltenname in Targeteintrag %d von SELECT-Regel unterscheidet sich von Spalte »%s«" -#: rewrite/rewriteDefine.c:576 +#: rewrite/rewriteDefine.c:569 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "SELECT-Targeteintrag heißt »%s«." -#: rewrite/rewriteDefine.c:585 +#: rewrite/rewriteDefine.c:578 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "Typ von Targeteintrag %d von SELECT-Regel unterscheidet sich von Spalte »%s«" -#: rewrite/rewriteDefine.c:587 +#: rewrite/rewriteDefine.c:580 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "Eintrag %d in RETURNING-Liste hat anderen Typ als Spalte »%s«" -#: rewrite/rewriteDefine.c:590 rewrite/rewriteDefine.c:614 +#: rewrite/rewriteDefine.c:583 rewrite/rewriteDefine.c:607 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "SELECT-Targeteintrag hat Typ %s, aber Spalte hat Typ %s." -#: rewrite/rewriteDefine.c:593 rewrite/rewriteDefine.c:618 +#: rewrite/rewriteDefine.c:586 rewrite/rewriteDefine.c:611 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "Eintrag in RETURNING-Liste hat Typ %s, aber Spalte hat Typ %s." -#: rewrite/rewriteDefine.c:609 +#: rewrite/rewriteDefine.c:602 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "Größe von Targeteintrag %d von SELECT-Regel unterscheidet sich von Spalte »%s«" -#: rewrite/rewriteDefine.c:611 +#: rewrite/rewriteDefine.c:604 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "Eintrag %d in RETURNING-Liste hat andere Größe als Spalte »%s«" -#: rewrite/rewriteDefine.c:628 +#: rewrite/rewriteDefine.c:621 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "Targetliste von SELECT-Regeln hat zu wenige Einträge" -#: rewrite/rewriteDefine.c:629 +#: rewrite/rewriteDefine.c:622 #, c-format msgid "RETURNING list has too few entries" msgstr "RETURNING-Liste hat zu wenige Einträge" -#: rewrite/rewriteDefine.c:718 rewrite/rewriteDefine.c:833 -#: rewrite/rewriteSupport.c:109 +#: rewrite/rewriteDefine.c:711 rewrite/rewriteDefine.c:826 +#: rewrite/rewriteSupport.c:108 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "Regel »%s« für Relation »%s« existiert nicht" -#: rewrite/rewriteDefine.c:852 +#: rewrite/rewriteDefine.c:845 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "Umbenennen einer ON-SELECT-Regel ist nicht erlaubt" -#: rewrite/rewriteHandler.c:583 +#: rewrite/rewriteHandler.c:588 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "WITH-Anfragename »%s« erscheint sowohl in der Regelaktion als auch in der umzuschreibenden Anfrage" -#: rewrite/rewriteHandler.c:610 +#: rewrite/rewriteHandler.c:615 #, c-format msgid "INSERT ... SELECT rule actions are not supported for queries having data-modifying statements in WITH" msgstr "INSERT ... SELECT-Regelaktionen werden für Anfrangen mit datenmodifizierenden Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:663 +#: rewrite/rewriteHandler.c:668 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "RETURNING-Listen können nicht in mehreren Regeln auftreten" -#: rewrite/rewriteHandler.c:895 rewrite/rewriteHandler.c:934 +#: rewrite/rewriteHandler.c:900 rewrite/rewriteHandler.c:939 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "kann keinen Wert außer DEFAULT in Spalte »%s« einfügen" -#: rewrite/rewriteHandler.c:897 rewrite/rewriteHandler.c:963 +#: rewrite/rewriteHandler.c:902 rewrite/rewriteHandler.c:968 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "Spalte »%s« ist eine Identitätsspalte, die als GENERATED ALWAYS definiert ist." -#: rewrite/rewriteHandler.c:899 +#: rewrite/rewriteHandler.c:904 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Verwenden Sie OVERRIDING SYSTEM VALUE, um diese Einschränkung außer Kraft zu setzen." -#: rewrite/rewriteHandler.c:961 rewrite/rewriteHandler.c:969 +#: rewrite/rewriteHandler.c:966 rewrite/rewriteHandler.c:974 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "Spalte »%s« kann nur auf DEFAULT aktualisiert werden" -#: rewrite/rewriteHandler.c:1116 rewrite/rewriteHandler.c:1134 +#: rewrite/rewriteHandler.c:1109 rewrite/rewriteHandler.c:1127 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "mehrere Zuweisungen zur selben Spalte »%s«" -#: rewrite/rewriteHandler.c:2119 rewrite/rewriteHandler.c:4040 +#: rewrite/rewriteHandler.c:1682 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE wird für Relationen mit Regeln nicht unterstützt." + +#: rewrite/rewriteHandler.c:1722 rewrite/rewriteHandler.c:3262 +#, c-format +msgid "access to non-system view \"%s\" is restricted" +msgstr "Zugriff auf Nicht-System-Sicht »%s« ist beschränkt" + +#: rewrite/rewriteHandler.c:2122 rewrite/rewriteHandler.c:4254 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "unendliche Rekursion entdeckt in Regeln für Relation »%s«" -#: rewrite/rewriteHandler.c:2204 +#: rewrite/rewriteHandler.c:2227 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "unendliche Rekursion entdeckt in Policys für Relation »%s«" -#: rewrite/rewriteHandler.c:2524 +#: rewrite/rewriteHandler.c:2589 msgid "Junk view columns are not updatable." msgstr "Junk-Sichtspalten sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2529 +#: rewrite/rewriteHandler.c:2594 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Sichtspalten, die nicht Spalten ihrer Basisrelation sind, sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2532 +#: rewrite/rewriteHandler.c:2597 msgid "View columns that refer to system columns are not updatable." msgstr "Sichtspalten, die auf Systemspalten verweisen, sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2535 +#: rewrite/rewriteHandler.c:2600 msgid "View columns that return whole-row references are not updatable." msgstr "Sichtspalten, die Verweise auf ganze Zeilen zurückgeben, sind nicht aktualisierbar." -#: rewrite/rewriteHandler.c:2596 +#: rewrite/rewriteHandler.c:2661 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Sichten, die DISTINCT enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2599 +#: rewrite/rewriteHandler.c:2664 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Sichten, die GROUP BY enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2602 +#: rewrite/rewriteHandler.c:2667 msgid "Views containing HAVING are not automatically updatable." msgstr "Sichten, die HAVING enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2605 +#: rewrite/rewriteHandler.c:2670 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Sichten, die UNION, INTERSECT oder EXCEPT enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2608 +#: rewrite/rewriteHandler.c:2673 msgid "Views containing WITH are not automatically updatable." msgstr "Sichten, die WITH enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2611 +#: rewrite/rewriteHandler.c:2676 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Sichten, die LIMIT oder OFFSET enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2623 +#: rewrite/rewriteHandler.c:2688 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Sichten, die Aggregatfunktionen zurückgeben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2626 +#: rewrite/rewriteHandler.c:2691 msgid "Views that return window functions are not automatically updatable." msgstr "Sichten, die Fensterfunktionen zurückgeben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2629 +#: rewrite/rewriteHandler.c:2694 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Sichten, die Funktionen mit Ergebnismenge zurückgeben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2636 rewrite/rewriteHandler.c:2640 -#: rewrite/rewriteHandler.c:2648 +#: rewrite/rewriteHandler.c:2701 rewrite/rewriteHandler.c:2705 +#: rewrite/rewriteHandler.c:2713 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "Sichten, die nicht aus einer einzigen Tabelle oder Sicht lesen, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2651 +#: rewrite/rewriteHandler.c:2716 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Sichten, die TABLESAMPLE enthalten, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:2675 +#: rewrite/rewriteHandler.c:2740 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Sichten, die keine aktualisierbaren Spalten haben, sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:3155 +#: rewrite/rewriteHandler.c:3121 rewrite/rewriteHandler.c:3156 +#, c-format +msgid "cannot insert into view \"%s\"" +msgstr "kann nicht in Sicht »%s« einfügen" + +#: rewrite/rewriteHandler.c:3124 +#, c-format +msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." +msgstr "Um Einfügen in die Sicht zu ermöglichen, richten Sie einen INSTEAD OF INSERT Trigger oder eine ON INSERT DO INSTEAD Regel ohne Bedingung ein." + +#: rewrite/rewriteHandler.c:3129 rewrite/rewriteHandler.c:3165 +#, c-format +msgid "cannot update view \"%s\"" +msgstr "kann Sicht »%s« nicht aktualisieren" + +#: rewrite/rewriteHandler.c:3132 +#, c-format +msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." +msgstr "Um Aktualisieren der Sicht zu ermöglichen, richten Sie einen INSTEAD OF UPDATE Trigger oder eine ON UPDATE DO INSTEAD Regel ohne Bedingung ein." + +#: rewrite/rewriteHandler.c:3137 rewrite/rewriteHandler.c:3174 +#, c-format +msgid "cannot delete from view \"%s\"" +msgstr "kann nicht aus Sicht »%s« löschen" + +#: rewrite/rewriteHandler.c:3140 +#, c-format +msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." +msgstr "Um Löschen aus der Sicht zu ermöglichen, richten Sie einen INSTEAD OF DELETE Trigger oder eine ON DELETE DO INSTEAD Regel ohne Bedingung ein." + +#: rewrite/rewriteHandler.c:3159 +#, c-format +msgid "To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT trigger." +msgstr "Um Einfügen in die Sicht mit MERGE zu ermöglichen, richten Sie einen INSTEAD OF INSERT Trigger ein." + +#: rewrite/rewriteHandler.c:3168 +#, c-format +msgid "To enable updating the view using MERGE, provide an INSTEAD OF UPDATE trigger." +msgstr "Um Aktualisieren der Sicht mit MERGE zu ermöglichen, richten Sie einen INSTEAD OF UPDATE Trigger ein." + +#: rewrite/rewriteHandler.c:3177 +#, c-format +msgid "To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE trigger." +msgstr "Um Löschen aus der Sicht zu ermöglichen, richten Sie einen INSTEAD OF DELETE Trigger ein." + +#: rewrite/rewriteHandler.c:3352 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "kann nicht in Spalte »%s« von Sicht »%s« einfügen" -#: rewrite/rewriteHandler.c:3163 +#: rewrite/rewriteHandler.c:3360 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "kann Spalte »%s« von Sicht »%s« nicht aktualisieren" -#: rewrite/rewriteHandler.c:3667 +#: rewrite/rewriteHandler.c:3368 +#, c-format +msgid "cannot merge into column \"%s\" of view \"%s\"" +msgstr "kann nicht in Spalte »%s« von Sicht »%s« mergen" + +#: rewrite/rewriteHandler.c:3396 +#, c-format +msgid "cannot merge into view \"%s\"" +msgstr "kann nicht in Sicht »%s« mergen" + +#: rewrite/rewriteHandler.c:3398 +#, c-format +msgid "MERGE is not supported for views with INSTEAD OF triggers for some actions but not all." +msgstr "MERGE wird nicht unterstützt für Sichten mit INSTEAD-OF-Trigger für einige Aktionen aber nicht für alle." + +#: rewrite/rewriteHandler.c:3399 +#, c-format +msgid "To enable merging into the view, either provide a full set of INSTEAD OF triggers or drop the existing INSTEAD OF triggers." +msgstr "Um Mergen in die Sicht zu ermöglichen, richten Sie entweder einen vollen Satz an INSTEAD-OF-Triggern ein oder löschen Sie die bestehenden INSTEAD-OF-Trigger." + +#: rewrite/rewriteHandler.c:3912 #, c-format msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" msgstr "DO-INSTEAD-NOTIFY-Regeln werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3678 +#: rewrite/rewriteHandler.c:3923 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "DO-INSTEAD-NOTHING-Regeln werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3692 +#: rewrite/rewriteHandler.c:3937 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "DO-INSTEAD-Regeln mit Bedingung werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3696 +#: rewrite/rewriteHandler.c:3941 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "DO-ALSO-Regeln werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3701 +#: rewrite/rewriteHandler.c:3946 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "DO-INSTEAD-Regeln mit mehreren Anweisungen werden für datenmodifizierende Anweisungen in WITH nicht unterstützt" -#: rewrite/rewriteHandler.c:3968 rewrite/rewriteHandler.c:3976 -#: rewrite/rewriteHandler.c:3984 -#, c-format +#: rewrite/rewriteHandler.c:4206 msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "Sichten mit DO-INSTEAD-Regeln mit Bedingung sind nicht automatisch aktualisierbar." -#: rewrite/rewriteHandler.c:4089 +#: rewrite/rewriteHandler.c:4303 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "INSERT RETURNING kann in Relation »%s« nicht ausgeführt werden" -#: rewrite/rewriteHandler.c:4091 +#: rewrite/rewriteHandler.c:4305 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "Sie benötigen eine ON INSERT DO INSTEAD Regel ohne Bedingung, mit RETURNING-Klausel." -#: rewrite/rewriteHandler.c:4096 +#: rewrite/rewriteHandler.c:4310 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "UPDATE RETURNING kann in Relation »%s« nicht ausgeführt werden" -#: rewrite/rewriteHandler.c:4098 +#: rewrite/rewriteHandler.c:4312 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "Sie benötigen eine ON UPDATE DO INSTEAD Regel ohne Bedingung, mit RETURNING-Klausel." -#: rewrite/rewriteHandler.c:4103 +#: rewrite/rewriteHandler.c:4317 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "DELETE RETURNING kann in Relation »%s« nicht ausgeführt werden" -#: rewrite/rewriteHandler.c:4105 +#: rewrite/rewriteHandler.c:4319 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "Sie benötigen eine ON DELETE DO INSTEAD Regel ohne Bedingung, mit RETURNING-Klausel." -#: rewrite/rewriteHandler.c:4123 +#: rewrite/rewriteHandler.c:4337 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "INSERT mit ON-CONFLICT-Klausel kann nicht mit Tabelle verwendet werden, die INSERT- oder UPDATE-Regeln hat" -#: rewrite/rewriteHandler.c:4180 +#: rewrite/rewriteHandler.c:4394 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH kann nicht in einer Anfrage verwendet werden, die durch Regeln in mehrere Anfragen umgeschrieben wird" -#: rewrite/rewriteManip.c:1075 +#: rewrite/rewriteManip.c:1084 #, c-format msgid "conditional utility statements are not implemented" msgstr "Utility-Anweisungen mit Bedingung sind nicht implementiert" -#: rewrite/rewriteManip.c:1419 +#: rewrite/rewriteManip.c:1431 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "WHERE CURRENT OF mit einer Sicht ist nicht implementiert" -#: rewrite/rewriteManip.c:1754 +#: rewrite/rewriteManip.c:1767 #, c-format msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" msgstr "NEW-Variablen in ON UPDATE-Regeln können nicht auf Spalten verweisen, die Teil einer Mehrfachzuweisung in dem UPDATE-Befehl sind" @@ -21742,117 +22494,117 @@ msgstr "NEW-Variablen in ON UPDATE-Regeln können nicht auf Spalten verweisen, d msgid "with a SEARCH or CYCLE clause, the recursive reference to WITH query \"%s\" must be at the top level of its right-hand SELECT" msgstr "mit einer SEARCH- oder CYCLE-Klausel muss der rekursive Verweis auf WITH-Anfrage »%s« auf der obersten Ebene ihres rechten SELECT sein" -#: scan.l:482 +#: scan.l:497 msgid "unterminated /* comment" msgstr "/*-Kommentar nicht abgeschlossen" -#: scan.l:502 +#: scan.l:517 msgid "unterminated bit string literal" msgstr "Bitkettenkonstante nicht abgeschlossen" -#: scan.l:516 +#: scan.l:531 msgid "unterminated hexadecimal string literal" msgstr "hexadezimale Zeichenkette nicht abgeschlossen" -#: scan.l:566 +#: scan.l:581 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "unsichere Verwendung von Zeichenkette mit Unicode-Escapes" -#: scan.l:567 +#: scan.l:582 #, c-format -msgid "String constants with Unicode escapes cannot be used when standard_conforming_strings is off." -msgstr "Zeichenketten mit Unicode-Escapes können nicht verwendet werden, wenn standard_conforming_strings aus ist." +msgid "String constants with Unicode escapes cannot be used when \"standard_conforming_strings\" is off." +msgstr "Zeichenketten mit Unicode-Escapes können nicht verwendet werden, wenn »standard_conforming_strings« aus ist." -#: scan.l:628 +#: scan.l:643 msgid "unhandled previous state in xqs" msgstr "unbehandelter vorheriger Zustand in xqs" -#: scan.l:702 +#: scan.l:717 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "Unicode-Escapes müssen \\uXXXX oder \\UXXXXXXXX sein." -#: scan.l:713 +#: scan.l:728 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "unsichere Verwendung von \\' in Zeichenkettenkonstante" -#: scan.l:714 +#: scan.l:729 #, c-format msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." msgstr "Verwenden Sie '', um Quotes in Zeichenketten zu schreiben. \\' ist in bestimmten Client-seitigen Kodierungen unsicher." -#: scan.l:786 +#: scan.l:801 msgid "unterminated dollar-quoted string" msgstr "Dollar-Quotes nicht abgeschlossen" -#: scan.l:803 scan.l:813 +#: scan.l:818 scan.l:828 msgid "zero-length delimited identifier" msgstr "Bezeichner in Anführungszeichen hat Länge null" -#: scan.l:824 syncrep_scanner.l:101 +#: scan.l:839 syncrep_scanner.l:101 msgid "unterminated quoted identifier" msgstr "Bezeichner in Anführungszeichen nicht abgeschlossen" -#: scan.l:987 +#: scan.l:1002 msgid "operator too long" msgstr "Operator zu lang" -#: scan.l:1000 +#: scan.l:1015 msgid "trailing junk after parameter" msgstr "Müll folgt auf Parameter" -#: scan.l:1021 +#: scan.l:1036 msgid "invalid hexadecimal integer" msgstr "ungültige hexadezimale Zahl" -#: scan.l:1025 +#: scan.l:1040 msgid "invalid octal integer" msgstr "ungültige oktale Zahl" -#: scan.l:1029 +#: scan.l:1044 msgid "invalid binary integer" msgstr "ungültige binäre Zahl" #. translator: %s is typically the translation of "syntax error" -#: scan.l:1236 +#: scan.l:1239 #, c-format msgid "%s at end of input" msgstr "%s am Ende der Eingabe" #. translator: first %s is typically the translation of "syntax error" -#: scan.l:1244 +#: scan.l:1247 #, c-format msgid "%s at or near \"%s\"" msgstr "%s bei »%s«" -#: scan.l:1434 +#: scan.l:1439 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "nicht standardkonforme Verwendung von \\' in Zeichenkettenkonstante" -#: scan.l:1435 +#: scan.l:1440 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "Verwenden Sie '', um Quotes in Zeichenketten zu schreiben, oder verwenden Sie die Syntax für Escape-Zeichenketten (E'...')." -#: scan.l:1444 +#: scan.l:1449 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "nicht standardkonforme Verwendung von \\\\ in Zeichenkettenkonstante" -#: scan.l:1445 +#: scan.l:1450 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "Verwenden Sie die Syntax für Escape-Zeichenketten für Backslashes, z.B. E'\\\\'." -#: scan.l:1459 +#: scan.l:1464 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "nicht standardkonforme Verwendung von Escape in Zeichenkettenkonstante" -#: scan.l:1460 +#: scan.l:1465 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Verwenden Sie die Syntax für Escape-Zeichenketten, z.B. E'\\r\\n'." @@ -21883,72 +22635,67 @@ msgstr "unbekannter Snowball-Parameter: »%s«" msgid "missing Language parameter" msgstr "Parameter »Language« fehlt" -#: statistics/extended_stats.c:179 +#: statistics/extended_stats.c:176 #, c-format msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "Statistikobjekt »%s.%s« konnte für Relation »%s.%s« nicht berechnet werden" -#: statistics/mcv.c:1372 +#: statistics/mcv.c:1368 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "Funktion, die einen Record zurückgibt, in einem Zusammenhang aufgerufen, der Typ record nicht verarbeiten kann" -#: storage/buffer/bufmgr.c:612 storage/buffer/bufmgr.c:769 +#: storage/buffer/bufmgr.c:649 storage/buffer/bufmgr.c:805 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "auf temporäre Tabellen anderer Sitzungen kann nicht zugegriffen werden" -#: storage/buffer/bufmgr.c:1137 +#: storage/buffer/bufmgr.c:1532 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "ungültige Seite in Block %u von Relation %s; fülle Seite mit Nullen" -#: storage/buffer/bufmgr.c:1931 storage/buffer/localbuf.c:359 +#: storage/buffer/bufmgr.c:2277 storage/buffer/localbuf.c:361 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "kann Relation %s nicht auf über %u Blöcke erweitern" -#: storage/buffer/bufmgr.c:1998 +#: storage/buffer/bufmgr.c:2348 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "unerwartete Daten hinter Dateiende in Block %u von Relation %s" -#: storage/buffer/bufmgr.c:2000 +#: storage/buffer/bufmgr.c:2350 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Das scheint mit fehlerhaften Kernels vorzukommen; Sie sollten eine Systemaktualisierung in Betracht ziehen." -#: storage/buffer/bufmgr.c:5219 +#: storage/buffer/bufmgr.c:5654 #, c-format msgid "could not write block %u of %s" msgstr "konnte Block %u von %s nicht schreiben" -#: storage/buffer/bufmgr.c:5221 +#: storage/buffer/bufmgr.c:5656 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Mehrere Fehlschläge --- Schreibfehler ist möglicherweise dauerhaft." -#: storage/buffer/bufmgr.c:5243 storage/buffer/bufmgr.c:5263 +#: storage/buffer/bufmgr.c:5678 storage/buffer/bufmgr.c:5698 #, c-format msgid "writing block %u of relation %s" msgstr "schreibe Block %u von Relation %s" -#: storage/buffer/bufmgr.c:5593 -#, c-format -msgid "snapshot too old" -msgstr "Snapshot zu alt" - -#: storage/buffer/localbuf.c:219 +#: storage/buffer/localbuf.c:220 #, c-format msgid "no empty local buffer available" msgstr "kein leerer lokaler Puffer verfügbar" -#: storage/buffer/localbuf.c:592 +#: storage/buffer/localbuf.c:597 #, c-format msgid "cannot access temporary tables during a parallel operation" msgstr "während einer parallelen Operation kann nicht auf temporäre Tabellen zugegriffen werden" -#: storage/buffer/localbuf.c:699 +#: storage/buffer/localbuf.c:712 #, c-format msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." msgstr "»temp_buffers« kann nicht geändert werden, nachdem in der Sitzung auf temporäre Tabellen zugriffen wurde." @@ -21968,151 +22715,156 @@ msgstr "konnte nicht aus File-Set »%s« lesen: es wurden nur %zu von %zu Bytes msgid "could not read from temporary file: read only %zu of %zu bytes" msgstr "konnte nicht aus temporärer Datei lesen: es wurden nur %zu von %zu Bytes gelesen" -#: storage/file/buffile.c:774 storage/file/buffile.c:895 +#: storage/file/buffile.c:774 storage/file/buffile.c:877 #, c-format msgid "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" msgstr "konnte Größe von temporärer Datei »%s« von BufFile »%s« nicht bestimmen: %m" -#: storage/file/buffile.c:974 +#: storage/file/buffile.c:956 #, c-format msgid "could not delete fileset \"%s\": %m" msgstr "konnte Fileset »%s« nicht löschen: %m" -#: storage/file/buffile.c:992 storage/smgr/md.c:335 storage/smgr/md.c:1038 +#: storage/file/buffile.c:974 storage/smgr/md.c:336 storage/smgr/md.c:1194 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "kann Datei »%s« nicht kürzen: %m" -#: storage/file/fd.c:537 storage/file/fd.c:609 storage/file/fd.c:645 +#: storage/file/fd.c:583 storage/file/fd.c:655 storage/file/fd.c:691 #, c-format msgid "could not flush dirty data: %m" msgstr "konnte schmutzige Daten nicht flushen: %m" -#: storage/file/fd.c:567 +#: storage/file/fd.c:613 #, c-format msgid "could not determine dirty data size: %m" msgstr "konnte Größe der schmutzigen Daten nicht bestimmen: %m" -#: storage/file/fd.c:619 +#: storage/file/fd.c:665 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "munmap() fehlgeschlagen beim Flushen von Daten: %m" -#: storage/file/fd.c:937 +#: storage/file/fd.c:983 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit fehlgeschlagen: %m" -#: storage/file/fd.c:1027 +#: storage/file/fd.c:1073 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "nicht genug Dateideskriptoren verfügbar, um Serverprozess zu starten" -#: storage/file/fd.c:1028 +#: storage/file/fd.c:1074 #, c-format msgid "System allows %d, server needs at least %d." msgstr "System erlaubt %d, Server benötigt mindestens %d." -#: storage/file/fd.c:1116 storage/file/fd.c:2565 storage/file/fd.c:2674 -#: storage/file/fd.c:2825 +#: storage/file/fd.c:1162 storage/file/fd.c:2618 storage/file/fd.c:2727 +#: storage/file/fd.c:2878 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "keine Dateideskriptoren mehr: %m; freigeben und nochmal versuchen" -#: storage/file/fd.c:1490 +#: storage/file/fd.c:1536 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "temporäre Datei: Pfad »%s«, Größe %lu" -#: storage/file/fd.c:1629 +#: storage/file/fd.c:1675 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "konnte temporäres Verzeichnis »%s« nicht erzeugen: %m" -#: storage/file/fd.c:1636 +#: storage/file/fd.c:1682 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "konnte temporäres Unterverzeichnis »%s« nicht erzeugen: %m" -#: storage/file/fd.c:1833 +#: storage/file/fd.c:1879 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht erzeugen: %m" -#: storage/file/fd.c:1869 +#: storage/file/fd.c:1915 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht öffnen: %m" -#: storage/file/fd.c:1910 +#: storage/file/fd.c:1956 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht löschen: %m" -#: storage/file/fd.c:1998 +#: storage/file/fd.c:2044 #, c-format msgid "could not delete file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" -#: storage/file/fd.c:2185 +#: storage/file/fd.c:2234 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "Größe der temporären Datei überschreitet temp_file_limit (%dkB)" -#: storage/file/fd.c:2541 storage/file/fd.c:2600 +#: storage/file/fd.c:2594 storage/file/fd.c:2653 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "maxAllocatedDescs (%d) überschritten beim Versuch, die Datei »%s« zu öffnen" -#: storage/file/fd.c:2645 +#: storage/file/fd.c:2698 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "maxAllocatedDescs (%d) überschritten beim Versuch, den Befehl »%s« auszuführen" -#: storage/file/fd.c:2801 +#: storage/file/fd.c:2854 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "maxAllocatedDescs (%d) überschritten beim Versuch, das Verzeichnis »%s« zu öffnen" -#: storage/file/fd.c:3331 +#: storage/file/fd.c:3384 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "unerwartete Datei im Verzeichnis für temporäre Dateien gefunden: »%s«" -#: storage/file/fd.c:3449 +#: storage/file/fd.c:3502 #, c-format msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" msgstr "synchronisiere Datenverzeichnis (syncfs), abgelaufene Zeit: %ld.%02d s, aktueller Pfad: %s" -#: storage/file/fd.c:3463 -#, c-format -msgid "could not synchronize file system for file \"%s\": %m" -msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" - -#: storage/file/fd.c:3676 +#: storage/file/fd.c:3729 #, c-format msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "synchronisiere Datenverzeichnis (pre-fsync), abgelaufene Zeit: %ld.%02d s, aktueller Pfad: %s" -#: storage/file/fd.c:3708 +#: storage/file/fd.c:3761 #, c-format msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "synchronisiere Datenverzeichnis (fsync), abgelaufene Zeit: %ld.%02d s, aktueller Pfad: %s" -#: storage/file/fd.c:3897 +#: storage/file/fd.c:3950 #, c-format -msgid "debug_io_direct is not supported on this platform." +msgid "\"debug_io_direct\" is not supported on this platform." msgstr "debug_io_direct wird auf dieser Plattform nicht unterstützt." -#: storage/file/fd.c:3944 +#: storage/file/fd.c:3964 +#, c-format +msgid "Invalid list syntax in parameter \"%s\"" +msgstr "Ungültige Listensyntax für Parameter »%s«" + +#: storage/file/fd.c:3984 +#, c-format +msgid "Invalid option \"%s\"" +msgstr "Ungültige Option »%s«" + +#: storage/file/fd.c:3997 #, c-format -msgid "debug_io_direct is not supported for WAL because XLOG_BLCKSZ is too small" -msgstr "debug_io_direct wird für WAL nicht unterstützt, weil XLOG_BLCKSZ zu klein ist" +msgid "\"debug_io_direct\" is not supported for WAL because XLOG_BLCKSZ is too small" +msgstr "»debug_io_direct« wird für WAL nicht unterstützt, weil XLOG_BLCKSZ zu klein ist" -#: storage/file/fd.c:3951 +#: storage/file/fd.c:4004 #, c-format -msgid "debug_io_direct is not supported for data because BLCKSZ is too small" -msgstr "debug_io_direct wird für Daten nicht unterstützt, weil BLCKSZ zu klein ist" +msgid "\"debug_io_direct\" is not supported for data because BLCKSZ is too small" +msgstr "»debug_io_direct« wird für Daten nicht unterstützt, weil BLCKSZ zu klein ist" #: storage/file/reinit.c:145 #, c-format @@ -22124,22 +22876,22 @@ msgstr "setze ungeloggte Relationen zurück (init), abgelaufene Zeit: %ld.%02d s msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" msgstr "setze ungeloggte Relationen zurück (cleanup), abgelaufene Zeit: %ld.%02d s, aktueller Pfad: %s" -#: storage/file/sharedfileset.c:79 +#: storage/file/sharedfileset.c:73 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "konnte nicht an ein SharedFileSet anbinden, das schon zerstört ist" -#: storage/ipc/dsm.c:352 +#: storage/ipc/dsm.c:379 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "Kontrollsegment von dynamischem Shared Memory ist verfälscht" -#: storage/ipc/dsm.c:417 +#: storage/ipc/dsm.c:444 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "Kontrollsegment von dynamischem Shared Memory ist ungültig" -#: storage/ipc/dsm.c:599 +#: storage/ipc/dsm.c:626 #, c-format msgid "too many dynamic shared memory segments" msgstr "zu viele dynamische Shared-Memory-Segmente" @@ -22199,73 +22951,99 @@ msgstr "konnte Shared-Memory-Segment »%s« nicht schließen: %m" msgid "could not duplicate handle for \"%s\": %m" msgstr "konnte Handle für »%s« nicht duplizieren: %m" -#: storage/ipc/procarray.c:3796 +#: storage/ipc/dsm_registry.c:142 #, c-format -msgid "database \"%s\" is being used by prepared transactions" -msgstr "Datenbank »%s« wird von vorbereiteten Transaktionen verwendet" +msgid "DSM segment name cannot be empty" +msgstr "DSM-Segmentname kann nicht leer sein" + +#: storage/ipc/dsm_registry.c:146 +#, c-format +msgid "DSM segment name too long" +msgstr "DSN-Segmentname zu lang" + +#: storage/ipc/dsm_registry.c:150 +#, c-format +msgid "DSM segment size must be nonzero" +msgstr "DSM-Segmentgröße darf nicht null sein" + +#: storage/ipc/dsm_registry.c:176 +#, c-format +msgid "requested DSM segment size does not match size of existing segment" +msgstr "angeforderte DSM-Segmentgröße stimmt nicht mit der Größe des existierenden Segments überein" -#: storage/ipc/procarray.c:3828 +#: storage/ipc/procarray.c:488 storage/lmgr/proc.c:357 +#: tcop/backend_startup.c:304 #, c-format -msgid "must be a superuser to terminate superuser process" -msgstr "nur Superuser können Prozesse eines Superusers beenden" +msgid "sorry, too many clients already" +msgstr "tut mir leid, schon zu viele Verbindungen" + +#: storage/ipc/procarray.c:3857 +#, c-format +msgid "database \"%s\" is being used by prepared transactions" +msgstr "Datenbank »%s« wird von vorbereiteten Transaktionen verwendet" -#: storage/ipc/procarray.c:3835 storage/ipc/signalfuncs.c:230 -#: storage/ipc/signalfuncs.c:237 +#: storage/ipc/procarray.c:3893 storage/ipc/procarray.c:3901 +#: storage/ipc/signalfuncs.c:235 storage/ipc/signalfuncs.c:242 #, c-format msgid "permission denied to terminate process" msgstr "keine Berechtigung, um Prozess zu beenden" -#: storage/ipc/procarray.c:3836 storage/ipc/signalfuncs.c:238 +#: storage/ipc/procarray.c:3894 storage/ipc/signalfuncs.c:236 +#, c-format +msgid "Only roles with the %s attribute may terminate processes of roles with the %s attribute." +msgstr "Nur Rollen mit dem %s-Attribut können Prozesse von Rollen mit dem %s-Attribut beenden." + +#: storage/ipc/procarray.c:3902 storage/ipc/signalfuncs.c:243 #, c-format msgid "Only roles with privileges of the role whose process is being terminated or with privileges of the \"%s\" role may terminate this process." msgstr "Nur Rollen mit den Privilegien der Rolle deren Prozess beendet werden soll oder den Privilegien der Rolle »%s« können diesen Prozess beenden." -#: storage/ipc/procsignal.c:420 +#: storage/ipc/procsignal.c:416 #, c-format msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" msgstr "warte immer noch darauf, dass Backend mit PID %d ProcSignalBarrier annimmt" -#: storage/ipc/shm_mq.c:384 +#: storage/ipc/shm_mq.c:383 #, c-format msgid "cannot send a message of size %zu via shared memory queue" msgstr "kann Nachricht mit Größe %zu nicht über Shared-Memory-Queue senden" -#: storage/ipc/shm_mq.c:719 +#: storage/ipc/shm_mq.c:718 #, c-format msgid "invalid message size %zu in shared memory queue" msgstr "ungültige Nachrichtengröße %zu in Shared-Memory-Queue" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 -#: storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2810 storage/lmgr/lock.c:4195 -#: storage/lmgr/lock.c:4260 storage/lmgr/lock.c:4610 -#: storage/lmgr/predicate.c:2412 storage/lmgr/predicate.c:2427 -#: storage/lmgr/predicate.c:3824 storage/lmgr/predicate.c:4871 -#: utils/hash/dynahash.c:1107 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:984 +#: storage/lmgr/lock.c:1022 storage/lmgr/lock.c:2835 storage/lmgr/lock.c:4220 +#: storage/lmgr/lock.c:4285 storage/lmgr/lock.c:4635 +#: storage/lmgr/predicate.c:2468 storage/lmgr/predicate.c:2483 +#: storage/lmgr/predicate.c:3880 storage/lmgr/predicate.c:4927 +#: utils/hash/dynahash.c:1096 #, c-format msgid "out of shared memory" msgstr "Shared Memory aufgebraucht" -#: storage/ipc/shmem.c:170 storage/ipc/shmem.c:266 +#: storage/ipc/shmem.c:161 storage/ipc/shmem.c:257 #, c-format msgid "out of shared memory (%zu bytes requested)" msgstr "Shared Memory aufgebraucht (%zu Bytes angefordert)" -#: storage/ipc/shmem.c:445 +#: storage/ipc/shmem.c:436 #, c-format msgid "could not create ShmemIndex entry for data structure \"%s\"" msgstr "konnte ShmemIndex-Eintrag für Datenstruktur »%s« nicht erzeugen" -#: storage/ipc/shmem.c:460 +#: storage/ipc/shmem.c:451 #, c-format msgid "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, actual %zu" msgstr "ShmemIndex-Eintraggröße ist falsch für Datenstruktur »%s«: erwartet %zu, tatsächlich %zu" -#: storage/ipc/shmem.c:479 +#: storage/ipc/shmem.c:470 #, c-format msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" msgstr "nicht genug Shared-Memory für Datenstruktur »%s« (%zu Bytes angefordert)" -#: storage/ipc/shmem.c:511 storage/ipc/shmem.c:530 +#: storage/ipc/shmem.c:502 storage/ipc/shmem.c:521 #, c-format msgid "requested shared memory size overflows size_t" msgstr "angeforderte Shared-Memory-Größe übersteigt Kapazität von size_t" @@ -22275,365 +23053,353 @@ msgstr "angeforderte Shared-Memory-Größe übersteigt Kapazität von size_t" msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %d ist kein PostgreSQL-Backend-Prozess" -#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1379 -#: utils/adt/mcxtfuncs.c:190 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1453 +#: utils/adt/mcxtfuncs.c:182 #, c-format msgid "could not send signal to process %d: %m" msgstr "konnte Signal nicht an Prozess %d senden: %m" -#: storage/ipc/signalfuncs.c:124 storage/ipc/signalfuncs.c:131 +#: storage/ipc/signalfuncs.c:129 storage/ipc/signalfuncs.c:136 #, c-format msgid "permission denied to cancel query" msgstr "keine Berechtigung, um Anfrage zu stornieren" -#: storage/ipc/signalfuncs.c:125 +#: storage/ipc/signalfuncs.c:130 #, c-format -msgid "Only roles with the %s attribute may cancel queries of roles with %s." +msgid "Only roles with the %s attribute may cancel queries of roles with the %s attribute." msgstr "Nur Rollen mit dem %s-Attribut können Anfragen von Rollen mit dem %s-Attribut stornieren." -#: storage/ipc/signalfuncs.c:132 +#: storage/ipc/signalfuncs.c:137 #, c-format msgid "Only roles with privileges of the role whose query is being canceled or with privileges of the \"%s\" role may cancel this query." msgstr "Nur Rollen mit den Privilegien der Rolle deren Anfrage storniert werden soll oder den Privilegien der Rolle »%s« können diese Anfrage stornieren." -#: storage/ipc/signalfuncs.c:174 +#: storage/ipc/signalfuncs.c:179 #, c-format msgid "could not check the existence of the backend with PID %d: %m" msgstr "konnte die Existenz des Backend mit PID %d nicht prüfen: %m" -#: storage/ipc/signalfuncs.c:192 +#: storage/ipc/signalfuncs.c:197 #, c-format msgid "backend with PID %d did not terminate within %lld millisecond" msgid_plural "backend with PID %d did not terminate within %lld milliseconds" msgstr[0] "Backend mit PID %d wurde nicht innerhalb von %lld Millisekunde beendet" msgstr[1] "Backend mit PID %d wurde nicht innerhalb von %lld Millisekunden beendet" -#: storage/ipc/signalfuncs.c:223 +#: storage/ipc/signalfuncs.c:228 #, c-format msgid "\"timeout\" must not be negative" msgstr "»timeout« darf nicht negativ sein" -#: storage/ipc/signalfuncs.c:231 -#, c-format -msgid "Only roles with the %s attribute may terminate processes of roles with %s." -msgstr "Nur Rollen mit dem %s-Attribut können Prozesse von Rollen mit dem %s-Attribut beenden." - -#: storage/ipc/signalfuncs.c:279 -#, c-format -msgid "must be superuser to rotate log files with adminpack 1.0" -msgstr "nur Superuser können mit adminpack 1.0 Logdateien rotieren" - -#. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:281 utils/adt/genfile.c:250 -#, c-format -msgid "Consider using %s, which is part of core, instead." -msgstr "Verwenden Sie stattdessen %s, was im Kernsystem enthalten ist." - -#: storage/ipc/signalfuncs.c:287 storage/ipc/signalfuncs.c:307 +#: storage/ipc/signalfuncs.c:285 #, c-format msgid "rotation not possible because log collection not active" msgstr "Rotierung nicht möglich, weil Logsammlung nicht aktiv ist" -#: storage/ipc/standby.c:330 +#: storage/ipc/standby.c:329 #, c-format msgid "recovery still waiting after %ld.%03d ms: %s" msgstr "Wiederherstellung wartet immer noch nach %ld,%03d ms: %s" -#: storage/ipc/standby.c:339 +#: storage/ipc/standby.c:338 #, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "Warten der Wiederherstellung beendet nach %ld,%03d ms: %s" -#: storage/ipc/standby.c:921 tcop/postgres.c:3384 +#: storage/ipc/standby.c:920 tcop/postgres.c:3196 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "storniere Anfrage wegen Konflikt mit der Wiederherstellung" -#: storage/ipc/standby.c:922 tcop/postgres.c:2533 +#: storage/ipc/standby.c:921 tcop/postgres.c:2557 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "Benutzertransaktion hat Verklemmung (Deadlock) mit Wiederherstellung verursacht." -#: storage/ipc/standby.c:1488 +#: storage/ipc/standby.c:1486 msgid "unknown reason" msgstr "unbekannter Grund" -#: storage/ipc/standby.c:1493 +#: storage/ipc/standby.c:1491 msgid "recovery conflict on buffer pin" msgstr "Konflikt bei der Wiederherstellung wegen Buffer-Pin" -#: storage/ipc/standby.c:1496 +#: storage/ipc/standby.c:1494 msgid "recovery conflict on lock" msgstr "Konflikt bei Wiederherstellung wegen Sperre" -#: storage/ipc/standby.c:1499 +#: storage/ipc/standby.c:1497 msgid "recovery conflict on tablespace" msgstr "Konflikt bei Wiederherstellung wegen Tablespace" -#: storage/ipc/standby.c:1502 +#: storage/ipc/standby.c:1500 msgid "recovery conflict on snapshot" msgstr "Konflikt bei der Wiederherstellung wegen Snapshot" -#: storage/ipc/standby.c:1505 -#, fuzzy -#| msgid "recovery conflict on snapshot" +#: storage/ipc/standby.c:1503 msgid "recovery conflict on replication slot" -msgstr "Konflikt bei der Wiederherstellung wegen Snapshot" +msgstr "Konflikt bei der Wiederherstellung wegen Replikations-Slot" -#: storage/ipc/standby.c:1508 +#: storage/ipc/standby.c:1506 msgid "recovery conflict on buffer deadlock" msgstr "Konflikt bei der Wiederherstellung wegen Buffer-Deadlock" -#: storage/ipc/standby.c:1511 +#: storage/ipc/standby.c:1509 msgid "recovery conflict on database" msgstr "Konflikt bei Wiederherstellung wegen Datenbank" -#: storage/large_object/inv_api.c:191 +#: storage/large_object/inv_api.c:190 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "pg_largeobject-Eintrag für OID %u, Seite %d hat ungültige Datenfeldgröße %d" -#: storage/large_object/inv_api.c:274 +#: storage/large_object/inv_api.c:272 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "ungültige Flags zum Öffnen eines Large Objects: %d" -#: storage/large_object/inv_api.c:457 +#: storage/large_object/inv_api.c:297 storage/large_object/inv_api.c:309 +#: storage/large_object/inv_api.c:506 storage/large_object/inv_api.c:617 +#: storage/large_object/inv_api.c:807 +#, c-format +msgid "permission denied for large object %u" +msgstr "keine Berechtigung für Large Object %u" + +#: storage/large_object/inv_api.c:455 #, c-format msgid "invalid whence setting: %d" msgstr "ungültige »whence«-Angabe: %d" -#: storage/large_object/inv_api.c:629 +#: storage/large_object/inv_api.c:627 #, c-format msgid "invalid large object write request size: %d" msgstr "ungültige Größe der Large-Object-Schreibaufforderung: %d" -#: storage/lmgr/deadlock.c:1105 +#: storage/lmgr/deadlock.c:1104 #, c-format msgid "Process %d waits for %s on %s; blocked by process %d." msgstr "Prozess %d wartet auf %s-Sperre auf %s; blockiert von Prozess %d." -#: storage/lmgr/deadlock.c:1124 +#: storage/lmgr/deadlock.c:1123 #, c-format msgid "Process %d: %s" msgstr "Prozess %d: %s" -#: storage/lmgr/deadlock.c:1133 +#: storage/lmgr/deadlock.c:1132 #, c-format msgid "deadlock detected" msgstr "Verklemmung (Deadlock) entdeckt" -#: storage/lmgr/deadlock.c:1136 +#: storage/lmgr/deadlock.c:1135 #, c-format msgid "See server log for query details." msgstr "Einzelheiten zur Anfrage finden Sie im Serverlog." -#: storage/lmgr/lmgr.c:859 +#: storage/lmgr/lmgr.c:848 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "beim Aktualisieren von Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:862 +#: storage/lmgr/lmgr.c:851 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "beim Löschen von Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:865 +#: storage/lmgr/lmgr.c:854 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "beim Sperren von Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:868 +#: storage/lmgr/lmgr.c:857 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "beim Sperren von aktualisierter Version (%u,%u) von Tupel in Relation »%s«" -#: storage/lmgr/lmgr.c:871 +#: storage/lmgr/lmgr.c:860 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "beim Einfügen von Indextupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:874 +#: storage/lmgr/lmgr.c:863 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "beim Prüfen der Eindeutigkeit von Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:877 +#: storage/lmgr/lmgr.c:866 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "beim erneuten Prüfen des aktualisierten Tupels (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:880 +#: storage/lmgr/lmgr.c:869 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "beim Prüfen eines Exclusion-Constraints für Tupel (%u,%u) in Relation »%s«" -#: storage/lmgr/lmgr.c:1174 +#: storage/lmgr/lmgr.c:1239 #, c-format msgid "relation %u of database %u" msgstr "Relation %u der Datenbank %u" -#: storage/lmgr/lmgr.c:1180 +#: storage/lmgr/lmgr.c:1245 #, c-format msgid "extension of relation %u of database %u" msgstr "Erweiterung von Relation %u in Datenbank %u" -#: storage/lmgr/lmgr.c:1186 +#: storage/lmgr/lmgr.c:1251 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid der Datenbank %u" -#: storage/lmgr/lmgr.c:1191 +#: storage/lmgr/lmgr.c:1256 #, c-format msgid "page %u of relation %u of database %u" msgstr "Seite %u von Relation %u von Datenbank %u" -#: storage/lmgr/lmgr.c:1198 +#: storage/lmgr/lmgr.c:1263 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "Tupel (%u, %u) von Relation %u von Datenbank %u" -#: storage/lmgr/lmgr.c:1206 +#: storage/lmgr/lmgr.c:1271 #, c-format msgid "transaction %u" msgstr "Transaktion %u" -#: storage/lmgr/lmgr.c:1211 +#: storage/lmgr/lmgr.c:1276 #, c-format msgid "virtual transaction %d/%u" msgstr "virtuelle Transaktion %d/%u" -#: storage/lmgr/lmgr.c:1217 +#: storage/lmgr/lmgr.c:1282 #, c-format msgid "speculative token %u of transaction %u" msgstr "spekulatives Token %u von Transaktion %u" -#: storage/lmgr/lmgr.c:1223 +#: storage/lmgr/lmgr.c:1288 #, c-format msgid "object %u of class %u of database %u" msgstr "Objekt %u von Klasse %u von Datenbank %u" -#: storage/lmgr/lmgr.c:1231 +#: storage/lmgr/lmgr.c:1296 #, c-format msgid "user lock [%u,%u,%u]" msgstr "Benutzersperre [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1238 +#: storage/lmgr/lmgr.c:1303 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "Benutzersperre [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1246 -#, fuzzy, c-format -#| msgid "extension of relation %u of database %u" +#: storage/lmgr/lmgr.c:1311 +#, c-format msgid "remote transaction %u of subscription %u of database %u" -msgstr "Erweiterung von Relation %u in Datenbank %u" +msgstr "Remote-Transaktion %u von Subskription %u in Datenbank %u" -#: storage/lmgr/lmgr.c:1253 +#: storage/lmgr/lmgr.c:1318 #, c-format msgid "unrecognized locktag type %d" msgstr "unbekannter Locktag-Typ %d" -#: storage/lmgr/lock.c:803 +#: storage/lmgr/lock.c:812 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" msgstr "Sperrmodus %s kann während der Wiederherstellung nicht auf Datenbankobjekte gesetzt werden" -#: storage/lmgr/lock.c:805 +#: storage/lmgr/lock.c:814 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "Nur Sperren gleich oder unter RowExclusiveLock können während der Wiederherstellung auf Datenbankobjekte gesetzt werden." -#: storage/lmgr/lock.c:3259 storage/lmgr/lock.c:3327 storage/lmgr/lock.c:3443 +#: storage/lmgr/lock.c:3284 storage/lmgr/lock.c:3352 storage/lmgr/lock.c:3468 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" msgstr "PREPARE kann nicht ausgeführt werden, wenn für das selbe Objekt Sperren auf Sitzungsebene und auf Transaktionsebene gehalten werden" -#: storage/lmgr/predicate.c:649 +#: storage/lmgr/predicate.c:653 #, c-format msgid "not enough elements in RWConflictPool to record a read/write conflict" msgstr "nicht genügend Elemente in RWConflictPool, um einen Lese-/Schreibkonflikt aufzuzeichnen" -#: storage/lmgr/predicate.c:650 storage/lmgr/predicate.c:675 +#: storage/lmgr/predicate.c:654 storage/lmgr/predicate.c:679 #, c-format -msgid "You might need to run fewer transactions at a time or increase max_connections." -msgstr "Sie müssten entweder weniger Transaktionen auf einmal ausführen oder max_connections erhöhen." +msgid "You might need to run fewer transactions at a time or increase \"max_connections\"." +msgstr "Sie müssten entweder weniger Transaktionen auf einmal ausführen oder »max_connections« erhöhen." -#: storage/lmgr/predicate.c:674 +#: storage/lmgr/predicate.c:678 #, c-format msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "nicht genügend Elemente in RWConflictPool, um einen möglichen Lese-/Schreibkonflikt aufzuzeichnen" -#: storage/lmgr/predicate.c:1630 +#: storage/lmgr/predicate.c:1686 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "»default_transaction_isolation« ist auf »serializable« gesetzt." -#: storage/lmgr/predicate.c:1631 +#: storage/lmgr/predicate.c:1687 #, c-format msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." msgstr "Mit »SET default_transaction_isolation = 'repeatable read'« können Sie die Voreinstellung ändern." -#: storage/lmgr/predicate.c:1682 +#: storage/lmgr/predicate.c:1738 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "eine Transaktion, die einen Snapshot importiert, must READ ONLY DEFERRABLE sein" -#: storage/lmgr/predicate.c:1761 utils/time/snapmgr.c:570 -#: utils/time/snapmgr.c:576 +#: storage/lmgr/predicate.c:1817 utils/time/snapmgr.c:535 +#: utils/time/snapmgr.c:541 #, c-format msgid "could not import the requested snapshot" msgstr "konnte den angeforderten Snapshot nicht importieren" -#: storage/lmgr/predicate.c:1762 utils/time/snapmgr.c:577 +#: storage/lmgr/predicate.c:1818 utils/time/snapmgr.c:542 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "Der Ausgangsprozess mit PID %d läuft nicht mehr." -#: storage/lmgr/predicate.c:3935 storage/lmgr/predicate.c:3971 -#: storage/lmgr/predicate.c:4004 storage/lmgr/predicate.c:4012 -#: storage/lmgr/predicate.c:4051 storage/lmgr/predicate.c:4281 -#: storage/lmgr/predicate.c:4600 storage/lmgr/predicate.c:4612 -#: storage/lmgr/predicate.c:4659 storage/lmgr/predicate.c:4695 +#: storage/lmgr/predicate.c:3991 storage/lmgr/predicate.c:4027 +#: storage/lmgr/predicate.c:4060 storage/lmgr/predicate.c:4068 +#: storage/lmgr/predicate.c:4107 storage/lmgr/predicate.c:4337 +#: storage/lmgr/predicate.c:4656 storage/lmgr/predicate.c:4668 +#: storage/lmgr/predicate.c:4715 storage/lmgr/predicate.c:4751 #, c-format msgid "could not serialize access due to read/write dependencies among transactions" msgstr "konnte Zugriff nicht serialisieren wegen Lese-/Schreib-Abhängigkeiten zwischen Transaktionen" -#: storage/lmgr/predicate.c:3937 storage/lmgr/predicate.c:3973 -#: storage/lmgr/predicate.c:4006 storage/lmgr/predicate.c:4014 -#: storage/lmgr/predicate.c:4053 storage/lmgr/predicate.c:4283 -#: storage/lmgr/predicate.c:4602 storage/lmgr/predicate.c:4614 -#: storage/lmgr/predicate.c:4661 storage/lmgr/predicate.c:4697 +#: storage/lmgr/predicate.c:3993 storage/lmgr/predicate.c:4029 +#: storage/lmgr/predicate.c:4062 storage/lmgr/predicate.c:4070 +#: storage/lmgr/predicate.c:4109 storage/lmgr/predicate.c:4339 +#: storage/lmgr/predicate.c:4658 storage/lmgr/predicate.c:4670 +#: storage/lmgr/predicate.c:4717 storage/lmgr/predicate.c:4753 #, c-format msgid "The transaction might succeed if retried." msgstr "Die Transaktion könnte erfolgreich sein, wenn sie erneut versucht würde." -#: storage/lmgr/proc.c:349 +#: storage/lmgr/proc.c:353 #, c-format -msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" -msgstr "Anzahl angeforderter Standby-Verbindungen überschreitet max_wal_senders (aktuell %d)" +msgid "number of requested standby connections exceeds \"max_wal_senders\" (currently %d)" +msgstr "Anzahl angeforderter Standby-Verbindungen überschreitet »max_wal_senders« (aktuell %d)" -#: storage/lmgr/proc.c:1472 +#: storage/lmgr/proc.c:1546 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "Prozess %d vermied Verklemmung wegen %s-Sperre auf %s durch Umordnen der Queue nach %ld,%03d ms" -#: storage/lmgr/proc.c:1487 +#: storage/lmgr/proc.c:1561 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "Prozess %d hat Verklemmung festgestellt beim Warten auf %s-Sperre auf %s nach %ld,%03d ms" -#: storage/lmgr/proc.c:1496 +#: storage/lmgr/proc.c:1570 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "Prozess %d wartet immer noch auf %s-Sperre auf %s nach %ld,%03d ms" -#: storage/lmgr/proc.c:1503 +#: storage/lmgr/proc.c:1577 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "Prozess %d erlangte %s-Sperre auf %s nach %ld,%03d ms" -#: storage/lmgr/proc.c:1520 +#: storage/lmgr/proc.c:1594 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "Prozess %d konnte %s-Sperre auf %s nach %ld,%03d ms nicht erlangen" @@ -22660,73 +23426,208 @@ msgstr "verfälschter Line-Pointer: %u" msgid "corrupted item lengths: total %u, available space %u" msgstr "verfälschte Item-Längen: gesamt %u, verfügbarer Platz %u" -#: storage/page/bufpage.c:1092 storage/page/bufpage.c:1233 -#: storage/page/bufpage.c:1330 storage/page/bufpage.c:1442 +#: storage/page/bufpage.c:1092 storage/page/bufpage.c:1233 +#: storage/page/bufpage.c:1330 storage/page/bufpage.c:1442 +#, c-format +msgid "corrupted line pointer: offset = %u, size = %u" +msgstr "verfälschter Line-Pointer: offset = %u, size = %u" + +#: storage/smgr/md.c:485 storage/smgr/md.c:547 +#, c-format +msgid "cannot extend file \"%s\" beyond %u blocks" +msgstr "kann Datei »%s« nicht auf über %u Blöcke erweitern" + +#: storage/smgr/md.c:500 storage/smgr/md.c:611 +#, c-format +msgid "could not extend file \"%s\": %m" +msgstr "konnte Datei »%s« nicht erweitern: %m" + +#: storage/smgr/md.c:506 +#, c-format +msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" +msgstr "konnte Datei »%s« nicht erweitern: es wurden nur %d von %d Bytes bei Block %u geschrieben" + +#: storage/smgr/md.c:589 +#, c-format +msgid "could not extend file \"%s\" with FileFallocate(): %m" +msgstr "konnte Datei »%s« nicht mit FileFallocate() erweitern: %m" + +#: storage/smgr/md.c:869 +#, c-format +msgid "could not read blocks %u..%u in file \"%s\": %m" +msgstr "konnte Blöcke %u..%u in Datei »%s« nicht lesen: %m" + +#: storage/smgr/md.c:895 +#, c-format +msgid "could not read blocks %u..%u in file \"%s\": read only %zu of %zu bytes" +msgstr "konnte Blöcke %u..%u in Datei »%s« nicht lesen: es wurden nur %zu von %zu Bytes gelesen" + +#: storage/smgr/md.c:995 +#, c-format +msgid "could not write blocks %u..%u in file \"%s\": %m" +msgstr "konnte Blöcke %u..%u in Datei »%s« nicht schreiben: %m" + +#: storage/smgr/md.c:1165 +#, c-format +msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" +msgstr "konnte Datei »%s« nicht auf %u Blöcke kürzen: es sind jetzt nur %u Blöcke" + +#: storage/smgr/md.c:1220 +#, c-format +msgid "could not truncate file \"%s\" to %u blocks: %m" +msgstr "konnte Datei »%s« nicht auf %u Blöcke kürzen: %m" + +#: storage/smgr/md.c:1700 +#, c-format +msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" +msgstr "konnte Datei »%s« nicht öffnen (Zielblock %u): vorhergehendes Segment hat nur %u Blöcke" + +#: storage/smgr/md.c:1714 +#, c-format +msgid "could not open file \"%s\" (target block %u): %m" +msgstr "konnte Datei »%s« nicht öffnen (Zielblock %u): %m" + +#: tcop/backend_startup.c:85 +#, c-format +msgid "SSL configuration could not be loaded in child process" +msgstr "SSL-Konfiguration konnte im Kindprozess nicht geladen werden" + +#: tcop/backend_startup.c:208 +#, c-format +msgid "connection received: host=%s port=%s" +msgstr "Verbindung empfangen: Host=%s Port=%s" + +#: tcop/backend_startup.c:213 +#, c-format +msgid "connection received: host=%s" +msgstr "Verbindung empfangen: Host=%s" + +#: tcop/backend_startup.c:277 +#, c-format +msgid "the database system is starting up" +msgstr "das Datenbanksystem startet" + +#: tcop/backend_startup.c:283 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "das Datenbanksystem nimmt noch keine Verbindungen an" + +#: tcop/backend_startup.c:284 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "Konsistenter Wiederherstellungszustand wurde noch nicht erreicht." + +#: tcop/backend_startup.c:288 +#, c-format +msgid "the database system is not accepting connections" +msgstr "das Datenbanksystem nimmt keine Verbindungen an" + +#: tcop/backend_startup.c:289 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "Hot-Standby-Modus ist deaktiviert." + +#: tcop/backend_startup.c:294 +#, c-format +msgid "the database system is shutting down" +msgstr "das Datenbanksystem fährt herunter" + +#: tcop/backend_startup.c:299 +#, c-format +msgid "the database system is in recovery mode" +msgstr "das Datenbanksystem ist im Wiederherstellungsmodus" + +#: tcop/backend_startup.c:414 +#, c-format +msgid "received direct SSL connection request without ALPN protocol negotiation extension" +msgstr "direkte SSL-Verbindungsanfrage ohne ALPN-Protokollerweiterung empfangen" + +#: tcop/backend_startup.c:420 +#, c-format +msgid "direct SSL connection accepted" +msgstr "direkte SSL-Verbindung angenommen" + +#: tcop/backend_startup.c:430 +#, c-format +msgid "direct SSL connection rejected" +msgstr "direkte SSL-Verbindung abgelehnt" + +#: tcop/backend_startup.c:489 tcop/backend_startup.c:517 +#, c-format +msgid "incomplete startup packet" +msgstr "unvollständiges Startpaket" + +#: tcop/backend_startup.c:501 tcop/backend_startup.c:538 +#, c-format +msgid "invalid length of startup packet" +msgstr "ungültige Länge des Startpakets" + +#: tcop/backend_startup.c:573 #, c-format -msgid "corrupted line pointer: offset = %u, size = %u" -msgstr "verfälschter Line-Pointer: offset = %u, size = %u" +msgid "SSLRequest accepted" +msgstr "SSLRequest akzeptiert" -#: storage/smgr/md.c:484 storage/smgr/md.c:546 +#: tcop/backend_startup.c:576 #, c-format -msgid "cannot extend file \"%s\" beyond %u blocks" -msgstr "kann Datei »%s« nicht auf über %u Blöcke erweitern" +msgid "SSLRequest rejected" +msgstr "SSLRequest abgelehnt" -#: storage/smgr/md.c:499 storage/smgr/md.c:610 +#: tcop/backend_startup.c:585 #, c-format -msgid "could not extend file \"%s\": %m" -msgstr "konnte Datei »%s« nicht erweitern: %m" +msgid "failed to send SSL negotiation response: %m" +msgstr "konnte SSL-Verhandlungsantwort nicht senden: %m" -#: storage/smgr/md.c:505 +#: tcop/backend_startup.c:603 #, c-format -msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" -msgstr "konnte Datei »%s« nicht erweitern: es wurden nur %d von %d Bytes bei Block %u geschrieben" +msgid "received unencrypted data after SSL request" +msgstr "unverschlüsselte Daten nach SSL-Anforderung empfangen" -#: storage/smgr/md.c:588 +#: tcop/backend_startup.c:604 tcop/backend_startup.c:658 #, c-format -msgid "could not extend file \"%s\" with FileFallocate(): %m" -msgstr "konnte Datei »%s« nicht mit FileFallocate() erweitern: %m" +msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." +msgstr "Das könnte entweder ein Fehler in der Client-Software oder ein Hinweis auf einen versuchten Man-in-the-Middle-Angriff sein." -#: storage/smgr/md.c:779 +#: tcop/backend_startup.c:627 #, c-format -msgid "could not read block %u in file \"%s\": %m" -msgstr "konnte Block %u in Datei »%s« nicht lesen: %m" +msgid "GSSENCRequest accepted" +msgstr "GSSENCRequest akzeptiert" -#: storage/smgr/md.c:795 +#: tcop/backend_startup.c:630 #, c-format -msgid "could not read block %u in file \"%s\": read only %d of %d bytes" -msgstr "konnte Block %u in Datei »%s« nicht lesen: es wurden nur %d von %d Bytes gelesen" +msgid "GSSENCRequest rejected" +msgstr "GSSENCRequest abgelehnt" -#: storage/smgr/md.c:853 +#: tcop/backend_startup.c:639 #, c-format -msgid "could not write block %u in file \"%s\": %m" -msgstr "konnte Block %u in Datei »%s« nicht schreiben: %m" +msgid "failed to send GSSAPI negotiation response: %m" +msgstr "konnte GSSAPI-Verhandlungsantwort nicht senden: %m" -#: storage/smgr/md.c:858 +#: tcop/backend_startup.c:657 #, c-format -msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" -msgstr "konnte Block %u in Datei »%s« nicht schreiben: es wurden nur %d von %d Bytes geschrieben" +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "unverschlüsselte Daten nach GSSAPI-Verschlüsselungsanforderung empfangen" -#: storage/smgr/md.c:1009 +#: tcop/backend_startup.c:681 #, c-format -msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" -msgstr "konnte Datei »%s« nicht auf %u Blöcke kürzen: es sind jetzt nur %u Blöcke" +msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" +msgstr "nicht unterstütztes Frontend-Protokoll %u.%u: Server unterstützt %u.0 bis %u.%u" -#: storage/smgr/md.c:1064 +#: tcop/backend_startup.c:744 #, c-format -msgid "could not truncate file \"%s\" to %u blocks: %m" -msgstr "konnte Datei »%s« nicht auf %u Blöcke kürzen: %m" +msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." +msgstr "Gültige Werte sind: »false«, 0, »true«, 1, »database«." -#: storage/smgr/md.c:1491 +#: tcop/backend_startup.c:785 #, c-format -msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" -msgstr "konnte Datei »%s« nicht öffnen (Zielblock %u): vorhergehendes Segment hat nur %u Blöcke" +msgid "invalid startup packet layout: expected terminator as last byte" +msgstr "ungültiges Layout des Startpakets: Abschluss als letztes Byte erwartet" -#: storage/smgr/md.c:1505 +#: tcop/backend_startup.c:802 #, c-format -msgid "could not open file \"%s\" (target block %u): %m" -msgstr "konnte Datei »%s« nicht öffnen (Zielblock %u): %m" +msgid "no PostgreSQL user name specified in startup packet" +msgstr "kein PostgreSQL-Benutzername im Startpaket angegeben" -#: tcop/fastpath.c:142 utils/fmgr/fmgr.c:2132 +#: tcop/fastpath.c:142 utils/fmgr/fmgr.c:2161 #, c-format msgid "function with OID %u does not exist" msgstr "Funktion mit OID %u existiert nicht" @@ -22741,8 +23642,8 @@ msgstr "Funktion »%s« kann nicht via Fastpath-Interface aufgerufen werden" msgid "fastpath function call: \"%s\" (OID %u)" msgstr "Fastpath-Funktionsaufruf: »%s« (OID %u)" -#: tcop/fastpath.c:313 tcop/postgres.c:1365 tcop/postgres.c:1601 -#: tcop/postgres.c:2059 tcop/postgres.c:2309 +#: tcop/fastpath.c:313 tcop/postgres.c:1369 tcop/postgres.c:1605 +#: tcop/postgres.c:2071 tcop/postgres.c:2333 #, c-format msgid "duration: %s ms" msgstr "Dauer: %s ms" @@ -22772,316 +23673,320 @@ msgstr "ungültige Argumentgröße %d in Funktionsaufruf-Message" msgid "incorrect binary data format in function argument %d" msgstr "falsches Binärdatenformat in Funktionsargument %d" -#: tcop/postgres.c:463 tcop/postgres.c:4877 +#: tcop/postgres.c:467 tcop/postgres.c:5012 #, c-format msgid "invalid frontend message type %d" msgstr "ungültiger Frontend-Message-Typ %d" -#: tcop/postgres.c:1072 +#: tcop/postgres.c:1076 #, c-format msgid "statement: %s" msgstr "Anweisung: %s" -#: tcop/postgres.c:1370 +#: tcop/postgres.c:1374 #, c-format msgid "duration: %s ms statement: %s" msgstr "Dauer: %s ms Anweisung: %s" -#: tcop/postgres.c:1476 +#: tcop/postgres.c:1480 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "kann nicht mehrere Befehle in vorbereitete Anweisung einfügen" -#: tcop/postgres.c:1606 +#: tcop/postgres.c:1610 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "Dauer: %s ms Parsen %s: %s" -#: tcop/postgres.c:1672 tcop/postgres.c:2629 +#: tcop/postgres.c:1677 tcop/postgres.c:2653 #, c-format msgid "unnamed prepared statement does not exist" msgstr "unbenannte vorbereitete Anweisung existiert nicht" -#: tcop/postgres.c:1713 +#: tcop/postgres.c:1729 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "Binden-Nachricht hat %d Parameterformate aber %d Parameter" -#: tcop/postgres.c:1719 +#: tcop/postgres.c:1735 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "Binden-Nachricht enthält %d Parameter, aber vorbereitete Anweisung »%s« erfordert %d" -#: tcop/postgres.c:1937 +#: tcop/postgres.c:1949 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "falsches Binärdatenformat in Binden-Parameter %d" -#: tcop/postgres.c:2064 +#: tcop/postgres.c:2076 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "Dauer: %s ms Binden %s%s%s: %s" -#: tcop/postgres.c:2118 tcop/postgres.c:2712 +#: tcop/postgres.c:2131 tcop/postgres.c:2735 #, c-format msgid "portal \"%s\" does not exist" msgstr "Portal »%s« existiert nicht" -#: tcop/postgres.c:2189 +#: tcop/postgres.c:2213 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2191 tcop/postgres.c:2317 +#: tcop/postgres.c:2215 tcop/postgres.c:2341 msgid "execute fetch from" msgstr "Ausführen Fetch von" -#: tcop/postgres.c:2192 tcop/postgres.c:2318 +#: tcop/postgres.c:2216 tcop/postgres.c:2342 msgid "execute" msgstr "Ausführen" -#: tcop/postgres.c:2314 +#: tcop/postgres.c:2338 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "Dauer: %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2462 +#: tcop/postgres.c:2486 #, c-format msgid "prepare: %s" msgstr "Vorbereiten: %s" -#: tcop/postgres.c:2487 +#: tcop/postgres.c:2511 #, c-format -msgid "parameters: %s" +msgid "Parameters: %s" msgstr "Parameter: %s" -#: tcop/postgres.c:2502 +#: tcop/postgres.c:2526 #, c-format -msgid "abort reason: recovery conflict" +msgid "Abort reason: recovery conflict" msgstr "Abbruchgrund: Konflikt bei Wiederherstellung" -#: tcop/postgres.c:2518 +#: tcop/postgres.c:2542 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "Benutzer hat Shared-Buffer-Pin zu lange gehalten." -#: tcop/postgres.c:2521 +#: tcop/postgres.c:2545 #, c-format msgid "User was holding a relation lock for too long." msgstr "Benutzer hat Relationssperre zu lange gehalten." -#: tcop/postgres.c:2524 +#: tcop/postgres.c:2548 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "Benutzer hat (möglicherweise) einen Tablespace verwendet, der gelöscht werden muss." -#: tcop/postgres.c:2527 +#: tcop/postgres.c:2551 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "Benutzeranfrage hat möglicherweise Zeilenversionen sehen müssen, die entfernt werden müssen." -#: tcop/postgres.c:2530 -#, fuzzy, c-format -#| msgid "User was connected to a database that must be dropped." -msgid "User was using a logical slot that must be invalidated." -msgstr "Benutzer war mit einer Datenbank verbunden, die gelöscht werden muss." +#: tcop/postgres.c:2554 +#, c-format +msgid "User was using a logical replication slot that must be invalidated." +msgstr "Benutzer verwendete einen logischen Replikations-Slot, der ungültig gemacht werden muss." -#: tcop/postgres.c:2536 +#: tcop/postgres.c:2560 #, c-format msgid "User was connected to a database that must be dropped." msgstr "Benutzer war mit einer Datenbank verbunden, die gelöscht werden muss." -#: tcop/postgres.c:2575 +#: tcop/postgres.c:2599 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "Portal »%s« Parameter $%d = %s" -#: tcop/postgres.c:2578 +#: tcop/postgres.c:2602 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "Portal »%s« Parameter $%d" -#: tcop/postgres.c:2584 +#: tcop/postgres.c:2608 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "unbenanntes Portal Parameter $%d = %s" -#: tcop/postgres.c:2587 +#: tcop/postgres.c:2611 #, c-format msgid "unnamed portal parameter $%d" msgstr "unbenanntes Portal Parameter $%d" -#: tcop/postgres.c:2932 +#: tcop/postgres.c:2955 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "Verbindung wird abgebrochen wegen unerwartetem SIGQUIT-Signal" -#: tcop/postgres.c:2938 +#: tcop/postgres.c:2961 #, c-format msgid "terminating connection because of crash of another server process" msgstr "Verbindung wird abgebrochen wegen Absturz eines anderen Serverprozesses" -#: tcop/postgres.c:2939 +#: tcop/postgres.c:2962 #, c-format msgid "The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory." msgstr "Der Postmaster hat diesen Serverprozess angewiesen, die aktuelle Transaktion zurückzurollen und die Sitzung zu beenden, weil ein anderer Serverprozess abnormal beendet wurde und möglicherweise das Shared Memory verfälscht hat." -#: tcop/postgres.c:2943 tcop/postgres.c:3310 +#: tcop/postgres.c:2966 tcop/postgres.c:3219 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "In einem Moment sollten Sie wieder mit der Datenbank verbinden und Ihren Befehl wiederholen können." -#: tcop/postgres.c:2950 +#: tcop/postgres.c:2973 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "Verbindung wird abgebrochen aufgrund von Befehl für sofortiges Herunterfahren" -#: tcop/postgres.c:3036 +#: tcop/postgres.c:3051 #, c-format msgid "floating-point exception" msgstr "Fließkommafehler" -#: tcop/postgres.c:3037 +#: tcop/postgres.c:3052 #, c-format msgid "An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero." msgstr "Eine ungültige Fließkommaoperation wurde signalisiert. Das bedeutet wahrscheinlich ein Ergebnis außerhalb des gültigen Bereichs oder eine ungültige Operation, zum Beispiel Division durch null." -#: tcop/postgres.c:3214 +#: tcop/postgres.c:3217 +#, c-format +msgid "terminating connection due to conflict with recovery" +msgstr "Verbindung wird abgebrochen wegen Konflikt mit der Wiederherstellung" + +#: tcop/postgres.c:3289 #, c-format msgid "canceling authentication due to timeout" msgstr "storniere Authentifizierung wegen Zeitüberschreitung" -#: tcop/postgres.c:3218 +#: tcop/postgres.c:3293 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "Autovacuum-Prozess wird abgebrochen aufgrund von Anweisung des Administrators" -#: tcop/postgres.c:3222 +#: tcop/postgres.c:3297 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "Arbeitsprozess für logische Replikation wird abgebrochen aufgrund von Anweisung des Administrators" -#: tcop/postgres.c:3239 tcop/postgres.c:3249 tcop/postgres.c:3308 -#, c-format -msgid "terminating connection due to conflict with recovery" -msgstr "Verbindung wird abgebrochen wegen Konflikt mit der Wiederherstellung" - -#: tcop/postgres.c:3260 +#: tcop/postgres.c:3317 #, c-format msgid "terminating connection due to administrator command" msgstr "Verbindung wird abgebrochen aufgrund von Anweisung des Administrators" -#: tcop/postgres.c:3291 +#: tcop/postgres.c:3348 #, c-format msgid "connection to client lost" msgstr "Verbindung zum Client wurde verloren" -#: tcop/postgres.c:3361 +#: tcop/postgres.c:3400 #, c-format msgid "canceling statement due to lock timeout" msgstr "storniere Anfrage wegen Zeitüberschreitung einer Sperre" -#: tcop/postgres.c:3368 +#: tcop/postgres.c:3407 #, c-format msgid "canceling statement due to statement timeout" msgstr "storniere Anfrage wegen Zeitüberschreitung der Anfrage" -#: tcop/postgres.c:3375 +#: tcop/postgres.c:3414 #, c-format msgid "canceling autovacuum task" msgstr "storniere Autovacuum-Aufgabe" -#: tcop/postgres.c:3398 +#: tcop/postgres.c:3427 #, c-format msgid "canceling statement due to user request" msgstr "storniere Anfrage wegen Benutzeraufforderung" -#: tcop/postgres.c:3412 +#: tcop/postgres.c:3448 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "Verbindung wird abgebrochen wegen Zeitüberschreitung in inaktiver Transaktion" -#: tcop/postgres.c:3423 +#: tcop/postgres.c:3461 +#, c-format +msgid "terminating connection due to transaction timeout" +msgstr "Verbindung wird abgebrochen wegen Zeitüberschreitung in Transaktion" + +#: tcop/postgres.c:3474 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "Verbindung wird abgebrochen wegen Zeitüberschreitung in inaktiver Sitzung" -#: tcop/postgres.c:3514 +#: tcop/postgres.c:3564 #, c-format msgid "stack depth limit exceeded" msgstr "Grenze für Stacktiefe überschritten" -#: tcop/postgres.c:3515 +#: tcop/postgres.c:3565 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "Erhöhen Sie den Konfigurationsparameter »max_stack_depth« (aktuell %dkB), nachdem Sie sichergestellt haben, dass die Stacktiefenbegrenzung Ihrer Plattform ausreichend ist." -#: tcop/postgres.c:3562 +#: tcop/postgres.c:3612 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "»max_stack_depth« darf %ldkB nicht überschreiten." -#: tcop/postgres.c:3564 +#: tcop/postgres.c:3614 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "Erhöhen Sie die Stacktiefenbegrenzung Ihrer Plattform mit »ulimit -s« oder der lokalen Entsprechung." -#: tcop/postgres.c:3587 +#: tcop/postgres.c:3637 #, c-format -msgid "client_connection_check_interval must be set to 0 on this platform." -msgstr "client_connection_check_interval muss auf dieser Plattform auf 0 gesetzt sein." +msgid "\"client_connection_check_interval\" must be set to 0 on this platform." +msgstr "»client_connection_check_interval« muss auf dieser Plattform auf 0 gesetzt sein." -#: tcop/postgres.c:3608 +#: tcop/postgres.c:3658 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "Kann Parameter nicht einschalten, wenn »log_statement_stats« an ist." -#: tcop/postgres.c:3623 +#: tcop/postgres.c:3673 #, c-format msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." msgstr "Kann »log_statement_stats« nicht einschalten, wenn »log_parser_stats«, »log_planner_stats« oder »log_executor_stats« an ist." -#: tcop/postgres.c:3971 +#: tcop/postgres.c:4098 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "ungültiges Kommandozeilenargument für Serverprozess: %s" -#: tcop/postgres.c:3972 tcop/postgres.c:3978 +#: tcop/postgres.c:4099 tcop/postgres.c:4105 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: tcop/postgres.c:3976 +#: tcop/postgres.c:4103 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: ungültiges Kommandozeilenargument: %s" -#: tcop/postgres.c:4029 +#: tcop/postgres.c:4156 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: weder Datenbankname noch Benutzername angegeben" -#: tcop/postgres.c:4774 +#: tcop/postgres.c:4909 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "ungültiger Subtyp %d von CLOSE-Message" -#: tcop/postgres.c:4811 +#: tcop/postgres.c:4946 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "ungültiger Subtyp %d von DESCRIBE-Message" -#: tcop/postgres.c:4898 +#: tcop/postgres.c:5033 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "Fastpath-Funktionsaufrufe werden auf einer Replikationsverbindung nicht unterstützt" -#: tcop/postgres.c:4902 +#: tcop/postgres.c:5037 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "erweitertes Anfrageprotokoll wird nicht auf einer Replikationsverbindung unterstützt" -#: tcop/postgres.c:5082 +#: tcop/postgres.c:5217 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "Verbindungsende: Sitzungszeit: %d:%02d:%02d.%03d Benutzer=%s Datenbank=%s Host=%s%s%s" @@ -23091,52 +23996,53 @@ msgstr "Verbindungsende: Sitzungszeit: %d:%02d:%02d.%03d Benutzer=%s Datenbank=% msgid "bind message has %d result formats but query has %d columns" msgstr "Bind-Message hat %d Ergebnisspalten, aber Anfrage hat %d Spalten" -#: tcop/pquery.c:944 tcop/pquery.c:1701 +#: tcop/pquery.c:942 tcop/pquery.c:1696 #, c-format msgid "cursor can only scan forward" msgstr "Cursor kann nur vorwärts scannen" -#: tcop/pquery.c:945 tcop/pquery.c:1702 +#: tcop/pquery.c:943 tcop/pquery.c:1697 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Deklarieren Sie ihn mit der Option SCROLL, um rückwarts scannen zu können." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:417 +#: tcop/utility.c:410 #, c-format msgid "cannot execute %s in a read-only transaction" msgstr "%s kann nicht in einer Read-Only-Transaktion ausgeführt werden" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:435 +#: tcop/utility.c:428 #, c-format msgid "cannot execute %s during a parallel operation" msgstr "%s kann nicht während einer parallelen Operation ausgeführt werden" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:454 +#: tcop/utility.c:447 #, c-format msgid "cannot execute %s during recovery" msgstr "%s kann nicht während der Wiederherstellung ausgeführt werden" #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:472 +#: tcop/utility.c:465 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "kann %s nicht in einer sicherheitsbeschränkten Operation ausführen" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:828 +#: tcop/utility.c:821 #, c-format msgid "cannot execute %s within a background process" msgstr "%s kann nicht in einem Hintergrundprozess ausgeführt werden" -#: tcop/utility.c:953 +#. translator: %s is name of a SQL command, eg CHECKPOINT +#: tcop/utility.c:947 #, c-format msgid "permission denied to execute %s command" msgstr "keine Berechtigung, um Befehl %s auszuführen" -#: tcop/utility.c:955 +#: tcop/utility.c:949 #, c-format msgid "Only roles with privileges of the \"%s\" role may execute this command." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können diesen Befehl ausführen." @@ -23261,74 +24167,74 @@ msgstr "unbekannter Thesaurus-Parameter: »%s«" msgid "missing Dictionary parameter" msgstr "Parameter »Dictionary« fehlt" -#: tsearch/spell.c:381 tsearch/spell.c:398 tsearch/spell.c:407 -#: tsearch/spell.c:1043 +#: tsearch/spell.c:382 tsearch/spell.c:399 tsearch/spell.c:408 +#: tsearch/spell.c:1045 #, c-format msgid "invalid affix flag \"%s\"" msgstr "ungültiges Affix-Flag »%s«" -#: tsearch/spell.c:385 tsearch/spell.c:1047 +#: tsearch/spell.c:386 tsearch/spell.c:1049 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "Affix-Flag »%s« ist außerhalb des gültigen Bereichs" -#: tsearch/spell.c:415 +#: tsearch/spell.c:416 #, c-format msgid "invalid character in affix flag \"%s\"" msgstr "ungültiges Zeichen in Affix-Flag »%s«" -#: tsearch/spell.c:435 +#: tsearch/spell.c:436 #, c-format msgid "invalid affix flag \"%s\" with \"long\" flag value" msgstr "ungültiges Affix-Flag »%s« mit Flag-Wert »long«" -#: tsearch/spell.c:525 +#: tsearch/spell.c:526 #, c-format msgid "could not open dictionary file \"%s\": %m" msgstr "konnte Wörterbuchdatei »%s« nicht öffnen: %m" -#: tsearch/spell.c:1170 tsearch/spell.c:1182 tsearch/spell.c:1742 -#: tsearch/spell.c:1747 tsearch/spell.c:1752 +#: tsearch/spell.c:1173 tsearch/spell.c:1185 tsearch/spell.c:1746 +#: tsearch/spell.c:1751 tsearch/spell.c:1756 #, c-format msgid "invalid affix alias \"%s\"" msgstr "ungültiges Affixalias »%s«" -#: tsearch/spell.c:1223 tsearch/spell.c:1294 tsearch/spell.c:1443 +#: tsearch/spell.c:1226 tsearch/spell.c:1297 tsearch/spell.c:1446 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "konnte Affixdatei »%s« nicht öffnen: %m" -#: tsearch/spell.c:1277 +#: tsearch/spell.c:1280 #, c-format msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" msgstr "Ispell-Wörterbuch unterstützt nur die Flag-Werte »default«, »long« und »num«" -#: tsearch/spell.c:1321 +#: tsearch/spell.c:1324 #, c-format msgid "invalid number of flag vector aliases" msgstr "ungültige Anzahl Flag-Vektor-Aliasse" -#: tsearch/spell.c:1344 +#: tsearch/spell.c:1347 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "Anzahl der Aliasse überschreitet angegebene Zahl %d" -#: tsearch/spell.c:1559 +#: tsearch/spell.c:1562 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "Affixdatei enthält Befehle im alten und im neuen Stil" -#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:278 utils/adt/tsvector_op.c:1128 +#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:274 utils/adt/tsvector_op.c:1126 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "Zeichenkette ist zu lang für tsvector (%d Bytes, maximal %d Bytes)" -#: tsearch/ts_locale.c:238 +#: tsearch/ts_locale.c:236 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "Zeile %d in Konfigurationsdatei »%s«: »%s«" -#: tsearch/ts_locale.c:317 +#: tsearch/ts_locale.c:315 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "Umwandlung von wchar_t in Serverkodierung fehlgeschlagen: %m" @@ -23355,72 +24261,67 @@ msgstr "ungültiger Textsuchekonfigurationsdateiname »%s«" msgid "could not open stop-word file \"%s\": %m" msgstr "konnte Stoppwortdatei »%s« nicht öffnen: %m" -#: tsearch/wparser.c:308 tsearch/wparser.c:396 tsearch/wparser.c:473 +#: tsearch/wparser.c:306 tsearch/wparser.c:394 tsearch/wparser.c:471 #, c-format msgid "text search parser does not support headline creation" msgstr "Textsucheparser unterstützt das Erzeugen von Headlines nicht" -#: tsearch/wparser_def.c:2663 +#: tsearch/wparser_def.c:2664 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "unbekannter Headline-Parameter: »%s«" -#: tsearch/wparser_def.c:2673 -#, c-format -msgid "MinWords should be less than MaxWords" -msgstr "»MinWords« sollte kleiner als »MaxWords« sein" - -#: tsearch/wparser_def.c:2677 +#: tsearch/wparser_def.c:2674 #, c-format -msgid "MinWords should be positive" -msgstr "»MinWords« sollte positiv sein" +msgid "%s must be less than %s" +msgstr "%s muss kleiner als %s sein" -#: tsearch/wparser_def.c:2681 +#: tsearch/wparser_def.c:2678 #, c-format -msgid "ShortWord should be >= 0" -msgstr "»ShortWord« sollte >= 0 sein" +msgid "%s must be positive" +msgstr "%s muss positiv sein" -#: tsearch/wparser_def.c:2685 +#: tsearch/wparser_def.c:2682 tsearch/wparser_def.c:2686 #, c-format -msgid "MaxFragments should be >= 0" -msgstr "»MaxFragments« sollte >= 0 sein" +msgid "%s must be >= 0" +msgstr "%s muss >= 0 sein" -#: utils/activity/pgstat.c:438 +#: utils/activity/pgstat.c:435 #, c-format msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "konnte permanente Statistikdatei »%s« nicht löschen: %m" -#: utils/activity/pgstat.c:1252 +#: utils/activity/pgstat.c:1254 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "ungültige Statistikart: »%s«" -#: utils/activity/pgstat.c:1332 +#: utils/activity/pgstat.c:1334 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "konnte temporäre Statistikdatei »%s« nicht öffnen: %m" -#: utils/activity/pgstat.c:1444 +#: utils/activity/pgstat.c:1454 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "konnte temporäre Statistikdatei »%s« nicht schreiben: %m" -#: utils/activity/pgstat.c:1453 +#: utils/activity/pgstat.c:1463 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "konnte temporäre Statistikdatei »%s« nicht schließen: %m" -#: utils/activity/pgstat.c:1461 +#: utils/activity/pgstat.c:1471 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "konnte temporäre Statistikdatei »%s« nicht in »%s« umbenennen: %m" -#: utils/activity/pgstat.c:1510 +#: utils/activity/pgstat.c:1520 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "konnte Statistikdatei »%s« nicht öffnen: %m" -#: utils/activity/pgstat.c:1672 +#: utils/activity/pgstat.c:1682 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "verfälschte Statistikdatei »%s«" @@ -23430,116 +24331,125 @@ msgstr "verfälschte Statistikdatei »%s«" msgid "function call to dropped function" msgstr "Funktionsaufruf einer gelöschten Funktion" -#: utils/activity/pgstat_xact.c:363 +#: utils/activity/pgstat_xact.c:362 #, c-format msgid "resetting existing statistics for kind %s, db=%u, oid=%u" msgstr "bestehende Statistiken für Art %s, db=%u, oid=%u werden zurückgesetzt" -#: utils/adt/acl.c:177 utils/adt/name.c:93 +#: utils/activity/wait_event.c:207 utils/activity/wait_event.c:232 +#, c-format +msgid "wait event \"%s\" already exists in type \"%s\"" +msgstr "Wait-Event »%s« existiert bereits in Typ »%s«" + +#: utils/activity/wait_event.c:246 +#, c-format +msgid "too many custom wait events" +msgstr "zu viele benutzerdefinierte Wait-Events" + +#: utils/adt/acl.c:183 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "Bezeichner zu lang" -#: utils/adt/acl.c:178 utils/adt/name.c:94 +#: utils/adt/acl.c:184 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Bezeichner muss weniger als %d Zeichen haben." -#: utils/adt/acl.c:266 +#: utils/adt/acl.c:272 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "unbekanntes Schlüsselwort: »%s«" -#: utils/adt/acl.c:267 +#: utils/adt/acl.c:273 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "ACL-Schlüsselwort muss »group« oder »user« sein." -#: utils/adt/acl.c:275 +#: utils/adt/acl.c:281 #, c-format msgid "missing name" msgstr "Name fehlt" -#: utils/adt/acl.c:276 +#: utils/adt/acl.c:282 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "Auf das Schlüsselwort »group« oder »user« muss ein Name folgen." -#: utils/adt/acl.c:282 +#: utils/adt/acl.c:288 #, c-format msgid "missing \"=\" sign" msgstr "»=«-Zeichen fehlt" -#: utils/adt/acl.c:344 +#: utils/adt/acl.c:350 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "ungültiges Moduszeichen: muss eines aus »%s« sein" -#: utils/adt/acl.c:374 +#: utils/adt/acl.c:380 #, c-format msgid "a name must follow the \"/\" sign" msgstr "auf das »/«-Zeichen muss ein Name folgen" -#: utils/adt/acl.c:386 +#: utils/adt/acl.c:392 #, c-format msgid "defaulting grantor to user ID %u" msgstr "nicht angegebener Grantor wird auf user ID %u gesetzt" -#: utils/adt/acl.c:572 +#: utils/adt/acl.c:578 #, c-format msgid "ACL array contains wrong data type" msgstr "ACL-Array enthält falschen Datentyp" -#: utils/adt/acl.c:576 +#: utils/adt/acl.c:582 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "ACL-Arrays müssen eindimensional sein" -#: utils/adt/acl.c:580 +#: utils/adt/acl.c:586 #, c-format msgid "ACL arrays must not contain null values" msgstr "ACL-Array darf keine NULL-Werte enthalten" -#: utils/adt/acl.c:609 +#: utils/adt/acl.c:615 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "überflüssiger Müll am Ende der ACL-Angabe" -#: utils/adt/acl.c:1251 +#: utils/adt/acl.c:1263 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "Grant-Optionen können nicht an den eigenen Grantor gegeben werden" -#: utils/adt/acl.c:1567 +#: utils/adt/acl.c:1579 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert wird nicht mehr unterstützt" -#: utils/adt/acl.c:1577 +#: utils/adt/acl.c:1589 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove wird nicht mehr unterstützt" -#: utils/adt/acl.c:1697 +#: utils/adt/acl.c:1709 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "unbekannter Privilegtyp: »%s«" -#: utils/adt/acl.c:3484 utils/adt/regproc.c:100 utils/adt/regproc.c:265 +#: utils/adt/acl.c:3550 utils/adt/regproc.c:100 utils/adt/regproc.c:265 #, c-format msgid "function \"%s\" does not exist" msgstr "Funktion »%s« existiert nicht" -#: utils/adt/acl.c:5031 -#, fuzzy, c-format -#| msgid "must be member of role \"%s\"" +#: utils/adt/acl.c:5196 +#, c-format msgid "must be able to SET ROLE \"%s\"" -msgstr "Berechtigung nur für Mitglied von Rolle »%s«" +msgstr "Berechtigung nur für Rollen, die SET ROLE \"%s\" ausführen können" #: utils/adt/array_userfuncs.c:102 utils/adt/array_userfuncs.c:489 -#: utils/adt/array_userfuncs.c:878 utils/adt/json.c:694 utils/adt/json.c:831 -#: utils/adt/json.c:869 utils/adt/jsonb.c:1139 utils/adt/jsonb.c:1211 -#: utils/adt/jsonb.c:1629 utils/adt/jsonb.c:1817 utils/adt/jsonb.c:1827 +#: utils/adt/array_userfuncs.c:866 utils/adt/json.c:602 utils/adt/json.c:740 +#: utils/adt/json.c:790 utils/adt/jsonb.c:1025 utils/adt/jsonb.c:1098 +#: utils/adt/jsonb.c:1530 utils/adt/jsonb.c:1718 utils/adt/jsonb.c:1728 #, c-format msgid "could not determine input data type" msgstr "konnte Eingabedatentypen nicht bestimmen" @@ -23550,17 +24460,17 @@ msgid "input data type is not an array" msgstr "Eingabedatentyp ist kein Array" #: utils/adt/array_userfuncs.c:151 utils/adt/array_userfuncs.c:203 -#: utils/adt/float.c:1228 utils/adt/float.c:1302 utils/adt/float.c:4117 -#: utils/adt/float.c:4155 utils/adt/int.c:778 utils/adt/int.c:800 +#: utils/adt/float.c:1222 utils/adt/float.c:1296 utils/adt/float.c:4022 +#: utils/adt/float.c:4060 utils/adt/int.c:778 utils/adt/int.c:800 #: utils/adt/int.c:814 utils/adt/int.c:828 utils/adt/int.c:859 #: utils/adt/int.c:880 utils/adt/int.c:997 utils/adt/int.c:1011 #: utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 #: utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 #: utils/adt/int.c:1263 utils/adt/int.c:1331 utils/adt/int.c:1337 -#: utils/adt/int8.c:1257 utils/adt/numeric.c:1901 utils/adt/numeric.c:4388 -#: utils/adt/rangetypes.c:1481 utils/adt/rangetypes.c:1494 -#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1132 -#: utils/adt/varlena.c:3134 +#: utils/adt/int8.c:1256 utils/adt/numeric.c:1917 utils/adt/numeric.c:4454 +#: utils/adt/rangetypes.c:1488 utils/adt/rangetypes.c:1501 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1135 +#: utils/adt/varlena.c:3137 #, c-format msgid "integer out of range" msgstr "integer ist außerhalb des gültigen Bereichs" @@ -23597,267 +24507,278 @@ msgstr "Arrays mit unterschiedlichen Elementdimensionen sind nicht kompatibel f msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "Arrays mit unterschiedlichen Dimensionen sind nicht kompatibel für Aneinanderhängen." -#: utils/adt/array_userfuncs.c:987 utils/adt/array_userfuncs.c:995 -#: utils/adt/arrayfuncs.c:5590 utils/adt/arrayfuncs.c:5596 +#: utils/adt/array_userfuncs.c:975 utils/adt/array_userfuncs.c:983 +#: utils/adt/arrayfuncs.c:5616 utils/adt/arrayfuncs.c:5622 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "Arrays unterschiedlicher Dimensionalität können nicht akkumuliert werden" -#: utils/adt/array_userfuncs.c:1286 utils/adt/array_userfuncs.c:1440 +#: utils/adt/array_userfuncs.c:1272 utils/adt/array_userfuncs.c:1426 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "Suche nach Elementen in mehrdimensionalen Arrays wird nicht unterstützt" -#: utils/adt/array_userfuncs.c:1315 +#: utils/adt/array_userfuncs.c:1301 #, c-format msgid "initial position must not be null" msgstr "Startposition darf nicht NULL sein" -#: utils/adt/array_userfuncs.c:1688 +#: utils/adt/array_userfuncs.c:1674 #, c-format msgid "sample size must be between 0 and %d" msgstr "Stichprobengröße muss zwischen 0 und %d sein" -#: utils/adt/arrayfuncs.c:273 utils/adt/arrayfuncs.c:287 -#: utils/adt/arrayfuncs.c:298 utils/adt/arrayfuncs.c:320 -#: utils/adt/arrayfuncs.c:337 utils/adt/arrayfuncs.c:351 -#: utils/adt/arrayfuncs.c:359 utils/adt/arrayfuncs.c:366 -#: utils/adt/arrayfuncs.c:506 utils/adt/arrayfuncs.c:521 -#: utils/adt/arrayfuncs.c:532 utils/adt/arrayfuncs.c:547 -#: utils/adt/arrayfuncs.c:568 utils/adt/arrayfuncs.c:598 -#: utils/adt/arrayfuncs.c:605 utils/adt/arrayfuncs.c:613 -#: utils/adt/arrayfuncs.c:647 utils/adt/arrayfuncs.c:670 -#: utils/adt/arrayfuncs.c:690 utils/adt/arrayfuncs.c:807 -#: utils/adt/arrayfuncs.c:816 utils/adt/arrayfuncs.c:846 -#: utils/adt/arrayfuncs.c:861 utils/adt/arrayfuncs.c:914 +#: utils/adt/arrayfuncs.c:264 utils/adt/arrayfuncs.c:273 +#: utils/adt/arrayfuncs.c:284 utils/adt/arrayfuncs.c:307 +#: utils/adt/arrayfuncs.c:440 utils/adt/arrayfuncs.c:454 +#: utils/adt/arrayfuncs.c:466 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:668 utils/adt/arrayfuncs.c:703 +#: utils/adt/arrayfuncs.c:718 utils/adt/arrayfuncs.c:777 +#: utils/adt/arrayfuncs.c:782 utils/adt/arrayfuncs.c:870 +#: utils/adt/arrayfuncs.c:897 utils/adt/arrayfuncs.c:904 +#: utils/adt/arrayfuncs.c:941 #, c-format msgid "malformed array literal: \"%s\"" msgstr "fehlerhafte Arraykonstante: »%s«" -#: utils/adt/arrayfuncs.c:274 +#: utils/adt/arrayfuncs.c:265 #, c-format -msgid "\"[\" must introduce explicitly-specified array dimensions." -msgstr "Auf »[« müssen explizit angegebene Array-Dimensionen folgen." - -#: utils/adt/arrayfuncs.c:288 -#, c-format -msgid "Missing array dimension value." -msgstr "Dimensionswert fehlt." +msgid "Array value must start with \"{\" or dimension information." +msgstr "Arraywert muss mit »{« oder Dimensionsinformationen anfangen." -#: utils/adt/arrayfuncs.c:299 utils/adt/arrayfuncs.c:338 +#: utils/adt/arrayfuncs.c:274 utils/adt/arrayfuncs.c:467 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "»%s« fehlt nach Arraydimensionen." -#: utils/adt/arrayfuncs.c:308 utils/adt/arrayfuncs.c:2933 -#: utils/adt/arrayfuncs.c:2965 utils/adt/arrayfuncs.c:2980 +#: utils/adt/arrayfuncs.c:285 #, c-format -msgid "upper bound cannot be less than lower bound" -msgstr "Obergrenze kann nicht kleiner als Untergrenze sein" +msgid "Array contents must start with \"{\"." +msgstr "Array-Inhalt muss mit {« anfangen." -#: utils/adt/arrayfuncs.c:321 +#: utils/adt/arrayfuncs.c:308 utils/adt/multirangetypes.c:292 #, c-format -msgid "Array value must start with \"{\" or dimension information." -msgstr "Arraywert muss mit »{« oder Dimensionsinformationen anfangen." +msgid "Junk after closing right brace." +msgstr "Müll nach schließender rechter geschweifter Klammer." -#: utils/adt/arrayfuncs.c:352 +#: utils/adt/arrayfuncs.c:431 utils/adt/arrayfuncs.c:643 #, c-format -msgid "Array contents must start with \"{\"." -msgstr "Array-Inhalt muss mit {« anfangen." +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "Anzahl der Arraydimensionen überschreitet erlaubtes Maximum (%d)" -#: utils/adt/arrayfuncs.c:360 utils/adt/arrayfuncs.c:367 +#: utils/adt/arrayfuncs.c:441 #, c-format -msgid "Specified array dimensions do not match array contents." -msgstr "Angegebene Array-Dimensionen stimmen nicht mit dem Array-Inhalt überein." +msgid "\"[\" must introduce explicitly-specified array dimensions." +msgstr "Auf »[« müssen explizit angegebene Array-Dimensionen folgen." -#: utils/adt/arrayfuncs.c:507 utils/adt/arrayfuncs.c:533 -#: utils/adt/multirangetypes.c:166 utils/adt/rangetypes.c:2405 -#: utils/adt/rangetypes.c:2413 utils/adt/rowtypes.c:219 -#: utils/adt/rowtypes.c:230 +#: utils/adt/arrayfuncs.c:455 #, c-format -msgid "Unexpected end of input." -msgstr "Unerwartetes Ende der Eingabe." +msgid "Missing array dimension value." +msgstr "Dimensionswert fehlt." + +#: utils/adt/arrayfuncs.c:481 utils/adt/arrayfuncs.c:2940 +#: utils/adt/arrayfuncs.c:2985 utils/adt/arrayfuncs.c:3000 +#, c-format +msgid "upper bound cannot be less than lower bound" +msgstr "Obergrenze kann nicht kleiner als Untergrenze sein" + +#: utils/adt/arrayfuncs.c:487 +#, c-format +msgid "array upper bound is too large: %d" +msgstr "Array-Obergrenze ist zu groß: %d" -#: utils/adt/arrayfuncs.c:522 utils/adt/arrayfuncs.c:569 -#: utils/adt/arrayfuncs.c:599 utils/adt/arrayfuncs.c:648 +#: utils/adt/arrayfuncs.c:538 +#, c-format +msgid "array bound is out of integer range" +msgstr "Array-Grenze ist außerhalb des gültigen Bereichs für ganze Zahlen" + +#: utils/adt/arrayfuncs.c:637 utils/adt/arrayfuncs.c:669 +#: utils/adt/arrayfuncs.c:704 utils/adt/arrayfuncs.c:898 #, c-format msgid "Unexpected \"%c\" character." msgstr "Unerwartetes Zeichen »%c«." -#: utils/adt/arrayfuncs.c:548 utils/adt/arrayfuncs.c:671 +#: utils/adt/arrayfuncs.c:719 #, c-format msgid "Unexpected array element." msgstr "Unerwartetes Arrayelement." -#: utils/adt/arrayfuncs.c:606 +#: utils/adt/arrayfuncs.c:778 #, c-format -msgid "Unmatched \"%c\" character." -msgstr "Zeichen »%c« ohne Gegenstück." +msgid "Specified array dimensions do not match array contents." +msgstr "Angegebene Array-Dimensionen stimmen nicht mit dem Array-Inhalt überein." -#: utils/adt/arrayfuncs.c:614 utils/adt/jsonfuncs.c:2553 +#: utils/adt/arrayfuncs.c:783 utils/adt/jsonfuncs.c:2598 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "Mehrdimensionale Arrays müssen Arraysausdrücke mit gleicher Anzahl Dimensionen haben." -#: utils/adt/arrayfuncs.c:691 utils/adt/multirangetypes.c:293 +#: utils/adt/arrayfuncs.c:871 utils/adt/arrayfuncs.c:905 #, c-format -msgid "Junk after closing right brace." -msgstr "Müll nach schließender rechter geschweifter Klammer." +msgid "Incorrectly quoted array element." +msgstr "Inkorrekt gequotetes Arrayelement." + +#: utils/adt/arrayfuncs.c:942 utils/adt/multirangetypes.c:165 +#: utils/adt/rangetypes.c:2464 utils/adt/rangetypes.c:2472 +#: utils/adt/rowtypes.c:218 utils/adt/rowtypes.c:229 +#, c-format +msgid "Unexpected end of input." +msgstr "Unerwartetes Ende der Eingabe." -#: utils/adt/arrayfuncs.c:1325 utils/adt/arrayfuncs.c:3479 -#: utils/adt/arrayfuncs.c:6080 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 +#: utils/adt/arrayfuncs.c:6108 #, c-format msgid "invalid number of dimensions: %d" msgstr "ungültige Anzahl Dimensionen: %d" -#: utils/adt/arrayfuncs.c:1336 +#: utils/adt/arrayfuncs.c:1312 #, c-format msgid "invalid array flags" msgstr "ungültige Array-Flags" -#: utils/adt/arrayfuncs.c:1358 +#: utils/adt/arrayfuncs.c:1334 #, c-format msgid "binary data has array element type %u (%s) instead of expected %u (%s)" msgstr "binäre Daten haben Array-Elementtyp %u (%s) statt erwartet %u (%s)" -#: utils/adt/arrayfuncs.c:1402 utils/adt/multirangetypes.c:451 -#: utils/adt/rangetypes.c:344 utils/cache/lsyscache.c:2916 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:450 +#: utils/adt/rangetypes.c:351 utils/cache/lsyscache.c:2958 #, c-format msgid "no binary input function available for type %s" msgstr "keine binäre Eingabefunktion verfügbar für Typ %s" -#: utils/adt/arrayfuncs.c:1542 +#: utils/adt/arrayfuncs.c:1509 #, c-format msgid "improper binary format in array element %d" msgstr "falsches Binärformat in Arrayelement %d" -#: utils/adt/arrayfuncs.c:1623 utils/adt/multirangetypes.c:456 -#: utils/adt/rangetypes.c:349 utils/cache/lsyscache.c:2949 +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 +#: utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:2991 #, c-format msgid "no binary output function available for type %s" msgstr "keine binäre Ausgabefunktion verfügbar für Typ %s" -#: utils/adt/arrayfuncs.c:2102 +#: utils/adt/arrayfuncs.c:2067 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "Auswählen von Stücken aus Arrays mit fester Länge ist nicht implementiert" -#: utils/adt/arrayfuncs.c:2280 utils/adt/arrayfuncs.c:2302 -#: utils/adt/arrayfuncs.c:2351 utils/adt/arrayfuncs.c:2589 -#: utils/adt/arrayfuncs.c:2911 utils/adt/arrayfuncs.c:6066 -#: utils/adt/arrayfuncs.c:6092 utils/adt/arrayfuncs.c:6103 -#: utils/adt/json.c:1497 utils/adt/json.c:1569 utils/adt/jsonb.c:1416 -#: utils/adt/jsonb.c:1500 utils/adt/jsonfuncs.c:4434 utils/adt/jsonfuncs.c:4587 -#: utils/adt/jsonfuncs.c:4698 utils/adt/jsonfuncs.c:4746 +#: utils/adt/arrayfuncs.c:2245 utils/adt/arrayfuncs.c:2267 +#: utils/adt/arrayfuncs.c:2316 utils/adt/arrayfuncs.c:2570 +#: utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6094 +#: utils/adt/arrayfuncs.c:6120 utils/adt/arrayfuncs.c:6131 +#: utils/adt/json.c:1433 utils/adt/json.c:1505 utils/adt/jsonb.c:1317 +#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4710 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4974 utils/adt/jsonfuncs.c:5022 #, c-format msgid "wrong number of array subscripts" msgstr "falsche Anzahl Arrayindizes" -#: utils/adt/arrayfuncs.c:2285 utils/adt/arrayfuncs.c:2393 -#: utils/adt/arrayfuncs.c:2656 utils/adt/arrayfuncs.c:2970 +#: utils/adt/arrayfuncs.c:2250 utils/adt/arrayfuncs.c:2374 +#: utils/adt/arrayfuncs.c:2653 utils/adt/arrayfuncs.c:2990 #, c-format msgid "array subscript out of range" msgstr "Arrayindex außerhalb des gültigen Bereichs" -#: utils/adt/arrayfuncs.c:2290 +#: utils/adt/arrayfuncs.c:2255 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "Array mit fester Länge kann keinen NULL-Wert enthalten" -#: utils/adt/arrayfuncs.c:2858 +#: utils/adt/arrayfuncs.c:2855 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "Aktualisieren von Stücken aus Arrays mit fester Länge ist nicht implementiert" -#: utils/adt/arrayfuncs.c:2889 +#: utils/adt/arrayfuncs.c:2886 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "Array-Slice-Index muss beide Begrenzungen angeben" -#: utils/adt/arrayfuncs.c:2890 +#: utils/adt/arrayfuncs.c:2887 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "Wenn ein Slice eines leeren Array-Wertes zugewiesen wird, dann müssen die Slice-Begrenzungen vollständig angegeben werden." -#: utils/adt/arrayfuncs.c:2901 utils/adt/arrayfuncs.c:2997 +#: utils/adt/arrayfuncs.c:2905 utils/adt/arrayfuncs.c:3017 #, c-format msgid "source array too small" msgstr "Quellarray ist zu klein" -#: utils/adt/arrayfuncs.c:3637 +#: utils/adt/arrayfuncs.c:3657 #, c-format msgid "null array element not allowed in this context" msgstr "NULL-Werte im Array sind in diesem Zusammenhang nicht erlaubt" -#: utils/adt/arrayfuncs.c:3808 utils/adt/arrayfuncs.c:3979 -#: utils/adt/arrayfuncs.c:4370 +#: utils/adt/arrayfuncs.c:3828 utils/adt/arrayfuncs.c:3999 +#: utils/adt/arrayfuncs.c:4390 #, c-format msgid "cannot compare arrays of different element types" msgstr "kann Arrays mit verschiedenen Elementtypen nicht vergleichen" -#: utils/adt/arrayfuncs.c:4157 utils/adt/multirangetypes.c:2806 -#: utils/adt/multirangetypes.c:2878 utils/adt/rangetypes.c:1354 -#: utils/adt/rangetypes.c:1418 utils/adt/rowtypes.c:1885 +#: utils/adt/arrayfuncs.c:4177 utils/adt/multirangetypes.c:2805 +#: utils/adt/multirangetypes.c:2877 utils/adt/rangetypes.c:1361 +#: utils/adt/rangetypes.c:1425 utils/adt/rowtypes.c:1875 #, c-format msgid "could not identify a hash function for type %s" msgstr "konnte keine Hash-Funktion für Typ %s ermitteln" -#: utils/adt/arrayfuncs.c:4285 utils/adt/rowtypes.c:2006 +#: utils/adt/arrayfuncs.c:4305 utils/adt/rowtypes.c:1996 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "konnte keine erweiterte Hash-Funktion für Typ %s ermitteln" -#: utils/adt/arrayfuncs.c:5480 +#: utils/adt/arrayfuncs.c:5506 #, c-format msgid "data type %s is not an array type" msgstr "Datentyp %s ist kein Array-Typ" -#: utils/adt/arrayfuncs.c:5535 +#: utils/adt/arrayfuncs.c:5561 #, c-format msgid "cannot accumulate null arrays" msgstr "Arrays, die NULL sind, können nicht akkumuliert werden" -#: utils/adt/arrayfuncs.c:5563 +#: utils/adt/arrayfuncs.c:5589 #, c-format msgid "cannot accumulate empty arrays" msgstr "leere Arrays können nicht akkumuliert werden" -#: utils/adt/arrayfuncs.c:5964 utils/adt/arrayfuncs.c:6004 +#: utils/adt/arrayfuncs.c:5992 utils/adt/arrayfuncs.c:6032 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "Dimensions-Array oder Untergrenzen-Array darf nicht NULL sein" -#: utils/adt/arrayfuncs.c:6067 utils/adt/arrayfuncs.c:6093 +#: utils/adt/arrayfuncs.c:6095 utils/adt/arrayfuncs.c:6121 #, c-format msgid "Dimension array must be one dimensional." msgstr "Dimensions-Array muss eindimensional sein." -#: utils/adt/arrayfuncs.c:6072 utils/adt/arrayfuncs.c:6098 +#: utils/adt/arrayfuncs.c:6100 utils/adt/arrayfuncs.c:6126 #, c-format msgid "dimension values cannot be null" msgstr "Dimensionswerte dürfen nicht NULL sein" -#: utils/adt/arrayfuncs.c:6104 +#: utils/adt/arrayfuncs.c:6132 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Untergrenzen-Array hat andere Größe als Dimensions-Array." -#: utils/adt/arrayfuncs.c:6382 +#: utils/adt/arrayfuncs.c:6413 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "Entfernen von Elementen aus mehrdimensionalen Arrays wird nicht unterstützt" -#: utils/adt/arrayfuncs.c:6659 +#: utils/adt/arrayfuncs.c:6690 #, c-format msgid "thresholds must be one-dimensional array" msgstr "Parameter »thresholds« muss ein eindimensionales Array sein" -#: utils/adt/arrayfuncs.c:6664 +#: utils/adt/arrayfuncs.c:6695 #, c-format msgid "thresholds array must not contain NULLs" msgstr "»thresholds«-Array darf keine NULL-Werte enthalten" -#: utils/adt/arrayfuncs.c:6897 +#: utils/adt/arrayfuncs.c:6928 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "Anzahl der zu entfernenden Elemente muss zwischen 0 und %d sein" @@ -23872,22 +24793,22 @@ msgstr "Arrayindex muss Typ integer haben" msgid "array subscript in assignment must not be null" msgstr "Arrayindex in Zuweisung darf nicht NULL sein" -#: utils/adt/arrayutils.c:161 +#: utils/adt/arrayutils.c:140 #, c-format msgid "array lower bound is too large: %d" msgstr "Array-Untergrenze ist zu groß: %d" -#: utils/adt/arrayutils.c:263 +#: utils/adt/arrayutils.c:242 #, c-format msgid "typmod array must be type cstring[]" msgstr "Typmod-Array muss Typ cstring[] haben" -#: utils/adt/arrayutils.c:268 +#: utils/adt/arrayutils.c:247 #, c-format msgid "typmod array must be one-dimensional" msgstr "Typmod-Arrays müssen eindimensional sein" -#: utils/adt/arrayutils.c:273 +#: utils/adt/arrayutils.c:252 #, c-format msgid "typmod array must not contain nulls" msgstr "Typmod-Array darf keine NULL-Werte enthalten" @@ -23898,48 +24819,52 @@ msgid "encoding conversion from %s to ASCII not supported" msgstr "Kodierungsumwandlung zwischen %s und ASCII wird nicht unterstützt" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:4017 -#: utils/adt/float.c:206 utils/adt/float.c:293 utils/adt/float.c:307 -#: utils/adt/float.c:412 utils/adt/float.c:495 utils/adt/float.c:509 +#: utils/adt/bool.c:149 utils/adt/cash.c:354 utils/adt/datetime.c:4142 +#: utils/adt/float.c:200 utils/adt/float.c:287 utils/adt/float.c:301 +#: utils/adt/float.c:406 utils/adt/float.c:489 utils/adt/float.c:503 #: utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 #: utils/adt/geo_ops.c:1417 utils/adt/geo_ops.c:1454 utils/adt/geo_ops.c:1462 #: utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 #: utils/adt/geo_ops.c:4672 utils/adt/int.c:174 utils/adt/int.c:186 -#: utils/adt/jsonpath.c:183 utils/adt/mac.c:94 utils/adt/mac8.c:225 -#: utils/adt/network.c:99 utils/adt/numeric.c:795 utils/adt/numeric.c:7136 -#: utils/adt/numeric.c:7339 utils/adt/numeric.c:8286 utils/adt/numutils.c:273 -#: utils/adt/numutils.c:451 utils/adt/numutils.c:629 utils/adt/numutils.c:668 -#: utils/adt/numutils.c:690 utils/adt/numutils.c:754 utils/adt/numutils.c:776 -#: utils/adt/pg_lsn.c:74 utils/adt/tid.c:72 utils/adt/tid.c:80 -#: utils/adt/tid.c:94 utils/adt/tid.c:103 utils/adt/timestamp.c:494 -#: utils/adt/uuid.c:135 utils/adt/xid8funcs.c:354 +#: utils/adt/jsonpath.c:185 utils/adt/mac.c:94 utils/adt/mac8.c:226 +#: utils/adt/network.c:99 utils/adt/numeric.c:803 utils/adt/numeric.c:7221 +#: utils/adt/numeric.c:7424 utils/adt/numeric.c:8371 utils/adt/numutils.c:356 +#: utils/adt/numutils.c:618 utils/adt/numutils.c:880 utils/adt/numutils.c:919 +#: utils/adt/numutils.c:941 utils/adt/numutils.c:1005 utils/adt/numutils.c:1027 +#: utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 +#: utils/adt/tid.c:94 utils/adt/tid.c:103 utils/adt/timestamp.c:510 +#: utils/adt/uuid.c:140 utils/adt/xid8funcs.c:323 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "ungültige Eingabesyntax für Typ %s: »%s«" -#: utils/adt/cash.c:215 utils/adt/cash.c:240 utils/adt/cash.c:250 -#: utils/adt/cash.c:290 utils/adt/int.c:180 utils/adt/numutils.c:267 -#: utils/adt/numutils.c:445 utils/adt/numutils.c:623 utils/adt/numutils.c:674 -#: utils/adt/numutils.c:713 utils/adt/numutils.c:760 +#: utils/adt/cash.c:98 utils/adt/cash.c:111 utils/adt/cash.c:124 +#: utils/adt/cash.c:137 utils/adt/cash.c:150 #, c-format -msgid "value \"%s\" is out of range for type %s" -msgstr "Wert »%s« ist außerhalb des gültigen Bereichs für Typ %s" +msgid "money out of range" +msgstr "money ist außerhalb des gültigen Bereichs" -#: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 -#: utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 -#: utils/adt/float.c:105 utils/adt/int.c:843 utils/adt/int.c:959 -#: utils/adt/int.c:1039 utils/adt/int.c:1101 utils/adt/int.c:1139 -#: utils/adt/int.c:1167 utils/adt/int8.c:515 utils/adt/int8.c:573 -#: utils/adt/int8.c:943 utils/adt/int8.c:1023 utils/adt/int8.c:1085 -#: utils/adt/int8.c:1165 utils/adt/numeric.c:3175 utils/adt/numeric.c:3198 -#: utils/adt/numeric.c:3283 utils/adt/numeric.c:3301 utils/adt/numeric.c:3397 -#: utils/adt/numeric.c:8835 utils/adt/numeric.c:9148 utils/adt/numeric.c:9496 -#: utils/adt/numeric.c:9612 utils/adt/numeric.c:11122 -#: utils/adt/timestamp.c:3406 +#: utils/adt/cash.c:161 utils/adt/cash.c:723 utils/adt/float.c:99 +#: utils/adt/int.c:843 utils/adt/int.c:959 utils/adt/int.c:1039 +#: utils/adt/int.c:1101 utils/adt/int.c:1139 utils/adt/int.c:1167 +#: utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:942 +#: utils/adt/int8.c:1022 utils/adt/int8.c:1084 utils/adt/int8.c:1164 +#: utils/adt/numeric.c:3191 utils/adt/numeric.c:3214 utils/adt/numeric.c:3299 +#: utils/adt/numeric.c:3317 utils/adt/numeric.c:3413 utils/adt/numeric.c:8920 +#: utils/adt/numeric.c:9233 utils/adt/numeric.c:9581 utils/adt/numeric.c:9697 +#: utils/adt/numeric.c:11208 utils/adt/timestamp.c:3713 #, c-format msgid "division by zero" msgstr "Division durch Null" +#: utils/adt/cash.c:292 utils/adt/cash.c:317 utils/adt/cash.c:327 +#: utils/adt/cash.c:367 utils/adt/int.c:180 utils/adt/numutils.c:350 +#: utils/adt/numutils.c:612 utils/adt/numutils.c:874 utils/adt/numutils.c:925 +#: utils/adt/numutils.c:964 utils/adt/numutils.c:1011 +#, c-format +msgid "value \"%s\" is out of range for type %s" +msgstr "Wert »%s« ist außerhalb des gültigen Bereichs für Typ %s" + #: utils/adt/char.c:197 #, c-format msgid "\"char\" out of range" @@ -23950,159 +24875,186 @@ msgstr "\"char\" ist außerhalb des gültigen Bereichs" msgid "could not compute %s hash: %s" msgstr "konnte %s-Hash nicht berechnen: %s" -#: utils/adt/date.c:63 utils/adt/timestamp.c:100 utils/adt/varbit.c:105 -#: utils/adt/varchar.c:49 +#: utils/adt/date.c:64 utils/adt/timestamp.c:116 utils/adt/varbit.c:105 +#: utils/adt/varchar.c:48 #, c-format msgid "invalid type modifier" msgstr "ungültige Typmodifikation" -#: utils/adt/date.c:75 +#: utils/adt/date.c:76 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "Präzision von TIME(%d)%s darf nicht negativ sein" -#: utils/adt/date.c:81 +#: utils/adt/date.c:82 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "Präzision von TIME(%d)%s auf erlaubten Höchstwert %d reduziert" -#: utils/adt/date.c:166 utils/adt/date.c:174 utils/adt/formatting.c:4241 -#: utils/adt/formatting.c:4250 utils/adt/formatting.c:4363 -#: utils/adt/formatting.c:4373 +#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4424 +#: utils/adt/formatting.c:4433 utils/adt/formatting.c:4538 +#: utils/adt/formatting.c:4548 #, c-format msgid "date out of range: \"%s\"" msgstr "date ist außerhalb des gültigen Bereichs: »%s«" -#: utils/adt/date.c:221 utils/adt/date.c:519 utils/adt/date.c:543 -#: utils/adt/rangetypes.c:1577 utils/adt/rangetypes.c:1592 utils/adt/xml.c:2460 +#: utils/adt/date.c:222 utils/adt/date.c:520 utils/adt/date.c:544 +#: utils/adt/rangetypes.c:1584 utils/adt/rangetypes.c:1599 utils/adt/xml.c:2552 #, c-format msgid "date out of range" msgstr "date ist außerhalb des gültigen Bereichs" -#: utils/adt/date.c:267 utils/adt/timestamp.c:582 +#: utils/adt/date.c:268 utils/adt/timestamp.c:598 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "Datum-Feldwert ist außerhalb des gültigen Bereichs: %d-%02d-%02d" -#: utils/adt/date.c:274 utils/adt/date.c:283 utils/adt/timestamp.c:588 +#: utils/adt/date.c:275 utils/adt/date.c:284 utils/adt/timestamp.c:604 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "date ist außerhalb des gültigen Bereichs: %d-%02d-%02d" -#: utils/adt/date.c:494 +#: utils/adt/date.c:495 #, c-format msgid "cannot subtract infinite dates" msgstr "kann unendliche date-Werte nicht subtrahieren" -#: utils/adt/date.c:592 utils/adt/date.c:655 utils/adt/date.c:691 -#: utils/adt/date.c:2885 utils/adt/date.c:2895 +#: utils/adt/date.c:593 utils/adt/date.c:656 utils/adt/date.c:692 +#: utils/adt/date.c:2906 utils/adt/date.c:2916 #, c-format msgid "date out of range for timestamp" msgstr "Datum ist außerhalb des gültigen Bereichs für Typ »timestamp«" -#: utils/adt/date.c:1121 utils/adt/date.c:1204 utils/adt/date.c:1220 -#: utils/adt/date.c:2206 utils/adt/date.c:2990 utils/adt/timestamp.c:4097 -#: utils/adt/timestamp.c:4290 utils/adt/timestamp.c:4432 -#: utils/adt/timestamp.c:4685 utils/adt/timestamp.c:4886 -#: utils/adt/timestamp.c:4933 utils/adt/timestamp.c:5157 -#: utils/adt/timestamp.c:5204 utils/adt/timestamp.c:5334 +#: utils/adt/date.c:1122 utils/adt/date.c:1205 utils/adt/date.c:1221 +#: utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4726 +#: utils/adt/timestamp.c:4941 utils/adt/timestamp.c:5089 +#: utils/adt/timestamp.c:5342 utils/adt/timestamp.c:5543 +#: utils/adt/timestamp.c:5590 utils/adt/timestamp.c:5814 +#: utils/adt/timestamp.c:5861 utils/adt/timestamp.c:5941 +#: utils/adt/timestamp.c:6070 #, c-format msgid "unit \"%s\" not supported for type %s" msgstr "Einheit »%s« nicht unterstützt für Typ %s" -#: utils/adt/date.c:1229 utils/adt/date.c:2222 utils/adt/date.c:3010 -#: utils/adt/timestamp.c:4111 utils/adt/timestamp.c:4307 -#: utils/adt/timestamp.c:4446 utils/adt/timestamp.c:4645 -#: utils/adt/timestamp.c:4942 utils/adt/timestamp.c:5213 -#: utils/adt/timestamp.c:5395 +#: utils/adt/date.c:1230 utils/adt/date.c:2231 utils/adt/date.c:3031 +#: utils/adt/timestamp.c:4740 utils/adt/timestamp.c:4958 +#: utils/adt/timestamp.c:5103 utils/adt/timestamp.c:5302 +#: utils/adt/timestamp.c:5599 utils/adt/timestamp.c:5870 +#: utils/adt/timestamp.c:5911 utils/adt/timestamp.c:6131 #, c-format msgid "unit \"%s\" not recognized for type %s" msgstr "Einheit »%s« nicht erkannt für Typ %s" -#: utils/adt/date.c:1313 utils/adt/date.c:1359 utils/adt/date.c:1918 -#: utils/adt/date.c:1949 utils/adt/date.c:1978 utils/adt/date.c:2848 -#: utils/adt/date.c:3080 utils/adt/datetime.c:424 utils/adt/datetime.c:1809 -#: utils/adt/formatting.c:4081 utils/adt/formatting.c:4117 -#: utils/adt/formatting.c:4210 utils/adt/formatting.c:4339 utils/adt/json.c:467 -#: utils/adt/json.c:506 utils/adt/timestamp.c:232 utils/adt/timestamp.c:264 -#: utils/adt/timestamp.c:700 utils/adt/timestamp.c:709 -#: utils/adt/timestamp.c:787 utils/adt/timestamp.c:820 -#: utils/adt/timestamp.c:2933 utils/adt/timestamp.c:2954 -#: utils/adt/timestamp.c:2967 utils/adt/timestamp.c:2976 -#: utils/adt/timestamp.c:2984 utils/adt/timestamp.c:3045 -#: utils/adt/timestamp.c:3068 utils/adt/timestamp.c:3081 -#: utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3100 -#: utils/adt/timestamp.c:3801 utils/adt/timestamp.c:3925 -#: utils/adt/timestamp.c:4015 utils/adt/timestamp.c:4105 -#: utils/adt/timestamp.c:4198 utils/adt/timestamp.c:4301 -#: utils/adt/timestamp.c:4750 utils/adt/timestamp.c:5024 -#: utils/adt/timestamp.c:5463 utils/adt/timestamp.c:5473 -#: utils/adt/timestamp.c:5478 utils/adt/timestamp.c:5484 -#: utils/adt/timestamp.c:5517 utils/adt/timestamp.c:5604 -#: utils/adt/timestamp.c:5645 utils/adt/timestamp.c:5649 -#: utils/adt/timestamp.c:5703 utils/adt/timestamp.c:5707 -#: utils/adt/timestamp.c:5713 utils/adt/timestamp.c:5747 utils/adt/xml.c:2482 -#: utils/adt/xml.c:2489 utils/adt/xml.c:2509 utils/adt/xml.c:2516 +#: utils/adt/date.c:1314 utils/adt/date.c:1360 utils/adt/date.c:1919 +#: utils/adt/date.c:1950 utils/adt/date.c:1979 utils/adt/date.c:2869 +#: utils/adt/date.c:3101 utils/adt/datetime.c:422 utils/adt/datetime.c:1807 +#: utils/adt/formatting.c:4269 utils/adt/formatting.c:4305 +#: utils/adt/formatting.c:4392 utils/adt/formatting.c:4514 utils/adt/json.c:366 +#: utils/adt/json.c:405 utils/adt/timestamp.c:248 utils/adt/timestamp.c:280 +#: utils/adt/timestamp.c:716 utils/adt/timestamp.c:725 +#: utils/adt/timestamp.c:803 utils/adt/timestamp.c:836 +#: utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3075 +#: utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3097 +#: utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3129 +#: utils/adt/timestamp.c:3140 utils/adt/timestamp.c:3146 +#: utils/adt/timestamp.c:3152 utils/adt/timestamp.c:3157 +#: utils/adt/timestamp.c:3210 utils/adt/timestamp.c:3219 +#: utils/adt/timestamp.c:3240 utils/adt/timestamp.c:3245 +#: utils/adt/timestamp.c:3266 utils/adt/timestamp.c:3279 +#: utils/adt/timestamp.c:3293 utils/adt/timestamp.c:3301 +#: utils/adt/timestamp.c:3307 utils/adt/timestamp.c:3312 +#: utils/adt/timestamp.c:4380 utils/adt/timestamp.c:4532 +#: utils/adt/timestamp.c:4608 utils/adt/timestamp.c:4644 +#: utils/adt/timestamp.c:4734 utils/adt/timestamp.c:4813 +#: utils/adt/timestamp.c:4849 utils/adt/timestamp.c:4952 +#: utils/adt/timestamp.c:5407 utils/adt/timestamp.c:5681 +#: utils/adt/timestamp.c:6199 utils/adt/timestamp.c:6209 +#: utils/adt/timestamp.c:6214 utils/adt/timestamp.c:6220 +#: utils/adt/timestamp.c:6260 utils/adt/timestamp.c:6347 +#: utils/adt/timestamp.c:6388 utils/adt/timestamp.c:6392 +#: utils/adt/timestamp.c:6446 utils/adt/timestamp.c:6450 +#: utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2574 +#: utils/adt/xml.c:2581 utils/adt/xml.c:2601 utils/adt/xml.c:2608 #, c-format msgid "timestamp out of range" msgstr "timestamp ist außerhalb des gültigen Bereichs" -#: utils/adt/date.c:1535 utils/adt/date.c:2343 utils/adt/formatting.c:4431 +#: utils/adt/date.c:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4597 #, c-format msgid "time out of range" msgstr "time ist außerhalb des gültigen Bereichs" -#: utils/adt/date.c:1587 utils/adt/timestamp.c:597 +#: utils/adt/date.c:1588 utils/adt/timestamp.c:613 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "Zeit-Feldwert ist außerhalb des gültigen Bereichs: %d:%02d:%02g" -#: utils/adt/date.c:2107 utils/adt/date.c:2647 utils/adt/float.c:1042 -#: utils/adt/float.c:1118 utils/adt/int.c:635 utils/adt/int.c:682 -#: utils/adt/int.c:717 utils/adt/int8.c:414 utils/adt/numeric.c:2579 -#: utils/adt/timestamp.c:3455 utils/adt/timestamp.c:3482 -#: utils/adt/timestamp.c:3513 +#: utils/adt/date.c:2020 +#, c-format +msgid "cannot convert infinite interval to time" +msgstr "kann unendlichen interval-Wert nicht in time umwandeln" + +#: utils/adt/date.c:2061 utils/adt/date.c:2605 +#, c-format +msgid "cannot add infinite interval to time" +msgstr "kann unendlichen interval-Wert nicht zu time addieren" + +#: utils/adt/date.c:2084 utils/adt/date.c:2632 +#, c-format +msgid "cannot subtract infinite interval from time" +msgstr "kann unendlichen interval-Wert nicht von time subtrahieren" + +#: utils/adt/date.c:2115 utils/adt/date.c:2667 utils/adt/float.c:1036 +#: utils/adt/float.c:1112 utils/adt/int.c:635 utils/adt/int.c:682 +#: utils/adt/int.c:717 utils/adt/int8.c:413 utils/adt/numeric.c:2595 +#: utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 +#: utils/adt/timestamp.c:3888 #, c-format msgid "invalid preceding or following size in window function" msgstr "ungültige vorhergehende oder folgende Größe in Fensterfunktion" -#: utils/adt/date.c:2351 +#: utils/adt/date.c:2360 #, c-format msgid "time zone displacement out of range" msgstr "Zeitzonenunterschied ist außerhalb des gültigen Bereichs" -#: utils/adt/date.c:3110 utils/adt/timestamp.c:5506 utils/adt/timestamp.c:5736 +#: utils/adt/date.c:3132 utils/adt/timestamp.c:6242 utils/adt/timestamp.c:6479 +#, c-format +msgid "interval time zone \"%s\" must be finite" +msgstr "Intervall-Zeitzone »%s« muss endlich sein" + +#: utils/adt/date.c:3139 utils/adt/timestamp.c:6249 utils/adt/timestamp.c:6486 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "Intervall-Zeitzone »%s« darf keine Monate oder Tage enthalten" -#: utils/adt/datetime.c:3223 utils/adt/datetime.c:4002 -#: utils/adt/datetime.c:4008 utils/adt/timestamp.c:512 +#: utils/adt/datetime.c:3232 utils/adt/datetime.c:4127 +#: utils/adt/datetime.c:4133 utils/adt/timestamp.c:528 #, c-format msgid "time zone \"%s\" not recognized" msgstr "Zeitzone »%s« nicht erkannt" -#: utils/adt/datetime.c:3976 utils/adt/datetime.c:3983 +#: utils/adt/datetime.c:4101 utils/adt/datetime.c:4108 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "Datum/Zeit-Feldwert ist außerhalb des gültigen Bereichs: »%s«" -#: utils/adt/datetime.c:3985 +#: utils/adt/datetime.c:4110 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Möglicherweise benötigen Sie eine andere »datestyle«-Einstellung." -#: utils/adt/datetime.c:3990 +#: utils/adt/datetime.c:4115 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "»interval«-Feldwert ist außerhalb des gültigen Bereichs: »%s«" -#: utils/adt/datetime.c:3996 +#: utils/adt/datetime.c:4121 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "Zeitzonenunterschied ist außerhalb des gültigen Bereichs: »%s«" -#: utils/adt/datetime.c:4010 +#: utils/adt/datetime.c:4135 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "Dieser Zeitzonenname erscheint in der Konfigurationsdatei für Zeitzonenabkürzung »%s«." @@ -24112,22 +25064,22 @@ msgstr "Dieser Zeitzonenname erscheint in der Konfigurationsdatei für Zeitzonen msgid "invalid Datum pointer" msgstr "ungültiger »Datum«-Zeiger" -#: utils/adt/dbsize.c:761 utils/adt/dbsize.c:837 +#: utils/adt/dbsize.c:764 utils/adt/dbsize.c:840 #, c-format msgid "invalid size: \"%s\"" msgstr "ungültige Größe: »%s«" -#: utils/adt/dbsize.c:838 +#: utils/adt/dbsize.c:841 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Ungültige Größeneinheit: »%s«." -#: utils/adt/dbsize.c:839 +#: utils/adt/dbsize.c:842 #, c-format msgid "Valid units are \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." msgstr "Gültige Einheiten sind »bytes«, »B«, »kB«, »MB«, »GB«, »TB« und »PB«." -#: utils/adt/domains.c:92 +#: utils/adt/domains.c:95 #, c-format msgid "type %s is not a domain" msgstr "Typ %s ist keine Domäne" @@ -24209,353 +25161,348 @@ msgstr "konnte tatsächlichen Enum-Typen nicht bestimmen" msgid "enum %s contains no values" msgstr "Enum %s enthält keine Werte" -#: utils/adt/float.c:89 +#: utils/adt/float.c:83 #, c-format msgid "value out of range: overflow" msgstr "Wert ist außerhalb des gültigen Bereichs: Überlauf" -#: utils/adt/float.c:97 +#: utils/adt/float.c:91 #, c-format msgid "value out of range: underflow" msgstr "Wert ist außerhalb des gültigen Bereichs: Unterlauf" -#: utils/adt/float.c:286 +#: utils/adt/float.c:280 #, c-format msgid "\"%s\" is out of range for type real" msgstr "»%s« ist außerhalb des gültigen Bereichs für Typ real" -#: utils/adt/float.c:488 +#: utils/adt/float.c:482 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "»%s« ist außerhalb des gültigen Bereichs für Typ double precision" -#: utils/adt/float.c:1253 utils/adt/float.c:1327 utils/adt/int.c:355 +#: utils/adt/float.c:1247 utils/adt/float.c:1321 utils/adt/int.c:355 #: utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 #: utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 -#: utils/adt/int8.c:1278 utils/adt/numeric.c:4500 utils/adt/numeric.c:4505 +#: utils/adt/int8.c:1277 utils/adt/numeric.c:4593 utils/adt/numeric.c:4598 #, c-format msgid "smallint out of range" msgstr "smallint ist außerhalb des gültigen Bereichs" -#: utils/adt/float.c:1453 utils/adt/numeric.c:3693 utils/adt/numeric.c:10027 +#: utils/adt/float.c:1447 utils/adt/numeric.c:3709 utils/adt/numeric.c:10112 #, c-format msgid "cannot take square root of a negative number" msgstr "Quadratwurzel von negativer Zahl kann nicht ermittelt werden" -#: utils/adt/float.c:1521 utils/adt/numeric.c:3981 utils/adt/numeric.c:4093 +#: utils/adt/float.c:1515 utils/adt/numeric.c:3997 utils/adt/numeric.c:4109 #, c-format msgid "zero raised to a negative power is undefined" msgstr "null hoch eine negative Zahl ist undefiniert" -#: utils/adt/float.c:1525 utils/adt/numeric.c:3985 utils/adt/numeric.c:10918 +#: utils/adt/float.c:1519 utils/adt/numeric.c:4001 utils/adt/numeric.c:11003 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "eine negative Zahl hoch eine nicht ganze Zahl ergibt ein komplexes Ergebnis" -#: utils/adt/float.c:1701 utils/adt/float.c:1734 utils/adt/numeric.c:3893 -#: utils/adt/numeric.c:10698 +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3909 +#: utils/adt/numeric.c:10783 #, c-format msgid "cannot take logarithm of zero" msgstr "Logarithmus von null kann nicht ermittelt werden" -#: utils/adt/float.c:1705 utils/adt/float.c:1738 utils/adt/numeric.c:3831 -#: utils/adt/numeric.c:3888 utils/adt/numeric.c:10702 +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3847 +#: utils/adt/numeric.c:3904 utils/adt/numeric.c:10787 #, c-format msgid "cannot take logarithm of a negative number" msgstr "Logarithmus negativer Zahlen kann nicht ermittelt werden" -#: utils/adt/float.c:1771 utils/adt/float.c:1802 utils/adt/float.c:1897 -#: utils/adt/float.c:1924 utils/adt/float.c:1952 utils/adt/float.c:1979 -#: utils/adt/float.c:2126 utils/adt/float.c:2163 utils/adt/float.c:2333 -#: utils/adt/float.c:2389 utils/adt/float.c:2454 utils/adt/float.c:2511 -#: utils/adt/float.c:2702 utils/adt/float.c:2726 +#: utils/adt/float.c:1765 utils/adt/float.c:1796 utils/adt/float.c:1891 +#: utils/adt/float.c:1918 utils/adt/float.c:1946 utils/adt/float.c:1973 +#: utils/adt/float.c:2120 utils/adt/float.c:2157 utils/adt/float.c:2327 +#: utils/adt/float.c:2383 utils/adt/float.c:2448 utils/adt/float.c:2505 +#: utils/adt/float.c:2696 utils/adt/float.c:2720 #, c-format msgid "input is out of range" msgstr "Eingabe ist außerhalb des gültigen Bereichs" -#: utils/adt/float.c:2867 -#, c-format -msgid "setseed parameter %g is out of allowed range [-1,1]" -msgstr "setseed-Parameter %g ist außerhalb des gültigen Bereichs [-1;-1]" - -#: utils/adt/float.c:4095 utils/adt/numeric.c:1841 +#: utils/adt/float.c:4000 utils/adt/numeric.c:1857 #, c-format msgid "count must be greater than zero" msgstr "Anzahl muss größer als null sein" -#: utils/adt/float.c:4100 utils/adt/numeric.c:1852 +#: utils/adt/float.c:4005 utils/adt/numeric.c:1868 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "Operand, Untergrenze und Obergrenze dürfen nicht NaN sein" -#: utils/adt/float.c:4106 utils/adt/numeric.c:1857 +#: utils/adt/float.c:4011 utils/adt/numeric.c:1873 #, c-format msgid "lower and upper bounds must be finite" msgstr "Untergrenze und Obergrenze müssen endlich sein" -#: utils/adt/float.c:4172 utils/adt/numeric.c:1871 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1887 #, c-format msgid "lower bound cannot equal upper bound" msgstr "Untergrenze kann nicht gleich der Obergrenze sein" -#: utils/adt/formatting.c:519 +#: utils/adt/formatting.c:530 #, c-format msgid "invalid format specification for an interval value" msgstr "ungültige Formatangabe für Intervall-Wert" -#: utils/adt/formatting.c:520 +#: utils/adt/formatting.c:531 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Intervalle beziehen sich nicht auf bestimmte Kalenderdaten." -#: utils/adt/formatting.c:1150 +#: utils/adt/formatting.c:1161 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "»EEEE« muss das letzte Muster sein" -#: utils/adt/formatting.c:1158 +#: utils/adt/formatting.c:1169 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "»9« muss vor »PR« stehen" -#: utils/adt/formatting.c:1174 +#: utils/adt/formatting.c:1185 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "»0« muss vor »PR« stehen" -#: utils/adt/formatting.c:1201 +#: utils/adt/formatting.c:1212 #, c-format msgid "multiple decimal points" msgstr "mehrere Dezimalpunkte" -#: utils/adt/formatting.c:1205 utils/adt/formatting.c:1288 +#: utils/adt/formatting.c:1216 utils/adt/formatting.c:1299 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "»V« und Dezimalpunkt können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1217 +#: utils/adt/formatting.c:1228 #, c-format msgid "cannot use \"S\" twice" msgstr "»S« kann nicht zweimal verwendet werden" -#: utils/adt/formatting.c:1221 +#: utils/adt/formatting.c:1232 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "»S« und »PL«/»MI«/»SG«/»PR« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1241 +#: utils/adt/formatting.c:1252 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "»S« und »MI« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1251 +#: utils/adt/formatting.c:1262 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "»S« und »PL« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1261 +#: utils/adt/formatting.c:1272 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "»S« und »SG« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1270 +#: utils/adt/formatting.c:1281 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "»PR« und »S«/»PL«/»MI«/»SG« können nicht zusammen verwendet werden" -#: utils/adt/formatting.c:1296 +#: utils/adt/formatting.c:1307 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "»EEEE« kann nicht zweimal verwendet werden" -#: utils/adt/formatting.c:1302 +#: utils/adt/formatting.c:1313 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "»EEEE« ist mit anderen Formaten inkompatibel" -#: utils/adt/formatting.c:1303 +#: utils/adt/formatting.c:1314 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "»EEEE« kann nur zusammen mit Platzhaltern für Ziffern oder Dezimalpunkt verwendet werden." -#: utils/adt/formatting.c:1387 +#: utils/adt/formatting.c:1398 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "ungültiges Datum-/Zeit-Formattrennzeichen: »%s«" -#: utils/adt/formatting.c:1514 +#: utils/adt/formatting.c:1525 #, c-format msgid "\"%s\" is not a number" msgstr "»%s« ist keine Zahl" -#: utils/adt/formatting.c:1592 +#: utils/adt/formatting.c:1603 #, c-format msgid "case conversion failed: %s" msgstr "Groß/Klein-Umwandlung fehlgeschlagen: %s" -#: utils/adt/formatting.c:1646 utils/adt/formatting.c:1768 -#: utils/adt/formatting.c:1891 +#: utils/adt/formatting.c:1651 utils/adt/formatting.c:1799 +#: utils/adt/formatting.c:1989 #, c-format msgid "could not determine which collation to use for %s function" msgstr "konnte die für die Funktion %s zu verwendende Sortierfolge nicht bestimmen" -#: utils/adt/formatting.c:2274 +#: utils/adt/formatting.c:2410 #, c-format msgid "invalid combination of date conventions" msgstr "ungültige Kombination von Datumskonventionen" -#: utils/adt/formatting.c:2275 +#: utils/adt/formatting.c:2411 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "Die Gregorianische und die ISO-Konvention für Wochendaten können nicht einer Formatvorlage gemischt werden." -#: utils/adt/formatting.c:2297 +#: utils/adt/formatting.c:2433 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "widersprüchliche Werte für das Feld »%s« in Formatzeichenkette" -#: utils/adt/formatting.c:2299 +#: utils/adt/formatting.c:2435 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Der Wert widerspricht einer vorherigen Einstellung für den selben Feldtyp." -#: utils/adt/formatting.c:2366 +#: utils/adt/formatting.c:2502 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "Quellzeichenkette zu kurz für Formatfeld »%s»" -#: utils/adt/formatting.c:2368 +#: utils/adt/formatting.c:2504 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Feld benötigt %d Zeichen, aber nur %d verbleiben." -#: utils/adt/formatting.c:2370 utils/adt/formatting.c:2384 +#: utils/adt/formatting.c:2506 utils/adt/formatting.c:2520 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "Wenn die Quellzeichenkette keine feste Breite hat, versuchen Sie den Modifikator »FM«." -#: utils/adt/formatting.c:2380 utils/adt/formatting.c:2393 -#: utils/adt/formatting.c:2614 +#: utils/adt/formatting.c:2516 utils/adt/formatting.c:2529 +#: utils/adt/formatting.c:2750 utils/adt/formatting.c:3650 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "ungültiger Wert »%s« für »%s«" -#: utils/adt/formatting.c:2382 +#: utils/adt/formatting.c:2518 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Feld benötigt %d Zeichen, aber nur %d konnten geparst werden." -#: utils/adt/formatting.c:2395 +#: utils/adt/formatting.c:2531 #, c-format msgid "Value must be an integer." msgstr "Der Wert muss eine ganze Zahl sein." -#: utils/adt/formatting.c:2400 +#: utils/adt/formatting.c:2536 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "Wert für »%s« in der Eingabezeichenkette ist außerhalb des gültigen Bereichs" -#: utils/adt/formatting.c:2402 +#: utils/adt/formatting.c:2538 #, c-format msgid "Value must be in the range %d to %d." msgstr "Der Wert muss im Bereich %d bis %d sein." -#: utils/adt/formatting.c:2616 +#: utils/adt/formatting.c:2752 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "Der angegebene Wert stimmte mit keinem der für dieses Feld zulässigen Werte überein." -#: utils/adt/formatting.c:2832 utils/adt/formatting.c:2852 -#: utils/adt/formatting.c:2872 utils/adt/formatting.c:2892 -#: utils/adt/formatting.c:2911 utils/adt/formatting.c:2930 -#: utils/adt/formatting.c:2954 utils/adt/formatting.c:2972 -#: utils/adt/formatting.c:2990 utils/adt/formatting.c:3008 -#: utils/adt/formatting.c:3025 utils/adt/formatting.c:3042 +#: utils/adt/formatting.c:2968 utils/adt/formatting.c:2988 +#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3028 +#: utils/adt/formatting.c:3047 utils/adt/formatting.c:3066 +#: utils/adt/formatting.c:3090 utils/adt/formatting.c:3108 +#: utils/adt/formatting.c:3126 utils/adt/formatting.c:3144 +#: utils/adt/formatting.c:3161 utils/adt/formatting.c:3178 #, c-format msgid "localized string format value too long" msgstr "lokalisierter Formatwert ist zu lang" -#: utils/adt/formatting.c:3322 +#: utils/adt/formatting.c:3458 #, c-format msgid "unmatched format separator \"%c\"" msgstr "Formattrennzeichen »%c« ohne passende Eingabe" -#: utils/adt/formatting.c:3383 +#: utils/adt/formatting.c:3519 #, c-format msgid "unmatched format character \"%s\"" msgstr "Formatzeichen »%s« ohne passende Eingabe" -#: utils/adt/formatting.c:3491 +#: utils/adt/formatting.c:3652 #, c-format -msgid "formatting field \"%s\" is only supported in to_char" -msgstr "Formatfeld »%s« wird nur in to_char unterstützt" +msgid "Time zone abbreviation is not recognized." +msgstr "Zeitzonenabkürzung wird nicht erkannt." -#: utils/adt/formatting.c:3665 +#: utils/adt/formatting.c:3853 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "ungültige Eingabe für »Y,YYY«" -#: utils/adt/formatting.c:3754 +#: utils/adt/formatting.c:3942 #, c-format msgid "input string is too short for datetime format" msgstr "Eingabezeichenkette ist zu kurz für Datum-/Zeitformat" -#: utils/adt/formatting.c:3762 +#: utils/adt/formatting.c:3950 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "nach dem Datum-/Zeitformat bleiben noch Zeichen in der Eingabezeichenkette" -#: utils/adt/formatting.c:4319 +#: utils/adt/formatting.c:4494 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "Zeitzone fehlt in Eingabezeichenkette für Typ timestamptz" -#: utils/adt/formatting.c:4325 +#: utils/adt/formatting.c:4500 #, c-format msgid "timestamptz out of range" msgstr "timestamptz ist außerhalb des gültigen Bereichs" -#: utils/adt/formatting.c:4353 +#: utils/adt/formatting.c:4528 #, c-format msgid "datetime format is zoned but not timed" msgstr "Datum-/Zeitformat hat Zeitzone aber keine Zeit" -#: utils/adt/formatting.c:4411 +#: utils/adt/formatting.c:4577 #, c-format msgid "missing time zone in input string for type timetz" msgstr "Zeitzone fehlt in Eingabezeichenkette für Typ timetz" -#: utils/adt/formatting.c:4417 +#: utils/adt/formatting.c:4583 #, c-format msgid "timetz out of range" msgstr "timetz ist außerhalb des gültigen Bereichs" -#: utils/adt/formatting.c:4443 +#: utils/adt/formatting.c:4609 #, c-format msgid "datetime format is not dated and not timed" msgstr "Datum-/Zeitformat hat kein Datum und keine Zeit" -#: utils/adt/formatting.c:4575 +#: utils/adt/formatting.c:4786 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "Stunde »%d« ist bei einer 12-Stunden-Uhr ungültig" -#: utils/adt/formatting.c:4577 +#: utils/adt/formatting.c:4788 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Verwenden Sie die 24-Stunden-Uhr oder geben Sie eine Stunde zwischen 1 und 12 an." -#: utils/adt/formatting.c:4689 +#: utils/adt/formatting.c:4900 #, c-format msgid "cannot calculate day of year without year information" msgstr "kann Tag des Jahres nicht berechnen ohne Jahrinformationen" -#: utils/adt/formatting.c:5621 +#: utils/adt/formatting.c:5852 #, c-format msgid "\"EEEE\" not supported for input" msgstr "»E« wird nicht bei der Eingabe unterstützt" -#: utils/adt/formatting.c:5633 +#: utils/adt/formatting.c:5864 #, c-format msgid "\"RN\" not supported for input" msgstr "»RN« wird nicht bei der Eingabe unterstützt" @@ -24587,12 +25534,7 @@ msgstr "konnte Positionszeiger in Datei »%s« nicht setzen: %m" msgid "file length too large" msgstr "Dateilänge zu groß" -#: utils/adt/genfile.c:248 -#, c-format -msgid "must be superuser to read files with adminpack 1.0" -msgstr "nur Superuser können mit adminpack 1.0 Dateien lesen" - -#: utils/adt/genfile.c:702 +#: utils/adt/genfile.c:656 #, c-format msgid "tablespace with OID %u does not exist" msgstr "Tablespace mit OID %u existiert nicht" @@ -24648,561 +25590,640 @@ msgstr "mindestens 2 Punkte müssen angefordert werden" msgid "invalid int2vector data" msgstr "ungültige int2vector-Daten" -#: utils/adt/int.c:1529 utils/adt/int8.c:1404 utils/adt/numeric.c:1749 -#: utils/adt/timestamp.c:5797 utils/adt/timestamp.c:5879 +#: utils/adt/int.c:1529 utils/adt/int8.c:1403 utils/adt/numeric.c:1765 +#: utils/adt/timestamp.c:6546 utils/adt/timestamp.c:6632 #, c-format msgid "step size cannot equal zero" msgstr "Schrittgröße kann nicht gleich null sein" -#: utils/adt/int8.c:449 utils/adt/int8.c:472 utils/adt/int8.c:486 -#: utils/adt/int8.c:500 utils/adt/int8.c:531 utils/adt/int8.c:555 -#: utils/adt/int8.c:637 utils/adt/int8.c:705 utils/adt/int8.c:711 -#: utils/adt/int8.c:737 utils/adt/int8.c:751 utils/adt/int8.c:775 -#: utils/adt/int8.c:788 utils/adt/int8.c:900 utils/adt/int8.c:914 -#: utils/adt/int8.c:928 utils/adt/int8.c:959 utils/adt/int8.c:981 -#: utils/adt/int8.c:995 utils/adt/int8.c:1009 utils/adt/int8.c:1042 -#: utils/adt/int8.c:1056 utils/adt/int8.c:1070 utils/adt/int8.c:1101 -#: utils/adt/int8.c:1123 utils/adt/int8.c:1137 utils/adt/int8.c:1151 -#: utils/adt/int8.c:1313 utils/adt/int8.c:1348 utils/adt/numeric.c:4459 -#: utils/adt/rangetypes.c:1528 utils/adt/rangetypes.c:1541 +#: utils/adt/int8.c:448 utils/adt/int8.c:471 utils/adt/int8.c:485 +#: utils/adt/int8.c:499 utils/adt/int8.c:530 utils/adt/int8.c:554 +#: utils/adt/int8.c:636 utils/adt/int8.c:704 utils/adt/int8.c:710 +#: utils/adt/int8.c:736 utils/adt/int8.c:750 utils/adt/int8.c:774 +#: utils/adt/int8.c:787 utils/adt/int8.c:899 utils/adt/int8.c:913 +#: utils/adt/int8.c:927 utils/adt/int8.c:958 utils/adt/int8.c:980 +#: utils/adt/int8.c:994 utils/adt/int8.c:1008 utils/adt/int8.c:1041 +#: utils/adt/int8.c:1055 utils/adt/int8.c:1069 utils/adt/int8.c:1100 +#: utils/adt/int8.c:1122 utils/adt/int8.c:1136 utils/adt/int8.c:1150 +#: utils/adt/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4542 +#: utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 #: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint ist außerhalb des gültigen Bereichs" -#: utils/adt/int8.c:1361 +#: utils/adt/int8.c:1360 #, c-format msgid "OID out of range" msgstr "OID ist außerhalb des gültigen Bereichs" -#: utils/adt/json.c:320 utils/adt/jsonb.c:781 +#: utils/adt/json.c:202 utils/adt/jsonb.c:664 #, c-format msgid "key value must be scalar, not array, composite, or json" msgstr "Schlüsselwert muss skalar sein, nicht Array, zusammengesetzt oder json" -#: utils/adt/json.c:1113 utils/adt/json.c:1123 utils/fmgr/funcapi.c:2082 +#: utils/adt/json.c:1034 utils/adt/json.c:1044 utils/fmgr/funcapi.c:2090 #, c-format msgid "could not determine data type for argument %d" msgstr "konnte Datentyp von Argument %d nicht ermitteln" -#: utils/adt/json.c:1146 utils/adt/json.c:1337 utils/adt/json.c:1513 -#: utils/adt/json.c:1591 utils/adt/jsonb.c:1432 utils/adt/jsonb.c:1522 +#: utils/adt/json.c:1067 utils/adt/json.c:1266 utils/adt/json.c:1449 +#: utils/adt/json.c:1527 utils/adt/jsonb.c:1333 utils/adt/jsonb.c:1423 #, c-format msgid "null value not allowed for object key" msgstr "NULL-Werte sind nicht als Objektschlüssel erlaubt" -#: utils/adt/json.c:1189 utils/adt/json.c:1352 -#, fuzzy, c-format -#| msgid "Duplicate keys exist." -msgid "duplicate JSON key %s" -msgstr "Es existieren doppelte Schlüssel." +#: utils/adt/json.c:1117 utils/adt/json.c:1288 +#, c-format +msgid "duplicate JSON object key value: %s" +msgstr "doppelter JSON-Objekt-Schlüsselwert: %s" -#: utils/adt/json.c:1297 utils/adt/jsonb.c:1233 +#: utils/adt/json.c:1226 utils/adt/jsonb.c:1134 #, c-format msgid "argument list must have even number of elements" msgstr "Argumentliste muss gerade Anzahl Elemente haben" #. translator: %s is a SQL function name -#: utils/adt/json.c:1299 utils/adt/jsonb.c:1235 +#: utils/adt/json.c:1228 utils/adt/jsonb.c:1136 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "Die Argumente von %s müssen abwechselnd Schlüssel und Werte sein." -#: utils/adt/json.c:1491 utils/adt/jsonb.c:1410 +#: utils/adt/json.c:1427 utils/adt/jsonb.c:1311 #, c-format msgid "array must have two columns" msgstr "Array muss zwei Spalten haben" -#: utils/adt/json.c:1580 utils/adt/jsonb.c:1511 +#: utils/adt/json.c:1516 utils/adt/jsonb.c:1412 #, c-format msgid "mismatched array dimensions" msgstr "Array-Dimensionen passen nicht" -#: utils/adt/json.c:1764 +#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1956 #, c-format msgid "duplicate JSON object key value" -msgstr "" +msgstr "doppelter JSON-Objekt-Schlüsselwert" -#: utils/adt/jsonb.c:294 +#: utils/adt/jsonb.c:282 #, c-format msgid "string too long to represent as jsonb string" msgstr "Zeichenkette ist zu lang für jsonb" -#: utils/adt/jsonb.c:295 +#: utils/adt/jsonb.c:283 #, c-format msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "Aufgrund einer Einschränkung der Implementierung können jsonb-Zeichenketten nicht länger als %d Bytes sein." -#: utils/adt/jsonb.c:1252 +#: utils/adt/jsonb.c:1153 #, c-format msgid "argument %d: key must not be null" msgstr "Argument %d: Schlüssel darf nicht NULL sein" -#: utils/adt/jsonb.c:1843 +#: utils/adt/jsonb.c:1744 #, c-format msgid "field name must not be null" msgstr "Feldname darf nicht NULL sein" -#: utils/adt/jsonb.c:1905 +#: utils/adt/jsonb.c:1806 #, c-format msgid "object keys must be strings" msgstr "Objektschlüssel müssen Zeichenketten sein" -#: utils/adt/jsonb.c:2116 +#: utils/adt/jsonb.c:2017 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "kann jsonb-Null-Wert nicht in Typ %s umwandeln" -#: utils/adt/jsonb.c:2117 +#: utils/adt/jsonb.c:2018 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "kann jsonb-Zeichenkette nicht in Typ %s umwandeln" -#: utils/adt/jsonb.c:2118 +#: utils/adt/jsonb.c:2019 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "kann jsonb numerischen Wert nicht in Typ %s umwandeln" -#: utils/adt/jsonb.c:2119 +#: utils/adt/jsonb.c:2020 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "kann jsonb-boolean nicht in Typ %s umwandeln" -#: utils/adt/jsonb.c:2120 +#: utils/adt/jsonb.c:2021 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "kann jsonb-Array nicht in Typ %s umwandeln" -#: utils/adt/jsonb.c:2121 +#: utils/adt/jsonb.c:2022 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "kann jsonb-Objekt nicht in Typ %s umwandeln" -#: utils/adt/jsonb.c:2122 +#: utils/adt/jsonb.c:2023 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "kann jsonb-Array oder -Objekt nicht in Typ %s umwandeln" -#: utils/adt/jsonb_util.c:758 +#: utils/adt/jsonb_util.c:756 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "Anzahl der jsonb-Objekte-Paare überschreitet erlaubtes Maximum (%zu)" -#: utils/adt/jsonb_util.c:799 +#: utils/adt/jsonb_util.c:797 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "Anzahl der jsonb-Arrayelemente überschreitet erlaubtes Maximum (%zu)" -#: utils/adt/jsonb_util.c:1673 utils/adt/jsonb_util.c:1693 +#: utils/adt/jsonb_util.c:1671 utils/adt/jsonb_util.c:1691 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %d bytes" msgstr "Gesamtgröße der jsonb-Array-Elemente überschreitet die maximale Größe von %d Bytes" -#: utils/adt/jsonb_util.c:1754 utils/adt/jsonb_util.c:1789 -#: utils/adt/jsonb_util.c:1809 +#: utils/adt/jsonb_util.c:1752 utils/adt/jsonb_util.c:1787 +#: utils/adt/jsonb_util.c:1807 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %d bytes" msgstr "Gesamtgröße der jsonb-Objektelemente überschreitet die maximale Größe von %d Bytes" -#: utils/adt/jsonb_util.c:1958 -#, c-format -msgid "duplicate JSON object key" -msgstr "" - -#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 +#: utils/adt/jsonbsubs.c:67 utils/adt/jsonbsubs.c:148 #, c-format msgid "jsonb subscript does not support slices" msgstr "jsonb-Index unterstützt keine Slices" -#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 +#: utils/adt/jsonbsubs.c:100 utils/adt/jsonbsubs.c:114 #, c-format msgid "subscript type %s is not supported" msgstr "Subscript-Typ %s wird nicht unterstützt" -#: utils/adt/jsonbsubs.c:104 +#: utils/adt/jsonbsubs.c:101 #, c-format msgid "jsonb subscript must be coercible to only one type, integer or text." msgstr "jsonb-Index darf nur in einen Typ umwandelbar sein, integer oder text." -#: utils/adt/jsonbsubs.c:118 +#: utils/adt/jsonbsubs.c:115 #, c-format msgid "jsonb subscript must be coercible to either integer or text." msgstr "jsonb-Index muss in entweder integer oder text umwandelbar sein." -#: utils/adt/jsonbsubs.c:139 +#: utils/adt/jsonbsubs.c:136 #, c-format msgid "jsonb subscript must have text type" msgstr "jsonb-Index muss Typ text haben" -#: utils/adt/jsonbsubs.c:207 +#: utils/adt/jsonbsubs.c:204 #, c-format msgid "jsonb subscript in assignment must not be null" msgstr "jsonb-Index in Zuweisung darf nicht NULL sein" -#: utils/adt/jsonfuncs.c:572 utils/adt/jsonfuncs.c:821 -#: utils/adt/jsonfuncs.c:2429 utils/adt/jsonfuncs.c:2881 -#: utils/adt/jsonfuncs.c:3676 utils/adt/jsonfuncs.c:4018 +#: utils/adt/jsonfuncs.c:583 utils/adt/jsonfuncs.c:830 +#: utils/adt/jsonfuncs.c:2439 utils/adt/jsonfuncs.c:3015 +#: utils/adt/jsonfuncs.c:3948 utils/adt/jsonfuncs.c:4295 #, c-format msgid "cannot call %s on a scalar" msgstr "%s kann nicht mit einem skalaren Wert aufgerufen werden" -#: utils/adt/jsonfuncs.c:577 utils/adt/jsonfuncs.c:806 -#: utils/adt/jsonfuncs.c:2883 utils/adt/jsonfuncs.c:3663 +#: utils/adt/jsonfuncs.c:588 utils/adt/jsonfuncs.c:815 +#: utils/adt/jsonfuncs.c:3017 utils/adt/jsonfuncs.c:3935 #, c-format msgid "cannot call %s on an array" msgstr "%s kann nicht mit einem Array aufgerufen werden" -#: utils/adt/jsonfuncs.c:713 +#: utils/adt/jsonfuncs.c:724 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "JSON-Daten, Zeile %d: %s%s%s" -#: utils/adt/jsonfuncs.c:1875 utils/adt/jsonfuncs.c:1912 +#: utils/adt/jsonfuncs.c:1883 utils/adt/jsonfuncs.c:1920 #, c-format msgid "cannot get array length of a scalar" msgstr "kann nicht die Arraylänge eines skalaren Wertes ermitteln" -#: utils/adt/jsonfuncs.c:1879 utils/adt/jsonfuncs.c:1898 +#: utils/adt/jsonfuncs.c:1887 utils/adt/jsonfuncs.c:1906 #, c-format msgid "cannot get array length of a non-array" msgstr "kann nicht die Arraylänge eines Nicht-Arrays ermitteln" -#: utils/adt/jsonfuncs.c:1978 +#: utils/adt/jsonfuncs.c:1986 #, c-format msgid "cannot call %s on a non-object" msgstr "%s kann nicht mit etwas aufgerufen werden, das kein Objekt ist" -#: utils/adt/jsonfuncs.c:2166 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot deconstruct an array as an object" msgstr "kann Array nicht in ein Objekt zerlegen" -#: utils/adt/jsonfuncs.c:2180 +#: utils/adt/jsonfuncs.c:2188 #, c-format msgid "cannot deconstruct a scalar" msgstr "kann skalaren Wert nicht zerlegen" -#: utils/adt/jsonfuncs.c:2225 +#: utils/adt/jsonfuncs.c:2233 #, c-format msgid "cannot extract elements from a scalar" msgstr "kann keine Elemente aus einem skalaren Wert auswählen" -#: utils/adt/jsonfuncs.c:2229 +#: utils/adt/jsonfuncs.c:2237 #, c-format msgid "cannot extract elements from an object" msgstr "kann keine Elemente aus einem Objekt auswählen" -#: utils/adt/jsonfuncs.c:2414 utils/adt/jsonfuncs.c:3896 +#: utils/adt/jsonfuncs.c:2424 utils/adt/jsonfuncs.c:4173 #, c-format msgid "cannot call %s on a non-array" msgstr "%s kann nicht mit etwas aufgerufen werden, das kein Array ist" -#: utils/adt/jsonfuncs.c:2488 utils/adt/jsonfuncs.c:2493 -#: utils/adt/jsonfuncs.c:2510 utils/adt/jsonfuncs.c:2516 +#: utils/adt/jsonfuncs.c:2515 utils/adt/jsonfuncs.c:2520 +#: utils/adt/jsonfuncs.c:2538 utils/adt/jsonfuncs.c:2544 #, c-format msgid "expected JSON array" msgstr "JSON-Array wurde erwartet" -#: utils/adt/jsonfuncs.c:2489 +#: utils/adt/jsonfuncs.c:2516 #, c-format msgid "See the value of key \"%s\"." msgstr "Prüfen Sie den Wert des Schlüssels »%s«." -#: utils/adt/jsonfuncs.c:2511 +#: utils/adt/jsonfuncs.c:2539 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Prüfen Sie das Arrayelement %s des Schlüssels »%s«." -#: utils/adt/jsonfuncs.c:2517 +#: utils/adt/jsonfuncs.c:2545 #, c-format msgid "See the array element %s." msgstr "Prüfen Sie das Arrayelement %s." -#: utils/adt/jsonfuncs.c:2552 +#: utils/adt/jsonfuncs.c:2597 #, c-format msgid "malformed JSON array" msgstr "fehlerhaftes JSON-Array" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3389 +#: utils/adt/jsonfuncs.c:3647 #, c-format msgid "first argument of %s must be a row type" msgstr "erstes Argument von %s muss ein Zeilentyp sein" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3413 +#: utils/adt/jsonfuncs.c:3671 #, c-format msgid "could not determine row type for result of %s" msgstr "konnte Zeilentyp für Ergebnis von %s nicht ermitteln" -#: utils/adt/jsonfuncs.c:3415 +#: utils/adt/jsonfuncs.c:3673 #, c-format msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." msgstr "Geben Sie ein »record«-Argument, das nicht NULL ist, an oder rufen Sie die Funktion in der FROM-Klausel mit einer Spaltendefinitionsliste auf." -#: utils/adt/jsonfuncs.c:3785 utils/fmgr/funcapi.c:94 +#: utils/adt/jsonfuncs.c:4059 utils/fmgr/funcapi.c:94 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "Materialisierungsmodus wird benötigt, ist aber in diesem Zusammenhang nicht erlaubt" -#: utils/adt/jsonfuncs.c:3913 utils/adt/jsonfuncs.c:3997 +#: utils/adt/jsonfuncs.c:4190 utils/adt/jsonfuncs.c:4274 #, c-format msgid "argument of %s must be an array of objects" msgstr "Argument von %s muss ein Array von Objekten sein" -#: utils/adt/jsonfuncs.c:3946 +#: utils/adt/jsonfuncs.c:4223 #, c-format msgid "cannot call %s on an object" msgstr "%s kann nicht mit einem Objekt aufgerufen werden" -#: utils/adt/jsonfuncs.c:4380 utils/adt/jsonfuncs.c:4439 -#: utils/adt/jsonfuncs.c:4519 +#: utils/adt/jsonfuncs.c:4656 utils/adt/jsonfuncs.c:4715 +#: utils/adt/jsonfuncs.c:4795 #, c-format msgid "cannot delete from scalar" msgstr "kann nicht aus skalarem Wert löschen" -#: utils/adt/jsonfuncs.c:4524 +#: utils/adt/jsonfuncs.c:4800 #, c-format msgid "cannot delete from object using integer index" msgstr "aus einem Objekt kann nicht per numerischem Index gelöscht werden" -#: utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4751 +#: utils/adt/jsonfuncs.c:4868 utils/adt/jsonfuncs.c:5027 #, c-format msgid "cannot set path in scalar" msgstr "in einem skalaren Wert kann kein Pfad gesetzt werden" -#: utils/adt/jsonfuncs.c:4633 utils/adt/jsonfuncs.c:4675 +#: utils/adt/jsonfuncs.c:4909 utils/adt/jsonfuncs.c:4951 #, c-format msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" msgstr "null_value_treatment muss »delete_key«, »return_target«, »use_json_null« oder »raise_exception« sein" -#: utils/adt/jsonfuncs.c:4646 +#: utils/adt/jsonfuncs.c:4922 #, c-format msgid "JSON value must not be null" msgstr "JSON-Wert darf nicht NULL sein" -#: utils/adt/jsonfuncs.c:4647 +#: utils/adt/jsonfuncs.c:4923 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "Ausnahme wurde ausgelöst, weil null_value_treatment »raise_exception« ist." -#: utils/adt/jsonfuncs.c:4648 +#: utils/adt/jsonfuncs.c:4924 #, c-format msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." msgstr "Um dies zu vermeiden, ändern Sie das Argument null_value_treatment oder sorgen Sie dafür, dass kein SQL NULL übergeben wird." -#: utils/adt/jsonfuncs.c:4703 +#: utils/adt/jsonfuncs.c:4979 #, c-format msgid "cannot delete path in scalar" msgstr "in einem skalaren Wert kann kein Pfad gelöscht werden" -#: utils/adt/jsonfuncs.c:4917 +#: utils/adt/jsonfuncs.c:5193 #, c-format msgid "path element at position %d is null" msgstr "Pfadelement auf Position %d ist NULL" -#: utils/adt/jsonfuncs.c:4936 utils/adt/jsonfuncs.c:4967 -#: utils/adt/jsonfuncs.c:5040 +#: utils/adt/jsonfuncs.c:5212 utils/adt/jsonfuncs.c:5243 +#: utils/adt/jsonfuncs.c:5316 #, c-format msgid "cannot replace existing key" msgstr "existierender Schlüssel kann nicht ersetzt werden" -#: utils/adt/jsonfuncs.c:4937 utils/adt/jsonfuncs.c:4968 +#: utils/adt/jsonfuncs.c:5213 utils/adt/jsonfuncs.c:5244 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." msgstr "Der Pfad nimmt an, dass der Schlüssel ein zusammengesetztes Objekt ist, aber er ist ein skalarer Wert." -#: utils/adt/jsonfuncs.c:5041 +#: utils/adt/jsonfuncs.c:5317 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Verwenden Sie die Funktion jsonb_set, um den Schlüsselwert zu ersetzen." -#: utils/adt/jsonfuncs.c:5145 +#: utils/adt/jsonfuncs.c:5421 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "Pfadelement auf Position %d ist keine ganze Zahl: »%s«" -#: utils/adt/jsonfuncs.c:5162 +#: utils/adt/jsonfuncs.c:5438 #, c-format msgid "path element at position %d is out of range: %d" msgstr "Pfadelement auf Position %d ist außerhalb des gültigen Bereichs: %d" -#: utils/adt/jsonfuncs.c:5314 +#: utils/adt/jsonfuncs.c:5590 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "falscher Flag-Typ, nur Arrays und skalare Werte sind erlaubt" -#: utils/adt/jsonfuncs.c:5321 +#: utils/adt/jsonfuncs.c:5597 #, c-format msgid "flag array element is not a string" msgstr "Flag-Array-Element ist keine Zeichenkette" -#: utils/adt/jsonfuncs.c:5322 utils/adt/jsonfuncs.c:5344 +#: utils/adt/jsonfuncs.c:5598 utils/adt/jsonfuncs.c:5620 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "Mögliche Werte sind: »string«, »numeric«, »boolean«, »key« und »all«." -#: utils/adt/jsonfuncs.c:5342 +#: utils/adt/jsonfuncs.c:5618 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "falsche Flag im Flag-Array: »%s«" -#: utils/adt/jsonpath.c:382 +#: utils/adt/jsonpath.c:389 #, c-format msgid "@ is not allowed in root expressions" msgstr "@ ist nicht erlaubt in Wurzelausdrücken" -#: utils/adt/jsonpath.c:388 +#: utils/adt/jsonpath.c:395 #, c-format msgid "LAST is allowed only in array subscripts" msgstr "LAST ist nur in Arrayindizes erlaubt" -#: utils/adt/jsonpath_exec.c:361 +#: utils/adt/jsonpath_exec.c:491 #, c-format msgid "single boolean result is expected" msgstr "ein einzelnes Ergebnis mit Typ boolean wird erwartet" -#: utils/adt/jsonpath_exec.c:557 +#: utils/adt/jsonpath_exec.c:851 #, c-format -msgid "\"vars\" argument is not an object" -msgstr "Argument »vars« ist kein Objekt" +msgid "jsonpath wildcard array accessor can only be applied to an array" +msgstr "JSON-Path-Wildcard-Array-Indizierung kann nur auf ein Array angewendet werden" -#: utils/adt/jsonpath_exec.c:558 +#: utils/adt/jsonpath_exec.c:874 #, c-format -msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." -msgstr "JSON-Path-Parameter sollten als Schüssel-Wert-Paare im »vars«-Objekt kodiert werden." +msgid "jsonpath wildcard member accessor can only be applied to an object" +msgstr "JSON-Path-Wildcard-Member-Zugriff kann nur auf ein Objekt angwendet werden" + +#: utils/adt/jsonpath_exec.c:923 +#, c-format +msgid "jsonpath array subscript is out of bounds" +msgstr "JSON-Path-Arrayindex ist außerhalb des gültigen Bereichs" + +#: utils/adt/jsonpath_exec.c:980 +#, c-format +msgid "jsonpath array accessor can only be applied to an array" +msgstr "JSON-Path-Array-Indizierung kann nur auf ein Array angewendet werden" -#: utils/adt/jsonpath_exec.c:675 +#: utils/adt/jsonpath_exec.c:1044 #, c-format msgid "JSON object does not contain key \"%s\"" msgstr "JSON-Objekt enthält Schlüssel »%s« nicht" -#: utils/adt/jsonpath_exec.c:687 +#: utils/adt/jsonpath_exec.c:1056 #, c-format msgid "jsonpath member accessor can only be applied to an object" msgstr "JSON-Path-Member-Zugriff kann nur auf ein Objekt angewendet werden" -#: utils/adt/jsonpath_exec.c:716 +#: utils/adt/jsonpath_exec.c:1114 #, c-format -msgid "jsonpath wildcard array accessor can only be applied to an array" -msgstr "JSON-Path-Wildcard-Array-Indizierung kann nur auf ein Array angewendet werden" +msgid "jsonpath item method .%s() can only be applied to an array" +msgstr "Jsonpath-Item-Methode .%s() kann nur auf ein Array angewendet werden" -#: utils/adt/jsonpath_exec.c:764 +#: utils/adt/jsonpath_exec.c:1167 utils/adt/jsonpath_exec.c:1193 #, c-format -msgid "jsonpath array subscript is out of bounds" -msgstr "JSON-Path-Arrayindex ist außerhalb des gültigen Bereichs" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type double precision" +msgstr "Argument »%s« der JSON-Path-Item-Methode .%s() ist ungültig für Typ double precision" -#: utils/adt/jsonpath_exec.c:821 +#: utils/adt/jsonpath_exec.c:1172 utils/adt/jsonpath_exec.c:1198 +#: utils/adt/jsonpath_exec.c:1414 utils/adt/jsonpath_exec.c:1446 #, c-format -msgid "jsonpath array accessor can only be applied to an array" -msgstr "JSON-Path-Array-Indizierung kann nur auf ein Array angewendet werden" +msgid "NaN or Infinity is not allowed for jsonpath item method .%s()" +msgstr "NaN oder unendliche Werte sind für JSON-Path-Item-Methode .%s() nicht erlaubt" -#: utils/adt/jsonpath_exec.c:873 +#: utils/adt/jsonpath_exec.c:1211 utils/adt/jsonpath_exec.c:1313 +#: utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1593 #, c-format -msgid "jsonpath wildcard member accessor can only be applied to an object" -msgstr "JSON-Path-Wildcard-Member-Zugriff kann nur auf ein Objekt angwendet werden" +msgid "jsonpath item method .%s() can only be applied to a string or numeric value" +msgstr "JSON-Path-Item-Methode .%s() kann nur auf eine Zeichenkette oder einen numerischen Wert angewendet werden" -#: utils/adt/jsonpath_exec.c:1007 +#: utils/adt/jsonpath_exec.c:1281 utils/adt/jsonpath_exec.c:1305 #, c-format -msgid "jsonpath item method .%s() can only be applied to an array" -msgstr "Jsonpath-Item-Methode .%s() kann nur auf ein Array angewendet werden" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type bigint" +msgstr "Argument »%s« der JSON-Path-Item-Methode .%s() ist ungültig für Typ bigint" -#: utils/adt/jsonpath_exec.c:1060 +#: utils/adt/jsonpath_exec.c:1357 utils/adt/jsonpath_exec.c:1377 #, c-format -msgid "numeric argument of jsonpath item method .%s() is out of range for type double precision" -msgstr "numerisches Argument der JSON-Path-Item-Methode .%s() ist außerhalb des gültigen Bereichs für Typ double precision" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type boolean" +msgstr "Argument »%s« der JSON-Path-Item-Methode .%s() ist ungültig für Typ boolean" -#: utils/adt/jsonpath_exec.c:1081 +#: utils/adt/jsonpath_exec.c:1386 #, c-format -msgid "string argument of jsonpath item method .%s() is not a valid representation of a double precision number" -msgstr "Zeichenkettenargument der JSON-Path-Item-Methode .%s() ist nicht gültig für Typ double precision" +msgid "jsonpath item method .%s() can only be applied to a boolean, string, or numeric value" +msgstr "JSON-Path-Item-Methode .%s() kann nur auf boolean, eine Zeichenkette oder einen numerischen Wert angewendet werden" -#: utils/adt/jsonpath_exec.c:1094 +#: utils/adt/jsonpath_exec.c:1439 utils/adt/jsonpath_exec.c:1528 #, c-format -msgid "jsonpath item method .%s() can only be applied to a string or numeric value" -msgstr "JSON-Path-Item-Methode .%s() kann nur auf eine Zeichenkette oder einen numerischen Wert angewendet werden" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type numeric" +msgstr "Argument »%s« der JSON-Path-Item-Methode .%s() ist ungültig für Typ numeric" + +#: utils/adt/jsonpath_exec.c:1487 +#, c-format +msgid "precision of jsonpath item method .%s() is out of range for type integer" +msgstr "Präzision der JSON-Path-Item-Methode .%s() ist außerhalb des gültigen Bereichs für Typ integer" -#: utils/adt/jsonpath_exec.c:1584 +#: utils/adt/jsonpath_exec.c:1501 +#, c-format +msgid "scale of jsonpath item method .%s() is out of range for type integer" +msgstr "Skala der JSON-Path-Item-Methode .%s() ist außerhalb des gültigen Bereichs für Typ integer" + +#: utils/adt/jsonpath_exec.c:1561 utils/adt/jsonpath_exec.c:1585 +#, c-format +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type integer" +msgstr "Argument »%s« der JSON-Path-Item-Methode .%s() ist ungültig für Typ integer" + +#: utils/adt/jsonpath_exec.c:1648 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a boolean, string, numeric, or datetime value" +msgstr "JSON-Path-Item-Methode .%s() kann nur auf boolean, eine Zeichenkette, einen numerischen Wert oder einen datetime-Wert angewendet werden" + +#: utils/adt/jsonpath_exec.c:2137 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "linker Operand des JSON-Path-Operators %s ist kein einzelner numerischer Wert" -#: utils/adt/jsonpath_exec.c:1591 +#: utils/adt/jsonpath_exec.c:2144 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "rechter Operand des JSON-Path-Operators %s ist kein einzelner numerischer Wert" -#: utils/adt/jsonpath_exec.c:1659 +#: utils/adt/jsonpath_exec.c:2212 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "Operand des unären JSON-Path-Operators %s ist kein numerischer Wert" -#: utils/adt/jsonpath_exec.c:1758 +#: utils/adt/jsonpath_exec.c:2311 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "JSON-Path-Item-Methode .%s() kann nur auf einen numerischen Wert angewendet werden" -#: utils/adt/jsonpath_exec.c:1798 +#: utils/adt/jsonpath_exec.c:2357 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "JSON-Path-Item-Methode .%s() kann nur auf eine Zeichenkette angewendet werden" -#: utils/adt/jsonpath_exec.c:1901 +#: utils/adt/jsonpath_exec.c:2450 +#, c-format +msgid "time precision of jsonpath item method .%s() is out of range for type integer" +msgstr "Zeitpräzision der JSON-Path-Item-Methode .%s() ist außerhalb des gültigen Bereichs für Typ integer" + +#: utils/adt/jsonpath_exec.c:2484 utils/adt/jsonpath_exec.c:2490 +#: utils/adt/jsonpath_exec.c:2517 utils/adt/jsonpath_exec.c:2545 +#: utils/adt/jsonpath_exec.c:2598 utils/adt/jsonpath_exec.c:2649 +#: utils/adt/jsonpath_exec.c:2720 #, c-format -msgid "datetime format is not recognized: \"%s\"" -msgstr "Datum-/Zeitformat nicht erkannt: »%s«" +msgid "%s format is not recognized: \"%s\"" +msgstr "%s-Format wird nicht erkannt: »%s«" -#: utils/adt/jsonpath_exec.c:1903 +#: utils/adt/jsonpath_exec.c:2486 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "Verwenden Sie das Template-Argument für .datetime(), um das Eingabeformat anzugeben." -#: utils/adt/jsonpath_exec.c:1971 +#: utils/adt/jsonpath_exec.c:2679 utils/adt/jsonpath_exec.c:2760 +#, c-format +msgid "time precision of jsonpath item method .%s() is invalid" +msgstr "Zeitpräzision der JSON-Path-Item-Methode .%s() ist ungültig" + +#: utils/adt/jsonpath_exec.c:2840 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "JSON-Path-Item-Methode .%s() kann nur auf ein Objekt angewendet werden" -#: utils/adt/jsonpath_exec.c:2153 +#: utils/adt/jsonpath_exec.c:3124 +#, c-format +msgid "could not convert value of type %s to jsonpath" +msgstr "konnte Wert vom Typ %s nicht in jsonpath umwandeln" + +#: utils/adt/jsonpath_exec.c:3158 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "konnte JSON-Path-Variable »%s« nicht finden" -#: utils/adt/jsonpath_exec.c:2417 +#: utils/adt/jsonpath_exec.c:3211 +#, c-format +msgid "\"vars\" argument is not an object" +msgstr "Argument »vars« ist kein Objekt" + +#: utils/adt/jsonpath_exec.c:3212 +#, c-format +msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +msgstr "JSON-Path-Parameter sollten als Schüssel-Wert-Paare im »vars«-Objekt kodiert werden." + +#: utils/adt/jsonpath_exec.c:3475 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "JSON-Path-Arrayindex ist kein einzelner numerischer Wert" -#: utils/adt/jsonpath_exec.c:2429 +#: utils/adt/jsonpath_exec.c:3487 #, c-format msgid "jsonpath array subscript is out of integer range" -msgstr "JSON-Path-Arrayindex außerhalb des gültigen Bereichs für ganze Zahlen" +msgstr "JSON-Path-Arrayindex ist außerhalb des gültigen Bereichs für ganze Zahlen" -#: utils/adt/jsonpath_exec.c:2606 +#: utils/adt/jsonpath_exec.c:3671 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "Wert kann nicht von %s nach %s konvertiert werden ohne Verwendung von Zeitzonen" -#: utils/adt/jsonpath_exec.c:2608 +#: utils/adt/jsonpath_exec.c:3673 #, c-format msgid "Use *_tz() function for time zone support." msgstr "Verwenden Sie die *_tz()-Funktion für Zeitzonenunterstützung." +#: utils/adt/jsonpath_exec.c:3981 +#, c-format +msgid "JSON path expression for column \"%s\" must return single item when no wrapper is requested" +msgstr "JSON-Path-Ausdruck für Spalte »%s« muss ein einzelnes Element zurückgeben, wenn kein Wrapper angefordert wurde" + +#: utils/adt/jsonpath_exec.c:3983 utils/adt/jsonpath_exec.c:3988 +#, c-format +msgid "Use the WITH WRAPPER clause to wrap SQL/JSON items into an array." +msgstr "Verwenden Sie die WITH-WRAPPER-Klausel, um SQL/JSON-Elemente in ein Array einzupacken." + +#: utils/adt/jsonpath_exec.c:3987 +#, c-format +msgid "JSON path expression in JSON_QUERY must return single item when no wrapper is requested" +msgstr "JSON-Pfad-Ausdruck in JSON_QUERY muss ein einzelnes Element zurückgeben, wenn kein Wrapper angefordert wurde" + +#: utils/adt/jsonpath_exec.c:4045 utils/adt/jsonpath_exec.c:4069 +#, c-format +msgid "JSON path expression for column \"%s\" must return single scalar item" +msgstr "JSON-Path-Ausdruck für Spalte »%s« muss ein einzelnes skalares Element zurückgeben" + +#: utils/adt/jsonpath_exec.c:4050 utils/adt/jsonpath_exec.c:4074 +#, c-format +msgid "JSON path expression in JSON_VALUE must return single scalar item" +msgstr "JSON-Pfad-Ausdruck in JSON_VALUE muss ein einzelnes skalares Element zurückgeben" + #: utils/adt/levenshtein.c:132 #, c-format msgid "levenshtein argument exceeds maximum length of %d characters" msgstr "Levenshtein-Argument überschreitet die maximale Länge von %d Zeichen" -#: utils/adt/like.c:161 +#: utils/adt/like.c:159 #, c-format msgid "nondeterministic collations are not supported for LIKE" msgstr "nichtdeterministische Sortierfolgen werden von LIKE nicht unterstützt" -#: utils/adt/like.c:190 utils/adt/like_support.c:1024 +#: utils/adt/like.c:188 utils/adt/like_support.c:1023 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "konnte die für ILIKE zu verwendende Sortierfolge nicht bestimmen" -#: utils/adt/like.c:202 +#: utils/adt/like.c:200 #, c-format msgid "nondeterministic collations are not supported for ILIKE" msgstr "nichtdeterministische Sortierfolgen werden von ILIKE nicht unterstützt" @@ -25212,22 +26233,22 @@ msgstr "nichtdeterministische Sortierfolgen werden von ILIKE nicht unterstützt" msgid "LIKE pattern must not end with escape character" msgstr "LIKE-Muster darf nicht mit Escape-Zeichen enden" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:801 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:800 #, c-format msgid "invalid escape string" msgstr "ungültige ESCAPE-Zeichenkette" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:802 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:801 #, c-format msgid "Escape string must be empty or one character." msgstr "ESCAPE-Zeichenkette muss null oder ein Zeichen lang sein." -#: utils/adt/like_support.c:1014 +#: utils/adt/like_support.c:1013 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "Mustersuche ohne Rücksicht auf Groß-/Kleinschreibung wird für Typ bytea nicht unterstützt" -#: utils/adt/like_support.c:1115 +#: utils/adt/like_support.c:1114 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "Mustersuche mit regulären Ausdrücken wird für Typ bytea nicht unterstützt" @@ -25237,17 +26258,17 @@ msgstr "Mustersuche mit regulären Ausdrücken wird für Typ bytea nicht unterst msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "ungültiger Oktettwert in »macaddr«-Wert: »%s«" -#: utils/adt/mac8.c:554 +#: utils/adt/mac8.c:555 #, c-format msgid "macaddr8 data out of range to convert to macaddr" msgstr "macaddr8-Daten außerhalb des gültigen Bereichs für Umwandlung in macaddr" -#: utils/adt/mac8.c:555 +#: utils/adt/mac8.c:556 #, c-format msgid "Only addresses that have FF and FE as values in the 4th and 5th bytes from the left, for example xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted from macaddr8 to macaddr." msgstr "Nur Adressen, die FF und FE als Werte im 4. und 5. Byte von links haben, zum Beispiel xx:xx:xx:ff:fe:xx:xx:xx, kommen für eine Umwandlung von macaddr8 nach macaddr in Frage." -#: utils/adt/mcxtfuncs.c:182 +#: utils/adt/mcxtfuncs.c:173 #, c-format msgid "PID %d is not a PostgreSQL server process" msgstr "PID %d ist kein PostgreSQL-Serverprozess" @@ -25286,70 +26307,70 @@ msgstr "kann alleinstehendes Label sein" msgid "requires AS" msgstr "benötigt AS" -#: utils/adt/misc.c:853 utils/adt/misc.c:867 utils/adt/misc.c:906 -#: utils/adt/misc.c:912 utils/adt/misc.c:918 utils/adt/misc.c:941 +#: utils/adt/misc.c:897 utils/adt/misc.c:911 utils/adt/misc.c:950 +#: utils/adt/misc.c:956 utils/adt/misc.c:962 utils/adt/misc.c:985 #, c-format msgid "string is not a valid identifier: \"%s\"" msgstr "Zeichenkette ist kein gültiger Bezeichner: »%s«" -#: utils/adt/misc.c:855 +#: utils/adt/misc.c:899 #, c-format msgid "String has unclosed double quotes." msgstr "Zeichenkette hat nicht geschlossene doppelte Anführungszeichen." -#: utils/adt/misc.c:869 +#: utils/adt/misc.c:913 #, c-format msgid "Quoted identifier must not be empty." msgstr "Bezeichner in Anführungszeichen darf nicht leer sein." -#: utils/adt/misc.c:908 +#: utils/adt/misc.c:952 #, c-format msgid "No valid identifier before \".\"." msgstr "Kein gültiger Bezeichner vor ».«." -#: utils/adt/misc.c:914 +#: utils/adt/misc.c:958 #, c-format msgid "No valid identifier after \".\"." msgstr "Kein gültiger Bezeichner nach ».«." -#: utils/adt/misc.c:974 +#: utils/adt/misc.c:1018 #, c-format msgid "log format \"%s\" is not supported" msgstr "Logformat »%s« wird nicht unterstützt" -#: utils/adt/misc.c:975 +#: utils/adt/misc.c:1019 #, c-format msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." msgstr "Die unterstützten Logformate sind »stderr«, »csvlog« und »jsonlog«." -#: utils/adt/multirangetypes.c:151 utils/adt/multirangetypes.c:164 -#: utils/adt/multirangetypes.c:193 utils/adt/multirangetypes.c:267 -#: utils/adt/multirangetypes.c:291 +#: utils/adt/multirangetypes.c:150 utils/adt/multirangetypes.c:163 +#: utils/adt/multirangetypes.c:192 utils/adt/multirangetypes.c:266 +#: utils/adt/multirangetypes.c:290 #, c-format msgid "malformed multirange literal: \"%s\"" msgstr "fehlerhafte Multirange-Konstante: »%s«" -#: utils/adt/multirangetypes.c:153 +#: utils/adt/multirangetypes.c:152 #, c-format msgid "Missing left brace." msgstr "Linke geschweifte Klammer fehlt." -#: utils/adt/multirangetypes.c:195 +#: utils/adt/multirangetypes.c:194 #, c-format msgid "Expected range start." msgstr "Start einer Range erwartet." -#: utils/adt/multirangetypes.c:269 +#: utils/adt/multirangetypes.c:268 #, c-format msgid "Expected comma or end of multirange." msgstr "Komma oder Ende der Multirange erwartet." -#: utils/adt/multirangetypes.c:982 +#: utils/adt/multirangetypes.c:981 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "Multiranges können nicht aus mehrdimensionalen Arrays konstruiert werden" -#: utils/adt/multirangetypes.c:1008 +#: utils/adt/multirangetypes.c:1007 #, c-format msgid "multirange values cannot contain null members" msgstr "Multirange-Werte können keine Mitglieder, die NULL sind, haben" @@ -25428,112 +26449,138 @@ msgstr "Ergebnis ist außerhalb des gültigen Bereichs" msgid "cannot subtract inet values of different sizes" msgstr "Subtraktion von »inet«-Werten unterschiedlicher Größe nicht möglich" -#: utils/adt/numeric.c:785 utils/adt/numeric.c:3643 utils/adt/numeric.c:7131 -#: utils/adt/numeric.c:7334 utils/adt/numeric.c:7806 utils/adt/numeric.c:10501 -#: utils/adt/numeric.c:10975 utils/adt/numeric.c:11069 -#: utils/adt/numeric.c:11203 +#: utils/adt/numeric.c:793 utils/adt/numeric.c:3659 utils/adt/numeric.c:7216 +#: utils/adt/numeric.c:7419 utils/adt/numeric.c:7891 utils/adt/numeric.c:10586 +#: utils/adt/numeric.c:11061 utils/adt/numeric.c:11155 +#: utils/adt/numeric.c:11290 #, c-format msgid "value overflows numeric format" msgstr "Wert verursacht Überlauf im »numeric«-Format" -#: utils/adt/numeric.c:1098 +#: utils/adt/numeric.c:1106 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "ungültiges Vorzeichen in externem »numeric«-Wert" -#: utils/adt/numeric.c:1104 +#: utils/adt/numeric.c:1112 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "ungültige Skala in externem »numeric«-Wert" -#: utils/adt/numeric.c:1113 +#: utils/adt/numeric.c:1121 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "ungültige Ziffer in externem »numeric«-Wert" -#: utils/adt/numeric.c:1328 utils/adt/numeric.c:1342 +#: utils/adt/numeric.c:1336 utils/adt/numeric.c:1350 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "Präzision von NUMERIC (%d) muss zwischen 1 und %d liegen" -#: utils/adt/numeric.c:1333 +#: utils/adt/numeric.c:1341 #, c-format msgid "NUMERIC scale %d must be between %d and %d" msgstr "Skala von NUMERIC (%d) muss zwischen %d und %d liegen" -#: utils/adt/numeric.c:1351 +#: utils/adt/numeric.c:1359 #, c-format msgid "invalid NUMERIC type modifier" msgstr "ungültiker Modifikator für Typ NUMERIC" -#: utils/adt/numeric.c:1709 +#: utils/adt/numeric.c:1725 #, c-format msgid "start value cannot be NaN" msgstr "Startwert kann nicht NaN sein" -#: utils/adt/numeric.c:1713 +#: utils/adt/numeric.c:1729 #, c-format msgid "start value cannot be infinity" msgstr "Startwert kann nicht unendlich sein" -#: utils/adt/numeric.c:1720 +#: utils/adt/numeric.c:1736 #, c-format msgid "stop value cannot be NaN" msgstr "Stoppwert kann nicht NaN sein" -#: utils/adt/numeric.c:1724 +#: utils/adt/numeric.c:1740 #, c-format msgid "stop value cannot be infinity" msgstr "Stoppwert kann nicht unendlich sein" -#: utils/adt/numeric.c:1737 +#: utils/adt/numeric.c:1753 #, c-format msgid "step size cannot be NaN" msgstr "Schrittgröße kann nicht NaN sein" -#: utils/adt/numeric.c:1741 +#: utils/adt/numeric.c:1757 #, c-format msgid "step size cannot be infinity" msgstr "Schrittgröße kann nicht unendlich sein" -#: utils/adt/numeric.c:3633 +#: utils/adt/numeric.c:3649 #, c-format msgid "factorial of a negative number is undefined" msgstr "Fakultät einer negativen Zahl ist undefiniert" -#: utils/adt/numeric.c:4366 utils/adt/numeric.c:4446 utils/adt/numeric.c:4487 -#: utils/adt/numeric.c:4683 +#: utils/adt/numeric.c:4256 +#, c-format +msgid "lower bound cannot be NaN" +msgstr "Untergrenze kann nicht NaN sein" + +#: utils/adt/numeric.c:4260 +#, c-format +msgid "lower bound cannot be infinity" +msgstr "Untergrenze kann nicht unendlich sein" + +#: utils/adt/numeric.c:4267 +#, c-format +msgid "upper bound cannot be NaN" +msgstr "Obergrenze kann nicht NaN sein" + +#: utils/adt/numeric.c:4271 +#, c-format +msgid "upper bound cannot be infinity" +msgstr "Obergrenze kann nicht unendlich sein" + +#: utils/adt/numeric.c:4432 utils/adt/numeric.c:4520 utils/adt/numeric.c:4580 +#: utils/adt/numeric.c:4776 #, c-format msgid "cannot convert NaN to %s" msgstr "kann NaN nicht in %s umwandeln" -#: utils/adt/numeric.c:4370 utils/adt/numeric.c:4450 utils/adt/numeric.c:4491 -#: utils/adt/numeric.c:4687 +#: utils/adt/numeric.c:4436 utils/adt/numeric.c:4524 utils/adt/numeric.c:4584 +#: utils/adt/numeric.c:4780 #, c-format msgid "cannot convert infinity to %s" msgstr "kann Unendlich nicht in %s umwandeln" -#: utils/adt/numeric.c:4696 +#: utils/adt/numeric.c:4789 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn ist außerhalb des gültigen Bereichs" -#: utils/adt/numeric.c:7896 utils/adt/numeric.c:7947 +#: utils/adt/numeric.c:7981 utils/adt/numeric.c:8032 #, c-format msgid "numeric field overflow" msgstr "Feldüberlauf bei Typ »numeric«" -#: utils/adt/numeric.c:7897 +#: utils/adt/numeric.c:7982 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "Ein Feld mit Präzision %d, Skala %d muss beim Runden einen Betrag von weniger als %s%d ergeben." -#: utils/adt/numeric.c:7948 +#: utils/adt/numeric.c:8033 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "Ein Feld mit Präzision %d, Skala %d kann keinen unendlichen Wert enthalten." -#: utils/adt/oid.c:216 +#: utils/adt/numeric.c:11359 utils/adt/pseudorandomfuncs.c:135 +#: utils/adt/pseudorandomfuncs.c:159 +#, c-format +msgid "lower bound must be less than or equal to upper bound" +msgstr "Untergrenze muss kleiner als oder gleich der Obergrenze sein" + +#: utils/adt/oid.c:217 #, c-format msgid "invalid oidvector data" msgstr "ungültige oidvector-Daten" @@ -25563,306 +26610,317 @@ msgstr "gewünschtes Zeichen ist zu groß für die Kodierung: %u" msgid "requested character not valid for encoding: %u" msgstr "gewünschtes Zeichen ist nicht gültig für die Kodierung: %u" -#: utils/adt/orderedsetaggs.c:448 utils/adt/orderedsetaggs.c:553 -#: utils/adt/orderedsetaggs.c:693 +#: utils/adt/orderedsetaggs.c:446 utils/adt/orderedsetaggs.c:551 +#: utils/adt/orderedsetaggs.c:691 #, c-format msgid "percentile value %g is not between 0 and 1" msgstr "Perzentilwert %g ist nicht zwischen 0 und 1" -#: utils/adt/pg_locale.c:1406 +#: utils/adt/pg_locale.c:326 utils/adt/pg_locale.c:358 +#, c-format +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "Locale-Name »%s« enthält Nicht-ASCII-Zeichen" + +#: utils/adt/pg_locale.c:1507 #, c-format msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" msgstr "konnte Collator für Locale »%s« mit Regeln »%s« nicht öffnen: %s" -#: utils/adt/pg_locale.c:1417 utils/adt/pg_locale.c:2831 -#: utils/adt/pg_locale.c:2902 +#: utils/adt/pg_locale.c:1518 utils/adt/pg_locale.c:2992 +#: utils/adt/pg_locale.c:3065 #, c-format msgid "ICU is not supported in this build" msgstr "ICU wird in dieser Installation nicht unterstützt" -#: utils/adt/pg_locale.c:1446 +#: utils/adt/pg_locale.c:1546 #, c-format msgid "could not create locale \"%s\": %m" msgstr "konnte Locale »%s« nicht erzeugen: %m" -#: utils/adt/pg_locale.c:1449 +#: utils/adt/pg_locale.c:1549 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "Das Betriebssystem konnte keine Locale-Daten für den Locale-Namen »%s« finden." -#: utils/adt/pg_locale.c:1564 +#: utils/adt/pg_locale.c:1670 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "Sortierfolgen mit unterschiedlichen »collate«- und »ctype«-Werten werden auf dieser Plattform nicht unterstützt" -#: utils/adt/pg_locale.c:1573 -#, c-format -msgid "collation provider LIBC is not supported on this platform" -msgstr "Sortierfolgen-Provider LIBC wird auf dieser Plattform nicht unterstützt" - -#: utils/adt/pg_locale.c:1614 +#: utils/adt/pg_locale.c:1717 #, c-format msgid "collation \"%s\" has no actual version, but a version was recorded" msgstr "Sortierfolge »%s« hat keine tatsächliche Version, aber eine Version wurde aufgezeichnet" -#: utils/adt/pg_locale.c:1620 +#: utils/adt/pg_locale.c:1723 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "Version von Sortierfolge »%s« stimmt nicht überein" -#: utils/adt/pg_locale.c:1622 +#: utils/adt/pg_locale.c:1725 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "Die Sortierfolge in der Datenbank wurde mit Version %s erzeugt, aber das Betriebssystem hat Version %s." -#: utils/adt/pg_locale.c:1625 +#: utils/adt/pg_locale.c:1728 #, c-format msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgstr "Bauen Sie alle von dieser Sortierfolge beinflussten Objekte neu und führen Sie ALTER COLLATION %s REFRESH VERSION aus, oder bauen Sie PostgreSQL mit der richtigen Bibliotheksversion." -#: utils/adt/pg_locale.c:1691 +#: utils/adt/pg_locale.c:1772 utils/adt/pg_locale.c:2556 +#: utils/adt/pg_locale.c:2581 +#, c-format +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "ungültiger Locale-Name »%s« für Provider »builtin«" + +#: utils/adt/pg_locale.c:1814 #, c-format msgid "could not load locale \"%s\"" msgstr "konnte Locale »%s« nicht laden" -#: utils/adt/pg_locale.c:1716 +#: utils/adt/pg_locale.c:1839 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "konnte Sortierfolgenversion für Locale »%s« nicht ermitteln: Fehlercode %lu" -#: utils/adt/pg_locale.c:1772 utils/adt/pg_locale.c:1785 +#: utils/adt/pg_locale.c:1895 utils/adt/pg_locale.c:1908 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "konnte Zeichenkette nicht in UTF-16 umwandeln: Fehlercode %lu" -#: utils/adt/pg_locale.c:1799 +#: utils/adt/pg_locale.c:1920 #, c-format msgid "could not compare Unicode strings: %m" msgstr "konnte Unicode-Zeichenketten nicht vergleichen: %m" -#: utils/adt/pg_locale.c:1980 +#: utils/adt/pg_locale.c:2094 #, c-format msgid "collation failed: %s" msgstr "Vergleichung fehlgeschlagen: %s" -#: utils/adt/pg_locale.c:2201 utils/adt/pg_locale.c:2233 +#: utils/adt/pg_locale.c:2313 utils/adt/pg_locale.c:2345 #, c-format msgid "sort key generation failed: %s" msgstr "Sortierschlüsselerzeugung fehlgeschlagen: %s" -#: utils/adt/pg_locale.c:2474 +#: utils/adt/pg_locale.c:2635 #, c-format msgid "could not get language from locale \"%s\": %s" msgstr "konnte Sprache nicht aus Locale »%s« ermitteln: %s" -#: utils/adt/pg_locale.c:2495 utils/adt/pg_locale.c:2511 +#: utils/adt/pg_locale.c:2656 utils/adt/pg_locale.c:2672 #, c-format msgid "could not open collator for locale \"%s\": %s" msgstr "konnte Collator für Locale »%s« nicht öffnen: %s" -#: utils/adt/pg_locale.c:2536 +#: utils/adt/pg_locale.c:2697 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "Kodierung »%s« wird von ICU nicht unterstützt" -#: utils/adt/pg_locale.c:2543 +#: utils/adt/pg_locale.c:2704 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "konnte ICU-Konverter für Kodierung »%s« nicht öffnen: %s" -#: utils/adt/pg_locale.c:2561 utils/adt/pg_locale.c:2580 -#: utils/adt/pg_locale.c:2636 utils/adt/pg_locale.c:2647 +#: utils/adt/pg_locale.c:2722 utils/adt/pg_locale.c:2741 +#: utils/adt/pg_locale.c:2797 utils/adt/pg_locale.c:2808 #, c-format msgid "%s failed: %s" msgstr "%s fehlgeschlagen: %s" -#: utils/adt/pg_locale.c:2822 +#: utils/adt/pg_locale.c:2983 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "konnte Locale-Namen »%s« nicht in Sprach-Tag umwandeln: %s" -#: utils/adt/pg_locale.c:2863 +#: utils/adt/pg_locale.c:3024 #, c-format msgid "could not get language from ICU locale \"%s\": %s" msgstr "konnte Sprache nicht aus ICU-Locale »%s« ermitteln: %s" -#: utils/adt/pg_locale.c:2865 utils/adt/pg_locale.c:2893 +#: utils/adt/pg_locale.c:3026 utils/adt/pg_locale.c:3055 #, c-format -msgid "To disable ICU locale validation, set parameter icu_validation_level to DISABLED." -msgstr "" +msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." +msgstr "Um die Validierung von ICU-Locales auszuschalten, setzen Sie den Parameter »%s« auf »%s«." -#: utils/adt/pg_locale.c:2891 +#: utils/adt/pg_locale.c:3053 #, c-format msgid "ICU locale \"%s\" has unknown language \"%s\"" msgstr "ICU-Locale »%s« hat unbekannte Sprache »%s«" -#: utils/adt/pg_locale.c:3071 +#: utils/adt/pg_locale.c:3204 #, c-format msgid "invalid multibyte character for locale" msgstr "ungültiges Mehrbytezeichen für Locale" -#: utils/adt/pg_locale.c:3072 +#: utils/adt/pg_locale.c:3205 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "Die LC_CTYPE-Locale des Servers ist wahrscheinlich mit der Kodierung der Datenbank inkompatibel." -#: utils/adt/pg_lsn.c:263 +#: utils/adt/pg_lsn.c:262 #, c-format msgid "cannot add NaN to pg_lsn" msgstr "NaN kann nicht zu pg_lsn addiert werden" -#: utils/adt/pg_lsn.c:297 +#: utils/adt/pg_lsn.c:296 #, c-format msgid "cannot subtract NaN from pg_lsn" msgstr "NaN kann nicht von pg_lsn subtrahiert werden" -#: utils/adt/pg_upgrade_support.c:29 +#: utils/adt/pg_upgrade_support.c:39 #, c-format msgid "function can only be called when server is in binary upgrade mode" msgstr "Funktion kann nur aufgerufen werden, wenn der Server im Binary-Upgrade-Modus ist" -#: utils/adt/pgstatfuncs.c:253 +#: utils/adt/pgstatfuncs.c:252 #, c-format msgid "invalid command name: \"%s\"" msgstr "ungültiger Befehlsname: »%s«" -#: utils/adt/pgstatfuncs.c:1773 +#: utils/adt/pgstatfuncs.c:1739 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "unbekanntes Reset-Ziel: »%s«" -#: utils/adt/pgstatfuncs.c:1774 +#: utils/adt/pgstatfuncs.c:1740 #, c-format -msgid "Target must be \"archiver\", \"bgwriter\", \"io\", \"recovery_prefetch\", or \"wal\"." -msgstr "Das Reset-Ziel muss »archiver«, »bgwriter«, »io«, »recovery_prefetch« oder »wal« sein." +msgid "Target must be \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"recovery_prefetch\", \"slru\", or \"wal\"." +msgstr "Das Reset-Ziel muss »archiver«, »bgwriter«, »checkpointer«, »io«, »recovery_prefetch«, »slru« oder »wal« sein." -#: utils/adt/pgstatfuncs.c:1852 +#: utils/adt/pgstatfuncs.c:1822 #, c-format msgid "invalid subscription OID %u" msgstr "ungültige Subskriptions-OID: %u" -#: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 +#: utils/adt/pseudorandomfuncs.c:69 +#, c-format +msgid "setseed parameter %g is out of allowed range [-1,1]" +msgstr "setseed-Parameter %g ist außerhalb des gültigen Bereichs [-1;-1]" + +#: utils/adt/pseudotypes.c:55 utils/adt/pseudotypes.c:89 #, c-format msgid "cannot display a value of type %s" msgstr "kann keinen Wert vom Typ %s anzeigen" -#: utils/adt/pseudotypes.c:310 +#: utils/adt/pseudotypes.c:307 #, c-format msgid "cannot accept a value of a shell type" msgstr "kann keinen Wert eines Hüllentyps annehmen" -#: utils/adt/pseudotypes.c:320 +#: utils/adt/pseudotypes.c:317 #, c-format msgid "cannot display a value of a shell type" msgstr "kann keinen Wert eines Hüllentyps anzeigen" -#: utils/adt/rangetypes.c:415 +#: utils/adt/rangetypes.c:422 #, c-format msgid "range constructor flags argument must not be null" msgstr "Flags-Argument des Bereichstyp-Konstruktors darf nicht NULL sein" -#: utils/adt/rangetypes.c:1014 +#: utils/adt/rangetypes.c:1021 #, c-format msgid "result of range difference would not be contiguous" msgstr "Ergebnis von Bereichsdifferenz würde nicht zusammenhängend sein" -#: utils/adt/rangetypes.c:1075 +#: utils/adt/rangetypes.c:1082 #, c-format msgid "result of range union would not be contiguous" msgstr "Ergebnis von Bereichsvereinigung würde nicht zusammenhängend sein" -#: utils/adt/rangetypes.c:1750 +#: utils/adt/rangetypes.c:1757 #, c-format msgid "range lower bound must be less than or equal to range upper bound" msgstr "Bereichsuntergrenze muss kleiner als oder gleich der Bereichsobergrenze sein" -#: utils/adt/rangetypes.c:2197 utils/adt/rangetypes.c:2210 -#: utils/adt/rangetypes.c:2224 +#: utils/adt/rangetypes.c:2256 utils/adt/rangetypes.c:2269 +#: utils/adt/rangetypes.c:2283 #, c-format msgid "invalid range bound flags" msgstr "ungültige Markierungen für Bereichsgrenzen" -#: utils/adt/rangetypes.c:2198 utils/adt/rangetypes.c:2211 -#: utils/adt/rangetypes.c:2225 +#: utils/adt/rangetypes.c:2257 utils/adt/rangetypes.c:2270 +#: utils/adt/rangetypes.c:2284 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "Gültige Werte sind »[]«, »[)«, »(]« und »()«." -#: utils/adt/rangetypes.c:2293 utils/adt/rangetypes.c:2310 -#: utils/adt/rangetypes.c:2325 utils/adt/rangetypes.c:2345 -#: utils/adt/rangetypes.c:2356 utils/adt/rangetypes.c:2403 -#: utils/adt/rangetypes.c:2411 +#: utils/adt/rangetypes.c:2352 utils/adt/rangetypes.c:2369 +#: utils/adt/rangetypes.c:2384 utils/adt/rangetypes.c:2404 +#: utils/adt/rangetypes.c:2415 utils/adt/rangetypes.c:2462 +#: utils/adt/rangetypes.c:2470 #, c-format msgid "malformed range literal: \"%s\"" msgstr "fehlerhafte Bereichskonstante: »%s«" -#: utils/adt/rangetypes.c:2295 +#: utils/adt/rangetypes.c:2354 #, c-format msgid "Junk after \"empty\" key word." msgstr "Müll nach Schlüsselwort »empty«." -#: utils/adt/rangetypes.c:2312 +#: utils/adt/rangetypes.c:2371 #, c-format msgid "Missing left parenthesis or bracket." msgstr "Linke runde oder eckige Klammer fehlt." -#: utils/adt/rangetypes.c:2327 +#: utils/adt/rangetypes.c:2386 #, c-format msgid "Missing comma after lower bound." msgstr "Komma fehlt nach Untergrenze." -#: utils/adt/rangetypes.c:2347 +#: utils/adt/rangetypes.c:2406 #, c-format msgid "Too many commas." msgstr "Zu viele Kommas." -#: utils/adt/rangetypes.c:2358 +#: utils/adt/rangetypes.c:2417 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "Müll nach rechter runder oder eckiger Klammer." -#: utils/adt/regexp.c:305 utils/adt/regexp.c:1997 utils/adt/varlena.c:4270 +#: utils/adt/regexp.c:304 utils/adt/regexp.c:1996 utils/adt/varlena.c:4273 #, c-format msgid "regular expression failed: %s" msgstr "regulärer Ausdruck fehlgeschlagen: %s" -#: utils/adt/regexp.c:446 utils/adt/regexp.c:681 +#: utils/adt/regexp.c:445 utils/adt/regexp.c:680 #, c-format msgid "invalid regular expression option: \"%.*s\"" msgstr "ungültige Option für regulären Ausdruck: »%.*s«" -#: utils/adt/regexp.c:683 +#: utils/adt/regexp.c:682 #, c-format msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." msgstr "Wenn Sie regexp_replace() mit einem Startparameter verwenden wollten, wandeln Sie das vierte Argument explizit in integer um." -#: utils/adt/regexp.c:717 utils/adt/regexp.c:726 utils/adt/regexp.c:1083 -#: utils/adt/regexp.c:1147 utils/adt/regexp.c:1156 utils/adt/regexp.c:1165 -#: utils/adt/regexp.c:1174 utils/adt/regexp.c:1854 utils/adt/regexp.c:1863 -#: utils/adt/regexp.c:1872 utils/misc/guc.c:6610 utils/misc/guc.c:6644 +#: utils/adt/regexp.c:716 utils/adt/regexp.c:725 utils/adt/regexp.c:1082 +#: utils/adt/regexp.c:1146 utils/adt/regexp.c:1155 utils/adt/regexp.c:1164 +#: utils/adt/regexp.c:1173 utils/adt/regexp.c:1853 utils/adt/regexp.c:1862 +#: utils/adt/regexp.c:1871 utils/misc/guc.c:6820 utils/misc/guc.c:6854 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "ungültiger Wert für Parameter »%s«: %d" -#: utils/adt/regexp.c:937 +#: utils/adt/regexp.c:936 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "SQL regulärer Ausdruck darf nicht mehr als zwei Escape-Double-Quote-Separatoren enthalten" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:1094 utils/adt/regexp.c:1185 utils/adt/regexp.c:1272 -#: utils/adt/regexp.c:1311 utils/adt/regexp.c:1699 utils/adt/regexp.c:1754 -#: utils/adt/regexp.c:1883 +#: utils/adt/regexp.c:1093 utils/adt/regexp.c:1184 utils/adt/regexp.c:1271 +#: utils/adt/regexp.c:1310 utils/adt/regexp.c:1698 utils/adt/regexp.c:1753 +#: utils/adt/regexp.c:1882 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s unterstützt die »Global«-Option nicht" -#: utils/adt/regexp.c:1313 +#: utils/adt/regexp.c:1312 #, c-format msgid "Use the regexp_matches function instead." msgstr "Verwenden Sie stattdessen die Funktion regexp_matches." -#: utils/adt/regexp.c:1501 +#: utils/adt/regexp.c:1500 #, c-format msgid "too many regular expression matches" msgstr "zu viele Treffer für regulären Ausdruck" @@ -25877,8 +26935,8 @@ msgstr "es gibt mehrere Funktionen namens »%s«" msgid "more than one operator named %s" msgstr "es gibt mehrere Operatoren namens %s" -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10013 -#: utils/adt/ruleutils.c:10226 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10516 +#: utils/adt/ruleutils.c:10729 #, c-format msgid "too many arguments" msgstr "zu viele Argumente" @@ -25888,162 +26946,162 @@ msgstr "zu viele Argumente" msgid "Provide two argument types for operator." msgstr "Geben Sie zwei Argumente für den Operator an." -#: utils/adt/regproc.c:1544 utils/adt/regproc.c:1661 utils/adt/regproc.c:1790 -#: utils/adt/regproc.c:1795 utils/adt/varlena.c:3410 utils/adt/varlena.c:3415 +#: utils/adt/regproc.c:1564 utils/adt/regproc.c:1681 utils/adt/regproc.c:1810 +#: utils/adt/regproc.c:1815 utils/adt/varlena.c:3413 utils/adt/varlena.c:3418 #, c-format msgid "invalid name syntax" msgstr "ungültige Namenssyntax" -#: utils/adt/regproc.c:1904 +#: utils/adt/regproc.c:1924 #, c-format msgid "expected a left parenthesis" msgstr "linke Klammer erwartet" -#: utils/adt/regproc.c:1922 +#: utils/adt/regproc.c:1942 #, c-format msgid "expected a right parenthesis" msgstr "rechte Klammer erwartet" -#: utils/adt/regproc.c:1941 +#: utils/adt/regproc.c:1961 #, c-format msgid "expected a type name" msgstr "Typname erwartet" -#: utils/adt/regproc.c:1973 +#: utils/adt/regproc.c:1993 #, c-format msgid "improper type name" msgstr "falscher Typname" -#: utils/adt/ri_triggers.c:306 utils/adt/ri_triggers.c:1625 -#: utils/adt/ri_triggers.c:2610 +#: utils/adt/ri_triggers.c:303 utils/adt/ri_triggers.c:1616 +#: utils/adt/ri_triggers.c:2601 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "Einfügen oder Aktualisieren in Tabelle »%s« verletzt Fremdschlüssel-Constraint »%s«" -#: utils/adt/ri_triggers.c:309 utils/adt/ri_triggers.c:1628 +#: utils/adt/ri_triggers.c:306 utils/adt/ri_triggers.c:1619 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MATCH FULL erlaubt das Mischen von Schlüsseln, die NULL und nicht NULL sind, nicht." -#: utils/adt/ri_triggers.c:2045 +#: utils/adt/ri_triggers.c:2036 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "Funktion »%s« muss von INSERT ausgelöst werden" -#: utils/adt/ri_triggers.c:2051 +#: utils/adt/ri_triggers.c:2042 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "Funktion »%s« muss von UPDATE ausgelöst werden" -#: utils/adt/ri_triggers.c:2057 +#: utils/adt/ri_triggers.c:2048 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "Funktion »%s« muss von DELETE ausgelöst werden" -#: utils/adt/ri_triggers.c:2080 +#: utils/adt/ri_triggers.c:2071 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "kein »pg_constraint«-Eintrag für Trigger »%s« für Tabelle »%s«" -#: utils/adt/ri_triggers.c:2082 +#: utils/adt/ri_triggers.c:2073 #, c-format msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." msgstr "Entfernen Sie diesen Referentielle-Integritäts-Trigger und seine Partner und führen Sie dann ALTER TABLE ADD CONSTRAINT aus." -#: utils/adt/ri_triggers.c:2435 +#: utils/adt/ri_triggers.c:2426 #, c-format msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" msgstr "RI-Anfrage in Tabelle »%s« für Constraint »%s« von Tabelle »%s« ergab unerwartetes Ergebnis" -#: utils/adt/ri_triggers.c:2439 +#: utils/adt/ri_triggers.c:2430 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "Das liegt höchstwahrscheinlich daran, dass eine Regel die Anfrage umgeschrieben hat." -#: utils/adt/ri_triggers.c:2600 +#: utils/adt/ri_triggers.c:2591 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "Entfernen der Partition »%s« verletzt Fremdschlüssel-Constraint »%s«" -#: utils/adt/ri_triggers.c:2603 utils/adt/ri_triggers.c:2628 +#: utils/adt/ri_triggers.c:2594 utils/adt/ri_triggers.c:2619 #, c-format msgid "Key (%s)=(%s) is still referenced from table \"%s\"." msgstr "Auf Schlüssel (%s)=(%s) wird noch aus Tabelle »%s« verwiesen." -#: utils/adt/ri_triggers.c:2614 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "Schlüssel (%s)=(%s) ist nicht in Tabelle »%s« vorhanden." -#: utils/adt/ri_triggers.c:2617 +#: utils/adt/ri_triggers.c:2608 #, c-format msgid "Key is not present in table \"%s\"." msgstr "Der Schlüssel ist nicht in Tabelle »%s« vorhanden." -#: utils/adt/ri_triggers.c:2623 +#: utils/adt/ri_triggers.c:2614 #, c-format msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" msgstr "Aktualisieren oder Löschen in Tabelle »%s« verletzt Fremdschlüssel-Constraint »%s« von Tabelle »%s«" -#: utils/adt/ri_triggers.c:2631 +#: utils/adt/ri_triggers.c:2622 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "Auf den Schlüssel wird noch aus Tabelle »%s« verwiesen." -#: utils/adt/rowtypes.c:106 utils/adt/rowtypes.c:510 +#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:509 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "Eingabe anonymer zusammengesetzter Typen ist nicht implementiert" -#: utils/adt/rowtypes.c:159 utils/adt/rowtypes.c:191 utils/adt/rowtypes.c:217 -#: utils/adt/rowtypes.c:228 utils/adt/rowtypes.c:286 utils/adt/rowtypes.c:297 +#: utils/adt/rowtypes.c:158 utils/adt/rowtypes.c:190 utils/adt/rowtypes.c:216 +#: utils/adt/rowtypes.c:227 utils/adt/rowtypes.c:285 utils/adt/rowtypes.c:296 #, c-format msgid "malformed record literal: \"%s\"" msgstr "fehlerhafte Record-Konstante: »%s«" -#: utils/adt/rowtypes.c:160 +#: utils/adt/rowtypes.c:159 #, c-format msgid "Missing left parenthesis." msgstr "Linke Klammer fehlt." -#: utils/adt/rowtypes.c:192 +#: utils/adt/rowtypes.c:191 #, c-format msgid "Too few columns." msgstr "Zu wenige Spalten." -#: utils/adt/rowtypes.c:287 +#: utils/adt/rowtypes.c:286 #, c-format msgid "Too many columns." msgstr "Zu viele Spalten." -#: utils/adt/rowtypes.c:298 +#: utils/adt/rowtypes.c:297 #, c-format msgid "Junk after right parenthesis." msgstr "Müll nach rechter Klammer." -#: utils/adt/rowtypes.c:559 +#: utils/adt/rowtypes.c:558 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "falsche Anzahl der Spalten: %d, erwartet wurden %d" -#: utils/adt/rowtypes.c:601 +#: utils/adt/rowtypes.c:599 #, c-format msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" msgstr "binäre Daten haben Typ %u (%s) statt erwartet %u (%s) in Record-Spalte %d" -#: utils/adt/rowtypes.c:668 +#: utils/adt/rowtypes.c:660 #, c-format msgid "improper binary format in record column %d" msgstr "falsches Binärformat in Record-Spalte %d" -#: utils/adt/rowtypes.c:959 utils/adt/rowtypes.c:1205 utils/adt/rowtypes.c:1463 -#: utils/adt/rowtypes.c:1709 +#: utils/adt/rowtypes.c:949 utils/adt/rowtypes.c:1195 utils/adt/rowtypes.c:1453 +#: utils/adt/rowtypes.c:1699 #, c-format msgid "cannot compare dissimilar column types %s and %s at record column %d" msgstr "kann unterschiedliche Spaltentyp %s und %s in Record-Spalte %d nicht vergleichen" -#: utils/adt/rowtypes.c:1050 utils/adt/rowtypes.c:1275 -#: utils/adt/rowtypes.c:1560 utils/adt/rowtypes.c:1745 +#: utils/adt/rowtypes.c:1040 utils/adt/rowtypes.c:1265 +#: utils/adt/rowtypes.c:1550 utils/adt/rowtypes.c:1735 #, c-format msgid "cannot compare record types with different numbers of columns" msgstr "kann Record-Typen mit unterschiedlicher Anzahl Spalten nicht vergleichen" @@ -26063,113 +27121,139 @@ msgstr "Ausdruck enthält Verweise auf Variablen von mehr als einer Relation" msgid "expression contains variables" msgstr "Ausdruck enthält Variablen" -#: utils/adt/ruleutils.c:5227 +#: utils/adt/ruleutils.c:5246 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "Regel »%s« hat nicht unterstützten Ereignistyp %d" -#: utils/adt/timestamp.c:112 +#: utils/adt/timestamp.c:128 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "Präzision von TIMESTAMP(%d)%s darf nicht negativ sein" -#: utils/adt/timestamp.c:118 +#: utils/adt/timestamp.c:134 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "Präzision von TIMESTAMP(%d)%s auf erlaubten Höchstwert %d reduziert" -#: utils/adt/timestamp.c:378 +#: utils/adt/timestamp.c:394 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "Präzision von timestamp(%d) muss zwischen %d und %d sein" -#: utils/adt/timestamp.c:496 +#: utils/adt/timestamp.c:512 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "Numerische Zeitzonen müssen »-« oder »+« als erstes Zeichen haben." -#: utils/adt/timestamp.c:508 +#: utils/adt/timestamp.c:524 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "numerische Zeitzone »%s« ist außerhalb des gültigen Bereichs" -#: utils/adt/timestamp.c:609 utils/adt/timestamp.c:619 -#: utils/adt/timestamp.c:627 +#: utils/adt/timestamp.c:625 utils/adt/timestamp.c:635 +#: utils/adt/timestamp.c:643 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "timestamp ist außerhalb des gültigen Bereichs: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:728 +#: utils/adt/timestamp.c:744 #, c-format msgid "timestamp cannot be NaN" msgstr "timestamp kann nicht NaN sein" -#: utils/adt/timestamp.c:746 utils/adt/timestamp.c:758 +#: utils/adt/timestamp.c:762 utils/adt/timestamp.c:774 #, c-format msgid "timestamp out of range: \"%g\"" msgstr "timestamp ist außerhalb des gültigen Bereichs: »%g«" -#: utils/adt/timestamp.c:1065 utils/adt/timestamp.c:1098 +#: utils/adt/timestamp.c:957 utils/adt/timestamp.c:1516 +#: utils/adt/timestamp.c:1526 utils/adt/timestamp.c:1587 +#: utils/adt/timestamp.c:2807 utils/adt/timestamp.c:2816 +#: utils/adt/timestamp.c:2831 utils/adt/timestamp.c:2905 +#: utils/adt/timestamp.c:2922 utils/adt/timestamp.c:2979 +#: utils/adt/timestamp.c:3022 utils/adt/timestamp.c:3400 +#: utils/adt/timestamp.c:3458 utils/adt/timestamp.c:3481 +#: utils/adt/timestamp.c:3490 utils/adt/timestamp.c:3514 +#: utils/adt/timestamp.c:3537 utils/adt/timestamp.c:3546 +#: utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3782 +#: utils/adt/timestamp.c:4189 utils/adt/timestamp.c:4226 +#: utils/adt/timestamp.c:4274 utils/adt/timestamp.c:4283 +#: utils/adt/timestamp.c:4375 utils/adt/timestamp.c:4422 +#: utils/adt/timestamp.c:4431 utils/adt/timestamp.c:4527 +#: utils/adt/timestamp.c:4580 utils/adt/timestamp.c:4590 +#: utils/adt/timestamp.c:4785 utils/adt/timestamp.c:4795 +#: utils/adt/timestamp.c:5097 +#, c-format +msgid "interval out of range" +msgstr "interval-Wert ist außerhalb des gültigen Bereichs" + +#: utils/adt/timestamp.c:1094 utils/adt/timestamp.c:1127 #, c-format msgid "invalid INTERVAL type modifier" msgstr "ungültiger Modifikator für Typ INTERVAL" -#: utils/adt/timestamp.c:1081 +#: utils/adt/timestamp.c:1110 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d)-Präzision darf nicht negativ sein" -#: utils/adt/timestamp.c:1087 +#: utils/adt/timestamp.c:1116 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d)-Präzision auf erlaubtes Maximum %d reduziert" -#: utils/adt/timestamp.c:1473 +#: utils/adt/timestamp.c:1506 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "Präzision von interval(%d) muss zwischen %d und %d sein" -#: utils/adt/timestamp.c:2703 -#, c-format -msgid "cannot subtract infinite timestamps" -msgstr "kann unendliche timestamp-Werte nicht subtrahieren" - -#: utils/adt/timestamp.c:3956 utils/adt/timestamp.c:4139 +#: utils/adt/timestamp.c:4564 utils/adt/timestamp.c:4769 #, c-format msgid "origin out of range" msgstr "Anfangspunkt ist außerhalb des gültigen Bereichs" -#: utils/adt/timestamp.c:3961 utils/adt/timestamp.c:4144 +#: utils/adt/timestamp.c:4569 utils/adt/timestamp.c:4774 +#, c-format +msgid "timestamps cannot be binned into infinite intervals" +msgstr "timestamp-Werte können nicht in unendliche Intervalle einsortiert werden" + +#: utils/adt/timestamp.c:4574 utils/adt/timestamp.c:4779 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "timestamp-Werte können nicht in Intervalle, die Monate oder Jahre enthalten, einsortiert werden" -#: utils/adt/timestamp.c:3968 utils/adt/timestamp.c:4151 +#: utils/adt/timestamp.c:4585 utils/adt/timestamp.c:4790 #, c-format msgid "stride must be greater than zero" msgstr "Schrittgröße muss größer als null sein" -#: utils/adt/timestamp.c:4434 +#: utils/adt/timestamp.c:5091 #, c-format msgid "Months usually have fractional weeks." msgstr "Monate haben gewöhnlich partielle Wochen." -#: utils/adt/trigfuncs.c:42 +#: utils/adt/timestamp.c:6551 utils/adt/timestamp.c:6637 +#, c-format +msgid "step size cannot be infinite" +msgstr "Schrittgröße kann nicht unendlich sein" + +#: utils/adt/trigfuncs.c:41 #, c-format msgid "suppress_redundant_updates_trigger: must be called as trigger" msgstr "suppress_redundant_updates_trigger: muss als Trigger aufgerufen werden" -#: utils/adt/trigfuncs.c:48 +#: utils/adt/trigfuncs.c:47 #, c-format msgid "suppress_redundant_updates_trigger: must be called on update" msgstr "suppress_redundant_updates_trigger: muss bei UPDATE aufgerufen werden" -#: utils/adt/trigfuncs.c:54 +#: utils/adt/trigfuncs.c:53 #, c-format msgid "suppress_redundant_updates_trigger: must be called before update" msgstr "suppress_redundant_updates_trigger: muss vor dem UPDATE aufgerufen werden" -#: utils/adt/trigfuncs.c:60 +#: utils/adt/trigfuncs.c:59 #, c-format msgid "suppress_redundant_updates_trigger: must be called for each row" msgstr "suppress_redundant_updates_trigger: muss für jede Zeile aufgerufen werden" @@ -26184,32 +27268,32 @@ msgstr "Abstand im Phrasenoperator muss eine ganze Zahl zwischen einschließlich msgid "no operand in tsquery: \"%s\"" msgstr "kein Operand in tsquery: »%s«" -#: utils/adt/tsquery.c:558 +#: utils/adt/tsquery.c:554 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "Wert ist zu groß in tsquery: »%s«" -#: utils/adt/tsquery.c:563 +#: utils/adt/tsquery.c:559 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "Operator ist zu lang in tsquery: »%s«" -#: utils/adt/tsquery.c:591 +#: utils/adt/tsquery.c:587 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "Wort ist zu lang in tsquery: »%s«" -#: utils/adt/tsquery.c:717 utils/adt/tsvector_parser.c:147 +#: utils/adt/tsquery.c:713 utils/adt/tsvector_parser.c:147 #, c-format msgid "syntax error in tsquery: \"%s\"" msgstr "Syntaxfehler in tsquery: »%s«" -#: utils/adt/tsquery.c:883 +#: utils/adt/tsquery.c:879 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" msgstr "Textsucheanfrage enthält keine Lexeme: »%s«" -#: utils/adt/tsquery.c:894 utils/adt/tsquery_util.c:376 +#: utils/adt/tsquery.c:890 utils/adt/tsquery_util.c:376 #, c-format msgid "tsquery is too large" msgstr "tsquery ist zu groß" @@ -26244,72 +27328,72 @@ msgstr "Gewichtungs-Array darf keine NULL-Werte enthalten" msgid "weight out of range" msgstr "Gewichtung ist außerhalb des gültigen Bereichs" -#: utils/adt/tsvector.c:217 +#: utils/adt/tsvector.c:213 #, c-format msgid "word is too long (%ld bytes, max %ld bytes)" msgstr "Wort ist zu lang (%ld Bytes, maximal %ld Bytes)" -#: utils/adt/tsvector.c:224 +#: utils/adt/tsvector.c:220 #, c-format msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "Zeichenkette ist zu lang für tsvector (%ld Bytes, maximal %ld Bytes)" -#: utils/adt/tsvector_op.c:773 +#: utils/adt/tsvector_op.c:771 #, c-format msgid "lexeme array may not contain nulls" msgstr "Lexem-Array darf keine NULL-Werte enthalten" -#: utils/adt/tsvector_op.c:778 +#: utils/adt/tsvector_op.c:776 #, c-format msgid "lexeme array may not contain empty strings" msgstr "Lexem-Array darf keine leeren Zeichenketten enthalten" -#: utils/adt/tsvector_op.c:847 +#: utils/adt/tsvector_op.c:845 #, c-format msgid "weight array may not contain nulls" msgstr "Gewichtungs-Array darf keine NULL-Werte enthalten" -#: utils/adt/tsvector_op.c:871 +#: utils/adt/tsvector_op.c:869 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "unbekannte Gewichtung: »%c«" -#: utils/adt/tsvector_op.c:2601 +#: utils/adt/tsvector_op.c:2599 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "ts_stat-Anfrage muss eine tsvector-Spalte zurückgeben" -#: utils/adt/tsvector_op.c:2790 +#: utils/adt/tsvector_op.c:2788 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "tsvector-Spalte »%s« existiert nicht" -#: utils/adt/tsvector_op.c:2797 +#: utils/adt/tsvector_op.c:2795 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "Spalte »%s« hat nicht Typ tsvector" -#: utils/adt/tsvector_op.c:2809 +#: utils/adt/tsvector_op.c:2807 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "Konfigurationsspalte »%s« existiert nicht" -#: utils/adt/tsvector_op.c:2815 +#: utils/adt/tsvector_op.c:2813 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "Spalte »%s« hat nicht Typ regconfig" -#: utils/adt/tsvector_op.c:2822 +#: utils/adt/tsvector_op.c:2820 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "Konfigurationsspalte »%s« darf nicht NULL sein" -#: utils/adt/tsvector_op.c:2835 +#: utils/adt/tsvector_op.c:2833 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "Textsuchekonfigurationsname »%s« muss Schemaqualifikation haben" -#: utils/adt/tsvector_op.c:2860 +#: utils/adt/tsvector_op.c:2858 #, c-format msgid "column \"%s\" is not of a character type" msgstr "Spalte »%s« hat keinen Zeichentyp" @@ -26329,17 +27413,17 @@ msgstr "es gibt kein escaptes Zeichen: »%s«" msgid "wrong position info in tsvector: \"%s\"" msgstr "falsche Positionsinformationen in tsvector: »%s«" -#: utils/adt/uuid.c:413 +#: utils/adt/uuid.c:418 #, c-format msgid "could not generate random values" msgstr "konnte keine Zufallswerte erzeugen" -#: utils/adt/varbit.c:110 utils/adt/varchar.c:54 +#: utils/adt/varbit.c:110 utils/adt/varchar.c:53 #, c-format msgid "length for type %s must be at least 1" msgstr "Länge von Typ %s muss mindestens 1 sein" -#: utils/adt/varbit.c:115 utils/adt/varchar.c:58 +#: utils/adt/varbit.c:115 utils/adt/varchar.c:57 #, c-format msgid "length for type %s cannot exceed %d" msgstr "Länge von Typ %s kann %d nicht überschreiten" @@ -26374,9 +27458,9 @@ msgstr "ungültige Länge in externer Bitkette" msgid "bit string too long for type bit varying(%d)" msgstr "Bitkette ist zu lang für Typ bit varying(%d)" -#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:908 -#: utils/adt/varlena.c:971 utils/adt/varlena.c:1128 utils/adt/varlena.c:3052 -#: utils/adt/varlena.c:3130 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:911 +#: utils/adt/varlena.c:974 utils/adt/varlena.c:1131 utils/adt/varlena.c:3055 +#: utils/adt/varlena.c:3133 #, c-format msgid "negative substring length not allowed" msgstr "negative Teilzeichenkettenlänge nicht erlaubt" @@ -26401,332 +27485,342 @@ msgstr "binäres »Exklusiv-Oder« nicht mit Bitketten unterschiedlicher Länge msgid "bit index %d out of valid range (0..%d)" msgstr "Bitindex %d ist außerhalb des gültigen Bereichs (0..%d)" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3334 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3337 #, c-format msgid "new bit must be 0 or 1" msgstr "neues Bit muss 0 oder 1 sein" -#: utils/adt/varchar.c:162 utils/adt/varchar.c:313 +#: utils/adt/varchar.c:161 utils/adt/varchar.c:312 #, c-format msgid "value too long for type character(%d)" msgstr "Wert zu lang für Typ character(%d)" -#: utils/adt/varchar.c:476 utils/adt/varchar.c:640 +#: utils/adt/varchar.c:475 utils/adt/varchar.c:639 #, c-format msgid "value too long for type character varying(%d)" msgstr "Wert zu lang für Typ character varying(%d)" -#: utils/adt/varchar.c:738 utils/adt/varlena.c:1517 +#: utils/adt/varchar.c:737 utils/adt/varlena.c:1520 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "konnte die für den Zeichenkettenvergleich zu verwendende Sortierfolge nicht bestimmen" -#: utils/adt/varlena.c:1227 utils/adt/varlena.c:1806 +#: utils/adt/varlena.c:1230 utils/adt/varlena.c:1809 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "nichtdeterministische Sortierfolgen werden für Teilzeichenkettensuchen nicht unterstützt" -#: utils/adt/varlena.c:3218 utils/adt/varlena.c:3285 +#: utils/adt/varlena.c:3221 utils/adt/varlena.c:3288 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "Index %d ist außerhalb des gültigen Bereichs, 0..%d" -#: utils/adt/varlena.c:3249 utils/adt/varlena.c:3321 +#: utils/adt/varlena.c:3252 utils/adt/varlena.c:3324 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "Index %lld ist außerhalb des gültigen Bereichs, 0..%lld" -#: utils/adt/varlena.c:4382 +#: utils/adt/varlena.c:4385 #, c-format msgid "field position must not be zero" msgstr "Feldposition darf nicht null sein" -#: utils/adt/varlena.c:5554 +#: utils/adt/varlena.c:5630 #, c-format msgid "unterminated format() type specifier" msgstr "Typspezifikation in format() nicht abgeschlossen" -#: utils/adt/varlena.c:5555 utils/adt/varlena.c:5689 utils/adt/varlena.c:5810 +#: utils/adt/varlena.c:5631 utils/adt/varlena.c:5765 utils/adt/varlena.c:5886 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Für ein einzelnes »%%« geben Sie »%%%%« an." -#: utils/adt/varlena.c:5687 utils/adt/varlena.c:5808 +#: utils/adt/varlena.c:5763 utils/adt/varlena.c:5884 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "unbekannte Typspezifikation in format(): »%.*s«" -#: utils/adt/varlena.c:5700 utils/adt/varlena.c:5757 +#: utils/adt/varlena.c:5776 utils/adt/varlena.c:5833 #, c-format msgid "too few arguments for format()" msgstr "zu wenige Argumente für format()" -#: utils/adt/varlena.c:5853 utils/adt/varlena.c:6035 +#: utils/adt/varlena.c:5929 utils/adt/varlena.c:6111 #, c-format msgid "number is out of range" msgstr "Zahl ist außerhalb des gültigen Bereichs" -#: utils/adt/varlena.c:5916 utils/adt/varlena.c:5944 +#: utils/adt/varlena.c:5992 utils/adt/varlena.c:6020 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "Format gibt Argument 0 an, aber die Argumente sind von 1 an nummeriert" -#: utils/adt/varlena.c:5937 +#: utils/adt/varlena.c:6013 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "Argumentposition der Breitenangabe muss mit »$« enden" -#: utils/adt/varlena.c:5982 +#: utils/adt/varlena.c:6058 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "NULL-Werte können nicht als SQL-Bezeichner formatiert werden" -#: utils/adt/varlena.c:6190 +#: utils/adt/varlena.c:6266 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "Unicode-Normalisierung kann nur durchgeführt werden, wenn die Serverkodierung UTF8 ist" -#: utils/adt/varlena.c:6203 +#: utils/adt/varlena.c:6279 #, c-format msgid "invalid normalization form: %s" msgstr "ungültige Normalisierungsform: %s" -#: utils/adt/varlena.c:6406 utils/adt/varlena.c:6441 utils/adt/varlena.c:6476 +#: utils/adt/varlena.c:6324 +#, c-format +msgid "Unicode categorization can only be performed if server encoding is UTF8" +msgstr "Unicode-Kategorisierung kann nur durchgeführt werden, wenn die Serverkodierung UTF8 ist" + +#: utils/adt/varlena.c:6541 utils/adt/varlena.c:6576 utils/adt/varlena.c:6611 #, c-format msgid "invalid Unicode code point: %04X" msgstr "ungültiger Unicode-Codepunkt: %04X" -#: utils/adt/varlena.c:6506 +#: utils/adt/varlena.c:6641 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "Unicode-Escapes müssen \\XXXX, \\+XXXXXX, \\uXXXX oder \\UXXXXXXXX sein." -#: utils/adt/windowfuncs.c:442 +#: utils/adt/windowfuncs.c:443 #, c-format msgid "argument of ntile must be greater than zero" msgstr "Argument von ntile muss größer als null sein" -#: utils/adt/windowfuncs.c:706 +#: utils/adt/windowfuncs.c:707 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "Argument von nth_value muss größer als null sein" -#: utils/adt/xid8funcs.c:125 +#: utils/adt/xid8funcs.c:120 #, c-format msgid "transaction ID %llu is in the future" msgstr "Transaktions-ID %llu ist in der Zukunft" -#: utils/adt/xid8funcs.c:547 +#: utils/adt/xid8funcs.c:522 #, c-format msgid "invalid external pg_snapshot data" msgstr "ungültige externe pg_snapshot-Daten" -#: utils/adt/xml.c:228 +#: utils/adt/xml.c:238 #, c-format msgid "unsupported XML feature" msgstr "nicht unterstützte XML-Funktionalität" -#: utils/adt/xml.c:229 +#: utils/adt/xml.c:239 #, c-format msgid "This functionality requires the server to be built with libxml support." msgstr "Diese Funktionalität verlangt, dass der Server mit Libxml-Unterstützung gebaut wird." -#: utils/adt/xml.c:248 utils/mb/mbutils.c:628 +#: utils/adt/xml.c:258 utils/mb/mbutils.c:627 #, c-format msgid "invalid encoding name \"%s\"" msgstr "ungültiger Kodierungsname »%s«" -#: utils/adt/xml.c:496 utils/adt/xml.c:501 +#: utils/adt/xml.c:506 utils/adt/xml.c:511 #, c-format msgid "invalid XML comment" msgstr "ungültiger XML-Kommentar" -#: utils/adt/xml.c:660 +#: utils/adt/xml.c:697 #, c-format msgid "not an XML document" msgstr "kein XML-Dokument" -#: utils/adt/xml.c:956 utils/adt/xml.c:979 +#: utils/adt/xml.c:1008 utils/adt/xml.c:1031 #, c-format msgid "invalid XML processing instruction" msgstr "ungültige XML-Verarbeitungsanweisung" -#: utils/adt/xml.c:957 +#: utils/adt/xml.c:1009 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "Die Zielangabe der XML-Verarbeitungsanweisung darf nicht »%s« sein." -#: utils/adt/xml.c:980 +#: utils/adt/xml.c:1032 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-Verarbeitungsanweisung darf nicht »?>« enthalten." -#: utils/adt/xml.c:1059 +#: utils/adt/xml.c:1111 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate ist nicht implementiert" -#: utils/adt/xml.c:1115 +#: utils/adt/xml.c:1167 #, c-format msgid "could not initialize XML library" msgstr "konnte XML-Bibliothek nicht initialisieren" -#: utils/adt/xml.c:1116 +#: utils/adt/xml.c:1168 #, c-format msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." msgstr "libxml2 hat inkompatiblen char-Typ: sizeof(char)=%zu, sizeof(xmlChar)=%zu." -#: utils/adt/xml.c:1202 +#: utils/adt/xml.c:1254 #, c-format msgid "could not set up XML error handler" msgstr "konnte XML-Fehlerbehandlung nicht einrichten" -#: utils/adt/xml.c:1203 +#: utils/adt/xml.c:1255 #, c-format msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." msgstr "Das deutet wahrscheinlich darauf hin, dass die verwendete Version von libxml2 nicht mit den Header-Dateien der Version, mit der PostgreSQL gebaut wurde, kompatibel ist." -#: utils/adt/xml.c:2189 +#: utils/adt/xml.c:2281 msgid "Invalid character value." msgstr "Ungültiger Zeichenwert." -#: utils/adt/xml.c:2192 +#: utils/adt/xml.c:2284 msgid "Space required." msgstr "Leerzeichen benötigt." -#: utils/adt/xml.c:2195 +#: utils/adt/xml.c:2287 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone akzeptiert nur »yes« oder »no«." -#: utils/adt/xml.c:2198 +#: utils/adt/xml.c:2290 msgid "Malformed declaration: missing version." msgstr "Fehlerhafte Deklaration: Version fehlt." -#: utils/adt/xml.c:2201 +#: utils/adt/xml.c:2293 msgid "Missing encoding in text declaration." msgstr "Fehlende Kodierung in Textdeklaration." -#: utils/adt/xml.c:2204 +#: utils/adt/xml.c:2296 msgid "Parsing XML declaration: '?>' expected." msgstr "Beim Parsen der XML-Deklaration: »?>« erwartet." -#: utils/adt/xml.c:2207 +#: utils/adt/xml.c:2299 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Unbekannter Libxml-Fehlercode: %d." -#: utils/adt/xml.c:2461 +#: utils/adt/xml.c:2553 #, c-format msgid "XML does not support infinite date values." msgstr "XML unterstützt keine unendlichen Datumswerte." -#: utils/adt/xml.c:2483 utils/adt/xml.c:2510 +#: utils/adt/xml.c:2575 utils/adt/xml.c:2602 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML unterstützt keine unendlichen timestamp-Werte." -#: utils/adt/xml.c:2926 +#: utils/adt/xml.c:3018 #, c-format msgid "invalid query" msgstr "ungültige Anfrage" -#: utils/adt/xml.c:4266 +#: utils/adt/xml.c:3110 +#, c-format +msgid "portal \"%s\" does not return tuples" +msgstr "Portal »%s« gibt keine Tupel zurück" + +#: utils/adt/xml.c:4362 #, c-format msgid "invalid array for XML namespace mapping" msgstr "ungültiges Array for XML-Namensraumabbildung" -#: utils/adt/xml.c:4267 +#: utils/adt/xml.c:4363 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "Das Array muss zweidimensional sein und die Länge der zweiten Achse muss gleich 2 sein." -#: utils/adt/xml.c:4291 +#: utils/adt/xml.c:4387 #, c-format msgid "empty XPath expression" msgstr "leerer XPath-Ausdruck" -#: utils/adt/xml.c:4343 +#: utils/adt/xml.c:4439 #, c-format msgid "neither namespace name nor URI may be null" msgstr "weder Namensraumname noch URI dürfen NULL sein" -#: utils/adt/xml.c:4350 +#: utils/adt/xml.c:4446 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "konnte XML-Namensraum mit Namen »%s« und URI »%s« nicht registrieren" -#: utils/adt/xml.c:4693 +#: utils/adt/xml.c:4795 #, c-format msgid "DEFAULT namespace is not supported" msgstr "DEFAULT-Namensraum wird nicht unterstützt" -#: utils/adt/xml.c:4722 +#: utils/adt/xml.c:4824 #, c-format msgid "row path filter must not be empty string" msgstr "Zeilenpfadfilter darf nicht leer sein" -#: utils/adt/xml.c:4753 +#: utils/adt/xml.c:4858 #, c-format msgid "column path filter must not be empty string" msgstr "Spaltenpfadfilter darf nicht leer sein" -#: utils/adt/xml.c:4897 +#: utils/adt/xml.c:5005 #, c-format msgid "more than one value returned by column XPath expression" msgstr "XPath-Ausdruck für Spalte gab mehr als einen Wert zurück" -#: utils/cache/lsyscache.c:1043 +#: utils/cache/lsyscache.c:1017 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "Typumwandlung von Typ %s in Typ %s existiert nicht" -#: utils/cache/lsyscache.c:2845 utils/cache/lsyscache.c:2878 -#: utils/cache/lsyscache.c:2911 utils/cache/lsyscache.c:2944 +#: utils/cache/lsyscache.c:2887 utils/cache/lsyscache.c:2920 +#: utils/cache/lsyscache.c:2953 utils/cache/lsyscache.c:2986 #, c-format msgid "type %s is only a shell" msgstr "Typ %s ist nur eine Hülle" -#: utils/cache/lsyscache.c:2850 +#: utils/cache/lsyscache.c:2892 #, c-format msgid "no input function available for type %s" msgstr "keine Eingabefunktion verfügbar für Typ %s" -#: utils/cache/lsyscache.c:2883 +#: utils/cache/lsyscache.c:2925 #, c-format msgid "no output function available for type %s" msgstr "keine Ausgabefunktion verfügbar für Typ %s" -#: utils/cache/partcache.c:219 +#: utils/cache/partcache.c:216 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d for type %s" msgstr "in Operatorklasse »%s« für Zugriffsmethode %s fehlt Support-Funktion %d für Typ %s" -#: utils/cache/plancache.c:722 +#: utils/cache/plancache.c:747 #, c-format msgid "cached plan must not change result type" msgstr "gecachter Plan darf den Ergebnistyp nicht ändern" -#: utils/cache/relcache.c:3740 +#: utils/cache/relcache.c:3801 #, c-format msgid "heap relfilenumber value not set when in binary upgrade mode" msgstr "Heap-Relfile-Nummer-Wert ist im Binary-Upgrade-Modus nicht gesetzt" -#: utils/cache/relcache.c:3748 +#: utils/cache/relcache.c:3809 #, c-format msgid "unexpected request for new relfilenumber in binary upgrade mode" msgstr "unerwartete Anforderung einer neuen Relfile-Nummer im Binary-Upgrade-Modus" -#: utils/cache/relcache.c:6488 +#: utils/cache/relcache.c:6539 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "konnte Initialisierungsdatei für Relationscache »%s« nicht erzeugen: %m" -#: utils/cache/relcache.c:6490 +#: utils/cache/relcache.c:6541 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Setze trotzdem fort, aber irgendwas stimmt nicht." -#: utils/cache/relcache.c:6812 +#: utils/cache/relcache.c:6871 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "konnte Cache-Datei »%s« nicht löschen: %m" @@ -26736,17 +27830,17 @@ msgstr "konnte Cache-Datei »%s« nicht löschen: %m" msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "PREPARE kann nicht in einer Transaktion ausgeführt werden, die das Relation-Mapping geändert hat" -#: utils/cache/relmapper.c:850 +#: utils/cache/relmapper.c:852 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "Relation-Mapping-Datei »%s« enthält ungültige Daten" -#: utils/cache/relmapper.c:860 +#: utils/cache/relmapper.c:862 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "Relation-Mapping-Datei »%s« enthält falsche Prüfsumme" -#: utils/cache/typcache.c:1803 utils/fmgr/funcapi.c:566 +#: utils/cache/typcache.c:1812 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "Record-Typ wurde nicht registriert" @@ -26761,102 +27855,102 @@ msgstr "TRAP: ExceptionalCondition: fehlerhafte Argumente in PID %d\n" msgid "TRAP: failed Assert(\"%s\"), File: \"%s\", Line: %d, PID: %d\n" msgstr "TRAP: fehlgeschlagenes Assert(»%s«), Datei: »%s«, Zeile: %d, PID: %d\n" -#: utils/error/elog.c:416 +#: utils/error/elog.c:415 #, c-format msgid "error occurred before error message processing is available\n" msgstr "Fehler geschah bevor Fehlermeldungsverarbeitung bereit war\n" -#: utils/error/elog.c:2092 +#: utils/error/elog.c:2134 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "konnte Datei »%s« nicht als stderr neu öffnen: %m" -#: utils/error/elog.c:2105 +#: utils/error/elog.c:2147 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "konnte Datei »%s« nicht als stdout neu öffnen: %m" -#: utils/error/elog.c:2141 +#: utils/error/elog.c:2183 #, c-format -msgid "invalid character" -msgstr "ungültiges Zeichen" +msgid "Invalid character" +msgstr "Ungültiges Zeichen" -#: utils/error/elog.c:2847 utils/error/elog.c:2874 utils/error/elog.c:2890 +#: utils/error/elog.c:2889 utils/error/elog.c:2916 utils/error/elog.c:2932 msgid "[unknown]" msgstr "[unbekannt]" -#: utils/error/elog.c:3163 utils/error/elog.c:3484 utils/error/elog.c:3591 +#: utils/error/elog.c:3202 utils/error/elog.c:3526 utils/error/elog.c:3633 msgid "missing error text" msgstr "fehlender Fehlertext" -#: utils/error/elog.c:3166 utils/error/elog.c:3169 +#: utils/error/elog.c:3205 utils/error/elog.c:3208 #, c-format msgid " at character %d" msgstr " bei Zeichen %d" -#: utils/error/elog.c:3179 utils/error/elog.c:3186 +#: utils/error/elog.c:3218 utils/error/elog.c:3225 msgid "DETAIL: " msgstr "DETAIL: " -#: utils/error/elog.c:3193 +#: utils/error/elog.c:3232 msgid "HINT: " msgstr "TIPP: " -#: utils/error/elog.c:3200 +#: utils/error/elog.c:3239 msgid "QUERY: " msgstr "ANFRAGE: " -#: utils/error/elog.c:3207 +#: utils/error/elog.c:3246 msgid "CONTEXT: " msgstr "ZUSAMMENHANG: " -#: utils/error/elog.c:3217 +#: utils/error/elog.c:3256 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "ORT: %s, %s:%d\n" -#: utils/error/elog.c:3224 +#: utils/error/elog.c:3263 #, c-format msgid "LOCATION: %s:%d\n" msgstr "ORT: %s:%d\n" -#: utils/error/elog.c:3231 +#: utils/error/elog.c:3270 msgid "BACKTRACE: " msgstr "BACKTRACE: " -#: utils/error/elog.c:3243 +#: utils/error/elog.c:3282 msgid "STATEMENT: " msgstr "ANWEISUNG: " -#: utils/error/elog.c:3636 +#: utils/error/elog.c:3678 msgid "DEBUG" msgstr "DEBUG" -#: utils/error/elog.c:3640 +#: utils/error/elog.c:3682 msgid "LOG" msgstr "LOG" -#: utils/error/elog.c:3643 +#: utils/error/elog.c:3685 msgid "INFO" msgstr "INFO" -#: utils/error/elog.c:3646 +#: utils/error/elog.c:3688 msgid "NOTICE" msgstr "HINWEIS" -#: utils/error/elog.c:3650 +#: utils/error/elog.c:3692 msgid "WARNING" msgstr "WARNUNG" -#: utils/error/elog.c:3653 +#: utils/error/elog.c:3695 msgid "ERROR" msgstr "FEHLER" -#: utils/error/elog.c:3656 +#: utils/error/elog.c:3698 msgid "FATAL" msgstr "FATAL" -#: utils/error/elog.c:3659 +#: utils/error/elog.c:3701 msgid "PANIC" msgstr "PANIK" @@ -26929,22 +28023,22 @@ msgstr "Magischer Block hat unerwartete Länge oder unterschiedliches Padding." msgid "incompatible library \"%s\": magic block mismatch" msgstr "inkompatible Bibliothek »%s«: magischer Block stimmt überein" -#: utils/fmgr/dfmgr.c:492 +#: utils/fmgr/dfmgr.c:475 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "Zugriff auf Bibliothek »%s« ist nicht erlaubt" -#: utils/fmgr/dfmgr.c:518 +#: utils/fmgr/dfmgr.c:501 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "ungültiger Makroname in Parameter »dynamic_library_path«: %s" -#: utils/fmgr/dfmgr.c:558 +#: utils/fmgr/dfmgr.c:541 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "eine Komponente im Parameter »dynamic_library_path« hat Länge null" -#: utils/fmgr/dfmgr.c:577 +#: utils/fmgr/dfmgr.c:560 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "eine Komponente im Parameter »dynamic_library_path« ist kein absoluter Pfad" @@ -26969,223 +28063,213 @@ msgstr "Von SQL aufrufbare Funktionen benötigen ein begleitendes PG_FUNCTION_IN msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "Info-Funktion »%2$s« berichtete unbekannte API-Version %1$d" -#: utils/fmgr/fmgr.c:2080 +#: utils/fmgr/fmgr.c:2109 #, c-format msgid "operator class options info is absent in function call context" msgstr "Operatorklassenoptionsinformationen fehlen im Funktionsaufrufkontext" -#: utils/fmgr/fmgr.c:2147 +#: utils/fmgr/fmgr.c:2176 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "Sprachvalidierungsfunktion %u wurde für Sprache %u statt %u aufgerufen" -#: utils/fmgr/funcapi.c:489 +#: utils/fmgr/funcapi.c:496 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "konnte tatsächlichen Ergebnistyp von Funktion »%s« mit deklarierten Rückgabetyp %s nicht bestimmen" -#: utils/fmgr/funcapi.c:634 +#: utils/fmgr/funcapi.c:642 #, c-format msgid "argument declared %s does not contain a range type but type %s" msgstr "als %s deklariertes Argument enthält keinen Bereichstyp sondern Typ %s" -#: utils/fmgr/funcapi.c:717 -#, c-format -msgid "could not find multirange type for data type %s" -msgstr "konnte Multirange-Typ für Datentyp %s nicht finden" - -#: utils/fmgr/funcapi.c:1921 utils/fmgr/funcapi.c:1953 +#: utils/fmgr/funcapi.c:1929 utils/fmgr/funcapi.c:1961 #, c-format msgid "number of aliases does not match number of columns" msgstr "Anzahl der Aliasnamen stimmt nicht mit der Anzahl der Spalten überein" -#: utils/fmgr/funcapi.c:1947 +#: utils/fmgr/funcapi.c:1955 #, c-format msgid "no column alias was provided" msgstr "Spaltenalias fehlt" -#: utils/fmgr/funcapi.c:1971 +#: utils/fmgr/funcapi.c:1979 #, c-format msgid "could not determine row description for function returning record" msgstr "konnte Zeilenbeschreibung für Funktion, die »record« zurückgibt, nicht ermitteln" -#: utils/init/miscinit.c:347 +#: utils/init/miscinit.c:353 #, c-format msgid "data directory \"%s\" does not exist" msgstr "Datenverzeichnis »%s« existiert nicht" -#: utils/init/miscinit.c:352 +#: utils/init/miscinit.c:358 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %m" -#: utils/init/miscinit.c:360 +#: utils/init/miscinit.c:366 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "angegebenes Datenverzeichnis »%s« ist kein Verzeichnis" -#: utils/init/miscinit.c:376 +#: utils/init/miscinit.c:382 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "Datenverzeichnis »%s« hat falschen Eigentümer" -#: utils/init/miscinit.c:378 +#: utils/init/miscinit.c:384 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "Der Server muss von dem Benutzer gestartet werden, dem das Datenverzeichnis gehört." -#: utils/init/miscinit.c:396 +#: utils/init/miscinit.c:402 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "Datenverzeichnis »%s« hat ungültige Zugriffsrechte" -#: utils/init/miscinit.c:398 +#: utils/init/miscinit.c:404 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Rechte sollten u=rwx (0700) oder u=rwx,g=rx (0750) sein." -#: utils/init/miscinit.c:456 +#: utils/init/miscinit.c:462 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m" -#: utils/init/miscinit.c:693 utils/misc/guc.c:3548 +#: utils/init/miscinit.c:720 utils/misc/guc.c:3650 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "kann Parameter »%s« nicht in einer sicherheitsbeschränkten Operation setzen" -#: utils/init/miscinit.c:765 +#: utils/init/miscinit.c:807 #, c-format msgid "role with OID %u does not exist" msgstr "Rolle mit OID %u existiert nicht" -#: utils/init/miscinit.c:795 +#: utils/init/miscinit.c:853 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "Rolle »%s« hat keine Berechtigung zum Einloggen" -#: utils/init/miscinit.c:813 +#: utils/init/miscinit.c:874 #, c-format msgid "too many connections for role \"%s\"" msgstr "zu viele Verbindungen von Rolle »%s«" -#: utils/init/miscinit.c:912 -#, c-format -msgid "permission denied to set session authorization" -msgstr "keine Berechtigung, um Sitzungsautorisierung zu setzen" - -#: utils/init/miscinit.c:995 +#: utils/init/miscinit.c:1045 #, c-format msgid "invalid role OID: %u" msgstr "ungültige Rollen-OID: %u" -#: utils/init/miscinit.c:1142 +#: utils/init/miscinit.c:1192 #, c-format msgid "database system is shut down" msgstr "Datenbanksystem ist heruntergefahren" -#: utils/init/miscinit.c:1229 +#: utils/init/miscinit.c:1279 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht erstellen: %m" -#: utils/init/miscinit.c:1243 +#: utils/init/miscinit.c:1293 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht öffnen: %m" -#: utils/init/miscinit.c:1250 +#: utils/init/miscinit.c:1300 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht lesen: %m" -#: utils/init/miscinit.c:1259 +#: utils/init/miscinit.c:1309 #, c-format msgid "lock file \"%s\" is empty" msgstr "Sperrdatei »%s« ist leer" -#: utils/init/miscinit.c:1260 +#: utils/init/miscinit.c:1310 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." msgstr "Entweder startet gerade ein anderer Server oder die Sperrdatei ist von einen Absturz übrig geblieben." -#: utils/init/miscinit.c:1304 +#: utils/init/miscinit.c:1354 #, c-format msgid "lock file \"%s\" already exists" msgstr "Sperrdatei »%s« existiert bereits" -#: utils/init/miscinit.c:1308 +#: utils/init/miscinit.c:1358 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "Läuft bereits ein anderer postgres-Prozess (PID %d) im Datenverzeichnis »%s«?" -#: utils/init/miscinit.c:1310 +#: utils/init/miscinit.c:1360 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "Läuft bereits ein anderer postmaster-Prozess (PID %d) im Datenverzeichnis »%s«?" -#: utils/init/miscinit.c:1313 +#: utils/init/miscinit.c:1363 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Verwendet bereits ein anderer postgres-Prozess (PID %d) die Socketdatei »%s«?" -#: utils/init/miscinit.c:1315 +#: utils/init/miscinit.c:1365 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Verwendet bereits ein anderer postmaster-Prozess (PID %d) die Socketdatei »%s«?" -#: utils/init/miscinit.c:1366 +#: utils/init/miscinit.c:1416 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "konnte alte Sperrdatei »%s« nicht löschen: %m" -#: utils/init/miscinit.c:1368 +#: utils/init/miscinit.c:1418 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." msgstr "Die Datei ist anscheinend aus Versehen übrig geblieben, konnte aber nicht gelöscht werden. Bitte entfernen Sie die Datei von Hand und versuchen Sie es erneut." -#: utils/init/miscinit.c:1405 utils/init/miscinit.c:1419 -#: utils/init/miscinit.c:1430 +#: utils/init/miscinit.c:1455 utils/init/miscinit.c:1469 +#: utils/init/miscinit.c:1480 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht schreiben: %m" -#: utils/init/miscinit.c:1541 utils/init/miscinit.c:1683 utils/misc/guc.c:5580 +#: utils/init/miscinit.c:1591 utils/init/miscinit.c:1733 utils/misc/guc.c:5765 #, c-format msgid "could not read from file \"%s\": %m" msgstr "konnte nicht aus Datei »%s« lesen: %m" -#: utils/init/miscinit.c:1671 +#: utils/init/miscinit.c:1721 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "konnte Datei »%s« nicht öffnen: %m; setze trotzdem fort" -#: utils/init/miscinit.c:1696 +#: utils/init/miscinit.c:1746 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "Sperrdatei »%s« enthält falsche PID: %ld statt %ld" -#: utils/init/miscinit.c:1735 utils/init/miscinit.c:1751 +#: utils/init/miscinit.c:1785 utils/init/miscinit.c:1801 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "»%s« ist kein gültiges Datenverzeichnis" -#: utils/init/miscinit.c:1737 +#: utils/init/miscinit.c:1787 #, c-format msgid "File \"%s\" is missing." msgstr "Die Datei »%s« fehlt." -#: utils/init/miscinit.c:1753 +#: utils/init/miscinit.c:1803 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Die Datei »%s« enthält keine gültigen Daten." -#: utils/init/miscinit.c:1755 +#: utils/init/miscinit.c:1805 #, c-format msgid "You might need to initdb." msgstr "Sie müssen möglicherweise initdb ausführen." -#: utils/init/miscinit.c:1763 +#: utils/init/miscinit.c:1813 #, c-format msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." msgstr "Das Datenverzeichnis wurde von PostgreSQL Version %s initialisiert, welche nicht mit dieser Version %s kompatibel ist." @@ -27216,10 +28300,9 @@ msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" msgstr " SSL an (Protokoll=%s, Verschlüsselungsmethode=%s, Bits=%d)" #: utils/init/postinit.c:285 -#, fuzzy, c-format -#| msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" +#, c-format msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s, principal=%s)" -msgstr " GSS (authentifiziert=%s, verschlüsselt=%s, Principal=%s)" +msgstr " GSS (authentifiziert=%s, verschlüsselt=%s, delegated Credentials=%s, Principal=%s)" #: utils/init/postinit.c:286 utils/init/postinit.c:287 #: utils/init/postinit.c:288 utils/init/postinit.c:293 @@ -27234,10 +28317,9 @@ msgid "yes" msgstr "ja" #: utils/init/postinit.c:292 -#, fuzzy, c-format -#| msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" +#, c-format msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)" -msgstr " GSS (authentifiziert=%s, verschlüsselt=%s, Principal=%s)" +msgstr " GSS (authentifiziert=%s, verschlüsselt=%s, delegated Credentials=%s)" #: utils/init/postinit.c:333 #, c-format @@ -27264,101 +28346,105 @@ msgstr "keine Berechtigung für Datenbank »%s«" msgid "User does not have CONNECT privilege." msgstr "Benutzer hat das CONNECT-Privileg nicht." -#: utils/init/postinit.c:386 +#: utils/init/postinit.c:389 #, c-format msgid "too many connections for database \"%s\"" msgstr "zu viele Verbindungen für Datenbank »%s«" -#: utils/init/postinit.c:410 utils/init/postinit.c:417 +#: utils/init/postinit.c:413 utils/init/postinit.c:420 #, c-format msgid "database locale is incompatible with operating system" msgstr "Datenbank-Locale ist inkompatibel mit Betriebssystem" -#: utils/init/postinit.c:411 +#: utils/init/postinit.c:414 #, c-format msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." msgstr "Die Datenbank wurde mit LC_COLLATE »%s« initialisiert, was von setlocale() nicht erkannt wird." -#: utils/init/postinit.c:413 utils/init/postinit.c:420 +#: utils/init/postinit.c:416 utils/init/postinit.c:423 #, c-format msgid "Recreate the database with another locale or install the missing locale." msgstr "Erzeugen Sie die Datenbank neu mit einer anderen Locale oder installieren Sie die fehlende Locale." -#: utils/init/postinit.c:418 +#: utils/init/postinit.c:421 #, c-format msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." msgstr "Die Datenbank wurde mit LC_CTYPE »%s« initialisiert, was von setlocale() nicht erkannt wird." -#: utils/init/postinit.c:475 +#: utils/init/postinit.c:493 #, c-format msgid "database \"%s\" has a collation version mismatch" msgstr "Version von Sortierfolge für Datenbank »%s« stimmt nicht überein" -#: utils/init/postinit.c:477 +#: utils/init/postinit.c:495 #, c-format msgid "The database was created using collation version %s, but the operating system provides version %s." msgstr "Die Datenbank wurde mit Sortierfolgenversion %s erzeugt, aber das Betriebssystem hat Version %s." -#: utils/init/postinit.c:480 +#: utils/init/postinit.c:498 #, c-format msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." msgstr "Bauen Sie alle Objekte in dieser Datenbank, die die Standardsortierfolge verwenden, neu und führen Sie ALTER DATABASE %s REFRESH COLLATION VERSION aus, oder bauen Sie PostgreSQL mit der richtigen Bibliotheksversion." -#: utils/init/postinit.c:891 +#: utils/init/postinit.c:904 #, c-format msgid "no roles are defined in this database system" msgstr "in diesem Datenbanksystem sind keine Rollen definiert" -#: utils/init/postinit.c:892 +#: utils/init/postinit.c:905 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Sie sollten sofort CREATE USER \"%s\" SUPERUSER; ausführen." -#: utils/init/postinit.c:928 +#: utils/init/postinit.c:942 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "nur Superuser können im Binary-Upgrade-Modus verbinden" -#: utils/init/postinit.c:949 +#: utils/init/postinit.c:962 #, c-format -msgid "remaining connection slots are reserved for roles with %s" +msgid "remaining connection slots are reserved for roles with the %s attribute" msgstr "die verbleibenden Verbindungen sind für Rollen mit dem %s-Attribut reserviert" -#: utils/init/postinit.c:955 +#: utils/init/postinit.c:968 #, c-format msgid "remaining connection slots are reserved for roles with privileges of the \"%s\" role" msgstr "die verbleibenden Verbindungen sind für Rollen mit den Privilegien der Rolle »%s« reserviert" -#: utils/init/postinit.c:967 +#: utils/init/postinit.c:980 #, c-format msgid "permission denied to start WAL sender" msgstr "keine Berechtigung, um WAL-Sender zu starten" -#: utils/init/postinit.c:968 +#: utils/init/postinit.c:981 #, c-format msgid "Only roles with the %s attribute may start a WAL sender process." msgstr "Nur Rollen mit dem %s-Attribut können einen WAL-Sender-Prozess starten." -#: utils/init/postinit.c:1038 +#: utils/init/postinit.c:1099 +#, c-format +msgid "It seems to have just been dropped or renamed." +msgstr "Sie wurde anscheinend gerade gelöscht oder umbenannt." + +#: utils/init/postinit.c:1103 #, c-format msgid "database %u does not exist" msgstr "Datenbank %u existiert nicht" -#: utils/init/postinit.c:1127 +#: utils/init/postinit.c:1112 #, c-format -msgid "It seems to have just been dropped or renamed." -msgstr "Sie wurde anscheinend gerade gelöscht oder umbenannt." +msgid "cannot connect to invalid database \"%s\"" +msgstr "mit ungültiger Datenbank »%s« kann nicht verbunden werden" -#: utils/init/postinit.c:1145 +#: utils/init/postinit.c:1173 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Das Datenbankunterverzeichnis »%s« fehlt." #: utils/init/usercontext.c:43 -#, fuzzy, c-format -#| msgid "\"%s\" cannot be higher than \"%s\"" +#, c-format msgid "role \"%s\" cannot SET ROLE to \"%s\"" -msgstr "»%s« kann nicht höher als »%s« sein" +msgstr "Rolle »%s« kann nicht SET ROLE auf »%s« durchführen" #: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format @@ -27377,53 +28463,48 @@ msgstr "unerwartete Kodierungs-ID %d für ISO-8859-Zeichensatz" msgid "unexpected encoding ID %d for WIN character sets" msgstr "unerwartete Kodierungs-ID %d für WIN-Zeichensatz" -#: utils/mb/mbutils.c:298 utils/mb/mbutils.c:901 +#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:900 #, c-format msgid "conversion between %s and %s is not supported" msgstr "Umwandlung zwischen %s und %s wird nicht unterstützt" -#: utils/mb/mbutils.c:386 -#, c-format -msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" -msgstr "Standardumwandlung von Kodierung »%s« nach »%s« existiert nicht" - -#: utils/mb/mbutils.c:403 utils/mb/mbutils.c:431 utils/mb/mbutils.c:816 -#: utils/mb/mbutils.c:843 +#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 +#: utils/mb/mbutils.c:842 #, c-format msgid "String of %d bytes is too long for encoding conversion." msgstr "Zeichenkette mit %d Bytes ist zu lang für Kodierungsumwandlung." -#: utils/mb/mbutils.c:569 +#: utils/mb/mbutils.c:568 #, c-format msgid "invalid source encoding name \"%s\"" msgstr "ungültiger Quellkodierungsname »%s«" -#: utils/mb/mbutils.c:574 +#: utils/mb/mbutils.c:573 #, c-format msgid "invalid destination encoding name \"%s\"" msgstr "ungültiger Zielkodierungsname »%s«" -#: utils/mb/mbutils.c:714 +#: utils/mb/mbutils.c:713 #, c-format msgid "invalid byte value for encoding \"%s\": 0x%02x" msgstr "ungültiger Byte-Wert für Kodierung »%s«: 0x%02x" -#: utils/mb/mbutils.c:878 +#: utils/mb/mbutils.c:877 #, c-format msgid "invalid Unicode code point" msgstr "ungültiger Unicode-Codepunkt" -#: utils/mb/mbutils.c:1204 +#: utils/mb/mbutils.c:1201 #, c-format msgid "bind_textdomain_codeset failed" msgstr "bind_textdomain_codeset fehlgeschlagen" -#: utils/mb/mbutils.c:1725 +#: utils/mb/mbutils.c:1718 #, c-format msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "ungültige Byte-Sequenz für Kodierung »%s«: %s" -#: utils/mb/mbutils.c:1758 +#: utils/mb/mbutils.c:1751 #, c-format msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "Zeichen mit Byte-Folge %s in Kodierung »%s« hat keine Entsprechung in Kodierung »%s«" @@ -27438,82 +28519,82 @@ msgstr "leerer Konfigurationsverzeichnisname: »%s«" msgid "could not open configuration directory \"%s\": %m" msgstr "konnte Konfigurationsverzeichnis »%s« nicht öffnen: %m" -#: utils/misc/guc.c:115 +#: utils/misc/guc.c:122 msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "Gültige Einheiten für diesen Parameter sind »B«, »kB«, »MB«, »GB« und »TB«." -#: utils/misc/guc.c:152 +#: utils/misc/guc.c:159 msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." msgstr "Gültige Einheiten für diesen Parameter sind »us«, »ms«, »s«, »min«, »h« und »d«." -#: utils/misc/guc.c:421 +#: utils/misc/guc.c:430 #, c-format msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" msgstr "unbekannter Konfigurationsparameter »%s« in Datei »%s« Zeile %d" -#: utils/misc/guc.c:461 utils/misc/guc.c:3406 utils/misc/guc.c:3646 -#: utils/misc/guc.c:3744 utils/misc/guc.c:3842 utils/misc/guc.c:3966 -#: utils/misc/guc.c:4069 +#: utils/misc/guc.c:470 utils/misc/guc.c:3504 utils/misc/guc.c:3748 +#: utils/misc/guc.c:3846 utils/misc/guc.c:3944 utils/misc/guc.c:4071 +#: utils/misc/guc.c:4212 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "Parameter »%s« kann nicht geändert werden, ohne den Server neu zu starten" -#: utils/misc/guc.c:497 +#: utils/misc/guc.c:506 #, c-format msgid "parameter \"%s\" removed from configuration file, reset to default" msgstr "Parameter »%s« wurde aus Konfigurationsdatei entfernt, wird auf Standardwert zurückgesetzt" -#: utils/misc/guc.c:562 +#: utils/misc/guc.c:571 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "Parameter »%s« auf »%s« gesetzt" -#: utils/misc/guc.c:604 +#: utils/misc/guc.c:613 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "Konfigurationsdatei »%s« enthält Fehler" -#: utils/misc/guc.c:609 +#: utils/misc/guc.c:618 #, c-format msgid "configuration file \"%s\" contains errors; unaffected changes were applied" msgstr "Konfigurationsdatei »%s« enthält Fehler; nicht betroffene Änderungen wurden durchgeführt" -#: utils/misc/guc.c:614 +#: utils/misc/guc.c:623 #, c-format msgid "configuration file \"%s\" contains errors; no changes were applied" msgstr "Konfigurationsdatei »%s« enthält Fehler; keine Änderungen wurden durchgeführt" -#: utils/misc/guc.c:1211 utils/misc/guc.c:1227 +#: utils/misc/guc.c:1139 utils/misc/guc.c:1155 #, c-format msgid "invalid configuration parameter name \"%s\"" msgstr "ungültiger Konfigurationsparametername »%s«" -#: utils/misc/guc.c:1213 +#: utils/misc/guc.c:1141 #, c-format msgid "Custom parameter names must be two or more simple identifiers separated by dots." msgstr "Selbstdefinierte Parameternamen müssen zwei oder mehr einfache Bezeichner getrennt durch Punkte sein." -#: utils/misc/guc.c:1229 +#: utils/misc/guc.c:1157 #, c-format msgid "\"%s\" is a reserved prefix." msgstr "»%s« ist ein reservierter Präfix." -#: utils/misc/guc.c:1243 +#: utils/misc/guc.c:1170 utils/misc/guc.c:1280 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "unbekannter Konfigurationsparameter »%s«" -#: utils/misc/guc.c:1765 +#: utils/misc/guc.c:1802 #, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: konnte nicht auf Verzeichnis »%s« zugreifen: %s\n" +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: konnte nicht auf Verzeichnis »%s« zugreifen: %m\n" -#: utils/misc/guc.c:1770 +#: utils/misc/guc.c:1806 #, c-format msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" msgstr "Führen Sie initdb oder pg_basebackup aus, um ein PostgreSQL-Datenverzeichnis zu initialisieren.\n" -#: utils/misc/guc.c:1794 +#: utils/misc/guc.c:1830 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -27523,12 +28604,12 @@ msgstr "" "Sie müssen die Kommandozeilenoption --config-file oder -D angegeben oder\n" "die Umgebungsvariable PGDATA setzen.\n" -#: utils/misc/guc.c:1817 +#: utils/misc/guc.c:1853 #, c-format -msgid "%s: could not access the server configuration file \"%s\": %s\n" -msgstr "%s: konnte nicht auf die Serverkonfigurationsdatei »%s« zugreifen: %s\n" +msgid "%s: could not access the server configuration file \"%s\": %m\n" +msgstr "%s: konnte nicht auf die Serverkonfigurationsdatei »%s« zugreifen: %m\n" -#: utils/misc/guc.c:1845 +#: utils/misc/guc.c:1881 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -27538,7 +28619,7 @@ msgstr "" "zu finden sind. Sie können dies mit »data_directory« in »%s«, mit der\n" "Kommandozeilenoption -D oder der Umgebungsvariable PGDATA angeben.\n" -#: utils/misc/guc.c:1897 +#: utils/misc/guc.c:1933 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -27548,7 +28629,7 @@ msgstr "" "Sie können dies mit »hba_file« in »%s«, mit der\n" "Kommandozeilenoption -D oder der Umgebungsvariable PGDATA angeben.\n" -#: utils/misc/guc.c:1928 +#: utils/misc/guc.c:1964 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -27558,121 +28639,131 @@ msgstr "" "Sie können dies mit »ident_file« in »%s«, mit der\n" "Kommandozeilenoption -D oder der Umgebungsvariable PGDATA angeben.\n" -#: utils/misc/guc.c:2894 +#: utils/misc/guc.c:2943 msgid "Value exceeds integer range." msgstr "Wert überschreitet Bereich für ganze Zahlen." -#: utils/misc/guc.c:3130 +#: utils/misc/guc.c:3185 #, c-format -msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d%s%s ist außerhalb des gültigen Bereichs für Parameter »%s« (%d ... %d)" +msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d%s%s .. %d%s%s)" +msgstr "%d%s%s ist außerhalb des gültigen Bereichs für Parameter »%s« (%d%s%s ... %d%s%s)" -#: utils/misc/guc.c:3166 +#: utils/misc/guc.c:3226 #, c-format -msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" -msgstr "%g%s%s ist außerhalb des gültigen Bereichs für Parameter »%s« (%g ... %g)" +msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g%s%s .. %g%s%s)" +msgstr "%g%s%s ist außerhalb des gültigen Bereichs für Parameter »%s« (%g%s%s ... %g%s%s)" -#: utils/misc/guc.c:3366 utils/misc/guc_funcs.c:54 +#: utils/misc/guc.c:3465 #, c-format -msgid "cannot set parameters during a parallel operation" -msgstr "während einer parallelen Operation können keine Parameter gesetzt werden" +msgid "parameter \"%s\" cannot be set during a parallel operation" +msgstr "Parameter »%s« kann nicht während einer parallelen Operation gesetzt werden" -#: utils/misc/guc.c:3383 utils/misc/guc.c:4530 +#: utils/misc/guc.c:3481 utils/misc/guc.c:4696 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "Parameter »%s« kann nicht geändert werden" -#: utils/misc/guc.c:3416 +#: utils/misc/guc.c:3514 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "Parameter »%s« kann jetzt nicht geändert werden" -#: utils/misc/guc.c:3443 utils/misc/guc.c:3501 utils/misc/guc.c:4506 -#: utils/misc/guc.c:6546 +#: utils/misc/guc.c:3541 utils/misc/guc.c:3603 utils/misc/guc.c:4671 +#: utils/misc/guc.c:6756 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "keine Berechtigung, um Parameter »%s« zu setzen" -#: utils/misc/guc.c:3481 +#: utils/misc/guc.c:3583 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "Parameter »%s« kann nach Start der Verbindung nicht geändert werden" -#: utils/misc/guc.c:3540 +#: utils/misc/guc.c:3642 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "Parameter »%s« kann nicht in einer Security-Definer-Funktion gesetzt werden" -#: utils/misc/guc.c:3561 +#: utils/misc/guc.c:3663 #, c-format msgid "parameter \"%s\" cannot be reset" msgstr "Parameter »%s« kann nicht zurückgesetzt werden" -#: utils/misc/guc.c:3568 +#: utils/misc/guc.c:3670 #, c-format msgid "parameter \"%s\" cannot be set locally in functions" msgstr "Parameter »%s« kann nicht lokal in Funktionen gesetzt werden" -#: utils/misc/guc.c:4212 utils/misc/guc.c:4259 utils/misc/guc.c:5266 +#: utils/misc/guc.c:4370 utils/misc/guc.c:4418 utils/misc/guc.c:5450 #, c-format msgid "permission denied to examine \"%s\"" msgstr "keine Berechtigung, um »%s« zu inspizieren" -#: utils/misc/guc.c:4213 utils/misc/guc.c:4260 utils/misc/guc.c:5267 +#: utils/misc/guc.c:4371 utils/misc/guc.c:4419 utils/misc/guc.c:5451 #, c-format msgid "Only roles with privileges of the \"%s\" role may examine this parameter." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können diesen Parameter inspizieren." -#: utils/misc/guc.c:4496 +#: utils/misc/guc.c:4629 +#, c-format +msgid "ALTER SYSTEM is not allowed in this environment" +msgstr "ALTER SYSTEM ist in dieser Umgebung nicht erlaubt" + +#: utils/misc/guc.c:4661 #, c-format msgid "permission denied to perform ALTER SYSTEM RESET ALL" msgstr "keine Berechtigung um ALTER SYSTEM RESET ALL auszuführen" -#: utils/misc/guc.c:4562 +#: utils/misc/guc.c:4740 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "Parameterwert für ALTER SYSTEM darf keine Newline enthalten" -#: utils/misc/guc.c:4608 +#: utils/misc/guc.c:4785 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "konnte Inhalt der Datei »%s« nicht parsen" -#: utils/misc/guc.c:4790 +#: utils/misc/guc.c:4967 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "Versuch, den Parameter »%s« zu redefinieren" -#: utils/misc/guc.c:5129 +#: utils/misc/guc.c:5306 #, c-format msgid "invalid configuration parameter name \"%s\", removing it" msgstr "ungültiger Konfigurationsparametername »%s«, wird entfernt" -#: utils/misc/guc.c:5131 +#: utils/misc/guc.c:5308 #, c-format msgid "\"%s\" is now a reserved prefix." msgstr "»%s« ist jetzt ein reservierter Präfix." -#: utils/misc/guc.c:6000 +#: utils/misc/guc.c:6179 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "beim Setzen von Parameter »%s« auf »%s«" -#: utils/misc/guc.c:6169 +#: utils/misc/guc.c:6348 #, c-format msgid "parameter \"%s\" could not be set" msgstr "Parameter »%s« kann nicht gesetzt werden" -#: utils/misc/guc.c:6259 +#: utils/misc/guc.c:6438 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "konnte Wert von Parameter »%s« nicht lesen" -#: utils/misc/guc.c:6678 +#: utils/misc/guc.c:6888 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "ungültiger Wert für Parameter »%s«: %g" +#: utils/misc/guc_funcs.c:54 +#, c-format +msgid "cannot set parameters during a parallel operation" +msgstr "während einer parallelen Operation können keine Parameter gesetzt werden" + #: utils/misc/guc_funcs.c:130 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" @@ -27688,59 +28779,59 @@ msgstr "SET %s darf nur ein Argument haben" msgid "SET requires parameter name" msgstr "SET benötigt Parameternamen" -#: utils/misc/guc_tables.c:662 +#: utils/misc/guc_tables.c:676 msgid "Ungrouped" msgstr "Ungruppiert" -#: utils/misc/guc_tables.c:664 +#: utils/misc/guc_tables.c:677 msgid "File Locations" msgstr "Dateipfade" -#: utils/misc/guc_tables.c:666 +#: utils/misc/guc_tables.c:678 msgid "Connections and Authentication / Connection Settings" msgstr "Verbindungen und Authentifizierung / Verbindungseinstellungen" -#: utils/misc/guc_tables.c:668 +#: utils/misc/guc_tables.c:679 msgid "Connections and Authentication / TCP Settings" msgstr "Verbindungen und Authentifizierung / TCP-Einstellungen" -#: utils/misc/guc_tables.c:670 +#: utils/misc/guc_tables.c:680 msgid "Connections and Authentication / Authentication" msgstr "Verbindungen und Authentifizierung / Authentifizierung" -#: utils/misc/guc_tables.c:672 +#: utils/misc/guc_tables.c:681 msgid "Connections and Authentication / SSL" msgstr "Verbindungen und Authentifizierung / SSL" -#: utils/misc/guc_tables.c:674 +#: utils/misc/guc_tables.c:682 msgid "Resource Usage / Memory" msgstr "Resourcenbenutzung / Speicher" -#: utils/misc/guc_tables.c:676 +#: utils/misc/guc_tables.c:683 msgid "Resource Usage / Disk" msgstr "Resourcenbenutzung / Festplatte" -#: utils/misc/guc_tables.c:678 +#: utils/misc/guc_tables.c:684 msgid "Resource Usage / Kernel Resources" msgstr "Resourcenbenutzung / Kernelresourcen" -#: utils/misc/guc_tables.c:680 +#: utils/misc/guc_tables.c:685 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Resourcenbenutzung / Kostenbasierte Vacuum-Verzögerung" -#: utils/misc/guc_tables.c:682 +#: utils/misc/guc_tables.c:686 msgid "Resource Usage / Background Writer" msgstr "Resourcenbenutzung / Background-Writer" -#: utils/misc/guc_tables.c:684 +#: utils/misc/guc_tables.c:687 msgid "Resource Usage / Asynchronous Behavior" msgstr "Resourcenbenutzung / Asynchrones Verhalten" -#: utils/misc/guc_tables.c:686 +#: utils/misc/guc_tables.c:688 msgid "Write-Ahead Log / Settings" msgstr "Write-Ahead-Log / Einstellungen" -#: utils/misc/guc_tables.c:688 +#: utils/misc/guc_tables.c:689 msgid "Write-Ahead Log / Checkpoints" msgstr "Write-Ahead-Log / Checkpoints" @@ -27748,458 +28839,474 @@ msgstr "Write-Ahead-Log / Checkpoints" msgid "Write-Ahead Log / Archiving" msgstr "Write-Ahead-Log / Archivierung" -#: utils/misc/guc_tables.c:692 +#: utils/misc/guc_tables.c:691 msgid "Write-Ahead Log / Recovery" msgstr "Write-Ahead-Log / Wiederherstellung" -#: utils/misc/guc_tables.c:694 +#: utils/misc/guc_tables.c:692 msgid "Write-Ahead Log / Archive Recovery" msgstr "Write-Ahead-Log / Archivwiederherstellung" -#: utils/misc/guc_tables.c:696 +#: utils/misc/guc_tables.c:693 msgid "Write-Ahead Log / Recovery Target" msgstr "Write-Ahead-Log / Wiederherstellungsziele" -#: utils/misc/guc_tables.c:698 +#: utils/misc/guc_tables.c:694 +msgid "Write-Ahead Log / Summarization" +msgstr "Write-Ahead-Log / Zusammenfassung (Summarization)" + +#: utils/misc/guc_tables.c:695 msgid "Replication / Sending Servers" msgstr "Replikation / sendende Server" -#: utils/misc/guc_tables.c:700 +#: utils/misc/guc_tables.c:696 msgid "Replication / Primary Server" msgstr "Replikation / Primärserver" -#: utils/misc/guc_tables.c:702 +#: utils/misc/guc_tables.c:697 msgid "Replication / Standby Servers" msgstr "Replikation / Standby-Server" -#: utils/misc/guc_tables.c:704 +#: utils/misc/guc_tables.c:698 msgid "Replication / Subscribers" msgstr "Replikation / Subskriptionsserver" -#: utils/misc/guc_tables.c:706 +#: utils/misc/guc_tables.c:699 msgid "Query Tuning / Planner Method Configuration" msgstr "Anfragetuning / Planermethoden" -#: utils/misc/guc_tables.c:708 +#: utils/misc/guc_tables.c:700 msgid "Query Tuning / Planner Cost Constants" msgstr "Anfragetuning / Planerkosten" -#: utils/misc/guc_tables.c:710 +#: utils/misc/guc_tables.c:701 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Anfragetuning / Genetischer Anfrageoptimierer" -#: utils/misc/guc_tables.c:712 +#: utils/misc/guc_tables.c:702 msgid "Query Tuning / Other Planner Options" msgstr "Anfragetuning / Andere Planeroptionen" -#: utils/misc/guc_tables.c:714 +#: utils/misc/guc_tables.c:703 msgid "Reporting and Logging / Where to Log" msgstr "Berichte und Logging / Wohin geloggt wird" -#: utils/misc/guc_tables.c:716 +#: utils/misc/guc_tables.c:704 msgid "Reporting and Logging / When to Log" msgstr "Berichte und Logging / Wann geloggt wird" -#: utils/misc/guc_tables.c:718 +#: utils/misc/guc_tables.c:705 msgid "Reporting and Logging / What to Log" msgstr "Berichte und Logging / Was geloggt wird" -#: utils/misc/guc_tables.c:720 +#: utils/misc/guc_tables.c:706 msgid "Reporting and Logging / Process Title" msgstr "Berichte und Logging / Prozesstitel" -#: utils/misc/guc_tables.c:722 +#: utils/misc/guc_tables.c:707 msgid "Statistics / Monitoring" msgstr "Statistiken / Überwachung" -#: utils/misc/guc_tables.c:724 +#: utils/misc/guc_tables.c:708 msgid "Statistics / Cumulative Query and Index Statistics" msgstr "Statistiken / Kumulierte Anfrage- und Indexstatistiken" -#: utils/misc/guc_tables.c:726 +#: utils/misc/guc_tables.c:709 msgid "Autovacuum" msgstr "Autovacuum" -#: utils/misc/guc_tables.c:728 +#: utils/misc/guc_tables.c:710 msgid "Client Connection Defaults / Statement Behavior" msgstr "Standardeinstellungen für Clientverbindungen / Anweisungsverhalten" -#: utils/misc/guc_tables.c:730 +#: utils/misc/guc_tables.c:711 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Standardeinstellungen für Clientverbindungen / Locale und Formatierung" -#: utils/misc/guc_tables.c:732 +#: utils/misc/guc_tables.c:712 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Standardeinstellungen für Clientverbindungen / Shared Library Preloading" -#: utils/misc/guc_tables.c:734 +#: utils/misc/guc_tables.c:713 msgid "Client Connection Defaults / Other Defaults" msgstr "Standardeinstellungen für Clientverbindungen / Andere" -#: utils/misc/guc_tables.c:736 +#: utils/misc/guc_tables.c:714 msgid "Lock Management" msgstr "Sperrenverwaltung" -#: utils/misc/guc_tables.c:738 +#: utils/misc/guc_tables.c:715 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Versions- und Plattformkompatibilität / Frühere PostgreSQL-Versionen" -#: utils/misc/guc_tables.c:740 +#: utils/misc/guc_tables.c:716 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Versions- und Plattformkompatibilität / Andere Plattformen und Clients" -#: utils/misc/guc_tables.c:742 +#: utils/misc/guc_tables.c:717 msgid "Error Handling" msgstr "Fehlerbehandlung" -#: utils/misc/guc_tables.c:744 +#: utils/misc/guc_tables.c:718 msgid "Preset Options" msgstr "Voreingestellte Optionen" -#: utils/misc/guc_tables.c:746 +#: utils/misc/guc_tables.c:719 msgid "Customized Options" msgstr "Angepasste Optionen" -#: utils/misc/guc_tables.c:748 +#: utils/misc/guc_tables.c:720 msgid "Developer Options" msgstr "Entwickleroptionen" -#: utils/misc/guc_tables.c:805 +#: utils/misc/guc_tables.c:775 msgid "Enables the planner's use of sequential-scan plans." msgstr "Ermöglicht sequenzielle Scans in Planer." -#: utils/misc/guc_tables.c:815 +#: utils/misc/guc_tables.c:785 msgid "Enables the planner's use of index-scan plans." msgstr "Ermöglicht Index-Scans im Planer." -#: utils/misc/guc_tables.c:825 +#: utils/misc/guc_tables.c:795 msgid "Enables the planner's use of index-only-scan plans." msgstr "Ermöglicht Index-Only-Scans im Planer." -#: utils/misc/guc_tables.c:835 +#: utils/misc/guc_tables.c:805 msgid "Enables the planner's use of bitmap-scan plans." msgstr "Ermöglicht Bitmap-Scans im Planer." -#: utils/misc/guc_tables.c:845 +#: utils/misc/guc_tables.c:815 msgid "Enables the planner's use of TID scan plans." msgstr "Ermöglicht TID-Scans im Planer." -#: utils/misc/guc_tables.c:855 +#: utils/misc/guc_tables.c:825 msgid "Enables the planner's use of explicit sort steps." msgstr "Ermöglicht Sortierschritte im Planer." -#: utils/misc/guc_tables.c:865 +#: utils/misc/guc_tables.c:835 msgid "Enables the planner's use of incremental sort steps." msgstr "Ermöglicht inkrementelle Sortierschritte im Planer." -#: utils/misc/guc_tables.c:875 +#: utils/misc/guc_tables.c:845 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Ermöglicht Hash-Aggregierung im Planer." -#: utils/misc/guc_tables.c:885 +#: utils/misc/guc_tables.c:855 msgid "Enables the planner's use of materialization." msgstr "Ermöglicht Materialisierung im Planer." -#: utils/misc/guc_tables.c:895 +#: utils/misc/guc_tables.c:865 msgid "Enables the planner's use of memoization." msgstr "Ermöglicht Memoization im Planer." -#: utils/misc/guc_tables.c:905 +#: utils/misc/guc_tables.c:875 msgid "Enables the planner's use of nested-loop join plans." msgstr "Ermöglicht Nested-Loop-Verbunde im Planer." -#: utils/misc/guc_tables.c:915 +#: utils/misc/guc_tables.c:885 msgid "Enables the planner's use of merge join plans." msgstr "Ermöglicht Merge-Verbunde im Planer." -#: utils/misc/guc_tables.c:925 +#: utils/misc/guc_tables.c:895 msgid "Enables the planner's use of hash join plans." msgstr "Ermöglicht Hash-Verbunde im Planer." -#: utils/misc/guc_tables.c:935 +#: utils/misc/guc_tables.c:905 msgid "Enables the planner's use of gather merge plans." msgstr "Ermöglicht Gather-Merge-Pläne im Planer." -#: utils/misc/guc_tables.c:945 +#: utils/misc/guc_tables.c:915 msgid "Enables partitionwise join." msgstr "Ermöglicht partitionsweise Verbunde." -#: utils/misc/guc_tables.c:955 +#: utils/misc/guc_tables.c:925 msgid "Enables partitionwise aggregation and grouping." msgstr "Ermöglicht partitionsweise Aggregierung und Gruppierung." -#: utils/misc/guc_tables.c:965 +#: utils/misc/guc_tables.c:935 msgid "Enables the planner's use of parallel append plans." msgstr "Ermöglicht parallele Append-Pläne im Planer." -#: utils/misc/guc_tables.c:975 +#: utils/misc/guc_tables.c:945 msgid "Enables the planner's use of parallel hash plans." msgstr "Ermöglicht parallele Hash-Pläne im Planer." -#: utils/misc/guc_tables.c:985 +#: utils/misc/guc_tables.c:955 msgid "Enables plan-time and execution-time partition pruning." msgstr "Ermöglicht Partition-Pruning zur Planzeit und zur Ausführungszeit." -#: utils/misc/guc_tables.c:986 +#: utils/misc/guc_tables.c:956 msgid "Allows the query planner and executor to compare partition bounds to conditions in the query to determine which partitions must be scanned." msgstr "Erlaubt es dem Planer und dem Executor, Partitionsbegrenzungen mit Bedingungen in der Anfrage zu vergleichen, um festzustellen, welche Partitionen gelesen werden müssen." -#: utils/misc/guc_tables.c:997 -msgid "Enables the planner's ability to produce plans which provide presorted input for ORDER BY / DISTINCT aggregate functions." -msgstr "" +#: utils/misc/guc_tables.c:967 +msgid "Enables the planner's ability to produce plans that provide presorted input for ORDER BY / DISTINCT aggregate functions." +msgstr "Schaltet die Fähigkeit des Planers ein, Pläne zu erzeugen, die vorsortierte Eingaben für ORDER-BY-/DISTINCT-Aggregatfunktionen bereitstellen." -#: utils/misc/guc_tables.c:1000 -msgid "Allows the query planner to build plans which provide presorted input for aggregate functions with an ORDER BY / DISTINCT clause. When disabled, implicit sorts are always performed during execution." -msgstr "" +#: utils/misc/guc_tables.c:970 +msgid "Allows the query planner to build plans that provide presorted input for aggregate functions with an ORDER BY / DISTINCT clause. When disabled, implicit sorts are always performed during execution." +msgstr "Erlaubt es dem Planer, Pläne zu bauen, die vorsortierte Eingaben für Aggregatfunktionen mit ORDER-BY-/DISTINCT-Klausel bereitstellen. Wenn ausgeschaltet, werden immer implizite Sortierschritte bei der Ausführung durchgeführt." -#: utils/misc/guc_tables.c:1012 +#: utils/misc/guc_tables.c:982 msgid "Enables the planner's use of async append plans." msgstr "Ermöglicht asynchrone Append-Pläne im Planer." -#: utils/misc/guc_tables.c:1022 +#: utils/misc/guc_tables.c:992 +msgid "Enables reordering of GROUP BY keys." +msgstr "Ermöglicht Umordnen von GROUP-BY-Schlüsseln." + +#: utils/misc/guc_tables.c:1002 msgid "Enables genetic query optimization." msgstr "Ermöglicht genetische Anfrageoptimierung." -#: utils/misc/guc_tables.c:1023 +#: utils/misc/guc_tables.c:1003 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Dieser Algorithmus versucht das Planen ohne erschöpfende Suche durchzuführen." -#: utils/misc/guc_tables.c:1034 +#: utils/misc/guc_tables.c:1017 msgid "Shows whether the current user is a superuser." msgstr "Zeigt, ob der aktuelle Benutzer ein Superuser ist." -#: utils/misc/guc_tables.c:1044 +#: utils/misc/guc_tables.c:1032 +msgid "Allows running the ALTER SYSTEM command." +msgstr "Erlaubt das Ausführen des Befehls ALTER SYSTEM." + +#: utils/misc/guc_tables.c:1033 +msgid "Can be set to off for environments where global configuration changes should be made using a different method." +msgstr "Kann auf aus gesetzt werden in Umgebungen, wo globale Konfigurationsänderungen mit einer anderen Methode gemacht werden sollten." + +#: utils/misc/guc_tables.c:1043 msgid "Enables advertising the server via Bonjour." msgstr "Ermöglicht die Bekanntgabe des Servers mit Bonjour." -#: utils/misc/guc_tables.c:1053 +#: utils/misc/guc_tables.c:1052 msgid "Collects transaction commit time." msgstr "Sammelt Commit-Timestamps von Transaktionen." -#: utils/misc/guc_tables.c:1062 +#: utils/misc/guc_tables.c:1061 msgid "Enables SSL connections." msgstr "Ermöglicht SSL-Verbindungen." -#: utils/misc/guc_tables.c:1071 -msgid "Controls whether ssl_passphrase_command is called during server reload." -msgstr "Kontrolliert, ob ssl_passphrase_command beim Neuladen des Servers aufgerufen wird." +#: utils/misc/guc_tables.c:1070 +msgid "Controls whether \"ssl_passphrase_command\" is called during server reload." +msgstr "Kontrolliert, ob »ssl_passphrase_command« beim Neuladen des Servers aufgerufen wird." -#: utils/misc/guc_tables.c:1080 +#: utils/misc/guc_tables.c:1079 msgid "Give priority to server ciphersuite order." msgstr "Der Ciphersuite-Reihenfolge des Servers Vorrang geben." -#: utils/misc/guc_tables.c:1089 +#: utils/misc/guc_tables.c:1088 msgid "Forces synchronization of updates to disk." msgstr "Erzwingt die Synchronisierung von Aktualisierungen auf Festplatte." -#: utils/misc/guc_tables.c:1090 -msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This insures that a database cluster will recover to a consistent state after an operating system or hardware crash." +#: utils/misc/guc_tables.c:1089 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "Der Server verwendet den Systemaufruf fsync() an mehreren Stellen, um sicherzustellen, dass Datenänderungen physikalisch auf die Festplatte geschrieben werden. Das stellt sicher, dass der Datenbankcluster nach einem Betriebssystemabsturz oder Hardwarefehler in einem korrekten Zustand wiederhergestellt werden kann." -#: utils/misc/guc_tables.c:1101 +#: utils/misc/guc_tables.c:1100 msgid "Continues processing after a checksum failure." msgstr "Setzt die Verarbeitung trotz Prüfsummenfehler fort." -#: utils/misc/guc_tables.c:1102 +#: utils/misc/guc_tables.c:1101 msgid "Detection of a checksum failure normally causes PostgreSQL to report an error, aborting the current transaction. Setting ignore_checksum_failure to true causes the system to ignore the failure (but still report a warning), and continue processing. This behavior could cause crashes or other serious problems. Only has an effect if checksums are enabled." msgstr "Wenn eine fehlerhafte Prüfsumme entdeckt wird, gibt PostgreSQL normalerweise ein Fehler aus und bricht die aktuelle Transaktion ab. Wenn »ignore_checksum_failure« an ist, dann wird der Fehler ignoriert (aber trotzdem eine Warnung ausgegeben) und die Verarbeitung geht weiter. Dieses Verhalten kann Abstürze und andere ernsthafte Probleme verursachen. Es hat keine Auswirkungen, wenn Prüfsummen nicht eingeschaltet sind." -#: utils/misc/guc_tables.c:1116 +#: utils/misc/guc_tables.c:1115 msgid "Continues processing past damaged page headers." msgstr "Setzt die Verarbeitung trotz kaputter Seitenköpfe fort." -#: utils/misc/guc_tables.c:1117 -msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting zero_damaged_pages to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." +#: utils/misc/guc_tables.c:1116 +msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting \"zero_damaged_pages\" to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." msgstr "Wenn ein kaputter Seitenkopf entdeckt wird, gibt PostgreSQL normalerweise einen Fehler aus und bricht die aktuelle Transaktion ab. Wenn »zero_damaged_pages« an ist, dann wird eine Warnung ausgegeben, die kaputte Seite mit Nullen gefüllt und die Verarbeitung geht weiter. Dieses Verhalten zerstört Daten, nämlich alle Zeilen in der kaputten Seite." -#: utils/misc/guc_tables.c:1130 +#: utils/misc/guc_tables.c:1129 msgid "Continues recovery after an invalid pages failure." msgstr "Setzt die Wiederherstellung trotz Fehler durch ungültige Seiten fort." -#: utils/misc/guc_tables.c:1131 -msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting ignore_invalid_pages to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." +#: utils/misc/guc_tables.c:1130 +msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting \"ignore_invalid_pages\" to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." msgstr "Wenn WAL-Einträge mit Verweisen auf ungültige Seiten bei der Wiederherstellung erkannt werden, verursacht das einen PANIC-Fehler, wodurch die Wiederherstellung abgebrochen wird. Wenn »ignore_invalid_pages« an ist, dann werden ungültige Seitenverweise in WAL-Einträgen ignoriert (aber trotzen eine Warnung ausgegeben) und die Wiederherstellung wird fortgesetzt. Dieses Verhalten kann Abstürze und Datenverlust verursachen, Datenverfälschung verbreiten oder verstecken sowie andere ernsthafte Probleme verursachen. Es hat nur Auswirkungen im Wiederherstellungs- oder Standby-Modus." -#: utils/misc/guc_tables.c:1149 +#: utils/misc/guc_tables.c:1148 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "Schreibt volle Seiten in den WAL, sobald sie nach einem Checkpoint geändert werden." -#: utils/misc/guc_tables.c:1150 +#: utils/misc/guc_tables.c:1149 msgid "A page write in process during an operating system crash might be only partially written to disk. During recovery, the row changes stored in WAL are not enough to recover. This option writes pages when first modified after a checkpoint to WAL so full recovery is possible." msgstr "Ein Seitenschreibvorgang während eines Betriebssystemabsturzes könnte eventuell nur teilweise geschrieben worden sein. Bei der Wiederherstellung sind die im WAL gespeicherten Zeilenänderungen nicht ausreichend. Diese Option schreibt Seiten, sobald sie nach einem Checkpoint geändert worden sind, damit eine volle Wiederherstellung möglich ist." -#: utils/misc/guc_tables.c:1163 +#: utils/misc/guc_tables.c:1162 msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." msgstr "Schreibt volle Seiten in den WAL, sobald sie nach einem Checkpoint geändert werden, auch für eine nicht kritische Änderung." -#: utils/misc/guc_tables.c:1173 +#: utils/misc/guc_tables.c:1172 msgid "Writes zeroes to new WAL files before first use." msgstr "Schreibt Nullen in neue WAL-Dateien vor der ersten Verwendung." -#: utils/misc/guc_tables.c:1183 +#: utils/misc/guc_tables.c:1182 msgid "Recycles WAL files by renaming them." msgstr "WAL-Dateien werden durch Umbenennen wiederverwendet." -#: utils/misc/guc_tables.c:1193 +#: utils/misc/guc_tables.c:1192 msgid "Logs each checkpoint." msgstr "Schreibt jeden Checkpoint in den Log." -#: utils/misc/guc_tables.c:1202 +#: utils/misc/guc_tables.c:1201 msgid "Logs each successful connection." msgstr "Schreibt jede erfolgreiche Verbindung in den Log." -#: utils/misc/guc_tables.c:1211 +#: utils/misc/guc_tables.c:1210 +msgid "Logs details of pre-authentication connection handshake." +msgstr "Schreibt Details über den Verbindungs-Handshake vor der Authentifizierung in den Log." + +#: utils/misc/guc_tables.c:1220 msgid "Logs end of a session, including duration." msgstr "Schreibt jedes Verbindungsende mit Sitzungszeit in den Log." -#: utils/misc/guc_tables.c:1220 +#: utils/misc/guc_tables.c:1229 msgid "Logs each replication command." msgstr "Schreibt jeden Replikationsbefehl in den Log." -#: utils/misc/guc_tables.c:1229 +#: utils/misc/guc_tables.c:1238 msgid "Shows whether the running server has assertion checks enabled." msgstr "Zeigt, ob der laufende Server Assertion-Prüfungen aktiviert hat." -#: utils/misc/guc_tables.c:1240 +#: utils/misc/guc_tables.c:1249 msgid "Terminate session on any error." msgstr "Sitzung bei jedem Fehler abbrechen." -#: utils/misc/guc_tables.c:1249 +#: utils/misc/guc_tables.c:1258 msgid "Reinitialize server after backend crash." msgstr "Server nach Absturz eines Serverprozesses reinitialisieren." -#: utils/misc/guc_tables.c:1258 +#: utils/misc/guc_tables.c:1267 msgid "Remove temporary files after backend crash." msgstr "Temporäre Dateien nach Absturz eines Serverprozesses löschen." -#: utils/misc/guc_tables.c:1268 +#: utils/misc/guc_tables.c:1277 msgid "Send SIGABRT not SIGQUIT to child processes after backend crash." -msgstr "" +msgstr "SIGABRT statt SIGQUIT an Kindprozesse noch Absturz eines Serverprozesses senden." -#: utils/misc/guc_tables.c:1278 +#: utils/misc/guc_tables.c:1287 msgid "Send SIGABRT not SIGKILL to stuck child processes." -msgstr "" +msgstr "SIGABRT statt SIGKILL an feststeckende Kindprozesse senden." -#: utils/misc/guc_tables.c:1289 +#: utils/misc/guc_tables.c:1298 msgid "Logs the duration of each completed SQL statement." msgstr "Loggt die Dauer jeder abgeschlossenen SQL-Anweisung." -#: utils/misc/guc_tables.c:1298 +#: utils/misc/guc_tables.c:1307 msgid "Logs each query's parse tree." msgstr "Scheibt den Parsebaum jeder Anfrage in den Log." -#: utils/misc/guc_tables.c:1307 +#: utils/misc/guc_tables.c:1316 msgid "Logs each query's rewritten parse tree." msgstr "Schreibt den umgeschriebenen Parsebaum jeder Anfrage in den Log." -#: utils/misc/guc_tables.c:1316 +#: utils/misc/guc_tables.c:1325 msgid "Logs each query's execution plan." msgstr "Schreibt den Ausführungsplan jeder Anfrage in den Log." -#: utils/misc/guc_tables.c:1325 +#: utils/misc/guc_tables.c:1334 msgid "Indents parse and plan tree displays." msgstr "Rückt die Anzeige von Parse- und Planbäumen ein." -#: utils/misc/guc_tables.c:1334 +#: utils/misc/guc_tables.c:1343 msgid "Writes parser performance statistics to the server log." msgstr "Schreibt Parser-Leistungsstatistiken in den Serverlog." -#: utils/misc/guc_tables.c:1343 +#: utils/misc/guc_tables.c:1352 msgid "Writes planner performance statistics to the server log." msgstr "Schreibt Planer-Leistungsstatistiken in den Serverlog." -#: utils/misc/guc_tables.c:1352 +#: utils/misc/guc_tables.c:1361 msgid "Writes executor performance statistics to the server log." msgstr "Schreibt Executor-Leistungsstatistiken in den Serverlog." -#: utils/misc/guc_tables.c:1361 +#: utils/misc/guc_tables.c:1370 msgid "Writes cumulative performance statistics to the server log." msgstr "Schreibt Gesamtleistungsstatistiken in den Serverlog." -#: utils/misc/guc_tables.c:1371 +#: utils/misc/guc_tables.c:1380 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "Loggt Statistiken über Systemressourcen (Speicher und CPU) während diverser B-Baum-Operationen." -#: utils/misc/guc_tables.c:1383 +#: utils/misc/guc_tables.c:1392 msgid "Collects information about executing commands." msgstr "Sammelt Informationen über ausgeführte Befehle." -#: utils/misc/guc_tables.c:1384 +#: utils/misc/guc_tables.c:1393 msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." msgstr "Schaltet die Sammlung von Informationen über den aktuell ausgeführten Befehl jeder Sitzung ein, einschließlich der Zeit, and dem die Befehlsausführung begann." -#: utils/misc/guc_tables.c:1394 +#: utils/misc/guc_tables.c:1403 msgid "Collects statistics on database activity." msgstr "Sammelt Statistiken über Datenbankaktivität." -#: utils/misc/guc_tables.c:1403 +#: utils/misc/guc_tables.c:1412 msgid "Collects timing statistics for database I/O activity." msgstr "Sammelt Zeitmessungsstatistiken über Datenbank-I/O-Aktivität." -#: utils/misc/guc_tables.c:1412 +#: utils/misc/guc_tables.c:1421 msgid "Collects timing statistics for WAL I/O activity." msgstr "Sammelt Zeitmessungsstatistiken über WAL-I/O-Aktivität." -#: utils/misc/guc_tables.c:1422 +#: utils/misc/guc_tables.c:1431 msgid "Updates the process title to show the active SQL command." msgstr "Der Prozesstitel wird aktualisiert, um den aktuellen SQL-Befehl anzuzeigen." -#: utils/misc/guc_tables.c:1423 +#: utils/misc/guc_tables.c:1432 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "Ermöglicht das Aktualisieren des Prozesstitels bei jedem von Server empfangenen neuen SQL-Befehl." -#: utils/misc/guc_tables.c:1432 +#: utils/misc/guc_tables.c:1441 msgid "Starts the autovacuum subprocess." msgstr "Startet den Autovacuum-Prozess." -#: utils/misc/guc_tables.c:1442 +#: utils/misc/guc_tables.c:1451 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Erzeugt Debug-Ausgabe für LISTEN und NOTIFY." -#: utils/misc/guc_tables.c:1454 +#: utils/misc/guc_tables.c:1463 msgid "Emits information about lock usage." msgstr "Gibt Informationen über Sperrenverwendung aus." -#: utils/misc/guc_tables.c:1464 +#: utils/misc/guc_tables.c:1473 msgid "Emits information about user lock usage." msgstr "Gibt Informationen über Benutzersperrenverwendung aus." -#: utils/misc/guc_tables.c:1474 +#: utils/misc/guc_tables.c:1483 msgid "Emits information about lightweight lock usage." msgstr "Gibt Informationen über die Verwendung von Lightweight Locks aus." -#: utils/misc/guc_tables.c:1484 +#: utils/misc/guc_tables.c:1493 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "Gibt Informationen über alle aktuellen Sperren aus, wenn eine Verklemmung auftritt." -#: utils/misc/guc_tables.c:1496 +#: utils/misc/guc_tables.c:1505 msgid "Logs long lock waits." msgstr "Schreibt Meldungen über langes Warten auf Sperren in den Log." -#: utils/misc/guc_tables.c:1505 +#: utils/misc/guc_tables.c:1514 msgid "Logs standby recovery conflict waits." msgstr "Schreibt Meldungen über Warten wegen Konflikten bei Wiederherstellung in den Log." -#: utils/misc/guc_tables.c:1514 +#: utils/misc/guc_tables.c:1523 msgid "Logs the host name in the connection logs." msgstr "Schreibt den Hostnamen jeder Verbindung in den Log." -#: utils/misc/guc_tables.c:1515 +#: utils/misc/guc_tables.c:1524 msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." msgstr "In der Standardeinstellung zeigen die Verbindungslogs nur die IP-Adresse der Clienthosts. Wenn Sie den Hostnamen auch anzeigen wollen, dann können Sie diese Option anschalten, aber je nachdem, wie Ihr DNS eingerichtet ist, kann das die Leistung nicht unerheblich beeinträchtigen." -#: utils/misc/guc_tables.c:1526 +#: utils/misc/guc_tables.c:1535 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Behandelt »ausdruck=NULL« als »ausdruck IS NULL«." -#: utils/misc/guc_tables.c:1527 +#: utils/misc/guc_tables.c:1536 msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." msgstr "Wenn an, dann werden Ausdrücke der Form ausdruck = NULL (oder NULL = ausdruck) wie ausdruck IS NULL behandelt, das heißt, sie ergeben wahr, wenn das Ergebnis von ausdruck der NULL-Wert ist, und ansonsten falsch. Das korrekte Verhalten von ausdruck = NULL ist immer den NULL-Wert (für unbekannt) zurückzugeben." -#: utils/misc/guc_tables.c:1539 -msgid "Enables per-database user names." -msgstr "Ermöglicht Datenbank-lokale Benutzernamen." - #: utils/misc/guc_tables.c:1548 msgid "Sets the default read-only status of new transactions." msgstr "Setzt den Standardwert für die Read-Only-Einstellung einer neuen Transaktion." @@ -28241,8 +29348,8 @@ msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS wird nicht mehr unterstützt; kann nur auf falsch gesetzt werden." #: utils/misc/guc_tables.c:1632 -msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." -msgstr "Startet einen Subprozess, um die Stderr-Ausgabe und/oder CSV-Logs in Logdateien auszugeben." +msgid "Start a subprocess to capture stderr, csvlog and/or jsonlog into log files." +msgstr "Startet einen Subprozess, um stderr, csvlog und/oder jsonlog in Logdateien auszugeben." #: utils/misc/guc_tables.c:1641 msgid "Truncate existing log files of same name during log rotation." @@ -28273,10 +29380,8 @@ msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-ins msgstr "Bestimmt, ob Groß-/Kleinschreibung bei Kerberos- und GSSAPI-Benutzernamen ignoriert werden soll." #: utils/misc/guc_tables.c:1727 -#, fuzzy -#| msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgid "Sets whether GSSAPI delegation should be accepted from the client." -msgstr "Bestimmt, ob Groß-/Kleinschreibung bei Kerberos- und GSSAPI-Benutzernamen ignoriert werden soll." +msgstr "Bestimmt, ob GSSAPI-Delegation vom Client akzeptiert werden soll." #: utils/misc/guc_tables.c:1737 msgid "Warn about backslash escapes in ordinary string literals." @@ -28295,1380 +29400,1450 @@ msgid "Sets whether to include or exclude transaction with recovery target." msgstr "Setzt ob die Transaktion mit dem Wiederherstellungsziel einbezogen oder ausgeschlossen wird." #: utils/misc/guc_tables.c:1778 +msgid "Starts the WAL summarizer process to enable incremental backup." +msgstr "Startet den WAL-Summarizer-Prozess, um inkrementelle Backups zu ermöglichen." + +#: utils/misc/guc_tables.c:1788 msgid "Allows connections and queries during recovery." msgstr "Erlaubt Verbindungen und Anfragen während der Wiederherstellung." -#: utils/misc/guc_tables.c:1788 +#: utils/misc/guc_tables.c:1798 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "Erlaubt Rückmeldungen von einem Hot Standby an den Primärserver, um Anfragekonflikte zu vermeiden." -#: utils/misc/guc_tables.c:1798 +#: utils/misc/guc_tables.c:1808 msgid "Shows whether hot standby is currently active." msgstr "Zeigt, ob Hot Standby aktuell aktiv ist." -#: utils/misc/guc_tables.c:1809 +#: utils/misc/guc_tables.c:1819 msgid "Allows modifications of the structure of system tables." msgstr "Erlaubt Änderungen an der Struktur von Systemtabellen." -#: utils/misc/guc_tables.c:1820 +#: utils/misc/guc_tables.c:1830 msgid "Disables reading from system indexes." msgstr "Schaltet das Lesen aus Systemindexen ab." -#: utils/misc/guc_tables.c:1821 +#: utils/misc/guc_tables.c:1831 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "Das Aktualisieren der Indexe wird nicht verhindert, also ist die Verwendung unbedenklich. Schlimmstenfalls wird alles langsamer." -#: utils/misc/guc_tables.c:1832 +#: utils/misc/guc_tables.c:1842 msgid "Allows tablespaces directly inside pg_tblspc, for testing." msgstr "Erlaubt Tablespaces direkt in pg_tblspc, zum Testen." -#: utils/misc/guc_tables.c:1843 +#: utils/misc/guc_tables.c:1853 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "Schaltet den rückwärtskompatiblen Modus für Privilegienprüfungen bei Large Objects ein." -#: utils/misc/guc_tables.c:1844 +#: utils/misc/guc_tables.c:1854 msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." msgstr "Überspringt Privilegienprüfungen beim Lesen oder Ändern von Large Objects, zur Kompatibilität mit PostgreSQL-Versionen vor 9.0." -#: utils/misc/guc_tables.c:1854 +#: utils/misc/guc_tables.c:1864 msgid "When generating SQL fragments, quote all identifiers." msgstr "Wenn SQL-Fragmente erzeugt werden, alle Bezeichner quoten." -#: utils/misc/guc_tables.c:1864 +#: utils/misc/guc_tables.c:1874 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Zeigt, ob Datenprüfsummen in diesem Cluster angeschaltet sind." -#: utils/misc/guc_tables.c:1875 +#: utils/misc/guc_tables.c:1885 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "Syslog-Nachrichten mit Sequenznummern versehen, um Unterdrückung doppelter Nachrichten zu unterbinden." -#: utils/misc/guc_tables.c:1885 +#: utils/misc/guc_tables.c:1895 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "An Syslog gesendete Nachrichten nach Zeilen und in maximal 1024 Bytes aufteilen." -#: utils/misc/guc_tables.c:1895 +#: utils/misc/guc_tables.c:1905 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Kontrolliert, ob Gather und Gather Merge auch Subpläne ausführen." -#: utils/misc/guc_tables.c:1896 +#: utils/misc/guc_tables.c:1906 msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "Sollen Gather-Knoten auch Subpläne ausführen oder nur Tupel sammeln?" -#: utils/misc/guc_tables.c:1906 +#: utils/misc/guc_tables.c:1916 msgid "Allow JIT compilation." msgstr "Erlaubt JIT-Kompilierung." -#: utils/misc/guc_tables.c:1917 +#: utils/misc/guc_tables.c:1927 msgid "Register JIT-compiled functions with debugger." msgstr "JIT-kompilierte Funktionen im Debugger registrieren." -#: utils/misc/guc_tables.c:1934 +#: utils/misc/guc_tables.c:1944 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "LLVM-Bitcode in Dateien schreiben, um Debuggen von JIT zu erleichtern." -#: utils/misc/guc_tables.c:1945 +#: utils/misc/guc_tables.c:1955 msgid "Allow JIT compilation of expressions." msgstr "Erlaubt JIT-Kompilierung von Ausdrücken." -#: utils/misc/guc_tables.c:1956 +#: utils/misc/guc_tables.c:1966 msgid "Register JIT-compiled functions with perf profiler." msgstr "JIT-kompilierte Funktionen im Profiler perf registrieren." -#: utils/misc/guc_tables.c:1973 +#: utils/misc/guc_tables.c:1983 msgid "Allow JIT compilation of tuple deforming." msgstr "Erlaubt JIT-Kompilierung von Tuple-Deforming." -#: utils/misc/guc_tables.c:1984 +#: utils/misc/guc_tables.c:1994 msgid "Whether to continue running after a failure to sync data files." msgstr "Ob nach fehlgeschlagenem Synchronisieren von Datendateien fortgesetzt werden soll." -#: utils/misc/guc_tables.c:1993 +#: utils/misc/guc_tables.c:2003 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "Bestimmt, ob der WAL-Receiver einen temporären Replikations-Slot erzeugen soll, wenn kein permanenter Slot konfiguriert ist." -#: utils/misc/guc_tables.c:2011 +#: utils/misc/guc_tables.c:2012 +msgid "Enables event triggers." +msgstr "Schaltet Ereignistrigger ein." + +#: utils/misc/guc_tables.c:2013 +msgid "When enabled, event triggers will fire for all applicable statements." +msgstr "Wenn eingeschaltet, werden Ereignistrigger für alle passenden Anweisungen ausgelöst." + +#: utils/misc/guc_tables.c:2022 +msgid "Enables a physical standby to synchronize logical failover replication slots from the primary server." +msgstr "Ermöglicht, dass ein physischer Standby logische Failover-Replikations-Slots vom Primärserver synchronisiert." + +#: utils/misc/guc_tables.c:2040 msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." msgstr "Setzt die Zeit, die gewartet wird, bevor ein Umschalten auf die nächste WAL-Datei erzwungen wird." -#: utils/misc/guc_tables.c:2022 +#: utils/misc/guc_tables.c:2051 msgid "Sets the amount of time to wait after authentication on connection startup." msgstr "Setzt die Zeit, die nach der Authentifizierung beim Verbindungsstart gewartet wird." -#: utils/misc/guc_tables.c:2024 utils/misc/guc_tables.c:2658 +#: utils/misc/guc_tables.c:2053 utils/misc/guc_tables.c:2780 msgid "This allows attaching a debugger to the process." msgstr "Das ermöglicht es, einen Debugger in den Prozess einzuhängen." -#: utils/misc/guc_tables.c:2033 +#: utils/misc/guc_tables.c:2062 msgid "Sets the default statistics target." msgstr "Setzt das voreingestellte Statistikziel." -#: utils/misc/guc_tables.c:2034 +#: utils/misc/guc_tables.c:2063 msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." msgstr "Diese Einstellung gilt für Tabellenspalten, für die kein spaltenspezifisches Ziel mit ALTER TABLE SET STATISTICS gesetzt worden ist." -#: utils/misc/guc_tables.c:2043 +#: utils/misc/guc_tables.c:2072 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "Setzt die Größe der FROM-Liste, ab der Unteranfragen nicht kollabiert werden." -#: utils/misc/guc_tables.c:2045 +#: utils/misc/guc_tables.c:2074 msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." msgstr "Der Planer bindet Unteranfragen in die übergeordneten Anfragen ein, wenn die daraus resultierende FROM-Liste nicht mehr als so viele Elemente haben würde." -#: utils/misc/guc_tables.c:2056 +#: utils/misc/guc_tables.c:2085 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "Setzt die Größe der FROM-Liste, ab der JOIN-Konstrukte nicht aufgelöst werden." -#: utils/misc/guc_tables.c:2058 +#: utils/misc/guc_tables.c:2087 msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." msgstr "Der Planer löst ausdrückliche JOIN-Konstrukte in FROM-Listen auf, wenn die daraus resultierende FROM-Liste nicht mehr als so viele Elemente haben würde." -#: utils/misc/guc_tables.c:2069 +#: utils/misc/guc_tables.c:2098 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "Setzt die Anzahl der Elemente in der FROM-Liste, ab der GEQO verwendet wird." -#: utils/misc/guc_tables.c:2079 +#: utils/misc/guc_tables.c:2108 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: wird für die Berechnung der Vorgabewerte anderer GEQO-Parameter verwendet." -#: utils/misc/guc_tables.c:2089 +#: utils/misc/guc_tables.c:2118 msgid "GEQO: number of individuals in the population." msgstr "GEQO: Anzahl der Individien in der Bevölkerung." -#: utils/misc/guc_tables.c:2090 utils/misc/guc_tables.c:2100 +#: utils/misc/guc_tables.c:2119 utils/misc/guc_tables.c:2129 msgid "Zero selects a suitable default value." msgstr "Null wählt einen passenden Vorgabewert." -#: utils/misc/guc_tables.c:2099 +#: utils/misc/guc_tables.c:2128 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: Anzahl der Iterationen im Algorithmus." -#: utils/misc/guc_tables.c:2111 +#: utils/misc/guc_tables.c:2140 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Setzt die Zeit, die gewartet wird, bis auf Verklemmung geprüft wird." -#: utils/misc/guc_tables.c:2122 +#: utils/misc/guc_tables.c:2151 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "Setzt die maximale Verzögerung bevor Anfragen storniert werden, wenn ein Hot-Standby-Server archivierte WAL-Daten verarbeitet." -#: utils/misc/guc_tables.c:2133 +#: utils/misc/guc_tables.c:2162 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "Setzt die maximale Verzögerung bevor Anfragen storniert werden, wenn ein Hot-Standby-Server gestreamte WAL-Daten verarbeitet." -#: utils/misc/guc_tables.c:2144 +#: utils/misc/guc_tables.c:2173 msgid "Sets the minimum delay for applying changes during recovery." msgstr "Setzt die minimale Verzögerung für das Einspielen von Änderungen während der Wiederherstellung." -#: utils/misc/guc_tables.c:2155 +#: utils/misc/guc_tables.c:2184 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "Setzt das maximale Intervall zwischen Statusberichten des WAL-Receivers an den sendenden Server." -#: utils/misc/guc_tables.c:2166 +#: utils/misc/guc_tables.c:2195 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "Setzt die maximale Zeit, um auf den Empfang von Daten vom sendenden Server zu warten." -#: utils/misc/guc_tables.c:2177 +#: utils/misc/guc_tables.c:2206 msgid "Sets the maximum number of concurrent connections." msgstr "Setzt die maximale Anzahl gleichzeitiger Verbindungen." -#: utils/misc/guc_tables.c:2188 +#: utils/misc/guc_tables.c:2217 msgid "Sets the number of connection slots reserved for superusers." msgstr "Setzt die Anzahl der für Superuser reservierten Verbindungen." -#: utils/misc/guc_tables.c:2198 +#: utils/misc/guc_tables.c:2227 msgid "Sets the number of connection slots reserved for roles with privileges of pg_use_reserved_connections." msgstr "Setzt die Anzahl der Verbindungen, die für Rollen mit den Privilegien der Rolle pg_use_reserved_connections reserviert sind." -#: utils/misc/guc_tables.c:2209 +#: utils/misc/guc_tables.c:2238 msgid "Amount of dynamic shared memory reserved at startup." msgstr "Menge des beim Start reservierten dynamischen Shared Memory." -#: utils/misc/guc_tables.c:2224 +#: utils/misc/guc_tables.c:2253 msgid "Sets the number of shared memory buffers used by the server." msgstr "Setzt die Anzahl der vom Server verwendeten Shared-Memory-Puffer." -#: utils/misc/guc_tables.c:2235 +#: utils/misc/guc_tables.c:2264 msgid "Sets the buffer pool size for VACUUM, ANALYZE, and autovacuum." msgstr "Setzt die Buffer-Pool-Größe für VACUUM, ANALYZE und Autovacuum." -#: utils/misc/guc_tables.c:2246 +#: utils/misc/guc_tables.c:2275 msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." msgstr "Zeigt die Größe des primären Shared-Memory-Bereichs des Servers (aufgerundet zum nächsten MB)." -#: utils/misc/guc_tables.c:2257 +#: utils/misc/guc_tables.c:2286 msgid "Shows the number of huge pages needed for the main shared memory area." msgstr "Zeigt die Anzahl der Huge Pages, die für den primären Shared-Memory-Bereich benötigt werden." -#: utils/misc/guc_tables.c:2258 +#: utils/misc/guc_tables.c:2287 msgid "-1 indicates that the value could not be determined." msgstr "-1 zeigt an, dass der Wert nicht ermittelt werden konnte." -#: utils/misc/guc_tables.c:2268 +#: utils/misc/guc_tables.c:2297 +msgid "Sets the size of the dedicated buffer pool used for the commit timestamp cache." +msgstr "Setzt die Größe des für den Commit-Timestamp-Cache bestimmten Buffer-Pools." + +#: utils/misc/guc_tables.c:2298 utils/misc/guc_tables.c:2353 +#: utils/misc/guc_tables.c:2364 +msgid "Specify 0 to have this value determined as a fraction of shared_buffers." +msgstr "Geben Sie 0 an, um diesen Wert als einen Bruchteil von shared_buffers zu ermitteln." + +#: utils/misc/guc_tables.c:2308 +msgid "Sets the size of the dedicated buffer pool used for the MultiXact member cache." +msgstr "Setzt die Größe des für den MultiXact-Member-Cache bestimmten Buffer-Pools." + +#: utils/misc/guc_tables.c:2319 +msgid "Sets the size of the dedicated buffer pool used for the MultiXact offset cache." +msgstr "Setzt die Größe des für den MultiXact-Offset-Cache bestimmten Buffer-Pools." + +#: utils/misc/guc_tables.c:2330 +msgid "Sets the size of the dedicated buffer pool used for the LISTEN/NOTIFY message cache." +msgstr "Setzt die Größe des für den LISTEN/NOTIFY-Message-Cache bestimmten Buffer-Pools." + +#: utils/misc/guc_tables.c:2341 +msgid "Sets the size of the dedicated buffer pool used for the serializable transaction cache." +msgstr "Setzt die Größe des für den Cache für serialisierbare Transaktionen bestimmten Buffer-Pools." + +#: utils/misc/guc_tables.c:2352 +msgid "Sets the size of the dedicated buffer pool used for the subtransaction cache." +msgstr "Setzt die Größe des für den Subtransaktions-Cache bestimmten Buffer-Pools." + +#: utils/misc/guc_tables.c:2363 +msgid "Sets the size of the dedicated buffer pool used for the transaction status cache." +msgstr "Setzt die Größe des für den Transaktionsstatus-Cache bestimmten Buffer-Pools." + +#: utils/misc/guc_tables.c:2374 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Setzt die maximale Anzahl der von jeder Sitzung verwendeten temporären Puffer." -#: utils/misc/guc_tables.c:2279 +#: utils/misc/guc_tables.c:2385 msgid "Sets the TCP port the server listens on." msgstr "Setzt den TCP-Port, auf dem der Server auf Verbindungen wartet." -#: utils/misc/guc_tables.c:2289 +#: utils/misc/guc_tables.c:2395 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Setzt die Zugriffsrechte für die Unix-Domain-Socket." -#: utils/misc/guc_tables.c:2290 +#: utils/misc/guc_tables.c:2396 msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Unix-Domain-Sockets verwenden die üblichen Zugriffsrechte für Unix-Dateisysteme. Der Wert dieser Option muss ein numerischer Wert in der von den Systemaufrufen chmod und umask verwendeten Form sein. (Um das gebräuchliche Oktalformat zu verwenden, muss die Zahl mit 0 (einer Null) anfangen.)" -#: utils/misc/guc_tables.c:2304 +#: utils/misc/guc_tables.c:2410 msgid "Sets the file permissions for log files." msgstr "Setzt die Dateizugriffsrechte für Logdateien." -#: utils/misc/guc_tables.c:2305 +#: utils/misc/guc_tables.c:2411 msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Der Wert dieser Option muss ein numerischer Wert in der von den Systemaufrufen chmod und umask verwendeten Form sein. (Um das gebräuchliche Oktalformat zu verwenden, muss die Zahl mit 0 (einer Null) anfangen.)" -#: utils/misc/guc_tables.c:2319 +#: utils/misc/guc_tables.c:2425 msgid "Shows the mode of the data directory." msgstr "Zeigt die Zugriffsrechte des Datenverzeichnisses." -#: utils/misc/guc_tables.c:2320 +#: utils/misc/guc_tables.c:2426 msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Der Wert dieser Option muss ein numerischer Wert in der von den Systemaufrufen chmod und umask verwendeten Form sein. (Um das gebräuchliche Oktalformat zu verwenden, muss die Zahl mit 0 (einer Null) anfangen.)" -#: utils/misc/guc_tables.c:2333 +#: utils/misc/guc_tables.c:2439 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Setzt die maximale Speichergröße für Anfrage-Arbeitsbereiche." -#: utils/misc/guc_tables.c:2334 +#: utils/misc/guc_tables.c:2440 msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." msgstr "Gibt die Speichermenge an, die für interne Sortiervorgänge und Hashtabellen verwendet werden kann, bevor auf temporäre Dateien umgeschaltet wird." -#: utils/misc/guc_tables.c:2346 +#: utils/misc/guc_tables.c:2457 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Setzt die maximale Speichergröße für Wartungsoperationen." -#: utils/misc/guc_tables.c:2347 +#: utils/misc/guc_tables.c:2458 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Das schließt Operationen wie VACUUM und CREATE INDEX ein." -#: utils/misc/guc_tables.c:2357 +#: utils/misc/guc_tables.c:2468 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Setzt die maximale Speichergröße für logische Dekodierung." -#: utils/misc/guc_tables.c:2358 +#: utils/misc/guc_tables.c:2469 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." msgstr "Gibt die Speichermenge an, die für jeden internen Reorder-Puffer verwendet werden kann, bevor auf Festplatte ausgelagert wird." -#: utils/misc/guc_tables.c:2374 +#: utils/misc/guc_tables.c:2485 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Setzt die maximale Stackgröße, in Kilobytes." -#: utils/misc/guc_tables.c:2385 +#: utils/misc/guc_tables.c:2496 msgid "Limits the total size of all temporary files used by each process." msgstr "Beschränkt die Gesamtgröße aller temporären Dateien, die von einem Prozess verwendet werden." -#: utils/misc/guc_tables.c:2386 +#: utils/misc/guc_tables.c:2497 msgid "-1 means no limit." msgstr "-1 bedeutet keine Grenze." -#: utils/misc/guc_tables.c:2396 +#: utils/misc/guc_tables.c:2507 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Vacuum-Kosten für eine im Puffer-Cache gefundene Seite." -#: utils/misc/guc_tables.c:2406 +#: utils/misc/guc_tables.c:2517 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Vacuum-Kosten für eine nicht im Puffer-Cache gefundene Seite." -#: utils/misc/guc_tables.c:2416 +#: utils/misc/guc_tables.c:2527 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Vacuum-Kosten für eine durch Vacuum schmutzig gemachte Seite." -#: utils/misc/guc_tables.c:2426 +#: utils/misc/guc_tables.c:2537 msgid "Vacuum cost amount available before napping." msgstr "Verfügbare Vacuum-Kosten vor Nickerchen." -#: utils/misc/guc_tables.c:2436 +#: utils/misc/guc_tables.c:2547 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Verfügbare Vacuum-Kosten vor Nickerchen, für Autovacuum." -#: utils/misc/guc_tables.c:2446 +#: utils/misc/guc_tables.c:2557 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "Setzt die maximale Zahl gleichzeitig geöffneter Dateien für jeden Serverprozess." -#: utils/misc/guc_tables.c:2459 +#: utils/misc/guc_tables.c:2570 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Setzt die maximale Anzahl von gleichzeitig vorbereiteten Transaktionen." -#: utils/misc/guc_tables.c:2470 +#: utils/misc/guc_tables.c:2581 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Setzt die minimale Tabellen-OID für das Verfolgen von Sperren." -#: utils/misc/guc_tables.c:2471 +#: utils/misc/guc_tables.c:2582 msgid "Is used to avoid output on system tables." msgstr "Wird verwendet, um Ausgabe für Systemtabellen zu vermeiden." -#: utils/misc/guc_tables.c:2480 +#: utils/misc/guc_tables.c:2591 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Setzt die OID der Tabelle mit bedingungsloser Sperrenverfolgung." -#: utils/misc/guc_tables.c:2492 +#: utils/misc/guc_tables.c:2603 msgid "Sets the maximum allowed duration of any statement." msgstr "Setzt die maximal erlaubte Dauer jeder Anweisung." -#: utils/misc/guc_tables.c:2493 utils/misc/guc_tables.c:2504 -#: utils/misc/guc_tables.c:2515 utils/misc/guc_tables.c:2526 +#: utils/misc/guc_tables.c:2604 utils/misc/guc_tables.c:2615 +#: utils/misc/guc_tables.c:2626 utils/misc/guc_tables.c:2637 +#: utils/misc/guc_tables.c:2648 msgid "A value of 0 turns off the timeout." msgstr "Der Wert 0 schaltet die Zeitprüfung aus." -#: utils/misc/guc_tables.c:2503 +#: utils/misc/guc_tables.c:2614 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Setzt die maximal erlaubte Dauer, um auf eine Sperre zu warten." -#: utils/misc/guc_tables.c:2514 +#: utils/misc/guc_tables.c:2625 msgid "Sets the maximum allowed idle time between queries, when in a transaction." msgstr "Setzt die maximal erlaubte inaktive Zeit zwischen Anfragen, wenn in einer Transaktion." -#: utils/misc/guc_tables.c:2525 +#: utils/misc/guc_tables.c:2636 +msgid "Sets the maximum allowed duration of any transaction within a session (not a prepared transaction)." +msgstr "Setzt die maximal erlaubte Dauer jeder Transaktion innerhalb einer Sitzung (keine vorbereitete Transaktion)." + +#: utils/misc/guc_tables.c:2647 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." msgstr "Setzt die maximal erlaubte inaktive Zeit zwischen Anfragen, wenn nicht in einer Transaktion." -#: utils/misc/guc_tables.c:2536 +#: utils/misc/guc_tables.c:2658 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "Mindestalter, bei dem VACUUM eine Tabellenzeile einfrieren soll." -#: utils/misc/guc_tables.c:2546 +#: utils/misc/guc_tables.c:2668 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "Alter, bei dem VACUUM die ganze Tabelle durchsuchen soll, um Zeilen einzufrieren." -#: utils/misc/guc_tables.c:2556 +#: utils/misc/guc_tables.c:2678 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "Mindestalter, bei dem VACUUM eine MultiXactId in einer Tabellenzeile einfrieren soll." -#: utils/misc/guc_tables.c:2566 +#: utils/misc/guc_tables.c:2688 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "Multixact-Alter, bei dem VACUUM die ganze Tabelle durchsuchen soll, um Zeilen einzufrieren." -#: utils/misc/guc_tables.c:2576 +#: utils/misc/guc_tables.c:2698 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "Alter, bei dem VACUUM die Ausfallsicherung auslösen soll, um Ausfall wegen Transaktionsnummernüberlauf zu verhindern." -#: utils/misc/guc_tables.c:2585 +#: utils/misc/guc_tables.c:2707 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "Multixact-Alter, bei dem VACUUM die Ausfallsicherung auslösen soll, um Ausfall wegen Transaktionsnummernüberlauf zu verhindern." -#: utils/misc/guc_tables.c:2598 +#: utils/misc/guc_tables.c:2720 msgid "Sets the maximum number of locks per transaction." msgstr "Setzt die maximale Anzahl Sperren pro Transaktion." -#: utils/misc/guc_tables.c:2599 -msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction objects per server process or prepared transaction will need to be locked at any one time." -msgstr "Die globale Sperrentabelle wird mit der Annahme angelegt, das höchstens max_locks_per_transaction Objekte pro Serverprozess oder vorbereitete Transaktion gleichzeitig gesperrt werden müssen." +#: utils/misc/guc_tables.c:2721 +msgid "The shared lock table is sized on the assumption that at most \"max_locks_per_transaction\" objects per server process or prepared transaction will need to be locked at any one time." +msgstr "Die globale Sperrentabelle wird mit der Annahme angelegt, das höchstens »max_locks_per_transaction« Objekte pro Serverprozess oder vorbereitete Transaktion gleichzeitig gesperrt werden müssen." -#: utils/misc/guc_tables.c:2610 +#: utils/misc/guc_tables.c:2732 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Setzt die maximale Anzahl Prädikatsperren pro Transaktion." -#: utils/misc/guc_tables.c:2611 -msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction objects per server process or prepared transaction will need to be locked at any one time." -msgstr "Die globale Prädikatsperrentabelle wird mit der Annahme angelegt, das höchstens max_pred_locks_per_transaction Objekte pro Serverprozess oder vorbereitete Transaktion gleichzeitig gesperrt werden müssen." +#: utils/misc/guc_tables.c:2733 +msgid "The shared predicate lock table is sized on the assumption that at most \"max_pred_locks_per_transaction\" objects per server process or prepared transaction will need to be locked at any one time." +msgstr "Die globale Prädikatsperrentabelle wird mit der Annahme angelegt, das höchstens »max_pred_locks_per_transaction« Objekte pro Serverprozess oder vorbereitete Transaktion gleichzeitig gesperrt werden müssen." -#: utils/misc/guc_tables.c:2622 +#: utils/misc/guc_tables.c:2744 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "Setzt die maximale Anzahl Prädikatsperren für Seiten und Tupel pro Relation." -#: utils/misc/guc_tables.c:2623 +#: utils/misc/guc_tables.c:2745 msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." msgstr "Wenn mehr als diese Gesamtzahl Seiten und Tupel in der selben Relation von einer Verbindung gesperrt sind, werden diese Sperren durch eine Sperre auf Relationsebene ersetzt." -#: utils/misc/guc_tables.c:2633 +#: utils/misc/guc_tables.c:2755 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "Setzt die maximale Anzahl Prädikatsperren für Tupel pro Seite." -#: utils/misc/guc_tables.c:2634 +#: utils/misc/guc_tables.c:2756 msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." msgstr "Wenn mehr als diese Anzahl Tupel auf der selben Seite von einer Verbindung gesperrt sind, werden diese Sperren durch eine Sperre auf Seitenebene ersetzt." -#: utils/misc/guc_tables.c:2644 +#: utils/misc/guc_tables.c:2766 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Setzt die maximale Zeit, um die Client-Authentifizierung zu beenden." -#: utils/misc/guc_tables.c:2656 +#: utils/misc/guc_tables.c:2778 msgid "Sets the amount of time to wait before authentication on connection startup." msgstr "Setzt die Zeit, die vor der Authentifizierung beim Verbindungsstart gewartet wird." -#: utils/misc/guc_tables.c:2668 +#: utils/misc/guc_tables.c:2790 +msgid "Sets the maximum number of allocated pages for NOTIFY / LISTEN queue." +msgstr "Setzt die maximale Anzahl bereitgestellte Seiten für die NOTIFY/LISTEN-Warteschlange." + +#: utils/misc/guc_tables.c:2800 msgid "Buffer size for reading ahead in the WAL during recovery." msgstr "Puffergröße für WAL-Read-Ahead während der Wiederherstellung." -#: utils/misc/guc_tables.c:2669 +#: utils/misc/guc_tables.c:2801 msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." msgstr "Maximale Entfernung, die im WAL vorausgelesen wird, um Datenblöcke, auf die verwiesen wird, vorab einzulesen." -#: utils/misc/guc_tables.c:2679 +#: utils/misc/guc_tables.c:2811 msgid "Sets the size of WAL files held for standby servers." msgstr "Setzt die Größe der für Standby-Server vorgehaltenen WAL-Dateien." -#: utils/misc/guc_tables.c:2690 +#: utils/misc/guc_tables.c:2822 msgid "Sets the minimum size to shrink the WAL to." msgstr "Setzt die minimale Größe, auf die der WAL geschrumpft wird." -#: utils/misc/guc_tables.c:2702 +#: utils/misc/guc_tables.c:2834 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Setzt die WAL-Größe, die einen Checkpoint auslöst." -#: utils/misc/guc_tables.c:2714 +#: utils/misc/guc_tables.c:2846 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "Setzt die maximale Zeit zwischen automatischen WAL-Checkpoints." -#: utils/misc/guc_tables.c:2725 +#: utils/misc/guc_tables.c:2857 msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." msgstr "Setzt die maximale Zeit, bevor gewarnt wird, wenn durch WAL-Volumen ausgelöste Checkpoints zu häufig passieren." -#: utils/misc/guc_tables.c:2727 +#: utils/misc/guc_tables.c:2859 msgid "Write a message to the server log if checkpoints caused by the filling of WAL segment files happen more frequently than this amount of time. Zero turns off the warning." msgstr "Schreibe Meldung in den Serverlog, wenn Checkpoints, die durch Füllen der WAL-Segmentdateien ausgelöst werden, häufiger als dieser Zeitraum passieren. Null schaltet die Warnung ab." -#: utils/misc/guc_tables.c:2740 utils/misc/guc_tables.c:2958 -#: utils/misc/guc_tables.c:2998 +#: utils/misc/guc_tables.c:2872 utils/misc/guc_tables.c:3090 +#: utils/misc/guc_tables.c:3144 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "Anzahl der Seiten, nach denen getätigte Schreibvorgänge auf die Festplatte zurückgeschrieben werden." -#: utils/misc/guc_tables.c:2751 +#: utils/misc/guc_tables.c:2883 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Setzt die Anzahl Diskseitenpuffer für WAL im Shared Memory." -#: utils/misc/guc_tables.c:2762 +#: utils/misc/guc_tables.c:2884 +msgid "Specify -1 to have this value determined as a fraction of shared_buffers." +msgstr "Geben Sie -1 an, um diesen Wert als einen Bruchteil von shared_buffers zu ermitteln." + +#: utils/misc/guc_tables.c:2894 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Zeit zwischen WAL-Flush-Operationen im WAL-Writer." -#: utils/misc/guc_tables.c:2773 +#: utils/misc/guc_tables.c:2905 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "Ein Flush wird ausgelöst, wenn diese Menge WAL vom WAL-Writer geschrieben worden ist." -#: utils/misc/guc_tables.c:2784 +#: utils/misc/guc_tables.c:2916 msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "Mindestgröße ab der neue Datei gefsynct wird statt WAL zu schreiben." -#: utils/misc/guc_tables.c:2795 +#: utils/misc/guc_tables.c:2927 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "Setzt die maximale Anzahl gleichzeitig laufender WAL-Sender-Prozesse." -#: utils/misc/guc_tables.c:2806 +#: utils/misc/guc_tables.c:2938 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Setzt die maximale Anzahl von gleichzeitig definierten Replikations-Slots." -#: utils/misc/guc_tables.c:2816 +#: utils/misc/guc_tables.c:2948 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "Setzt die maximale WAL-Größe, die von Replikations-Slots reserviert werden kann." -#: utils/misc/guc_tables.c:2817 +#: utils/misc/guc_tables.c:2949 msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." msgstr "Replikations-Slots werden als fehlgeschlagen markiert, und Segmente zum Löschen oder Wiederverwenden freigegeben, wenn so viel Platz von WAL auf der Festplatte belegt wird." -#: utils/misc/guc_tables.c:2829 +#: utils/misc/guc_tables.c:2961 msgid "Sets the maximum time to wait for WAL replication." msgstr "Setzt die maximale Zeit, um auf WAL-Replikation zu warten." -#: utils/misc/guc_tables.c:2840 +#: utils/misc/guc_tables.c:2972 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "Setzt die Verzögerung in Millisekunden zwischen Transaktionsabschluss und dem Schreiben von WAL auf die Festplatte." -#: utils/misc/guc_tables.c:2852 -msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." +#: utils/misc/guc_tables.c:2984 +msgid "Sets the minimum number of concurrent open transactions required before performing \"commit_delay\"." msgstr "Setzt die notwendige minimale Anzahl gleichzeitig offener Transaktionen bevor »commit_delay« angewendet wird." -#: utils/misc/guc_tables.c:2863 +#: utils/misc/guc_tables.c:2995 msgid "Sets the number of digits displayed for floating-point values." msgstr "Setzt die Anzahl ausgegebener Ziffern für Fließkommawerte." -#: utils/misc/guc_tables.c:2864 +#: utils/misc/guc_tables.c:2996 msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." msgstr "Diese Einstellung betrifft real, double precision und geometrische Datentypen. Null oder ein negativer Parameterwert wird zur Standardziffernanzahl (FLT_DIG bzw. DBL_DIG) hinzuaddiert. Ein Wert größer als Null wählt präzisen Ausgabemodus." -#: utils/misc/guc_tables.c:2876 +#: utils/misc/guc_tables.c:3008 msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." msgstr "Setzt die minimale Ausführungszeit, über der Stichproben aller Anweisungen geloggt werden. Die Stichproben werden durch log_statement_sample_rate bestimmt." -#: utils/misc/guc_tables.c:2879 +#: utils/misc/guc_tables.c:3011 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "Null loggt eine Stichprobe aller Anfragen. -1 schaltet dieses Feature aus." -#: utils/misc/guc_tables.c:2889 +#: utils/misc/guc_tables.c:3021 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "Setzt die minimale Ausführungszeit, über der alle Anweisungen geloggt werden." -#: utils/misc/guc_tables.c:2891 +#: utils/misc/guc_tables.c:3023 msgid "Zero prints all queries. -1 turns this feature off." msgstr "Null zeigt alle Anfragen. -1 schaltet dieses Feature aus." -#: utils/misc/guc_tables.c:2901 +#: utils/misc/guc_tables.c:3033 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "Setzt die minimale Ausführungszeit, über der Autovacuum-Aktionen geloggt werden." -#: utils/misc/guc_tables.c:2903 +#: utils/misc/guc_tables.c:3035 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "Null gibt alls Aktionen aus. -1 schaltet die Log-Aufzeichnung über Autovacuum aus." -#: utils/misc/guc_tables.c:2913 +#: utils/misc/guc_tables.c:3045 msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." msgstr "Setzt die maximale Länge in Bytes für geloggte Daten von Bind-Parametern, wenn Anfragen geloggt werden." -#: utils/misc/guc_tables.c:2915 utils/misc/guc_tables.c:2927 +#: utils/misc/guc_tables.c:3047 utils/misc/guc_tables.c:3059 msgid "-1 to print values in full." msgstr "-1 um die Werte vollständig auszugeben." -#: utils/misc/guc_tables.c:2925 +#: utils/misc/guc_tables.c:3057 msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." msgstr "Setzt die maximale Länge in Bytes für bei Fehlern geloggte Daten von Bind-Parametern, wenn Anfragen geloggt werden." -#: utils/misc/guc_tables.c:2937 +#: utils/misc/guc_tables.c:3069 msgid "Background writer sleep time between rounds." msgstr "Schlafzeit zwischen Durchläufen des Background-Writers." -#: utils/misc/guc_tables.c:2948 +#: utils/misc/guc_tables.c:3080 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "Maximale Anzahl der vom Background-Writer pro Durchlauf zu flushenden LRU-Seiten." -#: utils/misc/guc_tables.c:2971 +#: utils/misc/guc_tables.c:3103 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "Anzahl simultaner Anfragen, die das Festplattensubsystem effizient bearbeiten kann." -#: utils/misc/guc_tables.c:2985 -msgid "A variant of effective_io_concurrency that is used for maintenance work." -msgstr "Eine Variante von effective_io_concurrency, die für Wartungsarbeiten verwendet wird." +#: utils/misc/guc_tables.c:3117 +msgid "A variant of \"effective_io_concurrency\" that is used for maintenance work." +msgstr "Eine Variante von »effective_io_concurrency«, die für Wartungsarbeiten verwendet wird." -#: utils/misc/guc_tables.c:3011 +#: utils/misc/guc_tables.c:3132 +msgid "Limit on the size of data reads and writes." +msgstr "Begrenzung der Größe von Datenlese- und -schreibvorgängen." + +#: utils/misc/guc_tables.c:3157 msgid "Maximum number of concurrent worker processes." msgstr "Maximale Anzahl gleichzeitiger Worker-Prozesse." -#: utils/misc/guc_tables.c:3023 +#: utils/misc/guc_tables.c:3169 msgid "Maximum number of logical replication worker processes." msgstr "Maximale Anzahl Arbeitsprozesse für logische Replikation." -#: utils/misc/guc_tables.c:3035 +#: utils/misc/guc_tables.c:3181 msgid "Maximum number of table synchronization workers per subscription." msgstr "Maximale Anzahl Arbeitsprozesse für Tabellensynchronisation pro Subskription." -#: utils/misc/guc_tables.c:3047 +#: utils/misc/guc_tables.c:3193 msgid "Maximum number of parallel apply workers per subscription." msgstr "Maximale Anzahl Parallel-Apply-Worker pro Subskription." -#: utils/misc/guc_tables.c:3057 +#: utils/misc/guc_tables.c:3203 msgid "Sets the amount of time to wait before forcing log file rotation." msgstr "Setzt die Zeit, die gewartet wird, bevor Logdateirotation erzwungen wird." -#: utils/misc/guc_tables.c:3069 +#: utils/misc/guc_tables.c:3215 msgid "Sets the maximum size a log file can reach before being rotated." msgstr "Setzt die maximale Größe, die eine Logdatei erreichen kann, bevor sie rotiert wird." -#: utils/misc/guc_tables.c:3081 +#: utils/misc/guc_tables.c:3227 msgid "Shows the maximum number of function arguments." msgstr "Setzt die maximale Anzahl von Funktionsargumenten." -#: utils/misc/guc_tables.c:3092 +#: utils/misc/guc_tables.c:3238 msgid "Shows the maximum number of index keys." msgstr "Zeigt die maximale Anzahl von Indexschlüsseln." -#: utils/misc/guc_tables.c:3103 +#: utils/misc/guc_tables.c:3249 msgid "Shows the maximum identifier length." msgstr "Zeigt die maximale Länge von Bezeichnern." -#: utils/misc/guc_tables.c:3114 +#: utils/misc/guc_tables.c:3260 msgid "Shows the size of a disk block." msgstr "Zeigt die Größe eines Diskblocks." -#: utils/misc/guc_tables.c:3125 +#: utils/misc/guc_tables.c:3271 msgid "Shows the number of pages per disk file." msgstr "Zeigt die Anzahl Seiten pro Diskdatei." -#: utils/misc/guc_tables.c:3136 +#: utils/misc/guc_tables.c:3282 msgid "Shows the block size in the write ahead log." msgstr "Zeigt die Blockgröße im Write-Ahead-Log." -#: utils/misc/guc_tables.c:3147 +#: utils/misc/guc_tables.c:3293 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "Setzt die Zeit, die gewartet wird, bevor nach einem fehlgeschlagenen Versuch neue WAL-Daten angefordert werden." -#: utils/misc/guc_tables.c:3159 +#: utils/misc/guc_tables.c:3305 msgid "Shows the size of write ahead log segments." msgstr "Zeigt die Größe eines Write-Ahead-Log-Segments." -#: utils/misc/guc_tables.c:3172 +#: utils/misc/guc_tables.c:3318 +msgid "Time for which WAL summary files should be kept." +msgstr "Zeit, für die WAL-Summary-Dateien aufgehoben werden sollen." + +#: utils/misc/guc_tables.c:3331 msgid "Time to sleep between autovacuum runs." msgstr "Wartezeit zwischen Autovacuum-Durchläufen." -#: utils/misc/guc_tables.c:3182 +#: utils/misc/guc_tables.c:3341 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Mindestanzahl an geänderten oder gelöschten Tupeln vor einem Vacuum." -#: utils/misc/guc_tables.c:3191 +#: utils/misc/guc_tables.c:3350 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." msgstr "Mindestanzahl an Einfügeoperationen vor einem Vacuum, oder -1 um auszuschalten." -#: utils/misc/guc_tables.c:3200 +#: utils/misc/guc_tables.c:3359 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "Mindestanzahl an Einfüge-, Änderungs- oder Löschoperationen vor einem Analyze." -#: utils/misc/guc_tables.c:3210 +#: utils/misc/guc_tables.c:3369 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "Alter, nach dem eine Tabelle automatisch gevacuumt wird, um Transaktionsnummernüberlauf zu verhindern." -#: utils/misc/guc_tables.c:3222 +#: utils/misc/guc_tables.c:3381 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "Multixact-Alter, nach dem eine Tabelle automatisch gevacuumt wird, um Transaktionsnummernüberlauf zu verhindern." -#: utils/misc/guc_tables.c:3232 +#: utils/misc/guc_tables.c:3391 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "Setzt die maximale Anzahl gleichzeitig laufender Autovacuum-Worker-Prozesse." -#: utils/misc/guc_tables.c:3242 +#: utils/misc/guc_tables.c:3401 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "Setzt die maximale Anzahl paralleler Prozesse pro Wartungsoperation." -#: utils/misc/guc_tables.c:3252 +#: utils/misc/guc_tables.c:3411 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Setzt die maximale Anzahl paralleler Prozesse pro Executor-Knoten." -#: utils/misc/guc_tables.c:3263 +#: utils/misc/guc_tables.c:3422 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "Setzt die maximale Anzahl paralleler Arbeitsprozesse, die gleichzeitig aktiv sein können." -#: utils/misc/guc_tables.c:3274 +#: utils/misc/guc_tables.c:3433 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "Setzt die maximale Speichergröße für jeden Autovacuum-Worker-Prozess." -#: utils/misc/guc_tables.c:3285 -msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." -msgstr "Zeit bevor ein Snapshot zu alt ist, um Seiten zu lesen, die geändert wurden, nachdem der Snapshot gemacht wurde." - -#: utils/misc/guc_tables.c:3286 -msgid "A value of -1 disables this feature." -msgstr "Der Wert -1 schaltet dieses Feature aus." - -#: utils/misc/guc_tables.c:3296 +#: utils/misc/guc_tables.c:3444 msgid "Time between issuing TCP keepalives." msgstr "Zeit zwischen TCP-Keepalive-Sendungen." -#: utils/misc/guc_tables.c:3297 utils/misc/guc_tables.c:3308 -#: utils/misc/guc_tables.c:3432 +#: utils/misc/guc_tables.c:3445 utils/misc/guc_tables.c:3456 +#: utils/misc/guc_tables.c:3580 msgid "A value of 0 uses the system default." msgstr "Der Wert 0 verwendet die Systemvoreinstellung." -#: utils/misc/guc_tables.c:3307 +#: utils/misc/guc_tables.c:3455 msgid "Time between TCP keepalive retransmits." msgstr "Zeit zwischen TCP-Keepalive-Neuübertragungen." -#: utils/misc/guc_tables.c:3318 +#: utils/misc/guc_tables.c:3466 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "SSL-Renegotiation wird nicht mehr unterstützt; kann nur auf 0 gesetzt werden." -#: utils/misc/guc_tables.c:3329 +#: utils/misc/guc_tables.c:3477 msgid "Maximum number of TCP keepalive retransmits." msgstr "Maximale Anzahl an TCP-Keepalive-Neuübertragungen." -#: utils/misc/guc_tables.c:3330 +#: utils/misc/guc_tables.c:3478 msgid "Number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." msgstr "Anzahl von aufeinanderfolgenden Keepalive-Neuübertragungen, die verloren gehen dürfen, bis die Verbindung als tot betrachtet wird. Der Wert 0 verwendet die Betriebssystemvoreinstellung." -#: utils/misc/guc_tables.c:3341 +#: utils/misc/guc_tables.c:3489 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Setzt die maximal erlaubte Anzahl Ergebnisse für eine genaue Suche mit GIN." -#: utils/misc/guc_tables.c:3352 +#: utils/misc/guc_tables.c:3500 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "Setzt die Annahme des Planers über die Gesamtgröße der Daten-Caches." -#: utils/misc/guc_tables.c:3353 +#: utils/misc/guc_tables.c:3501 msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." msgstr "Das heißt, die Gesamtgröße der Caches (Kernel-Cache und Shared Buffers), die für Datendateien von PostgreSQL verwendet wird. Das wird in Diskseiten gemessen, welche normalerweise 8 kB groß sind." -#: utils/misc/guc_tables.c:3364 +#: utils/misc/guc_tables.c:3512 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "Setzt die Mindestmenge an Tabellendaten für einen parallelen Scan." -#: utils/misc/guc_tables.c:3365 +#: utils/misc/guc_tables.c:3513 msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." msgstr "Wenn der Planer schätzt, dass zu wenige Tabellenseiten gelesen werden werden um diesen Wert zu erreichen, dann wird kein paralleler Scan in Erwägung gezogen werden." -#: utils/misc/guc_tables.c:3375 +#: utils/misc/guc_tables.c:3523 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "Setzt die Mindestmenge an Indexdaten für einen parallelen Scan." -#: utils/misc/guc_tables.c:3376 +#: utils/misc/guc_tables.c:3524 msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." msgstr "Wenn der Planer schätzt, dass zu wenige Indexseiten gelesen werden werden um diesen Wert zu erreichen, dann wird kein paralleler Scan in Erwägung gezogen werden." -#: utils/misc/guc_tables.c:3387 +#: utils/misc/guc_tables.c:3535 msgid "Shows the server version as an integer." msgstr "Zeigt die Serverversion als Zahl." -#: utils/misc/guc_tables.c:3398 +#: utils/misc/guc_tables.c:3546 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "Schreibt Meldungen über die Verwendung von temporären Dateien in den Log, wenn sie größer als diese Anzahl an Kilobytes sind." -#: utils/misc/guc_tables.c:3399 +#: utils/misc/guc_tables.c:3547 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "Null loggt alle Dateien. Die Standardeinstellung ist -1 (wodurch dieses Feature ausgeschaltet wird)." -#: utils/misc/guc_tables.c:3409 +#: utils/misc/guc_tables.c:3557 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Setzt die für pg_stat_activity.query reservierte Größe, in Bytes." -#: utils/misc/guc_tables.c:3420 +#: utils/misc/guc_tables.c:3568 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Setzt die maximale Größe der Pending-Liste eines GIN-Index." -#: utils/misc/guc_tables.c:3431 +#: utils/misc/guc_tables.c:3579 msgid "TCP user timeout." msgstr "TCP-User-Timeout." -#: utils/misc/guc_tables.c:3442 +#: utils/misc/guc_tables.c:3590 msgid "The size of huge page that should be requested." msgstr "Huge-Page-Größe, die angefordert werden soll." -#: utils/misc/guc_tables.c:3453 +#: utils/misc/guc_tables.c:3601 msgid "Aggressively flush system caches for debugging purposes." msgstr "System-Caches aggressiv flushen, zum Debuggen." -#: utils/misc/guc_tables.c:3476 +#: utils/misc/guc_tables.c:3624 msgid "Sets the time interval between checks for disconnection while running queries." msgstr "Setzt das Zeitintervall zwischen Prüfungen auf Verbindungsabbruch während Anfragen laufen." -#: utils/misc/guc_tables.c:3487 +#: utils/misc/guc_tables.c:3635 msgid "Time between progress updates for long-running startup operations." msgstr "Zeit zwischen Fortschrittsnachrichten für lange laufende Operationen beim Serverstart." -#: utils/misc/guc_tables.c:3489 +#: utils/misc/guc_tables.c:3637 msgid "0 turns this feature off." msgstr "0 schaltet dieses Feature aus." -#: utils/misc/guc_tables.c:3499 -#, fuzzy -#| msgid "Sets the seed for random-number generation." +#: utils/misc/guc_tables.c:3647 msgid "Sets the iteration count for SCRAM secret generation." -msgstr "Setzt den Ausgangswert für die Zufallszahlenerzeugung." +msgstr "Setzt die Iterationszahl für die Erzeugung von SCRAM-Geheimnissen." -#: utils/misc/guc_tables.c:3519 +#: utils/misc/guc_tables.c:3667 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "Setzt den vom Planer geschätzten Aufwand, um eine sequenzielle Diskseite zu lesen." -#: utils/misc/guc_tables.c:3530 +#: utils/misc/guc_tables.c:3678 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "Setzt den vom Planer geschätzten Aufwand, um eine nichtsequenzielle Diskseite zu lesen." -#: utils/misc/guc_tables.c:3541 +#: utils/misc/guc_tables.c:3689 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "Setzt den vom Planer geschätzten Aufwand für die Verarbeitung einer Zeile." -#: utils/misc/guc_tables.c:3552 +#: utils/misc/guc_tables.c:3700 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "Setzt den vom Planer geschätzten Aufwand für die Verarbeitung eines Indexeintrags während eines Index-Scans." -#: utils/misc/guc_tables.c:3563 +#: utils/misc/guc_tables.c:3711 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "Setzt den vom Planer geschätzten Aufwand für die Verarbeitung eines Operators oder Funktionsaufrufs." -#: utils/misc/guc_tables.c:3574 +#: utils/misc/guc_tables.c:3722 msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." msgstr "Setzt den vom Planer geschätzten Aufwand, um eine Zeile vom Arbeitsprozess an das Leader-Backend zu senden." -#: utils/misc/guc_tables.c:3585 +#: utils/misc/guc_tables.c:3733 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "Setzt den vom Planer geschätzten Aufwand für das Starten von Arbeitsprozessen für parallele Anfragen." -#: utils/misc/guc_tables.c:3597 +#: utils/misc/guc_tables.c:3745 msgid "Perform JIT compilation if query is more expensive." msgstr "JIT-Kompilierung durchführen, wenn die Anfrage teurer ist." -#: utils/misc/guc_tables.c:3598 +#: utils/misc/guc_tables.c:3746 msgid "-1 disables JIT compilation." msgstr "-1 schaltet JIT-Kompilierung aus." -#: utils/misc/guc_tables.c:3608 +#: utils/misc/guc_tables.c:3756 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "JIT-kompilierte Funktionen optimieren, wenn die Anfrage teurer ist." -#: utils/misc/guc_tables.c:3609 +#: utils/misc/guc_tables.c:3757 msgid "-1 disables optimization." msgstr "-1 schaltet Optimierung aus." -#: utils/misc/guc_tables.c:3619 +#: utils/misc/guc_tables.c:3767 msgid "Perform JIT inlining if query is more expensive." msgstr "JIT-Inlining durchführen, wenn die Anfrage teurer ist." -#: utils/misc/guc_tables.c:3620 +#: utils/misc/guc_tables.c:3768 msgid "-1 disables inlining." msgstr "-1 schaltet Inlining aus." -#: utils/misc/guc_tables.c:3630 +#: utils/misc/guc_tables.c:3778 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "Setzt die Planerschätzung für den Anteil der Cursor-Zeilen, die ausgelesen werden werden." -#: utils/misc/guc_tables.c:3642 +#: utils/misc/guc_tables.c:3790 msgid "Sets the planner's estimate of the average size of a recursive query's working table." msgstr "Setzt die Planerschätzung für die durchschnittliche Größe der Arbeitstabelle einer rekursiven Anfrage." -#: utils/misc/guc_tables.c:3654 +#: utils/misc/guc_tables.c:3802 msgid "GEQO: selective pressure within the population." msgstr "GEQO: selektiver Auswahldruck in der Bevölkerung." -#: utils/misc/guc_tables.c:3665 +#: utils/misc/guc_tables.c:3813 msgid "GEQO: seed for random path selection." msgstr "GEQO: Ausgangswert für die zufällige Pfadauswahl." -#: utils/misc/guc_tables.c:3676 -msgid "Multiple of work_mem to use for hash tables." -msgstr "Vielfaches von work_mem zur Verwendung bei Hash-Tabellen." +#: utils/misc/guc_tables.c:3824 +msgid "Multiple of \"work_mem\" to use for hash tables." +msgstr "Vielfaches von »work_mem« zur Verwendung bei Hash-Tabellen." -#: utils/misc/guc_tables.c:3687 +#: utils/misc/guc_tables.c:3835 msgid "Multiple of the average buffer usage to free per round." msgstr "Vielfaches der durchschnittlichen freizugebenden Pufferverwendung pro Runde." -#: utils/misc/guc_tables.c:3697 +#: utils/misc/guc_tables.c:3845 msgid "Sets the seed for random-number generation." msgstr "Setzt den Ausgangswert für die Zufallszahlenerzeugung." -#: utils/misc/guc_tables.c:3708 +#: utils/misc/guc_tables.c:3856 msgid "Vacuum cost delay in milliseconds." msgstr "Vacuum-Kosten-Verzögerung in Millisekunden." -#: utils/misc/guc_tables.c:3719 +#: utils/misc/guc_tables.c:3867 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Vacuum-Kosten-Verzögerung in Millisekunden, für Autovacuum." -#: utils/misc/guc_tables.c:3730 +#: utils/misc/guc_tables.c:3878 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "Anzahl geänderter oder gelöschter Tupel vor einem Vacuum, relativ zu reltuples." -#: utils/misc/guc_tables.c:3740 +#: utils/misc/guc_tables.c:3888 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "Anzahl eingefügter Tupel vor einem Vacuum, relativ zu reltuples." -#: utils/misc/guc_tables.c:3750 +#: utils/misc/guc_tables.c:3898 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "Anzahl eingefügter, geänderter oder gelöschter Tupel vor einem Analyze, relativ zu reltuples." -#: utils/misc/guc_tables.c:3760 +#: utils/misc/guc_tables.c:3908 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "Zeit, die damit verbracht wird, modifizierte Puffer während eines Checkpoints zurückzuschreiben, als Bruchteil des Checkpoint-Intervalls." -#: utils/misc/guc_tables.c:3770 -msgid "Fraction of statements exceeding log_min_duration_sample to be logged." -msgstr "Anteil der zu loggenden Anweisungen, die log_min_duration_sample überschreiten." +#: utils/misc/guc_tables.c:3918 +msgid "Fraction of statements exceeding \"log_min_duration_sample\" to be logged." +msgstr "Anteil der zu loggenden Anweisungen, die »log_min_duration_sample« überschreiten." -#: utils/misc/guc_tables.c:3771 +#: utils/misc/guc_tables.c:3919 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "Verwenden Sie einen Wert zwischen 0.0 (nie loggen) und 1.0 (immer loggen)." -#: utils/misc/guc_tables.c:3780 +#: utils/misc/guc_tables.c:3928 msgid "Sets the fraction of transactions from which to log all statements." msgstr "Setzt den Bruchteil der Transaktionen, aus denen alle Anweisungen geloggt werden." -#: utils/misc/guc_tables.c:3781 +#: utils/misc/guc_tables.c:3929 msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." msgstr "Verwenden Sie einen Wert zwischen 0.0 (nie loggen) und 1.0 (alle Anweisungen für alle Transaktionen loggen)." -#: utils/misc/guc_tables.c:3800 +#: utils/misc/guc_tables.c:3948 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "Setzt den Shell-Befehl, der aufgerufen wird, um eine WAL-Datei zu archivieren." -#: utils/misc/guc_tables.c:3801 +#: utils/misc/guc_tables.c:3949 msgid "This is used only if \"archive_library\" is not set." msgstr "Dieser wird nur verwendet, wenn »archive_library« nicht gesetzt ist." -#: utils/misc/guc_tables.c:3810 +#: utils/misc/guc_tables.c:3958 msgid "Sets the library that will be called to archive a WAL file." msgstr "Setzt die Bibliothek, die aufgerufen wird, um eine WAL-Datei zu archivieren." -#: utils/misc/guc_tables.c:3811 +#: utils/misc/guc_tables.c:3959 msgid "An empty string indicates that \"archive_command\" should be used." msgstr "Eine leere Zeichenkette bedeutet, dass »archive_command« verwendet werden soll." -#: utils/misc/guc_tables.c:3820 +#: utils/misc/guc_tables.c:3968 msgid "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "Setzt den Shell-Befehl, der aufgerufen wird, um eine archivierte WAL-Datei zurückzuholen." -#: utils/misc/guc_tables.c:3830 +#: utils/misc/guc_tables.c:3978 msgid "Sets the shell command that will be executed at every restart point." msgstr "Setzt den Shell-Befehl, der bei jedem Restart-Punkt ausgeführt wird." -#: utils/misc/guc_tables.c:3840 +#: utils/misc/guc_tables.c:3988 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "Setzt den Shell-Befehl, der einmal am Ende der Wiederherstellung ausgeführt wird." -#: utils/misc/guc_tables.c:3850 +#: utils/misc/guc_tables.c:3998 msgid "Specifies the timeline to recover into." msgstr "Gibt die Zeitleiste für die Wiederherstellung an." -#: utils/misc/guc_tables.c:3860 +#: utils/misc/guc_tables.c:4008 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "Auf »immediate« setzen, um die Wiederherstellung zu beenden, sobald ein konsistenter Zustand erreicht ist." -#: utils/misc/guc_tables.c:3869 +#: utils/misc/guc_tables.c:4017 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "Setzt die Transaktions-ID, bis zu der die Wiederherstellung voranschreiten wird." -#: utils/misc/guc_tables.c:3878 +#: utils/misc/guc_tables.c:4026 msgid "Sets the time stamp up to which recovery will proceed." msgstr "Setzt den Zeitstempel, bis zu dem die Wiederherstellung voranschreiten wird." -#: utils/misc/guc_tables.c:3887 +#: utils/misc/guc_tables.c:4035 msgid "Sets the named restore point up to which recovery will proceed." msgstr "Setzt den benannten Restore-Punkt, bis zu dem die Wiederherstellung voranschreiten wird." -#: utils/misc/guc_tables.c:3896 +#: utils/misc/guc_tables.c:4044 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "Setzt die LSN der Write-Ahead-Log-Position, bis zu der die Wiederherstellung voranschreiten wird." -#: utils/misc/guc_tables.c:3906 +#: utils/misc/guc_tables.c:4054 msgid "Sets the connection string to be used to connect to the sending server." msgstr "Setzt die Verbindungszeichenkette zur Verbindung mit dem sendenden Server." -#: utils/misc/guc_tables.c:3917 +#: utils/misc/guc_tables.c:4065 msgid "Sets the name of the replication slot to use on the sending server." msgstr "Setzt den Namen des zu verwendenden Replikations-Slots auf dem sendenden Server." -#: utils/misc/guc_tables.c:3927 +#: utils/misc/guc_tables.c:4075 msgid "Sets the client's character set encoding." msgstr "Setzt die Zeichensatzkodierung des Clients." -#: utils/misc/guc_tables.c:3938 +#: utils/misc/guc_tables.c:4086 msgid "Controls information prefixed to each log line." msgstr "Bestimmt die Informationen, die vor jede Logzeile geschrieben werden." -#: utils/misc/guc_tables.c:3939 +#: utils/misc/guc_tables.c:4087 msgid "If blank, no prefix is used." msgstr "Wenn leer, dann wird kein Präfix verwendet." -#: utils/misc/guc_tables.c:3948 +#: utils/misc/guc_tables.c:4096 msgid "Sets the time zone to use in log messages." msgstr "Setzt die in Logmeldungen verwendete Zeitzone." -#: utils/misc/guc_tables.c:3958 +#: utils/misc/guc_tables.c:4106 msgid "Sets the display format for date and time values." msgstr "Setzt das Ausgabeformat für Datums- und Zeitwerte." -#: utils/misc/guc_tables.c:3959 +#: utils/misc/guc_tables.c:4107 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Kontrolliert auch die Interpretation von zweideutigen Datumseingaben." -#: utils/misc/guc_tables.c:3970 +#: utils/misc/guc_tables.c:4118 msgid "Sets the default table access method for new tables." msgstr "Setzt die Standard-Tabellenzugriffsmethode für neue Tabellen." -#: utils/misc/guc_tables.c:3981 +#: utils/misc/guc_tables.c:4129 msgid "Sets the default tablespace to create tables and indexes in." msgstr "Setzt den Standard-Tablespace für Tabellen und Indexe." -#: utils/misc/guc_tables.c:3982 +#: utils/misc/guc_tables.c:4130 msgid "An empty string selects the database's default tablespace." msgstr "Eine leere Zeichenkette wählt den Standard-Tablespace der Datenbank." -#: utils/misc/guc_tables.c:3992 +#: utils/misc/guc_tables.c:4140 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "Setzt den oder die Tablespaces für temporäre Tabellen und Sortierdateien." -#: utils/misc/guc_tables.c:4003 +#: utils/misc/guc_tables.c:4151 msgid "Sets whether a CREATEROLE user automatically grants the role to themselves, and with which options." -msgstr "" +msgstr "Bestimmt, ob ein CREATEROLE-Benutzer sich die Rolle automatisch selbst gewährt, und mit welchen Optionen." -#: utils/misc/guc_tables.c:4015 +#: utils/misc/guc_tables.c:4163 msgid "Sets the path for dynamically loadable modules." msgstr "Setzt den Pfad für ladbare dynamische Bibliotheken." -#: utils/misc/guc_tables.c:4016 +#: utils/misc/guc_tables.c:4164 msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." msgstr "Wenn ein dynamisch ladbares Modul geöffnet werden muss und der angegebene Name keine Verzeichniskomponente hat (das heißt er enthält keinen Schrägstrich), dann sucht das System in diesem Pfad nach der angegebenen Datei." -#: utils/misc/guc_tables.c:4029 +#: utils/misc/guc_tables.c:4177 msgid "Sets the location of the Kerberos server key file." msgstr "Setzt den Ort der Kerberos-Server-Schlüsseldatei." -#: utils/misc/guc_tables.c:4040 +#: utils/misc/guc_tables.c:4188 msgid "Sets the Bonjour service name." msgstr "Setzt den Bonjour-Servicenamen." -#: utils/misc/guc_tables.c:4050 +#: utils/misc/guc_tables.c:4198 msgid "Sets the language in which messages are displayed." msgstr "Setzt die Sprache, in der Mitteilungen ausgegeben werden." -#: utils/misc/guc_tables.c:4060 +#: utils/misc/guc_tables.c:4208 msgid "Sets the locale for formatting monetary amounts." msgstr "Setzt die Locale für die Formatierung von Geldbeträgen." -#: utils/misc/guc_tables.c:4070 +#: utils/misc/guc_tables.c:4218 msgid "Sets the locale for formatting numbers." msgstr "Setzt die Locale für die Formatierung von Zahlen." -#: utils/misc/guc_tables.c:4080 +#: utils/misc/guc_tables.c:4228 msgid "Sets the locale for formatting date and time values." msgstr "Setzt die Locale für die Formatierung von Datums- und Zeitwerten." -#: utils/misc/guc_tables.c:4090 +#: utils/misc/guc_tables.c:4238 msgid "Lists shared libraries to preload into each backend." msgstr "Listet dynamische Bibliotheken, die vorab in jeden Serverprozess geladen werden." -#: utils/misc/guc_tables.c:4101 +#: utils/misc/guc_tables.c:4249 msgid "Lists shared libraries to preload into server." msgstr "Listet dynamische Bibliotheken, die vorab in den Server geladen werden." -#: utils/misc/guc_tables.c:4112 +#: utils/misc/guc_tables.c:4260 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "Listet unprivilegierte dynamische Bibliotheken, die vorab in jeden Serverprozess geladen werden." -#: utils/misc/guc_tables.c:4123 +#: utils/misc/guc_tables.c:4271 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "Setzt die Schemasuchreihenfolge für Namen ohne Schemaqualifikation." -#: utils/misc/guc_tables.c:4135 +#: utils/misc/guc_tables.c:4283 msgid "Shows the server (database) character set encoding." msgstr "Zeigt die Zeichensatzkodierung des Servers (der Datenbank)." -#: utils/misc/guc_tables.c:4147 +#: utils/misc/guc_tables.c:4295 msgid "Shows the server version." msgstr "Zeigt die Serverversion." -#: utils/misc/guc_tables.c:4159 +#: utils/misc/guc_tables.c:4307 msgid "Sets the current role." msgstr "Setzt die aktuelle Rolle." -#: utils/misc/guc_tables.c:4171 +#: utils/misc/guc_tables.c:4319 msgid "Sets the session user name." msgstr "Setzt den Sitzungsbenutzernamen." -#: utils/misc/guc_tables.c:4182 +#: utils/misc/guc_tables.c:4330 msgid "Sets the destination for server log output." msgstr "Setzt das Ziel für die Serverlogausgabe." -#: utils/misc/guc_tables.c:4183 +#: utils/misc/guc_tables.c:4331 msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." msgstr "Gültige Werte sind Kombinationen von »stderr«, »syslog«, »csvlog«, »jsonlog« und »eventlog«, je nach Plattform." -#: utils/misc/guc_tables.c:4194 +#: utils/misc/guc_tables.c:4342 msgid "Sets the destination directory for log files." msgstr "Bestimmt das Zielverzeichnis für Logdateien." -#: utils/misc/guc_tables.c:4195 +#: utils/misc/guc_tables.c:4343 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "Kann relativ zum Datenverzeichnis oder als absoluter Pfad angegeben werden." -#: utils/misc/guc_tables.c:4205 +#: utils/misc/guc_tables.c:4353 msgid "Sets the file name pattern for log files." msgstr "Bestimmt das Dateinamenmuster für Logdateien." -#: utils/misc/guc_tables.c:4216 +#: utils/misc/guc_tables.c:4364 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "Setzt den Programmnamen, mit dem PostgreSQL-Meldungen im Syslog identifiziert werden." -#: utils/misc/guc_tables.c:4227 +#: utils/misc/guc_tables.c:4375 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "Setzt den Programmnamen, mit dem PostgreSQL-Meldungen im Ereignisprotokoll identifiziert werden." -#: utils/misc/guc_tables.c:4238 +#: utils/misc/guc_tables.c:4386 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "Setzt die Zeitzone, in der Zeitangaben interpretiert und ausgegeben werden." -#: utils/misc/guc_tables.c:4248 +#: utils/misc/guc_tables.c:4396 msgid "Selects a file of time zone abbreviations." msgstr "Wählt eine Datei mit Zeitzonenabkürzungen." -#: utils/misc/guc_tables.c:4258 +#: utils/misc/guc_tables.c:4406 msgid "Sets the owning group of the Unix-domain socket." msgstr "Setzt die Eigentümergruppe der Unix-Domain-Socket." -#: utils/misc/guc_tables.c:4259 +#: utils/misc/guc_tables.c:4407 msgid "The owning user of the socket is always the user that starts the server." msgstr "Der Eigentümer ist immer der Benutzer, der den Server startet." -#: utils/misc/guc_tables.c:4269 +#: utils/misc/guc_tables.c:4417 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Setzt die Verzeichnisse, in denen Unix-Domain-Sockets erzeugt werden sollen." -#: utils/misc/guc_tables.c:4280 +#: utils/misc/guc_tables.c:4428 msgid "Sets the host name or IP address(es) to listen to." msgstr "Setzt den Hostnamen oder die IP-Adresse(n), auf der auf Verbindungen gewartet wird." -#: utils/misc/guc_tables.c:4295 +#: utils/misc/guc_tables.c:4443 msgid "Sets the server's data directory." msgstr "Setzt das Datenverzeichnis des Servers." -#: utils/misc/guc_tables.c:4306 +#: utils/misc/guc_tables.c:4454 msgid "Sets the server's main configuration file." msgstr "Setzt die Hauptkonfigurationsdatei des Servers." -#: utils/misc/guc_tables.c:4317 +#: utils/misc/guc_tables.c:4465 msgid "Sets the server's \"hba\" configuration file." msgstr "Setzt die »hba«-Konfigurationsdatei des Servers." -#: utils/misc/guc_tables.c:4328 +#: utils/misc/guc_tables.c:4476 msgid "Sets the server's \"ident\" configuration file." msgstr "Setzt die »ident«-Konfigurationsdatei des Servers." -#: utils/misc/guc_tables.c:4339 +#: utils/misc/guc_tables.c:4487 msgid "Writes the postmaster PID to the specified file." msgstr "Schreibt die Postmaster-PID in die angegebene Datei." -#: utils/misc/guc_tables.c:4350 +#: utils/misc/guc_tables.c:4498 msgid "Shows the name of the SSL library." msgstr "Zeigt den Namen der SSL-Bibliothek." -#: utils/misc/guc_tables.c:4365 +#: utils/misc/guc_tables.c:4513 msgid "Location of the SSL server certificate file." msgstr "Ort der SSL-Serverzertifikatsdatei." -#: utils/misc/guc_tables.c:4375 +#: utils/misc/guc_tables.c:4523 msgid "Location of the SSL server private key file." msgstr "Setzt den Ort der Datei mit dem privaten SSL-Server-Schlüssel." -#: utils/misc/guc_tables.c:4385 +#: utils/misc/guc_tables.c:4533 msgid "Location of the SSL certificate authority file." msgstr "Ort der SSL-Certificate-Authority-Datei." -#: utils/misc/guc_tables.c:4395 +#: utils/misc/guc_tables.c:4543 msgid "Location of the SSL certificate revocation list file." msgstr "Ort der SSL-Certificate-Revocation-List-Datei." -#: utils/misc/guc_tables.c:4405 +#: utils/misc/guc_tables.c:4553 msgid "Location of the SSL certificate revocation list directory." msgstr "Ort des SSL-Certificate-Revocation-List-Verzeichnisses." -#: utils/misc/guc_tables.c:4415 +#: utils/misc/guc_tables.c:4563 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "Anzahl synchroner Standbys und Liste der Namen der möglichen synchronen Standbys." -#: utils/misc/guc_tables.c:4426 +#: utils/misc/guc_tables.c:4574 msgid "Sets default text search configuration." msgstr "Setzt die vorgegebene Textsuchekonfiguration." -#: utils/misc/guc_tables.c:4436 +#: utils/misc/guc_tables.c:4584 msgid "Sets the list of allowed SSL ciphers." msgstr "Setzt die Liste der erlaubten SSL-Verschlüsselungsalgorithmen." -#: utils/misc/guc_tables.c:4451 +#: utils/misc/guc_tables.c:4599 msgid "Sets the curve to use for ECDH." msgstr "Setzt die für ECDH zu verwendende Kurve." -#: utils/misc/guc_tables.c:4466 +#: utils/misc/guc_tables.c:4614 msgid "Location of the SSL DH parameters file." msgstr "Setzt den Ort der SSL-DH-Parameter-Datei." -#: utils/misc/guc_tables.c:4477 +#: utils/misc/guc_tables.c:4625 msgid "Command to obtain passphrases for SSL." msgstr "Befehl zum Einlesen von Passphrasen für SSL." -#: utils/misc/guc_tables.c:4488 +#: utils/misc/guc_tables.c:4636 msgid "Sets the application name to be reported in statistics and logs." msgstr "Setzt den Anwendungsnamen, der in Statistiken und Logs verzeichnet wird." -#: utils/misc/guc_tables.c:4499 +#: utils/misc/guc_tables.c:4647 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Setzt den Namen des Clusters, welcher im Prozesstitel angezeigt wird." -#: utils/misc/guc_tables.c:4510 +#: utils/misc/guc_tables.c:4658 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "Setzt die WAL-Resource-Manager, für die WAL-Konsistenzprüfungen durchgeführt werden." -#: utils/misc/guc_tables.c:4511 +#: utils/misc/guc_tables.c:4659 msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." msgstr "Volle Seitenabbilder werden für alle Datenblöcke geloggt und gegen die Resultate der WAL-Wiederherstellung geprüft." -#: utils/misc/guc_tables.c:4521 +#: utils/misc/guc_tables.c:4669 msgid "JIT provider to use." msgstr "Zu verwendender JIT-Provider." -#: utils/misc/guc_tables.c:4532 +#: utils/misc/guc_tables.c:4680 msgid "Log backtrace for errors in these functions." msgstr "Backtrace für Fehler in diesen Funktionen loggen." -#: utils/misc/guc_tables.c:4543 +#: utils/misc/guc_tables.c:4691 msgid "Use direct I/O for file access." msgstr "Direct-I/O für Dateizugriff verwenden." -#: utils/misc/guc_tables.c:4563 +#: utils/misc/guc_tables.c:4702 +msgid "Lists streaming replication standby server replication slot names that logical WAL sender processes will wait for." +msgstr "Listet Replikations-Slot-Namen von Streaming-Replication-Standby-Servern, auf die logische WAL-Sender warten werden." + +#: utils/misc/guc_tables.c:4704 +msgid "Logical WAL sender processes will send decoded changes to output plugins only after the specified replication slots have confirmed receiving WAL." +msgstr "Logische WAL-Sender-Prozesse werden dekodierte Änderungen erst an die Ausgabe-Plugins senden, nachdem die angegebenen Replikations-Slots den Empfang von WAL bestätigt haben." + +#: utils/misc/guc_tables.c:4716 +msgid "Prohibits access to non-system relations of specified kinds." +msgstr "Verbietet Zugriff auf Nicht-System-Relationen der angegeben Arten." + +#: utils/misc/guc_tables.c:4736 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Bestimmt, ob »\\'« in Zeichenkettenkonstanten erlaubt ist." -#: utils/misc/guc_tables.c:4573 +#: utils/misc/guc_tables.c:4746 msgid "Sets the output format for bytea." msgstr "Setzt das Ausgabeformat für bytea." -#: utils/misc/guc_tables.c:4583 +#: utils/misc/guc_tables.c:4756 msgid "Sets the message levels that are sent to the client." msgstr "Setzt die Meldungstypen, die an den Client gesendet werden." -#: utils/misc/guc_tables.c:4584 utils/misc/guc_tables.c:4680 -#: utils/misc/guc_tables.c:4691 utils/misc/guc_tables.c:4763 +#: utils/misc/guc_tables.c:4757 utils/misc/guc_tables.c:4853 +#: utils/misc/guc_tables.c:4864 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr "Jeder Wert schließt alle ihm folgenden Werte mit ein. Je weiter hinten der Wert steht, desto weniger Meldungen werden gesendet werden." -#: utils/misc/guc_tables.c:4594 +#: utils/misc/guc_tables.c:4767 msgid "Enables in-core computation of query identifiers." msgstr "Schaltet die eingebaute Berechnung von Anfragebezeichnern ein." -#: utils/misc/guc_tables.c:4604 +#: utils/misc/guc_tables.c:4777 msgid "Enables the planner to use constraints to optimize queries." msgstr "Ermöglicht dem Planer die Verwendung von Constraints, um Anfragen zu optimieren." -#: utils/misc/guc_tables.c:4605 +#: utils/misc/guc_tables.c:4778 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." msgstr "Tabellen-Scans werden übersprungen, wenn deren Constraints garantieren, dass keine Zeile mit der Abfrage übereinstimmt." -#: utils/misc/guc_tables.c:4616 +#: utils/misc/guc_tables.c:4789 msgid "Sets the default compression method for compressible values." msgstr "Setzt die Standard-Komprimierungsmethode für komprimierbare Werte." -#: utils/misc/guc_tables.c:4627 +#: utils/misc/guc_tables.c:4800 msgid "Sets the transaction isolation level of each new transaction." msgstr "Setzt den Transaktionsisolationsgrad neuer Transaktionen." -#: utils/misc/guc_tables.c:4637 +#: utils/misc/guc_tables.c:4810 msgid "Sets the current transaction's isolation level." msgstr "Zeigt den Isolationsgrad der aktuellen Transaktion." -#: utils/misc/guc_tables.c:4648 +#: utils/misc/guc_tables.c:4821 msgid "Sets the display format for interval values." msgstr "Setzt das Ausgabeformat für Intervallwerte." -#: utils/misc/guc_tables.c:4659 +#: utils/misc/guc_tables.c:4832 msgid "Log level for reporting invalid ICU locale strings." msgstr "Loglevel für Meldungen über ungültige ICU-Locale-Zeichenketten." -#: utils/misc/guc_tables.c:4669 +#: utils/misc/guc_tables.c:4842 msgid "Sets the verbosity of logged messages." msgstr "Setzt den Detailgrad von geloggten Meldungen." -#: utils/misc/guc_tables.c:4679 +#: utils/misc/guc_tables.c:4852 msgid "Sets the message levels that are logged." msgstr "Setzt die Meldungstypen, die geloggt werden." -#: utils/misc/guc_tables.c:4690 +#: utils/misc/guc_tables.c:4863 msgid "Causes all statements generating error at or above this level to be logged." msgstr "Schreibt alle Anweisungen, die einen Fehler auf dieser Stufe oder höher verursachen, in den Log." -#: utils/misc/guc_tables.c:4701 +#: utils/misc/guc_tables.c:4874 msgid "Sets the type of statements logged." msgstr "Setzt die Anweisungsarten, die geloggt werden." -#: utils/misc/guc_tables.c:4711 +#: utils/misc/guc_tables.c:4884 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "Setzt die zu verwendende Syslog-»Facility«, wenn Syslog angeschaltet ist." -#: utils/misc/guc_tables.c:4722 +#: utils/misc/guc_tables.c:4895 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "Setzt das Sitzungsverhalten für Trigger und Regeln." -#: utils/misc/guc_tables.c:4732 +#: utils/misc/guc_tables.c:4905 msgid "Sets the current transaction's synchronization level." msgstr "Setzt den Synchronisationsgrad der aktuellen Transaktion." -#: utils/misc/guc_tables.c:4742 -msgid "Allows archiving of WAL files using archive_command." -msgstr "Erlaubt die Archivierung von WAL-Dateien mittels archive_command." +#: utils/misc/guc_tables.c:4915 +msgid "Allows archiving of WAL files using \"archive_command\"." +msgstr "Erlaubt die Archivierung von WAL-Dateien mittels »archive_command«." -#: utils/misc/guc_tables.c:4752 +#: utils/misc/guc_tables.c:4925 msgid "Sets the action to perform upon reaching the recovery target." msgstr "Setzt die Aktion, die beim Erreichen des Wiederherstellungsziels durchgeführt wird." -#: utils/misc/guc_tables.c:4762 -msgid "Enables logging of recovery-related debugging information." -msgstr "Ermöglicht das Loggen von Debug-Informationen über die Wiederherstellung." - -#: utils/misc/guc_tables.c:4779 +#: utils/misc/guc_tables.c:4935 msgid "Collects function-level statistics on database activity." msgstr "Sammelt Statistiken auf Funktionsebene über Datenbankaktivität." -#: utils/misc/guc_tables.c:4790 +#: utils/misc/guc_tables.c:4946 msgid "Sets the consistency of accesses to statistics data." msgstr "Setzt die Konsistenz von Zugriffen auf Statistikdaten." -#: utils/misc/guc_tables.c:4800 +#: utils/misc/guc_tables.c:4956 msgid "Compresses full-page writes written in WAL file with specified method." msgstr "Komprimiert in WAL-Dateien geschriebene volle Seiten mit der angegebenen Methode." -#: utils/misc/guc_tables.c:4810 +#: utils/misc/guc_tables.c:4966 msgid "Sets the level of information written to the WAL." msgstr "Setzt den Umfang der in den WAL geschriebenen Informationen." -#: utils/misc/guc_tables.c:4820 +#: utils/misc/guc_tables.c:4976 msgid "Selects the dynamic shared memory implementation used." msgstr "Wählt die zu verwendende Implementierung von dynamischem Shared Memory." -#: utils/misc/guc_tables.c:4830 +#: utils/misc/guc_tables.c:4986 msgid "Selects the shared memory implementation used for the main shared memory region." msgstr "Wählt die Shared-Memory-Implementierung, die für den Haupt-Shared-Memory-Bereich verwendet wird." -#: utils/misc/guc_tables.c:4840 +#: utils/misc/guc_tables.c:4996 msgid "Selects the method used for forcing WAL updates to disk." msgstr "Wählt die Methode, um das Schreiben von WAL-Änderungen auf die Festplatte zu erzwingen." -#: utils/misc/guc_tables.c:4850 +#: utils/misc/guc_tables.c:5006 msgid "Sets how binary values are to be encoded in XML." msgstr "Setzt, wie binäre Werte in XML kodiert werden." -#: utils/misc/guc_tables.c:4860 +#: utils/misc/guc_tables.c:5016 msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." msgstr "Setzt, ob XML-Daten in impliziten Parse- und Serialisierungsoperationen als Dokument oder Fragment betrachtet werden sollen." -#: utils/misc/guc_tables.c:4871 +#: utils/misc/guc_tables.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "Huge Pages auf Linux oder Windows verwenden." -#: utils/misc/guc_tables.c:4881 +#: utils/misc/guc_tables.c:5037 +msgid "Indicates the status of huge pages." +msgstr "Zeigt den Status von Huge Pages an." + +#: utils/misc/guc_tables.c:5048 msgid "Prefetch referenced blocks during recovery." msgstr "Während der Wiederherstellung Blöcke, auf die verwiesen wird, vorab einlesen." -#: utils/misc/guc_tables.c:4882 +#: utils/misc/guc_tables.c:5049 msgid "Look ahead in the WAL to find references to uncached data." msgstr "Im WAL vorausschauen, um Verweise auf ungecachte Daten zu finden." -#: utils/misc/guc_tables.c:4891 -#, fuzzy -#| msgid "Enables the planner's use of parallel append plans." +#: utils/misc/guc_tables.c:5058 msgid "Forces the planner's use parallel query nodes." -msgstr "Ermöglicht parallele Append-Pläne im Planer." +msgstr "Erzwingt die Verwendung von Parallel-Query-Knoten im Planer." -#: utils/misc/guc_tables.c:4892 -msgid "This can be useful for testing the parallel query infrastructure by forcing the planner to generate plans which contains nodes which perform tuple communication between workers and the main process." -msgstr "" +#: utils/misc/guc_tables.c:5059 +msgid "This can be useful for testing the parallel query infrastructure by forcing the planner to generate plans that contain nodes that perform tuple communication between workers and the main process." +msgstr "Das kann nützlich sein, um die Parallel-Query-Infrastruktur zu testen, indem der Planer gezwungen wird, Pläne zu erzeugen, die Knoten enthalten, die Tupelkommunikation zwischen Worker- und Hauptprozess durchführen." -#: utils/misc/guc_tables.c:4904 +#: utils/misc/guc_tables.c:5071 msgid "Chooses the algorithm for encrypting passwords." msgstr "Wählt den Algorithmus zum Verschlüsseln von Passwörtern." -#: utils/misc/guc_tables.c:4914 +#: utils/misc/guc_tables.c:5081 msgid "Controls the planner's selection of custom or generic plan." msgstr "Kontrolliert, ob der Planer einen maßgeschneiderten oder einen allgemeinen Plan verwendet." -#: utils/misc/guc_tables.c:4915 +#: utils/misc/guc_tables.c:5082 msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." msgstr "Vorbereitete Anweisungen können maßgeschneiderte oder allgemeine Pläne haben und der Planer wird versuchen, den besseren auszuwählen. Diese Einstellung kann das Standardverhalten außer Kraft setzen." -#: utils/misc/guc_tables.c:4927 +#: utils/misc/guc_tables.c:5094 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "Setzt die minimale zu verwendende SSL/TLS-Protokollversion." -#: utils/misc/guc_tables.c:4939 +#: utils/misc/guc_tables.c:5106 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "Setzt die maximale zu verwendende SSL/TLS-Protokollversion." -#: utils/misc/guc_tables.c:4951 +#: utils/misc/guc_tables.c:5118 msgid "Sets the method for synchronizing the data directory before crash recovery." msgstr "Setzt die Methode für das Synchronisieren des Datenverzeichnisses vor der Wiederherstellung nach einem Absturz." -#: utils/misc/guc_tables.c:4960 -msgid "Controls when to replicate or apply each change." -msgstr "" +#: utils/misc/guc_tables.c:5127 +msgid "Forces immediate streaming or serialization of changes in large transactions." +msgstr "Erzwingt sofortiges Streaming oder sofortige Serialisierung von Änderungen in großen Transaktionen." -#: utils/misc/guc_tables.c:4961 +#: utils/misc/guc_tables.c:5128 msgid "On the publisher, it allows streaming or serializing each change in logical decoding. On the subscriber, it allows serialization of all changes to files and notifies the parallel apply workers to read and apply them at the end of the transaction." -msgstr "" +msgstr "Auf dem Publikationsserver erlaubt es Streaming oder Serialisierung jeder Änderung aus logischer Dekodierung. Auf dem Subskriptionsserver erlaubt es die Serialisierung aller Änderungen in Dateien und benachrichtigt die Parallel-Apply-Worker, sie nach dem Ende der Transaktion zu lesen und anzuwenden." #: utils/misc/help_config.c:129 #, c-format msgid "internal error: unrecognized run-time parameter type\n" msgstr "interner Fehler: unbekannter Parametertyp\n" -#: utils/misc/pg_controldata.c:48 utils/misc/pg_controldata.c:86 -#: utils/misc/pg_controldata.c:175 utils/misc/pg_controldata.c:214 +#: utils/misc/pg_controldata.c:50 utils/misc/pg_controldata.c:90 +#: utils/misc/pg_controldata.c:181 utils/misc/pg_controldata.c:222 #, c-format msgid "calculated CRC checksum does not match value stored in file" msgstr "berechnete CRC-Prüfsumme stimmt nicht mit dem Wert in der Datei überein" @@ -29688,145 +30863,143 @@ msgstr "Policy für Sicherheit auf Zeilenebene für Tabelle »%s« würde Auswir msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." msgstr "Um die Policy für den Tabelleneigentümer zu deaktivieren, verwenden Sie ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/timeout.c:524 +#: utils/misc/timeout.c:520 #, c-format msgid "cannot add more timeout reasons" msgstr "kann keine weiteren Gründe für Zeitüberschreitungen hinzufügen" -#: utils/misc/tzparser.c:60 +#: utils/misc/tzparser.c:61 #, c-format msgid "time zone abbreviation \"%s\" is too long (maximum %d characters) in time zone file \"%s\", line %d" msgstr "Zeitzonenabkürzung »%s« ist zu lang (maximal %d Zeichen) in Zeitzonendatei »%s«, Zeile %d" -#: utils/misc/tzparser.c:72 +#: utils/misc/tzparser.c:73 #, c-format msgid "time zone offset %d is out of range in time zone file \"%s\", line %d" msgstr "Zeitzonenabstand %d ist außerhalb des gültigen Bereichs in Zeitzonendatei »%s«, Zeile %d" -#: utils/misc/tzparser.c:111 +#: utils/misc/tzparser.c:112 #, c-format msgid "missing time zone abbreviation in time zone file \"%s\", line %d" msgstr "fehlende Zeitzonenabkürzung in Zeitzonendatei »%s«, Zeile %d" -#: utils/misc/tzparser.c:120 +#: utils/misc/tzparser.c:121 #, c-format msgid "missing time zone offset in time zone file \"%s\", line %d" msgstr "fehlender Zeitzonenabstand in Zeitzonendatei »%s«, Zeile %d" -#: utils/misc/tzparser.c:132 +#: utils/misc/tzparser.c:133 #, c-format msgid "invalid number for time zone offset in time zone file \"%s\", line %d" msgstr "ungültige Zahl für Zeitzonenabstand in Zeitzonendatei »%s«, Zeile %d" -#: utils/misc/tzparser.c:168 +#: utils/misc/tzparser.c:169 #, c-format msgid "invalid syntax in time zone file \"%s\", line %d" msgstr "ungültige Syntax in Zeitzonendatei »%s«, Zeile %d" -#: utils/misc/tzparser.c:236 +#: utils/misc/tzparser.c:237 #, c-format msgid "time zone abbreviation \"%s\" is multiply defined" msgstr "Zeitzonenabkürzung »%s« ist mehrfach definiert" -#: utils/misc/tzparser.c:238 +#: utils/misc/tzparser.c:239 #, c-format msgid "Entry in time zone file \"%s\", line %d, conflicts with entry in file \"%s\", line %d." msgstr "Eintrag in Zeitzonendatei »%s«, Zeile %d, steht im Konflikt mit Eintrag in Datei »%s«, Zeile %d." -#: utils/misc/tzparser.c:300 +#: utils/misc/tzparser.c:301 #, c-format msgid "invalid time zone file name \"%s\"" msgstr "ungültiger Zeitzonen-Dateiname »%s«" -#: utils/misc/tzparser.c:313 +#: utils/misc/tzparser.c:314 #, c-format msgid "time zone file recursion limit exceeded in file \"%s\"" msgstr "Rekursionsbeschränkung für Zeitzonendatei überschritten in Datei »%s«" -#: utils/misc/tzparser.c:352 utils/misc/tzparser.c:365 +#: utils/misc/tzparser.c:353 utils/misc/tzparser.c:366 #, c-format msgid "could not read time zone file \"%s\": %m" msgstr "konnte Zeitzonendatei »%s« nicht lesen: %m" -#: utils/misc/tzparser.c:376 +#: utils/misc/tzparser.c:377 #, c-format msgid "line is too long in time zone file \"%s\", line %d" msgstr "Zeile ist zu lang in Zeitzonendatei »%s«, Zeile %d" -#: utils/misc/tzparser.c:400 +#: utils/misc/tzparser.c:401 #, c-format msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "@INCLUDE ohne Dateiname in Zeitzonendatei »%s«, Zeile %d" -#: utils/mmgr/aset.c:446 utils/mmgr/generation.c:206 utils/mmgr/slab.c:367 +#: utils/mmgr/aset.c:452 utils/mmgr/bump.c:184 utils/mmgr/generation.c:216 +#: utils/mmgr/slab.c:371 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Fehler während der Erzeugung des Speicherkontexts »%s«." -#: utils/mmgr/dsa.c:531 utils/mmgr/dsa.c:1341 +#: utils/mmgr/dsa.c:523 utils/mmgr/dsa.c:1364 #, c-format msgid "could not attach to dynamic shared area" msgstr "konnte nicht an dynamische Shared Area anbinden" -#: utils/mmgr/mcxt.c:1047 utils/mmgr/mcxt.c:1083 utils/mmgr/mcxt.c:1121 -#: utils/mmgr/mcxt.c:1159 utils/mmgr/mcxt.c:1247 utils/mmgr/mcxt.c:1278 -#: utils/mmgr/mcxt.c:1314 utils/mmgr/mcxt.c:1503 utils/mmgr/mcxt.c:1548 -#: utils/mmgr/mcxt.c:1605 +#: utils/mmgr/mcxt.c:1155 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "Fehler bei Anfrage mit Größe %zu im Speicherkontext »%s«." -#: utils/mmgr/mcxt.c:1210 +#: utils/mmgr/mcxt.c:1299 #, c-format msgid "logging memory contexts of PID %d" msgstr "logge Speicherkontexte von PID %d" -#: utils/mmgr/portalmem.c:188 +#: utils/mmgr/portalmem.c:187 #, c-format msgid "cursor \"%s\" already exists" msgstr "Cursor »%s« existiert bereits" -#: utils/mmgr/portalmem.c:192 +#: utils/mmgr/portalmem.c:191 #, c-format msgid "closing existing cursor \"%s\"" msgstr "bestehender Cursor »%s« wird geschlossen" -#: utils/mmgr/portalmem.c:402 +#: utils/mmgr/portalmem.c:401 #, c-format msgid "portal \"%s\" cannot be run" msgstr "Portal »%s« kann nicht ausgeführt werden" -#: utils/mmgr/portalmem.c:480 +#: utils/mmgr/portalmem.c:479 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "gepinntes Portal »%s« kann nicht gelöscht werden" -#: utils/mmgr/portalmem.c:488 +#: utils/mmgr/portalmem.c:487 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "aktives Portal »%s« kann nicht gelöscht werden" -#: utils/mmgr/portalmem.c:739 +#: utils/mmgr/portalmem.c:738 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "PREPARE kann nicht in einer Transaktion ausgeführt werden, die einen Cursor mit WITH HOLD erzeugt hat" -#: utils/mmgr/portalmem.c:1230 +#: utils/mmgr/portalmem.c:1232 #, c-format msgid "cannot perform transaction commands inside a cursor loop that is not read-only" msgstr "in einer Cursor-Schleife, die nicht nur liest, können keine Transaktionsbefehle ausgeführt werden" #: utils/sort/logtape.c:266 utils/sort/logtape.c:287 #, c-format -msgid "could not seek to block %ld of temporary file" -msgstr "konnte Positionszeiger in temporärer Datei nicht auf Block %ld setzen" +msgid "could not seek to block %lld of temporary file" +msgstr "konnte Positionszeiger in temporärer Datei nicht auf Block %lld setzen" -#: utils/sort/sharedtuplestore.c:467 +#: utils/sort/sharedtuplestore.c:466 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "unerwarteter Chunk in temporärer Datei für Shared-Tuplestore" -#: utils/sort/sharedtuplestore.c:549 +#: utils/sort/sharedtuplestore.c:548 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "konnte Positionszeiger in temporärer Datei für Shared-Tuplestore nicht auf Block %u setzen" @@ -29836,17 +31009,17 @@ msgstr "konnte Positionszeiger in temporärer Datei für Shared-Tuplestore nicht msgid "cannot have more than %d runs for an external sort" msgstr "ein externer Sortiervorgang kann nicht mehr als %d Durchgänge haben" -#: utils/sort/tuplesortvariants.c:1363 +#: utils/sort/tuplesortvariants.c:1552 #, c-format msgid "could not create unique index \"%s\"" msgstr "konnte Unique Index »%s« nicht erstellen" -#: utils/sort/tuplesortvariants.c:1365 +#: utils/sort/tuplesortvariants.c:1554 #, c-format msgid "Key %s is duplicated." msgstr "Schlüssel %s ist doppelt vorhanden." -#: utils/sort/tuplesortvariants.c:1366 +#: utils/sort/tuplesortvariants.c:1555 #, c-format msgid "Duplicate keys exist." msgstr "Es existieren doppelte Schlüssel." @@ -29860,52 +31033,57 @@ msgstr "Es existieren doppelte Schlüssel." msgid "could not seek in tuplestore temporary file" msgstr "konnte Positionszeiger in temporärer Datei für Tuplestore nicht setzen" -#: utils/time/snapmgr.c:571 +#: utils/time/snapmgr.c:536 #, c-format msgid "The source transaction is not running anymore." msgstr "Die Quelltransaktion läuft nicht mehr." -#: utils/time/snapmgr.c:1166 +#: utils/time/snapmgr.c:1136 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "aus einer Subtransaktion kann kein Snapshot exportiert werden" -#: utils/time/snapmgr.c:1325 utils/time/snapmgr.c:1330 -#: utils/time/snapmgr.c:1335 utils/time/snapmgr.c:1350 -#: utils/time/snapmgr.c:1355 utils/time/snapmgr.c:1360 -#: utils/time/snapmgr.c:1375 utils/time/snapmgr.c:1380 -#: utils/time/snapmgr.c:1385 utils/time/snapmgr.c:1487 -#: utils/time/snapmgr.c:1503 utils/time/snapmgr.c:1528 +#: utils/time/snapmgr.c:1296 utils/time/snapmgr.c:1301 +#: utils/time/snapmgr.c:1306 utils/time/snapmgr.c:1321 +#: utils/time/snapmgr.c:1326 utils/time/snapmgr.c:1331 +#: utils/time/snapmgr.c:1346 utils/time/snapmgr.c:1351 +#: utils/time/snapmgr.c:1356 utils/time/snapmgr.c:1470 +#: utils/time/snapmgr.c:1486 utils/time/snapmgr.c:1511 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "ungültige Snapshot-Daten in Datei »%s«" -#: utils/time/snapmgr.c:1422 +#: utils/time/snapmgr.c:1393 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "SET TRANSACTION SNAPSHOT muss vor allen Anfragen aufgerufen werden" -#: utils/time/snapmgr.c:1431 +#: utils/time/snapmgr.c:1402 #, c-format msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" msgstr "eine Snapshot-importierende Transaktion muss Isolationsgrad SERIALIZABLE oder REPEATABLE READ haben" -#: utils/time/snapmgr.c:1440 utils/time/snapmgr.c:1449 +#: utils/time/snapmgr.c:1411 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "ungültiger Snapshot-Bezeichner: »%s«" -#: utils/time/snapmgr.c:1541 +#: utils/time/snapmgr.c:1426 +#, c-format +msgid "snapshot \"%s\" does not exist" +msgstr "Snapshot »%s« existiert nicht" + +#: utils/time/snapmgr.c:1524 #, c-format msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" msgstr "eine serialisierbare Transaktion kann keinen Snapshot aus einer nicht-serialisierbaren Transaktion importieren" -#: utils/time/snapmgr.c:1545 +#: utils/time/snapmgr.c:1528 #, c-format msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" msgstr "eine serialisierbare Transaktion, die nicht im Read-Only-Modus ist, kann keinen Snapshot aus einer Read-Only-Transaktion importieren" -#: utils/time/snapmgr.c:1560 +#: utils/time/snapmgr.c:1543 #, c-format msgid "cannot import a snapshot from a different database" msgstr "kann keinen Snapshot aus einer anderen Datenbank importieren" diff --git a/src/backend/po/es.po b/src/backend/po/es.po index e50a93503364a..e2593b522719a 100644 --- a/src/backend/po/es.po +++ b/src/backend/po/es.po @@ -12,6 +12,7 @@ # Glosario: # # character carácter +# checkpoint checkpoint # checksum suma de verificación # cluster (de la orden cluster) reordenar # command orden @@ -23,8 +24,8 @@ # lexeme lexema # locale configuración regional # to lock bloquear -# lock (sustantivo) candado -# to obtain a lock bloquear un candado +# lock (sustantivo) “lock†+# to obtain a lock bloquear un “lock†# malformed mal formado # mapping mapeo # operator class clase de operadores @@ -42,7 +43,8 @@ # rule regla de reescritura # schema esquema # to skip ignorar -# trigger disparador +# trigger “trigger†+# wait event “wait event†# window function función de ventana deslizante # # FIXME varios: @@ -60,10 +62,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL server 15\n" +"Project-Id-Version: PostgreSQL server 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-09 09:10+0000\n" -"PO-Revision-Date: 2022-11-04 13:18+0100\n" +"POT-Creation-Date: 2025-02-16 19:41+0000\n" +"PO-Revision-Date: 2025-02-17 15:18+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -73,6 +75,11 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: BlackCAT 1.1\n" +#: ../common/binaryheap.c:121 ../common/binaryheap.c:159 +#, c-format +msgid "out of binary heap slots" +msgstr "se acabaron los slots de “binary heapâ€" + #: ../common/compression.c:132 ../common/compression.c:141 #: ../common/compression.c:150 #, c-format @@ -99,10 +106,9 @@ msgid "value for compression option \"%s\" must be an integer" msgstr "el valor para la opción de compresión «%s» debe ser un entero" #: ../common/compression.c:331 -#, fuzzy, c-format -#| msgid "value for compression option \"%s\" must be an integer" -msgid "value for compression option \"%s\" must be a boolean" -msgstr "el valor para la opción de compresión «%s» debe ser un entero" +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "el valor para la opción de compresión «%s» debe ser un booleano" #: ../common/compression.c:379 #, c-format @@ -120,10 +126,9 @@ msgid "compression algorithm \"%s\" does not accept a worker count" msgstr "el algoritmo de compresión «%s» no acepta una cantidad de procesos ayudantes" #: ../common/compression.c:408 -#, fuzzy, c-format -#| msgid "compression algorithm \"%s\" does not accept a worker count" +#, c-format msgid "compression algorithm \"%s\" does not support long-distance mode" -msgstr "el algoritmo de compresión «%s» no acepta una cantidad de procesos ayudantes" +msgstr "el algoritmo de compresión «%s» no acepta modo de larga distancia" #: ../common/config_info.c:134 ../common/config_info.c:142 #: ../common/config_info.c:150 ../common/config_info.c:158 @@ -132,64 +137,66 @@ msgstr "el algoritmo de compresión «%s» no acepta una cantidad de procesos ay msgid "not recorded" msgstr "no registrado" -#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 -#: commands/copyfrom.c:1669 commands/extension.c:3456 utils/adt/genfile.c:123 +#: ../common/controldata_utils.c:93 ../common/controldata_utils.c:97 +#: commands/copyfrom.c:1739 commands/extension.c:3538 utils/adt/genfile.c:123 +#: utils/time/snapmgr.c:1430 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "no se pudo abrir archivo «%s» para lectura: %m" -#: ../common/controldata_utils.c:84 ../common/controldata_utils.c:86 +#: ../common/controldata_utils.c:108 ../common/controldata_utils.c:110 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1346 access/transam/xlog.c:3193 -#: access/transam/xlog.c:3996 access/transam/xlogrecovery.c:1199 -#: access/transam/xlogrecovery.c:1291 access/transam/xlogrecovery.c:1328 -#: access/transam/xlogrecovery.c:1388 backup/basebackup.c:1842 -#: commands/extension.c:3466 libpq/hba.c:791 replication/logical/origin.c:745 -#: replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5050 -#: replication/logical/snapbuild.c:2027 replication/slot.c:1946 -#: replication/slot.c:1987 replication/walsender.c:643 -#: storage/file/buffile.c:471 storage/file/copydir.c:185 -#: utils/adt/genfile.c:197 utils/adt/misc.c:984 utils/cache/relmapper.c:827 +#: access/transam/twophase.c:1353 access/transam/xlog.c:3477 +#: access/transam/xlog.c:4341 access/transam/xlogrecovery.c:1238 +#: access/transam/xlogrecovery.c:1336 access/transam/xlogrecovery.c:1373 +#: access/transam/xlogrecovery.c:1440 backup/basebackup.c:2123 +#: backup/walsummary.c:283 commands/extension.c:3548 libpq/hba.c:764 +#: replication/logical/origin.c:745 replication/logical/origin.c:781 +#: replication/logical/reorderbuffer.c:5113 +#: replication/logical/snapbuild.c:2052 replication/slot.c:2236 +#: replication/slot.c:2277 replication/walsender.c:655 +#: storage/file/buffile.c:470 storage/file/copydir.c:185 +#: utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 #, c-format msgid "could not read file \"%s\": %m" msgstr "no se pudo leer el archivo «%s»: %m" -#: ../common/controldata_utils.c:92 ../common/controldata_utils.c:95 -#: access/transam/xlog.c:3198 access/transam/xlog.c:4001 -#: backup/basebackup.c:1846 replication/logical/origin.c:750 -#: replication/logical/origin.c:789 replication/logical/snapbuild.c:2032 -#: replication/slot.c:1950 replication/slot.c:1991 replication/walsender.c:648 -#: utils/cache/relmapper.c:831 +#: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 +#: access/transam/xlog.c:3482 access/transam/xlog.c:4346 +#: replication/logical/origin.c:750 replication/logical/origin.c:789 +#: replication/logical/snapbuild.c:2057 replication/slot.c:2240 +#: replication/slot.c:2281 replication/walsender.c:660 +#: utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu" -#: ../common/controldata_utils.c:104 ../common/controldata_utils.c:108 -#: ../common/controldata_utils.c:233 ../common/controldata_utils.c:236 -#: access/heap/rewriteheap.c:1175 access/heap/rewriteheap.c:1280 +#: ../common/controldata_utils.c:128 ../common/controldata_utils.c:132 +#: ../common/controldata_utils.c:277 ../common/controldata_utils.c:280 +#: access/heap/rewriteheap.c:1141 access/heap/rewriteheap.c:1246 #: access/transam/timeline.c:392 access/transam/timeline.c:438 -#: access/transam/timeline.c:512 access/transam/twophase.c:1358 -#: access/transam/twophase.c:1770 access/transam/xlog.c:3039 -#: access/transam/xlog.c:3233 access/transam/xlog.c:3238 -#: access/transam/xlog.c:3374 access/transam/xlog.c:3966 -#: access/transam/xlog.c:4885 commands/copyfrom.c:1729 commands/copyto.c:332 +#: access/transam/timeline.c:512 access/transam/twophase.c:1365 +#: access/transam/twophase.c:1784 access/transam/xlog.c:3323 +#: access/transam/xlog.c:3517 access/transam/xlog.c:3522 +#: access/transam/xlog.c:3658 access/transam/xlog.c:4311 +#: access/transam/xlog.c:5246 commands/copyfrom.c:1799 commands/copyto.c:325 #: libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 #: replication/logical/origin.c:683 replication/logical/origin.c:822 -#: replication/logical/reorderbuffer.c:5102 -#: replication/logical/snapbuild.c:1798 replication/logical/snapbuild.c:1922 -#: replication/slot.c:1837 replication/slot.c:1998 replication/walsender.c:658 -#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:739 -#: storage/file/fd.c:3650 storage/file/fd.c:3756 utils/cache/relmapper.c:839 -#: utils/cache/relmapper.c:945 +#: replication/logical/reorderbuffer.c:5165 +#: replication/logical/snapbuild.c:1819 replication/logical/snapbuild.c:1943 +#: replication/slot.c:2126 replication/slot.c:2288 replication/walsender.c:670 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:828 +#: storage/file/fd.c:3753 storage/file/fd.c:3859 utils/cache/relmapper.c:841 +#: utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" msgstr "no se pudo cerrar el archivo «%s»: %m" -#: ../common/controldata_utils.c:124 +#: ../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "discordancia en orden de bytes" -#: ../common/controldata_utils.c:126 +#: ../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -203,144 +210,157 @@ msgstr "" "serían erróneos, y la instalación de PostgreSQL sería incompatible con este\n" "directorio de datos." -#: ../common/controldata_utils.c:181 ../common/controldata_utils.c:186 -#: ../common/file_utils.c:228 ../common/file_utils.c:287 -#: ../common/file_utils.c:361 access/heap/rewriteheap.c:1263 -#: access/transam/timeline.c:111 access/transam/timeline.c:251 -#: access/transam/timeline.c:348 access/transam/twophase.c:1302 -#: access/transam/xlog.c:2946 access/transam/xlog.c:3109 -#: access/transam/xlog.c:3148 access/transam/xlog.c:3341 -#: access/transam/xlog.c:3986 access/transam/xlogrecovery.c:4179 -#: access/transam/xlogrecovery.c:4282 access/transam/xlogutils.c:838 -#: backup/basebackup.c:538 backup/basebackup.c:1512 libpq/hba.c:651 -#: postmaster/syslogger.c:1560 replication/logical/origin.c:735 -#: replication/logical/reorderbuffer.c:3706 -#: replication/logical/reorderbuffer.c:4257 -#: replication/logical/reorderbuffer.c:5030 -#: replication/logical/snapbuild.c:1753 replication/logical/snapbuild.c:1863 -#: replication/slot.c:1918 replication/walsender.c:616 -#: replication/walsender.c:2731 storage/file/copydir.c:151 -#: storage/file/fd.c:714 storage/file/fd.c:3407 storage/file/fd.c:3637 -#: storage/file/fd.c:3727 storage/smgr/md.c:660 utils/cache/relmapper.c:816 -#: utils/cache/relmapper.c:924 utils/error/elog.c:2082 -#: utils/init/miscinit.c:1530 utils/init/miscinit.c:1664 -#: utils/init/miscinit.c:1741 utils/misc/guc.c:4599 utils/misc/guc.c:4649 +#: ../common/controldata_utils.c:225 ../common/controldata_utils.c:230 +#: ../common/file_utils.c:70 ../common/file_utils.c:347 +#: ../common/file_utils.c:406 ../common/file_utils.c:480 +#: access/heap/rewriteheap.c:1229 access/transam/timeline.c:111 +#: access/transam/timeline.c:251 access/transam/timeline.c:348 +#: access/transam/twophase.c:1309 access/transam/xlog.c:3230 +#: access/transam/xlog.c:3393 access/transam/xlog.c:3432 +#: access/transam/xlog.c:3625 access/transam/xlog.c:4331 +#: access/transam/xlogrecovery.c:4264 access/transam/xlogrecovery.c:4367 +#: access/transam/xlogutils.c:836 backup/basebackup.c:547 +#: backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:624 +#: postmaster/syslogger.c:1511 replication/logical/origin.c:735 +#: replication/logical/reorderbuffer.c:3766 +#: replication/logical/reorderbuffer.c:4320 +#: replication/logical/reorderbuffer.c:5093 +#: replication/logical/snapbuild.c:1774 replication/logical/snapbuild.c:1884 +#: replication/slot.c:2208 replication/walsender.c:628 +#: replication/walsender.c:3051 storage/file/copydir.c:151 +#: storage/file/fd.c:803 storage/file/fd.c:3510 storage/file/fd.c:3740 +#: storage/file/fd.c:3830 storage/smgr/md.c:661 utils/cache/relmapper.c:818 +#: utils/cache/relmapper.c:935 utils/error/elog.c:2124 +#: utils/init/miscinit.c:1580 utils/init/miscinit.c:1714 +#: utils/init/miscinit.c:1791 utils/misc/guc.c:4777 utils/misc/guc.c:4827 #, c-format msgid "could not open file \"%s\": %m" msgstr "no se pudo abrir el archivo «%s»: %m" -#: ../common/controldata_utils.c:202 ../common/controldata_utils.c:205 -#: access/transam/twophase.c:1743 access/transam/twophase.c:1752 -#: access/transam/xlog.c:8751 access/transam/xlogfuncs.c:707 -#: backup/basebackup_server.c:175 backup/basebackup_server.c:268 -#: postmaster/postmaster.c:5570 postmaster/syslogger.c:1571 -#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 -#: utils/cache/relmapper.c:936 +#: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 +#: access/transam/twophase.c:1757 access/transam/twophase.c:1766 +#: access/transam/xlog.c:9280 access/transam/xlogfuncs.c:698 +#: backup/basebackup_server.c:173 backup/basebackup_server.c:266 +#: backup/walsummary.c:304 postmaster/postmaster.c:4127 +#: postmaster/syslogger.c:1522 postmaster/syslogger.c:1535 +#: postmaster/syslogger.c:1548 utils/cache/relmapper.c:947 #, c-format msgid "could not write file \"%s\": %m" msgstr "no se pudo escribir el archivo «%s»: %m" -#: ../common/controldata_utils.c:219 ../common/controldata_utils.c:224 -#: ../common/file_utils.c:299 ../common/file_utils.c:369 -#: access/heap/rewriteheap.c:959 access/heap/rewriteheap.c:1169 -#: access/heap/rewriteheap.c:1274 access/transam/timeline.c:432 -#: access/transam/timeline.c:506 access/transam/twophase.c:1764 -#: access/transam/xlog.c:3032 access/transam/xlog.c:3227 -#: access/transam/xlog.c:3959 access/transam/xlog.c:8141 -#: access/transam/xlog.c:8186 backup/basebackup_server.c:209 -#: replication/logical/snapbuild.c:1791 replication/slot.c:1823 -#: replication/slot.c:1928 storage/file/fd.c:731 storage/file/fd.c:3748 -#: storage/smgr/md.c:1132 storage/smgr/md.c:1177 storage/sync/sync.c:453 -#: utils/misc/guc.c:4369 +#: ../common/controldata_utils.c:263 ../common/controldata_utils.c:268 +#: ../common/file_utils.c:418 ../common/file_utils.c:488 +#: access/heap/rewriteheap.c:925 access/heap/rewriteheap.c:1135 +#: access/heap/rewriteheap.c:1240 access/transam/timeline.c:432 +#: access/transam/timeline.c:506 access/transam/twophase.c:1778 +#: access/transam/xlog.c:3316 access/transam/xlog.c:3511 +#: access/transam/xlog.c:4304 access/transam/xlog.c:8655 +#: access/transam/xlog.c:8700 backup/basebackup_server.c:207 +#: commands/dbcommands.c:514 replication/logical/snapbuild.c:1812 +#: replication/slot.c:2112 replication/slot.c:2218 storage/file/fd.c:820 +#: storage/file/fd.c:3851 storage/smgr/md.c:1331 storage/smgr/md.c:1376 +#: storage/sync/sync.c:446 utils/misc/guc.c:4530 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" -#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:133 -#: ../common/cryptohash_openssl.c:332 ../common/exec.c:550 ../common/exec.c:595 -#: ../common/exec.c:687 ../common/hmac.c:309 ../common/hmac.c:325 -#: ../common/hmac_openssl.c:132 ../common/hmac_openssl.c:327 -#: ../common/md5_common.c:155 ../common/psprintf.c:143 -#: ../common/scram-common.c:258 ../common/stringinfo.c:305 ../port/path.c:751 -#: ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1411 -#: access/transam/xlogrecovery.c:589 lib/dshash.c:253 libpq/auth.c:1345 -#: libpq/auth.c:1389 libpq/auth.c:1946 libpq/be-secure-gssapi.c:524 -#: postmaster/bgworker.c:352 postmaster/bgworker.c:934 -#: postmaster/postmaster.c:2534 postmaster/postmaster.c:4127 -#: postmaster/postmaster.c:5495 postmaster/postmaster.c:5866 -#: replication/libpqwalreceiver/libpqwalreceiver.c:308 -#: replication/logical/logical.c:208 replication/walsender.c:686 -#: storage/buffer/localbuf.c:601 storage/file/fd.c:823 storage/file/fd.c:1354 -#: storage/file/fd.c:1515 storage/file/fd.c:2428 storage/ipc/procarray.c:1449 -#: storage/ipc/procarray.c:2232 storage/ipc/procarray.c:2239 -#: storage/ipc/procarray.c:2738 storage/ipc/procarray.c:3374 -#: utils/adt/formatting.c:1690 utils/adt/formatting.c:1812 -#: utils/adt/formatting.c:1935 utils/adt/pg_locale.c:469 -#: utils/adt/pg_locale.c:633 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:514 -#: utils/hash/dynahash.c:614 utils/hash/dynahash.c:1111 utils/mb/mbutils.c:402 -#: utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 utils/mb/mbutils.c:842 -#: utils/misc/guc.c:639 utils/misc/guc.c:664 utils/misc/guc.c:1052 -#: utils/misc/guc.c:4347 utils/misc/tzparser.c:476 utils/mmgr/aset.c:445 -#: utils/mmgr/dsa.c:713 utils/mmgr/dsa.c:735 utils/mmgr/dsa.c:816 -#: utils/mmgr/generation.c:205 utils/mmgr/mcxt.c:1046 utils/mmgr/mcxt.c:1082 -#: utils/mmgr/mcxt.c:1120 utils/mmgr/mcxt.c:1158 utils/mmgr/mcxt.c:1246 -#: utils/mmgr/mcxt.c:1277 utils/mmgr/mcxt.c:1313 utils/mmgr/mcxt.c:1502 -#: utils/mmgr/mcxt.c:1547 utils/mmgr/mcxt.c:1604 utils/mmgr/slab.c:366 +#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:158 +#: ../common/cryptohash_openssl.c:356 ../common/exec.c:562 ../common/exec.c:607 +#: ../common/exec.c:699 ../common/hmac.c:309 ../common/hmac.c:325 +#: ../common/hmac_openssl.c:160 ../common/hmac_openssl.c:357 +#: ../common/md5_common.c:156 ../common/parse_manifest.c:157 +#: ../common/parse_manifest.c:852 ../common/psprintf.c:143 +#: ../common/scram-common.c:268 ../common/stringinfo.c:314 ../port/path.c:828 +#: ../port/path.c:865 ../port/path.c:882 access/transam/twophase.c:1418 +#: access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1352 +#: libpq/auth.c:1396 libpq/auth.c:1953 libpq/be-secure-gssapi.c:524 +#: postmaster/bgworker.c:355 postmaster/bgworker.c:945 +#: postmaster/postmaster.c:3560 postmaster/postmaster.c:4021 +#: postmaster/postmaster.c:4383 postmaster/walsummarizer.c:935 +#: replication/libpqwalreceiver/libpqwalreceiver.c:387 +#: replication/logical/logical.c:210 replication/walsender.c:835 +#: storage/buffer/localbuf.c:606 storage/file/fd.c:912 storage/file/fd.c:1443 +#: storage/file/fd.c:1604 storage/file/fd.c:2531 storage/ipc/procarray.c:1465 +#: storage/ipc/procarray.c:2219 storage/ipc/procarray.c:2226 +#: storage/ipc/procarray.c:2731 storage/ipc/procarray.c:3435 +#: utils/adt/formatting.c:1725 utils/adt/formatting.c:1873 +#: utils/adt/formatting.c:2075 utils/adt/pg_locale.c:532 +#: utils/adt/pg_locale.c:696 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:516 +#: utils/hash/dynahash.c:616 utils/hash/dynahash.c:1099 utils/mb/mbutils.c:401 +#: utils/mb/mbutils.c:429 utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 +#: utils/misc/guc.c:649 utils/misc/guc.c:674 utils/misc/guc.c:1062 +#: utils/misc/guc.c:4508 utils/misc/tzparser.c:477 utils/mmgr/aset.c:451 +#: utils/mmgr/bump.c:183 utils/mmgr/dsa.c:707 utils/mmgr/dsa.c:729 +#: utils/mmgr/dsa.c:810 utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1154 +#: utils/mmgr/slab.c:370 #, c-format msgid "out of memory" msgstr "memoria agotada" #: ../common/cryptohash.c:266 ../common/cryptohash.c:272 -#: ../common/cryptohash_openssl.c:344 ../common/cryptohash_openssl.c:352 -#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:339 -#: ../common/hmac_openssl.c:347 +#: ../common/cryptohash_openssl.c:368 ../common/cryptohash_openssl.c:376 +#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:369 +#: ../common/hmac_openssl.c:377 msgid "success" msgstr "éxito" -#: ../common/cryptohash.c:268 ../common/cryptohash_openssl.c:346 -#: ../common/hmac_openssl.c:341 +#: ../common/cryptohash.c:268 ../common/cryptohash_openssl.c:370 +#: ../common/hmac_openssl.c:371 msgid "destination buffer too small" msgstr "el búfer de destino es demasiado pequeño" -#: ../common/cryptohash_openssl.c:348 ../common/hmac_openssl.c:343 +#: ../common/cryptohash_openssl.c:372 ../common/hmac_openssl.c:373 msgid "OpenSSL failure" msgstr "falla de openSSL" -#: ../common/exec.c:172 -#, fuzzy, c-format -#| msgid "invalid binary \"%s\"" +#: ../common/exec.c:174 +#, c-format msgid "invalid binary \"%s\": %m" -msgstr "el binario «%s» no es válido" +msgstr "binario «%s» no válido: %m" -#: ../common/exec.c:215 -#, fuzzy, c-format -#| msgid "could not read binary \"%s\"" +#: ../common/exec.c:217 +#, c-format msgid "could not read binary \"%s\": %m" -msgstr "no se pudo leer el binario «%s»" +msgstr "no se pudo leer el binario «%s»: %m" -#: ../common/exec.c:223 +#: ../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "no se pudo encontrar un «%s» para ejecutar" -#: ../common/exec.c:250 -#, fuzzy, c-format -#| msgid "could not reopen file \"%s\" as stderr: %m" +#: ../common/exec.c:252 +#, c-format msgid "could not resolve path \"%s\" to absolute form: %m" -msgstr "no se pudo reabrir «%s» para error estándar: %m" +msgstr "no se pudo resolver la ruta «%s» a forma absoluta: %m" + +#: ../common/exec.c:382 commands/collationcmds.c:876 commands/copyfrom.c:1723 +#: commands/copyto.c:654 libpq/be-secure-common.c:59 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "no se pudo ejecutar la orden «%s»: %m" + +#: ../common/exec.c:394 libpq/be-secure-common.c:71 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "no se pudo leer desde la orden «%s»: %m" + +#: ../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "la orden «%s» no retornó datos" -#: ../common/exec.c:412 libpq/pqcomm.c:728 storage/ipc/latch.c:1128 -#: storage/ipc/latch.c:1308 storage/ipc/latch.c:1541 storage/ipc/latch.c:1703 -#: storage/ipc/latch.c:1829 +#: ../common/exec.c:424 libpq/pqcomm.c:192 storage/ipc/latch.c:1169 +#: storage/ipc/latch.c:1349 storage/ipc/latch.c:1589 storage/ipc/latch.c:1751 +#: storage/ipc/latch.c:1877 #, c-format msgid "%s() failed: %m" msgstr "%s() falló: %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 #: ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 -#: ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 -#: ../port/path.c:808 utils/misc/ps_status.c:168 utils/misc/ps_status.c:176 -#: utils/misc/ps_status.c:203 utils/misc/ps_status.c:211 +#: ../common/psprintf.c:145 ../port/path.c:830 ../port/path.c:867 +#: ../port/path.c:884 utils/misc/ps_status.c:193 utils/misc/ps_status.c:201 +#: utils/misc/ps_status.c:228 utils/misc/ps_status.c:236 #, c-format msgid "out of memory\n" msgstr "memoria agotada\n" @@ -350,39 +370,51 @@ msgstr "memoria agotada\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "no se puede duplicar un puntero nulo (error interno)\n" -#: ../common/file_utils.c:87 ../common/file_utils.c:447 -#: ../common/file_utils.c:451 access/transam/twophase.c:1314 -#: access/transam/xlogarchive.c:112 access/transam/xlogarchive.c:229 -#: backup/basebackup.c:346 backup/basebackup.c:544 backup/basebackup.c:615 -#: commands/copyfrom.c:1679 commands/copyto.c:702 commands/extension.c:3445 -#: commands/tablespace.c:810 commands/tablespace.c:899 postmaster/pgarch.c:590 -#: replication/logical/snapbuild.c:1649 storage/file/fd.c:1879 -#: storage/file/fd.c:1965 storage/file/fd.c:3461 utils/adt/dbsize.c:106 -#: utils/adt/dbsize.c:258 utils/adt/dbsize.c:338 utils/adt/genfile.c:483 -#: utils/adt/genfile.c:658 utils/adt/misc.c:340 +#: ../common/file_utils.c:76 storage/file/fd.c:3516 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" + +#: ../common/file_utils.c:120 ../common/file_utils.c:566 +#: ../common/file_utils.c:570 access/transam/twophase.c:1321 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 +#: backup/basebackup.c:355 backup/basebackup.c:553 backup/basebackup.c:624 +#: backup/walsummary.c:247 backup/walsummary.c:254 commands/copyfrom.c:1749 +#: commands/copyto.c:700 commands/extension.c:3527 commands/tablespace.c:804 +#: commands/tablespace.c:893 postmaster/pgarch.c:680 +#: replication/logical/snapbuild.c:1670 replication/logical/snapbuild.c:2173 +#: storage/file/fd.c:1968 storage/file/fd.c:2054 storage/file/fd.c:3564 +#: utils/adt/dbsize.c:105 utils/adt/dbsize.c:257 utils/adt/dbsize.c:337 +#: utils/adt/genfile.c:437 utils/adt/genfile.c:612 utils/adt/misc.c:340 #, c-format msgid "could not stat file \"%s\": %m" msgstr "no se pudo hacer stat al archivo «%s»: %m" -#: ../common/file_utils.c:162 ../common/pgfnames.c:48 ../common/rmtree.c:63 -#: commands/tablespace.c:734 commands/tablespace.c:744 -#: postmaster/postmaster.c:1561 storage/file/fd.c:2830 -#: storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:338 +#: ../common/file_utils.c:130 ../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "esta instalación no soporta el método de sync «%s»" + +#: ../common/file_utils.c:151 ../common/file_utils.c:281 +#: ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 +#: commands/tablespace.c:738 postmaster/postmaster.c:1470 +#: storage/file/fd.c:2933 storage/file/reinit.c:126 utils/adt/misc.c:256 +#: utils/misc/tzparser.c:339 #, c-format msgid "could not open directory \"%s\": %m" msgstr "no se pudo abrir el directorio «%s»: %m" -#: ../common/file_utils.c:196 ../common/pgfnames.c:69 ../common/rmtree.c:104 -#: storage/file/fd.c:2842 +#: ../common/file_utils.c:169 ../common/file_utils.c:315 +#: ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2945 #, c-format msgid "could not read directory \"%s\": %m" msgstr "no se pudo leer el directorio «%s»: %m" -#: ../common/file_utils.c:379 access/transam/xlogarchive.c:383 -#: postmaster/pgarch.c:746 postmaster/syslogger.c:1608 -#: replication/logical/snapbuild.c:1810 replication/slot.c:723 -#: replication/slot.c:1709 replication/slot.c:1851 storage/file/fd.c:749 -#: utils/time/snapmgr.c:1284 +#: ../common/file_utils.c:498 access/transam/xlogarchive.c:389 +#: postmaster/pgarch.c:834 postmaster/syslogger.c:1559 +#: replication/logical/snapbuild.c:1831 replication/slot.c:936 +#: replication/slot.c:1998 replication/slot.c:2140 storage/file/fd.c:838 +#: utils/time/snapmgr.c:1255 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" @@ -391,91 +423,102 @@ msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" msgid "internal error" msgstr "error interno" -#: ../common/jsonapi.c:1144 +#: ../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "El parser recursivo descendiente no puede usar el lexer incremental." + +#: ../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "El parser incremental requiere el lexer incremental." + +#: ../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON anidado demasiado profundamente, profundidad máxima es 6400." + +#: ../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "La secuencia de escape «%s» no es válida." +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "La secuencia de escape «\\%.*s» no es válida." -#: ../common/jsonapi.c:1147 +#: ../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." -msgstr "Los caracteres con valor 0x%02x deben ser escapados" +msgstr "Los caracteres con valor 0x%02x deben ser escapados." -#: ../common/jsonapi.c:1150 +#: ../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "Se esperaba el fin de la entrada, se encontró «%s»." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "Se esperaba el fin de la entrada, se encontró «%.*s»." -#: ../common/jsonapi.c:1153 +#: ../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "Se esperaba un elemento de array o «]», se encontró «%s»." +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "Se esperaba un elemento de array o «]», se encontró «%.*s»." -#: ../common/jsonapi.c:1156 +#: ../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "Se esperaba «,» o «]», se encontró «%s»." +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "Se esperaba «,» o «]», se encontró «%.*s»." -#: ../common/jsonapi.c:1159 +#: ../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "Se esperaba «:», se encontró «%s»." +msgid "Expected \":\", but found \"%.*s\"." +msgstr "Se esperaba «:», se encontró «%.*s»." -#: ../common/jsonapi.c:1162 +#: ../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "Se esperaba un valor JSON, se encontró «%s»." +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "Se esperaba un valor JSON, se encontró «%.*s»." -#: ../common/jsonapi.c:1165 +#: ../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "La cadena de entrada terminó inesperadamente." -#: ../common/jsonapi.c:1167 +#: ../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "Se esperaba una cadena o «}», se encontró «%s»." +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "Se esperaba una cadena o «}», se encontró «%.*s»." -#: ../common/jsonapi.c:1170 +#: ../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "Se esperaba «,» o «}», se encontró «%s»." +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "Se esperaba «,» o «}», se encontró «%.*s»." -#: ../common/jsonapi.c:1173 +#: ../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "Se esperaba una cadena, se encontró «%s»." +msgid "Expected string, but found \"%.*s\"." +msgstr "Se esperaba una cadena, se encontró «%.*s»." -#: ../common/jsonapi.c:1176 +#: ../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "El elemento «%s» no es válido." +msgid "Token \"%.*s\" is invalid." +msgstr "El elemento «%.*s» no es válido." -#: ../common/jsonapi.c:1179 jsonpath_scan.l:597 +#: ../common/jsonapi.c:2164 jsonpath_scan.l:608 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 no puede ser convertido a text." -#: ../common/jsonapi.c:1181 +#: ../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "«\\u» debe ser seguido por cuatro dígitos hexadecimales." -#: ../common/jsonapi.c:1184 +#: ../common/jsonapi.c:2169 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Los valores de escape Unicode no se pueden utilizar para valores de código superiores a 007F cuando la codificación no es UTF8." -#: ../common/jsonapi.c:1187 -#, fuzzy, c-format -#| msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." +#: ../common/jsonapi.c:2178 +#, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." -msgstr "Los valores de escape Unicode no se pueden utilizar para valores de código superiores a 007F cuando la codificación no es UTF8." +msgstr "El valor de escape Unicode no pudo ser traducido a la codificación del servidor %s." -#: ../common/jsonapi.c:1190 jsonpath_scan.l:630 +#: ../common/jsonapi.c:2185 jsonpath_scan.l:641 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Un «high-surrogate» Unicode no puede venir después de un «high-surrogate»." -#: ../common/jsonapi.c:1192 jsonpath_scan.l:641 jsonpath_scan.l:651 -#: jsonpath_scan.l:702 +#: ../common/jsonapi.c:2187 jsonpath_scan.l:652 jsonpath_scan.l:662 +#: jsonpath_scan.l:713 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Un «low-surrogate» Unicode debe seguir a un «high-surrogate»." @@ -500,26 +543,181 @@ msgstr "detalle: " msgid "hint: " msgstr "consejo: " +#: ../common/parse_manifest.c:159 ../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "no se pudo inicializar la suma de verificación del manifiesto" + +#: ../common/parse_manifest.c:203 ../common/parse_manifest.c:260 +msgid "manifest ended unexpectedly" +msgstr "el manifiesto terminó inesperadamente" + +#: ../common/parse_manifest.c:209 ../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "no se pudo actualizar la suma de verificación del manifiesto" + +#: ../common/parse_manifest.c:301 +msgid "unexpected object start" +msgstr "inicio de objeto inesperado" + +#: ../common/parse_manifest.c:336 +msgid "unexpected object end" +msgstr "fin de objeto inesperado" + +#: ../common/parse_manifest.c:365 +msgid "unexpected array start" +msgstr "inicio de array inesperado" + +#: ../common/parse_manifest.c:390 +msgid "unexpected array end" +msgstr "fin de array inesperado" + +#: ../common/parse_manifest.c:417 +msgid "expected version indicator" +msgstr "se esperaba indicador de versión" + +#: ../common/parse_manifest.c:453 +msgid "unrecognized top-level field" +msgstr "campo de nivel superior no reconocido" + +#: ../common/parse_manifest.c:472 +msgid "unexpected file field" +msgstr "campo de archivo inesperado" + +#: ../common/parse_manifest.c:486 +msgid "unexpected WAL range field" +msgstr "campo de rango de WAL inesperado" + +#: ../common/parse_manifest.c:492 +msgid "unexpected object field" +msgstr "campo de objeto inesperado" + +#: ../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "escalar inesperado" + +#: ../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "la versión de manifiesto no es un número entero" + +#: ../common/parse_manifest.c:612 +msgid "unexpected manifest version" +msgstr "versión de manifiesto inesperada" + +#: ../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "el identificador de sistema en el manifiesto no es un número entero" + +#: ../common/parse_manifest.c:661 +msgid "missing path name" +msgstr "ruta de archivo faltante" + +#: ../common/parse_manifest.c:664 +msgid "both path name and encoded path name" +msgstr "hay ambos ruta de archivo (path name) y ruta codificada (encoded path name)" + +#: ../common/parse_manifest.c:666 +msgid "missing size" +msgstr "tamaño faltante" + +#: ../common/parse_manifest.c:669 +msgid "checksum without algorithm" +msgstr "suma de comprobación sin algoritmo" + +#: ../common/parse_manifest.c:683 +msgid "could not decode file name" +msgstr "no se pudo decodificar el nombre del archivo" + +#: ../common/parse_manifest.c:693 +msgid "file size is not an integer" +msgstr "el tamaño del archivo no es un número entero" + +#: ../common/parse_manifest.c:699 backup/basebackup.c:870 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "algoritmo de suma de comprobación no reconocido: \"%s\"" + +#: ../common/parse_manifest.c:718 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "suma de comprobación no válida para el archivo \"%s\": \"%s\"" + +#: ../common/parse_manifest.c:761 +msgid "missing timeline" +msgstr "falta el timeline" + +#: ../common/parse_manifest.c:763 +msgid "missing start LSN" +msgstr "falta el LSN de inicio" + +#: ../common/parse_manifest.c:765 +msgid "missing end LSN" +msgstr "falta el LSN de término" + +#: ../common/parse_manifest.c:771 +msgid "timeline is not an integer" +msgstr "el timeline no es un número entero" + +#: ../common/parse_manifest.c:774 +msgid "could not parse start LSN" +msgstr "no se pudo interpretar el LSN de inicio" + +#: ../common/parse_manifest.c:777 +msgid "could not parse end LSN" +msgstr "no se pudo interpretar el LSN de término" + +#: ../common/parse_manifest.c:842 +msgid "expected at least 2 lines" +msgstr "esperado al menos 2 líneas" + +#: ../common/parse_manifest.c:845 +msgid "last line not newline-terminated" +msgstr "última línea no termina en nueva línea" + +#: ../common/parse_manifest.c:864 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "no se pudo finalizar la suma de verificación del manifiesto" + +#: ../common/parse_manifest.c:868 +#, c-format +msgid "manifest has no checksum" +msgstr "el manifiesto no tiene suma de comprobación" + +#: ../common/parse_manifest.c:872 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "suma de comprobación de manifiesto no válida: \"%s\"" + +#: ../common/parse_manifest.c:876 +#, c-format +msgid "manifest checksum mismatch" +msgstr "discordancia en la suma de comprobación del manifiesto" + +#: ../common/parse_manifest.c:891 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "no se pudo analizar el manifiesto de la copia de seguridad: %s" + #: ../common/percentrepl.c:79 ../common/percentrepl.c:85 #: ../common/percentrepl.c:118 ../common/percentrepl.c:124 -#: postmaster/postmaster.c:2208 utils/misc/guc.c:3117 utils/misc/guc.c:3153 -#: utils/misc/guc.c:3223 utils/misc/guc.c:4546 utils/misc/guc.c:6845 -#: utils/misc/guc.c:6886 +#: tcop/backend_startup.c:741 utils/misc/guc.c:3167 utils/misc/guc.c:3208 +#: utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6931 +#: utils/misc/guc.c:6972 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "valor no válido para el parámetro «%s»: «%s»" #: ../common/percentrepl.c:80 ../common/percentrepl.c:86 -#, fuzzy, c-format -#| msgid "there is no escaped character: \"%s\"" +#, c-format msgid "String ends unexpectedly after escape character \"%%\"." -msgstr "no hay carácter escapado: «%s»" +msgstr "La cadena termina inesperadamente luego del carácter de escape: «%%»" #: ../common/percentrepl.c:119 ../common/percentrepl.c:125 -#, fuzzy, c-format -#| msgid "index \"%s\" contains unexpected zero page at block %u" -msgid "String contains unexpected escape sequence \"%c\"." -msgstr "índice «%s» contiene páginas vacías no esperadas en el bloque %u" +#, c-format +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "La cadena contiene la secuencia de reemplazo inesperada «%c»." #: ../common/pgfnames.c:74 #, c-format @@ -566,37 +764,45 @@ msgstr "no se pudo re-ejecutar con el token restringido: código de error %lu" msgid "could not get exit code from subprocess: error code %lu" msgstr "no se pudo obtener el código de salida del subproceso»: código de error %lu" -#: ../common/rmtree.c:95 -#, fuzzy, c-format -#| msgid "could not find file \"%s\": %m" -msgid "could not unlink file \"%s\": %m" -msgstr "no se pudo encontrar el archivo «%s»: %m" +#: ../common/rmtree.c:97 access/heap/rewriteheap.c:1214 +#: access/transam/twophase.c:1717 access/transam/xlogarchive.c:119 +#: access/transam/xlogarchive.c:399 postmaster/postmaster.c:1048 +#: postmaster/syslogger.c:1488 replication/logical/origin.c:591 +#: replication/logical/reorderbuffer.c:4589 +#: replication/logical/snapbuild.c:1712 replication/logical/snapbuild.c:2146 +#: replication/slot.c:2192 storage/file/fd.c:878 storage/file/fd.c:3378 +#: storage/file/fd.c:3440 storage/file/reinit.c:261 storage/ipc/dsm.c:343 +#: storage/smgr/md.c:381 storage/smgr/md.c:440 storage/sync/sync.c:243 +#: utils/time/snapmgr.c:1591 +#, c-format +msgid "could not remove file \"%s\": %m" +msgstr "no se pudo eliminar el archivo «%s»: %m" -#: ../common/rmtree.c:122 commands/tablespace.c:773 commands/tablespace.c:786 -#: commands/tablespace.c:821 commands/tablespace.c:911 storage/file/fd.c:3267 -#: storage/file/fd.c:3676 +#: ../common/rmtree.c:124 commands/tablespace.c:767 commands/tablespace.c:780 +#: commands/tablespace.c:815 commands/tablespace.c:905 storage/file/fd.c:3370 +#: storage/file/fd.c:3779 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "no se pudo eliminar el directorio «%s»: %m" -#: ../common/scram-common.c:271 +#: ../common/scram-common.c:281 msgid "could not encode salt" msgstr "no se pudo codificar la sal" -#: ../common/scram-common.c:287 +#: ../common/scram-common.c:297 msgid "could not encode stored key" msgstr "no se pudo codificar la llave almacenada" -#: ../common/scram-common.c:304 +#: ../common/scram-common.c:314 msgid "could not encode server key" msgstr "no se pudo codificar la llave del servidor" -#: ../common/stringinfo.c:306 +#: ../common/stringinfo.c:315 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." msgstr "No se puede agrandar el búfer de cadena que ya tiene %d bytes en %d bytes adicionales." -#: ../common/stringinfo.c:310 +#: ../common/stringinfo.c:319 #, c-format msgid "" "out of memory\n" @@ -612,7 +818,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "no se pudo encontrar el ID de usuario efectivo %ld: %s" -#: ../common/username.c:45 libpq/auth.c:1881 +#: ../common/username.c:45 libpq/auth.c:1888 msgid "user does not exist" msgstr "usuario no existe" @@ -704,22 +910,22 @@ msgstr "Reintentando durante 30 segundos." msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "Es posible que tenga antivirus, sistema de respaldos, o software similar interfiriendo con el sistema de bases de datos." -#: ../port/path.c:775 +#: ../port/path.c:852 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "no se pudo obtener el directorio de trabajo actual: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "no se pudo obtener el directorio de trabajo actual: %m\n" #: ../port/strerror.c:72 #, c-format msgid "operating system error %d" msgstr "error %d de sistema operativo" -#: ../port/thread.c:50 ../port/thread.c:86 +#: ../port/user.c:43 ../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "no se pudo buscar el usuario local de ID %d: %s" -#: ../port/thread.c:55 ../port/thread.c:91 +#: ../port/user.c:48 ../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "no existe un usuario local con ID %d" @@ -739,115 +945,104 @@ msgstr "no se pudo obtener el SID del grupo PowerUsers: código de error %lu\n" msgid "could not check access token membership: error code %lu\n" msgstr "no se pudo verificar el token de proceso: código de error %lu\n" -#: access/brin/brin.c:216 +#: access/brin/brin.c:405 #, c-format msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "petición para sumarización BRIN de rango para el índice «%s» página %u no fue registrada" -#: access/brin/brin.c:1025 access/brin/brin.c:1126 access/gin/ginfast.c:1035 -#: access/transam/xlogfuncs.c:189 access/transam/xlogfuncs.c:214 -#: access/transam/xlogfuncs.c:246 access/transam/xlogfuncs.c:285 -#: access/transam/xlogfuncs.c:306 access/transam/xlogfuncs.c:327 -#: access/transam/xlogfuncs.c:397 access/transam/xlogfuncs.c:455 +#: access/brin/brin.c:1385 access/brin/brin.c:1493 access/gin/ginfast.c:1040 +#: access/transam/xlogfuncs.c:183 access/transam/xlogfuncs.c:208 +#: access/transam/xlogfuncs.c:241 access/transam/xlogfuncs.c:280 +#: access/transam/xlogfuncs.c:301 access/transam/xlogfuncs.c:322 +#: access/transam/xlogfuncs.c:388 access/transam/xlogfuncs.c:446 #, c-format msgid "recovery is in progress" msgstr "la recuperación está en proceso" -#: access/brin/brin.c:1026 access/brin/brin.c:1127 +#: access/brin/brin.c:1386 access/brin/brin.c:1494 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "Las funciones de control de BRIN no pueden ejecutarse durante la recuperación." -#: access/brin/brin.c:1031 access/brin/brin.c:1132 +#: access/brin/brin.c:1391 access/brin/brin.c:1499 #, c-format msgid "block number out of range: %lld" msgstr "número de bloque fuera de rango: %lld" -#: access/brin/brin.c:1075 access/brin/brin.c:1158 +#: access/brin/brin.c:1436 access/brin/brin.c:1525 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "«%s» no es un índice BRIN" -#: access/brin/brin.c:1091 access/brin/brin.c:1174 +#: access/brin/brin.c:1452 access/brin/brin.c:1541 #, c-format msgid "could not open parent table of index \"%s\"" msgstr "no se pudo abrir la tabla padre del índice «%s»" -#: access/brin/brin_bloom.c:750 access/brin/brin_bloom.c:792 -#: access/brin/brin_minmax_multi.c:3011 access/brin/brin_minmax_multi.c:3148 -#: statistics/dependencies.c:663 statistics/dependencies.c:716 -#: statistics/mcv.c:1484 statistics/mcv.c:1515 statistics/mvdistinct.c:344 -#: statistics/mvdistinct.c:397 utils/adt/pseudotypes.c:43 -#: utils/adt/pseudotypes.c:77 utils/adt/tsgistidx.c:93 +#: access/brin/brin.c:1461 access/brin/brin.c:1557 access/gin/ginfast.c:1085 +#: parser/parse_utilcmd.c:2277 +#, c-format +msgid "index \"%s\" is not valid" +msgstr "el índice «%s» no es válido" + +#: access/brin/brin_bloom.c:783 access/brin/brin_bloom.c:825 +#: access/brin/brin_minmax_multi.c:2993 access/brin/brin_minmax_multi.c:3130 +#: statistics/dependencies.c:661 statistics/dependencies.c:714 +#: statistics/mcv.c:1480 statistics/mcv.c:1511 statistics/mvdistinct.c:343 +#: statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:40 +#: utils/adt/pseudotypes.c:74 utils/adt/tsgistidx.c:94 #, c-format msgid "cannot accept a value of type %s" msgstr "no se puede aceptar un valor de tipo %s" -#: access/brin/brin_minmax_multi.c:2171 access/brin/brin_minmax_multi.c:2178 -#: access/brin/brin_minmax_multi.c:2185 utils/adt/timestamp.c:940 -#: utils/adt/timestamp.c:1517 utils/adt/timestamp.c:2716 -#: utils/adt/timestamp.c:2786 utils/adt/timestamp.c:2803 -#: utils/adt/timestamp.c:2856 utils/adt/timestamp.c:2895 -#: utils/adt/timestamp.c:3192 utils/adt/timestamp.c:3197 -#: utils/adt/timestamp.c:3202 utils/adt/timestamp.c:3252 -#: utils/adt/timestamp.c:3259 utils/adt/timestamp.c:3266 -#: utils/adt/timestamp.c:3286 utils/adt/timestamp.c:3293 -#: utils/adt/timestamp.c:3300 utils/adt/timestamp.c:3330 -#: utils/adt/timestamp.c:3338 utils/adt/timestamp.c:3382 -#: utils/adt/timestamp.c:3804 utils/adt/timestamp.c:3928 -#: utils/adt/timestamp.c:4448 -#, c-format -msgid "interval out of range" -msgstr "interval fuera de rango" - -#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 -#: access/brin/brin_pageops.c:852 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1442 access/spgist/spgdoinsert.c:2002 -#: access/spgist/spgdoinsert.c:2279 +#: access/brin/brin_pageops.c:75 access/brin/brin_pageops.c:361 +#: access/brin/brin_pageops.c:851 access/gin/ginentrypage.c:109 +#: access/gist/gist.c:1463 access/spgist/spgdoinsert.c:2001 +#: access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "el tamaño de fila de índice %zu excede el máximo %zu para el índice «%s»" -#: access/brin/brin_revmap.c:393 access/brin/brin_revmap.c:399 +#: access/brin/brin_revmap.c:383 access/brin/brin_revmap.c:389 #, c-format msgid "corrupted BRIN index: inconsistent range map" msgstr "índice BRIN corrompido: mapa de rango inconsistente" -#: access/brin/brin_revmap.c:593 +#: access/brin/brin_revmap.c:583 #, c-format msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" msgstr "tipo de página 0x%04X inesperado en el índice BRIN «%s» bloque %u" -#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:151 -#: access/gist/gistvalidate.c:153 access/hash/hashvalidate.c:139 +#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:149 +#: access/gist/gistvalidate.c:152 access/hash/hashvalidate.c:139 #: access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with invalid support number %d" msgstr "familia de operadores «%s» de método de acceso %s contiene la función %s con número de soporte %d no válido" -#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:163 -#: access/gist/gistvalidate.c:165 access/hash/hashvalidate.c:118 +#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:161 +#: access/gist/gistvalidate.c:164 access/hash/hashvalidate.c:118 #: access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with wrong signature for support number %d" msgstr "familia de operadores «%s» de método de acceso %s contiene la función %s con signatura incorrecta para el número de soporte %d" -#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:182 -#: access/gist/gistvalidate.c:185 access/hash/hashvalidate.c:160 +#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:180 +#: access/gist/gistvalidate.c:184 access/hash/hashvalidate.c:160 #: access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with invalid strategy number %d" msgstr "familia de operadores «%s» de método de acceso %s contiene el operador %s con número de estrategia %d no válido" -#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:195 +#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:193 #: access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 #: access/spgist/spgvalidate.c:237 #, c-format msgid "operator family \"%s\" of access method %s contains invalid ORDER BY specification for operator %s" msgstr "familia de operadores «%s» de método de acceso %s contiene especificación ORDER BY no válida para el operador %s" -#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:208 -#: access/gist/gistvalidate.c:233 access/hash/hashvalidate.c:186 +#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:206 +#: access/gist/gistvalidate.c:232 access/hash/hashvalidate.c:186 #: access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with wrong signature" @@ -870,38 +1065,38 @@ msgstr "la(s) función/funciones de soporte para los tipos %3$s y %4$s faltan de msgid "operator class \"%s\" of access method %s is missing operator(s)" msgstr "faltan operadores de la clase de operadores «%s» del método de acceso %s" -#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 -#: access/gist/gistvalidate.c:274 +#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:248 +#: access/gist/gistvalidate.c:273 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d" msgstr "falta la función de soporte %3$d de la clase de operadores «%1$s» del método de acceso %2$s" -#: access/common/attmap.c:122 +#: access/common/attmap.c:121 #, c-format msgid "Returned type %s does not match expected type %s in column %d." msgstr "El tipo retornado %s no coincide con el tipo de registro esperado %s en la columna %d." -#: access/common/attmap.c:150 +#: access/common/attmap.c:149 #, c-format msgid "Number of returned columns (%d) does not match expected column count (%d)." msgstr "La cantidad de columnas retornadas (%d) no coincide con la cantidad esperada de columnas (%d)." -#: access/common/attmap.c:234 access/common/attmap.c:246 +#: access/common/attmap.c:233 access/common/attmap.c:245 #, c-format msgid "could not convert row type" msgstr "no se pudo convertir el tipo de registro" -#: access/common/attmap.c:235 +#: access/common/attmap.c:234 #, c-format msgid "Attribute \"%s\" of type %s does not match corresponding attribute of type %s." msgstr "El atributo «%s» de tipo %s no coincide con el atributo correspondiente de tipo %s." -#: access/common/attmap.c:247 +#: access/common/attmap.c:246 #, c-format msgid "Attribute \"%s\" of type %s does not exist in type %s." msgstr "El atributo «%s» de tipo %s no existe en el tipo %s." -#: access/common/heaptuple.c:1036 access/common/heaptuple.c:1371 +#: access/common/heaptuple.c:1132 access/common/heaptuple.c:1467 #, c-format msgid "number of columns (%d) exceeds limit (%d)" msgstr "el número de columnas (%d) excede el límite (%d)" @@ -911,124 +1106,110 @@ msgstr "el número de columnas (%d) excede el límite (%d)" msgid "number of index columns (%d) exceeds limit (%d)" msgstr "el número de columnas del índice (%d) excede el límite (%d)" -#: access/common/indextuple.c:209 access/spgist/spgutils.c:950 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:970 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "fila de índice requiere %zu bytes, tamaño máximo es %zu" -#: access/common/printtup.c:292 tcop/fastpath.c:107 tcop/fastpath.c:454 -#: tcop/postgres.c:1944 +#: access/common/printtup.c:292 commands/explain.c:5376 tcop/fastpath.c:107 +#: tcop/fastpath.c:454 tcop/postgres.c:1956 #, c-format msgid "unsupported format code: %d" msgstr "código de formato no soportado: %d" -#: access/common/reloptions.c:521 access/common/reloptions.c:532 +#: access/common/reloptions.c:519 access/common/reloptions.c:530 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "Los valores aceptables son «on», «off» y «auto»." -#: access/common/reloptions.c:543 +#: access/common/reloptions.c:541 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Los valores aceptables son «local» y «cascaded»." -#: access/common/reloptions.c:691 +#: access/common/reloptions.c:689 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "el límite de tipos de parámetros de relación definidos por el usuario ha sido excedido" -#: access/common/reloptions.c:1233 +#: access/common/reloptions.c:1231 #, c-format msgid "RESET must not include values for parameters" msgstr "RESET no debe incluir valores de parámetros" -#: access/common/reloptions.c:1265 +#: access/common/reloptions.c:1263 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "espacio de nombre de parámetro «%s» no reconocido" -#: access/common/reloptions.c:1302 commands/variable.c:1167 +#: access/common/reloptions.c:1300 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" -msgstr "las tablas declaradas WITH OIDS no está soportado" +msgstr "las tablas declaradas WITH OIDS no están soportadas" -#: access/common/reloptions.c:1470 +#: access/common/reloptions.c:1468 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "parámetro «%s» no reconocido" -#: access/common/reloptions.c:1582 +#: access/common/reloptions.c:1580 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "el parámetro «%s» fue especificado más de una vez" -#: access/common/reloptions.c:1598 +#: access/common/reloptions.c:1596 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "valor no válido para la opción booleana «%s»: «%s»" -#: access/common/reloptions.c:1610 +#: access/common/reloptions.c:1608 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "valor no válido para la opción entera «%s»: «%s»" -#: access/common/reloptions.c:1616 access/common/reloptions.c:1636 +#: access/common/reloptions.c:1614 access/common/reloptions.c:1634 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "el valor %s está fuera del rango de la opción «%s»" -#: access/common/reloptions.c:1618 +#: access/common/reloptions.c:1616 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Los valores aceptables están entre «%d» y «%d»." -#: access/common/reloptions.c:1630 +#: access/common/reloptions.c:1628 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "valor no válido para la opción de coma flotante «%s»: «%s»" -#: access/common/reloptions.c:1638 +#: access/common/reloptions.c:1636 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Valores aceptables están entre «%f» y «%f»." -#: access/common/reloptions.c:1660 +#: access/common/reloptions.c:1658 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "valor no válido para la opción enum «%s»: %s" -#: access/common/reloptions.c:1991 -#, fuzzy, c-format -#| msgid "cannot truncate only a partitioned table" +#: access/common/reloptions.c:1989 +#, c-format msgid "cannot specify storage parameters for a partitioned table" -msgstr "no se puede truncar ONLY una tabla particionada" +msgstr "no se puede especificar parámetros de almacenamiento para una tabla particionada" -#: access/common/reloptions.c:1992 +#: access/common/reloptions.c:1990 #, c-format -msgid "Specify storage parameters for its leaf partitions, instead." -msgstr "" +msgid "Specify storage parameters for its leaf partitions instead." +msgstr "Especifique parámetros de almacenamiento para sus particiones hijas en su lugar." -#: access/common/toast_compression.c:33 +#: access/common/toast_compression.c:31 #, c-format msgid "compression method lz4 not supported" msgstr "el método de compresión lz4 no está soportado" -#: access/common/toast_compression.c:34 +#: access/common/toast_compression.c:32 #, c-format msgid "This functionality requires the server to be built with lz4 support." msgstr "Esta funcionalidad requiere que el servidor haya sido construido con soporte lz4." -#: access/common/tupdesc.c:837 commands/tablecmds.c:6953 -#: commands/tablecmds.c:12973 -#, fuzzy, c-format -#| msgid "mismatched array dimensions" -msgid "too many array dimensions" -msgstr "las dimensiones de array no coinciden" - -#: access/common/tupdesc.c:842 parser/parse_clause.c:772 -#: parser/parse_relation.c:1912 -#, c-format -msgid "column \"%s\" cannot be declared SETOF" -msgstr "la columna «%s» no puede ser declarada SETOF" - #: access/gin/ginbulk.c:44 #, c-format msgid "posting list is too long" @@ -1036,20 +1217,20 @@ msgstr "la «posting list» es demasiado larga" #: access/gin/ginbulk.c:45 #, c-format -msgid "Reduce maintenance_work_mem." -msgstr "Reduzca maintenance_work_mem." +msgid "Reduce \"maintenance_work_mem\"." +msgstr "Reduzca «maintenance_work_mem»." -#: access/gin/ginfast.c:1036 +#: access/gin/ginfast.c:1041 #, c-format msgid "GIN pending list cannot be cleaned up during recovery." msgstr "La lista de pendientes GIN no puede limpiarse durante la recuperación." -#: access/gin/ginfast.c:1043 +#: access/gin/ginfast.c:1048 #, c-format msgid "\"%s\" is not a GIN index" msgstr "«%s» no es un índice GIN" -#: access/gin/ginfast.c:1054 +#: access/gin/ginfast.c:1059 #, c-format msgid "cannot access temporary indexes of other sessions" msgstr "no se pueden acceder índices temporales de otras sesiones" @@ -1069,50 +1250,50 @@ msgstr "los índices GIN antiguos no soportan recorridos del índice completo ni msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Para corregir esto, ejecute REINDEX INDEX \"%s\"." -#: access/gin/ginutil.c:146 executor/execExpr.c:2169 -#: utils/adt/arrayfuncs.c:3997 utils/adt/arrayfuncs.c:6684 -#: utils/adt/rowtypes.c:984 +#: access/gin/ginutil.c:147 executor/execExpr.c:2200 +#: utils/adt/arrayfuncs.c:4016 utils/adt/arrayfuncs.c:6712 +#: utils/adt/rowtypes.c:974 #, c-format msgid "could not identify a comparison function for type %s" msgstr "no se pudo identificar una función de comparación para el tipo %s" -#: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 +#: access/gin/ginvalidate.c:90 access/gist/gistvalidate.c:92 #: access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 #, c-format msgid "operator family \"%s\" of access method %s contains support function %s with different left and right input types" msgstr "la familia de operadores «%s» del método de acceso %s contiene el procedimiento de soporte %s registrado entre tipos distintos" -#: access/gin/ginvalidate.c:260 +#: access/gin/ginvalidate.c:258 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d or %d" msgstr "falta la función de soporte %3$d o %4$d de la clase de operadores «%1$s» del método de accesso %2$s" -#: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:350 +#: access/gin/ginvalidate.c:331 access/gist/gistvalidate.c:349 #: access/spgist/spgvalidate.c:387 #, c-format msgid "support function number %d is invalid for access method %s" msgstr "el número de función de soporte %d no es válido para el método de acceso %s" -#: access/gist/gist.c:759 access/gist/gistvacuum.c:426 +#: access/gist/gist.c:760 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "el índice «%s» contiene una tupla interna marcada como no válida" -#: access/gist/gist.c:761 access/gist/gistvacuum.c:428 +#: access/gist/gist.c:762 access/gist/gistvacuum.c:428 #, c-format msgid "This is caused by an incomplete page split at crash recovery before upgrading to PostgreSQL 9.1." msgstr "Esto es causado por una división de página incompleta durante una recuperación antes de actualizar a PostgreSQL 9.1." -#: access/gist/gist.c:762 access/gist/gistutil.c:801 access/gist/gistutil.c:812 -#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:227 -#: access/hash/hashutil.c:238 access/hash/hashutil.c:250 -#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:809 -#: access/nbtree/nbtpage.c:820 +#: access/gist/gist.c:763 access/gist/gistutil.c:800 access/gist/gistutil.c:811 +#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:226 +#: access/hash/hashutil.c:237 access/hash/hashutil.c:249 +#: access/hash/hashutil.c:270 access/nbtree/nbtpage.c:813 +#: access/nbtree/nbtpage.c:824 #, c-format msgid "Please REINDEX it." msgstr "Por favor aplíquele REINDEX." -#: access/gist/gist.c:1176 +#: access/gist/gist.c:1196 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "arreglando división incompleta en el índice «%s», bloque %u" @@ -1127,52 +1308,52 @@ msgstr "el método picksplit para la columna %d del índice «%s» falló" msgid "The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command." msgstr "El índice no es óptimo. Para optimizarlo, contacte un desarrollador o trate de usar la columna en segunda posición en la orden CREATE INDEX." -#: access/gist/gistutil.c:798 access/hash/hashutil.c:224 -#: access/nbtree/nbtpage.c:806 +#: access/gist/gistutil.c:797 access/hash/hashutil.c:223 +#: access/nbtree/nbtpage.c:810 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "índice «%s» contiene páginas vacías no esperadas en el bloque %u" -#: access/gist/gistutil.c:809 access/hash/hashutil.c:235 -#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:817 +#: access/gist/gistutil.c:808 access/hash/hashutil.c:234 +#: access/hash/hashutil.c:246 access/nbtree/nbtpage.c:821 #, c-format msgid "index \"%s\" contains corrupted page at block %u" msgstr "el índice «%s» contiene una página corrupta en el bloque %u" -#: access/gist/gistvalidate.c:203 +#: access/gist/gistvalidate.c:202 #, c-format msgid "operator family \"%s\" of access method %s contains unsupported ORDER BY specification for operator %s" msgstr "la familia de operadores «%s» del método de acceso %s contiene una especificación ORDER BY no soportada para el operador %s" -#: access/gist/gistvalidate.c:214 +#: access/gist/gistvalidate.c:213 #, c-format msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY opfamily specification for operator %s" msgstr "la familia de operadores «%s» del método de acceso %s contiene una especificación de familia en ORDER BY incorrecta para el operador %s" -#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:332 -#: utils/adt/varchar.c:1009 utils/adt/varchar.c:1063 +#: access/hash/hashfunc.c:277 access/hash/hashfunc.c:333 +#: utils/adt/varchar.c:1008 utils/adt/varchar.c:1065 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "no se pudo determinar qué ordenamiento usar para el hashing de cadenas" -#: access/hash/hashfunc.c:280 access/hash/hashfunc.c:333 catalog/heap.c:668 -#: catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:2023 commands/tablecmds.c:17490 commands/view.c:86 -#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1648 -#: utils/adt/formatting.c:1770 utils/adt/formatting.c:1893 utils/adt/like.c:191 -#: utils/adt/like_support.c:1025 utils/adt/varchar.c:739 -#: utils/adt/varchar.c:1010 utils/adt/varchar.c:1064 utils/adt/varlena.c:1518 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 catalog/heap.c:672 +#: catalog/heap.c:678 commands/createas.c:201 commands/createas.c:508 +#: commands/indexcmds.c:2021 commands/tablecmds.c:18178 commands/view.c:81 +#: regex/regc_pg_locale.c:245 utils/adt/formatting.c:1653 +#: utils/adt/formatting.c:1801 utils/adt/formatting.c:1991 utils/adt/like.c:189 +#: utils/adt/like_support.c:1024 utils/adt/varchar.c:738 +#: utils/adt/varchar.c:1009 utils/adt/varchar.c:1066 utils/adt/varlena.c:1521 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "Use la cláusula COLLATE para establecer el ordenamiento explícitamente." -#: access/hash/hashinsert.c:86 +#: access/hash/hashinsert.c:84 #, c-format msgid "index row size %zu exceeds hash maximum %zu" msgstr "el tamaño de fila de índice %zu excede el máximo para hash %zu" -#: access/hash/hashinsert.c:88 access/spgist/spgdoinsert.c:2006 -#: access/spgist/spgdoinsert.c:2283 access/spgist/spgutils.c:1011 +#: access/hash/hashinsert.c:86 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1031 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "Valores mayores a una página del buffer no pueden ser indexados." @@ -1187,17 +1368,17 @@ msgstr "número no válido de bloque de «overflow» %u" msgid "out of overflow pages in hash index \"%s\"" msgstr "se agotaron las páginas de desbordamiento en el índice hash «%s»" -#: access/hash/hashsearch.c:315 +#: access/hash/hashsearch.c:311 #, c-format msgid "hash indexes do not support whole-index scans" msgstr "los índices hash no soportan recorridos del índice completo" -#: access/hash/hashutil.c:263 +#: access/hash/hashutil.c:262 #, c-format msgid "index \"%s\" is not a hash index" msgstr "el índice «%s» no es un índice hash" -#: access/hash/hashutil.c:269 +#: access/hash/hashutil.c:268 #, c-format msgid "index \"%s\" has wrong hash version" msgstr "el índice «%s» tiene una versión de hash incorrecta" @@ -1212,242 +1393,235 @@ msgstr "la familia de operadores «%s» del método de acceso %s no tiene funci msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "faltan operadores entre tipos en la familia de operadores «%s» del método de acceso %s" -#: access/heap/heapam.c:2026 +#: access/heap/heapam.c:2206 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "no se pueden insertar tuplas en un ayudante paralelo" -#: access/heap/heapam.c:2545 +#: access/heap/heapam.c:2725 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "no se pueden eliminar tuplas durante una operación paralela" -#: access/heap/heapam.c:2592 +#: access/heap/heapam.c:2772 #, c-format msgid "attempted to delete invisible tuple" msgstr "se intentó eliminar una tupla invisible" -#: access/heap/heapam.c:3035 access/heap/heapam.c:5902 +#: access/heap/heapam.c:3220 access/heap/heapam.c:6501 access/index/genam.c:818 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "no se pueden actualizar tuplas durante una operación paralela" -#: access/heap/heapam.c:3163 +#: access/heap/heapam.c:3397 #, c-format msgid "attempted to update invisible tuple" msgstr "se intentó actualizar una tupla invisible" -#: access/heap/heapam.c:4550 access/heap/heapam.c:4588 -#: access/heap/heapam.c:4853 access/heap/heapam_handler.c:467 +#: access/heap/heapam.c:4908 access/heap/heapam.c:4946 +#: access/heap/heapam.c:5211 access/heap/heapam_handler.c:468 #, c-format msgid "could not obtain lock on row in relation \"%s\"" -msgstr "no se pudo bloquear un candado en la fila de la relación «%s»" +msgstr "no se pudo bloquear un “lock†en la fila de la relación «%s»" + +#: access/heap/heapam.c:6314 commands/trigger.c:3340 +#: executor/nodeModifyTable.c:2376 executor/nodeModifyTable.c:2467 +#, c-format +msgid "tuple to be updated was already modified by an operation triggered by the current command" +msgstr "el registro a ser actualizado ya fue modificado por una operación disparada por la orden actual" -#: access/heap/heapam_handler.c:412 +#: access/heap/heapam_handler.c:413 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update" msgstr "el registro a ser bloqueado ya fue movido a otra partición por un update concurrente" -#: access/heap/hio.c:517 access/heap/rewriteheap.c:659 +#: access/heap/hio.c:535 access/heap/rewriteheap.c:640 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "fila es demasiado grande: tamaño %zu, tamaño máximo %zu" -#: access/heap/rewriteheap.c:919 +#: access/heap/rewriteheap.c:885 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "no se pudo escribir al archivo «%s», se escribió %d de %d: %m" -#: access/heap/rewriteheap.c:1011 access/heap/rewriteheap.c:1128 +#: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 #: access/transam/timeline.c:329 access/transam/timeline.c:481 -#: access/transam/xlog.c:2971 access/transam/xlog.c:3162 -#: access/transam/xlog.c:3938 access/transam/xlog.c:8740 -#: access/transam/xlogfuncs.c:701 backup/basebackup_server.c:151 -#: backup/basebackup_server.c:244 commands/dbcommands.c:518 -#: postmaster/postmaster.c:4554 postmaster/postmaster.c:5557 -#: replication/logical/origin.c:603 replication/slot.c:1770 -#: storage/file/copydir.c:157 storage/smgr/md.c:232 utils/time/snapmgr.c:1263 +#: access/transam/xlog.c:3255 access/transam/xlog.c:3446 +#: access/transam/xlog.c:4283 access/transam/xlog.c:9269 +#: access/transam/xlogfuncs.c:692 backup/basebackup_server.c:149 +#: backup/basebackup_server.c:242 commands/dbcommands.c:494 +#: postmaster/launch_backend.c:340 postmaster/postmaster.c:4114 +#: postmaster/walsummarizer.c:1212 replication/logical/origin.c:603 +#: replication/slot.c:2059 storage/file/copydir.c:157 storage/smgr/md.c:230 +#: utils/time/snapmgr.c:1234 #, c-format msgid "could not create file \"%s\": %m" msgstr "no se pudo crear archivo «%s»: %m" -#: access/heap/rewriteheap.c:1138 +#: access/heap/rewriteheap.c:1104 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "no se pudo truncar el archivo «%s» a %u: %m" -#: access/heap/rewriteheap.c:1156 access/transam/timeline.c:384 +#: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:498 -#: access/transam/xlog.c:3021 access/transam/xlog.c:3218 -#: access/transam/xlog.c:3950 commands/dbcommands.c:530 -#: postmaster/postmaster.c:4564 postmaster/postmaster.c:4574 +#: access/transam/xlog.c:3305 access/transam/xlog.c:3502 +#: access/transam/xlog.c:4295 commands/dbcommands.c:506 +#: postmaster/launch_backend.c:351 postmaster/launch_backend.c:363 #: replication/logical/origin.c:615 replication/logical/origin.c:657 -#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1767 -#: replication/slot.c:1805 storage/file/buffile.c:546 -#: storage/file/copydir.c:197 utils/init/miscinit.c:1605 -#: utils/init/miscinit.c:1616 utils/init/miscinit.c:1624 utils/misc/guc.c:4330 -#: utils/misc/guc.c:4361 utils/misc/guc.c:5489 utils/misc/guc.c:5507 -#: utils/time/snapmgr.c:1268 utils/time/snapmgr.c:1275 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1788 +#: replication/slot.c:2094 storage/file/buffile.c:545 +#: storage/file/copydir.c:197 utils/init/miscinit.c:1655 +#: utils/init/miscinit.c:1666 utils/init/miscinit.c:1674 utils/misc/guc.c:4491 +#: utils/misc/guc.c:4522 utils/misc/guc.c:5675 utils/misc/guc.c:5693 +#: utils/time/snapmgr.c:1239 utils/time/snapmgr.c:1246 #, c-format msgid "could not write to file \"%s\": %m" msgstr "no se pudo escribir a archivo «%s»: %m" -#: access/heap/rewriteheap.c:1248 access/transam/twophase.c:1703 -#: access/transam/xlogarchive.c:120 access/transam/xlogarchive.c:393 -#: postmaster/postmaster.c:1143 postmaster/syslogger.c:1537 -#: replication/logical/origin.c:591 replication/logical/reorderbuffer.c:4526 -#: replication/logical/snapbuild.c:1691 replication/logical/snapbuild.c:2121 -#: replication/slot.c:1902 storage/file/fd.c:789 storage/file/fd.c:3275 -#: storage/file/fd.c:3337 storage/file/reinit.c:262 storage/ipc/dsm.c:316 -#: storage/smgr/md.c:380 storage/smgr/md.c:439 storage/sync/sync.c:250 -#: utils/time/snapmgr.c:1608 -#, c-format -msgid "could not remove file \"%s\": %m" -msgstr "no se pudo eliminar el archivo «%s»: %m" - -#: access/heap/vacuumlazy.c:481 +#: access/heap/vacuumlazy.c:473 #, c-format msgid "aggressively vacuuming \"%s.%s.%s\"" msgstr "haciendo vacuum agresivamente a «%s.%s.%s»" -#: access/heap/vacuumlazy.c:486 +#: access/heap/vacuumlazy.c:478 #, c-format msgid "vacuuming \"%s.%s.%s\"" msgstr "haciendo vacuum a «%s.%s.%s»" -#: access/heap/vacuumlazy.c:634 +#: access/heap/vacuumlazy.c:626 #, c-format msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" msgstr "se terminó el vacuum de «%s.%s.%s»: recorridos de índice: %d\n" -#: access/heap/vacuumlazy.c:645 +#: access/heap/vacuumlazy.c:637 #, c-format msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "vacuum agresivo automático para prevenir wraparound de la tabla «%s.%s.%s»: recorridos de índice: %d\n" -#: access/heap/vacuumlazy.c:647 +#: access/heap/vacuumlazy.c:639 #, c-format msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "vacuum automático para prevenir wraparound de la tabla «%s.%s.%s»: recorridos de índice: %d\n" -#: access/heap/vacuumlazy.c:652 +#: access/heap/vacuumlazy.c:644 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "vacuum agresivo automático de la tabla «%s.%s.%s»: recorridos de índice: %d\n" -#: access/heap/vacuumlazy.c:654 +#: access/heap/vacuumlazy.c:646 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "vacuum automático de la tabla «%s.%s.%s»: recorridos de índice: %d\n" -#: access/heap/vacuumlazy.c:661 +#: access/heap/vacuumlazy.c:653 #, c-format msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" msgstr "páginas: %u eliminadas, %u quedan, %u recorridas (%.2f%% del total)\n" -#: access/heap/vacuumlazy.c:668 +#: access/heap/vacuumlazy.c:660 #, c-format msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" msgstr "tuplas: %lld eliminadas, %lld permanecen, %lld están muertas pero aún no se pueden quitar\n" -#: access/heap/vacuumlazy.c:674 +#: access/heap/vacuumlazy.c:666 #, c-format msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" msgstr "tuplas faltantes: %lld muertas en %u páginas no eliminadas debido a contención del lock de limpieza\n" -#: access/heap/vacuumlazy.c:680 +#: access/heap/vacuumlazy.c:672 #, c-format msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" -msgstr "" +msgstr "punto de corte de eliminación: %u, que era %d XIDs de antiguo cuando la operación terminó\n" -#: access/heap/vacuumlazy.c:687 +#: access/heap/vacuumlazy.c:679 #, c-format msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" msgstr "nuevo relfrozenxid: %u, que está %d XIDs más adelante del valor anterior\n" -#: access/heap/vacuumlazy.c:695 +#: access/heap/vacuumlazy.c:687 #, c-format msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" msgstr "nuevo relminmxid: %u, que está %d MXIDs más adelante del valor anterior\n" -#: access/heap/vacuumlazy.c:698 -#, fuzzy, c-format -#| msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" +#: access/heap/vacuumlazy.c:690 +#, c-format msgid "frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n" -msgstr "en %u páginas de la tabla (%.2f%% del total) se eliminaron %lld identificadores de elementos muertos\n" +msgstr "congelado: %u páginas de la tabla (%.2f%% del total) tuvieron %lld tuplas congeladas\n" -#: access/heap/vacuumlazy.c:706 +#: access/heap/vacuumlazy.c:698 msgid "index scan not needed: " msgstr "recorrido de índice no necesario: " -#: access/heap/vacuumlazy.c:708 +#: access/heap/vacuumlazy.c:700 msgid "index scan needed: " msgstr "recorrido de índice necesario: " -#: access/heap/vacuumlazy.c:710 +#: access/heap/vacuumlazy.c:702 #, c-format msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" msgstr "en %u páginas de la tabla (%.2f%% del total) se eliminaron %lld identificadores de elementos muertos\n" -#: access/heap/vacuumlazy.c:715 +#: access/heap/vacuumlazy.c:707 msgid "index scan bypassed: " msgstr "recorrido de índice pasado por alto: " -#: access/heap/vacuumlazy.c:717 +#: access/heap/vacuumlazy.c:709 msgid "index scan bypassed by failsafe: " msgstr "recorrido de índice pasado por alto debido a modo failsafe: " -#: access/heap/vacuumlazy.c:719 +#: access/heap/vacuumlazy.c:711 #, c-format msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" msgstr "%u páginas de la tabla (%.2f%% del total) tienen %lld identificadores de elementos muertos\n" -#: access/heap/vacuumlazy.c:734 +#: access/heap/vacuumlazy.c:726 #, c-format msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" msgstr "índice «%s»: páginas: %u en total, %u recientemente eliminadas, %u eliminadas hasta ahora, %u reusables\n" -#: access/heap/vacuumlazy.c:746 commands/analyze.c:795 +#: access/heap/vacuumlazy.c:738 commands/analyze.c:794 #, c-format msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" msgstr "tiempos de E/S: lectura: %.3f ms, escritura: %.3f ms\n" -#: access/heap/vacuumlazy.c:756 commands/analyze.c:798 +#: access/heap/vacuumlazy.c:748 commands/analyze.c:797 #, c-format msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" msgstr "tasa lectura promedio: %.3f MB/s, tasa escritura promedio: %.3f MB/s\n" -#: access/heap/vacuumlazy.c:759 commands/analyze.c:800 +#: access/heap/vacuumlazy.c:751 commands/analyze.c:799 #, c-format msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" msgstr "uso de búfers: %lld aciertos, %lld fallos, %lld ensuciados\n" -#: access/heap/vacuumlazy.c:764 +#: access/heap/vacuumlazy.c:756 #, c-format msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" msgstr "uso de WAL: %lld registros, %lld imágenes de página completa, %llu bytes\n" -#: access/heap/vacuumlazy.c:768 commands/analyze.c:804 +#: access/heap/vacuumlazy.c:760 commands/analyze.c:803 #, c-format msgid "system usage: %s" msgstr "uso de sistema: %s" -#: access/heap/vacuumlazy.c:2481 +#: access/heap/vacuumlazy.c:2170 #, c-format msgid "table \"%s\": removed %lld dead item identifiers in %u pages" msgstr "tabla «%s»: se eliminaron %lld identificadores de elementos muertos en %u páginas" -#: access/heap/vacuumlazy.c:2641 +#: access/heap/vacuumlazy.c:2324 #, c-format msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" msgstr "pasando por alto el mantenimiento no esencial de la tabla «%s.%s.%s» como mecanismo de seguridad (failsafe) luego de %d recorridos de índice" -#: access/heap/vacuumlazy.c:2644 +#: access/heap/vacuumlazy.c:2327 #, c-format msgid "The table's relfrozenxid or relminmxid is too far in the past." msgstr "El relfrozenxid o el relminmxid de la tabla es demasiado antiguo." -#: access/heap/vacuumlazy.c:2645 +#: access/heap/vacuumlazy.c:2328 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1456,67 +1630,67 @@ msgstr "" "Considere incrementar el parámetro de configuración «maintenance_work_mem» o «autovacuum_work_mem».\n" "Es probable que también deba considerar otras formas para que VACUUM pueda mantener el paso de la asignación de IDs de transacción." -#: access/heap/vacuumlazy.c:2890 +#: access/heap/vacuumlazy.c:2590 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" -msgstr "«%s»: suspendiendo el truncado debido a una petición de candado en conflicto" +msgstr "«%s»: suspendiendo el truncado debido a una petición de “lock†en conflicto" -#: access/heap/vacuumlazy.c:2960 +#: access/heap/vacuumlazy.c:2660 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "tabla «%s»: truncadas %u a %u páginas" -#: access/heap/vacuumlazy.c:3022 +#: access/heap/vacuumlazy.c:2722 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "tabla «%s»: suspendiendo el truncado debido a una petición de bloqueo en conflicto" -#: access/heap/vacuumlazy.c:3182 +#: access/heap/vacuumlazy.c:2841 #, c-format msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" msgstr "desactivando el comportamiento paralelo de vacuum en «%s» --- no se puede hacer vacuum de tablas temporales en paralelo" -#: access/heap/vacuumlazy.c:3398 +#: access/heap/vacuumlazy.c:3108 #, c-format msgid "while scanning block %u offset %u of relation \"%s.%s\"" msgstr "recorriendo el bloque %u posición %u de la relación «%s.%s»" -#: access/heap/vacuumlazy.c:3401 +#: access/heap/vacuumlazy.c:3111 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "recorriendo el bloque %u de la relación «%s.%s»" -#: access/heap/vacuumlazy.c:3405 +#: access/heap/vacuumlazy.c:3115 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "recorriendo la relación «%s.%s»" -#: access/heap/vacuumlazy.c:3413 +#: access/heap/vacuumlazy.c:3123 #, c-format msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" msgstr "haciendo «vacuum» al bloque %u posición %u de la relación «%s.%s»" -#: access/heap/vacuumlazy.c:3416 +#: access/heap/vacuumlazy.c:3126 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "haciendo «vacuum» al bloque %u de la relación «%s.%s»" -#: access/heap/vacuumlazy.c:3420 +#: access/heap/vacuumlazy.c:3130 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "mientras se hacía «vacuum» a la relación «%s.%s»" -#: access/heap/vacuumlazy.c:3425 commands/vacuumparallel.c:1074 +#: access/heap/vacuumlazy.c:3135 commands/vacuumparallel.c:1112 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "mientras se hacía «vacuum» al índice «%s» de la relación «%s.%s»" -#: access/heap/vacuumlazy.c:3430 commands/vacuumparallel.c:1080 +#: access/heap/vacuumlazy.c:3140 commands/vacuumparallel.c:1118 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "mientras se limpiaba el índice «%s» de la relación «%s.%s»" -#: access/heap/vacuumlazy.c:3436 +#: access/heap/vacuumlazy.c:3146 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "error mientras se truncaba la relación «%s.%s» a %u bloques" @@ -1531,19 +1705,24 @@ msgstr "el método de acceso «%s» no es de tipo %s" msgid "index access method \"%s\" does not have a handler" msgstr "el método de acceso «%s» no tiene manejador" -#: access/index/genam.c:490 +#: access/index/genam.c:489 #, c-format msgid "transaction aborted during system catalog scan" msgstr "transacción abortada durante recorrido de catálogos de sistema" -#: access/index/indexam.c:142 catalog/objectaddress.c:1394 -#: commands/indexcmds.c:2852 commands/tablecmds.c:272 commands/tablecmds.c:296 -#: commands/tablecmds.c:17191 commands/tablecmds.c:18959 +#: access/index/genam.c:657 access/index/indexam.c:82 +#, c-format +msgid "cannot access index \"%s\" while it is being reindexed" +msgstr "no se puede acceder el índice «%s» mientras está siendo reindexado" + +#: access/index/indexam.c:203 catalog/objectaddress.c:1356 +#: commands/indexcmds.c:2851 commands/tablecmds.c:281 commands/tablecmds.c:305 +#: commands/tablecmds.c:17873 commands/tablecmds.c:19762 #, c-format msgid "\"%s\" is not an index" msgstr "«%s» no es un índice" -#: access/index/indexam.c:979 +#: access/index/indexam.c:1028 #, c-format msgid "operator class %s has no options" msgstr "clase de operadores «%s» no tiene opciones" @@ -1563,38 +1742,38 @@ msgstr "Ya existe la llave %s." msgid "This may be because of a non-immutable index expression." msgstr "Esto puede deberse a una expresión de índice no inmutable." -#: access/nbtree/nbtpage.c:158 access/nbtree/nbtpage.c:607 -#: parser/parse_utilcmd.c:2317 +#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 +#: parser/parse_utilcmd.c:2323 #, c-format msgid "index \"%s\" is not a btree" msgstr "el índice «%s» no es un btree" -#: access/nbtree/nbtpage.c:165 access/nbtree/nbtpage.c:614 +#: access/nbtree/nbtpage.c:164 access/nbtree/nbtpage.c:618 #, c-format msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" msgstr "discordancia de versión en índice «%s»: versión de archivo %d, versión de código %d, mínima versión soportada %d" -#: access/nbtree/nbtpage.c:1862 +#: access/nbtree/nbtpage.c:1861 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "el índice «%s» contiene una página interna parcialmente muerta" -#: access/nbtree/nbtpage.c:1864 +#: access/nbtree/nbtpage.c:1863 #, c-format msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." msgstr "Esto puede ser causado por la interrupción de un VACUUM en la versión 9.3 o anteriores, antes de actualizar. Ejecute REINDEX por favor." -#: access/nbtree/nbtutils.c:2663 +#: access/nbtree/nbtutils.c:5108 #, c-format msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" msgstr "el tamaño de fila de índice %1$zu excede el máximo %3$zu para btree versión %2$u para el índice «%4$s»" -#: access/nbtree/nbtutils.c:2669 +#: access/nbtree/nbtutils.c:5114 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "La tupla de índice hace referencia a la tupla (%u,%u) en la relación «%s»." -#: access/nbtree/nbtutils.c:2673 +#: access/nbtree/nbtutils.c:5118 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1608,12 +1787,18 @@ msgstr "" msgid "operator family \"%s\" of access method %s is missing support function for types %s and %s" msgstr "falta una función de soporte para los tipos %3$s y %4$s en la familia de operadores «%1$s» del método de acceso %2$s" +#: access/sequence/sequence.c:75 access/table/table.c:145 +#: optimizer/util/plancat.c:144 +#, c-format +msgid "cannot open relation \"%s\"" +msgstr "no se puede abrir la relación «%s»" + #: access/spgist/spgutils.c:245 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "método «compress» debe estar definido cuando el tipo hoja es distinto del tipo de entrada" -#: access/spgist/spgutils.c:1008 +#: access/spgist/spgutils.c:1028 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "el tamaño de tupla interna SP-GiST %zu excede el máximo %zu" @@ -1628,69 +1813,64 @@ msgstr "el tipo de dato hoja SP-GiST %s no coincide con el tipo declarado %s" msgid "operator family \"%s\" of access method %s is missing support function %d for type %s" msgstr "falta la función de soporte %3$d para el tipo %4$s de la clase de operadores «%1$s» del método de accesso %2$s" -#: access/table/table.c:145 optimizer/util/plancat.c:145 -#, fuzzy, c-format -#| msgid "cannot change relation \"%s\"" -msgid "cannot open relation \"%s\"" -msgstr "no se puede cambiar la relación «%s»" - -#: access/table/tableam.c:265 +#: access/table/tableam.c:255 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "el tid (%u, %u) no es válido para la relación «%s»" -#: access/table/tableamapi.c:116 +#: access/table/tableamapi.c:109 #, c-format -msgid "%s cannot be empty." -msgstr "%s no puede ser vacío." +msgid "\"%s\" cannot be empty." +msgstr "«%s» no puede ser vacío." -#: access/table/tableamapi.c:123 access/transam/xlogrecovery.c:4774 +#: access/table/tableamapi.c:116 access/transam/xlogrecovery.c:4859 #, c-format -msgid "%s is too long (maximum %d characters)." -msgstr "%s es demasiado largo (máximo %d caracteres)." +msgid "\"%s\" is too long (maximum %d characters)." +msgstr "«%s» es demasiado largo (máximo %d caracteres)." -#: access/table/tableamapi.c:146 +#: access/table/tableamapi.c:139 #, c-format msgid "table access method \"%s\" does not exist" msgstr "no existe el método de acceso de tabla «%s»" -#: access/table/tableamapi.c:151 +#: access/table/tableamapi.c:144 #, c-format msgid "Table access method \"%s\" does not exist." msgstr "No existe el método de acceso de tabla «%s»." -#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:152 +#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:151 #, c-format msgid "sample percentage must be between 0 and 100" msgstr "el porcentaje de muestreo debe estar entre 0 y 100" -#: access/transam/commit_ts.c:279 +#: access/transam/commit_ts.c:287 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "no se puede obtener el timestamp de compromiso de la transacción %u" -#: access/transam/commit_ts.c:377 +#: access/transam/commit_ts.c:385 #, c-format msgid "could not get commit timestamp data" msgstr "no se pudo obtener datos de compromiso de transacción" -#: access/transam/commit_ts.c:379 +#: access/transam/commit_ts.c:387 #, c-format msgid "Make sure the configuration parameter \"%s\" is set on the primary server." msgstr "Asegúrese que el parámetro de configuración «%s» esté definido en el servidor primario." -#: access/transam/commit_ts.c:381 +#: access/transam/commit_ts.c:389 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Asegúrese que el parámetro de configuración «%s» esté definido." -#: access/transam/multixact.c:1023 +#: access/transam/multixact.c:1091 #, c-format -msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"" -msgstr "la base de datos no está aceptando órdenes que generen nuevos MultiXactIds para evitar pérdida de datos debido al reciclaje de transacciones en la base de datos «%s»" +msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database \"%s\"" +msgstr "la base de datos no está aceptando órdenes que asignen nuevos MultiXactIds para evitar pérdida de datos debido al “wraparound†en la base de datos «%s»" -#: access/transam/multixact.c:1025 access/transam/multixact.c:1032 -#: access/transam/multixact.c:1056 access/transam/multixact.c:1065 +#: access/transam/multixact.c:1093 access/transam/multixact.c:1100 +#: access/transam/multixact.c:1124 access/transam/multixact.c:1133 +#: access/transam/varsup.c:158 access/transam/varsup.c:165 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" @@ -1699,247 +1879,250 @@ msgstr "" "Ejecute VACUUM de la base completa en esa base de datos.\n" "Puede que además necesite comprometer o abortar transacciones preparadas antiguas, o eliminar slots de replicación añejos." -#: access/transam/multixact.c:1030 +#: access/transam/multixact.c:1098 #, c-format -msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u" -msgstr "la base de datos no está aceptando órdenes que generen nuevos MultiXactIds para evitar pérdida de datos debido al problema del reciclaje de transacciones en la base con OID %u" +msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database with OID %u" +msgstr "la base de datos no está aceptando órdenes que asignen nuevos MultiXactIds para evitar pérdida de datos debido al “wraparound†en la base con OID %u" -#: access/transam/multixact.c:1051 access/transam/multixact.c:2333 +#: access/transam/multixact.c:1119 access/transam/multixact.c:2474 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" msgstr[0] "base de datos «%s» debe ser limpiada antes de que %u más MultiXactId sea usado" msgstr[1] "base de datos «%s» debe ser limpiada dentro de que %u más MultiXactIds sean usados" -#: access/transam/multixact.c:1060 access/transam/multixact.c:2342 +#: access/transam/multixact.c:1128 access/transam/multixact.c:2483 #, c-format msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" msgstr[0] "base de datos con OID %u debe ser limpiada antes de que %u más MultiXactId sea usado" msgstr[1] "base de datos con OID %u debe ser limpiada antes de que %u más MultiXactIds sean usados" -#: access/transam/multixact.c:1121 +#: access/transam/multixact.c:1189 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "límite de miembros de multixact alcanzado" -#: access/transam/multixact.c:1122 +#: access/transam/multixact.c:1190 #, c-format msgid "This command would create a multixact with %u members, but the remaining space is only enough for %u member." msgid_plural "This command would create a multixact with %u members, but the remaining space is only enough for %u members." msgstr[0] "Esta orden crearía un multixact con %u miembros, pero el espacio que queda sólo sirve para %u miembro." msgstr[1] "Esta orden crearía un multixact con %u miembros, pero el espacio que queda sólo sirve para %u miembros." -#: access/transam/multixact.c:1127 +#: access/transam/multixact.c:1195 #, c-format -msgid "Execute a database-wide VACUUM in database with OID %u with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." -msgstr "Ejecute un VACUUM de la base completa en la base de datos con OID %u con vacuum_multixact_freeze_min_age y vacuum_multixact_freeze_table_age reducidos." +msgid "Execute a database-wide VACUUM in database with OID %u with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." +msgstr "Ejecute un VACUUM de la base completa en la base de datos con OID %u con «vacuum_multixact_freeze_min_age» y «vacuum_multixact_freeze_table_age» reducidos." -#: access/transam/multixact.c:1158 +#: access/transam/multixact.c:1226 #, c-format msgid "database with OID %u must be vacuumed before %d more multixact member is used" msgid_plural "database with OID %u must be vacuumed before %d more multixact members are used" msgstr[0] "base de datos con OID %u debe ser limpiada antes de que %d miembro más de multixact sea usado" msgstr[1] "base de datos con OID %u debe ser limpiada antes de que %d más miembros de multixact sean usados" -#: access/transam/multixact.c:1163 +#: access/transam/multixact.c:1231 #, c-format -msgid "Execute a database-wide VACUUM in that database with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." -msgstr "Ejecute un VACUUM de la base completa en esa base de datos con vacuum_multixact_freeze_min_age y vacuum_multixact_freeze_table_age reducidos." +msgid "Execute a database-wide VACUUM in that database with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." +msgstr "Ejecute un VACUUM de la base completa en esa base de datos con «vacuum_multixact_freeze_min_age» y «vacuum_multixact_freeze_table_age» reducidos." -#: access/transam/multixact.c:1302 +#: access/transam/multixact.c:1371 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" -msgstr "el MultiXactId %u ya no existe -- aparente problema por reciclaje" +msgstr "el MultiXactId %u ya no existe -- “wraparound†aparente" -#: access/transam/multixact.c:1308 +#: access/transam/multixact.c:1377 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" -msgstr "el MultiXactId %u no se ha creado aún -- aparente problema por reciclaje" +msgstr "el MultiXactId %u no se ha creado aún -- “wraparound†aparente" -#: access/transam/multixact.c:2338 access/transam/multixact.c:2347 -#: access/transam/varsup.c:151 access/transam/varsup.c:158 -#: access/transam/varsup.c:466 access/transam/varsup.c:473 +#: access/transam/multixact.c:2479 access/transam/multixact.c:2488 #, c-format msgid "" -"To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" +"To avoid MultiXactId assignment failures, execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." msgstr "" -"Para evitar que la base de datos se desactive, ejecute VACUUM en esa base de datos.\n" +"Para evitar fallos de asignación de MultiXactId, ejecute VACUUM en esa base de datos.\n" "Puede que además necesite comprometer o abortar transacciones preparadas antiguas, o eliminar slots de replicación añejos." -#: access/transam/multixact.c:2622 +#: access/transam/multixact.c:2767 #, c-format msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" -msgstr "las protecciones de reciclaje de miembros de multixact están inhabilitadas porque el multixact más antiguo %u en checkpoint no existe en disco" +msgstr "las protecciones de “wraparound†de multixact están inhabilitadas porque el multixact más antiguo %u en checkpoint no existe en disco" -#: access/transam/multixact.c:2644 +#: access/transam/multixact.c:2789 #, c-format msgid "MultiXact member wraparound protections are now enabled" -msgstr "las protecciones de reciclaje de miembros de multixact están habilitadas" +msgstr "las protecciones de “wraparound†de miembros de multixact están habilitadas" -#: access/transam/multixact.c:3027 +#: access/transam/multixact.c:3180 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "multixact más antiguo %u no encontrado, multixact más antiguo es %u, omitiendo el truncado" -#: access/transam/multixact.c:3045 +#: access/transam/multixact.c:3198 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" msgstr "no se puede truncar hasta el MultiXact %u porque no existe en disco, omitiendo el truncado" -#: access/transam/multixact.c:3359 +#: access/transam/multixact.c:3517 #, c-format msgid "invalid MultiXactId: %u" msgstr "el MultiXactId no es válido: %u" -#: access/transam/parallel.c:729 access/transam/parallel.c:848 +#: access/transam/parallel.c:748 access/transam/parallel.c:867 #, c-format msgid "parallel worker failed to initialize" msgstr "el ayudante paralelo no pudo iniciar" -#: access/transam/parallel.c:730 access/transam/parallel.c:849 +#: access/transam/parallel.c:749 access/transam/parallel.c:868 #, c-format msgid "More details may be available in the server log." msgstr "Puede haber más detalles disponibles en el log del servidor." -#: access/transam/parallel.c:910 +#: access/transam/parallel.c:929 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "postmaster terminó durante una transacción paralela" -#: access/transam/parallel.c:1097 +#: access/transam/parallel.c:1116 #, c-format msgid "lost connection to parallel worker" msgstr "se ha perdido la conexión al ayudante paralelo" -#: access/transam/parallel.c:1163 access/transam/parallel.c:1165 +#: access/transam/parallel.c:1172 access/transam/parallel.c:1174 msgid "parallel worker" msgstr "ayudante paralelo" -#: access/transam/parallel.c:1319 +#: access/transam/parallel.c:1344 replication/logical/applyparallelworker.c:890 #, c-format msgid "could not map dynamic shared memory segment" msgstr "no se pudo mapear el segmento de memoria compartida dinámica" -#: access/transam/parallel.c:1324 +#: access/transam/parallel.c:1349 replication/logical/applyparallelworker.c:896 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "número mágico no válido en segmento de memoria compartida dinámica" -#: access/transam/rmgr.c:84 +#: access/transam/rmgr.c:93 #, c-format msgid "resource manager with ID %d not registered" msgstr "el gestor de recursos con ID %d no está registrado" -#: access/transam/rmgr.c:85 +#: access/transam/rmgr.c:94 #, c-format -msgid "Include the extension module that implements this resource manager in shared_preload_libraries." -msgstr "Incluya el módulo de extensión que implementa este gestor de recursos en shared_preload_libraries." +msgid "Include the extension module that implements this resource manager in \"shared_preload_libraries\"." +msgstr "Incluya el módulo de extensión que implementa este gestor de recursos en «shared_preload_libraries»." -#: access/transam/rmgr.c:101 +#: access/transam/rmgr.c:110 #, c-format msgid "custom resource manager name is invalid" msgstr "el nombre de gestor de recursos personalizado no es válido" -#: access/transam/rmgr.c:102 +#: access/transam/rmgr.c:111 #, c-format msgid "Provide a non-empty name for the custom resource manager." msgstr "Provea un nombre no vacío para el gestor de recursos personalizado." -#: access/transam/rmgr.c:105 +#: access/transam/rmgr.c:114 #, c-format msgid "custom resource manager ID %d is out of range" msgstr "el ID %d de gestor de recursos está fuera de rango" -#: access/transam/rmgr.c:106 +#: access/transam/rmgr.c:115 #, c-format msgid "Provide a custom resource manager ID between %d and %d." msgstr "Provea un ID de gestor de recursos personalizado entre %d y %d." -#: access/transam/rmgr.c:111 access/transam/rmgr.c:116 -#: access/transam/rmgr.c:128 +#: access/transam/rmgr.c:120 access/transam/rmgr.c:125 +#: access/transam/rmgr.c:137 #, c-format msgid "failed to register custom resource manager \"%s\" with ID %d" msgstr "no se pudo registrar un gestor de recursos personalizado «%s» con ID %d" -#: access/transam/rmgr.c:112 +#: access/transam/rmgr.c:121 #, c-format -msgid "Custom resource manager must be registered while initializing modules in shared_preload_libraries." -msgstr "El gestor de recursos personalizado debe ser registrado en shared_preload_libraries." +msgid "Custom resource manager must be registered while initializing modules in \"shared_preload_libraries\"." +msgstr "El gestor de recursos personalizado debe ser registrado en «shared_preload_libraries» al inicializar módulos." -#: access/transam/rmgr.c:117 +#: access/transam/rmgr.c:126 #, c-format msgid "Custom resource manager \"%s\" already registered with the same ID." msgstr "El gestor de recursos «%s» ya está registrado con el mismo ID." -#: access/transam/rmgr.c:129 +#: access/transam/rmgr.c:138 #, c-format msgid "Existing resource manager with ID %d has the same name." msgstr "El gestor de recursos con ID %d tiene el mismo nombre." -#: access/transam/rmgr.c:135 +#: access/transam/rmgr.c:144 #, c-format msgid "registered custom resource manager \"%s\" with ID %d" msgstr "se registró el gestor de recursos «%s» con ID %d" -#: access/transam/slru.c:714 +#: access/transam/slru.c:361 +#, c-format +msgid "\"%s\" must be a multiple of %d" +msgstr "«%s» debe ser múltiple de %d" + +#: access/transam/slru.c:830 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "el archivo «%s» no existe, leyendo como ceros" -#: access/transam/slru.c:946 access/transam/slru.c:952 -#: access/transam/slru.c:960 access/transam/slru.c:965 -#: access/transam/slru.c:972 access/transam/slru.c:977 -#: access/transam/slru.c:984 access/transam/slru.c:991 +#: access/transam/slru.c:1059 access/transam/slru.c:1065 +#: access/transam/slru.c:1073 access/transam/slru.c:1078 +#: access/transam/slru.c:1085 access/transam/slru.c:1090 +#: access/transam/slru.c:1097 access/transam/slru.c:1104 #, c-format msgid "could not access status of transaction %u" msgstr "no se pudo encontrar el estado de la transacción %u" -#: access/transam/slru.c:947 +#: access/transam/slru.c:1060 #, c-format msgid "Could not open file \"%s\": %m." msgstr "No se pudo abrir el archivo «%s»: %m." -#: access/transam/slru.c:953 +#: access/transam/slru.c:1066 #, c-format msgid "Could not seek in file \"%s\" to offset %d: %m." msgstr "No se pudo posicionar (seek) en el archivo «%s» a la posición %d: %m." -#: access/transam/slru.c:961 +#: access/transam/slru.c:1074 #, c-format msgid "Could not read from file \"%s\" at offset %d: %m." msgstr "No se pudo leer desde el archivo «%s» en la posición %d: %m." -#: access/transam/slru.c:966 +#: access/transam/slru.c:1079 #, c-format msgid "Could not read from file \"%s\" at offset %d: read too few bytes." msgstr "No se pudo leer desde el archivo «%s» en la posición %d: se leyeron muy pocos bytes." -#: access/transam/slru.c:973 +#: access/transam/slru.c:1086 #, c-format msgid "Could not write to file \"%s\" at offset %d: %m." msgstr "No se pudo escribir al archivo «%s» en la posición %d: %m." -#: access/transam/slru.c:978 +#: access/transam/slru.c:1091 #, c-format msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." msgstr "No se pudo escribir al archivo «%s» en la posición %d: se escribieron muy pocos bytes." -#: access/transam/slru.c:985 +#: access/transam/slru.c:1098 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "No se pudo sincronizar (fsync) archivo «%s»: %m." -#: access/transam/slru.c:992 +#: access/transam/slru.c:1105 #, c-format msgid "Could not close file \"%s\": %m." msgstr "No se pudo cerrar el archivo «%s»: %m." -#: access/transam/slru.c:1253 +#: access/transam/slru.c:1431 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" -msgstr "no se pudo truncar el directorio «%s»: aparente problema por reciclaje de transacciones" +msgstr "no se pudo truncar el directorio «%s»: “wraparound†aparente" #: access/transam/timeline.c:163 access/transam/timeline.c:168 #, c-format @@ -1981,775 +2164,824 @@ msgstr "IDs de timeline deben ser menores que el ID de timeline del hijo." msgid "requested timeline %u is not in this server's history" msgstr "el timeline %u solicitado no está en la historia de este servidor" -#: access/transam/twophase.c:385 +#: access/transam/twophase.c:368 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "identificador de transacción «%s» es demasiado largo" -#: access/transam/twophase.c:392 +#: access/transam/twophase.c:375 #, c-format msgid "prepared transactions are disabled" msgstr "las transacciones preparadas están deshabilitadas" -#: access/transam/twophase.c:393 +#: access/transam/twophase.c:376 #, c-format -msgid "Set max_prepared_transactions to a nonzero value." -msgstr "Defina max_prepared_transactions a un valor distinto de cero." +msgid "Set \"max_prepared_transactions\" to a nonzero value." +msgstr "Defina «max_prepared_transactions» a un valor distinto de cero." -#: access/transam/twophase.c:412 +#: access/transam/twophase.c:395 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "identificador de transacción «%s» ya está siendo utilizado" -#: access/transam/twophase.c:421 access/transam/twophase.c:2484 +#: access/transam/twophase.c:404 access/transam/twophase.c:2531 #, c-format msgid "maximum number of prepared transactions reached" msgstr "se alcanzó el número máximo de transacciones preparadas" -#: access/transam/twophase.c:422 access/transam/twophase.c:2485 +#: access/transam/twophase.c:405 access/transam/twophase.c:2532 #, c-format -msgid "Increase max_prepared_transactions (currently %d)." -msgstr "Incremente max_prepared_transactions (actualmente es %d)." +msgid "Increase \"max_prepared_transactions\" (currently %d)." +msgstr "Incremente «max_prepared_transactions» (actualmente es %d)." -#: access/transam/twophase.c:598 +#: access/transam/twophase.c:580 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "transacción preparada con identificador «%s» está ocupada" -#: access/transam/twophase.c:604 +#: access/transam/twophase.c:586 #, c-format msgid "permission denied to finish prepared transaction" msgstr "se ha denegado el permiso para finalizar la transacción preparada" -#: access/transam/twophase.c:605 +#: access/transam/twophase.c:587 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "Debe ser superusuario o el usuario que preparó la transacción." -#: access/transam/twophase.c:616 +#: access/transam/twophase.c:598 #, c-format msgid "prepared transaction belongs to another database" msgstr "la transacción preparada pertenece a otra base de datos" -#: access/transam/twophase.c:617 +#: access/transam/twophase.c:599 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "Conéctese a la base de datos donde la transacción fue preparada para terminarla." -#: access/transam/twophase.c:632 +#: access/transam/twophase.c:614 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "transacción preparada con identificador «%s» no existe" -#: access/transam/twophase.c:1167 +#: access/transam/twophase.c:1174 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "el largo máximo del archivo de estado de dos fases fue excedido" -#: access/transam/twophase.c:1322 +#: access/transam/twophase.c:1329 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" msgstr[0] "tamaño incorrecto de archivo «%s»: %lld byte" msgstr[1] "tamaño incorrecto de archivo «%s»: %lld bytes" -#: access/transam/twophase.c:1331 +#: access/transam/twophase.c:1338 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "alineamiento incorrecto del offset del CRC para el archivo «%s»" -#: access/transam/twophase.c:1349 +#: access/transam/twophase.c:1356 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "no se pudo leer el archivo «%s»: leídos %d de %lld" -#: access/transam/twophase.c:1364 +#: access/transam/twophase.c:1371 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "número mágico no válido almacenado en archivo «%s»" -#: access/transam/twophase.c:1370 +#: access/transam/twophase.c:1377 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "tamaño no válido en archivo «%s»" -#: access/transam/twophase.c:1382 +#: access/transam/twophase.c:1389 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "la suma de verificación calculada no coincide con el valor almacenado en el archivo «%s»" -#: access/transam/twophase.c:1412 access/transam/xlogrecovery.c:590 -#: replication/logical/logical.c:209 replication/walsender.c:687 +#: access/transam/twophase.c:1419 access/transam/xlogrecovery.c:565 +#: postmaster/walsummarizer.c:936 replication/logical/logical.c:211 +#: replication/walsender.c:836 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Falló mientras se emplazaba un procesador de lectura de WAL." -#: access/transam/twophase.c:1422 +#: access/transam/twophase.c:1429 #, c-format msgid "could not read two-phase state from WAL at %X/%X: %s" msgstr "no se pudo leer el archivo de estado de dos fases desde WAL en %X/%X: %s" -#: access/transam/twophase.c:1427 +#: access/transam/twophase.c:1434 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "no se pudo leer el archivo de estado de dos fases desde WAL en %X/%X" -#: access/transam/twophase.c:1435 +#: access/transam/twophase.c:1442 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "los datos de estado de dos fases esperados no están presentes en WAL en %X/%X" -#: access/transam/twophase.c:1731 +#: access/transam/twophase.c:1745 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "no se pudo recrear archivo «%s»: %m" -#: access/transam/twophase.c:1858 +#: access/transam/twophase.c:1872 #, c-format msgid "%u two-phase state file was written for a long-running prepared transaction" msgid_plural "%u two-phase state files were written for long-running prepared transactions" msgstr[0] "%u archivo de estado de dos fases fue escrito para transacción de larga duración" msgstr[1] "%u archivos de estado de dos fases fueron escritos para transacciones de larga duración" -#: access/transam/twophase.c:2092 +#: access/transam/twophase.c:2107 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "recuperando transacción preparada %u desde memoria compartida" -#: access/transam/twophase.c:2185 +#: access/transam/twophase.c:2200 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "eliminando archivo obsoleto de estado de dos fases para transacción %u" -#: access/transam/twophase.c:2192 +#: access/transam/twophase.c:2207 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "eliminando de memoria estado de dos fases obsoleto para transacción %u" -#: access/transam/twophase.c:2205 +#: access/transam/twophase.c:2220 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "eliminando archivo futuro de estado de dos fases para transacción %u" -#: access/transam/twophase.c:2212 +#: access/transam/twophase.c:2227 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "eliminando estado de dos fases futuro de memoria para transacción %u" -#: access/transam/twophase.c:2237 +#: access/transam/twophase.c:2252 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "archivo de estado de dos fases corrupto para transacción %u" -#: access/transam/twophase.c:2242 +#: access/transam/twophase.c:2257 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "estado de dos fases en memoria corrupto para transacción %u" -#: access/transam/varsup.c:129 +#: access/transam/twophase.c:2514 #, c-format -msgid "database is not accepting commands to avoid wraparound data loss in database \"%s\"" -msgstr "la base de datos no está aceptando órdenes para evitar pérdida de datos debido al problema del reciclaje de transacciones en la base de datos «%s»" +msgid "could not recover two-phase state file for transaction %u" +msgstr "no se pudo recuperar el archivo de estado de dos fases para la transacción %u" -#: access/transam/varsup.c:131 access/transam/varsup.c:138 +#: access/transam/twophase.c:2516 #, c-format -msgid "" -"Stop the postmaster and vacuum that database in single-user mode.\n" -"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." -msgstr "" -"Detenga el postmaster y ejecute VACUUM de la base completa en esa base de datos.\n" -"Puede que además necesite comprometer o abortar transacciones preparadas antiguas, o eliminar slots de replicación añejos." +msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." +msgstr "El archivo de estado en dos fases ha sido encontrado en el registro de WAL %X/%X, pero esta transacción ya ha sido restaurada desde disco." + +#: access/transam/twophase.c:2524 storage/file/fd.c:514 utils/fmgr/dfmgr.c:209 +#, c-format +msgid "could not access file \"%s\": %m" +msgstr "no se pudo acceder al archivo «%s»: %m" + +#: access/transam/varsup.c:156 +#, c-format +msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database \"%s\"" +msgstr "la base de datos no está aceptando órdenes que asignen nuevos IDs de transacción para evitar pérdida de datos debido al “wraparound†en la base de datos «%s»" -#: access/transam/varsup.c:136 +#: access/transam/varsup.c:163 #, c-format -msgid "database is not accepting commands to avoid wraparound data loss in database with OID %u" -msgstr "la base de datos no está aceptando órdenes para evitar pérdida de datos debido al problema del reciclaje de transacciones en la base con OID %u" +msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database with OID %u" +msgstr "la base de datos no está aceptando órdenes que generen nuevos IDs de transacción para evitar pérdida de datos debido al “wraparound†en la base con OID %u" -#: access/transam/varsup.c:148 access/transam/varsup.c:463 +#: access/transam/varsup.c:175 access/transam/varsup.c:490 #, c-format msgid "database \"%s\" must be vacuumed within %u transactions" msgstr "base de datos «%s» debe ser limpiada dentro de %u transacciones" -#: access/transam/varsup.c:155 access/transam/varsup.c:470 +#: access/transam/varsup.c:178 +#, c-format +msgid "" +"To avoid transaction ID assignment failures, execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"Para evitar fallas de asignación de IDs de transacción, ejecute VACUUM en esa base de datos.\n" +"Puede que además necesite comprometer o abortar transacciones preparadas antiguas, o eliminar slots de replicación añejos." + +#: access/transam/varsup.c:182 access/transam/varsup.c:497 #, c-format msgid "database with OID %u must be vacuumed within %u transactions" msgstr "base de datos con OID %u debe ser limpiada dentro de %u transacciones" -#: access/transam/xact.c:1102 +#: access/transam/varsup.c:185 access/transam/varsup.c:493 +#: access/transam/varsup.c:500 +#, c-format +msgid "" +"To avoid XID assignment failures, execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"Para evitar que la base de datos se desactive, ejecute VACUUM en esa base de datos.\n" +"Puede que además necesite comprometer o abortar transacciones preparadas antiguas, o eliminar slots de replicación añejos." + +#: access/transam/xact.c:649 +#, c-format +msgid "cannot assign transaction IDs during a parallel operation" +msgstr "no se puede asignar IDs de transacción durante una operación paralela" + +#: access/transam/xact.c:840 +#, c-format +msgid "cannot modify data in a parallel worker" +msgstr "no se pueden modificar datos en un proceso ayudante paralelo" + +#: access/transam/xact.c:1115 +#, c-format +msgid "cannot start commands during a parallel operation" +msgstr "no se puede iniciar órdenes durante una operación paralela" + +#: access/transam/xact.c:1123 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "no se pueden tener más de 2^32-2 órdenes en una transacción" -#: access/transam/xact.c:1643 +#: access/transam/xact.c:1664 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "se superó el número máximo de subtransacciones comprometidas (%d)" -#: access/transam/xact.c:2513 +#: access/transam/xact.c:2561 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "no se puede hacer PREPARE de una transacción que ha operado en objetos temporales" -#: access/transam/xact.c:2523 +#: access/transam/xact.c:2571 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "no se puede hacer PREPARE de una transacción que ha exportado snapshots" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3490 +#: access/transam/xact.c:3593 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s no puede ser ejecutado dentro de un bloque de transacción" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3500 +#: access/transam/xact.c:3603 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s no puede ser ejecutado dentro de una subtransacción" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3510 -#, fuzzy, c-format -#| msgid "%s cannot be executed from a function" +#: access/transam/xact.c:3613 +#, c-format msgid "%s cannot be executed within a pipeline" -msgstr "%s no puede ser ejecutado desde una función" +msgstr "%s no puede ser ejecutado en un “pipelineâ€" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3520 +#: access/transam/xact.c:3623 #, c-format msgid "%s cannot be executed from a function" msgstr "%s no puede ser ejecutado desde una función" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3591 access/transam/xact.c:3916 -#: access/transam/xact.c:3995 access/transam/xact.c:4118 -#: access/transam/xact.c:4269 access/transam/xact.c:4338 -#: access/transam/xact.c:4449 +#: access/transam/xact.c:3694 access/transam/xact.c:4019 +#: access/transam/xact.c:4098 access/transam/xact.c:4221 +#: access/transam/xact.c:4372 access/transam/xact.c:4441 +#: access/transam/xact.c:4552 #, c-format msgid "%s can only be used in transaction blocks" msgstr "la orden %s sólo puede ser usada en bloques de transacción" -#: access/transam/xact.c:3802 +#: access/transam/xact.c:3905 #, c-format msgid "there is already a transaction in progress" msgstr "ya hay una transacción en curso" -#: access/transam/xact.c:3921 access/transam/xact.c:4000 -#: access/transam/xact.c:4123 +#: access/transam/xact.c:4024 access/transam/xact.c:4103 +#: access/transam/xact.c:4226 #, c-format msgid "there is no transaction in progress" msgstr "no hay una transacción en curso" -#: access/transam/xact.c:4011 +#: access/transam/xact.c:4114 #, c-format msgid "cannot commit during a parallel operation" msgstr "no se puede comprometer una transacción durante una operación paralela" -#: access/transam/xact.c:4134 +#: access/transam/xact.c:4237 #, c-format msgid "cannot abort during a parallel operation" msgstr "no se puede abortar durante una operación paralela" -#: access/transam/xact.c:4233 +#: access/transam/xact.c:4336 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "no se pueden definir savepoints durante una operación paralela" -#: access/transam/xact.c:4320 +#: access/transam/xact.c:4423 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "no se pueden liberar savepoints durante una operación paralela" -#: access/transam/xact.c:4330 access/transam/xact.c:4381 -#: access/transam/xact.c:4441 access/transam/xact.c:4490 +#: access/transam/xact.c:4433 access/transam/xact.c:4484 +#: access/transam/xact.c:4544 access/transam/xact.c:4593 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "no existe el «savepoint» «%s»" -#: access/transam/xact.c:4387 access/transam/xact.c:4496 +#: access/transam/xact.c:4490 access/transam/xact.c:4599 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "el «savepoint» «%s» no existe dentro del nivel de savepoint actual" -#: access/transam/xact.c:4429 +#: access/transam/xact.c:4532 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "no se puede hacer rollback a un savepoint durante una operación paralela" -#: access/transam/xact.c:4557 -#, c-format -msgid "cannot start subtransactions during a parallel operation" -msgstr "no se pueden iniciar subtransacciones durante una operación paralela" - -#: access/transam/xact.c:4625 -#, c-format -msgid "cannot commit subtransactions during a parallel operation" -msgstr "no se pueden comprometer subtransacciones durante una operación paralela" - -#: access/transam/xact.c:5271 +#: access/transam/xact.c:5376 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "no se pueden tener más de 2^32-1 subtransacciones en una transacción" -#: access/transam/xlog.c:1466 +#: access/transam/xlog.c:1542 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" msgstr "petición para sincronizar (flush) más allá del final del WAL generado; petición %X/%X, posición actual %X/%X" +#: access/transam/xlog.c:1769 +#, c-format +msgid "cannot read past end of generated WAL: requested %X/%X, current position %X/%X" +msgstr "no se puede ler más allá del final del WAL generado; petición %X/%X, posición actual %X/%X" + +#: access/transam/xlog.c:2210 access/transam/xlog.c:4501 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "El tamaño de segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB." + #: access/transam/xlog.c:2228 #, c-format -msgid "could not write to log file %s at offset %u, length %zu: %m" -msgstr "no se pudo escribir archivo de registro %s en la posición %u, largo %zu: %m" +msgid "\"%s\" must be set to -1 during binary upgrade mode." +msgstr "«%s» debe ser establecido a -1 durante el modo de actualización binaria." + +#: access/transam/xlog.c:2477 +#, c-format +msgid "could not write to log file \"%s\" at offset %u, length %zu: %m" +msgstr "no se pudo escribir archivo de registro «%s» en la posición %u, largo %zu: %m" -#: access/transam/xlog.c:3455 access/transam/xlogutils.c:833 -#: replication/walsender.c:2725 +#: access/transam/xlog.c:3739 access/transam/xlogutils.c:831 +#: replication/walsender.c:3045 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "el segmento de WAL solicitado %s ya ha sido eliminado" -#: access/transam/xlog.c:3739 +#: access/transam/xlog.c:4061 #, c-format msgid "could not rename file \"%s\": %m" msgstr "no se pudo renombrar el archivo «%s»: %m" -#: access/transam/xlog.c:3781 access/transam/xlog.c:3791 +#: access/transam/xlog.c:4104 access/transam/xlog.c:4115 +#: access/transam/xlog.c:4136 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "no existe el directorio WAL «%s»" -#: access/transam/xlog.c:3797 +#: access/transam/xlog.c:4121 access/transam/xlog.c:4142 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "creando el directorio WAL faltante «%s»" -#: access/transam/xlog.c:3800 commands/dbcommands.c:3095 +#: access/transam/xlog.c:4125 access/transam/xlog.c:4145 +#: commands/dbcommands.c:3262 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "no se pudo crear el directorio faltante «%s»: %m" -#: access/transam/xlog.c:3867 +#: access/transam/xlog.c:4212 #, c-format msgid "could not generate secret authorization token" msgstr "no se pudo generar un token de autorización secreto" -#: access/transam/xlog.c:4017 access/transam/xlog.c:4026 -#: access/transam/xlog.c:4050 access/transam/xlog.c:4057 -#: access/transam/xlog.c:4064 access/transam/xlog.c:4069 -#: access/transam/xlog.c:4076 access/transam/xlog.c:4083 -#: access/transam/xlog.c:4090 access/transam/xlog.c:4097 -#: access/transam/xlog.c:4104 access/transam/xlog.c:4111 -#: access/transam/xlog.c:4120 access/transam/xlog.c:4127 -#: utils/init/miscinit.c:1762 +#: access/transam/xlog.c:4363 access/transam/xlog.c:4373 +#: access/transam/xlog.c:4399 access/transam/xlog.c:4407 +#: access/transam/xlog.c:4415 access/transam/xlog.c:4421 +#: access/transam/xlog.c:4429 access/transam/xlog.c:4437 +#: access/transam/xlog.c:4445 access/transam/xlog.c:4453 +#: access/transam/xlog.c:4461 access/transam/xlog.c:4469 +#: access/transam/xlog.c:4479 access/transam/xlog.c:4487 +#: utils/init/miscinit.c:1812 #, c-format msgid "database files are incompatible with server" msgstr "los archivos de base de datos son incompatibles con el servidor" -#: access/transam/xlog.c:4018 +#: access/transam/xlog.c:4364 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "Los archivos de base de datos fueron inicializados con PG_CONTROL_VERSION %d (0x%08x), pero el servidor fue compilado con PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlog.c:4022 +#: access/transam/xlog.c:4368 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "Este puede ser un problema de discordancia en el orden de bytes. Parece que necesitará ejecutar initdb." -#: access/transam/xlog.c:4027 +#: access/transam/xlog.c:4374 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "Los archivos de base de datos fueron inicializados con PG_CONTROL_VERSION %d, pero el servidor fue compilado con PG_CONTROL_VERSION %d." -#: access/transam/xlog.c:4030 access/transam/xlog.c:4054 -#: access/transam/xlog.c:4061 access/transam/xlog.c:4066 +#: access/transam/xlog.c:4377 access/transam/xlog.c:4403 +#: access/transam/xlog.c:4411 access/transam/xlog.c:4417 #, c-format msgid "It looks like you need to initdb." msgstr "Parece que necesita ejecutar initdb." -#: access/transam/xlog.c:4041 +#: access/transam/xlog.c:4389 #, c-format msgid "incorrect checksum in control file" msgstr "la suma de verificación es incorrecta en el archivo de control" -#: access/transam/xlog.c:4051 +#: access/transam/xlog.c:4400 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "Los archivos de base de datos fueron inicializados con CATALOG_VERSION_NO %d, pero el servidor fue compilado con CATALOG_VERSION_NO %d." -#: access/transam/xlog.c:4058 +#: access/transam/xlog.c:4408 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "Los archivos de la base de datos fueron inicializados con MAXALIGN %d, pero el servidor fue compilado con MAXALIGN %d." -#: access/transam/xlog.c:4065 +#: access/transam/xlog.c:4416 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "Los archivos de la base de datos parecen usar un formato de número de coma flotante distinto al del ejecutable del servidor." -#: access/transam/xlog.c:4070 +#: access/transam/xlog.c:4422 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "Los archivos de base de datos fueron inicializados con BLCKSZ %d, pero el servidor fue compilado con BLCKSZ %d." -#: access/transam/xlog.c:4073 access/transam/xlog.c:4080 -#: access/transam/xlog.c:4087 access/transam/xlog.c:4094 -#: access/transam/xlog.c:4101 access/transam/xlog.c:4108 -#: access/transam/xlog.c:4115 access/transam/xlog.c:4123 -#: access/transam/xlog.c:4130 +#: access/transam/xlog.c:4425 access/transam/xlog.c:4433 +#: access/transam/xlog.c:4441 access/transam/xlog.c:4449 +#: access/transam/xlog.c:4457 access/transam/xlog.c:4465 +#: access/transam/xlog.c:4473 access/transam/xlog.c:4482 +#: access/transam/xlog.c:4490 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Parece que necesita recompilar o ejecutar initdb." -#: access/transam/xlog.c:4077 +#: access/transam/xlog.c:4430 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "Los archivos de la base de datos fueron inicializados con RELSEG_SIZE %d, pero el servidor fue compilado con RELSEG_SIZE %d." -#: access/transam/xlog.c:4084 +#: access/transam/xlog.c:4438 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "Los archivos de base de datos fueron inicializados con XLOG_BLCKSZ %d, pero el servidor fue compilado con XLOG_BLCKSZ %d." -#: access/transam/xlog.c:4091 +#: access/transam/xlog.c:4446 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "Los archivos de la base de datos fueron inicializados con NAMEDATALEN %d, pero el servidor fue compilado con NAMEDATALEN %d." -#: access/transam/xlog.c:4098 +#: access/transam/xlog.c:4454 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "Los archivos de la base de datos fueron inicializados con INDEX_MAX_KEYS %d, pero el servidor fue compilado con INDEX_MAX_KEYS %d." -#: access/transam/xlog.c:4105 +#: access/transam/xlog.c:4462 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "Los archivos de la base de datos fueron inicializados con TOAST_MAX_CHUNK_SIZE %d, pero el servidor fue compilado con TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlog.c:4112 +#: access/transam/xlog.c:4470 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "Los archivos de base de datos fueron inicializados con LOBLKSIZE %d, pero el servidor fue compilado con LOBLKSIZE %d." -#: access/transam/xlog.c:4121 +#: access/transam/xlog.c:4480 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "Los archivos de base de datos fueron inicializados sin USE_FLOAT8_BYVAL, pero el servidor fue compilado con USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4128 +#: access/transam/xlog.c:4488 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "Los archivos de base de datos fueron inicializados con USE_FLOAT8_BYVAL, pero el servidor fue compilado sin USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4137 +#: access/transam/xlog.c:4497 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" -msgstr[0] "El tamaño del segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el archivo de control especifica %d byte" -msgstr[1] "El tamaño del segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el archivo de control especifica %d bytes" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "tamaño de segmento de WAL no válido (%d byte) en archivo de control" +msgstr[1] "tamaño de segmento de WAL no válido (%d bytes) en archivo de control" -#: access/transam/xlog.c:4149 +#: access/transam/xlog.c:4510 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "«min_wal_size» debe ser al menos el doble de «wal_segment_size»" -#: access/transam/xlog.c:4153 +#: access/transam/xlog.c:4514 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "«max_wal_size» debe ser al menos el doble de «wal_segment_size»" -#: access/transam/xlog.c:4308 catalog/namespace.c:4335 -#: commands/tablespace.c:1216 commands/user.c:2536 commands/variable.c:72 -#: utils/error/elog.c:2205 +#: access/transam/xlog.c:4662 catalog/namespace.c:4696 +#: commands/tablespace.c:1210 commands/user.c:2529 commands/variable.c:72 +#: replication/slot.c:2429 tcop/postgres.c:3715 utils/error/elog.c:2247 #, c-format msgid "List syntax is invalid." msgstr "La sintaxis de lista no es válida." -#: access/transam/xlog.c:4354 commands/user.c:2552 commands/variable.c:173 -#: utils/error/elog.c:2231 +#: access/transam/xlog.c:4708 commands/user.c:2545 commands/variable.c:173 +#: tcop/postgres.c:3731 utils/error/elog.c:2273 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "Palabra clave no reconocida: «%s»." -#: access/transam/xlog.c:4768 +#: access/transam/xlog.c:5129 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "no se pudo escribir el archivo WAL de boostrap: %m" -#: access/transam/xlog.c:4776 +#: access/transam/xlog.c:5137 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "no se pudo sincronizar (fsync) el archivo de WAL de bootstrap: %m" -#: access/transam/xlog.c:4782 +#: access/transam/xlog.c:5143 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "no se pudo cerrar el archivo WAL de bootstrap: %m" -#: access/transam/xlog.c:4999 +#: access/transam/xlog.c:5368 #, c-format -msgid "WAL was generated with wal_level=minimal, cannot continue recovering" -msgstr "el WAL fue generado con wal_level=minimal, no se puede continuar con la recuperación" +msgid "WAL was generated with \"wal_level=minimal\", cannot continue recovering" +msgstr "el WAL fue generado con «wal_level=minimal», no se puede continuar con la recuperación" -#: access/transam/xlog.c:5000 +#: access/transam/xlog.c:5369 #, c-format -msgid "This happens if you temporarily set wal_level=minimal on the server." -msgstr "Esto sucede si temporalmente define wal_level=minimal en el servidor." +msgid "This happens if you temporarily set \"wal_level=minimal\" on the server." +msgstr "Esto sucede si temporalmente define «wal_level=minimal» en el servidor." -#: access/transam/xlog.c:5001 +#: access/transam/xlog.c:5370 #, c-format -msgid "Use a backup taken after setting wal_level to higher than minimal." -msgstr "Utilice un respaldo tomado después de establecer wal_level a un valor superior a minimal." +msgid "Use a backup taken after setting \"wal_level\" to higher than \"minimal\"." +msgstr "Utilice un respaldo tomado después de establecer «wal_level» a un valor superior a «minimal»." -#: access/transam/xlog.c:5065 +#: access/transam/xlog.c:5435 #, c-format msgid "control file contains invalid checkpoint location" -msgstr "el archivo de control contiene una ubicación no válida de punto de control" +msgstr "el archivo de control contiene una ubicación no válida de checkpoint" -#: access/transam/xlog.c:5076 +#: access/transam/xlog.c:5446 #, c-format msgid "database system was shut down at %s" msgstr "el sistema de bases de datos fue apagado en %s" -#: access/transam/xlog.c:5082 +#: access/transam/xlog.c:5452 #, c-format msgid "database system was shut down in recovery at %s" msgstr "el sistema de bases de datos fue apagado durante la recuperación en %s" -#: access/transam/xlog.c:5088 +#: access/transam/xlog.c:5458 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "el apagado del sistema de datos fue interrumpido; última vez registrada en funcionamiento en %s" -#: access/transam/xlog.c:5094 +#: access/transam/xlog.c:5464 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "el sistema de bases de datos fue interrumpido durante la recuperación en %s" -#: access/transam/xlog.c:5096 +#: access/transam/xlog.c:5466 #, c-format msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." msgstr "Esto probablemente significa que algunos datos están corruptos y tendrá que usar el respaldo más reciente para la recuperación." -#: access/transam/xlog.c:5102 +#: access/transam/xlog.c:5472 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "el sistema de bases de datos fue interrumpido durante la recuperación en el instante de registro %s" -#: access/transam/xlog.c:5104 +#: access/transam/xlog.c:5474 #, c-format msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." msgstr "Si esto ha ocurrido más de una vez, algunos datos podrían estar corruptos y podría ser necesario escoger un punto de recuperación anterior." -#: access/transam/xlog.c:5110 +#: access/transam/xlog.c:5480 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "el sistema de bases de datos fue interrumpido; última vez en funcionamiento en %s" -#: access/transam/xlog.c:5116 +#: access/transam/xlog.c:5487 #, c-format msgid "control file contains invalid database cluster state" msgstr "el archivo de control contiene un estado no válido del clúster" -#: access/transam/xlog.c:5500 +#: access/transam/xlog.c:5875 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL termina antes del fin del respaldo en línea" -#: access/transam/xlog.c:5501 +#: access/transam/xlog.c:5876 #, c-format msgid "All WAL generated while online backup was taken must be available at recovery." msgstr "Todo el WAL generado durante el respaldo en línea debe estar disponible durante la recuperación." -#: access/transam/xlog.c:5504 +#: access/transam/xlog.c:5880 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL termina antes del punto de recuperación consistente" -#: access/transam/xlog.c:5550 +#: access/transam/xlog.c:5926 #, c-format msgid "selected new timeline ID: %u" msgstr "seleccionado nuevo ID de timeline: %u" -#: access/transam/xlog.c:5583 +#: access/transam/xlog.c:5959 #, c-format msgid "archive recovery complete" msgstr "recuperación completa" -#: access/transam/xlog.c:6185 +#: access/transam/xlog.c:6612 #, c-format msgid "shutting down" msgstr "apagando" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6224 +#: access/transam/xlog.c:6651 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "empezando restartpoint:%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6236 +#: access/transam/xlog.c:6663 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "empezando checkpoint:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6301 -#, fuzzy, c-format -#| msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +#: access/transam/xlog.c:6728 +#, c-format msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" -msgstr "restartpoint completado: se escribió %d buffers (%.1f%%); %d archivo(s) de WAL añadido(s), %d eliminado(s), %d reciclado(s); escritura=%ld.%03d s, sincronización=%ld.%03d s, total=%ld.%03d s; archivos sincronizados=%d, más largo=%ld.%03d s, promedio=%ld.%03d s; distancia=%d kB, estimado=%d kB" +msgstr "restartpoint completo: escritos %d búfers (%.1f%%); %d archivos WAL añadidos, %d eliminados, %d reciclados; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; archivos sincronizados=%d, más largo=%ld.%03d s, promedio=%ld.%03d s; distancia=%d kB, estimación=%d kB; lsn=%X/%X, lsn de redo=%X/%X" -#: access/transam/xlog.c:6324 -#, fuzzy, c-format -#| msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +#: access/transam/xlog.c:6751 +#, c-format msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" -msgstr "checkpoint completado: se escribió %d buffers (%.1f%%); %d archivo(s) de WAL añadido(s), %d eliminado(s), %d reciclado(s); escritura=%ld.%03d s, sincronización=%ld.%03d s, total=%ld.%03d s; archivos sincronizados=%d, más largo=%ld.%03d s, promedio=%ld.%03d s; distancia=%d kB, estimado=%d kB" +msgstr "checkpoint completo: escritos %d búfers (%.1f%%); %d archivos WAL añadidos, %d eliminados, %d reciclados; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; archivos sincronizados=%d, más largo=%ld.%03d s, promedio=%ld.%03d s; distancia=%d kB, estimación=%d kB; lsn=%X/%X, lsn de redo=%X/%X" -#: access/transam/xlog.c:6762 +#: access/transam/xlog.c:7233 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "hay actividad de WAL mientras el sistema se está apagando" -#: access/transam/xlog.c:7323 +#: access/transam/xlog.c:7818 #, c-format msgid "recovery restart point at %X/%X" msgstr "restartpoint de recuperación en %X/%X" -#: access/transam/xlog.c:7325 +#: access/transam/xlog.c:7820 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Última transacción completada al tiempo de registro %s." -#: access/transam/xlog.c:7573 +#: access/transam/xlog.c:8082 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "punto de recuperación «%s» creado en %X/%X" -#: access/transam/xlog.c:7780 +#: access/transam/xlog.c:8289 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "el respaldo en línea fue cancelado, la recuperación no puede continuar" -#: access/transam/xlog.c:7837 +#: access/transam/xlog.c:8347 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "ID de timeline %u inesperado (debería ser %u) en el registro de checkpoint de detención" -#: access/transam/xlog.c:7895 +#: access/transam/xlog.c:8405 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "ID de timeline %u inesperado (debería ser %u) en el registro de checkpoint «online»" -#: access/transam/xlog.c:7924 +#: access/transam/xlog.c:8434 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "ID de timeline %u inesperado (debería ser %u) en el registro de fin-de-recuperación" -#: access/transam/xlog.c:8191 +#: access/transam/xlog.c:8705 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "no se pudo sincronizar (fsync write-through) el archivo «%s»: %m" -#: access/transam/xlog.c:8196 +#: access/transam/xlog.c:8710 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "no se pudo sincronizar (fdatasync) archivo «%s»: %m" -#: access/transam/xlog.c:8281 access/transam/xlog.c:8604 +#: access/transam/xlog.c:8797 access/transam/xlog.c:9133 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "el nivel de WAL no es suficiente para hacer un respaldo en línea" -#: access/transam/xlog.c:8282 access/transam/xlog.c:8605 -#: access/transam/xlogfuncs.c:253 +#: access/transam/xlog.c:8798 access/transam/xlogfuncs.c:248 #, c-format -msgid "wal_level must be set to \"replica\" or \"logical\" at server start." -msgstr "wal_level debe ser definido a «replica» o «logical» al inicio del servidor." +msgid "\"wal_level\" must be set to \"replica\" or \"logical\" at server start." +msgstr "«wal_level» debe ser definido a «replica» o «logical» al inicio del servidor." -#: access/transam/xlog.c:8287 +#: access/transam/xlog.c:8803 #, c-format msgid "backup label too long (max %d bytes)" msgstr "la etiqueta de respaldo es demasiado larga (máximo %d bytes)" -#: access/transam/xlog.c:8408 +#: access/transam/xlog.c:8924 #, c-format -msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "el WAL generado con full_page_writes=off fue restaurado desde el último restartpoint" +msgid "WAL generated with \"full_page_writes=off\" was replayed since last restartpoint" +msgstr "el WAL generado con «full_page_writes=off» fue restaurado desde el último restartpoint" -#: access/transam/xlog.c:8410 access/transam/xlog.c:8693 +#: access/transam/xlog.c:8926 access/transam/xlog.c:9222 #, c-format -msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." -msgstr "Esto significa que el respaldo que estaba siendo tomado en el standby está corrupto y no debería usarse. Active full_page_writes y ejecute CHECKPOINT en el primario, luego trate de ejecutar un respaldo en línea nuevamente." +msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable \"full_page_writes\" and run CHECKPOINT on the primary, and then try an online backup again." +msgstr "Esto significa que el respaldo que estaba siendo tomado en el standby está corrupto y no debería usarse. Active «full_page_writes» y ejecute CHECKPOINT en el primario, luego trate de ejecutar un respaldo en línea nuevamente." -#: access/transam/xlog.c:8477 backup/basebackup.c:1351 utils/adt/misc.c:354 +#: access/transam/xlog.c:9006 backup/basebackup.c:1417 utils/adt/misc.c:354 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "no se pudo leer el enlace simbólico «%s»: %m" -#: access/transam/xlog.c:8484 backup/basebackup.c:1356 utils/adt/misc.c:359 +#: access/transam/xlog.c:9013 backup/basebackup.c:1422 utils/adt/misc.c:359 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "la ruta «%s» del enlace simbólico es demasiado larga" -#: access/transam/xlog.c:8643 backup/basebackup.c:1217 +#: access/transam/xlog.c:9134 +#, c-format +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "wal_level debe ser definido a «replica» o «logical» al inicio del servidor." + +#: access/transam/xlog.c:9172 backup/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "el standby fue promovido durante el respaldo en línea" -#: access/transam/xlog.c:8644 backup/basebackup.c:1218 +#: access/transam/xlog.c:9173 backup/basebackup.c:1282 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "Esto significa que el respaldo que se estaba tomando está corrupto y no debería ser usado. Trate de ejecutar un nuevo respaldo en línea." -#: access/transam/xlog.c:8691 +#: access/transam/xlog.c:9220 #, c-format -msgid "WAL generated with full_page_writes=off was replayed during online backup" -msgstr "el WAL generado con full_page_writes=off fue restaurado durante el respaldo en línea" +msgid "WAL generated with \"full_page_writes=off\" was replayed during online backup" +msgstr "el WAL generado con «full_page_writes=off» fue restaurado durante el respaldo en línea" -#: access/transam/xlog.c:8807 +#: access/transam/xlog.c:9336 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "respaldo base completo, esperando que se archiven los segmentos WAL requeridos" -#: access/transam/xlog.c:8821 +#: access/transam/xlog.c:9350 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "todavía en espera de que todos los segmentos WAL requeridos sean archivados (han pasado %d segundos)" -#: access/transam/xlog.c:8823 +#: access/transam/xlog.c:9352 #, c-format -msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." -msgstr "Verifique que su archive_command se esté ejecutando con normalidad. Puede cancelar este respaldo con confianza, pero el respaldo de la base de datos no será utilizable a menos que disponga de todos los segmentos de WAL." +msgid "Check that your \"archive_command\" is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." +msgstr "Verifique que su «archive_command» se esté ejecutando con normalidad. Puede cancelar este respaldo con confianza, pero el respaldo de la base de datos no será utilizable a menos que disponga de todos los segmentos de WAL." -#: access/transam/xlog.c:8830 +#: access/transam/xlog.c:9359 #, c-format msgid "all required WAL segments have been archived" msgstr "todos los segmentos de WAL requeridos han sido archivados" -#: access/transam/xlog.c:8834 +#: access/transam/xlog.c:9363 #, c-format msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" msgstr "el archivado de WAL no está activo; debe asegurarse que todos los segmentos WAL requeridos se copian por algún otro mecanismo para completar el respaldo" -#: access/transam/xlog.c:8873 +#: access/transam/xlog.c:9402 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "abortando el backup porque el proceso servidor terminó antes de que pg_backup_stop fuera invocada" -#: access/transam/xlogarchive.c:207 +#: access/transam/xlogarchive.c:213 #, c-format msgid "archive file \"%s\" has wrong size: %lld instead of %lld" msgstr "el archivo «%s» tiene tamaño erróneo: %lld en lugar de %lld" -#: access/transam/xlogarchive.c:216 +#: access/transam/xlogarchive.c:222 #, c-format msgid "restored log file \"%s\" from archive" msgstr "se ha restaurado el archivo «%s» desde el área de archivado" -#: access/transam/xlogarchive.c:230 +#: access/transam/xlogarchive.c:236 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "restore_command retornó un estado de salida cero, pero stat() falló." +msgid "\"restore_command\" returned a zero exit status, but stat() failed." +msgstr "«restore_command» retornó un estado de salida cero, pero stat() falló." -#: access/transam/xlogarchive.c:262 +#: access/transam/xlogarchive.c:268 #, c-format msgid "could not restore file \"%s\" from archive: %s" msgstr "no se pudo recuperar el archivo «%s»: %s" @@ -2757,1043 +2989,1097 @@ msgstr "no se pudo recuperar el archivo «%s»: %s" #. translator: First %s represents a postgresql.conf parameter name like #. "recovery_end_command", the 2nd is the value of that parameter, the #. third an already translated error message. -#: access/transam/xlogarchive.c:340 +#: access/transam/xlogarchive.c:346 #, c-format msgid "%s \"%s\": %s" msgstr "%s «%s»: %s" -#: access/transam/xlogarchive.c:450 access/transam/xlogarchive.c:530 +#: access/transam/xlogarchive.c:456 access/transam/xlogarchive.c:536 #, c-format msgid "could not create archive status file \"%s\": %m" msgstr "no se pudo crear el archivo de estado «%s»: %m" -#: access/transam/xlogarchive.c:458 access/transam/xlogarchive.c:538 +#: access/transam/xlogarchive.c:464 access/transam/xlogarchive.c:544 #, c-format msgid "could not write archive status file \"%s\": %m" msgstr "no se pudo escribir el archivo de estado «%s»: %m" -#: access/transam/xlogfuncs.c:75 backup/basebackup.c:973 +#: access/transam/xlogfuncs.c:69 backup/basebackup.c:997 #, c-format msgid "a backup is already in progress in this session" msgstr "ya hay un respaldo en curso en esta sesión" -#: access/transam/xlogfuncs.c:146 +#: access/transam/xlogfuncs.c:140 #, c-format msgid "backup is not in progress" msgstr "no hay respaldo en curso" -#: access/transam/xlogfuncs.c:147 +#: access/transam/xlogfuncs.c:141 #, c-format msgid "Did you call pg_backup_start()?" msgstr "¿Invocó pg_backup_start()?" -#: access/transam/xlogfuncs.c:190 access/transam/xlogfuncs.c:247 -#: access/transam/xlogfuncs.c:286 access/transam/xlogfuncs.c:307 -#: access/transam/xlogfuncs.c:328 +#: access/transam/xlogfuncs.c:184 access/transam/xlogfuncs.c:242 +#: access/transam/xlogfuncs.c:281 access/transam/xlogfuncs.c:302 +#: access/transam/xlogfuncs.c:323 #, c-format msgid "WAL control functions cannot be executed during recovery." msgstr "Las funciones de control de WAL no pueden ejecutarse durante la recuperación." -#: access/transam/xlogfuncs.c:215 -#, fuzzy, c-format -#| msgid "%s cannot be executed during recovery." -msgid "pg_log_standby_snapshot() cannot be executed during recovery." +#: access/transam/xlogfuncs.c:209 access/transam/xlogfuncs.c:389 +#: access/transam/xlogfuncs.c:447 +#, c-format +msgid "%s cannot be executed during recovery." msgstr "No se puede ejecutar %s durante la recuperación." -# FIXME see logical.c:81 -#: access/transam/xlogfuncs.c:220 -#, fuzzy, c-format -#| msgid "replication slots can only be used if wal_level >= replica" -msgid "pg_log_standby_snapshot() can only be used if wal_level >= replica" -msgstr "los slots de replicación sólo pueden usarse si wal_level >= replica" +#: access/transam/xlogfuncs.c:215 +#, c-format +msgid "pg_log_standby_snapshot() can only be used if \"wal_level\" >= \"replica\"" +msgstr "pg_log_standby_snapshot() sólo puede usarse si «wal_level» >= «replica»" -#: access/transam/xlogfuncs.c:252 +#: access/transam/xlogfuncs.c:247 #, c-format msgid "WAL level not sufficient for creating a restore point" msgstr "el nivel de WAL no es suficiente para crear un punto de recuperación" -#: access/transam/xlogfuncs.c:260 +#: access/transam/xlogfuncs.c:255 #, c-format msgid "value too long for restore point (maximum %d characters)" msgstr "el valor es demasiado largo para un punto de recuperación (máximo %d caracteres)" -#: access/transam/xlogfuncs.c:398 access/transam/xlogfuncs.c:456 +#: access/transam/xlogfuncs.c:486 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "No se puede ejecutar %s durante la recuperación." - -#: access/transam/xlogfuncs.c:495 -#, fuzzy, c-format -#| msgid "invalid locale name \"%s\"" msgid "invalid WAL file name \"%s\"" -msgstr "nombre de configuración regional «%s» no es válido" +msgstr "nombre de archivo WAL «%s» no válido" -#: access/transam/xlogfuncs.c:531 access/transam/xlogfuncs.c:561 -#: access/transam/xlogfuncs.c:585 access/transam/xlogfuncs.c:608 -#: access/transam/xlogfuncs.c:688 +#: access/transam/xlogfuncs.c:522 access/transam/xlogfuncs.c:552 +#: access/transam/xlogfuncs.c:576 access/transam/xlogfuncs.c:599 +#: access/transam/xlogfuncs.c:679 #, c-format msgid "recovery is not in progress" msgstr "la recuperación no está en proceso" -#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:562 -#: access/transam/xlogfuncs.c:586 access/transam/xlogfuncs.c:609 -#: access/transam/xlogfuncs.c:689 +#: access/transam/xlogfuncs.c:523 access/transam/xlogfuncs.c:553 +#: access/transam/xlogfuncs.c:577 access/transam/xlogfuncs.c:600 +#: access/transam/xlogfuncs.c:680 #, c-format msgid "Recovery control functions can only be executed during recovery." msgstr "Las funciones de control de recuperación sólo pueden ejecutarse durante la recuperación." -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:567 +#: access/transam/xlogfuncs.c:528 access/transam/xlogfuncs.c:558 #, c-format msgid "standby promotion is ongoing" msgstr "la promoción del standby está en curso" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 +#: access/transam/xlogfuncs.c:529 access/transam/xlogfuncs.c:559 #, c-format msgid "%s cannot be executed after promotion is triggered." msgstr "%s no puede ser ejecutado después que una promoción es solicitada." -#: access/transam/xlogfuncs.c:694 +#: access/transam/xlogfuncs.c:685 #, c-format msgid "\"wait_seconds\" must not be negative or zero" msgstr "«wait_seconds» no puede ser negativo o cero" -#: access/transam/xlogfuncs.c:714 storage/ipc/signalfuncs.c:260 +#: access/transam/xlogfuncs.c:707 storage/ipc/signalfuncs.c:265 #, c-format msgid "failed to send signal to postmaster: %m" msgstr "no se pudo enviar señal a postmaster: %m" -#: access/transam/xlogfuncs.c:750 +#: access/transam/xlogfuncs.c:739 libpq/be-secure.c:237 libpq/be-secure.c:346 +#, c-format +msgid "terminating connection due to unexpected postmaster exit" +msgstr "terminando la conexión debido al término inesperado de postmaster" + +#: access/transam/xlogfuncs.c:740 +#, c-format +msgid "while waiting on promotion" +msgstr "mientras se esperaba la promoción" + +#: access/transam/xlogfuncs.c:744 #, c-format msgid "server did not promote within %d second" msgid_plural "server did not promote within %d seconds" msgstr[0] "el servidor no se promovió en %d segundo" msgstr[1] "el servidor no se promovió en %d segundos" -#: access/transam/xlogprefetcher.c:1092 +#: access/transam/xlogprefetcher.c:1088 #, c-format -msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." -msgstr "recovery_prefetch no está soportado en plataformas que no tienen posix_fadvise()." +msgid "\"recovery_prefetch\" is not supported on platforms that lack posix_fadvise()." +msgstr "«recovery_prefetch» no está soportado en plataformas que no tienen posix_fadvise()." -#: access/transam/xlogreader.c:626 -#, fuzzy, c-format -#| msgid "invalid record length at %X/%X: wanted %u, got %u" +#: access/transam/xlogreader.c:619 +#, c-format msgid "invalid record offset at %X/%X: expected at least %u, got %u" -msgstr "largo de registro no válido en %X/%X: se esperaba %u, se obtuvo %u" +msgstr "desplazamiento de registro no válido en %X/%X: se esperaba al menos %u, se obtuvo %u" -#: access/transam/xlogreader.c:635 +#: access/transam/xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "contrecord solicitado por %X/%X" -#: access/transam/xlogreader.c:676 access/transam/xlogreader.c:1123 -#, fuzzy, c-format -#| msgid "invalid record length at %X/%X: wanted %u, got %u" -msgid "invalid record length at %X/%X: expected at least %u, got %u" -msgstr "largo de registro no válido en %X/%X: se esperaba %u, se obtuvo %u" - -#: access/transam/xlogreader.c:705 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "memoria agotada mientras se intentaba decodificar un registro de largo %u" - -#: access/transam/xlogreader.c:727 +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "largo de registro %u en %X/%X demasiado largo" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "largo de registro no válido en %X/%X: se esperaba al menos %u, se obtuvo %u" -#: access/transam/xlogreader.c:776 +#: access/transam/xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "no hay bandera de contrecord en %X/%X" -#: access/transam/xlogreader.c:789 +#: access/transam/xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "largo de contrecord %u no válido (se esperaba %lld) en %X/%X" -#: access/transam/xlogreader.c:924 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "falta un contrecord en %X/%X" - -#: access/transam/xlogreader.c:1131 +#: access/transam/xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ID de gestor de recursos %u no válido en %X/%X" -#: access/transam/xlogreader.c:1144 access/transam/xlogreader.c:1160 +#: access/transam/xlogreader.c:1155 access/transam/xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "registro con prev-link %X/%X incorrecto en %X/%X" -#: access/transam/xlogreader.c:1196 +#: access/transam/xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "suma de verificación de los datos del gestor de recursos incorrecta en el registro en %X/%X" -#: access/transam/xlogreader.c:1230 -#, fuzzy, c-format -#| msgid "invalid magic number %04X in log segment %s, offset %u" +#: access/transam/xlogreader.c:1243 +#, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" -msgstr "número mágico %04X no válido en archivo %s, posición %u" +msgstr "número mágico %04X no válido en segmento WAL %s, LSN %X/%X, posición %u" -#: access/transam/xlogreader.c:1245 access/transam/xlogreader.c:1287 -#, fuzzy, c-format -#| msgid "invalid info bits %04X in log segment %s, offset %u" +#: access/transam/xlogreader.c:1258 access/transam/xlogreader.c:1300 +#, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" -msgstr "info bits %04X no válidos en archivo %s, posición %u" +msgstr "info bits %04X no válidos en segment WAL %s, LSN %X/%X, posición %u" -#: access/transam/xlogreader.c:1261 +#: access/transam/xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "archivo WAL es de un sistema de bases de datos distinto: identificador de sistema en archivo WAL es %llu, identificador en pg_control es %llu" -#: access/transam/xlogreader.c:1269 +#: access/transam/xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "archivo WAL es de un sistema de bases de datos distinto: tamaño de segmento incorrecto en cabecera de paǵina" -#: access/transam/xlogreader.c:1275 +#: access/transam/xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "archivo WAL es de un sistema de bases de datos distinto: XLOG_BLCKSZ incorrecto en cabecera de paǵina" -#: access/transam/xlogreader.c:1307 -#, fuzzy, c-format -#| msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" +#: access/transam/xlogreader.c:1320 +#, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" -msgstr "pageaddr %X/%X inesperado en archivo %s, posición %u" +msgstr "pageaddr %X/%X inesperado en segmento WAL %s, LSN %X/%X, posición %u" -#: access/transam/xlogreader.c:1333 -#, fuzzy, c-format -#| msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" +#: access/transam/xlogreader.c:1346 +#, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" -msgstr "ID de timeline %u fuera de secuencia (después de %u) en archivo %s, posición %u" +msgstr "ID de timeline %u fuera de secuencia (después de %u) en segmento WAL %s, LSN %X/%X, posición %u" -#: access/transam/xlogreader.c:1739 +#: access/transam/xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u fuera de orden en %X/%X" -#: access/transam/xlogreader.c:1763 +#: access/transam/xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA está definido, pero no hay datos en %X/%X" -#: access/transam/xlogreader.c:1770 +#: access/transam/xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA no está definido, pero el largo de los datos es %u en %X/%X" -#: access/transam/xlogreader.c:1806 +#: access/transam/xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE está definido, pero posición del agujero es %u largo %u largo de imagen %u en %X/%X" -#: access/transam/xlogreader.c:1822 +#: access/transam/xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE no está definido, pero posición del agujero es %u largo %u en %X/%X" -#: access/transam/xlogreader.c:1836 +#: access/transam/xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED definido, pero largo de imagen de bloque es %u en %X/%X" -#: access/transam/xlogreader.c:1851 +#: access/transam/xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED están definidos, pero el largo de imagen de bloque es %u en %X/%X" -#: access/transam/xlogreader.c:1867 +#: access/transam/xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL está definido, pero no hay «rel» anterior en %X/%X " -#: access/transam/xlogreader.c:1879 +#: access/transam/xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "block_id %u no válido en %X/%X" -#: access/transam/xlogreader.c:1946 +#: access/transam/xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "registro con largo no válido en %X/%X" -#: access/transam/xlogreader.c:1972 +#: access/transam/xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "no se pudo localizar un bloque de respaldo con ID %d en el registro WAL" -#: access/transam/xlogreader.c:2056 +#: access/transam/xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "no se pudo restaurar la imagen en %X/%X con bloque especifica %d no válido" -#: access/transam/xlogreader.c:2063 +#: access/transam/xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "no se pudo restaurar la imagen en %X/%X con estado no válido, bloque %d" -#: access/transam/xlogreader.c:2090 access/transam/xlogreader.c:2107 +#: access/transam/xlogreader.c:2100 access/transam/xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "no se pudo restaurar la imagen en %X/%X comprimida con %s que no está soportado por esta instalación, bloque %d" -#: access/transam/xlogreader.c:2116 +#: access/transam/xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "no se pudo restaurar la imagen en %X/%X comprimida con un método desconocido, bloque %d" -#: access/transam/xlogreader.c:2124 +#: access/transam/xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "no se pudo descomprimir la imagen en %X/%X, bloque %d" -#: access/transam/xlogrecovery.c:547 -#, c-format -msgid "entering standby mode" -msgstr "entrando al modo standby" - -#: access/transam/xlogrecovery.c:550 -#, c-format -msgid "starting point-in-time recovery to XID %u" -msgstr "comenzando el proceso de recuperación hasta el XID %u" - -#: access/transam/xlogrecovery.c:554 -#, c-format -msgid "starting point-in-time recovery to %s" -msgstr "comenzando el proceso de recuperación hasta %s" - -#: access/transam/xlogrecovery.c:558 -#, c-format -msgid "starting point-in-time recovery to \"%s\"" -msgstr "comenzando el proceso de recuperación hasta «%s»" - -#: access/transam/xlogrecovery.c:562 -#, c-format -msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" -msgstr "comenzando el proceso de recuperación punto-en-el-tiempo a la ubicación (LSN) de WAL «%X/%X»" - -#: access/transam/xlogrecovery.c:566 -#, c-format -msgid "starting point-in-time recovery to earliest consistent point" -msgstr "comenzando recuperación a un punto en el tiempo hasta alcanzar un estado consistente" - -#: access/transam/xlogrecovery.c:569 +#: access/transam/xlogrecovery.c:617 #, c-format -msgid "starting archive recovery" -msgstr "comenzando proceso de recuperación" +msgid "starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on timeline ID %u" +msgstr "iniciando recuperación de backup con LSN de redo %X/%X, LSN de checkpoint %X/%X, en timeline %u" -#: access/transam/xlogrecovery.c:653 +#: access/transam/xlogrecovery.c:649 #, c-format -msgid "could not find redo location referenced by checkpoint record" -msgstr "no se pudo encontrar la ubicación de redo referida por el registro de punto de control" +msgid "could not find redo location %X/%X referenced by checkpoint record at %X/%X" +msgstr "no se pudo encontrar la ubicación de redo %X/%X referida por el registro de checkpoint en %X/%X" # Purposefully deviate from quoting convention here, since argument is a shell command. -#: access/transam/xlogrecovery.c:654 access/transam/xlogrecovery.c:664 +#: access/transam/xlogrecovery.c:651 access/transam/xlogrecovery.c:662 #, c-format msgid "" -"If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" +"If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/standby.signal\" and add required recovery options.\n" "If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" "Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." msgstr "" -"Si está restaurando de un respaldo, ejecute «touch \"%s.recovery.signal\"» y agregue las opciones de restauración necesarias.\n" +"Si está restaurando de un respaldo, ejecute «touch \"%s/recovery.signal\"» o «%s/standby.signal» y agregue las opciones de restauración necesarias.\n" "Si no está restaurando de un respaldo, intente eliminar el archivo \"%s/backup_label\".\n" "Tenga cuidado: eliminar \"%s/backup_label\" resultará en un clúster corrupto si está restaurando de un respaldo." -#: access/transam/xlogrecovery.c:663 +#: access/transam/xlogrecovery.c:660 #, c-format -msgid "could not locate required checkpoint record" -msgstr "no se pudo localizar el registro del punto de control requerido" +msgid "could not locate required checkpoint record at %X/%X" +msgstr "no se pudo localizar el registro de checkpoint requerido en %X/%X" -#: access/transam/xlogrecovery.c:692 commands/tablespace.c:670 +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:664 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "no se pudo crear el enlace simbólico «%s»: %m" -#: access/transam/xlogrecovery.c:724 access/transam/xlogrecovery.c:730 +#: access/transam/xlogrecovery.c:723 access/transam/xlogrecovery.c:729 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "ignorando el archivo «%s» porque no existe un archivo «%s»" -#: access/transam/xlogrecovery.c:726 +#: access/transam/xlogrecovery.c:725 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "El archivo «%s» fue renombrado a «%s»." -#: access/transam/xlogrecovery.c:732 +#: access/transam/xlogrecovery.c:731 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "No se pudo renombrar el archivo de «%s» a «%s»: %m." -#: access/transam/xlogrecovery.c:786 +#: access/transam/xlogrecovery.c:770 #, c-format -msgid "could not locate a valid checkpoint record" -msgstr "no se pudo localizar un registro de punto de control válido" +msgid "restarting backup recovery with redo LSN %X/%X" +msgstr "reiniciando recuperación del backup con LSN de redo «%X/%X»" -#: access/transam/xlogrecovery.c:810 +#: access/transam/xlogrecovery.c:795 #, c-format -msgid "requested timeline %u is not a child of this server's history" -msgstr "el timeline solicitado %u no es un hijo de la historia de este servidor" +msgid "could not locate a valid checkpoint record at %X/%X" +msgstr "no se pudo localizar un registro de válido en %X/%X" -#: access/transam/xlogrecovery.c:812 +#: access/transam/xlogrecovery.c:806 #, c-format -msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." -msgstr "El punto de control más reciente está en %X/%X en el timeline %u, pero en la historia del timeline solicitado, el servidor se desvió desde ese timeline en %X/%X." +msgid "entering standby mode" +msgstr "entrando al modo standby" -#: access/transam/xlogrecovery.c:826 +#: access/transam/xlogrecovery.c:809 #, c-format -msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" -msgstr "el timeline solicitado %u no contiene el punto mínimo de recuperación %X/%X en el timeline %u" +msgid "starting point-in-time recovery to XID %u" +msgstr "comenzando el proceso de recuperación hasta el XID %u" -#: access/transam/xlogrecovery.c:854 +#: access/transam/xlogrecovery.c:813 #, c-format -msgid "invalid next transaction ID" -msgstr "el siguiente ID de transacción no es válido" +msgid "starting point-in-time recovery to %s" +msgstr "comenzando el proceso de recuperación hasta %s" -#: access/transam/xlogrecovery.c:859 +#: access/transam/xlogrecovery.c:817 #, c-format -msgid "invalid redo in checkpoint record" -msgstr "redo no es válido en el registro de punto de control" +msgid "starting point-in-time recovery to \"%s\"" +msgstr "comenzando el proceso de recuperación hasta «%s»" -#: access/transam/xlogrecovery.c:870 +#: access/transam/xlogrecovery.c:821 #, c-format -msgid "invalid redo record in shutdown checkpoint" -msgstr "registro redo no es válido en el punto de control de apagado" +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "comenzando el proceso de recuperación punto-en-el-tiempo a la ubicación (LSN) de WAL «%X/%X»" -#: access/transam/xlogrecovery.c:899 +#: access/transam/xlogrecovery.c:825 +#, c-format +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "comenzando recuperación a un punto en el tiempo hasta alcanzar un estado consistente" + +#: access/transam/xlogrecovery.c:828 +#, c-format +msgid "starting archive recovery" +msgstr "comenzando proceso de recuperación" + +#: access/transam/xlogrecovery.c:849 +#, c-format +msgid "requested timeline %u is not a child of this server's history" +msgstr "el timeline solicitado %u no es un hijo de la historia de este servidor" + +#: access/transam/xlogrecovery.c:851 +#, c-format +msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." +msgstr "El checkpoint más reciente está en %X/%X en el timeline %u, pero en la historia del timeline solicitado, el servidor se desvió desde ese timeline en %X/%X." + +#: access/transam/xlogrecovery.c:865 +#, c-format +msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" +msgstr "el timeline solicitado %u no contiene el punto mínimo de recuperación %X/%X en el timeline %u" + +#: access/transam/xlogrecovery.c:893 +#, c-format +msgid "invalid next transaction ID" +msgstr "el siguiente ID de transacción no es válido" + +#: access/transam/xlogrecovery.c:898 +#, c-format +msgid "invalid redo in checkpoint record" +msgstr "redo no es válido en el registro de checkpoint" + +#: access/transam/xlogrecovery.c:909 +#, c-format +msgid "invalid redo record in shutdown checkpoint" +msgstr "registro redo no es válido en el checkpoint de apagado" + +#: access/transam/xlogrecovery.c:938 #, c-format msgid "database system was not properly shut down; automatic recovery in progress" msgstr "el sistema de bases de datos no fue apagado apropiadamente; se está efectuando la recuperación automática" -#: access/transam/xlogrecovery.c:903 +#: access/transam/xlogrecovery.c:942 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "la recuperación comienza en el timeline %u y tiene un timeline de destino %u" -#: access/transam/xlogrecovery.c:946 +#: access/transam/xlogrecovery.c:985 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_label contiene datos inconsistentes con el archivo de control" -#: access/transam/xlogrecovery.c:947 +#: access/transam/xlogrecovery.c:986 #, c-format msgid "This means that the backup is corrupted and you will have to use another backup for recovery." msgstr "Esto significa que el respaldo está corrupto y deberá usar otro respaldo para la recuperación." -#: access/transam/xlogrecovery.c:1001 +#: access/transam/xlogrecovery.c:1040 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "el uso del archivo de configuración de recuperación «%s» no está soportado" -#: access/transam/xlogrecovery.c:1066 +#: access/transam/xlogrecovery.c:1105 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "el modo standby no está soportado en el modo mono-usuario" -#: access/transam/xlogrecovery.c:1083 +#: access/transam/xlogrecovery.c:1122 #, c-format -msgid "specified neither primary_conninfo nor restore_command" -msgstr "no se especifica primary_conninfo ni restore_command" +msgid "specified neither \"primary_conninfo\" nor \"restore_command\"" +msgstr "no se especifica «primary_conninfo» ni «restore_command»" -#: access/transam/xlogrecovery.c:1084 +#: access/transam/xlogrecovery.c:1123 #, c-format msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." msgstr "El servidor de bases de datos monitoreará el subdirectorio pg_wal con regularidad en búsqueda de archivos almacenados ahí." -#: access/transam/xlogrecovery.c:1092 +#: access/transam/xlogrecovery.c:1131 #, c-format -msgid "must specify restore_command when standby mode is not enabled" -msgstr "debe especificarse restore_command cuando el modo standby no está activo" +msgid "must specify \"restore_command\" when standby mode is not enabled" +msgstr "debe especificarse «restore_command» cuando el modo standby no está activo" -#: access/transam/xlogrecovery.c:1130 +#: access/transam/xlogrecovery.c:1169 #, c-format msgid "recovery target timeline %u does not exist" msgstr "no existe el timeline %u especificado como destino de recuperación" -#: access/transam/xlogrecovery.c:1213 access/transam/xlogrecovery.c:1220 -#: access/transam/xlogrecovery.c:1279 access/transam/xlogrecovery.c:1359 -#: access/transam/xlogrecovery.c:1383 +#: access/transam/xlogrecovery.c:1252 access/transam/xlogrecovery.c:1259 +#: access/transam/xlogrecovery.c:1318 access/transam/xlogrecovery.c:1406 +#: access/transam/xlogrecovery.c:1415 access/transam/xlogrecovery.c:1435 #, c-format msgid "invalid data in file \"%s\"" msgstr "datos no válidos en archivo «%s»" -#: access/transam/xlogrecovery.c:1280 +#: access/transam/xlogrecovery.c:1319 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "El ID de timeline interpretado es %u, pero se esperaba %u." -#: access/transam/xlogrecovery.c:1662 +#: access/transam/xlogrecovery.c:1330 +#, c-format +msgid "this is an incremental backup, not a data directory" +msgstr "esto es un backup incremental, no un directorio de datos" + +#: access/transam/xlogrecovery.c:1331 +#, c-format +msgid "Use pg_combinebackup to reconstruct a valid data directory." +msgstr "Use pg_combinebackup para reconstruir un directorio de datos válido." + +#: access/transam/xlogrecovery.c:1717 +#, c-format +msgid "unexpected record type found at redo point %X/%X" +msgstr "se encontró registro de tipo inesperada en el punto de redo %X/%X" + +#: access/transam/xlogrecovery.c:1740 #, c-format msgid "redo starts at %X/%X" msgstr "redo comienza en %X/%X" -#: access/transam/xlogrecovery.c:1675 +#: access/transam/xlogrecovery.c:1753 #, c-format msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" msgstr "redo en progreso, tiempo transcurrido: %ld.%02d s, LSN actual: %X/%X" -#: access/transam/xlogrecovery.c:1767 +#: access/transam/xlogrecovery.c:1843 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "el punto de detención de recuperación pedido es antes del punto de recuperación consistente" -#: access/transam/xlogrecovery.c:1799 +#: access/transam/xlogrecovery.c:1875 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "redo listo en %X/%X utilización del sistema: %s" -#: access/transam/xlogrecovery.c:1805 +#: access/transam/xlogrecovery.c:1881 #, c-format msgid "last completed transaction was at log time %s" msgstr "última transacción completada al tiempo de registro %s" -#: access/transam/xlogrecovery.c:1814 +#: access/transam/xlogrecovery.c:1890 #, c-format msgid "redo is not required" msgstr "no se requiere redo" -#: access/transam/xlogrecovery.c:1825 +#: access/transam/xlogrecovery.c:1901 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "la recuperación terminó antes de alcanzar el punto configurado como destino de recuperación" -#: access/transam/xlogrecovery.c:2019 +#: access/transam/xlogrecovery.c:2095 #, c-format msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" msgstr "se omitió con éxito contrecord no encontrado en %X/%X, sobrescrito en %s" -#: access/transam/xlogrecovery.c:2086 +#: access/transam/xlogrecovery.c:2162 #, c-format msgid "unexpected directory entry \"%s\" found in %s" msgstr "entrada de directorio inesperada «%s» fue encontrada en %s" -#: access/transam/xlogrecovery.c:2088 +#: access/transam/xlogrecovery.c:2164 #, c-format msgid "All directory entries in pg_tblspc/ should be symbolic links." msgstr "Todas las entradas de directorio en pg_tblspc deberían ser enlaces simbólicos" -#: access/transam/xlogrecovery.c:2089 +#: access/transam/xlogrecovery.c:2165 +#, c-format +msgid "Remove those directories, or set \"allow_in_place_tablespaces\" to ON transiently to let recovery complete." +msgstr "Elimine esos directorios, o defina «allow_in_place_tablespaces» a ON transitoriamente para permitir que la recuperación pueda completarse." + +#: access/transam/xlogrecovery.c:2217 #, c-format -msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." -msgstr "Elimine esos directorios, o defina allow_in_place_tablespaces a ON transitoriamente para permitir que la recuperación pueda completarse." +msgid "completed backup recovery with redo LSN %X/%X and end LSN %X/%X" +msgstr "se completó la recuperación de backup con LSN de redo %X/%X y LSN de término %X/%X" -#: access/transam/xlogrecovery.c:2163 +#: access/transam/xlogrecovery.c:2247 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "el estado de recuperación consistente fue alcanzado en %X/%X" #. translator: %s is a WAL record description -#: access/transam/xlogrecovery.c:2201 +#: access/transam/xlogrecovery.c:2285 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "redo WAL en %X/%X para %s" -#: access/transam/xlogrecovery.c:2299 +#: access/transam/xlogrecovery.c:2383 #, c-format msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" -msgstr "ID de timeline previo %u inesperado (timeline actual %u) en el registro de punto de control" +msgstr "ID de timeline previo %u inesperado (timeline actual %u) en el registro de checkpoint" -#: access/transam/xlogrecovery.c:2308 +#: access/transam/xlogrecovery.c:2392 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" -msgstr "ID de timeline %u inesperado (después de %u) en el registro de punto de control" +msgstr "ID de timeline %u inesperado (después de %u) en el registro de checkpoint" -#: access/transam/xlogrecovery.c:2324 +#: access/transam/xlogrecovery.c:2408 #, c-format msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" msgstr "timeline ID %u inesperado en registro de checkpoint, antes de alcanzar el punto mínimo de recuperación %X/%X en el timeline %u" -#: access/transam/xlogrecovery.c:2508 access/transam/xlogrecovery.c:2784 +#: access/transam/xlogrecovery.c:2592 access/transam/xlogrecovery.c:2868 #, c-format msgid "recovery stopping after reaching consistency" msgstr "deteniendo recuperación al alcanzar un estado consistente" -#: access/transam/xlogrecovery.c:2529 +#: access/transam/xlogrecovery.c:2613 #, c-format msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" msgstr "deteniendo recuperación antes de la ubicación (LSN) de WAL «%X/%X»" -#: access/transam/xlogrecovery.c:2619 +#: access/transam/xlogrecovery.c:2703 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "deteniendo recuperación antes de comprometer la transacción %u, hora %s" -#: access/transam/xlogrecovery.c:2626 +#: access/transam/xlogrecovery.c:2710 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "deteniendo recuperación antes de abortar la transacción %u, hora %s" -#: access/transam/xlogrecovery.c:2679 +#: access/transam/xlogrecovery.c:2763 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "deteniendo recuperación en el punto de recuperación «%s», hora %s" -#: access/transam/xlogrecovery.c:2697 +#: access/transam/xlogrecovery.c:2781 #, c-format msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" msgstr "deteniendo recuperación después de la ubicación (LSN) de WAL «%X/%X»" -#: access/transam/xlogrecovery.c:2764 +#: access/transam/xlogrecovery.c:2848 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "deteniendo recuperación de comprometer la transacción %u, hora %s" -#: access/transam/xlogrecovery.c:2772 +#: access/transam/xlogrecovery.c:2856 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "deteniendo recuperación después de abortar la transacción %u, hora %s" -#: access/transam/xlogrecovery.c:2853 +#: access/transam/xlogrecovery.c:2937 #, c-format msgid "pausing at the end of recovery" msgstr "pausando al final de la recuperación" -#: access/transam/xlogrecovery.c:2854 +#: access/transam/xlogrecovery.c:2938 #, c-format msgid "Execute pg_wal_replay_resume() to promote." msgstr "Ejecute pg_wal_replay_resume() para promover." -#: access/transam/xlogrecovery.c:2857 access/transam/xlogrecovery.c:4594 +#: access/transam/xlogrecovery.c:2941 access/transam/xlogrecovery.c:4679 #, c-format msgid "recovery has paused" msgstr "la recuperación está en pausa" -#: access/transam/xlogrecovery.c:2858 +#: access/transam/xlogrecovery.c:2942 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "Ejecute pg_wal_replay_resume() para continuar." -#: access/transam/xlogrecovery.c:3121 -#, fuzzy, c-format -#| msgid "unexpected timeline ID %u in log segment %s, offset %u" +#: access/transam/xlogrecovery.c:3205 +#, c-format msgid "unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u" -msgstr "ID de timeline %u inesperado en archivo %s, posición %u" +msgstr "ID de timeline %u inesperado en segmento WAL %s, LSN %X/%X, posición %u" -# XXX why talk about "log segment" instead of "file"? -#: access/transam/xlogrecovery.c:3329 -#, fuzzy, c-format -#| msgid "could not read from log segment %s, offset %u: %m" +#: access/transam/xlogrecovery.c:3413 +#, c-format msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: %m" -msgstr "no se pudo leer del archivo de segmento %s, posición %u: %m" +msgstr "no se pudo leer desde el segmento de WAL %s, LSN %X/%X, posición %u: %m" -# XXX why talk about "log segment" instead of "file"? -#: access/transam/xlogrecovery.c:3336 -#, fuzzy, c-format -#| msgid "could not read from log segment %s, offset %u: read %d of %zu" +#: access/transam/xlogrecovery.c:3420 +#, c-format msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu" -msgstr "no se pudo leer del archivo de segmento %s, posición %u: leídos %d de %zu" +msgstr "no se pudo leer del segmento de WAL %s, LSN %X/%X, posición %u: leídos %d de %zu" -#: access/transam/xlogrecovery.c:3976 -#, fuzzy, c-format -#| msgid "invalid checkpoint record" +#: access/transam/xlogrecovery.c:4061 +#, c-format msgid "invalid checkpoint location" -msgstr "el registro del punto de control no es válido" +msgstr "ubicación de checkpoint no válida" -#: access/transam/xlogrecovery.c:3986 +#: access/transam/xlogrecovery.c:4071 #, c-format msgid "invalid checkpoint record" -msgstr "el registro del punto de control no es válido" +msgstr "el registro del checkpoint no es válido" -#: access/transam/xlogrecovery.c:3992 +#: access/transam/xlogrecovery.c:4077 #, c-format msgid "invalid resource manager ID in checkpoint record" -msgstr "el ID de gestor de recursos en el registro del punto de control no es válido" +msgstr "el ID de gestor de recursos en el registro del checkpoint no es válido" -#: access/transam/xlogrecovery.c:4000 +#: access/transam/xlogrecovery.c:4085 #, c-format msgid "invalid xl_info in checkpoint record" -msgstr "xl_info en el registro del punto de control no es válido" +msgstr "xl_info en el registro del checkpoint no es válido" -#: access/transam/xlogrecovery.c:4006 +#: access/transam/xlogrecovery.c:4091 #, c-format msgid "invalid length of checkpoint record" -msgstr "la longitud del registro de punto de control no es válida" +msgstr "la longitud del registro de checkpoint no es válida" -#: access/transam/xlogrecovery.c:4060 +#: access/transam/xlogrecovery.c:4145 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "el nuevo timeline %u especificado no es hijo del timeline de sistema %u" -#: access/transam/xlogrecovery.c:4074 +#: access/transam/xlogrecovery.c:4159 #, c-format msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" msgstr "el nuevo timeline %u bifurcó del timeline del sistema actual %u antes del punto re recuperación actual %X/%X" -#: access/transam/xlogrecovery.c:4093 +#: access/transam/xlogrecovery.c:4178 #, c-format msgid "new target timeline is %u" msgstr "el nuevo timeline destino es %u" -#: access/transam/xlogrecovery.c:4296 +#: access/transam/xlogrecovery.c:4381 #, c-format msgid "WAL receiver process shutdown requested" msgstr "se recibió una petición de apagado para el proceso receptor de wal" -#: access/transam/xlogrecovery.c:4356 +#: access/transam/xlogrecovery.c:4441 #, c-format msgid "received promote request" msgstr "se recibió petición de promoción" -#: access/transam/xlogrecovery.c:4585 +#: access/transam/xlogrecovery.c:4670 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "hot standby no es posible porque la configuración de parámetros no es suficiente" -#: access/transam/xlogrecovery.c:4586 access/transam/xlogrecovery.c:4613 -#: access/transam/xlogrecovery.c:4643 +#: access/transam/xlogrecovery.c:4671 access/transam/xlogrecovery.c:4698 +#: access/transam/xlogrecovery.c:4728 #, c-format msgid "%s = %d is a lower setting than on the primary server, where its value was %d." msgstr "%s = %d es una configuración menor que en el servidor primario, donde su valor era %d." -#: access/transam/xlogrecovery.c:4595 +#: access/transam/xlogrecovery.c:4680 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "Si se continúa con la recuperación, el servidor se apagará." -#: access/transam/xlogrecovery.c:4596 +#: access/transam/xlogrecovery.c:4681 #, c-format msgid "You can then restart the server after making the necessary configuration changes." msgstr "Luego puede reiniciar el servidor después de hacer los cambios necesarios en la configuración." -#: access/transam/xlogrecovery.c:4607 +#: access/transam/xlogrecovery.c:4692 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "la promoción no es posible porque la configuración de parámetros no es suficiente" -#: access/transam/xlogrecovery.c:4617 +#: access/transam/xlogrecovery.c:4702 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "Reinicie el servidor luego de hacer los cambios necesarios en la configuración." -#: access/transam/xlogrecovery.c:4641 +#: access/transam/xlogrecovery.c:4726 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "se abortó la recuperación porque la configuración de parámetros no es suficiente" -#: access/transam/xlogrecovery.c:4647 +#: access/transam/xlogrecovery.c:4732 #, c-format msgid "You can restart the server after making the necessary configuration changes." msgstr "Puede reiniciar el servidor luego de hacer los cambios necesarios en la configuración." -#: access/transam/xlogrecovery.c:4689 +#: access/transam/xlogrecovery.c:4774 #, c-format msgid "multiple recovery targets specified" msgstr "múltiples valores de destino de recuperación especificados" -#: access/transam/xlogrecovery.c:4690 +#: access/transam/xlogrecovery.c:4775 #, c-format -msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." -msgstr "A lo más uno de recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid puede estar definido." +msgid "At most one of \"recovery_target\", \"recovery_target_lsn\", \"recovery_target_name\", \"recovery_target_time\", \"recovery_target_xid\" may be set." +msgstr "A lo más uno de «recovery_target», «recovery_target_lsn», «recovery_target_name», «recovery_target_time», «recovery_target_xid» puede estar definido." -#: access/transam/xlogrecovery.c:4701 +#: access/transam/xlogrecovery.c:4786 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "El único valor permitido es «immediate»." -#: access/transam/xlogrecovery.c:4853 utils/adt/timestamp.c:185 -#: utils/adt/timestamp.c:438 +#: access/transam/xlogrecovery.c:4938 utils/adt/timestamp.c:202 +#: utils/adt/timestamp.c:455 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestamp fuera de rango: «%s»" -#: access/transam/xlogrecovery.c:4898 +#: access/transam/xlogrecovery.c:4983 #, c-format -msgid "recovery_target_timeline is not a valid number." -msgstr "recovery_target_timeline no es un número válido." +msgid "\"recovery_target_timeline\" is not a valid number." +msgstr "«recovery_target_timeline» no es un número válido." -# XXX why talk about "log segment" instead of "file"? -#: access/transam/xlogutils.c:1039 -#, fuzzy, c-format -#| msgid "could not read from log segment %s, offset %d: %m" +#: access/transam/xlogutils.c:1032 +#, c-format msgid "could not read from WAL segment %s, offset %d: %m" -msgstr "no se pudo leer del archivo de segmento %s, posición %d: %m" +msgstr "no se pudo leer desde el segmento de WAL %s, posición %d: %m" -# XXX why talk about "log segment" instead of "file"? -#: access/transam/xlogutils.c:1046 -#, fuzzy, c-format -#| msgid "could not read from log segment %s, offset %d: read %d of %d" +#: access/transam/xlogutils.c:1039 +#, c-format msgid "could not read from WAL segment %s, offset %d: read %d of %d" -msgstr "no se pudo leer del archivo de segmento %s, posición %d: leídos %d de %d" +msgstr "no se pudo leer del segmento de WAL %s, posición %d: leídos %d de %d" -#: archive/shell_archive.c:96 +#: archive/shell_archive.c:98 #, c-format msgid "archive command failed with exit code %d" msgstr "la orden de archivado falló con código de retorno %d" -#: archive/shell_archive.c:98 archive/shell_archive.c:108 -#: archive/shell_archive.c:114 archive/shell_archive.c:123 +#: archive/shell_archive.c:100 archive/shell_archive.c:110 +#: archive/shell_archive.c:116 archive/shell_archive.c:125 #, c-format msgid "The failed archive command was: %s" msgstr "La orden fallida era: «%s»" -#: archive/shell_archive.c:105 +#: archive/shell_archive.c:107 #, c-format msgid "archive command was terminated by exception 0x%X" msgstr "la orden de archivado fue terminada por una excepción 0x%X" -#: archive/shell_archive.c:107 postmaster/postmaster.c:3675 +#: archive/shell_archive.c:109 postmaster/postmaster.c:3095 #, c-format msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." msgstr "Vea el archivo «ntstatus.h» para una descripción del valor hexadecimal." -#: archive/shell_archive.c:112 +#: archive/shell_archive.c:114 #, c-format msgid "archive command was terminated by signal %d: %s" msgstr "la orden de archivado fue terminada por una señal %d: %s" -#: archive/shell_archive.c:121 +#: archive/shell_archive.c:123 #, c-format msgid "archive command exited with unrecognized status %d" msgstr "la orden de archivado fue terminada con código %d no reconocido" -#: backup/backup_manifest.c:253 +#: backup/backup_manifest.c:254 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "se esperaba el timeline de término %u pero se encontró el timeline %u" -#: backup/backup_manifest.c:277 +#: backup/backup_manifest.c:278 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "se esperaba el timeline de inicio %u pero se encontró el timeline %u" -#: backup/backup_manifest.c:304 +#: backup/backup_manifest.c:305 #, c-format msgid "start timeline %u not found in history of timeline %u" msgstr "el timeline de inicio %u no fue encontrado en la historia del timeline %u" -#: backup/backup_manifest.c:355 +#: backup/backup_manifest.c:356 #, c-format msgid "could not rewind temporary file" msgstr "no se puede rebobinar el archivo temporal" -#: backup/basebackup.c:470 +#: backup/basebackup.c:479 #, c-format msgid "could not find any WAL files" msgstr "no se pudo encontrar ningún archivo de WAL" -#: backup/basebackup.c:485 backup/basebackup.c:500 backup/basebackup.c:509 +#: backup/basebackup.c:494 backup/basebackup.c:509 backup/basebackup.c:518 #, c-format msgid "could not find WAL file \"%s\"" msgstr "no se pudo encontrar archivo de WAL «%s»" -#: backup/basebackup.c:551 backup/basebackup.c:576 +#: backup/basebackup.c:560 backup/basebackup.c:585 #, c-format msgid "unexpected WAL file size \"%s\"" msgstr "tamaño del archivo WAL «%s» inesperado" -#: backup/basebackup.c:646 +#: backup/basebackup.c:656 #, c-format msgid "%lld total checksum verification failure" msgid_plural "%lld total checksum verification failures" msgstr[0] "%lld falla de verificación de suma de comprobación en total" msgstr[1] "%lld fallas de verificación de suma de comprobación en total" -#: backup/basebackup.c:653 +#: backup/basebackup.c:663 #, c-format msgid "checksum verification failure during base backup" msgstr "falla en verificación de checksums durante respaldo base" -#: backup/basebackup.c:722 backup/basebackup.c:731 backup/basebackup.c:742 -#: backup/basebackup.c:759 backup/basebackup.c:768 backup/basebackup.c:779 -#: backup/basebackup.c:796 backup/basebackup.c:805 backup/basebackup.c:817 -#: backup/basebackup.c:841 backup/basebackup.c:855 backup/basebackup.c:866 -#: backup/basebackup.c:877 backup/basebackup.c:890 +#: backup/basebackup.c:733 backup/basebackup.c:742 backup/basebackup.c:753 +#: backup/basebackup.c:770 backup/basebackup.c:779 backup/basebackup.c:788 +#: backup/basebackup.c:803 backup/basebackup.c:820 backup/basebackup.c:829 +#: backup/basebackup.c:841 backup/basebackup.c:865 backup/basebackup.c:879 +#: backup/basebackup.c:890 backup/basebackup.c:901 backup/basebackup.c:914 #, c-format msgid "duplicate option \"%s\"" msgstr "nombre de opción «%s» duplicada" -#: backup/basebackup.c:750 -#, fuzzy, c-format -#| msgid "unrecognized object type \"%s\"" +#: backup/basebackup.c:761 +#, c-format msgid "unrecognized checkpoint type: \"%s\"" -msgstr "tipo de objeto «%s» no reconocido" +msgstr "tipo de checkpoint no reconocido: «%s»" + +#: backup/basebackup.c:793 +#, c-format +msgid "incremental backups cannot be taken unless WAL summarization is enabled" +msgstr "los backups incrementales no pueden tomarse a menos que la sumarización de WAL esté activada" -#: backup/basebackup.c:785 +#: backup/basebackup.c:809 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d está fuera del rango aceptable para el parámetro «%s» (%d .. %d)" -#: backup/basebackup.c:830 +#: backup/basebackup.c:854 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "opción de manifiesto «%s» no reconocida" -#: backup/basebackup.c:846 -#, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "algoritmo de suma de comprobación no reconocido: \"%s\"" - -#: backup/basebackup.c:881 +#: backup/basebackup.c:905 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "algoritmo de compresión no reconocido: «%s»" -#: backup/basebackup.c:897 -#, fuzzy, c-format -#| msgid "unrecognized column option \"%s\"" +#: backup/basebackup.c:921 +#, c-format msgid "unrecognized base backup option: \"%s\"" -msgstr "opción de columna «%s» no reconocida" +msgstr "opción de respaldo base no reconocida: «%s»" -#: backup/basebackup.c:908 +#: backup/basebackup.c:932 #, c-format msgid "manifest checksums require a backup manifest" msgstr "la suma de comprobación del manifiesto requiere un manifiesto de la copia de seguridad" -#: backup/basebackup.c:917 -#, fuzzy, c-format -#| msgid "--no-slot cannot be used with slot name" +#: backup/basebackup.c:941 +#, c-format msgid "target detail cannot be used without target" -msgstr "no se puede usar --no-slot junto con nombre de slot" +msgstr "no se puede usar “target detail†sin un destino" -#: backup/basebackup.c:926 backup/basebackup_target.c:218 -#, fuzzy, c-format -#| msgid "operator class \"%s\" does not accept data type %s" +#: backup/basebackup.c:950 backup/basebackup_target.c:218 +#, c-format msgid "target \"%s\" does not accept a target detail" -msgstr "la clase de operadores «%s» no acepta el tipo de datos %s" +msgstr "el destino «%s» no acepta “target detailsâ€" -#: backup/basebackup.c:937 -#, fuzzy, c-format -#| msgid "%s cannot be specified unless locale provider \"%s\" is chosen" +#: backup/basebackup.c:961 +#, c-format msgid "compression detail cannot be specified unless compression is enabled" -msgstr "%s no puede especificarse a menos que el proveedor de locale «%s» sea escogido" +msgstr "el detalle de compresión no puede especificarse a menos que la compresión esté activada" -#: backup/basebackup.c:950 +#: backup/basebackup.c:974 #, c-format msgid "invalid compression specification: %s" msgstr "especificación de compresión no válida: %s" -#: backup/basebackup.c:1116 backup/basebackup.c:1294 +#: backup/basebackup.c:1024 +#, c-format +msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" +msgstr "debe ejecutar UPLOAD_MANIFEST antes de lanzar un BASE_BACKUP incremental" + +#: backup/basebackup.c:1157 backup/basebackup.c:1358 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "no se pudo hacer stat al archivo o directorio «%s»: %m" -#: backup/basebackup.c:1430 +#: backup/basebackup.c:1544 #, c-format msgid "skipping special file \"%s\"" msgstr "omitiendo el archivo especial «%s»" -#: backup/basebackup.c:1542 -#, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "número de segmento %d no válido en archivo «%s»" - -#: backup/basebackup.c:1574 +#: backup/basebackup.c:1751 #, c-format msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" msgstr "no se pudo verificar el checksum en el archivo «%s», bloque %u: el tamaño de búfer de lectura %d y el tamaño de página %d difieren" -#: backup/basebackup.c:1658 +#: backup/basebackup.c:1813 +#, c-format +msgid "file \"%s\" has a total of %d checksum verification failure" +msgid_plural "file \"%s\" has a total of %d checksum verification failures" +msgstr[0] "el archivo «%s» tiene un total de %d falla de verificación de checksum" +msgstr[1] "el archivo «%s» tiene un total de %d fallas de verificación de checksums" + +#: backup/basebackup.c:1917 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" msgstr "verificación de checksums falló en archivo «%s», bloque %u: calculado %X pero se esperaba %X" -#: backup/basebackup.c:1665 +#: backup/basebackup.c:1924 #, c-format msgid "further checksum verification failures in file \"%s\" will not be reported" msgstr "subsiguientes fallas de verificación de checksums en el archivo «%s» no se reportarán" -#: backup/basebackup.c:1721 -#, c-format -msgid "file \"%s\" has a total of %d checksum verification failure" -msgid_plural "file \"%s\" has a total of %d checksum verification failures" -msgstr[0] "el archivo «%s» tiene un total de %d falla de verificación de checksum" -msgstr[1] "el archivo «%s» tiene un total de %d fallas de verificación de checksums" - -#: backup/basebackup.c:1767 +#: backup/basebackup.c:2048 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "nombre de archivo demasiado largo para el formato tar: «%s»" -#: backup/basebackup.c:1772 +#: backup/basebackup.c:2053 #, c-format msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" msgstr "destino de enlace simbólico demasiado largo para el formato tar: nombre de archivo «%s», destino «%s»" +#: backup/basebackup.c:2127 +#, c-format +msgid "could not read file \"%s\": read %zd of %zu" +msgstr "no se pudo leer el archivo «%s»: leídos %zd de %zu" + #: backup/basebackup_gzip.c:67 -#, fuzzy, c-format -#| msgid "Bonjour is not supported by this build" +#, c-format msgid "gzip compression is not supported by this build" -msgstr "Bonjour no está soportado en este servidor" +msgstr "la compresión gzip no está soportada en este servidor" #: backup/basebackup_gzip.c:143 #, c-format msgid "could not initialize compression library" msgstr "no se pudo inicializar la biblioteca de compresión" +#: backup/basebackup_incremental.c:294 +#, c-format +msgid "manifest contains no required WAL ranges" +msgstr "el manifiesto no contiene ningún rango WAL requerido" + +#: backup/basebackup_incremental.c:349 +#, c-format +msgid "timeline %u found in manifest, but not in this server's history" +msgstr "el timeline %u fue encontrado en el manifiesto, pero no en la historia de este servidor" + +#: backup/basebackup_incremental.c:414 +#, c-format +msgid "manifest requires WAL from initial timeline %u starting at %X/%X, but that timeline begins at %X/%X" +msgstr "el manifiesto requiere WAL en el timeline inicial %u desde %X/%X, pero ese timeline inicia en %X/%X" + +#: backup/basebackup_incremental.c:424 +#, c-format +msgid "manifest requires WAL from continuation timeline %u starting at %X/%X, but that timeline begins at %X/%X" +msgstr "el manifiesto requiere WAL del timeline de continuación %u desde %X/%X, pero ese timeline empieza en %X/%X" + +#: backup/basebackup_incremental.c:435 +#, c-format +msgid "manifest requires WAL from final timeline %u ending at %X/%X, but this backup starts at %X/%X" +msgstr "el manifiesto requiere WAL del timeline final %u terminado en %X/%X, pero este backup empieza en %X/%X" + +#: backup/basebackup_incremental.c:439 +#, c-format +msgid "This can happen for incremental backups on a standby if there was little activity since the previous backup." +msgstr "Esto puede pasar para backups incrementales en un standby si hubo insuficiente actividad desde el backup anterior." + +#: backup/basebackup_incremental.c:446 +#, c-format +msgid "manifest requires WAL from non-final timeline %u ending at %X/%X, but this server switched timelines at %X/%X" +msgstr "el manifiesto requiere WAL del timeline no-final %u terminando en %X/%X, pero este servidor cambió de timelines en %X/%X" + +#: backup/basebackup_incremental.c:527 +#, c-format +msgid "WAL summaries are required on timeline %u from %X/%X to %X/%X, but no summaries for that timeline and LSN range exist" +msgstr "se requieren sumarizaciones de WAL en el timeline %u desde %X/%X hasta %X/%X, pero no existen sumarizaciones para ese timeline y rango de LSN" + +#: backup/basebackup_incremental.c:534 +#, c-format +msgid "WAL summaries are required on timeline %u from %X/%X to %X/%X, but the summaries for that timeline and LSN range are incomplete" +msgstr "se requieren sumarizaciones de WAL en el timeline %u desde %X/%X hasta %X/%X, pero las sumarizaciones en ese timeline y rango de LSN están incompletos" + +#: backup/basebackup_incremental.c:538 +#, c-format +msgid "The first unsummarized LSN in this range is %X/%X." +msgstr "El primer LSN sin sumarización en este rango es %X/%X." + +#: backup/basebackup_incremental.c:938 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "el manifiesto de backup versión 1 no soporta backups incrementales" + +#: backup/basebackup_incremental.c:956 +#, c-format +msgid "system identifier in backup manifest is %llu, but database system identifier is %llu" +msgstr "el identificador de sistema en el manifiesto de backup es %llu, pero el identificador en el sistema es %llu" + #: backup/basebackup_lz4.c:67 -#, fuzzy, c-format -#| msgid "Bonjour is not supported by this build" +#, c-format msgid "lz4 compression is not supported by this build" -msgstr "Bonjour no está soportado en este servidor" +msgstr "la compresión lz4 no está soportada en este servidor" -#: backup/basebackup_server.c:75 -#, fuzzy, c-format -#| msgid "permission denied to create role" +#: backup/basebackup_server.c:73 +#, c-format msgid "permission denied to create backup stored on server" -msgstr "se ha denegado el permiso para crear el rol" +msgstr "se ha denegado el permiso para crear un respaldo almacenado en el servidor" -#: backup/basebackup_server.c:76 +#: backup/basebackup_server.c:74 #, c-format msgid "Only roles with privileges of the \"%s\" role may create a backup stored on the server." -msgstr "" +msgstr "Sólo los roles con privilegio del rol «%s» pueden crear un respaldo almacenado en el servidor." -#: backup/basebackup_server.c:91 -#, fuzzy, c-format -#| msgid "relative path not allowed for COPY to file" +#: backup/basebackup_server.c:89 +#, c-format msgid "relative path not allowed for backup stored on server" -msgstr "no se permiten rutas relativas para COPY hacia un archivo" +msgstr "no se permiten rutas relativas para un respaldo almacenado en el servidor" -#: backup/basebackup_server.c:104 commands/dbcommands.c:501 -#: commands/tablespace.c:163 commands/tablespace.c:179 -#: commands/tablespace.c:599 commands/tablespace.c:644 replication/slot.c:1697 +#: backup/basebackup_server.c:102 commands/dbcommands.c:477 +#: commands/tablespace.c:157 commands/tablespace.c:173 +#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:1986 #: storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" msgstr "no se pudo crear el directorio «%s»: %m" -#: backup/basebackup_server.c:117 +#: backup/basebackup_server.c:115 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "el directorio «%s» existe pero no está vacío" -#: backup/basebackup_server.c:125 utils/init/postinit.c:1154 +#: backup/basebackup_server.c:123 utils/init/postinit.c:1178 #, c-format msgid "could not access directory \"%s\": %m" msgstr "no se pudo acceder al directorio «%s»: %m" -#: backup/basebackup_server.c:177 backup/basebackup_server.c:184 -#: backup/basebackup_server.c:270 backup/basebackup_server.c:277 -#: storage/smgr/md.c:501 storage/smgr/md.c:508 storage/smgr/md.c:590 -#: storage/smgr/md.c:612 storage/smgr/md.c:919 +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 +#: backup/basebackup_server.c:268 backup/basebackup_server.c:275 +#: backup/walsummary.c:312 storage/smgr/md.c:502 storage/smgr/md.c:509 +#: storage/smgr/md.c:591 storage/smgr/md.c:613 storage/smgr/md.c:999 #, c-format msgid "Check free disk space." msgstr "Verifique el espacio libre en disco." -#: backup/basebackup_server.c:181 backup/basebackup_server.c:274 -#, fuzzy, c-format -#| msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 +#: backup/walsummary.c:309 +#, c-format msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" -msgstr "no se pudo extender el archivo «%s»: sólo se escribieron %d de %d bytes en el bloque %u" +msgstr "no se pudo escribir en el archivo «%s»: sólo se escribieron %d de %d bytes en la posición %u" #: backup/basebackup_target.c:146 -#, fuzzy, c-format -#| msgid "unrecognized reset target: \"%s\"" +#, c-format msgid "unrecognized target: \"%s\"" -msgstr "destino de reset no reconocido: «%s»" +msgstr "destino no reconocido: «%s»" #: backup/basebackup_target.c:237 -#, fuzzy, c-format -#| msgid "parameter \"%s\" requires a Boolean value" +#, c-format msgid "target \"%s\" requires a target detail" -msgstr "el parámetro «%s» requiere un valor lógico (booleano)" +msgstr "el destino «%s» requiere un “target detailâ€" #: backup/basebackup_zstd.c:66 -#, fuzzy, c-format -#| msgid "Bonjour is not supported by this build" +#, c-format msgid "zstd compression is not supported by this build" -msgstr "Bonjour no está soportado en este servidor" +msgstr "la compresión zstd no está soportada en este servidor" #: backup/basebackup_zstd.c:117 #, c-format @@ -3801,716 +4087,724 @@ msgid "could not set compression worker count to %d: %s" msgstr "no se pudo definir la cantidad de procesos ayudantes de compresión a %d: %s" #: backup/basebackup_zstd.c:129 -#, fuzzy, c-format -#| msgid "could not set compression level %d: %s" -msgid "could not set compression flag for %s: %s" -msgstr "no se pudo definir el nivel de compresión %d: %s" +#, c-format +msgid "could not enable long-distance mode: %s" +msgstr "no se pudo habilitar el modo “long-distanceâ€: %s" + +#: backup/walsummaryfuncs.c:95 +#, c-format +msgid "invalid timeline %lld" +msgstr "timeline %lld no válido" -#: bootstrap/bootstrap.c:243 postmaster/postmaster.c:721 tcop/postgres.c:3819 +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:623 tcop/postgres.c:3946 #, c-format msgid "--%s requires a value" msgstr "--%s requiere un valor" -#: bootstrap/bootstrap.c:248 postmaster/postmaster.c:726 tcop/postgres.c:3824 +#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:628 tcop/postgres.c:3951 #, c-format msgid "-c %s requires a value" msgstr "-c %s requiere un valor" -#: bootstrap/bootstrap.c:289 -#, c-format -msgid "-X requires a power of two value between 1 MB and 1 GB" -msgstr "-X require un valor potencia de dos entre 1 MB y 1 GB" - -#: bootstrap/bootstrap.c:295 postmaster/postmaster.c:844 -#: postmaster/postmaster.c:857 +#: bootstrap/bootstrap.c:282 postmaster/postmaster.c:746 +#: postmaster/postmaster.c:759 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Pruebe «%s --help» para mayor información.\n" -#: bootstrap/bootstrap.c:304 +#: bootstrap/bootstrap.c:291 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s: argumentos de línea de órdenes no válidos\n" -#: catalog/aclchk.c:201 +#: catalog/aclchk.c:211 #, c-format msgid "grant options can only be granted to roles" msgstr "la opción de grant sólo puede ser otorgada a roles" -#: catalog/aclchk.c:323 +#: catalog/aclchk.c:333 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "no se otorgaron privilegios para la columna «%s» de la relación «%s»" -#: catalog/aclchk.c:328 +#: catalog/aclchk.c:338 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "no se otorgaron privilegios para «%s»" -#: catalog/aclchk.c:336 +#: catalog/aclchk.c:346 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "no todos los privilegios fueron otorgados para la columna «%s» de la relación «%s»" -#: catalog/aclchk.c:341 +#: catalog/aclchk.c:351 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "no todos los privilegios fueron otorgados para «%s»" -#: catalog/aclchk.c:352 +#: catalog/aclchk.c:362 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "ningún privilegio pudo ser revocado para la columna «%s» de la relación «%s»" -#: catalog/aclchk.c:357 +#: catalog/aclchk.c:367 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "ningún privilegio pudo ser revocado para «%s»" -#: catalog/aclchk.c:365 +#: catalog/aclchk.c:375 #, c-format msgid "not all privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "no todos los privilegios pudieron ser revocados para la columna «%s» de la relación «%s»" -#: catalog/aclchk.c:370 +#: catalog/aclchk.c:380 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "no todos los privilegios pudieron ser revocados para «%s»" -#: catalog/aclchk.c:402 +#: catalog/aclchk.c:412 #, c-format msgid "grantor must be current user" msgstr "el cedente (grantor) debe ser el usuario actual" -#: catalog/aclchk.c:470 catalog/aclchk.c:1045 +#: catalog/aclchk.c:480 catalog/aclchk.c:1055 #, c-format msgid "invalid privilege type %s for relation" msgstr "el tipo de privilegio %s no es válido para una relación" -#: catalog/aclchk.c:474 catalog/aclchk.c:1049 +#: catalog/aclchk.c:484 catalog/aclchk.c:1059 #, c-format msgid "invalid privilege type %s for sequence" msgstr "el tipo de privilegio %s no es válido para una secuencia" -#: catalog/aclchk.c:478 +#: catalog/aclchk.c:488 #, c-format msgid "invalid privilege type %s for database" msgstr "el tipo de privilegio %s no es válido para una base de datos" -#: catalog/aclchk.c:482 +#: catalog/aclchk.c:492 #, c-format msgid "invalid privilege type %s for domain" msgstr "el tipo de privilegio %s no es válido para un dominio" -#: catalog/aclchk.c:486 catalog/aclchk.c:1053 +#: catalog/aclchk.c:496 catalog/aclchk.c:1063 #, c-format msgid "invalid privilege type %s for function" msgstr "el tipo de privilegio %s no es válido para una función" -#: catalog/aclchk.c:490 +#: catalog/aclchk.c:500 #, c-format msgid "invalid privilege type %s for language" msgstr "el tipo de privilegio %s no es válido para un lenguaje" -#: catalog/aclchk.c:494 +#: catalog/aclchk.c:504 #, c-format msgid "invalid privilege type %s for large object" msgstr "el tipo de privilegio %s no es válido para un objeto grande" -#: catalog/aclchk.c:498 catalog/aclchk.c:1069 +#: catalog/aclchk.c:508 catalog/aclchk.c:1079 #, c-format msgid "invalid privilege type %s for schema" msgstr "el tipo de privilegio %s no es válido para un esquema" -#: catalog/aclchk.c:502 catalog/aclchk.c:1057 +#: catalog/aclchk.c:512 catalog/aclchk.c:1067 #, c-format msgid "invalid privilege type %s for procedure" msgstr "el tipo de privilegio %s no es válido para un procedimiento" -#: catalog/aclchk.c:506 catalog/aclchk.c:1061 +#: catalog/aclchk.c:516 catalog/aclchk.c:1071 #, c-format msgid "invalid privilege type %s for routine" msgstr "el tipo de privilegio %s no es válido para una rutina" -#: catalog/aclchk.c:510 +#: catalog/aclchk.c:520 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "el tipo de privilegio %s no es válido para un tablespace" -#: catalog/aclchk.c:514 catalog/aclchk.c:1065 +#: catalog/aclchk.c:524 catalog/aclchk.c:1075 #, c-format msgid "invalid privilege type %s for type" msgstr "el tipo de privilegio %s no es válido para un tipo" -#: catalog/aclchk.c:518 +#: catalog/aclchk.c:528 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "el tipo de privilegio %s no es válido para un conector de datos externos" -#: catalog/aclchk.c:522 +#: catalog/aclchk.c:532 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "el tipo de privilegio %s no es válido para un servidor foráneo" -#: catalog/aclchk.c:526 +#: catalog/aclchk.c:536 #, c-format msgid "invalid privilege type %s for parameter" msgstr "el tipo de privilegio %s no es válido para un parámetro" -#: catalog/aclchk.c:565 +#: catalog/aclchk.c:575 #, c-format msgid "column privileges are only valid for relations" msgstr "los privilegios de columna son sólo válidos para relaciones" -#: catalog/aclchk.c:728 catalog/aclchk.c:3570 catalog/objectaddress.c:1092 -#: catalog/pg_largeobject.c:116 storage/large_object/inv_api.c:287 +#: catalog/aclchk.c:738 catalog/aclchk.c:3629 catalog/objectaddress.c:1054 +#: catalog/pg_largeobject.c:113 storage/large_object/inv_api.c:285 #, c-format msgid "large object %u does not exist" msgstr "no existe el objeto grande %u" -#: catalog/aclchk.c:1102 +#: catalog/aclchk.c:1112 #, c-format msgid "default privileges cannot be set for columns" msgstr "los privilegios por omisión no pueden definirse para columnas" -#: catalog/aclchk.c:1138 -#, fuzzy, c-format -#| msgid "permission denied to create role" +#: catalog/aclchk.c:1148 +#, c-format msgid "permission denied to change default privileges" -msgstr "se ha denegado el permiso para crear el rol" +msgstr "se ha denegado el permiso para cambiar los privilegios por omisión" -#: catalog/aclchk.c:1256 +#: catalog/aclchk.c:1266 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "No puede utilizar la cláusula IN SCHEMA cuando se utiliza GRANT / REVOKE ON SCHEMAS" -#: catalog/aclchk.c:1595 catalog/catalog.c:631 catalog/objectaddress.c:1561 -#: catalog/pg_publication.c:533 commands/analyze.c:389 commands/copy.c:837 -#: commands/sequence.c:1663 commands/tablecmds.c:7339 commands/tablecmds.c:7495 -#: commands/tablecmds.c:7545 commands/tablecmds.c:7619 -#: commands/tablecmds.c:7689 commands/tablecmds.c:7801 -#: commands/tablecmds.c:7895 commands/tablecmds.c:7954 -#: commands/tablecmds.c:8043 commands/tablecmds.c:8073 -#: commands/tablecmds.c:8201 commands/tablecmds.c:8283 -#: commands/tablecmds.c:8417 commands/tablecmds.c:8525 -#: commands/tablecmds.c:12240 commands/tablecmds.c:12421 -#: commands/tablecmds.c:12582 commands/tablecmds.c:13744 -#: commands/tablecmds.c:16273 commands/trigger.c:949 parser/analyze.c:2480 -#: parser/parse_relation.c:737 parser/parse_target.c:1054 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3413 -#: parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2884 -#: utils/adt/ruleutils.c:2783 +#: catalog/aclchk.c:1617 catalog/catalog.c:659 catalog/objectaddress.c:1523 +#: catalog/pg_publication.c:528 commands/analyze.c:380 commands/copy.c:951 +#: commands/sequence.c:1655 commands/tablecmds.c:7541 commands/tablecmds.c:7695 +#: commands/tablecmds.c:7745 commands/tablecmds.c:7819 +#: commands/tablecmds.c:7889 commands/tablecmds.c:8019 +#: commands/tablecmds.c:8148 commands/tablecmds.c:8242 +#: commands/tablecmds.c:8343 commands/tablecmds.c:8470 +#: commands/tablecmds.c:8500 commands/tablecmds.c:8642 +#: commands/tablecmds.c:8735 commands/tablecmds.c:8869 +#: commands/tablecmds.c:8981 commands/tablecmds.c:12797 +#: commands/tablecmds.c:12989 commands/tablecmds.c:13150 +#: commands/tablecmds.c:14339 commands/tablecmds.c:16966 commands/trigger.c:942 +#: parser/analyze.c:2530 parser/parse_relation.c:737 parser/parse_target.c:1067 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3409 +#: parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2923 +#: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "no existe la columna «%s» en la relación «%s»" -#: catalog/aclchk.c:1840 +#: catalog/aclchk.c:1862 #, c-format msgid "\"%s\" is an index" msgstr "«%s» es un índice" -#: catalog/aclchk.c:1847 commands/tablecmds.c:13901 commands/tablecmds.c:17200 +#: catalog/aclchk.c:1869 commands/tablecmds.c:14496 commands/tablecmds.c:17882 #, c-format msgid "\"%s\" is a composite type" msgstr "«%s» es un tipo compuesto" -#: catalog/aclchk.c:1855 catalog/objectaddress.c:1401 commands/sequence.c:1171 -#: commands/tablecmds.c:254 commands/tablecmds.c:17164 utils/adt/acl.c:2092 -#: utils/adt/acl.c:2122 utils/adt/acl.c:2154 utils/adt/acl.c:2186 -#: utils/adt/acl.c:2214 utils/adt/acl.c:2244 +#: catalog/aclchk.c:1877 catalog/objectaddress.c:1363 commands/tablecmds.c:263 +#: commands/tablecmds.c:17846 utils/adt/acl.c:2107 utils/adt/acl.c:2137 +#: utils/adt/acl.c:2170 utils/adt/acl.c:2206 utils/adt/acl.c:2237 +#: utils/adt/acl.c:2268 #, c-format msgid "\"%s\" is not a sequence" msgstr "«%s» no es una secuencia" -#: catalog/aclchk.c:1893 +#: catalog/aclchk.c:1915 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "la secuencia «%s» sólo soporta los privilegios USAGE, SELECT, y UPDATE" -#: catalog/aclchk.c:1910 +#: catalog/aclchk.c:1932 #, c-format msgid "invalid privilege type %s for table" msgstr "el tipo de privilegio %s no es válido para una tabla" -#: catalog/aclchk.c:2072 +#: catalog/aclchk.c:2097 #, c-format msgid "invalid privilege type %s for column" msgstr "el tipo de privilegio %s no es válido para una columna" -#: catalog/aclchk.c:2085 +#: catalog/aclchk.c:2110 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "la secuencia «%s» sólo soporta el privilegio SELECT" -#: catalog/aclchk.c:2275 +#: catalog/aclchk.c:2301 #, c-format msgid "language \"%s\" is not trusted" msgstr "el lenguaje «%s» no es confiable (trusted)" -#: catalog/aclchk.c:2277 +#: catalog/aclchk.c:2303 #, c-format msgid "GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages." msgstr "GRANT y REVOKE no están permitidos en lenguajes no confiables, porque sólo los superusuarios pueden usar lenguajes no confiables." -#: catalog/aclchk.c:2427 +#: catalog/aclchk.c:2454 #, c-format msgid "cannot set privileges of array types" msgstr "no se puede definir privilegios para tipos de array" -#: catalog/aclchk.c:2428 +#: catalog/aclchk.c:2455 #, c-format msgid "Set the privileges of the element type instead." msgstr "Defina los privilegios del tipo elemento en su lugar." -#: catalog/aclchk.c:2435 catalog/objectaddress.c:1667 +#: catalog/aclchk.c:2459 +#, c-format +msgid "cannot set privileges of multirange types" +msgstr "no se puede definir privilegios para tipos multirango" + +#: catalog/aclchk.c:2460 +#, c-format +msgid "Set the privileges of the range type instead." +msgstr "Defina los privilegios del tipo de rango en su lugar." + +#: catalog/aclchk.c:2467 catalog/objectaddress.c:1629 #, c-format msgid "\"%s\" is not a domain" msgstr "«%s» no es un dominio" -#: catalog/aclchk.c:2621 +#: catalog/aclchk.c:2653 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "tipo de privilegio «%s» no reconocido" -#: catalog/aclchk.c:2688 +#: catalog/aclchk.c:2720 #, c-format msgid "permission denied for aggregate %s" msgstr "permiso denegado a la función de agregación %s" -#: catalog/aclchk.c:2691 +#: catalog/aclchk.c:2723 #, c-format msgid "permission denied for collation %s" msgstr "permiso denegado al ordenamiento (collation) %s" -#: catalog/aclchk.c:2694 +#: catalog/aclchk.c:2726 #, c-format msgid "permission denied for column %s" msgstr "permiso denegado a la columna %s" -#: catalog/aclchk.c:2697 +#: catalog/aclchk.c:2729 #, c-format msgid "permission denied for conversion %s" msgstr "permiso denegado a la conversión %s" -#: catalog/aclchk.c:2700 +#: catalog/aclchk.c:2732 #, c-format msgid "permission denied for database %s" msgstr "permiso denegado a la base de datos %s" -#: catalog/aclchk.c:2703 +#: catalog/aclchk.c:2735 #, c-format msgid "permission denied for domain %s" msgstr "permiso denegado al dominio %s" -#: catalog/aclchk.c:2706 +#: catalog/aclchk.c:2738 #, c-format msgid "permission denied for event trigger %s" -msgstr "permiso denegado al disparador por eventos %s" +msgstr "permiso denegado al “trigger†por eventos %s" -#: catalog/aclchk.c:2709 +#: catalog/aclchk.c:2741 #, c-format msgid "permission denied for extension %s" msgstr "permiso denegado a la extensión %s" -#: catalog/aclchk.c:2712 +#: catalog/aclchk.c:2744 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "permiso denegado al conector de datos externos %s" -#: catalog/aclchk.c:2715 +#: catalog/aclchk.c:2747 #, c-format msgid "permission denied for foreign server %s" msgstr "permiso denegado al servidor foráneo %s" -#: catalog/aclchk.c:2718 +#: catalog/aclchk.c:2750 #, c-format msgid "permission denied for foreign table %s" msgstr "permiso denegado a la tabla foránea %s" -#: catalog/aclchk.c:2721 +#: catalog/aclchk.c:2753 #, c-format msgid "permission denied for function %s" msgstr "permiso denegado a la función %s" -#: catalog/aclchk.c:2724 +#: catalog/aclchk.c:2756 #, c-format msgid "permission denied for index %s" msgstr "permiso denegado al índice %s" -#: catalog/aclchk.c:2727 +#: catalog/aclchk.c:2759 #, c-format msgid "permission denied for language %s" msgstr "permiso denegado al lenguaje %s" -#: catalog/aclchk.c:2730 +#: catalog/aclchk.c:2762 #, c-format msgid "permission denied for large object %s" msgstr "permiso denegado al objeto grande %s" -#: catalog/aclchk.c:2733 +#: catalog/aclchk.c:2765 #, c-format msgid "permission denied for materialized view %s" msgstr "permiso denegado a la vista materializada %s" -#: catalog/aclchk.c:2736 +#: catalog/aclchk.c:2768 #, c-format msgid "permission denied for operator class %s" msgstr "permiso denegado a la clase de operadores %s" -#: catalog/aclchk.c:2739 +#: catalog/aclchk.c:2771 #, c-format msgid "permission denied for operator %s" msgstr "permiso denegado al operador %s" -#: catalog/aclchk.c:2742 +#: catalog/aclchk.c:2774 #, c-format msgid "permission denied for operator family %s" msgstr "permiso denegado a la familia de operadores %s" -#: catalog/aclchk.c:2745 +#: catalog/aclchk.c:2777 #, c-format msgid "permission denied for parameter %s" msgstr "permiso denegado al parámetro %s" -#: catalog/aclchk.c:2748 +#: catalog/aclchk.c:2780 #, c-format msgid "permission denied for policy %s" msgstr "permiso denegado a la política %s" -#: catalog/aclchk.c:2751 +#: catalog/aclchk.c:2783 #, c-format msgid "permission denied for procedure %s" msgstr "permiso denegado al procedimiento %s" -#: catalog/aclchk.c:2754 +#: catalog/aclchk.c:2786 #, c-format msgid "permission denied for publication %s" msgstr "permiso denegado a la publicación %s" -#: catalog/aclchk.c:2757 +#: catalog/aclchk.c:2789 #, c-format msgid "permission denied for routine %s" msgstr "permiso denegado a la rutina %s" -#: catalog/aclchk.c:2760 +#: catalog/aclchk.c:2792 #, c-format msgid "permission denied for schema %s" msgstr "permiso denegado al esquema %s" -#: catalog/aclchk.c:2763 commands/sequence.c:659 commands/sequence.c:885 -#: commands/sequence.c:927 commands/sequence.c:968 commands/sequence.c:1761 -#: commands/sequence.c:1810 +#: catalog/aclchk.c:2795 commands/sequence.c:654 commands/sequence.c:880 +#: commands/sequence.c:922 commands/sequence.c:963 commands/sequence.c:1753 +#: commands/sequence.c:1799 #, c-format msgid "permission denied for sequence %s" msgstr "permiso denegado a la secuencia %s" -#: catalog/aclchk.c:2766 +#: catalog/aclchk.c:2798 #, c-format msgid "permission denied for statistics object %s" msgstr "permiso denegado al objeto de estadísticas %s" -#: catalog/aclchk.c:2769 +#: catalog/aclchk.c:2801 #, c-format msgid "permission denied for subscription %s" msgstr "permiso denegado a la suscripción %s" -#: catalog/aclchk.c:2772 +#: catalog/aclchk.c:2804 #, c-format msgid "permission denied for table %s" msgstr "permiso denegado a la tabla %s" -#: catalog/aclchk.c:2775 +#: catalog/aclchk.c:2807 #, c-format msgid "permission denied for tablespace %s" msgstr "permiso denegado al tablespace %s" -#: catalog/aclchk.c:2778 +#: catalog/aclchk.c:2810 #, c-format msgid "permission denied for text search configuration %s" msgstr "permiso denegado a la configuración de búsqueda en texto %s" -#: catalog/aclchk.c:2781 +#: catalog/aclchk.c:2813 #, c-format msgid "permission denied for text search dictionary %s" msgstr "permiso denegado a la configuración de búsqueda en texto %s" -#: catalog/aclchk.c:2784 +#: catalog/aclchk.c:2816 #, c-format msgid "permission denied for type %s" msgstr "permiso denegado al tipo %s" -#: catalog/aclchk.c:2787 +#: catalog/aclchk.c:2819 #, c-format msgid "permission denied for view %s" msgstr "permiso denegado a la vista %s" -#: catalog/aclchk.c:2823 +#: catalog/aclchk.c:2855 #, c-format msgid "must be owner of aggregate %s" msgstr "debe ser dueño de la función de agregación %s" -#: catalog/aclchk.c:2826 +#: catalog/aclchk.c:2858 #, c-format msgid "must be owner of collation %s" msgstr "debe ser dueño del ordenamiento (collation) %s" -#: catalog/aclchk.c:2829 +#: catalog/aclchk.c:2861 #, c-format msgid "must be owner of conversion %s" msgstr "debe ser dueño de la conversión %s" -#: catalog/aclchk.c:2832 +#: catalog/aclchk.c:2864 #, c-format msgid "must be owner of database %s" msgstr "debe ser dueño de la base de datos %s" -#: catalog/aclchk.c:2835 +#: catalog/aclchk.c:2867 #, c-format msgid "must be owner of domain %s" msgstr "debe ser dueño del dominio %s" -#: catalog/aclchk.c:2838 +#: catalog/aclchk.c:2870 #, c-format msgid "must be owner of event trigger %s" -msgstr "debe ser dueño del disparador por eventos %s" +msgstr "debe ser dueño del “trigger†por eventos %s" -#: catalog/aclchk.c:2841 +#: catalog/aclchk.c:2873 #, c-format msgid "must be owner of extension %s" msgstr "debe ser dueño de la extensión %s" -#: catalog/aclchk.c:2844 +#: catalog/aclchk.c:2876 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "debe ser dueño del conector de datos externos %s" -#: catalog/aclchk.c:2847 +#: catalog/aclchk.c:2879 #, c-format msgid "must be owner of foreign server %s" msgstr "debe ser dueño del servidor foráneo %s" -#: catalog/aclchk.c:2850 +#: catalog/aclchk.c:2882 #, c-format msgid "must be owner of foreign table %s" msgstr "debe ser dueño de la tabla foránea %s" -#: catalog/aclchk.c:2853 +#: catalog/aclchk.c:2885 #, c-format msgid "must be owner of function %s" msgstr "debe ser dueño de la función %s" -#: catalog/aclchk.c:2856 +#: catalog/aclchk.c:2888 #, c-format msgid "must be owner of index %s" msgstr "debe ser dueño del índice %s" -#: catalog/aclchk.c:2859 +#: catalog/aclchk.c:2891 #, c-format msgid "must be owner of language %s" msgstr "debe ser dueño del lenguaje %s" -#: catalog/aclchk.c:2862 +#: catalog/aclchk.c:2894 #, c-format msgid "must be owner of large object %s" msgstr "debe ser dueño del objeto grande %s" -#: catalog/aclchk.c:2865 +#: catalog/aclchk.c:2897 #, c-format msgid "must be owner of materialized view %s" msgstr "debe ser dueño de la vista materializada %s" -#: catalog/aclchk.c:2868 +#: catalog/aclchk.c:2900 #, c-format msgid "must be owner of operator class %s" msgstr "debe ser dueño de la clase de operadores %s" -#: catalog/aclchk.c:2871 +#: catalog/aclchk.c:2903 #, c-format msgid "must be owner of operator %s" msgstr "debe ser dueño del operador %s" -#: catalog/aclchk.c:2874 +#: catalog/aclchk.c:2906 #, c-format msgid "must be owner of operator family %s" msgstr "debe ser dueño de la familia de operadores %s" -#: catalog/aclchk.c:2877 +#: catalog/aclchk.c:2909 #, c-format msgid "must be owner of procedure %s" msgstr "debe ser dueño del procedimiento %s" -#: catalog/aclchk.c:2880 +#: catalog/aclchk.c:2912 #, c-format msgid "must be owner of publication %s" msgstr "debe ser dueño de la publicación %s" -#: catalog/aclchk.c:2883 +#: catalog/aclchk.c:2915 #, c-format msgid "must be owner of routine %s" msgstr "debe ser dueño de la rutina %s" -#: catalog/aclchk.c:2886 +#: catalog/aclchk.c:2918 #, c-format msgid "must be owner of sequence %s" msgstr "debe ser dueño de la secuencia %s" -#: catalog/aclchk.c:2889 +#: catalog/aclchk.c:2921 #, c-format msgid "must be owner of subscription %s" msgstr "debe ser dueño de la suscripción %s" -#: catalog/aclchk.c:2892 +#: catalog/aclchk.c:2924 #, c-format msgid "must be owner of table %s" msgstr "debe ser dueño de la tabla %s" -#: catalog/aclchk.c:2895 +#: catalog/aclchk.c:2927 #, c-format msgid "must be owner of type %s" msgstr "debe ser dueño del tipo %s" -#: catalog/aclchk.c:2898 +#: catalog/aclchk.c:2930 #, c-format msgid "must be owner of view %s" msgstr "debe ser dueño de la vista %s" -#: catalog/aclchk.c:2901 +#: catalog/aclchk.c:2933 #, c-format msgid "must be owner of schema %s" msgstr "debe ser dueño del esquema %s" -#: catalog/aclchk.c:2904 +#: catalog/aclchk.c:2936 #, c-format msgid "must be owner of statistics object %s" msgstr "debe ser dueño del objeto de estadísticas %s" -#: catalog/aclchk.c:2907 +#: catalog/aclchk.c:2939 #, c-format msgid "must be owner of tablespace %s" msgstr "debe ser dueño del tablespace %s" -#: catalog/aclchk.c:2910 +#: catalog/aclchk.c:2942 #, c-format msgid "must be owner of text search configuration %s" msgstr "debe ser dueño de la configuración de búsqueda en texto %s" -#: catalog/aclchk.c:2913 +#: catalog/aclchk.c:2945 #, c-format msgid "must be owner of text search dictionary %s" msgstr "debe ser dueño del diccionario de búsqueda en texto %s" -#: catalog/aclchk.c:2927 +#: catalog/aclchk.c:2959 #, c-format msgid "must be owner of relation %s" msgstr "debe ser dueño de la relación %s" -#: catalog/aclchk.c:2973 +#: catalog/aclchk.c:3005 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "permiso denegado a la columna «%s» de la relación «%s»" -#: catalog/aclchk.c:3108 catalog/aclchk.c:3994 catalog/aclchk.c:4026 -#, fuzzy, c-format -#| msgid "schema with OID %u does not exist" +#: catalog/aclchk.c:3162 catalog/aclchk.c:4170 catalog/aclchk.c:4201 +#, c-format msgid "%s with OID %u does not exist" -msgstr "no existe el esquema con OID %u" +msgstr "%s con el OID %u no existe" -#: catalog/aclchk.c:3192 catalog/aclchk.c:3211 +#: catalog/aclchk.c:3245 catalog/aclchk.c:3264 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "no existe el atributo %d de la relación con OID %u" -#: catalog/aclchk.c:3306 +#: catalog/aclchk.c:3302 catalog/aclchk.c:3365 catalog/aclchk.c:4004 #, c-format msgid "relation with OID %u does not exist" msgstr "no existe la relación con OID %u" -#: catalog/aclchk.c:3491 +#: catalog/aclchk.c:3550 #, c-format msgid "parameter ACL with OID %u does not exist" msgstr "no existe el ACL de parámetro con OID %u" -#: catalog/aclchk.c:3655 commands/collationcmds.c:808 -#: commands/publicationcmds.c:1746 +#: catalog/aclchk.c:3723 commands/collationcmds.c:853 +#: commands/publicationcmds.c:1739 #, c-format msgid "schema with OID %u does not exist" msgstr "no existe el esquema con OID %u" -#: catalog/aclchk.c:3720 utils/cache/typcache.c:385 utils/cache/typcache.c:440 +#: catalog/aclchk.c:3797 catalog/aclchk.c:3824 catalog/aclchk.c:3853 +#: utils/cache/typcache.c:392 utils/cache/typcache.c:447 #, c-format msgid "type with OID %u does not exist" msgstr "no existe el tipo con OID %u" -#: catalog/catalog.c:449 +#: catalog/catalog.c:477 #, c-format msgid "still searching for an unused OID in relation \"%s\"" msgstr "aún se está buscando algún OID sin utilizar en la relación «%s»" -#: catalog/catalog.c:451 +#: catalog/catalog.c:479 #, c-format msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." msgstr[0] "se han revisado los OID candidatos %llu vez, pero aún no se ha encontrado algún OID sin utilizar." msgstr[1] "se han revisado los OID candidatos %llu veces, pero aún no se ha encontrado algún OID sin utilizar." -#: catalog/catalog.c:476 +#: catalog/catalog.c:504 #, c-format msgid "new OID has been assigned in relation \"%s\" after %llu retry" msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" msgstr[0] "se ha asignado un nuevo OID en la relación «%s» luego de %llu reintento" msgstr[1] "se ha asignado un nuevo OID en la relación «%s» luego de %llu reintentos" -#: catalog/catalog.c:609 catalog/catalog.c:676 +#: catalog/catalog.c:637 catalog/catalog.c:704 #, c-format msgid "must be superuser to call %s()" msgstr "debe ser superusuario para invocar %s()" -#: catalog/catalog.c:618 +#: catalog/catalog.c:646 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() sólo puede usarse en catálogos de sistema" -#: catalog/catalog.c:623 parser/parse_utilcmd.c:2264 +#: catalog/catalog.c:651 parser/parse_utilcmd.c:2270 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "el índice «%s» no pertenece a la tabla «%s»" -#: catalog/catalog.c:640 +#: catalog/catalog.c:668 #, c-format msgid "column \"%s\" is not of type oid" msgstr "la columna «%s» no es de tipo oid" -#: catalog/catalog.c:647 +#: catalog/catalog.c:675 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "«el índice %s» no es el índice para la columna «%s»" -#: catalog/dependency.c:546 catalog/pg_shdepend.c:658 +#: catalog/dependency.c:497 catalog/pg_shdepend.c:703 #, c-format msgid "cannot drop %s because it is required by the database system" msgstr "no se puede eliminar %s porque es requerido por el sistema" -#: catalog/dependency.c:838 catalog/dependency.c:1065 +#: catalog/dependency.c:789 catalog/dependency.c:1016 #, c-format msgid "cannot drop %s because %s requires it" msgstr "no se puede eliminar %s porque %s lo requiere" -#: catalog/dependency.c:840 catalog/dependency.c:1067 +#: catalog/dependency.c:791 catalog/dependency.c:1018 #, c-format msgid "You can drop %s instead." msgstr "Puede eliminar %s en su lugar." -#: catalog/dependency.c:1146 catalog/dependency.c:1155 +#: catalog/dependency.c:1097 catalog/dependency.c:1106 #, c-format msgid "%s depends on %s" msgstr "%s depende de %s" -#: catalog/dependency.c:1170 catalog/dependency.c:1179 +#: catalog/dependency.c:1121 catalog/dependency.c:1130 #, c-format msgid "drop cascades to %s" msgstr "eliminando además %s" -#: catalog/dependency.c:1187 catalog/pg_shdepend.c:823 +#: catalog/dependency.c:1138 catalog/pg_shdepend.c:868 #, c-format msgid "" "\n" @@ -4525,721 +4819,715 @@ msgstr[1] "" "\n" "y otros %d objetos (vea el registro del servidor para obtener la lista)" -#: catalog/dependency.c:1199 +#: catalog/dependency.c:1150 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "no se puede eliminar %s porque otros objetos dependen de él" -#: catalog/dependency.c:1202 catalog/dependency.c:1209 -#: catalog/dependency.c:1220 commands/tablecmds.c:1335 -#: commands/tablecmds.c:14386 commands/tablespace.c:466 commands/user.c:1309 -#: commands/vacuum.c:212 commands/view.c:446 libpq/auth.c:326 -#: replication/logical/applyparallelworker.c:1044 replication/syncrep.c:1017 -#: storage/lmgr/deadlock.c:1135 storage/lmgr/proc.c:1358 utils/misc/guc.c:3119 -#: utils/misc/guc.c:3155 utils/misc/guc.c:3225 utils/misc/guc.c:6739 -#: utils/misc/guc.c:6773 utils/misc/guc.c:6807 utils/misc/guc.c:6850 -#: utils/misc/guc.c:6892 +#: catalog/dependency.c:1153 catalog/dependency.c:1160 +#: catalog/dependency.c:1171 commands/tablecmds.c:1459 +#: commands/tablecmds.c:15088 commands/tablespace.c:460 commands/user.c:1302 +#: commands/vacuum.c:211 commands/view.c:441 executor/execExprInterp.c:4655 +#: executor/execExprInterp.c:4663 libpq/auth.c:324 +#: replication/logical/applyparallelworker.c:1041 replication/syncrep.c:1011 +#: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1432 utils/misc/guc.c:3169 +#: utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6825 +#: utils/misc/guc.c:6859 utils/misc/guc.c:6893 utils/misc/guc.c:6936 +#: utils/misc/guc.c:6978 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1203 catalog/dependency.c:1210 +#: catalog/dependency.c:1154 catalog/dependency.c:1161 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Use DROP ... CASCADE para eliminar además los objetos dependientes." -#: catalog/dependency.c:1207 +#: catalog/dependency.c:1158 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "no se puede eliminar el o los objetos deseados porque otros objetos dependen de ellos" -#: catalog/dependency.c:1215 +#: catalog/dependency.c:1166 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" msgstr[0] "eliminando además %d objeto más" msgstr[1] "eliminando además %d objetos más" -#: catalog/dependency.c:1899 +#: catalog/dependency.c:1850 #, c-format msgid "constant of the type %s cannot be used here" msgstr "no se puede usar una constante de tipo %s aquí" -#: catalog/dependency.c:2420 parser/parse_relation.c:3403 -#: parser/parse_relation.c:3413 +#: catalog/dependency.c:2375 parser/parse_relation.c:3407 +#: parser/parse_relation.c:3417 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "no existe la columna %d en la relación «%s»" -#: catalog/heap.c:324 +#: catalog/heap.c:325 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "se ha denegado el permiso para crear «%s.%s»" -#: catalog/heap.c:326 +#: catalog/heap.c:327 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Las modificaciones al catálogo del sistema están actualmente deshabilitadas." -#: catalog/heap.c:466 commands/tablecmds.c:2374 commands/tablecmds.c:3047 -#: commands/tablecmds.c:6922 +#: catalog/heap.c:467 commands/tablecmds.c:2495 commands/tablecmds.c:2917 +#: commands/tablecmds.c:7163 #, c-format msgid "tables can have at most %d columns" msgstr "las tablas pueden tener a lo más %d columnas" -#: catalog/heap.c:484 commands/tablecmds.c:7229 +#: catalog/heap.c:485 commands/tablecmds.c:7432 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "el nombre de columna «%s» colisiona con nombre de una columna de sistema" -#: catalog/heap.c:500 +#: catalog/heap.c:501 #, c-format msgid "column name \"%s\" specified more than once" msgstr "el nombre de columna «%s» fue especificado más de una vez" #. translator: first %s is an integer not a name -#: catalog/heap.c:575 +#: catalog/heap.c:579 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "la columna %s de la llave de partición tiene pseudotipo %s" -#: catalog/heap.c:580 +#: catalog/heap.c:584 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "la columna «%s» tiene pseudotipo %s" -#: catalog/heap.c:611 +#: catalog/heap.c:615 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "un tipo compuesto %s no puede ser hecho miembro de sí mismo" #. translator: first %s is an integer not a name -#: catalog/heap.c:666 +#: catalog/heap.c:670 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "no se derivó ningún ordenamiento (collate) para la columna %s de llave de partición con tipo ordenable %s" -#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:676 commands/createas.c:198 commands/createas.c:505 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "no se derivó ningún ordenamiento (collate) para la columna «%s» con tipo ordenable %s" -#: catalog/heap.c:1148 catalog/index.c:886 commands/createas.c:408 -#: commands/tablecmds.c:3987 +#: catalog/heap.c:1161 catalog/index.c:899 commands/createas.c:401 +#: commands/tablecmds.c:4171 #, c-format msgid "relation \"%s\" already exists" msgstr "la relación «%s» ya existe" -#: catalog/heap.c:1164 catalog/pg_type.c:434 catalog/pg_type.c:782 -#: catalog/pg_type.c:954 commands/typecmds.c:249 commands/typecmds.c:261 -#: commands/typecmds.c:754 commands/typecmds.c:1169 commands/typecmds.c:1395 -#: commands/typecmds.c:1575 commands/typecmds.c:2546 +#: catalog/heap.c:1177 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: catalog/pg_type.c:977 commands/typecmds.c:253 commands/typecmds.c:265 +#: commands/typecmds.c:758 commands/typecmds.c:1179 commands/typecmds.c:1405 +#: commands/typecmds.c:1585 commands/typecmds.c:2556 #, c-format msgid "type \"%s\" already exists" msgstr "ya existe un tipo «%s»" -#: catalog/heap.c:1165 +#: catalog/heap.c:1178 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "Una relación tiene un tipo asociado del mismo nombre, de modo que debe usar un nombre que no entre en conflicto con un tipo existente." -#: catalog/heap.c:1205 -#, fuzzy, c-format -#| msgid "toast relfilenode value not set when in binary upgrade mode" +#: catalog/heap.c:1218 +#, c-format msgid "toast relfilenumber value not set when in binary upgrade mode" -msgstr "el relfilenode de toast no se definió en modo de actualización binaria" +msgstr "el valor de relfilenumber de toast no se definió en modo de actualización binaria" -#: catalog/heap.c:1216 +#: catalog/heap.c:1229 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "el valor de OID de heap de pg_class no se definió en modo de actualización binaria" -#: catalog/heap.c:1226 -#, fuzzy, c-format -#| msgid "relfilenode value not set when in binary upgrade mode" +#: catalog/heap.c:1239 +#, c-format msgid "relfilenumber value not set when in binary upgrade mode" -msgstr "el valor de relfilende no se definió en modo de actualización binaria" +msgstr "el valor de relfilenumber no se definió en modo de actualización binaria" -#: catalog/heap.c:2119 +#: catalog/heap.c:2130 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "no se puede agregar una restricción NO INHERIT a la tabla particionada «%s»" -#: catalog/heap.c:2393 +#: catalog/heap.c:2402 #, c-format msgid "check constraint \"%s\" already exists" msgstr "la restricción «check» «%s» ya existe" -#: catalog/heap.c:2563 catalog/index.c:900 catalog/pg_constraint.c:682 -#: commands/tablecmds.c:8900 +#: catalog/heap.c:2574 catalog/index.c:913 catalog/pg_constraint.c:724 +#: commands/tablecmds.c:9356 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "la restricción «%s» para la relación «%s» ya existe" -#: catalog/heap.c:2570 +#: catalog/heap.c:2581 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "la restricción «%s» está en conflicto con la restricción no heredada de la relación «%s»" -#: catalog/heap.c:2581 +#: catalog/heap.c:2592 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "la restricción «%s» está en conflicto con la restricción heredada de la relación «%s»" -#: catalog/heap.c:2591 +#: catalog/heap.c:2602 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "la restricción «%s» está en conflicto con la restricción NOT VALID de la relación «%s»" -#: catalog/heap.c:2596 +#: catalog/heap.c:2607 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "mezclando la restricción «%s» con la definición heredada" -#: catalog/heap.c:2622 catalog/pg_constraint.c:811 commands/tablecmds.c:2672 -#: commands/tablecmds.c:3199 commands/tablecmds.c:6858 -#: commands/tablecmds.c:15208 commands/tablecmds.c:15349 -#, fuzzy, c-format -#| msgid "too many command-line arguments" +#: catalog/heap.c:2633 catalog/pg_constraint.c:853 commands/tablecmds.c:3074 +#: commands/tablecmds.c:3377 commands/tablecmds.c:7089 +#: commands/tablecmds.c:15907 commands/tablecmds.c:16038 +#, c-format msgid "too many inheritance parents" -msgstr "demasiados argumentos de línea de órdenes" +msgstr "demasiados padres de herencia" -#: catalog/heap.c:2706 +#: catalog/heap.c:2717 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "no se puede usar la columna generada «%s» en una expresión de generación de columna" -#: catalog/heap.c:2708 +#: catalog/heap.c:2719 #, c-format msgid "A generated column cannot reference another generated column." msgstr "Una columna generada no puede hacer referencia a otra columna generada." -#: catalog/heap.c:2714 +#: catalog/heap.c:2725 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "no se puede usar una variable de fila completa (whole-row) en una expresión de generación de columna" -#: catalog/heap.c:2715 +#: catalog/heap.c:2726 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "Esto causaría que la columna generada dependa de su propio valor." -#: catalog/heap.c:2768 +#: catalog/heap.c:2781 #, c-format msgid "generation expression is not immutable" msgstr "la expresión de generación no es inmutable" -#: catalog/heap.c:2796 rewrite/rewriteHandler.c:1295 +#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1276 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "la columna «%s» es de tipo %s pero la expresión default es de tipo %s" -#: catalog/heap.c:2801 commands/prepare.c:334 parser/analyze.c:2704 -#: parser/parse_target.c:593 parser/parse_target.c:874 -#: parser/parse_target.c:884 rewrite/rewriteHandler.c:1300 +#: catalog/heap.c:2814 commands/prepare.c:331 parser/analyze.c:2758 +#: parser/parse_target.c:592 parser/parse_target.c:882 +#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1281 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Necesitará reescribir la expresión o aplicarle una conversión de tipo." -#: catalog/heap.c:2848 +#: catalog/heap.c:2861 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "sólo la tabla «%s» puede ser referenciada en una restricción «check»" -#: catalog/heap.c:3154 +#: catalog/heap.c:3167 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "combinación de ON COMMIT y llaves foráneas no soportada" -#: catalog/heap.c:3155 +#: catalog/heap.c:3168 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "La tabla «%s» se refiere a «%s», pero no tienen la misma expresión para ON COMMIT." -#: catalog/heap.c:3160 +#: catalog/heap.c:3173 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "no se puede truncar una tabla referida en una llave foránea" -#: catalog/heap.c:3161 +#: catalog/heap.c:3174 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "La tabla «%s» hace referencia a «%s»." -#: catalog/heap.c:3163 +#: catalog/heap.c:3176 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Trunque la tabla «%s» al mismo tiempo, o utilice TRUNCATE ... CASCADE." -#: catalog/index.c:224 parser/parse_utilcmd.c:2170 +#: catalog/index.c:219 parser/parse_utilcmd.c:2176 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "no se permiten múltiples llaves primarias para la tabla «%s»" -#: catalog/index.c:238 -#, fuzzy, c-format -#| msgid "primary keys cannot be expressions" +#: catalog/index.c:233 +#, c-format msgid "primary keys cannot use NULLS NOT DISTINCT indexes" -msgstr "las llaves primarias no pueden ser expresiones" +msgstr "las llaves primarias no pueden usar índices NULLS NOT DISTINCT" -#: catalog/index.c:255 +#: catalog/index.c:250 #, c-format msgid "primary keys cannot be expressions" msgstr "las llaves primarias no pueden ser expresiones" -#: catalog/index.c:272 +#: catalog/index.c:267 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "columna de llave primaria «%s» no está marcada NOT NULL" -#: catalog/index.c:785 catalog/index.c:1941 +#: catalog/index.c:798 catalog/index.c:1915 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "los usuarios no pueden crear índices en tablas del sistema" -#: catalog/index.c:825 +#: catalog/index.c:838 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "los ordenamientos no determinísticos no están soportados para la clase de operadores «%s»" -#: catalog/index.c:840 +#: catalog/index.c:853 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "no se pueden crear índices de forma concurrente en tablas del sistema" -#: catalog/index.c:849 catalog/index.c:1317 +#: catalog/index.c:862 catalog/index.c:1331 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "no se pueden crear índices para restricciones de exclusión de forma concurrente" -#: catalog/index.c:858 +#: catalog/index.c:871 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "no se pueden crear índices compartidos después de initdb" -#: catalog/index.c:878 commands/createas.c:423 commands/sequence.c:158 +#: catalog/index.c:891 commands/createas.c:416 commands/sequence.c:159 #: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "la relación «%s» ya existe, omitiendo" -#: catalog/index.c:928 +#: catalog/index.c:941 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "el valor de OID de índice de pg_class no se definió en modo de actualización binaria" -#: catalog/index.c:938 utils/cache/relcache.c:3730 -#, fuzzy, c-format -#| msgid "index relfilenode value not set when in binary upgrade mode" +#: catalog/index.c:951 utils/cache/relcache.c:3791 +#, c-format msgid "index relfilenumber value not set when in binary upgrade mode" -msgstr "el valor de relfilenode de índice no se definió en modo de actualización binaria" +msgstr "el valor relfilenumber de índice no se definió en modo de actualización binaria" -#: catalog/index.c:2240 +#: catalog/index.c:2214 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY debe ser la primera acción en una transacción" -#: catalog/index.c:3647 +#: catalog/index.c:3668 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "no se puede hacer reindex de tablas temporales de otras sesiones" -#: catalog/index.c:3658 commands/indexcmds.c:3622 +#: catalog/index.c:3679 commands/indexcmds.c:3626 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "no es posible reindexar un índice no válido en tabla TOAST" -#: catalog/index.c:3674 commands/indexcmds.c:3502 commands/indexcmds.c:3646 -#: commands/tablecmds.c:3402 +#: catalog/index.c:3695 commands/indexcmds.c:3504 commands/indexcmds.c:3650 +#: commands/tablecmds.c:3581 #, c-format msgid "cannot move system relation \"%s\"" msgstr "no se puede mover la relación de sistema «%s»" -#: catalog/index.c:3818 +#: catalog/index.c:3832 #, c-format msgid "index \"%s\" was reindexed" msgstr "el índice «%s» fue reindexado" -#: catalog/index.c:3955 +#: catalog/index.c:3998 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "no se puede reindexar el índice no válido «%s.%s» en tabla TOAST, omitiendo" -#: catalog/namespace.c:260 catalog/namespace.c:464 catalog/namespace.c:556 -#: commands/trigger.c:5687 +#: catalog/namespace.c:462 catalog/namespace.c:666 catalog/namespace.c:758 +#: commands/trigger.c:5729 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "no están implementadas las referencias entre bases de datos: «%s.%s.%s»" -#: catalog/namespace.c:317 +#: catalog/namespace.c:519 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "las tablas temporales no pueden especificar un nombre de esquema" -#: catalog/namespace.c:398 +#: catalog/namespace.c:600 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" -msgstr "no se pudo bloquear un candado en la relación «%s.%s»" +msgstr "no se pudo bloquear un “lock†en la relación «%s.%s»" -#: catalog/namespace.c:403 commands/lockcmds.c:145 commands/lockcmds.c:225 +#: catalog/namespace.c:605 commands/lockcmds.c:143 commands/lockcmds.c:223 #, c-format msgid "could not obtain lock on relation \"%s\"" -msgstr "no se pudo bloquear un candado en la relación «%s»" +msgstr "no se pudo bloquear un “lock†en la relación «%s»" -#: catalog/namespace.c:431 parser/parse_relation.c:1429 +#: catalog/namespace.c:633 parser/parse_relation.c:1430 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "no existe la relación «%s.%s»" -#: catalog/namespace.c:436 parser/parse_relation.c:1442 -#: parser/parse_relation.c:1450 utils/adt/regproc.c:913 +#: catalog/namespace.c:638 parser/parse_relation.c:1443 +#: parser/parse_relation.c:1451 utils/adt/regproc.c:913 #, c-format msgid "relation \"%s\" does not exist" msgstr "no existe la relación «%s»" -#: catalog/namespace.c:502 catalog/namespace.c:3073 commands/extension.c:1584 -#: commands/extension.c:1590 +#: catalog/namespace.c:704 catalog/namespace.c:3522 commands/extension.c:1607 +#: commands/extension.c:1613 #, c-format msgid "no schema has been selected to create in" msgstr "no se ha seleccionado ningún esquema dentro del cual crear" -#: catalog/namespace.c:654 catalog/namespace.c:667 +#: catalog/namespace.c:856 catalog/namespace.c:869 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "no se pueden crear relaciones en esquemas temporales de otras sesiones" -#: catalog/namespace.c:658 +#: catalog/namespace.c:860 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "no se pueden crear tablas temporales en esquemas no temporales" -#: catalog/namespace.c:673 +#: catalog/namespace.c:875 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "sólo relaciones temporales pueden ser creadas en los esquemas temporales" -#: catalog/namespace.c:2265 +#: catalog/namespace.c:2619 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "no existe el objeto de estadísticas «%s»" -#: catalog/namespace.c:2388 +#: catalog/namespace.c:2761 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "no existe el analizador de búsqueda en texto «%s»" -#: catalog/namespace.c:2514 utils/adt/regproc.c:1439 +#: catalog/namespace.c:2906 utils/adt/regproc.c:1459 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "no existe el diccionario de búsqueda en texto «%s»" -#: catalog/namespace.c:2641 +#: catalog/namespace.c:3052 #, c-format msgid "text search template \"%s\" does not exist" msgstr "no existe la plantilla de búsqueda en texto «%s»" -#: catalog/namespace.c:2767 commands/tsearchcmds.c:1162 -#: utils/adt/regproc.c:1329 utils/cache/ts_cache.c:635 +#: catalog/namespace.c:3197 commands/tsearchcmds.c:1168 +#: utils/adt/regproc.c:1349 utils/cache/ts_cache.c:635 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "no existe la configuración de búsqueda en texto «%s»" -#: catalog/namespace.c:2880 parser/parse_expr.c:825 parser/parse_target.c:1246 +#: catalog/namespace.c:3329 parser/parse_expr.c:868 parser/parse_target.c:1259 #, c-format msgid "cross-database references are not implemented: %s" msgstr "no están implementadas las referencias entre bases de datos: %s" -#: catalog/namespace.c:2886 parser/parse_expr.c:832 parser/parse_target.c:1253 -#: gram.y:18621 gram.y:18661 +#: catalog/namespace.c:3335 parser/parse_expr.c:875 parser/parse_target.c:1266 +#: gram.y:19181 gram.y:19221 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "el nombre no es válido (demasiados puntos): %s" -#: catalog/namespace.c:3016 +#: catalog/namespace.c:3465 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "no se puede mover objetos hacia o desde esquemas temporales" -#: catalog/namespace.c:3022 +#: catalog/namespace.c:3471 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "no se puede mover objetos hacia o desde el esquema TOAST" -#: catalog/namespace.c:3095 commands/schemacmds.c:264 commands/schemacmds.c:344 -#: commands/tablecmds.c:1280 utils/adt/regproc.c:1668 +#: catalog/namespace.c:3544 commands/schemacmds.c:264 commands/schemacmds.c:344 +#: commands/tablecmds.c:1404 utils/adt/regproc.c:1688 #, c-format msgid "schema \"%s\" does not exist" msgstr "no existe el esquema «%s»" -#: catalog/namespace.c:3126 +#: catalog/namespace.c:3575 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "el nombre de relación no es válido (demasiados puntos): %s" -#: catalog/namespace.c:3693 utils/adt/regproc.c:1056 +#: catalog/namespace.c:4016 utils/adt/regproc.c:1056 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "no existe el ordenamiento (collation) «%s» para la codificación «%s»" -#: catalog/namespace.c:3748 +#: catalog/namespace.c:4071 #, c-format msgid "conversion \"%s\" does not exist" msgstr "no existe la conversión «%s»" -#: catalog/namespace.c:4012 +#: catalog/namespace.c:4412 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "se ha denegado el permiso para crear tablas temporales en la base de datos «%s»" -#: catalog/namespace.c:4028 +#: catalog/namespace.c:4428 #, c-format msgid "cannot create temporary tables during recovery" msgstr "no se pueden crear tablas temporales durante la recuperación" -#: catalog/namespace.c:4034 +#: catalog/namespace.c:4434 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "no se pueden crear tablas temporales durante una operación paralela" -#: catalog/objectaddress.c:1409 commands/policy.c:96 commands/policy.c:376 -#: commands/tablecmds.c:248 commands/tablecmds.c:290 commands/tablecmds.c:2206 -#: commands/tablecmds.c:12357 +#: catalog/objectaddress.c:1371 commands/policy.c:93 commands/policy.c:373 +#: commands/tablecmds.c:257 commands/tablecmds.c:299 commands/tablecmds.c:2327 +#: commands/tablecmds.c:12925 #, c-format msgid "\"%s\" is not a table" msgstr "«%s» no es una tabla" -#: catalog/objectaddress.c:1416 commands/tablecmds.c:260 -#: commands/tablecmds.c:17169 commands/view.c:119 +#: catalog/objectaddress.c:1378 commands/tablecmds.c:269 +#: commands/tablecmds.c:17851 commands/view.c:114 #, c-format msgid "\"%s\" is not a view" msgstr "«%s» no es una vista" -#: catalog/objectaddress.c:1423 commands/matview.c:187 commands/tablecmds.c:266 -#: commands/tablecmds.c:17174 +#: catalog/objectaddress.c:1385 commands/matview.c:199 commands/tablecmds.c:275 +#: commands/tablecmds.c:17856 #, c-format msgid "\"%s\" is not a materialized view" msgstr "«%s» no es una vista materializada" -#: catalog/objectaddress.c:1430 commands/tablecmds.c:284 -#: commands/tablecmds.c:17179 +#: catalog/objectaddress.c:1392 commands/tablecmds.c:293 +#: commands/tablecmds.c:17861 #, c-format msgid "\"%s\" is not a foreign table" msgstr "«%s» no es una tabla foránea" -#: catalog/objectaddress.c:1471 +#: catalog/objectaddress.c:1433 #, c-format msgid "must specify relation and object name" msgstr "debe especificar nombre de relación y nombre de objeto" -#: catalog/objectaddress.c:1547 catalog/objectaddress.c:1600 +#: catalog/objectaddress.c:1509 catalog/objectaddress.c:1562 #, c-format msgid "column name must be qualified" msgstr "el nombre de columna debe ser calificado" -#: catalog/objectaddress.c:1619 +#: catalog/objectaddress.c:1581 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "no existe el valor por omisión para la columna «%s» de la relación «%s»" -#: catalog/objectaddress.c:1656 commands/functioncmds.c:137 -#: commands/tablecmds.c:276 commands/typecmds.c:274 commands/typecmds.c:3689 +#: catalog/objectaddress.c:1618 commands/functioncmds.c:132 +#: commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3843 #: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 -#: utils/adt/acl.c:4449 +#: utils/adt/acl.c:4560 #, c-format msgid "type \"%s\" does not exist" msgstr "no existe el tipo «%s»" -#: catalog/objectaddress.c:1775 +#: catalog/objectaddress.c:1737 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "no existe el operador %d (%s, %s) de %s" -#: catalog/objectaddress.c:1806 +#: catalog/objectaddress.c:1768 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "no existe la función %d (%s, %s) de %s" -#: catalog/objectaddress.c:1857 catalog/objectaddress.c:1883 +#: catalog/objectaddress.c:1819 catalog/objectaddress.c:1845 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "no existe el mapeo para el usuario «%s» en el servidor «%s»" -#: catalog/objectaddress.c:1872 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:700 +#: catalog/objectaddress.c:1834 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:713 #, c-format msgid "server \"%s\" does not exist" msgstr "no existe el servidor «%s»" -#: catalog/objectaddress.c:1939 +#: catalog/objectaddress.c:1901 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "no existe la relación «%s» en la publicación «%s»" -#: catalog/objectaddress.c:1986 -#, fuzzy, c-format -#| msgid "publication relation \"%s\" in publication \"%s\" does not exist" +#: catalog/objectaddress.c:1948 +#, c-format msgid "publication schema \"%s\" in publication \"%s\" does not exist" -msgstr "no existe la relación «%s» en la publicación «%s»" +msgstr "no existe el esquema de publicación «%s» en la publicación «%s»" -#: catalog/objectaddress.c:2044 +#: catalog/objectaddress.c:2006 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "tipo de objeto para ACL por omisión «%c» no reconocido" -#: catalog/objectaddress.c:2045 +#: catalog/objectaddress.c:2007 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "Tipos válidos de objeto son «%c», «%c», «%c», «%c» y «%c»." -#: catalog/objectaddress.c:2096 +#: catalog/objectaddress.c:2058 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "no existe el ACL por omisión para el usuario «%s» en el esquema «%s» en %s" -#: catalog/objectaddress.c:2101 +#: catalog/objectaddress.c:2063 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "no existe el ACL por omisión para el usuario «%s» en %s" -#: catalog/objectaddress.c:2127 catalog/objectaddress.c:2184 -#: catalog/objectaddress.c:2239 +#: catalog/objectaddress.c:2089 catalog/objectaddress.c:2146 +#: catalog/objectaddress.c:2201 #, c-format msgid "name or argument lists may not contain nulls" msgstr "las listas de nombres o argumentos no pueden contener nulls" -#: catalog/objectaddress.c:2161 +#: catalog/objectaddress.c:2123 #, c-format msgid "unsupported object type \"%s\"" msgstr "tipo de objeto «%s» no soportado" -#: catalog/objectaddress.c:2180 catalog/objectaddress.c:2197 -#: catalog/objectaddress.c:2262 catalog/objectaddress.c:2346 +#: catalog/objectaddress.c:2142 catalog/objectaddress.c:2159 +#: catalog/objectaddress.c:2224 catalog/objectaddress.c:2308 #, c-format msgid "name list length must be exactly %d" msgstr "el largo de la lista de nombres debe ser exactamente %d" -#: catalog/objectaddress.c:2201 +#: catalog/objectaddress.c:2163 #, c-format msgid "large object OID may not be null" msgstr "el OID de objeto grande no puede ser null" -#: catalog/objectaddress.c:2210 catalog/objectaddress.c:2280 -#: catalog/objectaddress.c:2287 +#: catalog/objectaddress.c:2172 catalog/objectaddress.c:2242 +#: catalog/objectaddress.c:2249 #, c-format msgid "name list length must be at least %d" msgstr "el largo de la lista de nombres debe ser al menos %d" -#: catalog/objectaddress.c:2273 catalog/objectaddress.c:2294 +#: catalog/objectaddress.c:2235 catalog/objectaddress.c:2256 #, c-format msgid "argument list length must be exactly %d" msgstr "el largo de la lista de argumentos debe ser exactamente %d" -#: catalog/objectaddress.c:2508 libpq/be-fsstubs.c:329 +#: catalog/objectaddress.c:2470 libpq/be-fsstubs.c:329 #, c-format msgid "must be owner of large object %u" msgstr "debe ser dueño del objeto grande %u" -#: catalog/objectaddress.c:2523 commands/functioncmds.c:1561 +#: catalog/objectaddress.c:2485 commands/functioncmds.c:1560 #, c-format msgid "must be owner of type %s or type %s" msgstr "debe ser dueño del tipo %s o el tipo %s" -#: catalog/objectaddress.c:2550 catalog/objectaddress.c:2559 -#: catalog/objectaddress.c:2565 +#: catalog/objectaddress.c:2512 catalog/objectaddress.c:2521 +#: catalog/objectaddress.c:2527 #, c-format msgid "permission denied" msgstr "permiso denegado" -#: catalog/objectaddress.c:2551 catalog/objectaddress.c:2560 +#: catalog/objectaddress.c:2513 catalog/objectaddress.c:2522 #, c-format msgid "The current user must have the %s attribute." -msgstr "" +msgstr "El usuario actual debe tener el atributo %s." -#: catalog/objectaddress.c:2566 -#, fuzzy, c-format -#| msgid "must have admin option on role \"%s\"" +#: catalog/objectaddress.c:2528 +#, c-format msgid "The current user must have the %s option on role \"%s\"." -msgstr "debe tener opción de admin en rol «%s»" +msgstr "El usuario actual debe tener la opción %s en el rol «%s»." -#: catalog/objectaddress.c:2580 +#: catalog/objectaddress.c:2542 #, c-format msgid "must be superuser" msgstr "debe ser superusuario" -#: catalog/objectaddress.c:2649 +#: catalog/objectaddress.c:2611 #, c-format msgid "unrecognized object type \"%s\"" msgstr "tipo de objeto «%s» no reconocido" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2941 +#: catalog/objectaddress.c:2928 #, c-format msgid "column %s of %s" -msgstr " columna %s de %s" +msgstr "columna %s de %s" -#: catalog/objectaddress.c:2956 +#: catalog/objectaddress.c:2943 #, c-format msgid "function %s" msgstr "función %s" -#: catalog/objectaddress.c:2969 +#: catalog/objectaddress.c:2956 #, c-format msgid "type %s" msgstr "tipo %s" -#: catalog/objectaddress.c:3006 +#: catalog/objectaddress.c:2993 #, c-format msgid "cast from %s to %s" msgstr "conversión de %s a %s" -#: catalog/objectaddress.c:3039 +#: catalog/objectaddress.c:3026 #, c-format msgid "collation %s" msgstr "ordenamiento (collation) %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3070 +#: catalog/objectaddress.c:3057 #, c-format msgid "constraint %s on %s" msgstr "restricción «%s» en %s" -#: catalog/objectaddress.c:3076 +#: catalog/objectaddress.c:3063 #, c-format msgid "constraint %s" msgstr "restricción %s" -#: catalog/objectaddress.c:3108 +#: catalog/objectaddress.c:3095 #, c-format msgid "conversion %s" msgstr "conversión %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3130 +#: catalog/objectaddress.c:3117 #, c-format msgid "default value for %s" msgstr "valor por omisión para %s" -#: catalog/objectaddress.c:3141 +#: catalog/objectaddress.c:3128 #, c-format msgid "language %s" msgstr "lenguaje %s" -#: catalog/objectaddress.c:3149 +#: catalog/objectaddress.c:3136 #, c-format msgid "large object %u" msgstr "objeto grande %u" -#: catalog/objectaddress.c:3162 +#: catalog/objectaddress.c:3149 #, c-format msgid "operator %s" msgstr "operador %s" -#: catalog/objectaddress.c:3199 +#: catalog/objectaddress.c:3186 #, c-format msgid "operator class %s for access method %s" msgstr "clase de operadores «%s» para el método de acceso «%s»" -#: catalog/objectaddress.c:3227 +#: catalog/objectaddress.c:3214 #, c-format msgid "access method %s" msgstr "método de acceso %s" @@ -5248,7 +5536,7 @@ msgstr "método de acceso %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3276 +#: catalog/objectaddress.c:3269 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "operador %d (%s, %s) de %s: %s" @@ -5257,237 +5545,236 @@ msgstr "operador %d (%s, %s) de %s: %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3333 +#: catalog/objectaddress.c:3334 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "función %d (%s, %s) de %s: %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3385 +#: catalog/objectaddress.c:3388 #, c-format msgid "rule %s on %s" msgstr "regla %s en %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3431 +#: catalog/objectaddress.c:3434 #, c-format msgid "trigger %s on %s" -msgstr "disparador %s en %s" +msgstr "“trigger†%s en %s" -#: catalog/objectaddress.c:3451 +#: catalog/objectaddress.c:3454 #, c-format msgid "schema %s" msgstr "esquema %s" -#: catalog/objectaddress.c:3479 +#: catalog/objectaddress.c:3482 #, c-format msgid "statistics object %s" msgstr "objeto de estadísticas %s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3513 #, c-format msgid "text search parser %s" msgstr "analizador de búsqueda en texto %s" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3544 #, c-format msgid "text search dictionary %s" msgstr "diccionario de búsqueda en texto %s" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3575 #, c-format msgid "text search template %s" msgstr "plantilla de búsqueda en texto %s" -#: catalog/objectaddress.c:3603 +#: catalog/objectaddress.c:3606 #, c-format msgid "text search configuration %s" msgstr "configuración de búsqueda en texto %s" -#: catalog/objectaddress.c:3616 +#: catalog/objectaddress.c:3619 #, c-format msgid "role %s" msgstr "rol %s" -#: catalog/objectaddress.c:3653 catalog/objectaddress.c:5505 -#, fuzzy, c-format -#| msgid "removal of role \"%s\" failed: %s" +#: catalog/objectaddress.c:3656 catalog/objectaddress.c:5505 +#, c-format msgid "membership of role %s in role %s" -msgstr "falló la eliminación del rol «%s»: %s" +msgstr "membresía del rol %s en el rol %s" -#: catalog/objectaddress.c:3674 +#: catalog/objectaddress.c:3677 #, c-format msgid "database %s" msgstr "base de datos %s" -#: catalog/objectaddress.c:3690 +#: catalog/objectaddress.c:3693 #, c-format msgid "tablespace %s" msgstr "tablespace %s" -#: catalog/objectaddress.c:3701 +#: catalog/objectaddress.c:3704 #, c-format msgid "foreign-data wrapper %s" msgstr "conector de datos externos %s" -#: catalog/objectaddress.c:3711 +#: catalog/objectaddress.c:3714 #, c-format msgid "server %s" msgstr "servidor %s" -#: catalog/objectaddress.c:3744 +#: catalog/objectaddress.c:3747 #, c-format msgid "user mapping for %s on server %s" msgstr "mapeo para el usuario %s en el servidor %s" -#: catalog/objectaddress.c:3796 +#: catalog/objectaddress.c:3799 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "privilegios por omisión en nuevas relaciones pertenecientes al rol %s en el esquema %s" -#: catalog/objectaddress.c:3800 +#: catalog/objectaddress.c:3803 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "privilegios por omisión en nuevas relaciones pertenecientes al rol %s" -#: catalog/objectaddress.c:3806 +#: catalog/objectaddress.c:3809 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "privilegios por omisión en nuevas secuencias pertenecientes al rol %s en el esquema %s" -#: catalog/objectaddress.c:3810 +#: catalog/objectaddress.c:3813 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "privilegios por omisión en nuevas secuencias pertenecientes al rol %s" -#: catalog/objectaddress.c:3816 +#: catalog/objectaddress.c:3819 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "privilegios por omisión en nuevas funciones pertenecientes al rol %s en el esquema %s" -#: catalog/objectaddress.c:3820 +#: catalog/objectaddress.c:3823 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "privilegios por omisión en nuevas funciones pertenecientes al rol %s" -#: catalog/objectaddress.c:3826 +#: catalog/objectaddress.c:3829 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "privilegios por omisión en nuevos tipos pertenecientes al rol %s en el esquema %s" -#: catalog/objectaddress.c:3830 +#: catalog/objectaddress.c:3833 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "privilegios por omisión en nuevos tipos pertenecientes al rol %s" -#: catalog/objectaddress.c:3836 +#: catalog/objectaddress.c:3839 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "privilegios por omisión en nuevos esquemas pertenecientes al rol %s" -#: catalog/objectaddress.c:3843 +#: catalog/objectaddress.c:3846 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "privilegios por omisión pertenecientes al rol %s en el esquema %s" -#: catalog/objectaddress.c:3847 +#: catalog/objectaddress.c:3850 #, c-format msgid "default privileges belonging to role %s" msgstr "privilegios por omisión pertenecientes al rol %s" -#: catalog/objectaddress.c:3869 +#: catalog/objectaddress.c:3872 #, c-format msgid "extension %s" msgstr "extensión %s" -#: catalog/objectaddress.c:3886 +#: catalog/objectaddress.c:3889 #, c-format msgid "event trigger %s" -msgstr "disparador por eventos %s" +msgstr "“trigger†por eventos %s" -#: catalog/objectaddress.c:3910 +#: catalog/objectaddress.c:3913 #, c-format msgid "parameter %s" msgstr "parámetro %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3953 +#: catalog/objectaddress.c:3956 #, c-format msgid "policy %s on %s" msgstr "política %s en %s" -#: catalog/objectaddress.c:3967 +#: catalog/objectaddress.c:3970 #, c-format msgid "publication %s" msgstr "publicación %s" -#: catalog/objectaddress.c:3980 +#: catalog/objectaddress.c:3983 #, c-format msgid "publication of schema %s in publication %s" msgstr "publicación de esquema %s en la publicación %s" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:4011 +#: catalog/objectaddress.c:4014 #, c-format msgid "publication of %s in publication %s" msgstr "publicación de %s en la publicación %s" -#: catalog/objectaddress.c:4024 +#: catalog/objectaddress.c:4027 #, c-format msgid "subscription %s" msgstr "suscripción %s" -#: catalog/objectaddress.c:4045 +#: catalog/objectaddress.c:4048 #, c-format msgid "transform for %s language %s" msgstr "transformación para %s lenguaje %s" -#: catalog/objectaddress.c:4116 +#: catalog/objectaddress.c:4117 #, c-format msgid "table %s" msgstr "tabla %s" -#: catalog/objectaddress.c:4121 +#: catalog/objectaddress.c:4122 #, c-format msgid "index %s" msgstr "índice %s" -#: catalog/objectaddress.c:4125 +#: catalog/objectaddress.c:4126 #, c-format msgid "sequence %s" msgstr "secuencia %s" -#: catalog/objectaddress.c:4129 +#: catalog/objectaddress.c:4130 #, c-format msgid "toast table %s" msgstr "tabla toast %s" -#: catalog/objectaddress.c:4133 +#: catalog/objectaddress.c:4134 #, c-format msgid "view %s" msgstr "vista %s" -#: catalog/objectaddress.c:4137 +#: catalog/objectaddress.c:4138 #, c-format msgid "materialized view %s" msgstr "vista materializada %s" -#: catalog/objectaddress.c:4141 +#: catalog/objectaddress.c:4142 #, c-format msgid "composite type %s" msgstr "tipo compuesto %s" -#: catalog/objectaddress.c:4145 +#: catalog/objectaddress.c:4146 #, c-format msgid "foreign table %s" msgstr "tabla foránea %s" -#: catalog/objectaddress.c:4150 +#: catalog/objectaddress.c:4151 #, c-format msgid "relation %s" msgstr "relación %s" -#: catalog/objectaddress.c:4191 +#: catalog/objectaddress.c:4192 #, c-format msgid "operator family %s for access method %s" msgstr "familia de operadores %s para el método de acceso %s" @@ -5529,7 +5816,7 @@ msgstr "no se puede omitir el valor inicial cuando la función de transición es msgid "return type of inverse transition function %s is not %s" msgstr "el tipo de retorno de la función inversa de transición %s no es %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3009 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2991 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "la opción «strict» de las funciones de transición directa e inversa deben coincidir exactamente en la función de agregación" @@ -5544,7 +5831,7 @@ msgstr "la función final con argumentos extra no debe declararse STRICT" msgid "return type of combine function %s is not %s" msgstr "el tipo de retorno de la función «combine» %s no es %s" -#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3903 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3902 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "la función «combine» con tipo de transición %s no debe declararse STRICT" @@ -5559,12 +5846,12 @@ msgstr "el tipo de retorno de la función de serialización %s no es %s" msgid "return type of deserialization function %s is not %s" msgstr "el tipo de retorno de la función de deserialización %s no es %s" -#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:191 catalog/pg_proc.c:225 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:189 catalog/pg_proc.c:223 #, c-format msgid "cannot determine result data type" msgstr "no se puede determinar el tipo de dato del resultado" -#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:204 catalog/pg_proc.c:233 +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:202 catalog/pg_proc.c:231 #, c-format msgid "unsafe use of pseudo-type \"internal\"" msgstr "uso inseguro de pseudotipo «internal»" @@ -5579,7 +5866,7 @@ msgstr "la implementación de la función de agregación en modo «moving» devu msgid "sort operator can only be specified for single-argument aggregates" msgstr "el operador de ordenamiento sólo puede ser especificado para funciones de agregación de un solo argumento" -#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:384 #, c-format msgid "cannot change routine kind" msgstr "no se puede cambiar el tipo de rutina" @@ -5604,13 +5891,13 @@ msgstr "«%s» es una agregación de conjunto hipotético." msgid "cannot change number of direct arguments of an aggregate function" msgstr "no se puede cambiar cantidad de argumentos directos de una función de agregación" -#: catalog/pg_aggregate.c:858 commands/functioncmds.c:691 -#: commands/typecmds.c:1975 commands/typecmds.c:2021 commands/typecmds.c:2073 -#: commands/typecmds.c:2110 commands/typecmds.c:2144 commands/typecmds.c:2178 -#: commands/typecmds.c:2212 commands/typecmds.c:2241 commands/typecmds.c:2328 -#: commands/typecmds.c:2370 parser/parse_func.c:417 parser/parse_func.c:448 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:686 +#: commands/typecmds.c:1985 commands/typecmds.c:2031 commands/typecmds.c:2083 +#: commands/typecmds.c:2120 commands/typecmds.c:2154 commands/typecmds.c:2188 +#: commands/typecmds.c:2222 commands/typecmds.c:2251 commands/typecmds.c:2338 +#: commands/typecmds.c:2380 parser/parse_func.c:417 parser/parse_func.c:448 #: parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 -#: parser/parse_func.c:631 parser/parse_func.c:2171 parser/parse_func.c:2444 +#: parser/parse_func.c:631 parser/parse_func.c:2172 parser/parse_func.c:2445 #, c-format msgid "function %s does not exist" msgstr "no existe la función %s" @@ -5685,133 +5972,133 @@ msgstr "Esta operación no está soportada en tablas particionadas." msgid "This operation is not supported for partitioned indexes." msgstr "Esta operación no está soportada en índices particionados." -#: catalog/pg_collation.c:102 catalog/pg_collation.c:160 +#: catalog/pg_collation.c:101 catalog/pg_collation.c:159 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "el ordenamiento «%s» ya existe, omitiendo" -#: catalog/pg_collation.c:104 +#: catalog/pg_collation.c:103 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" msgstr "el ordenamiento «%s» para la codificación «%s» ya existe, omitiendo" -#: catalog/pg_collation.c:112 catalog/pg_collation.c:167 +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 #, c-format msgid "collation \"%s\" already exists" msgstr "el ordenamiento «%s» ya existe" -#: catalog/pg_collation.c:114 +#: catalog/pg_collation.c:113 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "la codificación «%2$s» ya tiene un ordenamiento llamado «%1$s»" -#: catalog/pg_constraint.c:690 +#: catalog/pg_constraint.c:732 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "el dominio %2$s ya contiene una restricción llamada «%1$s»" -#: catalog/pg_constraint.c:890 catalog/pg_constraint.c:983 +#: catalog/pg_constraint.c:932 catalog/pg_constraint.c:1025 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "no existe la restricción «%s» para la tabla «%s»" -#: catalog/pg_constraint.c:1083 +#: catalog/pg_constraint.c:1125 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "no existe la restricción «%s» para el dominio %s" -#: catalog/pg_conversion.c:67 +#: catalog/pg_conversion.c:64 #, c-format msgid "conversion \"%s\" already exists" msgstr "ya existe la conversión «%s»" -#: catalog/pg_conversion.c:80 +#: catalog/pg_conversion.c:77 #, c-format msgid "default conversion for %s to %s already exists" msgstr "ya existe una conversión por omisión desde %s a %s" -#: catalog/pg_depend.c:222 commands/extension.c:3344 +#: catalog/pg_depend.c:224 commands/extension.c:3397 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "«%s» ya es un miembro de la extensión «%s»" -#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3384 +#: catalog/pg_depend.c:231 catalog/pg_depend.c:282 commands/extension.c:3437 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s no es un miembro de la extensión «%s»" -#: catalog/pg_depend.c:232 +#: catalog/pg_depend.c:234 #, c-format msgid "An extension is not allowed to replace an object that it does not own." msgstr "A una extensión no se le permite reemplazar un objeto que no posee." -#: catalog/pg_depend.c:283 +#: catalog/pg_depend.c:285 #, c-format msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." msgstr "Una extensión sólo puede usar CREATE ... IF NOT EXISTS para omitir la creación de un objeto si el objeto en conflicto es uno de cual ya es dueña." -#: catalog/pg_depend.c:646 +#: catalog/pg_depend.c:648 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "no se puede eliminar dependencia a %s porque es un objeto requerido por el sistema" -#: catalog/pg_enum.c:137 catalog/pg_enum.c:259 catalog/pg_enum.c:554 +#: catalog/pg_enum.c:175 catalog/pg_enum.c:314 catalog/pg_enum.c:624 #, c-format msgid "invalid enum label \"%s\"" msgstr "la etiqueta enum «%s» no es válida" -#: catalog/pg_enum.c:138 catalog/pg_enum.c:260 catalog/pg_enum.c:555 +#: catalog/pg_enum.c:176 catalog/pg_enum.c:315 catalog/pg_enum.c:625 #, c-format msgid "Labels must be %d bytes or less." msgstr "Las etiquetas deben ser de %d bytes o menos." -#: catalog/pg_enum.c:288 +#: catalog/pg_enum.c:343 #, c-format msgid "enum label \"%s\" already exists, skipping" msgstr "la etiqueta de enum «%s» ya existe, omitiendo" -#: catalog/pg_enum.c:295 catalog/pg_enum.c:598 +#: catalog/pg_enum.c:350 catalog/pg_enum.c:668 #, c-format msgid "enum label \"%s\" already exists" msgstr "la etiqueta de enum «%s» ya existe" -#: catalog/pg_enum.c:350 catalog/pg_enum.c:593 +#: catalog/pg_enum.c:405 catalog/pg_enum.c:663 #, c-format msgid "\"%s\" is not an existing enum label" msgstr "«%s» no es una etiqueta de enum existente" -#: catalog/pg_enum.c:408 +#: catalog/pg_enum.c:463 #, c-format msgid "pg_enum OID value not set when in binary upgrade mode" msgstr "el valor de OID de pg_enum no se definió en modo de actualización binaria" -#: catalog/pg_enum.c:418 +#: catalog/pg_enum.c:473 #, c-format msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" msgstr "ALTER TYPE ADD BEFORE/AFTER es incompatible con la actualización binaria" -#: catalog/pg_inherits.c:593 +#: catalog/pg_inherits.c:592 #, c-format msgid "cannot detach partition \"%s\"" msgstr "no se puede desprender la partición «%s»" -#: catalog/pg_inherits.c:595 +#: catalog/pg_inherits.c:594 #, c-format msgid "The partition is being detached concurrently or has an unfinished detach." msgstr "La partición está siendo desprendida de forma concurrente o tiene un desprendimiento sin terminar." -#: catalog/pg_inherits.c:596 commands/tablecmds.c:4583 -#: commands/tablecmds.c:15464 +#: catalog/pg_inherits.c:595 commands/tablecmds.c:4800 +#: commands/tablecmds.c:16153 #, c-format msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." msgstr "Utilice ALTER TABLE ... DETACH PARTITION ... FINALIZE para completar la operación de desprendimiento pendiente." -#: catalog/pg_inherits.c:600 +#: catalog/pg_inherits.c:599 #, c-format msgid "cannot complete detaching partition \"%s\"" msgstr "no se puede completar el desprendimiento de la partición «%s»" -#: catalog/pg_inherits.c:602 +#: catalog/pg_inherits.c:601 #, c-format msgid "There's no pending concurrent detach." msgstr "No hay desprendimientos concurrentes pendientes." @@ -5821,116 +6108,129 @@ msgstr "No hay desprendimientos concurrentes pendientes." msgid "schema \"%s\" already exists" msgstr "ya existe el esquema «%s»" -#: catalog/pg_operator.c:219 catalog/pg_operator.c:361 +#: catalog/pg_operator.c:213 catalog/pg_operator.c:355 #, c-format msgid "\"%s\" is not a valid operator name" msgstr "«%s» no es un nombre válido de operador" -#: catalog/pg_operator.c:370 +#: catalog/pg_operator.c:379 +#, c-format +msgid "operator %s already exists" +msgstr "ya existe un operador %s" + +#: catalog/pg_operator.c:445 commands/operatorcmds.c:600 +#, c-format +msgid "operator cannot be its own negator" +msgstr "un operador no puede ser su propio negador" + +#: catalog/pg_operator.c:572 #, c-format msgid "only binary operators can have commutators" msgstr "sólo los operadores binarios pueden tener conmutadores" -#: catalog/pg_operator.c:374 commands/operatorcmds.c:509 +#: catalog/pg_operator.c:576 #, c-format msgid "only binary operators can have join selectivity" msgstr "sólo los operadores binarios pueden tener selectividad de join" -#: catalog/pg_operator.c:378 +#: catalog/pg_operator.c:580 #, c-format msgid "only binary operators can merge join" msgstr "sólo los operadores binarios pueden ser usados en merge join" -#: catalog/pg_operator.c:382 +#: catalog/pg_operator.c:584 #, c-format msgid "only binary operators can hash" msgstr "sólo los operadores binarios pueden ser usados en hash" -#: catalog/pg_operator.c:393 +#: catalog/pg_operator.c:593 #, c-format msgid "only boolean operators can have negators" msgstr "sólo los operadores booleanos pueden tener negadores" -#: catalog/pg_operator.c:397 commands/operatorcmds.c:517 +#: catalog/pg_operator.c:597 #, c-format msgid "only boolean operators can have restriction selectivity" msgstr "sólo los operadores booleanos pueden tener selectividad de restricción" -#: catalog/pg_operator.c:401 commands/operatorcmds.c:521 +#: catalog/pg_operator.c:601 #, c-format msgid "only boolean operators can have join selectivity" msgstr "sólo los operadores booleanos pueden tener selectividad de join" -#: catalog/pg_operator.c:405 +#: catalog/pg_operator.c:605 #, c-format msgid "only boolean operators can merge join" msgstr "sólo los operadores booleanos pueden ser usados en merge join" -#: catalog/pg_operator.c:409 +#: catalog/pg_operator.c:609 #, c-format msgid "only boolean operators can hash" msgstr "sólo los operadores booleanos pueden ser usados en hash" -#: catalog/pg_operator.c:421 +#: catalog/pg_operator.c:739 #, c-format -msgid "operator %s already exists" -msgstr "ya existe un operador %s" +msgid "commutator operator %s is already the commutator of operator %s" +msgstr "el operator de conmutación %s ya es el conmutador del operador %s" -#: catalog/pg_operator.c:621 +#: catalog/pg_operator.c:744 #, c-format -msgid "operator cannot be its own negator or sort operator" -msgstr "un operador no puede ser su propio negador u operador de ordenamiento" +msgid "commutator operator %s is already the commutator of operator %u" +msgstr "el operator de conmutación %s ya es el conmutador del operador %u" -#: catalog/pg_parameter_acl.c:53 -#, fuzzy, c-format -#| msgid "parameter ACL with OID %u does not exist" -msgid "parameter ACL \"%s\" does not exist" -msgstr "no existe el ACL de parámetro con OID %u" +#: catalog/pg_operator.c:807 +#, c-format +msgid "negator operator %s is already the negator of operator %s" +msgstr "el operator de negación %s ya es el negador del operador %s" -#: catalog/pg_parameter_acl.c:88 -#, fuzzy, c-format -#| msgid "invalid type name \"%s\"" -msgid "invalid parameter name \"%s\"" -msgstr "el nombre de tipo «%s» no es válido" +#: catalog/pg_operator.c:812 +#, c-format +msgid "negator operator %s is already the negator of operator %u" +msgstr "el operator de negación %s ya es el negador del operador %u" + +#: catalog/pg_parameter_acl.c:50 +#, c-format +msgid "parameter ACL \"%s\" does not exist" +msgstr "no existe el ACL de parámetro «%s»" -#: catalog/pg_proc.c:132 parser/parse_func.c:2233 +#: catalog/pg_proc.c:130 parser/parse_func.c:2234 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" msgstr[0] "las funciones no pueden tener más de %d argumento" msgstr[1] "las funciones no pueden tener más de %d argumentos" -#: catalog/pg_proc.c:376 +#: catalog/pg_proc.c:374 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "ya existe una función «%s» con los mismos argumentos" -#: catalog/pg_proc.c:388 +#: catalog/pg_proc.c:386 #, c-format msgid "\"%s\" is an aggregate function." msgstr "«%s» es una función de agregación." -#: catalog/pg_proc.c:390 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is a function." msgstr "«%s» es una función de agregación." -#: catalog/pg_proc.c:392 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a procedure." msgstr "«%s» es un índice parcial." -#: catalog/pg_proc.c:394 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a window function." msgstr "«%s» es una función de ventana deslizante." -#: catalog/pg_proc.c:414 +#: catalog/pg_proc.c:412 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "no se puede cambiar que un procedimiento tenga parámetros de salida" -#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 +#: catalog/pg_proc.c:413 catalog/pg_proc.c:443 #, c-format msgid "cannot change return type of existing function" msgstr "no se puede cambiar el tipo de retorno de una función existente" @@ -5939,120 +6239,114 @@ msgstr "no se puede cambiar el tipo de retorno de una función existente" #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: catalog/pg_proc.c:421 catalog/pg_proc.c:448 catalog/pg_proc.c:493 -#: catalog/pg_proc.c:519 catalog/pg_proc.c:543 +#: catalog/pg_proc.c:419 catalog/pg_proc.c:446 catalog/pg_proc.c:491 +#: catalog/pg_proc.c:517 catalog/pg_proc.c:541 #, c-format msgid "Use %s %s first." msgstr "Use %s %s primero." -#: catalog/pg_proc.c:446 +#: catalog/pg_proc.c:444 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "Tipo de registro definido por parámetros OUT es diferente." -#: catalog/pg_proc.c:490 +#: catalog/pg_proc.c:488 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "no se puede cambiar el nombre del parámetro de entrada «%s»" -#: catalog/pg_proc.c:517 +#: catalog/pg_proc.c:515 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "no se puede eliminar el valor por omisión de funciones existentes" -#: catalog/pg_proc.c:541 +#: catalog/pg_proc.c:539 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "no se puede cambiar el tipo de dato del valor por omisión de un parámetro" -#: catalog/pg_proc.c:753 +#: catalog/pg_proc.c:750 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "no hay ninguna función interna llamada «%s»" -#: catalog/pg_proc.c:846 +#: catalog/pg_proc.c:843 #, c-format msgid "SQL functions cannot return type %s" msgstr "las funciones SQL no pueden retornar el tipo %s" -#: catalog/pg_proc.c:861 +#: catalog/pg_proc.c:858 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "las funciones SQL no pueden tener argumentos de tipo %s" -#: catalog/pg_proc.c:988 executor/functions.c:1466 +#: catalog/pg_proc.c:986 executor/functions.c:1468 #, c-format msgid "SQL function \"%s\"" msgstr "función SQL «%s»" -#: catalog/pg_publication.c:71 catalog/pg_publication.c:79 -#: catalog/pg_publication.c:87 catalog/pg_publication.c:93 +#: catalog/pg_publication.c:66 catalog/pg_publication.c:74 +#: catalog/pg_publication.c:82 catalog/pg_publication.c:88 #, c-format msgid "cannot add relation \"%s\" to publication" msgstr "no se puede agregar la relación «%s» a la publicación" -#: catalog/pg_publication.c:81 +#: catalog/pg_publication.c:76 #, c-format msgid "This operation is not supported for system tables." msgstr "Esta operación no está soportada en tablas de sistema." -#: catalog/pg_publication.c:89 +#: catalog/pg_publication.c:84 #, c-format msgid "This operation is not supported for temporary tables." msgstr "Esta operación no está soportada en tablas temporales." -#: catalog/pg_publication.c:95 +#: catalog/pg_publication.c:90 #, c-format msgid "This operation is not supported for unlogged tables." msgstr "Esta característica no está soportada en tablas «unlogged»." -#: catalog/pg_publication.c:109 catalog/pg_publication.c:117 +#: catalog/pg_publication.c:104 catalog/pg_publication.c:112 #, c-format msgid "cannot add schema \"%s\" to publication" msgstr "no se puede agregar el esquema «%s» a la partición" -#: catalog/pg_publication.c:111 -#, fuzzy, c-format -#| msgid "This operation is not supported for system tables." +#: catalog/pg_publication.c:106 +#, c-format msgid "This operation is not supported for system schemas." -msgstr "Esta operación no está soportada en tablas de sistema." +msgstr "Esta operación no está soportada en esquemas de sistema." -#: catalog/pg_publication.c:119 -#, fuzzy, c-format -#| msgid "Unlogged relations cannot be replicated." +#: catalog/pg_publication.c:114 +#, c-format msgid "Temporary schemas cannot be replicated." -msgstr "Las tablas «unlogged» no pueden replicarse." +msgstr "Los esquemas temporales no pueden replicarse." -#: catalog/pg_publication.c:397 +#: catalog/pg_publication.c:392 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "la relación «%s» ya es un miembro de la publicación «%s»" -#: catalog/pg_publication.c:539 -#, fuzzy, c-format -#| msgid "cannot use system column \"%s\" in partition key" +#: catalog/pg_publication.c:534 +#, c-format msgid "cannot use system column \"%s\" in publication column list" -msgstr "no se puede usar la columna de sistema «%s» en llave de particionamiento" +msgstr "no se puede usar la columna de sistema «%s» en lista de columnas de publicación" -#: catalog/pg_publication.c:545 -#, fuzzy, c-format -#| msgid "cannot use generated column in partition key" +#: catalog/pg_publication.c:540 +#, c-format msgid "cannot use generated column \"%s\" in publication column list" -msgstr "no se puede usar una columna generada en llave de particionamiento" +msgstr "no se puede usar la columna generada «%s» en lista de columnas de publicación" -#: catalog/pg_publication.c:551 -#, fuzzy, c-format -#| msgid "publication of %s in publication %s" +#: catalog/pg_publication.c:546 +#, c-format msgid "duplicate column \"%s\" in publication column list" -msgstr "publicación de %s en la publicación %s" +msgstr "columna «%s» duplicada en lista de columnas de publicación" -#: catalog/pg_publication.c:641 -#, fuzzy, c-format -#| msgid "relation \"%s\" is already member of publication \"%s\"" +#: catalog/pg_publication.c:636 +#, c-format msgid "schema \"%s\" is already member of publication \"%s\"" -msgstr "la relación «%s» ya es un miembro de la publicación «%s»" +msgstr "el esquema «%s» ya es miembro de la publicación «%s»" -#: catalog/pg_shdepend.c:830 +#: catalog/pg_shdepend.c:875 #, c-format msgid "" "\n" @@ -6067,65 +6361,70 @@ msgstr[1] "" "\n" "y objetos en otras %d bases de datos (vea el registro del servidor para obtener la lista)" -#: catalog/pg_shdepend.c:1177 +#: catalog/pg_shdepend.c:1222 #, c-format msgid "role %u was concurrently dropped" msgstr "el rol %u fue eliminado por una transacción concurrente" -#: catalog/pg_shdepend.c:1189 +#: catalog/pg_shdepend.c:1234 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "el tablespace %u fue eliminado por una transacción concurrente" -#: catalog/pg_shdepend.c:1203 +#: catalog/pg_shdepend.c:1248 #, c-format msgid "database %u was concurrently dropped" msgstr "la base de datos %u fue eliminado por una transacción concurrente" -#: catalog/pg_shdepend.c:1254 +#: catalog/pg_shdepend.c:1299 #, c-format msgid "owner of %s" msgstr "dueño de %s" -#: catalog/pg_shdepend.c:1256 +#: catalog/pg_shdepend.c:1301 #, c-format msgid "privileges for %s" msgstr "privilegios para %s" -#: catalog/pg_shdepend.c:1258 +#: catalog/pg_shdepend.c:1303 +#, c-format +msgid "initial privileges for %s" +msgstr "privilegios iniciales para %s" + +#: catalog/pg_shdepend.c:1305 #, c-format msgid "target of %s" msgstr "destino de %s" -#: catalog/pg_shdepend.c:1260 +#: catalog/pg_shdepend.c:1307 #, c-format msgid "tablespace for %s" msgstr "tablespace para %s" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1268 +#: catalog/pg_shdepend.c:1315 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" msgstr[0] "%d objeto en %s" msgstr[1] "%d objetos en %s" -#: catalog/pg_shdepend.c:1332 +#: catalog/pg_shdepend.c:1379 #, c-format msgid "cannot drop objects owned by %s because they are required by the database system" msgstr "no se puede eliminar objetos de propiedad de %s porque son requeridos por el sistema" -#: catalog/pg_shdepend.c:1497 +#: catalog/pg_shdepend.c:1560 #, c-format msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "no se puede reasignar la propiedad de objetos de %s porque son requeridos por el sistema" -#: catalog/pg_subscription.c:424 +#: catalog/pg_subscription.c:438 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "no se pudo eliminar mapeo de relación para suscripción «%s»" -#: catalog/pg_subscription.c:426 +#: catalog/pg_subscription.c:440 #, c-format msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." msgstr "La sincronización de tabla para la relación «%s» está en progreso y su estado es «%c»." @@ -6133,227 +6432,227 @@ msgstr "La sincronización de tabla para la relación «%s» está en progreso y #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command #. -#: catalog/pg_subscription.c:433 +#: catalog/pg_subscription.c:447 #, c-format msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." msgstr "Utilice %s para activar la suscripción si aún no está activada, o utilice %s para eliminar la suscripción." -#: catalog/pg_type.c:134 catalog/pg_type.c:474 +#: catalog/pg_type.c:133 catalog/pg_type.c:474 #, c-format msgid "pg_type OID value not set when in binary upgrade mode" msgstr "el valor de OID de pg_type no se definió en modo de actualización binaria" -#: catalog/pg_type.c:254 +#: catalog/pg_type.c:253 #, c-format msgid "invalid type internal size %d" msgstr "el tamaño interno de tipo %d no es válido" -#: catalog/pg_type.c:270 catalog/pg_type.c:278 catalog/pg_type.c:286 -#: catalog/pg_type.c:295 +#: catalog/pg_type.c:269 catalog/pg_type.c:277 catalog/pg_type.c:285 +#: catalog/pg_type.c:294 #, c-format msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" msgstr "el alineamiento «%c» no es válido para un tipo pasado por valor de tamaño %d" -#: catalog/pg_type.c:302 +#: catalog/pg_type.c:301 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "el tamaño interno %d no es válido para un tipo pasado por valor" -#: catalog/pg_type.c:312 catalog/pg_type.c:318 +#: catalog/pg_type.c:311 catalog/pg_type.c:317 #, c-format msgid "alignment \"%c\" is invalid for variable-length type" msgstr "el alineamiento «%c» no es válido para un tipo de largo variable" -#: catalog/pg_type.c:326 commands/typecmds.c:4140 +#: catalog/pg_type.c:325 commands/typecmds.c:4363 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "los tipos de tamaño fijo deben tener almacenamiento PLAIN" -#: catalog/pg_type.c:955 +#: catalog/pg_type.c:978 #, c-format msgid "Failed while creating a multirange type for type \"%s\"." msgstr "Falla al crear un tipo de multirango para el tipo «%s»." -#: catalog/pg_type.c:956 +#: catalog/pg_type.c:979 #, c-format msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." msgstr "Puede especificar manualmente un nombre para el tipo de multirango usando el atributo «multirange_type_name»." -#: catalog/storage.c:505 storage/buffer/bufmgr.c:1146 +#: catalog/storage.c:533 storage/buffer/bufmgr.c:1540 #, c-format msgid "invalid page in block %u of relation %s" msgstr "la página no es válida en el bloque %u de la relación %s" -#: commands/aggregatecmds.c:171 +#: commands/aggregatecmds.c:167 #, c-format msgid "only ordered-set aggregates can be hypothetical" msgstr "sólo las funciones de agregación de conjuntos ordenados pueden ser hipotéticas" -#: commands/aggregatecmds.c:196 +#: commands/aggregatecmds.c:192 #, c-format msgid "aggregate attribute \"%s\" not recognized" msgstr "el atributo de la función de agregación «%s» no es reconocido" -#: commands/aggregatecmds.c:206 +#: commands/aggregatecmds.c:202 #, c-format msgid "aggregate stype must be specified" msgstr "debe especificarse el tipo de transición (stype) de la función de agregación" -#: commands/aggregatecmds.c:210 +#: commands/aggregatecmds.c:206 #, c-format msgid "aggregate sfunc must be specified" msgstr "debe especificarse la función de transición (sfunc) de la función de agregación" -#: commands/aggregatecmds.c:222 +#: commands/aggregatecmds.c:218 #, c-format msgid "aggregate msfunc must be specified when mstype is specified" msgstr "debe especificarse la función de transición msfunc cuando se especifica mstype" -#: commands/aggregatecmds.c:226 +#: commands/aggregatecmds.c:222 #, c-format msgid "aggregate minvfunc must be specified when mstype is specified" msgstr "debe especificarse la función de transición minvfunc cuando se especifica mstype" -#: commands/aggregatecmds.c:233 +#: commands/aggregatecmds.c:229 #, c-format msgid "aggregate msfunc must not be specified without mstype" msgstr "no debe especificarse msfunc sin mstype" -#: commands/aggregatecmds.c:237 +#: commands/aggregatecmds.c:233 #, c-format msgid "aggregate minvfunc must not be specified without mstype" msgstr "no debe especificarse minvfunc sin mstype" -#: commands/aggregatecmds.c:241 +#: commands/aggregatecmds.c:237 #, c-format msgid "aggregate mfinalfunc must not be specified without mstype" msgstr "no debe especificarse mfinalfunc sin mstype" -#: commands/aggregatecmds.c:245 +#: commands/aggregatecmds.c:241 #, c-format msgid "aggregate msspace must not be specified without mstype" msgstr "no debe especificarse msspace sin mstype" -#: commands/aggregatecmds.c:249 +#: commands/aggregatecmds.c:245 #, c-format msgid "aggregate minitcond must not be specified without mstype" msgstr "no debe especificarse minitcond sin mstype" -#: commands/aggregatecmds.c:278 +#: commands/aggregatecmds.c:274 #, c-format msgid "aggregate input type must be specified" msgstr "debe especificarse el tipo de entrada de la función de agregación" -#: commands/aggregatecmds.c:308 +#: commands/aggregatecmds.c:304 #, c-format msgid "basetype is redundant with aggregate input type specification" msgstr "el tipo base es redundante con el tipo de entrada en la función de agregación" -#: commands/aggregatecmds.c:351 commands/aggregatecmds.c:392 +#: commands/aggregatecmds.c:347 commands/aggregatecmds.c:388 #, c-format msgid "aggregate transition data type cannot be %s" msgstr "el tipo de transición de la función de agregación no puede ser %s" -#: commands/aggregatecmds.c:363 +#: commands/aggregatecmds.c:359 #, c-format msgid "serialization functions may be specified only when the aggregate transition data type is %s" msgstr "las funciones de serialización pueden especificarse sólo cuando el tipo de transición de la función de agregación es %s" -#: commands/aggregatecmds.c:373 +#: commands/aggregatecmds.c:369 #, c-format msgid "must specify both or neither of serialization and deserialization functions" msgstr "debe especificar ambas o ninguna de las funciones de serialización y deserialización" -#: commands/aggregatecmds.c:438 commands/functioncmds.c:639 +#: commands/aggregatecmds.c:434 commands/functioncmds.c:634 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "el parámetro «parallel» debe ser SAFE, RESTRICTED o UNSAFE" -#: commands/aggregatecmds.c:494 +#: commands/aggregatecmds.c:490 #, c-format msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" msgstr "el parámetro «%s» debe ser READ_ONLY, SHAREABLE o READ_WRITE" -#: commands/alter.c:86 commands/event_trigger.c:174 +#: commands/alter.c:83 commands/event_trigger.c:191 #, c-format msgid "event trigger \"%s\" already exists" -msgstr "el disparador por eventos «%s» ya existe" +msgstr "el “trigger†por eventos «%s» ya existe" -#: commands/alter.c:89 commands/foreigncmds.c:593 +#: commands/alter.c:86 commands/foreigncmds.c:593 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "el conector de datos externos «%s» ya existe" -#: commands/alter.c:92 commands/foreigncmds.c:884 +#: commands/alter.c:89 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "el servidor «%s» ya existe" -#: commands/alter.c:95 commands/proclang.c:133 +#: commands/alter.c:92 commands/proclang.c:131 #, c-format msgid "language \"%s\" already exists" msgstr "ya existe el lenguaje «%s»" -#: commands/alter.c:98 commands/publicationcmds.c:771 +#: commands/alter.c:95 commands/publicationcmds.c:764 #, c-format msgid "publication \"%s\" already exists" msgstr "la publicación «%s» ya existe" -#: commands/alter.c:101 commands/subscriptioncmds.c:655 +#: commands/alter.c:98 commands/subscriptioncmds.c:669 #, c-format msgid "subscription \"%s\" already exists" msgstr "la suscripción «%s» ya existe" -#: commands/alter.c:124 +#: commands/alter.c:121 #, c-format msgid "conversion \"%s\" already exists in schema \"%s\"" msgstr "ya existe una conversión llamada «%s» en el esquema «%s»" -#: commands/alter.c:128 +#: commands/alter.c:125 #, c-format msgid "statistics object \"%s\" already exists in schema \"%s\"" msgstr "ya existe un objeto de estadísticas llamado «%s» en el esquema «%s»" -#: commands/alter.c:132 +#: commands/alter.c:129 #, c-format msgid "text search parser \"%s\" already exists in schema \"%s\"" msgstr "el analizador de búsqueda en texto «%s» ya existe en el esquema «%s»" -#: commands/alter.c:136 +#: commands/alter.c:133 #, c-format msgid "text search dictionary \"%s\" already exists in schema \"%s\"" msgstr "el diccionario de búsqueda en texto «%s» ya existe en el esquema «%s»" -#: commands/alter.c:140 +#: commands/alter.c:137 #, c-format msgid "text search template \"%s\" already exists in schema \"%s\"" msgstr "la plantilla de búsqueda en texto «%s» ya existe en el esquema «%s»" -#: commands/alter.c:144 +#: commands/alter.c:141 #, c-format msgid "text search configuration \"%s\" already exists in schema \"%s\"" msgstr "la configuración de búsqueda en texto «%s» ya existe en el esquema «%s»" -#: commands/alter.c:217 +#: commands/alter.c:214 #, c-format msgid "must be superuser to rename %s" msgstr "debe ser superusuario para cambiar el nombre de «%s»" -#: commands/alter.c:259 commands/subscriptioncmds.c:634 -#: commands/subscriptioncmds.c:1114 commands/subscriptioncmds.c:1196 -#: commands/subscriptioncmds.c:1828 +#: commands/alter.c:256 commands/subscriptioncmds.c:648 +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1212 +#: commands/subscriptioncmds.c:1918 #, c-format msgid "password_required=false is superuser-only" -msgstr "" +msgstr "password_required=false es sólo para superusuario" -#: commands/alter.c:260 commands/subscriptioncmds.c:635 -#: commands/subscriptioncmds.c:1115 commands/subscriptioncmds.c:1197 -#: commands/subscriptioncmds.c:1829 +#: commands/alter.c:257 commands/subscriptioncmds.c:649 +#: commands/subscriptioncmds.c:1130 commands/subscriptioncmds.c:1213 +#: commands/subscriptioncmds.c:1919 #, c-format msgid "Subscriptions with the password_required option set to false may only be created or modified by the superuser." -msgstr "" +msgstr "Las suscripciones con la opción password_required puesta en falso sólo pueden ser creadas o modificadas por el superusuario." -#: commands/alter.c:775 +#: commands/alter.c:735 #, c-format msgid "must be superuser to set schema of %s" msgstr "debe ser superusuario para definir el esquema de %s" @@ -6373,7 +6672,7 @@ msgstr "Debe ser superusuario para crear un método de acceso." msgid "access method \"%s\" already exists" msgstr "el método de acceso «%s» ya existe" -#: commands/amcmds.c:154 commands/indexcmds.c:217 commands/indexcmds.c:840 +#: commands/amcmds.c:154 commands/indexcmds.c:224 commands/indexcmds.c:850 #: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" @@ -6384,175 +6683,174 @@ msgstr "no existe el método de acceso «%s»" msgid "handler function is not specified" msgstr "no se ha especificado una función manejadora" -#: commands/amcmds.c:264 commands/event_trigger.c:183 -#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:709 -#: parser/parse_clause.c:941 +#: commands/amcmds.c:264 commands/event_trigger.c:200 +#: commands/foreigncmds.c:489 commands/proclang.c:78 commands/trigger.c:702 +#: parser/parse_clause.c:943 #, c-format msgid "function %s must return type %s" msgstr "la función %s debe retornar el tipo %s" -#: commands/analyze.c:227 +#: commands/analyze.c:217 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "omitiendo «%s»: no se puede analizar esta tabla foránea" -#: commands/analyze.c:244 +#: commands/analyze.c:234 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "omitiendo «%s»: no se pueden analizar objetos que no son tablas, ni tablas especiales de sistema" -#: commands/analyze.c:324 +#: commands/analyze.c:314 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "analizando la jerarquía de herencia «%s.%s»" -#: commands/analyze.c:329 +#: commands/analyze.c:319 #, c-format msgid "analyzing \"%s.%s\"" msgstr "analizando «%s.%s»" -#: commands/analyze.c:394 +#: commands/analyze.c:385 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "la columna «%s» aparece más de una vez en la relación «%s»" -#: commands/analyze.c:786 +#: commands/analyze.c:785 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" msgstr "análisis automático de la tabla «%s.%s.%s»\n" -#: commands/analyze.c:1333 +#: commands/analyze.c:1300 #, c-format msgid "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead rows; %d rows in sample, %.0f estimated total rows" msgstr "«%s»: se procesaron %d de %u páginas, que contenían %.0f filas vigentes y %.0f filas no vigentes; %d filas en la muestra, %.0f total de filas estimadas" -#: commands/analyze.c:1417 +#: commands/analyze.c:1384 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" msgstr "omitiendo el análisis del árbol de herencia «%s.%s» --- este árbol no contiene tablas hijas" -#: commands/analyze.c:1515 +#: commands/analyze.c:1482 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no analyzable child tables" msgstr "omitiendo el análisis del árbol de herencia «%s.%s» --- este árbol no contiene tablas hijas analizables" -#: commands/async.c:646 +#: commands/async.c:612 #, c-format msgid "channel name cannot be empty" msgstr "el nombre de canal no puede ser vacío" -#: commands/async.c:652 +#: commands/async.c:618 #, c-format msgid "channel name too long" msgstr "el nombre de canal es demasiado largo" -#: commands/async.c:657 +#: commands/async.c:623 #, c-format msgid "payload string too long" msgstr "la cadena de carga es demasiado larga" -#: commands/async.c:876 +#: commands/async.c:842 #, c-format msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" msgstr "no se puede hacer PREPARE de una transacción que ha ejecutado LISTEN, UNLISTEN o NOTIFY" -#: commands/async.c:980 +#: commands/async.c:946 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "demasiadas notificaciones en la cola NOTIFY" -#: commands/async.c:1602 +#: commands/async.c:1553 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "la cola NOTIFY está %.0f%% llena" -#: commands/async.c:1604 +#: commands/async.c:1555 #, c-format msgid "The server process with PID %d is among those with the oldest transactions." msgstr "El proceso servidor con PID %d está entre aquellos con transacciones más antiguas." -#: commands/async.c:1607 +#: commands/async.c:1558 #, c-format msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "La cola NOTIFY no puede vaciarse hasta que ese proceso cierre su transacción actual." -#: commands/cluster.c:131 +#: commands/cluster.c:128 #, c-format msgid "unrecognized CLUSTER option \"%s\"" msgstr "opción de CLUSTER «%s» no reconocida" -#: commands/cluster.c:162 commands/cluster.c:435 +#: commands/cluster.c:159 commands/cluster.c:433 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "no se pueden reordenar tablas temporales de otras sesiones" -#: commands/cluster.c:180 +#: commands/cluster.c:177 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "no hay un índice de ordenamiento definido para la tabla «%s»" -#: commands/cluster.c:194 commands/tablecmds.c:14200 commands/tablecmds.c:16043 +#: commands/cluster.c:191 commands/tablecmds.c:14797 commands/tablecmds.c:16729 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "no existe el índice «%s» en la tabla «%s»" -#: commands/cluster.c:424 +#: commands/cluster.c:422 #, c-format msgid "cannot cluster a shared catalog" msgstr "no se puede reordenar un catálogo compartido" -#: commands/cluster.c:439 +#: commands/cluster.c:437 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "no se puede hacer vacuum a tablas temporales de otras sesiones" -#: commands/cluster.c:515 commands/tablecmds.c:16053 +#: commands/cluster.c:513 commands/tablecmds.c:16739 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "«%s» no es un índice de la tabla «%s»" -#: commands/cluster.c:523 +#: commands/cluster.c:521 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "no se puede reordenar en índice «%s» porque el método de acceso no soporta reordenamiento" -#: commands/cluster.c:535 +#: commands/cluster.c:533 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "no se puede reordenar en índice parcial «%s»" -#: commands/cluster.c:549 +#: commands/cluster.c:547 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "no se puede reordenar en el índice no válido «%s»" -#: commands/cluster.c:573 +#: commands/cluster.c:571 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "no se puede marcar un índice «clustered» en una tabla particionada" -#: commands/cluster.c:952 +#: commands/cluster.c:956 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "reordenando «%s.%s» usando un recorrido de índice en «%s»" -#: commands/cluster.c:958 +#: commands/cluster.c:962 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "reordenando «%s.%s» usando un recorrido secuencial y ordenamiento" -#: commands/cluster.c:963 +#: commands/cluster.c:967 #, c-format msgid "vacuuming \"%s.%s\"" msgstr "haciendo vacuum a «%s.%s»" -#: commands/cluster.c:990 -#, fuzzy, c-format -#| msgid "index \"%s\" now contains %.0f row versions in %u pages" +#: commands/cluster.c:994 +#, c-format msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" -msgstr "el índice «%s» ahora contiene %.0f versiones de filas en %u páginas" +msgstr "«%s.%s»: se encontraron %.0f versiones de filas eliminables, %.0f no eliminables en %u páginas" -#: commands/cluster.c:995 +#: commands/cluster.c:999 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -6561,40 +6859,39 @@ msgstr "" "%.0f versiones muertas de filas no pueden ser eliminadas aún.\n" "%s." -#: commands/cluster.c:1728 -#, fuzzy, c-format -#| msgid "permission denied to set role \"%s\"" +#: commands/cluster.c:1744 +#, c-format msgid "permission denied to cluster \"%s\", skipping it" -msgstr "se ha denegado el permiso para definir el rol «%s»" +msgstr "permiso denegado a hacer cluster a «%s», ignorando" -#: commands/collationcmds.c:112 +#: commands/collationcmds.c:110 #, c-format msgid "collation attribute \"%s\" not recognized" msgstr "el atributo de ordenamiento (collation) «%s» no es reconocido" -#: commands/collationcmds.c:125 commands/collationcmds.c:131 -#: commands/define.c:389 commands/tablecmds.c:7876 -#: replication/pgoutput/pgoutput.c:310 replication/pgoutput/pgoutput.c:333 -#: replication/pgoutput/pgoutput.c:347 replication/pgoutput/pgoutput.c:357 -#: replication/pgoutput/pgoutput.c:367 replication/pgoutput/pgoutput.c:377 -#: replication/pgoutput/pgoutput.c:387 replication/walsender.c:996 -#: replication/walsender.c:1018 replication/walsender.c:1028 +#: commands/collationcmds.c:123 commands/collationcmds.c:129 +#: commands/define.c:388 commands/tablecmds.c:8129 +#: replication/pgoutput/pgoutput.c:314 replication/pgoutput/pgoutput.c:337 +#: replication/pgoutput/pgoutput.c:351 replication/pgoutput/pgoutput.c:361 +#: replication/pgoutput/pgoutput.c:371 replication/pgoutput/pgoutput.c:381 +#: replication/pgoutput/pgoutput.c:393 replication/walsender.c:1146 +#: replication/walsender.c:1168 replication/walsender.c:1178 +#: replication/walsender.c:1187 replication/walsender.c:1426 #, c-format msgid "conflicting or redundant options" msgstr "opciones contradictorias o redundantes" -#: commands/collationcmds.c:126 +#: commands/collationcmds.c:124 #, c-format msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." msgstr "LOCALE no puede configurarse junto con LC_COLLATE o LC_CTYPE." -#: commands/collationcmds.c:132 -#, fuzzy, c-format -#| msgid "option \"%s\" cannot be specified with other options" +#: commands/collationcmds.c:130 +#, c-format msgid "FROM cannot be specified together with any other options." -msgstr "la opción «%s» no puede ser especificada con otras opciones" +msgstr "FROM no puede especificarse junto con otras opciones." -#: commands/collationcmds.c:191 +#: commands/collationcmds.c:189 #, c-format msgid "collation \"default\" cannot be copied" msgstr "el ordenamiento «default» no puede copiarse" @@ -6604,435 +6901,364 @@ msgstr "el ordenamiento «default» no puede copiarse" msgid "unrecognized collation provider: %s" msgstr "proveedor de ordenamiento no reconocido: %s" -#: commands/collationcmds.c:253 +#: commands/collationcmds.c:253 commands/collationcmds.c:264 +#: commands/collationcmds.c:270 commands/collationcmds.c:278 #, c-format -msgid "parameter \"lc_collate\" must be specified" -msgstr "debe especificarse el parámetro «lc_collate»" +msgid "parameter \"%s\" must be specified" +msgstr "el parámetro «%s» debe especificarse" -#: commands/collationcmds.c:258 +#: commands/collationcmds.c:293 commands/dbcommands.c:1134 #, c-format -msgid "parameter \"lc_ctype\" must be specified" -msgstr "debe especificarse el parámetro «lc_ctype»" - -#: commands/collationcmds.c:265 -#, fuzzy, c-format -#| msgid "parameter \"lc_collate\" must be specified" -msgid "parameter \"locale\" must be specified" -msgstr "debe especificarse el parámetro «lc_collate»" - -#: commands/collationcmds.c:279 commands/dbcommands.c:1074 -#, fuzzy, c-format -#| msgid "merging definition of column \"%s\" for child \"%s\"" -msgid "using standard form \"%s\" for locale \"%s\"" -msgstr "mezclando la definición de la columna «%s» en la tabla hija «%s»" +msgid "using standard form \"%s\" for ICU locale \"%s\"" +msgstr "usando la forma estándar «%s» para la configuración regional ICU «%s»" -#: commands/collationcmds.c:298 +#: commands/collationcmds.c:312 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "los ordenamientos no determinísticos no están soportados con este proveedor" -#: commands/collationcmds.c:303 commands/dbcommands.c:1093 -#, fuzzy, c-format -#| msgid "ICU locale cannot be specified unless locale provider is ICU" +#: commands/collationcmds.c:317 commands/dbcommands.c:1087 +#, c-format msgid "ICU rules cannot be specified unless locale provider is ICU" -msgstr "no se puede especificar una configuración regional ICU a menos que el proveedor de configuración regional sea ICU" +msgstr "no se pueden especificar reglas ICU a menos que el proveedor de configuración regional sea ICU" -#: commands/collationcmds.c:322 +#: commands/collationcmds.c:340 #, c-format msgid "current database's encoding is not supported with this provider" msgstr "la codificación de la base de datos actual no está soportada con este proveedor" -#: commands/collationcmds.c:382 +#: commands/collationcmds.c:409 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "ya existe un ordenamiento (collation) llamado «%s» para la codificación «%s» en el esquema «%s»" -#: commands/collationcmds.c:393 +#: commands/collationcmds.c:420 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "ya existe un ordenamiento llamado «%s» en el esquema «%s»" -#: commands/collationcmds.c:418 -#, fuzzy, c-format -#| msgid "change the definition of a collation" +#: commands/collationcmds.c:445 +#, c-format msgid "cannot refresh version of default collation" -msgstr "cambia la definición de un ordenamiento" +msgstr "no se puede refrescar la versión del ordenamiento por omisión" -#: commands/collationcmds.c:419 -#, fuzzy, c-format -#| msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." -msgid "Use ALTER DATABASE ... REFRESH COLLATION VERSION instead." -msgstr "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION en su lugar." +#. translator: %s is an SQL command +#. translator: %s is an SQL ALTER command +#: commands/collationcmds.c:447 commands/subscriptioncmds.c:1376 +#: commands/tablecmds.c:7905 commands/tablecmds.c:7915 +#: commands/tablecmds.c:7917 commands/tablecmds.c:14499 +#: commands/tablecmds.c:17884 commands/tablecmds.c:17905 +#: commands/typecmds.c:3787 commands/typecmds.c:3872 commands/typecmds.c:4226 +#, c-format +msgid "Use %s instead." +msgstr "Use %s en su lugar." -#: commands/collationcmds.c:446 commands/dbcommands.c:2447 +#: commands/collationcmds.c:480 commands/dbcommands.c:2566 #, c-format msgid "changing version from %s to %s" msgstr "cambiando versión de %s a %s" -#: commands/collationcmds.c:461 commands/dbcommands.c:2460 +#: commands/collationcmds.c:495 commands/dbcommands.c:2579 #, c-format msgid "version has not changed" msgstr "la versión no ha cambiado" -#: commands/collationcmds.c:493 commands/dbcommands.c:2626 +#: commands/collationcmds.c:528 commands/dbcommands.c:2749 #, c-format msgid "database with OID %u does not exist" msgstr "no existe la base de datos con OID %u" -#: commands/collationcmds.c:513 +#: commands/collationcmds.c:554 #, c-format msgid "collation with OID %u does not exist" msgstr "no existe el ordenamiento (collation) con OID %u" -#: commands/collationcmds.c:803 +#: commands/collationcmds.c:848 #, c-format msgid "must be superuser to import system collations" msgstr "debe ser superusuario para importar ordenamientos del sistema" -#: commands/collationcmds.c:831 commands/copyfrom.c:1653 commands/copyto.c:656 -#: libpq/be-secure-common.c:59 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "no se pudo ejecutar la orden «%s»: %m" - -#: commands/collationcmds.c:923 commands/collationcmds.c:1008 +#: commands/collationcmds.c:968 commands/collationcmds.c:1053 #, c-format msgid "no usable system locales were found" msgstr "no se encontraron locales de sistema utilizables" -#: commands/comment.c:61 commands/dbcommands.c:1594 commands/dbcommands.c:1791 -#: commands/dbcommands.c:1901 commands/dbcommands.c:2099 -#: commands/dbcommands.c:2337 commands/dbcommands.c:2420 -#: commands/dbcommands.c:2530 commands/dbcommands.c:3030 -#: utils/init/postinit.c:1025 utils/init/postinit.c:1130 -#: utils/init/postinit.c:1147 +#: commands/comment.c:61 commands/dbcommands.c:1665 commands/dbcommands.c:1883 +#: commands/dbcommands.c:1995 commands/dbcommands.c:2193 +#: commands/dbcommands.c:2433 commands/dbcommands.c:2526 +#: commands/dbcommands.c:2650 commands/dbcommands.c:3161 +#: utils/init/postinit.c:1034 utils/init/postinit.c:1098 +#: utils/init/postinit.c:1171 #, c-format msgid "database \"%s\" does not exist" msgstr "no existe la base de datos «%s»" #: commands/comment.c:101 -#, fuzzy, c-format -#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +#, c-format msgid "cannot set comment on relation \"%s\"" -msgstr "no se puede modificar la restricción «%s» en la relación «%s»" +msgstr "no se puede definir comentario en la relación «%s»" -#: commands/constraint.c:63 utils/adt/ri_triggers.c:2028 +#: commands/constraint.c:61 utils/adt/ri_triggers.c:2019 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "la función «%s» no fue ejecutada por el manejador de triggers" -#: commands/constraint.c:70 utils/adt/ri_triggers.c:2037 +#: commands/constraint.c:68 utils/adt/ri_triggers.c:2028 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "la función «%s» debe ser ejecutada AFTER ROW" -#: commands/constraint.c:84 +#: commands/constraint.c:82 #, c-format msgid "function \"%s\" must be fired for INSERT or UPDATE" msgstr "la función «%s» debe ser ejecutada en INSERT o UPDATE" -#: commands/conversioncmds.c:69 +#: commands/conversioncmds.c:62 #, c-format msgid "source encoding \"%s\" does not exist" msgstr "no existe la codificación fuente «%s»" -#: commands/conversioncmds.c:76 +#: commands/conversioncmds.c:69 #, c-format msgid "destination encoding \"%s\" does not exist" msgstr "no existe la codificación de destino «%s»" -#: commands/conversioncmds.c:89 +#: commands/conversioncmds.c:82 #, c-format msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" msgstr "la conversión de codificación desde o hacia a «SQL_ASCII» no está soportada" -#: commands/conversioncmds.c:102 +#: commands/conversioncmds.c:95 #, c-format msgid "encoding conversion function %s must return type %s" msgstr "la función de conversión de codificación %s debe retornar tipo %s" -#: commands/conversioncmds.c:132 +#: commands/conversioncmds.c:125 #, c-format msgid "encoding conversion function %s returned incorrect result for empty input" msgstr "la función de conversión de codificación %s retornó un resultado incorrecto para una entrada vacía" -#: commands/copy.c:86 -#, fuzzy, c-format -#| msgid "permission denied to create role" +#: commands/copy.c:84 +#, c-format msgid "permission denied to COPY to or from an external program" -msgstr "se ha denegado el permiso para crear el rol" +msgstr "se ha denegado el permiso para hacer COPY hacia o desde un programa externo" -#: commands/copy.c:87 +#: commands/copy.c:85 #, c-format msgid "Only roles with privileges of the \"%s\" role may COPY to or from an external program." -msgstr "" +msgstr "Sólo los roles con privilegios del rol «%s» pueden hacer COPY desde o hacia un programa externo." -#: commands/copy.c:89 commands/copy.c:100 commands/copy.c:109 +#: commands/copy.c:87 commands/copy.c:98 commands/copy.c:107 #, c-format msgid "Anyone can COPY to stdout or from stdin. psql's \\copy command also works for anyone." msgstr "Cualquier usuario puede usar COPY hacia la salida estándar o desde la entrada estándar. La orden \\copy de psql también puede ser utilizado por cualquier usuario." -#: commands/copy.c:97 -#, fuzzy, c-format -#| msgid "permission denied to drop role" +#: commands/copy.c:95 +#, c-format msgid "permission denied to COPY from a file" -msgstr "se ha denegado el permiso para eliminar el rol" +msgstr "se ha denegado el permiso para hacer COPY desde un archivo" -#: commands/copy.c:98 +#: commands/copy.c:96 #, c-format msgid "Only roles with privileges of the \"%s\" role may COPY from a file." -msgstr "" +msgstr "Sólo los roles con privilegios del rol «%s» pueden hacer COPY desde un archivo." -#: commands/copy.c:106 -#, fuzzy, c-format -#| msgid "permission denied to drop role" +#: commands/copy.c:104 +#, c-format msgid "permission denied to COPY to a file" -msgstr "se ha denegado el permiso para eliminar el rol" +msgstr "se ha denegado el permiso para hacer COPY a un archivo" -#: commands/copy.c:107 +#: commands/copy.c:105 #, c-format msgid "Only roles with privileges of the \"%s\" role may COPY to a file." -msgstr "" +msgstr "Sólo los roles con privilegios del rol «%s» pueden hacer COPY hacia un archivo." -#: commands/copy.c:195 +#: commands/copy.c:193 #, c-format msgid "COPY FROM not supported with row-level security" msgstr "COPY FROM no está soportado con seguridad a nivel de registros" -#: commands/copy.c:196 +#: commands/copy.c:194 #, c-format msgid "Use INSERT statements instead." msgstr "Use sentencias INSERT en su lugar." -#: commands/copy.c:290 -#, fuzzy, c-format -#| msgid "\"EEEE\" not supported for input" -msgid "MERGE not supported in COPY" -msgstr "«EEEE» no está soportado en la entrada" - -#: commands/copy.c:383 +#: commands/copy.c:375 #, c-format msgid "cannot use \"%s\" with HEADER in COPY TO" msgstr "no se puede usar «%s» con HEADER en COPY TO" -#: commands/copy.c:392 -#, fuzzy, c-format -#| msgid "%s requires a Boolean value" +#: commands/copy.c:384 +#, c-format msgid "%s requires a Boolean value or \"match\"" -msgstr "«%s» requiere un valor lógico (booleano)" +msgstr "«%s» requiere un valor lógico (booleano) o «match»" -#: commands/copy.c:451 +#. translator: first %s is the name of a COPY option, e.g. ON_ERROR, +#. second %s is a COPY with direction, e.g. COPY TO +#: commands/copy.c:402 commands/copy.c:782 commands/copy.c:798 +#: commands/copy.c:815 commands/copy.c:841 commands/copy.c:851 +#, c-format +msgid "COPY %s cannot be used with %s" +msgstr "COPY %s no puede usarse con %s" + +#. translator: first %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:416 commands/copy.c:441 +#, c-format +msgid "COPY %s \"%s\" not recognized" +msgstr "no se reconoce el valor «%2$s» para COPY %1$s" + +#: commands/copy.c:502 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "el formato de COPY «%s» no es reconocido" -#: commands/copy.c:509 commands/copy.c:522 commands/copy.c:535 -#: commands/copy.c:554 +#: commands/copy.c:560 commands/copy.c:575 commands/copy.c:590 +#: commands/copy.c:609 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "el argumento de la opción «%s» debe ser una lista de nombres de columna" -#: commands/copy.c:566 +#: commands/copy.c:621 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "el argumento de la opción «%s» debe ser un nombre válido de codificación" -#: commands/copy.c:573 commands/dbcommands.c:859 commands/dbcommands.c:2285 +#: commands/copy.c:642 commands/dbcommands.c:866 commands/dbcommands.c:2381 #, c-format msgid "option \"%s\" not recognized" msgstr "no se reconoce la opción «%s»" -#: commands/copy.c:585 +#. translator: %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:655 commands/copy.c:660 commands/copy.c:665 +#: commands/copy.c:740 #, c-format -msgid "cannot specify DELIMITER in BINARY mode" -msgstr "no se puede especificar DELIMITER en modo BINARY" +msgid "cannot specify %s in BINARY mode" +msgstr "no se puede especificar %s en modo BINARY" -#: commands/copy.c:590 +#: commands/copy.c:670 #, c-format -msgid "cannot specify NULL in BINARY mode" -msgstr "no se puede especificar NULL en modo BINARY" - -#: commands/copy.c:595 -#, fuzzy, c-format -#| msgid "cannot specify NULL in BINARY mode" -msgid "cannot specify DEFAULT in BINARY mode" -msgstr "no se puede especificar NULL en modo BINARY" +msgid "only ON_ERROR STOP is allowed in BINARY mode" +msgstr "sólo ON ERROR STOP es permitido en modo BINARY" -#: commands/copy.c:617 +#: commands/copy.c:692 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "el delimitador de COPY debe ser un solo carácter de un byte" -#: commands/copy.c:624 +#: commands/copy.c:699 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "el delimitador de COPY no puede ser el carácter de nueva línea ni el de retorno de carro" -#: commands/copy.c:630 +#: commands/copy.c:705 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "la representación de null de COPY no puede usar el carácter de nueva línea ni el de retorno de carro" -#: commands/copy.c:640 -#, fuzzy, c-format -#| msgid "COPY null representation cannot use newline or carriage return" +#: commands/copy.c:715 +#, c-format msgid "COPY default representation cannot use newline or carriage return" -msgstr "la representación de null de COPY no puede usar el carácter de nueva línea ni el de retorno de carro" +msgstr "la representación de default de COPY no puede usar el carácter de nueva línea ni el de retorno de carro" -#: commands/copy.c:658 +#: commands/copy.c:733 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "el delimitador de COPY no puede ser «%s»" -#: commands/copy.c:664 -#, fuzzy, c-format -#| msgid "cannot specify DELIMITER in BINARY mode" -msgid "cannot specify HEADER in BINARY mode" -msgstr "no se puede especificar DELIMITER en modo BINARY" - -#: commands/copy.c:670 +#. translator: %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:747 commands/copy.c:764 commands/copy.c:776 +#: commands/copy.c:791 commands/copy.c:807 #, c-format -msgid "COPY quote available only in CSV mode" -msgstr "el «quote» de COPY está disponible sólo en modo CSV" +msgid "COPY %s requires CSV mode" +msgstr "COPY %s requiere modo CSV" -#: commands/copy.c:675 +#: commands/copy.c:752 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "la comilla («quote») de COPY debe ser un solo carácter de un byte" -#: commands/copy.c:680 +#: commands/copy.c:757 #, c-format msgid "COPY delimiter and quote must be different" msgstr "el delimitador de COPY y la comilla («quote») deben ser diferentes" -#: commands/copy.c:686 -#, c-format -msgid "COPY escape available only in CSV mode" -msgstr "escape de COPY disponible sólo en modo CSV" - -#: commands/copy.c:691 +#: commands/copy.c:769 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "el escape de COPY debe ser un sólo carácter de un byte" -#: commands/copy.c:697 +#. translator: %s is the name of a COPY option, e.g. NULL +#: commands/copy.c:823 commands/copy.c:859 #, c-format -msgid "COPY force quote available only in CSV mode" -msgstr "el forzado de comillas de COPY sólo está disponible en modo CSV" +msgid "COPY delimiter character must not appear in the %s specification" +msgstr "el carácter delimitador de COPY no debe aparecer en la especificación %s" -#: commands/copy.c:701 +#. translator: %s is the name of a COPY option, e.g. NULL +#: commands/copy.c:832 commands/copy.c:868 #, c-format -msgid "COPY force quote only available using COPY TO" -msgstr "el forzado de comillas de COPY sólo está disponible en COPY TO" +msgid "CSV quote character must not appear in the %s specification" +msgstr "el carácter de «quote» de CSV no debe aparecer en la especificación %s" -#: commands/copy.c:707 +#: commands/copy.c:877 #, c-format -msgid "COPY force not null available only in CSV mode" -msgstr "el forzado de no nulos en COPY sólo está disponible en modo CSV" +msgid "NULL specification and DEFAULT specification cannot be the same" +msgstr "las especificaciones NULL y DEFAULT no pueden ser la misma" -#: commands/copy.c:711 +#: commands/copy.c:939 #, c-format -msgid "COPY force not null only available using COPY FROM" -msgstr "el forzado de no nulos en COPY sólo está disponible usando COPY FROM" +msgid "column \"%s\" is a generated column" +msgstr "la columna «%s» es una columna generada" -#: commands/copy.c:717 -#, c-format -msgid "COPY force null available only in CSV mode" -msgstr "el forzado de nulos en COPY sólo está disponible en modo CSV" - -#: commands/copy.c:722 -#, c-format -msgid "COPY force null only available using COPY FROM" -msgstr "el forzado de nulos en COPY sólo está disponible usando COPY FROM" - -#: commands/copy.c:728 -#, c-format -msgid "COPY delimiter must not appear in the NULL specification" -msgstr "el delimitador de COPY no debe aparecer en la especificación NULL" - -#: commands/copy.c:735 -#, c-format -msgid "CSV quote character must not appear in the NULL specification" -msgstr "el carácter de «quote» de CSV no debe aparecer en la especificación NULL" - -#: commands/copy.c:742 -#, fuzzy, c-format -#| msgid "COPY force null only available using COPY FROM" -msgid "COPY DEFAULT only available using COPY FROM" -msgstr "el forzado de nulos en COPY sólo está disponible usando COPY FROM" - -#: commands/copy.c:748 -#, fuzzy, c-format -#| msgid "COPY delimiter must not appear in the NULL specification" -msgid "COPY delimiter must not appear in the DEFAULT specification" -msgstr "el delimitador de COPY no debe aparecer en la especificación NULL" - -#: commands/copy.c:755 -#, fuzzy, c-format -#| msgid "CSV quote character must not appear in the NULL specification" -msgid "CSV quote character must not appear in the DEFAULT specification" -msgstr "el carácter de «quote» de CSV no debe aparecer en la especificación NULL" - -#: commands/copy.c:763 -#, c-format -msgid "NULL specification and DEFAULT specification cannot be the same" -msgstr "" - -#: commands/copy.c:825 -#, c-format -msgid "column \"%s\" is a generated column" -msgstr "la columna «%s» es una columna generada" - -#: commands/copy.c:827 +#: commands/copy.c:941 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "Las columnas generadas no pueden usarse en COPY." -#: commands/copy.c:842 commands/indexcmds.c:1894 commands/statscmds.c:242 -#: commands/tablecmds.c:2405 commands/tablecmds.c:3127 -#: commands/tablecmds.c:3626 parser/parse_relation.c:3688 -#: parser/parse_relation.c:3698 parser/parse_relation.c:3716 -#: parser/parse_relation.c:3723 parser/parse_relation.c:3737 -#: utils/adt/tsvector_op.c:2855 +#: commands/copy.c:956 commands/indexcmds.c:1890 commands/statscmds.c:239 +#: commands/tablecmds.c:2526 commands/tablecmds.c:2997 +#: commands/tablecmds.c:3808 parser/parse_relation.c:3692 +#: parser/parse_relation.c:3702 parser/parse_relation.c:3720 +#: parser/parse_relation.c:3727 parser/parse_relation.c:3741 +#: utils/adt/tsvector_op.c:2853 #, c-format msgid "column \"%s\" does not exist" msgstr "no existe la columna «%s»" -#: commands/copy.c:849 commands/tablecmds.c:2431 commands/trigger.c:958 -#: parser/parse_target.c:1070 parser/parse_target.c:1081 +#: commands/copy.c:963 commands/tablecmds.c:2552 commands/trigger.c:951 +#: parser/parse_target.c:1083 parser/parse_target.c:1094 #, c-format msgid "column \"%s\" specified more than once" msgstr "la columna «%s» fue especificada más de una vez" -#: commands/copyfrom.c:122 +#: commands/copyfrom.c:118 #, c-format msgid "COPY %s" -msgstr "" +msgstr "COPY %s" -#: commands/copyfrom.c:130 +#: commands/copyfrom.c:126 #, c-format msgid "COPY %s, line %llu, column %s" -msgstr "" +msgstr "COPY %s, línea %llu, columna %s" -#: commands/copyfrom.c:135 commands/copyfrom.c:181 +#: commands/copyfrom.c:131 commands/copyfrom.c:177 #, c-format msgid "COPY %s, line %llu" -msgstr "" +msgstr "COPY %s, línea %llu" -#: commands/copyfrom.c:147 +#: commands/copyfrom.c:143 #, c-format msgid "COPY %s, line %llu, column %s: \"%s\"" -msgstr "" +msgstr "COPY %s, línea %llu, columna %s: «%s»" -#: commands/copyfrom.c:157 +#: commands/copyfrom.c:153 #, c-format msgid "COPY %s, line %llu, column %s: null input" -msgstr "" +msgstr "COPY %s, línea %llu, columna %s: entrada nula" -#: commands/copyfrom.c:174 +#: commands/copyfrom.c:170 #, c-format msgid "COPY %s, line %llu: \"%s\"" -msgstr "" +msgstr "COPY %s, línea %llu: «%s»" #: commands/copyfrom.c:673 #, c-format @@ -7042,7 +7268,7 @@ msgstr "no se puede copiar hacia la vista «%s»" #: commands/copyfrom.c:675 #, c-format msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." -msgstr "Para posibilitar «copy» a una vista, provea un disparador INSTEAD OF INSERT." +msgstr "Para posibilitar «copy» a una vista, provea un “trigger†INSTEAD OF INSERT." #: commands/copyfrom.c:679 #, c-format @@ -7074,32 +7300,41 @@ msgstr "no se puede ejecutar COPY FREEZE debido a actividad anterior en la trans msgid "cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction" msgstr "no se puede ejecutar COPY FREEZE porque la tabla no fue creada ni truncada en la subtransacción en curso" -#: commands/copyfrom.c:1411 +#: commands/copyfrom.c:1313 #, c-format -msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" -msgstr "la columna FORCE_NOT_NULL «%s» no es referenciada en COPY" +msgid "%llu row was skipped due to data type incompatibility" +msgid_plural "%llu rows were skipped due to data type incompatibility" +msgstr[0] "%llu fila fue ignorada por incompatibilidad de tipo de dato" +msgstr[1] "%llu filas fueron ignoradas por incompatibilidad de tipo de dato" -#: commands/copyfrom.c:1434 +#. translator: first %s is the name of a COPY option, e.g. FORCE_NOT_NULL +#. translator: %s is the name of a COPY option, e.g. FORCE_NOT_NULL +#: commands/copyfrom.c:1448 commands/copyfrom.c:1491 commands/copyto.c:601 #, c-format -msgid "FORCE_NULL column \"%s\" not referenced by COPY" -msgstr "la columna FORCE_NULL «%s» no es referenciada en COPY" +msgid "%s column \"%s\" not referenced by COPY" +msgstr "la columna %s «%s» no es referenciada en COPY" -#: commands/copyfrom.c:1672 +#: commands/copyfrom.c:1544 utils/mb/mbutils.c:385 +#, c-format +msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" +msgstr "no existe el procedimiento por omisión de conversión desde la codificación «%s» a «%s»" + +#: commands/copyfrom.c:1742 #, c-format msgid "COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \\copy." msgstr "COPY FROM indica al proceso servidor de PostgreSQL leer un archivo. Puede desear usar una facilidad del lado del cliente como \\copy de psql." -#: commands/copyfrom.c:1685 commands/copyto.c:708 +#: commands/copyfrom.c:1755 commands/copyto.c:706 #, c-format msgid "\"%s\" is a directory" msgstr "«%s» es un directorio" -#: commands/copyfrom.c:1753 commands/copyto.c:306 libpq/be-secure-common.c:83 +#: commands/copyfrom.c:1823 commands/copyto.c:299 libpq/be-secure-common.c:83 #, c-format msgid "could not close pipe to external command: %m" msgstr "no se pudo cerrar la tubería a la orden externa: %m" -#: commands/copyfrom.c:1768 commands/copyto.c:311 +#: commands/copyfrom.c:1838 commands/copyto.c:304 #, c-format msgid "program \"%s\" failed" msgstr "el programa «%s» falló" @@ -7140,26 +7375,25 @@ msgid "could not read from COPY file: %m" msgstr "no se pudo leer desde archivo COPY: %m" #: commands/copyfromparse.c:278 commands/copyfromparse.c:303 -#: tcop/postgres.c:377 +#: replication/walsender.c:756 replication/walsender.c:782 tcop/postgres.c:381 #, c-format msgid "unexpected EOF on client connection with an open transaction" msgstr "se encontró fin de archivo inesperado en una conexión con una transacción abierta" -#: commands/copyfromparse.c:294 +#: commands/copyfromparse.c:294 replication/walsender.c:772 #, c-format msgid "unexpected message type 0x%02X during COPY from stdin" msgstr "se recibió un mensaje de tipo 0x%02X inesperado durante COPY desde la entrada estándar" -#: commands/copyfromparse.c:317 +#: commands/copyfromparse.c:317 replication/walsender.c:803 #, c-format msgid "COPY from stdin failed: %s" msgstr "falló COPY desde la entrada estándar: %s" #: commands/copyfromparse.c:785 -#, fuzzy, c-format -#| msgid "wrong number of columns: %d, expected %d" +#, c-format msgid "wrong number of fields in header line: got %d, expected %d" -msgstr "número de columnas erróneo: %d, se esperaban %d" +msgstr "número de campos en línea de cabecera erróneo: %d, se esperaban %d" #: commands/copyfromparse.c:801 #, c-format @@ -7171,8 +7405,8 @@ msgstr "discordancia de nombre de columna en campo %d de la línea de encabezado msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" msgstr "discordancia en nombre de columna en campo %d de la línea de encabezado: se obtuvo «%s», se esperaba «%s»" -#: commands/copyfromparse.c:892 commands/copyfromparse.c:1514 -#: commands/copyfromparse.c:1770 +#: commands/copyfromparse.c:892 commands/copyfromparse.c:1554 +#: commands/copyfromparse.c:1810 #, c-format msgid "extra data after last expected column" msgstr "datos extra después de la última columna esperada" @@ -7182,1126 +7416,1177 @@ msgstr "datos extra después de la última columna esperada" msgid "missing data for column \"%s\"" msgstr "faltan datos en la columna «%s»" -#: commands/copyfromparse.c:999 +#: commands/copyfromparse.c:990 +#, c-format +msgid "skipping row due to data type incompatibility at line %llu for column \"%s\": \"%s\"" +msgstr "omitiendo fila debido a incompatibilidad de tipo en la línea %llu para la columna «%s»: «%s»" + +#: commands/copyfromparse.c:998 +#, c-format +msgid "skipping row due to data type incompatibility at line %llu for column \"%s\": null input" +msgstr "omitiendo fila debido a incompatibilidad de tipo en la línea %llu para la columna «%s»: entrada nula" + +#: commands/copyfromparse.c:1044 #, c-format msgid "received copy data after EOF marker" msgstr "se recibieron datos de copy después del marcador EOF" -#: commands/copyfromparse.c:1006 +#: commands/copyfromparse.c:1051 #, c-format msgid "row field count is %d, expected %d" msgstr "la cantidad de registros es %d, pero se esperaban %d" -#: commands/copyfromparse.c:1296 commands/copyfromparse.c:1313 +#: commands/copyfromparse.c:1336 commands/copyfromparse.c:1353 #, c-format msgid "literal carriage return found in data" msgstr "se encontró un retorno de carro literal en los datos" -#: commands/copyfromparse.c:1297 commands/copyfromparse.c:1314 +#: commands/copyfromparse.c:1337 commands/copyfromparse.c:1354 #, c-format msgid "unquoted carriage return found in data" msgstr "se encontró un retorno de carro fuera de comillas en los datos" -#: commands/copyfromparse.c:1299 commands/copyfromparse.c:1316 +#: commands/copyfromparse.c:1339 commands/copyfromparse.c:1356 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "Use «\\r» para representar el retorno de carro." -#: commands/copyfromparse.c:1300 commands/copyfromparse.c:1317 +#: commands/copyfromparse.c:1340 commands/copyfromparse.c:1357 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "Use un campo CSV entre comillas para representar el retorno de carro." -#: commands/copyfromparse.c:1329 +#: commands/copyfromparse.c:1369 #, c-format msgid "literal newline found in data" msgstr "se encontró un salto de línea literal en los datos" -#: commands/copyfromparse.c:1330 +#: commands/copyfromparse.c:1370 #, c-format msgid "unquoted newline found in data" msgstr "se encontró un salto de línea fuera de comillas en los datos" -#: commands/copyfromparse.c:1332 +#: commands/copyfromparse.c:1372 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "Use «\\n» para representar un salto de línea." -#: commands/copyfromparse.c:1333 +#: commands/copyfromparse.c:1373 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "Use un campo CSV entre comillas para representar un salto de línea." -#: commands/copyfromparse.c:1379 commands/copyfromparse.c:1415 +#: commands/copyfromparse.c:1419 commands/copyfromparse.c:1455 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "el marcador fin-de-copy no coincide con el estilo previo de salto de línea" -#: commands/copyfromparse.c:1388 commands/copyfromparse.c:1404 +#: commands/copyfromparse.c:1428 commands/copyfromparse.c:1444 #, c-format msgid "end-of-copy marker corrupt" msgstr "marcador fin-de-copy corrupto" -#: commands/copyfromparse.c:1706 commands/copyfromparse.c:1921 -#, fuzzy, c-format -#| msgid "unexpected EOF in COPY data" -msgid "unexpected DEFAULT in COPY data" -msgstr "EOF inesperado en datos de COPY" +#: commands/copyfromparse.c:1746 commands/copyfromparse.c:1961 +#, c-format +msgid "unexpected default marker in COPY data" +msgstr "marcador “default†inesperado en datos de COPY" -#: commands/copyfromparse.c:1707 commands/copyfromparse.c:1922 -#, fuzzy, c-format -#| msgid "column \"%s\" can only be updated to DEFAULT" -msgid "Column \"%s\" has no DEFAULT value." -msgstr "la columna «%s» sólo puede actualizarse a DEFAULT" +#: commands/copyfromparse.c:1747 commands/copyfromparse.c:1962 +#, c-format +msgid "Column \"%s\" has no default value." +msgstr "La columna «%s» no tiene valor por omisión." -#: commands/copyfromparse.c:1854 +#: commands/copyfromparse.c:1894 #, c-format msgid "unterminated CSV quoted field" msgstr "un valor entre comillas está inconcluso" -#: commands/copyfromparse.c:1956 commands/copyfromparse.c:1975 +#: commands/copyfromparse.c:1996 commands/copyfromparse.c:2015 #, c-format msgid "unexpected EOF in COPY data" msgstr "EOF inesperado en datos de COPY" -#: commands/copyfromparse.c:1965 +#: commands/copyfromparse.c:2005 #, c-format msgid "invalid field size" msgstr "el tamaño de campo no es válido" -#: commands/copyfromparse.c:1988 +#: commands/copyfromparse.c:2028 #, c-format msgid "incorrect binary data format" msgstr "el formato de datos binarios es incorrecto" -#: commands/copyto.c:236 +#: commands/copyto.c:229 #, c-format msgid "could not write to COPY program: %m" msgstr "no se pudo escribir al programa COPY: %m" -#: commands/copyto.c:241 +#: commands/copyto.c:234 #, c-format msgid "could not write to COPY file: %m" msgstr "no se pudo escribir archivo COPY: %m" -#: commands/copyto.c:386 +#: commands/copyto.c:379 #, c-format msgid "cannot copy from view \"%s\"" msgstr "no se puede copiar desde la vista «%s»" -#: commands/copyto.c:388 commands/copyto.c:394 commands/copyto.c:400 -#: commands/copyto.c:411 +#: commands/copyto.c:381 commands/copyto.c:387 commands/copyto.c:393 +#: commands/copyto.c:404 #, c-format msgid "Try the COPY (SELECT ...) TO variant." msgstr "Intente la forma COPY (SELECT ...) TO." -#: commands/copyto.c:392 +#: commands/copyto.c:385 #, c-format msgid "cannot copy from materialized view \"%s\"" msgstr "no se puede copiar desde la vista materializada «%s»" -#: commands/copyto.c:398 +#: commands/copyto.c:391 #, c-format msgid "cannot copy from foreign table \"%s\"" msgstr "no se puede copiar desde la tabla foránea «%s»" -#: commands/copyto.c:404 +#: commands/copyto.c:397 #, c-format msgid "cannot copy from sequence \"%s\"" msgstr "no se puede copiar desde la secuencia «%s»" -#: commands/copyto.c:409 +#: commands/copyto.c:402 #, c-format msgid "cannot copy from partitioned table \"%s\"" msgstr "no se puede hacer copy de la tabla particionada «%s»" -#: commands/copyto.c:415 +#: commands/copyto.c:408 #, c-format msgid "cannot copy from non-table relation \"%s\"" msgstr "no se puede copiar desde la relación «%s» porque no es una tabla" -#: commands/copyto.c:467 +#: commands/copyto.c:460 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for COPY" msgstr "las reglas DO INSTEAD NOTHING no están soportadas para COPY" -#: commands/copyto.c:481 +#: commands/copyto.c:474 #, c-format msgid "conditional DO INSTEAD rules are not supported for COPY" msgstr "las reglas DO INSTEAD condicionales no están soportadas para COPY" -#: commands/copyto.c:485 +#: commands/copyto.c:478 #, c-format -msgid "DO ALSO rules are not supported for the COPY" +msgid "DO ALSO rules are not supported for COPY" msgstr "las reglas DO ALSO no están soportadas para COPY" -#: commands/copyto.c:490 +#: commands/copyto.c:483 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for COPY" msgstr "las reglas DO INSTEAD de múltiples sentencias no están soportadas para COPY" -#: commands/copyto.c:500 +#: commands/copyto.c:493 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO) no está soportado" -#: commands/copyto.c:517 +#: commands/copyto.c:499 +#, c-format +msgid "COPY query must not be a utility command" +msgstr "la consulta COPY no debe ser una orden de utilidad" + +#: commands/copyto.c:515 #, c-format msgid "COPY query must have a RETURNING clause" msgstr "la consulta COPY debe tener una cláusula RETURNING" -#: commands/copyto.c:546 +#: commands/copyto.c:544 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "la relación referenciada por la sentencia COPY ha cambiado" -#: commands/copyto.c:605 -#, c-format -msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" -msgstr "la columna FORCE_QUOTE «%s» no es referenciada en COPY" - -#: commands/copyto.c:673 +#: commands/copyto.c:671 #, c-format msgid "relative path not allowed for COPY to file" msgstr "no se permiten rutas relativas para COPY hacia un archivo" -#: commands/copyto.c:692 +#: commands/copyto.c:690 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "no se pudo abrir el archivo «%s» para escritura: %m" -#: commands/copyto.c:695 +#: commands/copyto.c:693 #, c-format msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." msgstr "COPY TO indica al proceso servidor PostgreSQL escribir a un archivo. Puede desear usar facilidades del lado del cliente, como \\copy de psql." -#: commands/createas.c:215 commands/createas.c:523 +#: commands/createas.c:210 commands/createas.c:516 #, c-format msgid "too many column names were specified" msgstr "se especificaron demasiados nombres de columna" -#: commands/createas.c:546 +#: commands/createas.c:539 #, c-format msgid "policies not yet implemented for this command" msgstr "las políticas no están implementadas para esta orden" -#: commands/dbcommands.c:822 +#: commands/dbcommands.c:829 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION ya no está soportado" -#: commands/dbcommands.c:823 +#: commands/dbcommands.c:830 #, c-format msgid "Consider using tablespaces instead." msgstr "Considere usar tablespaces." -#: commands/dbcommands.c:848 +#: commands/dbcommands.c:855 #, c-format msgid "OIDs less than %u are reserved for system objects" msgstr "los OIDs menores que %u están reservados para objetos del sistema" -#: commands/dbcommands.c:879 utils/adt/ascii.c:146 +#: commands/dbcommands.c:886 utils/adt/ascii.c:146 #, c-format msgid "%d is not a valid encoding code" msgstr "%d no es un código válido de codificación" -#: commands/dbcommands.c:890 utils/adt/ascii.c:128 +#: commands/dbcommands.c:897 utils/adt/ascii.c:128 #, c-format msgid "%s is not a valid encoding name" msgstr "%s no es un nombre válido de codificación" -#: commands/dbcommands.c:919 +#: commands/dbcommands.c:931 #, c-format msgid "unrecognized locale provider: %s" msgstr "proveedor de ordenamiento no reconocido: %s" -#: commands/dbcommands.c:932 commands/dbcommands.c:2318 commands/user.c:300 -#: commands/user.c:740 +#: commands/dbcommands.c:944 commands/dbcommands.c:2414 commands/user.c:299 +#: commands/user.c:739 #, c-format msgid "invalid connection limit: %d" msgstr "límite de conexión no válido: %d" -#: commands/dbcommands.c:953 +#: commands/dbcommands.c:965 #, c-format msgid "permission denied to create database" msgstr "se ha denegado el permiso para crear la base de datos" -#: commands/dbcommands.c:977 +#: commands/dbcommands.c:989 #, c-format msgid "template database \"%s\" does not exist" msgstr "no existe la base de datos patrón «%s»" -#: commands/dbcommands.c:989 +#: commands/dbcommands.c:999 +#, c-format +msgid "cannot use invalid database \"%s\" as template" +msgstr "no se puede usar la base de datos «%s» no válida como plantilla" + +#: commands/dbcommands.c:1000 commands/dbcommands.c:2444 +#: utils/init/postinit.c:1113 +#, c-format +msgid "Use DROP DATABASE to drop invalid databases." +msgstr "Use DROP DATABASE para eliminar una base de datos no válida." + +#: commands/dbcommands.c:1011 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "se ha denegado el permiso para copiar la base de datos «%s»" -#: commands/dbcommands.c:1006 -#, fuzzy, c-format -#| msgid "invalid parameter list format: \"%s\"" +#: commands/dbcommands.c:1028 +#, c-format msgid "invalid create database strategy \"%s\"" -msgstr "el formato de la lista de parámetros no es válido: «%s»" +msgstr "estrategia de creación de base de dato no válida: «%s»" -#: commands/dbcommands.c:1007 -#, fuzzy, c-format -#| msgid "Valid values are \"local\" and \"cascaded\"." -msgid "Valid strategies are \"wal_log\", and \"file_copy\"." -msgstr "Los valores aceptables son «local» y «cascaded»." +#: commands/dbcommands.c:1029 +#, c-format +msgid "Valid strategies are \"wal_log\" and \"file_copy\"." +msgstr "Las estrategias válidas son «wal_log» y «file_copy»." -#: commands/dbcommands.c:1028 +#: commands/dbcommands.c:1050 #, c-format msgid "invalid server encoding %d" msgstr "la codificación de servidor %d no es válida" -#: commands/dbcommands.c:1034 commands/dbcommands.c:1039 +#: commands/dbcommands.c:1056 #, c-format -msgid "invalid locale name: \"%s\"" -msgstr "nombre de configuración regional no válido: «%s»" +msgid "invalid LC_COLLATE locale name: \"%s\"" +msgstr "nombre de configuración regional LC_COLLATE no válido: «%s»" -#: commands/dbcommands.c:1049 -#, fuzzy, c-format -#| msgid "encoding \"%s\" not supported by ICU" -msgid "encoding \"%s\" is not supported with ICU provider" -msgstr "la codificación «%s» no estæ soportada por ICU" +#: commands/dbcommands.c:1057 commands/dbcommands.c:1063 +#, c-format +msgid "If the locale name is specific to ICU, use ICU_LOCALE." +msgstr "Si el nombre de configuración regional es específico a ICU, use ICU_LOCALE." + +#: commands/dbcommands.c:1062 +#, c-format +msgid "invalid LC_CTYPE locale name: \"%s\"" +msgstr "nombre de configuración regional LC_CTYPE no válido: «%s»" -#: commands/dbcommands.c:1059 +#: commands/dbcommands.c:1074 #, c-format -msgid "ICU locale must be specified" -msgstr "el locale ICU debe ser especificado" +msgid "BUILTIN_LOCALE cannot be specified unless locale provider is builtin" +msgstr "no se puede especificar BUILTIN_LOCALE a menos que el proveedor de configuración regional sea builtin" -#: commands/dbcommands.c:1088 +#: commands/dbcommands.c:1082 #, c-format msgid "ICU locale cannot be specified unless locale provider is ICU" msgstr "no se puede especificar una configuración regional ICU a menos que el proveedor de configuración regional sea ICU" -#: commands/dbcommands.c:1111 +#: commands/dbcommands.c:1100 +#, c-format +msgid "LOCALE or BUILTIN_LOCALE must be specified" +msgstr "debe especificarse LOCALE o BUILTIN_LOCALE" + +#: commands/dbcommands.c:1109 +#, c-format +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "la codificación «%s» no está soportada por ICU" + +#: commands/dbcommands.c:1119 +#, c-format +msgid "LOCALE or ICU_LOCALE must be specified" +msgstr "debe especificarse LOCALE o ICU_LOCALE" + +#: commands/dbcommands.c:1163 #, c-format msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" msgstr "la nueva codificación (%s) es incompatible con la codificación de la base de datos patrón (%s)" -#: commands/dbcommands.c:1114 +#: commands/dbcommands.c:1166 #, c-format msgid "Use the same encoding as in the template database, or use template0 as template." msgstr "Use la misma codificación que en la base de datos patrón, o bien use template0 como patrón." -#: commands/dbcommands.c:1119 +#: commands/dbcommands.c:1171 #, c-format msgid "new collation (%s) is incompatible with the collation of the template database (%s)" msgstr "la nueva «collation» (%s) es incompatible con la «collation» de la base de datos patrón (%s)" -#: commands/dbcommands.c:1121 +#: commands/dbcommands.c:1173 #, c-format msgid "Use the same collation as in the template database, or use template0 as template." msgstr "Use la misma «collation» que en la base de datos patrón, o bien use template0 como patrón." -#: commands/dbcommands.c:1126 +#: commands/dbcommands.c:1178 #, c-format msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" msgstr "el nuevo LC_CTYPE (%s) es incompatible con el LC_CTYPE de la base de datos patrón (%s)" -#: commands/dbcommands.c:1128 +#: commands/dbcommands.c:1180 #, c-format msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." msgstr "Use el mismo LC_CTYPE que en la base de datos patrón, o bien use template0 como patrón." -#: commands/dbcommands.c:1133 -#, fuzzy, c-format -#| msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" +#: commands/dbcommands.c:1185 +#, c-format msgid "new locale provider (%s) does not match locale provider of the template database (%s)" -msgstr "la nueva codificación (%s) es incompatible con la codificación de la base de datos patrón (%s)" +msgstr "el nuevo proveedor de configuración regional (%s) no coincide con el proveedor de la base de datos patrón (%s)" -#: commands/dbcommands.c:1135 -#, fuzzy, c-format -#| msgid "Use the same encoding as in the template database, or use template0 as template." +#: commands/dbcommands.c:1187 +#, c-format msgid "Use the same locale provider as in the template database, or use template0 as template." -msgstr "Use la misma codificación que en la base de datos patrón, o bien use template0 como patrón." +msgstr "Use el mismo proveedor de «locale» que en la base de datos patrón, o bien use template0 como patrón." -#: commands/dbcommands.c:1147 -#, fuzzy, c-format -#| msgid "new collation (%s) is incompatible with the collation of the template database (%s)" +#: commands/dbcommands.c:1199 +#, c-format msgid "new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)" -msgstr "la nueva «collation» (%s) es incompatible con la «collation» de la base de datos patrón (%s)" +msgstr "la nueva configuración regional ICU (%s) es incompatible con la configuración regional ICU de la base de datos patrón (%s)" -#: commands/dbcommands.c:1149 -#, fuzzy, c-format -#| msgid "Use the same collation as in the template database, or use template0 as template." +#: commands/dbcommands.c:1201 +#, c-format msgid "Use the same ICU locale as in the template database, or use template0 as template." -msgstr "Use la misma «collation» que en la base de datos patrón, o bien use template0 como patrón." +msgstr "Use la misma configuración regional («locale») que en la base de datos patrón, o bien use template0 como patrón." -#: commands/dbcommands.c:1160 -#, fuzzy, c-format -#| msgid "new collation (%s) is incompatible with the collation of the template database (%s)" +#: commands/dbcommands.c:1212 +#, c-format msgid "new ICU collation rules (%s) are incompatible with the ICU collation rules of the template database (%s)" -msgstr "la nueva «collation» (%s) es incompatible con la «collation» de la base de datos patrón (%s)" +msgstr "las nuevas reglas de «collation» ICU (%s) son incompatibles con las reglas de «collation» ICU de la base de datos patrón (%s)" -#: commands/dbcommands.c:1162 -#, fuzzy, c-format -#| msgid "Use the same collation as in the template database, or use template0 as template." +#: commands/dbcommands.c:1214 +#, c-format msgid "Use the same ICU collation rules as in the template database, or use template0 as template." -msgstr "Use la misma «collation» que en la base de datos patrón, o bien use template0 como patrón." +msgstr "Use las mismas reglas de «collation» ICU que en la base de datos patrón, o bien use template0 como patrón." -#: commands/dbcommands.c:1185 +#: commands/dbcommands.c:1243 #, c-format msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" -msgstr "" +msgstr "la base de datos patrón «%s» tiene una versión de configuración regional, pero no se pudo determinar una versión real" -#: commands/dbcommands.c:1190 -#, fuzzy, c-format -#| msgid "template database \"%s\" does not exist" +#: commands/dbcommands.c:1248 +#, c-format msgid "template database \"%s\" has a collation version mismatch" -msgstr "no existe la base de datos patrón «%s»" +msgstr "discordancia en la versión de «collation» de la base de datos patrón «%s»" -#: commands/dbcommands.c:1192 -#, fuzzy, c-format -#| msgid "The collation in the database was created using version %s, but the operating system provides version %s." +#: commands/dbcommands.c:1250 +#, c-format msgid "The template database was created using collation version %s, but the operating system provides version %s." -msgstr "El ordenamiento en la base de datos fue creado usando la versión %s, pero el sistema operativo provee la versión %s." +msgstr "La base de datos patrón fue creada usando la versión %s, pero el sistema operativo provee la versión %s." -#: commands/dbcommands.c:1195 -#, fuzzy, c-format -#| msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." +#: commands/dbcommands.c:1253 +#, c-format msgid "Rebuild all objects in the template database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." -msgstr "Reconstruya todos los objetos afectados por este ordenamiento y ejecute ALTER COLLATION %s REFRESH VERSION, o construya PostgreSQL con la versión correcta de la biblioteca." +msgstr "Reconstruya todos los objetos de la base de datos patrón afectados por este ordenamiento y ejecute ALTER DATABASE %s REFRESH COLLATION VERSION, o construya PostgreSQL con la versión correcta de la biblioteca." -#: commands/dbcommands.c:1231 commands/dbcommands.c:1947 +#: commands/dbcommands.c:1298 commands/dbcommands.c:2041 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "no puede usarse pg_global como tablespace por omisión" -#: commands/dbcommands.c:1257 +#: commands/dbcommands.c:1324 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "no se puede asignar el nuevo tablespace por omisión «%s»" -#: commands/dbcommands.c:1259 +#: commands/dbcommands.c:1326 #, c-format msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." msgstr "Hay un conflicto puesto que la base de datos «%s» ya tiene algunas tablas en este tablespace." -#: commands/dbcommands.c:1289 commands/dbcommands.c:1820 +#: commands/dbcommands.c:1356 commands/dbcommands.c:1912 #, c-format msgid "database \"%s\" already exists" msgstr "la base de datos «%s» ya existe" -#: commands/dbcommands.c:1303 +#: commands/dbcommands.c:1370 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "la base de datos de origen «%s» está siendo utilizada por otros usuarios" -#: commands/dbcommands.c:1325 -#, fuzzy, c-format -#| msgid "database \"%s\" already exists" +#: commands/dbcommands.c:1392 +#, c-format msgid "database OID %u is already in use by database \"%s\"" -msgstr "la base de datos «%s» ya existe" +msgstr "el OID de base de datos %u ya está en uso por la base de datos «%s»" -#: commands/dbcommands.c:1331 +#: commands/dbcommands.c:1398 #, c-format msgid "data directory with the specified OID %u already exists" msgstr "el directorio de datos con el OID %u especificado ya existe" -#: commands/dbcommands.c:1503 commands/dbcommands.c:1518 +#: commands/dbcommands.c:1571 commands/dbcommands.c:1586 +#: utils/adt/pg_locale.c:2588 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "la codificación «%s» no coincide con la configuración regional «%s»" -#: commands/dbcommands.c:1506 +#: commands/dbcommands.c:1574 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "El parámetro LC_CTYPE escogido requiere la codificación «%s»." -#: commands/dbcommands.c:1521 +#: commands/dbcommands.c:1589 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "El parámetro LC_COLLATE escogido requiere la codificación «%s»." -#: commands/dbcommands.c:1601 +#: commands/dbcommands.c:1672 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "no existe la base de datos «%s», omitiendo" -#: commands/dbcommands.c:1625 +#: commands/dbcommands.c:1696 #, c-format msgid "cannot drop a template database" msgstr "no se puede borrar una base de datos patrón" -#: commands/dbcommands.c:1631 +#: commands/dbcommands.c:1702 #, c-format msgid "cannot drop the currently open database" msgstr "no se puede eliminar la base de datos activa" -#: commands/dbcommands.c:1644 +#: commands/dbcommands.c:1715 #, c-format msgid "database \"%s\" is used by an active logical replication slot" -msgstr "la base de datos «%s» está en uso por un slot de replicación activo" +msgstr "la base de datos «%s» está en uso por un slot de replicación lógica activo" -#: commands/dbcommands.c:1646 +#: commands/dbcommands.c:1717 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." msgstr[0] "Hay %d slot activo." msgstr[1] "Hay %d slots activos." -#: commands/dbcommands.c:1660 +#: commands/dbcommands.c:1731 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "la base de datos «%s» está siendo utilizada por suscripciones de replicación lógica" -#: commands/dbcommands.c:1662 +#: commands/dbcommands.c:1733 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." msgstr[0] "Hay %d suscripción." msgstr[1] "Hay %d suscripciones." -#: commands/dbcommands.c:1683 commands/dbcommands.c:1842 -#: commands/dbcommands.c:1969 +#: commands/dbcommands.c:1754 commands/dbcommands.c:1934 +#: commands/dbcommands.c:2063 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "la base de datos «%s» está siendo utilizada por otros usuarios" -#: commands/dbcommands.c:1802 +#: commands/dbcommands.c:1894 #, c-format msgid "permission denied to rename database" msgstr "se ha denegado el permiso para cambiar el nombre a la base de datos" -#: commands/dbcommands.c:1831 +#: commands/dbcommands.c:1923 #, c-format msgid "current database cannot be renamed" msgstr "no se puede cambiar el nombre de la base de datos activa" -#: commands/dbcommands.c:1925 +#: commands/dbcommands.c:2019 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "no se puede cambiar el tablespace de la base de datos activa" -#: commands/dbcommands.c:2031 +#: commands/dbcommands.c:2125 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "algunas relaciones de la base de datos «%s» ya están en el tablespace «%s»" -#: commands/dbcommands.c:2033 +#: commands/dbcommands.c:2127 #, c-format msgid "You must move them back to the database's default tablespace before using this command." msgstr "Debe moverlas de vuelta al tablespace por omisión de la base de datos antes de ejecutar esta orden." -#: commands/dbcommands.c:2160 commands/dbcommands.c:2868 -#: commands/dbcommands.c:3132 commands/dbcommands.c:3245 +#: commands/dbcommands.c:2256 commands/dbcommands.c:2999 +#: commands/dbcommands.c:3299 commands/dbcommands.c:3412 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "algunos archivos inútiles pueden haber quedado en el directorio \"%s\"" -#: commands/dbcommands.c:2221 +#: commands/dbcommands.c:2317 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "opción de DROP DATABASE «%s» no reconocida" -#: commands/dbcommands.c:2299 +#: commands/dbcommands.c:2395 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "la opción «%s» no puede ser especificada con otras opciones" -#: commands/dbcommands.c:2355 +#: commands/dbcommands.c:2443 +#, c-format +msgid "cannot alter invalid database \"%s\"" +msgstr "no se puede alterar base de datos no válida «%s»" + +#: commands/dbcommands.c:2460 #, c-format msgid "cannot disallow connections for current database" msgstr "no se pueden prohibir las conexiones para la base de datos actual" -#: commands/dbcommands.c:2570 +#: commands/dbcommands.c:2690 #, c-format msgid "permission denied to change owner of database" msgstr "se ha denegado el permiso para cambiar el dueño de la base de datos" -#: commands/dbcommands.c:2974 +#: commands/dbcommands.c:3105 #, c-format msgid "There are %d other session(s) and %d prepared transaction(s) using the database." msgstr "Hay otras %d sesiones y %d transacciones preparadas usando la base de datos." -#: commands/dbcommands.c:2977 +#: commands/dbcommands.c:3108 #, c-format msgid "There is %d other session using the database." msgid_plural "There are %d other sessions using the database." msgstr[0] "Hay %d otra sesión usando la base de datos." msgstr[1] "Hay otras %d sesiones usando la base de datos." -#: commands/dbcommands.c:2982 storage/ipc/procarray.c:3798 +#: commands/dbcommands.c:3113 storage/ipc/procarray.c:3859 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." msgstr[0] "Hay %d otra transacción preparada usando la base de datos." msgstr[1] "Hay otras %d transacciones preparadas usando la base de datos." -#: commands/dbcommands.c:3088 -#, fuzzy, c-format -#| msgid "removing WAL directory \"%s\"" +#: commands/dbcommands.c:3255 +#, c-format msgid "missing directory \"%s\"" -msgstr "eliminando el directorio de WAL «%s»" +msgstr "directorio «%s» faltante" -#: commands/dbcommands.c:3146 commands/tablespace.c:190 -#: commands/tablespace.c:639 +#: commands/dbcommands.c:3313 commands/tablespace.c:184 +#: commands/tablespace.c:633 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "no se pudo hacer stat al directorio «%s»: %m" -#: commands/define.c:54 commands/define.c:258 commands/define.c:290 -#: commands/define.c:318 commands/define.c:364 +#: commands/define.c:53 commands/define.c:257 commands/define.c:289 +#: commands/define.c:317 commands/define.c:363 #, c-format msgid "%s requires a parameter" msgstr "%s requiere un parámetro" -#: commands/define.c:87 commands/define.c:98 commands/define.c:192 -#: commands/define.c:210 commands/define.c:225 commands/define.c:243 +#: commands/define.c:86 commands/define.c:97 commands/define.c:191 +#: commands/define.c:209 commands/define.c:224 commands/define.c:242 #, c-format msgid "%s requires a numeric value" msgstr "%s requiere un valor numérico" -#: commands/define.c:154 +#: commands/define.c:153 #, c-format msgid "%s requires a Boolean value" msgstr "«%s» requiere un valor lógico (booleano)" -#: commands/define.c:168 commands/define.c:177 commands/define.c:327 +#: commands/define.c:167 commands/define.c:176 commands/define.c:326 #, c-format msgid "%s requires an integer value" msgstr "%s requiere valor entero" -#: commands/define.c:272 +#: commands/define.c:271 #, c-format msgid "argument of %s must be a name" msgstr "el argumento de %s debe ser un nombre" -#: commands/define.c:302 +#: commands/define.c:301 #, c-format msgid "argument of %s must be a type name" msgstr "el argumento de %s debe ser un nombre de tipo" -#: commands/define.c:348 +#: commands/define.c:347 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "argumento no válido para %s: «%s»" -#: commands/dropcmds.c:101 commands/functioncmds.c:1387 -#: utils/adt/ruleutils.c:2881 +#: commands/dropcmds.c:96 commands/functioncmds.c:1382 +#: utils/adt/ruleutils.c:2910 #, c-format msgid "\"%s\" is an aggregate function" msgstr "«%s» es una función de agregación" -#: commands/dropcmds.c:103 +#: commands/dropcmds.c:98 #, c-format msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "Use DROP AGGREGATE para eliminar funciones de agregación." -#: commands/dropcmds.c:158 commands/sequence.c:474 commands/tablecmds.c:3710 -#: commands/tablecmds.c:3868 commands/tablecmds.c:3920 -#: commands/tablecmds.c:16468 tcop/utility.c:1335 +#: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:3892 +#: commands/tablecmds.c:4050 commands/tablecmds.c:4102 +#: commands/tablecmds.c:17161 tcop/utility.c:1325 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "no existe la relación «%s», omitiendo" -#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1285 +#: commands/dropcmds.c:183 commands/dropcmds.c:282 commands/tablecmds.c:1409 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "el esquema «%s» no existe, omitiendo" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:277 +#: commands/dropcmds.c:223 commands/dropcmds.c:262 commands/tablecmds.c:286 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "el tipo «%s» no existe, omitiendo" -#: commands/dropcmds.c:257 +#: commands/dropcmds.c:252 #, c-format msgid "access method \"%s\" does not exist, skipping" msgstr "no existe el método de acceso «%s», omitiendo" -#: commands/dropcmds.c:275 +#: commands/dropcmds.c:270 #, c-format msgid "collation \"%s\" does not exist, skipping" msgstr "no existe el ordenamiento (collation) «%s», omitiendo" -#: commands/dropcmds.c:282 +#: commands/dropcmds.c:277 #, c-format msgid "conversion \"%s\" does not exist, skipping" msgstr "no existe la conversión «%s», omitiendo" -#: commands/dropcmds.c:293 commands/statscmds.c:654 +#: commands/dropcmds.c:288 commands/statscmds.c:664 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "no existe el objeto de estadísticas «%s», omitiendo" -#: commands/dropcmds.c:300 +#: commands/dropcmds.c:295 #, c-format msgid "text search parser \"%s\" does not exist, skipping" msgstr "el analizador de búsqueda en texto «%s» no existe, omitiendo" -#: commands/dropcmds.c:307 +#: commands/dropcmds.c:302 #, c-format msgid "text search dictionary \"%s\" does not exist, skipping" msgstr "el diccionario de búsqueda en texto «%s» no existe, omitiendo" -#: commands/dropcmds.c:314 +#: commands/dropcmds.c:309 #, c-format msgid "text search template \"%s\" does not exist, skipping" msgstr "la plantilla de búsqueda en texto «%s» no existe, omitiendo" -#: commands/dropcmds.c:321 +#: commands/dropcmds.c:316 #, c-format msgid "text search configuration \"%s\" does not exist, skipping" msgstr "no existe la configuración de búsqueda en texto «%s», omitiendo" -#: commands/dropcmds.c:326 +#: commands/dropcmds.c:321 #, c-format msgid "extension \"%s\" does not exist, skipping" msgstr "no existe la extensión «%s», omitiendo" -#: commands/dropcmds.c:336 +#: commands/dropcmds.c:331 #, c-format msgid "function %s(%s) does not exist, skipping" msgstr "no existe la función %s(%s), omitiendo" -#: commands/dropcmds.c:349 +#: commands/dropcmds.c:344 #, c-format msgid "procedure %s(%s) does not exist, skipping" msgstr "el procedimiento %s(%s) no existe, omitiendo" -#: commands/dropcmds.c:362 +#: commands/dropcmds.c:357 #, c-format msgid "routine %s(%s) does not exist, skipping" msgstr "no existe la rutina %s(%s), omitiendo" -#: commands/dropcmds.c:375 +#: commands/dropcmds.c:370 #, c-format msgid "aggregate %s(%s) does not exist, skipping" msgstr "la función de agregación %s(%s) no existe, omitiendo" -#: commands/dropcmds.c:388 +#: commands/dropcmds.c:383 #, c-format msgid "operator %s does not exist, skipping" msgstr "el operador %s no existe, omitiendo" -#: commands/dropcmds.c:394 +#: commands/dropcmds.c:389 #, c-format msgid "language \"%s\" does not exist, skipping" msgstr "el lenguaje «%s» no existe, omitiendo" -#: commands/dropcmds.c:403 +#: commands/dropcmds.c:398 #, c-format msgid "cast from type %s to type %s does not exist, skipping" msgstr "no existe la conversión del tipo %s al tipo %s, omitiendo" -#: commands/dropcmds.c:412 +#: commands/dropcmds.c:407 #, c-format msgid "transform for type %s language \"%s\" does not exist, skipping" msgstr "la transformación para el tipo %s lenguaje «%s» no existe, omitiendo" -#: commands/dropcmds.c:420 +#: commands/dropcmds.c:415 #, c-format msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" -msgstr "disparador «%s» para la relación «%s» no existe, omitiendo" +msgstr "“trigger†«%s» para la relación «%s» no existe, omitiendo" -#: commands/dropcmds.c:429 +#: commands/dropcmds.c:424 #, c-format msgid "policy \"%s\" for relation \"%s\" does not exist, skipping" msgstr "la política «%s» para la relación «%s» no existe, omitiendo" -#: commands/dropcmds.c:436 +#: commands/dropcmds.c:431 #, c-format msgid "event trigger \"%s\" does not exist, skipping" -msgstr "el disparador por eventos «%s» no existe, omitiendo" +msgstr "el “trigger†por eventos «%s» no existe, omitiendo" -#: commands/dropcmds.c:442 +#: commands/dropcmds.c:437 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist, skipping" msgstr "la regla «%s» para la relación «%s» no existe, omitiendo" -#: commands/dropcmds.c:449 +#: commands/dropcmds.c:444 #, c-format msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "no existe el conector de datos externos «%s», omitiendo" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 +#: commands/dropcmds.c:448 commands/foreigncmds.c:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "el servidor «%s» no existe, omitiendo" -#: commands/dropcmds.c:462 +#: commands/dropcmds.c:457 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\", skipping" msgstr "no existe la clase de operadores «%s» para el método de acceso «%s», omitiendo" -#: commands/dropcmds.c:474 +#: commands/dropcmds.c:469 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\", skipping" msgstr "no existe la familia de operadores «%s» para el método de acceso «%s», omitiendo" -#: commands/dropcmds.c:481 +#: commands/dropcmds.c:476 #, c-format msgid "publication \"%s\" does not exist, skipping" msgstr "no existe la publicación «%s», omitiendo" -#: commands/event_trigger.c:125 +#: commands/event_trigger.c:137 #, c-format msgid "permission denied to create event trigger \"%s\"" -msgstr "se ha denegado el permiso para crear el disparador por eventos «%s»" +msgstr "se ha denegado el permiso para crear el “trigger†por eventos «%s»" -#: commands/event_trigger.c:127 +#: commands/event_trigger.c:139 #, c-format msgid "Must be superuser to create an event trigger." -msgstr "Debe ser superusuario para crear un disparador por eventos." +msgstr "Debe ser superusuario para crear un “trigger†por eventos." -#: commands/event_trigger.c:136 +#: commands/event_trigger.c:149 #, c-format msgid "unrecognized event name \"%s\"" msgstr "nommre de evento «%s» no reconocido" -#: commands/event_trigger.c:153 +#: commands/event_trigger.c:166 #, c-format msgid "unrecognized filter variable \"%s\"" msgstr "variable de filtro «%s» no reconocida" -#: commands/event_trigger.c:207 +#: commands/event_trigger.c:181 +#, c-format +msgid "tag filtering is not supported for login event triggers" +msgstr "el filtrado de «tags» no está soportado en “triggers†por evento de login" + +#: commands/event_trigger.c:224 #, c-format msgid "filter value \"%s\" not recognized for filter variable \"%s\"" msgstr "el valor de filtro «%s» no es reconocido por la variable de filtro «%s»" #. translator: %s represents an SQL statement name -#: commands/event_trigger.c:213 commands/event_trigger.c:235 +#: commands/event_trigger.c:230 commands/event_trigger.c:252 #, c-format msgid "event triggers are not supported for %s" -msgstr "los disparadores por eventos no están soportados para %s" +msgstr "los “triggers†por evento no están soportados para %s" -#: commands/event_trigger.c:248 +#: commands/event_trigger.c:265 #, c-format msgid "filter variable \"%s\" specified more than once" msgstr "la variable de filtro «%s» fue especificada más de una vez" -#: commands/event_trigger.c:376 commands/event_trigger.c:420 -#: commands/event_trigger.c:514 +#: commands/event_trigger.c:438 commands/event_trigger.c:490 +#: commands/event_trigger.c:584 #, c-format msgid "event trigger \"%s\" does not exist" -msgstr "no existe el disparador por eventos «%s»" +msgstr "no existe el “trigger†por eventos «%s»" -#: commands/event_trigger.c:452 +#: commands/event_trigger.c:522 #, c-format msgid "event trigger with OID %u does not exist" -msgstr "no existe el disparador por eventos con OID %u" +msgstr "no existe el “trigger†por eventos con OID %u" -#: commands/event_trigger.c:482 +#: commands/event_trigger.c:552 #, c-format msgid "permission denied to change owner of event trigger \"%s\"" -msgstr "se ha denegado el permiso para cambiar el dueño del disparador por eventos «%s»" +msgstr "se ha denegado el permiso para cambiar el dueño del “trigger†por eventos «%s»" -#: commands/event_trigger.c:484 +#: commands/event_trigger.c:554 #, c-format msgid "The owner of an event trigger must be a superuser." -msgstr "El dueño de un disparador por eventos debe ser un superusuario." +msgstr "El dueño de un “trigger†por eventos debe ser un superusuario." -#: commands/event_trigger.c:1304 +#: commands/event_trigger.c:1409 #, c-format msgid "%s can only be called in a sql_drop event trigger function" -msgstr "%s sólo puede invocarse en una función de un disparador en el evento sql_drop" +msgstr "%s sólo puede invocarse en una función de un “trigger†en el evento sql_drop" -#: commands/event_trigger.c:1397 commands/event_trigger.c:1418 +#: commands/event_trigger.c:1502 commands/event_trigger.c:1523 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" -msgstr "%s sólo puede invocarse en una función de un disparador en el evento table_rewrite" +msgstr "%s sólo puede invocarse en una función de un “trigger†en el evento table_rewrite" -#: commands/event_trigger.c:1831 +#: commands/event_trigger.c:1936 #, c-format msgid "%s can only be called in an event trigger function" -msgstr "%s sólo puede invocarse en una función de un disparador por eventos" +msgstr "%s sólo puede invocarse en una función de un “trigger†por eventos" -#: commands/explain.c:220 +#: commands/explain.c:241 commands/explain.c:266 #, c-format msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" msgstr "valor no reconocido para la opción de EXPLAIN «%s»: «%s»" -#: commands/explain.c:227 +#: commands/explain.c:273 #, c-format msgid "unrecognized EXPLAIN option \"%s\"" msgstr "opción de EXPLAIN «%s» no reconocida" -#: commands/explain.c:236 +#: commands/explain.c:282 #, c-format msgid "EXPLAIN option WAL requires ANALYZE" msgstr "la opción WAL de EXPLAIN requiere ANALYZE" -#: commands/explain.c:245 +#: commands/explain.c:291 #, c-format msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "la opción TIMING de EXPLAIN requiere ANALYZE" -#: commands/explain.c:251 -#, fuzzy, c-format -#| msgid "options -d/--dbname and -f/--file cannot be used together" +#: commands/explain.c:297 +#, c-format +msgid "EXPLAIN option SERIALIZE requires ANALYZE" +msgstr "la opción SERIALIZE de EXPLAIN requiere ANALYZE" + +#: commands/explain.c:303 +#, c-format msgid "EXPLAIN options ANALYZE and GENERIC_PLAN cannot be used together" -msgstr "las opciones -d/--dbname y -f/--file no pueden usarse juntas" +msgstr "las opciones ANALYZE y GENERIC_PLAN de EXPLAIN no pueden usarse juntas" -#: commands/extension.c:177 commands/extension.c:3009 +#: commands/extension.c:178 commands/extension.c:3031 #, c-format msgid "extension \"%s\" does not exist" msgstr "no existe la extensión «%s»" -#: commands/extension.c:276 commands/extension.c:285 commands/extension.c:297 -#: commands/extension.c:307 +#: commands/extension.c:277 commands/extension.c:286 commands/extension.c:298 +#: commands/extension.c:308 #, c-format msgid "invalid extension name: \"%s\"" msgstr "nombre de extensión no válido: «%s»" -#: commands/extension.c:277 +#: commands/extension.c:278 #, c-format msgid "Extension names must not be empty." msgstr "Los nombres de extensión no deben ser vacíos." -#: commands/extension.c:286 +#: commands/extension.c:287 #, c-format msgid "Extension names must not contain \"--\"." msgstr "Los nombres de extensión no deben contener «--»." -#: commands/extension.c:298 +#: commands/extension.c:299 #, c-format msgid "Extension names must not begin or end with \"-\"." msgstr "Los nombres de extensión no deben empezar ni terminar con «-»." -#: commands/extension.c:308 +#: commands/extension.c:309 #, c-format msgid "Extension names must not contain directory separator characters." msgstr "Los nombres de extensión no deben contener caracteres separadores de directorio." -#: commands/extension.c:323 commands/extension.c:332 commands/extension.c:341 -#: commands/extension.c:351 +#: commands/extension.c:324 commands/extension.c:333 commands/extension.c:342 +#: commands/extension.c:352 #, c-format msgid "invalid extension version name: \"%s\"" msgstr "nombre de versión de extensión no válido: «%s»" -#: commands/extension.c:324 +#: commands/extension.c:325 #, c-format msgid "Version names must not be empty." msgstr "Los nombres de versión no deben ser vacíos." -#: commands/extension.c:333 +#: commands/extension.c:334 #, c-format msgid "Version names must not contain \"--\"." msgstr "Los nombres de versión no deben contener «--»." -#: commands/extension.c:342 +#: commands/extension.c:343 #, c-format msgid "Version names must not begin or end with \"-\"." msgstr "Los nombres de versión no deben empezar ni terminar con «-»." -#: commands/extension.c:352 +#: commands/extension.c:353 #, c-format msgid "Version names must not contain directory separator characters." msgstr "Los nombres de versión no deben contener caracteres separadores de directorio." -#: commands/extension.c:506 -#, fuzzy, c-format -#| msgid "extension \"%s\" does not exist" +#: commands/extension.c:507 +#, c-format msgid "extension \"%s\" is not available" -msgstr "no existe la extensión «%s»" +msgstr "la extensión «%s» no está disponible" -#: commands/extension.c:507 -#, fuzzy, c-format -#| msgid "could not open extension control file \"%s\": %m" +#: commands/extension.c:508 +#, c-format msgid "Could not open extension control file \"%s\": %m." -msgstr "no se pudo abrir el archivo de control de extensión «%s»: %m" +msgstr "No se pudo abrir el archivo de control de extensión «%s»: %m." -#: commands/extension.c:509 +#: commands/extension.c:510 #, c-format msgid "The extension must first be installed on the system where PostgreSQL is running." msgstr "La extensión debe primero ser instalada en el sistema donde PostgreSQL está ejecutándose." -#: commands/extension.c:513 +#: commands/extension.c:514 #, c-format msgid "could not open extension control file \"%s\": %m" msgstr "no se pudo abrir el archivo de control de extensión «%s»: %m" -#: commands/extension.c:536 commands/extension.c:546 +#: commands/extension.c:537 commands/extension.c:547 #, c-format msgid "parameter \"%s\" cannot be set in a secondary extension control file" msgstr "el parámetro «%s» no se puede cambiar en un archivo control secundario de extensión" -#: commands/extension.c:568 commands/extension.c:576 commands/extension.c:584 -#: utils/misc/guc.c:3097 +#: commands/extension.c:569 commands/extension.c:577 commands/extension.c:585 +#: utils/misc/guc.c:3147 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "el parámetro «%s» requiere un valor lógico (booleano)" -#: commands/extension.c:593 +#: commands/extension.c:594 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "«%s» no es un nombre válido de codificación" -#: commands/extension.c:607 commands/extension.c:622 +#: commands/extension.c:608 commands/extension.c:623 #, c-format msgid "parameter \"%s\" must be a list of extension names" msgstr "el parámetro «%s» debe ser una lista de nombres de extensión" -#: commands/extension.c:629 +#: commands/extension.c:630 #, c-format msgid "unrecognized parameter \"%s\" in file \"%s\"" msgstr "parámetro no reconocido «%s» en el archivo «%s»" -#: commands/extension.c:638 +#: commands/extension.c:639 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "el parámetro «schema» no puede ser especificado cuando «relocatable» es verdadero" -#: commands/extension.c:816 +#: commands/extension.c:817 #, c-format msgid "transaction control statements are not allowed within an extension script" msgstr "las sentencias de control de transacción no están permitidos dentro de un guión de transacción" -#: commands/extension.c:896 +#: commands/extension.c:897 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "se ha denegado el permiso para crear la extensión «%s»" -#: commands/extension.c:899 +#: commands/extension.c:900 #, c-format msgid "Must have CREATE privilege on current database to create this extension." msgstr "Debe tener privilegio CREATE en la base de datos actual para crear esta extensión." -#: commands/extension.c:900 +#: commands/extension.c:901 #, c-format msgid "Must be superuser to create this extension." msgstr "Debe ser superusuario para crear esta extensión." -#: commands/extension.c:904 +#: commands/extension.c:905 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "se ha denegado el permiso para actualizar la extensión «%s»" -#: commands/extension.c:907 +#: commands/extension.c:908 #, c-format msgid "Must have CREATE privilege on current database to update this extension." msgstr "Debe tener privilegio CREATE en la base de datos actual para actualizar esta extensión." -#: commands/extension.c:908 +#: commands/extension.c:909 #, c-format msgid "Must be superuser to update this extension." msgstr "Debe ser superusuario para actualizar esta extensión." -#: commands/extension.c:1265 +#: commands/extension.c:1042 +#, c-format +msgid "invalid character in extension owner: must not contain any of \"%s\"" +msgstr "carácter no válido en dueño de extensión: no debe contener ninguno de «%s»" + +#: commands/extension.c:1066 commands/extension.c:1093 +#, c-format +msgid "invalid character in extension \"%s\" schema: must not contain any of \"%s\"" +msgstr "carácter no válido en esquema de extensión «%s»: no debe contener ninguno de «%s»" + +#: commands/extension.c:1288 #, c-format msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgstr "la extensión «%s» no tiene ruta de actualización desde la versión «%s» hasta la versión «%s»" -#: commands/extension.c:1473 commands/extension.c:3067 +#: commands/extension.c:1496 commands/extension.c:3089 #, c-format msgid "version to install must be specified" msgstr "la versión a instalar debe ser especificada" -#: commands/extension.c:1510 +#: commands/extension.c:1533 #, c-format msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" msgstr "la extensión «%s» no tiene script de instalación ni ruta de actualización para la versión «%s»" -#: commands/extension.c:1544 +#: commands/extension.c:1567 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "la extensión «%s» debe ser instalada en el esquema «%s»" -#: commands/extension.c:1704 +#: commands/extension.c:1727 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "detectada una dependencia cíclica entre las extensiones «%s» y «%s»" -#: commands/extension.c:1709 +#: commands/extension.c:1732 #, c-format msgid "installing required extension \"%s\"" msgstr "instalando la extensión requerida «%s»" -#: commands/extension.c:1732 +#: commands/extension.c:1755 #, c-format msgid "required extension \"%s\" is not installed" msgstr "la extensión requerida «%s» no está instalada" -#: commands/extension.c:1735 +#: commands/extension.c:1758 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "Use CREATE EXTENSION ... CASCADE para instalar además las extensiones requeridas." -#: commands/extension.c:1770 +#: commands/extension.c:1793 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "la extensión «%s» ya existe, omitiendo" -#: commands/extension.c:1777 +#: commands/extension.c:1800 #, c-format msgid "extension \"%s\" already exists" msgstr "la extensión «%s» ya existe" -#: commands/extension.c:1788 +#: commands/extension.c:1811 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "los CREATE EXTENSION anidados no están soportados" -#: commands/extension.c:1952 +#: commands/extension.c:1975 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "no se puede eliminar la extensión «%s» porque está siendo modificada" -#: commands/extension.c:2427 +#: commands/extension.c:2450 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "%s sólo puede invocarse desde un script SQL ejecutado por CREATE EXTENSION" -#: commands/extension.c:2439 +#: commands/extension.c:2462 #, c-format msgid "OID %u does not refer to a table" msgstr "el OID %u no hace referencia a una tabla" -#: commands/extension.c:2444 +#: commands/extension.c:2467 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "el tabla «%s» no es un miembro de la extensión que se está creando" -#: commands/extension.c:2790 +#: commands/extension.c:2813 #, c-format msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" msgstr "no se puede mover la extensión «%s» al esquema «%s» porque la extensión contiene al esquema" -#: commands/extension.c:2831 commands/extension.c:2928 +#: commands/extension.c:2854 commands/extension.c:2948 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "la extensión «%s» no soporta SET SCHEMA" -#: commands/extension.c:2885 -#, fuzzy, c-format -#| msgid "cannot drop extension \"%s\" because it is being modified" +#: commands/extension.c:2911 +#, c-format msgid "cannot SET SCHEMA of extension \"%s\" because other extensions prevent it" -msgstr "no se puede eliminar la extensión «%s» porque está siendo modificada" +msgstr "no se puede hacer SET SCHEMA de la extensión «%s» porque otras extensiones lo impiden" -#: commands/extension.c:2887 -#, fuzzy, c-format -#| msgid "relation \"%s\" is not a partition of relation \"%s\"" +#: commands/extension.c:2913 +#, c-format msgid "Extension \"%s\" requests no relocation of extension \"%s\"." -msgstr "relación «%s» no es una partición de la relación «%s»" +msgstr "La extensión «%s» solicita no relocalizar la extensión «%s»." -#: commands/extension.c:2930 +#: commands/extension.c:2950 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "%s no está en el esquema de la extensión, «%s»" -#: commands/extension.c:2989 +#: commands/extension.c:3011 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "los ALTER EXTENSION anidados no están soportados" -#: commands/extension.c:3078 +#: commands/extension.c:3100 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "la versión «%s» de la extensión «%s» ya está instalada" -#: commands/extension.c:3290 +#: commands/extension.c:3311 #, c-format msgid "cannot add an object of this type to an extension" msgstr "no se puede añadir un objeto de este tipo a una extensión" -#: commands/extension.c:3356 +#: commands/extension.c:3409 #, c-format msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "no se puede agregar el esquema «%s» a la extensión «%s» porque el esquema contiene la extensión" -#: commands/extension.c:3450 +#: commands/extension.c:3491 commands/typecmds.c:4042 utils/fmgr/funcapi.c:725 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "no se pudo encontrar un tipo de multirango para el tipo de dato %s" + +#: commands/extension.c:3532 #, c-format msgid "file \"%s\" is too large" msgstr "el archivo «%s» es demasiado grande" @@ -8331,7 +8616,7 @@ msgstr "Debe ser superusuario para cambiar el dueño de un conector de datos ext msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "El dueño de un conector de datos externos debe ser un superusuario." -#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:678 +#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:691 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "no existe el conector de datos externos «%s»" @@ -8401,7 +8686,7 @@ msgstr "no existe el mapeo de usuario «%s» para el servidor «%s»" msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "no existe el mapeo de usuario «%s» para el servidor «%s», omitiendo" -#: commands/foreigncmds.c:1507 foreign/foreign.c:391 +#: commands/foreigncmds.c:1507 foreign/foreign.c:404 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "el conector de datos externos «%s» no tiene manejador" @@ -8416,524 +8701,528 @@ msgstr "el conector de datos externos «%s» no soporta IMPORT FOREIGN SCHEMA" msgid "importing foreign table \"%s\"" msgstr "importando la tabla foránea «%s»" -#: commands/functioncmds.c:109 +#: commands/functioncmds.c:104 #, c-format msgid "SQL function cannot return shell type %s" msgstr "una función SQL no puede retornar el tipo inconcluso %s" -#: commands/functioncmds.c:114 +#: commands/functioncmds.c:109 #, c-format msgid "return type %s is only a shell" msgstr "el tipo de retorno %s está inconcluso" -#: commands/functioncmds.c:143 parser/parse_type.c:354 +#: commands/functioncmds.c:138 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "no se puede especificar un modificador de tipo para el tipo inconcluso «%s»" -#: commands/functioncmds.c:149 +#: commands/functioncmds.c:144 #, c-format msgid "type \"%s\" is not yet defined" msgstr "el tipo «%s» no ha sido definido aún" -#: commands/functioncmds.c:150 +#: commands/functioncmds.c:145 #, c-format msgid "Creating a shell type definition." msgstr "Creando una definición de tipo inconclusa." -#: commands/functioncmds.c:249 +#: commands/functioncmds.c:244 #, c-format msgid "SQL function cannot accept shell type %s" msgstr "las funciones SQL no pueden aceptar el tipo inconcluso %s" -#: commands/functioncmds.c:255 +#: commands/functioncmds.c:250 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "las funciones de agregación no pueden aceptar el tipo inconcluso %s" -#: commands/functioncmds.c:260 +#: commands/functioncmds.c:255 #, c-format msgid "argument type %s is only a shell" msgstr "el tipo de argumento %s está inconcluso" -#: commands/functioncmds.c:270 +#: commands/functioncmds.c:265 #, c-format msgid "type %s does not exist" msgstr "no existe el tipo %s" -#: commands/functioncmds.c:284 +#: commands/functioncmds.c:279 #, c-format msgid "aggregates cannot accept set arguments" msgstr "las funciones de agregación no pueden aceptar argumentos de conjunto" -#: commands/functioncmds.c:288 +#: commands/functioncmds.c:283 #, c-format msgid "procedures cannot accept set arguments" msgstr "los procedimientos no pueden aceptar argumentos de conjunto" -#: commands/functioncmds.c:292 +#: commands/functioncmds.c:287 #, c-format msgid "functions cannot accept set arguments" msgstr "funciones no pueden aceptar argumentos de conjunto" -#: commands/functioncmds.c:302 +#: commands/functioncmds.c:297 #, c-format msgid "VARIADIC parameter must be the last input parameter" msgstr "el parámetro VARIADIC debe ser el último parámetro de entrada" -#: commands/functioncmds.c:322 +#: commands/functioncmds.c:317 #, c-format msgid "VARIADIC parameter must be the last parameter" msgstr "el parámetro VARIADIC debe ser el último parámetro" -#: commands/functioncmds.c:347 +#: commands/functioncmds.c:342 #, c-format msgid "VARIADIC parameter must be an array" msgstr "el parámetro VARIADIC debe ser un array" -#: commands/functioncmds.c:392 +#: commands/functioncmds.c:387 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "nombre de parámetro «%s» usado más de una vez" -#: commands/functioncmds.c:410 +#: commands/functioncmds.c:405 #, c-format msgid "only input parameters can have default values" msgstr "solo los parámetros de entrada pueden tener valores por omisión" -#: commands/functioncmds.c:425 +#: commands/functioncmds.c:420 #, c-format msgid "cannot use table references in parameter default value" msgstr "no se pueden usar referencias a tablas en el valor por omisión de un parámetro" -#: commands/functioncmds.c:449 +#: commands/functioncmds.c:444 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "los parámetros de entrada después de uno que tenga valor por omisión también deben tener valores por omisión" -#: commands/functioncmds.c:459 +#: commands/functioncmds.c:454 #, c-format msgid "procedure OUT parameters cannot appear after one with a default value" msgstr "los parámetros OUT no pueden aparecer después de uno que tenga valor por omisión" -#: commands/functioncmds.c:601 commands/functioncmds.c:780 +#: commands/functioncmds.c:596 commands/functioncmds.c:775 #, c-format msgid "invalid attribute in procedure definition" msgstr "atributo no válido en definición de procedimiento" -#: commands/functioncmds.c:697 +#: commands/functioncmds.c:692 #, c-format msgid "support function %s must return type %s" msgstr "la función de soporte %s debe retornar el tipo %s" -#: commands/functioncmds.c:708 +#: commands/functioncmds.c:703 #, c-format msgid "must be superuser to specify a support function" msgstr "debe ser superusuario para especificar una función de soporte" -#: commands/functioncmds.c:829 commands/functioncmds.c:1432 +#: commands/functioncmds.c:824 commands/functioncmds.c:1427 #, c-format msgid "COST must be positive" msgstr "COST debe ser positivo" -#: commands/functioncmds.c:837 commands/functioncmds.c:1440 +#: commands/functioncmds.c:832 commands/functioncmds.c:1435 #, c-format msgid "ROWS must be positive" msgstr "ROWS debe ser positivo" -#: commands/functioncmds.c:866 +#: commands/functioncmds.c:861 #, c-format msgid "no function body specified" msgstr "no se ha especificado un cuerpo para la función" -#: commands/functioncmds.c:871 +#: commands/functioncmds.c:866 #, c-format msgid "duplicate function body specified" msgstr "se ha especificado por duplicado el cuerpo para la función" -#: commands/functioncmds.c:876 +#: commands/functioncmds.c:871 #, c-format msgid "inline SQL function body only valid for language SQL" msgstr "cuerpo de función SQL en línea solo es válido para lenguaje SQL" -#: commands/functioncmds.c:918 +#: commands/functioncmds.c:913 #, c-format msgid "SQL function with unquoted function body cannot have polymorphic arguments" msgstr "una función SQL con el cuerpo de la función fuera de comillas no puede tener argumentos polimórficos" -#: commands/functioncmds.c:944 commands/functioncmds.c:963 +#: commands/functioncmds.c:939 commands/functioncmds.c:958 #, c-format msgid "%s is not yet supported in unquoted SQL function body" msgstr "%s aún no está soportado en una función SQL con el cuerpo fuera de comillas" -#: commands/functioncmds.c:991 +#: commands/functioncmds.c:986 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "sólo se requiere un item AS para el lenguaje «%s»" -#: commands/functioncmds.c:1096 +#: commands/functioncmds.c:1091 #, c-format msgid "no language specified" msgstr "no se ha especificado el lenguaje" -#: commands/functioncmds.c:1104 commands/functioncmds.c:2105 -#: commands/proclang.c:237 +#: commands/functioncmds.c:1099 commands/functioncmds.c:2117 +#: commands/proclang.c:235 #, c-format msgid "language \"%s\" does not exist" msgstr "no existe el lenguaje «%s»" -#: commands/functioncmds.c:1106 commands/functioncmds.c:2107 +#: commands/functioncmds.c:1101 commands/functioncmds.c:2119 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "Use CREATE EXTENSION para cargar el lenguaje en la base de datos." -#: commands/functioncmds.c:1139 commands/functioncmds.c:1424 +#: commands/functioncmds.c:1134 commands/functioncmds.c:1419 #, c-format msgid "only superuser can define a leakproof function" msgstr "sólo un superusuario puede definir funciones «leakproof»" -#: commands/functioncmds.c:1190 +#: commands/functioncmds.c:1185 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "tipo de retorno de función debe ser %s debido a los parámetros OUT" -#: commands/functioncmds.c:1203 +#: commands/functioncmds.c:1198 #, c-format msgid "function result type must be specified" msgstr "el tipo de retorno de la función debe ser especificado" -#: commands/functioncmds.c:1256 commands/functioncmds.c:1444 +#: commands/functioncmds.c:1251 commands/functioncmds.c:1439 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "ROWS no es aplicable cuando una función no retorna un conjunto" -#: commands/functioncmds.c:1547 +#: commands/functioncmds.c:1546 #, c-format msgid "source data type %s is a pseudo-type" msgstr "el tipo de origen %s es un pseudotipo" -#: commands/functioncmds.c:1553 +#: commands/functioncmds.c:1552 #, c-format msgid "target data type %s is a pseudo-type" msgstr "el tipo de retorno %s es un pseudotipo" -#: commands/functioncmds.c:1577 +#: commands/functioncmds.c:1576 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "el cast será ignorado porque el tipo de datos de origen es un dominio" -#: commands/functioncmds.c:1582 +#: commands/functioncmds.c:1581 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "el cast será ignorado porque el tipo de datos de destino es un dominio" -#: commands/functioncmds.c:1607 +#: commands/functioncmds.c:1606 #, c-format msgid "cast function must take one to three arguments" msgstr "la función de conversión lleva de uno a tres argumentos" -#: commands/functioncmds.c:1613 +#: commands/functioncmds.c:1612 #, c-format msgid "argument of cast function must match or be binary-coercible from source data type" msgstr "el argumento de la función de conversión debe coincidir o ser binario-convertible con el tipo de origen" -#: commands/functioncmds.c:1617 +#: commands/functioncmds.c:1616 #, c-format msgid "second argument of cast function must be type %s" msgstr "el segundo argumento de la función de conversión debe ser de tipo %s" -#: commands/functioncmds.c:1622 +#: commands/functioncmds.c:1621 #, c-format msgid "third argument of cast function must be type %s" msgstr "el tercer argumento de la función de conversión debe ser de tipo %s" -#: commands/functioncmds.c:1629 +#: commands/functioncmds.c:1628 #, c-format msgid "return data type of cast function must match or be binary-coercible to target data type" msgstr "el tipo de salida de la función de conversión debe coincidir o ser binario-convertible con el tipo de retorno" -#: commands/functioncmds.c:1640 +#: commands/functioncmds.c:1639 #, c-format msgid "cast function must not be volatile" msgstr "la función de conversión no debe ser volatile" -#: commands/functioncmds.c:1645 +#: commands/functioncmds.c:1644 #, c-format msgid "cast function must be a normal function" msgstr "la función de conversión debe ser una función normal" -#: commands/functioncmds.c:1649 +#: commands/functioncmds.c:1648 #, c-format msgid "cast function must not return a set" msgstr "la función de conversión no debe retornar un conjunto" -#: commands/functioncmds.c:1675 +#: commands/functioncmds.c:1674 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "debe ser superusuario para crear una conversión sin especificar función" -#: commands/functioncmds.c:1690 +#: commands/functioncmds.c:1689 #, c-format msgid "source and target data types are not physically compatible" msgstr "los tipos de datos de origen y destino no son físicamente compatibles" -#: commands/functioncmds.c:1705 +#: commands/functioncmds.c:1709 #, c-format msgid "composite data types are not binary-compatible" msgstr "los tipos de datos compuestos no son binario-compatibles" -#: commands/functioncmds.c:1711 -#, c-format -msgid "enum data types are not binary-compatible" -msgstr "los tipos de datos enum no son binario-compatibles" - -#: commands/functioncmds.c:1717 +#: commands/functioncmds.c:1715 #, c-format msgid "array data types are not binary-compatible" msgstr "los tipos de datos de array no son binario-compatibles" -#: commands/functioncmds.c:1734 +#: commands/functioncmds.c:1723 +#, c-format +msgid "range data types are not binary-compatible" +msgstr "los tipos de datos de rango no son binario-compatibles" + +#: commands/functioncmds.c:1729 +#, c-format +msgid "enum data types are not binary-compatible" +msgstr "los tipos de datos enum no son binario-compatibles" + +#: commands/functioncmds.c:1746 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "los tipos de dato de dominio no deben ser marcados binario-compatibles" -#: commands/functioncmds.c:1744 +#: commands/functioncmds.c:1756 #, c-format msgid "source data type and target data type are the same" msgstr "el tipo de origen y el tipo de retorno son el mismo" -#: commands/functioncmds.c:1777 +#: commands/functioncmds.c:1789 #, c-format msgid "transform function must not be volatile" msgstr "la función de transformación no debe ser volatile" -#: commands/functioncmds.c:1781 +#: commands/functioncmds.c:1793 #, c-format msgid "transform function must be a normal function" msgstr "la función de transformación debe ser una función normal" -#: commands/functioncmds.c:1785 +#: commands/functioncmds.c:1797 #, c-format msgid "transform function must not return a set" msgstr "la función de transformación no debe retornar un conjunto" -#: commands/functioncmds.c:1789 +#: commands/functioncmds.c:1801 #, c-format msgid "transform function must take one argument" msgstr "la función de transformación debe recibir un argumento" -#: commands/functioncmds.c:1793 +#: commands/functioncmds.c:1805 #, c-format msgid "first argument of transform function must be type %s" msgstr "el primer argumento de la función de transformación debe ser de tipo %s" -#: commands/functioncmds.c:1832 +#: commands/functioncmds.c:1844 #, c-format msgid "data type %s is a pseudo-type" msgstr "el tipo de dato %s es un pseudo-tipo" -#: commands/functioncmds.c:1838 +#: commands/functioncmds.c:1850 #, c-format msgid "data type %s is a domain" msgstr "tipo de dato «%s» es un dominio" -#: commands/functioncmds.c:1878 +#: commands/functioncmds.c:1890 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "el tipo de dato de retorno de la función FROM SQL debe ser %s" -#: commands/functioncmds.c:1904 +#: commands/functioncmds.c:1916 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "el tipo de dato de retorno de la función TO SQL debe ser el tipo de dato de la transformación" -#: commands/functioncmds.c:1931 +#: commands/functioncmds.c:1943 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "la transformación para el tipo %s lenguaje «%s» ya existe" -#: commands/functioncmds.c:2017 +#: commands/functioncmds.c:2029 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "la transformación para el tipo %s lenguaje «%s» no existe" -#: commands/functioncmds.c:2041 +#: commands/functioncmds.c:2053 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "ya existe una función llamada %s en el esquema «%s»" -#: commands/functioncmds.c:2092 +#: commands/functioncmds.c:2104 #, c-format msgid "no inline code specified" msgstr "no se ha especificado código" -#: commands/functioncmds.c:2138 +#: commands/functioncmds.c:2150 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "el lenguaje «%s» no soporta ejecución de código en línea" -#: commands/functioncmds.c:2233 +#: commands/functioncmds.c:2245 #, c-format msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" msgstr[0] "no se pueden pasar más de %d argumento a un procedimiento" msgstr[1] "no se pueden pasar más de %d argumentos a un procedimiento" -#: commands/indexcmds.c:641 +#: commands/indexcmds.c:656 #, c-format msgid "must specify at least one column" msgstr "debe especificar al menos una columna" -#: commands/indexcmds.c:645 +#: commands/indexcmds.c:660 #, c-format msgid "cannot use more than %d columns in an index" msgstr "no se puede usar más de %d columnas en un índice" -#: commands/indexcmds.c:688 -#, fuzzy, c-format -#| msgid "cannot change relation \"%s\"" +#: commands/indexcmds.c:703 +#, c-format msgid "cannot create index on relation \"%s\"" -msgstr "no se puede cambiar la relación «%s»" +msgstr "no se puede crear índice en la relación «%s»" -#: commands/indexcmds.c:714 +#: commands/indexcmds.c:729 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "no se puede crear un índice en la tabla particionada «%s» concurrentemente" -#: commands/indexcmds.c:719 -#, c-format -msgid "cannot create exclusion constraints on partitioned table \"%s\"" -msgstr "no se pueden create restricciones de exclusión en la tabla particionada «%s»" - -#: commands/indexcmds.c:729 +#: commands/indexcmds.c:739 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "no se pueden crear índices en tablas temporales de otras sesiones" -#: commands/indexcmds.c:767 commands/tablecmds.c:784 commands/tablespace.c:1184 +#: commands/indexcmds.c:777 commands/tablecmds.c:818 commands/tablespace.c:1178 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "no se puede especificar el tablespace por omisión para las relaciones particionadas" -#: commands/indexcmds.c:799 commands/tablecmds.c:819 commands/tablecmds.c:3409 +#: commands/indexcmds.c:809 commands/tablecmds.c:849 commands/tablecmds.c:3588 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "sólo relaciones compartidas pueden ser puestas en el tablespace pg_global" -#: commands/indexcmds.c:832 +#: commands/indexcmds.c:842 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "sustituyendo el método de acceso obsoleto «rtree» por «gist»" -#: commands/indexcmds.c:853 +#: commands/indexcmds.c:863 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "el método de acceso «%s» no soporta índices únicos" -#: commands/indexcmds.c:858 +#: commands/indexcmds.c:868 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "el método de acceso «%s» no soporta columnas incluidas" -#: commands/indexcmds.c:863 +#: commands/indexcmds.c:873 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "el método de acceso «%s» no soporta índices multicolumna" -#: commands/indexcmds.c:868 +#: commands/indexcmds.c:878 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "el método de acceso «%s» no soporta restricciones de exclusión" -#: commands/indexcmds.c:995 +#: commands/indexcmds.c:1007 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "no se puede hacer coincidir la llave de partición a un índice usando el método de acceso «%s»" -#: commands/indexcmds.c:1005 +#: commands/indexcmds.c:1017 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "restricción %s no soportada con definición de llave de particionamiento" -#: commands/indexcmds.c:1007 +#: commands/indexcmds.c:1019 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "No se pueden usar restricciones %s cuando las llaves de particionamiento incluyen expresiones." -#: commands/indexcmds.c:1046 +#: commands/indexcmds.c:1069 +#, c-format +msgid "cannot match partition key to index on column \"%s\" using non-equal operator \"%s\"" +msgstr "no se puede hacer coincidir la llave de partición en la columna «%s» usando el operador «%s» que no es igualdad" + +#: commands/indexcmds.c:1085 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "las restricciones unique en tablas particionadas deben incluir todas las columnas de particionamiento" -#: commands/indexcmds.c:1047 +#: commands/indexcmds.c:1086 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "La restricción %s en la tabla «%s» no incluye la columna «%s» que es parte de la llave de particionamiento." -#: commands/indexcmds.c:1066 commands/indexcmds.c:1085 +#: commands/indexcmds.c:1105 commands/indexcmds.c:1124 #, c-format msgid "index creation on system columns is not supported" msgstr "la creación de índices en columnas de sistema no está soportada" -#: commands/indexcmds.c:1314 tcop/utility.c:1525 +#: commands/indexcmds.c:1354 tcop/utility.c:1515 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "no se puede crear un índice único en la tabla particionada «%s»" -#: commands/indexcmds.c:1316 tcop/utility.c:1527 +#: commands/indexcmds.c:1356 tcop/utility.c:1517 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "La tabla «%s» contiene particiones que son tablas foráneas." -#: commands/indexcmds.c:1811 +#: commands/indexcmds.c:1806 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "las funciones utilizadas en predicados de índice deben estar marcadas IMMUTABLE" -#: commands/indexcmds.c:1889 parser/parse_utilcmd.c:2513 -#: parser/parse_utilcmd.c:2648 +#: commands/indexcmds.c:1885 parser/parse_utilcmd.c:2519 +#: parser/parse_utilcmd.c:2654 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "no existe la columna «%s» en la llave" -#: commands/indexcmds.c:1913 parser/parse_utilcmd.c:1812 +#: commands/indexcmds.c:1909 parser/parse_utilcmd.c:1807 #, c-format msgid "expressions are not supported in included columns" msgstr "las expresiones no están soportadas en columnas incluidas" -#: commands/indexcmds.c:1954 +#: commands/indexcmds.c:1950 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "las funciones utilizadas en expresiones de índice deben estar marcadas IMMUTABLE" -#: commands/indexcmds.c:1969 +#: commands/indexcmds.c:1965 #, c-format msgid "including column does not support a collation" msgstr "la columna incluida no permite un ordenamiento (collation)" -#: commands/indexcmds.c:1973 +#: commands/indexcmds.c:1969 #, c-format msgid "including column does not support an operator class" msgstr "la columna incluida no permite una clase de operadores" -#: commands/indexcmds.c:1977 +#: commands/indexcmds.c:1973 #, c-format msgid "including column does not support ASC/DESC options" msgstr "la columna incluida no permite las opciones ASC/DESC" -#: commands/indexcmds.c:1981 +#: commands/indexcmds.c:1977 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "la columna incluida no permite las opciones NULLS FIRST/LAST" -#: commands/indexcmds.c:2022 +#: commands/indexcmds.c:2020 #, c-format msgid "could not determine which collation to use for index expression" msgstr "no se pudo determinar qué ordenamiento (collation) usar para la expresión de índice" -#: commands/indexcmds.c:2030 commands/tablecmds.c:17497 commands/typecmds.c:807 -#: parser/parse_expr.c:2662 parser/parse_type.c:568 parser/parse_utilcmd.c:3774 -#: utils/adt/misc.c:586 +#: commands/indexcmds.c:2028 commands/tablecmds.c:18185 commands/typecmds.c:811 +#: parser/parse_expr.c:2785 parser/parse_type.c:568 parser/parse_utilcmd.c:3771 +#: utils/adt/misc.c:630 #, c-format msgid "collations are not supported by type %s" msgstr "los ordenamientos (collation) no están soportados por el tipo %s" @@ -8968,55 +9257,55 @@ msgstr "el método de acceso «%s» no soporta las opciones ASC/DESC" msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "el método de acceso «%s» no soporta las opciones NULLS FIRST/LAST" -#: commands/indexcmds.c:2212 commands/tablecmds.c:17522 -#: commands/tablecmds.c:17528 commands/typecmds.c:2301 +#: commands/indexcmds.c:2210 commands/tablecmds.c:18210 +#: commands/tablecmds.c:18216 commands/typecmds.c:2311 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "el tipo de dato %s no tiene una clase de operadores por omisión para el método de acceso «%s»" -#: commands/indexcmds.c:2214 +#: commands/indexcmds.c:2212 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." msgstr "Debe especificar una clase de operadores para el índice, o definir una clase de operadores por omisión para el tipo de datos." -#: commands/indexcmds.c:2243 commands/indexcmds.c:2251 +#: commands/indexcmds.c:2241 commands/indexcmds.c:2249 #: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "no existe la clase de operadores «%s» para el método de acceso «%s»" -#: commands/indexcmds.c:2265 commands/typecmds.c:2289 +#: commands/indexcmds.c:2263 commands/typecmds.c:2299 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "la clase de operadores «%s» no acepta el tipo de datos %s" -#: commands/indexcmds.c:2355 +#: commands/indexcmds.c:2353 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "hay múltiples clases de operadores por omisión para el tipo de datos %s" -#: commands/indexcmds.c:2683 +#: commands/indexcmds.c:2681 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "opción de REINDEX «%s» no reconocida" -#: commands/indexcmds.c:2910 +#: commands/indexcmds.c:2913 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "la tabla «%s» no tiene índices que puedan ser reindexados concurrentemente" -#: commands/indexcmds.c:2924 +#: commands/indexcmds.c:2927 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "la tabla «%s» no tiene índices para reindexar" -#: commands/indexcmds.c:2969 commands/indexcmds.c:3483 -#: commands/indexcmds.c:3611 +#: commands/indexcmds.c:2974 commands/indexcmds.c:3485 +#: commands/indexcmds.c:3615 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "no se pueden reindexar catálogos de sistema concurrentemente" -#: commands/indexcmds.c:2993 +#: commands/indexcmds.c:2998 #, c-format msgid "can only reindex the currently open database" msgstr "sólo se puede reindexar la base de datos actualmente abierta" @@ -9041,73 +9330,77 @@ msgstr "al reindexar tabla particionada «%s.%s»" msgid "while reindexing partitioned index \"%s.%s\"" msgstr "al reindexar índice particionado «%s.%s»" -#: commands/indexcmds.c:3363 commands/indexcmds.c:4219 +#: commands/indexcmds.c:3365 commands/indexcmds.c:4241 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "la tabla «%s.%s» fue reindexada" -#: commands/indexcmds.c:3515 commands/indexcmds.c:3567 +#: commands/indexcmds.c:3517 commands/indexcmds.c:3570 +#, c-format +msgid "skipping reindex of invalid index \"%s.%s\"" +msgstr "omitiendo reindexar índice no válido «%s.%s»" + +#: commands/indexcmds.c:3520 commands/indexcmds.c:3573 #, c-format -msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" -msgstr "no se puede reindexar el índice no válido «%s.%s» concurrentemente, omitiendo" +msgid "Use DROP INDEX or REINDEX INDEX." +msgstr "Use DROP INDEX o REINDEX INDEX." -#: commands/indexcmds.c:3521 +#: commands/indexcmds.c:3524 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "no se puede reindexar el índice de restricción de exclusión «%s.%s» concurrentemente, omitiendo" -#: commands/indexcmds.c:3676 +#: commands/indexcmds.c:3680 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "no se puede reindexar este tipo de relación concurrentemente" -#: commands/indexcmds.c:3697 +#: commands/indexcmds.c:3698 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "no se puede mover relación no compartida al tablespace «%s»" -#: commands/indexcmds.c:4200 commands/indexcmds.c:4212 +#: commands/indexcmds.c:4222 commands/indexcmds.c:4234 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "el índice «%s.%s» fue reindexado" -#: commands/indexcmds.c:4202 commands/indexcmds.c:4221 +#: commands/indexcmds.c:4224 commands/indexcmds.c:4243 #, c-format msgid "%s." msgstr "%s." -#: commands/lockcmds.c:93 -#, fuzzy, c-format -#| msgid "cannot lock rows in relation \"%s\"" +#: commands/lockcmds.c:91 +#, c-format msgid "cannot lock relation \"%s\"" -msgstr "no se puede bloquear registros en la tabla «%s»" +msgstr "no se puede bloquear la relación «%s»" -#: commands/matview.c:194 +#: commands/matview.c:206 #, c-format msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "no se puede usar CONCURRENTLY cuando la vista materializada no contiene datos" -#: commands/matview.c:200 gram.y:18370 +#: commands/matview.c:212 gram.y:18918 #, c-format msgid "%s and %s options cannot be used together" msgstr "las opciones %s y %s no pueden usarse juntas" -#: commands/matview.c:257 +#: commands/matview.c:269 #, c-format msgid "cannot refresh materialized view \"%s\" concurrently" msgstr "no se puede refrescar la vista materializada «%s» concurrentemente" -#: commands/matview.c:260 +#: commands/matview.c:272 #, c-format msgid "Create a unique index with no WHERE clause on one or more columns of the materialized view." msgstr "Cree un índice único sin cláusula WHERE en una o más columnas de la vista materializada." -#: commands/matview.c:654 +#: commands/matview.c:666 #, c-format msgid "new data for materialized view \"%s\" contains duplicate rows without any null columns" msgstr "nuevos datos para la vista materializada «%s» contiene filas duplicadas sin columnas nulas" -#: commands/matview.c:656 +#: commands/matview.c:668 #, c-format msgid "Row: %s" msgstr "Fila: %s" @@ -9309,27 +9602,27 @@ msgstr "el número de operador %d para (%s,%s) aparece más de una vez" msgid "operator %d(%s,%s) already exists in operator family \"%s\"" msgstr "ya existe un operador %d(%s,%s) en la familia de operadores «%s»" -#: commands/opclasscmds.c:1566 +#: commands/opclasscmds.c:1589 #, c-format msgid "function %d(%s,%s) already exists in operator family \"%s\"" msgstr "ya existe una función %d(%s,%s) en la familia de operador «%s»" -#: commands/opclasscmds.c:1647 +#: commands/opclasscmds.c:1744 #, c-format msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" msgstr "no existe el operador %d(%s,%s) en la familia de operadores «%s»" -#: commands/opclasscmds.c:1687 +#: commands/opclasscmds.c:1784 #, c-format msgid "function %d(%s,%s) does not exist in operator family \"%s\"" msgstr "no existe la función %d(%s,%s) en la familia de operadores «%s»" -#: commands/opclasscmds.c:1718 +#: commands/opclasscmds.c:1815 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "ya existe una clase de operadores «%s» para el método de acceso «%s» en el esquema «%s»" -#: commands/opclasscmds.c:1741 +#: commands/opclasscmds.c:1838 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "ya existe una familia de operadores «%s» para el método de acceso «%s» en el esquema «%s»" @@ -9339,7 +9632,7 @@ msgstr "ya existe una familia de operadores «%s» para el método de acceso «% msgid "SETOF type not allowed for operator argument" msgstr "no se permite un tipo SETOF en los argumentos de un operador" -#: commands/operatorcmds.c:154 commands/operatorcmds.c:481 +#: commands/operatorcmds.c:154 commands/operatorcmds.c:554 #, c-format msgid "operator attribute \"%s\" not recognized" msgstr "el atributo de operador «%s» no es reconocido" @@ -9379,53 +9672,70 @@ msgstr "la función de estimación de join %s tiene múltiples coincidencias" msgid "join estimator function %s must return type %s" msgstr "la función de estimación de join %s debe retornar tipo %s" -#: commands/operatorcmds.c:475 +#: commands/operatorcmds.c:388 parser/parse_oper.c:119 parser/parse_oper.c:637 +#: utils/adt/regproc.c:509 utils/adt/regproc.c:683 +#, c-format +msgid "operator does not exist: %s" +msgstr "el operador no existe: %s" + +#: commands/operatorcmds.c:396 parser/parse_oper.c:702 parser/parse_oper.c:815 +#, c-format +msgid "operator is only a shell: %s" +msgstr "el operador está inconcluso: %s" + +#: commands/operatorcmds.c:548 #, c-format msgid "operator attribute \"%s\" cannot be changed" msgstr "el atributo de operador «%s» no puede ser cambiado" -#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 -#: commands/tablecmds.c:1616 commands/tablecmds.c:2219 -#: commands/tablecmds.c:3520 commands/tablecmds.c:6369 -#: commands/tablecmds.c:9181 commands/tablecmds.c:17090 -#: commands/tablecmds.c:17125 commands/trigger.c:323 commands/trigger.c:1339 -#: commands/trigger.c:1449 rewrite/rewriteDefine.c:275 -#: rewrite/rewriteDefine.c:786 rewrite/rewriteRemove.c:80 +#: commands/operatorcmds.c:615 commands/operatorcmds.c:622 +#: commands/operatorcmds.c:628 commands/operatorcmds.c:634 +#, c-format +msgid "operator attribute \"%s\" cannot be changed if it has already been set" +msgstr "el atributo de operador «%s» no puede ser cambiado si ya se ha establecido" + +#: commands/policy.c:86 commands/policy.c:379 commands/statscmds.c:146 +#: commands/tablecmds.c:1740 commands/tablecmds.c:2340 +#: commands/tablecmds.c:3702 commands/tablecmds.c:6605 +#: commands/tablecmds.c:9637 commands/tablecmds.c:17772 +#: commands/tablecmds.c:17807 commands/trigger.c:316 commands/trigger.c:1332 +#: commands/trigger.c:1442 rewrite/rewriteDefine.c:268 +#: rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "permiso denegado: «%s» es un catálogo de sistema" -#: commands/policy.c:172 +#: commands/policy.c:169 #, c-format msgid "ignoring specified roles other than PUBLIC" msgstr "ignorando los roles especificados que no son PUBLIC" -#: commands/policy.c:173 +#: commands/policy.c:170 #, c-format msgid "All roles are members of the PUBLIC role." msgstr "Todos los roles son miembros del rol PUBLIC." -#: commands/policy.c:606 +#: commands/policy.c:603 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "WITH CHECK no puede ser aplicado a SELECT o DELETE" -#: commands/policy.c:615 commands/policy.c:918 +#: commands/policy.c:612 commands/policy.c:915 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "sólo se permite una expresión WITH CHECK para INSERT" -#: commands/policy.c:689 commands/policy.c:1141 +#: commands/policy.c:686 commands/policy.c:1138 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "la política «%s» para la tabla «%s» ya existe" -#: commands/policy.c:890 commands/policy.c:1169 commands/policy.c:1240 +#: commands/policy.c:887 commands/policy.c:1166 commands/policy.c:1237 #, c-format msgid "policy \"%s\" for table \"%s\" does not exist" msgstr "no existe la política «%s» para la tabla «%s»" -#: commands/policy.c:908 +#: commands/policy.c:905 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "sólo se permite una expresión USING para SELECT, DELETE" @@ -9441,271 +9751,244 @@ msgid "cannot create a cursor WITH HOLD within security-restricted operation" msgstr "no se puede crear un cursor WITH HOLD dentro de una operación restringida por seguridad" #: commands/portalcmds.c:189 commands/portalcmds.c:242 -#: executor/execCurrent.c:70 utils/adt/xml.c:2844 utils/adt/xml.c:3014 +#: executor/execCurrent.c:70 utils/adt/xml.c:2936 utils/adt/xml.c:3106 #, c-format msgid "cursor \"%s\" does not exist" msgstr "no existe el cursor «%s»" -#: commands/prepare.c:75 +#: commands/prepare.c:72 #, c-format msgid "invalid statement name: must not be empty" msgstr "el nombre de sentencia no es válido: no debe ser vacío" -#: commands/prepare.c:230 commands/prepare.c:235 +#: commands/prepare.c:227 commands/prepare.c:232 #, c-format msgid "prepared statement is not a SELECT" msgstr "la sentencia preparada no es un SELECT" -#: commands/prepare.c:295 +#: commands/prepare.c:292 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "el número de parámetros es incorrecto en la sentencia preparada «%s»" -#: commands/prepare.c:297 +#: commands/prepare.c:294 #, c-format msgid "Expected %d parameters but got %d." msgstr "Se esperaban %d parámetros pero se obtuvieron %d." -#: commands/prepare.c:330 +#: commands/prepare.c:327 #, c-format msgid "parameter $%d of type %s cannot be coerced to the expected type %s" msgstr "el parámetro $%d de tipo %s no puede ser convertido al tipo esperado %s" -#: commands/prepare.c:414 +#: commands/prepare.c:411 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "la sentencia preparada «%s» ya existe" -#: commands/prepare.c:453 +#: commands/prepare.c:450 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "no existe la sentencia preparada «%s»" -#: commands/proclang.c:68 +#: commands/proclang.c:66 #, c-format msgid "must be superuser to create custom procedural language" msgstr "debe ser superusuario para crear un lenguaje procedural personalizado" -#: commands/publicationcmds.c:131 postmaster/postmaster.c:1205 -#: postmaster/postmaster.c:1303 storage/file/fd.c:3861 -#: utils/init/miscinit.c:1815 +#: commands/publicationcmds.c:124 postmaster/postmaster.c:1108 +#: postmaster/postmaster.c:1210 utils/init/miscinit.c:1865 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "la sintaxis de lista no es válida para el parámetro «%s»" -#: commands/publicationcmds.c:150 -#, fuzzy, c-format -#| msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" +#: commands/publicationcmds.c:143 +#, c-format msgid "unrecognized value for publication option \"%s\": \"%s\"" -msgstr "valor no reconocido para la opción de EXPLAIN «%s»: «%s»" +msgstr "valor no reconocido para la opción de publicación «%s»: «%s»" -#: commands/publicationcmds.c:164 +#: commands/publicationcmds.c:157 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "parámetro de publicación no reconocido: «%s»" -#: commands/publicationcmds.c:205 -#, fuzzy, c-format -#| msgid "no schema has been selected to create in" +#: commands/publicationcmds.c:198 +#, c-format msgid "no schema has been selected for CURRENT_SCHEMA" -msgstr "no se ha seleccionado ningún esquema dentro del cual crear" +msgstr "no se ha seleccionado ningún esquema para CURRENT_SCHEMA" -#: commands/publicationcmds.c:502 -#, fuzzy -#| msgid "System catalog modifications are currently disallowed." +#: commands/publicationcmds.c:495 msgid "System columns are not allowed." -msgstr "Las modificaciones al catálogo del sistema están actualmente deshabilitadas." +msgstr "Las columnas de sistema no son permitidas." -#: commands/publicationcmds.c:509 commands/publicationcmds.c:514 -#: commands/publicationcmds.c:531 -#, fuzzy -#| msgid "grouping operations are not allowed in %s" +#: commands/publicationcmds.c:502 commands/publicationcmds.c:507 +#: commands/publicationcmds.c:524 msgid "User-defined operators are not allowed." -msgstr "no se permiten operaciones «grouping» en %s" +msgstr "Los operadores definidos por el usuario no están permitidos." -#: commands/publicationcmds.c:555 +#: commands/publicationcmds.c:548 msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." -msgstr "" +msgstr "Sólo columnas, constantes, operadores built-in, tipos de datos built-in, configuraciones regionales built-in y funciones built-in inmutables son permitidas." -#: commands/publicationcmds.c:567 -#, fuzzy -#| msgid "set-returning functions are not allowed in %s" +#: commands/publicationcmds.c:560 msgid "User-defined types are not allowed." -msgstr "no se permiten funciones que retornan conjuntos en %s" +msgstr "Los tipos definidos por el usuario no están permitidos." -#: commands/publicationcmds.c:570 -#, fuzzy -#| msgid "set-returning functions are not allowed in %s" +#: commands/publicationcmds.c:563 msgid "User-defined or built-in mutable functions are not allowed." -msgstr "no se permiten funciones que retornan conjuntos en %s" +msgstr "Las funciones definidas por el usuario, o las que son mutables, no están permitidas." -#: commands/publicationcmds.c:573 -#, fuzzy -#| msgid "set-returning functions are not allowed in %s" +#: commands/publicationcmds.c:566 msgid "User-defined collations are not allowed." -msgstr "no se permiten funciones que retornan conjuntos en %s" +msgstr "Los «collations» definidos por el usuario no están permitidos." -#: commands/publicationcmds.c:583 -#, fuzzy, c-format -#| msgid "invalid publication_names syntax" +#: commands/publicationcmds.c:576 +#, c-format msgid "invalid publication WHERE expression" -msgstr "sintaxis de publication_names no válida" +msgstr "sintaxis de cláusula WHERE de publicación no válida" -#: commands/publicationcmds.c:636 -#, fuzzy, c-format -#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +#: commands/publicationcmds.c:629 +#, c-format msgid "cannot use publication WHERE clause for relation \"%s\"" -msgstr "no se puede modificar la restricción «%s» en la relación «%s»" +msgstr "no se puede usar cláusula WHERE de la publicación para la relación «%s»" -#: commands/publicationcmds.c:638 +#: commands/publicationcmds.c:631 #, c-format msgid "WHERE clause cannot be used for a partitioned table when %s is false." -msgstr "" +msgstr "la cláusula WHERE no puede ser usada para una tabla particionada cuando %s es falso." -#: commands/publicationcmds.c:709 commands/publicationcmds.c:723 -#, fuzzy, c-format -#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +#: commands/publicationcmds.c:702 commands/publicationcmds.c:716 +#, c-format msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" -msgstr "no se puede modificar la restricción «%s» en la relación «%s»" +msgstr "no se puede usar lista de columnas para la relación «%s.%s» en la publicación «%s»" -#: commands/publicationcmds.c:712 +#: commands/publicationcmds.c:705 #, c-format msgid "Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements." -msgstr "" +msgstr "Las listas de columnas no pueden ser especificadas en publicaciones que contienen elementos FOR TABLES IN SCHEMA." -#: commands/publicationcmds.c:726 +#: commands/publicationcmds.c:719 #, c-format msgid "Column lists cannot be specified for partitioned tables when %s is false." -msgstr "" +msgstr "Las listas de columnas no pueden ser especificadas para tablas particionadas cuando %s es falso." -#: commands/publicationcmds.c:761 +#: commands/publicationcmds.c:754 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "debe ser superusuario para crear publicaciones FOR ALL TABLES" -#: commands/publicationcmds.c:832 -#, fuzzy, c-format -#| msgid "must be superuser to create FOR ALL TABLES publication" +#: commands/publicationcmds.c:825 +#, c-format msgid "must be superuser to create FOR TABLES IN SCHEMA publication" -msgstr "debe ser superusuario para crear publicaciones FOR ALL TABLES" +msgstr "debe ser superusuario para crear publicaciones FOR TABLES IN SCHEMA" -#: commands/publicationcmds.c:868 +#: commands/publicationcmds.c:861 #, c-format -msgid "wal_level is insufficient to publish logical changes" -msgstr "wal_level es insuficiente para publicar cambios lógicos" +msgid "\"wal_level\" is insufficient to publish logical changes" +msgstr "«wal_level» es insuficiente para publicar cambios lógicos" -#: commands/publicationcmds.c:869 -#, fuzzy, c-format -#| msgid "Set wal_level to logical before creating subscriptions." -msgid "Set wal_level to \"logical\" before creating subscriptions." -msgstr "Cambie wal_level a logical antes de crear suscripciones." +#: commands/publicationcmds.c:862 +#, c-format +msgid "Set \"wal_level\" to \"logical\" before creating subscriptions." +msgstr "Cambie «wal_level» a «logical» antes de crear suscripciones." -#: commands/publicationcmds.c:965 commands/publicationcmds.c:973 -#, fuzzy, c-format -#| msgid "cannot set parameter \"%s\" within security-definer function" +#: commands/publicationcmds.c:958 commands/publicationcmds.c:966 +#, c-format msgid "cannot set parameter \"%s\" to false for publication \"%s\"" -msgstr "no se puede definir el parámetro «%s» dentro una función security-definer" +msgstr "no se puede definir el parámetro «%s» a falso para la publicación «%s»" -#: commands/publicationcmds.c:968 +#: commands/publicationcmds.c:961 #, c-format msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." msgstr "La publicación contiene una cláusula WHERE para la tabla particionada «%s», que no está permitido cuando «%s» es falso." -#: commands/publicationcmds.c:976 +#: commands/publicationcmds.c:969 #, c-format msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." msgstr "La publicación contiene una lista de columns para la tabla particionada «%s», que no está permitido cuando «%s» es falso." -#: commands/publicationcmds.c:1299 -#, fuzzy, c-format -#| msgid "cannot add schema \"%s\" to publication" +#: commands/publicationcmds.c:1292 +#, c-format msgid "cannot add schema to publication \"%s\"" -msgstr "no se puede agregar el esquema «%s» a la partición" +msgstr "no se puede agregar el esquema «%s» a la publicación" -#: commands/publicationcmds.c:1301 -#, fuzzy, c-format -#| msgid "Schema cannot be added if any table that specifies column list is already part of the publication." +#: commands/publicationcmds.c:1294 +#, c-format msgid "Schemas cannot be added if any tables that specify a column list are already part of the publication." -msgstr "Un esquema no puede añadirse si cualquiera tabla que especifica una lista de columnas es parte de la publicación" +msgstr "Los esquemas no pueden ser añadidos si alguna tabla que especifica una lista de columnas ya es parte de la publicación." -#: commands/publicationcmds.c:1349 +#: commands/publicationcmds.c:1342 #, c-format msgid "must be superuser to add or set schemas" msgstr "debe ser superusuario para agregar o definir esquemas" -#: commands/publicationcmds.c:1358 commands/publicationcmds.c:1366 +#: commands/publicationcmds.c:1351 commands/publicationcmds.c:1359 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "la publicación \"%s\" se define como FOR ALL TABLES" -#: commands/publicationcmds.c:1360 -#, fuzzy, c-format -#| msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." +#: commands/publicationcmds.c:1353 +#, c-format msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." -msgstr "Las tablas no se pueden agregar ni eliminar de las publicaciones FOR ALL TABLES." +msgstr "No se pueden agregar ni eliminar esquemas de las publicaciones FOR ALL TABLES." -#: commands/publicationcmds.c:1368 +#: commands/publicationcmds.c:1361 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "Las tablas no se pueden agregar ni eliminar de las publicaciones FOR ALL TABLES." -#: commands/publicationcmds.c:1392 commands/publicationcmds.c:1431 -#: commands/publicationcmds.c:1968 utils/cache/lsyscache.c:3592 +#: commands/publicationcmds.c:1385 commands/publicationcmds.c:1424 +#: commands/publicationcmds.c:1961 utils/cache/lsyscache.c:3634 #, c-format msgid "publication \"%s\" does not exist" msgstr "no existe la publicación «%s»" -#: commands/publicationcmds.c:1594 commands/publicationcmds.c:1657 -#, fuzzy, c-format -#| msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" +#: commands/publicationcmds.c:1587 commands/publicationcmds.c:1650 +#, c-format msgid "conflicting or redundant WHERE clauses for table \"%s\"" -msgstr "declaraciones NULL/NOT NULL en conflicto o redundantes para la columna «%s»" +msgstr "cláusulas WHERE en conflicto o redundantes para la tabla «%s»" -#: commands/publicationcmds.c:1601 commands/publicationcmds.c:1669 -#, fuzzy, c-format -#| msgid "conflicting or redundant options" +#: commands/publicationcmds.c:1594 commands/publicationcmds.c:1662 +#, c-format msgid "conflicting or redundant column lists for table \"%s\"" -msgstr "opciones contradictorias o redundantes" +msgstr "listas de columnas contradictorias o redundantes para la tabla «%s»" -#: commands/publicationcmds.c:1803 -#, fuzzy, c-format -#| msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" +#: commands/publicationcmds.c:1796 +#, c-format msgid "column list must not be specified in ALTER PUBLICATION ... DROP" -msgstr "los tipos de los argumentos de operador deben ser especificados en ALTER OPERATOR FAMILY" +msgstr "la lista de columnas no debe ser especificada en ALTER PUBLICATION ... DROP" -#: commands/publicationcmds.c:1815 +#: commands/publicationcmds.c:1808 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "relación «%s» no es parte de la publicación" -#: commands/publicationcmds.c:1822 +#: commands/publicationcmds.c:1815 #, c-format msgid "cannot use a WHERE clause when removing a table from a publication" msgstr "no se puede usar una cláusula WHERE cuando se elimina una tabla de una publicación" -#: commands/publicationcmds.c:1882 -#, fuzzy, c-format -#| msgid "relation \"%s\" is not part of the publication" +#: commands/publicationcmds.c:1875 +#, c-format msgid "tables from schema \"%s\" are not part of the publication" -msgstr "relación «%s» no es parte de la publicación" +msgstr "las tablas del esquema «%s» no son parte de la publicación" -#: commands/publicationcmds.c:1925 commands/publicationcmds.c:1932 +#: commands/publicationcmds.c:1918 commands/publicationcmds.c:1925 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "se ha denegado el permiso para cambiar el dueño de la publicación «%s»" -#: commands/publicationcmds.c:1927 +#: commands/publicationcmds.c:1920 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "El dueño de una publicación FOR ALL TABLES debe ser un superusuario." -#: commands/publicationcmds.c:1934 -#, fuzzy, c-format -#| msgid "The owner of a FOR ALL TABLES publication must be a superuser." +#: commands/publicationcmds.c:1927 +#, c-format msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." -msgstr "El dueño de una publicación FOR ALL TABLES debe ser un superusuario." +msgstr "El dueño de una publicación FOR TABLES IN SCHEMA debe ser un superusuario." -#: commands/publicationcmds.c:2000 +#: commands/publicationcmds.c:1993 #, c-format msgid "publication with OID %u does not exist" msgstr "no existe la publicación con OID %u" @@ -9746,3260 +10029,3266 @@ msgid "security labels are not supported for this type of object" msgstr "las etiquetas de seguirdad no están soportadas para este tipo de objeto" #: commands/seclabel.c:193 -#, fuzzy, c-format -#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +#, c-format msgid "cannot set security label on relation \"%s\"" -msgstr "no se puede modificar la restricción «%s» en la relación «%s»" +msgstr "no se puede definir la etiqueta de seguridad en la relación «%s»" -#: commands/sequence.c:754 +#: commands/sequence.c:748 #, c-format msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" -msgstr "" +msgstr "nextval: se alcanzó el valor máximo de la secuencia «%s» (%lld)" -#: commands/sequence.c:773 +#: commands/sequence.c:767 #, c-format msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" -msgstr "" +msgstr "nextval: se alcanzó el valor mínimo de la secuencia «%s» (%lld)" -#: commands/sequence.c:891 +#: commands/sequence.c:886 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "currval de la secuencia «%s» no está definido en esta sesión" -#: commands/sequence.c:910 commands/sequence.c:916 +#: commands/sequence.c:905 commands/sequence.c:911 #, c-format msgid "lastval is not yet defined in this session" msgstr "lastval no está definido en esta sesión" -#: commands/sequence.c:996 -#, fuzzy, c-format -#| msgid "value %s out of bounds for option \"%s\"" +#: commands/sequence.c:991 +#, c-format msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" -msgstr "el valor %s está fuera del rango de la opción «%s»" +msgstr "setval: el valor %lld está fuera del rango para la secuencia «%s» (%lld..%lld)" -#: commands/sequence.c:1365 +#: commands/sequence.c:1357 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "opción de secuencia no válida SEQUENCE NAME" -#: commands/sequence.c:1391 +#: commands/sequence.c:1383 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "el tipo de columna de identidad debe ser smallint, integer o bigint" -#: commands/sequence.c:1392 +#: commands/sequence.c:1384 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "el tipo de secuencia debe ser smallint, integer o bigint" -#: commands/sequence.c:1426 +#: commands/sequence.c:1418 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT no debe ser cero" -#: commands/sequence.c:1474 -#, fuzzy, c-format -#| msgid "value \"%s\" is out of range for type %s" +#: commands/sequence.c:1466 +#, c-format msgid "MAXVALUE (%lld) is out of range for sequence data type %s" -msgstr "el valor «%s» está fuera de rango para el tipo %s" +msgstr "el MAXVALUE (%lld) está fuera de rango para el tipo de la secuencia %s" -#: commands/sequence.c:1506 -#, fuzzy, c-format -#| msgid "value \"%s\" is out of range for type %s" +#: commands/sequence.c:1498 +#, c-format msgid "MINVALUE (%lld) is out of range for sequence data type %s" -msgstr "el valor «%s» está fuera de rango para el tipo %s" +msgstr "el MINVALUE (%lld) está fuera de rango para el tipo de la secuencia %s" -#: commands/sequence.c:1514 +#: commands/sequence.c:1506 #, c-format msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" -msgstr "" +msgstr "MINVALUE (%lld) debe ser menor que MAXVALUE (%lld)" -#: commands/sequence.c:1535 +#: commands/sequence.c:1527 #, c-format msgid "START value (%lld) cannot be less than MINVALUE (%lld)" -msgstr "" +msgstr "el valor START (%lld) no puede ser menor que MINVALUE (%lld)" -#: commands/sequence.c:1541 +#: commands/sequence.c:1533 #, c-format msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" -msgstr "" +msgstr "el valor START (%lld) no puede ser mayor que el MAXVALUE (%lld)" -#: commands/sequence.c:1565 +#: commands/sequence.c:1557 #, c-format msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" -msgstr "" +msgstr "el valor RESTART (%lld) no puede ser menor que MINVALUE (%lld)" -#: commands/sequence.c:1571 +#: commands/sequence.c:1563 #, c-format msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" -msgstr "" +msgstr "el valor RESTART (%lld) no puede ser mayor que MAXVALUE (%lld)" -#: commands/sequence.c:1582 -#, fuzzy, c-format -#| msgid "stride must be greater than zero" +#: commands/sequence.c:1574 +#, c-format msgid "CACHE (%lld) must be greater than zero" -msgstr "el intervalo de paso (stride) debe ser mayor que cero" +msgstr "el CACHE (%lld) debe ser mayor que cero" -#: commands/sequence.c:1618 +#: commands/sequence.c:1610 #, c-format msgid "invalid OWNED BY option" msgstr "opción OWNED BY no válida" -#: commands/sequence.c:1619 +#: commands/sequence.c:1611 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "Especifique OWNED BY tabla.columna o OWNED BY NONE." -#: commands/sequence.c:1644 -#, fuzzy, c-format -#| msgid "cannot move system relation \"%s\"" +#: commands/sequence.c:1636 +#, c-format msgid "sequence cannot be owned by relation \"%s\"" -msgstr "no se puede mover la relación de sistema «%s»" +msgstr "la secuencia no puede ser poseída por la relación «%s»" -#: commands/sequence.c:1652 +#: commands/sequence.c:1644 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "la secuencia debe tener el mismo dueño que la tabla a la que está enlazada" -#: commands/sequence.c:1656 +#: commands/sequence.c:1648 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "la secuencia debe estar en el mismo esquema que la tabla a la que está enlazada" -#: commands/sequence.c:1678 +#: commands/sequence.c:1670 #, c-format msgid "cannot change ownership of identity sequence" msgstr "no se puede cambiar el dueño de la secuencia de identidad" -#: commands/sequence.c:1679 commands/tablecmds.c:13891 -#: commands/tablecmds.c:16488 +#: commands/sequence.c:1671 commands/tablecmds.c:14486 +#: commands/tablecmds.c:17181 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "La secuencia «%s» está enlazada a la tabla «%s»." -#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1886 +#: commands/statscmds.c:106 commands/statscmds.c:115 tcop/utility.c:1883 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "sólo se permite una relación en CREATE STATISTICS" -#: commands/statscmds.c:136 -#, fuzzy, c-format -#| msgid "cannot rewrite system relation \"%s\"" +#: commands/statscmds.c:133 +#, c-format msgid "cannot define statistics for relation \"%s\"" -msgstr "no se puede reescribir la relación de sistema «%s»" +msgstr "no se puede definir estadísticas para la relación «%s»" -#: commands/statscmds.c:190 +#: commands/statscmds.c:187 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "el objeto de estadísticas «%s» ya existe, omitiendo" -#: commands/statscmds.c:198 +#: commands/statscmds.c:195 #, c-format msgid "statistics object \"%s\" already exists" msgstr "el objeto de estadísticas «%s» ya existe" -#: commands/statscmds.c:209 +#: commands/statscmds.c:206 #, c-format msgid "cannot have more than %d columns in statistics" msgstr "no se puede tener más de %d columnas en estadísticas" -#: commands/statscmds.c:250 commands/statscmds.c:273 commands/statscmds.c:307 +#: commands/statscmds.c:247 commands/statscmds.c:270 commands/statscmds.c:304 #, c-format msgid "statistics creation on system columns is not supported" msgstr "la creación de estadísticas en columnas de sistema no está soportada" -#: commands/statscmds.c:257 commands/statscmds.c:280 +#: commands/statscmds.c:254 commands/statscmds.c:277 #, c-format msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" msgstr "la columna «%s» no puede ser usado en estadísticas porque su tipo %s no tiene una clase de operadores por omisión para btree" -#: commands/statscmds.c:324 +#: commands/statscmds.c:321 #, c-format msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" msgstr "la expresión no puede ser usada en estadísticas multivariantes porque su tipo %s no tiene una clase de operadores por omisión para btree" -#: commands/statscmds.c:345 +#: commands/statscmds.c:342 #, c-format msgid "when building statistics on a single expression, statistics kinds may not be specified" msgstr "al crear estadísticas sobre una sola expresión, no se deben especificar tipos de estadísticas" -#: commands/statscmds.c:374 +#: commands/statscmds.c:371 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "tipo de estadísticas «%s» no reconocido" -#: commands/statscmds.c:403 +#: commands/statscmds.c:400 #, c-format msgid "extended statistics require at least 2 columns" msgstr "las estadísticas extendidas requieren al menos 2 columnas" -#: commands/statscmds.c:421 +#: commands/statscmds.c:418 #, c-format msgid "duplicate column name in statistics definition" msgstr "nombre de columna duplicado en definición de estadísticas" -#: commands/statscmds.c:456 +#: commands/statscmds.c:453 #, c-format msgid "duplicate expression in statistics definition" msgstr "expresión duplicada en definición de estadísticas" -#: commands/statscmds.c:619 commands/tablecmds.c:8180 +#: commands/statscmds.c:628 commands/tablecmds.c:8620 #, c-format msgid "statistics target %d is too low" msgstr "el valor de estadísticas %d es demasiado bajo" -#: commands/statscmds.c:627 commands/tablecmds.c:8188 +#: commands/statscmds.c:636 commands/tablecmds.c:8628 #, c-format msgid "lowering statistics target to %d" msgstr "bajando el valor de estadísticas a %d" -#: commands/statscmds.c:650 +#: commands/statscmds.c:660 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "no existe el objeto de estadísticas «%s.%s», omitiendo" -#: commands/subscriptioncmds.c:271 commands/subscriptioncmds.c:359 +#: commands/subscriptioncmds.c:275 commands/subscriptioncmds.c:372 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "parámetro de suscripción no reconocido: «%s»" -#: commands/subscriptioncmds.c:327 replication/pgoutput/pgoutput.c:398 -#, fuzzy, c-format -#| msgid "unrecognized \"publish\" value: \"%s\"" +#: commands/subscriptioncmds.c:340 replication/pgoutput/pgoutput.c:404 +#, c-format msgid "unrecognized origin value: \"%s\"" -msgstr "valor de «publish» no reconocido: «%s»" +msgstr "valor de origen no reconocido: «%s»" -#: commands/subscriptioncmds.c:350 -#, fuzzy, c-format -#| msgid "invalid WAL location: \"%s\"" +#: commands/subscriptioncmds.c:363 +#, c-format msgid "invalid WAL location (LSN): %s" -msgstr "ubicación de WAL no válida: «%s»" +msgstr "ubicación de WAL (LSN) no válida: %s" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:374 commands/subscriptioncmds.c:381 -#: commands/subscriptioncmds.c:388 commands/subscriptioncmds.c:410 -#: commands/subscriptioncmds.c:426 +#: commands/subscriptioncmds.c:387 commands/subscriptioncmds.c:394 +#: commands/subscriptioncmds.c:401 commands/subscriptioncmds.c:423 +#: commands/subscriptioncmds.c:439 #, c-format msgid "%s and %s are mutually exclusive options" msgstr "%s y %s son opciones mutuamente excluyentes" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:416 commands/subscriptioncmds.c:432 +#: commands/subscriptioncmds.c:429 commands/subscriptioncmds.c:445 #, c-format msgid "subscription with %s must also set %s" msgstr "suscripción con %s también debe activar %s" -#: commands/subscriptioncmds.c:494 -#, fuzzy, c-format -#| msgid "could not receive list of replicated tables from the publisher: %s" +#: commands/subscriptioncmds.c:506 +#, c-format msgid "could not receive list of publications from the publisher: %s" -msgstr "no se pudo recibir la lista de tablas replicadas desde el editor (publisher): %s" +msgstr "no se pudo recibir la lista de publicaciones desde el publicador: %s" -#: commands/subscriptioncmds.c:526 -#, fuzzy, c-format -#| msgid "publication \"%s\" does not exist" +#: commands/subscriptioncmds.c:538 +#, c-format msgid "publication %s does not exist on the publisher" msgid_plural "publications %s do not exist on the publisher" -msgstr[0] "no existe la publicación «%s»" -msgstr[1] "no existe la publicación «%s»" +msgstr[0] "no existe la publicación «%s» en el “publisherâ€" +msgstr[1] "no existen las publicaciones «%s» en el “publisherâ€" + +#: commands/subscriptioncmds.c:626 +#, c-format +msgid "permission denied to create subscription" +msgstr "permiso denegado a crear suscripción" -#: commands/subscriptioncmds.c:614 -#, fuzzy, c-format -#| msgid "must be superuser to create subscriptions" -msgid "must have privileges of pg_create_subscription to create subscriptions" -msgstr "debe ser superusuario para crear suscripciones" +#: commands/subscriptioncmds.c:627 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may create subscriptions." +msgstr "Sólo los roles con privilegio del rol «%s» pueden crear suscripciones." -#: commands/subscriptioncmds.c:743 commands/subscriptioncmds.c:876 -#: replication/logical/tablesync.c:1304 replication/logical/worker.c:4616 +#: commands/subscriptioncmds.c:758 commands/subscriptioncmds.c:891 +#: commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1345 +#: replication/logical/worker.c:4503 #, c-format msgid "could not connect to the publisher: %s" -msgstr "no se pudo connectar con el editor (publisher): %s" +msgstr "no se pudo connectar con el publicador: %s" -#: commands/subscriptioncmds.c:814 +#: commands/subscriptioncmds.c:829 #, c-format msgid "created replication slot \"%s\" on publisher" -msgstr "se creó el slot de replicación «%s» en el editor (publisher)" +msgstr "se creó el slot de replicación «%s» en el publicador" -#: commands/subscriptioncmds.c:826 -#, fuzzy, c-format -#| msgid "subscription has no replication slot set" +#: commands/subscriptioncmds.c:841 +#, c-format msgid "subscription was created, but is not connected" -msgstr "la suscripción no tiene un slot de replicación establecido" +msgstr "la suscripción fue creada, pero no está conectada" -#: commands/subscriptioncmds.c:827 +#: commands/subscriptioncmds.c:842 #, c-format msgid "To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription." -msgstr "" +msgstr "Para iniciar la replicacióñ, debe manualmente crear el slot de replicación, activar la suscripción, y refrescar la suscripción." -#: commands/subscriptioncmds.c:1094 commands/subscriptioncmds.c:1500 -#: commands/subscriptioncmds.c:1883 utils/cache/lsyscache.c:3642 +#: commands/subscriptioncmds.c:1109 commands/subscriptioncmds.c:1590 +#: commands/subscriptioncmds.c:1973 utils/cache/lsyscache.c:3684 #, c-format msgid "subscription \"%s\" does not exist" msgstr "no existe la suscripción «%s»" -#: commands/subscriptioncmds.c:1150 +#: commands/subscriptioncmds.c:1166 commands/subscriptioncmds.c:1245 #, c-format msgid "cannot set %s for enabled subscription" msgstr "no se puede establecer %s para la suscripción activada" -#: commands/subscriptioncmds.c:1225 +#: commands/subscriptioncmds.c:1233 +#, c-format +msgid "cannot set option \"%s\" for a subscription that does not have a slot name" +msgstr "no se puede definir la opción «%s†para una suscripción que no tiene un nombre de slot" + +#: commands/subscriptioncmds.c:1279 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "no se puede habilitar la suscripción que no tiene un nombre de slot" -#: commands/subscriptioncmds.c:1269 commands/subscriptioncmds.c:1320 +#: commands/subscriptioncmds.c:1323 commands/subscriptioncmds.c:1374 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION con actualización no está permitido para las suscripciones desactivadas" -#: commands/subscriptioncmds.c:1270 +#: commands/subscriptioncmds.c:1324 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1279 commands/subscriptioncmds.c:1334 -#, fuzzy, c-format -#| msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" +#: commands/subscriptioncmds.c:1333 commands/subscriptioncmds.c:1388 +#, c-format msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" -msgstr "ALTER SUBSCRIPTION con actualización no está permitido para las suscripciones desactivadas" +msgstr "ALTER SUBSCRIPTION con «refresh» y «copy_data» no está permitido cuando «two_phase» está activo" -#: commands/subscriptioncmds.c:1280 -#, fuzzy, c-format -#| msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +#: commands/subscriptioncmds.c:1334 +#, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." -msgstr "Use ALTER SUBSCRIPTION ... REFRESH con copy_data = false, o use DROP/CREATE SUBSCRIPTION." - -#. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1322 -#, fuzzy, c-format -#| msgid "Use views instead." -msgid "Use %s instead." -msgstr "Use vistas en su lugar." +msgstr "Use ALTER SUBSCRIPTION ... SET PUBLICATION con refresh = false, o con copy_data=false, o use DROP/CREATE SUBSCRIPTION." #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1336 -#, fuzzy, c-format -#| msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +#: commands/subscriptioncmds.c:1390 +#, c-format msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." -msgstr "Use ALTER SUBSCRIPTION ... REFRESH con copy_data = false, o use DROP/CREATE SUBSCRIPTION." +msgstr "Use %s con refresh = false, o con copy_data = false, o use DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1358 +#: commands/subscriptioncmds.c:1412 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH no está permitido para las suscripciones desactivadas" -#: commands/subscriptioncmds.c:1383 -#, fuzzy, c-format -#| msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" +#: commands/subscriptioncmds.c:1437 +#, c-format msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" -msgstr "ALTER SUBSCRIPTION ... REFRESH no está permitido para las suscripciones desactivadas" +msgstr "ALTER SUBSCRIPTION ... REFRESH con copy_data no está permitido cuando two_phase está activo" -#: commands/subscriptioncmds.c:1384 +#: commands/subscriptioncmds.c:1438 #, c-format msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "Use ALTER SUBSCRIPTION ... REFRESH con copy_data = false, o use DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1419 +#: commands/subscriptioncmds.c:1473 #, c-format msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" msgstr "la ubicación de WAL a saltar (LSN %X/%X) debe ser mayor que el LSN de origen %X/%X" -#: commands/subscriptioncmds.c:1504 +#: commands/subscriptioncmds.c:1594 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "no existe la suscripción «%s», omitiendo" -#: commands/subscriptioncmds.c:1773 +#: commands/subscriptioncmds.c:1863 #, c-format msgid "dropped replication slot \"%s\" on publisher" -msgstr "eliminando el slot de replicación «%s» en editor (publisher)" +msgstr "eliminando el slot de replicación «%s» en publicador" -#: commands/subscriptioncmds.c:1782 commands/subscriptioncmds.c:1790 +#: commands/subscriptioncmds.c:1872 commands/subscriptioncmds.c:1880 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" -msgstr "no se pudo eliminar el slot de replicación «%s» en editor (publisher): %s" +msgstr "no se pudo eliminar el slot de replicación «%s» en publicador: %s" -#: commands/subscriptioncmds.c:1915 +#: commands/subscriptioncmds.c:2005 #, c-format msgid "subscription with OID %u does not exist" msgstr "no existe la suscripción con OID %u" -#: commands/subscriptioncmds.c:1986 commands/subscriptioncmds.c:2111 +#: commands/subscriptioncmds.c:2076 commands/subscriptioncmds.c:2201 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" -msgstr "no se pudo recibir la lista de tablas replicadas desde el editor (publisher): %s" +msgstr "no se pudo recibir la lista de tablas replicadas desde el publicador: %s" -#: commands/subscriptioncmds.c:2022 +#: commands/subscriptioncmds.c:2112 #, c-format msgid "subscription \"%s\" requested copy_data with origin = NONE but might copy data that had a different origin" -msgstr "" +msgstr "la suscripción «%s» pidió copy_data con origin = NONE pero podría copiar datos que tenían un origen diferente" -#: commands/subscriptioncmds.c:2024 -#, fuzzy, c-format -#| msgid "relation \"%s\" is not part of the publication" -msgid "Subscribed publication %s is subscribing to other publications." -msgid_plural "Subscribed publications %s are subscribing to other publications." -msgstr[0] "relación «%s» no es parte de la publicación" -msgstr[1] "relación «%s» no es parte de la publicación" +#: commands/subscriptioncmds.c:2114 +#, c-format +msgid "The subscription being created subscribes to a publication (%s) that contains tables that are written to by other subscriptions." +msgid_plural "The subscription being created subscribes to publications (%s) that contain tables that are written to by other subscriptions." +msgstr[0] "La suscripción que está siendo creada suscribe a una publicación (%s) que contiene tablas que están siendo escritas por otras suscripciones." +msgstr[1] "La suscripción que está siendo creada suscribe a publicaciones (%s) que contienen tablas que están siendo escritas por otras suscripciones." -#: commands/subscriptioncmds.c:2027 +#: commands/subscriptioncmds.c:2117 #, c-format msgid "Verify that initial data copied from the publisher tables did not come from other origins." -msgstr "" +msgstr "Verifique que los datos iniciales copiados desde el publicador no vinieron de otros orígenes." -#: commands/subscriptioncmds.c:2133 replication/logical/tablesync.c:875 -#: replication/pgoutput/pgoutput.c:1115 -#, fuzzy, c-format -#| msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" +#: commands/subscriptioncmds.c:2223 replication/logical/tablesync.c:906 +#: replication/pgoutput/pgoutput.c:1143 +#, c-format msgid "cannot use different column lists for table \"%s.%s\" in different publications" -msgstr "no se puede usar ONLY para una llave foránea en la tabla particionada «%s» haciendo referencia a la relación «%s»" +msgstr "no se puede usar distintas listas de columnas para la tabla «%s.%s» en distintas publicaciones" -#: commands/subscriptioncmds.c:2183 +#: commands/subscriptioncmds.c:2273 #, c-format msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" -msgstr "no se pudo conectar con el editor (publisher) al intentar eliminar el slot de replicación \"%s\": %s" +msgstr "no se pudo conectar con el publicador al intentar eliminar el slot de replicación \"%s\": %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:2186 +#: commands/subscriptioncmds.c:2276 #, c-format -msgid "Use %s to disassociate the subscription from the slot." -msgstr "Use %s para disociar la suscripción del slot." +msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." +msgstr "Use %s para desactivar la suscripción, luego use %s para disociarla del slot." -#: commands/subscriptioncmds.c:2216 +#: commands/subscriptioncmds.c:2307 #, c-format msgid "publication name \"%s\" used more than once" msgstr "nombre de publicación «%s» usado más de una vez" -#: commands/subscriptioncmds.c:2260 +#: commands/subscriptioncmds.c:2351 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "la publicación «%s» ya existe en la suscripción «%s»" -#: commands/subscriptioncmds.c:2274 +#: commands/subscriptioncmds.c:2365 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "la publicación «%s» no está en la suscripción «%s»" -#: commands/subscriptioncmds.c:2285 +#: commands/subscriptioncmds.c:2376 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "no se puede eliminar todas las publicaciones de una suscripción" -#: commands/subscriptioncmds.c:2342 -#, fuzzy, c-format -#| msgid "%s requires a Boolean value" +#: commands/subscriptioncmds.c:2433 +#, c-format msgid "%s requires a Boolean value or \"parallel\"" -msgstr "«%s» requiere un valor lógico (booleano)" +msgstr "«%s» requiere un valor lógico (booleano) o “parallelâ€" -#: commands/tablecmds.c:246 commands/tablecmds.c:288 +#: commands/tablecmds.c:255 commands/tablecmds.c:297 #, c-format msgid "table \"%s\" does not exist" msgstr "no existe la tabla «%s»" -#: commands/tablecmds.c:247 commands/tablecmds.c:289 +#: commands/tablecmds.c:256 commands/tablecmds.c:298 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "la tabla «%s» no existe, omitiendo" -#: commands/tablecmds.c:249 commands/tablecmds.c:291 +#: commands/tablecmds.c:258 commands/tablecmds.c:300 msgid "Use DROP TABLE to remove a table." msgstr "Use DROP TABLE para eliminar una tabla." -#: commands/tablecmds.c:252 +#: commands/tablecmds.c:261 #, c-format msgid "sequence \"%s\" does not exist" msgstr "no existe la secuencia «%s»" -#: commands/tablecmds.c:253 +#: commands/tablecmds.c:262 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "la secuencia «%s» no existe, omitiendo" -#: commands/tablecmds.c:255 +#: commands/tablecmds.c:264 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "Use DROP SEQUENCE para eliminar una secuencia." -#: commands/tablecmds.c:258 +#: commands/tablecmds.c:267 #, c-format msgid "view \"%s\" does not exist" msgstr "no existe la vista «%s»" -#: commands/tablecmds.c:259 +#: commands/tablecmds.c:268 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "la vista «%s» no existe, omitiendo" -#: commands/tablecmds.c:261 +#: commands/tablecmds.c:270 msgid "Use DROP VIEW to remove a view." msgstr "Use DROP VIEW para eliminar una vista." -#: commands/tablecmds.c:264 +#: commands/tablecmds.c:273 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "no existe la vista materializada «%s»" -#: commands/tablecmds.c:265 +#: commands/tablecmds.c:274 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "la vista materializada «%s» no existe, omitiendo" -#: commands/tablecmds.c:267 +#: commands/tablecmds.c:276 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "Use DROP MATERIALIZED VIEW para eliminar una vista materializada." -#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19002 -#: parser/parse_utilcmd.c:2245 +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19805 +#: parser/parse_utilcmd.c:2251 #, c-format msgid "index \"%s\" does not exist" msgstr "no existe el índice «%s»" -#: commands/tablecmds.c:271 commands/tablecmds.c:295 +#: commands/tablecmds.c:280 commands/tablecmds.c:304 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "el índice «%s» no existe, omitiendo" -#: commands/tablecmds.c:273 commands/tablecmds.c:297 +#: commands/tablecmds.c:282 commands/tablecmds.c:306 msgid "Use DROP INDEX to remove an index." msgstr "Use DROP INDEX para eliminar un índice." -#: commands/tablecmds.c:278 +#: commands/tablecmds.c:287 #, c-format msgid "\"%s\" is not a type" msgstr "«%s» no es un tipo" -#: commands/tablecmds.c:279 +#: commands/tablecmds.c:288 msgid "Use DROP TYPE to remove a type." msgstr "Use DROP TYPE para eliminar un tipo." -#: commands/tablecmds.c:282 commands/tablecmds.c:13730 -#: commands/tablecmds.c:16193 +#: commands/tablecmds.c:291 commands/tablecmds.c:14325 +#: commands/tablecmds.c:16886 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "no existe la tabla foránea «%s»" -#: commands/tablecmds.c:283 +#: commands/tablecmds.c:292 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "la tabla foránea «%s» no existe, omitiendo" -#: commands/tablecmds.c:285 +#: commands/tablecmds.c:294 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Use DROP FOREIGN TABLE para eliminar una tabla foránea." -#: commands/tablecmds.c:700 +#: commands/tablecmds.c:734 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT sólo puede ser usado en tablas temporales" -#: commands/tablecmds.c:731 +#: commands/tablecmds.c:765 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "no se puede crear una tabla temporal dentro una operación restringida por seguridad" -#: commands/tablecmds.c:767 commands/tablecmds.c:15038 +#: commands/tablecmds.c:801 commands/tablecmds.c:15745 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "se heredaría de la relación «%s» más de una vez" -#: commands/tablecmds.c:955 -#, c-format -msgid "specifying a table access method is not supported on a partitioned table" -msgstr "especificar un método de acceso de tablas no está soportado en tablas particionadas" - -#: commands/tablecmds.c:1048 +#: commands/tablecmds.c:1067 #, c-format msgid "\"%s\" is not partitioned" msgstr "«%s» no está particionada" -#: commands/tablecmds.c:1142 +#: commands/tablecmds.c:1161 #, c-format msgid "cannot partition using more than %d columns" msgstr "no se puede particionar usando más de %d columnas" -#: commands/tablecmds.c:1198 +#: commands/tablecmds.c:1217 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "no se puede crear una partición foránea en la tabla particionada «%s»" -#: commands/tablecmds.c:1200 +#: commands/tablecmds.c:1219 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "La tabla «%s» contiene índices que son únicos." -#: commands/tablecmds.c:1365 +#: commands/tablecmds.c:1338 commands/tablecmds.c:13341 +#, c-format +msgid "too many array dimensions" +msgstr "demasiadas dimensiones de array" + +#: commands/tablecmds.c:1343 parser/parse_clause.c:774 +#: parser/parse_relation.c:1912 +#, c-format +msgid "column \"%s\" cannot be declared SETOF" +msgstr "la columna «%s» no puede ser declarada SETOF" + +#: commands/tablecmds.c:1489 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY no soporta eliminar múltiples objetos" -#: commands/tablecmds.c:1369 +#: commands/tablecmds.c:1493 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY no soporta CASCADE" -#: commands/tablecmds.c:1473 +#: commands/tablecmds.c:1597 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "no se puede eliminar el índice particionado «%s» concurrentemente" -#: commands/tablecmds.c:1761 +#: commands/tablecmds.c:1885 #, c-format msgid "cannot truncate only a partitioned table" msgstr "no se puede truncar ONLY una tabla particionada" -#: commands/tablecmds.c:1762 +#: commands/tablecmds.c:1886 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "No especifique la opción ONLY, o ejecute TRUNCATE ONLY en las particiones directamente." -#: commands/tablecmds.c:1835 +#: commands/tablecmds.c:1959 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "truncando además la tabla «%s»" -#: commands/tablecmds.c:2199 +#: commands/tablecmds.c:2320 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "no se puede truncar la tabla foránea «%s»" -#: commands/tablecmds.c:2256 +#: commands/tablecmds.c:2377 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "no se pueden truncar tablas temporales de otras sesiones" -#: commands/tablecmds.c:2488 commands/tablecmds.c:14935 +#: commands/tablecmds.c:2606 commands/tablecmds.c:15642 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "no se puede heredar de la tabla particionada «%s»" -#: commands/tablecmds.c:2493 +#: commands/tablecmds.c:2611 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "no se puede heredar de la partición «%s»" -#: commands/tablecmds.c:2501 parser/parse_utilcmd.c:2475 -#: parser/parse_utilcmd.c:2617 +#: commands/tablecmds.c:2619 parser/parse_utilcmd.c:2481 +#: parser/parse_utilcmd.c:2623 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "la relación heredada «%s» no es una tabla o tabla foránea" -#: commands/tablecmds.c:2513 +#: commands/tablecmds.c:2631 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "no se puede crear una relación temporal como partición de la relación permanente «%s»" -#: commands/tablecmds.c:2522 commands/tablecmds.c:14914 +#: commands/tablecmds.c:2640 commands/tablecmds.c:15621 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "no se puede heredar de la tabla temporal «%s»" -#: commands/tablecmds.c:2532 commands/tablecmds.c:14922 +#: commands/tablecmds.c:2650 commands/tablecmds.c:15629 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "no se puede heredar de una tabla temporal de otra sesión" -#: commands/tablecmds.c:2585 +#: commands/tablecmds.c:2791 commands/tablecmds.c:2845 +#: commands/tablecmds.c:13024 parser/parse_utilcmd.c:1265 +#: parser/parse_utilcmd.c:1308 parser/parse_utilcmd.c:1735 +#: parser/parse_utilcmd.c:1843 #, c-format -msgid "merging multiple inherited definitions of column \"%s\"" -msgstr "mezclando múltiples definiciones heredadas de la columna «%s»" +msgid "cannot convert whole-row table reference" +msgstr "no se puede convertir una referencia a la fila completa (whole-row)" -#: commands/tablecmds.c:2597 +#: commands/tablecmds.c:2792 parser/parse_utilcmd.c:1266 #, c-format -msgid "inherited column \"%s\" has a type conflict" -msgstr "columna heredada «%s» tiene conflicto de tipos" +msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "La expresión de generación para la columna «%s» contiene una referencia a la fila completa (whole-row) de la tabla «%s»." -#: commands/tablecmds.c:2599 commands/tablecmds.c:2628 -#: commands/tablecmds.c:2647 commands/tablecmds.c:2919 -#: commands/tablecmds.c:2955 commands/tablecmds.c:2971 -#: parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 -#: parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 -#: parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 -#: parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 -#: parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 -#: parser/parse_param.c:223 +#: commands/tablecmds.c:2846 parser/parse_utilcmd.c:1309 #, c-format -msgid "%s versus %s" -msgstr "%s versus %s" +msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "La restricción «%s» contiene una referencia a la fila completa (whole-row) de la tabla «%s»." -#: commands/tablecmds.c:2612 +#: commands/tablecmds.c:2956 commands/tablecmds.c:3227 #, c-format -msgid "inherited column \"%s\" has a collation conflict" -msgstr "columna heredada «%s» tiene conflicto de ordenamiento (collation)" +msgid "column \"%s\" inherits from generated column but specifies default" +msgstr "la columna «%s» hereda de una columna generada pero especifica un valor por omisión" -#: commands/tablecmds.c:2614 commands/tablecmds.c:2935 -#: commands/tablecmds.c:6849 +#: commands/tablecmds.c:2961 commands/tablecmds.c:3232 #, c-format -msgid "\"%s\" versus \"%s\"" -msgstr "«%s» versus «%s»" +msgid "column \"%s\" inherits from generated column but specifies identity" +msgstr "la columna «%s» hereda de una columna generada pero especifica una identidad" -#: commands/tablecmds.c:2626 +#: commands/tablecmds.c:2969 commands/tablecmds.c:3240 #, c-format -msgid "inherited column \"%s\" has a storage parameter conflict" -msgstr "columna heredada «%s» tiene conflicto de parámetros de almacenamiento" +msgid "child column \"%s\" specifies generation expression" +msgstr "la columna hija «%s» especifica una expresión de generación de columna" -#: commands/tablecmds.c:2645 commands/tablecmds.c:2969 +#: commands/tablecmds.c:2971 commands/tablecmds.c:3242 #, c-format -msgid "column \"%s\" has a compression method conflict" -msgstr "la columna «%s» tiene conflicto de método de compresión" +msgid "A child table column cannot be generated unless its parent column is." +msgstr "Una columna de tabla hija no puede ser generada a menos que su columna padre lo sea." -#: commands/tablecmds.c:2661 +#: commands/tablecmds.c:3017 #, c-format -msgid "inherited column \"%s\" has a generation conflict" -msgstr "columna heredada «%s» tiene conflicto de generación" +msgid "column \"%s\" inherits conflicting generation expressions" +msgstr "la columna «%s» hereda expresiones de generación en conflicto" -#: commands/tablecmds.c:2767 commands/tablecmds.c:2822 -#: commands/tablecmds.c:12456 parser/parse_utilcmd.c:1298 -#: parser/parse_utilcmd.c:1341 parser/parse_utilcmd.c:1740 -#: parser/parse_utilcmd.c:1848 +#: commands/tablecmds.c:3019 #, c-format -msgid "cannot convert whole-row table reference" -msgstr "no se puede convertir una referencia a la fila completa (whole-row)" +msgid "To resolve the conflict, specify a generation expression explicitly." +msgstr "Para resolver el conflicto, indique explícitamente una expresión de generación." -#: commands/tablecmds.c:2768 parser/parse_utilcmd.c:1299 +#: commands/tablecmds.c:3023 #, c-format -msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." -msgstr "La expresión de generación para la columna «%s» contiene una referencia a la fila completa (whole-row) de la tabla «%s»." +msgid "column \"%s\" inherits conflicting default values" +msgstr "la columna «%s» hereda valores por omisión no coincidentes" -#: commands/tablecmds.c:2823 parser/parse_utilcmd.c:1342 +#: commands/tablecmds.c:3025 #, c-format -msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." -msgstr "La restricción «%s» contiene una referencia a la fila completa (whole-row) de la tabla «%s»." +msgid "To resolve the conflict, specify a default explicitly." +msgstr "Para resolver el conflicto, indique explícitamente un valor por omisión." + +#: commands/tablecmds.c:3080 +#, c-format +msgid "check constraint name \"%s\" appears multiple times but with different expressions" +msgstr "la restricción «check» «%s» aparece más de una vez con diferentes expresiones" -#: commands/tablecmds.c:2901 +#: commands/tablecmds.c:3131 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "mezclando la columna «%s» con la definición heredada" -#: commands/tablecmds.c:2905 +#: commands/tablecmds.c:3135 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "moviendo y mezclando la columna «%s» con la definición heredada" -#: commands/tablecmds.c:2906 +#: commands/tablecmds.c:3136 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "La columna especificada por el usuario fue movida a la posición de la columna heredada." -#: commands/tablecmds.c:2917 +#: commands/tablecmds.c:3148 #, c-format msgid "column \"%s\" has a type conflict" msgstr "la columna «%s» tiene conflicto de tipos" -#: commands/tablecmds.c:2933 +#: commands/tablecmds.c:3150 commands/tablecmds.c:3184 +#: commands/tablecmds.c:3200 commands/tablecmds.c:3307 +#: commands/tablecmds.c:3340 commands/tablecmds.c:3356 +#: parser/parse_coerce.c:2192 parser/parse_coerce.c:2212 +#: parser/parse_coerce.c:2232 parser/parse_coerce.c:2253 +#: parser/parse_coerce.c:2308 parser/parse_coerce.c:2342 +#: parser/parse_coerce.c:2418 parser/parse_coerce.c:2449 +#: parser/parse_coerce.c:2488 parser/parse_coerce.c:2555 +#: parser/parse_param.c:223 +#, c-format +msgid "%s versus %s" +msgstr "%s versus %s" + +#: commands/tablecmds.c:3162 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "la columna «%s» tiene conflicto de ordenamientos (collation)" -#: commands/tablecmds.c:2953 +#: commands/tablecmds.c:3164 commands/tablecmds.c:3326 +#: commands/tablecmds.c:7080 #, c-format -msgid "column \"%s\" has a storage parameter conflict" -msgstr "la columna «%s» tiene conflicto de parámetros de almacenamiento" +msgid "\"%s\" versus \"%s\"" +msgstr "«%s» versus «%s»" -#: commands/tablecmds.c:2999 commands/tablecmds.c:3086 +#: commands/tablecmds.c:3182 #, c-format -msgid "column \"%s\" inherits from generated column but specifies default" -msgstr "la columna «%s» hereda de una columna generada pero especifica un valor por omisión" +msgid "column \"%s\" has a storage parameter conflict" +msgstr "la columna «%s» tiene conflicto de parámetros de almacenamiento" -#: commands/tablecmds.c:3004 commands/tablecmds.c:3091 +#: commands/tablecmds.c:3198 commands/tablecmds.c:3354 #, c-format -msgid "column \"%s\" inherits from generated column but specifies identity" -msgstr "la columna «%s» hereda de una columna generada pero especifica una identidad" +msgid "column \"%s\" has a compression method conflict" +msgstr "la columna «%s» tiene conflicto de método de compresión" -#: commands/tablecmds.c:3012 commands/tablecmds.c:3099 +#: commands/tablecmds.c:3293 #, c-format -msgid "child column \"%s\" specifies generation expression" -msgstr "la columna hija «%s» especifica una expresión de generación de columna" - -#: commands/tablecmds.c:3014 commands/tablecmds.c:3101 -#, fuzzy, c-format -#| msgid "A generated column cannot reference another generated column." -msgid "A child table column cannot be generated unless its parent column is." -msgstr "Una columna generada no puede hacer referencia a otra columna generada." +msgid "merging multiple inherited definitions of column \"%s\"" +msgstr "mezclando múltiples definiciones heredadas de la columna «%s»" -#: commands/tablecmds.c:3147 +#: commands/tablecmds.c:3305 #, c-format -msgid "column \"%s\" inherits conflicting generation expressions" -msgstr "la columna «%s» hereda expresiones de generación en conflicto" - -#: commands/tablecmds.c:3149 -#, fuzzy, c-format -#| msgid "To resolve the conflict, specify a default explicitly." -msgid "To resolve the conflict, specify a generation expression explicitly." -msgstr "Para resolver el conflicto, indique explícitamente un valor por omisión." +msgid "inherited column \"%s\" has a type conflict" +msgstr "columna heredada «%s» tiene conflicto de tipos" -#: commands/tablecmds.c:3153 +#: commands/tablecmds.c:3324 #, c-format -msgid "column \"%s\" inherits conflicting default values" -msgstr "la columna «%s» hereda valores por omisión no coincidentes" +msgid "inherited column \"%s\" has a collation conflict" +msgstr "columna heredada «%s» tiene conflicto de ordenamiento (collation)" -#: commands/tablecmds.c:3155 +#: commands/tablecmds.c:3338 #, c-format -msgid "To resolve the conflict, specify a default explicitly." -msgstr "Para resolver el conflicto, indique explícitamente un valor por omisión." +msgid "inherited column \"%s\" has a storage parameter conflict" +msgstr "columna heredada «%s» tiene conflicto de parámetros de almacenamiento" -#: commands/tablecmds.c:3205 +#: commands/tablecmds.c:3366 #, c-format -msgid "check constraint name \"%s\" appears multiple times but with different expressions" -msgstr "la restricción «check» «%s» aparece más de una vez con diferentes expresiones" +msgid "inherited column \"%s\" has a generation conflict" +msgstr "columna heredada «%s» tiene conflicto de generación" -#: commands/tablecmds.c:3418 +#: commands/tablecmds.c:3597 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "no se pueden mover tablas temporales de otras sesiones" -#: commands/tablecmds.c:3488 +#: commands/tablecmds.c:3670 #, c-format msgid "cannot rename column of typed table" msgstr "no se puede cambiar el nombre a una columna de una tabla tipada" -#: commands/tablecmds.c:3507 -#, fuzzy, c-format -#| msgid "cannot alter inherited column \"%s\" of relation \"%s\"" +#: commands/tablecmds.c:3689 +#, c-format msgid "cannot rename columns of relation \"%s\"" -msgstr "no se puede alterar la columna heredada «%s» de la relación «%s»" +msgstr "no se puede cambiar el nombre de columnas de la relación «%s»" -#: commands/tablecmds.c:3602 +#: commands/tablecmds.c:3784 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "debe cambiar el nombre a la columna heredada «%s» en las tablas hijas también" -#: commands/tablecmds.c:3634 +#: commands/tablecmds.c:3816 #, c-format msgid "cannot rename system column \"%s\"" msgstr "no se puede cambiar el nombre a la columna de sistema «%s»" -#: commands/tablecmds.c:3649 +#: commands/tablecmds.c:3831 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "no se puede cambiar el nombre a la columna heredada «%s»" -#: commands/tablecmds.c:3801 +#: commands/tablecmds.c:3983 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "debe cambiar el nombre a la restricción heredada «%s» en las tablas hijas también" -#: commands/tablecmds.c:3808 +#: commands/tablecmds.c:3990 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "no se puede cambiar el nombre a la restricción heredada «%s»" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4105 +#: commands/tablecmds.c:4290 #, c-format msgid "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "no se puede hacer %s en «%s» porque está siendo usada por consultas activas en esta sesión" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4114 +#: commands/tablecmds.c:4299 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" -msgstr "no se puede hacer %s en «%s» porque tiene eventos de disparador pendientes" +msgstr "no se puede hacer %s en «%s» porque tiene eventos de “trigger†pendientes" + +#: commands/tablecmds.c:4325 +#, c-format +msgid "cannot alter temporary tables of other sessions" +msgstr "no se pueden alterar tablas temporales de otras sesiones" -#: commands/tablecmds.c:4581 +#: commands/tablecmds.c:4798 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "no se puede modificar la partición «%s» teniendo un desprendimiento incompleto" -#: commands/tablecmds.c:4774 commands/tablecmds.c:4789 +#: commands/tablecmds.c:5002 commands/tablecmds.c:5017 #, c-format msgid "cannot change persistence setting twice" msgstr "no se puede cambiar la opción de persistencia dos veces" -#: commands/tablecmds.c:4810 -#, fuzzy, c-format -#| msgid "cannot change inheritance of partitioned table" -msgid "cannot change access method of a partitioned table" -msgstr "no se puede cambiar la herencia de una tabla particionada" - -#: commands/tablecmds.c:4816 -#, fuzzy, c-format -#| msgid "cannot have multiple SET TABLESPACE subcommands" +#: commands/tablecmds.c:5038 +#, c-format msgid "cannot have multiple SET ACCESS METHOD subcommands" -msgstr "no se pueden tener múltiples subórdenes SET TABLESPACE" +msgstr "no se pueden tener múltiples subórdenes SET ACCESS METHOD" -#: commands/tablecmds.c:5537 +#: commands/tablecmds.c:5768 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "no se puede reescribir la relación de sistema «%s»" -#: commands/tablecmds.c:5543 +#: commands/tablecmds.c:5774 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "no se puede reescribir la tabla «%s» que es usada como tabla de catálogo" -#: commands/tablecmds.c:5553 +#: commands/tablecmds.c:5786 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "no se puede reescribir tablas temporales de otras sesiones" -#: commands/tablecmds.c:6048 +#: commands/tablecmds.c:6281 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "la columna «%s» de la relación «%s» contiene valores null" -#: commands/tablecmds.c:6065 +#: commands/tablecmds.c:6298 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "la restricción check «%s» de la relación «%s» es violada por alguna fila" -#: commands/tablecmds.c:6084 partitioning/partbounds.c:3388 +#: commands/tablecmds.c:6317 partitioning/partbounds.c:3387 #, c-format msgid "updated partition constraint for default partition \"%s\" would be violated by some row" msgstr "la restricción de partición actualizada para la partición default «%s» sería violada por alguna fila" -#: commands/tablecmds.c:6090 +#: commands/tablecmds.c:6323 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "la restricción de partición de la relación «%s» es violada por alguna fila" #. translator: %s is a group of some SQL keywords -#: commands/tablecmds.c:6352 -#, fuzzy, c-format -#| msgid "relation \"%s\" is not a parent of relation \"%s\"" +#: commands/tablecmds.c:6588 +#, c-format msgid "ALTER action %s cannot be performed on relation \"%s\"" -msgstr "relación «%s» no es un padre de la relación «%s»" +msgstr "la acción ALTER %s no puede ser efecutada en la relación «%s»" -#: commands/tablecmds.c:6607 commands/tablecmds.c:6614 +#: commands/tablecmds.c:6843 commands/tablecmds.c:6850 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "no se puede alterar el tipo «%s» porque la columna «%s.%s» lo usa" -#: commands/tablecmds.c:6621 +#: commands/tablecmds.c:6857 #, c-format msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "no se puede alterar la tabla foránea «%s» porque la columna «%s.%s» usa su tipo de registro" -#: commands/tablecmds.c:6628 +#: commands/tablecmds.c:6864 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "no se puede alterar la tabla «%s» porque la columna «%s.%s» usa su tipo de registro" -#: commands/tablecmds.c:6684 +#: commands/tablecmds.c:6920 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "no se puede cambiar el tipo «%s» porque es el tipo de una tabla tipada" -#: commands/tablecmds.c:6686 +#: commands/tablecmds.c:6922 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "Use ALTER ... CASCADE para eliminar además las tablas tipadas." -#: commands/tablecmds.c:6732 +#: commands/tablecmds.c:6968 #, c-format msgid "type %s is not a composite type" msgstr "el tipo %s no es un tipo compuesto" -#: commands/tablecmds.c:6759 +#: commands/tablecmds.c:6995 #, c-format msgid "cannot add column to typed table" msgstr "no se puede agregar una columna a una tabla tipada" -#: commands/tablecmds.c:6812 +#: commands/tablecmds.c:7043 #, c-format msgid "cannot add column to a partition" msgstr "no se puede agregar una columna a una partición" -#: commands/tablecmds.c:6841 commands/tablecmds.c:15165 +#: commands/tablecmds.c:7072 commands/tablecmds.c:15860 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "la tabla hija «%s» tiene un tipo diferente para la columna «%s»" -#: commands/tablecmds.c:6847 commands/tablecmds.c:15172 +#: commands/tablecmds.c:7078 commands/tablecmds.c:15866 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "la tabla hija «%s» tiene un ordenamiento (collation) diferente para la columna «%s»" -#: commands/tablecmds.c:6865 +#: commands/tablecmds.c:7096 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "mezclando la definición de la columna «%s» en la tabla hija «%s»" -#: commands/tablecmds.c:6908 +#: commands/tablecmds.c:7149 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "no se puede agregar una columna de identidad recursivamente a una tabla que tiene tablas hijas" -#: commands/tablecmds.c:7159 +#: commands/tablecmds.c:7362 #, c-format msgid "column must be added to child tables too" msgstr "la columna debe ser agregada a las tablas hijas también" -#: commands/tablecmds.c:7237 +#: commands/tablecmds.c:7440 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "la columna «%s» de la relación «%s» ya existe, omitiendo" -#: commands/tablecmds.c:7244 +#: commands/tablecmds.c:7447 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "ya existe la columna «%s» en la relación «%s»" -#: commands/tablecmds.c:7310 commands/tablecmds.c:12094 +#: commands/tablecmds.c:7513 commands/tablecmds.c:12652 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "no se pueden eliminar restricciones sólo de la tabla particionada cuando existen particiones" -#: commands/tablecmds.c:7311 commands/tablecmds.c:7628 -#: commands/tablecmds.c:8593 commands/tablecmds.c:12095 +#: commands/tablecmds.c:7514 commands/tablecmds.c:7828 +#: commands/tablecmds.c:8006 commands/tablecmds.c:8113 +#: commands/tablecmds.c:8230 commands/tablecmds.c:9049 +#: commands/tablecmds.c:12653 #, c-format msgid "Do not specify the ONLY keyword." msgstr "No especifique la opción ONLY." -#: commands/tablecmds.c:7348 commands/tablecmds.c:7554 -#: commands/tablecmds.c:7696 commands/tablecmds.c:7810 -#: commands/tablecmds.c:7904 commands/tablecmds.c:7963 -#: commands/tablecmds.c:8082 commands/tablecmds.c:8221 -#: commands/tablecmds.c:8291 commands/tablecmds.c:8425 -#: commands/tablecmds.c:12249 commands/tablecmds.c:13753 -#: commands/tablecmds.c:16282 +#: commands/tablecmds.c:7550 commands/tablecmds.c:7754 +#: commands/tablecmds.c:7896 commands/tablecmds.c:8028 +#: commands/tablecmds.c:8157 commands/tablecmds.c:8251 +#: commands/tablecmds.c:8352 commands/tablecmds.c:8509 +#: commands/tablecmds.c:8662 commands/tablecmds.c:8743 +#: commands/tablecmds.c:8877 commands/tablecmds.c:12806 +#: commands/tablecmds.c:14348 commands/tablecmds.c:16975 #, c-format msgid "cannot alter system column \"%s\"" msgstr "no se puede alterar columna de sistema «%s»" -#: commands/tablecmds.c:7354 commands/tablecmds.c:7702 +#: commands/tablecmds.c:7556 commands/tablecmds.c:7902 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "la columna «%s» en la relación «%s» es una columna de identidad" -#: commands/tablecmds.c:7397 +#: commands/tablecmds.c:7597 #, c-format msgid "column \"%s\" is in a primary key" msgstr "la columna «%s» está en la llave primaria" -#: commands/tablecmds.c:7402 +#: commands/tablecmds.c:7602 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "la columna «%s» se encuentra en un índice utilizado como identidad de réplica" -#: commands/tablecmds.c:7425 +#: commands/tablecmds.c:7625 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "columna «%s» está marcada NOT NULL en la tabla padre" -#: commands/tablecmds.c:7625 commands/tablecmds.c:9077 +#: commands/tablecmds.c:7825 commands/tablecmds.c:9533 #, c-format msgid "constraint must be added to child tables too" msgstr "la restricción debe ser agregada a las tablas hijas también" -#: commands/tablecmds.c:7626 +#: commands/tablecmds.c:7826 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "La columna «%s» de la relación «%s» no está previamente marcada NOT NULL." -#: commands/tablecmds.c:7704 -#, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." -msgstr "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY en su lugar." - -#: commands/tablecmds.c:7709 +#: commands/tablecmds.c:7911 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "la columna «%s» en la relación «%s» es una columna generada" -#: commands/tablecmds.c:7712 +#: commands/tablecmds.c:8005 +#, c-format +msgid "cannot add identity to a column of only the partitioned table" +msgstr "no se puede agregar identidad a una columna de sólo una tabla particionada" + +#: commands/tablecmds.c:8011 #, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." -msgstr "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION en su lugar." +msgid "cannot add identity to a column of a partition" +msgstr "no se puede agregar identidad a una columna de una partición" -#: commands/tablecmds.c:7821 +#: commands/tablecmds.c:8039 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "la columna «%s» en la relación «%s» debe ser declarada NOT NULL antes de que una identidad pueda agregarse" -#: commands/tablecmds.c:7827 +#: commands/tablecmds.c:8045 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "la columna «%s» en la relación «%s» ya es una columna de identidad" -#: commands/tablecmds.c:7833 +#: commands/tablecmds.c:8051 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "la columna «%s» en la relación «%s» ya tiene un valor por omisión" -#: commands/tablecmds.c:7910 commands/tablecmds.c:7971 +#: commands/tablecmds.c:8112 +#, c-format +msgid "cannot change identity column of only the partitioned table" +msgstr "no se puede cambiar la columna de identidad de una tabla particionada" + +#: commands/tablecmds.c:8118 +#, c-format +msgid "cannot change identity column of a partition" +msgstr "no puede cambiar la columna de identidad de una partición" + +#: commands/tablecmds.c:8163 commands/tablecmds.c:8259 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "la columna «%s» en la relación «%s» no es una columna identidad" -#: commands/tablecmds.c:7976 +#: commands/tablecmds.c:8229 +#, c-format +msgid "cannot drop identity from a column of only the partitioned table" +msgstr "no se pueden eliminar la identidad de la columna de sólo una tabla particionada" + +#: commands/tablecmds.c:8235 +#, c-format +msgid "cannot drop identity from a column of a partition" +msgstr "no se puede eliminar la identidad de la columna de una partición" + +#: commands/tablecmds.c:8264 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "la columna «%s» de la relación «%s» no es una columna identidad, omitiendo" -#: commands/tablecmds.c:8029 +#: commands/tablecmds.c:8358 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not a generated column" +msgstr "la columna «%s» en la relación «%s» no es una columna generada" + +#: commands/tablecmds.c:8456 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "ALTER TABLE / DROP EXPRESSION se debe aplicar a las tablas hijas también" -#: commands/tablecmds.c:8051 +#: commands/tablecmds.c:8478 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "no se puede eliminar la expresión de generación de una columna heredada" -#: commands/tablecmds.c:8090 +#: commands/tablecmds.c:8517 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "la columna «%s» en la relación «%s» no es una columna generada almacenada" -#: commands/tablecmds.c:8095 +#: commands/tablecmds.c:8522 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "la columna «%s» de la relación «%s» no es una columna generada almacenada, omitiendo" -#: commands/tablecmds.c:8168 +#: commands/tablecmds.c:8600 #, c-format msgid "cannot refer to non-index column by number" msgstr "no se puede referir a columnas que no son de índice por número" -#: commands/tablecmds.c:8211 +#: commands/tablecmds.c:8652 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "no existe la columna número %d en la relación «%s»" -#: commands/tablecmds.c:8230 +#: commands/tablecmds.c:8671 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "no se puede alterar estadísticas en la columna incluida «%s» del índice «%s»" -#: commands/tablecmds.c:8235 +#: commands/tablecmds.c:8676 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "no se puede alterar estadísticas en la columna no-de-expresión «%s» del índice «%s»" -#: commands/tablecmds.c:8237 +#: commands/tablecmds.c:8678 #, c-format msgid "Alter statistics on table column instead." msgstr "Altere las estadísticas en la columna de la tabla en su lugar." -#: commands/tablecmds.c:8472 +#: commands/tablecmds.c:8924 #, c-format msgid "cannot drop column from typed table" msgstr "no se pueden eliminar columnas de una tabla tipada" -#: commands/tablecmds.c:8531 +#: commands/tablecmds.c:8987 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "no existe la columna «%s» en la relación «%s», omitiendo" -#: commands/tablecmds.c:8544 +#: commands/tablecmds.c:9000 #, c-format msgid "cannot drop system column \"%s\"" msgstr "no se puede eliminar la columna de sistema «%s»" -#: commands/tablecmds.c:8554 +#: commands/tablecmds.c:9010 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "no se puede eliminar la columna heredada «%s»" -#: commands/tablecmds.c:8567 +#: commands/tablecmds.c:9023 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "no se puede eliminar la columna «%s» porque es parte de la llave de partición de la relación «%s»" -#: commands/tablecmds.c:8592 +#: commands/tablecmds.c:9048 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "no se pueden eliminar columnas sólo de una tabla particionada cuando existe particiones" -#: commands/tablecmds.c:8797 +#: commands/tablecmds.c:9253 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX no está soportado en tablas particionadas" -#: commands/tablecmds.c:8822 +#: commands/tablecmds.c:9278 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX renombrará el índice «%s» a «%s»" -#: commands/tablecmds.c:9159 +#: commands/tablecmds.c:9615 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "no se puede usar ONLY para una llave foránea en la tabla particionada «%s» haciendo referencia a la relación «%s»" -#: commands/tablecmds.c:9165 +#: commands/tablecmds.c:9621 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "no se puede agregar una llave foránea NOT VALID a la tabla particionada «%s» haciendo referencia a la relación «%s»" -#: commands/tablecmds.c:9168 +#: commands/tablecmds.c:9624 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Esta característica no está aún soportada en tablas particionadas." -#: commands/tablecmds.c:9175 commands/tablecmds.c:9631 +#: commands/tablecmds.c:9631 commands/tablecmds.c:10092 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "la relación referida «%s» no es una tabla" -#: commands/tablecmds.c:9198 +#: commands/tablecmds.c:9654 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "las restricciones en tablas permanentes sólo pueden hacer referencia a tablas permanentes" -#: commands/tablecmds.c:9205 +#: commands/tablecmds.c:9661 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "las restricciones en tablas «unlogged» sólo pueden hacer referencia a tablas permanentes o «unlogged»" -#: commands/tablecmds.c:9211 +#: commands/tablecmds.c:9667 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "las restricciones en tablas temporales sólo pueden hacer referencia a tablas temporales" -#: commands/tablecmds.c:9215 +#: commands/tablecmds.c:9671 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "las restricciones en tablas temporales sólo pueden hacer referencia a tablas temporales de esta sesión" -#: commands/tablecmds.c:9279 commands/tablecmds.c:9285 +#: commands/tablecmds.c:9735 commands/tablecmds.c:9741 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "acción %s no válida para restricción de llave foránea que contiene columnas generadas" -#: commands/tablecmds.c:9301 +#: commands/tablecmds.c:9757 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "el número de columnas referidas en la llave foránea no coincide con el número de columnas de referencia" -#: commands/tablecmds.c:9408 +#: commands/tablecmds.c:9864 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "la restricción de llave foránea «%s» no puede ser implementada" -#: commands/tablecmds.c:9410 +#: commands/tablecmds.c:9866 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Las columnas llave «%s» y «%s» son de tipos incompatibles: %s y %s" -#: commands/tablecmds.c:9567 +#: commands/tablecmds.c:10035 #, c-format msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" msgstr "la columna «%s» referenciada en la acción ON DELETE SET debe ser parte de la llave foránea" -#: commands/tablecmds.c:9841 commands/tablecmds.c:10311 -#: parser/parse_utilcmd.c:791 parser/parse_utilcmd.c:920 +#: commands/tablecmds.c:10392 commands/tablecmds.c:10832 +#: parser/parse_utilcmd.c:822 parser/parse_utilcmd.c:945 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "las restricciones de llave foránea no están soportadas en tablas foráneas" -#: commands/tablecmds.c:10864 commands/tablecmds.c:11142 -#: commands/tablecmds.c:12051 commands/tablecmds.c:12126 +#: commands/tablecmds.c:10815 +#, c-format +msgid "cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"" +msgstr "no se puede adjuntar la tabla foránea «%s» como partición porque es referenciada por la llave foránea «%s»" + +#: commands/tablecmds.c:11416 commands/tablecmds.c:11697 +#: commands/tablecmds.c:12609 commands/tablecmds.c:12683 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "no existe la restricción «%s» en la relación «%s»" -#: commands/tablecmds.c:10871 +#: commands/tablecmds.c:11423 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "la restricción «%s» de la relación «%s» no es una restricción de llave foránea" -#: commands/tablecmds.c:10909 +#: commands/tablecmds.c:11461 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "no se puede modificar la restricción «%s» en la relación «%s»" -#: commands/tablecmds.c:10912 +#: commands/tablecmds.c:11464 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "La restricción «%s» deriva de la restricción «%s» de la relación «%s»." -#: commands/tablecmds.c:10914 +#: commands/tablecmds.c:11466 #, c-format -msgid "You may alter the constraint it derives from, instead." +msgid "You may alter the constraint it derives from instead." msgstr "En su lugar, puede modificar la restricción de la cual deriva." -#: commands/tablecmds.c:11150 +#: commands/tablecmds.c:11705 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "la restricción «%s» de la relación «%s» no es una llave foránea o restricción «check»" -#: commands/tablecmds.c:11227 +#: commands/tablecmds.c:11782 #, c-format msgid "constraint must be validated on child tables too" msgstr "la restricción debe ser validada en las tablas hijas también" -#: commands/tablecmds.c:11314 +#: commands/tablecmds.c:11869 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "no existe la columna «%s» referida en la llave foránea" -#: commands/tablecmds.c:11320 -#, fuzzy, c-format -#| msgid "Generated columns cannot be used in COPY." +#: commands/tablecmds.c:11875 +#, c-format msgid "system columns cannot be used in foreign keys" -msgstr "Las columnas generadas no pueden usarse en COPY." +msgstr "las columnas de sistema no pueden usarse en llaves foráneas" -#: commands/tablecmds.c:11324 +#: commands/tablecmds.c:11879 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "no se puede tener más de %d columnas en una llave foránea" -#: commands/tablecmds.c:11389 +#: commands/tablecmds.c:11944 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "no se puede usar una llave primaria postergable para la tabla referenciada «%s»" -#: commands/tablecmds.c:11406 +#: commands/tablecmds.c:11961 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "no hay llave primaria para la tabla referida «%s»" -#: commands/tablecmds.c:11470 +#: commands/tablecmds.c:12029 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "la lista de columnas referidas en una llave foránea no debe contener duplicados" -#: commands/tablecmds.c:11562 +#: commands/tablecmds.c:12121 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "no se puede usar una restricción unique postergable para la tabla referenciada «%s»" -#: commands/tablecmds.c:11567 +#: commands/tablecmds.c:12126 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "no hay restricción unique que coincida con las columnas dadas en la tabla referida «%s»" -#: commands/tablecmds.c:12007 +#: commands/tablecmds.c:12565 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "no se puede eliminar la restricción «%s» heredada de la relación «%s»" -#: commands/tablecmds.c:12057 +#: commands/tablecmds.c:12615 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "no existe la restricción «%s» en la relación «%s», omitiendo" -#: commands/tablecmds.c:12233 +#: commands/tablecmds.c:12790 #, c-format msgid "cannot alter column type of typed table" msgstr "no se puede cambiar el tipo de una columna de una tabla tipada" -#: commands/tablecmds.c:12260 +#: commands/tablecmds.c:12816 +#, c-format +msgid "cannot specify USING when altering type of generated column" +msgstr "no se puede especificar USING al alterar el tipo de una columna generada" + +#: commands/tablecmds.c:12817 commands/tablecmds.c:18028 +#: commands/tablecmds.c:18118 commands/trigger.c:656 +#: rewrite/rewriteHandler.c:941 rewrite/rewriteHandler.c:976 +#, c-format +msgid "Column \"%s\" is a generated column." +msgstr "La columna «%s» es una columna generada." + +#: commands/tablecmds.c:12827 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "no se puede alterar la columna heredada «%s»" -#: commands/tablecmds.c:12269 +#: commands/tablecmds.c:12836 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "no se puede alterar la columna «%s» porque es parte de la llave de partición de la relación «%s»" -#: commands/tablecmds.c:12319 +#: commands/tablecmds.c:12886 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "el resultado de la cláusula USING para la columna «%s» no puede ser convertido automáticamente al tipo %s" -#: commands/tablecmds.c:12322 +#: commands/tablecmds.c:12889 #, c-format msgid "You might need to add an explicit cast." msgstr "Puede ser necesario agregar un cast explícito." -#: commands/tablecmds.c:12326 +#: commands/tablecmds.c:12893 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "la columna «%s» no puede convertirse automáticamente al tipo %s" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:12329 +#: commands/tablecmds.c:12897 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Puede ser necesario especificar «USING %s::%s»." -#: commands/tablecmds.c:12428 +#: commands/tablecmds.c:12996 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "no se puede alterar la columna heredada «%s» de la relación «%s»" -#: commands/tablecmds.c:12457 +#: commands/tablecmds.c:13025 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "La expresión USING contiene una referencia a la fila completa (whole-row)." -#: commands/tablecmds.c:12468 +#: commands/tablecmds.c:13036 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "debe cambiar el tipo a la columna heredada «%s» en las tablas hijas también" -#: commands/tablecmds.c:12593 +#: commands/tablecmds.c:13161 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "no se puede alterar el tipo de la columna «%s» dos veces" -#: commands/tablecmds.c:12631 +#: commands/tablecmds.c:13199 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "la expresión de generación para la columna «%s» no puede ser convertido automáticamente al tipo %s" -#: commands/tablecmds.c:12636 +#: commands/tablecmds.c:13204 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "el valor por omisión para la columna «%s» no puede ser convertido automáticamente al tipo %s" -#: commands/tablecmds.c:12717 +#: commands/tablecmds.c:13508 #, c-format -msgid "cannot alter type of a column used by a view or rule" -msgstr "no se puede alterar el tipo de una columna usada en una regla o vista" +msgid "cannot alter type of a column used by a function or procedure" +msgstr "no se puede alterar el tipo de una columna usada en una función o procedimiento" -#: commands/tablecmds.c:12718 commands/tablecmds.c:12737 -#: commands/tablecmds.c:12755 +#: commands/tablecmds.c:13509 commands/tablecmds.c:13524 +#: commands/tablecmds.c:13544 commands/tablecmds.c:13563 +#: commands/tablecmds.c:13622 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s depende de la columna «%s»" -#: commands/tablecmds.c:12736 +#: commands/tablecmds.c:13523 +#, c-format +msgid "cannot alter type of a column used by a view or rule" +msgstr "no se puede alterar el tipo de una columna usada en una regla o vista" + +#: commands/tablecmds.c:13543 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "no se puede alterar el tipo de una columna usada en una definición de trigger" -#: commands/tablecmds.c:12754 +#: commands/tablecmds.c:13562 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "no se puede alterar el tipo de una columna usada en una definición de política" -#: commands/tablecmds.c:12785 +#: commands/tablecmds.c:13593 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "no se puede alterar el tipo de una columna usada por una columna generada" -#: commands/tablecmds.c:12786 +#: commands/tablecmds.c:13594 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "La columna «%s» es usada por la columna generada «%s»." -#: commands/tablecmds.c:13861 commands/tablecmds.c:13873 +#: commands/tablecmds.c:13621 +#, c-format +msgid "cannot alter type of a column used by a publication WHERE clause" +msgstr "no se puede alterar el tipo de una columna usada en una cláusula WHERE de publicación" + +#: commands/tablecmds.c:14456 commands/tablecmds.c:14468 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "no se puede cambiar el dueño del índice «%s»" -#: commands/tablecmds.c:13863 commands/tablecmds.c:13875 +#: commands/tablecmds.c:14458 commands/tablecmds.c:14470 #, c-format -msgid "Change the ownership of the index's table, instead." -msgstr "Considere cambiar el dueño de la tabla en vez de cambiar el dueño del índice." +msgid "Change the ownership of the index's table instead." +msgstr "Cambie el dueño de la tabla del índice en su lugar." -#: commands/tablecmds.c:13889 +#: commands/tablecmds.c:14484 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "no se puede cambiar el dueño de la secuencia «%s»" -#: commands/tablecmds.c:13903 commands/tablecmds.c:17201 -#: commands/tablecmds.c:17220 +#: commands/tablecmds.c:14509 #, c-format -msgid "Use ALTER TYPE instead." -msgstr "Considere usar ALTER TYPE." - -#: commands/tablecmds.c:13912 -#, fuzzy, c-format -#| msgid "cannot change owner of index \"%s\"" msgid "cannot change owner of relation \"%s\"" -msgstr "no se puede cambiar el dueño del índice «%s»" +msgstr "no se puede cambiar el dueño de la relación «%s»" -#: commands/tablecmds.c:14274 +#: commands/tablecmds.c:14976 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "no se pueden tener múltiples subórdenes SET TABLESPACE" -#: commands/tablecmds.c:14351 -#, fuzzy, c-format -#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +#: commands/tablecmds.c:15053 +#, c-format msgid "cannot set options for relation \"%s\"" -msgstr "no se puede modificar la restricción «%s» en la relación «%s»" +msgstr "no se puede definir opciones para la relación «%s»" -#: commands/tablecmds.c:14385 commands/view.c:445 +#: commands/tablecmds.c:15087 commands/view.c:440 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION sólo puede usarse en vistas automáticamente actualizables" -#: commands/tablecmds.c:14635 +#: commands/tablecmds.c:15338 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "solamente tablas, índices y vistas materializadas existen en tablespaces" -#: commands/tablecmds.c:14647 +#: commands/tablecmds.c:15350 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "no se puede mover objetos hacia o desde el tablespace pg_global" -#: commands/tablecmds.c:14739 +#: commands/tablecmds.c:15442 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "cancelando porque el lock en la relación «%s.%s» no está disponible" -#: commands/tablecmds.c:14755 +#: commands/tablecmds.c:15458 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "no se encontraron relaciones coincidentes en el tablespace «%s»" -#: commands/tablecmds.c:14873 +#: commands/tablecmds.c:15580 #, c-format msgid "cannot change inheritance of typed table" msgstr "no se puede cambiar la herencia de una tabla tipada" -#: commands/tablecmds.c:14878 commands/tablecmds.c:15396 +#: commands/tablecmds.c:15585 commands/tablecmds.c:16085 #, c-format msgid "cannot change inheritance of a partition" msgstr "no puede cambiar la herencia de una partición" -#: commands/tablecmds.c:14883 +#: commands/tablecmds.c:15590 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "no se puede cambiar la herencia de una tabla particionada" -#: commands/tablecmds.c:14929 +#: commands/tablecmds.c:15636 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "no se puede agregar herencia a tablas temporales de otra sesión" -#: commands/tablecmds.c:14942 +#: commands/tablecmds.c:15649 #, c-format msgid "cannot inherit from a partition" msgstr "no se puede heredar de una partición" -#: commands/tablecmds.c:14964 commands/tablecmds.c:17841 +#: commands/tablecmds.c:15671 commands/tablecmds.c:18529 #, c-format msgid "circular inheritance not allowed" msgstr "la herencia circular no está permitida" -#: commands/tablecmds.c:14965 commands/tablecmds.c:17842 +#: commands/tablecmds.c:15672 commands/tablecmds.c:18530 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "«%s» ya es un hijo de «%s»." -#: commands/tablecmds.c:14978 +#: commands/tablecmds.c:15685 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "el trigger «%s» impide a la tabla «%s» convertirse en hija de herencia" -#: commands/tablecmds.c:14980 +#: commands/tablecmds.c:15687 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "Los triggers ROW con tablas de transición no están permitidos en jerarquías de herencia." -#: commands/tablecmds.c:15183 +#: commands/tablecmds.c:15876 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "columna «%s» en tabla hija debe marcarse como NOT NULL" -#: commands/tablecmds.c:15192 +#: commands/tablecmds.c:15885 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "columna «%s» en tabla hija debe ser una columna generada" -#: commands/tablecmds.c:15197 -#, fuzzy, c-format -#| msgid "column \"%s\" in child table must be a generated column" +#: commands/tablecmds.c:15889 +#, c-format msgid "column \"%s\" in child table must not be a generated column" -msgstr "columna «%s» en tabla hija debe ser una columna generada" +msgstr "columna «%s» en tabla hija no puede ser una columna generada" -#: commands/tablecmds.c:15228 +#: commands/tablecmds.c:15927 #, c-format msgid "child table is missing column \"%s\"" msgstr "tabla hija no tiene la columna «%s»" -#: commands/tablecmds.c:15316 +#: commands/tablecmds.c:16008 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "la tabla hija «%s» tiene una definición diferente para la restricción «check» «%s»" -#: commands/tablecmds.c:15324 +#: commands/tablecmds.c:16015 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "la restricción «%s» está en conflicto con la restricción no heredada en la tabla hija «%s»" -#: commands/tablecmds.c:15335 +#: commands/tablecmds.c:16025 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "la restricción «%s» está en conflicto con la restricción NOT VALID en la tabla hija «%s»" -#: commands/tablecmds.c:15374 +#: commands/tablecmds.c:16063 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "tabla hija no tiene la restricción «%s»" -#: commands/tablecmds.c:15460 +#: commands/tablecmds.c:16149 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "la partición «%s» ya tiene un desprendimiento pendiente en la tabla particionada «%s.%s»" -#: commands/tablecmds.c:15489 commands/tablecmds.c:15537 +#: commands/tablecmds.c:16178 commands/tablecmds.c:16224 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "relación «%s» no es una partición de la relación «%s»" -#: commands/tablecmds.c:15543 +#: commands/tablecmds.c:16230 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "relación «%s» no es un padre de la relación «%s»" -#: commands/tablecmds.c:15771 +#: commands/tablecmds.c:16457 #, c-format msgid "typed tables cannot inherit" msgstr "las tablas tipadas no pueden heredar" -#: commands/tablecmds.c:15801 +#: commands/tablecmds.c:16487 #, c-format msgid "table is missing column \"%s\"" msgstr "la tabla no tiene la columna «%s»" -#: commands/tablecmds.c:15812 +#: commands/tablecmds.c:16498 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "la tabla tiene columna «%s» en la posición en que el tipo requiere «%s»." -#: commands/tablecmds.c:15821 +#: commands/tablecmds.c:16507 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "la tabla «%s» tiene un tipo diferente para la columna «%s»" -#: commands/tablecmds.c:15835 +#: commands/tablecmds.c:16521 #, c-format msgid "table has extra column \"%s\"" msgstr "tabla tiene la columna extra «%s»" -#: commands/tablecmds.c:15887 +#: commands/tablecmds.c:16573 #, c-format msgid "\"%s\" is not a typed table" msgstr "«%s» no es una tabla tipada" -#: commands/tablecmds.c:16061 +#: commands/tablecmds.c:16747 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "no se puede usar el índice no-único «%s» como identidad de réplica" -#: commands/tablecmds.c:16067 +#: commands/tablecmds.c:16753 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "no puede usar el índice no-inmediato «%s» como identidad de réplica" -#: commands/tablecmds.c:16073 +#: commands/tablecmds.c:16759 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "no se puede usar el índice funcional «%s» como identidad de réplica" -#: commands/tablecmds.c:16079 +#: commands/tablecmds.c:16765 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "no se puede usar el índice parcial «%s» como identidad de réplica" -#: commands/tablecmds.c:16096 +#: commands/tablecmds.c:16782 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "el índice «%s» no puede usarse como identidad de réplica porque la column %d es una columna de sistema" -#: commands/tablecmds.c:16103 +#: commands/tablecmds.c:16789 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "el índice «%s» no puede usarse como identidad de réplica porque la column «%s» acepta valores nulos" -#: commands/tablecmds.c:16348 +#: commands/tablecmds.c:17041 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "no se puede cambiar el estado «logged» de la tabla «%s» porque es temporal" -#: commands/tablecmds.c:16372 +#: commands/tablecmds.c:17065 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "no se pudo cambiar la tabla «%s» a «unlogged» porque es parte de una publicación" -#: commands/tablecmds.c:16374 +#: commands/tablecmds.c:17067 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Las tablas «unlogged» no pueden replicarse." -#: commands/tablecmds.c:16419 +#: commands/tablecmds.c:17112 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "no se pudo cambiar la tabla «%s» a «logged» porque hace referencia a la tabla «unlogged» «%s»" -#: commands/tablecmds.c:16429 +#: commands/tablecmds.c:17122 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "no se pudo cambiar la tabla «%s» a «unlogged» porque hace referencia a la tabla «logged» «%s»" -#: commands/tablecmds.c:16487 +#: commands/tablecmds.c:17180 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "no se puede mover una secuencia enlazada a una tabla hacia otro esquema" -#: commands/tablecmds.c:16594 +#: commands/tablecmds.c:17288 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "ya existe una relación llamada «%s» en el esquema «%s»" -#: commands/tablecmds.c:17006 +#: commands/tablecmds.c:17713 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "«%s» no es una tabla o vista materializada" -#: commands/tablecmds.c:17184 +#: commands/tablecmds.c:17866 #, c-format msgid "\"%s\" is not a composite type" msgstr "«%s» no es un tipo compuesto" -#: commands/tablecmds.c:17212 -#, fuzzy, c-format -#| msgid "cannot change owner of index \"%s\"" +#: commands/tablecmds.c:17896 +#, c-format msgid "cannot change schema of index \"%s\"" -msgstr "no se puede cambiar el dueño del índice «%s»" +msgstr "no se puede cambiar el esquema del índice «%s»" -#: commands/tablecmds.c:17214 commands/tablecmds.c:17226 -#, fuzzy, c-format -#| msgid "Change the ownership of the index's table, instead." +#: commands/tablecmds.c:17898 commands/tablecmds.c:17912 +#, c-format msgid "Change the schema of the table instead." -msgstr "Considere cambiar el dueño de la tabla en vez de cambiar el dueño del índice." +msgstr "Cambie el esquema de la tabla en su lugar." -#: commands/tablecmds.c:17218 -#, fuzzy, c-format -#| msgid "cannot convert Perl hash to non-composite type %s" +#: commands/tablecmds.c:17902 +#, c-format msgid "cannot change schema of composite type \"%s\"" -msgstr "no se puede convertir un hash de Perl al tipo no compuesto %s" +msgstr "no se puede cambiar el esquema del tipo compuesto «%s»" -#: commands/tablecmds.c:17224 -#, fuzzy, c-format -#| msgid "cannot change TOAST relation \"%s\"" +#: commands/tablecmds.c:17910 +#, c-format msgid "cannot change schema of TOAST table \"%s\"" -msgstr "no se puede cambiar la relación TOAST «%s»" +msgstr "no se puede cambiar el esquema de la relación TOAST «%s»" -#: commands/tablecmds.c:17256 +#: commands/tablecmds.c:17942 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "no se puede usar la estrategia de particionamiento «list» con más de una columna" -#: commands/tablecmds.c:17322 +#: commands/tablecmds.c:18008 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "la columna «%s» nombrada en llave de particionamiento no existe" -#: commands/tablecmds.c:17330 +#: commands/tablecmds.c:18016 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "no se puede usar la columna de sistema «%s» en llave de particionamiento" -#: commands/tablecmds.c:17341 commands/tablecmds.c:17455 +#: commands/tablecmds.c:18027 commands/tablecmds.c:18117 #, c-format msgid "cannot use generated column in partition key" msgstr "no se puede usar una columna generada en llave de particionamiento" -#: commands/tablecmds.c:17342 commands/tablecmds.c:17456 commands/trigger.c:663 -#: rewrite/rewriteHandler.c:934 rewrite/rewriteHandler.c:969 +#: commands/tablecmds.c:18100 #, c-format -msgid "Column \"%s\" is a generated column." -msgstr "La columna «%s» es una columna generada." +msgid "partition key expressions cannot contain system column references" +msgstr "las expresiones en la llave de particionamiento no pueden contener referencias a columnas de sistema" -#: commands/tablecmds.c:17418 +#: commands/tablecmds.c:18147 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "las funciones utilizadas en expresiones de la llave de particionamiento deben estar marcadas IMMUTABLE" -#: commands/tablecmds.c:17438 -#, c-format -msgid "partition key expressions cannot contain system column references" -msgstr "las expresiones en la llave de particionamiento no pueden contener referencias a columnas de sistema" - -#: commands/tablecmds.c:17468 +#: commands/tablecmds.c:18156 #, c-format msgid "cannot use constant expression as partition key" msgstr "no se pueden usar expresiones constantes como llave de particionamiento" -#: commands/tablecmds.c:17489 +#: commands/tablecmds.c:18177 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "no se pudo determinar qué ordenamiento (collation) usar para la expresión de particionamiento" -#: commands/tablecmds.c:17524 +#: commands/tablecmds.c:18212 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "Debe especificar una clase de operadores hash, o definir una clase de operadores por omisión para hash para el tipo de datos." -#: commands/tablecmds.c:17530 +#: commands/tablecmds.c:18218 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "Debe especificar una clase de operadores btree, o definir una clase de operadores por omisión para btree para el tipo de datos." -#: commands/tablecmds.c:17781 +#: commands/tablecmds.c:18469 #, c-format msgid "\"%s\" is already a partition" msgstr "«%s» ya es una partición" -#: commands/tablecmds.c:17787 +#: commands/tablecmds.c:18475 #, c-format msgid "cannot attach a typed table as partition" msgstr "no puede adjuntar tabla tipada como partición" -#: commands/tablecmds.c:17803 +#: commands/tablecmds.c:18491 #, c-format msgid "cannot attach inheritance child as partition" msgstr "no puede adjuntar hija de herencia como partición" -#: commands/tablecmds.c:17817 +#: commands/tablecmds.c:18505 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "no puede adjuntar ancestro de herencia como partición" -#: commands/tablecmds.c:17851 +#: commands/tablecmds.c:18539 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "no se puede adjuntar una relación temporal como partición de la relación permanente «%s»" -#: commands/tablecmds.c:17859 +#: commands/tablecmds.c:18547 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "no se puede adjuntar una relación permanente como partición de la relación temporal «%s»" -#: commands/tablecmds.c:17867 +#: commands/tablecmds.c:18555 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "no se puede adjuntar como partición de una relación temporal de otra sesión" -#: commands/tablecmds.c:17874 +#: commands/tablecmds.c:18562 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "no se adjuntar una relación temporal de otra sesión como partición" -#: commands/tablecmds.c:17894 +#: commands/tablecmds.c:18582 +#, c-format +msgid "table \"%s\" being attached contains an identity column \"%s\"" +msgstr "la tabla «%s» siendo adjuntada contiene la columna de identidad «%s»" + +#: commands/tablecmds.c:18584 +#, c-format +msgid "The new partition may not contain an identity column." +msgstr "La nueva partición no puede contener una columna de identidad." + +#: commands/tablecmds.c:18592 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "la tabla «%s» contiene la columna «%s» no encontrada en el padre «%s»" -#: commands/tablecmds.c:17897 +#: commands/tablecmds.c:18595 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "La nueva partición sólo puede contener las columnas presentes en el padre." -#: commands/tablecmds.c:17909 +#: commands/tablecmds.c:18607 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "el trigger «%s» impide a la tabla «%s» devenir partición" -#: commands/tablecmds.c:17911 +#: commands/tablecmds.c:18609 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "Los triggers ROW con tablas de transición no están soportados en particiones." -#: commands/tablecmds.c:18090 +#: commands/tablecmds.c:18785 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "no se puede adjuntar la tabla foránea «%s» como partición de la tabla particionada «%s»" -#: commands/tablecmds.c:18093 +#: commands/tablecmds.c:18788 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "La tabla particionada «%s» contiene índices únicos." -#: commands/tablecmds.c:18406 +#: commands/tablecmds.c:19110 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "no se puede desprender particiones concurrentemente cuando existe una partición por omisión" -#: commands/tablecmds.c:18515 +#: commands/tablecmds.c:19219 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "la tabla particionada «%s» fue eliminada concurrentemente" -#: commands/tablecmds.c:18521 +#: commands/tablecmds.c:19225 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "la partición «%s» fue eliminada concurrentemente" -#: commands/tablecmds.c:19036 commands/tablecmds.c:19056 -#: commands/tablecmds.c:19077 commands/tablecmds.c:19096 -#: commands/tablecmds.c:19138 +#: commands/tablecmds.c:19839 commands/tablecmds.c:19859 +#: commands/tablecmds.c:19880 commands/tablecmds.c:19899 +#: commands/tablecmds.c:19941 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "no se puede adjuntar el índice «%s» como partición del índice «%s»" -#: commands/tablecmds.c:19039 +#: commands/tablecmds.c:19842 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "El índice «%s» ya está adjunto a otro índice." -#: commands/tablecmds.c:19059 +#: commands/tablecmds.c:19862 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "El índice «%s» no es un índice en una partición de la tabla «%s»." -#: commands/tablecmds.c:19080 +#: commands/tablecmds.c:19883 #, c-format msgid "The index definitions do not match." msgstr "Las definiciones de los índices no coinciden." -#: commands/tablecmds.c:19099 +#: commands/tablecmds.c:19902 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "El índice «%s» pertenece a una restricción en la tabla «%s», pero no existe una restricción para el índice «%s»." -#: commands/tablecmds.c:19141 +#: commands/tablecmds.c:19944 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "Otro índice ya está adjunto para la partición «%s»." -#: commands/tablecmds.c:19370 +#: commands/tablecmds.c:20180 #, c-format msgid "column data type %s does not support compression" msgstr "el tipo de dato de columna %s no soporta compresión" -#: commands/tablecmds.c:19377 +#: commands/tablecmds.c:20187 #, c-format msgid "invalid compression method \"%s\"" msgstr "método de compresión «%s» no válido" -#: commands/tablecmds.c:19403 +#: commands/tablecmds.c:20213 #, c-format msgid "invalid storage type \"%s\"" msgstr "tipo de almacenamiento no válido «%s»" -#: commands/tablecmds.c:19413 +#: commands/tablecmds.c:20223 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "el tipo de datos %s de la columna sólo puede tener almacenamiento PLAIN" -#: commands/tablespace.c:199 commands/tablespace.c:650 +#: commands/tablespace.c:193 commands/tablespace.c:644 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "«%s» existe pero no es un directorio" -#: commands/tablespace.c:230 +#: commands/tablespace.c:224 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "se ha denegado el permiso para crear el tablespace «%s»" -#: commands/tablespace.c:232 +#: commands/tablespace.c:226 #, c-format msgid "Must be superuser to create a tablespace." msgstr "Debe ser superusuario para crear tablespaces." -#: commands/tablespace.c:248 +#: commands/tablespace.c:242 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "la ruta del tablespace no puede contener comillas simples" -#: commands/tablespace.c:261 +#: commands/tablespace.c:255 #, c-format msgid "tablespace location must be an absolute path" msgstr "la ubicación del tablespace debe ser una ruta absoluta" -#: commands/tablespace.c:273 +#: commands/tablespace.c:267 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "la ruta «%s» del tablespace es demasiado larga" -#: commands/tablespace.c:280 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "la ubicación del tablespace no debe estar dentro del directorio de datos" -#: commands/tablespace.c:289 commands/tablespace.c:976 +#: commands/tablespace.c:283 commands/tablespace.c:970 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "el nombre de tablespace «%s» es inaceptable" -#: commands/tablespace.c:291 commands/tablespace.c:977 +#: commands/tablespace.c:285 commands/tablespace.c:971 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "El prefijo «pg_» está reservado para tablespaces del sistema." -#: commands/tablespace.c:310 commands/tablespace.c:998 +#: commands/tablespace.c:304 commands/tablespace.c:992 #, c-format msgid "tablespace \"%s\" already exists" msgstr "el tablespace «%s» ya existe" -#: commands/tablespace.c:326 -#, fuzzy, c-format -#| msgid "pg_type OID value not set when in binary upgrade mode" +#: commands/tablespace.c:320 +#, c-format msgid "pg_tablespace OID value not set when in binary upgrade mode" -msgstr "el valor de OID de pg_type no se definió en modo de actualización binaria" +msgstr "el valor de OID de pg_tablespace no se definió en modo de actualización binaria" -#: commands/tablespace.c:431 commands/tablespace.c:959 -#: commands/tablespace.c:1048 commands/tablespace.c:1117 -#: commands/tablespace.c:1263 commands/tablespace.c:1466 +#: commands/tablespace.c:425 commands/tablespace.c:953 +#: commands/tablespace.c:1042 commands/tablespace.c:1111 +#: commands/tablespace.c:1257 commands/tablespace.c:1460 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "no existe el tablespace «%s»" -#: commands/tablespace.c:437 +#: commands/tablespace.c:431 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "el tablespace «%s» no existe, omitiendo" -#: commands/tablespace.c:463 +#: commands/tablespace.c:457 #, c-format msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" msgstr "no se puede eliminar el tablespace «%s» porque otros objetos dependen de él" -#: commands/tablespace.c:530 +#: commands/tablespace.c:524 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "el tablespace «%s» no está vacío" -#: commands/tablespace.c:617 +#: commands/tablespace.c:611 #, c-format msgid "directory \"%s\" does not exist" msgstr "no existe el directorio «%s»" -#: commands/tablespace.c:618 +#: commands/tablespace.c:612 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "Cree este directorio para el tablespace antes de reiniciar el servidor." -#: commands/tablespace.c:623 +#: commands/tablespace.c:617 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "no se pudo definir los permisos del directorio «%s»: %m" -#: commands/tablespace.c:655 +#: commands/tablespace.c:649 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "el directorio «%s» ya está siendo usado como tablespace" -#: commands/tablespace.c:833 commands/tablespace.c:919 +#: commands/tablespace.c:827 commands/tablespace.c:913 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "no se pudo eliminar el enlace simbólico «%s»: %m" -#: commands/tablespace.c:842 commands/tablespace.c:927 +#: commands/tablespace.c:836 commands/tablespace.c:921 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "«%s» no es un directorio o enlace simbólico" -#: commands/tablespace.c:1122 +#: commands/tablespace.c:1116 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "No existe el tablespace «%s»." -#: commands/tablespace.c:1568 +#: commands/tablespace.c:1562 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "algunos directorios para el tablespace %u no pudieron eliminarse" -#: commands/tablespace.c:1570 +#: commands/tablespace.c:1564 #, c-format msgid "You can remove the directories manually if necessary." msgstr "Puede eliminar los directorios manualmente, si es necesario." -#: commands/trigger.c:232 commands/trigger.c:243 +#: commands/trigger.c:225 commands/trigger.c:236 #, c-format msgid "\"%s\" is a table" msgstr "«%s» es una tabla" -#: commands/trigger.c:234 commands/trigger.c:245 +#: commands/trigger.c:227 commands/trigger.c:238 #, c-format msgid "Tables cannot have INSTEAD OF triggers." -msgstr "Las tablas no pueden tener disparadores INSTEAD OF." +msgstr "Las tablas no pueden tener “triggers†INSTEAD OF." -#: commands/trigger.c:266 +#: commands/trigger.c:259 #, c-format msgid "\"%s\" is a partitioned table" msgstr "«%s» es una tabla particionada" -#: commands/trigger.c:268 -#, fuzzy, c-format -#| msgid "ROW triggers with transition tables are not supported on partitions." +#: commands/trigger.c:261 +#, c-format msgid "ROW triggers with transition tables are not supported on partitioned tables." -msgstr "Los triggers ROW con tablas de transición no están soportados en particiones." +msgstr "Los triggers ROW con tablas de transición no están soportados en tablas particionadas." -#: commands/trigger.c:280 commands/trigger.c:287 commands/trigger.c:451 +#: commands/trigger.c:273 commands/trigger.c:280 commands/trigger.c:444 #, c-format msgid "\"%s\" is a view" msgstr "«%s» es una vista" -#: commands/trigger.c:282 +#: commands/trigger.c:275 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." -msgstr "Las vistas no pueden tener disparadores BEFORE o AFTER a nivel de fila." +msgstr "Las vistas no pueden tener “triggers†BEFORE o AFTER a nivel de fila." -#: commands/trigger.c:289 +#: commands/trigger.c:282 #, c-format msgid "Views cannot have TRUNCATE triggers." -msgstr "Las vistas no pueden tener disparadores TRUNCATE." +msgstr "Las vistas no pueden tener “triggers†TRUNCATE." -#: commands/trigger.c:297 commands/trigger.c:309 commands/trigger.c:444 +#: commands/trigger.c:290 commands/trigger.c:302 commands/trigger.c:437 #, c-format msgid "\"%s\" is a foreign table" msgstr "«%s» es una tabla foránea" -#: commands/trigger.c:299 +#: commands/trigger.c:292 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." -msgstr "Las tablas foráneas no pueden tener disparadores INSTEAD OF." +msgstr "Las tablas foráneas no pueden tener “triggers†INSTEAD OF." -#: commands/trigger.c:311 +#: commands/trigger.c:304 #, c-format msgid "Foreign tables cannot have constraint triggers." -msgstr "Las tablas foráneas no pueden tener disparadores de restricción." +msgstr "Las tablas foráneas no pueden tener “triggers†de restricción." -#: commands/trigger.c:316 commands/trigger.c:1332 commands/trigger.c:1439 -#, fuzzy, c-format -#| msgid "Foreign tables cannot have TRUNCATE triggers." +#: commands/trigger.c:309 commands/trigger.c:1325 commands/trigger.c:1432 +#, c-format msgid "relation \"%s\" cannot have triggers" -msgstr "Las tablas foráneas no pueden tener disparadores TRUNCATE." +msgstr "la relación «%s» no puede tener triggers." -#: commands/trigger.c:387 +#: commands/trigger.c:380 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" -msgstr "los disparadores TRUNCATE FOR EACH ROW no están soportados" +msgstr "los “triggers†TRUNCATE FOR EACH ROW no están soportados" -#: commands/trigger.c:395 +#: commands/trigger.c:388 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" -msgstr "los disparadores INSTEAD OF deben ser FOR EACH ROW" +msgstr "los “triggers†INSTEAD OF deben ser FOR EACH ROW" -#: commands/trigger.c:399 +#: commands/trigger.c:392 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" -msgstr "los disparadores INSTEAD OF no pueden tener condiciones WHEN" +msgstr "los “triggers†INSTEAD OF no pueden tener condiciones WHEN" -#: commands/trigger.c:403 +#: commands/trigger.c:396 #, c-format msgid "INSTEAD OF triggers cannot have column lists" -msgstr "los disparadores INSTEAD OF no pueden tener listas de columnas" +msgstr "los “triggers†INSTEAD OF no pueden tener listas de columnas" -#: commands/trigger.c:432 +#: commands/trigger.c:425 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "dar nombre a una variable ROW en la cláusula REFERENCING no está soportado" -#: commands/trigger.c:433 +#: commands/trigger.c:426 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "utilice OLD TABLE o NEW TABLE para nombrar tablas de transición." -#: commands/trigger.c:446 +#: commands/trigger.c:439 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Las tablas foráneas no pueden tener tablas de transición." -#: commands/trigger.c:453 +#: commands/trigger.c:446 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Las triggers en vistas no pueden tener tablas de transición." -#: commands/trigger.c:469 +#: commands/trigger.c:462 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "los triggers ROW con tablas de transición no están soportados en particiones" -#: commands/trigger.c:473 +#: commands/trigger.c:466 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" msgstr "los triggers ROW con tablas de transición no están soportados con hijas de herencia" -#: commands/trigger.c:479 +#: commands/trigger.c:472 #, c-format msgid "transition table name can only be specified for an AFTER trigger" -msgstr "el nombre de la tabla de transición solo se puede especificar para un disparador AFTER" +msgstr "el nombre de la tabla de transición solo se puede especificar para un “trigger†AFTER" -#: commands/trigger.c:484 +#: commands/trigger.c:477 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "los triggers TRUNCATE con tablas de transición no están soportados" -#: commands/trigger.c:501 +#: commands/trigger.c:494 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" msgstr "las tablas de transición no pueden especificarse para triggers con más de un evento" -#: commands/trigger.c:512 +#: commands/trigger.c:505 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "las tablas de transición no pueden especificarse para triggers con lista de columnas" -#: commands/trigger.c:529 +#: commands/trigger.c:522 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" -msgstr "NEW TABLE sólo se puede especificar para un disparador INSERT o UPDATE" +msgstr "NEW TABLE sólo se puede especificar para un “trigger†INSERT o UPDATE" -#: commands/trigger.c:534 +#: commands/trigger.c:527 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE no se puede especificar varias veces" -#: commands/trigger.c:544 +#: commands/trigger.c:537 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" -msgstr "OLD TABLE sólo se puede especificar para un disparador DELETE o UPDATE" +msgstr "OLD TABLE sólo se puede especificar para un “trigger†DELETE o UPDATE" -#: commands/trigger.c:549 +#: commands/trigger.c:542 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE no se puede especificar varias veces" -#: commands/trigger.c:559 +#: commands/trigger.c:552 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "el nombre de OLD TABLE y el nombre de NEW TABLE no pueden ser iguales" -#: commands/trigger.c:623 commands/trigger.c:636 +#: commands/trigger.c:616 commands/trigger.c:629 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" -msgstr "la condición WHEN de un disparador por sentencias no pueden referirse a los valores de las columnas" +msgstr "la condición WHEN de un “trigger†por sentencias no pueden referirse a los valores de las columnas" -#: commands/trigger.c:628 +#: commands/trigger.c:621 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" -msgstr "la condición WHEN de un disparador en INSERT no puede referirse a valores OLD" +msgstr "la condición WHEN de un “trigger†en INSERT no puede referirse a valores OLD" -#: commands/trigger.c:641 +#: commands/trigger.c:634 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" -msgstr "la condición WHEN de un disparador en DELETE no puede referirse a valores NEW" +msgstr "la condición WHEN de un “trigger†en DELETE no puede referirse a valores NEW" -#: commands/trigger.c:646 +#: commands/trigger.c:639 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" -msgstr "la condición WHEN de un disparador BEFORE no puede referirse a columnas de sistema de NEW" +msgstr "la condición WHEN de un “trigger†BEFORE no puede referirse a columnas de sistema de NEW" -#: commands/trigger.c:654 commands/trigger.c:662 +#: commands/trigger.c:647 commands/trigger.c:655 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "la condición WHEN del trigger BEFORE no puede hacer referencia a columnas NEW generadas" -#: commands/trigger.c:655 +#: commands/trigger.c:648 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "Se utiliza una referencia de la tupla completa, y la tabla contiene columnas generadas" -#: commands/trigger.c:770 commands/trigger.c:1614 +#: commands/trigger.c:763 commands/trigger.c:1607 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "ya existe un trigger «%s» para la relación «%s»" -#: commands/trigger.c:783 -#, fuzzy, c-format -#| msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" +#: commands/trigger.c:776 +#, c-format msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" -msgstr "disparador «%s» para la relación «%s» es un disparador de restricción" +msgstr "trigger «%s» para la relación «%s» es interno o derivado" -#: commands/trigger.c:802 +#: commands/trigger.c:795 #, c-format msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" -msgstr "disparador «%s» para la relación «%s» es un disparador de restricción" +msgstr "“trigger†«%s» para la relación «%s» es un “trigger†de restricción" -#: commands/trigger.c:1404 commands/trigger.c:1557 commands/trigger.c:1838 +#: commands/trigger.c:1397 commands/trigger.c:1550 commands/trigger.c:1831 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "no existe el trigger «%s» para la tabla «%s»" -#: commands/trigger.c:1529 -#, fuzzy, c-format -#| msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" +#: commands/trigger.c:1522 +#, c-format msgid "cannot rename trigger \"%s\" on table \"%s\"" -msgstr "no hay una entrada en pg_constraint para el trigger «%s» en tabla «%s»" +msgstr "no se puede cambiar el nombre del trigger «%s» en tabla «%s»" -#: commands/trigger.c:1531 -#, fuzzy, c-format -#| msgid "Change the ownership of the index's table, instead." +#: commands/trigger.c:1524 +#, c-format msgid "Rename the trigger on the partitioned table \"%s\" instead." -msgstr "Considere cambiar el dueño de la tabla en vez de cambiar el dueño del índice." +msgstr "Cambie el nombre del trigger en la tabla particionada «%s» en su lugar." -#: commands/trigger.c:1631 -#, fuzzy, c-format -#| msgid "cannot alter constraint \"%s\" on relation \"%s\"" +#: commands/trigger.c:1624 +#, c-format msgid "renamed trigger \"%s\" on relation \"%s\"" -msgstr "no se puede modificar la restricción «%s» en la relación «%s»" +msgstr "se renombró el trigger «%s» en la relación «%s»" -#: commands/trigger.c:1777 +#: commands/trigger.c:1770 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "permiso denegado: «%s» es un trigger de sistema" -#: commands/trigger.c:2386 +#: commands/trigger.c:2379 #, c-format msgid "trigger function %u returned null value" msgstr "la función de trigger %u ha retornado un valor null" -#: commands/trigger.c:2446 commands/trigger.c:2664 commands/trigger.c:2917 -#: commands/trigger.c:3252 +#: commands/trigger.c:2439 commands/trigger.c:2657 commands/trigger.c:2910 +#: commands/trigger.c:3263 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "un trigger BEFORE STATEMENT no puede retornar un valor" -#: commands/trigger.c:2522 +#: commands/trigger.c:2515 #, c-format msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" msgstr "mover registros a otra partición durante un trigger BEFORE FOR EACH ROW no está soportado" -#: commands/trigger.c:2523 +#: commands/trigger.c:2516 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "Antes de ejecutar el trigger «%s», la fila iba a estar en la partición «%s.%s»." -#: commands/trigger.c:3329 executor/nodeModifyTable.c:2363 -#: executor/nodeModifyTable.c:2446 -#, c-format -msgid "tuple to be updated was already modified by an operation triggered by the current command" -msgstr "el registro a ser actualizado ya fue modificado por una operación disparada por la orden actual" - -#: commands/trigger.c:3330 executor/nodeModifyTable.c:1531 -#: executor/nodeModifyTable.c:1605 executor/nodeModifyTable.c:2364 -#: executor/nodeModifyTable.c:2447 executor/nodeModifyTable.c:3077 +#: commands/trigger.c:3341 executor/nodeModifyTable.c:1541 +#: executor/nodeModifyTable.c:1615 executor/nodeModifyTable.c:2377 +#: executor/nodeModifyTable.c:2468 executor/nodeModifyTable.c:3132 +#: executor/nodeModifyTable.c:3302 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." -msgstr "Considere usar un disparador AFTER en lugar de un disparador BEFORE para propagar cambios a otros registros." +msgstr "Considere usar un “trigger†AFTER en lugar de un “trigger†BEFORE para propagar cambios a otros registros." -#: commands/trigger.c:3371 executor/nodeLockRows.c:229 -#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:308 -#: executor/nodeModifyTable.c:1547 executor/nodeModifyTable.c:2381 -#: executor/nodeModifyTable.c:2589 +#: commands/trigger.c:3382 executor/nodeLockRows.c:228 +#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:314 +#: executor/nodeModifyTable.c:1557 executor/nodeModifyTable.c:2394 +#: executor/nodeModifyTable.c:2618 #, c-format msgid "could not serialize access due to concurrent update" msgstr "no se pudo serializar el acceso debido a un update concurrente" -#: commands/trigger.c:3379 executor/nodeModifyTable.c:1637 -#: executor/nodeModifyTable.c:2464 executor/nodeModifyTable.c:2613 -#: executor/nodeModifyTable.c:2965 +#: commands/trigger.c:3390 executor/nodeModifyTable.c:1647 +#: executor/nodeModifyTable.c:2485 executor/nodeModifyTable.c:2642 +#: executor/nodeModifyTable.c:3150 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "no se pudo serializar el acceso debido a un delete concurrente" -#: commands/trigger.c:4555 +#: commands/trigger.c:4599 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" -msgstr "no se puede ejecutar un disparador postergado dentro de una operación restringida por seguridad" +msgstr "no se puede ejecutar un “trigger†postergado dentro de una operación restringida por seguridad" -#: commands/trigger.c:5738 +#: commands/trigger.c:5780 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "la restricción «%s» no es postergable" -#: commands/trigger.c:5761 +#: commands/trigger.c:5803 #, c-format msgid "constraint \"%s\" does not exist" msgstr "no existe la restricción «%s»" -#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:635 +#: commands/tsearchcmds.c:124 commands/tsearchcmds.c:641 #, c-format msgid "function %s should return type %s" msgstr "la función %s debería retornar el tipo %s" -#: commands/tsearchcmds.c:194 +#: commands/tsearchcmds.c:200 #, c-format msgid "must be superuser to create text search parsers" msgstr "debe ser superusuario para crear analizadores de búsqueda en texto" -#: commands/tsearchcmds.c:247 +#: commands/tsearchcmds.c:253 #, c-format msgid "text search parser parameter \"%s\" not recognized" msgstr "el parámetro de analizador de búsqueda en texto «%s» no es reconocido" -#: commands/tsearchcmds.c:257 +#: commands/tsearchcmds.c:263 #, c-format msgid "text search parser start method is required" msgstr "el método «start» del analizador de búsqueda en texto es obligatorio" -#: commands/tsearchcmds.c:262 +#: commands/tsearchcmds.c:268 #, c-format msgid "text search parser gettoken method is required" msgstr "el método «gettoken» del analizador de búsqueda en texto es obligatorio" -#: commands/tsearchcmds.c:267 +#: commands/tsearchcmds.c:273 #, c-format msgid "text search parser end method is required" msgstr "el método «end» del analizador de búsqueda en texto es obligatorio" -#: commands/tsearchcmds.c:272 +#: commands/tsearchcmds.c:278 #, c-format msgid "text search parser lextypes method is required" msgstr "el método «lextypes» del analizador de búsqueda en texto es obligatorio" -#: commands/tsearchcmds.c:366 +#: commands/tsearchcmds.c:372 #, c-format msgid "text search template \"%s\" does not accept options" msgstr "la plantilla de búsquede en texto «%s» no acepta opciones" -#: commands/tsearchcmds.c:440 +#: commands/tsearchcmds.c:446 #, c-format msgid "text search template is required" msgstr "la plantilla de búsqueda en texto es obligatoria" -#: commands/tsearchcmds.c:701 +#: commands/tsearchcmds.c:707 #, c-format msgid "must be superuser to create text search templates" msgstr "debe ser superusuario para crear una plantilla de búsqueda en texto" -#: commands/tsearchcmds.c:743 +#: commands/tsearchcmds.c:749 #, c-format msgid "text search template parameter \"%s\" not recognized" msgstr "el parámetro de la plantilla de búsqueda en texto «%s» no es reconocido" -#: commands/tsearchcmds.c:753 +#: commands/tsearchcmds.c:759 #, c-format msgid "text search template lexize method is required" msgstr "el método «lexize» de la plantilla de búsqueda en texto es obligatorio" -#: commands/tsearchcmds.c:933 +#: commands/tsearchcmds.c:939 #, c-format msgid "text search configuration parameter \"%s\" not recognized" msgstr "el parámetro de configuración de búsqueda en texto «%s» no es reconocido" -#: commands/tsearchcmds.c:940 +#: commands/tsearchcmds.c:946 #, c-format msgid "cannot specify both PARSER and COPY options" msgstr "no se puede especificar simultáneamente las opciones PARSER y COPY" -#: commands/tsearchcmds.c:976 +#: commands/tsearchcmds.c:982 #, c-format msgid "text search parser is required" msgstr "el analizador de búsqueda en texto es obligatorio" -#: commands/tsearchcmds.c:1241 +#: commands/tsearchcmds.c:1277 #, c-format msgid "token type \"%s\" does not exist" msgstr "no existe el tipo de elemento «%s»" -#: commands/tsearchcmds.c:1501 +#: commands/tsearchcmds.c:1540 #, c-format msgid "mapping for token type \"%s\" does not exist" msgstr "no existe un mapeo para el tipo de elemento «%s»" -#: commands/tsearchcmds.c:1507 +#: commands/tsearchcmds.c:1546 #, c-format msgid "mapping for token type \"%s\" does not exist, skipping" msgstr "el mapeo para el tipo de elemento «%s» no existe, omitiendo" -#: commands/tsearchcmds.c:1670 commands/tsearchcmds.c:1785 +#: commands/tsearchcmds.c:1707 commands/tsearchcmds.c:1822 #, c-format msgid "invalid parameter list format: \"%s\"" msgstr "el formato de la lista de parámetros no es válido: «%s»" -#: commands/typecmds.c:217 +#: commands/typecmds.c:221 #, c-format msgid "must be superuser to create a base type" msgstr "debe ser superusuario para crear un tipo base" -#: commands/typecmds.c:275 +#: commands/typecmds.c:279 #, c-format msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." msgstr "Cree el tipo como un tipo inconcluso, luego cree sus funciones de I/O, luego haga un CREATE TYPE completo." -#: commands/typecmds.c:327 commands/typecmds.c:1450 commands/typecmds.c:4257 +#: commands/typecmds.c:331 commands/typecmds.c:1460 commands/typecmds.c:4480 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "el atributo de tipo «%s» no es reconocido" -#: commands/typecmds.c:382 +#: commands/typecmds.c:386 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "la categoría de tipo «%s» no es válida: debe ser ASCII simple" -#: commands/typecmds.c:401 +#: commands/typecmds.c:405 #, c-format msgid "array element type cannot be %s" msgstr "el tipo de elemento de array no puede ser %s" -#: commands/typecmds.c:433 +#: commands/typecmds.c:437 #, c-format msgid "alignment \"%s\" not recognized" msgstr "el alineamiento «%s» no es reconocido" -#: commands/typecmds.c:450 commands/typecmds.c:4131 +#: commands/typecmds.c:454 commands/typecmds.c:4354 #, c-format msgid "storage \"%s\" not recognized" msgstr "el almacenamiento «%s» no es reconocido" -#: commands/typecmds.c:461 +#: commands/typecmds.c:465 #, c-format msgid "type input function must be specified" msgstr "debe especificarse la función de ingreso del tipo" -#: commands/typecmds.c:465 +#: commands/typecmds.c:469 #, c-format msgid "type output function must be specified" msgstr "debe especificarse la función de salida de tipo" -#: commands/typecmds.c:470 +#: commands/typecmds.c:474 #, c-format msgid "type modifier output function is useless without a type modifier input function" msgstr "la función de salida de modificadores de tipo es inútil sin una función de entrada de modificadores de tipo" -#: commands/typecmds.c:512 +#: commands/typecmds.c:516 #, c-format msgid "element type cannot be specified without a subscripting function" msgstr "no se puede especificar tipo de elemento sin una función de subindexación" -#: commands/typecmds.c:781 +#: commands/typecmds.c:785 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "«%s» no es un tipo de dato base válido para un dominio" -#: commands/typecmds.c:879 +#: commands/typecmds.c:883 #, c-format msgid "multiple default expressions" msgstr "múltiples expresiones default" -#: commands/typecmds.c:942 commands/typecmds.c:951 +#: commands/typecmds.c:946 commands/typecmds.c:955 #, c-format msgid "conflicting NULL/NOT NULL constraints" msgstr "las restricciones NULL/NOT NULL no coinciden" -#: commands/typecmds.c:967 +#: commands/typecmds.c:971 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "las restricciones «check» en dominios no pueden ser marcadas NO INHERIT" -#: commands/typecmds.c:976 commands/typecmds.c:2956 +#: commands/typecmds.c:980 commands/typecmds.c:2940 #, c-format msgid "unique constraints not possible for domains" msgstr "no se pueden poner restricciones de unicidad a un dominio" -#: commands/typecmds.c:982 commands/typecmds.c:2962 +#: commands/typecmds.c:986 commands/typecmds.c:2946 #, c-format msgid "primary key constraints not possible for domains" msgstr "no se pueden poner restricciones de llave primaria a un dominio" -#: commands/typecmds.c:988 commands/typecmds.c:2968 +#: commands/typecmds.c:992 commands/typecmds.c:2952 #, c-format msgid "exclusion constraints not possible for domains" msgstr "las restricciones de exclusión no son posibles para los dominios" -#: commands/typecmds.c:994 commands/typecmds.c:2974 +#: commands/typecmds.c:998 commands/typecmds.c:2958 #, c-format msgid "foreign key constraints not possible for domains" msgstr "no se pueden poner restricciones de llave foránea a un dominio" -#: commands/typecmds.c:1003 commands/typecmds.c:2983 +#: commands/typecmds.c:1007 commands/typecmds.c:2967 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "no se puede especificar la postergabilidad de las restricciones a un dominio" -#: commands/typecmds.c:1317 utils/cache/typcache.c:2561 +#: commands/typecmds.c:1327 utils/cache/typcache.c:2570 #, c-format msgid "%s is not an enum" msgstr "%s no es un enum" -#: commands/typecmds.c:1458 +#: commands/typecmds.c:1468 #, c-format msgid "type attribute \"subtype\" is required" msgstr "el atributo de tipo «subtype» es obligatorio" -#: commands/typecmds.c:1463 +#: commands/typecmds.c:1473 #, c-format msgid "range subtype cannot be %s" msgstr "el subtipo de rango no puede ser %s" -#: commands/typecmds.c:1482 +#: commands/typecmds.c:1492 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "se especificó un ordenamiento (collation) al rango, pero el subtipo no soporta ordenamiento" -#: commands/typecmds.c:1492 +#: commands/typecmds.c:1502 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "no se puede especificar una función canónica sin antes crear un tipo inconcluso" -#: commands/typecmds.c:1493 +#: commands/typecmds.c:1503 #, c-format msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." msgstr "Cree el tipo como un tipo inconcluso, luego cree su función de canonicalización, luego haga un CREATE TYPE completo." -#: commands/typecmds.c:1965 +#: commands/typecmds.c:1975 #, c-format msgid "type input function %s has multiple matches" msgstr "la función de entrada %s del tipo tiene múltiples coincidencias" -#: commands/typecmds.c:1983 +#: commands/typecmds.c:1993 #, c-format msgid "type input function %s must return type %s" msgstr "la función de entrada %s del tipo debe retornar %s" -#: commands/typecmds.c:1999 +#: commands/typecmds.c:2009 #, c-format msgid "type input function %s should not be volatile" msgstr "la función de entrada %s no debe ser volatile" -#: commands/typecmds.c:2027 +#: commands/typecmds.c:2037 #, c-format msgid "type output function %s must return type %s" msgstr "la función de salida %s del tipo debe retornar %s" -#: commands/typecmds.c:2034 +#: commands/typecmds.c:2044 #, c-format msgid "type output function %s should not be volatile" msgstr "la función de salida %s no debe ser volatile" -#: commands/typecmds.c:2063 +#: commands/typecmds.c:2073 #, c-format msgid "type receive function %s has multiple matches" msgstr "la función de recepción %s del tipo tiene múltiples coincidencias" -#: commands/typecmds.c:2081 +#: commands/typecmds.c:2091 #, c-format msgid "type receive function %s must return type %s" msgstr "la función de recepción %s del tipo debe retornar %s" -#: commands/typecmds.c:2088 +#: commands/typecmds.c:2098 #, c-format msgid "type receive function %s should not be volatile" msgstr "la función «receive» %s del tipo no debe ser volatile" -#: commands/typecmds.c:2116 +#: commands/typecmds.c:2126 #, c-format msgid "type send function %s must return type %s" msgstr "la función «send» %s del tipo debe retornar %s" -#: commands/typecmds.c:2123 +#: commands/typecmds.c:2133 #, c-format msgid "type send function %s should not be volatile" msgstr "la función «send» %s no debe ser volatile" -#: commands/typecmds.c:2150 +#: commands/typecmds.c:2160 #, c-format msgid "typmod_in function %s must return type %s" msgstr "la función typmod_in %s debe retornar tipo %s" -#: commands/typecmds.c:2157 +#: commands/typecmds.c:2167 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "la función de modificadores de tipo %s no debe ser volatile" -#: commands/typecmds.c:2184 +#: commands/typecmds.c:2194 #, c-format msgid "typmod_out function %s must return type %s" msgstr "la función typmod_out %s debe retornar tipo %s" -#: commands/typecmds.c:2191 +#: commands/typecmds.c:2201 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "la función de salida de modificadores de tipo %s no debe ser volatile" -#: commands/typecmds.c:2218 +#: commands/typecmds.c:2228 #, c-format msgid "type analyze function %s must return type %s" msgstr "la función de análisis %s del tipo debe retornar %s" -#: commands/typecmds.c:2247 +#: commands/typecmds.c:2257 #, c-format msgid "type subscripting function %s must return type %s" msgstr "la función de subindexación %s del tipo debe retornar %s" -#: commands/typecmds.c:2257 +#: commands/typecmds.c:2267 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "los tipos definidos por el usuario no pueden usar la función de subindexación %s" -#: commands/typecmds.c:2303 +#: commands/typecmds.c:2313 #, c-format msgid "You must specify an operator class for the range type or define a default operator class for the subtype." msgstr "Debe especificar una clase de operadores para el tipo de rango, o definir una clase de operadores por omisión para el subtipo." -#: commands/typecmds.c:2334 +#: commands/typecmds.c:2344 #, c-format msgid "range canonical function %s must return range type" msgstr "la función canónica %s del rango debe retornar tipo de rango" -#: commands/typecmds.c:2340 +#: commands/typecmds.c:2350 #, c-format msgid "range canonical function %s must be immutable" msgstr "la función canónica %s del rango debe ser inmutable" -#: commands/typecmds.c:2376 +#: commands/typecmds.c:2386 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "la función «diff» de subtipo, %s, debe retornar tipo %s" -#: commands/typecmds.c:2383 +#: commands/typecmds.c:2393 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "la función «diff» de subtipo, %s, debe ser inmutable" -#: commands/typecmds.c:2410 +#: commands/typecmds.c:2420 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "el valor de OID de pg_type no se definió en modo de actualización binaria" -#: commands/typecmds.c:2443 +#: commands/typecmds.c:2453 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "el valor de OID de multirango de pg_type no se definió en modo de actualización binaria" -#: commands/typecmds.c:2476 +#: commands/typecmds.c:2486 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" -msgstr "el valor de OID de arreglo de multirango de pg_type no se definió en modo de actualización binaria" - -#: commands/typecmds.c:2772 -#, c-format -msgid "column \"%s\" of table \"%s\" contains null values" -msgstr "la columna «%s» de la tabla «%s» contiene valores null" +msgstr "el valor de OID de array de multirango de pg_type no se definió en modo de actualización binaria" -#: commands/typecmds.c:2885 commands/typecmds.c:3086 +#: commands/typecmds.c:2868 commands/typecmds.c:3093 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "no existe la restricción «%s» en el dominio «%s»" -#: commands/typecmds.c:2889 +#: commands/typecmds.c:2872 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "no existe la restricción «%s» en el dominio «%s», omitiendo" -#: commands/typecmds.c:3093 +#: commands/typecmds.c:3100 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "la restricción «%s» en el dominio «%s» no es una restricción «check»" -#: commands/typecmds.c:3194 +#: commands/typecmds.c:3180 +#, c-format +msgid "column \"%s\" of table \"%s\" contains null values" +msgstr "la columna «%s» de la tabla «%s» contiene valores null" + +#: commands/typecmds.c:3269 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "la columna «%s» de la relación «%s» contiene valores que violan la nueva restricción" -#: commands/typecmds.c:3423 commands/typecmds.c:3622 commands/typecmds.c:3703 -#: commands/typecmds.c:3889 +#: commands/typecmds.c:3498 commands/typecmds.c:3772 commands/typecmds.c:3857 +#: commands/typecmds.c:4073 #, c-format msgid "%s is not a domain" msgstr "%s no es un dominio" -#: commands/typecmds.c:3455 +#: commands/typecmds.c:3532 commands/typecmds.c:3686 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "el dominio «%2$s» ya contiene una restricción llamada «%1$s»" -#: commands/typecmds.c:3506 +#: commands/typecmds.c:3583 #, c-format msgid "cannot use table references in domain check constraint" msgstr "no se pueden usar referencias a tablas en restricción «check» para un dominio" -#: commands/typecmds.c:3634 commands/typecmds.c:3715 commands/typecmds.c:4006 +#: commands/typecmds.c:3784 commands/typecmds.c:3869 commands/typecmds.c:4223 #, c-format msgid "%s is a table's row type" msgstr "%s es el tipo de registro de una tabla" -#: commands/typecmds.c:3636 commands/typecmds.c:3717 commands/typecmds.c:4008 -#, c-format -msgid "Use ALTER TABLE instead." -msgstr "Considere usar ALTER TABLE." - -#: commands/typecmds.c:3642 commands/typecmds.c:3723 commands/typecmds.c:3921 +#: commands/typecmds.c:3794 commands/typecmds.c:3879 commands/typecmds.c:4121 #, c-format msgid "cannot alter array type %s" -msgstr "no se puede alterar el tipo de array «%s»" +msgstr "no se puede alterar el tipo de array %s" -#: commands/typecmds.c:3644 commands/typecmds.c:3725 commands/typecmds.c:3923 +#: commands/typecmds.c:3796 commands/typecmds.c:3881 commands/typecmds.c:4123 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "Puede alterar el tipo %s, lo cual alterará el tipo de array también." -#: commands/typecmds.c:3991 +#: commands/typecmds.c:3892 +#, c-format +msgid "cannot alter multirange type %s" +msgstr "no se puede alterar el tipo multirango %s" + +#: commands/typecmds.c:3895 +#, c-format +msgid "You can alter type %s, which will alter the multirange type as well." +msgstr "Puede alterar el tipo %s, lo cual alterará el tipo de multirango también." + +#: commands/typecmds.c:4202 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "ya existe un tipo llamado «%s» en el esquema «%s»" -#: commands/typecmds.c:4159 +#: commands/typecmds.c:4382 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "no se puede cambiar el almacenamiento del tipo a PLAIN" -#: commands/typecmds.c:4252 +#: commands/typecmds.c:4475 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "el atributo de tipo «%s» no puede ser cambiado" -#: commands/typecmds.c:4270 +#: commands/typecmds.c:4493 #, c-format msgid "must be superuser to alter a type" msgstr "debe ser superusuario para alterar un tipo" -#: commands/typecmds.c:4291 commands/typecmds.c:4300 +#: commands/typecmds.c:4514 commands/typecmds.c:4523 #, c-format msgid "%s is not a base type" msgstr "«%s» no es un tipo base" -#: commands/user.c:201 +#: commands/user.c:200 #, c-format msgid "SYSID can no longer be specified" msgstr "SYSID ya no puede ser especificado" -#: commands/user.c:319 commands/user.c:325 commands/user.c:331 -#: commands/user.c:337 commands/user.c:343 +#: commands/user.c:318 commands/user.c:324 commands/user.c:330 +#: commands/user.c:336 commands/user.c:342 #, c-format msgid "permission denied to create role" msgstr "se ha denegado el permiso para crear el rol" -#: commands/user.c:320 +#: commands/user.c:319 #, c-format msgid "Only roles with the %s attribute may create roles." -msgstr "" +msgstr "Sólo los roles con el atributo %s pueden crear roles." -#: commands/user.c:326 commands/user.c:332 commands/user.c:338 -#: commands/user.c:344 +#: commands/user.c:325 commands/user.c:331 commands/user.c:337 +#: commands/user.c:343 #, c-format -msgid "Only roles with the %s attribute may create roles with %s." -msgstr "" +msgid "Only roles with the %s attribute may create roles with the %s attribute." +msgstr "Sólo los roles con el atributo %s pueden crear roles con el atributo %s." -#: commands/user.c:355 commands/user.c:1393 commands/user.c:1400 -#: utils/adt/acl.c:5409 utils/adt/acl.c:5415 gram.y:16790 gram.y:16836 +#: commands/user.c:354 commands/user.c:1386 commands/user.c:1393 +#: utils/adt/acl.c:5574 utils/adt/acl.c:5580 gram.y:17310 gram.y:17356 #, c-format msgid "role name \"%s\" is reserved" msgstr "el nombre de rol «%s» está reservado" -#: commands/user.c:357 commands/user.c:1395 commands/user.c:1402 +#: commands/user.c:356 commands/user.c:1388 commands/user.c:1395 #, c-format msgid "Role names starting with \"pg_\" are reserved." msgstr "Los nombres de rol que empiezan con «pg_» están reservados." -#: commands/user.c:378 commands/user.c:1417 +#: commands/user.c:377 commands/user.c:1410 #, c-format msgid "role \"%s\" already exists" msgstr "el rol «%s» ya existe" -#: commands/user.c:440 commands/user.c:925 +#: commands/user.c:439 commands/user.c:924 #, c-format msgid "empty string is not a valid password, clearing password" msgstr "la cadena vacía no es una contraseña válida, limpiando la contraseña" -#: commands/user.c:469 +#: commands/user.c:468 #, c-format msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "el valor de OID de pg_authid no se definió en modo de actualización binaria" -#: commands/user.c:653 commands/user.c:1011 -#, fuzzy -#| msgid "cannot alter inherited column \"%s\"" +#: commands/user.c:652 commands/user.c:1010 msgid "Cannot alter reserved roles." -msgstr "no se puede alterar la columna heredada «%s»" +msgstr "No se pueden alterar roles reservados." -#: commands/user.c:760 commands/user.c:766 commands/user.c:782 -#: commands/user.c:790 commands/user.c:804 commands/user.c:810 -#: commands/user.c:816 commands/user.c:825 commands/user.c:870 -#: commands/user.c:1033 commands/user.c:1044 -#, fuzzy, c-format -#| msgid "permission denied to create role" +#: commands/user.c:759 commands/user.c:765 commands/user.c:781 +#: commands/user.c:789 commands/user.c:803 commands/user.c:809 +#: commands/user.c:815 commands/user.c:824 commands/user.c:869 +#: commands/user.c:1032 commands/user.c:1043 +#, c-format msgid "permission denied to alter role" -msgstr "se ha denegado el permiso para crear el rol" +msgstr "se ha denegado el permiso para alterar el rol" -#: commands/user.c:761 commands/user.c:1034 +#: commands/user.c:760 commands/user.c:1033 #, c-format -msgid "Only roles with the %s attribute may alter roles with %s." -msgstr "" +msgid "Only roles with the %s attribute may alter roles with the %s attribute." +msgstr "Sólo los roles con el atributo %s pueden alterar roles con el atributo %s." -#: commands/user.c:767 commands/user.c:805 commands/user.c:811 -#: commands/user.c:817 +#: commands/user.c:766 commands/user.c:804 commands/user.c:810 +#: commands/user.c:816 #, c-format msgid "Only roles with the %s attribute may change the %s attribute." -msgstr "" +msgstr "Sólo roles con el atributo %s pueden cambiar el atributo %s." -#: commands/user.c:783 commands/user.c:1045 +#: commands/user.c:782 commands/user.c:1044 #, c-format msgid "Only roles with the %s attribute and the %s option on role \"%s\" may alter this role." -msgstr "" +msgstr "Sólo los roles con el atributo %s y la opción %s en el rol «%s» pueden alterar este rol." -#: commands/user.c:791 +#: commands/user.c:790 #, c-format msgid "To change another role's password, the current user must have the %s attribute and the %s option on the role." -msgstr "" +msgstr "Para cambiar la password de otro rol, el usuario actual debe tener el atributo %s y la opción %s en el rol." -#: commands/user.c:826 +#: commands/user.c:825 #, c-format -msgid "Only roles with the %s option on role \"%s\" may add members." -msgstr "" +#| msgid "Only roles with the %s option on role \"%s\" may add members." +msgid "Only roles with the %s option on role \"%s\" may add or drop members." +msgstr "Sólo los roles con la opción %s en el rol «%s» pueden agregar miembros." -#: commands/user.c:871 +#: commands/user.c:870 #, c-format -msgid "The bootstrap user must have the %s attribute." -msgstr "" +msgid "The bootstrap superuser must have the %s attribute." +msgstr "El superusuario de \"bootstrap\" debe tener el atributo %s." -#: commands/user.c:1076 -#, fuzzy, c-format -#| msgid "permission denied to create role" +#: commands/user.c:1075 +#, c-format msgid "permission denied to alter setting" -msgstr "se ha denegado el permiso para crear el rol" +msgstr "se ha denegado el permiso para modificar la configuración" -#: commands/user.c:1077 -#, fuzzy, c-format -#| msgid "must be superuser to alter settings globally" +#: commands/user.c:1076 +#, c-format msgid "Only roles with the %s attribute may alter settings globally." -msgstr "debe ser superusuario para alterar parámetros globalmente" +msgstr "Sólo los roles con el atributo %s pueden modificar parámetros de configuración globalmente." -#: commands/user.c:1101 commands/user.c:1173 commands/user.c:1179 +#: commands/user.c:1100 commands/user.c:1171 commands/user.c:1177 #, c-format msgid "permission denied to drop role" msgstr "se ha denegado el permiso para eliminar el rol" -#: commands/user.c:1102 +#: commands/user.c:1101 #, c-format msgid "Only roles with the %s attribute and the %s option on the target roles may drop roles." -msgstr "" +msgstr "Sólo los roles con el atributo %s y la opción %s en los roles de destino pueden borrar roles." -#: commands/user.c:1127 +#: commands/user.c:1125 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "no se puede usar un especificador especial de rol en DROP ROLE" -#: commands/user.c:1137 commands/user.c:1364 commands/variable.c:836 -#: commands/variable.c:839 commands/variable.c:923 commands/variable.c:926 -#: utils/adt/acl.c:359 utils/adt/acl.c:379 utils/adt/acl.c:5264 -#: utils/adt/acl.c:5312 utils/adt/acl.c:5340 utils/adt/acl.c:5359 -#: utils/adt/regproc.c:1551 utils/init/miscinit.c:757 +#: commands/user.c:1135 commands/user.c:1357 commands/variable.c:851 +#: commands/variable.c:854 commands/variable.c:971 commands/variable.c:974 +#: utils/adt/acl.c:365 utils/adt/acl.c:385 utils/adt/acl.c:5429 +#: utils/adt/acl.c:5477 utils/adt/acl.c:5505 utils/adt/acl.c:5524 +#: utils/adt/regproc.c:1571 utils/init/miscinit.c:799 #, c-format msgid "role \"%s\" does not exist" msgstr "no existe el rol «%s»" -#: commands/user.c:1142 +#: commands/user.c:1140 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "el rol «%s» no existe, omitiendo" -#: commands/user.c:1155 commands/user.c:1159 +#: commands/user.c:1153 commands/user.c:1157 #, c-format msgid "current user cannot be dropped" msgstr "el usuario activo no puede ser eliminado" -#: commands/user.c:1163 +#: commands/user.c:1161 #, c-format msgid "session user cannot be dropped" msgstr "no se puede eliminar un usuario de la sesión" -#: commands/user.c:1174 +#: commands/user.c:1172 #, c-format -msgid "Only roles with the %s attribute may drop roles with %s." -msgstr "" +msgid "Only roles with the %s attribute may drop roles with the %s attribute." +msgstr "Sólo los roles con el atributo %s pueden borrar roles con el atributo %s." -#: commands/user.c:1180 +#: commands/user.c:1178 #, c-format msgid "Only roles with the %s attribute and the %s option on role \"%s\" may drop this role." -msgstr "" +msgstr "Sólo los roles con el atributo %s y la opción %s en el rol «%s» pueden borrar este rol." -#: commands/user.c:1306 +#: commands/user.c:1299 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "no se puede eliminar el rol «%s» porque otros objetos dependen de él" -#: commands/user.c:1380 +#: commands/user.c:1373 #, c-format msgid "session user cannot be renamed" msgstr "no se puede cambiar el nombre a un usuario de la sesión" -#: commands/user.c:1384 +#: commands/user.c:1377 #, c-format msgid "current user cannot be renamed" msgstr "no se puede cambiar el nombre al usuario activo" -#: commands/user.c:1428 commands/user.c:1438 +#: commands/user.c:1421 commands/user.c:1431 #, c-format msgid "permission denied to rename role" msgstr "se ha denegado el permiso para cambiar el nombre al rol" -#: commands/user.c:1429 +#: commands/user.c:1422 #, c-format -msgid "Only roles with the %s attribute may rename roles with %s." -msgstr "" +msgid "Only roles with the %s attribute may rename roles with the %s attribute." +msgstr "Sólo los roles con el atributo %s pueden cambiar nombre a roles con el atributo %s." -#: commands/user.c:1439 +#: commands/user.c:1432 #, c-format msgid "Only roles with the %s attribute and the %s option on role \"%s\" may rename this role." -msgstr "" +msgstr "Sólo los roles con el atributo %s y la opción %s en el rol «%s» pueden cambiar nombre a este rol." -#: commands/user.c:1461 +#: commands/user.c:1454 #, c-format msgid "MD5 password cleared because of role rename" msgstr "la contraseña MD5 fue borrada debido al cambio de nombre del rol" -#: commands/user.c:1525 gram.y:1261 +#: commands/user.c:1518 gram.y:1294 #, c-format msgid "unrecognized role option \"%s\"" msgstr "opción de rol «%s» no reconocida" -#: commands/user.c:1530 -#, fuzzy, c-format -#| msgid "unrecognized value for option %s: %s" +#: commands/user.c:1523 +#, c-format msgid "unrecognized value for role option \"%s\": \"%s\"" -msgstr "valor no reconocido para la opción %s: %s" +msgstr "valor no reconocido para la opción de rol «%s»: «%s»" -#: commands/user.c:1563 +#: commands/user.c:1556 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "los nombres de columna no pueden ser incluidos en GRANT/REVOKE ROLE" -#: commands/user.c:1603 +#: commands/user.c:1596 #, c-format msgid "permission denied to drop objects" msgstr "se ha denegado el permiso para eliminar objetos" -#: commands/user.c:1604 +#: commands/user.c:1597 #, c-format msgid "Only roles with privileges of role \"%s\" may drop objects owned by it." -msgstr "" +msgstr "Sólo los roles con privilegios del rol «%s» pueden borrar objetos de que es dueño." -#: commands/user.c:1632 commands/user.c:1643 +#: commands/user.c:1625 commands/user.c:1636 #, c-format msgid "permission denied to reassign objects" msgstr "se ha denegado el permiso para reasignar objetos" -#: commands/user.c:1633 +#: commands/user.c:1626 #, c-format msgid "Only roles with privileges of role \"%s\" may reassign objects owned by it." -msgstr "" +msgstr "Sólo los roles con privilegios del rol «%s» pueden reasignar objetos de que es dueño." -#: commands/user.c:1644 +#: commands/user.c:1637 #, c-format msgid "Only roles with privileges of role \"%s\" may reassign objects to it." -msgstr "" +msgstr "Sólo los roles con privilegios del rol «%s» pueden reasignar objetos a él." -#: commands/user.c:1740 +#: commands/user.c:1733 #, c-format msgid "role \"%s\" cannot be a member of any role" msgstr "el rol «%s» no puede ser miembro de ningún rol" -#: commands/user.c:1753 +#: commands/user.c:1746 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "el rol «%s» es un miembro del rol «%s»" -#: commands/user.c:1793 commands/user.c:1819 -#, fuzzy, c-format -#| msgid "grant options cannot be granted back to your own grantor" +#: commands/user.c:1786 commands/user.c:1812 +#, c-format msgid "%s option cannot be granted back to your own grantor" -msgstr "la opción de grant no puede ser otorgada de vuelta a quien la otorgó" +msgstr "la opción %s no puede ser otorgada de vuelta a quien la otorgó" -#: commands/user.c:1896 -#, fuzzy, c-format -#| msgid "role \"%s\" is already a member of role \"%s\"" +#: commands/user.c:1889 +#, c-format msgid "role \"%s\" has already been granted membership in role \"%s\" by role \"%s\"" -msgstr "el rol «%s» ya es un miembro del rol «%s»" +msgstr "el rol «%s» ya recibió membresía en el rol «%s» por parte del rol «%s»" -#: commands/user.c:2031 -#, fuzzy, c-format -#| msgid "role \"%s\" is not a member of role \"%s\"" +#: commands/user.c:2024 +#, c-format msgid "role \"%s\" has not been granted membership in role \"%s\" by role \"%s\"" -msgstr "el rol «%s» no es un miembro del rol «%s»" +msgstr "al rol «%s» no se le ha otorgado membresía en el rol «%s» por parte del rol «%s»" -#: commands/user.c:2131 +#: commands/user.c:2124 #, c-format msgid "role \"%s\" cannot have explicit members" msgstr "el rol «%s» no puede tener miembros explícitos" -#: commands/user.c:2142 commands/user.c:2165 -#, fuzzy, c-format -#| msgid "permission denied to set role \"%s\"" +#: commands/user.c:2135 commands/user.c:2158 +#, c-format msgid "permission denied to grant role \"%s\"" -msgstr "se ha denegado el permiso para definir el rol «%s»" +msgstr "se ha denegado el permiso para otorgar el rol «%s»" -#: commands/user.c:2144 +#: commands/user.c:2137 #, c-format -msgid "Only roles with the %s attribute may grant roles with %s." -msgstr "" +msgid "Only roles with the %s attribute may grant roles with the %s attribute." +msgstr "Sólo los roles con el atributo %s pueden otorgar roles con el atributo %s." -#: commands/user.c:2149 commands/user.c:2172 -#, fuzzy, c-format -#| msgid "permission denied to set role \"%s\"" +#: commands/user.c:2142 commands/user.c:2165 +#, c-format msgid "permission denied to revoke role \"%s\"" -msgstr "se ha denegado el permiso para definir el rol «%s»" +msgstr "se ha denegado el permiso para revocar el rol «%s»" -#: commands/user.c:2151 +#: commands/user.c:2144 #, c-format -msgid "Only roles with the %s attribute may revoke roles with %s." -msgstr "" +msgid "Only roles with the %s attribute may revoke roles with the %s attribute." +msgstr "Sólo los roles con el atributo %s pueden revocar roles con el atributo %s." -#: commands/user.c:2167 +#: commands/user.c:2160 #, c-format msgid "Only roles with the %s option on role \"%s\" may grant this role." -msgstr "" +msgstr "Sólo los roles con la opción %s en el rol «%s» pueden otorgar este rol." -#: commands/user.c:2174 +#: commands/user.c:2167 #, c-format msgid "Only roles with the %s option on role \"%s\" may revoke this role." -msgstr "" +msgstr "Sólo los roles con la opción %s en el rol «%s» pueden revocar este rol." -#: commands/user.c:2254 commands/user.c:2263 -#, fuzzy, c-format -#| msgid "permission denied to set role \"%s\"" +#: commands/user.c:2247 commands/user.c:2256 +#, c-format msgid "permission denied to grant privileges as role \"%s\"" -msgstr "se ha denegado el permiso para definir el rol «%s»" +msgstr "se ha denegado el permiso para otorgar privilegio de rol «%s»" -#: commands/user.c:2256 +#: commands/user.c:2249 #, c-format msgid "Only roles with privileges of role \"%s\" may grant privileges as this role." -msgstr "" +msgstr "Sólo los roles con privilegios del rol «%s» pueden otorgar privilegios como este rol." -#: commands/user.c:2265 -#, fuzzy, c-format -#| msgid "must have admin option on role \"%s\"" +#: commands/user.c:2258 +#, c-format msgid "The grantor must have the %s option on role \"%s\"." -msgstr "debe tener opción de admin en rol «%s»" +msgstr "El otorgador debe tener la opción %s en el rol «%s»." -#: commands/user.c:2273 -#, fuzzy, c-format -#| msgid "permission denied to set role \"%s\"" +#: commands/user.c:2266 +#, c-format msgid "permission denied to revoke privileges granted by role \"%s\"" -msgstr "se ha denegado el permiso para definir el rol «%s»" +msgstr "se ha denegado el permiso a revocar permisos otorgados por el rol «%s»" -#: commands/user.c:2275 +#: commands/user.c:2268 #, c-format msgid "Only roles with privileges of role \"%s\" may revoke privileges granted by this role." -msgstr "" +msgstr "Sólo los roles con privilegios del rol «%s» pueden revocar privilegios otorgados por este rol." -#: commands/user.c:2498 utils/adt/acl.c:1312 +#: commands/user.c:2491 utils/adt/acl.c:1324 #, c-format msgid "dependent privileges exist" msgstr "existen privilegios dependientes" -#: commands/user.c:2499 utils/adt/acl.c:1313 +#: commands/user.c:2492 utils/adt/acl.c:1325 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Use CASCADE para revocarlos también." -#: commands/vacuum.c:138 +#: commands/vacuum.c:134 #, c-format msgid "\"vacuum_buffer_usage_limit\" must be 0 or between %d kB and %d kB" -msgstr "" +msgstr "«vacuum_buffer_usage_limit» debe ser 0 o estar entre %d kB y %d kB" -#: commands/vacuum.c:210 -#, fuzzy, c-format -#| msgid "NUMERIC precision %d must be between 1 and %d" +#: commands/vacuum.c:209 +#, c-format msgid "BUFFER_USAGE_LIMIT option must be 0 or between %d kB and %d kB" -msgstr "la precisión %d de NUMERIC debe estar entre 1 y %d" +msgstr "la opción BUFFER_USAGE_LIMIT debe ser 0 o estar entre %d kB y %d kB" -#: commands/vacuum.c:220 +#: commands/vacuum.c:219 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "opción de ANALYZE «%s» no reconocida" -#: commands/vacuum.c:260 +#: commands/vacuum.c:259 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "la opción parallel requiere un valor entre 0 y %d" -#: commands/vacuum.c:272 +#: commands/vacuum.c:271 #, c-format msgid "parallel workers for vacuum must be between 0 and %d" msgstr "el número de procesos paralelos para vacuum debe estar entre 0 y %d" -#: commands/vacuum.c:293 +#: commands/vacuum.c:292 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "opción de VACUUM «%s» no reconocida" -#: commands/vacuum.c:319 +#: commands/vacuum.c:318 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULL no puede ser ejecutado en paralelo" -#: commands/vacuum.c:330 +#: commands/vacuum.c:329 #, c-format msgid "BUFFER_USAGE_LIMIT cannot be specified for VACUUM FULL" -msgstr "" +msgstr "BUFFER_USAGE_LIMIT no puede ser especificado para VACUUM FULL" -#: commands/vacuum.c:344 +#: commands/vacuum.c:343 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "la opción ANALYZE debe especificarse cuando se provee una lista de columnas" -#: commands/vacuum.c:356 +#: commands/vacuum.c:355 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "la opción DISABLE_PAGE_SKIPPING de VACUUM no puede usarse con FULL" -#: commands/vacuum.c:363 +#: commands/vacuum.c:362 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" msgstr "se requiere especificar PROCESS_TOAST al hacer VACUUM FULL" -#: commands/vacuum.c:372 -#, fuzzy, c-format -#| msgid "OLD TABLE cannot be specified multiple times" +#: commands/vacuum.c:371 +#, c-format msgid "ONLY_DATABASE_STATS cannot be specified with a list of tables" -msgstr "OLD TABLE no se puede especificar varias veces" +msgstr "ONLY_DATABASE_STATS no se puede especificar con una lista de tablas" -#: commands/vacuum.c:381 -#, fuzzy, c-format -#| msgid "option \"%s\" cannot be specified with other options" +#: commands/vacuum.c:380 +#, c-format msgid "ONLY_DATABASE_STATS cannot be specified with other VACUUM options" -msgstr "la opción «%s» no puede ser especificada con otras opciones" +msgstr "ONLY_DATABASE_STATS no puede ser especificada con otras opciones de VACUUM" -#: commands/vacuum.c:516 +#: commands/vacuum.c:515 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s no puede ejecutarse desde VACUUM o ANALYZE" -#: commands/vacuum.c:736 -#, fuzzy, c-format -#| msgid "permission denied for column %s" +#: commands/vacuum.c:730 +#, c-format msgid "permission denied to vacuum \"%s\", skipping it" -msgstr "permiso denegado a la columna %s" +msgstr "permiso denegado a hacer vacuum a «%s», ignorando" -#: commands/vacuum.c:749 -#, fuzzy, c-format -#| msgid "permission denied to set role \"%s\"" +#: commands/vacuum.c:743 +#, c-format msgid "permission denied to analyze \"%s\", skipping it" -msgstr "se ha denegado el permiso para definir el rol «%s»" +msgstr "se ha denegado el permiso para hacer analyze a «%s», ignorando" -#: commands/vacuum.c:827 commands/vacuum.c:924 +#: commands/vacuum.c:821 commands/vacuum.c:918 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" -msgstr "omitiendo el vacuum de «%s»: el candado no está disponible" +msgstr "omitiendo el vacuum de «%s»: el “lock†no está disponible" -#: commands/vacuum.c:832 +#: commands/vacuum.c:826 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "omitiendo el vacuum de «%s» --- la relación ya no existe" -#: commands/vacuum.c:848 commands/vacuum.c:929 +#: commands/vacuum.c:842 commands/vacuum.c:923 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" -msgstr "omitiendo analyze de «%s»: el candado no está disponible" +msgstr "omitiendo analyze de «%s»: el “lock†no está disponible" -#: commands/vacuum.c:853 +#: commands/vacuum.c:847 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "omitiendo analyze de «%s» --- la relación ya no existe" -#: commands/vacuum.c:1164 +#: commands/vacuum.c:1139 #, c-format msgid "cutoff for removing and freezing tuples is far in the past" -msgstr "" +msgstr "el punto de corte para eliminar y congelar tuplas es demasiado antiguo" -#: commands/vacuum.c:1165 commands/vacuum.c:1170 +#: commands/vacuum.c:1140 commands/vacuum.c:1145 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." msgstr "" -"Cierre transaciones abiertas pronto para impedir problemas por reciclaje de contadores.\n" +"Cierre transaciones abiertas pronto para impedir problemas por “wraparoundâ€.\n" "Puede que además necesite comprometer o abortar transacciones preparadas antiguas, o eliminar slots de replicación añejos." -#: commands/vacuum.c:1169 -#, fuzzy, c-format -#| msgid "oldest multixact is far in the past" +#: commands/vacuum.c:1144 +#, c-format msgid "cutoff for freezing multixacts is far in the past" -msgstr "multixact más antiguo es demasiado antiguo" +msgstr "el punto de corte para congelar multixacts es demasiado antiguo" -#: commands/vacuum.c:1897 +#: commands/vacuum.c:1900 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "algunas bases de datos no han tenido VACUUM en más de 2 mil millones de transacciones" -#: commands/vacuum.c:1898 +#: commands/vacuum.c:1901 #, c-format msgid "You might have already suffered transaction-wraparound data loss." -msgstr "Puede haber sufrido ya problemas de pérdida de datos por reciclaje del contador de transacciones." +msgstr "Puede haber sufrido ya problemas de pérdida de datos por “wraparound†del contador de transacciones." -#: commands/vacuum.c:2063 +#: commands/vacuum.c:2080 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "omitiendo «%s»: no se puede aplicar VACUUM a objetos que no son tablas o a tablas especiales de sistema" -#: commands/vacuum.c:2488 +#: commands/vacuum.c:2512 #, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "se recorrió el índice «%s» para eliminar %d versiones de filas" +msgid "scanned index \"%s\" to remove %lld row versions" +msgstr "se recorrió el índice «%s» para eliminar %lld versiones de filas" -#: commands/vacuum.c:2507 +#: commands/vacuum.c:2531 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "el índice «%s» ahora contiene %.0f versiones de filas en %u páginas" -#: commands/vacuum.c:2511 +#: commands/vacuum.c:2535 #, c-format msgid "" "%.0f index row versions were removed.\n" "%u index pages were newly deleted.\n" "%u index pages are currently deleted, of which %u are currently reusable." msgstr "" +"%.0f versiones de filas de índice fueron eliminadas.\n" +"%u páginas de índice fueron recién eliminadas.\n" +"%u páginas de índice están actualmente eliminadas, de las cuales %u son actualmente reusables." -#: commands/vacuumparallel.c:677 +#: commands/vacuumparallel.c:707 #, c-format msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" msgstr[0] "se lanzó %d proceso asistente para «vacuum» de índices (planeados: %d)" msgstr[1] "se lanzaron %d procesos asistentes para «vacuum» índices (planeados: %d)" -#: commands/vacuumparallel.c:683 +#: commands/vacuumparallel.c:713 #, c-format msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" @@ -13061,7 +13350,7 @@ msgstr "SET TRANSACTION ISOLATION LEVEL debe ser llamado antes de cualquier cons msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" msgstr "SET TRANSACTION ISOLATION LEVEL no debe ser llamado en una subtransacción" -#: commands/variable.c:606 storage/lmgr/predicate.c:1629 +#: commands/variable.c:606 storage/lmgr/predicate.c:1685 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "no se puede utilizar el modo serializable en un hot standby" @@ -13093,91 +13382,100 @@ msgstr "No se puede cambiar «client_encoding» ahora." #: commands/variable.c:781 #, c-format -msgid "cannot change client_encoding during a parallel operation" +msgid "cannot change \"client_encoding\" during a parallel operation" msgstr "no se puede cambiar «client_encoding» durante una operación paralela" -#: commands/variable.c:948 +#: commands/variable.c:876 +#, c-format +msgid "permission will be denied to set session authorization \"%s\"" +msgstr "se denegará el permiso para definir autorización de sesión «%s»" + +#: commands/variable.c:881 +#, c-format +msgid "permission denied to set session authorization \"%s\"" +msgstr "se ha denegado el permiso para definir autorización de sesión «%s»" + +#: commands/variable.c:991 #, c-format msgid "permission will be denied to set role \"%s\"" msgstr "se denegará el permiso para definir el rol «%s»" -#: commands/variable.c:953 +#: commands/variable.c:996 #, c-format msgid "permission denied to set role \"%s\"" msgstr "se ha denegado el permiso para definir el rol «%s»" -#: commands/variable.c:1153 +#: commands/variable.c:1200 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour no está soportado en este servidor" -#: commands/variable.c:1181 +#: commands/variable.c:1228 #, c-format -msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." -msgstr "effective_io_concurrency debe ser 0 en plataformas que no tienen posix_fadvise()." +msgid "\"effective_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()." +msgstr "«effective_io_concurrency» debe ser 0 en plataformas que no tienen posix_fadvise()." -#: commands/variable.c:1194 +#: commands/variable.c:1241 #, c-format -msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." -msgstr "maintenance_io_concurrency debe ser 0 en plataformas que no tienen posix_fadvise()." +msgid "\"maintenance_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()." +msgstr "«maintenance_io_concurrency» debe ser 0 en plataformas que no tienen posix_fadvise()." -#: commands/variable.c:1207 +#: commands/variable.c:1254 #, c-format msgid "SSL is not supported by this build" msgstr "SSL no está soportado en este servidor" -#: commands/view.c:84 +#: commands/view.c:79 #, c-format msgid "could not determine which collation to use for view column \"%s\"" msgstr "no se pudo determinar el ordenamiento (collation) a usar para la columna «%s» de vista" -#: commands/view.c:279 commands/view.c:290 +#: commands/view.c:274 commands/view.c:285 #, c-format msgid "cannot drop columns from view" msgstr "no se pueden eliminar columnas de una vista" -#: commands/view.c:295 +#: commands/view.c:290 #, c-format msgid "cannot change name of view column \"%s\" to \"%s\"" msgstr "no se puede cambiar el nombre de la columna «%s» de la vista a «%s»" -#: commands/view.c:298 +#: commands/view.c:293 #, c-format msgid "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." msgstr "Use ALTER VIEW ... RENAME COLUMN ... para cambiar el nombre de una columna de una vista." -#: commands/view.c:309 +#: commands/view.c:304 #, c-format msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "no se puede cambiar el tipo de dato de la columna «%s» de la vista de %s a %s" -#: commands/view.c:323 -#, fuzzy, c-format -#| msgid "cannot change data type of view column \"%s\" from %s to %s" +#: commands/view.c:318 +#, c-format msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" -msgstr "no se puede cambiar el tipo de dato de la columna «%s» de la vista de %s a %s" +msgstr "no se puede cambiar el ordenamiento de la columna «%s» de la vista de «%s» a «%s»" -#: commands/view.c:392 +#: commands/view.c:387 #, c-format msgid "views must not contain SELECT INTO" msgstr "una vista no puede tener SELECT INTO" -#: commands/view.c:404 +#: commands/view.c:399 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "las vistas no deben contener sentencias que modifiquen datos en WITH" -#: commands/view.c:474 +#: commands/view.c:469 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "CREATE VIEW especifica más nombres de columna que columnas" -#: commands/view.c:482 +#: commands/view.c:477 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "las vistas no pueden ser «unlogged» porque no tienen almacenamiento" -#: commands/view.c:496 +#: commands/view.c:491 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "la vista «%s» será una vista temporal" @@ -13213,515 +13511,505 @@ msgstr "el cursor «%s» no está posicionado en una fila" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "el cursor «%s» no es un recorrido simplemente actualizable de la tabla «%s»" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2485 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2555 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "el tipo del parámetro %d (%s) no coincide aquel con que fue preparado el plan (%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2497 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2567 #, c-format msgid "no value found for parameter %d" msgstr "no se encontró un valor para parámetro %d" -#: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 -#: executor/execExprInterp.c:4156 executor/execExprInterp.c:4173 -#: executor/execExprInterp.c:4272 executor/nodeModifyTable.c:197 -#: executor/nodeModifyTable.c:208 executor/nodeModifyTable.c:225 -#: executor/nodeModifyTable.c:233 +#: executor/execExpr.c:642 executor/execExpr.c:649 executor/execExpr.c:655 +#: executor/execExprInterp.c:4852 executor/execExprInterp.c:4869 +#: executor/execExprInterp.c:4968 executor/nodeModifyTable.c:203 +#: executor/nodeModifyTable.c:214 executor/nodeModifyTable.c:231 +#: executor/nodeModifyTable.c:239 #, c-format msgid "table row type and query-specified row type do not match" msgstr "el tipo de registro de la tabla no coincide con el tipo de registro de la consulta" -#: executor/execExpr.c:638 executor/nodeModifyTable.c:198 +#: executor/execExpr.c:643 executor/nodeModifyTable.c:204 #, c-format msgid "Query has too many columns." msgstr "La consulta tiene demasiadas columnas." -#: executor/execExpr.c:645 executor/nodeModifyTable.c:226 +#: executor/execExpr.c:650 executor/nodeModifyTable.c:232 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "La consulta entrega un valor para una columna eliminada en la posición %d." -#: executor/execExpr.c:651 executor/execExprInterp.c:4174 -#: executor/nodeModifyTable.c:209 +#: executor/execExpr.c:656 executor/execExprInterp.c:4870 +#: executor/nodeModifyTable.c:215 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "La tabla tiene tipo %s en posición ordinal %d, pero la consulta esperaba %s." -#: executor/execExpr.c:1099 parser/parse_agg.c:827 +#: executor/execExpr.c:1104 parser/parse_agg.c:838 #, c-format msgid "window function calls cannot be nested" msgstr "no se pueden anidar llamadas a funciones de ventana deslizante" -#: executor/execExpr.c:1618 +#: executor/execExpr.c:1649 #, c-format msgid "target type is not an array" msgstr "el tipo de destino no es un array" -#: executor/execExpr.c:1958 +#: executor/execExpr.c:1989 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "la columna de ROW() es de tipo %s en lugar de ser de tipo %s" -#: executor/execExpr.c:2576 executor/execSRF.c:719 parser/parse_func.c:138 -#: parser/parse_func.c:655 parser/parse_func.c:1032 +#: executor/execExpr.c:2653 executor/execSRF.c:718 parser/parse_func.c:138 +#: parser/parse_func.c:655 parser/parse_func.c:1033 #, c-format msgid "cannot pass more than %d argument to a function" msgid_plural "cannot pass more than %d arguments to a function" msgstr[0] "no se pueden pasar más de %d argumento a una función" msgstr[1] "no se pueden pasar más de %d argumentos a una función" -#: executor/execExpr.c:2603 executor/execSRF.c:739 executor/functions.c:1066 -#: utils/adt/jsonfuncs.c:3780 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 +#: executor/execExpr.c:2680 executor/execSRF.c:738 executor/functions.c:1068 +#: utils/adt/jsonfuncs.c:4054 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "se llamó una función que retorna un conjunto en un contexto que no puede aceptarlo" -#: executor/execExpr.c:3009 parser/parse_node.c:277 parser/parse_node.c:327 +#: executor/execExpr.c:3086 parser/parse_node.c:272 parser/parse_node.c:322 #, c-format msgid "cannot subscript type %s because it does not support subscripting" msgstr "no se puede poner subíndices al tipo %s porque no soporta subíndices" -#: executor/execExpr.c:3137 executor/execExpr.c:3159 +#: executor/execExpr.c:3214 executor/execExpr.c:3236 #, c-format msgid "type %s does not support subscripted assignment" msgstr "el tipo %s no soporta asignación subindexada" -#: executor/execExprInterp.c:1950 +#: executor/execExprInterp.c:2019 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "El atributo %d de tipo %s ha sido eliminado" -#: executor/execExprInterp.c:1956 +#: executor/execExprInterp.c:2025 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "el atributo %d del tipo %s tiene tipo erróneo" -#: executor/execExprInterp.c:1958 executor/execExprInterp.c:3030 -#: executor/execExprInterp.c:3076 +#: executor/execExprInterp.c:2027 executor/execExprInterp.c:3226 +#: executor/execExprInterp.c:3272 #, c-format msgid "Table has type %s, but query expects %s." msgstr "La tabla tiene tipo %s, pero la consulta esperaba %s." -#: executor/execExprInterp.c:2037 utils/adt/expandedrecord.c:99 -#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1743 -#: utils/cache/typcache.c:1902 utils/cache/typcache.c:2049 -#: utils/fmgr/funcapi.c:561 +#: executor/execExprInterp.c:2107 utils/adt/expandedrecord.c:99 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1752 +#: utils/cache/typcache.c:1911 utils/cache/typcache.c:2058 +#: utils/fmgr/funcapi.c:569 #, c-format msgid "type %s is not composite" msgstr "el tipo %s no es compuesto" -#: executor/execExprInterp.c:2514 +#: executor/execExprInterp.c:2710 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF no está soportado para este tipo de tabla" -#: executor/execExprInterp.c:2727 +#: executor/execExprInterp.c:2923 #, c-format msgid "cannot merge incompatible arrays" msgstr "no se puede mezclar arrays incompatibles" -#: executor/execExprInterp.c:2728 +#: executor/execExprInterp.c:2924 #, c-format msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "El array con tipo de elemento %s no puede ser incluido en una sentencia ARRAY con tipo de elemento %s." -#: executor/execExprInterp.c:2749 utils/adt/arrayfuncs.c:265 -#: utils/adt/arrayfuncs.c:575 utils/adt/arrayfuncs.c:1329 -#: utils/adt/arrayfuncs.c:3484 utils/adt/arrayfuncs.c:5568 -#: utils/adt/arrayfuncs.c:6085 utils/adt/arraysubs.c:150 +#: executor/execExprInterp.c:2945 utils/adt/arrayfuncs.c:1305 +#: utils/adt/arrayfuncs.c:3503 utils/adt/arrayfuncs.c:5593 +#: utils/adt/arrayfuncs.c:6110 utils/adt/arraysubs.c:150 #: utils/adt/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "el número de dimensiones del array (%d) excede el máximo permitido (%d)" -#: executor/execExprInterp.c:2769 executor/execExprInterp.c:2804 +#: executor/execExprInterp.c:2965 executor/execExprInterp.c:3000 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "los arrays multidimensionales deben tener expresiones de arrays con dimensiones coincidentes" -#: executor/execExprInterp.c:2781 utils/adt/array_expanded.c:274 -#: utils/adt/arrayfuncs.c:959 utils/adt/arrayfuncs.c:1568 -#: utils/adt/arrayfuncs.c:3285 utils/adt/arrayfuncs.c:3514 -#: utils/adt/arrayfuncs.c:6177 utils/adt/arrayfuncs.c:6518 -#: utils/adt/arrayutils.c:104 utils/adt/arrayutils.c:113 -#: utils/adt/arrayutils.c:120 +#: executor/execExprInterp.c:2977 utils/adt/array_expanded.c:274 +#: utils/adt/arrayfuncs.c:335 utils/adt/arrayfuncs.c:494 +#: utils/adt/arrayfuncs.c:727 utils/adt/arrayfuncs.c:1533 +#: utils/adt/arrayfuncs.c:2341 utils/adt/arrayfuncs.c:2356 +#: utils/adt/arrayfuncs.c:2618 utils/adt/arrayfuncs.c:2634 +#: utils/adt/arrayfuncs.c:2895 utils/adt/arrayfuncs.c:2949 +#: utils/adt/arrayfuncs.c:2964 utils/adt/arrayfuncs.c:3305 +#: utils/adt/arrayfuncs.c:3533 utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:6202 utils/adt/arrayfuncs.c:6546 +#: utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 +#: utils/adt/arrayutils.c:99 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "el tamaño del array excede el máximo permitido (%d)" -#: executor/execExprInterp.c:3029 executor/execExprInterp.c:3075 +#: executor/execExprInterp.c:3225 executor/execExprInterp.c:3271 #, c-format msgid "attribute %d has wrong type" msgstr "el atributo %d tiene tipo erróneo" -#: executor/execExprInterp.c:3657 utils/adt/domains.c:155 +#: executor/execExprInterp.c:3857 utils/adt/domains.c:158 #, c-format msgid "domain %s does not allow null values" msgstr "el dominio %s no permite valores null" -#: executor/execExprInterp.c:3672 utils/adt/domains.c:193 +#: executor/execExprInterp.c:3872 utils/adt/domains.c:196 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "el valor para el dominio %s viola la restricción «check» «%s»" -#: executor/execExprInterp.c:4157 +#: executor/execExprInterp.c:4447 +#, c-format +msgid "no SQL/JSON item found for specified path of column \"%s\"" +msgstr "ningún ítem SQL/JSON fue encontrado para la ruta especificada de la columna «%s»" + +#: executor/execExprInterp.c:4452 +#, c-format +msgid "no SQL/JSON item found for specified path" +msgstr "ningún ítem SQL/JSON fue encontrado para la ruta especificada" + +#. translator: first %s is a SQL/JSON clause (e.g. ON ERROR) +#: executor/execExprInterp.c:4652 executor/execExprInterp.c:4660 +#, c-format +msgid "could not coerce %s expression (%s) to the RETURNING type" +msgstr "no se pudo convertir la expresión %s (%s) al tipo RETURNING" + +#: executor/execExprInterp.c:4853 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." msgstr[0] "La fila de la tabla contiene %d atributo, pero la consulta esperaba %d." msgstr[1] "La fila de la tabla contiene %d atributos, pero la consulta esperaba %d." -#: executor/execExprInterp.c:4273 executor/execSRF.c:978 +#: executor/execExprInterp.c:4969 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "Discordancia de almacenamiento físico en atributo eliminado en la posición %d." -#: executor/execIndexing.c:588 +#: executor/execIndexing.c:593 #, c-format msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" msgstr "ON CONFLICT no soporta las restricciones únicas o de exclusión postergables como árbitros" -#: executor/execIndexing.c:865 +#: executor/execIndexing.c:870 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "no se pudo crear la restricción de exclusión «%s»" -#: executor/execIndexing.c:868 +#: executor/execIndexing.c:873 #, c-format msgid "Key %s conflicts with key %s." msgstr "La llave %s está en conflicto con la llave %s." -#: executor/execIndexing.c:870 +#: executor/execIndexing.c:875 #, c-format msgid "Key conflicts exist." msgstr "Existe un conflicto de llave." -#: executor/execIndexing.c:876 +#: executor/execIndexing.c:881 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "llave en conflicto viola la restricción de exclusión «%s»" -#: executor/execIndexing.c:879 +#: executor/execIndexing.c:884 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "La llave %s está en conflicto con la llave existente %s." -#: executor/execIndexing.c:881 +#: executor/execIndexing.c:886 #, c-format msgid "Key conflicts with existing key." msgstr "La llave está en conflicto con una llave existente." -#: executor/execMain.c:1030 +#: executor/execMain.c:1039 #, c-format msgid "cannot change sequence \"%s\"" msgstr "no se puede cambiar la secuencia «%s»" -#: executor/execMain.c:1036 +#: executor/execMain.c:1045 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "no se puede cambiar la relación TOAST «%s»" -#: executor/execMain.c:1054 rewrite/rewriteHandler.c:3078 -#: rewrite/rewriteHandler.c:3965 -#, c-format -msgid "cannot insert into view \"%s\"" -msgstr "no se puede insertar en la vista «%s»" - -#: executor/execMain.c:1056 rewrite/rewriteHandler.c:3081 -#: rewrite/rewriteHandler.c:3968 -#, c-format -msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." -msgstr "Para posibilitar las inserciones en la vista, provea un disparador INSTEAD OF INSERT o una regla incodicional ON INSERT DO INSTEAD." - -#: executor/execMain.c:1062 rewrite/rewriteHandler.c:3086 -#: rewrite/rewriteHandler.c:3973 -#, c-format -msgid "cannot update view \"%s\"" -msgstr "no se puede actualizar la vista «%s»" - -#: executor/execMain.c:1064 rewrite/rewriteHandler.c:3089 -#: rewrite/rewriteHandler.c:3976 -#, c-format -msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." -msgstr "Para posibilitar las actualizaciones en la vista, provea un disparador INSTEAD OF UPDATE o una regla incondicional ON UPDATE DO INSTEAD." - -#: executor/execMain.c:1070 rewrite/rewriteHandler.c:3094 -#: rewrite/rewriteHandler.c:3981 -#, c-format -msgid "cannot delete from view \"%s\"" -msgstr "no se puede eliminar de la vista «%s»" - -#: executor/execMain.c:1072 rewrite/rewriteHandler.c:3097 -#: rewrite/rewriteHandler.c:3984 -#, c-format -msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." -msgstr "Para posibilitar las eliminaciones en la vista, provea un disparador INSTEAD OF DELETE o una regla incondicional ON DELETE DO INSTEAD." - -#: executor/execMain.c:1083 +#: executor/execMain.c:1064 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "no se puede cambiar la vista materializada «%s»" -#: executor/execMain.c:1095 +#: executor/execMain.c:1076 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "no se puede insertar en la tabla foránea «%s»" -#: executor/execMain.c:1101 +#: executor/execMain.c:1082 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "la tabla foránea «%s» no permite inserciones" -#: executor/execMain.c:1108 +#: executor/execMain.c:1089 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "no se puede actualizar la tabla foránea «%s»" -#: executor/execMain.c:1114 +#: executor/execMain.c:1095 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "la tabla foránea «%s» no permite actualizaciones" -#: executor/execMain.c:1121 +#: executor/execMain.c:1102 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "no se puede eliminar desde la tabla foránea «%s»" -#: executor/execMain.c:1127 +#: executor/execMain.c:1108 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "la tabla foránea «%s» no permite eliminaciones" -#: executor/execMain.c:1138 +#: executor/execMain.c:1119 #, c-format msgid "cannot change relation \"%s\"" msgstr "no se puede cambiar la relación «%s»" -#: executor/execMain.c:1165 +#: executor/execMain.c:1146 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "no se puede bloquear registros de la secuencia «%s»" -#: executor/execMain.c:1172 +#: executor/execMain.c:1153 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "no se puede bloquear registros en la relación TOAST «%s»" -#: executor/execMain.c:1179 +#: executor/execMain.c:1160 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "no se puede bloquear registros en la vista «%s»" -#: executor/execMain.c:1187 +#: executor/execMain.c:1168 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "no se puede bloquear registros en la vista materializada «%s»" -#: executor/execMain.c:1196 executor/execMain.c:2681 -#: executor/nodeLockRows.c:136 +#: executor/execMain.c:1177 executor/execMain.c:2689 +#: executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "no se puede bloquear registros en la tabla foránea «%s»" -#: executor/execMain.c:1202 +#: executor/execMain.c:1183 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "no se puede bloquear registros en la tabla «%s»" -#: executor/execMain.c:1913 +#: executor/execMain.c:1901 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "el nuevo registro para la relación «%s» viola la restricción de partición" -#: executor/execMain.c:1915 executor/execMain.c:1999 executor/execMain.c:2050 -#: executor/execMain.c:2160 +#: executor/execMain.c:1903 executor/execMain.c:1987 executor/execMain.c:2038 +#: executor/execMain.c:2148 #, c-format msgid "Failing row contains %s." msgstr "La fila que falla contiene %s." -#: executor/execMain.c:1996 +#: executor/execMain.c:1984 #, c-format msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" msgstr "el valor nulo en la columna «%s» de la relación «%s» viola la restricción de no nulo" -#: executor/execMain.c:2048 +#: executor/execMain.c:2036 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "el nuevo registro para la relación «%s» viola la restricción «check» «%s»" -#: executor/execMain.c:2158 +#: executor/execMain.c:2146 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "el nuevo registro para la vista «%s» viola la opción check" -#: executor/execMain.c:2168 +#: executor/execMain.c:2156 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "el nuevo registro viola la política de seguridad de registros «%s» para la tabla «%s»" -#: executor/execMain.c:2173 +#: executor/execMain.c:2161 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "el nuevo registro viola la política de seguridad de registros para la tabla «%s»" -#: executor/execMain.c:2181 -#, fuzzy, c-format -#| msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" +#: executor/execMain.c:2169 +#, c-format msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" -msgstr "el nuevo registro viola la política de seguridad de registros «%s» (expresión USING) para la tabla «%s»" +msgstr "el registro destino viola la política de seguridad de registros «%s» (expresión USING) para la tabla «%s»" -#: executor/execMain.c:2186 -#, fuzzy, c-format -#| msgid "new row violates row-level security policy (USING expression) for table \"%s\"" +#: executor/execMain.c:2174 +#, c-format msgid "target row violates row-level security policy (USING expression) for table \"%s\"" -msgstr "el nuevo registro viola la política de seguridad de registros (expresión USING) para la tabla «%s»" +msgstr "el registro destino viola la política de seguridad de registros (expresión USING) para la tabla «%s»" -#: executor/execMain.c:2193 +#: executor/execMain.c:2181 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "el nuevo registro viola la política de seguridad de registros «%s» (expresión USING) para la tabla «%s»" -#: executor/execMain.c:2198 +#: executor/execMain.c:2186 #, c-format msgid "new row violates row-level security policy (USING expression) for table \"%s\"" msgstr "el nuevo registro viola la política de seguridad de registros (expresión USING) para la tabla «%s»" -#: executor/execPartition.c:330 +#: executor/execPartition.c:327 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "no se encontró una partición de «%s» para el registro" -#: executor/execPartition.c:333 +#: executor/execPartition.c:330 #, c-format msgid "Partition key of the failing row contains %s." msgstr "La llave de particionamiento de la fila que falla contiene %s." -#: executor/execReplication.c:240 executor/execReplication.c:424 +#: executor/execReplication.c:272 executor/execReplication.c:456 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update, retrying" msgstr "el registro a ser bloqueado ya fue movido a otra partición debido a un update concurrente, reintentando" -#: executor/execReplication.c:244 executor/execReplication.c:428 +#: executor/execReplication.c:276 executor/execReplication.c:460 #, c-format msgid "concurrent update, retrying" msgstr "actualización simultánea, reintentando" -#: executor/execReplication.c:250 executor/execReplication.c:434 +#: executor/execReplication.c:282 executor/execReplication.c:466 #, c-format msgid "concurrent delete, retrying" msgstr "eliminacón concurrente, reintentando" -#: executor/execReplication.c:320 parser/parse_cte.c:308 -#: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:1348 -#: utils/adt/array_userfuncs.c:1491 utils/adt/arrayfuncs.c:3833 -#: utils/adt/arrayfuncs.c:4388 utils/adt/arrayfuncs.c:6398 -#: utils/adt/rowtypes.c:1230 +#: executor/execReplication.c:352 parser/parse_cte.c:302 +#: parser/parse_oper.c:221 utils/adt/array_userfuncs.c:1334 +#: utils/adt/array_userfuncs.c:1477 utils/adt/arrayfuncs.c:3852 +#: utils/adt/arrayfuncs.c:4407 utils/adt/arrayfuncs.c:6426 +#: utils/adt/rowtypes.c:1220 #, c-format msgid "could not identify an equality operator for type %s" msgstr "no se pudo identificar un operador de igualdad para el tipo %s" -#: executor/execReplication.c:651 executor/execReplication.c:657 -#, fuzzy, c-format -#| msgid "cannot update foreign table \"%s\"" +#: executor/execReplication.c:687 executor/execReplication.c:693 +#, c-format msgid "cannot update table \"%s\"" -msgstr "no se puede actualizar la tabla foránea «%s»" +msgstr "no se puede actualizar la tabla «%s»" -#: executor/execReplication.c:653 executor/execReplication.c:665 +#: executor/execReplication.c:689 executor/execReplication.c:701 #, c-format msgid "Column used in the publication WHERE expression is not part of the replica identity." msgstr "La columna usada en la expresión WHERE de la publicación no es parte de la identidad de replicación." -#: executor/execReplication.c:659 executor/execReplication.c:671 +#: executor/execReplication.c:695 executor/execReplication.c:707 #, c-format msgid "Column list used by the publication does not cover the replica identity." msgstr "La lista de columnas usada por la publicación no incluye la identidad de replicación." -#: executor/execReplication.c:663 executor/execReplication.c:669 -#, fuzzy, c-format -#| msgid "cannot delete from foreign table \"%s\"" +#: executor/execReplication.c:699 executor/execReplication.c:705 +#, c-format msgid "cannot delete from table \"%s\"" -msgstr "no se puede eliminar desde la tabla foránea «%s»" +msgstr "no se puede eliminar desde la tabla «%s»" -#: executor/execReplication.c:689 +#: executor/execReplication.c:725 #, c-format msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" msgstr "no se puede actualizar la tabla «%s» porque no tiene identidad de replicación y publica updates" -#: executor/execReplication.c:691 +#: executor/execReplication.c:727 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Para habilitar la actualización de la tabla, configure REPLICA IDENTITY utilizando ALTER TABLE." -#: executor/execReplication.c:695 +#: executor/execReplication.c:731 #, c-format msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" msgstr "no se puede eliminar de la tabla «%s» porque no tiene una identidad de replicación y publica deletes" -#: executor/execReplication.c:697 +#: executor/execReplication.c:733 #, c-format msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "para habilitar la eliminación en la tabla, configure REPLICA IDENTITY utilizando ALTER TABLE." -#: executor/execReplication.c:713 +#: executor/execReplication.c:749 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "no se puede usar la relación «%s.%s» como destino de replicación lógica" -#: executor/execSRF.c:316 +#: executor/execSRF.c:315 #, c-format msgid "rows returned by function are not all of the same row type" msgstr "las filas retornadas por la función no tienen todas el mismo tipo de registro" -#: executor/execSRF.c:366 +#: executor/execSRF.c:365 #, c-format msgid "table-function protocol for value-per-call mode was not followed" msgstr "no se siguió el protocolo de función tabular para el modo de valor por llamada" -#: executor/execSRF.c:374 executor/execSRF.c:668 +#: executor/execSRF.c:373 executor/execSRF.c:667 #, c-format msgid "table-function protocol for materialize mode was not followed" msgstr "no se siguió el protocolo de función tabular para el modo de materialización" -#: executor/execSRF.c:381 executor/execSRF.c:686 +#: executor/execSRF.c:380 executor/execSRF.c:685 #, c-format msgid "unrecognized table-function returnMode: %d" msgstr "modo de retorno de la función tabular no es reconocido: %d" -#: executor/execSRF.c:895 +#: executor/execSRF.c:894 #, c-format msgid "function returning setof record called in context that cannot accept type record" msgstr "se llamó una función que retorna «setof record» en un contexto que no puede aceptar el tipo record" -#: executor/execSRF.c:951 executor/execSRF.c:967 executor/execSRF.c:977 +#: executor/execSRF.c:950 executor/execSRF.c:966 executor/execSRF.c:976 #, c-format msgid "function return row and query-specified return row do not match" msgstr "la fila de retorno especificada en la consulta no coincide con fila de retorno de la función" -#: executor/execSRF.c:952 +#: executor/execSRF.c:951 #, c-format msgid "Returned row contains %d attribute, but query expects %d." msgid_plural "Returned row contains %d attributes, but query expects %d." msgstr[0] "Fila retornada contiene %d atributo, pero la consulta esperaba %d." msgstr[1] "Fila retornada contiene %d atributos, pero la consulta esperaba %d." -#: executor/execSRF.c:968 +#: executor/execSRF.c:967 #, c-format msgid "Returned type %s at ordinal position %d, but query expects %s." msgstr "Tipo retornado %s en posición ordinal %d, pero la consulta esperaba %s." -#: executor/execTuples.c:146 executor/execTuples.c:353 -#: executor/execTuples.c:521 executor/execTuples.c:713 +#: executor/execTuples.c:147 executor/execTuples.c:368 +#: executor/execTuples.c:563 executor/execTuples.c:772 #, c-format msgid "cannot retrieve a system column in this context" msgstr "no se puede obtener una columna de sistema en este contexto" -#: executor/execUtils.c:744 +#: executor/execTuples.c:163 executor/execTuples.c:580 +#, c-format +msgid "don't have transaction information for this type of tuple" +msgstr "no se tiene información de transacción para este tipo de tupla" + +#: executor/execTuples.c:390 executor/execTuples.c:794 +#, c-format +msgid "don't have a storage tuple in this context" +msgstr "no se tiene una tupla de almacenamiento en este contexto" + +#: executor/execUtils.c:713 #, c-format msgid "materialized view \"%s\" has not been populated" msgstr "la vista materializada «%s» no ha sido poblada" -#: executor/execUtils.c:746 +#: executor/execUtils.c:715 #, c-format msgid "Use the REFRESH MATERIALIZED VIEW command." msgstr "Use la orden REFRESH MATERIALIZED VIEW." @@ -13731,116 +14019,111 @@ msgstr "Use la orden REFRESH MATERIALIZED VIEW." msgid "could not determine actual type of argument declared %s" msgstr "no se pudo determinar el tipo de argumento declarado %s" -#: executor/functions.c:512 +#: executor/functions.c:513 #, c-format msgid "cannot COPY to/from client in an SQL function" msgstr "no se puede ejecutar COPY desde/a un cliente en una función SQL" #. translator: %s is a SQL statement name -#: executor/functions.c:518 +#: executor/functions.c:519 #, c-format msgid "%s is not allowed in an SQL function" msgstr "%s no está permitido en una función SQL" #. translator: %s is a SQL statement name -#: executor/functions.c:526 executor/spi.c:1742 executor/spi.c:2635 +#: executor/functions.c:527 executor/spi.c:1744 executor/spi.c:2657 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s no está permitido en una función no-«volatile»" -#: executor/functions.c:1450 +#: executor/functions.c:1452 #, c-format msgid "SQL function \"%s\" statement %d" msgstr "función SQL «%s» en la sentencia %d" -#: executor/functions.c:1476 +#: executor/functions.c:1478 #, c-format msgid "SQL function \"%s\" during startup" msgstr "función SQL «%s» durante el inicio" -#: executor/functions.c:1561 +#: executor/functions.c:1563 #, c-format msgid "calling procedures with output arguments is not supported in SQL functions" msgstr "no está permitido invocar procedimientos con argumentos de salida en funciones SQL" -#: executor/functions.c:1694 executor/functions.c:1732 -#: executor/functions.c:1746 executor/functions.c:1836 -#: executor/functions.c:1869 executor/functions.c:1883 +#: executor/functions.c:1698 executor/functions.c:1736 +#: executor/functions.c:1750 executor/functions.c:1845 +#: executor/functions.c:1878 executor/functions.c:1892 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "el tipo de retorno de función declarada para retornar %s no concuerda" -#: executor/functions.c:1696 +#: executor/functions.c:1700 #, c-format -msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." -msgstr "La sentencia final de la función debe ser un SELECT o INSERT/UPDATE/DELETE RETURNING." +msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE RETURNING." +msgstr "La sentencia final de la función debe ser un SELECT o INSERT/UPDATE/DELETE/MERGE RETURNING." -#: executor/functions.c:1734 +#: executor/functions.c:1738 #, c-format msgid "Final statement must return exactly one column." msgstr "La sentencia final debe retornar exactamente una columna." -#: executor/functions.c:1748 +#: executor/functions.c:1752 #, c-format msgid "Actual return type is %s." msgstr "El verdadero tipo de retorno es %s." -#: executor/functions.c:1838 +#: executor/functions.c:1847 #, c-format msgid "Final statement returns too many columns." msgstr "La sentencia final retorna demasiadas columnas." -#: executor/functions.c:1871 +#: executor/functions.c:1880 #, c-format msgid "Final statement returns %s instead of %s at column %d." msgstr "La sentencia final retorna %s en lugar de %s en la columna %d." -#: executor/functions.c:1885 +#: executor/functions.c:1894 #, c-format msgid "Final statement returns too few columns." msgstr "La sentencia final retorna muy pocas columnas." -#: executor/functions.c:1913 +#: executor/functions.c:1922 #, c-format msgid "return type %s is not supported for SQL functions" msgstr "el tipo de retorno %s no es soportado en funciones SQL" -#: executor/nodeAgg.c:3025 executor/nodeAgg.c:3034 executor/nodeAgg.c:3046 -#, c-format -msgid "unexpected EOF for tape %p: requested %zu bytes, read %zu bytes" -msgstr "" - -#: executor/nodeAgg.c:3937 executor/nodeWindowAgg.c:2993 +#: executor/nodeAgg.c:3936 executor/nodeWindowAgg.c:2975 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "la función de agregación %u necesita tener tipos de entrada y transición compatibles" -#: executor/nodeAgg.c:3967 parser/parse_agg.c:669 parser/parse_agg.c:697 +#: executor/nodeAgg.c:3966 parser/parse_agg.c:680 parser/parse_agg.c:708 #, c-format msgid "aggregate function calls cannot be nested" msgstr "no se pueden anidar llamadas a funciones de agregación" -#: executor/nodeCustom.c:154 executor/nodeCustom.c:165 +#: executor/nodeCustom.c:144 executor/nodeCustom.c:155 #, c-format msgid "custom scan \"%s\" does not support MarkPos" msgstr "el scan personalizado «%s» no soporta MarkPos" -#: executor/nodeHashjoin.c:1097 executor/nodeHashjoin.c:1127 +#: executor/nodeHashjoin.c:1131 executor/nodeHashjoin.c:1161 #, c-format msgid "could not rewind hash-join temporary file" msgstr "no se puede rebobinar el archivo temporal del hash-join" -#: executor/nodeIndexonlyscan.c:238 +#: executor/nodeIndexonlyscan.c:239 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "no se permiten funciones de ventana deslizante en predicados de índice" -#: executor/nodeLimit.c:374 +#: executor/nodeLimit.c:373 #, c-format msgid "OFFSET must not be negative" msgstr "OFFSET no debe ser negativo" -#: executor/nodeLimit.c:400 +#: executor/nodeLimit.c:399 #, c-format msgid "LIMIT must not be negative" msgstr "LIMIT no debe ser negativo" @@ -13855,76 +14138,74 @@ msgstr "RIGHT JOIN sólo está soportado con condiciones que se pueden usar con msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOIN sólo está soportado con condiciones que se pueden usar con merge join" -#: executor/nodeModifyTable.c:234 +#: executor/nodeModifyTable.c:240 #, c-format msgid "Query has too few columns." msgstr "La consulta tiene muy pocas columnas." -#: executor/nodeModifyTable.c:1530 executor/nodeModifyTable.c:1604 +#: executor/nodeModifyTable.c:1540 executor/nodeModifyTable.c:1614 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "el registro a ser eliminado ya fue modificado por una operación disparada por la orden actual" -#: executor/nodeModifyTable.c:1758 +#: executor/nodeModifyTable.c:1769 #, c-format msgid "invalid ON UPDATE specification" msgstr "especificación ON UPDATE no válida" -#: executor/nodeModifyTable.c:1759 +#: executor/nodeModifyTable.c:1770 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "La tupla de resultado aparecería en una partición diferente que la tupla original." -#: executor/nodeModifyTable.c:2217 +#: executor/nodeModifyTable.c:2226 #, c-format msgid "cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key" msgstr "no se puede mover una tupla entre particiones cuando un ancestro no-raíz de la partición de origen es referenciada directamente en una llave foránea" -#: executor/nodeModifyTable.c:2218 +#: executor/nodeModifyTable.c:2227 #, c-format msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." -msgstr "" +msgstr "Una llave foránea apunta al ancestro «%s» pero no al ancestro raíz «%s»." -#: executor/nodeModifyTable.c:2221 -#, fuzzy, c-format -#| msgid "cannot insert into foreign table \"%s\"" +#: executor/nodeModifyTable.c:2230 +#, c-format msgid "Consider defining the foreign key on table \"%s\"." -msgstr "no se puede insertar en la tabla foránea «%s»" +msgstr "Considere definir una llave foránea en la tabla «%s»." #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2567 executor/nodeModifyTable.c:2954 +#: executor/nodeModifyTable.c:2596 executor/nodeModifyTable.c:3138 +#: executor/nodeModifyTable.c:3308 #, c-format msgid "%s command cannot affect row a second time" -msgstr "" +msgstr "la orden %s no puede afectar una fila por segunda vez" -#: executor/nodeModifyTable.c:2569 +#: executor/nodeModifyTable.c:2598 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "Asegúrese de que ningún registro propuesto para inserción dentro de la misma orden tenga valores duplicados restringidos." -#: executor/nodeModifyTable.c:2956 +#: executor/nodeModifyTable.c:3131 executor/nodeModifyTable.c:3301 +#, c-format +msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" +msgstr "la tupla a ser actualizada o borrada ya fue modificada por una operación disparada por la orden actual" + +#: executor/nodeModifyTable.c:3140 executor/nodeModifyTable.c:3310 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "Asegúrese que no más de un registro de origen coincide con cada registro de destino." -#: executor/nodeModifyTable.c:3037 -#, fuzzy, c-format -#| msgid "tuple to be locked was already moved to another partition due to concurrent update" -msgid "tuple to be deleted was already moved to another partition due to concurrent update" -msgstr "el registro a ser bloqueado ya fue movido a otra partición por un update concurrente" - -#: executor/nodeModifyTable.c:3076 -#, fuzzy, c-format -#| msgid "tuple to be updated was already modified by an operation triggered by the current command" -msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" -msgstr "el registro a ser actualizado ya fue modificado por una operación disparada por la orden actual" +#: executor/nodeModifyTable.c:3209 +#, c-format +msgid "tuple to be merged was already moved to another partition due to concurrent update" +msgstr "la tupla a ser mezclada ya fue movida a otra partición por un update concurrente" -#: executor/nodeSamplescan.c:260 +#: executor/nodeSamplescan.c:244 #, c-format msgid "TABLESAMPLE parameter cannot be null" msgstr "el parámetro TABLESAMPLE no puede ser null" -#: executor/nodeSamplescan.c:272 +#: executor/nodeSamplescan.c:256 #, c-format msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "el parámetro TABLESAMPLE REPEATABLE no puede ser null" @@ -13935,7 +14216,7 @@ msgstr "el parámetro TABLESAMPLE REPEATABLE no puede ser null" msgid "more than one row returned by a subquery used as an expression" msgstr "una subconsulta utilizada como expresión retornó más de un registro" -#: executor/nodeTableFuncscan.c:375 +#: executor/nodeTableFuncscan.c:370 #, c-format msgid "namespace URI must not be null" msgstr "la URI del espacio de nombres no debe ser null" @@ -13945,17 +14226,17 @@ msgstr "la URI del espacio de nombres no debe ser null" msgid "row filter expression must not be null" msgstr "la expresión filtro de filas no debe ser null" -#: executor/nodeTableFuncscan.c:415 +#: executor/nodeTableFuncscan.c:416 #, c-format msgid "column filter expression must not be null" msgstr "la expresión filtro de columnas no debe ser null" -#: executor/nodeTableFuncscan.c:416 +#: executor/nodeTableFuncscan.c:417 #, c-format msgid "Filter for column \"%s\" is null." msgstr "El filtro para la columna «%s» es null." -#: executor/nodeTableFuncscan.c:506 +#: executor/nodeTableFuncscan.c:507 #, c-format msgid "null is not allowed in column \"%s\"" msgstr "null no está permitido en la columna «%s»" @@ -13985,84 +14266,84 @@ msgstr "la posición final del marco no debe ser null" msgid "frame ending offset must not be negative" msgstr "la posición final del marco no debe ser negativa" -#: executor/nodeWindowAgg.c:2909 +#: executor/nodeWindowAgg.c:2891 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "la función de agregación %s no permite ser usada como función ventana" -#: executor/spi.c:242 executor/spi.c:342 +#: executor/spi.c:241 executor/spi.c:341 #, c-format msgid "invalid transaction termination" msgstr "terminación de transacción no válida" -#: executor/spi.c:257 +#: executor/spi.c:256 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "no se puede comprometer mientras hay una subtransacción activa" -#: executor/spi.c:348 +#: executor/spi.c:347 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "no se puede hacer rollback mientras hay una subtransacción activa" -#: executor/spi.c:472 +#: executor/spi.c:471 #, c-format msgid "transaction left non-empty SPI stack" msgstr "transacción dejó un stack SPI no vacío" -#: executor/spi.c:473 executor/spi.c:533 +#: executor/spi.c:472 executor/spi.c:532 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Revise llamadas a «SPI_finish» faltantes." -#: executor/spi.c:532 +#: executor/spi.c:531 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "subtransacción dejó un stack SPI no vacío" -#: executor/spi.c:1600 +#: executor/spi.c:1602 #, c-format msgid "cannot open multi-query plan as cursor" msgstr "no se puede abrir plan de varias consultas como cursor" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1610 +#: executor/spi.c:1612 #, c-format msgid "cannot open %s query as cursor" msgstr "no se puede abrir consulta %s como cursor" -#: executor/spi.c:1716 +#: executor/spi.c:1718 #, c-format msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE no está soportado" -#: executor/spi.c:1717 parser/analyze.c:2874 +#: executor/spi.c:1719 parser/analyze.c:2928 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Los cursores declarados SCROLL deben ser READ ONLY." -#: executor/spi.c:2474 +#: executor/spi.c:2496 #, c-format msgid "empty query does not return tuples" msgstr "la consulta vacía no retorna tuplas" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:2548 +#: executor/spi.c:2570 #, c-format msgid "%s query does not return tuples" msgstr "la consulta «%s» no retorna tuplas" -#: executor/spi.c:2963 +#: executor/spi.c:2987 #, c-format msgid "SQL expression \"%s\"" msgstr "expresión SQL «%s»" -#: executor/spi.c:2968 +#: executor/spi.c:2992 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "asignación PL/pgSQL «%s»" -#: executor/spi.c:2971 +#: executor/spi.c:2995 #, c-format msgid "SQL statement \"%s\"" msgstr "sentencia SQL: «%s»" @@ -14072,35 +14353,34 @@ msgstr "sentencia SQL: «%s»" msgid "could not send tuple to shared-memory queue" msgstr "no se pudo enviar la tupla a la cola en memoria compartida" -#: foreign/foreign.c:222 +#: foreign/foreign.c:225 +#, c-format +msgid "user mapping not found for user \"%s\", server \"%s\"" +msgstr "no se encontró un mapeo para el usuario «%s», servidor «%s»" + +#: foreign/foreign.c:336 optimizer/plan/createplan.c:7153 +#: optimizer/util/plancat.c:540 #, c-format -msgid "user mapping not found for \"%s\"" -msgstr "no se encontró un mapeo para el usuario «%s»" +msgid "access to non-system foreign table is restricted" +msgstr "el acceso a la tabla foránea no de sistema está restringido" -#: foreign/foreign.c:647 storage/file/fd.c:3881 +#: foreign/foreign.c:660 #, c-format msgid "invalid option \"%s\"" msgstr "el nombre de opción «%s» no es válido" -#: foreign/foreign.c:649 -#, fuzzy, c-format -#| msgid "Perhaps you meant to reference the column \"%s.%s\"." +#: foreign/foreign.c:662 +#, c-format msgid "Perhaps you meant the option \"%s\"." -msgstr "Probablemente quiera hacer referencia a la columna «%s.%s»." - -#: foreign/foreign.c:651 -#, fuzzy, c-format -#| msgid "Valid options in this context are: %s" -msgid "There are no valid options in this context." -msgstr "Las opciones válidas en este contexto son: %s" +msgstr "Quizás se refiere a la opción «%s»." -#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:415 +#: foreign/foreign.c:664 #, c-format -msgid "could not access file \"%s\": %m" -msgstr "no se pudo acceder al archivo «%s»: %m" +msgid "There are no valid options in this context." +msgstr "No hay opciones válidas en este contexto." -#: lib/dshash.c:254 utils/mmgr/dsa.c:714 utils/mmgr/dsa.c:736 -#: utils/mmgr/dsa.c:817 +#: lib/dshash.c:254 utils/mmgr/dsa.c:708 utils/mmgr/dsa.c:730 +#: utils/mmgr/dsa.c:811 #, c-format msgid "Failed on DSA request of size %zu." msgstr "Falla en petición DSA de tamaño %zu." @@ -14110,708 +14390,700 @@ msgstr "Falla en petición DSA de tamaño %zu." msgid "expected SASL response, got message type %d" msgstr "se esperaba una respuesta SASL, se obtuvo mensaje de tipo %d" -#: libpq/auth-scram.c:270 +#: libpq/auth-scram.c:263 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "cliente eligió un mecanismo de autentificación SASL no válido" -#: libpq/auth-scram.c:294 libpq/auth-scram.c:543 libpq/auth-scram.c:554 +#: libpq/auth-scram.c:287 libpq/auth-scram.c:536 libpq/auth-scram.c:547 #, c-format msgid "invalid SCRAM secret for user \"%s\"" msgstr "el secreto SCRAM para el usuario «%s» no es válido" -#: libpq/auth-scram.c:305 +#: libpq/auth-scram.c:298 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "El usuario «%s» no tiene un secreto SCRAM válido." -#: libpq/auth-scram.c:385 libpq/auth-scram.c:390 libpq/auth-scram.c:744 -#: libpq/auth-scram.c:752 libpq/auth-scram.c:857 libpq/auth-scram.c:870 -#: libpq/auth-scram.c:880 libpq/auth-scram.c:988 libpq/auth-scram.c:995 -#: libpq/auth-scram.c:1010 libpq/auth-scram.c:1025 libpq/auth-scram.c:1039 -#: libpq/auth-scram.c:1057 libpq/auth-scram.c:1072 libpq/auth-scram.c:1386 -#: libpq/auth-scram.c:1394 +#: libpq/auth-scram.c:378 libpq/auth-scram.c:383 libpq/auth-scram.c:737 +#: libpq/auth-scram.c:745 libpq/auth-scram.c:850 libpq/auth-scram.c:863 +#: libpq/auth-scram.c:873 libpq/auth-scram.c:981 libpq/auth-scram.c:988 +#: libpq/auth-scram.c:1003 libpq/auth-scram.c:1018 libpq/auth-scram.c:1032 +#: libpq/auth-scram.c:1050 libpq/auth-scram.c:1065 libpq/auth-scram.c:1379 +#: libpq/auth-scram.c:1387 #, c-format msgid "malformed SCRAM message" msgstr "mensaje SCRAM mal formado" -#: libpq/auth-scram.c:386 +#: libpq/auth-scram.c:379 #, c-format msgid "The message is empty." msgstr "El mensaje está vacío." -#: libpq/auth-scram.c:391 +#: libpq/auth-scram.c:384 #, c-format msgid "Message length does not match input length." msgstr "El largo del mensaje no coincide con el largo de entrada." -#: libpq/auth-scram.c:423 +#: libpq/auth-scram.c:416 #, c-format msgid "invalid SCRAM response" msgstr "respuesta SCRAM no válida" -#: libpq/auth-scram.c:424 +#: libpq/auth-scram.c:417 #, c-format msgid "Nonce does not match." msgstr "El «nonce» no coincide." -#: libpq/auth-scram.c:500 +#: libpq/auth-scram.c:493 #, c-format msgid "could not generate random salt" msgstr "no se pudo generar una sal aleatoria" -#: libpq/auth-scram.c:745 +#: libpq/auth-scram.c:738 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "Se esperaba un atributo «%c» pero se encontró «%s»." -#: libpq/auth-scram.c:753 libpq/auth-scram.c:881 +#: libpq/auth-scram.c:746 libpq/auth-scram.c:874 #, c-format msgid "Expected character \"=\" for attribute \"%c\"." msgstr "Se esperaba el carácter «=» para el atributo «%c»." -#: libpq/auth-scram.c:858 +#: libpq/auth-scram.c:851 #, c-format msgid "Attribute expected, but found end of string." msgstr "Se esperaba un atributo, se encontró el fin de la cadena." -#: libpq/auth-scram.c:871 +#: libpq/auth-scram.c:864 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "Se esperaba un atributo, se encontró el carácter no válido «%s»." -#: libpq/auth-scram.c:989 libpq/auth-scram.c:1011 +#: libpq/auth-scram.c:982 libpq/auth-scram.c:1004 #, c-format msgid "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not include channel binding data." msgstr "El cliente seleccionó SCRAM-SHA-256-PLUS, pero el mensaje SCRAM no incluye los datos de enlazado (binding) del canal." -#: libpq/auth-scram.c:996 libpq/auth-scram.c:1026 +#: libpq/auth-scram.c:989 libpq/auth-scram.c:1019 #, c-format msgid "Comma expected, but found character \"%s\"." msgstr "Se esperaba una coma, se encontró el carácter «%s»." -#: libpq/auth-scram.c:1017 +#: libpq/auth-scram.c:1010 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "error de negociación de enlazado (binding) de canal SCRAM" -#: libpq/auth-scram.c:1018 +#: libpq/auth-scram.c:1011 #, c-format msgid "The client supports SCRAM channel binding but thinks the server does not. However, this server does support channel binding." msgstr "El cliente soporta enlazado (binding) de canal SCRAM, pero piensa que el servidor no. Sin embargo, este servidor sí soporta enlazado de canal." -#: libpq/auth-scram.c:1040 +#: libpq/auth-scram.c:1033 #, c-format msgid "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM message includes channel binding data." msgstr "El cliente seleccionó SCRAM-SHA-256 sin enlazado de canal, pero el mensaje SCRAM incluye datos de enlazado de canal." -#: libpq/auth-scram.c:1051 +#: libpq/auth-scram.c:1044 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "tipo de enlazado de canal SCRAM «%s» no soportado" -#: libpq/auth-scram.c:1058 +#: libpq/auth-scram.c:1051 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "Indicador de enlazado de canal «%s» inesperado." -#: libpq/auth-scram.c:1068 +#: libpq/auth-scram.c:1061 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "el cliente usa identidad de autorización, pero no está soportada" -#: libpq/auth-scram.c:1073 +#: libpq/auth-scram.c:1066 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "Atributo inesperado \"%s\" en client-first-message." -#: libpq/auth-scram.c:1089 +#: libpq/auth-scram.c:1082 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "el cliente requiere una extensión SCRAM no soportada" -#: libpq/auth-scram.c:1103 +#: libpq/auth-scram.c:1096 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "caracteres no imprimibles en el «nonce» SCRAM" -#: libpq/auth-scram.c:1234 +#: libpq/auth-scram.c:1227 #, c-format msgid "could not generate random nonce" msgstr "no se pudo generar un «nonce» aleatorio" -#: libpq/auth-scram.c:1244 +#: libpq/auth-scram.c:1237 #, c-format msgid "could not encode random nonce" msgstr "no se pudo codificar un «nonce» aleatorio" -#: libpq/auth-scram.c:1350 +#: libpq/auth-scram.c:1343 #, c-format msgid "SCRAM channel binding check failed" msgstr "la verificación de enlazado (binding) de canal SCRAM falló" -#: libpq/auth-scram.c:1368 +#: libpq/auth-scram.c:1361 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "atributo de enlazado de canal SCRAM inesperado en client-final-message" -#: libpq/auth-scram.c:1387 +#: libpq/auth-scram.c:1380 #, c-format msgid "Malformed proof in client-final-message." msgstr "Prueba (proof) mal formada en client-final-message." -#: libpq/auth-scram.c:1395 +#: libpq/auth-scram.c:1388 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "Basura encontrada al final de client-final-message." -#: libpq/auth.c:271 +#: libpq/auth.c:269 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "la autentificación falló para el usuario «%s»: anfitrión rechazado" -#: libpq/auth.c:274 +#: libpq/auth.c:272 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "la autentificación «trust» falló para el usuario «%s»" -#: libpq/auth.c:277 +#: libpq/auth.c:275 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "la autentificación Ident falló para el usuario «%s»" -#: libpq/auth.c:280 +#: libpq/auth.c:278 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "la autentificación Peer falló para el usuario «%s»" -#: libpq/auth.c:285 +#: libpq/auth.c:283 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "la autentificación password falló para el usuario «%s»" -#: libpq/auth.c:290 +#: libpq/auth.c:288 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "la autentificación GSSAPI falló para el usuario «%s»" -#: libpq/auth.c:293 +#: libpq/auth.c:291 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "la autentificación SSPI falló para el usuario «%s»" -#: libpq/auth.c:296 +#: libpq/auth.c:294 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "la autentificación PAM falló para el usuario «%s»" -#: libpq/auth.c:299 +#: libpq/auth.c:297 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "la autentificación BSD falló para el usuario «%s»" -#: libpq/auth.c:302 +#: libpq/auth.c:300 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "la autentificación LDAP falló para el usuario «%s»" -#: libpq/auth.c:305 +#: libpq/auth.c:303 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "la autentificación por certificado falló para el usuario «%s»" -#: libpq/auth.c:308 +#: libpq/auth.c:306 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "la autentificación RADIUS falló para el usuario «%s»" -#: libpq/auth.c:311 +#: libpq/auth.c:309 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "la autentificación falló para el usuario «%s»: método de autentificación no válido" -#: libpq/auth.c:315 -#, fuzzy, c-format -#| msgid "Connection matched pg_hba.conf line %d: \"%s\"" -msgid "Connection matched %s line %d: \"%s\"" -msgstr "La conexión coincidió con la línea %d de pg_hba.conf: «%s»" +#: libpq/auth.c:313 +#, c-format +msgid "Connection matched file \"%s\" line %d: \"%s\"" +msgstr "La conexión coincidió con el archivo «%s» línea %d: «%s»" -#: libpq/auth.c:359 +#: libpq/auth.c:357 #, c-format msgid "authentication identifier set more than once" msgstr "identificador de autentificación establecido más de una vez" -#: libpq/auth.c:360 +#: libpq/auth.c:358 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "identificador anterior: «%s»; nuevo identificador: «%s»" -#: libpq/auth.c:370 +#: libpq/auth.c:368 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "conexión autenticada: identidad=«%s» método=%s (%s:%d)" -#: libpq/auth.c:410 +#: libpq/auth.c:408 #, c-format msgid "client certificates can only be checked if a root certificate store is available" msgstr "los certificados de cliente sólo pueden verificarse si un almacén de certificado raíz está disponible" -#: libpq/auth.c:421 +#: libpq/auth.c:419 #, c-format msgid "connection requires a valid client certificate" msgstr "la conexión requiere un certificado de cliente válido" -#: libpq/auth.c:452 libpq/auth.c:498 +#: libpq/auth.c:450 libpq/auth.c:496 msgid "GSS encryption" msgstr "cifrado GSS" -#: libpq/auth.c:455 libpq/auth.c:501 +#: libpq/auth.c:453 libpq/auth.c:499 msgid "SSL encryption" msgstr "cifrado SSL" -#: libpq/auth.c:457 libpq/auth.c:503 +#: libpq/auth.c:455 libpq/auth.c:501 msgid "no encryption" msgstr "sin cifrado" #. translator: last %s describes encryption state -#: libpq/auth.c:463 +#: libpq/auth.c:461 #, c-format msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" msgstr "pg_hba.conf rechaza la conexión de replicación para el servidor «%s», usuario «%s», %s" #. translator: last %s describes encryption state -#: libpq/auth.c:470 +#: libpq/auth.c:468 #, c-format msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "pg_hba.conf rechaza la conexión para el servidor «%s», usuario «%s», base de datos «%s», %s" -#: libpq/auth.c:508 +#: libpq/auth.c:506 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "La dirección IP del cliente fue resuelta a «%s», este resultado es coincidente." -#: libpq/auth.c:511 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "La dirección IP del cliente fue resuelta a «%s», este resultado no fue verificado." -#: libpq/auth.c:514 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "La dirección IP del cliente fue resuelta a «%s», este resultado no es coincidente." -#: libpq/auth.c:517 +#: libpq/auth.c:515 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "No se pudo traducir el nombre de host del cliente «%s» a una dirección IP: %s." -#: libpq/auth.c:522 +#: libpq/auth.c:520 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "No se pudo obtener la dirección IP del cliente a un nombre de host: %s." #. translator: last %s describes encryption state -#: libpq/auth.c:530 +#: libpq/auth.c:528 #, c-format msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" msgstr "no hay una línea en pg_hba.conf para la conexión de replicación desde el servidor «%s», usuario «%s», %s" #. translator: last %s describes encryption state -#: libpq/auth.c:538 +#: libpq/auth.c:536 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "no hay una línea en pg_hba.conf para «%s», usuario «%s», base de datos «%s», %s" -#: libpq/auth.c:711 +#: libpq/auth.c:656 +#, c-format +msgid "connection authenticated: user=\"%s\" method=%s (%s:%d)" +msgstr "conexión autenticada: usuario=«%s» método=%s (%s:%d)" + +#: libpq/auth.c:725 #, c-format msgid "expected password response, got message type %d" msgstr "se esperaba una respuesta de contraseña, se obtuvo mensaje de tipo %d" -#: libpq/auth.c:732 +#: libpq/auth.c:746 #, c-format msgid "invalid password packet size" msgstr "el tamaño del paquete de contraseña no es válido" -#: libpq/auth.c:750 +#: libpq/auth.c:764 #, c-format msgid "empty password returned by client" msgstr "el cliente retornó una contraseña vacía" -#: libpq/auth.c:879 libpq/hba.c:1749 -#, c-format -msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" -msgstr "la autentificación MD5 no está soportada cuando «db_user_namespace» está activo" - -#: libpq/auth.c:885 +#: libpq/auth.c:892 #, c-format msgid "could not generate random MD5 salt" msgstr "no se pudo generar una sal MD5 aleatoria" -#: libpq/auth.c:936 libpq/be-secure-gssapi.c:540 +#: libpq/auth.c:943 libpq/be-secure-gssapi.c:540 #, c-format msgid "could not set environment: %m" msgstr "no se pudo establecer el ambiente: %m" -#: libpq/auth.c:975 +#: libpq/auth.c:982 #, c-format msgid "expected GSS response, got message type %d" msgstr "se esperaba una respuesta GSS, se obtuvo mensaje de tipo %d" -#: libpq/auth.c:1041 +#: libpq/auth.c:1048 msgid "accepting GSS security context failed" msgstr "falló la aceptación del contexto de seguridad GSS" -#: libpq/auth.c:1082 +#: libpq/auth.c:1089 msgid "retrieving GSS user name failed" msgstr "falló la obtención del nombre de usuario GSS" -#: libpq/auth.c:1228 +#: libpq/auth.c:1235 msgid "could not acquire SSPI credentials" msgstr "no se pudo obtener las credenciales SSPI" -#: libpq/auth.c:1253 +#: libpq/auth.c:1260 #, c-format msgid "expected SSPI response, got message type %d" msgstr "se esperaba una respuesta SSPI, se obtuvo mensaje de tipo %d" -#: libpq/auth.c:1331 +#: libpq/auth.c:1338 msgid "could not accept SSPI security context" msgstr "no se pudo aceptar un contexto SSPI" -#: libpq/auth.c:1372 +#: libpq/auth.c:1379 msgid "could not get token from SSPI security context" msgstr "no se pudo obtener un testigo (token) desde el contexto de seguridad SSPI" -#: libpq/auth.c:1508 libpq/auth.c:1527 +#: libpq/auth.c:1515 libpq/auth.c:1534 #, c-format msgid "could not translate name" msgstr "no se pudo traducir el nombre" -#: libpq/auth.c:1540 +#: libpq/auth.c:1547 #, c-format msgid "realm name too long" msgstr "nombre de «realm» demasiado largo" -#: libpq/auth.c:1555 +#: libpq/auth.c:1562 #, c-format msgid "translated account name too long" msgstr "nombre de cuenta traducido demasiado largo" -#: libpq/auth.c:1734 +#: libpq/auth.c:1741 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "no se pudo crear un socket para conexión Ident: %m" -#: libpq/auth.c:1749 +#: libpq/auth.c:1756 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "no se pudo enlazar a la dirección local «%s»: %m" -#: libpq/auth.c:1761 +#: libpq/auth.c:1768 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "no se pudo conectar al servidor Ident en dirección «%s», port %s: %m" -#: libpq/auth.c:1783 +#: libpq/auth.c:1790 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "no se pudo enviar consulta Ident al servidor «%s», port %s: %m" -#: libpq/auth.c:1800 +#: libpq/auth.c:1807 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "no se pudo recibir respuesta Ident desde el servidor «%s», port %s: %m" -#: libpq/auth.c:1810 +#: libpq/auth.c:1817 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "respuesta del servidor Ident en formato no válido: «%s»" -#: libpq/auth.c:1863 +#: libpq/auth.c:1870 #, c-format msgid "peer authentication is not supported on this platform" msgstr "método de autentificación peer no está soportado en esta plataforma" -#: libpq/auth.c:1867 +#: libpq/auth.c:1874 #, c-format msgid "could not get peer credentials: %m" msgstr "no se pudo recibir credenciales: %m" -#: libpq/auth.c:1879 +#: libpq/auth.c:1886 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "no se pudo encontrar el ID del usuario local %ld: %s" -#: libpq/auth.c:1981 +#: libpq/auth.c:1988 #, c-format msgid "error from underlying PAM layer: %s" msgstr "se ha recibido un error de la biblioteca PAM: %s" -#: libpq/auth.c:1992 +#: libpq/auth.c:1999 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "conversación PAM no soportada: %d/«%s»" -#: libpq/auth.c:2049 +#: libpq/auth.c:2056 #, c-format msgid "could not create PAM authenticator: %s" msgstr "no se pudo crear autenticador PAM: %s" -#: libpq/auth.c:2060 +#: libpq/auth.c:2067 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) falló: %s" -#: libpq/auth.c:2092 +#: libpq/auth.c:2099 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) falló: %s" -#: libpq/auth.c:2104 +#: libpq/auth.c:2111 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) falló: %s" -#: libpq/auth.c:2117 +#: libpq/auth.c:2124 #, c-format msgid "pam_authenticate failed: %s" msgstr "pam_authenticate falló: %s" -#: libpq/auth.c:2130 +#: libpq/auth.c:2137 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt falló: %s" -#: libpq/auth.c:2141 +#: libpq/auth.c:2148 #, c-format msgid "could not release PAM authenticator: %s" msgstr "no se pudo liberar autenticador PAM: %s" -#: libpq/auth.c:2221 +#: libpq/auth.c:2228 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "no se pudo inicializar LDAP: código de error %d" -#: libpq/auth.c:2258 +#: libpq/auth.c:2265 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "no se pudo extraer el nombre de dominio de ldapbasedn" -#: libpq/auth.c:2266 +#: libpq/auth.c:2273 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "la autentificación LDAP no pudo encontrar registros DNS SRV para «%s»" -#: libpq/auth.c:2268 +#: libpq/auth.c:2275 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Defina un nombre de servidor LDAP explícitamente." -#: libpq/auth.c:2320 +#: libpq/auth.c:2327 #, c-format msgid "could not initialize LDAP: %s" msgstr "no se pudo inicializar LDAP: %s" -#: libpq/auth.c:2330 +#: libpq/auth.c:2337 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldaps no está soportado con esta biblioteca LDAP" -#: libpq/auth.c:2338 +#: libpq/auth.c:2345 #, c-format msgid "could not initialize LDAP: %m" msgstr "no se pudo inicializar LDAP: %m" -#: libpq/auth.c:2348 +#: libpq/auth.c:2355 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "no se pudo definir la versión de protocolo LDAP: %s" -#: libpq/auth.c:2364 +#: libpq/auth.c:2371 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "no se pudo iniciar sesión de LDAP TLS: %s" -#: libpq/auth.c:2441 +#: libpq/auth.c:2448 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "servidor LDAP no especificado, y no hay ldapbasedn" -#: libpq/auth.c:2448 +#: libpq/auth.c:2455 #, c-format msgid "LDAP server not specified" msgstr "servidor LDAP no especificado" -#: libpq/auth.c:2510 +#: libpq/auth.c:2517 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "carácter no válido en nombre de usuario para autentificación LDAP" -#: libpq/auth.c:2527 +#: libpq/auth.c:2534 #, c-format msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" msgstr "no se pudo hacer el enlace LDAP inicial para el ldapbinddb «%s» en el servidor «%s»: %s" -#: libpq/auth.c:2557 +#: libpq/auth.c:2564 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "no se pudo hacer la búsqueda LDAP para el filtro «%s» en el servidor «%s»: %s" -#: libpq/auth.c:2573 +#: libpq/auth.c:2580 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "no existe el usuario LDAP «%s»" -#: libpq/auth.c:2574 +#: libpq/auth.c:2581 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "La búsqueda LDAP para el filtro «%s» en el servidor «%s» no retornó elementos." -#: libpq/auth.c:2578 +#: libpq/auth.c:2585 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "el usuario LDAP «%s» no es única" -#: libpq/auth.c:2579 +#: libpq/auth.c:2586 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." msgstr[0] "La búsqueda LDAP para el filtro «%s» en el servidor «%s» retornó %d elemento." msgstr[1] "La búsqueda LDAP para el filtro «%s» en el servidor «%s» retornó %d elementos." -#: libpq/auth.c:2599 +#: libpq/auth.c:2606 #, c-format msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "no se pudo obtener el dn para la primera entrada que coincide con «%s» en el servidor «%s»: %s" -#: libpq/auth.c:2620 -#, c-format -msgid "could not unbind after searching for user \"%s\" on server \"%s\"" -msgstr "no se pudo desconectar (unbind) después de buscar al usuario «%s» en el servidor «%s»" - -#: libpq/auth.c:2651 +#: libpq/auth.c:2633 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "falló el inicio de sesión LDAP para el usuario «%s» en el servidor «%s»: %s" -#: libpq/auth.c:2683 +#: libpq/auth.c:2665 #, c-format msgid "LDAP diagnostics: %s" msgstr "Diagnóstico LDAP: %s" -#: libpq/auth.c:2721 +#: libpq/auth.c:2703 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "la autentificación con certificado falló para el usuario «%s»: el certificado de cliente no contiene un nombre de usuario" -#: libpq/auth.c:2742 +#: libpq/auth.c:2724 #, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" msgstr "la autentificación por certificado falló para el usuario «%s»: no se pudo obtener el DN del sujeto" -#: libpq/auth.c:2765 +#: libpq/auth.c:2747 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" msgstr "la validación de certificado (clientcert=verify-full) falló para el usuario «%s»: discordancia de DN" -#: libpq/auth.c:2770 +#: libpq/auth.c:2752 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "la validación de certificado (clientcert=verify-full) falló para el usuario «%s»: discordancia de CN" -#: libpq/auth.c:2872 +#: libpq/auth.c:2854 #, c-format msgid "RADIUS server not specified" msgstr "servidor RADIUS no especificado" -#: libpq/auth.c:2879 +#: libpq/auth.c:2861 #, c-format msgid "RADIUS secret not specified" msgstr "secreto RADIUS no especificado" -#: libpq/auth.c:2893 +#: libpq/auth.c:2875 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "la autentificación RADIUS no soporta contraseñas más largas de %d caracteres" -#: libpq/auth.c:2995 libpq/hba.c:2391 +#: libpq/auth.c:2977 libpq/hba.c:2352 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "no se pudo traducir el nombre de servidor RADIUS «%s» a dirección: %s" -#: libpq/auth.c:3009 +#: libpq/auth.c:2991 #, c-format msgid "could not generate random encryption vector" msgstr "no se pudo generar un vector aleatorio de encriptación" -#: libpq/auth.c:3046 -#, fuzzy, c-format -#| msgid "could not encrypt password: %s\n" +#: libpq/auth.c:3028 +#, c-format msgid "could not perform MD5 encryption of password: %s" -msgstr "no se pudo cifrar contraseña: %s\n" +msgstr "no se pudo efectuar cifrado MD5 de contraseña: %s" -#: libpq/auth.c:3073 +#: libpq/auth.c:3055 #, c-format msgid "could not create RADIUS socket: %m" msgstr "no se pudo crear el socket RADIUS: %m" -#: libpq/auth.c:3089 +#: libpq/auth.c:3071 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "no se pudo enlazar el socket RADIUS local: %m" -#: libpq/auth.c:3099 +#: libpq/auth.c:3081 #, c-format msgid "could not send RADIUS packet: %m" msgstr "no se pudo enviar el paquete RADIUS: %m" -#: libpq/auth.c:3133 libpq/auth.c:3159 +#: libpq/auth.c:3115 libpq/auth.c:3141 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "se agotó el tiempo de espera de la respuesta RADIUS desde %s" -#: libpq/auth.c:3152 +#: libpq/auth.c:3134 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "no se pudo verificar el estado en el socket %m" -#: libpq/auth.c:3182 +#: libpq/auth.c:3164 #, c-format msgid "could not read RADIUS response: %m" msgstr "no se pudo leer la respuesta RADIUS: %m" -#: libpq/auth.c:3190 +#: libpq/auth.c:3172 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "la respuesta RADIUS desde %s fue enviada desde el port incorrecto: %d" -#: libpq/auth.c:3198 +#: libpq/auth.c:3180 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "la respuesta RADIUS desde %s es demasiado corta: %d" -#: libpq/auth.c:3205 +#: libpq/auth.c:3187 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "la respuesta RADIUS desde %ss tiene largo corrupto: %d (largo real %d)" -#: libpq/auth.c:3213 +#: libpq/auth.c:3195 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "la respuesta RADIUS desde %s es a una petición diferente: %d (debería ser %d)" -#: libpq/auth.c:3238 -#, fuzzy, c-format -#| msgid "could not send feedback packet: %s" +#: libpq/auth.c:3220 +#, c-format msgid "could not perform MD5 encryption of received packet: %s" -msgstr "no se pudo enviar el paquete de retroalimentación: %s" +msgstr "no se pudo efectuar cifrado MD5 del paquete recibido: %s" -#: libpq/auth.c:3248 +#: libpq/auth.c:3230 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "la respuesta RADIUS desde %s tiene firma MD5 incorrecta" -#: libpq/auth.c:3266 +#: libpq/auth.c:3248 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "la respuesta RADIUS desde %s tiene código no válido (%d) para el usuario «%s»" @@ -14868,64 +15140,51 @@ msgstr "no se pudo escribir el archivo del servidor «%s»: %m" msgid "large object read request is too large" msgstr "el tamaño de petición de lectura de objeto grande es muy grande" -#: libpq/be-fsstubs.c:816 utils/adt/genfile.c:262 utils/adt/genfile.c:294 -#: utils/adt/genfile.c:315 +#: libpq/be-fsstubs.c:816 utils/adt/genfile.c:248 utils/adt/genfile.c:269 #, c-format msgid "requested length cannot be negative" msgstr "el tamaño solicitado no puede ser negativo" -#: libpq/be-fsstubs.c:871 storage/large_object/inv_api.c:299 -#: storage/large_object/inv_api.c:311 storage/large_object/inv_api.c:508 -#: storage/large_object/inv_api.c:619 storage/large_object/inv_api.c:809 -#, c-format -msgid "permission denied for large object %u" -msgstr "permiso denegado al objeto grande %u" - -#: libpq/be-secure-common.c:71 -#, c-format -msgid "could not read from command \"%s\": %m" -msgstr "no se pudo leer desde la orden «%s»: %m" - -#: libpq/be-secure-common.c:91 +#: libpq/be-secure-common.c:94 #, c-format msgid "command \"%s\" failed" msgstr "la orden «%s» falló" -#: libpq/be-secure-common.c:119 +#: libpq/be-secure-common.c:123 #, c-format msgid "could not access private key file \"%s\": %m" msgstr "no se pudo acceder al archivo de la llave privada «%s»: %m" -#: libpq/be-secure-common.c:129 +#: libpq/be-secure-common.c:133 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "el archivo de llave privada «%s» no es un archivo regular" -#: libpq/be-secure-common.c:155 +#: libpq/be-secure-common.c:159 #, c-format msgid "private key file \"%s\" must be owned by the database user or root" msgstr "el archivo de llave privada «%s» debe ser de propiedad del usuario de base de datos o root" -#: libpq/be-secure-common.c:165 +#: libpq/be-secure-common.c:169 #, c-format msgid "private key file \"%s\" has group or world access" msgstr "el archivo de la llave privada «%s» tiene acceso para el grupo u otros" -#: libpq/be-secure-common.c:167 +#: libpq/be-secure-common.c:171 #, c-format msgid "File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root." msgstr "El archivo debe tener permisos u=rw (0600) o menos si es de propiedad del usuario de base deatos, o permisos u=rw,g=r (0640) o menos si es de root." -#: libpq/be-secure-gssapi.c:204 +#: libpq/be-secure-gssapi.c:201 msgid "GSSAPI wrap error" msgstr "error de «wrap» de GSSAPI" -#: libpq/be-secure-gssapi.c:211 +#: libpq/be-secure-gssapi.c:208 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "mensaje saliente GSSAPI no proveería confidencialidad" -#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:634 +#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "el servidor intentó enviar un paquete GSSAPI demasiado grande (%zu > %zu)" @@ -14957,819 +15216,810 @@ msgstr "no se pudo aceptar un contexto de seguridad GSSAPI" msgid "GSSAPI size check error" msgstr "error de verificación de tamaño GSSAPI" -#: libpq/be-secure-openssl.c:125 +#: libpq/be-secure-openssl.c:131 #, c-format msgid "could not create SSL context: %s" msgstr "no se pudo crear un contexto SSL: %s" -#: libpq/be-secure-openssl.c:151 +#: libpq/be-secure-openssl.c:157 #, c-format msgid "could not load server certificate file \"%s\": %s" msgstr "no se pudo cargar el archivo de certificado de servidor «%s»: %s" -#: libpq/be-secure-openssl.c:171 +#: libpq/be-secure-openssl.c:177 #, c-format msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" msgstr "el archivo de clave privada \"%s\" no se puede volver a cargar porque requiere una contraseña" -#: libpq/be-secure-openssl.c:176 +#: libpq/be-secure-openssl.c:182 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "no se pudo cargar el archivo de la llave privada «%s»: %s" -#: libpq/be-secure-openssl.c:185 +#: libpq/be-secure-openssl.c:191 #, c-format msgid "check of private key failed: %s" msgstr "falló la revisión de la llave privada: %s" #. translator: first %s is a GUC option name, second %s is its value -#: libpq/be-secure-openssl.c:198 libpq/be-secure-openssl.c:221 +#: libpq/be-secure-openssl.c:204 libpq/be-secure-openssl.c:227 #, c-format msgid "\"%s\" setting \"%s\" not supported by this build" msgstr "el valor «%2$s» para la opción «%1$s» no está soportado en este servidor" -#: libpq/be-secure-openssl.c:208 +#: libpq/be-secure-openssl.c:214 #, c-format msgid "could not set minimum SSL protocol version" msgstr "no se pudo definir la versión mínima de protocolo SSL" -#: libpq/be-secure-openssl.c:231 +#: libpq/be-secure-openssl.c:237 #, c-format msgid "could not set maximum SSL protocol version" msgstr "no se pudo definir la versión máxima de protocolo SSL" -#: libpq/be-secure-openssl.c:247 +#: libpq/be-secure-openssl.c:253 #, c-format msgid "could not set SSL protocol version range" msgstr "no se pudo definir el rango de versión de protocolo SSL" -#: libpq/be-secure-openssl.c:248 +#: libpq/be-secure-openssl.c:254 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "«%s» no puede ser más alto que «%s»" -#: libpq/be-secure-openssl.c:285 +#: libpq/be-secure-openssl.c:307 #, c-format msgid "could not set the cipher list (no valid ciphers available)" msgstr "no se pudo establecer la lista de cifrado (no hay cifradores disponibles)" -#: libpq/be-secure-openssl.c:305 +#: libpq/be-secure-openssl.c:327 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "no se pudo cargar el archivo del certificado raíz «%s»: %s" -#: libpq/be-secure-openssl.c:354 +#: libpq/be-secure-openssl.c:376 #, c-format msgid "could not load SSL certificate revocation list file \"%s\": %s" msgstr "no se pudo cargar el archivo de lista de revocación de certificados SSL «%s»: %s" -#: libpq/be-secure-openssl.c:362 +#: libpq/be-secure-openssl.c:384 #, c-format msgid "could not load SSL certificate revocation list directory \"%s\": %s" msgstr "no se pudo cargar el directorio de lista de revocación de certificados SSL «%s»: %s" -#: libpq/be-secure-openssl.c:370 +#: libpq/be-secure-openssl.c:392 #, c-format msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" msgstr "no se pudo cargar el archivo de lista de revocación de certificados SSL «%s» o directorio «%s»: %s" -#: libpq/be-secure-openssl.c:428 +#: libpq/be-secure-openssl.c:450 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "no se pudo inicializar la conexión SSL: el contexto SSL no está instalado" -#: libpq/be-secure-openssl.c:439 +#: libpq/be-secure-openssl.c:464 #, c-format msgid "could not initialize SSL connection: %s" msgstr "no se pudo inicializar la conexión SSL: %s" -#: libpq/be-secure-openssl.c:447 +#: libpq/be-secure-openssl.c:472 #, c-format msgid "could not set SSL socket: %s" msgstr "no se definir un socket SSL: %s" -#: libpq/be-secure-openssl.c:502 +#: libpq/be-secure-openssl.c:528 #, c-format msgid "could not accept SSL connection: %m" msgstr "no se pudo aceptar una conexión SSL: %m" -#: libpq/be-secure-openssl.c:506 libpq/be-secure-openssl.c:561 +#: libpq/be-secure-openssl.c:532 libpq/be-secure-openssl.c:589 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "no se pudo aceptar una conexión SSL: se detectó EOF" -#: libpq/be-secure-openssl.c:545 +#: libpq/be-secure-openssl.c:573 #, c-format msgid "could not accept SSL connection: %s" msgstr "no se pudo aceptar una conexión SSL: %s" -#: libpq/be-secure-openssl.c:549 +#: libpq/be-secure-openssl.c:577 #, c-format msgid "This may indicate that the client does not support any SSL protocol version between %s and %s." msgstr "Esto puede indicar que el cliente no soporta ninguna versión del protocolo SSL entre %s y %s." -#: libpq/be-secure-openssl.c:566 libpq/be-secure-openssl.c:746 -#: libpq/be-secure-openssl.c:810 +#: libpq/be-secure-openssl.c:594 libpq/be-secure-openssl.c:809 +#: libpq/be-secure-openssl.c:879 #, c-format msgid "unrecognized SSL error code: %d" msgstr "código de error SSL no reconocido: %d" -#: libpq/be-secure-openssl.c:612 +#: libpq/be-secure-openssl.c:622 +#, c-format +msgid "received SSL connection request with unexpected ALPN protocol" +msgstr "recibido una solicitud de conexión SSL con protocolo ALPN inesperado" + +#: libpq/be-secure-openssl.c:666 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "el «common name» del certificado SSL contiene un carácter null" -#: libpq/be-secure-openssl.c:652 +#: libpq/be-secure-openssl.c:712 #, c-format msgid "SSL certificate's distinguished name contains embedded null" msgstr "el elemento de nombre distinguido en el certificado SSL contiene un carácter null" -#: libpq/be-secure-openssl.c:735 libpq/be-secure-openssl.c:794 +#: libpq/be-secure-openssl.c:798 libpq/be-secure-openssl.c:863 #, c-format msgid "SSL error: %s" msgstr "error de SSL: %s" -#: libpq/be-secure-openssl.c:976 +#: libpq/be-secure-openssl.c:1038 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "no se pudo abrir el archivo de parámetros DH «%s»: %m" -#: libpq/be-secure-openssl.c:988 +#: libpq/be-secure-openssl.c:1050 #, c-format msgid "could not load DH parameters file: %s" msgstr "no se pudo cargar el archivo de parámetros DH: %s" -#: libpq/be-secure-openssl.c:998 +#: libpq/be-secure-openssl.c:1060 #, c-format msgid "invalid DH parameters: %s" msgstr "parámetros DH no válidos: %s" -#: libpq/be-secure-openssl.c:1007 +#: libpq/be-secure-openssl.c:1069 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "parámetros DH no válidos: p no es primo" -#: libpq/be-secure-openssl.c:1016 +#: libpq/be-secure-openssl.c:1078 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "parámetros DH no válidos: no hay generador apropiado o primo seguro" -#: libpq/be-secure-openssl.c:1152 -#, fuzzy, c-format -#| msgid "certificate authentication failed for user \"%s\"" +#: libpq/be-secure-openssl.c:1214 +#, c-format msgid "Client certificate verification failed at depth %d: %s." -msgstr "la autentificación por certificado falló para el usuario «%s»" +msgstr "La autentificación por certificado de cliente falló en la profundidad %d: %s." -#: libpq/be-secure-openssl.c:1189 +#: libpq/be-secure-openssl.c:1251 #, c-format msgid "Failed certificate data (unverified): subject \"%s\", serial number %s, issuer \"%s\"." -msgstr "" +msgstr "Datos del certificado fallido (sin verificar): sujeto «%s», número de serie %s, emisor «%s»." -#: libpq/be-secure-openssl.c:1190 +#: libpq/be-secure-openssl.c:1252 msgid "unknown" msgstr "desconocido" -#: libpq/be-secure-openssl.c:1281 +#: libpq/be-secure-openssl.c:1389 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: no se pudo cargar los parámetros DH" -#: libpq/be-secure-openssl.c:1289 +#: libpq/be-secure-openssl.c:1397 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: no se pudo definir los parámetros DH: %s" -#: libpq/be-secure-openssl.c:1316 +#: libpq/be-secure-openssl.c:1424 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: nombre de curva no reconocida: %s" -#: libpq/be-secure-openssl.c:1325 +#: libpq/be-secure-openssl.c:1433 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: no se pudo crear la llave" -#: libpq/be-secure-openssl.c:1353 +#: libpq/be-secure-openssl.c:1461 msgid "no SSL error reported" msgstr "código de error SSL no reportado" -#: libpq/be-secure-openssl.c:1357 +#: libpq/be-secure-openssl.c:1479 #, c-format msgid "SSL error code %lu" msgstr "código de error SSL %lu" -#: libpq/be-secure-openssl.c:1516 +#: libpq/be-secure-openssl.c:1636 #, c-format msgid "could not create BIO" msgstr "no se pudo crear BIO" -#: libpq/be-secure-openssl.c:1526 +#: libpq/be-secure-openssl.c:1646 #, c-format msgid "could not get NID for ASN1_OBJECT object" msgstr "no se pudo obtener NID para objeto ASN1_OBJECT" -#: libpq/be-secure-openssl.c:1534 +#: libpq/be-secure-openssl.c:1654 #, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" msgstr "no se pudo convertir NID %d en una estructura ASN1_OBJECT" -#: libpq/be-secure.c:207 libpq/be-secure.c:303 -#, c-format -msgid "terminating connection due to unexpected postmaster exit" -msgstr "terminando la conexión debido al término inesperado de postmaster" - -#: libpq/crypt.c:49 +#: libpq/crypt.c:48 #, c-format msgid "Role \"%s\" does not exist." msgstr "No existe el rol «%s»." -#: libpq/crypt.c:59 +#: libpq/crypt.c:58 #, c-format msgid "User \"%s\" has no password assigned." msgstr "El usuario «%s» no tiene una contraseña asignada." -#: libpq/crypt.c:77 +#: libpq/crypt.c:76 #, c-format msgid "User \"%s\" has an expired password." msgstr "El usuario «%s» tiene contraseña expirada." -#: libpq/crypt.c:183 +#: libpq/crypt.c:182 #, c-format msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "El usuario \"%s\" tiene una contraseña que no se puede usar con la autentificación MD5." -#: libpq/crypt.c:204 libpq/crypt.c:246 libpq/crypt.c:266 +#: libpq/crypt.c:203 libpq/crypt.c:245 libpq/crypt.c:265 #, c-format msgid "Password does not match for user \"%s\"." msgstr "La contraseña no coincide para el usuario «%s»." -#: libpq/crypt.c:285 +#: libpq/crypt.c:284 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "La contraseña del usuario \"%s\" está en un formato no reconocido." -#: libpq/hba.c:234 -#, c-format -msgid "authentication file token too long, skipping: \"%s\"" -msgstr "una palabra en el archivo de autentificación es demasiado larga, omitiendo: «%s»" - -#: libpq/hba.c:357 +#: libpq/hba.c:327 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "la expresión regular «%s» no es válida: %s" -#: libpq/hba.c:359 libpq/hba.c:688 libpq/hba.c:1272 libpq/hba.c:1292 -#: libpq/hba.c:1315 libpq/hba.c:1328 libpq/hba.c:1381 libpq/hba.c:1409 -#: libpq/hba.c:1417 libpq/hba.c:1429 libpq/hba.c:1450 libpq/hba.c:1463 -#: libpq/hba.c:1488 libpq/hba.c:1515 libpq/hba.c:1527 libpq/hba.c:1586 -#: libpq/hba.c:1606 libpq/hba.c:1620 libpq/hba.c:1640 libpq/hba.c:1651 -#: libpq/hba.c:1666 libpq/hba.c:1685 libpq/hba.c:1701 libpq/hba.c:1713 -#: libpq/hba.c:1750 libpq/hba.c:1791 libpq/hba.c:1804 libpq/hba.c:1826 -#: libpq/hba.c:1838 libpq/hba.c:1856 libpq/hba.c:1906 libpq/hba.c:1950 -#: libpq/hba.c:1961 libpq/hba.c:1977 libpq/hba.c:1994 libpq/hba.c:2005 -#: libpq/hba.c:2024 libpq/hba.c:2040 libpq/hba.c:2056 libpq/hba.c:2115 -#: libpq/hba.c:2132 libpq/hba.c:2145 libpq/hba.c:2157 libpq/hba.c:2176 -#: libpq/hba.c:2262 libpq/hba.c:2280 libpq/hba.c:2374 libpq/hba.c:2393 -#: libpq/hba.c:2422 libpq/hba.c:2435 libpq/hba.c:2458 libpq/hba.c:2480 -#: libpq/hba.c:2494 tsearch/ts_locale.c:243 +#: libpq/hba.c:329 libpq/hba.c:661 libpq/hba.c:1245 libpq/hba.c:1265 +#: libpq/hba.c:1288 libpq/hba.c:1301 libpq/hba.c:1354 libpq/hba.c:1382 +#: libpq/hba.c:1390 libpq/hba.c:1402 libpq/hba.c:1423 libpq/hba.c:1436 +#: libpq/hba.c:1461 libpq/hba.c:1488 libpq/hba.c:1500 libpq/hba.c:1559 +#: libpq/hba.c:1579 libpq/hba.c:1593 libpq/hba.c:1613 libpq/hba.c:1624 +#: libpq/hba.c:1639 libpq/hba.c:1658 libpq/hba.c:1674 libpq/hba.c:1686 +#: libpq/hba.c:1752 libpq/hba.c:1765 libpq/hba.c:1787 libpq/hba.c:1799 +#: libpq/hba.c:1817 libpq/hba.c:1867 libpq/hba.c:1911 libpq/hba.c:1922 +#: libpq/hba.c:1938 libpq/hba.c:1955 libpq/hba.c:1966 libpq/hba.c:1985 +#: libpq/hba.c:2001 libpq/hba.c:2017 libpq/hba.c:2076 libpq/hba.c:2093 +#: libpq/hba.c:2106 libpq/hba.c:2118 libpq/hba.c:2137 libpq/hba.c:2223 +#: libpq/hba.c:2241 libpq/hba.c:2335 libpq/hba.c:2354 libpq/hba.c:2383 +#: libpq/hba.c:2396 libpq/hba.c:2419 libpq/hba.c:2441 libpq/hba.c:2455 +#: tsearch/ts_locale.c:241 #, c-format msgid "line %d of configuration file \"%s\"" msgstr "línea %d del archivo de configuración «%s»" -#: libpq/hba.c:484 -#, fuzzy, c-format -#| msgid "skipping missing configuration file \"%s\"" +#: libpq/hba.c:457 +#, c-format msgid "skipping missing authentication file \"%s\"" -msgstr "omitiendo el archivo de configuración faltante «%s»" +msgstr "omitiendo el archivo de autentificación faltante «%s»" -#: libpq/hba.c:636 -#, fuzzy, c-format -#| msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" +#: libpq/hba.c:609 +#, c-format msgid "could not open file \"%s\": maximum nesting depth exceeded" -msgstr "no se pudo abrir el archivo de configuración «%s»: nivel de anidamiento máximo excedido" +msgstr "no se pudo abrir el archivo «%s»: nivel de anidamiento máximo excedido" -#: libpq/hba.c:1243 +#: libpq/hba.c:1216 #, c-format msgid "error enumerating network interfaces: %m" msgstr "error al enumerar interfaces de red: %m" #. translator: the second %s is a list of auth methods -#: libpq/hba.c:1270 +#: libpq/hba.c:1243 #, c-format msgid "authentication option \"%s\" is only valid for authentication methods %s" msgstr "la opción de autentificación «%s» sólo es válida para los métodos de autentificación %s" -#: libpq/hba.c:1290 +#: libpq/hba.c:1263 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "el método de autentificación «%s» requiere que el argumento «%s» esté definido" -#: libpq/hba.c:1314 -#, fuzzy, c-format -#| msgid "missing entry in file \"%s\" at end of line %d" +#: libpq/hba.c:1287 +#, c-format msgid "missing entry at end of line" -msgstr "falta una entrada en el archivo «%s» al final de la línea %d" +msgstr "falta una entrada al final de la línea" -#: libpq/hba.c:1327 +#: libpq/hba.c:1300 #, c-format msgid "multiple values in ident field" msgstr "múltiples valores en campo «ident»" -#: libpq/hba.c:1379 +#: libpq/hba.c:1352 #, c-format msgid "multiple values specified for connection type" msgstr "múltiples valores especificados para tipo de conexión" -#: libpq/hba.c:1380 +#: libpq/hba.c:1353 #, c-format msgid "Specify exactly one connection type per line." msgstr "Especifique exactamente un tipo de conexión por línea." -#: libpq/hba.c:1407 +#: libpq/hba.c:1380 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "el registro hostssl no puede coincidir porque SSL está deshabilitado" -#: libpq/hba.c:1408 +#: libpq/hba.c:1381 #, c-format -msgid "Set ssl = on in postgresql.conf." +msgid "Set \"ssl = on\" in postgresql.conf." msgstr "Defina «ssl = on» en postgresql.conf." -#: libpq/hba.c:1416 +#: libpq/hba.c:1389 #, c-format msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "el registro hostssl no puede coincidir porque SSL no está soportado en esta instalación" -#: libpq/hba.c:1428 +#: libpq/hba.c:1401 #, c-format msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" msgstr "el registro hostgssenc no puede coincidir porque GSSAPI no está soportado en esta instalación" -#: libpq/hba.c:1448 +#: libpq/hba.c:1421 #, c-format msgid "invalid connection type \"%s\"" msgstr "tipo de conexión «%s» no válido" -#: libpq/hba.c:1462 +#: libpq/hba.c:1435 #, c-format msgid "end-of-line before database specification" msgstr "fin de línea antes de especificación de base de datos" -#: libpq/hba.c:1487 +#: libpq/hba.c:1460 #, c-format msgid "end-of-line before role specification" msgstr "fin de línea antes de especificación de rol" -#: libpq/hba.c:1514 +#: libpq/hba.c:1487 #, c-format msgid "end-of-line before IP address specification" msgstr "fin de línea antes de especificación de dirección IP" -#: libpq/hba.c:1525 +#: libpq/hba.c:1498 #, c-format msgid "multiple values specified for host address" msgstr "múltiples valores especificados para la dirección de anfitrión" -#: libpq/hba.c:1526 +#: libpq/hba.c:1499 #, c-format msgid "Specify one address range per line." msgstr "Especifique un rango de direcciones por línea." -#: libpq/hba.c:1584 +#: libpq/hba.c:1557 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "dirección IP «%s» no válida: %s" -#: libpq/hba.c:1604 +#: libpq/hba.c:1577 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "especificar tanto el nombre de host como la máscara CIDR no es válido: «%s»" -#: libpq/hba.c:1618 +#: libpq/hba.c:1591 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "máscara CIDR no válida en dirección «%s»" -#: libpq/hba.c:1638 +#: libpq/hba.c:1611 #, c-format msgid "end-of-line before netmask specification" msgstr "fin de línea antes de especificación de máscara de red" -#: libpq/hba.c:1639 +#: libpq/hba.c:1612 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "Especifique un rango de direcciones en notación CIDR, o provea una netmask separadamente." -#: libpq/hba.c:1650 +#: libpq/hba.c:1623 #, c-format msgid "multiple values specified for netmask" msgstr "múltiples valores especificados para la máscara de red" -#: libpq/hba.c:1664 +#: libpq/hba.c:1637 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "máscara IP «%s» no válida: %s" -#: libpq/hba.c:1684 +#: libpq/hba.c:1657 #, c-format msgid "IP address and mask do not match" msgstr "La dirección y máscara IP no coinciden" -#: libpq/hba.c:1700 +#: libpq/hba.c:1673 #, c-format msgid "end-of-line before authentication method" msgstr "fin de línea antes de especificación de método de autentificación" -#: libpq/hba.c:1711 +#: libpq/hba.c:1684 #, c-format msgid "multiple values specified for authentication type" msgstr "múltiples valores especificados para el tipo de autentificación" -#: libpq/hba.c:1712 +#: libpq/hba.c:1685 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Especifique exactamente un tipo de autentificación por línea." -#: libpq/hba.c:1789 +#: libpq/hba.c:1750 #, c-format msgid "invalid authentication method \"%s\"" msgstr "método de autentificación «%s» no válido" -#: libpq/hba.c:1802 +#: libpq/hba.c:1763 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "método de autentificación «%s» no válido: este servidor no lo soporta" -#: libpq/hba.c:1825 +#: libpq/hba.c:1786 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "la autentificación gssapi no está soportada en conexiones locales" -#: libpq/hba.c:1837 +#: libpq/hba.c:1798 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "la autentificación peer sólo está soportada en conexiones locales" -#: libpq/hba.c:1855 +#: libpq/hba.c:1816 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "la autentificación cert sólo está soportada en conexiones hostssl" -#: libpq/hba.c:1905 +#: libpq/hba.c:1866 #, c-format msgid "authentication option not in name=value format: %s" msgstr "opción de autentificación en formato nombre=valor: %s" -#: libpq/hba.c:1949 +#: libpq/hba.c:1910 #, c-format msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" msgstr "no se puede usar ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter o ldapurl junto con ldapprefix" -#: libpq/hba.c:1960 +#: libpq/hba.c:1921 #, c-format msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" msgstr "el método de autentificación «ldap» requiere que los argumento «ldapbasedn», «ldapprefix» o «ldapsuffix» estén definidos" -#: libpq/hba.c:1976 +#: libpq/hba.c:1937 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "no se puede usar ldapsearchattribute junto con ldapsearchfilter" -#: libpq/hba.c:1993 +#: libpq/hba.c:1954 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "la lista de servidores RADIUS no puede ser vacía" -#: libpq/hba.c:2004 +#: libpq/hba.c:1965 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "la lista de secretos RADIUS no puede ser vacía" -#: libpq/hba.c:2021 +#: libpq/hba.c:1982 #, c-format msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "el número de secretos RADIUS (%d) debe ser 1 o igual al número de servidores RADIUS (%d)" -#: libpq/hba.c:2037 +#: libpq/hba.c:1998 #, c-format msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "el número de puertos RADIUS (%d) debe ser 1 o igual al número de servidores RADIUS (%d)" -#: libpq/hba.c:2053 +#: libpq/hba.c:2014 #, c-format msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "el número de identificadores RADIUS (%d) debe ser 1 o igual al número de servidores RADIUS (%d)" -#: libpq/hba.c:2105 +#: libpq/hba.c:2066 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi y cert" -#: libpq/hba.c:2114 +#: libpq/hba.c:2075 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert sólo puede ser configurado en líneas «hostssl»" -#: libpq/hba.c:2131 +#: libpq/hba.c:2092 #, c-format msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "clientcert solo acepta «verify-full» cuando se emplea autentificación «cert»" -#: libpq/hba.c:2144 +#: libpq/hba.c:2105 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "valor no válido para el parámetro clientcert: «%s»" -#: libpq/hba.c:2156 +#: libpq/hba.c:2117 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "clientname solo puede ser configurado en líneas «hostssl»" -#: libpq/hba.c:2175 +#: libpq/hba.c:2136 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "valor no válido para el parámetro clientname: «%s»" -#: libpq/hba.c:2208 +#: libpq/hba.c:2169 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "no se pudo interpretar la URL LDAP «%s»: %s" -#: libpq/hba.c:2219 +#: libpq/hba.c:2180 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "esquema de URL LDAP no soportado: %s" -#: libpq/hba.c:2243 +#: libpq/hba.c:2204 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "las URLs LDAP no está soportado en esta plataforma" -#: libpq/hba.c:2261 +#: libpq/hba.c:2222 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "valor ldapscheme no válido: «%s»" -#: libpq/hba.c:2279 +#: libpq/hba.c:2240 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "número de puerto LDAP no válido: «%s»" -#: libpq/hba.c:2325 libpq/hba.c:2332 +#: libpq/hba.c:2286 libpq/hba.c:2293 msgid "gssapi and sspi" msgstr "gssapi y sspi" -#: libpq/hba.c:2341 libpq/hba.c:2350 +#: libpq/hba.c:2302 libpq/hba.c:2311 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:2372 +#: libpq/hba.c:2333 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "no se pudo interpretar la lista de servidores RADIUS «%s»" -#: libpq/hba.c:2420 +#: libpq/hba.c:2381 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "no se pudo interpretar la lista de port RADIUS «%s»" -#: libpq/hba.c:2434 +#: libpq/hba.c:2395 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "número de puerto RADIUS no válido: «%s»" -#: libpq/hba.c:2456 +#: libpq/hba.c:2417 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "no se pudo interpretar la lista de secretos RADIUS «%s»" -#: libpq/hba.c:2478 +#: libpq/hba.c:2439 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "no se pudo interpretar la lista de identificadores RADIUS «%s»" -#: libpq/hba.c:2492 +#: libpq/hba.c:2453 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "nombre de opción de autentificación desconocido: «%s»" -#: libpq/hba.c:2684 +#: libpq/hba.c:2645 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "el archivo de configuración «%s» no contiene líneas" -#: libpq/hba.c:2837 +#: libpq/hba.c:2798 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "la coincidencia de expresión regular para «%s» falló: %s" -#: libpq/hba.c:2861 +#: libpq/hba.c:2822 #, c-format msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" msgstr "la expresión regular «%s» no tiene subexpresiones según lo requiere la referencia hacia atrás en «%s»" -#: libpq/hba.c:2964 +#: libpq/hba.c:2925 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "el nombre de usuario entregado (%s) y el nombre de usuario autentificado (%s) no coinciden" -#: libpq/hba.c:2984 +#: libpq/hba.c:2945 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "no hay coincidencia en el mapa «%s» para el usuario «%s» autentificado como «%s»" -#: libpq/pqcomm.c:200 +#: libpq/pqcomm.c:211 libpq/pqcomm.c:219 libpq/pqcomm.c:250 libpq/pqcomm.c:259 +#: libpq/pqcomm.c:1648 libpq/pqcomm.c:1693 libpq/pqcomm.c:1733 +#: libpq/pqcomm.c:1777 libpq/pqcomm.c:1816 libpq/pqcomm.c:1855 +#: libpq/pqcomm.c:1891 libpq/pqcomm.c:1930 +#, c-format +msgid "%s(%s) failed: %m" +msgstr "%s(%s) falló: %m" + +#: libpq/pqcomm.c:296 #, c-format msgid "could not set socket to nonblocking mode: %m" msgstr "no se pudo establecer el socket en modo no bloqueante: %m" -#: libpq/pqcomm.c:361 +#: libpq/pqcomm.c:456 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "la ruta al socket de dominio Unix «%s» es demasiado larga (máximo %d bytes)" -#: libpq/pqcomm.c:381 +#: libpq/pqcomm.c:476 #, c-format msgid "could not translate host name \"%s\", service \"%s\" to address: %s" msgstr "no se pudo traducir el nombre de host «%s», servicio «%s» a dirección: %s" -#: libpq/pqcomm.c:385 +#: libpq/pqcomm.c:480 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "no se pudo traducir el servicio «%s» a dirección: %s" -#: libpq/pqcomm.c:412 +#: libpq/pqcomm.c:502 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "no se pudo enlazar a todas las direcciones pedidas: MAXLISTEN (%d) fue excedido" -#: libpq/pqcomm.c:421 +#: libpq/pqcomm.c:511 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:424 +#: libpq/pqcomm.c:514 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:427 +#: libpq/pqcomm.c:517 msgid "Unix" msgstr "Unix" -#: libpq/pqcomm.c:431 +#: libpq/pqcomm.c:521 #, c-format msgid "unrecognized address family %d" msgstr "la familia de direcciones %d no reconocida" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:455 +#: libpq/pqcomm.c:545 #, c-format msgid "could not create %s socket for address \"%s\": %m" msgstr "no se pudo crear el socket %s de escucha para la dirección «%s»: %m" #. translator: third %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:481 libpq/pqcomm.c:499 +#: libpq/pqcomm.c:574 libpq/pqcomm.c:592 #, c-format msgid "%s(%s) failed for %s address \"%s\": %m" msgstr "%s(%s) falló para la dirección %s «%s»: %m" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:522 +#: libpq/pqcomm.c:615 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "no se pudo enlazar a la dirección %s «%s»: %m" -#: libpq/pqcomm.c:526 +#: libpq/pqcomm.c:619 #, c-format msgid "Is another postmaster already running on port %d?" msgstr "¿Hay otro postmaster en ejecución en el puerto %d?" -#: libpq/pqcomm.c:528 +#: libpq/pqcomm.c:621 #, c-format msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." msgstr "¿Hay otro postmaster en ejecución en el puerto %d? Si no, aguarde unos segundos y reintente." #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:557 +#: libpq/pqcomm.c:650 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "no se pudo escuchar en la dirección %s «%s»: %m" -#: libpq/pqcomm.c:565 +#: libpq/pqcomm.c:658 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "escuchando en el socket Unix «%s»" #. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:570 +#: libpq/pqcomm.c:663 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "escuchando en la dirección %s «%s», port %d" -#: libpq/pqcomm.c:659 +#: libpq/pqcomm.c:753 #, c-format msgid "group \"%s\" does not exist" msgstr "no existe el grupo «%s»" -#: libpq/pqcomm.c:669 +#: libpq/pqcomm.c:763 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "no se pudo definir el grupo del archivo «%s»: %m" -#: libpq/pqcomm.c:680 +#: libpq/pqcomm.c:774 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "no se pudo definir los permisos del archivo «%s»: %m" -#: libpq/pqcomm.c:708 +#: libpq/pqcomm.c:803 #, c-format msgid "could not accept new connection: %m" msgstr "no se pudo aceptar una nueva conexión: %m" -#: libpq/pqcomm.c:748 libpq/pqcomm.c:757 libpq/pqcomm.c:789 libpq/pqcomm.c:799 -#: libpq/pqcomm.c:1624 libpq/pqcomm.c:1669 libpq/pqcomm.c:1709 -#: libpq/pqcomm.c:1753 libpq/pqcomm.c:1792 libpq/pqcomm.c:1831 -#: libpq/pqcomm.c:1867 libpq/pqcomm.c:1906 -#, c-format -msgid "%s(%s) failed: %m" -msgstr "%s(%s) falló: %m" - -#: libpq/pqcomm.c:903 +#: libpq/pqcomm.c:885 #, c-format msgid "there is no client connection" msgstr "no hay conexión de cliente" -#: libpq/pqcomm.c:954 libpq/pqcomm.c:1050 +#: libpq/pqcomm.c:941 libpq/pqcomm.c:1042 #, c-format msgid "could not receive data from client: %m" msgstr "no se pudo recibir datos del cliente: %m" -#: libpq/pqcomm.c:1155 tcop/postgres.c:4403 +#: libpq/pqcomm.c:1149 tcop/postgres.c:4533 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "terminando la conexión por pérdida de sincronía del protocolo" -#: libpq/pqcomm.c:1221 +#: libpq/pqcomm.c:1215 #, c-format msgid "unexpected EOF within message length word" msgstr "EOF inesperado dentro de la palabra de tamaño del mensaje" -#: libpq/pqcomm.c:1231 +#: libpq/pqcomm.c:1225 #, c-format msgid "invalid message length" msgstr "el largo de mensaje no es válido" -#: libpq/pqcomm.c:1253 libpq/pqcomm.c:1266 +#: libpq/pqcomm.c:1247 libpq/pqcomm.c:1260 #, c-format msgid "incomplete message from client" msgstr "mensaje incompleto del cliente" -#: libpq/pqcomm.c:1377 +#: libpq/pqcomm.c:1401 #, c-format msgid "could not send data to client: %m" msgstr "no se pudo enviar datos al cliente: %m" -#: libpq/pqcomm.c:1592 +#: libpq/pqcomm.c:1616 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s) falló: código de error %d" -#: libpq/pqcomm.c:1681 +#: libpq/pqcomm.c:1705 #, c-format msgid "setting the keepalive idle time is not supported" msgstr "establecer el tiempo de inactividad para keepalive no está soportado" -#: libpq/pqcomm.c:1765 libpq/pqcomm.c:1840 libpq/pqcomm.c:1915 +#: libpq/pqcomm.c:1789 libpq/pqcomm.c:1864 libpq/pqcomm.c:1939 #, c-format msgid "%s(%s) not supported" msgstr "%s(%s) no está soportado" -#: libpq/pqformat.c:407 +#: libpq/pqformat.c:404 #, c-format msgid "no data left in message" msgstr "no hay datos restantes en el mensaje" -#: libpq/pqformat.c:518 libpq/pqformat.c:536 libpq/pqformat.c:557 -#: utils/adt/array_userfuncs.c:799 utils/adt/arrayfuncs.c:1506 -#: utils/adt/rowtypes.c:615 +#: libpq/pqformat.c:515 libpq/pqformat.c:533 libpq/pqformat.c:554 +#: utils/adt/array_userfuncs.c:797 utils/adt/arrayfuncs.c:1481 +#: utils/adt/rowtypes.c:613 #, c-format msgid "insufficient data left in message" msgstr "los datos restantes del mensaje son insuficientes" -#: libpq/pqformat.c:598 libpq/pqformat.c:627 +#: libpq/pqformat.c:595 libpq/pqformat.c:624 #, c-format msgid "invalid string in message" msgstr "cadena no válida en el mensaje" -#: libpq/pqformat.c:643 +#: libpq/pqformat.c:640 #, c-format msgid "invalid message format" msgstr "formato de mensaje no válido" -#: main/main.c:235 +#: main/main.c:236 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: WSAStartup falló: %d\n" -#: main/main.c:329 +#: main/main.c:324 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -15778,7 +16028,7 @@ msgstr "" "%s es el servidor PostgreSQL.\n" "\n" -#: main/main.c:330 +#: main/main.c:325 #, c-format msgid "" "Usage:\n" @@ -15789,110 +16039,109 @@ msgstr "" " %s [OPCION]...\n" "\n" -#: main/main.c:331 +#: main/main.c:326 #, c-format msgid "Options:\n" msgstr "Opciones:\n" -#: main/main.c:332 +#: main/main.c:327 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS número de búfers de memoria compartida\n" -#: main/main.c:333 +#: main/main.c:328 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c VAR=VALOR definir parámetro de ejecución\n" -#: main/main.c:334 +#: main/main.c:329 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C NOMBRE imprimir valor de parámetro de configuración, luego salir\n" -#: main/main.c:335 +#: main/main.c:330 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 nivel de depuración\n" -#: main/main.c:336 +#: main/main.c:331 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D DATADIR directorio de bases de datos\n" -#: main/main.c:337 +#: main/main.c:332 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e usar estilo europeo de fechas (DMY)\n" -#: main/main.c:338 +#: main/main.c:333 #, c-format msgid " -F turn fsync off\n" msgstr " -F desactivar fsync\n" -#: main/main.c:339 +#: main/main.c:334 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h NOMBRE nombre de host o dirección IP en que escuchar\n" -#: main/main.c:340 -#, fuzzy, c-format -#| msgid " -i enable TCP/IP connections\n" +#: main/main.c:335 +#, c-format msgid " -i enable TCP/IP connections (deprecated)\n" -msgstr " -i activar conexiones TCP/IP\n" +msgstr " -i activar conexiones TCP/IP (obsoleto)\n" -#: main/main.c:341 +#: main/main.c:336 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k DIRECTORIO ubicación del socket Unix\n" -#: main/main.c:343 +#: main/main.c:338 #, c-format msgid " -l enable SSL connections\n" msgstr " -l activar conexiones SSL\n" -#: main/main.c:345 +#: main/main.c:340 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N MAX-CONN número máximo de conexiones permitidas\n" -#: main/main.c:346 +#: main/main.c:341 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PUERTO número de puerto en el cual escuchar\n" -#: main/main.c:347 +#: main/main.c:342 #, c-format msgid " -s show statistics after each query\n" msgstr " -s mostrar estadísticas después de cada consulta\n" -#: main/main.c:348 +#: main/main.c:343 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S WORK-MEM definir cantidad de memoria para ordenamientos (en kB)\n" -#: main/main.c:349 +#: main/main.c:344 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de la versión, luego salir\n" -#: main/main.c:350 +#: main/main.c:345 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NOMBRE=VALOR definir parámetro de ejecución\n" -#: main/main.c:351 +#: main/main.c:346 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr "" " --describe-config\n" " mostrar parámetros de configuración y salir\n" -#: main/main.c:352 +#: main/main.c:347 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help muestra esta ayuda, luego sale\n" -#: main/main.c:354 +#: main/main.c:349 #, c-format msgid "" "\n" @@ -15901,40 +16150,37 @@ msgstr "" "\n" "Opciones de desarrollador:\n" -#: main/main.c:355 +#: main/main.c:350 #, c-format msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" -msgstr "" +msgstr " -f s|i|o|b|t|n|m|h impedir el uso de algunos tipos de planes\n" -#: main/main.c:356 +#: main/main.c:351 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O permitir cambios en estructura de tablas de sistema\n" -#: main/main.c:357 +#: main/main.c:352 #, c-format msgid " -P disable system indexes\n" msgstr " -P desactivar índices de sistema\n" -#: main/main.c:358 +#: main/main.c:353 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex mostrar tiempos después de cada consulta\n" -#: main/main.c:359 -#, fuzzy, c-format -#| msgid " -T send SIGSTOP to all backend processes if one dies\n" +#: main/main.c:354 +#, c-format msgid " -T send SIGABRT to all backend processes if one dies\n" -msgstr "" -" -T enviar SIGSTOP a todos los procesos backend si uno de ellos\n" -" muere\n" +msgstr " -T enviar SIGABRT a todos los procesos backend si uno muere\n" -#: main/main.c:360 +#: main/main.c:355 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr " -W NÚM espera NÚM segundos para permitir acoplar un depurador\n" -#: main/main.c:362 +#: main/main.c:357 #, c-format msgid "" "\n" @@ -15943,37 +16189,37 @@ msgstr "" "\n" "Opciones para modo mono-usuario:\n" -#: main/main.c:363 +#: main/main.c:358 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr " --single selecciona modo mono-usuario (debe ser el primer argumento)\n" -#: main/main.c:364 +#: main/main.c:359 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME nombre de base de datos (el valor por omisión es el nombre de usuario)\n" -#: main/main.c:365 +#: main/main.c:360 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 nivel de depuración\n" -#: main/main.c:366 +#: main/main.c:361 #, c-format msgid " -E echo statement before execution\n" msgstr " -E mostrar las consultas antes de su ejecución\n" -#: main/main.c:367 +#: main/main.c:362 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr " -j no usar saltos de línea como delimitadores de consulta\n" -#: main/main.c:368 main/main.c:374 +#: main/main.c:363 main/main.c:369 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r ARCHIVO enviar salida estándar y de error a ARCHIVO\n" -#: main/main.c:370 +#: main/main.c:365 #, c-format msgid "" "\n" @@ -15982,23 +16228,22 @@ msgstr "" "\n" "Opciones para modo de inicio (bootstrapping):\n" -#: main/main.c:371 +#: main/main.c:366 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot selecciona modo de inicio (debe ser el primer argumento)\n" -#: main/main.c:372 -#, fuzzy, c-format -#| msgid " --single selects single-user mode (must be first argument)\n" +#: main/main.c:367 +#, c-format msgid " --check selects check mode (must be first argument)\n" -msgstr " --single selecciona modo mono-usuario (debe ser el primer argumento)\n" +msgstr " --check selecciona modo de verificación (debe ser el primer argumento)\n" -#: main/main.c:373 +#: main/main.c:368 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr " DBNAME nombre de base de datos (argumento obligatorio en modo de inicio)\n" -#: main/main.c:376 +#: main/main.c:371 #, c-format msgid "" "\n" @@ -16015,12 +16260,12 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: main/main.c:380 +#: main/main.c:375 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: main/main.c:391 +#: main/main.c:386 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -16034,12 +16279,12 @@ msgstr "" "Vea la documentación para obtener más información acerca de cómo\n" "iniciar correctamente el servidor.\n" -#: main/main.c:408 +#: main/main.c:403 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: los IDs de usuario real y efectivo deben coincidir\n" -#: main/main.c:415 +#: main/main.c:410 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -16064,21 +16309,15 @@ msgstr "el tipo de nodo extensible «%s» ya existe" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods «%s» no fue registrado" -#: nodes/makefuncs.c:153 statistics/extended_stats.c:2335 +#: nodes/makefuncs.c:152 statistics/extended_stats.c:2310 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "la relación «%s» no tiene un tipo compuesto" -#: nodes/makefuncs.c:878 -#, fuzzy, c-format -#| msgid "unrecognized encoding: \"%s\"" -msgid "unrecognized JSON encoding: %s" -msgstr "no se reconoce la codificación: «%s»" - -#: nodes/nodeFuncs.c:116 nodes/nodeFuncs.c:147 parser/parse_coerce.c:2567 -#: parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 -#: parser/parse_expr.c:2042 parser/parse_func.c:710 parser/parse_oper.c:883 -#: utils/fmgr/funcapi.c:661 +#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2604 +#: parser/parse_coerce.c:2742 parser/parse_coerce.c:2789 +#: parser/parse_expr.c:2112 parser/parse_func.c:710 parser/parse_oper.c:869 +#: utils/fmgr/funcapi.c:669 #, c-format msgid "could not find array type for data type %s" msgstr "no se pudo encontrar un tipo de array para el tipo de dato %s" @@ -16093,938 +16332,936 @@ msgstr "portal «%s» con parámetros: %s" msgid "unnamed portal with parameters: %s" msgstr "portal sin nombre con parámetros: %s" -#: optimizer/path/joinrels.c:865 +#: optimizer/path/joinrels.c:972 #, c-format msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN sólo está soportado con condiciones que se pueden usar con merge join o hash join" -#: optimizer/plan/createplan.c:7111 parser/parse_merge.c:182 -#: parser/parse_merge.c:189 -#, fuzzy, c-format -#| msgid "cannot change relation \"%s\"" +#: optimizer/plan/createplan.c:7175 parser/parse_merge.c:203 +#: rewrite/rewriteHandler.c:1680 +#, c-format msgid "cannot execute MERGE on relation \"%s\"" -msgstr "no se puede cambiar la relación «%s»" +msgstr "no se puede ejecutar MERGE en la relación «%s»" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1392 +#: optimizer/plan/initsplan.c:1407 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s no puede ser aplicado al lado nulable de un outer join" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1359 parser/analyze.c:1723 parser/analyze.c:1980 -#: parser/analyze.c:3193 +#: optimizer/plan/planner.c:1380 parser/analyze.c:1771 parser/analyze.c:2029 +#: parser/analyze.c:3247 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s no está permitido con UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:2080 optimizer/plan/planner.c:4038 +#: optimizer/plan/planner.c:2121 optimizer/plan/planner.c:4108 #, c-format msgid "could not implement GROUP BY" msgstr "no se pudo implementar GROUP BY" -#: optimizer/plan/planner.c:2081 optimizer/plan/planner.c:4039 -#: optimizer/plan/planner.c:4679 optimizer/prep/prepunion.c:1053 +#: optimizer/plan/planner.c:2122 optimizer/plan/planner.c:4109 +#: optimizer/plan/planner.c:4790 optimizer/prep/prepunion.c:1320 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "Algunos de los tipos sólo soportan hashing, mientras que otros sólo soportan ordenamiento." -#: optimizer/plan/planner.c:4678 +#: optimizer/plan/planner.c:4789 #, c-format msgid "could not implement DISTINCT" msgstr "no se pudo implementar DISTINCT" -#: optimizer/plan/planner.c:6017 +#: optimizer/plan/planner.c:6134 #, c-format msgid "could not implement window PARTITION BY" msgstr "No se pudo implementar PARTITION BY de ventana" -#: optimizer/plan/planner.c:6018 +#: optimizer/plan/planner.c:6135 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Las columnas de particionamiento de ventana deben de tipos que se puedan ordenar." -#: optimizer/plan/planner.c:6022 +#: optimizer/plan/planner.c:6139 #, c-format msgid "could not implement window ORDER BY" msgstr "no se pudo implementar ORDER BY de ventana" -#: optimizer/plan/planner.c:6023 +#: optimizer/plan/planner.c:6140 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Las columnas de ordenamiento de ventana debe ser de tipos que se puedan ordenar." -#: optimizer/prep/prepunion.c:516 +#: optimizer/prep/prepunion.c:467 #, c-format msgid "could not implement recursive UNION" msgstr "no se pudo implementar UNION recursivo" -#: optimizer/prep/prepunion.c:517 +#: optimizer/prep/prepunion.c:468 #, c-format msgid "All column datatypes must be hashable." msgstr "Todos los tipos de dato de las columnas deben ser tipos de los que se puedan hacer un hash." #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1052 +#: optimizer/prep/prepunion.c:1319 #, c-format msgid "could not implement %s" msgstr "no se pudo implementar %s" -#: optimizer/util/clauses.c:4844 +#: optimizer/util/clauses.c:4963 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "función SQL «%s», durante expansión en línea" -#: optimizer/util/plancat.c:154 +#: optimizer/util/plancat.c:153 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "no se puede acceder a tablas temporales o «unlogged» durante la recuperación" -#: optimizer/util/plancat.c:726 +#: optimizer/util/plancat.c:768 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "no están soportadas las especificaciones de inferencia de índice único de registro completo" -#: optimizer/util/plancat.c:743 +#: optimizer/util/plancat.c:785 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "la restricción en la cláusula ON CONFLICT no tiene un índice asociado" -#: optimizer/util/plancat.c:793 +#: optimizer/util/plancat.c:835 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE no está soportado con restricciones de exclusión" -#: optimizer/util/plancat.c:898 +#: optimizer/util/plancat.c:945 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "no hay restricción única o de exclusión que coincida con la especificación ON CONFLICT" -#: parser/analyze.c:788 parser/analyze.c:1502 +#: parser/analyze.c:824 parser/analyze.c:1550 #, c-format msgid "VALUES lists must all be the same length" msgstr "las listas VALUES deben ser todas de la misma longitud" -#: parser/analyze.c:990 +#: parser/analyze.c:1027 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT tiene más expresiones que columnas de destino" -#: parser/analyze.c:1008 +#: parser/analyze.c:1045 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT tiene más columnas de destino que expresiones" -#: parser/analyze.c:1012 +#: parser/analyze.c:1049 #, c-format msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" msgstr "La fuente de inserción es una expresión de fila que contiene la misma cantidad de columnas que esperaba el INSERT. ¿Usó accidentalmente paréntesis extra?" -#: parser/analyze.c:1309 parser/analyze.c:1696 +#: parser/analyze.c:1357 parser/analyze.c:1744 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO no está permitido aquí" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1625 parser/analyze.c:3425 +#: parser/analyze.c:1673 parser/analyze.c:3479 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s no puede ser aplicado a VALUES" -#: parser/analyze.c:1862 +#: parser/analyze.c:1911 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "cláusula UNION/INTERSECT/EXCEPT ORDER BY no válida" -#: parser/analyze.c:1863 +#: parser/analyze.c:1912 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "Sólo nombres de columna del resultado pueden usarse, no expresiones o funciones." -#: parser/analyze.c:1864 +#: parser/analyze.c:1913 #, c-format msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." msgstr "Agregue la función o expresión a todos los SELECT, o mueva el UNION dentro de una cláusula FROM." -#: parser/analyze.c:1970 +#: parser/analyze.c:2019 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "sólo se permite INTO en el primer SELECT de UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:2042 +#: parser/analyze.c:2091 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "una sentencia miembro de UNION/INSERT/EXCEPT no puede referirse a otras relaciones del mismo nivel de la consulta" -#: parser/analyze.c:2129 +#: parser/analyze.c:2178 #, c-format msgid "each %s query must have the same number of columns" msgstr "cada consulta %s debe tener el mismo número de columnas" #: parser/analyze.c:2535 #, c-format +msgid "SET target columns cannot be qualified with the relation name." +msgstr "Las columnas de destino SET no pueden ser calificadas con el nombre de relación." + +#: parser/analyze.c:2589 +#, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING debe tener al menos una columna" -#: parser/analyze.c:2638 +#: parser/analyze.c:2692 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" msgstr[0] "fuente de asignación retornó %d columna" msgstr[1] "fuente de asignación retornó %d columnas" -#: parser/analyze.c:2699 +#: parser/analyze.c:2753 #, c-format msgid "variable \"%s\" is of type %s but expression is of type %s" msgstr "la variable «%s» es de tipo %s pero la expresión es de tipo %s" #. translator: %s is a SQL keyword -#: parser/analyze.c:2824 parser/analyze.c:2832 +#: parser/analyze.c:2878 parser/analyze.c:2886 #, c-format msgid "cannot specify both %s and %s" msgstr "no se puede especificar %s junto con %s" -#: parser/analyze.c:2852 +#: parser/analyze.c:2906 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR no debe contener sentencias que modifiquen datos en WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2860 +#: parser/analyze.c:2914 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s no está soportado" -#: parser/analyze.c:2863 +#: parser/analyze.c:2917 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "Los cursores declarados HOLD deben ser READ ONLY." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2871 +#: parser/analyze.c:2925 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s no está soportado" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2882 +#: parser/analyze.c:2936 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s no es válido" -#: parser/analyze.c:2885 +#: parser/analyze.c:2939 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Los cursores insensitivos deben ser READ ONLY." -#: parser/analyze.c:2979 +#: parser/analyze.c:3033 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "las vistas materializadas no deben usar sentencias que modifiquen datos en WITH" -#: parser/analyze.c:2989 +#: parser/analyze.c:3043 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "las vistas materializadas no deben usar tablas temporales o vistas" -#: parser/analyze.c:2999 +#: parser/analyze.c:3053 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "las vistas materializadas no pueden definirse usando parámetros enlazados" -#: parser/analyze.c:3011 +#: parser/analyze.c:3065 #, c-format msgid "materialized views cannot be unlogged" msgstr "las vistas materializadas no pueden ser «unlogged»" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3200 +#: parser/analyze.c:3254 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s no está permitido con cláusulas DISTINCT" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3207 +#: parser/analyze.c:3261 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s no está permitido con cláusulas GROUP BY" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3214 +#: parser/analyze.c:3268 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s no está permitido con cláusulas HAVING" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3221 +#: parser/analyze.c:3275 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s no está permitido con funciones de agregación" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3228 +#: parser/analyze.c:3282 #, c-format msgid "%s is not allowed with window functions" msgstr "%s no está permitido con funciones de ventana deslizante" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3235 +#: parser/analyze.c:3289 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "%s no está permitido con funciones que retornan conjuntos en la lista de resultados" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3334 +#: parser/analyze.c:3388 #, c-format msgid "%s must specify unqualified relation names" msgstr "%s debe especificar nombres de relaciones sin calificar" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3398 +#: parser/analyze.c:3452 #, c-format msgid "%s cannot be applied to a join" msgstr "%s no puede ser aplicado a un join" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3407 +#: parser/analyze.c:3461 #, c-format msgid "%s cannot be applied to a function" msgstr "%s no puede ser aplicado a una función" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3416 +#: parser/analyze.c:3470 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s no puede ser aplicado a una función de tabla" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3434 +#: parser/analyze.c:3488 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s no puede ser aplicado a una consulta WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3443 +#: parser/analyze.c:3497 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s no puede ser aplicado a un «tuplestore» con nombre" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3463 +#: parser/analyze.c:3517 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "la relación «%s» en la cláusula %s no fue encontrada en la cláusula FROM" -#: parser/parse_agg.c:221 parser/parse_oper.c:227 +#: parser/parse_agg.c:210 parser/parse_oper.c:215 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "no se pudo identificar un operador de ordenamiento para el tipo %s" -#: parser/parse_agg.c:223 +#: parser/parse_agg.c:212 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "Las funciones de agregación con DISTINCT deben ser capaces de ordenar sus valores de entrada." -#: parser/parse_agg.c:258 +#: parser/parse_agg.c:270 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "GROUPING debe tener menos de 32 argumentos" -#: parser/parse_agg.c:361 +#: parser/parse_agg.c:373 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "no se permiten funciones de agregación en las condiciones de JOIN" -#: parser/parse_agg.c:363 +#: parser/parse_agg.c:375 msgid "grouping operations are not allowed in JOIN conditions" msgstr "no se permiten las operaciones «grouping» en condiciones JOIN" -#: parser/parse_agg.c:375 +#: parser/parse_agg.c:385 msgid "aggregate functions are not allowed in FROM clause of their own query level" msgstr "las funciones de agregación no están permitidas en la cláusula FROM de su mismo nivel de consulta" -#: parser/parse_agg.c:377 +#: parser/parse_agg.c:387 msgid "grouping operations are not allowed in FROM clause of their own query level" msgstr "las operaciones «grouping» no están permitidas en la cláusula FROM de su mismo nivel de consulta" -#: parser/parse_agg.c:382 +#: parser/parse_agg.c:392 msgid "aggregate functions are not allowed in functions in FROM" msgstr "no se permiten funciones de agregación en una función en FROM" -#: parser/parse_agg.c:384 +#: parser/parse_agg.c:394 msgid "grouping operations are not allowed in functions in FROM" msgstr "no se permiten operaciones «grouping» en funciones en FROM" -#: parser/parse_agg.c:392 +#: parser/parse_agg.c:402 msgid "aggregate functions are not allowed in policy expressions" msgstr "no se permiten funciones de agregación en expresiones de políticas" -#: parser/parse_agg.c:394 +#: parser/parse_agg.c:404 msgid "grouping operations are not allowed in policy expressions" msgstr "no se permiten operaciones «grouping» en expresiones de políticas" -#: parser/parse_agg.c:411 +#: parser/parse_agg.c:421 msgid "aggregate functions are not allowed in window RANGE" msgstr "no se permiten funciones de agregación en RANGE de ventana deslizante" -#: parser/parse_agg.c:413 +#: parser/parse_agg.c:423 msgid "grouping operations are not allowed in window RANGE" msgstr "no se permiten operaciones «grouping» en RANGE de ventana deslizante" -#: parser/parse_agg.c:418 +#: parser/parse_agg.c:428 msgid "aggregate functions are not allowed in window ROWS" msgstr "no se permiten funciones de agregación en ROWS de ventana deslizante" -#: parser/parse_agg.c:420 +#: parser/parse_agg.c:430 msgid "grouping operations are not allowed in window ROWS" msgstr "no se permiten operaciones «grouping» en ROWS de ventana deslizante" -#: parser/parse_agg.c:425 +#: parser/parse_agg.c:435 msgid "aggregate functions are not allowed in window GROUPS" msgstr "no se permiten funciones de agregación en GROUPS de ventana deslizante" -#: parser/parse_agg.c:427 +#: parser/parse_agg.c:437 msgid "grouping operations are not allowed in window GROUPS" msgstr "no se permiten operaciones «grouping» en GROUPS de ventana deslizante" -#: parser/parse_agg.c:440 -#, fuzzy -#| msgid "aggregate functions are not allowed in trigger WHEN conditions" +#: parser/parse_agg.c:450 msgid "aggregate functions are not allowed in MERGE WHEN conditions" -msgstr "no se permiten funciones de agregación en condición WHEN de un disparador" +msgstr "no se permiten funciones de agregación en condiciones MERGE WHEN" -#: parser/parse_agg.c:442 -#, fuzzy -#| msgid "grouping operations are not allowed in trigger WHEN conditions" +#: parser/parse_agg.c:452 msgid "grouping operations are not allowed in MERGE WHEN conditions" -msgstr "no se permiten operaciones «grouping» en condiciones WHEN de un disparador" +msgstr "no se permiten operaciones «grouping» en condiciones MERGE WHEN" -#: parser/parse_agg.c:468 +#: parser/parse_agg.c:479 msgid "aggregate functions are not allowed in check constraints" msgstr "no se permiten funciones de agregación en restricciones «check»" -#: parser/parse_agg.c:470 +#: parser/parse_agg.c:481 msgid "grouping operations are not allowed in check constraints" msgstr "no se permiten operaciones «grouping» en restricciones «check»" -#: parser/parse_agg.c:477 +#: parser/parse_agg.c:488 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "no se permiten funciones de agregación en expresiones DEFAULT" -#: parser/parse_agg.c:479 +#: parser/parse_agg.c:490 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "no se permiten operaciones «grouping» en expresiones DEFAULT" -#: parser/parse_agg.c:484 +#: parser/parse_agg.c:495 msgid "aggregate functions are not allowed in index expressions" msgstr "no se permiten funciones de agregación en una expresión de índice" -#: parser/parse_agg.c:486 +#: parser/parse_agg.c:497 msgid "grouping operations are not allowed in index expressions" msgstr "no se permiten operaciones «grouping» en expresiones de índice" -#: parser/parse_agg.c:491 +#: parser/parse_agg.c:502 msgid "aggregate functions are not allowed in index predicates" msgstr "no se permiten funciones de agregación en predicados de índice" -#: parser/parse_agg.c:493 +#: parser/parse_agg.c:504 msgid "grouping operations are not allowed in index predicates" msgstr "no se permiten operaciones «grouping» en predicados de índice" -#: parser/parse_agg.c:498 +#: parser/parse_agg.c:509 msgid "aggregate functions are not allowed in statistics expressions" msgstr "no se permiten funciones de agregación en expresiones de estadísticas" -#: parser/parse_agg.c:500 +#: parser/parse_agg.c:511 msgid "grouping operations are not allowed in statistics expressions" msgstr "no se permiten operaciones «grouping» en expresiones de estadísticas" -#: parser/parse_agg.c:505 +#: parser/parse_agg.c:516 msgid "aggregate functions are not allowed in transform expressions" msgstr "no se permiten funciones de agregación en una expresión de transformación" -#: parser/parse_agg.c:507 +#: parser/parse_agg.c:518 msgid "grouping operations are not allowed in transform expressions" msgstr "no se permiten operaciones «grouping» en expresiones de transformación" -#: parser/parse_agg.c:512 +#: parser/parse_agg.c:523 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "no se permiten funciones de agregación en un parámetro a EXECUTE" -#: parser/parse_agg.c:514 +#: parser/parse_agg.c:525 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "no se permiten operaciones «grouping» en parámetros a EXECUTE" -#: parser/parse_agg.c:519 +#: parser/parse_agg.c:530 msgid "aggregate functions are not allowed in trigger WHEN conditions" -msgstr "no se permiten funciones de agregación en condición WHEN de un disparador" +msgstr "no se permiten funciones de agregación en condición WHEN de un “triggerâ€" -#: parser/parse_agg.c:521 +#: parser/parse_agg.c:532 msgid "grouping operations are not allowed in trigger WHEN conditions" -msgstr "no se permiten operaciones «grouping» en condiciones WHEN de un disparador" +msgstr "no se permiten operaciones «grouping» en condiciones WHEN de un “triggerâ€" -#: parser/parse_agg.c:526 +#: parser/parse_agg.c:537 msgid "aggregate functions are not allowed in partition bound" msgstr "no se permiten funciones de agregación en borde de partición" -#: parser/parse_agg.c:528 +#: parser/parse_agg.c:539 msgid "grouping operations are not allowed in partition bound" msgstr "no se permiten operaciones «grouping» en borde de partición" -#: parser/parse_agg.c:533 +#: parser/parse_agg.c:544 msgid "aggregate functions are not allowed in partition key expressions" msgstr "no se permiten funciones de agregación en una expresión de llave de particionamiento" -#: parser/parse_agg.c:535 +#: parser/parse_agg.c:546 msgid "grouping operations are not allowed in partition key expressions" msgstr "no se permiten operaciones «grouping» en expresiones de llave de particionamiento" -#: parser/parse_agg.c:541 +#: parser/parse_agg.c:552 msgid "aggregate functions are not allowed in column generation expressions" msgstr "no se permiten funciones de agregación en expresiones de generación de columna" -#: parser/parse_agg.c:543 +#: parser/parse_agg.c:554 msgid "grouping operations are not allowed in column generation expressions" msgstr "no se permiten operaciones «grouping» en expresiones de generación de columna" -#: parser/parse_agg.c:549 +#: parser/parse_agg.c:560 msgid "aggregate functions are not allowed in CALL arguments" msgstr "no se permiten funciones de agregación en argumentos de CALL" -#: parser/parse_agg.c:551 +#: parser/parse_agg.c:562 msgid "grouping operations are not allowed in CALL arguments" msgstr "no se permiten operaciones «grouping» en argumentos de CALL" -#: parser/parse_agg.c:557 +#: parser/parse_agg.c:568 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "no se permiten funciones de agregación en las condiciones WHERE de COPY FROM" -#: parser/parse_agg.c:559 +#: parser/parse_agg.c:570 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "no se permiten las operaciones «grouping» en condiciones WHERE de COPY FROM" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:586 parser/parse_clause.c:1955 +#: parser/parse_agg.c:597 parser/parse_clause.c:1962 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "no se permiten funciones de agregación en %s" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:589 +#: parser/parse_agg.c:600 #, c-format msgid "grouping operations are not allowed in %s" msgstr "no se permiten operaciones «grouping» en %s" -#: parser/parse_agg.c:690 +#: parser/parse_agg.c:701 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "una función de agregación de nivel exterior no puede contener una variable de nivel inferior en sus argumentos directos" -#: parser/parse_agg.c:768 +#: parser/parse_agg.c:779 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "las llamadas a funciones de agregación no pueden contener llamadas a funciones que retornan conjuntos" -#: parser/parse_agg.c:769 parser/parse_expr.c:1693 parser/parse_expr.c:2175 -#: parser/parse_func.c:884 +#: parser/parse_agg.c:780 parser/parse_expr.c:1762 parser/parse_expr.c:2245 +#: parser/parse_func.c:885 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." msgstr "Puede intentar mover la función que retorna conjuntos a un elemento LATERAL FROM." -#: parser/parse_agg.c:774 +#: parser/parse_agg.c:785 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "las llamadas a funciones de agregación no pueden contener llamadas a funciones de ventana deslizante" -#: parser/parse_agg.c:853 +#: parser/parse_agg.c:864 msgid "window functions are not allowed in JOIN conditions" msgstr "no se permiten funciones de ventana deslizante en condiciones JOIN" -#: parser/parse_agg.c:860 +#: parser/parse_agg.c:871 msgid "window functions are not allowed in functions in FROM" msgstr "no se permiten funciones de ventana deslizante en funciones en FROM" -#: parser/parse_agg.c:866 +#: parser/parse_agg.c:877 msgid "window functions are not allowed in policy expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones de políticas" -#: parser/parse_agg.c:879 +#: parser/parse_agg.c:890 msgid "window functions are not allowed in window definitions" msgstr "no se permiten funciones de ventana deslizante en definiciones de ventana deslizante" -#: parser/parse_agg.c:890 -#, fuzzy -#| msgid "window functions are not allowed in trigger WHEN conditions" +#: parser/parse_agg.c:901 msgid "window functions are not allowed in MERGE WHEN conditions" -msgstr "no se permiten funciones de ventana deslizante en condiciones WHEN de un disparador" +msgstr "no se permiten funciones de ventana deslizante en condiciones MERGE WHEN" -#: parser/parse_agg.c:914 +#: parser/parse_agg.c:926 msgid "window functions are not allowed in check constraints" msgstr "no se permiten funciones de ventana deslizante en restricciones «check»" -#: parser/parse_agg.c:918 +#: parser/parse_agg.c:930 msgid "window functions are not allowed in DEFAULT expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones DEFAULT" -#: parser/parse_agg.c:921 +#: parser/parse_agg.c:933 msgid "window functions are not allowed in index expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones de índice" -#: parser/parse_agg.c:924 +#: parser/parse_agg.c:936 msgid "window functions are not allowed in statistics expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones de estadísticas" -#: parser/parse_agg.c:927 +#: parser/parse_agg.c:939 msgid "window functions are not allowed in index predicates" msgstr "no se permiten funciones de ventana deslizante en predicados de índice" -#: parser/parse_agg.c:930 +#: parser/parse_agg.c:942 msgid "window functions are not allowed in transform expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones de transformación" -#: parser/parse_agg.c:933 +#: parser/parse_agg.c:945 msgid "window functions are not allowed in EXECUTE parameters" msgstr "no se permiten funciones de ventana deslizante en parámetros a EXECUTE" -#: parser/parse_agg.c:936 +#: parser/parse_agg.c:948 msgid "window functions are not allowed in trigger WHEN conditions" -msgstr "no se permiten funciones de ventana deslizante en condiciones WHEN de un disparador" +msgstr "no se permiten funciones de ventana deslizante en condiciones WHEN de un “triggerâ€" -#: parser/parse_agg.c:939 +#: parser/parse_agg.c:951 msgid "window functions are not allowed in partition bound" msgstr "no se permiten funciones de ventana deslizante en borde de partición" -#: parser/parse_agg.c:942 +#: parser/parse_agg.c:954 msgid "window functions are not allowed in partition key expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones de llave de particionamiento" -#: parser/parse_agg.c:945 +#: parser/parse_agg.c:957 msgid "window functions are not allowed in CALL arguments" msgstr "no se permiten funciones de ventana deslizante en argumentos de CALL" -#: parser/parse_agg.c:948 +#: parser/parse_agg.c:960 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "no se permiten funciones de ventana deslizante en las condiciones WHERE de COPY FROM" -#: parser/parse_agg.c:951 +#: parser/parse_agg.c:963 msgid "window functions are not allowed in column generation expressions" msgstr "no se permiten funciones de ventana deslizante en expresiones de generación de columna" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:974 parser/parse_clause.c:1964 +#: parser/parse_agg.c:986 parser/parse_clause.c:1971 #, c-format msgid "window functions are not allowed in %s" msgstr "no se permiten funciones de ventana deslizante en %s" -#: parser/parse_agg.c:1008 parser/parse_clause.c:2797 +#: parser/parse_agg.c:1020 parser/parse_clause.c:2804 #, c-format msgid "window \"%s\" does not exist" msgstr "la ventana «%s» no existe" -#: parser/parse_agg.c:1096 +#: parser/parse_agg.c:1108 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "demasiados conjuntos «grouping» presentes (máximo 4096)" -#: parser/parse_agg.c:1236 +#: parser/parse_agg.c:1248 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "no se permiten funciones de agregación en el término recursivo de una consulta recursiva" -#: parser/parse_agg.c:1429 +#: parser/parse_agg.c:1441 #, c-format msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" msgstr "la columna «%s.%s» debe aparecer en la cláusula GROUP BY o ser usada en una función de agregación" -#: parser/parse_agg.c:1432 +#: parser/parse_agg.c:1444 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "Argumentos directos de una función de agregación de conjuntos ordenados debe usar sólo columnas agrupadas." -#: parser/parse_agg.c:1437 +#: parser/parse_agg.c:1449 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "la subconsulta usa la columna «%s.%s» no agrupada de una consulta exterior" -#: parser/parse_agg.c:1601 +#: parser/parse_agg.c:1613 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "los argumentos de GROUPING deben ser expresiones agrupantes del nivel de consulta asociado" -#: parser/parse_clause.c:195 +#: parser/parse_clause.c:193 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "relación «%s» no puede ser destino de una sentencia modificadora" -#: parser/parse_clause.c:571 parser/parse_clause.c:599 parser/parse_func.c:2552 +#: parser/parse_clause.c:569 parser/parse_clause.c:597 parser/parse_func.c:2553 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "las funciones que retornan conjuntos deben aparecer en el nivel más externo del FROM" -#: parser/parse_clause.c:611 +#: parser/parse_clause.c:609 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "no se permiten múltiples definiciones de columnas para la misma función" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:642 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "ROWS FROM() con varias funciones no puede tener una lista de definición de columnas" -#: parser/parse_clause.c:645 +#: parser/parse_clause.c:643 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "Ponga una lista de columnas separada para cada función dentro de ROWS FROM()." -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:649 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "UNNEST() con varios argumentos no puede tener una lista de definición de columnas" -#: parser/parse_clause.c:652 +#: parser/parse_clause.c:650 #, c-format msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." msgstr "Use llamadas a UNNEST() separadas dentro de ROWS FROM() y adjunte una lista de columnas a cada una." -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:657 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY no puede usarse con una lista de definición de columnas" -#: parser/parse_clause.c:660 +#: parser/parse_clause.c:658 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "Ponga una lista de columnas dentro de ROWS FROM()." -#: parser/parse_clause.c:760 +#: parser/parse_clause.c:762 parser/parse_jsontable.c:295 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "sólo se permite una columna FOR ORDINALITY" -#: parser/parse_clause.c:821 +#: parser/parse_clause.c:823 #, c-format msgid "column name \"%s\" is not unique" msgstr "el nombre de columna «%s» no es único" -#: parser/parse_clause.c:863 +#: parser/parse_clause.c:865 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "el espacio de nombres «%s» no es único" -#: parser/parse_clause.c:873 +#: parser/parse_clause.c:875 #, c-format msgid "only one default namespace is allowed" msgstr "sólo se permite un espacio de nombres predeterminado" -#: parser/parse_clause.c:933 +#: parser/parse_clause.c:935 #, c-format msgid "tablesample method %s does not exist" msgstr "no existe el método de tablesample «%s»" -#: parser/parse_clause.c:955 +#: parser/parse_clause.c:957 #, c-format msgid "tablesample method %s requires %d argument, not %d" msgid_plural "tablesample method %s requires %d arguments, not %d" msgstr[0] "el método de tablesample «%s» requiere %d argumento, no %d" msgstr[1] "el método de tablesample «%s» requiere %d argumentos, no %d" -#: parser/parse_clause.c:989 +#: parser/parse_clause.c:991 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "el método de tablesample «%s» no soporta la opción REPEATABLE" -#: parser/parse_clause.c:1138 +#: parser/parse_clause.c:1144 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "la cláusula TABLESAMPLE sólo puede aplicarse a tablas y vistas materializadas" -#: parser/parse_clause.c:1325 +#: parser/parse_clause.c:1331 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "la columna «%s» aparece más de una vez en la cláusula USING" -#: parser/parse_clause.c:1340 +#: parser/parse_clause.c:1346 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "la columna común «%s» aparece más de una vez en la tabla izquierda" -#: parser/parse_clause.c:1349 +#: parser/parse_clause.c:1355 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "la columna «%s» especificada en la cláusula USING no existe en la tabla izquierda" -#: parser/parse_clause.c:1364 +#: parser/parse_clause.c:1370 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "la columna común «%s» aparece más de una vez en la tabla derecha" -#: parser/parse_clause.c:1373 +#: parser/parse_clause.c:1379 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "la columna «%s» especificada en la cláusula USING no existe en la tabla derecha" -#: parser/parse_clause.c:1900 +#: parser/parse_clause.c:1907 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" msgstr "la cantidad de registros no puede ser NULL en la cláusula FETCH FIRST ... WITH TIES" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1925 +#: parser/parse_clause.c:1932 #, c-format msgid "argument of %s must not contain variables" msgstr "el argumento de %s no puede contener variables" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2090 +#: parser/parse_clause.c:2097 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "%s «%s» es ambiguo" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2118 +#: parser/parse_clause.c:2125 #, c-format msgid "non-integer constant in %s" msgstr "constante no entera en %s" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2140 +#: parser/parse_clause.c:2147 #, c-format msgid "%s position %d is not in select list" msgstr "la posición %2$d de %1$s no está en la lista de resultados" -#: parser/parse_clause.c:2579 +#: parser/parse_clause.c:2586 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE está limitado a 12 elementos" -#: parser/parse_clause.c:2785 +#: parser/parse_clause.c:2792 #, c-format msgid "window \"%s\" is already defined" msgstr "la ventana «%s» ya está definida" -#: parser/parse_clause.c:2846 +#: parser/parse_clause.c:2853 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "no se puede pasar a llevar la cláusula PARTITION BY de la ventana «%s»" -#: parser/parse_clause.c:2858 +#: parser/parse_clause.c:2865 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "no se puede pasar a llevar la cláusula ORDER BY de la ventana «%s»" -#: parser/parse_clause.c:2888 parser/parse_clause.c:2894 +#: parser/parse_clause.c:2895 parser/parse_clause.c:2901 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "no se puede copiar la ventana «%s» porque tiene una cláusula «frame»" -#: parser/parse_clause.c:2896 +#: parser/parse_clause.c:2903 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Omita el uso de paréntesis en esta cláusula OVER." -#: parser/parse_clause.c:2916 +#: parser/parse_clause.c:2923 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "RANGE con desplazamiento PRECEDING/FOLLOWING requiere exactamente una columna ORDER BY" -#: parser/parse_clause.c:2939 +#: parser/parse_clause.c:2946 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "el modo GROUPS requiere una cláusula ORDER BY" -#: parser/parse_clause.c:3010 +#: parser/parse_clause.c:3016 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "en una agregación con DISTINCT, las expresiones en ORDER BY deben aparecer en la lista de argumentos" -#: parser/parse_clause.c:3011 +#: parser/parse_clause.c:3017 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "para SELECT DISTINCT, las expresiones en ORDER BY deben aparecer en la lista de resultados" -#: parser/parse_clause.c:3043 +#: parser/parse_clause.c:3049 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "una función de agregación con DISTINCT debe tener al menos un argumento" -#: parser/parse_clause.c:3044 +#: parser/parse_clause.c:3050 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT debe tener al menos una columna" -#: parser/parse_clause.c:3110 parser/parse_clause.c:3142 +#: parser/parse_clause.c:3116 parser/parse_clause.c:3148 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "las expresiones de SELECT DISTINCT ON deben coincidir con las expresiones iniciales de ORDER BY" -#: parser/parse_clause.c:3220 +#: parser/parse_clause.c:3226 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC no están permitidos en cláusulas ON CONFLICT" -#: parser/parse_clause.c:3226 +#: parser/parse_clause.c:3232 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST no están permitidos en cláusulas ON CONFLICT" -#: parser/parse_clause.c:3305 +#: parser/parse_clause.c:3311 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE requiere una especificación de inferencia o nombre de restricción" -#: parser/parse_clause.c:3306 +#: parser/parse_clause.c:3312 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Por ejemplo, ON CONFLICT (nombre_de_columna)." -#: parser/parse_clause.c:3317 +#: parser/parse_clause.c:3323 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT no está soportado con tablas que son catálogos de sistema" -#: parser/parse_clause.c:3325 +#: parser/parse_clause.c:3331 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT no está soportado en la tabla «%s» usada como catálogo de sistema" -#: parser/parse_clause.c:3456 +#: parser/parse_clause.c:3462 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "el operador «%s» no es un operador válido de ordenamiento" -#: parser/parse_clause.c:3458 +#: parser/parse_clause.c:3464 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "Los operadores de ordenamiento deben ser miembros «<» o «>» de una familia de operadores btree." -#: parser/parse_clause.c:3769 +#: parser/parse_clause.c:3775 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "RANGE con desplazamiento PRECEDING/FOLLOWING no está soportado para la columna de tipo %s" -#: parser/parse_clause.c:3775 +#: parser/parse_clause.c:3781 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" msgstr "RANGE con desplazamiento PRECEDING/FOLLOWING no está soportado para la columna de tipo %s y tipo de desplazamiento %s" -#: parser/parse_clause.c:3778 +#: parser/parse_clause.c:3784 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Convierta el valor de desplazamiento a un tipo apropiado." -#: parser/parse_clause.c:3783 +#: parser/parse_clause.c:3789 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" msgstr "RANGE con desplazamiento PRECEDING/FOLLOWING tiene múltiples interpretaciones para la columna de tipo %s y tipo de desplazamiento %s" -#: parser/parse_clause.c:3786 +#: parser/parse_clause.c:3792 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "Convierta el valor de desplazamiento al tipo deseado exacto." #: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 #: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 -#: parser/parse_expr.c:2076 parser/parse_expr.c:2631 parser/parse_expr.c:3456 -#: parser/parse_target.c:985 +#: parser/parse_expr.c:2146 parser/parse_expr.c:2754 parser/parse_expr.c:3405 +#: parser/parse_expr.c:3634 parser/parse_target.c:998 #, c-format msgid "cannot cast type %s to %s" msgstr "no se puede convertir el tipo %s a %s" @@ -17059,121 +17296,121 @@ msgid "argument of %s must not return a set" msgstr "el argumento de %s no debe retornar un conjunto" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1383 +#: parser/parse_coerce.c:1420 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "los tipos %2$s y %3$s no son coincidentes en %1$s" -#: parser/parse_coerce.c:1499 +#: parser/parse_coerce.c:1536 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "los tipos de argumento %s y %s no pueden hacerse coincidir" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1551 +#: parser/parse_coerce.c:1588 #, c-format msgid "%s could not convert type %s to %s" msgstr "%s no pudo convertir el tipo %s a %s" -#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 -#: parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 -#: parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 +#: parser/parse_coerce.c:2191 parser/parse_coerce.c:2211 +#: parser/parse_coerce.c:2231 parser/parse_coerce.c:2252 +#: parser/parse_coerce.c:2307 parser/parse_coerce.c:2341 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "los argumentos declarados «%s» no son de tipos compatibles" -#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 -#: utils/fmgr/funcapi.c:592 +#: parser/parse_coerce.c:2286 parser/parse_coerce.c:2399 +#: utils/fmgr/funcapi.c:600 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "el argumento declarado %s no es un array sino de tipo %s" -#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 -#: utils/fmgr/funcapi.c:606 +#: parser/parse_coerce.c:2319 parser/parse_coerce.c:2469 +#: utils/fmgr/funcapi.c:614 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "el argumento declarado %s no es un tipo de rango sino tipo %s" -#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 -#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:624 utils/fmgr/funcapi.c:689 +#: parser/parse_coerce.c:2353 parser/parse_coerce.c:2433 +#: parser/parse_coerce.c:2566 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "el argumento declarado %s no es un tipo de multirango sino tipo %s" -#: parser/parse_coerce.c:2353 +#: parser/parse_coerce.c:2390 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "no se puede determinar el tipo del argumento «anyarray»" -#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 -#: parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 +#: parser/parse_coerce.c:2416 parser/parse_coerce.c:2447 +#: parser/parse_coerce.c:2486 parser/parse_coerce.c:2552 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "el argumento declarado %s no es consistente con el argumento declarado %s" -#: parser/parse_coerce.c:2474 +#: parser/parse_coerce.c:2511 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "no se pudo determinar el tipo polimórfico porque la entrada es de tipo %s" -#: parser/parse_coerce.c:2488 +#: parser/parse_coerce.c:2525 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "el argumento emparejado con anynonarray es un array: %s" -#: parser/parse_coerce.c:2498 +#: parser/parse_coerce.c:2535 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "el tipo emparejado con anyenum no es un tipo enum: %s" -#: parser/parse_coerce.c:2559 +#: parser/parse_coerce.c:2596 #, c-format msgid "arguments of anycompatible family cannot be cast to a common type" msgstr "los argumentos de la familia anycompatible no pueden ser convertidos a un tipo común" -#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 -#: parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 -#: parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 +#: parser/parse_coerce.c:2614 parser/parse_coerce.c:2635 +#: parser/parse_coerce.c:2685 parser/parse_coerce.c:2690 +#: parser/parse_coerce.c:2754 parser/parse_coerce.c:2766 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "no se pudo determinar el tipo polimórfico %s porque la entrada es de tipo %s" -#: parser/parse_coerce.c:2587 +#: parser/parse_coerce.c:2624 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "el tipo anycompatiblerange %s no coincide con el tipo anycompatible %s" -#: parser/parse_coerce.c:2608 +#: parser/parse_coerce.c:2645 #, c-format msgid "anycompatiblemultirange type %s does not match anycompatible type %s" msgstr "el tipo anycompatiblemultirange %s no coincide con el tipo anycompatible %s" -#: parser/parse_coerce.c:2622 +#: parser/parse_coerce.c:2659 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "el argumento emparejado a anycompatiblenonarray es un array: %s" -#: parser/parse_coerce.c:2857 +#: parser/parse_coerce.c:2894 #, c-format msgid "A result of type %s requires at least one input of type anyrange or anymultirange." msgstr "Un resultado de tipo %s requiere al menos una entrada de tipo anyrange o anymultirange." -#: parser/parse_coerce.c:2874 +#: parser/parse_coerce.c:2911 #, c-format msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." msgstr "Un resultado de tipo %s requiere al menos una entrada de tipo anycompatiblerange o anycompatiblemultirange." -#: parser/parse_coerce.c:2886 +#: parser/parse_coerce.c:2923 #, c-format msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." msgstr "Un resultado de tipo %s requiere al menos una entrada de tipo anyelement, anyarray, anynonarray, anyenum, anyrange o anymultirange." -#: parser/parse_coerce.c:2898 +#: parser/parse_coerce.c:2935 #, c-format msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." msgstr "Un resultado de tipo %s requiere al menos una entrada de tipo anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange o anycompatiblemultirange." -#: parser/parse_coerce.c:2928 +#: parser/parse_coerce.c:2965 msgid "A result of type internal requires at least one input of type internal." msgstr "Un resultado de tipo internal requiere al menos una entrada de tipo internal." @@ -17219,442 +17456,553 @@ msgstr "la referencia recursiva a la consulta «%s» no debe aparecer dentro de msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "la referencia recursiva a la consulta «%s» no debe aparecer dentro de EXCEPT" -#: parser/parse_cte.c:133 -#, fuzzy, c-format -#| msgid "\"EEEE\" not supported for input" -msgid "MERGE not supported in WITH query" -msgstr "«EEEE» no está soportado en la entrada" - -#: parser/parse_cte.c:143 +#: parser/parse_cte.c:136 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "el nombre de consulta WITH «%s» fue especificado más de una vez" -#: parser/parse_cte.c:314 +#: parser/parse_cte.c:308 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "no se pudo identificar un operador de desigualdad para el tipo %s" -#: parser/parse_cte.c:341 +#: parser/parse_cte.c:335 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "la cláusula WITH que contiene las sentencias que modifican datos debe estar en el nivel más externo" -#: parser/parse_cte.c:390 +#: parser/parse_cte.c:384 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "la columna %2$d en la consulta recursiva «%1$s» tiene tipo %3$s en el término no recursivo, pero %4$s en general" -#: parser/parse_cte.c:396 +#: parser/parse_cte.c:390 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Aplique una conversión de tipo a la salida del término no recursivo al tipo correcto." -#: parser/parse_cte.c:401 +#: parser/parse_cte.c:395 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "la columna %2$d en la consulta recursiva «%1$s» tiene ordenamiento (collation) %3$s en el término no recursivo, pero %4$s en general" -#: parser/parse_cte.c:405 +#: parser/parse_cte.c:399 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "Use la clásula COLLATE para definir el ordenamiento del término no-recursivo." -#: parser/parse_cte.c:426 +#: parser/parse_cte.c:420 #, c-format msgid "WITH query is not recursive" msgstr "la consulta WITH no es recursiva" -#: parser/parse_cte.c:457 +#: parser/parse_cte.c:451 #, c-format msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" msgstr "con una cláusula SEARCH o CYCLE, el lado izquierdo de UNION debe ser un SELECT" -#: parser/parse_cte.c:462 +#: parser/parse_cte.c:456 #, c-format msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" msgstr "con una cláusula SEARCH o CYCLE, el lado derecho de UNION debe ser un SELECT" -#: parser/parse_cte.c:477 +#: parser/parse_cte.c:471 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "columna de búsqueda «%s» no se encuentra en la lista de columnas de la consulta WITH" -#: parser/parse_cte.c:484 +#: parser/parse_cte.c:478 #, c-format msgid "search column \"%s\" specified more than once" msgstr "columna de búsqueda «%s» fue especificada más de una vez" -#: parser/parse_cte.c:493 +#: parser/parse_cte.c:487 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" msgstr "el nombre para la columna de secuencia de búsqueda «%s» ya ha sido utilizado en la lista de columnas de la consulta WITH" -#: parser/parse_cte.c:510 +#: parser/parse_cte.c:504 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "la columna de ciclo «%s» no se encuentra en la lista de columnas de la consulta WITH" -#: parser/parse_cte.c:517 +#: parser/parse_cte.c:511 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "columna de ciclo «%s» fue especificada más de una vez" -#: parser/parse_cte.c:526 +#: parser/parse_cte.c:520 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" msgstr "el nombre para la columna de marca de ciclo «%s» ya ha sido utilizada en la lista de columnas de la consulta WITH" -#: parser/parse_cte.c:533 +#: parser/parse_cte.c:527 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" msgstr "el nombre para la columna de ruta de ciclo «%s» ya ha sido utilizada en la lista de columnas de la consulta WITH" -#: parser/parse_cte.c:541 +#: parser/parse_cte.c:535 #, c-format msgid "cycle mark column name and cycle path column name are the same" msgstr "el nombre para la columna de marca de ciclo es igual que el nombre para la columna de ruta de ciclo" -#: parser/parse_cte.c:551 +#: parser/parse_cte.c:545 #, c-format msgid "search sequence column name and cycle mark column name are the same" msgstr "el nombre para la columna de secuencia de búsqueda es igual que el nombre para la columna de marca de ciclo" -#: parser/parse_cte.c:558 +#: parser/parse_cte.c:552 #, c-format msgid "search sequence column name and cycle path column name are the same" msgstr "el nombre para la columna de secuencia de búsqueda es igual que el nombre para la columna de ruta de ciclo" -#: parser/parse_cte.c:642 +#: parser/parse_cte.c:636 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "la consulta WITH «%s» tiene %d columnas disponibles pero se especificaron %d" -#: parser/parse_cte.c:822 +#: parser/parse_cte.c:816 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "la recursión mutua entre elementos de WITH no está implementada" -#: parser/parse_cte.c:874 +#: parser/parse_cte.c:868 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "la consulta recursiva «%s» no debe contener sentencias que modifiquen datos" -#: parser/parse_cte.c:882 +#: parser/parse_cte.c:876 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "la consulta recursiva «%s» no tiene la forma término-no-recursivo UNION [ALL] término-recursivo" -#: parser/parse_cte.c:926 +#: parser/parse_cte.c:911 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY no está implementado en una consulta recursiva" -#: parser/parse_cte.c:932 +#: parser/parse_cte.c:917 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET no está implementado en una consulta recursiva" -#: parser/parse_cte.c:938 +#: parser/parse_cte.c:923 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT no está implementado en una consulta recursiva" -#: parser/parse_cte.c:944 +#: parser/parse_cte.c:929 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE no está implementado en una consulta recursiva" -#: parser/parse_cte.c:1001 +#: parser/parse_cte.c:1008 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "la referencia recursiva a la consulta «%s» no debe aparecer más de una vez" -#: parser/parse_expr.c:287 +#: parser/parse_expr.c:313 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT no está permitido en este contexto" -#: parser/parse_expr.c:364 parser/parse_relation.c:3687 -#: parser/parse_relation.c:3697 parser/parse_relation.c:3715 -#: parser/parse_relation.c:3722 parser/parse_relation.c:3736 +#: parser/parse_expr.c:406 parser/parse_relation.c:3691 +#: parser/parse_relation.c:3701 parser/parse_relation.c:3719 +#: parser/parse_relation.c:3726 parser/parse_relation.c:3740 #, c-format msgid "column %s.%s does not exist" msgstr "no existe la columna %s.%s" -#: parser/parse_expr.c:376 +#: parser/parse_expr.c:418 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "la columna «%s» no fue encontrado en el tipo %s" -#: parser/parse_expr.c:382 +#: parser/parse_expr.c:424 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "no se pudo identificar la columna «%s» en el tipo de dato record" -#: parser/parse_expr.c:388 +#: parser/parse_expr.c:430 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "la notación de columna .%s fue aplicada al tipo %s, que no es un tipo compuesto" -#: parser/parse_expr.c:419 parser/parse_target.c:733 +#: parser/parse_expr.c:461 parser/parse_target.c:732 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "la expansión de filas a través de «*» no está soportado aquí" -#: parser/parse_expr.c:541 +#: parser/parse_expr.c:584 msgid "cannot use column reference in DEFAULT expression" msgstr "no se pueden usar referencias a columnas en una cláusula DEFAULT" -#: parser/parse_expr.c:544 +#: parser/parse_expr.c:587 msgid "cannot use column reference in partition bound expression" msgstr "no se pueden usar referencias a columnas en expresión de borde de partición" -#: parser/parse_expr.c:803 parser/parse_relation.c:833 -#: parser/parse_relation.c:915 parser/parse_target.c:1225 +#: parser/parse_expr.c:846 parser/parse_relation.c:833 +#: parser/parse_relation.c:915 parser/parse_target.c:1238 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "la referencia a la columna «%s» es ambigua" -#: parser/parse_expr.c:859 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_expr.c:902 parser/parse_param.c:110 parser/parse_param.c:142 #: parser/parse_param.c:204 parser/parse_param.c:303 #, c-format msgid "there is no parameter $%d" msgstr "no hay parámetro $%d" -#: parser/parse_expr.c:1059 +#. translator: %s is name of a SQL construct, eg NULLIF +#: parser/parse_expr.c:1103 parser/parse_expr.c:3065 #, c-format -msgid "NULLIF requires = operator to yield boolean" -msgstr "NULLIF requiere que el operador = retorne boolean" +msgid "%s requires = operator to yield boolean" +msgstr "%s requiere que el operador = retorne boolean" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1065 parser/parse_expr.c:2947 +#: parser/parse_expr.c:1109 parser/parse_expr.c:3072 #, c-format msgid "%s must not return a set" msgstr "%s no debe retornar un conjunto" -#: parser/parse_expr.c:1450 parser/parse_expr.c:1482 +#: parser/parse_expr.c:1395 +#, c-format +msgid "MERGE_ACTION() can only be used in the RETURNING list of a MERGE command" +msgstr "MERGE_ACTION() sólo puede usarse en la lista RETURNING de una orden MERGE" + +#: parser/parse_expr.c:1519 parser/parse_expr.c:1551 #, c-format msgid "number of columns does not match number of values" msgstr "el número de columnas no coincide con el número de valores" -#: parser/parse_expr.c:1496 +#: parser/parse_expr.c:1565 #, c-format msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" msgstr "el origen para un UPDATE de varias columnas debe ser una expresión sub-SELECT o ROW ()" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1691 parser/parse_expr.c:2173 parser/parse_func.c:2677 +#: parser/parse_expr.c:1760 parser/parse_expr.c:2243 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "no se permiten funciones que retornan conjuntos en %s" -#: parser/parse_expr.c:1754 +#: parser/parse_expr.c:1824 msgid "cannot use subquery in check constraint" msgstr "no se pueden usar subconsultas en una restricción «check»" -#: parser/parse_expr.c:1758 +#: parser/parse_expr.c:1828 msgid "cannot use subquery in DEFAULT expression" msgstr "no se puede usar una subconsulta en una expresión DEFAULT" -#: parser/parse_expr.c:1761 +#: parser/parse_expr.c:1831 msgid "cannot use subquery in index expression" msgstr "no se puede usar una subconsulta en una expresión de índice" -#: parser/parse_expr.c:1764 +#: parser/parse_expr.c:1834 msgid "cannot use subquery in index predicate" msgstr "no se puede usar una subconsulta en un predicado de índice" -#: parser/parse_expr.c:1767 +#: parser/parse_expr.c:1837 msgid "cannot use subquery in statistics expression" msgstr "no se puede usar una subconsulta en una expresión de estadísticas" -#: parser/parse_expr.c:1770 +#: parser/parse_expr.c:1840 msgid "cannot use subquery in transform expression" msgstr "no se puede usar una subconsulta en una expresión de transformación" -#: parser/parse_expr.c:1773 +#: parser/parse_expr.c:1843 msgid "cannot use subquery in EXECUTE parameter" msgstr "no se puede usar una subconsulta en un parámetro a EXECUTE" -#: parser/parse_expr.c:1776 +#: parser/parse_expr.c:1846 msgid "cannot use subquery in trigger WHEN condition" -msgstr "no se puede usar una subconsulta en la condición WHEN de un disparador" +msgstr "no se puede usar una subconsulta en la condición WHEN de un “triggerâ€" -#: parser/parse_expr.c:1779 +#: parser/parse_expr.c:1849 msgid "cannot use subquery in partition bound" msgstr "no se puede usar una subconsulta en un borde de partición" -#: parser/parse_expr.c:1782 +#: parser/parse_expr.c:1852 msgid "cannot use subquery in partition key expression" msgstr "no se puede usar una subconsulta en una expresión de llave de partición" -#: parser/parse_expr.c:1785 +#: parser/parse_expr.c:1855 msgid "cannot use subquery in CALL argument" msgstr "no se puede usar una subconsulta en un argumento a CALL" -#: parser/parse_expr.c:1788 +#: parser/parse_expr.c:1858 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "no se puede usar una subconsulta en la condición WHERE de COPY FROM" -#: parser/parse_expr.c:1791 +#: parser/parse_expr.c:1861 msgid "cannot use subquery in column generation expression" msgstr "no se puede usar una subconsulta en una expresión de generación de columna" -#: parser/parse_expr.c:1844 parser/parse_expr.c:3572 +#: parser/parse_expr.c:1914 parser/parse_expr.c:3764 #, c-format msgid "subquery must return only one column" msgstr "la subconsulta debe retornar sólo una columna" -#: parser/parse_expr.c:1915 +#: parser/parse_expr.c:1985 #, c-format msgid "subquery has too many columns" msgstr "la subconsulta tiene demasiadas columnas" -#: parser/parse_expr.c:1920 +#: parser/parse_expr.c:1990 #, c-format msgid "subquery has too few columns" msgstr "la subconsulta tiene muy pocas columnas" -#: parser/parse_expr.c:2016 +#: parser/parse_expr.c:2086 #, c-format msgid "cannot determine type of empty array" msgstr "no se puede determinar el tipo de un array vacío" -#: parser/parse_expr.c:2017 +#: parser/parse_expr.c:2087 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "Agregue una conversión de tipo explícita al tipo deseado, por ejemplo ARRAY[]::integer[]." -#: parser/parse_expr.c:2031 +#: parser/parse_expr.c:2101 #, c-format msgid "could not find element type for data type %s" msgstr "no se pudo encontrar el tipo de dato de elemento para el tipo de dato %s" -#: parser/parse_expr.c:2114 -#, fuzzy, c-format -#| msgid "target lists can have at most %d entries" +#: parser/parse_expr.c:2184 +#, c-format msgid "ROW expressions can have at most %d entries" -msgstr "las listas de resultados pueden tener a lo más %d entradas" +msgstr "las expresiones ROW pueden tener a lo más %d entradas" -#: parser/parse_expr.c:2266 +#: parser/parse_expr.c:2389 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "el valor del atributo XML sin nombre debe ser una referencia a una columna" -#: parser/parse_expr.c:2267 +#: parser/parse_expr.c:2390 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "el valor del elemento XML sin nombre debe ser una referencia a una columna" -#: parser/parse_expr.c:2282 +#: parser/parse_expr.c:2405 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "el nombre de atributo XML «%s» aparece más de una vez" -#: parser/parse_expr.c:2390 +#: parser/parse_expr.c:2513 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "no se puede convertir el resultado de XMLSERIALIZE a %s" -#: parser/parse_expr.c:2704 parser/parse_expr.c:2900 +#: parser/parse_expr.c:2827 parser/parse_expr.c:3023 #, c-format msgid "unequal number of entries in row expressions" msgstr "número desigual de entradas en expresiones de registro" -#: parser/parse_expr.c:2714 +#: parser/parse_expr.c:2837 #, c-format msgid "cannot compare rows of zero length" msgstr "no se pueden comparar registros de largo cero" -#: parser/parse_expr.c:2739 +#: parser/parse_expr.c:2862 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "el operador de comparación de registros debe retornar tipo boolean, no tipo %s" -#: parser/parse_expr.c:2746 +#: parser/parse_expr.c:2869 #, c-format msgid "row comparison operator must not return a set" msgstr "el operador de comparación de registros no puede retornar un conjunto" -#: parser/parse_expr.c:2805 parser/parse_expr.c:2846 +#: parser/parse_expr.c:2928 parser/parse_expr.c:2969 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "no se pudo determinar la interpretación del operador de comparación de registros %s" -#: parser/parse_expr.c:2807 +#: parser/parse_expr.c:2930 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "Los operadores de comparación de registros deben estar asociados a una familia de operadores btree." -#: parser/parse_expr.c:2848 +#: parser/parse_expr.c:2971 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Hay múltiples candidatos igualmente plausibles." -#: parser/parse_expr.c:2941 -#, c-format -msgid "IS DISTINCT FROM requires = operator to yield boolean" -msgstr "IS DISTINCT FROM requiere que el operador = retorne boolean" - -#: parser/parse_expr.c:3194 +#: parser/parse_expr.c:3306 #, c-format msgid "JSON ENCODING clause is only allowed for bytea input type" -msgstr "" +msgstr "la cláusula ENCODING de JSON sólo está permitida para el tipo de entrada bytea" -#: parser/parse_expr.c:3201 +#: parser/parse_expr.c:3370 #, c-format -msgid "FORMAT JSON has no effect for json and jsonb types" -msgstr "" +msgid "cannot use non-string types with implicit FORMAT JSON clause" +msgstr "no se puede usar tipos que no son string con la cláusula implícita FORMAT JSON" -#: parser/parse_expr.c:3224 +#: parser/parse_expr.c:3371 #, c-format -msgid "cannot use non-string types with implicit FORMAT JSON clause" -msgstr "" +msgid "cannot use non-string types with explicit FORMAT JSON clause" +msgstr "no se puede usar tipos que no son string con la cláusula explítica FORMAT JSON" -#: parser/parse_expr.c:3294 -#, fuzzy, c-format -#| msgid "cannot cast jsonb string to type %s" +#: parser/parse_expr.c:3460 +#, c-format msgid "cannot use JSON format with non-string output types" -msgstr "no se puede convertir un string jsonb a tipo %s" +msgstr "no se puede usar formato JSON con tipos de salida que no son string" -#: parser/parse_expr.c:3307 +#: parser/parse_expr.c:3473 #, c-format msgid "cannot set JSON encoding for non-bytea output types" -msgstr "" +msgstr "no se puede definir codificación JSON para tipos de salida que no sea bytea" -#: parser/parse_expr.c:3312 -#, fuzzy, c-format -#| msgid "unsupported format code: %d" +#: parser/parse_expr.c:3478 +#, c-format msgid "unsupported JSON encoding" -msgstr "código de formato no soportado: %d" +msgstr "codificación JSON no soportada" -#: parser/parse_expr.c:3313 +#: parser/parse_expr.c:3479 #, c-format msgid "Only UTF8 JSON encoding is supported." -msgstr "" +msgstr "Sólo la codificación JSON UTF8 está soportada." -#: parser/parse_expr.c:3350 -#, fuzzy, c-format -#| msgid "return type %s is not supported for SQL functions" +#: parser/parse_expr.c:3516 +#, c-format msgid "returning SETOF types is not supported in SQL/JSON functions" -msgstr "el tipo de retorno %s no es soportado en funciones SQL" +msgstr "retornar tipos SETOF no está soportado en funciones SQL/JSON" + +#: parser/parse_expr.c:3521 +#, c-format +msgid "returning pseudo-types is not supported in SQL/JSON functions" +msgstr "retornar pseudo-tipos no está soportado en funciones SQL/JSON" -#: parser/parse_expr.c:3651 parser/parse_func.c:865 +#: parser/parse_expr.c:3849 parser/parse_func.c:866 #, c-format msgid "aggregate ORDER BY is not implemented for window functions" msgstr "el ORDER BY de funciones de agregación no está implementado para funciones de ventana deslizante" -#: parser/parse_expr.c:3870 +#: parser/parse_expr.c:4072 #, c-format msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" -msgstr "" +msgstr "no se puede usar la cláusula FORMAT ENCODING de JSON para tipos de entrada que no son bytea" -#: parser/parse_expr.c:3890 -#, fuzzy, c-format -#| msgid "cannot use subquery in index predicate" +#: parser/parse_expr.c:4092 +#, c-format msgid "cannot use type %s in IS JSON predicate" -msgstr "no se puede usar una subconsulta en un predicado de índice" +msgstr "no se puede tipo %s en predicado IS JSON" + +#: parser/parse_expr.c:4118 parser/parse_expr.c:4239 +#, c-format +#| msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" +msgid "cannot use type %s in RETURNING clause of %s" +msgstr "no se puede usar el tipo %s en la cláusula RETURNING de %s" + +#: parser/parse_expr.c:4120 +#, c-format +#| msgid "Try returning a string type or bytea." +msgid "Try returning json or jsonb." +msgstr "Intente retornando tipo json o jsonb." + +#: parser/parse_expr.c:4168 +#, c-format +msgid "cannot use non-string types with WITH UNIQUE KEYS clause" +msgstr "no se puede usar tipos que no sean strings con cláusula WITH UNIQUE KEYS" + +#: parser/parse_expr.c:4242 +#, c-format +msgid "Try returning a string type or bytea." +msgstr "Intente retornando un tipo de string o bytea." + +#: parser/parse_expr.c:4307 +#, c-format +msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" +msgstr "no se puede especificar FORMAT JSON en la cláusula RETURNING de %s()" + +#: parser/parse_expr.c:4320 +#, c-format +msgid "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" +msgstr "el comportamiento QUOTES de SQL/JSON no debe ser especificado cuando se usa WITH WRAPPER" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4334 parser/parse_expr.c:4363 parser/parse_expr.c:4394 +#: parser/parse_expr.c:4420 parser/parse_expr.c:4446 +#: parser/parse_jsontable.c:94 +#, c-format +msgid "invalid %s behavior" +msgstr "especificación %s no válida" + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4337 parser/parse_expr.c:4366 +#, c-format +msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s." +msgstr "Sólo ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT o expresión DEFAULT se permite en %s para %s." + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4344 parser/parse_expr.c:4373 parser/parse_expr.c:4402 +#: parser/parse_expr.c:4430 parser/parse_expr.c:4456 +#, c-format +msgid "invalid %s behavior for column \"%s\"" +msgstr "comportamiento %s no válido para la columna «%s»" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4347 parser/parse_expr.c:4376 +#, c-format +msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns." +msgstr "Sólo ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT o expresión DEFAULT se permite en %s para columnas con formato." + +#: parser/parse_expr.c:4395 +#, c-format +msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s." +msgstr "Sólo ERROR, TRUE, FALSE o UNKNOWN están permitidos en %s para %s." + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4405 +#, c-format +msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns." +msgstr "Sólo ERROR, TRUE, FALSE o UNKNOWN están permitidos en %s para columnas EXISTS." + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4423 parser/parse_expr.c:4449 +#, c-format +msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s." +msgstr "Sólo ERROR, NULL o expresión DEFAULT se permite en %s para %s." + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4433 parser/parse_expr.c:4459 +#, c-format +msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns." +msgstr "Sólo ERROR, NULL o expresión DEFAULT se permite en %s para columnas escalares." + +#: parser/parse_expr.c:4489 +#, c-format +msgid "JSON path expression must be of type %s, not of type %s" +msgstr "la expresión de ruta JSON debe ser de tipo %s, no tipo %s" + +#: parser/parse_expr.c:4707 +#, c-format +msgid "can only specify a constant, non-aggregate function, or operator expression for DEFAULT" +msgstr "sólo se puede especificar constantes, funciones no de agregación, o expresión de operador para DEFAULT" + +#: parser/parse_expr.c:4712 +#, c-format +msgid "DEFAULT expression must not contain column references" +msgstr "las expresiones DEFAULT no pueden contener referencias a columnas" + +#: parser/parse_expr.c:4717 +#, c-format +msgid "DEFAULT expression must not return a set" +msgstr "las expresiones DEFAULT no deben retornar un conjunto" + +#: parser/parse_expr.c:4793 parser/parse_expr.c:4802 +#, c-format +msgid "cannot cast behavior expression of type %s to %s" +msgstr "no se puede convertir la expresión de tipo %s a %s" + +#: parser/parse_expr.c:4796 +#, c-format +msgid "You will need to explicitly cast the expression to type %s." +msgstr "Necesitará aplicar una conversión de la expresión a tipo %s." #: parser/parse_func.c:194 #, c-format @@ -17666,7 +18014,7 @@ msgstr "nombre de argumento «%s» especificado más de una vez" msgid "positional argument cannot follow named argument" msgstr "un argumento posicional no puede seguir a un argumento con nombre" -#: parser/parse_func.c:287 parser/parse_func.c:2367 +#: parser/parse_func.c:287 parser/parse_func.c:2368 #, c-format msgid "%s is not a procedure" msgstr "%s no es un procedimiento" @@ -17785,7 +18133,7 @@ msgstr "No se pudo escoger la función más adecuada. Puede ser necesario agrega msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." msgstr "Ninguna función coincide en el nombre y tipos de argumentos. Quizás puso ORDER BY en una mala posición; ORDER BY debe aparecer después de todos los argumentos normales de la función de agregación." -#: parser/parse_func.c:622 parser/parse_func.c:2410 +#: parser/parse_func.c:622 parser/parse_func.c:2411 #, c-format msgid "procedure %s does not exist" msgstr "no existe el procedimiento «%s»" @@ -17805,7 +18153,7 @@ msgstr "Ninguna función coincide en el nombre y tipos de argumentos. Puede ser msgid "VARIADIC argument must be an array" msgstr "el parámetro VARIADIC debe ser un array" -#: parser/parse_func.c:791 parser/parse_func.c:855 +#: parser/parse_func.c:791 parser/parse_func.c:856 #, c-format msgid "%s(*) must be used to call a parameterless aggregate function" msgstr "%s(*) debe ser usado para invocar una función de agregación sin parámetros" @@ -17820,267 +18168,257 @@ msgstr "las funciones de agregación no pueden retornar conjuntos" msgid "aggregates cannot use named arguments" msgstr "las funciones de agregación no pueden usar argumentos con nombre" -#: parser/parse_func.c:845 +#: parser/parse_func.c:846 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "DISTINCT no está implementado para funciones de ventana deslizante" -#: parser/parse_func.c:874 +#: parser/parse_func.c:875 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "FILTER no está implementado para funciones de ventana deslizante" -#: parser/parse_func.c:883 +#: parser/parse_func.c:884 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "las llamadas a funciones de ventana no pueden contener llamadas a funciones que retornan conjuntos" -#: parser/parse_func.c:891 +#: parser/parse_func.c:892 #, c-format msgid "window functions cannot return sets" msgstr "las funciones de ventana deslizante no pueden retornar conjuntos" -#: parser/parse_func.c:2166 parser/parse_func.c:2439 +#: parser/parse_func.c:2167 parser/parse_func.c:2440 #, c-format msgid "could not find a function named \"%s\"" msgstr "no se pudo encontrar una función llamada «%s»" -#: parser/parse_func.c:2180 parser/parse_func.c:2457 +#: parser/parse_func.c:2181 parser/parse_func.c:2458 #, c-format msgid "function name \"%s\" is not unique" msgstr "el nombre de función «%s» no es único" -#: parser/parse_func.c:2182 parser/parse_func.c:2460 +#: parser/parse_func.c:2183 parser/parse_func.c:2461 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "Especifique la lista de argumentos para seleccionar la función sin ambigüedad." -#: parser/parse_func.c:2226 +#: parser/parse_func.c:2227 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" msgstr[0] "los procedimientos no pueden tener más de %d argumento" msgstr[1] "los procedimientos no pueden tener más de %d argumentos" -#: parser/parse_func.c:2357 +#: parser/parse_func.c:2358 #, c-format msgid "%s is not a function" msgstr "«%s» no es una función" -#: parser/parse_func.c:2377 +#: parser/parse_func.c:2378 #, c-format msgid "function %s is not an aggregate" msgstr "la función %s no es una función de agregación" -#: parser/parse_func.c:2405 +#: parser/parse_func.c:2406 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "no se pudo encontrar un procedimiento llamado «%s»" -#: parser/parse_func.c:2419 +#: parser/parse_func.c:2420 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "no se pudo encontrar una función de agregación llamada «%s»" -#: parser/parse_func.c:2424 +#: parser/parse_func.c:2425 #, c-format msgid "aggregate %s(*) does not exist" msgstr "no existe la función de agregación %s(*)" -#: parser/parse_func.c:2429 +#: parser/parse_func.c:2430 #, c-format msgid "aggregate %s does not exist" msgstr "no existe la función de agregación %s" -#: parser/parse_func.c:2465 +#: parser/parse_func.c:2466 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "el nombre de procedimiento «%s» no es única" -#: parser/parse_func.c:2468 +#: parser/parse_func.c:2469 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "Especifique la lista de argumentos para seleccionar el procedimiento sin ambigüedad." -#: parser/parse_func.c:2473 +#: parser/parse_func.c:2474 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "el atributo de la función de agregación «%s» no es único" -#: parser/parse_func.c:2476 +#: parser/parse_func.c:2477 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "Especifique la lista de argumentos para seleccionar la función de agregación sin ambigüedad." -#: parser/parse_func.c:2481 +#: parser/parse_func.c:2482 #, c-format msgid "routine name \"%s\" is not unique" msgstr "el nombre de rutina «%s» no es único" -#: parser/parse_func.c:2484 +#: parser/parse_func.c:2485 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "Especifique la lista de argumentos para seleccionar la rutina sin ambigüedad." -#: parser/parse_func.c:2539 +#: parser/parse_func.c:2540 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "no se permiten funciones que retornan conjuntos en condiciones JOIN" -#: parser/parse_func.c:2560 +#: parser/parse_func.c:2561 msgid "set-returning functions are not allowed in policy expressions" msgstr "no se permiten funciones que retornan conjuntos en expresiones de política" -#: parser/parse_func.c:2576 +#: parser/parse_func.c:2577 msgid "set-returning functions are not allowed in window definitions" msgstr "no se permiten funciones que retornan conjuntos definiciones de ventana deslizante" -#: parser/parse_func.c:2613 -#, fuzzy -#| msgid "set-returning functions are not allowed in trigger WHEN conditions" +#: parser/parse_func.c:2615 msgid "set-returning functions are not allowed in MERGE WHEN conditions" -msgstr "no se permiten funciones que retornan conjuntos en condiciones WHEN de un disparador" +msgstr "no se permiten funciones que retornan conjuntos en condiciones MERGE WHEN" -#: parser/parse_func.c:2617 +#: parser/parse_func.c:2619 msgid "set-returning functions are not allowed in check constraints" msgstr "no se permiten funciones de que retornan conjuntos en restricciones «check»" -#: parser/parse_func.c:2621 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "no se permiten funciones que retornan conjuntos en expresiones DEFAULT" -#: parser/parse_func.c:2624 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index expressions" msgstr "no se permiten funciones que retornan conjuntos en expresiones de índice" -#: parser/parse_func.c:2627 +#: parser/parse_func.c:2629 msgid "set-returning functions are not allowed in index predicates" msgstr "no se permiten funciones que retornan conjuntos en predicados de índice" -#: parser/parse_func.c:2630 +#: parser/parse_func.c:2632 msgid "set-returning functions are not allowed in statistics expressions" msgstr "no se permiten funciones que retornan conjuntos en expresiones de estadísticas" -#: parser/parse_func.c:2633 +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in transform expressions" msgstr "no se permiten funciones que retornan conjuntos en expresiones de transformación" -#: parser/parse_func.c:2636 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "no se permiten funciones que retornan conjuntos en parámetros a EXECUTE" -#: parser/parse_func.c:2639 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in trigger WHEN conditions" -msgstr "no se permiten funciones que retornan conjuntos en condiciones WHEN de un disparador" +msgstr "no se permiten funciones que retornan conjuntos en condiciones WHEN de un “triggerâ€" -#: parser/parse_func.c:2642 +#: parser/parse_func.c:2644 msgid "set-returning functions are not allowed in partition bound" msgstr "no se permiten funciones que retornan conjuntos en bordes de partición" -#: parser/parse_func.c:2645 +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in partition key expressions" msgstr "no se permiten funciones que retornan conjuntos en expresiones de llave de particionamiento" -#: parser/parse_func.c:2648 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in CALL arguments" msgstr "no se permiten funciones que retornan conjuntos en argumentos de CALL" -#: parser/parse_func.c:2651 +#: parser/parse_func.c:2653 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "no se permiten funciones que retornan conjuntos en las condiciones WHERE de COPY FROM" -#: parser/parse_func.c:2654 +#: parser/parse_func.c:2656 msgid "set-returning functions are not allowed in column generation expressions" msgstr "no se permiten funciones que retornan conjuntos en expresiones de generación de columna" -#: parser/parse_merge.c:119 -#, fuzzy, c-format -#| msgid "WHERE CURRENT OF is not supported for this table type" +#: parser/parse_jsontable.c:95 +#, c-format +msgid "Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause." +msgstr "Sólo EMPTY [ ARRAY ] o ERROR son permitidos en la cláusula ON ERROR de nivel superior." + +#: parser/parse_jsontable.c:189 parser/parse_jsontable.c:203 +#, c-format +msgid "duplicate JSON_TABLE column or path name: %s" +msgstr "nombre de columna o de “path†duplicada en JSON_TABLE: %s" + +#: parser/parse_merge.c:129 +#, c-format msgid "WITH RECURSIVE is not supported for MERGE statement" -msgstr "WHERE CURRENT OF no está soportado para este tipo de tabla" +msgstr "WITH RECURSIVE no está soportado para la sentencia MERGE" -#: parser/parse_merge.c:161 +#: parser/parse_merge.c:176 #, c-format msgid "unreachable WHEN clause specified after unconditional WHEN clause" msgstr "se especificó una cláusula WHEN no alcanzable después de una cláusula WHEN incondicional" -#: parser/parse_merge.c:191 -#, fuzzy, c-format -#| msgid "LIKE is not supported for creating foreign tables" -msgid "MERGE is not supported for relations with rules." -msgstr "LIKE no está soportado para la creación de tablas foráneas" - -#: parser/parse_merge.c:208 +#: parser/parse_merge.c:222 #, c-format msgid "name \"%s\" specified more than once" msgstr "el nombre «%s» fue especificado más de una vez" -#: parser/parse_merge.c:210 +#: parser/parse_merge.c:224 #, c-format msgid "The name is used both as MERGE target table and data source." msgstr "El nombre es usado tanto como tabla de destino de MERGE como como tabla de origen." -#: parser/parse_node.c:87 +#: parser/parse_node.c:82 #, c-format msgid "target lists can have at most %d entries" msgstr "las listas de resultados pueden tener a lo más %d entradas" -#: parser/parse_oper.c:123 parser/parse_oper.c:690 +#: parser/parse_oper.c:114 parser/parse_oper.c:678 #, c-format msgid "postfix operators are not supported" msgstr "los operadores postfix no están soportados" -#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:509 -#: utils/adt/regproc.c:683 -#, c-format -msgid "operator does not exist: %s" -msgstr "el operador no existe: %s" - -#: parser/parse_oper.c:229 +#: parser/parse_oper.c:217 #, c-format msgid "Use an explicit ordering operator or modify the query." msgstr "Use un operador de ordenamiento explícito o modifique la consulta." -#: parser/parse_oper.c:485 +#: parser/parse_oper.c:473 #, c-format msgid "operator requires run-time type coercion: %s" msgstr "el operador requiere conversión explícita de tipos: %s" -#: parser/parse_oper.c:641 +#: parser/parse_oper.c:629 #, c-format msgid "operator is not unique: %s" msgstr "el operador no es único: %s" -#: parser/parse_oper.c:643 +#: parser/parse_oper.c:631 #, c-format msgid "Could not choose a best candidate operator. You might need to add explicit type casts." msgstr "No se pudo escoger el operador más adecuado. Puede ser necesario agregar conversiones explícitas de tipos." -#: parser/parse_oper.c:652 +#: parser/parse_oper.c:640 #, c-format msgid "No operator matches the given name and argument type. You might need to add an explicit type cast." msgstr "Ningún operador coincide en el nombre y tipo de argumento. Puede ser necesario agregar conversión explícita de tipos." -#: parser/parse_oper.c:654 +#: parser/parse_oper.c:642 #, c-format msgid "No operator matches the given name and argument types. You might need to add explicit type casts." msgstr "Ningún operador coincide en el nombre y tipos de argumentos. Puede ser necesario agregar conversión explícita de tipos." -#: parser/parse_oper.c:714 parser/parse_oper.c:828 -#, c-format -msgid "operator is only a shell: %s" -msgstr "el operador está inconcluso: %s" - -#: parser/parse_oper.c:816 +#: parser/parse_oper.c:803 #, c-format msgid "op ANY/ALL (array) requires array on right side" msgstr "op ANY/ALL (array) requiere un array al lado derecho" -#: parser/parse_oper.c:858 +#: parser/parse_oper.c:844 #, c-format msgid "op ANY/ALL (array) requires operator to yield boolean" msgstr "op ANY/ALL (array) requiere un operador que entregue boolean" -#: parser/parse_oper.c:863 +#: parser/parse_oper.c:849 #, c-format msgid "op ANY/ALL (array) requires operator not to return a set" msgstr "op ANY/ALL (array) requiere un operador que no retorne un conjunto" @@ -18090,7 +18428,7 @@ msgstr "op ANY/ALL (array) requiere un operador que no retorne un conjunto" msgid "inconsistent types deduced for parameter $%d" msgstr "para el parámetro $%d se dedujeron tipos de dato inconsistentes" -#: parser/parse_param.c:309 tcop/postgres.c:740 +#: parser/parse_param.c:309 tcop/postgres.c:744 #, c-format msgid "could not determine data type of parameter $%d" msgstr "no se pudo determinar el tipo del parámetro $%d" @@ -18110,13 +18448,13 @@ msgstr "la referencia a la tabla %u es ambigua" msgid "table name \"%s\" specified more than once" msgstr "el nombre de tabla «%s» fue especificado más de una vez" -#: parser/parse_relation.c:494 parser/parse_relation.c:3629 -#: parser/parse_relation.c:3638 +#: parser/parse_relation.c:494 parser/parse_relation.c:3633 +#: parser/parse_relation.c:3642 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "referencia a la entrada de la cláusula FROM para la tabla «%s» no válida" -#: parser/parse_relation.c:498 parser/parse_relation.c:3640 +#: parser/parse_relation.c:498 parser/parse_relation.c:3644 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "Hay una entrada para la tabla «%s», pero no puede ser referenciada desde esta parte de la consulta." @@ -18137,23 +18475,22 @@ msgid "cannot use system column \"%s\" in column generation expression" msgstr "no se puede usar la columna de sistema «%s» en una expresión de generación de columna" #: parser/parse_relation.c:723 -#, fuzzy, c-format -#| msgid "cannot use system column \"%s\" in partition key" +#, c-format msgid "cannot use system column \"%s\" in MERGE WHEN condition" -msgstr "no se puede usar la columna de sistema «%s» en llave de particionamiento" +msgstr "no se puede usar la columna de sistema «%s» en condición MERGE WHEN" -#: parser/parse_relation.c:1236 parser/parse_relation.c:1690 -#: parser/parse_relation.c:2387 +#: parser/parse_relation.c:1236 parser/parse_relation.c:1691 +#: parser/parse_relation.c:2384 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "la tabla «%s» tiene %d columnas pero se especificaron %d" -#: parser/parse_relation.c:1444 +#: parser/parse_relation.c:1445 #, c-format msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." msgstr "Hay un elemento WITH llamado «%s», pero no puede ser referenciada desde esta parte de la consulta." -#: parser/parse_relation.c:1446 +#: parser/parse_relation.c:1447 #, c-format msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." msgstr "Use WITH RECURSIVE, o reordene los elementos de WITH para eliminar referencias hacia adelante." @@ -18179,141 +18516,136 @@ msgid "a column definition list is required for functions returning \"record\"" msgstr "la lista de definición de columnas es obligatoria para funciones que retornan «record»" #: parser/parse_relation.c:1894 -#, fuzzy, c-format -#| msgid "target lists can have at most %d entries" +#, c-format msgid "column definition lists can have at most %d entries" -msgstr "las listas de resultados pueden tener a lo más %d entradas" +msgstr "las listas de definición de columnas pueden tener a lo más %d entradas" #: parser/parse_relation.c:1954 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "la función «%s» en FROM tiene el tipo de retorno no soportado %s" -#: parser/parse_relation.c:1981 parser/parse_relation.c:2067 -#, fuzzy, c-format -#| msgid "joins can have at most %d columns" +#: parser/parse_relation.c:1981 parser/parse_relation.c:2066 +#, c-format msgid "functions in FROM can return at most %d columns" -msgstr "los joins pueden tener a lo más %d columnas" +msgstr "las funciones en FROM pueden tener a lo más %d columnas" -#: parser/parse_relation.c:2097 -#, fuzzy, c-format -#| msgid "table \"%s\" has %d columns available but %d columns specified" +#: parser/parse_relation.c:2096 +#, c-format msgid "%s function has %d columns available but %d columns specified" -msgstr "la tabla «%s» tiene %d columnas pero se especificaron %d" +msgstr "la función %s tiene %d columnas disponibles pero se especificaron %d" -#: parser/parse_relation.c:2179 +#: parser/parse_relation.c:2177 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "la lista VALUES «%s» tiene %d columnas disponibles pero se especificaron %d" -#: parser/parse_relation.c:2245 +#: parser/parse_relation.c:2242 #, c-format msgid "joins can have at most %d columns" msgstr "los joins pueden tener a lo más %d columnas" -#: parser/parse_relation.c:2270 -#, fuzzy, c-format -#| msgid "table \"%s\" has %d columns available but %d columns specified" +#: parser/parse_relation.c:2267 +#, c-format msgid "join expression \"%s\" has %d columns available but %d columns specified" -msgstr "la tabla «%s» tiene %d columnas pero se especificaron %d" +msgstr "la expresión de join «%s» tiene %d columnas disponibles pero se especificaron %d" -#: parser/parse_relation.c:2360 +#: parser/parse_relation.c:2357 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "la consulta WITH «%s» no tiene una cláusula RETURNING" -#: parser/parse_relation.c:3631 +#: parser/parse_relation.c:3635 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Probablemente quiera hacer referencia al alias de la tabla «%s»." -#: parser/parse_relation.c:3643 +#: parser/parse_relation.c:3647 #, c-format msgid "To reference that table, you must mark this subquery with LATERAL." -msgstr "" +msgstr "Para hacer referencia a esa tabla, debe marcar esta subconsulta con LATERAL." -#: parser/parse_relation.c:3649 +#: parser/parse_relation.c:3653 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "falta una entrada para la tabla «%s» en la cláusula FROM" -#: parser/parse_relation.c:3689 -#, fuzzy, c-format -#| msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." +#: parser/parse_relation.c:3693 +#, c-format msgid "There are columns named \"%s\", but they are in tables that cannot be referenced from this part of the query." -msgstr "Hay una columna llamada «%s» en la tabla «%s», pero no puede ser referenciada desde esta parte de la consulta." +msgstr "Hay columnas llamadas «%s», pero están en tablas que no pueden ser referenciadas desde esta parte de la consulta." -#: parser/parse_relation.c:3691 +#: parser/parse_relation.c:3695 #, c-format msgid "Try using a table-qualified name." -msgstr "" +msgstr "Intente usar un nombre calificado con nombre de tabla." -#: parser/parse_relation.c:3699 +#: parser/parse_relation.c:3703 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "Hay una columna llamada «%s» en la tabla «%s», pero no puede ser referenciada desde esta parte de la consulta." -#: parser/parse_relation.c:3702 +#: parser/parse_relation.c:3706 #, c-format msgid "To reference that column, you must mark this subquery with LATERAL." -msgstr "" +msgstr "Para hacer referencia a esa columna, debe marcar esta subconsulta con LATERAL." -#: parser/parse_relation.c:3704 +#: parser/parse_relation.c:3708 #, c-format msgid "To reference that column, you must use a table-qualified name." -msgstr "" +msgstr "Para hacer referencia a esa columna, debe usar un nombre calificado con nombre de tabla." -#: parser/parse_relation.c:3724 +#: parser/parse_relation.c:3728 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "Probablemente quiera hacer referencia a la columna «%s.%s»." -#: parser/parse_relation.c:3738 +#: parser/parse_relation.c:3742 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "Probablemente quiera hacer referencia a la columna «%s.%s» o la columna «%s.%s»." -#: parser/parse_target.c:481 parser/parse_target.c:796 +#: parser/parse_target.c:480 parser/parse_target.c:795 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "no se puede asignar a la columna de sistema «%s»" -#: parser/parse_target.c:509 +#: parser/parse_target.c:508 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "no se puede definir un elemento de array a DEFAULT" -#: parser/parse_target.c:514 +#: parser/parse_target.c:513 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "no se puede definir un subcampo a DEFAULT" -#: parser/parse_target.c:588 +#: parser/parse_target.c:587 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "la columna «%s» es de tipo %s pero la expresión es de tipo %s" -#: parser/parse_target.c:780 +#: parser/parse_target.c:779 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" msgstr "no se puede asignar al campo «%s» de la columna «%s» porque su tipo %s no es un tipo compuesto" -#: parser/parse_target.c:789 +#: parser/parse_target.c:788 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" msgstr "no se puede asignar al campo «%s» de la columna «%s» porque no existe esa columna en el tipo de dato %s" -#: parser/parse_target.c:869 +#: parser/parse_target.c:877 #, c-format msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" msgstr "la asignación subindexada a «%s» requiere tipo %s pero la expresión es de tipo %s" -#: parser/parse_target.c:879 +#: parser/parse_target.c:887 #, c-format msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "el subcampo «%s» es de tipo %s pero la expresión es de tipo %s" -#: parser/parse_target.c:1314 +#: parser/parse_target.c:1327 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * sin especificar tablas no es válido" @@ -18333,8 +18665,8 @@ msgstr "la referencia a %%TYPE es inapropiada (demasiados nombres con punto): %s msgid "type reference %s converted to %s" msgstr "la referencia al tipo %s convertida a %s" -#: parser/parse_type.c:278 parser/parse_type.c:813 utils/cache/typcache.c:390 -#: utils/cache/typcache.c:445 +#: parser/parse_type.c:278 parser/parse_type.c:813 utils/cache/typcache.c:397 +#: utils/cache/typcache.c:452 #, c-format msgid "type \"%s\" is only a shell" msgstr "el tipo «%s» está inconcluso" @@ -18354,336 +18686,330 @@ msgstr "los modificadores de tipo deben ser constantes simples o identificadores msgid "invalid type name \"%s\"" msgstr "el nombre de tipo «%s» no es válido" -#: parser/parse_utilcmd.c:264 +#: parser/parse_utilcmd.c:263 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "no se puede crear una tabla particionada como hija de herencia" -#: parser/parse_utilcmd.c:580 +#: parser/parse_utilcmd.c:475 +#, c-format +msgid "cannot set logged status of a temporary sequence" +msgstr "no se puede cambiar el estado «logged» de una secuencia temporal" + +#: parser/parse_utilcmd.c:611 #, c-format msgid "array of serial is not implemented" msgstr "array de serial no está implementado" -#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 -#: parser/parse_utilcmd.c:730 +#: parser/parse_utilcmd.c:690 parser/parse_utilcmd.c:702 +#: parser/parse_utilcmd.c:761 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "las declaraciones NULL/NOT NULL no son coincidentes para la columna «%s» de la tabla «%s»" -#: parser/parse_utilcmd.c:683 +#: parser/parse_utilcmd.c:714 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "múltiples valores default especificados para columna «%s» de tabla «%s»" -#: parser/parse_utilcmd.c:700 +#: parser/parse_utilcmd.c:731 #, c-format msgid "identity columns are not supported on typed tables" msgstr "las columnas identidad no está soportadas en tablas tipadas" -#: parser/parse_utilcmd.c:704 +#: parser/parse_utilcmd.c:735 #, c-format msgid "identity columns are not supported on partitions" msgstr "las columnas identidad no están soportadas en particiones" -#: parser/parse_utilcmd.c:713 +#: parser/parse_utilcmd.c:744 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "múltiples especificaciones de identidad para columna «%s» de tabla «%s»" -#: parser/parse_utilcmd.c:743 +#: parser/parse_utilcmd.c:774 #, c-format msgid "generated columns are not supported on typed tables" msgstr "las columnas generadas no están soportadas en tablas tipadas" -#: parser/parse_utilcmd.c:747 +#: parser/parse_utilcmd.c:778 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "múltiples cláusulas de generación especificadas para columna «%s» de tabla «%s»" -#: parser/parse_utilcmd.c:765 parser/parse_utilcmd.c:880 +#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:911 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "las restricciones de llave primaria no están soportadas en tablas foráneas" -#: parser/parse_utilcmd.c:774 parser/parse_utilcmd.c:890 +#: parser/parse_utilcmd.c:805 parser/parse_utilcmd.c:921 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "las restricciones unique no están soportadas en tablas foráneas" -#: parser/parse_utilcmd.c:819 +#: parser/parse_utilcmd.c:850 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "tanto el valor por omisión como identidad especificados para columna «%s» de tabla «%s»" -#: parser/parse_utilcmd.c:827 +#: parser/parse_utilcmd.c:858 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "tanto el valor por omisión como expresión de generación especificados para columna «%s» de tabla «%s»" -#: parser/parse_utilcmd.c:835 +#: parser/parse_utilcmd.c:866 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "tanto identidad como expresión de generación especificados para columna «%s» de tabla «%s»" -#: parser/parse_utilcmd.c:900 +#: parser/parse_utilcmd.c:931 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "las restricciones de exclusión no están soportadas en tablas foráneas" -#: parser/parse_utilcmd.c:906 -#, c-format -msgid "exclusion constraints are not supported on partitioned tables" -msgstr "las restricciones de exclusión no están soportadas en tablas particionadas" - -#: parser/parse_utilcmd.c:971 +#: parser/parse_utilcmd.c:996 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE no está soportado para la creación de tablas foráneas" -#: parser/parse_utilcmd.c:984 -#, fuzzy, c-format -#| msgid "relation \"%s\" in %s clause not found in FROM clause" +#: parser/parse_utilcmd.c:1009 +#, c-format msgid "relation \"%s\" is invalid in LIKE clause" -msgstr "la relación «%s» en la cláusula %s no fue encontrada en la cláusula FROM" +msgstr "la relación «%s» no es válida en cláusula LIKE" -#: parser/parse_utilcmd.c:1741 parser/parse_utilcmd.c:1849 +#: parser/parse_utilcmd.c:1736 parser/parse_utilcmd.c:1844 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "El índice «%s» contiene una referencia a la fila completa (whole-row)." -#: parser/parse_utilcmd.c:2236 +#: parser/parse_utilcmd.c:2242 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "no se puede usar un índice existente en CREATE TABLE" -#: parser/parse_utilcmd.c:2256 +#: parser/parse_utilcmd.c:2262 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "el índice «%s» ya está asociado a una restricción" -#: parser/parse_utilcmd.c:2271 -#, c-format -msgid "index \"%s\" is not valid" -msgstr "el índice «%s» no es válido" - -#: parser/parse_utilcmd.c:2277 +#: parser/parse_utilcmd.c:2283 #, c-format msgid "\"%s\" is not a unique index" msgstr "«%s» no es un índice único" -#: parser/parse_utilcmd.c:2278 parser/parse_utilcmd.c:2285 -#: parser/parse_utilcmd.c:2292 parser/parse_utilcmd.c:2369 +#: parser/parse_utilcmd.c:2284 parser/parse_utilcmd.c:2291 +#: parser/parse_utilcmd.c:2298 parser/parse_utilcmd.c:2375 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "No se puede crear una restricción de llave primaria o única usando un índice así." -#: parser/parse_utilcmd.c:2284 +#: parser/parse_utilcmd.c:2290 #, c-format msgid "index \"%s\" contains expressions" msgstr "el índice «%s» contiene expresiones" -#: parser/parse_utilcmd.c:2291 +#: parser/parse_utilcmd.c:2297 #, c-format msgid "\"%s\" is a partial index" msgstr "«%s» es un índice parcial" -#: parser/parse_utilcmd.c:2303 +#: parser/parse_utilcmd.c:2309 #, c-format msgid "\"%s\" is a deferrable index" msgstr "«%s» no es un índice postergable (deferrable)" -#: parser/parse_utilcmd.c:2304 +#: parser/parse_utilcmd.c:2310 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "No se puede crear una restricción no postergable usando un índice postergable." -#: parser/parse_utilcmd.c:2368 +#: parser/parse_utilcmd.c:2374 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "el índice «%s» columna número %d no tiene comportamiento de ordenamiento por omisión" -#: parser/parse_utilcmd.c:2525 +#: parser/parse_utilcmd.c:2531 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "la columna «%s» aparece dos veces en llave primaria" -#: parser/parse_utilcmd.c:2531 +#: parser/parse_utilcmd.c:2537 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "la columna «%s» aparece dos veces en restricción unique" -#: parser/parse_utilcmd.c:2878 +#: parser/parse_utilcmd.c:2871 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "las expresiones y predicados de índice sólo pueden referirse a la tabla en indexación" -#: parser/parse_utilcmd.c:2950 +#: parser/parse_utilcmd.c:2943 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "las expresiones estadísticas sólo pueden referirse a la tabla que está siendo referida" -#: parser/parse_utilcmd.c:2993 +#: parser/parse_utilcmd.c:2986 #, c-format msgid "rules on materialized views are not supported" msgstr "las reglas en vistas materializadas no están soportadas" -#: parser/parse_utilcmd.c:3053 +#: parser/parse_utilcmd.c:3046 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "la condición WHERE de la regla no puede contener referencias a otras relaciones" -#: parser/parse_utilcmd.c:3125 +#: parser/parse_utilcmd.c:3118 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "las reglas con condiciones WHERE sólo pueden tener acciones SELECT, INSERT, UPDATE o DELETE" -#: parser/parse_utilcmd.c:3143 parser/parse_utilcmd.c:3244 -#: rewrite/rewriteHandler.c:537 rewrite/rewriteManip.c:1082 +#: parser/parse_utilcmd.c:3136 parser/parse_utilcmd.c:3237 +#: rewrite/rewriteHandler.c:544 rewrite/rewriteManip.c:1096 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "las sentencias UNION/INTERSECT/EXCEPT condicionales no están implementadas" -#: parser/parse_utilcmd.c:3161 +#: parser/parse_utilcmd.c:3154 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "una regla ON SELECT no puede usar OLD" -#: parser/parse_utilcmd.c:3165 +#: parser/parse_utilcmd.c:3158 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "una regla ON SELECT no puede usar NEW" -#: parser/parse_utilcmd.c:3174 +#: parser/parse_utilcmd.c:3167 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "una regla ON INSERT no puede usar OLD" -#: parser/parse_utilcmd.c:3180 +#: parser/parse_utilcmd.c:3173 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "una regla ON DELETE no puede usar NEW" -#: parser/parse_utilcmd.c:3208 +#: parser/parse_utilcmd.c:3201 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "no se puede hacer referencia a OLD dentro de una consulta WITH" -#: parser/parse_utilcmd.c:3215 +#: parser/parse_utilcmd.c:3208 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "no se puede hacer referencia a NEW dentro de una consulta WITH" -#: parser/parse_utilcmd.c:3667 +#: parser/parse_utilcmd.c:3664 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "cláusula DEFERRABLE mal puesta" -#: parser/parse_utilcmd.c:3672 parser/parse_utilcmd.c:3687 +#: parser/parse_utilcmd.c:3669 parser/parse_utilcmd.c:3684 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "no se permiten múltiples cláusulas DEFERRABLE/NOT DEFERRABLE" -#: parser/parse_utilcmd.c:3682 +#: parser/parse_utilcmd.c:3679 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "la cláusula NOT DEFERRABLE está mal puesta" -#: parser/parse_utilcmd.c:3695 parser/parse_utilcmd.c:3721 gram.y:6011 +#: parser/parse_utilcmd.c:3692 parser/parse_utilcmd.c:3718 gram.y:6114 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "una restricción declarada INITIALLY DEFERRED debe ser DEFERRABLE" -#: parser/parse_utilcmd.c:3703 +#: parser/parse_utilcmd.c:3700 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "la cláusula INITIALLY DEFERRED está mal puesta" -#: parser/parse_utilcmd.c:3708 parser/parse_utilcmd.c:3734 +#: parser/parse_utilcmd.c:3705 parser/parse_utilcmd.c:3731 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "no se permiten múltiples cláusulas INITIALLY IMMEDIATE/DEFERRED" -#: parser/parse_utilcmd.c:3729 +#: parser/parse_utilcmd.c:3726 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "la cláusula INITIALLY IMMEDIATE está mal puesta" -#: parser/parse_utilcmd.c:3922 +#: parser/parse_utilcmd.c:3919 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATE especifica un esquema (%s) diferente del que se está creando (%s)" -#: parser/parse_utilcmd.c:3957 +#: parser/parse_utilcmd.c:3954 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "«%s» no es una tabla particionada" -#: parser/parse_utilcmd.c:3964 +#: parser/parse_utilcmd.c:3961 #, c-format msgid "table \"%s\" is not partitioned" -msgstr "«la tabla %s» no está particionada" +msgstr "la tabla «%s» no está particionada" -#: parser/parse_utilcmd.c:3971 +#: parser/parse_utilcmd.c:3968 #, c-format msgid "index \"%s\" is not partitioned" msgstr "el índice «%s» no está particionado" -#: parser/parse_utilcmd.c:4011 +#: parser/parse_utilcmd.c:4008 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "una tabla particionada por hash no puede tener una partición default" -#: parser/parse_utilcmd.c:4028 +#: parser/parse_utilcmd.c:4025 #, c-format msgid "invalid bound specification for a hash partition" msgstr "especificación de borde no válida para partición de hash" -#: parser/parse_utilcmd.c:4034 partitioning/partbounds.c:4803 +#: parser/parse_utilcmd.c:4031 partitioning/partbounds.c:4802 #, c-format msgid "modulus for hash partition must be an integer value greater than zero" msgstr "el módulo para una partición hash debe ser un valor entero mayor que cero" -#: parser/parse_utilcmd.c:4041 partitioning/partbounds.c:4811 +#: parser/parse_utilcmd.c:4038 partitioning/partbounds.c:4810 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "remanente en partición hash debe ser menor que el módulo" -#: parser/parse_utilcmd.c:4054 +#: parser/parse_utilcmd.c:4051 #, c-format msgid "invalid bound specification for a list partition" msgstr "especificación de borde no válida para partición de lista" -#: parser/parse_utilcmd.c:4107 +#: parser/parse_utilcmd.c:4104 #, c-format msgid "invalid bound specification for a range partition" msgstr "especificación de borde no válida para partición de rango" -#: parser/parse_utilcmd.c:4113 +#: parser/parse_utilcmd.c:4110 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROM debe especificar exactamente un valor por cada columna de particionado" -#: parser/parse_utilcmd.c:4117 +#: parser/parse_utilcmd.c:4114 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TO debe especificar exactamente un valor por cada columna de particionado" -#: parser/parse_utilcmd.c:4231 +#: parser/parse_utilcmd.c:4228 #, c-format msgid "cannot specify NULL in range bound" msgstr "no se puede especificar NULL en borde de rango" -#: parser/parse_utilcmd.c:4280 +#: parser/parse_utilcmd.c:4277 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "cada borde que sigue a un MAXVALUE debe ser también MAXVALUE" -#: parser/parse_utilcmd.c:4287 +#: parser/parse_utilcmd.c:4284 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "cada borde que siga a un MINVALUE debe ser también MINVALUE" -#: parser/parse_utilcmd.c:4330 +#: parser/parse_utilcmd.c:4327 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "el valor especificado no puede ser convertido al tipo %s para la columna «%s»" @@ -18696,12 +19022,12 @@ msgstr "UESCAPE debe ser seguido por un literal de cadena simple" msgid "invalid Unicode escape character" msgstr "carácter de escape Unicode no válido" -#: parser/parser.c:347 scan.l:1390 +#: parser/parser.c:347 scan.l:1393 #, c-format msgid "invalid Unicode escape value" msgstr "valor de escape Unicode no válido" -#: parser/parser.c:494 utils/adt/varlena.c:6506 scan.l:701 +#: parser/parser.c:494 utils/adt/varlena.c:6640 scan.l:716 #, c-format msgid "invalid Unicode escape" msgstr "valor de escape Unicode no válido" @@ -18711,8 +19037,8 @@ msgstr "valor de escape Unicode no válido" msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Los escapes Unicode deben ser \\XXXX o \\+XXXXXX." -#: parser/parser.c:523 utils/adt/varlena.c:6531 scan.l:662 scan.l:678 -#: scan.l:694 +#: parser/parser.c:523 utils/adt/varlena.c:6665 scan.l:677 scan.l:693 +#: scan.l:709 #, c-format msgid "invalid Unicode surrogate pair" msgstr "par sustituto (surrogate) Unicode no válido" @@ -18722,89 +19048,89 @@ msgstr "par sustituto (surrogate) Unicode no válido" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "el identificador «%s» se truncará a «%.*s»" -#: partitioning/partbounds.c:2921 +#: partitioning/partbounds.c:2920 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "la partición «%s» está en conflicto con la partición default «%s» existente" -#: partitioning/partbounds.c:2973 partitioning/partbounds.c:2992 -#: partitioning/partbounds.c:3014 +#: partitioning/partbounds.c:2972 partitioning/partbounds.c:2991 +#: partitioning/partbounds.c:3013 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "cada módulo de partición hash debe ser un factor del próximo mayor módulo" -#: partitioning/partbounds.c:2974 partitioning/partbounds.c:3015 +#: partitioning/partbounds.c:2973 partitioning/partbounds.c:3014 #, c-format msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." msgstr "El nuevo módulo %d no es un factor de %d, el módulo de la partición existente «%s»." -#: partitioning/partbounds.c:2993 +#: partitioning/partbounds.c:2992 #, c-format msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." msgstr "El nuevo módulo %d no es divisible para %d, el módulo de la partición existente «%s»." -#: partitioning/partbounds.c:3128 +#: partitioning/partbounds.c:3127 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "borde de rango vació especificado para la partición «%s»" -#: partitioning/partbounds.c:3130 +#: partitioning/partbounds.c:3129 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "El límite inferior %s especificado es mayor o igual al límite superior %s." -#: partitioning/partbounds.c:3238 +#: partitioning/partbounds.c:3237 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "la partición «%s» traslaparía con la partición «%s»" -#: partitioning/partbounds.c:3355 +#: partitioning/partbounds.c:3354 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "se omitió recorrer la tabla foránea «%s» que es una partición de la partición default «%s»" -#: partitioning/partbounds.c:4807 +#: partitioning/partbounds.c:4806 #, c-format msgid "remainder for hash partition must be an integer value greater than or equal to zero" msgstr "remanente en partición hash debe ser un valor entero mayor que o igual a cero" -#: partitioning/partbounds.c:4831 +#: partitioning/partbounds.c:4830 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "«%s» es una tabla particionada por hash" -#: partitioning/partbounds.c:4842 partitioning/partbounds.c:4959 +#: partitioning/partbounds.c:4841 partitioning/partbounds.c:4958 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "el número de columnas de particionamiento (%d) no coincide con el número de llaves de particionamiento provistas (%d)" -#: partitioning/partbounds.c:4864 +#: partitioning/partbounds.c:4863 #, c-format msgid "column %d of the partition key has type %s, but supplied value is of type %s" msgstr "la columna %d de la llave de particionamiento tiene tipo «%s», pero el valor dado es de tipo «%s»" -#: partitioning/partbounds.c:4896 +#: partitioning/partbounds.c:4895 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "la columna %d de la llave de particionamiento tiene tipo «%s», pero el valor dado es de tipo «%s»" -#: port/pg_sema.c:209 port/pg_shmem.c:708 port/posix_sema.c:209 -#: port/sysv_sema.c:323 port/sysv_shmem.c:708 +#: port/pg_sema.c:209 port/pg_shmem.c:717 port/posix_sema.c:209 +#: port/sysv_sema.c:329 port/sysv_shmem.c:717 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "no se pudo hacer stat al directorio de datos «%s»: %m" -#: port/pg_shmem.c:223 port/sysv_shmem.c:223 +#: port/pg_shmem.c:224 port/sysv_shmem.c:224 #, c-format msgid "could not create shared memory segment: %m" msgstr "no se pudo crear el segmento de memoria compartida: %m" -#: port/pg_shmem.c:224 port/sysv_shmem.c:224 +#: port/pg_shmem.c:225 port/sysv_shmem.c:225 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "La llamada a sistema fallida fue shmget(key=%lu, size=%zu, 0%o)." -#: port/pg_shmem.c:228 port/sysv_shmem.c:228 +#: port/pg_shmem.c:229 port/sysv_shmem.c:229 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" @@ -18813,7 +19139,7 @@ msgstr "" "Este error normalmente significa que la petición de un segmento de memoria compartida de PostgreSQL excedió el parámetro SHMMAX del kernel, o posiblemente que es menor que el parámetro SHMMIN del kernel.\n" "La documentación de PostgreSQL contiene más información acerca de la configuración de memoria compartida." -#: port/pg_shmem.c:235 port/sysv_shmem.c:235 +#: port/pg_shmem.c:236 port/sysv_shmem.c:236 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" @@ -18822,7 +19148,7 @@ msgstr "" "Este error normalmente significa que la petición de un segmento de memoria compartida de PostgreSQL excedió el parámetro SHMALL del kernel. Puede ser necesario reconfigurar el kernel con un SHMALL mayor.\n" "La documentación de PostgreSQL contiene más información acerca de la configuración de memoria compartida." -#: port/pg_shmem.c:241 port/sysv_shmem.c:241 +#: port/pg_shmem.c:242 port/sysv_shmem.c:242 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" @@ -18831,62 +19157,62 @@ msgstr "" "Este error *no* significa que se haya quedado sin espacio en disco. Ocurre cuando se han usado todos los IDs de memoria compartida disponibles, en cuyo caso puede incrementar el parámetro SHMMNI del kernel, o bien porque se ha alcanzado el límite total de memoria compartida.\n" "La documentación de PostgreSQL contiene más información acerca de la configuración de memoria compartida." -#: port/pg_shmem.c:583 port/sysv_shmem.c:583 port/win32_shmem.c:641 +#: port/pg_shmem.c:584 port/sysv_shmem.c:584 port/win32_shmem.c:646 #, c-format -msgid "huge_page_size must be 0 on this platform." -msgstr "huge_page_size debe ser 0 en esta plataforma." +msgid "\"huge_page_size\" must be 0 on this platform." +msgstr "«huge_page_size» debe ser 0 en esta plataforma." -#: port/pg_shmem.c:646 port/sysv_shmem.c:646 +#: port/pg_shmem.c:655 port/sysv_shmem.c:655 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "no se pudo mapear memoria compartida anónima: %m" -#: port/pg_shmem.c:648 port/sysv_shmem.c:648 +#: port/pg_shmem.c:657 port/sysv_shmem.c:657 #, c-format -msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." -msgstr "Este error normalmente significa que la petición de un segmento de memoria compartida de PostgreSQL excedía la memoria disponible, el espacio de intercambio (swap), o las huge pages. Para reducir el tamaño de la petición (actualmente %zu bytes), reduzca el uso de memoria compartida de PostgreSQL, quizás reduciendo el parámetro shared_buffers o el parámetro max_connections." +msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing \"shared_buffers\" or \"max_connections\"." +msgstr "Este error normalmente significa que la petición de un segmento de memoria compartida de PostgreSQL excedía la memoria disponible, el espacio de intercambio (swap), o las huge pages. Para reducir el tamaño de la petición (actualmente %zu bytes), reduzca el uso de memoria compartida de PostgreSQL, quizás reduciendo el parámetro «shared_buffers» o el parámetro «max_connections»." -#: port/pg_shmem.c:716 port/sysv_shmem.c:716 +#: port/pg_shmem.c:725 port/sysv_shmem.c:725 #, c-format msgid "huge pages not supported on this platform" msgstr "las huge pages no están soportadas en esta plataforma" -#: port/pg_shmem.c:723 port/sysv_shmem.c:723 +#: port/pg_shmem.c:732 port/sysv_shmem.c:732 #, c-format -msgid "huge pages not supported with the current shared_memory_type setting" -msgstr "las huge pages no están soportadas con la configuración actual de shared_memory_type" +msgid "huge pages not supported with the current \"shared_memory_type\" setting" +msgstr "las huge pages no están soportadas con la configuración actual de «shared_memory_type»" -#: port/pg_shmem.c:783 port/sysv_shmem.c:783 utils/init/miscinit.c:1351 +#: port/pg_shmem.c:798 port/sysv_shmem.c:798 utils/init/miscinit.c:1401 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "el bloque de memoria compartida preexistente (clave %lu, ID %lu) aún está en uso" -#: port/pg_shmem.c:786 port/sysv_shmem.c:786 utils/init/miscinit.c:1353 +#: port/pg_shmem.c:801 port/sysv_shmem.c:801 utils/init/miscinit.c:1403 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "Termine cualquier proceso de servidor asociado al directorio de datos «%s»." -#: port/sysv_sema.c:120 +#: port/sysv_sema.c:126 #, c-format msgid "could not create semaphores: %m" msgstr "no se pudo crear semáforos: %m" -#: port/sysv_sema.c:121 +#: port/sysv_sema.c:127 #, c-format msgid "Failed system call was semget(%lu, %d, 0%o)." msgstr "La llamada a sistema fallida fue semget(%lu, %d, 0%o)." -#: port/sysv_sema.c:125 +#: port/sysv_sema.c:131 #, c-format msgid "" -"This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its max_connections parameter.\n" +"This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its \"max_connections\" parameter.\n" "The PostgreSQL documentation contains more information about configuring your system for PostgreSQL." msgstr "" "Este error *no* significa que se haya quedado sin espacio en disco.\n" -"Ocurre cuando se alcanza el límite del sistema del número de semáforos (SEMMNI), o bien cuando se excede el total de semáforos del sistema (SEMMNS).Necesita incrementar el parámetro respectivo del kernel. Alternativamente, reduzca el consumo de semáforos de PostgreSQL reduciendo el parámetro max_connections.\n" +"Ocurre cuando se alcanza el límite del sistema del número de semáforos (SEMMNI), o bien cuando se excede el total de semáforos del sistema (SEMMNS). Necesita incrementar el parámetro respectivo del kernel. Alternativamente, reduzca el consumo de semáforos de PostgreSQL reduciendo el parámetro «max_connections».\n" "La documentación de PostgreSQL contiene más información acerca de cómo configurar su sistema para PostgreSQL." -#: port/sysv_sema.c:155 +#: port/sysv_sema.c:161 #, c-format msgid "You possibly need to raise your kernel's SEMVMX value to be at least %d. Look into the PostgreSQL documentation for details." msgstr "Probablemente necesita incrementar el valor SEMVMX del kernel hasta al menos %d. Examine la documentación de PostgreSQL para obtener más detalles." @@ -19011,1188 +19337,1079 @@ msgstr "La llamada a sistema fallida fue DuplicateHandle." msgid "Failed system call was MapViewOfFileEx." msgstr "La llamada a sistema fallida fue MapViewOfFileEx." -#: postmaster/autovacuum.c:417 -#, c-format -msgid "could not fork autovacuum launcher process: %m" -msgstr "no se pudo iniciar el lanzador autovacuum: %m" - -#: postmaster/autovacuum.c:764 +#: postmaster/autovacuum.c:686 #, c-format msgid "autovacuum worker took too long to start; canceled" msgstr "proceso ayudante autovacuum tomó demasiado tiempo para iniciarse; cancelado" -#: postmaster/autovacuum.c:1489 -#, c-format -msgid "could not fork autovacuum worker process: %m" -msgstr "no se pudo lanzar el proceso «autovacuum worker»: %m" - -#: postmaster/autovacuum.c:2322 +#: postmaster/autovacuum.c:2203 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "autovacuum: eliminando tabla temporal huérfana «%s.%s.%s»" -#: postmaster/autovacuum.c:2558 +#: postmaster/autovacuum.c:2439 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "vacuum automático de la tabla «%s.%s.%s»" -#: postmaster/autovacuum.c:2561 +#: postmaster/autovacuum.c:2442 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "análisis automático de la tabla «%s.%s.%s»" -#: postmaster/autovacuum.c:2755 +#: postmaster/autovacuum.c:2636 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "procesando elemento de tarea de la tabla «%s.%s.%s»" -#: postmaster/autovacuum.c:3369 +#: postmaster/autovacuum.c:3254 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "autovacuum no fue iniciado debido a un error de configuración" -#: postmaster/autovacuum.c:3370 +#: postmaster/autovacuum.c:3255 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Active la opción «track_counts»." -#: postmaster/bgworker.c:259 +#: postmaster/bgworker.c:260 #, c-format msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" msgstr "estado inconsistente de proceso ayudante (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:669 -#, fuzzy, c-format -#| msgid "background worker \"%s\": only dynamic background workers can request notification" +#: postmaster/bgworker.c:651 +#, c-format msgid "background worker \"%s\": background workers without shared memory access are not supported" -msgstr "proceso ayudante «%s»: sólo los ayudantes dinámicos pueden pedir notificaciones" +msgstr "proceso ayudante «%s»: los ayudantes sin acceso a memoria compartida no están soportdos" -#: postmaster/bgworker.c:680 +#: postmaster/bgworker.c:662 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "proceso ayudante «%s»: no se puede solicitar una conexión a base de datos si está iniciando en el momento de inicio de postmaster" -#: postmaster/bgworker.c:694 +#: postmaster/bgworker.c:676 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "proceso ayudante «%s»: intervalo de reinicio no válido" -#: postmaster/bgworker.c:709 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "proceso ayudante «%s»: los ayudantes paralelos no pueden ser configurados «restart»" -#: postmaster/bgworker.c:733 tcop/postgres.c:3255 +#: postmaster/bgworker.c:715 tcop/postgres.c:3312 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "terminando el proceso ayudante «%s» debido a una orden del administrador" -#: postmaster/bgworker.c:890 +#: postmaster/bgworker.c:888 #, c-format -msgid "background worker \"%s\": must be registered in shared_preload_libraries" -msgstr "proceso ayudante «%s»: debe ser registrado en shared_preload_libraries" +msgid "background worker \"%s\": must be registered in \"shared_preload_libraries\"" +msgstr "proceso ayudante «%s»: debe ser registrado en «shared_preload_libraries»" -#: postmaster/bgworker.c:902 +#: postmaster/bgworker.c:911 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "proceso ayudante «%s»: sólo los ayudantes dinámicos pueden pedir notificaciones" -#: postmaster/bgworker.c:917 +#: postmaster/bgworker.c:926 #, c-format msgid "too many background workers" msgstr "demasiados procesos ayudantes" -#: postmaster/bgworker.c:918 +#: postmaster/bgworker.c:927 #, c-format msgid "Up to %d background worker can be registered with the current settings." msgid_plural "Up to %d background workers can be registered with the current settings." msgstr[0] "Hasta %d proceso ayudante puede registrarse con la configuración actual." msgstr[1] "Hasta %d procesos ayudantes pueden registrarse con la configuración actual." -# FIXME a %s would be nice here -#: postmaster/bgworker.c:922 +#: postmaster/bgworker.c:931 postmaster/checkpointer.c:445 #, c-format -msgid "Consider increasing the configuration parameter \"max_worker_processes\"." -msgstr "Considere incrementar el parámetro de configuración «max_worker_processes»." +msgid "Consider increasing the configuration parameter \"%s\"." +msgstr "Considere incrementar el parámetro de configuración «%s»." -#: postmaster/checkpointer.c:431 +#: postmaster/checkpointer.c:441 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" msgstr[0] "los puntos de control están ocurriendo con demasiada frecuencia (cada %d segundo)" msgstr[1] "los puntos de control están ocurriendo con demasiada frecuencia (cada %d segundos)" -# FIXME a %s would be nice here -#: postmaster/checkpointer.c:435 -#, c-format -msgid "Consider increasing the configuration parameter \"max_wal_size\"." -msgstr "Considere incrementar el parámetro de configuración «max_wal_size»." - -#: postmaster/checkpointer.c:1059 +#: postmaster/checkpointer.c:1067 #, c-format msgid "checkpoint request failed" -msgstr "falló la petición de punto de control" +msgstr "falló la petición de checkpoint" -#: postmaster/checkpointer.c:1060 +#: postmaster/checkpointer.c:1068 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Vea los mensajes recientes en el registro del servidor para obtener más detalles." -#: postmaster/pgarch.c:416 +#: postmaster/launch_backend.c:381 #, c-format -msgid "archive_mode enabled, yet archiving is not configured" -msgstr "" +msgid "could not execute server process \"%s\": %m" +msgstr "no se pudo lanzar el proceso servidor «%s»: %m" + +#: postmaster/launch_backend.c:434 +#, c-format +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "no se pudo crear mapeo de archivo de parámetros de servidor: código de error %lu" + +#: postmaster/launch_backend.c:442 +#, c-format +msgid "could not map backend parameter memory: error code %lu" +msgstr "no se pudo mapear memoria para parámetros de servidor: código de error %lu" + +#: postmaster/launch_backend.c:459 +#, c-format +msgid "subprocess command line too long" +msgstr "orden de subproceso demasiado larga" + +#: postmaster/launch_backend.c:477 +#, c-format +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "llamada a CreateProcess() falló: %m (código de error %lu)" + +#: postmaster/launch_backend.c:504 +#, c-format +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "no se pudo desmapear la vista del archivo de parámetros de servidor: código de error %lu" + +#: postmaster/launch_backend.c:508 +#, c-format +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "no se pudo cerrar el archivo de parámetros de servidor: código de error %lu" + +#: postmaster/launch_backend.c:530 +#, c-format +msgid "giving up after too many tries to reserve shared memory" +msgstr "renunciar después de demasiados intentos de reservar memoria compartida" + +#: postmaster/launch_backend.c:531 +#, c-format +msgid "This might be caused by ASLR or antivirus software." +msgstr "Esto podría deberse a ASLR o un software antivirus." + +#: postmaster/launch_backend.c:834 +#, c-format +msgid "could not duplicate socket %d for use in backend: error code %d" +msgstr "no se pudo duplicar el socket %d para su empleo en el backend: código de error %d" + +#: postmaster/launch_backend.c:866 +#, c-format +msgid "could not create inherited socket: error code %d\n" +msgstr "no se pudo crear el socket heradado: código de error %d\n" + +#: postmaster/launch_backend.c:895 +#, c-format +msgid "could not open backend variables file \"%s\": %m\n" +msgstr "no se pudo abrir el archivo de variables de servidor «%s»: %m\n" + +#: postmaster/launch_backend.c:901 +#, c-format +msgid "could not read from backend variables file \"%s\": %m\n" +msgstr "no se pudo leer el archivo de variables de servidor «%s»: %m\n" + +#: postmaster/launch_backend.c:912 +#, c-format +msgid "could not read startup data from backend variables file \"%s\": %m\n" +msgstr "no se pudo leer el archivo de variables de servidor «%s»: %m\n" + +#: postmaster/launch_backend.c:924 +#, c-format +msgid "could not remove file \"%s\": %m\n" +msgstr "no se pudo eliminar el archivo «%s»: %m\n" + +#: postmaster/launch_backend.c:940 +#, c-format +msgid "could not map view of backend variables: error code %lu\n" +msgstr "no se pudo mapear la vista del archivo de variables: código de error %lu\n" + +#: postmaster/launch_backend.c:959 +#, c-format +msgid "could not unmap view of backend variables: error code %lu\n" +msgstr "no se pudo desmapear la vista del archivo de variables: código de error %lu\n" + +#: postmaster/launch_backend.c:966 +#, c-format +msgid "could not close handle to backend parameter variables: error code %lu\n" +msgstr "no se pudo cerrar el archivo de variables de servidor: código de error %lu\n" + +#: postmaster/pgarch.c:428 +#, c-format +msgid "\"archive_mode\" enabled, yet archiving is not configured" +msgstr "«archive_mode» está activado, pero el archivado no está configurado" -#: postmaster/pgarch.c:438 +#: postmaster/pgarch.c:452 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "eliminando archivo de estado huérfano «%s»" -#: postmaster/pgarch.c:448 +#: postmaster/pgarch.c:462 #, c-format msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" msgstr "la eliminación del archivo de estado huérfano «%s» falló demasiadas veces, se tratará de nuevo después" -#: postmaster/pgarch.c:484 +#: postmaster/pgarch.c:498 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "el archivado del archivo de WAL «%s» falló demasiadas veces, se tratará de nuevo más tarde" -#: postmaster/pgarch.c:791 postmaster/pgarch.c:830 +#: postmaster/pgarch.c:879 postmaster/pgarch.c:918 #, c-format -msgid "both archive_command and archive_library set" -msgstr "" +msgid "both \"archive_command\" and \"archive_library\" set" +msgstr "tanto «archive_command» como «archive_library» están definidos" -#: postmaster/pgarch.c:792 postmaster/pgarch.c:831 +#: postmaster/pgarch.c:880 postmaster/pgarch.c:919 #, c-format -msgid "Only one of archive_command, archive_library may be set." -msgstr "" +msgid "Only one of \"archive_command\", \"archive_library\" may be set." +msgstr "Sólo uno de «archive_command», «archive_library» puede ser definido." -#: postmaster/pgarch.c:809 +#: postmaster/pgarch.c:897 #, c-format msgid "restarting archiver process because value of \"archive_library\" was changed" msgstr "reiniciando el proceso archivador porque el valor de «archive_library» cambió" -#: postmaster/pgarch.c:846 +#: postmaster/pgarch.c:934 #, c-format msgid "archive modules have to define the symbol %s" -msgstr "" +msgstr "los módulos de archivado tienen que definir el símbolo %s" -#: postmaster/pgarch.c:852 +#: postmaster/pgarch.c:940 #, c-format msgid "archive modules must register an archive callback" msgstr "los módulos de archivado deben registrar un callback de archivado" -#: postmaster/postmaster.c:759 +#: postmaster/postmaster.c:661 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: argumento no válido para la opción -f: «%s»\n" -#: postmaster/postmaster.c:832 +#: postmaster/postmaster.c:734 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: argumento no válido para la opción -t: «%s»\n" -#: postmaster/postmaster.c:855 +#: postmaster/postmaster.c:757 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: argumento no válido: «%s»\n" -#: postmaster/postmaster.c:923 -#, fuzzy, c-format -#| msgid "%s: superuser_reserved_connections (%d) must be less than max_connections (%d)\n" -msgid "%s: superuser_reserved_connections (%d) plus reserved_connections (%d) must be less than max_connections (%d)\n" -msgstr "%s: superuser_reserved_connections (%d) debe ser menor que max_connections (%d)\n" +#: postmaster/postmaster.c:825 +#, c-format +msgid "%s: \"superuser_reserved_connections\" (%d) plus \"reserved_connections\" (%d) must be less than \"max_connections\" (%d)\n" +msgstr "%s: «superuser_reserved_connections» (%d) más «reserved_connections» (%d) debe ser menor que «max_connections» (%d)\n" + +#: postmaster/postmaster.c:833 +#, c-format +msgid "WAL archival cannot be enabled when \"wal_level\" is \"minimal\"" +msgstr "el archivador de WAL no puede activarse cuando «wal_level» es «minimal»" -#: postmaster/postmaster.c:931 +#: postmaster/postmaster.c:836 #, c-format -msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" -msgstr "el archivador de WAL no puede activarse cuando wal_level es «minimal»" +msgid "WAL streaming (\"max_wal_senders\" > 0) requires \"wal_level\" to be \"replica\" or \"logical\"" +msgstr "el flujo de WAL («max_wal_senders» > 0) requiere que «wal_level» sea «replica» o «logical»" -#: postmaster/postmaster.c:934 +#: postmaster/postmaster.c:839 #, c-format -msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" -msgstr "el flujo de WAL (max_wal_senders > 0) requiere wal_level «replica» o «logical»" +msgid "WAL cannot be summarized when \"wal_level\" is \"minimal\"" +msgstr "no se puede sumarizar WAL cuando «wal_level» es «minimal»" -#: postmaster/postmaster.c:942 +#: postmaster/postmaster.c:847 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: las tablas de palabras clave de fecha no son válidas, arréglelas\n" -#: postmaster/postmaster.c:1099 +#: postmaster/postmaster.c:1004 #, c-format msgid "could not create I/O completion port for child queue" msgstr "no se pudo crear el port E/S de reporte de completitud para la cola de procesos hijos" -#: postmaster/postmaster.c:1164 +#: postmaster/postmaster.c:1069 #, c-format msgid "ending log output to stderr" msgstr "terminando la salida de registro a stderr" -#: postmaster/postmaster.c:1165 +#: postmaster/postmaster.c:1070 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "La salida futura del registro será enviada al destino de log «%s»." -#: postmaster/postmaster.c:1176 +#: postmaster/postmaster.c:1081 #, c-format msgid "starting %s" msgstr "iniciando %s" -#: postmaster/postmaster.c:1236 +#: postmaster/postmaster.c:1143 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "no se pudo crear el socket de escucha para «%s»" -#: postmaster/postmaster.c:1242 +#: postmaster/postmaster.c:1149 #, c-format msgid "could not create any TCP/IP sockets" msgstr "no se pudo crear ningún socket TCP/IP" -#: postmaster/postmaster.c:1274 +#: postmaster/postmaster.c:1181 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "DNSServiceRegister() falló: código de error %ld" -#: postmaster/postmaster.c:1325 +#: postmaster/postmaster.c:1234 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "no se pudo crear el socket de dominio Unix en el directorio «%s»" -#: postmaster/postmaster.c:1331 +#: postmaster/postmaster.c:1240 #, c-format msgid "could not create any Unix-domain sockets" msgstr "no se pudo crear ningún socket de dominio Unix" -#: postmaster/postmaster.c:1342 +#: postmaster/postmaster.c:1251 #, c-format msgid "no socket created for listening" msgstr "no se creó el socket de atención" -#: postmaster/postmaster.c:1373 +#: postmaster/postmaster.c:1282 #, c-format -msgid "%s: could not change permissions of external PID file \"%s\": %s\n" -msgstr "%s: no se pudo cambiar los permisos del archivo de PID externo «%s»: %s\n" +msgid "%s: could not change permissions of external PID file \"%s\": %m\n" +msgstr "%s: no se pudo cambiar los permisos del archivo de PID externo «%s»: %m\n" -#: postmaster/postmaster.c:1377 +#: postmaster/postmaster.c:1286 #, c-format -msgid "%s: could not write external PID file \"%s\": %s\n" -msgstr "%s: no pudo escribir en el archivo externo de PID «%s»: %s\n" +msgid "%s: could not write external PID file \"%s\": %m\n" +msgstr "%s: no pudo escribir en el archivo externo de PID «%s»: %m\n" #. translator: %s is a configuration file -#: postmaster/postmaster.c:1405 utils/init/postinit.c:221 -#, fuzzy, c-format -#| msgid "could not load locale \"%s\"" +#: postmaster/postmaster.c:1314 utils/init/postinit.c:221 +#, c-format msgid "could not load %s" -msgstr "no se pudo cargar la configuración regional «%s»" +msgstr "no se pudo cargar %s" -#: postmaster/postmaster.c:1431 +#: postmaster/postmaster.c:1342 #, c-format msgid "postmaster became multithreaded during startup" msgstr "postmaster se volvió multi-hilo durante la partida" -#: postmaster/postmaster.c:1432 +#: postmaster/postmaster.c:1343 postmaster/postmaster.c:3684 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Defina la variable de ambiente LC_ALL a un valor válido." -#: postmaster/postmaster.c:1533 +#: postmaster/postmaster.c:1442 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: no se pudo localizar la ruta de mi propio ejecutable" -#: postmaster/postmaster.c:1540 +#: postmaster/postmaster.c:1449 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: no se pudo localizar el ejecutable postgres correspondiente" -#: postmaster/postmaster.c:1563 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1472 utils/misc/tzparser.c:341 #, c-format msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." msgstr "Esto puede indicar una instalación de PostgreSQL incompleta, o que el archivo «%s» ha sido movido de la ubicación adecuada." -#: postmaster/postmaster.c:1590 +#: postmaster/postmaster.c:1499 #, c-format msgid "" "%s: could not find the database system\n" "Expected to find it in the directory \"%s\",\n" -"but could not open file \"%s\": %s\n" +"but could not open file \"%s\": %m\n" msgstr "" "%s: no se pudo encontrar el sistema de base de datos\n" "Se esperaba encontrar en el directorio PGDATA «%s»,\n" -"pero no se pudo abrir el archivo «%s»: %s\n" +"pero no se pudo abrir el archivo «%s»: %m\n" #. translator: %s is SIGKILL or SIGABRT -#: postmaster/postmaster.c:1887 -#, fuzzy, c-format -#| msgid "issuing SIGKILL to recalcitrant children" +#: postmaster/postmaster.c:1789 +#, c-format msgid "issuing %s to recalcitrant children" -msgstr "enviando SIGKILL a procesos hijos recalcitrantes" +msgstr "enviando %s a hijos recalcitrantes" -#: postmaster/postmaster.c:1909 +#: postmaster/postmaster.c:1811 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "ejecutando un apagado inmediato porque el archivo de bloqueo del directorio de datos no es válido" -#: postmaster/postmaster.c:1984 postmaster/postmaster.c:2012 -#, c-format -msgid "incomplete startup packet" -msgstr "el paquete de inicio está incompleto" - -#: postmaster/postmaster.c:1996 postmaster/postmaster.c:2029 -#, c-format -msgid "invalid length of startup packet" -msgstr "el de paquete de inicio tiene largo incorrecto" - -#: postmaster/postmaster.c:2058 -#, c-format -msgid "failed to send SSL negotiation response: %m" -msgstr "no se pudo enviar la respuesta de negociación SSL: %m" - -#: postmaster/postmaster.c:2076 -#, c-format -msgid "received unencrypted data after SSL request" -msgstr "se recibieron datos no cifrados después de petición SSL" - -#: postmaster/postmaster.c:2077 postmaster/postmaster.c:2121 -#, c-format -msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." -msgstr "Esto podría ser un error en el software cliente o evidencia de un intento de ataque man-in-the-middle." - -#: postmaster/postmaster.c:2102 -#, c-format -msgid "failed to send GSSAPI negotiation response: %m" -msgstr "no se pudo enviar la respuesta de negociación GSSAPI: %m" - -#: postmaster/postmaster.c:2120 -#, c-format -msgid "received unencrypted data after GSSAPI encryption request" -msgstr "se recibieron datos no cifrados después de petición de cifrado GSSAPI" - -#: postmaster/postmaster.c:2144 -#, c-format -msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" -msgstr "el protocolo %u.%u no está soportado: servidor soporta %u.0 hasta %u.%u" - -#: postmaster/postmaster.c:2211 -#, c-format -msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." -msgstr "Los valores válidos son: «false», 0, «true», 1, «database»." - -#: postmaster/postmaster.c:2252 -#, c-format -msgid "invalid startup packet layout: expected terminator as last byte" -msgstr "el paquete de inicio no es válido: se esperaba un terminador en el último byte" - -#: postmaster/postmaster.c:2269 -#, c-format -msgid "no PostgreSQL user name specified in startup packet" -msgstr "no se especifica un nombre de usuario en el paquete de inicio" - -#: postmaster/postmaster.c:2333 -#, c-format -msgid "the database system is starting up" -msgstr "el sistema de base de datos está iniciándose" - -#: postmaster/postmaster.c:2339 -#, c-format -msgid "the database system is not yet accepting connections" -msgstr "el sistema de bases de datos aún no está aceptando conexiones" - -#: postmaster/postmaster.c:2340 -#, c-format -msgid "Consistent recovery state has not been yet reached." -msgstr "Aún no se ha alcanzado un estado de recuperación consistente." - -#: postmaster/postmaster.c:2344 -#, c-format -msgid "the database system is not accepting connections" -msgstr "el sistema de bases de datos no está aceptando conexiones" - -#: postmaster/postmaster.c:2345 -#, c-format -msgid "Hot standby mode is disabled." -msgstr "El modo hot standby está desactivado." - -#: postmaster/postmaster.c:2350 -#, c-format -msgid "the database system is shutting down" -msgstr "el sistema de base de datos está apagándose" - -#: postmaster/postmaster.c:2355 -#, c-format -msgid "the database system is in recovery mode" -msgstr "el sistema de base de datos está en modo de recuperación" - -#: postmaster/postmaster.c:2360 storage/ipc/procarray.c:491 -#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:353 -#, c-format -msgid "sorry, too many clients already" -msgstr "lo siento, ya tenemos demasiados clientes" - -#: postmaster/postmaster.c:2447 +#: postmaster/postmaster.c:1874 #, c-format msgid "wrong key in cancel request for process %d" msgstr "llave incorrecta en la petición de cancelación para el proceso %d" -#: postmaster/postmaster.c:2459 +#: postmaster/postmaster.c:1886 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "el PID %d en la petición de cancelación no coincidió con ningún proceso" -#: postmaster/postmaster.c:2726 +#: postmaster/postmaster.c:2106 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "se recibió SIGHUP, volviendo a cargar archivos de configuración" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2750 postmaster/postmaster.c:2754 +#: postmaster/postmaster.c:2134 postmaster/postmaster.c:2138 #, c-format msgid "%s was not reloaded" msgstr "%s no fue vuelto a cargar" -#: postmaster/postmaster.c:2764 +#: postmaster/postmaster.c:2148 #, c-format msgid "SSL configuration was not reloaded" msgstr "la configuración SSL no fue vuelta a cargar" -#: postmaster/postmaster.c:2854 +#: postmaster/postmaster.c:2234 #, c-format msgid "received smart shutdown request" msgstr "se recibió petición de apagado inteligente" -#: postmaster/postmaster.c:2895 +#: postmaster/postmaster.c:2275 #, c-format msgid "received fast shutdown request" msgstr "se recibió petición de apagado rápido" -#: postmaster/postmaster.c:2913 +#: postmaster/postmaster.c:2293 #, c-format msgid "aborting any active transactions" msgstr "abortando transacciones activas" -#: postmaster/postmaster.c:2937 +#: postmaster/postmaster.c:2317 #, c-format msgid "received immediate shutdown request" msgstr "se recibió petición de apagado inmediato" -#: postmaster/postmaster.c:3013 +#: postmaster/postmaster.c:2389 #, c-format msgid "shutdown at recovery target" msgstr "apagándose al alcanzar el destino de recuperación" -#: postmaster/postmaster.c:3031 postmaster/postmaster.c:3067 +#: postmaster/postmaster.c:2407 postmaster/postmaster.c:2443 msgid "startup process" msgstr "proceso de inicio" -#: postmaster/postmaster.c:3034 +#: postmaster/postmaster.c:2410 #, c-format msgid "aborting startup due to startup process failure" msgstr "abortando el inicio debido a una falla en el procesamiento de inicio" -#: postmaster/postmaster.c:3107 +#: postmaster/postmaster.c:2485 #, c-format msgid "database system is ready to accept connections" msgstr "el sistema de bases de datos está listo para aceptar conexiones" -#: postmaster/postmaster.c:3128 +#: postmaster/postmaster.c:2506 msgid "background writer process" msgstr "proceso background writer" -#: postmaster/postmaster.c:3175 +#: postmaster/postmaster.c:2553 msgid "checkpointer process" msgstr "proceso checkpointer" -#: postmaster/postmaster.c:3191 +#: postmaster/postmaster.c:2569 msgid "WAL writer process" msgstr "proceso escritor de WAL" -#: postmaster/postmaster.c:3206 +#: postmaster/postmaster.c:2584 msgid "WAL receiver process" msgstr "proceso receptor de WAL" -#: postmaster/postmaster.c:3221 +#: postmaster/postmaster.c:2598 +msgid "WAL summarizer process" +msgstr "proceso sumarizador de WAL" + +#: postmaster/postmaster.c:2613 msgid "autovacuum launcher process" msgstr "proceso lanzador de autovacuum" -#: postmaster/postmaster.c:3239 +#: postmaster/postmaster.c:2631 msgid "archiver process" msgstr "proceso de archivado" -#: postmaster/postmaster.c:3252 +#: postmaster/postmaster.c:2644 msgid "system logger process" msgstr "proceso de log" -#: postmaster/postmaster.c:3309 +#: postmaster/postmaster.c:2661 +msgid "slot sync worker process" +msgstr "proceso sincronizador de slot" + +#: postmaster/postmaster.c:2717 #, c-format msgid "background worker \"%s\"" msgstr "proceso ayudante «%s»" -#: postmaster/postmaster.c:3388 postmaster/postmaster.c:3408 -#: postmaster/postmaster.c:3415 postmaster/postmaster.c:3433 +#: postmaster/postmaster.c:2796 postmaster/postmaster.c:2816 +#: postmaster/postmaster.c:2823 postmaster/postmaster.c:2841 msgid "server process" msgstr "proceso de servidor" -#: postmaster/postmaster.c:3487 +#: postmaster/postmaster.c:2895 #, c-format msgid "terminating any other active server processes" msgstr "terminando todos los otros procesos de servidor activos" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3662 +#: postmaster/postmaster.c:3082 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) terminó con código de salida %d" -#: postmaster/postmaster.c:3664 postmaster/postmaster.c:3676 -#: postmaster/postmaster.c:3686 postmaster/postmaster.c:3697 +#: postmaster/postmaster.c:3084 postmaster/postmaster.c:3096 +#: postmaster/postmaster.c:3106 postmaster/postmaster.c:3117 #, c-format msgid "Failed process was running: %s" msgstr "El proceso que falló estaba ejecutando: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3673 +#: postmaster/postmaster.c:3093 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) fue terminado por una excepción 0x%X" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3683 +#: postmaster/postmaster.c:3103 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) fue terminado por una señal %d: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3695 +#: postmaster/postmaster.c:3115 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) terminó con código %d no reconocido" -#: postmaster/postmaster.c:3903 +#: postmaster/postmaster.c:3331 #, c-format msgid "abnormal database system shutdown" msgstr "apagado anormal del sistema de bases de datos" -#: postmaster/postmaster.c:3929 +#: postmaster/postmaster.c:3357 #, c-format msgid "shutting down due to startup process failure" msgstr "apagando debido a una falla en el procesamiento de inicio" -#: postmaster/postmaster.c:3935 +#: postmaster/postmaster.c:3363 #, c-format -msgid "shutting down because restart_after_crash is off" -msgstr "apagando debido a que restart_after_crash está desactivado" +msgid "shutting down because \"restart_after_crash\" is off" +msgstr "apagando debido a que «restart_after_crash» está desactivado" -#: postmaster/postmaster.c:3947 +#: postmaster/postmaster.c:3375 #, c-format msgid "all server processes terminated; reinitializing" msgstr "todos los procesos fueron terminados; reinicializando" -#: postmaster/postmaster.c:4141 postmaster/postmaster.c:5459 -#: postmaster/postmaster.c:5857 +#: postmaster/postmaster.c:3574 postmaster/postmaster.c:3985 +#: postmaster/postmaster.c:4374 #, c-format msgid "could not generate random cancel key" msgstr "no se pudo generar una llave de cancelación aleatoria" -#: postmaster/postmaster.c:4203 +#: postmaster/postmaster.c:3607 #, c-format msgid "could not fork new process for connection: %m" msgstr "no se pudo lanzar el nuevo proceso para la conexión: %m" -#: postmaster/postmaster.c:4245 +#: postmaster/postmaster.c:3649 msgid "could not fork new process for connection: " msgstr "no se pudo lanzar el nuevo proceso para la conexión: " -#: postmaster/postmaster.c:4351 -#, c-format -msgid "connection received: host=%s port=%s" -msgstr "conexión recibida: host=%s port=%s" - -#: postmaster/postmaster.c:4356 -#, c-format -msgid "connection received: host=%s" -msgstr "conexión recibida: host=%s" - -#: postmaster/postmaster.c:4593 -#, c-format -msgid "could not execute server process \"%s\": %m" -msgstr "no se pudo lanzar el proceso servidor «%s»: %m" - -#: postmaster/postmaster.c:4651 -#, c-format -msgid "could not create backend parameter file mapping: error code %lu" -msgstr "no se pudo crear mapeo de archivo de parámetros de servidor: código de error %lu" - -#: postmaster/postmaster.c:4660 -#, c-format -msgid "could not map backend parameter memory: error code %lu" -msgstr "no se pudo mapear memoria para parámetros de servidor: código de error %lu" - -#: postmaster/postmaster.c:4687 -#, c-format -msgid "subprocess command line too long" -msgstr "orden de subproceso demasiado larga" - -#: postmaster/postmaster.c:4705 -#, c-format -msgid "CreateProcess() call failed: %m (error code %lu)" -msgstr "llamada a CreateProcess() falló: %m (código de error %lu)" - -#: postmaster/postmaster.c:4732 -#, c-format -msgid "could not unmap view of backend parameter file: error code %lu" -msgstr "no se pudo desmapear la vista del archivo de parámetros de servidor: código de error %lu" - -#: postmaster/postmaster.c:4736 -#, c-format -msgid "could not close handle to backend parameter file: error code %lu" -msgstr "no se pudo cerrar el archivo de parámetros de servidor: código de error %lu" - -#: postmaster/postmaster.c:4758 -#, c-format -msgid "giving up after too many tries to reserve shared memory" -msgstr "renunciar después de demasiados intentos de reservar memoria compartida" - -#: postmaster/postmaster.c:4759 -#, c-format -msgid "This might be caused by ASLR or antivirus software." -msgstr "Esto podría deberse a ASLR o un software antivirus." - -#: postmaster/postmaster.c:4932 -#, c-format -msgid "SSL configuration could not be loaded in child process" -msgstr "No se pudo cargar la configuración SSL en proceso secundario" - -#: postmaster/postmaster.c:5057 +#: postmaster/postmaster.c:3683 #, c-format -msgid "Please report this to <%s>." -msgstr "Por favor reporte esto a <%s>." +#| msgid "postmaster became multithreaded during startup" +msgid "postmaster became multithreaded" +msgstr "postmaster se volvió multi-hilo" -#: postmaster/postmaster.c:5125 +#: postmaster/postmaster.c:3752 #, c-format msgid "database system is ready to accept read-only connections" msgstr "el sistema de bases de datos está listo para aceptar conexiones de sólo lectura" -#: postmaster/postmaster.c:5383 -#, c-format -msgid "could not fork startup process: %m" -msgstr "no se pudo lanzar el proceso de inicio: %m" - -#: postmaster/postmaster.c:5387 -#, c-format -msgid "could not fork archiver process: %m" -msgstr "no se pudo lanzar el proceso de archivado: %m" - -#: postmaster/postmaster.c:5391 -#, c-format -msgid "could not fork background writer process: %m" -msgstr "no se pudo lanzar el background writer: %m" - -#: postmaster/postmaster.c:5395 -#, c-format -msgid "could not fork checkpointer process: %m" -msgstr "no se pudo lanzar el checkpointer: %m" - -#: postmaster/postmaster.c:5399 -#, c-format -msgid "could not fork WAL writer process: %m" -msgstr "no se pudo lanzar el proceso escritor de WAL: %m" - -#: postmaster/postmaster.c:5403 -#, c-format -msgid "could not fork WAL receiver process: %m" -msgstr "no se pudo lanzar el proceso receptor de WAL: %m" - -#: postmaster/postmaster.c:5407 +#: postmaster/postmaster.c:3935 #, c-format -msgid "could not fork process: %m" -msgstr "no se pudo lanzar el proceso: %m" +msgid "could not fork \"%s\" process: %m" +msgstr "no se pudo lanzar el proceso «%s»: %m" -#: postmaster/postmaster.c:5608 postmaster/postmaster.c:5635 +#: postmaster/postmaster.c:4173 postmaster/postmaster.c:4207 #, c-format msgid "database connection requirement not indicated during registration" msgstr "el requerimiento de conexión a base de datos no fue indicado durante el registro" -#: postmaster/postmaster.c:5619 postmaster/postmaster.c:5646 +#: postmaster/postmaster.c:4183 postmaster/postmaster.c:4217 #, c-format msgid "invalid processing mode in background worker" msgstr "modo de procesamiento no válido en proceso ayudante" -#: postmaster/postmaster.c:5731 +#: postmaster/postmaster.c:4277 #, c-format -msgid "could not fork worker process: %m" -msgstr "no se pudo lanzar el proceso ayudante: %m" +msgid "could not fork background worker process: %m" +msgstr "no se pudo lanzar el background writer: %m" -#: postmaster/postmaster.c:5843 +#: postmaster/postmaster.c:4360 #, c-format -msgid "no slot available for new worker process" +msgid "no slot available for new background worker process" msgstr "no hay slot disponible para un nuevo proceso ayudante" -#: postmaster/postmaster.c:6174 -#, c-format -msgid "could not duplicate socket %d for use in backend: error code %d" -msgstr "no se pudo duplicar el socket %d para su empleo en el backend: código de error %d" - -#: postmaster/postmaster.c:6206 -#, c-format -msgid "could not create inherited socket: error code %d\n" -msgstr "no se pudo crear el socket heradado: código de error %d\n" - -#: postmaster/postmaster.c:6235 -#, c-format -msgid "could not open backend variables file \"%s\": %s\n" -msgstr "no se pudo abrir el archivo de variables de servidor «%s»: %s\n" - -#: postmaster/postmaster.c:6242 -#, c-format -msgid "could not read from backend variables file \"%s\": %s\n" -msgstr "no se pudo leer el archivo de variables de servidor «%s»: %s\n" - -#: postmaster/postmaster.c:6251 -#, c-format -msgid "could not remove file \"%s\": %s\n" -msgstr "no se pudo eliminar el archivo «%s»: %s\n" - -#: postmaster/postmaster.c:6268 -#, c-format -msgid "could not map view of backend variables: error code %lu\n" -msgstr "no se pudo mapear la vista del archivo de variables: código de error %lu\n" - -#: postmaster/postmaster.c:6277 -#, c-format -msgid "could not unmap view of backend variables: error code %lu\n" -msgstr "no se pudo desmapear la vista del archivo de variables: código de error %lu\n" - -#: postmaster/postmaster.c:6284 -#, c-format -msgid "could not close handle to backend parameter variables: error code %lu\n" -msgstr "no se pudo cerrar el archivo de variables de servidor: código de error %lu\n" - -#: postmaster/postmaster.c:6443 +#: postmaster/postmaster.c:4623 #, c-format msgid "could not read exit code for process\n" msgstr "no se pudo leer el código de salida del proceso\n" -#: postmaster/postmaster.c:6485 +#: postmaster/postmaster.c:4665 #, c-format msgid "could not post child completion status\n" msgstr "no se pudo publicar el estado de completitud del proceso hijo\n" -#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 +#: postmaster/syslogger.c:529 postmaster/syslogger.c:1173 #, c-format msgid "could not read from logger pipe: %m" msgstr "no se pudo leer desde la tubería de log: %m" -#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 +#: postmaster/syslogger.c:629 postmaster/syslogger.c:643 #, c-format msgid "could not create pipe for syslog: %m" msgstr "no se pudo crear la tubería para syslog: %m" -#: postmaster/syslogger.c:677 +#: postmaster/syslogger.c:712 #, c-format msgid "could not fork system logger: %m" msgstr "no se pudo crear el proceso de log: %m" -#: postmaster/syslogger.c:713 +#: postmaster/syslogger.c:731 #, c-format msgid "redirecting log output to logging collector process" msgstr "redirigiendo la salida del registro al proceso recolector de registro" -#: postmaster/syslogger.c:714 +#: postmaster/syslogger.c:732 #, c-format msgid "Future log output will appear in directory \"%s\"." msgstr "La salida futura del registro aparecerá en el directorio «%s»." -#: postmaster/syslogger.c:722 +#: postmaster/syslogger.c:740 #, c-format msgid "could not redirect stdout: %m" msgstr "no se pudo redirigir stdout: %m" -#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 +#: postmaster/syslogger.c:745 postmaster/syslogger.c:762 #, c-format msgid "could not redirect stderr: %m" msgstr "no se pudo redirigir stderr: %m" -#: postmaster/syslogger.c:1177 +#: postmaster/syslogger.c:1128 #, c-format -msgid "could not write to log file: %s\n" -msgstr "no se pudo escribir al archivo de log: %s\n" +msgid "could not write to log file: %m\n" +msgstr "no se pudo escribir al archivo de log: %m\n" -#: postmaster/syslogger.c:1295 +#: postmaster/syslogger.c:1246 #, c-format msgid "could not open log file \"%s\": %m" msgstr "no se pudo abrir el archivo de registro «%s»: %m" -#: postmaster/syslogger.c:1385 +#: postmaster/syslogger.c:1336 #, c-format msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "desactivando rotación automática (use SIGHUP para reactivarla)" -#: regex/regc_pg_locale.c:242 +#: postmaster/walsummarizer.c:740 +#, c-format +msgid "WAL summarization is not progressing" +msgstr "la sumarización de WAL no está progresando" + +#: postmaster/walsummarizer.c:741 +#, c-format +msgid "Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/%X in memory." +msgstr "La sumarización de WAL se necesita hasta %X/%X, pero está detenido en %X/%X en disco y %X/%X en memoria." + +#: postmaster/walsummarizer.c:755 +#, c-format +msgid "still waiting for WAL summarization through %X/%X after %ld second" +msgid_plural "still waiting for WAL summarization through %X/%X after %ld seconds" +msgstr[0] "todavía esperando al resumen de WAL hasta %X/%X después de %ld segundo" +msgstr[1] "todavía esperando al resumen de WAL hasta %X/%X después de %ld segundos" + +#: postmaster/walsummarizer.c:760 +#, c-format +msgid "Summarization has reached %X/%X on disk and %X/%X in memory." +msgstr "El resumen ha alcanzado %X/%X en disco y %X/%X en memoria." + +#: postmaster/walsummarizer.c:1000 +#, c-format +msgid "could not find a valid record after %X/%X" +msgstr "no se pudo encontrar un registro válido después de %X/%X" + +#: postmaster/walsummarizer.c:1045 +#, c-format +msgid "could not read WAL from timeline %u at %X/%X: %s" +msgstr "no se pudo leer WAL del timeline %u en %X/%X: %s" + +#: postmaster/walsummarizer.c:1051 +#, c-format +msgid "could not read WAL from timeline %u at %X/%X" +msgstr "no se pudo leer WAL del timeline %u en %X/%X" + +#: regex/regc_pg_locale.c:244 #, c-format msgid "could not determine which collation to use for regular expression" msgstr "no se pudo determinar qué ordenamiento usar para la expresión regular" -#: regex/regc_pg_locale.c:265 +#: regex/regc_pg_locale.c:262 #, c-format msgid "nondeterministic collations are not supported for regular expressions" msgstr "los ordenamientos no determinísticos no están soportados para expresiones regulares" -#: replication/libpqwalreceiver/libpqwalreceiver.c:197 -#: replication/libpqwalreceiver/libpqwalreceiver.c:280 -#, fuzzy, c-format -#| msgid "redo is not required" +#: replication/libpqwalreceiver/libpqwalreceiver.c:267 +#: replication/libpqwalreceiver/libpqwalreceiver.c:358 +#, c-format msgid "password is required" -msgstr "no se requiere redo" +msgstr "una contraseña es requerida" -#: replication/libpqwalreceiver/libpqwalreceiver.c:198 +#: replication/libpqwalreceiver/libpqwalreceiver.c:268 #, c-format msgid "Non-superuser cannot connect if the server does not request a password." -msgstr "" +msgstr "No-superusuario no se puede conectar si el servidor no pide una constraseña." -#: replication/libpqwalreceiver/libpqwalreceiver.c:199 +#: replication/libpqwalreceiver/libpqwalreceiver.c:269 #, c-format -msgid "Target server's authentication method must be changed. or set password_required=false in the subscription attributes." -msgstr "" +msgid "Target server's authentication method must be changed, or set password_required=false in the subscription parameters." +msgstr "El método de autenticación del servidor de destino debe cambiarse, o definir password_required=false en los parámetros de suscripción." -#: replication/libpqwalreceiver/libpqwalreceiver.c:211 +#: replication/libpqwalreceiver/libpqwalreceiver.c:285 #, c-format msgid "could not clear search path: %s" msgstr "no se pudo limpiar la ruta de búsqueda: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:257 +#: replication/libpqwalreceiver/libpqwalreceiver.c:331 +#: replication/libpqwalreceiver/libpqwalreceiver.c:517 #, c-format msgid "invalid connection string syntax: %s" msgstr "sintaxis de cadena de conexión no válida: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:281 +#: replication/libpqwalreceiver/libpqwalreceiver.c:359 #, c-format msgid "Non-superusers must provide a password in the connection string." -msgstr "" +msgstr "No-superusuario debe proveer una contraseña en la cadena de conexión." -#: replication/libpqwalreceiver/libpqwalreceiver.c:307 +#: replication/libpqwalreceiver/libpqwalreceiver.c:386 #, c-format msgid "could not parse connection string: %s" msgstr "no se pudo interpretar la cadena de conexión: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:380 +#: replication/libpqwalreceiver/libpqwalreceiver.c:459 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "no se pudo recibir el identificador de sistema y el ID de timeline del servidor primario: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:392 -#: replication/libpqwalreceiver/libpqwalreceiver.c:635 +#: replication/libpqwalreceiver/libpqwalreceiver.c:476 +#: replication/libpqwalreceiver/libpqwalreceiver.c:763 #, c-format msgid "invalid response from primary server" msgstr "respuesta no válida del servidor primario" -#: replication/libpqwalreceiver/libpqwalreceiver.c:393 +#: replication/libpqwalreceiver/libpqwalreceiver.c:477 #, c-format msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." msgstr "No se pudo identificar el sistema: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d o más campos." -#: replication/libpqwalreceiver/libpqwalreceiver.c:478 -#: replication/libpqwalreceiver/libpqwalreceiver.c:485 -#: replication/libpqwalreceiver/libpqwalreceiver.c:515 +#: replication/libpqwalreceiver/libpqwalreceiver.c:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:613 +#: replication/libpqwalreceiver/libpqwalreceiver.c:643 #, c-format msgid "could not start WAL streaming: %s" msgstr "no se pudo iniciar el flujo de WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:539 +#: replication/libpqwalreceiver/libpqwalreceiver.c:667 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "no se pudo enviar el mensaje fin-de-flujo al primario: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:562 +#: replication/libpqwalreceiver/libpqwalreceiver.c:690 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "conjunto de resultados inesperado después del fin-de-flujo" -#: replication/libpqwalreceiver/libpqwalreceiver.c:577 +#: replication/libpqwalreceiver/libpqwalreceiver.c:705 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "ocurrió un error mientras se apagaba el flujo COPY: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:587 +#: replication/libpqwalreceiver/libpqwalreceiver.c:715 #, c-format msgid "error reading result of streaming command: %s" msgstr "ocurrió un error mientras se leía la orden de flujo: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:596 -#: replication/libpqwalreceiver/libpqwalreceiver.c:832 +#: replication/libpqwalreceiver/libpqwalreceiver.c:724 +#: replication/libpqwalreceiver/libpqwalreceiver.c:957 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "resultado inesperado después de CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:623 +#: replication/libpqwalreceiver/libpqwalreceiver.c:751 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "no se pudo recibir el archivo de historia de timeline del servidor primario: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:636 +#: replication/libpqwalreceiver/libpqwalreceiver.c:764 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Se esperaba 1 tupla con 2 campos, se obtuvieron %d tuplas con %d campos." -#: replication/libpqwalreceiver/libpqwalreceiver.c:795 -#: replication/libpqwalreceiver/libpqwalreceiver.c:848 -#: replication/libpqwalreceiver/libpqwalreceiver.c:855 +#: replication/libpqwalreceiver/libpqwalreceiver.c:920 +#: replication/libpqwalreceiver/libpqwalreceiver.c:973 +#: replication/libpqwalreceiver/libpqwalreceiver.c:980 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "no se pudo recibir datos desde el flujo de WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:875 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1000 #, c-format msgid "could not send data to WAL stream: %s" msgstr "no se pudo enviar datos al flujo de WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:967 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1101 #, c-format msgid "could not create replication slot \"%s\": %s" -msgstr "no se pudo create el slot de replicación «%s»: %s" +msgstr "no se pudo crear el slot de replicación «%s»: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1140 +#, c-format +msgid "could not alter replication slot \"%s\": %s" +msgstr "no se pudo alterar el slot de replicación «%s»: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1013 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1174 #, c-format msgid "invalid query response" msgstr "respuesta no válida a consulta" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1014 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1175 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Se esperaban %d campos, se obtuvieron %d campos." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1084 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1245 #, c-format msgid "the query interface requires a database connection" msgstr "la interfaz de consulta requiere una conexión a base de datos" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1115 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1277 msgid "empty query" msgstr "consulta vacía" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1121 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1283 msgid "unexpected pipeline mode" msgstr "modo pipeline inesperado" #: replication/logical/applyparallelworker.c:719 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" has started" +#, c-format msgid "logical replication parallel apply worker for subscription \"%s\" has finished" -msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» ha iniciado" +msgstr "el ayudante paralelo «apply» de replicación lógica para la suscripción «%s» ha terminado" -#: replication/logical/applyparallelworker.c:825 -#, fuzzy, c-format -#| msgid "lost connection to parallel worker" +#: replication/logical/applyparallelworker.c:822 +#, c-format msgid "lost connection to the logical replication apply worker" -msgstr "se ha perdido la conexión al ayudante paralelo" - -#: replication/logical/applyparallelworker.c:893 -#, fuzzy, c-format -#| msgid "could not map dynamic shared memory segment" -msgid "unable to map dynamic shared memory segment" -msgstr "no se pudo mapear el segmento de memoria compartida dinámica" +msgstr "se ha perdido la conexión al ayudante paralelo “apply†de replicación" -#: replication/logical/applyparallelworker.c:899 -#, fuzzy, c-format -#| msgid "invalid magic number in dynamic shared memory segment" -msgid "bad magic number in dynamic shared memory segment" -msgstr "número mágico no válido en segmento de memoria compartida dinámica" - -#: replication/logical/applyparallelworker.c:1027 -#: replication/logical/applyparallelworker.c:1029 -#: replication/logical/worker.c:447 -#, fuzzy -#| msgid "lost connection to parallel worker" +#: replication/logical/applyparallelworker.c:1024 +#: replication/logical/applyparallelworker.c:1026 msgid "logical replication parallel apply worker" -msgstr "se ha perdido la conexión al ayudante paralelo" +msgstr "ayudante paralelo “apply†de replicación lógica" -#: replication/logical/applyparallelworker.c:1043 -#, fuzzy, c-format -#| msgid "terminating logical replication worker due to timeout" +#: replication/logical/applyparallelworker.c:1040 +#, c-format msgid "logical replication parallel apply worker exited due to error" -msgstr "terminando el proceso de replicación lógica debido a que se agotó el tiempo de espera" +msgstr "el ayudante paralelo “apply†de replicación lógica terminó debido a un error" -#: replication/logical/applyparallelworker.c:1130 -#: replication/logical/applyparallelworker.c:1303 -#, fuzzy, c-format -#| msgid "lost connection to parallel worker" +#: replication/logical/applyparallelworker.c:1127 +#: replication/logical/applyparallelworker.c:1300 +#, c-format msgid "lost connection to the logical replication parallel apply worker" -msgstr "se ha perdido la conexión al ayudante paralelo" +msgstr "se perdió la conexión al ayudante paralelo “apply†de replicación lógica" -#: replication/logical/applyparallelworker.c:1183 -#, fuzzy, c-format -#| msgid "could not send tuple to shared-memory queue" +#: replication/logical/applyparallelworker.c:1180 +#, c-format msgid "could not send data to shared-memory queue" -msgstr "no se pudo enviar la tupla a la cola en memoria compartida" +msgstr "no se pudo enviar datos a la cola en memoria compartida" -#: replication/logical/applyparallelworker.c:1218 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" +#: replication/logical/applyparallelworker.c:1215 +#, c-format msgid "logical replication apply worker will serialize the remaining changes of remote transaction %u to a file" -msgstr "el ayudante «apply» de replicación lógica para la suscripción %u no se iniciará porque la suscripción fue eliminada durante el inicio" +msgstr "el ayudante paralelo «apply» de replicación lógica serializará los cambios restantes de la transacción remota %u a un archivo" # FIXME see slot.c:779. See also postmaster.c:835 -#: replication/logical/decode.c:180 replication/logical/logical.c:140 -#, fuzzy, c-format -#| msgid "logical decoding requires wal_level >= logical" -msgid "logical decoding on standby requires wal_level >= logical on the primary" -msgstr "la decodificación lógica requiere wal_level >= logical" +#: replication/logical/decode.c:177 replication/logical/logical.c:141 +#, c-format +msgid "logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary" +msgstr "la decodificación lógica en standby requiere «wal_level» >= «logical» en el primario" -#: replication/logical/launcher.c:331 +#: replication/logical/launcher.c:334 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" -msgstr "no se pueden iniciar procesos ayudantes de replicación cuando max_replication_slots = 0" +msgstr "no se pueden iniciar procesos ayudantes de replicación lógica cuando max_replication_slots = 0" -#: replication/logical/launcher.c:424 +#: replication/logical/launcher.c:427 #, c-format msgid "out of logical replication worker slots" -msgstr "se agotaron los slots de procesos ayudantes de replicación" +msgstr "se agotaron los slots de procesos ayudantes de replicación lógica" -#: replication/logical/launcher.c:425 +#: replication/logical/launcher.c:428 replication/logical/launcher.c:514 +#: replication/slot.c:1524 storage/lmgr/lock.c:985 storage/lmgr/lock.c:1023 +#: storage/lmgr/lock.c:2836 storage/lmgr/lock.c:4221 storage/lmgr/lock.c:4286 +#: storage/lmgr/lock.c:4636 storage/lmgr/predicate.c:2469 +#: storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:3881 #, c-format -msgid "You might need to increase max_logical_replication_workers." -msgstr "Puede ser necesario incrementar max_logical_replication_workers." +msgid "You might need to increase \"%s\"." +msgstr "Puede ser necesario incrementar «%s»." -#: replication/logical/launcher.c:498 +#: replication/logical/launcher.c:513 #, c-format msgid "out of background worker slots" msgstr "se acabaron los slots de procesos ayudante" -#: replication/logical/launcher.c:499 -#, c-format -msgid "You might need to increase max_worker_processes." -msgstr "Puede ser necesario incrementar max_worker_processes." - -#: replication/logical/launcher.c:705 +#: replication/logical/launcher.c:720 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "el slot del worker de replicación lógica %d está vacío, no se puede adjuntar" -#: replication/logical/launcher.c:714 +#: replication/logical/launcher.c:729 #, c-format msgid "logical replication worker slot %d is already used by another worker, cannot attach" msgstr "el slot de replicación lógica %d ya está siendo utilizado por otro worker, no se puede adjuntar" # FIXME see slot.c:779. See also postmaster.c:835 -#: replication/logical/logical.c:120 +#: replication/logical/logical.c:121 #, c-format -msgid "logical decoding requires wal_level >= logical" -msgstr "la decodificación lógica requiere wal_level >= logical" +msgid "logical decoding requires \"wal_level\" >= \"logical\"" +msgstr "la decodificación lógica requiere «wal_level» >= «logical»" -#: replication/logical/logical.c:125 +#: replication/logical/logical.c:126 #, c-format msgid "logical decoding requires a database connection" msgstr "decodificación lógica requiere una conexión a una base de datos" -#: replication/logical/logical.c:363 replication/logical/logical.c:517 +#: replication/logical/logical.c:365 replication/logical/logical.c:519 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "no se puede usar un slot de replicación física para decodificación lógica" -#: replication/logical/logical.c:368 replication/logical/logical.c:522 +#: replication/logical/logical.c:370 replication/logical/logical.c:529 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "el slot de replicación «%s» no fue creado en esta base de datos" -#: replication/logical/logical.c:375 +#: replication/logical/logical.c:377 #, c-format msgid "cannot create logical replication slot in transaction that has performed writes" msgstr "no se puede crear un slot de replicación lógica en una transacción que ha efectuado escrituras" -#: replication/logical/logical.c:534 replication/logical/logical.c:541 +#: replication/logical/logical.c:540 +#, c-format +msgid "cannot use replication slot \"%s\" for logical decoding" +msgstr "no se puede usar el slot de replicación «%s» para decodificación lógica" + +#: replication/logical/logical.c:542 replication/slot.c:798 +#: replication/slot.c:829 +#, c-format +msgid "This replication slot is being synchronized from the primary server." +msgstr "Este slot de replicación está siendo sincronizado desde el servidor primario." + +#: replication/logical/logical.c:543 +#, c-format +msgid "Specify another replication slot." +msgstr "Especifique otro slot de replicación." + +#: replication/logical/logical.c:554 replication/logical/logical.c:561 #, c-format msgid "can no longer get changes from replication slot \"%s\"" msgstr "ya no se pueden recibir cambios desde el slot de replicación «%s»" -#: replication/logical/logical.c:536 +#: replication/logical/logical.c:556 #, c-format msgid "This slot has been invalidated because it exceeded the maximum reserved size." msgstr "Este slot ha sido invalidado porque excedió el máximo del tamaño de reserva." -#: replication/logical/logical.c:543 -#, fuzzy, c-format -#| msgid "This slot has been invalidated because it exceeded the maximum reserved size." +#: replication/logical/logical.c:563 +#, c-format msgid "This slot has been invalidated because it was conflicting with recovery." -msgstr "Este slot ha sido invalidado porque excedió el máximo del tamaño de reserva." +msgstr "Este slot ha sido invalidado porque estaba en conflicto con la recuperación." -#: replication/logical/logical.c:608 +#: replication/logical/logical.c:628 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "iniciando la decodificación lógica para el slot «%s»" -#: replication/logical/logical.c:610 +#: replication/logical/logical.c:630 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Transacciones en flujo comprometiendo después de %X/%X, leyendo WAL desde %X/%X." -#: replication/logical/logical.c:758 +#: replication/logical/logical.c:778 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "slot «%s», plugin de salida «%s», en el callback %s, LSN asociado %X/%X" # FIXME must quote callback name? Need a translator: comment? -#: replication/logical/logical.c:764 +#: replication/logical/logical.c:784 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "slot «%s», plugin de salida «%s», en el callback %s" -#: replication/logical/logical.c:935 replication/logical/logical.c:980 -#: replication/logical/logical.c:1025 replication/logical/logical.c:1071 +#: replication/logical/logical.c:955 replication/logical/logical.c:1000 +#: replication/logical/logical.c:1045 replication/logical/logical.c:1091 #, c-format msgid "logical replication at prepare time requires a %s callback" msgstr "durante la preparación, la replicación lógica requiere una función callback %s" -#: replication/logical/logical.c:1303 replication/logical/logical.c:1352 -#: replication/logical/logical.c:1393 replication/logical/logical.c:1479 -#: replication/logical/logical.c:1528 +#: replication/logical/logical.c:1323 replication/logical/logical.c:1372 +#: replication/logical/logical.c:1413 replication/logical/logical.c:1499 +#: replication/logical/logical.c:1548 #, c-format msgid "logical streaming requires a %s callback" msgstr "el flujo lógico requiere una función callback %s" -#: replication/logical/logical.c:1438 +#: replication/logical/logical.c:1458 #, c-format msgid "logical streaming at prepare time requires a %s callback" msgstr "durante la preparación, el flujo lógico requiere una función callback %s" -#: replication/logical/logicalfuncs.c:126 +#: replication/logical/logicalfuncs.c:123 #, c-format msgid "slot name must not be null" msgstr "el nombre de slot no debe ser null" -#: replication/logical/logicalfuncs.c:142 +#: replication/logical/logicalfuncs.c:139 #, c-format msgid "options array must not be null" msgstr "el array de opciones no debe ser null" -#: replication/logical/logicalfuncs.c:159 +#: replication/logical/logicalfuncs.c:156 #, c-format msgid "array must be one-dimensional" msgstr "el array debe ser unidimensional" -#: replication/logical/logicalfuncs.c:165 +#: replication/logical/logicalfuncs.c:162 #, c-format msgid "array must not contain nulls" msgstr "el array no debe contener nulls" -#: replication/logical/logicalfuncs.c:180 utils/adt/json.c:1484 -#: utils/adt/jsonb.c:1403 +#: replication/logical/logicalfuncs.c:177 utils/adt/json.c:1420 +#: utils/adt/jsonb.c:1304 #, c-format msgid "array must have even number of elements" msgstr "el array debe tener un número par de elementos" -#: replication/logical/logicalfuncs.c:227 +#: replication/logical/logicalfuncs.c:224 #, c-format msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" msgstr "el plugin de salida de decodificación lógica «%s» produce salida binaria, pero «%s» espera datos textuales" #: replication/logical/origin.c:190 #, c-format -msgid "cannot query or manipulate replication origin when max_replication_slots = 0" -msgstr "no se puede consultar o manipular orígenes de replicación cuando max_replication_slots = 0" +msgid "cannot query or manipulate replication origin when \"max_replication_slots\" is 0" +msgstr "no se puede consultar o manipular orígenes de replicación cuando «max_replication_slots» = 0" #: replication/logical/origin.c:195 #, c-format @@ -20205,22 +20422,19 @@ msgid "replication origin \"%s\" does not exist" msgstr "no existe el origen de replicación «%s»" #: replication/logical/origin.c:331 -#, fuzzy, c-format -#| msgid "could not create replication slot \"%s\": %s" +#, c-format msgid "could not find free replication origin ID" -msgstr "no se pudo create el slot de replicación «%s»: %s" +msgstr "no se pudo encontrar un ID de origen de replicación disponible" #: replication/logical/origin.c:365 -#, fuzzy, c-format -#| msgid "could not drop replication slot \"%s\" on publisher: %s" +#, c-format msgid "could not drop replication origin with ID %d, in use by PID %d" -msgstr "no se pudo eliminar el slot de replicación «%s» en editor (publisher): %s" +msgstr "no se pudo eliminar el origen de replicación con ID %d, en uso por el PID %d" #: replication/logical/origin.c:492 -#, fuzzy, c-format -#| msgid "replication origin \"%s\" does not exist" +#, c-format msgid "replication origin with ID %d does not exist" -msgstr "no existe el origen de replicación «%s»" +msgstr "no existe el origen de replicación con ID %d" #: replication/logical/origin.c:757 #, c-format @@ -20229,1325 +20443,1582 @@ msgstr "el checkpoint de replicación tiene número mágico erróneo %u en lugar #: replication/logical/origin.c:798 #, c-format -msgid "could not find free replication state, increase max_replication_slots" -msgstr "no se pudo encontrar una estructura de replicación libre, incremente max_replication_slots" +msgid "could not find free replication state, increase \"max_replication_slots\"" +msgstr "no se pudo encontrar una estructura de replicación libre, incremente «max_replication_slots»" #: replication/logical/origin.c:806 -#, fuzzy, c-format -#| msgid "recovery restart point at %X/%X" +#, c-format msgid "recovered replication state of node %d to %X/%X" -msgstr "restartpoint de recuperación en %X/%X" +msgstr "recuperado el estado de replicación del nodo %d a %X/%X" #: replication/logical/origin.c:816 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "el checkpoint del slot de replicación tiene suma de verificación errónea %u, se esperaba %u" -#: replication/logical/origin.c:944 replication/logical/origin.c:1141 -#, fuzzy, c-format -#| msgid "replication slot \"%s\" is active for PID %d" +#: replication/logical/origin.c:944 replication/logical/origin.c:1143 +#, c-format msgid "replication origin with ID %d is already active for PID %d" -msgstr "el slot de replicación «%s» está activo para el PID %d" +msgstr "el origen de replicación con ID %d está activo para el PID %d" -#: replication/logical/origin.c:955 replication/logical/origin.c:1153 -#, fuzzy, c-format -#| msgid "could not find free replication state, increase max_replication_slots" +#: replication/logical/origin.c:955 replication/logical/origin.c:1156 +#, c-format msgid "could not find free replication state slot for replication origin with ID %d" -msgstr "no se pudo encontrar una estructura de replicación libre, incremente max_replication_slots" +msgstr "no se pudo encontrar una estructura de replicación libre para el origen de replicación con el ID %d" -#: replication/logical/origin.c:957 replication/logical/origin.c:1155 -#: replication/slot.c:2086 +#: replication/logical/origin.c:957 replication/logical/origin.c:1158 +#: replication/slot.c:2384 #, c-format -msgid "Increase max_replication_slots and try again." -msgstr "Aumente max_replication_slots y reintente." +msgid "Increase \"max_replication_slots\" and try again." +msgstr "Aumente «max_replication_slots» y reintente." -#: replication/logical/origin.c:1112 +#: replication/logical/origin.c:1114 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "no se puede establecer un destino de replicación cuando ya hay uno definido" -#: replication/logical/origin.c:1196 replication/logical/origin.c:1412 -#: replication/logical/origin.c:1432 +#: replication/logical/origin.c:1199 replication/logical/origin.c:1415 +#: replication/logical/origin.c:1435 #, c-format msgid "no replication origin is configured" msgstr "no hay un destino de replicación configurado" -#: replication/logical/origin.c:1282 +#: replication/logical/origin.c:1285 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "el nombre de origen de replicación «%s» está reservado" -#: replication/logical/origin.c:1284 -#, fuzzy, c-format -#| msgid "Origin names starting with \"pg_\" are reserved." +#: replication/logical/origin.c:1287 +#, c-format msgid "Origin names \"%s\", \"%s\", and names starting with \"pg_\" are reserved." -msgstr "Los nombres de origen que empiezan con «pg_» están reservados." +msgstr "Los nombres de origen «%s», «%s» y los que empiezan con «pg_» están reservados." -#: replication/logical/relation.c:240 +#: replication/logical/relation.c:242 #, c-format msgid "\"%s\"" msgstr "«%s»" -#: replication/logical/relation.c:243 +#: replication/logical/relation.c:245 #, c-format msgid ", \"%s\"" msgstr ", «%s»" -#: replication/logical/relation.c:249 +#: replication/logical/relation.c:251 #, c-format msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" msgstr[0] "a la relación destino de replicación lógica «%s.%s» le falta la columna replicada: %s" msgstr[1] "a la relación destino de replicación lógica «%s.%s» le faltan las columnas replicadas: %s" -#: replication/logical/relation.c:304 +#: replication/logical/relation.c:306 #, c-format msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" msgstr "la relación de destino de replicación lógica «%s.%s» usa columnas de sistemas en el índice REPLICA IDENTITY" -#: replication/logical/relation.c:396 +#: replication/logical/relation.c:398 #, c-format msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "la relación destino de replicación lógica «%s.%s» no existe" -#: replication/logical/reorderbuffer.c:3936 +#: replication/logical/reorderbuffer.c:3999 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "no se pudo escribir al archivo de datos para el XID %u: %m" -#: replication/logical/reorderbuffer.c:4282 -#: replication/logical/reorderbuffer.c:4307 +#: replication/logical/reorderbuffer.c:4345 +#: replication/logical/reorderbuffer.c:4370 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "no se pudo leer desde el archivo de desborde de reorderbuffer: %m" -#: replication/logical/reorderbuffer.c:4286 -#: replication/logical/reorderbuffer.c:4311 +#: replication/logical/reorderbuffer.c:4349 +#: replication/logical/reorderbuffer.c:4374 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "no se pudo leer desde el archivo de desborde de reorderbuffer: se leyeron sólo %d en ve de %u bytes" -#: replication/logical/reorderbuffer.c:4561 +#: replication/logical/reorderbuffer.c:4624 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "no se pudo borrar el archivo «%s» durante la eliminación de pg_replslot/%s/xid*: %m" # FIXME almost duplicated again!? -#: replication/logical/reorderbuffer.c:5057 +#: replication/logical/reorderbuffer.c:5120 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "no se pudo leer del archivo «%s»: se leyeron %d en lugar de %d bytes" -#: replication/logical/snapbuild.c:639 +#: replication/logical/slotsync.c:215 +#, c-format +msgid "could not synchronize replication slot \"%s\" because remote slot precedes local slot" +msgstr "no se puede sincronizar el slot de replicación «%s» porque el slot remoto precede al slot local" + +#: replication/logical/slotsync.c:217 +#, c-format +msgid "The remote slot has LSN %X/%X and catalog xmin %u, but the local slot has LSN %X/%X and catalog xmin %u." +msgstr "El slot remoto tiene LSN %X/%X y xmin de catálogo %u, pero el slot local tiene LSN %X/%X y xmin de catálogo %u." + +#: replication/logical/slotsync.c:459 +#, c-format +msgid "dropped replication slot \"%s\" of database with OID %u" +msgstr "se eliminó el slot de replicación «%s» de la base de datos con OID %u" + +#: replication/logical/slotsync.c:579 +#, c-format +msgid "could not synchronize replication slot \"%s\"" +msgstr "no se pudo sincronizar el slot de replicación «%s»" + +#: replication/logical/slotsync.c:580 +#, c-format +msgid "Logical decoding could not find consistent point from local slot's LSN %X/%X." +msgstr "La decodificación lógica no pudo encontrar un punto consistente desde el LSN del slot local %X/%X." + +#: replication/logical/slotsync.c:589 +#, c-format +msgid "newly created replication slot \"%s\" is sync-ready now" +msgstr "el slot de replicación «%s» recién creado está listo para la sincronización" + +#: replication/logical/slotsync.c:628 +#, c-format +msgid "skipping slot synchronization because the received slot sync LSN %X/%X for slot \"%s\" is ahead of the standby position %X/%X" +msgstr "omitiendo sincronización de slot porque el LSN %X/%X de sincronización recibido para el slot «%s» está adelantado respecto a la posición del standby %X/%X" + +#: replication/logical/slotsync.c:650 +#, c-format +msgid "exiting from slot synchronization because same name slot \"%s\" already exists on the standby" +msgstr "saliendo de la sincronización de slot porque un slot con el mismo nombre «%s» ya existe en el standby" + +#: replication/logical/slotsync.c:819 +#, c-format +msgid "could not fetch failover logical slots info from the primary server: %s" +msgstr "no se pudo obtener la información de slots “failover†de replicación lógica del servidor primario: %s" + +#: replication/logical/slotsync.c:965 +#, c-format +msgid "could not fetch primary_slot_name \"%s\" info from the primary server: %s" +msgstr "no se pudo obtener información del primary_slot_name «%s» del servidor primario: %s" + +#: replication/logical/slotsync.c:967 +#, c-format +msgid "Check if primary_slot_name is configured correctly." +msgstr "Verificando si primary_slot_name está configurado correctamente." + +#: replication/logical/slotsync.c:987 +#, c-format +msgid "cannot synchronize replication slots from a standby server" +msgstr "no puede sincronizar slots de replicación de un servidor standby" + +#. translator: second %s is a GUC variable name +#: replication/logical/slotsync.c:996 +#, c-format +msgid "replication slot \"%s\" specified by \"%s\" does not exist on primary server" +msgstr "el slot de replicación «%s» especificado por «%s» no existe en el servidor primario" + +#. translator: first %s is a connection option; second %s is a GUC +#. variable name +#. +#: replication/logical/slotsync.c:1029 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be specified in \"%s\"" +msgstr "la sincronización de slots de replicación requiere que «%s» esté especificado en «%s»" + +# FIXME see slot.c:779. See also postmaster.c:835 +#: replication/logical/slotsync.c:1050 +#, c-format +msgid "replication slot synchronization requires \"wal_level\" >= \"logical\"" +msgstr "la sincronización de slots de replicación requiere «wal_level» >= «logical»" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1063 replication/logical/slotsync.c:1091 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be set" +msgstr "la sincronización de slots de replicación requiere que «%s» esté definido" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1077 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be enabled" +msgstr "la sincronización de slots de replicación requiere que «%s» esté activado" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1129 +#, c-format +msgid "replication slot synchronization worker will shut down because \"%s\" is disabled" +msgstr "el proceso de sincronización de slots de replicación terminará porque «%s» está desactivado" + +#: replication/logical/slotsync.c:1138 +#, c-format +msgid "replication slot synchronization worker will restart because of a parameter change" +msgstr "el proceso de sincronización de slots de replicación se reiniciará debido a un cambio de parámetro" + +#: replication/logical/slotsync.c:1162 +#, c-format +msgid "replication slot synchronization worker is shutting down on receiving SIGINT" +msgstr "el trabajador de sincronización de slots de replicación está apagándose al recibir SIGINT" + +#: replication/logical/slotsync.c:1287 +#, c-format +msgid "cannot synchronize replication slots when standby promotion is ongoing" +msgstr "no se puede sincronizar los slots de replicación cuando la promoción de standby está teniendo lugar" + +#: replication/logical/slotsync.c:1295 +#, c-format +msgid "cannot synchronize replication slots concurrently" +msgstr "no se puede sincronizar slots de replicación concurrentemente" + +#: replication/logical/slotsync.c:1403 +#, c-format +msgid "slot sync worker started" +msgstr "iniciado el trabajador de sincronización de slots" + +#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:900 +#: replication/walreceiver.c:307 +#, c-format +msgid "could not connect to the primary server: %s" +msgstr "no se pudo conectar al servidor primario: %s" + +#: replication/logical/snapbuild.c:653 #, c-format msgid "initial slot snapshot too large" msgstr "el snapshot inicial del slot es demasiado grande" # FIXME: snapshot? instantánea? -#: replication/logical/snapbuild.c:693 +#: replication/logical/snapbuild.c:707 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" msgstr[0] "se exportó un snapshot de decodificación lógica: «%s» con %u ID de transacción" msgstr[1] "se exportó un snapshot de decodificación lógica: «%s» con %u IDs de transacción" -#: replication/logical/snapbuild.c:1388 replication/logical/snapbuild.c:1480 -#: replication/logical/snapbuild.c:1992 +#: replication/logical/snapbuild.c:1404 replication/logical/snapbuild.c:1501 +#: replication/logical/snapbuild.c:2017 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "la decodificación lógica encontró un punto consistente en %X/%X" -#: replication/logical/snapbuild.c:1390 +#: replication/logical/snapbuild.c:1406 #, c-format msgid "There are no running transactions." msgstr "No hay transacciones en ejecución." -#: replication/logical/snapbuild.c:1432 +#: replication/logical/snapbuild.c:1453 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "decodificación lógica encontró punto de inicio en %X/%X" -#: replication/logical/snapbuild.c:1434 replication/logical/snapbuild.c:1458 +#: replication/logical/snapbuild.c:1455 replication/logical/snapbuild.c:1479 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Esperando que las (aproximadamente %d) transacciones más antiguas que %u terminen." -#: replication/logical/snapbuild.c:1456 +#: replication/logical/snapbuild.c:1477 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "la decodificación lógica encontró un punto consistente inicial en %X/%X" -#: replication/logical/snapbuild.c:1482 +#: replication/logical/snapbuild.c:1503 #, c-format msgid "There are no old transactions anymore." msgstr "Ya no hay transacciones antiguas en ejecución." # FIXME "snapbuild"? -#: replication/logical/snapbuild.c:1883 +#: replication/logical/snapbuild.c:1904 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "el archivo de estado de snapbuild «%s» tiene número mágico erróneo: %u en lugar de %u" -#: replication/logical/snapbuild.c:1889 +#: replication/logical/snapbuild.c:1910 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "el archivo de estado de snapbuild «%s» tiene versión no soportada: %u en vez de %u" -#: replication/logical/snapbuild.c:1930 +#: replication/logical/snapbuild.c:1951 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "suma de verificación no coincidente para el archivo de estado de snapbuild «%s»: es %u, debería ser %u" -#: replication/logical/snapbuild.c:1994 +#: replication/logical/snapbuild.c:2019 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "La decodificación lógica comenzará usando el snapshot guardado." -#: replication/logical/snapbuild.c:2101 +#: replication/logical/snapbuild.c:2126 #, c-format msgid "could not parse file name \"%s\"" msgstr "no se pudo interpretar el nombre de archivo «%s»" -#: replication/logical/tablesync.c:152 +#: replication/logical/tablesync.c:161 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "el ayudante de sincronización de tabla de replicación lógica para la suscripción «%s», tabla «%s» ha terminado" -#: replication/logical/tablesync.c:621 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" +#: replication/logical/tablesync.c:641 +#, c-format msgid "logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled" -msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se reiniciará por un cambio de parámetro" +msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se reiniciará para activar «two_phase»" -#: replication/logical/tablesync.c:796 replication/logical/tablesync.c:938 +#: replication/logical/tablesync.c:827 replication/logical/tablesync.c:969 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" -msgstr "no se pudo obtener información de la tabla «%s.%s» del editor (publisher): %s" +msgstr "no se pudo obtener información de la tabla «%s.%s» del publicador: %s" -#: replication/logical/tablesync.c:803 +#: replication/logical/tablesync.c:834 #, c-format msgid "table \"%s.%s\" not found on publisher" -msgstr "la tabla \"%s.%s\" no fue encontrada en el editor (publisher)" +msgstr "la tabla \"%s.%s\" no fue encontrada en el publicador" -#: replication/logical/tablesync.c:861 -#, fuzzy, c-format -#| msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" +#: replication/logical/tablesync.c:892 +#, c-format msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" -msgstr "no se pudo obtener información de la tabla «%s.%s» del editor (publisher): %s" +msgstr "no se pudo obtener información de la lista de columnas para la tabla «%s.%s» del publicador: %s" -#: replication/logical/tablesync.c:1040 -#, fuzzy, c-format -#| msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" +#: replication/logical/tablesync.c:1071 +#, c-format msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" -msgstr "no se pudo obtener información de la tabla «%s.%s» del editor (publisher): %s" +msgstr "no se pudo obtener información de la cláusula WHERE para la tabla «%s.%s» del publicador: %s" -#: replication/logical/tablesync.c:1191 +#: replication/logical/tablesync.c:1230 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "no se pudo iniciar la copia de contenido inicial para de la tabla «%s.%s»: %s" -#: replication/logical/tablesync.c:1398 replication/logical/worker.c:2387 -#, c-format -msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" -msgstr "" - -#: replication/logical/tablesync.c:1413 +#: replication/logical/tablesync.c:1429 #, c-format msgid "table copy could not start transaction on publisher: %s" -msgstr "la copia de la tabla no pudo iniciar una transacción en el editor (publisher): %s" +msgstr "la copia de la tabla no pudo iniciar una transacción en el publicador: %s" -#: replication/logical/tablesync.c:1455 +#: replication/logical/tablesync.c:1472 #, c-format msgid "replication origin \"%s\" already exists" msgstr "el origen de replicación «%s» ya existe" -#: replication/logical/tablesync.c:1468 +#: replication/logical/tablesync.c:1505 replication/logical/worker.c:2361 #, c-format -msgid "table copy could not finish transaction on publisher: %s" -msgstr "la copia de tabla no pudo terminar la transacción en el editor (publisher): %s" - -#: replication/logical/worker.c:445 -#, fuzzy -#| msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" -msgid "logical replication table synchronization worker" -msgstr "el ayudante de sincronización de tabla de replicación lógica para la suscripción «%s», tabla «%s» ha iniciado" +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "el usuario «%s» no puede replicar en relaciones con seguridad de registros activa: «%s»" -#: replication/logical/worker.c:449 -#, fuzzy -#| msgid "out of logical replication worker slots" -msgid "logical replication apply worker" -msgstr "se agotaron los slots de procesos ayudantes de replicación" +#: replication/logical/tablesync.c:1518 +#, c-format +msgid "table copy could not finish transaction on publisher: %s" +msgstr "la copia de tabla no pudo terminar la transacción en el publicador: %s" -#: replication/logical/worker.c:512 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" has started" +#: replication/logical/worker.c:481 +#, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop" -msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» ha iniciado" +msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se detendrá" -#: replication/logical/worker.c:514 +#: replication/logical/worker.c:483 #, c-format msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." -msgstr "" +msgstr "No se puede gestionar replicación en flujo usando procesos en paralelo hasta que todas las tablas han sido sincronizadas." -#: replication/logical/worker.c:876 replication/logical/worker.c:991 +#: replication/logical/worker.c:852 replication/logical/worker.c:967 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "el formato de datos binarios es incorrecto en columna de replicación lógica %d" -#: replication/logical/worker.c:2526 +#: replication/logical/worker.c:2500 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" -msgstr "el editor (publisher) no envía la columna identidad de réplica esperada por la relación de destino de replicación lógica «%s.%s»" +msgstr "el publicador no envía la columna identidad de réplica esperada por la relación de destino de replicación lógica «%s.%s»" -#: replication/logical/worker.c:2533 +#: replication/logical/worker.c:2507 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "la relación destino de replicación lógica «%s.%s» no tiene índice REPLICA IDENTITY ni PRIMARY KEY y la relación publicada no tiene REPLICA IDENTITY FULL" -#: replication/logical/worker.c:3384 -#, fuzzy, c-format -#| msgid "invalid standby message type \"%c\"" -msgid "invalid logical replication message type \"%c\"" -msgstr "el tipo «%c» de mensaje del standby no es válido" +#: replication/logical/worker.c:3371 +#, c-format +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "tipo de mensaje de replicación lógica no válido «??? (%d)»" -#: replication/logical/worker.c:3556 +#: replication/logical/worker.c:3543 #, c-format msgid "data stream from publisher has ended" msgstr "el flujo de datos del publisher ha terminado" -#: replication/logical/worker.c:3707 +#: replication/logical/worker.c:3697 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "terminando el proceso de replicación lógica debido a que se agotó el tiempo de espera" -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:3902 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" -msgid "%s for subscription \"%s\" will stop because the subscription was removed" +#: replication/logical/worker.c:3891 +#, c-format +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se detendrá porque la suscripción fue eliminada" -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:3916 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" -msgid "%s for subscription \"%s\" will stop because the subscription was disabled" +#: replication/logical/worker.c:3905 +#, c-format +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se detendrá porque la suscripción fue inhabilitada" -#: replication/logical/worker.c:3947 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" +#: replication/logical/worker.c:3936 +#, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" -msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se reiniciará por un cambio de parámetro" +msgstr "el ayudante paralelo «apply» de replicación lógica para la suscripción «%s» se reiniciará por un cambio de parámetro" -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:3952 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" -msgid "%s for subscription \"%s\" will restart because of a parameter change" +#: replication/logical/worker.c:3940 +#, c-format +msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» se reiniciará por un cambio de parámetro" -#. translator: %s is the name of logical replication worker -#: replication/logical/worker.c:4476 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" -msgid "%s for subscription %u will not start because the subscription was removed during startup" +#: replication/logical/worker.c:3954 +#, c-format +msgid "logical replication parallel apply worker for subscription \"%s\" will stop because the subscription owner's superuser privileges have been revoked" +msgstr "el proceso “apply†paralelo de replicación lógica para la suscripción «%s» se detendrá porque los privilegios de superusuario del dueño de la suscripción han sido revocados" + +#: replication/logical/worker.c:3958 +#, c-format +msgid "logical replication worker for subscription \"%s\" will restart because the subscription owner's superuser privileges have been revoked" +msgstr "el proceso de replicación lógica para la suscripción «%s» se reiniciará porque los privilegios de superusuario del dueño de la suscripción han sido revocados" + +#: replication/logical/worker.c:4478 +#, c-format +msgid "subscription has no replication slot set" +msgstr "la suscripción no tiene un slot de replicación establecido" + +#: replication/logical/worker.c:4591 +#, c-format +msgid "logical replication worker for subscription %u will not start because the subscription was removed during startup" msgstr "el ayudante «apply» de replicación lógica para la suscripción %u no se iniciará porque la suscripción fue eliminada durante el inicio" -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:4492 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" -msgid "%s for subscription \"%s\" will not start because the subscription was disabled during startup" +#: replication/logical/worker.c:4607 +#, c-format +msgid "logical replication worker for subscription \"%s\" will not start because the subscription was disabled during startup" msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» no se iniciará porque la suscripción fue inhabilitada durante el inicio" -#: replication/logical/worker.c:4509 +#: replication/logical/worker.c:4631 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "el ayudante de sincronización de tabla de replicación lógica para la suscripción «%s», tabla «%s» ha iniciado" -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:4515 -#, fuzzy, c-format -#| msgid "logical replication apply worker for subscription \"%s\" has started" -msgid "%s for subscription \"%s\" has started" +#: replication/logical/worker.c:4636 +#, c-format +msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "el ayudante «apply» de replicación lógica para la suscripción «%s» ha iniciado" -#: replication/logical/worker.c:4590 +#: replication/logical/worker.c:4758 #, c-format -msgid "subscription has no replication slot set" -msgstr "la suscripción no tiene un slot de replicación establecido" - -#: replication/logical/worker.c:4757 -#, fuzzy, c-format -#| msgid "cursor \"%s\" has been declared but not opened" msgid "subscription \"%s\" has been disabled because of an error" -msgstr "el cursor «%s» fue declarado pero no abierto" +msgstr "la suscripción «%s» ha sido inhabilitada debido a un error" -#: replication/logical/worker.c:4805 -#, fuzzy, c-format -#| msgid "cannot create logical replication slot in transaction that has performed writes" +#: replication/logical/worker.c:4806 +#, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" -msgstr "no se puede crear un slot de replicación lógica en una transacción que ha efectuado escrituras" +msgstr "iniciando el ignorado en la replicación lógica de la transacción en el LSN %X/%X" -#: replication/logical/worker.c:4819 +#: replication/logical/worker.c:4820 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" -msgstr "" +msgstr "finalizó el ignorado en la replicación lógica de la transacción en el LSN %X/%X" -#: replication/logical/worker.c:4901 -#, fuzzy, c-format -#| msgid "subscription \"%s\" already exists" +#: replication/logical/worker.c:4902 +#, c-format msgid "skip-LSN of subscription \"%s\" cleared" -msgstr "la suscripción «%s» ya existe" +msgstr "el «skip-LSN» de la suscripción «%s» ha sido borrado" -#: replication/logical/worker.c:4902 +#: replication/logical/worker.c:4903 #, c-format msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." -msgstr "" +msgstr "La ubicación de WAL (LSN) de término %X/%X de la transacción remota no coincidió con el skip-LSN %X/%X." -#: replication/logical/worker.c:4928 +#: replication/logical/worker.c:4940 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" -msgstr "" +msgstr "procesando datos remotos de origen de replicación «%s» durante el mensaje de tipo «%s»" -#: replication/logical/worker.c:4932 +#: replication/logical/worker.c:4944 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" -msgstr "" +msgstr "procesando datos remotos de origen de replicación «%s» durante el mensaje de tipo «%s» en la transacción %u" -#: replication/logical/worker.c:4937 +#: replication/logical/worker.c:4949 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" -msgstr "" +msgstr "procesando datos remotos de origen de replicación «%s» durante el mensaje de tipo «%s» en la transacción %u, concluida en %X/%X" -#: replication/logical/worker.c:4948 +#: replication/logical/worker.c:4960 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u" -msgstr "" +msgstr "procesando datos remotos de origen de replicación «%s» durante el mensaje de tipo «%s» para la relación destino de replicación «%s.%s» en la transacción %u" -#: replication/logical/worker.c:4955 +#: replication/logical/worker.c:4967 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" -msgstr "" +msgstr "procesando datos remotos de origen de replicación «%s» durante el mensaje de tipo «%s» para la relación de destino «%s.%s» en la transacción %u, concluida en %X/%X" -#: replication/logical/worker.c:4966 +#: replication/logical/worker.c:4978 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u" -msgstr "" +msgstr "procesando datos remotos de origen de replicación «%s» durante el mensaje de tipo «%s» para la relación de destino «%s.%s» columna «%s» en la transacción %u" -#: replication/logical/worker.c:4974 +#: replication/logical/worker.c:4986 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" -msgstr "" +msgstr "procesando datos remotos de origen de replicación «%s» durante el mensaje de tipo «%s» para la relación de destino «%s.%s» columna «%s» en la transacción %u, concluida en %X/%X" -#: replication/pgoutput/pgoutput.c:318 +#: replication/pgoutput/pgoutput.c:322 #, c-format msgid "invalid proto_version" msgstr "proto_version no válido" -#: replication/pgoutput/pgoutput.c:323 +#: replication/pgoutput/pgoutput.c:327 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version «%s» fuera de rango" -#: replication/pgoutput/pgoutput.c:340 +#: replication/pgoutput/pgoutput.c:344 #, c-format msgid "invalid publication_names syntax" msgstr "sintaxis de publication_names no válida" -#: replication/pgoutput/pgoutput.c:443 -#, fuzzy, c-format -#| msgid "client sent proto_version=%d but we only support protocol %d or lower" -msgid "client sent proto_version=%d but server only supports protocol %d or lower" -msgstr "el cliente envió proto_version=%d pero sólo soportamos el protocolo %d o inferior" +#: replication/pgoutput/pgoutput.c:414 replication/pgoutput/pgoutput.c:418 +#, c-format +msgid "option \"%s\" missing" +msgstr "falta la opción «%s»" -#: replication/pgoutput/pgoutput.c:449 -#, fuzzy, c-format -#| msgid "client sent proto_version=%d but we only support protocol %d or higher" -msgid "client sent proto_version=%d but server only supports protocol %d or higher" -msgstr "el cliente envió proto_version=%d pero sólo soportamos el protocolo %d o superior" +#: replication/pgoutput/pgoutput.c:478 +#, c-format +msgid "client sent proto_version=%d but server only supports protocol %d or lower" +msgstr "el cliente envió proto_version=%d pero el servidor sólo soporta el protocolo %d o inferior" -#: replication/pgoutput/pgoutput.c:455 +#: replication/pgoutput/pgoutput.c:484 #, c-format -msgid "publication_names parameter missing" -msgstr "parámetro publication_names faltante" +msgid "client sent proto_version=%d but server only supports protocol %d or higher" +msgstr "el cliente envió proto_version=%d pero el servidor sólo soporta el protocolo %d o superior" -#: replication/pgoutput/pgoutput.c:469 +#: replication/pgoutput/pgoutput.c:499 #, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" msgstr "la proto_version=%d no soporta flujo, se necesita %d o superior" -#: replication/pgoutput/pgoutput.c:475 -#, fuzzy, c-format -#| msgid "requested proto_version=%d does not support streaming, need %d or higher" +#: replication/pgoutput/pgoutput.c:505 +#, c-format msgid "requested proto_version=%d does not support parallel streaming, need %d or higher" -msgstr "la proto_version=%d no soporta flujo, se necesita %d o superior" +msgstr "la proto_version=%d solicitada no soporta flujo en paralelo, se necesita %d o superior" -#: replication/pgoutput/pgoutput.c:480 +#: replication/pgoutput/pgoutput.c:510 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "se solicitó flujo, pero no está soportado por plugin de salida" -#: replication/pgoutput/pgoutput.c:497 -#, fuzzy, c-format -#| msgid "requested proto_version=%d does not support streaming, need %d or higher" +#: replication/pgoutput/pgoutput.c:524 +#, c-format msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" -msgstr "la proto_version=%d no soporta flujo, se necesita %d o superior" +msgstr "la proto_version=%d solicitada no soporta «two-phase commit», se necesita %d o superior" -#: replication/pgoutput/pgoutput.c:502 -#, fuzzy, c-format -#| msgid "streaming requested, but not supported by output plugin" +#: replication/pgoutput/pgoutput.c:529 +#, c-format msgid "two-phase commit requested, but not supported by output plugin" -msgstr "se solicitó flujo, pero no está soportado por plugin de salida" +msgstr "«two-phase commit» fue solicitado, pero no está soportado por el plugin de salida" -#: replication/slot.c:207 +#: replication/slot.c:260 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "el nombre de slot de replicación «%s» es demasiado corto" -#: replication/slot.c:216 +#: replication/slot.c:269 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "el nombre de slot de replicación «%s» es demasiado largo" -#: replication/slot.c:229 +#: replication/slot.c:282 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "el nombre de slot de replicación «%s» contiene caracteres no válidos" -#: replication/slot.c:231 +#: replication/slot.c:284 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "Los nombres de slots de replicación sólo pueden contener letras minúsculas, números y el carácter «_»." -#: replication/slot.c:285 +#: replication/slot.c:333 +#, c-format +msgid "cannot enable failover for a replication slot created on the standby" +msgstr "no se puede activar “failover†para un slot de replicación creado en el standby" + +#: replication/slot.c:345 replication/slot.c:849 +#, c-format +msgid "cannot enable failover for a temporary replication slot" +msgstr "no se puede activar “failover†para un slot de replicación temporal" + +#: replication/slot.c:370 #, c-format msgid "replication slot \"%s\" already exists" msgstr "el slot de replicación «%s» ya existe" -#: replication/slot.c:295 +#: replication/slot.c:380 #, c-format msgid "all replication slots are in use" msgstr "todos los slots de replicación están en uso" -#: replication/slot.c:296 +#: replication/slot.c:381 #, c-format -msgid "Free one or increase max_replication_slots." -msgstr "Libere uno o incremente max_replication_slots." +msgid "Free one or increase \"max_replication_slots\"." +msgstr "Libere uno o incremente «max_replication_slots»." -#: replication/slot.c:474 replication/slotfuncs.c:736 -#: utils/activity/pgstat_replslot.c:55 utils/adt/genfile.c:774 +#: replication/slot.c:560 replication/slot.c:2450 replication/slotfuncs.c:661 +#: utils/activity/pgstat_replslot.c:56 utils/adt/genfile.c:728 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "no existe el slot de replicación «%s»" -#: replication/slot.c:520 replication/slot.c:1110 +#: replication/slot.c:606 replication/slot.c:1337 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "el slot de replicación «%s» está activo para el PID %d" -#: replication/slot.c:756 replication/slot.c:1638 replication/slot.c:2021 +#: replication/slot.c:638 +#, c-format +msgid "acquired logical replication slot \"%s\"" +msgstr "se adquirió el slot de replicación lógica «%s»" + +#: replication/slot.c:640 +#, c-format +msgid "acquired physical replication slot \"%s\"" +msgstr "se adquirió el slot de replicación física «%s»" + +#: replication/slot.c:729 +#, c-format +msgid "released logical replication slot \"%s\"" +msgstr "se liberó el slot de replicación lógica «%s»" + +#: replication/slot.c:731 +#, c-format +msgid "released physical replication slot \"%s\"" +msgstr "se liberó el slot de replicación física «%s»" + +#: replication/slot.c:797 +#, c-format +msgid "cannot drop replication slot \"%s\"" +msgstr "no se puede eliminar el slot de replicación «%s»" + +#: replication/slot.c:816 +#, c-format +msgid "cannot use %s with a physical replication slot" +msgstr "no se puede usar %s con un slot de replicación física" + +#: replication/slot.c:828 +#, c-format +msgid "cannot alter replication slot \"%s\"" +msgstr "no se puede alterar el slot de replicación «%s»" + +#: replication/slot.c:838 +#, c-format +msgid "cannot enable failover for a replication slot on the standby" +msgstr "no se puede activar el “failover†para un slot de replicación en el standby" + +#: replication/slot.c:969 replication/slot.c:1927 replication/slot.c:2311 #, c-format msgid "could not remove directory \"%s\"" msgstr "no se pudo eliminar el directorio «%s»" -#: replication/slot.c:1145 +#: replication/slot.c:1372 #, c-format -msgid "replication slots can only be used if max_replication_slots > 0" -msgstr "los slots de replicación sólo pueden usarse si max_replication_slots > 0" +msgid "replication slots can only be used if \"max_replication_slots\" > 0" +msgstr "los slots de replicación sólo pueden usarse si «max_replication_slots» > 0" # FIXME see logical.c:81 -#: replication/slot.c:1150 +#: replication/slot.c:1377 #, c-format -msgid "replication slots can only be used if wal_level >= replica" -msgstr "los slots de replicación sólo pueden usarse si wal_level >= replica" +msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" +msgstr "los slots de replicación sólo pueden usarse si «wal_level» >= «replica»" -#: replication/slot.c:1162 -#, fuzzy, c-format -#| msgid "permission denied for publication %s" +#: replication/slot.c:1389 +#, c-format msgid "permission denied to use replication slots" -msgstr "permiso denegado a la publicación %s" +msgstr "permiso denegado a usar slots de replicación" -#: replication/slot.c:1163 +#: replication/slot.c:1390 #, c-format msgid "Only roles with the %s attribute may use replication slots." -msgstr "" +msgstr "Sólo roles con el atributo %s pueden usar slots de replicación." -#: replication/slot.c:1267 +#: replication/slot.c:1498 #, c-format -msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." -msgstr "" +msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu byte." +msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." +msgstr[0] "El restart_lsn %X/%X del slot excede el límite por %llu byte." +msgstr[1] "El restart_lsn %X/%X del slot excede el límite por %llu bytes." -#: replication/slot.c:1272 -#, fuzzy, c-format -#| msgid "Key %s conflicts with existing key %s." +#: replication/slot.c:1506 +#, c-format msgid "The slot conflicted with xid horizon %u." -msgstr "La llave %s está en conflicto con la llave existente %s." +msgstr "El slot estaba en conflicto con el horizonte de XID %u." # FIXME see slot.c:779. See also postmaster.c:835 -#: replication/slot.c:1277 -#, fuzzy -#| msgid "logical decoding requires wal_level >= logical" -msgid "Logical decoding on standby requires wal_level >= logical on the primary server." -msgstr "la decodificación lógica requiere wal_level >= logical" +#: replication/slot.c:1511 +msgid "Logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary server." +msgstr "La decodificación lógica en standby requiere «wal_level» >= «logical» en el primario." -#: replication/slot.c:1285 +#: replication/slot.c:1519 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "terminando el proceso %d para liberar el slot de replicación «%s»" -#: replication/slot.c:1287 -#, fuzzy, c-format -#| msgid "creating replication slot \"%s\"" +#: replication/slot.c:1521 +#, c-format msgid "invalidating obsolete replication slot \"%s\"" -msgstr "creando el slot de replicación «%s»" - -#: replication/slot.c:1290 -#, fuzzy, c-format -#| msgid "You might need to increase max_worker_processes." -msgid "You might need to increase max_slot_wal_keep_size." -msgstr "Puede ser necesario incrementar max_worker_processes." +msgstr "invalidando el slot de replicación obsoleto «%s»" -#: replication/slot.c:1959 +#: replication/slot.c:2249 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "el archivo de slot de replicación «%s» tiene número mágico erróneo: %u en lugar de %u" -#: replication/slot.c:1966 +#: replication/slot.c:2256 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "el archivo de slot de replicación «%s» tiene versión no soportada %u" -#: replication/slot.c:1973 +#: replication/slot.c:2263 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "el archivo de slot de replicación «%s» tiene largo corrupto %u" -#: replication/slot.c:2009 +#: replication/slot.c:2299 +#, c-format +msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" +msgstr "suma de verificación no coincidente en archivo de slot de replicación «%s»: es %u, debería ser %u" + +# FIXME see slot.c:779. See also postmaster.c:835 +#: replication/slot.c:2333 +#, c-format +msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" +msgstr "existe el slot de replicación lógica «%s», pero «wal_level» < «logical»" + +#: replication/slot.c:2335 +#, c-format +msgid "Change \"wal_level\" to be \"logical\" or higher." +msgstr "Cambie «wal_level» a «logical» o superior." + +# FIXME see slot.c:779. See also postmaster.c:835 +#: replication/slot.c:2339 +#, c-format +msgid "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" +msgstr "existe el slot de replicación lógica «%s», pero «wal_level» < «replica»" + +# <> hello vim +#: replication/slot.c:2341 +#, c-format +msgid "Change \"wal_level\" to be \"replica\" or higher." +msgstr "Cambie «wal_level» a «replica» o superior." + +#: replication/slot.c:2383 +#, c-format +msgid "too many replication slots active before shutdown" +msgstr "demasiados slots de replicación activos antes del apagado" + +#: replication/slot.c:2458 +#, c-format +msgid "\"%s\" is not a physical replication slot" +msgstr "«%s» no es un slot de replicación física" + +#: replication/slot.c:2635 +#, c-format +msgid "replication slot \"%s\" specified in parameter \"%s\" does not exist" +msgstr "el slot de replicación «%s» especificado en el parámetro «%s» no existe" + +#: replication/slot.c:2637 replication/slot.c:2671 replication/slot.c:2686 +#, c-format +msgid "Logical replication is waiting on the standby associated with replication slot \"%s\"." +msgstr "La replicación lógica está esperando al standby asociado con el slot de replicación «%s»." + +#: replication/slot.c:2639 +#, c-format +msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." +msgstr "Cree el slot de replicación «%s» o corrija el parámetro «%s»." + +#: replication/slot.c:2649 +#, c-format +msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" +msgstr "no se puede especificar el slot de replicación lógica «%s» en el parámetro «%s»" + +#: replication/slot.c:2651 #, c-format -msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" -msgstr "suma de verificación no coincidente en archivo de slot de replicación «%s»: es %u, debería ser %u" +msgid "Logical replication is waiting for correction on replication slot \"%s\"." +msgstr "La replicación lógica está esperando a una corrección en el slot de replicación «%s»." -# FIXME see slot.c:779. See also postmaster.c:835 -#: replication/slot.c:2043 +#: replication/slot.c:2653 #, c-format -msgid "logical replication slot \"%s\" exists, but wal_level < logical" -msgstr "existe el slot de replicación lógica «%s», pero wal_level < logical" +msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." +msgstr "Elimine el slot de replicación lógica «%s» del parámetro «%s»." -#: replication/slot.c:2045 +#: replication/slot.c:2669 #, c-format -msgid "Change wal_level to be logical or higher." -msgstr "Cambie wal_level a logical o superior." +msgid "physical replication slot \"%s\" specified in parameter \"%s\" has been invalidated" +msgstr "el slot de replicación física «%s» especificado en el parámetro «%s» ha sido invalidado" -# FIXME see slot.c:779. See also postmaster.c:835 -#: replication/slot.c:2049 +#: replication/slot.c:2673 #, c-format -msgid "physical replication slot \"%s\" exists, but wal_level < replica" -msgstr "existe el slot de replicación lógica «%s», pero wal_level < logical" +msgid "Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." +msgstr "Elimine y vuelva a crear el slot de replicación «%s», o corrija el parámetro «%s»." -# <> hello vim -#: replication/slot.c:2051 +#: replication/slot.c:2684 #, c-format -msgid "Change wal_level to be replica or higher." -msgstr "Cambie wal_level a replica o superior." +msgid "replication slot \"%s\" specified in parameter \"%s\" does not have active_pid" +msgstr "el slot de replicación «%s» especificado en el parámetro «%s» no tiene active_pid" -#: replication/slot.c:2085 +#: replication/slot.c:2688 #, c-format -msgid "too many replication slots active before shutdown" -msgstr "demasiados slots de replicación activos antes del apagado" +msgid "Start the standby associated with the replication slot \"%s\", or amend parameter \"%s\"." +msgstr "Inicie el standby asociado con el slot de replicación «%s», o corrija el parámetro «%s»." -#: replication/slotfuncs.c:601 +#: replication/slotfuncs.c:526 #, c-format msgid "invalid target WAL LSN" msgstr "el LSN de wal de destino no es válido" -#: replication/slotfuncs.c:623 +#: replication/slotfuncs.c:548 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "no se puede avanzar el slot de replicación «%s»" -#: replication/slotfuncs.c:625 +#: replication/slotfuncs.c:550 #, c-format msgid "This slot has never previously reserved WAL, or it has been invalidated." msgstr "Este slot nunca ha reservado WAL previamente, o ha sido invalidado." -#: replication/slotfuncs.c:641 +#: replication/slotfuncs.c:566 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "no puede avanzar un slot de replicación a %X/%X, el mínimo es %X/%X" -#: replication/slotfuncs.c:748 +#: replication/slotfuncs.c:673 #, c-format msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "no se puede copiar el slot de replicación física «%s» como slot de replicación lógica" -#: replication/slotfuncs.c:750 +#: replication/slotfuncs.c:675 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "no se puede copiar el slot de replicación lógica «%s» como slot de replicación física" -#: replication/slotfuncs.c:757 +#: replication/slotfuncs.c:682 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "no puede copiar un slot de replicación que no ha reservado WAL" -#: replication/slotfuncs.c:834 +#: replication/slotfuncs.c:768 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "no se pudo copiar el slot de replicación «%s»" -#: replication/slotfuncs.c:836 +#: replication/slotfuncs.c:770 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "El slot de replicación de origen fue modificado incompatiblemente durante la operación de copia." -#: replication/slotfuncs.c:842 +#: replication/slotfuncs.c:776 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "no se puede copiar el slot de replicación lógica no terminado «%s»" -#: replication/slotfuncs.c:844 +#: replication/slotfuncs.c:778 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "Reintente cuando el confirmed_flush_lsn del slot de replicación de origen sea válido." -#: replication/syncrep.c:262 +# FIXME see logical.c:81 +#: replication/slotfuncs.c:877 +#, c-format +msgid "replication slots can only be synchronized to a standby server" +msgstr "los slots de replicación sólo pueden sincronizarse a un servidor standby" + +#: replication/syncrep.c:261 #, c-format msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" msgstr "cancelando la espera para la replicación sincrónica y terminando la conexión debido a una orden del administrador" -#: replication/syncrep.c:263 replication/syncrep.c:280 +#: replication/syncrep.c:262 replication/syncrep.c:279 #, c-format msgid "The transaction has already committed locally, but might not have been replicated to the standby." msgstr "La transacción ya fue comprometida localmente, pero pudo no haber sido replicada al standby." -#: replication/syncrep.c:279 +#: replication/syncrep.c:278 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "cancelando espera para la replicación sincrónica debido a una petición del usuario" -#: replication/syncrep.c:486 +#: replication/syncrep.c:485 #, c-format -msgid "standby \"%s\" is now a synchronous standby with priority %u" -msgstr "el standby «%s» es ahora un standby sincrónico con prioridad %u" +msgid "standby \"%s\" is now a synchronous standby with priority %d" +msgstr "el standby «%s» es ahora un standby sincrónico con prioridad %d" -#: replication/syncrep.c:490 +#: replication/syncrep.c:489 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "el standby «%s» es ahora un candidato para standby sincrónico de quórum" -#: replication/syncrep.c:1019 +#: replication/syncrep.c:1013 #, c-format -msgid "synchronous_standby_names parser failed" -msgstr "falló la interpretación de synchronous_standby_names" +msgid "\"synchronous_standby_names\" parser failed" +msgstr "falló la interpretación de «synchronous_standby_names»" -#: replication/syncrep.c:1025 +#: replication/syncrep.c:1019 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "el argumento de standby sincrónicos (%d) debe ser mayor que cero" -#: replication/walreceiver.c:180 +#: replication/walreceiver.c:176 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "terminando el proceso walreceiver debido a una orden del administrador" -#: replication/walreceiver.c:305 -#, c-format -msgid "could not connect to the primary server: %s" -msgstr "no se pudo conectar al servidor primario: %s" - -#: replication/walreceiver.c:352 +#: replication/walreceiver.c:354 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "el identificador de sistema difiere entre el primario y el standby" -#: replication/walreceiver.c:353 +#: replication/walreceiver.c:355 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "El identificador del primario es %s, el identificador del standby es %s." -#: replication/walreceiver.c:364 +#: replication/walreceiver.c:366 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "el timeline más alto del primario, %u, está más atrás que el timeline de recuperación %u" -#: replication/walreceiver.c:417 +#: replication/walreceiver.c:419 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "iniciando el flujo de WAL desde el primario en %X/%X en el timeline %u" -#: replication/walreceiver.c:421 +#: replication/walreceiver.c:423 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "reiniciando el flujo de WAL en %X/%X en el timeline %u" -#: replication/walreceiver.c:457 +#: replication/walreceiver.c:458 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "no se puede continuar el flujo de WAL; la recuperación ya ha terminado" -#: replication/walreceiver.c:501 +#: replication/walreceiver.c:502 #, c-format msgid "replication terminated by primary server" msgstr "replicación terminada por el servidor primario" -#: replication/walreceiver.c:502 +#: replication/walreceiver.c:503 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "Se alcanzó el fin de WAL en el timeline %u en la posición %X/%X." -#: replication/walreceiver.c:592 +#: replication/walreceiver.c:593 #, c-format msgid "terminating walreceiver due to timeout" msgstr "terminando el proceso walreceiver debido a que se agotó el tiempo de espera" -#: replication/walreceiver.c:624 +#: replication/walreceiver.c:625 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "el servidor primario no contiene más WAL en el timeline %u solicitado" -#: replication/walreceiver.c:640 replication/walreceiver.c:1066 -#, fuzzy, c-format -#| msgid "could not close log segment %s: %m" +#: replication/walreceiver.c:641 replication/walreceiver.c:1071 +#, c-format msgid "could not close WAL segment %s: %m" -msgstr "no se pudo cerrar archivo de segmento %s: %m" +msgstr "no se pudo cerrar el segmento de WAL %s: %m" -#: replication/walreceiver.c:759 +#: replication/walreceiver.c:760 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "trayendo el archivo de historia del timeline para el timeline %u desde el servidor primario" -#: replication/walreceiver.c:954 -#, fuzzy, c-format -#| msgid "could not write to log segment %s at offset %u, length %lu: %m" -msgid "could not write to WAL segment %s at offset %u, length %lu: %m" -msgstr "no se pudo escribir al segmento de log %s en la posición %u, largo %lu: %m" +#: replication/walreceiver.c:959 +#, c-format +msgid "could not write to WAL segment %s at offset %d, length %lu: %m" +msgstr "no se pudo escribir al segmento de WAL %s en la posición %d, largo %lu: %m" -#: replication/walsender.c:519 -#, fuzzy, c-format -#| msgid "cannot read from logical replication slot \"%s\"" +#: replication/walsender.c:531 +#, c-format msgid "cannot use %s with a logical replication slot" -msgstr "no se puede leer del slot de replicación lógica «%s»" +msgstr "no se puede usar %s con un slot de replicación lógica" -#: replication/walsender.c:623 storage/smgr/md.c:1526 +#: replication/walsender.c:635 storage/smgr/md.c:1735 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "no se pudo posicionar (seek) al fin del archivo «%s»: %m" -#: replication/walsender.c:627 +#: replication/walsender.c:639 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "no se pudo posicionar (seek) al comienzo del archivo «%s»: %m" -#: replication/walsender.c:704 +#: replication/walsender.c:853 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "no se puede usar un slot de replicación lógica para replicación física" -#: replication/walsender.c:770 +#: replication/walsender.c:919 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "el punto de inicio solicitado %X/%X del timeline %u no está en la historia de este servidor" -#: replication/walsender.c:773 +#: replication/walsender.c:922 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "La historia de este servidor bifurcó desde el timeline %u en %X/%X." -#: replication/walsender.c:817 +#: replication/walsender.c:966 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "el punto de inicio solicitado %X/%X está más adelante que la posición de sincronización (flush) de WAL de este servidor %X/%X" -#: replication/walsender.c:1010 -#, fuzzy, c-format -#| msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" +#: replication/walsender.c:1160 +#, c-format msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" -msgstr "valor no reconocido para la opción de EXPLAIN «%s»: «%s»" +msgstr "valor no reconocido para la opción de CREATE_REPLICATION_SLOT «%s»: «%s»" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1095 +#: replication/walsender.c:1266 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s no debe ser ejecutado dentro de una transacción" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1105 +#: replication/walsender.c:1276 #, c-format msgid "%s must be called inside a transaction" msgstr "%s no debe ser ejecutado dentro de una transacción" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1111 +#: replication/walsender.c:1282 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s debe llamarse en una transacción de modo de aislamiento REPEATABLE READ" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1116 -#, fuzzy, c-format -#| msgid "%s must be called inside a transaction" -msgid "%s must be called in a read only transaction" -msgstr "%s no debe ser ejecutado dentro de una transacción" +#: replication/walsender.c:1287 +#, c-format +msgid "%s must be called in a read-only transaction" +msgstr "%s debe ser ejecutado en una transacción de sólo lectura" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1122 +#: replication/walsender.c:1293 #, c-format msgid "%s must be called before any query" msgstr "%s debe ser llamado antes de cualquier consulta" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1128 +#: replication/walsender.c:1299 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s no está permitido en una subtransacción" -#: replication/walsender.c:1275 +#: replication/walsender.c:1472 #, c-format msgid "terminating walsender process after promotion" msgstr "terminando el proceso walsender luego de la promoción" -#: replication/walsender.c:1696 +#: replication/walsender.c:2000 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" -msgstr "no puede ejecutar nuevas órdenes mientras el «WAL sender» está en modo de apagarse" +msgstr "no puede ejecutar nuevas órdenes mientras el “WAL sender†está en modo de apagarse" -#: replication/walsender.c:1731 +#: replication/walsender.c:2035 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" -msgstr "no puede ejecutar órdenes SQL en el «WAL sender» para replicación física" +msgstr "no puede ejecutar órdenes SQL en el “WAL sender†para replicación física" -#: replication/walsender.c:1764 +#: replication/walsender.c:2068 #, c-format msgid "received replication command: %s" msgstr "se recibió orden de replicación: %s" -#: replication/walsender.c:1772 tcop/fastpath.c:209 tcop/postgres.c:1138 -#: tcop/postgres.c:1496 tcop/postgres.c:1736 tcop/postgres.c:2210 -#: tcop/postgres.c:2648 tcop/postgres.c:2726 +#: replication/walsender.c:2076 tcop/fastpath.c:209 tcop/postgres.c:1142 +#: tcop/postgres.c:1500 tcop/postgres.c:1752 tcop/postgres.c:2234 +#: tcop/postgres.c:2672 tcop/postgres.c:2749 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "transacción abortada, las órdenes serán ignoradas hasta el fin de bloque de transacción" -#: replication/walsender.c:1914 replication/walsender.c:1949 +#: replication/walsender.c:2233 replication/walsender.c:2268 #, c-format msgid "unexpected EOF on standby connection" msgstr "se encontró fin de archivo inesperado en la conexión standby" -#: replication/walsender.c:1937 +#: replication/walsender.c:2256 #, c-format msgid "invalid standby message type \"%c\"" msgstr "el tipo «%c» de mensaje del standby no es válido" -#: replication/walsender.c:2026 +#: replication/walsender.c:2345 #, c-format msgid "unexpected message type \"%c\"" msgstr "mensaje de tipo «%c» inesperado" -#: replication/walsender.c:2439 +#: replication/walsender.c:2759 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "terminando el proceso walsender debido a que se agotó el tiempo de espera de replicación" -#: rewrite/rewriteDefine.c:111 rewrite/rewriteDefine.c:842 +#: rewrite/rewriteDefine.c:104 rewrite/rewriteDefine.c:835 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "ya existe una regla llamada «%s» para la relación «%s»" -#: rewrite/rewriteDefine.c:268 rewrite/rewriteDefine.c:780 -#, fuzzy, c-format -#| msgid "portal \"%s\" cannot be run" +#: rewrite/rewriteDefine.c:261 rewrite/rewriteDefine.c:773 +#, c-format msgid "relation \"%s\" cannot have rules" -msgstr "el portal «%s» no puede ser ejecutado" +msgstr "la relación «%s» no puede tener reglas" -#: rewrite/rewriteDefine.c:299 +#: rewrite/rewriteDefine.c:292 #, c-format msgid "rule actions on OLD are not implemented" msgstr "las acciones de regla en OLD no están implementadas" -#: rewrite/rewriteDefine.c:300 +#: rewrite/rewriteDefine.c:293 #, c-format msgid "Use views or triggers instead." msgstr "Use vistas o triggers en su lugar." -#: rewrite/rewriteDefine.c:304 +#: rewrite/rewriteDefine.c:297 #, c-format msgid "rule actions on NEW are not implemented" msgstr "las acciones de regla en NEW no están implementadas" -#: rewrite/rewriteDefine.c:305 +#: rewrite/rewriteDefine.c:298 #, c-format msgid "Use triggers instead." msgstr "Use triggers en su lugar." -#: rewrite/rewriteDefine.c:319 -#, fuzzy, c-format -#| msgid "cursor \"%s\" is not a SELECT query" +#: rewrite/rewriteDefine.c:312 +#, c-format msgid "relation \"%s\" cannot have ON SELECT rules" -msgstr "el cursor «%s» no es una orden SELECT" +msgstr "la relación «%s» no puede tener reglas ON SELECT" -#: rewrite/rewriteDefine.c:329 +#: rewrite/rewriteDefine.c:322 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "las reglas INSTEAD NOTHING en SELECT no están implementadas" -#: rewrite/rewriteDefine.c:330 +#: rewrite/rewriteDefine.c:323 #, c-format msgid "Use views instead." msgstr "Use vistas en su lugar." -#: rewrite/rewriteDefine.c:338 +#: rewrite/rewriteDefine.c:331 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "las reglas de múltiples acciones en SELECT no están implementadas" -#: rewrite/rewriteDefine.c:348 +#: rewrite/rewriteDefine.c:341 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "las reglas en SELECT deben tener una acción INSTEAD SELECT" -#: rewrite/rewriteDefine.c:356 +#: rewrite/rewriteDefine.c:349 #, c-format msgid "rules on SELECT must not contain data-modifying statements in WITH" msgstr "las reglas en SELECT no deben contener sentencias que modifiquen datos en WITH" -#: rewrite/rewriteDefine.c:364 +#: rewrite/rewriteDefine.c:357 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "las calificaciones de eventos no están implementadas para las reglas en SELECT" -#: rewrite/rewriteDefine.c:391 +#: rewrite/rewriteDefine.c:384 #, c-format msgid "\"%s\" is already a view" msgstr "«%s» ya es una vista" -#: rewrite/rewriteDefine.c:415 +#: rewrite/rewriteDefine.c:408 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "la regla de vista para «%s» debe llamarse «%s»" -#: rewrite/rewriteDefine.c:442 +#: rewrite/rewriteDefine.c:435 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "no se pueden tener múltiples listas RETURNING en una regla" -#: rewrite/rewriteDefine.c:447 +#: rewrite/rewriteDefine.c:440 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "listas de RETURNING no están soportadas en reglas condicionales" -#: rewrite/rewriteDefine.c:451 +#: rewrite/rewriteDefine.c:444 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "listas de RETURNING no están soportadas en reglas que no estén marcadas INSTEAD" -#: rewrite/rewriteDefine.c:465 -#, fuzzy, c-format -#| msgid "view rule for \"%s\" must be named \"%s\"" +#: rewrite/rewriteDefine.c:458 +#, c-format msgid "non-view rule for \"%s\" must not be named \"%s\"" -msgstr "la regla de vista para «%s» debe llamarse «%s»" +msgstr "la regla que no es de vista para «%s» no debe llamarse «%s»" -#: rewrite/rewriteDefine.c:539 +#: rewrite/rewriteDefine.c:532 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "la lista de destinos en la regla de SELECT tiene demasiadas entradas" -#: rewrite/rewriteDefine.c:540 +#: rewrite/rewriteDefine.c:533 #, c-format msgid "RETURNING list has too many entries" msgstr "la lista de RETURNING tiene demasiadas entradas" -#: rewrite/rewriteDefine.c:567 +#: rewrite/rewriteDefine.c:560 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "no se puede convertir en vista una relación que contiene columnas eliminadas" -#: rewrite/rewriteDefine.c:568 +#: rewrite/rewriteDefine.c:561 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "no se puede crear una lista RETURNING para una relación que contiene columnas eliminadas" -#: rewrite/rewriteDefine.c:574 +#: rewrite/rewriteDefine.c:567 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "la entrada de destino %d de la regla de SELECT tiene un nombre de columna diferente de «%s»" -#: rewrite/rewriteDefine.c:576 +#: rewrite/rewriteDefine.c:569 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "La entrada de destino de SELECT tiene nombre «%s»." -#: rewrite/rewriteDefine.c:585 +#: rewrite/rewriteDefine.c:578 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "el destino %d de la regla de SELECT tiene un tipo diferente de la columna «%s»" -#: rewrite/rewriteDefine.c:587 +#: rewrite/rewriteDefine.c:580 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "el destino %d de la lista de RETURNING tiene un tipo diferente de la columna «%s»" -#: rewrite/rewriteDefine.c:590 rewrite/rewriteDefine.c:614 +#: rewrite/rewriteDefine.c:583 rewrite/rewriteDefine.c:607 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "La entrada de destino de SELECT tiene un tipo «%s», pero la columna tiene tipo «%s»." -#: rewrite/rewriteDefine.c:593 rewrite/rewriteDefine.c:618 +#: rewrite/rewriteDefine.c:586 rewrite/rewriteDefine.c:611 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "una entrada de la lista RETURNING tiene tipo %s, pero la columna tiene tipo %s." -#: rewrite/rewriteDefine.c:609 +#: rewrite/rewriteDefine.c:602 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "el destino %d de la regla de SELECT tiene un tamaño diferente de la columna «%s»" -#: rewrite/rewriteDefine.c:611 +#: rewrite/rewriteDefine.c:604 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "el destino %d de la lista RETURNING tiene un tamaño diferente de la columna «%s»" -#: rewrite/rewriteDefine.c:628 +#: rewrite/rewriteDefine.c:621 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "la lista de destinos de regla de SELECT tiene muy pocas entradas" -#: rewrite/rewriteDefine.c:629 +#: rewrite/rewriteDefine.c:622 #, c-format msgid "RETURNING list has too few entries" msgstr "la lista de RETURNING tiene muy pocas entradas" -#: rewrite/rewriteDefine.c:718 rewrite/rewriteDefine.c:833 -#: rewrite/rewriteSupport.c:109 +#: rewrite/rewriteDefine.c:711 rewrite/rewriteDefine.c:826 +#: rewrite/rewriteSupport.c:108 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "no existe la regla «%s» para la relación «%s»" -#: rewrite/rewriteDefine.c:852 +#: rewrite/rewriteDefine.c:845 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "no se permite cambiar el nombre de una regla ON SELECT" -#: rewrite/rewriteHandler.c:581 +#: rewrite/rewriteHandler.c:588 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "el nombre de consulta WITH «%s» aparece tanto en una acción de regla y en la consulta que está siendo reescrita" -#: rewrite/rewriteHandler.c:608 -#, fuzzy, c-format -#| msgid "INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH" +#: rewrite/rewriteHandler.c:615 +#, c-format msgid "INSERT ... SELECT rule actions are not supported for queries having data-modifying statements in WITH" -msgstr "las acciones de reglas INSERT...SELECT no están soportadas para consultas que tengan sentencias que modifiquen datos en WITH" +msgstr "las acciones de regla INSERT ... SELECT no están soportadas para sentencias que modifiquen datos en WITH" -#: rewrite/rewriteHandler.c:661 +#: rewrite/rewriteHandler.c:668 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "no se puede usar RETURNING en múltiples reglas" -#: rewrite/rewriteHandler.c:893 rewrite/rewriteHandler.c:932 +#: rewrite/rewriteHandler.c:900 rewrite/rewriteHandler.c:939 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "no se puede insertar un valor no-predeterminado en la columna «%s»" -#: rewrite/rewriteHandler.c:895 rewrite/rewriteHandler.c:961 +#: rewrite/rewriteHandler.c:902 rewrite/rewriteHandler.c:968 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "La columna \"%s\" es una columna de identidad definida como GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:897 +#: rewrite/rewriteHandler.c:904 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Use OVERRIDING SYSTEM VALUE para controlar manualmente." -#: rewrite/rewriteHandler.c:959 rewrite/rewriteHandler.c:967 +#: rewrite/rewriteHandler.c:966 rewrite/rewriteHandler.c:974 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "la columna «%s» sólo puede actualizarse a DEFAULT" -#: rewrite/rewriteHandler.c:1114 rewrite/rewriteHandler.c:1132 +#: rewrite/rewriteHandler.c:1109 rewrite/rewriteHandler.c:1127 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "hay múltiples asignaciones a la misma columna «%s»" -#: rewrite/rewriteHandler.c:2118 rewrite/rewriteHandler.c:4039 +#: rewrite/rewriteHandler.c:1682 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE no está soportado para relaciones con reglas." + +#: rewrite/rewriteHandler.c:1722 rewrite/rewriteHandler.c:3262 +#, c-format +msgid "access to non-system view \"%s\" is restricted" +msgstr "el acceso a la vista no de sistema «%s» está restringido" + +#: rewrite/rewriteHandler.c:2122 rewrite/rewriteHandler.c:4254 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "se detectó recursión infinita en las reglas de la relación «%s»" -#: rewrite/rewriteHandler.c:2203 +#: rewrite/rewriteHandler.c:2227 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "se detectó recursión infinita en la política para la relación «%s»" -#: rewrite/rewriteHandler.c:2523 +#: rewrite/rewriteHandler.c:2589 msgid "Junk view columns are not updatable." msgstr "Las columnas «basura» de vistas no son actualizables." -#: rewrite/rewriteHandler.c:2528 +#: rewrite/rewriteHandler.c:2594 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Las columnas de vistas que no son columnas de su relación base no son actualizables." -#: rewrite/rewriteHandler.c:2531 +#: rewrite/rewriteHandler.c:2597 msgid "View columns that refer to system columns are not updatable." msgstr "Las columnas de vistas que se refieren a columnas de sistema no son actualizables." -#: rewrite/rewriteHandler.c:2534 +#: rewrite/rewriteHandler.c:2600 msgid "View columns that return whole-row references are not updatable." msgstr "Las columnas de vistas que retornan referencias a la fila completa no son actualizables." # XXX a %s here would be nice ... -#: rewrite/rewriteHandler.c:2595 +#: rewrite/rewriteHandler.c:2661 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Las vistas que contienen DISTINCT no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2598 +#: rewrite/rewriteHandler.c:2664 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Las vistas que contienen GROUP BY no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2601 +#: rewrite/rewriteHandler.c:2667 msgid "Views containing HAVING are not automatically updatable." msgstr "Las vistas que contienen HAVING no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2604 +#: rewrite/rewriteHandler.c:2670 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Las vistas que contienen UNION, INTERSECT o EXCEPT no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2607 +#: rewrite/rewriteHandler.c:2673 msgid "Views containing WITH are not automatically updatable." msgstr "Las vistas que contienen WITH no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2610 +#: rewrite/rewriteHandler.c:2676 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Las vistas que contienen LIMIT u OFFSET no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2622 +#: rewrite/rewriteHandler.c:2688 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Las vistas que retornan funciones de agregación no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2625 +#: rewrite/rewriteHandler.c:2691 msgid "Views that return window functions are not automatically updatable." msgstr "Las vistas que retornan funciones ventana no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2628 +#: rewrite/rewriteHandler.c:2694 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Las vistas que retornan funciones-que-retornan-conjuntos no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2635 rewrite/rewriteHandler.c:2639 -#: rewrite/rewriteHandler.c:2647 +#: rewrite/rewriteHandler.c:2701 rewrite/rewriteHandler.c:2705 +#: rewrite/rewriteHandler.c:2713 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "Las vistas que no extraen desde una única tabla o vista no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2650 +#: rewrite/rewriteHandler.c:2716 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Las vistas que contienen TABLESAMPLE no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:2674 +#: rewrite/rewriteHandler.c:2740 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Las vistas que no tienen columnas actualizables no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:3154 +#: rewrite/rewriteHandler.c:3121 rewrite/rewriteHandler.c:3156 +#, c-format +msgid "cannot insert into view \"%s\"" +msgstr "no se puede insertar en la vista «%s»" + +#: rewrite/rewriteHandler.c:3124 +#, c-format +msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." +msgstr "Para posibilitar las inserciones en la vista, provea un “trigger†INSTEAD OF INSERT o una regla incodicional ON INSERT DO INSTEAD." + +#: rewrite/rewriteHandler.c:3129 rewrite/rewriteHandler.c:3165 +#, c-format +msgid "cannot update view \"%s\"" +msgstr "no se puede actualizar la vista «%s»" + +#: rewrite/rewriteHandler.c:3132 +#, c-format +msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." +msgstr "Para posibilitar las actualizaciones en la vista, provea un “trigger†INSTEAD OF UPDATE o una regla incondicional ON UPDATE DO INSTEAD." + +#: rewrite/rewriteHandler.c:3137 rewrite/rewriteHandler.c:3174 +#, c-format +msgid "cannot delete from view \"%s\"" +msgstr "no se puede eliminar de la vista «%s»" + +#: rewrite/rewriteHandler.c:3140 +#, c-format +msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." +msgstr "Para posibilitar las eliminaciones en la vista, provea un “trigger†INSTEAD OF DELETE o una regla incondicional ON DELETE DO INSTEAD." + +#: rewrite/rewriteHandler.c:3159 +#, c-format +msgid "To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT trigger." +msgstr "Para posibilitar insertar en la vista usando MERGE, provea un “trigger†INSTEAD OF INSERT." + +#: rewrite/rewriteHandler.c:3168 +#, c-format +msgid "To enable updating the view using MERGE, provide an INSTEAD OF UPDATE trigger." +msgstr "Para posibilitar actualizar la vista usando MERGE, provea un “trigger†INSTEAD OF UPDATE." + +#: rewrite/rewriteHandler.c:3177 +#, c-format +msgid "To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE trigger." +msgstr "Para posibilitar eliminar de la vista usando MERGE, provea un “trigger†INSTEAD OF DELETE." + +#: rewrite/rewriteHandler.c:3352 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "no se puede insertar en la columna «%s» de la vista «%s»" -#: rewrite/rewriteHandler.c:3162 +#: rewrite/rewriteHandler.c:3360 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "no se puede actualizar la columna «%s» vista «%s»" -#: rewrite/rewriteHandler.c:3666 +#: rewrite/rewriteHandler.c:3368 +#, c-format +msgid "cannot merge into column \"%s\" of view \"%s\"" +msgstr "no se puede hacer «merge» en la columna «%s» de la vista «%s»" + +#: rewrite/rewriteHandler.c:3396 +#, c-format +msgid "cannot merge into view \"%s\"" +msgstr "no se puede hacer «merge» en la vista «%s»" + +#: rewrite/rewriteHandler.c:3398 +#, c-format +msgid "MERGE is not supported for views with INSTEAD OF triggers for some actions but not all." +msgstr "MERGE no está soportado para vistas con triggers INSTEAD OF para algunas acciones pero no todas." + +#: rewrite/rewriteHandler.c:3399 +#, c-format +msgid "To enable merging into the view, either provide a full set of INSTEAD OF triggers or drop the existing INSTEAD OF triggers." +msgstr "Para posibilitar hacer “merge†en la vista, provea un conjunto completo de “triggers†INSTEAD OF o elimine los “triggers†INSTEAD OF existentes." + +#: rewrite/rewriteHandler.c:3912 #, c-format msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO INSTEAD NOTIFY no están soportadas para sentencias que modifiquen datos en WITH" -#: rewrite/rewriteHandler.c:3677 +#: rewrite/rewriteHandler.c:3923 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO INSTEAD NOTHING no están soportadas para sentencias que modifiquen datos en WITH" -#: rewrite/rewriteHandler.c:3691 +#: rewrite/rewriteHandler.c:3937 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO INSTEAD condicionales no están soportadas para sentencias que modifiquen datos en WITH" -#: rewrite/rewriteHandler.c:3695 +#: rewrite/rewriteHandler.c:3941 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO ALSO no están soportadas para sentencias que modifiquen datos en WITH" -#: rewrite/rewriteHandler.c:3700 +#: rewrite/rewriteHandler.c:3946 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "las reglas DO INSTEAD de múltiples sentencias no están soportadas para sentencias que modifiquen datos en WITH" # XXX a %s here would be nice ... -#: rewrite/rewriteHandler.c:3967 rewrite/rewriteHandler.c:3975 -#: rewrite/rewriteHandler.c:3983 -#, c-format +#: rewrite/rewriteHandler.c:4206 msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "Las vistas con reglas DO INSTEAD condicionales no son automáticamente actualizables." -#: rewrite/rewriteHandler.c:4088 +#: rewrite/rewriteHandler.c:4303 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "no se puede hacer INSERT RETURNING a la relación «%s»" -#: rewrite/rewriteHandler.c:4090 +#: rewrite/rewriteHandler.c:4305 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "Necesita un regla incondicional ON INSERT DO INSTEAD con una cláusula RETURNING." -#: rewrite/rewriteHandler.c:4095 +#: rewrite/rewriteHandler.c:4310 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "no se puede hacer UPDATE RETURNING a la relación «%s»" -#: rewrite/rewriteHandler.c:4097 +#: rewrite/rewriteHandler.c:4312 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "Necesita un regla incondicional ON UPDATE DO INSTEAD con una cláusula RETURNING." -#: rewrite/rewriteHandler.c:4102 +#: rewrite/rewriteHandler.c:4317 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "no se puede hacer DELETE RETURNING a la relación «%s»" -#: rewrite/rewriteHandler.c:4104 +#: rewrite/rewriteHandler.c:4319 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "Necesita un regla incondicional ON DELETE DO INSTEAD con una clásula RETURNING." -#: rewrite/rewriteHandler.c:4122 +#: rewrite/rewriteHandler.c:4337 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "INSERT con una cláusula ON CONFLICT no puede usarse con una tabla que tiene reglas INSERT o UPDATE" -#: rewrite/rewriteHandler.c:4179 +#: rewrite/rewriteHandler.c:4394 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH no puede ser usado en una consulta que está siendo convertida en múltiples consultas a través de reglas" -#: rewrite/rewriteManip.c:1070 +#: rewrite/rewriteManip.c:1084 #, c-format msgid "conditional utility statements are not implemented" msgstr "las sentencias condicionales de utilidad no están implementadas" -#: rewrite/rewriteManip.c:1414 +#: rewrite/rewriteManip.c:1431 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "WHERE CURRENT OF no está implementado en una vista" -#: rewrite/rewriteManip.c:1749 +#: rewrite/rewriteManip.c:1767 #, c-format msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" msgstr "las variables NEW en reglas ON UPDATE no pueden referenciar columnas que son parte de una asignación múltiple en la orden UPDATE" #: rewrite/rewriteSearchCycle.c:410 -#, fuzzy, c-format -#| msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" +#, c-format msgid "with a SEARCH or CYCLE clause, the recursive reference to WITH query \"%s\" must be at the top level of its right-hand SELECT" -msgstr "con una cláusula SEARCH o CYCLE, el lado izquierdo de UNION debe ser un SELECT" +msgstr "con una cláusula SEARCH o CYCLE, la referencia recursiva a la consulta de WITH «%s» debe estar en el nivel superior de su SELECT del lado derecho" #: snowball/dict_snowball.c:215 #, c-format @@ -21575,241 +22046,236 @@ msgstr "parámetro Snowball no reconocido: «%s»" msgid "missing Language parameter" msgstr "falta un parámetro Language" -#: statistics/extended_stats.c:179 +#: statistics/extended_stats.c:176 #, c-format msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "el objeto de estadísticas «%s.%s» no pudo ser calculado para la relación «%s.%s»" -#: statistics/mcv.c:1372 +#: statistics/mcv.c:1368 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "se llamó una función que retorna un registro en un contexto que no puede aceptarlo" -#: storage/buffer/bufmgr.c:612 storage/buffer/bufmgr.c:769 +#: storage/buffer/bufmgr.c:649 storage/buffer/bufmgr.c:805 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "no se pueden acceder tablas temporales de otras sesiones" -#: storage/buffer/bufmgr.c:1138 +#: storage/buffer/bufmgr.c:1532 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "la página no es válida en el bloque %u de la relación «%s»; reinicializando la página" -#: storage/buffer/bufmgr.c:1932 storage/buffer/localbuf.c:359 +#: storage/buffer/bufmgr.c:2277 storage/buffer/localbuf.c:361 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "no se puede extender la relación %s más allá de %u bloques" -#: storage/buffer/bufmgr.c:1999 +#: storage/buffer/bufmgr.c:2348 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "datos inesperados más allá del EOF en el bloque %u de relación %s" -#: storage/buffer/bufmgr.c:2001 +#: storage/buffer/bufmgr.c:2350 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Esto parece ocurrir sólo con kernels defectuosos; considere actualizar su sistema." -#: storage/buffer/bufmgr.c:5213 +#: storage/buffer/bufmgr.c:5653 #, c-format msgid "could not write block %u of %s" msgstr "no se pudo escribir el bloque %u de %s" -#: storage/buffer/bufmgr.c:5215 +#: storage/buffer/bufmgr.c:5655 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Múltiples fallas --- el error de escritura puede ser permanente." -#: storage/buffer/bufmgr.c:5237 storage/buffer/bufmgr.c:5257 +#: storage/buffer/bufmgr.c:5677 storage/buffer/bufmgr.c:5697 #, c-format msgid "writing block %u of relation %s" msgstr "escribiendo el bloque %u de la relación %s" -#: storage/buffer/bufmgr.c:5575 -#, c-format -msgid "snapshot too old" -msgstr "snapshot demasiado antiguo" - -#: storage/buffer/localbuf.c:219 +#: storage/buffer/localbuf.c:220 #, c-format msgid "no empty local buffer available" msgstr "no hay ningún búfer local disponible" -#: storage/buffer/localbuf.c:592 +#: storage/buffer/localbuf.c:597 #, c-format msgid "cannot access temporary tables during a parallel operation" msgstr "no se pueden acceder tablas temporales durante una operación paralela" -#: storage/buffer/localbuf.c:699 +#: storage/buffer/localbuf.c:712 #, c-format msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." msgstr "«temp_buffers» no puede ser cambiado después de que cualquier tabla temporal haya sido accedida en la sesión." -#: storage/file/buffile.c:339 +#: storage/file/buffile.c:338 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "no se pudo abrir archivo temporal «%s» del BufFile «%s»: %m" -#: storage/file/buffile.c:633 -#, fuzzy, c-format -#| msgid "could not read block %u in file \"%s\": read only %d of %d bytes" +#: storage/file/buffile.c:632 +#, c-format msgid "could not read from file set \"%s\": read only %zu of %zu bytes" -msgstr "no se pudo leer el bloque %u del archivo «%s»: se leyeron sólo %d de %d bytes" +msgstr "no se pudo leer del “file set†«%s»: se leyeron sólo %zu de %zu bytes" -#: storage/file/buffile.c:635 -#, fuzzy, c-format -#| msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" +#: storage/file/buffile.c:634 +#, c-format msgid "could not read from temporary file: read only %zu of %zu bytes" -msgstr "no se pudo leer el archivo temporal de hash-join: se leyeron sólo %zu de %zu bytes" +msgstr "no se pudo leer del archivo temporal: se leyeron sólo %zu de %zu bytes" -#: storage/file/buffile.c:775 storage/file/buffile.c:896 +#: storage/file/buffile.c:774 storage/file/buffile.c:877 #, c-format msgid "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" msgstr "no se pudo determinar el tamaño del archivo temporal «%s» del BufFile «%s»: %m" -#: storage/file/buffile.c:975 -#, fuzzy, c-format -#| msgid "could not delete file \"%s\": %m" +#: storage/file/buffile.c:956 +#, c-format msgid "could not delete fileset \"%s\": %m" -msgstr "no se pudo borrar el archivo «%s»: %m" +msgstr "no se pudo borrar el “fileset†«%s»: %m" -#: storage/file/buffile.c:993 storage/smgr/md.c:335 storage/smgr/md.c:1038 +#: storage/file/buffile.c:974 storage/smgr/md.c:336 storage/smgr/md.c:1194 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "no se pudo truncar el archivo «%s»: %m" -#: storage/file/fd.c:516 storage/file/fd.c:588 storage/file/fd.c:624 +#: storage/file/fd.c:583 storage/file/fd.c:655 storage/file/fd.c:691 #, c-format msgid "could not flush dirty data: %m" msgstr "no se pudo sincronizar (flush) datos «sucios»: %m" -#: storage/file/fd.c:546 +#: storage/file/fd.c:613 #, c-format msgid "could not determine dirty data size: %m" msgstr "no se pudo determinar el tamaño de los datos «sucios»: %m" -#: storage/file/fd.c:598 +#: storage/file/fd.c:665 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "no se pudo ejecutar munmap() mientras se sincronizaban (flush) datos: %m" -#: storage/file/fd.c:894 +#: storage/file/fd.c:983 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit falló: %m" -#: storage/file/fd.c:984 +#: storage/file/fd.c:1073 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "los descriptores de archivo disponibles son insuficientes para iniciar un proceso servidor" -#: storage/file/fd.c:985 -#, fuzzy, c-format -#| msgid "System allows %d, we need at least %d." +#: storage/file/fd.c:1074 +#, c-format msgid "System allows %d, server needs at least %d." -msgstr "El sistema permite %d, se requieren al menos %d." +msgstr "El sistema permite %d, el servidor necesita al menos %d." -#: storage/file/fd.c:1073 storage/file/fd.c:2515 storage/file/fd.c:2624 -#: storage/file/fd.c:2775 +#: storage/file/fd.c:1162 storage/file/fd.c:2618 storage/file/fd.c:2727 +#: storage/file/fd.c:2878 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "se agotaron los descriptores de archivo: %m; libere e intente nuevamente" -#: storage/file/fd.c:1447 +#: storage/file/fd.c:1536 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "archivo temporal: ruta «%s», tamaño %lu" -#: storage/file/fd.c:1586 +#: storage/file/fd.c:1675 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "no se pudo crear el directorio temporal «%s»: %m" -#: storage/file/fd.c:1593 +#: storage/file/fd.c:1682 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "no se pudo crear el subdirectorio temporal «%s»: %m" -#: storage/file/fd.c:1790 +#: storage/file/fd.c:1879 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "no se pudo crear el archivo temporal «%s»: %m" -#: storage/file/fd.c:1826 +#: storage/file/fd.c:1915 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "no se pudo abrir el archivo temporal «%s»: %m" -#: storage/file/fd.c:1867 +#: storage/file/fd.c:1956 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "no se pudo eliminar (unlink) el archivo temporal «%s»: %m" -#: storage/file/fd.c:1955 +#: storage/file/fd.c:2044 #, c-format msgid "could not delete file \"%s\": %m" msgstr "no se pudo borrar el archivo «%s»: %m" -#: storage/file/fd.c:2138 +#: storage/file/fd.c:2234 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "el tamaño del archivo temporal excede temp_file_limit permitido (%dkB)" -#: storage/file/fd.c:2491 storage/file/fd.c:2550 +#: storage/file/fd.c:2594 storage/file/fd.c:2653 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "se excedió maxAllocatedDescs (%d) mientras se trataba de abrir el archivo «%s»" -#: storage/file/fd.c:2595 +#: storage/file/fd.c:2698 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "se excedió maxAllocatedDescs (%d) mientras se trataba de ejecutar la orden «%s»" -#: storage/file/fd.c:2751 +#: storage/file/fd.c:2854 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "se excedió maxAllocatedDescs (%d) mientras se trataba de abrir el directorio «%s»" -#: storage/file/fd.c:3281 +#: storage/file/fd.c:3384 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "archivo inesperado en directorio de archivos temporales: «%s»" -#: storage/file/fd.c:3399 +#: storage/file/fd.c:3502 #, c-format msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" msgstr "sincronizando el directorio de datos (syncfs), transcurrido: %ld.%02d s, ruta actual: %s" -#: storage/file/fd.c:3413 -#, c-format -msgid "could not synchronize file system for file \"%s\": %m" -msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" - -#: storage/file/fd.c:3626 +#: storage/file/fd.c:3729 #, c-format msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "sincronizando el directorio de datos (pre-fsync), transcurrido: %ld.%02d s, ruta actual: %s" -#: storage/file/fd.c:3658 +#: storage/file/fd.c:3761 #, c-format msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "sincronizando el directorio de datos (fsync), transcurrido: %ld.%02d s, ruta actual: %s" -#: storage/file/fd.c:3847 -#, fuzzy, c-format -#| msgid "Direct I/O is not supported on this platform.\n" -msgid "io_direct is not supported on this platform." -msgstr "Direct I/O no está soportado en esta plataforma.\n" +#: storage/file/fd.c:3950 +#, c-format +msgid "\"debug_io_direct\" is not supported on this platform." +msgstr "«debug_io_direct» no está soportado en esta plataforma." -#: storage/file/fd.c:3894 +#: storage/file/fd.c:3964 #, c-format -msgid "io_direct is not supported for WAL because XLOG_BLCKSZ is too small" -msgstr "" +msgid "Invalid list syntax in parameter \"%s\"" +msgstr "Sintaxis de lista no válida en el parámetro «%s»" -#: storage/file/fd.c:3901 +#: storage/file/fd.c:3984 #, c-format -msgid "io_direct is not supported for data because BLCKSZ is too small" -msgstr "" +msgid "Invalid option \"%s\"" +msgstr "Nombre de opción «%s» no válido." + +#: storage/file/fd.c:3997 +#, c-format +msgid "\"debug_io_direct\" is not supported for WAL because XLOG_BLCKSZ is too small" +msgstr "«debug_io_direct» no está soportado para WAL porque XLOG_BLCKSZ es demasiado pequeño" + +#: storage/file/fd.c:4004 +#, c-format +msgid "\"debug_io_direct\" is not supported for data because BLCKSZ is too small" +msgstr "«debug_io_direct» no está soportado para datos porque BLCKSZ es demasiado pequeño" #: storage/file/reinit.c:145 #, c-format @@ -21821,533 +22287,531 @@ msgstr "reseteando relaciones «unlogged» (init), transcurrido: %ld.%02d s, rut msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" msgstr "reseteando relaciones «unlogged» (cleanup), transcurrido: %ld.%02d s, ruta actual: %s" -#: storage/file/sharedfileset.c:79 +#: storage/file/sharedfileset.c:73 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "no se puede adjuntar a un SharedFileSet que ya está destruido" -#: storage/ipc/dsm.c:352 +#: storage/ipc/dsm.c:379 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "el segmento de control de memoria compartida dinámica está corrupto" -#: storage/ipc/dsm.c:417 +#: storage/ipc/dsm.c:444 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "el segmento de control de memoria compartida dinámica no es válido" -#: storage/ipc/dsm.c:599 +#: storage/ipc/dsm.c:626 #, c-format msgid "too many dynamic shared memory segments" msgstr "demasiados segmentos de memoria compartida dinámica" -#: storage/ipc/dsm_impl.c:231 storage/ipc/dsm_impl.c:536 -#: storage/ipc/dsm_impl.c:640 storage/ipc/dsm_impl.c:811 +#: storage/ipc/dsm_impl.c:231 storage/ipc/dsm_impl.c:537 +#: storage/ipc/dsm_impl.c:641 storage/ipc/dsm_impl.c:812 #, c-format msgid "could not unmap shared memory segment \"%s\": %m" msgstr "no se pudo desmapear el segmento de memoria compartida «%s»: %m" -#: storage/ipc/dsm_impl.c:241 storage/ipc/dsm_impl.c:546 -#: storage/ipc/dsm_impl.c:650 storage/ipc/dsm_impl.c:821 +#: storage/ipc/dsm_impl.c:241 storage/ipc/dsm_impl.c:547 +#: storage/ipc/dsm_impl.c:651 storage/ipc/dsm_impl.c:822 #, c-format msgid "could not remove shared memory segment \"%s\": %m" msgstr "no se pudo eliminar el segmento de memoria compartida «%s»: %m" -#: storage/ipc/dsm_impl.c:265 storage/ipc/dsm_impl.c:721 -#: storage/ipc/dsm_impl.c:835 +#: storage/ipc/dsm_impl.c:265 storage/ipc/dsm_impl.c:722 +#: storage/ipc/dsm_impl.c:836 #, c-format msgid "could not open shared memory segment \"%s\": %m" msgstr "no se pudo abrir el segmento de memoria compartida «%s»: %m" -#: storage/ipc/dsm_impl.c:290 storage/ipc/dsm_impl.c:562 -#: storage/ipc/dsm_impl.c:766 storage/ipc/dsm_impl.c:859 +#: storage/ipc/dsm_impl.c:290 storage/ipc/dsm_impl.c:563 +#: storage/ipc/dsm_impl.c:767 storage/ipc/dsm_impl.c:860 #, c-format msgid "could not stat shared memory segment \"%s\": %m" msgstr "no se pudo hacer stat del segmento de memoria compartida «%s»: %m" -#: storage/ipc/dsm_impl.c:309 storage/ipc/dsm_impl.c:910 +#: storage/ipc/dsm_impl.c:309 storage/ipc/dsm_impl.c:911 #, c-format msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" msgstr "no se pudo redimensionar el segmento de memoria compartida «%s» a %zu bytes: %m" -#: storage/ipc/dsm_impl.c:331 storage/ipc/dsm_impl.c:583 -#: storage/ipc/dsm_impl.c:742 storage/ipc/dsm_impl.c:932 +#: storage/ipc/dsm_impl.c:331 storage/ipc/dsm_impl.c:584 +#: storage/ipc/dsm_impl.c:743 storage/ipc/dsm_impl.c:933 #, c-format msgid "could not map shared memory segment \"%s\": %m" msgstr "no se pudo mapear el segmento de memoria compartida «%s»: %m" -#: storage/ipc/dsm_impl.c:518 +#: storage/ipc/dsm_impl.c:519 #, c-format msgid "could not get shared memory segment: %m" msgstr "no se pudo obtener el segmento de memoria compartida: %m" -#: storage/ipc/dsm_impl.c:706 +#: storage/ipc/dsm_impl.c:707 #, c-format msgid "could not create shared memory segment \"%s\": %m" msgstr "no se pudo crear el segmento de memoria compartida «%s»: %m" -#: storage/ipc/dsm_impl.c:943 +#: storage/ipc/dsm_impl.c:944 #, c-format msgid "could not close shared memory segment \"%s\": %m" msgstr "no se pudo cerrar el segmento de memoria compartida «%s»: %m" -#: storage/ipc/dsm_impl.c:983 storage/ipc/dsm_impl.c:1032 +#: storage/ipc/dsm_impl.c:984 storage/ipc/dsm_impl.c:1033 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "no se pudo duplicar el «handle» para «%s»: %m" -#: storage/ipc/procarray.c:3796 +#: storage/ipc/dsm_registry.c:142 +#, c-format +msgid "DSM segment name cannot be empty" +msgstr "el nombre del segmento DSM no puede ser vacío" + +#: storage/ipc/dsm_registry.c:146 +#, c-format +msgid "DSM segment name too long" +msgstr "nombre de segmento DSM es demasiado largo" + +#: storage/ipc/dsm_registry.c:150 +#, c-format +msgid "DSM segment size must be nonzero" +msgstr "el tamaño del segmento DSM debe ser distinto de cero" + +#: storage/ipc/dsm_registry.c:176 +#, c-format +msgid "requested DSM segment size does not match size of existing segment" +msgstr "el tamaño solicitado de segmento de DSM no coincide con el tamaño del segmento existente" + +#: storage/ipc/procarray.c:488 storage/lmgr/proc.c:357 +#: tcop/backend_startup.c:304 +#, c-format +msgid "sorry, too many clients already" +msgstr "lo siento, ya tenemos demasiados clientes" + +#: storage/ipc/procarray.c:3857 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "la base de datos «%s» está siendo utilizada por transacciones preparadas" -#: storage/ipc/procarray.c:3828 +#: storage/ipc/procarray.c:3893 storage/ipc/procarray.c:3901 +#: storage/ipc/signalfuncs.c:235 storage/ipc/signalfuncs.c:242 #, c-format -msgid "must be a superuser to terminate superuser process" -msgstr "debe ser superusuario para terminar proceso de superusuario" - -#: storage/ipc/procarray.c:3835 storage/ipc/signalfuncs.c:230 -#: storage/ipc/signalfuncs.c:237 -#, fuzzy, c-format -#| msgid "permission denied to create role" msgid "permission denied to terminate process" -msgstr "se ha denegado el permiso para crear el rol" +msgstr "se ha denegado el permiso para terminar el proceso" + +#: storage/ipc/procarray.c:3894 storage/ipc/signalfuncs.c:236 +#, c-format +msgid "Only roles with the %s attribute may terminate processes of roles with the %s attribute." +msgstr "Sólo roles con el atributo %s pueden terminar procesos de roles con el atributo %s." -#: storage/ipc/procarray.c:3836 storage/ipc/signalfuncs.c:238 +#: storage/ipc/procarray.c:3902 storage/ipc/signalfuncs.c:243 #, c-format msgid "Only roles with privileges of the role whose process is being terminated or with privileges of the \"%s\" role may terminate this process." -msgstr "" +msgstr "Sólo roles con privilegios del rol cuyo proceso está siendo terminados o con privilegios del rol «%s» pueden terminar este proceso." -#: storage/ipc/procsignal.c:420 -#, fuzzy, c-format -#| msgid "still waiting for backend with PID %lu to accept ProcSignalBarrier" +#: storage/ipc/procsignal.c:416 +#, c-format msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" -msgstr "aún esperando que el proceso servidor con PID %lu acepte ProcSignalBarrier" +msgstr "aún esperando que el backend con PID %d acepte ProcSignalBarrier" -#: storage/ipc/shm_mq.c:384 +#: storage/ipc/shm_mq.c:383 #, c-format msgid "cannot send a message of size %zu via shared memory queue" msgstr "no se puede enviar un mensaje de tamaño %zu mediante la cola de memoria compartida" -#: storage/ipc/shm_mq.c:719 +#: storage/ipc/shm_mq.c:718 #, c-format msgid "invalid message size %zu in shared memory queue" msgstr "tamaño no válido de mensaje %zu en cola de memoria compartida" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 -#: storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2810 storage/lmgr/lock.c:4194 -#: storage/lmgr/lock.c:4259 storage/lmgr/lock.c:4609 -#: storage/lmgr/predicate.c:2412 storage/lmgr/predicate.c:2427 -#: storage/lmgr/predicate.c:3824 storage/lmgr/predicate.c:4871 -#: utils/hash/dynahash.c:1107 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:984 +#: storage/lmgr/lock.c:1022 storage/lmgr/lock.c:2835 storage/lmgr/lock.c:4220 +#: storage/lmgr/lock.c:4285 storage/lmgr/lock.c:4635 +#: storage/lmgr/predicate.c:2468 storage/lmgr/predicate.c:2483 +#: storage/lmgr/predicate.c:3880 storage/lmgr/predicate.c:4927 +#: utils/hash/dynahash.c:1095 #, c-format msgid "out of shared memory" msgstr "memoria compartida agotada" -#: storage/ipc/shmem.c:170 storage/ipc/shmem.c:266 +#: storage/ipc/shmem.c:161 storage/ipc/shmem.c:257 #, c-format msgid "out of shared memory (%zu bytes requested)" msgstr "memoria compartida agotada (%zu bytes solicitados)" -#: storage/ipc/shmem.c:445 +#: storage/ipc/shmem.c:436 #, c-format msgid "could not create ShmemIndex entry for data structure \"%s\"" msgstr "no se pudo crear la entrada en ShmemIndex para la estructura «%s»" -#: storage/ipc/shmem.c:460 +#: storage/ipc/shmem.c:451 #, c-format msgid "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, actual %zu" msgstr "el tamaño de la entrada ShmemIndex es incorrecto para la estructura «%s»: se esperaba %zu, real %zu" -#: storage/ipc/shmem.c:479 +#: storage/ipc/shmem.c:470 #, c-format msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" msgstr "el espacio de memoria compartida es insuficiente para la estructura «%s» (%zu bytes solicitados)" -#: storage/ipc/shmem.c:511 storage/ipc/shmem.c:530 +#: storage/ipc/shmem.c:502 storage/ipc/shmem.c:521 #, c-format msgid "requested shared memory size overflows size_t" msgstr "la petición de tamaño de memoria compartida desborda size_t" #: storage/ipc/signalfuncs.c:72 -#, fuzzy, c-format -#| msgid "PID %d is not a PostgreSQL server process" +#, c-format msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %d no es un proceso servidor de PostgreSQL" -#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1379 -#: utils/adt/mcxtfuncs.c:190 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1453 +#: utils/adt/mcxtfuncs.c:182 #, c-format msgid "could not send signal to process %d: %m" msgstr "no se pudo enviar la señal al proceso %d: %m" -#: storage/ipc/signalfuncs.c:124 storage/ipc/signalfuncs.c:131 -#, fuzzy, c-format -#| msgid "permission denied to create role" +#: storage/ipc/signalfuncs.c:129 storage/ipc/signalfuncs.c:136 +#, c-format msgid "permission denied to cancel query" -msgstr "se ha denegado el permiso para crear el rol" +msgstr "se ha denegado el permiso para cancelar la consulta" -#: storage/ipc/signalfuncs.c:125 +#: storage/ipc/signalfuncs.c:130 #, c-format -msgid "Only roles with the %s attribute may cancel queries of roles with %s." -msgstr "" +msgid "Only roles with the %s attribute may cancel queries of roles with the %s attribute." +msgstr "Sólo roles con el atributo %s pueden cancelar consultas de roles con el atributo %s." -#: storage/ipc/signalfuncs.c:132 +#: storage/ipc/signalfuncs.c:137 #, c-format msgid "Only roles with privileges of the role whose query is being canceled or with privileges of the \"%s\" role may cancel this query." -msgstr "" +msgstr "Sólo roles con privilegios del rol cuya consulta está siendo cancelada o con privilegios del rol «%s» pueden cancelar esta consulta." -#: storage/ipc/signalfuncs.c:174 +#: storage/ipc/signalfuncs.c:179 #, c-format msgid "could not check the existence of the backend with PID %d: %m" msgstr "no se pudo comprobar la existencia del proceso de servidor con PID %d: %m" -#: storage/ipc/signalfuncs.c:192 +#: storage/ipc/signalfuncs.c:197 #, c-format msgid "backend with PID %d did not terminate within %lld millisecond" msgid_plural "backend with PID %d did not terminate within %lld milliseconds" msgstr[0] "el proceso de servidor con PID %d no terminó dentro de %lld milisegundo" msgstr[1] "el proceso de servidor con PID %d no terminó dentro de %lld milisegundos" -#: storage/ipc/signalfuncs.c:223 +#: storage/ipc/signalfuncs.c:228 #, c-format msgid "\"timeout\" must not be negative" msgstr "\"timeout\" no debe ser negativo" -#: storage/ipc/signalfuncs.c:231 -#, c-format -msgid "Only roles with the %s attribute may terminate processes of roles with %s." -msgstr "" - -#: storage/ipc/signalfuncs.c:279 -#, c-format -msgid "must be superuser to rotate log files with adminpack 1.0" -msgstr "bebe ser superusuario para rotar archivos de log con adminpack 1.0" - -#. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:281 utils/adt/genfile.c:250 -#, c-format -msgid "Consider using %s, which is part of core, instead." -msgstr "Considere usar %s, que es parte del servidor, en su lugar." - -#: storage/ipc/signalfuncs.c:287 storage/ipc/signalfuncs.c:307 +#: storage/ipc/signalfuncs.c:285 #, c-format msgid "rotation not possible because log collection not active" msgstr "la rotación no es posible porque la recoleccion de log no está activa" -#: storage/ipc/standby.c:330 +#: storage/ipc/standby.c:329 #, c-format msgid "recovery still waiting after %ld.%03d ms: %s" msgstr "la recuperación aún está esperando después de %ld.%03d ms: %s" -#: storage/ipc/standby.c:339 +#: storage/ipc/standby.c:338 #, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "la recuperación terminó de esperar después de %ld.%03d ms: %s" -#: storage/ipc/standby.c:921 tcop/postgres.c:3384 +#: storage/ipc/standby.c:920 tcop/postgres.c:3196 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "cancelando la sentencia debido a un conflicto con la recuperación" -#: storage/ipc/standby.c:922 tcop/postgres.c:2533 +#: storage/ipc/standby.c:921 tcop/postgres.c:2557 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "La transacción del usuario causó un «deadlock» con la recuperación." -#: storage/ipc/standby.c:1479 +#: storage/ipc/standby.c:1486 msgid "unknown reason" msgstr "razón desconocida" -#: storage/ipc/standby.c:1484 +#: storage/ipc/standby.c:1491 msgid "recovery conflict on buffer pin" msgstr "conflicto de recuperación en «pin» de búfer" -#: storage/ipc/standby.c:1487 +#: storage/ipc/standby.c:1494 msgid "recovery conflict on lock" msgstr "conflicto de recuperación en bloqueo" -#: storage/ipc/standby.c:1490 +#: storage/ipc/standby.c:1497 msgid "recovery conflict on tablespace" msgstr "conflicto de recuperación en tablespace" -#: storage/ipc/standby.c:1493 +#: storage/ipc/standby.c:1500 msgid "recovery conflict on snapshot" msgstr "conflicto de recuperación en snapshot" -#: storage/ipc/standby.c:1496 -#, fuzzy -#| msgid "recovery conflict on snapshot" +#: storage/ipc/standby.c:1503 msgid "recovery conflict on replication slot" -msgstr "conflicto de recuperación en snapshot" +msgstr "conflicto de recuperación en slot de replicación" -#: storage/ipc/standby.c:1499 +#: storage/ipc/standby.c:1506 msgid "recovery conflict on buffer deadlock" msgstr "conflicto de recuperación en deadlock de búfer" -#: storage/ipc/standby.c:1502 +#: storage/ipc/standby.c:1509 msgid "recovery conflict on database" msgstr "conflicto de recuperación en base de datos" -#: storage/large_object/inv_api.c:191 +#: storage/large_object/inv_api.c:190 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "la entrada pg_largeobject para el OID %u, página %d tiene tamaño de campo %d no válido" -#: storage/large_object/inv_api.c:274 +#: storage/large_object/inv_api.c:272 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "opciones no válidas para abrir un objeto grande: %d" -#: storage/large_object/inv_api.c:457 +#: storage/large_object/inv_api.c:297 storage/large_object/inv_api.c:309 +#: storage/large_object/inv_api.c:506 storage/large_object/inv_api.c:617 +#: storage/large_object/inv_api.c:807 +#, c-format +msgid "permission denied for large object %u" +msgstr "permiso denegado al objeto grande %u" + +#: storage/large_object/inv_api.c:455 #, c-format msgid "invalid whence setting: %d" msgstr "parámetro «whence» no válido: %d" -#: storage/large_object/inv_api.c:629 +#: storage/large_object/inv_api.c:627 #, c-format msgid "invalid large object write request size: %d" msgstr "tamaño de petición de escritura de objeto grande no válido: %d" -#: storage/lmgr/deadlock.c:1105 +#: storage/lmgr/deadlock.c:1104 #, c-format msgid "Process %d waits for %s on %s; blocked by process %d." msgstr "El proceso %d espera %s en %s; bloqueado por proceso %d." -#: storage/lmgr/deadlock.c:1124 +#: storage/lmgr/deadlock.c:1123 #, c-format msgid "Process %d: %s" msgstr "Proceso %d: %s" -#: storage/lmgr/deadlock.c:1133 +#: storage/lmgr/deadlock.c:1132 #, c-format msgid "deadlock detected" msgstr "se ha detectado un deadlock" -#: storage/lmgr/deadlock.c:1136 +#: storage/lmgr/deadlock.c:1135 #, c-format msgid "See server log for query details." msgstr "Vea el registro del servidor para obtener detalles de las consultas." -#: storage/lmgr/lmgr.c:859 +#: storage/lmgr/lmgr.c:848 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "mientras se actualizaba la tupla (%u,%u) en la relación «%s»" -#: storage/lmgr/lmgr.c:862 +#: storage/lmgr/lmgr.c:851 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "mientras se borraba la tupla (%u,%u) en la relación «%s»" -#: storage/lmgr/lmgr.c:865 +#: storage/lmgr/lmgr.c:854 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "mientras se bloqueaba la tupla (%u,%u) de la relación «%s»" -#: storage/lmgr/lmgr.c:868 +#: storage/lmgr/lmgr.c:857 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "mientras se bloqueaba la versión actualizada (%u,%u) en la relación «%s»" -#: storage/lmgr/lmgr.c:871 +#: storage/lmgr/lmgr.c:860 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "mientras se insertaba la tupla de índice (%u,%u) en la relación «%s»" -#: storage/lmgr/lmgr.c:874 +#: storage/lmgr/lmgr.c:863 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "mientras se verificaba la unicidad de la tupla (%u,%u) en la relación «%s»" -#: storage/lmgr/lmgr.c:877 +#: storage/lmgr/lmgr.c:866 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "mientras se verificaba la tupla actualizada (%u,%u) en la relación «%s»" -#: storage/lmgr/lmgr.c:880 +#: storage/lmgr/lmgr.c:869 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "mientras se verificaba una restricción de exclusión en la tupla (%u,%u) en la relación «%s»" -#: storage/lmgr/lmgr.c:1174 +#: storage/lmgr/lmgr.c:1239 #, c-format msgid "relation %u of database %u" msgstr "relación %u de la base de datos %u" -#: storage/lmgr/lmgr.c:1180 +#: storage/lmgr/lmgr.c:1245 #, c-format msgid "extension of relation %u of database %u" msgstr "extensión de la relación %u de la base de datos %u" -#: storage/lmgr/lmgr.c:1186 +#: storage/lmgr/lmgr.c:1251 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid de la base de datos %u" -#: storage/lmgr/lmgr.c:1191 +#: storage/lmgr/lmgr.c:1256 #, c-format msgid "page %u of relation %u of database %u" msgstr "página %u de la relación %u de la base de datos %u" -#: storage/lmgr/lmgr.c:1198 +#: storage/lmgr/lmgr.c:1263 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "tupla (%u,%u) de la relación %u de la base de datos %u" -#: storage/lmgr/lmgr.c:1206 +#: storage/lmgr/lmgr.c:1271 #, c-format msgid "transaction %u" msgstr "transacción %u" -#: storage/lmgr/lmgr.c:1211 +#: storage/lmgr/lmgr.c:1276 #, c-format msgid "virtual transaction %d/%u" msgstr "transacción virtual %d/%u" -#: storage/lmgr/lmgr.c:1217 +#: storage/lmgr/lmgr.c:1282 #, c-format msgid "speculative token %u of transaction %u" msgstr "token especulativo %u de la transacción %u" -#: storage/lmgr/lmgr.c:1223 +#: storage/lmgr/lmgr.c:1288 #, c-format msgid "object %u of class %u of database %u" msgstr "objeto %u de clase %u de la base de datos %u" -#: storage/lmgr/lmgr.c:1231 +#: storage/lmgr/lmgr.c:1296 #, c-format msgid "user lock [%u,%u,%u]" -msgstr "candado de usuario [%u,%u,%u]" +msgstr "“lock†de usuario [%u,%u,%u]" # XXX is this a good translation? -#: storage/lmgr/lmgr.c:1238 +#: storage/lmgr/lmgr.c:1303 #, c-format msgid "advisory lock [%u,%u,%u,%u]" -msgstr "candado consultivo [%u,%u,%u,%u]" +msgstr "“lock†consultivo [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1246 -#, fuzzy, c-format -#| msgid "extension of relation %u of database %u" +#: storage/lmgr/lmgr.c:1311 +#, c-format msgid "remote transaction %u of subscription %u of database %u" -msgstr "extensión de la relación %u de la base de datos %u" +msgstr "transacción remota %u de la suscripción %u de la base de datos %u" -#: storage/lmgr/lmgr.c:1253 +#: storage/lmgr/lmgr.c:1318 #, c-format msgid "unrecognized locktag type %d" msgstr "tipo de locktag %d no reconocido" -#: storage/lmgr/lock.c:803 +#: storage/lmgr/lock.c:812 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" -msgstr "no se puede adquirir candado en modo %s en objetos de la base de datos mientras la recuperación está en proceso" +msgstr "no se puede adquirir “lock†en modo %s en objetos de la base de datos mientras la recuperación está en proceso" -#: storage/lmgr/lock.c:805 +#: storage/lmgr/lock.c:814 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." -msgstr "Sólo candados RowExclusiveLock o menor pueden ser adquiridos en objetos de la base de datos durante la recuperación." - -#: storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 storage/lmgr/lock.c:2811 -#: storage/lmgr/lock.c:4195 storage/lmgr/lock.c:4260 storage/lmgr/lock.c:4610 -#, c-format -msgid "You might need to increase max_locks_per_transaction." -msgstr "Puede ser necesario incrementar max_locks_per_transaction." +msgstr "Sólo “locks†RowExclusiveLock o menor pueden ser adquiridos en objetos de la base de datos durante la recuperación." -#: storage/lmgr/lock.c:3259 storage/lmgr/lock.c:3327 storage/lmgr/lock.c:3443 +#: storage/lmgr/lock.c:3284 storage/lmgr/lock.c:3352 storage/lmgr/lock.c:3468 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" -msgstr "no se puede hacer PREPARE mientras se mantienen candados a nivel de sesión y transacción simultáneamente sobre el mismo objeto" +msgstr "no se puede hacer PREPARE mientras se mantienen “locks†a nivel de sesión y transacción simultáneamente sobre el mismo objeto" -#: storage/lmgr/predicate.c:649 +#: storage/lmgr/predicate.c:653 #, c-format msgid "not enough elements in RWConflictPool to record a read/write conflict" msgstr "no hay suficientes elementos en RWConflictPool para registrar un conflicto read/write" -#: storage/lmgr/predicate.c:650 storage/lmgr/predicate.c:675 +#: storage/lmgr/predicate.c:654 storage/lmgr/predicate.c:679 #, c-format -msgid "You might need to run fewer transactions at a time or increase max_connections." -msgstr "Puede ser necesario ejecutar menos transacciones al mismo tiempo, o incrementar max_connections." +msgid "You might need to run fewer transactions at a time or increase \"max_connections\"." +msgstr "Puede ser necesario ejecutar menos transacciones al mismo tiempo, o incrementar «max_connections»." -#: storage/lmgr/predicate.c:674 +#: storage/lmgr/predicate.c:678 #, c-format msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "no hay suficientes elementos en RWConflictPool para registrar un potencial conflicto read/write" -#: storage/lmgr/predicate.c:1630 +#: storage/lmgr/predicate.c:1686 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "«default_transaction_isolation» está definido a «serializable»." -#: storage/lmgr/predicate.c:1631 +#: storage/lmgr/predicate.c:1687 #, c-format msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." msgstr "Puede usar «SET default_transaction_isolation = 'repeatable read'» para cambiar el valor por omisión." -#: storage/lmgr/predicate.c:1682 +#: storage/lmgr/predicate.c:1738 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "una transacción que importa un snapshot no debe ser READ ONLY DEFERRABLE" -#: storage/lmgr/predicate.c:1761 utils/time/snapmgr.c:570 -#: utils/time/snapmgr.c:576 +#: storage/lmgr/predicate.c:1817 utils/time/snapmgr.c:535 +#: utils/time/snapmgr.c:541 #, c-format msgid "could not import the requested snapshot" msgstr "no se pudo importar el snapshot solicitado" -#: storage/lmgr/predicate.c:1762 utils/time/snapmgr.c:577 +#: storage/lmgr/predicate.c:1818 utils/time/snapmgr.c:542 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "El proceso de origen con PID %d ya no está en ejecución." -#: storage/lmgr/predicate.c:2413 storage/lmgr/predicate.c:2428 -#: storage/lmgr/predicate.c:3825 -#, c-format -msgid "You might need to increase max_pred_locks_per_transaction." -msgstr "Puede ser necesario incrementar max_pred_locks_per_transaction." - -#: storage/lmgr/predicate.c:3935 storage/lmgr/predicate.c:3971 -#: storage/lmgr/predicate.c:4004 storage/lmgr/predicate.c:4012 -#: storage/lmgr/predicate.c:4051 storage/lmgr/predicate.c:4281 -#: storage/lmgr/predicate.c:4600 storage/lmgr/predicate.c:4612 -#: storage/lmgr/predicate.c:4659 storage/lmgr/predicate.c:4695 +#: storage/lmgr/predicate.c:3991 storage/lmgr/predicate.c:4027 +#: storage/lmgr/predicate.c:4060 storage/lmgr/predicate.c:4068 +#: storage/lmgr/predicate.c:4107 storage/lmgr/predicate.c:4337 +#: storage/lmgr/predicate.c:4656 storage/lmgr/predicate.c:4668 +#: storage/lmgr/predicate.c:4715 storage/lmgr/predicate.c:4751 #, c-format msgid "could not serialize access due to read/write dependencies among transactions" msgstr "no se pudo serializar el acceso debido a dependencias read/write entre transacciones" -#: storage/lmgr/predicate.c:3937 storage/lmgr/predicate.c:3973 -#: storage/lmgr/predicate.c:4006 storage/lmgr/predicate.c:4014 -#: storage/lmgr/predicate.c:4053 storage/lmgr/predicate.c:4283 -#: storage/lmgr/predicate.c:4602 storage/lmgr/predicate.c:4614 -#: storage/lmgr/predicate.c:4661 storage/lmgr/predicate.c:4697 +#: storage/lmgr/predicate.c:3993 storage/lmgr/predicate.c:4029 +#: storage/lmgr/predicate.c:4062 storage/lmgr/predicate.c:4070 +#: storage/lmgr/predicate.c:4109 storage/lmgr/predicate.c:4339 +#: storage/lmgr/predicate.c:4658 storage/lmgr/predicate.c:4670 +#: storage/lmgr/predicate.c:4717 storage/lmgr/predicate.c:4753 #, c-format msgid "The transaction might succeed if retried." msgstr "La transacción podría tener éxito si es reintentada." -#: storage/lmgr/proc.c:349 +#: storage/lmgr/proc.c:353 #, c-format -msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" -msgstr "la cantidad de conexiones standby pedidas excede max_wal_senders (actualmente %d)" +msgid "number of requested standby connections exceeds \"max_wal_senders\" (currently %d)" +msgstr "la cantidad de conexiones standby pedidas excede «max_wal_senders» (actualmente %d)" -#: storage/lmgr/proc.c:1472 +#: storage/lmgr/proc.c:1546 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "el proceso %d evitó un deadlock para %s en %s reordenando la cola después de %ld.%03d ms" -#: storage/lmgr/proc.c:1487 +#: storage/lmgr/proc.c:1561 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "el proceso %d detectó un deadlock mientras esperaba %s en %s después de %ld.%03d ms" -#: storage/lmgr/proc.c:1496 +#: storage/lmgr/proc.c:1570 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "el proceso %d aún espera %s en %s después de %ld.%03d ms" -#: storage/lmgr/proc.c:1503 +#: storage/lmgr/proc.c:1577 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "el proceso %d adquirió %s en %s después de %ld.%03d ms" -#: storage/lmgr/proc.c:1520 +#: storage/lmgr/proc.c:1594 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "el proceso %d no pudo adquirir %s en %s después de %ld.%03d ms" @@ -22380,68 +22844,202 @@ msgstr "los largos de ítem están corruptos: total %u, espacio disponible %u" msgid "corrupted line pointer: offset = %u, size = %u" msgstr "puntero de ítem corrupto: desplazamiento = %u, tamaño = %u" -#: storage/smgr/md.c:484 storage/smgr/md.c:546 +#: storage/smgr/md.c:485 storage/smgr/md.c:547 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "no se pudo extender el archivo «%s» más allá de %u bloques" -#: storage/smgr/md.c:499 storage/smgr/md.c:610 +#: storage/smgr/md.c:500 storage/smgr/md.c:611 #, c-format msgid "could not extend file \"%s\": %m" msgstr "no se pudo extender el archivo «%s»: %m" -#: storage/smgr/md.c:505 +#: storage/smgr/md.c:506 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "no se pudo extender el archivo «%s»: sólo se escribieron %d de %d bytes en el bloque %u" -#: storage/smgr/md.c:588 -#, fuzzy, c-format -#| msgid "could not extend file \"%s\": %m" -msgid "could not extend file \"%s\" with FileFallocate(): %m" -msgstr "no se pudo extender el archivo «%s»: %m" - -#: storage/smgr/md.c:836 +#: storage/smgr/md.c:589 #, c-format -msgid "could not read block %u in file \"%s\": %m" -msgstr "no se pudo leer el bloque %u del archivo «%s»: %m" +msgid "could not extend file \"%s\" with FileFallocate(): %m" +msgstr "no se pudo extender el archivo «%s» con FileFallocate(): %m" -#: storage/smgr/md.c:852 +#: storage/smgr/md.c:869 #, c-format -msgid "could not read block %u in file \"%s\": read only %d of %d bytes" -msgstr "no se pudo leer el bloque %u del archivo «%s»: se leyeron sólo %d de %d bytes" +msgid "could not read blocks %u..%u in file \"%s\": %m" +msgstr "no se pudo leer los bloques %u..%u del archivo «%s»: %m" -#: storage/smgr/md.c:910 +#: storage/smgr/md.c:895 #, c-format -msgid "could not write block %u in file \"%s\": %m" -msgstr "no se pudo escribir el bloque %u en el archivo «%s»: %m" +msgid "could not read blocks %u..%u in file \"%s\": read only %zu of %zu bytes" +msgstr "no se pudo leer los bloques %u..%u del archivo «%s»: se leyeron sólo %zu de %zu bytes" -#: storage/smgr/md.c:915 +#: storage/smgr/md.c:995 #, c-format -msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" -msgstr "no se pudo escribir el bloque %u en el archivo «%s»: se escribieron sólo %d de %d bytes" +msgid "could not write blocks %u..%u in file \"%s\": %m" +msgstr "no se pudo escribir los bloques %u..%u en el archivo «%s»: %m" -#: storage/smgr/md.c:1009 +#: storage/smgr/md.c:1165 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "no se pudo truncar el archivo «%s» a %u bloques: es de sólo %u bloques ahora" -#: storage/smgr/md.c:1064 +#: storage/smgr/md.c:1220 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "no se pudo truncar el archivo «%s» a %u bloques: %m" -#: storage/smgr/md.c:1491 +#: storage/smgr/md.c:1700 #, c-format msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" msgstr "no se pudo abrir el archivo «%s» (bloque buscado %u): el segmento previo sólo tiene %u bloques" -#: storage/smgr/md.c:1505 +#: storage/smgr/md.c:1714 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "no se pudo abrir el archivo «%s» (bloque buscado %u): %m" -#: tcop/fastpath.c:142 utils/fmgr/fmgr.c:2133 +#: tcop/backend_startup.c:85 +#, c-format +msgid "SSL configuration could not be loaded in child process" +msgstr "No se pudo cargar la configuración SSL en proceso secundario" + +#: tcop/backend_startup.c:208 +#, c-format +msgid "connection received: host=%s port=%s" +msgstr "conexión recibida: host=%s port=%s" + +#: tcop/backend_startup.c:213 +#, c-format +msgid "connection received: host=%s" +msgstr "conexión recibida: host=%s" + +#: tcop/backend_startup.c:277 +#, c-format +msgid "the database system is starting up" +msgstr "el sistema de base de datos está iniciándose" + +#: tcop/backend_startup.c:283 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "el sistema de bases de datos aún no está aceptando conexiones" + +#: tcop/backend_startup.c:284 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "Aún no se ha alcanzado un estado de recuperación consistente." + +#: tcop/backend_startup.c:288 +#, c-format +msgid "the database system is not accepting connections" +msgstr "el sistema de bases de datos no está aceptando conexiones" + +#: tcop/backend_startup.c:289 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "El modo hot standby está desactivado." + +#: tcop/backend_startup.c:294 +#, c-format +msgid "the database system is shutting down" +msgstr "el sistema de base de datos está apagándose" + +#: tcop/backend_startup.c:299 +#, c-format +msgid "the database system is in recovery mode" +msgstr "el sistema de base de datos está en modo de recuperación" + +#: tcop/backend_startup.c:414 +#, c-format +msgid "received direct SSL connection request without ALPN protocol negotiation extension" +msgstr "se recibió petición de conexión SSL directa sin la extensión de negociación de protocolo ALPN" + +#: tcop/backend_startup.c:420 +#, c-format +msgid "direct SSL connection accepted" +msgstr "conexión SSL directa aceptada" + +#: tcop/backend_startup.c:430 +#, c-format +msgid "direct SSL connection rejected" +msgstr "conexión SSL directa rechazada" + +#: tcop/backend_startup.c:489 tcop/backend_startup.c:517 +#, c-format +msgid "incomplete startup packet" +msgstr "el paquete de inicio está incompleto" + +#: tcop/backend_startup.c:501 tcop/backend_startup.c:538 +#, c-format +msgid "invalid length of startup packet" +msgstr "el de paquete de inicio tiene largo incorrecto" + +#: tcop/backend_startup.c:573 +#, c-format +msgid "SSLRequest accepted" +msgstr "SSLRequest aceptado" + +#: tcop/backend_startup.c:576 +#, c-format +msgid "SSLRequest rejected" +msgstr "SSLRequest rechazado" + +#: tcop/backend_startup.c:585 +#, c-format +msgid "failed to send SSL negotiation response: %m" +msgstr "no se pudo enviar la respuesta de negociación SSL: %m" + +#: tcop/backend_startup.c:603 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "se recibieron datos no cifrados después de petición SSL" + +#: tcop/backend_startup.c:604 tcop/backend_startup.c:658 +#, c-format +msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." +msgstr "Esto podría ser un error en el software cliente o evidencia de un intento de ataque man-in-the-middle." + +#: tcop/backend_startup.c:627 +#, c-format +msgid "GSSENCRequest accepted" +msgstr "GSSENCRequest aceptado" + +#: tcop/backend_startup.c:630 +#, c-format +msgid "GSSENCRequest rejected" +msgstr "GSSENCRequest rechazado" + +#: tcop/backend_startup.c:639 +#, c-format +msgid "failed to send GSSAPI negotiation response: %m" +msgstr "no se pudo enviar la respuesta de negociación GSSAPI: %m" + +#: tcop/backend_startup.c:657 +#, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "se recibieron datos no cifrados después de petición de cifrado GSSAPI" + +#: tcop/backend_startup.c:681 +#, c-format +msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" +msgstr "el protocolo %u.%u no está soportado: servidor soporta %u.0 hasta %u.%u" + +#: tcop/backend_startup.c:744 +#, c-format +msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." +msgstr "Los valores válidos son: «false», 0, «true», 1, «database»." + +#: tcop/backend_startup.c:785 +#, c-format +msgid "invalid startup packet layout: expected terminator as last byte" +msgstr "el paquete de inicio no es válido: se esperaba un terminador en el último byte" + +#: tcop/backend_startup.c:802 +#, c-format +msgid "no PostgreSQL user name specified in startup packet" +msgstr "no se especifica un nombre de usuario en el paquete de inicio" + +#: tcop/fastpath.c:142 utils/fmgr/fmgr.c:2161 #, c-format msgid "function with OID %u does not exist" msgstr "no existe la función con OID %u" @@ -22456,8 +23054,8 @@ msgstr "no se puede llamar a la función «%s» mediante la interfaz fastpath" msgid "fastpath function call: \"%s\" (OID %u)" msgstr "llamada a función fastpath: «%s» (OID %u)" -#: tcop/fastpath.c:313 tcop/postgres.c:1365 tcop/postgres.c:1601 -#: tcop/postgres.c:2059 tcop/postgres.c:2309 +#: tcop/fastpath.c:313 tcop/postgres.c:1369 tcop/postgres.c:1605 +#: tcop/postgres.c:2071 tcop/postgres.c:2333 #, c-format msgid "duration: %s ms" msgstr "duración: %s ms" @@ -22487,317 +23085,320 @@ msgstr "el tamaño de argumento %d no es válido en el mensaje de llamada a func msgid "incorrect binary data format in function argument %d" msgstr "el formato de datos binarios es incorrecto en argumento %d a función" -#: tcop/postgres.c:463 tcop/postgres.c:4877 +#: tcop/postgres.c:467 tcop/postgres.c:5012 #, c-format msgid "invalid frontend message type %d" msgstr "el tipo de mensaje de frontend %d no es válido" -#: tcop/postgres.c:1072 +#: tcop/postgres.c:1076 #, c-format msgid "statement: %s" msgstr "sentencia: %s" -#: tcop/postgres.c:1370 +#: tcop/postgres.c:1374 #, c-format msgid "duration: %s ms statement: %s" msgstr "duración: %s ms sentencia: %s" -#: tcop/postgres.c:1476 +#: tcop/postgres.c:1480 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "no se pueden insertar múltiples órdenes en una sentencia preparada" -#: tcop/postgres.c:1606 +#: tcop/postgres.c:1610 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "duración: %s ms parse: %s: %s" -#: tcop/postgres.c:1672 tcop/postgres.c:2629 +#: tcop/postgres.c:1677 tcop/postgres.c:2653 #, c-format msgid "unnamed prepared statement does not exist" msgstr "no existe una sentencia preparada sin nombre" -#: tcop/postgres.c:1713 +#: tcop/postgres.c:1729 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "el mensaje de «bind» tiene %d formatos de parámetro pero %d parámetros" -#: tcop/postgres.c:1719 +#: tcop/postgres.c:1735 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "el mensaje de «bind» entrega %d parámetros, pero la sentencia preparada «%s» requiere %d" -#: tcop/postgres.c:1937 +#: tcop/postgres.c:1949 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "el formato de datos binarios es incorrecto en el parámetro de «bind» %d" -#: tcop/postgres.c:2064 +#: tcop/postgres.c:2076 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "duración: %s ms bind %s%s%s: %s" -#: tcop/postgres.c:2118 tcop/postgres.c:2712 +#: tcop/postgres.c:2131 tcop/postgres.c:2735 #, c-format msgid "portal \"%s\" does not exist" msgstr "no existe el portal «%s»" -#: tcop/postgres.c:2189 +#: tcop/postgres.c:2213 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2191 tcop/postgres.c:2317 +#: tcop/postgres.c:2215 tcop/postgres.c:2341 msgid "execute fetch from" msgstr "ejecutar fetch desde" -#: tcop/postgres.c:2192 tcop/postgres.c:2318 +#: tcop/postgres.c:2216 tcop/postgres.c:2342 msgid "execute" msgstr "ejecutar" -#: tcop/postgres.c:2314 +#: tcop/postgres.c:2338 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "duración: %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2462 +#: tcop/postgres.c:2486 #, c-format msgid "prepare: %s" msgstr "prepare: %s" -#: tcop/postgres.c:2487 +#: tcop/postgres.c:2511 #, c-format -msgid "parameters: %s" -msgstr "parámetros: %s" +msgid "Parameters: %s" +msgstr "Parámetros: %s" -#: tcop/postgres.c:2502 +#: tcop/postgres.c:2526 #, c-format -msgid "abort reason: recovery conflict" -msgstr "razón para abortar: conflicto en la recuperación" +msgid "Abort reason: recovery conflict" +msgstr "Razón para abortar: conflicto en la recuperación" -#: tcop/postgres.c:2518 +#: tcop/postgres.c:2542 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "El usuario mantuvo el búfer compartido «clavado» por demasiado tiempo." -#: tcop/postgres.c:2521 +#: tcop/postgres.c:2545 #, c-format msgid "User was holding a relation lock for too long." msgstr "El usuario mantuvo una relación bloqueada por demasiado tiempo." -#: tcop/postgres.c:2524 +#: tcop/postgres.c:2548 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "El usuario estaba o pudo haber estado usando un tablespace que debía ser eliminado." -#: tcop/postgres.c:2527 +#: tcop/postgres.c:2551 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "La consulta del usuario pudo haber necesitado examinar versiones de tuplas que debían eliminarse." -#: tcop/postgres.c:2530 -#, fuzzy, c-format -#| msgid "User was connected to a database that must be dropped." -msgid "User was using a logical slot that must be invalidated." -msgstr "El usuario estaba conectado a una base de datos que debía ser eliminada." +#: tcop/postgres.c:2554 +#, c-format +msgid "User was using a logical replication slot that must be invalidated." +msgstr "El usuario estaba usando un slot de replicación lógica que debía ser invalidado." -#: tcop/postgres.c:2536 +#: tcop/postgres.c:2560 #, c-format msgid "User was connected to a database that must be dropped." msgstr "El usuario estaba conectado a una base de datos que debía ser eliminada." -#: tcop/postgres.c:2575 +#: tcop/postgres.c:2599 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "portal «%s» parámetro $%d = %s" -#: tcop/postgres.c:2578 +#: tcop/postgres.c:2602 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "portal «%s» parámetro $%d" -#: tcop/postgres.c:2584 +#: tcop/postgres.c:2608 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "portal sin nombre, parámetro %d = %s" -#: tcop/postgres.c:2587 +#: tcop/postgres.c:2611 #, c-format msgid "unnamed portal parameter $%d" msgstr "portal sin nombre, parámetro %d" -#: tcop/postgres.c:2932 +#: tcop/postgres.c:2955 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "terminando la conexión debido a una señal SIGQUIT inesperada" -#: tcop/postgres.c:2938 +#: tcop/postgres.c:2961 #, c-format msgid "terminating connection because of crash of another server process" msgstr "terminando la conexión debido a una falla en otro proceso servidor" -#: tcop/postgres.c:2939 +#: tcop/postgres.c:2962 #, c-format msgid "The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory." msgstr "Postmaster ha ordenado que este proceso servidor cancele la transacción en curso y finalice la conexión, porque otro proceso servidor ha terminado anormalmente y podría haber corrompido la memoria compartida." -#: tcop/postgres.c:2943 tcop/postgres.c:3310 +#: tcop/postgres.c:2966 tcop/postgres.c:3219 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "Dentro de un momento debería poder reconectarse y repetir la consulta." -#: tcop/postgres.c:2950 +#: tcop/postgres.c:2973 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "terminando la conexión debido a una orden de apagado inmediato" -#: tcop/postgres.c:3036 +#: tcop/postgres.c:3051 #, c-format msgid "floating-point exception" msgstr "excepción de coma flotante" -#: tcop/postgres.c:3037 +#: tcop/postgres.c:3052 #, c-format msgid "An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero." msgstr "Se ha recibido una señal de una operación de coma flotante no válida. Esto puede significar un resultado fuera de rango o una operación no válida, como una división por cero." -#: tcop/postgres.c:3214 +#: tcop/postgres.c:3217 +#, c-format +msgid "terminating connection due to conflict with recovery" +msgstr "terminando la conexión debido a un conflicto con la recuperación" + +#: tcop/postgres.c:3289 #, c-format msgid "canceling authentication due to timeout" msgstr "cancelando la autentificación debido a que se agotó el tiempo de espera" -#: tcop/postgres.c:3218 +#: tcop/postgres.c:3293 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "terminando el proceso autovacuum debido a una orden del administrador" -#: tcop/postgres.c:3222 +#: tcop/postgres.c:3297 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "terminando el proceso de replicación lógica debido a una orden del administrador" -#: tcop/postgres.c:3239 tcop/postgres.c:3249 tcop/postgres.c:3308 -#, c-format -msgid "terminating connection due to conflict with recovery" -msgstr "terminando la conexión debido a un conflicto con la recuperación" - -#: tcop/postgres.c:3260 +#: tcop/postgres.c:3317 #, c-format msgid "terminating connection due to administrator command" msgstr "terminando la conexión debido a una orden del administrador" -#: tcop/postgres.c:3291 +#: tcop/postgres.c:3348 #, c-format msgid "connection to client lost" msgstr "se ha perdido la conexión al cliente" -#: tcop/postgres.c:3361 +#: tcop/postgres.c:3400 #, c-format msgid "canceling statement due to lock timeout" -msgstr "cancelando la sentencia debido a que se agotó el tiempo de espera de candados (locks)" +msgstr "cancelando la sentencia debido a que se agotó el tiempo de espera de “locksâ€" -#: tcop/postgres.c:3368 +#: tcop/postgres.c:3407 #, c-format msgid "canceling statement due to statement timeout" msgstr "cancelando la sentencia debido a que se agotó el tiempo de espera de sentencias" -#: tcop/postgres.c:3375 +#: tcop/postgres.c:3414 #, c-format msgid "canceling autovacuum task" msgstr "cancelando tarea de autovacuum" -#: tcop/postgres.c:3398 +#: tcop/postgres.c:3427 #, c-format msgid "canceling statement due to user request" msgstr "cancelando la sentencia debido a una petición del usuario" -#: tcop/postgres.c:3412 +#: tcop/postgres.c:3448 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "terminando la conexión debido a que se agotó el tiempo de espera para transacciones abiertas inactivas" -#: tcop/postgres.c:3423 +#: tcop/postgres.c:3461 +#, c-format +msgid "terminating connection due to transaction timeout" +msgstr "terminando la conexión debido a que se agotó el tiempo de espera para transacciones" + +#: tcop/postgres.c:3474 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "terminando la conexión debido a que se agotó el tiempo de espera para sesiones abiertas inactivas" -#: tcop/postgres.c:3514 +#: tcop/postgres.c:3564 #, c-format msgid "stack depth limit exceeded" msgstr "límite de profundidad de stack alcanzado" -#: tcop/postgres.c:3515 +#: tcop/postgres.c:3565 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "Incremente el parámetro de configuración «max_stack_depth» (actualmente %dkB), después de asegurarse que el límite de profundidad de stack de la plataforma es adecuado." -#: tcop/postgres.c:3562 +#: tcop/postgres.c:3612 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "«max_stack_depth» no debe exceder %ldkB." -#: tcop/postgres.c:3564 +#: tcop/postgres.c:3614 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "Incremente el límite de profundidad del stack del sistema usando «ulimit -s» o el equivalente de su sistema." -#: tcop/postgres.c:3587 -#, fuzzy, c-format -#| msgid "huge_page_size must be 0 on this platform." -msgid "client_connection_check_interval must be set to 0 on this platform." -msgstr "huge_page_size debe ser 0 en esta plataforma." +#: tcop/postgres.c:3637 +#, c-format +msgid "\"client_connection_check_interval\" must be set to 0 on this platform." +msgstr "«client_connection_check_interval» debe ser 0 en esta plataforma." -#: tcop/postgres.c:3608 +#: tcop/postgres.c:3658 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "No se puede activar el parámetro cuando «log_statement_stats» está activo." -#: tcop/postgres.c:3623 +#: tcop/postgres.c:3673 #, c-format msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." msgstr "No se puede activar «log_statement_stats» cuando «log_parser_stats», «log_planner_stats» o «log_executor_stats» están activos." -#: tcop/postgres.c:3971 +#: tcop/postgres.c:4098 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "argumentos de línea de órdenes no válidos para proceso servidor: %s" -#: tcop/postgres.c:3972 tcop/postgres.c:3978 +#: tcop/postgres.c:4099 tcop/postgres.c:4105 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: tcop/postgres.c:3976 +#: tcop/postgres.c:4103 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: argumento de línea de órdenes no válido: %s" -#: tcop/postgres.c:4029 +#: tcop/postgres.c:4156 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: no se ha especificado base de datos ni usuario" -#: tcop/postgres.c:4774 +#: tcop/postgres.c:4909 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "subtipo %d de mensaje CLOSE no válido" -#: tcop/postgres.c:4811 +#: tcop/postgres.c:4946 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "subtipo %d de mensaje DESCRIBE no válido" -#: tcop/postgres.c:4898 +#: tcop/postgres.c:5033 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "la invocación «fastpath» de funciones no está soportada en conexiones de replicación" -#: tcop/postgres.c:4902 +#: tcop/postgres.c:5037 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "el protocolo extendido de consultas no está soportado en conexiones de replicación" -#: tcop/postgres.c:5082 +#: tcop/postgres.c:5217 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "desconexión: duración de sesión: %d:%02d:%02d.%03d usuario=%s base=%s host=%s%s%s" @@ -22807,57 +23408,56 @@ msgstr "desconexión: duración de sesión: %d:%02d:%02d.%03d usuario=%s base=%s msgid "bind message has %d result formats but query has %d columns" msgstr "el mensaje de «bind» tiene %d formatos de resultado pero la consulta tiene %d columnas" -#: tcop/pquery.c:944 tcop/pquery.c:1701 +#: tcop/pquery.c:942 tcop/pquery.c:1696 #, c-format msgid "cursor can only scan forward" msgstr "el cursor sólo se puede desplazar hacia adelante" -#: tcop/pquery.c:945 tcop/pquery.c:1702 +#: tcop/pquery.c:943 tcop/pquery.c:1697 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Declárelo con SCROLL para permitirle desplazar hacia atrás." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:417 +#: tcop/utility.c:410 #, c-format msgid "cannot execute %s in a read-only transaction" msgstr "no se puede ejecutar %s en una transacción de sólo lectura" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:435 +#: tcop/utility.c:428 #, c-format msgid "cannot execute %s during a parallel operation" msgstr "no se puede ejecutar %s durante una operación paralela" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:454 +#: tcop/utility.c:447 #, c-format msgid "cannot execute %s during recovery" msgstr "no se puede ejecutar %s durante la recuperación" #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:472 +#: tcop/utility.c:465 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "no se puede ejecutar %s durante una operación restringida por seguridad" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:828 +#: tcop/utility.c:821 #, c-format msgid "cannot execute %s within a background process" msgstr "no se puede ejecutar %s dentro de un proceso en segundo plano" -#: tcop/utility.c:953 -#, fuzzy, c-format -#| msgid "permission denied for sequence %s" +#. translator: %s is name of a SQL command, eg CHECKPOINT +#: tcop/utility.c:947 +#, c-format msgid "permission denied to execute %s command" -msgstr "permiso denegado a la secuencia %s" +msgstr "permiso denegado a ejecutar la sentencia %s" -#: tcop/utility.c:955 -#, fuzzy, c-format -#| msgid "Set the privileges of the element type instead." +#: tcop/utility.c:949 +#, c-format msgid "Only roles with privileges of the \"%s\" role may execute this command." -msgstr "Defina los privilegios del tipo elemento en su lugar." +msgstr "Sólo los roles con privilegios del rol «%s» pueden ejecutar esta sentencia." #: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:616 #, c-format @@ -23008,13 +23608,13 @@ msgstr "marca de afijo «%s» no válida con el valor de marca «long»" msgid "could not open dictionary file \"%s\": %m" msgstr "no se pudo abrir el archivo de diccionario «%s»: %m" -#: tsearch/spell.c:749 utils/adt/regexp.c:224 jsonpath_gram.y:559 +#: tsearch/spell.c:749 utils/adt/regexp.c:223 jsonpath_gram.y:629 #, c-format msgid "invalid regular expression: %s" msgstr "la expresión regular no es válida: %s" #: tsearch/spell.c:963 tsearch/spell.c:980 tsearch/spell.c:997 -#: tsearch/spell.c:1014 tsearch/spell.c:1079 gram.y:18187 gram.y:18204 +#: tsearch/spell.c:1014 tsearch/spell.c:1079 gram.y:18735 gram.y:18752 #, c-format msgid "syntax error" msgstr "error de sintaxis" @@ -23050,17 +23650,17 @@ msgstr "el número de aliases excede el número especificado %d" msgid "affix file contains both old-style and new-style commands" msgstr "el archivo de «affix» contiene órdenes en estilos antiguo y nuevo" -#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:278 utils/adt/tsvector_op.c:1128 +#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:277 utils/adt/tsvector_op.c:1126 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "la cadena es demasiado larga para tsvector (%d bytes, máximo %d bytes)" -#: tsearch/ts_locale.c:238 +#: tsearch/ts_locale.c:236 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "línea %d del archivo de configuración «%s»: «%s»" -#: tsearch/ts_locale.c:317 +#: tsearch/ts_locale.c:315 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "conversión desde un wchar_t a la codificación del servidor falló: %m" @@ -23087,194 +23687,197 @@ msgstr "nombre de configuración de búsqueda en texto «%s» no válido" msgid "could not open stop-word file \"%s\": %m" msgstr "no se pudo abrir el archivo de stopwords «%s»: %m" -#: tsearch/wparser.c:308 tsearch/wparser.c:396 tsearch/wparser.c:473 +#: tsearch/wparser.c:306 tsearch/wparser.c:394 tsearch/wparser.c:471 #, c-format msgid "text search parser does not support headline creation" msgstr "el analizador de búsqueda en texto no soporta creación de encabezados (headline)" -#: tsearch/wparser_def.c:2648 +#: tsearch/wparser_def.c:2664 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "parámetro de encabezado (headline) no reconocido: «%s»" -#: tsearch/wparser_def.c:2658 +#: tsearch/wparser_def.c:2674 #, c-format -msgid "MinWords should be less than MaxWords" -msgstr "MinWords debería ser menor que MaxWords" +#| msgid "%s must be in range %d..%d" +msgid "%s must be less than %s" +msgstr "%s debe ser menor que %s" -#: tsearch/wparser_def.c:2662 +#: tsearch/wparser_def.c:2678 #, c-format -msgid "MinWords should be positive" -msgstr "MinWords debería ser positivo" +#| msgid "COST must be positive" +msgid "%s must be positive" +msgstr "%s debe ser positivo" -#: tsearch/wparser_def.c:2666 +#: tsearch/wparser_def.c:2682 tsearch/wparser_def.c:2686 #, c-format -msgid "ShortWord should be >= 0" -msgstr "ShortWord debería ser >= 0" +msgid "%s must be >= 0" +msgstr "%s debe ser >= 0" -#: tsearch/wparser_def.c:2670 +#: utils/activity/pgstat.c:435 #, c-format -msgid "MaxFragments should be >= 0" -msgstr "MaxFragments debería ser >= 0" - -#: utils/activity/pgstat.c:431 -#, fuzzy, c-format -#| msgid "could not open statistics file \"%s\": %m" msgid "could not unlink permanent statistics file \"%s\": %m" -msgstr "no se pudo abrir el archivo de estadísticas «%s»: %m" +msgstr "no se pudo eliminar el archivo permanente de estadísticas «%s»: %m" -#: utils/activity/pgstat.c:1224 -#, fuzzy, c-format -#| msgid "unrecognized statistics kind \"%s\"" +#: utils/activity/pgstat.c:1255 +#, c-format msgid "invalid statistics kind: \"%s\"" -msgstr "tipo de estadísticas «%s» no reconocido" +msgstr "tipo de estadísticas no válido: «%s»" -#: utils/activity/pgstat.c:1304 +#: utils/activity/pgstat.c:1335 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "no se pudo abrir el archivo temporal de estadísticas «%s»: %m" -#: utils/activity/pgstat.c:1416 +#: utils/activity/pgstat.c:1455 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "no se pudo escribir el archivo temporal de estadísticas «%s»: %m" -#: utils/activity/pgstat.c:1425 +#: utils/activity/pgstat.c:1464 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "no se pudo cerrar el archivo temporal de estadísticas «%s»: %m" -#: utils/activity/pgstat.c:1433 +#: utils/activity/pgstat.c:1472 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "no se pudo cambiar el nombre al archivo temporal de estadísticas de «%s» a «%s»: %m" -#: utils/activity/pgstat.c:1482 +#: utils/activity/pgstat.c:1521 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "no se pudo abrir el archivo de estadísticas «%s»: %m" -#: utils/activity/pgstat.c:1644 +#: utils/activity/pgstat.c:1683 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "el archivo de estadísticas «%s» está corrupto" #: utils/activity/pgstat_function.c:118 -#, fuzzy, c-format -#| msgid "cast function must be a normal function" +#, c-format msgid "function call to dropped function" -msgstr "la función de conversión debe ser una función normal" +msgstr "invocación a una función eliminada" -#: utils/activity/pgstat_xact.c:363 +#: utils/activity/pgstat_xact.c:362 #, c-format msgid "resetting existing statistics for kind %s, db=%u, oid=%u" -msgstr "" +msgstr "reseteando estadísticas existentes para el tipo %s, db=%u, oid=%u" + +#: utils/activity/wait_event.c:207 utils/activity/wait_event.c:232 +#, c-format +msgid "wait event \"%s\" already exists in type \"%s\"" +msgstr "ya existe un “wait event†llamado «%s» en el tipo «%s»" -#: utils/adt/acl.c:177 utils/adt/name.c:93 +#: utils/activity/wait_event.c:246 +#, c-format +msgid "too many custom wait events" +msgstr "demasiados “wait events†definidos por el usuario" + +#: utils/adt/acl.c:183 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "el identificador es demasiado largo" -#: utils/adt/acl.c:178 utils/adt/name.c:94 +#: utils/adt/acl.c:184 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "El identificador debe ser menor a %d caracteres." -#: utils/adt/acl.c:266 +#: utils/adt/acl.c:272 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "palabra clave no reconocida: «%s»" -#: utils/adt/acl.c:267 +#: utils/adt/acl.c:273 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "Palabra clave de ACL debe ser «group» o «user»." -#: utils/adt/acl.c:275 +#: utils/adt/acl.c:281 #, c-format msgid "missing name" msgstr "falta un nombre" -#: utils/adt/acl.c:276 +#: utils/adt/acl.c:282 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "Debe venir un nombre después de una palabra clave «group» o «user»." -#: utils/adt/acl.c:282 +#: utils/adt/acl.c:288 #, c-format msgid "missing \"=\" sign" msgstr "falta un signo «=»" -#: utils/adt/acl.c:344 +#: utils/adt/acl.c:350 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "carácter de modo no válido: debe ser uno de «%s»" -#: utils/adt/acl.c:374 +#: utils/adt/acl.c:380 #, c-format msgid "a name must follow the \"/\" sign" msgstr "debe venir un nombre después del signo «/»" -#: utils/adt/acl.c:386 +#: utils/adt/acl.c:392 #, c-format msgid "defaulting grantor to user ID %u" msgstr "usando el cedente por omisión con ID %u" -#: utils/adt/acl.c:572 +#: utils/adt/acl.c:578 #, c-format msgid "ACL array contains wrong data type" msgstr "el array ACL contiene tipo de datos incorrecto" -#: utils/adt/acl.c:576 +#: utils/adt/acl.c:582 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "los array de ACL debe ser unidimensional" -#: utils/adt/acl.c:580 +#: utils/adt/acl.c:586 #, c-format msgid "ACL arrays must not contain null values" msgstr "los arrays de ACL no pueden contener valores nulos" -#: utils/adt/acl.c:609 +#: utils/adt/acl.c:615 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "basura extra al final de la especificación de la ACL" -#: utils/adt/acl.c:1251 +#: utils/adt/acl.c:1263 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "la opción de grant no puede ser otorgada de vuelta a quien la otorgó" -#: utils/adt/acl.c:1567 +#: utils/adt/acl.c:1579 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert ya no está soportado" -#: utils/adt/acl.c:1577 +#: utils/adt/acl.c:1589 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove ya no está soportado" -#: utils/adt/acl.c:1697 +#: utils/adt/acl.c:1709 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "tipo de privilegio no reconocido: «%s»" -#: utils/adt/acl.c:3484 utils/adt/regproc.c:100 utils/adt/regproc.c:265 +#: utils/adt/acl.c:3550 utils/adt/regproc.c:100 utils/adt/regproc.c:265 #, c-format msgid "function \"%s\" does not exist" msgstr "no existe la función «%s»" -#: utils/adt/acl.c:5031 -#, fuzzy, c-format -#| msgid "must be member of role \"%s\"" +#: utils/adt/acl.c:5196 +#, c-format msgid "must be able to SET ROLE \"%s\"" -msgstr "debe ser miembro del rol «%s»" +msgstr "debe ser capaz de hacer SET ROLE «%s»" #: utils/adt/array_userfuncs.c:102 utils/adt/array_userfuncs.c:489 -#: utils/adt/array_userfuncs.c:878 utils/adt/json.c:694 utils/adt/json.c:831 -#: utils/adt/json.c:869 utils/adt/jsonb.c:1139 utils/adt/jsonb.c:1211 -#: utils/adt/jsonb.c:1629 utils/adt/jsonb.c:1817 utils/adt/jsonb.c:1827 +#: utils/adt/array_userfuncs.c:866 utils/adt/json.c:602 utils/adt/json.c:740 +#: utils/adt/json.c:790 utils/adt/jsonb.c:1025 utils/adt/jsonb.c:1098 +#: utils/adt/jsonb.c:1530 utils/adt/jsonb.c:1718 utils/adt/jsonb.c:1728 #, c-format msgid "could not determine input data type" msgstr "no se pudo determinar el tipo de dato de entrada" @@ -23285,17 +23888,17 @@ msgid "input data type is not an array" msgstr "el tipo de entrada no es un array" #: utils/adt/array_userfuncs.c:151 utils/adt/array_userfuncs.c:203 -#: utils/adt/float.c:1229 utils/adt/float.c:1303 utils/adt/float.c:4118 -#: utils/adt/float.c:4156 utils/adt/int.c:778 utils/adt/int.c:800 +#: utils/adt/float.c:1222 utils/adt/float.c:1296 utils/adt/float.c:4022 +#: utils/adt/float.c:4060 utils/adt/int.c:778 utils/adt/int.c:800 #: utils/adt/int.c:814 utils/adt/int.c:828 utils/adt/int.c:859 #: utils/adt/int.c:880 utils/adt/int.c:997 utils/adt/int.c:1011 #: utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 #: utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 #: utils/adt/int.c:1263 utils/adt/int.c:1331 utils/adt/int.c:1337 -#: utils/adt/int8.c:1257 utils/adt/numeric.c:1901 utils/adt/numeric.c:4388 -#: utils/adt/rangetypes.c:1481 utils/adt/rangetypes.c:1494 -#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1132 -#: utils/adt/varlena.c:3135 +#: utils/adt/int8.c:1256 utils/adt/numeric.c:1917 utils/adt/numeric.c:4454 +#: utils/adt/rangetypes.c:1488 utils/adt/rangetypes.c:1501 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1135 +#: utils/adt/varlena.c:3137 #, c-format msgid "integer out of range" msgstr "entero fuera de rango" @@ -23332,268 +23935,278 @@ msgstr "Los arrays con elementos de diferentes dimensiones son incompatibles par msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "Los arrays con diferentes dimensiones son incompatibles para la concatenación." -#: utils/adt/array_userfuncs.c:987 utils/adt/array_userfuncs.c:995 -#: utils/adt/arrayfuncs.c:5591 utils/adt/arrayfuncs.c:5597 +#: utils/adt/array_userfuncs.c:975 utils/adt/array_userfuncs.c:983 +#: utils/adt/arrayfuncs.c:5616 utils/adt/arrayfuncs.c:5622 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "no se pueden acumular arrays de distinta dimensionalidad" -#: utils/adt/array_userfuncs.c:1286 utils/adt/array_userfuncs.c:1440 +#: utils/adt/array_userfuncs.c:1272 utils/adt/array_userfuncs.c:1426 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "no está soportada la búsqueda de elementos en arrays multidimensionales" -#: utils/adt/array_userfuncs.c:1315 +#: utils/adt/array_userfuncs.c:1301 #, c-format msgid "initial position must not be null" msgstr "la posición inicial no debe ser null" -#: utils/adt/array_userfuncs.c:1688 -#, fuzzy, c-format -#| msgid "sample percentage must be between 0 and 100" +#: utils/adt/array_userfuncs.c:1674 +#, c-format msgid "sample size must be between 0 and %d" -msgstr "el porcentaje de muestreo debe estar entre 0 y 100" - -#: utils/adt/arrayfuncs.c:273 utils/adt/arrayfuncs.c:287 -#: utils/adt/arrayfuncs.c:298 utils/adt/arrayfuncs.c:320 -#: utils/adt/arrayfuncs.c:337 utils/adt/arrayfuncs.c:351 -#: utils/adt/arrayfuncs.c:359 utils/adt/arrayfuncs.c:366 -#: utils/adt/arrayfuncs.c:506 utils/adt/arrayfuncs.c:521 -#: utils/adt/arrayfuncs.c:532 utils/adt/arrayfuncs.c:547 -#: utils/adt/arrayfuncs.c:568 utils/adt/arrayfuncs.c:598 -#: utils/adt/arrayfuncs.c:605 utils/adt/arrayfuncs.c:613 -#: utils/adt/arrayfuncs.c:647 utils/adt/arrayfuncs.c:670 -#: utils/adt/arrayfuncs.c:690 utils/adt/arrayfuncs.c:807 -#: utils/adt/arrayfuncs.c:816 utils/adt/arrayfuncs.c:846 -#: utils/adt/arrayfuncs.c:861 utils/adt/arrayfuncs.c:914 +msgstr "el tamaño de la muestra debe estar entre 0 y %d" + +#: utils/adt/arrayfuncs.c:264 utils/adt/arrayfuncs.c:273 +#: utils/adt/arrayfuncs.c:284 utils/adt/arrayfuncs.c:307 +#: utils/adt/arrayfuncs.c:440 utils/adt/arrayfuncs.c:454 +#: utils/adt/arrayfuncs.c:466 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:668 utils/adt/arrayfuncs.c:703 +#: utils/adt/arrayfuncs.c:718 utils/adt/arrayfuncs.c:777 +#: utils/adt/arrayfuncs.c:782 utils/adt/arrayfuncs.c:870 +#: utils/adt/arrayfuncs.c:897 utils/adt/arrayfuncs.c:904 +#: utils/adt/arrayfuncs.c:941 #, c-format msgid "malformed array literal: \"%s\"" msgstr "literal de array mal formado: «%s»" -#: utils/adt/arrayfuncs.c:274 -#, c-format -msgid "\"[\" must introduce explicitly-specified array dimensions." -msgstr "Un «[» debe introducir dimensiones de array especificadas explícitamente." - -#: utils/adt/arrayfuncs.c:288 +#: utils/adt/arrayfuncs.c:265 #, c-format -msgid "Missing array dimension value." -msgstr "Falta un valor de dimensión de array." +msgid "Array value must start with \"{\" or dimension information." +msgstr "El valor de array debe comenzar con «{» o información de dimensión." -#: utils/adt/arrayfuncs.c:299 utils/adt/arrayfuncs.c:338 +#: utils/adt/arrayfuncs.c:274 utils/adt/arrayfuncs.c:467 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "Falta «%s» luego de las dimensiones de array." -#: utils/adt/arrayfuncs.c:308 utils/adt/arrayfuncs.c:2933 -#: utils/adt/arrayfuncs.c:2965 utils/adt/arrayfuncs.c:2980 +#: utils/adt/arrayfuncs.c:285 #, c-format -msgid "upper bound cannot be less than lower bound" -msgstr "el límite superior no puede ser menor que el límite inferior" +msgid "Array contents must start with \"{\"." +msgstr "El contenido del array debe empezar con «{»." -#: utils/adt/arrayfuncs.c:321 +#: utils/adt/arrayfuncs.c:308 utils/adt/multirangetypes.c:292 #, c-format -msgid "Array value must start with \"{\" or dimension information." -msgstr "El valor de array debe comenzar con «{» o información de dimensión." +msgid "Junk after closing right brace." +msgstr "Basura después de la llave derecha de cierre." -#: utils/adt/arrayfuncs.c:352 +#: utils/adt/arrayfuncs.c:431 utils/adt/arrayfuncs.c:643 #, c-format -msgid "Array contents must start with \"{\"." -msgstr "El contenido del array debe empezar con «{»." +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "el número de dimensiones del array excede el máximo permitido (%d)" -#: utils/adt/arrayfuncs.c:360 utils/adt/arrayfuncs.c:367 +#: utils/adt/arrayfuncs.c:441 #, c-format -msgid "Specified array dimensions do not match array contents." -msgstr "Las dimensiones del array especificadas no coinciden con el contenido del array." +msgid "\"[\" must introduce explicitly-specified array dimensions." +msgstr "Un «[» debe introducir dimensiones de array especificadas explícitamente." -#: utils/adt/arrayfuncs.c:507 utils/adt/arrayfuncs.c:533 -#: utils/adt/multirangetypes.c:166 utils/adt/rangetypes.c:2405 -#: utils/adt/rangetypes.c:2413 utils/adt/rowtypes.c:219 -#: utils/adt/rowtypes.c:230 +#: utils/adt/arrayfuncs.c:455 #, c-format -msgid "Unexpected end of input." -msgstr "Fin inesperado de la entrada." +msgid "Missing array dimension value." +msgstr "Falta un valor de dimensión de array." + +#: utils/adt/arrayfuncs.c:481 utils/adt/arrayfuncs.c:2940 +#: utils/adt/arrayfuncs.c:2985 utils/adt/arrayfuncs.c:3000 +#, c-format +msgid "upper bound cannot be less than lower bound" +msgstr "el límite superior no puede ser menor que el límite inferior" + +#: utils/adt/arrayfuncs.c:487 +#, c-format +msgid "array upper bound is too large: %d" +msgstr "el límite superior del array es demasiado grande: %d" -#: utils/adt/arrayfuncs.c:522 utils/adt/arrayfuncs.c:569 -#: utils/adt/arrayfuncs.c:599 utils/adt/arrayfuncs.c:648 +#: utils/adt/arrayfuncs.c:538 +#, c-format +msgid "array bound is out of integer range" +msgstr "límite de array está fuera del rango entero" + +#: utils/adt/arrayfuncs.c:637 utils/adt/arrayfuncs.c:669 +#: utils/adt/arrayfuncs.c:704 utils/adt/arrayfuncs.c:898 #, c-format msgid "Unexpected \"%c\" character." msgstr "Carácter «%c» inesperado." -#: utils/adt/arrayfuncs.c:548 utils/adt/arrayfuncs.c:671 +#: utils/adt/arrayfuncs.c:719 #, c-format msgid "Unexpected array element." msgstr "Elemento de array inesperado." -#: utils/adt/arrayfuncs.c:606 +#: utils/adt/arrayfuncs.c:778 #, c-format -msgid "Unmatched \"%c\" character." -msgstr "Carácter «%c» desemparejado." +msgid "Specified array dimensions do not match array contents." +msgstr "Las dimensiones del array especificadas no coinciden con el contenido del array." -#: utils/adt/arrayfuncs.c:614 utils/adt/jsonfuncs.c:2553 +#: utils/adt/arrayfuncs.c:783 utils/adt/jsonfuncs.c:2598 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "Los arrays multidimensionales deben tener sub-arrays con dimensiones coincidentes." -#: utils/adt/arrayfuncs.c:691 utils/adt/multirangetypes.c:293 +#: utils/adt/arrayfuncs.c:871 utils/adt/arrayfuncs.c:905 #, c-format -msgid "Junk after closing right brace." -msgstr "Basura después de la llave derecha de cierre." +msgid "Incorrectly quoted array element." +msgstr "Elemento de array entrecomillado incorrectamente." + +#: utils/adt/arrayfuncs.c:942 utils/adt/multirangetypes.c:165 +#: utils/adt/rangetypes.c:2464 utils/adt/rangetypes.c:2472 +#: utils/adt/rowtypes.c:218 utils/adt/rowtypes.c:229 +#, c-format +msgid "Unexpected end of input." +msgstr "Fin inesperado de la entrada." -#: utils/adt/arrayfuncs.c:1325 utils/adt/arrayfuncs.c:3480 -#: utils/adt/arrayfuncs.c:6081 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 +#: utils/adt/arrayfuncs.c:6106 #, c-format msgid "invalid number of dimensions: %d" msgstr "número incorrecto de dimensiones: %d" -#: utils/adt/arrayfuncs.c:1336 +#: utils/adt/arrayfuncs.c:1312 #, c-format msgid "invalid array flags" msgstr "opciones de array no válidas" -#: utils/adt/arrayfuncs.c:1358 +#: utils/adt/arrayfuncs.c:1334 #, c-format msgid "binary data has array element type %u (%s) instead of expected %u (%s)" msgstr "los datos binarios tienen el tipo de elemento de array %u (%s) en lugar del esperado %u (%s)" -#: utils/adt/arrayfuncs.c:1402 utils/adt/multirangetypes.c:451 -#: utils/adt/rangetypes.c:344 utils/cache/lsyscache.c:2916 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:450 +#: utils/adt/rangetypes.c:351 utils/cache/lsyscache.c:2958 #, c-format msgid "no binary input function available for type %s" msgstr "no hay una función binaria de entrada para el tipo %s" -#: utils/adt/arrayfuncs.c:1542 +#: utils/adt/arrayfuncs.c:1509 #, c-format msgid "improper binary format in array element %d" msgstr "el formato binario no es válido en elemento %d de array" -#: utils/adt/arrayfuncs.c:1623 utils/adt/multirangetypes.c:456 -#: utils/adt/rangetypes.c:349 utils/cache/lsyscache.c:2949 +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 +#: utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:2991 #, c-format msgid "no binary output function available for type %s" msgstr "no hay una función binaria de salida para el tipo %s" -#: utils/adt/arrayfuncs.c:2102 +#: utils/adt/arrayfuncs.c:2067 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "no está implementada la obtención de segmentos de arrays de largo fijo" -#: utils/adt/arrayfuncs.c:2280 utils/adt/arrayfuncs.c:2302 -#: utils/adt/arrayfuncs.c:2351 utils/adt/arrayfuncs.c:2589 -#: utils/adt/arrayfuncs.c:2911 utils/adt/arrayfuncs.c:6067 -#: utils/adt/arrayfuncs.c:6093 utils/adt/arrayfuncs.c:6104 -#: utils/adt/json.c:1497 utils/adt/json.c:1569 utils/adt/jsonb.c:1416 -#: utils/adt/jsonb.c:1500 utils/adt/jsonfuncs.c:4434 utils/adt/jsonfuncs.c:4587 -#: utils/adt/jsonfuncs.c:4698 utils/adt/jsonfuncs.c:4746 +#: utils/adt/arrayfuncs.c:2245 utils/adt/arrayfuncs.c:2267 +#: utils/adt/arrayfuncs.c:2316 utils/adt/arrayfuncs.c:2570 +#: utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6092 +#: utils/adt/arrayfuncs.c:6118 utils/adt/arrayfuncs.c:6129 +#: utils/adt/json.c:1433 utils/adt/json.c:1505 utils/adt/jsonb.c:1317 +#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4710 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4974 utils/adt/jsonfuncs.c:5022 #, c-format msgid "wrong number of array subscripts" msgstr "número incorrecto de subíndices del array" -#: utils/adt/arrayfuncs.c:2285 utils/adt/arrayfuncs.c:2393 -#: utils/adt/arrayfuncs.c:2656 utils/adt/arrayfuncs.c:2970 +#: utils/adt/arrayfuncs.c:2250 utils/adt/arrayfuncs.c:2374 +#: utils/adt/arrayfuncs.c:2653 utils/adt/arrayfuncs.c:2990 #, c-format msgid "array subscript out of range" msgstr "subíndice de array fuera de rango" -#: utils/adt/arrayfuncs.c:2290 +#: utils/adt/arrayfuncs.c:2255 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "no se puede asignar un valor nulo a un elemento de un array de longitud fija" -#: utils/adt/arrayfuncs.c:2858 +#: utils/adt/arrayfuncs.c:2855 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "no están implementadas las actualizaciones en segmentos de arrays de largo fija" -#: utils/adt/arrayfuncs.c:2889 +#: utils/adt/arrayfuncs.c:2886 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "los subíndices del segmento de array deben especificar ambos bordes" -#: utils/adt/arrayfuncs.c:2890 +#: utils/adt/arrayfuncs.c:2887 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "Cuando se asigna a un segmento de un array vacío, los bordes del segmento deben ser especificados completamente." -#: utils/adt/arrayfuncs.c:2901 utils/adt/arrayfuncs.c:2997 +#: utils/adt/arrayfuncs.c:2905 utils/adt/arrayfuncs.c:3017 #, c-format msgid "source array too small" msgstr "el array de origen es demasiado pequeño" -#: utils/adt/arrayfuncs.c:3638 +#: utils/adt/arrayfuncs.c:3657 #, c-format msgid "null array element not allowed in this context" msgstr "los arrays con elementos null no son permitidos en este contexto" -#: utils/adt/arrayfuncs.c:3809 utils/adt/arrayfuncs.c:3980 -#: utils/adt/arrayfuncs.c:4371 +#: utils/adt/arrayfuncs.c:3828 utils/adt/arrayfuncs.c:3999 +#: utils/adt/arrayfuncs.c:4390 #, c-format msgid "cannot compare arrays of different element types" msgstr "no se pueden comparar arrays con elementos de distintos tipos" -#: utils/adt/arrayfuncs.c:4158 utils/adt/multirangetypes.c:2806 -#: utils/adt/multirangetypes.c:2878 utils/adt/rangetypes.c:1354 -#: utils/adt/rangetypes.c:1418 utils/adt/rowtypes.c:1885 +#: utils/adt/arrayfuncs.c:4177 utils/adt/multirangetypes.c:2805 +#: utils/adt/multirangetypes.c:2877 utils/adt/rangetypes.c:1361 +#: utils/adt/rangetypes.c:1425 utils/adt/rowtypes.c:1875 #, c-format msgid "could not identify a hash function for type %s" msgstr "no se pudo identificar una función de hash para el tipo %s" -#: utils/adt/arrayfuncs.c:4286 utils/adt/rowtypes.c:2006 +#: utils/adt/arrayfuncs.c:4305 utils/adt/rowtypes.c:1996 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "no se pudo identificar una función de hash extendida para el tipo %s" -#: utils/adt/arrayfuncs.c:5481 +#: utils/adt/arrayfuncs.c:5506 #, c-format msgid "data type %s is not an array type" msgstr "el tipo %s no es un array" -#: utils/adt/arrayfuncs.c:5536 +#: utils/adt/arrayfuncs.c:5561 #, c-format msgid "cannot accumulate null arrays" msgstr "no se pueden acumular arrays nulos" -#: utils/adt/arrayfuncs.c:5564 +#: utils/adt/arrayfuncs.c:5589 #, c-format msgid "cannot accumulate empty arrays" msgstr "no se pueden acumular arrays vacíos" -#: utils/adt/arrayfuncs.c:5965 utils/adt/arrayfuncs.c:6005 +#: utils/adt/arrayfuncs.c:5990 utils/adt/arrayfuncs.c:6030 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "el array de dimensiones o el array de límites inferiores debe ser no nulo" -#: utils/adt/arrayfuncs.c:6068 utils/adt/arrayfuncs.c:6094 +#: utils/adt/arrayfuncs.c:6093 utils/adt/arrayfuncs.c:6119 #, c-format msgid "Dimension array must be one dimensional." msgstr "El array de dimensiones debe ser unidimensional." -#: utils/adt/arrayfuncs.c:6073 utils/adt/arrayfuncs.c:6099 +#: utils/adt/arrayfuncs.c:6098 utils/adt/arrayfuncs.c:6124 #, c-format msgid "dimension values cannot be null" msgstr "los valores de dimensión no pueden ser null" -#: utils/adt/arrayfuncs.c:6105 +#: utils/adt/arrayfuncs.c:6130 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "El array de límites inferiores tiene tamaño diferente que el array de dimensiones." -#: utils/adt/arrayfuncs.c:6383 +#: utils/adt/arrayfuncs.c:6411 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "la eliminación de elementos desde arrays multidimensionales no está soportada" -#: utils/adt/arrayfuncs.c:6660 +#: utils/adt/arrayfuncs.c:6688 #, c-format msgid "thresholds must be one-dimensional array" msgstr "los umbrales deben ser un array unidimensional" -#: utils/adt/arrayfuncs.c:6665 +#: utils/adt/arrayfuncs.c:6693 #, c-format msgid "thresholds array must not contain NULLs" msgstr "el array de umbrales no debe contener nulos" -#: utils/adt/arrayfuncs.c:6898 +#: utils/adt/arrayfuncs.c:6926 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "el número de elementos a recortar debe estar entre 0 y %d" @@ -23608,22 +24221,22 @@ msgstr "los subíndices de arrays deben tener tipo entero" msgid "array subscript in assignment must not be null" msgstr "subíndice de array en asignación no puede ser nulo" -#: utils/adt/arrayutils.c:161 +#: utils/adt/arrayutils.c:140 #, c-format msgid "array lower bound is too large: %d" msgstr "el límite inferior del array es demasiado grande: %d" -#: utils/adt/arrayutils.c:263 +#: utils/adt/arrayutils.c:242 #, c-format msgid "typmod array must be type cstring[]" msgstr "el array de typmod debe ser de tipo cstring[]" -#: utils/adt/arrayutils.c:268 +#: utils/adt/arrayutils.c:247 #, c-format msgid "typmod array must be one-dimensional" msgstr "array de typmod debe ser unidimensional" -#: utils/adt/arrayutils.c:273 +#: utils/adt/arrayutils.c:252 #, c-format msgid "typmod array must not contain nulls" msgstr "los arrays de typmod no deben contener valores nulos" @@ -23634,173 +24247,196 @@ msgid "encoding conversion from %s to ASCII not supported" msgstr "la conversión de codificación de %s a ASCII no está soportada" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:4017 -#: utils/adt/float.c:207 utils/adt/float.c:294 utils/adt/float.c:308 -#: utils/adt/float.c:413 utils/adt/float.c:496 utils/adt/float.c:510 +#: utils/adt/bool.c:149 utils/adt/cash.c:354 utils/adt/datetime.c:4142 +#: utils/adt/float.c:200 utils/adt/float.c:287 utils/adt/float.c:301 +#: utils/adt/float.c:406 utils/adt/float.c:489 utils/adt/float.c:503 #: utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 #: utils/adt/geo_ops.c:1417 utils/adt/geo_ops.c:1454 utils/adt/geo_ops.c:1462 #: utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 #: utils/adt/geo_ops.c:4672 utils/adt/int.c:174 utils/adt/int.c:186 -#: utils/adt/jsonpath.c:183 utils/adt/mac.c:94 utils/adt/mac8.c:225 -#: utils/adt/network.c:99 utils/adt/numeric.c:795 utils/adt/numeric.c:7136 -#: utils/adt/numeric.c:7339 utils/adt/numeric.c:8286 utils/adt/numutils.c:273 -#: utils/adt/numutils.c:451 utils/adt/numutils.c:629 utils/adt/numutils.c:668 -#: utils/adt/numutils.c:690 utils/adt/numutils.c:754 utils/adt/numutils.c:776 -#: utils/adt/pg_lsn.c:74 utils/adt/tid.c:72 utils/adt/tid.c:80 -#: utils/adt/tid.c:94 utils/adt/tid.c:103 utils/adt/timestamp.c:493 -#: utils/adt/uuid.c:135 utils/adt/xid8funcs.c:354 +#: utils/adt/jsonpath.c:185 utils/adt/mac.c:94 utils/adt/mac8.c:226 +#: utils/adt/network.c:99 utils/adt/numeric.c:803 utils/adt/numeric.c:7221 +#: utils/adt/numeric.c:7424 utils/adt/numeric.c:8371 utils/adt/numutils.c:356 +#: utils/adt/numutils.c:618 utils/adt/numutils.c:880 utils/adt/numutils.c:919 +#: utils/adt/numutils.c:941 utils/adt/numutils.c:1005 utils/adt/numutils.c:1027 +#: utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 +#: utils/adt/tid.c:94 utils/adt/tid.c:103 utils/adt/timestamp.c:510 +#: utils/adt/uuid.c:140 utils/adt/xid8funcs.c:323 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "la sintaxis de entrada no es válida para tipo %s: «%s»" -#: utils/adt/cash.c:215 utils/adt/cash.c:240 utils/adt/cash.c:250 -#: utils/adt/cash.c:290 utils/adt/int.c:180 utils/adt/numutils.c:267 -#: utils/adt/numutils.c:445 utils/adt/numutils.c:623 utils/adt/numutils.c:674 -#: utils/adt/numutils.c:713 utils/adt/numutils.c:760 +#: utils/adt/cash.c:98 utils/adt/cash.c:111 utils/adt/cash.c:124 +#: utils/adt/cash.c:137 utils/adt/cash.c:150 #, c-format -msgid "value \"%s\" is out of range for type %s" -msgstr "el valor «%s» está fuera de rango para el tipo %s" +msgid "money out of range" +msgstr "money fuera de rango" -#: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 -#: utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 -#: utils/adt/float.c:105 utils/adt/int.c:843 utils/adt/int.c:959 -#: utils/adt/int.c:1039 utils/adt/int.c:1101 utils/adt/int.c:1139 -#: utils/adt/int.c:1167 utils/adt/int8.c:515 utils/adt/int8.c:573 -#: utils/adt/int8.c:943 utils/adt/int8.c:1023 utils/adt/int8.c:1085 -#: utils/adt/int8.c:1165 utils/adt/numeric.c:3175 utils/adt/numeric.c:3198 -#: utils/adt/numeric.c:3283 utils/adt/numeric.c:3301 utils/adt/numeric.c:3397 -#: utils/adt/numeric.c:8835 utils/adt/numeric.c:9148 utils/adt/numeric.c:9496 -#: utils/adt/numeric.c:9612 utils/adt/numeric.c:11122 -#: utils/adt/timestamp.c:3414 +#: utils/adt/cash.c:161 utils/adt/cash.c:723 utils/adt/float.c:99 +#: utils/adt/int.c:843 utils/adt/int.c:959 utils/adt/int.c:1039 +#: utils/adt/int.c:1101 utils/adt/int.c:1139 utils/adt/int.c:1167 +#: utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:942 +#: utils/adt/int8.c:1022 utils/adt/int8.c:1084 utils/adt/int8.c:1164 +#: utils/adt/numeric.c:3191 utils/adt/numeric.c:3214 utils/adt/numeric.c:3299 +#: utils/adt/numeric.c:3317 utils/adt/numeric.c:3413 utils/adt/numeric.c:8920 +#: utils/adt/numeric.c:9233 utils/adt/numeric.c:9581 utils/adt/numeric.c:9697 +#: utils/adt/numeric.c:11208 utils/adt/timestamp.c:3713 #, c-format msgid "division by zero" msgstr "división por cero" +#: utils/adt/cash.c:292 utils/adt/cash.c:317 utils/adt/cash.c:327 +#: utils/adt/cash.c:367 utils/adt/int.c:180 utils/adt/numutils.c:350 +#: utils/adt/numutils.c:612 utils/adt/numutils.c:874 utils/adt/numutils.c:925 +#: utils/adt/numutils.c:964 utils/adt/numutils.c:1011 +#, c-format +msgid "value \"%s\" is out of range for type %s" +msgstr "el valor «%s» está fuera de rango para el tipo %s" + #: utils/adt/char.c:197 #, c-format msgid "\"char\" out of range" msgstr "«char» fuera de rango" #: utils/adt/cryptohashfuncs.c:48 utils/adt/cryptohashfuncs.c:70 -#, fuzzy, c-format -#| msgid "could not decompress data: %s" +#, c-format msgid "could not compute %s hash: %s" -msgstr "no se pudo descomprimir datos: %s" +msgstr "no se pudo calcular el hash %s: %s" + +#: utils/adt/date.c:64 utils/adt/timestamp.c:116 utils/adt/varbit.c:105 +#: utils/adt/varchar.c:48 +#, c-format +msgid "invalid type modifier" +msgstr "el modificador de tipo no es válido" -#: utils/adt/date.c:54 +#: utils/adt/date.c:76 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "la precisión de TIME(%d)%s no debe ser negativa" -#: utils/adt/date.c:60 +#: utils/adt/date.c:82 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "la precisión de TIME(%d)%s fue reducida al máximo permitido, %d" -#: utils/adt/date.c:84 utils/adt/timestamp.c:121 utils/adt/varbit.c:105 -#: utils/adt/varchar.c:49 -#, c-format -msgid "invalid type modifier" -msgstr "el modificador de tipo no es válido" - -#: utils/adt/date.c:165 utils/adt/date.c:173 utils/adt/formatting.c:4241 -#: utils/adt/formatting.c:4250 utils/adt/formatting.c:4363 -#: utils/adt/formatting.c:4373 +#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4424 +#: utils/adt/formatting.c:4433 utils/adt/formatting.c:4538 +#: utils/adt/formatting.c:4548 #, c-format msgid "date out of range: \"%s\"" msgstr "fecha fuera de rango: «%s»" -#: utils/adt/date.c:220 utils/adt/date.c:528 utils/adt/date.c:552 -#: utils/adt/rangetypes.c:1577 utils/adt/rangetypes.c:1592 utils/adt/xml.c:2460 +#: utils/adt/date.c:222 utils/adt/date.c:520 utils/adt/date.c:544 +#: utils/adt/rangetypes.c:1584 utils/adt/rangetypes.c:1599 utils/adt/xml.c:2552 #, c-format msgid "date out of range" msgstr "fecha fuera de rango" -#: utils/adt/date.c:266 utils/adt/timestamp.c:581 +#: utils/adt/date.c:268 utils/adt/timestamp.c:598 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "valor en campo de fecha fuera de rango: %d-%02d-%02d" -#: utils/adt/date.c:273 utils/adt/date.c:282 utils/adt/timestamp.c:587 +#: utils/adt/date.c:275 utils/adt/date.c:284 utils/adt/timestamp.c:604 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "fecha fuera de rango: %d-%02d-%02d" -#: utils/adt/date.c:503 +#: utils/adt/date.c:495 #, c-format msgid "cannot subtract infinite dates" msgstr "no se pueden restar fechas infinitas" -#: utils/adt/date.c:601 utils/adt/date.c:664 utils/adt/date.c:700 -#: utils/adt/date.c:2894 utils/adt/date.c:2904 +#: utils/adt/date.c:593 utils/adt/date.c:656 utils/adt/date.c:692 +#: utils/adt/date.c:2906 utils/adt/date.c:2916 #, c-format msgid "date out of range for timestamp" msgstr "fecha fuera de rango para timestamp" -#: utils/adt/date.c:1130 utils/adt/date.c:1213 utils/adt/date.c:1229 -#: utils/adt/date.c:2215 utils/adt/date.c:2999 utils/adt/timestamp.c:4105 -#: utils/adt/timestamp.c:4298 utils/adt/timestamp.c:4440 -#: utils/adt/timestamp.c:4693 utils/adt/timestamp.c:4894 -#: utils/adt/timestamp.c:4941 utils/adt/timestamp.c:5165 -#: utils/adt/timestamp.c:5212 utils/adt/timestamp.c:5342 -#, fuzzy, c-format -#| msgid "\"RN\" not supported for input" +#: utils/adt/date.c:1122 utils/adt/date.c:1205 utils/adt/date.c:1221 +#: utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4726 +#: utils/adt/timestamp.c:4941 utils/adt/timestamp.c:5089 +#: utils/adt/timestamp.c:5342 utils/adt/timestamp.c:5543 +#: utils/adt/timestamp.c:5590 utils/adt/timestamp.c:5814 +#: utils/adt/timestamp.c:5861 utils/adt/timestamp.c:5941 +#: utils/adt/timestamp.c:6070 +#, c-format msgid "unit \"%s\" not supported for type %s" -msgstr "«RN» no está soportado en la entrada" +msgstr "unidades «%s» no soportada para el tipo %s" -#: utils/adt/date.c:1238 utils/adt/date.c:2231 utils/adt/date.c:3019 -#: utils/adt/timestamp.c:4119 utils/adt/timestamp.c:4315 -#: utils/adt/timestamp.c:4454 utils/adt/timestamp.c:4653 -#: utils/adt/timestamp.c:4950 utils/adt/timestamp.c:5221 -#: utils/adt/timestamp.c:5403 -#, fuzzy, c-format -#| msgid "%s: unrecognized start type \"%s\"\n" +#: utils/adt/date.c:1230 utils/adt/date.c:2231 utils/adt/date.c:3031 +#: utils/adt/timestamp.c:4740 utils/adt/timestamp.c:4958 +#: utils/adt/timestamp.c:5103 utils/adt/timestamp.c:5302 +#: utils/adt/timestamp.c:5599 utils/adt/timestamp.c:5870 +#: utils/adt/timestamp.c:5911 utils/adt/timestamp.c:6131 +#, c-format msgid "unit \"%s\" not recognized for type %s" -msgstr "%s: tipo de inicio «%s» no reconocido\n" - -#: utils/adt/date.c:1322 utils/adt/date.c:1368 utils/adt/date.c:1927 -#: utils/adt/date.c:1958 utils/adt/date.c:1987 utils/adt/date.c:2857 -#: utils/adt/date.c:3089 utils/adt/datetime.c:424 utils/adt/datetime.c:1809 -#: utils/adt/formatting.c:4081 utils/adt/formatting.c:4117 -#: utils/adt/formatting.c:4210 utils/adt/formatting.c:4339 utils/adt/json.c:467 -#: utils/adt/json.c:506 utils/adt/timestamp.c:231 utils/adt/timestamp.c:263 -#: utils/adt/timestamp.c:699 utils/adt/timestamp.c:708 -#: utils/adt/timestamp.c:786 utils/adt/timestamp.c:819 -#: utils/adt/timestamp.c:2941 utils/adt/timestamp.c:2962 -#: utils/adt/timestamp.c:2975 utils/adt/timestamp.c:2984 -#: utils/adt/timestamp.c:2992 utils/adt/timestamp.c:3053 -#: utils/adt/timestamp.c:3076 utils/adt/timestamp.c:3089 -#: utils/adt/timestamp.c:3100 utils/adt/timestamp.c:3108 -#: utils/adt/timestamp.c:3809 utils/adt/timestamp.c:3933 -#: utils/adt/timestamp.c:4023 utils/adt/timestamp.c:4113 -#: utils/adt/timestamp.c:4206 utils/adt/timestamp.c:4309 -#: utils/adt/timestamp.c:4758 utils/adt/timestamp.c:5032 -#: utils/adt/timestamp.c:5471 utils/adt/timestamp.c:5481 -#: utils/adt/timestamp.c:5486 utils/adt/timestamp.c:5492 -#: utils/adt/timestamp.c:5525 utils/adt/timestamp.c:5612 -#: utils/adt/timestamp.c:5653 utils/adt/timestamp.c:5657 -#: utils/adt/timestamp.c:5711 utils/adt/timestamp.c:5715 -#: utils/adt/timestamp.c:5721 utils/adt/timestamp.c:5755 utils/adt/xml.c:2482 -#: utils/adt/xml.c:2489 utils/adt/xml.c:2509 utils/adt/xml.c:2516 +msgstr "unidad «%s» no reconocida para el tipo %s" + +#: utils/adt/date.c:1314 utils/adt/date.c:1360 utils/adt/date.c:1919 +#: utils/adt/date.c:1950 utils/adt/date.c:1979 utils/adt/date.c:2869 +#: utils/adt/date.c:3101 utils/adt/datetime.c:422 utils/adt/datetime.c:1807 +#: utils/adt/formatting.c:4269 utils/adt/formatting.c:4305 +#: utils/adt/formatting.c:4392 utils/adt/formatting.c:4514 utils/adt/json.c:366 +#: utils/adt/json.c:405 utils/adt/timestamp.c:248 utils/adt/timestamp.c:280 +#: utils/adt/timestamp.c:716 utils/adt/timestamp.c:725 +#: utils/adt/timestamp.c:803 utils/adt/timestamp.c:836 +#: utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3075 +#: utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3097 +#: utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3129 +#: utils/adt/timestamp.c:3140 utils/adt/timestamp.c:3146 +#: utils/adt/timestamp.c:3152 utils/adt/timestamp.c:3157 +#: utils/adt/timestamp.c:3210 utils/adt/timestamp.c:3219 +#: utils/adt/timestamp.c:3240 utils/adt/timestamp.c:3245 +#: utils/adt/timestamp.c:3266 utils/adt/timestamp.c:3279 +#: utils/adt/timestamp.c:3293 utils/adt/timestamp.c:3301 +#: utils/adt/timestamp.c:3307 utils/adt/timestamp.c:3312 +#: utils/adt/timestamp.c:4380 utils/adt/timestamp.c:4532 +#: utils/adt/timestamp.c:4608 utils/adt/timestamp.c:4644 +#: utils/adt/timestamp.c:4734 utils/adt/timestamp.c:4813 +#: utils/adt/timestamp.c:4849 utils/adt/timestamp.c:4952 +#: utils/adt/timestamp.c:5407 utils/adt/timestamp.c:5681 +#: utils/adt/timestamp.c:6199 utils/adt/timestamp.c:6209 +#: utils/adt/timestamp.c:6214 utils/adt/timestamp.c:6220 +#: utils/adt/timestamp.c:6260 utils/adt/timestamp.c:6347 +#: utils/adt/timestamp.c:6388 utils/adt/timestamp.c:6392 +#: utils/adt/timestamp.c:6446 utils/adt/timestamp.c:6450 +#: utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2574 +#: utils/adt/xml.c:2581 utils/adt/xml.c:2601 utils/adt/xml.c:2608 #, c-format msgid "timestamp out of range" msgstr "timestamp fuera de rango" -#: utils/adt/date.c:1544 utils/adt/date.c:2352 utils/adt/formatting.c:4431 +#: utils/adt/date.c:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4597 #, c-format msgid "time out of range" msgstr "hora fuera de rango" -#: utils/adt/date.c:1596 utils/adt/timestamp.c:596 +#: utils/adt/date.c:1588 utils/adt/timestamp.c:613 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "valor en campo de hora fuera de rango: %d:%02d:%02g" -#: utils/adt/date.c:2116 utils/adt/date.c:2656 utils/adt/float.c:1043 -#: utils/adt/float.c:1119 utils/adt/int.c:635 utils/adt/int.c:682 -#: utils/adt/int.c:717 utils/adt/int8.c:414 utils/adt/numeric.c:2579 -#: utils/adt/timestamp.c:3463 utils/adt/timestamp.c:3490 -#: utils/adt/timestamp.c:3521 +#: utils/adt/date.c:2020 +#, c-format +msgid "cannot convert infinite interval to time" +msgstr "no se puede convertir intervalo infinito a time" + +#: utils/adt/date.c:2061 utils/adt/date.c:2605 +#, c-format +msgid "cannot add infinite interval to time" +msgstr "no se puede sumar intervalo infinito a time" + +#: utils/adt/date.c:2084 utils/adt/date.c:2632 +#, c-format +msgid "cannot subtract infinite interval from time" +msgstr "no se pueden restar intervalo infinito de time" + +#: utils/adt/date.c:2115 utils/adt/date.c:2667 utils/adt/float.c:1036 +#: utils/adt/float.c:1112 utils/adt/int.c:635 utils/adt/int.c:682 +#: utils/adt/int.c:717 utils/adt/int8.c:413 utils/adt/numeric.c:2595 +#: utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 +#: utils/adt/timestamp.c:3888 #, c-format msgid "invalid preceding or following size in window function" msgstr "tamaño «preceding» o «following» no válido en ventana deslizante" @@ -23810,38 +24446,43 @@ msgstr "tamaño «preceding» o «following» no válido en ventana deslizante" msgid "time zone displacement out of range" msgstr "desplazamiento de huso horario fuera de rango" -#: utils/adt/date.c:3119 utils/adt/timestamp.c:5514 utils/adt/timestamp.c:5744 +#: utils/adt/date.c:3132 utils/adt/timestamp.c:6242 utils/adt/timestamp.c:6479 +#, c-format +msgid "interval time zone \"%s\" must be finite" +msgstr "el intervalo de huso horario «%s» debe ser finito" + +#: utils/adt/date.c:3139 utils/adt/timestamp.c:6249 utils/adt/timestamp.c:6486 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "el intervalo de huso horario «%s» no debe especificar meses o días" -#: utils/adt/datetime.c:3223 utils/adt/datetime.c:4002 -#: utils/adt/datetime.c:4008 utils/adt/timestamp.c:511 +#: utils/adt/datetime.c:3232 utils/adt/datetime.c:4127 +#: utils/adt/datetime.c:4133 utils/adt/timestamp.c:528 #, c-format msgid "time zone \"%s\" not recognized" msgstr "el huso horario «%s» no es reconocido" -#: utils/adt/datetime.c:3976 utils/adt/datetime.c:3983 +#: utils/adt/datetime.c:4101 utils/adt/datetime.c:4108 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "valor de hora/fecha fuera de rango: «%s»" -#: utils/adt/datetime.c:3985 +#: utils/adt/datetime.c:4110 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Quizás necesite una configuración diferente de «datestyle»." -#: utils/adt/datetime.c:3990 +#: utils/adt/datetime.c:4115 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "valor de interval fuera de rango: «%s»" -#: utils/adt/datetime.c:3996 +#: utils/adt/datetime.c:4121 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "desplazamiento de huso horario fuera de rango: «%s»" -#: utils/adt/datetime.c:4010 +#: utils/adt/datetime.c:4135 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "Este nombre de huso horario aparece en el archivo de configuración para abreviaciones de husos horarios «%s»." @@ -23851,23 +24492,22 @@ msgstr "Este nombre de huso horario aparece en el archivo de configuración para msgid "invalid Datum pointer" msgstr "puntero a Datum no válido" -#: utils/adt/dbsize.c:761 utils/adt/dbsize.c:837 +#: utils/adt/dbsize.c:764 utils/adt/dbsize.c:840 #, c-format msgid "invalid size: \"%s\"" msgstr "tamaño no válido: «%s»" -#: utils/adt/dbsize.c:838 +#: utils/adt/dbsize.c:841 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Nombre de unidad de tamaño no válido: «%s»." -#: utils/adt/dbsize.c:839 -#, fuzzy, c-format -#| msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." +#: utils/adt/dbsize.c:842 +#, c-format msgid "Valid units are \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." -msgstr "Unidades válidas para este parámetro son «B», «kB», «MB», «GB» y «TB»." +msgstr "Unidades aceptables son «bytes«, «B», «kB», «MB», «GB», «TB» y «PB»." -#: utils/adt/domains.c:92 +#: utils/adt/domains.c:95 #, c-format msgid "type %s is not a domain" msgstr "tipo «%s» no es un dominio" @@ -23917,10 +24557,10 @@ msgstr "secuencia de término base64 no válida" msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "A los datos de entrada les falta relleno, o están truncados, o están corruptos de alguna otra forma." -#: utils/adt/encode.c:492 utils/adt/encode.c:557 utils/adt/jsonfuncs.c:648 -#: utils/adt/varlena.c:331 utils/adt/varlena.c:372 jsonpath_gram.y:528 -#: jsonpath_scan.l:629 jsonpath_scan.l:640 jsonpath_scan.l:650 -#: jsonpath_scan.l:701 +#: utils/adt/encode.c:492 utils/adt/encode.c:557 utils/adt/jsonfuncs.c:659 +#: utils/adt/varlena.c:333 utils/adt/varlena.c:374 jsonpath_gram.y:266 +#: jsonpath_gram.y:598 jsonpath_scan.l:640 jsonpath_scan.l:651 +#: jsonpath_scan.l:661 jsonpath_scan.l:712 #, c-format msgid "invalid input syntax for type %s" msgstr "sintaxis de entrada no válida para tipo %s" @@ -23957,353 +24597,348 @@ msgstr "no se pudo determinar el tipo enum efectivo" msgid "enum %s contains no values" msgstr "el enum %s no contiene valores" -#: utils/adt/float.c:89 +#: utils/adt/float.c:83 #, c-format msgid "value out of range: overflow" msgstr "valor fuera de rango: desbordamiento" -#: utils/adt/float.c:97 +#: utils/adt/float.c:91 #, c-format msgid "value out of range: underflow" msgstr "valor fuera de rango: desbordamiento por abajo" -#: utils/adt/float.c:287 +#: utils/adt/float.c:280 #, c-format msgid "\"%s\" is out of range for type real" msgstr "«%s» está fuera de rango para el tipo real" -#: utils/adt/float.c:489 +#: utils/adt/float.c:482 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "«%s» está fuera de rango para el tipo double precision" -#: utils/adt/float.c:1254 utils/adt/float.c:1328 utils/adt/int.c:355 +#: utils/adt/float.c:1247 utils/adt/float.c:1321 utils/adt/int.c:355 #: utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 #: utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 -#: utils/adt/int8.c:1278 utils/adt/numeric.c:4500 utils/adt/numeric.c:4505 +#: utils/adt/int8.c:1277 utils/adt/numeric.c:4593 utils/adt/numeric.c:4598 #, c-format msgid "smallint out of range" msgstr "smallint fuera de rango" -#: utils/adt/float.c:1454 utils/adt/numeric.c:3693 utils/adt/numeric.c:10027 +#: utils/adt/float.c:1447 utils/adt/numeric.c:3709 utils/adt/numeric.c:10112 #, c-format msgid "cannot take square root of a negative number" msgstr "no se puede calcular la raíz cuadrada un de número negativo" -#: utils/adt/float.c:1522 utils/adt/numeric.c:3981 utils/adt/numeric.c:4093 +#: utils/adt/float.c:1515 utils/adt/numeric.c:3997 utils/adt/numeric.c:4109 #, c-format msgid "zero raised to a negative power is undefined" msgstr "cero elevado a una potencia negativa es indefinido" -#: utils/adt/float.c:1526 utils/adt/numeric.c:3985 utils/adt/numeric.c:10918 +#: utils/adt/float.c:1519 utils/adt/numeric.c:4001 utils/adt/numeric.c:11003 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "un número negativo elevado a una potencia no positiva entrega un resultado complejo" -#: utils/adt/float.c:1702 utils/adt/float.c:1735 utils/adt/numeric.c:3893 -#: utils/adt/numeric.c:10698 +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3909 +#: utils/adt/numeric.c:10783 #, c-format msgid "cannot take logarithm of zero" msgstr "no se puede calcular logaritmo de cero" -#: utils/adt/float.c:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3831 -#: utils/adt/numeric.c:3888 utils/adt/numeric.c:10702 +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3847 +#: utils/adt/numeric.c:3904 utils/adt/numeric.c:10787 #, c-format msgid "cannot take logarithm of a negative number" msgstr "no se puede calcular logaritmo de un número negativo" -#: utils/adt/float.c:1772 utils/adt/float.c:1803 utils/adt/float.c:1898 -#: utils/adt/float.c:1925 utils/adt/float.c:1953 utils/adt/float.c:1980 -#: utils/adt/float.c:2127 utils/adt/float.c:2164 utils/adt/float.c:2334 -#: utils/adt/float.c:2390 utils/adt/float.c:2455 utils/adt/float.c:2512 -#: utils/adt/float.c:2703 utils/adt/float.c:2727 +#: utils/adt/float.c:1765 utils/adt/float.c:1796 utils/adt/float.c:1891 +#: utils/adt/float.c:1918 utils/adt/float.c:1946 utils/adt/float.c:1973 +#: utils/adt/float.c:2120 utils/adt/float.c:2157 utils/adt/float.c:2327 +#: utils/adt/float.c:2383 utils/adt/float.c:2448 utils/adt/float.c:2505 +#: utils/adt/float.c:2696 utils/adt/float.c:2720 #, c-format msgid "input is out of range" msgstr "la entrada está fuera de rango" -#: utils/adt/float.c:2868 -#, c-format -msgid "setseed parameter %g is out of allowed range [-1,1]" -msgstr "parámetro setseed %g fuera del rango permitido [-1,1]" - -#: utils/adt/float.c:4096 utils/adt/numeric.c:1841 +#: utils/adt/float.c:4000 utils/adt/numeric.c:1857 #, c-format msgid "count must be greater than zero" msgstr "count debe ser mayor que cero" -#: utils/adt/float.c:4101 utils/adt/numeric.c:1852 +#: utils/adt/float.c:4005 utils/adt/numeric.c:1868 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "el operando, límite inferior y límite superior no pueden ser NaN" -#: utils/adt/float.c:4107 utils/adt/numeric.c:1857 +#: utils/adt/float.c:4011 utils/adt/numeric.c:1873 #, c-format msgid "lower and upper bounds must be finite" msgstr "los límites inferior y superior deben ser finitos" -#: utils/adt/float.c:4173 utils/adt/numeric.c:1871 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1887 #, c-format msgid "lower bound cannot equal upper bound" msgstr "el límite superior no puede ser igual al límite inferior" -#: utils/adt/formatting.c:519 +#: utils/adt/formatting.c:530 #, c-format msgid "invalid format specification for an interval value" msgstr "especificación de formato no válida para un valor de interval" -#: utils/adt/formatting.c:520 +#: utils/adt/formatting.c:531 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Los Interval no están ... a valores determinados de fechas de calendario." -#: utils/adt/formatting.c:1150 +#: utils/adt/formatting.c:1161 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "«EEEE» debe ser el último patrón usado" -#: utils/adt/formatting.c:1158 +#: utils/adt/formatting.c:1169 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "«9» debe ir antes de «PR»" -#: utils/adt/formatting.c:1174 +#: utils/adt/formatting.c:1185 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "«0» debe ir antes de «PR»" -#: utils/adt/formatting.c:1201 +#: utils/adt/formatting.c:1212 #, c-format msgid "multiple decimal points" msgstr "hay múltiples puntos decimales" -#: utils/adt/formatting.c:1205 utils/adt/formatting.c:1288 +#: utils/adt/formatting.c:1216 utils/adt/formatting.c:1299 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "no se puede usar «V» y un punto decimal simultáneamente" -#: utils/adt/formatting.c:1217 +#: utils/adt/formatting.c:1228 #, c-format msgid "cannot use \"S\" twice" msgstr "no se puede usar «S» dos veces" -#: utils/adt/formatting.c:1221 +#: utils/adt/formatting.c:1232 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "no se puede usar «S» y «PL»/«MI»/«SG»/«PR» simultáneamente" -#: utils/adt/formatting.c:1241 +#: utils/adt/formatting.c:1252 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "no se puede usar «S» y «MI» simultáneamente" -#: utils/adt/formatting.c:1251 +#: utils/adt/formatting.c:1262 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "no se puede usar «S» y «PL» simultáneamente" -#: utils/adt/formatting.c:1261 +#: utils/adt/formatting.c:1272 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "no se puede usar «S» y «SG» simultáneamente" -#: utils/adt/formatting.c:1270 +#: utils/adt/formatting.c:1281 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "no se puede usar «PR» y «S»/«PL»/«MI»/«SG» simultáneamente" -#: utils/adt/formatting.c:1296 +#: utils/adt/formatting.c:1307 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "no se puede usar «EEEE» dos veces" -#: utils/adt/formatting.c:1302 +#: utils/adt/formatting.c:1313 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "«EEEE» es incompatible con otros formatos" -#: utils/adt/formatting.c:1303 +#: utils/adt/formatting.c:1314 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "«EEEE» sólo puede ser usado en conjunción con patrones de dígitos y puntos decimales." -#: utils/adt/formatting.c:1387 +#: utils/adt/formatting.c:1398 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "separador de formato «datetime» no válido: «%s»" -#: utils/adt/formatting.c:1514 +#: utils/adt/formatting.c:1525 #, c-format msgid "\"%s\" is not a number" msgstr "«%s» no es un número" -#: utils/adt/formatting.c:1592 +#: utils/adt/formatting.c:1603 #, c-format msgid "case conversion failed: %s" msgstr "falló la conversión de mayúsculas: %s" -#: utils/adt/formatting.c:1646 utils/adt/formatting.c:1768 -#: utils/adt/formatting.c:1891 +#: utils/adt/formatting.c:1651 utils/adt/formatting.c:1799 +#: utils/adt/formatting.c:1989 #, c-format msgid "could not determine which collation to use for %s function" msgstr "no se pudo determinar qué ordenamiento usar para la función %s" -#: utils/adt/formatting.c:2274 +#: utils/adt/formatting.c:2410 #, c-format msgid "invalid combination of date conventions" msgstr "combinación no válida de convenciones de fecha" -#: utils/adt/formatting.c:2275 +#: utils/adt/formatting.c:2411 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr " No mezclar convenciones de semana Gregorianas e ISO en una plantilla formateada" -#: utils/adt/formatting.c:2297 +#: utils/adt/formatting.c:2433 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "valores en conflicto para le campo \"%s\" en cadena de formato" -#: utils/adt/formatting.c:2299 +#: utils/adt/formatting.c:2435 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Este valor se contradice con un seteo previo para el mismo tipo de campo" -#: utils/adt/formatting.c:2366 +#: utils/adt/formatting.c:2502 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "cadena de texto fuente muy corta para campo formateado \"%s\" " -#: utils/adt/formatting.c:2368 +#: utils/adt/formatting.c:2504 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "El campo requiere %d caractéres, pero solo quedan %d." -#: utils/adt/formatting.c:2370 utils/adt/formatting.c:2384 +#: utils/adt/formatting.c:2506 utils/adt/formatting.c:2520 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "Si su cadena de texto no es de ancho modificado, trate de usar el modificador \"FM\" " -#: utils/adt/formatting.c:2380 utils/adt/formatting.c:2393 -#: utils/adt/formatting.c:2614 +#: utils/adt/formatting.c:2516 utils/adt/formatting.c:2529 +#: utils/adt/formatting.c:2750 utils/adt/formatting.c:3650 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "el valor «%s» no es válido para «%s»" -#: utils/adt/formatting.c:2382 +#: utils/adt/formatting.c:2518 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "El campo requiere %d caracteres, pero sólo %d pudieron ser analizados." -#: utils/adt/formatting.c:2395 +#: utils/adt/formatting.c:2531 #, c-format msgid "Value must be an integer." msgstr "El valor debe ser un entero." -#: utils/adt/formatting.c:2400 +#: utils/adt/formatting.c:2536 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "el valor para «%s» en la cadena de origen está fuera de rango" -#: utils/adt/formatting.c:2402 +#: utils/adt/formatting.c:2538 #, c-format msgid "Value must be in the range %d to %d." msgstr "El valor debe estar en el rango de %d a %d." -#: utils/adt/formatting.c:2616 +#: utils/adt/formatting.c:2752 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "El valor dado no concuerda con ninguno de los valores permitidos para este campo." -#: utils/adt/formatting.c:2832 utils/adt/formatting.c:2852 -#: utils/adt/formatting.c:2872 utils/adt/formatting.c:2892 -#: utils/adt/formatting.c:2911 utils/adt/formatting.c:2930 -#: utils/adt/formatting.c:2954 utils/adt/formatting.c:2972 -#: utils/adt/formatting.c:2990 utils/adt/formatting.c:3008 -#: utils/adt/formatting.c:3025 utils/adt/formatting.c:3042 +#: utils/adt/formatting.c:2968 utils/adt/formatting.c:2988 +#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3028 +#: utils/adt/formatting.c:3047 utils/adt/formatting.c:3066 +#: utils/adt/formatting.c:3090 utils/adt/formatting.c:3108 +#: utils/adt/formatting.c:3126 utils/adt/formatting.c:3144 +#: utils/adt/formatting.c:3161 utils/adt/formatting.c:3178 #, c-format msgid "localized string format value too long" msgstr "cadena traducida en cadena de formato es demasiado larga" -#: utils/adt/formatting.c:3322 +#: utils/adt/formatting.c:3458 #, c-format msgid "unmatched format separator \"%c\"" msgstr "separador de formato «%c» desemparejado" -#: utils/adt/formatting.c:3383 +#: utils/adt/formatting.c:3519 #, c-format msgid "unmatched format character \"%s\"" msgstr "carácter de formato «%s» desemparejado" -#: utils/adt/formatting.c:3491 +#: utils/adt/formatting.c:3652 #, c-format -msgid "formatting field \"%s\" is only supported in to_char" -msgstr "el campo de formato «%s» sólo está soportado en to_char" +msgid "Time zone abbreviation is not recognized." +msgstr "La abreviatura de huso horario no es reconocida." -#: utils/adt/formatting.c:3665 +#: utils/adt/formatting.c:3853 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "cadena de entrada no válida para «Y,YYY»" -#: utils/adt/formatting.c:3754 +#: utils/adt/formatting.c:3942 #, c-format msgid "input string is too short for datetime format" msgstr "cadena de entrada muy corta para formato de fecha/hora" -#: utils/adt/formatting.c:3762 +#: utils/adt/formatting.c:3950 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "quedan caracteres al final de la cadena de entrada después del formato fecha/hora" -#: utils/adt/formatting.c:4319 +#: utils/adt/formatting.c:4494 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "falta el huso horario en la cadena de entrada para el tipo timestamptz" -#: utils/adt/formatting.c:4325 +#: utils/adt/formatting.c:4500 #, c-format msgid "timestamptz out of range" msgstr "timestamptz fuera de rango" -#: utils/adt/formatting.c:4353 +#: utils/adt/formatting.c:4528 #, c-format msgid "datetime format is zoned but not timed" msgstr "el formato de fecha/hora tiene huso horario pero no hora" -#: utils/adt/formatting.c:4411 +#: utils/adt/formatting.c:4577 #, c-format msgid "missing time zone in input string for type timetz" msgstr "falta el huso horario en la cadena de entrada del tipo timetz" -#: utils/adt/formatting.c:4417 +#: utils/adt/formatting.c:4583 #, c-format msgid "timetz out of range" msgstr "timetz fuera de rango" -#: utils/adt/formatting.c:4443 +#: utils/adt/formatting.c:4609 #, c-format msgid "datetime format is not dated and not timed" msgstr "el formato de fecha/hora no tiene fecha ni hora" -#: utils/adt/formatting.c:4575 +#: utils/adt/formatting.c:4786 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "la hora «%d» no es válida para el reloj de 12 horas" -#: utils/adt/formatting.c:4577 +#: utils/adt/formatting.c:4788 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Use el reloj de 24 horas, o entregue una hora entre 1 y 12." -#: utils/adt/formatting.c:4689 +#: utils/adt/formatting.c:4900 #, c-format msgid "cannot calculate day of year without year information" msgstr "no se puede calcular el día del año sin conocer el año" -#: utils/adt/formatting.c:5621 +#: utils/adt/formatting.c:5852 #, c-format msgid "\"EEEE\" not supported for input" msgstr "«EEEE» no está soportado en la entrada" -#: utils/adt/formatting.c:5633 +#: utils/adt/formatting.c:5864 #, c-format msgid "\"RN\" not supported for input" msgstr "«RN» no está soportado en la entrada" @@ -24314,10 +24949,9 @@ msgid "absolute path not allowed" msgstr "no se permiten rutas absolutas" #: utils/adt/genfile.c:89 -#, fuzzy, c-format -#| msgid "path must be in or below the current directory" +#, c-format msgid "path must be in or below the data directory" -msgstr "la ruta debe estar en o debajo del directorio actual" +msgstr "la ruta debe estar en o debajo del directorio de datos" #: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:190 #: utils/adt/oracle_compat.c:288 utils/adt/oracle_compat.c:839 @@ -24336,12 +24970,7 @@ msgstr "no se pudo posicionar (seek) el archivo «%s»: %m" msgid "file length too large" msgstr "el tamaño del archivo es demasiado grande" -#: utils/adt/genfile.c:248 -#, c-format -msgid "must be superuser to read files with adminpack 1.0" -msgstr "Debe ser superusuario leer archivos con adminpack 1.0." - -#: utils/adt/genfile.c:702 +#: utils/adt/genfile.c:656 #, c-format msgid "tablespace with OID %u does not exist" msgstr "no existe el tablespace con OID %u" @@ -24397,569 +25026,649 @@ msgstr "debe pedir al menos 2 puntos" msgid "invalid int2vector data" msgstr "datos de int2vector no válidos" -#: utils/adt/int.c:1529 utils/adt/int8.c:1404 utils/adt/numeric.c:1749 -#: utils/adt/timestamp.c:5805 utils/adt/timestamp.c:5887 +#: utils/adt/int.c:1529 utils/adt/int8.c:1403 utils/adt/numeric.c:1765 +#: utils/adt/timestamp.c:6546 utils/adt/timestamp.c:6632 #, c-format msgid "step size cannot equal zero" msgstr "el tamaño de paso no puede ser cero" -#: utils/adt/int8.c:449 utils/adt/int8.c:472 utils/adt/int8.c:486 -#: utils/adt/int8.c:500 utils/adt/int8.c:531 utils/adt/int8.c:555 -#: utils/adt/int8.c:637 utils/adt/int8.c:705 utils/adt/int8.c:711 -#: utils/adt/int8.c:737 utils/adt/int8.c:751 utils/adt/int8.c:775 -#: utils/adt/int8.c:788 utils/adt/int8.c:900 utils/adt/int8.c:914 -#: utils/adt/int8.c:928 utils/adt/int8.c:959 utils/adt/int8.c:981 -#: utils/adt/int8.c:995 utils/adt/int8.c:1009 utils/adt/int8.c:1042 -#: utils/adt/int8.c:1056 utils/adt/int8.c:1070 utils/adt/int8.c:1101 -#: utils/adt/int8.c:1123 utils/adt/int8.c:1137 utils/adt/int8.c:1151 -#: utils/adt/int8.c:1313 utils/adt/int8.c:1348 utils/adt/numeric.c:4459 -#: utils/adt/rangetypes.c:1528 utils/adt/rangetypes.c:1541 +#: utils/adt/int8.c:448 utils/adt/int8.c:471 utils/adt/int8.c:485 +#: utils/adt/int8.c:499 utils/adt/int8.c:530 utils/adt/int8.c:554 +#: utils/adt/int8.c:636 utils/adt/int8.c:704 utils/adt/int8.c:710 +#: utils/adt/int8.c:736 utils/adt/int8.c:750 utils/adt/int8.c:774 +#: utils/adt/int8.c:787 utils/adt/int8.c:899 utils/adt/int8.c:913 +#: utils/adt/int8.c:927 utils/adt/int8.c:958 utils/adt/int8.c:980 +#: utils/adt/int8.c:994 utils/adt/int8.c:1008 utils/adt/int8.c:1041 +#: utils/adt/int8.c:1055 utils/adt/int8.c:1069 utils/adt/int8.c:1100 +#: utils/adt/int8.c:1122 utils/adt/int8.c:1136 utils/adt/int8.c:1150 +#: utils/adt/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4542 +#: utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 #: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint fuera de rango" -#: utils/adt/int8.c:1361 +#: utils/adt/int8.c:1360 #, c-format msgid "OID out of range" msgstr "OID fuera de rango" -#: utils/adt/json.c:320 utils/adt/jsonb.c:781 +#: utils/adt/json.c:202 utils/adt/jsonb.c:664 #, c-format msgid "key value must be scalar, not array, composite, or json" msgstr "el valor de llave debe ser escalar, no array, composite o json" -#: utils/adt/json.c:1113 utils/adt/json.c:1123 utils/fmgr/funcapi.c:2082 +#: utils/adt/json.c:1034 utils/adt/json.c:1044 utils/fmgr/funcapi.c:2090 #, c-format msgid "could not determine data type for argument %d" msgstr "no se pudo determinar el tipo de dato para el argumento %d" -#: utils/adt/json.c:1146 utils/adt/json.c:1337 utils/adt/json.c:1513 -#: utils/adt/json.c:1591 utils/adt/jsonb.c:1432 utils/adt/jsonb.c:1522 +#: utils/adt/json.c:1067 utils/adt/json.c:1266 utils/adt/json.c:1449 +#: utils/adt/json.c:1527 utils/adt/jsonb.c:1333 utils/adt/jsonb.c:1423 #, c-format msgid "null value not allowed for object key" msgstr "no se permite el valor nulo como llave en un objeto" -#: utils/adt/json.c:1189 utils/adt/json.c:1352 -#, fuzzy, c-format -#| msgid "Duplicate keys exist." -msgid "duplicate JSON key %s" -msgstr "Existe una llave duplicada." +#: utils/adt/json.c:1117 utils/adt/json.c:1288 +#, c-format +msgid "duplicate JSON object key value: %s" +msgstr "valor de llave de objeto JSON duplicado: %s" -#: utils/adt/json.c:1297 utils/adt/jsonb.c:1233 +#: utils/adt/json.c:1226 utils/adt/jsonb.c:1134 #, c-format msgid "argument list must have even number of elements" msgstr "la lista de argumentos debe tener un número par de elementos" #. translator: %s is a SQL function name -#: utils/adt/json.c:1299 utils/adt/jsonb.c:1235 +#: utils/adt/json.c:1228 utils/adt/jsonb.c:1136 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "El argumento de %s debe consistir de llaves y valores alternados." -#: utils/adt/json.c:1491 utils/adt/jsonb.c:1410 +#: utils/adt/json.c:1427 utils/adt/jsonb.c:1311 #, c-format msgid "array must have two columns" msgstr "un array debe tener dos columnas" -#: utils/adt/json.c:1580 utils/adt/jsonb.c:1511 +#: utils/adt/json.c:1516 utils/adt/jsonb.c:1412 #, c-format msgid "mismatched array dimensions" msgstr "las dimensiones de array no coinciden" -#: utils/adt/json.c:1764 +#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1956 #, c-format msgid "duplicate JSON object key value" -msgstr "" +msgstr "valor de llavo del objeto JSON duplicado" -#: utils/adt/jsonb.c:294 +#: utils/adt/jsonb.c:282 #, c-format msgid "string too long to represent as jsonb string" msgstr "la cadena es demasiado larga para representarla como cadena jsonb." -#: utils/adt/jsonb.c:295 +#: utils/adt/jsonb.c:283 #, c-format msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "Debido a una restricción de la implementación, las cadenas en jsonb no pueden exceder los %d bytes." -#: utils/adt/jsonb.c:1252 +#: utils/adt/jsonb.c:1153 #, c-format msgid "argument %d: key must not be null" msgstr "argumento %d: la llave no puede ser null" -#: utils/adt/jsonb.c:1843 +#: utils/adt/jsonb.c:1744 #, c-format msgid "field name must not be null" msgstr "el nombre de campo no debe ser null" -#: utils/adt/jsonb.c:1905 +#: utils/adt/jsonb.c:1806 #, c-format msgid "object keys must be strings" msgstr "las llaves de un objeto deben ser cadenas" -#: utils/adt/jsonb.c:2116 +#: utils/adt/jsonb.c:2017 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "no se puede convertir un null jsonb a tipo %s" -#: utils/adt/jsonb.c:2117 +#: utils/adt/jsonb.c:2018 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "no se puede convertir un string jsonb a tipo %s" -#: utils/adt/jsonb.c:2118 +#: utils/adt/jsonb.c:2019 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "no se puede convertir un numérico jsonb a tipo %s" -#: utils/adt/jsonb.c:2119 +#: utils/adt/jsonb.c:2020 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "no se puede convertir un booleano jsonb a tipo %s" -#: utils/adt/jsonb.c:2120 +#: utils/adt/jsonb.c:2021 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "no se puede convertir un array jsonb a tipo %s" -#: utils/adt/jsonb.c:2121 +#: utils/adt/jsonb.c:2022 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "no se puede convertir un objeto jsonb a tipo %s" -#: utils/adt/jsonb.c:2122 +#: utils/adt/jsonb.c:2023 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "no se puede convertir un array u objeto jsonb a tipo %s" -#: utils/adt/jsonb_util.c:758 +#: utils/adt/jsonb_util.c:756 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "el número de pares en objeto jsonb excede el máximo permitido (%zu)" -#: utils/adt/jsonb_util.c:799 +#: utils/adt/jsonb_util.c:797 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "el número de elementos del array jsonb excede el máximo permitido (%zu)" -#: utils/adt/jsonb_util.c:1673 utils/adt/jsonb_util.c:1693 -#, fuzzy, c-format -#| msgid "total size of jsonb array elements exceeds the maximum of %u bytes" +#: utils/adt/jsonb_util.c:1671 utils/adt/jsonb_util.c:1691 +#, c-format msgid "total size of jsonb array elements exceeds the maximum of %d bytes" -msgstr "el tamaño total de los elementos del array jsonb excede el máximo de %u bytes" +msgstr "el tamaño total de los elementos del array jsonb excede el máximo de %d bytes" -#: utils/adt/jsonb_util.c:1754 utils/adt/jsonb_util.c:1789 -#: utils/adt/jsonb_util.c:1809 -#, fuzzy, c-format -#| msgid "total size of jsonb object elements exceeds the maximum of %u bytes" +#: utils/adt/jsonb_util.c:1752 utils/adt/jsonb_util.c:1787 +#: utils/adt/jsonb_util.c:1807 +#, c-format msgid "total size of jsonb object elements exceeds the maximum of %d bytes" -msgstr "el tamaño total de los elementos del objeto jsonb excede el máximo de %u bytes" +msgstr "el tamaño total de los elementos del objeto jsonb excede el máximo de %d bytes" -#: utils/adt/jsonb_util.c:1958 -#, fuzzy, c-format -#| msgid "unexpected object end" -msgid "duplicate JSON object key" -msgstr "fin de objeto inesperado" - -#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 +#: utils/adt/jsonbsubs.c:67 utils/adt/jsonbsubs.c:148 #, c-format msgid "jsonb subscript does not support slices" msgstr "el subíndice jsonb no soporta segmentos" -#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 +#: utils/adt/jsonbsubs.c:100 utils/adt/jsonbsubs.c:114 #, c-format msgid "subscript type %s is not supported" msgstr "el tipo de subíndice %s no está soportado" -#: utils/adt/jsonbsubs.c:104 +#: utils/adt/jsonbsubs.c:101 #, c-format msgid "jsonb subscript must be coercible to only one type, integer or text." msgstr "subíndice jsonb debe ser coercible solo para un tipo, integer o text." -#: utils/adt/jsonbsubs.c:118 +#: utils/adt/jsonbsubs.c:115 #, c-format msgid "jsonb subscript must be coercible to either integer or text." msgstr "subíndice jsonb debe ser coercible ya sea para integer o para text." -#: utils/adt/jsonbsubs.c:139 +#: utils/adt/jsonbsubs.c:136 #, c-format msgid "jsonb subscript must have text type" msgstr "subíndice jsonb debe tener tipo text" -#: utils/adt/jsonbsubs.c:207 +#: utils/adt/jsonbsubs.c:204 #, c-format msgid "jsonb subscript in assignment must not be null" msgstr "subíndice jsonb en asignación no puede ser nulo" -#: utils/adt/jsonfuncs.c:572 utils/adt/jsonfuncs.c:821 -#: utils/adt/jsonfuncs.c:2429 utils/adt/jsonfuncs.c:2881 -#: utils/adt/jsonfuncs.c:3676 utils/adt/jsonfuncs.c:4018 +#: utils/adt/jsonfuncs.c:583 utils/adt/jsonfuncs.c:830 +#: utils/adt/jsonfuncs.c:2439 utils/adt/jsonfuncs.c:3015 +#: utils/adt/jsonfuncs.c:3948 utils/adt/jsonfuncs.c:4295 #, c-format msgid "cannot call %s on a scalar" msgstr "no se puede invocar %s en un escalar" -#: utils/adt/jsonfuncs.c:577 utils/adt/jsonfuncs.c:806 -#: utils/adt/jsonfuncs.c:2883 utils/adt/jsonfuncs.c:3663 +#: utils/adt/jsonfuncs.c:588 utils/adt/jsonfuncs.c:815 +#: utils/adt/jsonfuncs.c:3017 utils/adt/jsonfuncs.c:3935 #, c-format msgid "cannot call %s on an array" msgstr "no se puede invocar %s en un array" -#: utils/adt/jsonfuncs.c:636 jsonpath_scan.l:596 +#: utils/adt/jsonfuncs.c:647 jsonpath_scan.l:607 #, c-format msgid "unsupported Unicode escape sequence" msgstr "secuencia de escape Unicode no soportado" -#: utils/adt/jsonfuncs.c:713 +#: utils/adt/jsonfuncs.c:724 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "Datos JSON, línea %d: %s%s%s" -#: utils/adt/jsonfuncs.c:1875 utils/adt/jsonfuncs.c:1912 +#: utils/adt/jsonfuncs.c:1883 utils/adt/jsonfuncs.c:1920 #, c-format msgid "cannot get array length of a scalar" msgstr "no se puede obtener el largo de array de un escalar" -#: utils/adt/jsonfuncs.c:1879 utils/adt/jsonfuncs.c:1898 +#: utils/adt/jsonfuncs.c:1887 utils/adt/jsonfuncs.c:1906 #, c-format msgid "cannot get array length of a non-array" msgstr "no se puede obtener el largo de array de un no-array" -#: utils/adt/jsonfuncs.c:1978 +#: utils/adt/jsonfuncs.c:1986 #, c-format msgid "cannot call %s on a non-object" msgstr "no se puede invocar %s en un no-objeto" -#: utils/adt/jsonfuncs.c:2166 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot deconstruct an array as an object" msgstr "no se puede desconstruir un array como un objeto" -#: utils/adt/jsonfuncs.c:2180 +#: utils/adt/jsonfuncs.c:2188 #, c-format msgid "cannot deconstruct a scalar" msgstr "no se puede desconstruir un escalar" -#: utils/adt/jsonfuncs.c:2225 +#: utils/adt/jsonfuncs.c:2233 #, c-format msgid "cannot extract elements from a scalar" msgstr "no se pueden extraer elementos de un escalar" -#: utils/adt/jsonfuncs.c:2229 +#: utils/adt/jsonfuncs.c:2237 #, c-format msgid "cannot extract elements from an object" msgstr "no se pudo extraer elementos de un objeto" -#: utils/adt/jsonfuncs.c:2414 utils/adt/jsonfuncs.c:3896 +#: utils/adt/jsonfuncs.c:2424 utils/adt/jsonfuncs.c:4173 #, c-format msgid "cannot call %s on a non-array" msgstr "no se puede invocar %s en un no-array" -#: utils/adt/jsonfuncs.c:2488 utils/adt/jsonfuncs.c:2493 -#: utils/adt/jsonfuncs.c:2510 utils/adt/jsonfuncs.c:2516 +#: utils/adt/jsonfuncs.c:2515 utils/adt/jsonfuncs.c:2520 +#: utils/adt/jsonfuncs.c:2538 utils/adt/jsonfuncs.c:2544 #, c-format msgid "expected JSON array" msgstr "se esperaba un array JSON" -#: utils/adt/jsonfuncs.c:2489 +#: utils/adt/jsonfuncs.c:2516 #, c-format msgid "See the value of key \"%s\"." msgstr "Vea el valor de la llave «%s»." -#: utils/adt/jsonfuncs.c:2511 +#: utils/adt/jsonfuncs.c:2539 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Vea el elemento %s de la llave «%s»." -#: utils/adt/jsonfuncs.c:2517 +#: utils/adt/jsonfuncs.c:2545 #, c-format msgid "See the array element %s." msgstr "Veo el elemento de array %s." -#: utils/adt/jsonfuncs.c:2552 +#: utils/adt/jsonfuncs.c:2597 #, c-format msgid "malformed JSON array" msgstr "array JSON mal formado" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3389 +#: utils/adt/jsonfuncs.c:3647 #, c-format msgid "first argument of %s must be a row type" msgstr "el primer argumento de %s debe ser un tipo de registro" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3413 +#: utils/adt/jsonfuncs.c:3671 #, c-format msgid "could not determine row type for result of %s" msgstr "no se pudo determinar el tipo de dato para el resultado de %s" -#: utils/adt/jsonfuncs.c:3415 +#: utils/adt/jsonfuncs.c:3673 #, c-format msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." msgstr "Provea un argumento de registro no-nulo, o invoque la función en la cláusula FROM usando una lista de definición de columnas." -#: utils/adt/jsonfuncs.c:3785 utils/fmgr/funcapi.c:94 +#: utils/adt/jsonfuncs.c:4059 utils/fmgr/funcapi.c:94 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "se requiere un nodo «materialize», pero no está permitido en este contexto" -#: utils/adt/jsonfuncs.c:3913 utils/adt/jsonfuncs.c:3997 +#: utils/adt/jsonfuncs.c:4190 utils/adt/jsonfuncs.c:4274 #, c-format msgid "argument of %s must be an array of objects" msgstr "el argumento de %s debe ser un array de objetos" -#: utils/adt/jsonfuncs.c:3946 +#: utils/adt/jsonfuncs.c:4223 #, c-format msgid "cannot call %s on an object" msgstr "no se puede invocar %s en un objeto" -#: utils/adt/jsonfuncs.c:4380 utils/adt/jsonfuncs.c:4439 -#: utils/adt/jsonfuncs.c:4519 +#: utils/adt/jsonfuncs.c:4656 utils/adt/jsonfuncs.c:4715 +#: utils/adt/jsonfuncs.c:4795 #, c-format msgid "cannot delete from scalar" msgstr "no se puede eliminar de un escalar" -#: utils/adt/jsonfuncs.c:4524 +#: utils/adt/jsonfuncs.c:4800 #, c-format msgid "cannot delete from object using integer index" msgstr "no se puede eliminar de un objeto usando un índice numérico" -#: utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4751 +#: utils/adt/jsonfuncs.c:4868 utils/adt/jsonfuncs.c:5027 #, c-format msgid "cannot set path in scalar" msgstr "no se puede definir una ruta en un escalar" -#: utils/adt/jsonfuncs.c:4633 utils/adt/jsonfuncs.c:4675 +#: utils/adt/jsonfuncs.c:4909 utils/adt/jsonfuncs.c:4951 #, c-format msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" msgstr "null_value_treatment debe ser «delete_key», «return_target», «use_json_null», o «raise_exception»" -#: utils/adt/jsonfuncs.c:4646 +#: utils/adt/jsonfuncs.c:4922 #, c-format msgid "JSON value must not be null" msgstr "valor JSON no debe ser null" -#: utils/adt/jsonfuncs.c:4647 +#: utils/adt/jsonfuncs.c:4923 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "Una excepción fue lanzada porque null_value_treatment es «raise_exception»." -#: utils/adt/jsonfuncs.c:4648 +#: utils/adt/jsonfuncs.c:4924 #, c-format msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." msgstr "Para impedir esto, puede cambiar el argumento null_value_treatment o asegurarse que no se pase un nulo SQL." -#: utils/adt/jsonfuncs.c:4703 +#: utils/adt/jsonfuncs.c:4979 #, c-format msgid "cannot delete path in scalar" msgstr "no se puede eliminar una ruta en un escalar" -#: utils/adt/jsonfuncs.c:4917 +#: utils/adt/jsonfuncs.c:5193 #, c-format msgid "path element at position %d is null" msgstr "el elemento en la posición %d de la ruta es null" -#: utils/adt/jsonfuncs.c:4936 utils/adt/jsonfuncs.c:4967 -#: utils/adt/jsonfuncs.c:5040 +#: utils/adt/jsonfuncs.c:5212 utils/adt/jsonfuncs.c:5243 +#: utils/adt/jsonfuncs.c:5316 #, c-format msgid "cannot replace existing key" msgstr "no se puede reemplazar una llave existente" -#: utils/adt/jsonfuncs.c:4937 utils/adt/jsonfuncs.c:4968 +#: utils/adt/jsonfuncs.c:5213 utils/adt/jsonfuncs.c:5244 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." msgstr "La ruta asume que la llave es un objeto compuesto, pero es un valor escalar." -#: utils/adt/jsonfuncs.c:5041 +#: utils/adt/jsonfuncs.c:5317 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Intente usar la función jsonb_set para reemplazar el valor de la llave." -#: utils/adt/jsonfuncs.c:5145 +#: utils/adt/jsonfuncs.c:5421 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "el elemento de ruta en la posición %d no es un entero: «%s»" -#: utils/adt/jsonfuncs.c:5162 +#: utils/adt/jsonfuncs.c:5438 #, c-format msgid "path element at position %d is out of range: %d" msgstr "el elemento de ruta en la posición %d está fuera de rango: %d" -#: utils/adt/jsonfuncs.c:5314 +#: utils/adt/jsonfuncs.c:5590 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "indicador de tipo errónea, sólo se permiten arrays y tipos escalares" -#: utils/adt/jsonfuncs.c:5321 +#: utils/adt/jsonfuncs.c:5597 #, c-format msgid "flag array element is not a string" msgstr "elemento del array de opciones no es un string" -#: utils/adt/jsonfuncs.c:5322 utils/adt/jsonfuncs.c:5344 +#: utils/adt/jsonfuncs.c:5598 utils/adt/jsonfuncs.c:5620 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "Los valores posibles son: «string», «numeric», «boolean», «key» y «all»." -#: utils/adt/jsonfuncs.c:5342 +#: utils/adt/jsonfuncs.c:5618 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "indicador erróneo en array de indicadores: «%s»" -#: utils/adt/jsonpath.c:382 +#: utils/adt/jsonpath.c:389 #, c-format msgid "@ is not allowed in root expressions" msgstr "@ no es permitido en expresiones raíz" -#: utils/adt/jsonpath.c:388 +#: utils/adt/jsonpath.c:395 #, c-format msgid "LAST is allowed only in array subscripts" msgstr "LAST sólo está permitido en subíndices de array" -#: utils/adt/jsonpath_exec.c:361 +#: utils/adt/jsonpath_exec.c:491 #, c-format msgid "single boolean result is expected" msgstr "se esperaba un único resultado booleano" -#: utils/adt/jsonpath_exec.c:557 +#: utils/adt/jsonpath_exec.c:851 #, c-format -msgid "\"vars\" argument is not an object" -msgstr "el argumento «vars» no es un objeto" +msgid "jsonpath wildcard array accessor can only be applied to an array" +msgstr "el método de acceso comodín de array jsonpath sólo puede aplicarse a un array" -#: utils/adt/jsonpath_exec.c:558 +#: utils/adt/jsonpath_exec.c:874 #, c-format -msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." -msgstr "Los parámetros jsonpath deben codificarse como pares llave-valor del objeto «vars»." +msgid "jsonpath wildcard member accessor can only be applied to an object" +msgstr "el método de acesso comodín de objeto jsonpath sólo puede aplicarse a un objeto" + +#: utils/adt/jsonpath_exec.c:923 +#, c-format +msgid "jsonpath array subscript is out of bounds" +msgstr "subíndice de array jsonpath fuera de los bordes" + +#: utils/adt/jsonpath_exec.c:980 +#, c-format +msgid "jsonpath array accessor can only be applied to an array" +msgstr "el método de acceso de array jsonpath sólo puede aplicarse a un array" -#: utils/adt/jsonpath_exec.c:675 +#: utils/adt/jsonpath_exec.c:1044 #, c-format msgid "JSON object does not contain key \"%s\"" msgstr "el objeto JSON no contiene la llave «%s»" -#: utils/adt/jsonpath_exec.c:687 +#: utils/adt/jsonpath_exec.c:1056 #, c-format msgid "jsonpath member accessor can only be applied to an object" msgstr "el método de acceso a un miembro jsonpath sólo puede aplicarse a un objeto" -#: utils/adt/jsonpath_exec.c:716 +#: utils/adt/jsonpath_exec.c:1114 #, c-format -msgid "jsonpath wildcard array accessor can only be applied to an array" -msgstr "el método de acceso comodín de array jsonpath sólo puede aplicarse a un array" +msgid "jsonpath item method .%s() can only be applied to an array" +msgstr "el método de ítem jsonpath .%s() sólo puede aplicase a un array" -#: utils/adt/jsonpath_exec.c:764 +#: utils/adt/jsonpath_exec.c:1167 utils/adt/jsonpath_exec.c:1193 #, c-format -msgid "jsonpath array subscript is out of bounds" -msgstr "subíndice de array jsonpath fuera de los bordes" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type double precision" +msgstr "el argumento «%s» del método de item jsonpath .%s() no es válido para el tipo de precisión doble" -#: utils/adt/jsonpath_exec.c:821 +#: utils/adt/jsonpath_exec.c:1172 utils/adt/jsonpath_exec.c:1198 +#: utils/adt/jsonpath_exec.c:1414 utils/adt/jsonpath_exec.c:1446 #, c-format -msgid "jsonpath array accessor can only be applied to an array" -msgstr "el método de acceso de array jsonpath sólo puede aplicarse a un array" +msgid "NaN or Infinity is not allowed for jsonpath item method .%s()" +msgstr "NaN o infinito no son permitidos para el método de ítem jsonpath .%s()" -#: utils/adt/jsonpath_exec.c:873 +#: utils/adt/jsonpath_exec.c:1211 utils/adt/jsonpath_exec.c:1313 +#: utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1593 #, c-format -msgid "jsonpath wildcard member accessor can only be applied to an object" -msgstr "el método de acesso comodín de objeto jsonpath sólo puede aplicarse a un objeto" +msgid "jsonpath item method .%s() can only be applied to a string or numeric value" +msgstr "el método de ítem jsonpath .%s() sólo puede aplicarse a un valor numérico o de cadena" -#: utils/adt/jsonpath_exec.c:1007 +#: utils/adt/jsonpath_exec.c:1281 utils/adt/jsonpath_exec.c:1305 #, c-format -msgid "jsonpath item method .%s() can only be applied to an array" -msgstr "el método de ítem jsonpath .%s() sólo puede aplicase a un array" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type bigint" +msgstr "el argumento «%s» del método de item jsonpath .%s() es inválido para el tipo bigint" -#: utils/adt/jsonpath_exec.c:1060 +#: utils/adt/jsonpath_exec.c:1357 utils/adt/jsonpath_exec.c:1377 #, c-format -msgid "numeric argument of jsonpath item method .%s() is out of range for type double precision" -msgstr "el argumento numérico del método de item jsonpath .%s() está fuera de rango para el tipo de precisión doble" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type boolean" +msgstr "el argumento «%s» del método de item jsonpath .%s() no es válido para el tipo booleano" -#: utils/adt/jsonpath_exec.c:1081 +#: utils/adt/jsonpath_exec.c:1386 #, c-format -msgid "string argument of jsonpath item method .%s() is not a valid representation of a double precision number" -msgstr "el argumento cadena del método de item jsonpath .%s() no es una representación válida de un número de precisión doble" +msgid "jsonpath item method .%s() can only be applied to a boolean, string, or numeric value" +msgstr "el método de ítem jsonpath .%s() sólo puede aplicarse a un valor booleano, de cadena o numérico" -#: utils/adt/jsonpath_exec.c:1094 +#: utils/adt/jsonpath_exec.c:1439 utils/adt/jsonpath_exec.c:1528 #, c-format -msgid "jsonpath item method .%s() can only be applied to a string or numeric value" -msgstr "el método de ítem jsonpath .%s() sólo puede aplicarse a un valor numérico o de cadena" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type numeric" +msgstr "el argumento «%s» del método de item jsonpath .%s() no es válido para el tipo numeric" + +#: utils/adt/jsonpath_exec.c:1487 +#, c-format +msgid "precision of jsonpath item method .%s() is out of range for type integer" +msgstr "la precisión del método de item jsonpath .%s() está fuera de rango para el tipo integer" + +#: utils/adt/jsonpath_exec.c:1501 +#, c-format +msgid "scale of jsonpath item method .%s() is out of range for type integer" +msgstr "la escala del método de item jsonpath .%s() está fuera de rango para el tipo integer" + +#: utils/adt/jsonpath_exec.c:1561 utils/adt/jsonpath_exec.c:1585 +#, c-format +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type integer" +msgstr "el argumento «%s» del método de item jsonpath .%s() no es válido para el tipo integer" -#: utils/adt/jsonpath_exec.c:1584 +#: utils/adt/jsonpath_exec.c:1648 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a boolean, string, numeric, or datetime value" +msgstr "el método de ítem jsonpath .%s() sólo puede aplicarse a un valor boolean, datetime, numérico o de cadena" + +#: utils/adt/jsonpath_exec.c:2137 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "el operando izquierdo del operador jsonpath %s no es un valor numérico escalar" -#: utils/adt/jsonpath_exec.c:1591 +#: utils/adt/jsonpath_exec.c:2144 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "el operando derecho del operador jsonpath %s no es un valor numérico escalar" -#: utils/adt/jsonpath_exec.c:1659 +#: utils/adt/jsonpath_exec.c:2212 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "el operando del operador jsonpath unario %s no es un valor numérico" -#: utils/adt/jsonpath_exec.c:1758 +#: utils/adt/jsonpath_exec.c:2311 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "el método de ítem jsonpath .%s() sólo puede aplicarse a un valor numérico" -#: utils/adt/jsonpath_exec.c:1798 +#: utils/adt/jsonpath_exec.c:2357 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "el método de ítem jsonpath .%s() sólo puede aplicase a una cadena" -#: utils/adt/jsonpath_exec.c:1892 +#: utils/adt/jsonpath_exec.c:2450 +#, c-format +msgid "time precision of jsonpath item method .%s() is out of range for type integer" +msgstr "la precisión de tiempo del método de item jsonpath .%s() está fuera de rango para el tipo integer" + +#: utils/adt/jsonpath_exec.c:2484 utils/adt/jsonpath_exec.c:2490 +#: utils/adt/jsonpath_exec.c:2517 utils/adt/jsonpath_exec.c:2545 +#: utils/adt/jsonpath_exec.c:2598 utils/adt/jsonpath_exec.c:2649 +#: utils/adt/jsonpath_exec.c:2720 #, c-format -msgid "datetime format is not recognized: \"%s\"" -msgstr "el formato de fecha/hora no se reconoce: «%s»" +msgid "%s format is not recognized: \"%s\"" +msgstr "formato de %s no se reconoce: «%s»" -#: utils/adt/jsonpath_exec.c:1894 +#: utils/adt/jsonpath_exec.c:2486 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "Use un argumento de patrón fecha/hora para especificar el formato de entrada del dato." -#: utils/adt/jsonpath_exec.c:1962 +#: utils/adt/jsonpath_exec.c:2679 utils/adt/jsonpath_exec.c:2760 +#, c-format +msgid "time precision of jsonpath item method .%s() is invalid" +msgstr "la precisión de tiempo del método de item jsonpath .%s() no es válida" + +#: utils/adt/jsonpath_exec.c:2840 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "el método de ítem jsonpath .%s() sólo puede ser aplicado a un objeto" -#: utils/adt/jsonpath_exec.c:2144 +#: utils/adt/jsonpath_exec.c:3124 +#, c-format +msgid "could not convert value of type %s to jsonpath" +msgstr "no se pudo convertir el valor de tipo %s a jsonpath" + +#: utils/adt/jsonpath_exec.c:3158 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "no se pudo encontrar la variable jsonpath «%s»" -#: utils/adt/jsonpath_exec.c:2408 +#: utils/adt/jsonpath_exec.c:3211 +#, c-format +msgid "\"vars\" argument is not an object" +msgstr "el argumento «vars» no es un objeto" + +#: utils/adt/jsonpath_exec.c:3212 +#, c-format +msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +msgstr "Los parámetros jsonpath deben codificarse como pares llave-valor del objeto «vars»." + +#: utils/adt/jsonpath_exec.c:3475 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "el subíndice de array jsonpath no es un único valor numérico" -#: utils/adt/jsonpath_exec.c:2420 +#: utils/adt/jsonpath_exec.c:3487 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "subíndice de array jsonpath fuera del rango entero" -#: utils/adt/jsonpath_exec.c:2597 +#: utils/adt/jsonpath_exec.c:3671 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "no se puede convertir el valor de %s a %s sin uso de huso horario" -#: utils/adt/jsonpath_exec.c:2599 +#: utils/adt/jsonpath_exec.c:3673 #, c-format msgid "Use *_tz() function for time zone support." msgstr "Utilice una función *_tz() para el soporte de huso horario." +#: utils/adt/jsonpath_exec.c:3981 +#, c-format +#| msgid "JSON path expression for column \"%s\" should return single item without wrapper" +msgid "JSON path expression for column \"%s\" must return single item when no wrapper is requested" +msgstr "la expresión de ruta JSON para la columna «%s» debe retornar un único elemento cuando no se pide un “wrapperâ€" + +#: utils/adt/jsonpath_exec.c:3983 utils/adt/jsonpath_exec.c:3988 +#, c-format +msgid "Use the WITH WRAPPER clause to wrap SQL/JSON items into an array." +msgstr "Use la cláusula WITH WRAPPER para envolver elementos SQL/JSON en un array." + +#: utils/adt/jsonpath_exec.c:3987 +#, c-format +#| msgid "JSON path expression in JSON_QUERY should return single item without wrapper" +msgid "JSON path expression in JSON_QUERY must return single item when no wrapper is requested" +msgstr "la expresión de ruta en JSON_QUERY debe retornar un único elemento cuando no se pide un “wrapperâ€" + +#: utils/adt/jsonpath_exec.c:4045 utils/adt/jsonpath_exec.c:4069 +#, c-format +#| msgid "JSON path expression for column \"%s\" should return single scalar item" +msgid "JSON path expression for column \"%s\" must return single scalar item" +msgstr "la expresión de ruta JSON para la columna «%s» debe retornar un único elemento escalar" + +#: utils/adt/jsonpath_exec.c:4050 utils/adt/jsonpath_exec.c:4074 +#, c-format +#| msgid "JSON path expression in JSON_VALUE should return single scalar item" +msgid "JSON path expression in JSON_VALUE must return single scalar item" +msgstr "la expresión de ruta JSON en JSON_VALUE debe retornar un único elemento escalar" + #: utils/adt/levenshtein.c:132 #, c-format msgid "levenshtein argument exceeds maximum length of %d characters" msgstr "el argumento levenshtein excede el largo máximo de %d caracteres" -#: utils/adt/like.c:161 +#: utils/adt/like.c:159 #, c-format msgid "nondeterministic collations are not supported for LIKE" msgstr "los ordenamientos no determinísticos no están soportados para LIKE" -#: utils/adt/like.c:190 utils/adt/like_support.c:1024 +#: utils/adt/like.c:188 utils/adt/like_support.c:1023 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "no se pudo determinar qué ordenamiento (collation) usar para ILIKE" -#: utils/adt/like.c:202 +#: utils/adt/like.c:200 #, c-format msgid "nondeterministic collations are not supported for ILIKE" msgstr "los ordenamientos no determinísticos no están soportados para ILIKE" @@ -24969,22 +25678,22 @@ msgstr "los ordenamientos no determinísticos no están soportados para ILIKE" msgid "LIKE pattern must not end with escape character" msgstr "el patrón de LIKE debe no terminar con un carácter de escape" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:801 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:800 #, c-format msgid "invalid escape string" msgstr "cadena de escape no válida" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:802 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:801 #, c-format msgid "Escape string must be empty or one character." msgstr "La cadena de escape debe ser vacía o un carácter." -#: utils/adt/like_support.c:1014 +#: utils/adt/like_support.c:1013 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "no está soportada la comparación insensible a mayúsculas en bytea" -#: utils/adt/like_support.c:1115 +#: utils/adt/like_support.c:1114 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "no está soportada la comparación con expresiones regulares en bytea" @@ -24994,17 +25703,17 @@ msgstr "no está soportada la comparación con expresiones regulares en bytea" msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "valor de octeto no válido en valor «macaddr»: «%s»" -#: utils/adt/mac8.c:554 +#: utils/adt/mac8.c:555 #, c-format msgid "macaddr8 data out of range to convert to macaddr" msgstr "datos macaddr8 fuera de rango para convertir a macaddr" -#: utils/adt/mac8.c:555 +#: utils/adt/mac8.c:556 #, c-format msgid "Only addresses that have FF and FE as values in the 4th and 5th bytes from the left, for example xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted from macaddr8 to macaddr." msgstr "Sólo las direcciones que tienen FF y FF como valores en el cuarto y quinto bytes desde la izquierda, por ejemplo xx:xx:xx:ff:fe:xx:xx:xx se pueden convertir de macaddr8 a macaddr." -#: utils/adt/mcxtfuncs.c:182 +#: utils/adt/mcxtfuncs.c:173 #, c-format msgid "PID %d is not a PostgreSQL server process" msgstr "PID %d no es un proceso servidor de PostgreSQL" @@ -25043,70 +25752,70 @@ msgstr "puede ser una etiqueta sola" msgid "requires AS" msgstr "requiere AS" -#: utils/adt/misc.c:853 utils/adt/misc.c:867 utils/adt/misc.c:906 -#: utils/adt/misc.c:912 utils/adt/misc.c:918 utils/adt/misc.c:941 +#: utils/adt/misc.c:897 utils/adt/misc.c:911 utils/adt/misc.c:950 +#: utils/adt/misc.c:956 utils/adt/misc.c:962 utils/adt/misc.c:985 #, c-format msgid "string is not a valid identifier: \"%s\"" msgstr "la cadena no es un identificador válido: «%s»" -#: utils/adt/misc.c:855 +#: utils/adt/misc.c:899 #, c-format msgid "String has unclosed double quotes." msgstr "La cadena tiene comillas dobles sin cerrar." -#: utils/adt/misc.c:869 +#: utils/adt/misc.c:913 #, c-format msgid "Quoted identifier must not be empty." msgstr "El identificador en comillas no debe ser vacío." -#: utils/adt/misc.c:908 +#: utils/adt/misc.c:952 #, c-format msgid "No valid identifier before \".\"." msgstr "No hay un identificador válido antes de «.»." -#: utils/adt/misc.c:914 +#: utils/adt/misc.c:958 #, c-format msgid "No valid identifier after \".\"." msgstr "No hay un identificador válido después de «.»." -#: utils/adt/misc.c:974 +#: utils/adt/misc.c:1018 #, c-format msgid "log format \"%s\" is not supported" msgstr "el formato de log «%s» no está soportado" -#: utils/adt/misc.c:975 +#: utils/adt/misc.c:1019 #, c-format msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." -msgstr "" +msgstr "Los formatos de log soportados son «stderr», «csvlog» y «jsonlog»." -#: utils/adt/multirangetypes.c:151 utils/adt/multirangetypes.c:164 -#: utils/adt/multirangetypes.c:193 utils/adt/multirangetypes.c:267 -#: utils/adt/multirangetypes.c:291 +#: utils/adt/multirangetypes.c:150 utils/adt/multirangetypes.c:163 +#: utils/adt/multirangetypes.c:192 utils/adt/multirangetypes.c:266 +#: utils/adt/multirangetypes.c:290 #, c-format msgid "malformed multirange literal: \"%s\"" msgstr "literal de multirango mal formado: «%s»" -#: utils/adt/multirangetypes.c:153 +#: utils/adt/multirangetypes.c:152 #, c-format msgid "Missing left brace." msgstr "Falta llave izquierda." -#: utils/adt/multirangetypes.c:195 +#: utils/adt/multirangetypes.c:194 #, c-format msgid "Expected range start." msgstr "Se esperaba inicio de rango." -#: utils/adt/multirangetypes.c:269 +#: utils/adt/multirangetypes.c:268 #, c-format msgid "Expected comma or end of multirange." msgstr "Se esperaba una coma o el final del multirango." -#: utils/adt/multirangetypes.c:982 +#: utils/adt/multirangetypes.c:981 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "no se puede construir multirangos a partir de arrays multidimensionales" -#: utils/adt/multirangetypes.c:1008 +#: utils/adt/multirangetypes.c:1007 #, c-format msgid "multirange values cannot contain null members" msgstr "valores de multirango no pueden contener miembros nulos" @@ -25185,113 +25894,138 @@ msgstr "el resultado está fuera de rango" msgid "cannot subtract inet values of different sizes" msgstr "no se puede sustraer valores inet de distintos tamaños" -#: utils/adt/numeric.c:785 utils/adt/numeric.c:3643 utils/adt/numeric.c:7131 -#: utils/adt/numeric.c:7334 utils/adt/numeric.c:7806 utils/adt/numeric.c:10501 -#: utils/adt/numeric.c:10975 utils/adt/numeric.c:11069 -#: utils/adt/numeric.c:11203 +#: utils/adt/numeric.c:793 utils/adt/numeric.c:3659 utils/adt/numeric.c:7216 +#: utils/adt/numeric.c:7419 utils/adt/numeric.c:7891 utils/adt/numeric.c:10586 +#: utils/adt/numeric.c:11061 utils/adt/numeric.c:11155 +#: utils/adt/numeric.c:11290 #, c-format msgid "value overflows numeric format" msgstr "el valor excede el formato numeric" -#: utils/adt/numeric.c:1098 +#: utils/adt/numeric.c:1106 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "el signo no es válido en el valor «numeric» externo" -#: utils/adt/numeric.c:1104 +#: utils/adt/numeric.c:1112 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "la escala no es válida en el valor «numeric» externo" -#: utils/adt/numeric.c:1113 +#: utils/adt/numeric.c:1121 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "hay un dígito no válido en el valor «numeric» externo" -#: utils/adt/numeric.c:1328 utils/adt/numeric.c:1342 +#: utils/adt/numeric.c:1336 utils/adt/numeric.c:1350 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "la precisión %d de NUMERIC debe estar entre 1 y %d" -#: utils/adt/numeric.c:1333 -#, fuzzy, c-format -#| msgid "NUMERIC precision %d must be between 1 and %d" +#: utils/adt/numeric.c:1341 +#, c-format msgid "NUMERIC scale %d must be between %d and %d" -msgstr "la precisión %d de NUMERIC debe estar entre 1 y %d" +msgstr "escala NUMERIC %d debe estar entre %d y %d" -#: utils/adt/numeric.c:1351 +#: utils/adt/numeric.c:1359 #, c-format msgid "invalid NUMERIC type modifier" msgstr "modificador de tipo NUMERIC no es válido" -#: utils/adt/numeric.c:1709 +#: utils/adt/numeric.c:1725 #, c-format msgid "start value cannot be NaN" msgstr "el valor de inicio no puede ser NaN" -#: utils/adt/numeric.c:1713 +#: utils/adt/numeric.c:1729 #, c-format msgid "start value cannot be infinity" msgstr "el valor de inicio no puede ser infinito" -#: utils/adt/numeric.c:1720 +#: utils/adt/numeric.c:1736 #, c-format msgid "stop value cannot be NaN" msgstr "el valor de término no puede ser NaN" -#: utils/adt/numeric.c:1724 +#: utils/adt/numeric.c:1740 #, c-format msgid "stop value cannot be infinity" msgstr "el valor de término no puede ser infinito" -#: utils/adt/numeric.c:1737 +#: utils/adt/numeric.c:1753 #, c-format msgid "step size cannot be NaN" msgstr "el tamaño de paso no puede ser NaN" -#: utils/adt/numeric.c:1741 +#: utils/adt/numeric.c:1757 #, c-format msgid "step size cannot be infinity" msgstr "el tamaño de paso no puede ser infinito" -#: utils/adt/numeric.c:3633 +#: utils/adt/numeric.c:3649 #, c-format msgid "factorial of a negative number is undefined" msgstr "el factorial de un número negativo es indefinido" -#: utils/adt/numeric.c:4366 utils/adt/numeric.c:4446 utils/adt/numeric.c:4487 -#: utils/adt/numeric.c:4683 +#: utils/adt/numeric.c:4256 +#, c-format +msgid "lower bound cannot be NaN" +msgstr "el límite inferior no puede ser NaN" + +#: utils/adt/numeric.c:4260 +#, c-format +msgid "lower bound cannot be infinity" +msgstr "el límite inferior no puede ser infinito" + +#: utils/adt/numeric.c:4267 +#, c-format +msgid "upper bound cannot be NaN" +msgstr "el límite superior no puede ser NaN" + +#: utils/adt/numeric.c:4271 +#, c-format +msgid "upper bound cannot be infinity" +msgstr "el límite superior no puede ser infinito" + +#: utils/adt/numeric.c:4432 utils/adt/numeric.c:4520 utils/adt/numeric.c:4580 +#: utils/adt/numeric.c:4776 #, c-format msgid "cannot convert NaN to %s" msgstr "no se puede convertir NaN a %s" -#: utils/adt/numeric.c:4370 utils/adt/numeric.c:4450 utils/adt/numeric.c:4491 -#: utils/adt/numeric.c:4687 +#: utils/adt/numeric.c:4436 utils/adt/numeric.c:4524 utils/adt/numeric.c:4584 +#: utils/adt/numeric.c:4780 #, c-format msgid "cannot convert infinity to %s" msgstr "no se puede convertir infinito a %s" -#: utils/adt/numeric.c:4696 +#: utils/adt/numeric.c:4789 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn fuera de rango" -#: utils/adt/numeric.c:7896 utils/adt/numeric.c:7947 +#: utils/adt/numeric.c:7981 utils/adt/numeric.c:8032 #, c-format msgid "numeric field overflow" msgstr "desbordamiento de campo numeric" -#: utils/adt/numeric.c:7897 +#: utils/adt/numeric.c:7982 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "Un campo con precisión %d, escala %d debe redondear a un valor absoluto menor que %s%d." -#: utils/adt/numeric.c:7948 +#: utils/adt/numeric.c:8033 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "Un campo con precisión %d, escala %d no puede contener un valor infinito." -#: utils/adt/oid.c:216 +#: utils/adt/numeric.c:11359 utils/adt/pseudorandomfuncs.c:135 +#: utils/adt/pseudorandomfuncs.c:159 +#, c-format +msgid "lower bound must be less than or equal to upper bound" +msgstr "el límite inferior debe ser menor o igual al límite superior" + +#: utils/adt/oid.c:217 #, c-format msgid "invalid oidvector data" msgstr "datos de oidvector no válidos" @@ -25302,10 +26036,9 @@ msgid "requested character too large" msgstr "el carácter solicitado es demasiado grande" #: utils/adt/oracle_compat.c:1020 -#, fuzzy, c-format -#| msgid "host name must be specified\n" +#, c-format msgid "character number must be positive" -msgstr "el nombre de servidor debe ser especificado\n" +msgstr "el número de carácter debe ser positivo" #: utils/adt/oracle_compat.c:1024 #, c-format @@ -25313,323 +26046,326 @@ msgid "null character not permitted" msgstr "el carácter nulo no está permitido" #: utils/adt/oracle_compat.c:1042 utils/adt/oracle_compat.c:1095 -#, fuzzy, c-format -#| msgid "requested character too large" +#, c-format msgid "requested character too large for encoding: %u" -msgstr "el carácter solicitado es demasiado grande" +msgstr "el carácter pedido es demasiado largo para el encoding: %u" #: utils/adt/oracle_compat.c:1083 -#, fuzzy, c-format -#| msgid "requested character too large" +#, c-format msgid "requested character not valid for encoding: %u" -msgstr "el carácter solicitado es demasiado grande" +msgstr "el carácter pedido no es válido para el encoding: %u" -#: utils/adt/orderedsetaggs.c:448 utils/adt/orderedsetaggs.c:553 -#: utils/adt/orderedsetaggs.c:693 +#: utils/adt/orderedsetaggs.c:446 utils/adt/orderedsetaggs.c:551 +#: utils/adt/orderedsetaggs.c:691 #, c-format msgid "percentile value %g is not between 0 and 1" msgstr "el valor de percentil %g no está entre 0 y 1" -#: utils/adt/pg_locale.c:1406 -#, fuzzy, c-format -#| msgid "could not open collator for locale \"%s\": %s" +#: utils/adt/pg_locale.c:326 utils/adt/pg_locale.c:358 +#, c-format +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "el nombre de configuración regional «%s» contiene caracteres no ASCII" + +#: utils/adt/pg_locale.c:1507 +#, c-format msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" -msgstr "no se pudo abrir el «collator» para la configuración regional «%s»: %s" +msgstr "no se pudo abrir el «collator» para la configuración regional «%s» con reglas «%s»: %s" -#: utils/adt/pg_locale.c:1417 utils/adt/pg_locale.c:2852 -#: utils/adt/pg_locale.c:2924 +#: utils/adt/pg_locale.c:1518 utils/adt/pg_locale.c:2992 +#: utils/adt/pg_locale.c:3065 #, c-format msgid "ICU is not supported in this build" msgstr "ICU no está soportado en este servidor" -#: utils/adt/pg_locale.c:1446 +#: utils/adt/pg_locale.c:1546 #, c-format msgid "could not create locale \"%s\": %m" msgstr "no se pudo crear la configuración regional «%s»: %m" -#: utils/adt/pg_locale.c:1449 +#: utils/adt/pg_locale.c:1549 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "El sistema operativo no pudo encontrar datos de configuración regional para la configuración «%s»." -#: utils/adt/pg_locale.c:1564 +#: utils/adt/pg_locale.c:1670 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "los ordenamientos (collation) con valores collate y ctype diferentes no están soportados en esta plataforma" -#: utils/adt/pg_locale.c:1573 +#: utils/adt/pg_locale.c:1717 #, c-format -msgid "collation provider LIBC is not supported on this platform" -msgstr "el proveedor de ordenamientos LIBC no está soportado en esta plataforma" - -#: utils/adt/pg_locale.c:1614 -#, fuzzy, c-format -#| msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgid "collation \"%s\" has no actual version, but a version was recorded" -msgstr "la extensión «%s» no tiene ruta de actualización desde la versión «%s» hasta la versión «%s»" +msgstr "la “collation†«%s» no tiene versión actual, pero una versión fue registrada" -#: utils/adt/pg_locale.c:1620 +#: utils/adt/pg_locale.c:1723 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "el ordenamiento (collation) «%s» tiene una discordancia de versión" -#: utils/adt/pg_locale.c:1622 +#: utils/adt/pg_locale.c:1725 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "El ordenamiento en la base de datos fue creado usando la versión %s, pero el sistema operativo provee la versión %s." -#: utils/adt/pg_locale.c:1625 +#: utils/adt/pg_locale.c:1728 #, c-format msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgstr "Reconstruya todos los objetos afectados por este ordenamiento y ejecute ALTER COLLATION %s REFRESH VERSION, o construya PostgreSQL con la versión correcta de la biblioteca." -#: utils/adt/pg_locale.c:1691 +#: utils/adt/pg_locale.c:1772 utils/adt/pg_locale.c:2556 +#: utils/adt/pg_locale.c:2581 +#, c-format +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "nombre de configuración regional «%s» no válido para el proveedor builtin" + +#: utils/adt/pg_locale.c:1814 #, c-format msgid "could not load locale \"%s\"" msgstr "no se pudo cargar la configuración regional «%s»" -#: utils/adt/pg_locale.c:1716 +#: utils/adt/pg_locale.c:1839 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "no se pudo obtener la versión de «collation» para la configuración regional «%s»: código de error %lu" -#: utils/adt/pg_locale.c:1772 utils/adt/pg_locale.c:1785 +#: utils/adt/pg_locale.c:1895 utils/adt/pg_locale.c:1908 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "no se pudo convertir la cadena a UTF-16: código de error %lu" -#: utils/adt/pg_locale.c:1800 +#: utils/adt/pg_locale.c:1920 #, c-format msgid "could not compare Unicode strings: %m" msgstr "no se pudieron comparar las cadenas Unicode: %m" -#: utils/adt/pg_locale.c:1980 +#: utils/adt/pg_locale.c:2094 #, c-format msgid "collation failed: %s" msgstr "el ordenamiento falló: %s" -#: utils/adt/pg_locale.c:2201 utils/adt/pg_locale.c:2233 +#: utils/adt/pg_locale.c:2313 utils/adt/pg_locale.c:2345 #, c-format msgid "sort key generation failed: %s" msgstr "la generación de la llave de ordenamiento falló: %s" -#: utils/adt/pg_locale.c:2474 utils/adt/pg_locale.c:2796 -#, fuzzy, c-format -#| msgid "could not open collator for locale \"%s\": %s" +#: utils/adt/pg_locale.c:2635 +#, c-format msgid "could not get language from locale \"%s\": %s" -msgstr "no se pudo abrir el «collator» para la configuración regional «%s»: %s" +msgstr "no se pudo el lenguaje de la configuración regional «%s»: %s" -#: utils/adt/pg_locale.c:2495 utils/adt/pg_locale.c:2511 +#: utils/adt/pg_locale.c:2656 utils/adt/pg_locale.c:2672 #, c-format msgid "could not open collator for locale \"%s\": %s" msgstr "no se pudo abrir el «collator» para la configuración regional «%s»: %s" -#: utils/adt/pg_locale.c:2536 +#: utils/adt/pg_locale.c:2697 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "la codificación «%s» no estæ soportada por ICU" -#: utils/adt/pg_locale.c:2543 +#: utils/adt/pg_locale.c:2704 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "no se pudo abrir el conversor ICU para la codificación «%s»: %s" -#: utils/adt/pg_locale.c:2560 utils/adt/pg_locale.c:2578 -#: utils/adt/pg_locale.c:2634 utils/adt/pg_locale.c:2644 +#: utils/adt/pg_locale.c:2722 utils/adt/pg_locale.c:2741 +#: utils/adt/pg_locale.c:2797 utils/adt/pg_locale.c:2808 #, c-format msgid "%s failed: %s" msgstr "%s falló: %s" -#: utils/adt/pg_locale.c:2843 +#: utils/adt/pg_locale.c:2983 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "no se pudo convertir el nombre de configuración regional «%s» a etiqueta de lenguaje: %s" -#: utils/adt/pg_locale.c:2884 -#, fuzzy, c-format -#| msgid "could not open collator for locale \"%s\": %s" +#: utils/adt/pg_locale.c:3024 +#, c-format msgid "could not get language from ICU locale \"%s\": %s" -msgstr "no se pudo abrir el «collator» para la configuración regional «%s»: %s" +msgstr "no se pudo obtener el lenguaje de la configuración regional ICU «%s»: %s" -#: utils/adt/pg_locale.c:2886 utils/adt/pg_locale.c:2915 +#: utils/adt/pg_locale.c:3026 utils/adt/pg_locale.c:3055 #, c-format -msgid "To disable ICU locale validation, set parameter icu_validation_level to DISABLED." -msgstr "" +msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." +msgstr "Par desactivar la validación ICU de configuración regional, defina «%s» a «%s»." -#: utils/adt/pg_locale.c:2913 -#, fuzzy, c-format -#| msgid "cursor \"%s\" has no argument named \"%s\"" +#: utils/adt/pg_locale.c:3053 +#, c-format msgid "ICU locale \"%s\" has unknown language \"%s\"" -msgstr "el cursor «%s» no tiene un argumento llamado «%s»" +msgstr "el locale ICU «%s» tiene lenguaje desconocido «%s»" -#: utils/adt/pg_locale.c:3093 +#: utils/adt/pg_locale.c:3204 #, c-format msgid "invalid multibyte character for locale" msgstr "el carácter multibyte no es válido para esta configuración regional" -#: utils/adt/pg_locale.c:3094 +#: utils/adt/pg_locale.c:3205 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "La configuración regional LC_CTYPE del servidor es probablemente incompatible con la codificación de la base de datos." -#: utils/adt/pg_lsn.c:263 +#: utils/adt/pg_lsn.c:262 #, c-format msgid "cannot add NaN to pg_lsn" msgstr "no se puede sumar NaN a bigint" -#: utils/adt/pg_lsn.c:297 +#: utils/adt/pg_lsn.c:296 #, c-format msgid "cannot subtract NaN from pg_lsn" msgstr "no se puede restar NaN de pg_lsn" -#: utils/adt/pg_upgrade_support.c:29 +#: utils/adt/pg_upgrade_support.c:39 #, c-format msgid "function can only be called when server is in binary upgrade mode" msgstr "la función sólo puede invocarse cuando el servidor está en modo de actualización binaria" -#: utils/adt/pgstatfuncs.c:253 +#: utils/adt/pgstatfuncs.c:252 #, c-format msgid "invalid command name: \"%s\"" msgstr "nombre de orden no válido: «%s»" -#: utils/adt/pgstatfuncs.c:1768 +#: utils/adt/pgstatfuncs.c:1739 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "destino de reset no reconocido: «%s»" -#: utils/adt/pgstatfuncs.c:1769 +#: utils/adt/pgstatfuncs.c:1740 #, c-format -msgid "Target must be \"archiver\", \"bgwriter\", \"io\", \"recovery_prefetch\", or \"wal\"." -msgstr "" +msgid "Target must be \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"recovery_prefetch\", \"slru\", or \"wal\"." +msgstr "El destino debe ser «archiver», «bgwriter», «checkpointer», «io», «recovery_prefetch», «slru» o «wal»." -#: utils/adt/pgstatfuncs.c:1847 -#, fuzzy, c-format -#| msgid "invalid role OID: %u" +#: utils/adt/pgstatfuncs.c:1822 +#, c-format msgid "invalid subscription OID %u" -msgstr "el OID de rol no es válido: %u" +msgstr "OID de suscripción %u no válido" + +#: utils/adt/pseudorandomfuncs.c:69 +#, c-format +msgid "setseed parameter %g is out of allowed range [-1,1]" +msgstr "parámetro setseed %g fuera del rango permitido [-1,1]" -#: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 +#: utils/adt/pseudotypes.c:55 utils/adt/pseudotypes.c:89 #, c-format msgid "cannot display a value of type %s" msgstr "no se puede desplegar un valor de tipo %s" -#: utils/adt/pseudotypes.c:310 +#: utils/adt/pseudotypes.c:307 #, c-format msgid "cannot accept a value of a shell type" msgstr "no se puede aceptar un valor de un tipo inconcluso" -#: utils/adt/pseudotypes.c:320 +#: utils/adt/pseudotypes.c:317 #, c-format msgid "cannot display a value of a shell type" msgstr "no se puede desplegar un valor de un tipo inconcluso" -#: utils/adt/rangetypes.c:415 +#: utils/adt/rangetypes.c:422 #, c-format msgid "range constructor flags argument must not be null" msgstr "el argumento de opciones del constructor de rango no debe ser null" -#: utils/adt/rangetypes.c:1014 +#: utils/adt/rangetypes.c:1021 #, c-format msgid "result of range difference would not be contiguous" msgstr "el resultado de la diferencia de rangos no sería contiguo" -#: utils/adt/rangetypes.c:1075 +#: utils/adt/rangetypes.c:1082 #, c-format msgid "result of range union would not be contiguous" msgstr "el resultado de la unión de rangos no sería contiguo" -#: utils/adt/rangetypes.c:1750 +#: utils/adt/rangetypes.c:1757 #, c-format msgid "range lower bound must be less than or equal to range upper bound" msgstr "el límite inferior del rango debe ser menor o igual al límite superior del rango" -#: utils/adt/rangetypes.c:2197 utils/adt/rangetypes.c:2210 -#: utils/adt/rangetypes.c:2224 +#: utils/adt/rangetypes.c:2256 utils/adt/rangetypes.c:2269 +#: utils/adt/rangetypes.c:2283 #, c-format msgid "invalid range bound flags" msgstr "opciones de bordes de rango no válidas" -#: utils/adt/rangetypes.c:2198 utils/adt/rangetypes.c:2211 -#: utils/adt/rangetypes.c:2225 +#: utils/adt/rangetypes.c:2257 utils/adt/rangetypes.c:2270 +#: utils/adt/rangetypes.c:2284 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "Los valores aceptables son «[]», «[)», «(]» y «()»." -#: utils/adt/rangetypes.c:2293 utils/adt/rangetypes.c:2310 -#: utils/adt/rangetypes.c:2325 utils/adt/rangetypes.c:2345 -#: utils/adt/rangetypes.c:2356 utils/adt/rangetypes.c:2403 -#: utils/adt/rangetypes.c:2411 +#: utils/adt/rangetypes.c:2352 utils/adt/rangetypes.c:2369 +#: utils/adt/rangetypes.c:2384 utils/adt/rangetypes.c:2404 +#: utils/adt/rangetypes.c:2415 utils/adt/rangetypes.c:2462 +#: utils/adt/rangetypes.c:2470 #, c-format msgid "malformed range literal: \"%s\"" msgstr "literal de rango mal formado: «%s»" -#: utils/adt/rangetypes.c:2295 +#: utils/adt/rangetypes.c:2354 #, c-format msgid "Junk after \"empty\" key word." msgstr "Basura a continuación de la palabra «empty»." -#: utils/adt/rangetypes.c:2312 +#: utils/adt/rangetypes.c:2371 #, c-format msgid "Missing left parenthesis or bracket." msgstr "Falta paréntesis o corchete izquierdo." -#: utils/adt/rangetypes.c:2327 +#: utils/adt/rangetypes.c:2386 #, c-format msgid "Missing comma after lower bound." msgstr "Coma faltante después del límite inferior." -#: utils/adt/rangetypes.c:2347 +#: utils/adt/rangetypes.c:2406 #, c-format msgid "Too many commas." msgstr "Demasiadas comas." -#: utils/adt/rangetypes.c:2358 +#: utils/adt/rangetypes.c:2417 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "Basura después del paréntesis o corchete derecho." -#: utils/adt/regexp.c:305 utils/adt/regexp.c:1997 utils/adt/varlena.c:4271 +#: utils/adt/regexp.c:304 utils/adt/regexp.c:1996 utils/adt/varlena.c:4273 #, c-format msgid "regular expression failed: %s" msgstr "la expresión regular falló: %s" -#: utils/adt/regexp.c:446 utils/adt/regexp.c:681 +#: utils/adt/regexp.c:445 utils/adt/regexp.c:680 #, c-format msgid "invalid regular expression option: \"%.*s\"" msgstr "opción de expresión regular no válida: «%.*s»" -#: utils/adt/regexp.c:683 +#: utils/adt/regexp.c:682 #, c-format msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." msgstr "Si su intención era usar regexp_replace() con un parámetro de inicio, convierta el cuarto argumento a integer explícitamente." -#: utils/adt/regexp.c:717 utils/adt/regexp.c:726 utils/adt/regexp.c:1083 -#: utils/adt/regexp.c:1147 utils/adt/regexp.c:1156 utils/adt/regexp.c:1165 -#: utils/adt/regexp.c:1174 utils/adt/regexp.c:1854 utils/adt/regexp.c:1863 -#: utils/adt/regexp.c:1872 utils/misc/guc.c:6734 utils/misc/guc.c:6768 +#: utils/adt/regexp.c:716 utils/adt/regexp.c:725 utils/adt/regexp.c:1082 +#: utils/adt/regexp.c:1146 utils/adt/regexp.c:1155 utils/adt/regexp.c:1164 +#: utils/adt/regexp.c:1173 utils/adt/regexp.c:1853 utils/adt/regexp.c:1862 +#: utils/adt/regexp.c:1871 utils/misc/guc.c:6820 utils/misc/guc.c:6854 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "valor no válido para el parámetro «%s»: %d" -#: utils/adt/regexp.c:937 +#: utils/adt/regexp.c:936 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "la expresión regular SQL no puede contener más de dos separadores escape-comilla doble" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:1094 utils/adt/regexp.c:1185 utils/adt/regexp.c:1272 -#: utils/adt/regexp.c:1311 utils/adt/regexp.c:1699 utils/adt/regexp.c:1754 -#: utils/adt/regexp.c:1883 +#: utils/adt/regexp.c:1093 utils/adt/regexp.c:1184 utils/adt/regexp.c:1271 +#: utils/adt/regexp.c:1310 utils/adt/regexp.c:1698 utils/adt/regexp.c:1753 +#: utils/adt/regexp.c:1882 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s no soporta la opción «global»" -#: utils/adt/regexp.c:1313 +#: utils/adt/regexp.c:1312 #, c-format msgid "Use the regexp_matches function instead." msgstr "En su lugar, utilice la función regexp_matches." -#: utils/adt/regexp.c:1501 +#: utils/adt/regexp.c:1500 #, c-format msgid "too many regular expression matches" msgstr "demasiadas coincidencias de la expresión regular" @@ -25644,18 +26380,18 @@ msgstr "existe más de una función llamada «%s»" msgid "more than one operator named %s" msgstr "existe más de un operador llamado %s" -#: utils/adt/regproc.c:670 gram.y:8862 +#: utils/adt/regproc.c:670 gram.y:8992 #, c-format msgid "missing argument" msgstr "falta un argumento" -#: utils/adt/regproc.c:671 gram.y:8863 +#: utils/adt/regproc.c:671 gram.y:8993 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "Use NONE para denotar el argumento faltante de un operador unario." -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:9934 -#: utils/adt/ruleutils.c:10147 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10509 +#: utils/adt/ruleutils.c:10722 #, c-format msgid "too many arguments" msgstr "demasiados argumentos" @@ -25665,296 +26401,319 @@ msgstr "demasiados argumentos" msgid "Provide two argument types for operator." msgstr "Provea dos tipos de argumento para un operador." -#: utils/adt/regproc.c:1544 utils/adt/regproc.c:1661 utils/adt/regproc.c:1790 -#: utils/adt/regproc.c:1795 utils/adt/varlena.c:3411 utils/adt/varlena.c:3416 +#: utils/adt/regproc.c:1564 utils/adt/regproc.c:1681 utils/adt/regproc.c:1810 +#: utils/adt/regproc.c:1815 utils/adt/varlena.c:3413 utils/adt/varlena.c:3418 #, c-format msgid "invalid name syntax" msgstr "la sintaxis de nombre no es válida" -#: utils/adt/regproc.c:1904 +#: utils/adt/regproc.c:1924 #, c-format msgid "expected a left parenthesis" msgstr "se esperaba un paréntesis izquierdo" -#: utils/adt/regproc.c:1922 +#: utils/adt/regproc.c:1942 #, c-format msgid "expected a right parenthesis" msgstr "se esperaba un paréntesis derecho" -#: utils/adt/regproc.c:1941 +#: utils/adt/regproc.c:1961 #, c-format msgid "expected a type name" msgstr "se esperaba un nombre de tipo" -#: utils/adt/regproc.c:1973 +#: utils/adt/regproc.c:1993 #, c-format msgid "improper type name" msgstr "el nombre de tipo no es válido" -#: utils/adt/ri_triggers.c:306 utils/adt/ri_triggers.c:1625 -#: utils/adt/ri_triggers.c:2610 +#: utils/adt/ri_triggers.c:303 utils/adt/ri_triggers.c:1616 +#: utils/adt/ri_triggers.c:2601 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "inserción o actualización en la tabla «%s» viola la llave foránea «%s»" -#: utils/adt/ri_triggers.c:309 utils/adt/ri_triggers.c:1628 +#: utils/adt/ri_triggers.c:306 utils/adt/ri_triggers.c:1619 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MATCH FULL no permite la mezcla de valores de clave nulos y no nulos." -#: utils/adt/ri_triggers.c:2045 +#: utils/adt/ri_triggers.c:2036 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "la función «%s» debe ser ejecutada en INSERT" -#: utils/adt/ri_triggers.c:2051 +#: utils/adt/ri_triggers.c:2042 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "la función «%s» debe ser ejecutada en UPDATE" -#: utils/adt/ri_triggers.c:2057 +#: utils/adt/ri_triggers.c:2048 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "la función «%s» debe ser ejecutada en DELETE" -#: utils/adt/ri_triggers.c:2080 +#: utils/adt/ri_triggers.c:2071 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "no hay una entrada en pg_constraint para el trigger «%s» en tabla «%s»" -#: utils/adt/ri_triggers.c:2082 +#: utils/adt/ri_triggers.c:2073 #, c-format msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." msgstr "Elimine este trigger de integridad referencial y sus pares, y utilice ALTER TABLE ADD CONSTRAINT." -#: utils/adt/ri_triggers.c:2112 gram.y:4244 +#: utils/adt/ri_triggers.c:2103 gram.y:4340 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "MATCH PARTIAL no está implementada" -#: utils/adt/ri_triggers.c:2435 +#: utils/adt/ri_triggers.c:2426 #, c-format msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" msgstr "la consulta de integridad referencial en «%s» de la restricción «%s» en «%s» entregó un resultado inesperado" -#: utils/adt/ri_triggers.c:2439 +#: utils/adt/ri_triggers.c:2430 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "Esto probablemente es causado por una regla que reescribió la consulta." -#: utils/adt/ri_triggers.c:2600 +#: utils/adt/ri_triggers.c:2591 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "eliminar la partición «%s» viola la llave foránea «%s»" -#: utils/adt/ri_triggers.c:2603 utils/adt/ri_triggers.c:2628 +#: utils/adt/ri_triggers.c:2594 utils/adt/ri_triggers.c:2619 #, c-format msgid "Key (%s)=(%s) is still referenced from table \"%s\"." msgstr "La llave (%s)=(%s) todavía es referida desde la tabla «%s»." -#: utils/adt/ri_triggers.c:2614 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "La llave (%s)=(%s) no está presente en la tabla «%s»." -#: utils/adt/ri_triggers.c:2617 +#: utils/adt/ri_triggers.c:2608 #, c-format msgid "Key is not present in table \"%s\"." msgstr "La llave no está presente en la tabla «%s»." -#: utils/adt/ri_triggers.c:2623 +#: utils/adt/ri_triggers.c:2614 #, c-format msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" msgstr "update o delete en «%s» viola la llave foránea «%s» en la tabla «%s»" -#: utils/adt/ri_triggers.c:2631 +#: utils/adt/ri_triggers.c:2622 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "La llave todavía es referida desde la tabla «%s»." -#: utils/adt/rowtypes.c:106 utils/adt/rowtypes.c:510 +#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:509 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "el ingreso de tipos compuestos anónimos no está implementado" -#: utils/adt/rowtypes.c:159 utils/adt/rowtypes.c:191 utils/adt/rowtypes.c:217 -#: utils/adt/rowtypes.c:228 utils/adt/rowtypes.c:286 utils/adt/rowtypes.c:297 +#: utils/adt/rowtypes.c:158 utils/adt/rowtypes.c:190 utils/adt/rowtypes.c:216 +#: utils/adt/rowtypes.c:227 utils/adt/rowtypes.c:285 utils/adt/rowtypes.c:296 #, c-format msgid "malformed record literal: \"%s\"" msgstr "literal de record mal formado: «%s»" -#: utils/adt/rowtypes.c:160 +#: utils/adt/rowtypes.c:159 #, c-format msgid "Missing left parenthesis." msgstr "Falta paréntesis izquierdo." -#: utils/adt/rowtypes.c:192 +#: utils/adt/rowtypes.c:191 #, c-format msgid "Too few columns." msgstr "Muy pocas columnas." -#: utils/adt/rowtypes.c:287 +#: utils/adt/rowtypes.c:286 #, c-format msgid "Too many columns." msgstr "Demasiadas columnas." -#: utils/adt/rowtypes.c:298 +#: utils/adt/rowtypes.c:297 #, c-format msgid "Junk after right parenthesis." msgstr "Basura después del paréntesis derecho." -#: utils/adt/rowtypes.c:559 +#: utils/adt/rowtypes.c:558 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "número de columnas erróneo: %d, se esperaban %d" -#: utils/adt/rowtypes.c:601 +#: utils/adt/rowtypes.c:599 #, c-format msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" msgstr "los datos binarios tienen tipo %u (%s) en lugar del esperado %u (%s) en columna de registro %d" -#: utils/adt/rowtypes.c:668 +#: utils/adt/rowtypes.c:660 #, c-format msgid "improper binary format in record column %d" msgstr "formato binario incorrecto en la columna record %d" -#: utils/adt/rowtypes.c:959 utils/adt/rowtypes.c:1205 utils/adt/rowtypes.c:1463 -#: utils/adt/rowtypes.c:1709 +#: utils/adt/rowtypes.c:949 utils/adt/rowtypes.c:1195 utils/adt/rowtypes.c:1453 +#: utils/adt/rowtypes.c:1699 #, c-format msgid "cannot compare dissimilar column types %s and %s at record column %d" msgstr "no se pueden comparar los tipos de columnas disímiles %s y %s en la columna %d" -#: utils/adt/rowtypes.c:1050 utils/adt/rowtypes.c:1275 -#: utils/adt/rowtypes.c:1560 utils/adt/rowtypes.c:1745 +#: utils/adt/rowtypes.c:1040 utils/adt/rowtypes.c:1265 +#: utils/adt/rowtypes.c:1550 utils/adt/rowtypes.c:1735 #, c-format msgid "cannot compare record types with different numbers of columns" msgstr "no se pueden comparar registros con cantidad distinta de columnas" -#: utils/adt/ruleutils.c:2678 -#, fuzzy, c-format -#| msgid "cannot use subquery in index expression" +#: utils/adt/ruleutils.c:2694 +#, c-format msgid "input is a query, not an expression" -msgstr "no se puede usar una subconsulta en una expresión de índice" +msgstr "la entrada es una consulta, no una expresión" -#: utils/adt/ruleutils.c:2690 -#, fuzzy, c-format -#| msgid "USING expression contains a whole-row table reference." +#: utils/adt/ruleutils.c:2706 +#, c-format msgid "expression contains variables of more than one relation" -msgstr "La expresión USING contiene una referencia a la fila completa (whole-row)." +msgstr "la expresión contiene variables de más de una relación" -#: utils/adt/ruleutils.c:2697 -#, fuzzy, c-format -#| msgid "argument of %s must not contain variables" +#: utils/adt/ruleutils.c:2713 +#, c-format msgid "expression contains variables" -msgstr "el argumento de %s no puede contener variables" +msgstr "la expresión contiene variables" -#: utils/adt/ruleutils.c:5211 +#: utils/adt/ruleutils.c:5246 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "la regla «%s» tiene el tipo de evento no soportado %d" -#: utils/adt/timestamp.c:91 +#: utils/adt/timestamp.c:128 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "la precisión de TIMESTAMP(%d)%s no debe ser negativa" -#: utils/adt/timestamp.c:97 +#: utils/adt/timestamp.c:134 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "la precisión de TIMESTAMP(%d)%s fue reducida al máximo permitido, %d" -#: utils/adt/timestamp.c:377 +#: utils/adt/timestamp.c:394 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "la precisión de timestamp(%d) debe estar entre %d y %d" -#: utils/adt/timestamp.c:495 +#: utils/adt/timestamp.c:512 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "Los husos horarios numéricos deben tener «-» o «+» como su primer carácter." -#: utils/adt/timestamp.c:507 +#: utils/adt/timestamp.c:524 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "huso horario numérico «%s» fuera de rango" -#: utils/adt/timestamp.c:608 utils/adt/timestamp.c:618 -#: utils/adt/timestamp.c:626 +#: utils/adt/timestamp.c:625 utils/adt/timestamp.c:635 +#: utils/adt/timestamp.c:643 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "timestamp fuera de rango: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:727 +#: utils/adt/timestamp.c:744 #, c-format msgid "timestamp cannot be NaN" msgstr "el timestamp no puede ser NaN" -#: utils/adt/timestamp.c:745 utils/adt/timestamp.c:757 +#: utils/adt/timestamp.c:762 utils/adt/timestamp.c:774 #, c-format msgid "timestamp out of range: \"%g\"" msgstr "timestamp fuera de rango: «%g»" -#: utils/adt/timestamp.c:1064 utils/adt/timestamp.c:1097 +#: utils/adt/timestamp.c:957 utils/adt/timestamp.c:1516 +#: utils/adt/timestamp.c:1526 utils/adt/timestamp.c:1587 +#: utils/adt/timestamp.c:2807 utils/adt/timestamp.c:2816 +#: utils/adt/timestamp.c:2831 utils/adt/timestamp.c:2905 +#: utils/adt/timestamp.c:2922 utils/adt/timestamp.c:2979 +#: utils/adt/timestamp.c:3022 utils/adt/timestamp.c:3400 +#: utils/adt/timestamp.c:3458 utils/adt/timestamp.c:3481 +#: utils/adt/timestamp.c:3490 utils/adt/timestamp.c:3514 +#: utils/adt/timestamp.c:3537 utils/adt/timestamp.c:3546 +#: utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3782 +#: utils/adt/timestamp.c:4189 utils/adt/timestamp.c:4226 +#: utils/adt/timestamp.c:4274 utils/adt/timestamp.c:4283 +#: utils/adt/timestamp.c:4375 utils/adt/timestamp.c:4422 +#: utils/adt/timestamp.c:4431 utils/adt/timestamp.c:4527 +#: utils/adt/timestamp.c:4580 utils/adt/timestamp.c:4590 +#: utils/adt/timestamp.c:4785 utils/adt/timestamp.c:4795 +#: utils/adt/timestamp.c:5097 +#, c-format +msgid "interval out of range" +msgstr "interval fuera de rango" + +#: utils/adt/timestamp.c:1094 utils/adt/timestamp.c:1127 #, c-format msgid "invalid INTERVAL type modifier" msgstr "modificador de tipo INTERVAL no válido" -#: utils/adt/timestamp.c:1080 +#: utils/adt/timestamp.c:1110 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "la precisión de INTERVAL(%d) no debe ser negativa" -#: utils/adt/timestamp.c:1086 +#: utils/adt/timestamp.c:1116 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "la precisión de INTERVAL(%d) fue reducida al máximo permitido, %d" -#: utils/adt/timestamp.c:1472 +#: utils/adt/timestamp.c:1506 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "la precisión de interval(%d) debe estar entre %d y %d" -#: utils/adt/timestamp.c:2711 -#, c-format -msgid "cannot subtract infinite timestamps" -msgstr "no se pueden restar timestamps infinitos" - -#: utils/adt/timestamp.c:3964 utils/adt/timestamp.c:4147 +#: utils/adt/timestamp.c:4564 utils/adt/timestamp.c:4769 #, c-format msgid "origin out of range" msgstr "origen fuera de rango" -#: utils/adt/timestamp.c:3969 utils/adt/timestamp.c:4152 +#: utils/adt/timestamp.c:4569 utils/adt/timestamp.c:4774 +#, c-format +msgid "timestamps cannot be binned into infinite intervals" +msgstr "no se puede aproximar (bin) timestamps hacia intervalos infinitos" + +#: utils/adt/timestamp.c:4574 utils/adt/timestamp.c:4779 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "no se puede aproximar (bin) timestamps hacia intervalos que contengan meses o años" -#: utils/adt/timestamp.c:3976 utils/adt/timestamp.c:4159 +#: utils/adt/timestamp.c:4585 utils/adt/timestamp.c:4790 #, c-format msgid "stride must be greater than zero" msgstr "el intervalo de paso (stride) debe ser mayor que cero" -#: utils/adt/timestamp.c:4442 +#: utils/adt/timestamp.c:5091 #, c-format msgid "Months usually have fractional weeks." -msgstr "" +msgstr "Los meses usualmente tienen semanas fraccionales." + +#: utils/adt/timestamp.c:6551 utils/adt/timestamp.c:6637 +#, c-format +msgid "step size cannot be infinite" +msgstr "el tamaño de paso no puede ser infinito" -#: utils/adt/trigfuncs.c:42 +#: utils/adt/trigfuncs.c:41 #, c-format msgid "suppress_redundant_updates_trigger: must be called as trigger" msgstr "suppress_redundant_updates_trigger: debe ser invocado como trigger" -#: utils/adt/trigfuncs.c:48 +#: utils/adt/trigfuncs.c:47 #, c-format msgid "suppress_redundant_updates_trigger: must be called on update" msgstr "suppress_redundant_updates_trigger: debe ser invocado en «UPDATE»" -#: utils/adt/trigfuncs.c:54 +#: utils/adt/trigfuncs.c:53 #, c-format msgid "suppress_redundant_updates_trigger: must be called before update" msgstr "suppress_redundant_updates_trigger: debe ser invocado «BEFORE UPDATE»" -#: utils/adt/trigfuncs.c:60 +#: utils/adt/trigfuncs.c:59 #, c-format msgid "suppress_redundant_updates_trigger: must be called for each row" msgstr "suppress_redundant_updates_trigger: debe ser invocado «FOR EACH ROW»" @@ -25969,32 +26728,32 @@ msgstr "distancia en operador de frases debe ser un valor entero entre zero y %d msgid "no operand in tsquery: \"%s\"" msgstr "no hay operando en tsquery: «%s»" -#: utils/adt/tsquery.c:558 +#: utils/adt/tsquery.c:554 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "el valor es demasiado grande en tsquery: «%s»" -#: utils/adt/tsquery.c:563 +#: utils/adt/tsquery.c:559 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "el operando es muy largo en tsquery: «%s»" -#: utils/adt/tsquery.c:591 +#: utils/adt/tsquery.c:587 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "palabra demasiado larga en tsquery: «%s»" -#: utils/adt/tsquery.c:717 utils/adt/tsvector_parser.c:147 +#: utils/adt/tsquery.c:713 utils/adt/tsvector_parser.c:147 #, c-format msgid "syntax error in tsquery: \"%s\"" msgstr "error de sintaxis en tsquery: «%s»" -#: utils/adt/tsquery.c:883 +#: utils/adt/tsquery.c:879 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" msgstr "la consulta de búsqueda en texto no contiene lexemas: «%s»" -#: utils/adt/tsquery.c:894 utils/adt/tsquery_util.c:376 +#: utils/adt/tsquery.c:890 utils/adt/tsquery_util.c:376 #, c-format msgid "tsquery is too large" msgstr "el tsquery es demasiado grande" @@ -26029,73 +26788,72 @@ msgstr "los arrays de pesos no deben contener valores nulos" msgid "weight out of range" msgstr "peso fuera de rango" -#: utils/adt/tsvector.c:217 +#: utils/adt/tsvector.c:216 #, c-format msgid "word is too long (%ld bytes, max %ld bytes)" msgstr "la palabra es demasiado larga (%ld, máximo %ld bytes)" -#: utils/adt/tsvector.c:224 +#: utils/adt/tsvector.c:223 #, c-format msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "la cadena es demasiado larga para tsvector (%ld bytes, máximo %ld bytes)" -#: utils/adt/tsvector_op.c:773 +#: utils/adt/tsvector_op.c:771 #, c-format msgid "lexeme array may not contain nulls" msgstr "el array de lexemas no debe contener nulls" -#: utils/adt/tsvector_op.c:778 -#, fuzzy, c-format -#| msgid "lexeme array may not contain nulls" +#: utils/adt/tsvector_op.c:776 +#, c-format msgid "lexeme array may not contain empty strings" -msgstr "el array de lexemas no debe contener nulls" +msgstr "el array de lexemas no debe contener cadenas vacías" -#: utils/adt/tsvector_op.c:847 +#: utils/adt/tsvector_op.c:845 #, c-format msgid "weight array may not contain nulls" msgstr "el array de pesos no debe contener nulls" -#: utils/adt/tsvector_op.c:871 +#: utils/adt/tsvector_op.c:869 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "no se reconoce el peso: «%c»" -#: utils/adt/tsvector_op.c:2601 +#: utils/adt/tsvector_op.c:2599 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "la consulta ts_stat debe retornar una columna tsvector" -#: utils/adt/tsvector_op.c:2790 +#: utils/adt/tsvector_op.c:2788 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "la columna tsvector «%s» no existe" -#: utils/adt/tsvector_op.c:2797 +#: utils/adt/tsvector_op.c:2795 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "la columna «%s» no es de tipo tsvector" -#: utils/adt/tsvector_op.c:2809 +#: utils/adt/tsvector_op.c:2807 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "la columna de configuración «%s» no existe" -#: utils/adt/tsvector_op.c:2815 +#: utils/adt/tsvector_op.c:2813 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "la columna «%s» no es de tipo regconfig" -#: utils/adt/tsvector_op.c:2822 +#: utils/adt/tsvector_op.c:2820 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "la columna de configuración «%s» no debe ser nula" -#: utils/adt/tsvector_op.c:2835 +#: utils/adt/tsvector_op.c:2833 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "el nombre de la configuración de búsqueda «%s» debe ser calificada con esquema" -#: utils/adt/tsvector_op.c:2860 +#: utils/adt/tsvector_op.c:2858 #, c-format msgid "column \"%s\" is not of a character type" msgstr "la columna «%s» no es de un tipo textual" @@ -26115,17 +26873,17 @@ msgstr "no hay carácter escapado: «%s»" msgid "wrong position info in tsvector: \"%s\"" msgstr "información posicional incorrecta en tsvector: «%s»" -#: utils/adt/uuid.c:413 +#: utils/adt/uuid.c:418 #, c-format msgid "could not generate random values" msgstr "no se pudo generar valores aleatorios" -#: utils/adt/varbit.c:110 utils/adt/varchar.c:54 +#: utils/adt/varbit.c:110 utils/adt/varchar.c:53 #, c-format msgid "length for type %s must be at least 1" msgstr "el largo para el tipo %s debe ser al menos 1" -#: utils/adt/varbit.c:115 utils/adt/varchar.c:58 +#: utils/adt/varbit.c:115 utils/adt/varchar.c:57 #, c-format msgid "length for type %s cannot exceed %d" msgstr "el largo del tipo %s no puede exceder %d" @@ -26160,9 +26918,9 @@ msgstr "el largo no es válido en cadena de bits externa" msgid "bit string too long for type bit varying(%d)" msgstr "la cadena de bits es demasiado larga para el tipo bit varying(%d)" -#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:908 -#: utils/adt/varlena.c:971 utils/adt/varlena.c:1128 utils/adt/varlena.c:3053 -#: utils/adt/varlena.c:3131 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:911 +#: utils/adt/varlena.c:974 utils/adt/varlena.c:1131 utils/adt/varlena.c:3055 +#: utils/adt/varlena.c:3133 #, c-format msgid "negative substring length not allowed" msgstr "no se permite un largo negativo de subcadena" @@ -26187,334 +26945,342 @@ msgstr "no se puede hacer XOR entre cadenas de bits de distintos tamaños" msgid "bit index %d out of valid range (0..%d)" msgstr "el índice de bit %d está fuera del rango válido (0..%d)" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3335 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3337 #, c-format msgid "new bit must be 0 or 1" msgstr "el nuevo bit debe ser 0 o 1" -#: utils/adt/varchar.c:162 utils/adt/varchar.c:313 +#: utils/adt/varchar.c:161 utils/adt/varchar.c:312 #, c-format msgid "value too long for type character(%d)" msgstr "el valor es demasiado largo para el tipo character(%d)" -#: utils/adt/varchar.c:476 utils/adt/varchar.c:640 +#: utils/adt/varchar.c:475 utils/adt/varchar.c:639 #, c-format msgid "value too long for type character varying(%d)" msgstr "el valor es demasiado largo para el tipo character varying(%d)" -#: utils/adt/varchar.c:738 utils/adt/varlena.c:1517 +#: utils/adt/varchar.c:737 utils/adt/varlena.c:1520 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "no se pudo determinar qué ordenamiento usar para la comparación de cadenas" -#: utils/adt/varlena.c:1227 utils/adt/varlena.c:1806 +#: utils/adt/varlena.c:1230 utils/adt/varlena.c:1809 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "los ordenamientos no determinísticos no están soportados para búsquedas de sub-cadenas" -#: utils/adt/varlena.c:3219 utils/adt/varlena.c:3286 +#: utils/adt/varlena.c:3221 utils/adt/varlena.c:3288 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "el índice %d está fuera de rango [0..%d]" -#: utils/adt/varlena.c:3250 utils/adt/varlena.c:3322 +#: utils/adt/varlena.c:3252 utils/adt/varlena.c:3324 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "el índice %lld está fuera de rango, 0..%lld" -#: utils/adt/varlena.c:4383 +#: utils/adt/varlena.c:4385 #, c-format msgid "field position must not be zero" msgstr "la posición del campo no debe ser cero" -#: utils/adt/varlena.c:5555 +#: utils/adt/varlena.c:5630 #, c-format msgid "unterminated format() type specifier" msgstr "especificador de tipo inconcluso en format()" -#: utils/adt/varlena.c:5556 utils/adt/varlena.c:5690 utils/adt/varlena.c:5811 +#: utils/adt/varlena.c:5631 utils/adt/varlena.c:5765 utils/adt/varlena.c:5886 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Para un «%%» solo, use «%%%%»." -#: utils/adt/varlena.c:5688 utils/adt/varlena.c:5809 +#: utils/adt/varlena.c:5763 utils/adt/varlena.c:5884 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "especificador de tipo no reconocido «%.*s» en format()" -#: utils/adt/varlena.c:5701 utils/adt/varlena.c:5758 +#: utils/adt/varlena.c:5776 utils/adt/varlena.c:5833 #, c-format msgid "too few arguments for format()" msgstr "muy pocos argumentos para format()" -#: utils/adt/varlena.c:5854 utils/adt/varlena.c:6036 +#: utils/adt/varlena.c:5929 utils/adt/varlena.c:6111 #, c-format msgid "number is out of range" msgstr "el número está fuera de rango" -#: utils/adt/varlena.c:5917 utils/adt/varlena.c:5945 +#: utils/adt/varlena.c:5992 utils/adt/varlena.c:6020 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "la conversión especifica el argumento 0, pero los argumentos se numeran desde 1" -#: utils/adt/varlena.c:5938 +#: utils/adt/varlena.c:6013 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "la posición del argumento de anchura debe terminar con «$»" -#: utils/adt/varlena.c:5983 +#: utils/adt/varlena.c:6058 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "los valores nulos no pueden ser formateados como un identificador SQL" -#: utils/adt/varlena.c:6191 +#: utils/adt/varlena.c:6266 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "la normalización Unicode sólo puede ser hecha si la codificación de servidor es UTF8" -#: utils/adt/varlena.c:6204 +#: utils/adt/varlena.c:6279 #, c-format msgid "invalid normalization form: %s" msgstr "forma de normalización no válida: %s" -#: utils/adt/varlena.c:6407 utils/adt/varlena.c:6442 utils/adt/varlena.c:6477 +#: utils/adt/varlena.c:6324 +#, c-format +msgid "Unicode categorization can only be performed if server encoding is UTF8" +msgstr "la categorización Unicode sólo puede ser hecha si la codificación de servidor es UTF8" + +#: utils/adt/varlena.c:6541 utils/adt/varlena.c:6576 utils/adt/varlena.c:6611 #, c-format msgid "invalid Unicode code point: %04X" msgstr "punto de código Unicode no válido: %04X" -#: utils/adt/varlena.c:6507 +#: utils/adt/varlena.c:6641 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "Los escapes Unicode deben ser \\XXXX, \\+XXXXXX, \\uXXXX o \\UXXXXXXXX." -#: utils/adt/windowfuncs.c:442 +#: utils/adt/windowfuncs.c:443 #, c-format msgid "argument of ntile must be greater than zero" msgstr "el argumento de ntile debe ser mayor que cero" -#: utils/adt/windowfuncs.c:706 +#: utils/adt/windowfuncs.c:707 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "el argumento de nth_value debe ser mayor que cero" -#: utils/adt/xid8funcs.c:125 +#: utils/adt/xid8funcs.c:120 #, c-format msgid "transaction ID %llu is in the future" -msgstr "" +msgstr "el ID de transacción %llu está en el futuro" -#: utils/adt/xid8funcs.c:547 +#: utils/adt/xid8funcs.c:522 #, c-format msgid "invalid external pg_snapshot data" msgstr "datos externos pg_snapshot no válidos" -#: utils/adt/xml.c:228 +#: utils/adt/xml.c:238 #, c-format msgid "unsupported XML feature" msgstr "característica XML no soportada" -#: utils/adt/xml.c:229 +#: utils/adt/xml.c:239 #, c-format msgid "This functionality requires the server to be built with libxml support." msgstr "Esta funcionalidad requiere que el servidor haya sido construido con soporte libxml." -#: utils/adt/xml.c:248 utils/mb/mbutils.c:628 +#: utils/adt/xml.c:258 utils/mb/mbutils.c:627 #, c-format msgid "invalid encoding name \"%s\"" msgstr "nombre de codificación «%s» no válido" -#: utils/adt/xml.c:496 utils/adt/xml.c:501 +#: utils/adt/xml.c:506 utils/adt/xml.c:511 #, c-format msgid "invalid XML comment" msgstr "comentario XML no válido" -#: utils/adt/xml.c:660 +#: utils/adt/xml.c:697 #, c-format msgid "not an XML document" msgstr "no es un documento XML" -#: utils/adt/xml.c:956 utils/adt/xml.c:979 +#: utils/adt/xml.c:1008 utils/adt/xml.c:1031 #, c-format msgid "invalid XML processing instruction" msgstr "instrucción de procesamiento XML no válida" -#: utils/adt/xml.c:957 +#: utils/adt/xml.c:1009 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "el nombre de destino de la instrucción de procesamiento XML no puede ser «%s»." -#: utils/adt/xml.c:980 +#: utils/adt/xml.c:1032 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "la instrucción de procesamiento XML no puede contener «?>»." -#: utils/adt/xml.c:1059 +#: utils/adt/xml.c:1111 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate no está implementado" -#: utils/adt/xml.c:1115 +#: utils/adt/xml.c:1167 #, c-format msgid "could not initialize XML library" msgstr "no se pudo inicializar la biblioteca XML" -#: utils/adt/xml.c:1116 +#: utils/adt/xml.c:1168 #, c-format msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." -msgstr "" +msgstr "libxml2 tiene un tipo char incompatible: sizeof(char)=%zu, sizeof(xmlChar)=%zu." -#: utils/adt/xml.c:1202 +#: utils/adt/xml.c:1254 #, c-format msgid "could not set up XML error handler" msgstr "no se pudo instalar un gestor de errores XML" -#: utils/adt/xml.c:1203 +#: utils/adt/xml.c:1255 #, c-format msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." msgstr "Esto probablemente indica que la versión de libxml2 en uso no es compatible con los archivos de cabecera libxml2 con los que PostgreSQL fue construido." -#: utils/adt/xml.c:2189 +#: utils/adt/xml.c:2281 msgid "Invalid character value." msgstr "Valor de carácter no válido." -#: utils/adt/xml.c:2192 +#: utils/adt/xml.c:2284 msgid "Space required." msgstr "Se requiere un espacio." -#: utils/adt/xml.c:2195 +#: utils/adt/xml.c:2287 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone acepta sólo 'yes' y 'no'." -#: utils/adt/xml.c:2198 +#: utils/adt/xml.c:2290 msgid "Malformed declaration: missing version." msgstr "Declaración mal formada: falta la versión." -#: utils/adt/xml.c:2201 +#: utils/adt/xml.c:2293 msgid "Missing encoding in text declaration." msgstr "Falta especificación de codificación en declaración de texto." -#: utils/adt/xml.c:2204 +#: utils/adt/xml.c:2296 msgid "Parsing XML declaration: '?>' expected." msgstr "Procesando declaración XML: se esperaba '?>'." -#: utils/adt/xml.c:2207 +#: utils/adt/xml.c:2299 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Código de error libxml no reconocido: %d." -#: utils/adt/xml.c:2461 +#: utils/adt/xml.c:2553 #, c-format msgid "XML does not support infinite date values." msgstr "XML no soporta valores infinitos de fecha." -#: utils/adt/xml.c:2483 utils/adt/xml.c:2510 +#: utils/adt/xml.c:2575 utils/adt/xml.c:2602 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML no soporta valores infinitos de timestamp." -#: utils/adt/xml.c:2926 +#: utils/adt/xml.c:3018 #, c-format msgid "invalid query" msgstr "consulta no válido" -#: utils/adt/xml.c:4266 +#: utils/adt/xml.c:3110 +#, c-format +msgid "portal \"%s\" does not return tuples" +msgstr "el portal «%s» no retorna tuplas" + +#: utils/adt/xml.c:4362 #, c-format msgid "invalid array for XML namespace mapping" msgstr "array no válido para mapeo de espacio de nombres XML" -#: utils/adt/xml.c:4267 +#: utils/adt/xml.c:4363 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "El array debe ser bidimensional y el largo del segundo eje igual a 2." -#: utils/adt/xml.c:4291 +#: utils/adt/xml.c:4387 #, c-format msgid "empty XPath expression" msgstr "expresion XPath vacía" -#: utils/adt/xml.c:4343 +#: utils/adt/xml.c:4439 #, c-format msgid "neither namespace name nor URI may be null" msgstr "ni el espacio de nombres ni la URI pueden ser vacíos" -#: utils/adt/xml.c:4350 +#: utils/adt/xml.c:4446 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "no se pudo registrar un espacio de nombres XML llamado «%s» con URI «%s»" -#: utils/adt/xml.c:4693 +#: utils/adt/xml.c:4795 #, c-format msgid "DEFAULT namespace is not supported" msgstr "el espacio de nombres DEFAULT no está soportado" -#: utils/adt/xml.c:4722 +#: utils/adt/xml.c:4824 #, c-format msgid "row path filter must not be empty string" msgstr "el «path» de filtro de registros no debe ser la cadena vacía" -#: utils/adt/xml.c:4753 +#: utils/adt/xml.c:4858 #, c-format msgid "column path filter must not be empty string" msgstr "el «path» de filtro de columna no debe ser la cadena vacía" -#: utils/adt/xml.c:4897 +#: utils/adt/xml.c:5005 #, c-format msgid "more than one value returned by column XPath expression" msgstr "la expresión XPath de columna retornó más de un valor" -#: utils/cache/lsyscache.c:1043 +#: utils/cache/lsyscache.c:1017 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "no existe la conversión del tipo %s al tipo %s" -#: utils/cache/lsyscache.c:2845 utils/cache/lsyscache.c:2878 -#: utils/cache/lsyscache.c:2911 utils/cache/lsyscache.c:2944 +#: utils/cache/lsyscache.c:2887 utils/cache/lsyscache.c:2920 +#: utils/cache/lsyscache.c:2953 utils/cache/lsyscache.c:2986 #, c-format msgid "type %s is only a shell" msgstr "el tipo %s está inconcluso" -#: utils/cache/lsyscache.c:2850 +#: utils/cache/lsyscache.c:2892 #, c-format msgid "no input function available for type %s" msgstr "no hay una función de entrada para el tipo %s" -#: utils/cache/lsyscache.c:2883 +#: utils/cache/lsyscache.c:2925 #, c-format msgid "no output function available for type %s" msgstr "no hay una función de salida para el tipo %s" -#: utils/cache/partcache.c:219 +#: utils/cache/partcache.c:216 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d for type %s" msgstr "falta la función de soporte %3$d para el tipo %4$s de la clase de operadores «%1$s» del método de acceso %2$s" -#: utils/cache/plancache.c:720 +#: utils/cache/plancache.c:747 #, c-format msgid "cached plan must not change result type" msgstr "el plan almacenado no debe cambiar el tipo de resultado" -#: utils/cache/relcache.c:3740 -#, fuzzy, c-format -#| msgid "relfilenode value not set when in binary upgrade mode" +#: utils/cache/relcache.c:3801 +#, c-format msgid "heap relfilenumber value not set when in binary upgrade mode" -msgstr "el valor de relfilende no se definió en modo de actualización binaria" +msgstr "el valor de relfilenumber de heap no se definió en modo de actualización binaria" -#: utils/cache/relcache.c:3748 -#, fuzzy, c-format -#| msgid "index relfilenode value not set when in binary upgrade mode" +#: utils/cache/relcache.c:3809 +#, c-format msgid "unexpected request for new relfilenumber in binary upgrade mode" -msgstr "el valor de relfilenode de índice no se definió en modo de actualización binaria" +msgstr "petición inesperada de un nuevo relfilenode en modo de actualización binaria" -#: utils/cache/relcache.c:6488 +#: utils/cache/relcache.c:6539 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "no se pudo crear el archivo de cache de catálogos de sistema «%s»: %m" -#: utils/cache/relcache.c:6490 +#: utils/cache/relcache.c:6541 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Prosiguiendo de todas maneras, pero hay algo mal." -#: utils/cache/relcache.c:6812 +#: utils/cache/relcache.c:6871 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "no se pudo eliminar el archivo de cache «%s»: %m" @@ -26524,17 +27290,17 @@ msgstr "no se pudo eliminar el archivo de cache «%s»: %m" msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "no se puede hacer PREPARE de una transacción que ha modificado el mapeo de relaciones" -#: utils/cache/relmapper.c:850 +#: utils/cache/relmapper.c:852 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "el archivo de mapeo de relaciones «%s» contiene datos no válidos" -#: utils/cache/relmapper.c:860 +#: utils/cache/relmapper.c:862 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "el archivo de mapeo de relaciones «%s» tiene una suma de verificación incorrecta" -#: utils/cache/typcache.c:1803 utils/fmgr/funcapi.c:566 +#: utils/cache/typcache.c:1812 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "el tipo record no ha sido registrado" @@ -26545,107 +27311,106 @@ msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" msgstr "TRAP: ExceptionalCondition: argumentos erróneos en PID %d\n" #: utils/error/assert.c:40 -#, fuzzy, c-format -#| msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" +#, c-format msgid "TRAP: failed Assert(\"%s\"), File: \"%s\", Line: %d, PID: %d\n" -msgstr "TRAP: %s(«%s», Archivo: «%s», Línea: %d, PID: %d)\n" +msgstr "TRAP: falló Assert(«%s»), Archivo «%s», Línea %d, PID %d\n" -#: utils/error/elog.c:416 +#: utils/error/elog.c:415 #, c-format msgid "error occurred before error message processing is available\n" msgstr "ocurrió un error antes de que el procesamiento de errores esté disponible\n" -#: utils/error/elog.c:2092 +#: utils/error/elog.c:2134 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "no se pudo reabrir «%s» para error estándar: %m" -#: utils/error/elog.c:2105 +#: utils/error/elog.c:2147 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "no se pudo reabrir «%s» para usar como salida estándar: %m" -#: utils/error/elog.c:2141 +#: utils/error/elog.c:2183 #, c-format -msgid "invalid character" -msgstr "carácter no válido" +msgid "Invalid character" +msgstr "Carácter no válido" -#: utils/error/elog.c:2847 utils/error/elog.c:2874 utils/error/elog.c:2890 +#: utils/error/elog.c:2889 utils/error/elog.c:2916 utils/error/elog.c:2932 msgid "[unknown]" msgstr "[desconocido]" -#: utils/error/elog.c:3163 utils/error/elog.c:3484 utils/error/elog.c:3591 +#: utils/error/elog.c:3202 utils/error/elog.c:3526 utils/error/elog.c:3633 msgid "missing error text" msgstr "falta un texto de mensaje de error" -#: utils/error/elog.c:3166 utils/error/elog.c:3169 +#: utils/error/elog.c:3205 utils/error/elog.c:3208 #, c-format msgid " at character %d" msgstr " en carácter %d" -#: utils/error/elog.c:3179 utils/error/elog.c:3186 +#: utils/error/elog.c:3218 utils/error/elog.c:3225 msgid "DETAIL: " msgstr "DETALLE: " -#: utils/error/elog.c:3193 +#: utils/error/elog.c:3232 msgid "HINT: " msgstr "HINT: " -#: utils/error/elog.c:3200 +#: utils/error/elog.c:3239 msgid "QUERY: " msgstr "CONSULTA: " -#: utils/error/elog.c:3207 +#: utils/error/elog.c:3246 msgid "CONTEXT: " msgstr "CONTEXTO: " -#: utils/error/elog.c:3217 +#: utils/error/elog.c:3256 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "UBICACIÓN: %s, %s:%d\n" -#: utils/error/elog.c:3224 +#: utils/error/elog.c:3263 #, c-format msgid "LOCATION: %s:%d\n" msgstr "UBICACIÓN: %s:%d\n" -#: utils/error/elog.c:3231 +#: utils/error/elog.c:3270 msgid "BACKTRACE: " msgstr "BACKTRACE: " -#: utils/error/elog.c:3243 +#: utils/error/elog.c:3282 msgid "STATEMENT: " msgstr "SENTENCIA: " -#: utils/error/elog.c:3636 +#: utils/error/elog.c:3678 msgid "DEBUG" msgstr "DEBUG" -#: utils/error/elog.c:3640 +#: utils/error/elog.c:3682 msgid "LOG" msgstr "LOG" -#: utils/error/elog.c:3643 +#: utils/error/elog.c:3685 msgid "INFO" msgstr "INFO" -#: utils/error/elog.c:3646 +#: utils/error/elog.c:3688 msgid "NOTICE" msgstr "NOTICE" -#: utils/error/elog.c:3650 +#: utils/error/elog.c:3692 msgid "WARNING" msgstr "WARNING" -#: utils/error/elog.c:3653 +#: utils/error/elog.c:3695 msgid "ERROR" msgstr "ERROR" -#: utils/error/elog.c:3656 +#: utils/error/elog.c:3698 msgid "FATAL" msgstr "FATAL" -#: utils/error/elog.c:3659 +#: utils/error/elog.c:3701 msgid "PANIC" msgstr "PANIC" @@ -26680,16 +27445,14 @@ msgid "Server is version %d, library is version %s." msgstr "Versión del servidor %d, versión de biblioteca %s." #: utils/fmgr/dfmgr.c:341 -#, fuzzy, c-format -#| msgid "incompatible library \"%s\": version mismatch" +#, c-format msgid "incompatible library \"%s\": ABI mismatch" -msgstr "biblioteca «%s» incompatible: versión no coincide" +msgstr "biblioteca «%s» incompatible: ABI no coincide" #: utils/fmgr/dfmgr.c:343 -#, fuzzy, c-format -#| msgid "Server has FLOAT8PASSBYVAL = %s, library has %s." +#, c-format msgid "Server has ABI \"%s\", library has \"%s\"." -msgstr "El servidor tiene FLOAT8PASSBYVAL = %s, la librería tiene %s" +msgstr "El servidor tiene ABI «%s», la librería tiene «%s»." #: utils/fmgr/dfmgr.c:361 #, c-format @@ -26720,22 +27483,22 @@ msgstr "El bloque mágico tiene un largo inesperado, o una diferencia de relleno msgid "incompatible library \"%s\": magic block mismatch" msgstr "biblioteca «%s» incompatible: bloque mágico no coincide" -#: utils/fmgr/dfmgr.c:492 +#: utils/fmgr/dfmgr.c:475 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "no está permitido el acceso a la biblioteca «%s»" -#: utils/fmgr/dfmgr.c:518 +#: utils/fmgr/dfmgr.c:501 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "el nombre de macro no es válido en la ruta a biblioteca dinámica: %s" -#: utils/fmgr/dfmgr.c:558 +#: utils/fmgr/dfmgr.c:541 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "se encontró componente de largo cero en el parámetro «dynamic_library_path»" -#: utils/fmgr/dfmgr.c:577 +#: utils/fmgr/dfmgr.c:560 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "un componente en el parámetro «dynamic_library_path» no es una ruta absoluta" @@ -26760,223 +27523,213 @@ msgstr "Funciones invocables desde SQL necesitan PG_FUNCTION_INFO_V1(función) q msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "la versión de API %d no reconocida fue reportada por la función «%s»" -#: utils/fmgr/fmgr.c:2081 +#: utils/fmgr/fmgr.c:2109 #, c-format msgid "operator class options info is absent in function call context" msgstr "la información de opciones de la clase de operadores está ausente en el contexto de llamada a función" -#: utils/fmgr/fmgr.c:2148 +#: utils/fmgr/fmgr.c:2176 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "función de validación de lenguaje %u invocada para el lenguaje %u en lugar de %u" -#: utils/fmgr/funcapi.c:489 +#: utils/fmgr/funcapi.c:496 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "no se pudo determinar el tipo verdadero de resultado para la función «%s» declarada retornando tipo %s" -#: utils/fmgr/funcapi.c:634 +#: utils/fmgr/funcapi.c:642 #, c-format msgid "argument declared %s does not contain a range type but type %s" msgstr "el argumento declarado %s no contiene un tipo de rango sino tipo %s" -#: utils/fmgr/funcapi.c:717 -#, c-format -msgid "could not find multirange type for data type %s" -msgstr "no se pudo encontrar un tipo de multirango para el tipo de dato %s" - -#: utils/fmgr/funcapi.c:1921 utils/fmgr/funcapi.c:1953 +#: utils/fmgr/funcapi.c:1929 utils/fmgr/funcapi.c:1961 #, c-format msgid "number of aliases does not match number of columns" msgstr "el número de aliases no coincide con el número de columnas" -#: utils/fmgr/funcapi.c:1947 +#: utils/fmgr/funcapi.c:1955 #, c-format msgid "no column alias was provided" msgstr "no se entregó alias de columna" -#: utils/fmgr/funcapi.c:1971 +#: utils/fmgr/funcapi.c:1979 #, c-format msgid "could not determine row description for function returning record" msgstr "no se pudo encontrar descripción de registro de función que retorna record" -#: utils/init/miscinit.c:347 +#: utils/init/miscinit.c:353 #, c-format msgid "data directory \"%s\" does not exist" msgstr "no existe el directorio de datos «%s»" -#: utils/init/miscinit.c:352 +#: utils/init/miscinit.c:358 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "no se pudo obtener los permisos del directorio «%s»: %m" -#: utils/init/miscinit.c:360 +#: utils/init/miscinit.c:366 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "el directorio de datos especificado «%s» no es un directorio" -#: utils/init/miscinit.c:376 +#: utils/init/miscinit.c:382 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "el directorio de datos «%s» tiene dueño equivocado" -#: utils/init/miscinit.c:378 +#: utils/init/miscinit.c:384 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "El servidor debe ser iniciado por el usuario dueño del directorio de datos." -#: utils/init/miscinit.c:396 +#: utils/init/miscinit.c:402 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "el directorio de datos «%s» tiene permisos no válidos" -#: utils/init/miscinit.c:398 +#: utils/init/miscinit.c:404 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Los permisos deberían ser u=rwx (0700) o u=rwx,g=rx (0750)." -#: utils/init/miscinit.c:456 +#: utils/init/miscinit.c:462 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "no se pudo cambiar al directorio «%s»: %m" -#: utils/init/miscinit.c:693 utils/misc/guc.c:3547 +#: utils/init/miscinit.c:720 utils/misc/guc.c:3650 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "no se puede definir el parámetro «%s» dentro de una operación restringida por seguridad" -#: utils/init/miscinit.c:765 +#: utils/init/miscinit.c:807 #, c-format msgid "role with OID %u does not exist" msgstr "no existe el rol con OID %u" -#: utils/init/miscinit.c:795 +#: utils/init/miscinit.c:853 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "al rol «%s» no se le permite conectarse" -#: utils/init/miscinit.c:813 +#: utils/init/miscinit.c:874 #, c-format msgid "too many connections for role \"%s\"" msgstr "demasiadas conexiones para el rol «%s»" -#: utils/init/miscinit.c:912 -#, c-format -msgid "permission denied to set session authorization" -msgstr "se ha denegado el permiso para cambiar el usuario actual" - -#: utils/init/miscinit.c:995 +#: utils/init/miscinit.c:1045 #, c-format msgid "invalid role OID: %u" msgstr "el OID de rol no es válido: %u" -#: utils/init/miscinit.c:1142 +#: utils/init/miscinit.c:1192 #, c-format msgid "database system is shut down" msgstr "el sistema de bases de datos está apagado" -#: utils/init/miscinit.c:1229 +#: utils/init/miscinit.c:1279 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "no se pudo crear el archivo de bloqueo «%s»: %m" -#: utils/init/miscinit.c:1243 +#: utils/init/miscinit.c:1293 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "no se pudo abrir el archivo de bloqueo «%s»: %m" -#: utils/init/miscinit.c:1250 +#: utils/init/miscinit.c:1300 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "no se pudo leer el archivo de bloqueo «%s»: %m" -#: utils/init/miscinit.c:1259 +#: utils/init/miscinit.c:1309 #, c-format msgid "lock file \"%s\" is empty" msgstr "el archivo de bloqueo «%s» está vacío" -#: utils/init/miscinit.c:1260 +#: utils/init/miscinit.c:1310 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." msgstr "Otro proceso servidor está iniciándose, o el archivo de bloqueo es remanente de una caída durante un inicio anterior." -#: utils/init/miscinit.c:1304 +#: utils/init/miscinit.c:1354 #, c-format msgid "lock file \"%s\" already exists" msgstr "el archivo de bloqueo «%s» ya existe" -#: utils/init/miscinit.c:1308 +#: utils/init/miscinit.c:1358 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "¿Hay otro postgres (PID %d) en ejecución en el directorio de datos «%s»?" -#: utils/init/miscinit.c:1310 +#: utils/init/miscinit.c:1360 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "¿Hay otro postmaster (PID %d) en ejecución en el directorio de datos «%s»?" -#: utils/init/miscinit.c:1313 +#: utils/init/miscinit.c:1363 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "¿Hay otro postgres (PID %d) usando el socket «%s»?" -#: utils/init/miscinit.c:1315 +#: utils/init/miscinit.c:1365 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "¿Hay otro postmaster (PID %d) usando el socket «%s»?" -#: utils/init/miscinit.c:1366 +#: utils/init/miscinit.c:1416 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "no se pudo eliminar el archivo de bloqueo antiguo «%s»: %m" -#: utils/init/miscinit.c:1368 +#: utils/init/miscinit.c:1418 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." msgstr "El archivo parece accidentalmente abandonado, pero no pudo ser eliminado. Por favor elimine el archivo manualmente e intente nuevamente." -#: utils/init/miscinit.c:1405 utils/init/miscinit.c:1419 -#: utils/init/miscinit.c:1430 +#: utils/init/miscinit.c:1455 utils/init/miscinit.c:1469 +#: utils/init/miscinit.c:1480 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "no se pudo escribir el archivo de bloqueo «%s»: %m" -#: utils/init/miscinit.c:1541 utils/init/miscinit.c:1683 utils/misc/guc.c:5579 +#: utils/init/miscinit.c:1591 utils/init/miscinit.c:1733 utils/misc/guc.c:5765 #, c-format msgid "could not read from file \"%s\": %m" msgstr "no se pudo leer el archivo «%s»: %m" -#: utils/init/miscinit.c:1671 +#: utils/init/miscinit.c:1721 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "no se pudo abrir el archivo «%s»: %m; continuando de todas formas" -#: utils/init/miscinit.c:1696 +#: utils/init/miscinit.c:1746 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "el archivo de bloqueo «%s» tiene un PID erróneo: %ld en lugar de %ld" -#: utils/init/miscinit.c:1735 utils/init/miscinit.c:1751 +#: utils/init/miscinit.c:1785 utils/init/miscinit.c:1801 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "«%s» no es un directorio de datos válido" -#: utils/init/miscinit.c:1737 +#: utils/init/miscinit.c:1787 #, c-format msgid "File \"%s\" is missing." msgstr "Falta el archivo «%s»." -#: utils/init/miscinit.c:1753 +#: utils/init/miscinit.c:1803 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "El archivo «%s» no contiene datos válidos." -#: utils/init/miscinit.c:1755 +#: utils/init/miscinit.c:1805 #, c-format msgid "You might need to initdb." msgstr "Puede ser necesario ejecutar initdb." -#: utils/init/miscinit.c:1763 +#: utils/init/miscinit.c:1813 #, c-format msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." msgstr "El directorio de datos fue inicializado por PostgreSQL versión %s, que no es compatible con esta versión %s." @@ -27007,10 +27760,9 @@ msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" msgstr " SSL habilitado (protocolo=%s, cifrado=%s, bits=%d)" #: utils/init/postinit.c:285 -#, fuzzy, c-format -#| msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" -msgid " GSS (authenticated=%s, encrypted=%s, deleg_credentials=%s, principal=%s)" -msgstr " GSS (autenticado=%s, cifrado=%s, principal=%s)" +#, c-format +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s, principal=%s)" +msgstr " GSS (autenticado=%s, cifrado=%s, delegado_credenciales=%s, principal=%s)" #: utils/init/postinit.c:286 utils/init/postinit.c:287 #: utils/init/postinit.c:288 utils/init/postinit.c:293 @@ -27025,10 +27777,9 @@ msgid "yes" msgstr "sí" #: utils/init/postinit.c:292 -#, fuzzy, c-format -#| msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" -msgid " GSS (authenticated=%s, encrypted=%s, deleg_credentials=%s)" -msgstr " GSS (autenticado=%s, cifrado=%s, principal=%s)" +#, c-format +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)" +msgstr " GSS (autenticado=%s, cifrado=%s, delegado_credentiales=%s)" #: utils/init/postinit.c:333 #, c-format @@ -27055,107 +27806,105 @@ msgstr "permiso denegado a la base de datos «%s»" msgid "User does not have CONNECT privilege." msgstr "Usuario no tiene privilegios de conexión." -#: utils/init/postinit.c:386 +#: utils/init/postinit.c:389 #, c-format msgid "too many connections for database \"%s\"" msgstr "demasiadas conexiones para la base de datos «%s»" -#: utils/init/postinit.c:410 utils/init/postinit.c:417 +#: utils/init/postinit.c:413 utils/init/postinit.c:420 #, c-format msgid "database locale is incompatible with operating system" msgstr "la configuración regional es incompatible con el sistema operativo" -#: utils/init/postinit.c:411 +#: utils/init/postinit.c:414 #, c-format msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." msgstr "La base de datos fue inicializada con LC_COLLATE «%s», el cual no es reconocido por setlocale()." -#: utils/init/postinit.c:413 utils/init/postinit.c:420 +#: utils/init/postinit.c:416 utils/init/postinit.c:423 #, c-format msgid "Recreate the database with another locale or install the missing locale." msgstr "Recree la base de datos con otra configuración regional, o instale la configuración regional faltante." -#: utils/init/postinit.c:418 +#: utils/init/postinit.c:421 #, c-format msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." -msgstr "La base de datos fueron inicializada con LC_CTYPE «%s», el cual no es reconocido por setlocale()." +msgstr "La base de datos fue inicializada con LC_CTYPE «%s», el cual no es reconocido por setlocale()." -#: utils/init/postinit.c:475 -#, fuzzy, c-format -#| msgid "collation \"%s\" has version mismatch" +#: utils/init/postinit.c:493 +#, c-format msgid "database \"%s\" has a collation version mismatch" -msgstr "el ordenamiento (collation) «%s» tiene una discordancia de versión" +msgstr "la base de datos «%s» tiene una discordancia de versión de ordenamiento (“collationâ€)" -#: utils/init/postinit.c:477 -#, fuzzy, c-format -#| msgid "The collation in the database was created using version %s, but the operating system provides version %s." +#: utils/init/postinit.c:495 +#, c-format msgid "The database was created using collation version %s, but the operating system provides version %s." -msgstr "El ordenamiento en la base de datos fue creado usando la versión %s, pero el sistema operativo provee la versión %s." +msgstr "La base de datos fue creada usando la versión de ordenamiento %s, pero el sistema operativo provee la versión %s." -#: utils/init/postinit.c:480 -#, fuzzy, c-format -#| msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." +#: utils/init/postinit.c:498 +#, c-format msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." -msgstr "Reconstruya todos los objetos afectados por este ordenamiento y ejecute ALTER COLLATION %s REFRESH VERSION, o construya PostgreSQL con la versión correcta de la biblioteca." +msgstr "Reconstruya todos los objetos en esta base de datos que usen el ordenamiento por omisión y ejecute ALTER DATABASE %s REFRESH COLLATION VERSION, o construya PostgreSQL con la versión correcta de la biblioteca." -#: utils/init/postinit.c:895 +#: utils/init/postinit.c:904 #, c-format msgid "no roles are defined in this database system" msgstr "no hay roles definidos en esta base de datos" -#: utils/init/postinit.c:896 +#: utils/init/postinit.c:905 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Debería ejecutar imediatamente CREATE USER \"%s\" SUPERUSER;." -#: utils/init/postinit.c:932 +#: utils/init/postinit.c:942 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "debe ser superusuario para conectarse en modo de actualización binaria" -#: utils/init/postinit.c:953 -#, fuzzy, c-format -#| msgid "remaining connection slots are reserved for non-replication superuser connections" -msgid "remaining connection slots are reserved for roles with %s" -msgstr "las conexiones restantes están reservadas a superusuarios y no de replicación" +#: utils/init/postinit.c:962 +#, c-format +msgid "remaining connection slots are reserved for roles with the %s attribute" +msgstr "las conexiones restantes están reservadas a roles con el atributo %s" -#: utils/init/postinit.c:959 -#, fuzzy, c-format -#| msgid "remaining connection slots are reserved for non-replication superuser connections" +#: utils/init/postinit.c:968 +#, c-format msgid "remaining connection slots are reserved for roles with privileges of the \"%s\" role" -msgstr "las conexiones restantes están reservadas a superusuarios y no de replicación" +msgstr "las conexiones restantes están reservadas a roles con privilegios del rol «%s»" -#: utils/init/postinit.c:971 -#, fuzzy, c-format -#| msgid "permission denied to rename role" +#: utils/init/postinit.c:980 +#, c-format msgid "permission denied to start WAL sender" -msgstr "se ha denegado el permiso para cambiar el nombre al rol" +msgstr "se ha denegado el permiso para iniciar “WAL senderâ€" -#: utils/init/postinit.c:972 +#: utils/init/postinit.c:981 #, c-format msgid "Only roles with the %s attribute may start a WAL sender process." -msgstr "" +msgstr "Sólo roles con el atributo %s pueden iniciar un proceso “WAL senderâ€." -#: utils/init/postinit.c:1042 +#: utils/init/postinit.c:1099 +#, c-format +msgid "It seems to have just been dropped or renamed." +msgstr "Parece haber sido eliminada o renombrada." + +#: utils/init/postinit.c:1103 #, c-format msgid "database %u does not exist" msgstr "no existe la base de datos %u" -#: utils/init/postinit.c:1131 +#: utils/init/postinit.c:1112 #, c-format -msgid "It seems to have just been dropped or renamed." -msgstr "Parece haber sido eliminada o renombrada." +msgid "cannot connect to invalid database \"%s\"" +msgstr "no se puede conectar a la base de datos no válida «%s»" -#: utils/init/postinit.c:1149 +#: utils/init/postinit.c:1173 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Falta el subdirectorio de base de datos «%s»." #: utils/init/usercontext.c:43 -#, fuzzy, c-format -#| msgid "\"%s\" cannot be higher than \"%s\"" +#, c-format msgid "role \"%s\" cannot SET ROLE to \"%s\"" -msgstr "«%s» no puede ser más alto que «%s»" +msgstr "el rol «%s» no puede hacer SET ROLE a «%s»" #: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format @@ -27174,53 +27923,48 @@ msgstr "ID de codificación %d inesperado para juegos de caracteres ISO 8859" msgid "unexpected encoding ID %d for WIN character sets" msgstr "ID de codificación %d inesperado para juegos de caracteres WIN" -#: utils/mb/mbutils.c:298 utils/mb/mbutils.c:901 +#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:900 #, c-format msgid "conversion between %s and %s is not supported" msgstr "la conversión entre %s y %s no está soportada" -#: utils/mb/mbutils.c:386 -#, c-format -msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" -msgstr "no existe el procedimiento por omisión de conversión desde la codificación «%s» a «%s»" - -#: utils/mb/mbutils.c:403 utils/mb/mbutils.c:431 utils/mb/mbutils.c:816 -#: utils/mb/mbutils.c:843 +#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 +#: utils/mb/mbutils.c:842 #, c-format msgid "String of %d bytes is too long for encoding conversion." msgstr "La cadena de %d bytes es demasiado larga para la recodificación." -#: utils/mb/mbutils.c:569 +#: utils/mb/mbutils.c:568 #, c-format msgid "invalid source encoding name \"%s\"" msgstr "la codificación de origen «%s» no es válida" -#: utils/mb/mbutils.c:574 +#: utils/mb/mbutils.c:573 #, c-format msgid "invalid destination encoding name \"%s\"" msgstr "la codificación de destino «%s» no es válida" -#: utils/mb/mbutils.c:714 +#: utils/mb/mbutils.c:713 #, c-format msgid "invalid byte value for encoding \"%s\": 0x%02x" msgstr "byte no válido para codificación «%s»: 0x%02x" -#: utils/mb/mbutils.c:878 +#: utils/mb/mbutils.c:877 #, c-format msgid "invalid Unicode code point" msgstr "punto de código Unicode no válido" -#: utils/mb/mbutils.c:1204 +#: utils/mb/mbutils.c:1201 #, c-format msgid "bind_textdomain_codeset failed" msgstr "bind_textdomain_codeset falló" -#: utils/mb/mbutils.c:1725 +#: utils/mb/mbutils.c:1718 #, c-format msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "secuencia de bytes no válida para codificación «%s»: %s" -#: utils/mb/mbutils.c:1758 +#: utils/mb/mbutils.c:1751 #, c-format msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "carácter con secuencia de bytes %s en codificación «%s» no tiene equivalente en la codificación «%s»" @@ -27235,83 +27979,82 @@ msgstr "nombre de directorio de configuración vacío: «%s»" msgid "could not open configuration directory \"%s\": %m" msgstr "no se pudo abrir el directorio de configuración «%s»: %m" -#: utils/misc/guc.c:115 +#: utils/misc/guc.c:122 msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "Unidades válidas para este parámetro son «B», «kB», «MB», «GB» y «TB»." -#: utils/misc/guc.c:152 +#: utils/misc/guc.c:159 msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." msgstr "Unidades válidas son para este parámetro son «us», «ms», «s», «min», «h» y «d»." -#: utils/misc/guc.c:420 +#: utils/misc/guc.c:430 #, c-format msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" msgstr "parámetro de configuración «%s» no reconocido en el archivo «%s» línea %d" -#: utils/misc/guc.c:460 utils/misc/guc.c:3405 utils/misc/guc.c:3645 -#: utils/misc/guc.c:3743 utils/misc/guc.c:3841 utils/misc/guc.c:3965 -#: utils/misc/guc.c:4068 +#: utils/misc/guc.c:470 utils/misc/guc.c:3504 utils/misc/guc.c:3748 +#: utils/misc/guc.c:3846 utils/misc/guc.c:3944 utils/misc/guc.c:4071 +#: utils/misc/guc.c:4212 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "el parámetro «%s» no se puede cambiar sin reiniciar el servidor" -#: utils/misc/guc.c:496 +#: utils/misc/guc.c:506 #, c-format msgid "parameter \"%s\" removed from configuration file, reset to default" msgstr "parámetro «%s» eliminado del archivo de configuración, volviendo al valor por omisión" -#: utils/misc/guc.c:561 +#: utils/misc/guc.c:571 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "el parámetro «%s» fue cambiado a «%s»" -#: utils/misc/guc.c:603 +#: utils/misc/guc.c:613 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "el archivo de configuración «%s» contiene errores" -#: utils/misc/guc.c:608 +#: utils/misc/guc.c:618 #, c-format msgid "configuration file \"%s\" contains errors; unaffected changes were applied" msgstr "el archivo de configuración «%s» contiene errores; los cambios no afectados fueron aplicados" -#: utils/misc/guc.c:613 +#: utils/misc/guc.c:623 #, c-format msgid "configuration file \"%s\" contains errors; no changes were applied" msgstr "el archivo de configuración «%s» contiene errores; no se aplicó ningún cambio" -#: utils/misc/guc.c:1210 utils/misc/guc.c:1226 +#: utils/misc/guc.c:1139 utils/misc/guc.c:1155 #, c-format msgid "invalid configuration parameter name \"%s\"" msgstr "nombre de parámetro de configuración «%s» no válido" -#: utils/misc/guc.c:1212 +#: utils/misc/guc.c:1141 #, c-format msgid "Custom parameter names must be two or more simple identifiers separated by dots." msgstr "Los nombres de los parámetros personalizados deben ser dos o más identificadores sencillos separados por puntos." -#: utils/misc/guc.c:1228 -#, fuzzy, c-format -#| msgid "\"%s\" is a procedure." +#: utils/misc/guc.c:1157 +#, c-format msgid "\"%s\" is a reserved prefix." -msgstr "«%s» es un índice parcial." +msgstr "«%s» es un prefijo reservado." -#: utils/misc/guc.c:1242 +#: utils/misc/guc.c:1170 utils/misc/guc.c:1280 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "parámetro de configuración «%s» no reconocido" -#: utils/misc/guc.c:1764 +#: utils/misc/guc.c:1802 #, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: no se pudo acceder al directorio «%s»: %s\n" +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: no se pudo acceder al directorio «%s»: %m\n" -#: utils/misc/guc.c:1769 +#: utils/misc/guc.c:1806 #, c-format msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" msgstr "Ejecute initdb o pg_basebackup para inicializar un directorio de datos de PostgreSQL.\n" -#: utils/misc/guc.c:1793 +#: utils/misc/guc.c:1830 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -27320,12 +28063,12 @@ msgstr "" "%s no sabe dónde encontrar el archivo de configuración del servidor.\n" "Debe especificar la opción --config-file o -D o definir la variable de ambiente PGDATA.\n" -#: utils/misc/guc.c:1816 +#: utils/misc/guc.c:1853 #, c-format -msgid "%s: could not access the server configuration file \"%s\": %s\n" -msgstr "%s: no se pudo acceder al archivo de configuración «%s»: %s\n" +msgid "%s: could not access the server configuration file \"%s\": %m\n" +msgstr "%s: no se pudo acceder al archivo de configuración «%s»: %m\n" -#: utils/misc/guc.c:1844 +#: utils/misc/guc.c:1881 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -27334,7 +28077,7 @@ msgstr "" "%s no sabe dónde encontrar los archivos de sistema de la base de datos.\n" "Esto puede especificarse como «data_directory» en «%s», o usando la opción -D, o a través de la variable de ambiente PGDATA.\n" -#: utils/misc/guc.c:1896 +#: utils/misc/guc.c:1933 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -27343,7 +28086,7 @@ msgstr "" "%s no sabe dónde encontrar el archivo de configuración «hba».\n" "Esto puede especificarse como «hba_file» en «%s», o usando la opción -D, o a través de la variable de ambiente PGDATA.\n" -#: utils/misc/guc.c:1927 +#: utils/misc/guc.c:1964 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -27352,177 +28095,179 @@ msgstr "" "%s no sabe dónde encontrar el archivo de configuración «ident».\n" "Esto puede especificarse como «ident_file» en «%s», o usando la opción -D, o a través de la variable de ambiente PGDATA.\n" -#: utils/misc/guc.c:2893 +#: utils/misc/guc.c:2943 msgid "Value exceeds integer range." msgstr "El valor excede el rango para enteros." -#: utils/misc/guc.c:3129 +#: utils/misc/guc.c:3185 #, c-format -msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d%s%s está fuera del rango aceptable para el parámetro «%s» (%d .. %d)" +msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d%s%s .. %d%s%s)" +msgstr "%d%s%s está fuera del rango aceptable para el parámetro «%s» (%d%s%s .. %d%s%s)" -#: utils/misc/guc.c:3165 +#: utils/misc/guc.c:3226 #, c-format -msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" -msgstr "%g%s%s está fuera del rango aceptable para el parámetro «%s» (%g .. %g)" +msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g%s%s .. %g%s%s)" +msgstr "%g%s%s está fuera del rango aceptable para el parámetro «%s» (%g%s%s .. %g%s%s)" -#: utils/misc/guc.c:3365 utils/misc/guc_funcs.c:54 +#: utils/misc/guc.c:3465 #, c-format -msgid "cannot set parameters during a parallel operation" -msgstr "no se puede definir parámetros durante una operación paralela" +msgid "parameter \"%s\" cannot be set during a parallel operation" +msgstr "no se puede establecer el parámetro «%s» durante una operación paralela" -#: utils/misc/guc.c:3382 utils/misc/guc.c:4529 +#: utils/misc/guc.c:3481 utils/misc/guc.c:4696 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "no se puede cambiar el parámetro «%s»" -#: utils/misc/guc.c:3415 +#: utils/misc/guc.c:3514 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "el parámetro «%s» no se puede cambiar en este momento" -#: utils/misc/guc.c:3442 utils/misc/guc.c:3500 utils/misc/guc.c:4505 -#: utils/misc/guc.c:6670 +#: utils/misc/guc.c:3541 utils/misc/guc.c:3603 utils/misc/guc.c:4671 +#: utils/misc/guc.c:6756 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "se ha denegado el permiso para cambiar la opción «%s»" -#: utils/misc/guc.c:3480 +#: utils/misc/guc.c:3583 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "el parámetro «%s» no se puede cambiar después de efectuar la conexión" -#: utils/misc/guc.c:3539 +#: utils/misc/guc.c:3642 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "no se puede definir el parámetro «%s» dentro una función security-definer" -#: utils/misc/guc.c:3560 -#, fuzzy, c-format -#| msgid "parameter \"%s\" could not be set" +#: utils/misc/guc.c:3663 +#, c-format msgid "parameter \"%s\" cannot be reset" -msgstr "no se pudo cambiar el parámetro «%s»" +msgstr "el parámetro «%s» no puede ser reseteado" -#: utils/misc/guc.c:3567 -#, fuzzy, c-format -#| msgid "parameter \"%s\" cannot be set after connection start" +#: utils/misc/guc.c:3670 +#, c-format msgid "parameter \"%s\" cannot be set locally in functions" -msgstr "el parámetro «%s» no se puede cambiar después de efectuar la conexión" +msgstr "el parámetro «%s» no se puede cambiar localmente en funciones" -#: utils/misc/guc.c:4211 utils/misc/guc.c:4258 utils/misc/guc.c:5265 -#, fuzzy, c-format -#| msgid "permission denied to create \"%s.%s\"" +#: utils/misc/guc.c:4370 utils/misc/guc.c:4418 utils/misc/guc.c:5450 +#, c-format msgid "permission denied to examine \"%s\"" -msgstr "se ha denegado el permiso para crear «%s.%s»" +msgstr "se ha denegado el permiso a examinar «%s»" -#: utils/misc/guc.c:4212 utils/misc/guc.c:4259 utils/misc/guc.c:5266 +#: utils/misc/guc.c:4371 utils/misc/guc.c:4419 utils/misc/guc.c:5451 #, c-format msgid "Only roles with privileges of the \"%s\" role may examine this parameter." -msgstr "" +msgstr "Sólo roles con privilegios del rol «%s» pueden examinar este parámetro." + +#: utils/misc/guc.c:4629 +#, c-format +msgid "ALTER SYSTEM is not allowed in this environment" +msgstr "ALTER SYSTEM no está permitido en este ambiente" -#: utils/misc/guc.c:4495 -#, fuzzy, c-format -#| msgid "permission denied for operator %s" +#: utils/misc/guc.c:4661 +#, c-format msgid "permission denied to perform ALTER SYSTEM RESET ALL" -msgstr "permiso denegado al operador %s" +msgstr "permiso denegado a ejecutar ALTER SYSTEM RESET ALL" -#: utils/misc/guc.c:4561 +#: utils/misc/guc.c:4740 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "los valores de parámetros para ALTER SYSTEM no deben contener saltos de línea" -#: utils/misc/guc.c:4607 +#: utils/misc/guc.c:4785 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "no se pudo interpretar el contenido del archivo «%s»" -#: utils/misc/guc.c:4789 +#: utils/misc/guc.c:4967 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "intento de cambiar la opción «%s»" -#: utils/misc/guc.c:5128 -#, fuzzy, c-format -#| msgid "invalid configuration parameter name \"%s\"" +#: utils/misc/guc.c:5306 +#, c-format msgid "invalid configuration parameter name \"%s\", removing it" -msgstr "nombre de parámetro de configuración «%s» no válido" +msgstr "nombre de parámetro de configuración «%s» no válido, eliminándolo" -#: utils/misc/guc.c:5130 -#, fuzzy, c-format -#| msgid "\"%s\" is not a sequence" +#: utils/misc/guc.c:5308 +#, c-format msgid "\"%s\" is now a reserved prefix." -msgstr "«%s» no es una secuencia" +msgstr "«%s» es ahora un prefijo reservado." -#: utils/misc/guc.c:5999 +#: utils/misc/guc.c:6179 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "al establecer el parámetro «%s» a «%s»" -#: utils/misc/guc.c:6168 +#: utils/misc/guc.c:6348 #, c-format msgid "parameter \"%s\" could not be set" msgstr "no se pudo cambiar el parámetro «%s»" -#: utils/misc/guc.c:6258 +#: utils/misc/guc.c:6438 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "no se pudo interpretar el valor de para el parámetro «%s»" -#: utils/misc/guc.c:6802 +#: utils/misc/guc.c:6888 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "valor no válido para el parámetro «%s»: %g" +#: utils/misc/guc_funcs.c:54 +#, c-format +msgid "cannot set parameters during a parallel operation" +msgstr "no se puede definir parámetros durante una operación paralela" + #: utils/misc/guc_funcs.c:130 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" msgstr "SET LOCAL TRANSACTION SNAPSHOT no está implementado" -#: utils/misc/guc_funcs.c:228 +#: utils/misc/guc_funcs.c:218 #, c-format msgid "SET %s takes only one argument" msgstr "SET %s lleva sólo un argumento" -#: utils/misc/guc_funcs.c:352 +#: utils/misc/guc_funcs.c:342 #, c-format msgid "SET requires parameter name" msgstr "SET requiere el nombre de un parámetro" -#: utils/misc/guc_tables.c:667 +#: utils/misc/guc_tables.c:676 msgid "Ungrouped" msgstr "Sin Grupo" -#: utils/misc/guc_tables.c:669 +#: utils/misc/guc_tables.c:677 msgid "File Locations" msgstr "Ubicaciones de Archivos" -#: utils/misc/guc_tables.c:671 +#: utils/misc/guc_tables.c:678 msgid "Connections and Authentication / Connection Settings" msgstr "Conexiones y Autentificación / Parámetros de Conexión" -#: utils/misc/guc_tables.c:673 -#, fuzzy -#| msgid "Connections and Authentication / Connection Settings" +#: utils/misc/guc_tables.c:679 msgid "Connections and Authentication / TCP Settings" -msgstr "Conexiones y Autentificación / Parámetros de Conexión" +msgstr "Conexiones y Autentificación / Parámetros TCP" -#: utils/misc/guc_tables.c:675 +#: utils/misc/guc_tables.c:680 msgid "Connections and Authentication / Authentication" msgstr "Conexiones y Autentificación / Autentificación" -#: utils/misc/guc_tables.c:677 +#: utils/misc/guc_tables.c:681 msgid "Connections and Authentication / SSL" msgstr "Conexiones y Autentificación / SSL" -#: utils/misc/guc_tables.c:679 +#: utils/misc/guc_tables.c:682 msgid "Resource Usage / Memory" msgstr "Uso de Recursos / Memoria" -#: utils/misc/guc_tables.c:681 +#: utils/misc/guc_tables.c:683 msgid "Resource Usage / Disk" msgstr "Uso de Recursos / Disco" -#: utils/misc/guc_tables.c:683 +#: utils/misc/guc_tables.c:684 msgid "Resource Usage / Kernel Resources" msgstr "Uso de Recursos / Recursos del Kernel" @@ -27530,1989 +28275,2032 @@ msgstr "Uso de Recursos / Recursos del Kernel" msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Uso de Recursos / Retardo de Vacuum por Costos" -#: utils/misc/guc_tables.c:687 +#: utils/misc/guc_tables.c:686 msgid "Resource Usage / Background Writer" msgstr "Uso de Recursos / Escritor en Segundo Plano" -#: utils/misc/guc_tables.c:689 +#: utils/misc/guc_tables.c:687 msgid "Resource Usage / Asynchronous Behavior" msgstr "Uso de Recursos / Comportamiento Asíncrono" -#: utils/misc/guc_tables.c:691 +#: utils/misc/guc_tables.c:688 msgid "Write-Ahead Log / Settings" msgstr "Write-Ahead Log / Configuraciones" -#: utils/misc/guc_tables.c:693 +#: utils/misc/guc_tables.c:689 msgid "Write-Ahead Log / Checkpoints" msgstr "Write-Ahead Log / Puntos de Control (Checkpoints)" -#: utils/misc/guc_tables.c:695 +#: utils/misc/guc_tables.c:690 msgid "Write-Ahead Log / Archiving" msgstr "Write-Ahead Log / Archivado" -#: utils/misc/guc_tables.c:697 -#, fuzzy -#| msgid "Write-Ahead Log / Recovery Target" +#: utils/misc/guc_tables.c:691 msgid "Write-Ahead Log / Recovery" -msgstr "Write-Ahead Log / Destino de Recuperación" +msgstr "Write-Ahead Log / Recuperación" -#: utils/misc/guc_tables.c:699 +#: utils/misc/guc_tables.c:692 msgid "Write-Ahead Log / Archive Recovery" msgstr "Write-Ahead Log / Recuperación desde Archivo" -#: utils/misc/guc_tables.c:701 +#: utils/misc/guc_tables.c:693 msgid "Write-Ahead Log / Recovery Target" msgstr "Write-Ahead Log / Destino de Recuperación" -#: utils/misc/guc_tables.c:703 +#: utils/misc/guc_tables.c:694 +msgid "Write-Ahead Log / Summarization" +msgstr "Write-Ahead Log / Sumarización" + +#: utils/misc/guc_tables.c:695 msgid "Replication / Sending Servers" msgstr "Replicación / Servidores de Envío" -#: utils/misc/guc_tables.c:705 +#: utils/misc/guc_tables.c:696 msgid "Replication / Primary Server" msgstr "Replicación / Servidor Primario" -#: utils/misc/guc_tables.c:707 +#: utils/misc/guc_tables.c:697 msgid "Replication / Standby Servers" msgstr "Replicación / Servidores Standby" -#: utils/misc/guc_tables.c:709 +#: utils/misc/guc_tables.c:698 msgid "Replication / Subscribers" msgstr "Replicación / Suscriptores" -#: utils/misc/guc_tables.c:711 +#: utils/misc/guc_tables.c:699 msgid "Query Tuning / Planner Method Configuration" msgstr "Afinamiento de Consultas / Configuración de Métodos del Planner" -#: utils/misc/guc_tables.c:713 +#: utils/misc/guc_tables.c:700 msgid "Query Tuning / Planner Cost Constants" msgstr "Afinamiento de Consultas / Constantes de Costo del Planner" -#: utils/misc/guc_tables.c:715 +#: utils/misc/guc_tables.c:701 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Afinamiento de Consultas / Optimizador Genético de Consultas" -#: utils/misc/guc_tables.c:717 +#: utils/misc/guc_tables.c:702 msgid "Query Tuning / Other Planner Options" msgstr "Afinamiento de Consultas / Otras Opciones del Planner" -#: utils/misc/guc_tables.c:719 +#: utils/misc/guc_tables.c:703 msgid "Reporting and Logging / Where to Log" msgstr "Reporte y Registro / Dónde Registrar" -#: utils/misc/guc_tables.c:721 +#: utils/misc/guc_tables.c:704 msgid "Reporting and Logging / When to Log" msgstr "Reporte y Registro / Cuándo Registrar" -#: utils/misc/guc_tables.c:723 +#: utils/misc/guc_tables.c:705 msgid "Reporting and Logging / What to Log" msgstr "Reporte y Registro / Qué Registrar" -#: utils/misc/guc_tables.c:725 +#: utils/misc/guc_tables.c:706 msgid "Reporting and Logging / Process Title" msgstr "Reporte y Registro / Título del Proceso" -#: utils/misc/guc_tables.c:727 +#: utils/misc/guc_tables.c:707 msgid "Statistics / Monitoring" msgstr "Estadísticas / Monitoreo" -#: utils/misc/guc_tables.c:729 +#: utils/misc/guc_tables.c:708 msgid "Statistics / Cumulative Query and Index Statistics" -msgstr "" +msgstr "Estadísticas / Acumuladores de Consultas e Ãndices" -#: utils/misc/guc_tables.c:731 +#: utils/misc/guc_tables.c:709 msgid "Autovacuum" msgstr "Autovacuum" -#: utils/misc/guc_tables.c:733 +#: utils/misc/guc_tables.c:710 msgid "Client Connection Defaults / Statement Behavior" msgstr "Valores por Omisión de Conexiones / Comportamiento de Sentencias" -#: utils/misc/guc_tables.c:735 +#: utils/misc/guc_tables.c:711 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Valores por Omisión de Conexiones / Configuraciones Regionales y Formateo" -#: utils/misc/guc_tables.c:737 +#: utils/misc/guc_tables.c:712 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Valores por Omisión de Conexiones / Precargado de Bibliotecas Compartidas" -#: utils/misc/guc_tables.c:739 +#: utils/misc/guc_tables.c:713 msgid "Client Connection Defaults / Other Defaults" msgstr "Valores por Omisión de Conexiones / Otros Valores" -#: utils/misc/guc_tables.c:741 +#: utils/misc/guc_tables.c:714 msgid "Lock Management" msgstr "Manejo de Bloqueos" -#: utils/misc/guc_tables.c:743 +#: utils/misc/guc_tables.c:715 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Compatibilidad de Versión y Plataforma / Versiones Anteriores de PostgreSQL" -#: utils/misc/guc_tables.c:745 +#: utils/misc/guc_tables.c:716 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Compatibilidad de Versión y Plataforma / Otras Plataformas y Clientes" -#: utils/misc/guc_tables.c:747 +#: utils/misc/guc_tables.c:717 msgid "Error Handling" msgstr "Gestión de Errores" -#: utils/misc/guc_tables.c:749 +#: utils/misc/guc_tables.c:718 msgid "Preset Options" msgstr "Opciones Predefinidas" -#: utils/misc/guc_tables.c:751 +#: utils/misc/guc_tables.c:719 msgid "Customized Options" msgstr "Opciones Personalizadas" -#: utils/misc/guc_tables.c:753 +#: utils/misc/guc_tables.c:720 msgid "Developer Options" msgstr "Opciones de Desarrollador" -#: utils/misc/guc_tables.c:810 +#: utils/misc/guc_tables.c:775 msgid "Enables the planner's use of sequential-scan plans." msgstr "Permitir el uso de planes de recorrido secuencial." -#: utils/misc/guc_tables.c:820 +#: utils/misc/guc_tables.c:785 msgid "Enables the planner's use of index-scan plans." msgstr "Permitir el uso de planes de recorrido de índice." -#: utils/misc/guc_tables.c:830 +#: utils/misc/guc_tables.c:795 msgid "Enables the planner's use of index-only-scan plans." msgstr "Permitir el uso de planes de recorrido de sólo-índice." -#: utils/misc/guc_tables.c:840 +#: utils/misc/guc_tables.c:805 msgid "Enables the planner's use of bitmap-scan plans." msgstr "Permitir el uso de planes de recorrido de índice por mapas de bits." -#: utils/misc/guc_tables.c:850 +#: utils/misc/guc_tables.c:815 msgid "Enables the planner's use of TID scan plans." msgstr "Permitir el uso de planes de recorrido por TID." -#: utils/misc/guc_tables.c:860 +#: utils/misc/guc_tables.c:825 msgid "Enables the planner's use of explicit sort steps." msgstr "Permitir el uso de pasos explícitos de ordenamiento." -#: utils/misc/guc_tables.c:870 +#: utils/misc/guc_tables.c:835 msgid "Enables the planner's use of incremental sort steps." msgstr "Permitir el uso de pasos incrementales de ordenamiento." -#: utils/misc/guc_tables.c:880 +#: utils/misc/guc_tables.c:845 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Permitir el uso de planes de agregación a través de hash." -#: utils/misc/guc_tables.c:890 +#: utils/misc/guc_tables.c:855 msgid "Enables the planner's use of materialization." msgstr "Permitir el uso de materialización de planes." -#: utils/misc/guc_tables.c:900 +#: utils/misc/guc_tables.c:865 msgid "Enables the planner's use of memoization." msgstr "Permitir el uso de memoización de planes." -#: utils/misc/guc_tables.c:910 +#: utils/misc/guc_tables.c:875 msgid "Enables the planner's use of nested-loop join plans." msgstr "Permitir el uso de planes «nested-loop join»." -#: utils/misc/guc_tables.c:920 +#: utils/misc/guc_tables.c:885 msgid "Enables the planner's use of merge join plans." msgstr "Permitir el uso de planes «merge join»." -#: utils/misc/guc_tables.c:930 +#: utils/misc/guc_tables.c:895 msgid "Enables the planner's use of hash join plans." msgstr "Permitir el uso de planes «hash join»." -#: utils/misc/guc_tables.c:940 +#: utils/misc/guc_tables.c:905 msgid "Enables the planner's use of gather merge plans." msgstr "Permitir el uso de planes «gather merge»." -#: utils/misc/guc_tables.c:950 +#: utils/misc/guc_tables.c:915 msgid "Enables partitionwise join." msgstr "Permitir el uso de joins por particiones." -#: utils/misc/guc_tables.c:960 +#: utils/misc/guc_tables.c:925 msgid "Enables partitionwise aggregation and grouping." msgstr "Permitir el uso de agregación y agrupamiento por particiones." -#: utils/misc/guc_tables.c:970 +#: utils/misc/guc_tables.c:935 msgid "Enables the planner's use of parallel append plans." msgstr "Permitir el uso de planes «append» paralelos." -#: utils/misc/guc_tables.c:980 +#: utils/misc/guc_tables.c:945 msgid "Enables the planner's use of parallel hash plans." msgstr "Permitir el uso de planes «hash join» paralelos." -#: utils/misc/guc_tables.c:990 +#: utils/misc/guc_tables.c:955 msgid "Enables plan-time and execution-time partition pruning." msgstr "Permitir el uso de poda de particiones en tiempo de plan y ejecución." -#: utils/misc/guc_tables.c:991 +#: utils/misc/guc_tables.c:956 msgid "Allows the query planner and executor to compare partition bounds to conditions in the query to determine which partitions must be scanned." msgstr "Permite al optimizador de consultas y al ejecutor a comparar bordes de particiones a condiciones en las consultas para determinar qué particiones deben recorrerse." -#: utils/misc/guc_tables.c:1002 -msgid "Enables the planner's ability to produce plans which provide presorted input for ORDER BY / DISTINCT aggregate functions." -msgstr "" +#: utils/misc/guc_tables.c:967 +msgid "Enables the planner's ability to produce plans that provide presorted input for ORDER BY / DISTINCT aggregate functions." +msgstr "Activa la capacidad del optimizador de permitir planes que proveen entrada pre-ordenada para funciones de agregación ORDER BY / DISTINCT" -#: utils/misc/guc_tables.c:1005 -msgid "Allows the query planner to build plans which provide presorted input for aggregate functions with an ORDER BY / DISTINCT clause. When disabled, implicit sorts are always performed during execution." -msgstr "" +#: utils/misc/guc_tables.c:970 +msgid "Allows the query planner to build plans that provide presorted input for aggregate functions with an ORDER BY / DISTINCT clause. When disabled, implicit sorts are always performed during execution." +msgstr "Permite al optimizador construir planes que proveen entrada pre-ordenada para funciones de agregación con una cláusula ORDER BY / DISTINCT. Cuando está desactivado, siempre se efectúan ordenamientos implícitos durante la ejecución." -#: utils/misc/guc_tables.c:1017 +#: utils/misc/guc_tables.c:982 msgid "Enables the planner's use of async append plans." msgstr "Permitir el uso de planes «append» asíncronos." -#: utils/misc/guc_tables.c:1027 +#: utils/misc/guc_tables.c:992 +msgid "Enables reordering of GROUP BY keys." +msgstr "Activa el reordenamiento de claves GROUP BY." + +#: utils/misc/guc_tables.c:1002 msgid "Enables genetic query optimization." msgstr "Permitir el uso del optimizador genético de consultas." -#: utils/misc/guc_tables.c:1028 +#: utils/misc/guc_tables.c:1003 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Este algoritmo intenta planear las consultas sin hacer búsqueda exhaustiva." -#: utils/misc/guc_tables.c:1039 +#: utils/misc/guc_tables.c:1017 msgid "Shows whether the current user is a superuser." msgstr "Indica si el usuario actual es superusuario." -#: utils/misc/guc_tables.c:1049 +#: utils/misc/guc_tables.c:1032 +msgid "Allows running the ALTER SYSTEM command." +msgstr "Permite ejecutar la orden ALTER SYSTEM." + +#: utils/misc/guc_tables.c:1033 +msgid "Can be set to off for environments where global configuration changes should be made using a different method." +msgstr "Puede desactivarse en ambientes donde los cambios globales de configuración deban hacerse usando un método diferente." + +#: utils/misc/guc_tables.c:1043 msgid "Enables advertising the server via Bonjour." msgstr "Permitir la publicación del servidor vía Bonjour." -#: utils/misc/guc_tables.c:1058 +#: utils/misc/guc_tables.c:1052 msgid "Collects transaction commit time." msgstr "Recolectar tiempo de compromiso de transacciones." -#: utils/misc/guc_tables.c:1067 +#: utils/misc/guc_tables.c:1061 msgid "Enables SSL connections." msgstr "Permitir conexiones SSL." -#: utils/misc/guc_tables.c:1076 -msgid "Controls whether ssl_passphrase_command is called during server reload." -msgstr "" +#: utils/misc/guc_tables.c:1070 +msgid "Controls whether \"ssl_passphrase_command\" is called during server reload." +msgstr "Controla si «ssl_passphrase_command» es invocado durante el “reload†del servidor." -#: utils/misc/guc_tables.c:1085 +#: utils/misc/guc_tables.c:1079 msgid "Give priority to server ciphersuite order." msgstr "Da prioridad al orden de algoritmos de cifrado especificado por el servidor." -#: utils/misc/guc_tables.c:1094 +#: utils/misc/guc_tables.c:1088 msgid "Forces synchronization of updates to disk." msgstr "Forzar la sincronización de escrituras a disco." -#: utils/misc/guc_tables.c:1095 -msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This insures that a database cluster will recover to a consistent state after an operating system or hardware crash." +#: utils/misc/guc_tables.c:1089 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "El servidor usará la llamada a sistema fsync() en varios lugares para asegurarse que las actualizaciones son escritas físicamente a disco. Esto asegura que las bases de datos se recuperarán a un estado consistente después de una caída de hardware o sistema operativo." -#: utils/misc/guc_tables.c:1106 +#: utils/misc/guc_tables.c:1100 msgid "Continues processing after a checksum failure." msgstr "Continuar procesando después de una falla de suma de verificación." -#: utils/misc/guc_tables.c:1107 +#: utils/misc/guc_tables.c:1101 msgid "Detection of a checksum failure normally causes PostgreSQL to report an error, aborting the current transaction. Setting ignore_checksum_failure to true causes the system to ignore the failure (but still report a warning), and continue processing. This behavior could cause crashes or other serious problems. Only has an effect if checksums are enabled." msgstr "La detección de una suma de verificación que no coincide normalmente hace que PostgreSQL reporte un error, abortando la transacción en curso. Definiendo ignore_checksum_failure a true hace que el sistema ignore la falla (pero aún así reporta un mensaje de warning), y continúe el procesamiento. Este comportamiento podría causar caídas del sistema u otros problemas serios. Sólo tiene efecto si las sumas de verificación están activadas." -#: utils/misc/guc_tables.c:1121 +#: utils/misc/guc_tables.c:1115 msgid "Continues processing past damaged page headers." msgstr "Continuar procesando después de detectar encabezados de página dañados." -#: utils/misc/guc_tables.c:1122 -msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting zero_damaged_pages to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." -msgstr "La detección de un encabezado de página dañado normalmente hace que PostgreSQL reporte un error, abortando la transacción en curso. Definiendo zero_damaged_pages a true hace que el sistema reporte un mensaje de warning, escriba ceros en toda la página, y continúe el procesamiento. Este comportamiento destruirá datos; en particular, todas las tuplas en la página dañada." +#: utils/misc/guc_tables.c:1116 +msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting \"zero_damaged_pages\" to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." +msgstr "La detección de un encabezado de página dañado normalmente hace que PostgreSQL reporte un error, abortando la transacción en curso. Definiendo «zero_damaged_pages» a true hace que el sistema reporte un mensaje de warning, escriba ceros en toda la página, y continúe el procesamiento. Este comportamiento destruirá datos; en particular, todas las tuplas en la página dañada." -#: utils/misc/guc_tables.c:1135 +#: utils/misc/guc_tables.c:1129 msgid "Continues recovery after an invalid pages failure." msgstr "Continuar procesando después de una falla de páginas no válidas." -#: utils/misc/guc_tables.c:1136 -msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting ignore_invalid_pages to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." -msgstr "La detección de que registros de WAL tengan referencias a páginas no válidas durante la recuperación hace que PostgreSQL produzca un error de nivel PANIC, abortando la recuperación. Establecer el valor de ignore_invalid_pages a true hace que el sistema ignore las referencias a páginas no válidas en registros de WAL (pero aún así reporta un mensaje de warning), y continúe la recuperación. Este comportamiento podría causar caídas del sistema, pérdida de datos, propagar u ocultar corrupción, u otros problemas serios. Sólo tiene efecto durante la recuperación o en modo standby." +#: utils/misc/guc_tables.c:1130 +msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting \"ignore_invalid_pages\" to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." +msgstr "La detección de que registros de WAL tengan referencias a páginas no válidas durante la recuperación hace que PostgreSQL produzca un error de nivel PANIC, abortando la recuperación. Establecer el valor de «ignore_invalid_pages» a true hace que el sistema ignore las referencias a páginas no válidas en registros de WAL (pero aún así reporta un mensaje de warning), y continúe la recuperación. Este comportamiento podría causar caídas del sistema, pérdida de datos, propagar u ocultar corrupción, u otros problemas serios. Sólo tiene efecto durante la recuperación o en modo standby." -#: utils/misc/guc_tables.c:1154 +#: utils/misc/guc_tables.c:1148 msgid "Writes full pages to WAL when first modified after a checkpoint." -msgstr "Escribe páginas completas a WAL cuando son modificadas después de un punto de control." +msgstr "Escribe páginas completas a WAL cuando son modificadas después de un checkpoint." -#: utils/misc/guc_tables.c:1155 +#: utils/misc/guc_tables.c:1149 msgid "A page write in process during an operating system crash might be only partially written to disk. During recovery, the row changes stored in WAL are not enough to recover. This option writes pages when first modified after a checkpoint to WAL so full recovery is possible." -msgstr "Una escritura de página que está siendo procesada durante una caída del sistema operativo puede ser completada sólo parcialmente. Durante la recuperación, los cambios de registros (tuplas) almacenados en WAL no son suficientes para la recuperación. Esta opción activa la escritura de las páginas a WAL cuando son modificadas por primera vez después de un punto de control, de manera que una recuperación total es posible." +msgstr "Una escritura de página que está siendo procesada durante una caída del sistema operativo puede ser completada sólo parcialmente. Durante la recuperación, los cambios de registros (tuplas) almacenados en WAL no son suficientes para la recuperación. Esta opción activa la escritura de las páginas a WAL cuando son modificadas por primera vez después de un checkpoint, de manera que una recuperación total es posible." -#: utils/misc/guc_tables.c:1168 +#: utils/misc/guc_tables.c:1162 msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." -msgstr "Escribir páginas completas al WAL cuando son modificadas después de un punto de control, incluso para una modificación no crítica." +msgstr "Escribir páginas completas al WAL cuando son modificadas después de un checkpoint, incluso para una modificación no crítica." -#: utils/misc/guc_tables.c:1178 +#: utils/misc/guc_tables.c:1172 msgid "Writes zeroes to new WAL files before first use." msgstr "Escribir ceros a nuevos archivos WAL antes del primer uso." -#: utils/misc/guc_tables.c:1188 +#: utils/misc/guc_tables.c:1182 msgid "Recycles WAL files by renaming them." msgstr "Reciclar archivos de WAL cambiándoles de nombre." -#: utils/misc/guc_tables.c:1198 +#: utils/misc/guc_tables.c:1192 msgid "Logs each checkpoint." -msgstr "Registrar cada punto de control." +msgstr "Registrar cada checkpoint." -#: utils/misc/guc_tables.c:1207 +#: utils/misc/guc_tables.c:1201 msgid "Logs each successful connection." msgstr "Registrar cada conexión exitosa." -#: utils/misc/guc_tables.c:1216 +#: utils/misc/guc_tables.c:1210 +msgid "Logs details of pre-authentication connection handshake." +msgstr "Registrar detalles de “handshake†de conexión anteriores a la autentificación." + +#: utils/misc/guc_tables.c:1220 msgid "Logs end of a session, including duration." msgstr "Registrar el fin de una sesión, incluyendo su duración." -#: utils/misc/guc_tables.c:1225 +#: utils/misc/guc_tables.c:1229 msgid "Logs each replication command." msgstr "Registrar cada orden de replicación." -#: utils/misc/guc_tables.c:1234 +#: utils/misc/guc_tables.c:1238 msgid "Shows whether the running server has assertion checks enabled." msgstr "Indica si el servidor actual tiene activas las aseveraciones (asserts) activas." -#: utils/misc/guc_tables.c:1245 +#: utils/misc/guc_tables.c:1249 msgid "Terminate session on any error." msgstr "Terminar sesión ante cualquier error." -#: utils/misc/guc_tables.c:1254 +#: utils/misc/guc_tables.c:1258 msgid "Reinitialize server after backend crash." msgstr "Reinicializar el servidor después de una caída de un proceso servidor." -#: utils/misc/guc_tables.c:1263 +#: utils/misc/guc_tables.c:1267 msgid "Remove temporary files after backend crash." msgstr "Eliminar archivos temporales después de una caída de un proceso servidor." -#: utils/misc/guc_tables.c:1273 +#: utils/misc/guc_tables.c:1277 msgid "Send SIGABRT not SIGQUIT to child processes after backend crash." -msgstr "" +msgstr "Enviar SIGABRT en vez de SIGQUIT a procesos hijos después de una caída de un proceso servidor." -#: utils/misc/guc_tables.c:1283 +#: utils/misc/guc_tables.c:1287 msgid "Send SIGABRT not SIGKILL to stuck child processes." -msgstr "" +msgstr "Enviar SIGABRT en vez de SIGKILL a procesos hijos atascados." -#: utils/misc/guc_tables.c:1294 +#: utils/misc/guc_tables.c:1298 msgid "Logs the duration of each completed SQL statement." msgstr "Registrar la duración de cada sentencia SQL ejecutada." -#: utils/misc/guc_tables.c:1303 +#: utils/misc/guc_tables.c:1307 msgid "Logs each query's parse tree." msgstr "Registrar cada arbol analizado de consulta " -#: utils/misc/guc_tables.c:1312 +#: utils/misc/guc_tables.c:1316 msgid "Logs each query's rewritten parse tree." msgstr "Registrar cada reescritura del arból analizado de consulta" -#: utils/misc/guc_tables.c:1321 +#: utils/misc/guc_tables.c:1325 msgid "Logs each query's execution plan." msgstr "Registrar el plan de ejecución de cada consulta." -#: utils/misc/guc_tables.c:1330 +#: utils/misc/guc_tables.c:1334 msgid "Indents parse and plan tree displays." msgstr "Indentar los árboles de parse y plan." -#: utils/misc/guc_tables.c:1339 +#: utils/misc/guc_tables.c:1343 msgid "Writes parser performance statistics to the server log." msgstr "Escribir estadísticas de parser al registro del servidor." -#: utils/misc/guc_tables.c:1348 +#: utils/misc/guc_tables.c:1352 msgid "Writes planner performance statistics to the server log." msgstr "Escribir estadísticas de planner al registro del servidor." -#: utils/misc/guc_tables.c:1357 +#: utils/misc/guc_tables.c:1361 msgid "Writes executor performance statistics to the server log." msgstr "Escribir estadísticas del executor al registro del servidor." -#: utils/misc/guc_tables.c:1366 +#: utils/misc/guc_tables.c:1370 msgid "Writes cumulative performance statistics to the server log." msgstr "Escribir estadísticas acumulativas al registro del servidor." -#: utils/misc/guc_tables.c:1376 +#: utils/misc/guc_tables.c:1380 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "Registrar uso de recursos de sistema (memoria y CPU) en varias operaciones B-tree." -#: utils/misc/guc_tables.c:1388 +#: utils/misc/guc_tables.c:1392 msgid "Collects information about executing commands." msgstr "Recolectar estadísticas sobre órdenes en ejecución." -#: utils/misc/guc_tables.c:1389 +#: utils/misc/guc_tables.c:1393 msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." msgstr "Activa la recolección de información sobre la orden actualmente en ejecución en cada sesión, junto con el momento en el cual esa orden comenzó la ejecución." -#: utils/misc/guc_tables.c:1399 +#: utils/misc/guc_tables.c:1403 msgid "Collects statistics on database activity." msgstr "Recolectar estadísticas de actividad de la base de datos." -#: utils/misc/guc_tables.c:1408 +#: utils/misc/guc_tables.c:1412 msgid "Collects timing statistics for database I/O activity." msgstr "Recolectar estadísticas de tiempos en las operaciones de I/O de la base de datos." -#: utils/misc/guc_tables.c:1417 +#: utils/misc/guc_tables.c:1421 msgid "Collects timing statistics for WAL I/O activity." msgstr "Recolectar estadísticas de tiempos en las operaciones de I/O del WAL." -#: utils/misc/guc_tables.c:1427 +#: utils/misc/guc_tables.c:1431 msgid "Updates the process title to show the active SQL command." msgstr "Actualiza el título del proceso para mostrar la orden SQL activo." -#: utils/misc/guc_tables.c:1428 +#: utils/misc/guc_tables.c:1432 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "Habilita que se actualice el título del proceso cada vez que una orden SQL es recibido por el servidor." -#: utils/misc/guc_tables.c:1437 +#: utils/misc/guc_tables.c:1441 msgid "Starts the autovacuum subprocess." msgstr "Iniciar el subproceso de autovacuum." -#: utils/misc/guc_tables.c:1447 +#: utils/misc/guc_tables.c:1451 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Generar salida de depuración para LISTEN y NOTIFY." -#: utils/misc/guc_tables.c:1459 +#: utils/misc/guc_tables.c:1463 msgid "Emits information about lock usage." msgstr "Emitir información acerca del uso de locks." -#: utils/misc/guc_tables.c:1469 +#: utils/misc/guc_tables.c:1473 msgid "Emits information about user lock usage." msgstr "Emitir información acerca del uso de locks de usuario." -#: utils/misc/guc_tables.c:1479 +#: utils/misc/guc_tables.c:1483 msgid "Emits information about lightweight lock usage." msgstr "Emitir información acerca del uso de «lightweight locks»." -#: utils/misc/guc_tables.c:1489 +#: utils/misc/guc_tables.c:1493 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "Volcar información acerca de los locks existentes cuando se agota el tiempo de deadlock." -#: utils/misc/guc_tables.c:1501 +#: utils/misc/guc_tables.c:1505 msgid "Logs long lock waits." msgstr "Registrar esperas largas de bloqueos." -#: utils/misc/guc_tables.c:1510 +#: utils/misc/guc_tables.c:1514 msgid "Logs standby recovery conflict waits." msgstr "Registrar esperas por conflictos en recuperación de standby" -#: utils/misc/guc_tables.c:1519 +#: utils/misc/guc_tables.c:1523 msgid "Logs the host name in the connection logs." msgstr "Registrar el nombre del host en la conexión." -#: utils/misc/guc_tables.c:1520 +#: utils/misc/guc_tables.c:1524 msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." msgstr "Por omisión, los registros de conexión sólo muestran la dirección IP del host que establece la conexión. Si desea que se despliegue el nombre del host puede activar esta opción, pero dependiendo de su configuración de resolución de nombres esto puede imponer una penalización de rendimiento no despreciable." -#: utils/misc/guc_tables.c:1531 +#: utils/misc/guc_tables.c:1535 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Tratar expr=NULL como expr IS NULL." -#: utils/misc/guc_tables.c:1532 +#: utils/misc/guc_tables.c:1536 msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." msgstr "Cuando está activado, expresiones de la forma expr = NULL (o NULL = expr) son tratadas como expr IS NULL, esto es, retornarán verdadero si expr es evaluada al valor nulo, y falso en caso contrario. El comportamiento correcto de expr = NULL es retornar siempre null (desconocido)." -#: utils/misc/guc_tables.c:1544 -msgid "Enables per-database user names." -msgstr "Activar el uso de nombre de usuario locales a cada base de datos." - -#: utils/misc/guc_tables.c:1553 +#: utils/misc/guc_tables.c:1548 msgid "Sets the default read-only status of new transactions." msgstr "Estado por omisión de sólo lectura de nuevas transacciones." -#: utils/misc/guc_tables.c:1563 +#: utils/misc/guc_tables.c:1558 msgid "Sets the current transaction's read-only status." msgstr "Activa el estado de sólo lectura de la transacción en curso." -#: utils/misc/guc_tables.c:1573 +#: utils/misc/guc_tables.c:1568 msgid "Sets the default deferrable status of new transactions." msgstr "Estado por omisión de postergable de nuevas transacciones." -#: utils/misc/guc_tables.c:1582 +#: utils/misc/guc_tables.c:1577 msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." msgstr "Si está activo, las transacciones serializables de sólo lectura serán pausadas hasta que puedan ejecutarse sin posibles fallas de serialización." -#: utils/misc/guc_tables.c:1592 +#: utils/misc/guc_tables.c:1587 msgid "Enable row security." msgstr "Activar seguridad de registros." -#: utils/misc/guc_tables.c:1593 +#: utils/misc/guc_tables.c:1588 msgid "When enabled, row security will be applied to all users." msgstr "Cuando está activada, la seguridad de registros se aplicará a todos los usuarios." -#: utils/misc/guc_tables.c:1601 +#: utils/misc/guc_tables.c:1596 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "Verificar definición de rutinas durante CREATE FUNCTION y CREATE PROCEDURE." -#: utils/misc/guc_tables.c:1610 +#: utils/misc/guc_tables.c:1605 msgid "Enable input of NULL elements in arrays." msgstr "Habilita el ingreso de elementos nulos en arrays." -#: utils/misc/guc_tables.c:1611 +#: utils/misc/guc_tables.c:1606 msgid "When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally." msgstr "Cuando está activo, un valor NULL sin comillas en la entrada de un array significa un valor nulo; en caso contrario es tomado literalmente." -#: utils/misc/guc_tables.c:1627 +#: utils/misc/guc_tables.c:1622 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS ya no está soportado; esto sólo puede ser false." -#: utils/misc/guc_tables.c:1637 -msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." -msgstr "Lanzar un subproceso para capturar stderr y/o logs CSV en archivos de log." +#: utils/misc/guc_tables.c:1632 +#| msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." +msgid "Start a subprocess to capture stderr, csvlog and/or jsonlog into log files." +msgstr "Lanzar un subproceso para capturar stderr, csvlog y/o jsonlog en archivos de log." -#: utils/misc/guc_tables.c:1646 +#: utils/misc/guc_tables.c:1641 msgid "Truncate existing log files of same name during log rotation." msgstr "Truncar archivos de log del mismo nombre durante la rotación." -#: utils/misc/guc_tables.c:1657 +#: utils/misc/guc_tables.c:1652 msgid "Emit information about resource usage in sorting." msgstr "Emitir información acerca de uso de recursos durante los ordenamientos." -#: utils/misc/guc_tables.c:1671 +#: utils/misc/guc_tables.c:1666 msgid "Generate debugging output for synchronized scanning." msgstr "Generar salida de depuración para recorrido sincronizado." -#: utils/misc/guc_tables.c:1686 +#: utils/misc/guc_tables.c:1681 msgid "Enable bounded sorting using heap sort." msgstr "Activar ordenamiento acotado usando «heap sort»." -#: utils/misc/guc_tables.c:1699 +#: utils/misc/guc_tables.c:1694 msgid "Emit WAL-related debugging output." msgstr "Activar salida de depuración de WAL." -#: utils/misc/guc_tables.c:1711 +#: utils/misc/guc_tables.c:1706 msgid "Shows whether datetimes are integer based." msgstr "Mostrar si las fechas y horas se basan en tipos enteros." -#: utils/misc/guc_tables.c:1722 +#: utils/misc/guc_tables.c:1717 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "Define que los nombres de usuario Kerberos y GSSAPI deberían ser tratados sin distinción de mayúsculas." -#: utils/misc/guc_tables.c:1732 -#, fuzzy -#| msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." +#: utils/misc/guc_tables.c:1727 msgid "Sets whether GSSAPI delegation should be accepted from the client." -msgstr "Define que los nombres de usuario Kerberos y GSSAPI deberían ser tratados sin distinción de mayúsculas." +msgstr "Define si la delegación GSSAPI debería ser aceptada por el cliente." -#: utils/misc/guc_tables.c:1742 +#: utils/misc/guc_tables.c:1737 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Avisa acerca de escapes de backslash en literales de cadena corrientes." -#: utils/misc/guc_tables.c:1752 +#: utils/misc/guc_tables.c:1747 msgid "Causes '...' strings to treat backslashes literally." msgstr "Provoca que las cadenas '...' traten las barras inclinadas inversas (\\) en forma literal." -#: utils/misc/guc_tables.c:1763 +#: utils/misc/guc_tables.c:1758 msgid "Enable synchronized sequential scans." msgstr "Permitir la sincronización de recorridos secuenciales." -#: utils/misc/guc_tables.c:1773 +#: utils/misc/guc_tables.c:1768 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "Define si incluir o excluir la transacción con el destino de recuperación." -#: utils/misc/guc_tables.c:1783 +#: utils/misc/guc_tables.c:1778 +msgid "Starts the WAL summarizer process to enable incremental backup." +msgstr "Inicia el proceso sumarizador de WAL para activar backups incrementales." + +#: utils/misc/guc_tables.c:1788 msgid "Allows connections and queries during recovery." msgstr "Permite conexiones y consultas durante la recuperación." -#: utils/misc/guc_tables.c:1793 +#: utils/misc/guc_tables.c:1798 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "Permite retroalimentación desde un hot standby hacia el primario que evitará conflictos en consultas." -#: utils/misc/guc_tables.c:1803 +#: utils/misc/guc_tables.c:1808 msgid "Shows whether hot standby is currently active." msgstr "Muestra si hot standby está activo actualmente." -#: utils/misc/guc_tables.c:1814 +#: utils/misc/guc_tables.c:1819 msgid "Allows modifications of the structure of system tables." msgstr "Permite modificaciones de la estructura de las tablas del sistema." -#: utils/misc/guc_tables.c:1825 +#: utils/misc/guc_tables.c:1830 msgid "Disables reading from system indexes." msgstr "Deshabilita lectura de índices del sistema." -#: utils/misc/guc_tables.c:1826 +#: utils/misc/guc_tables.c:1831 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "No evita la actualización de índices, así que es seguro. Lo peor que puede ocurrir es lentitud del sistema." -#: utils/misc/guc_tables.c:1837 +#: utils/misc/guc_tables.c:1842 msgid "Allows tablespaces directly inside pg_tblspc, for testing." msgstr "Permite tablespaces directamente dentro de pg_tblspc, para pruebas." -#: utils/misc/guc_tables.c:1848 +#: utils/misc/guc_tables.c:1853 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "Activa el modo de compatibilidad con versiones anteriores de las comprobaciones de privilegios de objetos grandes." -#: utils/misc/guc_tables.c:1849 +#: utils/misc/guc_tables.c:1854 msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." msgstr "Omite las comprobaciones de privilegios cuando se leen o modifican los objetos grandes, para compatibilidad con versiones de PostgreSQL anteriores a 9.0." -#: utils/misc/guc_tables.c:1859 +#: utils/misc/guc_tables.c:1864 msgid "When generating SQL fragments, quote all identifiers." msgstr "Al generar fragmentos SQL, entrecomillar todos los identificadores." -#: utils/misc/guc_tables.c:1869 +#: utils/misc/guc_tables.c:1874 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Indica si las sumas de verificación están activas en este cluster." -#: utils/misc/guc_tables.c:1880 +#: utils/misc/guc_tables.c:1885 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "Agregar número de secuencia a mensajes syslog para evitar supresión de duplicados." -#: utils/misc/guc_tables.c:1890 +#: utils/misc/guc_tables.c:1895 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "Dividir mensajes enviados a syslog en líneas y que quepan en 1024 bytes." -#: utils/misc/guc_tables.c:1900 +#: utils/misc/guc_tables.c:1905 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Controla si los Gather y Gather Merge también ejecutan subplanes." -#: utils/misc/guc_tables.c:1901 +#: utils/misc/guc_tables.c:1906 msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "¿Deben los nodos de recolección ejecutar subplanes o sólo recolectar tuplas?" -#: utils/misc/guc_tables.c:1911 +#: utils/misc/guc_tables.c:1916 msgid "Allow JIT compilation." msgstr "Permitir compilación JIT." -#: utils/misc/guc_tables.c:1922 +#: utils/misc/guc_tables.c:1927 msgid "Register JIT-compiled functions with debugger." msgstr "Registrar las funciones JIT compiladas con el depurador." -#: utils/misc/guc_tables.c:1939 +#: utils/misc/guc_tables.c:1944 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Escribe el bitcode LLVM para facilitar depuración de JIT." -#: utils/misc/guc_tables.c:1950 +#: utils/misc/guc_tables.c:1955 msgid "Allow JIT compilation of expressions." msgstr "Permitir compilación JIT de expresiones." -#: utils/misc/guc_tables.c:1961 +#: utils/misc/guc_tables.c:1966 msgid "Register JIT-compiled functions with perf profiler." msgstr "Registrar las funciones JIT compiladas con el analizador «perf»." -#: utils/misc/guc_tables.c:1978 +#: utils/misc/guc_tables.c:1983 msgid "Allow JIT compilation of tuple deforming." msgstr "Permitir compilación JIT de deformación de tuplas." -#: utils/misc/guc_tables.c:1989 +#: utils/misc/guc_tables.c:1994 msgid "Whether to continue running after a failure to sync data files." msgstr "Si continuar ejecutando después de una falla al sincronizar archivos de datos." -#: utils/misc/guc_tables.c:1998 +#: utils/misc/guc_tables.c:2003 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "Definir si un receptor de WAL debe crear un slot de replicación temporal en caso de no haber configurado un slot permanente." -#: utils/misc/guc_tables.c:2016 -#, fuzzy -#| msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." +#: utils/misc/guc_tables.c:2012 +msgid "Enables event triggers." +msgstr "Activa “triggers†por evento." + +#: utils/misc/guc_tables.c:2013 +msgid "When enabled, event triggers will fire for all applicable statements." +msgstr "Cuando se activa, los “triggers†por evento se ejecutarán para todas las sentencias aplicables." + +#: utils/misc/guc_tables.c:2022 +msgid "Enables a physical standby to synchronize logical failover replication slots from the primary server." +msgstr "Habilita un standby físico para sincronizar slots de “failover†de replicación lógica desde el servidor primario." + +#: utils/misc/guc_tables.c:2040 msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." -msgstr "Define el tiempo a esperar antes de reintentar obtener WAL después de un intento fallido." +msgstr "Define el tiempo a esperar antes de forzar un cambio al siguiente archivo WAL." -#: utils/misc/guc_tables.c:2027 -#, fuzzy -#| msgid "Sets the maximum time to wait for WAL replication." +#: utils/misc/guc_tables.c:2051 msgid "Sets the amount of time to wait after authentication on connection startup." -msgstr "Define el tiempo máximo a esperar la replicación de WAL." +msgstr "Define el tiempo máximo a esperar la autentificación durante el establecimiento de una conexión." -#: utils/misc/guc_tables.c:2029 utils/misc/guc_tables.c:2663 +#: utils/misc/guc_tables.c:2053 utils/misc/guc_tables.c:2780 msgid "This allows attaching a debugger to the process." msgstr "Esto permite adjuntar un depurador al proceso." -#: utils/misc/guc_tables.c:2038 +#: utils/misc/guc_tables.c:2062 msgid "Sets the default statistics target." msgstr "Definir el valor por omisión de toma de estadísticas." -#: utils/misc/guc_tables.c:2039 +#: utils/misc/guc_tables.c:2063 msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." msgstr "Esto se aplica a columnas de tablas que no tienen un valor definido a través de ALTER TABLE SET STATISTICS." -#: utils/misc/guc_tables.c:2048 +#: utils/misc/guc_tables.c:2072 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "Tamaño de lista de FROM a partir del cual subconsultas no serán colapsadas." -#: utils/misc/guc_tables.c:2050 +#: utils/misc/guc_tables.c:2074 msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." msgstr "El planner mezclará subconsultas en consultas de nivel superior si la lista FROM resultante es menor que esta cantidad de ítems." -#: utils/misc/guc_tables.c:2061 +#: utils/misc/guc_tables.c:2085 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "Tamaño de lista de FROM a partir del cual constructos JOIN no serán aplanados." -#: utils/misc/guc_tables.c:2063 +#: utils/misc/guc_tables.c:2087 msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." msgstr "El planner aplanará constructos JOIN explícitos en listas de ítems FROM siempre que la lista resultante no tenga más que esta cantidad de ítems." -#: utils/misc/guc_tables.c:2074 +#: utils/misc/guc_tables.c:2098 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "Umbral de ítems en FROM a partir del cual se usará GEQO." -#: utils/misc/guc_tables.c:2084 +#: utils/misc/guc_tables.c:2108 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: effort se usa para determinar los valores por defecto para otros parámetros." -#: utils/misc/guc_tables.c:2094 +#: utils/misc/guc_tables.c:2118 msgid "GEQO: number of individuals in the population." msgstr "GEQO: número de individuos en una población." -#: utils/misc/guc_tables.c:2095 utils/misc/guc_tables.c:2105 +#: utils/misc/guc_tables.c:2119 utils/misc/guc_tables.c:2129 msgid "Zero selects a suitable default value." msgstr "Cero selecciona un valor por omisión razonable." -#: utils/misc/guc_tables.c:2104 +#: utils/misc/guc_tables.c:2128 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: número de iteraciones del algoritmo." -#: utils/misc/guc_tables.c:2116 +#: utils/misc/guc_tables.c:2140 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Define el tiempo a esperar un lock antes de buscar un deadlock." -#: utils/misc/guc_tables.c:2127 +#: utils/misc/guc_tables.c:2151 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "Define el máximo retardo antes de cancelar consultas cuando un servidor hot standby está procesando datos de WAL archivado." -#: utils/misc/guc_tables.c:2138 +#: utils/misc/guc_tables.c:2162 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "Define el máximo retardo antes de cancelar consultas cuando un servidor hot standby está procesando datos de WAL en flujo." -#: utils/misc/guc_tables.c:2149 +#: utils/misc/guc_tables.c:2173 msgid "Sets the minimum delay for applying changes during recovery." msgstr "Define el retraso mínimo para aplicar cambios durante la recuperación." -#: utils/misc/guc_tables.c:2160 +#: utils/misc/guc_tables.c:2184 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "Define el intervalo máximo entre reportes de estado que el receptor de WAL envía al servidor origen." -#: utils/misc/guc_tables.c:2171 +#: utils/misc/guc_tables.c:2195 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "Define el máximo tiempo de espera para recibir datos desde el servidor origen." -#: utils/misc/guc_tables.c:2182 +#: utils/misc/guc_tables.c:2206 msgid "Sets the maximum number of concurrent connections." msgstr "Número máximo de conexiones concurrentes." -#: utils/misc/guc_tables.c:2193 +#: utils/misc/guc_tables.c:2217 msgid "Sets the number of connection slots reserved for superusers." msgstr "Número de conexiones reservadas para superusuarios." -#: utils/misc/guc_tables.c:2203 -#, fuzzy -#| msgid "Sets the number of connection slots reserved for superusers." +#: utils/misc/guc_tables.c:2227 msgid "Sets the number of connection slots reserved for roles with privileges of pg_use_reserved_connections." -msgstr "Número de conexiones reservadas para superusuarios." +msgstr "Número de conexiones reservadas para con privilegios de pg_use_reserved_connections." -#: utils/misc/guc_tables.c:2214 +#: utils/misc/guc_tables.c:2238 msgid "Amount of dynamic shared memory reserved at startup." msgstr "Cantidad de memoria compartida dinámica reservada al iniciar." -#: utils/misc/guc_tables.c:2229 +#: utils/misc/guc_tables.c:2253 msgid "Sets the number of shared memory buffers used by the server." msgstr "Número de búfers de memoria compartida usados por el servidor." -#: utils/misc/guc_tables.c:2240 +#: utils/misc/guc_tables.c:2264 msgid "Sets the buffer pool size for VACUUM, ANALYZE, and autovacuum." -msgstr "" +msgstr "Define el tamaño del pool de búfers para VACUUM, ANALYZE y autovacuum." -#: utils/misc/guc_tables.c:2251 +#: utils/misc/guc_tables.c:2275 msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." msgstr "Muestra el tamaño del área principal de memoria compartida del servidor (redondeado al número de MB más cercano)." -#: utils/misc/guc_tables.c:2262 -#, fuzzy -#| msgid "Sets the number of disk-page buffers in shared memory for WAL." +#: utils/misc/guc_tables.c:2286 msgid "Shows the number of huge pages needed for the main shared memory area." -msgstr "Búfers en memoria compartida para páginas de WAL." +msgstr "Muestra la cantidad de “huge pages†necesarias para el área de memoria compartida principal." -#: utils/misc/guc_tables.c:2263 +#: utils/misc/guc_tables.c:2287 msgid "-1 indicates that the value could not be determined." msgstr "-1 indica que el valor no pudo ser determinado." -#: utils/misc/guc_tables.c:2273 +#: utils/misc/guc_tables.c:2297 +msgid "Sets the size of the dedicated buffer pool used for the commit timestamp cache." +msgstr "Define el tamaño del pool de búfers dedicado al caché de timestamps de commit." + +#: utils/misc/guc_tables.c:2298 utils/misc/guc_tables.c:2353 +#: utils/misc/guc_tables.c:2364 +msgid "Specify 0 to have this value determined as a fraction of shared_buffers." +msgstr "Especifique 0 para que este valor sea determinado como fracción de shared_buffers." + +#: utils/misc/guc_tables.c:2308 +msgid "Sets the size of the dedicated buffer pool used for the MultiXact member cache." +msgstr "Define el tamaño del pool de búfers dedicado al caché de miembros de MultiXact." + +#: utils/misc/guc_tables.c:2319 +msgid "Sets the size of the dedicated buffer pool used for the MultiXact offset cache." +msgstr "Define el tamaño del pool de búfers dedicado al caché de offsets de MultiXact." + +#: utils/misc/guc_tables.c:2330 +msgid "Sets the size of the dedicated buffer pool used for the LISTEN/NOTIFY message cache." +msgstr "Define el tamaño del pool de búfers dedicado al caché de mensajes LISTEN/NOTIFY." + +#: utils/misc/guc_tables.c:2341 +msgid "Sets the size of the dedicated buffer pool used for the serializable transaction cache." +msgstr "Define el tamaño del pool de búfers dedicado al caché de transacciones serializables." + +#: utils/misc/guc_tables.c:2352 +msgid "Sets the size of the dedicated buffer pool used for the subtransaction cache." +msgstr "Define el tamaño del pool de búfers dedicado al caché de subtransacciones." + +#: utils/misc/guc_tables.c:2363 +msgid "Sets the size of the dedicated buffer pool used for the transaction status cache." +msgstr "Define el tamaño del pool de búfers dedicado al caché de estatus de transacciones." + +#: utils/misc/guc_tables.c:2374 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Número de búfers de memoria temporal usados por cada sesión." -#: utils/misc/guc_tables.c:2284 +#: utils/misc/guc_tables.c:2385 msgid "Sets the TCP port the server listens on." msgstr "Puerto TCP en el cual escuchará el servidor." -#: utils/misc/guc_tables.c:2294 +#: utils/misc/guc_tables.c:2395 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Privilegios de acceso al socket Unix." -#: utils/misc/guc_tables.c:2295 +#: utils/misc/guc_tables.c:2396 msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Los sockets de dominio Unix usan la funcionalidad de permisos de archivos estándar de Unix. Se espera que el valor de esta opción sea una especificación numérica de modo, en la forma aceptada por las llamadas a sistema chmod y umask. Para usar el modo octal acostumbrado, comience el número con un 0 (cero)." -#: utils/misc/guc_tables.c:2309 +#: utils/misc/guc_tables.c:2410 msgid "Sets the file permissions for log files." msgstr "Define los privilegios para los archivos del registro del servidor." -#: utils/misc/guc_tables.c:2310 +#: utils/misc/guc_tables.c:2411 msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Se espera que el valor de esta opción sea una especificación numérica de modo, en la forma aceptada por las llamadas a sistema chmod y umask. Para usar el modo octal acostumbrado, comience el número con un 0 (cero)." -#: utils/misc/guc_tables.c:2324 +#: utils/misc/guc_tables.c:2425 msgid "Shows the mode of the data directory." msgstr "Muestra el modo del directorio de datos." -#: utils/misc/guc_tables.c:2325 +#: utils/misc/guc_tables.c:2426 msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "El valor del parámetro es una especificación numérica de modo, en la forma aceptada por las llamadas a sistema chmod y umask. (Para usar el modo octal acostumbrado, comience el número con un 0 (cero).)" -#: utils/misc/guc_tables.c:2338 +#: utils/misc/guc_tables.c:2439 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Establece el límite de memoria que se usará para espacios de trabajo de consultas." -#: utils/misc/guc_tables.c:2339 +#: utils/misc/guc_tables.c:2440 msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." msgstr "Esta es la cantidad máxima de memoria que se usará para operaciones internas de ordenamiento y tablas de hashing, antes de comenzar a usar archivos temporales en disco." -#: utils/misc/guc_tables.c:2351 +#: utils/misc/guc_tables.c:2457 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Establece el límite de memoria que se usará para operaciones de mantención." -#: utils/misc/guc_tables.c:2352 +#: utils/misc/guc_tables.c:2458 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Esto incluye operaciones como VACUUM y CREATE INDEX." -#: utils/misc/guc_tables.c:2362 +#: utils/misc/guc_tables.c:2468 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Establece el límite de memoria que se usará para decodificación lógica." -#: utils/misc/guc_tables.c:2363 +#: utils/misc/guc_tables.c:2469 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." msgstr "Esta es la cantidad máxima de memoria que puede ser usada para cada búfer interno de ordenamiento, antes de comenzar a usar disco." -#: utils/misc/guc_tables.c:2379 +#: utils/misc/guc_tables.c:2485 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Establece el tamaño máximo del stack, en kilobytes." -#: utils/misc/guc_tables.c:2390 +#: utils/misc/guc_tables.c:2496 msgid "Limits the total size of all temporary files used by each process." msgstr "Limita el tamaño total de todos los archivos temporales usados en cada proceso." -#: utils/misc/guc_tables.c:2391 +#: utils/misc/guc_tables.c:2497 msgid "-1 means no limit." msgstr "-1 significa sin límite." -#: utils/misc/guc_tables.c:2401 +#: utils/misc/guc_tables.c:2507 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Costo de Vacuum de una página encontrada en el buffer." -#: utils/misc/guc_tables.c:2411 +#: utils/misc/guc_tables.c:2517 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Costo de Vacuum de una página no encontrada en el cache." -#: utils/misc/guc_tables.c:2421 +#: utils/misc/guc_tables.c:2527 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Costo de Vacuum de una página ensuciada por vacuum." -#: utils/misc/guc_tables.c:2431 +#: utils/misc/guc_tables.c:2537 msgid "Vacuum cost amount available before napping." msgstr "Costo de Vacuum disponible antes de descansar." -#: utils/misc/guc_tables.c:2441 +#: utils/misc/guc_tables.c:2547 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Costo de Vacuum disponible antes de descansar, para autovacuum." -#: utils/misc/guc_tables.c:2451 +#: utils/misc/guc_tables.c:2557 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "Define la cantidad máxima de archivos abiertos por cada subproceso." -#: utils/misc/guc_tables.c:2464 +#: utils/misc/guc_tables.c:2570 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Define la cantidad máxima de transacciones preparadas simultáneas." -#: utils/misc/guc_tables.c:2475 +#: utils/misc/guc_tables.c:2581 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Define el OID mínimo para hacer seguimiento de locks." -#: utils/misc/guc_tables.c:2476 +#: utils/misc/guc_tables.c:2582 msgid "Is used to avoid output on system tables." msgstr "Se usa para evitar salida excesiva por tablas de sistema." -#: utils/misc/guc_tables.c:2485 +#: utils/misc/guc_tables.c:2591 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Define el OID de una tabla con trazado incondicional de locks." -#: utils/misc/guc_tables.c:2497 +#: utils/misc/guc_tables.c:2603 msgid "Sets the maximum allowed duration of any statement." msgstr "Define la duración máxima permitida de sentencias." -#: utils/misc/guc_tables.c:2498 utils/misc/guc_tables.c:2509 -#: utils/misc/guc_tables.c:2520 utils/misc/guc_tables.c:2531 +#: utils/misc/guc_tables.c:2604 utils/misc/guc_tables.c:2615 +#: utils/misc/guc_tables.c:2626 utils/misc/guc_tables.c:2637 +#: utils/misc/guc_tables.c:2648 msgid "A value of 0 turns off the timeout." msgstr "Un valor de 0 desactiva el máximo." -#: utils/misc/guc_tables.c:2508 +#: utils/misc/guc_tables.c:2614 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Define la duración máxima permitida de cualquier espera por un lock." -#: utils/misc/guc_tables.c:2519 +#: utils/misc/guc_tables.c:2625 msgid "Sets the maximum allowed idle time between queries, when in a transaction." msgstr "Define el tiempo máximo permitido de inactividad entre consultas, cuando están dentro de una transacción." -#: utils/misc/guc_tables.c:2530 +#: utils/misc/guc_tables.c:2636 +msgid "Sets the maximum allowed duration of any transaction within a session (not a prepared transaction)." +msgstr "Define la duración máxima permitida cualquier transacción dentro de una sesión (no una transacción preparada)." + +#: utils/misc/guc_tables.c:2647 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." msgstr "Define el tiempo máximo permitido de inactividad entre consultas, cuando no están dentro de una transacción." -#: utils/misc/guc_tables.c:2541 +#: utils/misc/guc_tables.c:2658 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "Mínima edad a la cual VACUUM debería congelar (freeze) una fila de una tabla." -#: utils/misc/guc_tables.c:2551 +#: utils/misc/guc_tables.c:2668 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "Edad a la cual VACUUM debería recorrer una tabla completa para congelar (freeze) las filas." -#: utils/misc/guc_tables.c:2561 +#: utils/misc/guc_tables.c:2678 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "Mínima edad a la cual VACUUM debería congelar (freeze) el multixact en una fila." -#: utils/misc/guc_tables.c:2571 +#: utils/misc/guc_tables.c:2688 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "Edad de multixact a la cual VACUUM debería recorrer una tabla completa para congelar (freeze) las filas." -#: utils/misc/guc_tables.c:2581 +#: utils/misc/guc_tables.c:2698 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." -msgstr "Edad a la cual VACUUM debería activar el modo failsafe para evitar pérdida de servicio por reciclaje (wraparound)." +msgstr "Edad a la cual VACUUM debería activar el modo failsafe para evitar pérdida de servicio por â€wraparoundâ€." -#: utils/misc/guc_tables.c:2590 +#: utils/misc/guc_tables.c:2707 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." -msgstr "Edad de multixact a la cual VACUUM debería activar el modo failsafe para evitar pérdida de servicio por reciclaje (wraparound)." +msgstr "Edad de multixact a la cual VACUUM debería activar el modo failsafe para evitar pérdida de servicio por “wraparoundâ€." -#: utils/misc/guc_tables.c:2603 +#: utils/misc/guc_tables.c:2720 msgid "Sets the maximum number of locks per transaction." -msgstr "Cantidad máxima de candados (locks) por transacción." +msgstr "Cantidad máxima de “locks†por transacción." -#: utils/misc/guc_tables.c:2604 -#, fuzzy -#| msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." -msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction objects per server process or prepared transaction will need to be locked at any one time." -msgstr "El tamaño de la tabla compartida de candados se calcula usando la suposición de que a lo más max_locks_per_transaction * max_connections objetos necesitarán ser bloqueados simultáneamente." +#: utils/misc/guc_tables.c:2721 +msgid "The shared lock table is sized on the assumption that at most \"max_locks_per_transaction\" objects per server process or prepared transaction will need to be locked at any one time." +msgstr "La tabla compartida de “locks†se dimensiona bajo la suposoción que a lo más «max_locks_per_transaction» objetos por cada proceso servidor o transacción preparada necesitarán ser bloqueados en un momento dado." -#: utils/misc/guc_tables.c:2615 +#: utils/misc/guc_tables.c:2732 msgid "Sets the maximum number of predicate locks per transaction." -msgstr "Cantidad máxima de candados (locks) de predicado por transacción." +msgstr "Cantidad máxima de “locks†de predicado por transacción." -#: utils/misc/guc_tables.c:2616 -#, fuzzy -#| msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." -msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction objects per server process or prepared transaction will need to be locked at any one time." -msgstr "El tamaño de la tabla compartida de candados se calcula usando la suposición de que a lo más max_pred_locks_per_transaction * max_connections objetos necesitarán ser bloqueados simultáneamente." +#: utils/misc/guc_tables.c:2733 +msgid "The shared predicate lock table is sized on the assumption that at most \"max_pred_locks_per_transaction\" objects per server process or prepared transaction will need to be locked at any one time." +msgstr "La tabla compartida de “locks†de predicados se dimensiona bajo la suposición de que a lo más «max_pred_locks_per_transaction» objetos por cada proceso servidor o transacción preparada necesitarán ser bloqueados en un momento dado." -#: utils/misc/guc_tables.c:2627 +#: utils/misc/guc_tables.c:2744 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "Cantidad máxima de páginas y tuplas bloqueadas por predicado." -#: utils/misc/guc_tables.c:2628 +#: utils/misc/guc_tables.c:2745 msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." msgstr "Si más que este total de páginas y tuplas en la misma relación están bloqueadas por una conexión, esos locks son reemplazados por un lock a nivel de relación." -#: utils/misc/guc_tables.c:2638 +#: utils/misc/guc_tables.c:2755 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "Cantidad máxima de locks de predicado por página." -#: utils/misc/guc_tables.c:2639 +#: utils/misc/guc_tables.c:2756 msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." msgstr "Si más que este número de tuplas de la misma página están bloqueadas por una conexión, esos locks son reemplazados por un lock a nivel de página." -#: utils/misc/guc_tables.c:2649 +#: utils/misc/guc_tables.c:2766 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Define el tiempo máximo para completar proceso de autentificación." -#: utils/misc/guc_tables.c:2661 -#, fuzzy -#| msgid "Sets the maximum time to wait for WAL replication." +#: utils/misc/guc_tables.c:2778 msgid "Sets the amount of time to wait before authentication on connection startup." -msgstr "Define el tiempo máximo a esperar la replicación de WAL." +msgstr "Define el tiempo máximo a esperar antes de la autentificación al abrir una conexión." + +#: utils/misc/guc_tables.c:2790 +msgid "Sets the maximum number of allocated pages for NOTIFY / LISTEN queue." +msgstr "Cantidad máxima de páginas dedicadas a la cola de NOTIFY / LISTEN." -#: utils/misc/guc_tables.c:2673 +#: utils/misc/guc_tables.c:2800 msgid "Buffer size for reading ahead in the WAL during recovery." -msgstr "" +msgstr "Tamaño de búfer para lectura adelantada de WAL durante la recuperación." -#: utils/misc/guc_tables.c:2674 +#: utils/misc/guc_tables.c:2801 msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." -msgstr "" +msgstr "Máxima distancia que leer adelantado en el WAL para pre-cargar bloques de datos referenciados." -#: utils/misc/guc_tables.c:2684 +#: utils/misc/guc_tables.c:2811 msgid "Sets the size of WAL files held for standby servers." msgstr "Establece el tamaño de los archivos de WAL retenidos para los servidores standby." -#: utils/misc/guc_tables.c:2695 +#: utils/misc/guc_tables.c:2822 msgid "Sets the minimum size to shrink the WAL to." msgstr "Define el tamaño mínimo al cual reducir el WAL." -#: utils/misc/guc_tables.c:2707 +#: utils/misc/guc_tables.c:2834 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Define el tamaño de WAL que desencadena un checkpoint." -#: utils/misc/guc_tables.c:2719 +#: utils/misc/guc_tables.c:2846 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "Define el tiempo máximo entre puntos de control de WAL automáticos." -#: utils/misc/guc_tables.c:2730 +#: utils/misc/guc_tables.c:2857 msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." msgstr "Define el máximo tiempo antes de emitir un advertencia si los checkpoints iniciados a causa del volumen de WAL ocurren con demasiada frecuencia." -#: utils/misc/guc_tables.c:2732 +#: utils/misc/guc_tables.c:2859 msgid "Write a message to the server log if checkpoints caused by the filling of WAL segment files happen more frequently than this amount of time. Zero turns off the warning." -msgstr "" +msgstr "Escribe una advertencia al log del servidor si los checkpoints causados por el llenado de segmentos de WAL occur más frecuentemente que esta cantidad de tiempo. Cero inhabilita la advertencia." -#: utils/misc/guc_tables.c:2745 utils/misc/guc_tables.c:2963 -#: utils/misc/guc_tables.c:3003 +#: utils/misc/guc_tables.c:2872 utils/misc/guc_tables.c:3090 +#: utils/misc/guc_tables.c:3144 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "Número de páginas después del cual las escrituras previamente ejecutadas se sincronizan a disco." -#: utils/misc/guc_tables.c:2756 +#: utils/misc/guc_tables.c:2883 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Búfers en memoria compartida para páginas de WAL." -#: utils/misc/guc_tables.c:2767 +#: utils/misc/guc_tables.c:2884 +msgid "Specify -1 to have this value determined as a fraction of shared_buffers." +msgstr "Especifique -1 para que este valor sea determinado como fracción de shared_buffers." + +#: utils/misc/guc_tables.c:2894 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Tiempo entre sincronizaciones de WAL ejecutadas por el proceso escritor de WAL." -#: utils/misc/guc_tables.c:2778 +#: utils/misc/guc_tables.c:2905 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "Cantidad de WAL escrito por el proceso escritor de WAL que desencadena una sincronización (flush)." -#: utils/misc/guc_tables.c:2789 +#: utils/misc/guc_tables.c:2916 msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "Tamaño mínimo del nuevo archivo para hacer fsync en lugar de escribir WAL." -#: utils/misc/guc_tables.c:2800 +#: utils/misc/guc_tables.c:2927 msgid "Sets the maximum number of simultaneously running WAL sender processes." -msgstr "Define la cantidad máxima de procesos «WAL sender» simultáneos." +msgstr "Define la cantidad máxima de procesos “WAL sender†simultáneos." -#: utils/misc/guc_tables.c:2811 +#: utils/misc/guc_tables.c:2938 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Define la cantidad máxima de slots de replicación definidos simultáneamente." -#: utils/misc/guc_tables.c:2821 +#: utils/misc/guc_tables.c:2948 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "Define el tamaño máximo de WAL que puede ser reservado por slots de replicación." -#: utils/misc/guc_tables.c:2822 +#: utils/misc/guc_tables.c:2949 msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." msgstr "Los slots de replicación serán invalidados, y los segmentos de WAL eliminados o reciclados, si se usa esta cantidad de espacio de disco en WAL." -#: utils/misc/guc_tables.c:2834 +#: utils/misc/guc_tables.c:2961 msgid "Sets the maximum time to wait for WAL replication." msgstr "Define el tiempo máximo a esperar la replicación de WAL." -#: utils/misc/guc_tables.c:2845 +#: utils/misc/guc_tables.c:2972 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "Retardo en microsegundos entre completar una transacción y escribir WAL a disco." -#: utils/misc/guc_tables.c:2857 -#, fuzzy -#| msgid "Sets the maximum number of concurrent connections." -msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." -msgstr "Número máximo de conexiones concurrentes." +#: utils/misc/guc_tables.c:2984 +msgid "Sets the minimum number of concurrent open transactions required before performing \"commit_delay\"." +msgstr "Número mínimo de transacciones abiertas concurrentes antes de efectuar «commit_delay»." -#: utils/misc/guc_tables.c:2868 +#: utils/misc/guc_tables.c:2995 msgid "Sets the number of digits displayed for floating-point values." msgstr "Ajustar el número de dígitos mostrados para valores de coma flotante." -#: utils/misc/guc_tables.c:2869 +#: utils/misc/guc_tables.c:2996 msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." msgstr "Esto afecta los tipos real, de doble precisión, y geométricos. Un valor del parámetro cero o negativo se agrega a la cantidad estándar de dígitos (FLT_DIG o DBL_DIG, según sea apropiado). Cualquier valor mayor que cero selecciona el modo de salida preciso." -#: utils/misc/guc_tables.c:2881 +#: utils/misc/guc_tables.c:3008 msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." msgstr "Establece el tiempo mínimo de ejecución a partir del cual se registra una muestra de la sentencia. El muestreo es determinado por log_statement_sample_rate." -#: utils/misc/guc_tables.c:2884 +#: utils/misc/guc_tables.c:3011 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "Cero registra una muestra de todas las consultas. -1 desactiva esta funcionalidad." -#: utils/misc/guc_tables.c:2894 +#: utils/misc/guc_tables.c:3021 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "Establece el tiempo mínimo de ejecución a partir del cual se registran todas las sentencias." -#: utils/misc/guc_tables.c:2896 +#: utils/misc/guc_tables.c:3023 msgid "Zero prints all queries. -1 turns this feature off." msgstr "Cero imprime todas las consultas. -1 desactiva esta funcionalidad." -#: utils/misc/guc_tables.c:2906 +#: utils/misc/guc_tables.c:3033 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "Tiempo mínimo de ejecución a partir del cual se registran las acciones de autovacuum." -#: utils/misc/guc_tables.c:2908 +#: utils/misc/guc_tables.c:3035 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "Cero registra todas las acciones. -1 desactiva el registro de autovacuum." -#: utils/misc/guc_tables.c:2918 +#: utils/misc/guc_tables.c:3045 msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." msgstr "Define el largo máximo en bytes de valores de parámetros «bind» enviados al log al registrar sentencias." -#: utils/misc/guc_tables.c:2920 utils/misc/guc_tables.c:2932 +#: utils/misc/guc_tables.c:3047 utils/misc/guc_tables.c:3059 msgid "-1 to print values in full." msgstr "-1 para mostrar los valores completos." -#: utils/misc/guc_tables.c:2930 +#: utils/misc/guc_tables.c:3057 msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." msgstr "Define el largo máximo en bytes de valores de parámetros «bind» enviados al log, en caso de error." -#: utils/misc/guc_tables.c:2942 +#: utils/misc/guc_tables.c:3069 msgid "Background writer sleep time between rounds." msgstr "Tiempo de descanso entre rondas del background writer" -#: utils/misc/guc_tables.c:2953 +#: utils/misc/guc_tables.c:3080 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "Número máximo de páginas LRU a escribir en cada ronda del background writer" -#: utils/misc/guc_tables.c:2976 +#: utils/misc/guc_tables.c:3103 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "Cantidad máxima de peticiones simultáneas que pueden ser manejadas eficientemente por el sistema de disco." -#: utils/misc/guc_tables.c:2990 -msgid "A variant of effective_io_concurrency that is used for maintenance work." -msgstr "Una variante de effective_io_concurrency que se usa para tareas de mantención." +#: utils/misc/guc_tables.c:3117 +msgid "A variant of \"effective_io_concurrency\" that is used for maintenance work." +msgstr "Una variante de «effective_io_concurrency» que se usa para tareas de mantención." + +#: utils/misc/guc_tables.c:3132 +msgid "Limit on the size of data reads and writes." +msgstr "Límite del tamaño de lecturas y escrituras de datos." -#: utils/misc/guc_tables.c:3016 +#: utils/misc/guc_tables.c:3157 msgid "Maximum number of concurrent worker processes." msgstr "Número máximo de procesos ayudantes concurrentes." -#: utils/misc/guc_tables.c:3028 +#: utils/misc/guc_tables.c:3169 msgid "Maximum number of logical replication worker processes." msgstr "Número máximo de procesos ayudantes de replicación lógica." -#: utils/misc/guc_tables.c:3040 +#: utils/misc/guc_tables.c:3181 msgid "Maximum number of table synchronization workers per subscription." msgstr "Número máximo de procesos ayudantes de sincronización por suscripción." -#: utils/misc/guc_tables.c:3052 -#, fuzzy -#| msgid "Maximum number of table synchronization workers per subscription." +#: utils/misc/guc_tables.c:3193 msgid "Maximum number of parallel apply workers per subscription." -msgstr "Número máximo de procesos ayudantes de sincronización por suscripción." +msgstr "Número máximo de procesos ayudantes de “apply†por suscripción." -#: utils/misc/guc_tables.c:3062 -#, fuzzy -#| msgid "Sets the maximum time to wait for WAL replication." +#: utils/misc/guc_tables.c:3203 msgid "Sets the amount of time to wait before forcing log file rotation." -msgstr "Define el tiempo máximo a esperar la replicación de WAL." +msgstr "Define el tiempo a esperar antes de forzar la rotación del archivo de registro del servidor." -#: utils/misc/guc_tables.c:3074 -#, fuzzy -#| msgid "Sets the maximum WAL size that can be reserved by replication slots." +#: utils/misc/guc_tables.c:3215 msgid "Sets the maximum size a log file can reach before being rotated." -msgstr "Define el tamaño máximo de WAL que puede ser reservado por slots de replicación." +msgstr "Define el tamaño máximo que un archivo de registro del servidor puede alcanzar antes de ser rotado." -#: utils/misc/guc_tables.c:3086 +#: utils/misc/guc_tables.c:3227 msgid "Shows the maximum number of function arguments." msgstr "Muestra la cantidad máxima de argumentos de funciones." -#: utils/misc/guc_tables.c:3097 +#: utils/misc/guc_tables.c:3238 msgid "Shows the maximum number of index keys." msgstr "Muestra la cantidad máxima de claves de índices." -#: utils/misc/guc_tables.c:3108 +#: utils/misc/guc_tables.c:3249 msgid "Shows the maximum identifier length." msgstr "Muestra el largo máximo de identificadores." -#: utils/misc/guc_tables.c:3119 +#: utils/misc/guc_tables.c:3260 msgid "Shows the size of a disk block." msgstr "Muestra el tamaño de un bloque de disco." -#: utils/misc/guc_tables.c:3130 +#: utils/misc/guc_tables.c:3271 msgid "Shows the number of pages per disk file." msgstr "Muestra el número de páginas por archivo en disco." -#: utils/misc/guc_tables.c:3141 +#: utils/misc/guc_tables.c:3282 msgid "Shows the block size in the write ahead log." msgstr "Muestra el tamaño de bloque en el write-ahead log." -#: utils/misc/guc_tables.c:3152 +#: utils/misc/guc_tables.c:3293 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "Define el tiempo a esperar antes de reintentar obtener WAL después de un intento fallido." -#: utils/misc/guc_tables.c:3164 +#: utils/misc/guc_tables.c:3305 msgid "Shows the size of write ahead log segments." msgstr "Muestra el tamaño de los segmentos de WAL." -#: utils/misc/guc_tables.c:3177 +#: utils/misc/guc_tables.c:3318 +msgid "Time for which WAL summary files should be kept." +msgstr "Período durante el cual se deberían conservar los archivos de sumarización de WAL." + +#: utils/misc/guc_tables.c:3331 msgid "Time to sleep between autovacuum runs." msgstr "Tiempo de descanso entre ejecuciones de autovacuum." -#: utils/misc/guc_tables.c:3187 +#: utils/misc/guc_tables.c:3341 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Número mínimo de updates o deletes antes de ejecutar vacuum." -#: utils/misc/guc_tables.c:3196 +#: utils/misc/guc_tables.c:3350 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." msgstr "Número mínimo de inserciones de tuplas antes de ejecutar vacuum, o -1 para desactivar vacuums por inserciones." -#: utils/misc/guc_tables.c:3205 +#: utils/misc/guc_tables.c:3359 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "Número mínimo de inserciones, actualizaciones y eliminaciones de tuplas antes de ejecutar analyze." -#: utils/misc/guc_tables.c:3215 +#: utils/misc/guc_tables.c:3369 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." -msgstr "Edad a la cual aplicar VACUUM automáticamente a una tabla para prevenir problemas por reciclaje de ID de transacción." +msgstr "Edad a la cual aplicar VACUUM automáticamente a una tabla para prevenir problemas por “wraparound†de ID de transacción." -#: utils/misc/guc_tables.c:3227 +#: utils/misc/guc_tables.c:3381 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." -msgstr "Edad de multixact a la cual aplicar VACUUM automáticamente a una tabla para prevenir problemas por reciclaje de ID de multixacts." +msgstr "Edad de multixact a la cual aplicar VACUUM automáticamente a una tabla para prevenir problemas por “wraparound†de ID de multixacts." -#: utils/misc/guc_tables.c:3237 +#: utils/misc/guc_tables.c:3391 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "Define la cantidad máxima de procesos «autovacuum worker» simultáneos." -#: utils/misc/guc_tables.c:3247 +#: utils/misc/guc_tables.c:3401 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "Cantidad máxima de procesos ayudantes paralelos por operación de mantención." -#: utils/misc/guc_tables.c:3257 +#: utils/misc/guc_tables.c:3411 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Cantidad máxima de locks de predicado por nodo de ejecución." -#: utils/misc/guc_tables.c:3268 +#: utils/misc/guc_tables.c:3422 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "Define la cantidad máxima de procesos ayudantes que pueden estar activos en un momento dado." -#: utils/misc/guc_tables.c:3279 +#: utils/misc/guc_tables.c:3433 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "Establece el límite de memoria que cada proceso «autovacuum worker» usará." -#: utils/misc/guc_tables.c:3290 -msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." -msgstr "Tiempo antes de que un snapshot sea demasiado antiguo para leer páginas después de que el snapshot fue tomado." - -#: utils/misc/guc_tables.c:3291 -msgid "A value of -1 disables this feature." -msgstr "El valor -1 desactiva esta característica." - -#: utils/misc/guc_tables.c:3301 +#: utils/misc/guc_tables.c:3444 msgid "Time between issuing TCP keepalives." msgstr "Tiempo entre cada emisión de TCP keepalive." -#: utils/misc/guc_tables.c:3302 utils/misc/guc_tables.c:3313 -#: utils/misc/guc_tables.c:3437 +#: utils/misc/guc_tables.c:3445 utils/misc/guc_tables.c:3456 +#: utils/misc/guc_tables.c:3580 msgid "A value of 0 uses the system default." msgstr "Un valor 0 usa el valor por omisión del sistema." -#: utils/misc/guc_tables.c:3312 +#: utils/misc/guc_tables.c:3455 msgid "Time between TCP keepalive retransmits." msgstr "Tiempo entre retransmisiones TCP keepalive." -#: utils/misc/guc_tables.c:3323 +#: utils/misc/guc_tables.c:3466 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "La renegociación SSL ya no está soportada; esto sólo puede ser 0." -#: utils/misc/guc_tables.c:3334 +#: utils/misc/guc_tables.c:3477 msgid "Maximum number of TCP keepalive retransmits." msgstr "Cantidad máxima de retransmisiones TCP keepalive." -#: utils/misc/guc_tables.c:3335 +#: utils/misc/guc_tables.c:3478 msgid "Number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." -msgstr "" +msgstr "Número de retransmisiones consecutivas de keepalive que pueden ser perdidas antes que una conexión se considere muerta. Cero usa el valor por omisión del sistema." -#: utils/misc/guc_tables.c:3346 +#: utils/misc/guc_tables.c:3489 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Define el máximo de resultados permitidos por búsquedas exactas con GIN." -#: utils/misc/guc_tables.c:3357 +#: utils/misc/guc_tables.c:3500 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "Define la suposición del optimizador sobre el tamaño total de los caches de datos." -#: utils/misc/guc_tables.c:3358 +#: utils/misc/guc_tables.c:3501 msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." msgstr "Esto es, el tamaño total de caches (cache del kernel y búfers compartidos) usados por archivos de datos de PostgreSQL. Esto se mide en páginas de disco, que normalmente son de 8 kB cada una." -#: utils/misc/guc_tables.c:3369 +#: utils/misc/guc_tables.c:3512 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "Define la cantidad mínima de datos en una tabla para un recorrido paralelo." -#: utils/misc/guc_tables.c:3370 +#: utils/misc/guc_tables.c:3513 msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." msgstr "Si el planificador estima que leerá un número de páginas de tabla demasiado pequeñas para alcanzar este límite, no se considerará una búsqueda paralela." -#: utils/misc/guc_tables.c:3380 +#: utils/misc/guc_tables.c:3523 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "Define la cantidad mínima de datos en un índice para un recorrido paralelo." -#: utils/misc/guc_tables.c:3381 +#: utils/misc/guc_tables.c:3524 msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." msgstr "Si el planificador estima que leerá un número de páginas de índice demasiado pequeñas para alcanzar este límite, no se considerará una búsqueda paralela." -#: utils/misc/guc_tables.c:3392 +#: utils/misc/guc_tables.c:3535 msgid "Shows the server version as an integer." msgstr "Muestra la versión del servidor como un número entero." -#: utils/misc/guc_tables.c:3403 +#: utils/misc/guc_tables.c:3546 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "Registra el uso de archivos temporales que crezcan más allá de este número de kilobytes." -#: utils/misc/guc_tables.c:3404 +#: utils/misc/guc_tables.c:3547 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "Cero registra todos los archivos. El valor por omisión es -1 (lo cual desactiva el registro)." -#: utils/misc/guc_tables.c:3414 +#: utils/misc/guc_tables.c:3557 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Tamaño reservado para pg_stat_activity.query, en bytes." -#: utils/misc/guc_tables.c:3425 +#: utils/misc/guc_tables.c:3568 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Define el tamaño máximo de la lista de pendientes de un índice GIN." -#: utils/misc/guc_tables.c:3436 +#: utils/misc/guc_tables.c:3579 msgid "TCP user timeout." msgstr "Tiempo de expiración de TCP." -#: utils/misc/guc_tables.c:3447 +#: utils/misc/guc_tables.c:3590 msgid "The size of huge page that should be requested." msgstr "El tamaño de huge page que se debería solicitar." -#: utils/misc/guc_tables.c:3458 +#: utils/misc/guc_tables.c:3601 msgid "Aggressively flush system caches for debugging purposes." msgstr "Escribir cachés de sistema de forma agresiva para propósitos de depuración." -#: utils/misc/guc_tables.c:3481 +#: utils/misc/guc_tables.c:3624 msgid "Sets the time interval between checks for disconnection while running queries." msgstr "Establece el intervalo entre revisiones de desconexión mientras se ejecutan consultas." -#: utils/misc/guc_tables.c:3492 +#: utils/misc/guc_tables.c:3635 msgid "Time between progress updates for long-running startup operations." msgstr "Tiempo a esperar entre actualizaciones para operaciones largas durante el inicio." -#: utils/misc/guc_tables.c:3494 -#, fuzzy -#| msgid "Zero prints all queries. -1 turns this feature off." +#: utils/misc/guc_tables.c:3637 msgid "0 turns this feature off." -msgstr "Cero imprime todas las consultas. -1 desactiva esta funcionalidad." +msgstr "Cero desactiva esta característica." -#: utils/misc/guc_tables.c:3504 -#, fuzzy -#| msgid "Sets the seed for random-number generation." +#: utils/misc/guc_tables.c:3647 msgid "Sets the iteration count for SCRAM secret generation." -msgstr "Semilla para la generación de números aleatorios." +msgstr "Define la cantidad de iteraciones para generación de secretos SCRAM." -#: utils/misc/guc_tables.c:3524 +#: utils/misc/guc_tables.c:3667 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "Estimación del costo de una página leída secuencialmente." -#: utils/misc/guc_tables.c:3535 +#: utils/misc/guc_tables.c:3678 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "Estimación del costo de una página leída no secuencialmente." -#: utils/misc/guc_tables.c:3546 +#: utils/misc/guc_tables.c:3689 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "Estimación del costo de procesar cada tupla (fila)." -#: utils/misc/guc_tables.c:3557 +#: utils/misc/guc_tables.c:3700 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "Estimación del costo de procesar cada fila de índice durante un recorrido de índice." -#: utils/misc/guc_tables.c:3568 +#: utils/misc/guc_tables.c:3711 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "Estimación del costo de procesar cada operador o llamada a función." -#: utils/misc/guc_tables.c:3579 +#: utils/misc/guc_tables.c:3722 msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." msgstr "Estimación del costo de pasar cada tupla (fila) desde un proceso ayudante al proceso servidor principal." -#: utils/misc/guc_tables.c:3590 +#: utils/misc/guc_tables.c:3733 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "Estimación del costo de lanzar procesos ayudantes para consultas en paralelo." -#: utils/misc/guc_tables.c:3602 +#: utils/misc/guc_tables.c:3745 msgid "Perform JIT compilation if query is more expensive." msgstr "Ejecutar compilación JIT si la consulta es más cara." -#: utils/misc/guc_tables.c:3603 +#: utils/misc/guc_tables.c:3746 msgid "-1 disables JIT compilation." msgstr "-1 inhabilita compilación JIT." -#: utils/misc/guc_tables.c:3613 +#: utils/misc/guc_tables.c:3756 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "Optimizar funciones compiladas en tiempo de ejecución (JIT) si la consulta es más cara." -#: utils/misc/guc_tables.c:3614 +#: utils/misc/guc_tables.c:3757 msgid "-1 disables optimization." msgstr "-1 inhabilita la optimización." -#: utils/misc/guc_tables.c:3624 +#: utils/misc/guc_tables.c:3767 msgid "Perform JIT inlining if query is more expensive." msgstr "Ejecutar «inlining» JIT si la consulta es más cara." -#: utils/misc/guc_tables.c:3625 +#: utils/misc/guc_tables.c:3768 msgid "-1 disables inlining." msgstr "-1 inhabilita el «inlining»." -#: utils/misc/guc_tables.c:3635 +#: utils/misc/guc_tables.c:3778 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "Estimación de la fracción de filas de un cursor que serán extraídas." -#: utils/misc/guc_tables.c:3647 -#, fuzzy -#| msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." +#: utils/misc/guc_tables.c:3790 msgid "Sets the planner's estimate of the average size of a recursive query's working table." -msgstr "Estimación de la fracción de filas de un cursor que serán extraídas." +msgstr "Estimación del tamaño promedio de la tabla de trabajo de una consulta recursiva." -#: utils/misc/guc_tables.c:3659 +#: utils/misc/guc_tables.c:3802 msgid "GEQO: selective pressure within the population." msgstr "GEQO: presión selectiva dentro de la población." -#: utils/misc/guc_tables.c:3670 +#: utils/misc/guc_tables.c:3813 msgid "GEQO: seed for random path selection." msgstr "GEQO: semilla para la selección aleatoria de caminos." -#: utils/misc/guc_tables.c:3681 -msgid "Multiple of work_mem to use for hash tables." -msgstr "Múltiplo de work_mem para el uso de tablas de hash." +#: utils/misc/guc_tables.c:3824 +msgid "Multiple of \"work_mem\" to use for hash tables." +msgstr "Múltiplo de «work_mem» para el uso de tablas de hash." -#: utils/misc/guc_tables.c:3692 +#: utils/misc/guc_tables.c:3835 msgid "Multiple of the average buffer usage to free per round." msgstr "Múltiplo del uso promedio de búfers que liberar en cada ronda." -#: utils/misc/guc_tables.c:3702 +#: utils/misc/guc_tables.c:3845 msgid "Sets the seed for random-number generation." msgstr "Semilla para la generación de números aleatorios." -#: utils/misc/guc_tables.c:3713 +#: utils/misc/guc_tables.c:3856 msgid "Vacuum cost delay in milliseconds." msgstr "Tiempo de descanso de vacuum en milisegundos." -#: utils/misc/guc_tables.c:3724 +#: utils/misc/guc_tables.c:3867 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Tiempo de descanso de vacuum en milisegundos, para autovacuum." -#: utils/misc/guc_tables.c:3735 +#: utils/misc/guc_tables.c:3878 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "Número de updates o deletes de tuplas antes de ejecutar un vacuum, como fracción de reltuples." -#: utils/misc/guc_tables.c:3745 +#: utils/misc/guc_tables.c:3888 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "Número de inserts de tuplas antes de ejecutar un vacuum, como fracción de reltuples." -#: utils/misc/guc_tables.c:3755 +#: utils/misc/guc_tables.c:3898 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "Número mínimo de inserciones, actualizaciones y eliminaciones de tuplas antes de ejecutar analyze, como fracción de reltuples." -#: utils/misc/guc_tables.c:3765 +#: utils/misc/guc_tables.c:3908 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." -msgstr "Tiempo utilizado en escribir páginas «sucias» durante los puntos de control, medido como fracción del intervalo del punto de control." +msgstr "Tiempo utilizado en escribir páginas «sucias» durante los puntos de control, medido como fracción del intervalo del checkpoint." -#: utils/misc/guc_tables.c:3775 -msgid "Fraction of statements exceeding log_min_duration_sample to be logged." -msgstr "Fracción de sentencias que duren más de log_min_duration_sample a ser registradas." +#: utils/misc/guc_tables.c:3918 +msgid "Fraction of statements exceeding \"log_min_duration_sample\" to be logged." +msgstr "Fracción de sentencias que duren más de «log_min_duration_sample» a ser registradas." -#: utils/misc/guc_tables.c:3776 +#: utils/misc/guc_tables.c:3919 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "Use un valor entre 0.0 (no registrar nunca) y 1.0 (registrar siempre)." -#: utils/misc/guc_tables.c:3785 +#: utils/misc/guc_tables.c:3928 msgid "Sets the fraction of transactions from which to log all statements." msgstr "Define la fracción de transacciones desde la cual registrar en el log todas las sentencias." -#: utils/misc/guc_tables.c:3786 +#: utils/misc/guc_tables.c:3929 msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." msgstr "Use un valor entre 0.0 (nunca registrar) y 1.0 (registrar todas las sentencias de todas las transacciones)." -#: utils/misc/guc_tables.c:3805 +#: utils/misc/guc_tables.c:3948 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "Orden de shell que se invocará para archivar un archivo WAL." -#: utils/misc/guc_tables.c:3806 +#: utils/misc/guc_tables.c:3949 msgid "This is used only if \"archive_library\" is not set." msgstr "Esto sólo se utiliza si «archive_library» no está definido." -#: utils/misc/guc_tables.c:3815 -#, fuzzy -#| msgid "Sets the shell command that will be called to archive a WAL file." +#: utils/misc/guc_tables.c:3958 msgid "Sets the library that will be called to archive a WAL file." -msgstr "Orden de shell que se invocará para archivar un archivo WAL." +msgstr "Biblioteca que se invocará para archivar un archivo WAL." -#: utils/misc/guc_tables.c:3816 +#: utils/misc/guc_tables.c:3959 msgid "An empty string indicates that \"archive_command\" should be used." msgstr "Una cadena vacía indica que «archive_command» debería usarse." -#: utils/misc/guc_tables.c:3825 +#: utils/misc/guc_tables.c:3968 msgid "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "Orden de shell que se invocará para recuperar un archivo WAL archivado." -#: utils/misc/guc_tables.c:3835 +#: utils/misc/guc_tables.c:3978 msgid "Sets the shell command that will be executed at every restart point." msgstr "Orden de shell que se invocará en cada «restart point»." -#: utils/misc/guc_tables.c:3845 +#: utils/misc/guc_tables.c:3988 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "Orden de shell que se invocará una vez al terminar la recuperación." -#: utils/misc/guc_tables.c:3855 +#: utils/misc/guc_tables.c:3998 msgid "Specifies the timeline to recover into." msgstr "Especifica la línea de tiempo a la cual recuperar." -#: utils/misc/guc_tables.c:3865 +#: utils/misc/guc_tables.c:4008 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "Defina a «immediate» para terminar la recuperación en cuando se alcance el estado consistente." -#: utils/misc/guc_tables.c:3874 +#: utils/misc/guc_tables.c:4017 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "Define el ID de transacción hasta el cual se ejecutará la recuperación." -#: utils/misc/guc_tables.c:3883 +#: utils/misc/guc_tables.c:4026 msgid "Sets the time stamp up to which recovery will proceed." msgstr "Define la marca de tiempo hasta la cual se ejecutará la recuperación." -#: utils/misc/guc_tables.c:3892 +#: utils/misc/guc_tables.c:4035 msgid "Sets the named restore point up to which recovery will proceed." msgstr "Define el nombre del punto de restauración hasta el cual se ejecutará la recuperación." -#: utils/misc/guc_tables.c:3901 +#: utils/misc/guc_tables.c:4044 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "Define el LSN de la ubicación de WAL hasta la cual se ejecutará la recuperación." -#: utils/misc/guc_tables.c:3911 +#: utils/misc/guc_tables.c:4054 msgid "Sets the connection string to be used to connect to the sending server." msgstr "Define la cadena de conexión que se usará para conectarse al servidor de origen." -#: utils/misc/guc_tables.c:3922 +#: utils/misc/guc_tables.c:4065 msgid "Sets the name of the replication slot to use on the sending server." msgstr "Define el nombre del slot de replicación a utilizar en el servidor de origen." -#: utils/misc/guc_tables.c:3932 +#: utils/misc/guc_tables.c:4075 msgid "Sets the client's character set encoding." msgstr "Codificación del juego de caracteres del cliente." -#: utils/misc/guc_tables.c:3943 +#: utils/misc/guc_tables.c:4086 msgid "Controls information prefixed to each log line." msgstr "Controla el prefijo que antecede cada línea registrada." -#: utils/misc/guc_tables.c:3944 +#: utils/misc/guc_tables.c:4087 msgid "If blank, no prefix is used." msgstr "si está en blanco, no se usa prefijo." -#: utils/misc/guc_tables.c:3953 +#: utils/misc/guc_tables.c:4096 msgid "Sets the time zone to use in log messages." msgstr "Define el huso horario usando en los mensajes registrados." -#: utils/misc/guc_tables.c:3963 +#: utils/misc/guc_tables.c:4106 msgid "Sets the display format for date and time values." msgstr "Formato de salida para valores de horas y fechas." -#: utils/misc/guc_tables.c:3964 +#: utils/misc/guc_tables.c:4107 msgid "Also controls interpretation of ambiguous date inputs." msgstr "También controla la interpretación de entradas ambiguas de fechas" -#: utils/misc/guc_tables.c:3975 +#: utils/misc/guc_tables.c:4118 msgid "Sets the default table access method for new tables." msgstr "Define el método de acceso a tablas por omisión para nuevas tablas." -#: utils/misc/guc_tables.c:3986 +#: utils/misc/guc_tables.c:4129 msgid "Sets the default tablespace to create tables and indexes in." msgstr "Define el tablespace en el cual crear tablas e índices." -#: utils/misc/guc_tables.c:3987 +#: utils/misc/guc_tables.c:4130 msgid "An empty string selects the database's default tablespace." msgstr "Una cadena vacía especifica el tablespace por omisión de la base de datos." -#: utils/misc/guc_tables.c:3997 +#: utils/misc/guc_tables.c:4140 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "Define el/los tablespace/s en el cual crear tablas temporales y archivos de ordenamiento." -#: utils/misc/guc_tables.c:4008 +#: utils/misc/guc_tables.c:4151 msgid "Sets whether a CREATEROLE user automatically grants the role to themselves, and with which options." -msgstr "" +msgstr "define si un rol con CREATEROLE automáticamente se otorga ese rol a si mismo, y con qué opciones." -#: utils/misc/guc_tables.c:4020 +#: utils/misc/guc_tables.c:4163 msgid "Sets the path for dynamically loadable modules." msgstr "Ruta para módulos dinámicos." -#: utils/misc/guc_tables.c:4021 +#: utils/misc/guc_tables.c:4164 msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." msgstr "Si se necesita abrir un módulo dinámico y el nombre especificado no tiene un componente de directorio (es decir, no contiene un slash), el sistema buscará el archivo especificado en esta ruta." -#: utils/misc/guc_tables.c:4034 +#: utils/misc/guc_tables.c:4177 msgid "Sets the location of the Kerberos server key file." msgstr "Ubicación del archivo de llave del servidor Kerberos." -#: utils/misc/guc_tables.c:4045 +#: utils/misc/guc_tables.c:4188 msgid "Sets the Bonjour service name." msgstr "Nombre del servicio Bonjour." -#: utils/misc/guc_tables.c:4057 -msgid "Shows the collation order locale." -msgstr "Configuración regional de ordenamiento de cadenas (collation)." - -#: utils/misc/guc_tables.c:4068 -msgid "Shows the character classification and case conversion locale." -msgstr "Configuración regional de clasificación de caracteres y conversión de mayúsculas." - -#: utils/misc/guc_tables.c:4079 +#: utils/misc/guc_tables.c:4198 msgid "Sets the language in which messages are displayed." msgstr "Idioma en el que se despliegan los mensajes." -#: utils/misc/guc_tables.c:4089 +#: utils/misc/guc_tables.c:4208 msgid "Sets the locale for formatting monetary amounts." msgstr "Configuración regional para formatos de moneda." -#: utils/misc/guc_tables.c:4099 +#: utils/misc/guc_tables.c:4218 msgid "Sets the locale for formatting numbers." msgstr "Configuración regional para formatos de números." -#: utils/misc/guc_tables.c:4109 +#: utils/misc/guc_tables.c:4228 msgid "Sets the locale for formatting date and time values." msgstr "Configuración regional para formatos de horas y fechas." -#: utils/misc/guc_tables.c:4119 +#: utils/misc/guc_tables.c:4238 msgid "Lists shared libraries to preload into each backend." msgstr "Bibliotecas compartidas a precargar en cada proceso." -#: utils/misc/guc_tables.c:4130 +#: utils/misc/guc_tables.c:4249 msgid "Lists shared libraries to preload into server." msgstr "Bibliotecas compartidas a precargar en el servidor." -#: utils/misc/guc_tables.c:4141 +#: utils/misc/guc_tables.c:4260 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "Bibliotecas compartidas no privilegiadas a precargar en cada proceso." -#: utils/misc/guc_tables.c:4152 +#: utils/misc/guc_tables.c:4271 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "Orden de búsqueda en schemas para nombres que no especifican schema." -#: utils/misc/guc_tables.c:4164 +#: utils/misc/guc_tables.c:4283 msgid "Shows the server (database) character set encoding." msgstr "Muestra la codificación de caracteres del servidor (base de datos)." -#: utils/misc/guc_tables.c:4176 +#: utils/misc/guc_tables.c:4295 msgid "Shows the server version." msgstr "Versión del servidor." -#: utils/misc/guc_tables.c:4188 +#: utils/misc/guc_tables.c:4307 msgid "Sets the current role." msgstr "Define el rol actual." -#: utils/misc/guc_tables.c:4200 +#: utils/misc/guc_tables.c:4319 msgid "Sets the session user name." msgstr "Define el nombre del usuario de sesión." -#: utils/misc/guc_tables.c:4211 +#: utils/misc/guc_tables.c:4330 msgid "Sets the destination for server log output." msgstr "Define el destino de la salida del registro del servidor." -#: utils/misc/guc_tables.c:4212 +#: utils/misc/guc_tables.c:4331 msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." -msgstr "" +msgstr "Son aceptables combinaciones de «stderr», «syslog», «csvlog», «jsonlog» y «eventlog», dependendiendo de la plataforma." -#: utils/misc/guc_tables.c:4223 +#: utils/misc/guc_tables.c:4342 msgid "Sets the destination directory for log files." msgstr "Define el directorio de destino de los archivos del registro del servidor." -#: utils/misc/guc_tables.c:4224 +#: utils/misc/guc_tables.c:4343 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "Puede ser una ruta relativa al directorio de datos o una ruta absoluta." -#: utils/misc/guc_tables.c:4234 +#: utils/misc/guc_tables.c:4353 msgid "Sets the file name pattern for log files." msgstr "Define el patrón para los nombres de archivo del registro del servidor." -#: utils/misc/guc_tables.c:4245 +#: utils/misc/guc_tables.c:4364 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "Nombre de programa para identificar PostgreSQL en mensajes de syslog." -#: utils/misc/guc_tables.c:4256 +#: utils/misc/guc_tables.c:4375 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "Nombre de programa para identificar PostgreSQL en mensajes del log de eventos." -#: utils/misc/guc_tables.c:4267 +#: utils/misc/guc_tables.c:4386 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "Huso horario para desplegar e interpretar valores de tiempo." -#: utils/misc/guc_tables.c:4277 +#: utils/misc/guc_tables.c:4396 msgid "Selects a file of time zone abbreviations." msgstr "Selecciona un archivo de abreviaciones de huso horario." -#: utils/misc/guc_tables.c:4287 +#: utils/misc/guc_tables.c:4406 msgid "Sets the owning group of the Unix-domain socket." msgstr "Grupo dueño del socket de dominio Unix." -#: utils/misc/guc_tables.c:4288 +#: utils/misc/guc_tables.c:4407 msgid "The owning user of the socket is always the user that starts the server." msgstr "El usuario dueño del socket siempre es el usuario que inicia el servidor." -#: utils/misc/guc_tables.c:4298 +#: utils/misc/guc_tables.c:4417 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Directorios donde se crearán los sockets de dominio Unix." -#: utils/misc/guc_tables.c:4309 +#: utils/misc/guc_tables.c:4428 msgid "Sets the host name or IP address(es) to listen to." msgstr "Define el nombre de anfitrión o dirección IP en la cual escuchar." -#: utils/misc/guc_tables.c:4324 +#: utils/misc/guc_tables.c:4443 msgid "Sets the server's data directory." msgstr "Define la ubicación del directorio de datos." -#: utils/misc/guc_tables.c:4335 +#: utils/misc/guc_tables.c:4454 msgid "Sets the server's main configuration file." msgstr "Define la ubicación del archivo principal de configuración del servidor." -#: utils/misc/guc_tables.c:4346 +#: utils/misc/guc_tables.c:4465 msgid "Sets the server's \"hba\" configuration file." msgstr "Define la ubicación del archivo de configuración «hba» del servidor." -#: utils/misc/guc_tables.c:4357 +#: utils/misc/guc_tables.c:4476 msgid "Sets the server's \"ident\" configuration file." msgstr "Define la ubicación del archivo de configuración «ident» del servidor." -#: utils/misc/guc_tables.c:4368 +#: utils/misc/guc_tables.c:4487 msgid "Writes the postmaster PID to the specified file." msgstr "Registra el PID de postmaster en el archivo especificado." -#: utils/misc/guc_tables.c:4379 +#: utils/misc/guc_tables.c:4498 msgid "Shows the name of the SSL library." msgstr "Muestra el nombre de la biblioteca SSL." -#: utils/misc/guc_tables.c:4394 +#: utils/misc/guc_tables.c:4513 msgid "Location of the SSL server certificate file." msgstr "Ubicación del archivo de certificado SSL del servidor." -#: utils/misc/guc_tables.c:4404 +#: utils/misc/guc_tables.c:4523 msgid "Location of the SSL server private key file." msgstr "Ubicación del archivo de la llave SSL privada del servidor." -#: utils/misc/guc_tables.c:4414 +#: utils/misc/guc_tables.c:4533 msgid "Location of the SSL certificate authority file." msgstr "Ubicación del archivo de autoridad certificadora SSL." -#: utils/misc/guc_tables.c:4424 +#: utils/misc/guc_tables.c:4543 msgid "Location of the SSL certificate revocation list file." msgstr "Ubicación del archivo de lista de revocación de certificados SSL" -#: utils/misc/guc_tables.c:4434 +#: utils/misc/guc_tables.c:4553 msgid "Location of the SSL certificate revocation list directory." msgstr "Ubicación del directorio de lista de revocación de certificados SSL" -#: utils/misc/guc_tables.c:4444 +#: utils/misc/guc_tables.c:4563 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "Número de standbys sincrónicos y lista de nombres de los potenciales sincrónicos." -#: utils/misc/guc_tables.c:4455 +#: utils/misc/guc_tables.c:4574 msgid "Sets default text search configuration." msgstr "Define la configuración de búsqueda en texto por omisión." -#: utils/misc/guc_tables.c:4465 +#: utils/misc/guc_tables.c:4584 msgid "Sets the list of allowed SSL ciphers." msgstr "Define la lista de cifrados SSL permitidos." -#: utils/misc/guc_tables.c:4480 +#: utils/misc/guc_tables.c:4599 msgid "Sets the curve to use for ECDH." msgstr "Define la curva a usar para ECDH." -#: utils/misc/guc_tables.c:4495 +#: utils/misc/guc_tables.c:4614 msgid "Location of the SSL DH parameters file." msgstr "Ubicación del archivo de parámetros DH para SSL." -#: utils/misc/guc_tables.c:4506 +#: utils/misc/guc_tables.c:4625 msgid "Command to obtain passphrases for SSL." msgstr "Orden para obtener frases clave para SSL." -#: utils/misc/guc_tables.c:4517 +#: utils/misc/guc_tables.c:4636 msgid "Sets the application name to be reported in statistics and logs." msgstr "Define el nombre de aplicación a reportarse en estadísticas y logs." -#: utils/misc/guc_tables.c:4528 +#: utils/misc/guc_tables.c:4647 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Define el nombre del clúster, el cual se incluye en el título de proceso." -#: utils/misc/guc_tables.c:4539 +#: utils/misc/guc_tables.c:4658 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "Define los gestores de recursos WAL para los cuales hacer verificaciones de consistencia WAL." -#: utils/misc/guc_tables.c:4540 +#: utils/misc/guc_tables.c:4659 msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." msgstr "Se registrarán imágenes de página completa para todos los bloques de datos, y comparados con los resultados de la aplicación de WAL." -#: utils/misc/guc_tables.c:4550 +#: utils/misc/guc_tables.c:4669 msgid "JIT provider to use." msgstr "Proveedor JIT a usar." -#: utils/misc/guc_tables.c:4561 +#: utils/misc/guc_tables.c:4680 msgid "Log backtrace for errors in these functions." msgstr "Registrar el backtrace para errores que se produzcan en estas funciones." -#: utils/misc/guc_tables.c:4572 +#: utils/misc/guc_tables.c:4691 msgid "Use direct I/O for file access." -msgstr "" +msgstr "Usar I/O directo para accesos a archivos." + +#: utils/misc/guc_tables.c:4702 +msgid "Lists streaming replication standby server replication slot names that logical WAL sender processes will wait for." +msgstr "Lista los nombres de slots de replicación de servidores standby a los que los procesos “WAL sender†esperarán." + +#: utils/misc/guc_tables.c:4704 +msgid "Logical WAL sender processes will send decoded changes to output plugins only after the specified replication slots have confirmed receiving WAL." +msgstr "Los procesos “WAL sender†lógicos enviarán cambios decodificados a los “plugins†de salida sólo después de que los slots de replicación especificados han confirmado recibir el WAL." -#: utils/misc/guc_tables.c:4592 +#: utils/misc/guc_tables.c:4716 +msgid "Prohibits access to non-system relations of specified kinds." +msgstr "Prohibir acceso a las relaciones no de sistema de los tipos especificados." + +#: utils/misc/guc_tables.c:4736 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Define si «\\'» está permitido en literales de cadena." -#: utils/misc/guc_tables.c:4602 +#: utils/misc/guc_tables.c:4746 msgid "Sets the output format for bytea." msgstr "Formato de salida para bytea." -#: utils/misc/guc_tables.c:4612 +#: utils/misc/guc_tables.c:4756 msgid "Sets the message levels that are sent to the client." msgstr "Nivel de mensajes enviados al cliente." -#: utils/misc/guc_tables.c:4613 utils/misc/guc_tables.c:4709 -#: utils/misc/guc_tables.c:4720 utils/misc/guc_tables.c:4792 +#: utils/misc/guc_tables.c:4757 utils/misc/guc_tables.c:4853 +#: utils/misc/guc_tables.c:4864 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr "Cada nivel incluye todos los niveles que lo siguen. Mientras más posterior el nivel, menos mensajes se enviarán." -#: utils/misc/guc_tables.c:4623 +#: utils/misc/guc_tables.c:4767 msgid "Enables in-core computation of query identifiers." -msgstr "" +msgstr "Habilita el cálculo de identificadores de consulta." -#: utils/misc/guc_tables.c:4633 +#: utils/misc/guc_tables.c:4777 msgid "Enables the planner to use constraints to optimize queries." msgstr "Permitir el uso de restricciones para limitar los accesos a tablas." -#: utils/misc/guc_tables.c:4634 +#: utils/misc/guc_tables.c:4778 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." msgstr "Las tablas no serán recorridas si sus restricciones garantizan que ninguna fila coincidirá con la consulta." -#: utils/misc/guc_tables.c:4645 +#: utils/misc/guc_tables.c:4789 msgid "Sets the default compression method for compressible values." msgstr "Define el método de compresión por omisión para valores comprimibles." -#: utils/misc/guc_tables.c:4656 +#: utils/misc/guc_tables.c:4800 msgid "Sets the transaction isolation level of each new transaction." msgstr "Nivel de aislación (isolation level) de transacciones nuevas." -#: utils/misc/guc_tables.c:4666 +#: utils/misc/guc_tables.c:4810 msgid "Sets the current transaction's isolation level." msgstr "Define el nivel de aislación de la transacción en curso." -#: utils/misc/guc_tables.c:4677 +#: utils/misc/guc_tables.c:4821 msgid "Sets the display format for interval values." msgstr "Formato de salida para valores de intervalos." -#: utils/misc/guc_tables.c:4688 +#: utils/misc/guc_tables.c:4832 msgid "Log level for reporting invalid ICU locale strings." -msgstr "" +msgstr "Nivel de log a usar para reportar cadenas de configuración ICU no válidas." -#: utils/misc/guc_tables.c:4698 +#: utils/misc/guc_tables.c:4842 msgid "Sets the verbosity of logged messages." msgstr "Verbosidad de los mensajes registrados." -#: utils/misc/guc_tables.c:4708 +#: utils/misc/guc_tables.c:4852 msgid "Sets the message levels that are logged." msgstr "Nivel de mensajes registrados." -#: utils/misc/guc_tables.c:4719 +#: utils/misc/guc_tables.c:4863 msgid "Causes all statements generating error at or above this level to be logged." msgstr "Registrar sentencias que generan error de nivel superior o igual a éste." -#: utils/misc/guc_tables.c:4730 +#: utils/misc/guc_tables.c:4874 msgid "Sets the type of statements logged." msgstr "Define el tipo de sentencias que se registran." -#: utils/misc/guc_tables.c:4740 +#: utils/misc/guc_tables.c:4884 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "«Facility» de syslog que se usará cuando syslog esté habilitado." -#: utils/misc/guc_tables.c:4751 +#: utils/misc/guc_tables.c:4895 msgid "Sets the session's behavior for triggers and rewrite rules." -msgstr "Define el comportamiento de la sesión con respecto a disparadores y reglas de reescritura." +msgstr "Define el comportamiento de la sesión con respecto a “triggers†y reglas de reescritura." -#: utils/misc/guc_tables.c:4761 +#: utils/misc/guc_tables.c:4905 msgid "Sets the current transaction's synchronization level." msgstr "Define el nivel de sincronización de la transacción en curso." -#: utils/misc/guc_tables.c:4771 -msgid "Allows archiving of WAL files using archive_command." -msgstr "Permite el archivado de WAL usando archive_command." +#: utils/misc/guc_tables.c:4915 +msgid "Allows archiving of WAL files using \"archive_command\"." +msgstr "Permite el archivado de WAL usando «archive_command»." -#: utils/misc/guc_tables.c:4781 +#: utils/misc/guc_tables.c:4925 msgid "Sets the action to perform upon reaching the recovery target." msgstr "Acción a ejecutar al alcanzar el destino de recuperación." -#: utils/misc/guc_tables.c:4791 -msgid "Enables logging of recovery-related debugging information." -msgstr "Recolectar información de depuración relacionada con la recuperación." - -#: utils/misc/guc_tables.c:4808 +#: utils/misc/guc_tables.c:4935 msgid "Collects function-level statistics on database activity." msgstr "Recolectar estadísticas de actividad de funciones en la base de datos." -#: utils/misc/guc_tables.c:4819 -#, fuzzy -#| msgid "Sets the default statistics target." +#: utils/misc/guc_tables.c:4946 msgid "Sets the consistency of accesses to statistics data." -msgstr "Definir el valor por omisión de toma de estadísticas." +msgstr "Definir la consistencia de accesos a los datos de estadísticas." -#: utils/misc/guc_tables.c:4829 +#: utils/misc/guc_tables.c:4956 msgid "Compresses full-page writes written in WAL file with specified method." -msgstr "" +msgstr "Comprime las páginas completas escritas a WAL (FPI) con el método especificado." -#: utils/misc/guc_tables.c:4839 +#: utils/misc/guc_tables.c:4966 msgid "Sets the level of information written to the WAL." msgstr "Establece el nivel de información escrita al WAL." -#: utils/misc/guc_tables.c:4849 +#: utils/misc/guc_tables.c:4976 msgid "Selects the dynamic shared memory implementation used." msgstr "Escoge la implementación de memoria compartida dinámica que se usará." -#: utils/misc/guc_tables.c:4859 +#: utils/misc/guc_tables.c:4986 msgid "Selects the shared memory implementation used for the main shared memory region." msgstr "Escoge la implementación de memoria compartida dinámica que se usará para la región principal de memoria compartida." -#: utils/misc/guc_tables.c:4869 +#: utils/misc/guc_tables.c:4996 msgid "Selects the method used for forcing WAL updates to disk." msgstr "Selecciona el método usado para forzar escritura de WAL a disco." -#: utils/misc/guc_tables.c:4879 +#: utils/misc/guc_tables.c:5006 msgid "Sets how binary values are to be encoded in XML." msgstr "Define cómo se codificarán los valores binarios en XML." -#: utils/misc/guc_tables.c:4889 +#: utils/misc/guc_tables.c:5016 msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." msgstr "Define si los datos XML implícitos en operaciones de análisis y serialización serán considerados documentos o fragmentos de contenido." -#: utils/misc/guc_tables.c:4900 +#: utils/misc/guc_tables.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "Usar páginas grandes (huge) en Linux o Windows." -#: utils/misc/guc_tables.c:4910 -#, fuzzy -#| msgid "cannot execute %s during recovery" +#: utils/misc/guc_tables.c:5037 +msgid "Indicates the status of huge pages." +msgstr "Indica el estado de las “huge pagesâ€." + +#: utils/misc/guc_tables.c:5048 msgid "Prefetch referenced blocks during recovery." -msgstr "no se puede ejecutar %s durante la recuperación" +msgstr "Pre-cargar bloques referenciados durante la recuperación." -#: utils/misc/guc_tables.c:4911 +#: utils/misc/guc_tables.c:5049 msgid "Look ahead in the WAL to find references to uncached data." msgstr "Busca adelantadamente en el WAL para encontrar referencias a datos que no están en cache." -#: utils/misc/guc_tables.c:4920 -#, fuzzy -#| msgid "Enables the planner's use of parallel append plans." +#: utils/misc/guc_tables.c:5058 msgid "Forces the planner's use parallel query nodes." -msgstr "Permitir el uso de planes «append» paralelos." +msgstr "Fuerza al optimizador a usar planes paralelos." -#: utils/misc/guc_tables.c:4921 -msgid "This can be useful for testing the parallel query infrastructure by forcing the planner to generate plans which contains nodes which perform tuple communication between workers and the main process." -msgstr "" +#: utils/misc/guc_tables.c:5059 +msgid "This can be useful for testing the parallel query infrastructure by forcing the planner to generate plans that contain nodes that perform tuple communication between workers and the main process." +msgstr "Esto puede usarse para verificar la infrastructura de consultas paralelas forzando al optimizar a generar planes que contienen nodos que utilizan la comunicación entre procesos hijos y el principal." -#: utils/misc/guc_tables.c:4933 +#: utils/misc/guc_tables.c:5071 msgid "Chooses the algorithm for encrypting passwords." msgstr "Escoge el algoritmo para cifrar contraseñas." -#: utils/misc/guc_tables.c:4943 +#: utils/misc/guc_tables.c:5081 msgid "Controls the planner's selection of custom or generic plan." msgstr "Controla la selección del optimizador de planes genéricos o «custom»." -#: utils/misc/guc_tables.c:4944 +#: utils/misc/guc_tables.c:5082 msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." msgstr "Las sentencias preparadas pueden tener planes genéricos y «custom», y el optimizador intentará escoger cuál es mejor. Esto puede usarse para controlar manualmente el comportamiento." -#: utils/misc/guc_tables.c:4956 +#: utils/misc/guc_tables.c:5094 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "Define la versión mínima del protocolo SSL/TLS a usar." -#: utils/misc/guc_tables.c:4968 +#: utils/misc/guc_tables.c:5106 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "Define la versión máxima del protocolo SSL/TLS a usar." -#: utils/misc/guc_tables.c:4980 +#: utils/misc/guc_tables.c:5118 msgid "Sets the method for synchronizing the data directory before crash recovery." msgstr "Establece el método para sincronizar el directorio de datos antes de la recuperación ante una caída." -#: utils/misc/guc_tables.c:4989 -msgid "Controls when to replicate or apply each change." -msgstr "" +#: utils/misc/guc_tables.c:5127 +msgid "Forces immediate streaming or serialization of changes in large transactions." +msgstr "Fuerza el flujo o serialización inmediatos de los cambios en transacciones grandes." -#: utils/misc/guc_tables.c:4990 +#: utils/misc/guc_tables.c:5128 msgid "On the publisher, it allows streaming or serializing each change in logical decoding. On the subscriber, it allows serialization of all changes to files and notifies the parallel apply workers to read and apply them at the end of the transaction." -msgstr "" +msgstr "En el publicador, permite serializar o transmitir en flujo cada cambio en la decodificación lógica. En el suscriptor, permite la serialización de todos los cambios a archivos y notifica a los procesos paralelos de “apply†para leerlos y aplicarlos al término de la transacción." #: utils/misc/help_config.c:129 #, c-format msgid "internal error: unrecognized run-time parameter type\n" msgstr "error interno: tipo parámetro no reconocido\n" -#: utils/misc/pg_controldata.c:48 utils/misc/pg_controldata.c:86 -#: utils/misc/pg_controldata.c:175 utils/misc/pg_controldata.c:214 +#: utils/misc/pg_controldata.c:50 utils/misc/pg_controldata.c:90 +#: utils/misc/pg_controldata.c:181 utils/misc/pg_controldata.c:222 #, c-format msgid "calculated CRC checksum does not match value stored in file" msgstr "la suma de verificación calculada no coincide con el valor almacenado en el archivo" @@ -29532,145 +30320,143 @@ msgstr "la consulta sería afectada por la política de seguridad de registros p msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." msgstr "Para desactivar la política para el dueño de la tabla, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/timeout.c:524 +#: utils/misc/timeout.c:520 #, c-format msgid "cannot add more timeout reasons" msgstr "no se pueden agregar más razones de timeout" -#: utils/misc/tzparser.c:60 +#: utils/misc/tzparser.c:61 #, c-format msgid "time zone abbreviation \"%s\" is too long (maximum %d characters) in time zone file \"%s\", line %d" msgstr "la abreviación del huso horario «%s» es demasiado larga (máximo %d caracteres) en archivo de huso horario «%s», línea %d" -#: utils/misc/tzparser.c:72 +#: utils/misc/tzparser.c:73 #, c-format msgid "time zone offset %d is out of range in time zone file \"%s\", line %d" msgstr "desplazamiento de huso horario %d está fuera de rango en el archivo de huso horario «%s», línea %d" -#: utils/misc/tzparser.c:111 +#: utils/misc/tzparser.c:112 #, c-format msgid "missing time zone abbreviation in time zone file \"%s\", line %d" msgstr "falta una abreviación de huso horario en el archivo de huso horario «%s», línea %d" -#: utils/misc/tzparser.c:120 +#: utils/misc/tzparser.c:121 #, c-format msgid "missing time zone offset in time zone file \"%s\", line %d" msgstr "falta un desplazamiento de huso horario en el archivo de huso horario «%s», línea %d" -#: utils/misc/tzparser.c:132 +#: utils/misc/tzparser.c:133 #, c-format msgid "invalid number for time zone offset in time zone file \"%s\", line %d" msgstr "número no válido para desplazamiento de huso horario en archivo de huso horario «%s», línea %d" -#: utils/misc/tzparser.c:168 +#: utils/misc/tzparser.c:169 #, c-format msgid "invalid syntax in time zone file \"%s\", line %d" msgstr "sintaxis no válida en archivo de huso horario «%s», línea %d" -#: utils/misc/tzparser.c:236 +#: utils/misc/tzparser.c:237 #, c-format msgid "time zone abbreviation \"%s\" is multiply defined" msgstr "abreviación de huso horario «%s» está definida múltiples veces" -#: utils/misc/tzparser.c:238 +#: utils/misc/tzparser.c:239 #, c-format msgid "Entry in time zone file \"%s\", line %d, conflicts with entry in file \"%s\", line %d." msgstr "Entrada en archivo de huso horario «%s», línea %d, causa conflictos con entrada en archivo «%s», línea %d." -#: utils/misc/tzparser.c:300 +#: utils/misc/tzparser.c:301 #, c-format msgid "invalid time zone file name \"%s\"" msgstr "nombre de huso horario «%s» no válido" -#: utils/misc/tzparser.c:313 +#: utils/misc/tzparser.c:314 #, c-format msgid "time zone file recursion limit exceeded in file \"%s\"" msgstr "límite de recursión excedido en el archivo «%s»" -#: utils/misc/tzparser.c:352 utils/misc/tzparser.c:365 +#: utils/misc/tzparser.c:353 utils/misc/tzparser.c:366 #, c-format msgid "could not read time zone file \"%s\": %m" msgstr "no se pudo leer archivo de huso horario «%s»: %m" -#: utils/misc/tzparser.c:376 +#: utils/misc/tzparser.c:377 #, c-format msgid "line is too long in time zone file \"%s\", line %d" msgstr "línea demasiado larga en archivo de huso horario «%s», línea %d" -#: utils/misc/tzparser.c:400 +#: utils/misc/tzparser.c:401 #, c-format msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "@INCLUDE sin nombre de archivo en archivo de huso horario «%s», línea %d" -#: utils/mmgr/aset.c:446 utils/mmgr/generation.c:206 utils/mmgr/slab.c:367 +#: utils/mmgr/aset.c:452 utils/mmgr/bump.c:184 utils/mmgr/generation.c:216 +#: utils/mmgr/slab.c:371 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Falla al crear el contexto de memoria «%s»." -#: utils/mmgr/dsa.c:531 utils/mmgr/dsa.c:1341 +#: utils/mmgr/dsa.c:523 utils/mmgr/dsa.c:1364 #, c-format msgid "could not attach to dynamic shared area" msgstr "no se pudo adjuntar al segmento de memoria compartida dinámica" -#: utils/mmgr/mcxt.c:1047 utils/mmgr/mcxt.c:1083 utils/mmgr/mcxt.c:1121 -#: utils/mmgr/mcxt.c:1159 utils/mmgr/mcxt.c:1247 utils/mmgr/mcxt.c:1278 -#: utils/mmgr/mcxt.c:1314 utils/mmgr/mcxt.c:1503 utils/mmgr/mcxt.c:1548 -#: utils/mmgr/mcxt.c:1605 +#: utils/mmgr/mcxt.c:1155 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "Falló una petición de tamaño %zu en el contexto de memoria «%s»." -#: utils/mmgr/mcxt.c:1210 +#: utils/mmgr/mcxt.c:1299 #, c-format msgid "logging memory contexts of PID %d" msgstr "registrando contextos de memoria del PID %d" -#: utils/mmgr/portalmem.c:188 +#: utils/mmgr/portalmem.c:187 #, c-format msgid "cursor \"%s\" already exists" msgstr "el cursor «%s» ya existe" -#: utils/mmgr/portalmem.c:192 +#: utils/mmgr/portalmem.c:191 #, c-format msgid "closing existing cursor \"%s\"" msgstr "cerrando el cursor «%s» preexistente" -#: utils/mmgr/portalmem.c:402 +#: utils/mmgr/portalmem.c:401 #, c-format msgid "portal \"%s\" cannot be run" msgstr "el portal «%s» no puede ser ejecutado" -#: utils/mmgr/portalmem.c:480 +#: utils/mmgr/portalmem.c:479 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "no se puede eliminar el portal «pinned» «%s»" -#: utils/mmgr/portalmem.c:488 +#: utils/mmgr/portalmem.c:487 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "no se puede eliminar el portal activo «%s»" -#: utils/mmgr/portalmem.c:739 +#: utils/mmgr/portalmem.c:738 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "no se puede hacer PREPARE de una transacción que ha creado un cursor WITH HOLD" -#: utils/mmgr/portalmem.c:1230 +#: utils/mmgr/portalmem.c:1232 #, c-format msgid "cannot perform transaction commands inside a cursor loop that is not read-only" msgstr "no se pueden ejecutar órdenes de transacción dentro de un bucle de cursor que no es de sólo lectura" #: utils/sort/logtape.c:266 utils/sort/logtape.c:287 #, c-format -msgid "could not seek to block %ld of temporary file" -msgstr "no se pudo posicionar (seek) en el bloque %ld del archivo temporal" +msgid "could not seek to block %lld of temporary file" +msgstr "no se pudo posicionar (seek) en el bloque %lld del archivo temporal" -#: utils/sort/sharedtuplestore.c:463 +#: utils/sort/sharedtuplestore.c:466 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "trozo inesperado en archivo temporal del tuplestore compartido" -#: utils/sort/sharedtuplestore.c:541 +#: utils/sort/sharedtuplestore.c:548 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "no se pudo posicionar (seek) en el bloque %u en el archivo temporal del tuplestore compartido" @@ -29680,17 +30466,17 @@ msgstr "no se pudo posicionar (seek) en el bloque %u en el archivo temporal del msgid "cannot have more than %d runs for an external sort" msgstr "no se pueden tener más de %d pasadas para un ordenamiento externo" -#: utils/sort/tuplesortvariants.c:1364 +#: utils/sort/tuplesortvariants.c:1552 #, c-format msgid "could not create unique index \"%s\"" msgstr "no se pudo crear el índice único «%s»" -#: utils/sort/tuplesortvariants.c:1366 +#: utils/sort/tuplesortvariants.c:1554 #, c-format msgid "Key %s is duplicated." msgstr "La llave %s está duplicada." -#: utils/sort/tuplesortvariants.c:1367 +#: utils/sort/tuplesortvariants.c:1555 #, c-format msgid "Duplicate keys exist." msgstr "Existe una llave duplicada." @@ -29704,412 +30490,426 @@ msgstr "Existe una llave duplicada." msgid "could not seek in tuplestore temporary file" msgstr "no se pudo posicionar (seek) en el archivo temporal del tuplestore" -#: utils/time/snapmgr.c:571 +#: utils/time/snapmgr.c:536 #, c-format msgid "The source transaction is not running anymore." msgstr "La transacción de origen ya no está en ejecución." -#: utils/time/snapmgr.c:1166 +#: utils/time/snapmgr.c:1136 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "no se puede exportar snapshots desde una subtransacción" -#: utils/time/snapmgr.c:1325 utils/time/snapmgr.c:1330 -#: utils/time/snapmgr.c:1335 utils/time/snapmgr.c:1350 -#: utils/time/snapmgr.c:1355 utils/time/snapmgr.c:1360 -#: utils/time/snapmgr.c:1375 utils/time/snapmgr.c:1380 -#: utils/time/snapmgr.c:1385 utils/time/snapmgr.c:1487 -#: utils/time/snapmgr.c:1503 utils/time/snapmgr.c:1528 +#: utils/time/snapmgr.c:1296 utils/time/snapmgr.c:1301 +#: utils/time/snapmgr.c:1306 utils/time/snapmgr.c:1321 +#: utils/time/snapmgr.c:1326 utils/time/snapmgr.c:1331 +#: utils/time/snapmgr.c:1346 utils/time/snapmgr.c:1351 +#: utils/time/snapmgr.c:1356 utils/time/snapmgr.c:1470 +#: utils/time/snapmgr.c:1486 utils/time/snapmgr.c:1511 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "datos no válidos en archivo de snapshot «%s»" -#: utils/time/snapmgr.c:1422 +#: utils/time/snapmgr.c:1393 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "SET TRANSACTION SNAPSHOT debe ser llamado antes de cualquier consulta" -#: utils/time/snapmgr.c:1431 +#: utils/time/snapmgr.c:1402 #, c-format msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" msgstr "una transacción que importa un snapshot no debe tener nivel de aislación SERIALIZABLE o REPEATABLE READ" -#: utils/time/snapmgr.c:1440 utils/time/snapmgr.c:1449 +#: utils/time/snapmgr.c:1411 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "identificador de snapshot no válido: «%s»" -#: utils/time/snapmgr.c:1541 +#: utils/time/snapmgr.c:1426 +#, c-format +msgid "snapshot \"%s\" does not exist" +msgstr "no existe el snapshot «%s»" + +#: utils/time/snapmgr.c:1524 #, c-format msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" msgstr "una transacción serializable no puede importar un snapshot desde una transacción no serializable" -#: utils/time/snapmgr.c:1545 +#: utils/time/snapmgr.c:1528 #, c-format msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" msgstr "una transacción serializable que no es de sólo lectura no puede importar un snapshot de una transacción de sólo lectura" -#: utils/time/snapmgr.c:1560 +#: utils/time/snapmgr.c:1543 #, c-format msgid "cannot import a snapshot from a different database" msgstr "no se puede importar un snapshot desde una base de datos diferente" -#: gram.y:1198 +#: gram.y:1231 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD ya no está soportado" -#: gram.y:1199 +#: gram.y:1232 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "Quite UNENCRYPTED para almacenar la contraseña en su lugar en forma cifrada." -#: gram.y:1526 gram.y:1542 +#: gram.y:1559 gram.y:1575 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTS no puede incluir elementos de esquema" -#: gram.y:1714 +#: gram.y:1727 #, c-format msgid "current database cannot be changed" msgstr "no se puede cambiar la base de datos activa" -#: gram.y:1847 +#: gram.y:1860 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "el intervalo de huso horario debe ser HOUR o HOUR TO MINUTE" -#: gram.y:2464 +#: gram.y:2487 #, c-format msgid "column number must be in range from 1 to %d" msgstr "el número de columna debe estar en el rango de 1 a %d" -#: gram.y:3060 +#: gram.y:3083 #, c-format msgid "sequence option \"%s\" not supported here" -msgstr "la opción de secuencia «%s» no está soportado aquí" +msgstr "la opción de secuencia «%s» no está soportada aquí" -#: gram.y:3089 +#: gram.y:3122 #, c-format msgid "modulus for hash partition provided more than once" msgstr "el módulo para partición de hash fue especificado más de una vez" -#: gram.y:3098 +#: gram.y:3131 #, c-format msgid "remainder for hash partition provided more than once" msgstr "el remanente para partición de hash fue especificado más de una vez" -#: gram.y:3105 +#: gram.y:3138 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "especificación de borde de partición hash «%s» no reconocida" -#: gram.y:3113 +#: gram.y:3146 #, c-format msgid "modulus for hash partition must be specified" msgstr "el módulo para una partición hash debe ser especificado" -#: gram.y:3117 +#: gram.y:3150 #, c-format msgid "remainder for hash partition must be specified" msgstr "remanente en partición hash debe ser especificado" -#: gram.y:3325 gram.y:3359 +#: gram.y:3358 gram.y:3392 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUT no están permitidos con PROGRAM" -#: gram.y:3331 +#: gram.y:3364 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "la cláusula WHERE no está permitida con COPY TO" -#: gram.y:3670 gram.y:3677 gram.y:12842 gram.y:12850 +#: gram.y:3712 gram.y:3719 gram.y:13023 gram.y:13031 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "GLOBAL está obsoleto para la creación de tablas temporales" -#: gram.y:3953 +#: gram.y:3995 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "para una columna generada, GENERATED ALWAYS debe ser especificado" -#: gram.y:4336 -#, fuzzy, c-format -#| msgid "return type %s is not supported for SQL functions" +#: gram.y:4432 +#, c-format msgid "a column list with %s is only supported for ON DELETE actions" -msgstr "el tipo de retorno %s no es soportado en funciones SQL" +msgstr "una lista de columnas con %s sólo está soportada para acciones ON DELETE" -#: gram.y:5048 +#: gram.y:5151 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM ya no está soportado" -#: gram.y:5746 +#: gram.y:5849 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "opción de seguridad de registro «%s» no reconocida" -#: gram.y:5747 +#: gram.y:5850 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "sólo se admiten actualmente políticas PERMISSIVE o RESTRICTIVE." -#: gram.y:5832 +#: gram.y:5935 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER no está soportado" -#: gram.y:5869 +#: gram.y:5972 msgid "duplicate trigger events specified" -msgstr "se han especificado eventos de disparador duplicados" +msgstr "se han especificado “triggers†por eventos duplicados" -#: gram.y:6018 +#: gram.y:6121 #, c-format msgid "conflicting constraint properties" msgstr "propiedades de restricción contradictorias" -#: gram.y:6117 +#: gram.y:6220 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTION no está implementado" -#: gram.y:6525 +#: gram.y:6537 +#, c-format +msgid "dropping an enum value is not implemented" +msgstr "eliminar un valor de enum no está implementado" + +#: gram.y:6655 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK ya no es requerido" -#: gram.y:6526 +#: gram.y:6656 #, c-format msgid "Update your data type." msgstr "Actualice su tipo de datos." -#: gram.y:8399 +#: gram.y:8529 #, c-format msgid "aggregates cannot have output arguments" msgstr "las funciones de agregación no pueden tener argumentos de salida" -#: gram.y:11075 gram.y:11094 +#: gram.y:11221 gram.y:11240 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTION no está soportado con vistas recursivas" -#: gram.y:12981 +#: gram.y:13162 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "la sintaxis LIMIT #,# no está soportada" -#: gram.y:12982 +#: gram.y:13163 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "Use cláusulas LIMIT y OFFSET separadas." -#: gram.y:13842 +#: gram.y:14038 #, c-format msgid "only one DEFAULT value is allowed" msgstr "Sólo se permite un valor DEFAULT" -#: gram.y:13851 +#: gram.y:14047 #, c-format msgid "only one PATH value per column is allowed" msgstr "sólo se permite un valor de PATH por columna" -#: gram.y:13860 +#: gram.y:14056 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "declaraciones NULL/NOT NULL en conflicto o redundantes para la columna «%s»" -#: gram.y:13869 +#: gram.y:14065 #, c-format msgid "unrecognized column option \"%s\"" msgstr "opción de columna «%s» no reconocida" -#: gram.y:14123 +#: gram.y:14147 +#, c-format +msgid "only string constants are supported in JSON_TABLE path specification" +msgstr "sólo cadenas constantes están permitidas en la especificación de ruta JSON_TABLE" + +#: gram.y:14469 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "la precisión para el tipo float debe ser al menos 1 bit" -#: gram.y:14132 +#: gram.y:14478 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "la precisión para el tipo float debe ser menor de 54 bits" -#: gram.y:14635 +#: gram.y:14995 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "el número de parámetros es incorrecto al lado izquierdo de la expresión OVERLAPS" -#: gram.y:14640 +#: gram.y:15000 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "el número de parámetros es incorrecto al lado derecho de la expresión OVERLAPS" -#: gram.y:14817 +#: gram.y:15177 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "el predicado UNIQUE no está implementado" -#: gram.y:15233 +#: gram.y:15591 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "no se permiten múltiples cláusulas ORDER BY con WITHIN GROUP" -#: gram.y:15238 +#: gram.y:15596 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "no se permite DISTINCT con WITHIN GROUP" -#: gram.y:15243 +#: gram.y:15601 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "no se permite VARIADIC con WITHIN GROUP" -#: gram.y:15922 gram.y:15946 +#: gram.y:16328 gram.y:16352 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "el inicio de «frame» no puede ser UNBOUNDED FOLLOWING" -#: gram.y:15927 +#: gram.y:16333 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "el «frame» que se inicia desde la siguiente fila no puede terminar en la fila actual" -#: gram.y:15951 +#: gram.y:16357 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "el fin de «frame» no puede ser UNBOUNDED PRECEDING" -#: gram.y:15957 +#: gram.y:16363 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "el «frame» que se inicia desde la fila actual no puede tener filas precedentes" -#: gram.y:15964 +#: gram.y:16370 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "el «frame» que se inicia desde la fila siguiente no puede tener filas precedentes" -#: gram.y:16723 +#: gram.y:16919 +#, c-format +msgid "unrecognized JSON encoding: %s" +msgstr "no se reconoce la codificación JSON: %s" + +#: gram.y:17243 #, c-format msgid "type modifier cannot have parameter name" msgstr "el modificador de tipo no puede tener nombre de parámetro" -#: gram.y:16729 +#: gram.y:17249 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "el modificador de tipo no puede tener ORDER BY" -#: gram.y:16797 gram.y:16804 gram.y:16811 +#: gram.y:17317 gram.y:17324 gram.y:17331 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s no puede ser usado como nombre de rol aquí" -#: gram.y:16901 gram.y:18358 +#: gram.y:17421 gram.y:18906 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "la opción WITH TIES no puede ser especificada sin una cláusula ORDER BY" -#: gram.y:18037 gram.y:18224 +#: gram.y:18597 gram.y:18772 msgid "improper use of \"*\"" msgstr "uso impropio de «*»" -#: gram.y:18288 +#: gram.y:18836 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "una agregación de conjunto-ordenado con un argumento directo VARIADIC debe tener al menos un argumento agregado VARIADIC del mismo tipo de datos" -#: gram.y:18325 +#: gram.y:18873 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "no se permiten múltiples cláusulas ORDER BY" -#: gram.y:18336 +#: gram.y:18884 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "no se permiten múltiples cláusulas OFFSET" -#: gram.y:18345 +#: gram.y:18893 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "no se permiten múltiples cláusulas LIMIT" -#: gram.y:18354 +#: gram.y:18902 #, c-format msgid "multiple limit options not allowed" msgstr "no se permiten múltiples opciones limit" -#: gram.y:18381 +#: gram.y:18929 #, c-format msgid "multiple WITH clauses not allowed" msgstr "no se permiten múltiples cláusulas WITH" -#: gram.y:18562 +#: gram.y:19122 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "los argumentos OUT e INOUT no están permitidos en funciones TABLE" -#: gram.y:18695 +#: gram.y:19255 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "no se permiten múltiples cláusulas COLLATE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18733 gram.y:18746 +#: gram.y:19293 gram.y:19306 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "las restricciones %s no pueden ser marcadas DEFERRABLE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18759 +#: gram.y:19319 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "las restricciones %s no pueden ser marcadas NOT VALID" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18772 +#: gram.y:19332 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "las restricciones %s no pueden ser marcadas NO INHERIT" -#: gram.y:18794 +#: gram.y:19354 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "estrategia de particionamiento «%s» no reconocida" -#: gram.y:18818 -#, fuzzy, c-format -#| msgid "invalid publication_names syntax" +#: gram.y:19378 +#, c-format msgid "invalid publication object list" -msgstr "sintaxis de publication_names no válida" +msgstr "sintaxis de lista de objetos de publicación no válida" -#: gram.y:18819 +#: gram.y:19379 #, c-format msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." -msgstr "" +msgstr "Uno de TABLE o TABLES IN SCHEMA debe ser especificado antes de un nombre de tabla o esquema." -#: gram.y:18835 -#, fuzzy, c-format -#| msgid "invalid file name argument" -msgid "invalid table name at or near" -msgstr "el nombre de archivo usado como argumento no es válido" +#: gram.y:19395 +#, c-format +msgid "invalid table name" +msgstr "nombre de tabla no válido" -#: gram.y:18856 -#, fuzzy, c-format -#| msgid "WHERE clause not allowed with COPY TO" +#: gram.y:19416 +#, c-format msgid "WHERE clause not allowed for schema" -msgstr "la cláusula WHERE no está permitida con COPY TO" +msgstr "cláusula WHERE no permitida para esquemas" -#: gram.y:18863 -#, fuzzy, c-format -#| msgid "interval specification not allowed here" +#: gram.y:19423 +#, c-format msgid "column specification not allowed for schema" -msgstr "la especificación de intervalo no está permitida aquí" +msgstr "especificación de columnas no permitida para esquemas" -#: gram.y:18877 -#, fuzzy, c-format -#| msgid "invalid statement name \"%s\" on line %d" -msgid "invalid schema name at or near" -msgstr "nombre sentencia no válida «%s» en línea %d" +#: gram.y:19437 +#, c-format +msgid "invalid schema name" +msgstr "nombre de esquema no válido" #: guc-file.l:192 #, c-format @@ -30151,16 +30951,50 @@ msgstr "error de sintaxis en el archivo «%s» línea %u, cerca de la palabra « msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "se encontraron demasiados errores de sintaxis, abandonando el archivo «%s»" -#: jsonpath_gram.y:529 +#: jsonpath_gram.y:267 +#, c-format +msgid ".decimal() can only have an optional precision[,scale]." +msgstr ".decimal() sólo puede tener un parámetro opcional precisión[,escala]." + +#: jsonpath_gram.y:599 #, c-format msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." -msgstr "" +msgstr "Carácter de bandera «%.*s» no reconocido en predicado LIKE_REGEX." -#: jsonpath_gram.y:607 +#: jsonpath_gram.y:677 #, c-format msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" msgstr "la opción «x» de XQuery (expresiones regulares expandidas) no está implementada" +#: jsonpath_scan.l:174 +msgid "invalid Unicode escape sequence" +msgstr "secuencia de escape Unicode no válida" + +#: jsonpath_scan.l:180 +msgid "invalid hexadecimal character sequence" +msgstr "secuencia de caracteres hexadecimales no válido" + +#: jsonpath_scan.l:195 +msgid "unexpected end after backslash" +msgstr "fin inesperado después de backslash" + +#: jsonpath_scan.l:201 repl_scanner.l:211 scan.l:756 +msgid "unterminated quoted string" +msgstr "una cadena de caracteres entre comillas está inconclusa" + +#: jsonpath_scan.l:228 +msgid "unexpected end of comment" +msgstr "fin de comentario inesperado" + +#: jsonpath_scan.l:319 +msgid "invalid numeric literal" +msgstr "literal numérico no válido" + +#: jsonpath_scan.l:325 jsonpath_scan.l:331 jsonpath_scan.l:337 scan.l:1064 +#: scan.l:1068 scan.l:1072 scan.l:1076 +msgid "trailing junk after numeric literal" +msgstr "basura sigue después de un literal numérico" + #. translator: %s is typically "syntax error" #: jsonpath_scan.l:375 #, c-format @@ -30173,566 +31007,139 @@ msgstr "%s al final de la entrada jsonpath" msgid "%s at or near \"%s\" of jsonpath input" msgstr "%s en o cerca de «%s» de la entrada jsonpath" -#: jsonpath_scan.l:614 -#, fuzzy, c-format -#| msgid "could not encode server key" -msgid "could not convert unicode to server encoding" -msgstr "no se pudo codificar la llave del servidor" +#: jsonpath_scan.l:568 +msgid "invalid input" +msgstr "entrada no válida" -#: repl_gram.y:301 repl_gram.y:333 +#: jsonpath_scan.l:594 +msgid "invalid hexadecimal digit" +msgstr "dígito hexadecimal no válido" + +#: jsonpath_scan.l:625 +#, c-format +msgid "could not convert Unicode to server encoding" +msgstr "no se pudo convertir Unicode a la codificación del servidor" + +#: repl_gram.y:318 repl_gram.y:359 #, c-format msgid "invalid timeline %u" msgstr "timeline %u no válido" -#: scan.l:482 +#: repl_scanner.l:154 +msgid "invalid streaming start location" +msgstr "ubicación de inicio de flujo no válida" + +#: scan.l:497 msgid "unterminated /* comment" msgstr "un comentario /* está inconcluso" -#: scan.l:502 +#: scan.l:517 msgid "unterminated bit string literal" msgstr "una cadena de bits está inconclusa" -#: scan.l:516 +#: scan.l:531 msgid "unterminated hexadecimal string literal" msgstr "una cadena hexadecimal está inconclusa" -#: scan.l:566 +#: scan.l:581 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "uso inseguro de literal de cadena con escapes Unicode" -#: scan.l:567 +#: scan.l:582 #, c-format -msgid "String constants with Unicode escapes cannot be used when standard_conforming_strings is off." -msgstr "Los literales de cadena con escapes Unicode no pueden usarse cuando standard_conforming_strings está desactivado." +msgid "String constants with Unicode escapes cannot be used when \"standard_conforming_strings\" is off." +msgstr "Los literales de cadena con escapes Unicode no pueden usarse cuando «standard_conforming_strings» está desactivado." -#: scan.l:628 +#: scan.l:643 msgid "unhandled previous state in xqs" msgstr "estado previo no manejado en xqs" -#: scan.l:702 +#: scan.l:717 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "Los escapes Unicode deben ser \\uXXXX o \\UXXXXXXXX." -#: scan.l:713 +#: scan.l:728 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "uso inseguro de \\' en un literal de cadena" -#: scan.l:714 +#: scan.l:729 #, c-format msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." msgstr "Use '' para escribir comillas en cadenas. \\' es inseguro en codificaciones de sólo cliente." -#: scan.l:741 -msgid "unterminated quoted string" -msgstr "una cadena de caracteres entre comillas está inconclusa" - -#: scan.l:786 +#: scan.l:801 msgid "unterminated dollar-quoted string" msgstr "una cadena separada por $ está inconclusa" -#: scan.l:803 scan.l:813 +#: scan.l:818 scan.l:828 msgid "zero-length delimited identifier" msgstr "un identificador delimitado tiene largo cero" -#: scan.l:824 +#: scan.l:839 syncrep_scanner.l:101 msgid "unterminated quoted identifier" msgstr "un identificador entre comillas está inconcluso" -#: scan.l:987 +#: scan.l:1002 msgid "operator too long" msgstr "el operador es demasiado largo" -#: scan.l:1000 +#: scan.l:1015 msgid "trailing junk after parameter" msgstr "basura sigue después de un parámetro" -#: scan.l:1021 -#, fuzzy -#| msgid "invalid hexadecimal string literal" +#: scan.l:1036 msgid "invalid hexadecimal integer" -msgstr "cadena hexadecimal no válida" +msgstr "entero hexadecimal no válido" -#: scan.l:1025 -#, fuzzy -#| msgid "invalid Datum pointer" +#: scan.l:1040 msgid "invalid octal integer" -msgstr "puntero a Datum no válido" +msgstr "entero octal no válido" -#: scan.l:1029 -#, fuzzy -#| msgid "invalid binary \"%s\"" +#: scan.l:1044 msgid "invalid binary integer" -msgstr "el binario «%s» no es válido" - -#: scan.l:1049 scan.l:1053 scan.l:1057 scan.l:1061 scan.l:1065 scan.l:1069 -#: scan.l:1073 -msgid "trailing junk after numeric literal" -msgstr "basura sigue después de un literal numérico" +msgstr "entero binario no válido" #. translator: %s is typically the translation of "syntax error" -#: scan.l:1236 +#: scan.l:1239 #, c-format msgid "%s at end of input" msgstr "%s al final de la entrada" #. translator: first %s is typically the translation of "syntax error" -#: scan.l:1244 +#: scan.l:1247 #, c-format msgid "%s at or near \"%s\"" msgstr "%s en o cerca de «%s»" -#: scan.l:1434 +#: scan.l:1439 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "uso no estandar de \\' en un literal de cadena" -#: scan.l:1435 +#: scan.l:1440 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "Use '' para escribir comillas en cadenas, o use la sintaxis de escape de cadenas (E'...')." -#: scan.l:1444 +#: scan.l:1449 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "uso no estandar de \\\\ en un literal de cadena" -#: scan.l:1445 +#: scan.l:1450 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "Use '' para escribir comillas en cadenas, o use la sintaxis de escape de cadenas (E'\\\\')." -#: scan.l:1459 +#: scan.l:1464 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "uso no estandar de escape en un literal de cadena" -#: scan.l:1460 +#: scan.l:1465 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Use la sintaxis de escape para cadenas, por ej. E'\\r\\n'." - -#, c-format -#~ msgid "could not identify current directory: %m" -#~ msgstr "no se pudo identificar el directorio actual: %m" - -#, c-format -#~ msgid "could not read binary \"%s\"" -#~ msgstr "no se pudo leer el binario «%s»" - -#, c-format -#~ msgid "could not load library \"%s\": error code %lu" -#~ msgstr "no se pudo cargar la biblioteca «%s»: código de error %lu" - -#, c-format -#~ msgid "cannot create restricted tokens on this platform: error code %lu" -#~ msgstr "no se pueden crear tokens restrigidos en esta plataforma: código de error %lu" - -#, c-format -#~ msgid "could not remove file or directory \"%s\": %m" -#~ msgstr "no se pudo borrar el archivo o el directorio «%s»: %m" - -#, c-format -#~ msgid "tablespaces are not supported on this platform" -#~ msgstr "tablespaces no están soportados en esta plataforma" - -#, c-format -#~ msgid "invalid record offset at %X/%X" -#~ msgstr "posición de registro no válida en %X/%X" - -#, c-format -#~ msgid "invalid record length at %X/%X: wanted %u, got %u" -#~ msgstr "largo de registro no válido en %X/%X: se esperaba %u, se obtuvo %u" - -#, c-format -#~ msgid "invalid magic number %04X in log segment %s, offset %u" -#~ msgstr "número mágico %04X no válido en archivo %s, posición %u" - -#, c-format -#~ msgid "invalid info bits %04X in log segment %s, offset %u" -#~ msgstr "info bits %04X no válidos en archivo %s, posición %u" - -#, c-format -#~ msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -#~ msgstr "pageaddr %X/%X inesperado en archivo %s, posición %u" - -#, c-format -#~ msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -#~ msgstr "ID de timeline %u fuera de secuencia (después de %u) en archivo %s, posición %u" - -#, c-format -#~ msgid "invalid primary checkpoint link in control file" -#~ msgstr "el enlace de punto de control primario en archivo de control no es válido" - -#, c-format -#~ msgid "invalid checkpoint link in backup_label file" -#~ msgstr "el enlace del punto de control en backup_label no es válido" - -#, c-format -#~ msgid "invalid primary checkpoint record" -#~ msgstr "el registro del punto de control primario no es válido" - -#, c-format -#~ msgid "invalid resource manager ID in primary checkpoint record" -#~ msgstr "el ID de gestor de recursos en el registro del punto de control primario no es válido" - -#, c-format -#~ msgid "invalid xl_info in primary checkpoint record" -#~ msgstr "xl_info en el registro del punto de control primario no es válido" - -#, c-format -#~ msgid "invalid length of primary checkpoint record" -#~ msgstr "la longitud del registro del punto de control primario no es válida" - -#, c-format -#~ msgid "promote trigger file found: %s" -#~ msgstr "se encontró el archivo disparador de promoción: %s" - -#, c-format -#~ msgid "could not stat promote trigger file \"%s\": %m" -#~ msgstr "no se pudo hacer stat al archivo disparador de promoción «%s»: %m" - -#, c-format -#~ msgid "could not read from temporary file: %m" -#~ msgstr "no se pudo leer del archivo temporal: %m" - -#, c-format -#~ msgid "language with OID %u does not exist" -#~ msgstr "no existe el lenguaje con OID %u" - -#, c-format -#~ msgid "operator with OID %u does not exist" -#~ msgstr "no existe el operador con OID %u" - -#, c-format -#~ msgid "operator class with OID %u does not exist" -#~ msgstr "no existe la clase de operadores con OID %u" - -#, c-format -#~ msgid "operator family with OID %u does not exist" -#~ msgstr "no existe la familia de operadores con OID %u" - -#, c-format -#~ msgid "text search dictionary with OID %u does not exist" -#~ msgstr "no existe el diccionario de búsqueda en texto con OID %u" - -#, c-format -#~ msgid "text search configuration with OID %u does not exist" -#~ msgstr "no existe la configuración de búsqueda en texto con OID %u" - -#, c-format -#~ msgid "conversion with OID %u does not exist" -#~ msgstr "no existe la conversión con OID %u" - -#, c-format -#~ msgid "extension with OID %u does not exist" -#~ msgstr "no existe la extensión con OID %u" - -#, c-format -#~ msgid "statistics object with OID %u does not exist" -#~ msgstr "no existe el objeto de estadísticas con OID %u" - -#, c-format -#~ msgid "must have CREATEROLE privilege" -#~ msgstr "debe tener privilegio CREATEROLE" - -#, c-format -#~ msgid "could not form array type name for type \"%s\"" -#~ msgstr "no se pudo formar un nombre de tipo de array para el tipo «%s»" - -#, c-format -#~ msgid "invalid list syntax for \"publish\" option" -#~ msgstr "sintaxis de entrada no válida para la opción «publish»" - -#, c-format -#~ msgid "tables were not subscribed, you will have to run %s to subscribe the tables" -#~ msgstr "las tablas no se suscribieron, tendrá que ejecutar %s para suscribir las tablas" - -#, c-format -#~ msgid "permission denied to change owner of subscription \"%s\"" -#~ msgstr "se ha denegado el permiso para cambiar el dueño de la suscripción «%s»" - -#, c-format -#~ msgid "The owner of a subscription must be a superuser." -#~ msgstr "El dueño de una suscripción debe ser un superusuario." - -#, c-format -#~ msgid "Omit the generation expression in the definition of the child table column to inherit the generation expression from the parent table." -#~ msgstr "Omita la expresión de generación en la definición de la columna en la tabla hija para heredar la expresión de generación de la tabla padre." - -#, c-format -#~ msgid "column \"%s\" in child table has a conflicting generation expression" -#~ msgstr "la columna «%s» en tabla hija tiene una expresión de generación en conflicto" - -#, c-format -#~ msgid "cannot use invalid index \"%s\" as replica identity" -#~ msgstr "no se puede usar el índice no válido «%s» como identidad de réplica" - -#, c-format -#~ msgid "Triggers on partitioned tables cannot have transition tables." -#~ msgstr "Los triggers en tablas particionadas no pueden tener tablas de transición." - -#, c-format -#~ msgid "must be superuser to create superusers" -#~ msgstr "debe ser superusuario para crear superusuarios" - -#, c-format -#~ msgid "must be superuser to create replication users" -#~ msgstr "debe ser superusuario para crear usuarios de replicación" - -#, c-format -#~ msgid "must be superuser to create bypassrls users" -#~ msgstr "debe ser superusuario para crear usuarios con bypassrls" - -#, c-format -#~ msgid "must be superuser to alter superuser roles or change superuser attribute" -#~ msgstr "debe ser superusuario para modificar roles de superusuario o cambiar atributos de superusuario" - -#, c-format -#~ msgid "must be superuser to alter replication roles or change replication attribute" -#~ msgstr "debe ser superusuario para modificar roles de replicación o cambiar atributos de replicación" - -#, c-format -#~ msgid "must be superuser to change bypassrls attribute" -#~ msgstr "debe ser superusuario para cambiar el atributo bypassrls" - -#, c-format -#~ msgid "must be superuser to alter superusers" -#~ msgstr "debe ser superusuario para alterar superusuarios" - -#, c-format -#~ msgid "must be superuser to drop superusers" -#~ msgstr "debe ser superusuario para eliminar superusuarios" - -#, c-format -#~ msgid "must be superuser to rename superusers" -#~ msgstr "debe ser superusuario para cambiar el nombre a superusuarios" - -#, c-format -#~ msgid "must be superuser to set grantor" -#~ msgstr "debe ser superusuario para especificar el cedente (grantor)" - -#, c-format -#~ msgid "skipping \"%s\" --- only superuser can vacuum it" -#~ msgstr "omitiendo «%s»: sólo un superusuario puede aplicarle VACUUM" - -#, c-format -#~ msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" -#~ msgstr "omitiendo «%s»: sólo un superusuario o el dueño de la base de datos puede aplicarle VACUUM" - -#, c-format -#~ msgid "skipping \"%s\" --- only table or database owner can vacuum it" -#~ msgstr "omitiendo «%s»: sólo su dueño o el de la base de datos puede aplicarle VACUUM" - -#, c-format -#~ msgid "skipping \"%s\" --- only superuser can analyze it" -#~ msgstr "omitiendo «%s»: sólo un superusuario puede analizarla" - -#, c-format -#~ msgid "skipping \"%s\" --- only superuser or database owner can analyze it" -#~ msgstr "omitiendo «%s»: sólo un superusuario o el dueño de la base de datos puede analizarla" - -#, c-format -#~ msgid "skipping \"%s\" --- only table or database owner can analyze it" -#~ msgstr "omitiendo «%s»: sólo su dueño o el de la base de datos puede analizarla" - -#, c-format -#~ msgid "oldest xmin is far in the past" -#~ msgstr "xmin más antiguo es demasiado antiguo" - -#, c-format -#~ msgid "Close open transactions with multixacts soon to avoid wraparound problems." -#~ msgstr "Cierre transacciones con multixact pronto para prevenir problemas por reciclaje del contador." - -#, c-format -#~ msgid "could not load function _ldap_start_tls_sA in wldap32.dll" -#~ msgstr "no se pudo cargar la función _ldap_start_tls_sA en wldap32.dll" - -#, c-format -#~ msgid "LDAP over SSL is not supported on this platform." -#~ msgstr "LDAP sobre SSL no está soportado en esta plataforma." - -#, c-format -#~ msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" -#~ msgstr "no se pudo abrir el archivo secundario de autentificación «@%s» como «%s»: %m" - -#, c-format -#~ msgid "local connections are not supported by this build" -#~ msgstr "las conexiones locales no están soportadas en este servidor" - -#, c-format -#~ msgid "could not open usermap file \"%s\": %m" -#~ msgstr "no se pudo abrir el archivo de mapa de usuarios «%s»: %m" - -#, c-format -#~ msgid " -n do not reinitialize shared memory after abnormal exit\n" -#~ msgstr " -n no reinicializar memoria compartida después de salida anormal\n" - -#, c-format -#~ msgid "generated columns are not supported on partitions" -#~ msgstr "las columnas generadas no están soportadas en particiones" - -#, c-format -#~ msgid "could not load pg_hba.conf" -#~ msgstr "no se pudo cargar pg_hba.conf" - -#, c-format -#~ msgid "select() failed in postmaster: %m" -#~ msgstr "select() falló en postmaster: %m" - -#, c-format -#~ msgid "logical decoding cannot be used while in recovery" -#~ msgstr "la decodificación lógica no puede ejecutarse durante la recuperación" - -#, c-format -#~ msgid "could not read from streaming transaction's changes file \"%s\": %m" -#~ msgstr "no se pudo leer el archivo de cambios de transacción en flujo «%s»: %m" - -#, c-format -#~ msgid "could not read from streaming transaction's subxact file \"%s\": %m" -#~ msgstr "no se pudo leer el archivo subxact de transacción en flujo «%s»: %m" - -#, c-format -#~ msgid "must be superuser or replication role to use replication slots" -#~ msgstr "debe ser superusuario o rol de replicación para usar slots de replicación" - -#, c-format -#~ msgid "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds max_slot_wal_keep_size" -#~ msgstr "invalidando el slot «%s» porque su restart_lsn %X/%X excede max_slot_wal_keep_size" - -#, c-format -#~ msgid "cannot convert partitioned table \"%s\" to a view" -#~ msgstr "no se puede convertir la tabla particionada «%s» en vista" - -#, c-format -#~ msgid "cannot convert partition \"%s\" to a view" -#~ msgstr "no se puede convertir la partición «%s» en vista" - -#, c-format -#~ msgid "could not convert table \"%s\" to a view because it is not empty" -#~ msgstr "no se pudo convertir la tabla «%s» en vista porque no está vacía" - -#, c-format -#~ msgid "could not convert table \"%s\" to a view because it has triggers" -#~ msgstr "no se pudo convertir la tabla «%s» en vista porque tiene triggers" - -#, c-format -#~ msgid "In particular, the table cannot be involved in any foreign key relationships." -#~ msgstr "En particular, la tabla no puede estar involucrada en relaciones de llave foránea." - -#, c-format -#~ msgid "could not convert table \"%s\" to a view because it has indexes" -#~ msgstr "no se pudo convertir la tabla «%s» en vista porque tiene índices" - -#, c-format -#~ msgid "could not convert table \"%s\" to a view because it has child tables" -#~ msgstr "no se pudo convertir la tabla «%s» en vista porque tiene tablas hijas" - -#, c-format -#~ msgid "could not convert table \"%s\" to a view because it has parent tables" -#~ msgstr "no se pudo convertir la tabla «%s» en vista porque tiene tablas padres" - -#, c-format -#~ msgid "could not convert table \"%s\" to a view because it has row security enabled" -#~ msgstr "no se pudo convertir la tabla «%s» en vista porque tiene seguridad de registros activada" - -#, c-format -#~ msgid "could not convert table \"%s\" to a view because it has row security policies" -#~ msgstr "no se pudo convertir la tabla «%s» en vista porque tiene políticas de seguridad de registros" - -#, c-format -#~ msgid "could not link file \"%s\" to \"%s\": %m" -#~ msgstr "no se pudo enlazar (link) el archivo «%s» a «%s»: %m" - -#, c-format -#~ msgid "must be a member of the role whose process is being terminated or member of pg_signal_backend" -#~ msgstr "debe ser miembro del rol cuyo proceso se está terminando o ser miembro de pg_signal_backend" - -#, c-format -#~ msgid "must be a superuser to cancel superuser query" -#~ msgstr "debe ser superusuario para cancelar una consulta de superusuario" - -#, c-format -#~ msgid "must be a member of the role whose query is being canceled or member of pg_signal_backend" -#~ msgstr "debe ser miembro del rol cuya consulta se está cancelando o ser miembro de pg_signal_backend" - -#, c-format -#~ msgid "int2vector has too many elements" -#~ msgstr "int2vector tiene demasiados elementos" - -#, c-format -#~ msgid "oidvector has too many elements" -#~ msgstr "el oidvector tiene demasiados elementos" - -#, c-format -#~ msgid "argument %d cannot be null" -#~ msgstr "el argumento %d no puede ser null" - -#, c-format -#~ msgid "Object keys should be text." -#~ msgstr "Las llaves de un objeto deben ser de texto." - -#, c-format -#~ msgid "Apply system library package updates." -#~ msgstr "Aplique actualizaciones de paquetes de bibliotecas del sistema." - -#, c-format -#~ msgid "gtsvector_in not implemented" -#~ msgstr "gtsvector_in no está implementado" - -#, c-format -#~ msgid " GSS (authenticated=%s, encrypted=%s)" -#~ msgstr " GSS (autenticado=%s, cifrado=%s)" - -#, c-format -#~ msgid "must be superuser or replication role to start walsender" -#~ msgstr "debe ser superusuario o rol de replicación para iniciar el walsender" - -#~ msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." -#~ msgstr "Número de transacciones por las cuales VACUUM y la limpieza HOT deberían postergarse." - -#~ msgid "Specifies a file name whose presence ends recovery in the standby." -#~ msgstr "Especifica un nombre de archivo cuya presencia termina la recuperación en el standby." - -#~ msgid "Forces use of parallel query facilities." -#~ msgstr "Obliga al uso de la funcionalidad de consultas paralelas." - -#~ msgid "If possible, run query using a parallel worker and with parallel restrictions." -#~ msgstr "Si es posible, ejecuta cada consulta en un ayudante paralelo y con restricciones de paralelismo." - -#, c-format -#~ msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" -#~ msgstr "no se pudo leer el bloque %ld del archivo temporal: se leyeron sólo %zu de %zu bytes" - -#, c-format -#~ msgid "could not read from shared tuplestore temporary file" -#~ msgstr "no se pudo leer desde el archivo temporal del tuplestore compartido" - -#, c-format -#~ msgid "could not read from shared tuplestore temporary file: read only %zu of %zu bytes" -#~ msgstr "no se pudo leer el archivo temporal del tuplestore compartido: se leyeron sólo %zu de %zu bytes" - -#, c-format -#~ msgid "could not read from tuplestore temporary file: read only %zu of %zu bytes" -#~ msgstr "no se pudo leer el archivo temporal del tuplestore: se leyeron sólo %zu de %zu bytes" - -#, c-format -#~ msgid "VALUES in FROM must have an alias" -#~ msgstr "VALUES en FROM debe tener un alias" - -#, c-format -#~ msgid "For example, FROM (VALUES ...) [AS] foo." -#~ msgstr "Por ejemplo, FROM (VALUES ...) [AS] foo." - -#, c-format -#~ msgid "subquery in FROM must have an alias" -#~ msgstr "las subconsultas en FROM deben tener un alias" - -#, c-format -#~ msgid "For example, FROM (SELECT ...) [AS] foo." -#~ msgstr "Por ejemplo, FROM (SELECT ...) [AS] foo." - -#~ msgid "invalid streaming start location" -#~ msgstr "posición de inicio de flujo de WAL no válida" diff --git a/src/backend/po/fr.po b/src/backend/po/fr.po index ff2a32bdb2246..8039e217b1cf4 100644 --- a/src/backend/po/fr.po +++ b/src/backend/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-02-03 22:41+0000\n" -"PO-Revision-Date: 2022-10-31 18:00+0100\n" +"POT-Creation-Date: 2023-10-29 17:11+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,48 +19,58 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.1.1\n" +"X-Generator: Poedit 3.5\n" -#: ../common/compression.c:130 ../common/compression.c:139 -#: ../common/compression.c:148 +#: ../common/compression.c:132 ../common/compression.c:141 +#: ../common/compression.c:150 #, c-format msgid "this build does not support compression with %s" msgstr "cette construction ne supporte pas la compression avec %s" -#: ../common/compression.c:203 +#: ../common/compression.c:205 msgid "found empty string where a compression option was expected" msgstr "a trouvé une chaîne vide alors qu'une option de compression était attendue" -#: ../common/compression.c:237 +#: ../common/compression.c:244 #, c-format msgid "unrecognized compression option: \"%s\"" msgstr "option de compression inconnue : « %s »" -#: ../common/compression.c:276 +#: ../common/compression.c:283 #, c-format msgid "compression option \"%s\" requires a value" msgstr "l'option de compression « %s » requiert une valeur" -#: ../common/compression.c:285 +#: ../common/compression.c:292 #, c-format msgid "value for compression option \"%s\" must be an integer" msgstr "la valeur pour l'option de compression « %s » doit être un entier" -#: ../common/compression.c:335 +#: ../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "la valeur pour l'option de compression « %s » doit être un booléen" + +#: ../common/compression.c:379 #, c-format msgid "compression algorithm \"%s\" does not accept a compression level" msgstr "l'algorithme de compression « %s » n'accepte pas un niveau de compression" -#: ../common/compression.c:342 +#: ../common/compression.c:386 #, c-format msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" msgstr "l'algorithme de compression « %s » attend un niveau de compression compris entre %d et %d (par défaut à %d)" -#: ../common/compression.c:353 +#: ../common/compression.c:397 #, c-format msgid "compression algorithm \"%s\" does not accept a worker count" msgstr "l'algorithme de compression « %s » n'accepte pas un nombre de workers" +#: ../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "l'algorithme de compression « %s » n'accepte pas un mode distance longue" + #: ../common/config_info.c:134 ../common/config_info.c:142 #: ../common/config_info.c:150 ../common/config_info.c:158 #: ../common/config_info.c:166 ../common/config_info.c:174 @@ -68,66 +78,64 @@ msgstr "l'algorithme de compression « %s » n'accepte pas un nombre de workers" msgid "not recorded" msgstr "non enregistré" -#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 -#: commands/copyfrom.c:1515 commands/extension.c:3383 utils/adt/genfile.c:123 +#: ../common/controldata_utils.c:79 ../common/controldata_utils.c:83 +#: commands/copyfrom.c:1683 commands/extension.c:3480 utils/adt/genfile.c:123 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" -#: ../common/controldata_utils.c:84 ../common/controldata_utils.c:86 +#: ../common/controldata_utils.c:94 ../common/controldata_utils.c:96 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1348 access/transam/xlog.c:3207 -#: access/transam/xlog.c:4022 access/transam/xlogrecovery.c:1178 -#: access/transam/xlogrecovery.c:1270 access/transam/xlogrecovery.c:1307 -#: access/transam/xlogrecovery.c:1367 backup/basebackup.c:1843 -#: commands/extension.c:3393 libpq/hba.c:505 replication/logical/origin.c:729 -#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4948 -#: replication/logical/snapbuild.c:1858 replication/logical/snapbuild.c:1900 -#: replication/logical/snapbuild.c:1927 replication/slot.c:1807 -#: replication/slot.c:1848 replication/walsender.c:658 -#: storage/file/buffile.c:463 storage/file/copydir.c:195 -#: utils/adt/genfile.c:197 utils/adt/misc.c:863 utils/cache/relmapper.c:813 +#: access/transam/twophase.c:1347 access/transam/xlog.c:3193 +#: access/transam/xlog.c:3996 access/transam/xlogrecovery.c:1199 +#: access/transam/xlogrecovery.c:1291 access/transam/xlogrecovery.c:1328 +#: access/transam/xlogrecovery.c:1388 backup/basebackup.c:1842 +#: commands/extension.c:3490 libpq/hba.c:769 replication/logical/origin.c:745 +#: replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5050 +#: replication/logical/snapbuild.c:2031 replication/slot.c:1953 +#: replication/slot.c:1994 replication/walsender.c:643 +#: storage/file/buffile.c:470 storage/file/copydir.c:185 +#: utils/adt/genfile.c:197 utils/adt/misc.c:984 utils/cache/relmapper.c:827 #, c-format msgid "could not read file \"%s\": %m" msgstr "n'a pas pu lire le fichier « %s » : %m" -#: ../common/controldata_utils.c:92 ../common/controldata_utils.c:95 -#: access/transam/xlog.c:3212 access/transam/xlog.c:4027 -#: backup/basebackup.c:1847 replication/logical/origin.c:734 -#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1863 -#: replication/logical/snapbuild.c:1905 replication/logical/snapbuild.c:1932 -#: replication/slot.c:1811 replication/slot.c:1852 replication/walsender.c:663 -#: utils/cache/relmapper.c:817 +#: ../common/controldata_utils.c:102 ../common/controldata_utils.c:105 +#: access/transam/xlog.c:3198 access/transam/xlog.c:4001 +#: backup/basebackup.c:1846 replication/logical/origin.c:750 +#: replication/logical/origin.c:789 replication/logical/snapbuild.c:2036 +#: replication/slot.c:1957 replication/slot.c:1998 replication/walsender.c:648 +#: utils/cache/relmapper.c:831 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" -#: ../common/controldata_utils.c:104 ../common/controldata_utils.c:108 -#: ../common/controldata_utils.c:241 ../common/controldata_utils.c:244 -#: access/heap/rewriteheap.c:1178 access/heap/rewriteheap.c:1281 +#: ../common/controldata_utils.c:114 ../common/controldata_utils.c:118 +#: ../common/controldata_utils.c:263 ../common/controldata_utils.c:266 +#: access/heap/rewriteheap.c:1175 access/heap/rewriteheap.c:1280 #: access/transam/timeline.c:392 access/transam/timeline.c:438 -#: access/transam/timeline.c:516 access/transam/twophase.c:1360 -#: access/transam/twophase.c:1772 access/transam/xlog.c:3054 -#: access/transam/xlog.c:3247 access/transam/xlog.c:3252 -#: access/transam/xlog.c:3390 access/transam/xlog.c:3992 -#: access/transam/xlog.c:4738 commands/copyfrom.c:1575 commands/copyto.c:327 -#: libpq/be-fsstubs.c:455 libpq/be-fsstubs.c:525 -#: replication/logical/origin.c:667 replication/logical/origin.c:806 -#: replication/logical/reorderbuffer.c:5006 -#: replication/logical/snapbuild.c:1767 replication/logical/snapbuild.c:1940 -#: replication/slot.c:1698 replication/slot.c:1859 replication/walsender.c:673 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:745 -#: storage/file/fd.c:3643 storage/file/fd.c:3749 utils/cache/relmapper.c:828 -#: utils/cache/relmapper.c:956 +#: access/transam/timeline.c:512 access/transam/twophase.c:1359 +#: access/transam/twophase.c:1771 access/transam/xlog.c:3039 +#: access/transam/xlog.c:3233 access/transam/xlog.c:3238 +#: access/transam/xlog.c:3374 access/transam/xlog.c:3966 +#: access/transam/xlog.c:4885 commands/copyfrom.c:1743 commands/copyto.c:332 +#: libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 +#: replication/logical/origin.c:683 replication/logical/origin.c:822 +#: replication/logical/reorderbuffer.c:5102 +#: replication/logical/snapbuild.c:1798 replication/logical/snapbuild.c:1922 +#: replication/slot.c:1844 replication/slot.c:2005 replication/walsender.c:658 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:782 +#: storage/file/fd.c:3700 storage/file/fd.c:3806 utils/cache/relmapper.c:839 +#: utils/cache/relmapper.c:945 #, c-format msgid "could not close file \"%s\": %m" msgstr "n'a pas pu fermer le fichier « %s » : %m" -#: ../common/controldata_utils.c:124 +#: ../common/controldata_utils.c:154 msgid "byte ordering mismatch" msgstr "différence de l'ordre des octets" -#: ../common/controldata_utils.c:126 +#: ../common/controldata_utils.c:156 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -141,102 +149,101 @@ msgstr "" "résultats ci-dessous sont incorrects, et l'installation de PostgreSQL\n" "est incompatible avec ce répertoire des données." -#: ../common/controldata_utils.c:189 ../common/controldata_utils.c:194 -#: ../common/file_utils.c:232 ../common/file_utils.c:291 -#: ../common/file_utils.c:365 access/heap/rewriteheap.c:1264 +#: ../common/controldata_utils.c:211 ../common/controldata_utils.c:216 +#: ../common/file_utils.c:228 ../common/file_utils.c:287 +#: ../common/file_utils.c:361 access/heap/rewriteheap.c:1263 #: access/transam/timeline.c:111 access/transam/timeline.c:251 -#: access/transam/timeline.c:348 access/transam/twophase.c:1304 -#: access/transam/xlog.c:2941 access/transam/xlog.c:3123 -#: access/transam/xlog.c:3162 access/transam/xlog.c:3357 -#: access/transam/xlog.c:4012 access/transam/xlogrecovery.c:4190 -#: access/transam/xlogrecovery.c:4293 access/transam/xlogutils.c:852 -#: backup/basebackup.c:522 backup/basebackup.c:1520 postmaster/syslogger.c:1560 -#: replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3601 -#: replication/logical/reorderbuffer.c:4152 -#: replication/logical/reorderbuffer.c:4928 -#: replication/logical/snapbuild.c:1722 replication/logical/snapbuild.c:1829 -#: replication/slot.c:1779 replication/walsender.c:631 -#: replication/walsender.c:2722 storage/file/copydir.c:161 -#: storage/file/fd.c:720 storage/file/fd.c:3395 storage/file/fd.c:3630 -#: storage/file/fd.c:3720 storage/smgr/md.c:538 utils/cache/relmapper.c:792 -#: utils/cache/relmapper.c:900 utils/error/elog.c:1933 -#: utils/init/miscinit.c:1366 utils/init/miscinit.c:1500 -#: utils/init/miscinit.c:1577 utils/misc/guc.c:8991 utils/misc/guc.c:9040 +#: access/transam/timeline.c:348 access/transam/twophase.c:1303 +#: access/transam/xlog.c:2946 access/transam/xlog.c:3109 +#: access/transam/xlog.c:3148 access/transam/xlog.c:3341 +#: access/transam/xlog.c:3986 access/transam/xlogrecovery.c:4179 +#: access/transam/xlogrecovery.c:4282 access/transam/xlogutils.c:838 +#: backup/basebackup.c:538 backup/basebackup.c:1512 libpq/hba.c:629 +#: postmaster/syslogger.c:1560 replication/logical/origin.c:735 +#: replication/logical/reorderbuffer.c:3706 +#: replication/logical/reorderbuffer.c:4257 +#: replication/logical/reorderbuffer.c:5030 +#: replication/logical/snapbuild.c:1753 replication/logical/snapbuild.c:1863 +#: replication/slot.c:1925 replication/walsender.c:616 +#: replication/walsender.c:2731 storage/file/copydir.c:151 +#: storage/file/fd.c:757 storage/file/fd.c:3457 storage/file/fd.c:3687 +#: storage/file/fd.c:3777 storage/smgr/md.c:663 utils/cache/relmapper.c:816 +#: utils/cache/relmapper.c:924 utils/error/elog.c:2082 +#: utils/init/miscinit.c:1530 utils/init/miscinit.c:1664 +#: utils/init/miscinit.c:1741 utils/misc/guc.c:4600 utils/misc/guc.c:4650 #, c-format msgid "could not open file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier « %s » : %m" -#: ../common/controldata_utils.c:210 ../common/controldata_utils.c:213 -#: access/transam/twophase.c:1745 access/transam/twophase.c:1754 -#: access/transam/xlog.c:8670 access/transam/xlogfuncs.c:600 -#: backup/basebackup_server.c:173 backup/basebackup_server.c:266 -#: postmaster/postmaster.c:5638 postmaster/syslogger.c:1571 +#: ../common/controldata_utils.c:232 ../common/controldata_utils.c:235 +#: access/transam/twophase.c:1744 access/transam/twophase.c:1753 +#: access/transam/xlog.c:8755 access/transam/xlogfuncs.c:708 +#: backup/basebackup_server.c:175 backup/basebackup_server.c:268 +#: postmaster/postmaster.c:5573 postmaster/syslogger.c:1571 #: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 -#: utils/cache/relmapper.c:934 +#: utils/cache/relmapper.c:936 #, c-format msgid "could not write file \"%s\": %m" msgstr "impossible d'écrire le fichier « %s » : %m" -#: ../common/controldata_utils.c:227 ../common/controldata_utils.c:232 -#: ../common/file_utils.c:303 ../common/file_utils.c:373 -#: access/heap/rewriteheap.c:960 access/heap/rewriteheap.c:1172 -#: access/heap/rewriteheap.c:1275 access/transam/timeline.c:432 -#: access/transam/timeline.c:510 access/transam/twophase.c:1766 -#: access/transam/xlog.c:3047 access/transam/xlog.c:3241 -#: access/transam/xlog.c:3985 access/transam/xlog.c:7973 -#: access/transam/xlog.c:8016 backup/basebackup_server.c:207 -#: replication/logical/snapbuild.c:1760 replication/slot.c:1684 -#: replication/slot.c:1789 storage/file/fd.c:737 storage/file/fd.c:3741 -#: storage/smgr/md.c:989 storage/smgr/md.c:1030 storage/sync/sync.c:453 -#: utils/cache/relmapper.c:949 utils/misc/guc.c:8760 +#: ../common/controldata_utils.c:249 ../common/controldata_utils.c:254 +#: ../common/file_utils.c:299 ../common/file_utils.c:369 +#: access/heap/rewriteheap.c:959 access/heap/rewriteheap.c:1169 +#: access/heap/rewriteheap.c:1274 access/transam/timeline.c:432 +#: access/transam/timeline.c:506 access/transam/twophase.c:1765 +#: access/transam/xlog.c:3032 access/transam/xlog.c:3227 +#: access/transam/xlog.c:3959 access/transam/xlog.c:8145 +#: access/transam/xlog.c:8190 backup/basebackup_server.c:209 +#: replication/logical/snapbuild.c:1791 replication/slot.c:1830 +#: replication/slot.c:1935 storage/file/fd.c:774 storage/file/fd.c:3798 +#: storage/smgr/md.c:1135 storage/smgr/md.c:1180 storage/sync/sync.c:451 +#: utils/misc/guc.c:4370 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" -#: ../common/cryptohash.c:266 ../common/cryptohash_openssl.c:133 -#: ../common/cryptohash_openssl.c:332 ../common/exec.c:560 ../common/exec.c:605 -#: ../common/exec.c:697 ../common/hmac.c:309 ../common/hmac.c:325 +#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:133 +#: ../common/cryptohash_openssl.c:332 ../common/exec.c:550 ../common/exec.c:595 +#: ../common/exec.c:687 ../common/hmac.c:309 ../common/hmac.c:325 #: ../common/hmac_openssl.c:132 ../common/hmac_openssl.c:327 #: ../common/md5_common.c:155 ../common/psprintf.c:143 -#: ../common/scram-common.c:247 ../common/stringinfo.c:305 ../port/path.c:751 -#: ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1413 -#: access/transam/xlogrecovery.c:568 lib/dshash.c:253 libpq/auth.c:1338 -#: libpq/auth.c:1406 libpq/auth.c:1964 libpq/be-secure-gssapi.c:520 -#: postmaster/bgworker.c:349 postmaster/bgworker.c:931 -#: postmaster/postmaster.c:2591 postmaster/postmaster.c:4177 -#: postmaster/postmaster.c:4849 postmaster/postmaster.c:5563 -#: postmaster/postmaster.c:5934 -#: replication/libpqwalreceiver/libpqwalreceiver.c:300 -#: replication/logical/logical.c:205 replication/walsender.c:701 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:892 storage/file/fd.c:1434 -#: storage/file/fd.c:1595 storage/file/fd.c:2409 storage/ipc/procarray.c:1448 -#: storage/ipc/procarray.c:2260 storage/ipc/procarray.c:2267 -#: storage/ipc/procarray.c:2770 storage/ipc/procarray.c:3401 -#: utils/adt/formatting.c:1732 utils/adt/formatting.c:1854 -#: utils/adt/formatting.c:1977 utils/adt/pg_locale.c:450 -#: utils/adt/pg_locale.c:614 utils/adt/regexp.c:224 utils/fmgr/dfmgr.c:229 -#: utils/hash/dynahash.c:513 utils/hash/dynahash.c:613 -#: utils/hash/dynahash.c:1116 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 -#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5192 -#: utils/misc/guc.c:5208 utils/misc/guc.c:5221 utils/misc/guc.c:8738 -#: utils/misc/tzparser.c:476 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:701 -#: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:266 -#: utils/mmgr/mcxt.c:888 utils/mmgr/mcxt.c:924 utils/mmgr/mcxt.c:962 -#: utils/mmgr/mcxt.c:1000 utils/mmgr/mcxt.c:1088 utils/mmgr/mcxt.c:1119 -#: utils/mmgr/mcxt.c:1155 utils/mmgr/mcxt.c:1207 utils/mmgr/mcxt.c:1242 -#: utils/mmgr/mcxt.c:1277 utils/mmgr/slab.c:238 +#: ../common/scram-common.c:258 ../common/stringinfo.c:305 ../port/path.c:751 +#: ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1412 +#: access/transam/xlogrecovery.c:589 lib/dshash.c:253 libpq/auth.c:1345 +#: libpq/auth.c:1389 libpq/auth.c:1946 libpq/be-secure-gssapi.c:524 +#: postmaster/bgworker.c:352 postmaster/bgworker.c:934 +#: postmaster/postmaster.c:2537 postmaster/postmaster.c:4130 +#: postmaster/postmaster.c:5498 postmaster/postmaster.c:5869 +#: replication/libpqwalreceiver/libpqwalreceiver.c:308 +#: replication/logical/logical.c:208 replication/walsender.c:686 +#: storage/buffer/localbuf.c:601 storage/file/fd.c:866 storage/file/fd.c:1397 +#: storage/file/fd.c:1558 storage/file/fd.c:2478 storage/ipc/procarray.c:1449 +#: storage/ipc/procarray.c:2232 storage/ipc/procarray.c:2239 +#: storage/ipc/procarray.c:2738 storage/ipc/procarray.c:3374 +#: utils/adt/formatting.c:1690 utils/adt/formatting.c:1812 +#: utils/adt/formatting.c:1935 utils/adt/pg_locale.c:473 +#: utils/adt/pg_locale.c:637 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:514 +#: utils/hash/dynahash.c:614 utils/hash/dynahash.c:1111 utils/mb/mbutils.c:402 +#: utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 utils/mb/mbutils.c:842 +#: utils/misc/guc.c:640 utils/misc/guc.c:665 utils/misc/guc.c:1053 +#: utils/misc/guc.c:4348 utils/misc/tzparser.c:476 utils/mmgr/aset.c:445 +#: utils/mmgr/dsa.c:714 utils/mmgr/dsa.c:736 utils/mmgr/dsa.c:817 +#: utils/mmgr/generation.c:205 utils/mmgr/mcxt.c:1046 utils/mmgr/mcxt.c:1082 +#: utils/mmgr/mcxt.c:1120 utils/mmgr/mcxt.c:1158 utils/mmgr/mcxt.c:1246 +#: utils/mmgr/mcxt.c:1277 utils/mmgr/mcxt.c:1313 utils/mmgr/mcxt.c:1502 +#: utils/mmgr/mcxt.c:1547 utils/mmgr/mcxt.c:1604 utils/mmgr/slab.c:366 #, c-format msgid "out of memory" msgstr "mémoire épuisée" -#: ../common/cryptohash.c:271 ../common/cryptohash.c:277 +#: ../common/cryptohash.c:266 ../common/cryptohash.c:272 #: ../common/cryptohash_openssl.c:344 ../common/cryptohash_openssl.c:352 #: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:339 #: ../common/hmac_openssl.c:347 msgid "success" msgstr "succès" -#: ../common/cryptohash.c:273 ../common/cryptohash_openssl.c:346 +#: ../common/cryptohash.c:268 ../common/cryptohash_openssl.c:346 #: ../common/hmac_openssl.c:341 msgid "destination buffer too small" msgstr "tampon de destination trop petit" @@ -245,90 +252,80 @@ msgstr "tampon de destination trop petit" msgid "OpenSSL failure" msgstr "échec OpenSSL" -#: ../common/exec.c:149 ../common/exec.c:266 ../common/exec.c:312 +#: ../common/exec.c:172 #, c-format -msgid "could not identify current directory: %m" -msgstr "n'a pas pu identifier le répertoire courant : %m" +msgid "invalid binary \"%s\": %m" +msgstr "binaire « %s » invalide : %m" -#: ../common/exec.c:168 +#: ../common/exec.c:215 #, c-format -msgid "invalid binary \"%s\"" -msgstr "binaire « %s » invalide" - -#: ../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "n'a pas pu lire le binaire « %s »" +msgid "could not read binary \"%s\": %m" +msgstr "n'a pas pu lire le binaire « %s » : %m" -#: ../common/exec.c:226 +#: ../common/exec.c:223 #, c-format msgid "could not find a \"%s\" to execute" msgstr "n'a pas pu trouver un « %s » à exécuter" -#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:439 -#, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "n'a pas pu modifier le répertoire par « %s » : %m" - -#: ../common/exec.c:299 access/transam/xlog.c:8319 backup/basebackup.c:1340 -#: utils/adt/misc.c:342 +#: ../common/exec.c:250 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "n'a pas pu lire le lien symbolique « %s » : %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "n'a pas pu résoudre le chemin « %s » en sa forme absolue : %m" -#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 -#: storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1663 -#: storage/ipc/latch.c:1789 +#: ../common/exec.c:412 libpq/pqcomm.c:728 storage/ipc/latch.c:1128 +#: storage/ipc/latch.c:1308 storage/ipc/latch.c:1541 storage/ipc/latch.c:1703 +#: storage/ipc/latch.c:1829 #, c-format msgid "%s() failed: %m" msgstr "échec de %s() : %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 -#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:162 +#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 #: ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 -#: ../port/path.c:808 utils/misc/ps_status.c:181 utils/misc/ps_status.c:189 -#: utils/misc/ps_status.c:219 utils/misc/ps_status.c:227 +#: ../port/path.c:808 utils/misc/ps_status.c:168 utils/misc/ps_status.c:176 +#: utils/misc/ps_status.c:203 utils/misc/ps_status.c:211 #, c-format msgid "out of memory\n" msgstr "mémoire épuisée\n" -#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:154 +#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" -#: ../common/file_utils.c:87 ../common/file_utils.c:451 -#: ../common/file_utils.c:455 access/transam/twophase.c:1316 -#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:230 -#: backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 -#: commands/copyfrom.c:1525 commands/copyto.c:725 commands/extension.c:3372 -#: commands/tablespace.c:826 commands/tablespace.c:917 guc-file.l:1061 -#: postmaster/pgarch.c:597 replication/logical/snapbuild.c:1639 -#: storage/file/copydir.c:68 storage/file/copydir.c:107 storage/file/fd.c:1951 -#: storage/file/fd.c:2037 storage/file/fd.c:3243 storage/file/fd.c:3450 -#: utils/adt/dbsize.c:92 utils/adt/dbsize.c:244 utils/adt/dbsize.c:324 -#: utils/adt/genfile.c:413 utils/adt/genfile.c:588 utils/adt/misc.c:327 +#: ../common/file_utils.c:87 ../common/file_utils.c:447 +#: ../common/file_utils.c:451 access/transam/twophase.c:1315 +#: access/transam/xlogarchive.c:112 access/transam/xlogarchive.c:236 +#: backup/basebackup.c:346 backup/basebackup.c:544 backup/basebackup.c:615 +#: commands/copyfrom.c:1693 commands/copyto.c:702 commands/extension.c:3469 +#: commands/tablespace.c:810 commands/tablespace.c:899 postmaster/pgarch.c:590 +#: replication/logical/snapbuild.c:1649 storage/file/fd.c:1922 +#: storage/file/fd.c:2008 storage/file/fd.c:3511 utils/adt/dbsize.c:106 +#: utils/adt/dbsize.c:258 utils/adt/dbsize.c:338 utils/adt/genfile.c:483 +#: utils/adt/genfile.c:658 utils/adt/misc.c:340 #, c-format msgid "could not stat file \"%s\": %m" msgstr "n'a pas pu tester le fichier « %s » : %m" -#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:749 -#: commands/tablespace.c:759 postmaster/postmaster.c:1576 -#: storage/file/fd.c:2812 storage/file/reinit.c:126 utils/adt/misc.c:235 -#: utils/misc/tzparser.c:338 +#: ../common/file_utils.c:162 ../common/pgfnames.c:48 ../common/rmtree.c:63 +#: commands/tablespace.c:734 commands/tablespace.c:744 +#: postmaster/postmaster.c:1564 storage/file/fd.c:2880 +#: storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:338 #, c-format msgid "could not open directory \"%s\": %m" msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" -#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2824 +#: ../common/file_utils.c:196 ../common/pgfnames.c:69 ../common/rmtree.c:104 +#: storage/file/fd.c:2892 #, c-format msgid "could not read directory \"%s\": %m" msgstr "n'a pas pu lire le répertoire « %s » : %m" -#: ../common/file_utils.c:383 access/transam/xlogarchive.c:419 -#: postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1779 -#: replication/slot.c:721 replication/slot.c:1570 replication/slot.c:1712 -#: storage/file/fd.c:755 storage/file/fd.c:853 utils/time/snapmgr.c:1282 +#: ../common/file_utils.c:379 access/transam/xlogarchive.c:390 +#: postmaster/pgarch.c:746 postmaster/syslogger.c:1608 +#: replication/logical/snapbuild.c:1810 replication/slot.c:723 +#: replication/slot.c:1716 replication/slot.c:1858 storage/file/fd.c:792 +#: utils/time/snapmgr.c:1284 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" @@ -337,85 +334,90 @@ msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" msgid "internal error" msgstr "erreur interne" -#: ../common/jsonapi.c:1075 +#: ../common/jsonapi.c:1144 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "La séquence d'échappement « \\%s » est invalide." -#: ../common/jsonapi.c:1078 +#: ../common/jsonapi.c:1147 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Le caractère de valeur 0x%02x doit être échappé." -#: ../common/jsonapi.c:1081 +#: ../common/jsonapi.c:1150 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Attendait une fin de l'entrée, mais a trouvé « %s »." -#: ../common/jsonapi.c:1084 +#: ../common/jsonapi.c:1153 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Élément de tableau ou « ] » attendu, mais « %s » trouvé." -#: ../common/jsonapi.c:1087 +#: ../common/jsonapi.c:1156 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "« , » ou « ] » attendu, mais « %s » trouvé." -#: ../common/jsonapi.c:1090 +#: ../common/jsonapi.c:1159 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "« : » attendu, mais « %s » trouvé." -#: ../common/jsonapi.c:1093 +#: ../common/jsonapi.c:1162 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Valeur JSON attendue, mais « %s » trouvé." -#: ../common/jsonapi.c:1096 +#: ../common/jsonapi.c:1165 msgid "The input string ended unexpectedly." msgstr "La chaîne en entrée se ferme de manière inattendue." -#: ../common/jsonapi.c:1098 +#: ../common/jsonapi.c:1167 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Chaîne ou « } » attendu, mais « %s » trouvé." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:1170 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "« , » ou « } » attendu, mais « %s » trouvé." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:1173 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Chaîne attendue, mais « %s » trouvé." -#: ../common/jsonapi.c:1107 +#: ../common/jsonapi.c:1176 #, c-format msgid "Token \"%s\" is invalid." msgstr "Le jeton « %s » n'est pas valide." -#: ../common/jsonapi.c:1110 jsonpath_scan.l:495 +#: ../common/jsonapi.c:1179 jsonpath_scan.l:597 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 ne peut pas être converti en texte." -#: ../common/jsonapi.c:1112 +#: ../common/jsonapi.c:1181 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "« \\u » doit être suivi par quatre chiffres hexadécimaux." -#: ../common/jsonapi.c:1115 +#: ../common/jsonapi.c:1184 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." -msgstr "les valeurs d'échappement Unicode ne peuvent pas être utilisées pour des valeurs de point code au-dessus de 007F quand l'encodage n'est pas UTF8." +msgstr "Les valeurs d'échappement Unicode ne peuvent pas être utilisées pour des valeurs de point code au-dessus de 007F quand l'encodage n'est pas UTF8." + +#: ../common/jsonapi.c:1187 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "La valeur d'échappement unicode ne peut pas être traduite dans l'encodage du serveur %s." -#: ../common/jsonapi.c:1117 jsonpath_scan.l:516 +#: ../common/jsonapi.c:1190 jsonpath_scan.l:630 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Une substitution unicode haute ne doit pas suivre une substitution haute." -#: ../common/jsonapi.c:1119 jsonpath_scan.l:527 jsonpath_scan.l:537 -#: jsonpath_scan.l:579 +#: ../common/jsonapi.c:1192 jsonpath_scan.l:641 jsonpath_scan.l:651 +#: jsonpath_scan.l:702 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Une substitution unicode basse ne doit pas suivre une substitution haute." @@ -440,6 +442,25 @@ msgstr "détail : " msgid "hint: " msgstr "astuce : " +#: ../common/percentrepl.c:79 ../common/percentrepl.c:85 +#: ../common/percentrepl.c:118 ../common/percentrepl.c:124 +#: postmaster/postmaster.c:2211 utils/misc/guc.c:3118 utils/misc/guc.c:3154 +#: utils/misc/guc.c:3224 utils/misc/guc.c:4547 utils/misc/guc.c:6721 +#: utils/misc/guc.c:6762 +#, c-format +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "valeur invalide pour le paramètre « %s » : « %s »" + +#: ../common/percentrepl.c:80 ../common/percentrepl.c:86 +#, c-format +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "La chaîne se termine de façon inattendue après le caractère d'échappement : « %% »" + +#: ../common/percentrepl.c:119 ../common/percentrepl.c:125 +#, c-format +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "La chaîne contient un joker inattendu « %%%c »." + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -455,67 +476,66 @@ msgstr "nom du fork invalide" msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "Les noms de fork valides sont « main », « fsm », « vm » et « init »." -#: ../common/restricted_token.c:64 libpq/auth.c:1368 libpq/auth.c:2400 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "n'a pas pu charger la bibliothèque « %s » : code d'erreur %lu" - -#: ../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "ne peut pas créer les jetons restreints sur cette plateforme : code d'erreur %lu" - -#: ../common/restricted_token.c:82 +#: ../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "n'a pas pu ouvrir le jeton du processus : code d'erreur %lu" -#: ../common/restricted_token.c:97 +#: ../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "n'a pas pu allouer les SID : code d'erreur %lu" -#: ../common/restricted_token.c:119 +#: ../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "n'a pas pu créer le jeton restreint : code d'erreur %lu" -#: ../common/restricted_token.c:140 +#: ../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu" -#: ../common/restricted_token.c:178 +#: ../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu" -#: ../common/restricted_token.c:193 +#: ../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu" -#: ../common/rmtree.c:79 backup/basebackup.c:1100 backup/basebackup.c:1276 +#: ../common/rmtree.c:95 access/heap/rewriteheap.c:1248 +#: access/transam/twophase.c:1704 access/transam/xlogarchive.c:120 +#: access/transam/xlogarchive.c:400 postmaster/postmaster.c:1143 +#: postmaster/syslogger.c:1537 replication/logical/origin.c:591 +#: replication/logical/reorderbuffer.c:4526 +#: replication/logical/snapbuild.c:1691 replication/logical/snapbuild.c:2125 +#: replication/slot.c:1909 storage/file/fd.c:832 storage/file/fd.c:3325 +#: storage/file/fd.c:3387 storage/file/reinit.c:262 storage/ipc/dsm.c:316 +#: storage/smgr/md.c:383 storage/smgr/md.c:442 storage/sync/sync.c:248 +#: utils/time/snapmgr.c:1608 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "" -"n'a pas pu récupérer les informations sur le fichier ou répertoire\n" -"« %s » : %m" +msgid "could not remove file \"%s\": %m" +msgstr "n'a pas pu supprimer le fichier « %s » : %m" -#: ../common/rmtree.c:101 ../common/rmtree.c:113 +#: ../common/rmtree.c:122 commands/tablespace.c:773 commands/tablespace.c:786 +#: commands/tablespace.c:821 commands/tablespace.c:911 storage/file/fd.c:3317 +#: storage/file/fd.c:3726 #, c-format -msgid "could not remove file or directory \"%s\": %m" -msgstr "n'a pas pu supprimer le fichier ou répertoire « %s » : %m" +msgid "could not remove directory \"%s\": %m" +msgstr "n'a pas pu supprimer le répertoire « %s » : %m" -#: ../common/scram-common.c:260 +#: ../common/scram-common.c:271 msgid "could not encode salt" msgstr "n'a pas pu encoder le sel" -#: ../common/scram-common.c:276 +#: ../common/scram-common.c:287 msgid "could not encode stored key" msgstr "n'a pas pu encoder la clé enregistrée" -#: ../common/scram-common.c:293 +#: ../common/scram-common.c:304 msgid "could not encode server key" msgstr "n'a pas pu encoder la clé serveur" @@ -540,7 +560,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "n'a pas pu trouver l'identifiant réel %ld de l'utilisateur : %s" -#: ../common/username.c:45 libpq/auth.c:1900 +#: ../common/username.c:45 libpq/auth.c:1881 msgid "user does not exist" msgstr "l'utilisateur n'existe pas" @@ -549,85 +569,85 @@ msgstr "l'utilisateur n'existe pas" msgid "user name lookup failure: error code %lu" msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu" -#: ../common/wait_error.c:45 +#: ../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "commande non exécutable" -#: ../common/wait_error.c:49 +#: ../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "commande introuvable" -#: ../common/wait_error.c:54 +#: ../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "le processus fils a quitté avec le code de sortie %d" -#: ../common/wait_error.c:62 +#: ../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "le processus fils a été terminé par l'exception 0x%X" -#: ../common/wait_error.c:66 +#: ../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "le processus fils a été terminé par le signal %d : %s" -#: ../common/wait_error.c:72 +#: ../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "le processus fils a quitté avec un statut %d non reconnu" -#: ../port/chklocale.c:306 +#: ../port/chklocale.c:283 #, c-format msgid "could not determine encoding for codeset \"%s\"" msgstr "n'a pas pu déterminer l'encodage pour le codeset « %s »" -#: ../port/chklocale.c:427 ../port/chklocale.c:433 +#: ../port/chklocale.c:404 ../port/chklocale.c:410 #, c-format msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" msgstr "n'a pas pu déterminer l'encodage pour la locale « %s » : le codeset vaut « %s »" -#: ../port/dirmod.c:218 +#: ../port/dirmod.c:284 #, c-format msgid "could not set junction for \"%s\": %s" msgstr "n'a pas pu configurer la jonction pour « %s » : %s" -#: ../port/dirmod.c:221 +#: ../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" msgstr "n'a pas pu configurer la jonction pour « %s » : %s\n" -#: ../port/dirmod.c:295 +#: ../port/dirmod.c:364 #, c-format msgid "could not get junction for \"%s\": %s" msgstr "n'a pas pu obtenir la jonction pour « %s » : %s" -#: ../port/dirmod.c:298 +#: ../port/dirmod.c:367 #, c-format msgid "could not get junction for \"%s\": %s\n" msgstr "n'a pas pu obtenir la jonction pour « %s » : %s\n" -#: ../port/open.c:117 +#: ../port/open.c:115 #, c-format msgid "could not open file \"%s\": %s" msgstr "n'a pas pu ouvrir le fichier « %s » : %s" -#: ../port/open.c:118 +#: ../port/open.c:116 msgid "lock violation" msgstr "violation du verrou" -#: ../port/open.c:118 +#: ../port/open.c:116 msgid "sharing violation" msgstr "violation du partage" -#: ../port/open.c:119 +#: ../port/open.c:117 #, c-format msgid "Continuing to retry for 30 seconds." msgstr "Continue à tenter pendant 30 secondes." -#: ../port/open.c:120 +#: ../port/open.c:118 #, c-format msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "" @@ -644,12 +664,12 @@ msgstr "n'a pas pu obtenir le répertoire de travail : %s\n" msgid "operating system error %d" msgstr "erreur %d du système d'exploitation" -#: ../port/thread.c:100 ../port/thread.c:136 +#: ../port/thread.c:50 ../port/thread.c:86 #, c-format msgid "could not look up local user ID %d: %s" msgstr "n'a pas pu rechercher l'identifiant de l'utilisateur local %d : %s" -#: ../port/thread.c:105 ../port/thread.c:141 +#: ../port/thread.c:55 ../port/thread.c:91 #, c-format msgid "local user with ID %d does not exist" msgstr "l'utilisateur local dont l'identifiant est %d n'existe pas" @@ -671,70 +691,54 @@ msgstr "" msgid "could not check access token membership: error code %lu\n" msgstr "n'a pas pu vérifier l'appartenance du jeton d'accès : code d'erreur %lu\n" -#: access/brin/brin.c:214 +#: access/brin/brin.c:216 #, c-format msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "requête de résumé d'intervalle BRIN pour la page « %s » de l'index « %u » n'a pas été enregistrée" -#: access/brin/brin.c:1018 access/brin/brin.c:1119 access/gin/ginfast.c:1038 -#: access/transam/xlogfuncs.c:165 access/transam/xlogfuncs.c:192 -#: access/transam/xlogfuncs.c:231 access/transam/xlogfuncs.c:252 -#: access/transam/xlogfuncs.c:273 access/transam/xlogfuncs.c:343 -#: access/transam/xlogfuncs.c:401 +#: access/brin/brin.c:1036 access/brin/brin.c:1137 access/gin/ginfast.c:1040 +#: access/transam/xlogfuncs.c:189 access/transam/xlogfuncs.c:214 +#: access/transam/xlogfuncs.c:247 access/transam/xlogfuncs.c:286 +#: access/transam/xlogfuncs.c:307 access/transam/xlogfuncs.c:328 +#: access/transam/xlogfuncs.c:398 access/transam/xlogfuncs.c:456 #, c-format msgid "recovery is in progress" msgstr "restauration en cours" -#: access/brin/brin.c:1019 access/brin/brin.c:1120 +#: access/brin/brin.c:1037 access/brin/brin.c:1138 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "Les fonctions de contrôle BRIN ne peuvent pas être exécutées pendant la restauration." -#: access/brin/brin.c:1024 access/brin/brin.c:1125 +#: access/brin/brin.c:1042 access/brin/brin.c:1143 #, c-format msgid "block number out of range: %lld" msgstr "numéro de bloc en dehors des limites : %lld" -#: access/brin/brin.c:1068 access/brin/brin.c:1151 +#: access/brin/brin.c:1086 access/brin/brin.c:1169 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "« %s » n'est pas un index BRIN" -#: access/brin/brin.c:1084 access/brin/brin.c:1167 +#: access/brin/brin.c:1102 access/brin/brin.c:1185 #, c-format msgid "could not open parent table of index \"%s\"" msgstr "n'a pas pu ouvrir la table parent de l'index « %s »" #: access/brin/brin_bloom.c:750 access/brin/brin_bloom.c:792 -#: access/brin/brin_minmax_multi.c:3012 access/brin/brin_minmax_multi.c:3155 +#: access/brin/brin_minmax_multi.c:2985 access/brin/brin_minmax_multi.c:3122 #: statistics/dependencies.c:663 statistics/dependencies.c:716 #: statistics/mcv.c:1484 statistics/mcv.c:1515 statistics/mvdistinct.c:344 #: statistics/mvdistinct.c:397 utils/adt/pseudotypes.c:43 -#: utils/adt/pseudotypes.c:77 utils/adt/pseudotypes.c:252 +#: utils/adt/pseudotypes.c:77 utils/adt/tsgistidx.c:93 #, c-format msgid "cannot accept a value of type %s" msgstr "ne peut pas accepter une valeur de type %s" -#: access/brin/brin_minmax_multi.c:2171 access/brin/brin_minmax_multi.c:2178 -#: access/brin/brin_minmax_multi.c:2185 utils/adt/timestamp.c:938 -#: utils/adt/timestamp.c:1509 utils/adt/timestamp.c:2761 -#: utils/adt/timestamp.c:2778 utils/adt/timestamp.c:2831 -#: utils/adt/timestamp.c:2870 utils/adt/timestamp.c:3115 -#: utils/adt/timestamp.c:3120 utils/adt/timestamp.c:3125 -#: utils/adt/timestamp.c:3175 utils/adt/timestamp.c:3182 -#: utils/adt/timestamp.c:3189 utils/adt/timestamp.c:3209 -#: utils/adt/timestamp.c:3216 utils/adt/timestamp.c:3223 -#: utils/adt/timestamp.c:3253 utils/adt/timestamp.c:3261 -#: utils/adt/timestamp.c:3305 utils/adt/timestamp.c:3731 -#: utils/adt/timestamp.c:3855 utils/adt/timestamp.c:4405 -#, c-format -msgid "interval out of range" -msgstr "intervalle en dehors des limites" - #: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 -#: access/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1442 access/spgist/spgdoinsert.c:2001 -#: access/spgist/spgdoinsert.c:2278 +#: access/brin/brin_pageops.c:852 access/gin/ginentrypage.c:110 +#: access/gist/gist.c:1462 access/spgist/spgdoinsert.c:2002 +#: access/spgist/spgdoinsert.c:2279 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "la taille de la ligne index, %zu, dépasse le maximum, %zu, pour l'index « %s »" @@ -744,7 +748,7 @@ msgstr "la taille de la ligne index, %zu, dépasse le maximum, %zu, pour l'index msgid "corrupted BRIN index: inconsistent range map" msgstr "index BRIN corrompu : carte d'intervalle incohérente" -#: access/brin/brin_revmap.c:602 +#: access/brin/brin_revmap.c:593 #, c-format msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" msgstr "type de page 0x%04X dans l'index BRIN « %s », bloc %u" @@ -831,22 +835,22 @@ msgstr "" "Le nombre de colonnes renvoyées (%d) ne correspond pas au nombre de colonnes\n" "attendues (%d)." -#: access/common/attmap.c:229 access/common/attmap.c:241 +#: access/common/attmap.c:234 access/common/attmap.c:246 #, c-format msgid "could not convert row type" msgstr "n'a pas pu convertir le type de ligne" -#: access/common/attmap.c:230 +#: access/common/attmap.c:235 #, c-format msgid "Attribute \"%s\" of type %s does not match corresponding attribute of type %s." msgstr "L'attribut « %s » du type %s ne correspond pas à l'attribut correspondant de type %s." -#: access/common/attmap.c:242 +#: access/common/attmap.c:247 #, c-format msgid "Attribute \"%s\" of type %s does not exist in type %s." msgstr "L'attribut « %s » du type %s n'existe pas dans le type %s." -#: access/common/heaptuple.c:1036 access/common/heaptuple.c:1371 +#: access/common/heaptuple.c:1124 access/common/heaptuple.c:1459 #, c-format msgid "number of columns (%d) exceeds limit (%d)" msgstr "le nombre de colonnes (%d) dépasse la limite (%d)" @@ -856,13 +860,13 @@ msgstr "le nombre de colonnes (%d) dépasse la limite (%d)" msgid "number of index columns (%d) exceeds limit (%d)" msgstr "le nombre de colonnes indexées (%d) dépasse la limite (%d)" -#: access/common/indextuple.c:209 access/spgist/spgutils.c:958 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:950 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "la ligne index requiert %zu octets, la taille maximum est %zu" -#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 -#: tcop/postgres.c:1921 +#: access/common/printtup.c:292 tcop/fastpath.c:107 tcop/fastpath.c:454 +#: tcop/postgres.c:1944 #, c-format msgid "unsupported format code: %d" msgstr "code de format non supporté : %d" @@ -880,78 +884,96 @@ msgstr "Les valeurs valides sont entre « local » et « cascaded »." msgid "user-defined relation parameter types limit exceeded" msgstr "limite dépassée des types de paramètres de la relation définie par l'utilisateur" -#: access/common/reloptions.c:1234 +#: access/common/reloptions.c:1233 #, c-format msgid "RESET must not include values for parameters" msgstr "RESET ne doit pas inclure de valeurs pour les paramètres" -#: access/common/reloptions.c:1266 +#: access/common/reloptions.c:1265 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "espace de nom du paramètre « %s » non reconnu" -#: access/common/reloptions.c:1303 utils/misc/guc.c:12986 +#: access/common/reloptions.c:1302 commands/variable.c:1167 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "les tables avec WITH OIDS ne sont pas supportées" -#: access/common/reloptions.c:1473 +#: access/common/reloptions.c:1470 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "paramètre « %s » non reconnu" -#: access/common/reloptions.c:1585 +#: access/common/reloptions.c:1582 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "le paramètre « %s » est spécifié plus d'une fois" -#: access/common/reloptions.c:1601 +#: access/common/reloptions.c:1598 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "valeur invalide pour l'option booléenne « %s » : %s" -#: access/common/reloptions.c:1613 +#: access/common/reloptions.c:1610 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "valeur invalide pour l'option de type integer « %s » : %s" -#: access/common/reloptions.c:1619 access/common/reloptions.c:1639 +#: access/common/reloptions.c:1616 access/common/reloptions.c:1636 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "valeur %s en dehors des limites pour l'option « %s »" -#: access/common/reloptions.c:1621 +#: access/common/reloptions.c:1618 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Les valeurs valides sont entre « %d » et « %d »." -#: access/common/reloptions.c:1633 +#: access/common/reloptions.c:1630 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "valeur invalide pour l'option de type float « %s » : %s" -#: access/common/reloptions.c:1641 +#: access/common/reloptions.c:1638 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Les valeurs valides sont entre « %f » et « %f »." -#: access/common/reloptions.c:1663 +#: access/common/reloptions.c:1660 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "valeur invalide pour l'option enum « %s » : %s" -#: access/common/toast_compression.c:32 +#: access/common/reloptions.c:1991 +#, fuzzy, c-format +#| msgid "cannot change inheritance of partitioned table" +msgid "cannot specify storage parameters for a partitioned table" +msgstr "ne peut pas modifier l'héritage d'une table partitionnée" + +#: access/common/reloptions.c:1992 +#, c-format +msgid "Specify storage parameters for its leaf partitions instead." +msgstr "" + +#: access/common/toast_compression.c:33 #, c-format msgid "compression method lz4 not supported" msgstr "méthode de compression lz4 non supportée" -#: access/common/toast_compression.c:33 +#: access/common/toast_compression.c:34 #, c-format msgid "This functionality requires the server to be built with lz4 support." msgstr "Cette fonctionnalité nécessite que le serveur dispose du support de lz4." -#: access/common/tupdesc.c:825 parser/parse_clause.c:773 -#: parser/parse_relation.c:1857 +#: access/common/tupdesc.c:837 commands/tablecmds.c:6953 +#: commands/tablecmds.c:12977 +#, fuzzy, c-format +#| msgid "mismatched array dimensions" +msgid "too many array dimensions" +msgstr "dimensions du tableau non correspondantes" + +#: access/common/tupdesc.c:842 parser/parse_clause.c:772 +#: parser/parse_relation.c:1913 #, c-format msgid "column \"%s\" cannot be declared SETOF" msgstr "la colonne « %s » ne peut pas être déclarée SETOF" @@ -966,22 +988,22 @@ msgstr "la posting list est trop longue" msgid "Reduce maintenance_work_mem." msgstr "Réduisez le maintenance_work_mem." -#: access/gin/ginfast.c:1039 +#: access/gin/ginfast.c:1041 #, c-format msgid "GIN pending list cannot be cleaned up during recovery." msgstr "la pending list GIN ne peut pas être nettoyée lors de la restauration." -#: access/gin/ginfast.c:1046 +#: access/gin/ginfast.c:1048 #, c-format msgid "\"%s\" is not a GIN index" msgstr "« %s » n'est pas un index GIN" -#: access/gin/ginfast.c:1057 +#: access/gin/ginfast.c:1059 #, c-format msgid "cannot access temporary indexes of other sessions" msgstr "ne peut pas accéder aux index temporaires d'autres sessions" -#: access/gin/ginget.c:271 access/nbtree/nbtinsert.c:760 +#: access/gin/ginget.c:273 access/nbtree/nbtinsert.c:762 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "échec pour retrouver la ligne dans l'index « %s »" @@ -998,9 +1020,9 @@ msgstr "" msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Pour corriger ceci, faites un REINDEX INDEX « %s »." -#: access/gin/ginutil.c:145 executor/execExpr.c:2165 -#: utils/adt/arrayfuncs.c:3819 utils/adt/arrayfuncs.c:6488 -#: utils/adt/rowtypes.c:957 +#: access/gin/ginutil.c:146 executor/execExpr.c:2169 +#: utils/adt/arrayfuncs.c:3996 utils/adt/arrayfuncs.c:6683 +#: utils/adt/rowtypes.c:984 #, c-format msgid "could not identify a comparison function for type %s" msgstr "n'a pas pu identifier une fonction de comparaison pour le type %s" @@ -1039,13 +1061,13 @@ msgstr "" #: access/gist/gist.c:762 access/gist/gistutil.c:801 access/gist/gistutil.c:812 #: access/gist/gistvacuum.c:429 access/hash/hashutil.c:227 #: access/hash/hashutil.c:238 access/hash/hashutil.c:250 -#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:810 -#: access/nbtree/nbtpage.c:821 +#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:813 +#: access/nbtree/nbtpage.c:824 #, c-format msgid "Please REINDEX it." msgstr "Merci d'exécuter REINDEX sur cet objet." -#: access/gist/gist.c:1176 +#: access/gist/gist.c:1195 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "correction d'une division non terminée dans l'index « %s », bloc %u" @@ -1064,13 +1086,13 @@ msgstr "" "CREATE INDEX." #: access/gist/gistutil.c:798 access/hash/hashutil.c:224 -#: access/nbtree/nbtpage.c:807 +#: access/nbtree/nbtpage.c:810 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "l'index « %s » contient une page zéro inattendue au bloc %u" #: access/gist/gistutil.c:809 access/hash/hashutil.c:235 -#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:818 +#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:821 #, c-format msgid "index \"%s\" contains corrupted page at block %u" msgstr "l'index « %s » contient une page corrompue au bloc %u" @@ -1089,30 +1111,30 @@ msgstr "" "la famille d'opérateur « %s » de la méthode d'accès %s contient la spécification opfamily ORDER BY\n" "incorrecte pour l'opérateur %s" -#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:335 -#: utils/adt/varchar.c:1003 utils/adt/varchar.c:1064 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:333 +#: utils/adt/varchar.c:1009 utils/adt/varchar.c:1064 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "n'a pas pu déterminer le collationnement à utiliser pour le hachage de chaîne" -#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:668 +#: access/hash/hashfunc.c:280 access/hash/hashfunc.c:334 catalog/heap.c:668 #: catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:1962 commands/tablecmds.c:17443 commands/view.c:86 -#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1690 -#: utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/like.c:190 -#: utils/adt/like_support.c:1025 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:1004 utils/adt/varchar.c:1065 utils/adt/varlena.c:1499 +#: commands/indexcmds.c:2039 commands/tablecmds.c:17480 commands/view.c:86 +#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1648 +#: utils/adt/formatting.c:1770 utils/adt/formatting.c:1893 utils/adt/like.c:191 +#: utils/adt/like_support.c:1025 utils/adt/varchar.c:739 +#: utils/adt/varchar.c:1010 utils/adt/varchar.c:1065 utils/adt/varlena.c:1518 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." -msgstr "Utilisez la clause COLLARE pour configurer explicitement le collationnement." +msgstr "Utilisez la clause COLLATE pour configurer explicitement le collationnement." -#: access/hash/hashinsert.c:83 +#: access/hash/hashinsert.c:86 #, c-format msgid "index row size %zu exceeds hash maximum %zu" msgstr "la taille de la ligne index, %zu, dépasse le hachage maximum, %zu" -#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 -#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1019 +#: access/hash/hashinsert.c:88 access/spgist/spgdoinsert.c:2006 +#: access/spgist/spgdoinsert.c:2283 access/spgist/spgutils.c:1011 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "Les valeurs plus larges qu'une page de tampon ne peuvent pas être indexées." @@ -1154,238 +1176,231 @@ msgstr "" msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "il manque un opérateur inter-type pour la famille d'opérateur « %s » de la méthode d'accès %s" -#: access/heap/heapam.c:2226 +#: access/heap/heapam.c:2038 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "ne peut pas insérer de lignes dans un processus parallèle" -#: access/heap/heapam.c:2697 +#: access/heap/heapam.c:2557 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "ne peut pas supprimer les lignes lors d'une opération parallèle" -#: access/heap/heapam.c:2743 +#: access/heap/heapam.c:2604 #, c-format msgid "attempted to delete invisible tuple" msgstr "tentative de supprimer une ligne invisible" -#: access/heap/heapam.c:3183 access/heap/heapam.c:6025 +#: access/heap/heapam.c:3047 access/heap/heapam.c:5914 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "ne peut pas mettre à jour les lignes lors d'une opération parallèle" -#: access/heap/heapam.c:3307 +#: access/heap/heapam.c:3175 #, c-format msgid "attempted to update invisible tuple" msgstr "tentative de mettre à jour une ligne invisible" -#: access/heap/heapam.c:4669 access/heap/heapam.c:4707 -#: access/heap/heapam.c:4972 access/heap/heapam_handler.c:456 +#: access/heap/heapam.c:4562 access/heap/heapam.c:4600 +#: access/heap/heapam.c:4865 access/heap/heapam_handler.c:467 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "n'a pas pu obtenir un verrou sur la relation « %s »" -#: access/heap/heapam_handler.c:401 +#: access/heap/heapam_handler.c:412 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update" msgstr "la ligne à verrouiller était déjà déplacée dans une autre partition du fait d'une mise à jour concurrente" -#: access/heap/hio.c:360 access/heap/rewriteheap.c:660 +#: access/heap/hio.c:536 access/heap/rewriteheap.c:659 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "la ligne est trop grande : taille %zu, taille maximale %zu" -#: access/heap/rewriteheap.c:920 +#: access/heap/rewriteheap.c:919 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "n'a pas pu écrire le fichier « %s », a écrit %d de %d : %m" -#: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 -#: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:2963 access/transam/xlog.c:3176 -#: access/transam/xlog.c:3964 access/transam/xlog.c:8653 -#: access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 -#: backup/basebackup_server.c:242 commands/dbcommands.c:517 -#: postmaster/postmaster.c:4604 postmaster/postmaster.c:5625 -#: replication/logical/origin.c:587 replication/slot.c:1631 -#: storage/file/copydir.c:167 storage/smgr/md.c:222 utils/time/snapmgr.c:1261 +#: access/heap/rewriteheap.c:1011 access/heap/rewriteheap.c:1128 +#: access/transam/timeline.c:329 access/transam/timeline.c:481 +#: access/transam/xlog.c:2971 access/transam/xlog.c:3162 +#: access/transam/xlog.c:3938 access/transam/xlog.c:8744 +#: access/transam/xlogfuncs.c:702 backup/basebackup_server.c:151 +#: backup/basebackup_server.c:244 commands/dbcommands.c:518 +#: postmaster/postmaster.c:4557 postmaster/postmaster.c:5560 +#: replication/logical/origin.c:603 replication/slot.c:1777 +#: storage/file/copydir.c:157 storage/smgr/md.c:232 utils/time/snapmgr.c:1263 #, c-format msgid "could not create file \"%s\": %m" msgstr "n'a pas pu créer le fichier « %s » : %m" -#: access/heap/rewriteheap.c:1141 +#: access/heap/rewriteheap.c:1138 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "n'a pas pu tronquer le fichier « %s » en %u : %m" -#: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 -#: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3035 access/transam/xlog.c:3232 -#: access/transam/xlog.c:3976 commands/dbcommands.c:529 -#: postmaster/postmaster.c:4614 postmaster/postmaster.c:4624 -#: replication/logical/origin.c:599 replication/logical/origin.c:641 -#: replication/logical/origin.c:660 replication/logical/snapbuild.c:1736 -#: replication/slot.c:1666 storage/file/buffile.c:537 -#: storage/file/copydir.c:207 utils/init/miscinit.c:1441 -#: utils/init/miscinit.c:1452 utils/init/miscinit.c:1460 utils/misc/guc.c:8721 -#: utils/misc/guc.c:8752 utils/misc/guc.c:10741 utils/misc/guc.c:10755 -#: utils/time/snapmgr.c:1266 utils/time/snapmgr.c:1273 +#: access/heap/rewriteheap.c:1156 access/transam/timeline.c:384 +#: access/transam/timeline.c:424 access/transam/timeline.c:498 +#: access/transam/xlog.c:3021 access/transam/xlog.c:3218 +#: access/transam/xlog.c:3950 commands/dbcommands.c:530 +#: postmaster/postmaster.c:4567 postmaster/postmaster.c:4577 +#: replication/logical/origin.c:615 replication/logical/origin.c:657 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1767 +#: replication/slot.c:1812 storage/file/buffile.c:545 +#: storage/file/copydir.c:197 utils/init/miscinit.c:1605 +#: utils/init/miscinit.c:1616 utils/init/miscinit.c:1624 utils/misc/guc.c:4331 +#: utils/misc/guc.c:4362 utils/misc/guc.c:5490 utils/misc/guc.c:5508 +#: utils/time/snapmgr.c:1268 utils/time/snapmgr.c:1275 #, c-format msgid "could not write to file \"%s\": %m" msgstr "n'a pas pu écrire dans le fichier « %s » : %m" -#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1705 -#: access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:429 -#: postmaster/postmaster.c:1157 postmaster/syslogger.c:1537 -#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4421 -#: replication/logical/snapbuild.c:1681 replication/logical/snapbuild.c:2097 -#: replication/slot.c:1763 storage/file/fd.c:795 storage/file/fd.c:3263 -#: storage/file/fd.c:3325 storage/file/reinit.c:262 storage/ipc/dsm.c:317 -#: storage/smgr/md.c:370 storage/smgr/md.c:429 storage/sync/sync.c:250 -#: utils/time/snapmgr.c:1606 -#, c-format -msgid "could not remove file \"%s\": %m" -msgstr "n'a pas pu supprimer le fichier « %s » : %m" - -#: access/heap/vacuumlazy.c:407 +#: access/heap/vacuumlazy.c:482 #, c-format msgid "aggressively vacuuming \"%s.%s.%s\"" msgstr "exécution d'un VACUUM agressif sur « %s.%s.%s »" -#: access/heap/vacuumlazy.c:412 +#: access/heap/vacuumlazy.c:487 #, c-format msgid "vacuuming \"%s.%s.%s\"" msgstr "exécution du VACUUM sur « %s.%s.%s »" -#: access/heap/vacuumlazy.c:663 +#: access/heap/vacuumlazy.c:635 #, c-format msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" msgstr "fin du VACUUM de « %s.%s.%s » : %d parcours d'index\n" -#: access/heap/vacuumlazy.c:674 +#: access/heap/vacuumlazy.c:646 #, c-format msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "VACUUM automatique agressif pour éviter un rebouclage des identifiants de transaction dans la table « %s.%s.%s » : %d parcours d'index\n" -#: access/heap/vacuumlazy.c:676 +#: access/heap/vacuumlazy.c:648 #, c-format msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "VACUUM automatique pour éviter un rebouclage des identifiants de transaction dans la table « %s.%s.%s » : parcours d'index : %d\n" -#: access/heap/vacuumlazy.c:681 +#: access/heap/vacuumlazy.c:653 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "VACUUM automatique agressif de la table « %s.%s.%s » : %d parcours d'index\n" -#: access/heap/vacuumlazy.c:683 +#: access/heap/vacuumlazy.c:655 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "VACUUM automatique de la table « %s.%s.%s » : %d parcours d'index\n" -#: access/heap/vacuumlazy.c:690 +#: access/heap/vacuumlazy.c:662 #, c-format msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" msgstr "pages : %u supprimées, %u restantes, %u parcourues (%.2f%% au total)\n" -#: access/heap/vacuumlazy.c:697 +#: access/heap/vacuumlazy.c:669 #, c-format msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" msgstr "lignes : %lld supprimées, %lld restantes, %lld sont mortes mais pas encore supprimables\n" -#: access/heap/vacuumlazy.c:703 +#: access/heap/vacuumlazy.c:675 #, c-format msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" msgstr "" -#: access/heap/vacuumlazy.c:708 +#: access/heap/vacuumlazy.c:681 #, c-format msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" msgstr "" -#: access/heap/vacuumlazy.c:714 +#: access/heap/vacuumlazy.c:688 #, c-format msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" msgstr "" -#: access/heap/vacuumlazy.c:721 +#: access/heap/vacuumlazy.c:696 #, c-format msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" msgstr "" -#: access/heap/vacuumlazy.c:727 +#: access/heap/vacuumlazy.c:699 +#, fuzzy, c-format +#| msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" +msgid "frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n" +msgstr "%u blocs de la table (%.2f%% au total) ont %lld versions mortes de lignes supprimées\n" + +#: access/heap/vacuumlazy.c:707 msgid "index scan not needed: " msgstr "parcours d'index non nécessaire : " -#: access/heap/vacuumlazy.c:729 +#: access/heap/vacuumlazy.c:709 msgid "index scan needed: " msgstr "parcours d'index nécessaire : " -#: access/heap/vacuumlazy.c:731 +#: access/heap/vacuumlazy.c:711 #, c-format msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" msgstr "%u blocs de la table (%.2f%% au total) ont %lld versions mortes de lignes supprimées\n" -#: access/heap/vacuumlazy.c:736 +#: access/heap/vacuumlazy.c:716 msgid "index scan bypassed: " msgstr "parcours d'index contourné : " -#: access/heap/vacuumlazy.c:738 +#: access/heap/vacuumlazy.c:718 msgid "index scan bypassed by failsafe: " msgstr "parcours d'index contourné par failsafe : " -#: access/heap/vacuumlazy.c:740 +#: access/heap/vacuumlazy.c:720 #, c-format msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" msgstr "%u pages de la table (%.2f%% au total) ont %lld identifiants d'élément mort\n" -#: access/heap/vacuumlazy.c:755 +#: access/heap/vacuumlazy.c:735 #, c-format msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" msgstr "index \"%s\": blocs : %u au total, %u nouvellement supprimés, %u actuellement supprimés, %u réutilisables\n" -#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 +#: access/heap/vacuumlazy.c:747 commands/analyze.c:796 #, c-format msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" msgstr "" "chronométrage I/O : lecture : %.3f ms, écriture : %.3f ms\n" "\n" -#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 +#: access/heap/vacuumlazy.c:757 commands/analyze.c:799 #, c-format msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" msgstr "vitesse moyenne de lecture : %.3f Mo/s, vitesse moyenne d'écriture : %.3f Mo/s\n" -#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 +#: access/heap/vacuumlazy.c:760 commands/analyze.c:801 #, c-format msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" msgstr "utilisation du cache : %lld récupérés, %lld ratés, %lld modifiés\n" -#: access/heap/vacuumlazy.c:785 +#: access/heap/vacuumlazy.c:765 #, c-format msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" msgstr "utilisation des WAL : %lld enregistrements, %lld images complètes de blocs, %llu octets\n" -#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 +#: access/heap/vacuumlazy.c:769 commands/analyze.c:805 #, c-format msgid "system usage: %s" msgstr "utilisation du système : %s" -#: access/heap/vacuumlazy.c:2463 +#: access/heap/vacuumlazy.c:2482 #, c-format msgid "table \"%s\": removed %lld dead item identifiers in %u pages" msgstr "table « %s »: %lld versions mortes de ligne supprimées dans %u blocs" -#: access/heap/vacuumlazy.c:2629 +#: access/heap/vacuumlazy.c:2642 #, c-format msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" msgstr "ignore la maintenance non essentielle de la table \"%s.%s.%s\" comme mesure de sécurité après %d parcours d'index" -#: access/heap/vacuumlazy.c:2634 +#: access/heap/vacuumlazy.c:2645 #, c-format msgid "The table's relfrozenxid or relminmxid is too far in the past." msgstr "le relfrozenxid ou le relminmxid de la table est trop loin dans le passé" -#: access/heap/vacuumlazy.c:2635 +#: access/heap/vacuumlazy.c:2646 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1394,67 +1409,67 @@ msgstr "" "Réfléchissez à augmenter la valeur du paramètre de configuration « maintenance_work_mem » ou « autovacuum_work_mem ».\n" "Vous pouvez aussi réfléchir à d'autres façons d'exécuter un VACUUM pour tenir sur l'allocation des identifiants de transaction." -#: access/heap/vacuumlazy.c:2878 +#: access/heap/vacuumlazy.c:2891 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "« %s » : arrêt du TRUNCATE à cause d'un conflit dans la demande de verrou" -#: access/heap/vacuumlazy.c:2948 +#: access/heap/vacuumlazy.c:2961 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "table « %s » : %u pages tronqués en %u" -#: access/heap/vacuumlazy.c:3010 +#: access/heap/vacuumlazy.c:3023 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "table « %s » : mis en suspens du TRUNCATE à cause d'un conflit dans la demande de verrou" -#: access/heap/vacuumlazy.c:3170 +#: access/heap/vacuumlazy.c:3183 #, c-format msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" msgstr "désactivation de l'option de parallélisation du VACUUM sur « %s » --- ne peut pas exécuter un VACUUM parallélisé sur des tables temporaires" -#: access/heap/vacuumlazy.c:3383 +#: access/heap/vacuumlazy.c:3399 #, c-format msgid "while scanning block %u offset %u of relation \"%s.%s\"" msgstr "lors du parcours du bloc %u au décalage %u de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:3386 +#: access/heap/vacuumlazy.c:3402 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "lors du parcours du bloc %u de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:3390 +#: access/heap/vacuumlazy.c:3406 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "lors du parcours de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:3398 +#: access/heap/vacuumlazy.c:3414 #, c-format msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" msgstr "lors du traitement par VACUUM du bloc %u au décalage %u de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:3401 +#: access/heap/vacuumlazy.c:3417 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "lors du VACUUM du bloc %u de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:3405 +#: access/heap/vacuumlazy.c:3421 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "lors du vacuum de la relation « %s.%s »" -#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1058 +#: access/heap/vacuumlazy.c:3426 commands/vacuumparallel.c:1074 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "lors du nettoyage de l'index « %s » dans la relation « %s.%s »" -#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1064 +#: access/heap/vacuumlazy.c:3431 commands/vacuumparallel.c:1080 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "lors du nettoyage de l'index « %s » dans la relation « %s.%s »" -#: access/heap/vacuumlazy.c:3421 +#: access/heap/vacuumlazy.c:3437 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "lors du tronquage de la relation « %s.%s » à %u blocs" @@ -1469,70 +1484,70 @@ msgstr "la méthode d'accès « %s » n'est pas de type %s" msgid "index access method \"%s\" does not have a handler" msgstr "la méthode d'accès « %s » n'a pas de handler" -#: access/index/genam.c:489 +#: access/index/genam.c:490 #, c-format msgid "transaction aborted during system catalog scan" msgstr "transaction annulée lors du parcours du catalogue système" -#: access/index/indexam.c:142 catalog/objectaddress.c:1376 -#: commands/indexcmds.c:2790 commands/tablecmds.c:271 commands/tablecmds.c:295 -#: commands/tablecmds.c:17131 commands/tablecmds.c:18910 +#: access/index/indexam.c:142 catalog/objectaddress.c:1394 +#: commands/indexcmds.c:2867 commands/tablecmds.c:272 commands/tablecmds.c:296 +#: commands/tablecmds.c:17177 commands/tablecmds.c:18953 #, c-format msgid "\"%s\" is not an index" msgstr "« %s » n'est pas un index" -#: access/index/indexam.c:973 +#: access/index/indexam.c:979 #, c-format msgid "operator class %s has no options" msgstr "la classe d'opérateur %s n'a pas d'options" -#: access/nbtree/nbtinsert.c:666 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "la valeur d'une clé dupliquée rompt la contrainte unique « %s »" -#: access/nbtree/nbtinsert.c:668 +#: access/nbtree/nbtinsert.c:670 #, c-format msgid "Key %s already exists." msgstr "La clé « %s » existe déjà." -#: access/nbtree/nbtinsert.c:762 +#: access/nbtree/nbtinsert.c:764 #, c-format msgid "This may be because of a non-immutable index expression." -msgstr "Ceci peut être dû à une expression d'index immutable." +msgstr "Ceci peut être dû à une expression d'index non immutable." -#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 -#: parser/parse_utilcmd.c:2332 +#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 +#: parser/parse_utilcmd.c:2317 #, c-format msgid "index \"%s\" is not a btree" msgstr "l'index « %s » n'est pas un btree" -#: access/nbtree/nbtpage.c:166 access/nbtree/nbtpage.c:615 +#: access/nbtree/nbtpage.c:164 access/nbtree/nbtpage.c:618 #, c-format msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" msgstr "la version ne correspond pas dans l'index « %s » : version du fichier %d, version courante %d, version minimale supportée %d" -#: access/nbtree/nbtpage.c:1874 +#: access/nbtree/nbtpage.c:1866 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "l'index « %s » contient une page interne à moitié morte" -#: access/nbtree/nbtpage.c:1876 +#: access/nbtree/nbtpage.c:1868 #, c-format msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." msgstr "Ceci peut être dû à un VACUUM interrompu en version 9.3 ou antérieure, avant la mise à jour. Merci d'utiliser REINDEX." -#: access/nbtree/nbtutils.c:2669 +#: access/nbtree/nbtutils.c:2677 #, c-format msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" msgstr "la taille de la ligne d'index, %zu, dépasse le maximum pour un btree de version %u, soit %zu, pour l'index « %s »" -#: access/nbtree/nbtutils.c:2675 +#: access/nbtree/nbtutils.c:2683 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "La ligne d'index référence le tuple (%u,%u) dans la relation « %s »." -#: access/nbtree/nbtutils.c:2679 +#: access/nbtree/nbtutils.c:2687 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1550,12 +1565,12 @@ msgstr "" "la famille d'opérateur « %s » de la méthode d'accès %s nécessite une fonction de support\n" "manquante pour les types %s et %s" -#: access/spgist/spgutils.c:244 +#: access/spgist/spgutils.c:245 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "la méthode de compression doit être définie quand le type feuille est différent du type d'entrée" -#: access/spgist/spgutils.c:1016 +#: access/spgist/spgutils.c:1008 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "la taille de la ligne interne SP-GiST, %zu, dépasse le maximum %zu" @@ -1572,40 +1587,33 @@ msgstr "" "la famille d'opérateur « %s » de la méthode d'accès %s nécessite la fonction de support %d\n" "pour le type %s" -#: access/table/table.c:49 access/table/table.c:83 access/table/table.c:112 -#: access/table/table.c:145 catalog/aclchk.c:1835 -#, c-format -msgid "\"%s\" is an index" -msgstr "« %s » est un index" - -#: access/table/table.c:54 access/table/table.c:88 access/table/table.c:117 -#: access/table/table.c:150 catalog/aclchk.c:1842 commands/tablecmds.c:13829 -#: commands/tablecmds.c:17140 -#, c-format -msgid "\"%s\" is a composite type" -msgstr "« %s » est un type composite" +#: access/table/table.c:145 optimizer/util/plancat.c:145 +#, fuzzy, c-format +#| msgid "cannot change relation \"%s\"" +msgid "cannot open relation \"%s\"" +msgstr "ne peut pas modifier la relation « %s »" -#: access/table/tableam.c:266 +#: access/table/tableam.c:265 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "le tid (%u, %u) n'est pas valide pour la relation « %s »" -#: access/table/tableamapi.c:115 +#: access/table/tableamapi.c:116 #, c-format msgid "%s cannot be empty." msgstr "%s ne peut pas être vide." -#: access/table/tableamapi.c:122 utils/misc/guc.c:12910 +#: access/table/tableamapi.c:123 access/transam/xlogrecovery.c:4774 #, c-format msgid "%s is too long (maximum %d characters)." msgstr "%s est trop long (%d caractères maximum)." -#: access/table/tableamapi.c:145 +#: access/table/tableamapi.c:146 #, c-format msgid "table access method \"%s\" does not exist" msgstr "la méthode d'accès à la table « %s » n'existe pas" -#: access/table/tableamapi.c:150 +#: access/table/tableamapi.c:151 #, c-format msgid "Table access method \"%s\" does not exist." msgstr "La méthode d'accès « %s » n'existe pas." @@ -1615,33 +1623,33 @@ msgstr "La méthode d'accès « %s » n'existe pas." msgid "sample percentage must be between 0 and 100" msgstr "le pourcentage de l'échantillonnage doit être compris entre 0 et 100" -#: access/transam/commit_ts.c:282 +#: access/transam/commit_ts.c:279 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "ne peut pas récupérer l'horodatage de la validation pour la transaction %u" -#: access/transam/commit_ts.c:380 +#: access/transam/commit_ts.c:377 #, c-format msgid "could not get commit timestamp data" msgstr "n'a pas pu récupérer les données d'horodatage de la validation" -#: access/transam/commit_ts.c:382 +#: access/transam/commit_ts.c:379 #, c-format msgid "Make sure the configuration parameter \"%s\" is set on the primary server." msgstr "Assurez-vous que le paramètre de configuration « %s » soit configuré sur le serveur primaire." -#: access/transam/commit_ts.c:384 +#: access/transam/commit_ts.c:381 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Assurez-vous que le paramètre de configuration « %s » soit configuré." -#: access/transam/multixact.c:1022 +#: access/transam/multixact.c:1023 #, c-format msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"" msgstr "la base de données n'accepte pas de commandes qui génèrent de nouveaux MultiXactId pour éviter les pertes de données suite à une réinitialisation de l'identifiant de transaction dans la base de données « %s »" -#: access/transam/multixact.c:1024 access/transam/multixact.c:1031 -#: access/transam/multixact.c:1055 access/transam/multixact.c:1064 +#: access/transam/multixact.c:1025 access/transam/multixact.c:1032 +#: access/transam/multixact.c:1056 access/transam/multixact.c:1065 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" @@ -1650,67 +1658,67 @@ msgstr "" "Exécutez un VACUUM sur toute cette base.\n" "Vous pourriez avoir besoin de valider ou d'annuler de vieilles transactions préparées, ou de supprimer les slots de réplication périmés." -#: access/transam/multixact.c:1029 +#: access/transam/multixact.c:1030 #, c-format msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u" msgstr "" "la base de données n'accepte pas de commandes qui génèrent de nouveaux MultiXactId pour éviter des pertes de données à cause de la réinitialisation de l'identifiant de transaction dans\n" "la base de données d'OID %u" -#: access/transam/multixact.c:1050 access/transam/multixact.c:2334 +#: access/transam/multixact.c:1051 access/transam/multixact.c:2333 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" msgstr[0] "un VACUUM doit être exécuté sur la base de données « %s » dans un maximum de %u MultiXactId" msgstr[1] "un VACUUM doit être exécuté sur la base de données « %s » dans un maximum de %u MultiXactId" -#: access/transam/multixact.c:1059 access/transam/multixact.c:2343 +#: access/transam/multixact.c:1060 access/transam/multixact.c:2342 #, c-format msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" msgstr[0] "un VACUUM doit être exécuté sur la base de données d'OID %u dans un maximum de %u MultiXactId" msgstr[1] "un VACUUM doit être exécuté sur la base de données d'OID %u dans un maximum de %u MultiXactId" -#: access/transam/multixact.c:1120 +#: access/transam/multixact.c:1121 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "dépassement de limite des membres du multixact" -#: access/transam/multixact.c:1121 +#: access/transam/multixact.c:1122 #, c-format msgid "This command would create a multixact with %u members, but the remaining space is only enough for %u member." msgid_plural "This command would create a multixact with %u members, but the remaining space is only enough for %u members." msgstr[0] "Cette commande créera un multixact avec %u membres, mais l'espace restant est seulement suffisant pour %u membre." msgstr[1] "Cette commande créera un multixact avec %u membres, mais l'espace restant est seulement suffisant pour %u membres." -#: access/transam/multixact.c:1126 +#: access/transam/multixact.c:1127 #, c-format msgid "Execute a database-wide VACUUM in database with OID %u with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." msgstr "Exécute un VACUUM sur la base dans la base d'OID %u avec une configuration réduite pour vacuum_multixact_freeze_min_age et vacuum_multixact_freeze_table_age." -#: access/transam/multixact.c:1157 +#: access/transam/multixact.c:1158 #, c-format msgid "database with OID %u must be vacuumed before %d more multixact member is used" msgid_plural "database with OID %u must be vacuumed before %d more multixact members are used" msgstr[0] "un VACUUM doit être exécuté sur la base de données d'OID %u avant que %d MultiXactId supplémentaire ne soit utilisé" msgstr[1] "un VACUUM doit être exécuté sur la base de données d'OID %u avant que %d MultiXactId supplémentaires ne soient utilisés" -#: access/transam/multixact.c:1162 +#: access/transam/multixact.c:1163 #, c-format msgid "Execute a database-wide VACUUM in that database with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." msgstr "Exécute un VACUUM sur la base dans cette base avec une configuration réduite pour vacuum_multixact_freeze_min_age et vacuum_multixact_freeze_table_age." -#: access/transam/multixact.c:1301 +#: access/transam/multixact.c:1302 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "le MultiXactId %u n'existe plus : wraparound apparent" -#: access/transam/multixact.c:1307 +#: access/transam/multixact.c:1308 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "le MultiXactId %u n'a pas encore été créé : wraparound apparent" -#: access/transam/multixact.c:2339 access/transam/multixact.c:2348 +#: access/transam/multixact.c:2338 access/transam/multixact.c:2347 #: access/transam/varsup.c:151 access/transam/varsup.c:158 #: access/transam/varsup.c:466 access/transam/varsup.c:473 #, c-format @@ -1732,51 +1740,51 @@ msgstr "Les protections sur la réutilisation d'un membre MultiXact sont désact msgid "MultiXact member wraparound protections are now enabled" msgstr "Les protections sur la réutilisation d'un membre MultiXact sont maintenant activées" -#: access/transam/multixact.c:3031 +#: access/transam/multixact.c:3027 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" -msgstr "plus ancien MultiXact introuvable %u, plus récent MultiXact %u, ignore le troncage" +msgstr "plus ancien MultiXact introuvable %u, plus récent MultiXact %u, ignore le tronquage" -#: access/transam/multixact.c:3049 +#: access/transam/multixact.c:3045 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" -msgstr "ne peut pas tronquer jusqu'au MutiXact %u car il n'existe pas sur disque, ignore le troncage" +msgstr "ne peut pas tronquer jusqu'au MutiXact %u car il n'existe pas sur disque, ignore le tronquage" -#: access/transam/multixact.c:3363 +#: access/transam/multixact.c:3359 #, c-format msgid "invalid MultiXactId: %u" msgstr "MultiXactId invalide : %u" -#: access/transam/parallel.c:718 access/transam/parallel.c:837 +#: access/transam/parallel.c:729 access/transam/parallel.c:848 #, c-format msgid "parallel worker failed to initialize" msgstr "échec de l'initialisation du worker parallèle" -#: access/transam/parallel.c:719 access/transam/parallel.c:838 +#: access/transam/parallel.c:730 access/transam/parallel.c:849 #, c-format msgid "More details may be available in the server log." msgstr "Plus de détails sont disponibles dans les traces du serveur." -#: access/transam/parallel.c:899 +#: access/transam/parallel.c:910 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "postmaster a quitté pendant une transaction parallèle" -#: access/transam/parallel.c:1086 +#: access/transam/parallel.c:1097 #, c-format msgid "lost connection to parallel worker" msgstr "perte de la connexion au processus parallèle" -#: access/transam/parallel.c:1152 access/transam/parallel.c:1154 +#: access/transam/parallel.c:1163 access/transam/parallel.c:1165 msgid "parallel worker" msgstr "processus parallèle" -#: access/transam/parallel.c:1307 +#: access/transam/parallel.c:1319 replication/logical/applyparallelworker.c:893 #, c-format msgid "could not map dynamic shared memory segment" msgstr "n'a pas pu mapper le segment de mémoire partagée dynamique" -#: access/transam/parallel.c:1312 +#: access/transam/parallel.c:1324 replication/logical/applyparallelworker.c:899 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "numéro magique invalide dans le segment de mémoire partagée dynamique" @@ -1936,182 +1944,199 @@ msgstr "" "Les identifiants timeline doivent être plus petits que les enfants des\n" "identifiants timeline." -#: access/transam/timeline.c:597 +#: access/transam/timeline.c:589 #, c-format msgid "requested timeline %u is not in this server's history" msgstr "la timeline %u requise n'est pas dans l'historique de ce serveur" -#: access/transam/twophase.c:385 +#: access/transam/twophase.c:386 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "l'identifiant de la transaction « %s » est trop long" -#: access/transam/twophase.c:392 +#: access/transam/twophase.c:393 #, c-format msgid "prepared transactions are disabled" msgstr "les transactions préparées sont désactivées" -#: access/transam/twophase.c:393 +#: access/transam/twophase.c:394 #, c-format msgid "Set max_prepared_transactions to a nonzero value." msgstr "Configure max_prepared_transactions à une valeur différente de zéro." -#: access/transam/twophase.c:412 +#: access/transam/twophase.c:413 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "l'identifiant de la transaction « %s » est déjà utilisé" -#: access/transam/twophase.c:421 access/transam/twophase.c:2486 +#: access/transam/twophase.c:422 access/transam/twophase.c:2517 #, c-format msgid "maximum number of prepared transactions reached" msgstr "nombre maximum de transactions préparées obtenu" -#: access/transam/twophase.c:422 access/transam/twophase.c:2487 +#: access/transam/twophase.c:423 access/transam/twophase.c:2518 #, c-format msgid "Increase max_prepared_transactions (currently %d)." msgstr "Augmentez max_prepared_transactions (actuellement %d)." -#: access/transam/twophase.c:598 +#: access/transam/twophase.c:599 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "la transaction préparée d'identifiant « %s » est occupée" -#: access/transam/twophase.c:604 +#: access/transam/twophase.c:605 #, c-format msgid "permission denied to finish prepared transaction" msgstr "droit refusé pour terminer la transaction préparée" -#: access/transam/twophase.c:605 +#: access/transam/twophase.c:606 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "Doit être super-utilisateur ou l'utilisateur qui a préparé la transaction." -#: access/transam/twophase.c:616 +#: access/transam/twophase.c:617 #, c-format msgid "prepared transaction belongs to another database" msgstr "la transaction préparée appartient à une autre base de données" -#: access/transam/twophase.c:617 +#: access/transam/twophase.c:618 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "" "Connectez-vous à la base de données où la transaction a été préparée pour\n" "la terminer." -#: access/transam/twophase.c:632 +#: access/transam/twophase.c:633 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "la transaction préparée d'identifiant « %s » n'existe pas" -#: access/transam/twophase.c:1169 +#: access/transam/twophase.c:1168 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "" "longueur maximale dépassée pour le fichier de statut de la validation en\n" "deux phase" -#: access/transam/twophase.c:1324 +#: access/transam/twophase.c:1323 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" msgstr[0] "taille incorrecte du fichier « %s » : %lld octet" msgstr[1] "taille incorrecte du fichier « %s » : %lld octets" -#: access/transam/twophase.c:1333 +#: access/transam/twophase.c:1332 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "alignement incorrect du décalage CRC pour le fichier « %s »" -#: access/transam/twophase.c:1351 +#: access/transam/twophase.c:1350 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %lld" -#: access/transam/twophase.c:1366 +#: access/transam/twophase.c:1365 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "nombre magique invalide dans le fichier « %s »" -#: access/transam/twophase.c:1372 +#: access/transam/twophase.c:1371 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "taille invalide stockée dans le fichier « %s »" -#: access/transam/twophase.c:1384 +#: access/transam/twophase.c:1383 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "la somme de contrôle CRC calculée ne correspond par à la valeur enregistrée dans le fichier « %s »" -#: access/transam/twophase.c:1414 access/transam/xlogrecovery.c:569 -#: replication/logical/logical.c:206 replication/walsender.c:702 +#: access/transam/twophase.c:1413 access/transam/xlogrecovery.c:590 +#: replication/logical/logical.c:209 replication/walsender.c:687 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Échec lors de l'allocation d'un processeur de lecture de journaux de transactions." -#: access/transam/twophase.c:1424 +#: access/transam/twophase.c:1423 #, c-format msgid "could not read two-phase state from WAL at %X/%X: %s" msgstr "n'a pas pu lire le fichier d'état de la validation en deux phases depuis les journaux de transactions à %X/%X : %s" -#: access/transam/twophase.c:1429 +#: access/transam/twophase.c:1428 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "n'a pas pu lire le fichier d'état de la validation en deux phases depuis les journaux de transactions à %X/%X" -#: access/transam/twophase.c:1437 +#: access/transam/twophase.c:1436 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "" "le fichier d'état de la validation en deux phases attendu n'est pas présent\n" "dans les journaux de transaction à %X/%X" -#: access/transam/twophase.c:1733 +#: access/transam/twophase.c:1732 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "n'a pas pu recréer le fichier « %s » : %m" -#: access/transam/twophase.c:1860 +#: access/transam/twophase.c:1859 #, c-format msgid "%u two-phase state file was written for a long-running prepared transaction" msgid_plural "%u two-phase state files were written for long-running prepared transactions" msgstr[0] "le fichier d'état de la validation en deux phases %u a été écrit pour une transaction préparée de longue durée" msgstr[1] "les fichiers d'état de la validation en deux phases %u ont été écrits pour des transactions préparées de longue durée" -#: access/transam/twophase.c:2094 +#: access/transam/twophase.c:2093 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "récupération de la transaction préparée %u à partir de la mémoire partagée" -#: access/transam/twophase.c:2187 +#: access/transam/twophase.c:2186 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "suppression du vieux fichier d'état de la validation en deux phases pour la transaction %u" -#: access/transam/twophase.c:2194 +#: access/transam/twophase.c:2193 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "suppression du vieux fichier d'état de la validation en deux phases de la mémoire pour la transaction %u" -#: access/transam/twophase.c:2207 +#: access/transam/twophase.c:2206 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "suppression du futur fichier d'état de la validation en deux phases pour la transaction %u" -#: access/transam/twophase.c:2214 +#: access/transam/twophase.c:2213 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "suppression du futur fichier d'état de la validation en deux phases en mémoire pour la transaction %u" -#: access/transam/twophase.c:2239 +#: access/transam/twophase.c:2238 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "fichier d'état de la validation en deux phases pour la transaction %u corrompu" -#: access/transam/twophase.c:2244 +#: access/transam/twophase.c:2243 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "mémoire d'état de la validation en deux phases pour la transaction %u corrompue" +#: access/transam/twophase.c:2500 +#, fuzzy, c-format +#| msgid "corrupted two-phase state file for transaction %u" +msgid "could not recover two-phase state file for transaction %u" +msgstr "fichier d'état de la validation en deux phases pour la transaction %u corrompu" + +#: access/transam/twophase.c:2502 +#, c-format +msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." +msgstr "" + +#: access/transam/twophase.c:2510 jit/jit.c:205 utils/fmgr/dfmgr.c:209 +#: utils/fmgr/dfmgr.c:415 +#, c-format +msgid "could not access file \"%s\": %m" +msgstr "n'a pas pu accéder au fichier « %s » : %m" + #: access/transam/varsup.c:129 #, c-format msgid "database is not accepting commands to avoid wraparound data loss in database \"%s\"" @@ -2153,178 +2178,178 @@ msgstr "" "un VACUUM doit être exécuté sur la base de données d'OID %u dans un maximum de\n" "%u transactions" -#: access/transam/xact.c:1098 +#: access/transam/xact.c:1102 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "ne peux pas avoir plus de 2^32-2 commandes dans une transaction" -#: access/transam/xact.c:1644 +#: access/transam/xact.c:1643 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "nombre maximum de sous-transactions validées (%d) dépassé" -#: access/transam/xact.c:2501 +#: access/transam/xact.c:2513 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "" "ne peut pas préparer (PREPARE) une transaction qui a travaillé sur des\n" "objets temporaires" -#: access/transam/xact.c:2511 +#: access/transam/xact.c:2523 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "ne peut pas préparer (PREPARE) une transaction qui a exporté des snapshots" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3478 +#: access/transam/xact.c:3490 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s ne peut pas être exécuté dans un bloc de transaction" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3488 +#: access/transam/xact.c:3500 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s ne peut pas être exécuté dans une sous-transaction" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3498 +#: access/transam/xact.c:3510 #, fuzzy, c-format #| msgid "%s cannot be executed from a function" msgid "%s cannot be executed within a pipeline" msgstr "%s ne peut pas être exécuté à partir d'une fonction" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3508 +#: access/transam/xact.c:3520 #, c-format msgid "%s cannot be executed from a function" msgstr "%s ne peut pas être exécuté à partir d'une fonction" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3579 access/transam/xact.c:3894 -#: access/transam/xact.c:3973 access/transam/xact.c:4096 -#: access/transam/xact.c:4247 access/transam/xact.c:4316 -#: access/transam/xact.c:4427 +#: access/transam/xact.c:3591 access/transam/xact.c:3916 +#: access/transam/xact.c:3995 access/transam/xact.c:4118 +#: access/transam/xact.c:4269 access/transam/xact.c:4338 +#: access/transam/xact.c:4449 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s peut seulement être utilisé dans des blocs de transaction" -#: access/transam/xact.c:3780 +#: access/transam/xact.c:3802 #, c-format msgid "there is already a transaction in progress" msgstr "une transaction est déjà en cours" -#: access/transam/xact.c:3899 access/transam/xact.c:3978 -#: access/transam/xact.c:4101 +#: access/transam/xact.c:3921 access/transam/xact.c:4000 +#: access/transam/xact.c:4123 #, c-format msgid "there is no transaction in progress" msgstr "aucune transaction en cours" -#: access/transam/xact.c:3989 +#: access/transam/xact.c:4011 #, c-format msgid "cannot commit during a parallel operation" msgstr "ne peut pas valider pendant une opération parallèle" -#: access/transam/xact.c:4112 +#: access/transam/xact.c:4134 #, c-format msgid "cannot abort during a parallel operation" msgstr "ne peut pas annuler pendant une opération en parallèle" -#: access/transam/xact.c:4211 +#: access/transam/xact.c:4233 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "ne peut pas définir de points de sauvegarde lors d'une opération parallèle" -#: access/transam/xact.c:4298 +#: access/transam/xact.c:4320 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "ne peut pas relâcher de points de sauvegarde pendant une opération parallèle" -#: access/transam/xact.c:4308 access/transam/xact.c:4359 -#: access/transam/xact.c:4419 access/transam/xact.c:4468 +#: access/transam/xact.c:4330 access/transam/xact.c:4381 +#: access/transam/xact.c:4441 access/transam/xact.c:4490 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "le point de sauvegarde « %s » n'existe pas" -#: access/transam/xact.c:4365 access/transam/xact.c:4474 +#: access/transam/xact.c:4387 access/transam/xact.c:4496 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "le point de sauvegarde « %s » n'existe pas dans le niveau de point de sauvegarde actuel" -#: access/transam/xact.c:4407 +#: access/transam/xact.c:4429 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "ne peut pas retourner à un point de sauvegarde pendant un opération parallèle" -#: access/transam/xact.c:4535 +#: access/transam/xact.c:4557 #, c-format msgid "cannot start subtransactions during a parallel operation" msgstr "ne peut pas lancer de sous-transactions pendant une opération parallèle" -#: access/transam/xact.c:4603 +#: access/transam/xact.c:4625 #, c-format msgid "cannot commit subtransactions during a parallel operation" msgstr "ne peut pas valider de sous-transactions pendant une opération parallèle" -#: access/transam/xact.c:5250 +#: access/transam/xact.c:5271 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "ne peut pas avoir plus de 2^32-1 sous-transactions dans une transaction" -#: access/transam/xlog.c:1463 +#: access/transam/xlog.c:1466 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" msgstr "demande pour vider après la fin du WAL généré ; demande %X/%X, position actuelle %X/%X" -#: access/transam/xlog.c:2224 +#: access/transam/xlog.c:2228 #, c-format msgid "could not write to log file %s at offset %u, length %zu: %m" msgstr "n'a pas pu écrire le fichier de transactions %s au décalage %u, longueur %zu : %m" -#: access/transam/xlog.c:3471 access/transam/xlogutils.c:847 -#: replication/walsender.c:2716 +#: access/transam/xlog.c:3455 access/transam/xlogutils.c:833 +#: replication/walsender.c:2725 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "le segment demandé du journal de transaction, %s, a déjà été supprimé" -#: access/transam/xlog.c:3756 +#: access/transam/xlog.c:3739 #, c-format msgid "could not rename file \"%s\": %m" msgstr "n'a pas pu renommer le fichier « %s » : %m" -#: access/transam/xlog.c:3798 access/transam/xlog.c:3808 +#: access/transam/xlog.c:3781 access/transam/xlog.c:3791 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "le répertoire « %s » requis pour les journaux de transactions n'existe pas" -#: access/transam/xlog.c:3814 +#: access/transam/xlog.c:3797 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "création du répertoire manquant pour les journaux de transactions « %s »" -#: access/transam/xlog.c:3817 commands/dbcommands.c:3045 +#: access/transam/xlog.c:3800 commands/dbcommands.c:3172 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "n'a pas pu créer le répertoire « %s » manquant : %m" -#: access/transam/xlog.c:3884 +#: access/transam/xlog.c:3867 #, c-format msgid "could not generate secret authorization token" msgstr "n'a pas pu générer le jeton secret d'autorisation" -#: access/transam/xlog.c:4043 access/transam/xlog.c:4052 +#: access/transam/xlog.c:4017 access/transam/xlog.c:4026 +#: access/transam/xlog.c:4050 access/transam/xlog.c:4057 +#: access/transam/xlog.c:4064 access/transam/xlog.c:4069 #: access/transam/xlog.c:4076 access/transam/xlog.c:4083 -#: access/transam/xlog.c:4090 access/transam/xlog.c:4095 -#: access/transam/xlog.c:4102 access/transam/xlog.c:4109 -#: access/transam/xlog.c:4116 access/transam/xlog.c:4123 -#: access/transam/xlog.c:4130 access/transam/xlog.c:4137 -#: access/transam/xlog.c:4146 access/transam/xlog.c:4153 -#: utils/init/miscinit.c:1598 +#: access/transam/xlog.c:4090 access/transam/xlog.c:4097 +#: access/transam/xlog.c:4104 access/transam/xlog.c:4111 +#: access/transam/xlog.c:4120 access/transam/xlog.c:4127 +#: utils/init/miscinit.c:1762 #, c-format msgid "database files are incompatible with server" msgstr "les fichiers de la base de données sont incompatibles avec le serveur" -#: access/transam/xlog.c:4044 +#: access/transam/xlog.c:4018 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "" @@ -2332,309 +2357,324 @@ msgstr "" "%d (0x%08x) alors que le serveur a été compilé avec un PG_CONTROL_VERSION à\n" "%d (0x%08x)." -#: access/transam/xlog.c:4048 +#: access/transam/xlog.c:4022 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "" "Ceci peut être un problème d'incohérence dans l'ordre des octets.\n" "Il se peut que vous ayez besoin d'initdb." -#: access/transam/xlog.c:4053 +#: access/transam/xlog.c:4027 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "" "Le cluster de base de données a été initialisé avec un PG_CONTROL_VERSION à\n" "%d alors que le serveur a été compilé avec un PG_CONTROL_VERSION à %d." -#: access/transam/xlog.c:4056 access/transam/xlog.c:4080 -#: access/transam/xlog.c:4087 access/transam/xlog.c:4092 +#: access/transam/xlog.c:4030 access/transam/xlog.c:4054 +#: access/transam/xlog.c:4061 access/transam/xlog.c:4066 #, c-format msgid "It looks like you need to initdb." msgstr "Il semble que vous avez besoin d'initdb." -#: access/transam/xlog.c:4067 +#: access/transam/xlog.c:4041 #, c-format msgid "incorrect checksum in control file" msgstr "somme de contrôle incorrecte dans le fichier de contrôle" -#: access/transam/xlog.c:4077 +#: access/transam/xlog.c:4051 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "" "Le cluster de base de données a été initialisé avec un CATALOG_VERSION_NO à\n" "%d alors que le serveur a été compilé avec un CATALOG_VERSION_NO à %d." -#: access/transam/xlog.c:4084 +#: access/transam/xlog.c:4058 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "" "Le cluster de bases de données a été initialisé avec un MAXALIGN à %d alors\n" "que le serveur a été compilé avec un MAXALIGN à %d." -#: access/transam/xlog.c:4091 +#: access/transam/xlog.c:4065 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "" "Le cluster de bases de données semble utiliser un format différent pour les\n" "nombres à virgule flottante de celui de l'exécutable serveur." -#: access/transam/xlog.c:4096 +#: access/transam/xlog.c:4070 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "" "Le cluster de base de données a été initialisé avec un BLCKSZ à %d alors que\n" "le serveur a été compilé avec un BLCKSZ à %d." -#: access/transam/xlog.c:4099 access/transam/xlog.c:4106 -#: access/transam/xlog.c:4113 access/transam/xlog.c:4120 -#: access/transam/xlog.c:4127 access/transam/xlog.c:4134 -#: access/transam/xlog.c:4141 access/transam/xlog.c:4149 -#: access/transam/xlog.c:4156 +#: access/transam/xlog.c:4073 access/transam/xlog.c:4080 +#: access/transam/xlog.c:4087 access/transam/xlog.c:4094 +#: access/transam/xlog.c:4101 access/transam/xlog.c:4108 +#: access/transam/xlog.c:4115 access/transam/xlog.c:4123 +#: access/transam/xlog.c:4130 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Il semble que vous avez besoin de recompiler ou de relancer initdb." -#: access/transam/xlog.c:4103 +#: access/transam/xlog.c:4077 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "" "Le cluster de bases de données a été initialisé avec un RELSEG_SIZE à %d\n" "alors que le serveur a été compilé avec un RELSEG_SIZE à %d." -#: access/transam/xlog.c:4110 +#: access/transam/xlog.c:4084 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "" "Le cluster de base de données a été initialisé avec un XLOG_BLCKSZ à %d\n" "alors que le serveur a été compilé avec un XLOG_BLCKSZ à %d." -#: access/transam/xlog.c:4117 +#: access/transam/xlog.c:4091 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "" "Le cluster de bases de données a été initialisé avec un NAMEDATALEN à %d\n" "alors que le serveur a été compilé avec un NAMEDATALEN à %d." -#: access/transam/xlog.c:4124 +#: access/transam/xlog.c:4098 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "" "Le groupe de bases de données a été initialisé avec un INDEX_MAX_KEYS à %d\n" "alors que le serveur a été compilé avec un INDEX_MAX_KEYS à %d." -#: access/transam/xlog.c:4131 +#: access/transam/xlog.c:4105 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "" "Le cluster de bases de données a été initialisé avec un TOAST_MAX_CHUNK_SIZE\n" "à %d alors que le serveur a été compilé avec un TOAST_MAX_CHUNK_SIZE à %d." -#: access/transam/xlog.c:4138 +#: access/transam/xlog.c:4112 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "" "Le cluster de base de données a été initialisé avec un LOBLKSIZE à %d alors que\n" "le serveur a été compilé avec un LOBLKSIZE à %d." -#: access/transam/xlog.c:4147 +#: access/transam/xlog.c:4121 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "" "Le cluster de base de données a été initialisé sans USE_FLOAT8_BYVAL\n" "alors que le serveur a été compilé avec USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4154 +#: access/transam/xlog.c:4128 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "" "Le cluster de base de données a été initialisé avec USE_FLOAT8_BYVAL\n" "alors que le serveur a été compilé sans USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4163 +#: access/transam/xlog.c:4137 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" msgstr[0] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octet" msgstr[1] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octets" -#: access/transam/xlog.c:4175 +#: access/transam/xlog.c:4149 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "« min_wal_size » doit être au moins le double de « wal_segment_size »" -#: access/transam/xlog.c:4179 +#: access/transam/xlog.c:4153 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "« max_wal_size » doit être au moins le double de « wal_segment_size »" -#: access/transam/xlog.c:4620 +#: access/transam/xlog.c:4308 catalog/namespace.c:4335 +#: commands/tablespace.c:1216 commands/user.c:2536 commands/variable.c:72 +#: utils/error/elog.c:2205 +#, c-format +msgid "List syntax is invalid." +msgstr "La syntaxe de la liste est invalide." + +#: access/transam/xlog.c:4354 commands/user.c:2552 commands/variable.c:173 +#: utils/error/elog.c:2231 +#, c-format +msgid "Unrecognized key word: \"%s\"." +msgstr "Mot clé non reconnu : « %s »." + +#: access/transam/xlog.c:4768 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "n'a pas pu écrire le « bootstrap » du journal des transactions : %m" -#: access/transam/xlog.c:4628 +#: access/transam/xlog.c:4776 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "" "n'a pas pu synchroniser sur disque (fsync) le « bootstrap » du journal des\n" "transactions : %m" -#: access/transam/xlog.c:4634 +#: access/transam/xlog.c:4782 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "n'a pas pu fermer le « bootstrap » du journal des transactions : %m" -#: access/transam/xlog.c:4852 +#: access/transam/xlog.c:4999 #, c-format msgid "WAL was generated with wal_level=minimal, cannot continue recovering" msgstr "le journal de transactions a été généré avec le paramètre wal_level=minimal, ne peut pas continuer la restauration" -#: access/transam/xlog.c:4853 +#: access/transam/xlog.c:5000 #, c-format msgid "This happens if you temporarily set wal_level=minimal on the server." msgstr "Ceci peut arriver si vous configurez temporairement wal_level à minimal sur le serveur." -#: access/transam/xlog.c:4854 +#: access/transam/xlog.c:5001 #, c-format msgid "Use a backup taken after setting wal_level to higher than minimal." msgstr "Utilisez la sauvegarde prise lors que la configuration de wal_level était au-dessus du niveau minimal." -#: access/transam/xlog.c:4918 +#: access/transam/xlog.c:5065 #, c-format msgid "control file contains invalid checkpoint location" msgstr "le fichier de contrôle contient un emplacement de checkpoint invalide" -#: access/transam/xlog.c:4929 +#: access/transam/xlog.c:5076 #, c-format msgid "database system was shut down at %s" msgstr "le système de bases de données a été arrêté à %s" -#: access/transam/xlog.c:4935 +#: access/transam/xlog.c:5082 #, c-format msgid "database system was shut down in recovery at %s" msgstr "le système de bases de données a été arrêté pendant la restauration à %s" -#: access/transam/xlog.c:4941 +#: access/transam/xlog.c:5088 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "le système de bases de données a été interrompu ; dernier lancement connu à %s" -#: access/transam/xlog.c:4947 +#: access/transam/xlog.c:5094 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "le système de bases de données a été interrompu lors d'une restauration à %s" -#: access/transam/xlog.c:4949 +#: access/transam/xlog.c:5096 #, c-format msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." msgstr "" "Ceci signifie probablement que des données ont été corrompues et que vous\n" "devrez utiliser la dernière sauvegarde pour la restauration." -#: access/transam/xlog.c:4955 +#: access/transam/xlog.c:5102 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "" "le système de bases de données a été interrompu lors d'une récupération à %s\n" "(moment de la journalisation)" -#: access/transam/xlog.c:4957 +#: access/transam/xlog.c:5104 #, c-format msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." msgstr "" "Si c'est arrivé plus d'une fois, des données ont pu être corrompues et vous\n" "pourriez avoir besoin de choisir une cible de récupération antérieure." -#: access/transam/xlog.c:4963 +#: access/transam/xlog.c:5110 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "le système de bases de données a été interrompu ; dernier lancement connu à %s" -#: access/transam/xlog.c:4969 +#: access/transam/xlog.c:5116 #, c-format msgid "control file contains invalid database cluster state" msgstr "le fichier de contrôle contient un état invalide de l'instance" -#: access/transam/xlog.c:5353 +#: access/transam/xlog.c:5500 #, c-format msgid "WAL ends before end of online backup" msgstr "le journal de transactions se termine avant la fin de la sauvegarde de base" -#: access/transam/xlog.c:5354 +#: access/transam/xlog.c:5501 #, c-format msgid "All WAL generated while online backup was taken must be available at recovery." msgstr "Tous les journaux de transactions générés pendant la sauvegarde en ligne doivent être disponibles pour la restauration." -#: access/transam/xlog.c:5357 +#: access/transam/xlog.c:5504 #, c-format msgid "WAL ends before consistent recovery point" msgstr "Le journal de transaction se termine avant un point de restauration cohérent" -#: access/transam/xlog.c:5405 +#: access/transam/xlog.c:5550 #, c-format msgid "selected new timeline ID: %u" msgstr "identifiant d'un timeline nouvellement sélectionné : %u" -#: access/transam/xlog.c:5438 +#: access/transam/xlog.c:5583 #, c-format msgid "archive recovery complete" msgstr "restauration de l'archive terminée" -#: access/transam/xlog.c:6040 +#: access/transam/xlog.c:6189 #, c-format msgid "shutting down" msgstr "arrêt en cours" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6079 +#: access/transam/xlog.c:6228 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "début du restartpoint :%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6091 +#: access/transam/xlog.c:6240 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "début du checkpoint :%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6151 -#, c-format -msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +#: access/transam/xlog.c:6305 +#, fuzzy, c-format +#| msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "restartpoint terminé : a écrit %d tampons (%.1f%%); %d fichiers WAL ajoutés, %d supprimés, %d recyclés ; écriture=%ld.%03d s, synchronisation=%ld.%03d s, total=%ld.%03d s; fichiers synchronisés=%d, plus long=%ld.%03d s, moyenne=%ld.%03d s; distance=%d kB, estimation=%d kB" -#: access/transam/xlog.c:6171 -#, c-format -msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +#: access/transam/xlog.c:6328 +#, fuzzy, c-format +#| msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" +msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "checkpoint terminé : a écrit %d tampons (%.1f%%); %d fichiers WAL ajoutés, %d supprimés, %d recyclés ; écriture=%ld.%03d s, synchronisation=%ld.%03d s, total=%ld.%03d s; fichiers synchronisés=%d, plus long=%ld.%03d s, moyenne=%ld.%03d s; distance=%d kB, estimation=%d kB" -#: access/transam/xlog.c:6606 +#: access/transam/xlog.c:6766 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "" "activité en cours du journal de transactions alors que le système de bases\n" "de données est en cours d'arrêt" -#: access/transam/xlog.c:7163 +#: access/transam/xlog.c:7327 #, c-format msgid "recovery restart point at %X/%X" msgstr "la ré-exécution en restauration commence à %X/%X" -#: access/transam/xlog.c:7165 +#: access/transam/xlog.c:7329 #, c-format msgid "Last completed transaction was at log time %s." msgstr "La dernière transaction a eu lieu à %s (moment de la journalisation)." -#: access/transam/xlog.c:7412 +#: access/transam/xlog.c:7577 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "point de restauration « %s » créé à %X/%X" -#: access/transam/xlog.c:7619 +#: access/transam/xlog.c:7784 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "la sauvegarde en ligne a été annulée, la restauration ne peut pas continuer" -#: access/transam/xlog.c:7676 +#: access/transam/xlog.c:7841 #, fuzzy, c-format #| msgid "unexpected timeline ID %u (should be %u) in checkpoint record" msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" @@ -2642,7 +2682,7 @@ msgstr "" "identifiant timeline %u inattendu (devrait être %u) dans l'enregistrement du\n" "point de vérification" -#: access/transam/xlog.c:7734 +#: access/transam/xlog.c:7899 #, fuzzy, c-format #| msgid "unexpected timeline ID %u (should be %u) in checkpoint record" msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" @@ -2650,7 +2690,7 @@ msgstr "" "identifiant timeline %u inattendu (devrait être %u) dans l'enregistrement du\n" "point de vérification" -#: access/transam/xlog.c:7763 +#: access/transam/xlog.c:7928 #, fuzzy, c-format #| msgid "unexpected timeline ID %u (should be %u) in checkpoint record" msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" @@ -2658,30 +2698,30 @@ msgstr "" "identifiant timeline %u inattendu (devrait être %u) dans l'enregistrement du\n" "point de vérification" -#: access/transam/xlog.c:8021 +#: access/transam/xlog.c:8195 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier %s : %m" -#: access/transam/xlog.c:8027 +#: access/transam/xlog.c:8200 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "n'a pas pu synchroniser sur disque (fdatasync) le fichier « %s » : %m" -#: access/transam/xlog.c:8122 access/transam/xlog.c:8489 +#: access/transam/xlog.c:8285 access/transam/xlog.c:8608 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "Le niveau de journalisation n'est pas suffisant pour faire une sauvegarde en ligne" -#: access/transam/xlog.c:8123 access/transam/xlog.c:8490 -#: access/transam/xlogfuncs.c:199 +#: access/transam/xlog.c:8286 access/transam/xlog.c:8609 +#: access/transam/xlogfuncs.c:254 #, c-format msgid "wal_level must be set to \"replica\" or \"logical\" at server start." msgstr "" "wal_level doit être configuré à « replica » ou « logical »\n" "au démarrage du serveur." -#: access/transam/xlog.c:8128 +#: access/transam/xlog.c:8291 #, c-format msgid "backup label too long (max %d bytes)" msgstr "label de sauvegarde trop long (%d octets maximum)" @@ -2691,99 +2731,90 @@ msgstr "label de sauvegarde trop long (%d octets maximum)" # * (i.e., since last restartpoint used as backup starting # * checkpoint) contain full-page writes. # */ -#: access/transam/xlog.c:8244 +#: access/transam/xlog.c:8412 #, c-format msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" msgstr "Un journal de transaction généré avec full_page_writes=off a été rejoué depuis le dernier point de reprise (restartpoint)" -#: access/transam/xlog.c:8246 access/transam/xlog.c:8602 +#: access/transam/xlog.c:8414 access/transam/xlog.c:8697 #, c-format msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." msgstr "Cela signifie que la sauvegarde en cours de réalisation sur le secondaire est corrompue et ne devrait pas être utilisée. Activez full_page_writes et lancez CHECKPOINT sur le primaire, puis recommencez la sauvegarde." -#: access/transam/xlog.c:8326 backup/basebackup.c:1345 utils/adt/misc.c:347 -#, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "la cible du lien symbolique « %s » est trop longue" - -#: access/transam/xlog.c:8376 backup/basebackup.c:1360 -#: commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 +#: access/transam/xlog.c:8481 backup/basebackup.c:1351 utils/adt/misc.c:354 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "les tablespaces ne sont pas supportés sur cette plateforme" +msgid "could not read symbolic link \"%s\": %m" +msgstr "n'a pas pu lire le lien symbolique « %s » : %m" -#: access/transam/xlog.c:8535 access/transam/xlog.c:8548 -#: access/transam/xlogrecovery.c:1192 access/transam/xlogrecovery.c:1199 -#: access/transam/xlogrecovery.c:1258 access/transam/xlogrecovery.c:1338 -#: access/transam/xlogrecovery.c:1362 +#: access/transam/xlog.c:8488 backup/basebackup.c:1356 utils/adt/misc.c:359 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "données invalides dans le fichier « %s »" +msgid "symbolic link \"%s\" target is too long" +msgstr "la cible du lien symbolique « %s » est trop longue" -#: access/transam/xlog.c:8552 backup/basebackup.c:1200 +#: access/transam/xlog.c:8647 backup/basebackup.c:1217 #, c-format msgid "the standby was promoted during online backup" msgstr "le standby a été promu lors de la sauvegarde en ligne" -#: access/transam/xlog.c:8553 backup/basebackup.c:1201 +#: access/transam/xlog.c:8648 backup/basebackup.c:1218 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "" "Cela signifie que la sauvegarde en cours de réalisation est corrompue et ne\n" "doit pas être utilisée. Recommencez la sauvegarde." -#: access/transam/xlog.c:8600 +#: access/transam/xlog.c:8695 #, c-format msgid "WAL generated with full_page_writes=off was replayed during online backup" msgstr "Un journal de transaction généré avec full_page_writes=off a été rejoué pendant la sauvegarde en ligne" -#: access/transam/xlog.c:8725 +#: access/transam/xlog.c:8811 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "backup de base terminé, en attente de l'archivage des journaux de transactions nécessaires" -#: access/transam/xlog.c:8739 +#: access/transam/xlog.c:8825 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "toujours en attente de la fin de l'archivage de tous les segments de journaux de transactions requis (%d secondes passées)" -#: access/transam/xlog.c:8741 +#: access/transam/xlog.c:8827 #, c-format msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." msgstr "Vérifiez que votre archive_command s'exécute correctement. Vous pouvez annuler cette sauvegarde sans souci, mais elle ne sera pas utilisable sans tous les segments WAL." -#: access/transam/xlog.c:8748 +#: access/transam/xlog.c:8834 #, c-format msgid "all required WAL segments have been archived" msgstr "tous les journaux de transactions requis ont été archivés" -#: access/transam/xlog.c:8752 +#: access/transam/xlog.c:8838 #, c-format msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" msgstr "L'archivage des journaux de transactions n'est pas activé ; vous devez vous assurer que tous les des journaux de transactions requis sont copiés par d'autres moyens pour terminer la sauvegarde" -#: access/transam/xlog.c:8801 +#: access/transam/xlog.c:8877 #, fuzzy, c-format #| msgid "aborting backup due to backend exiting before pg_stop_backup was called" msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "annulation de la sauvegarde due à la déconnexion du processus serveur avant que pg_stop_backup ne soit appelé" -#: access/transam/xlogarchive.c:208 +#: access/transam/xlogarchive.c:214 #, c-format msgid "archive file \"%s\" has wrong size: %lld instead of %lld" msgstr "le fichier d'archive « %s » a la mauvaise taille : %lld au lieu de %lld" -#: access/transam/xlogarchive.c:217 +#: access/transam/xlogarchive.c:223 #, c-format msgid "restored log file \"%s\" from archive" msgstr "restauration du journal de transactions « %s » à partir de l'archive" -#: access/transam/xlogarchive.c:231 +#: access/transam/xlogarchive.c:237 #, c-format msgid "restore_command returned a zero exit status, but stat() failed." msgstr "restore_command a renvoyé un code de sortie zéro, mais stat() a échoué." -#: access/transam/xlogarchive.c:263 +#: access/transam/xlogarchive.c:269 #, c-format msgid "could not restore file \"%s\" from archive: %s" msgstr "n'a pas pu restaurer le fichier « %s » à partir de l'archive : %s" @@ -2791,320 +2822,318 @@ msgstr "n'a pas pu restaurer le fichier « %s » à partir de l'archive : %s" #. translator: First %s represents a postgresql.conf parameter name like #. "recovery_end_command", the 2nd is the value of that parameter, the #. third an already translated error message. -#: access/transam/xlogarchive.c:376 +#: access/transam/xlogarchive.c:347 #, c-format msgid "%s \"%s\": %s" msgstr "%s « %s »: %s" -#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:566 +#: access/transam/xlogarchive.c:457 access/transam/xlogarchive.c:537 #, c-format msgid "could not create archive status file \"%s\": %m" msgstr "n'a pas pu créer le fichier de statut d'archivage « %s » : %m" -#: access/transam/xlogarchive.c:494 access/transam/xlogarchive.c:574 +#: access/transam/xlogarchive.c:465 access/transam/xlogarchive.c:545 #, c-format msgid "could not write archive status file \"%s\": %m" msgstr "n'a pas pu écrire le fichier de statut d'archivage « %s » : %m" -#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 +#: access/transam/xlogfuncs.c:75 backup/basebackup.c:973 #, c-format msgid "a backup is already in progress in this session" msgstr "une sauvegarde est déjà en cours dans cette session" -#: access/transam/xlogfuncs.c:126 +#: access/transam/xlogfuncs.c:146 #, c-format msgid "backup is not in progress" msgstr "la sauvegarde n'est pas en cours" -#: access/transam/xlogfuncs.c:127 +#: access/transam/xlogfuncs.c:147 #, c-format msgid "Did you call pg_backup_start()?" msgstr "Avez-vous appelé pg_backup_start() ?" -#: access/transam/xlogfuncs.c:166 access/transam/xlogfuncs.c:193 -#: access/transam/xlogfuncs.c:232 access/transam/xlogfuncs.c:253 -#: access/transam/xlogfuncs.c:274 +#: access/transam/xlogfuncs.c:190 access/transam/xlogfuncs.c:248 +#: access/transam/xlogfuncs.c:287 access/transam/xlogfuncs.c:308 +#: access/transam/xlogfuncs.c:329 #, c-format msgid "WAL control functions cannot be executed during recovery." msgstr "les fonctions de contrôle des journaux de transactions ne peuvent pas être exécutées lors de la restauration." -#: access/transam/xlogfuncs.c:198 +#: access/transam/xlogfuncs.c:215 access/transam/xlogfuncs.c:399 +#: access/transam/xlogfuncs.c:457 +#, c-format +msgid "%s cannot be executed during recovery." +msgstr "%s ne peut pas être exécuté lors de la restauration." + +#: access/transam/xlogfuncs.c:221 +#, fuzzy, c-format +#| msgid "replication slots can only be used if wal_level >= replica" +msgid "pg_log_standby_snapshot() can only be used if wal_level >= replica" +msgstr "les slots de réplication peuvent seulement être utilisés si wal_level >= replica" + +#: access/transam/xlogfuncs.c:253 #, c-format msgid "WAL level not sufficient for creating a restore point" msgstr "le niveau de journalisation n'est pas suffisant pour créer un point de restauration" -#: access/transam/xlogfuncs.c:206 +#: access/transam/xlogfuncs.c:261 #, c-format msgid "value too long for restore point (maximum %d characters)" msgstr "valeur trop longue pour le point de restauration (%d caractères maximum)" -#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 -#, c-format -msgid "%s cannot be executed during recovery." -msgstr "%s ne peut pas être exécuté lors de la restauration." +#: access/transam/xlogfuncs.c:496 +#, fuzzy, c-format +#| msgid "invalid role name \"%s\"" +msgid "invalid WAL file name \"%s\"" +msgstr "nom de rôle « %s » invalide" -#: access/transam/xlogfuncs.c:424 access/transam/xlogfuncs.c:454 -#: access/transam/xlogfuncs.c:478 access/transam/xlogfuncs.c:501 -#: access/transam/xlogfuncs.c:581 +#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:562 +#: access/transam/xlogfuncs.c:586 access/transam/xlogfuncs.c:609 +#: access/transam/xlogfuncs.c:689 #, c-format msgid "recovery is not in progress" msgstr "la restauration n'est pas en cours" -#: access/transam/xlogfuncs.c:425 access/transam/xlogfuncs.c:455 -#: access/transam/xlogfuncs.c:479 access/transam/xlogfuncs.c:502 -#: access/transam/xlogfuncs.c:582 +#: access/transam/xlogfuncs.c:533 access/transam/xlogfuncs.c:563 +#: access/transam/xlogfuncs.c:587 access/transam/xlogfuncs.c:610 +#: access/transam/xlogfuncs.c:690 #, c-format msgid "Recovery control functions can only be executed during recovery." msgstr "" "Les fonctions de contrôle de la restauration peuvent seulement être exécutées\n" "lors de la restauration." -#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 +#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 #, c-format msgid "standby promotion is ongoing" msgstr "la promotion du standby est en cours" -#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 +#: access/transam/xlogfuncs.c:539 access/transam/xlogfuncs.c:569 #, c-format msgid "%s cannot be executed after promotion is triggered." msgstr "%s ne peut pas être exécuté une fois la promotion en cours d'exécution." -#: access/transam/xlogfuncs.c:587 +#: access/transam/xlogfuncs.c:695 #, c-format msgid "\"wait_seconds\" must not be negative or zero" msgstr "« wait_seconds » ne doit pas être négatif ou nul" -#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:252 +#: access/transam/xlogfuncs.c:715 storage/ipc/signalfuncs.c:260 #, c-format msgid "failed to send signal to postmaster: %m" msgstr "n'a pas pu envoyer le signal au postmaster : %m" -#: access/transam/xlogfuncs.c:643 +#: access/transam/xlogfuncs.c:751 #, c-format msgid "server did not promote within %d second" msgid_plural "server did not promote within %d seconds" msgstr[0] "le serveur ne s'est pas promu en %d seconde" msgstr[1] "le serveur ne s'est pas promu dans les %d secondes" -#: access/transam/xlogprefetcher.c:1090 +#: access/transam/xlogprefetcher.c:1092 #, fuzzy, c-format #| msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." msgstr "effective_io_concurrency doit être positionné à 0 sur les plateformes où manque posix_fadvise()" -#: access/transam/xlogreader.c:625 +#: access/transam/xlogreader.c:593 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "décalage invalide de l'enregistrement %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "décalage invalide de l'enregistrement à %X/%X : attendait au moins %u, a eu %u" -#: access/transam/xlogreader.c:633 +#: access/transam/xlogreader.c:602 #, c-format msgid "contrecord is requested by %X/%X" msgstr "« contrecord » est requis par %X/%X" -#: access/transam/xlogreader.c:674 access/transam/xlogreader.c:1121 -#, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "longueur invalide de l'enregistrement à %X/%X : voulait %u, a eu %u" - -#: access/transam/xlogreader.c:703 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "manque mémoire lors de la tentative de décodage d'un enregistrement de longueur %u" - -#: access/transam/xlogreader.c:725 +#: access/transam/xlogreader.c:643 access/transam/xlogreader.c:1108 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "longueur trop importante de l'enregistrement %u à %X/%X" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "longueur invalide de l'enregistrement à %X/%X : attendait au moins %u, a eu %u" -#: access/transam/xlogreader.c:774 +#: access/transam/xlogreader.c:732 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "il n'existe pas de drapeau contrecord à %X/%X" -#: access/transam/xlogreader.c:787 +#: access/transam/xlogreader.c:745 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "longueur %u invalide du contrecord (%lld attendu) à %X/%X" -#: access/transam/xlogreader.c:922 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "contrecord manquant à %X/%X" - -#: access/transam/xlogreader.c:1129 +#: access/transam/xlogreader.c:1116 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "identifiant du gestionnaire de ressources invalide %u à %X/%X" -#: access/transam/xlogreader.c:1142 access/transam/xlogreader.c:1158 +#: access/transam/xlogreader.c:1129 access/transam/xlogreader.c:1145 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "enregistrement avec prev-link %X/%X incorrect à %X/%X" -#: access/transam/xlogreader.c:1194 +#: access/transam/xlogreader.c:1183 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" "somme de contrôle des données du gestionnaire de ressources incorrecte à\n" "l'enregistrement %X/%X" -#: access/transam/xlogreader.c:1231 +#: access/transam/xlogreader.c:1217 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "numéro magique invalide %04X dans le segment %s, décalage %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "numéro magique invalide %04X dans le segment WAL %s, LSN %X/%X, décalage %u" -#: access/transam/xlogreader.c:1245 access/transam/xlogreader.c:1286 +#: access/transam/xlogreader.c:1232 access/transam/xlogreader.c:1274 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "bits d'information %04X invalides dans le segment %s, décalage %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "bits d'information %04X invalides dans le segment WAL %s, LSN %X/%X, décalage %u" -#: access/transam/xlogreader.c:1260 +#: access/transam/xlogreader.c:1248 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "Le fichier WAL provient d'une instance différente : l'identifiant système de la base dans le fichier WAL est %llu, alors que l'identifiant système de la base dans pg_control est %llu" -#: access/transam/xlogreader.c:1268 +#: access/transam/xlogreader.c:1256 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "Le fichier WAL provient d'une instance différente : taille invalide du segment dans l'en-tête de page" -#: access/transam/xlogreader.c:1274 +#: access/transam/xlogreader.c:1262 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "Le fichier WAL provient d'une instance différente : XLOG_BLCKSZ incorrect dans l'en-tête de page" -#: access/transam/xlogreader.c:1305 +#: access/transam/xlogreader.c:1294 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "pageaddr %X/%X inattendue dans le journal de transactions %s, segment %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "pageaddr %X/%X inattendue dans le journal de transactions %s, LSN %X/%X, segment %u" -#: access/transam/xlogreader.c:1330 +#: access/transam/xlogreader.c:1320 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "identifiant timeline %u hors de la séquence (après %u) dans le segment %s, décalage %u" +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "identifiant timeline %u hors de la séquence (après %u) dans le segment WAL %s, LSN %X/%X, décalage %u" -#: access/transam/xlogreader.c:1735 +#: access/transam/xlogreader.c:1726 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u désordonné à %X/%X" -#: access/transam/xlogreader.c:1759 +#: access/transam/xlogreader.c:1750 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA configuré, mais aucune donnée inclus à %X/%X" -#: access/transam/xlogreader.c:1766 +#: access/transam/xlogreader.c:1757 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA non configuré, mais la longueur des données est %u à %X/%X" -#: access/transam/xlogreader.c:1802 +#: access/transam/xlogreader.c:1793 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE activé, mais décalage trou %u longueur %u longueur image bloc %u à %X/%X" -#: access/transam/xlogreader.c:1818 +#: access/transam/xlogreader.c:1809 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE désactivé, mais décalage trou %u longueur %u à %X/%X" -#: access/transam/xlogreader.c:1832 +#: access/transam/xlogreader.c:1823 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" -#: access/transam/xlogreader.c:1847 +#: access/transam/xlogreader.c:1838 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" -#: access/transam/xlogreader.c:1863 +#: access/transam/xlogreader.c:1854 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL configuré, mais pas de relation précédente à %X/%X" -#: access/transam/xlogreader.c:1875 +#: access/transam/xlogreader.c:1866 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "block_id %u invalide à %X/%X" -#: access/transam/xlogreader.c:1942 +#: access/transam/xlogreader.c:1933 #, c-format msgid "record with invalid length at %X/%X" msgstr "enregistrement de longueur invalide à %X/%X" -#: access/transam/xlogreader.c:1967 +#: access/transam/xlogreader.c:1959 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "n'a pas pu localiser le bloc de sauvegarde d'ID %d dans l'enregistrement WAL" -#: access/transam/xlogreader.c:2051 +#: access/transam/xlogreader.c:2043 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" -msgstr "n'a pas pu restaurer l'image ) %X/%X avec le bloc invalide %d indiqué" +msgstr "n'a pas pu restaurer l'image à %X/%X avec le bloc invalide %d indiqué" -#: access/transam/xlogreader.c:2058 +#: access/transam/xlogreader.c:2050 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "n'a pas pu restaurer l'image à %X/%X avec un état invalide, bloc %d" -#: access/transam/xlogreader.c:2085 access/transam/xlogreader.c:2102 +#: access/transam/xlogreader.c:2077 access/transam/xlogreader.c:2094 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec %s, qui est non supporté par le serveur, bloc %d" -#: access/transam/xlogreader.c:2111 +#: access/transam/xlogreader.c:2103 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec une méthode inconnue, bloc %d" -#: access/transam/xlogreader.c:2119 +#: access/transam/xlogreader.c:2111 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "n'a pas pu décompresser l'image à %X/%X, bloc %d" -#: access/transam/xlogrecovery.c:526 +#: access/transam/xlogrecovery.c:547 #, c-format msgid "entering standby mode" msgstr "entre en mode standby" -#: access/transam/xlogrecovery.c:529 +#: access/transam/xlogrecovery.c:550 #, c-format msgid "starting point-in-time recovery to XID %u" msgstr "début de la restauration de l'archive au XID %u" -#: access/transam/xlogrecovery.c:533 +#: access/transam/xlogrecovery.c:554 #, c-format msgid "starting point-in-time recovery to %s" msgstr "début de la restauration de l'archive à %s" -#: access/transam/xlogrecovery.c:537 +#: access/transam/xlogrecovery.c:558 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "début de la restauration PITR à « %s »" -#: access/transam/xlogrecovery.c:541 +#: access/transam/xlogrecovery.c:562 #, c-format msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" msgstr "début de la restauration PITR à l'emplacement WAL (LSN) « %X/%X »" -#: access/transam/xlogrecovery.c:545 +#: access/transam/xlogrecovery.c:566 #, c-format msgid "starting point-in-time recovery to earliest consistent point" msgstr "début de la restauration de l'archive jusqu'au point de cohérence le plus proche" -#: access/transam/xlogrecovery.c:548 +#: access/transam/xlogrecovery.c:569 #, c-format msgid "starting archive recovery" msgstr "début de la restauration de l'archive" -#: access/transam/xlogrecovery.c:632 +#: access/transam/xlogrecovery.c:653 #, c-format msgid "could not find redo location referenced by checkpoint record" msgstr "n'a pas pu localiser l'enregistrement redo référencé par le point de vérification" -#: access/transam/xlogrecovery.c:633 access/transam/xlogrecovery.c:643 +#: access/transam/xlogrecovery.c:654 access/transam/xlogrecovery.c:664 #, c-format msgid "" "If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" @@ -3115,84 +3144,84 @@ msgstr "" "Si vous ne restaurez pas depuis une sauvegarde, essayez de supprimer « %s/backup_label ».\n" "Attention : supprimer « %s/backup_label » lors d'une restauration de sauvegarde entraînera la corruption de l'instance." -#: access/transam/xlogrecovery.c:642 +#: access/transam/xlogrecovery.c:663 #, c-format msgid "could not locate required checkpoint record" msgstr "n'a pas pu localiser l'enregistrement d'un point de vérification requis" -#: access/transam/xlogrecovery.c:671 commands/tablespace.c:685 +#: access/transam/xlogrecovery.c:692 commands/tablespace.c:670 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "n'a pas pu créer le lien symbolique « %s » : %m" -#: access/transam/xlogrecovery.c:703 access/transam/xlogrecovery.c:709 +#: access/transam/xlogrecovery.c:724 access/transam/xlogrecovery.c:730 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "ignore le fichier « %s » car le fichier « %s » n'existe pas" -#: access/transam/xlogrecovery.c:705 +#: access/transam/xlogrecovery.c:726 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "Le fichier « %s » a été renommé en « %s »." -#: access/transam/xlogrecovery.c:711 +#: access/transam/xlogrecovery.c:732 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "N'a pas pu renommer le fichier « %s » en « %s » : %m." -#: access/transam/xlogrecovery.c:765 +#: access/transam/xlogrecovery.c:786 #, c-format msgid "could not locate a valid checkpoint record" msgstr "n'a pas pu localiser un enregistrement d'un point de vérification valide" -#: access/transam/xlogrecovery.c:789 +#: access/transam/xlogrecovery.c:810 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "la timeline requise %u n'est pas un fils de l'historique de ce serveur" -#: access/transam/xlogrecovery.c:791 +#: access/transam/xlogrecovery.c:812 #, c-format msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." msgstr "Le dernier checkpoint est à %X/%X sur la timeline %u, mais dans l'historique de la timeline demandée, le serveur est sorti de cette timeline à %X/%X." -#: access/transam/xlogrecovery.c:805 +#: access/transam/xlogrecovery.c:826 #, c-format msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" msgstr "la timeline requise, %u, ne contient pas le point de restauration minimum (%X/%X) sur la timeline %u" -#: access/transam/xlogrecovery.c:833 +#: access/transam/xlogrecovery.c:854 #, c-format msgid "invalid next transaction ID" msgstr "prochain ID de transaction invalide" -#: access/transam/xlogrecovery.c:838 +#: access/transam/xlogrecovery.c:859 #, c-format msgid "invalid redo in checkpoint record" msgstr "ré-exécution invalide dans l'enregistrement du point de vérification" -#: access/transam/xlogrecovery.c:849 +#: access/transam/xlogrecovery.c:870 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "enregistrement de ré-exécution invalide dans le point de vérification d'arrêt" -#: access/transam/xlogrecovery.c:878 +#: access/transam/xlogrecovery.c:899 #, c-format msgid "database system was not properly shut down; automatic recovery in progress" msgstr "" "le système de bases de données n'a pas été arrêté proprement ; restauration\n" "automatique en cours" -#: access/transam/xlogrecovery.c:882 +#: access/transam/xlogrecovery.c:903 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "la restauration après crash commence par la timeline %u et a la timeline %u en cible" -#: access/transam/xlogrecovery.c:925 +#: access/transam/xlogrecovery.c:946 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_label contient des données incohérentes avec le fichier de contrôle" -#: access/transam/xlogrecovery.c:926 +#: access/transam/xlogrecovery.c:947 #, c-format msgid "This means that the backup is corrupted and you will have to use another backup for recovery." msgstr "" @@ -3202,344 +3231,379 @@ msgstr "" # /* # * Check for old recovery API file: recovery.conf # */ -#: access/transam/xlogrecovery.c:980 +#: access/transam/xlogrecovery.c:1001 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "utiliser le fichier de commande de la restauration « %s » n'est plus supporté" -#: access/transam/xlogrecovery.c:1045 +#: access/transam/xlogrecovery.c:1066 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "le mode de restauration n'est pas supporté pour les serveurs mono-utilisateur" -#: access/transam/xlogrecovery.c:1062 +#: access/transam/xlogrecovery.c:1083 #, c-format msgid "specified neither primary_conninfo nor restore_command" msgstr "ni primary_conninfo ni restore_command n'est spécifié" -#: access/transam/xlogrecovery.c:1063 +#: access/transam/xlogrecovery.c:1084 #, c-format msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." msgstr "" "Le serveur de la base de données va régulièrement interroger le sous-répertoire\n" "pg_wal pour vérifier les fichiers placés ici." -#: access/transam/xlogrecovery.c:1071 +#: access/transam/xlogrecovery.c:1092 #, c-format msgid "must specify restore_command when standby mode is not enabled" msgstr "doit spécifier une restore_command quand le mode standby n'est pas activé" -#: access/transam/xlogrecovery.c:1109 +#: access/transam/xlogrecovery.c:1130 #, c-format msgid "recovery target timeline %u does not exist" msgstr "le timeline cible, %u, de la restauration n'existe pas" -#: access/transam/xlogrecovery.c:1259 +#: access/transam/xlogrecovery.c:1213 access/transam/xlogrecovery.c:1220 +#: access/transam/xlogrecovery.c:1279 access/transam/xlogrecovery.c:1359 +#: access/transam/xlogrecovery.c:1383 +#, c-format +msgid "invalid data in file \"%s\"" +msgstr "données invalides dans le fichier « %s »" + +#: access/transam/xlogrecovery.c:1280 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "L'identifiant de timeline parsé est %u, mais %u était attendu." -#: access/transam/xlogrecovery.c:1641 +#: access/transam/xlogrecovery.c:1662 #, c-format msgid "redo starts at %X/%X" msgstr "la ré-exécution commence à %X/%X" -#: access/transam/xlogrecovery.c:1654 +#: access/transam/xlogrecovery.c:1675 #, c-format msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" msgstr "" -#: access/transam/xlogrecovery.c:1746 +#: access/transam/xlogrecovery.c:1767 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "" "le point d'arrêt de la restauration demandée se trouve avant le point\n" "cohérent de restauration" -#: access/transam/xlogrecovery.c:1778 +#: access/transam/xlogrecovery.c:1799 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "rejeu exécuté à %X/%X utilisation système : %s" -#: access/transam/xlogrecovery.c:1784 +#: access/transam/xlogrecovery.c:1805 #, c-format msgid "last completed transaction was at log time %s" msgstr "la dernière transaction a eu lieu à %s (moment de la journalisation)" -#: access/transam/xlogrecovery.c:1793 +#: access/transam/xlogrecovery.c:1814 #, c-format msgid "redo is not required" msgstr "la ré-exécution n'est pas nécessaire" -#: access/transam/xlogrecovery.c:1804 +#: access/transam/xlogrecovery.c:1825 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "la restauration s'est terminée avant d'avoir atteint la cible configurée pour la restauration" -#: access/transam/xlogrecovery.c:1979 +#: access/transam/xlogrecovery.c:2019 #, c-format msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" msgstr "ignore avec succès le contrecord manquant à %X/%X, surchargé à %s" -#: access/transam/xlogrecovery.c:2046 +#: access/transam/xlogrecovery.c:2086 #, fuzzy, c-format #| msgid "Expected array element or \"]\", but found \"%s\"." msgid "unexpected directory entry \"%s\" found in %s" msgstr "Élément de tableau ou « ] » attendu, mais « %s » trouvé." -#: access/transam/xlogrecovery.c:2048 +#: access/transam/xlogrecovery.c:2088 #, c-format msgid "All directory entries in pg_tblspc/ should be symbolic links." msgstr "Toutes les entrées de répertoire dans pg_tblspc/ devraient être des liens symboliques." -#: access/transam/xlogrecovery.c:2049 +#: access/transam/xlogrecovery.c:2089 #, c-format msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." msgstr "" -#: access/transam/xlogrecovery.c:2123 +#: access/transam/xlogrecovery.c:2163 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "état de restauration cohérent atteint à %X/%X" #. translator: %s is a WAL record description -#: access/transam/xlogrecovery.c:2161 +#: access/transam/xlogrecovery.c:2201 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "rejeu des WAL à %X/%X pour %s" -#: access/transam/xlogrecovery.c:2257 +#: access/transam/xlogrecovery.c:2299 #, c-format msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" msgstr "identifiant de timeline précédent %u inattendu (identifiant de la timeline courante %u) dans l'enregistrement du point de vérification" -#: access/transam/xlogrecovery.c:2266 +#: access/transam/xlogrecovery.c:2308 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "" "identifiant timeline %u inattendu (après %u) dans l'enregistrement du point\n" "de vérification" -#: access/transam/xlogrecovery.c:2282 +#: access/transam/xlogrecovery.c:2324 #, c-format msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" msgstr "identifiant timeline %u inattendu dans l'enregistrement du checkpoint, avant d'atteindre le point de restauration minimum %X/%X sur la timeline %u" -#: access/transam/xlogrecovery.c:2466 access/transam/xlogrecovery.c:2742 +#: access/transam/xlogrecovery.c:2508 access/transam/xlogrecovery.c:2784 #, c-format msgid "recovery stopping after reaching consistency" msgstr "arrêt de la restauration après avoir atteint le point de cohérence" -#: access/transam/xlogrecovery.c:2487 +#: access/transam/xlogrecovery.c:2529 #, c-format msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" msgstr "arrêt de la restauration avant l'emplacement WAL (LSN) « %X/%X »" -#: access/transam/xlogrecovery.c:2577 +#: access/transam/xlogrecovery.c:2619 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "arrêt de la restauration avant validation de la transaction %u, %s" -#: access/transam/xlogrecovery.c:2584 +#: access/transam/xlogrecovery.c:2626 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "arrêt de la restauration avant annulation de la transaction %u, %s" -#: access/transam/xlogrecovery.c:2637 +#: access/transam/xlogrecovery.c:2679 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "restauration en arrêt au point de restauration « %s », heure %s" -#: access/transam/xlogrecovery.c:2655 +#: access/transam/xlogrecovery.c:2697 #, c-format msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" msgstr "arrêt de la restauration après l'emplacement WAL (LSN) « %X/%X »" -#: access/transam/xlogrecovery.c:2722 +#: access/transam/xlogrecovery.c:2764 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "arrêt de la restauration après validation de la transaction %u, %s" -#: access/transam/xlogrecovery.c:2730 +#: access/transam/xlogrecovery.c:2772 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "arrêt de la restauration après annulation de la transaction %u, %s" -#: access/transam/xlogrecovery.c:2811 +#: access/transam/xlogrecovery.c:2853 #, c-format msgid "pausing at the end of recovery" msgstr "pause à la fin de la restauration" -#: access/transam/xlogrecovery.c:2812 +#: access/transam/xlogrecovery.c:2854 #, c-format msgid "Execute pg_wal_replay_resume() to promote." msgstr "Exécuter pg_wal_replay_resume() pour promouvoir." -#: access/transam/xlogrecovery.c:2815 access/transam/xlogrecovery.c:4625 +#: access/transam/xlogrecovery.c:2857 access/transam/xlogrecovery.c:4594 #, c-format msgid "recovery has paused" msgstr "restauration en pause" -#: access/transam/xlogrecovery.c:2816 +#: access/transam/xlogrecovery.c:2858 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "Exécuter pg_wal_replay_resume() pour continuer." -#: access/transam/xlogrecovery.c:3082 -#, c-format -msgid "unexpected timeline ID %u in log segment %s, offset %u" +#: access/transam/xlogrecovery.c:3121 +#, fuzzy, c-format +#| msgid "unexpected timeline ID %u in log segment %s, offset %u" +msgid "unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u" msgstr "identifiant timeline %u inattendu dans le journal de transactions %s, décalage %u" -#: access/transam/xlogrecovery.c:3287 -#, c-format -msgid "could not read from log segment %s, offset %u: %m" +#: access/transam/xlogrecovery.c:3329 +#, fuzzy, c-format +#| msgid "could not read from log segment %s, offset %u: %m" +msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: %m" msgstr "n'a pas pu lire le journal de transactions %s, décalage %u : %m" -#: access/transam/xlogrecovery.c:3293 -#, c-format -msgid "could not read from log segment %s, offset %u: read %d of %zu" +#: access/transam/xlogrecovery.c:3336 +#, fuzzy, c-format +#| msgid "could not read from log segment %s, offset %u: read %d of %zu" +msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu" msgstr "n'a pas pu lire à partir du segment %s du journal de transactions, décalage %u: lu %d sur %zu" -#: access/transam/xlogrecovery.c:3942 -#, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "lien du point de vérification primaire invalide dans le fichier de contrôle" - -#: access/transam/xlogrecovery.c:3946 -#, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "lien du point de vérification invalide dans le fichier backup_label" - -#: access/transam/xlogrecovery.c:3964 -#, c-format -msgid "invalid primary checkpoint record" -msgstr "enregistrement du point de vérification primaire invalide" +#: access/transam/xlogrecovery.c:3976 +#, fuzzy, c-format +#| msgid "invalid checkpoint record" +msgid "invalid checkpoint location" +msgstr "enregistrement du point de vérification invalide" -#: access/transam/xlogrecovery.c:3968 +#: access/transam/xlogrecovery.c:3986 #, c-format msgid "invalid checkpoint record" msgstr "enregistrement du point de vérification invalide" -#: access/transam/xlogrecovery.c:3979 -#, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "identifiant du gestionnaire de ressource invalide dans l'enregistrement primaire du point de vérification" - -#: access/transam/xlogrecovery.c:3983 +#: access/transam/xlogrecovery.c:3992 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "identifiant du gestionnaire de ressource invalide dans l'enregistrement du point de vérification" -#: access/transam/xlogrecovery.c:3996 -#, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "xl_info invalide dans l'enregistrement du point de vérification primaire" - #: access/transam/xlogrecovery.c:4000 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "xl_info invalide dans l'enregistrement du point de vérification" -#: access/transam/xlogrecovery.c:4011 -#, c-format -msgid "invalid length of primary checkpoint record" -msgstr "longueur invalide de l'enregistrement primaire du point de vérification" - -#: access/transam/xlogrecovery.c:4015 +#: access/transam/xlogrecovery.c:4006 #, c-format msgid "invalid length of checkpoint record" msgstr "longueur invalide de l'enregistrement du point de vérification" -#: access/transam/xlogrecovery.c:4071 +#: access/transam/xlogrecovery.c:4060 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "la nouvelle timeline %u n'est pas une enfant de la timeline %u du système" -#: access/transam/xlogrecovery.c:4085 +#: access/transam/xlogrecovery.c:4074 #, c-format msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" msgstr "" "la nouvelle timeline %u a été créée à partir de la timeline de la base de données système %u\n" "avant le point de restauration courant %X/%X" -#: access/transam/xlogrecovery.c:4104 +#: access/transam/xlogrecovery.c:4093 #, c-format msgid "new target timeline is %u" msgstr "la nouvelle timeline cible est %u" -#: access/transam/xlogrecovery.c:4307 +#: access/transam/xlogrecovery.c:4296 #, c-format msgid "WAL receiver process shutdown requested" msgstr "le processus wal receiver a reçu une demande d'arrêt" -#: access/transam/xlogrecovery.c:4370 +#: access/transam/xlogrecovery.c:4356 #, c-format msgid "received promote request" msgstr "a reçu une demande de promotion" -#: access/transam/xlogrecovery.c:4383 -#, c-format -msgid "promote trigger file found: %s" -msgstr "fichier trigger de promotion trouvé : %s" - -#: access/transam/xlogrecovery.c:4391 -#, c-format -msgid "could not stat promote trigger file \"%s\": %m" -msgstr "n'a pas pu récupérer les propriétés du fichier trigger pour la promotion « %s » : %m" - -#: access/transam/xlogrecovery.c:4616 +#: access/transam/xlogrecovery.c:4585 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "le hot standby n'est pas possible à cause d'un paramétrage insuffisant" -#: access/transam/xlogrecovery.c:4617 access/transam/xlogrecovery.c:4644 -#: access/transam/xlogrecovery.c:4674 +#: access/transam/xlogrecovery.c:4586 access/transam/xlogrecovery.c:4613 +#: access/transam/xlogrecovery.c:4643 #, c-format msgid "%s = %d is a lower setting than on the primary server, where its value was %d." msgstr "%s = %d est un paramétrage plus bas que celui du serveur primaire, où sa valeur était %d." -#: access/transam/xlogrecovery.c:4626 +#: access/transam/xlogrecovery.c:4595 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "Si la restauration sort de la pause, le serveur sera arrêté." -#: access/transam/xlogrecovery.c:4627 +#: access/transam/xlogrecovery.c:4596 #, c-format msgid "You can then restart the server after making the necessary configuration changes." msgstr "Vous pouvez alors redémarrer le serveur après avoir réaliser les modifications nécessaires sur la configuration." -#: access/transam/xlogrecovery.c:4638 +#: access/transam/xlogrecovery.c:4607 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "la promotion n'est pas possible à cause d'une configuration insuffisante des paramètres" -#: access/transam/xlogrecovery.c:4648 +#: access/transam/xlogrecovery.c:4617 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "Redémarre le serveur après avoir effectuer les changements nécessaires de configuration." -#: access/transam/xlogrecovery.c:4672 +#: access/transam/xlogrecovery.c:4641 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "restauration annulée à cause d'un paramétrage insuffisant" -#: access/transam/xlogrecovery.c:4678 +#: access/transam/xlogrecovery.c:4647 #, c-format msgid "You can restart the server after making the necessary configuration changes." msgstr "Vous pouvez redémarrer le serveur après avoir réalisé les modifications nécessaires sur la configuration." -#: access/transam/xlogutils.c:1053 +#: access/transam/xlogrecovery.c:4689 +#, c-format +msgid "multiple recovery targets specified" +msgstr "multiples cibles de restauration spécifiées" + +#: access/transam/xlogrecovery.c:4690 +#, c-format +msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." +msgstr "Une seule valeur peut être spécifiée, parmi recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid." + +#: access/transam/xlogrecovery.c:4701 +#, c-format +msgid "The only allowed value is \"immediate\"." +msgstr "La seule valeur autorisée est « immediate »." + +#: access/transam/xlogrecovery.c:4853 utils/adt/timestamp.c:186 +#: utils/adt/timestamp.c:439 +#, c-format +msgid "timestamp out of range: \"%s\"" +msgstr "timestamp en dehors de limites : « %s »" + +#: access/transam/xlogrecovery.c:4898 +#, c-format +msgid "recovery_target_timeline is not a valid number." +msgstr "recovery_target_timeline n'est pas un nombre valide ." + +#: access/transam/xlogutils.c:1039 #, fuzzy, c-format #| msgid "could not read from log segment %s, offset %u: %m" -msgid "could not read from log segment %s, offset %d: %m" +msgid "could not read from WAL segment %s, offset %d: %m" msgstr "n'a pas pu lire le journal de transactions %s, décalage %u : %m" -#: access/transam/xlogutils.c:1060 +#: access/transam/xlogutils.c:1046 #, fuzzy, c-format #| msgid "could not read from log segment %s, offset %u: read %d of %zu" -msgid "could not read from log segment %s, offset %d: read %d of %d" +msgid "could not read from WAL segment %s, offset %d: read %d of %d" msgstr "n'a pas pu lire à partir du segment %s du journal de transactions, décalage %u: lu %d sur %zu" +#: archive/shell_archive.c:96 +#, c-format +msgid "archive command failed with exit code %d" +msgstr "échec de la commande d'archivage avec un code de retour %d" + +#: archive/shell_archive.c:98 archive/shell_archive.c:108 +#: archive/shell_archive.c:114 archive/shell_archive.c:123 +#, c-format +msgid "The failed archive command was: %s" +msgstr "La commande d'archivage qui a échoué était : %s" + +#: archive/shell_archive.c:105 +#, c-format +msgid "archive command was terminated by exception 0x%X" +msgstr "la commande d'archivage a été terminée par l'exception 0x%X" + +#: archive/shell_archive.c:107 postmaster/postmaster.c:3678 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "" +"Voir le fichier d'en-tête C « ntstatus.h » pour une description de la valeur\n" +"hexadécimale." + +#: archive/shell_archive.c:112 +#, c-format +msgid "archive command was terminated by signal %d: %s" +msgstr "la commande d'archivage a été terminée par le signal %d : %s" + +#: archive/shell_archive.c:121 +#, c-format +msgid "archive command exited with unrecognized status %d" +msgstr "la commande d'archivage a quitté avec le statut non reconnu %d" + #: backup/backup_manifest.c:253 #, c-format msgid "expected end timeline %u but found timeline %u" @@ -3560,143 +3624,144 @@ msgstr "timeline de début %u non trouvée dans l'historique de la timeline %u" msgid "could not rewind temporary file" msgstr "n'a pas pu revenir au début du fichier temporaire" -#: backup/backup_manifest.c:374 -#, fuzzy, c-format -#| msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" -msgid "could not read from temporary file: read only %zu of %zu bytes" -msgstr "n'a pas pu lire le fichier temporaire pour la jointure de hachage : a lu seulement %zu octets sur %zu" - -#: backup/basebackup.c:454 +#: backup/basebackup.c:470 #, c-format msgid "could not find any WAL files" msgstr "n'a pas pu trouver un seul fichier WAL" -#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 +#: backup/basebackup.c:485 backup/basebackup.c:500 backup/basebackup.c:509 #, c-format msgid "could not find WAL file \"%s\"" msgstr "n'a pas pu trouver le fichier WAL « %s »" -#: backup/basebackup.c:535 backup/basebackup.c:560 +#: backup/basebackup.c:551 backup/basebackup.c:576 #, c-format msgid "unexpected WAL file size \"%s\"" msgstr "taille du fichier WAL « %s » inattendue" -#: backup/basebackup.c:630 +#: backup/basebackup.c:646 #, c-format msgid "%lld total checksum verification failure" msgid_plural "%lld total checksum verification failures" msgstr[0] "%lld erreur de vérifications des sommes de contrôle au total" msgstr[1] "%lld erreurs de vérifications des sommes de contrôle au total" -#: backup/basebackup.c:637 +#: backup/basebackup.c:653 #, c-format msgid "checksum verification failure during base backup" -msgstr "échec de la véffication de somme de controle durant la sauvegarde de base" +msgstr "échec de la vérification de somme de contrôle durant la sauvegarde de base" -#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 -#: backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 -#: backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 -#: backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 -#: backup/basebackup.c:861 backup/basebackup.c:874 +#: backup/basebackup.c:722 backup/basebackup.c:731 backup/basebackup.c:742 +#: backup/basebackup.c:759 backup/basebackup.c:768 backup/basebackup.c:779 +#: backup/basebackup.c:796 backup/basebackup.c:805 backup/basebackup.c:817 +#: backup/basebackup.c:841 backup/basebackup.c:855 backup/basebackup.c:866 +#: backup/basebackup.c:877 backup/basebackup.c:890 #, c-format msgid "duplicate option \"%s\"" msgstr "option « %s » dupliquée" -#: backup/basebackup.c:734 +#: backup/basebackup.c:750 #, fuzzy, c-format #| msgid "unrecognized object type \"%s\"" msgid "unrecognized checkpoint type: \"%s\"" msgstr "type d'objet non reconnu « %s »" -#: backup/basebackup.c:769 +#: backup/basebackup.c:785 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d est en dehors des limites valides pour le paramètre « %s » (%d .. %d)" -#: backup/basebackup.c:814 +#: backup/basebackup.c:830 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "option de manifeste non reconnue : « %s »" -#: backup/basebackup.c:830 +#: backup/basebackup.c:846 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "algorithme de somme de contrôle inconnu : « %s »" -#: backup/basebackup.c:865 +#: backup/basebackup.c:881 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "algorithme de compression inconnu : « %s »" -#: backup/basebackup.c:881 +#: backup/basebackup.c:897 #, fuzzy, c-format #| msgid "unrecognized column option \"%s\"" msgid "unrecognized base backup option: \"%s\"" msgstr "option de colonne « %s » non reconnue" -#: backup/basebackup.c:892 +#: backup/basebackup.c:908 #, c-format msgid "manifest checksums require a backup manifest" msgstr "les sommes de contrôles du manifeste nécessitent un manifeste de sauvegarde" -#: backup/basebackup.c:901 +#: backup/basebackup.c:917 #, c-format msgid "target detail cannot be used without target" msgstr "le détail de la cible ne peut pas être utilisé sans cible" -#: backup/basebackup.c:910 backup/basebackup_target.c:218 +#: backup/basebackup.c:926 backup/basebackup_target.c:218 #, c-format msgid "target \"%s\" does not accept a target detail" msgstr "la cible « %s » n'accepte pas un détail de cible" -#: backup/basebackup.c:921 +#: backup/basebackup.c:937 #, c-format msgid "compression detail cannot be specified unless compression is enabled" msgstr "le détail de compression ne peut pas être spécifié sauf si la compression est activée" -#: backup/basebackup.c:934 +#: backup/basebackup.c:950 #, c-format msgid "invalid compression specification: %s" msgstr "spécification de compression invalide : %s" -#: backup/basebackup.c:1431 +#: backup/basebackup.c:1116 backup/basebackup.c:1294 +#, c-format +msgid "could not stat file or directory \"%s\": %m" +msgstr "" +"n'a pas pu récupérer les informations sur le fichier ou répertoire\n" +"« %s » : %m" + +#: backup/basebackup.c:1430 #, c-format msgid "skipping special file \"%s\"" msgstr "ignore le fichier spécial « %s »" -#: backup/basebackup.c:1550 +#: backup/basebackup.c:1542 #, c-format msgid "invalid segment number %d in file \"%s\"" msgstr "numéro de segment %d invalide dans le fichier « %s »" -#: backup/basebackup.c:1590 +#: backup/basebackup.c:1574 #, c-format msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" msgstr "n'a pas pu vérifier la somme de contrôle dans le fichier « %s », bloc %u : la taille de tampon de lecture %d et la taille de bloc %d diffèrent" -#: backup/basebackup.c:1664 +#: backup/basebackup.c:1658 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" msgstr "échec de la vérification de la somme de contrôle dans le fichier « %s », bloc %u : calculé %X, mais attendu %X" -#: backup/basebackup.c:1671 +#: backup/basebackup.c:1665 #, c-format msgid "further checksum verification failures in file \"%s\" will not be reported" msgstr "les prochains échec de vérification de somme de contrôle dans le fichier « %s » ne seront pas reportés" -#: backup/basebackup.c:1718 +#: backup/basebackup.c:1721 #, c-format msgid "file \"%s\" has a total of %d checksum verification failure" msgid_plural "file \"%s\" has a total of %d checksum verification failures" msgstr[0] "le fichier « %s » a un total de %d échec de vérification de somme de contrôle" msgstr[1] "le fichier « %s » a un total de %d échecs de vérification de somme de contrôle" -#: backup/basebackup.c:1764 +#: backup/basebackup.c:1767 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "nom du fichier trop long pour le format tar : « %s »" -#: backup/basebackup.c:1769 +#: backup/basebackup.c:1772 #, c-format msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" msgstr "cible du lien symbolique trop longue pour le format tar : nom de fichier « %s », cible « %s »" @@ -3718,42 +3783,49 @@ msgstr "la compression lz4 n'est pas supportée dans cette installation" #: backup/basebackup_server.c:75 #, fuzzy, c-format +#| msgid "permission denied to create role" +msgid "permission denied to create backup stored on server" +msgstr "droit refusé pour créer un rôle" + +#: backup/basebackup_server.c:76 +#, fuzzy, c-format #| msgid "must be superuser or a member of the pg_write_server_files role to COPY to a file" -msgid "must be superuser or a role with privileges of the pg_write_server_files role to create backup stored on server" +msgid "Only roles with privileges of the \"%s\" role may create a backup stored on the server." msgstr "doit être super-utilisateur ou membre de pg_read_all_settings pour utiliser COPY vers un fichier" -#: backup/basebackup_server.c:89 +#: backup/basebackup_server.c:91 #, fuzzy, c-format #| msgid "relative path not allowed for COPY to file" msgid "relative path not allowed for backup stored on server" msgstr "un chemin relatif n'est pas autorisé à utiliser COPY vers un fichier" -#: backup/basebackup_server.c:102 commands/dbcommands.c:500 +#: backup/basebackup_server.c:104 commands/dbcommands.c:501 #: commands/tablespace.c:163 commands/tablespace.c:179 -#: commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1558 +#: commands/tablespace.c:599 commands/tablespace.c:644 replication/slot.c:1704 #: storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" msgstr "n'a pas pu créer le répertoire « %s » : %m" -#: backup/basebackup_server.c:115 +#: backup/basebackup_server.c:117 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "le répertoire « %s » existe mais n'est pas vide" -#: backup/basebackup_server.c:123 utils/init/postinit.c:1072 +#: backup/basebackup_server.c:125 utils/init/postinit.c:1164 #, c-format msgid "could not access directory \"%s\": %m" msgstr "n'a pas pu accéder au répertoire « %s » : %m" -#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 -#: backup/basebackup_server.c:268 backup/basebackup_server.c:275 -#: storage/smgr/md.c:487 storage/smgr/md.c:494 storage/smgr/md.c:785 +#: backup/basebackup_server.c:177 backup/basebackup_server.c:184 +#: backup/basebackup_server.c:270 backup/basebackup_server.c:277 +#: storage/smgr/md.c:504 storage/smgr/md.c:511 storage/smgr/md.c:593 +#: storage/smgr/md.c:615 storage/smgr/md.c:865 #, c-format msgid "Check free disk space." msgstr "Vérifiez l'espace disque disponible." -#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 +#: backup/basebackup_server.c:181 backup/basebackup_server.c:274 #, fuzzy, c-format #| msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" @@ -3781,782 +3853,716 @@ msgstr "la compression zstd n'est pas supportée dans cette installation" msgid "could not set compression worker count to %d: %s" msgstr "n'a pas pu configurer le nombre de workers de compression à %d : %s" -#: bootstrap/bootstrap.c:263 +#: backup/basebackup_zstd.c:129 #, c-format -msgid "-X requires a power of two value between 1 MB and 1 GB" -msgstr "-X nécessite une puissance de deux entre 1 MB et 1 GB" +msgid "could not enable long-distance mode: %s" +msgstr "n'a pas pu activer le mode distance longue : %s" -#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3906 +#: bootstrap/bootstrap.c:243 postmaster/postmaster.c:721 tcop/postgres.c:3819 #, c-format msgid "--%s requires a value" msgstr "--%s requiert une valeur" -#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3911 +#: bootstrap/bootstrap.c:248 postmaster/postmaster.c:726 tcop/postgres.c:3824 #, c-format msgid "-c %s requires a value" msgstr "-c %s requiert une valeur" -#: bootstrap/bootstrap.c:296 postmaster/postmaster.c:863 -#: postmaster/postmaster.c:876 +#: bootstrap/bootstrap.c:289 +#, c-format +msgid "-X requires a power of two value between 1 MB and 1 GB" +msgstr "-X nécessite une puissance de deux entre 1 MB et 1 GB" + +#: bootstrap/bootstrap.c:295 postmaster/postmaster.c:844 +#: postmaster/postmaster.c:857 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Essayez « %s --help » pour plus d'informations.\n" -#: bootstrap/bootstrap.c:305 +#: bootstrap/bootstrap.c:304 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s : arguments invalides en ligne de commande\n" -#: catalog/aclchk.c:185 +#: catalog/aclchk.c:201 #, c-format msgid "grant options can only be granted to roles" msgstr "les options grant peuvent seulement être données aux rôles" -#: catalog/aclchk.c:307 +#: catalog/aclchk.c:323 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "aucun droit n'a pu être accordé pour la colonne « %s » de la relation « %s »" -#: catalog/aclchk.c:312 +#: catalog/aclchk.c:328 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "aucun droit n'a été accordé pour « %s »" -#: catalog/aclchk.c:320 +#: catalog/aclchk.c:336 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "certains droits n'ont pu être accordé pour la colonne « %s » de la relation « %s »" -#: catalog/aclchk.c:325 +#: catalog/aclchk.c:341 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "tous les droits n'ont pas été accordés pour « %s »" -#: catalog/aclchk.c:336 +#: catalog/aclchk.c:352 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "aucun droit n'a pu être révoqué pour la colonne « %s » de la relation « %s »" -#: catalog/aclchk.c:341 +#: catalog/aclchk.c:357 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "aucun droit n'a pu être révoqué pour « %s »" -#: catalog/aclchk.c:349 +#: catalog/aclchk.c:365 #, c-format msgid "not all privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "certains droits n'ont pu être révoqués pour la colonne « %s » de la relation « %s »" -#: catalog/aclchk.c:354 +#: catalog/aclchk.c:370 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "certains droits n'ont pu être révoqués pour « %s »" -#: catalog/aclchk.c:386 +#: catalog/aclchk.c:402 #, c-format msgid "grantor must be current user" msgstr "le concédant doit être l'utilisateur actuel" -#: catalog/aclchk.c:454 catalog/aclchk.c:1029 +#: catalog/aclchk.c:470 catalog/aclchk.c:1045 #, c-format msgid "invalid privilege type %s for relation" msgstr "droit %s invalide pour la relation" -#: catalog/aclchk.c:458 catalog/aclchk.c:1033 +#: catalog/aclchk.c:474 catalog/aclchk.c:1049 #, c-format msgid "invalid privilege type %s for sequence" msgstr "droit %s invalide pour la séquence" -#: catalog/aclchk.c:462 +#: catalog/aclchk.c:478 #, c-format msgid "invalid privilege type %s for database" msgstr "droit %s invalide pour la base de données" -#: catalog/aclchk.c:466 +#: catalog/aclchk.c:482 #, c-format msgid "invalid privilege type %s for domain" msgstr "type de droit %s invalide pour le domaine" -#: catalog/aclchk.c:470 catalog/aclchk.c:1037 +#: catalog/aclchk.c:486 catalog/aclchk.c:1053 #, c-format msgid "invalid privilege type %s for function" msgstr "droit %s invalide pour la fonction" -#: catalog/aclchk.c:474 +#: catalog/aclchk.c:490 #, c-format msgid "invalid privilege type %s for language" msgstr "droit %s invalide pour le langage" -#: catalog/aclchk.c:478 +#: catalog/aclchk.c:494 #, c-format msgid "invalid privilege type %s for large object" msgstr "type de droit invalide, %s, pour le Large Object" -#: catalog/aclchk.c:482 catalog/aclchk.c:1053 +#: catalog/aclchk.c:498 catalog/aclchk.c:1069 #, c-format msgid "invalid privilege type %s for schema" msgstr "droit %s invalide pour le schéma" -#: catalog/aclchk.c:486 catalog/aclchk.c:1041 +#: catalog/aclchk.c:502 catalog/aclchk.c:1057 #, c-format msgid "invalid privilege type %s for procedure" msgstr "type de droit %s invalide pour la procédure " -#: catalog/aclchk.c:490 catalog/aclchk.c:1045 +#: catalog/aclchk.c:506 catalog/aclchk.c:1061 #, c-format msgid "invalid privilege type %s for routine" msgstr "droit %s invalide pour la routine" -#: catalog/aclchk.c:494 +#: catalog/aclchk.c:510 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "droit %s invalide pour le tablespace" -#: catalog/aclchk.c:498 catalog/aclchk.c:1049 +#: catalog/aclchk.c:514 catalog/aclchk.c:1065 #, c-format msgid "invalid privilege type %s for type" msgstr "type de droit %s invalide pour le type" -#: catalog/aclchk.c:502 +#: catalog/aclchk.c:518 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "type de droit %s invalide pour le wrapper de données distantes" -#: catalog/aclchk.c:506 +#: catalog/aclchk.c:522 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "type de droit %s invalide pour le serveur distant" -#: catalog/aclchk.c:510 +#: catalog/aclchk.c:526 #, c-format msgid "invalid privilege type %s for parameter" msgstr "type de droit %s invalide pour le paramètre" -#: catalog/aclchk.c:549 +#: catalog/aclchk.c:565 #, c-format msgid "column privileges are only valid for relations" msgstr "les droits sur la colonne sont seulement valides pour les relations" -#: catalog/aclchk.c:712 catalog/aclchk.c:4486 catalog/aclchk.c:5333 -#: catalog/objectaddress.c:1072 catalog/pg_largeobject.c:116 -#: storage/large_object/inv_api.c:287 +#: catalog/aclchk.c:728 catalog/aclchk.c:3555 catalog/objectaddress.c:1092 +#: catalog/pg_largeobject.c:116 storage/large_object/inv_api.c:287 #, c-format msgid "large object %u does not exist" msgstr "le « Large Object » %u n'existe pas" -#: catalog/aclchk.c:1086 +#: catalog/aclchk.c:1102 #, c-format msgid "default privileges cannot be set for columns" msgstr "les droits par défaut ne peuvent pas être configurés pour les colonnes" -#: catalog/aclchk.c:1246 +#: catalog/aclchk.c:1138 +#, fuzzy, c-format +#| msgid "permission denied to create role" +msgid "permission denied to change default privileges" +msgstr "droit refusé pour créer un rôle" + +#: catalog/aclchk.c:1256 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "ne peut pas utiliser la clause IN SCHEMA lors de l'utilisation de GRANT/REVOKE ON SCHEMAS" -#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 -#: catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:776 -#: commands/sequence.c:1663 commands/tablecmds.c:7231 commands/tablecmds.c:7387 -#: commands/tablecmds.c:7437 commands/tablecmds.c:7511 -#: commands/tablecmds.c:7581 commands/tablecmds.c:7693 -#: commands/tablecmds.c:7787 commands/tablecmds.c:7846 -#: commands/tablecmds.c:7935 commands/tablecmds.c:7965 -#: commands/tablecmds.c:8093 commands/tablecmds.c:8175 -#: commands/tablecmds.c:8331 commands/tablecmds.c:8449 -#: commands/tablecmds.c:12167 commands/tablecmds.c:12348 -#: commands/tablecmds.c:12508 commands/tablecmds.c:13672 -#: commands/tablecmds.c:16240 commands/trigger.c:958 parser/analyze.c:2468 -#: parser/parse_relation.c:725 parser/parse_target.c:1063 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3434 -#: parser/parse_utilcmd.c:3470 parser/parse_utilcmd.c:3512 utils/adt/acl.c:2869 -#: utils/adt/ruleutils.c:2810 +#: catalog/aclchk.c:1595 catalog/catalog.c:631 catalog/objectaddress.c:1561 +#: catalog/pg_publication.c:533 commands/analyze.c:390 commands/copy.c:837 +#: commands/sequence.c:1663 commands/tablecmds.c:7339 commands/tablecmds.c:7495 +#: commands/tablecmds.c:7545 commands/tablecmds.c:7619 +#: commands/tablecmds.c:7689 commands/tablecmds.c:7805 +#: commands/tablecmds.c:7899 commands/tablecmds.c:7958 +#: commands/tablecmds.c:8047 commands/tablecmds.c:8077 +#: commands/tablecmds.c:8205 commands/tablecmds.c:8287 +#: commands/tablecmds.c:8421 commands/tablecmds.c:8529 +#: commands/tablecmds.c:12244 commands/tablecmds.c:12425 +#: commands/tablecmds.c:12586 commands/tablecmds.c:13748 +#: commands/tablecmds.c:16279 commands/trigger.c:949 parser/analyze.c:2518 +#: parser/parse_relation.c:737 parser/parse_target.c:1054 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3413 +#: parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2876 +#: utils/adt/ruleutils.c:2799 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "la colonne « %s » de la relation « %s » n'existe pas" -#: catalog/aclchk.c:1850 catalog/objectaddress.c:1383 commands/sequence.c:1172 -#: commands/tablecmds.c:253 commands/tablecmds.c:17104 utils/adt/acl.c:2077 -#: utils/adt/acl.c:2107 utils/adt/acl.c:2139 utils/adt/acl.c:2171 -#: utils/adt/acl.c:2199 utils/adt/acl.c:2229 +#: catalog/aclchk.c:1840 +#, c-format +msgid "\"%s\" is an index" +msgstr "« %s » est un index" + +#: catalog/aclchk.c:1847 commands/tablecmds.c:13905 commands/tablecmds.c:17186 +#, c-format +msgid "\"%s\" is a composite type" +msgstr "« %s » est un type composite" + +#: catalog/aclchk.c:1855 catalog/objectaddress.c:1401 commands/sequence.c:1171 +#: commands/tablecmds.c:254 commands/tablecmds.c:17150 utils/adt/acl.c:2084 +#: utils/adt/acl.c:2114 utils/adt/acl.c:2146 utils/adt/acl.c:2178 +#: utils/adt/acl.c:2206 utils/adt/acl.c:2236 #, c-format msgid "\"%s\" is not a sequence" msgstr "« %s » n'est pas une séquence" -#: catalog/aclchk.c:1888 +#: catalog/aclchk.c:1893 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "la séquence « %s » accepte seulement les droits USAGE, SELECT et UPDATE" -#: catalog/aclchk.c:1905 +#: catalog/aclchk.c:1910 #, c-format msgid "invalid privilege type %s for table" msgstr "type de droit %s invalide pour la table" -#: catalog/aclchk.c:2071 +#: catalog/aclchk.c:2072 #, c-format msgid "invalid privilege type %s for column" msgstr "type de droit %s invalide pour la colonne" -#: catalog/aclchk.c:2084 +#: catalog/aclchk.c:2085 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "la séquence « %s » accepte seulement le droit SELECT pour les colonnes" -#: catalog/aclchk.c:2666 +#: catalog/aclchk.c:2275 #, c-format msgid "language \"%s\" is not trusted" msgstr "le langage « %s » n'est pas de confiance" -#: catalog/aclchk.c:2668 +#: catalog/aclchk.c:2277 #, c-format msgid "GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages." msgstr "GRANT et REVOKE ne sont pas autorisés sur des langages qui ne sont pas de confiance car seuls les super-utilisateurs peuvent utiliser ces langages." -#: catalog/aclchk.c:3182 +#: catalog/aclchk.c:2427 #, c-format msgid "cannot set privileges of array types" msgstr "ne peut pas configurer les droits des types tableau" -#: catalog/aclchk.c:3183 +#: catalog/aclchk.c:2428 #, c-format msgid "Set the privileges of the element type instead." msgstr "Configurez les droits du type élément à la place." -#: catalog/aclchk.c:3190 catalog/objectaddress.c:1649 +#: catalog/aclchk.c:2435 catalog/objectaddress.c:1667 #, c-format msgid "\"%s\" is not a domain" msgstr "« %s » n'est pas un domaine" -#: catalog/aclchk.c:3462 +#: catalog/aclchk.c:2619 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "type de droit « %s » non reconnu" -#: catalog/aclchk.c:3527 +#: catalog/aclchk.c:2684 #, c-format msgid "permission denied for aggregate %s" -msgstr "droit refusé pour l'aggrégat %s" +msgstr "droit refusé pour l'agrégat %s" -#: catalog/aclchk.c:3530 +#: catalog/aclchk.c:2687 #, c-format msgid "permission denied for collation %s" msgstr "droit refusé pour le collationnement %s" -#: catalog/aclchk.c:3533 +#: catalog/aclchk.c:2690 #, c-format msgid "permission denied for column %s" msgstr "droit refusé pour la colonne %s" -#: catalog/aclchk.c:3536 +#: catalog/aclchk.c:2693 #, c-format msgid "permission denied for conversion %s" msgstr "droit refusé pour la conversion %s" -#: catalog/aclchk.c:3539 +#: catalog/aclchk.c:2696 #, c-format msgid "permission denied for database %s" msgstr "droit refusé pour la base de données %s" -#: catalog/aclchk.c:3542 +#: catalog/aclchk.c:2699 #, c-format msgid "permission denied for domain %s" msgstr "droit refusé pour le domaine %s" -#: catalog/aclchk.c:3545 +#: catalog/aclchk.c:2702 #, c-format msgid "permission denied for event trigger %s" msgstr "droit refusé pour le trigger sur événement %s" -#: catalog/aclchk.c:3548 +#: catalog/aclchk.c:2705 #, c-format msgid "permission denied for extension %s" msgstr "droit refusé pour l'extension %s" -#: catalog/aclchk.c:3551 +#: catalog/aclchk.c:2708 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "droit refusé pour le wrapper de données distantes %s" -#: catalog/aclchk.c:3554 +#: catalog/aclchk.c:2711 #, c-format msgid "permission denied for foreign server %s" msgstr "droit refusé pour le serveur distant %s" -#: catalog/aclchk.c:3557 +#: catalog/aclchk.c:2714 #, c-format msgid "permission denied for foreign table %s" msgstr "droit refusé pour la table distante %s" -#: catalog/aclchk.c:3560 +#: catalog/aclchk.c:2717 #, c-format msgid "permission denied for function %s" msgstr "droit refusé pour la fonction %s" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:2720 #, c-format msgid "permission denied for index %s" msgstr "droit refusé pour l'index %s" -#: catalog/aclchk.c:3566 +#: catalog/aclchk.c:2723 #, c-format msgid "permission denied for language %s" msgstr "droit refusé pour le langage %s" -#: catalog/aclchk.c:3569 +#: catalog/aclchk.c:2726 #, c-format msgid "permission denied for large object %s" msgstr "droit refusé pour le Large Object %s" -#: catalog/aclchk.c:3572 +#: catalog/aclchk.c:2729 #, c-format msgid "permission denied for materialized view %s" msgstr "droit refusé pour la vue matérialisée %s" -#: catalog/aclchk.c:3575 +#: catalog/aclchk.c:2732 #, c-format msgid "permission denied for operator class %s" msgstr "droit refusé pour la classe d'opérateur %s" -#: catalog/aclchk.c:3578 +#: catalog/aclchk.c:2735 #, c-format msgid "permission denied for operator %s" msgstr "droit refusé pour l'opérateur %s" -#: catalog/aclchk.c:3581 +#: catalog/aclchk.c:2738 #, c-format msgid "permission denied for operator family %s" msgstr "droit refusé pour la famille d'opérateur %s" -#: catalog/aclchk.c:3584 +#: catalog/aclchk.c:2741 #, c-format msgid "permission denied for parameter %s" msgstr "droit refusé pour le paramètre %s" -#: catalog/aclchk.c:3587 +#: catalog/aclchk.c:2744 #, c-format msgid "permission denied for policy %s" msgstr "droit refusé pour la politique %s" -#: catalog/aclchk.c:3590 +#: catalog/aclchk.c:2747 #, c-format msgid "permission denied for procedure %s" msgstr "droit refusé pour la procédure %s" -#: catalog/aclchk.c:3593 +#: catalog/aclchk.c:2750 #, c-format msgid "permission denied for publication %s" msgstr "droit refusé pour la publication %s" -#: catalog/aclchk.c:3596 +#: catalog/aclchk.c:2753 #, c-format msgid "permission denied for routine %s" msgstr "droit refusé pour la routine %s" -#: catalog/aclchk.c:3599 +#: catalog/aclchk.c:2756 #, c-format msgid "permission denied for schema %s" msgstr "droit refusé pour le schéma %s" -#: catalog/aclchk.c:3602 commands/sequence.c:660 commands/sequence.c:886 -#: commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 -#: commands/sequence.c:1825 +#: catalog/aclchk.c:2759 commands/sequence.c:659 commands/sequence.c:885 +#: commands/sequence.c:927 commands/sequence.c:968 commands/sequence.c:1761 +#: commands/sequence.c:1810 #, c-format msgid "permission denied for sequence %s" msgstr "droit refusé pour la séquence %s" -#: catalog/aclchk.c:3605 +#: catalog/aclchk.c:2762 #, c-format msgid "permission denied for statistics object %s" msgstr "droit refusé pour l'objet statistique %s" -#: catalog/aclchk.c:3608 +#: catalog/aclchk.c:2765 #, c-format msgid "permission denied for subscription %s" msgstr "droit refusé pour la souscription %s" -#: catalog/aclchk.c:3611 +#: catalog/aclchk.c:2768 #, c-format msgid "permission denied for table %s" msgstr "droit refusé pour la table %s" -#: catalog/aclchk.c:3614 +#: catalog/aclchk.c:2771 #, c-format msgid "permission denied for tablespace %s" msgstr "droit refusé pour le tablespace %s" -#: catalog/aclchk.c:3617 +#: catalog/aclchk.c:2774 #, c-format msgid "permission denied for text search configuration %s" msgstr "droit refusé pour la configuration de recherche plein texte %s" -#: catalog/aclchk.c:3620 +#: catalog/aclchk.c:2777 #, c-format msgid "permission denied for text search dictionary %s" msgstr "droit refusé pour le dictionnaire de recherche plein texte %s" -#: catalog/aclchk.c:3623 +#: catalog/aclchk.c:2780 #, c-format msgid "permission denied for type %s" msgstr "droit refusé pour le type %s" -#: catalog/aclchk.c:3626 +#: catalog/aclchk.c:2783 #, c-format msgid "permission denied for view %s" msgstr "droit refusé pour la vue %s" -#: catalog/aclchk.c:3662 +#: catalog/aclchk.c:2819 #, c-format msgid "must be owner of aggregate %s" -msgstr "doit être le propriétaire de l'aggrégat %s" +msgstr "doit être le propriétaire de l'agrégat %s" -#: catalog/aclchk.c:3665 +#: catalog/aclchk.c:2822 #, c-format msgid "must be owner of collation %s" msgstr "doit être le propriétaire du collationnement %s" -#: catalog/aclchk.c:3668 +#: catalog/aclchk.c:2825 #, c-format msgid "must be owner of conversion %s" msgstr "doit être le propriétaire de la conversion %s" -#: catalog/aclchk.c:3671 +#: catalog/aclchk.c:2828 #, c-format msgid "must be owner of database %s" msgstr "doit être le propriétaire de la base de données %s" -#: catalog/aclchk.c:3674 +#: catalog/aclchk.c:2831 #, c-format msgid "must be owner of domain %s" msgstr "doit être le propriétaire du domaine %s" -#: catalog/aclchk.c:3677 +#: catalog/aclchk.c:2834 #, c-format msgid "must be owner of event trigger %s" msgstr "doit être le propriétaire du trigger sur événement %s" -#: catalog/aclchk.c:3680 +#: catalog/aclchk.c:2837 #, c-format msgid "must be owner of extension %s" msgstr "doit être le propriétaire de l'extension %s" -#: catalog/aclchk.c:3683 +#: catalog/aclchk.c:2840 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "doit être le propriétaire du wrapper de données distantes %s" -#: catalog/aclchk.c:3686 +#: catalog/aclchk.c:2843 #, c-format msgid "must be owner of foreign server %s" msgstr "doit être le propriétaire de serveur distant %s" -#: catalog/aclchk.c:3689 +#: catalog/aclchk.c:2846 #, c-format msgid "must be owner of foreign table %s" msgstr "doit être le propriétaire de la table distante %s" -#: catalog/aclchk.c:3692 +#: catalog/aclchk.c:2849 #, c-format msgid "must be owner of function %s" msgstr "doit être le propriétaire de la fonction %s" -#: catalog/aclchk.c:3695 +#: catalog/aclchk.c:2852 #, c-format msgid "must be owner of index %s" msgstr "doit être le propriétaire de l'index %s" -#: catalog/aclchk.c:3698 +#: catalog/aclchk.c:2855 #, c-format msgid "must be owner of language %s" msgstr "doit être le propriétaire du langage %s" -#: catalog/aclchk.c:3701 +#: catalog/aclchk.c:2858 #, c-format msgid "must be owner of large object %s" msgstr "doit être le propriétaire du Large Object %s" -#: catalog/aclchk.c:3704 +#: catalog/aclchk.c:2861 #, c-format msgid "must be owner of materialized view %s" msgstr "doit être le propriétaire de la vue matérialisée %s" -#: catalog/aclchk.c:3707 +#: catalog/aclchk.c:2864 #, c-format msgid "must be owner of operator class %s" msgstr "doit être le propriétaire de la classe d'opérateur %s" -#: catalog/aclchk.c:3710 +#: catalog/aclchk.c:2867 #, c-format msgid "must be owner of operator %s" -msgstr "doit être le prorpriétaire de l'opérateur %s" +msgstr "doit être le propriétaire de l'opérateur %s" -#: catalog/aclchk.c:3713 +#: catalog/aclchk.c:2870 #, c-format msgid "must be owner of operator family %s" -msgstr "doit être le prorpriétaire de la famille d'opérateur %s" +msgstr "doit être le propriétaire de la famille d'opérateur %s" -#: catalog/aclchk.c:3716 +#: catalog/aclchk.c:2873 #, c-format msgid "must be owner of procedure %s" -msgstr "doit être le prorpriétaire de la procédure %s" +msgstr "doit être le propriétaire de la procédure %s" -#: catalog/aclchk.c:3719 +#: catalog/aclchk.c:2876 #, c-format msgid "must be owner of publication %s" msgstr "doit être le propriétaire de la publication %s" -#: catalog/aclchk.c:3722 +#: catalog/aclchk.c:2879 #, c-format msgid "must be owner of routine %s" msgstr "doit être le propriétaire de la routine %s" -#: catalog/aclchk.c:3725 +#: catalog/aclchk.c:2882 #, c-format msgid "must be owner of sequence %s" msgstr "doit être le propriétaire de la séquence %s" -#: catalog/aclchk.c:3728 +#: catalog/aclchk.c:2885 #, c-format msgid "must be owner of subscription %s" msgstr "doit être le propriétaire de la souscription %s" -#: catalog/aclchk.c:3731 +#: catalog/aclchk.c:2888 #, c-format msgid "must be owner of table %s" msgstr "doit être le propriétaire de la table %s" -#: catalog/aclchk.c:3734 +#: catalog/aclchk.c:2891 #, c-format msgid "must be owner of type %s" msgstr "doit être le propriétaire du type %s" -#: catalog/aclchk.c:3737 +#: catalog/aclchk.c:2894 #, c-format msgid "must be owner of view %s" msgstr "doit être le propriétaire de la vue %s" -#: catalog/aclchk.c:3740 +#: catalog/aclchk.c:2897 #, c-format msgid "must be owner of schema %s" msgstr "doit être le propriétaire du schéma %s" -#: catalog/aclchk.c:3743 +#: catalog/aclchk.c:2900 #, c-format msgid "must be owner of statistics object %s" msgstr "doit être le propriétaire de l'objet statistique %s" -#: catalog/aclchk.c:3746 +#: catalog/aclchk.c:2903 #, c-format msgid "must be owner of tablespace %s" msgstr "doit être le propriétaire du tablespace %s" -#: catalog/aclchk.c:3749 +#: catalog/aclchk.c:2906 #, c-format msgid "must be owner of text search configuration %s" msgstr "doit être le propriétaire de la configuration de recherche plein texte %s" -#: catalog/aclchk.c:3752 +#: catalog/aclchk.c:2909 #, c-format msgid "must be owner of text search dictionary %s" msgstr "doit être le propriétaire du dictionnaire de recherche plein texte %s" -#: catalog/aclchk.c:3766 +#: catalog/aclchk.c:2923 #, c-format msgid "must be owner of relation %s" msgstr "doit être le propriétaire de la relation %s" -#: catalog/aclchk.c:3812 +#: catalog/aclchk.c:2969 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "droit refusé pour la colonne « %s » de la relation « %s »" -#: catalog/aclchk.c:3957 catalog/aclchk.c:3976 +#: catalog/aclchk.c:3104 catalog/aclchk.c:3979 catalog/aclchk.c:4011 +#, fuzzy, c-format +#| msgid "schema with OID %u does not exist" +msgid "%s with OID %u does not exist" +msgstr "le schéma d'OID %u n'existe pas" + +#: catalog/aclchk.c:3188 catalog/aclchk.c:3207 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "l'attribut %d de la relation d'OID %u n'existe pas" -#: catalog/aclchk.c:4071 catalog/aclchk.c:5184 +#: catalog/aclchk.c:3302 #, c-format msgid "relation with OID %u does not exist" msgstr "la relation d'OID %u n'existe pas" -#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2581 -#, c-format -msgid "database with OID %u does not exist" -msgstr "la base de données d'OID %u n'existe pas" - -#: catalog/aclchk.c:4299 +#: catalog/aclchk.c:3476 #, c-format msgid "parameter ACL with OID %u does not exist" msgstr "les droits du paramètre d'OID %u n'existe pas" -#: catalog/aclchk.c:4353 catalog/aclchk.c:5262 tcop/fastpath.c:141 -#: utils/fmgr/fmgr.c:2037 -#, c-format -msgid "function with OID %u does not exist" -msgstr "la fonction d'OID %u n'existe pas" - -#: catalog/aclchk.c:4407 catalog/aclchk.c:5288 -#, c-format -msgid "language with OID %u does not exist" -msgstr "le langage d'OID %u n'existe pas" - -#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 -#: commands/publicationcmds.c:1745 +#: catalog/aclchk.c:3640 commands/collationcmds.c:813 +#: commands/publicationcmds.c:1746 #, c-format msgid "schema with OID %u does not exist" msgstr "le schéma d'OID %u n'existe pas" -#: catalog/aclchk.c:4635 catalog/aclchk.c:5387 utils/adt/genfile.c:632 -#, c-format -msgid "tablespace with OID %u does not exist" -msgstr "le tablespace d'OID %u n'existe pas" - -#: catalog/aclchk.c:4694 catalog/aclchk.c:5521 commands/foreigncmds.c:325 -#, c-format -msgid "foreign-data wrapper with OID %u does not exist" -msgstr "le wrapper de données distantes d'OID %u n'existe pas" - -#: catalog/aclchk.c:4756 catalog/aclchk.c:5548 commands/foreigncmds.c:462 -#, c-format -msgid "foreign server with OID %u does not exist" -msgstr "le serveur distant d'OID %u n'existe pas" - -#: catalog/aclchk.c:4816 catalog/aclchk.c:5210 utils/cache/typcache.c:385 -#: utils/cache/typcache.c:440 +#: catalog/aclchk.c:3705 utils/cache/typcache.c:390 utils/cache/typcache.c:445 #, c-format msgid "type with OID %u does not exist" msgstr "le type d'OID %u n'existe pas" -#: catalog/aclchk.c:5236 -#, c-format -msgid "operator with OID %u does not exist" -msgstr "l'opérateur d'OID %u n'existe pas" - -#: catalog/aclchk.c:5413 -#, c-format -msgid "operator class with OID %u does not exist" -msgstr "la classe d'opérateur d'OID %u n'existe pas" - -#: catalog/aclchk.c:5440 -#, c-format -msgid "operator family with OID %u does not exist" -msgstr "la famille d'opérateur d'OID %u n'existe pas" - -#: catalog/aclchk.c:5467 -#, c-format -msgid "text search dictionary with OID %u does not exist" -msgstr "le dictionnaire de recherche plein texte d'OID %u n'existe pas" - -#: catalog/aclchk.c:5494 -#, c-format -msgid "text search configuration with OID %u does not exist" -msgstr "la configuration de recherche plein texte d'OID %u n'existe pas" - -#: catalog/aclchk.c:5575 commands/event_trigger.c:453 -#, c-format -msgid "event trigger with OID %u does not exist" -msgstr "le trigger sur événement d'OID %u n'existe pas" - -#: catalog/aclchk.c:5628 commands/collationcmds.c:439 -#, c-format -msgid "collation with OID %u does not exist" -msgstr "le collationnement d'OID %u n'existe pas" - -#: catalog/aclchk.c:5654 -#, c-format -msgid "conversion with OID %u does not exist" -msgstr "la conversion d'OID %u n'existe pas" - -#: catalog/aclchk.c:5695 -#, c-format -msgid "extension with OID %u does not exist" -msgstr "l'extension d'OID %u n'existe pas" - -#: catalog/aclchk.c:5722 commands/publicationcmds.c:1999 -#, c-format -msgid "publication with OID %u does not exist" -msgstr "la publication d'OID %u n'existe pas" - -#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1742 -#, c-format -msgid "subscription with OID %u does not exist" -msgstr "la souscription d'OID %u n'existe pas" - -#: catalog/aclchk.c:5774 -#, c-format -msgid "statistics object with OID %u does not exist" -msgstr "l'objet statistique d'OID %u n'existe pas" - -#: catalog/catalog.c:447 +#: catalog/catalog.c:449 #, c-format msgid "still searching for an unused OID in relation \"%s\"" msgstr "recherche toujours un OID inutilisé dans la relation « %s »" -#: catalog/catalog.c:449 +#: catalog/catalog.c:451 #, c-format msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." msgstr[0] "Les candidats OID ont été vérifiés %llu fois, mais aucun OID inutilisé n'a encore été trouvé." msgstr[1] "Les candidats OID ont été vérifiés %llu fois, mais aucun OID inutilisé n'a encore été trouvé." -#: catalog/catalog.c:474 +#: catalog/catalog.c:476 #, c-format msgid "new OID has been assigned in relation \"%s\" after %llu retry" msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" msgstr[0] "le nouvel OID a été affecté à la relation « %s » après %llu tentative" msgstr[1] "le nouvel OID a été affecté à la relation « %s » après %llu tentatives" -#: catalog/catalog.c:605 catalog/catalog.c:672 +#: catalog/catalog.c:609 catalog/catalog.c:676 #, c-format msgid "must be superuser to call %s()" msgstr "doit être super-utilisateur pour appeler %s()" -#: catalog/catalog.c:614 +#: catalog/catalog.c:618 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() ne peut être utilisé que pour les catalogues système" -#: catalog/catalog.c:619 parser/parse_utilcmd.c:2279 +#: catalog/catalog.c:623 parser/parse_utilcmd.c:2264 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "l'index « %s » n'appartient pas à la table « %s »" -#: catalog/catalog.c:636 +#: catalog/catalog.c:640 #, c-format msgid "column \"%s\" is not of type oid" msgstr "la colonne « %s » n'est pas de type oid" -#: catalog/catalog.c:643 +#: catalog/catalog.c:647 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "l'index « %s » n'est pas un index de la colonne « %s »" -#: catalog/dependency.c:538 catalog/pg_shdepend.c:657 +#: catalog/dependency.c:546 catalog/pg_shdepend.c:658 #, c-format msgid "cannot drop %s because it is required by the database system" msgstr "n'a pas pu supprimer %s car il est requis par le système de bases de données" -#: catalog/dependency.c:830 catalog/dependency.c:1057 +#: catalog/dependency.c:838 catalog/dependency.c:1065 #, c-format msgid "cannot drop %s because %s requires it" msgstr "n'a pas pu supprimer %s car il est requis par %s" -#: catalog/dependency.c:832 catalog/dependency.c:1059 +#: catalog/dependency.c:840 catalog/dependency.c:1067 #, c-format msgid "You can drop %s instead." msgstr "Vous pouvez supprimer %s à la place." -#: catalog/dependency.c:1138 catalog/dependency.c:1147 +#: catalog/dependency.c:1146 catalog/dependency.c:1155 #, c-format msgid "%s depends on %s" msgstr "%s dépend de %s" -#: catalog/dependency.c:1162 catalog/dependency.c:1171 +#: catalog/dependency.c:1170 catalog/dependency.c:1179 #, c-format msgid "drop cascades to %s" msgstr "DROP cascade sur %s" -#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 +#: catalog/dependency.c:1187 catalog/pg_shdepend.c:823 #, c-format msgid "" "\n" @@ -4571,47 +4577,48 @@ msgstr[1] "" "\n" "et %d autres objets (voir le journal applicatif du serveur pour une liste)" -#: catalog/dependency.c:1191 +#: catalog/dependency.c:1199 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "n'a pas pu supprimer %s car d'autres objets en dépendent" -#: catalog/dependency.c:1194 catalog/dependency.c:1201 -#: catalog/dependency.c:1212 commands/tablecmds.c:1328 -#: commands/tablecmds.c:14314 commands/tablespace.c:476 commands/user.c:1008 -#: commands/view.c:522 libpq/auth.c:329 replication/syncrep.c:1043 -#: storage/lmgr/deadlock.c:1152 storage/lmgr/proc.c:1413 utils/misc/guc.c:7402 -#: utils/misc/guc.c:7438 utils/misc/guc.c:7508 utils/misc/guc.c:11864 -#: utils/misc/guc.c:11898 utils/misc/guc.c:11932 utils/misc/guc.c:11975 -#: utils/misc/guc.c:12017 +#: catalog/dependency.c:1202 catalog/dependency.c:1209 +#: catalog/dependency.c:1220 commands/tablecmds.c:1335 +#: commands/tablecmds.c:14392 commands/tablespace.c:466 commands/user.c:1309 +#: commands/vacuum.c:211 commands/view.c:446 libpq/auth.c:326 +#: replication/logical/applyparallelworker.c:1044 replication/syncrep.c:1017 +#: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1366 utils/misc/guc.c:3120 +#: utils/misc/guc.c:3156 utils/misc/guc.c:3226 utils/misc/guc.c:6615 +#: utils/misc/guc.c:6649 utils/misc/guc.c:6683 utils/misc/guc.c:6726 +#: utils/misc/guc.c:6768 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1195 catalog/dependency.c:1202 +#: catalog/dependency.c:1203 catalog/dependency.c:1210 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Utilisez DROP ... CASCADE pour supprimer aussi les objets dépendants." -#: catalog/dependency.c:1199 +#: catalog/dependency.c:1207 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "ne peut pas supprimer les objets désirés car d'autres objets en dépendent" -#: catalog/dependency.c:1207 +#: catalog/dependency.c:1215 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" msgstr[0] "DROP cascade sur %d autre objet" msgstr[1] "DROP cascade sur %d autres objets" -#: catalog/dependency.c:1889 +#: catalog/dependency.c:1899 #, c-format msgid "constant of the type %s cannot be used here" msgstr "la constante de type %s ne peut pas être utilisée ici" -#: catalog/dependency.c:2410 parser/parse_relation.c:3369 -#: parser/parse_relation.c:3379 +#: catalog/dependency.c:2420 parser/parse_relation.c:3404 +#: parser/parse_relation.c:3414 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "la colonne %d de la relation « %s » n'existe pas" @@ -4626,13 +4633,13 @@ msgstr "droit refusé pour créer « %s.%s »" msgid "System catalog modifications are currently disallowed." msgstr "Les modifications du catalogue système sont actuellement interdites." -#: catalog/heap.c:466 commands/tablecmds.c:2348 commands/tablecmds.c:2985 -#: commands/tablecmds.c:6821 +#: catalog/heap.c:466 commands/tablecmds.c:2374 commands/tablecmds.c:3047 +#: commands/tablecmds.c:6922 #, c-format msgid "tables can have at most %d columns" msgstr "les tables peuvent avoir au plus %d colonnes" -#: catalog/heap.c:484 commands/tablecmds.c:7121 +#: catalog/heap.c:484 commands/tablecmds.c:7229 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "le nom de la colonne « %s » entre en conflit avec le nom d'une colonne système" @@ -4669,16 +4676,16 @@ msgstr "aucun collationnement n'a été dérivé pour la colonne « %s » sur la msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "aucun collationnement n'a été dérivé pour la colonne « %s » de type collationnable %s" -#: catalog/heap.c:1148 catalog/index.c:874 commands/createas.c:408 -#: commands/tablecmds.c:3890 +#: catalog/heap.c:1148 catalog/index.c:887 commands/createas.c:408 +#: commands/tablecmds.c:3987 #, c-format msgid "relation \"%s\" already exists" msgstr "la relation « %s » existe déjà" -#: catalog/heap.c:1164 catalog/pg_type.c:436 catalog/pg_type.c:784 -#: catalog/pg_type.c:931 commands/typecmds.c:249 commands/typecmds.c:261 +#: catalog/heap.c:1164 catalog/pg_type.c:434 catalog/pg_type.c:782 +#: catalog/pg_type.c:954 commands/typecmds.c:249 commands/typecmds.c:261 #: commands/typecmds.c:754 commands/typecmds.c:1169 commands/typecmds.c:1395 -#: commands/typecmds.c:1575 commands/typecmds.c:2547 +#: commands/typecmds.c:1575 commands/typecmds.c:2546 #, c-format msgid "type \"%s\" already exists" msgstr "le type « %s » existe déjà" @@ -4691,7 +4698,7 @@ msgstr "Une relation a un type associé du même nom, donc vous devez utiliser u #: catalog/heap.c:1205 #, fuzzy, c-format #| msgid "pg_class index OID value not set when in binary upgrade mode" -msgid "toast relfilenode value not set when in binary upgrade mode" +msgid "toast relfilenumber value not set when in binary upgrade mode" msgstr "OID de l'index de pg_class non configuré en mode de mise à jour binaire" #: catalog/heap.c:1216 @@ -4702,572 +4709,593 @@ msgstr "OID du heap de pg_class non configuré en mode de mise à jour binaire" #: catalog/heap.c:1226 #, fuzzy, c-format #| msgid "pg_class index OID value not set when in binary upgrade mode" -msgid "relfilenode value not set when in binary upgrade mode" +msgid "relfilenumber value not set when in binary upgrade mode" msgstr "OID de l'index de pg_class non configuré en mode de mise à jour binaire" -#: catalog/heap.c:2127 +#: catalog/heap.c:2119 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "ne peut pas ajouter une contrainte NO INHERIT pour la table partitionnée « %s »" -#: catalog/heap.c:2401 +#: catalog/heap.c:2393 #, c-format msgid "check constraint \"%s\" already exists" msgstr "la contrainte de vérification « %s » existe déjà" -#: catalog/heap.c:2571 catalog/index.c:888 catalog/pg_constraint.c:689 -#: commands/tablecmds.c:8823 +#: catalog/heap.c:2563 catalog/index.c:901 catalog/pg_constraint.c:682 +#: commands/tablecmds.c:8904 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "la contrainte « %s » de la relation « %s » existe déjà" -#: catalog/heap.c:2578 +#: catalog/heap.c:2570 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" -msgstr "la contrainte « %s » entre en conflit avec la constrainte non héritée sur la relation « %s »" +msgstr "la contrainte « %s » entre en conflit avec la contrainte non héritée sur la relation « %s »" -#: catalog/heap.c:2589 +#: catalog/heap.c:2581 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "la contrainte « %s » entre en conflit avec une contrainte héritée sur la relation « %s »" -#: catalog/heap.c:2599 +#: catalog/heap.c:2591 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "la contrainte « %s » entre en conflit avec une contrainte NOT VALID sur la relation « %s »" -#: catalog/heap.c:2604 +#: catalog/heap.c:2596 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "assemblage de la contrainte « %s » avec une définition héritée" -#: catalog/heap.c:2709 +#: catalog/heap.c:2622 catalog/pg_constraint.c:811 commands/tablecmds.c:2672 +#: commands/tablecmds.c:3199 commands/tablecmds.c:6858 +#: commands/tablecmds.c:15214 commands/tablecmds.c:15355 +#, fuzzy, c-format +#| msgid "too many range table entries" +msgid "too many inheritance parents" +msgstr "trop d'enregistrements dans la table range" + +#: catalog/heap.c:2706 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "ne peut pas utiliser la colonne générée « %s » dans une expression de génération de colonne" -#: catalog/heap.c:2711 +#: catalog/heap.c:2708 #, c-format msgid "A generated column cannot reference another generated column." msgstr "Une colonne générée ne peut référencer une autre colonne générée." -#: catalog/heap.c:2717 +#: catalog/heap.c:2714 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "ne peut pas utiliser une variable de ligne dans l'expression de génération d'une colonne" -#: catalog/heap.c:2718 +#: catalog/heap.c:2715 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "Ceci ferait que la colonne générée dépendrait de sa propre valeur." -#: catalog/heap.c:2771 +#: catalog/heap.c:2768 #, c-format msgid "generation expression is not immutable" msgstr "l'expression de génération n'est pas immuable" -#: catalog/heap.c:2799 rewrite/rewriteHandler.c:1273 +#: catalog/heap.c:2796 rewrite/rewriteHandler.c:1297 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "la colonne « %s » est de type %s alors que l'expression par défaut est de type %s" -#: catalog/heap.c:2804 commands/prepare.c:334 parser/analyze.c:2692 -#: parser/parse_target.c:594 parser/parse_target.c:882 -#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1278 +#: catalog/heap.c:2801 commands/prepare.c:334 parser/analyze.c:2742 +#: parser/parse_target.c:593 parser/parse_target.c:874 +#: parser/parse_target.c:884 rewrite/rewriteHandler.c:1302 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Vous devez réécrire l'expression ou lui appliquer une transformation de type." -#: catalog/heap.c:2851 +#: catalog/heap.c:2848 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "seule la table « %s » peut être référencée dans la contrainte de vérification" -#: catalog/heap.c:3149 +#: catalog/heap.c:3154 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "combinaison ON COMMIT et clé étrangère non supportée" -#: catalog/heap.c:3150 +#: catalog/heap.c:3155 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "" "La table « %s » référence « %s » mais elles n'ont pas la même valeur pour le\n" "paramètre ON COMMIT." -#: catalog/heap.c:3155 +#: catalog/heap.c:3160 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "ne peut pas tronquer une table référencée dans une contrainte de clé étrangère" -#: catalog/heap.c:3156 +#: catalog/heap.c:3161 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "La table « %s » référence « %s »." -#: catalog/heap.c:3158 +#: catalog/heap.c:3163 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Tronquez la table « %s » en même temps, ou utilisez TRUNCATE ... CASCADE." -#: catalog/index.c:223 parser/parse_utilcmd.c:2184 +#: catalog/index.c:225 parser/parse_utilcmd.c:2170 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "les clés primaires multiples ne sont pas autorisées pour la table « %s »" -#: catalog/index.c:241 +#: catalog/index.c:239 +#, fuzzy, c-format +#| msgid "primary keys cannot be expressions" +msgid "primary keys cannot use NULLS NOT DISTINCT indexes" +msgstr "les clés primaires ne peuvent pas être des expressions" + +#: catalog/index.c:256 #, c-format msgid "primary keys cannot be expressions" msgstr "les clés primaires ne peuvent pas être des expressions" -#: catalog/index.c:258 +#: catalog/index.c:273 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "la colonne de clé primaire « %s » n'est pas marquée NOT NULL" -#: catalog/index.c:773 catalog/index.c:1932 +#: catalog/index.c:786 catalog/index.c:1942 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "les index définis par l'utilisateur sur les tables du catalogue système ne sont pas supportés" -#: catalog/index.c:813 +#: catalog/index.c:826 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "les collationnements non-déterministes ne sont pas supportés pour la classe d'opérateurs « %s »" -#: catalog/index.c:828 +#: catalog/index.c:841 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "" "la création en parallèle d'un index sur les tables du catalogue système\n" "n'est pas supportée" -#: catalog/index.c:837 catalog/index.c:1305 +#: catalog/index.c:850 catalog/index.c:1318 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "la création de manière concurrente d'un index pour les contraintes d'exclusion n'est pas supportée" -#: catalog/index.c:846 +#: catalog/index.c:859 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "les index partagés ne peuvent pas être créés après initdb" -#: catalog/index.c:866 commands/createas.c:423 commands/sequence.c:158 -#: parser/parse_utilcmd.c:211 +#: catalog/index.c:879 commands/createas.c:423 commands/sequence.c:158 +#: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "la relation « %s » existe déjà, poursuite du traitement" -#: catalog/index.c:916 +#: catalog/index.c:929 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "OID de l'index de pg_class non configuré en mode de mise à jour binaire" -#: catalog/index.c:926 utils/cache/relcache.c:3743 +#: catalog/index.c:939 utils/cache/relcache.c:3731 #, fuzzy, c-format #| msgid "pg_class index OID value not set when in binary upgrade mode" -msgid "index relfilenode value not set when in binary upgrade mode" +msgid "index relfilenumber value not set when in binary upgrade mode" msgstr "OID de l'index de pg_class non configuré en mode de mise à jour binaire" -#: catalog/index.c:2231 +#: catalog/index.c:2241 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY doit être la première action dans une transaction" -#: catalog/index.c:3635 +#: catalog/index.c:3658 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "ne peut pas ré-indexer les tables temporaires des autres sessions" -#: catalog/index.c:3646 commands/indexcmds.c:3543 +#: catalog/index.c:3669 commands/indexcmds.c:3631 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "ne peut pas réindexer un index invalide sur une table TOAST" -#: catalog/index.c:3662 commands/indexcmds.c:3423 commands/indexcmds.c:3567 -#: commands/tablecmds.c:3305 +#: catalog/index.c:3685 commands/indexcmds.c:3511 commands/indexcmds.c:3655 +#: commands/tablecmds.c:3402 #, c-format msgid "cannot move system relation \"%s\"" msgstr "ne peut pas déplacer la colonne système « %s »" -#: catalog/index.c:3806 +#: catalog/index.c:3829 #, c-format msgid "index \"%s\" was reindexed" msgstr "l'index « %s » a été réindexée" -#: catalog/index.c:3943 +#: catalog/index.c:3966 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "ne peut pas réindexer l'index invalide « %s.%s » sur une table TOAST, ignoré" -#: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 +#: catalog/namespace.c:260 catalog/namespace.c:464 catalog/namespace.c:556 #: commands/trigger.c:5718 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "les références entre bases de données ne sont pas implémentées : « %s.%s.%s »" -#: catalog/namespace.c:316 +#: catalog/namespace.c:317 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "les tables temporaires ne peuvent pas spécifier un nom de schéma" -#: catalog/namespace.c:397 +#: catalog/namespace.c:398 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" msgstr "n'a pas pu obtenir un verrou sur la relation « %s.%s »" -#: catalog/namespace.c:402 commands/lockcmds.c:144 commands/lockcmds.c:233 +#: catalog/namespace.c:403 commands/lockcmds.c:144 commands/lockcmds.c:224 #, c-format msgid "could not obtain lock on relation \"%s\"" msgstr "n'a pas pu obtenir un verrou sur la relation « %s »" -#: catalog/namespace.c:430 parser/parse_relation.c:1373 +#: catalog/namespace.c:431 parser/parse_relation.c:1430 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "la relation « %s.%s » n'existe pas" -#: catalog/namespace.c:435 parser/parse_relation.c:1386 -#: parser/parse_relation.c:1394 +#: catalog/namespace.c:436 parser/parse_relation.c:1443 +#: parser/parse_relation.c:1451 utils/adt/regproc.c:913 #, c-format msgid "relation \"%s\" does not exist" msgstr "la relation « %s » n'existe pas" -#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1535 -#: commands/extension.c:1541 +#: catalog/namespace.c:502 catalog/namespace.c:3073 commands/extension.c:1611 +#: commands/extension.c:1617 #, c-format msgid "no schema has been selected to create in" msgstr "aucun schéma n'a été sélectionné pour cette création" -#: catalog/namespace.c:653 catalog/namespace.c:666 +#: catalog/namespace.c:654 catalog/namespace.c:667 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "ne peut pas créer les relations dans les schémas temporaires d'autres sessions" -#: catalog/namespace.c:657 +#: catalog/namespace.c:658 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "ne peut pas créer une relation temporaire dans un schéma non temporaire" -#: catalog/namespace.c:672 +#: catalog/namespace.c:673 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "seules les relations temporaires peuvent être créées dans des schémas temporaires" -#: catalog/namespace.c:2268 +#: catalog/namespace.c:2265 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "l'objet statistique « %s » n'existe pas" -#: catalog/namespace.c:2391 +#: catalog/namespace.c:2388 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "l'analyseur de recherche plein texte « %s » n'existe pas" -#: catalog/namespace.c:2517 +#: catalog/namespace.c:2514 utils/adt/regproc.c:1439 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "le dictionnaire de recherche plein texte « %s » n'existe pas" -#: catalog/namespace.c:2644 +#: catalog/namespace.c:2641 #, c-format msgid "text search template \"%s\" does not exist" msgstr "le modèle de recherche plein texte « %s » n'existe pas" -#: catalog/namespace.c:2770 commands/tsearchcmds.c:1121 -#: utils/cache/ts_cache.c:613 +#: catalog/namespace.c:2767 commands/tsearchcmds.c:1162 +#: utils/adt/regproc.c:1329 utils/cache/ts_cache.c:635 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "la configuration de recherche plein texte « %s » n'existe pas" -#: catalog/namespace.c:2883 parser/parse_expr.c:806 parser/parse_target.c:1255 +#: catalog/namespace.c:2880 parser/parse_expr.c:832 parser/parse_target.c:1246 #, c-format msgid "cross-database references are not implemented: %s" msgstr "les références entre bases de données ne sont pas implémentées : %s" -#: catalog/namespace.c:2889 gram.y:18258 gram.y:18298 parser/parse_expr.c:813 -#: parser/parse_target.c:1262 +#: catalog/namespace.c:2886 gram.y:18569 gram.y:18609 parser/parse_expr.c:839 +#: parser/parse_target.c:1253 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s" -#: catalog/namespace.c:3019 +#: catalog/namespace.c:3016 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "ne peut pas déplacer les objets dans ou à partir des schémas temporaires" -#: catalog/namespace.c:3025 +#: catalog/namespace.c:3022 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "ne peut pas déplacer les objets dans ou à partir des schémas TOAST" -#: catalog/namespace.c:3098 commands/schemacmds.c:245 commands/schemacmds.c:325 -#: commands/tablecmds.c:1273 +#: catalog/namespace.c:3095 commands/schemacmds.c:264 commands/schemacmds.c:344 +#: commands/tablecmds.c:1280 utils/adt/regproc.c:1668 #, c-format msgid "schema \"%s\" does not exist" msgstr "le schéma « %s » n'existe pas" -#: catalog/namespace.c:3129 +#: catalog/namespace.c:3126 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "nom de relation incorrecte (trop de points entre les noms) : %s" -#: catalog/namespace.c:3692 +#: catalog/namespace.c:3693 utils/adt/regproc.c:1056 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "le collationnement « %s » pour l'encodage « %s » n'existe pas" -#: catalog/namespace.c:3747 +#: catalog/namespace.c:3748 #, c-format msgid "conversion \"%s\" does not exist" msgstr "la conversion « %s » n'existe pas" -#: catalog/namespace.c:4011 +#: catalog/namespace.c:4012 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "droit refusé pour la création de tables temporaires dans la base de données « %s »" -#: catalog/namespace.c:4027 +#: catalog/namespace.c:4028 #, c-format msgid "cannot create temporary tables during recovery" msgstr "ne peut pas créer des tables temporaires lors de la restauration" -#: catalog/namespace.c:4033 +#: catalog/namespace.c:4034 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "ne peut pas créer de tables temporaires pendant une opération parallèle" -#: catalog/namespace.c:4334 commands/tablespace.c:1236 commands/variable.c:64 -#: utils/misc/guc.c:12049 utils/misc/guc.c:12151 -#, c-format -msgid "List syntax is invalid." -msgstr "La syntaxe de la liste est invalide." - -#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 -#: commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 -#: commands/tablecmds.c:12284 +#: catalog/objectaddress.c:1409 commands/policy.c:96 commands/policy.c:376 +#: commands/tablecmds.c:248 commands/tablecmds.c:290 commands/tablecmds.c:2206 +#: commands/tablecmds.c:12361 #, c-format msgid "\"%s\" is not a table" msgstr "« %s » n'est pas une table" -#: catalog/objectaddress.c:1398 commands/tablecmds.c:259 -#: commands/tablecmds.c:17109 commands/view.c:119 +#: catalog/objectaddress.c:1416 commands/tablecmds.c:260 +#: commands/tablecmds.c:17155 commands/view.c:119 #, c-format msgid "\"%s\" is not a view" msgstr "« %s » n'est pas une vue" -#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:265 -#: commands/tablecmds.c:17114 +#: catalog/objectaddress.c:1423 commands/matview.c:186 commands/tablecmds.c:266 +#: commands/tablecmds.c:17160 #, c-format msgid "\"%s\" is not a materialized view" msgstr "« %s » n'est pas une vue matérialisée" -#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 -#: commands/tablecmds.c:17119 +#: catalog/objectaddress.c:1430 commands/tablecmds.c:284 +#: commands/tablecmds.c:17165 #, c-format msgid "\"%s\" is not a foreign table" msgstr "« %s » n'est pas une table distante" -#: catalog/objectaddress.c:1453 +#: catalog/objectaddress.c:1471 #, c-format msgid "must specify relation and object name" msgstr "doit indiquer les noms de relation et d'objet" -#: catalog/objectaddress.c:1529 catalog/objectaddress.c:1582 +#: catalog/objectaddress.c:1547 catalog/objectaddress.c:1600 #, c-format msgid "column name must be qualified" msgstr "le nom de la colonne doit être qualifié" -#: catalog/objectaddress.c:1601 +#: catalog/objectaddress.c:1619 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "la valeur par défaut de la colonne « %s » de la relation « %s » n'existe pas" -#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 -#: commands/tablecmds.c:275 commands/typecmds.c:274 commands/typecmds.c:3700 -#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:795 -#: utils/adt/acl.c:4434 +#: catalog/objectaddress.c:1656 commands/functioncmds.c:137 +#: commands/tablecmds.c:276 commands/typecmds.c:274 commands/typecmds.c:3691 +#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 +#: utils/adt/acl.c:4441 #, c-format msgid "type \"%s\" does not exist" msgstr "le type « %s » n'existe pas" -#: catalog/objectaddress.c:1757 +#: catalog/objectaddress.c:1775 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "l'opérateur %d (%s, %s) de %s n'existe pas" -#: catalog/objectaddress.c:1788 +#: catalog/objectaddress.c:1806 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "la fonction %d (%s, %s) de %s n'existe pas" -#: catalog/objectaddress.c:1839 catalog/objectaddress.c:1865 +#: catalog/objectaddress.c:1857 catalog/objectaddress.c:1883 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "la correspondance pour l'utilisateur « %s » sur le serveur « %s » n'existe pas" -#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:691 +#: catalog/objectaddress.c:1872 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:700 #, c-format msgid "server \"%s\" does not exist" msgstr "le serveur « %s » n'existe pas" -#: catalog/objectaddress.c:1921 +#: catalog/objectaddress.c:1939 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "la relation de publication « %s » dans la publication « %s » n'existe pas" -#: catalog/objectaddress.c:1968 +#: catalog/objectaddress.c:1986 #, c-format msgid "publication schema \"%s\" in publication \"%s\" does not exist" msgstr "le schéma de publication « %s » dans la publication « %s » n'existe pas" -#: catalog/objectaddress.c:2026 +#: catalog/objectaddress.c:2044 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "type d'objet de droits par défaut non reconnu « %c »" -#: catalog/objectaddress.c:2027 +#: catalog/objectaddress.c:2045 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "Les types d'objet valides sont « %c », « %c », « %c », « %c », « %c »." -#: catalog/objectaddress.c:2078 +#: catalog/objectaddress.c:2096 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "le droit par défaut pour l'utilisateur « %s » dans le schéma « %s » de %s n'existe pas" -#: catalog/objectaddress.c:2083 +#: catalog/objectaddress.c:2101 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "le droit par défaut pour l'utilisateur « %s » sur %s n'existe pas" -#: catalog/objectaddress.c:2110 catalog/objectaddress.c:2168 -#: catalog/objectaddress.c:2225 +#: catalog/objectaddress.c:2127 catalog/objectaddress.c:2184 +#: catalog/objectaddress.c:2239 #, c-format msgid "name or argument lists may not contain nulls" msgstr "le nom ou les listes d'arguments ne peuvent pas contenir de valeurs NULL" -#: catalog/objectaddress.c:2144 +#: catalog/objectaddress.c:2161 #, c-format msgid "unsupported object type \"%s\"" msgstr "type d'objet « %s » non supporté" -#: catalog/objectaddress.c:2164 catalog/objectaddress.c:2182 -#: catalog/objectaddress.c:2247 catalog/objectaddress.c:2331 +#: catalog/objectaddress.c:2180 catalog/objectaddress.c:2197 +#: catalog/objectaddress.c:2262 catalog/objectaddress.c:2346 #, c-format msgid "name list length must be exactly %d" msgstr "la liste de nom doit être exactement de longueur %d" -#: catalog/objectaddress.c:2186 +#: catalog/objectaddress.c:2201 #, c-format msgid "large object OID may not be null" msgstr "l'OID du Large Object peut ne pas être NULL" -#: catalog/objectaddress.c:2195 catalog/objectaddress.c:2265 -#: catalog/objectaddress.c:2272 +#: catalog/objectaddress.c:2210 catalog/objectaddress.c:2280 +#: catalog/objectaddress.c:2287 #, c-format msgid "name list length must be at least %d" msgstr "la longueur de la liste de nom doit au moins être %d" -#: catalog/objectaddress.c:2258 catalog/objectaddress.c:2279 +#: catalog/objectaddress.c:2273 catalog/objectaddress.c:2294 #, c-format msgid "argument list length must be exactly %d" msgstr "la longueur de la liste d'arguments doit être %d exactement" -#: catalog/objectaddress.c:2533 libpq/be-fsstubs.c:318 +#: catalog/objectaddress.c:2508 libpq/be-fsstubs.c:329 #, c-format msgid "must be owner of large object %u" msgstr "doit être le propriétaire du Large Object %u" -#: catalog/objectaddress.c:2548 commands/functioncmds.c:1566 +#: catalog/objectaddress.c:2523 commands/functioncmds.c:1561 #, c-format msgid "must be owner of type %s or type %s" msgstr "doit être le propriétaire du type %s ou du type %s" -#: catalog/objectaddress.c:2598 catalog/objectaddress.c:2616 +#: catalog/objectaddress.c:2550 catalog/objectaddress.c:2559 +#: catalog/objectaddress.c:2565 #, c-format -msgid "must be superuser" -msgstr "doit être super-utilisateur" +msgid "permission denied" +msgstr "droit refusé" + +#: catalog/objectaddress.c:2551 catalog/objectaddress.c:2560 +#, fuzzy, c-format +#| msgid "composite type must have at least one attribute" +msgid "The current user must have the %s attribute." +msgstr "le type composite doit avoir au moins un attribut" -#: catalog/objectaddress.c:2605 +#: catalog/objectaddress.c:2566 +#, fuzzy, c-format +#| msgid "must have admin option on role \"%s\"" +msgid "The current user must have the %s option on role \"%s\"." +msgstr "doit avoir l'option admin sur le rôle « %s »" + +#: catalog/objectaddress.c:2580 #, c-format -msgid "must have CREATEROLE privilege" -msgstr "doit avoir l'attribut CREATEROLE" +msgid "must be superuser" +msgstr "doit être super-utilisateur" -#: catalog/objectaddress.c:2686 +#: catalog/objectaddress.c:2649 #, c-format msgid "unrecognized object type \"%s\"" msgstr "type d'objet non reconnu « %s »" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2978 +#: catalog/objectaddress.c:2941 #, c-format msgid "column %s of %s" msgstr "colonne %s de %s" -#: catalog/objectaddress.c:2993 +#: catalog/objectaddress.c:2956 #, c-format msgid "function %s" msgstr "fonction %s" -#: catalog/objectaddress.c:3006 +#: catalog/objectaddress.c:2969 #, c-format msgid "type %s" msgstr "type %s" -#: catalog/objectaddress.c:3043 +#: catalog/objectaddress.c:3006 #, c-format msgid "cast from %s to %s" msgstr "conversion de %s en %s" -#: catalog/objectaddress.c:3076 +#: catalog/objectaddress.c:3039 #, c-format msgid "collation %s" msgstr "collationnement %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3107 +#: catalog/objectaddress.c:3070 #, c-format msgid "constraint %s on %s" msgstr "contrainte %s sur %s" -#: catalog/objectaddress.c:3113 +#: catalog/objectaddress.c:3076 #, c-format msgid "constraint %s" msgstr "contrainte %s" -#: catalog/objectaddress.c:3145 +#: catalog/objectaddress.c:3108 #, c-format msgid "conversion %s" msgstr "conversion %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3167 +#: catalog/objectaddress.c:3130 #, c-format msgid "default value for %s" msgstr "valeur par défaut pour %s" -#: catalog/objectaddress.c:3178 +#: catalog/objectaddress.c:3141 #, c-format msgid "language %s" msgstr "langage %s" -#: catalog/objectaddress.c:3186 +#: catalog/objectaddress.c:3149 #, c-format msgid "large object %u" msgstr "« Large Object » %u" -#: catalog/objectaddress.c:3199 +#: catalog/objectaddress.c:3162 #, c-format msgid "operator %s" msgstr "opérateur %s" -#: catalog/objectaddress.c:3236 +#: catalog/objectaddress.c:3199 #, c-format msgid "operator class %s for access method %s" msgstr "classe d'opérateur %s pour la méthode d'accès %s" -#: catalog/objectaddress.c:3264 +#: catalog/objectaddress.c:3227 #, c-format msgid "access method %s" msgstr "méthode d'accès %s" @@ -5276,7 +5304,7 @@ msgstr "méthode d'accès %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3313 +#: catalog/objectaddress.c:3276 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "opérateur %d (%s, %s) de %s : %s" @@ -5285,231 +5313,237 @@ msgstr "opérateur %d (%s, %s) de %s : %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3370 +#: catalog/objectaddress.c:3333 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "fonction %d (%s, %s) de %s : %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3422 +#: catalog/objectaddress.c:3385 #, c-format msgid "rule %s on %s" msgstr "règle %s sur %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3468 +#: catalog/objectaddress.c:3431 #, c-format msgid "trigger %s on %s" msgstr "trigger %s sur %s" -#: catalog/objectaddress.c:3488 +#: catalog/objectaddress.c:3451 #, c-format msgid "schema %s" msgstr "schéma %s" -#: catalog/objectaddress.c:3516 +#: catalog/objectaddress.c:3479 #, c-format msgid "statistics object %s" msgstr "objet statistique %s" -#: catalog/objectaddress.c:3547 +#: catalog/objectaddress.c:3510 #, c-format msgid "text search parser %s" msgstr "analyseur %s de la recherche plein texte" -#: catalog/objectaddress.c:3578 +#: catalog/objectaddress.c:3541 #, c-format msgid "text search dictionary %s" msgstr "dictionnaire %s de la recherche plein texte" -#: catalog/objectaddress.c:3609 +#: catalog/objectaddress.c:3572 #, c-format msgid "text search template %s" msgstr "modèle %s de la recherche plein texte" -#: catalog/objectaddress.c:3640 +#: catalog/objectaddress.c:3603 #, c-format msgid "text search configuration %s" msgstr "configuration %s de recherche plein texte" -#: catalog/objectaddress.c:3653 +#: catalog/objectaddress.c:3616 #, c-format msgid "role %s" msgstr "rôle %s" -#: catalog/objectaddress.c:3669 +#: catalog/objectaddress.c:3653 catalog/objectaddress.c:5505 +#, fuzzy, c-format +#| msgid "removal of role \"%s\" failed: %s" +msgid "membership of role %s in role %s" +msgstr "la suppression du rôle « %s » a échoué : %s" + +#: catalog/objectaddress.c:3674 #, c-format msgid "database %s" msgstr "base de données %s" -#: catalog/objectaddress.c:3685 +#: catalog/objectaddress.c:3690 #, c-format msgid "tablespace %s" msgstr "tablespace %s" -#: catalog/objectaddress.c:3696 +#: catalog/objectaddress.c:3701 #, c-format msgid "foreign-data wrapper %s" msgstr "wrapper de données distantes %s" -#: catalog/objectaddress.c:3706 +#: catalog/objectaddress.c:3711 #, c-format msgid "server %s" msgstr "serveur %s" -#: catalog/objectaddress.c:3739 +#: catalog/objectaddress.c:3744 #, c-format msgid "user mapping for %s on server %s" msgstr "correspondance utilisateur pour %s sur le serveur %s" -#: catalog/objectaddress.c:3791 +#: catalog/objectaddress.c:3796 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "droits par défaut pour les nouvelles relations appartenant au rôle %s dans le schéma %s" -#: catalog/objectaddress.c:3795 +#: catalog/objectaddress.c:3800 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "droits par défaut pour les nouvelles relations appartenant au rôle %s" -#: catalog/objectaddress.c:3801 +#: catalog/objectaddress.c:3806 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "droits par défaut pour les nouvelles séquences appartenant au rôle %s dans le schéma %s" -#: catalog/objectaddress.c:3805 +#: catalog/objectaddress.c:3810 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "droits par défaut pour les nouvelles séquences appartenant au rôle %s" -#: catalog/objectaddress.c:3811 +#: catalog/objectaddress.c:3816 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "droits par défaut pour les nouvelles fonctions appartenant au rôle %s dans le schéma %s" -#: catalog/objectaddress.c:3815 +#: catalog/objectaddress.c:3820 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "droits par défaut pour les nouvelles fonctions appartenant au rôle %s" -#: catalog/objectaddress.c:3821 +#: catalog/objectaddress.c:3826 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "droits par défaut pour les nouveaux types appartenant au rôle %s dans le schéma %s" -#: catalog/objectaddress.c:3825 +#: catalog/objectaddress.c:3830 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "droits par défaut pour les nouveaux types appartenant au rôle %s" -#: catalog/objectaddress.c:3831 +#: catalog/objectaddress.c:3836 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "droits par défaut pour les nouveaux schémas appartenant au rôle %s" -#: catalog/objectaddress.c:3838 +#: catalog/objectaddress.c:3843 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "droits par défaut appartenant au rôle %s dans le schéma %s" -#: catalog/objectaddress.c:3842 +#: catalog/objectaddress.c:3847 #, c-format msgid "default privileges belonging to role %s" msgstr "droits par défaut appartenant au rôle %s" -#: catalog/objectaddress.c:3864 +#: catalog/objectaddress.c:3869 #, c-format msgid "extension %s" msgstr "extension %s" -#: catalog/objectaddress.c:3881 +#: catalog/objectaddress.c:3886 #, c-format msgid "event trigger %s" msgstr "trigger sur événement %s" -#: catalog/objectaddress.c:3908 +#: catalog/objectaddress.c:3910 #, c-format msgid "parameter %s" msgstr "paramètre %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3951 +#: catalog/objectaddress.c:3953 #, c-format msgid "policy %s on %s" msgstr "politique %s sur %s" -#: catalog/objectaddress.c:3965 +#: catalog/objectaddress.c:3967 #, c-format msgid "publication %s" msgstr "publication %s" -#: catalog/objectaddress.c:3978 +#: catalog/objectaddress.c:3980 #, c-format msgid "publication of schema %s in publication %s" msgstr "publication du schéma %s dans la publication %s" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:4009 +#: catalog/objectaddress.c:4011 #, c-format msgid "publication of %s in publication %s" msgstr "publication de %s dans la publication %s" -#: catalog/objectaddress.c:4022 +#: catalog/objectaddress.c:4024 #, c-format msgid "subscription %s" msgstr "souscription %s" -#: catalog/objectaddress.c:4043 +#: catalog/objectaddress.c:4045 #, c-format msgid "transform for %s language %s" msgstr "transformation pour %s langage %s" -#: catalog/objectaddress.c:4114 +#: catalog/objectaddress.c:4116 #, c-format msgid "table %s" msgstr "table %s" -#: catalog/objectaddress.c:4119 +#: catalog/objectaddress.c:4121 #, c-format msgid "index %s" msgstr "index %s" -#: catalog/objectaddress.c:4123 +#: catalog/objectaddress.c:4125 #, c-format msgid "sequence %s" msgstr "séquence %s" -#: catalog/objectaddress.c:4127 +#: catalog/objectaddress.c:4129 #, c-format msgid "toast table %s" msgstr "table TOAST %s" -#: catalog/objectaddress.c:4131 +#: catalog/objectaddress.c:4133 #, c-format msgid "view %s" msgstr "vue %s" -#: catalog/objectaddress.c:4135 +#: catalog/objectaddress.c:4137 #, c-format msgid "materialized view %s" msgstr "vue matérialisée %s" -#: catalog/objectaddress.c:4139 +#: catalog/objectaddress.c:4141 #, c-format msgid "composite type %s" msgstr "type composite %s" -#: catalog/objectaddress.c:4143 +#: catalog/objectaddress.c:4145 #, c-format msgid "foreign table %s" msgstr "table distante %s" -#: catalog/objectaddress.c:4148 +#: catalog/objectaddress.c:4150 #, c-format msgid "relation %s" msgstr "relation %s" -#: catalog/objectaddress.c:4189 +#: catalog/objectaddress.c:4191 #, c-format msgid "operator family %s for access method %s" msgstr "famille d'opérateur %s pour la méthode d'accès %s" @@ -5554,7 +5588,7 @@ msgstr "" msgid "return type of inverse transition function %s is not %s" msgstr "le type de retour de la fonction de transition inverse %s n'est pas %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2998 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3009 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "la fonction de transition d'agrégat en déplacement ne doit pas renvoyer null" @@ -5569,7 +5603,7 @@ msgstr "la fonction finale avec des arguments supplémentaires ne doit pas être msgid "return type of combine function %s is not %s" msgstr "le type de retour de la fonction de d'unification %s n'est pas %s" -#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3888 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3903 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "la fonction d'unification avec le type de transaction %s ne doit pas être déclaré STRICT" @@ -5597,7 +5631,7 @@ msgstr "utilisation non sûre des pseudo-types « INTERNAL »" #: catalog/pg_aggregate.c:567 #, c-format msgid "moving-aggregate implementation returns type %s, but plain implementation returns type %s" -msgstr "l'impémentation d'aggrégat glissant retourne le type %s, mais l'implémentation standard retourne le type %s" +msgstr "l'implémentation d'agrégat glissant retourne le type %s, mais l'implémentation standard retourne le type %s" #: catalog/pg_aggregate.c:578 #, c-format @@ -5629,13 +5663,13 @@ msgstr "« %s » est un agrégat d'ensemble hypothétique." msgid "cannot change number of direct arguments of an aggregate function" msgstr "ne peut pas changer le nombre d'arguments directs d'une fonction d'agrégation" -#: catalog/pg_aggregate.c:858 commands/functioncmds.c:695 -#: commands/typecmds.c:1976 commands/typecmds.c:2022 commands/typecmds.c:2074 -#: commands/typecmds.c:2111 commands/typecmds.c:2145 commands/typecmds.c:2179 -#: commands/typecmds.c:2213 commands/typecmds.c:2242 commands/typecmds.c:2329 -#: commands/typecmds.c:2371 parser/parse_func.c:417 parser/parse_func.c:448 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:691 +#: commands/typecmds.c:1975 commands/typecmds.c:2021 commands/typecmds.c:2073 +#: commands/typecmds.c:2110 commands/typecmds.c:2144 commands/typecmds.c:2178 +#: commands/typecmds.c:2212 commands/typecmds.c:2241 commands/typecmds.c:2328 +#: commands/typecmds.c:2370 parser/parse_func.c:417 parser/parse_func.c:448 #: parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 -#: parser/parse_func.c:631 parser/parse_func.c:2173 parser/parse_func.c:2446 +#: parser/parse_func.c:631 parser/parse_func.c:2171 parser/parse_func.c:2444 #, c-format msgid "function %s does not exist" msgstr "la fonction %s n'existe pas" @@ -5655,7 +5689,7 @@ msgstr "la fonction %s doit accepter VARIADIC ANY pour être utilisé dans cet a msgid "function %s requires run-time type coercion" msgstr "la fonction %s requiert une coercion sur le type à l'exécution" -#: catalog/pg_cast.c:68 +#: catalog/pg_cast.c:75 #, c-format msgid "cast from type %s to type %s already exists" msgstr "la conversion du type %s vers le type %s existe déjà" @@ -5710,37 +5744,37 @@ msgstr "Cette opération n'est pas disponible pour les tables partitionnées." msgid "This operation is not supported for partitioned indexes." msgstr "Cette opération n'est pas disponible pour les index partitionnés." -#: catalog/pg_collation.c:101 catalog/pg_collation.c:159 +#: catalog/pg_collation.c:102 catalog/pg_collation.c:160 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "le collationnement « %s » existe déjà, poursuite du traitement" -#: catalog/pg_collation.c:103 +#: catalog/pg_collation.c:104 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" msgstr "le collationnement « %s » pour l'encodage « %s » existe déjà, poursuite du traitement" -#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 +#: catalog/pg_collation.c:112 catalog/pg_collation.c:167 #, c-format msgid "collation \"%s\" already exists" msgstr "le collationnement « %s » existe déjà" -#: catalog/pg_collation.c:113 +#: catalog/pg_collation.c:114 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "le collationnement « %s » pour l'encodage « %s » existe déjà" -#: catalog/pg_constraint.c:697 +#: catalog/pg_constraint.c:690 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "la contrainte « %s » du domaine %s existe déjà" -#: catalog/pg_constraint.c:893 catalog/pg_constraint.c:986 +#: catalog/pg_constraint.c:890 catalog/pg_constraint.c:983 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "la contrainte « %s » de la table « %s » n'existe pas" -#: catalog/pg_constraint.c:1086 +#: catalog/pg_constraint.c:1083 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "la contrainte « %s » du domaine %s n'existe pas" @@ -5755,12 +5789,12 @@ msgstr "la conversion « %s » existe déjà" msgid "default conversion for %s to %s already exists" msgstr "la conversion par défaut de %s vers %s existe déjà" -#: catalog/pg_depend.c:222 commands/extension.c:3271 +#: catalog/pg_depend.c:222 commands/extension.c:3368 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s est déjà un membre de l'extension « %s »" -#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3311 +#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3408 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s n'est pas un membre de l'extension « %s »" @@ -5780,37 +5814,37 @@ msgstr "" msgid "cannot remove dependency on %s because it is a system object" msgstr "ne peut pas supprimer la dépendance sur %s car il s'agit d'un objet système" -#: catalog/pg_enum.c:128 catalog/pg_enum.c:230 catalog/pg_enum.c:525 +#: catalog/pg_enum.c:137 catalog/pg_enum.c:259 catalog/pg_enum.c:554 #, c-format msgid "invalid enum label \"%s\"" msgstr "nom du label enum « %s » invalide" -#: catalog/pg_enum.c:129 catalog/pg_enum.c:231 catalog/pg_enum.c:526 +#: catalog/pg_enum.c:138 catalog/pg_enum.c:260 catalog/pg_enum.c:555 #, c-format msgid "Labels must be %d bytes or less." msgstr "Les labels doivent avoir au plus %d caractères." -#: catalog/pg_enum.c:259 +#: catalog/pg_enum.c:288 #, c-format msgid "enum label \"%s\" already exists, skipping" msgstr "le label « %s » existe déjà, poursuite du traitement" -#: catalog/pg_enum.c:266 catalog/pg_enum.c:569 +#: catalog/pg_enum.c:295 catalog/pg_enum.c:598 #, c-format msgid "enum label \"%s\" already exists" msgstr "le label « %s » existe déjà" -#: catalog/pg_enum.c:321 catalog/pg_enum.c:564 +#: catalog/pg_enum.c:350 catalog/pg_enum.c:593 #, c-format msgid "\"%s\" is not an existing enum label" msgstr "« %s » n'est pas un label d'enum existant" -#: catalog/pg_enum.c:379 +#: catalog/pg_enum.c:408 #, c-format msgid "pg_enum OID value not set when in binary upgrade mode" msgstr "OID de pg_enum non configuré en mode de mise à jour binaire" -#: catalog/pg_enum.c:389 +#: catalog/pg_enum.c:418 #, c-format msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" msgstr "ALTER TYPE ADD BEFORE/AFTER est incompatible avec la mise à jour binaire" @@ -5825,8 +5859,8 @@ msgstr "ne peut pas détacher la partition « %s »" msgid "The partition is being detached concurrently or has an unfinished detach." msgstr "La partition est en cours de détachement ou à un détachement non terminé." -#: catalog/pg_inherits.c:596 commands/tablecmds.c:4488 -#: commands/tablecmds.c:15429 +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4583 +#: commands/tablecmds.c:15470 #, c-format msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." msgstr "Utiliser ALTER TABLE ... DETACH PARTITION ... FINALIZE pour terminer l'opération de détachement en attente." @@ -5841,7 +5875,7 @@ msgstr "ne peut pas terminer le détachement de la partition « %s »" msgid "There's no pending concurrent detach." msgstr "Il n'y a pas de détachement en attente." -#: catalog/pg_namespace.c:64 commands/schemacmds.c:254 +#: catalog/pg_namespace.c:64 commands/schemacmds.c:273 #, c-format msgid "schema \"%s\" already exists" msgstr "le schéma « %s » existe déjà" @@ -5856,7 +5890,7 @@ msgstr "« %s » n'est pas un nom d'opérateur valide" msgid "only binary operators can have commutators" msgstr "seuls les opérateurs binaires peuvent avoir des commutateurs" -#: catalog/pg_operator.c:374 commands/operatorcmds.c:507 +#: catalog/pg_operator.c:374 commands/operatorcmds.c:509 #, c-format msgid "only binary operators can have join selectivity" msgstr "seuls les opérateurs binaires peuvent avoir une sélectivité des jointures" @@ -5876,12 +5910,12 @@ msgstr "seuls les opérateurs binaires ont du hachage" msgid "only boolean operators can have negators" msgstr "seuls les opérateurs booléens peuvent avoir des négations" -#: catalog/pg_operator.c:397 commands/operatorcmds.c:515 +#: catalog/pg_operator.c:397 commands/operatorcmds.c:517 #, c-format msgid "only boolean operators can have restriction selectivity" msgstr "seuls les opérateurs booléens peuvent avoir une sélectivité des restrictions" -#: catalog/pg_operator.c:401 commands/operatorcmds.c:519 +#: catalog/pg_operator.c:401 commands/operatorcmds.c:521 #, c-format msgid "only boolean operators can have join selectivity" msgstr "seuls les opérateurs booléens peuvent avoir une sélectivité des jointures" @@ -5906,17 +5940,17 @@ msgstr "l'opérateur %s existe déjà" msgid "operator cannot be its own negator or sort operator" msgstr "l'opérateur ne peut pas être son propre opérateur de négation ou de tri" -#: catalog/pg_parameter_acl.c:52 +#: catalog/pg_parameter_acl.c:53 #, c-format msgid "parameter ACL \"%s\" does not exist" msgstr "le paramètre ACL « %s » n'existe pas" -#: catalog/pg_parameter_acl.c:87 +#: catalog/pg_parameter_acl.c:88 #, c-format msgid "invalid parameter name \"%s\"" msgstr "nom de paramètre « %s » invalide" -#: catalog/pg_proc.c:132 parser/parse_func.c:2235 +#: catalog/pg_proc.c:132 parser/parse_func.c:2233 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" @@ -5963,7 +5997,7 @@ msgstr "ne peut pas modifier le type de retour d'une fonction existante" #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE #: catalog/pg_proc.c:421 catalog/pg_proc.c:448 catalog/pg_proc.c:493 -#: catalog/pg_proc.c:519 catalog/pg_proc.c:545 +#: catalog/pg_proc.c:519 catalog/pg_proc.c:543 #, c-format msgid "Use %s %s first." msgstr "Utilisez tout d'abord %s %s." @@ -5985,103 +6019,97 @@ msgstr "" "ne peut pas supprimer les valeurs par défaut des paramètres de la\n" "fonction existante" -#: catalog/pg_proc.c:543 +#: catalog/pg_proc.c:541 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "" "ne peut pas modifier le type de données d'un paramètre avec une valeur\n" "par défaut" -#: catalog/pg_proc.c:757 +#: catalog/pg_proc.c:752 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "il n'existe pas de fonction intégrée nommée « %s »" -#: catalog/pg_proc.c:855 +#: catalog/pg_proc.c:845 #, c-format msgid "SQL functions cannot return type %s" msgstr "les fonctions SQL ne peuvent pas renvoyer un type %s" -#: catalog/pg_proc.c:870 +#: catalog/pg_proc.c:860 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "les fonctions SQL ne peuvent avoir d'arguments du type %s" -#: catalog/pg_proc.c:1000 executor/functions.c:1473 +#: catalog/pg_proc.c:987 executor/functions.c:1466 #, c-format msgid "SQL function \"%s\"" msgstr "Fonction SQL « %s »" -#: catalog/pg_publication.c:63 catalog/pg_publication.c:71 -#: catalog/pg_publication.c:79 catalog/pg_publication.c:85 +#: catalog/pg_publication.c:71 catalog/pg_publication.c:79 +#: catalog/pg_publication.c:87 catalog/pg_publication.c:93 #, c-format msgid "cannot add relation \"%s\" to publication" msgstr "ne peut pas ajouter la relation « %s » à la publication" -#: catalog/pg_publication.c:73 +#: catalog/pg_publication.c:81 #, c-format msgid "This operation is not supported for system tables." msgstr "Cette opération n'est pas disponible pour les tables systèmes." -#: catalog/pg_publication.c:81 +#: catalog/pg_publication.c:89 #, c-format msgid "This operation is not supported for temporary tables." msgstr "Cette opération n'est pas disponible pour les tables temporaires." -#: catalog/pg_publication.c:87 +#: catalog/pg_publication.c:95 #, c-format msgid "This operation is not supported for unlogged tables." msgstr "Cette opération n'est pas disponible pour les tables non journalisées." -#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 +#: catalog/pg_publication.c:109 catalog/pg_publication.c:117 #, c-format msgid "cannot add schema \"%s\" to publication" msgstr "ne peut pas ajouter le schéma « %s » à la publication" -#: catalog/pg_publication.c:103 +#: catalog/pg_publication.c:111 #, c-format msgid "This operation is not supported for system schemas." msgstr "Cette opération n'est pas disponible pour les schémas systèmes." -#: catalog/pg_publication.c:111 +#: catalog/pg_publication.c:119 #, c-format msgid "Temporary schemas cannot be replicated." msgstr "Les schémas temporaires ne peuvent pas être répliquées." -#: catalog/pg_publication.c:374 +#: catalog/pg_publication.c:397 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "la relation « %s » est déjà un membre de la publication « %s »" -#: catalog/pg_publication.c:516 +#: catalog/pg_publication.c:539 #, c-format msgid "cannot use system column \"%s\" in publication column list" msgstr "ne peut pas utiliser la colonne système « %s » dans la liste de colonnes d'une publication" -#: catalog/pg_publication.c:522 +#: catalog/pg_publication.c:545 #, fuzzy, c-format #| msgid "cannot use generated column in partition key" msgid "cannot use generated column \"%s\" in publication column list" msgstr "ne peut pas utiliser une colonne générée dans une clé de partitionnement" -#: catalog/pg_publication.c:528 +#: catalog/pg_publication.c:551 #, c-format msgid "duplicate column \"%s\" in publication column list" msgstr "colonne « %s » dans la liste de colonnes de la publication" -#: catalog/pg_publication.c:618 +#: catalog/pg_publication.c:641 #, fuzzy, c-format #| msgid "relation \"%s\" is already member of publication \"%s\"" msgid "schema \"%s\" is already member of publication \"%s\"" msgstr "la relation « %s » est déjà un membre de la publication « %s »" -#: catalog/pg_publication.c:1045 commands/publicationcmds.c:1391 -#: commands/publicationcmds.c:1430 commands/publicationcmds.c:1967 -#, c-format -msgid "publication \"%s\" does not exist" -msgstr "la publication « %s » n'existe pas" - -#: catalog/pg_shdepend.c:829 +#: catalog/pg_shdepend.c:830 #, c-format msgid "" "\n" @@ -6096,73 +6124,67 @@ msgstr[1] "" "\n" "et des objets dans %d autres bases de données (voir le journal applicatif du serveur pour une liste)" -#: catalog/pg_shdepend.c:1176 +#: catalog/pg_shdepend.c:1177 #, c-format msgid "role %u was concurrently dropped" msgstr "le rôle %u a été supprimé simultanément" -#: catalog/pg_shdepend.c:1188 +#: catalog/pg_shdepend.c:1189 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "le tablespace %u a été supprimé simultanément" -#: catalog/pg_shdepend.c:1202 +#: catalog/pg_shdepend.c:1203 #, c-format msgid "database %u was concurrently dropped" msgstr "la base de données %u a été supprimé simultanément" -#: catalog/pg_shdepend.c:1253 +#: catalog/pg_shdepend.c:1254 #, c-format msgid "owner of %s" msgstr "propriétaire de %s" -#: catalog/pg_shdepend.c:1255 +#: catalog/pg_shdepend.c:1256 #, c-format msgid "privileges for %s" msgstr "droits pour %s" -#: catalog/pg_shdepend.c:1257 +#: catalog/pg_shdepend.c:1258 #, c-format msgid "target of %s" msgstr "cible de %s" -#: catalog/pg_shdepend.c:1259 +#: catalog/pg_shdepend.c:1260 #, c-format msgid "tablespace for %s" msgstr "tablespace pour %s" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1267 +#: catalog/pg_shdepend.c:1268 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" msgstr[0] "%d objet dans %s" msgstr[1] "%d objets dans %s" -#: catalog/pg_shdepend.c:1331 +#: catalog/pg_shdepend.c:1332 #, c-format msgid "cannot drop objects owned by %s because they are required by the database system" msgstr "n'a pas pu supprimer les objets appartenant à %s car ils sont nécessaires au système de bases de données" -#: catalog/pg_shdepend.c:1477 +#: catalog/pg_shdepend.c:1498 #, c-format msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "" "ne peut pas réaffecter les objets appartenant à %s car ils sont nécessaires au\n" "système de bases de données" -#: catalog/pg_subscription.c:216 commands/subscriptioncmds.c:989 -#: commands/subscriptioncmds.c:1359 commands/subscriptioncmds.c:1710 -#, c-format -msgid "subscription \"%s\" does not exist" -msgstr "la souscription « %s » n'existe pas" - -#: catalog/pg_subscription.c:474 +#: catalog/pg_subscription.c:424 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "n'a pas pu supprimer la correspondance des relations pour la souscription « %s »" -#: catalog/pg_subscription.c:476 +#: catalog/pg_subscription.c:426 #, c-format msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." msgstr "La synchronization de la table « %s » est en cours et est dans l'état « %c »." @@ -6170,218 +6192,227 @@ msgstr "La synchronization de la table « %s » est en cours et est dans l'état #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command #. -#: catalog/pg_subscription.c:483 +#: catalog/pg_subscription.c:433 #, c-format msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." msgstr "Utiliser %s pour activer la souscription si elle n'est pas déjà activée ou utiliser %s pour supprimer la souscription." -#: catalog/pg_type.c:136 catalog/pg_type.c:476 +#: catalog/pg_type.c:134 catalog/pg_type.c:474 #, c-format msgid "pg_type OID value not set when in binary upgrade mode" msgstr "OID de pg_type non configuré en mode de mise à jour binaire" -#: catalog/pg_type.c:256 +#: catalog/pg_type.c:254 #, c-format msgid "invalid type internal size %d" msgstr "taille interne de type invalide %d" -#: catalog/pg_type.c:272 catalog/pg_type.c:280 catalog/pg_type.c:288 -#: catalog/pg_type.c:297 +#: catalog/pg_type.c:270 catalog/pg_type.c:278 catalog/pg_type.c:286 +#: catalog/pg_type.c:295 #, c-format msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" msgstr "l'alignement « %c » est invalide pour le type passé par valeur de taille %d" -#: catalog/pg_type.c:304 +#: catalog/pg_type.c:302 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "la taille interne %d est invalide pour le type passé par valeur" -#: catalog/pg_type.c:314 catalog/pg_type.c:320 +#: catalog/pg_type.c:312 catalog/pg_type.c:318 #, c-format msgid "alignment \"%c\" is invalid for variable-length type" msgstr "l'alignement « %c » est invalide pour le type de longueur variable" -#: catalog/pg_type.c:328 commands/typecmds.c:4151 +#: catalog/pg_type.c:326 commands/typecmds.c:4146 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "les types de taille fixe doivent avoir un stockage de base" -#: catalog/pg_type.c:827 -#, c-format -msgid "could not form array type name for type \"%s\"" -msgstr "n'a pas pu former le nom du type array pour le type de données « %s »" - -#: catalog/pg_type.c:932 +#: catalog/pg_type.c:955 #, c-format msgid "Failed while creating a multirange type for type \"%s\"." msgstr "Échec lors de la création d'un type multirange pour le type « %s »." -#: catalog/pg_type.c:933 +#: catalog/pg_type.c:956 #, c-format msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." msgstr "Vous pouvez spécifier manuellement un nom de type multirange en utilisant l'attribut « multirange_type_name »" -#: catalog/storage.c:505 storage/buffer/bufmgr.c:1047 +#: catalog/storage.c:505 storage/buffer/bufmgr.c:1145 #, c-format msgid "invalid page in block %u of relation %s" msgstr "page invalide dans le bloc %u de la relation %s" -#: commands/aggregatecmds.c:170 +#: commands/aggregatecmds.c:171 #, c-format msgid "only ordered-set aggregates can be hypothetical" msgstr "seuls les agrégats à ensemble ordonné peuvent être hypothétiques" -#: commands/aggregatecmds.c:195 +#: commands/aggregatecmds.c:196 #, c-format msgid "aggregate attribute \"%s\" not recognized" msgstr "l'attribut de l'agrégat « %s » n'est pas reconnu" -#: commands/aggregatecmds.c:205 +#: commands/aggregatecmds.c:206 #, c-format msgid "aggregate stype must be specified" msgstr "l'agrégat stype doit être spécifié" -#: commands/aggregatecmds.c:209 +#: commands/aggregatecmds.c:210 #, c-format msgid "aggregate sfunc must be specified" msgstr "l'agrégat sfunc doit être spécifié" -#: commands/aggregatecmds.c:221 +#: commands/aggregatecmds.c:222 #, c-format msgid "aggregate msfunc must be specified when mstype is specified" msgstr "la fonction msfunc de l'agrégat doit être spécifiée quand mstype est spécifié" -#: commands/aggregatecmds.c:225 +#: commands/aggregatecmds.c:226 #, c-format msgid "aggregate minvfunc must be specified when mstype is specified" msgstr "la fonction minvfunc de l'agrégat doit être spécifiée quand mstype est spécifié" -#: commands/aggregatecmds.c:232 +#: commands/aggregatecmds.c:233 #, c-format msgid "aggregate msfunc must not be specified without mstype" msgstr "la fonction msfunc de l'agrégat ne doit pas être spécifiée sans mstype" -#: commands/aggregatecmds.c:236 +#: commands/aggregatecmds.c:237 #, c-format msgid "aggregate minvfunc must not be specified without mstype" msgstr "la fonction minvfunc de l'agrégat ne doit pas être spécifiée sans mstype" -#: commands/aggregatecmds.c:240 +#: commands/aggregatecmds.c:241 #, c-format msgid "aggregate mfinalfunc must not be specified without mstype" msgstr "la fonction mfinalfunc de l'agrégat ne doit pas être spécifiée sans mstype" -#: commands/aggregatecmds.c:244 +#: commands/aggregatecmds.c:245 #, c-format msgid "aggregate msspace must not be specified without mstype" msgstr "la fonction msspace de l'agrégat ne doit pas être spécifiée sans mstype" -#: commands/aggregatecmds.c:248 +#: commands/aggregatecmds.c:249 #, c-format msgid "aggregate minitcond must not be specified without mstype" msgstr "la fonction minitcond de l'agrégat ne doit pas être spécifiée sans mstype" -#: commands/aggregatecmds.c:277 +#: commands/aggregatecmds.c:278 #, c-format msgid "aggregate input type must be specified" msgstr "le type d'entrée de l'agrégat doit être précisé" -#: commands/aggregatecmds.c:307 +#: commands/aggregatecmds.c:308 #, c-format msgid "basetype is redundant with aggregate input type specification" msgstr "le type de base est redondant avec la spécification du type en entrée de l'agrégat" -#: commands/aggregatecmds.c:350 commands/aggregatecmds.c:391 +#: commands/aggregatecmds.c:351 commands/aggregatecmds.c:392 #, c-format msgid "aggregate transition data type cannot be %s" msgstr "le type de données de transition de l'agrégat ne peut pas être %s" -#: commands/aggregatecmds.c:362 +#: commands/aggregatecmds.c:363 #, c-format msgid "serialization functions may be specified only when the aggregate transition data type is %s" -msgstr "les fonctions de sérialisation ne peuvent être spécifiées que quand le type de données des transitions d'aggrégat est %s" +msgstr "les fonctions de sérialisation ne peuvent être spécifiées que quand le type de données des transitions d'agrégat est %s" -#: commands/aggregatecmds.c:372 +#: commands/aggregatecmds.c:373 #, c-format msgid "must specify both or neither of serialization and deserialization functions" msgstr "doit spécifier soit toutes soit aucunes des fonctions de sérialisation et désérialisation" -#: commands/aggregatecmds.c:437 commands/functioncmds.c:643 +#: commands/aggregatecmds.c:438 commands/functioncmds.c:639 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "le paramètre « parallel » doit être SAFE, RESTRICTED ou UNSAFE" -#: commands/aggregatecmds.c:493 +#: commands/aggregatecmds.c:494 #, c-format msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" msgstr "le paramètre « %s » doit être READ_ONLY, SHAREABLE, ou READ_WRITE" -#: commands/alter.c:84 commands/event_trigger.c:174 +#: commands/alter.c:86 commands/event_trigger.c:174 #, c-format msgid "event trigger \"%s\" already exists" msgstr "le trigger sur événement « %s » existe déjà" -#: commands/alter.c:87 commands/foreigncmds.c:593 +#: commands/alter.c:89 commands/foreigncmds.c:593 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "le wrapper de données distantes « %s » existe déjà" -#: commands/alter.c:90 commands/foreigncmds.c:884 +#: commands/alter.c:92 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "le serveur « %s » existe déjà" -#: commands/alter.c:93 commands/proclang.c:133 +#: commands/alter.c:95 commands/proclang.c:133 #, c-format msgid "language \"%s\" already exists" msgstr "le langage « %s » existe déjà" -#: commands/alter.c:96 commands/publicationcmds.c:770 +#: commands/alter.c:98 commands/publicationcmds.c:771 #, c-format msgid "publication \"%s\" already exists" msgstr "la publication « %s » existe déjà" -#: commands/alter.c:99 commands/subscriptioncmds.c:567 +#: commands/alter.c:101 commands/subscriptioncmds.c:657 #, c-format msgid "subscription \"%s\" already exists" msgstr "la souscription « %s » existe déjà" -#: commands/alter.c:122 +#: commands/alter.c:124 #, c-format msgid "conversion \"%s\" already exists in schema \"%s\"" msgstr "la conversion « %s » existe déjà dans le schéma « %s »" -#: commands/alter.c:126 +#: commands/alter.c:128 #, c-format msgid "statistics object \"%s\" already exists in schema \"%s\"" msgstr "l'objet statistique « %s » existe déjà dans le schéma « %s »" -#: commands/alter.c:130 +#: commands/alter.c:132 #, c-format msgid "text search parser \"%s\" already exists in schema \"%s\"" msgstr "l'analyseur de recherche plein texte « %s » existe déjà dans le schéma « %s »" -#: commands/alter.c:134 +#: commands/alter.c:136 #, c-format msgid "text search dictionary \"%s\" already exists in schema \"%s\"" msgstr "le dictionnaire de recherche plein texte « %s » existe déjà dans le schéma « %s »" -#: commands/alter.c:138 +#: commands/alter.c:140 #, c-format msgid "text search template \"%s\" already exists in schema \"%s\"" msgstr "le modèle de recherche plein texte « %s » existe déjà dans le schéma « %s »" -#: commands/alter.c:142 +#: commands/alter.c:144 #, c-format msgid "text search configuration \"%s\" already exists in schema \"%s\"" msgstr "la configuration de recherche plein texte « %s » existe déjà dans le schéma « %s »" -#: commands/alter.c:215 +#: commands/alter.c:217 #, c-format msgid "must be superuser to rename %s" msgstr "doit être super-utilisateur pour renommer « %s »" -#: commands/alter.c:746 +#: commands/alter.c:259 commands/subscriptioncmds.c:636 +#: commands/subscriptioncmds.c:1116 commands/subscriptioncmds.c:1198 +#: commands/subscriptioncmds.c:1837 +#, c-format +msgid "password_required=false is superuser-only" +msgstr "" + +#: commands/alter.c:260 commands/subscriptioncmds.c:637 +#: commands/subscriptioncmds.c:1117 commands/subscriptioncmds.c:1199 +#: commands/subscriptioncmds.c:1838 +#, c-format +msgid "Subscriptions with the password_required option set to false may only be created or modified by the superuser." +msgstr "" + +#: commands/alter.c:775 #, c-format msgid "must be superuser to set schema of %s" msgstr "doit être super-utilisateur pour configurer le schéma de %s" @@ -6401,7 +6432,7 @@ msgstr "Doit être super-utilisateur pour créer une méthode d'accès." msgid "access method \"%s\" already exists" msgstr "la méthode d'accès « %s » existe déjà" -#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:833 +#: commands/amcmds.c:154 commands/indexcmds.c:216 commands/indexcmds.c:839 #: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" @@ -6413,8 +6444,8 @@ msgid "handler function is not specified" msgstr "la fonction handler n'est pas spécifiée" #: commands/amcmds.c:264 commands/event_trigger.c:183 -#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:713 -#: parser/parse_clause.c:942 +#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:709 +#: parser/parse_clause.c:941 #, c-format msgid "function %s must return type %s" msgstr "la fonction %s doit renvoyer le type %s" @@ -6443,10 +6474,10 @@ msgstr "analyse de l'arbre d'héritage de « %s.%s »" msgid "analyzing \"%s.%s\"" msgstr "analyse « %s.%s »" -#: commands/analyze.c:396 +#: commands/analyze.c:395 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" -msgstr "la colonne « %s » de la relation « %s » apparait plus d'une fois" +msgstr "la colonne « %s » de la relation « %s » apparaît plus d'une fois" #: commands/analyze.c:787 #, c-format @@ -6458,12 +6489,12 @@ msgstr "ANALYZE automatique de la table « %s.%s.%s »\n" msgid "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead rows; %d rows in sample, %.0f estimated total rows" msgstr "« %s » : %d pages parcourues parmi %u, contenant %.0f lignes à conserver et %.0f lignes à supprimer ; %d lignes dans l'échantillon, %.0f lignes totales estimées" -#: commands/analyze.c:1414 +#: commands/analyze.c:1418 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" msgstr "ignore l'analyse de l'arbre d'héritage « %s.%s » --- cet arbre d'héritage ne contient pas de tables enfants" -#: commands/analyze.c:1512 +#: commands/analyze.c:1516 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no analyzable child tables" msgstr "ignore l'analyse de l'arbre d'héritage « %s.%s » --- cet arbre d'héritage ne contient pas de tables enfants analysables" @@ -6512,85 +6543,85 @@ msgstr "" "La queue NOTIFY ne peut pas être vidée jusqu'à ce que le processus finisse\n" "sa transaction en cours." -#: commands/cluster.c:128 +#: commands/cluster.c:130 #, c-format msgid "unrecognized CLUSTER option \"%s\"" msgstr "option de CLUSTER « %s » non reconnue" -#: commands/cluster.c:158 commands/cluster.c:431 +#: commands/cluster.c:160 commands/cluster.c:433 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "ne peut pas exécuter CLUSTER sur les tables temporaires des autres sessions" -#: commands/cluster.c:176 +#: commands/cluster.c:178 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "il n'y a pas d'index CLUSTER précédent pour la table « %s »" -#: commands/cluster.c:190 commands/tablecmds.c:14128 commands/tablecmds.c:16008 +#: commands/cluster.c:192 commands/tablecmds.c:14206 commands/tablecmds.c:16049 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "l'index « %s » pour la table « %s » n'existe pas" -#: commands/cluster.c:420 +#: commands/cluster.c:422 #, c-format msgid "cannot cluster a shared catalog" msgstr "ne peut pas exécuter CLUSTER sur un catalogue partagé" -#: commands/cluster.c:435 +#: commands/cluster.c:437 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "ne peut pas exécuter VACUUM sur les tables temporaires des autres sessions" -#: commands/cluster.c:511 commands/tablecmds.c:16018 +#: commands/cluster.c:513 commands/tablecmds.c:16059 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "« %s » n'est pas un index de la table « %s »" -#: commands/cluster.c:519 +#: commands/cluster.c:521 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "" "ne peut pas exécuter CLUSTER sur l'index « %s » car la méthode d'accès de\n" "l'index ne gère pas cette commande" -#: commands/cluster.c:531 +#: commands/cluster.c:533 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "ne peut pas exécuter CLUSTER sur l'index partiel « %s »" -#: commands/cluster.c:545 +#: commands/cluster.c:547 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "ne peut pas exécuter la commande CLUSTER sur l'index invalide « %s »" -#: commands/cluster.c:569 +#: commands/cluster.c:571 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "ne peut pas marquer un index comme CLUSTER sur une table partitionnée" -#: commands/cluster.c:948 +#: commands/cluster.c:950 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "cluster sur « %s.%s » en utilisant un parcours d'index sur « %s »" -#: commands/cluster.c:954 +#: commands/cluster.c:956 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "cluster sur « %s.%s » en utilisant un parcours séquentiel puis un tri" -#: commands/cluster.c:959 +#: commands/cluster.c:961 #, c-format msgid "vacuuming \"%s.%s\"" msgstr "exécution du VACUUM sur « %s.%s »" -#: commands/cluster.c:985 +#: commands/cluster.c:988 #, fuzzy, c-format #| msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" msgstr "« %s » : %.0f versions de ligne supprimables, %.0f non supprimables, dans %u pages" -#: commands/cluster.c:990 +#: commands/cluster.c:993 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -6599,115 +6630,142 @@ msgstr "" "%.0f versions de lignes ne peuvent pas encore être supprimées.\n" "%s." -#: commands/collationcmds.c:106 +#: commands/collationcmds.c:112 #, c-format msgid "collation attribute \"%s\" not recognized" msgstr "attribut de collationnement « %s » non reconnu" -#: commands/collationcmds.c:119 commands/collationcmds.c:125 -#: commands/define.c:389 commands/tablecmds.c:7768 -#: replication/pgoutput/pgoutput.c:311 replication/pgoutput/pgoutput.c:334 -#: replication/pgoutput/pgoutput.c:348 replication/pgoutput/pgoutput.c:358 -#: replication/pgoutput/pgoutput.c:368 replication/pgoutput/pgoutput.c:378 -#: replication/walsender.c:1001 replication/walsender.c:1023 -#: replication/walsender.c:1033 +#: commands/collationcmds.c:125 commands/collationcmds.c:131 +#: commands/define.c:389 commands/tablecmds.c:7880 +#: replication/pgoutput/pgoutput.c:309 replication/pgoutput/pgoutput.c:332 +#: replication/pgoutput/pgoutput.c:346 replication/pgoutput/pgoutput.c:356 +#: replication/pgoutput/pgoutput.c:366 replication/pgoutput/pgoutput.c:376 +#: replication/pgoutput/pgoutput.c:386 replication/walsender.c:996 +#: replication/walsender.c:1018 replication/walsender.c:1028 #, c-format msgid "conflicting or redundant options" msgstr "options en conflit ou redondantes" -#: commands/collationcmds.c:120 +#: commands/collationcmds.c:126 #, c-format msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." msgstr "LOCALE ne peut pas être spécifié avec LC_COLLATE ou LC_CTYPE." -#: commands/collationcmds.c:126 +#: commands/collationcmds.c:132 #, fuzzy, c-format #| msgid "option \"%s\" cannot be specified with other options" msgid "FROM cannot be specified together with any other options." msgstr "l'option « %s » ne peut pas être spécifié avec d'autres options" -#: commands/collationcmds.c:174 +#: commands/collationcmds.c:191 #, c-format msgid "collation \"default\" cannot be copied" msgstr "le collationnement « default » ne peut pas être copié" -#: commands/collationcmds.c:204 +#: commands/collationcmds.c:225 #, c-format msgid "unrecognized collation provider: %s" msgstr "fournisseur de collationnement non reconnu : %s" -#: commands/collationcmds.c:232 -#, c-format -msgid "parameter \"lc_collate\" must be specified" -msgstr "le paramètre « lc_collate » doit être spécifié" - -#: commands/collationcmds.c:237 -#, c-format -msgid "parameter \"lc_ctype\" must be specified" -msgstr "le paramètre « lc_ctype » doit être spécifié" - -#: commands/collationcmds.c:244 -#, c-format -msgid "parameter \"locale\" must be specified" +#: commands/collationcmds.c:253 commands/collationcmds.c:259 +#: commands/collationcmds.c:267 +#, fuzzy, c-format +#| msgid "parameter \"locale\" must be specified" +msgid "parameter \"%s\" must be specified" msgstr "le paramètre « locale » doit être spécifié" -#: commands/collationcmds.c:256 +#: commands/collationcmds.c:282 commands/dbcommands.c:1091 +#, fuzzy, c-format +#| msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" +msgid "using standard form \"%s\" for ICU locale \"%s\"" +msgstr "Utilisation de la balise de langage « %s » pour la locale ICU « %s ».\n" + +#: commands/collationcmds.c:301 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "les collationnements non déterministes ne sont pas supportés avec ce fournisseur" -#: commands/collationcmds.c:275 +#: commands/collationcmds.c:306 commands/dbcommands.c:1110 +#, fuzzy, c-format +#| msgid "%s cannot be specified unless locale provider \"%s\" is chosen" +msgid "ICU rules cannot be specified unless locale provider is ICU" +msgstr "%s ne peut pas être spécifié sauf si le fournisseur de locale « %s » est choisi" + +#: commands/collationcmds.c:325 #, c-format msgid "current database's encoding is not supported with this provider" msgstr "l'encodage de la base de données courante n'est pas supporté avec ce fournisseur" -#: commands/collationcmds.c:334 +#: commands/collationcmds.c:385 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" -msgstr "le collationnament « %s » pour l'encodage « %s » existe déjà dans le schéma « %s »" +msgstr "le collationnement « %s » pour l'encodage « %s » existe déjà dans le schéma « %s »" -#: commands/collationcmds.c:345 +#: commands/collationcmds.c:396 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "le collationnement « %s » existe déjà dans le schéma « %s »" -#: commands/collationcmds.c:395 commands/dbcommands.c:2398 +#: commands/collationcmds.c:421 +#, fuzzy, c-format +#| msgid "change the definition of a collation" +msgid "cannot refresh version of default collation" +msgstr "modifier la définition d'un collationnement" + +#. translator: %s is an SQL command +#. translator: %s is an SQL ALTER command +#: commands/collationcmds.c:423 commands/subscriptioncmds.c:1331 +#: commands/tablecmds.c:7705 commands/tablecmds.c:7715 +#: commands/tablecmds.c:13908 commands/tablecmds.c:17188 +#: commands/tablecmds.c:17209 commands/typecmds.c:3637 commands/typecmds.c:3720 +#: commands/typecmds.c:4013 +#, fuzzy, c-format +#| msgid "Use views instead." +msgid "Use %s instead." +msgstr "Utilisez les vues à la place." + +#: commands/collationcmds.c:451 commands/dbcommands.c:2488 #, c-format msgid "changing version from %s to %s" msgstr "changement de version de %s à %s" -#: commands/collationcmds.c:410 commands/dbcommands.c:2411 +#: commands/collationcmds.c:466 commands/dbcommands.c:2501 #, c-format msgid "version has not changed" msgstr "la version n'a pas changé" -#: commands/collationcmds.c:532 +#: commands/collationcmds.c:499 commands/dbcommands.c:2667 #, c-format -msgid "could not convert locale name \"%s\" to language tag: %s" -msgstr "n'a pas pu convertir le nom de locale « %s » en balise de langage : %s" +msgid "database with OID %u does not exist" +msgstr "la base de données d'OID %u n'existe pas" + +#: commands/collationcmds.c:520 +#, c-format +msgid "collation with OID %u does not exist" +msgstr "le collationnement d'OID %u n'existe pas" -#: commands/collationcmds.c:590 +#: commands/collationcmds.c:808 #, c-format msgid "must be superuser to import system collations" msgstr "doit être super-utilisateur pour importer les collationnements systèmes" -#: commands/collationcmds.c:618 commands/copyfrom.c:1499 commands/copyto.c:679 -#: libpq/be-secure-common.c:81 +#: commands/collationcmds.c:836 commands/copyfrom.c:1667 commands/copyto.c:656 +#: libpq/be-secure-common.c:59 #, c-format msgid "could not execute command \"%s\": %m" msgstr "n'a pas pu exécuter la commande « %s » : %m" -#: commands/collationcmds.c:753 +#: commands/collationcmds.c:928 commands/collationcmds.c:1013 #, c-format msgid "no usable system locales were found" msgstr "aucune locale système utilisable n'a été trouvée" -#: commands/comment.c:61 commands/dbcommands.c:1538 commands/dbcommands.c:1735 -#: commands/dbcommands.c:1848 commands/dbcommands.c:2042 -#: commands/dbcommands.c:2284 commands/dbcommands.c:2371 -#: commands/dbcommands.c:2481 commands/dbcommands.c:2980 -#: utils/init/postinit.c:943 utils/init/postinit.c:1048 -#: utils/init/postinit.c:1065 +#: commands/comment.c:61 commands/dbcommands.c:1612 commands/dbcommands.c:1824 +#: commands/dbcommands.c:1934 commands/dbcommands.c:2132 +#: commands/dbcommands.c:2370 commands/dbcommands.c:2461 +#: commands/dbcommands.c:2571 commands/dbcommands.c:3071 +#: utils/init/postinit.c:1021 utils/init/postinit.c:1085 +#: utils/init/postinit.c:1157 #, c-format msgid "database \"%s\" does not exist" msgstr "la base de données « %s » n'existe pas" @@ -6717,12 +6775,12 @@ msgstr "la base de données « %s » n'existe pas" msgid "cannot set comment on relation \"%s\"" msgstr "ne peut pas modifier le commentaire sur la relation « %s »" -#: commands/constraint.c:63 utils/adt/ri_triggers.c:2014 +#: commands/constraint.c:63 utils/adt/ri_triggers.c:2028 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "la fonction « %s » n'a pas été appelée par le gestionnaire de triggers" -#: commands/constraint.c:70 utils/adt/ri_triggers.c:2023 +#: commands/constraint.c:70 utils/adt/ri_triggers.c:2037 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "la fonction « %s » doit être exécutée pour l'instruction AFTER ROW" @@ -6732,315 +6790,382 @@ msgstr "la fonction « %s » doit être exécutée pour l'instruction AFTER ROW" msgid "function \"%s\" must be fired for INSERT or UPDATE" msgstr "la fonction « %s » doit être exécutée pour les instructions INSERT ou UPDATE" -#: commands/conversioncmds.c:67 +#: commands/conversioncmds.c:69 #, c-format msgid "source encoding \"%s\" does not exist" msgstr "le codage source « %s » n'existe pas" -#: commands/conversioncmds.c:74 +#: commands/conversioncmds.c:76 #, c-format msgid "destination encoding \"%s\" does not exist" msgstr "l'encodage de destination « %s » n'existe pas" -#: commands/conversioncmds.c:87 +#: commands/conversioncmds.c:89 #, c-format msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" msgstr "la conversion de l'encodage de ou vers « SQL_ASCII » n'est pas supportée" -#: commands/conversioncmds.c:100 +#: commands/conversioncmds.c:102 #, c-format msgid "encoding conversion function %s must return type %s" msgstr "la fonction de conversion d'encodage %s doit renvoyer le type %s" -#: commands/conversioncmds.c:130 +#: commands/conversioncmds.c:132 #, c-format msgid "encoding conversion function %s returned incorrect result for empty input" msgstr "la fonction de conversion d'encodage %s a renvoyé un résultat incorrect pour l'entrée vide" #: commands/copy.c:86 #, fuzzy, c-format +#| msgid "permission denied to create role" +msgid "permission denied to COPY to or from an external program" +msgstr "droit refusé pour créer un rôle" + +#: commands/copy.c:87 +#, fuzzy, c-format #| msgid "must be superuser or a member of the pg_execute_server_program role to COPY to or from an external program" -msgid "must be superuser or have privileges of the pg_execute_server_program role to COPY to or from an external program" +msgid "Only roles with privileges of the \"%s\" role may COPY to or from an external program." msgstr "doit être super-utilisateur ou membre du rôle pg_execute_server_program pour utiliser COPY avec un programme externe" -#: commands/copy.c:87 commands/copy.c:96 commands/copy.c:103 +#: commands/copy.c:89 commands/copy.c:100 commands/copy.c:109 #, c-format msgid "Anyone can COPY to stdout or from stdin. psql's \\copy command also works for anyone." msgstr "Tout le monde peut utiliser COPY vers stdout ou à partir de stdin. La commande \\copy de psql fonctionne aussi pour tout le monde." -#: commands/copy.c:95 +#: commands/copy.c:97 +#, fuzzy, c-format +#| msgid "permission denied to drop role" +msgid "permission denied to COPY from a file" +msgstr "droit refusé pour supprimer le rôle" + +#: commands/copy.c:98 #, fuzzy, c-format #| msgid "must be superuser or a member of the pg_read_server_files role to COPY from a file" -msgid "must be superuser or have privileges of the pg_read_server_files role to COPY from a file" +msgid "Only roles with privileges of the \"%s\" role may COPY from a file." msgstr "doit être super-utilisateur ou membre du rôle pg_read_all_settings pour utiliser COPY depuis un fichier" -#: commands/copy.c:102 +#: commands/copy.c:106 +#, fuzzy, c-format +#| msgid "permission denied to drop role" +msgid "permission denied to COPY to a file" +msgstr "droit refusé pour supprimer le rôle" + +#: commands/copy.c:107 #, fuzzy, c-format #| msgid "must be superuser or a member of the pg_write_server_files role to COPY to a file" -msgid "must be superuser or have privileges of the pg_write_server_files role to COPY to a file" +msgid "Only roles with privileges of the \"%s\" role may COPY to a file." msgstr "doit être super-utilisateur ou membre de pg_read_all_settings pour utiliser COPY vers un fichier" -#: commands/copy.c:188 +#: commands/copy.c:195 #, c-format msgid "COPY FROM not supported with row-level security" msgstr "COPY FROM non supporté avec la sécurité niveau ligne" -#: commands/copy.c:189 +#: commands/copy.c:196 #, c-format msgid "Use INSERT statements instead." msgstr "Utilisez des instructions INSERT à la place." -#: commands/copy.c:280 +#: commands/copy.c:290 #, c-format msgid "MERGE not supported in COPY" msgstr "MERGE non supporté dans COPY" -#: commands/copy.c:373 +#: commands/copy.c:383 #, c-format msgid "cannot use \"%s\" with HEADER in COPY TO" msgstr "ne peut pas utiliser « %s » avec HEADER dans COPY TO" -#: commands/copy.c:382 +#: commands/copy.c:392 #, c-format msgid "%s requires a Boolean value or \"match\"" msgstr "%s requiert une valeur booléenne ou « match »" -#: commands/copy.c:441 +#: commands/copy.c:451 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "format COPY « %s » non reconnu" -#: commands/copy.c:493 commands/copy.c:506 commands/copy.c:519 -#: commands/copy.c:538 +#: commands/copy.c:509 commands/copy.c:522 commands/copy.c:535 +#: commands/copy.c:554 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "l'argument de l'option « %s » doit être une liste de noms de colonnes" -#: commands/copy.c:550 +#: commands/copy.c:566 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "l'argument de l'option « %s » doit être un nom d'encodage valide" -#: commands/copy.c:557 commands/dbcommands.c:849 commands/dbcommands.c:2232 +#: commands/copy.c:573 commands/dbcommands.c:859 commands/dbcommands.c:2318 #, c-format msgid "option \"%s\" not recognized" msgstr "option « %s » non reconnue" -#: commands/copy.c:569 +#: commands/copy.c:585 #, c-format msgid "cannot specify DELIMITER in BINARY mode" msgstr "ne peut pas spécifier le délimiteur (DELIMITER) en mode binaire (BINARY)" -#: commands/copy.c:574 +#: commands/copy.c:590 #, c-format msgid "cannot specify NULL in BINARY mode" msgstr "ne peut pas spécifier NULL en mode binaire (BINARY)" -#: commands/copy.c:596 +#: commands/copy.c:595 +#, fuzzy, c-format +#| msgid "cannot specify NULL in BINARY mode" +msgid "cannot specify DEFAULT in BINARY mode" +msgstr "ne peut pas spécifier NULL en mode binaire (BINARY)" + +#: commands/copy.c:617 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "le délimiteur COPY doit être un seul caractère d'un octet" -#: commands/copy.c:603 +#: commands/copy.c:624 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "le délimiteur de COPY ne peut pas être un retour à la ligne ou un retour chariot" -#: commands/copy.c:609 +#: commands/copy.c:630 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "la représentation du NULL dans COPY ne peut pas utiliser un retour à la ligne ou un retour chariot" -#: commands/copy.c:626 +#: commands/copy.c:640 +#, fuzzy, c-format +#| msgid "COPY null representation cannot use newline or carriage return" +msgid "COPY default representation cannot use newline or carriage return" +msgstr "la représentation du NULL dans COPY ne peut pas utiliser un retour à la ligne ou un retour chariot" + +#: commands/copy.c:658 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "le délimiteur de COPY ne peut pas être « %s »" -#: commands/copy.c:632 +#: commands/copy.c:664 #, c-format msgid "cannot specify HEADER in BINARY mode" msgstr "ne peut pas spécifier HEADER en mode BINARY" -#: commands/copy.c:638 +#: commands/copy.c:670 #, c-format msgid "COPY quote available only in CSV mode" msgstr "le guillemet dans COPY n'est disponible que dans le mode CSV" -#: commands/copy.c:643 +#: commands/copy.c:675 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "le guillemet dans COPY doit être un seul caractère d'un octet" -#: commands/copy.c:648 +#: commands/copy.c:680 #, c-format msgid "COPY delimiter and quote must be different" msgstr "le délimiteur de COPY ne doit pas être un guillemet" -#: commands/copy.c:654 +#: commands/copy.c:686 #, c-format msgid "COPY escape available only in CSV mode" msgstr "le caractère d'échappement COPY n'est disponible que dans le mode CSV" -#: commands/copy.c:659 +#: commands/copy.c:691 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "le caractère d'échappement COPY doit être un seul caractère d'un octet" -#: commands/copy.c:665 +#: commands/copy.c:697 #, c-format msgid "COPY force quote available only in CSV mode" msgstr "le guillemet forcé COPY n'est disponible que dans le mode CSV" -#: commands/copy.c:669 +#: commands/copy.c:701 #, c-format msgid "COPY force quote only available using COPY TO" msgstr "le guillemet forcé pour COPY n'est disponible qu'en utilisant COPY TO" -#: commands/copy.c:675 +#: commands/copy.c:707 #, c-format msgid "COPY force not null available only in CSV mode" msgstr "« COPY force not null » n'est disponible que dans la version CSV" -#: commands/copy.c:679 +#: commands/copy.c:711 #, c-format msgid "COPY force not null only available using COPY FROM" msgstr "« COPY force not null » n'est disponible qu'en utilisant COPY FROM" -#: commands/copy.c:685 +#: commands/copy.c:717 #, c-format msgid "COPY force null available only in CSV mode" msgstr "« COPY force null » n'est disponible que dans le mode CSV" -#: commands/copy.c:690 +#: commands/copy.c:722 #, c-format msgid "COPY force null only available using COPY FROM" msgstr "« COPY force null » n'est disponible qu'en utilisant COPY FROM" -#: commands/copy.c:696 +#: commands/copy.c:728 #, c-format msgid "COPY delimiter must not appear in the NULL specification" msgstr "le délimiteur COPY ne doit pas apparaître dans la spécification de NULL" -#: commands/copy.c:703 +#: commands/copy.c:735 #, c-format msgid "CSV quote character must not appear in the NULL specification" msgstr "le caractère guillemet pour CSV ne doit pas apparaître dans la spécification de NULL" -#: commands/copy.c:764 +#: commands/copy.c:742 +#, fuzzy, c-format +#| msgid "COPY force null only available using COPY FROM" +msgid "COPY DEFAULT only available using COPY FROM" +msgstr "« COPY force null » n'est disponible qu'en utilisant COPY FROM" + +#: commands/copy.c:748 +#, fuzzy, c-format +#| msgid "COPY delimiter must not appear in the NULL specification" +msgid "COPY delimiter must not appear in the DEFAULT specification" +msgstr "le délimiteur COPY ne doit pas apparaître dans la spécification de NULL" + +#: commands/copy.c:755 +#, fuzzy, c-format +#| msgid "CSV quote character must not appear in the NULL specification" +msgid "CSV quote character must not appear in the DEFAULT specification" +msgstr "le caractère guillemet pour CSV ne doit pas apparaître dans la spécification de NULL" + +#: commands/copy.c:763 +#, c-format +msgid "NULL specification and DEFAULT specification cannot be the same" +msgstr "" + +#: commands/copy.c:825 #, c-format msgid "column \"%s\" is a generated column" msgstr "la colonne « %s » est une colonne générée" -#: commands/copy.c:766 +#: commands/copy.c:827 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "Les colonnes générées ne peuvent pas être utilisées dans COPY." -#: commands/copy.c:781 commands/indexcmds.c:1833 commands/statscmds.c:243 -#: commands/tablecmds.c:2379 commands/tablecmds.c:3035 -#: commands/tablecmds.c:3529 parser/parse_relation.c:3655 -#: parser/parse_relation.c:3675 utils/adt/tsvector_op.c:2688 +#: commands/copy.c:842 commands/indexcmds.c:1910 commands/statscmds.c:242 +#: commands/tablecmds.c:2405 commands/tablecmds.c:3127 +#: commands/tablecmds.c:3626 parser/parse_relation.c:3689 +#: parser/parse_relation.c:3699 parser/parse_relation.c:3717 +#: parser/parse_relation.c:3724 parser/parse_relation.c:3738 +#: utils/adt/tsvector_op.c:2855 #, c-format msgid "column \"%s\" does not exist" msgstr "la colonne « %s » n'existe pas" -#: commands/copy.c:788 commands/tablecmds.c:2405 commands/trigger.c:967 -#: parser/parse_target.c:1079 parser/parse_target.c:1090 +#: commands/copy.c:849 commands/tablecmds.c:2431 commands/trigger.c:958 +#: parser/parse_target.c:1070 parser/parse_target.c:1081 #, c-format msgid "column \"%s\" specified more than once" msgstr "la colonne « %s » est spécifiée plus d'une fois" -#: commands/copyfrom.c:123 +#: commands/copyfrom.c:122 +#, c-format +msgid "COPY %s" +msgstr "" + +#: commands/copyfrom.c:130 #, c-format msgid "COPY %s, line %llu, column %s" msgstr "COPY %s, ligne %llu, colonne %s" -#: commands/copyfrom.c:128 commands/copyfrom.c:174 +#: commands/copyfrom.c:135 commands/copyfrom.c:181 #, c-format msgid "COPY %s, line %llu" msgstr "COPY %s, ligne %llu" -#: commands/copyfrom.c:140 +#: commands/copyfrom.c:147 #, c-format msgid "COPY %s, line %llu, column %s: \"%s\"" msgstr "COPY %s, ligne %llu, colonne %s : « %s »" -#: commands/copyfrom.c:150 +#: commands/copyfrom.c:157 #, c-format msgid "COPY %s, line %llu, column %s: null input" msgstr "COPY %s, ligne %llu, colonne %s : NULL en entrée" -#: commands/copyfrom.c:167 +#: commands/copyfrom.c:174 #, c-format msgid "COPY %s, line %llu: \"%s\"" msgstr "COPY %s, ligne %llu : « %s »" -#: commands/copyfrom.c:569 +#: commands/copyfrom.c:673 #, c-format msgid "cannot copy to view \"%s\"" msgstr "ne peut pas copier vers la vue « %s »" -#: commands/copyfrom.c:571 +#: commands/copyfrom.c:675 #, c-format msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." msgstr "Pour activer la copie d'une vue, fournissez un trigger INSTEAD OF INSERT." -#: commands/copyfrom.c:575 +#: commands/copyfrom.c:679 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "ne peut pas copier vers la vue matérialisée « %s »" -#: commands/copyfrom.c:580 +#: commands/copyfrom.c:684 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "ne peut pas copier vers la séquence « %s »" -#: commands/copyfrom.c:585 +#: commands/copyfrom.c:689 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "ne peut pas copier vers la relation « %s », qui n'est pas une table" -#: commands/copyfrom.c:625 +#: commands/copyfrom.c:729 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "ne peut pas exécuter COPY FREEZE sur une table partitionnée" -#: commands/copyfrom.c:640 +#: commands/copyfrom.c:744 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "n'a pas pu exécuter un COPY FREEZE à cause d'une activité transactionnelle précédente" -#: commands/copyfrom.c:646 +#: commands/copyfrom.c:750 #, c-format msgid "cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction" msgstr "n'a pas pu exécuter un COPY FREEZE parce que la table n'a pas été créée ou tronquée dans la transaction en cours" -#: commands/copyfrom.c:1267 commands/copyto.c:611 +#: commands/copyfrom.c:1411 #, c-format msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" msgstr "la colonne « %s » FORCE_NOT_NULL n'est pas référencée par COPY" -#: commands/copyfrom.c:1290 commands/copyto.c:634 +#: commands/copyfrom.c:1434 #, c-format msgid "FORCE_NULL column \"%s\" not referenced by COPY" msgstr "la colonne « %s » FORCE_NULL n'est pas référencée par COPY" -#: commands/copyfrom.c:1518 +#: commands/copyfrom.c:1487 utils/mb/mbutils.c:386 +#, c-format +msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" +msgstr "" +"la fonction de conversion par défaut pour l'encodage de « %s » en « %s »\n" +"n'existe pas" + +#: commands/copyfrom.c:1686 #, c-format msgid "COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \\copy." msgstr "COPY TO indique au serveur PostgreSQL de lire un fichier. Vous pourriez vouloir utiliser la fonctionnalité \\copy de psql pour lire en local." -#: commands/copyfrom.c:1531 commands/copyto.c:731 +#: commands/copyfrom.c:1699 commands/copyto.c:708 #, c-format msgid "\"%s\" is a directory" msgstr "« %s » est un répertoire" -#: commands/copyfrom.c:1599 commands/copyto.c:301 libpq/be-secure-common.c:105 +#: commands/copyfrom.c:1767 commands/copyto.c:306 libpq/be-secure-common.c:83 #, c-format msgid "could not close pipe to external command: %m" msgstr "n'a pas pu fermer le fichier pipe vers la commande externe : %m" -#: commands/copyfrom.c:1614 commands/copyto.c:306 +#: commands/copyfrom.c:1782 commands/copyto.c:311 #, c-format msgid "program \"%s\" failed" msgstr "le programme « %s » a échoué" @@ -7081,7 +7206,7 @@ msgid "could not read from COPY file: %m" msgstr "n'a pas pu lire le fichier COPY : %m" #: commands/copyfromparse.c:278 commands/copyfromparse.c:303 -#: tcop/postgres.c:358 +#: tcop/postgres.c:377 #, c-format msgid "unexpected EOF on client connection with an open transaction" msgstr "" @@ -7114,194 +7239,206 @@ msgstr "" msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" msgstr "" -#: commands/copyfromparse.c:890 commands/copyfromparse.c:1495 -#: commands/copyfromparse.c:1725 +#: commands/copyfromparse.c:892 commands/copyfromparse.c:1512 +#: commands/copyfromparse.c:1768 #, c-format msgid "extra data after last expected column" msgstr "données supplémentaires après la dernière colonne attendue" -#: commands/copyfromparse.c:904 +#: commands/copyfromparse.c:906 #, c-format msgid "missing data for column \"%s\"" msgstr "données manquantes pour la colonne « %s »" -#: commands/copyfromparse.c:982 +#: commands/copyfromparse.c:999 #, c-format msgid "received copy data after EOF marker" msgstr "a reçu des données de COPY après le marqueur de fin" -#: commands/copyfromparse.c:989 +#: commands/copyfromparse.c:1006 #, c-format msgid "row field count is %d, expected %d" msgstr "le nombre de champs de la ligne est %d, %d attendus" -#: commands/copyfromparse.c:1277 commands/copyfromparse.c:1294 +#: commands/copyfromparse.c:1294 commands/copyfromparse.c:1311 #, c-format msgid "literal carriage return found in data" msgstr "retour chariot trouvé dans les données" -#: commands/copyfromparse.c:1278 commands/copyfromparse.c:1295 +#: commands/copyfromparse.c:1295 commands/copyfromparse.c:1312 #, c-format msgid "unquoted carriage return found in data" msgstr "retour chariot sans guillemet trouvé dans les données" -#: commands/copyfromparse.c:1280 commands/copyfromparse.c:1297 +#: commands/copyfromparse.c:1297 commands/copyfromparse.c:1314 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "Utilisez « \\r » pour représenter un retour chariot." -#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 +#: commands/copyfromparse.c:1298 commands/copyfromparse.c:1315 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "Utiliser le champ CSV entre guillemets pour représenter un retour chariot." -#: commands/copyfromparse.c:1310 +#: commands/copyfromparse.c:1327 #, c-format msgid "literal newline found in data" msgstr "retour à la ligne trouvé dans les données" -#: commands/copyfromparse.c:1311 +#: commands/copyfromparse.c:1328 #, c-format msgid "unquoted newline found in data" msgstr "retour à la ligne trouvé dans les données" -#: commands/copyfromparse.c:1313 +#: commands/copyfromparse.c:1330 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "Utilisez « \\n » pour représenter un retour à la ligne." -#: commands/copyfromparse.c:1314 +#: commands/copyfromparse.c:1331 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "Utiliser un champ CSV entre guillemets pour représenter un retour à la ligne." -#: commands/copyfromparse.c:1360 commands/copyfromparse.c:1396 +#: commands/copyfromparse.c:1377 commands/copyfromparse.c:1413 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "le marqueur fin-de-copie ne correspond pas à un précédent style de fin de ligne" -#: commands/copyfromparse.c:1369 commands/copyfromparse.c:1385 +#: commands/copyfromparse.c:1386 commands/copyfromparse.c:1402 #, c-format msgid "end-of-copy marker corrupt" msgstr "marqueur fin-de-copie corrompu" -#: commands/copyfromparse.c:1809 +#: commands/copyfromparse.c:1704 commands/copyfromparse.c:1919 +#, fuzzy, c-format +#| msgid "unexpected EOF in COPY data" +msgid "unexpected default marker in COPY data" +msgstr "fin de fichier (EOF) inattendu dans les données du COPY" + +#: commands/copyfromparse.c:1705 commands/copyfromparse.c:1920 +#, fuzzy, c-format +#| msgid "column \"%s\" inherits conflicting default values" +msgid "Column \"%s\" has no default value." +msgstr "la colonne « %s » hérite de valeurs par défaut conflictuelles" + +#: commands/copyfromparse.c:1852 #, c-format msgid "unterminated CSV quoted field" msgstr "champ CSV entre guillemets non terminé" -#: commands/copyfromparse.c:1885 commands/copyfromparse.c:1904 +#: commands/copyfromparse.c:1954 commands/copyfromparse.c:1973 #, c-format msgid "unexpected EOF in COPY data" msgstr "fin de fichier (EOF) inattendu dans les données du COPY" -#: commands/copyfromparse.c:1894 +#: commands/copyfromparse.c:1963 #, c-format msgid "invalid field size" msgstr "taille du champ invalide" -#: commands/copyfromparse.c:1917 +#: commands/copyfromparse.c:1986 #, c-format msgid "incorrect binary data format" msgstr "format de données binaires incorrect" -#: commands/copyto.c:234 +#: commands/copyto.c:236 #, c-format msgid "could not write to COPY program: %m" msgstr "n'a pas pu écrire vers le programme COPY : %m" -#: commands/copyto.c:239 +#: commands/copyto.c:241 #, c-format msgid "could not write to COPY file: %m" msgstr "n'a pas pu écrire dans le fichier COPY : %m" -#: commands/copyto.c:369 +#: commands/copyto.c:386 #, c-format msgid "cannot copy from view \"%s\"" msgstr "ne peut pas copier à partir de la vue « %s »" -#: commands/copyto.c:371 commands/copyto.c:377 commands/copyto.c:383 -#: commands/copyto.c:394 +#: commands/copyto.c:388 commands/copyto.c:394 commands/copyto.c:400 +#: commands/copyto.c:411 #, c-format msgid "Try the COPY (SELECT ...) TO variant." msgstr "Tentez la variante COPY (SELECT ...) TO." -#: commands/copyto.c:375 +#: commands/copyto.c:392 #, c-format msgid "cannot copy from materialized view \"%s\"" msgstr "ne peut pas copier à partir de la vue matérialisée « %s »" -#: commands/copyto.c:381 +#: commands/copyto.c:398 #, c-format msgid "cannot copy from foreign table \"%s\"" msgstr "ne peut pas copier à partir de la table distante « %s »" -#: commands/copyto.c:387 +#: commands/copyto.c:404 #, c-format msgid "cannot copy from sequence \"%s\"" msgstr "ne peut pas copier à partir de la séquence « %s »" -#: commands/copyto.c:392 +#: commands/copyto.c:409 #, c-format msgid "cannot copy from partitioned table \"%s\"" msgstr "ne peut pas copier à partir de la table partitionnée « %s »" -#: commands/copyto.c:398 +#: commands/copyto.c:415 #, c-format msgid "cannot copy from non-table relation \"%s\"" msgstr "ne peut pas copier depuis la relation « %s », qui n'est pas une table" -#: commands/copyto.c:450 +#: commands/copyto.c:467 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for COPY" msgstr "les règles DO INSTEAD NOTHING ne sont pas supportées pour COPY" -#: commands/copyto.c:464 +#: commands/copyto.c:481 #, c-format msgid "conditional DO INSTEAD rules are not supported for COPY" msgstr "les règles DO INSTEAD conditionnelles ne sont pas supportées par l'instruction COPY" -#: commands/copyto.c:468 +#: commands/copyto.c:485 #, c-format msgid "DO ALSO rules are not supported for the COPY" msgstr "les règles DO ALSO ne sont pas supportées pour COPY" -#: commands/copyto.c:473 +#: commands/copyto.c:490 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for COPY" msgstr "les règles DO INSTEAD multi-instructions ne sont pas supportées par l'instruction COPY" -#: commands/copyto.c:483 +#: commands/copyto.c:500 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO) n'est pas supporté" -#: commands/copyto.c:500 +#: commands/copyto.c:517 #, c-format msgid "COPY query must have a RETURNING clause" msgstr "La requête COPY doit avoir une clause RETURNING" -#: commands/copyto.c:529 +#: commands/copyto.c:546 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "la relation référencée par l'instruction COPY a changé" -#: commands/copyto.c:588 +#: commands/copyto.c:605 #, c-format msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" msgstr "la colonne « %s » FORCE_QUOTE n'est pas référencée par COPY" -#: commands/copyto.c:696 +#: commands/copyto.c:673 #, c-format msgid "relative path not allowed for COPY to file" msgstr "un chemin relatif n'est pas autorisé à utiliser COPY vers un fichier" -#: commands/copyto.c:715 +#: commands/copyto.c:692 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "n'a pas pu ouvrir le fichier « %s » en écriture : %m" -#: commands/copyto.c:718 +#: commands/copyto.c:695 #, c-format msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." msgstr "COPY TO indique au serveur PostgreSQL d'écrire un fichier. Vous pourriez vouloir utiliser la fonctionnalité \\copy de psql pour écrire en local." @@ -7316,137 +7453,164 @@ msgstr "trop de noms de colonnes ont été spécifiés" msgid "policies not yet implemented for this command" msgstr "politiques non encore implémentées pour cette commande" -#: commands/dbcommands.c:812 +#: commands/dbcommands.c:822 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION n'est plus supporté" -#: commands/dbcommands.c:813 +#: commands/dbcommands.c:823 #, c-format msgid "Consider using tablespaces instead." msgstr "Considérer l'utilisation de tablespaces." -#: commands/dbcommands.c:838 +#: commands/dbcommands.c:848 #, c-format msgid "OIDs less than %u are reserved for system objects" msgstr "les OID inférieurs à %u sont réservés aux objets systèmes" -#: commands/dbcommands.c:869 utils/adt/ascii.c:145 +#: commands/dbcommands.c:879 utils/adt/ascii.c:146 #, c-format msgid "%d is not a valid encoding code" msgstr "%d n'est pas un code d'encodage valide" -#: commands/dbcommands.c:880 utils/adt/ascii.c:127 +#: commands/dbcommands.c:890 utils/adt/ascii.c:128 #, c-format msgid "%s is not a valid encoding name" msgstr "%s n'est pas un nom d'encodage valide" -#: commands/dbcommands.c:907 +#: commands/dbcommands.c:919 #, c-format msgid "unrecognized locale provider: %s" msgstr "fournisseur de locale non reconnu : %s" -#: commands/dbcommands.c:920 commands/dbcommands.c:2265 commands/user.c:237 -#: commands/user.c:611 +#: commands/dbcommands.c:932 commands/dbcommands.c:2351 commands/user.c:300 +#: commands/user.c:740 #, c-format msgid "invalid connection limit: %d" msgstr "limite de connexion invalide : %d" -#: commands/dbcommands.c:941 +#: commands/dbcommands.c:953 #, c-format msgid "permission denied to create database" msgstr "droit refusé pour créer une base de données" -#: commands/dbcommands.c:965 +#: commands/dbcommands.c:977 #, c-format msgid "template database \"%s\" does not exist" msgstr "la base de données modèle « %s » n'existe pas" -#: commands/dbcommands.c:977 +#: commands/dbcommands.c:987 +#, fuzzy, c-format +#| msgid "cannot use invalid index \"%s\" as replica identity" +msgid "cannot use invalid database \"%s\" as template" +msgstr "ne peut pas utiliser l'index invalide « %s » comme identité de réplicat" + +#: commands/dbcommands.c:988 commands/dbcommands.c:2380 +#: utils/init/postinit.c:1100 +#, fuzzy, c-format +#| msgid "Use DROP TABLE to remove a table." +msgid "Use DROP DATABASE to drop invalid databases." +msgstr "Utilisez DROP TABLE pour supprimer une table." + +#: commands/dbcommands.c:999 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "droit refusé pour copier la base de données « %s »" -#: commands/dbcommands.c:994 +#: commands/dbcommands.c:1016 #, fuzzy, c-format #| msgid "invalid database name \"%s\"" msgid "invalid create database strategy \"%s\"" msgstr "nom de base de données « %s » invalide" -#: commands/dbcommands.c:995 +#: commands/dbcommands.c:1017 #, c-format msgid "Valid strategies are \"wal_log\", and \"file_copy\"." msgstr "Les stratégies valides sont « wal_log » et « file_copy »" -#: commands/dbcommands.c:1014 +#: commands/dbcommands.c:1043 #, c-format msgid "invalid server encoding %d" msgstr "encodage serveur %d invalide" -#: commands/dbcommands.c:1020 commands/dbcommands.c:1025 -#, c-format -msgid "invalid locale name: \"%s\"" +#: commands/dbcommands.c:1049 +#, fuzzy, c-format +#| msgid "invalid locale name: \"%s\"" +msgid "invalid LC_COLLATE locale name: \"%s\"" +msgstr "nom de locale invalide : « %s »" + +#: commands/dbcommands.c:1050 commands/dbcommands.c:1056 +#, fuzzy, c-format +#| msgid "If the locale name is specific to ICU, use --icu-locale." +msgid "If the locale name is specific to ICU, use ICU_LOCALE." +msgstr "Si le nom de la locale est spécifique à ICU, utilisez --icu-locale." + +#: commands/dbcommands.c:1055 +#, fuzzy, c-format +#| msgid "invalid locale name: \"%s\"" +msgid "invalid LC_CTYPE locale name: \"%s\"" msgstr "nom de locale invalide : « %s »" -#: commands/dbcommands.c:1035 +#: commands/dbcommands.c:1066 #, c-format msgid "encoding \"%s\" is not supported with ICU provider" msgstr "l'encodage « %s » n'est pas supporté par le fournisseur ICU" -#: commands/dbcommands.c:1045 -#, c-format -msgid "ICU locale must be specified" +#: commands/dbcommands.c:1076 +#, fuzzy, c-format +#| msgid "ICU locale must be specified" +msgid "LOCALE or ICU_LOCALE must be specified" msgstr "la locale ICU doit être précisée" -#: commands/dbcommands.c:1054 +#: commands/dbcommands.c:1105 #, fuzzy, c-format #| msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgid "ICU locale cannot be specified unless locale provider is ICU" msgstr "%s ne peut pas être spécifié sauf si le fournisseur de locale « %s » est choisi" -#: commands/dbcommands.c:1072 +#: commands/dbcommands.c:1128 #, c-format msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" msgstr "" "le nouvel encodage (%sà est incompatible avec l'encodage de la base de\n" "données modèle (%s)" -#: commands/dbcommands.c:1075 +#: commands/dbcommands.c:1131 #, c-format msgid "Use the same encoding as in the template database, or use template0 as template." msgstr "" "Utilisez le même encodage que celui de la base de données modèle,\n" "ou utilisez template0 comme modèle." -#: commands/dbcommands.c:1080 +#: commands/dbcommands.c:1136 #, c-format msgid "new collation (%s) is incompatible with the collation of the template database (%s)" msgstr "" "le nouveau tri (%s) est incompatible avec le tri de la base de\n" "données modèle (%s)" -#: commands/dbcommands.c:1082 +#: commands/dbcommands.c:1138 #, c-format msgid "Use the same collation as in the template database, or use template0 as template." msgstr "" "Utilisez le même tri que celui de la base de données modèle,\n" "ou utilisez template0 comme modèle." -#: commands/dbcommands.c:1087 +#: commands/dbcommands.c:1143 #, c-format msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" msgstr "" "le nouveau LC_CTYPE (%s) est incompatible avec le LC_CTYPE de la base de\n" "données modèle (%s)" -#: commands/dbcommands.c:1089 +#: commands/dbcommands.c:1145 #, c-format msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." msgstr "" "Utilisez le même LC_CTYPE que celui de la base de données modèle,\n" "ou utilisez template0 comme modèle." -#: commands/dbcommands.c:1094 +#: commands/dbcommands.c:1150 #, fuzzy, c-format #| msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" msgid "new locale provider (%s) does not match locale provider of the template database (%s)" @@ -7454,7 +7618,7 @@ msgstr "" "le nouvel encodage (%sà est incompatible avec l'encodage de la base de\n" "données modèle (%s)" -#: commands/dbcommands.c:1096 +#: commands/dbcommands.c:1152 #, fuzzy, c-format #| msgid "Use the same encoding as in the template database, or use template0 as template." msgid "Use the same locale provider as in the template database, or use template0 as template." @@ -7462,7 +7626,7 @@ msgstr "" "Utilisez le même encodage que celui de la base de données modèle,\n" "ou utilisez template0 comme modèle." -#: commands/dbcommands.c:1105 +#: commands/dbcommands.c:1164 #, fuzzy, c-format #| msgid "new collation (%s) is incompatible with the collation of the template database (%s)" msgid "new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)" @@ -7470,7 +7634,7 @@ msgstr "" "le nouveau tri (%s) est incompatible avec le tri de la base de\n" "données modèle (%s)" -#: commands/dbcommands.c:1107 +#: commands/dbcommands.c:1166 #, fuzzy, c-format #| msgid "Use the same collation as in the template database, or use template0 as template." msgid "Use the same ICU locale as in the template database, or use template0 as template." @@ -7478,210 +7642,232 @@ msgstr "" "Utilisez le même tri que celui de la base de données modèle,\n" "ou utilisez template0 comme modèle." -#: commands/dbcommands.c:1130 +#: commands/dbcommands.c:1177 +#, fuzzy, c-format +#| msgid "new collation (%s) is incompatible with the collation of the template database (%s)" +msgid "new ICU collation rules (%s) are incompatible with the ICU collation rules of the template database (%s)" +msgstr "" +"le nouveau tri (%s) est incompatible avec le tri de la base de\n" +"données modèle (%s)" + +#: commands/dbcommands.c:1179 +#, fuzzy, c-format +#| msgid "Use the same collation as in the template database, or use template0 as template." +msgid "Use the same ICU collation rules as in the template database, or use template0 as template." +msgstr "" +"Utilisez le même tri que celui de la base de données modèle,\n" +"ou utilisez template0 comme modèle." + +#: commands/dbcommands.c:1202 #, c-format msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" msgstr "" -#: commands/dbcommands.c:1135 +#: commands/dbcommands.c:1207 #, fuzzy, c-format #| msgid "template database \"%s\" does not exist" msgid "template database \"%s\" has a collation version mismatch" msgstr "la base de données modèle « %s » n'existe pas" -#: commands/dbcommands.c:1137 +#: commands/dbcommands.c:1209 #, fuzzy, c-format #| msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgid "The template database was created using collation version %s, but the operating system provides version %s." msgstr "Le collationnement dans la base de données a été créé en utilisant la version %s mais le système d'exploitation fournit la version %s." -#: commands/dbcommands.c:1140 +#: commands/dbcommands.c:1212 #, fuzzy, c-format #| msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgid "Rebuild all objects in the template database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." msgstr "Reconstruisez tous les objets affectés par ce collationnement, et lancez ALTER COLLATION %s REFRESH VERSION, ou construisez PostgreSQL avec la bonne version de bibliothèque." -#: commands/dbcommands.c:1176 commands/dbcommands.c:1894 +#: commands/dbcommands.c:1248 commands/dbcommands.c:1980 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "pg_global ne peut pas être utilisé comme tablespace par défaut" -#: commands/dbcommands.c:1202 +#: commands/dbcommands.c:1274 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "ne peut pas affecter un nouveau tablespace par défaut « %s »" -#: commands/dbcommands.c:1204 +#: commands/dbcommands.c:1276 #, c-format msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." msgstr "" "Il existe un conflit car la base de données « %s » a déjà quelques tables\n" "dans son tablespace." -#: commands/dbcommands.c:1234 commands/dbcommands.c:1764 +#: commands/dbcommands.c:1306 commands/dbcommands.c:1853 #, c-format msgid "database \"%s\" already exists" msgstr "la base de données « %s » existe déjà" -#: commands/dbcommands.c:1248 +#: commands/dbcommands.c:1320 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "la base de données source « %s » est accédée par d'autres utilisateurs" -#: commands/dbcommands.c:1270 +#: commands/dbcommands.c:1342 #, fuzzy, c-format #| msgid "%s: language \"%s\" is already installed in database \"%s\"\n" msgid "database OID %u is already in use by database \"%s\"" msgstr "%s : le langage « %s » est déjà installé sur la base de données « %s »\n" -#: commands/dbcommands.c:1276 +#: commands/dbcommands.c:1348 #, c-format msgid "data directory with the specified OID %u already exists" msgstr "le répertoire de donnée d'OID %u existe déjà" -#: commands/dbcommands.c:1447 commands/dbcommands.c:1462 +#: commands/dbcommands.c:1520 commands/dbcommands.c:1535 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "l'encodage « %s » ne correspond pas à la locale « %s »" -#: commands/dbcommands.c:1450 +#: commands/dbcommands.c:1523 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "Le paramètre LC_CTYPE choisi nécessite l'encodage « %s »." -#: commands/dbcommands.c:1465 +#: commands/dbcommands.c:1538 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "Le paramètre LC_COLLATE choisi nécessite l'encodage « %s »." -#: commands/dbcommands.c:1545 +#: commands/dbcommands.c:1619 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "la base de données « %s » n'existe pas, poursuite du traitement" -#: commands/dbcommands.c:1569 +#: commands/dbcommands.c:1643 #, c-format msgid "cannot drop a template database" msgstr "ne peut pas supprimer une base de données modèle" -#: commands/dbcommands.c:1575 +#: commands/dbcommands.c:1649 #, c-format msgid "cannot drop the currently open database" msgstr "ne peut pas supprimer la base de données actuellement ouverte" -#: commands/dbcommands.c:1588 +#: commands/dbcommands.c:1662 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "la base de données « %s » est utilisée par un slot de réplication logique actif" -#: commands/dbcommands.c:1590 +#: commands/dbcommands.c:1664 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." msgstr[0] "Il existe %d slot actif." msgstr[1] "Il existe %d slots actifs." -#: commands/dbcommands.c:1604 +#: commands/dbcommands.c:1678 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "la base de données « %s » est utilisée par une souscription de réplication logique" -#: commands/dbcommands.c:1606 +#: commands/dbcommands.c:1680 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." msgstr[0] "Il existe %d souscription." msgstr[1] "Il existe %d souscriptions." -#: commands/dbcommands.c:1627 commands/dbcommands.c:1786 -#: commands/dbcommands.c:1916 +#: commands/dbcommands.c:1701 commands/dbcommands.c:1875 +#: commands/dbcommands.c:2002 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "la base de données « %s » est en cours d'utilisation par d'autres utilisateurs" -#: commands/dbcommands.c:1746 +#: commands/dbcommands.c:1835 #, c-format msgid "permission denied to rename database" msgstr "droit refusé pour le renommage de la base de données" -#: commands/dbcommands.c:1775 +#: commands/dbcommands.c:1864 #, c-format msgid "current database cannot be renamed" msgstr "la base de données actuelle ne peut pas être renommée" -#: commands/dbcommands.c:1872 +#: commands/dbcommands.c:1958 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "ne peut pas modifier le tablespace de la base de données actuellement ouverte" -#: commands/dbcommands.c:1978 +#: commands/dbcommands.c:2064 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "" "certaines relations de la base de données « %s » sont déjà dans le\n" "tablespace « %s »" -#: commands/dbcommands.c:1980 +#: commands/dbcommands.c:2066 #, c-format msgid "You must move them back to the database's default tablespace before using this command." msgstr "" "Vous devez d'abord les déplacer dans le tablespace par défaut de la base\n" "de données avant d'utiliser cette commande." -#: commands/dbcommands.c:2107 commands/dbcommands.c:2818 -#: commands/dbcommands.c:3082 commands/dbcommands.c:3196 +#: commands/dbcommands.c:2193 commands/dbcommands.c:2909 +#: commands/dbcommands.c:3209 commands/dbcommands.c:3322 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "" "certains fichiers inutiles pourraient se trouver dans l'ancien répertoire\n" "de la base de données « %s »" -#: commands/dbcommands.c:2168 +#: commands/dbcommands.c:2254 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "option de DROP DATABASE « %s » non reconnue" -#: commands/dbcommands.c:2246 +#: commands/dbcommands.c:2332 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "l'option « %s » ne peut pas être spécifié avec d'autres options" -#: commands/dbcommands.c:2302 +#: commands/dbcommands.c:2379 +#, fuzzy, c-format +#| msgid "cannot cluster on invalid index \"%s\"" +msgid "cannot alter invalid database \"%s\"" +msgstr "ne peut pas exécuter la commande CLUSTER sur l'index invalide « %s »" + +#: commands/dbcommands.c:2396 #, c-format msgid "cannot disallow connections for current database" msgstr "ne peut pas désactiver les connexions pour la base de données courante" -#: commands/dbcommands.c:2521 +#: commands/dbcommands.c:2611 #, c-format msgid "permission denied to change owner of database" msgstr "droit refusé pour modifier le propriétaire de la base de données" -#: commands/dbcommands.c:2924 +#: commands/dbcommands.c:3015 #, c-format msgid "There are %d other session(s) and %d prepared transaction(s) using the database." msgstr "%d autres sessions et %d transactions préparées utilisent la base de données." -#: commands/dbcommands.c:2927 +#: commands/dbcommands.c:3018 #, c-format msgid "There is %d other session using the database." msgid_plural "There are %d other sessions using the database." msgstr[0] "%d autre session utilise la base de données." msgstr[1] "%d autres sessions utilisent la base de données." -#: commands/dbcommands.c:2932 storage/ipc/procarray.c:3825 +#: commands/dbcommands.c:3023 storage/ipc/procarray.c:3798 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." msgstr[0] "%d transaction préparée utilise la base de données." msgstr[1] "%d transactions préparées utilisent la base de données." -#: commands/dbcommands.c:3038 +#: commands/dbcommands.c:3165 #, c-format msgid "missing directory \"%s\"" msgstr "répertoire « %s » manquant" -#: commands/dbcommands.c:3098 commands/tablespace.c:190 -#: commands/tablespace.c:654 +#: commands/dbcommands.c:3223 commands/tablespace.c:190 +#: commands/tablespace.c:639 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "n'a pas pu lire les informations sur le répertoire « %s » : %m" @@ -7723,30 +7909,30 @@ msgstr "l'argument de %s doit être un nom de type" msgid "invalid argument for %s: \"%s\"" msgstr "argument invalide pour %s : « %s »" -#: commands/dropcmds.c:100 commands/functioncmds.c:1394 -#: utils/adt/ruleutils.c:2908 +#: commands/dropcmds.c:101 commands/functioncmds.c:1387 +#: utils/adt/ruleutils.c:2897 #, c-format msgid "\"%s\" is an aggregate function" msgstr "« %s » est une fonction d'agrégat" -#: commands/dropcmds.c:102 +#: commands/dropcmds.c:103 #, c-format msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "Utiliser DROP AGGREGATE pour supprimer les fonctions d'agrégat." -#: commands/dropcmds.c:158 commands/sequence.c:475 commands/tablecmds.c:3613 -#: commands/tablecmds.c:3771 commands/tablecmds.c:3823 -#: commands/tablecmds.c:16435 tcop/utility.c:1332 +#: commands/dropcmds.c:158 commands/sequence.c:474 commands/tablecmds.c:3710 +#: commands/tablecmds.c:3868 commands/tablecmds.c:3920 +#: commands/tablecmds.c:16474 tcop/utility.c:1336 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "la relation « %s » n'existe pas, poursuite du traitement" -#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1278 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1285 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "le schéma « %s » n'existe pas, poursuite du traitement" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:276 +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:277 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "le type « %s » n'existe pas, poursuite du traitement" @@ -7766,7 +7952,7 @@ msgstr "le collationnement « %s » n'existe pas, poursuite du traitement" msgid "conversion \"%s\" does not exist, skipping" msgstr "la conversion « %s » n'existe pas, poursuite du traitement" -#: commands/dropcmds.c:293 commands/statscmds.c:655 +#: commands/dropcmds.c:293 commands/statscmds.c:654 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "l'objet statistique « %s » n'existe pas, poursuite du traitement" @@ -7923,18 +8109,23 @@ msgstr "les triggers sur événement ne sont pas supportés pour %s" msgid "filter variable \"%s\" specified more than once" msgstr "variable « %s » du filtre spécifiée plus d'une fois" -#: commands/event_trigger.c:377 commands/event_trigger.c:421 -#: commands/event_trigger.c:515 +#: commands/event_trigger.c:376 commands/event_trigger.c:420 +#: commands/event_trigger.c:514 #, c-format msgid "event trigger \"%s\" does not exist" msgstr "le trigger sur événement « %s » n'existe pas" -#: commands/event_trigger.c:483 +#: commands/event_trigger.c:452 +#, c-format +msgid "event trigger with OID %u does not exist" +msgstr "le trigger sur événement d'OID %u n'existe pas" + +#: commands/event_trigger.c:482 #, c-format msgid "permission denied to change owner of event trigger \"%s\"" msgstr "droit refusé pour modifier le propriétaire du trigger sur événement « %s »" -#: commands/event_trigger.c:485 +#: commands/event_trigger.c:484 #, c-format msgid "The owner of an event trigger must be a superuser." msgstr "Le propriétaire du trigger sur événement doit être un super-utilisateur." @@ -7944,301 +8135,331 @@ msgstr "Le propriétaire du trigger sur événement doit être un super-utilisat msgid "%s can only be called in a sql_drop event trigger function" msgstr "%s peut seulement être appelé dans une fonction de trigger sur événement sql_drop" -#: commands/event_trigger.c:1400 commands/event_trigger.c:1421 +#: commands/event_trigger.c:1397 commands/event_trigger.c:1418 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" msgstr "%s peut seulement être appelé dans une fonction de trigger sur événement table_rewrite" -#: commands/event_trigger.c:1834 +#: commands/event_trigger.c:1831 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s peut seulement être appelé dans une fonction de trigger sur événement" -#: commands/explain.c:218 +#: commands/explain.c:220 #, c-format msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" msgstr "valeur non reconnue pour l'option « %s » d'EXPLAIN : « %s »" -#: commands/explain.c:225 +#: commands/explain.c:227 #, c-format msgid "unrecognized EXPLAIN option \"%s\"" msgstr "option d'EXPLAIN « %s » non reconnue" -#: commands/explain.c:233 +#: commands/explain.c:236 #, c-format msgid "EXPLAIN option WAL requires ANALYZE" msgstr "l'option WAL d'EXPLAIN nécessite ANALYZE" -#: commands/explain.c:242 +#: commands/explain.c:245 #, c-format msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "l'option TIMING d'EXPLAIN nécessite ANALYZE" -#: commands/extension.c:173 commands/extension.c:2936 +#: commands/explain.c:251 +#, fuzzy, c-format +#| msgid "options -d/--dbname and -f/--file cannot be used together" +msgid "EXPLAIN options ANALYZE and GENERIC_PLAN cannot be used together" +msgstr "les options « -d/--dbname » et « -f/--file » ne peuvent pas être utilisées ensemble" + +#: commands/extension.c:177 commands/extension.c:3033 #, c-format msgid "extension \"%s\" does not exist" msgstr "l'extension « %s » n'existe pas" -#: commands/extension.c:272 commands/extension.c:281 commands/extension.c:293 -#: commands/extension.c:303 +#: commands/extension.c:276 commands/extension.c:285 commands/extension.c:297 +#: commands/extension.c:307 #, c-format msgid "invalid extension name: \"%s\"" msgstr "nom d'extension invalide : « %s »" -#: commands/extension.c:273 +#: commands/extension.c:277 #, c-format msgid "Extension names must not be empty." msgstr "Les noms d'extension ne doivent pas être vides." -#: commands/extension.c:282 +#: commands/extension.c:286 #, c-format msgid "Extension names must not contain \"--\"." msgstr "Les noms d'extension ne doivent pas contenir « -- »." -#: commands/extension.c:294 +#: commands/extension.c:298 #, c-format msgid "Extension names must not begin or end with \"-\"." msgstr "Les noms des extensions ne doivent pas commencer ou finir avec un tiret (« - »)." -#: commands/extension.c:304 +#: commands/extension.c:308 #, c-format msgid "Extension names must not contain directory separator characters." msgstr "Les noms des extensions ne doivent pas contenir des caractères séparateurs de répertoire." -#: commands/extension.c:319 commands/extension.c:328 commands/extension.c:337 -#: commands/extension.c:347 +#: commands/extension.c:323 commands/extension.c:332 commands/extension.c:341 +#: commands/extension.c:351 #, c-format msgid "invalid extension version name: \"%s\"" msgstr "nom de version de l'extension invalide : « %s »" -#: commands/extension.c:320 +#: commands/extension.c:324 #, c-format msgid "Version names must not be empty." msgstr "Les noms de version ne doivent pas être vides." -#: commands/extension.c:329 +#: commands/extension.c:333 #, c-format msgid "Version names must not contain \"--\"." msgstr "Les noms de version ne doivent pas contenir « -- »." -#: commands/extension.c:338 +#: commands/extension.c:342 #, c-format msgid "Version names must not begin or end with \"-\"." msgstr "Les noms de version ne doivent ni commencer ni se terminer avec un tiret." -#: commands/extension.c:348 +#: commands/extension.c:352 #, c-format msgid "Version names must not contain directory separator characters." msgstr "" "Les noms de version ne doivent pas contenir de caractères séparateurs de\n" "répertoire." -#: commands/extension.c:502 +#: commands/extension.c:506 #, c-format msgid "extension \"%s\" is not available" msgstr "l'extension « %s » n'est pas disponible" -#: commands/extension.c:503 +#: commands/extension.c:507 #, fuzzy, c-format #| msgid "could not open extension control file \"%s\": %m" msgid "Could not open extension control file \"%s\": %m." msgstr "n'a pas pu ouvrir le fichier de contrôle d'extension « %s » : %m" -#: commands/extension.c:505 +#: commands/extension.c:509 #, c-format msgid "The extension must first be installed on the system where PostgreSQL is running." msgstr "Les extensions doivent tout d'abord être installées sur le système où PostgreSQL est exécuté." -#: commands/extension.c:509 +#: commands/extension.c:513 #, c-format msgid "could not open extension control file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier de contrôle d'extension « %s » : %m" -#: commands/extension.c:531 commands/extension.c:541 +#: commands/extension.c:536 commands/extension.c:546 #, c-format msgid "parameter \"%s\" cannot be set in a secondary extension control file" msgstr "" "le paramètre « %s » ne peut pas être configuré dans un fichier de contrôle\n" "secondaire de l'extension" -#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 -#: utils/misc/guc.c:7380 +#: commands/extension.c:568 commands/extension.c:576 commands/extension.c:584 +#: utils/misc/guc.c:3098 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "le paramètre « %s » requiert une valeur booléenne" -#: commands/extension.c:588 +#: commands/extension.c:593 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "« %s » n'est pas un nom d'encodage valide" -#: commands/extension.c:602 +#: commands/extension.c:607 commands/extension.c:622 #, c-format msgid "parameter \"%s\" must be a list of extension names" msgstr "l'argument « %s » doit être une liste de noms d'extension" -#: commands/extension.c:609 +#: commands/extension.c:629 #, c-format msgid "unrecognized parameter \"%s\" in file \"%s\"" msgstr "paramètre « %s » non reconnu dans le fichier « %s »" -#: commands/extension.c:618 +#: commands/extension.c:638 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "le paramètre « schema » ne peut pas être indiqué quand « relocatable » est vrai" -#: commands/extension.c:796 +#: commands/extension.c:816 #, c-format msgid "transaction control statements are not allowed within an extension script" msgstr "" "les instructions de contrôle des transactions ne sont pas autorisées dans un\n" "script d'extension" -#: commands/extension.c:873 +#: commands/extension.c:896 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "droit refusé pour créer l'extension « %s »" -#: commands/extension.c:876 +#: commands/extension.c:899 #, c-format msgid "Must have CREATE privilege on current database to create this extension." msgstr "Doit avoir le droit CREATE sur la base actuelle pour créer cette extension." -#: commands/extension.c:877 +#: commands/extension.c:900 #, c-format msgid "Must be superuser to create this extension." msgstr "Doit être super-utilisateur pour créer cette extension." -#: commands/extension.c:881 +#: commands/extension.c:904 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "droit refusé pour mettre à jour l'extension « %s »" -#: commands/extension.c:884 +#: commands/extension.c:907 #, c-format msgid "Must have CREATE privilege on current database to update this extension." msgstr "Doit avoir le droit CREATE sur la base actuelle pour mettre à jour cette extension." -#: commands/extension.c:885 +#: commands/extension.c:908 #, c-format msgid "Must be superuser to update this extension." msgstr "Doit être super-utilisateur pour mettre à jour cette extension." -#: commands/extension.c:1216 +#: commands/extension.c:1046 +#, fuzzy, c-format +#| msgid "invalid mode character: must be one of \"%s\"" +msgid "invalid character in extension owner: must not contain any of \"%s\"" +msgstr "mode caractère invalide : doit faire partie de « %s »" + +#: commands/extension.c:1070 commands/extension.c:1097 +#, fuzzy, c-format +#| msgid "invalid mode character: must be one of \"%s\"" +msgid "invalid character in extension \"%s\" schema: must not contain any of \"%s\"" +msgstr "mode caractère invalide : doit faire partie de « %s »" + +#: commands/extension.c:1292 #, c-format msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgstr "l'extension « %s » n'a pas de chemin de mise à jour pour aller de la version « %s » à la version « %s »" -#: commands/extension.c:1424 commands/extension.c:2994 +#: commands/extension.c:1500 commands/extension.c:3091 #, c-format msgid "version to install must be specified" msgstr "la version à installer doit être précisée" -#: commands/extension.c:1461 +#: commands/extension.c:1537 #, c-format msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" msgstr "l'extension « %s » n'a pas de script d'installation ou de chemin de mise à jour pour la version « %s »" -#: commands/extension.c:1495 +#: commands/extension.c:1571 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "l'extension « %s » doit être installée dans le schéma « %s »" -#: commands/extension.c:1655 +#: commands/extension.c:1731 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "dépendance cyclique détectée entre les extensions « %s » et « %s »" -#: commands/extension.c:1660 +#: commands/extension.c:1736 #, c-format msgid "installing required extension \"%s\"" msgstr "installation de l'extension requise « %s »" -#: commands/extension.c:1683 +#: commands/extension.c:1759 #, c-format msgid "required extension \"%s\" is not installed" msgstr "l'extension « %s » requise n'est pas installée" -#: commands/extension.c:1686 +#: commands/extension.c:1762 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "Utilisez CREATE EXTENSION ... CASCADE pour installer également les extensions requises." -#: commands/extension.c:1721 +#: commands/extension.c:1797 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "l'extension « %s » existe déjà, poursuite du traitement" -#: commands/extension.c:1728 +#: commands/extension.c:1804 #, c-format msgid "extension \"%s\" already exists" msgstr "l'extension « %s » existe déjà" -#: commands/extension.c:1739 +#: commands/extension.c:1815 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "le CREATE EXTENSION imbriqué n'est pas supporté" -#: commands/extension.c:1903 +#: commands/extension.c:1979 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "ne peut pas supprimer l'extension « %s » car il est en cours de modification" -#: commands/extension.c:2380 +#: commands/extension.c:2454 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "%s ne peut être appelé qu'à partir d'un script SQL exécuté par CREATE EXTENSION" -#: commands/extension.c:2392 +#: commands/extension.c:2466 #, c-format msgid "OID %u does not refer to a table" msgstr "l'OID %u ne fait pas référence à une table" -#: commands/extension.c:2397 +#: commands/extension.c:2471 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "la table « %s » n'est pas un membre de l'extension en cours de création" -#: commands/extension.c:2751 +#: commands/extension.c:2817 #, c-format msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" msgstr "" "ne peut pas déplacer l'extension « %s » dans le schéma « %s » car l'extension\n" "contient le schéma" -#: commands/extension.c:2792 commands/extension.c:2855 +#: commands/extension.c:2858 commands/extension.c:2952 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "l'extension « %s » ne supporte pas SET SCHEMA" -#: commands/extension.c:2857 +#: commands/extension.c:2915 +#, fuzzy, c-format +#| msgid "cannot drop extension \"%s\" because it is being modified" +msgid "cannot SET SCHEMA of extension \"%s\" because other extensions prevent it" +msgstr "ne peut pas supprimer l'extension « %s » car il est en cours de modification" + +#: commands/extension.c:2917 +#, fuzzy, c-format +#| msgid "relation \"%s\" is not a partition of relation \"%s\"" +msgid "Extension \"%s\" requests no relocation of extension \"%s\"." +msgstr "la relation « %s » n'est pas une partition de la relation « %s »" + +#: commands/extension.c:2954 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "%s n'est pas dans le schéma de l'extension « %s »" -#: commands/extension.c:2916 +#: commands/extension.c:3013 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "un ALTER EXTENSION imbriqué n'est pas supporté" -#: commands/extension.c:3005 +#: commands/extension.c:3102 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "la version « %s » de l'extension « %s » est déjà installée" -#: commands/extension.c:3217 +#: commands/extension.c:3314 #, c-format msgid "cannot add an object of this type to an extension" msgstr "ne peut pas ajouter un objet de ce type à une extension" -#: commands/extension.c:3283 +#: commands/extension.c:3380 #, c-format msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "" "ne peut pas ajouter le schéma « %s » à l'extension « %s » car le schéma\n" "contient l'extension" -#: commands/extension.c:3377 +#: commands/extension.c:3474 #, c-format msgid "file \"%s\" is too large" msgstr "le fichier « %s » est trop gros" @@ -8270,11 +8491,21 @@ msgstr "" msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "Le propriétaire du wrapper de données distantes doit être un super-utilisateur." -#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:669 +#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:678 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "le wrapper de données distantes « %s » n'existe pas" +#: commands/foreigncmds.c:325 +#, c-format +msgid "foreign-data wrapper with OID %u does not exist" +msgstr "le wrapper de données distantes d'OID %u n'existe pas" + +#: commands/foreigncmds.c:462 +#, c-format +msgid "foreign server with OID %u does not exist" +msgstr "le serveur distant d'OID %u n'existe pas" + #: commands/foreigncmds.c:580 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" @@ -8334,7 +8565,7 @@ msgstr "la correspondance d'utilisateur « %s » n'existe pas pour le serveur « msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "la correspondance d'utilisateur « %s » n'existe pas pour le serveur « %s », poursuite du traitement" -#: commands/foreigncmds.c:1507 foreign/foreign.c:390 +#: commands/foreigncmds.c:1507 foreign/foreign.c:391 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "le wrapper de données distantes « %s » n'a pas de gestionnaire" @@ -8359,665 +8590,665 @@ msgstr "la fonction SQL ne peut pas retourner le type shell %s" msgid "return type %s is only a shell" msgstr "le type de retour %s est seulement un shell" -#: commands/functioncmds.c:144 parser/parse_type.c:354 +#: commands/functioncmds.c:143 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "le modificateur de type ne peut pas être précisé pour le type shell « %s »" -#: commands/functioncmds.c:150 +#: commands/functioncmds.c:149 #, c-format msgid "type \"%s\" is not yet defined" msgstr "le type « %s » n'est pas encore défini" -#: commands/functioncmds.c:151 +#: commands/functioncmds.c:150 #, c-format msgid "Creating a shell type definition." msgstr "Création d'une définition d'un type shell." -#: commands/functioncmds.c:250 +#: commands/functioncmds.c:249 #, c-format msgid "SQL function cannot accept shell type %s" msgstr "la fonction SQL ne peut pas accepter le type shell %s" -#: commands/functioncmds.c:256 +#: commands/functioncmds.c:255 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "l'agrégat ne peut pas accepter le type shell %s" -#: commands/functioncmds.c:261 +#: commands/functioncmds.c:260 #, c-format msgid "argument type %s is only a shell" msgstr "le type d'argument %s n'est qu'une enveloppe" -#: commands/functioncmds.c:271 +#: commands/functioncmds.c:270 #, c-format msgid "type %s does not exist" msgstr "le type %s n'existe pas" -#: commands/functioncmds.c:285 +#: commands/functioncmds.c:284 #, c-format msgid "aggregates cannot accept set arguments" msgstr "les agrégats ne peuvent pas utiliser des ensembles comme arguments" -#: commands/functioncmds.c:289 +#: commands/functioncmds.c:288 #, c-format msgid "procedures cannot accept set arguments" msgstr "les procédures ne peuvent pas utiliser des arguments d'ensemble" -#: commands/functioncmds.c:293 +#: commands/functioncmds.c:292 #, c-format msgid "functions cannot accept set arguments" msgstr "les fonctions ne peuvent pas accepter des arguments d'ensemble" -#: commands/functioncmds.c:303 +#: commands/functioncmds.c:302 #, c-format msgid "VARIADIC parameter must be the last input parameter" msgstr "le paramètre VARIADIC doit être le dernier paramètre en entrée" -#: commands/functioncmds.c:323 +#: commands/functioncmds.c:322 #, c-format msgid "VARIADIC parameter must be the last parameter" msgstr "le paramètre VARIADIC doit être le dernier paramètre" -#: commands/functioncmds.c:348 +#: commands/functioncmds.c:347 #, c-format msgid "VARIADIC parameter must be an array" msgstr "le paramètre VARIADIC doit être un tableau" -#: commands/functioncmds.c:393 +#: commands/functioncmds.c:392 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "le nom du paramètre « %s » est utilisé plus d'une fois" -#: commands/functioncmds.c:411 +#: commands/functioncmds.c:410 #, c-format msgid "only input parameters can have default values" msgstr "seuls les paramètres en entrée peuvent avoir des valeurs par défaut" -#: commands/functioncmds.c:426 +#: commands/functioncmds.c:425 #, c-format msgid "cannot use table references in parameter default value" msgstr "" "ne peut pas utiliser les références de tables dans la valeur par défaut des\n" "paramètres" -#: commands/functioncmds.c:450 +#: commands/functioncmds.c:449 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "les paramètres en entrée suivant un paramètre avec valeur par défaut doivent aussi avoir des valeurs par défaut" -#: commands/functioncmds.c:460 +#: commands/functioncmds.c:459 #, c-format msgid "procedure OUT parameters cannot appear after one with a default value" msgstr "les paramètres OUT d'une procédure ne peuvent pas apparaître après un paramètre ayant une valeur par défaut" -#: commands/functioncmds.c:605 commands/functioncmds.c:784 +#: commands/functioncmds.c:601 commands/functioncmds.c:780 #, c-format msgid "invalid attribute in procedure definition" msgstr "attribute invalide dans la définition de la procédure" -#: commands/functioncmds.c:701 +#: commands/functioncmds.c:697 #, c-format msgid "support function %s must return type %s" msgstr "la fonction de support %s doit renvoyer le type %s" -#: commands/functioncmds.c:712 +#: commands/functioncmds.c:708 #, c-format msgid "must be superuser to specify a support function" msgstr "doit être super-utilisateur pour spécifier une fonction de support" -#: commands/functioncmds.c:833 commands/functioncmds.c:1439 +#: commands/functioncmds.c:829 commands/functioncmds.c:1432 #, c-format msgid "COST must be positive" msgstr "COST doit être positif" -#: commands/functioncmds.c:841 commands/functioncmds.c:1447 +#: commands/functioncmds.c:837 commands/functioncmds.c:1440 #, c-format msgid "ROWS must be positive" msgstr "ROWS doit être positif" -#: commands/functioncmds.c:870 +#: commands/functioncmds.c:866 #, c-format msgid "no function body specified" msgstr "aucun corps de fonction spécifié" -#: commands/functioncmds.c:875 +#: commands/functioncmds.c:871 #, c-format msgid "duplicate function body specified" msgstr "corps de fonction dupliqué spécifié" -#: commands/functioncmds.c:880 +#: commands/functioncmds.c:876 #, c-format msgid "inline SQL function body only valid for language SQL" msgstr "le corps d'une fonction SQL est seulement valide pour le langage SQL" -#: commands/functioncmds.c:922 +#: commands/functioncmds.c:918 #, c-format msgid "SQL function with unquoted function body cannot have polymorphic arguments" msgstr "la fonction SQL avec un corps de fonction sans guillemets ne peut pas avoir des arguments polymorphiques" -#: commands/functioncmds.c:948 commands/functioncmds.c:967 +#: commands/functioncmds.c:944 commands/functioncmds.c:963 #, c-format msgid "%s is not yet supported in unquoted SQL function body" msgstr "%s n'est pas encore accepté dans une corps de fonction SQL sans guillemets" -#: commands/functioncmds.c:995 +#: commands/functioncmds.c:991 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "seul un élément AS est nécessaire pour le langage « %s »" -#: commands/functioncmds.c:1100 +#: commands/functioncmds.c:1096 #, c-format msgid "no language specified" msgstr "aucun langage spécifié" -#: commands/functioncmds.c:1108 commands/functioncmds.c:2109 +#: commands/functioncmds.c:1104 commands/functioncmds.c:2105 #: commands/proclang.c:237 #, c-format msgid "language \"%s\" does not exist" msgstr "le langage « %s » n'existe pas" -#: commands/functioncmds.c:1110 commands/functioncmds.c:2111 +#: commands/functioncmds.c:1106 commands/functioncmds.c:2107 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "Utiliser CREATE EXTENSION pour charger le langage dans la base de données." -#: commands/functioncmds.c:1145 commands/functioncmds.c:1431 +#: commands/functioncmds.c:1139 commands/functioncmds.c:1424 #, c-format msgid "only superuser can define a leakproof function" msgstr "seul un superutilisateur peut définir une fonction leakproof" -#: commands/functioncmds.c:1196 +#: commands/functioncmds.c:1190 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "le type de résultat de la fonction doit être %s à cause des paramètres OUT" -#: commands/functioncmds.c:1209 +#: commands/functioncmds.c:1203 #, c-format msgid "function result type must be specified" msgstr "le type de résultat de la fonction doit être spécifié" -#: commands/functioncmds.c:1263 commands/functioncmds.c:1451 +#: commands/functioncmds.c:1256 commands/functioncmds.c:1444 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "ROWS n'est pas applicable quand la fonction ne renvoie pas un ensemble" -#: commands/functioncmds.c:1552 +#: commands/functioncmds.c:1547 #, c-format msgid "source data type %s is a pseudo-type" msgstr "le type de données source %s est un pseudo-type" -#: commands/functioncmds.c:1558 +#: commands/functioncmds.c:1553 #, c-format msgid "target data type %s is a pseudo-type" msgstr "le type de données cible %s est un pseudo-type" -#: commands/functioncmds.c:1582 +#: commands/functioncmds.c:1577 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "la conversion sera ignorée car le type de données source est un domaine" -#: commands/functioncmds.c:1587 +#: commands/functioncmds.c:1582 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "la conversion sera ignorée car le type de données cible est un domaine" -#: commands/functioncmds.c:1612 +#: commands/functioncmds.c:1607 #, c-format msgid "cast function must take one to three arguments" msgstr "la fonction de conversion doit prendre de un à trois arguments" -#: commands/functioncmds.c:1616 +#: commands/functioncmds.c:1613 #, c-format msgid "argument of cast function must match or be binary-coercible from source data type" msgstr "l'argument de la fonction de conversion doit correspondre ou être binary-coercible à partir du type de la donnée source" -#: commands/functioncmds.c:1620 +#: commands/functioncmds.c:1617 #, c-format msgid "second argument of cast function must be type %s" msgstr "le second argument de la fonction de conversion doit être de type %s" -#: commands/functioncmds.c:1625 +#: commands/functioncmds.c:1622 #, c-format msgid "third argument of cast function must be type %s" msgstr "le troisième argument de la fonction de conversion doit être de type %s" -#: commands/functioncmds.c:1630 +#: commands/functioncmds.c:1629 #, c-format msgid "return data type of cast function must match or be binary-coercible to target data type" msgstr "" "le type de donnée en retour de la fonction de conversion doit correspondre\n" "ou être coercible binairement au type de données cible" -#: commands/functioncmds.c:1641 +#: commands/functioncmds.c:1640 #, c-format msgid "cast function must not be volatile" msgstr "la fonction de conversion ne doit pas être volatile" -#: commands/functioncmds.c:1646 +#: commands/functioncmds.c:1645 #, c-format msgid "cast function must be a normal function" msgstr "la fonction de conversion doit être une fonction normale" -#: commands/functioncmds.c:1650 +#: commands/functioncmds.c:1649 #, c-format msgid "cast function must not return a set" msgstr "la fonction de conversion ne doit pas renvoyer un ensemble" -#: commands/functioncmds.c:1676 +#: commands/functioncmds.c:1675 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "doit être super-utilisateur pour créer une fonction de conversion SANS FONCTION" -#: commands/functioncmds.c:1691 +#: commands/functioncmds.c:1690 #, c-format msgid "source and target data types are not physically compatible" msgstr "les types de données source et cible ne sont pas physiquement compatibles" -#: commands/functioncmds.c:1706 +#: commands/functioncmds.c:1705 #, c-format msgid "composite data types are not binary-compatible" msgstr "les types de données composites ne sont pas compatibles binairement" -#: commands/functioncmds.c:1712 +#: commands/functioncmds.c:1711 #, c-format msgid "enum data types are not binary-compatible" msgstr "les types de données enum ne sont pas compatibles binairement" -#: commands/functioncmds.c:1718 +#: commands/functioncmds.c:1717 #, c-format msgid "array data types are not binary-compatible" msgstr "les types de données tableau ne sont pas compatibles binairement" -#: commands/functioncmds.c:1735 +#: commands/functioncmds.c:1734 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "les types de données domaines ne sont pas compatibles binairement" -#: commands/functioncmds.c:1745 +#: commands/functioncmds.c:1744 #, c-format msgid "source data type and target data type are the same" msgstr "les types de données source et cible sont identiques" -#: commands/functioncmds.c:1778 +#: commands/functioncmds.c:1777 #, c-format msgid "transform function must not be volatile" msgstr "la fonction de transformation ne doit pas être volatile" -#: commands/functioncmds.c:1782 +#: commands/functioncmds.c:1781 #, c-format msgid "transform function must be a normal function" msgstr "la fonction de transformation doit être une fonction normale" -#: commands/functioncmds.c:1786 +#: commands/functioncmds.c:1785 #, c-format msgid "transform function must not return a set" msgstr "la fonction de transformation ne doit pas renvoyer un ensemble" -#: commands/functioncmds.c:1790 +#: commands/functioncmds.c:1789 #, c-format msgid "transform function must take one argument" msgstr "la fonction de transformation doit prendre de un argument" -#: commands/functioncmds.c:1794 +#: commands/functioncmds.c:1793 #, c-format msgid "first argument of transform function must be type %s" msgstr "le premier argument de la fonction de transformation doit être de type %s" -#: commands/functioncmds.c:1833 +#: commands/functioncmds.c:1832 #, c-format msgid "data type %s is a pseudo-type" msgstr "le type de données %s est un pseudo-type" -#: commands/functioncmds.c:1839 +#: commands/functioncmds.c:1838 #, c-format msgid "data type %s is a domain" msgstr "le type de données %s est un domaine" -#: commands/functioncmds.c:1879 +#: commands/functioncmds.c:1878 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "le type de donnée en retour de la fonction FROM SQL doit être %s" -#: commands/functioncmds.c:1905 +#: commands/functioncmds.c:1904 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "le type de donnée en retour de la fonction TO SQL doit être du type de données de la transformation" -#: commands/functioncmds.c:1934 +#: commands/functioncmds.c:1931 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "la transformation pour le type %s et le langage « %s » existe déjà" -#: commands/functioncmds.c:2021 +#: commands/functioncmds.c:2017 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "la transformation pour le type %s et le langage « %s » n'existe pas" -#: commands/functioncmds.c:2045 +#: commands/functioncmds.c:2041 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "la fonction %s existe déjà dans le schéma « %s »" -#: commands/functioncmds.c:2096 +#: commands/functioncmds.c:2092 #, c-format msgid "no inline code specified" msgstr "aucun code en ligne spécifié" -#: commands/functioncmds.c:2142 +#: commands/functioncmds.c:2138 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "le langage « %s » ne supporte pas l'exécution de code en ligne" -#: commands/functioncmds.c:2237 +#: commands/functioncmds.c:2233 #, c-format msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" msgstr[0] "ne peut pas passer plus de %d argument à une procédure" msgstr[1] "ne peut pas passer plus de %d arguments à une procédure" -#: commands/indexcmds.c:634 +#: commands/indexcmds.c:640 #, c-format msgid "must specify at least one column" msgstr "doit spécifier au moins une colonne" -#: commands/indexcmds.c:638 +#: commands/indexcmds.c:644 #, c-format msgid "cannot use more than %d columns in an index" msgstr "ne peut pas utiliser plus de %d colonnes dans un index" -#: commands/indexcmds.c:681 +#: commands/indexcmds.c:687 #, c-format msgid "cannot create index on relation \"%s\"" msgstr "ne peut pas créer un index sur la relation « %s »" -#: commands/indexcmds.c:707 +#: commands/indexcmds.c:713 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "ne peut pas créer un index sur la table partitionnée « %s » de manière concurrente" -#: commands/indexcmds.c:712 +#: commands/indexcmds.c:718 #, c-format msgid "cannot create exclusion constraints on partitioned table \"%s\"" msgstr "ne peut pas créer de contraintes d'exclusion sur la table partitionnée « %s »" -#: commands/indexcmds.c:722 +#: commands/indexcmds.c:728 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "ne peut pas créer les index sur les tables temporaires des autres sessions" -#: commands/indexcmds.c:760 commands/tablecmds.c:781 commands/tablespace.c:1204 +#: commands/indexcmds.c:766 commands/tablecmds.c:784 commands/tablespace.c:1184 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "ne peut pas spécifier un tablespace par défaut pour les relations partitionnées" -#: commands/indexcmds.c:792 commands/tablecmds.c:816 commands/tablecmds.c:3312 +#: commands/indexcmds.c:798 commands/tablecmds.c:819 commands/tablecmds.c:3409 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "seules les relations partagées peuvent être placées dans le tablespace pg_global" -#: commands/indexcmds.c:825 +#: commands/indexcmds.c:831 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "substitution de la méthode d'accès obsolète « rtree » par « gist »" -#: commands/indexcmds.c:846 +#: commands/indexcmds.c:852 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "la méthode d'accès « %s » ne supporte pas les index uniques" -#: commands/indexcmds.c:851 +#: commands/indexcmds.c:857 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "la méthode d'accès « %s » ne supporte pas les colonnes incluses" -#: commands/indexcmds.c:856 +#: commands/indexcmds.c:862 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "la méthode d'accès « %s » ne supporte pas les index multi-colonnes" -#: commands/indexcmds.c:861 +#: commands/indexcmds.c:867 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "la méthode d'accès « %s » ne supporte pas les contraintes d'exclusion" -#: commands/indexcmds.c:986 +#: commands/indexcmds.c:994 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "ne peut pas faire correspondre la clé de partitionnement à un index utilisant la méthode d'accès « %s »" -#: commands/indexcmds.c:996 +#: commands/indexcmds.c:1004 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "contrainte %s non supportée avec la définition de clé de partitionnement" -#: commands/indexcmds.c:998 +#: commands/indexcmds.c:1006 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "les contraintes %s ne peuvent pas être utilisées quand les clés de partitionnement incluent des expressions." -#: commands/indexcmds.c:1037 +#: commands/indexcmds.c:1045 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "la contrainte unique sur la table partitionnée doit inclure toutes les colonnes de partitionnement" -#: commands/indexcmds.c:1038 +#: commands/indexcmds.c:1046 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "la contrainte %s sur la table « %s » ne contient pas la colonne « %s » qui fait partie de la clé de partitionnement." -#: commands/indexcmds.c:1057 commands/indexcmds.c:1076 +#: commands/indexcmds.c:1065 commands/indexcmds.c:1084 #, c-format msgid "index creation on system columns is not supported" msgstr "la création d'un index sur les tables du catalogue système n'est pas supportée" -#: commands/indexcmds.c:1276 tcop/utility.c:1518 +#: commands/indexcmds.c:1313 tcop/utility.c:1526 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "ne peut pas créer un index unique sur la table partitionnée « %s »" -#: commands/indexcmds.c:1278 tcop/utility.c:1520 +#: commands/indexcmds.c:1315 tcop/utility.c:1528 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "La table « %s » contient des partitions qui ne sont pas des tables distantes." -#: commands/indexcmds.c:1750 +#: commands/indexcmds.c:1827 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "les fonctions dans un prédicat d'index doivent être marquées comme IMMUTABLE" -#: commands/indexcmds.c:1828 parser/parse_utilcmd.c:2528 -#: parser/parse_utilcmd.c:2663 +#: commands/indexcmds.c:1905 parser/parse_utilcmd.c:2513 +#: parser/parse_utilcmd.c:2648 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "la colonne « %s » nommée dans la clé n'existe pas" -#: commands/indexcmds.c:1852 parser/parse_utilcmd.c:1825 +#: commands/indexcmds.c:1929 parser/parse_utilcmd.c:1812 #, c-format msgid "expressions are not supported in included columns" msgstr "les expressions ne sont pas supportées dans les colonnes incluses" -#: commands/indexcmds.c:1893 +#: commands/indexcmds.c:1970 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "" "les fonctions dans l'expression de l'index doivent être marquées comme\n" "IMMUTABLE" -#: commands/indexcmds.c:1908 +#: commands/indexcmds.c:1985 #, c-format msgid "including column does not support a collation" msgstr "une colonne incluse ne supporte pas de collationnement" -#: commands/indexcmds.c:1912 +#: commands/indexcmds.c:1989 #, c-format msgid "including column does not support an operator class" msgstr "une colonne incluse ne supporte pas de classe d'opérateur" -#: commands/indexcmds.c:1916 +#: commands/indexcmds.c:1993 #, c-format msgid "including column does not support ASC/DESC options" msgstr "une colonne incluse ne supporte pas d'options ASC/DESC" -#: commands/indexcmds.c:1920 +#: commands/indexcmds.c:1997 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "une colonne incluse ne supporte pas d'options NULLS FIRST/LAST" -#: commands/indexcmds.c:1961 +#: commands/indexcmds.c:2038 #, c-format msgid "could not determine which collation to use for index expression" msgstr "n'a pas pu déterminer le collationnement à utiliser pour l'expression d'index" -#: commands/indexcmds.c:1969 commands/tablecmds.c:17450 commands/typecmds.c:807 -#: parser/parse_expr.c:2690 parser/parse_type.c:570 parser/parse_utilcmd.c:3795 -#: utils/adt/misc.c:601 +#: commands/indexcmds.c:2046 commands/tablecmds.c:17487 commands/typecmds.c:807 +#: parser/parse_expr.c:2722 parser/parse_type.c:568 parser/parse_utilcmd.c:3774 +#: utils/adt/misc.c:586 #, c-format msgid "collations are not supported by type %s" msgstr "les collationnements ne sont pas supportés par le type %s" -#: commands/indexcmds.c:2034 +#: commands/indexcmds.c:2111 #, c-format msgid "operator %s is not commutative" msgstr "l'opérateur %s n'est pas commutatif" -#: commands/indexcmds.c:2036 +#: commands/indexcmds.c:2113 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "Seuls les opérateurs commutatifs peuvent être utilisés dans les contraintes d'exclusion." -#: commands/indexcmds.c:2062 +#: commands/indexcmds.c:2139 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "l'opérateur %s n'est pas un membre de la famille d'opérateur « %s »" -#: commands/indexcmds.c:2065 +#: commands/indexcmds.c:2142 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "" "L'opérateur d'exclusion doit être en relation avec la classe d'opérateur de\n" "l'index pour la contrainte." -#: commands/indexcmds.c:2100 +#: commands/indexcmds.c:2177 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "la méthode d'accès « %s » ne supporte pas les options ASC/DESC" -#: commands/indexcmds.c:2105 +#: commands/indexcmds.c:2182 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "la méthode d'accès « %s » ne supporte pas les options NULLS FIRST/LAST" -#: commands/indexcmds.c:2151 commands/tablecmds.c:17475 -#: commands/tablecmds.c:17481 commands/typecmds.c:2302 +#: commands/indexcmds.c:2228 commands/tablecmds.c:17512 +#: commands/tablecmds.c:17518 commands/typecmds.c:2301 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "" "le type de données %s n'a pas de classe d'opérateurs par défaut pour la\n" "méthode d'accès « %s »" -#: commands/indexcmds.c:2153 +#: commands/indexcmds.c:2230 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." msgstr "" "Vous devez spécifier une classe d'opérateur pour l'index ou définir une\n" "classe d'opérateur par défaut pour le type de données." -#: commands/indexcmds.c:2182 commands/indexcmds.c:2190 +#: commands/indexcmds.c:2259 commands/indexcmds.c:2267 #: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "la classe d'opérateur « %s » n'existe pas pour la méthode d'accès « %s »" -#: commands/indexcmds.c:2204 commands/typecmds.c:2290 +#: commands/indexcmds.c:2281 commands/typecmds.c:2289 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "la classe d'opérateur « %s » n'accepte pas le type de données %s" -#: commands/indexcmds.c:2294 +#: commands/indexcmds.c:2371 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "" "il existe de nombreuses classes d'opérateur par défaut pour le type de\n" "données %s" -#: commands/indexcmds.c:2622 +#: commands/indexcmds.c:2699 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "option de REINDEX « %s » non reconnue" -#: commands/indexcmds.c:2846 +#: commands/indexcmds.c:2923 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" -msgstr "la table « %s » n'a pas d'index qui puisse être réindexé concuremment" +msgstr "la table « %s » n'a pas d'index qui puisse être réindexé concurremment" -#: commands/indexcmds.c:2860 +#: commands/indexcmds.c:2937 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "la table « %s » n'a pas d'index à réindexer" -#: commands/indexcmds.c:2900 commands/indexcmds.c:3404 -#: commands/indexcmds.c:3532 +#: commands/indexcmds.c:2982 commands/indexcmds.c:3492 +#: commands/indexcmds.c:3620 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "ne peut pas réindexer les catalogues système de manière concurrente" -#: commands/indexcmds.c:2923 +#: commands/indexcmds.c:3005 #, c-format msgid "can only reindex the currently open database" msgstr "peut seulement réindexer la base de données en cours" -#: commands/indexcmds.c:3011 +#: commands/indexcmds.c:3099 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "ne peut pas réindexer les catalogues système de manière concurrente, ignore tout" -#: commands/indexcmds.c:3044 +#: commands/indexcmds.c:3132 #, c-format msgid "cannot move system relations, skipping all" msgstr "ne peut pas déplacer les relations systèmes, toutes ignorées" -#: commands/indexcmds.c:3090 +#: commands/indexcmds.c:3178 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "lors de la réindexation de la table partitionnée « %s.%s »" -#: commands/indexcmds.c:3093 +#: commands/indexcmds.c:3181 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "lors de la réindexation de l'index partitionné « %s.%s »" -#: commands/indexcmds.c:3284 commands/indexcmds.c:4140 +#: commands/indexcmds.c:3372 commands/indexcmds.c:4228 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "la table « %s.%s » a été réindexée" -#: commands/indexcmds.c:3436 commands/indexcmds.c:3488 +#: commands/indexcmds.c:3524 commands/indexcmds.c:3576 #, c-format msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" msgstr "ne peut pas réindexer l'index invalide « %s.%s » de manière concurrente, ignoré" -#: commands/indexcmds.c:3442 +#: commands/indexcmds.c:3530 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "ne peut pas réindexer l'index de contrainte d'exclusion « %s.%s » de manière concurrente, ignoré" -#: commands/indexcmds.c:3597 +#: commands/indexcmds.c:3685 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "ne peut pas réindexer ce type de relation de manière concurrente" -#: commands/indexcmds.c:3618 +#: commands/indexcmds.c:3706 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "ne peut pas déplacer la relation non partagée dans le tablespace « %s »" -#: commands/indexcmds.c:4121 commands/indexcmds.c:4133 +#: commands/indexcmds.c:4209 commands/indexcmds.c:4221 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "l'index « %s.%s » a été réindexé" -#: commands/indexcmds.c:4123 commands/indexcmds.c:4142 +#: commands/indexcmds.c:4211 commands/indexcmds.c:4230 #, c-format msgid "%s." msgstr "%s." @@ -9032,7 +9263,7 @@ msgstr "ne peut pas verrouiller la relation « %s »" msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "CONCURRENTLY ne peut pas être utilisé quand la vue matérialisée n'est pas peuplée" -#: commands/matview.c:199 gram.y:17995 +#: commands/matview.c:199 gram.y:18306 #, c-format msgid "%s and %s options cannot be used together" msgstr "les options %s et %s ne peuvent pas être utilisées ensemble" @@ -9287,67 +9518,67 @@ msgstr "" "la famille d'opérateur « %s » de la méthode d'accès « %s » existe déjà dans\n" "le schéma « %s »" -#: commands/operatorcmds.c:111 commands/operatorcmds.c:119 +#: commands/operatorcmds.c:113 commands/operatorcmds.c:121 #, c-format msgid "SETOF type not allowed for operator argument" msgstr "type SETOF non autorisé pour l'argument de l'opérateur" -#: commands/operatorcmds.c:152 commands/operatorcmds.c:479 +#: commands/operatorcmds.c:154 commands/operatorcmds.c:481 #, c-format msgid "operator attribute \"%s\" not recognized" msgstr "l'attribut « %s » de l'opérateur n'est pas reconnu" -#: commands/operatorcmds.c:163 +#: commands/operatorcmds.c:165 #, c-format msgid "operator function must be specified" msgstr "la fonction d'opérateur doit être spécifiée" -#: commands/operatorcmds.c:181 +#: commands/operatorcmds.c:183 #, c-format msgid "operator argument types must be specified" msgstr "le type des arguments de l'opérateur doit être spécifié" -#: commands/operatorcmds.c:185 +#: commands/operatorcmds.c:187 #, c-format msgid "operator right argument type must be specified" msgstr "le type de l'argument droit de l'opérateur doit être spécifié" -#: commands/operatorcmds.c:186 +#: commands/operatorcmds.c:188 #, c-format msgid "Postfix operators are not supported." msgstr "Les opérateurs postfixes ne sont pas supportés." -#: commands/operatorcmds.c:290 +#: commands/operatorcmds.c:292 #, c-format msgid "restriction estimator function %s must return type %s" msgstr "" "la fonction d'estimation de la restriction, de nom %s, doit renvoyer le type\n" "%s" -#: commands/operatorcmds.c:333 +#: commands/operatorcmds.c:335 #, c-format msgid "join estimator function %s has multiple matches" msgstr "la fonction d'estimation de la jointure, de nom %s, a plusieurs correspondances" -#: commands/operatorcmds.c:348 +#: commands/operatorcmds.c:350 #, c-format msgid "join estimator function %s must return type %s" msgstr "" "la fonction d'estimation de la jointure, de nom %s, doit renvoyer le type\n" "%s" -#: commands/operatorcmds.c:473 +#: commands/operatorcmds.c:475 #, c-format msgid "operator attribute \"%s\" cannot be changed" msgstr "l'attribut « %s » de l'opérateur ne peut pas être changé" #: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 -#: commands/tablecmds.c:1609 commands/tablecmds.c:2197 -#: commands/tablecmds.c:3423 commands/tablecmds.c:6312 -#: commands/tablecmds.c:9104 commands/tablecmds.c:17030 -#: commands/tablecmds.c:17065 commands/trigger.c:327 commands/trigger.c:1382 -#: commands/trigger.c:1492 rewrite/rewriteDefine.c:278 -#: rewrite/rewriteDefine.c:957 rewrite/rewriteRemove.c:80 +#: commands/tablecmds.c:1616 commands/tablecmds.c:2219 +#: commands/tablecmds.c:3520 commands/tablecmds.c:6369 +#: commands/tablecmds.c:9185 commands/tablecmds.c:17076 +#: commands/tablecmds.c:17111 commands/trigger.c:323 commands/trigger.c:1339 +#: commands/trigger.c:1449 rewrite/rewriteDefine.c:275 +#: rewrite/rewriteDefine.c:786 rewrite/rewriteRemove.c:80 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "droit refusé : « %s » est un catalogue système" @@ -9355,34 +9586,34 @@ msgstr "droit refusé : « %s » est un catalogue système" #: commands/policy.c:172 #, c-format msgid "ignoring specified roles other than PUBLIC" -msgstr "ingore les rôles spécifiés autre que PUBLIC" +msgstr "ignore les rôles spécifiés autre que PUBLIC" #: commands/policy.c:173 #, c-format msgid "All roles are members of the PUBLIC role." msgstr "Tous les rôles sont membres du rôle PUBLIC." -#: commands/policy.c:607 +#: commands/policy.c:606 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "WITH CHECK ne peut pas être appliqué à SELECT et DELETE" -#: commands/policy.c:616 commands/policy.c:921 +#: commands/policy.c:615 commands/policy.c:918 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "seule une expression WITH CHECK est autorisée pour INSERT" -#: commands/policy.c:691 commands/policy.c:1144 +#: commands/policy.c:689 commands/policy.c:1141 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "la politique « %s » pour la table « %s » existe déjà" -#: commands/policy.c:893 commands/policy.c:1172 commands/policy.c:1243 +#: commands/policy.c:890 commands/policy.c:1169 commands/policy.c:1240 #, c-format msgid "policy \"%s\" for table \"%s\" does not exist" msgstr "la politique « %s » pour la table « %s » n'existe pas" -#: commands/policy.c:911 +#: commands/policy.c:908 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "seule une expression USING est autorisée pour SELECT, DELETE" @@ -9398,7 +9629,7 @@ msgid "cannot create a cursor WITH HOLD within security-restricted operation" msgstr "ne peut pas créer un curseur WITH HOLD à l'intérieur d'une opération restreinte pour sécurité" #: commands/portalcmds.c:189 commands/portalcmds.c:242 -#: executor/execCurrent.c:70 utils/adt/xml.c:2593 utils/adt/xml.c:2763 +#: executor/execCurrent.c:70 utils/adt/xml.c:2844 utils/adt/xml.c:3014 #, c-format msgid "cursor \"%s\" does not exist" msgstr "le curseur « %s » n'existe pas" @@ -9445,111 +9676,112 @@ msgstr "l'instruction préparée « %s » n'existe pas" msgid "must be superuser to create custom procedural language" msgstr "doit être super-utilisateur pour créer un langage de procédures personnalisé" -#: commands/publicationcmds.c:130 postmaster/postmaster.c:1219 -#: postmaster/postmaster.c:1318 utils/init/miscinit.c:1651 +#: commands/publicationcmds.c:131 postmaster/postmaster.c:1208 +#: postmaster/postmaster.c:1306 storage/file/fd.c:3911 +#: utils/init/miscinit.c:1815 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "syntaxe de liste invalide pour le paramètre « %s »" -#: commands/publicationcmds.c:149 +#: commands/publicationcmds.c:150 #, fuzzy, c-format #| msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" msgid "unrecognized value for publication option \"%s\": \"%s\"" msgstr "valeur non reconnue pour l'option « %s » d'EXPLAIN : « %s »" -#: commands/publicationcmds.c:163 +#: commands/publicationcmds.c:164 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "paramètre de publication non reconnu : « %s »" -#: commands/publicationcmds.c:204 +#: commands/publicationcmds.c:205 #, fuzzy, c-format #| msgid "no schema has been selected to create in" msgid "no schema has been selected for CURRENT_SCHEMA" msgstr "aucun schéma n'a été sélectionné pour cette création" -#: commands/publicationcmds.c:501 +#: commands/publicationcmds.c:502 #, fuzzy #| msgid "System catalog modifications are currently disallowed." msgid "System columns are not allowed." msgstr "Les modifications du catalogue système sont actuellement interdites." -#: commands/publicationcmds.c:508 commands/publicationcmds.c:513 -#: commands/publicationcmds.c:530 +#: commands/publicationcmds.c:509 commands/publicationcmds.c:514 +#: commands/publicationcmds.c:531 msgid "User-defined operators are not allowed." msgstr "Les opérateurs définis par les utilisateurs ne sont pas autorisés." -#: commands/publicationcmds.c:554 +#: commands/publicationcmds.c:555 msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." msgstr "" -#: commands/publicationcmds.c:566 +#: commands/publicationcmds.c:567 msgid "User-defined types are not allowed." msgstr "Les types définis par les utilisateurs ne sont pas autorisés." -#: commands/publicationcmds.c:569 +#: commands/publicationcmds.c:570 #, fuzzy #| msgid "set-returning functions are not allowed in %s" msgid "User-defined or built-in mutable functions are not allowed." msgstr "les fonctions renvoyant un ensemble ne sont pas autorisées dans %s" -#: commands/publicationcmds.c:572 +#: commands/publicationcmds.c:573 msgid "User-defined collations are not allowed." msgstr "Les collations définis par les utilisateurs ne sont pas autorisées." -#: commands/publicationcmds.c:582 +#: commands/publicationcmds.c:583 #, c-format msgid "invalid publication WHERE expression" msgstr "expression WHERE de la publication invalide" -#: commands/publicationcmds.c:635 +#: commands/publicationcmds.c:636 #, c-format msgid "cannot use publication WHERE clause for relation \"%s\"" msgstr "ne peut pas utiliser la clause WHERE de la publication pour la relation « %s »" -#: commands/publicationcmds.c:637 +#: commands/publicationcmds.c:638 #, fuzzy, c-format #| msgid "cannot cluster a partitioned table" msgid "WHERE clause cannot be used for a partitioned table when %s is false." msgstr "ne peut pas exécuter CLUSTER sur une table partitionnée" -#: commands/publicationcmds.c:708 commands/publicationcmds.c:722 +#: commands/publicationcmds.c:709 commands/publicationcmds.c:723 #, c-format msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" msgstr "ne peut pas utiliser la liste de colonnes pour la relation « %s.%s » dans la publication « %s »" -#: commands/publicationcmds.c:711 +#: commands/publicationcmds.c:712 #, c-format msgid "Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements." msgstr "" -#: commands/publicationcmds.c:725 +#: commands/publicationcmds.c:726 #, c-format msgid "Column lists cannot be specified for partitioned tables when %s is false." msgstr "" -#: commands/publicationcmds.c:760 +#: commands/publicationcmds.c:761 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "doit être super-utilisateur pour créer une publication « FOR ALL TABLES »" -#: commands/publicationcmds.c:831 +#: commands/publicationcmds.c:832 #, c-format msgid "must be superuser to create FOR TABLES IN SCHEMA publication" msgstr "doit être super-utilisateur pour créer une publication « FOR TABLES IN SCHEMA »" -#: commands/publicationcmds.c:867 +#: commands/publicationcmds.c:868 #, c-format msgid "wal_level is insufficient to publish logical changes" msgstr "la valeur de wal_level est insuffisante pour publier des modifications logiques" -#: commands/publicationcmds.c:868 +#: commands/publicationcmds.c:869 #, fuzzy, c-format #| msgid "Set wal_level to logical before creating subscriptions." msgid "Set wal_level to \"logical\" before creating subscriptions." msgstr "Configurez wal_level à la valeur logical pour créer des souscriptions." -#: commands/publicationcmds.c:964 commands/publicationcmds.c:972 +#: commands/publicationcmds.c:965 commands/publicationcmds.c:973 #, fuzzy, c-format #| msgid "cannot set parameter \"%s\" within security-definer function" msgid "cannot set parameter \"%s\" to false for publication \"%s\"" @@ -9557,62 +9789,68 @@ msgstr "" "ne peut pas configurer le paramètre « %s » à l'intérieur d'une fonction\n" "SECURITY DEFINER" -#: commands/publicationcmds.c:967 +#: commands/publicationcmds.c:968 #, c-format msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." msgstr "" -#: commands/publicationcmds.c:975 +#: commands/publicationcmds.c:976 #, c-format msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." msgstr "" -#: commands/publicationcmds.c:1298 +#: commands/publicationcmds.c:1299 #, fuzzy, c-format #| msgid "cannot change relation \"%s\"" msgid "cannot add schema to publication \"%s\"" msgstr "ne peut pas modifier la relation « %s »" -#: commands/publicationcmds.c:1300 +#: commands/publicationcmds.c:1301 #, c-format msgid "Schemas cannot be added if any tables that specify a column list are already part of the publication." msgstr "" -#: commands/publicationcmds.c:1348 +#: commands/publicationcmds.c:1349 #, fuzzy, c-format #| msgid "must be superuser to set schema of %s" msgid "must be superuser to add or set schemas" msgstr "doit être super-utilisateur pour configurer le schéma de %s" -#: commands/publicationcmds.c:1357 commands/publicationcmds.c:1365 +#: commands/publicationcmds.c:1358 commands/publicationcmds.c:1366 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "la publication « %s » est définie avec FOR ALL TABLES" -#: commands/publicationcmds.c:1359 +#: commands/publicationcmds.c:1360 #, fuzzy, c-format #| msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." msgstr "Les tables ne peuvent pas être ajoutées ou supprimées à des publications FOR ALL TABLES." -#: commands/publicationcmds.c:1367 +#: commands/publicationcmds.c:1368 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "Les tables ne peuvent pas être ajoutées ou supprimées à des publications FOR ALL TABLES." -#: commands/publicationcmds.c:1593 commands/publicationcmds.c:1656 +#: commands/publicationcmds.c:1392 commands/publicationcmds.c:1431 +#: commands/publicationcmds.c:1968 utils/cache/lsyscache.c:3592 +#, c-format +msgid "publication \"%s\" does not exist" +msgstr "la publication « %s » n'existe pas" + +#: commands/publicationcmds.c:1594 commands/publicationcmds.c:1657 #, fuzzy, c-format #| msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgid "conflicting or redundant WHERE clauses for table \"%s\"" msgstr "déclarations NULL/NOT NULL en conflit ou redondantes pour la colonne « %s »" -#: commands/publicationcmds.c:1600 commands/publicationcmds.c:1668 +#: commands/publicationcmds.c:1601 commands/publicationcmds.c:1669 #, fuzzy, c-format #| msgid "conflicting or redundant options" msgid "conflicting or redundant column lists for table \"%s\"" msgstr "options en conflit ou redondantes" -#: commands/publicationcmds.c:1802 +#: commands/publicationcmds.c:1803 #, fuzzy, c-format #| msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" msgid "column list must not be specified in ALTER PUBLICATION ... DROP" @@ -9620,52 +9858,57 @@ msgstr "" "les types d'argument de l'opérateur doivent être indiqués dans ALTER\n" "OPERATOR FAMILY" -#: commands/publicationcmds.c:1814 +#: commands/publicationcmds.c:1815 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "la relation « %s » ne fait pas partie de la publication" -#: commands/publicationcmds.c:1821 +#: commands/publicationcmds.c:1822 #, c-format msgid "cannot use a WHERE clause when removing a table from a publication" msgstr "ne peut pas utiliser une clause WHERE lors de la suppression d'une table d'une publication" -#: commands/publicationcmds.c:1881 +#: commands/publicationcmds.c:1882 #, fuzzy, c-format #| msgid "relation \"%s\" is not part of the publication" msgid "tables from schema \"%s\" are not part of the publication" msgstr "la relation « %s » ne fait pas partie de la publication" -#: commands/publicationcmds.c:1924 commands/publicationcmds.c:1931 +#: commands/publicationcmds.c:1925 commands/publicationcmds.c:1932 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "droit refusé pour modifier le propriétaire de la publication « %s »" -#: commands/publicationcmds.c:1926 +#: commands/publicationcmds.c:1927 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "Le propriétaire d'une publication FOR ALL TABLES doit être un super-utilisateur." -#: commands/publicationcmds.c:1933 +#: commands/publicationcmds.c:1934 #, fuzzy, c-format #| msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." msgstr "Le propriétaire d'une publication FOR ALL TABLES doit être un super-utilisateur." -#: commands/schemacmds.c:105 commands/schemacmds.c:270 +#: commands/publicationcmds.c:2000 +#, c-format +msgid "publication with OID %u does not exist" +msgstr "la publication d'OID %u n'existe pas" + +#: commands/schemacmds.c:109 commands/schemacmds.c:289 #, c-format msgid "unacceptable schema name \"%s\"" msgstr "nom de schéma « %s » inacceptable" -#: commands/schemacmds.c:106 commands/schemacmds.c:271 +#: commands/schemacmds.c:110 commands/schemacmds.c:290 #, c-format msgid "The prefix \"pg_\" is reserved for system schemas." msgstr "Le préfixe « pg_ » est réservé pour les schémas système." -#: commands/schemacmds.c:130 +#: commands/schemacmds.c:134 #, c-format msgid "schema \"%s\" already exists, skipping" -msgstr "la schéma « %s » existe déjà, poursuite du traitement" +msgstr "le schéma « %s » existe déjà, poursuite du traitement" #: commands/seclabel.c:131 #, c-format @@ -9693,31 +9936,31 @@ msgstr "les labels de sécurité ne sont pas supportés pour ce type d'objet" msgid "cannot set security label on relation \"%s\"" msgstr "ne peut pas modifier la contrainte « %s » de la relation « %s »" -#: commands/sequence.c:755 +#: commands/sequence.c:754 #, fuzzy, c-format #| msgid "nextval: reached maximum value of sequence \"%s\" (%s)" msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" msgstr "nextval : valeur maximale de la séquence « %s » (%s) atteinte" -#: commands/sequence.c:774 +#: commands/sequence.c:773 #, fuzzy, c-format #| msgid "nextval: reached minimum value of sequence \"%s\" (%s)" msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" msgstr "nextval : valeur minimale de la séquence « %s » (%s) atteinte" -#: commands/sequence.c:892 +#: commands/sequence.c:891 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "" "la valeur courante (currval) de la séquence « %s » n'est pas encore définie\n" "dans cette session" -#: commands/sequence.c:911 commands/sequence.c:917 +#: commands/sequence.c:910 commands/sequence.c:916 #, c-format msgid "lastval is not yet defined in this session" msgstr "la dernière valeur (lastval) n'est pas encore définie dans cette session" -#: commands/sequence.c:997 +#: commands/sequence.c:996 #, fuzzy, c-format #| msgid "setval: value %s is out of bounds for sequence \"%s\" (%s..%s)" msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" @@ -9822,13 +10065,13 @@ msgstr "la séquence doit être dans le même schéma que la table avec laquelle msgid "cannot change ownership of identity sequence" msgstr "ne peut pas modifier le propriétaire de la séquence d'identité" -#: commands/sequence.c:1679 commands/tablecmds.c:13819 -#: commands/tablecmds.c:16455 +#: commands/sequence.c:1679 commands/tablecmds.c:13895 +#: commands/tablecmds.c:16494 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "La séquence « %s » est liée à la table « %s »." -#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1876 +#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1887 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "seule une relation seule est acceptée dans CREATE STATISTICS" @@ -9839,108 +10082,114 @@ msgstr "seule une relation seule est acceptée dans CREATE STATISTICS" msgid "cannot define statistics for relation \"%s\"" msgstr "ne peut pas ré-écrire la relation système « %s »" -#: commands/statscmds.c:191 +#: commands/statscmds.c:190 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "l'objet statistique « %s » existe déjà, poursuite du traitement" -#: commands/statscmds.c:199 +#: commands/statscmds.c:198 #, c-format msgid "statistics object \"%s\" already exists" msgstr "l'objet statistique « %s » existe déjà" -#: commands/statscmds.c:210 +#: commands/statscmds.c:209 #, c-format msgid "cannot have more than %d columns in statistics" msgstr "ne peut pas avoir plus de %d colonnes dans des statistiques" -#: commands/statscmds.c:251 commands/statscmds.c:274 commands/statscmds.c:308 +#: commands/statscmds.c:250 commands/statscmds.c:273 commands/statscmds.c:307 #, c-format msgid "statistics creation on system columns is not supported" msgstr "la création de statistiques sur les colonnes systèmes n'est pas supportée" -#: commands/statscmds.c:258 commands/statscmds.c:281 +#: commands/statscmds.c:257 commands/statscmds.c:280 #, c-format msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" msgstr "la colonne « %s » ne peut pas être utilisée dans des statistiques parce que son type %s n'a pas de classe d'opérateur btree par défaut" -#: commands/statscmds.c:325 +#: commands/statscmds.c:324 #, c-format msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" msgstr "l'expression ne peut pas être utilisée dans des statistiques multivariates parce que son type %s n'a pas de classe d'opérateur btree par défaut" -#: commands/statscmds.c:346 +#: commands/statscmds.c:345 #, c-format msgid "when building statistics on a single expression, statistics kinds may not be specified" msgstr "lors de la construction de statistiques sur une simple expression, les types de statistiques n'ont pas besoin d'être spécifiés" -#: commands/statscmds.c:375 +#: commands/statscmds.c:374 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "type de statistique « %s » non reconnu" -#: commands/statscmds.c:404 +#: commands/statscmds.c:403 #, c-format msgid "extended statistics require at least 2 columns" msgstr "les statistiques étendues requièrent au moins 2 colonnes" -#: commands/statscmds.c:422 +#: commands/statscmds.c:421 #, c-format msgid "duplicate column name in statistics definition" msgstr "nom de colonne dupliqué dans la définition des statistiques" -#: commands/statscmds.c:457 +#: commands/statscmds.c:456 #, c-format msgid "duplicate expression in statistics definition" msgstr "expression dupliquée dans la définition des statistiques" -#: commands/statscmds.c:620 commands/tablecmds.c:8072 +#: commands/statscmds.c:619 commands/tablecmds.c:8184 #, c-format msgid "statistics target %d is too low" msgstr "la cible statistique %d est trop basse" -#: commands/statscmds.c:628 commands/tablecmds.c:8080 +#: commands/statscmds.c:627 commands/tablecmds.c:8192 #, c-format msgid "lowering statistics target to %d" msgstr "abaissement de la cible statistique à %d" -#: commands/statscmds.c:651 +#: commands/statscmds.c:650 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "l'objet statistique « %s.%s » n'existe pas, poursuite du traitement" -#: commands/subscriptioncmds.c:251 commands/subscriptioncmds.c:298 +#: commands/subscriptioncmds.c:271 commands/subscriptioncmds.c:359 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "paramètre de souscription non reconnu : « %s »" -#: commands/subscriptioncmds.c:289 +#: commands/subscriptioncmds.c:327 replication/pgoutput/pgoutput.c:395 +#, fuzzy, c-format +#| msgid "unrecognized \"publish\" value: \"%s\"" +msgid "unrecognized origin value: \"%s\"" +msgstr "type « publish » non reconnu : « %s »" + +#: commands/subscriptioncmds.c:350 #, fuzzy, c-format #| msgid "invalid WAL location: \"%s\"" msgid "invalid WAL location (LSN): %s" msgstr "emplacement WAL invalide : « %s »" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:313 commands/subscriptioncmds.c:320 -#: commands/subscriptioncmds.c:327 commands/subscriptioncmds.c:349 -#: commands/subscriptioncmds.c:365 +#: commands/subscriptioncmds.c:374 commands/subscriptioncmds.c:381 +#: commands/subscriptioncmds.c:388 commands/subscriptioncmds.c:410 +#: commands/subscriptioncmds.c:426 #, c-format msgid "%s and %s are mutually exclusive options" msgstr "%s et %s sont des options mutuellement exclusives" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:355 commands/subscriptioncmds.c:371 +#: commands/subscriptioncmds.c:416 commands/subscriptioncmds.c:432 #, c-format msgid "subscription with %s must also set %s" msgstr "la souscription avec %s doit aussi configurer %s" -#: commands/subscriptioncmds.c:433 +#: commands/subscriptioncmds.c:494 #, fuzzy, c-format #| msgid "could not receive list of replicated tables from the publisher: %s" msgid "could not receive list of publications from the publisher: %s" msgstr "n'a pas pu recevoir la liste des tables répliquées à partir du publieur : %s" -#: commands/subscriptioncmds.c:465 +#: commands/subscriptioncmds.c:526 #, fuzzy, c-format #| msgid "publication \"%s\" does not exist" msgid "publication %s does not exist on the publisher" @@ -9948,558 +10197,588 @@ msgid_plural "publications %s do not exist on the publisher" msgstr[0] "la publication « %s » n'existe pas" msgstr[1] "la publication « %s » n'existe pas" -#: commands/subscriptioncmds.c:547 +#: commands/subscriptioncmds.c:614 +#, fuzzy, c-format +#| msgid "permission denied for subscription %s" +msgid "permission denied to create subscription" +msgstr "droit refusé pour la souscription %s" + +#: commands/subscriptioncmds.c:615 #, c-format -msgid "must be superuser to create subscriptions" -msgstr "doit être super-utilisateur pour créer des souscriptions" +msgid "Only roles with privileges of the \"%s\" role may create subscriptions." +msgstr "" -#: commands/subscriptioncmds.c:648 commands/subscriptioncmds.c:776 -#: replication/logical/tablesync.c:1229 replication/logical/worker.c:3738 +#: commands/subscriptioncmds.c:745 commands/subscriptioncmds.c:878 +#: replication/logical/tablesync.c:1309 replication/logical/worker.c:4616 #, c-format msgid "could not connect to the publisher: %s" msgstr "n'a pas pu se connecter au publieur : %s" -#: commands/subscriptioncmds.c:717 +#: commands/subscriptioncmds.c:816 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "création du slot de réplication « %s » sur le publieur" -#. translator: %s is an SQL ALTER statement -#: commands/subscriptioncmds.c:730 +#: commands/subscriptioncmds.c:828 +#, fuzzy, c-format +#| msgid "subscription has no replication slot set" +msgid "subscription was created, but is not connected" +msgstr "la souscription n'a aucun ensemble de slot de réplication" + +#: commands/subscriptioncmds.c:829 +#, c-format +msgid "To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription." +msgstr "" + +#: commands/subscriptioncmds.c:1096 commands/subscriptioncmds.c:1509 +#: commands/subscriptioncmds.c:1892 utils/cache/lsyscache.c:3642 #, c-format -msgid "tables were not subscribed, you will have to run %s to subscribe the tables" -msgstr "les tables n'étaient pas souscrites, vous devrez exécuter %s pour souscrire aux tables" +msgid "subscription \"%s\" does not exist" +msgstr "la souscription « %s » n'existe pas" -#: commands/subscriptioncmds.c:1033 +#: commands/subscriptioncmds.c:1152 #, c-format msgid "cannot set %s for enabled subscription" msgstr "ne peut définir %s pour une souscription active" -#: commands/subscriptioncmds.c:1086 +#: commands/subscriptioncmds.c:1234 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "ne peut pas activer une souscription qui n'a pas de nom de slot" -#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1180 +#: commands/subscriptioncmds.c:1278 commands/subscriptioncmds.c:1329 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION avec rafraîchissement n'est pas autorisé pour les souscriptions désactivées" -#: commands/subscriptioncmds.c:1130 +#: commands/subscriptioncmds.c:1279 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "Utilisez ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1139 commands/subscriptioncmds.c:1194 +#: commands/subscriptioncmds.c:1288 commands/subscriptioncmds.c:1343 #, fuzzy, c-format #| msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" msgstr "ALTER SUBSCRIPTION avec rafraîchissement n'est pas autorisé pour les souscriptions désactivées" -#: commands/subscriptioncmds.c:1140 +#: commands/subscriptioncmds.c:1289 #, fuzzy, c-format #| msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "Utilisez ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1182 -#, fuzzy, c-format -#| msgid "Use views instead." -msgid "Use %s instead." -msgstr "Utilisez les vues à la place." - -#. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1196 +#: commands/subscriptioncmds.c:1345 #, c-format msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "" -#: commands/subscriptioncmds.c:1218 +#: commands/subscriptioncmds.c:1367 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH n'est pas autorisé pour les souscriptions désactivées" -#: commands/subscriptioncmds.c:1243 +#: commands/subscriptioncmds.c:1392 #, fuzzy, c-format #| msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" msgstr "ALTER SUBSCRIPTION ... REFRESH n'est pas autorisé pour les souscriptions désactivées" -#: commands/subscriptioncmds.c:1244 +#: commands/subscriptioncmds.c:1393 #, c-format msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "Utilisez ALTER SUBSCRIPTION ... REFRESH with copy_data = false, ou utilisez DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1263 -#, fuzzy, c-format -#| msgid "must be superuser to switch transaction log files" -msgid "must be superuser to skip transaction" -msgstr "doit être super-utilisateur pour changer de journal de transactions" - -#: commands/subscriptioncmds.c:1283 +#: commands/subscriptioncmds.c:1428 #, c-format msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" msgstr "" -#: commands/subscriptioncmds.c:1363 +#: commands/subscriptioncmds.c:1513 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "la souscription « %s » n'existe pas, poursuite du traitement" -#: commands/subscriptioncmds.c:1621 +#: commands/subscriptioncmds.c:1782 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "slot de réplication « %s » supprimé sur le publieur" -#: commands/subscriptioncmds.c:1630 commands/subscriptioncmds.c:1638 +#: commands/subscriptioncmds.c:1791 commands/subscriptioncmds.c:1799 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" msgstr "n'a pas pu supprimer le slot de réplication « %s » sur le publieur : %s" -#: commands/subscriptioncmds.c:1672 +#: commands/subscriptioncmds.c:1924 #, c-format -msgid "permission denied to change owner of subscription \"%s\"" -msgstr "droit refusé pour modifier le propriétaire de la souscription « %s »" - -#: commands/subscriptioncmds.c:1674 -#, c-format -msgid "The owner of a subscription must be a superuser." -msgstr "Le propriétaire d'une souscription doit être un super-utilisateur." +msgid "subscription with OID %u does not exist" +msgstr "la souscription d'OID %u n'existe pas" -#: commands/subscriptioncmds.c:1788 +#: commands/subscriptioncmds.c:1995 commands/subscriptioncmds.c:2120 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "n'a pas pu recevoir la liste des tables répliquées à partir du publieur : %s" -#: commands/subscriptioncmds.c:1810 replication/logical/tablesync.c:809 -#: replication/pgoutput/pgoutput.c:1062 +#: commands/subscriptioncmds.c:2031 +#, c-format +msgid "subscription \"%s\" requested copy_data with origin = NONE but might copy data that had a different origin" +msgstr "" + +#: commands/subscriptioncmds.c:2033 +#, c-format +msgid "The subscription being created subscribes to a publication (%s) that contains tables that are written to by other subscriptions." +msgid_plural "The subscription being created subscribes to publications (%s) that contain tables that are written to by other subscriptions." +msgstr[0] "" +msgstr[1] "" + +#: commands/subscriptioncmds.c:2036 +#, c-format +msgid "Verify that initial data copied from the publisher tables did not come from other origins." +msgstr "" + +#: commands/subscriptioncmds.c:2142 replication/logical/tablesync.c:876 +#: replication/pgoutput/pgoutput.c:1112 #, fuzzy, c-format #| msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgid "cannot use different column lists for table \"%s.%s\" in different publications" msgstr "ne peut pas utiliser ONLY pour une clé étrangère sur la table partitionnée « %s » référençant la relation « %s »" -#: commands/subscriptioncmds.c:1860 +#: commands/subscriptioncmds.c:2192 #, c-format msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" msgstr "n'a pas pu se connecter au publieur lors de la tentative de suppression du slot de réplication « %s » : %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1863 -#, c-format -msgid "Use %s to disassociate the subscription from the slot." +#: commands/subscriptioncmds.c:2195 +#, fuzzy, c-format +#| msgid "Use %s to disassociate the subscription from the slot." +msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." msgstr "Utilisez %s pour dissocier la souscription du slot." -#: commands/subscriptioncmds.c:1893 +#: commands/subscriptioncmds.c:2226 #, c-format msgid "publication name \"%s\" used more than once" msgstr "nom de publication « %s » utilisé plus d'une fois" -#: commands/subscriptioncmds.c:1937 +#: commands/subscriptioncmds.c:2270 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "la publication « %s » est déjà dans la souscription « %s »" -#: commands/subscriptioncmds.c:1951 +#: commands/subscriptioncmds.c:2284 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "la publication « %s » n'est pas dans la souscription « %s »" -#: commands/subscriptioncmds.c:1962 +#: commands/subscriptioncmds.c:2295 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "ne peut pas supprimer toutes les publications d'une souscription" -#: commands/tablecmds.c:245 commands/tablecmds.c:287 +#: commands/subscriptioncmds.c:2352 +#, fuzzy, c-format +#| msgid "%s requires a Boolean value or \"match\"" +msgid "%s requires a Boolean value or \"parallel\"" +msgstr "%s requiert une valeur booléenne ou « match »" + +#: commands/tablecmds.c:246 commands/tablecmds.c:288 #, c-format msgid "table \"%s\" does not exist" msgstr "la table « %s » n'existe pas" -#: commands/tablecmds.c:246 commands/tablecmds.c:288 +#: commands/tablecmds.c:247 commands/tablecmds.c:289 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "la table « %s » n'existe pas, poursuite du traitement" -#: commands/tablecmds.c:248 commands/tablecmds.c:290 +#: commands/tablecmds.c:249 commands/tablecmds.c:291 msgid "Use DROP TABLE to remove a table." msgstr "Utilisez DROP TABLE pour supprimer une table." -#: commands/tablecmds.c:251 +#: commands/tablecmds.c:252 #, c-format msgid "sequence \"%s\" does not exist" msgstr "la séquence « %s » n'existe pas" -#: commands/tablecmds.c:252 +#: commands/tablecmds.c:253 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "la séquence « %s » n'existe pas, poursuite du traitement" -#: commands/tablecmds.c:254 +#: commands/tablecmds.c:255 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "Utilisez DROP SEQUENCE pour supprimer une séquence." -#: commands/tablecmds.c:257 +#: commands/tablecmds.c:258 #, c-format msgid "view \"%s\" does not exist" msgstr "la vue « %s » n'existe pas" -#: commands/tablecmds.c:258 +#: commands/tablecmds.c:259 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "la vue « %s » n'existe pas, poursuite du traitement" -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:261 msgid "Use DROP VIEW to remove a view." msgstr "Utilisez DROP VIEW pour supprimer une vue." -#: commands/tablecmds.c:263 +#: commands/tablecmds.c:264 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "la vue matérialisée « %s » n'existe pas" -#: commands/tablecmds.c:264 +#: commands/tablecmds.c:265 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "la vue matérialisée « %s » n'existe pas, poursuite du traitement" -#: commands/tablecmds.c:266 +#: commands/tablecmds.c:267 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "Utilisez DROP MATERIALIZED VIEW pour supprimer une vue matérialisée." -#: commands/tablecmds.c:269 commands/tablecmds.c:293 commands/tablecmds.c:18953 -#: parser/parse_utilcmd.c:2260 +#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:18996 +#: parser/parse_utilcmd.c:2245 #, c-format msgid "index \"%s\" does not exist" msgstr "l'index « %s » n'existe pas" -#: commands/tablecmds.c:270 commands/tablecmds.c:294 +#: commands/tablecmds.c:271 commands/tablecmds.c:295 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "l'index « %s » n'existe pas, poursuite du traitement" -#: commands/tablecmds.c:272 commands/tablecmds.c:296 +#: commands/tablecmds.c:273 commands/tablecmds.c:297 msgid "Use DROP INDEX to remove an index." msgstr "Utilisez DROP INDEX pour supprimer un index." -#: commands/tablecmds.c:277 +#: commands/tablecmds.c:278 #, c-format msgid "\"%s\" is not a type" msgstr "« %s » n'est pas un type" -#: commands/tablecmds.c:278 +#: commands/tablecmds.c:279 msgid "Use DROP TYPE to remove a type." msgstr "Utilisez DROP TYPE pour supprimer un type." -#: commands/tablecmds.c:281 commands/tablecmds.c:13658 -#: commands/tablecmds.c:16158 +#: commands/tablecmds.c:282 commands/tablecmds.c:13734 +#: commands/tablecmds.c:16199 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "la table distante « %s » n'existe pas" -#: commands/tablecmds.c:282 +#: commands/tablecmds.c:283 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "la table distante « %s » n'existe pas, poursuite du traitement" -#: commands/tablecmds.c:284 +#: commands/tablecmds.c:285 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Utilisez DROP FOREIGN TABLE pour supprimer une table distante." -#: commands/tablecmds.c:697 +#: commands/tablecmds.c:700 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT peut seulement être utilisé sur des tables temporaires" -#: commands/tablecmds.c:728 +#: commands/tablecmds.c:731 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "" "ne peut pas créer une table temporaire à l'intérieur d'une fonction\n" "restreinte pour sécurité" -#: commands/tablecmds.c:764 commands/tablecmds.c:14965 +#: commands/tablecmds.c:767 commands/tablecmds.c:15044 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "la relation « %s » serait héritée plus d'une fois" -#: commands/tablecmds.c:949 +#: commands/tablecmds.c:955 #, c-format msgid "specifying a table access method is not supported on a partitioned table" msgstr "spécifier une méthode d'accès à la table n'est pas supporté sur une partitionnée" -#: commands/tablecmds.c:1042 +#: commands/tablecmds.c:1048 #, c-format msgid "\"%s\" is not partitioned" msgstr "« %s » n'est pas partitionné" -#: commands/tablecmds.c:1137 +#: commands/tablecmds.c:1142 #, c-format msgid "cannot partition using more than %d columns" msgstr "ne peut pas partitionner en utilisant plus de %d colonnes" -#: commands/tablecmds.c:1193 +#: commands/tablecmds.c:1198 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "ne peut pas créer une partition distante sur la table partitionnée « %s »" -#: commands/tablecmds.c:1195 +#: commands/tablecmds.c:1200 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "La table « %s » contient des index qui sont uniques." -#: commands/tablecmds.c:1358 +#: commands/tablecmds.c:1365 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY ne permet pas de supprimer plusieurs objets" -#: commands/tablecmds.c:1362 +#: commands/tablecmds.c:1369 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY ne permet pas la CASCADE" -#: commands/tablecmds.c:1466 +#: commands/tablecmds.c:1473 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "ne peut pas supprimer l'index partitionné « %s » de manière concurrente" -#: commands/tablecmds.c:1754 +#: commands/tablecmds.c:1761 #, c-format msgid "cannot truncate only a partitioned table" msgstr "ne peut pas seulement tronquer une table partitionnée" -#: commands/tablecmds.c:1755 +#: commands/tablecmds.c:1762 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "Ne spécifiez pas le mot clé ONLY ou utilisez TRUNCATE ONLY directement sur les partitions." -#: commands/tablecmds.c:1827 +#: commands/tablecmds.c:1835 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "TRUNCATE cascade sur la table « %s »" -#: commands/tablecmds.c:2177 +#: commands/tablecmds.c:2199 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "ne peut pas tronquer la table distante « %s »" -#: commands/tablecmds.c:2234 +#: commands/tablecmds.c:2256 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "ne peut pas tronquer les tables temporaires des autres sessions" -#: commands/tablecmds.c:2462 commands/tablecmds.c:14862 +#: commands/tablecmds.c:2488 commands/tablecmds.c:14941 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "ne peut pas hériter de la table partitionnée « %s »" -#: commands/tablecmds.c:2467 +#: commands/tablecmds.c:2493 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "ne peut pas hériter de la partition « %s »" -#: commands/tablecmds.c:2475 parser/parse_utilcmd.c:2490 -#: parser/parse_utilcmd.c:2632 +#: commands/tablecmds.c:2501 parser/parse_utilcmd.c:2475 +#: parser/parse_utilcmd.c:2617 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "la relation héritée « %s » n'est ni une table ni une table distante" -#: commands/tablecmds.c:2487 +#: commands/tablecmds.c:2513 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "ne peut pas créer une relation temporaire comme partition de la relation permanente « %s »" -#: commands/tablecmds.c:2496 commands/tablecmds.c:14841 +#: commands/tablecmds.c:2522 commands/tablecmds.c:14920 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "ne peut pas hériter à partir d'une relation temporaire « %s »" -#: commands/tablecmds.c:2506 commands/tablecmds.c:14849 +#: commands/tablecmds.c:2532 commands/tablecmds.c:14928 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "ne peut pas hériter de la table temporaire d'une autre session" -#: commands/tablecmds.c:2560 +#: commands/tablecmds.c:2585 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "assemblage de plusieurs définitions d'héritage pour la colonne « %s »" -#: commands/tablecmds.c:2568 +#: commands/tablecmds.c:2597 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "la colonne héritée « %s » a un conflit de type" -#: commands/tablecmds.c:2570 commands/tablecmds.c:2593 -#: commands/tablecmds.c:2610 commands/tablecmds.c:2866 -#: commands/tablecmds.c:2896 commands/tablecmds.c:2910 +#: commands/tablecmds.c:2599 commands/tablecmds.c:2628 +#: commands/tablecmds.c:2647 commands/tablecmds.c:2919 +#: commands/tablecmds.c:2955 commands/tablecmds.c:2971 #: parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 #: parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 #: parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 #: parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 #: parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 -#: parser/parse_param.c:227 +#: parser/parse_param.c:223 #, c-format msgid "%s versus %s" msgstr "%s versus %s" -#: commands/tablecmds.c:2579 +#: commands/tablecmds.c:2612 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "la colonne héritée « %s » a un conflit sur le collationnement" -#: commands/tablecmds.c:2581 commands/tablecmds.c:2878 -#: commands/tablecmds.c:6752 +#: commands/tablecmds.c:2614 commands/tablecmds.c:2935 +#: commands/tablecmds.c:6849 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "« %s » versus « %s »" -#: commands/tablecmds.c:2591 +#: commands/tablecmds.c:2626 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "la colonne héritée « %s » a un conflit de paramètre de stockage" -#: commands/tablecmds.c:2608 commands/tablecmds.c:2908 +#: commands/tablecmds.c:2645 commands/tablecmds.c:2969 #, c-format msgid "column \"%s\" has a compression method conflict" msgstr "la colonne « %s » a un conflit sur la méthode de compression" -#: commands/tablecmds.c:2623 +#: commands/tablecmds.c:2661 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "la colonne héritée « %s » a un conflit de génération" -#: commands/tablecmds.c:2717 commands/tablecmds.c:2772 -#: commands/tablecmds.c:12382 parser/parse_utilcmd.c:1301 -#: parser/parse_utilcmd.c:1344 parser/parse_utilcmd.c:1753 -#: parser/parse_utilcmd.c:1861 +#: commands/tablecmds.c:2767 commands/tablecmds.c:2822 +#: commands/tablecmds.c:12460 parser/parse_utilcmd.c:1298 +#: parser/parse_utilcmd.c:1341 parser/parse_utilcmd.c:1740 +#: parser/parse_utilcmd.c:1848 #, c-format msgid "cannot convert whole-row table reference" msgstr "ne peut pas convertir une référence de ligne complète de table" -#: commands/tablecmds.c:2718 parser/parse_utilcmd.c:1302 +#: commands/tablecmds.c:2768 parser/parse_utilcmd.c:1299 #, c-format msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." msgstr "L'expression de génération de la colonne « %s » contient une référence de ligne complète vers la table « %s »." -#: commands/tablecmds.c:2773 parser/parse_utilcmd.c:1345 +#: commands/tablecmds.c:2823 parser/parse_utilcmd.c:1342 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "La contrainte « %s » contient une référence de ligne complète vers la table « %s »." -#: commands/tablecmds.c:2852 +#: commands/tablecmds.c:2901 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "assemblage de la colonne « %s » avec une définition héritée" -#: commands/tablecmds.c:2856 +#: commands/tablecmds.c:2905 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "déplacement et assemblage de la colonne « %s » avec une définition héritée" -#: commands/tablecmds.c:2857 +#: commands/tablecmds.c:2906 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "Colonne utilisateur déplacée à la position de la colonne héritée." -#: commands/tablecmds.c:2864 +#: commands/tablecmds.c:2917 #, c-format msgid "column \"%s\" has a type conflict" msgstr "la colonne « %s » a un conflit de type" -#: commands/tablecmds.c:2876 +#: commands/tablecmds.c:2933 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "la colonne « %s » a un conflit sur le collationnement" -#: commands/tablecmds.c:2894 +#: commands/tablecmds.c:2953 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "la colonne « %s » a un conflit de paramètre de stockage" -#: commands/tablecmds.c:2935 -#, c-format -msgid "child column \"%s\" specifies generation expression" -msgstr "la colonne enfant « %s » précise une expression de génération" - -#: commands/tablecmds.c:2937 -#, c-format -msgid "Omit the generation expression in the definition of the child table column to inherit the generation expression from the parent table." -msgstr "Omettre l'expression de génération dans la définition de la colonne de la table fille pour hériter de l'expression de génération de la table parent." - -#: commands/tablecmds.c:2941 +#: commands/tablecmds.c:2999 commands/tablecmds.c:3086 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "la colonne « %s » hérite d'une colonne générée mais indique une valeur par défaut" -#: commands/tablecmds.c:2946 +#: commands/tablecmds.c:3004 commands/tablecmds.c:3091 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "la colonne « %s » hérite d'une colonne générée mais précise une identité" -#: commands/tablecmds.c:3055 +#: commands/tablecmds.c:3012 commands/tablecmds.c:3099 +#, c-format +msgid "child column \"%s\" specifies generation expression" +msgstr "la colonne enfant « %s » précise une expression de génération" + +#: commands/tablecmds.c:3014 commands/tablecmds.c:3101 +#, fuzzy, c-format +#| msgid "A generated column cannot reference another generated column." +msgid "A child table column cannot be generated unless its parent column is." +msgstr "Une colonne générée ne peut référencer une autre colonne générée." + +#: commands/tablecmds.c:3147 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "la colonne « %s » hérite d'expressions de génération en conflit" -#: commands/tablecmds.c:3060 +#: commands/tablecmds.c:3149 +#, fuzzy, c-format +#| msgid "To resolve the conflict, specify a default explicitly." +msgid "To resolve the conflict, specify a generation expression explicitly." +msgstr "Pour résoudre le conflit, spécifiez explicitement une valeur par défaut." + +#: commands/tablecmds.c:3153 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "la colonne « %s » hérite de valeurs par défaut conflictuelles" -#: commands/tablecmds.c:3062 +#: commands/tablecmds.c:3155 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "Pour résoudre le conflit, spécifiez explicitement une valeur par défaut." -#: commands/tablecmds.c:3108 +#: commands/tablecmds.c:3205 #, c-format msgid "check constraint name \"%s\" appears multiple times but with different expressions" msgstr "" "le nom de la contrainte de vérification, « %s », apparaît plusieurs fois\n" "mais avec des expressions différentes" -#: commands/tablecmds.c:3321 +#: commands/tablecmds.c:3418 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "ne peut pas déplacer les tables temporaires d'autres sessions" -#: commands/tablecmds.c:3391 +#: commands/tablecmds.c:3488 #, c-format msgid "cannot rename column of typed table" msgstr "ne peut pas renommer une colonne d'une table typée" -#: commands/tablecmds.c:3410 +#: commands/tablecmds.c:3507 #, fuzzy, c-format #| msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgid "cannot rename columns of relation \"%s\"" msgstr "ne peut pas modifier la colonne héritée « %s » de la relation « %s »" -#: commands/tablecmds.c:3505 +#: commands/tablecmds.c:3602 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "la colonne héritée « %s » doit aussi être renommée pour les tables filles" -#: commands/tablecmds.c:3537 +#: commands/tablecmds.c:3634 #, c-format msgid "cannot rename system column \"%s\"" msgstr "ne peut pas renommer la colonne système « %s »" -#: commands/tablecmds.c:3552 +#: commands/tablecmds.c:3649 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "ne peut pas renommer la colonne héritée « %s »" -#: commands/tablecmds.c:3704 +#: commands/tablecmds.c:3801 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "la contrainte héritée « %s » doit aussi être renommée pour les tables enfants" -#: commands/tablecmds.c:3711 +#: commands/tablecmds.c:3808 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "ne peut pas renommer la colonne héritée « %s »" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4008 +#: commands/tablecmds.c:4105 #, c-format msgid "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "" @@ -10507,1495 +10786,1470 @@ msgstr "" "des requêtes actives dans cette session" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4017 +#: commands/tablecmds.c:4114 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "ne peut pas exécuter %s « %s » car il reste des événements sur les triggers" -#: commands/tablecmds.c:4486 +#: commands/tablecmds.c:4581 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "ne peut pas modifier la partition « %s » avec un détachement incomplet" -#: commands/tablecmds.c:4679 commands/tablecmds.c:4694 +#: commands/tablecmds.c:4774 commands/tablecmds.c:4789 #, c-format msgid "cannot change persistence setting twice" msgstr "ne peut pas modifier la configuration de la persistence deux fois" -#: commands/tablecmds.c:4715 +#: commands/tablecmds.c:4810 #, fuzzy, c-format #| msgid "cannot change inheritance of partitioned table" msgid "cannot change access method of a partitioned table" msgstr "ne peut pas modifier l'héritage d'une table partitionnée" -#: commands/tablecmds.c:4721 +#: commands/tablecmds.c:4816 #, fuzzy, c-format #| msgid "cannot have multiple SET TABLESPACE subcommands" msgid "cannot have multiple SET ACCESS METHOD subcommands" msgstr "ne peut pas avoir de nombreuses sous-commandes SET TABLESPACE" -#: commands/tablecmds.c:5476 +#: commands/tablecmds.c:5537 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "ne peut pas ré-écrire la relation système « %s »" -#: commands/tablecmds.c:5482 +#: commands/tablecmds.c:5543 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "ne peut pas réécrire la table « %s » utilisée comme une table catalogue" -#: commands/tablecmds.c:5492 +#: commands/tablecmds.c:5553 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "ne peut pas ré-écrire les tables temporaires des autres sessions" -#: commands/tablecmds.c:5986 +#: commands/tablecmds.c:6048 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "la colonne « %s » de la table « %s » contient des valeurs NULL" -#: commands/tablecmds.c:6003 +#: commands/tablecmds.c:6065 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "la contrainte de vérification « %s » de la relation « %s » est violée par une ligne" -#: commands/tablecmds.c:6022 partitioning/partbounds.c:3404 +#: commands/tablecmds.c:6084 partitioning/partbounds.c:3388 #, c-format msgid "updated partition constraint for default partition \"%s\" would be violated by some row" msgstr "la contrainte de partition mise à jour pour la partition par défaut « %s » serait transgressée par des lignes" -#: commands/tablecmds.c:6028 +#: commands/tablecmds.c:6090 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "la contrainte de partition de la relation « %s » est violée par une ligne" #. translator: %s is a group of some SQL keywords -#: commands/tablecmds.c:6295 +#: commands/tablecmds.c:6352 #, fuzzy, c-format #| msgid "relation \"%s\" is not a parent of relation \"%s\"" msgid "ALTER action %s cannot be performed on relation \"%s\"" msgstr "la relation « %s » n'est pas un parent de la relation « %s »" -#: commands/tablecmds.c:6510 commands/tablecmds.c:6517 +#: commands/tablecmds.c:6607 commands/tablecmds.c:6614 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "ne peux pas modifier le type « %s » car la colonne « %s.%s » l'utilise" -#: commands/tablecmds.c:6524 +#: commands/tablecmds.c:6621 #, c-format msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "" "ne peut pas modifier la table distante « %s » car la colonne « %s.%s » utilise\n" "son type de ligne" -#: commands/tablecmds.c:6531 +#: commands/tablecmds.c:6628 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "" "ne peut pas modifier la table « %s » car la colonne « %s.%s » utilise\n" "son type de ligne" -#: commands/tablecmds.c:6587 +#: commands/tablecmds.c:6684 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "ne peut pas modifier le type « %s » car il s'agit du type d'une table de type" -#: commands/tablecmds.c:6589 +#: commands/tablecmds.c:6686 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "Utilisez ALTER ... CASCADE pour modifier aussi les tables de type." -#: commands/tablecmds.c:6635 +#: commands/tablecmds.c:6732 #, c-format msgid "type %s is not a composite type" msgstr "le type %s n'est pas un type composite" -#: commands/tablecmds.c:6662 +#: commands/tablecmds.c:6759 #, c-format msgid "cannot add column to typed table" msgstr "ne peut pas ajouter une colonne à une table typée" -#: commands/tablecmds.c:6715 +#: commands/tablecmds.c:6812 #, c-format msgid "cannot add column to a partition" msgstr "ne peut pas ajouter une colonne à une partition" -#: commands/tablecmds.c:6744 commands/tablecmds.c:15092 +#: commands/tablecmds.c:6841 commands/tablecmds.c:15171 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "la table fille « %s » a un type différent pour la colonne « %s »" -#: commands/tablecmds.c:6750 commands/tablecmds.c:15099 +#: commands/tablecmds.c:6847 commands/tablecmds.c:15178 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "la table fille « %s » a un collationnement différent pour la colonne « %s »" -#: commands/tablecmds.c:6764 +#: commands/tablecmds.c:6865 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "assemblage de la définition de la colonne « %s » pour le fils « %s »" -#: commands/tablecmds.c:6807 +#: commands/tablecmds.c:6908 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "ne peut pas ajouter récursivement la colonne identité à une table qui a des tables filles" -#: commands/tablecmds.c:7051 +#: commands/tablecmds.c:7159 #, c-format msgid "column must be added to child tables too" msgstr "la colonne doit aussi être ajoutée aux tables filles" -#: commands/tablecmds.c:7129 +#: commands/tablecmds.c:7237 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "la colonne « %s » de la relation « %s » existe déjà, poursuite du traitement" -#: commands/tablecmds.c:7136 +#: commands/tablecmds.c:7244 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "la colonne « %s » de la relation « %s » existe déjà" -#: commands/tablecmds.c:7202 commands/tablecmds.c:12021 +#: commands/tablecmds.c:7310 commands/tablecmds.c:12098 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "ne peut pas supprimer une contrainte uniquement d'une table partitionnée quand des partitions existent" -#: commands/tablecmds.c:7203 commands/tablecmds.c:7520 -#: commands/tablecmds.c:8517 commands/tablecmds.c:12022 +#: commands/tablecmds.c:7311 commands/tablecmds.c:7628 +#: commands/tablecmds.c:8597 commands/tablecmds.c:12099 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Ne spécifiez pas le mot clé ONLY." -#: commands/tablecmds.c:7240 commands/tablecmds.c:7446 -#: commands/tablecmds.c:7588 commands/tablecmds.c:7702 -#: commands/tablecmds.c:7796 commands/tablecmds.c:7855 -#: commands/tablecmds.c:7974 commands/tablecmds.c:8113 -#: commands/tablecmds.c:8183 commands/tablecmds.c:8339 -#: commands/tablecmds.c:12176 commands/tablecmds.c:13681 -#: commands/tablecmds.c:16249 +#: commands/tablecmds.c:7348 commands/tablecmds.c:7554 +#: commands/tablecmds.c:7696 commands/tablecmds.c:7814 +#: commands/tablecmds.c:7908 commands/tablecmds.c:7967 +#: commands/tablecmds.c:8086 commands/tablecmds.c:8225 +#: commands/tablecmds.c:8295 commands/tablecmds.c:8429 +#: commands/tablecmds.c:12253 commands/tablecmds.c:13757 +#: commands/tablecmds.c:16288 #, c-format msgid "cannot alter system column \"%s\"" msgstr "n'a pas pu modifier la colonne système « %s »" -#: commands/tablecmds.c:7246 commands/tablecmds.c:7594 +#: commands/tablecmds.c:7354 commands/tablecmds.c:7702 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "la colonne « %s » de la relation « %s » n'est pas une colonne d'identité" -#: commands/tablecmds.c:7289 +#: commands/tablecmds.c:7397 #, c-format msgid "column \"%s\" is in a primary key" msgstr "la colonne « %s » est dans une clé primaire" -#: commands/tablecmds.c:7294 +#: commands/tablecmds.c:7402 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "la colonne « %s » est dans un index utilisé comme identité de réplicat" -#: commands/tablecmds.c:7317 +#: commands/tablecmds.c:7425 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "la colonne « %s » est marquée NOT NULL dans la table parent" -#: commands/tablecmds.c:7517 commands/tablecmds.c:9000 +#: commands/tablecmds.c:7625 commands/tablecmds.c:9081 #, c-format msgid "constraint must be added to child tables too" msgstr "la contrainte doit aussi être ajoutée aux tables filles" -#: commands/tablecmds.c:7518 +#: commands/tablecmds.c:7626 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "la colonne « %s » de la relation « %s » n'est pas déjà NOT NULL." -#: commands/tablecmds.c:7596 -#, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." -msgstr "Utilisez à la place ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." - -#: commands/tablecmds.c:7601 +#: commands/tablecmds.c:7711 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "la colonne « %s » de la relation « %s » est une colonne générée" -#: commands/tablecmds.c:7604 -#, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." -msgstr "Utilisez à la place ALTER TABLE ... ALTER COLUMN ... DROP EXTENSION." - -#: commands/tablecmds.c:7713 +#: commands/tablecmds.c:7825 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "la colonne « %s » de la relation « %s » doit être déclarée NOT NULL avant que la colonne identité puisse être ajoutée" -#: commands/tablecmds.c:7719 +#: commands/tablecmds.c:7831 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "la colonne « %s » de la relation « %s » est déjà une colonne d'identité" -#: commands/tablecmds.c:7725 +#: commands/tablecmds.c:7837 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "la colonne « %s » de la relation « %s » a déjà une valeur par défaut" -#: commands/tablecmds.c:7802 commands/tablecmds.c:7863 +#: commands/tablecmds.c:7914 commands/tablecmds.c:7975 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "la colonne « %s » de la relation « %s » n'est pas une colonne d'identité" -#: commands/tablecmds.c:7868 +#: commands/tablecmds.c:7980 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "la colonne « %s » de la relation « %s » n'est pas une colonne d'identité, poursuite du traitement" -#: commands/tablecmds.c:7921 +#: commands/tablecmds.c:8033 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "ALTER TABLE / DROP EXPRESSION doit aussi être appliqué aux tables filles" -#: commands/tablecmds.c:7943 +#: commands/tablecmds.c:8055 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "ne peut pas supprimer l'expression de génération à partir d'une colonne héritée" -#: commands/tablecmds.c:7982 +#: commands/tablecmds.c:8094 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "la colonne « %s » de la relation « %s » n'est pas une colonne générée stockée" -#: commands/tablecmds.c:7987 +#: commands/tablecmds.c:8099 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "la colonne « %s » de la relation « %s » n'est pas une colonne générée stockée, ignoré" -#: commands/tablecmds.c:8060 +#: commands/tablecmds.c:8172 #, c-format msgid "cannot refer to non-index column by number" msgstr "impossible de référencer une colonne non liée à une table par un nombre" -#: commands/tablecmds.c:8103 +#: commands/tablecmds.c:8215 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "la colonne numéro %d de la relation « %s » n'existe pas" -#: commands/tablecmds.c:8122 +#: commands/tablecmds.c:8234 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "ne peut modifier les statistiques sur la colonne incluse « %s » de l'index « %s »" -#: commands/tablecmds.c:8127 +#: commands/tablecmds.c:8239 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "ne peut modifier les statistiques sur la colonne « %s » de l'index « %s », qui n'est pas une expression" -#: commands/tablecmds.c:8129 +#: commands/tablecmds.c:8241 #, c-format msgid "Alter statistics on table column instead." msgstr "Modifiez les statistiques sur la colonne de la table à la place." -#: commands/tablecmds.c:8319 -#, c-format -msgid "invalid storage type \"%s\"" -msgstr "type de stockage « %s » invalide" - -#: commands/tablecmds.c:8351 -#, c-format -msgid "column data type %s can only have storage PLAIN" -msgstr "le type de données %s de la colonne peut seulement avoir un stockage PLAIN" - -#: commands/tablecmds.c:8396 +#: commands/tablecmds.c:8476 #, c-format msgid "cannot drop column from typed table" msgstr "ne peut pas supprimer une colonne à une table typée" -#: commands/tablecmds.c:8455 +#: commands/tablecmds.c:8535 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "la colonne « %s » de la relation « %s » n'existe pas, ignore" -#: commands/tablecmds.c:8468 +#: commands/tablecmds.c:8548 #, c-format msgid "cannot drop system column \"%s\"" msgstr "ne peut pas supprimer la colonne système « %s »" -#: commands/tablecmds.c:8478 +#: commands/tablecmds.c:8558 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "ne peut pas supprimer la colonne héritée « %s »" -#: commands/tablecmds.c:8491 +#: commands/tablecmds.c:8571 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "ne peut supprimer la colonne « %s » car elle fait partie de la clé de partitionnement de la relation « %s »" -#: commands/tablecmds.c:8516 +#: commands/tablecmds.c:8596 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "ne peut pas supprimer une colonne sur une seule partition quand plusieurs partitions existent" -#: commands/tablecmds.c:8720 +#: commands/tablecmds.c:8801 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX n'est pas supporté sur les tables partitionnées" -#: commands/tablecmds.c:8745 +#: commands/tablecmds.c:8826 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX renommera l'index « %s » en « %s »" -#: commands/tablecmds.c:9082 +#: commands/tablecmds.c:9163 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "ne peut pas utiliser ONLY pour une clé étrangère sur la table partitionnée « %s » référençant la relation « %s »" -#: commands/tablecmds.c:9088 +#: commands/tablecmds.c:9169 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "ne peut pas ajouter de clé étrangère NOT VALID sur la table partitionnée « %s » référençant la relation « %s »" -#: commands/tablecmds.c:9091 +#: commands/tablecmds.c:9172 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Cette fonctionnalité n'est pas encore implémentée sur les tables partitionnées." -#: commands/tablecmds.c:9098 commands/tablecmds.c:9564 +#: commands/tablecmds.c:9179 commands/tablecmds.c:9635 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "la relation référencée « %s » n'est pas une table" -#: commands/tablecmds.c:9121 +#: commands/tablecmds.c:9202 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "les contraintes sur les tables permanentes peuvent seulement référencer des tables permanentes" -#: commands/tablecmds.c:9128 +#: commands/tablecmds.c:9209 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "les contraintes sur les tables non tracées peuvent seulement référencer des tables permanentes ou non tracées" -#: commands/tablecmds.c:9134 +#: commands/tablecmds.c:9215 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "" "les contraintes sur des tables temporaires ne peuvent référencer que des\n" "tables temporaires" -#: commands/tablecmds.c:9138 +#: commands/tablecmds.c:9219 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "" "les contraintes sur des tables temporaires doivent référencer les tables\n" "temporaires de cette session" -#: commands/tablecmds.c:9212 commands/tablecmds.c:9218 +#: commands/tablecmds.c:9283 commands/tablecmds.c:9289 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "action %s invalide pour une clé étrangère contenant une colonne générée" -#: commands/tablecmds.c:9234 +#: commands/tablecmds.c:9305 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "nombre de colonnes de référence et référencées pour la clé étrangère en désaccord" -#: commands/tablecmds.c:9341 +#: commands/tablecmds.c:9412 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "la contrainte de clé étrangère « %s » ne peut pas être implémentée" -#: commands/tablecmds.c:9343 +#: commands/tablecmds.c:9414 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Les colonnes clés « %s » et « %s » sont de types incompatibles : %s et %s." -#: commands/tablecmds.c:9500 +#: commands/tablecmds.c:9571 #, fuzzy, c-format #| msgid "column \"%s\" referenced in statistics does not exist" msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" msgstr "la colonne « %s » référencée dans les statistiques n'existe pas" -#: commands/tablecmds.c:9773 commands/tablecmds.c:10241 -#: parser/parse_utilcmd.c:795 parser/parse_utilcmd.c:924 +#: commands/tablecmds.c:9845 commands/tablecmds.c:10315 +#: parser/parse_utilcmd.c:791 parser/parse_utilcmd.c:920 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "les clés étrangères ne sont pas supportées par les tables distantes" -#: commands/tablecmds.c:10793 commands/tablecmds.c:11071 -#: commands/tablecmds.c:11978 commands/tablecmds.c:12053 +#: commands/tablecmds.c:10868 commands/tablecmds.c:11146 +#: commands/tablecmds.c:12055 commands/tablecmds.c:12130 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "la contrainte « %s » de la relation « %s » n'existe pas" -#: commands/tablecmds.c:10800 +#: commands/tablecmds.c:10875 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "la contrainte « %s » de la relation « %s » n'est pas une clé étrangère" -#: commands/tablecmds.c:10838 +#: commands/tablecmds.c:10913 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "ne peut pas modifier la contrainte « %s » de la relation « %s »" -#: commands/tablecmds.c:10841 +#: commands/tablecmds.c:10916 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "La contrainte « %s » est dérivée de la contrainte « %s » de la relation « %s »" -#: commands/tablecmds.c:10843 -#, c-format -msgid "You may alter the constraint it derives from, instead." +#: commands/tablecmds.c:10918 +#, fuzzy, c-format +#| msgid "You may alter the constraint it derives from, instead." +msgid "You may alter the constraint it derives from instead." msgstr "Vous pouvez modifier la contrainte dont elle dérive à la place." -#: commands/tablecmds.c:11079 +#: commands/tablecmds.c:11154 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "la contrainte « %s » de la relation « %s » n'est pas une clé étrangère ou une contrainte de vérification" -#: commands/tablecmds.c:11157 +#: commands/tablecmds.c:11231 #, c-format msgid "constraint must be validated on child tables too" msgstr "la contrainte doit aussi être validée sur les tables enfants" -#: commands/tablecmds.c:11241 +#: commands/tablecmds.c:11318 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "la colonne « %s » référencée dans la contrainte de clé étrangère n'existe pas" -#: commands/tablecmds.c:11246 +#: commands/tablecmds.c:11324 +#, fuzzy, c-format +#| msgid "system columns cannot be used in an ON CONFLICT clause" +msgid "system columns cannot be used in foreign keys" +msgstr "les colonnes systèmes ne peuvent pas être utilisées dans une clause ON CONFLICT" + +#: commands/tablecmds.c:11328 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "ne peut pas avoir plus de %d clés dans une clé étrangère" -#: commands/tablecmds.c:11312 +#: commands/tablecmds.c:11393 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "ne peut pas utiliser une clé primaire déferrable pour la table « %s » référencée" -#: commands/tablecmds.c:11329 +#: commands/tablecmds.c:11410 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "il n'y a pas de clé primaire pour la table « %s » référencée" -#: commands/tablecmds.c:11394 +#: commands/tablecmds.c:11474 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "la liste de colonnes référencées dans la clé étrangère ne doit pas contenir de duplicats" -#: commands/tablecmds.c:11488 +#: commands/tablecmds.c:11566 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "" "ne peut pas utiliser une contrainte unique déferrable pour la table\n" "référencée « %s »" -#: commands/tablecmds.c:11493 +#: commands/tablecmds.c:11571 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "il n'existe aucune contrainte unique correspondant aux clés données pour la table « %s » référencée" -#: commands/tablecmds.c:11934 +#: commands/tablecmds.c:12011 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "ne peut pas supprimer la contrainte héritée « %s » de la relation « %s »" -#: commands/tablecmds.c:11984 +#: commands/tablecmds.c:12061 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "la contrainte « %s » de la relation « %s » n'existe pas, ignore" -#: commands/tablecmds.c:12160 +#: commands/tablecmds.c:12237 #, c-format msgid "cannot alter column type of typed table" msgstr "ne peut pas modifier le type d'une colonne appartenant à une table typée" -#: commands/tablecmds.c:12187 +#: commands/tablecmds.c:12264 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "ne peut pas modifier la colonne héritée « %s »" -#: commands/tablecmds.c:12196 +#: commands/tablecmds.c:12273 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "ne peut pas modifier la colonne « %s » car elle fait partie de la clé de partitionnement de la relation « %s »" -#: commands/tablecmds.c:12246 +#: commands/tablecmds.c:12323 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "le résultat de la clause USING pour la colonne « %s » ne peut pas être converti automatiquement vers le type %s" -#: commands/tablecmds.c:12249 +#: commands/tablecmds.c:12326 #, c-format msgid "You might need to add an explicit cast." msgstr "Vous pouvez avoir besoin d'ajouter une conversion explicite." -#: commands/tablecmds.c:12253 +#: commands/tablecmds.c:12330 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "la colonne « %s » ne peut pas être convertie vers le type %s" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:12256 +#: commands/tablecmds.c:12333 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Vous pouvez avoir besoin de spécifier \"USING %s::%s\"." -#: commands/tablecmds.c:12355 +#: commands/tablecmds.c:12432 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "ne peut pas modifier la colonne héritée « %s » de la relation « %s »" -#: commands/tablecmds.c:12383 +#: commands/tablecmds.c:12461 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "l'expression USING contient une référence de table de ligne complète." -#: commands/tablecmds.c:12394 +#: commands/tablecmds.c:12472 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "le type de colonne héritée « %s » doit aussi être renommée pour les tables filles" -#: commands/tablecmds.c:12519 +#: commands/tablecmds.c:12597 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "ne peut pas modifier la colonne « %s » deux fois" -#: commands/tablecmds.c:12557 +#: commands/tablecmds.c:12635 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "l'expression de génération de la colonne « %s » ne peut pas être convertie vers le type %s automatiquement" -#: commands/tablecmds.c:12562 +#: commands/tablecmds.c:12640 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "" "la valeur par défaut de la colonne « %s » ne peut pas être convertie vers le\n" "type %s automatiquement" -#: commands/tablecmds.c:12643 +#: commands/tablecmds.c:12721 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "ne peut pas modifier le type d'une colonne utilisée dans une vue ou une règle" -#: commands/tablecmds.c:12644 commands/tablecmds.c:12663 -#: commands/tablecmds.c:12681 +#: commands/tablecmds.c:12722 commands/tablecmds.c:12741 +#: commands/tablecmds.c:12759 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s dépend de la colonne « %s »" -#: commands/tablecmds.c:12662 +#: commands/tablecmds.c:12740 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "ne peut pas modifier le type d'une colonne utilisée dans la définition d'un trigger" -#: commands/tablecmds.c:12680 +#: commands/tablecmds.c:12758 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "ne peut pas modifier le type d'une colonne utilisée dans la définition d'une politique" -#: commands/tablecmds.c:12711 +#: commands/tablecmds.c:12789 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "ne peut pas modifier le type d'une colonne utilisée dans colonne générée" -#: commands/tablecmds.c:12712 +#: commands/tablecmds.c:12790 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "La colonne « %s » est utilisée par la colonne générée « %s »" -#: commands/tablecmds.c:13789 commands/tablecmds.c:13801 +#: commands/tablecmds.c:13865 commands/tablecmds.c:13877 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "ne peut pas modifier le propriétaire de l'index « %s »" -#: commands/tablecmds.c:13791 commands/tablecmds.c:13803 -#, c-format -msgid "Change the ownership of the index's table, instead." +#: commands/tablecmds.c:13867 commands/tablecmds.c:13879 +#, fuzzy, c-format +#| msgid "Change the ownership of the index's table, instead." +msgid "Change the ownership of the index's table instead." msgstr "Modifier à la place le propriétaire de la table concernée par l'index." -#: commands/tablecmds.c:13817 +#: commands/tablecmds.c:13893 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "ne peut pas modifier le propriétaire de la séquence « %s »" -#: commands/tablecmds.c:13831 commands/tablecmds.c:17141 -#: commands/tablecmds.c:17160 -#, c-format -msgid "Use ALTER TYPE instead." -msgstr "Utilisez ALTER TYPE à la place." - -#: commands/tablecmds.c:13840 +#: commands/tablecmds.c:13918 #, fuzzy, c-format #| msgid "cannot change owner of index \"%s\"" msgid "cannot change owner of relation \"%s\"" msgstr "ne peut pas modifier le propriétaire de l'index « %s »" -#: commands/tablecmds.c:14202 +#: commands/tablecmds.c:14280 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "ne peut pas avoir de nombreuses sous-commandes SET TABLESPACE" -#: commands/tablecmds.c:14279 +#: commands/tablecmds.c:14357 #, fuzzy, c-format #| msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgid "cannot set options for relation \"%s\"" msgstr "ne peut pas modifier la contrainte « %s » de la relation « %s »" -#: commands/tablecmds.c:14313 commands/view.c:521 +#: commands/tablecmds.c:14391 commands/view.c:445 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION est uniquement accepté pour les vues dont la mise à jour est automatique" -#: commands/tablecmds.c:14563 +#: commands/tablecmds.c:14641 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "seuls les tables, index et vues matérialisées existent dans les tablespaces" -#: commands/tablecmds.c:14575 +#: commands/tablecmds.c:14653 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "ne peut pas déplacer les relations dans ou à partir du tablespace pg_global" -#: commands/tablecmds.c:14667 +#: commands/tablecmds.c:14745 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "annulation car le verrou sur la relation « %s.%s » n'est pas disponible" -#: commands/tablecmds.c:14683 +#: commands/tablecmds.c:14761 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "aucune relation correspondante trouvée dans le tablespace « %s »" -#: commands/tablecmds.c:14800 +#: commands/tablecmds.c:14879 #, c-format msgid "cannot change inheritance of typed table" msgstr "ne peut pas modifier l'héritage d'une table typée" -#: commands/tablecmds.c:14805 commands/tablecmds.c:15361 +#: commands/tablecmds.c:14884 commands/tablecmds.c:15402 #, c-format msgid "cannot change inheritance of a partition" msgstr "ne peut pas modifier l'héritage d'une partition" -#: commands/tablecmds.c:14810 +#: commands/tablecmds.c:14889 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "ne peut pas modifier l'héritage d'une table partitionnée" -#: commands/tablecmds.c:14856 +#: commands/tablecmds.c:14935 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "ne peut pas hériter à partir d'une relation temporaire d'une autre session" -#: commands/tablecmds.c:14869 +#: commands/tablecmds.c:14948 #, c-format msgid "cannot inherit from a partition" msgstr "ne peut pas hériter d'une partition" -#: commands/tablecmds.c:14891 commands/tablecmds.c:17794 +#: commands/tablecmds.c:14970 commands/tablecmds.c:17831 #, c-format msgid "circular inheritance not allowed" msgstr "héritage circulaire interdit" -#: commands/tablecmds.c:14892 commands/tablecmds.c:17795 +#: commands/tablecmds.c:14971 commands/tablecmds.c:17832 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "« %s » est déjà un enfant de « %s »." -#: commands/tablecmds.c:14905 +#: commands/tablecmds.c:14984 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "le trigger « %s » empêche la table « %s » de devenir une fille dans l'héritage" -#: commands/tablecmds.c:14907 +#: commands/tablecmds.c:14986 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "les triggers ROW avec des tables de transition ne sont pas supportés dans les hiérarchies d'héritage." -#: commands/tablecmds.c:15110 +#: commands/tablecmds.c:15189 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "la colonne « %s » de la table enfant doit être marquée comme NOT NULL" -#: commands/tablecmds.c:15119 +#: commands/tablecmds.c:15198 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "la colonne « %s » de la table enfant doit être une colonne générée" -#: commands/tablecmds.c:15169 -#, c-format -msgid "column \"%s\" in child table has a conflicting generation expression" -msgstr "la colonne « %s » de la table enfant a une expression de génération en conflit" +#: commands/tablecmds.c:15203 +#, fuzzy, c-format +#| msgid "column \"%s\" in child table must be a generated column" +msgid "column \"%s\" in child table must not be a generated column" +msgstr "la colonne « %s » de la table enfant doit être une colonne générée" -#: commands/tablecmds.c:15197 +#: commands/tablecmds.c:15234 #, c-format msgid "child table is missing column \"%s\"" msgstr "la table enfant n'a pas de colonne « %s »" -#: commands/tablecmds.c:15285 +#: commands/tablecmds.c:15322 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "la table fille « %s » a un type différent pour la contrainte de vérification « %s »" -#: commands/tablecmds.c:15293 +#: commands/tablecmds.c:15330 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "la contrainte « %s » entre en conflit avec une contrainte non héritée sur la table fille « %s »" -#: commands/tablecmds.c:15304 +#: commands/tablecmds.c:15341 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "la contrainte « %s » entre en conflit avec une contrainte NOT VALID sur la table fille « %s »" -#: commands/tablecmds.c:15339 +#: commands/tablecmds.c:15380 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "la table enfant n'a pas de contrainte « %s »" -#: commands/tablecmds.c:15425 +#: commands/tablecmds.c:15466 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "la partition « %s » déjà en attente de détachement de la table partitionnée « %s.%s »" -#: commands/tablecmds.c:15454 commands/tablecmds.c:15502 +#: commands/tablecmds.c:15495 commands/tablecmds.c:15543 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "la relation « %s » n'est pas une partition de la relation « %s »" -#: commands/tablecmds.c:15508 +#: commands/tablecmds.c:15549 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "la relation « %s » n'est pas un parent de la relation « %s »" -#: commands/tablecmds.c:15736 +#: commands/tablecmds.c:15777 #, c-format msgid "typed tables cannot inherit" msgstr "les tables avec type ne peuvent pas hériter d'autres tables" -#: commands/tablecmds.c:15766 +#: commands/tablecmds.c:15807 #, c-format msgid "table is missing column \"%s\"" msgstr "la colonne « %s » manque à la table" -#: commands/tablecmds.c:15777 +#: commands/tablecmds.c:15818 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "la table a une colonne « %s » alors que le type impose « %s »" -#: commands/tablecmds.c:15786 +#: commands/tablecmds.c:15827 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "la table « %s » a un type différent pour la colonne « %s »" -#: commands/tablecmds.c:15800 +#: commands/tablecmds.c:15841 #, c-format msgid "table has extra column \"%s\"" msgstr "la table a une colonne supplémentaire « %s »" -#: commands/tablecmds.c:15852 +#: commands/tablecmds.c:15893 #, c-format msgid "\"%s\" is not a typed table" msgstr "« %s » n'est pas une table typée" -#: commands/tablecmds.c:16026 +#: commands/tablecmds.c:16067 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "ne peut pas utiliser l'index non unique « %s » comme identité de réplicat" -#: commands/tablecmds.c:16032 +#: commands/tablecmds.c:16073 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "ne peut pas utiliser l'index « %s » immédiat comme identité de réplicat" -#: commands/tablecmds.c:16038 +#: commands/tablecmds.c:16079 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "ne peut pas utiliser un index par expression « %s » comme identité de réplicat" -#: commands/tablecmds.c:16044 +#: commands/tablecmds.c:16085 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "ne peut pas utiliser l'index partiel « %s » comme identité de réplicat" -#: commands/tablecmds.c:16061 +#: commands/tablecmds.c:16102 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "l'index « %s » ne peut pas être utilisé comme identité de réplicat car la colonne %d est une colonne système" -#: commands/tablecmds.c:16068 +#: commands/tablecmds.c:16109 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "l'index « %s » ne peut pas être utilisé comme identité de réplicat car la colonne « %s » peut être NULL" -#: commands/tablecmds.c:16315 +#: commands/tablecmds.c:16354 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "ne peut pas modifier le statut de journalisation de la table « %s » parce qu'elle est temporaire" -#: commands/tablecmds.c:16339 +#: commands/tablecmds.c:16378 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "ne peut pas modifier la table « %s » en non journalisée car elle fait partie d'une publication" -#: commands/tablecmds.c:16341 +#: commands/tablecmds.c:16380 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Les relations non journalisées ne peuvent pas être répliquées." -#: commands/tablecmds.c:16386 +#: commands/tablecmds.c:16425 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "n'a pas pu passer la table « %s » en journalisé car elle référence la table non journalisée « %s »" -#: commands/tablecmds.c:16396 +#: commands/tablecmds.c:16435 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "n'a pas pu passer la table « %s » en non journalisé car elle référence la table journalisée « %s »" -#: commands/tablecmds.c:16454 +#: commands/tablecmds.c:16493 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "ne peut pas déplacer une séquence OWNED BY dans un autre schéma" -#: commands/tablecmds.c:16561 +#: commands/tablecmds.c:16600 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "la relation « %s » existe déjà dans le schéma « %s »" -#: commands/tablecmds.c:16974 +#: commands/tablecmds.c:17020 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "« %s » n'est ni une table ni une vue matérialisée" -#: commands/tablecmds.c:17124 +#: commands/tablecmds.c:17170 #, c-format msgid "\"%s\" is not a composite type" msgstr "« %s » n'est pas un type composite" -#: commands/tablecmds.c:17152 +#: commands/tablecmds.c:17200 #, fuzzy, c-format #| msgid "cannot change owner of index \"%s\"" msgid "cannot change schema of index \"%s\"" msgstr "ne peut pas modifier le propriétaire de l'index « %s »" -#: commands/tablecmds.c:17154 commands/tablecmds.c:17166 +#: commands/tablecmds.c:17202 commands/tablecmds.c:17216 #, fuzzy, c-format #| msgid "Change the ownership of the index's table, instead." msgid "Change the schema of the table instead." msgstr "Modifier à la place le propriétaire de la table concernée par l'index." -#: commands/tablecmds.c:17158 +#: commands/tablecmds.c:17206 #, fuzzy, c-format #| msgid "cannot convert Perl hash to non-composite type %s" msgid "cannot change schema of composite type \"%s\"" msgstr "ne peut pas convertir le hachage Perl en un type %s non composite" -#: commands/tablecmds.c:17164 +#: commands/tablecmds.c:17214 #, fuzzy, c-format #| msgid "cannot change TOAST relation \"%s\"" msgid "cannot change schema of TOAST table \"%s\"" msgstr "ne peut pas modifier la relation TOAST « %s »" -#: commands/tablecmds.c:17201 -#, c-format -msgid "unrecognized partitioning strategy \"%s\"" -msgstr "stratégie de partitionnement « %s » non reconnue" - -#: commands/tablecmds.c:17209 +#: commands/tablecmds.c:17246 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "ne peut pas utiliser la stratégie de partitionnement « list » avec plus d'une colonne" -#: commands/tablecmds.c:17275 +#: commands/tablecmds.c:17312 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "la colonne « %s » nommée dans la clé de partitionnement n'existe pas" -#: commands/tablecmds.c:17283 +#: commands/tablecmds.c:17320 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "ne peut pas utiliser la colonne système « %s » comme clé de partitionnement" -#: commands/tablecmds.c:17294 commands/tablecmds.c:17408 +#: commands/tablecmds.c:17331 commands/tablecmds.c:17445 #, c-format msgid "cannot use generated column in partition key" msgstr "ne peut pas utiliser une colonne générée dans une clé de partitionnement" -#: commands/tablecmds.c:17295 commands/tablecmds.c:17409 commands/trigger.c:667 -#: rewrite/rewriteHandler.c:912 rewrite/rewriteHandler.c:947 +#: commands/tablecmds.c:17332 commands/tablecmds.c:17446 commands/trigger.c:663 +#: rewrite/rewriteHandler.c:936 rewrite/rewriteHandler.c:971 #, c-format msgid "Column \"%s\" is a generated column." msgstr "la colonne « %s » est une colonne générée." -#: commands/tablecmds.c:17371 +#: commands/tablecmds.c:17408 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "" "les fonctions dans une expression de clé de partitionnement doivent être marquées comme\n" "IMMUTABLE" -#: commands/tablecmds.c:17391 +#: commands/tablecmds.c:17428 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "les expressions de la clé de partitionnement ne peuvent pas contenir des références aux colonnes systèmes" -#: commands/tablecmds.c:17421 +#: commands/tablecmds.c:17458 #, c-format msgid "cannot use constant expression as partition key" msgstr "ne peut pas utiliser une expression constante comme clé de partitionnement" -#: commands/tablecmds.c:17442 +#: commands/tablecmds.c:17479 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "n'a pas pu déterminer le collationnement à utiliser pour l'expression de partitionnement" -#: commands/tablecmds.c:17477 +#: commands/tablecmds.c:17514 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "" "Vous devez spécifier une classe d'opérateur hash ou définir une\n" "classe d'opérateur hash par défaut pour le type de données." -#: commands/tablecmds.c:17483 +#: commands/tablecmds.c:17520 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "" "Vous devez spécifier une classe d'opérateur btree ou définir une\n" "classe d'opérateur btree par défaut pour le type de données." -#: commands/tablecmds.c:17734 +#: commands/tablecmds.c:17771 #, c-format msgid "\"%s\" is already a partition" msgstr "« %s » est déjà une partition" -#: commands/tablecmds.c:17740 +#: commands/tablecmds.c:17777 #, c-format msgid "cannot attach a typed table as partition" msgstr "ne peut pas attacher une table typée à une partition" -#: commands/tablecmds.c:17756 +#: commands/tablecmds.c:17793 #, c-format msgid "cannot attach inheritance child as partition" msgstr "ne peut pas ajouter la table en héritage comme une partition" -#: commands/tablecmds.c:17770 +#: commands/tablecmds.c:17807 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "ne peut pas attacher le parent d'héritage comme partition" -#: commands/tablecmds.c:17804 +#: commands/tablecmds.c:17841 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "ne peut pas attacher une relation temporaire comme partition de la relation permanente « %s »" -#: commands/tablecmds.c:17812 +#: commands/tablecmds.c:17849 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "ne peut pas attacher une relation permanente comme partition de la relation temporaire « %s »" -#: commands/tablecmds.c:17820 +#: commands/tablecmds.c:17857 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "ne peut pas attacher comme partition d'une relation temporaire d'une autre session" -#: commands/tablecmds.c:17827 +#: commands/tablecmds.c:17864 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "ne peut pas attacher une relation temporaire d'une autre session comme partition" -#: commands/tablecmds.c:17847 +#: commands/tablecmds.c:17884 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "la table « %s » contient la colonne « %s » introuvable dans le parent « %s »" -#: commands/tablecmds.c:17850 +#: commands/tablecmds.c:17887 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "La nouvelle partition pourrait seulement contenir les colonnes présentes dans le parent." -#: commands/tablecmds.c:17862 +#: commands/tablecmds.c:17899 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "le trigger « %s » empêche la table « %s » de devenir une partition" -#: commands/tablecmds.c:17864 +#: commands/tablecmds.c:17901 #, fuzzy, c-format #| msgid "ROW triggers with transition tables are not supported on partitions" msgid "ROW triggers with transition tables are not supported on partitions." msgstr "les triggers ROW avec des tables de transition ne sont pas supportés sur les partitions" -#: commands/tablecmds.c:18043 +#: commands/tablecmds.c:18080 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "ne peut pas attacher la table distante « %s » comme partition de la table partitionnée « %s »" -#: commands/tablecmds.c:18046 +#: commands/tablecmds.c:18083 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "La table partitionnée « %s » contient des index uniques." -#: commands/tablecmds.c:18357 +#: commands/tablecmds.c:18400 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "ne peut pas détacher les partitions en parallèle quand une partition par défaut existe" -#: commands/tablecmds.c:18466 +#: commands/tablecmds.c:18509 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "la table partitionnée « %s » a été supprimée de manière concurrente" -#: commands/tablecmds.c:18472 +#: commands/tablecmds.c:18515 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "la partition « %s » a été supprimée de façon concurrente" -#: commands/tablecmds.c:18987 commands/tablecmds.c:19007 -#: commands/tablecmds.c:19027 commands/tablecmds.c:19046 -#: commands/tablecmds.c:19088 +#: commands/tablecmds.c:19030 commands/tablecmds.c:19050 +#: commands/tablecmds.c:19071 commands/tablecmds.c:19090 +#: commands/tablecmds.c:19132 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "ne peut pas attacher l'index « %s » comme une partition de l'index « %s »" -#: commands/tablecmds.c:18990 +#: commands/tablecmds.c:19033 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "L'index « %s » est déjà attaché à un autre index." -#: commands/tablecmds.c:19010 +#: commands/tablecmds.c:19053 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "L'index « %s » n'est un index sur aucune des partitions de la table « %s »." -#: commands/tablecmds.c:19030 +#: commands/tablecmds.c:19074 #, c-format msgid "The index definitions do not match." msgstr "La définition de l'index correspond pas." -#: commands/tablecmds.c:19049 +#: commands/tablecmds.c:19093 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "L'index « %s » appartient à une contrainte dans la table « %s » mais aucune contrainte n'existe pour l'index « %s »." -#: commands/tablecmds.c:19091 +#: commands/tablecmds.c:19135 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "Un autre index est déjà attaché pour la partition « %s »." -#: commands/tablecmds.c:19321 +#: commands/tablecmds.c:19371 #, c-format msgid "column data type %s does not support compression" msgstr "le type de données %s ne supporte pas la compression" -#: commands/tablecmds.c:19328 +#: commands/tablecmds.c:19378 #, c-format msgid "invalid compression method \"%s\"" msgstr "méthode de compression « %s » invalide" -#: commands/tablespace.c:199 commands/tablespace.c:665 +#: commands/tablecmds.c:19404 +#, c-format +msgid "invalid storage type \"%s\"" +msgstr "type de stockage « %s » invalide" + +#: commands/tablecmds.c:19414 +#, c-format +msgid "column data type %s can only have storage PLAIN" +msgstr "le type de données %s de la colonne peut seulement avoir un stockage PLAIN" + +#: commands/tablespace.c:199 commands/tablespace.c:650 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "« %s » existe mais n'est pas un répertoire" -#: commands/tablespace.c:231 +#: commands/tablespace.c:230 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "droit refusé pour créer le tablespace « %s »" -#: commands/tablespace.c:233 +#: commands/tablespace.c:232 #, c-format msgid "Must be superuser to create a tablespace." msgstr "Doit être super-utilisateur pour créer un tablespace." -#: commands/tablespace.c:249 +#: commands/tablespace.c:248 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "le chemin du tablespace ne peut pas contenir de guillemets simples" -#: commands/tablespace.c:262 +#: commands/tablespace.c:261 #, c-format msgid "tablespace location must be an absolute path" msgstr "le chemin du tablespace doit être un chemin absolu" -#: commands/tablespace.c:274 +#: commands/tablespace.c:273 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "le chemin du tablespace « %s » est trop long" -#: commands/tablespace.c:281 +#: commands/tablespace.c:280 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "l'emplacement du tablespace ne doit pas être dans le répertoire de données" -#: commands/tablespace.c:290 commands/tablespace.c:996 +#: commands/tablespace.c:289 commands/tablespace.c:976 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "nom inacceptable pour le tablespace « %s »" -#: commands/tablespace.c:292 commands/tablespace.c:997 +#: commands/tablespace.c:291 commands/tablespace.c:977 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "Le préfixe « pg_ » est réservé pour les tablespaces système." -#: commands/tablespace.c:311 commands/tablespace.c:1018 +#: commands/tablespace.c:310 commands/tablespace.c:998 #, c-format msgid "tablespace \"%s\" already exists" msgstr "le tablespace « %s » existe déjà" -#: commands/tablespace.c:329 +#: commands/tablespace.c:326 #, fuzzy, c-format #| msgid "pg_type OID value not set when in binary upgrade mode" msgid "pg_tablespace OID value not set when in binary upgrade mode" msgstr "OID de pg_type non configuré en mode de mise à jour binaire" -#: commands/tablespace.c:441 commands/tablespace.c:979 -#: commands/tablespace.c:1068 commands/tablespace.c:1137 -#: commands/tablespace.c:1283 commands/tablespace.c:1486 +#: commands/tablespace.c:431 commands/tablespace.c:959 +#: commands/tablespace.c:1048 commands/tablespace.c:1117 +#: commands/tablespace.c:1263 commands/tablespace.c:1466 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "le tablespace « %s » n'existe pas" -#: commands/tablespace.c:447 +#: commands/tablespace.c:437 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "le tablespace « %s » n'existe pas, poursuite du traitement" -#: commands/tablespace.c:473 +#: commands/tablespace.c:463 #, c-format msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" msgstr "le tablespace « %s » ne peut pas être supprimé car d'autres objets en dépendent" -#: commands/tablespace.c:540 +#: commands/tablespace.c:530 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "le tablespace « %s » n'est pas vide" -#: commands/tablespace.c:632 +#: commands/tablespace.c:617 #, c-format msgid "directory \"%s\" does not exist" msgstr "le répertoire « %s » n'existe pas" -#: commands/tablespace.c:633 +#: commands/tablespace.c:618 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "Créer le répertoire pour ce tablespace avant de redémarrer le serveur." -#: commands/tablespace.c:638 +#: commands/tablespace.c:623 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "n'a pas pu configurer les droits du répertoire « %s » : %m" -#: commands/tablespace.c:670 +#: commands/tablespace.c:655 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "répertoire « %s » déjà utilisé comme tablespace" -#: commands/tablespace.c:788 commands/tablespace.c:801 -#: commands/tablespace.c:837 commands/tablespace.c:929 storage/file/fd.c:3255 -#: storage/file/fd.c:3669 -#, c-format -msgid "could not remove directory \"%s\": %m" -msgstr "n'a pas pu supprimer le répertoire « %s » : %m" - -#: commands/tablespace.c:850 commands/tablespace.c:938 +#: commands/tablespace.c:833 commands/tablespace.c:919 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "n'a pas pu supprimer le lien symbolique « %s » : %m" -#: commands/tablespace.c:860 commands/tablespace.c:947 +#: commands/tablespace.c:842 commands/tablespace.c:927 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "« %s » n'est ni un répertoire ni un lien symbolique" -#: commands/tablespace.c:1142 +#: commands/tablespace.c:1122 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "Le tablespace « %s » n'existe pas." -#: commands/tablespace.c:1588 +#: commands/tablespace.c:1568 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "les répertoires du tablespace %u n'ont pas pu être supprimés" -#: commands/tablespace.c:1590 +#: commands/tablespace.c:1570 #, c-format msgid "You can remove the directories manually if necessary." msgstr "Vous pouvez supprimer les répertoires manuellement si nécessaire." -#: commands/trigger.c:229 commands/trigger.c:240 +#: commands/trigger.c:232 commands/trigger.c:243 #, c-format msgid "\"%s\" is a table" msgstr "« %s » est une table" -#: commands/trigger.c:231 commands/trigger.c:242 +#: commands/trigger.c:234 commands/trigger.c:245 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Les tables ne peuvent pas avoir de triggers INSTEAD OF." -#: commands/trigger.c:263 +#: commands/trigger.c:266 #, c-format msgid "\"%s\" is a partitioned table" msgstr "« %s » est une table partitionnée" -#: commands/trigger.c:265 +#: commands/trigger.c:268 #, fuzzy, c-format #| msgid "ROW triggers with transition tables are not supported on partitions" msgid "ROW triggers with transition tables are not supported on partitioned tables." msgstr "les triggers ROW avec des tables de transition ne sont pas supportés sur les partitions" -#: commands/trigger.c:277 commands/trigger.c:284 commands/trigger.c:455 +#: commands/trigger.c:280 commands/trigger.c:287 commands/trigger.c:451 #, c-format msgid "\"%s\" is a view" msgstr "« %s » est une vue" -#: commands/trigger.c:279 +#: commands/trigger.c:282 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "Les vues ne peuvent pas avoir de trigger BEFORE ou AFTER au niveau ligne." -#: commands/trigger.c:286 +#: commands/trigger.c:289 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "Les vues ne peuvent pas avoir de triggers TRUNCATE." -#: commands/trigger.c:294 commands/trigger.c:301 commands/trigger.c:313 -#: commands/trigger.c:448 +#: commands/trigger.c:297 commands/trigger.c:309 commands/trigger.c:444 #, c-format msgid "\"%s\" is a foreign table" msgstr "« %s » est une table distante" -#: commands/trigger.c:296 +#: commands/trigger.c:299 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "Les tables distantes ne peuvent pas avoir de triggers INSTEAD OF." -#: commands/trigger.c:303 -#, c-format -msgid "Foreign tables cannot have TRUNCATE triggers." -msgstr "Les tables distantes ne peuvent pas avoir de triggers TRUNCATE." - -#: commands/trigger.c:315 +#: commands/trigger.c:311 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Les tables distantes ne peuvent pas avoir de triggers de contrainte." -#: commands/trigger.c:320 commands/trigger.c:1375 commands/trigger.c:1482 +#: commands/trigger.c:316 commands/trigger.c:1332 commands/trigger.c:1439 #, fuzzy, c-format #| msgid "Foreign tables cannot have TRUNCATE triggers." msgid "relation \"%s\" cannot have triggers" msgstr "Les tables distantes ne peuvent pas avoir de triggers TRUNCATE." -#: commands/trigger.c:391 +#: commands/trigger.c:387 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "les triggers TRUNCATE FOR EACH ROW ne sont pas supportés" -#: commands/trigger.c:399 +#: commands/trigger.c:395 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "les triggers INSTEAD OF doivent être FOR EACH ROW" -#: commands/trigger.c:403 +#: commands/trigger.c:399 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "les triggers INSTEAD OF ne peuvent pas avoir de conditions WHEN" -#: commands/trigger.c:407 +#: commands/trigger.c:403 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "les triggers INSTEAD OF ne peuvent pas avoir de liste de colonnes" -#: commands/trigger.c:436 +#: commands/trigger.c:432 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "le nommage de variable ROW dans la clause REFERENCING n'est pas supporté" -#: commands/trigger.c:437 +#: commands/trigger.c:433 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "Utilisez OLD TABLE ou NEW TABLE pour nommer les tables de transition." -#: commands/trigger.c:450 +#: commands/trigger.c:446 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Les triggers sur les tables distantes ne peuvent pas avoir de tables de transition." -#: commands/trigger.c:457 +#: commands/trigger.c:453 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Les triggers sur les vues ne peuvent pas avoir de tables de transition." -#: commands/trigger.c:473 +#: commands/trigger.c:469 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "les triggers ROW avec des tables de transition ne sont pas supportés sur les partitions" -#: commands/trigger.c:477 +#: commands/trigger.c:473 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" msgstr "les triggers ROW avec des tables de transition ne sont pas supportés sur les filles en héritage" -#: commands/trigger.c:483 +#: commands/trigger.c:479 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "le nom de la table de transition peut seulement être spécifié pour un trigger AFTER" -#: commands/trigger.c:488 +#: commands/trigger.c:484 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "les triggers TRUNCATE avec des tables de transition ne sont pas supportés" -#: commands/trigger.c:505 +#: commands/trigger.c:501 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" msgstr "les tables de transition ne peuvent pas être spécifiées pour les triggers avec plus d'un événement" -#: commands/trigger.c:516 +#: commands/trigger.c:512 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "les tables de transition ne peuvent pas être spécifiées pour les triggers avec des listes de colonnes" -#: commands/trigger.c:533 +#: commands/trigger.c:529 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "OLD TABLE peut seulement être spécifié pour un trigger INSERT ou UPDATE" -#: commands/trigger.c:538 +#: commands/trigger.c:534 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE ne peut pas être spécifié plusieurs fois" -#: commands/trigger.c:548 +#: commands/trigger.c:544 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE peut seulement être spécifié pour un trigger DELETE ou UPDATE" -#: commands/trigger.c:553 +#: commands/trigger.c:549 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE ne peut pas être spécifié plusieurs fois" -#: commands/trigger.c:563 +#: commands/trigger.c:559 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "les noms de OLD TABLE et NEW TABLE ne peuvent pas être identiques" -#: commands/trigger.c:627 commands/trigger.c:640 +#: commands/trigger.c:623 commands/trigger.c:636 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "" "la condition WHEN de l'instruction du trigger ne peut pas référencer les valeurs\n" "des colonnes" -#: commands/trigger.c:632 +#: commands/trigger.c:628 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "la condition WHEN du trigger INSERT ne peut pas référencer les valeurs OLD" -#: commands/trigger.c:645 +#: commands/trigger.c:641 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "la condition WHEN du trigger DELETE ne peut pas référencer les valeurs NEW" -#: commands/trigger.c:650 +#: commands/trigger.c:646 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "la condition WHEN d'un trigger BEFORE ne doit pas référencer dans NEW les colonnes système" -#: commands/trigger.c:658 commands/trigger.c:666 +#: commands/trigger.c:654 commands/trigger.c:662 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "la condition WHEN d'un trigger BEFORE ne doit pas référencer dans NEW les colonnes générées" -#: commands/trigger.c:659 +#: commands/trigger.c:655 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "Une référence comprenant toute une ligne est utilisée et la table contient des colonnes générées." -#: commands/trigger.c:774 commands/trigger.c:1657 +#: commands/trigger.c:770 commands/trigger.c:1614 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "le trigger « %s » de la relation « %s » existe déjà" -#: commands/trigger.c:787 +#: commands/trigger.c:783 #, fuzzy, c-format #| msgid "trigger \"%s\" for relation \"%s\" is an internal trigger" msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" msgstr "le trigger « %s » de la relation « %s » est un trigger interne" -#: commands/trigger.c:806 +#: commands/trigger.c:802 #, c-format msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" msgstr "le trigger « %s » de la relation « %s » est un trigger de contrainte" -#: commands/trigger.c:1447 commands/trigger.c:1600 commands/trigger.c:1876 +#: commands/trigger.c:1404 commands/trigger.c:1557 commands/trigger.c:1838 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "le trigger « %s » de la table « %s » n'existe pas" -#: commands/trigger.c:1572 +#: commands/trigger.c:1529 #, fuzzy, c-format #| msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgid "cannot rename trigger \"%s\" on table \"%s\"" msgstr "aucune entrée pg_constraint pour le trigger « %s » sur la table « %s »" -#: commands/trigger.c:1574 +#: commands/trigger.c:1531 #, fuzzy, c-format #| msgid "cannot reference partitioned table \"%s\"" msgid "Rename the trigger on the partitioned table \"%s\" instead." msgstr "ne peut pas référencer la table partitionnée « %s »" -#: commands/trigger.c:1674 +#: commands/trigger.c:1631 #, fuzzy, c-format #| msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgid "renamed trigger \"%s\" on relation \"%s\"" msgstr "ne peut pas modifier la contrainte « %s » de la relation « %s »" -#: commands/trigger.c:1816 +#: commands/trigger.c:1777 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "droit refusé : « %s » est un trigger système" -#: commands/trigger.c:2437 +#: commands/trigger.c:2386 #, c-format msgid "trigger function %u returned null value" msgstr "la fonction trigger %u a renvoyé la valeur NULL" -#: commands/trigger.c:2497 commands/trigger.c:2715 commands/trigger.c:2965 -#: commands/trigger.c:3298 +#: commands/trigger.c:2446 commands/trigger.c:2664 commands/trigger.c:2917 +#: commands/trigger.c:3252 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "un trigger BEFORE STATEMENT ne peut pas renvoyer une valeur" -#: commands/trigger.c:2573 +#: commands/trigger.c:2522 #, c-format msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" msgstr "le déplacement de la ligne vers une autre partition par un trigger BEFORE FOR EACH ROW n'est pas supporté" -#: commands/trigger.c:2574 +#: commands/trigger.c:2523 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "Avant d'exécuter le trigger « %s », la ligne devait aller dans la partition « %s.%s »." -#: commands/trigger.c:3372 executor/nodeModifyTable.c:2349 -#: executor/nodeModifyTable.c:2432 +#: commands/trigger.c:3329 executor/nodeModifyTable.c:2363 +#: executor/nodeModifyTable.c:2446 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "la ligne à mettre à jour était déjà modifiée par une opération déclenchée par la commande courante" -#: commands/trigger.c:3373 executor/nodeModifyTable.c:1535 -#: executor/nodeModifyTable.c:1609 executor/nodeModifyTable.c:2350 -#: executor/nodeModifyTable.c:2433 executor/nodeModifyTable.c:3091 +#: commands/trigger.c:3330 executor/nodeModifyTable.c:1531 +#: executor/nodeModifyTable.c:1605 executor/nodeModifyTable.c:2364 +#: executor/nodeModifyTable.c:2447 executor/nodeModifyTable.c:3078 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "Considérez l'utilisation d'un trigger AFTER au lieu d'un trigger BEFORE pour propager les changements sur les autres lignes." -#: commands/trigger.c:3402 executor/nodeLockRows.c:229 -#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:331 -#: executor/nodeModifyTable.c:1551 executor/nodeModifyTable.c:2367 -#: executor/nodeModifyTable.c:2577 +#: commands/trigger.c:3371 executor/nodeLockRows.c:228 +#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:308 +#: executor/nodeModifyTable.c:1547 executor/nodeModifyTable.c:2381 +#: executor/nodeModifyTable.c:2589 #, c-format msgid "could not serialize access due to concurrent update" msgstr "n'a pas pu sérialiser un accès à cause d'une mise à jour en parallèle" -#: commands/trigger.c:3410 executor/nodeModifyTable.c:1641 -#: executor/nodeModifyTable.c:2450 executor/nodeModifyTable.c:2601 -#: executor/nodeModifyTable.c:2957 +#: commands/trigger.c:3379 executor/nodeModifyTable.c:1637 +#: executor/nodeModifyTable.c:2464 executor/nodeModifyTable.c:2613 +#: executor/nodeModifyTable.c:2966 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "n'a pas pu sérialiser un accès à cause d'une suppression en parallèle" @@ -12090,24 +12344,24 @@ msgstr "ne peut pas spécifier à la fois PARSER et COPY" msgid "text search parser is required" msgstr "l'analyseur de la recherche plein texte est requis" -#: commands/tsearchcmds.c:1200 +#: commands/tsearchcmds.c:1241 #, c-format msgid "token type \"%s\" does not exist" msgstr "le type de jeton « %s » n'existe pas" -#: commands/tsearchcmds.c:1427 +#: commands/tsearchcmds.c:1501 #, c-format msgid "mapping for token type \"%s\" does not exist" msgstr "la correspondance pour le type de jeton « %s » n'existe pas" -#: commands/tsearchcmds.c:1433 +#: commands/tsearchcmds.c:1507 #, c-format msgid "mapping for token type \"%s\" does not exist, skipping" msgstr "" "la correspondance pour le type de jeton « %s » n'existe pas, poursuite du\n" "traitement" -#: commands/tsearchcmds.c:1596 commands/tsearchcmds.c:1711 +#: commands/tsearchcmds.c:1670 commands/tsearchcmds.c:1785 #, c-format msgid "invalid parameter list format: \"%s\"" msgstr "format de liste de paramètres invalide : « %s »" @@ -12122,7 +12376,7 @@ msgstr "doit être super-utilisateur pour créer un type de base" msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." msgstr "Créez le type comme un type shell, puis créez ses fonctions I/O, puis faites un vrai CREATE TYPE." -#: commands/typecmds.c:327 commands/typecmds.c:1450 commands/typecmds.c:4268 +#: commands/typecmds.c:327 commands/typecmds.c:1450 commands/typecmds.c:4263 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "attribut du type « %s » non reconnu" @@ -12142,7 +12396,7 @@ msgstr "le type d'élément tableau ne peut pas être %s" msgid "alignment \"%s\" not recognized" msgstr "alignement « %s » non reconnu" -#: commands/typecmds.c:450 commands/typecmds.c:4142 +#: commands/typecmds.c:450 commands/typecmds.c:4137 #, c-format msgid "storage \"%s\" not recognized" msgstr "stockage « %s » non reconnu" @@ -12189,27 +12443,27 @@ msgstr "contraintes NULL/NOT NULL en conflit" msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "les contraintes CHECK pour les domaines ne peuvent pas être marquées NO INHERIT" -#: commands/typecmds.c:976 commands/typecmds.c:2960 +#: commands/typecmds.c:976 commands/typecmds.c:2956 #, c-format msgid "unique constraints not possible for domains" msgstr "contraintes uniques impossible pour les domaines" -#: commands/typecmds.c:982 commands/typecmds.c:2966 +#: commands/typecmds.c:982 commands/typecmds.c:2962 #, c-format msgid "primary key constraints not possible for domains" msgstr "contraintes de clé primaire impossible pour les domaines" -#: commands/typecmds.c:988 commands/typecmds.c:2972 +#: commands/typecmds.c:988 commands/typecmds.c:2968 #, c-format msgid "exclusion constraints not possible for domains" msgstr "contraintes d'exclusion impossible pour les domaines" -#: commands/typecmds.c:994 commands/typecmds.c:2978 +#: commands/typecmds.c:994 commands/typecmds.c:2974 #, c-format msgid "foreign key constraints not possible for domains" msgstr "contraintes de clé étrangère impossible pour les domaines" -#: commands/typecmds.c:1003 commands/typecmds.c:2987 +#: commands/typecmds.c:1003 commands/typecmds.c:2983 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "spécifier des contraintes déferrantes n'est pas supporté par les domaines" @@ -12244,541 +12498,668 @@ msgstr "ne peut pas spécifier une fonction canonique sans un type shell précé msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." msgstr "Créez le type comme un type shell, puis créez sa fonction canonisée, puis faites un vrai CREATE TYPE." -#: commands/typecmds.c:1966 +#: commands/typecmds.c:1965 #, c-format msgid "type input function %s has multiple matches" msgstr "la fonction d'entrée du type %s a plusieurs correspondances" -#: commands/typecmds.c:1984 +#: commands/typecmds.c:1983 #, c-format msgid "type input function %s must return type %s" msgstr "le type d'entrée de la fonction %s doit être %s" -#: commands/typecmds.c:2000 +#: commands/typecmds.c:1999 #, c-format msgid "type input function %s should not be volatile" msgstr "la fonction en entrée du type %s ne doit pas être volatile" -#: commands/typecmds.c:2028 +#: commands/typecmds.c:2027 #, c-format msgid "type output function %s must return type %s" msgstr "le type de sortie de la fonction %s doit être %s" -#: commands/typecmds.c:2035 +#: commands/typecmds.c:2034 #, c-format msgid "type output function %s should not be volatile" msgstr "la fonction en entrée du type %s ne doit pas être volatile" -#: commands/typecmds.c:2064 +#: commands/typecmds.c:2063 #, c-format msgid "type receive function %s has multiple matches" msgstr "la fonction receive du type %s a plusieurs correspondances" -#: commands/typecmds.c:2082 +#: commands/typecmds.c:2081 #, c-format msgid "type receive function %s must return type %s" msgstr "la fonction receive du type %s doit renvoyer le type %s" -#: commands/typecmds.c:2089 +#: commands/typecmds.c:2088 #, c-format msgid "type receive function %s should not be volatile" msgstr "la fonction receive du type %s ne doit pas être volatile" -#: commands/typecmds.c:2117 +#: commands/typecmds.c:2116 #, c-format msgid "type send function %s must return type %s" msgstr "le type de sortie de la fonction d'envoi %s doit être %s" -#: commands/typecmds.c:2124 +#: commands/typecmds.c:2123 #, c-format msgid "type send function %s should not be volatile" msgstr "la fonction send du type %s ne doit pas être volatile" -#: commands/typecmds.c:2151 +#: commands/typecmds.c:2150 #, c-format msgid "typmod_in function %s must return type %s" msgstr "le type de sortie de la fonction typmod_in %s doit être %s" -#: commands/typecmds.c:2158 +#: commands/typecmds.c:2157 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "la fonction en entrée du modificateur de type %s ne devrait pas être volatile" -#: commands/typecmds.c:2185 +#: commands/typecmds.c:2184 #, c-format msgid "typmod_out function %s must return type %s" msgstr "le type de sortie de la fonction typmod_out %s doit être %s" -#: commands/typecmds.c:2192 +#: commands/typecmds.c:2191 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "la fonction en sortie du modificateur de type %s ne devrait pas être volatile" -#: commands/typecmds.c:2219 +#: commands/typecmds.c:2218 #, c-format msgid "type analyze function %s must return type %s" msgstr "la fonction analyze du type %s doit renvoyer le type %s" -#: commands/typecmds.c:2248 +#: commands/typecmds.c:2247 #, c-format msgid "type subscripting function %s must return type %s" msgstr "la fonction %s d'indiçage de type doit renvoyer le type %s" -#: commands/typecmds.c:2258 +#: commands/typecmds.c:2257 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "les types utilisateurs ne peuvent pas utiliser la fonction d'indiçage %s" -#: commands/typecmds.c:2304 +#: commands/typecmds.c:2303 #, c-format msgid "You must specify an operator class for the range type or define a default operator class for the subtype." msgstr "" "Vous devez spécifier une classe d'opérateur pour le type range ou définir une\n" "classe d'opérateur par défaut pour le sous-type." -#: commands/typecmds.c:2335 +#: commands/typecmds.c:2334 #, c-format msgid "range canonical function %s must return range type" msgstr "la fonction canonical %s du range doit renvoyer le type range" -#: commands/typecmds.c:2341 +#: commands/typecmds.c:2340 #, c-format msgid "range canonical function %s must be immutable" msgstr "la fonction canonical %s du range doit être immutable" -#: commands/typecmds.c:2377 +#: commands/typecmds.c:2376 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "" "la fonction %s de calcul de différence pour le sous-type d'un intervalle de\n" "valeur doit renvoyer le type %s" -#: commands/typecmds.c:2384 +#: commands/typecmds.c:2383 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "" "la fonction %s de calcul de différence pour le sous-type d'un intervalle de\n" "valeur doit être immutable" -#: commands/typecmds.c:2411 +#: commands/typecmds.c:2410 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "les valeurs d'OID du tableau pgtype ne sont pas positionnées en mode de mise à jour binaire" -#: commands/typecmds.c:2444 +#: commands/typecmds.c:2443 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "valeur d'OID du multirange de pg_type non positionnée en mode de mise à jour binaire" -#: commands/typecmds.c:2477 +#: commands/typecmds.c:2476 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "valeur d'OID du tableau multirange de pg_type non positionnée en mode de mise à jour binaire" -#: commands/typecmds.c:2776 +#: commands/typecmds.c:2772 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "la colonne « %s » de la table « %s » contient des valeurs NULL" -#: commands/typecmds.c:2889 commands/typecmds.c:3091 +#: commands/typecmds.c:2885 commands/typecmds.c:3086 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "la contrainte « %s » du domaine « %s » n'existe pas" -#: commands/typecmds.c:2893 +#: commands/typecmds.c:2889 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "la contrainte « %s » du domaine « %s » n'existe pas, ignore" -#: commands/typecmds.c:3098 +#: commands/typecmds.c:3093 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "la contrainte « %s » du domaine « %s » n'est pas une contrainte de vérification" -#: commands/typecmds.c:3204 +#: commands/typecmds.c:3194 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "" "la colonne « %s » de la table « %s » contient des valeurs violant la\n" "nouvelle contrainte" -#: commands/typecmds.c:3433 commands/typecmds.c:3633 commands/typecmds.c:3714 -#: commands/typecmds.c:3900 +#: commands/typecmds.c:3423 commands/typecmds.c:3622 commands/typecmds.c:3705 +#: commands/typecmds.c:3893 #, c-format msgid "%s is not a domain" msgstr "%s n'est pas un domaine" -#: commands/typecmds.c:3465 +#: commands/typecmds.c:3455 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "la contrainte « %s » du domaine « %s » existe déjà" -#: commands/typecmds.c:3516 +#: commands/typecmds.c:3506 #, c-format msgid "cannot use table references in domain check constraint" msgstr "" "ne peut pas utiliser les références de table dans la contrainte de\n" "vérification du domaine" -#: commands/typecmds.c:3645 commands/typecmds.c:3726 commands/typecmds.c:4017 +#: commands/typecmds.c:3634 commands/typecmds.c:3717 commands/typecmds.c:4010 #, c-format msgid "%s is a table's row type" msgstr "« %s » est du type ligne de table" -#: commands/typecmds.c:3647 commands/typecmds.c:3728 commands/typecmds.c:4019 -#, c-format -msgid "Use ALTER TABLE instead." -msgstr "Utilisez ALTER TABLE à la place." - -#: commands/typecmds.c:3653 commands/typecmds.c:3734 commands/typecmds.c:3932 +#: commands/typecmds.c:3644 commands/typecmds.c:3727 commands/typecmds.c:3925 #, c-format msgid "cannot alter array type %s" msgstr "ne peut pas modifier le type array %s" -#: commands/typecmds.c:3655 commands/typecmds.c:3736 commands/typecmds.c:3934 +#: commands/typecmds.c:3646 commands/typecmds.c:3729 commands/typecmds.c:3927 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "Vous pouvez modifier le type %s, ce qui va modifier aussi le type tableau." -#: commands/typecmds.c:4002 +#: commands/typecmds.c:3995 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "le type « %s » existe déjà dans le schéma « %s »" -#: commands/typecmds.c:4170 +#: commands/typecmds.c:4165 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "ne peut pas modifier le stockage du type en PLAIN" -#: commands/typecmds.c:4263 +#: commands/typecmds.c:4258 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "l'attribut du type « %s » ne peut pas être changé" -#: commands/typecmds.c:4281 +#: commands/typecmds.c:4276 #, c-format msgid "must be superuser to alter a type" msgstr "doit être super-utilisateur pour modifier un type" -#: commands/typecmds.c:4302 commands/typecmds.c:4311 +#: commands/typecmds.c:4297 commands/typecmds.c:4306 #, c-format msgid "%s is not a base type" msgstr "« %s » n'est pas un type de base" -#: commands/user.c:138 +#: commands/user.c:201 #, c-format msgid "SYSID can no longer be specified" msgstr "SYSID ne peut plus être spécifié" -#: commands/user.c:256 -#, c-format -msgid "must be superuser to create superusers" -msgstr "doit être super-utilisateur pour créer des super-utilisateurs" - -#: commands/user.c:263 +#: commands/user.c:319 commands/user.c:325 commands/user.c:331 +#: commands/user.c:337 commands/user.c:343 #, c-format -msgid "must be superuser to create replication users" -msgstr "doit être super-utilisateur pour créer des utilisateurs avec l'attribut réplication" +msgid "permission denied to create role" +msgstr "droit refusé pour créer un rôle" -#: commands/user.c:270 +#: commands/user.c:320 #, c-format -msgid "must be superuser to create bypassrls users" -msgstr "doit être super-utilisateur pour créer des utilisateurs avec l'attribut BYPASSRLS" +msgid "Only roles with the %s attribute may create roles." +msgstr "" -#: commands/user.c:277 +#: commands/user.c:326 commands/user.c:332 commands/user.c:338 +#: commands/user.c:344 #, c-format -msgid "permission denied to create role" -msgstr "droit refusé pour créer un rôle" +msgid "Only roles with the %s attribute may create roles with the %s attribute." +msgstr "" -#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 gram.y:16437 -#: gram.y:16483 utils/adt/acl.c:5331 utils/adt/acl.c:5337 +#: commands/user.c:355 commands/user.c:1393 commands/user.c:1400 gram.y:16726 +#: gram.y:16772 utils/adt/acl.c:5401 utils/adt/acl.c:5407 #, c-format msgid "role name \"%s\" is reserved" msgstr "le nom du rôle « %s » est réservé" -#: commands/user.c:289 commands/user.c:1141 commands/user.c:1148 +#: commands/user.c:357 commands/user.c:1395 commands/user.c:1402 #, c-format msgid "Role names starting with \"pg_\" are reserved." msgstr "Les noms de rôle commençant par « pg_ » sont réservés." -#: commands/user.c:310 commands/user.c:1163 +#: commands/user.c:378 commands/user.c:1417 #, c-format msgid "role \"%s\" already exists" msgstr "le rôle « %s » existe déjà" -#: commands/user.c:376 commands/user.c:754 +#: commands/user.c:440 commands/user.c:925 #, c-format msgid "empty string is not a valid password, clearing password" msgstr "une chaîne vide n'est pas un mot de passe valide, effacement du mot de passe" -#: commands/user.c:405 +#: commands/user.c:469 #, c-format msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "la valeur d'OID de pg_authid n'est pas positionnée en mode de mise à jour binaire" -#: commands/user.c:524 commands/user.c:838 +#: commands/user.c:653 commands/user.c:1011 #, fuzzy #| msgid "cannot alter inherited column \"%s\"" msgid "Cannot alter reserved roles." msgstr "ne peut pas modifier la colonne héritée « %s »" -#: commands/user.c:638 -#, c-format -msgid "must be superuser to alter superuser roles or change superuser attribute" -msgstr "doit être super-utilisateur pour modifier les rôles ayant l'attribut SUPERUSER ou pour changer l'attribut SUPERUSER" +#: commands/user.c:760 commands/user.c:766 commands/user.c:782 +#: commands/user.c:790 commands/user.c:804 commands/user.c:810 +#: commands/user.c:816 commands/user.c:825 commands/user.c:870 +#: commands/user.c:1033 commands/user.c:1044 +#, fuzzy, c-format +#| msgid "permission denied to create role" +msgid "permission denied to alter role" +msgstr "droit refusé pour créer un rôle" -#: commands/user.c:645 +#: commands/user.c:761 commands/user.c:1034 #, c-format -msgid "must be superuser to alter replication roles or change replication attribute" -msgstr "doit être super-utilisateur pour modifier les rôles ayant l'attribut REPLICATION ou pour changer l'attribut REPLICATION" +msgid "Only roles with the %s attribute may alter roles with the %s attribute." +msgstr "" -#: commands/user.c:652 +#: commands/user.c:767 commands/user.c:805 commands/user.c:811 +#: commands/user.c:817 #, c-format -msgid "must be superuser to change bypassrls attribute" -msgstr "doit être super-utilisateur pour modifier l'attribut bypassrls" +msgid "Only roles with the %s attribute may change the %s attribute." +msgstr "" -#: commands/user.c:661 commands/user.c:866 +#: commands/user.c:783 commands/user.c:1045 #, c-format -msgid "permission denied" -msgstr "droit refusé" +msgid "Only roles with the %s attribute and the %s option on role \"%s\" may alter this role." +msgstr "" -#: commands/user.c:859 commands/user.c:1400 commands/user.c:1573 +#: commands/user.c:791 #, c-format -msgid "must be superuser to alter superusers" -msgstr "doit être super-utilisateur pour modifier des super-utilisateurs" +msgid "To change another role's password, the current user must have the %s attribute and the %s option on the role." +msgstr "" -#: commands/user.c:896 +#: commands/user.c:826 #, c-format -msgid "must be superuser to alter settings globally" +msgid "Only roles with the %s option on role \"%s\" may add members." +msgstr "" + +#: commands/user.c:871 +#, fuzzy, c-format +#| msgid "composite type must have at least one attribute" +msgid "The bootstrap user must have the %s attribute." +msgstr "le type composite doit avoir au moins un attribut" + +#: commands/user.c:1076 +#, fuzzy, c-format +#| msgid "permission denied to create role" +msgid "permission denied to alter setting" +msgstr "droit refusé pour créer un rôle" + +#: commands/user.c:1077 +#, fuzzy, c-format +#| msgid "must be superuser to alter settings globally" +msgid "Only roles with the %s attribute may alter settings globally." msgstr "doit être super-utilisateur pour modifier globalement les configurations" -#: commands/user.c:918 +#: commands/user.c:1101 commands/user.c:1173 commands/user.c:1179 #, c-format msgid "permission denied to drop role" msgstr "droit refusé pour supprimer le rôle" -#: commands/user.c:943 +#: commands/user.c:1102 +#, c-format +msgid "Only roles with the %s attribute and the %s option on the target roles may drop roles." +msgstr "" + +#: commands/user.c:1127 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "ne peut pas être le spécificateur de rôle spécial dans DROP ROLE" -#: commands/user.c:953 commands/user.c:1110 commands/variable.c:778 -#: commands/variable.c:781 commands/variable.c:865 commands/variable.c:868 -#: utils/adt/acl.c:5186 utils/adt/acl.c:5234 utils/adt/acl.c:5262 -#: utils/adt/acl.c:5281 utils/init/miscinit.c:725 +#: commands/user.c:1137 commands/user.c:1364 commands/variable.c:836 +#: commands/variable.c:839 commands/variable.c:923 commands/variable.c:926 +#: utils/adt/acl.c:356 utils/adt/acl.c:376 utils/adt/acl.c:5256 +#: utils/adt/acl.c:5304 utils/adt/acl.c:5332 utils/adt/acl.c:5351 +#: utils/adt/regproc.c:1551 utils/init/miscinit.c:757 #, c-format msgid "role \"%s\" does not exist" msgstr "le rôle « %s » n'existe pas" -#: commands/user.c:958 +#: commands/user.c:1142 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "le rôle « %s » n'existe pas, poursuite du traitement" -#: commands/user.c:971 commands/user.c:975 +#: commands/user.c:1155 commands/user.c:1159 #, c-format msgid "current user cannot be dropped" msgstr "l'utilisateur actuel ne peut pas être supprimé" -#: commands/user.c:979 +#: commands/user.c:1163 #, c-format msgid "session user cannot be dropped" msgstr "l'utilisateur de la session ne peut pas être supprimé" -#: commands/user.c:989 +#: commands/user.c:1174 +#, c-format +msgid "Only roles with the %s attribute may drop roles with the %s attribute." +msgstr "" + +#: commands/user.c:1180 #, c-format -msgid "must be superuser to drop superusers" -msgstr "doit être super-utilisateur pour supprimer des super-utilisateurs" +msgid "Only roles with the %s attribute and the %s option on role \"%s\" may drop this role." +msgstr "" -#: commands/user.c:1005 +#: commands/user.c:1306 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "le rôle « %s » ne peut pas être supprimé car d'autres objets en dépendent" -#: commands/user.c:1126 +#: commands/user.c:1380 #, c-format msgid "session user cannot be renamed" msgstr "l'utilisateur de la session ne peut pas être renommé" -#: commands/user.c:1130 +#: commands/user.c:1384 #, c-format msgid "current user cannot be renamed" msgstr "l'utilisateur courant ne peut pas être renommé" -#: commands/user.c:1173 -#, c-format -msgid "must be superuser to rename superusers" -msgstr "doit être super-utilisateur pour renommer les super-utilisateurs" - -#: commands/user.c:1180 +#: commands/user.c:1428 commands/user.c:1438 #, c-format msgid "permission denied to rename role" msgstr "droit refusé pour renommer le rôle" -#: commands/user.c:1201 +#: commands/user.c:1429 +#, c-format +msgid "Only roles with the %s attribute may rename roles with the %s attribute." +msgstr "" + +#: commands/user.c:1439 +#, c-format +msgid "Only roles with the %s attribute and the %s option on role \"%s\" may rename this role." +msgstr "" + +#: commands/user.c:1461 #, c-format msgid "MD5 password cleared because of role rename" msgstr "mot de passe MD5 effacé à cause du renommage du rôle" -#: commands/user.c:1261 +#: commands/user.c:1525 gram.y:1260 +#, c-format +msgid "unrecognized role option \"%s\"" +msgstr "option « %s » du rôle non reconnue" + +#: commands/user.c:1530 +#, fuzzy, c-format +#| msgid "unrecognized value for option %s: %s" +msgid "unrecognized value for role option \"%s\": \"%s\"" +msgstr "valeur non reconnue pour l'option %s : %s" + +#: commands/user.c:1563 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "les noms de colonne ne peuvent pas être inclus dans GRANT/REVOKE ROLE" -#: commands/user.c:1299 +#: commands/user.c:1603 #, c-format msgid "permission denied to drop objects" msgstr "droit refusé pour supprimer les objets" -#: commands/user.c:1326 commands/user.c:1335 +#: commands/user.c:1604 #, c-format -msgid "permission denied to reassign objects" -msgstr "droit refusé pour ré-affecter les objets" +msgid "Only roles with privileges of role \"%s\" may drop objects owned by it." +msgstr "" -#: commands/user.c:1408 commands/user.c:1581 +#: commands/user.c:1632 commands/user.c:1643 #, c-format -msgid "must have admin option on role \"%s\"" -msgstr "doit avoir l'option admin sur le rôle « %s »" +msgid "permission denied to reassign objects" +msgstr "droit refusé pour ré-affecter les objets" -#: commands/user.c:1422 +#: commands/user.c:1633 #, c-format -msgid "role \"%s\" cannot have explicit members" -msgstr "le rôle « %s » ne peut pas avoir de membres explicites" +msgid "Only roles with privileges of role \"%s\" may reassign objects owned by it." +msgstr "" -#: commands/user.c:1432 +#: commands/user.c:1644 #, c-format -msgid "must be superuser to set grantor" -msgstr "doit être super-utilisateur pour configurer le « donneur de droits »" +msgid "Only roles with privileges of role \"%s\" may reassign objects to it." +msgstr "" -#: commands/user.c:1468 +#: commands/user.c:1740 #, c-format msgid "role \"%s\" cannot be a member of any role" msgstr "le rôle « %s » n'est pas un membre de tout autre rôle" -#: commands/user.c:1481 +#: commands/user.c:1753 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "le rôle « %s » est un membre du rôle « %s »" -#: commands/user.c:1496 -#, c-format -msgid "role \"%s\" is already a member of role \"%s\"" +#: commands/user.c:1793 commands/user.c:1819 +#, fuzzy, c-format +#| msgid "grant options cannot be granted back to your own grantor" +msgid "%s option cannot be granted back to your own grantor" +msgstr "les options grant ne peuvent pas être rendues à votre propre donateur" + +#: commands/user.c:1896 +#, fuzzy, c-format +#| msgid "role \"%s\" is already a member of role \"%s\"" +msgid "role \"%s\" has already been granted membership in role \"%s\" by role \"%s\"" msgstr "le rôle « %s » est déjà un membre du rôle « %s »" -#: commands/user.c:1603 -#, c-format -msgid "role \"%s\" is not a member of role \"%s\"" +#: commands/user.c:2031 +#, fuzzy, c-format +#| msgid "role \"%s\" is not a member of role \"%s\"" +msgid "role \"%s\" has not been granted membership in role \"%s\" by role \"%s\"" msgstr "le rôle « %s » n'est pas un membre du rôle « %s »" -#: commands/vacuum.c:139 +#: commands/user.c:2131 #, c-format -msgid "unrecognized ANALYZE option \"%s\"" -msgstr "option d'ANALYZE « %s » non reconnue" +msgid "role \"%s\" cannot have explicit members" +msgstr "le rôle « %s » ne peut pas avoir de membres explicites" -#: commands/vacuum.c:177 -#, c-format -msgid "parallel option requires a value between 0 and %d" -msgstr "l'option parallel nécessite une valeur comprise entre 0 et %d" +#: commands/user.c:2142 commands/user.c:2165 +#, fuzzy, c-format +#| msgid "permission denied to set role \"%s\"" +msgid "permission denied to grant role \"%s\"" +msgstr "droit refusé pour configurer le rôle « %s »" -#: commands/vacuum.c:189 +#: commands/user.c:2144 #, c-format -msgid "parallel workers for vacuum must be between 0 and %d" -msgstr "le nombre de processus workers parallélisés pour le VACUUM doit être entre 0 et %d" +msgid "Only roles with the %s attribute may grant roles with the %s attribute." +msgstr "" -#: commands/vacuum.c:206 -#, c-format -msgid "unrecognized VACUUM option \"%s\"" -msgstr "option « %s » de la commande VACUUM non reconnue" +#: commands/user.c:2149 commands/user.c:2172 +#, fuzzy, c-format +#| msgid "permission denied to set role \"%s\"" +msgid "permission denied to revoke role \"%s\"" +msgstr "droit refusé pour configurer le rôle « %s »" -#: commands/vacuum.c:229 +#: commands/user.c:2151 #, c-format -msgid "VACUUM FULL cannot be performed in parallel" -msgstr "Un VACUUM FULL ne peut être exécuté de façon parallélisé" +msgid "Only roles with the %s attribute may revoke roles with the %s attribute." +msgstr "" -#: commands/vacuum.c:245 +#: commands/user.c:2167 #, c-format -msgid "ANALYZE option must be specified when a column list is provided" -msgstr "l'option ANALYZE doit être spécifiée quand une liste de colonne est fournie" +msgid "Only roles with the %s option on role \"%s\" may grant this role." +msgstr "" -#: commands/vacuum.c:335 +#: commands/user.c:2174 #, c-format -msgid "%s cannot be executed from VACUUM or ANALYZE" -msgstr "%s ne peut pas être exécuté dans un VACUUM ou un ANALYZE" +msgid "Only roles with the %s option on role \"%s\" may revoke this role." +msgstr "" -#: commands/vacuum.c:345 -#, c-format -msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" -msgstr "l'option DISABLE_PAGE_SKIPPING de la commande VACUUM ne pas être utilisée en même temps que l'option FULL" +#: commands/user.c:2254 commands/user.c:2263 +#, fuzzy, c-format +#| msgid "permission denied to set role \"%s\"" +msgid "permission denied to grant privileges as role \"%s\"" +msgstr "droit refusé pour configurer le rôle « %s »" -#: commands/vacuum.c:352 +#: commands/user.c:2256 #, c-format -msgid "PROCESS_TOAST required with VACUUM FULL" -msgstr "PROCESS_TOAST requis avec VACUUM FULL" +msgid "Only roles with privileges of role \"%s\" may grant privileges as this role." +msgstr "" -#: commands/vacuum.c:586 -#, c-format -msgid "skipping \"%s\" --- only superuser can vacuum it" -msgstr "ignore « %s » --- seul le super-utilisateur peut exécuter un VACUUM" +#: commands/user.c:2265 +#, fuzzy, c-format +#| msgid "must have admin option on role \"%s\"" +msgid "The grantor must have the %s option on role \"%s\"." +msgstr "doit avoir l'option admin sur le rôle « %s »" + +#: commands/user.c:2273 +#, fuzzy, c-format +#| msgid "permission denied to set role \"%s\"" +msgid "permission denied to revoke privileges granted by role \"%s\"" +msgstr "droit refusé pour configurer le rôle « %s »" -#: commands/vacuum.c:590 +#: commands/user.c:2275 #, c-format -msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" +msgid "Only roles with privileges of role \"%s\" may revoke privileges granted by this role." msgstr "" -"ignore « %s » --- seul le super-utilisateur ou le propriétaire de la base de données\n" -"peuvent exécuter un VACUUM" -#: commands/vacuum.c:594 +#: commands/user.c:2498 utils/adt/acl.c:1309 #, c-format -msgid "skipping \"%s\" --- only table or database owner can vacuum it" -msgstr "" -"ignore « %s » --- seul le propriétaire de la table ou de la base de données\n" -"peut exécuter un VACUUM" +msgid "dependent privileges exist" +msgstr "des privilèges dépendants existent" -#: commands/vacuum.c:609 +#: commands/user.c:2499 utils/adt/acl.c:1310 #, c-format -msgid "skipping \"%s\" --- only superuser can analyze it" -msgstr "ignore « %s » --- seul le super-utilisateur peut l'analyser" +msgid "Use CASCADE to revoke them too." +msgstr "Utilisez CASCADE pour les révoquer aussi." -#: commands/vacuum.c:613 +#: commands/vacuum.c:137 #, c-format -msgid "skipping \"%s\" --- only superuser or database owner can analyze it" +msgid "\"vacuum_buffer_usage_limit\" must be 0 or between %d kB and %d kB" msgstr "" -"ignore « %s » --- seul le super-utilisateur ou le propriétaire de la base de\n" -"données peut l'analyser" -#: commands/vacuum.c:617 +#: commands/vacuum.c:209 +#, fuzzy, c-format +#| msgid "NUMERIC precision %d must be between 1 and %d" +msgid "BUFFER_USAGE_LIMIT option must be 0 or between %d kB and %d kB" +msgstr "la précision NUMERIC %d doit être comprise entre 1 et %d" + +#: commands/vacuum.c:219 +#, c-format +msgid "unrecognized ANALYZE option \"%s\"" +msgstr "option d'ANALYZE « %s » non reconnue" + +#: commands/vacuum.c:259 +#, c-format +msgid "parallel option requires a value between 0 and %d" +msgstr "l'option parallel nécessite une valeur comprise entre 0 et %d" + +#: commands/vacuum.c:271 +#, c-format +msgid "parallel workers for vacuum must be between 0 and %d" +msgstr "le nombre de processus workers parallélisés pour le VACUUM doit être entre 0 et %d" + +#: commands/vacuum.c:292 +#, c-format +msgid "unrecognized VACUUM option \"%s\"" +msgstr "option « %s » de la commande VACUUM non reconnue" + +#: commands/vacuum.c:318 +#, c-format +msgid "VACUUM FULL cannot be performed in parallel" +msgstr "Un VACUUM FULL ne peut être exécuté de façon parallélisé" + +#: commands/vacuum.c:329 #, c-format -msgid "skipping \"%s\" --- only table or database owner can analyze it" +msgid "BUFFER_USAGE_LIMIT cannot be specified for VACUUM FULL" msgstr "" -"ignore « %s » --- seul le propriétaire de la table ou de la base de données\n" -"peut l'analyser" -#: commands/vacuum.c:696 commands/vacuum.c:792 +#: commands/vacuum.c:343 +#, c-format +msgid "ANALYZE option must be specified when a column list is provided" +msgstr "l'option ANALYZE doit être spécifiée quand une liste de colonne est fournie" + +#: commands/vacuum.c:355 +#, c-format +msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" +msgstr "l'option DISABLE_PAGE_SKIPPING de la commande VACUUM ne pas être utilisée en même temps que l'option FULL" + +#: commands/vacuum.c:362 +#, c-format +msgid "PROCESS_TOAST required with VACUUM FULL" +msgstr "PROCESS_TOAST requis avec VACUUM FULL" + +#: commands/vacuum.c:371 +#, fuzzy, c-format +#| msgid "OLD TABLE cannot be specified multiple times" +msgid "ONLY_DATABASE_STATS cannot be specified with a list of tables" +msgstr "OLD TABLE ne peut pas être spécifié plusieurs fois" + +#: commands/vacuum.c:380 +#, fuzzy, c-format +#| msgid "option \"%s\" cannot be specified with other options" +msgid "ONLY_DATABASE_STATS cannot be specified with other VACUUM options" +msgstr "l'option « %s » ne peut pas être spécifié avec d'autres options" + +#: commands/vacuum.c:515 +#, c-format +msgid "%s cannot be executed from VACUUM or ANALYZE" +msgstr "%s ne peut pas être exécuté dans un VACUUM ou un ANALYZE" + +#: commands/vacuum.c:733 +#, fuzzy, c-format +#| msgid "permission denied for column %s" +msgid "permission denied to vacuum \"%s\", skipping it" +msgstr "droit refusé pour la colonne %s" + +#: commands/vacuum.c:746 +#, fuzzy, c-format +#| msgid "permission denied to set role \"%s\"" +msgid "permission denied to analyze \"%s\", skipping it" +msgstr "droit refusé pour configurer le rôle « %s »" + +#: commands/vacuum.c:824 commands/vacuum.c:921 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "ignore le vacuum de « %s » --- verrou non disponible" -#: commands/vacuum.c:701 +#: commands/vacuum.c:829 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "ignore le vacuum de « %s » --- la relation n'existe plus" -#: commands/vacuum.c:717 commands/vacuum.c:797 +#: commands/vacuum.c:845 commands/vacuum.c:926 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "ignore l'analyse de « %s » --- verrou non disponible" -#: commands/vacuum.c:722 +#: commands/vacuum.c:850 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "ignore l'analyse de « %s » --- la relation n'existe plus" -#: commands/vacuum.c:1041 +#: commands/vacuum.c:1161 #, c-format -msgid "oldest xmin is far in the past" -msgstr "le plus ancien xmin est loin dans le passé" +msgid "cutoff for removing and freezing tuples is far in the past" +msgstr "" -#: commands/vacuum.c:1042 +#: commands/vacuum.c:1162 commands/vacuum.c:1167 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -12787,50 +13168,44 @@ msgstr "" "Fermer les transactions dès que possible pour éviter des problèmes de rebouclage d'identifiants de transaction.\n" "Vous pouvez avoir besoin de valider ou d'annuler les anciennes transactions préparées, ou de supprimer les slots de réplication trop anciens." -#: commands/vacuum.c:1085 -#, c-format -msgid "oldest multixact is far in the past" +#: commands/vacuum.c:1166 +#, fuzzy, c-format +#| msgid "oldest multixact is far in the past" +msgid "cutoff for freezing multixacts is far in the past" msgstr "le plus ancien multixact est loin dans le passé" -#: commands/vacuum.c:1086 -#, c-format -msgid "Close open transactions with multixacts soon to avoid wraparound problems." -msgstr "" -"Fermez les transactions ouvertes avec multixacts rapidement pour éviter des problèmes de\n" -"réinitialisation." - -#: commands/vacuum.c:1792 +#: commands/vacuum.c:1908 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "" "certaines bases de données n'ont pas eu droit à l'opération de maintenance\n" "VACUUM depuis plus de 2 milliards de transactions" -#: commands/vacuum.c:1793 +#: commands/vacuum.c:1909 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "" "Vous pouvez avoir déjà souffert de pertes de données suite à une\n" "réinitialisation de l'identifiant des transactions." -#: commands/vacuum.c:1957 +#: commands/vacuum.c:2078 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "" "ignore « %s » --- n'a pas pu exécuter un VACUUM sur les objets autres que\n" "des tables et les tables systèmes" -#: commands/vacuum.c:2328 +#: commands/vacuum.c:2503 #, c-format msgid "scanned index \"%s\" to remove %d row versions" msgstr "a parcouru l'index « %s » pour supprimer %d versions de lignes" -#: commands/vacuum.c:2347 +#: commands/vacuum.c:2522 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "l'index « %s » contient maintenant %.0f versions de ligne dans %u pages" -#: commands/vacuum.c:2351 +#: commands/vacuum.c:2526 #, fuzzy, c-format #| msgid "" #| "%.0f index row versions were removed.\n" @@ -12847,135 +13222,150 @@ msgstr "" "%u blocs d'index sont actuellement supprimés, dont %u sont actuellement réutilisables.\n" "%s." -#: commands/vacuumparallel.c:664 +#: commands/vacuumparallel.c:677 #, c-format msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" msgstr[0] "a lancé %d worker parallélisé pour le vacuum d'index (planifié : %d)" msgstr[1] "a lancé %d workers parallélisés pour le vacuum d'index (planifié : %d)" -#: commands/vacuumparallel.c:670 +#: commands/vacuumparallel.c:683 #, c-format msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" msgstr[0] "a lancé %d worker parallélisé pour le nettoyage d'index du VACUUM (planifié : %d)" msgstr[1] "a lancé %d workers parallélisés pour le nettoyage d'index du VACUUM (planifié : %d)" -#: commands/variable.c:165 utils/misc/guc.c:12099 utils/misc/guc.c:12177 -#, c-format -msgid "Unrecognized key word: \"%s\"." -msgstr "Mot clé non reconnu : « %s »." - -#: commands/variable.c:177 +#: commands/variable.c:185 #, c-format msgid "Conflicting \"datestyle\" specifications." msgstr "Spécifications « datestyle » conflictuelles" -#: commands/variable.c:299 +#: commands/variable.c:307 #, c-format msgid "Cannot specify months in time zone interval." msgstr "Ne peut pas spécifier des mois dans un interval avec fuseau horaire." -#: commands/variable.c:305 +#: commands/variable.c:313 #, c-format msgid "Cannot specify days in time zone interval." msgstr "Ne peut pas spécifier des jours dans un interval avec fuseau horaire." -#: commands/variable.c:343 commands/variable.c:425 +#: commands/variable.c:351 commands/variable.c:433 #, c-format msgid "time zone \"%s\" appears to use leap seconds" msgstr "le fuseau horaire « %s » semble utiliser les secondes intercalaires" -#: commands/variable.c:345 commands/variable.c:427 +#: commands/variable.c:353 commands/variable.c:435 #, c-format msgid "PostgreSQL does not support leap seconds." msgstr "PostgreSQL ne supporte pas les secondes « leap »." -#: commands/variable.c:354 +#: commands/variable.c:362 #, c-format msgid "UTC timezone offset is out of range." msgstr "le décalage du fuseau horaire UTC est en dehors des limites." -#: commands/variable.c:494 +#: commands/variable.c:552 #, c-format msgid "cannot set transaction read-write mode inside a read-only transaction" msgstr "" "ne peut pas initialiser le mode lecture-écriture de la transaction à\n" "l'intérieur d'une transaction en lecture seule" -#: commands/variable.c:501 +#: commands/variable.c:559 #, c-format msgid "transaction read-write mode must be set before any query" msgstr "" "le mode de transaction lecture/écriture doit être configuré avant d'exécuter\n" "la première requête" -#: commands/variable.c:508 +#: commands/variable.c:566 #, c-format msgid "cannot set transaction read-write mode during recovery" msgstr "" "ne peut pas initialiser le mode lecture-écriture des transactions lors de la\n" "restauration" -#: commands/variable.c:534 +#: commands/variable.c:592 #, c-format msgid "SET TRANSACTION ISOLATION LEVEL must be called before any query" msgstr "SET TRANSACTION ISOLATION LEVEL doit être appelé avant toute requête" -#: commands/variable.c:541 +#: commands/variable.c:599 #, c-format msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" msgstr "" "SET TRANSACTION ISOLATION LEVEL ne doit pas être appelé dans une\n" "sous-transaction" -#: commands/variable.c:548 storage/lmgr/predicate.c:1694 +#: commands/variable.c:606 storage/lmgr/predicate.c:1629 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "ne peut pas utiliser le mode sérialisable sur un serveur en « Hot Standby »" -#: commands/variable.c:549 +#: commands/variable.c:607 #, c-format msgid "You can use REPEATABLE READ instead." msgstr "Vous pouvez utiliser REPEATABLE READ à la place." -#: commands/variable.c:567 +#: commands/variable.c:625 #, c-format msgid "SET TRANSACTION [NOT] DEFERRABLE cannot be called within a subtransaction" msgstr "" "SET TRANSACTION [NOT] DEFERRABLE ne doit pas être appelé dans une\n" "sous-transaction" -#: commands/variable.c:573 +#: commands/variable.c:631 #, c-format msgid "SET TRANSACTION [NOT] DEFERRABLE must be called before any query" msgstr "SET TRANSACTION [NOT] DEFERRABLE doit être appelé avant toute requête" -#: commands/variable.c:655 +#: commands/variable.c:713 #, c-format msgid "Conversion between %s and %s is not supported." msgstr "La conversion entre %s et %s n'est pas supportée." -#: commands/variable.c:662 +#: commands/variable.c:720 #, c-format msgid "Cannot change \"client_encoding\" now." msgstr "Ne peut pas modifier « client_encoding » maintenant." -#: commands/variable.c:723 +#: commands/variable.c:781 #, c-format msgid "cannot change client_encoding during a parallel operation" msgstr "ne peut pas modifier le client_encoding lors d'une opération parallélisée" -#: commands/variable.c:890 +#: commands/variable.c:948 #, c-format msgid "permission will be denied to set role \"%s\"" msgstr "le droit sera refusé pour configurer le rôle « %s »" -#: commands/variable.c:895 +#: commands/variable.c:953 #, c-format msgid "permission denied to set role \"%s\"" msgstr "droit refusé pour configurer le rôle « %s »" +#: commands/variable.c:1153 +#, c-format +msgid "Bonjour is not supported by this build" +msgstr "Bonjour n'est pas supporté dans cette installation" + +#: commands/variable.c:1181 +#, c-format +msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." +msgstr "effective_io_concurrency doit être positionné à 0 sur les plateformes où manque posix_fadvise()" + +#: commands/variable.c:1194 +#, c-format +msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." +msgstr "maintenance_io_concurrency doit être positionné à 0 sur les plateformes où manque posix_fadvise()" + +#: commands/variable.c:1207 +#, c-format +msgid "SSL is not supported by this build" +msgstr "SSL n'est pas supporté dans cette installation" + #: commands/view.c:84 #, c-format msgid "could not determine which collation to use for view column \"%s\"" @@ -13007,27 +13397,27 @@ msgstr "ne peut pas modifier le type de données de la colonne « %s » de la vu msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" msgstr "ne peut pas modifier le type de données de la colonne « %s » de la vue de %s à %s" -#: commands/view.c:468 +#: commands/view.c:392 #, c-format msgid "views must not contain SELECT INTO" msgstr "les vues ne peuvent pas contenir SELECT INTO" -#: commands/view.c:480 +#: commands/view.c:404 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "les vues ne peuvent pas contenir d'instructions de modifications de données avec WITH" -#: commands/view.c:550 +#: commands/view.c:474 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "CREATE VIEW spécifie plus de noms de colonnes que de colonnes" -#: commands/view.c:558 +#: commands/view.c:482 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "les vues ne peuvent pas être non tracées car elles n'ont pas de stockage" -#: commands/view.c:572 +#: commands/view.c:496 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "la vue « %s » sera une vue temporaire" @@ -13063,374 +13453,382 @@ msgstr "le curseur « %s » n'est pas positionné sur une ligne" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "le curseur « %s » n'est pas un parcours modifiable de la table « %s »" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2453 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2498 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "le type de paramètre %d (%s) ne correspond pas à celui préparé dans le plan (%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2465 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2510 #, c-format msgid "no value found for parameter %d" msgstr "aucune valeur trouvée pour le paramètre %d" -#: executor/execExpr.c:632 executor/execExpr.c:639 executor/execExpr.c:645 -#: executor/execExprInterp.c:4052 executor/execExprInterp.c:4069 -#: executor/execExprInterp.c:4168 executor/nodeModifyTable.c:220 -#: executor/nodeModifyTable.c:231 executor/nodeModifyTable.c:248 -#: executor/nodeModifyTable.c:256 +#: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 +#: executor/execExprInterp.c:4234 executor/execExprInterp.c:4251 +#: executor/execExprInterp.c:4350 executor/nodeModifyTable.c:197 +#: executor/nodeModifyTable.c:208 executor/nodeModifyTable.c:225 +#: executor/nodeModifyTable.c:233 #, c-format msgid "table row type and query-specified row type do not match" msgstr "le type de ligne de la table et celui spécifié par la requête ne correspondent pas" -#: executor/execExpr.c:633 executor/nodeModifyTable.c:221 +#: executor/execExpr.c:638 executor/nodeModifyTable.c:198 #, c-format msgid "Query has too many columns." msgstr "La requête a trop de colonnes." -#: executor/execExpr.c:640 executor/nodeModifyTable.c:249 +#: executor/execExpr.c:645 executor/nodeModifyTable.c:226 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "" "La requête fournit une valeur pour une colonne supprimée à la position\n" "ordinale %d." -#: executor/execExpr.c:646 executor/execExprInterp.c:4070 -#: executor/nodeModifyTable.c:232 +#: executor/execExpr.c:651 executor/execExprInterp.c:4252 +#: executor/nodeModifyTable.c:209 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "La table a le type %s à la position ordinale %d alors que la requête attend %s." -#: executor/execExpr.c:1110 parser/parse_agg.c:827 +#: executor/execExpr.c:1099 parser/parse_agg.c:827 #, c-format msgid "window function calls cannot be nested" msgstr "les appels à la fonction window ne peuvent pas être imbriqués" -#: executor/execExpr.c:1614 +#: executor/execExpr.c:1618 #, c-format msgid "target type is not an array" msgstr "le type cible n'est pas un tableau" -#: executor/execExpr.c:1954 +#: executor/execExpr.c:1958 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "une colonne ROW() a le type %s au lieu du type %s" -#: executor/execExpr.c:2479 executor/execSRF.c:718 parser/parse_func.c:138 -#: parser/parse_func.c:655 parser/parse_func.c:1031 +#: executor/execExpr.c:2574 executor/execSRF.c:719 parser/parse_func.c:138 +#: parser/parse_func.c:655 parser/parse_func.c:1032 #, c-format msgid "cannot pass more than %d argument to a function" msgid_plural "cannot pass more than %d arguments to a function" msgstr[0] "ne peut pas passer plus de %d argument à une fonction" msgstr[1] "ne peut pas passer plus de %d arguments à une fonction" -#: executor/execExpr.c:2506 executor/execSRF.c:738 executor/functions.c:1073 -#: utils/adt/jsonfuncs.c:3698 utils/fmgr/funcapi.c:98 utils/fmgr/funcapi.c:152 +#: executor/execExpr.c:2601 executor/execSRF.c:739 executor/functions.c:1066 +#: utils/adt/jsonfuncs.c:3780 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 #, c-format msgid "set-valued function called in context that cannot accept a set" -msgstr "" -"la fonction renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas\n" -"un ensemble" +msgstr "la fonction renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas un ensemble" -#: executor/execExpr.c:2865 parser/parse_node.c:276 parser/parse_node.c:326 +#: executor/execExpr.c:3007 parser/parse_node.c:277 parser/parse_node.c:327 #, c-format msgid "cannot subscript type %s because it does not support subscripting" msgstr "ne peut pas indicer le type %s car il ne supporte pas les indices" -#: executor/execExpr.c:2993 executor/execExpr.c:3015 +#: executor/execExpr.c:3135 executor/execExpr.c:3157 #, c-format msgid "type %s does not support subscripted assignment" msgstr "le type %s ne supporte pas l'affectation avec indice" -#: executor/execExprInterp.c:1918 +#: executor/execExprInterp.c:1962 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "l'attribut %d du type %s a été supprimé" -#: executor/execExprInterp.c:1924 +#: executor/execExprInterp.c:1968 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "l'attribut %d de type %s a un mauvais type" -#: executor/execExprInterp.c:1926 executor/execExprInterp.c:3054 -#: executor/execExprInterp.c:3100 +#: executor/execExprInterp.c:1970 executor/execExprInterp.c:3104 +#: executor/execExprInterp.c:3150 #, c-format msgid "Table has type %s, but query expects %s." msgstr "La table a le type %s alors que la requête attend %s." -#: executor/execExprInterp.c:2005 utils/adt/expandedrecord.c:99 +#: executor/execExprInterp.c:2050 utils/adt/expandedrecord.c:99 #: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1749 #: utils/cache/typcache.c:1908 utils/cache/typcache.c:2055 -#: utils/fmgr/funcapi.c:570 +#: utils/fmgr/funcapi.c:561 #, c-format msgid "type %s is not composite" msgstr "le type %s n'est pas un type composite" -#: executor/execExprInterp.c:2543 +#: executor/execExprInterp.c:2588 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF n'est pas supporté pour ce type de table" -#: executor/execExprInterp.c:2756 +#: executor/execExprInterp.c:2801 #, c-format msgid "cannot merge incompatible arrays" msgstr "ne peut pas fusionner les tableaux incompatibles" -#: executor/execExprInterp.c:2757 +#: executor/execExprInterp.c:2802 #, c-format msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "Le tableau avec le type d'élément %s ne peut pas être inclus dans la construction ARRAY avec le type d'élément %s." -#: executor/execExprInterp.c:2778 utils/adt/arrayfuncs.c:263 -#: utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 -#: utils/adt/arrayfuncs.c:3375 utils/adt/arrayfuncs.c:5372 -#: utils/adt/arrayfuncs.c:5889 utils/adt/arraysubs.c:150 +#: executor/execExprInterp.c:2823 utils/adt/arrayfuncs.c:265 +#: utils/adt/arrayfuncs.c:575 utils/adt/arrayfuncs.c:1329 +#: utils/adt/arrayfuncs.c:3483 utils/adt/arrayfuncs.c:5567 +#: utils/adt/arrayfuncs.c:6084 utils/adt/arraysubs.c:150 #: utils/adt/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "le nombre de dimensions du tableau (%d) dépasse le maximum autorisé (%d)" -#: executor/execExprInterp.c:2798 executor/execExprInterp.c:2828 +#: executor/execExprInterp.c:2843 executor/execExprInterp.c:2878 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "" "les tableaux multidimensionnels doivent avoir des expressions de tableaux\n" "avec les dimensions correspondantes" -#: executor/execExprInterp.c:3053 executor/execExprInterp.c:3099 +#: executor/execExprInterp.c:2855 utils/adt/array_expanded.c:274 +#: utils/adt/arrayfuncs.c:959 utils/adt/arrayfuncs.c:1568 +#: utils/adt/arrayfuncs.c:3285 utils/adt/arrayfuncs.c:3513 +#: utils/adt/arrayfuncs.c:6176 utils/adt/arrayfuncs.c:6517 +#: utils/adt/arrayutils.c:104 utils/adt/arrayutils.c:113 +#: utils/adt/arrayutils.c:120 +#, c-format +msgid "array size exceeds the maximum allowed (%d)" +msgstr "la taille du tableau dépasse le maximum permis (%d)" + +#: executor/execExprInterp.c:3103 executor/execExprInterp.c:3149 #, c-format msgid "attribute %d has wrong type" msgstr "l'attribut %d a un mauvais type" -#: executor/execExprInterp.c:3681 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3735 utils/adt/domains.c:155 #, c-format msgid "domain %s does not allow null values" msgstr "le domaine %s n'autorise pas les valeurs NULL" -#: executor/execExprInterp.c:3696 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3750 utils/adt/domains.c:193 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "la valeur pour le domaine %s viole la contrainte de vérification « %s »" -#: executor/execExprInterp.c:4053 +#: executor/execExprInterp.c:4235 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." msgstr[0] "La ligne de la table contient %d attribut alors que la requête en attend %d." msgstr[1] "La ligne de la table contient %d attributs alors que la requête en attend %d." -#: executor/execExprInterp.c:4169 executor/execSRF.c:977 +#: executor/execExprInterp.c:4351 executor/execSRF.c:978 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "" "Le stockage physique ne correspond pas à l'attribut supprimé à la position\n" "ordinale %d." -#: executor/execIndexing.c:571 +#: executor/execIndexing.c:588 #, c-format msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" -msgstr "ON CONFLICT ne supporte pas les contraintes uniques diferrables et les contraintes d'exclusion différables comme arbitres" +msgstr "ON CONFLICT ne supporte pas les contraintes uniques différables et les contraintes d'exclusion différables comme arbitres" -#: executor/execIndexing.c:848 +#: executor/execIndexing.c:865 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "n'a pas pu créer la contrainte d'exclusion « %s »" -#: executor/execIndexing.c:851 +#: executor/execIndexing.c:868 #, c-format msgid "Key %s conflicts with key %s." msgstr "La clé %s est en conflit avec la clé %s." -#: executor/execIndexing.c:853 +#: executor/execIndexing.c:870 #, c-format msgid "Key conflicts exist." msgstr "Un conflit de clés est présent." -#: executor/execIndexing.c:859 +#: executor/execIndexing.c:876 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "la valeur d'une clé en conflit rompt la contrainte d'exclusion « %s »" -#: executor/execIndexing.c:862 +#: executor/execIndexing.c:879 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "La clé %s est en conflit avec la clé existante %s." -#: executor/execIndexing.c:864 +#: executor/execIndexing.c:881 #, c-format msgid "Key conflicts with existing key." msgstr "La clé est en conflit avec une clé existante." -#: executor/execMain.c:1009 +#: executor/execMain.c:1039 #, c-format msgid "cannot change sequence \"%s\"" msgstr "ne peut pas modifier la séquence « %s »" -#: executor/execMain.c:1015 +#: executor/execMain.c:1045 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "ne peut pas modifier la relation TOAST « %s »" -#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3069 -#: rewrite/rewriteHandler.c:3916 +#: executor/execMain.c:1063 rewrite/rewriteHandler.c:3079 +#: rewrite/rewriteHandler.c:3966 #, c-format msgid "cannot insert into view \"%s\"" msgstr "ne peut pas insérer dans la vue « %s »" -#: executor/execMain.c:1035 rewrite/rewriteHandler.c:3072 -#: rewrite/rewriteHandler.c:3919 +#: executor/execMain.c:1065 rewrite/rewriteHandler.c:3082 +#: rewrite/rewriteHandler.c:3969 #, c-format msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." msgstr "Pour activer l'insertion dans la vue, fournissez un trigger INSTEAD OF INSERT ou une règle ON INSERT DO INSTEAD sans condition." -#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3077 -#: rewrite/rewriteHandler.c:3924 +#: executor/execMain.c:1071 rewrite/rewriteHandler.c:3087 +#: rewrite/rewriteHandler.c:3974 #, c-format msgid "cannot update view \"%s\"" msgstr "ne peut pas mettre à jour la vue « %s »" -#: executor/execMain.c:1043 rewrite/rewriteHandler.c:3080 -#: rewrite/rewriteHandler.c:3927 +#: executor/execMain.c:1073 rewrite/rewriteHandler.c:3090 +#: rewrite/rewriteHandler.c:3977 #, c-format msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." msgstr "Pour activer la mise à jour dans la vue, fournissez un trigger INSTEAD OF UPDATE ou une règle ON UPDATE DO INSTEAD sans condition." -#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3085 -#: rewrite/rewriteHandler.c:3932 +#: executor/execMain.c:1079 rewrite/rewriteHandler.c:3095 +#: rewrite/rewriteHandler.c:3982 #, c-format msgid "cannot delete from view \"%s\"" msgstr "ne peut pas supprimer à partir de la vue « %s »" -#: executor/execMain.c:1051 rewrite/rewriteHandler.c:3088 -#: rewrite/rewriteHandler.c:3935 +#: executor/execMain.c:1081 rewrite/rewriteHandler.c:3098 +#: rewrite/rewriteHandler.c:3985 #, c-format msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." msgstr "Pour activer la suppression dans la vue, fournissez un trigger INSTEAD OF DELETE ou une règle ON DELETE DO INSTEAD sans condition." -#: executor/execMain.c:1062 +#: executor/execMain.c:1092 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "ne peut pas modifier la vue matérialisée « %s »" -#: executor/execMain.c:1074 +#: executor/execMain.c:1104 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "ne peut pas insérer dans la table distante « %s »" -#: executor/execMain.c:1080 +#: executor/execMain.c:1110 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "la table distante « %s » n'autorise pas les insertions" -#: executor/execMain.c:1087 +#: executor/execMain.c:1117 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "ne peut pas modifier la table distante « %s »" -#: executor/execMain.c:1093 +#: executor/execMain.c:1123 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "la table distante « %s » n'autorise pas les modifications" -#: executor/execMain.c:1100 +#: executor/execMain.c:1130 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "ne peut pas supprimer à partir de la table distante « %s »" -#: executor/execMain.c:1106 +#: executor/execMain.c:1136 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "la table distante « %s » n'autorise pas les suppressions" -#: executor/execMain.c:1117 +#: executor/execMain.c:1147 #, c-format msgid "cannot change relation \"%s\"" msgstr "ne peut pas modifier la relation « %s »" -#: executor/execMain.c:1144 +#: executor/execMain.c:1174 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "ne peut pas verrouiller les lignes dans la séquence « %s »" -#: executor/execMain.c:1151 +#: executor/execMain.c:1181 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "ne peut pas verrouiller les lignes dans la relation TOAST « %s »" -#: executor/execMain.c:1158 +#: executor/execMain.c:1188 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "ne peut pas verrouiller les lignes dans la vue « %s »" -#: executor/execMain.c:1166 +#: executor/execMain.c:1196 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "ne peut pas verrouiller les lignes dans la vue matérialisée « %s »" -#: executor/execMain.c:1175 executor/execMain.c:2653 -#: executor/nodeLockRows.c:136 +#: executor/execMain.c:1205 executor/execMain.c:2708 +#: executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "ne peut pas verrouiller la table distante « %s »" -#: executor/execMain.c:1181 +#: executor/execMain.c:1211 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "n'a pas pu verrouiller les lignes dans la relation « %s »" -#: executor/execMain.c:1888 +#: executor/execMain.c:1922 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "la nouvelle ligne de la relation « %s » viole la contrainte de partitionnement" -#: executor/execMain.c:1890 executor/execMain.c:1973 executor/execMain.c:2023 -#: executor/execMain.c:2132 +#: executor/execMain.c:1924 executor/execMain.c:2008 executor/execMain.c:2059 +#: executor/execMain.c:2169 #, c-format msgid "Failing row contains %s." msgstr "La ligne en échec contient %s." -#: executor/execMain.c:1970 +#: executor/execMain.c:2005 #, c-format msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" msgstr "une valeur NULL viole la contrainte NOT NULL de la colonne « %s » dans la relation « %s »" -#: executor/execMain.c:2021 +#: executor/execMain.c:2057 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "la nouvelle ligne de la relation « %s » viole la contrainte de vérification « %s »" -#: executor/execMain.c:2130 +#: executor/execMain.c:2167 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "la nouvelle ligne viole la contrainte de vérification pour la vue « %s »" -#: executor/execMain.c:2140 +#: executor/execMain.c:2177 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "la nouvelle ligne viole la politique de sécurité au niveau ligne « %s » pour la table « %s »" -#: executor/execMain.c:2145 +#: executor/execMain.c:2182 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "la nouvelle ligne viole la politique de sécurité au niveau ligne pour la table « %s »" -#: executor/execMain.c:2153 +#: executor/execMain.c:2190 #, fuzzy, c-format #| msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "la nouvelle ligne viole la politique de sécurité au niveau ligne « %s » (expression USING) pour la table « %s »" -#: executor/execMain.c:2158 +#: executor/execMain.c:2195 #, fuzzy, c-format #| msgid "new row violates row-level security policy (USING expression) for table \"%s\"" msgid "target row violates row-level security policy (USING expression) for table \"%s\"" msgstr "la nouvelle ligne viole la politique de sécurité au niveau ligne (expression USING) pour la table « %s »" -#: executor/execMain.c:2165 +#: executor/execMain.c:2202 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "la nouvelle ligne viole la politique de sécurité au niveau ligne « %s » (expression USING) pour la table « %s »" -#: executor/execMain.c:2170 +#: executor/execMain.c:2207 #, c-format msgid "new row violates row-level security policy (USING expression) for table \"%s\"" msgstr "la nouvelle ligne viole la politique de sécurité au niveau ligne (expression USING) pour la table « %s »" @@ -13445,133 +13843,133 @@ msgstr "aucune partition de la relation « %s » trouvée pour la ligne" msgid "Partition key of the failing row contains %s." msgstr "La clé de partitionnement de la ligne en échec contient %s." -#: executor/execReplication.c:196 executor/execReplication.c:373 +#: executor/execReplication.c:231 executor/execReplication.c:415 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update, retrying" msgstr "la ligne à verrouiller était déjà déplacée vers une autre partition du fait d'une mise à jour concurrente, nouvelle tentative" -#: executor/execReplication.c:200 executor/execReplication.c:377 +#: executor/execReplication.c:235 executor/execReplication.c:419 #, c-format msgid "concurrent update, retrying" msgstr "mise à jour concurrente, nouvelle tentative" -#: executor/execReplication.c:206 executor/execReplication.c:383 +#: executor/execReplication.c:241 executor/execReplication.c:425 #, c-format msgid "concurrent delete, retrying" msgstr "suppression concurrente, nouvelle tentative" -#: executor/execReplication.c:269 parser/parse_cte.c:308 -#: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:720 -#: utils/adt/array_userfuncs.c:859 utils/adt/arrayfuncs.c:3655 -#: utils/adt/arrayfuncs.c:4210 utils/adt/arrayfuncs.c:6202 -#: utils/adt/rowtypes.c:1203 +#: executor/execReplication.c:311 parser/parse_cte.c:308 +#: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:1348 +#: utils/adt/array_userfuncs.c:1491 utils/adt/arrayfuncs.c:3832 +#: utils/adt/arrayfuncs.c:4387 utils/adt/arrayfuncs.c:6397 +#: utils/adt/rowtypes.c:1230 #, c-format msgid "could not identify an equality operator for type %s" msgstr "n'a pas pu identifier un opérateur d'égalité pour le type %s" -#: executor/execReplication.c:599 executor/execReplication.c:605 +#: executor/execReplication.c:642 executor/execReplication.c:648 #, fuzzy, c-format #| msgid "cannot update foreign table \"%s\"" msgid "cannot update table \"%s\"" msgstr "ne peut pas modifier la table distante « %s »" -#: executor/execReplication.c:601 executor/execReplication.c:613 +#: executor/execReplication.c:644 executor/execReplication.c:656 #, c-format msgid "Column used in the publication WHERE expression is not part of the replica identity." msgstr "La colonne utilisée dans l'expression WHERE de la publication ne fait pas partie de l'identité de réplica." -#: executor/execReplication.c:607 executor/execReplication.c:619 +#: executor/execReplication.c:650 executor/execReplication.c:662 #, c-format msgid "Column list used by the publication does not cover the replica identity." msgstr "La liste de colonnes utilisée par la publication ne couvre pas l'identité de réplica." -#: executor/execReplication.c:611 executor/execReplication.c:617 +#: executor/execReplication.c:654 executor/execReplication.c:660 #, fuzzy, c-format #| msgid "cannot delete from foreign table \"%s\"" msgid "cannot delete from table \"%s\"" msgstr "ne peut pas supprimer à partir de la table distante « %s »" -#: executor/execReplication.c:637 +#: executor/execReplication.c:680 #, c-format msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" msgstr "ne peut pas mettre à jour la table « %s » car elle n'a pas d'identité de réplicat et publie des mises à jour" -#: executor/execReplication.c:639 +#: executor/execReplication.c:682 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Pour permettre les mises à jour sur la table, configurez REPLICA IDENTITY en utilisant ALTER TABLE." -#: executor/execReplication.c:643 +#: executor/execReplication.c:686 #, c-format msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" msgstr "ne peut pas supprimer à partir de la table « %s » car elle n'a pas d'identité de réplicat et publie des suppressions" -#: executor/execReplication.c:645 +#: executor/execReplication.c:688 #, c-format msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Pour permettre les suppressions sur la table, configurez REPLICA IDENTITY en utilisant ALTER TABLE." -#: executor/execReplication.c:661 +#: executor/execReplication.c:704 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "ne peut pas utiliser la relation « %s.%s » comme cible d'une réplication logique" -#: executor/execSRF.c:315 +#: executor/execSRF.c:316 #, c-format msgid "rows returned by function are not all of the same row type" msgstr "les lignes renvoyées par la fonction ne sont pas toutes du même type ligne" -#: executor/execSRF.c:365 +#: executor/execSRF.c:366 #, c-format msgid "table-function protocol for value-per-call mode was not followed" msgstr "le protocole de la fonction table pour le mode valeur-par-appel n'a pas été suivi" -#: executor/execSRF.c:373 executor/execSRF.c:667 +#: executor/execSRF.c:374 executor/execSRF.c:668 #, c-format msgid "table-function protocol for materialize mode was not followed" msgstr "le protocole de la fonction table pour le mode matérialisé n'a pas été respecté" -#: executor/execSRF.c:380 executor/execSRF.c:685 +#: executor/execSRF.c:381 executor/execSRF.c:686 #, c-format msgid "unrecognized table-function returnMode: %d" msgstr "returnMode de la fonction table non reconnu : %d" -#: executor/execSRF.c:894 +#: executor/execSRF.c:895 #, c-format msgid "function returning setof record called in context that cannot accept type record" msgstr "" "la fonction renvoyant des lignes a été appelée dans un contexte qui\n" "n'accepte pas un ensemble" -#: executor/execSRF.c:950 executor/execSRF.c:966 executor/execSRF.c:976 +#: executor/execSRF.c:951 executor/execSRF.c:967 executor/execSRF.c:977 #, c-format msgid "function return row and query-specified return row do not match" msgstr "la ligne de retour spécifiée par la requête et la ligne de retour de la fonction ne correspondent pas" -#: executor/execSRF.c:951 +#: executor/execSRF.c:952 #, c-format msgid "Returned row contains %d attribute, but query expects %d." msgid_plural "Returned row contains %d attributes, but query expects %d." msgstr[0] "La ligne renvoyée contient %d attribut mais la requête en attend %d." msgstr[1] "La ligne renvoyée contient %d attributs mais la requête en attend %d." -#: executor/execSRF.c:967 +#: executor/execSRF.c:968 #, c-format msgid "Returned type %s at ordinal position %d, but query expects %s." msgstr "A renvoyé le type %s à la position ordinale %d, mais la requête attend %s." #: executor/execTuples.c:146 executor/execTuples.c:353 -#: executor/execTuples.c:521 executor/execTuples.c:712 +#: executor/execTuples.c:521 executor/execTuples.c:713 #, c-format msgid "cannot retrieve a system column in this context" msgstr "ne peut pas récupérer une colonne système dans ce contexte" -#: executor/execUtils.c:742 +#: executor/execUtils.c:744 #, c-format msgid "materialized view \"%s\" has not been populated" msgstr "la vue matérialisée « %s » n'a pas été peuplée" -#: executor/execUtils.c:744 +#: executor/execUtils.c:746 #, c-format msgid "Use the REFRESH MATERIALIZED VIEW command." msgstr "Utilisez la commande REFRESH MATERIALIZED VIEW." @@ -13581,114 +13979,103 @@ msgstr "Utilisez la commande REFRESH MATERIALIZED VIEW." msgid "could not determine actual type of argument declared %s" msgstr "n'a pas pu déterminer le type actuel de l'argument déclaré %s" -#: executor/functions.c:514 +#: executor/functions.c:512 #, c-format msgid "cannot COPY to/from client in an SQL function" msgstr "ne peut pas utiliser COPY TO/FROM dans une fonction SQL" #. translator: %s is a SQL statement name -#: executor/functions.c:520 +#: executor/functions.c:518 #, c-format msgid "%s is not allowed in an SQL function" msgstr "%s n'est pas autorisé dans une fonction SQL" #. translator: %s is a SQL statement name -#: executor/functions.c:528 executor/spi.c:1742 executor/spi.c:2631 +#: executor/functions.c:526 executor/spi.c:1742 executor/spi.c:2635 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s n'est pas autorisé dans une fonction non volatile" -#: executor/functions.c:1457 +#: executor/functions.c:1450 #, c-format msgid "SQL function \"%s\" statement %d" msgstr "fonction SQL « %s », instruction %d" -#: executor/functions.c:1483 +#: executor/functions.c:1476 #, c-format msgid "SQL function \"%s\" during startup" msgstr "fonction SQL « %s » lors du lancement" -#: executor/functions.c:1568 +#: executor/functions.c:1561 #, c-format msgid "calling procedures with output arguments is not supported in SQL functions" msgstr "l'appel à des procédures avec des arguments en sortie n'est pas supporté dans les fonctions SQL" -#: executor/functions.c:1701 executor/functions.c:1739 -#: executor/functions.c:1753 executor/functions.c:1843 -#: executor/functions.c:1876 executor/functions.c:1890 +#: executor/functions.c:1694 executor/functions.c:1732 +#: executor/functions.c:1746 executor/functions.c:1836 +#: executor/functions.c:1869 executor/functions.c:1883 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "le type de retour ne correspond pas à la fonction déclarant renvoyer %s" -#: executor/functions.c:1703 +#: executor/functions.c:1696 #, c-format msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." msgstr "" "L'instruction finale de la fonction doit être un SELECT ou un\n" "INSERT/UPDATE/DELETE RETURNING." -#: executor/functions.c:1741 +#: executor/functions.c:1734 #, c-format msgid "Final statement must return exactly one column." msgstr "L'instruction finale doit renvoyer exactement une colonne." -#: executor/functions.c:1755 +#: executor/functions.c:1748 #, c-format msgid "Actual return type is %s." msgstr "Le code de retour réel est %s." -#: executor/functions.c:1845 +#: executor/functions.c:1838 #, c-format msgid "Final statement returns too many columns." msgstr "L'instruction finale renvoie beaucoup trop de colonnes." -#: executor/functions.c:1878 +#: executor/functions.c:1871 #, c-format msgid "Final statement returns %s instead of %s at column %d." msgstr "L'instruction finale renvoie %s au lieu de %s pour la colonne %d." -#: executor/functions.c:1892 +#: executor/functions.c:1885 #, c-format msgid "Final statement returns too few columns." msgstr "L'instruction finale renvoie trop peu de colonnes." -#: executor/functions.c:1920 +#: executor/functions.c:1913 #, c-format msgid "return type %s is not supported for SQL functions" msgstr "le type de retour %s n'est pas supporté pour les fonctions SQL" -#: executor/nodeAgg.c:3006 executor/nodeAgg.c:3015 executor/nodeAgg.c:3027 -#, fuzzy, c-format -#| msgid "unexpected EOF for tape %d: requested %zu bytes, read %zu bytes" -msgid "unexpected EOF for tape %p: requested %zu bytes, read %zu bytes" -msgstr "fin de fichier inattendu pour la cassette %d : attendait %zu octets, a lu %zu octets" - -#: executor/nodeAgg.c:3922 executor/nodeWindowAgg.c:2982 +#: executor/nodeAgg.c:3937 executor/nodeWindowAgg.c:2993 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "l'agrégat %u a besoin d'avoir des types compatibles en entrée et en transition" -#: executor/nodeAgg.c:3952 parser/parse_agg.c:668 parser/parse_agg.c:696 +#: executor/nodeAgg.c:3967 parser/parse_agg.c:669 parser/parse_agg.c:697 #, c-format msgid "aggregate function calls cannot be nested" msgstr "les appels à la fonction d'agrégat ne peuvent pas être imbriqués" -#: executor/nodeCustom.c:145 executor/nodeCustom.c:156 +#: executor/nodeCustom.c:154 executor/nodeCustom.c:165 #, c-format msgid "custom scan \"%s\" does not support MarkPos" msgstr "le parcours personnalisé « %s » ne supporte pas MarkPos" -#: executor/nodeHashjoin.c:1046 executor/nodeHashjoin.c:1076 +#: executor/nodeHashjoin.c:1143 executor/nodeHashjoin.c:1173 #, c-format msgid "could not rewind hash-join temporary file" msgstr "n'a pas pu revenir au début du fichier temporaire pour la jointure de hachage" -#: executor/nodeHashjoin.c:1272 executor/nodeHashjoin.c:1283 -#, c-format -msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" -msgstr "n'a pas pu lire le fichier temporaire pour la jointure de hachage : a lu seulement %zu octets sur %zu" - -#: executor/nodeIndexonlyscan.c:240 +#: executor/nodeIndexonlyscan.c:238 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "les fonctions de distance à perte ne sont pas supportées dans les parcours d'index seul" @@ -13703,75 +14090,75 @@ msgstr "OFFSET ne doit pas être négatif" msgid "LIMIT must not be negative" msgstr "LIMIT ne doit pas être négative" -#: executor/nodeMergejoin.c:1570 +#: executor/nodeMergejoin.c:1579 #, c-format msgid "RIGHT JOIN is only supported with merge-joinable join conditions" msgstr "RIGHT JOIN est supporté seulement avec les conditions de jointures MERGE" -#: executor/nodeMergejoin.c:1588 +#: executor/nodeMergejoin.c:1597 #, c-format msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOIN est supporté seulement avec les conditions de jointures MERGE" -#: executor/nodeModifyTable.c:257 +#: executor/nodeModifyTable.c:234 #, c-format msgid "Query has too few columns." msgstr "La requête n'a pas assez de colonnes." -#: executor/nodeModifyTable.c:1534 executor/nodeModifyTable.c:1608 +#: executor/nodeModifyTable.c:1530 executor/nodeModifyTable.c:1604 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "la ligne à supprimer était déjà modifiée par une opération déclenchée par la commande courante" -#: executor/nodeModifyTable.c:1759 +#: executor/nodeModifyTable.c:1758 #, c-format msgid "invalid ON UPDATE specification" msgstr "spécification ON UPDATE invalide" -#: executor/nodeModifyTable.c:1760 +#: executor/nodeModifyTable.c:1759 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "La ligne résultante apparaîtrait dans une partition différente de la ligne originale." -#: executor/nodeModifyTable.c:2207 +#: executor/nodeModifyTable.c:2217 #, c-format msgid "cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key" msgstr "" -#: executor/nodeModifyTable.c:2208 +#: executor/nodeModifyTable.c:2218 #, c-format msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "" -#: executor/nodeModifyTable.c:2211 +#: executor/nodeModifyTable.c:2221 #, fuzzy, c-format #| msgid "cannot insert into foreign table \"%s\"" msgid "Consider defining the foreign key on table \"%s\"." msgstr "ne peut pas insérer dans la table distante « %s »" #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2555 executor/nodeModifyTable.c:2946 +#: executor/nodeModifyTable.c:2567 executor/nodeModifyTable.c:2955 #, fuzzy, c-format #| msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" msgid "%s command cannot affect row a second time" msgstr "la commande ON CONFLICT DO UPDATE ne peut pas affecter une ligne la deuxième fois" -#: executor/nodeModifyTable.c:2557 +#: executor/nodeModifyTable.c:2569 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "S'assure qu'aucune ligne proposée à l'insertion dans la même commande n'a de valeurs contraintes dupliquées." -#: executor/nodeModifyTable.c:2948 +#: executor/nodeModifyTable.c:2957 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "" -#: executor/nodeModifyTable.c:3051 +#: executor/nodeModifyTable.c:3038 #, c-format msgid "tuple to be deleted was already moved to another partition due to concurrent update" msgstr "la ligne à supprimer était déjà déplacée vers une autre partition du fait d'une mise à jour concurrente" -#: executor/nodeModifyTable.c:3090 +#: executor/nodeModifyTable.c:3077 #, fuzzy, c-format #| msgid "tuple to be updated was already modified by an operation triggered by the current command" msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" @@ -13787,8 +14174,8 @@ msgstr "le paramètre de TABLESAMPLE ne peut pas être NULL" msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "le paramètre TABLESAMPLE REPEATABLE ne peut pas être NULL" -#: executor/nodeSubplan.c:346 executor/nodeSubplan.c:385 -#: executor/nodeSubplan.c:1159 +#: executor/nodeSubplan.c:325 executor/nodeSubplan.c:351 +#: executor/nodeSubplan.c:405 executor/nodeSubplan.c:1174 #, c-format msgid "more than one row returned by a subquery used as an expression" msgstr "plus d'une ligne renvoyée par une sous-requête utilisée comme une expression" @@ -13818,32 +14205,32 @@ msgstr "Le filtre pour la colonne « %s » est NULL." msgid "null is not allowed in column \"%s\"" msgstr "NULL n'est pas autorisé dans la colonne « %s »" -#: executor/nodeWindowAgg.c:355 +#: executor/nodeWindowAgg.c:356 #, c-format msgid "moving-aggregate transition function must not return null" msgstr "la fonction de conversion de l'agrégat en déplacement ne doit pas renvoyer null" -#: executor/nodeWindowAgg.c:2080 +#: executor/nodeWindowAgg.c:2083 #, c-format msgid "frame starting offset must not be null" msgstr "l'offset de début de frame ne doit pas être NULL" -#: executor/nodeWindowAgg.c:2093 +#: executor/nodeWindowAgg.c:2096 #, c-format msgid "frame starting offset must not be negative" msgstr "l'offset de début de frame ne doit pas être négatif" -#: executor/nodeWindowAgg.c:2105 +#: executor/nodeWindowAgg.c:2108 #, c-format msgid "frame ending offset must not be null" msgstr "l'offset de fin de frame ne doit pas être NULL" -#: executor/nodeWindowAgg.c:2118 +#: executor/nodeWindowAgg.c:2121 #, c-format msgid "frame ending offset must not be negative" msgstr "l'offset de fin de frame ne doit pas être négatif" -#: executor/nodeWindowAgg.c:2898 +#: executor/nodeWindowAgg.c:2909 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "la fonction d'agrégat %s ne supporte pas l'utilisation en tant que fonction de fenêtrage" @@ -13894,33 +14281,33 @@ msgstr "ne peut pas ouvrir la requête %s comme curseur" msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE n'est pas supporté" -#: executor/spi.c:1717 parser/analyze.c:2861 +#: executor/spi.c:1717 parser/analyze.c:2912 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Les curseurs déplaçables doivent être en lecture seule (READ ONLY)." -#: executor/spi.c:2470 +#: executor/spi.c:2474 #, c-format msgid "empty query does not return tuples" msgstr "la requête vide ne renvoie pas de lignes" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:2544 +#: executor/spi.c:2548 #, c-format msgid "%s query does not return tuples" msgstr "la requête %s ne renvoie pas de lignes" -#: executor/spi.c:2959 +#: executor/spi.c:2963 #, c-format msgid "SQL expression \"%s\"" msgstr "expression SQL « %s »" -#: executor/spi.c:2964 +#: executor/spi.c:2968 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "affectation PL/pgSQL « %s »" -#: executor/spi.c:2967 +#: executor/spi.c:2971 #, c-format msgid "SQL statement \"%s\"" msgstr "instruction SQL « %s »" @@ -13930,564 +14317,551 @@ msgstr "instruction SQL « %s »" msgid "could not send tuple to shared-memory queue" msgstr "n'a pas pu envoyer la ligne dans la queue en mémoire partagée" -#: foreign/foreign.c:221 +#: foreign/foreign.c:222 #, c-format msgid "user mapping not found for \"%s\"" msgstr "correspondance utilisateur non trouvée pour « %s »" -#: foreign/foreign.c:638 +#: foreign/foreign.c:647 storage/file/fd.c:3931 #, c-format msgid "invalid option \"%s\"" msgstr "option « %s » invalide" -#: foreign/foreign.c:640 -#, c-format -msgid "Valid options in this context are: %s" -msgstr "Les options valides dans ce contexte sont %s" +#: foreign/foreign.c:649 +#, fuzzy, c-format +#| msgid "Perhaps you meant to reference the column \"%s.%s\"." +msgid "Perhaps you meant the option \"%s\"." +msgstr "Peut-être que vous souhaitiez référencer la colonne « %s.%s »." -#: foreign/foreign.c:642 +#: foreign/foreign.c:651 #, fuzzy, c-format #| msgid "Valid options in this context are: %s" msgid "There are no valid options in this context." msgstr "Les options valides dans ce contexte sont %s" -#: gram.y:1146 +#: gram.y:1197 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD n'est plus supporté" -#: gram.y:1147 +#: gram.y:1198 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "Supprimez UNENCRYPTED pour enregistrer le mot de passe dans sa forme chiffrée à la place." -#: gram.y:1209 -#, c-format -msgid "unrecognized role option \"%s\"" -msgstr "option « %s » du rôle non reconnue" - -#: gram.y:1474 gram.y:1490 +#: gram.y:1525 gram.y:1541 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTS n'inclut pas les éléments du schéma" -#: gram.y:1647 +#: gram.y:1693 #, c-format msgid "current database cannot be changed" msgstr "la base de données actuelle ne peut pas être changée" -#: gram.y:1780 +#: gram.y:1826 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "l'intervalle de fuseau horaire doit être HOUR ou HOUR TO MINUTE" -#: gram.y:2397 +#: gram.y:2443 #, c-format msgid "column number must be in range from 1 to %d" msgstr "le numéro de colonne doit être dans l'intervalle entre 1 et %d" -#: gram.y:2999 +#: gram.y:3039 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "option de séquence « %s » non supportée ici" -#: gram.y:3028 +#: gram.y:3068 #, c-format msgid "modulus for hash partition provided more than once" msgstr "le modulo pour la partition hash est spécifié plus d'une fois" -#: gram.y:3037 +#: gram.y:3077 #, c-format msgid "remainder for hash partition provided more than once" msgstr "le reste pour la partition hash est spécifié plus d'une fois" -#: gram.y:3044 +#: gram.y:3084 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "spécification de limite de partition hash non reconnue « %s »" -#: gram.y:3052 +#: gram.y:3092 #, c-format msgid "modulus for hash partition must be specified" msgstr "le modulo pour les partitions hash doit être spécifié" -#: gram.y:3056 +#: gram.y:3096 #, c-format msgid "remainder for hash partition must be specified" msgstr "le reste pour les partition hash doit être spécifié" -#: gram.y:3264 gram.y:3298 +#: gram.y:3304 gram.y:3338 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUT non autorisé dans PROGRAM" -#: gram.y:3270 +#: gram.y:3310 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "la clause WHERE n'est pas autorisée avec COPY TO" -#: gram.y:3609 gram.y:3616 gram.y:12759 gram.y:12767 +#: gram.y:3649 gram.y:3656 gram.y:12821 gram.y:12829 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "GLOBAL est obsolète dans la création de la table temporaire" -#: gram.y:3881 +#: gram.y:3932 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "pour une colonne générée, GENERATED ALWAYS doit toujours être spécifié" -#: gram.y:4172 utils/adt/ri_triggers.c:2098 +#: gram.y:4223 utils/adt/ri_triggers.c:2112 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "MATCH PARTIAL non implémenté" -#: gram.y:4264 +#: gram.y:4315 #, fuzzy, c-format #| msgid "return type %s is not supported for SQL functions" msgid "a column list with %s is only supported for ON DELETE actions" msgstr "le type de retour %s n'est pas supporté pour les fonctions SQL" -#: gram.y:4974 +#: gram.y:5027 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM n'est plus supporté" -#: gram.y:5672 +#: gram.y:5725 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "option « %s » de sécurité de ligne non reconnue" -#: gram.y:5673 +#: gram.y:5726 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "Seules les politiques PERMISSIVE et RESTRICTIVE sont supportées actuellement." -#: gram.y:5758 +#: gram.y:5811 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER n'est pas supporté" -#: gram.y:5795 +#: gram.y:5848 msgid "duplicate trigger events specified" msgstr "événements de trigger dupliqués spécifiés" -#: gram.y:5937 parser/parse_utilcmd.c:3716 parser/parse_utilcmd.c:3742 +#: gram.y:5990 parser/parse_utilcmd.c:3695 parser/parse_utilcmd.c:3721 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "la contrainte déclarée INITIALLY DEFERRED doit être DEFERRABLE" -#: gram.y:5944 +#: gram.y:5997 #, c-format msgid "conflicting constraint properties" msgstr "propriétés de contrainte en conflit" -#: gram.y:6043 +#: gram.y:6096 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTION n'est pas encore implémenté" -#: gram.y:6451 +#: gram.y:6504 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK n'est plus nécessaire" -#: gram.y:6452 +#: gram.y:6505 #, c-format msgid "Update your data type." msgstr "Mettez à jour votre type de données." -#: gram.y:8308 +#: gram.y:8378 #, c-format msgid "aggregates cannot have output arguments" msgstr "les agrégats ne peuvent pas avoir d'arguments en sortie" -#: gram.y:8771 utils/adt/regproc.c:710 utils/adt/regproc.c:751 +#: gram.y:8841 utils/adt/regproc.c:670 #, c-format msgid "missing argument" msgstr "argument manquant" -#: gram.y:8772 utils/adt/regproc.c:711 utils/adt/regproc.c:752 +#: gram.y:8842 utils/adt/regproc.c:671 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "Utilisez NONE pour dénoter l'argument manquant d'un opérateur unitaire." -#: gram.y:10993 gram.y:11012 +#: gram.y:11054 gram.y:11073 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTION non supporté sur les vues récursives" -#: gram.y:12898 +#: gram.y:12960 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "la syntaxe LIMIT #,# n'est pas supportée" -#: gram.y:12899 +#: gram.y:12961 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "Utilisez les clauses séparées LIMIT et OFFSET." -#: gram.y:13252 gram.y:13278 -#, c-format -msgid "VALUES in FROM must have an alias" -msgstr "VALUES dans FROM doit avoir un alias" - -#: gram.y:13253 gram.y:13279 -#, c-format -msgid "For example, FROM (VALUES ...) [AS] foo." -msgstr "Par exemple, FROM (VALUES ...) [AS] quelquechose." - -#: gram.y:13258 gram.y:13284 -#, c-format -msgid "subquery in FROM must have an alias" -msgstr "la sous-requête du FROM doit avoir un alias" - -#: gram.y:13259 gram.y:13285 -#, c-format -msgid "For example, FROM (SELECT ...) [AS] foo." -msgstr "Par exemple, FROM (SELECT...) [AS] quelquechose." - -#: gram.y:13803 +#: gram.y:13821 #, c-format msgid "only one DEFAULT value is allowed" msgstr "seule une valeur DEFAULT est autorisée" -#: gram.y:13812 +#: gram.y:13830 #, c-format msgid "only one PATH value per column is allowed" msgstr "seule une valeur PATH par colonne est autorisée" -#: gram.y:13821 +#: gram.y:13839 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "déclarations NULL/NOT NULL en conflit ou redondantes pour la colonne « %s »" -#: gram.y:13830 +#: gram.y:13848 #, c-format msgid "unrecognized column option \"%s\"" msgstr "option de colonne « %s » non reconnue" -#: gram.y:14084 +#: gram.y:14102 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "la précision du type float doit être d'au moins un bit" -#: gram.y:14093 +#: gram.y:14111 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "la précision du type float doit être inférieur à 54 bits" -#: gram.y:14596 +#: gram.y:14614 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "mauvais nombre de paramètres sur le côté gauche de l'expression OVERLAPS" -#: gram.y:14601 +#: gram.y:14619 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "mauvais nombre de paramètres sur le côté droit de l'expression OVERLAPS" -#: gram.y:14778 +#: gram.y:14796 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "prédicat UNIQUE non implémenté" -#: gram.y:15156 +#: gram.y:15212 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "ne peut pas utiliser des clauses ORDER BY multiples dans WITHIN GROUP" -#: gram.y:15161 +#: gram.y:15217 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "ne peut pas utiliser DISTINCT avec WITHIN GROUP" -#: gram.y:15166 +#: gram.y:15222 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "ne peut pas utiliser VARIADIC avec WITHIN GROUP" -#: gram.y:15703 gram.y:15727 +#: gram.y:15856 gram.y:15880 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "la fin du frame ne peut pas être UNBOUNDED FOLLOWING" -#: gram.y:15708 +#: gram.y:15861 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "la frame commençant après la ligne suivante ne peut pas se terminer avec la ligne actuelle" -#: gram.y:15732 +#: gram.y:15885 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "la fin du frame ne peut pas être UNBOUNDED PRECEDING" -#: gram.y:15738 +#: gram.y:15891 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "la frame commençant à la ligne courante ne peut pas avoir des lignes précédentes" -#: gram.y:15745 +#: gram.y:15898 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "la frame commençant à la ligne suivante ne peut pas avoir des lignes précédentes" -#: gram.y:16370 +#: gram.y:16659 #, c-format msgid "type modifier cannot have parameter name" msgstr "le modificateur de type ne peut pas avoir de nom de paramètre" -#: gram.y:16376 +#: gram.y:16665 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "le modificateur de type ne peut pas avoir de clause ORDER BY" -#: gram.y:16444 gram.y:16451 gram.y:16458 +#: gram.y:16733 gram.y:16740 gram.y:16747 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s ne peut pas être utilisé comme nom de rôle ici" -#: gram.y:16548 gram.y:17983 +#: gram.y:16837 gram.y:18294 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIES ne peut pas être indiqué sans clause ORDER BY" -#: gram.y:17662 gram.y:17849 +#: gram.y:17973 gram.y:18160 msgid "improper use of \"*\"" msgstr "mauvaise utilisation de « * »" -#: gram.y:17812 gram.y:17829 tsearch/spell.c:983 tsearch/spell.c:1000 -#: tsearch/spell.c:1017 tsearch/spell.c:1034 tsearch/spell.c:1099 +#: gram.y:18123 gram.y:18140 tsearch/spell.c:963 tsearch/spell.c:980 +#: tsearch/spell.c:997 tsearch/spell.c:1014 tsearch/spell.c:1079 #, c-format msgid "syntax error" msgstr "erreur de syntaxe" -#: gram.y:17913 +#: gram.y:18224 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "un agrégat par ensemble ordonné avec un argument VARIADIC direct doit avoir un argument VARIADIC agrégé du même type de données" -#: gram.y:17950 +#: gram.y:18261 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "clauses ORDER BY multiples non autorisées" -#: gram.y:17961 +#: gram.y:18272 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "clauses OFFSET multiples non autorisées" -#: gram.y:17970 +#: gram.y:18281 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "clauses LIMIT multiples non autorisées" -#: gram.y:17979 +#: gram.y:18290 #, c-format msgid "multiple limit options not allowed" msgstr "options limite multiples non autorisées" -#: gram.y:18006 +#: gram.y:18317 #, c-format msgid "multiple WITH clauses not allowed" msgstr "clauses WITH multiples non autorisées" -#: gram.y:18199 +#: gram.y:18510 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "les arguments OUT et INOUT ne sont pas autorisés dans des fonctions TABLE" -#: gram.y:18332 +#: gram.y:18643 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "clauses COLLATE multiples non autorisées" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18370 gram.y:18383 +#: gram.y:18681 gram.y:18694 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "les contraintes %s ne peuvent pas être marquées comme DEFERRABLE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18396 +#: gram.y:18707 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "les contraintes %s ne peuvent pas être marquées comme NOT VALID" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18409 +#: gram.y:18720 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "les contraintes %s ne peuvent pas être marquées NO INHERIT" -#: gram.y:18433 +#: gram.y:18742 +#, c-format +msgid "unrecognized partitioning strategy \"%s\"" +msgstr "stratégie de partitionnement « %s » non reconnue" + +#: gram.y:18766 #, fuzzy, c-format #| msgid "invalid publication_names syntax" msgid "invalid publication object list" msgstr "syntaxe publication_names invalide" -#: gram.y:18434 +#: gram.y:18767 #, c-format msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." msgstr "" -#: gram.y:18450 +#: gram.y:18783 #, fuzzy, c-format #| msgid "invalid file name argument" -msgid "invalid table name at or near" +msgid "invalid table name" msgstr "argument du nom de fichier invalide" -#: gram.y:18471 +#: gram.y:18804 #, fuzzy, c-format #| msgid "WHERE clause not allowed with COPY TO" msgid "WHERE clause not allowed for schema" msgstr "la clause WHERE n'est pas autorisée avec COPY TO" -#: gram.y:18478 +#: gram.y:18811 #, fuzzy, c-format #| msgid "interval specification not allowed here" msgid "column specification not allowed for schema" msgstr "interval de spécification non autorisé ici" -#: gram.y:18492 +#: gram.y:18825 #, fuzzy, c-format #| msgid "invalid statement name \"%s\" on line %d" -msgid "invalid schema name at or near" +msgid "invalid schema name" msgstr "nom d'instruction « %s » invalide sur la ligne %d" -#: guc-file.l:314 -#, c-format -msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" -msgstr "paramètre de configuration « %s » non reconnu dans le fichier « %s », ligne %d" - -#: guc-file.l:353 utils/misc/guc.c:7688 utils/misc/guc.c:7908 -#: utils/misc/guc.c:8006 utils/misc/guc.c:8104 utils/misc/guc.c:8228 -#: utils/misc/guc.c:8331 -#, c-format -msgid "parameter \"%s\" cannot be changed without restarting the server" -msgstr "le paramètre « %s » ne peut pas être modifié sans redémarrer le serveur" - -#: guc-file.l:389 -#, c-format -msgid "parameter \"%s\" removed from configuration file, reset to default" -msgstr "" -"paramètre « %s » supprimé du fichier de configuration ;\n" -"réinitialisation à la valeur par défaut" - -#: guc-file.l:454 -#, c-format -msgid "parameter \"%s\" changed to \"%s\"" -msgstr "paramètre « %s » modifié par « %s »" - -#: guc-file.l:496 -#, c-format -msgid "configuration file \"%s\" contains errors" -msgstr "le fichier de configuration « %s » contient des erreurs" - -#: guc-file.l:501 -#, c-format -msgid "configuration file \"%s\" contains errors; unaffected changes were applied" -msgstr "le fichier de configuration « %s » contient des erreurs ; les modifications non affectées ont été appliquées" - -#: guc-file.l:506 -#, c-format -msgid "configuration file \"%s\" contains errors; no changes were applied" -msgstr "le fichier de configuration « %s » contient des erreurs ; aucune modification n'a été appliquée" - -#: guc-file.l:578 +#: guc-file.l:192 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "nom de fichier de configuration vide : « %s »" -#: guc-file.l:595 +#: guc-file.l:209 #, c-format msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" msgstr "" "n'a pas pu ouvrir le fichier de configuration « %s » : profondeur\n" "d'imbrication dépassé" -#: guc-file.l:615 +#: guc-file.l:229 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "le fichier de configuration « %s » contient une récursion" -#: guc-file.l:631 libpq/hba.c:2223 utils/adt/hbafuncs.c:376 +#: guc-file.l:245 #, c-format msgid "could not open configuration file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier de configuration « %s » : %m" -#: guc-file.l:642 +#: guc-file.l:256 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "ignore le fichier de configuration « %s » manquant" -#: guc-file.l:896 +#: guc-file.l:511 #, c-format msgid "syntax error in file \"%s\" line %u, near end of line" msgstr "erreur de syntaxe dans le fichier « %s », ligne %u, près de la fin de ligne" -#: guc-file.l:906 +#: guc-file.l:521 #, c-format msgid "syntax error in file \"%s\" line %u, near token \"%s\"" msgstr "erreur de syntaxe dans le fichier « %s », ligne %u, près du mot clé « %s »" -#: guc-file.l:926 +#: guc-file.l:541 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "trop d'erreurs de syntaxe trouvées, abandon du fichier « %s »" -#: guc-file.l:981 -#, c-format -msgid "empty configuration directory name: \"%s\"" -msgstr "nom de répertoire de configuration vide : « %s »" - -#: guc-file.l:1000 -#, c-format -msgid "could not open configuration directory \"%s\": %m" -msgstr "n'a pas pu ouvrir le répertoire de configuration « %s » : %m" - -#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:415 -#, c-format -msgid "could not access file \"%s\": %m" -msgstr "n'a pas pu accéder au fichier « %s » : %m" - -#: jsonpath_gram.y:529 jsonpath_scan.l:515 jsonpath_scan.l:526 -#: jsonpath_scan.l:536 jsonpath_scan.l:578 utils/adt/encode.c:482 -#: utils/adt/encode.c:547 utils/adt/jsonfuncs.c:629 utils/adt/varlena.c:335 -#: utils/adt/varlena.c:376 +#: jsonpath_gram.y:528 jsonpath_scan.l:629 jsonpath_scan.l:640 +#: jsonpath_scan.l:650 jsonpath_scan.l:701 utils/adt/encode.c:492 +#: utils/adt/encode.c:557 utils/adt/jsonfuncs.c:648 utils/adt/varlena.c:331 +#: utils/adt/varlena.c:372 #, c-format msgid "invalid input syntax for type %s" msgstr "syntaxe en entrée invalide pour le type %s" -#: jsonpath_gram.y:530 +#: jsonpath_gram.y:529 #, fuzzy, c-format #| msgid "unrecognized flag character \"%.*s\" in LIKE_REGEX predicate" msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." msgstr "caractère d'état « %.*s » non reconnu dans un prédicat LIKE_REGEX" -#: jsonpath_gram.y:584 +#: jsonpath_gram.y:559 tsearch/spell.c:749 utils/adt/regexp.c:224 +#, c-format +msgid "invalid regular expression: %s" +msgstr "expression rationnelle invalide : %s" + +#: jsonpath_gram.y:607 #, c-format msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" msgstr "le flag XQuery « x » (expression régulière étendue) n'est pas implémenté" +#: jsonpath_scan.l:174 +#, fuzzy +#| msgid "invalid Unicode escape value" +msgid "invalid Unicode escape sequence" +msgstr "valeur d'échappement Unicode invalide" + +#: jsonpath_scan.l:180 +#, fuzzy +#| msgid "invalid hexadecimal digit" +msgid "invalid hexadecimal character sequence" +msgstr "chiffre hexadécimal invalide" + +#: jsonpath_scan.l:195 +#, fuzzy +#| msgid "unexpected end of line" +msgid "unexpected end after backslash" +msgstr "fin de ligne inattendue" + +#: jsonpath_scan.l:201 repl_scanner.l:209 scan.l:741 +msgid "unterminated quoted string" +msgstr "chaîne entre guillemets non terminée" + +#: jsonpath_scan.l:228 +#, fuzzy +#| msgid "unexpected end of line" +msgid "unexpected end of comment" +msgstr "fin de ligne inattendue" + +#: jsonpath_scan.l:319 +#, fuzzy +#| msgid "numeric_literal" +msgid "invalid numeric literal" +msgstr "numeric_literal" + +#: jsonpath_scan.l:325 jsonpath_scan.l:331 jsonpath_scan.l:337 scan.l:1049 +#: scan.l:1053 scan.l:1057 scan.l:1061 scan.l:1065 scan.l:1069 scan.l:1073 +msgid "trailing junk after numeric literal" +msgstr "élément indésirable après la valeur numérique" + #. translator: %s is typically "syntax error" -#: jsonpath_scan.l:282 +#: jsonpath_scan.l:375 #, c-format msgid "%s at end of jsonpath input" msgstr "%s à la fin de l'entrée jsonpath" #. translator: first %s is typically "syntax error" -#: jsonpath_scan.l:289 +#: jsonpath_scan.l:382 #, c-format msgid "%s at or near \"%s\" of jsonpath input" msgstr "%s sur ou près de « %s » de l'entrée jsonpath" -#: jsonpath_scan.l:494 utils/adt/jsonfuncs.c:623 +#: jsonpath_scan.l:557 +#, fuzzy +#| msgid "invalid query" +msgid "invalid input" +msgstr "requête invalide" + +#: jsonpath_scan.l:583 +msgid "invalid hexadecimal digit" +msgstr "chiffre hexadécimal invalide" + +#: jsonpath_scan.l:596 utils/adt/jsonfuncs.c:636 #, c-format msgid "unsupported Unicode escape sequence" msgstr "séquence d'échappement Unicode non supportée" -#: lib/dshash.c:254 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 -#: utils/mmgr/dsa.c:805 +#: jsonpath_scan.l:614 +#, fuzzy, c-format +#| msgid "could not encode server key" +msgid "could not convert Unicode to server encoding" +msgstr "n'a pas pu encoder la clé serveur" + +#: lib/dshash.c:254 utils/mmgr/dsa.c:715 utils/mmgr/dsa.c:737 +#: utils/mmgr/dsa.c:818 #, c-format msgid "Failed on DSA request of size %zu." msgstr "Échec d'une requête DSA de taille %zu." @@ -14497,272 +14871,273 @@ msgstr "Échec d'une requête DSA de taille %zu." msgid "expected SASL response, got message type %d" msgstr "attendait une réponse SASL, a reçu le type de message %d" -#: libpq/auth-scram.c:258 +#: libpq/auth-scram.c:270 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "le client a sélectionné un mécanisme d'authentification SASL invalide" -#: libpq/auth-scram.c:279 libpq/auth-scram.c:523 libpq/auth-scram.c:534 +#: libpq/auth-scram.c:294 libpq/auth-scram.c:543 libpq/auth-scram.c:554 #, c-format msgid "invalid SCRAM secret for user \"%s\"" msgstr "secret SCRAM invalide pour l'utilisateur « %s »" -#: libpq/auth-scram.c:290 +#: libpq/auth-scram.c:305 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "L'utilisateur « %s » n'a pas de secret SCRAM valide." -#: libpq/auth-scram.c:368 libpq/auth-scram.c:373 libpq/auth-scram.c:714 -#: libpq/auth-scram.c:722 libpq/auth-scram.c:827 libpq/auth-scram.c:840 -#: libpq/auth-scram.c:850 libpq/auth-scram.c:958 libpq/auth-scram.c:965 -#: libpq/auth-scram.c:980 libpq/auth-scram.c:995 libpq/auth-scram.c:1009 -#: libpq/auth-scram.c:1027 libpq/auth-scram.c:1042 libpq/auth-scram.c:1355 -#: libpq/auth-scram.c:1363 +#: libpq/auth-scram.c:385 libpq/auth-scram.c:390 libpq/auth-scram.c:744 +#: libpq/auth-scram.c:752 libpq/auth-scram.c:857 libpq/auth-scram.c:870 +#: libpq/auth-scram.c:880 libpq/auth-scram.c:988 libpq/auth-scram.c:995 +#: libpq/auth-scram.c:1010 libpq/auth-scram.c:1025 libpq/auth-scram.c:1039 +#: libpq/auth-scram.c:1057 libpq/auth-scram.c:1072 libpq/auth-scram.c:1386 +#: libpq/auth-scram.c:1394 #, c-format msgid "malformed SCRAM message" msgstr "message SCRAM malformé" -#: libpq/auth-scram.c:369 +#: libpq/auth-scram.c:386 #, c-format msgid "The message is empty." msgstr "Le message est vide." -#: libpq/auth-scram.c:374 +#: libpq/auth-scram.c:391 #, c-format msgid "Message length does not match input length." msgstr "La longueur du message ne correspond pas à la longueur en entrée." -#: libpq/auth-scram.c:406 +#: libpq/auth-scram.c:423 #, c-format msgid "invalid SCRAM response" msgstr "réponse SCRAM invalide" -#: libpq/auth-scram.c:407 +#: libpq/auth-scram.c:424 #, c-format msgid "Nonce does not match." msgstr "Le nonce ne correspond pas." -#: libpq/auth-scram.c:483 +#: libpq/auth-scram.c:500 #, c-format msgid "could not generate random salt" msgstr "n'a pas pu générer le sel aléatoire" -#: libpq/auth-scram.c:715 +#: libpq/auth-scram.c:745 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "Attribut attendu « %c », mais « %s » trouvé." -#: libpq/auth-scram.c:723 libpq/auth-scram.c:851 +#: libpq/auth-scram.c:753 libpq/auth-scram.c:881 #, c-format msgid "Expected character \"=\" for attribute \"%c\"." msgstr "Caractère « = » attendu pour l'attribut « %c »." -#: libpq/auth-scram.c:828 +#: libpq/auth-scram.c:858 #, c-format msgid "Attribute expected, but found end of string." msgstr "Attribut attendu, mais fin de chaîne trouvée." -#: libpq/auth-scram.c:841 +#: libpq/auth-scram.c:871 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "Attribut attendu, mais caractère invalide « %s » trouvé." -#: libpq/auth-scram.c:959 libpq/auth-scram.c:981 +#: libpq/auth-scram.c:989 libpq/auth-scram.c:1011 #, c-format msgid "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not include channel binding data." msgstr "Le client a sélectionné SCRAM-SHA-256-PLUS, mais le message SCRAM n'inclut pas de données de channel-binding." -#: libpq/auth-scram.c:966 libpq/auth-scram.c:996 +#: libpq/auth-scram.c:996 libpq/auth-scram.c:1026 #, c-format msgid "Comma expected, but found character \"%s\"." msgstr "Virgule attendue, mais caractère « %s » trouvé." -#: libpq/auth-scram.c:987 +#: libpq/auth-scram.c:1017 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "Erreur de négociation de channel-binding SCRAM" -#: libpq/auth-scram.c:988 +#: libpq/auth-scram.c:1018 #, c-format msgid "The client supports SCRAM channel binding but thinks the server does not. However, this server does support channel binding." msgstr "Le client supporte le channel binding SCRAM mais pense que le serveur ne le supporte pas. Cependant, ce serveur supporte vraiment le channel-binding." -#: libpq/auth-scram.c:1010 +#: libpq/auth-scram.c:1040 #, c-format msgid "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM message includes channel binding data." msgstr "Le client a sélectionné SCRAM-SHA-256 sans channel binding, mais le message SCRAM inclue des données de channel-binding." -#: libpq/auth-scram.c:1021 +#: libpq/auth-scram.c:1051 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "type de channel-binding SCRAM « %s » non supporté" -#: libpq/auth-scram.c:1028 +#: libpq/auth-scram.c:1058 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "Drapeau du channel-binding inattendu « %s »." -#: libpq/auth-scram.c:1038 +#: libpq/auth-scram.c:1068 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "le client utilise une identité d'autorisation, mais elle n'est pas supportée" -#: libpq/auth-scram.c:1043 +#: libpq/auth-scram.c:1073 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "Attribut « %s » inattendu dans client-first-message." -#: libpq/auth-scram.c:1059 +#: libpq/auth-scram.c:1089 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "le client requiert une extension SCRAM non supportée" -#: libpq/auth-scram.c:1073 +#: libpq/auth-scram.c:1103 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "caractères non affichables dans le nonce SCRAM" -#: libpq/auth-scram.c:1203 +#: libpq/auth-scram.c:1234 #, c-format msgid "could not generate random nonce" msgstr "n'a pas pu générer le nonce aléatoire" -#: libpq/auth-scram.c:1213 +#: libpq/auth-scram.c:1244 #, c-format msgid "could not encode random nonce" msgstr "n'a pas pu chiffrer le nonce aléatoire" -#: libpq/auth-scram.c:1319 +#: libpq/auth-scram.c:1350 #, c-format msgid "SCRAM channel binding check failed" msgstr "la vérification du channel-binding SCRAM a échoué" -#: libpq/auth-scram.c:1337 +#: libpq/auth-scram.c:1368 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "attribut du lien de canal SCRAM inattendu dans client-final-message" -#: libpq/auth-scram.c:1356 +#: libpq/auth-scram.c:1387 #, c-format msgid "Malformed proof in client-final-message." msgstr "Preuve malformée dans le client-final-message." -#: libpq/auth-scram.c:1364 +#: libpq/auth-scram.c:1395 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "Problème trouvé à la fin de client-final-message." -#: libpq/auth.c:275 +#: libpq/auth.c:271 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "authentification échouée pour l'utilisateur « %s » : hôte rejeté" -#: libpq/auth.c:278 +#: libpq/auth.c:274 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "authentification « trust » échouée pour l'utilisateur « %s »" -#: libpq/auth.c:281 +#: libpq/auth.c:277 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "Échec de l'authentification Ident pour l'utilisateur « %s »" -#: libpq/auth.c:284 +#: libpq/auth.c:280 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "authentification peer échouée pour l'utilisateur « %s »" -#: libpq/auth.c:289 +#: libpq/auth.c:285 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "authentification par mot de passe échouée pour l'utilisateur « %s »" -#: libpq/auth.c:294 +#: libpq/auth.c:290 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "authentification GSSAPI échouée pour l'utilisateur « %s »" -#: libpq/auth.c:297 +#: libpq/auth.c:293 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "authentification SSPI échouée pour l'utilisateur « %s »" -#: libpq/auth.c:300 +#: libpq/auth.c:296 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "authentification PAM échouée pour l'utilisateur « %s »" -#: libpq/auth.c:303 +#: libpq/auth.c:299 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "authentification BSD échouée pour l'utilisateur « %s »" -#: libpq/auth.c:306 +#: libpq/auth.c:302 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "authentification LDAP échouée pour l'utilisateur « %s »" -#: libpq/auth.c:309 +#: libpq/auth.c:305 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "authentification par le certificat échouée pour l'utilisateur « %s »" -#: libpq/auth.c:312 +#: libpq/auth.c:308 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "authentification RADIUS échouée pour l'utilisateur « %s »" -#: libpq/auth.c:315 +#: libpq/auth.c:311 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "authentification échouée pour l'utilisateur « %s » : méthode d'authentification invalide" -#: libpq/auth.c:319 -#, c-format -msgid "Connection matched pg_hba.conf line %d: \"%s\"" +#: libpq/auth.c:315 +#, fuzzy, c-format +#| msgid "Connection matched pg_hba.conf line %d: \"%s\"" +msgid "Connection matched file \"%s\" line %d: \"%s\"" msgstr "La connexion correspond à la ligne %d du pg_hba.conf : « %s »" -#: libpq/auth.c:362 +#: libpq/auth.c:359 #, c-format msgid "authentication identifier set more than once" msgstr "identifiant d'authentification configuré plus d'une fois" -#: libpq/auth.c:363 +#: libpq/auth.c:360 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "identifiant précédent : « %s » ; nouvel identifiant : « %s »" -#: libpq/auth.c:372 +#: libpq/auth.c:370 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "connexion authentifiée : identité=\"%s\" méthode=%s (%s:%d)" -#: libpq/auth.c:411 +#: libpq/auth.c:410 #, c-format msgid "client certificates can only be checked if a root certificate store is available" msgstr "" "les certificats cert peuvent seulement être vérifiés si un emplacement de\n" "certificat racine est disponible" -#: libpq/auth.c:422 +#: libpq/auth.c:421 #, c-format msgid "connection requires a valid client certificate" msgstr "la connexion requiert un certificat client valide" -#: libpq/auth.c:453 libpq/auth.c:499 +#: libpq/auth.c:452 libpq/auth.c:498 msgid "GSS encryption" msgstr "chiffrement GSS" -#: libpq/auth.c:456 libpq/auth.c:502 +#: libpq/auth.c:455 libpq/auth.c:501 msgid "SSL encryption" msgstr "chiffrement SSL" -#: libpq/auth.c:458 libpq/auth.c:504 +#: libpq/auth.c:457 libpq/auth.c:503 msgid "no encryption" msgstr "aucun chiffrement" #. translator: last %s describes encryption state -#: libpq/auth.c:464 +#: libpq/auth.c:463 #, c-format msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" msgstr "" @@ -14770,40 +15145,40 @@ msgstr "" "utilisateur « %s », %s" #. translator: last %s describes encryption state -#: libpq/auth.c:471 +#: libpq/auth.c:470 #, c-format msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "" "pg_hba.conf rejette la connexion pour l'hôte « %s », utilisateur « %s », base\n" "de données « %s », %s" -#: libpq/auth.c:509 +#: libpq/auth.c:508 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "Adresse IP du client résolue en « %s », la recherche inverse correspond bien." -#: libpq/auth.c:512 +#: libpq/auth.c:511 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "Adresse IP du client résolue en « %s », la recherche inverse n'est pas vérifiée." -#: libpq/auth.c:515 +#: libpq/auth.c:514 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "Adresse IP du client résolue en « %s », la recherche inverse ne correspond pas." -#: libpq/auth.c:518 +#: libpq/auth.c:517 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "N'a pas pu traduire le nom d'hôte « %s » du client en adresse IP : %s." -#: libpq/auth.c:523 +#: libpq/auth.c:522 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "N'a pas pu résoudre l'adresse IP du client à partir du nom d'hôte : %s." #. translator: last %s describes encryption state -#: libpq/auth.c:531 +#: libpq/auth.c:530 #, c-format msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" msgstr "" @@ -14811,523 +15186,513 @@ msgstr "" "l'hôte « %s », utilisateur « %s », %s" #. translator: last %s describes encryption state -#: libpq/auth.c:539 +#: libpq/auth.c:538 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "" "aucune entrée dans pg_hba.conf pour l'hôte « %s », utilisateur « %s »,\n" "base de données « %s », %s" -#: libpq/auth.c:712 +#: libpq/auth.c:711 #, c-format msgid "expected password response, got message type %d" msgstr "en attente du mot de passe, a reçu un type de message %d" -#: libpq/auth.c:733 +#: libpq/auth.c:732 #, c-format msgid "invalid password packet size" msgstr "taille du paquet du mot de passe invalide" -#: libpq/auth.c:751 +#: libpq/auth.c:750 #, c-format msgid "empty password returned by client" msgstr "mot de passe vide renvoyé par le client" -#: libpq/auth.c:880 libpq/hba.c:1335 +#: libpq/auth.c:879 libpq/hba.c:1727 #, c-format msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" msgstr "l'authentification MD5 n'est pas supportée quand « db_user_namespace » est activé" -#: libpq/auth.c:886 +#: libpq/auth.c:885 #, c-format msgid "could not generate random MD5 salt" msgstr "n'a pas pu générer le sel MD5 aléatoire" -#: libpq/auth.c:935 libpq/be-secure-gssapi.c:535 +#: libpq/auth.c:936 libpq/be-secure-gssapi.c:540 #, c-format msgid "could not set environment: %m" msgstr "n'a pas pu configurer l'environnement : %m" -#: libpq/auth.c:971 +#: libpq/auth.c:975 #, c-format msgid "expected GSS response, got message type %d" msgstr "en attente d'une réponse GSS, a reçu un message de type %d" -#: libpq/auth.c:1031 +#: libpq/auth.c:1041 msgid "accepting GSS security context failed" msgstr "échec de l'acceptation du contexte de sécurité GSS" -#: libpq/auth.c:1072 +#: libpq/auth.c:1082 msgid "retrieving GSS user name failed" msgstr "échec lors de la récupération du nom de l'utilisateur avec GSS" -#: libpq/auth.c:1221 +#: libpq/auth.c:1228 msgid "could not acquire SSPI credentials" msgstr "n'a pas pu obtenir les pièces d'identité SSPI" -#: libpq/auth.c:1246 +#: libpq/auth.c:1253 #, c-format msgid "expected SSPI response, got message type %d" msgstr "en attente d'une réponse SSPI, a reçu un message de type %d" -#: libpq/auth.c:1324 +#: libpq/auth.c:1331 msgid "could not accept SSPI security context" msgstr "n'a pas pu accepter le contexte de sécurité SSPI" -#: libpq/auth.c:1386 +#: libpq/auth.c:1372 msgid "could not get token from SSPI security context" msgstr "n'a pas pu obtenir le jeton du contexte de sécurité SSPI" -#: libpq/auth.c:1525 libpq/auth.c:1544 +#: libpq/auth.c:1508 libpq/auth.c:1527 #, c-format msgid "could not translate name" msgstr "n'a pas pu traduit le nom" -#: libpq/auth.c:1557 +#: libpq/auth.c:1540 #, c-format msgid "realm name too long" msgstr "nom du royaume trop long" -#: libpq/auth.c:1572 +#: libpq/auth.c:1555 #, c-format msgid "translated account name too long" msgstr "traduction du nom de compte trop longue" -#: libpq/auth.c:1753 +#: libpq/auth.c:1734 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "n'a pas pu créer le socket pour la connexion Ident : %m" -#: libpq/auth.c:1768 +#: libpq/auth.c:1749 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "n'a pas pu se lier à l'adresse locale « %s » : %m" -#: libpq/auth.c:1780 +#: libpq/auth.c:1761 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "n'a pas pu se connecter au serveur Ident à l'adresse « %s », port %s : %m" -#: libpq/auth.c:1802 +#: libpq/auth.c:1783 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "n'a pas pu envoyer la requête au serveur Ident à l'adresse « %s », port %s : %m" -#: libpq/auth.c:1819 +#: libpq/auth.c:1800 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "" "n'a pas pu recevoir la réponse du serveur Ident à l'adresse « %s », port %s :\n" "%m" -#: libpq/auth.c:1829 +#: libpq/auth.c:1810 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "réponse mal formatée du serveur Ident : « %s »" -#: libpq/auth.c:1882 +#: libpq/auth.c:1863 #, c-format msgid "peer authentication is not supported on this platform" msgstr "la méthode d'authentification «peer n'est pas supportée sur cette plateforme" -#: libpq/auth.c:1886 +#: libpq/auth.c:1867 #, c-format msgid "could not get peer credentials: %m" msgstr "n'a pas pu obtenir l'authentification de l'autre : %m" -#: libpq/auth.c:1898 +#: libpq/auth.c:1879 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "n'a pas pu rechercher l'identifiant %ld de l'utilisateur local : %s" -#: libpq/auth.c:1999 +#: libpq/auth.c:1981 #, c-format msgid "error from underlying PAM layer: %s" msgstr "erreur provenant de la couche PAM : %s" -#: libpq/auth.c:2010 +#: libpq/auth.c:1992 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "conversation PAM %d/\"%s\" non supportée" -#: libpq/auth.c:2070 +#: libpq/auth.c:2049 #, c-format msgid "could not create PAM authenticator: %s" -msgstr "n'a pas pu créer l'authenticateur PAM : %s" +msgstr "n'a pas pu créer le processus d'authentification PAM : %s" -#: libpq/auth.c:2081 +#: libpq/auth.c:2060 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) a échoué : %s" -#: libpq/auth.c:2113 +#: libpq/auth.c:2092 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) a échoué : %s" -#: libpq/auth.c:2125 +#: libpq/auth.c:2104 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) a échoué : %s" -#: libpq/auth.c:2138 +#: libpq/auth.c:2117 #, c-format msgid "pam_authenticate failed: %s" msgstr "pam_authenticate a échoué : %s" -#: libpq/auth.c:2151 +#: libpq/auth.c:2130 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt a échoué : %s" -#: libpq/auth.c:2162 +#: libpq/auth.c:2141 #, c-format msgid "could not release PAM authenticator: %s" -msgstr "n'a pas pu fermer l'authenticateur PAM : %s" +msgstr "n'a pas pu fermer le processus d'authentification PAM : %s" -#: libpq/auth.c:2242 +#: libpq/auth.c:2221 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "n'a pas pu initialiser LDAP : code d'erreur %d" -#: libpq/auth.c:2279 +#: libpq/auth.c:2258 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "n'a pas pu extraire le nom de domaine depuis ldapbasedn" -#: libpq/auth.c:2287 +#: libpq/auth.c:2266 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "l'authentification LDAP n'a pu trouver les enregistrement DNS SRV pour « %s »" -#: libpq/auth.c:2289 +#: libpq/auth.c:2268 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Définit un nom de serveur LDAP explicitement." -#: libpq/auth.c:2341 +#: libpq/auth.c:2320 #, c-format msgid "could not initialize LDAP: %s" msgstr "n'a pas pu initialiser LDAP : %s" -#: libpq/auth.c:2351 +#: libpq/auth.c:2330 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldaps non supporté avec cette bibliothèque LDAP" -#: libpq/auth.c:2359 +#: libpq/auth.c:2338 #, c-format msgid "could not initialize LDAP: %m" msgstr "n'a pas pu initialiser LDAP : %m" -#: libpq/auth.c:2369 +#: libpq/auth.c:2348 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "n'a pas pu initialiser la version du protocole LDAP : %s" -#: libpq/auth.c:2409 -#, c-format -msgid "could not load function _ldap_start_tls_sA in wldap32.dll" -msgstr "n'a pas pu charger la fonction _ldap_start_tls_sA de wldap32.dll" - -#: libpq/auth.c:2410 -#, c-format -msgid "LDAP over SSL is not supported on this platform." -msgstr "LDAP via SSL n'est pas supporté sur cette plateforme." - -#: libpq/auth.c:2426 +#: libpq/auth.c:2364 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "n'a pas pu démarrer la session TLS LDAP : %s" -#: libpq/auth.c:2497 +#: libpq/auth.c:2441 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "serveur LDAP non précisé, et il n'y a pas de ldapbasedn" -#: libpq/auth.c:2504 +#: libpq/auth.c:2448 #, c-format msgid "LDAP server not specified" msgstr "serveur LDAP non précisé" -#: libpq/auth.c:2566 +#: libpq/auth.c:2510 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "caractère invalide dans le nom de l'utilisateur pour l'authentification LDAP" -#: libpq/auth.c:2583 +#: libpq/auth.c:2527 #, c-format msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" msgstr "n'a pas pu réaliser le lien LDAP initiale pour ldapbinddn « %s » sur le serveur « %s » : %s" -#: libpq/auth.c:2612 +#: libpq/auth.c:2557 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "n'a pas pu rechercher dans LDAP pour filtrer « %s » sur le serveur « %s » : %s" -#: libpq/auth.c:2626 +#: libpq/auth.c:2573 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "l'utilisateur LDAP « %s » n'existe pas" -#: libpq/auth.c:2627 +#: libpq/auth.c:2574 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "la recherche LDAP pour le filtre « %s » sur le serveur « %s » n'a renvoyé aucun enregistrement." -#: libpq/auth.c:2631 +#: libpq/auth.c:2578 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "l'utilisateur LDAP « %s » n'est pas unique" -#: libpq/auth.c:2632 +#: libpq/auth.c:2579 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." msgstr[0] "la recherche LDAP pour le filtre « %s » sur le serveur « %s » a renvoyé %d enregistrement." msgstr[1] "la recherche LDAP pour le filtre « %s » sur le serveur « %s » a renvoyé %d enregistrements." -#: libpq/auth.c:2652 +#: libpq/auth.c:2599 #, c-format msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "" "n'a pas pu obtenir le dn pour la première entrée correspondante « %s » sur\n" "le serveur « %s » : %s" -#: libpq/auth.c:2673 +#: libpq/auth.c:2620 #, c-format msgid "could not unbind after searching for user \"%s\" on server \"%s\"" msgstr "" "n'a pas pu exécuter le unbind après la recherche de l'utilisateur « %s »\n" "sur le serveur « %s »" -#: libpq/auth.c:2704 +#: libpq/auth.c:2651 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "échec de connexion LDAP pour l'utilisateur « %s » sur le serveur « %s » : %s" -#: libpq/auth.c:2736 +#: libpq/auth.c:2683 #, c-format msgid "LDAP diagnostics: %s" msgstr "diagnostique LDAP: %s" -#: libpq/auth.c:2774 +#: libpq/auth.c:2721 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "" "l'authentification par le certificat a échoué pour l'utilisateur « %s » :\n" "le certificat du client ne contient aucun nom d'utilisateur" -#: libpq/auth.c:2795 +#: libpq/auth.c:2742 #, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" msgstr "authentification par certificat échouée pour l'utilisateur « %s » : incapable de récupérer le DN sujet" -#: libpq/auth.c:2818 +#: libpq/auth.c:2765 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" msgstr "la validation du certificat (clientcert=verify-full) a échoué pour l'utilisateur « %s » : incohérence de DN" -#: libpq/auth.c:2823 +#: libpq/auth.c:2770 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "l'authentification par certificat (clientcert=verify-full) a échoué pour l'utilisateur « %s » : incohérence de CN" -#: libpq/auth.c:2925 +#: libpq/auth.c:2872 #, c-format msgid "RADIUS server not specified" msgstr "serveur RADIUS non précisé" -#: libpq/auth.c:2932 +#: libpq/auth.c:2879 #, c-format msgid "RADIUS secret not specified" msgstr "secret RADIUS non précisé" -#: libpq/auth.c:2946 +#: libpq/auth.c:2893 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "l'authentification RADIUS ne supporte pas les mots de passe de plus de %d caractères" -#: libpq/auth.c:3053 libpq/hba.c:1976 +#: libpq/auth.c:2995 libpq/hba.c:2369 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "n'a pas pu traduire le nom du serveur RADIUS « %s » en une adresse : %s" -#: libpq/auth.c:3067 +#: libpq/auth.c:3009 #, c-format msgid "could not generate random encryption vector" msgstr "n'a pas pu générer le vecteur de chiffrement aléatoire" -#: libpq/auth.c:3104 +#: libpq/auth.c:3046 #, fuzzy, c-format #| msgid "could not perform MD5 encryption of password" msgid "could not perform MD5 encryption of password: %s" msgstr "n'a pas pu réaliser le chiffrement MD5 du mot de passe" -#: libpq/auth.c:3131 +#: libpq/auth.c:3073 #, c-format msgid "could not create RADIUS socket: %m" msgstr "n'a pas pu créer le socket RADIUS : %m" -#: libpq/auth.c:3153 +#: libpq/auth.c:3089 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "n'a pas pu se lier à la socket RADIUS : %m" -#: libpq/auth.c:3163 +#: libpq/auth.c:3099 #, c-format msgid "could not send RADIUS packet: %m" msgstr "n'a pas pu transmettre le paquet RADIUS : %m" -#: libpq/auth.c:3197 libpq/auth.c:3223 +#: libpq/auth.c:3133 libpq/auth.c:3159 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "dépassement du délai pour la réponse du RADIUS à partir de %s" -#: libpq/auth.c:3216 +#: libpq/auth.c:3152 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "n'a pas pu vérifier le statut sur la socket RADIUS : %m" -#: libpq/auth.c:3246 +#: libpq/auth.c:3182 #, c-format msgid "could not read RADIUS response: %m" msgstr "n'a pas pu lire la réponse RADIUS : %m" -#: libpq/auth.c:3259 libpq/auth.c:3263 +#: libpq/auth.c:3190 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "la réponse RADIUS de %s a été envoyée à partir d'un mauvais port : %d" -#: libpq/auth.c:3272 +#: libpq/auth.c:3198 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "réponse RADIUS de %s trop courte : %d" -#: libpq/auth.c:3279 +#: libpq/auth.c:3205 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "la réponse RADIUS de %s a une longueur corrompue : %d (longueur réelle %d)" -#: libpq/auth.c:3287 +#: libpq/auth.c:3213 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "la réponse RADIUS de %s correspond à une demande différente : %d (devrait être %d)" -#: libpq/auth.c:3312 +#: libpq/auth.c:3238 #, fuzzy, c-format #| msgid "could not perform MD5 encryption of received packet" msgid "could not perform MD5 encryption of received packet: %s" msgstr "n'a pas pu réaliser le chiffrement MD5 du paquet reçu" -#: libpq/auth.c:3322 +#: libpq/auth.c:3248 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "la réponse RADIUS de %s a une signature MD5 invalide" -#: libpq/auth.c:3340 +#: libpq/auth.c:3266 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "la réponse RADIUS de %s a un code invalide (%d) pour l'utilisateur « %s »" -#: libpq/be-fsstubs.c:128 libpq/be-fsstubs.c:157 libpq/be-fsstubs.c:185 -#: libpq/be-fsstubs.c:211 libpq/be-fsstubs.c:236 libpq/be-fsstubs.c:274 -#: libpq/be-fsstubs.c:297 libpq/be-fsstubs.c:545 +#: libpq/be-fsstubs.c:133 libpq/be-fsstubs.c:162 libpq/be-fsstubs.c:190 +#: libpq/be-fsstubs.c:216 libpq/be-fsstubs.c:241 libpq/be-fsstubs.c:283 +#: libpq/be-fsstubs.c:306 libpq/be-fsstubs.c:560 #, c-format msgid "invalid large-object descriptor: %d" msgstr "descripteur invalide de « Large Object » : %d" -#: libpq/be-fsstubs.c:168 +#: libpq/be-fsstubs.c:173 #, c-format msgid "large object descriptor %d was not opened for reading" msgstr "le descripteur %d du « Large Object » n'a pas été ouvert pour la lecture" -#: libpq/be-fsstubs.c:192 libpq/be-fsstubs.c:552 +#: libpq/be-fsstubs.c:197 libpq/be-fsstubs.c:567 #, c-format msgid "large object descriptor %d was not opened for writing" msgstr "le descripteur %d du « Large Object » n'a pas été ouvert pour l'écriture" -#: libpq/be-fsstubs.c:219 +#: libpq/be-fsstubs.c:224 #, c-format msgid "lo_lseek result out of range for large-object descriptor %d" msgstr "résultat de lo_lseek en dehors de l'intervalle pour le descripteur de Large Object %d" -#: libpq/be-fsstubs.c:282 +#: libpq/be-fsstubs.c:291 #, c-format msgid "lo_tell result out of range for large-object descriptor %d" msgstr "résultat de lo_tell en dehors de l'intervalle pour le descripteur de Large Object %d" -#: libpq/be-fsstubs.c:424 +#: libpq/be-fsstubs.c:439 #, c-format msgid "could not open server file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier serveur « %s » : %m" -#: libpq/be-fsstubs.c:447 +#: libpq/be-fsstubs.c:462 #, c-format msgid "could not read server file \"%s\": %m" msgstr "n'a pas pu lire le fichier serveur « %s » : %m" -#: libpq/be-fsstubs.c:506 +#: libpq/be-fsstubs.c:521 #, c-format msgid "could not create server file \"%s\": %m" msgstr "n'a pas pu créer le fichier serveur « %s » : %m" -#: libpq/be-fsstubs.c:518 +#: libpq/be-fsstubs.c:533 #, c-format msgid "could not write server file \"%s\": %m" msgstr "n'a pas pu écrire le fichier serveur « %s » : %m" -#: libpq/be-fsstubs.c:758 +#: libpq/be-fsstubs.c:774 #, c-format msgid "large object read request is too large" msgstr "la demande de lecture du Large Object est trop grande" -#: libpq/be-fsstubs.c:800 utils/adt/genfile.c:262 utils/adt/genfile.c:301 -#: utils/adt/genfile.c:337 +#: libpq/be-fsstubs.c:816 utils/adt/genfile.c:262 utils/adt/genfile.c:294 +#: utils/adt/genfile.c:315 #, c-format msgid "requested length cannot be negative" msgstr "la longueur demandée ne peut pas être négative" -#: libpq/be-fsstubs.c:851 storage/large_object/inv_api.c:299 +#: libpq/be-fsstubs.c:871 storage/large_object/inv_api.c:299 #: storage/large_object/inv_api.c:311 storage/large_object/inv_api.c:508 #: storage/large_object/inv_api.c:619 storage/large_object/inv_api.c:809 #, c-format msgid "permission denied for large object %u" msgstr "droit refusé pour le Large Object %u" -#: libpq/be-secure-common.c:93 +#: libpq/be-secure-common.c:71 #, c-format msgid "could not read from command \"%s\": %m" msgstr "n'a pas pu lire à partir de la commande « %s » : %m" -#: libpq/be-secure-common.c:113 +#: libpq/be-secure-common.c:91 #, c-format msgid "command \"%s\" failed" msgstr "la commande « %s » a échoué" -#: libpq/be-secure-common.c:141 +#: libpq/be-secure-common.c:119 #, c-format msgid "could not access private key file \"%s\": %m" msgstr "n'a pas pu accéder au fichier de la clé privée « %s » : %m" -#: libpq/be-secure-common.c:151 +#: libpq/be-secure-common.c:129 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "le fichier de clé privée « %s » n'est pas un fichier" -#: libpq/be-secure-common.c:177 +#: libpq/be-secure-common.c:155 #, c-format msgid "private key file \"%s\" must be owned by the database user or root" msgstr "le fichier de clé privée « %s » doit avoir le même propriétaire que la base de donnée ou root" -#: libpq/be-secure-common.c:187 +#: libpq/be-secure-common.c:165 #, c-format msgid "private key file \"%s\" has group or world access" msgstr "" "le fichier de clé privé « %s » est accessible par le groupe et/ou par les\n" "autres" -#: libpq/be-secure-common.c:189 +#: libpq/be-secure-common.c:167 #, c-format msgid "File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root." msgstr "" @@ -15343,7 +15708,7 @@ msgstr "erreur d'empaquetage GSSAPI" msgid "outgoing GSSAPI message would not use confidentiality" msgstr "le message sortant GSSAPI n'utiliserait pas la confidentialité" -#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:622 +#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:634 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "le serveur a tenté d'envoyer un paquet GSSAPI surdimensionné (%zu > %zu)" @@ -15362,40 +15727,40 @@ msgstr "erreur de dépaquetage GSSAPI" msgid "incoming GSSAPI message did not use confidentiality" msgstr "le message entrant GSSAPI n'a pas utilisé la confidentialité" -#: libpq/be-secure-gssapi.c:570 +#: libpq/be-secure-gssapi.c:575 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %d)" msgstr "paquet GSSAPI surdimensionné envoyé par le client (%zu > %d)" -#: libpq/be-secure-gssapi.c:594 +#: libpq/be-secure-gssapi.c:600 msgid "could not accept GSSAPI security context" msgstr "n'a pas pu accepter le contexte de sécurité GSSAPI" -#: libpq/be-secure-gssapi.c:689 +#: libpq/be-secure-gssapi.c:701 msgid "GSSAPI size check error" msgstr "erreur de vérification de la taille GSSAPI" -#: libpq/be-secure-openssl.c:122 +#: libpq/be-secure-openssl.c:125 #, c-format msgid "could not create SSL context: %s" msgstr "n'a pas pu créer le contexte SSL : %s" -#: libpq/be-secure-openssl.c:148 +#: libpq/be-secure-openssl.c:151 #, c-format msgid "could not load server certificate file \"%s\": %s" msgstr "n'a pas pu charger le fichier du certificat serveur « %s » : %s" -#: libpq/be-secure-openssl.c:168 +#: libpq/be-secure-openssl.c:171 #, c-format msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" msgstr "le fichier de clé privée « %s » ne peut pas être rechargé car il nécessaire une phrase de passe" -#: libpq/be-secure-openssl.c:173 +#: libpq/be-secure-openssl.c:176 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "n'a pas pu charger le fichier de clé privée « %s » : %s" -#: libpq/be-secure-openssl.c:182 +#: libpq/be-secure-openssl.c:185 #, c-format msgid "check of private key failed: %s" msgstr "échec de la vérification de la clé privée : %s" @@ -15404,185 +15769,200 @@ msgstr "échec de la vérification de la clé privée : %s" # guc_name, # GetConfigOption(guc_name, false, false)))); #. translator: first %s is a GUC option name, second %s is its value -#: libpq/be-secure-openssl.c:195 libpq/be-secure-openssl.c:218 +#: libpq/be-secure-openssl.c:198 libpq/be-secure-openssl.c:221 #, c-format msgid "\"%s\" setting \"%s\" not supported by this build" msgstr "le paramètre %s ne supporte pas la valeur %s dans cette installation" -#: libpq/be-secure-openssl.c:205 +#: libpq/be-secure-openssl.c:208 #, c-format msgid "could not set minimum SSL protocol version" msgstr "n'a pas pu mettre en place la version minimum de protocole SSL" -#: libpq/be-secure-openssl.c:228 +#: libpq/be-secure-openssl.c:231 #, c-format msgid "could not set maximum SSL protocol version" msgstr "n'a pas pu mettre en place la version maximum de protocole SSL" -#: libpq/be-secure-openssl.c:244 +#: libpq/be-secure-openssl.c:247 #, c-format msgid "could not set SSL protocol version range" msgstr "n'a pas pu configurer l'intervalle de versions pour le protocole SSL" -#: libpq/be-secure-openssl.c:245 +#: libpq/be-secure-openssl.c:248 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "« %s » ne peut pas être supérieur à « %s »" -#: libpq/be-secure-openssl.c:282 +#: libpq/be-secure-openssl.c:285 #, c-format msgid "could not set the cipher list (no valid ciphers available)" msgstr "n'a pas pu configurer la liste des algorithmes de chiffrement (pas d'algorithmes valides disponibles)" -#: libpq/be-secure-openssl.c:302 +#: libpq/be-secure-openssl.c:305 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "n'a pas pu charger le fichier du certificat racine « %s » : %s" -#: libpq/be-secure-openssl.c:351 +#: libpq/be-secure-openssl.c:354 #, c-format msgid "could not load SSL certificate revocation list file \"%s\": %s" msgstr "n'a pas pu charger le fichier de liste de révocation des certificats SSL (« %s ») : %s" -#: libpq/be-secure-openssl.c:359 +#: libpq/be-secure-openssl.c:362 #, c-format msgid "could not load SSL certificate revocation list directory \"%s\": %s" msgstr "n'a pas pu charger le répertoire de liste de révocation des certificats SSL « %s » : %s" -#: libpq/be-secure-openssl.c:367 +#: libpq/be-secure-openssl.c:370 #, c-format msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" msgstr "n'a pas pu charger le fichier de liste de révocation des certificats SSL (« %s ») ou répertoire %s : %s" -#: libpq/be-secure-openssl.c:425 +#: libpq/be-secure-openssl.c:428 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "n'a pas pu initialiser la connexion SSL : contexte SSL non configuré" -#: libpq/be-secure-openssl.c:436 +#: libpq/be-secure-openssl.c:439 #, c-format msgid "could not initialize SSL connection: %s" msgstr "n'a pas pu initialiser la connexion SSL : %s" -#: libpq/be-secure-openssl.c:444 +#: libpq/be-secure-openssl.c:447 #, c-format msgid "could not set SSL socket: %s" msgstr "n'a pas pu créer le socket SSL : %s" -#: libpq/be-secure-openssl.c:499 +#: libpq/be-secure-openssl.c:502 #, c-format msgid "could not accept SSL connection: %m" msgstr "n'a pas pu accepter la connexion SSL : %m" -#: libpq/be-secure-openssl.c:503 libpq/be-secure-openssl.c:556 +#: libpq/be-secure-openssl.c:506 libpq/be-secure-openssl.c:561 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "n'a pas pu accepter la connexion SSL : fin de fichier détecté" -#: libpq/be-secure-openssl.c:542 +#: libpq/be-secure-openssl.c:545 #, c-format msgid "could not accept SSL connection: %s" msgstr "n'a pas pu accepter la connexion SSL : %s" -#: libpq/be-secure-openssl.c:545 +#: libpq/be-secure-openssl.c:549 #, c-format msgid "This may indicate that the client does not support any SSL protocol version between %s and %s." msgstr "Ceci pourrait indiquer que le client ne supporte pas la version du protocole SSL entre %s et %s." -#: libpq/be-secure-openssl.c:561 libpq/be-secure-openssl.c:741 -#: libpq/be-secure-openssl.c:805 +#: libpq/be-secure-openssl.c:566 libpq/be-secure-openssl.c:755 +#: libpq/be-secure-openssl.c:819 #, c-format msgid "unrecognized SSL error code: %d" msgstr "code d'erreur SSL inconnu : %d" -#: libpq/be-secure-openssl.c:607 +#: libpq/be-secure-openssl.c:612 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "le nom commun du certificat SSL contient des NULL" -#: libpq/be-secure-openssl.c:647 +#: libpq/be-secure-openssl.c:658 #, c-format msgid "SSL certificate's distinguished name contains embedded null" msgstr "le nom distingué du certificat SSL contient des NULL" -#: libpq/be-secure-openssl.c:730 libpq/be-secure-openssl.c:789 +#: libpq/be-secure-openssl.c:744 libpq/be-secure-openssl.c:803 #, c-format msgid "SSL error: %s" msgstr "erreur SSL : %s" -#: libpq/be-secure-openssl.c:971 +#: libpq/be-secure-openssl.c:985 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier de paramètres DH « %s » : %m" -#: libpq/be-secure-openssl.c:983 +#: libpq/be-secure-openssl.c:997 #, c-format msgid "could not load DH parameters file: %s" msgstr "n'a pas pu charger le fichier de paramètres DH : %s" -#: libpq/be-secure-openssl.c:993 +#: libpq/be-secure-openssl.c:1007 #, c-format msgid "invalid DH parameters: %s" msgstr "paramètres DH invalides : %s" -#: libpq/be-secure-openssl.c:1002 +#: libpq/be-secure-openssl.c:1016 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "paramètres DH invalides : p n'est pas premier" -#: libpq/be-secure-openssl.c:1011 +#: libpq/be-secure-openssl.c:1025 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "paramètres DH invalides : pas de générateur convenable ou de premier sûr" -#: libpq/be-secure-openssl.c:1172 +#: libpq/be-secure-openssl.c:1161 +#, fuzzy, c-format +#| msgid "certificate authentication failed for user \"%s\"" +msgid "Client certificate verification failed at depth %d: %s." +msgstr "authentification par le certificat échouée pour l'utilisateur « %s »" + +#: libpq/be-secure-openssl.c:1198 +#, c-format +msgid "Failed certificate data (unverified): subject \"%s\", serial number %s, issuer \"%s\"." +msgstr "" + +#: libpq/be-secure-openssl.c:1199 +msgid "unknown" +msgstr "inconnu" + +#: libpq/be-secure-openssl.c:1290 #, c-format msgid "DH: could not load DH parameters" msgstr "DH : n'a pas pu charger les paramètres DH" -#: libpq/be-secure-openssl.c:1180 +#: libpq/be-secure-openssl.c:1298 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH : n'a pas pu configurer les paramètres DH : %s" -#: libpq/be-secure-openssl.c:1207 +#: libpq/be-secure-openssl.c:1325 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH : nome de courbe non reconnu : %s" -#: libpq/be-secure-openssl.c:1216 +#: libpq/be-secure-openssl.c:1334 #, c-format msgid "ECDH: could not create key" msgstr "ECDH : n'a pas pu créer la clé" -#: libpq/be-secure-openssl.c:1244 +#: libpq/be-secure-openssl.c:1362 msgid "no SSL error reported" msgstr "aucune erreur SSL reportée" -#: libpq/be-secure-openssl.c:1248 +#: libpq/be-secure-openssl.c:1366 #, c-format msgid "SSL error code %lu" msgstr "code d'erreur SSL %lu" -#: libpq/be-secure-openssl.c:1402 +#: libpq/be-secure-openssl.c:1525 #, c-format msgid "could not create BIO" msgstr "n'a pas pu créer BIO" -#: libpq/be-secure-openssl.c:1412 +#: libpq/be-secure-openssl.c:1535 #, c-format msgid "could not get NID for ASN1_OBJECT object" msgstr "n'a pas pu obtenir un NID pour l'objet ASN1_OBJECT" -#: libpq/be-secure-openssl.c:1420 +#: libpq/be-secure-openssl.c:1543 #, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" msgstr "n'a pas pu convertir le NID %d en une structure ASN1_OBJECT" -#: libpq/be-secure.c:209 libpq/be-secure.c:305 +#: libpq/be-secure.c:207 libpq/be-secure.c:303 #, c-format msgid "terminating connection due to unexpected postmaster exit" -msgstr "arrêt des connexions suite à un arrêt inatendu du postmaster" +msgstr "arrêt des connexions suite à un arrêt inattendu du postmaster" #: libpq/crypt.c:49 #, c-format @@ -15599,471 +15979,465 @@ msgstr "L'utilisateur « %s » n'a pas de mot de passe affecté." msgid "User \"%s\" has an expired password." msgstr "L'utilisateur « %s » a un mot de passe expiré." -#: libpq/crypt.c:181 +#: libpq/crypt.c:183 #, c-format msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "L'utilisateur « %s » a un mot de passe qui ne peut pas être utilisé avec une authentification MD5." -#: libpq/crypt.c:202 libpq/crypt.c:244 libpq/crypt.c:264 +#: libpq/crypt.c:204 libpq/crypt.c:246 libpq/crypt.c:266 #, c-format msgid "Password does not match for user \"%s\"." msgstr "Le mot de passe ne correspond pas pour l'utilisateur %s." -#: libpq/crypt.c:283 +#: libpq/crypt.c:285 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "Le mot de passe de l'utilisateur « %s » est dans un format non reconnu." -#: libpq/hba.c:209 +#: libpq/hba.c:332 #, c-format -msgid "authentication file token too long, skipping: \"%s\"" -msgstr "jeton du fichier d'authentification trop long, ignore : « %s »" +msgid "invalid regular expression \"%s\": %s" +msgstr "expression rationnelle invalide « %s » : %s" -#: libpq/hba.c:381 +#: libpq/hba.c:334 libpq/hba.c:666 libpq/hba.c:1250 libpq/hba.c:1270 +#: libpq/hba.c:1293 libpq/hba.c:1306 libpq/hba.c:1359 libpq/hba.c:1387 +#: libpq/hba.c:1395 libpq/hba.c:1407 libpq/hba.c:1428 libpq/hba.c:1441 +#: libpq/hba.c:1466 libpq/hba.c:1493 libpq/hba.c:1505 libpq/hba.c:1564 +#: libpq/hba.c:1584 libpq/hba.c:1598 libpq/hba.c:1618 libpq/hba.c:1629 +#: libpq/hba.c:1644 libpq/hba.c:1663 libpq/hba.c:1679 libpq/hba.c:1691 +#: libpq/hba.c:1728 libpq/hba.c:1769 libpq/hba.c:1782 libpq/hba.c:1804 +#: libpq/hba.c:1816 libpq/hba.c:1834 libpq/hba.c:1884 libpq/hba.c:1928 +#: libpq/hba.c:1939 libpq/hba.c:1955 libpq/hba.c:1972 libpq/hba.c:1983 +#: libpq/hba.c:2002 libpq/hba.c:2018 libpq/hba.c:2034 libpq/hba.c:2093 +#: libpq/hba.c:2110 libpq/hba.c:2123 libpq/hba.c:2135 libpq/hba.c:2154 +#: libpq/hba.c:2240 libpq/hba.c:2258 libpq/hba.c:2352 libpq/hba.c:2371 +#: libpq/hba.c:2400 libpq/hba.c:2413 libpq/hba.c:2436 libpq/hba.c:2458 +#: libpq/hba.c:2472 tsearch/ts_locale.c:243 #, c-format -msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" +msgid "line %d of configuration file \"%s\"" +msgstr "ligne %d du fichier de configuration « %s »" + +#: libpq/hba.c:462 +#, fuzzy, c-format +#| msgid "skipping missing configuration file \"%s\"" +msgid "skipping missing authentication file \"%s\"" +msgstr "ignore le fichier de configuration « %s » manquant" + +#: libpq/hba.c:614 +#, fuzzy, c-format +#| msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" +msgid "could not open file \"%s\": maximum nesting depth exceeded" msgstr "" -"n'a pas pu ouvrir le fichier d'authentification secondaire « @%s » comme\n" -"« %s » : %m" +"n'a pas pu ouvrir le fichier de configuration « %s » : profondeur\n" +"d'imbrication dépassé" -#: libpq/hba.c:832 +#: libpq/hba.c:1221 #, c-format msgid "error enumerating network interfaces: %m" msgstr "erreur lors de l'énumération des interfaces réseau : %m" #. translator: the second %s is a list of auth methods -#: libpq/hba.c:859 +#: libpq/hba.c:1248 #, c-format msgid "authentication option \"%s\" is only valid for authentication methods %s" msgstr "l'option d'authentification « %s » n'est valide que pour les méthodes d'authentification « %s »" -#: libpq/hba.c:861 libpq/hba.c:881 libpq/hba.c:916 libpq/hba.c:967 -#: libpq/hba.c:981 libpq/hba.c:1005 libpq/hba.c:1013 libpq/hba.c:1025 -#: libpq/hba.c:1046 libpq/hba.c:1059 libpq/hba.c:1079 libpq/hba.c:1101 -#: libpq/hba.c:1113 libpq/hba.c:1172 libpq/hba.c:1192 libpq/hba.c:1206 -#: libpq/hba.c:1226 libpq/hba.c:1237 libpq/hba.c:1252 libpq/hba.c:1271 -#: libpq/hba.c:1287 libpq/hba.c:1299 libpq/hba.c:1336 libpq/hba.c:1377 -#: libpq/hba.c:1390 libpq/hba.c:1412 libpq/hba.c:1424 libpq/hba.c:1442 -#: libpq/hba.c:1492 libpq/hba.c:1536 libpq/hba.c:1547 libpq/hba.c:1563 -#: libpq/hba.c:1580 libpq/hba.c:1591 libpq/hba.c:1610 libpq/hba.c:1626 -#: libpq/hba.c:1642 libpq/hba.c:1700 libpq/hba.c:1717 libpq/hba.c:1730 -#: libpq/hba.c:1742 libpq/hba.c:1761 libpq/hba.c:1847 libpq/hba.c:1865 -#: libpq/hba.c:1959 libpq/hba.c:1978 libpq/hba.c:2007 libpq/hba.c:2020 -#: libpq/hba.c:2043 libpq/hba.c:2065 libpq/hba.c:2079 tsearch/ts_locale.c:232 -#, c-format -msgid "line %d of configuration file \"%s\"" -msgstr "ligne %d du fichier de configuration « %s »" - -#: libpq/hba.c:879 +#: libpq/hba.c:1268 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "la méthode d'authentification « %s » requiert un argument « %s » pour être mise en place" -#: libpq/hba.c:903 -#, c-format -msgid "missing entry in file \"%s\" at end of line %d" +#: libpq/hba.c:1292 +#, fuzzy, c-format +#| msgid "missing entry in file \"%s\" at end of line %d" +msgid "missing entry at end of line" msgstr "entrée manquante dans le fichier « %s » à la fin de la ligne %d" -#: libpq/hba.c:915 +#: libpq/hba.c:1305 #, c-format msgid "multiple values in ident field" msgstr "plusieurs valeurs dans le champ ident" -#: libpq/hba.c:965 +#: libpq/hba.c:1357 #, c-format msgid "multiple values specified for connection type" msgstr "plusieurs valeurs indiquées pour le type de connexion" -#: libpq/hba.c:966 +#: libpq/hba.c:1358 #, c-format msgid "Specify exactly one connection type per line." msgstr "Indiquez uniquement un type de connexion par ligne." -#: libpq/hba.c:980 -#, c-format -msgid "local connections are not supported by this build" -msgstr "les connexions locales ne sont pas supportées dans cette installation" - -#: libpq/hba.c:1003 +#: libpq/hba.c:1385 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "l'enregistrement hostssl ne peut pas correspondre car SSL est désactivé" -#: libpq/hba.c:1004 +#: libpq/hba.c:1386 #, c-format msgid "Set ssl = on in postgresql.conf." msgstr "Configurez ssl = on dans le postgresql.conf." -#: libpq/hba.c:1012 +#: libpq/hba.c:1394 #, c-format msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "l'enregistrement hostssl ne peut pas correspondre parce que SSL n'est pas supporté par cette installation" -#: libpq/hba.c:1024 +#: libpq/hba.c:1406 #, c-format msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" msgstr "l'enregistrement hostgssenc ne peut pas correspondre parce que GSSAPI n'est pas supporté par cette installation" -#: libpq/hba.c:1044 +#: libpq/hba.c:1426 #, c-format msgid "invalid connection type \"%s\"" msgstr "type de connexion « %s » invalide" -#: libpq/hba.c:1058 +#: libpq/hba.c:1440 #, c-format msgid "end-of-line before database specification" msgstr "fin de ligne avant la spécification de la base de données" -#: libpq/hba.c:1078 +#: libpq/hba.c:1465 #, c-format msgid "end-of-line before role specification" msgstr "fin de ligne avant la spécification du rôle" -#: libpq/hba.c:1100 +#: libpq/hba.c:1492 #, c-format msgid "end-of-line before IP address specification" msgstr "fin de ligne avant la spécification de l'adresse IP" -#: libpq/hba.c:1111 +#: libpq/hba.c:1503 #, c-format msgid "multiple values specified for host address" msgstr "plusieurs valeurs indiquées pour l'adresse hôte" -#: libpq/hba.c:1112 +#: libpq/hba.c:1504 #, c-format msgid "Specify one address range per line." msgstr "Indiquez un sous-réseau par ligne." -#: libpq/hba.c:1170 +#: libpq/hba.c:1562 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "adresse IP « %s » invalide : %s" -#: libpq/hba.c:1190 +#: libpq/hba.c:1582 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "spécifier le nom d'hôte et le masque CIDR n'est pas valide : « %s »" -#: libpq/hba.c:1204 +#: libpq/hba.c:1596 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "masque CIDR invalide dans l'adresse « %s »" -#: libpq/hba.c:1224 +#: libpq/hba.c:1616 #, c-format msgid "end-of-line before netmask specification" msgstr "fin de ligne avant la spécification du masque réseau" -#: libpq/hba.c:1225 +#: libpq/hba.c:1617 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "Indiquez un sous-réseau en notation CIDR ou donnez un masque réseau séparé." -#: libpq/hba.c:1236 +#: libpq/hba.c:1628 #, c-format msgid "multiple values specified for netmask" msgstr "plusieurs valeurs indiquées pour le masque réseau" -#: libpq/hba.c:1250 +#: libpq/hba.c:1642 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "masque IP « %s » invalide : %s" -#: libpq/hba.c:1270 +#: libpq/hba.c:1662 #, c-format msgid "IP address and mask do not match" msgstr "l'adresse IP et le masque ne correspondent pas" -#: libpq/hba.c:1286 +#: libpq/hba.c:1678 #, c-format msgid "end-of-line before authentication method" msgstr "fin de ligne avant la méthode d'authentification" -#: libpq/hba.c:1297 +#: libpq/hba.c:1689 #, c-format msgid "multiple values specified for authentication type" msgstr "plusieurs valeurs indiquées pour le type d'authentification" -#: libpq/hba.c:1298 +#: libpq/hba.c:1690 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Indiquez uniquement un type d'authentification par ligne." -#: libpq/hba.c:1375 +#: libpq/hba.c:1767 #, c-format msgid "invalid authentication method \"%s\"" msgstr "méthode d'authentification « %s » invalide" -#: libpq/hba.c:1388 +#: libpq/hba.c:1780 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "" "méthode d'authentification « %s » invalide : non supportée sur cette\n" "installation" -#: libpq/hba.c:1411 +#: libpq/hba.c:1803 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "" "l'authentification gssapi n'est pas supportée sur les connexions locales par\n" "socket" -#: libpq/hba.c:1423 +#: libpq/hba.c:1815 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "" "l'authentification peer est seulement supportée sur les connexions locales par\n" "socket" -#: libpq/hba.c:1441 +#: libpq/hba.c:1833 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "l'authentification cert est seulement supportée sur les connexions hostssl" -#: libpq/hba.c:1491 +#: libpq/hba.c:1883 #, c-format msgid "authentication option not in name=value format: %s" msgstr "l'option d'authentification n'est pas dans le format nom=valeur : %s" -#: libpq/hba.c:1535 +#: libpq/hba.c:1927 #, c-format msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" msgstr "ne peut pas utiliser ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchattribute ou ldapurl avec ldapprefix" -#: libpq/hba.c:1546 +#: libpq/hba.c:1938 #, c-format msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" msgstr "la méthode d'authentification « ldap » requiert un argument « ldapbasedn », « ldapprefix » ou « ldapsuffix » pour être mise en place" -#: libpq/hba.c:1562 +#: libpq/hba.c:1954 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "ne peut pas utiliser ldapsearchattribute avec ldapsearchfilter" -#: libpq/hba.c:1579 +#: libpq/hba.c:1971 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "la liste de serveurs RADIUS ne peut pas être vide" -#: libpq/hba.c:1590 +#: libpq/hba.c:1982 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "la liste des secrets RADIUS ne peut pas être vide" -#: libpq/hba.c:1607 +#: libpq/hba.c:1999 #, c-format msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "le nombre de secrets RADIUS (%d) doit valoir 1 ou être identique au nombre de serveurs RADIUS (%d)" -#: libpq/hba.c:1623 +#: libpq/hba.c:2015 #, c-format msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "le nombre de ports RADIUS (%d) doit valoir 1 ou être identique au nombre de serveurs RADIUS (%d)" -#: libpq/hba.c:1639 +#: libpq/hba.c:2031 #, c-format msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "le nombre d'identifiants RADIUS (%d) doit valoir 1 ou être identique au nombre de serveurs RADIUS (%d)" -#: libpq/hba.c:1690 +#: libpq/hba.c:2083 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi et cert" -#: libpq/hba.c:1699 +#: libpq/hba.c:2092 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert ne peut être configuré que pour les lignes « hostssl »" -#: libpq/hba.c:1716 +#: libpq/hba.c:2109 #, c-format msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "clientcert accepte seulement « verify-full » lors de l'utilisation de l'authentification « cert »" -#: libpq/hba.c:1729 +#: libpq/hba.c:2122 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "valeur invalide pour clientcert : « %s »" -#: libpq/hba.c:1741 +#: libpq/hba.c:2134 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "clientname peut seulement être configuré pour les lignes « hostssl »" -#: libpq/hba.c:1760 +#: libpq/hba.c:2153 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "valeur invalide pour clientname : « %s »" -#: libpq/hba.c:1793 +#: libpq/hba.c:2186 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "n'a pas pu analyser l'URL LDAP « %s » : %s" -#: libpq/hba.c:1804 +#: libpq/hba.c:2197 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "méthode URL LDAP non supporté : %s" -#: libpq/hba.c:1828 +#: libpq/hba.c:2221 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "URLs LDAP non supportées sur cette plateforme" -#: libpq/hba.c:1846 +#: libpq/hba.c:2239 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "valeur ldapscheme invalide : « %s »" -#: libpq/hba.c:1864 +#: libpq/hba.c:2257 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "numéro de port LDAP invalide : « %s »" -#: libpq/hba.c:1910 libpq/hba.c:1917 +#: libpq/hba.c:2303 libpq/hba.c:2310 msgid "gssapi and sspi" msgstr "gssapi et sspi" -#: libpq/hba.c:1926 libpq/hba.c:1935 +#: libpq/hba.c:2319 libpq/hba.c:2328 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1957 +#: libpq/hba.c:2350 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "n'a pas pu analyser la liste de serveurs RADIUS « %s »" -#: libpq/hba.c:2005 +#: libpq/hba.c:2398 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "n'a pas pu analyser la liste de ports RADIUS « %s »" -#: libpq/hba.c:2019 +#: libpq/hba.c:2412 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "numéro de port RADIUS invalide : « %s »" -#: libpq/hba.c:2041 +#: libpq/hba.c:2434 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "n'a pas pu analyser la liste de secrets RADIUS « %s »" -#: libpq/hba.c:2063 +#: libpq/hba.c:2456 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "n'a pas pu analyser la liste des identifieurs RADIUS « %s »" -#: libpq/hba.c:2077 +#: libpq/hba.c:2470 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "nom d'option de l'authentification inconnu : « %s »" -#: libpq/hba.c:2274 +#: libpq/hba.c:2662 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "le fichier de configuration « %s » ne contient aucun enregistrement" -#: libpq/hba.c:2374 -#, c-format -msgid "invalid regular expression \"%s\": %s" -msgstr "expression rationnelle invalide « %s » : %s" - -#: libpq/hba.c:2437 +#: libpq/hba.c:2815 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "la correspondance de l'expression rationnelle pour « %s » a échoué : %s" -#: libpq/hba.c:2456 +#: libpq/hba.c:2839 #, c-format msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" msgstr "" "l'expression rationnelle « %s » n'a pas de sous-expressions comme celle\n" "demandée par la référence dans « %s »" -#: libpq/hba.c:2552 +#: libpq/hba.c:2942 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "" "le nom d'utilisateur (%s) et le nom d'utilisateur authentifié (%s) fournis ne\n" "correspondent pas" -#: libpq/hba.c:2572 +#: libpq/hba.c:2962 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "" "pas de correspondance dans la usermap « %s » pour l'utilisateur « %s »\n" "authentifié en tant que « %s »" -#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 -#, c-format -msgid "could not open usermap file \"%s\": %m" -msgstr "n'a pas pu ouvrir le fichier usermap « %s » : %m" - -#: libpq/pqcomm.c:204 +#: libpq/pqcomm.c:200 #, c-format msgid "could not set socket to nonblocking mode: %m" msgstr "n'a pas pu activer le mode non-bloquant pour la socket : %m" -#: libpq/pqcomm.c:362 +#: libpq/pqcomm.c:361 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "Le chemin du socket de domaine Unix, « %s », est trop (maximum %d octets)" -#: libpq/pqcomm.c:383 +#: libpq/pqcomm.c:381 #, c-format msgid "could not translate host name \"%s\", service \"%s\" to address: %s" msgstr "n'a pas pu résoudre le nom de l'hôte « %s », service « %s » par l'adresse : %s" -#: libpq/pqcomm.c:387 +#: libpq/pqcomm.c:385 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "n'a pas pu résoudre le service « %s » par l'adresse : %s" -#: libpq/pqcomm.c:414 +#: libpq/pqcomm.c:412 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "n'a pas pu se lier à toutes les adresses requises : MAXLISTEN (%d) dépassé" -#: libpq/pqcomm.c:423 +#: libpq/pqcomm.c:421 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:427 +#: libpq/pqcomm.c:424 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:432 +#: libpq/pqcomm.c:427 msgid "Unix" msgstr "Unix" -#: libpq/pqcomm.c:437 +#: libpq/pqcomm.c:431 #, c-format msgid "unrecognized address family %d" msgstr "famille d'adresse %d non reconnue" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:463 +#: libpq/pqcomm.c:455 #, c-format msgid "could not create %s socket for address \"%s\": %m" msgstr "n'a pas pu créer le socket %s pour l'adresse « %s » : %m" #. translator: third %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:489 libpq/pqcomm.c:507 +#: libpq/pqcomm.c:481 libpq/pqcomm.c:499 #, c-format msgid "%s(%s) failed for %s address \"%s\": %m" msgstr "%s(%s) a échoué pour %s, adresse « %s » : %m" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:530 +#: libpq/pqcomm.c:522 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "n'a pas pu lier %s à l'adresse « %s » : %m" -#: libpq/pqcomm.c:534 +#: libpq/pqcomm.c:526 #, c-format msgid "Is another postmaster already running on port %d?" msgstr "Un autre postmaster fonctionne-t'il déjà sur le port %d ?" -#: libpq/pqcomm.c:536 +#: libpq/pqcomm.c:528 #, c-format msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." msgstr "" @@ -16071,86 +16445,86 @@ msgstr "" "Sinon, attendez quelques secondes et réessayez." #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:569 +#: libpq/pqcomm.c:557 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "n'a pas pu écouter sur « %s », adresse « %s » : %m" -#: libpq/pqcomm.c:578 +#: libpq/pqcomm.c:565 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "écoute sur la socket Unix « %s »" #. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:584 +#: libpq/pqcomm.c:570 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "en écoute sur %s, adresse « %s », port %d" -#: libpq/pqcomm.c:675 +#: libpq/pqcomm.c:659 #, c-format msgid "group \"%s\" does not exist" msgstr "le groupe « %s » n'existe pas" -#: libpq/pqcomm.c:685 +#: libpq/pqcomm.c:669 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "n'a pas pu initialiser le groupe du fichier « %s » : %m" -#: libpq/pqcomm.c:696 +#: libpq/pqcomm.c:680 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "n'a pas pu initialiser les droits du fichier « %s » : %m" -#: libpq/pqcomm.c:726 +#: libpq/pqcomm.c:708 #, c-format msgid "could not accept new connection: %m" msgstr "n'a pas pu accepter la nouvelle connexion : %m" -#: libpq/pqcomm.c:766 libpq/pqcomm.c:775 libpq/pqcomm.c:807 libpq/pqcomm.c:817 -#: libpq/pqcomm.c:1642 libpq/pqcomm.c:1687 libpq/pqcomm.c:1727 -#: libpq/pqcomm.c:1771 libpq/pqcomm.c:1810 libpq/pqcomm.c:1849 -#: libpq/pqcomm.c:1885 libpq/pqcomm.c:1924 +#: libpq/pqcomm.c:748 libpq/pqcomm.c:757 libpq/pqcomm.c:789 libpq/pqcomm.c:799 +#: libpq/pqcomm.c:1624 libpq/pqcomm.c:1669 libpq/pqcomm.c:1709 +#: libpq/pqcomm.c:1753 libpq/pqcomm.c:1792 libpq/pqcomm.c:1831 +#: libpq/pqcomm.c:1867 libpq/pqcomm.c:1906 #, c-format msgid "%s(%s) failed: %m" msgstr "échec de %s(%s) : %m" -#: libpq/pqcomm.c:921 +#: libpq/pqcomm.c:903 #, c-format msgid "there is no client connection" msgstr "il n'y a pas de connexion client" -#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 +#: libpq/pqcomm.c:954 libpq/pqcomm.c:1050 #, c-format msgid "could not receive data from client: %m" msgstr "n'a pas pu recevoir les données du client : %m" -#: libpq/pqcomm.c:1173 tcop/postgres.c:4371 +#: libpq/pqcomm.c:1155 tcop/postgres.c:4405 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "arrêt de la connexion à cause d'une perte de synchronisation du protocole" -#: libpq/pqcomm.c:1239 +#: libpq/pqcomm.c:1221 #, c-format msgid "unexpected EOF within message length word" msgstr "fin de fichier (EOF) inattendue à l'intérieur de la longueur du message" -#: libpq/pqcomm.c:1249 +#: libpq/pqcomm.c:1231 #, c-format msgid "invalid message length" msgstr "longueur du message invalide" -#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 +#: libpq/pqcomm.c:1253 libpq/pqcomm.c:1266 #, c-format msgid "incomplete message from client" msgstr "message incomplet du client" -#: libpq/pqcomm.c:1395 +#: libpq/pqcomm.c:1377 #, c-format msgid "could not send data to client: %m" msgstr "n'a pas pu envoyer les données au client : %m" -#: libpq/pqcomm.c:1610 +#: libpq/pqcomm.c:1592 #, c-format msgid "%s(%s) failed: error code %d" msgstr "échec de %s(%s) : code d'erreur %d" @@ -16158,43 +16532,44 @@ msgstr "échec de %s(%s) : code d'erreur %d" # /* # * Check for old recovery API file: recovery.conf # */ -#: libpq/pqcomm.c:1699 +#: libpq/pqcomm.c:1681 #, c-format msgid "setting the keepalive idle time is not supported" msgstr "configurer le temps d'attente du keepalive n'est pas supporté" -#: libpq/pqcomm.c:1783 libpq/pqcomm.c:1858 libpq/pqcomm.c:1933 +#: libpq/pqcomm.c:1765 libpq/pqcomm.c:1840 libpq/pqcomm.c:1915 #, c-format msgid "%s(%s) not supported" msgstr "%s(%s) non supporté" -#: libpq/pqformat.c:406 +#: libpq/pqformat.c:407 #, c-format msgid "no data left in message" msgstr "pas de données dans le message" -#: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 -#: utils/adt/arrayfuncs.c:1482 utils/adt/rowtypes.c:588 +#: libpq/pqformat.c:518 libpq/pqformat.c:536 libpq/pqformat.c:557 +#: utils/adt/array_userfuncs.c:799 utils/adt/arrayfuncs.c:1506 +#: utils/adt/rowtypes.c:615 #, c-format msgid "insufficient data left in message" msgstr "données insuffisantes laissées dans le message" -#: libpq/pqformat.c:597 libpq/pqformat.c:626 +#: libpq/pqformat.c:598 libpq/pqformat.c:627 #, c-format msgid "invalid string in message" msgstr "chaîne invalide dans le message" -#: libpq/pqformat.c:642 +#: libpq/pqformat.c:643 #, c-format msgid "invalid message format" msgstr "format du message invalide" -#: main/main.c:239 +#: main/main.c:235 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s : WSAStartup a échoué : %d\n" -#: main/main.c:350 +#: main/main.c:329 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -16203,7 +16578,7 @@ msgstr "" "%s est le serveur PostgreSQL.\n" "\n" -#: main/main.c:351 +#: main/main.c:330 #, c-format msgid "" "Usage:\n" @@ -16214,107 +16589,108 @@ msgstr "" " %s [OPTION]...\n" "\n" -#: main/main.c:352 +#: main/main.c:331 #, c-format msgid "Options:\n" msgstr "Options :\n" -#: main/main.c:353 +#: main/main.c:332 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS nombre de blocs dans le cache disque de PostgreSQL\n" -#: main/main.c:354 +#: main/main.c:333 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NOM=VALEUR configure un paramètre d'exécution\n" -#: main/main.c:355 +#: main/main.c:334 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C NOM affiche la valeur d'un paramètre en exécution, puis quitte\n" -#: main/main.c:356 +#: main/main.c:335 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 niveau de débogage\n" -#: main/main.c:357 +#: main/main.c:336 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D RÉP_DONNÉES répertoire de la base de données\n" -#: main/main.c:358 +#: main/main.c:337 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e utilise le format européen de saisie des dates (DMY)\n" -#: main/main.c:359 +#: main/main.c:338 #, c-format msgid " -F turn fsync off\n" msgstr " -F désactive fsync\n" -#: main/main.c:360 +#: main/main.c:339 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h HÔTE nom d'hôte ou adresse IP à écouter\n" -#: main/main.c:361 -#, c-format -msgid " -i enable TCP/IP connections\n" +#: main/main.c:340 +#, fuzzy, c-format +#| msgid " -i enable TCP/IP connections\n" +msgid " -i enable TCP/IP connections (deprecated)\n" msgstr " -i active les connexions TCP/IP\n" -#: main/main.c:362 +#: main/main.c:341 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k RÉPERTOIRE emplacement des sockets de domaine Unix\n" -#: main/main.c:364 +#: main/main.c:343 #, c-format msgid " -l enable SSL connections\n" msgstr " -l active les connexions SSL\n" -#: main/main.c:366 +#: main/main.c:345 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N MAX-CONNECT nombre maximum de connexions simultanées\n" -#: main/main.c:367 +#: main/main.c:346 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT numéro du port à écouter\n" -#: main/main.c:368 +#: main/main.c:347 #, c-format msgid " -s show statistics after each query\n" msgstr " -s affiche les statistiques après chaque requête\n" -#: main/main.c:369 +#: main/main.c:348 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S WORK-MEM configure la mémoire pour les tris (en ko)\n" -#: main/main.c:370 +#: main/main.c:349 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version et quitte\n" -#: main/main.c:371 +#: main/main.c:350 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NOM=VALEUR configure un paramètre d'exécution\n" -#: main/main.c:372 +#: main/main.c:351 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config décrit les paramètres de configuration, puis quitte\n" -#: main/main.c:373 +#: main/main.c:352 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide et quitte\n" -#: main/main.c:375 +#: main/main.c:354 #, c-format msgid "" "\n" @@ -16323,49 +16699,43 @@ msgstr "" "\n" "Options pour le développeur :\n" -#: main/main.c:376 -#, fuzzy, c-format +#: main/main.c:355 +#, c-format #| msgid " -f s|i|n|m|h forbid use of some plan types\n" msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" -msgstr " -f s|i|n|m|h interdit l'utilisation de certains types de plan\n" +msgstr " -f s|i|o|b|t|n|m|h interdit l'utilisation de certains types de plan\n" -#: main/main.c:377 -#, c-format -msgid " -n do not reinitialize shared memory after abnormal exit\n" -msgstr "" -" -n ne réinitialise pas la mémoire partagée après un arrêt\n" -" brutal\n" - -#: main/main.c:378 +#: main/main.c:356 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O autorise les modifications de structure des tables systèmes\n" -#: main/main.c:379 +#: main/main.c:357 #, c-format msgid " -P disable system indexes\n" msgstr " -P désactive les index systèmes\n" -#: main/main.c:380 +#: main/main.c:358 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex affiche les horodatages pour chaque requête\n" -#: main/main.c:381 -#, c-format -msgid " -T send SIGSTOP to all backend processes if one dies\n" +#: main/main.c:359 +#, fuzzy, c-format +#| msgid " -T send SIGSTOP to all backend processes if one dies\n" +msgid " -T send SIGABRT to all backend processes if one dies\n" msgstr "" " -T envoie SIGSTOP à tous les processus serveur si l'un d'entre\n" " eux meurt\n" -#: main/main.c:382 +#: main/main.c:360 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr "" " -W NUM attends NUM secondes pour permettre l'attache d'un\n" " débogueur\n" -#: main/main.c:384 +#: main/main.c:362 #, c-format msgid "" "\n" @@ -16374,41 +16744,41 @@ msgstr "" "\n" "Options pour le mode mono-utilisateur :\n" -#: main/main.c:385 +#: main/main.c:363 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr "" " --single sélectionne le mode mono-utilisateur (doit être le premier\n" " argument)\n" -#: main/main.c:386 +#: main/main.c:364 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " BASE nom de la base (par défaut, le même que l'utilisateur)\n" -#: main/main.c:387 +#: main/main.c:365 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 surcharge le niveau de débogage\n" -#: main/main.c:388 +#: main/main.c:366 #, c-format msgid " -E echo statement before execution\n" msgstr " -E affiche la requête avant de l'exécuter\n" -#: main/main.c:389 +#: main/main.c:367 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr "" " -j n'utilise pas le retour à la ligne comme délimiteur de\n" " requête\n" -#: main/main.c:390 main/main.c:396 +#: main/main.c:368 main/main.c:374 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r FICHIER envoie stdout et stderr dans le fichier indiqué\n" -#: main/main.c:392 +#: main/main.c:370 #, c-format msgid "" "\n" @@ -16417,14 +16787,14 @@ msgstr "" "\n" "Options pour le mode « bootstrapping » :\n" -#: main/main.c:393 +#: main/main.c:371 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr "" " --boot sélectionne le mode « bootstrapping » (doit être le premier\n" " argument)\n" -#: main/main.c:394 +#: main/main.c:372 #, fuzzy, c-format #| msgid " --single selects single-user mode (must be first argument)\n" msgid " --check selects check mode (must be first argument)\n" @@ -16432,14 +16802,14 @@ msgstr "" " --single sélectionne le mode mono-utilisateur (doit être le premier\n" " argument)\n" -#: main/main.c:395 +#: main/main.c:373 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr "" " BASE nom de la base (argument obligatoire dans le mode\n" " « bootstrapping »)\n" -#: main/main.c:398 +#: main/main.c:376 #, c-format msgid "" "\n" @@ -16456,12 +16826,12 @@ msgstr "" "\n" "Rapportez les bogues à <%s>.\n" -#: main/main.c:402 +#: main/main.c:380 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" -#: main/main.c:413 +#: main/main.c:391 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -16474,12 +16844,12 @@ msgstr "" "tout problème possible de sécurité sur le serveur. Voir la documentation pour\n" "plus d'informations sur le lancement propre du serveur.\n" -#: main/main.c:430 +#: main/main.c:408 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s : les identifiants réel et effectif de l'utilisateur doivent correspondre\n" -#: main/main.c:437 +#: main/main.c:415 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -16503,15 +16873,21 @@ msgstr "le type de nÅ“ud extensible « %s » existe déjà" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods \"%s\" n'a pas été enregistré" -#: nodes/makefuncs.c:150 statistics/extended_stats.c:2336 +#: nodes/makefuncs.c:153 statistics/extended_stats.c:2335 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "la relation « %s » n'a pas un type composite" -#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2567 +#: nodes/makefuncs.c:879 +#, fuzzy, c-format +#| msgid "unrecognized encoding: \"%s\"" +msgid "unrecognized JSON encoding: %s" +msgstr "encodage non reconnu : « %s »" + +#: nodes/nodeFuncs.c:116 nodes/nodeFuncs.c:147 parser/parse_coerce.c:2567 #: parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 -#: parser/parse_expr.c:2023 parser/parse_func.c:710 parser/parse_oper.c:883 -#: utils/fmgr/funcapi.c:670 +#: parser/parse_expr.c:2049 parser/parse_func.c:710 parser/parse_oper.c:883 +#: utils/fmgr/funcapi.c:661 #, c-format msgid "could not find array type for data type %s" msgstr "n'a pas pu trouver de type tableau pour le type de données %s" @@ -16526,14 +16902,14 @@ msgstr "portail « %s » avec les paramètres : %s" msgid "unnamed portal with parameters: %s" msgstr "portail non nommé avec les paramètres : « %s »" -#: optimizer/path/joinrels.c:855 +#: optimizer/path/joinrels.c:973 #, c-format msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "" "FULL JOIN est supporté seulement avec les conditions de jointures MERGE et de\n" "jointures HASH JOIN" -#: optimizer/plan/createplan.c:7101 parser/parse_merge.c:182 +#: optimizer/plan/createplan.c:7111 parser/parse_merge.c:182 #: parser/parse_merge.c:189 #, fuzzy, c-format #| msgid "cannot change relation \"%s\"" @@ -16541,126 +16917,120 @@ msgid "cannot execute MERGE on relation \"%s\"" msgstr "ne peut pas modifier la relation « %s »" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1192 +#: optimizer/plan/initsplan.c:1408 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s ne peut être appliqué sur le côté possiblement NULL d'une jointure externe" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1344 parser/analyze.c:1714 parser/analyze.c:1970 -#: parser/analyze.c:3152 +#: optimizer/plan/planner.c:1361 parser/analyze.c:1761 parser/analyze.c:2018 +#: parser/analyze.c:3231 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s n'est pas autorisé avec UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:2051 optimizer/plan/planner.c:3707 +#: optimizer/plan/planner.c:2076 optimizer/plan/planner.c:4035 #, c-format msgid "could not implement GROUP BY" msgstr "n'a pas pu implanter GROUP BY" -#: optimizer/plan/planner.c:2052 optimizer/plan/planner.c:3708 -#: optimizer/plan/planner.c:4351 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:2077 optimizer/plan/planner.c:4036 +#: optimizer/plan/planner.c:4676 optimizer/prep/prepunion.c:1053 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "" "Certains des types de données supportent seulement le hachage,\n" "alors que les autres supportent seulement le tri." -#: optimizer/plan/planner.c:4350 +#: optimizer/plan/planner.c:4675 #, c-format msgid "could not implement DISTINCT" msgstr "n'a pas pu implanter DISTINCT" -#: optimizer/plan/planner.c:5471 +#: optimizer/plan/planner.c:6014 #, c-format msgid "could not implement window PARTITION BY" msgstr "n'a pas pu implanter PARTITION BY de window" -#: optimizer/plan/planner.c:5472 +#: optimizer/plan/planner.c:6015 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "" "Les colonnes de partitionnement de window doivent être d'un type de données\n" "triables." -#: optimizer/plan/planner.c:5476 +#: optimizer/plan/planner.c:6019 #, c-format msgid "could not implement window ORDER BY" msgstr "n'a pas pu implanter ORDER BY dans le window" -#: optimizer/plan/planner.c:5477 +#: optimizer/plan/planner.c:6020 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Les colonnes de tri de la window doivent être d'un type de données triable." -#: optimizer/prep/prepunion.c:509 +#: optimizer/prep/prepunion.c:516 #, c-format msgid "could not implement recursive UNION" msgstr "n'a pas pu implanter le UNION récursif" -#: optimizer/prep/prepunion.c:510 +#: optimizer/prep/prepunion.c:517 #, c-format msgid "All column datatypes must be hashable." msgstr "Tous les types de données des colonnes doivent être hachables." #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1045 +#: optimizer/prep/prepunion.c:1052 #, c-format msgid "could not implement %s" msgstr "n'a pas pu implanter %s" -#: optimizer/util/clauses.c:4777 +#: optimizer/util/clauses.c:4856 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "fonction SQL « %s » durant « inlining »" -#: optimizer/util/plancat.c:142 -#, fuzzy, c-format -#| msgid "cannot change relation \"%s\"" -msgid "cannot open relation \"%s\"" -msgstr "ne peut pas modifier la relation « %s »" - -#: optimizer/util/plancat.c:151 +#: optimizer/util/plancat.c:154 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "ne peut pas accéder à des tables temporaires et non tracées lors de la restauration" -#: optimizer/util/plancat.c:691 +#: optimizer/util/plancat.c:726 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "les spécifications d'inférence d'index unique pour une ligne entière ne sont pas supportées" -#: optimizer/util/plancat.c:708 +#: optimizer/util/plancat.c:743 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "la contrainte de la clause ON CONFLICT n'a pas d'index associé" -#: optimizer/util/plancat.c:758 +#: optimizer/util/plancat.c:793 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE non supporté avec les contraintes d'exclusion" -#: optimizer/util/plancat.c:863 +#: optimizer/util/plancat.c:898 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "il n'existe aucune contrainte unique ou contrainte d'exclusion correspondant à la spécification ON CONFLICT" -#: parser/analyze.c:780 parser/analyze.c:1494 +#: parser/analyze.c:826 parser/analyze.c:1540 #, c-format msgid "VALUES lists must all be the same length" msgstr "les listes VALUES doivent être toutes de la même longueur" -#: parser/analyze.c:981 +#: parser/analyze.c:1028 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT a plus d'expressions que les colonnes cibles" -#: parser/analyze.c:999 +#: parser/analyze.c:1046 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT a plus de colonnes cibles que d'expressions" -#: parser/analyze.c:1003 +#: parser/analyze.c:1050 #, c-format msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" msgstr "" @@ -16668,416 +17038,416 @@ msgstr "" "de colonnes que celui attendu par INSERT. Auriez-vous utilisé des parenthèses\n" "supplémentaires ?" -#: parser/analyze.c:1302 parser/analyze.c:1687 +#: parser/analyze.c:1347 parser/analyze.c:1734 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO n'est pas autorisé ici" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1617 parser/analyze.c:3363 +#: parser/analyze.c:1663 parser/analyze.c:3463 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s ne peut pas être appliqué à VALUES" -#: parser/analyze.c:1853 +#: parser/analyze.c:1900 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "clause UNION/INTERSECT/EXCEPT ORDER BY invalide" -#: parser/analyze.c:1854 +#: parser/analyze.c:1901 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "" "Seuls les noms de colonnes résultats peuvent être utilisés, pas les\n" "expressions et les fonctions." -#: parser/analyze.c:1855 +#: parser/analyze.c:1902 #, c-format msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." msgstr "Ajouter l'expression/fonction à chaque SELECT, ou déplacer l'UNION dans une clause FROM." -#: parser/analyze.c:1960 +#: parser/analyze.c:2008 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO est autorisé uniquement sur le premier SELECT d'un UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:2032 +#: parser/analyze.c:2080 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "" "L'instruction membre UNION/INTERSECT/EXCEPT ne peut pas faire référence à\n" "d'autres relations que celles de la requête de même niveau" -#: parser/analyze.c:2119 +#: parser/analyze.c:2167 #, c-format msgid "each %s query must have the same number of columns" msgstr "chaque requête %s doit avoir le même nombre de colonnes" -#: parser/analyze.c:2523 +#: parser/analyze.c:2573 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING doit avoir au moins une colonne" -#: parser/analyze.c:2626 +#: parser/analyze.c:2676 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" msgstr[0] "la source d'affectation a renvoyé %d colonne" msgstr[1] "la source d'affectation a renvoyé %d colonnes" -#: parser/analyze.c:2687 +#: parser/analyze.c:2737 #, c-format msgid "variable \"%s\" is of type %s but expression is of type %s" msgstr "la variable « %s » est de type %s mais l'expression est de type %s" #. translator: %s is a SQL keyword -#: parser/analyze.c:2811 parser/analyze.c:2819 +#: parser/analyze.c:2862 parser/analyze.c:2870 #, c-format msgid "cannot specify both %s and %s" msgstr "ne peut pas spécifier à la fois %s et %s" -#: parser/analyze.c:2839 +#: parser/analyze.c:2890 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR ne doit pas contenir des instructions de modification de données dans WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2847 +#: parser/analyze.c:2898 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s n'est pas supporté" -#: parser/analyze.c:2850 +#: parser/analyze.c:2901 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "Les curseurs détenables doivent être en lecture seule (READ ONLY)." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2858 +#: parser/analyze.c:2909 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s n'est pas supporté" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2869 +#: parser/analyze.c:2920 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s n'est pas valide" -#: parser/analyze.c:2872 +#: parser/analyze.c:2923 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Les curseurs insensibles doivent être en lecture seule (READ ONLY)." -#: parser/analyze.c:2938 +#: parser/analyze.c:3017 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "les vues matérialisées ne peuvent pas contenir d'instructions de modifications de données avec WITH" -#: parser/analyze.c:2948 +#: parser/analyze.c:3027 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "les vues matérialisées ne doivent pas utiliser de tables temporaires ou de vues" -#: parser/analyze.c:2958 +#: parser/analyze.c:3037 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "les vues matérialisées ne peuvent pas être définies en utilisant des paramètres liés" -#: parser/analyze.c:2970 +#: parser/analyze.c:3049 #, c-format msgid "materialized views cannot be unlogged" msgstr "les vues matérialisées ne peuvent pas être non journalisées (UNLOGGED)" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3159 +#: parser/analyze.c:3238 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s n'est pas autorisé avec la clause DISTINCT" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3166 +#: parser/analyze.c:3245 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s n'est pas autorisé avec la clause GROUP BY" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3173 +#: parser/analyze.c:3252 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s n'est pas autorisé avec la clause HAVING" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3180 +#: parser/analyze.c:3259 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s n'est pas autorisé avec les fonctions d'agrégat" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3187 +#: parser/analyze.c:3266 #, c-format msgid "%s is not allowed with window functions" msgstr "%s n'est pas autorisé avec les fonctions de fenêtrage" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3194 +#: parser/analyze.c:3273 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "%s n'est pas autorisé avec les fonctions renvoyant plusieurs lignes dans la liste cible" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3286 +#: parser/analyze.c:3372 #, c-format msgid "%s must specify unqualified relation names" msgstr "%s doit indiquer les noms de relation non qualifiés" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3336 +#: parser/analyze.c:3436 #, c-format msgid "%s cannot be applied to a join" msgstr "%s ne peut pas être appliqué à une jointure" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3345 +#: parser/analyze.c:3445 #, c-format msgid "%s cannot be applied to a function" msgstr "%s ne peut pas être appliqué à une fonction" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3354 +#: parser/analyze.c:3454 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s ne peut pas être appliqué à une fonction de table" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3372 +#: parser/analyze.c:3472 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s ne peut pas être appliqué à une requête WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3381 +#: parser/analyze.c:3481 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s ne peut pas être appliqué à une tuplestore nommé" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3401 +#: parser/analyze.c:3501 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "relation « %s » dans une clause %s introuvable dans la clause FROM" -#: parser/parse_agg.c:220 parser/parse_oper.c:227 +#: parser/parse_agg.c:221 parser/parse_oper.c:227 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "n'a pas pu identifier un opérateur de tri pour le type %s" -#: parser/parse_agg.c:222 +#: parser/parse_agg.c:223 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "Les agrégats avec DISTINCT doivent être capables de trier leur entrée." -#: parser/parse_agg.c:257 +#: parser/parse_agg.c:258 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "GROUPING doit avoir moins de 32 arguments" -#: parser/parse_agg.c:360 +#: parser/parse_agg.c:361 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les conditions de jointures" -#: parser/parse_agg.c:362 +#: parser/parse_agg.c:363 msgid "grouping operations are not allowed in JOIN conditions" msgstr "les fonctions de regroupement ne sont pas autorisés dans les conditions de jointure" -#: parser/parse_agg.c:374 +#: parser/parse_agg.c:375 msgid "aggregate functions are not allowed in FROM clause of their own query level" msgstr "les fonctions d'agrégat ne sont pas autorisées dans la clause FROM de leur propre niveau de requête" -#: parser/parse_agg.c:376 +#: parser/parse_agg.c:377 msgid "grouping operations are not allowed in FROM clause of their own query level" msgstr "les fonctions de regroupement ne sont pas autorisés dans la clause FROM du même niveau de la requête" -#: parser/parse_agg.c:381 +#: parser/parse_agg.c:382 msgid "aggregate functions are not allowed in functions in FROM" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les fonctions dans une clause FROM" -#: parser/parse_agg.c:383 +#: parser/parse_agg.c:384 msgid "grouping operations are not allowed in functions in FROM" msgstr "les fonctions de regroupement ne sont pas autorisés dans les fonctions contenues dans la clause FROM" -#: parser/parse_agg.c:391 +#: parser/parse_agg.c:392 msgid "aggregate functions are not allowed in policy expressions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les expressions de politique" -#: parser/parse_agg.c:393 +#: parser/parse_agg.c:394 msgid "grouping operations are not allowed in policy expressions" msgstr "les fonctions de regroupement ne sont pas autorisés dans les expressions de politique" -#: parser/parse_agg.c:410 +#: parser/parse_agg.c:411 msgid "aggregate functions are not allowed in window RANGE" msgstr "les fonctions d'agrégat ne sont pas autorisées dans le RANGE d'un fenêtrage" -#: parser/parse_agg.c:412 +#: parser/parse_agg.c:413 msgid "grouping operations are not allowed in window RANGE" msgstr "les fonctions de regroupement ne sont pas autorisés dans le RANGE de fenêtrage" -#: parser/parse_agg.c:417 +#: parser/parse_agg.c:418 msgid "aggregate functions are not allowed in window ROWS" msgstr "les fonctions d'agrégat ne sont pas autorisées dans le ROWS d'un fenêtrage" -#: parser/parse_agg.c:419 +#: parser/parse_agg.c:420 msgid "grouping operations are not allowed in window ROWS" msgstr "les fonctions de regroupement ne sont pas autorisés dans le ROWS de fenêtrage" -#: parser/parse_agg.c:424 +#: parser/parse_agg.c:425 msgid "aggregate functions are not allowed in window GROUPS" msgstr "les fonctions d'agrégat ne sont pas autorisées dans le GROUPS d'un fenêtrage" -#: parser/parse_agg.c:426 +#: parser/parse_agg.c:427 msgid "grouping operations are not allowed in window GROUPS" msgstr "les fonctions de regroupement ne sont pas autorisés dans le GROUPS de fenêtrage" -#: parser/parse_agg.c:439 +#: parser/parse_agg.c:440 #, fuzzy #| msgid "aggregate functions are not allowed in trigger WHEN conditions" msgid "aggregate functions are not allowed in MERGE WHEN conditions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les conditions WHEN des triggers" -#: parser/parse_agg.c:441 +#: parser/parse_agg.c:442 #, fuzzy #| msgid "grouping operations are not allowed in trigger WHEN conditions" msgid "grouping operations are not allowed in MERGE WHEN conditions" msgstr "les fonctions de regroupement ne sont pas autorisés dans les conditions WHEN des triggers" -#: parser/parse_agg.c:467 +#: parser/parse_agg.c:468 msgid "aggregate functions are not allowed in check constraints" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les contraintes CHECK" -#: parser/parse_agg.c:469 +#: parser/parse_agg.c:470 msgid "grouping operations are not allowed in check constraints" msgstr "les fonctions de regroupement ne sont pas autorisés dans les contraintes CHECK" -#: parser/parse_agg.c:476 +#: parser/parse_agg.c:477 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les expressions par défaut" -#: parser/parse_agg.c:478 +#: parser/parse_agg.c:479 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "les fonctions de regroupement ne sont pas autorisés dans les expressions par défaut" -#: parser/parse_agg.c:483 +#: parser/parse_agg.c:484 msgid "aggregate functions are not allowed in index expressions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les expressions d'index" -#: parser/parse_agg.c:485 +#: parser/parse_agg.c:486 msgid "grouping operations are not allowed in index expressions" msgstr "les fonctions de regroupement ne sont pas autorisés dans les expressions d'index" -#: parser/parse_agg.c:490 +#: parser/parse_agg.c:491 msgid "aggregate functions are not allowed in index predicates" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les prédicats d'index" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:493 msgid "grouping operations are not allowed in index predicates" msgstr "les fonctions de regroupement ne sont pas autorisés dans les prédicats d'index" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:498 msgid "aggregate functions are not allowed in statistics expressions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les expressions statistiques" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:500 msgid "grouping operations are not allowed in statistics expressions" msgstr "les fonctions de regroupement ne sont pas autorisées dans les expressions statistiques" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:505 msgid "aggregate functions are not allowed in transform expressions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les expressions de transformation" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:507 msgid "grouping operations are not allowed in transform expressions" msgstr "les fonctions de regroupement ne sont pas autorisés dans les expressions de transformation" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:512 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les paramètres d'EXECUTE" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:514 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "les fonctions de regroupement ne sont pas autorisés dans les paramètres d'EXECUTE" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:519 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les conditions WHEN des triggers" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:521 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "les fonctions de regroupement ne sont pas autorisés dans les conditions WHEN des triggers" -#: parser/parse_agg.c:525 +#: parser/parse_agg.c:526 msgid "aggregate functions are not allowed in partition bound" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les limites de partition" -#: parser/parse_agg.c:527 +#: parser/parse_agg.c:528 msgid "grouping operations are not allowed in partition bound" msgstr "les opérations de regroupement ne sont pas autorisées dans les limites de partition" -#: parser/parse_agg.c:532 +#: parser/parse_agg.c:533 msgid "aggregate functions are not allowed in partition key expressions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les expressions de clé de partitionnement" -#: parser/parse_agg.c:534 +#: parser/parse_agg.c:535 msgid "grouping operations are not allowed in partition key expressions" msgstr "les opérations de regroupement ne sont pas autorisées dans les expressions de clé de partitionnement" -#: parser/parse_agg.c:540 +#: parser/parse_agg.c:541 msgid "aggregate functions are not allowed in column generation expressions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les expressions de génération de colonne" -#: parser/parse_agg.c:542 +#: parser/parse_agg.c:543 msgid "grouping operations are not allowed in column generation expressions" msgstr "les fonctions de regroupement ne sont pas autorisées dans les expressions de génération de colonne" -#: parser/parse_agg.c:548 +#: parser/parse_agg.c:549 msgid "aggregate functions are not allowed in CALL arguments" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les arguments de CALL" -#: parser/parse_agg.c:550 +#: parser/parse_agg.c:551 msgid "grouping operations are not allowed in CALL arguments" msgstr "les fonctions de regroupement ne sont pas autorisés dans les arguments de CALL" -#: parser/parse_agg.c:556 +#: parser/parse_agg.c:557 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "les fonctions d'agrégat ne sont pas autorisées dans les conditions de COPY FROM WHERE" -#: parser/parse_agg.c:558 +#: parser/parse_agg.c:559 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "les fonctions de regroupement ne sont pas autorisées dans les conditions WHERE d'un COPY FROM" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:585 parser/parse_clause.c:1836 +#: parser/parse_agg.c:586 parser/parse_clause.c:1956 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "les fonctions d'agrégat ne sont pas autorisées dans %s" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:588 +#: parser/parse_agg.c:589 #, c-format msgid "grouping operations are not allowed in %s" msgstr "les fonctions de regroupement ne sont pas autorisés dans %s" -#: parser/parse_agg.c:689 +#: parser/parse_agg.c:690 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" -msgstr "un aggrégat de niveau externe ne peut pas contenir de variable de niveau inférieur dans ses arguments directs" +msgstr "un agrégat de niveau externe ne peut pas contenir de variable de niveau inférieur dans ses arguments directs" #: parser/parse_agg.c:768 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "les appels à la fonction d'agrégat ne peuvent pas contenir des appels à des fonctions retournant des ensembles" -#: parser/parse_agg.c:769 parser/parse_expr.c:1674 parser/parse_expr.c:2156 -#: parser/parse_func.c:883 +#: parser/parse_agg.c:769 parser/parse_expr.c:1700 parser/parse_expr.c:2182 +#: parser/parse_func.c:884 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." msgstr "Vous devriez être capable de déplacer la fonction SETOF dans un élément LATERAL FROM." @@ -17162,336 +17532,337 @@ msgid "window functions are not allowed in column generation expressions" msgstr "les fonctions de fenêtrage ne sont pas autorisées dans les expressions de génération de colonne" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:974 parser/parse_clause.c:1845 +#: parser/parse_agg.c:974 parser/parse_clause.c:1965 #, c-format msgid "window functions are not allowed in %s" msgstr "les fonctions de fenêtrage ne sont pas autorisés dans %s" -#: parser/parse_agg.c:1008 parser/parse_clause.c:2678 +#: parser/parse_agg.c:1008 parser/parse_clause.c:2798 #, c-format msgid "window \"%s\" does not exist" msgstr "le window « %s » n'existe pas" -#: parser/parse_agg.c:1092 +#: parser/parse_agg.c:1096 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "trop d'ensembles de regroupement présents (4096 maximum)" -#: parser/parse_agg.c:1232 +#: parser/parse_agg.c:1236 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "les fonctions d'agrégat ne sont pas autorisées dans le terme récursif d'une requête récursive" -#: parser/parse_agg.c:1425 +#: parser/parse_agg.c:1429 #, c-format msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" msgstr "la colonne « %s.%s » doit apparaître dans la clause GROUP BY ou doit être utilisé dans une fonction d'agrégat" -#: parser/parse_agg.c:1428 +#: parser/parse_agg.c:1432 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." -msgstr "Les arguments directs d'un agégat par ensemble ordonné doivent seulement utiliser des colonnes groupées." +msgstr "Les arguments directs d'un agrégat par ensemble ordonné doivent seulement utiliser des colonnes groupées." -#: parser/parse_agg.c:1433 +#: parser/parse_agg.c:1437 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "" "la sous-requête utilise une colonne « %s.%s » non groupée dans la requête\n" "externe" -#: parser/parse_agg.c:1597 +#: parser/parse_agg.c:1601 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "les arguments de la clause GROUPING doivent être des expressions de regroupement du niveau associé de la requête" -#: parser/parse_clause.c:192 +#: parser/parse_clause.c:195 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "la relation « %s » ne peut pas être la cible d'une instruction modifiée" -#: parser/parse_clause.c:572 parser/parse_clause.c:600 parser/parse_func.c:2554 +#: parser/parse_clause.c:571 parser/parse_clause.c:599 parser/parse_func.c:2552 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "les fonctions renvoyant des ensembles doivent apparaître au niveau haut d'un FROM" -#: parser/parse_clause.c:612 +#: parser/parse_clause.c:611 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "plusieurs listes de définition de colonnes ne sont pas autorisées pour la même fonction" -#: parser/parse_clause.c:645 +#: parser/parse_clause.c:644 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "ROWS FROM() avec plusieurs fonctions ne peut pas avoir une liste de définitions de colonnes" -#: parser/parse_clause.c:646 +#: parser/parse_clause.c:645 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "Placer une liste de définitions de colonnes séparée pour chaque fonction à l'intérieur de ROWS FROM()." -#: parser/parse_clause.c:652 +#: parser/parse_clause.c:651 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "UNNEST() avec plusieurs arguments ne peut pas avoir de liste de définition de colonnes" -#: parser/parse_clause.c:653 +#: parser/parse_clause.c:652 #, c-format msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." msgstr "Utiliser des appels séparés UNNEST() à l'intérieur de ROWS FROM(), et attacher une liste de définition des colonnes pour chaque." -#: parser/parse_clause.c:660 +#: parser/parse_clause.c:659 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY ne peut pas être utilisé avec une liste de définitions de colonnes" -#: parser/parse_clause.c:661 +#: parser/parse_clause.c:660 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "Placez la liste de définitions des colonnes dans ROWS FROM()." -#: parser/parse_clause.c:761 +#: parser/parse_clause.c:760 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "seule une colonne FOR ORDINALITY est autorisée" -#: parser/parse_clause.c:822 +#: parser/parse_clause.c:821 #, c-format msgid "column name \"%s\" is not unique" msgstr "le nom de colonne « %s » n'est pas unique" -#: parser/parse_clause.c:864 +#: parser/parse_clause.c:863 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "l'espace de nom « %s » n'est pas unique" -#: parser/parse_clause.c:874 +#: parser/parse_clause.c:873 #, c-format msgid "only one default namespace is allowed" msgstr "seul un espace de nom par défaut est autorisé" -#: parser/parse_clause.c:934 +#: parser/parse_clause.c:933 #, c-format msgid "tablesample method %s does not exist" -msgstr "la méthode d'échantillonage %s n'existe pas" +msgstr "la méthode d'échantillonnage %s n'existe pas" -#: parser/parse_clause.c:956 +#: parser/parse_clause.c:955 #, c-format msgid "tablesample method %s requires %d argument, not %d" msgid_plural "tablesample method %s requires %d arguments, not %d" -msgstr[0] "la méthode d'échantillonage %s requiert %d argument, et non pas %d" -msgstr[1] "la méthode d'échantillonage %s requiert %d arguments, et non pas %d" +msgstr[0] "la méthode d'échantillonnage %s requiert %d argument, et non pas %d" +msgstr[1] "la méthode d'échantillonnage %s requiert %d arguments, et non pas %d" -#: parser/parse_clause.c:990 +#: parser/parse_clause.c:989 #, c-format msgid "tablesample method %s does not support REPEATABLE" -msgstr "la méthode d'échantillonage %s ne supporte pas REPEATABLE" +msgstr "la méthode d'échantillonnage %s ne supporte pas REPEATABLE" -#: parser/parse_clause.c:1139 +#: parser/parse_clause.c:1138 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "la clause TABLESAMPLE n'est applicable qu'aux tables et vues matérialisées" -#: parser/parse_clause.c:1329 +#: parser/parse_clause.c:1325 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "le nom de la colonne « %s » apparaît plus d'une fois dans la clause USING" -#: parser/parse_clause.c:1344 +#: parser/parse_clause.c:1340 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "" "le nom commun de la colonne « %s » apparaît plus d'une fois dans la table de\n" "gauche" -#: parser/parse_clause.c:1353 +#: parser/parse_clause.c:1349 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "" "la colonne « %s » spécifiée dans la clause USING n'existe pas dans la table\n" "de gauche" -#: parser/parse_clause.c:1368 +#: parser/parse_clause.c:1364 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "" "le nom commun de la colonne « %s » apparaît plus d'une fois dans la table de\n" " droite" -#: parser/parse_clause.c:1377 +#: parser/parse_clause.c:1373 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "" "la colonne « %s » spécifiée dans la clause USING n'existe pas dans la table\n" "de droite" -#: parser/parse_clause.c:1781 +#: parser/parse_clause.c:1901 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" msgstr "un nombre de lignes ne peut pas être NULL dans une clause FETCH FIRST ... WITH TIES" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1806 +#: parser/parse_clause.c:1926 #, c-format msgid "argument of %s must not contain variables" msgstr "l'argument de « %s » ne doit pas contenir de variables" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1971 +#: parser/parse_clause.c:2091 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "%s « %s » est ambigu" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1999 +#: parser/parse_clause.c:2119 #, c-format msgid "non-integer constant in %s" msgstr "constante non entière dans %s" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2021 +#: parser/parse_clause.c:2141 #, c-format msgid "%s position %d is not in select list" msgstr "%s, à la position %d, n'est pas dans la liste SELECT" -#: parser/parse_clause.c:2460 +#: parser/parse_clause.c:2580 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE est limité à 12 éléments" -#: parser/parse_clause.c:2666 +#: parser/parse_clause.c:2786 #, c-format msgid "window \"%s\" is already defined" msgstr "le window « %s » est déjà définie" -#: parser/parse_clause.c:2727 +#: parser/parse_clause.c:2847 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "n'a pas pu surcharger la clause PARTITION BY de window « %s »" -#: parser/parse_clause.c:2739 +#: parser/parse_clause.c:2859 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "n'a pas pu surcharger la clause ORDER BY de window « %s »" -#: parser/parse_clause.c:2769 parser/parse_clause.c:2775 +#: parser/parse_clause.c:2889 parser/parse_clause.c:2895 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "ne peut pas copier la fenêtre « %s » car il dispose d'une clause de portée" -#: parser/parse_clause.c:2777 +#: parser/parse_clause.c:2897 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Omettre les parenthèses dans cette clause OVER." -#: parser/parse_clause.c:2797 +#: parser/parse_clause.c:2917 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "RANGE avec offset PRECEDING/FOLLOWING nécessite exactement une colonne ORDER BY" -#: parser/parse_clause.c:2820 +#: parser/parse_clause.c:2940 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "le mode GROUPS nécessite une clause ORDER BY" -#: parser/parse_clause.c:2891 +#: parser/parse_clause.c:3011 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "" "dans un agrégat avec DISTINCT, les expressions ORDER BY doivent apparaître\n" "dans la liste d'argument" -#: parser/parse_clause.c:2892 +#: parser/parse_clause.c:3012 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "" "pour SELECT DISTINCT, ORDER BY, les expressions doivent apparaître dans la\n" "liste SELECT" -#: parser/parse_clause.c:2924 +#: parser/parse_clause.c:3044 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "un agrégat avec DISTINCT doit avoir au moins un argument" -#: parser/parse_clause.c:2925 +#: parser/parse_clause.c:3045 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT doit avoir au moins une colonne" -#: parser/parse_clause.c:2991 parser/parse_clause.c:3023 +#: parser/parse_clause.c:3111 parser/parse_clause.c:3143 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "les expressions SELECT DISTINCT ON doivent correspondre aux expressions ORDER BY initiales" -#: parser/parse_clause.c:3101 +#: parser/parse_clause.c:3221 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC n'est pas autorisé avec la clause ON CONFLICT" -#: parser/parse_clause.c:3107 +#: parser/parse_clause.c:3227 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST n'est pas autorisé avec la clause ON CONFLICT" -#: parser/parse_clause.c:3186 +#: parser/parse_clause.c:3306 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE requiert une spécification d'inférence ou un nom de contrainte" -#: parser/parse_clause.c:3187 +#: parser/parse_clause.c:3307 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Par exemple, ON CONFLICT (nom_colonne)" -#: parser/parse_clause.c:3198 +#: parser/parse_clause.c:3318 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT n'est pas supporté avec les catalogues systèmes" -#: parser/parse_clause.c:3206 +#: parser/parse_clause.c:3326 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT n'est pas supporté sur la table « %s » utilisée comme une table catalogue" -#: parser/parse_clause.c:3336 +#: parser/parse_clause.c:3457 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "l'opérateur %s n'est pas un opérateur de tri valide" -#: parser/parse_clause.c:3338 +#: parser/parse_clause.c:3459 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "" "Les opérateurs de tri doivent être les membres « < » ou « > » des familles\n" "d'opérateurs btree." -#: parser/parse_clause.c:3649 +#: parser/parse_clause.c:3770 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" -msgstr "RANGE avec offset PRECEDING/FOLLOWING n'est pas supporté pour le type de collone %s" +msgstr "RANGE avec décalage PRECEDING/FOLLOWING n'est pas supporté pour le type de colonne %s" -#: parser/parse_clause.c:3655 +#: parser/parse_clause.c:3776 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" -msgstr "RANGE avec offset PRECEDING/FOLLOWING n'est pas supporté pour le type de colonne %s et le type d'ossfet %s" +msgstr "RANGE avec offset PRECEDING/FOLLOWING n'est pas supporté pour le type de colonne %s et le type de décalage %s" -#: parser/parse_clause.c:3658 +#: parser/parse_clause.c:3779 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Transtypez la valeur d'offset vers un type approprié." -#: parser/parse_clause.c:3663 +#: parser/parse_clause.c:3784 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" -msgstr "RANGE avec offset PRECEDING/FOLLOWING a de multiples interprétations pour le type de colonne %s et le type d'offset %s" +msgstr "RANGE avec offset PRECEDING/FOLLOWING a de multiples interprétations pour le type de colonne %s et le type de décalage %s" -#: parser/parse_clause.c:3666 +#: parser/parse_clause.c:3787 #, c-format msgid "Cast the offset value to the exact intended type." -msgstr "Transtypez la valeur d'offset vers exactement le type attendu." +msgstr "Transtypez la valeur de décalage vers exactement le type attendu." #: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 #: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 -#: parser/parse_expr.c:2057 parser/parse_expr.c:2659 parser/parse_target.c:994 +#: parser/parse_expr.c:2083 parser/parse_expr.c:2691 parser/parse_expr.c:3497 +#: parser/parse_target.c:985 #, c-format msgid "cannot cast type %s to %s" msgstr "ne peut pas convertir le type %s en %s" @@ -17550,19 +17921,19 @@ msgid "arguments declared \"%s\" are not all alike" msgstr "les arguments déclarés « %s » ne sont pas tous identiques" #: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 -#: utils/fmgr/funcapi.c:601 +#: utils/fmgr/funcapi.c:592 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "l'argument déclaré %s n'est pas un tableau mais est du type %s" #: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 -#: utils/fmgr/funcapi.c:615 +#: utils/fmgr/funcapi.c:606 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "l'argument déclaré %s n'est pas un type d'intervalle mais est du type %s" #: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 -#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:633 utils/fmgr/funcapi.c:698 +#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:624 utils/fmgr/funcapi.c:689 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "l'argument déclaré %s n'est pas un type multirange mais est du type %s" @@ -17734,7 +18105,7 @@ msgstr "Convertissez la sortie du terme non récursif dans le bon type." #: parser/parse_cte.c:401 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" -msgstr "requête récursive « %s » : la colonne %d a le collationnement « %s » dans un terme non récursifet un collationnement « %s » global" +msgstr "requête récursive « %s » : la colonne %d a le collationnement « %s » dans un terme non récursif et un collationnement « %s » global" #: parser/parse_cte.c:405 #, c-format @@ -17853,236 +18224,296 @@ msgstr "FOR UPDATE/SHARE dans une requête récursive n'est pas implémenté" msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "la référence récursive à la requête « %s » ne doit pas apparaître plus d'une fois" -#: parser/parse_expr.c:282 +#: parser/parse_expr.c:294 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT interdit dans ce contexte" -#: parser/parse_expr.c:335 parser/parse_relation.c:3654 -#: parser/parse_relation.c:3674 +#: parser/parse_expr.c:371 parser/parse_relation.c:3688 +#: parser/parse_relation.c:3698 parser/parse_relation.c:3716 +#: parser/parse_relation.c:3723 parser/parse_relation.c:3737 #, c-format msgid "column %s.%s does not exist" msgstr "la colonne %s.%s n'existe pas" -#: parser/parse_expr.c:347 +#: parser/parse_expr.c:383 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "colonne « %s » introuvable pour le type de données %s" -#: parser/parse_expr.c:353 +#: parser/parse_expr.c:389 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "n'a pas pu identifier la colonne « %s » dans le type de données de l'enregistrement" -#: parser/parse_expr.c:359 +#: parser/parse_expr.c:395 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "notation d'attribut .%s appliqué au type %s, qui n'est pas un type composé" -#: parser/parse_expr.c:390 parser/parse_target.c:739 +#: parser/parse_expr.c:426 parser/parse_target.c:733 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "l'expansion de ligne via « * » n'est pas supportée ici" -#: parser/parse_expr.c:512 +#: parser/parse_expr.c:548 msgid "cannot use column reference in DEFAULT expression" msgstr "ne peut pas utiliser une référence de colonne dans l'expression par défaut" -#: parser/parse_expr.c:515 +#: parser/parse_expr.c:551 msgid "cannot use column reference in partition bound expression" msgstr "ne peut pas utiliser une référence de colonne dans une expression de limite de partition" -#: parser/parse_expr.c:784 parser/parse_relation.c:818 -#: parser/parse_relation.c:900 parser/parse_target.c:1234 +#: parser/parse_expr.c:810 parser/parse_relation.c:833 +#: parser/parse_relation.c:915 parser/parse_target.c:1225 #, c-format msgid "column reference \"%s\" is ambiguous" -msgstr "la référence à la colonne « %s » est ambigüe" +msgstr "la référence à la colonne « %s » est ambiguë" -#: parser/parse_expr.c:840 parser/parse_param.c:110 parser/parse_param.c:142 -#: parser/parse_param.c:208 parser/parse_param.c:307 +#: parser/parse_expr.c:866 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_param.c:204 parser/parse_param.c:303 #, c-format msgid "there is no parameter $%d" msgstr "il n'y a pas de paramètre $%d" -#: parser/parse_expr.c:1040 +#: parser/parse_expr.c:1066 #, c-format msgid "NULLIF requires = operator to yield boolean" msgstr "NULLIF requiert que l'opérateur = retourne une valeur de type booléen" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1046 parser/parse_expr.c:2975 +#: parser/parse_expr.c:1072 parser/parse_expr.c:3007 #, c-format msgid "%s must not return a set" msgstr "%s ne doit pas renvoyer un ensemble" -#: parser/parse_expr.c:1431 parser/parse_expr.c:1463 +#: parser/parse_expr.c:1457 parser/parse_expr.c:1489 #, c-format msgid "number of columns does not match number of values" msgstr "le nombre de colonnes ne correspond pas au nombre de valeurs" -#: parser/parse_expr.c:1477 +#: parser/parse_expr.c:1503 #, c-format msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" msgstr "la source d'un élément UPDATE multi-colonnes doit être un sous-SELECT ou une expression ROW()" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1672 parser/parse_expr.c:2154 parser/parse_func.c:2679 +#: parser/parse_expr.c:1698 parser/parse_expr.c:2180 parser/parse_func.c:2677 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "les fonctions renvoyant un ensemble ne sont pas autorisées dans %s" -#: parser/parse_expr.c:1735 +#: parser/parse_expr.c:1761 msgid "cannot use subquery in check constraint" msgstr "ne peut pas utiliser une sous-requête dans la contrainte de vérification" -#: parser/parse_expr.c:1739 +#: parser/parse_expr.c:1765 msgid "cannot use subquery in DEFAULT expression" msgstr "ne peut pas utiliser de sous-requête dans une expression DEFAULT" -#: parser/parse_expr.c:1742 +#: parser/parse_expr.c:1768 msgid "cannot use subquery in index expression" msgstr "ne peut pas utiliser la sous-requête dans l'expression de l'index" -#: parser/parse_expr.c:1745 +#: parser/parse_expr.c:1771 msgid "cannot use subquery in index predicate" msgstr "ne peut pas utiliser une sous-requête dans un prédicat d'index" -#: parser/parse_expr.c:1748 +#: parser/parse_expr.c:1774 msgid "cannot use subquery in statistics expression" msgstr "ne peut pas utiliser une sous-requête dans l'expression des statistiques" -#: parser/parse_expr.c:1751 +#: parser/parse_expr.c:1777 msgid "cannot use subquery in transform expression" msgstr "ne peut pas utiliser une sous-requête dans l'expression de transformation" -#: parser/parse_expr.c:1754 +#: parser/parse_expr.c:1780 msgid "cannot use subquery in EXECUTE parameter" msgstr "ne peut pas utiliser les sous-requêtes dans le paramètre EXECUTE" -#: parser/parse_expr.c:1757 +#: parser/parse_expr.c:1783 msgid "cannot use subquery in trigger WHEN condition" msgstr "ne peut pas utiliser une sous-requête dans la condition WHEN d'un trigger" -#: parser/parse_expr.c:1760 +#: parser/parse_expr.c:1786 msgid "cannot use subquery in partition bound" msgstr "ne peut pas utiliser de sous-requête dans une limite de partition" -#: parser/parse_expr.c:1763 +#: parser/parse_expr.c:1789 msgid "cannot use subquery in partition key expression" msgstr "ne peut pas utiliser de sous-requête dans l'expression de clé de partitionnement" -#: parser/parse_expr.c:1766 +#: parser/parse_expr.c:1792 msgid "cannot use subquery in CALL argument" msgstr "ne peut pas utiliser de sous-requête dans l'argument CALL" -#: parser/parse_expr.c:1769 +#: parser/parse_expr.c:1795 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "ne peut pas utiliser une sous-requête dans la condition WHERE d'un COPY FROM" -#: parser/parse_expr.c:1772 +#: parser/parse_expr.c:1798 msgid "cannot use subquery in column generation expression" msgstr "ne peut pas utiliser une sous-requête dans l'expression de génération d'une colonne" -#: parser/parse_expr.c:1825 +#: parser/parse_expr.c:1851 parser/parse_expr.c:3628 #, c-format msgid "subquery must return only one column" msgstr "la sous-requête doit renvoyer une seule colonne" -#: parser/parse_expr.c:1896 +#: parser/parse_expr.c:1922 #, c-format msgid "subquery has too many columns" msgstr "la sous-requête a trop de colonnes" -#: parser/parse_expr.c:1901 +#: parser/parse_expr.c:1927 #, c-format msgid "subquery has too few columns" msgstr "la sous-requête n'a pas assez de colonnes" -#: parser/parse_expr.c:1997 +#: parser/parse_expr.c:2023 #, c-format msgid "cannot determine type of empty array" msgstr "ne peut pas déterminer le type d'un tableau vide" -#: parser/parse_expr.c:1998 +#: parser/parse_expr.c:2024 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "Convertit explicitement vers le type désiré, par exemple ARRAY[]::integer[]." -#: parser/parse_expr.c:2012 +#: parser/parse_expr.c:2038 #, c-format msgid "could not find element type for data type %s" msgstr "n'a pas pu trouver le type d'élément pour le type de données %s" -#: parser/parse_expr.c:2095 +#: parser/parse_expr.c:2121 #, fuzzy, c-format #| msgid "target lists can have at most %d entries" msgid "ROW expressions can have at most %d entries" msgstr "les listes cibles peuvent avoir au plus %d colonnes" -#: parser/parse_expr.c:2300 +#: parser/parse_expr.c:2326 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "la valeur d'un attribut XML sans nom doit être une référence de colonne" -#: parser/parse_expr.c:2301 +#: parser/parse_expr.c:2327 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "la valeur d'un élément XML sans nom doit être une référence de colonne" -#: parser/parse_expr.c:2316 +#: parser/parse_expr.c:2342 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "le nom de l'attribut XML « %s » apparaît plus d'une fois" -#: parser/parse_expr.c:2423 +#: parser/parse_expr.c:2450 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "ne peut pas convertir le résultat XMLSERIALIZE en %s" -#: parser/parse_expr.c:2732 parser/parse_expr.c:2928 +#: parser/parse_expr.c:2764 parser/parse_expr.c:2960 #, c-format msgid "unequal number of entries in row expressions" msgstr "nombre différent d'entrées dans les expressions de ligne" -#: parser/parse_expr.c:2742 +#: parser/parse_expr.c:2774 #, c-format msgid "cannot compare rows of zero length" msgstr "n'a pas pu comparer des lignes de taille zéro" -#: parser/parse_expr.c:2767 +#: parser/parse_expr.c:2799 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "" "l'opérateur de comparaison de ligne doit renvoyer le type booléen, et non le\n" "type %s" -#: parser/parse_expr.c:2774 +#: parser/parse_expr.c:2806 #, c-format msgid "row comparison operator must not return a set" msgstr "l'opérateur de comparaison de ligne ne doit pas renvoyer un ensemble" -#: parser/parse_expr.c:2833 parser/parse_expr.c:2874 +#: parser/parse_expr.c:2865 parser/parse_expr.c:2906 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "n'a pas pu déterminer l'interprétation de l'opérateur de comparaison de ligne %s" -#: parser/parse_expr.c:2835 +#: parser/parse_expr.c:2867 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "" "Les opérateurs de comparaison de lignes doivent être associés à des familles\n" "d'opérateurs btree." -#: parser/parse_expr.c:2876 +#: parser/parse_expr.c:2908 #, c-format msgid "There are multiple equally-plausible candidates." -msgstr "Il existe de nombreus candidats également plausibles." +msgstr "Il existe de nombreux candidats également plausibles." -#: parser/parse_expr.c:2969 +#: parser/parse_expr.c:3001 #, c-format msgid "IS DISTINCT FROM requires = operator to yield boolean" msgstr "IS DISTINCT FROM requiert que l'opérateur = retourne une valeur de type booléen" +#: parser/parse_expr.c:3239 +#, c-format +msgid "JSON ENCODING clause is only allowed for bytea input type" +msgstr "" + +#: parser/parse_expr.c:3261 +#, c-format +msgid "cannot use non-string types with implicit FORMAT JSON clause" +msgstr "" + +#: parser/parse_expr.c:3262 +#, c-format +msgid "cannot use non-string types with explicit FORMAT JSON clause" +msgstr "" + +#: parser/parse_expr.c:3335 +#, fuzzy, c-format +#| msgid "cannot cast jsonb string to type %s" +msgid "cannot use JSON format with non-string output types" +msgstr "ne peut pas convertir la chaîne jsonb vers le type %s" + +#: parser/parse_expr.c:3348 +#, c-format +msgid "cannot set JSON encoding for non-bytea output types" +msgstr "" + +#: parser/parse_expr.c:3353 +#, fuzzy, c-format +#| msgid "unsupported format code: %d" +msgid "unsupported JSON encoding" +msgstr "code de format non supporté : %d" + +#: parser/parse_expr.c:3354 +#, c-format +msgid "Only UTF8 JSON encoding is supported." +msgstr "" + +#: parser/parse_expr.c:3391 +#, fuzzy, c-format +#| msgid "return type %s is not supported for SQL functions" +msgid "returning SETOF types is not supported in SQL/JSON functions" +msgstr "le type de retour %s n'est pas supporté pour les fonctions SQL" + +#: parser/parse_expr.c:3712 parser/parse_func.c:865 +#, c-format +msgid "aggregate ORDER BY is not implemented for window functions" +msgstr "l'agrégat ORDER BY n'est pas implémenté pour les fonctions de fenêtrage" + +#: parser/parse_expr.c:3934 +#, c-format +msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" +msgstr "" + +#: parser/parse_expr.c:3954 +#, fuzzy, c-format +#| msgid "cannot use aggregate in index predicate" +msgid "cannot use type %s in IS JSON predicate" +msgstr "ne peut pas utiliser un agrégat dans un prédicat d'index" + #: parser/parse_func.c:194 #, c-format msgid "argument name \"%s\" used more than once" @@ -18093,7 +18524,7 @@ msgstr "nom « %s » de l'argument spécifié plus d'une fois" msgid "positional argument cannot follow named argument" msgstr "l'argument positionné ne doit pas suivre l'argument nommé" -#: parser/parse_func.c:287 parser/parse_func.c:2369 +#: parser/parse_func.c:287 parser/parse_func.c:2367 #, c-format msgid "%s is not a procedure" msgstr "%s n'est pas une procédure" @@ -18219,7 +18650,7 @@ msgstr "" "Peut-être avez-vous mal placé la clause ORDER BY.\n" "Cette dernière doit apparaître après tous les arguments standards de l'agrégat." -#: parser/parse_func.c:622 parser/parse_func.c:2412 +#: parser/parse_func.c:622 parser/parse_func.c:2410 #, c-format msgid "procedure %s does not exist" msgstr "la procédure %s n'existe pas" @@ -18243,197 +18674,192 @@ msgstr "" msgid "VARIADIC argument must be an array" msgstr "l'argument VARIADIC doit être un tableau" -#: parser/parse_func.c:790 parser/parse_func.c:854 +#: parser/parse_func.c:791 parser/parse_func.c:855 #, c-format msgid "%s(*) must be used to call a parameterless aggregate function" msgstr "%s(*) doit être utilisé pour appeler une fonction d'agrégat sans paramètre" -#: parser/parse_func.c:797 +#: parser/parse_func.c:798 #, c-format msgid "aggregates cannot return sets" msgstr "les agrégats ne peuvent pas renvoyer des ensembles" -#: parser/parse_func.c:812 +#: parser/parse_func.c:813 #, c-format msgid "aggregates cannot use named arguments" msgstr "les agrégats ne peuvent pas utiliser des arguments nommés" -#: parser/parse_func.c:844 +#: parser/parse_func.c:845 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "DISTINCT n'est pas implémenté pour des fonctions window" -#: parser/parse_func.c:864 -#, c-format -msgid "aggregate ORDER BY is not implemented for window functions" -msgstr "l'agrégat ORDER BY n'est pas implémenté pour les fonctions de fenêtrage" - -#: parser/parse_func.c:873 +#: parser/parse_func.c:874 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "FILTER n'est pas implémenté pour des fonctions de fenêtrage non agrégats" -#: parser/parse_func.c:882 +#: parser/parse_func.c:883 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "" "les appels à la fonction de fenêtrage ne peuvent pas contenir des appels à des\n" "fonctions renvoyant des ensembles de lignes" -#: parser/parse_func.c:890 +#: parser/parse_func.c:891 #, c-format msgid "window functions cannot return sets" msgstr "les fonctions window ne peuvent pas renvoyer des ensembles" -#: parser/parse_func.c:2168 parser/parse_func.c:2441 +#: parser/parse_func.c:2166 parser/parse_func.c:2439 #, c-format msgid "could not find a function named \"%s\"" msgstr "n'a pas pu trouver une fonction nommée « %s »" -#: parser/parse_func.c:2182 parser/parse_func.c:2459 +#: parser/parse_func.c:2180 parser/parse_func.c:2457 #, c-format msgid "function name \"%s\" is not unique" msgstr "le nom de la fonction « %s » n'est pas unique" -#: parser/parse_func.c:2184 parser/parse_func.c:2462 +#: parser/parse_func.c:2182 parser/parse_func.c:2460 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "Indiquez la liste d'arguments pour sélectionner la fonction sans ambiguïté." -#: parser/parse_func.c:2228 +#: parser/parse_func.c:2226 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" msgstr[0] "les procédures ne peuvent avoir plus de %d argument" msgstr[1] "les procédures ne peuvent avoir plus de %d arguments" -#: parser/parse_func.c:2359 +#: parser/parse_func.c:2357 #, c-format msgid "%s is not a function" msgstr "%s n'est pas une fonction" -#: parser/parse_func.c:2379 +#: parser/parse_func.c:2377 #, c-format msgid "function %s is not an aggregate" msgstr "la fonction %s n'est pas un agrégat" -#: parser/parse_func.c:2407 +#: parser/parse_func.c:2405 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "n'a pas pu trouver une procédure nommée « %s »" -#: parser/parse_func.c:2421 +#: parser/parse_func.c:2419 #, c-format msgid "could not find an aggregate named \"%s\"" -msgstr "n'a pas pu trouver un aggrégat nommé « %s »" +msgstr "n'a pas pu trouver un agrégat nommé « %s »" -#: parser/parse_func.c:2426 +#: parser/parse_func.c:2424 #, c-format msgid "aggregate %s(*) does not exist" msgstr "l'agrégat %s(*) n'existe pas" -#: parser/parse_func.c:2431 +#: parser/parse_func.c:2429 #, c-format msgid "aggregate %s does not exist" msgstr "l'agrégat %s n'existe pas" -#: parser/parse_func.c:2467 +#: parser/parse_func.c:2465 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "le nom de la procédure « %s » n'est pas unique" -#: parser/parse_func.c:2470 +#: parser/parse_func.c:2468 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "Indiquez la liste d'arguments pour sélectionner la procédure sans ambiguïté." -#: parser/parse_func.c:2475 +#: parser/parse_func.c:2473 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "le nom d'agrégat « %s » n'est pas unique" -#: parser/parse_func.c:2478 +#: parser/parse_func.c:2476 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "Indiquez la liste d'arguments pour sélectionner l'agrégat sans ambiguïté." -#: parser/parse_func.c:2483 +#: parser/parse_func.c:2481 #, c-format msgid "routine name \"%s\" is not unique" msgstr "le nom de la routine « %s » n'est pas unique" -#: parser/parse_func.c:2486 +#: parser/parse_func.c:2484 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "Indiquez la liste d'arguments pour sélectionner la routine sans ambiguïté." -#: parser/parse_func.c:2541 +#: parser/parse_func.c:2539 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "les fonctions renvoyant un ensemble de lignes ne sont pas autorisées dans les conditions JOIN" -#: parser/parse_func.c:2562 +#: parser/parse_func.c:2560 msgid "set-returning functions are not allowed in policy expressions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les expressions de politique" -#: parser/parse_func.c:2578 +#: parser/parse_func.c:2576 msgid "set-returning functions are not allowed in window definitions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les définitions de fenêtres" -#: parser/parse_func.c:2615 +#: parser/parse_func.c:2613 #, fuzzy #| msgid "set-returning functions are not allowed in trigger WHEN conditions" msgid "set-returning functions are not allowed in MERGE WHEN conditions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les conditions WHEN des triggers" -#: parser/parse_func.c:2619 +#: parser/parse_func.c:2617 msgid "set-returning functions are not allowed in check constraints" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les contraintes CHECK" -#: parser/parse_func.c:2623 +#: parser/parse_func.c:2621 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les expressions par défaut" -#: parser/parse_func.c:2626 +#: parser/parse_func.c:2624 msgid "set-returning functions are not allowed in index expressions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les expressions d'index" -#: parser/parse_func.c:2629 +#: parser/parse_func.c:2627 msgid "set-returning functions are not allowed in index predicates" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les prédicats d'index" -#: parser/parse_func.c:2632 +#: parser/parse_func.c:2630 msgid "set-returning functions are not allowed in statistics expressions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les expressions statistiques" -#: parser/parse_func.c:2635 +#: parser/parse_func.c:2633 msgid "set-returning functions are not allowed in transform expressions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les expressions de transformation" -#: parser/parse_func.c:2638 +#: parser/parse_func.c:2636 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les paramètres d'EXECUTE" -#: parser/parse_func.c:2641 +#: parser/parse_func.c:2639 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les conditions WHEN des triggers" -#: parser/parse_func.c:2644 +#: parser/parse_func.c:2642 msgid "set-returning functions are not allowed in partition bound" msgstr "les fonctions renvoyant un ensemble de lignes ne sont pas autorisées dans les limites de partition" -#: parser/parse_func.c:2647 +#: parser/parse_func.c:2645 msgid "set-returning functions are not allowed in partition key expressions" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les expressions de clé de partitionnement" -#: parser/parse_func.c:2650 +#: parser/parse_func.c:2648 msgid "set-returning functions are not allowed in CALL arguments" msgstr "les fonctions renvoyant plusieurs lignes ne sont pas autorisées dans les arguments de CALL" -#: parser/parse_func.c:2653 +#: parser/parse_func.c:2651 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "les fonctions renvoyant un ensemble de lignes ne sont pas autorisées dans les conditions WHERE d'un COPY FROM" -#: parser/parse_func.c:2656 +#: parser/parse_func.c:2654 msgid "set-returning functions are not allowed in column generation expressions" msgstr "les fonctions renvoyant un ensemble de lignes ne sont pas autorisées dans les expressions de génération de colonne" @@ -18465,7 +18891,7 @@ msgstr "le nom de la table « %s » est spécifié plus d'une fois" msgid "The name is used both as MERGE target table and data source." msgstr "Le nom est utilisé à la fois comme table cible et source de données du MERGE." -#: parser/parse_node.c:86 +#: parser/parse_node.c:87 #, c-format msgid "target lists can have at most %d entries" msgstr "les listes cibles peuvent avoir au plus %d colonnes" @@ -18475,8 +18901,8 @@ msgstr "les listes cibles peuvent avoir au plus %d colonnes" msgid "postfix operators are not supported" msgstr "les opérateurs postfixes ne sont pas supportés" -#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:539 -#: utils/adt/regproc.c:723 +#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:509 +#: utils/adt/regproc.c:683 #, c-format msgid "operator does not exist: %s" msgstr "l'opérateur n'existe pas : %s" @@ -18537,218 +18963,245 @@ msgstr "op ANY/ALL (tableau) requiert un opérateur pour comparer des booléens" msgid "op ANY/ALL (array) requires operator not to return a set" msgstr "op ANY/ALL (tableau) requiert que l'opérateur ne renvoie pas un ensemble" -#: parser/parse_param.c:225 +#: parser/parse_param.c:221 #, c-format msgid "inconsistent types deduced for parameter $%d" msgstr "types incohérents déduit pour le paramètre $%d" -#: parser/parse_param.c:313 tcop/postgres.c:709 +#: parser/parse_param.c:309 tcop/postgres.c:740 #, c-format msgid "could not determine data type of parameter $%d" msgstr "n'a pas pu déterminer le type de données du paramètre $%d" -#: parser/parse_relation.c:201 +#: parser/parse_relation.c:221 #, c-format msgid "table reference \"%s\" is ambiguous" -msgstr "la référence à la table « %s » est ambigüe" +msgstr "la référence à la table « %s » est ambiguë" -#: parser/parse_relation.c:245 +#: parser/parse_relation.c:265 #, c-format msgid "table reference %u is ambiguous" -msgstr "la référence à la table %u est ambigüe" +msgstr "la référence à la table %u est ambiguë" -#: parser/parse_relation.c:445 +#: parser/parse_relation.c:465 #, c-format msgid "table name \"%s\" specified more than once" msgstr "le nom de la table « %s » est spécifié plus d'une fois" -#: parser/parse_relation.c:474 parser/parse_relation.c:3594 +#: parser/parse_relation.c:494 parser/parse_relation.c:3630 +#: parser/parse_relation.c:3639 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "référence invalide d'une entrée de la clause FROM pour la table « %s »" -#: parser/parse_relation.c:478 parser/parse_relation.c:3599 +#: parser/parse_relation.c:498 parser/parse_relation.c:3641 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "" "Il existe une entrée pour la table « %s » mais elle ne peut pas être\n" "référencée de cette partie de la requête." -#: parser/parse_relation.c:480 +#: parser/parse_relation.c:500 #, c-format msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." msgstr "Le type JOIN combiné doit être INNER ou LEFT pour une référence LATERAL." -#: parser/parse_relation.c:691 +#: parser/parse_relation.c:703 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "la référence de la colonne système « %s » dans la contrainte CHECK est invalide" -#: parser/parse_relation.c:700 +#: parser/parse_relation.c:712 #, c-format msgid "cannot use system column \"%s\" in column generation expression" msgstr "ne peut pas utiliser la colonne système « %s » dans une expression de génération de colonne" -#: parser/parse_relation.c:711 +#: parser/parse_relation.c:723 #, fuzzy, c-format #| msgid "cannot use system column \"%s\" in partition key" msgid "cannot use system column \"%s\" in MERGE WHEN condition" msgstr "ne peut pas utiliser la colonne système « %s » comme clé de partitionnement" -#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 -#: parser/parse_relation.c:2357 +#: parser/parse_relation.c:1236 parser/parse_relation.c:1691 +#: parser/parse_relation.c:2388 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "la table « %s » a %d colonnes disponibles mais %d colonnes spécifiées" -#: parser/parse_relation.c:1388 +#: parser/parse_relation.c:1445 #, c-format msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." msgstr "" "Il existe un élément WITH nommé « %s » mais il ne peut pas être\n" "référencée de cette partie de la requête." -#: parser/parse_relation.c:1390 +#: parser/parse_relation.c:1447 #, c-format msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." msgstr "" "Utilisez WITH RECURSIVE ou ré-ordonnez les éléments WITH pour supprimer\n" "les références en avant." -#: parser/parse_relation.c:1778 +#: parser/parse_relation.c:1834 #, c-format msgid "a column definition list is redundant for a function with OUT parameters" msgstr "une liste de définition de colonnes est redondante pour une fonction avec paramètres OUT" -#: parser/parse_relation.c:1784 +#: parser/parse_relation.c:1840 #, c-format msgid "a column definition list is redundant for a function returning a named composite type" msgstr "une liste de définition de colonnes est redondante pour une fonction renvoyant un type composite nommé" -#: parser/parse_relation.c:1791 +#: parser/parse_relation.c:1847 #, c-format msgid "a column definition list is only allowed for functions returning \"record\"" msgstr "une liste de définition de colonnes n'autorisée que pour les fonctions renvoyant un « record »" -#: parser/parse_relation.c:1802 +#: parser/parse_relation.c:1858 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "une liste de définition de colonnes est requise pour les fonctions renvoyant un « record »" -#: parser/parse_relation.c:1839 +#: parser/parse_relation.c:1895 #, fuzzy, c-format #| msgid "target lists can have at most %d entries" msgid "column definition lists can have at most %d entries" msgstr "les listes cibles peuvent avoir au plus %d colonnes" -#: parser/parse_relation.c:1899 +#: parser/parse_relation.c:1955 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "la fonction « %s » dans la clause FROM a un type de retour %s non supporté" -#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 +#: parser/parse_relation.c:1982 parser/parse_relation.c:2068 #, fuzzy, c-format #| msgid "joins can have at most %d columns" msgid "functions in FROM can return at most %d columns" msgstr "les jointures peuvent avoir au plus %d colonnes" -#: parser/parse_relation.c:2049 +#: parser/parse_relation.c:2098 #, fuzzy, c-format #| msgid "table \"%s\" has %d columns available but %d columns specified" msgid "%s function has %d columns available but %d columns specified" msgstr "la table « %s » a %d colonnes disponibles mais %d colonnes spécifiées" -#: parser/parse_relation.c:2138 +#: parser/parse_relation.c:2180 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "les listes de VALUES « %s » ont %d colonnes disponibles mais %d colonnes spécifiées" -#: parser/parse_relation.c:2210 +#: parser/parse_relation.c:2246 #, c-format msgid "joins can have at most %d columns" msgstr "les jointures peuvent avoir au plus %d colonnes" -#: parser/parse_relation.c:2235 +#: parser/parse_relation.c:2271 #, fuzzy, c-format #| msgid "table \"%s\" has %d columns available but %d columns specified" msgid "join expression \"%s\" has %d columns available but %d columns specified" msgstr "la table « %s » a %d colonnes disponibles mais %d colonnes spécifiées" -#: parser/parse_relation.c:2330 +#: parser/parse_relation.c:2361 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "La requête WITH « %s » n'a pas de clause RETURNING" -#: parser/parse_relation.c:3597 +#: parser/parse_relation.c:3632 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Peut-être que vous souhaitiez référencer l'alias de la table « %s »." -#: parser/parse_relation.c:3605 +#: parser/parse_relation.c:3644 +#, c-format +msgid "To reference that table, you must mark this subquery with LATERAL." +msgstr "" + +#: parser/parse_relation.c:3650 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "entrée manquante de la clause FROM pour la table « %s »" -#: parser/parse_relation.c:3657 +#: parser/parse_relation.c:3690 +#, fuzzy, c-format +#| msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." +msgid "There are columns named \"%s\", but they are in tables that cannot be referenced from this part of the query." +msgstr "Il existe une colonne nommée « %s » pour la table « %s » mais elle ne peut pas être référencée dans cette partie de la requête." + +#: parser/parse_relation.c:3692 #, c-format -msgid "Perhaps you meant to reference the column \"%s.%s\"." -msgstr "Peut-être que vous souhaitiez référencer la colonne « %s.%s »." +msgid "Try using a table-qualified name." +msgstr "" -#: parser/parse_relation.c:3659 +#: parser/parse_relation.c:3700 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "Il existe une colonne nommée « %s » pour la table « %s » mais elle ne peut pas être référencée dans cette partie de la requête." -#: parser/parse_relation.c:3676 +#: parser/parse_relation.c:3703 +#, c-format +msgid "To reference that column, you must mark this subquery with LATERAL." +msgstr "" + +#: parser/parse_relation.c:3705 +#, c-format +msgid "To reference that column, you must use a table-qualified name." +msgstr "" + +#: parser/parse_relation.c:3725 +#, c-format +msgid "Perhaps you meant to reference the column \"%s.%s\"." +msgstr "Peut-être que vous souhaitiez référencer la colonne « %s.%s »." + +#: parser/parse_relation.c:3739 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "Peut-être que vous souhaitiez référencer la colonne « %s.%s » ou la colonne « %s.%s »." -#: parser/parse_target.c:482 parser/parse_target.c:803 +#: parser/parse_target.c:481 parser/parse_target.c:796 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "ne peut pas affecter à une colonne système « %s »" -#: parser/parse_target.c:510 +#: parser/parse_target.c:509 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "ne peut pas initialiser un élément d'un tableau avec DEFAULT" -#: parser/parse_target.c:515 +#: parser/parse_target.c:514 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "ne peut pas initialiser un sous-champ avec DEFAULT" -#: parser/parse_target.c:589 +#: parser/parse_target.c:588 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "la colonne « %s » est de type %s mais l'expression est de type %s" -#: parser/parse_target.c:787 +#: parser/parse_target.c:780 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" msgstr "" "ne peut pas l'affecter au champ « %s » de la colonne « %s » parce que son\n" "type %s n'est pas un type composé" -#: parser/parse_target.c:796 +#: parser/parse_target.c:789 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" msgstr "" "ne peut pas l'affecter au champ « %s » de la colonne « %s » parce qu'il n'existe\n" "pas une telle colonne dans le type de données %s" -#: parser/parse_target.c:877 +#: parser/parse_target.c:869 #, c-format msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" msgstr "l'affectation indicée à « %s » nécessite le type %s mais son expression est de type %s" -#: parser/parse_target.c:887 +#: parser/parse_target.c:879 #, c-format msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "le sous-champ « %s » est de type %s mais l'expression est de type %s" -#: parser/parse_target.c:1323 +#: parser/parse_target.c:1314 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "Un SELECT * sans table spécifiée n'est pas valide" @@ -18768,8 +19221,8 @@ msgstr "référence %%TYPE invalide (trop de points entre les noms) : %s" msgid "type reference %s converted to %s" msgstr "référence de type %s convertie en %s" -#: parser/parse_type.c:278 parser/parse_type.c:807 utils/cache/typcache.c:390 -#: utils/cache/typcache.c:445 +#: parser/parse_type.c:278 parser/parse_type.c:813 utils/cache/typcache.c:395 +#: utils/cache/typcache.c:450 #, c-format msgid "type \"%s\" is only a shell" msgstr "le type « %s » n'est qu'une coquille" @@ -18784,376 +19237,371 @@ msgstr "le modificateur de type n'est pas autorisé pour le type « %s »" msgid "type modifiers must be simple constants or identifiers" msgstr "les modificateurs de type doivent être des constantes ou des identifiants" -#: parser/parse_type.c:725 parser/parse_type.c:770 +#: parser/parse_type.c:723 parser/parse_type.c:773 #, c-format msgid "invalid type name \"%s\"" msgstr "nom de type « %s » invalide" -#: parser/parse_utilcmd.c:266 +#: parser/parse_utilcmd.c:264 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "ne peut pas créer une table partitionnée comme la fille d'un héritage" -#: parser/parse_utilcmd.c:579 +#: parser/parse_utilcmd.c:580 #, c-format msgid "array of serial is not implemented" msgstr "le tableau de type serial n'est pas implémenté" -#: parser/parse_utilcmd.c:658 parser/parse_utilcmd.c:670 -#: parser/parse_utilcmd.c:729 +#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 +#: parser/parse_utilcmd.c:730 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "déclarations NULL/NOT NULL en conflit pour la colonne « %s » de la table « %s »" -#: parser/parse_utilcmd.c:682 +#: parser/parse_utilcmd.c:683 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "" "plusieurs valeurs par défaut sont spécifiées pour la colonne « %s » de la table\n" "« %s »" -#: parser/parse_utilcmd.c:699 +#: parser/parse_utilcmd.c:700 #, c-format msgid "identity columns are not supported on typed tables" msgstr "les colonnes d'identité uniques ne sont pas supportées sur les tables typées" -#: parser/parse_utilcmd.c:703 +#: parser/parse_utilcmd.c:704 #, c-format msgid "identity columns are not supported on partitions" msgstr "les colonnes d'identité ne sont pas supportées sur les partitions" -#: parser/parse_utilcmd.c:712 +#: parser/parse_utilcmd.c:713 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "plusieurs spécifications d'identité pour la colonne « %s » de la table « %s »" -#: parser/parse_utilcmd.c:742 +#: parser/parse_utilcmd.c:743 #, c-format msgid "generated columns are not supported on typed tables" msgstr "les colonnes générées ne sont pas supportées sur les tables typées" -#: parser/parse_utilcmd.c:746 -#, c-format -msgid "generated columns are not supported on partitions" -msgstr "les colonnes générées ne sont pas supportées sur les partitions" - -#: parser/parse_utilcmd.c:751 +#: parser/parse_utilcmd.c:747 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" -msgstr "plusieurs expressions de géénration sont spécifiées pour la colonne « %s » de la table « %s »" +msgstr "plusieurs expressions de génération sont spécifiées pour la colonne « %s » de la table « %s »" -#: parser/parse_utilcmd.c:769 parser/parse_utilcmd.c:884 +#: parser/parse_utilcmd.c:765 parser/parse_utilcmd.c:880 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "les clés primaires ne sont pas supportées par les tables distantes" -#: parser/parse_utilcmd.c:778 parser/parse_utilcmd.c:894 +#: parser/parse_utilcmd.c:774 parser/parse_utilcmd.c:890 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "les contraintes uniques ne sont pas supportées par les tables distantes" -#: parser/parse_utilcmd.c:823 +#: parser/parse_utilcmd.c:819 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "une valeur par défaut et une identité ont été spécifiées pour la colonne « %s » de la table « %s »" -#: parser/parse_utilcmd.c:831 +#: parser/parse_utilcmd.c:827 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "une valeur par défaut et une expression de génération ont été spécifiées à la fois pour la colonne « %s » de la table « %s »" -#: parser/parse_utilcmd.c:839 +#: parser/parse_utilcmd.c:835 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "une identité et une expression de génération ont été spécifiées à la fois pour la colonne « %s » de la table « %s »" -#: parser/parse_utilcmd.c:904 +#: parser/parse_utilcmd.c:900 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "les contraintes d'exclusion ne sont pas supportées par les tables distantes" -#: parser/parse_utilcmd.c:910 +#: parser/parse_utilcmd.c:906 #, c-format msgid "exclusion constraints are not supported on partitioned tables" msgstr "les contraintes d'exclusion ne sont pas supportées sur les tables partitionnées" -#: parser/parse_utilcmd.c:975 +#: parser/parse_utilcmd.c:971 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE n'est pas supporté pour la création de tables distantes" -#: parser/parse_utilcmd.c:988 +#: parser/parse_utilcmd.c:984 #, fuzzy, c-format #| msgid "relation \"%s\" in %s clause not found in FROM clause" msgid "relation \"%s\" is invalid in LIKE clause" msgstr "relation « %s » dans une clause %s introuvable dans la clause FROM" -#: parser/parse_utilcmd.c:1754 parser/parse_utilcmd.c:1862 +#: parser/parse_utilcmd.c:1741 parser/parse_utilcmd.c:1849 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "l'index « %s » contient une référence de table de ligne complète" -#: parser/parse_utilcmd.c:2251 +#: parser/parse_utilcmd.c:2236 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "ne peut pas utiliser un index existant dans CREATE TABLE" -#: parser/parse_utilcmd.c:2271 +#: parser/parse_utilcmd.c:2256 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "l'index « %s » est déjà associé à une contrainte" -#: parser/parse_utilcmd.c:2286 +#: parser/parse_utilcmd.c:2271 #, c-format msgid "index \"%s\" is not valid" msgstr "l'index « %s » n'est pas valide" -#: parser/parse_utilcmd.c:2292 +#: parser/parse_utilcmd.c:2277 #, c-format msgid "\"%s\" is not a unique index" msgstr "« %s » n'est pas un index unique" -#: parser/parse_utilcmd.c:2293 parser/parse_utilcmd.c:2300 -#: parser/parse_utilcmd.c:2307 parser/parse_utilcmd.c:2384 +#: parser/parse_utilcmd.c:2278 parser/parse_utilcmd.c:2285 +#: parser/parse_utilcmd.c:2292 parser/parse_utilcmd.c:2369 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "Ne peut pas créer une clé primaire ou une contrainte unique avec cet index." -#: parser/parse_utilcmd.c:2299 +#: parser/parse_utilcmd.c:2284 #, c-format msgid "index \"%s\" contains expressions" msgstr "l'index « %s » contient des expressions" -#: parser/parse_utilcmd.c:2306 +#: parser/parse_utilcmd.c:2291 #, c-format msgid "\"%s\" is a partial index" msgstr "« %s » est un index partiel" -#: parser/parse_utilcmd.c:2318 +#: parser/parse_utilcmd.c:2303 #, c-format msgid "\"%s\" is a deferrable index" msgstr "« %s » est un index déferrable" -#: parser/parse_utilcmd.c:2319 +#: parser/parse_utilcmd.c:2304 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "Ne peut pas créer une contrainte non-déferrable utilisant un index déferrable." -#: parser/parse_utilcmd.c:2383 +#: parser/parse_utilcmd.c:2368 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "l'index « %s », colonne numéro %d, n'a pas de tri par défaut" -#: parser/parse_utilcmd.c:2540 +#: parser/parse_utilcmd.c:2525 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "la colonne « %s » apparaît deux fois dans la contrainte de la clé primaire" -#: parser/parse_utilcmd.c:2546 +#: parser/parse_utilcmd.c:2531 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "la colonne « %s » apparaît deux fois sur une contrainte unique" -#: parser/parse_utilcmd.c:2893 +#: parser/parse_utilcmd.c:2878 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "les expressions et prédicats d'index peuvent seulement faire référence à la table en cours d'indexage" -#: parser/parse_utilcmd.c:2965 +#: parser/parse_utilcmd.c:2950 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "les expressions statistiques peuvent seulement faire référence à la table référencée" -#: parser/parse_utilcmd.c:3008 +#: parser/parse_utilcmd.c:2993 #, c-format msgid "rules on materialized views are not supported" msgstr "les règles ne sont pas supportés sur les vues matérialisées" -#: parser/parse_utilcmd.c:3071 +#: parser/parse_utilcmd.c:3053 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "" "la condition WHERE d'une règle ne devrait pas contenir de références à d'autres\n" "relations" -#: parser/parse_utilcmd.c:3144 +#: parser/parse_utilcmd.c:3125 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "les règles avec des conditions WHERE ne peuvent contenir que des actions SELECT, INSERT, UPDATE ou DELETE " -#: parser/parse_utilcmd.c:3162 parser/parse_utilcmd.c:3263 -#: rewrite/rewriteHandler.c:513 rewrite/rewriteManip.c:1018 +#: parser/parse_utilcmd.c:3143 parser/parse_utilcmd.c:3244 +#: rewrite/rewriteHandler.c:539 rewrite/rewriteManip.c:1087 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "" "les instructions conditionnelles UNION/INTERSECT/EXCEPT ne sont pas\n" "implémentées" -#: parser/parse_utilcmd.c:3180 +#: parser/parse_utilcmd.c:3161 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "la règle ON SELECT ne peut pas utiliser OLD" -#: parser/parse_utilcmd.c:3184 +#: parser/parse_utilcmd.c:3165 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "la règle ON SELECT ne peut pas utiliser NEW" -#: parser/parse_utilcmd.c:3193 +#: parser/parse_utilcmd.c:3174 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "la règle ON INSERT ne peut pas utiliser OLD" -#: parser/parse_utilcmd.c:3199 +#: parser/parse_utilcmd.c:3180 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "la règle ON INSERT ne peut pas utiliser NEW" -#: parser/parse_utilcmd.c:3227 +#: parser/parse_utilcmd.c:3208 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "ne peut référencer OLD dans une requête WITH" -#: parser/parse_utilcmd.c:3234 +#: parser/parse_utilcmd.c:3215 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "ne peut référencer NEW dans une requête WITH" -#: parser/parse_utilcmd.c:3688 +#: parser/parse_utilcmd.c:3667 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "clause DEFERRABLE mal placée" -#: parser/parse_utilcmd.c:3693 parser/parse_utilcmd.c:3708 +#: parser/parse_utilcmd.c:3672 parser/parse_utilcmd.c:3687 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "clauses DEFERRABLE/NOT DEFERRABLE multiples non autorisées" -#: parser/parse_utilcmd.c:3703 +#: parser/parse_utilcmd.c:3682 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "clause NOT DEFERRABLE mal placée" -#: parser/parse_utilcmd.c:3724 +#: parser/parse_utilcmd.c:3703 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "clause INITIALLY DEFERRED mal placée" -#: parser/parse_utilcmd.c:3729 parser/parse_utilcmd.c:3755 +#: parser/parse_utilcmd.c:3708 parser/parse_utilcmd.c:3734 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "clauses INITIALLY IMMEDIATE/DEFERRED multiples non autorisées" -#: parser/parse_utilcmd.c:3750 +#: parser/parse_utilcmd.c:3729 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "clause INITIALLY IMMEDIATE mal placée" -#: parser/parse_utilcmd.c:3941 +#: parser/parse_utilcmd.c:3922 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATE spécifie un schéma (%s) différent de celui tout juste créé (%s)" -#: parser/parse_utilcmd.c:3976 +#: parser/parse_utilcmd.c:3957 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "« %s » n'est pas une table partitionnée" -#: parser/parse_utilcmd.c:3983 +#: parser/parse_utilcmd.c:3964 #, c-format msgid "table \"%s\" is not partitioned" msgstr "la table « %s » n'est pas partitionnée" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:3971 #, c-format msgid "index \"%s\" is not partitioned" msgstr "l'index « %s » n'est pas partitionné" -#: parser/parse_utilcmd.c:4030 +#: parser/parse_utilcmd.c:4011 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "une table partitionnée par hachage ne peut pas avoir de partition par défaut" -#: parser/parse_utilcmd.c:4047 +#: parser/parse_utilcmd.c:4028 #, c-format msgid "invalid bound specification for a hash partition" msgstr "spécification de limite invalide pour une partition par hachage" -#: parser/parse_utilcmd.c:4053 partitioning/partbounds.c:4824 +#: parser/parse_utilcmd.c:4034 partitioning/partbounds.c:4803 #, c-format msgid "modulus for hash partition must be an integer value greater than zero" msgstr "le modulo pour une partition par hachage doit être un entier dont la valeur est supérieure à zéro" -#: parser/parse_utilcmd.c:4060 partitioning/partbounds.c:4832 +#: parser/parse_utilcmd.c:4041 partitioning/partbounds.c:4811 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "le reste pour une partition par hachage doit être inférieur au modulo" -#: parser/parse_utilcmd.c:4073 +#: parser/parse_utilcmd.c:4054 #, c-format msgid "invalid bound specification for a list partition" msgstr "spécification de limite invalide pour une partition par liste" -#: parser/parse_utilcmd.c:4126 +#: parser/parse_utilcmd.c:4107 #, c-format msgid "invalid bound specification for a range partition" msgstr "spécification de limite invalide pour une partition par intervalle" -#: parser/parse_utilcmd.c:4132 +#: parser/parse_utilcmd.c:4113 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROM doit spécifier exactement une valeur par colonne de partitionnement" -#: parser/parse_utilcmd.c:4136 +#: parser/parse_utilcmd.c:4117 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TO doit spécifier exactement une valeur par colonne de partitionnement" -#: parser/parse_utilcmd.c:4250 +#: parser/parse_utilcmd.c:4231 #, c-format msgid "cannot specify NULL in range bound" msgstr "ne peut pas spécifier NULL dans la limite de l'intervalle" -#: parser/parse_utilcmd.c:4299 +#: parser/parse_utilcmd.c:4280 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "chaque limite suivant MAXVALUE doit aussi être MAXVALUE" -#: parser/parse_utilcmd.c:4306 +#: parser/parse_utilcmd.c:4287 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "chaque limite suivant MINVALUE doit aussi être MINVALUE" -#: parser/parse_utilcmd.c:4349 +#: parser/parse_utilcmd.c:4330 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "la valeur spécifiée ne peut pas être convertie vers le type %s pour la colonne « %s »" -#: parser/parser.c:247 +#: parser/parser.c:273 msgid "UESCAPE must be followed by a simple string literal" -msgstr "UESCAPE doit être suivi par une simple chaîne litérale" +msgstr "UESCAPE doit être suivi par une simple chaîne littérale" -#: parser/parser.c:252 +#: parser/parser.c:278 msgid "invalid Unicode escape character" msgstr "chaîne d'échappement Unicode invalide" -#: parser/parser.c:321 scan.l:1338 +#: parser/parser.c:347 scan.l:1390 #, c-format msgid "invalid Unicode escape value" msgstr "valeur d'échappement Unicode invalide" -#: parser/parser.c:468 scan.l:684 utils/adt/varlena.c:6529 +#: parser/parser.c:494 scan.l:701 utils/adt/varlena.c:6505 #, c-format msgid "invalid Unicode escape" msgstr "échappement Unicode invalide" -#: parser/parser.c:469 +#: parser/parser.c:495 #, c-format msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Les échappements Unicode doivent être de la forme \\XXXX ou \\+XXXXXX." -#: parser/parser.c:497 scan.l:645 scan.l:661 scan.l:677 -#: utils/adt/varlena.c:6554 +#: parser/parser.c:523 scan.l:662 scan.l:678 scan.l:694 +#: utils/adt/varlena.c:6530 #, c-format msgid "invalid Unicode surrogate pair" msgstr "paire surrogate Unicode invalide" @@ -19163,89 +19611,89 @@ msgstr "paire surrogate Unicode invalide" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "l'identifiant « %s » sera tronqué en « %.*s »" -#: partitioning/partbounds.c:2933 +#: partitioning/partbounds.c:2921 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "la partition « %s » est en conflit avec la partition par défaut existante « %s »" -#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 -#: partitioning/partbounds.c:3026 +#: partitioning/partbounds.c:2973 partitioning/partbounds.c:2992 +#: partitioning/partbounds.c:3014 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "chaque modulo de partition hash doit être un facteur du prochain plus gros modulo" -#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 +#: partitioning/partbounds.c:2974 partitioning/partbounds.c:3015 #, c-format msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." msgstr "Le nouveau modulo %d n'est pas un facteur de %d, le modulo de la partition existante « %s »." -#: partitioning/partbounds.c:3005 +#: partitioning/partbounds.c:2993 #, c-format msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." msgstr "Le nouveau modulo %d n'est pas divisible par %d, le modulo de la partition existante « %s »." -#: partitioning/partbounds.c:3140 +#: partitioning/partbounds.c:3128 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "limite d'intervalle vide indiquée pour la partition « %s »" -#: partitioning/partbounds.c:3142 +#: partitioning/partbounds.c:3130 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "La limite inférieure spécifiée %s est supérieure ou égale à la limite supérieure %s." -#: partitioning/partbounds.c:3254 +#: partitioning/partbounds.c:3238 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "la partition « %s » surchargerait la partition « %s »" -#: partitioning/partbounds.c:3371 +#: partitioning/partbounds.c:3355 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "parcours ignoré pour la table distante « %s » qui n'est pas une partition ou partition par défaut « %s »" -#: partitioning/partbounds.c:4828 +#: partitioning/partbounds.c:4807 #, c-format msgid "remainder for hash partition must be an integer value greater than or equal to zero" msgstr "le reste pour une partition hash doit être un entier dont la valeur est égale ou supérieure à 0" -#: partitioning/partbounds.c:4852 +#: partitioning/partbounds.c:4831 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "« %s » n'est pas une table partitionnée par hachage" -#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 +#: partitioning/partbounds.c:4842 partitioning/partbounds.c:4959 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "le nombre de colonnes de partitionnement (%d) ne correspond pas au nombre de clés de partitionnement fourni (%d)" -#: partitioning/partbounds.c:4885 +#: partitioning/partbounds.c:4864 #, c-format msgid "column %d of the partition key has type %s, but supplied value is of type %s" msgstr "la colonne %d de la clé de partitionnement a pour type %s, mais la valeur fournie est de type %s" -#: partitioning/partbounds.c:4917 +#: partitioning/partbounds.c:4896 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "la colonne %d de la clé de partitionnement a pour type « %s », mais la valeur fournie a pour type « %s »" -#: port/pg_sema.c:209 port/pg_shmem.c:695 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:695 +#: port/pg_sema.c:209 port/pg_shmem.c:708 port/posix_sema.c:209 +#: port/sysv_sema.c:323 port/sysv_shmem.c:708 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "n'a pas pu lire les informations sur le répertoire des données « %s » : %m" -#: port/pg_shmem.c:227 port/sysv_shmem.c:227 +#: port/pg_shmem.c:223 port/sysv_shmem.c:223 #, c-format msgid "could not create shared memory segment: %m" msgstr "n'a pas pu créer le segment de mémoire partagée : %m" -#: port/pg_shmem.c:228 port/sysv_shmem.c:228 +#: port/pg_shmem.c:224 port/sysv_shmem.c:224 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "L'appel système qui a échoué était shmget(clé=%lu, taille=%zu, 0%o)." -#: port/pg_shmem.c:232 port/sysv_shmem.c:232 +#: port/pg_shmem.c:228 port/sysv_shmem.c:228 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" @@ -19254,7 +19702,7 @@ msgstr "" "Cette erreur signifie habituellement que la demande de PostgreSQL pour un segment de mémoire partagée dépasse la valeur du paramètre SHMMAX du noyau, ou est plus petite\n" "que votre paramètre SHMMIN du noyau. La documentation PostgreSQL contient plus d'information sur la configuration de la mémoire partagée." -#: port/pg_shmem.c:239 port/sysv_shmem.c:239 +#: port/pg_shmem.c:235 port/sysv_shmem.c:235 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" @@ -19263,7 +19711,7 @@ msgstr "" "Cette erreur signifie habituellement que la demande de PostgreSQL pour un segment de mémoire partagée dépasse le paramètre SHMALL du noyau. Vous pourriez avoir besoin de reconfigurer\n" "le noyau avec un SHMALL plus important. La documentation PostgreSQL contient plus d'information sur la configuration de la mémoire partagée." -#: port/pg_shmem.c:245 port/sysv_shmem.c:245 +#: port/pg_shmem.c:241 port/sysv_shmem.c:241 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" @@ -19272,12 +19720,17 @@ msgstr "" "Cette erreur ne signifie *pas* que vous manquez d'espace disque. Elle survient si tous les identifiants de mémoire partagé disponibles ont été pris, auquel cas vous devez augmenter le paramètre SHMMNI de votre noyau, ou parce que la limite maximum de la mémoire partagée\n" "de votre système a été atteinte. La documentation de PostgreSQL contient plus d'informations sur la configuration de la mémoire partagée." -#: port/pg_shmem.c:633 port/sysv_shmem.c:633 +#: port/pg_shmem.c:583 port/sysv_shmem.c:583 port/win32_shmem.c:641 +#, c-format +msgid "huge_page_size must be 0 on this platform." +msgstr "huge_page_size doit valoir 0 sur cette plateforme" + +#: port/pg_shmem.c:646 port/sysv_shmem.c:646 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "n'a pas pu créer le segment de mémoire partagée anonyme : %m" -#: port/pg_shmem.c:635 port/sysv_shmem.c:635 +#: port/pg_shmem.c:648 port/sysv_shmem.c:648 #, c-format msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." msgstr "" @@ -19288,39 +19741,39 @@ msgstr "" "valeur du paramètre shared_buffers de PostgreSQL ou le paramètre\n" "max_connections." -#: port/pg_shmem.c:703 port/sysv_shmem.c:703 +#: port/pg_shmem.c:716 port/sysv_shmem.c:716 #, c-format msgid "huge pages not supported on this platform" msgstr "Huge Pages non supportées sur cette plateforme" -#: port/pg_shmem.c:710 port/sysv_shmem.c:710 +#: port/pg_shmem.c:723 port/sysv_shmem.c:723 #, c-format msgid "huge pages not supported with the current shared_memory_type setting" msgstr "huge pages non supportées avec la configuration actuelle de shared_memory_type" -#: port/pg_shmem.c:770 port/sysv_shmem.c:770 utils/init/miscinit.c:1187 +#: port/pg_shmem.c:783 port/sysv_shmem.c:783 utils/init/miscinit.c:1351 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "" "le bloc de mémoire partagé pré-existant (clé %lu, ID %lu) est en cours\n" "d'utilisation" -#: port/pg_shmem.c:773 port/sysv_shmem.c:773 utils/init/miscinit.c:1189 +#: port/pg_shmem.c:786 port/sysv_shmem.c:786 utils/init/miscinit.c:1353 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "Terminez les anciens processus serveurs associés avec le répertoire de données « %s »." -#: port/sysv_sema.c:124 +#: port/sysv_sema.c:120 #, c-format msgid "could not create semaphores: %m" msgstr "n'a pas pu créer des sémaphores : %m" -#: port/sysv_sema.c:125 +#: port/sysv_sema.c:121 #, c-format msgid "Failed system call was semget(%lu, %d, 0%o)." msgstr "L'appel système qui a échoué était semget(%lu, %d, 0%o)." -#: port/sysv_sema.c:129 +#: port/sysv_sema.c:125 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its max_connections parameter.\n" @@ -19335,7 +19788,7 @@ msgstr "" "La documentation de PostgreSQL contient plus d'informations sur la\n" "configuration de votre système avec PostgreSQL." -#: port/sysv_sema.c:159 +#: port/sysv_sema.c:155 #, c-format msgid "You possibly need to raise your kernel's SEMVMX value to be at least %d. Look into the PostgreSQL documentation for details." msgstr "" @@ -19367,14 +19820,14 @@ msgstr "a écrit le « crash dump » dans le fichier « %s »\n" msgid "could not write crash dump to file \"%s\": error code %lu\n" msgstr "n'a pas pu écrire le « crashdump » dans le fichier « %s » : code d'erreur %lu\n" -#: port/win32/signal.c:206 +#: port/win32/signal.c:240 #, c-format msgid "could not create signal listener pipe for PID %d: error code %lu" msgstr "" "n'a pas pu créer le tube d'écoute de signal pour l'identifiant de processus %d :\n" "code d'erreur %lu" -#: port/win32/signal.c:261 +#: port/win32/signal.c:295 #, c-format msgid "could not create signal listener pipe: error code %lu; retrying\n" msgstr "n'a pas pu créer le tube d'écoute de signal : code d'erreur %lu ; nouvelle tentative\n" @@ -19399,8 +19852,8 @@ msgstr "n'a pas pu déverrouiller la sémaphore : code d'erreur %lu" msgid "could not try-lock semaphore: error code %lu" msgstr "n'a pas pu tenter le verrouillage de la sémaphore : code d'erreur %lu" -#: port/win32_shmem.c:144 port/win32_shmem.c:159 port/win32_shmem.c:171 -#: port/win32_shmem.c:187 +#: port/win32_shmem.c:146 port/win32_shmem.c:161 port/win32_shmem.c:173 +#: port/win32_shmem.c:189 #, c-format msgid "could not enable user right \"%s\": error code %lu" msgstr "n'a pas pu activer le droit utilisateur « %s » : code d'erreur %lu" @@ -19408,168 +19861,168 @@ msgstr "n'a pas pu activer le droit utilisateur « %s » : code d'erreur %lu" #. translator: This is a term from Windows and should be translated to #. match the Windows localization. #. -#: port/win32_shmem.c:150 port/win32_shmem.c:159 port/win32_shmem.c:171 -#: port/win32_shmem.c:182 port/win32_shmem.c:184 port/win32_shmem.c:187 +#: port/win32_shmem.c:152 port/win32_shmem.c:161 port/win32_shmem.c:173 +#: port/win32_shmem.c:184 port/win32_shmem.c:186 port/win32_shmem.c:189 msgid "Lock pages in memory" msgstr "Verrouillage des pages en mémoire" -#: port/win32_shmem.c:152 port/win32_shmem.c:160 port/win32_shmem.c:172 -#: port/win32_shmem.c:188 +#: port/win32_shmem.c:154 port/win32_shmem.c:162 port/win32_shmem.c:174 +#: port/win32_shmem.c:190 #, c-format msgid "Failed system call was %s." msgstr "L'appel système qui a échoué était %s." -#: port/win32_shmem.c:182 +#: port/win32_shmem.c:184 #, c-format msgid "could not enable user right \"%s\"" msgstr "n'a pas pu activer le droit utilisateur « %s »" -#: port/win32_shmem.c:183 +#: port/win32_shmem.c:185 #, c-format msgid "Assign user right \"%s\" to the Windows user account which runs PostgreSQL." msgstr "Assignez le droit d'utilisateur « %s » au compte d'utilisateur Windows qui fait tourner PostgreSQL." -#: port/win32_shmem.c:241 +#: port/win32_shmem.c:244 #, c-format msgid "the processor does not support large pages" msgstr "le processeur ne supporte pas les Large Pages" -#: port/win32_shmem.c:310 port/win32_shmem.c:346 port/win32_shmem.c:364 +#: port/win32_shmem.c:313 port/win32_shmem.c:349 port/win32_shmem.c:374 #, c-format msgid "could not create shared memory segment: error code %lu" msgstr "n'a pas pu créer le segment de mémoire partagée : code d'erreur %lu" -#: port/win32_shmem.c:311 +#: port/win32_shmem.c:314 #, c-format msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." msgstr "L'appel système qui a échoué était CreateFileMapping(taille=%zu, nom=%s)." -#: port/win32_shmem.c:336 +#: port/win32_shmem.c:339 #, c-format msgid "pre-existing shared memory block is still in use" msgstr "le bloc de mémoire partagé pré-existant est toujours en cours d'utilisation" -#: port/win32_shmem.c:337 +#: port/win32_shmem.c:340 #, c-format msgid "Check if there are any old server processes still running, and terminate them." msgstr "" "Vérifier s'il n'y a pas de vieux processus serveur en cours d'exécution. Si c'est le\n" "cas, fermez-les." -#: port/win32_shmem.c:347 +#: port/win32_shmem.c:350 #, c-format msgid "Failed system call was DuplicateHandle." msgstr "L'appel système qui a échoué était DuplicateHandle." -#: port/win32_shmem.c:365 +#: port/win32_shmem.c:375 #, c-format msgid "Failed system call was MapViewOfFileEx." msgstr "L'appel système qui a échoué était MapViewOfFileEx." -#: postmaster/autovacuum.c:404 +#: postmaster/autovacuum.c:417 #, c-format msgid "could not fork autovacuum launcher process: %m" msgstr "n'a pas pu exécuter le processus autovacuum maître : %m" -#: postmaster/autovacuum.c:752 +#: postmaster/autovacuum.c:764 #, c-format msgid "autovacuum worker took too long to start; canceled" msgstr "le worker de l'autovacuum a pris trop de temps pour démarrer ; annulé" -#: postmaster/autovacuum.c:1482 +#: postmaster/autovacuum.c:1489 #, c-format msgid "could not fork autovacuum worker process: %m" msgstr "n'a pas pu exécuter le processus autovacuum worker : %m" -#: postmaster/autovacuum.c:2265 +#: postmaster/autovacuum.c:2334 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "autovacuum : suppression de la table temporaire orpheline « %s.%s.%s »" -#: postmaster/autovacuum.c:2490 +#: postmaster/autovacuum.c:2570 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "VACUUM automatique de la table « %s.%s.%s »" -#: postmaster/autovacuum.c:2493 +#: postmaster/autovacuum.c:2573 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "ANALYZE automatique de la table « %s.%s.%s »" -#: postmaster/autovacuum.c:2686 +#: postmaster/autovacuum.c:2767 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "traitement de l'enregistrement de travail pour la relation « %s.%s.%s »" -#: postmaster/autovacuum.c:3297 +#: postmaster/autovacuum.c:3381 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "autovacuum non démarré à cause d'une mauvaise configuration" -#: postmaster/autovacuum.c:3298 +#: postmaster/autovacuum.c:3382 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Activez l'option « track_counts »." -#: postmaster/bgworker.c:256 +#: postmaster/bgworker.c:259 #, c-format msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" msgstr "état du background worker incohérent (max_worker_processes=%d, slots total =%d)" -#: postmaster/bgworker.c:666 +#: postmaster/bgworker.c:669 #, fuzzy, c-format #| msgid "background worker \"%s\": only dynamic background workers can request notification" msgid "background worker \"%s\": background workers without shared memory access are not supported" msgstr "processus en tâche de fond « %s » : seuls les processus en tâche de fond dynamiques peuvent demander des notifications" -#: postmaster/bgworker.c:677 +#: postmaster/bgworker.c:680 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "processus en tâche de fond « %s » : ne peut pas réclamer un accès à la base s'il démarre au lancement du postmaster" -#: postmaster/bgworker.c:691 +#: postmaster/bgworker.c:694 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "processus en tâche de fond « %s »: intervalle de redémarrage invalide" -#: postmaster/bgworker.c:706 +#: postmaster/bgworker.c:709 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "processus en tâche de fond « %s »: les processus parallélisés ne sont peut-être pas être configurés pour redémarrer" -#: postmaster/bgworker.c:730 tcop/postgres.c:3215 +#: postmaster/bgworker.c:733 tcop/postgres.c:3255 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "arrêt du processus en tâche de fond « %s » suite à la demande de l'administrateur" -#: postmaster/bgworker.c:887 +#: postmaster/bgworker.c:890 #, c-format msgid "background worker \"%s\": must be registered in shared_preload_libraries" msgstr "processus en tâche de fond « %s » : doit être listé dans shared_preload_libraries" -#: postmaster/bgworker.c:899 +#: postmaster/bgworker.c:902 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "processus en tâche de fond « %s » : seuls les processus en tâche de fond dynamiques peuvent demander des notifications" -#: postmaster/bgworker.c:914 +#: postmaster/bgworker.c:917 #, c-format msgid "too many background workers" msgstr "trop de processus en tâche de fond" -#: postmaster/bgworker.c:915 +#: postmaster/bgworker.c:918 #, c-format msgid "Up to %d background worker can be registered with the current settings." msgid_plural "Up to %d background workers can be registered with the current settings." msgstr[0] "Un maximum de %d processus en tâche de fond peut être enregistré avec la configuration actuelle." msgstr[1] "Un maximum de %d processus en tâche de fond peuvent être enregistrés avec la configuration actuelle." -#: postmaster/bgworker.c:919 +#: postmaster/bgworker.c:922 #, c-format msgid "Consider increasing the configuration parameter \"max_worker_processes\"." msgstr "Considérez l'augmentation du paramètre « max_worker_processes »." -#: postmaster/checkpointer.c:432 +#: postmaster/checkpointer.c:431 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" @@ -19580,185 +20033,198 @@ msgstr[1] "" "les points de vérification (checkpoints) arrivent trop fréquemment\n" "(toutes les %d secondes)" -#: postmaster/checkpointer.c:436 +#: postmaster/checkpointer.c:435 #, c-format msgid "Consider increasing the configuration parameter \"max_wal_size\"." msgstr "Considérez l'augmentation du paramètre « max_wal_size »." -#: postmaster/checkpointer.c:1060 +#: postmaster/checkpointer.c:1059 #, c-format msgid "checkpoint request failed" msgstr "échec de la demande de point de vérification" -#: postmaster/checkpointer.c:1061 +#: postmaster/checkpointer.c:1060 #, c-format msgid "Consult recent messages in the server log for details." msgstr "" "Consultez les messages récents du serveur dans les journaux applicatifs pour\n" "plus de détails." -#: postmaster/pgarch.c:423 +#: postmaster/pgarch.c:416 #, fuzzy, c-format #| msgid "archive_mode enabled, yet archive_command is not set" msgid "archive_mode enabled, yet archiving is not configured" msgstr "archive_mode activé, cependant archive_command n'est pas configuré" -#: postmaster/pgarch.c:445 +#: postmaster/pgarch.c:438 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "supprimé le fichier de statut d'archivage orphelin « %s »" -#: postmaster/pgarch.c:455 +#: postmaster/pgarch.c:448 #, c-format msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" msgstr "la suppression du fichier de statut d'archive orphelin « %s » a échoué trop de fois, une nouvelle tentative aura lieu plus tard" -#: postmaster/pgarch.c:491 +#: postmaster/pgarch.c:484 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "l'archivage du journal de transactions « %s » a échoué trop de fois, nouvelle tentative repoussée" -#: postmaster/pgarch.c:798 +#: postmaster/pgarch.c:791 postmaster/pgarch.c:830 +#, c-format +msgid "both archive_command and archive_library set" +msgstr "" + +#: postmaster/pgarch.c:792 postmaster/pgarch.c:831 +#, c-format +msgid "Only one of archive_command, archive_library may be set." +msgstr "" + +#: postmaster/pgarch.c:809 #, c-format msgid "restarting archiver process because value of \"archive_library\" was changed" msgstr "" -#: postmaster/pgarch.c:831 +#: postmaster/pgarch.c:846 #, c-format msgid "archive modules have to define the symbol %s" msgstr "les modules d'archivage doivent définir le symbôle %s" -#: postmaster/pgarch.c:837 +#: postmaster/pgarch.c:852 #, c-format msgid "archive modules must register an archive callback" msgstr "les modules d'archivage doivent enregistrer une fonction d'appui d'archivage" -#: postmaster/postmaster.c:744 +#: postmaster/postmaster.c:759 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s : argument invalide pour l'option -f : « %s »\n" -#: postmaster/postmaster.c:823 +#: postmaster/postmaster.c:832 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s : argument invalide pour l'option -t : « %s »\n" -#: postmaster/postmaster.c:874 +#: postmaster/postmaster.c:855 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s : argument invalide : « %s »\n" -#: postmaster/postmaster.c:942 -#, c-format -msgid "%s: superuser_reserved_connections (%d) must be less than max_connections (%d)\n" +#: postmaster/postmaster.c:923 +#, fuzzy, c-format +#| msgid "%s: superuser_reserved_connections (%d) must be less than max_connections (%d)\n" +msgid "%s: superuser_reserved_connections (%d) plus reserved_connections (%d) must be less than max_connections (%d)\n" msgstr "%s : superuser_reserved_connections (%d) doit être inférieur à max_connections (%d)\n" -#: postmaster/postmaster.c:949 +#: postmaster/postmaster.c:931 #, c-format msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" msgstr "L'archivage des journaux de transactions ne peut pas être activé quand wal_level vaut « minimal »" -#: postmaster/postmaster.c:952 +#: postmaster/postmaster.c:934 #, c-format msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" msgstr "l'envoi d'un flux de transactions (max_wal_senders > 0) nécessite que le paramètre wal_level à « replica » ou « logical »" -#: postmaster/postmaster.c:960 +#: postmaster/postmaster.c:942 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s : tables datetoken invalide, merci de corriger\n" -#: postmaster/postmaster.c:1113 +#: postmaster/postmaster.c:1099 #, c-format msgid "could not create I/O completion port for child queue" msgstr "n'a pas pu créer un port de terminaison I/O pour la queue" -#: postmaster/postmaster.c:1178 +#: postmaster/postmaster.c:1175 #, c-format msgid "ending log output to stderr" msgstr "arrêt des traces sur stderr" -#: postmaster/postmaster.c:1179 +#: postmaster/postmaster.c:1176 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "Les traces suivantes iront sur « %s »." -#: postmaster/postmaster.c:1190 +#: postmaster/postmaster.c:1187 #, c-format msgid "starting %s" msgstr "démarrage de %s" -#: postmaster/postmaster.c:1250 +#: postmaster/postmaster.c:1239 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "n'a pas pu créer le socket d'écoute pour « %s »" -#: postmaster/postmaster.c:1256 +#: postmaster/postmaster.c:1245 #, c-format msgid "could not create any TCP/IP sockets" msgstr "n'a pas pu créer de socket TCP/IP" -#: postmaster/postmaster.c:1288 +#: postmaster/postmaster.c:1277 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "échec de DNSServiceRegister() : code d'erreur %ld" -#: postmaster/postmaster.c:1340 +#: postmaster/postmaster.c:1328 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "n'a pas pu créer la socket de domaine Unix dans le répertoire « %s »" -#: postmaster/postmaster.c:1346 +#: postmaster/postmaster.c:1334 #, c-format msgid "could not create any Unix-domain sockets" msgstr "n'a pas pu créer les sockets de domaine Unix" -#: postmaster/postmaster.c:1358 +#: postmaster/postmaster.c:1345 #, c-format msgid "no socket created for listening" msgstr "pas de socket créé pour l'écoute" -#: postmaster/postmaster.c:1389 +#: postmaster/postmaster.c:1376 #, c-format msgid "%s: could not change permissions of external PID file \"%s\": %s\n" msgstr "%s : n'a pas pu modifier les droits du fichier PID externe « %s » : %s\n" -#: postmaster/postmaster.c:1393 +#: postmaster/postmaster.c:1380 #, c-format msgid "%s: could not write external PID file \"%s\": %s\n" msgstr "%s : n'a pas pu écrire le fichier PID externe « %s » : %s\n" -#: postmaster/postmaster.c:1420 utils/init/postinit.c:220 -#, c-format -msgid "could not load pg_hba.conf" -msgstr "n'a pas pu charger pg_hba.conf" +#. translator: %s is a configuration file +#: postmaster/postmaster.c:1408 utils/init/postinit.c:221 +#, fuzzy, c-format +#| msgid "could not load locale \"%s\"" +msgid "could not load %s" +msgstr "n'a pas pu charger la locale « %s »" -#: postmaster/postmaster.c:1446 +#: postmaster/postmaster.c:1434 #, c-format msgid "postmaster became multithreaded during startup" msgstr "le postmaster est devenu multithreadé lors du démarrage" -#: postmaster/postmaster.c:1447 +#: postmaster/postmaster.c:1435 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Configurez la variable d'environnement LC_ALL avec une locale valide." -#: postmaster/postmaster.c:1548 +#: postmaster/postmaster.c:1536 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s : n'a pas pu localiser le chemin de mon propre exécutable" -#: postmaster/postmaster.c:1555 +#: postmaster/postmaster.c:1543 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s : n'a pas pu localiser l'exécutable postgres correspondant" -#: postmaster/postmaster.c:1578 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1566 utils/misc/tzparser.c:340 #, c-format msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." msgstr "Ceci peut indiquer une installation PostgreSQL incomplète, ou que le fichier « %s » a été déplacé." -#: postmaster/postmaster.c:1605 +#: postmaster/postmaster.c:1593 #, c-format msgid "" "%s: could not find the database system\n" @@ -19769,523 +20235,480 @@ msgstr "" "S'attendait à le trouver dans le répertoire « %s »,\n" "mais n'a pas réussi à ouvrir le fichier « %s »: %s\n" -#: postmaster/postmaster.c:1782 -#, c-format -msgid "select() failed in postmaster: %m" -msgstr "échec de select() dans postmaster : %m" - -#: postmaster/postmaster.c:1913 -#, c-format -msgid "issuing SIGKILL to recalcitrant children" +#. translator: %s is SIGKILL or SIGABRT +#: postmaster/postmaster.c:1890 +#, fuzzy, c-format +#| msgid "issuing SIGKILL to recalcitrant children" +msgid "issuing %s to recalcitrant children" msgstr "exécution de SIGKILL pour les processus fils récalcitrants" -#: postmaster/postmaster.c:1934 +#: postmaster/postmaster.c:1912 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "forçage d'un arrêt immédiat car le fichier de verrou du répertoire de données est invalide" -#: postmaster/postmaster.c:2037 postmaster/postmaster.c:2065 +#: postmaster/postmaster.c:1987 postmaster/postmaster.c:2015 #, c-format msgid "incomplete startup packet" msgstr "paquet de démarrage incomplet" -#: postmaster/postmaster.c:2049 postmaster/postmaster.c:2082 +#: postmaster/postmaster.c:1999 postmaster/postmaster.c:2032 #, c-format msgid "invalid length of startup packet" msgstr "longueur invalide du paquet de démarrage" -#: postmaster/postmaster.c:2111 +#: postmaster/postmaster.c:2061 #, c-format msgid "failed to send SSL negotiation response: %m" -msgstr "échec lors de l'envoi de la réponse de négotiation SSL : %m" +msgstr "échec lors de l'envoi de la réponse de négociation SSL : %m" -#: postmaster/postmaster.c:2129 +#: postmaster/postmaster.c:2079 #, c-format msgid "received unencrypted data after SSL request" msgstr "a reçu des données non chiffrées après la demande SSL" -#: postmaster/postmaster.c:2130 postmaster/postmaster.c:2174 +#: postmaster/postmaster.c:2080 postmaster/postmaster.c:2124 #, c-format msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." msgstr "Ceci peut être soit un bug du client soit la preuve d'une tentative d'attaque du type man-in-the-middle." -#: postmaster/postmaster.c:2155 +#: postmaster/postmaster.c:2105 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "échec lors de l'envoi de la réponse à la négociation GSSAPI : %m" -#: postmaster/postmaster.c:2173 +#: postmaster/postmaster.c:2123 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "a reçu des données non chiffrées après la demande de chiffrement GSSAPI" -#: postmaster/postmaster.c:2197 +#: postmaster/postmaster.c:2147 #, c-format msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" msgstr "protocole frontal %u.%u non supporté : le serveur supporte de %u.0 à %u.%u" -#: postmaster/postmaster.c:2261 utils/misc/guc.c:7400 utils/misc/guc.c:7436 -#: utils/misc/guc.c:7506 utils/misc/guc.c:8937 utils/misc/guc.c:11970 -#: utils/misc/guc.c:12011 -#, c-format -msgid "invalid value for parameter \"%s\": \"%s\"" -msgstr "valeur invalide pour le paramètre « %s » : « %s »" - -#: postmaster/postmaster.c:2264 +#: postmaster/postmaster.c:2214 #, c-format msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." msgstr "Les valeurs valides sont : « false », « 0 », « true », « 1 », « database »." -#: postmaster/postmaster.c:2309 +#: postmaster/postmaster.c:2255 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "" "configuration invalide du paquet de démarrage : terminaison attendue comme\n" "dernier octet" -#: postmaster/postmaster.c:2326 +#: postmaster/postmaster.c:2272 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "aucun nom d'utilisateur PostgreSQL n'a été spécifié dans le paquet de démarrage" -#: postmaster/postmaster.c:2390 +#: postmaster/postmaster.c:2336 #, c-format msgid "the database system is starting up" msgstr "le système de bases de données se lance" -#: postmaster/postmaster.c:2396 +#: postmaster/postmaster.c:2342 #, c-format msgid "the database system is not yet accepting connections" msgstr "le système de bases de données n'accepte pas encore de connexions" -#: postmaster/postmaster.c:2397 +#: postmaster/postmaster.c:2343 #, c-format msgid "Consistent recovery state has not been yet reached." msgstr "L'état de restauration cohérent n'a pas encore été atteint." -#: postmaster/postmaster.c:2401 +#: postmaster/postmaster.c:2347 #, c-format msgid "the database system is not accepting connections" msgstr "le système de bases de données n'accepte pas de connexions" -#: postmaster/postmaster.c:2402 +#: postmaster/postmaster.c:2348 #, c-format msgid "Hot standby mode is disabled." msgstr "Le mode Hot Standby est désactivé" -#: postmaster/postmaster.c:2407 +#: postmaster/postmaster.c:2353 #, c-format msgid "the database system is shutting down" msgstr "le système de base de données s'arrête" -#: postmaster/postmaster.c:2412 +#: postmaster/postmaster.c:2358 #, c-format msgid "the database system is in recovery mode" msgstr "le système de bases de données est en cours de restauration" -#: postmaster/postmaster.c:2417 storage/ipc/procarray.c:490 -#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 +#: postmaster/postmaster.c:2363 storage/ipc/procarray.c:491 +#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:353 #, c-format msgid "sorry, too many clients already" msgstr "désolé, trop de clients sont déjà connectés" -#: postmaster/postmaster.c:2504 +#: postmaster/postmaster.c:2450 #, c-format msgid "wrong key in cancel request for process %d" msgstr "mauvaise clé dans la demande d'annulation pour le processus %d" -#: postmaster/postmaster.c:2516 +#: postmaster/postmaster.c:2462 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "le PID %d dans la demande d'annulation ne correspond à aucun processus" -#: postmaster/postmaster.c:2770 +#: postmaster/postmaster.c:2729 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "a reçu SIGHUP, rechargement des fichiers de configuration" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2794 postmaster/postmaster.c:2798 +#: postmaster/postmaster.c:2753 postmaster/postmaster.c:2757 #, c-format msgid "%s was not reloaded" msgstr "%s n'a pas été rechargé" -#: postmaster/postmaster.c:2808 +#: postmaster/postmaster.c:2767 #, c-format msgid "SSL configuration was not reloaded" msgstr "la configuration SSL n'a pas été rechargée" -#: postmaster/postmaster.c:2864 +#: postmaster/postmaster.c:2857 #, c-format msgid "received smart shutdown request" msgstr "a reçu une demande d'arrêt intelligent" -#: postmaster/postmaster.c:2905 +#: postmaster/postmaster.c:2898 #, c-format msgid "received fast shutdown request" msgstr "a reçu une demande d'arrêt rapide" -#: postmaster/postmaster.c:2923 +#: postmaster/postmaster.c:2916 #, c-format msgid "aborting any active transactions" msgstr "annulation des transactions actives" -#: postmaster/postmaster.c:2947 +#: postmaster/postmaster.c:2940 #, c-format msgid "received immediate shutdown request" msgstr "a reçu une demande d'arrêt immédiat" -#: postmaster/postmaster.c:3024 +#: postmaster/postmaster.c:3016 #, c-format msgid "shutdown at recovery target" msgstr "arrêt sur la cible de restauration" -#: postmaster/postmaster.c:3042 postmaster/postmaster.c:3078 +#: postmaster/postmaster.c:3034 postmaster/postmaster.c:3070 msgid "startup process" msgstr "processus de lancement" -#: postmaster/postmaster.c:3045 +#: postmaster/postmaster.c:3037 #, c-format msgid "aborting startup due to startup process failure" msgstr "annulation du démarrage à cause d'un échec dans le processus de lancement" -#: postmaster/postmaster.c:3118 +#: postmaster/postmaster.c:3110 #, c-format msgid "database system is ready to accept connections" msgstr "le système de bases de données est prêt pour accepter les connexions" -#: postmaster/postmaster.c:3139 +#: postmaster/postmaster.c:3131 msgid "background writer process" msgstr "processus d'écriture en tâche de fond" -#: postmaster/postmaster.c:3186 +#: postmaster/postmaster.c:3178 msgid "checkpointer process" msgstr "processus checkpointer" -#: postmaster/postmaster.c:3202 +#: postmaster/postmaster.c:3194 msgid "WAL writer process" msgstr "processus d'écriture des journaux de transaction" -#: postmaster/postmaster.c:3217 +#: postmaster/postmaster.c:3209 msgid "WAL receiver process" msgstr "processus de réception des journaux de transaction" -#: postmaster/postmaster.c:3232 +#: postmaster/postmaster.c:3224 msgid "autovacuum launcher process" msgstr "processus de lancement de l'autovacuum" -#: postmaster/postmaster.c:3250 +#: postmaster/postmaster.c:3242 msgid "archiver process" msgstr "processus d'archivage" -#: postmaster/postmaster.c:3263 +#: postmaster/postmaster.c:3255 msgid "system logger process" msgstr "processus des journaux applicatifs" -#: postmaster/postmaster.c:3327 +#: postmaster/postmaster.c:3312 #, c-format msgid "background worker \"%s\"" msgstr "processus en tâche de fond « %s »" -#: postmaster/postmaster.c:3406 postmaster/postmaster.c:3426 -#: postmaster/postmaster.c:3433 postmaster/postmaster.c:3451 +#: postmaster/postmaster.c:3391 postmaster/postmaster.c:3411 +#: postmaster/postmaster.c:3418 postmaster/postmaster.c:3436 msgid "server process" msgstr "processus serveur" -#: postmaster/postmaster.c:3505 +#: postmaster/postmaster.c:3490 #, c-format msgid "terminating any other active server processes" msgstr "arrêt des autres processus serveur actifs" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3742 +#: postmaster/postmaster.c:3665 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) a quitté avec le code de sortie %d" -#: postmaster/postmaster.c:3744 postmaster/postmaster.c:3756 -#: postmaster/postmaster.c:3766 postmaster/postmaster.c:3777 +#: postmaster/postmaster.c:3667 postmaster/postmaster.c:3679 +#: postmaster/postmaster.c:3689 postmaster/postmaster.c:3700 #, c-format msgid "Failed process was running: %s" msgstr "Le processus qui a échoué exécutait : %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3753 +#: postmaster/postmaster.c:3676 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) a été arrêté par l'exception 0x%X" -#: postmaster/postmaster.c:3755 postmaster/shell_archive.c:134 -#, c-format -msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "" -"Voir le fichier d'en-tête C « ntstatus.h » pour une description de la valeur\n" -"hexadécimale." - #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3763 +#: postmaster/postmaster.c:3686 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) a été arrêté par le signal %d : %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3775 +#: postmaster/postmaster.c:3698 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) a quitté avec le statut inattendu %d" -#: postmaster/postmaster.c:3975 +#: postmaster/postmaster.c:3906 #, c-format msgid "abnormal database system shutdown" msgstr "le système de base de données a été arrêté anormalement" -#: postmaster/postmaster.c:4001 +#: postmaster/postmaster.c:3932 #, c-format msgid "shutting down due to startup process failure" msgstr "arrêt à cause d'un échec du processus startup" -#: postmaster/postmaster.c:4007 +#: postmaster/postmaster.c:3938 #, c-format msgid "shutting down because restart_after_crash is off" msgstr "arrêt parce que restart_after_crash est configuré à off" -#: postmaster/postmaster.c:4019 +#: postmaster/postmaster.c:3950 #, c-format msgid "all server processes terminated; reinitializing" msgstr "tous les processus serveur sont arrêtés ; réinitialisation" -#: postmaster/postmaster.c:4191 postmaster/postmaster.c:5527 -#: postmaster/postmaster.c:5925 +#: postmaster/postmaster.c:4144 postmaster/postmaster.c:5462 +#: postmaster/postmaster.c:5860 #, c-format msgid "could not generate random cancel key" msgstr "n'a pas pu générer la clé d'annulation aléatoire" -#: postmaster/postmaster.c:4253 +#: postmaster/postmaster.c:4206 #, c-format msgid "could not fork new process for connection: %m" msgstr "n'a pas pu lancer le nouveau processus fils pour la connexion : %m" -#: postmaster/postmaster.c:4295 +#: postmaster/postmaster.c:4248 msgid "could not fork new process for connection: " msgstr "n'a pas pu lancer le nouveau processus fils pour la connexion : " -#: postmaster/postmaster.c:4401 +#: postmaster/postmaster.c:4354 #, c-format msgid "connection received: host=%s port=%s" msgstr "connexion reçue : hôte=%s port=%s" -#: postmaster/postmaster.c:4406 +#: postmaster/postmaster.c:4359 #, c-format msgid "connection received: host=%s" msgstr "connexion reçue : hôte=%s" -#: postmaster/postmaster.c:4643 +#: postmaster/postmaster.c:4596 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "n'a pas pu exécuter le processus serveur « %s » : %m" -#: postmaster/postmaster.c:4701 +#: postmaster/postmaster.c:4654 #, c-format msgid "could not create backend parameter file mapping: error code %lu" msgstr "n'a pas pu créer le lien vers le fichier de paramètres du processus serveur : code d'erreur %lu" -#: postmaster/postmaster.c:4710 +#: postmaster/postmaster.c:4663 #, c-format msgid "could not map backend parameter memory: error code %lu" msgstr "n'a pas pu mapper la mémoire des paramètres du processus serveur : code d'erreur %lu" -#: postmaster/postmaster.c:4737 +#: postmaster/postmaster.c:4690 #, c-format msgid "subprocess command line too long" msgstr "ligne de commande du sous-processus trop longue" -#: postmaster/postmaster.c:4755 +#: postmaster/postmaster.c:4708 #, c-format msgid "CreateProcess() call failed: %m (error code %lu)" msgstr "échec de l'appel à CreateProcess() : %m (code d'erreur %lu)" -#: postmaster/postmaster.c:4782 +#: postmaster/postmaster.c:4735 #, c-format msgid "could not unmap view of backend parameter file: error code %lu" msgstr "n'a pas pu supprimer la vue du fichier paramètre du backend : code d'erreur %lu" -#: postmaster/postmaster.c:4786 +#: postmaster/postmaster.c:4739 #, c-format msgid "could not close handle to backend parameter file: error code %lu" msgstr "n'a pas pu fermer le lien vers le fichier de paramètres du processus serveur : code d'erreur %lu" -#: postmaster/postmaster.c:4808 +#: postmaster/postmaster.c:4761 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "abandon après trop de tentatives pour réserver la mémoire partagée" -#: postmaster/postmaster.c:4809 +#: postmaster/postmaster.c:4762 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "Ceci pourrait être causé par un logiciel ASLR ou un antivirus." -#: postmaster/postmaster.c:4990 +#: postmaster/postmaster.c:4935 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "la configuration SSL n'a pas pu être chargée dans le processus fils" -#: postmaster/postmaster.c:5115 +#: postmaster/postmaster.c:5060 #, c-format msgid "Please report this to <%s>." msgstr "Merci de signaler ceci à <%s>." -#: postmaster/postmaster.c:5187 +#: postmaster/postmaster.c:5128 #, c-format msgid "database system is ready to accept read-only connections" msgstr "le système de bases de données est prêt pour accepter les connexions en lecture seule" -#: postmaster/postmaster.c:5451 +#: postmaster/postmaster.c:5386 #, c-format msgid "could not fork startup process: %m" msgstr "n'a pas pu lancer le processus fils de démarrage : %m" -#: postmaster/postmaster.c:5455 +#: postmaster/postmaster.c:5390 #, c-format msgid "could not fork archiver process: %m" msgstr "n'a pas pu créer un processus fils d'archivage des journaux de transactions : %m" -#: postmaster/postmaster.c:5459 +#: postmaster/postmaster.c:5394 #, c-format msgid "could not fork background writer process: %m" msgstr "" "n'a pas pu créer un processus fils du processus d'écriture en tâche de\n" "fond : %m" -#: postmaster/postmaster.c:5463 +#: postmaster/postmaster.c:5398 #, c-format msgid "could not fork checkpointer process: %m" msgstr "n'a pas pu créer le processus checkpointer : %m" -#: postmaster/postmaster.c:5467 +#: postmaster/postmaster.c:5402 #, c-format msgid "could not fork WAL writer process: %m" msgstr "" "n'a pas pu créer un processus fils du processus d'écriture des journaux de\n" "transaction : %m" -#: postmaster/postmaster.c:5471 +#: postmaster/postmaster.c:5406 #, c-format msgid "could not fork WAL receiver process: %m" msgstr "" "n'a pas pu créer un processus fils de réception des journaux de\n" "transactions : %m" -#: postmaster/postmaster.c:5475 +#: postmaster/postmaster.c:5410 #, c-format msgid "could not fork process: %m" msgstr "n'a pas pu lancer le processus fils : %m" -#: postmaster/postmaster.c:5676 postmaster/postmaster.c:5703 +#: postmaster/postmaster.c:5611 postmaster/postmaster.c:5638 #, c-format msgid "database connection requirement not indicated during registration" msgstr "pré-requis de la connexion à la base non indiqué lors de l'enregistrement" -#: postmaster/postmaster.c:5687 postmaster/postmaster.c:5714 +#: postmaster/postmaster.c:5622 postmaster/postmaster.c:5649 #, c-format msgid "invalid processing mode in background worker" msgstr "mode de traitement invalide dans le processus en tâche de fond" -#: postmaster/postmaster.c:5799 +#: postmaster/postmaster.c:5734 #, c-format msgid "could not fork worker process: %m" msgstr "n'a pas pu créer un processus fils du processus en tâche de fond : %m" -#: postmaster/postmaster.c:5911 +#: postmaster/postmaster.c:5846 #, c-format msgid "no slot available for new worker process" msgstr "aucun slot disponible pour le nouveau processus worker" -#: postmaster/postmaster.c:6242 +#: postmaster/postmaster.c:6177 #, c-format msgid "could not duplicate socket %d for use in backend: error code %d" msgstr "n'a pas pu dupliquer la socket %d pour le serveur : code d'erreur %d" -#: postmaster/postmaster.c:6274 +#: postmaster/postmaster.c:6209 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "n'a pas pu créer la socket héritée : code d'erreur %d\n" -#: postmaster/postmaster.c:6303 +#: postmaster/postmaster.c:6238 #, c-format msgid "could not open backend variables file \"%s\": %s\n" msgstr "n'a pas pu ouvrir le fichier des variables moteurs « %s » : %s\n" -#: postmaster/postmaster.c:6310 +#: postmaster/postmaster.c:6245 #, c-format msgid "could not read from backend variables file \"%s\": %s\n" msgstr "n'a pas pu lire le fichier de configuration serveur « %s » : %s\n" -#: postmaster/postmaster.c:6319 +#: postmaster/postmaster.c:6254 #, c-format msgid "could not remove file \"%s\": %s\n" msgstr "n'a pas pu supprimer le fichier « %s » : %s\n" -#: postmaster/postmaster.c:6336 +#: postmaster/postmaster.c:6271 #, c-format msgid "could not map view of backend variables: error code %lu\n" msgstr "" "n'a pas pu exécuter \"map\" la vue des variables serveurs : code\n" "d'erreur %lu\n" -#: postmaster/postmaster.c:6345 +#: postmaster/postmaster.c:6280 #, c-format msgid "could not unmap view of backend variables: error code %lu\n" msgstr "" "n'a pas pu exécuter \"unmap\" sur la vue des variables serveurs : code\n" "d'erreur %lu\n" -#: postmaster/postmaster.c:6352 +#: postmaster/postmaster.c:6287 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "" "n'a pas pu fermer le lien vers les variables des paramètres du serveur :\n" "code d'erreur %lu\n" -#: postmaster/postmaster.c:6526 +#: postmaster/postmaster.c:6446 #, c-format msgid "could not read exit code for process\n" msgstr "n'a pas pu lire le code de sortie du processus\n" -#: postmaster/postmaster.c:6531 +#: postmaster/postmaster.c:6488 #, c-format msgid "could not post child completion status\n" msgstr "n'a pas pu poster le statut de fin de l'enfant\n" -#: postmaster/shell_archive.c:123 -#, c-format -msgid "archive command failed with exit code %d" -msgstr "échec de la commande d'archivage avec un code de retour %d" - -#: postmaster/shell_archive.c:125 postmaster/shell_archive.c:135 -#: postmaster/shell_archive.c:141 postmaster/shell_archive.c:150 -#, c-format -msgid "The failed archive command was: %s" -msgstr "La commande d'archivage qui a échoué était : %s" - -#: postmaster/shell_archive.c:132 -#, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "la commande d'archivage a été terminée par l'exception 0x%X" - -#: postmaster/shell_archive.c:139 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "la commande d'archivage a été terminée par le signal %d : %s" - -#: postmaster/shell_archive.c:148 -#, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "la commande d'archivage a quitté avec le statut non reconnu %d" - #: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format msgid "could not read from logger pipe: %m" @@ -20346,236 +20769,315 @@ msgstr "n'a pas pu déterminer le collationnement à utiliser pour une expressio msgid "nondeterministic collations are not supported for regular expressions" msgstr "les collationnements non déterministes ne sont pas supportés pour les expressions rationnelles" -#: repl_gram.y:303 repl_gram.y:335 +#: repl_gram.y:301 repl_gram.y:333 #, c-format msgid "invalid timeline %u" msgstr "timeline %u invalide" -#: repl_scanner.l:142 +#: repl_scanner.l:152 msgid "invalid streaming start location" msgstr "emplacement de démarrage du flux de réplication invalide" -#: repl_scanner.l:199 scan.l:724 -msgid "unterminated quoted string" -msgstr "chaîne entre guillemets non terminée" +#: replication/libpqwalreceiver/libpqwalreceiver.c:197 +#: replication/libpqwalreceiver/libpqwalreceiver.c:280 +#, fuzzy, c-format +#| msgid "Password required" +msgid "password is required" +msgstr "Mot de passe requis" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:198 +#, c-format +msgid "Non-superuser cannot connect if the server does not request a password." +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:199 +#, c-format +msgid "Target server's authentication method must be changed, or set password_required=false in the subscription parameters." +msgstr "" -#: replication/libpqwalreceiver/libpqwalreceiver.c:233 +#: replication/libpqwalreceiver/libpqwalreceiver.c:211 #, c-format msgid "could not clear search path: %s" msgstr "n'a pas pu effacer le search_path : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:273 +#: replication/libpqwalreceiver/libpqwalreceiver.c:257 #, c-format msgid "invalid connection string syntax: %s" msgstr "syntaxe de la chaîne de connexion invalide : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:299 +#: replication/libpqwalreceiver/libpqwalreceiver.c:281 +#, c-format +msgid "Non-superusers must provide a password in the connection string." +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:307 #, c-format msgid "could not parse connection string: %s" msgstr "n'a pas pu analyser la chaîne de connexion : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:372 +#: replication/libpqwalreceiver/libpqwalreceiver.c:380 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "" "n'a pas pu recevoir l'identifiant du système de bases de données et\n" "l'identifiant de la timeline à partir du serveur principal : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:384 -#: replication/libpqwalreceiver/libpqwalreceiver.c:622 +#: replication/libpqwalreceiver/libpqwalreceiver.c:392 +#: replication/libpqwalreceiver/libpqwalreceiver.c:635 #, c-format msgid "invalid response from primary server" msgstr "réponse invalide du serveur principal" -#: replication/libpqwalreceiver/libpqwalreceiver.c:385 +#: replication/libpqwalreceiver/libpqwalreceiver.c:393 #, c-format msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." msgstr "" "N'a pas pu identifier le système : a récupéré %d lignes et %d champs,\n" "attendait %d lignes et %d champs (ou plus)." -#: replication/libpqwalreceiver/libpqwalreceiver.c:465 -#: replication/libpqwalreceiver/libpqwalreceiver.c:472 -#: replication/libpqwalreceiver/libpqwalreceiver.c:502 +#: replication/libpqwalreceiver/libpqwalreceiver.c:478 +#: replication/libpqwalreceiver/libpqwalreceiver.c:485 +#: replication/libpqwalreceiver/libpqwalreceiver.c:515 #, c-format msgid "could not start WAL streaming: %s" msgstr "n'a pas pu démarrer l'envoi des WAL : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:526 +#: replication/libpqwalreceiver/libpqwalreceiver.c:539 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "n'a pas pu transmettre le message de fin d'envoi de flux au primaire : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:549 +#: replication/libpqwalreceiver/libpqwalreceiver.c:562 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "ensemble de résultats inattendu après la fin du flux de réplication" -#: replication/libpqwalreceiver/libpqwalreceiver.c:564 +#: replication/libpqwalreceiver/libpqwalreceiver.c:577 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "erreur lors de l'arrêt de la copie en flux : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:574 +#: replication/libpqwalreceiver/libpqwalreceiver.c:587 #, c-format msgid "error reading result of streaming command: %s" msgstr "erreur lors de la lecture de la commande de flux : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:583 -#: replication/libpqwalreceiver/libpqwalreceiver.c:821 +#: replication/libpqwalreceiver/libpqwalreceiver.c:596 +#: replication/libpqwalreceiver/libpqwalreceiver.c:832 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "résultat inattendu après CommandComplete : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:610 +#: replication/libpqwalreceiver/libpqwalreceiver.c:623 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "n'a pas pu recevoir le fichier historique à partir du serveur principal : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:623 +#: replication/libpqwalreceiver/libpqwalreceiver.c:636 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Attendait 1 ligne avec 2 champs, a obtenu %d lignes avec %d champs." -#: replication/libpqwalreceiver/libpqwalreceiver.c:784 -#: replication/libpqwalreceiver/libpqwalreceiver.c:837 -#: replication/libpqwalreceiver/libpqwalreceiver.c:844 +#: replication/libpqwalreceiver/libpqwalreceiver.c:795 +#: replication/libpqwalreceiver/libpqwalreceiver.c:848 +#: replication/libpqwalreceiver/libpqwalreceiver.c:855 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "n'a pas pu recevoir des données du flux de WAL : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:864 +#: replication/libpqwalreceiver/libpqwalreceiver.c:875 #, c-format msgid "could not send data to WAL stream: %s" msgstr "n'a pas pu transmettre les données au flux WAL : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:956 +#: replication/libpqwalreceiver/libpqwalreceiver.c:967 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "n'a pas pu créer le slot de réplication « %s » : %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1002 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1013 #, c-format msgid "invalid query response" msgstr "réponse à la requête invalide" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1003 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1014 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Attendait %d champs, a obtenu %d champs." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1073 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1084 #, c-format msgid "the query interface requires a database connection" msgstr "l'interface de la requête requiert une connexion à une base" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1104 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1115 msgid "empty query" msgstr "requête vide" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1110 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1121 msgid "unexpected pipeline mode" msgstr "mode pipeline inattendu" -#: replication/logical/launcher.c:285 +#: replication/logical/applyparallelworker.c:719 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" has started" +msgid "logical replication parallel apply worker for subscription \"%s\" has finished" +msgstr "le processus apply de réplication logique pour la souscription « %s » a démarré" + +#: replication/logical/applyparallelworker.c:825 +#, fuzzy, c-format +#| msgid "lost connection to parallel worker" +msgid "lost connection to the logical replication apply worker" +msgstr "perte de la connexion au processus parallèle" + +#: replication/logical/applyparallelworker.c:1027 +#: replication/logical/applyparallelworker.c:1029 +#, fuzzy +#| msgid "logical replication launcher started" +msgid "logical replication parallel apply worker" +msgstr "lancement du processus de lancement de la réplication logique" + +#: replication/logical/applyparallelworker.c:1043 +#, fuzzy, c-format +#| msgid "terminating logical replication worker due to timeout" +msgid "logical replication parallel apply worker exited due to error" +msgstr "arrêt du processus worker de la réplication logique suite à l'expiration du délai de réplication" + +#: replication/logical/applyparallelworker.c:1130 +#: replication/logical/applyparallelworker.c:1303 +#, fuzzy, c-format +#| msgid "lost connection to parallel worker" +msgid "lost connection to the logical replication parallel apply worker" +msgstr "perte de la connexion au processus parallèle" + +#: replication/logical/applyparallelworker.c:1183 +#, fuzzy, c-format +#| msgid "could not send tuple to shared-memory queue" +msgid "could not send data to shared-memory queue" +msgstr "n'a pas pu envoyer la ligne dans la queue en mémoire partagée" + +#: replication/logical/applyparallelworker.c:1218 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" +msgid "logical replication apply worker will serialize the remaining changes of remote transaction %u to a file" +msgstr "le processus apply de réplication logique pour la souscription %u ne démarrera pas car la souscription a été désactivée au démarrage" + +#: replication/logical/decode.c:180 replication/logical/logical.c:140 +#, fuzzy, c-format +#| msgid "logical decoding requires wal_level >= logical" +msgid "logical decoding on standby requires wal_level >= logical on the primary" +msgstr "le décodage logique requiert wal_level >= logical" + +#: replication/logical/launcher.c:331 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "ne peut pas démarrer les processus worker de la réplication logique quand max_replication_slots = 0" -#: replication/logical/launcher.c:365 +#: replication/logical/launcher.c:424 #, c-format msgid "out of logical replication worker slots" msgstr "plus de slots de processus worker pour la réplication logique" -#: replication/logical/launcher.c:366 -#, c-format -msgid "You might need to increase max_logical_replication_workers." -msgstr "Vous pourriez avoir besoin d'augmenter max_logical_replication_workers." +#: replication/logical/launcher.c:425 replication/logical/launcher.c:499 +#: replication/slot.c:1297 storage/lmgr/lock.c:964 storage/lmgr/lock.c:1002 +#: storage/lmgr/lock.c:2787 storage/lmgr/lock.c:4172 storage/lmgr/lock.c:4237 +#: storage/lmgr/lock.c:4587 storage/lmgr/predicate.c:2413 +#: storage/lmgr/predicate.c:2428 storage/lmgr/predicate.c:3825 +#, fuzzy, c-format +#| msgid "You might need to initdb." +msgid "You might need to increase %s." +msgstr "Vous pouvez avoir besoin d'exécuter initdb." -#: replication/logical/launcher.c:422 +#: replication/logical/launcher.c:498 #, c-format msgid "out of background worker slots" msgstr "plus de slots de processus en tâche de fond" -#: replication/logical/launcher.c:423 -#, c-format -msgid "You might need to increase max_worker_processes." -msgstr "Vous pourriez avoir besoin d'augmenter max_worker_processes." - -#: replication/logical/launcher.c:577 +#: replication/logical/launcher.c:705 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "le slot %d du processus de réplication logique est vide, ne peut pas s'y attacher" -#: replication/logical/launcher.c:586 +#: replication/logical/launcher.c:714 #, c-format msgid "logical replication worker slot %d is already used by another worker, cannot attach" msgstr "le slot %d du processus de réplication logique est déjà utilisé par un autre processus, ne peut pas s'attacher" -#: replication/logical/logical.c:115 +#: replication/logical/logical.c:120 #, c-format msgid "logical decoding requires wal_level >= logical" msgstr "le décodage logique requiert wal_level >= logical" -#: replication/logical/logical.c:120 +#: replication/logical/logical.c:125 #, c-format msgid "logical decoding requires a database connection" msgstr "le décodage logique requiert une connexion à une base" -#: replication/logical/logical.c:138 -#, c-format -msgid "logical decoding cannot be used while in recovery" -msgstr "le décodage logique ne peut pas être utilisé lors de la restauration" - -#: replication/logical/logical.c:348 replication/logical/logical.c:502 +#: replication/logical/logical.c:363 replication/logical/logical.c:517 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "ne peut pas utiliser un slot de réplication physique pour le décodage logique" -#: replication/logical/logical.c:353 replication/logical/logical.c:507 +#: replication/logical/logical.c:368 replication/logical/logical.c:522 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "le slot de réplication « %s » n'a pas été créé dans cette base de données" -#: replication/logical/logical.c:360 +#: replication/logical/logical.c:375 #, c-format msgid "cannot create logical replication slot in transaction that has performed writes" msgstr "ne peut pas créer un slot de réplication logique dans une transaction qui a fait des écritures" -#: replication/logical/logical.c:570 +#: replication/logical/logical.c:534 replication/logical/logical.c:541 +#, c-format +msgid "can no longer get changes from replication slot \"%s\"" +msgstr "ne peut plus obtenir de modifications à partir du slot de réplication « %s »" + +#: replication/logical/logical.c:536 +#, c-format +msgid "This slot has been invalidated because it exceeded the maximum reserved size." +msgstr "Ce slot a été invalidé parce qu'il dépassait la taille maximale réservée." + +#: replication/logical/logical.c:543 +#, fuzzy, c-format +#| msgid "This slot has been invalidated because it exceeded the maximum reserved size." +msgid "This slot has been invalidated because it was conflicting with recovery." +msgstr "Ce slot a été invalidé parce qu'il dépassait la taille maximale réservée." + +#: replication/logical/logical.c:608 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "début du décodage logique pour le slot « %s »" -#: replication/logical/logical.c:572 +#: replication/logical/logical.c:610 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Envoi des transactions validées après %X/%X, lecture des journaux à partir de %X/%X." -#: replication/logical/logical.c:720 +#: replication/logical/logical.c:758 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "slot « %s », plugin de sortie « %s », dans la fonction d'appel %s, associé au LSN %X/%X" -#: replication/logical/logical.c:726 +#: replication/logical/logical.c:764 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "slot « %s », plugin de sortie « %s », dans la fonction d'appel %s" -#: replication/logical/logical.c:897 replication/logical/logical.c:942 -#: replication/logical/logical.c:987 replication/logical/logical.c:1033 +#: replication/logical/logical.c:935 replication/logical/logical.c:980 +#: replication/logical/logical.c:1025 replication/logical/logical.c:1071 #, c-format msgid "logical replication at prepare time requires a %s callback" msgstr "la réplication logique lors de la préparation requiert la fonction %s" -#: replication/logical/logical.c:1265 replication/logical/logical.c:1314 -#: replication/logical/logical.c:1355 replication/logical/logical.c:1441 -#: replication/logical/logical.c:1490 +#: replication/logical/logical.c:1303 replication/logical/logical.c:1352 +#: replication/logical/logical.c:1393 replication/logical/logical.c:1479 +#: replication/logical/logical.c:1528 #, c-format msgid "logical streaming requires a %s callback" msgstr "le flux logique requiert une fonction %s" -#: replication/logical/logical.c:1400 +#: replication/logical/logical.c:1438 #, c-format msgid "logical streaming at prepare time requires a %s callback" msgstr "le flux logique lors de la préparation requiert la fonction %s" @@ -20600,847 +21102,907 @@ msgstr "le tableau doit avoir une dimension" msgid "array must not contain nulls" msgstr "le tableau ne doit pas contenir de valeurs NULL" -#: replication/logical/logicalfuncs.c:181 utils/adt/json.c:1128 -#: utils/adt/jsonb.c:1302 +#: replication/logical/logicalfuncs.c:180 utils/adt/json.c:1484 +#: utils/adt/jsonb.c:1403 #, c-format msgid "array must have even number of elements" msgstr "le tableau doit avoir un nombre pair d'éléments" #: replication/logical/logicalfuncs.c:227 #, c-format -msgid "can no longer get changes from replication slot \"%s\"" -msgstr "ne peut plus obtenir de modifications à partir du slot de réplication « %s »" +msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" +msgstr "le plugin de sortie « %s » pour le décodage logique produit une sortie binaire, mais la fonction « %s » attend des données texte" -#: replication/logical/logicalfuncs.c:229 replication/slotfuncs.c:616 -#, c-format -msgid "This slot has never previously reserved WAL, or it has been invalidated." -msgstr "Ce slot n'a jamais réservé de WAL précédemment, ou a été invalidé." - -#: replication/logical/logicalfuncs.c:241 -#, c-format -msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" -msgstr "le plugin de sortie « %s » pour le décodage logique produit une sortie binaire, mais la fonction « %s » attend des données texte" - -#: replication/logical/origin.c:189 +#: replication/logical/origin.c:190 #, c-format msgid "cannot query or manipulate replication origin when max_replication_slots = 0" -msgstr "ne peut pas lire ou manipuler une originie de réplication logique quand max_replication_slots = 0" +msgstr "ne peut pas lire ou manipuler une origine de réplication logique quand max_replication_slots = 0" -#: replication/logical/origin.c:194 +#: replication/logical/origin.c:195 #, c-format msgid "cannot manipulate replication origins during recovery" msgstr "ne peut pas manipuler les origines de réplication lors d'une restauration" -#: replication/logical/origin.c:228 +#: replication/logical/origin.c:240 #, c-format msgid "replication origin \"%s\" does not exist" msgstr "l'origine de réplication « %s » n'existe pas" -#: replication/logical/origin.c:319 +#: replication/logical/origin.c:331 #, fuzzy, c-format #| msgid "could not find free replication origin OID" msgid "could not find free replication origin ID" msgstr "n'a pas pu trouver d'OID d'origine de réplication libre" -#: replication/logical/origin.c:355 +#: replication/logical/origin.c:365 #, fuzzy, c-format #| msgid "could not drop replication origin with OID %d, in use by PID %d" msgid "could not drop replication origin with ID %d, in use by PID %d" msgstr "ne peut pas supprimer l'origine de réplication d'OID %d, utilisée par le PID %d" -#: replication/logical/origin.c:476 +#: replication/logical/origin.c:492 #, fuzzy, c-format #| msgid "replication origin with OID %u does not exist" msgid "replication origin with ID %d does not exist" msgstr "l'origine de réplication d'OID %u n'existe pas" -#: replication/logical/origin.c:741 +#: replication/logical/origin.c:757 #, c-format msgid "replication checkpoint has wrong magic %u instead of %u" msgstr "le checkpoint de réplication a le mauvais nombre magique (%u au lieu de %u)" -#: replication/logical/origin.c:782 +#: replication/logical/origin.c:798 #, c-format msgid "could not find free replication state, increase max_replication_slots" msgstr "n'a pas pu trouver d'état de réplication libre, augmentez max_replication_slots" -#: replication/logical/origin.c:790 +#: replication/logical/origin.c:806 #, fuzzy, c-format #| msgid "recovered replication state of node %u to %X/%X" msgid "recovered replication state of node %d to %X/%X" msgstr "restauration de l'état de réplication du nÅ“ud %u à %X/%X" -#: replication/logical/origin.c:800 +#: replication/logical/origin.c:816 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "le point de contrôle du slot de réplication à la mauvaise somme de contrôle %u, %u attendu" -#: replication/logical/origin.c:928 replication/logical/origin.c:1117 +#: replication/logical/origin.c:944 replication/logical/origin.c:1141 #, fuzzy, c-format #| msgid "replication origin with OID %d is already active for PID %d" msgid "replication origin with ID %d is already active for PID %d" msgstr "l'origine de réplication d'OID %d est déjà active pour le PID %d" -#: replication/logical/origin.c:939 replication/logical/origin.c:1129 +#: replication/logical/origin.c:955 replication/logical/origin.c:1153 #, fuzzy, c-format #| msgid "could not find free replication state slot for replication origin with OID %u" msgid "could not find free replication state slot for replication origin with ID %d" msgstr "n'a pas pu trouver de slot d'état de réplication libre pour l'origine de réplication d'OID %u" -#: replication/logical/origin.c:941 replication/logical/origin.c:1131 -#: replication/slot.c:1947 +#: replication/logical/origin.c:957 replication/logical/origin.c:1155 +#: replication/slot.c:2093 #, c-format msgid "Increase max_replication_slots and try again." msgstr "Augmentez max_replication_slots et recommencez." -#: replication/logical/origin.c:1088 +#: replication/logical/origin.c:1112 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "ne peut pas configurer l'origine de réplication si une origine existe déjà" -#: replication/logical/origin.c:1168 replication/logical/origin.c:1380 -#: replication/logical/origin.c:1400 +#: replication/logical/origin.c:1196 replication/logical/origin.c:1412 +#: replication/logical/origin.c:1432 #, c-format msgid "no replication origin is configured" msgstr "aucune origine de réplication n'est configurée" -#: replication/logical/origin.c:1251 +#: replication/logical/origin.c:1282 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "le nom d'origine de réplication « %s » est réservé" -#: replication/logical/origin.c:1253 -#, c-format -msgid "Origin names starting with \"pg_\" are reserved." +#: replication/logical/origin.c:1284 +#, fuzzy, c-format +#| msgid "Origin names starting with \"pg_\" are reserved." +msgid "Origin names \"%s\", \"%s\", and names starting with \"pg_\" are reserved." msgstr "Les noms d'origine commençant par « pg_ » sont réservés." -#: replication/logical/relation.c:234 +#: replication/logical/relation.c:240 #, c-format msgid "\"%s\"" msgstr "\"%s\"" -#: replication/logical/relation.c:237 +#: replication/logical/relation.c:243 #, c-format msgid ", \"%s\"" msgstr ", \"%s\"" -#: replication/logical/relation.c:243 +#: replication/logical/relation.c:249 #, c-format msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" msgstr[0] "il manque une colonne répliquée à la relation cible de la réplication logique « %s.%s » : %s" msgstr[1] "il manque plusieurs colonnes répliquées à la relation cible de la réplication logique « %s.%s » : %s" -#: replication/logical/relation.c:298 +#: replication/logical/relation.c:304 #, c-format msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" msgstr "la relation cible « %s.%s » de réplication logique utilise des colonnes systèmes dans l'index REPLICA IDENTITY" -#: replication/logical/relation.c:390 +#: replication/logical/relation.c:396 #, c-format msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "la relation cible de la réplication logique « %s.%s » n'existe pas" -#: replication/logical/reorderbuffer.c:3831 +#: replication/logical/reorderbuffer.c:3936 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "n'a pas pu écrire dans le fichier pour le XID %u : %m" -#: replication/logical/reorderbuffer.c:4177 -#: replication/logical/reorderbuffer.c:4202 +#: replication/logical/reorderbuffer.c:4282 +#: replication/logical/reorderbuffer.c:4307 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "n'a pas pu lire le fichier « reorderbuffer spill » : %m" -#: replication/logical/reorderbuffer.c:4181 -#: replication/logical/reorderbuffer.c:4206 +#: replication/logical/reorderbuffer.c:4286 +#: replication/logical/reorderbuffer.c:4311 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "" "n'a pas pu lire à partir du fichier « reorderbuffer spill » : a lu seulement %d octets\n" "sur %u" -#: replication/logical/reorderbuffer.c:4456 +#: replication/logical/reorderbuffer.c:4561 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "n'a pas pu supprimer le fichier « %s » pendant la suppression de pg_replslot/%s/xid* : %m" -#: replication/logical/reorderbuffer.c:4955 +#: replication/logical/reorderbuffer.c:5057 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "n'a pas pu lire à partir du fichier « %s » : lu %d octets au lieu de %d octets" -#: replication/logical/snapbuild.c:634 +#: replication/logical/snapbuild.c:639 #, c-format msgid "initial slot snapshot too large" msgstr "snapshot du slot initial trop gros" -#: replication/logical/snapbuild.c:688 +#: replication/logical/snapbuild.c:693 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" msgstr[0] "snapshot exporté pour le décodage logique : « %s » avec %u identifiant de transaction" msgstr[1] "snapshot exporté pour le décodage logique : « %s » avec %u identifiants de transaction" -#: replication/logical/snapbuild.c:1367 replication/logical/snapbuild.c:1474 -#: replication/logical/snapbuild.c:2003 +#: replication/logical/snapbuild.c:1388 replication/logical/snapbuild.c:1480 +#: replication/logical/snapbuild.c:1996 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "le décodage logique a trouvé le point de cohérence à %X/%X" -#: replication/logical/snapbuild.c:1369 +#: replication/logical/snapbuild.c:1390 #, c-format msgid "There are no running transactions." msgstr "Il n'existe pas de transactions en cours." -#: replication/logical/snapbuild.c:1425 +#: replication/logical/snapbuild.c:1432 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "le décodage logique a trouvé le point de démarrage à %X/%X" -#: replication/logical/snapbuild.c:1427 replication/logical/snapbuild.c:1451 +#: replication/logical/snapbuild.c:1434 replication/logical/snapbuild.c:1458 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "En attente de transactions (approximativement %d) plus anciennes que %u pour terminer." -#: replication/logical/snapbuild.c:1449 +#: replication/logical/snapbuild.c:1456 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "le décodage logique a trouvé le point de cohérence initial à %X/%X" -#: replication/logical/snapbuild.c:1476 +#: replication/logical/snapbuild.c:1482 #, c-format msgid "There are no old transactions anymore." msgstr "Il n'existe plus d'anciennes transactions." -#: replication/logical/snapbuild.c:1871 +#: replication/logical/snapbuild.c:1883 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "le fichier d'état snapbuild « %s » a le nombre magique: %u au lieu de %u" -#: replication/logical/snapbuild.c:1877 +#: replication/logical/snapbuild.c:1889 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "le fichier d'état snapbuild « %s » a une version non supportée : %u au lieu de %u" -#: replication/logical/snapbuild.c:1948 +#: replication/logical/snapbuild.c:1930 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "" "différence de somme de contrôle pour lefichier d'état snapbuild %s :\n" "est %u, devrait être %u" -#: replication/logical/snapbuild.c:2005 +#: replication/logical/snapbuild.c:1998 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Le décodage logique commencera en utilisant un snapshot sauvegardé." -#: replication/logical/snapbuild.c:2077 +#: replication/logical/snapbuild.c:2105 #, c-format msgid "could not parse file name \"%s\"" msgstr "n'a pas pu analyser le mode du fichier « %s »" -#: replication/logical/tablesync.c:151 +#: replication/logical/tablesync.c:153 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "le worker de synchronisation de table en réplication logique pour la souscription « %s », table « %s », a terminé" -#: replication/logical/tablesync.c:422 +#: replication/logical/tablesync.c:622 #, fuzzy, c-format #| msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" msgid "logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled" msgstr "le processus apply de réplication logique pour la souscription « %s » redémarrera car un paramètre a été modifié" -#: replication/logical/tablesync.c:731 replication/logical/tablesync.c:872 +#: replication/logical/tablesync.c:797 replication/logical/tablesync.c:939 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "n'a pas pu récupérer l'information sur la table « %s.%s » à partir du publieur : %s" -#: replication/logical/tablesync.c:738 +#: replication/logical/tablesync.c:804 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "table « %s.%s » non trouvée sur le publieur" -#: replication/logical/tablesync.c:795 +#: replication/logical/tablesync.c:862 #, fuzzy, c-format #| msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" msgstr "n'a pas pu récupérer l'information sur la table « %s.%s » à partir du publieur : %s" -#: replication/logical/tablesync.c:974 +#: replication/logical/tablesync.c:1041 #, fuzzy, c-format #| msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" msgstr "n'a pas pu récupérer l'information sur la table « %s.%s » à partir du publieur : %s" -#: replication/logical/tablesync.c:1111 +#: replication/logical/tablesync.c:1192 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "n'a pas pu lancer la copie initiale du contenu de la table « %s.%s » : %s" -#: replication/logical/tablesync.c:1323 replication/logical/worker.c:1635 -#, c-format -msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" -msgstr "" - -#: replication/logical/tablesync.c:1338 +#: replication/logical/tablesync.c:1393 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "la copie de table n'a pas pu démarrer la transaction sur le publieur : %s" -#: replication/logical/tablesync.c:1380 +#: replication/logical/tablesync.c:1435 #, c-format msgid "replication origin \"%s\" already exists" msgstr "l'origine de réplication « %s » existe déjà" -#: replication/logical/tablesync.c:1393 +#: replication/logical/tablesync.c:1468 replication/logical/worker.c:2374 +#, c-format +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "" + +#: replication/logical/tablesync.c:1481 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "la copie de table n'a pas pu finir la transaction sur le publieur : %s" -#: replication/logical/worker.c:671 replication/logical/worker.c:786 +#: replication/logical/worker.c:499 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" has started" +msgid "logical replication parallel apply worker for subscription \"%s\" will stop" +msgstr "le processus apply de réplication logique pour la souscription « %s » a démarré" + +#: replication/logical/worker.c:501 +#, c-format +msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." +msgstr "" + +#: replication/logical/worker.c:863 replication/logical/worker.c:978 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "format des données binaires incorrect dans la colonne de réplication logique %d" -#: replication/logical/worker.c:1417 replication/logical/worker.c:1432 -#, fuzzy, c-format -#| msgid "could not read from streaming transaction's changes file \"%s\": %m" -msgid "could not read from streaming transaction's changes file \"%s\": read only %zu of %zu bytes" -msgstr "n'a pas pu lire à partir du fichier de changements de transaction en flux « %s » : %m" - -#: replication/logical/worker.c:1761 +#: replication/logical/worker.c:2513 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "le publieur n'a pas envoyé la colonne d'identité du réplicat attendue par la relation cible « %s.%s » de la réplication logique" -#: replication/logical/worker.c:1768 +#: replication/logical/worker.c:2520 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "la relation cible « %s.%s » de réplication logique n'a ni un index REPLICA IDENTITY ni une clé primaire, et la relation publiée n'a pas REPLICA IDENTITY FULL" -#: replication/logical/worker.c:2582 -#, c-format -msgid "invalid logical replication message type \"%c\"" +#: replication/logical/worker.c:3384 +#, fuzzy, c-format +#| msgid "invalid logical replication message type \"%c\"" +msgid "invalid logical replication message type \"??? (%d)\"" msgstr "type de message « %c » de la réplication logique invalide" -#: replication/logical/worker.c:2746 +#: replication/logical/worker.c:3556 #, c-format msgid "data stream from publisher has ended" msgstr "le flux de données provenant du publieur s'est terminé" -#: replication/logical/worker.c:2897 +#: replication/logical/worker.c:3713 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "arrêt du processus worker de la réplication logique suite à l'expiration du délai de réplication" -#: replication/logical/worker.c:3059 -#, c-format -msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" +#: replication/logical/worker.c:3907 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" msgstr "le processus apply de réplication logique pour la souscription « %s » s'arrêtera car la souscription a été supprimée" -#: replication/logical/worker.c:3070 -#, c-format -msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" +#: replication/logical/worker.c:3920 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "le processus apply de réplication logique pour la souscription « %s » s'arrêtera car la souscription a été désactivée" -#: replication/logical/worker.c:3096 -#, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" +#: replication/logical/worker.c:3951 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" +msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" msgstr "le processus apply de réplication logique pour la souscription « %s » redémarrera car un paramètre a été modifié" -#: replication/logical/worker.c:3220 replication/logical/worker.c:3245 +#: replication/logical/worker.c:3955 #, fuzzy, c-format -#| msgid "could not read from streaming transaction's subxact file \"%s\": %m" -msgid "could not read from streaming transaction's subxact file \"%s\": read only %zu of %zu bytes" -msgstr "n'a pas pu lire à partir du fichier subxact de transaction en flux « %s » : %m" +#| msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" +msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" +msgstr "le processus apply de réplication logique pour la souscription « %s » redémarrera car un paramètre a été modifié" -#: replication/logical/worker.c:3645 -#, c-format -msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" +#: replication/logical/worker.c:4478 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" +msgid "logical replication worker for subscription %u will not start because the subscription was removed during startup" msgstr "le processus apply de réplication logique pour la souscription %u ne démarrera pas car la souscription a été désactivée au démarrage" -#: replication/logical/worker.c:3657 -#, c-format -msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" +#: replication/logical/worker.c:4493 +#, fuzzy, c-format +#| msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" +msgid "logical replication worker for subscription \"%s\" will not start because the subscription was disabled during startup" msgstr "le processus apply de réplication logique pour la souscription « %s » ne démarrera pas car la souscription a été désactivée au démarrage" -#: replication/logical/worker.c:3675 +#: replication/logical/worker.c:4510 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "le processus de synchronisation des tables en réplication logique pour la souscription « %s », table « %s » a démarré" -#: replication/logical/worker.c:3679 +#: replication/logical/worker.c:4515 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "le processus apply de réplication logique pour la souscription « %s » a démarré" -#: replication/logical/worker.c:3720 +#: replication/logical/worker.c:4590 #, c-format msgid "subscription has no replication slot set" msgstr "la souscription n'a aucun ensemble de slot de réplication" -#: replication/logical/worker.c:3856 +#: replication/logical/worker.c:4757 #, fuzzy, c-format #| msgid "cursor \"%s\" has been declared but not opened" msgid "subscription \"%s\" has been disabled because of an error" msgstr "le curseur « %s » est déclaré mais non ouvert" -#: replication/logical/worker.c:3895 +#: replication/logical/worker.c:4805 #, fuzzy, c-format #| msgid "cannot create logical replication slot in transaction that has performed writes" msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "ne peut pas créer un slot de réplication logique dans une transaction qui a fait des écritures" -#: replication/logical/worker.c:3909 +#: replication/logical/worker.c:4819 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "" -#: replication/logical/worker.c:3991 +#: replication/logical/worker.c:4901 #, fuzzy, c-format #| msgid "subscription \"%s\" already exists" msgid "skip-LSN of subscription \"%s\" cleared" msgstr "la souscription « %s » existe déjà" -#: replication/logical/worker.c:3992 +#: replication/logical/worker.c:4902 #, c-format msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." msgstr "" -#: replication/logical/worker.c:4018 +#: replication/logical/worker.c:4928 #, fuzzy, c-format #| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s »" -#: replication/logical/worker.c:4022 +#: replication/logical/worker.c:4932 #, fuzzy, c-format #| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s »" -#: replication/logical/worker.c:4027 +#: replication/logical/worker.c:4937 #, fuzzy, c-format #| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s »" -#: replication/logical/worker.c:4034 +#: replication/logical/worker.c:4948 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u" +msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s »" + +#: replication/logical/worker.c:4955 #, fuzzy, c-format #| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s »" -#: replication/logical/worker.c:4042 +#: replication/logical/worker.c:4966 +#, fuzzy, c-format +#| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u" +msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s »" + +#: replication/logical/worker.c:4974 #, fuzzy, c-format #| msgid "processing remote data for replication target relation \"%s.%s\" column \"%s\"" msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" msgstr "traitement des données distantes pour la relation cible « %s.%s » de réplication logique, colonne « %s »" -#: replication/pgoutput/pgoutput.c:319 +#: replication/pgoutput/pgoutput.c:317 #, c-format msgid "invalid proto_version" msgstr "proto_version invalide" -#: replication/pgoutput/pgoutput.c:324 +#: replication/pgoutput/pgoutput.c:322 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version « %s » en dehors des limites" -#: replication/pgoutput/pgoutput.c:341 +#: replication/pgoutput/pgoutput.c:339 #, c-format msgid "invalid publication_names syntax" msgstr "syntaxe publication_names invalide" -#: replication/pgoutput/pgoutput.c:425 -#, c-format -msgid "client sent proto_version=%d but we only support protocol %d or lower" +#: replication/pgoutput/pgoutput.c:440 +#, fuzzy, c-format +#| msgid "client sent proto_version=%d but we only support protocol %d or lower" +msgid "client sent proto_version=%d but server only supports protocol %d or lower" msgstr "le client a envoyé proto_version=%d mais nous supportons seulement le protocole %d et les protocoles antérieurs" -#: replication/pgoutput/pgoutput.c:431 -#, c-format -msgid "client sent proto_version=%d but we only support protocol %d or higher" +#: replication/pgoutput/pgoutput.c:446 +#, fuzzy, c-format +#| msgid "client sent proto_version=%d but we only support protocol %d or higher" +msgid "client sent proto_version=%d but server only supports protocol %d or higher" msgstr "le client a envoyé proto_version=%d mais nous supportons seulement le protocole %d et les protocoles supérieurs" -#: replication/pgoutput/pgoutput.c:437 +#: replication/pgoutput/pgoutput.c:452 #, c-format msgid "publication_names parameter missing" msgstr "paramètre publication_names manquant" -#: replication/pgoutput/pgoutput.c:450 +#: replication/pgoutput/pgoutput.c:466 #, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" msgstr "proto_version=%d demandé, mais ne supporte par le flux, nécessite %d ou supérieur" -#: replication/pgoutput/pgoutput.c:455 +#: replication/pgoutput/pgoutput.c:472 +#, fuzzy, c-format +#| msgid "requested proto_version=%d does not support streaming, need %d or higher" +msgid "requested proto_version=%d does not support parallel streaming, need %d or higher" +msgstr "proto_version=%d demandé, mais ne supporte par le flux, nécessite %d ou supérieur" + +#: replication/pgoutput/pgoutput.c:477 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "flux demandé, mais non supporté par le plugin de sortie" -#: replication/pgoutput/pgoutput.c:472 +#: replication/pgoutput/pgoutput.c:494 #, fuzzy, c-format #| msgid "requested proto_version=%d does not support streaming, need %d or higher" msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" msgstr "proto_version=%d demandé, mais ne supporte par le flux, nécessite %d ou supérieur" -#: replication/pgoutput/pgoutput.c:477 +#: replication/pgoutput/pgoutput.c:499 #, fuzzy, c-format #| msgid "streaming requested, but not supported by output plugin" msgid "two-phase commit requested, but not supported by output plugin" msgstr "flux demandé, mais non supporté par le plugin de sortie" -#: replication/slot.c:205 +#: replication/slot.c:207 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "le nom du slot de réplication « %s » est trop court" -#: replication/slot.c:214 +#: replication/slot.c:216 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "le nom du slot de réplication « %s » est trop long" -#: replication/slot.c:227 +#: replication/slot.c:229 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "le nom du slot de réplication « %s » contient un caractère invalide" -#: replication/slot.c:229 +#: replication/slot.c:231 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "Les noms des slots de réplication peuvent seulement contenir des lettres, des nombres et des tirets bas." -#: replication/slot.c:283 +#: replication/slot.c:285 #, c-format msgid "replication slot \"%s\" already exists" msgstr "le slot de réplication « %s » existe déjà" -#: replication/slot.c:293 +#: replication/slot.c:295 #, c-format msgid "all replication slots are in use" msgstr "tous les slots de réplication sont utilisés" -#: replication/slot.c:294 +#: replication/slot.c:296 #, c-format msgid "Free one or increase max_replication_slots." msgstr "Libérez un slot ou augmentez max_replication_slots." -#: replication/slot.c:472 replication/slotfuncs.c:727 -#: utils/activity/pgstat_replslot.c:55 utils/adt/genfile.c:704 +#: replication/slot.c:474 replication/slotfuncs.c:736 +#: utils/activity/pgstat_replslot.c:55 utils/adt/genfile.c:774 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "le slot de réplication « %s » n'existe pas" -#: replication/slot.c:518 replication/slot.c:1093 +#: replication/slot.c:520 replication/slot.c:1110 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "le slot de réplication « %s » est actif pour le PID %d" -#: replication/slot.c:754 replication/slot.c:1499 replication/slot.c:1882 +#: replication/slot.c:756 replication/slot.c:1645 replication/slot.c:2028 #, c-format msgid "could not remove directory \"%s\"" msgstr "n'a pas pu supprimer le répertoire « %s »" -#: replication/slot.c:1128 +#: replication/slot.c:1145 #, c-format msgid "replication slots can only be used if max_replication_slots > 0" msgstr "les slots de réplications peuvent seulement être utilisés si max_replication_slots > 0" -#: replication/slot.c:1133 +#: replication/slot.c:1150 #, c-format msgid "replication slots can only be used if wal_level >= replica" msgstr "les slots de réplication peuvent seulement être utilisés si wal_level >= replica" -#: replication/slot.c:1145 +#: replication/slot.c:1162 +#, fuzzy, c-format +#| msgid "permission denied for publication %s" +msgid "permission denied to use replication slots" +msgstr "droit refusé pour la publication %s" + +#: replication/slot.c:1163 #, c-format -msgid "must be superuser or replication role to use replication slots" +msgid "Only roles with the %s attribute may use replication slots." msgstr "" -"doit être un superutilisateur ou un rôle ayant l'attribut de réplication\n" -"pour utiliser des slots de réplication" -#: replication/slot.c:1330 +#: replication/slot.c:1271 +#, c-format +msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu byte." +msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." +msgstr[0] "" +msgstr[1] "" + +#: replication/slot.c:1279 +#, fuzzy, c-format +#| msgid "Key %s conflicts with existing key %s." +msgid "The slot conflicted with xid horizon %u." +msgstr "La clé %s est en conflit avec la clé existante %s." + +#: replication/slot.c:1284 +#, fuzzy +#| msgid "logical decoding requires wal_level >= logical" +msgid "Logical decoding on standby requires wal_level >= logical on the primary server." +msgstr "le décodage logique requiert wal_level >= logical" + +#: replication/slot.c:1292 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "arrêt du processus %d pour relâcher le slot de réplication « %s »" -#: replication/slot.c:1368 -#, c-format -msgid "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds max_slot_wal_keep_size" -msgstr "invalidation du slot « %s » parce que son restart_lsn %X/%X dépasse max_slot_wal_keep_size" +#: replication/slot.c:1294 +#, fuzzy, c-format +#| msgid "creating replication slot \"%s\"" +msgid "invalidating obsolete replication slot \"%s\"" +msgstr "création du slot de réplication « %s »" -#: replication/slot.c:1820 +#: replication/slot.c:1966 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "le fichier « %s » du slot de réplication a le nombre magique %u au lieu de %u" -#: replication/slot.c:1827 +#: replication/slot.c:1973 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "le fichier « %s » du slot de réplication a une version %u non supportée" -#: replication/slot.c:1834 +#: replication/slot.c:1980 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "le slot de réplication « %s » a une taille %u corrompue" -#: replication/slot.c:1870 +#: replication/slot.c:2016 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "différence de somme de contrôle pour le fichier de slot de réplication « %s » : est %u, devrait être %u" -#: replication/slot.c:1904 +#: replication/slot.c:2050 #, c-format msgid "logical replication slot \"%s\" exists, but wal_level < logical" msgstr "le slot de réplication logique « %s » existe mais, wal_level < logical" -#: replication/slot.c:1906 +#: replication/slot.c:2052 #, c-format msgid "Change wal_level to be logical or higher." msgstr "Modifiez wal_level pour valoir logical ou supérieur." -#: replication/slot.c:1910 +#: replication/slot.c:2056 #, c-format msgid "physical replication slot \"%s\" exists, but wal_level < replica" msgstr "le slot de réplication physique « %s » existe mais, wal_level < replica" -#: replication/slot.c:1912 +#: replication/slot.c:2058 #, c-format msgid "Change wal_level to be replica or higher." msgstr "Modifiez wal_level pour valoir replica ou supérieur." -#: replication/slot.c:1946 +#: replication/slot.c:2092 #, c-format msgid "too many replication slots active before shutdown" msgstr "trop de slots de réplication actifs avant l'arrêt" -#: replication/slotfuncs.c:592 +#: replication/slotfuncs.c:601 #, c-format msgid "invalid target WAL LSN" msgstr "WAL LSN cible invalide" -#: replication/slotfuncs.c:614 +#: replication/slotfuncs.c:623 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "le slot de réplication « %s » ne peut pas être avancé" -#: replication/slotfuncs.c:632 +#: replication/slotfuncs.c:625 +#, c-format +msgid "This slot has never previously reserved WAL, or it has been invalidated." +msgstr "Ce slot n'a jamais réservé de WAL précédemment, ou a été invalidé." + +#: replication/slotfuncs.c:641 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "impossible d'avancer le slot de réplication vers %X/%X, le minimum est %X/%X" -#: replication/slotfuncs.c:739 +#: replication/slotfuncs.c:748 #, c-format msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "ne peut pas copier le slot de réplication physique « %s » en tant que slot de réplication logique" -#: replication/slotfuncs.c:741 +#: replication/slotfuncs.c:750 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "ne peut pas copier le slot de réplication logique « %s » en tant que slot de réplication physique" -#: replication/slotfuncs.c:748 +#: replication/slotfuncs.c:757 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "ne peut pas copier un slot de réplication qui n'a pas auparavant réservé de WAL" -#: replication/slotfuncs.c:825 +#: replication/slotfuncs.c:834 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "n'a pas pu copier le slot de réplication « %s »" -#: replication/slotfuncs.c:827 +#: replication/slotfuncs.c:836 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "Le slot de réplication source a été modifié de manière incompatible durant l'opération de copie." -#: replication/slotfuncs.c:833 +#: replication/slotfuncs.c:842 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "ne peut pas copier le slot de réplication logique non terminé « %s »" -#: replication/slotfuncs.c:835 +#: replication/slotfuncs.c:844 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "Ré-essayez quand la valeur de confirmed_flush_lsn pour le slot de réplication source est valide." -#: replication/syncrep.c:268 +#: replication/syncrep.c:262 #, c-format msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" msgstr "" "annulation de l'attente pour la réplication synchrone et arrêt des connexions\n" "suite à la demande de l'administrateur" -#: replication/syncrep.c:269 replication/syncrep.c:286 +#: replication/syncrep.c:263 replication/syncrep.c:280 #, c-format msgid "The transaction has already committed locally, but might not have been replicated to the standby." msgstr "" "La transaction a déjà enregistré les données localement, mais il se peut que\n" "cela n'ait pas été répliqué sur le serveur en standby." -#: replication/syncrep.c:285 +#: replication/syncrep.c:279 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "annulation de l'attente pour la réplication synchrone à la demande de l'utilisateur" -#: replication/syncrep.c:494 +#: replication/syncrep.c:486 #, c-format msgid "standby \"%s\" is now a synchronous standby with priority %u" msgstr "le serveur « %s » en standby est maintenant un serveur standby synchrone de priorité %u" -#: replication/syncrep.c:498 +#: replication/syncrep.c:490 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "le serveur standby « %s » est maintenant un candidat dans le quorum des standbys synchrones" -#: replication/syncrep.c:1045 +#: replication/syncrep.c:1019 #, c-format msgid "synchronous_standby_names parser failed" msgstr "l'analyseur du paramètre synchronous_standby_names a échoué" -#: replication/syncrep.c:1051 +#: replication/syncrep.c:1025 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "le nombre de standbys synchrones (%d) doit être supérieur à zéro" -#: replication/walreceiver.c:164 +#: replication/walreceiver.c:180 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "arrêt du processus walreceiver suite à la demande de l'administrateur" -#: replication/walreceiver.c:292 +#: replication/walreceiver.c:305 #, c-format msgid "could not connect to the primary server: %s" msgstr "n'a pas pu se connecter au serveur principal : %s" -#: replication/walreceiver.c:339 +#: replication/walreceiver.c:352 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "" "l'identifiant du système de bases de données diffère entre le serveur principal\n" "et le serveur en attente" -#: replication/walreceiver.c:340 +#: replication/walreceiver.c:353 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "" "L'identifiant du serveur principal est %s, l'identifiant du serveur en attente\n" "est %s." -#: replication/walreceiver.c:351 +#: replication/walreceiver.c:364 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "la plus grande timeline %u du serveur principal est derrière la timeline de restauration %u" -#: replication/walreceiver.c:404 +#: replication/walreceiver.c:417 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "démarré le flux des journaux depuis le principal à %X/%X sur la timeline %u" -#: replication/walreceiver.c:408 +#: replication/walreceiver.c:421 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "recommence le flux WAL à %X/%X sur la timeline %u" -#: replication/walreceiver.c:437 +#: replication/walreceiver.c:457 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "ne peut pas continuer le flux de journaux de transactions, la récupération est déjà terminée" -#: replication/walreceiver.c:475 +#: replication/walreceiver.c:501 #, c-format msgid "replication terminated by primary server" msgstr "réplication terminée par le serveur primaire" -#: replication/walreceiver.c:476 +#: replication/walreceiver.c:502 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "Fin du WAL atteint sur la timeline %u à %X/%X." -#: replication/walreceiver.c:565 +#: replication/walreceiver.c:592 #, c-format msgid "terminating walreceiver due to timeout" msgstr "arrêt du processus walreceiver suite à l'expiration du délai de réplication" -#: replication/walreceiver.c:603 +#: replication/walreceiver.c:624 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "le serveur principal ne contient plus de WAL sur la timeline %u demandée" -#: replication/walreceiver.c:619 replication/walreceiver.c:1045 -#, c-format -msgid "could not close log segment %s: %m" +#: replication/walreceiver.c:640 replication/walreceiver.c:1066 +#, fuzzy, c-format +#| msgid "could not close log segment %s: %m" +msgid "could not close WAL segment %s: %m" msgstr "n'a pas pu fermer le journal de transactions %s : %m" -#: replication/walreceiver.c:738 +#: replication/walreceiver.c:759 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "récupération du fichier historique pour la timeline %u à partir du serveur principal" -#: replication/walreceiver.c:933 -#, c-format -msgid "could not write to log segment %s at offset %u, length %lu: %m" +#: replication/walreceiver.c:954 +#, fuzzy, c-format +#| msgid "could not write to log segment %s at offset %u, length %lu: %m" +msgid "could not write to WAL segment %s at offset %u, length %lu: %m" msgstr "n'a pas pu écrire le journal de transactions %s au décalage %u, longueur %lu : %m" -#: replication/walsender.c:521 +#: replication/walsender.c:519 #, fuzzy, c-format #| msgid "cannot read from logical replication slot \"%s\"" msgid "cannot use %s with a logical replication slot" msgstr "ne peut pas lire à partir du slot de réplication logique « %s »" -#: replication/walsender.c:638 storage/smgr/md.c:1364 +#: replication/walsender.c:623 storage/smgr/md.c:1529 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "n'a pas pu trouver la fin du fichier « %s » : %m" -#: replication/walsender.c:642 +#: replication/walsender.c:627 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "n'a pas pu se déplacer au début du fichier « %s » : %m" -#: replication/walsender.c:719 +#: replication/walsender.c:704 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "ne peut pas utiliser un slot de réplication logique pour une réplication physique" -#: replication/walsender.c:785 +#: replication/walsender.c:770 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "le point de reprise %X/%X de la timeline %u n'est pas dans l'historique du serveur" -#: replication/walsender.c:788 +#: replication/walsender.c:773 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "L'historique du serveur a changé à partir de la timeline %u à %X/%X." -#: replication/walsender.c:832 +#: replication/walsender.c:817 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "le point de reprise requis %X/%X est devant la position de vidage des WAL de ce serveur %X/%X" -#: replication/walsender.c:1015 +#: replication/walsender.c:1010 #, fuzzy, c-format #| msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" msgstr "valeur non reconnue pour l'option « %s » d'EXPLAIN : « %s »" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1100 +#: replication/walsender.c:1095 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s ne doit pas être appelé depuis une transaction" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1110 +#: replication/walsender.c:1105 #, c-format msgid "%s must be called inside a transaction" msgstr "%s doit être appelé au sein d'une transaction" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1116 +#: replication/walsender.c:1111 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s doit être appelé dans le niveau d'isolation REPEATABLE READ" +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1116 +#, fuzzy, c-format +#| msgid "%s must be called inside a transaction" +msgid "%s must be called in a read-only transaction" +msgstr "%s doit être appelé au sein d'une transaction" + #. translator: %s is a CREATE_REPLICATION_SLOT statement #: replication/walsender.c:1122 #, c-format @@ -21453,511 +22015,456 @@ msgstr "%s doit être appelé avant toute requête" msgid "%s must not be called in a subtransaction" msgstr "%s ne doit pas être appelé depuis une sous-transaction" -#: replication/walsender.c:1271 -#, c-format -msgid "cannot read from logical replication slot \"%s\"" -msgstr "ne peut pas lire à partir du slot de réplication logique « %s »" - -#: replication/walsender.c:1273 -#, c-format -msgid "This slot has been invalidated because it exceeded the maximum reserved size." -msgstr "Ce slot a été invalidé parce qu'il dépassait la taille maximale réservée." - -#: replication/walsender.c:1283 +#: replication/walsender.c:1275 #, c-format msgid "terminating walsender process after promotion" msgstr "arrêt du processus walreceiver suite promotion" -#: replication/walsender.c:1704 +#: replication/walsender.c:1696 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "ne peut pas exécuter de nouvelles commandes alors que le walsender est en mode d'arrêt" -#: replication/walsender.c:1739 +#: replication/walsender.c:1731 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "ne peut pas exécuter des commandes SQL dans le walsender pour la réplication physique" -#: replication/walsender.c:1772 +#: replication/walsender.c:1764 #, c-format msgid "received replication command: %s" msgstr "commande de réplication reçu : %s" -#: replication/walsender.c:1780 tcop/fastpath.c:208 tcop/postgres.c:1114 -#: tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 -#: tcop/postgres.c:2614 tcop/postgres.c:2692 +#: replication/walsender.c:1772 tcop/fastpath.c:209 tcop/postgres.c:1138 +#: tcop/postgres.c:1496 tcop/postgres.c:1736 tcop/postgres.c:2210 +#: tcop/postgres.c:2648 tcop/postgres.c:2726 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "" "la transaction est annulée, les commandes sont ignorées jusqu'à la fin du bloc\n" "de la transaction" -#: replication/walsender.c:1922 replication/walsender.c:1957 +#: replication/walsender.c:1914 replication/walsender.c:1949 #, c-format msgid "unexpected EOF on standby connection" msgstr "fin de fichier (EOF) inattendue de la connexion du serveur en attente" -#: replication/walsender.c:1945 +#: replication/walsender.c:1937 #, c-format msgid "invalid standby message type \"%c\"" msgstr "type de message « %c » invalide pour le serveur en standby" -#: replication/walsender.c:2034 +#: replication/walsender.c:2026 #, c-format msgid "unexpected message type \"%c\"" msgstr "type de message « %c » inattendu" -#: replication/walsender.c:2447 +#: replication/walsender.c:2439 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "arrêt du processus walreceiver suite à l'expiration du délai de réplication" -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1013 +#: rewrite/rewriteDefine.c:111 rewrite/rewriteDefine.c:842 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "la règle « %s » existe déjà pour la relation « %s »" -#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:951 +#: rewrite/rewriteDefine.c:268 rewrite/rewriteDefine.c:780 #, fuzzy, c-format #| msgid "relation \"%s\" is not a table" msgid "relation \"%s\" cannot have rules" msgstr "la relation « %s » n'est pas une table" -#: rewrite/rewriteDefine.c:302 +#: rewrite/rewriteDefine.c:299 #, c-format msgid "rule actions on OLD are not implemented" msgstr "les actions de la règle sur OLD ne sont pas implémentées" -#: rewrite/rewriteDefine.c:303 +#: rewrite/rewriteDefine.c:300 #, c-format msgid "Use views or triggers instead." msgstr "Utilisez à la place des vues ou des triggers." -#: rewrite/rewriteDefine.c:307 +#: rewrite/rewriteDefine.c:304 #, c-format msgid "rule actions on NEW are not implemented" msgstr "les actions de la règle sur NEW ne sont pas implémentées" -#: rewrite/rewriteDefine.c:308 +#: rewrite/rewriteDefine.c:305 #, c-format msgid "Use triggers instead." msgstr "Utilisez des triggers à la place." -#: rewrite/rewriteDefine.c:321 +#: rewrite/rewriteDefine.c:319 +#, fuzzy, c-format +#| msgid "relation \"%s\" is not a table" +msgid "relation \"%s\" cannot have ON SELECT rules" +msgstr "la relation « %s » n'est pas une table" + +#: rewrite/rewriteDefine.c:329 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "les règles INSTEAD NOTHING sur SELECT ne sont pas implémentées" -#: rewrite/rewriteDefine.c:322 +#: rewrite/rewriteDefine.c:330 #, c-format msgid "Use views instead." msgstr "Utilisez les vues à la place." -#: rewrite/rewriteDefine.c:330 +#: rewrite/rewriteDefine.c:338 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "les actions multiples pour les règles sur SELECT ne sont pas implémentées" -#: rewrite/rewriteDefine.c:340 +#: rewrite/rewriteDefine.c:348 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "les règles sur SELECT doivent avoir une action INSTEAD SELECT" -#: rewrite/rewriteDefine.c:348 +#: rewrite/rewriteDefine.c:356 #, c-format msgid "rules on SELECT must not contain data-modifying statements in WITH" msgstr "" "les règles sur SELECT ne doivent pas contenir d'instructions de modification\n" "de données avec WITH" -#: rewrite/rewriteDefine.c:356 +#: rewrite/rewriteDefine.c:364 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "" "les qualifications d'événements ne sont pas implémentées pour les règles sur\n" "SELECT" -#: rewrite/rewriteDefine.c:383 +#: rewrite/rewriteDefine.c:391 #, c-format msgid "\"%s\" is already a view" msgstr "« %s » est déjà une vue" -#: rewrite/rewriteDefine.c:407 +#: rewrite/rewriteDefine.c:415 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "la règle de la vue pour « %s » doit être nommée « %s »" -#: rewrite/rewriteDefine.c:436 -#, c-format -msgid "cannot convert partitioned table \"%s\" to a view" -msgstr "ne peut pas convertir la table partitionnée « %s » en une vue" - -#: rewrite/rewriteDefine.c:445 -#, c-format -msgid "cannot convert partition \"%s\" to a view" -msgstr "ne peut pas convertir la partition « %s » en une vue" - -#: rewrite/rewriteDefine.c:454 -#, c-format -msgid "could not convert table \"%s\" to a view because it is not empty" -msgstr "n'a pas pu convertir la table « %s » en une vue car elle n'est pas vide" - -#: rewrite/rewriteDefine.c:463 -#, c-format -msgid "could not convert table \"%s\" to a view because it has triggers" -msgstr "n'a pas pu convertir la table « %s » en une vue parce qu'elle a des triggers" - -#: rewrite/rewriteDefine.c:465 -#, c-format -msgid "In particular, the table cannot be involved in any foreign key relationships." -msgstr "" -"En particulier, la table ne peut pas être impliquée dans les relations des\n" -"clés étrangères." - -#: rewrite/rewriteDefine.c:470 -#, c-format -msgid "could not convert table \"%s\" to a view because it has indexes" -msgstr "n'a pas pu convertir la table « %s » en une vue parce qu'elle a des index" - -#: rewrite/rewriteDefine.c:476 -#, c-format -msgid "could not convert table \"%s\" to a view because it has child tables" -msgstr "n'a pas pu convertir la table « %s » en une vue parce qu'elle a des tables filles" - -#: rewrite/rewriteDefine.c:482 -#, c-format -msgid "could not convert table \"%s\" to a view because it has parent tables" -msgstr "n'a pas pu convertir la table « %s » en une vue parce qu'elle a des tables parents" - -#: rewrite/rewriteDefine.c:488 -#, c-format -msgid "could not convert table \"%s\" to a view because it has row security enabled" -msgstr "n'a pas pu convertir la table « %s » en une vue parce que le mode sécurité des lignes est activé pour elle" - -#: rewrite/rewriteDefine.c:494 -#, c-format -msgid "could not convert table \"%s\" to a view because it has row security policies" -msgstr "n'a pas pu convertir la table « %s » en une vue parce qu'elle a des politiques de sécurité" - -#: rewrite/rewriteDefine.c:521 +#: rewrite/rewriteDefine.c:442 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "ne peut pas avoir plusieurs listes RETURNING dans une règle" -#: rewrite/rewriteDefine.c:526 +#: rewrite/rewriteDefine.c:447 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "les listes RETURNING ne sont pas supportés dans des règles conditionnelles" -#: rewrite/rewriteDefine.c:530 +#: rewrite/rewriteDefine.c:451 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "les listes RETURNING ne sont pas supportées dans des règles autres que INSTEAD" -#: rewrite/rewriteDefine.c:544 +#: rewrite/rewriteDefine.c:465 #, fuzzy, c-format #| msgid "view rule for \"%s\" must be named \"%s\"" msgid "non-view rule for \"%s\" must not be named \"%s\"" msgstr "la règle de la vue pour « %s » doit être nommée « %s »" -#: rewrite/rewriteDefine.c:706 +#: rewrite/rewriteDefine.c:539 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "la liste cible de la règle SELECT a trop d'entrées" -#: rewrite/rewriteDefine.c:707 +#: rewrite/rewriteDefine.c:540 #, c-format msgid "RETURNING list has too many entries" msgstr "la liste RETURNING a trop d'entrées" -#: rewrite/rewriteDefine.c:734 +#: rewrite/rewriteDefine.c:567 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "ne peut pas convertir la relation contenant les colonnes supprimées de la vue" -#: rewrite/rewriteDefine.c:735 +#: rewrite/rewriteDefine.c:568 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "ne peut pas créer une liste RETURNING pour une relation contenant des colonnes supprimées" -#: rewrite/rewriteDefine.c:741 +#: rewrite/rewriteDefine.c:574 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "l'entrée cible de la règle SELECT %d a un nom de colonne différent pour la colonne « %s »" -#: rewrite/rewriteDefine.c:743 +#: rewrite/rewriteDefine.c:576 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "l'entrée cible de la règle SELECT est nommée « %s »." -#: rewrite/rewriteDefine.c:752 +#: rewrite/rewriteDefine.c:585 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "l'entrée cible de la règle SELECT %d a un type différent de la colonne « %s »" -#: rewrite/rewriteDefine.c:754 +#: rewrite/rewriteDefine.c:587 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "l'entrée %d de la liste RETURNING a un type différent de la colonne « %s »" -#: rewrite/rewriteDefine.c:757 rewrite/rewriteDefine.c:781 +#: rewrite/rewriteDefine.c:590 rewrite/rewriteDefine.c:614 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "l'entrée de la liste SELECT a le type %s alors que la colonne a le type %s." -#: rewrite/rewriteDefine.c:760 rewrite/rewriteDefine.c:785 +#: rewrite/rewriteDefine.c:593 rewrite/rewriteDefine.c:618 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "l'entrée de la liste RETURNING a le type %s alors que la colonne a le type %s." -#: rewrite/rewriteDefine.c:776 +#: rewrite/rewriteDefine.c:609 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "l'entrée cible de la règle SELECT %d a un taille différente de la colonne « %s »" -#: rewrite/rewriteDefine.c:778 +#: rewrite/rewriteDefine.c:611 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "l'entrée %d de la liste RETURNING a une taille différente de la colonne « %s »" -#: rewrite/rewriteDefine.c:795 +#: rewrite/rewriteDefine.c:628 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "l'entrée cible de la règle SELECT n'a pas assez d'entrées" -#: rewrite/rewriteDefine.c:796 +#: rewrite/rewriteDefine.c:629 #, c-format msgid "RETURNING list has too few entries" msgstr "la liste RETURNING n'a pas assez d'entrées" -#: rewrite/rewriteDefine.c:889 rewrite/rewriteDefine.c:1004 +#: rewrite/rewriteDefine.c:718 rewrite/rewriteDefine.c:833 #: rewrite/rewriteSupport.c:109 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "la règle « %s » de la relation « %s » n'existe pas" -#: rewrite/rewriteDefine.c:1023 +#: rewrite/rewriteDefine.c:852 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "le renommage d'une règle ON SELECT n'est pas autorisé" -#: rewrite/rewriteHandler.c:559 +#: rewrite/rewriteHandler.c:583 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "Le nom de la requête WITH « %s » apparaît à la fois dans l'action d'une règle et dans la requête en cours de ré-écriture" -#: rewrite/rewriteHandler.c:586 -#, c-format -msgid "INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH" +#: rewrite/rewriteHandler.c:610 +#, fuzzy, c-format +#| msgid "INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH" +msgid "INSERT ... SELECT rule actions are not supported for queries having data-modifying statements in WITH" msgstr "les actions de règle INSERT...SELECT ne sont pas supportées par les requêtes de modification de données dans WITH" -#: rewrite/rewriteHandler.c:639 +#: rewrite/rewriteHandler.c:663 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "ne peut pas avoir des listes RETURNING dans plusieurs règles" -#: rewrite/rewriteHandler.c:871 rewrite/rewriteHandler.c:910 +#: rewrite/rewriteHandler.c:895 rewrite/rewriteHandler.c:934 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "ne peut pas insérer une valeur pas par défaut dans la colonne « %s »" -#: rewrite/rewriteHandler.c:873 rewrite/rewriteHandler.c:939 +#: rewrite/rewriteHandler.c:897 rewrite/rewriteHandler.c:963 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "La colonne « %s » est une colonne d'identité définie comme GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:875 +#: rewrite/rewriteHandler.c:899 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Utilisez OVERRIDING SYSTEM VALUE pour surcharger." -#: rewrite/rewriteHandler.c:937 rewrite/rewriteHandler.c:945 +#: rewrite/rewriteHandler.c:961 rewrite/rewriteHandler.c:969 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "la colonne « %s » peut seulement être mise à jour en DEFAULT" -#: rewrite/rewriteHandler.c:1092 rewrite/rewriteHandler.c:1110 +#: rewrite/rewriteHandler.c:1116 rewrite/rewriteHandler.c:1134 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "affectations multiples pour la même colonne « %s »" -#: rewrite/rewriteHandler.c:2112 rewrite/rewriteHandler.c:3990 +#: rewrite/rewriteHandler.c:2119 rewrite/rewriteHandler.c:4040 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "récursion infinie détectée dans les règles de la relation « %s »" -#: rewrite/rewriteHandler.c:2197 +#: rewrite/rewriteHandler.c:2204 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "récursion infinie détectée dans la politique pour la relation « %s »" -#: rewrite/rewriteHandler.c:2517 +#: rewrite/rewriteHandler.c:2524 msgid "Junk view columns are not updatable." msgstr "Les colonnes « junk » des vues ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2522 +#: rewrite/rewriteHandler.c:2529 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Les colonnes des vues qui ne font pas référence à des colonnes de la relation de base ne sont pas automatiquement modifiables." -#: rewrite/rewriteHandler.c:2525 +#: rewrite/rewriteHandler.c:2532 msgid "View columns that refer to system columns are not updatable." msgstr "Les colonnes des vues qui font référence à des colonnes systèmes ne sont pas automatiquement modifiables." -#: rewrite/rewriteHandler.c:2528 +#: rewrite/rewriteHandler.c:2535 msgid "View columns that return whole-row references are not updatable." msgstr "Les colonnes de vue qui font références à des lignes complètes ne sont pas automatiquement modifiables." -#: rewrite/rewriteHandler.c:2589 +#: rewrite/rewriteHandler.c:2596 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Les vues contenant DISTINCT ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2592 +#: rewrite/rewriteHandler.c:2599 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Les vues contenant GROUP BY ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2595 +#: rewrite/rewriteHandler.c:2602 msgid "Views containing HAVING are not automatically updatable." msgstr "Les vues contenant HAVING ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2598 +#: rewrite/rewriteHandler.c:2605 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Les vues contenant UNION, INTERSECT ou EXCEPT ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2601 +#: rewrite/rewriteHandler.c:2608 msgid "Views containing WITH are not automatically updatable." msgstr "Les vues contenant WITH ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2604 +#: rewrite/rewriteHandler.c:2611 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Les vues contenant LIMIT ou OFFSET ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2616 +#: rewrite/rewriteHandler.c:2623 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Les vues qui renvoient des fonctions d'agrégat ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2619 +#: rewrite/rewriteHandler.c:2626 msgid "Views that return window functions are not automatically updatable." msgstr "Les vues qui renvoient des fonctions de fenêtrage ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2622 +#: rewrite/rewriteHandler.c:2629 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Les vues qui renvoient des fonctions à plusieurs lignes ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2629 rewrite/rewriteHandler.c:2633 -#: rewrite/rewriteHandler.c:2641 +#: rewrite/rewriteHandler.c:2636 rewrite/rewriteHandler.c:2640 +#: rewrite/rewriteHandler.c:2648 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "Les vues qui lisent plusieurs tables ou vues ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2644 +#: rewrite/rewriteHandler.c:2651 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Les vues contenant TABLESAMPLE ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:2668 +#: rewrite/rewriteHandler.c:2675 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Les vues qui possèdent des colonnes non modifiables ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:3145 +#: rewrite/rewriteHandler.c:3155 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "ne peut pas insérer dans la colonne « %s » de la vue « %s »" -#: rewrite/rewriteHandler.c:3153 +#: rewrite/rewriteHandler.c:3163 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "ne peut pas mettre à jour la colonne « %s » de la vue « %s »" -#: rewrite/rewriteHandler.c:3644 +#: rewrite/rewriteHandler.c:3667 #, c-format msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" msgstr "les règles DO INSTEAD NOTHING ne sont pas supportées par les instructions de modification de données dans WITH" -#: rewrite/rewriteHandler.c:3655 +#: rewrite/rewriteHandler.c:3678 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "les règles DO INSTEAD NOTHING ne sont pas supportées par les instructions de modification de données dans WITH" -#: rewrite/rewriteHandler.c:3669 +#: rewrite/rewriteHandler.c:3692 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "" "les règles DO INSTEAD conditionnelles ne sont pas supportées par les\n" "instructions de modification de données dans WITH" -#: rewrite/rewriteHandler.c:3673 +#: rewrite/rewriteHandler.c:3696 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "les règles DO ALSO ne sont pas supportées par les instructions de modification de données dans WITH" -#: rewrite/rewriteHandler.c:3678 +#: rewrite/rewriteHandler.c:3701 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "" "les règles DO INSTEAD multi-instructions ne sont pas supportées pour les\n" "instructions de modification de données dans WITH" -#: rewrite/rewriteHandler.c:3918 rewrite/rewriteHandler.c:3926 -#: rewrite/rewriteHandler.c:3934 +#: rewrite/rewriteHandler.c:3968 rewrite/rewriteHandler.c:3976 +#: rewrite/rewriteHandler.c:3984 #, c-format msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "Les vues contenant des règles DO INSTEAD conditionnelles ne sont pas automatiquement disponibles en écriture." -#: rewrite/rewriteHandler.c:4039 +#: rewrite/rewriteHandler.c:4089 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "ne peut pas exécuter INSERT RETURNING sur la relation « %s »" -#: rewrite/rewriteHandler.c:4041 +#: rewrite/rewriteHandler.c:4091 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "" "Vous avez besoin d'une règle ON INSERT DO INSTEAD sans condition avec une\n" "clause RETURNING." -#: rewrite/rewriteHandler.c:4046 +#: rewrite/rewriteHandler.c:4096 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "ne peut pas exécuter UPDATE RETURNING sur la relation « %s »" -#: rewrite/rewriteHandler.c:4048 +#: rewrite/rewriteHandler.c:4098 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "" "Vous avez besoin d'une règle ON UPDATE DO INSTEAD sans condition avec une\n" "clause RETURNING." -#: rewrite/rewriteHandler.c:4053 +#: rewrite/rewriteHandler.c:4103 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "ne peut pas exécuter DELETE RETURNING sur la relation « %s »" -#: rewrite/rewriteHandler.c:4055 +#: rewrite/rewriteHandler.c:4105 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "" "Vous avez besoin d'une règle ON DELETE DO INSTEAD sans condition avec une\n" "clause RETURNING." -#: rewrite/rewriteHandler.c:4073 +#: rewrite/rewriteHandler.c:4123 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "INSERT avec une clause ON CONFLICT ne peut pas être utilisée avec une table qui a des règles pour INSERT ou UPDATE" -#: rewrite/rewriteHandler.c:4130 +#: rewrite/rewriteHandler.c:4180 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH ne peut pas être utilisé dans une requête réécrite par des règles en plusieurs requêtes" -#: rewrite/rewriteManip.c:1006 +#: rewrite/rewriteManip.c:1075 #, c-format msgid "conditional utility statements are not implemented" msgstr "les instructions conditionnelles ne sont pas implémentées" -#: rewrite/rewriteManip.c:1172 +#: rewrite/rewriteManip.c:1419 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "WHERE CURRENT OF n'est pas implémenté sur une vue" -#: rewrite/rewriteManip.c:1507 +#: rewrite/rewriteManip.c:1754 #, c-format msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" msgstr "les variables NEW dans des règles ON UPDATE ne peuvent pas référencer des colonnes faisant partie d'une affectation multiple dans une commande UPDATE" @@ -21968,115 +22475,129 @@ msgstr "les variables NEW dans des règles ON UPDATE ne peuvent pas référencer msgid "with a SEARCH or CYCLE clause, the recursive reference to WITH query \"%s\" must be at the top level of its right-hand SELECT" msgstr "avec une clause SEARCH ou CYCLE, le côté gauche de l'UNION doit être un SELECT" -#: scan.l:465 +#: scan.l:482 msgid "unterminated /* comment" msgstr "commentaire /* non terminé" -#: scan.l:485 +#: scan.l:502 msgid "unterminated bit string literal" -msgstr "chaîne bit litérale non terminée" +msgstr "chaîne bit littérale non terminée" -#: scan.l:499 +#: scan.l:516 msgid "unterminated hexadecimal string literal" -msgstr "chaîne hexadécimale litérale non terminée" +msgstr "chaîne hexadécimale littérale non terminée" -#: scan.l:549 +#: scan.l:566 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "utilisation non sûre de la constante de chaîne avec des échappements Unicode" -#: scan.l:550 +#: scan.l:567 #, c-format msgid "String constants with Unicode escapes cannot be used when standard_conforming_strings is off." msgstr "" "Les constantes de chaîne avec des échappements Unicode ne peuvent pas être\n" "utilisées quand standard_conforming_strings est désactivé." -#: scan.l:611 +#: scan.l:628 msgid "unhandled previous state in xqs" msgstr "état précédent non géré dans xqs" -#: scan.l:685 +#: scan.l:702 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "Les échappements Unicode doivent être de la forme \\uXXXX ou \\UXXXXXXXX." -#: scan.l:696 +#: scan.l:713 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "utilisation non sûre de \\' dans une chaîne littérale" -#: scan.l:697 +#: scan.l:714 #, c-format msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." msgstr "" "Utilisez '' pour écrire des guillemets dans une chaîne. \\' n'est pas sécurisé\n" "pour les encodages clients." -#: scan.l:769 +#: scan.l:786 msgid "unterminated dollar-quoted string" msgstr "chaîne entre guillemets dollars non terminée" -#: scan.l:786 scan.l:796 +#: scan.l:803 scan.l:813 msgid "zero-length delimited identifier" msgstr "identifiant délimité de longueur nulle" -#: scan.l:807 syncrep_scanner.l:91 +#: scan.l:824 syncrep_scanner.l:101 msgid "unterminated quoted identifier" msgstr "identifiant entre guillemets non terminé" -#: scan.l:970 +#: scan.l:987 msgid "operator too long" msgstr "opérateur trop long" -#: scan.l:983 +#: scan.l:1000 msgid "trailing junk after parameter" msgstr "élément indésirable après le paramètre" -#: scan.l:1008 scan.l:1012 scan.l:1016 scan.l:1020 -msgid "trailing junk after numeric literal" -msgstr "élément indésirable après la valeur numérique" +#: scan.l:1021 +#, fuzzy +#| msgid "invalid hexadecimal digit" +msgid "invalid hexadecimal integer" +msgstr "chiffre hexadécimal invalide" + +#: scan.l:1025 +#, fuzzy +#| msgid "invalid Datum pointer" +msgid "invalid octal integer" +msgstr "pointeur Datum invalide" + +#: scan.l:1029 +#, fuzzy +#| msgid "invalid binary \"%s\"" +msgid "invalid binary integer" +msgstr "binaire « %s » invalide" #. translator: %s is typically the translation of "syntax error" -#: scan.l:1183 +#: scan.l:1236 #, c-format msgid "%s at end of input" msgstr "%s à la fin de l'entrée" #. translator: first %s is typically the translation of "syntax error" -#: scan.l:1191 +#: scan.l:1244 #, c-format msgid "%s at or near \"%s\"" msgstr "%s sur ou près de « %s »" -#: scan.l:1382 +#: scan.l:1434 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "utilisation non standard de \\' dans une chaîne littérale" -#: scan.l:1383 +#: scan.l:1435 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "" "Utilisez '' pour écrire des guillemets dans une chaîne ou utilisez la syntaxe de\n" "chaîne d'échappement (E'...')." -#: scan.l:1392 +#: scan.l:1444 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "utilisation non standard de \\\\ dans une chaîne littérale" -#: scan.l:1393 +#: scan.l:1445 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "Utilisez la syntaxe de chaîne d'échappement pour les antislashs, c'est-à-dire E'\\\\'." -#: scan.l:1407 +#: scan.l:1459 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "utilisation non standard d'un échappement dans une chaîne littérale" -#: scan.l:1408 +#: scan.l:1460 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "" @@ -22121,207 +22642,236 @@ msgstr "" "fonction renvoyant le type record appelée dans un contexte qui ne peut pas\n" "accepter le type record" -#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 +#: storage/buffer/bufmgr.c:612 storage/buffer/bufmgr.c:769 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "ne peut pas accéder aux tables temporaires d'autres sessions" -#: storage/buffer/bufmgr.c:851 +#: storage/buffer/bufmgr.c:1137 +#, c-format +msgid "invalid page in block %u of relation %s; zeroing out page" +msgstr "page invalide dans le bloc %u de la relation %s ; remplacement de la page par des zéros" + +#: storage/buffer/bufmgr.c:1931 storage/buffer/localbuf.c:359 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "ne peut pas étendre la relation %s de plus de %u blocs" -#: storage/buffer/bufmgr.c:938 +#: storage/buffer/bufmgr.c:1998 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "" "données inattendues après la fin de fichier dans le bloc %u de la relation\n" "%s" -#: storage/buffer/bufmgr.c:940 +#: storage/buffer/bufmgr.c:2000 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "" -"Ceci s'est déjà vu avec des noyaux buggés ; pensez à mettre à jour votre\n" +"Ceci s'est déjà vu avec des noyaux bugués ; pensez à mettre à jour votre\n" "système." -#: storage/buffer/bufmgr.c:1039 -#, c-format -msgid "invalid page in block %u of relation %s; zeroing out page" -msgstr "page invalide dans le bloc %u de la relation %s ; remplacement de la page par des zéros" - -#: storage/buffer/bufmgr.c:4669 +#: storage/buffer/bufmgr.c:5219 #, c-format msgid "could not write block %u of %s" msgstr "n'a pas pu écrire le bloc %u de %s" -#: storage/buffer/bufmgr.c:4671 +#: storage/buffer/bufmgr.c:5221 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Échecs multiples --- l'erreur d'écriture pourrait être permanente." -#: storage/buffer/bufmgr.c:4692 storage/buffer/bufmgr.c:4711 +#: storage/buffer/bufmgr.c:5243 storage/buffer/bufmgr.c:5263 #, c-format msgid "writing block %u of relation %s" msgstr "écriture du bloc %u de la relation %s" -#: storage/buffer/bufmgr.c:5015 +#: storage/buffer/bufmgr.c:5593 #, c-format msgid "snapshot too old" msgstr "snapshot trop ancien" -#: storage/buffer/localbuf.c:205 +#: storage/buffer/localbuf.c:219 #, c-format msgid "no empty local buffer available" msgstr "aucun tampon local vide disponible" -#: storage/buffer/localbuf.c:433 +#: storage/buffer/localbuf.c:592 #, c-format msgid "cannot access temporary tables during a parallel operation" msgstr "ne peut pas accéder à des tables temporaires pendant une opération parallèle" -#: storage/file/buffile.c:333 +#: storage/buffer/localbuf.c:699 +#, c-format +msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." +msgstr "« temp_buffers » ne peut pas être modifié après que des tables temporaires aient été utilisées dans la session." + +#: storage/file/buffile.c:338 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier temporaire « %s » à partir de BufFile « %s » : %m" -#: storage/file/buffile.c:723 storage/file/buffile.c:844 +#: storage/file/buffile.c:632 +#, fuzzy, c-format +#| msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" +msgid "could not read from file set \"%s\": read only %zu of %zu bytes" +msgstr "n'a pas pu lire le fichier temporaire pour la jointure de hachage : a lu seulement %zu octets sur %zu" + +#: storage/file/buffile.c:634 +#, fuzzy, c-format +#| msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "n'a pas pu lire le fichier temporaire pour la jointure de hachage : a lu seulement %zu octets sur %zu" + +#: storage/file/buffile.c:774 storage/file/buffile.c:895 #, c-format msgid "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" msgstr "n'a pas pu déterminer la taille du fichier temporaire « %s » à partir de BufFile « %s » : %m" -#: storage/file/buffile.c:923 +#: storage/file/buffile.c:974 #, fuzzy, c-format #| msgid "could not delete file \"%s\": %m" msgid "could not delete fileset \"%s\": %m" msgstr "n'a pas pu supprimer le fichier « %s » : %m" -#: storage/file/buffile.c:941 storage/smgr/md.c:325 storage/smgr/md.c:904 +#: storage/file/buffile.c:992 storage/smgr/md.c:338 storage/smgr/md.c:1041 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "n'a pas pu tronquer le fichier « %s » : %m" -#: storage/file/fd.c:522 storage/file/fd.c:594 storage/file/fd.c:630 +#: storage/file/fd.c:537 storage/file/fd.c:609 storage/file/fd.c:645 #, c-format msgid "could not flush dirty data: %m" msgstr "n'a pas pu vider les données modifiées : %m" -#: storage/file/fd.c:552 +#: storage/file/fd.c:567 #, c-format msgid "could not determine dirty data size: %m" msgstr "n'a pas pu déterminer la taille des données modifiées : %m" -#: storage/file/fd.c:604 +#: storage/file/fd.c:619 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "n'a pas exécuter munmap() durant la synchronisation des données : %m" -#: storage/file/fd.c:843 -#, c-format -msgid "could not link file \"%s\" to \"%s\": %m" -msgstr "n'a pas pu lier le fichier « %s » à « %s » : %m" - -#: storage/file/fd.c:967 +#: storage/file/fd.c:937 #, c-format msgid "getrlimit failed: %m" msgstr "échec de getrlimit : %m" -#: storage/file/fd.c:1057 +#: storage/file/fd.c:1027 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "nombre de descripteurs de fichier insuffisant pour lancer le processus serveur" -#: storage/file/fd.c:1058 -#, c-format -msgid "System allows %d, we need at least %d." +#: storage/file/fd.c:1028 +#, fuzzy, c-format +#| msgid "System allows %d, we need at least %d." +msgid "System allows %d, server needs at least %d." msgstr "Le système autorise %d, nous avons besoin d'au moins %d." -#: storage/file/fd.c:1153 storage/file/fd.c:2496 storage/file/fd.c:2606 -#: storage/file/fd.c:2757 +#: storage/file/fd.c:1116 storage/file/fd.c:2565 storage/file/fd.c:2674 +#: storage/file/fd.c:2825 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "plus de descripteurs de fichiers : %m; quittez et ré-essayez" -#: storage/file/fd.c:1527 +#: storage/file/fd.c:1490 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "fichier temporaire : chemin « %s », taille %lu" -#: storage/file/fd.c:1658 +#: storage/file/fd.c:1629 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "ne peut pas créer le répertoire temporaire « %s » : %m" -#: storage/file/fd.c:1665 +#: storage/file/fd.c:1636 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "ne peut pas créer le sous-répertoire temporaire « %s » : %m" -#: storage/file/fd.c:1862 +#: storage/file/fd.c:1833 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "n'a pas pu créer le fichier temporaire « %s » : %m" -#: storage/file/fd.c:1898 +#: storage/file/fd.c:1869 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier temporaire « %s » : %m" -#: storage/file/fd.c:1939 +#: storage/file/fd.c:1910 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier temporaire « %s » : %m" -#: storage/file/fd.c:2027 +#: storage/file/fd.c:1998 #, c-format msgid "could not delete file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier « %s » : %m" -#: storage/file/fd.c:2207 +#: storage/file/fd.c:2185 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "la taille du fichier temporaire dépasse temp_file_limit (%d Ko)" -#: storage/file/fd.c:2472 storage/file/fd.c:2531 +#: storage/file/fd.c:2541 storage/file/fd.c:2600 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "dépassement de maxAllocatedDescs (%d) lors de la tentative d'ouverture du fichier « %s »" -#: storage/file/fd.c:2576 +#: storage/file/fd.c:2645 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "dépassement de maxAllocatedDescs (%d) lors de la tentative d'exécution de la commande « %s »" -#: storage/file/fd.c:2733 +#: storage/file/fd.c:2801 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "dépassement de maxAllocatedDescs (%d) lors de la tentative d'ouverture du répertoire « %s »" -#: storage/file/fd.c:3269 +#: storage/file/fd.c:3331 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "fichier non attendu dans le répertoire des fichiers temporaires : « %s »" -#: storage/file/fd.c:3387 +#: storage/file/fd.c:3449 #, c-format msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" msgstr "" -#: storage/file/fd.c:3401 +#: storage/file/fd.c:3463 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" -#: storage/file/fd.c:3619 +#: storage/file/fd.c:3676 #, c-format msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "" -#: storage/file/fd.c:3651 +#: storage/file/fd.c:3708 #, c-format msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "" +#: storage/file/fd.c:3897 +#, fuzzy, c-format +#| msgid "Direct I/O is not supported on this platform.\n" +msgid "debug_io_direct is not supported on this platform." +msgstr "Direct I/O n'est pas supporté sur cette plateforme.\n" + +#: storage/file/fd.c:3944 +#, c-format +msgid "debug_io_direct is not supported for WAL because XLOG_BLCKSZ is too small" +msgstr "" + +#: storage/file/fd.c:3951 +#, c-format +msgid "debug_io_direct is not supported for data because BLCKSZ is too small" +msgstr "" + #: storage/file/reinit.c:145 #, fuzzy, c-format #| msgid "resetting unlogged relations: cleanup %d init %d" @@ -22339,94 +22889,101 @@ msgstr "réinitialisation des relations non tracées : nettoyage %d initialisati msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "n'a pas pu s'attacher a un SharedFileSet qui est déjà détruit" -#: storage/ipc/dsm.c:353 +#: storage/ipc/dsm.c:352 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "le segment contrôle de mémoire partagée dynamique est corrompu" -#: storage/ipc/dsm.c:418 +#: storage/ipc/dsm.c:417 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "le segment contrôle de mémoire partagée dynamique n'est pas valide" -#: storage/ipc/dsm.c:600 +#: storage/ipc/dsm.c:599 #, c-format msgid "too many dynamic shared memory segments" msgstr "trop de segments de mémoire partagée dynamique" -#: storage/ipc/dsm_impl.c:235 storage/ipc/dsm_impl.c:544 -#: storage/ipc/dsm_impl.c:648 storage/ipc/dsm_impl.c:819 +#: storage/ipc/dsm_impl.c:231 storage/ipc/dsm_impl.c:537 +#: storage/ipc/dsm_impl.c:641 storage/ipc/dsm_impl.c:812 #, c-format msgid "could not unmap shared memory segment \"%s\": %m" msgstr "n'a pas pu annuler le mappage du segment de mémoire partagée « %s » : %m" -#: storage/ipc/dsm_impl.c:245 storage/ipc/dsm_impl.c:554 -#: storage/ipc/dsm_impl.c:658 storage/ipc/dsm_impl.c:829 +#: storage/ipc/dsm_impl.c:241 storage/ipc/dsm_impl.c:547 +#: storage/ipc/dsm_impl.c:651 storage/ipc/dsm_impl.c:822 #, c-format msgid "could not remove shared memory segment \"%s\": %m" msgstr "n'a pas pu supprimer le segment de mémoire partagée « %s » : %m" -#: storage/ipc/dsm_impl.c:269 storage/ipc/dsm_impl.c:729 -#: storage/ipc/dsm_impl.c:843 +#: storage/ipc/dsm_impl.c:265 storage/ipc/dsm_impl.c:722 +#: storage/ipc/dsm_impl.c:836 #, c-format msgid "could not open shared memory segment \"%s\": %m" msgstr "n'a pas pu ouvrir le segment de mémoire partagée « %s » : %m" -#: storage/ipc/dsm_impl.c:294 storage/ipc/dsm_impl.c:570 -#: storage/ipc/dsm_impl.c:774 storage/ipc/dsm_impl.c:867 +#: storage/ipc/dsm_impl.c:290 storage/ipc/dsm_impl.c:563 +#: storage/ipc/dsm_impl.c:767 storage/ipc/dsm_impl.c:860 #, c-format msgid "could not stat shared memory segment \"%s\": %m" msgstr "n'a pas pu obtenir des informations sur le segment de mémoire partagée « %s » : %m" -#: storage/ipc/dsm_impl.c:313 storage/ipc/dsm_impl.c:918 +#: storage/ipc/dsm_impl.c:309 storage/ipc/dsm_impl.c:911 #, c-format msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" msgstr "n'a pas pu retailler le segment de mémoire partagée « %s » en %zu octets : %m" -#: storage/ipc/dsm_impl.c:335 storage/ipc/dsm_impl.c:591 -#: storage/ipc/dsm_impl.c:750 storage/ipc/dsm_impl.c:940 +#: storage/ipc/dsm_impl.c:331 storage/ipc/dsm_impl.c:584 +#: storage/ipc/dsm_impl.c:743 storage/ipc/dsm_impl.c:933 #, c-format msgid "could not map shared memory segment \"%s\": %m" msgstr "n'a pas pu mapper le segment de mémoire partagée « %s » : %m" -#: storage/ipc/dsm_impl.c:526 +#: storage/ipc/dsm_impl.c:519 #, c-format msgid "could not get shared memory segment: %m" msgstr "n'a pas pu obtenir le segment de mémoire partagée : %m" -#: storage/ipc/dsm_impl.c:714 +#: storage/ipc/dsm_impl.c:707 #, c-format msgid "could not create shared memory segment \"%s\": %m" msgstr "n'a pas pu créer le segment de mémoire partagée « %s » : %m" -#: storage/ipc/dsm_impl.c:951 +#: storage/ipc/dsm_impl.c:944 #, c-format msgid "could not close shared memory segment \"%s\": %m" msgstr "n'a pas pu fermer le segment de mémoire partagée « %s » : %m" -#: storage/ipc/dsm_impl.c:991 storage/ipc/dsm_impl.c:1040 +#: storage/ipc/dsm_impl.c:984 storage/ipc/dsm_impl.c:1033 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "n'a pas pu dupliquer le lien pour « %s » : %m" -#: storage/ipc/procarray.c:3823 +#: storage/ipc/procarray.c:3796 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "la base de données « %s » est utilisée par des transactions préparées." -#: storage/ipc/procarray.c:3855 storage/ipc/signalfuncs.c:226 +#: storage/ipc/procarray.c:3828 storage/ipc/procarray.c:3837 +#: storage/ipc/signalfuncs.c:230 storage/ipc/signalfuncs.c:237 +#, fuzzy, c-format +#| msgid "permission denied to create role" +msgid "permission denied to terminate process" +msgstr "droit refusé pour créer un rôle" + +#: storage/ipc/procarray.c:3829 storage/ipc/signalfuncs.c:231 #, c-format -msgid "must be a superuser to terminate superuser process" -msgstr "doit être super-utilisateur pour terminer le processus d'un super-utilisateur" +msgid "Only roles with the %s attribute may terminate processes of roles with the %s attribute." +msgstr "" -#: storage/ipc/procarray.c:3862 storage/ipc/signalfuncs.c:231 +#: storage/ipc/procarray.c:3838 storage/ipc/signalfuncs.c:238 #, c-format -msgid "must be a member of the role whose process is being terminated or member of pg_signal_backend" -msgstr "doit être un membre du rôle dont le processus est en cours d'arrêt ou membre de pg_signal_backend" +msgid "Only roles with privileges of the role whose process is being terminated or with privileges of the \"%s\" role may terminate this process." +msgstr "" -#: storage/ipc/procsignal.c:419 +#: storage/ipc/procsignal.c:420 #, c-format -msgid "still waiting for backend with PID %lu to accept ProcSignalBarrier" +msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" msgstr "" #: storage/ipc/shm_mq.c:384 @@ -22439,12 +22996,12 @@ msgstr "ne peut pas envoyer un message de taille %zu via la queue en mémoire pa msgid "invalid message size %zu in shared memory queue" msgstr "taille %zu invalide pour le message dans la queue de mémoire partagée" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 -#: storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4259 -#: storage/lmgr/lock.c:4324 storage/lmgr/lock.c:4674 -#: storage/lmgr/predicate.c:2472 storage/lmgr/predicate.c:2487 -#: storage/lmgr/predicate.c:3969 storage/lmgr/predicate.c:5081 -#: utils/hash/dynahash.c:1112 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:963 +#: storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2786 storage/lmgr/lock.c:4171 +#: storage/lmgr/lock.c:4236 storage/lmgr/lock.c:4586 +#: storage/lmgr/predicate.c:2412 storage/lmgr/predicate.c:2427 +#: storage/lmgr/predicate.c:3824 storage/lmgr/predicate.c:4871 +#: utils/hash/dynahash.c:1107 #, c-format msgid "out of shared memory" msgstr "mémoire partagée épuisée" @@ -22480,100 +23037,112 @@ msgstr "la taille de la mémoire partagée demandée dépasse size_t" msgid "PID %d is not a PostgreSQL backend process" msgstr "le PID %d n'est pas un processus du serveur PostgreSQL" -#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1434 +#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1387 #: utils/adt/mcxtfuncs.c:190 #, c-format msgid "could not send signal to process %d: %m" msgstr "n'a pas pu envoyer le signal au processus %d : %m" -#: storage/ipc/signalfuncs.c:124 +#: storage/ipc/signalfuncs.c:124 storage/ipc/signalfuncs.c:131 +#, fuzzy, c-format +#| msgid "permission denied to create role" +msgid "permission denied to cancel query" +msgstr "droit refusé pour créer un rôle" + +#: storage/ipc/signalfuncs.c:125 #, c-format -msgid "must be a superuser to cancel superuser query" -msgstr "doit être super-utilisateur pour annuler la requête d'un super-utilisateur" +msgid "Only roles with the %s attribute may cancel queries of roles with the %s attribute." +msgstr "" -#: storage/ipc/signalfuncs.c:129 +#: storage/ipc/signalfuncs.c:132 #, c-format -msgid "must be a member of the role whose query is being canceled or member of pg_signal_backend" -msgstr "doit être un membre du rôle dont la requête est en cours d'annulation ou membre de pg_signal_backend" +msgid "Only roles with privileges of the role whose query is being canceled or with privileges of the \"%s\" role may cancel this query." +msgstr "" -#: storage/ipc/signalfuncs.c:170 +#: storage/ipc/signalfuncs.c:174 #, c-format msgid "could not check the existence of the backend with PID %d: %m" msgstr "n'a pas pu vérifier l'existence du processus serveur de PID %d : %m" -#: storage/ipc/signalfuncs.c:188 +#: storage/ipc/signalfuncs.c:192 #, c-format msgid "backend with PID %d did not terminate within %lld millisecond" msgid_plural "backend with PID %d did not terminate within %lld milliseconds" msgstr[0] "le processus serveur de PID %d ne s'est pas terminé en %lld seconde" msgstr[1] "le processus serveur de PID %d ne s'est pas terminé en %lld secondes" -#: storage/ipc/signalfuncs.c:219 +#: storage/ipc/signalfuncs.c:223 #, c-format msgid "\"timeout\" must not be negative" msgstr "« timeout » ne doit pas être négatif" -#: storage/ipc/signalfuncs.c:271 +#: storage/ipc/signalfuncs.c:279 #, c-format msgid "must be superuser to rotate log files with adminpack 1.0" msgstr "doit être super-utilisateur pour exécuter la rotation des journaux applicatifs avec adminpack 1.0" #. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:273 utils/adt/genfile.c:250 +#: storage/ipc/signalfuncs.c:281 utils/adt/genfile.c:250 #, c-format msgid "Consider using %s, which is part of core, instead." msgstr "Considérer l'utilisation de %s, qui fait partie de l'installation par défaut, à la place." -#: storage/ipc/signalfuncs.c:279 storage/ipc/signalfuncs.c:299 +#: storage/ipc/signalfuncs.c:287 storage/ipc/signalfuncs.c:307 #, c-format msgid "rotation not possible because log collection not active" msgstr "rotation impossible car la récupération des journaux applicatifs n'est pas activée" -#: storage/ipc/standby.c:307 +#: storage/ipc/standby.c:330 #, c-format msgid "recovery still waiting after %ld.%03d ms: %s" msgstr "restauration toujours en attente après %ld.%03d ms : %s" -#: storage/ipc/standby.c:316 +#: storage/ipc/standby.c:339 #, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "la restauration a fini d'attendre après %ld.%03d ms : %s" -#: storage/ipc/standby.c:883 tcop/postgres.c:3344 +#: storage/ipc/standby.c:921 tcop/postgres.c:3384 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "annulation de la requête à cause d'un conflit avec la restauration" -#: storage/ipc/standby.c:884 tcop/postgres.c:2499 +#: storage/ipc/standby.c:922 tcop/postgres.c:2533 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "La transaction de l'utilisateur causait un verrou mortel lors de la restauration." -#: storage/ipc/standby.c:1423 +#: storage/ipc/standby.c:1488 msgid "unknown reason" msgstr "raison inconnue" -#: storage/ipc/standby.c:1428 +#: storage/ipc/standby.c:1493 msgid "recovery conflict on buffer pin" msgstr "conflit de restauration sur un verrou de tampon" -#: storage/ipc/standby.c:1431 +#: storage/ipc/standby.c:1496 msgid "recovery conflict on lock" msgstr "conflit de restauration sur le verrou" -#: storage/ipc/standby.c:1434 +#: storage/ipc/standby.c:1499 msgid "recovery conflict on tablespace" msgstr "conflit lors de la restauration sur un tablespace" -#: storage/ipc/standby.c:1437 +#: storage/ipc/standby.c:1502 msgid "recovery conflict on snapshot" msgstr "conflit de restauration sur une image" -#: storage/ipc/standby.c:1440 +#: storage/ipc/standby.c:1505 +#, fuzzy +#| msgid "recovery conflict on snapshot" +msgid "recovery conflict on replication slot" +msgstr "conflit de restauration sur une image" + +#: storage/ipc/standby.c:1508 msgid "recovery conflict on buffer deadlock" msgstr "conflit de restauration sur un deadlock de tampon" -#: storage/ipc/standby.c:1443 +#: storage/ipc/standby.c:1511 msgid "recovery conflict on database" msgstr "conflit de restauration sur la base de données" @@ -22597,22 +23166,22 @@ msgstr "paramétrage de « whence » invalide : %d" msgid "invalid large object write request size: %d" msgstr "taille de la requête d'écriture du « Large Object » invalide : %d" -#: storage/lmgr/deadlock.c:1122 +#: storage/lmgr/deadlock.c:1104 #, c-format msgid "Process %d waits for %s on %s; blocked by process %d." msgstr "Le processus %d attend %s sur %s ; bloqué par le processus %d." -#: storage/lmgr/deadlock.c:1141 +#: storage/lmgr/deadlock.c:1123 #, c-format msgid "Process %d: %s" msgstr "Processus %d : %s" -#: storage/lmgr/deadlock.c:1150 +#: storage/lmgr/deadlock.c:1132 #, c-format msgid "deadlock detected" msgstr "interblocage (deadlock) détecté" -#: storage/lmgr/deadlock.c:1153 +#: storage/lmgr/deadlock.c:1135 #, c-format msgid "See server log for query details." msgstr "Voir les journaux applicatifs du serveur pour les détails sur la requête." @@ -22657,194 +23226,188 @@ msgstr "lors de la re-vérification de l'enregistrement mis à jour (%u,%u) dans msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "lors de la vérification de la contrainte d'exclusion sur l'enregistrement (%u,%u) dans la relation « %s »" -#: storage/lmgr/lmgr.c:1135 +#: storage/lmgr/lmgr.c:1174 #, c-format msgid "relation %u of database %u" msgstr "relation %u de la base de données %u" -#: storage/lmgr/lmgr.c:1141 +#: storage/lmgr/lmgr.c:1180 #, c-format msgid "extension of relation %u of database %u" msgstr "extension de la relation %u de la base de données %u" -#: storage/lmgr/lmgr.c:1147 +#: storage/lmgr/lmgr.c:1186 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid de la base %u" -#: storage/lmgr/lmgr.c:1152 +#: storage/lmgr/lmgr.c:1191 #, c-format msgid "page %u of relation %u of database %u" msgstr "page %u de la relation %u de la base de données %u" -#: storage/lmgr/lmgr.c:1159 +#: storage/lmgr/lmgr.c:1198 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "ligne (%u,%u) de la relation %u de la base de données %u" -#: storage/lmgr/lmgr.c:1167 +#: storage/lmgr/lmgr.c:1206 #, c-format msgid "transaction %u" msgstr "transaction %u" -#: storage/lmgr/lmgr.c:1172 +#: storage/lmgr/lmgr.c:1211 #, c-format msgid "virtual transaction %d/%u" msgstr "transaction virtuelle %d/%u" -#: storage/lmgr/lmgr.c:1178 +#: storage/lmgr/lmgr.c:1217 #, c-format msgid "speculative token %u of transaction %u" msgstr "jeton spéculatif %u de la transaction %u" -#: storage/lmgr/lmgr.c:1184 +#: storage/lmgr/lmgr.c:1223 #, c-format msgid "object %u of class %u of database %u" msgstr "objet %u de la classe %u de la base de données %u" -#: storage/lmgr/lmgr.c:1192 +#: storage/lmgr/lmgr.c:1231 #, c-format msgid "user lock [%u,%u,%u]" msgstr "verrou utilisateur [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1199 +#: storage/lmgr/lmgr.c:1238 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "verrou informatif [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1207 +#: storage/lmgr/lmgr.c:1246 +#, fuzzy, c-format +#| msgid "extension of relation %u of database %u" +msgid "remote transaction %u of subscription %u of database %u" +msgstr "extension de la relation %u de la base de données %u" + +#: storage/lmgr/lmgr.c:1253 #, c-format msgid "unrecognized locktag type %d" msgstr "type locktag non reconnu %d" -#: storage/lmgr/lock.c:803 +#: storage/lmgr/lock.c:791 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" msgstr "" "ne peut pas acquérir le mode de verrou %s sur les objets de base de données\n" "alors que la restauration est en cours" -#: storage/lmgr/lock.c:805 +#: storage/lmgr/lock.c:793 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "" "Seuls RowExclusiveLock et les verrous inférieurs peuvent être acquis sur les\n" "objets d'une base pendant une restauration." -#: storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 storage/lmgr/lock.c:2846 -#: storage/lmgr/lock.c:4260 storage/lmgr/lock.c:4325 storage/lmgr/lock.c:4675 -#, c-format -msgid "You might need to increase max_locks_per_transaction." -msgstr "Vous pourriez avoir besoin d'augmenter max_locks_per_transaction." - -#: storage/lmgr/lock.c:3301 storage/lmgr/lock.c:3369 storage/lmgr/lock.c:3485 +#: storage/lmgr/lock.c:3235 storage/lmgr/lock.c:3303 storage/lmgr/lock.c:3419 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" msgstr "ne peut pas utiliser PREPARE lorsque des verrous de niveau session et deniveau transaction sont détenus sur le même objet" -#: storage/lmgr/predicate.c:700 +#: storage/lmgr/predicate.c:649 #, c-format msgid "not enough elements in RWConflictPool to record a read/write conflict" msgstr "pas assez d'éléments dans RWConflictPool pour enregistrer un conflit en lecture/écriture" -#: storage/lmgr/predicate.c:701 storage/lmgr/predicate.c:729 +#: storage/lmgr/predicate.c:650 storage/lmgr/predicate.c:675 #, c-format msgid "You might need to run fewer transactions at a time or increase max_connections." msgstr "" "Il est possible que vous ayez à exécuter moins de transactions à la fois\n" "ou d'augmenter max_connections." -#: storage/lmgr/predicate.c:728 +#: storage/lmgr/predicate.c:674 #, c-format msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "pas assez d'éléments dans RWConflictPool pour enregistrer un conflit en lecture/écriture potentiel" -#: storage/lmgr/predicate.c:1695 +#: storage/lmgr/predicate.c:1630 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "« default_transaction_isolation » est configuré à « serializable »." -#: storage/lmgr/predicate.c:1696 +#: storage/lmgr/predicate.c:1631 #, c-format msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." msgstr "" "Vous pouvez utiliser « SET default_transaction_isolation = 'repeatable read' »\n" "pour modifier la valeur par défaut." -#: storage/lmgr/predicate.c:1747 +#: storage/lmgr/predicate.c:1682 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "une transaction important un snapshot ne doit pas être READ ONLY DEFERRABLE" -#: storage/lmgr/predicate.c:1826 utils/time/snapmgr.c:569 -#: utils/time/snapmgr.c:575 +#: storage/lmgr/predicate.c:1761 utils/time/snapmgr.c:570 +#: utils/time/snapmgr.c:576 #, c-format msgid "could not import the requested snapshot" msgstr "n'a pas pu importer le snapshot demandé" -#: storage/lmgr/predicate.c:1827 utils/time/snapmgr.c:576 +#: storage/lmgr/predicate.c:1762 utils/time/snapmgr.c:577 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "Le processus source de PID %d n'est plus en cours d'exécution." -#: storage/lmgr/predicate.c:2473 storage/lmgr/predicate.c:2488 -#: storage/lmgr/predicate.c:3970 -#, c-format -msgid "You might need to increase max_pred_locks_per_transaction." -msgstr "Vous pourriez avoir besoin d'augmenter max_pred_locks_per_transaction." - -#: storage/lmgr/predicate.c:4101 storage/lmgr/predicate.c:4137 -#: storage/lmgr/predicate.c:4170 storage/lmgr/predicate.c:4178 -#: storage/lmgr/predicate.c:4217 storage/lmgr/predicate.c:4459 -#: storage/lmgr/predicate.c:4796 storage/lmgr/predicate.c:4808 -#: storage/lmgr/predicate.c:4851 storage/lmgr/predicate.c:4889 +#: storage/lmgr/predicate.c:3935 storage/lmgr/predicate.c:3971 +#: storage/lmgr/predicate.c:4004 storage/lmgr/predicate.c:4012 +#: storage/lmgr/predicate.c:4051 storage/lmgr/predicate.c:4281 +#: storage/lmgr/predicate.c:4600 storage/lmgr/predicate.c:4612 +#: storage/lmgr/predicate.c:4659 storage/lmgr/predicate.c:4695 #, c-format msgid "could not serialize access due to read/write dependencies among transactions" msgstr "" "n'a pas pu sérialiser un accès à cause des dépendances de lecture/écriture\n" "parmi les transactions" -#: storage/lmgr/predicate.c:4103 storage/lmgr/predicate.c:4139 -#: storage/lmgr/predicate.c:4172 storage/lmgr/predicate.c:4180 -#: storage/lmgr/predicate.c:4219 storage/lmgr/predicate.c:4461 -#: storage/lmgr/predicate.c:4798 storage/lmgr/predicate.c:4810 -#: storage/lmgr/predicate.c:4853 storage/lmgr/predicate.c:4891 +#: storage/lmgr/predicate.c:3937 storage/lmgr/predicate.c:3973 +#: storage/lmgr/predicate.c:4006 storage/lmgr/predicate.c:4014 +#: storage/lmgr/predicate.c:4053 storage/lmgr/predicate.c:4283 +#: storage/lmgr/predicate.c:4602 storage/lmgr/predicate.c:4614 +#: storage/lmgr/predicate.c:4661 storage/lmgr/predicate.c:4697 #, c-format msgid "The transaction might succeed if retried." msgstr "La transaction pourrait réussir après une nouvelle tentative." -#: storage/lmgr/proc.c:355 +#: storage/lmgr/proc.c:349 #, c-format msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" msgstr "" "le nombre de connexions demandées par le serveur en attente dépasse\n" "max_wal_senders (actuellement %d)" -#: storage/lmgr/proc.c:1531 +#: storage/lmgr/proc.c:1480 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "" "le processus %d a évité un verrou mortel pour %s sur %s en modifiant l'ordre\n" "de la queue après %ld.%03d ms" -#: storage/lmgr/proc.c:1546 +#: storage/lmgr/proc.c:1495 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "" "le processus %d a détecté un verrou mortel alors qu'il était en attente de\n" "%s sur %s après %ld.%03d ms" -#: storage/lmgr/proc.c:1555 +#: storage/lmgr/proc.c:1504 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "le processus %d est toujours en attente de %s sur %s après %ld.%03d ms" -#: storage/lmgr/proc.c:1562 +#: storage/lmgr/proc.c:1511 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "le processus %d a acquis %s sur %s après %ld.%03d ms" -#: storage/lmgr/proc.c:1579 +#: storage/lmgr/proc.c:1528 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "le processus %d a échoué pour l'acquisition de %s sur %s après %ld.%03d ms" @@ -22877,258 +23440,275 @@ msgstr "longueurs d'élément corrompues : total %u, espace disponible %u" msgid "corrupted line pointer: offset = %u, size = %u" msgstr "pointeur de ligne corrompu : décalage = %u, taille = %u" -#: storage/smgr/md.c:470 +#: storage/smgr/md.c:487 storage/smgr/md.c:549 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "ne peut pas étendre le fichier « %s » de plus de %u blocs" -#: storage/smgr/md.c:485 +#: storage/smgr/md.c:502 storage/smgr/md.c:613 #, c-format msgid "could not extend file \"%s\": %m" msgstr "n'a pas pu étendre le fichier « %s » : %m" -#: storage/smgr/md.c:491 +#: storage/smgr/md.c:508 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "" "n'a pas pu étendre le fichier « %s » : a écrit seulement %d octets sur %d\n" "au bloc %u" -#: storage/smgr/md.c:706 +#: storage/smgr/md.c:591 +#, fuzzy, c-format +#| msgid "could not extend file \"%s\": %m" +msgid "could not extend file \"%s\" with FileFallocate(): %m" +msgstr "n'a pas pu étendre le fichier « %s » : %m" + +#: storage/smgr/md.c:782 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "n'a pas pu lire le bloc %u dans le fichier « %s » : %m" -#: storage/smgr/md.c:722 +#: storage/smgr/md.c:798 #, c-format msgid "could not read block %u in file \"%s\": read only %d of %d bytes" msgstr "" "n'a pas pu lire le bloc %u du fichier « %s » : a lu seulement %d octets\n" "sur %d" -#: storage/smgr/md.c:776 +#: storage/smgr/md.c:856 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "n'a pas pu écrire le bloc %u dans le fichier « %s » : %m" -#: storage/smgr/md.c:781 +#: storage/smgr/md.c:861 #, c-format msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" msgstr "" "n'a pas pu écrire le bloc %u du fichier « %s » : a seulement écrit %d\n" "octets sur %d" -#: storage/smgr/md.c:875 +#: storage/smgr/md.c:1012 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "n'a pas pu tronquer le fichier « %s » en %u blocs : il y a seulement %u blocs" -#: storage/smgr/md.c:930 +#: storage/smgr/md.c:1067 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "n'a pas pu tronquer le fichier « %s » en %u blocs : %m" -#: storage/smgr/md.c:1329 +#: storage/smgr/md.c:1494 #, c-format msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" msgstr "n'a pas pu ouvrir le fichier « %s » (bloc cible %u) : le segment précédent ne fait que %u blocs" -#: storage/smgr/md.c:1343 +#: storage/smgr/md.c:1508 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "n'a pas pu ouvrir le fichier « %s » (bloc cible %u) : %m" -#: tcop/fastpath.c:148 +#: tcop/fastpath.c:142 utils/fmgr/fmgr.c:2132 +#, c-format +msgid "function with OID %u does not exist" +msgstr "la fonction d'OID %u n'existe pas" + +#: tcop/fastpath.c:149 #, c-format msgid "cannot call function \"%s\" via fastpath interface" msgstr "ne peut pas appeler la fonction « %s » via l'interface fastpath" -#: tcop/fastpath.c:233 +#: tcop/fastpath.c:234 #, c-format msgid "fastpath function call: \"%s\" (OID %u)" msgstr "appel de fonction fastpath : « %s » (OID %u)" -#: tcop/fastpath.c:312 tcop/postgres.c:1341 tcop/postgres.c:1577 -#: tcop/postgres.c:2036 tcop/postgres.c:2280 +#: tcop/fastpath.c:313 tcop/postgres.c:1365 tcop/postgres.c:1601 +#: tcop/postgres.c:2059 tcop/postgres.c:2309 #, c-format msgid "duration: %s ms" msgstr "durée : %s ms" -#: tcop/fastpath.c:316 +#: tcop/fastpath.c:317 #, c-format msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" msgstr "durée : %s ms, appel de fonction fastpath : « %s » (OID %u)" -#: tcop/fastpath.c:352 +#: tcop/fastpath.c:353 #, c-format msgid "function call message contains %d arguments but function requires %d" msgstr "" "le message d'appel de la fonction contient %d arguments mais la fonction en\n" "requiert %d" -#: tcop/fastpath.c:360 +#: tcop/fastpath.c:361 #, c-format msgid "function call message contains %d argument formats but %d arguments" msgstr "" "le message d'appel de la fonction contient %d formats d'argument mais %d\n" " arguments" -#: tcop/fastpath.c:384 +#: tcop/fastpath.c:385 #, c-format msgid "invalid argument size %d in function call message" msgstr "taille de l'argument %d invalide dans le message d'appel de la fonction" -#: tcop/fastpath.c:447 +#: tcop/fastpath.c:448 #, c-format msgid "incorrect binary data format in function argument %d" msgstr "format des données binaires incorrect dans l'argument de la fonction %d" -#: tcop/postgres.c:444 tcop/postgres.c:4823 +#: tcop/postgres.c:463 tcop/postgres.c:4882 #, c-format msgid "invalid frontend message type %d" msgstr "type %d du message de l'interface invalide" -#: tcop/postgres.c:1051 +#: tcop/postgres.c:1072 #, c-format msgid "statement: %s" msgstr "instruction : %s" -#: tcop/postgres.c:1346 +#: tcop/postgres.c:1370 #, c-format msgid "duration: %s ms statement: %s" msgstr "durée : %s ms, instruction : %s" -#: tcop/postgres.c:1452 +#: tcop/postgres.c:1476 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "ne peut pas insérer les commandes multiples dans une instruction préparée" -#: tcop/postgres.c:1582 +#: tcop/postgres.c:1606 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "durée : %s ms, analyse %s : %s" -#: tcop/postgres.c:1648 tcop/postgres.c:2595 +#: tcop/postgres.c:1672 tcop/postgres.c:2629 #, c-format msgid "unnamed prepared statement does not exist" msgstr "l'instruction préparée non nommée n'existe pas" -#: tcop/postgres.c:1689 +#: tcop/postgres.c:1713 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "le message bind a %d formats de paramètres mais %d paramètres" -#: tcop/postgres.c:1695 +#: tcop/postgres.c:1719 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "le message bind fournit %d paramètres, mais l'instruction préparée « %s » en requiert %d" -#: tcop/postgres.c:1914 +#: tcop/postgres.c:1937 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "format des données binaires incorrect dans le paramètre bind %d" -#: tcop/postgres.c:2041 +#: tcop/postgres.c:2064 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "durée : %s ms, lien %s%s%s : %s" -#: tcop/postgres.c:2091 tcop/postgres.c:2678 +#: tcop/postgres.c:2118 tcop/postgres.c:2712 #, c-format msgid "portal \"%s\" does not exist" msgstr "le portail « %s » n'existe pas" -#: tcop/postgres.c:2160 +#: tcop/postgres.c:2189 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2162 tcop/postgres.c:2288 +#: tcop/postgres.c:2191 tcop/postgres.c:2317 msgid "execute fetch from" msgstr "exécute fetch à partir de" -#: tcop/postgres.c:2163 tcop/postgres.c:2289 +#: tcop/postgres.c:2192 tcop/postgres.c:2318 msgid "execute" msgstr "exécute" -#: tcop/postgres.c:2285 +#: tcop/postgres.c:2314 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "durée : %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2431 +#: tcop/postgres.c:2462 #, c-format msgid "prepare: %s" msgstr "préparation : %s" -#: tcop/postgres.c:2456 +#: tcop/postgres.c:2487 #, c-format msgid "parameters: %s" msgstr "paramètres : %s" -#: tcop/postgres.c:2471 +#: tcop/postgres.c:2502 #, c-format msgid "abort reason: recovery conflict" msgstr "raison de l'annulation : conflit de restauration" -#: tcop/postgres.c:2487 +#: tcop/postgres.c:2518 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "L'utilisateur conservait des blocs disques en mémoire partagée depuis trop longtemps." -#: tcop/postgres.c:2490 +#: tcop/postgres.c:2521 #, c-format msgid "User was holding a relation lock for too long." msgstr "L'utilisateur conservait un verrou sur une relation depuis trop longtemps." -#: tcop/postgres.c:2493 +#: tcop/postgres.c:2524 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "L'utilisateur utilisait ou pouvait utiliser un tablespace qui doit être supprimé." -#: tcop/postgres.c:2496 +#: tcop/postgres.c:2527 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "" "La requête de l'utilisateur pourrait avoir eu besoin de voir des versions de\n" "lignes qui doivent être supprimées." -#: tcop/postgres.c:2502 +#: tcop/postgres.c:2530 +#, fuzzy, c-format +#| msgid "cannot use a logical replication slot for physical replication" +msgid "User was using a logical replication slot that must be invalidated." +msgstr "ne peut pas utiliser un slot de réplication logique pour une réplication physique" + +#: tcop/postgres.c:2536 #, c-format msgid "User was connected to a database that must be dropped." msgstr "L'utilisateur était connecté à une base de donnée qui doit être supprimée." -#: tcop/postgres.c:2541 +#: tcop/postgres.c:2575 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "portail « %s » paramètre $%d = %s" -#: tcop/postgres.c:2544 +#: tcop/postgres.c:2578 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "portail « %s » paramètre $%d" -#: tcop/postgres.c:2550 +#: tcop/postgres.c:2584 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "paramètre de portail non nommé $%d = %s" -#: tcop/postgres.c:2553 +#: tcop/postgres.c:2587 #, c-format msgid "unnamed portal parameter $%d" msgstr "paramètre de portail non nommé $%d" -#: tcop/postgres.c:2898 +#: tcop/postgres.c:2932 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "arrêt des connexions suite à un signal SIGQUIT inattendu" -#: tcop/postgres.c:2904 +#: tcop/postgres.c:2938 #, c-format msgid "terminating connection because of crash of another server process" msgstr "arrêt de la connexion à cause de l'arrêt brutal d'un autre processus serveur" -#: tcop/postgres.c:2905 +#: tcop/postgres.c:2939 #, c-format msgid "The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory." msgstr "" @@ -23136,94 +23716,94 @@ msgstr "" "courante et de quitter car un autre processus serveur a quitté anormalement\n" "et qu'il existe probablement de la mémoire partagée corrompue." -#: tcop/postgres.c:2909 tcop/postgres.c:3270 +#: tcop/postgres.c:2943 tcop/postgres.c:3310 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "" "Dans un moment, vous devriez être capable de vous reconnecter à la base de\n" "données et de relancer votre commande." -#: tcop/postgres.c:2916 +#: tcop/postgres.c:2950 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "arrêt des connexions suite à la commande d'arrêt immédiat" -#: tcop/postgres.c:3002 +#: tcop/postgres.c:3036 #, c-format msgid "floating-point exception" msgstr "exception due à une virgule flottante" -#: tcop/postgres.c:3003 +#: tcop/postgres.c:3037 #, c-format msgid "An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero." msgstr "Une opération invalide sur les virgules flottantes a été signalée. Ceci signifie probablement un résultat en dehors de l'échelle ou une opération invalide telle qu'une division par zéro." -#: tcop/postgres.c:3174 +#: tcop/postgres.c:3214 #, c-format msgid "canceling authentication due to timeout" msgstr "annulation de l'authentification à cause du délai écoulé" -#: tcop/postgres.c:3178 +#: tcop/postgres.c:3218 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "arrêt du processus autovacuum suite à la demande de l'administrateur" -#: tcop/postgres.c:3182 +#: tcop/postgres.c:3222 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "arrêt des processus workers de réplication logique suite à la demande de l'administrateur" -#: tcop/postgres.c:3199 tcop/postgres.c:3209 tcop/postgres.c:3268 +#: tcop/postgres.c:3239 tcop/postgres.c:3249 tcop/postgres.c:3308 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "arrêt de la connexion à cause d'un conflit avec la restauration" -#: tcop/postgres.c:3220 +#: tcop/postgres.c:3260 #, c-format msgid "terminating connection due to administrator command" msgstr "arrêt des connexions suite à la demande de l'administrateur" -#: tcop/postgres.c:3251 +#: tcop/postgres.c:3291 #, c-format msgid "connection to client lost" msgstr "connexion au client perdue" -#: tcop/postgres.c:3321 +#: tcop/postgres.c:3361 #, c-format msgid "canceling statement due to lock timeout" msgstr "annulation de la requête à cause du délai écoulé pour l'obtention des verrous" -#: tcop/postgres.c:3328 +#: tcop/postgres.c:3368 #, c-format msgid "canceling statement due to statement timeout" msgstr "annulation de la requête à cause du délai écoulé pour l'exécution de l'instruction" -#: tcop/postgres.c:3335 +#: tcop/postgres.c:3375 #, c-format msgid "canceling autovacuum task" msgstr "annulation de la tâche d'autovacuum" -#: tcop/postgres.c:3358 +#: tcop/postgres.c:3398 #, c-format msgid "canceling statement due to user request" msgstr "annulation de la requête à la demande de l'utilisateur" -#: tcop/postgres.c:3372 +#: tcop/postgres.c:3412 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "arrêt des connexions suite à l'expiration du délai d'inactivité en transaction" -#: tcop/postgres.c:3383 +#: tcop/postgres.c:3423 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "arrêt des connexions suite à l'expiration du délai d'inactivité de la session" -#: tcop/postgres.c:3523 +#: tcop/postgres.c:3514 #, c-format msgid "stack depth limit exceeded" msgstr "dépassement de limite (en profondeur) de la pile" -#: tcop/postgres.c:3524 +#: tcop/postgres.c:3515 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "" @@ -23231,59 +23811,77 @@ msgstr "" "être assuré que la limite de profondeur de la pile de la plateforme est\n" "adéquate." -#: tcop/postgres.c:3587 +#: tcop/postgres.c:3562 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "« max_stack_depth » ne doit pas dépasser %ld ko." -#: tcop/postgres.c:3589 +#: tcop/postgres.c:3564 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "" "Augmenter la limite de profondeur de la pile sur votre plateforme via\n" "« ulimit -s » ou l'équivalent local." -#: tcop/postgres.c:3945 +#: tcop/postgres.c:3587 +#, fuzzy, c-format +#| msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." +msgid "client_connection_check_interval must be set to 0 on this platform." +msgstr "client_connection_check_interval doit être positionné à 0 sur les plateformes où POLLRDHUP manque" + +#: tcop/postgres.c:3608 +#, c-format +msgid "Cannot enable parameter when \"log_statement_stats\" is true." +msgstr "Ne peut pas activer le paramètre avec « log_statement_stats » à true." + +#: tcop/postgres.c:3623 +#, c-format +msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." +msgstr "" +"Ne peut pas activer « log_statement_stats » lorsque « log_parser_stats »,\n" +"« log_planner_stats » ou « log_executor_stats » est true." + +#: tcop/postgres.c:3971 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "argument invalide en ligne de commande pour le processus serveur : %s" -#: tcop/postgres.c:3946 tcop/postgres.c:3952 +#: tcop/postgres.c:3972 tcop/postgres.c:3978 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." -#: tcop/postgres.c:3950 +#: tcop/postgres.c:3976 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s : argument invalide en ligne de commande : %s" -#: tcop/postgres.c:4003 +#: tcop/postgres.c:4029 #, c-format msgid "%s: no database nor user name specified" msgstr "%s : ni base de données ni utilisateur spécifié" -#: tcop/postgres.c:4725 +#: tcop/postgres.c:4779 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "sous-type %d du message CLOSE invalide" -#: tcop/postgres.c:4760 +#: tcop/postgres.c:4816 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "sous-type %d du message DESCRIBE invalide" -#: tcop/postgres.c:4844 +#: tcop/postgres.c:4903 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "appels à la fonction fastpath non supportés dans une connexion de réplication" -#: tcop/postgres.c:4848 +#: tcop/postgres.c:4907 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "protocole étendu de requêtes non supporté dans une connexion de réplication" -#: tcop/postgres.c:5025 +#: tcop/postgres.c:5087 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "" @@ -23337,13 +23935,20 @@ msgstr "" msgid "cannot execute %s within a background process" msgstr "ne peut pas exécuter %s dans un processus en tâche de fond" -#: tcop/utility.c:953 +#. translator: %s is name of a SQL command, eg CHECKPOINT +#: tcop/utility.c:954 +#, fuzzy, c-format +#| msgid "permission denied for sequence %s" +msgid "permission denied to execute %s command" +msgstr "droit refusé pour la séquence %s" + +#: tcop/utility.c:956 #, fuzzy, c-format -#| msgid "must be superuser to do CHECKPOINT" -msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" -msgstr "doit être super-utilisateur pour exécuter un point de vérification (CHECKPOINT)" +#| msgid "Set the privileges of the element type instead." +msgid "Only roles with privileges of the \"%s\" role may execute this command." +msgstr "Configurez les droits du type élément à la place." -#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:616 #, c-format msgid "multiple DictFile parameters" msgstr "multiples paramètres DictFile" @@ -23363,7 +23968,7 @@ msgstr "paramètre Ispell non reconnu : « %s »" msgid "missing AffFile parameter" msgstr "paramètre AffFile manquant" -#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:639 +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:640 #, c-format msgid "missing DictFile parameter" msgstr "paramètre DictFile manquant" @@ -23452,28 +24057,28 @@ msgstr "" msgid "thesaurus substitute phrase is empty (rule %d)" msgstr "la phrase substitut du thésaurus est vide (règle %d)" -#: tsearch/dict_thesaurus.c:624 +#: tsearch/dict_thesaurus.c:625 #, c-format msgid "multiple Dictionary parameters" msgstr "multiples paramètres Dictionary" -#: tsearch/dict_thesaurus.c:631 +#: tsearch/dict_thesaurus.c:632 #, c-format msgid "unrecognized Thesaurus parameter: \"%s\"" msgstr "paramètre Thesaurus non reconnu : « %s »" -#: tsearch/dict_thesaurus.c:643 +#: tsearch/dict_thesaurus.c:644 #, c-format msgid "missing Dictionary parameter" msgstr "paramètre Dictionary manquant" #: tsearch/spell.c:381 tsearch/spell.c:398 tsearch/spell.c:407 -#: tsearch/spell.c:1063 +#: tsearch/spell.c:1043 #, c-format msgid "invalid affix flag \"%s\"" msgstr "drapeau d'affixe invalide « %s »" -#: tsearch/spell.c:385 tsearch/spell.c:1067 +#: tsearch/spell.c:385 tsearch/spell.c:1047 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "le drapeau d'affixe « %s » est en dehors des limites" @@ -23493,65 +24098,60 @@ msgstr "drapeau d'affixe invalide « %s » avec la valeur de drapeau « long »" msgid "could not open dictionary file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier dictionnaire « %s » : %m" -#: tsearch/spell.c:764 utils/adt/regexp.c:209 -#, c-format -msgid "invalid regular expression: %s" -msgstr "expression rationnelle invalide : %s" - -#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1762 -#: tsearch/spell.c:1767 tsearch/spell.c:1772 +#: tsearch/spell.c:1170 tsearch/spell.c:1182 tsearch/spell.c:1742 +#: tsearch/spell.c:1747 tsearch/spell.c:1752 #, c-format msgid "invalid affix alias \"%s\"" msgstr "alias d'affixe invalide « %s »" -#: tsearch/spell.c:1243 tsearch/spell.c:1314 tsearch/spell.c:1463 +#: tsearch/spell.c:1223 tsearch/spell.c:1294 tsearch/spell.c:1443 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier affixe « %s » : %m" -#: tsearch/spell.c:1297 +#: tsearch/spell.c:1277 #, c-format msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" msgstr "le dictionnaire Ispell supporte seulement les valeurs de drapeau « default », « long » et « num »" -#: tsearch/spell.c:1341 +#: tsearch/spell.c:1321 #, c-format msgid "invalid number of flag vector aliases" msgstr "nombre d'alias de vecteur de drapeau invalide" -#: tsearch/spell.c:1364 +#: tsearch/spell.c:1344 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "le nombre d'alias excède le nombre %d spécifié" -#: tsearch/spell.c:1579 +#: tsearch/spell.c:1559 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "le fichier d'affixes contient des commandes ancien et nouveau style" -#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1127 +#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:278 utils/adt/tsvector_op.c:1128 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "la chaîne est trop longue (%d octets, max %d octets)" -#: tsearch/ts_locale.c:227 +#: tsearch/ts_locale.c:238 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "ligne %d du fichier de configuration « %s » : « %s »" -#: tsearch/ts_locale.c:307 +#: tsearch/ts_locale.c:317 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "échec de l'encodage de wchar_t vers l'encodage du serveur : %m" -#: tsearch/ts_parse.c:386 tsearch/ts_parse.c:393 tsearch/ts_parse.c:572 -#: tsearch/ts_parse.c:579 +#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 +#: tsearch/ts_parse.c:580 #, c-format msgid "word is too long to be indexed" msgstr "le mot est trop long pour être indexé" -#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 -#: tsearch/ts_parse.c:580 +#: tsearch/ts_parse.c:388 tsearch/ts_parse.c:395 tsearch/ts_parse.c:574 +#: tsearch/ts_parse.c:581 #, c-format msgid "Words longer than %d characters are ignored." msgstr "Les mots de plus de %d caractères sont ignorés." @@ -23566,76 +24166,76 @@ msgstr "nom du fichier de configuration de la recherche plein texte invalide : msgid "could not open stop-word file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier des termes courants « %s » : %m" -#: tsearch/wparser.c:313 tsearch/wparser.c:401 tsearch/wparser.c:478 +#: tsearch/wparser.c:308 tsearch/wparser.c:396 tsearch/wparser.c:473 #, c-format msgid "text search parser does not support headline creation" msgstr "l'analyseur de recherche plein texte ne supporte pas headline" -#: tsearch/wparser_def.c:2574 +#: tsearch/wparser_def.c:2663 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "paramètre headline non reconnu : « %s »" -#: tsearch/wparser_def.c:2593 +#: tsearch/wparser_def.c:2673 #, c-format msgid "MinWords should be less than MaxWords" msgstr "MinWords doit avoir une valeur plus petite que celle de MaxWords" -#: tsearch/wparser_def.c:2597 +#: tsearch/wparser_def.c:2677 #, c-format msgid "MinWords should be positive" msgstr "MinWords doit être positif" -#: tsearch/wparser_def.c:2601 +#: tsearch/wparser_def.c:2681 #, c-format msgid "ShortWord should be >= 0" msgstr "ShortWord devrait être positif ou nul" -#: tsearch/wparser_def.c:2605 +#: tsearch/wparser_def.c:2685 #, c-format msgid "MaxFragments should be >= 0" msgstr "MaxFragments devrait être positif ou nul" -#: utils/activity/pgstat.c:421 +#: utils/activity/pgstat.c:438 #, fuzzy, c-format #| msgid "could not open statistics file \"%s\": %m" msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier de statistiques « %s » : %m" -#: utils/activity/pgstat.c:1209 +#: utils/activity/pgstat.c:1252 #, fuzzy, c-format #| msgid "unrecognized statistics kind \"%s\"" msgid "invalid statistics kind: \"%s\"" msgstr "type de statistique « %s » non reconnu" -#: utils/activity/pgstat.c:1289 +#: utils/activity/pgstat.c:1332 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier temporaire des statistiques « %s » : %m" -#: utils/activity/pgstat.c:1395 +#: utils/activity/pgstat.c:1444 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "n'a pas pu écrire le fichier temporaire des statistiques « %s » : %m" -#: utils/activity/pgstat.c:1404 +#: utils/activity/pgstat.c:1453 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "n'a pas pu fermer le fichier temporaire des statistiques « %s » : %m" -#: utils/activity/pgstat.c:1412 +#: utils/activity/pgstat.c:1461 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "" "n'a pas pu renommer le fichier temporaire des statistiques « %s » en\n" "« %s » : %m" -#: utils/activity/pgstat.c:1461 +#: utils/activity/pgstat.c:1510 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier de statistiques « %s » : %m" -#: utils/activity/pgstat.c:1617 +#: utils/activity/pgstat.c:1672 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "fichier de statistiques « %s » corrompu" @@ -23646,447 +24246,437 @@ msgstr "fichier de statistiques « %s » corrompu" msgid "function call to dropped function" msgstr "la fonction « %s » n'est pas une fonction window" -#: utils/activity/pgstat_xact.c:371 +#: utils/activity/pgstat_xact.c:363 #, c-format msgid "resetting existing statistics for kind %s, db=%u, oid=%u" msgstr "" -#: utils/adt/acl.c:168 utils/adt/name.c:93 +#: utils/adt/acl.c:177 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "identifiant trop long" -#: utils/adt/acl.c:169 utils/adt/name.c:94 +#: utils/adt/acl.c:178 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "L'identifiant doit faire moins de %d caractères." -#: utils/adt/acl.c:252 +#: utils/adt/acl.c:266 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "mot clé non reconnu : « %s »" -#: utils/adt/acl.c:253 +#: utils/adt/acl.c:267 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "le mot clé ACL doit être soit « group » soit « user »." -#: utils/adt/acl.c:258 +#: utils/adt/acl.c:275 #, c-format msgid "missing name" msgstr "nom manquant" -#: utils/adt/acl.c:259 +#: utils/adt/acl.c:276 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "Un nom doit suivre le mot clé « group » ou « user »." -#: utils/adt/acl.c:265 +#: utils/adt/acl.c:282 #, c-format msgid "missing \"=\" sign" msgstr "signe « = » manquant" -#: utils/adt/acl.c:324 +#: utils/adt/acl.c:341 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "mode caractère invalide : doit faire partie de « %s »" -#: utils/adt/acl.c:346 +#: utils/adt/acl.c:371 #, c-format msgid "a name must follow the \"/\" sign" msgstr "un nom doit suivre le signe « / »" -#: utils/adt/acl.c:354 +#: utils/adt/acl.c:383 #, c-format msgid "defaulting grantor to user ID %u" msgstr "par défaut, le « donneur de droits » devient l'utilisateur d'identifiant %u" -#: utils/adt/acl.c:540 +#: utils/adt/acl.c:569 #, c-format msgid "ACL array contains wrong data type" msgstr "le tableau d'ACL contient un type de données incorrect" -#: utils/adt/acl.c:544 +#: utils/adt/acl.c:573 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "les tableaux d'ACL ne doivent avoir qu'une seule dimension" -#: utils/adt/acl.c:548 +#: utils/adt/acl.c:577 #, c-format msgid "ACL arrays must not contain null values" msgstr "les tableaux d'ACL ne doivent pas contenir de valeurs NULL" -#: utils/adt/acl.c:572 +#: utils/adt/acl.c:606 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "données superflues à la fin de la spécification de l'ACL" -#: utils/adt/acl.c:1214 +#: utils/adt/acl.c:1248 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "les options grant ne peuvent pas être rendues à votre propre donateur" -#: utils/adt/acl.c:1275 +#: utils/adt/acl.c:1564 #, c-format -msgid "dependent privileges exist" -msgstr "des privilèges dépendants existent" +msgid "aclinsert is no longer supported" +msgstr "aclinsert n'est plus supporté" -#: utils/adt/acl.c:1276 -#, c-format -msgid "Use CASCADE to revoke them too." -msgstr "Utilisez CASCADE pour les révoquer aussi." - -#: utils/adt/acl.c:1530 -#, c-format -msgid "aclinsert is no longer supported" -msgstr "aclinsert n'est plus supporté" - -#: utils/adt/acl.c:1540 +#: utils/adt/acl.c:1574 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove n'est plus supporté" -#: utils/adt/acl.c:1630 utils/adt/acl.c:1684 +#: utils/adt/acl.c:1693 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "type de droit non reconnu : « %s »" -#: utils/adt/acl.c:3469 utils/adt/regproc.c:101 utils/adt/regproc.c:277 +#: utils/adt/acl.c:3476 utils/adt/regproc.c:100 utils/adt/regproc.c:265 #, c-format msgid "function \"%s\" does not exist" msgstr "la fonction « %s » n'existe pas" -#: utils/adt/acl.c:5008 -#, c-format -msgid "must be member of role \"%s\"" +#: utils/adt/acl.c:5023 +#, fuzzy, c-format +#| msgid "must be member of role \"%s\"" +msgid "must be able to SET ROLE \"%s\"" msgstr "doit être un membre du rôle « %s »" -#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:936 -#: utils/adt/arrayfuncs.c:1544 utils/adt/arrayfuncs.c:3263 -#: utils/adt/arrayfuncs.c:3405 utils/adt/arrayfuncs.c:5981 -#: utils/adt/arrayfuncs.c:6322 utils/adt/arrayutils.c:94 -#: utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 -#, c-format -msgid "array size exceeds the maximum allowed (%d)" -msgstr "la taille du tableau dépasse le maximum permis (%d)" - -#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:467 -#: utils/adt/array_userfuncs.c:547 utils/adt/json.c:645 utils/adt/json.c:740 -#: utils/adt/json.c:778 utils/adt/jsonb.c:1114 utils/adt/jsonb.c:1143 -#: utils/adt/jsonb.c:1537 utils/adt/jsonb.c:1701 utils/adt/jsonb.c:1711 +#: utils/adt/array_userfuncs.c:102 utils/adt/array_userfuncs.c:489 +#: utils/adt/array_userfuncs.c:878 utils/adt/json.c:694 utils/adt/json.c:831 +#: utils/adt/json.c:869 utils/adt/jsonb.c:1139 utils/adt/jsonb.c:1211 +#: utils/adt/jsonb.c:1629 utils/adt/jsonb.c:1817 utils/adt/jsonb.c:1827 #, c-format msgid "could not determine input data type" msgstr "n'a pas pu déterminer le type de données date en entrée" -#: utils/adt/array_userfuncs.c:85 +#: utils/adt/array_userfuncs.c:107 #, c-format msgid "input data type is not an array" msgstr "le type de données en entrée n'est pas un tableau" -#: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 -#: utils/adt/float.c:1234 utils/adt/float.c:1308 utils/adt/float.c:4046 -#: utils/adt/float.c:4060 utils/adt/int.c:777 utils/adt/int.c:799 -#: utils/adt/int.c:813 utils/adt/int.c:827 utils/adt/int.c:858 -#: utils/adt/int.c:879 utils/adt/int.c:996 utils/adt/int.c:1010 -#: utils/adt/int.c:1024 utils/adt/int.c:1057 utils/adt/int.c:1071 -#: utils/adt/int.c:1085 utils/adt/int.c:1116 utils/adt/int.c:1198 -#: utils/adt/int.c:1262 utils/adt/int.c:1330 utils/adt/int.c:1336 -#: utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4293 -#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 -#: utils/adt/varlena.c:3391 +#: utils/adt/array_userfuncs.c:151 utils/adt/array_userfuncs.c:203 +#: utils/adt/float.c:1228 utils/adt/float.c:1302 utils/adt/float.c:4117 +#: utils/adt/float.c:4155 utils/adt/int.c:778 utils/adt/int.c:800 +#: utils/adt/int.c:814 utils/adt/int.c:828 utils/adt/int.c:859 +#: utils/adt/int.c:880 utils/adt/int.c:997 utils/adt/int.c:1011 +#: utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 +#: utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 +#: utils/adt/int.c:1263 utils/adt/int.c:1331 utils/adt/int.c:1337 +#: utils/adt/int8.c:1257 utils/adt/numeric.c:1901 utils/adt/numeric.c:4388 +#: utils/adt/rangetypes.c:1481 utils/adt/rangetypes.c:1494 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1132 +#: utils/adt/varlena.c:3134 #, c-format msgid "integer out of range" msgstr "entier en dehors des limites" -#: utils/adt/array_userfuncs.c:136 utils/adt/array_userfuncs.c:191 +#: utils/adt/array_userfuncs.c:158 utils/adt/array_userfuncs.c:213 #, c-format msgid "argument must be empty or one-dimensional array" msgstr "l'argument doit être vide ou doit être un tableau à une dimension" -#: utils/adt/array_userfuncs.c:273 utils/adt/array_userfuncs.c:312 -#: utils/adt/array_userfuncs.c:349 utils/adt/array_userfuncs.c:378 -#: utils/adt/array_userfuncs.c:406 +#: utils/adt/array_userfuncs.c:295 utils/adt/array_userfuncs.c:334 +#: utils/adt/array_userfuncs.c:371 utils/adt/array_userfuncs.c:400 +#: utils/adt/array_userfuncs.c:428 #, c-format msgid "cannot concatenate incompatible arrays" msgstr "ne peut pas concaténer des tableaux non compatibles" -#: utils/adt/array_userfuncs.c:274 +#: utils/adt/array_userfuncs.c:296 #, c-format msgid "Arrays with element types %s and %s are not compatible for concatenation." msgstr "Les tableaux avec les types d'élément %s et %s ne sont pas compatibles pour la concaténation." -#: utils/adt/array_userfuncs.c:313 +#: utils/adt/array_userfuncs.c:335 #, c-format msgid "Arrays of %d and %d dimensions are not compatible for concatenation." msgstr "Les tableaux de dimensions %d et %d ne sont pas compatibles pour la concaténation." -#: utils/adt/array_userfuncs.c:350 +#: utils/adt/array_userfuncs.c:372 #, c-format msgid "Arrays with differing element dimensions are not compatible for concatenation." msgstr "Les tableaux avec des éléments de dimensions différentes ne sont pas compatibles pour une concaténation." -#: utils/adt/array_userfuncs.c:379 utils/adt/array_userfuncs.c:407 +#: utils/adt/array_userfuncs.c:401 utils/adt/array_userfuncs.c:429 #, c-format msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "Les tableaux de dimensions différentes ne sont pas compatibles pour une concaténation." -#: utils/adt/array_userfuncs.c:663 utils/adt/array_userfuncs.c:815 +#: utils/adt/array_userfuncs.c:987 utils/adt/array_userfuncs.c:995 +#: utils/adt/arrayfuncs.c:5590 utils/adt/arrayfuncs.c:5596 +#, c-format +msgid "cannot accumulate arrays of different dimensionality" +msgstr "ne peut pas accumuler des tableaux de dimensions différentes" + +#: utils/adt/array_userfuncs.c:1286 utils/adt/array_userfuncs.c:1440 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "la recherche d'éléments dans des tableaux multidimensionnels n'est pas supportée" -#: utils/adt/array_userfuncs.c:687 +#: utils/adt/array_userfuncs.c:1315 #, c-format msgid "initial position must not be null" msgstr "la position initiale ne doit pas être NULL" -#: utils/adt/arrayfuncs.c:271 utils/adt/arrayfuncs.c:285 -#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:318 -#: utils/adt/arrayfuncs.c:333 utils/adt/arrayfuncs.c:347 -#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 -#: utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:509 -#: utils/adt/arrayfuncs.c:520 utils/adt/arrayfuncs.c:535 -#: utils/adt/arrayfuncs.c:556 utils/adt/arrayfuncs.c:586 -#: utils/adt/arrayfuncs.c:593 utils/adt/arrayfuncs.c:601 -#: utils/adt/arrayfuncs.c:635 utils/adt/arrayfuncs.c:658 -#: utils/adt/arrayfuncs.c:678 utils/adt/arrayfuncs.c:790 -#: utils/adt/arrayfuncs.c:799 utils/adt/arrayfuncs.c:829 -#: utils/adt/arrayfuncs.c:844 utils/adt/arrayfuncs.c:897 +#: utils/adt/array_userfuncs.c:1688 +#, fuzzy, c-format +#| msgid "sample percentage must be between 0 and 100" +msgid "sample size must be between 0 and %d" +msgstr "le pourcentage de l'échantillonnage doit être compris entre 0 et 100" + +#: utils/adt/arrayfuncs.c:273 utils/adt/arrayfuncs.c:287 +#: utils/adt/arrayfuncs.c:298 utils/adt/arrayfuncs.c:320 +#: utils/adt/arrayfuncs.c:337 utils/adt/arrayfuncs.c:351 +#: utils/adt/arrayfuncs.c:359 utils/adt/arrayfuncs.c:366 +#: utils/adt/arrayfuncs.c:506 utils/adt/arrayfuncs.c:521 +#: utils/adt/arrayfuncs.c:532 utils/adt/arrayfuncs.c:547 +#: utils/adt/arrayfuncs.c:568 utils/adt/arrayfuncs.c:598 +#: utils/adt/arrayfuncs.c:605 utils/adt/arrayfuncs.c:613 +#: utils/adt/arrayfuncs.c:647 utils/adt/arrayfuncs.c:670 +#: utils/adt/arrayfuncs.c:690 utils/adt/arrayfuncs.c:807 +#: utils/adt/arrayfuncs.c:816 utils/adt/arrayfuncs.c:846 +#: utils/adt/arrayfuncs.c:861 utils/adt/arrayfuncs.c:914 #, c-format msgid "malformed array literal: \"%s\"" -msgstr "tableau litéral mal formé : « %s »" +msgstr "tableau littéral mal formé : « %s »" -#: utils/adt/arrayfuncs.c:272 +#: utils/adt/arrayfuncs.c:274 #, c-format msgid "\"[\" must introduce explicitly-specified array dimensions." msgstr "« [ » doit introduire des dimensions explicites de tableau." -#: utils/adt/arrayfuncs.c:286 +#: utils/adt/arrayfuncs.c:288 #, c-format msgid "Missing array dimension value." msgstr "Valeur manquante de la dimension du tableau." -#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 +#: utils/adt/arrayfuncs.c:299 utils/adt/arrayfuncs.c:338 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "« %s » manquant après les dimensions du tableau." -#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2910 -#: utils/adt/arrayfuncs.c:2942 utils/adt/arrayfuncs.c:2957 +#: utils/adt/arrayfuncs.c:308 utils/adt/arrayfuncs.c:2933 +#: utils/adt/arrayfuncs.c:2965 utils/adt/arrayfuncs.c:2980 #, c-format msgid "upper bound cannot be less than lower bound" msgstr "la limite supérieure ne peut pas être plus petite que la limite inférieure" -#: utils/adt/arrayfuncs.c:319 +#: utils/adt/arrayfuncs.c:321 #, c-format msgid "Array value must start with \"{\" or dimension information." msgstr "La valeur du tableau doit commencer par « { » ou par l'information de la dimension." -#: utils/adt/arrayfuncs.c:348 +#: utils/adt/arrayfuncs.c:352 #, c-format msgid "Array contents must start with \"{\"." msgstr "Le contenu du tableau doit commencer par « { »." -#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 +#: utils/adt/arrayfuncs.c:360 utils/adt/arrayfuncs.c:367 #, c-format msgid "Specified array dimensions do not match array contents." msgstr "Les dimensions spécifiées du tableau ne correspondent pas au contenu du tableau." -#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:521 -#: utils/adt/multirangetypes.c:164 utils/adt/rangetypes.c:2310 -#: utils/adt/rangetypes.c:2318 utils/adt/rowtypes.c:211 -#: utils/adt/rowtypes.c:219 +#: utils/adt/arrayfuncs.c:507 utils/adt/arrayfuncs.c:533 +#: utils/adt/multirangetypes.c:166 utils/adt/rangetypes.c:2405 +#: utils/adt/rangetypes.c:2413 utils/adt/rowtypes.c:219 +#: utils/adt/rowtypes.c:230 #, c-format msgid "Unexpected end of input." msgstr "Fin de l'entrée inattendue." -#: utils/adt/arrayfuncs.c:510 utils/adt/arrayfuncs.c:557 -#: utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:522 utils/adt/arrayfuncs.c:569 +#: utils/adt/arrayfuncs.c:599 utils/adt/arrayfuncs.c:648 #, c-format msgid "Unexpected \"%c\" character." msgstr "Caractère « %c » inattendu." -#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 +#: utils/adt/arrayfuncs.c:548 utils/adt/arrayfuncs.c:671 #, c-format msgid "Unexpected array element." msgstr "Élément de tableau inattendu." -#: utils/adt/arrayfuncs.c:594 +#: utils/adt/arrayfuncs.c:606 #, c-format msgid "Unmatched \"%c\" character." msgstr "Caractère « %c » sans correspondance." -#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2489 +#: utils/adt/arrayfuncs.c:614 utils/adt/jsonfuncs.c:2553 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "Les tableaux multidimensionnels doivent avoir des sous-tableaux avec les dimensions correspondantes" -#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:287 +#: utils/adt/arrayfuncs.c:691 utils/adt/multirangetypes.c:293 #, c-format msgid "Junk after closing right brace." msgstr "Problème après la parenthèse droite fermante." -#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3371 -#: utils/adt/arrayfuncs.c:5885 +#: utils/adt/arrayfuncs.c:1325 utils/adt/arrayfuncs.c:3479 +#: utils/adt/arrayfuncs.c:6080 #, c-format msgid "invalid number of dimensions: %d" msgstr "nombre de dimensions invalide : %d" -#: utils/adt/arrayfuncs.c:1312 +#: utils/adt/arrayfuncs.c:1336 #, c-format msgid "invalid array flags" msgstr "drapeaux de tableau invalides" -#: utils/adt/arrayfuncs.c:1334 +#: utils/adt/arrayfuncs.c:1358 #, c-format msgid "binary data has array element type %u (%s) instead of expected %u (%s)" msgstr "la donnée binaire a le type des éléments du tableau, %u (%s), au lieu de l'attendu %u (%s)" -#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:445 -#: utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2915 +#: utils/adt/arrayfuncs.c:1402 utils/adt/multirangetypes.c:451 +#: utils/adt/rangetypes.c:344 utils/cache/lsyscache.c:2916 #, c-format msgid "no binary input function available for type %s" msgstr "aucune fonction d'entrée binaire disponible pour le type %s" -#: utils/adt/arrayfuncs.c:1518 +#: utils/adt/arrayfuncs.c:1542 #, c-format msgid "improper binary format in array element %d" msgstr "format binaire mal conçu dans l'élément du tableau %d" -#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:450 -#: utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2948 +#: utils/adt/arrayfuncs.c:1623 utils/adt/multirangetypes.c:456 +#: utils/adt/rangetypes.c:349 utils/cache/lsyscache.c:2949 #, c-format msgid "no binary output function available for type %s" msgstr "aucune fonction de sortie binaire disponible pour le type %s" -#: utils/adt/arrayfuncs.c:2078 +#: utils/adt/arrayfuncs.c:2102 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "les morceaux des tableaux à longueur fixe ne sont pas implémentés" -#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 -#: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2566 -#: utils/adt/arrayfuncs.c:2888 utils/adt/arrayfuncs.c:5871 -#: utils/adt/arrayfuncs.c:5897 utils/adt/arrayfuncs.c:5908 -#: utils/adt/json.c:1141 utils/adt/json.c:1215 utils/adt/jsonb.c:1315 -#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4325 utils/adt/jsonfuncs.c:4479 -#: utils/adt/jsonfuncs.c:4591 utils/adt/jsonfuncs.c:4640 +#: utils/adt/arrayfuncs.c:2280 utils/adt/arrayfuncs.c:2302 +#: utils/adt/arrayfuncs.c:2351 utils/adt/arrayfuncs.c:2589 +#: utils/adt/arrayfuncs.c:2911 utils/adt/arrayfuncs.c:6066 +#: utils/adt/arrayfuncs.c:6092 utils/adt/arrayfuncs.c:6103 +#: utils/adt/json.c:1497 utils/adt/json.c:1569 utils/adt/jsonb.c:1416 +#: utils/adt/jsonb.c:1500 utils/adt/jsonfuncs.c:4434 utils/adt/jsonfuncs.c:4587 +#: utils/adt/jsonfuncs.c:4698 utils/adt/jsonfuncs.c:4746 #, c-format msgid "wrong number of array subscripts" msgstr "mauvais nombre d'indices du tableau" -#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 -#: utils/adt/arrayfuncs.c:2633 utils/adt/arrayfuncs.c:2947 +#: utils/adt/arrayfuncs.c:2285 utils/adt/arrayfuncs.c:2393 +#: utils/adt/arrayfuncs.c:2656 utils/adt/arrayfuncs.c:2970 #, c-format msgid "array subscript out of range" msgstr "indice du tableau en dehors de l'intervalle" -#: utils/adt/arrayfuncs.c:2266 +#: utils/adt/arrayfuncs.c:2290 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "ne peut pas affecter une valeur NULL à un élément d'un tableau à longueur fixe" -#: utils/adt/arrayfuncs.c:2835 +#: utils/adt/arrayfuncs.c:2858 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "" "les mises à jour de morceaux des tableaux à longueur fixe ne sont pas\n" "implémentées" -#: utils/adt/arrayfuncs.c:2866 +#: utils/adt/arrayfuncs.c:2889 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "la tranche d'indice de tableau doit fournir les deux limites" -#: utils/adt/arrayfuncs.c:2867 +#: utils/adt/arrayfuncs.c:2890 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "Les limites de tranches doivent être entièrement spécifiées lors de l'assignation d'une valeur d'un tableau vide à une tranche." -#: utils/adt/arrayfuncs.c:2878 utils/adt/arrayfuncs.c:2974 +#: utils/adt/arrayfuncs.c:2901 utils/adt/arrayfuncs.c:2997 #, c-format msgid "source array too small" msgstr "tableau source trop petit" -#: utils/adt/arrayfuncs.c:3529 +#: utils/adt/arrayfuncs.c:3637 #, c-format msgid "null array element not allowed in this context" msgstr "élément NULL de tableau interdit dans ce contexte" -#: utils/adt/arrayfuncs.c:3631 utils/adt/arrayfuncs.c:3802 -#: utils/adt/arrayfuncs.c:4193 +#: utils/adt/arrayfuncs.c:3808 utils/adt/arrayfuncs.c:3979 +#: utils/adt/arrayfuncs.c:4370 #, c-format msgid "cannot compare arrays of different element types" msgstr "ne peut pas comparer des tableaux ayant des types d'éléments différents" -#: utils/adt/arrayfuncs.c:3980 utils/adt/multirangetypes.c:2799 -#: utils/adt/multirangetypes.c:2871 utils/adt/rangetypes.c:1343 -#: utils/adt/rangetypes.c:1407 utils/adt/rowtypes.c:1858 +#: utils/adt/arrayfuncs.c:4157 utils/adt/multirangetypes.c:2806 +#: utils/adt/multirangetypes.c:2878 utils/adt/rangetypes.c:1354 +#: utils/adt/rangetypes.c:1418 utils/adt/rowtypes.c:1885 #, c-format msgid "could not identify a hash function for type %s" msgstr "n'a pas pu identifier une fonction de hachage pour le type %s" -#: utils/adt/arrayfuncs.c:4108 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4285 utils/adt/rowtypes.c:2006 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "n'a pas pu identifier une fonction de hachage étendue pour le type %s" -#: utils/adt/arrayfuncs.c:5285 +#: utils/adt/arrayfuncs.c:5480 #, c-format msgid "data type %s is not an array type" msgstr "le type de données %s n'est pas un type tableau" -#: utils/adt/arrayfuncs.c:5340 +#: utils/adt/arrayfuncs.c:5535 #, c-format msgid "cannot accumulate null arrays" msgstr "ne peut pas accumuler des tableaux NULL" -#: utils/adt/arrayfuncs.c:5368 +#: utils/adt/arrayfuncs.c:5563 #, c-format msgid "cannot accumulate empty arrays" msgstr "ne peut pas concaténer des tableaux vides" -#: utils/adt/arrayfuncs.c:5395 utils/adt/arrayfuncs.c:5401 -#, c-format -msgid "cannot accumulate arrays of different dimensionality" -msgstr "ne peut pas accumuler des tableaux de dimensions différentes" - -#: utils/adt/arrayfuncs.c:5769 utils/adt/arrayfuncs.c:5809 +#: utils/adt/arrayfuncs.c:5964 utils/adt/arrayfuncs.c:6004 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "la dimension ou la limite basse du tableau ne peut pas être NULL" -#: utils/adt/arrayfuncs.c:5872 utils/adt/arrayfuncs.c:5898 +#: utils/adt/arrayfuncs.c:6067 utils/adt/arrayfuncs.c:6093 #, c-format msgid "Dimension array must be one dimensional." msgstr "Le tableau doit avoir une seule dimension." -#: utils/adt/arrayfuncs.c:5877 utils/adt/arrayfuncs.c:5903 +#: utils/adt/arrayfuncs.c:6072 utils/adt/arrayfuncs.c:6098 #, c-format msgid "dimension values cannot be null" msgstr "les valeurs de dimension ne peuvent pas être NULL" -#: utils/adt/arrayfuncs.c:5909 +#: utils/adt/arrayfuncs.c:6104 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "La limite basse du tableau a une taille différentes des dimensions du tableau." -#: utils/adt/arrayfuncs.c:6187 +#: utils/adt/arrayfuncs.c:6382 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "la suppression d'éléments de tableaux multidimensionnels n'est pas supportée" -#: utils/adt/arrayfuncs.c:6464 +#: utils/adt/arrayfuncs.c:6659 #, c-format msgid "thresholds must be one-dimensional array" msgstr "les limites doivent être un tableau à une dimension" -#: utils/adt/arrayfuncs.c:6469 +#: utils/adt/arrayfuncs.c:6664 #, c-format msgid "thresholds array must not contain NULLs" msgstr "le tableau de limites ne doit pas contenir de valeurs NULL" -#: utils/adt/arrayfuncs.c:6702 +#: utils/adt/arrayfuncs.c:6897 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "le nombre d'éléments à couper doit être compris entre 0 et %d" @@ -24101,88 +24691,86 @@ msgstr "l'indice d'un tableau doit être de type entier" msgid "array subscript in assignment must not be null" msgstr "l'indice du tableau dans l'affectation ne doit pas être NULL" -#: utils/adt/arrayutils.c:140 +#: utils/adt/arrayutils.c:161 #, c-format msgid "array lower bound is too large: %d" msgstr "la limite basse du tableau est trop grande : %d" -#: utils/adt/arrayutils.c:240 +#: utils/adt/arrayutils.c:263 #, c-format msgid "typmod array must be type cstring[]" msgstr "le tableau typmod doit être de type cstring[]" -#: utils/adt/arrayutils.c:245 +#: utils/adt/arrayutils.c:268 #, c-format msgid "typmod array must be one-dimensional" msgstr "le tableau typmod doit avoir une seule dimension" -#: utils/adt/arrayutils.c:250 +#: utils/adt/arrayutils.c:273 #, c-format msgid "typmod array must not contain nulls" msgstr "le tableau typmod ne doit pas contenir de valeurs NULL" -#: utils/adt/ascii.c:76 +#: utils/adt/ascii.c:77 #, c-format msgid "encoding conversion from %s to ASCII not supported" msgstr "la conversion de l'encodage de %s vers l'ASCII n'est pas supportée" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:276 utils/adt/datetime.c:4058 -#: utils/adt/float.c:188 utils/adt/float.c:272 utils/adt/float.c:284 -#: utils/adt/float.c:401 utils/adt/float.c:486 utils/adt/float.c:502 -#: utils/adt/geo_ops.c:220 utils/adt/geo_ops.c:230 utils/adt/geo_ops.c:242 -#: utils/adt/geo_ops.c:274 utils/adt/geo_ops.c:316 utils/adt/geo_ops.c:326 -#: utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1389 utils/adt/geo_ops.c:1424 -#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3392 utils/adt/geo_ops.c:4607 -#: utils/adt/geo_ops.c:4622 utils/adt/geo_ops.c:4629 utils/adt/int.c:173 -#: utils/adt/int.c:185 utils/adt/jsonpath.c:182 utils/adt/mac.c:93 -#: utils/adt/mac8.c:93 utils/adt/mac8.c:166 utils/adt/mac8.c:184 -#: utils/adt/mac8.c:202 utils/adt/mac8.c:221 utils/adt/network.c:99 -#: utils/adt/numeric.c:698 utils/adt/numeric.c:717 utils/adt/numeric.c:6882 -#: utils/adt/numeric.c:6906 utils/adt/numeric.c:6930 utils/adt/numeric.c:7932 -#: utils/adt/numutils.c:158 utils/adt/numutils.c:234 utils/adt/numutils.c:318 -#: utils/adt/oid.c:44 utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 -#: utils/adt/pg_lsn.c:74 utils/adt/tid.c:76 utils/adt/tid.c:84 -#: utils/adt/tid.c:98 utils/adt/tid.c:107 utils/adt/timestamp.c:497 -#: utils/adt/uuid.c:135 utils/adt/xid8funcs.c:346 +#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:4017 +#: utils/adt/float.c:206 utils/adt/float.c:293 utils/adt/float.c:307 +#: utils/adt/float.c:412 utils/adt/float.c:495 utils/adt/float.c:509 +#: utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 +#: utils/adt/geo_ops.c:1417 utils/adt/geo_ops.c:1454 utils/adt/geo_ops.c:1462 +#: utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 +#: utils/adt/geo_ops.c:4672 utils/adt/int.c:174 utils/adt/int.c:186 +#: utils/adt/jsonpath.c:183 utils/adt/mac.c:94 utils/adt/mac8.c:225 +#: utils/adt/network.c:99 utils/adt/numeric.c:795 utils/adt/numeric.c:7136 +#: utils/adt/numeric.c:7339 utils/adt/numeric.c:8286 utils/adt/numutils.c:357 +#: utils/adt/numutils.c:619 utils/adt/numutils.c:881 utils/adt/numutils.c:920 +#: utils/adt/numutils.c:942 utils/adt/numutils.c:1006 utils/adt/numutils.c:1028 +#: utils/adt/pg_lsn.c:74 utils/adt/tid.c:72 utils/adt/tid.c:80 +#: utils/adt/tid.c:94 utils/adt/tid.c:103 utils/adt/timestamp.c:494 +#: utils/adt/uuid.c:135 utils/adt/xid8funcs.c:354 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "syntaxe en entrée invalide pour le type %s : « %s »" -#: utils/adt/cash.c:214 utils/adt/cash.c:239 utils/adt/cash.c:249 -#: utils/adt/cash.c:289 utils/adt/int.c:179 utils/adt/numutils.c:152 -#: utils/adt/numutils.c:228 utils/adt/numutils.c:312 utils/adt/oid.c:70 -#: utils/adt/oid.c:109 +#: utils/adt/cash.c:215 utils/adt/cash.c:240 utils/adt/cash.c:250 +#: utils/adt/cash.c:290 utils/adt/int.c:180 utils/adt/numutils.c:351 +#: utils/adt/numutils.c:613 utils/adt/numutils.c:875 utils/adt/numutils.c:926 +#: utils/adt/numutils.c:965 utils/adt/numutils.c:1012 #, c-format msgid "value \"%s\" is out of range for type %s" msgstr "la valeur « %s » est en dehors des limites pour le type %s" -#: utils/adt/cash.c:651 utils/adt/cash.c:701 utils/adt/cash.c:752 -#: utils/adt/cash.c:801 utils/adt/cash.c:853 utils/adt/cash.c:903 -#: utils/adt/float.c:105 utils/adt/int.c:842 utils/adt/int.c:958 -#: utils/adt/int.c:1038 utils/adt/int.c:1100 utils/adt/int.c:1138 -#: utils/adt/int.c:1166 utils/adt/int8.c:515 utils/adt/int8.c:573 +#: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 +#: utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 +#: utils/adt/float.c:105 utils/adt/int.c:843 utils/adt/int.c:959 +#: utils/adt/int.c:1039 utils/adt/int.c:1101 utils/adt/int.c:1139 +#: utils/adt/int.c:1167 utils/adt/int8.c:515 utils/adt/int8.c:573 #: utils/adt/int8.c:943 utils/adt/int8.c:1023 utils/adt/int8.c:1085 -#: utils/adt/int8.c:1165 utils/adt/numeric.c:3093 utils/adt/numeric.c:3116 -#: utils/adt/numeric.c:3201 utils/adt/numeric.c:3219 utils/adt/numeric.c:3315 -#: utils/adt/numeric.c:8481 utils/adt/numeric.c:8771 utils/adt/numeric.c:9096 -#: utils/adt/numeric.c:10553 utils/adt/timestamp.c:3337 +#: utils/adt/int8.c:1165 utils/adt/numeric.c:3175 utils/adt/numeric.c:3198 +#: utils/adt/numeric.c:3283 utils/adt/numeric.c:3301 utils/adt/numeric.c:3397 +#: utils/adt/numeric.c:8835 utils/adt/numeric.c:9148 utils/adt/numeric.c:9496 +#: utils/adt/numeric.c:9612 utils/adt/numeric.c:11122 +#: utils/adt/timestamp.c:3406 #, c-format msgid "division by zero" msgstr "division par zéro" -#: utils/adt/char.c:196 +#: utils/adt/char.c:197 #, c-format msgid "\"char\" out of range" msgstr "« char » hors des limites" -#: utils/adt/cryptohashfuncs.c:47 utils/adt/cryptohashfuncs.c:69 +#: utils/adt/cryptohashfuncs.c:48 utils/adt/cryptohashfuncs.c:70 #, c-format msgid "could not compute %s hash: %s" msgstr "n'a pas pu calculer le hachage %s : %s" -#: utils/adt/date.c:63 utils/adt/timestamp.c:98 utils/adt/varbit.c:105 -#: utils/adt/varchar.c:48 +#: utils/adt/date.c:63 utils/adt/timestamp.c:100 utils/adt/varbit.c:105 +#: utils/adt/varchar.c:49 #, c-format msgid "invalid type modifier" msgstr "modifieur de type invalide" @@ -24197,170 +24785,168 @@ msgstr "la précision de TIME(%d)%s ne doit pas être négative" msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "la précision de TIME(%d)%s a été réduite au maximum autorisée, %d" -#: utils/adt/date.c:160 utils/adt/date.c:168 utils/adt/formatting.c:4299 -#: utils/adt/formatting.c:4308 utils/adt/formatting.c:4414 -#: utils/adt/formatting.c:4424 +#: utils/adt/date.c:166 utils/adt/date.c:174 utils/adt/formatting.c:4241 +#: utils/adt/formatting.c:4250 utils/adt/formatting.c:4363 +#: utils/adt/formatting.c:4373 #, c-format msgid "date out of range: \"%s\"" msgstr "date en dehors des limites : « %s »" -#: utils/adt/date.c:215 utils/adt/date.c:513 utils/adt/date.c:537 -#: utils/adt/xml.c:2209 +#: utils/adt/date.c:221 utils/adt/date.c:519 utils/adt/date.c:543 +#: utils/adt/rangetypes.c:1577 utils/adt/rangetypes.c:1592 utils/adt/xml.c:2460 #, c-format msgid "date out of range" msgstr "date en dehors des limites" -#: utils/adt/date.c:261 utils/adt/timestamp.c:581 +#: utils/adt/date.c:267 utils/adt/timestamp.c:582 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "valeur du champ date en dehors des limites : %d-%02d-%02d" -#: utils/adt/date.c:268 utils/adt/date.c:277 utils/adt/timestamp.c:587 +#: utils/adt/date.c:274 utils/adt/date.c:283 utils/adt/timestamp.c:588 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "date en dehors des limites : %d-%02d-%02d" -#: utils/adt/date.c:488 +#: utils/adt/date.c:494 #, c-format msgid "cannot subtract infinite dates" msgstr "ne peut pas soustraire les valeurs dates infinies" -#: utils/adt/date.c:586 utils/adt/date.c:649 utils/adt/date.c:685 -#: utils/adt/date.c:2868 utils/adt/date.c:2878 +#: utils/adt/date.c:592 utils/adt/date.c:655 utils/adt/date.c:691 +#: utils/adt/date.c:2885 utils/adt/date.c:2895 #, c-format msgid "date out of range for timestamp" msgstr "date en dehors des limites pour un timestamp" -#: utils/adt/date.c:1115 utils/adt/date.c:1198 utils/adt/date.c:1214 -#: utils/adt/date.c:2195 utils/adt/date.c:2973 utils/adt/timestamp.c:4032 -#: utils/adt/timestamp.c:4225 utils/adt/timestamp.c:4397 -#: utils/adt/timestamp.c:4650 utils/adt/timestamp.c:4851 -#: utils/adt/timestamp.c:4898 utils/adt/timestamp.c:5122 -#: utils/adt/timestamp.c:5169 utils/adt/timestamp.c:5299 +#: utils/adt/date.c:1121 utils/adt/date.c:1204 utils/adt/date.c:1220 +#: utils/adt/date.c:2206 utils/adt/date.c:2990 utils/adt/timestamp.c:4097 +#: utils/adt/timestamp.c:4290 utils/adt/timestamp.c:4432 +#: utils/adt/timestamp.c:4685 utils/adt/timestamp.c:4886 +#: utils/adt/timestamp.c:4933 utils/adt/timestamp.c:5157 +#: utils/adt/timestamp.c:5204 utils/adt/timestamp.c:5334 #, fuzzy, c-format #| msgid "date units \"%s\" not supported" msgid "unit \"%s\" not supported for type %s" msgstr "unités de date « %s » non supportées" -#: utils/adt/date.c:1223 utils/adt/date.c:2211 utils/adt/date.c:2993 -#: utils/adt/timestamp.c:4046 utils/adt/timestamp.c:4242 -#: utils/adt/timestamp.c:4411 utils/adt/timestamp.c:4610 -#: utils/adt/timestamp.c:4907 utils/adt/timestamp.c:5178 -#: utils/adt/timestamp.c:5360 +#: utils/adt/date.c:1229 utils/adt/date.c:2222 utils/adt/date.c:3010 +#: utils/adt/timestamp.c:4111 utils/adt/timestamp.c:4307 +#: utils/adt/timestamp.c:4446 utils/adt/timestamp.c:4645 +#: utils/adt/timestamp.c:4942 utils/adt/timestamp.c:5213 +#: utils/adt/timestamp.c:5395 #, fuzzy, c-format #| msgid "date units \"%s\" not recognized" msgid "unit \"%s\" not recognized for type %s" msgstr "unités de date « %s » non reconnues" -#: utils/adt/date.c:1307 utils/adt/date.c:1353 utils/adt/date.c:1907 -#: utils/adt/date.c:1938 utils/adt/date.c:1967 utils/adt/date.c:2831 -#: utils/adt/date.c:3078 utils/adt/datetime.c:420 utils/adt/datetime.c:1869 -#: utils/adt/formatting.c:4141 utils/adt/formatting.c:4177 -#: utils/adt/formatting.c:4268 utils/adt/formatting.c:4390 utils/adt/json.c:418 -#: utils/adt/json.c:457 utils/adt/timestamp.c:225 utils/adt/timestamp.c:257 -#: utils/adt/timestamp.c:699 utils/adt/timestamp.c:708 -#: utils/adt/timestamp.c:786 utils/adt/timestamp.c:819 -#: utils/adt/timestamp.c:2916 utils/adt/timestamp.c:2937 -#: utils/adt/timestamp.c:2950 utils/adt/timestamp.c:2959 -#: utils/adt/timestamp.c:2967 utils/adt/timestamp.c:3022 -#: utils/adt/timestamp.c:3045 utils/adt/timestamp.c:3058 -#: utils/adt/timestamp.c:3069 utils/adt/timestamp.c:3077 -#: utils/adt/timestamp.c:3736 utils/adt/timestamp.c:3860 -#: utils/adt/timestamp.c:3950 utils/adt/timestamp.c:4040 -#: utils/adt/timestamp.c:4133 utils/adt/timestamp.c:4236 -#: utils/adt/timestamp.c:4715 utils/adt/timestamp.c:4989 -#: utils/adt/timestamp.c:5439 utils/adt/timestamp.c:5453 -#: utils/adt/timestamp.c:5458 utils/adt/timestamp.c:5472 -#: utils/adt/timestamp.c:5505 utils/adt/timestamp.c:5592 -#: utils/adt/timestamp.c:5633 utils/adt/timestamp.c:5637 -#: utils/adt/timestamp.c:5706 utils/adt/timestamp.c:5710 -#: utils/adt/timestamp.c:5724 utils/adt/timestamp.c:5758 utils/adt/xml.c:2231 -#: utils/adt/xml.c:2238 utils/adt/xml.c:2258 utils/adt/xml.c:2265 +#: utils/adt/date.c:1313 utils/adt/date.c:1359 utils/adt/date.c:1918 +#: utils/adt/date.c:1949 utils/adt/date.c:1978 utils/adt/date.c:2848 +#: utils/adt/date.c:3080 utils/adt/datetime.c:424 utils/adt/datetime.c:1809 +#: utils/adt/formatting.c:4081 utils/adt/formatting.c:4117 +#: utils/adt/formatting.c:4210 utils/adt/formatting.c:4339 utils/adt/json.c:467 +#: utils/adt/json.c:506 utils/adt/timestamp.c:232 utils/adt/timestamp.c:264 +#: utils/adt/timestamp.c:700 utils/adt/timestamp.c:709 +#: utils/adt/timestamp.c:787 utils/adt/timestamp.c:820 +#: utils/adt/timestamp.c:2933 utils/adt/timestamp.c:2954 +#: utils/adt/timestamp.c:2967 utils/adt/timestamp.c:2976 +#: utils/adt/timestamp.c:2984 utils/adt/timestamp.c:3045 +#: utils/adt/timestamp.c:3068 utils/adt/timestamp.c:3081 +#: utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3100 +#: utils/adt/timestamp.c:3801 utils/adt/timestamp.c:3925 +#: utils/adt/timestamp.c:4015 utils/adt/timestamp.c:4105 +#: utils/adt/timestamp.c:4198 utils/adt/timestamp.c:4301 +#: utils/adt/timestamp.c:4750 utils/adt/timestamp.c:5024 +#: utils/adt/timestamp.c:5463 utils/adt/timestamp.c:5473 +#: utils/adt/timestamp.c:5478 utils/adt/timestamp.c:5484 +#: utils/adt/timestamp.c:5517 utils/adt/timestamp.c:5604 +#: utils/adt/timestamp.c:5645 utils/adt/timestamp.c:5649 +#: utils/adt/timestamp.c:5703 utils/adt/timestamp.c:5707 +#: utils/adt/timestamp.c:5713 utils/adt/timestamp.c:5747 utils/adt/xml.c:2482 +#: utils/adt/xml.c:2489 utils/adt/xml.c:2509 utils/adt/xml.c:2516 #, c-format msgid "timestamp out of range" msgstr "timestamp en dehors des limites" -#: utils/adt/date.c:1524 utils/adt/date.c:2326 utils/adt/formatting.c:4476 +#: utils/adt/date.c:1535 utils/adt/date.c:2343 utils/adt/formatting.c:4431 #, c-format msgid "time out of range" msgstr "heure en dehors des limites" -#: utils/adt/date.c:1576 utils/adt/timestamp.c:596 +#: utils/adt/date.c:1587 utils/adt/timestamp.c:597 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "valeur du champ time en dehors des limites : %d:%02d:%02g" -#: utils/adt/date.c:2096 utils/adt/date.c:2630 utils/adt/float.c:1048 -#: utils/adt/float.c:1124 utils/adt/int.c:634 utils/adt/int.c:681 -#: utils/adt/int.c:716 utils/adt/int8.c:414 utils/adt/numeric.c:2497 -#: utils/adt/timestamp.c:3386 utils/adt/timestamp.c:3417 -#: utils/adt/timestamp.c:3448 +#: utils/adt/date.c:2107 utils/adt/date.c:2647 utils/adt/float.c:1042 +#: utils/adt/float.c:1118 utils/adt/int.c:635 utils/adt/int.c:682 +#: utils/adt/int.c:717 utils/adt/int8.c:414 utils/adt/numeric.c:2579 +#: utils/adt/timestamp.c:3455 utils/adt/timestamp.c:3482 +#: utils/adt/timestamp.c:3513 #, c-format msgid "invalid preceding or following size in window function" msgstr "taille précédente ou suivante invalide dans la fonction de fenêtrage" -#: utils/adt/date.c:2334 +#: utils/adt/date.c:2351 #, c-format msgid "time zone displacement out of range" msgstr "déplacement du fuseau horaire en dehors des limites" -#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 -#: utils/adt/datetime.c:4906 utils/adt/timestamp.c:516 -#: utils/adt/timestamp.c:543 utils/adt/timestamp.c:4319 -#: utils/adt/timestamp.c:5464 utils/adt/timestamp.c:5716 -#, c-format -msgid "time zone \"%s\" not recognized" -msgstr "le fuseau horaire « %s » n'est pas reconnu" - -#: utils/adt/date.c:3116 utils/adt/timestamp.c:5494 utils/adt/timestamp.c:5747 +#: utils/adt/date.c:3111 utils/adt/timestamp.c:5506 utils/adt/timestamp.c:5736 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "l'intervalle de fuseau horaire « %s » ne doit pas spécifier de mois ou de jours" -#: utils/adt/datetime.c:4031 utils/adt/datetime.c:4038 +#: utils/adt/datetime.c:3223 utils/adt/datetime.c:4002 +#: utils/adt/datetime.c:4008 utils/adt/timestamp.c:512 +#, c-format +msgid "time zone \"%s\" not recognized" +msgstr "le fuseau horaire « %s » n'est pas reconnu" + +#: utils/adt/datetime.c:3976 utils/adt/datetime.c:3983 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "valeur du champ date/time en dehors des limites : « %s »" -#: utils/adt/datetime.c:4040 +#: utils/adt/datetime.c:3985 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Peut-être avez-vous besoin d'un paramétrage « datestyle » différent." -#: utils/adt/datetime.c:4045 +#: utils/adt/datetime.c:3990 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "valeur du champ interval en dehors des limites : « %s »" -#: utils/adt/datetime.c:4051 +#: utils/adt/datetime.c:3996 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "déplacement du fuseau horaire en dehors des limites : « %s »" -#: utils/adt/datetime.c:4908 +#: utils/adt/datetime.c:4010 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "Ce nom du fuseau horaire apparaît dans le fichier de configuration des abréviations de fuseaux horaires « %s »." -#: utils/adt/datum.c:90 utils/adt/datum.c:102 +#: utils/adt/datum.c:91 utils/adt/datum.c:103 #, c-format msgid "invalid Datum pointer" msgstr "pointeur Datum invalide" -#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 +#: utils/adt/dbsize.c:761 utils/adt/dbsize.c:837 #, c-format msgid "invalid size: \"%s\"" msgstr "taille invalide : « %s »" -#: utils/adt/dbsize.c:814 +#: utils/adt/dbsize.c:838 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Unité invalide pour une taille : « %s »." -#: utils/adt/dbsize.c:815 +#: utils/adt/dbsize.c:839 #, fuzzy, c-format #| msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." -msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." +msgid "Valid units are \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." msgstr "Les unités valides pour ce paramètre sont « bytes », « kB », « MB », « GB » et « TB »." #: utils/adt/domains.c:92 @@ -24368,47 +24954,47 @@ msgstr "Les unités valides pour ce paramètre sont « bytes », « kB », « MB msgid "type %s is not a domain" msgstr "le type %s n'est pas un domaine" -#: utils/adt/encode.c:65 utils/adt/encode.c:113 +#: utils/adt/encode.c:66 utils/adt/encode.c:114 #, c-format msgid "unrecognized encoding: \"%s\"" msgstr "encodage non reconnu : « %s »" -#: utils/adt/encode.c:79 +#: utils/adt/encode.c:80 #, c-format msgid "result of encoding conversion is too large" msgstr "la résultat de la conversion d'encodage est trop importante" -#: utils/adt/encode.c:127 +#: utils/adt/encode.c:128 #, c-format msgid "result of decoding conversion is too large" msgstr "le résultat de la conversion du décodage est trop grand" -#: utils/adt/encode.c:186 +#: utils/adt/encode.c:217 utils/adt/encode.c:227 #, c-format msgid "invalid hexadecimal digit: \"%.*s\"" msgstr "chiffre hexadécimal invalide : « %.*s »" -#: utils/adt/encode.c:216 +#: utils/adt/encode.c:223 #, c-format msgid "invalid hexadecimal data: odd number of digits" msgstr "donnée hexadécimale invalide : nombre impair de chiffres" -#: utils/adt/encode.c:334 +#: utils/adt/encode.c:344 #, c-format msgid "unexpected \"=\" while decoding base64 sequence" msgstr "« = » inattendu lors du décodage de la séquence en base64" -#: utils/adt/encode.c:346 +#: utils/adt/encode.c:356 #, c-format msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" msgstr "symbole « %.*s » invalide trouvé lors du décodage de la séquence en base64" -#: utils/adt/encode.c:367 +#: utils/adt/encode.c:377 #, c-format msgid "invalid base64 end sequence" msgstr "séquence base64 de fin invalide" -#: utils/adt/encode.c:368 +#: utils/adt/encode.c:378 #, c-format msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "Les données en entrée manquent un alignement, sont tronquées ou ont une corruption autre." @@ -24423,24 +25009,24 @@ msgstr "utilisation non sûre de la nouvelle valeur « %s » du type enum %s" msgid "New enum values must be committed before they can be used." msgstr "Les nouvelles valeurs enum doivent être validées (COMMIT) avant de pouvoir être utilisées." -#: utils/adt/enum.c:120 utils/adt/enum.c:130 utils/adt/enum.c:188 -#: utils/adt/enum.c:198 +#: utils/adt/enum.c:121 utils/adt/enum.c:131 utils/adt/enum.c:194 +#: utils/adt/enum.c:204 #, c-format msgid "invalid input value for enum %s: \"%s\"" msgstr "valeur en entrée invalide pour le enum %s : « %s »" -#: utils/adt/enum.c:160 utils/adt/enum.c:226 utils/adt/enum.c:285 +#: utils/adt/enum.c:166 utils/adt/enum.c:232 utils/adt/enum.c:291 #, c-format msgid "invalid internal value for enum: %u" msgstr "valeur interne invalide pour le enum : %u" -#: utils/adt/enum.c:445 utils/adt/enum.c:474 utils/adt/enum.c:514 -#: utils/adt/enum.c:534 +#: utils/adt/enum.c:451 utils/adt/enum.c:480 utils/adt/enum.c:520 +#: utils/adt/enum.c:540 #, c-format msgid "could not determine actual enum type" msgstr "n'a pas pu déterminer le type enum actuel" -#: utils/adt/enum.c:453 utils/adt/enum.c:482 +#: utils/adt/enum.c:459 utils/adt/enum.c:488 #, c-format msgid "enum %s contains no values" msgstr "l'énumération « %s » ne contient aucune valeur" @@ -24455,347 +25041,347 @@ msgstr "valeur en dehors des limites : dépassement" msgid "value out of range: underflow" msgstr "valeur en dehors des limites : trop petit" -#: utils/adt/float.c:266 +#: utils/adt/float.c:286 #, c-format msgid "\"%s\" is out of range for type real" msgstr "« %s » est en dehors des limites du type real" -#: utils/adt/float.c:478 +#: utils/adt/float.c:488 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "« %s » est en dehors des limites du type double precision" -#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:354 -#: utils/adt/int.c:892 utils/adt/int.c:914 utils/adt/int.c:928 -#: utils/adt/int.c:942 utils/adt/int.c:974 utils/adt/int.c:1212 -#: utils/adt/int8.c:1278 utils/adt/numeric.c:4405 utils/adt/numeric.c:4410 +#: utils/adt/float.c:1253 utils/adt/float.c:1327 utils/adt/int.c:355 +#: utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 +#: utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 +#: utils/adt/int8.c:1278 utils/adt/numeric.c:4500 utils/adt/numeric.c:4505 #, c-format msgid "smallint out of range" msgstr "smallint en dehors des limites" -#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9510 +#: utils/adt/float.c:1453 utils/adt/numeric.c:3693 utils/adt/numeric.c:10027 #, c-format msgid "cannot take square root of a negative number" msgstr "ne peut pas calculer la racine carré d'un nombre négatif" -#: utils/adt/float.c:1527 utils/adt/numeric.c:3886 utils/adt/numeric.c:3998 +#: utils/adt/float.c:1521 utils/adt/numeric.c:3981 utils/adt/numeric.c:4093 #, c-format msgid "zero raised to a negative power is undefined" msgstr "zéro à une puissance négative est indéfini" -#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10406 +#: utils/adt/float.c:1525 utils/adt/numeric.c:3985 utils/adt/numeric.c:10918 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "un nombre négatif élevé à une puissance non entière donne un résultat complexe" -#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 -#: utils/adt/numeric.c:10181 +#: utils/adt/float.c:1701 utils/adt/float.c:1734 utils/adt/numeric.c:3893 +#: utils/adt/numeric.c:10698 #, c-format msgid "cannot take logarithm of zero" msgstr "ne peut pas calculer le logarithme de zéro" -#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 -#: utils/adt/numeric.c:3793 utils/adt/numeric.c:10185 +#: utils/adt/float.c:1705 utils/adt/float.c:1738 utils/adt/numeric.c:3831 +#: utils/adt/numeric.c:3888 utils/adt/numeric.c:10702 #, c-format msgid "cannot take logarithm of a negative number" msgstr "ne peut pas calculer le logarithme sur un nombre négatif" -#: utils/adt/float.c:1777 utils/adt/float.c:1808 utils/adt/float.c:1903 -#: utils/adt/float.c:1930 utils/adt/float.c:1958 utils/adt/float.c:1985 -#: utils/adt/float.c:2132 utils/adt/float.c:2169 utils/adt/float.c:2339 -#: utils/adt/float.c:2395 utils/adt/float.c:2460 utils/adt/float.c:2517 -#: utils/adt/float.c:2708 utils/adt/float.c:2732 +#: utils/adt/float.c:1771 utils/adt/float.c:1802 utils/adt/float.c:1897 +#: utils/adt/float.c:1924 utils/adt/float.c:1952 utils/adt/float.c:1979 +#: utils/adt/float.c:2126 utils/adt/float.c:2163 utils/adt/float.c:2333 +#: utils/adt/float.c:2389 utils/adt/float.c:2454 utils/adt/float.c:2511 +#: utils/adt/float.c:2702 utils/adt/float.c:2726 #, c-format msgid "input is out of range" msgstr "l'entrée est en dehors des limites" -#: utils/adt/float.c:2796 +#: utils/adt/float.c:2867 #, c-format msgid "setseed parameter %g is out of allowed range [-1,1]" msgstr "le paramètre setseed %g est en dehors de la fenêtre permise [-1,1]" -#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 +#: utils/adt/float.c:4095 utils/adt/numeric.c:1841 #, c-format msgid "count must be greater than zero" msgstr "le total doit être supérieur à zéro" -#: utils/adt/float.c:4029 utils/adt/numeric.c:1781 +#: utils/adt/float.c:4100 utils/adt/numeric.c:1852 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "la limite inférieure et supérieure de l'opérande ne peuvent pas être NaN" -#: utils/adt/float.c:4035 utils/adt/numeric.c:1786 +#: utils/adt/float.c:4106 utils/adt/numeric.c:1857 #, c-format msgid "lower and upper bounds must be finite" msgstr "les limites basse et haute doivent être finies" -#: utils/adt/float.c:4069 utils/adt/numeric.c:1800 +#: utils/adt/float.c:4172 utils/adt/numeric.c:1871 #, c-format msgid "lower bound cannot equal upper bound" msgstr "la limite inférieure ne peut pas être plus égale à la limite supérieure" -#: utils/adt/formatting.c:561 +#: utils/adt/formatting.c:519 #, c-format msgid "invalid format specification for an interval value" msgstr "format de spécification invalide pour une valeur intervalle" -#: utils/adt/formatting.c:562 +#: utils/adt/formatting.c:520 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Les intervalles ne sont pas liés aux dates de calendriers spécifiques." -#: utils/adt/formatting.c:1192 +#: utils/adt/formatting.c:1150 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "« EEEE » doit être le dernier motif utilisé" -#: utils/adt/formatting.c:1200 +#: utils/adt/formatting.c:1158 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "« 9 » doit être avant « PR »" -#: utils/adt/formatting.c:1216 +#: utils/adt/formatting.c:1174 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "« 0 » doit être avant « PR »" -#: utils/adt/formatting.c:1243 +#: utils/adt/formatting.c:1201 #, c-format msgid "multiple decimal points" msgstr "multiples points décimaux" -#: utils/adt/formatting.c:1247 utils/adt/formatting.c:1330 +#: utils/adt/formatting.c:1205 utils/adt/formatting.c:1288 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "ne peut pas utiliser « V » et le point décimal ensemble" -#: utils/adt/formatting.c:1259 +#: utils/adt/formatting.c:1217 #, c-format msgid "cannot use \"S\" twice" msgstr "ne peut pas utiliser « S » deux fois" -#: utils/adt/formatting.c:1263 +#: utils/adt/formatting.c:1221 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "ne peut pas utiliser « S » et « PL »/« MI »/« SG »/« PR » ensemble" -#: utils/adt/formatting.c:1283 +#: utils/adt/formatting.c:1241 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "ne peut pas utiliser « S » et « MI » ensemble" -#: utils/adt/formatting.c:1293 +#: utils/adt/formatting.c:1251 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "ne peut pas utiliser « S » et « PL » ensemble" -#: utils/adt/formatting.c:1303 +#: utils/adt/formatting.c:1261 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "ne peut pas utiliser « S » et « SG » ensemble" -#: utils/adt/formatting.c:1312 +#: utils/adt/formatting.c:1270 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "ne peut pas utiliser « PR » et « S »/« PL »/« MI »/« SG » ensemble" -#: utils/adt/formatting.c:1338 +#: utils/adt/formatting.c:1296 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "ne peut pas utiliser « EEEE » deux fois" -#: utils/adt/formatting.c:1344 +#: utils/adt/formatting.c:1302 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "« EEEE » est incompatible avec les autres formats" -#: utils/adt/formatting.c:1345 +#: utils/adt/formatting.c:1303 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "« EEEE » ne peut être utilisé qu'avec les motifs de chiffres et de points décimaux." -#: utils/adt/formatting.c:1429 +#: utils/adt/formatting.c:1387 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "séparateur de format datetime invalide : « %s »" -#: utils/adt/formatting.c:1556 +#: utils/adt/formatting.c:1514 #, c-format msgid "\"%s\" is not a number" msgstr "« %s » n'est pas un nombre" -#: utils/adt/formatting.c:1634 +#: utils/adt/formatting.c:1592 #, c-format msgid "case conversion failed: %s" msgstr "échec de la conversion de casse : %s" -#: utils/adt/formatting.c:1688 utils/adt/formatting.c:1810 -#: utils/adt/formatting.c:1933 +#: utils/adt/formatting.c:1646 utils/adt/formatting.c:1768 +#: utils/adt/formatting.c:1891 #, c-format msgid "could not determine which collation to use for %s function" msgstr "n'a pas pu déterminer le collationnement à utiliser pour la fonction %s" -#: utils/adt/formatting.c:2314 +#: utils/adt/formatting.c:2274 #, c-format msgid "invalid combination of date conventions" msgstr "combinaison invalide des conventions de date" -#: utils/adt/formatting.c:2315 +#: utils/adt/formatting.c:2275 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "" "Ne pas mixer les conventions de jour de semaine grégorien et ISO dans un\n" "modèle de formatage." -#: utils/adt/formatting.c:2338 +#: utils/adt/formatting.c:2297 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "valeur conflictuelle pour le champ « %s » dans la chaîne de formatage" -#: utils/adt/formatting.c:2341 +#: utils/adt/formatting.c:2299 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Cette valeur contredit une configuration précédente pour le même type de champ." -#: utils/adt/formatting.c:2412 +#: utils/adt/formatting.c:2366 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "chaîne source trop petite pour le champ de formatage « %s »" -#: utils/adt/formatting.c:2415 +#: utils/adt/formatting.c:2368 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Le champ requiert %d caractères, mais seuls %d restent." -#: utils/adt/formatting.c:2418 utils/adt/formatting.c:2433 +#: utils/adt/formatting.c:2370 utils/adt/formatting.c:2384 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "" "Si votre chaîne source n'a pas une taille fixe, essayez d'utiliser le\n" "modifieur « FM »." -#: utils/adt/formatting.c:2428 utils/adt/formatting.c:2442 -#: utils/adt/formatting.c:2665 +#: utils/adt/formatting.c:2380 utils/adt/formatting.c:2393 +#: utils/adt/formatting.c:2614 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "valeur « %s » invalide pour « %s »" -#: utils/adt/formatting.c:2430 +#: utils/adt/formatting.c:2382 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Le champ nécessite %d caractères, mais seulement %d ont pu être analysés." -#: utils/adt/formatting.c:2444 +#: utils/adt/formatting.c:2395 #, c-format msgid "Value must be an integer." msgstr "La valeur doit être un entier." -#: utils/adt/formatting.c:2449 +#: utils/adt/formatting.c:2400 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "la valeur pour « %s » dans la chaîne source est en dehors des limites" -#: utils/adt/formatting.c:2451 +#: utils/adt/formatting.c:2402 #, c-format msgid "Value must be in the range %d to %d." msgstr "La valeur doit être compris entre %d et %d." -#: utils/adt/formatting.c:2667 +#: utils/adt/formatting.c:2616 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "La valeur donnée ne correspond pas aux valeurs autorisées pour ce champ." -#: utils/adt/formatting.c:2886 utils/adt/formatting.c:2906 -#: utils/adt/formatting.c:2926 utils/adt/formatting.c:2946 -#: utils/adt/formatting.c:2965 utils/adt/formatting.c:2984 -#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3026 -#: utils/adt/formatting.c:3044 utils/adt/formatting.c:3062 -#: utils/adt/formatting.c:3079 utils/adt/formatting.c:3096 +#: utils/adt/formatting.c:2832 utils/adt/formatting.c:2852 +#: utils/adt/formatting.c:2872 utils/adt/formatting.c:2892 +#: utils/adt/formatting.c:2911 utils/adt/formatting.c:2930 +#: utils/adt/formatting.c:2954 utils/adt/formatting.c:2972 +#: utils/adt/formatting.c:2990 utils/adt/formatting.c:3008 +#: utils/adt/formatting.c:3025 utils/adt/formatting.c:3042 #, c-format msgid "localized string format value too long" msgstr "chaîne localisée trop longue" -#: utils/adt/formatting.c:3373 +#: utils/adt/formatting.c:3322 #, c-format msgid "unmatched format separator \"%c\"" msgstr "séparateur de format « %c » sans correspondance" -#: utils/adt/formatting.c:3434 +#: utils/adt/formatting.c:3383 #, c-format msgid "unmatched format character \"%s\"" msgstr "caractère de format « %s » sans correspondance" -#: utils/adt/formatting.c:3540 utils/adt/formatting.c:3884 +#: utils/adt/formatting.c:3491 #, c-format msgid "formatting field \"%s\" is only supported in to_char" msgstr "le formatage du champ « %s » est seulement supporté dans to_char" -#: utils/adt/formatting.c:3715 +#: utils/adt/formatting.c:3665 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "chaîne invalide en entrée pour « Y,YYY »" -#: utils/adt/formatting.c:3801 +#: utils/adt/formatting.c:3754 #, c-format msgid "input string is too short for datetime format" msgstr "la chaîne en entrée est trop courte pour le format datetime" -#: utils/adt/formatting.c:3809 +#: utils/adt/formatting.c:3762 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "les caractères en fin de chaîne restent dans la chaîne en entrée après le format datetime" -#: utils/adt/formatting.c:4370 +#: utils/adt/formatting.c:4319 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "manque du fuseau horaire dans la chaîne en entrée pour le type timestamptz" -#: utils/adt/formatting.c:4376 +#: utils/adt/formatting.c:4325 #, c-format msgid "timestamptz out of range" msgstr "timestamptz en dehors des limites" -#: utils/adt/formatting.c:4404 +#: utils/adt/formatting.c:4353 #, c-format msgid "datetime format is zoned but not timed" msgstr "le format datetime a une zone de fuseau horaire mais pas d'heure" -#: utils/adt/formatting.c:4456 +#: utils/adt/formatting.c:4411 #, c-format msgid "missing time zone in input string for type timetz" msgstr "manque du fuseau horaire dans la chaîne en entrée pour le type timetz" -#: utils/adt/formatting.c:4462 +#: utils/adt/formatting.c:4417 #, c-format msgid "timetz out of range" msgstr "timetz en dehors des limites" -#: utils/adt/formatting.c:4488 +#: utils/adt/formatting.c:4443 #, c-format msgid "datetime format is not dated and not timed" msgstr "le format datetime n'a ni date ni heure" -#: utils/adt/formatting.c:4621 +#: utils/adt/formatting.c:4575 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "l'heure « %d » est invalide pour une horloge sur 12 heures" -#: utils/adt/formatting.c:4623 +#: utils/adt/formatting.c:4577 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Utilisez une horloge sur 24 heures ou donnez une heure entre 1 et 12." -#: utils/adt/formatting.c:4734 +#: utils/adt/formatting.c:4689 #, c-format msgid "cannot calculate day of year without year information" msgstr "ne peut pas calculer le jour de l'année sans information sur l'année" -#: utils/adt/formatting.c:5653 +#: utils/adt/formatting.c:5621 #, c-format msgid "\"EEEE\" not supported for input" msgstr "« EEEE » non supporté en entrée" -#: utils/adt/formatting.c:5665 +#: utils/adt/formatting.c:5633 #, c-format msgid "\"RN\" not supported for input" msgstr "« RN » non supporté en entrée" @@ -24806,13 +25392,14 @@ msgid "absolute path not allowed" msgstr "chemin absolu non autorisé" #: utils/adt/genfile.c:89 -#, c-format -msgid "path must be in or below the current directory" +#, fuzzy, c-format +#| msgid "path must be in or below the current directory" +msgid "path must be in or below the data directory" msgstr "le chemin doit être dans ou en-dessous du répertoire courant" -#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:189 -#: utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:836 -#: utils/adt/oracle_compat.c:1139 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:190 +#: utils/adt/oracle_compat.c:288 utils/adt/oracle_compat.c:839 +#: utils/adt/oracle_compat.c:1142 #, c-format msgid "requested length too large" msgstr "longueur demandée trop importante" @@ -24832,59 +25419,64 @@ msgstr "longueur du fichier trop importante" msgid "must be superuser to read files with adminpack 1.0" msgstr "doit être super-utilisateur pour lire des fichiers avec adminpack 1.0" -#: utils/adt/geo_ops.c:979 utils/adt/geo_ops.c:1025 +#: utils/adt/genfile.c:702 +#, c-format +msgid "tablespace with OID %u does not exist" +msgstr "le tablespace d'OID %u n'existe pas" + +#: utils/adt/geo_ops.c:998 utils/adt/geo_ops.c:1052 #, c-format msgid "invalid line specification: A and B cannot both be zero" msgstr "spécification invalide de ligne : A et B ne peuvent pas être à zéro tous les deux" -#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1097 +#: utils/adt/geo_ops.c:1008 utils/adt/geo_ops.c:1124 #, c-format msgid "invalid line specification: must be two distinct points" msgstr "spécification de ligne invalide : doit être deux points distincts" -#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4330 -#: utils/adt/geo_ops.c:5210 +#: utils/adt/geo_ops.c:1438 utils/adt/geo_ops.c:3438 utils/adt/geo_ops.c:4368 +#: utils/adt/geo_ops.c:5253 #, c-format msgid "too many points requested" msgstr "trop de points demandé" -#: utils/adt/geo_ops.c:1472 +#: utils/adt/geo_ops.c:1502 #, c-format msgid "invalid number of points in external \"path\" value" msgstr "nombre de points invalide dans la valeur externe de « path »" -#: utils/adt/geo_ops.c:3449 +#: utils/adt/geo_ops.c:3487 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "nombre de points invalide dans la valeur externe de « polygon »" -#: utils/adt/geo_ops.c:4425 +#: utils/adt/geo_ops.c:4463 #, c-format msgid "open path cannot be converted to polygon" -msgstr "le chemin ouvert ne peut être converti en polygône" +msgstr "le chemin ouvert ne peut être converti en polygone" -#: utils/adt/geo_ops.c:4675 +#: utils/adt/geo_ops.c:4718 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "diamètre invalide pour la valeur externe de « circle »" -#: utils/adt/geo_ops.c:5196 +#: utils/adt/geo_ops.c:5239 #, c-format msgid "cannot convert circle with radius zero to polygon" -msgstr "ne peut pas convertir le cercle avec un diamètre zéro en un polygône" +msgstr "ne peut pas convertir le cercle avec un diamètre zéro en un polygone" -#: utils/adt/geo_ops.c:5201 +#: utils/adt/geo_ops.c:5244 #, c-format msgid "must request at least 2 points" msgstr "doit demander au moins deux points" -#: utils/adt/int.c:263 +#: utils/adt/int.c:264 #, c-format msgid "invalid int2vector data" msgstr "données int2vector invalide" -#: utils/adt/int.c:1528 utils/adt/int8.c:1404 utils/adt/numeric.c:1678 -#: utils/adt/timestamp.c:5809 utils/adt/timestamp.c:5889 +#: utils/adt/int.c:1529 utils/adt/int8.c:1404 utils/adt/numeric.c:1749 +#: utils/adt/timestamp.c:5797 utils/adt/timestamp.c:5879 #, c-format msgid "step size cannot equal zero" msgstr "la taille du pas ne peut pas valoir zéro" @@ -24898,7 +25490,8 @@ msgstr "la taille du pas ne peut pas valoir zéro" #: utils/adt/int8.c:995 utils/adt/int8.c:1009 utils/adt/int8.c:1042 #: utils/adt/int8.c:1056 utils/adt/int8.c:1070 utils/adt/int8.c:1101 #: utils/adt/int8.c:1123 utils/adt/int8.c:1137 utils/adt/int8.c:1151 -#: utils/adt/int8.c:1313 utils/adt/int8.c:1348 utils/adt/numeric.c:4364 +#: utils/adt/int8.c:1313 utils/adt/int8.c:1348 utils/adt/numeric.c:4459 +#: utils/adt/rangetypes.c:1528 utils/adt/rangetypes.c:1541 #: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" @@ -24909,132 +25502,135 @@ msgstr "bigint en dehors des limites" msgid "OID out of range" msgstr "OID en dehors des limites" -#: utils/adt/json.c:271 utils/adt/jsonb.c:757 +#: utils/adt/json.c:320 utils/adt/jsonb.c:781 #, c-format msgid "key value must be scalar, not array, composite, or json" msgstr "la valeur clé doit être scalaire, et non pas un tableau ou une valeur composite ou un json" -#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2104 +#: utils/adt/json.c:1113 utils/adt/json.c:1123 utils/fmgr/funcapi.c:2082 #, c-format msgid "could not determine data type for argument %d" msgstr "n'a pas pu déterminer le type de données pour l'argument %d" -#: utils/adt/json.c:926 utils/adt/jsonb.c:1727 +#: utils/adt/json.c:1146 utils/adt/json.c:1337 utils/adt/json.c:1513 +#: utils/adt/json.c:1591 utils/adt/jsonb.c:1432 utils/adt/jsonb.c:1522 #, c-format -msgid "field name must not be null" -msgstr "le nom du champ ne doit pas être NULL" +msgid "null value not allowed for object key" +msgstr "valeur NULL non autorisée pour une clé d'objet" + +#: utils/adt/json.c:1189 utils/adt/json.c:1352 +#, fuzzy, c-format +#| msgid "duplicate source file \"%s\"" +msgid "duplicate JSON object key value: %s" +msgstr "fichier source « %s » dupliqué" -#: utils/adt/json.c:1010 utils/adt/jsonb.c:1177 +#: utils/adt/json.c:1297 utils/adt/jsonb.c:1233 #, c-format msgid "argument list must have even number of elements" msgstr "la liste d'arguments doit avoir un nombre pair d'éléments" #. translator: %s is a SQL function name -#: utils/adt/json.c:1012 utils/adt/jsonb.c:1179 +#: utils/adt/json.c:1299 utils/adt/jsonb.c:1235 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "Les arguments de %s doivent consister en clés et valeurs alternées." -#: utils/adt/json.c:1028 -#, c-format -msgid "argument %d cannot be null" -msgstr "l'argument %d ne peut pas être NULL" - -#: utils/adt/json.c:1029 -#, c-format -msgid "Object keys should be text." -msgstr "Les clés de l'objet doivent être du texte." - -#: utils/adt/json.c:1135 utils/adt/jsonb.c:1309 +#: utils/adt/json.c:1491 utils/adt/jsonb.c:1410 #, c-format msgid "array must have two columns" msgstr "le tableau doit avoir deux colonnes" -#: utils/adt/json.c:1159 utils/adt/json.c:1242 utils/adt/jsonb.c:1333 -#: utils/adt/jsonb.c:1428 -#, c-format -msgid "null value not allowed for object key" -msgstr "valeur NULL non autorisée pour une clé d'objet" - -#: utils/adt/json.c:1231 utils/adt/jsonb.c:1417 +#: utils/adt/json.c:1580 utils/adt/jsonb.c:1511 #, c-format msgid "mismatched array dimensions" msgstr "dimensions du tableau non correspondantes" -#: utils/adt/jsonb.c:287 +#: utils/adt/json.c:1764 utils/adt/jsonb_util.c:1958 +#, c-format +msgid "duplicate JSON object key value" +msgstr "" + +#: utils/adt/jsonb.c:294 #, c-format msgid "string too long to represent as jsonb string" msgstr "chaîne trop longue pour être représentée en tant que chaîne jsonb" -#: utils/adt/jsonb.c:288 +#: utils/adt/jsonb.c:295 #, c-format msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "Dû à l'implémentation, les chaînes jsonb ne peuvent excéder %d octets." -#: utils/adt/jsonb.c:1192 +#: utils/adt/jsonb.c:1252 #, c-format msgid "argument %d: key must not be null" msgstr "argument %d : la clé ne doit pas être NULL" -#: utils/adt/jsonb.c:1780 +#: utils/adt/jsonb.c:1843 +#, c-format +msgid "field name must not be null" +msgstr "le nom du champ ne doit pas être NULL" + +#: utils/adt/jsonb.c:1905 #, c-format msgid "object keys must be strings" msgstr "les clés de l'objet doivent être du texte" -#: utils/adt/jsonb.c:1943 +#: utils/adt/jsonb.c:2116 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "ne peut pas convertir un jsonb NULL vers le type %s" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:2117 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "ne peut pas convertir la chaîne jsonb vers le type %s" -#: utils/adt/jsonb.c:1945 +#: utils/adt/jsonb.c:2118 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "ne peut pas convertir le numeric jsonb vers le type %s" -#: utils/adt/jsonb.c:1946 +#: utils/adt/jsonb.c:2119 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "ne peut pas convertir le booléen jsonb vers le type %s" -#: utils/adt/jsonb.c:1947 +#: utils/adt/jsonb.c:2120 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "ne peut pas convertir le tableau jsonb vers le type %s" -#: utils/adt/jsonb.c:1948 +#: utils/adt/jsonb.c:2121 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "ne peut pas convertir l'objet jsonb vers le type %s" -#: utils/adt/jsonb.c:1949 +#: utils/adt/jsonb.c:2122 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "ne peut pas convertir le tableau ou l'objet jsonb vers le type %s" -#: utils/adt/jsonb_util.c:752 +#: utils/adt/jsonb_util.c:758 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "le nombre de paires d'objets jsonb dépasse le maximum autorisé (%zu)" -#: utils/adt/jsonb_util.c:793 +#: utils/adt/jsonb_util.c:799 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "le nombre d'éléments du tableau jsonb dépasse le maximum autorisé (%zu)" -#: utils/adt/jsonb_util.c:1667 utils/adt/jsonb_util.c:1687 -#, c-format -msgid "total size of jsonb array elements exceeds the maximum of %u bytes" +#: utils/adt/jsonb_util.c:1673 utils/adt/jsonb_util.c:1693 +#, fuzzy, c-format +#| msgid "total size of jsonb array elements exceeds the maximum of %u bytes" +msgid "total size of jsonb array elements exceeds the maximum of %d bytes" msgstr "la taille totale des éléments du tableau jsonb dépasse le maximum de %u octets" -#: utils/adt/jsonb_util.c:1748 utils/adt/jsonb_util.c:1783 -#: utils/adt/jsonb_util.c:1803 -#, c-format -msgid "total size of jsonb object elements exceeds the maximum of %u bytes" +#: utils/adt/jsonb_util.c:1754 utils/adt/jsonb_util.c:1789 +#: utils/adt/jsonb_util.c:1809 +#, fuzzy, c-format +#| msgid "total size of jsonb object elements exceeds the maximum of %u bytes" +msgid "total size of jsonb object elements exceeds the maximum of %d bytes" msgstr "la taille totale des éléments de l'objet JSON dépasse le maximum de %u octets" #: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 @@ -25050,7 +25646,7 @@ msgstr "le type d'indice %s n'est pas supporté" #: utils/adt/jsonbsubs.c:104 #, c-format msgid "jsonb subscript must be coercible to only one type, integer or text." -msgstr "l'indice jsonb doit être onvertible en un seul type, entier ou texte." +msgstr "l'indice jsonb doit être convertible en un seul type, entier ou texte." #: utils/adt/jsonbsubs.c:118 #, c-format @@ -25067,370 +25663,370 @@ msgstr "l'indice d'un jsonb doit être de type text" msgid "jsonb subscript in assignment must not be null" msgstr "l'indice d'un jsonb lors d'une affectation ne doit pas être NULL" -#: utils/adt/jsonfuncs.c:561 utils/adt/jsonfuncs.c:797 -#: utils/adt/jsonfuncs.c:2367 utils/adt/jsonfuncs.c:2807 -#: utils/adt/jsonfuncs.c:3596 utils/adt/jsonfuncs.c:3929 +#: utils/adt/jsonfuncs.c:572 utils/adt/jsonfuncs.c:821 +#: utils/adt/jsonfuncs.c:2429 utils/adt/jsonfuncs.c:2881 +#: utils/adt/jsonfuncs.c:3676 utils/adt/jsonfuncs.c:4018 #, c-format msgid "cannot call %s on a scalar" msgstr "ne peut pas appeler %s sur un scalaire" -#: utils/adt/jsonfuncs.c:566 utils/adt/jsonfuncs.c:784 -#: utils/adt/jsonfuncs.c:2809 utils/adt/jsonfuncs.c:3585 +#: utils/adt/jsonfuncs.c:577 utils/adt/jsonfuncs.c:806 +#: utils/adt/jsonfuncs.c:2883 utils/adt/jsonfuncs.c:3663 #, c-format msgid "cannot call %s on an array" msgstr "ne peut pas appeler %s sur un tableau" -#: utils/adt/jsonfuncs.c:693 +#: utils/adt/jsonfuncs.c:713 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "données JSON, ligne %d : %s%s%s" -#: utils/adt/jsonfuncs.c:1833 utils/adt/jsonfuncs.c:1868 +#: utils/adt/jsonfuncs.c:1875 utils/adt/jsonfuncs.c:1912 #, c-format msgid "cannot get array length of a scalar" msgstr "ne peut pas obtenir la longueur d'un scalaire" -#: utils/adt/jsonfuncs.c:1837 utils/adt/jsonfuncs.c:1856 +#: utils/adt/jsonfuncs.c:1879 utils/adt/jsonfuncs.c:1898 #, c-format msgid "cannot get array length of a non-array" msgstr "ne peut pas obtenir la longueur du tableau d'un objet qui n'est pas un tableau" -#: utils/adt/jsonfuncs.c:1930 +#: utils/adt/jsonfuncs.c:1978 #, c-format msgid "cannot call %s on a non-object" msgstr "ne peut pas appeler %s sur un non objet" -#: utils/adt/jsonfuncs.c:2114 +#: utils/adt/jsonfuncs.c:2166 #, c-format msgid "cannot deconstruct an array as an object" msgstr "ne peut pas déconstruire un tableau sous la forme d'un objet" -#: utils/adt/jsonfuncs.c:2126 +#: utils/adt/jsonfuncs.c:2180 #, c-format msgid "cannot deconstruct a scalar" msgstr "ne peut pas décomposer un scalaire" -#: utils/adt/jsonfuncs.c:2169 +#: utils/adt/jsonfuncs.c:2225 #, c-format msgid "cannot extract elements from a scalar" msgstr "ne peut pas extraire des éléments d'un scalaire" -#: utils/adt/jsonfuncs.c:2173 +#: utils/adt/jsonfuncs.c:2229 #, c-format msgid "cannot extract elements from an object" msgstr "ne peut pas extraire des éléments d'un objet" -#: utils/adt/jsonfuncs.c:2354 utils/adt/jsonfuncs.c:3814 +#: utils/adt/jsonfuncs.c:2414 utils/adt/jsonfuncs.c:3896 #, c-format msgid "cannot call %s on a non-array" msgstr "ne peut pas appeler %s sur un type non tableau" -#: utils/adt/jsonfuncs.c:2424 utils/adt/jsonfuncs.c:2429 -#: utils/adt/jsonfuncs.c:2446 utils/adt/jsonfuncs.c:2452 +#: utils/adt/jsonfuncs.c:2488 utils/adt/jsonfuncs.c:2493 +#: utils/adt/jsonfuncs.c:2510 utils/adt/jsonfuncs.c:2516 #, c-format msgid "expected JSON array" msgstr "attendait un tableau JSON" -#: utils/adt/jsonfuncs.c:2425 +#: utils/adt/jsonfuncs.c:2489 #, c-format msgid "See the value of key \"%s\"." msgstr "Voir la valeur de la clé « %s »." -#: utils/adt/jsonfuncs.c:2447 +#: utils/adt/jsonfuncs.c:2511 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Voir l'élément de tableau %s de la clé « %s »." -#: utils/adt/jsonfuncs.c:2453 +#: utils/adt/jsonfuncs.c:2517 #, c-format msgid "See the array element %s." msgstr "Voir l'élément de tableau %s." -#: utils/adt/jsonfuncs.c:2488 +#: utils/adt/jsonfuncs.c:2552 #, c-format msgid "malformed JSON array" msgstr "tableau JSON mal formé" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3315 +#: utils/adt/jsonfuncs.c:3389 #, c-format msgid "first argument of %s must be a row type" msgstr "le premier argument de %s doit être un type row" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3339 +#: utils/adt/jsonfuncs.c:3413 #, c-format msgid "could not determine row type for result of %s" msgstr "n'a pas pu déterminer le type de ligne pour le résultat %s" -#: utils/adt/jsonfuncs.c:3341 +#: utils/adt/jsonfuncs.c:3415 #, c-format msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." msgstr "Fournissez comme argument un enregistrement non NULL, ou appelez la fonction dans la clause FROM en utilisant une liste de définition de colonnes." -#: utils/adt/jsonfuncs.c:3703 utils/fmgr/funcapi.c:103 +#: utils/adt/jsonfuncs.c:3785 utils/fmgr/funcapi.c:94 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "mode matérialisé requis mais interdit dans ce contexte" -#: utils/adt/jsonfuncs.c:3831 utils/adt/jsonfuncs.c:3911 +#: utils/adt/jsonfuncs.c:3913 utils/adt/jsonfuncs.c:3997 #, c-format msgid "argument of %s must be an array of objects" msgstr "l'argument de %s doit être un tableau d'objets" -#: utils/adt/jsonfuncs.c:3864 +#: utils/adt/jsonfuncs.c:3946 #, c-format msgid "cannot call %s on an object" msgstr "ne peut pas appeler %s sur un objet" -#: utils/adt/jsonfuncs.c:4271 utils/adt/jsonfuncs.c:4330 -#: utils/adt/jsonfuncs.c:4411 +#: utils/adt/jsonfuncs.c:4380 utils/adt/jsonfuncs.c:4439 +#: utils/adt/jsonfuncs.c:4519 #, c-format msgid "cannot delete from scalar" msgstr "ne peut pas supprimer à partir du scalaire" -#: utils/adt/jsonfuncs.c:4416 +#: utils/adt/jsonfuncs.c:4524 #, c-format msgid "cannot delete from object using integer index" msgstr "ne peut pas supprimer à partir de l'objet en utilisant l'index de l'entier" -#: utils/adt/jsonfuncs.c:4484 utils/adt/jsonfuncs.c:4645 +#: utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4751 #, c-format msgid "cannot set path in scalar" msgstr "ne peut pas initialiser le chemin dans le scalaire" -#: utils/adt/jsonfuncs.c:4526 utils/adt/jsonfuncs.c:4568 +#: utils/adt/jsonfuncs.c:4633 utils/adt/jsonfuncs.c:4675 #, c-format msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" msgstr "null_value_treatment doit valoir \"delete_key\", \"return_target\", \"use_json_null\" ou \"raise_exception\"" -#: utils/adt/jsonfuncs.c:4539 +#: utils/adt/jsonfuncs.c:4646 #, c-format msgid "JSON value must not be null" msgstr "la valeur JSON ne doit pas être NULL" -#: utils/adt/jsonfuncs.c:4540 +#: utils/adt/jsonfuncs.c:4647 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "Une exception a été levée parce que null_value_treatment vaut « raise_exception »." -#: utils/adt/jsonfuncs.c:4541 +#: utils/adt/jsonfuncs.c:4648 #, c-format msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." msgstr "Pour éviter cela, soit vous changez l'argument null_value_treatment soit vous vous assurez qu'un NULL SQL n'est pas fourni" -#: utils/adt/jsonfuncs.c:4596 +#: utils/adt/jsonfuncs.c:4703 #, c-format msgid "cannot delete path in scalar" msgstr "ne peut pas supprimer un chemin dans le scalaire" -#: utils/adt/jsonfuncs.c:4812 +#: utils/adt/jsonfuncs.c:4917 #, c-format msgid "path element at position %d is null" msgstr "l'élément de chemin à la position %d est nul" -#: utils/adt/jsonfuncs.c:4831 utils/adt/jsonfuncs.c:4862 -#: utils/adt/jsonfuncs.c:4935 +#: utils/adt/jsonfuncs.c:4936 utils/adt/jsonfuncs.c:4967 +#: utils/adt/jsonfuncs.c:5040 #, c-format msgid "cannot replace existing key" msgstr "ne peut pas remplacer une clé existante" -#: utils/adt/jsonfuncs.c:4832 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4937 utils/adt/jsonfuncs.c:4968 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." msgstr "Le chemin assume que la clé est un objet composite, alors qu'il s'agit d'une valeur scalaire." -#: utils/adt/jsonfuncs.c:4936 +#: utils/adt/jsonfuncs.c:5041 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Essayez d'utiliser la fonction jsonb_set pour remplacer la valeur de la clé." -#: utils/adt/jsonfuncs.c:5040 +#: utils/adt/jsonfuncs.c:5145 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "l'élément du chemin à la position %d n'est pas un entier : « %s »" -#: utils/adt/jsonfuncs.c:5057 +#: utils/adt/jsonfuncs.c:5162 #, c-format msgid "path element at position %d is out of range: %d" msgstr "l'élément du chemin à la position %d est en dehors de l'échelle : %d" -#: utils/adt/jsonfuncs.c:5209 +#: utils/adt/jsonfuncs.c:5314 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "mauvais type de drapeau, seuls les tableaux et scalaires sont autorisés" -#: utils/adt/jsonfuncs.c:5216 +#: utils/adt/jsonfuncs.c:5321 #, c-format msgid "flag array element is not a string" msgstr "le drapeau d'élément de tableau n'est pas une chaîne" -#: utils/adt/jsonfuncs.c:5217 utils/adt/jsonfuncs.c:5239 +#: utils/adt/jsonfuncs.c:5322 utils/adt/jsonfuncs.c:5344 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "Les valeurs possibles sont : « string », « numeric », « boolean », « key » et « all »." -#: utils/adt/jsonfuncs.c:5237 +#: utils/adt/jsonfuncs.c:5342 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "mauvais drapeau dans le drapeau de tableau : « %s »" -#: utils/adt/jsonpath.c:362 +#: utils/adt/jsonpath.c:382 #, c-format msgid "@ is not allowed in root expressions" msgstr "@ n'est pas autorisé dans les expressions racine" -#: utils/adt/jsonpath.c:368 +#: utils/adt/jsonpath.c:388 #, c-format msgid "LAST is allowed only in array subscripts" msgstr "LAST n'est autorisé que dans les indices de tableau" -#: utils/adt/jsonpath_exec.c:360 +#: utils/adt/jsonpath_exec.c:361 #, c-format msgid "single boolean result is expected" msgstr "un résultat booléen unique est attendu" -#: utils/adt/jsonpath_exec.c:556 +#: utils/adt/jsonpath_exec.c:557 #, c-format msgid "\"vars\" argument is not an object" msgstr "l'argument « vars » n'est pas un objet" -#: utils/adt/jsonpath_exec.c:557 +#: utils/adt/jsonpath_exec.c:558 #, c-format msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." msgstr "Les paramètres jsonpath doivent être encodés en paires clé-valeur d'objets « vars »" -#: utils/adt/jsonpath_exec.c:674 +#: utils/adt/jsonpath_exec.c:675 #, c-format msgid "JSON object does not contain key \"%s\"" msgstr "l'objet JSON ne contient pas la clé « %s »" -#: utils/adt/jsonpath_exec.c:686 +#: utils/adt/jsonpath_exec.c:687 #, c-format msgid "jsonpath member accessor can only be applied to an object" msgstr "l'accesseur du membre jsonpath ne peut être appliqué qu'à un objet" -#: utils/adt/jsonpath_exec.c:715 +#: utils/adt/jsonpath_exec.c:716 #, c-format msgid "jsonpath wildcard array accessor can only be applied to an array" msgstr "l'accesseur de tableau générique jsonpath ne peut être appliqué qu'à un tableau" -#: utils/adt/jsonpath_exec.c:763 +#: utils/adt/jsonpath_exec.c:764 #, c-format msgid "jsonpath array subscript is out of bounds" msgstr "indice du tableau jsonpath hors limites" -#: utils/adt/jsonpath_exec.c:820 +#: utils/adt/jsonpath_exec.c:821 #, c-format msgid "jsonpath array accessor can only be applied to an array" msgstr "l'accesseur de tableau jsonpath ne peut être appliqué qu'à un tableau" -#: utils/adt/jsonpath_exec.c:872 +#: utils/adt/jsonpath_exec.c:873 #, c-format msgid "jsonpath wildcard member accessor can only be applied to an object" msgstr "l'accesseur du membre générique jsonpath ne peut être appliqué qu'à un objet" -#: utils/adt/jsonpath_exec.c:1006 +#: utils/adt/jsonpath_exec.c:1007 #, c-format msgid "jsonpath item method .%s() can only be applied to an array" msgstr "la méthode de l'objet jsonpath .%s() ne peut être appliquée qu'à un tableau" -#: utils/adt/jsonpath_exec.c:1059 +#: utils/adt/jsonpath_exec.c:1060 #, c-format msgid "numeric argument of jsonpath item method .%s() is out of range for type double precision" msgstr "l'argument numérique de la méthode jsonpath .%s() est en dehors des limites du type double precision" -#: utils/adt/jsonpath_exec.c:1080 +#: utils/adt/jsonpath_exec.c:1081 #, c-format msgid "string argument of jsonpath item method .%s() is not a valid representation of a double precision number" msgstr "l'argument chaîne de la méthode jsonpath .%s() n'est pas une représentation valide d'un nombre à double précision" -#: utils/adt/jsonpath_exec.c:1093 +#: utils/adt/jsonpath_exec.c:1094 #, c-format msgid "jsonpath item method .%s() can only be applied to a string or numeric value" msgstr "la méthode de l'objet jsonpath .%s() ne peut être appliquée qu'à une chaîne ou une valeur numérique" -#: utils/adt/jsonpath_exec.c:1583 +#: utils/adt/jsonpath_exec.c:1584 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "l'opérande gauche de l'opérateur jsonpath %s n'est pas une valeur numérique unique" -#: utils/adt/jsonpath_exec.c:1590 +#: utils/adt/jsonpath_exec.c:1591 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "l'opérande droite de l'opérateur jsonpath %s n'est pas une valeur numérique unique" -#: utils/adt/jsonpath_exec.c:1658 +#: utils/adt/jsonpath_exec.c:1659 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "l'opérande de l'opérateur jsonpath unaire %s n'est pas une valeur numérique" -#: utils/adt/jsonpath_exec.c:1756 +#: utils/adt/jsonpath_exec.c:1758 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "la méthode de l'objet jsonpath .%s() ne peut être appliquée qu'à une valeur numérique" -#: utils/adt/jsonpath_exec.c:1796 +#: utils/adt/jsonpath_exec.c:1798 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "la méthode de l'objet jsonpath .%s() ne peut être appliquée qu'à une chaîne" -#: utils/adt/jsonpath_exec.c:1890 +#: utils/adt/jsonpath_exec.c:1901 #, c-format msgid "datetime format is not recognized: \"%s\"" msgstr "le format datetime n'est pas reconnu : « %s »" -#: utils/adt/jsonpath_exec.c:1892 +#: utils/adt/jsonpath_exec.c:1903 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "Utilisez un argument modèle de datetime pour indiquer le format de données en entrée." -#: utils/adt/jsonpath_exec.c:1960 +#: utils/adt/jsonpath_exec.c:1971 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "la méthode .%s() de l'entité jsonpath ne peut être appliquée qu'à un objet" -#: utils/adt/jsonpath_exec.c:2142 +#: utils/adt/jsonpath_exec.c:2153 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "n'a pas pu trouver la variable jsonpath « %s »" -#: utils/adt/jsonpath_exec.c:2406 +#: utils/adt/jsonpath_exec.c:2417 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "l'indice du tableau jsonpath n'est pas une valeur numérique unique" -#: utils/adt/jsonpath_exec.c:2418 +#: utils/adt/jsonpath_exec.c:2429 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "indice du tableau jsonpath hors des limites d'un entier" -#: utils/adt/jsonpath_exec.c:2595 +#: utils/adt/jsonpath_exec.c:2606 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "ne peut pas convertir la valeur de %s à %s sans utilisation des fuseaux horaires" -#: utils/adt/jsonpath_exec.c:2597 +#: utils/adt/jsonpath_exec.c:2608 #, c-format msgid "Use *_tz() function for time zone support." msgstr "Utilisez la fonction *_tz() pour le support des fuseaux horaires." -#: utils/adt/levenshtein.c:133 +#: utils/adt/levenshtein.c:132 #, c-format msgid "levenshtein argument exceeds maximum length of %d characters" msgstr "l'argument levenshtein dépasse la longueur maximale de %d caractères" -#: utils/adt/like.c:160 +#: utils/adt/like.c:161 #, c-format msgid "nondeterministic collations are not supported for LIKE" msgstr "les collationnements non déterministes ne sont pas supportés pour LIKE" -#: utils/adt/like.c:189 utils/adt/like_support.c:1024 +#: utils/adt/like.c:190 utils/adt/like_support.c:1024 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "n'a pas pu déterminer le collationnement à utiliser pour ILIKE" -#: utils/adt/like.c:201 +#: utils/adt/like.c:202 #, c-format msgid "nondeterministic collations are not supported for ILIKE" msgstr "les collationnements non déterministes ne sont pas supportés pour ILIKE" @@ -25440,12 +26036,12 @@ msgstr "les collationnements non déterministes ne sont pas supportés pour ILIK msgid "LIKE pattern must not end with escape character" msgstr "le motif LIKE ne doit pas se terminer avec un caractère d'échappement" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:786 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:801 #, c-format msgid "invalid escape string" msgstr "chaîne d'échappement invalide" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:787 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:802 #, c-format msgid "Escape string must be empty or one character." msgstr "La chaîne d'échappement doit être vide ou ne contenir qu'un caractère." @@ -25460,17 +26056,17 @@ msgstr "la recherche insensible à la casse n'est pas supportée avec le type by msgid "regular-expression matching not supported on type bytea" msgstr "la recherche par expression rationnelle n'est pas supportée sur le type bytea" -#: utils/adt/mac.c:101 +#: utils/adt/mac.c:102 #, c-format msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "valeur d'un octet invalide dans la valeur de « macaddr » : « %s »" -#: utils/adt/mac8.c:563 +#: utils/adt/mac8.c:554 #, c-format msgid "macaddr8 data out of range to convert to macaddr" msgstr "donnée macaddr8 hors de l'échelle pour être convertie en macaddr" -#: utils/adt/mac8.c:564 +#: utils/adt/mac8.c:555 #, c-format msgid "Only addresses that have FF and FE as values in the 4th and 5th bytes from the left, for example xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted from macaddr8 to macaddr." msgstr "Seules les adresses qui ont FF ou FE comme valeurs dans les 4è et 5è octets à partir de la gauche, par exemple xx:xx:xx:ff:fe:xx:xx:xx, , sont éligibles à être converties de macaddr8 à macaddr." @@ -25480,105 +26076,105 @@ msgstr "Seules les adresses qui ont FF ou FE comme valeurs dans les 4è et 5è o msgid "PID %d is not a PostgreSQL server process" msgstr "le PID %d n'est pas un processus du serveur PostgreSQL" -#: utils/adt/misc.c:216 +#: utils/adt/misc.c:237 #, c-format msgid "global tablespace never has databases" msgstr "le tablespace global n'a jamais de bases de données" -#: utils/adt/misc.c:238 +#: utils/adt/misc.c:259 #, c-format msgid "%u is not a tablespace OID" msgstr "%u n'est pas un OID de tablespace" -#: utils/adt/misc.c:457 +#: utils/adt/misc.c:454 msgid "unreserved" msgstr "non réservé" -#: utils/adt/misc.c:461 +#: utils/adt/misc.c:458 msgid "unreserved (cannot be function or type name)" msgstr "non réservé (ne peut pas être un nom de fonction ou de type)" -#: utils/adt/misc.c:465 +#: utils/adt/misc.c:462 msgid "reserved (can be function or type name)" msgstr "réservé (peut être un nom de fonction ou de type)" -#: utils/adt/misc.c:469 +#: utils/adt/misc.c:466 msgid "reserved" msgstr "réservé" -#: utils/adt/misc.c:480 +#: utils/adt/misc.c:477 msgid "can be bare label" msgstr "peut être un label brut" -#: utils/adt/misc.c:485 +#: utils/adt/misc.c:482 msgid "requires AS" msgstr "requiert AS" -#: utils/adt/misc.c:732 utils/adt/misc.c:746 utils/adt/misc.c:785 -#: utils/adt/misc.c:791 utils/adt/misc.c:797 utils/adt/misc.c:820 +#: utils/adt/misc.c:853 utils/adt/misc.c:867 utils/adt/misc.c:906 +#: utils/adt/misc.c:912 utils/adt/misc.c:918 utils/adt/misc.c:941 #, c-format msgid "string is not a valid identifier: \"%s\"" msgstr "la chaîne n'est pas un identifiant valide : « %s »" -#: utils/adt/misc.c:734 +#: utils/adt/misc.c:855 #, c-format msgid "String has unclosed double quotes." -msgstr "La chaîne des guillements doubles non fermés." +msgstr "La chaîne des guillemets doubles non fermés." -#: utils/adt/misc.c:748 +#: utils/adt/misc.c:869 #, c-format msgid "Quoted identifier must not be empty." msgstr "L'identifiant entre guillemets ne doit pas être vide." -#: utils/adt/misc.c:787 +#: utils/adt/misc.c:908 #, c-format msgid "No valid identifier before \".\"." msgstr "Pas d'identifiant valide avant « . »." -#: utils/adt/misc.c:793 +#: utils/adt/misc.c:914 #, c-format msgid "No valid identifier after \".\"." msgstr "Pas d'identifiant valide après « . »." -#: utils/adt/misc.c:853 +#: utils/adt/misc.c:974 #, c-format msgid "log format \"%s\" is not supported" msgstr "le format de trace « %s » n'est pas supporté" -#: utils/adt/misc.c:854 +#: utils/adt/misc.c:975 #, fuzzy, c-format #| msgid "The supported log formats are \"stderr\" and \"csvlog\"." msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." msgstr "Les formats de traces supportés sont « stderr » et « csvlog »." -#: utils/adt/multirangetypes.c:149 utils/adt/multirangetypes.c:162 -#: utils/adt/multirangetypes.c:191 utils/adt/multirangetypes.c:261 -#: utils/adt/multirangetypes.c:285 +#: utils/adt/multirangetypes.c:151 utils/adt/multirangetypes.c:164 +#: utils/adt/multirangetypes.c:193 utils/adt/multirangetypes.c:267 +#: utils/adt/multirangetypes.c:291 #, c-format msgid "malformed multirange literal: \"%s\"" -msgstr "litéral multirange mal formé : « %s »" +msgstr "littéral multirange mal formé : « %s »" -#: utils/adt/multirangetypes.c:151 +#: utils/adt/multirangetypes.c:153 #, c-format msgid "Missing left brace." msgstr "Parenthèse gauche manquante." -#: utils/adt/multirangetypes.c:193 +#: utils/adt/multirangetypes.c:195 #, c-format msgid "Expected range start." msgstr "Début d'intervalle attendu." -#: utils/adt/multirangetypes.c:263 +#: utils/adt/multirangetypes.c:269 #, c-format msgid "Expected comma or end of multirange." msgstr "Virgule ou fin de multirange attendue." -#: utils/adt/multirangetypes.c:976 +#: utils/adt/multirangetypes.c:982 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "des multiranges ne peuvent pas être construits à partir de tableaux multidimensionnels" -#: utils/adt/multirangetypes.c:1002 +#: utils/adt/multirangetypes.c:1008 #, c-format msgid "multirange values cannot contain null members" msgstr "les valeurs multirange ne peuvent pas contenir des membres NULL" @@ -25637,265 +26233,315 @@ msgstr "n'a pas pu formater la valeur cidr : %m" msgid "cannot merge addresses from different families" msgstr "ne peut pas assembler les adresses de familles différentes" -#: utils/adt/network.c:1901 +#: utils/adt/network.c:1893 #, c-format msgid "cannot AND inet values of different sizes" msgstr "" "ne peut pas utiliser l'opérateur AND sur des champs de type inet de tailles\n" "différentes" -#: utils/adt/network.c:1933 +#: utils/adt/network.c:1925 #, c-format msgid "cannot OR inet values of different sizes" msgstr "" "ne peut pas utiliser l'opérateur OR sur des champs de type inet de tailles\n" "différentes" -#: utils/adt/network.c:1994 utils/adt/network.c:2070 +#: utils/adt/network.c:1986 utils/adt/network.c:2062 #, c-format msgid "result is out of range" msgstr "le résultat est en dehors des limites" -#: utils/adt/network.c:2035 +#: utils/adt/network.c:2027 #, c-format msgid "cannot subtract inet values of different sizes" msgstr "ne peut pas soustraire des valeurs inet de tailles différentes" -#: utils/adt/numeric.c:1027 +#: utils/adt/numeric.c:785 utils/adt/numeric.c:3643 utils/adt/numeric.c:7131 +#: utils/adt/numeric.c:7334 utils/adt/numeric.c:7806 utils/adt/numeric.c:10501 +#: utils/adt/numeric.c:10975 utils/adt/numeric.c:11069 +#: utils/adt/numeric.c:11203 +#, c-format +msgid "value overflows numeric format" +msgstr "la valeur dépasse le format numeric" + +#: utils/adt/numeric.c:1098 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "signe invalide dans la valeur externe « numeric »" -#: utils/adt/numeric.c:1033 +#: utils/adt/numeric.c:1104 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "échelle invalide dans la valeur externe « numeric »" -#: utils/adt/numeric.c:1042 +#: utils/adt/numeric.c:1113 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "chiffre invalide dans la valeur externe « numeric »" -#: utils/adt/numeric.c:1257 utils/adt/numeric.c:1271 +#: utils/adt/numeric.c:1328 utils/adt/numeric.c:1342 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "la précision NUMERIC %d doit être comprise entre 1 et %d" -#: utils/adt/numeric.c:1262 +#: utils/adt/numeric.c:1333 #, fuzzy, c-format #| msgid "NUMERIC scale %d must be between 0 and precision %d" msgid "NUMERIC scale %d must be between %d and %d" msgstr "l'échelle NUMERIC %d doit être comprise entre 0 et le précision %d" -#: utils/adt/numeric.c:1280 +#: utils/adt/numeric.c:1351 #, c-format msgid "invalid NUMERIC type modifier" msgstr "modificateur de type NUMERIC invalide" -#: utils/adt/numeric.c:1638 +#: utils/adt/numeric.c:1709 #, c-format msgid "start value cannot be NaN" msgstr "la valeur de démarrage ne peut pas être NaN" -#: utils/adt/numeric.c:1642 +#: utils/adt/numeric.c:1713 #, c-format msgid "start value cannot be infinity" msgstr "la valeur de démarrage ne peut pas être infinity" -#: utils/adt/numeric.c:1649 +#: utils/adt/numeric.c:1720 #, c-format msgid "stop value cannot be NaN" msgstr "la valeur d'arrêt ne peut pas être NaN" -#: utils/adt/numeric.c:1653 +#: utils/adt/numeric.c:1724 #, c-format msgid "stop value cannot be infinity" msgstr "la valeur d'arrêt ne peut pas être infinity" -#: utils/adt/numeric.c:1666 +#: utils/adt/numeric.c:1737 #, c-format msgid "step size cannot be NaN" msgstr "la taille du pas ne peut pas être NaN" -#: utils/adt/numeric.c:1670 +#: utils/adt/numeric.c:1741 #, c-format msgid "step size cannot be infinity" msgstr "la taille du pas ne peut pas être infinity" -#: utils/adt/numeric.c:3551 +#: utils/adt/numeric.c:3633 #, c-format msgid "factorial of a negative number is undefined" msgstr "la factorielle d'un nombre négatif est indéfini" -#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6945 utils/adt/numeric.c:7460 -#: utils/adt/numeric.c:9984 utils/adt/numeric.c:10463 utils/adt/numeric.c:10589 -#: utils/adt/numeric.c:10662 -#, c-format -msgid "value overflows numeric format" -msgstr "la valeur dépasse le format numeric" - -#: utils/adt/numeric.c:4271 utils/adt/numeric.c:4351 utils/adt/numeric.c:4392 -#: utils/adt/numeric.c:4586 +#: utils/adt/numeric.c:4366 utils/adt/numeric.c:4446 utils/adt/numeric.c:4487 +#: utils/adt/numeric.c:4683 #, c-format msgid "cannot convert NaN to %s" msgstr "ne peut pas convertir NaN en %s" -#: utils/adt/numeric.c:4275 utils/adt/numeric.c:4355 utils/adt/numeric.c:4396 -#: utils/adt/numeric.c:4590 +#: utils/adt/numeric.c:4370 utils/adt/numeric.c:4450 utils/adt/numeric.c:4491 +#: utils/adt/numeric.c:4687 #, c-format msgid "cannot convert infinity to %s" msgstr "ne peut pas convertir infinity en %s" -#: utils/adt/numeric.c:4599 +#: utils/adt/numeric.c:4696 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn hors des limites" -#: utils/adt/numeric.c:7547 utils/adt/numeric.c:7593 +#: utils/adt/numeric.c:7896 utils/adt/numeric.c:7947 #, c-format msgid "numeric field overflow" msgstr "champ numérique en dehors des limites" -#: utils/adt/numeric.c:7548 +#: utils/adt/numeric.c:7897 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "Un champ de précision %d et d'échelle %d doit être arrondi à une valeur absolue inférieure à %s%d." -#: utils/adt/numeric.c:7594 +#: utils/adt/numeric.c:7948 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "Un champ de précision %d et d'échelle %d ne peut pas contenir une valeur infinie." -#: utils/adt/oid.c:293 +#: utils/adt/oid.c:216 #, c-format msgid "invalid oidvector data" msgstr "donnée oidvector invalide" -#: utils/adt/oracle_compat.c:973 +#: utils/adt/oracle_compat.c:976 #, c-format msgid "requested character too large" msgstr "caractère demandé trop long" -#: utils/adt/oracle_compat.c:1017 +#: utils/adt/oracle_compat.c:1020 #, fuzzy, c-format #| msgid "COST must be positive" msgid "character number must be positive" msgstr "COST doit être positif" -#: utils/adt/oracle_compat.c:1021 +#: utils/adt/oracle_compat.c:1024 #, c-format msgid "null character not permitted" msgstr "caractère nul interdit" -#: utils/adt/oracle_compat.c:1039 utils/adt/oracle_compat.c:1092 +#: utils/adt/oracle_compat.c:1042 utils/adt/oracle_compat.c:1095 #, fuzzy, c-format #| msgid "requested character too large for encoding: %d" msgid "requested character too large for encoding: %u" msgstr "caractère demandé trop long pour l'encodage : %d" -#: utils/adt/oracle_compat.c:1080 +#: utils/adt/oracle_compat.c:1083 #, fuzzy, c-format #| msgid "requested character not valid for encoding: %d" msgid "requested character not valid for encoding: %u" msgstr "caractère demandé invalide pour l'encodage : %d" -#: utils/adt/orderedsetaggs.c:448 utils/adt/orderedsetaggs.c:552 -#: utils/adt/orderedsetaggs.c:690 +#: utils/adt/orderedsetaggs.c:448 utils/adt/orderedsetaggs.c:553 +#: utils/adt/orderedsetaggs.c:693 #, c-format msgid "percentile value %g is not between 0 and 1" msgstr "la valeur centile %g n'est pas entre 0 et 1" -#: utils/adt/pg_locale.c:1228 -#, c-format -msgid "Apply system library package updates." -msgstr "Applique les mises à jour du paquet de bibliothèque système." - -#: utils/adt/pg_locale.c:1452 utils/adt/pg_locale.c:1700 -#: utils/adt/pg_locale.c:1979 utils/adt/pg_locale.c:2001 -#, c-format -msgid "could not open collator for locale \"%s\": %s" -msgstr "n'a pas pu ouvrir le collationneur pour la locale « %s » : %s" +#: utils/adt/pg_locale.c:1410 +#, fuzzy, c-format +#| msgid "could not open collator for locale \"%s\": %s" +msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" +msgstr "n'a pas pu ouvrir le collationnement pour la locale « %s » : %s" -#: utils/adt/pg_locale.c:1465 utils/adt/pg_locale.c:2010 +#: utils/adt/pg_locale.c:1421 utils/adt/pg_locale.c:2831 +#: utils/adt/pg_locale.c:2904 #, c-format msgid "ICU is not supported in this build" msgstr "ICU n'est pas supporté dans cette installation" -#: utils/adt/pg_locale.c:1494 +#: utils/adt/pg_locale.c:1450 #, c-format msgid "could not create locale \"%s\": %m" msgstr "n'a pas pu créer la locale « %s » : %m" -#: utils/adt/pg_locale.c:1497 +#: utils/adt/pg_locale.c:1453 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "Le système d'exploitation n'a pas pu trouver des données de locale pour la locale « %s »." -#: utils/adt/pg_locale.c:1605 +#: utils/adt/pg_locale.c:1568 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "" "les collationnements avec des valeurs différents pour le tri et le jeu de\n" "caractères ne sont pas supportés sur cette plateforme" -#: utils/adt/pg_locale.c:1614 +#: utils/adt/pg_locale.c:1577 #, c-format msgid "collation provider LIBC is not supported on this platform" msgstr "le fournisseur du collationnement, LIBC, n'est pas supporté sur cette plateforme" -#: utils/adt/pg_locale.c:1649 +#: utils/adt/pg_locale.c:1618 #, fuzzy, c-format #| msgid "collation \"%s\" has no actual version, but a version was specified" msgid "collation \"%s\" has no actual version, but a version was recorded" msgstr "le collationnement « %s » n'a pas de version réelle mais une version était indiquée" -#: utils/adt/pg_locale.c:1655 +#: utils/adt/pg_locale.c:1624 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "le collationnement « %s » a des versions différentes" -#: utils/adt/pg_locale.c:1657 +#: utils/adt/pg_locale.c:1626 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "Le collationnement dans la base de données a été créé en utilisant la version %s mais le système d'exploitation fournit la version %s." -#: utils/adt/pg_locale.c:1660 +#: utils/adt/pg_locale.c:1629 #, c-format msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgstr "Reconstruisez tous les objets affectés par ce collationnement, et lancez ALTER COLLATION %s REFRESH VERSION, ou construisez PostgreSQL avec la bonne version de bibliothèque." -#: utils/adt/pg_locale.c:1731 +#: utils/adt/pg_locale.c:1695 #, c-format msgid "could not load locale \"%s\"" msgstr "n'a pas pu charger la locale « %s »" -#: utils/adt/pg_locale.c:1756 +#: utils/adt/pg_locale.c:1720 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "n'a pas obtenir la version du collationnement pour la locale « %s » : code d'erreur %lu" -#: utils/adt/pg_locale.c:1794 +#: utils/adt/pg_locale.c:1776 utils/adt/pg_locale.c:1789 +#, c-format +msgid "could not convert string to UTF-16: error code %lu" +msgstr "n'a pas pu convertir la chaîne en UTF-16 : erreur %lu" + +#: utils/adt/pg_locale.c:1803 +#, c-format +msgid "could not compare Unicode strings: %m" +msgstr "n'a pas pu comparer les chaînes unicode : %m" + +#: utils/adt/pg_locale.c:1984 +#, c-format +msgid "collation failed: %s" +msgstr "échec du collationnement : %s" + +#: utils/adt/pg_locale.c:2205 utils/adt/pg_locale.c:2237 +#, c-format +msgid "sort key generation failed: %s" +msgstr "échec de génération de la clé de tri : %s" + +#: utils/adt/pg_locale.c:2474 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "n'a pas pu obtenir la langue à partir de la locale « %s » : %s" + +#: utils/adt/pg_locale.c:2495 utils/adt/pg_locale.c:2511 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "n'a pas pu ouvrir le collationneur pour la locale « %s » : %s" + +#: utils/adt/pg_locale.c:2536 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "encodage « %s » non supporté par ICU" -#: utils/adt/pg_locale.c:1801 +#: utils/adt/pg_locale.c:2543 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "n'a pas pu ouvrir le convertisseur ICU pour l'encodage « %s » : %s" -#: utils/adt/pg_locale.c:1832 utils/adt/pg_locale.c:1841 -#: utils/adt/pg_locale.c:1870 utils/adt/pg_locale.c:1880 +#: utils/adt/pg_locale.c:2561 utils/adt/pg_locale.c:2580 +#: utils/adt/pg_locale.c:2636 utils/adt/pg_locale.c:2647 #, c-format msgid "%s failed: %s" msgstr "échec de %s : %s" -#: utils/adt/pg_locale.c:2179 +#: utils/adt/pg_locale.c:2822 +#, c-format +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "n'a pas pu convertir le nom de locale « %s » en balise de langage : %s" + +#: utils/adt/pg_locale.c:2863 +#, fuzzy, c-format +#| msgid "could not get language from locale \"%s\": %s" +msgid "could not get language from ICU locale \"%s\": %s" +msgstr "n'a pas pu obtenir la langue à partir de la locale « %s » : %s" + +#: utils/adt/pg_locale.c:2865 utils/adt/pg_locale.c:2894 +#, fuzzy, c-format +#| msgid "while setting parameter \"%s\" to \"%s\"" +msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." +msgstr "lors de la configuration du paramètre « %s » en « %s »" + +#: utils/adt/pg_locale.c:2892 +#, fuzzy, c-format +#| msgid "locale \"%s\" has unknown language \"%s\"" +msgid "ICU locale \"%s\" has unknown language \"%s\"" +msgstr "la locale « %s » a le langage inconnu « %s »" + +#: utils/adt/pg_locale.c:3073 #, c-format msgid "invalid multibyte character for locale" msgstr "caractère multi-octets invalide pour la locale" -#: utils/adt/pg_locale.c:2180 +#: utils/adt/pg_locale.c:3074 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "" @@ -25917,23 +26563,23 @@ msgstr "ne peut pas soustraire NaN de pg_lsn" msgid "function can only be called when server is in binary upgrade mode" msgstr "la fonction peut seulement être appelée quand le serveur est en mode de mise à jour binaire" -#: utils/adt/pgstatfuncs.c:482 +#: utils/adt/pgstatfuncs.c:254 #, c-format msgid "invalid command name: \"%s\"" msgstr "nom de commande invalide : « %s »" -#: utils/adt/pgstatfuncs.c:2114 +#: utils/adt/pgstatfuncs.c:1774 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "cible reset non reconnu : « %s »" -#: utils/adt/pgstatfuncs.c:2115 +#: utils/adt/pgstatfuncs.c:1775 #, fuzzy, c-format #| msgid "Target must be \"archiver\", \"bgwriter\", or \"wal\"." -msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +msgid "Target must be \"archiver\", \"bgwriter\", \"io\", \"recovery_prefetch\", or \"wal\"." msgstr "La cible doit être « archiver », « bgwriter » ou « wal »." -#: utils/adt/pgstatfuncs.c:2193 +#: utils/adt/pgstatfuncs.c:1857 #, fuzzy, c-format #| msgid "invalid role OID: %u" msgid "invalid subscription OID %u" @@ -25944,431 +26590,440 @@ msgstr "OID du rôle invalide : %u" msgid "cannot display a value of type %s" msgstr "ne peut pas afficher une valeur de type %s" -#: utils/adt/pseudotypes.c:321 +#: utils/adt/pseudotypes.c:310 #, c-format msgid "cannot accept a value of a shell type" msgstr "ne peut pas accepter une valeur de type shell" -#: utils/adt/pseudotypes.c:331 +#: utils/adt/pseudotypes.c:320 #, c-format msgid "cannot display a value of a shell type" msgstr "ne peut pas afficher une valeur de type shell" -#: utils/adt/rangetypes.c:404 +#: utils/adt/rangetypes.c:415 #, c-format msgid "range constructor flags argument must not be null" msgstr "l'argument flags du contructeur d'intervalle ne doit pas être NULL" -#: utils/adt/rangetypes.c:1003 +#: utils/adt/rangetypes.c:1014 #, c-format msgid "result of range difference would not be contiguous" msgstr "le résultat de la différence d'intervalle de valeur ne sera pas contigu" -#: utils/adt/rangetypes.c:1064 +#: utils/adt/rangetypes.c:1075 #, c-format msgid "result of range union would not be contiguous" -msgstr "le résultat de l'union d'intervalle pourrait ne pas être contigü" +msgstr "le résultat de l'union d'intervalle pourrait ne pas être contigu" -#: utils/adt/rangetypes.c:1689 +#: utils/adt/rangetypes.c:1750 #, c-format msgid "range lower bound must be less than or equal to range upper bound" msgstr "" "la limite inférieure de l'intervalle de valeurs doit être inférieure ou égale\n" "à la limite supérieure de l'intervalle de valeurs" -#: utils/adt/rangetypes.c:2112 utils/adt/rangetypes.c:2125 -#: utils/adt/rangetypes.c:2139 +#: utils/adt/rangetypes.c:2197 utils/adt/rangetypes.c:2210 +#: utils/adt/rangetypes.c:2224 #, c-format msgid "invalid range bound flags" msgstr "drapeaux de limite de l'intervalle invalides" -#: utils/adt/rangetypes.c:2113 utils/adt/rangetypes.c:2126 -#: utils/adt/rangetypes.c:2140 +#: utils/adt/rangetypes.c:2198 utils/adt/rangetypes.c:2211 +#: utils/adt/rangetypes.c:2225 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "Les valeurs valides sont entre « [] », « [) », « (] » et « () »." -#: utils/adt/rangetypes.c:2205 utils/adt/rangetypes.c:2222 -#: utils/adt/rangetypes.c:2235 utils/adt/rangetypes.c:2253 -#: utils/adt/rangetypes.c:2264 utils/adt/rangetypes.c:2308 -#: utils/adt/rangetypes.c:2316 +#: utils/adt/rangetypes.c:2293 utils/adt/rangetypes.c:2310 +#: utils/adt/rangetypes.c:2325 utils/adt/rangetypes.c:2345 +#: utils/adt/rangetypes.c:2356 utils/adt/rangetypes.c:2403 +#: utils/adt/rangetypes.c:2411 #, c-format msgid "malformed range literal: \"%s\"" -msgstr "intervalle litéral mal formé : « %s »" +msgstr "intervalle littéral mal formé : « %s »" -#: utils/adt/rangetypes.c:2207 +#: utils/adt/rangetypes.c:2295 #, c-format msgid "Junk after \"empty\" key word." msgstr "Cochonnerie après le mot clé « empty »." -#: utils/adt/rangetypes.c:2224 +#: utils/adt/rangetypes.c:2312 #, c-format msgid "Missing left parenthesis or bracket." msgstr "Parenthèse gauche ou crochet manquant." -#: utils/adt/rangetypes.c:2237 +#: utils/adt/rangetypes.c:2327 #, c-format msgid "Missing comma after lower bound." msgstr "Virgule manquante après une limite basse." -#: utils/adt/rangetypes.c:2255 +#: utils/adt/rangetypes.c:2347 #, c-format msgid "Too many commas." msgstr "Trop de virgules." -#: utils/adt/rangetypes.c:2266 +#: utils/adt/rangetypes.c:2358 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "Problème après la parenthèse droite ou le crochet droit." -#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4528 +#: utils/adt/regexp.c:305 utils/adt/regexp.c:1997 utils/adt/varlena.c:4270 #, c-format msgid "regular expression failed: %s" msgstr "l'expression rationnelle a échoué : %s" -#: utils/adt/regexp.c:431 utils/adt/regexp.c:666 +#: utils/adt/regexp.c:446 utils/adt/regexp.c:681 #, c-format msgid "invalid regular expression option: \"%.*s\"" msgstr "option d'expression rationnelle invalide : « %.*s »" -#: utils/adt/regexp.c:668 +#: utils/adt/regexp.c:683 #, c-format msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." msgstr "" -#: utils/adt/regexp.c:702 utils/adt/regexp.c:711 utils/adt/regexp.c:1068 -#: utils/adt/regexp.c:1132 utils/adt/regexp.c:1141 utils/adt/regexp.c:1150 -#: utils/adt/regexp.c:1159 utils/adt/regexp.c:1839 utils/adt/regexp.c:1848 -#: utils/adt/regexp.c:1857 utils/misc/guc.c:11859 utils/misc/guc.c:11893 +#: utils/adt/regexp.c:717 utils/adt/regexp.c:726 utils/adt/regexp.c:1083 +#: utils/adt/regexp.c:1147 utils/adt/regexp.c:1156 utils/adt/regexp.c:1165 +#: utils/adt/regexp.c:1174 utils/adt/regexp.c:1854 utils/adt/regexp.c:1863 +#: utils/adt/regexp.c:1872 utils/misc/guc.c:6610 utils/misc/guc.c:6644 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "valeur invalide pour le paramètre « %s » : %d" -#: utils/adt/regexp.c:922 +#: utils/adt/regexp.c:937 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "une expression régulière SQL ne peut contenir plus de deux guillemets doubles comme séparateur d'échappement" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:1079 utils/adt/regexp.c:1170 utils/adt/regexp.c:1257 -#: utils/adt/regexp.c:1296 utils/adt/regexp.c:1684 utils/adt/regexp.c:1739 -#: utils/adt/regexp.c:1868 +#: utils/adt/regexp.c:1094 utils/adt/regexp.c:1185 utils/adt/regexp.c:1272 +#: utils/adt/regexp.c:1311 utils/adt/regexp.c:1699 utils/adt/regexp.c:1754 +#: utils/adt/regexp.c:1883 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s ne supporte pas l'option « global »" -#: utils/adt/regexp.c:1298 +#: utils/adt/regexp.c:1313 #, c-format msgid "Use the regexp_matches function instead." -msgstr "Utilisez la foncction regexp_matches à la place." +msgstr "Utilisez la fonction regexp_matches à la place." -#: utils/adt/regexp.c:1486 +#: utils/adt/regexp.c:1501 #, c-format msgid "too many regular expression matches" msgstr "trop de correspondances pour l'expression rationnelle" -#: utils/adt/regproc.c:105 +#: utils/adt/regproc.c:104 #, c-format msgid "more than one function named \"%s\"" msgstr "il existe plus d'une fonction nommée « %s »" -#: utils/adt/regproc.c:543 +#: utils/adt/regproc.c:513 #, c-format msgid "more than one operator named %s" msgstr "il existe plus d'un opérateur nommé%s" -#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 -#: utils/adt/ruleutils.c:9872 utils/adt/ruleutils.c:10041 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10020 +#: utils/adt/ruleutils.c:10233 #, c-format msgid "too many arguments" msgstr "trop d'arguments" -#: utils/adt/regproc.c:716 utils/adt/regproc.c:757 +#: utils/adt/regproc.c:676 #, c-format msgid "Provide two argument types for operator." msgstr "Fournit deux types d'argument pour l'opérateur." -#: utils/adt/regproc.c:1639 utils/adt/regproc.c:1663 utils/adt/regproc.c:1764 -#: utils/adt/regproc.c:1788 utils/adt/regproc.c:1890 utils/adt/regproc.c:1895 -#: utils/adt/varlena.c:3667 utils/adt/varlena.c:3672 +#: utils/adt/regproc.c:1544 utils/adt/regproc.c:1661 utils/adt/regproc.c:1790 +#: utils/adt/regproc.c:1795 utils/adt/varlena.c:3410 utils/adt/varlena.c:3415 #, c-format msgid "invalid name syntax" msgstr "syntaxe du nom invalide" -#: utils/adt/regproc.c:1953 +#: utils/adt/regproc.c:1904 #, c-format msgid "expected a left parenthesis" msgstr "attendait une parenthèse gauche" -#: utils/adt/regproc.c:1969 +#: utils/adt/regproc.c:1922 #, c-format msgid "expected a right parenthesis" msgstr "attendait une parenthèse droite" -#: utils/adt/regproc.c:1988 +#: utils/adt/regproc.c:1941 #, c-format msgid "expected a type name" msgstr "attendait un nom de type" -#: utils/adt/regproc.c:2020 +#: utils/adt/regproc.c:1973 #, c-format msgid "improper type name" msgstr "nom du type invalide" -#: utils/adt/ri_triggers.c:307 utils/adt/ri_triggers.c:1611 -#: utils/adt/ri_triggers.c:2598 +#: utils/adt/ri_triggers.c:306 utils/adt/ri_triggers.c:1625 +#: utils/adt/ri_triggers.c:2610 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "" "une instruction insert ou update sur la table « %s » viole la contrainte de clé\n" "étrangère « %s »" -#: utils/adt/ri_triggers.c:310 utils/adt/ri_triggers.c:1614 +#: utils/adt/ri_triggers.c:309 utils/adt/ri_triggers.c:1628 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MATCH FULL n'autorise pas le mixage de valeurs clés NULL et non NULL." -#: utils/adt/ri_triggers.c:2031 +#: utils/adt/ri_triggers.c:2045 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "la fonction « %s » doit être exécutée pour l'instruction INSERT" -#: utils/adt/ri_triggers.c:2037 +#: utils/adt/ri_triggers.c:2051 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "la fonction « %s » doit être exécutée pour l'instruction UPDATE" -#: utils/adt/ri_triggers.c:2043 +#: utils/adt/ri_triggers.c:2057 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "la fonction « %s » doit être exécutée pour l'instruction DELETE" -#: utils/adt/ri_triggers.c:2066 +#: utils/adt/ri_triggers.c:2080 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "aucune entrée pg_constraint pour le trigger « %s » sur la table « %s »" -#: utils/adt/ri_triggers.c:2068 +#: utils/adt/ri_triggers.c:2082 #, c-format msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." msgstr "" "Supprimez ce trigger sur une intégrité référentielle et ses enfants,\n" "puis faites un ALTER TABLE ADD CONSTRAINT." -#: utils/adt/ri_triggers.c:2423 +#: utils/adt/ri_triggers.c:2435 #, c-format msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" msgstr "" "la requête d'intégrité référentielle sur « %s » à partir de la contrainte « %s »\n" "sur « %s » donne des résultats inattendus" -#: utils/adt/ri_triggers.c:2427 +#: utils/adt/ri_triggers.c:2439 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "Ceci est certainement dû à une règle qui a ré-écrit la requête." -#: utils/adt/ri_triggers.c:2588 +#: utils/adt/ri_triggers.c:2600 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "la suppression de la partition « %s » viole la contrainte de clé étrangère « %s »" -#: utils/adt/ri_triggers.c:2591 utils/adt/ri_triggers.c:2616 +#: utils/adt/ri_triggers.c:2603 utils/adt/ri_triggers.c:2628 #, c-format msgid "Key (%s)=(%s) is still referenced from table \"%s\"." msgstr "La clé (%s)=(%s) est toujours référencée à partir de la table « %s »." -#: utils/adt/ri_triggers.c:2602 +#: utils/adt/ri_triggers.c:2614 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "La clé (%s)=(%s) n'est pas présente dans la table « %s »." -#: utils/adt/ri_triggers.c:2605 +#: utils/adt/ri_triggers.c:2617 #, c-format msgid "Key is not present in table \"%s\"." msgstr "La clé n'est pas présente dans la table « %s »." -#: utils/adt/ri_triggers.c:2611 +#: utils/adt/ri_triggers.c:2623 #, c-format msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" msgstr "UPDATE ou DELETE sur la table « %s » viole la contrainte de clé étrangère « %s » de la table « %s »" -#: utils/adt/ri_triggers.c:2619 +#: utils/adt/ri_triggers.c:2631 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "La clé est toujours référencée à partir de la table « %s »." -#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:483 +#: utils/adt/rowtypes.c:106 utils/adt/rowtypes.c:510 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "l'ajout de colonnes ayant un type composé n'est pas implémenté" -#: utils/adt/rowtypes.c:157 utils/adt/rowtypes.c:186 utils/adt/rowtypes.c:209 -#: utils/adt/rowtypes.c:217 utils/adt/rowtypes.c:269 utils/adt/rowtypes.c:277 +#: utils/adt/rowtypes.c:159 utils/adt/rowtypes.c:191 utils/adt/rowtypes.c:217 +#: utils/adt/rowtypes.c:228 utils/adt/rowtypes.c:286 utils/adt/rowtypes.c:297 #, c-format msgid "malformed record literal: \"%s\"" -msgstr "enregistrement litéral invalide : « %s »" +msgstr "enregistrement littéral invalide : « %s »" -#: utils/adt/rowtypes.c:158 +#: utils/adt/rowtypes.c:160 #, c-format msgid "Missing left parenthesis." msgstr "Parenthèse gauche manquante." -#: utils/adt/rowtypes.c:187 +#: utils/adt/rowtypes.c:192 #, c-format msgid "Too few columns." msgstr "Pas assez de colonnes." -#: utils/adt/rowtypes.c:270 +#: utils/adt/rowtypes.c:287 #, c-format msgid "Too many columns." msgstr "Trop de colonnes." -#: utils/adt/rowtypes.c:278 +#: utils/adt/rowtypes.c:298 #, c-format msgid "Junk after right parenthesis." msgstr "Problème après la parenthèse droite." -#: utils/adt/rowtypes.c:532 +#: utils/adt/rowtypes.c:559 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "mauvais nombre de colonnes : %d, alors que %d attendu" -#: utils/adt/rowtypes.c:574 +#: utils/adt/rowtypes.c:601 #, c-format msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" msgstr "la donnée binaire a le type %u (%s) au lieu de %u (%s) dans la colonne %d de l'enregistrement" -#: utils/adt/rowtypes.c:641 +#: utils/adt/rowtypes.c:668 #, c-format msgid "improper binary format in record column %d" msgstr "format binaire invalide dans l'enregistrement de la colonne %d" -#: utils/adt/rowtypes.c:932 utils/adt/rowtypes.c:1178 utils/adt/rowtypes.c:1436 -#: utils/adt/rowtypes.c:1682 +#: utils/adt/rowtypes.c:959 utils/adt/rowtypes.c:1205 utils/adt/rowtypes.c:1463 +#: utils/adt/rowtypes.c:1709 #, c-format msgid "cannot compare dissimilar column types %s and %s at record column %d" msgstr "" "ne peut pas comparer les types de colonnes non similaires %s et %s pour la\n" "colonne %d de l'enregistrement" -#: utils/adt/rowtypes.c:1023 utils/adt/rowtypes.c:1248 -#: utils/adt/rowtypes.c:1533 utils/adt/rowtypes.c:1718 +#: utils/adt/rowtypes.c:1050 utils/adt/rowtypes.c:1275 +#: utils/adt/rowtypes.c:1560 utils/adt/rowtypes.c:1745 #, c-format msgid "cannot compare record types with different numbers of columns" msgstr "" "ne peut pas comparer les types d'enregistrement avec des numéros différents\n" "des colonnes" -#: utils/adt/ruleutils.c:2705 +#: utils/adt/ruleutils.c:2694 #, fuzzy, c-format #| msgid "cannot use subquery in index expression" msgid "input is a query, not an expression" msgstr "ne peut pas utiliser la sous-requête dans l'expression de l'index" -#: utils/adt/ruleutils.c:2717 +#: utils/adt/ruleutils.c:2706 #, fuzzy, c-format #| msgid "USING expression contains a whole-row table reference." msgid "expression contains variables of more than one relation" msgstr "l'expression USING contient une référence de table de ligne complète." -#: utils/adt/ruleutils.c:2724 +#: utils/adt/ruleutils.c:2713 #, fuzzy, c-format #| msgid "argument of %s must not contain variables" msgid "expression contains variables" msgstr "l'argument de « %s » ne doit pas contenir de variables" -#: utils/adt/ruleutils.c:5247 +#: utils/adt/ruleutils.c:5227 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "la règle « %s » a un type d'événement %d non supporté" -#: utils/adt/timestamp.c:110 +#: utils/adt/timestamp.c:112 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "la précision de TIMESTAMP(%d)%s ne doit pas être négative" -#: utils/adt/timestamp.c:116 +#: utils/adt/timestamp.c:118 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "la précision de TIMESTAMP(%d)%s est réduite au maximum autorisé, %d" -#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12883 -#, c-format -msgid "timestamp out of range: \"%s\"" -msgstr "timestamp en dehors de limites : « %s »" - -#: utils/adt/timestamp.c:375 +#: utils/adt/timestamp.c:378 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "la précision de timestamp(%d) doit être comprise entre %d et %d" -#: utils/adt/timestamp.c:499 +#: utils/adt/timestamp.c:496 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "Les fuseaux horaires numériques doivent avoir « - » ou « + » comme premier caractère." -#: utils/adt/timestamp.c:512 +#: utils/adt/timestamp.c:508 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "le fuseau horaire numérique « %s » est en dehors des limites" -#: utils/adt/timestamp.c:608 utils/adt/timestamp.c:618 -#: utils/adt/timestamp.c:626 +#: utils/adt/timestamp.c:609 utils/adt/timestamp.c:619 +#: utils/adt/timestamp.c:627 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "timestamp en dehors de limites : %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:727 +#: utils/adt/timestamp.c:728 #, c-format msgid "timestamp cannot be NaN" msgstr "timestamp ne peut pas valoir NaN" -#: utils/adt/timestamp.c:745 utils/adt/timestamp.c:757 +#: utils/adt/timestamp.c:746 utils/adt/timestamp.c:758 #, c-format msgid "timestamp out of range: \"%g\"" msgstr "timestamp en dehors de limites : « %g »" -#: utils/adt/timestamp.c:1062 utils/adt/timestamp.c:1095 +#: utils/adt/timestamp.c:941 utils/adt/timestamp.c:1518 +#: utils/adt/timestamp.c:2708 utils/adt/timestamp.c:2778 +#: utils/adt/timestamp.c:2795 utils/adt/timestamp.c:2848 +#: utils/adt/timestamp.c:2887 utils/adt/timestamp.c:3184 +#: utils/adt/timestamp.c:3189 utils/adt/timestamp.c:3194 +#: utils/adt/timestamp.c:3244 utils/adt/timestamp.c:3251 +#: utils/adt/timestamp.c:3258 utils/adt/timestamp.c:3278 +#: utils/adt/timestamp.c:3285 utils/adt/timestamp.c:3292 +#: utils/adt/timestamp.c:3322 utils/adt/timestamp.c:3330 +#: utils/adt/timestamp.c:3374 utils/adt/timestamp.c:3796 +#: utils/adt/timestamp.c:3920 utils/adt/timestamp.c:4440 +#, c-format +msgid "interval out of range" +msgstr "intervalle en dehors des limites" + +#: utils/adt/timestamp.c:1065 utils/adt/timestamp.c:1098 #, c-format msgid "invalid INTERVAL type modifier" msgstr "modificateur de type INTERVAL invalide" -#: utils/adt/timestamp.c:1078 +#: utils/adt/timestamp.c:1081 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "la précision de l'intervalle INTERVAL(%d) ne doit pas être négative" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1087 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "La précision de l'intervalle INTERVAL(%d) doit être réduit au maximum permis, %d" -#: utils/adt/timestamp.c:1466 +#: utils/adt/timestamp.c:1473 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "la précision de interval(%d) doit être comprise entre %d et %d" -#: utils/adt/timestamp.c:2689 +#: utils/adt/timestamp.c:2703 #, c-format msgid "cannot subtract infinite timestamps" msgstr "ne peut pas soustraire les valeurs timestamps infinies" -#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:4074 +#: utils/adt/timestamp.c:3956 utils/adt/timestamp.c:4139 #, c-format msgid "origin out of range" msgstr "origine hors des limites" -#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:4079 +#: utils/adt/timestamp.c:3961 utils/adt/timestamp.c:4144 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "Les données de type timestamp ne peuvent pas être rangées dans des intervalles contenant des mois ou des années." -#: utils/adt/timestamp.c:3903 utils/adt/timestamp.c:4086 +#: utils/adt/timestamp.c:3968 utils/adt/timestamp.c:4151 #, c-format msgid "stride must be greater than zero" msgstr "le pas doit être supérieur à zéro" -#: utils/adt/timestamp.c:4399 +#: utils/adt/timestamp.c:4434 #, fuzzy, c-format #| msgid "interval units \"%s\" not supported because months usually have fractional weeks" msgid "Months usually have fractional weeks." @@ -26394,53 +27049,47 @@ msgstr "suppress_redundant_updates_trigger : doit être appelé avant une mise msgid "suppress_redundant_updates_trigger: must be called for each row" msgstr "suppress_redundant_updates_trigger : doit être appelé pour chaque ligne" -#: utils/adt/tsgistidx.c:92 -#, c-format -msgid "gtsvector_in not implemented" -msgstr "gtsvector_in n'est pas encore implémenté" - -#: utils/adt/tsquery.c:199 utils/adt/tsquery_op.c:124 +#: utils/adt/tsquery.c:210 utils/adt/tsquery_op.c:125 #, c-format msgid "distance in phrase operator must be an integer value between zero and %d inclusive" msgstr "la distance dans l'opérateur de phrase doit être un entier compris entre zéro et %d inclus" -#: utils/adt/tsquery.c:306 utils/adt/tsquery.c:691 -#: utils/adt/tsvector_parser.c:133 -#, c-format -msgid "syntax error in tsquery: \"%s\"" -msgstr "erreur de syntaxe dans tsquery : « %s »" - -#: utils/adt/tsquery.c:330 +#: utils/adt/tsquery.c:344 #, c-format msgid "no operand in tsquery: \"%s\"" msgstr "aucun opérande dans tsquery : « %s »" -#: utils/adt/tsquery.c:534 +#: utils/adt/tsquery.c:558 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "valeur trop importante dans tsquery : « %s »" -#: utils/adt/tsquery.c:539 +#: utils/adt/tsquery.c:563 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "l'opérande est trop long dans tsquery : « %s »" -#: utils/adt/tsquery.c:567 +#: utils/adt/tsquery.c:591 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "le mot est trop long dans tsquery : « %s »" -#: utils/adt/tsquery.c:835 +#: utils/adt/tsquery.c:717 utils/adt/tsvector_parser.c:147 +#, c-format +msgid "syntax error in tsquery: \"%s\"" +msgstr "erreur de syntaxe dans tsquery : « %s »" + +#: utils/adt/tsquery.c:883 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" msgstr "la requête de recherche plein texte ne contient pas de lexemes : « %s »" -#: utils/adt/tsquery.c:846 utils/adt/tsquery_util.c:375 +#: utils/adt/tsquery.c:894 utils/adt/tsquery_util.c:376 #, c-format msgid "tsquery is too large" msgstr "le champ tsquery est trop gros" -#: utils/adt/tsquery_cleanup.c:407 +#: utils/adt/tsquery_cleanup.c:409 #, c-format msgid "text-search query contains only stop words or doesn't contain lexemes, ignored" msgstr "" @@ -26472,90 +27121,90 @@ msgstr "le tableau de poids ne doit pas contenir de valeurs NULL" msgid "weight out of range" msgstr "poids en dehors des limites" -#: utils/adt/tsvector.c:215 +#: utils/adt/tsvector.c:217 #, c-format msgid "word is too long (%ld bytes, max %ld bytes)" msgstr "le mot est trop long (%ld octets, max %ld octets)" -#: utils/adt/tsvector.c:222 +#: utils/adt/tsvector.c:224 #, c-format msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "la chaîne est trop longue pour tsvector (%ld octets, max %ld octets)" -#: utils/adt/tsvector_op.c:771 +#: utils/adt/tsvector_op.c:773 #, c-format msgid "lexeme array may not contain nulls" msgstr "le tableau de lexème ne doit pas contenir de valeurs NULL" -#: utils/adt/tsvector_op.c:776 +#: utils/adt/tsvector_op.c:778 #, fuzzy, c-format #| msgid "lexeme array may not contain nulls" msgid "lexeme array may not contain empty strings" msgstr "le tableau de lexème ne doit pas contenir de valeurs NULL" -#: utils/adt/tsvector_op.c:846 +#: utils/adt/tsvector_op.c:847 #, c-format msgid "weight array may not contain nulls" msgstr "le tableau de poids ne doit pas contenir de valeurs NULL" -#: utils/adt/tsvector_op.c:870 +#: utils/adt/tsvector_op.c:871 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "poids non reconnu : « %c »" -#: utils/adt/tsvector_op.c:2434 +#: utils/adt/tsvector_op.c:2601 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "la requête ts_stat doit renvoyer une colonne tsvector" -#: utils/adt/tsvector_op.c:2623 +#: utils/adt/tsvector_op.c:2790 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "la colonne tsvector « %s » n'existe pas" -#: utils/adt/tsvector_op.c:2630 +#: utils/adt/tsvector_op.c:2797 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "la colonne « %s » n'est pas de type tsvector" -#: utils/adt/tsvector_op.c:2642 +#: utils/adt/tsvector_op.c:2809 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "la colonne de configuration « %s » n'existe pas" -#: utils/adt/tsvector_op.c:2648 +#: utils/adt/tsvector_op.c:2815 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "la colonne « %s » n'est pas de type regconfig" -#: utils/adt/tsvector_op.c:2655 +#: utils/adt/tsvector_op.c:2822 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "la colonne de configuration « %s » ne doit pas être NULL" -#: utils/adt/tsvector_op.c:2668 +#: utils/adt/tsvector_op.c:2835 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "" "le nom de la configuration de la recherche plein texte « %s » doit être\n" "qualifié par son schéma" -#: utils/adt/tsvector_op.c:2693 +#: utils/adt/tsvector_op.c:2860 #, c-format msgid "column \"%s\" is not of a character type" msgstr "la colonne « %s » n'est pas de type caractère" -#: utils/adt/tsvector_parser.c:134 +#: utils/adt/tsvector_parser.c:148 #, c-format msgid "syntax error in tsvector: \"%s\"" msgstr "erreur de syntaxe dans tsvector : « %s »" -#: utils/adt/tsvector_parser.c:200 +#: utils/adt/tsvector_parser.c:221 #, c-format msgid "there is no escaped character: \"%s\"" msgstr "il n'existe pas de caractères d'échappement : « %s »" -#: utils/adt/tsvector_parser.c:318 +#: utils/adt/tsvector_parser.c:339 #, c-format msgid "wrong position info in tsvector: \"%s\"" msgstr "mauvaise information de position dans tsvector : « %s »" @@ -26565,12 +27214,12 @@ msgstr "mauvaise information de position dans tsvector : « %s »" msgid "could not generate random values" msgstr "n'a pas pu générer de valeurs aléatoires" -#: utils/adt/varbit.c:110 utils/adt/varchar.c:53 +#: utils/adt/varbit.c:110 utils/adt/varchar.c:54 #, c-format msgid "length for type %s must be at least 1" msgstr "la longueur du type %s doit être d'au moins 1" -#: utils/adt/varbit.c:115 utils/adt/varchar.c:57 +#: utils/adt/varbit.c:115 utils/adt/varchar.c:58 #, c-format msgid "length for type %s cannot exceed %d" msgstr "la longueur du type %s ne peut pas excéder %d" @@ -26605,9 +27254,9 @@ msgstr "longueur invalide dans la chaîne bit externe" msgid "bit string too long for type bit varying(%d)" msgstr "la chaîne de bits est trop longue pour le type bit varying(%d)" -#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:889 -#: utils/adt/varlena.c:952 utils/adt/varlena.c:1109 utils/adt/varlena.c:3309 -#: utils/adt/varlena.c:3387 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:908 +#: utils/adt/varlena.c:971 utils/adt/varlena.c:1128 utils/adt/varlena.c:3052 +#: utils/adt/varlena.c:3130 #, c-format msgid "negative substring length not allowed" msgstr "longueur de sous-chaîne négative non autorisée" @@ -26632,137 +27281,117 @@ msgstr "ne peut pas utiliser l'opérateur XOR sur des chaînes bit de tailles di msgid "bit index %d out of valid range (0..%d)" msgstr "index de bit %d en dehors des limites valides (0..%d)" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3591 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3334 #, c-format msgid "new bit must be 0 or 1" msgstr "le nouveau bit doit valoir soit 0 soit 1" -#: utils/adt/varchar.c:157 utils/adt/varchar.c:310 +#: utils/adt/varchar.c:162 utils/adt/varchar.c:313 #, c-format msgid "value too long for type character(%d)" msgstr "valeur trop longue pour le type character(%d)" -#: utils/adt/varchar.c:472 utils/adt/varchar.c:634 +#: utils/adt/varchar.c:476 utils/adt/varchar.c:640 #, c-format msgid "value too long for type character varying(%d)" msgstr "valeur trop longue pour le type character varying(%d)" -#: utils/adt/varchar.c:732 utils/adt/varlena.c:1498 +#: utils/adt/varchar.c:738 utils/adt/varlena.c:1517 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "n'a pas pu déterminer le collationnement à utiliser pour la comparaison de chaîne" -#: utils/adt/varlena.c:1208 utils/adt/varlena.c:1947 +#: utils/adt/varlena.c:1227 utils/adt/varlena.c:1806 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "les collationnements non déterministes ne sont pas supportés pour les recherches de sous-chaînes" -#: utils/adt/varlena.c:1596 utils/adt/varlena.c:1609 -#, c-format -msgid "could not convert string to UTF-16: error code %lu" -msgstr "n'a pas pu convertir la chaîne en UTF-16 : erreur %lu" - -#: utils/adt/varlena.c:1624 -#, c-format -msgid "could not compare Unicode strings: %m" -msgstr "n'a pas pu comparer les chaînes unicode : %m" - -#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2396 -#, c-format -msgid "collation failed: %s" -msgstr "échec du collationnement : %s" - -#: utils/adt/varlena.c:2582 -#, c-format -msgid "sort key generation failed: %s" -msgstr "échec de génération de la clé de tri : %s" - -#: utils/adt/varlena.c:3475 utils/adt/varlena.c:3542 +#: utils/adt/varlena.c:3218 utils/adt/varlena.c:3285 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "index %d en dehors des limites valides, 0..%d" -#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3578 +#: utils/adt/varlena.c:3249 utils/adt/varlena.c:3321 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "index %lld en dehors des limites valides, 0..%lld" -#: utils/adt/varlena.c:4640 +#: utils/adt/varlena.c:4382 #, c-format msgid "field position must not be zero" msgstr "la position du champ ne doit pas être zéro" -#: utils/adt/varlena.c:5660 +#: utils/adt/varlena.c:5554 #, c-format msgid "unterminated format() type specifier" msgstr "spécificateur de type pour format() non terminé" -#: utils/adt/varlena.c:5661 utils/adt/varlena.c:5795 utils/adt/varlena.c:5916 +#: utils/adt/varlena.c:5555 utils/adt/varlena.c:5689 utils/adt/varlena.c:5810 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Pour un unique \"%%\" utilisez \"%%%%\"." -#: utils/adt/varlena.c:5793 utils/adt/varlena.c:5914 +#: utils/adt/varlena.c:5687 utils/adt/varlena.c:5808 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "spécificateur de type « %.*s » pour format() non reconnu" -#: utils/adt/varlena.c:5806 utils/adt/varlena.c:5863 +#: utils/adt/varlena.c:5700 utils/adt/varlena.c:5757 #, c-format msgid "too few arguments for format()" msgstr "trop peu d'arguments pour format()" -#: utils/adt/varlena.c:5959 utils/adt/varlena.c:6141 +#: utils/adt/varlena.c:5853 utils/adt/varlena.c:6035 #, c-format msgid "number is out of range" msgstr "le nombre est en dehors des limites" -#: utils/adt/varlena.c:6022 utils/adt/varlena.c:6050 +#: utils/adt/varlena.c:5916 utils/adt/varlena.c:5944 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "le format indique l'argument 0 mais les arguments sont numérotés à partir de 1" -#: utils/adt/varlena.c:6043 +#: utils/adt/varlena.c:5937 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "la position de l'argument width doit se terminer par « $ »" -#: utils/adt/varlena.c:6088 +#: utils/adt/varlena.c:5982 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "les valeurs NULL ne peuvent pas être formatés comme un identifiant SQL" -#: utils/adt/varlena.c:6214 +#: utils/adt/varlena.c:6190 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "La normalisation Unicode peut seulement être exécutée si l'encodage serveur est UTF8" -#: utils/adt/varlena.c:6227 +#: utils/adt/varlena.c:6203 #, c-format msgid "invalid normalization form: %s" msgstr "forme de normalisation invalide : %s" -#: utils/adt/varlena.c:6430 utils/adt/varlena.c:6465 utils/adt/varlena.c:6500 +#: utils/adt/varlena.c:6406 utils/adt/varlena.c:6441 utils/adt/varlena.c:6476 #, c-format msgid "invalid Unicode code point: %04X" msgstr "point code Unicode invalide : %04X" -#: utils/adt/varlena.c:6530 +#: utils/adt/varlena.c:6506 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "Les échappements Unicode doivent être de la forme \\XXXX, \\+XXXXXX, \\uXXXX ou \\UXXXXXXXX." -#: utils/adt/windowfuncs.c:306 +#: utils/adt/windowfuncs.c:442 #, c-format msgid "argument of ntile must be greater than zero" msgstr "l'argument de ntile doit être supérieur à zéro" -#: utils/adt/windowfuncs.c:528 +#: utils/adt/windowfuncs.c:706 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "l'argument de nth_value doit être supérieur à zéro" -#: utils/adt/xid8funcs.c:117 +#: utils/adt/xid8funcs.c:125 #, fuzzy, c-format #| msgid "transaction ID %s is in the future" msgid "transaction ID %llu is in the future" @@ -26773,57 +27402,57 @@ msgstr "l'identifiant de transaction %s est dans le futur" msgid "invalid external pg_snapshot data" msgstr "données pg_snapshot externes invalides" -#: utils/adt/xml.c:222 +#: utils/adt/xml.c:228 #, c-format msgid "unsupported XML feature" msgstr "fonctionnalité XML non supportée" -#: utils/adt/xml.c:223 +#: utils/adt/xml.c:229 #, c-format msgid "This functionality requires the server to be built with libxml support." msgstr "Cette fonctionnalité nécessite que le serveur dispose du support de libxml." -#: utils/adt/xml.c:242 utils/mb/mbutils.c:627 +#: utils/adt/xml.c:248 utils/mb/mbutils.c:628 #, c-format msgid "invalid encoding name \"%s\"" msgstr "nom d'encodage « %s » invalide" -#: utils/adt/xml.c:485 utils/adt/xml.c:490 +#: utils/adt/xml.c:496 utils/adt/xml.c:501 #, c-format msgid "invalid XML comment" msgstr "commentaire XML invalide" -#: utils/adt/xml.c:619 +#: utils/adt/xml.c:660 #, c-format msgid "not an XML document" msgstr "pas un document XML" -#: utils/adt/xml.c:778 utils/adt/xml.c:801 +#: utils/adt/xml.c:956 utils/adt/xml.c:979 #, c-format msgid "invalid XML processing instruction" msgstr "instruction de traitement XML invalide" -#: utils/adt/xml.c:779 +#: utils/adt/xml.c:957 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "le nom de la cible de l'instruction de traitement XML ne peut pas être « %s »." -#: utils/adt/xml.c:802 +#: utils/adt/xml.c:980 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "l'instruction de traitement XML ne peut pas contenir « ?> »." -#: utils/adt/xml.c:881 +#: utils/adt/xml.c:1059 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate n'est pas implémenté" -#: utils/adt/xml.c:960 +#: utils/adt/xml.c:1115 #, c-format msgid "could not initialize XML library" msgstr "n'a pas pu initialiser la bibliothèque XML" -#: utils/adt/xml.c:961 +#: utils/adt/xml.c:1116 #, fuzzy, c-format #| msgid "libxml2 has incompatible char type: sizeof(char)=%u, sizeof(xmlChar)=%u." msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." @@ -26831,12 +27460,12 @@ msgstr "" "libxml2 a un type de caractère incompatible : sizeof(char)=%u,\n" "sizeof(xmlChar)=%u." -#: utils/adt/xml.c:1047 +#: utils/adt/xml.c:1202 #, c-format msgid "could not set up XML error handler" msgstr "n'a pas pu configurer le gestionnaire d'erreurs XML" -#: utils/adt/xml.c:1048 +#: utils/adt/xml.c:1203 #, c-format msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." msgstr "" @@ -26844,280 +27473,292 @@ msgstr "" "n'est pas compatible avec les fichiers d'en-tête de libxml2 avec lesquels\n" "PostgreSQL a été construit." -#: utils/adt/xml.c:1935 +#: utils/adt/xml.c:2189 msgid "Invalid character value." msgstr "Valeur invalide pour le caractère." -#: utils/adt/xml.c:1938 +#: utils/adt/xml.c:2192 msgid "Space required." msgstr "Espace requis." -#: utils/adt/xml.c:1941 +#: utils/adt/xml.c:2195 msgid "standalone accepts only 'yes' or 'no'." msgstr "la version autonome accepte seulement 'yes' et 'no'." -#: utils/adt/xml.c:1944 +#: utils/adt/xml.c:2198 msgid "Malformed declaration: missing version." msgstr "Déclaration mal formée : version manquante." -#: utils/adt/xml.c:1947 +#: utils/adt/xml.c:2201 msgid "Missing encoding in text declaration." msgstr "Encodage manquant dans la déclaration du texte." -#: utils/adt/xml.c:1950 +#: utils/adt/xml.c:2204 msgid "Parsing XML declaration: '?>' expected." msgstr "Analyse de la déclaration XML : « ?> » attendu." -#: utils/adt/xml.c:1953 +#: utils/adt/xml.c:2207 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Code d'erreur libxml non reconnu : %d." -#: utils/adt/xml.c:2210 +#: utils/adt/xml.c:2461 #, c-format msgid "XML does not support infinite date values." msgstr "XML ne supporte pas les valeurs infinies de date." -#: utils/adt/xml.c:2232 utils/adt/xml.c:2259 +#: utils/adt/xml.c:2483 utils/adt/xml.c:2510 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML ne supporte pas les valeurs infinies de timestamp." -#: utils/adt/xml.c:2675 +#: utils/adt/xml.c:2926 #, c-format msgid "invalid query" msgstr "requête invalide" -#: utils/adt/xml.c:4015 +#: utils/adt/xml.c:3018 +#, fuzzy, c-format +#| msgid "%s query does not return tuples" +msgid "portal \"%s\" does not return tuples" +msgstr "la requête %s ne renvoie pas de lignes" + +#: utils/adt/xml.c:4270 #, c-format msgid "invalid array for XML namespace mapping" msgstr "tableau invalide pour la correspondance de l'espace de nom XML" -#: utils/adt/xml.c:4016 +#: utils/adt/xml.c:4271 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "" "Le tableau doit avoir deux dimensions avec une longueur de 2 pour le\n" "deuxième axe." -#: utils/adt/xml.c:4040 +#: utils/adt/xml.c:4295 #, c-format msgid "empty XPath expression" msgstr "expression XPath vide" -#: utils/adt/xml.c:4092 +#: utils/adt/xml.c:4347 #, c-format msgid "neither namespace name nor URI may be null" msgstr "ni le nom de l'espace de noms ni l'URI ne peuvent être NULL" -#: utils/adt/xml.c:4099 +#: utils/adt/xml.c:4354 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "n'a pas pu enregistrer l'espace de noms XML de nom « %s » et d'URI « %s »" -#: utils/adt/xml.c:4450 +#: utils/adt/xml.c:4697 #, c-format msgid "DEFAULT namespace is not supported" msgstr "l'espace de nom DEFAULT n'est pas supporté" -#: utils/adt/xml.c:4479 +#: utils/adt/xml.c:4726 #, c-format msgid "row path filter must not be empty string" msgstr "le filtre du chemin de ligne ne doit pas être une chaîne vide" -#: utils/adt/xml.c:4510 +#: utils/adt/xml.c:4757 #, c-format msgid "column path filter must not be empty string" msgstr "le filtre du chemin de colonne ne doit pas être une chaîne vide" -#: utils/adt/xml.c:4654 +#: utils/adt/xml.c:4901 #, c-format msgid "more than one value returned by column XPath expression" msgstr "plus d'une valeur renvoyée par l'expression XPath de colonne" -#: utils/cache/lsyscache.c:1042 +#: utils/cache/lsyscache.c:1043 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "la conversion du type %s vers le type %s n'existe pas" -#: utils/cache/lsyscache.c:2844 utils/cache/lsyscache.c:2877 -#: utils/cache/lsyscache.c:2910 utils/cache/lsyscache.c:2943 +#: utils/cache/lsyscache.c:2845 utils/cache/lsyscache.c:2878 +#: utils/cache/lsyscache.c:2911 utils/cache/lsyscache.c:2944 #, c-format msgid "type %s is only a shell" msgstr "le type %s est seulement un shell" -#: utils/cache/lsyscache.c:2849 +#: utils/cache/lsyscache.c:2850 #, c-format msgid "no input function available for type %s" msgstr "aucune fonction en entrée disponible pour le type %s" -#: utils/cache/lsyscache.c:2882 +#: utils/cache/lsyscache.c:2883 #, c-format msgid "no output function available for type %s" msgstr "aucune fonction en sortie disponible pour le type %s" -#: utils/cache/partcache.c:215 +#: utils/cache/partcache.c:219 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d for type %s" msgstr "la classe d'opérateur « %s » de la méthode d'accès %s nécessite la fonction de support manquante %d pour le type %s" -#: utils/cache/plancache.c:720 +#: utils/cache/plancache.c:724 #, c-format msgid "cached plan must not change result type" msgstr "le plan en cache ne doit pas modifier le type en résultat" -#: utils/cache/relcache.c:3753 +#: utils/cache/relcache.c:3741 #, fuzzy, c-format #| msgid "pg_class index OID value not set when in binary upgrade mode" -msgid "heap relfilenode value not set when in binary upgrade mode" +msgid "heap relfilenumber value not set when in binary upgrade mode" msgstr "OID de l'index de pg_class non configuré en mode de mise à jour binaire" -#: utils/cache/relcache.c:3761 +#: utils/cache/relcache.c:3749 #, fuzzy, c-format #| msgid "must be superuser to connect in binary upgrade mode" -msgid "unexpected request for new relfilenode in binary upgrade mode" +msgid "unexpected request for new relfilenumber in binary upgrade mode" msgstr "doit être super-utilisateur pour se connecter en mode de mise à jour binaire" -#: utils/cache/relcache.c:6472 +#: utils/cache/relcache.c:6495 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "n'a pas pu créer le fichier d'initialisation relation-cache « %s » : %m" -#: utils/cache/relcache.c:6474 +#: utils/cache/relcache.c:6497 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Continue malgré tout, mais quelque chose s'est mal passé." -#: utils/cache/relcache.c:6796 +#: utils/cache/relcache.c:6819 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier cache « %s » : %m" -#: utils/cache/relmapper.c:590 +#: utils/cache/relmapper.c:596 #, c-format msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "" "ne peut pas préparer (PREPARE) une transaction qui a modifié la correspondance\n" "de relation" -#: utils/cache/relmapper.c:836 +#: utils/cache/relmapper.c:850 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "le fichier de correspondance des relations « %s » contient des données invalides" -#: utils/cache/relmapper.c:846 +#: utils/cache/relmapper.c:860 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "" "le fichier de correspondance des relations « %s » contient une somme de\n" "contrôle incorrecte" -#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:575 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:566 #, c-format msgid "record type has not been registered" msgstr "le type d'enregistrement n'a pas été enregistré" -#: utils/error/assert.c:39 +#: utils/error/assert.c:37 #, c-format msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" msgstr "TRAP : ExceptionalCondition : mauvais arguments dans le PID %d\n" -#: utils/error/assert.c:42 -#, c-format -msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" +#: utils/error/assert.c:40 +#, fuzzy, c-format +#| msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" +msgid "TRAP: failed Assert(\"%s\"), File: \"%s\", Line: %d, PID: %d\n" msgstr "TRAP : %s(« %s », Fichier : « %s », Ligne : %d, PID : %d)\n" -#: utils/error/elog.c:404 +#: utils/error/elog.c:416 #, c-format msgid "error occurred before error message processing is available\n" msgstr "erreur survenue avant que le traitement des messages d'erreurs ne soit disponible\n" -#: utils/error/elog.c:1943 +#: utils/error/elog.c:2092 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "n'a pas pu ré-ouvrir le fichier « %s » comme stderr : %m" -#: utils/error/elog.c:1956 +#: utils/error/elog.c:2105 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "n'a pas pu ré-ouvrir le fichier « %s » comme stdout : %m" -#: utils/error/elog.c:2521 utils/error/elog.c:2548 utils/error/elog.c:2564 +#: utils/error/elog.c:2141 +#, c-format +msgid "invalid character" +msgstr "caractère invalide" + +#: utils/error/elog.c:2847 utils/error/elog.c:2874 utils/error/elog.c:2890 msgid "[unknown]" msgstr "[inconnu]" -#: utils/error/elog.c:2837 utils/error/elog.c:3158 utils/error/elog.c:3265 +#: utils/error/elog.c:3163 utils/error/elog.c:3484 utils/error/elog.c:3591 msgid "missing error text" msgstr "texte d'erreur manquant" -#: utils/error/elog.c:2840 utils/error/elog.c:2843 +#: utils/error/elog.c:3166 utils/error/elog.c:3169 #, c-format msgid " at character %d" msgstr " au caractère %d" -#: utils/error/elog.c:2853 utils/error/elog.c:2860 +#: utils/error/elog.c:3179 utils/error/elog.c:3186 msgid "DETAIL: " msgstr "DÉTAIL: " -#: utils/error/elog.c:2867 +#: utils/error/elog.c:3193 msgid "HINT: " msgstr "ASTUCE : " -#: utils/error/elog.c:2874 +#: utils/error/elog.c:3200 msgid "QUERY: " msgstr "REQUÊTE : " -#: utils/error/elog.c:2881 +#: utils/error/elog.c:3207 msgid "CONTEXT: " msgstr "CONTEXTE : " -#: utils/error/elog.c:2891 +#: utils/error/elog.c:3217 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "EMPLACEMENT : %s, %s:%d\n" -#: utils/error/elog.c:2898 +#: utils/error/elog.c:3224 #, c-format msgid "LOCATION: %s:%d\n" msgstr "EMPLACEMENT : %s:%d\n" -#: utils/error/elog.c:2905 +#: utils/error/elog.c:3231 msgid "BACKTRACE: " msgstr "PILE D'APPEL : " -#: utils/error/elog.c:2917 +#: utils/error/elog.c:3243 msgid "STATEMENT: " msgstr "INSTRUCTION : " -#: utils/error/elog.c:3310 +#: utils/error/elog.c:3636 msgid "DEBUG" msgstr "DEBUG" -#: utils/error/elog.c:3314 +#: utils/error/elog.c:3640 msgid "LOG" msgstr "LOG" -#: utils/error/elog.c:3317 +#: utils/error/elog.c:3643 msgid "INFO" msgstr "INFO" -#: utils/error/elog.c:3320 +#: utils/error/elog.c:3646 msgid "NOTICE" msgstr "NOTICE" -#: utils/error/elog.c:3324 +#: utils/error/elog.c:3650 msgid "WARNING" msgstr "ATTENTION" -#: utils/error/elog.c:3327 +#: utils/error/elog.c:3653 msgid "ERROR" msgstr "ERREUR" -#: utils/error/elog.c:3330 +#: utils/error/elog.c:3656 msgid "FATAL" msgstr "FATAL" -#: utils/error/elog.c:3333 +#: utils/error/elog.c:3659 msgid "PANIC" msgstr "PANIC" @@ -27214,421 +27855,455 @@ msgstr "composant de longueur zéro dans le paramètre « dynamic_library_path msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "un composant du paramètre « dynamic_library_path » n'est pas un chemin absolu" -#: utils/fmgr/fmgr.c:238 +#: utils/fmgr/fmgr.c:236 #, c-format msgid "internal function \"%s\" is not in internal lookup table" msgstr "la fonction interne « %s » n'est pas dans une table de recherche interne" -#: utils/fmgr/fmgr.c:484 +#: utils/fmgr/fmgr.c:470 #, c-format msgid "could not find function information for function \"%s\"" msgstr "n'a pas pu trouver d'informations sur la fonction « %s »" -#: utils/fmgr/fmgr.c:486 +#: utils/fmgr/fmgr.c:472 #, c-format msgid "SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname)." msgstr "Les fonctions appelables en SQL ont besoin d'un PG_FUNCTION_INFO_V1(nom_fonction)." -#: utils/fmgr/fmgr.c:504 +#: utils/fmgr/fmgr.c:490 #, c-format msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "version API %d non reconnue mais rapportée par la fonction info « %s »" -#: utils/fmgr/fmgr.c:1985 +#: utils/fmgr/fmgr.c:2080 #, c-format msgid "operator class options info is absent in function call context" msgstr "les informations sur les options de la classe d'opérateur sont absentes dans le contexte d'appel à la fonction" -#: utils/fmgr/fmgr.c:2052 +#: utils/fmgr/fmgr.c:2147 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "fonction %u de validation du langage appelée pour le langage %u au lieu de %u" -#: utils/fmgr/funcapi.c:498 +#: utils/fmgr/funcapi.c:489 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "" "n'a pas pu déterminer le type du résultat actuel pour la fonction « %s »\n" "déclarant retourner le type %s" -#: utils/fmgr/funcapi.c:643 +#: utils/fmgr/funcapi.c:634 #, c-format msgid "argument declared %s does not contain a range type but type %s" msgstr "l'argument déclaré %s ne contient pas un type d'intervalle mais un type %s" -#: utils/fmgr/funcapi.c:726 +#: utils/fmgr/funcapi.c:717 #, c-format msgid "could not find multirange type for data type %s" msgstr "n'a pas pu trouver le type multirange pour le type de données %s" -#: utils/fmgr/funcapi.c:1943 utils/fmgr/funcapi.c:1975 +#: utils/fmgr/funcapi.c:1921 utils/fmgr/funcapi.c:1953 #, c-format msgid "number of aliases does not match number of columns" msgstr "le nombre d'alias ne correspond pas au nombre de colonnes" -#: utils/fmgr/funcapi.c:1969 +#: utils/fmgr/funcapi.c:1947 #, c-format msgid "no column alias was provided" msgstr "aucun alias de colonne n'a été fourni" -#: utils/fmgr/funcapi.c:1993 +#: utils/fmgr/funcapi.c:1971 #, c-format msgid "could not determine row description for function returning record" msgstr "" "n'a pas pu déterminer la description de la ligne pour la fonction renvoyant\n" "l'enregistrement" -#: utils/init/miscinit.c:329 +#: utils/init/miscinit.c:347 #, c-format msgid "data directory \"%s\" does not exist" msgstr "le répertoire des données « %s » n'existe pas" -#: utils/init/miscinit.c:334 +#: utils/init/miscinit.c:352 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "n'a pas pu lire les droits du répertoire « %s » : %m" -#: utils/init/miscinit.c:342 +#: utils/init/miscinit.c:360 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "le répertoire des données « %s » n'est pas un répertoire" -#: utils/init/miscinit.c:358 +#: utils/init/miscinit.c:376 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "le répertoire des données « %s » a un mauvais propriétaire" -#: utils/init/miscinit.c:360 +#: utils/init/miscinit.c:378 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "" "Le serveur doit être en cours d'exécution par l'utilisateur qui possède le\n" "répertoire des données." -#: utils/init/miscinit.c:378 +#: utils/init/miscinit.c:396 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "le répertoire des données « %s » a des permissions non valides" -#: utils/init/miscinit.c:380 +#: utils/init/miscinit.c:398 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Les droits devraient être u=rwx (0700) ou u=rwx,g=rx (0750)." -#: utils/init/miscinit.c:665 utils/misc/guc.c:7830 +#: utils/init/miscinit.c:456 +#, c-format +msgid "could not change directory to \"%s\": %m" +msgstr "n'a pas pu modifier le répertoire par « %s » : %m" + +#: utils/init/miscinit.c:693 utils/misc/guc.c:3548 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "" "ne peut pas configurer le paramètre « %s » à l'intérieur d'une fonction\n" "restreinte pour sécurité" -#: utils/init/miscinit.c:733 +#: utils/init/miscinit.c:765 #, c-format msgid "role with OID %u does not exist" msgstr "le rôle d'OID %u n'existe pas" -#: utils/init/miscinit.c:763 +#: utils/init/miscinit.c:795 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "le rôle « %s » n'est pas autorisé à se connecter" -#: utils/init/miscinit.c:781 +#: utils/init/miscinit.c:813 #, c-format msgid "too many connections for role \"%s\"" msgstr "trop de connexions pour le rôle « %s »" -#: utils/init/miscinit.c:841 +#: utils/init/miscinit.c:912 #, c-format msgid "permission denied to set session authorization" msgstr "droit refusé pour initialiser une autorisation de session" -#: utils/init/miscinit.c:924 +#: utils/init/miscinit.c:995 #, c-format msgid "invalid role OID: %u" msgstr "OID du rôle invalide : %u" -#: utils/init/miscinit.c:978 +#: utils/init/miscinit.c:1142 #, c-format msgid "database system is shut down" msgstr "le système de base de données est arrêté" -#: utils/init/miscinit.c:1065 +#: utils/init/miscinit.c:1229 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "n'a pas pu créer le fichier verrou « %s » : %m" -#: utils/init/miscinit.c:1079 +#: utils/init/miscinit.c:1243 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier verrou « %s » : %m" -#: utils/init/miscinit.c:1086 +#: utils/init/miscinit.c:1250 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "n'a pas pu lire le fichier verrou « %s » : %m" -#: utils/init/miscinit.c:1095 +#: utils/init/miscinit.c:1259 #, c-format msgid "lock file \"%s\" is empty" msgstr "le fichier verrou « %s » est vide" -#: utils/init/miscinit.c:1096 +#: utils/init/miscinit.c:1260 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." msgstr "Soit un autre serveur est en cours de démarrage, soit le fichier verrou est un reste d'un précédent crash au démarrage du serveur." -#: utils/init/miscinit.c:1140 +#: utils/init/miscinit.c:1304 #, c-format msgid "lock file \"%s\" already exists" msgstr "le fichier verrou « %s » existe déjà" -#: utils/init/miscinit.c:1144 +#: utils/init/miscinit.c:1308 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "" "Un autre postgres (de PID %d) est-il déjà lancé avec comme répertoire de\n" "données « %s » ?" -#: utils/init/miscinit.c:1146 +#: utils/init/miscinit.c:1310 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "" "Un autre postmaster (de PID %d) est-il déjà lancé avec comme répertoire de\n" "données « %s » ?" -#: utils/init/miscinit.c:1149 +#: utils/init/miscinit.c:1313 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Un autre postgres (de PID %d) est-il déjà lancé en utilisant la socket « %s » ?" -#: utils/init/miscinit.c:1151 +#: utils/init/miscinit.c:1315 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Un autre postmaster (de PID %d) est-il déjà lancé en utilisant la socket « %s » ?" -#: utils/init/miscinit.c:1202 +#: utils/init/miscinit.c:1366 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "n'a pas pu supprimer le vieux fichier verrou « %s » : %m" -#: utils/init/miscinit.c:1204 +#: utils/init/miscinit.c:1368 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." msgstr "" "Le fichier semble avoir été oublié accidentellement mais il ne peut pas être\n" "supprimé. Merci de supprimer ce fichier manuellement et de ré-essayer." -#: utils/init/miscinit.c:1241 utils/init/miscinit.c:1255 -#: utils/init/miscinit.c:1266 +#: utils/init/miscinit.c:1405 utils/init/miscinit.c:1419 +#: utils/init/miscinit.c:1430 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "n'a pas pu écrire le fichier verrou « %s » : %m" -#: utils/init/miscinit.c:1377 utils/init/miscinit.c:1519 utils/misc/guc.c:10827 +#: utils/init/miscinit.c:1541 utils/init/miscinit.c:1683 utils/misc/guc.c:5580 #, c-format msgid "could not read from file \"%s\": %m" msgstr "n'a pas pu lire à partir du fichier « %s » : %m" -#: utils/init/miscinit.c:1507 +#: utils/init/miscinit.c:1671 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "n'a pas pu ouvrir le fichier « %s » : %m ; poursuite du traitement" -#: utils/init/miscinit.c:1532 +#: utils/init/miscinit.c:1696 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "le fichier de verrou « %s » contient le mauvais PID : %ld au lieu de %ld" -#: utils/init/miscinit.c:1571 utils/init/miscinit.c:1587 +#: utils/init/miscinit.c:1735 utils/init/miscinit.c:1751 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "« %s » n'est pas un répertoire de données valide" -#: utils/init/miscinit.c:1573 +#: utils/init/miscinit.c:1737 #, c-format msgid "File \"%s\" is missing." msgstr "Le fichier « %s » est manquant." -#: utils/init/miscinit.c:1589 +#: utils/init/miscinit.c:1753 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Le fichier « %s » ne contient aucune donnée valide." -#: utils/init/miscinit.c:1591 +#: utils/init/miscinit.c:1755 #, c-format msgid "You might need to initdb." msgstr "Vous pouvez avoir besoin d'exécuter initdb." -#: utils/init/miscinit.c:1599 +#: utils/init/miscinit.c:1763 #, c-format msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." msgstr "" "Le répertoire des données a été initialisé avec PostgreSQL version %s,\n" "qui est non compatible avec cette version %s." -#: utils/init/postinit.c:258 +#: utils/init/postinit.c:259 #, c-format msgid "replication connection authorized: user=%s" msgstr "connexion de réplication autorisée : utilisateur=%s" -#: utils/init/postinit.c:261 +#: utils/init/postinit.c:262 #, c-format msgid "connection authorized: user=%s" msgstr "connexion autorisée : utilisateur=%s" -#: utils/init/postinit.c:264 +#: utils/init/postinit.c:265 #, c-format msgid " database=%s" msgstr " base de données %s" -#: utils/init/postinit.c:267 +#: utils/init/postinit.c:268 #, c-format msgid " application_name=%s" msgstr " application_name=%s" -#: utils/init/postinit.c:272 +#: utils/init/postinit.c:273 #, c-format msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" msgstr " SSL activé (protocole : %s, chiffrement : %s, bits : %d)" -#: utils/init/postinit.c:284 -#, c-format -msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" +#: utils/init/postinit.c:285 +#, fuzzy, c-format +#| msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s, principal=%s)" msgstr " GSS (authentifié=%s, chiffré=%s, principal=%s)" -#: utils/init/postinit.c:285 utils/init/postinit.c:286 -#: utils/init/postinit.c:291 utils/init/postinit.c:292 +#: utils/init/postinit.c:286 utils/init/postinit.c:287 +#: utils/init/postinit.c:288 utils/init/postinit.c:293 +#: utils/init/postinit.c:294 utils/init/postinit.c:295 msgid "no" msgstr "non" -#: utils/init/postinit.c:285 utils/init/postinit.c:286 -#: utils/init/postinit.c:291 utils/init/postinit.c:292 +#: utils/init/postinit.c:286 utils/init/postinit.c:287 +#: utils/init/postinit.c:288 utils/init/postinit.c:293 +#: utils/init/postinit.c:294 utils/init/postinit.c:295 msgid "yes" msgstr "oui" -#: utils/init/postinit.c:290 -#, c-format -msgid " GSS (authenticated=%s, encrypted=%s)" -msgstr " GSS (authentifié=%s, chiffré=%s)" +#: utils/init/postinit.c:292 +#, fuzzy, c-format +#| msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)" +msgstr " GSS (authentifié=%s, chiffré=%s, principal=%s)" -#: utils/init/postinit.c:330 +#: utils/init/postinit.c:333 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "la base de données « %s » a disparu de pg_database" -#: utils/init/postinit.c:332 +#: utils/init/postinit.c:335 #, c-format msgid "Database OID %u now seems to belong to \"%s\"." msgstr "La base de données d'OID %u semble maintenant appartenir à « %s »." -#: utils/init/postinit.c:352 +#: utils/init/postinit.c:355 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "la base de données « %s » n'accepte plus les connexions" -#: utils/init/postinit.c:365 +#: utils/init/postinit.c:368 #, c-format msgid "permission denied for database \"%s\"" msgstr "droit refusé pour la base de données « %s »" -#: utils/init/postinit.c:366 +#: utils/init/postinit.c:369 #, c-format msgid "User does not have CONNECT privilege." msgstr "L'utilisateur n'a pas le droit CONNECT." -#: utils/init/postinit.c:383 +#: utils/init/postinit.c:386 #, c-format msgid "too many connections for database \"%s\"" msgstr "trop de connexions pour la base de données « %s »" -#: utils/init/postinit.c:409 utils/init/postinit.c:416 +#: utils/init/postinit.c:410 utils/init/postinit.c:417 #, c-format msgid "database locale is incompatible with operating system" msgstr "la locale de la base de données est incompatible avec le système d'exploitation" -#: utils/init/postinit.c:410 +#: utils/init/postinit.c:411 #, c-format msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." msgstr "" "La base de données a été initialisée avec un LC_COLLATE à « %s »,\n" "qui n'est pas reconnu par setlocale()." -#: utils/init/postinit.c:412 utils/init/postinit.c:419 +#: utils/init/postinit.c:413 utils/init/postinit.c:420 #, c-format msgid "Recreate the database with another locale or install the missing locale." msgstr "" "Recréez la base de données avec une autre locale ou installez la locale\n" "manquante." -#: utils/init/postinit.c:417 +#: utils/init/postinit.c:418 #, c-format msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." msgstr "" "La base de données a été initialisée avec un LC_CTYPE à « %s »,\n" "qui n'est pas reconnu par setlocale()." -#: utils/init/postinit.c:462 +#: utils/init/postinit.c:475 #, fuzzy, c-format #| msgid "collation \"%s\" has version mismatch" msgid "database \"%s\" has a collation version mismatch" msgstr "le collationnement « %s » a des versions différentes" -#: utils/init/postinit.c:464 +#: utils/init/postinit.c:477 #, fuzzy, c-format #| msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgid "The database was created using collation version %s, but the operating system provides version %s." msgstr "Le collationnement dans la base de données a été créé en utilisant la version %s mais le système d'exploitation fournit la version %s." -#: utils/init/postinit.c:467 +#: utils/init/postinit.c:480 #, fuzzy, c-format #| msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." msgstr "Reconstruisez tous les objets affectés par ce collationnement, et lancez ALTER COLLATION %s REFRESH VERSION, ou construisez PostgreSQL avec la bonne version de bibliothèque." -#: utils/init/postinit.c:835 +#: utils/init/postinit.c:891 #, c-format msgid "no roles are defined in this database system" msgstr "aucun rôle n'est défini dans le système de bases de données" -#: utils/init/postinit.c:836 +#: utils/init/postinit.c:892 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Vous devez immédiatement exécuter « CREATE USER \"%s\" CREATEUSER; »." -#: utils/init/postinit.c:868 +#: utils/init/postinit.c:928 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "doit être super-utilisateur pour se connecter en mode de mise à jour binaire" -#: utils/init/postinit.c:881 -#, c-format -msgid "remaining connection slots are reserved for non-replication superuser connections" +#: utils/init/postinit.c:949 +#, fuzzy, c-format +#| msgid "remaining connection slots are reserved for non-replication superuser connections" +msgid "remaining connection slots are reserved for roles with the %s attribute" msgstr "" "les emplacements de connexions restants sont réservés pour les connexions\n" "superutilisateur non relatif à la réplication" -#: utils/init/postinit.c:891 -#, c-format -msgid "must be superuser or replication role to start walsender" +#: utils/init/postinit.c:955 +#, fuzzy, c-format +#| msgid "remaining connection slots are reserved for non-replication superuser connections" +msgid "remaining connection slots are reserved for roles with privileges of the \"%s\" role" msgstr "" -"doit être un superutilisateur ou un rôle ayant l'attribut de réplication\n" -"pour exécuter walsender" +"les emplacements de connexions restants sont réservés pour les connexions\n" +"superutilisateur non relatif à la réplication" + +#: utils/init/postinit.c:967 +#, fuzzy, c-format +#| msgid "permission denied to rename role" +msgid "permission denied to start WAL sender" +msgstr "droit refusé pour renommer le rôle" -#: utils/init/postinit.c:960 +#: utils/init/postinit.c:968 #, c-format -msgid "database %u does not exist" -msgstr "la base de données « %u » n'existe pas" +msgid "Only roles with the %s attribute may start a WAL sender process." +msgstr "" -#: utils/init/postinit.c:1049 +#: utils/init/postinit.c:1086 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Cet objet semble avoir été tout juste supprimé ou renommé." -#: utils/init/postinit.c:1067 +#: utils/init/postinit.c:1090 +#, c-format +msgid "database %u does not exist" +msgstr "la base de données « %u » n'existe pas" + +#: utils/init/postinit.c:1099 +#, fuzzy, c-format +#| msgid "could not connect to database \"%s\"" +msgid "cannot connect to invalid database \"%s\"" +msgstr "n'a pas pu se connecter à la base de données « %s »" + +#: utils/init/postinit.c:1159 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Le sous-répertoire de la base de données « %s » est manquant." +#: utils/init/usercontext.c:43 +#, fuzzy, c-format +#| msgid "\"%s\" cannot be higher than \"%s\"" +msgid "role \"%s\" cannot SET ROLE to \"%s\"" +msgstr "« %s » ne peut pas être supérieur à « %s »" + #: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" @@ -27646,388 +28321,654 @@ msgstr "identifiant d'encodage %d inattendu pour les jeux de caractères ISO-885 msgid "unexpected encoding ID %d for WIN character sets" msgstr "identifiant d'encodage %d inattendu pour les jeux de caractères WIN" -#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:900 +#: utils/mb/mbutils.c:298 utils/mb/mbutils.c:901 #, c-format msgid "conversion between %s and %s is not supported" msgstr "la conversion entre %s et %s n'est pas supportée" -#: utils/mb/mbutils.c:385 -#, c-format -msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" -msgstr "" -"la fonction de conversion par défaut pour l'encodage de « %s » en « %s »\n" -"n'existe pas" - -#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 -#: utils/mb/mbutils.c:842 +#: utils/mb/mbutils.c:403 utils/mb/mbutils.c:431 utils/mb/mbutils.c:816 +#: utils/mb/mbutils.c:843 #, c-format msgid "String of %d bytes is too long for encoding conversion." msgstr "Une chaîne de %d octets est trop longue pour la conversion d'encodage." -#: utils/mb/mbutils.c:568 +#: utils/mb/mbutils.c:569 #, c-format msgid "invalid source encoding name \"%s\"" msgstr "nom de l'encodage source « %s » invalide" -#: utils/mb/mbutils.c:573 +#: utils/mb/mbutils.c:574 #, c-format msgid "invalid destination encoding name \"%s\"" msgstr "nom de l'encodage destination « %s » invalide" -#: utils/mb/mbutils.c:713 +#: utils/mb/mbutils.c:714 #, c-format msgid "invalid byte value for encoding \"%s\": 0x%02x" msgstr "valeur d'octet invalide pour l'encodage « %s » : 0x%02x" -#: utils/mb/mbutils.c:877 +#: utils/mb/mbutils.c:878 #, c-format msgid "invalid Unicode code point" msgstr "point code Unicode invalide" -#: utils/mb/mbutils.c:1146 +#: utils/mb/mbutils.c:1204 #, c-format msgid "bind_textdomain_codeset failed" msgstr "échec de bind_textdomain_codeset" -#: utils/mb/mbutils.c:1667 +#: utils/mb/mbutils.c:1725 #, c-format msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "séquence d'octets invalide pour l'encodage « %s » : %s" -#: utils/mb/mbutils.c:1700 +#: utils/mb/mbutils.c:1758 #, c-format msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "" "le caractère dont la séquence d'octets est %s dans l'encodage « %s » n'a pas\n" "d'équivalent dans l'encodage « %s »" -#: utils/misc/guc.c:776 -msgid "Ungrouped" -msgstr "Dégroupé" - -#: utils/misc/guc.c:778 -msgid "File Locations" -msgstr "Emplacement des fichiers" +#: utils/misc/conffiles.c:88 +#, c-format +msgid "empty configuration directory name: \"%s\"" +msgstr "nom de répertoire de configuration vide : « %s »" -#: utils/misc/guc.c:780 -msgid "Connections and Authentication / Connection Settings" -msgstr "Connexions et authentification / Paramétrages de connexion" +#: utils/misc/conffiles.c:100 +#, c-format +msgid "could not open configuration directory \"%s\": %m" +msgstr "n'a pas pu ouvrir le répertoire de configuration « %s » : %m" -#: utils/misc/guc.c:782 -msgid "Connections and Authentication / Authentication" -msgstr "Connexions et authentification / Authentification" +#: utils/misc/guc.c:115 +msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." +msgstr "Les unités valides pour ce paramètre sont « B », « kB », « MB », « GB » et « TB »." -#: utils/misc/guc.c:784 -msgid "Connections and Authentication / SSL" -msgstr "Connexions et authentification / SSL" +#: utils/misc/guc.c:152 +msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." +msgstr "Les unités valides pour ce paramètre sont «us », « ms », « s », « min », « h » et « d »." -#: utils/misc/guc.c:786 -msgid "Resource Usage / Memory" -msgstr "Utilisation des ressources / Mémoire" +#: utils/misc/guc.c:421 +#, c-format +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "paramètre de configuration « %s » non reconnu dans le fichier « %s », ligne %d" -#: utils/misc/guc.c:788 -msgid "Resource Usage / Disk" -msgstr "Utilisation des ressources / Disques" +#: utils/misc/guc.c:461 utils/misc/guc.c:3406 utils/misc/guc.c:3646 +#: utils/misc/guc.c:3744 utils/misc/guc.c:3842 utils/misc/guc.c:3966 +#: utils/misc/guc.c:4069 +#, c-format +msgid "parameter \"%s\" cannot be changed without restarting the server" +msgstr "le paramètre « %s » ne peut pas être modifié sans redémarrer le serveur" -#: utils/misc/guc.c:790 -msgid "Resource Usage / Kernel Resources" -msgstr "Utilisation des ressources / Ressources noyau" +#: utils/misc/guc.c:497 +#, c-format +msgid "parameter \"%s\" removed from configuration file, reset to default" +msgstr "" +"paramètre « %s » supprimé du fichier de configuration ;\n" +"réinitialisation à la valeur par défaut" -#: utils/misc/guc.c:792 -msgid "Resource Usage / Cost-Based Vacuum Delay" -msgstr "Utilisation des ressources / Délai du VACUUM basé sur le coût" +#: utils/misc/guc.c:562 +#, c-format +msgid "parameter \"%s\" changed to \"%s\"" +msgstr "paramètre « %s » modifié par « %s »" -#: utils/misc/guc.c:794 -msgid "Resource Usage / Background Writer" -msgstr "Utilisation des ressources / Processus d'écriture en tâche de fond" +#: utils/misc/guc.c:604 +#, c-format +msgid "configuration file \"%s\" contains errors" +msgstr "le fichier de configuration « %s » contient des erreurs" -#: utils/misc/guc.c:796 -msgid "Resource Usage / Asynchronous Behavior" -msgstr "Utilisation des ressources / Comportement asynchrone" +#: utils/misc/guc.c:609 +#, c-format +msgid "configuration file \"%s\" contains errors; unaffected changes were applied" +msgstr "le fichier de configuration « %s » contient des erreurs ; les modifications non affectées ont été appliquées" -#: utils/misc/guc.c:798 -msgid "Write-Ahead Log / Settings" +#: utils/misc/guc.c:614 +#, c-format +msgid "configuration file \"%s\" contains errors; no changes were applied" +msgstr "le fichier de configuration « %s » contient des erreurs ; aucune modification n'a été appliquée" + +#: utils/misc/guc.c:1211 utils/misc/guc.c:1227 +#, c-format +msgid "invalid configuration parameter name \"%s\"" +msgstr "paramètre de configuration « %s » invalide" + +#: utils/misc/guc.c:1213 +#, c-format +msgid "Custom parameter names must be two or more simple identifiers separated by dots." +msgstr "Les noms de paramètres personnalisés doivent avoir deux ou plusieurs identifiants simples séparés par des points." + +#: utils/misc/guc.c:1229 +#, fuzzy, c-format +#| msgid "\"%s\" is a procedure." +msgid "\"%s\" is a reserved prefix." +msgstr "« %s » est une procédure." + +#: utils/misc/guc.c:1243 +#, c-format +msgid "unrecognized configuration parameter \"%s\"" +msgstr "paramètre de configuration « %s » non reconnu" + +#: utils/misc/guc.c:1765 +#, c-format +msgid "%s: could not access directory \"%s\": %s\n" +msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n" + +#: utils/misc/guc.c:1770 +#, c-format +msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" +msgstr "Lancer initdb ou pg_basebackup pour initialiser un répertoire de données PostgreSQL.\n" + +#: utils/misc/guc.c:1794 +#, c-format +msgid "" +"%s does not know where to find the server configuration file.\n" +"You must specify the --config-file or -D invocation option or set the PGDATA environment variable.\n" +msgstr "" +"%s ne sait pas où trouver le fichier de configuration du serveur.\n" +"Vous devez soit spécifier l'option --config-file, soit spécifier l'option -D, soit initialiser la variable d'environnement PGDATA.\n" + +#: utils/misc/guc.c:1817 +#, c-format +msgid "%s: could not access the server configuration file \"%s\": %s\n" +msgstr "%s : n'a pas pu accéder au fichier de configuration « %s » : %s\n" + +#: utils/misc/guc.c:1845 +#, c-format +msgid "" +"%s does not know where to find the database system data.\n" +"This can be specified as \"data_directory\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "" +"%s ne sait pas où trouver les données du système de bases de données.\n" +"Il est configurable avec « data_directory » dans « %s » ou avec l'option -D ou encore avec la variable d'environnement PGDATA.\n" + +#: utils/misc/guc.c:1897 +#, c-format +msgid "" +"%s does not know where to find the \"hba\" configuration file.\n" +"This can be specified as \"hba_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "" +"%s ne sait pas où trouver le fichier de configuration « hba ».\n" +"Il est configurable avec « hba_file » dans « %s » ou avec l'option -D ou encore avec la variable d'environnement PGDATA.\n" + +#: utils/misc/guc.c:1928 +#, c-format +msgid "" +"%s does not know where to find the \"ident\" configuration file.\n" +"This can be specified as \"ident_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "" +"%s ne sait pas où trouver le fichier de configuration « hba ».\n" +"Il est configurable avec « ident_file » dans « %s » ou avec l'option -D ou encore avec la variable d'environnement PGDATA.\n" + +#: utils/misc/guc.c:2894 +msgid "Value exceeds integer range." +msgstr "La valeur dépasse l'échelle des entiers." + +#: utils/misc/guc.c:3130 +#, c-format +msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "%d%s%s est en dehors des limites valides pour le paramètre « %s » (%d .. %d)" + +#: utils/misc/guc.c:3166 +#, c-format +msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" +msgstr "%g%s%s est en dehors des limites valides pour le paramètre « %s » (%g .. %g)" + +#: utils/misc/guc.c:3366 utils/misc/guc_funcs.c:54 +#, c-format +msgid "cannot set parameters during a parallel operation" +msgstr "ne peut pas configurer les paramètres lors d'une opération parallèle" + +#: utils/misc/guc.c:3383 utils/misc/guc.c:4530 +#, c-format +msgid "parameter \"%s\" cannot be changed" +msgstr "le paramètre « %s » ne peut pas être changé" + +#: utils/misc/guc.c:3416 +#, c-format +msgid "parameter \"%s\" cannot be changed now" +msgstr "le paramètre « %s » ne peut pas être modifié maintenant" + +#: utils/misc/guc.c:3443 utils/misc/guc.c:3501 utils/misc/guc.c:4506 +#: utils/misc/guc.c:6546 +#, c-format +msgid "permission denied to set parameter \"%s\"" +msgstr "droit refusé pour initialiser le paramètre « %s »" + +#: utils/misc/guc.c:3481 +#, c-format +msgid "parameter \"%s\" cannot be set after connection start" +msgstr "le paramètre « %s » ne peut pas être initialisé après le lancement du serveur" + +#: utils/misc/guc.c:3540 +#, c-format +msgid "cannot set parameter \"%s\" within security-definer function" +msgstr "" +"ne peut pas configurer le paramètre « %s » à l'intérieur d'une fonction\n" +"SECURITY DEFINER" + +#: utils/misc/guc.c:3561 +#, fuzzy, c-format +#| msgid "parameter \"%s\" could not be set" +msgid "parameter \"%s\" cannot be reset" +msgstr "le paramètre « %s » n'a pas pu être configuré" + +#: utils/misc/guc.c:3568 +#, fuzzy, c-format +#| msgid "parameter \"%s\" cannot be set after connection start" +msgid "parameter \"%s\" cannot be set locally in functions" +msgstr "le paramètre « %s » ne peut pas être initialisé après le lancement du serveur" + +#: utils/misc/guc.c:4212 utils/misc/guc.c:4259 utils/misc/guc.c:5266 +#, fuzzy, c-format +#| msgid "permission denied to create \"%s.%s\"" +msgid "permission denied to examine \"%s\"" +msgstr "droit refusé pour créer « %s.%s »" + +#: utils/misc/guc.c:4213 utils/misc/guc.c:4260 utils/misc/guc.c:5267 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may examine this parameter." +msgstr "" + +#: utils/misc/guc.c:4496 +#, fuzzy, c-format +#| msgid "permission denied for operator %s" +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "droit refusé pour l'opérateur %s" + +#: utils/misc/guc.c:4562 +#, c-format +msgid "parameter value for ALTER SYSTEM must not contain a newline" +msgstr "la valeur du paramètre pour ALTER SYSTEM ne doit pas contenir de caractère de retour à la ligne" + +#: utils/misc/guc.c:4608 +#, c-format +msgid "could not parse contents of file \"%s\"" +msgstr "n'a pas pu analyser le contenu du fichier « %s »" + +#: utils/misc/guc.c:4790 +#, c-format +msgid "attempt to redefine parameter \"%s\"" +msgstr "tentative de redéfinition du paramètre « %s »" + +#: utils/misc/guc.c:5129 +#, fuzzy, c-format +#| msgid "invalid configuration parameter name \"%s\"" +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "paramètre de configuration « %s » invalide" + +#: utils/misc/guc.c:5131 +#, fuzzy, c-format +#| msgid "\"%s\" is not a regular file" +msgid "\"%s\" is now a reserved prefix." +msgstr "« %s » n'est pas un fichier standard" + +#: utils/misc/guc.c:6000 +#, c-format +msgid "while setting parameter \"%s\" to \"%s\"" +msgstr "lors de la configuration du paramètre « %s » en « %s »" + +#: utils/misc/guc.c:6169 +#, c-format +msgid "parameter \"%s\" could not be set" +msgstr "le paramètre « %s » n'a pas pu être configuré" + +#: utils/misc/guc.c:6259 +#, c-format +msgid "could not parse setting for parameter \"%s\"" +msgstr "n'a pas pu analyser la configuration du paramètre « %s »" + +#: utils/misc/guc.c:6678 +#, c-format +msgid "invalid value for parameter \"%s\": %g" +msgstr "valeur invalide pour le paramètre « %s » : %g" + +#: utils/misc/guc_funcs.c:130 +#, c-format +msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" +msgstr "SET LOCAL TRANSACTION SNAPSHOT n'est pas implémenté" + +#: utils/misc/guc_funcs.c:218 +#, c-format +msgid "SET %s takes only one argument" +msgstr "SET %s prend un seul argument" + +#: utils/misc/guc_funcs.c:342 +#, c-format +msgid "SET requires parameter name" +msgstr "SET requiert le nom du paramètre" + +#: utils/misc/guc_tables.c:662 +msgid "Ungrouped" +msgstr "Dégroupé" + +#: utils/misc/guc_tables.c:664 +msgid "File Locations" +msgstr "Emplacement des fichiers" + +#: utils/misc/guc_tables.c:666 +msgid "Connections and Authentication / Connection Settings" +msgstr "Connexions et authentification / Paramétrages de connexion" + +#: utils/misc/guc_tables.c:668 +#, fuzzy +#| msgid "Connections and Authentication / Connection Settings" +msgid "Connections and Authentication / TCP Settings" +msgstr "Connexions et authentification / Paramétrages de connexion" + +#: utils/misc/guc_tables.c:670 +msgid "Connections and Authentication / Authentication" +msgstr "Connexions et authentification / Authentification" + +#: utils/misc/guc_tables.c:672 +msgid "Connections and Authentication / SSL" +msgstr "Connexions et authentification / SSL" + +#: utils/misc/guc_tables.c:674 +msgid "Resource Usage / Memory" +msgstr "Utilisation des ressources / Mémoire" + +#: utils/misc/guc_tables.c:676 +msgid "Resource Usage / Disk" +msgstr "Utilisation des ressources / Disques" + +#: utils/misc/guc_tables.c:678 +msgid "Resource Usage / Kernel Resources" +msgstr "Utilisation des ressources / Ressources noyau" + +#: utils/misc/guc_tables.c:680 +msgid "Resource Usage / Cost-Based Vacuum Delay" +msgstr "Utilisation des ressources / Délai du VACUUM basé sur le coût" + +#: utils/misc/guc_tables.c:682 +msgid "Resource Usage / Background Writer" +msgstr "Utilisation des ressources / Processus d'écriture en tâche de fond" + +#: utils/misc/guc_tables.c:684 +msgid "Resource Usage / Asynchronous Behavior" +msgstr "Utilisation des ressources / Comportement asynchrone" + +#: utils/misc/guc_tables.c:686 +msgid "Write-Ahead Log / Settings" msgstr "Write-Ahead Log / Paramétrages" -#: utils/misc/guc.c:800 +#: utils/misc/guc_tables.c:688 msgid "Write-Ahead Log / Checkpoints" msgstr "Write-Ahead Log / Points de vérification (Checkpoints)" -#: utils/misc/guc.c:802 +#: utils/misc/guc_tables.c:690 msgid "Write-Ahead Log / Archiving" msgstr "Write-Ahead Log / Archivage" -#: utils/misc/guc.c:804 +#: utils/misc/guc_tables.c:692 #, fuzzy #| msgid "Write-Ahead Log / Recovery Target" msgid "Write-Ahead Log / Recovery" msgstr "Write-Ahead Log / Cible de restauration" -#: utils/misc/guc.c:806 +#: utils/misc/guc_tables.c:694 msgid "Write-Ahead Log / Archive Recovery" msgstr "Write-Ahead Log / Restauration d'archive" -#: utils/misc/guc.c:808 +#: utils/misc/guc_tables.c:696 msgid "Write-Ahead Log / Recovery Target" msgstr "Write-Ahead Log / Cible de restauration" -#: utils/misc/guc.c:810 +#: utils/misc/guc_tables.c:698 msgid "Replication / Sending Servers" msgstr "Réplication / Serveurs d'envoi" -#: utils/misc/guc.c:812 +#: utils/misc/guc_tables.c:700 msgid "Replication / Primary Server" msgstr "Réplication / Serveur primaire" -#: utils/misc/guc.c:814 +#: utils/misc/guc_tables.c:702 msgid "Replication / Standby Servers" msgstr "Réplication / Serveurs en attente" -#: utils/misc/guc.c:816 +#: utils/misc/guc_tables.c:704 msgid "Replication / Subscribers" msgstr "Réplication / Abonnés" -#: utils/misc/guc.c:818 +#: utils/misc/guc_tables.c:706 msgid "Query Tuning / Planner Method Configuration" msgstr "Optimisation des requêtes / Configuration de la méthode du planificateur" -#: utils/misc/guc.c:820 +#: utils/misc/guc_tables.c:708 msgid "Query Tuning / Planner Cost Constants" msgstr "Optimisation des requêtes / Constantes des coûts du planificateur" -#: utils/misc/guc.c:822 +#: utils/misc/guc_tables.c:710 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Optimisation des requêtes / Optimiseur génétique de requêtes" -#: utils/misc/guc.c:824 +#: utils/misc/guc_tables.c:712 msgid "Query Tuning / Other Planner Options" msgstr "Optimisation des requêtes / Autres options du planificateur" -#: utils/misc/guc.c:826 +#: utils/misc/guc_tables.c:714 msgid "Reporting and Logging / Where to Log" msgstr "Rapports et traces / Où tracer" -#: utils/misc/guc.c:828 +#: utils/misc/guc_tables.c:716 msgid "Reporting and Logging / When to Log" msgstr "Rapports et traces / Quand tracer" -#: utils/misc/guc.c:830 +#: utils/misc/guc_tables.c:718 msgid "Reporting and Logging / What to Log" msgstr "Rapports et traces / Que tracer" -#: utils/misc/guc.c:832 +#: utils/misc/guc_tables.c:720 msgid "Reporting and Logging / Process Title" msgstr "Rapports et traces / Titre du processus" -#: utils/misc/guc.c:834 +#: utils/misc/guc_tables.c:722 msgid "Statistics / Monitoring" msgstr "Statistiques / Surveillance" -#: utils/misc/guc.c:836 +#: utils/misc/guc_tables.c:724 #, fuzzy #| msgid "Statistics / Query and Index Statistics Collector" msgid "Statistics / Cumulative Query and Index Statistics" msgstr "Statistiques / Récupérateur des statistiques sur les requêtes et sur les index" -#: utils/misc/guc.c:838 +#: utils/misc/guc_tables.c:726 msgid "Autovacuum" msgstr "Autovacuum" -#: utils/misc/guc.c:840 +#: utils/misc/guc_tables.c:728 msgid "Client Connection Defaults / Statement Behavior" msgstr "Valeurs par défaut pour les connexions client / Comportement des instructions" -#: utils/misc/guc.c:842 +#: utils/misc/guc_tables.c:730 msgid "Client Connection Defaults / Locale and Formatting" -msgstr "Valeurs par défaut pour les connexions client / Locale et formattage" +msgstr "Valeurs par défaut pour les connexions client / Locale et formatage" -#: utils/misc/guc.c:844 +#: utils/misc/guc_tables.c:732 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Valeurs par défaut pour les connexions des clients / Préchargement des bibliothèques partagées" -#: utils/misc/guc.c:846 +#: utils/misc/guc_tables.c:734 msgid "Client Connection Defaults / Other Defaults" msgstr "Valeurs par défaut pour les connexions client / Autres valeurs par défaut" -#: utils/misc/guc.c:848 +#: utils/misc/guc_tables.c:736 msgid "Lock Management" msgstr "Gestion des verrous" -#: utils/misc/guc.c:850 +#: utils/misc/guc_tables.c:738 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Compatibilité des versions et des plateformes / Anciennes versions de PostgreSQL" -#: utils/misc/guc.c:852 +#: utils/misc/guc_tables.c:740 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Compatibilité des versions et des plateformes / Anciennes plateformes et anciens clients" -#: utils/misc/guc.c:854 +#: utils/misc/guc_tables.c:742 msgid "Error Handling" msgstr "Gestion des erreurs" -#: utils/misc/guc.c:856 +#: utils/misc/guc_tables.c:744 msgid "Preset Options" msgstr "Options pré-configurées" -#: utils/misc/guc.c:858 +#: utils/misc/guc_tables.c:746 msgid "Customized Options" msgstr "Options personnalisées" -#: utils/misc/guc.c:860 +#: utils/misc/guc_tables.c:748 msgid "Developer Options" msgstr "Options pour le développeur" -#: utils/misc/guc.c:918 -msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." -msgstr "Les unités valides pour ce paramètre sont « B », « kB », « MB », « GB » et « TB »." - -#: utils/misc/guc.c:955 -msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." -msgstr "Les unités valides pour ce paramètre sont «us », « ms », « s », « min », « h » et « d »." - -#: utils/misc/guc.c:1017 +#: utils/misc/guc_tables.c:805 msgid "Enables the planner's use of sequential-scan plans." msgstr "Active l'utilisation des parcours séquentiels par le planificateur." -#: utils/misc/guc.c:1027 +#: utils/misc/guc_tables.c:815 msgid "Enables the planner's use of index-scan plans." msgstr "Active l'utilisation des parcours d'index par le planificateur." -#: utils/misc/guc.c:1037 +#: utils/misc/guc_tables.c:825 msgid "Enables the planner's use of index-only-scan plans." msgstr "Active l'utilisation des parcours d'index seul par le planificateur." -#: utils/misc/guc.c:1047 +#: utils/misc/guc_tables.c:835 msgid "Enables the planner's use of bitmap-scan plans." msgstr "Active l'utilisation des parcours de bitmap par le planificateur." -#: utils/misc/guc.c:1057 +#: utils/misc/guc_tables.c:845 msgid "Enables the planner's use of TID scan plans." msgstr "Active l'utilisation de plans de parcours TID par le planificateur." -#: utils/misc/guc.c:1067 +#: utils/misc/guc_tables.c:855 msgid "Enables the planner's use of explicit sort steps." msgstr "Active l'utilisation des étapes de tris explicites par le planificateur." -#: utils/misc/guc.c:1077 +#: utils/misc/guc_tables.c:865 msgid "Enables the planner's use of incremental sort steps." msgstr "Active l'utilisation des étapes de tris incrémentaux par le planificateur." -#: utils/misc/guc.c:1087 +#: utils/misc/guc_tables.c:875 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Active l'utilisation de plans d'agrégats hachés par le planificateur." -#: utils/misc/guc.c:1097 +#: utils/misc/guc_tables.c:885 msgid "Enables the planner's use of materialization." msgstr "Active l'utilisation de la matérialisation par le planificateur." -#: utils/misc/guc.c:1107 +#: utils/misc/guc_tables.c:895 msgid "Enables the planner's use of memoization." msgstr "Active l'utilisation de la mémorisation par le planificateur." -#: utils/misc/guc.c:1117 +#: utils/misc/guc_tables.c:905 msgid "Enables the planner's use of nested-loop join plans." msgstr "Active l'utilisation de plans avec des jointures imbriquées par le planificateur." -#: utils/misc/guc.c:1127 +#: utils/misc/guc_tables.c:915 msgid "Enables the planner's use of merge join plans." msgstr "Active l'utilisation de plans de jointures MERGE par le planificateur." -#: utils/misc/guc.c:1137 +#: utils/misc/guc_tables.c:925 msgid "Enables the planner's use of hash join plans." msgstr "Active l'utilisation de plans de jointures hachées par le planificateur." -#: utils/misc/guc.c:1147 +#: utils/misc/guc_tables.c:935 msgid "Enables the planner's use of gather merge plans." msgstr "Active l'utilisation de plans GATHER MERGE par le planificateur." -#: utils/misc/guc.c:1157 +#: utils/misc/guc_tables.c:945 msgid "Enables partitionwise join." msgstr "Active l'utilisation de jointures entre partitions." -#: utils/misc/guc.c:1167 +#: utils/misc/guc_tables.c:955 msgid "Enables partitionwise aggregation and grouping." msgstr "Active les agrégations et regroupements par partition." -#: utils/misc/guc.c:1177 +#: utils/misc/guc_tables.c:965 msgid "Enables the planner's use of parallel append plans." msgstr "Active l'utilisation de plans Append parallèles par le planificateur." -#: utils/misc/guc.c:1187 +#: utils/misc/guc_tables.c:975 msgid "Enables the planner's use of parallel hash plans." msgstr "Active l'utilisation de plans de jointures hachées parallèles par le planificateur." -#: utils/misc/guc.c:1197 +#: utils/misc/guc_tables.c:985 msgid "Enables plan-time and execution-time partition pruning." msgstr "Active l'élagage de partition durant la planification et l'exécution." -#: utils/misc/guc.c:1198 +#: utils/misc/guc_tables.c:986 msgid "Allows the query planner and executor to compare partition bounds to conditions in the query to determine which partitions must be scanned." msgstr "Autorise le planificateur de requête et l'exécuteur à comparer les limites des partitions avec les conditions des requêtes pour déterminer les partitions à parcourir." -#: utils/misc/guc.c:1209 +#: utils/misc/guc_tables.c:997 +msgid "Enables the planner's ability to produce plans that provide presorted input for ORDER BY / DISTINCT aggregate functions." +msgstr "" + +#: utils/misc/guc_tables.c:1000 +msgid "Allows the query planner to build plans that provide presorted input for aggregate functions with an ORDER BY / DISTINCT clause. When disabled, implicit sorts are always performed during execution." +msgstr "" + +#: utils/misc/guc_tables.c:1012 msgid "Enables the planner's use of async append plans." msgstr "Active l'utilisation de plans Append asynchrones par le planificateur." -#: utils/misc/guc.c:1219 +#: utils/misc/guc_tables.c:1022 msgid "Enables genetic query optimization." msgstr "Active l'optimisation génétique des requêtes." -#: utils/misc/guc.c:1220 +#: utils/misc/guc_tables.c:1023 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Cet algorithme essaie de faire une planification sans recherche exhaustive." -#: utils/misc/guc.c:1231 +#: utils/misc/guc_tables.c:1034 msgid "Shows whether the current user is a superuser." msgstr "Affiche si l'utilisateur actuel est un super-utilisateur." -#: utils/misc/guc.c:1241 +#: utils/misc/guc_tables.c:1044 msgid "Enables advertising the server via Bonjour." msgstr "Active la publication du serveur via Bonjour." -#: utils/misc/guc.c:1250 +#: utils/misc/guc_tables.c:1053 msgid "Collects transaction commit time." msgstr "Récupère l'horodatage de la validation de la transaction." -#: utils/misc/guc.c:1259 +#: utils/misc/guc_tables.c:1062 msgid "Enables SSL connections." msgstr "Active les connexions SSL." -#: utils/misc/guc.c:1268 +#: utils/misc/guc_tables.c:1071 #, fuzzy #| msgid "Also use ssl_passphrase_command during server reload." msgid "Controls whether ssl_passphrase_command is called during server reload." msgstr "Utilise également ssl_passphrase_command durant le rechargement du serveur." -#: utils/misc/guc.c:1277 +#: utils/misc/guc_tables.c:1080 msgid "Give priority to server ciphersuite order." msgstr "Donne la priorité à l'ordre des chiffrements du serveur." -#: utils/misc/guc.c:1286 +#: utils/misc/guc_tables.c:1089 msgid "Forces synchronization of updates to disk." msgstr "Force la synchronisation des mises à jour sur le disque." -#: utils/misc/guc.c:1287 -msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This insures that a database cluster will recover to a consistent state after an operating system or hardware crash." +#: utils/misc/guc_tables.c:1090 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "" "Le serveur utilisera l'appel système fsync() à différents endroits pour\n" "s'assurer que les mises à jour sont écrites physiquement sur le disque. Ceci\n" "nous assure qu'un groupe de bases de données se retrouvera dans un état\n" "cohérent après un arrêt brutal dû au système d'exploitation ou au matériel." -#: utils/misc/guc.c:1298 +#: utils/misc/guc_tables.c:1101 msgid "Continues processing after a checksum failure." msgstr "Continue le traitement après un échec de la somme de contrôle." -#: utils/misc/guc.c:1299 +#: utils/misc/guc_tables.c:1102 msgid "Detection of a checksum failure normally causes PostgreSQL to report an error, aborting the current transaction. Setting ignore_checksum_failure to true causes the system to ignore the failure (but still report a warning), and continue processing. This behavior could cause crashes or other serious problems. Only has an effect if checksums are enabled." msgstr "La détection d'une erreur de somme de contrôle a normalement pour effet de rapporter une erreur, annulant la transaction en cours. Régler ignore_checksum_failure à true permet au système d'ignorer cette erreur (mais rapporte toujours un avertissement), et continue le traitement. Ce comportement pourrait causer un arrêt brutal ou d'autres problèmes sérieux. Cela a un effet seulement si les sommes de contrôle (checksums) sont activés." -#: utils/misc/guc.c:1313 +#: utils/misc/guc_tables.c:1116 msgid "Continues processing past damaged page headers." msgstr "Continue le travail après les en-têtes de page endommagés." -#: utils/misc/guc.c:1314 +#: utils/misc/guc_tables.c:1117 msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting zero_damaged_pages to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." msgstr "" "La détection d'une en-tête de page endommagée cause normalement le rapport\n" @@ -28036,195 +28977,203 @@ msgstr "" "message d'attention et continue à travailler. Ce comportement détruira des\n" "données, notamment toutes les lignes de la page endommagée." -#: utils/misc/guc.c:1327 +#: utils/misc/guc_tables.c:1130 msgid "Continues recovery after an invalid pages failure." msgstr "Continue la restauration après un échec des pages invalides." -#: utils/misc/guc.c:1328 +#: utils/misc/guc_tables.c:1131 msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting ignore_invalid_pages to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." msgstr "La détection des enregistrements de journaux de transactions ayant des références à des blocs invalides lors de la restauration a pour effet que PostgreSQL lève une erreur de niveau PANIC, annulant la restauration. Configurer ignore_invalid_pages à true permet au système d'ignorer les références invalides de page dans les enregistrements des journaux de transactions (tout en rapportant toujours un message d'avertissement), et continue la restauration. Ce comportement pourrait causer des arrêts brutaux, des pertes de données, propager ou cacher une corruption, ainsi que d'autres problèmes sérieux. Ce paramètre a un effet seulement lors de la restauration et en mode standby." -#: utils/misc/guc.c:1346 +#: utils/misc/guc_tables.c:1149 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "" "Écrit des pages complètes dans les WAL lors d'une première modification après\n" "un point de vérification." -#: utils/misc/guc.c:1347 +#: utils/misc/guc_tables.c:1150 msgid "A page write in process during an operating system crash might be only partially written to disk. During recovery, the row changes stored in WAL are not enough to recover. This option writes pages when first modified after a checkpoint to WAL so full recovery is possible." msgstr "Une page écrite au moment d'un arrêt brutal du système d'exploitation pourrait n'être écrite sur le disque que partiellement. Lors de la récupération, les modifications stockées dans le journal de transaction ne sont pas suffisantes pour terminer la récupération. Cette option écrit les pages lors de la première modification après un checkpoint afin que la récupération complète soit possible." -#: utils/misc/guc.c:1360 +#: utils/misc/guc_tables.c:1163 msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." msgstr "Écrit des pages complètes dans les WAL lors d'une première modification après un point de vérification, y compris pour des modifications non critiques." -#: utils/misc/guc.c:1370 +#: utils/misc/guc_tables.c:1173 msgid "Writes zeroes to new WAL files before first use." msgstr "Écrit des zéros dans les nouveaux journaux de transaction avant leur première utilisation." -#: utils/misc/guc.c:1380 +#: utils/misc/guc_tables.c:1183 msgid "Recycles WAL files by renaming them." msgstr "Recycle les journaux de transactions en les renommant." -#: utils/misc/guc.c:1390 +#: utils/misc/guc_tables.c:1193 msgid "Logs each checkpoint." msgstr "Trace tous les points de vérification." -#: utils/misc/guc.c:1399 +#: utils/misc/guc_tables.c:1202 msgid "Logs each successful connection." msgstr "Trace toutes les connexions réussies." -#: utils/misc/guc.c:1408 +#: utils/misc/guc_tables.c:1211 msgid "Logs end of a session, including duration." msgstr "Trace la fin d'une session, avec sa durée." -#: utils/misc/guc.c:1417 +#: utils/misc/guc_tables.c:1220 msgid "Logs each replication command." msgstr "Trace chaque commande de réplication." -#: utils/misc/guc.c:1426 +#: utils/misc/guc_tables.c:1229 msgid "Shows whether the running server has assertion checks enabled." msgstr "Affiche si le serveur en cours d'exécution a les vérifications d'assertion activées." -#: utils/misc/guc.c:1441 +#: utils/misc/guc_tables.c:1240 msgid "Terminate session on any error." msgstr "Termine la session sans erreur." -#: utils/misc/guc.c:1450 +#: utils/misc/guc_tables.c:1249 msgid "Reinitialize server after backend crash." msgstr "Réinitialisation du serveur après un arrêt brutal d'un processus serveur." -#: utils/misc/guc.c:1459 +#: utils/misc/guc_tables.c:1258 msgid "Remove temporary files after backend crash." msgstr "Suppression des fichiers temporaires après un arrêt brutal d'un processus serveur." -#: utils/misc/guc.c:1470 +#: utils/misc/guc_tables.c:1268 +msgid "Send SIGABRT not SIGQUIT to child processes after backend crash." +msgstr "" + +#: utils/misc/guc_tables.c:1278 +msgid "Send SIGABRT not SIGKILL to stuck child processes." +msgstr "" + +#: utils/misc/guc_tables.c:1289 msgid "Logs the duration of each completed SQL statement." msgstr "Trace la durée de chaque instruction SQL terminée." -#: utils/misc/guc.c:1479 +#: utils/misc/guc_tables.c:1298 msgid "Logs each query's parse tree." msgstr "Trace l'arbre d'analyse de chaque requête." -#: utils/misc/guc.c:1488 +#: utils/misc/guc_tables.c:1307 msgid "Logs each query's rewritten parse tree." msgstr "Trace l'arbre d'analyse réécrit de chaque requête." -#: utils/misc/guc.c:1497 +#: utils/misc/guc_tables.c:1316 msgid "Logs each query's execution plan." msgstr "Trace le plan d'exécution de chaque requête." -#: utils/misc/guc.c:1506 +#: utils/misc/guc_tables.c:1325 msgid "Indents parse and plan tree displays." msgstr "Indente l'affichage des arbres d'analyse et de planification." -#: utils/misc/guc.c:1515 +#: utils/misc/guc_tables.c:1334 msgid "Writes parser performance statistics to the server log." msgstr "" "Écrit les statistiques de performance de l'analyseur dans les journaux applicatifs\n" "du serveur." -#: utils/misc/guc.c:1524 +#: utils/misc/guc_tables.c:1343 msgid "Writes planner performance statistics to the server log." msgstr "" "Écrit les statistiques de performance de planification dans les journaux\n" "applicatifs du serveur." -#: utils/misc/guc.c:1533 +#: utils/misc/guc_tables.c:1352 msgid "Writes executor performance statistics to the server log." msgstr "" "Écrit les statistiques de performance de l'exécuteur dans les journaux applicatifs\n" "du serveur." -#: utils/misc/guc.c:1542 +#: utils/misc/guc_tables.c:1361 msgid "Writes cumulative performance statistics to the server log." msgstr "" "Écrit les statistiques de performance cumulatives dans les journaux applicatifs\n" "du serveur." -#: utils/misc/guc.c:1552 +#: utils/misc/guc_tables.c:1371 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "Trace les statistiques d'utilisation des ressources systèmes (mémoire et CPU) sur les différentes opérations B-tree." -#: utils/misc/guc.c:1564 +#: utils/misc/guc_tables.c:1383 msgid "Collects information about executing commands." msgstr "Récupère les statistiques sur les commandes en exécution." -#: utils/misc/guc.c:1565 +#: utils/misc/guc_tables.c:1384 msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." msgstr "" "Active la récupération d'informations sur la commande en cours d'exécution\n" "pour chaque session, avec l'heure de début de l'exécution de la commande." -#: utils/misc/guc.c:1575 +#: utils/misc/guc_tables.c:1394 msgid "Collects statistics on database activity." msgstr "Récupère les statistiques sur l'activité de la base de données." -#: utils/misc/guc.c:1584 +#: utils/misc/guc_tables.c:1403 msgid "Collects timing statistics for database I/O activity." msgstr "Récupère les statistiques d'horodatage sur l'activité en entrées/sorties de la base de données." -#: utils/misc/guc.c:1593 +#: utils/misc/guc_tables.c:1412 msgid "Collects timing statistics for WAL I/O activity." msgstr "Récupère les statistiques d'horodatage sur l'activité en entrées/sorties des journaux de transactions." -#: utils/misc/guc.c:1603 +#: utils/misc/guc_tables.c:1422 msgid "Updates the process title to show the active SQL command." msgstr "" "Met à jour le titre du processus pour indiquer la commande SQL en cours\n" "d'exécution." -#: utils/misc/guc.c:1604 +#: utils/misc/guc_tables.c:1423 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "" "Active la mise à jour du titre du processus chaque fois qu'une nouvelle\n" "commande SQL est reçue par le serveur." -#: utils/misc/guc.c:1617 +#: utils/misc/guc_tables.c:1432 msgid "Starts the autovacuum subprocess." msgstr "Exécute le sous-processus de l'autovacuum." -#: utils/misc/guc.c:1627 +#: utils/misc/guc_tables.c:1442 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Génère une sortie de débogage pour LISTEN et NOTIFY." -#: utils/misc/guc.c:1639 +#: utils/misc/guc_tables.c:1454 msgid "Emits information about lock usage." msgstr "Émet des informations sur l'utilisation des verrous." -#: utils/misc/guc.c:1649 +#: utils/misc/guc_tables.c:1464 msgid "Emits information about user lock usage." msgstr "Émet des informations sur l'utilisation des verrous utilisateurs." -#: utils/misc/guc.c:1659 +#: utils/misc/guc_tables.c:1474 msgid "Emits information about lightweight lock usage." msgstr "Émet des informations sur l'utilisation des verrous légers." -#: utils/misc/guc.c:1669 +#: utils/misc/guc_tables.c:1484 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "Trace les informations sur les verrous actuels lorsqu'un délai sur le deadlock est dépassé." -#: utils/misc/guc.c:1681 +#: utils/misc/guc_tables.c:1496 msgid "Logs long lock waits." msgstr "Trace les attentes longues de verrou." -#: utils/misc/guc.c:1690 +#: utils/misc/guc_tables.c:1505 msgid "Logs standby recovery conflict waits." msgstr "Trace les attentes sur les conflits de restauration du secondaire." -#: utils/misc/guc.c:1699 +#: utils/misc/guc_tables.c:1514 msgid "Logs the host name in the connection logs." msgstr "Trace le nom d'hôte dans les traces de connexion." -#: utils/misc/guc.c:1700 +#: utils/misc/guc_tables.c:1515 msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." msgstr "Par défaut, une connexion ne trace que l'adresse IP de l'hôte se connectant. Si vous voulez que s'affiche le nom de l'hôte, vous pouvez activer cette option mais, selon la configuration de la résolution de noms de votre hôte, cela peut imposer un coût en performances non négligeable." -#: utils/misc/guc.c:1711 +#: utils/misc/guc_tables.c:1526 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Traite « expr=NULL » comme « expr IS NULL »." -#: utils/misc/guc.c:1712 +#: utils/misc/guc_tables.c:1527 msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." msgstr "" "Une fois activé, les expressions de la forme expr = NULL (ou NULL = expr)\n" @@ -28232,327 +29181,345 @@ msgstr "" "l'expression est évaluée comme étant NULL et false sinon. Le comportement\n" "correct de expr = NULL est de toujours renvoyer NULL (inconnu)." -#: utils/misc/guc.c:1724 +#: utils/misc/guc_tables.c:1539 msgid "Enables per-database user names." msgstr "Active les noms d'utilisateur par base de données." -#: utils/misc/guc.c:1733 +#: utils/misc/guc_tables.c:1548 msgid "Sets the default read-only status of new transactions." msgstr "Initialise le statut de lecture seule par défaut des nouvelles transactions." -#: utils/misc/guc.c:1743 +#: utils/misc/guc_tables.c:1558 msgid "Sets the current transaction's read-only status." msgstr "Affiche le statut de lecture seule de la transaction actuelle." -#: utils/misc/guc.c:1753 +#: utils/misc/guc_tables.c:1568 msgid "Sets the default deferrable status of new transactions." msgstr "Initialise le statut déferrable par défaut des nouvelles transactions." -#: utils/misc/guc.c:1762 +#: utils/misc/guc_tables.c:1577 msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." msgstr "" "S'il faut repousser une transaction sérialisable en lecture seule jusqu'à ce qu'elle\n" "puisse être exécutée sans échecs possibles de sérialisation." -#: utils/misc/guc.c:1772 +#: utils/misc/guc_tables.c:1587 msgid "Enable row security." msgstr "Active la sécurité niveau ligne." -#: utils/misc/guc.c:1773 +#: utils/misc/guc_tables.c:1588 msgid "When enabled, row security will be applied to all users." msgstr "Lorsqu'il est activé, le mode de sécurité niveau ligne sera appliqué à tous les utilisateurs." -#: utils/misc/guc.c:1781 +#: utils/misc/guc_tables.c:1596 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "Vérifie les corps de routine lors du CREATE FUNCTION et du CREATE PROCEDURE." -#: utils/misc/guc.c:1790 +#: utils/misc/guc_tables.c:1605 msgid "Enable input of NULL elements in arrays." msgstr "Active la saisie d'éléments NULL dans les tableaux." -#: utils/misc/guc.c:1791 +#: utils/misc/guc_tables.c:1606 msgid "When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally." msgstr "" "Si activé, un NULL sans guillemets en tant que valeur d'entrée dans un\n" "tableau signifie une valeur NULL ; sinon, il sera pris littéralement." -#: utils/misc/guc.c:1807 +#: utils/misc/guc_tables.c:1622 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OID n'est plus supporté ; ce paramètre ne peut être positionné qu'à false (faux)." -#: utils/misc/guc.c:1817 +#: utils/misc/guc_tables.c:1632 msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "" "Lance un sous-processus pour capturer la sortie d'erreurs (stderr) et/ou\n" "csvlogs dans des journaux applicatifs." -#: utils/misc/guc.c:1826 +#: utils/misc/guc_tables.c:1641 msgid "Truncate existing log files of same name during log rotation." msgstr "" "Tronque les journaux applicatifs existants du même nom lors de la rotation\n" "des journaux applicatifs." -#: utils/misc/guc.c:1837 +#: utils/misc/guc_tables.c:1652 msgid "Emit information about resource usage in sorting." msgstr "Émet des informations sur l'utilisation des ressources lors d'un tri." -#: utils/misc/guc.c:1851 +#: utils/misc/guc_tables.c:1666 msgid "Generate debugging output for synchronized scanning." msgstr "Génère une sortie de débogage pour les parcours synchronisés." -#: utils/misc/guc.c:1866 +#: utils/misc/guc_tables.c:1681 msgid "Enable bounded sorting using heap sort." msgstr "Active le tri limité en utilisant le tri de heap." -#: utils/misc/guc.c:1879 +#: utils/misc/guc_tables.c:1694 msgid "Emit WAL-related debugging output." msgstr "Émet une sortie de débogage concernant les journaux de transactions." -#: utils/misc/guc.c:1891 +#: utils/misc/guc_tables.c:1706 msgid "Shows whether datetimes are integer based." msgstr "Indique si les types datetime sont basés sur des entiers." -#: utils/misc/guc.c:1902 +#: utils/misc/guc_tables.c:1717 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "" "Indique si les noms d'utilisateurs Kerberos et GSSAPI devraient être traités\n" "sans se soucier de la casse." -#: utils/misc/guc.c:1912 +#: utils/misc/guc_tables.c:1727 +#, fuzzy +#| msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." +msgid "Sets whether GSSAPI delegation should be accepted from the client." +msgstr "" +"Indique si les noms d'utilisateurs Kerberos et GSSAPI devraient être traités\n" +"sans se soucier de la casse." + +#: utils/misc/guc_tables.c:1737 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Avertie sur les échappements par antislash dans les chaînes ordinaires." -#: utils/misc/guc.c:1922 +#: utils/misc/guc_tables.c:1747 msgid "Causes '...' strings to treat backslashes literally." msgstr "Fait que les chaînes '...' traitent les antislashs littéralement." -#: utils/misc/guc.c:1933 +#: utils/misc/guc_tables.c:1758 msgid "Enable synchronized sequential scans." msgstr "Active l'utilisation des parcours séquentiels synchronisés." -#: utils/misc/guc.c:1943 +#: utils/misc/guc_tables.c:1768 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "Définit s'il faut inclure ou exclure la transaction de la cible de restauration." -#: utils/misc/guc.c:1953 +#: utils/misc/guc_tables.c:1778 msgid "Allows connections and queries during recovery." msgstr "Autorise les connexions et les requêtes pendant la restauration." -#: utils/misc/guc.c:1963 +#: utils/misc/guc_tables.c:1788 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "Permet l'envoi d'informations d'un serveur en hot standby vers le serveur principal pour éviter les conflits de requêtes." -#: utils/misc/guc.c:1973 +#: utils/misc/guc_tables.c:1798 msgid "Shows whether hot standby is currently active." msgstr "Affiche si le hot standby est actuellement actif." -#: utils/misc/guc.c:1984 +#: utils/misc/guc_tables.c:1809 msgid "Allows modifications of the structure of system tables." msgstr "Permet les modifications de la structure des tables systèmes." -#: utils/misc/guc.c:1995 +#: utils/misc/guc_tables.c:1820 msgid "Disables reading from system indexes." msgstr "Désactive la lecture des index système." -#: utils/misc/guc.c:1996 +#: utils/misc/guc_tables.c:1821 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "" "Cela n'empêche pas la mise à jour des index, donc vous pouvez l'utiliser en\n" "toute sécurité. La pire conséquence est la lenteur." -#: utils/misc/guc.c:2007 +#: utils/misc/guc_tables.c:1832 msgid "Allows tablespaces directly inside pg_tblspc, for testing." msgstr "" -#: utils/misc/guc.c:2018 +#: utils/misc/guc_tables.c:1843 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "" "Active la compatibilité ascendante pour la vérification des droits sur les\n" "Large Objects." -#: utils/misc/guc.c:2019 +#: utils/misc/guc_tables.c:1844 msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." msgstr "" "Ignore la vérification des droits lors de la lecture et de la modification\n" "des Larges Objects, pour la compatibilité avec les versions antérieures à la\n" "9.0." -#: utils/misc/guc.c:2029 +#: utils/misc/guc_tables.c:1854 msgid "When generating SQL fragments, quote all identifiers." msgstr "Lors de la génération des rragments SQL, mettre entre guillemets tous les identifiants." -#: utils/misc/guc.c:2039 +#: utils/misc/guc_tables.c:1864 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Affiche si les sommes de contrôle sont activées sur les données pour cette instance." -#: utils/misc/guc.c:2050 +#: utils/misc/guc_tables.c:1875 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "Ajoute un numéro de séquence aux messages syslog pour éviter des suppressions de doublons." -#: utils/misc/guc.c:2060 +#: utils/misc/guc_tables.c:1885 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "Sépare les messages envoyés à syslog par lignes afin de les faire tenir dans 1024 octets." -#: utils/misc/guc.c:2070 +#: utils/misc/guc_tables.c:1895 msgid "Controls whether Gather and Gather Merge also run subplans." -msgstr "Controle si les nÅ“uds Gather et Gather Merge doivent également exécuter des sous-plans." +msgstr "Contrôle si les nÅ“uds Gather et Gather Merge doivent également exécuter des sous-plans." -#: utils/misc/guc.c:2071 +#: utils/misc/guc_tables.c:1896 msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "Est-ce que les nÅ“uds Gather devraient également exécuter des sous-plans, ou juste recueillir des lignes ?" -#: utils/misc/guc.c:2081 +#: utils/misc/guc_tables.c:1906 msgid "Allow JIT compilation." msgstr "Autorise la compilation JIT." -#: utils/misc/guc.c:2092 +#: utils/misc/guc_tables.c:1917 msgid "Register JIT-compiled functions with debugger." msgstr "Enregistre les fonctions compilées avec JIT avec le debugger." -#: utils/misc/guc.c:2109 +#: utils/misc/guc_tables.c:1934 msgid "Write out LLVM bitcode to facilitate JIT debugging." -msgstr "Écrire le bitcode LLVM pour faciliter de débugage JIT." +msgstr "Écrire le bitcode LLVM pour faciliter de débogage JIT." -#: utils/misc/guc.c:2120 +#: utils/misc/guc_tables.c:1945 msgid "Allow JIT compilation of expressions." msgstr "Autorise la compilation JIT des expressions." -#: utils/misc/guc.c:2131 +#: utils/misc/guc_tables.c:1956 msgid "Register JIT-compiled functions with perf profiler." msgstr "Enregistre les fonctions compilées avec JIT avec l'outil de profilage perf." -#: utils/misc/guc.c:2148 +#: utils/misc/guc_tables.c:1973 msgid "Allow JIT compilation of tuple deforming." msgstr "Autorise la compilation JIT de la décomposition des lignes." -#: utils/misc/guc.c:2159 +#: utils/misc/guc_tables.c:1984 msgid "Whether to continue running after a failure to sync data files." msgstr "Soit de continuer à s'exécuter après un échec lors de la synchronisation des fichiers de données." -#: utils/misc/guc.c:2168 +#: utils/misc/guc_tables.c:1993 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "Configure si un wal receiver doit créer un slot de réplication temporaire si aucun slot permanent n'est configuré." -#: utils/misc/guc.c:2186 +#: utils/misc/guc_tables.c:2011 #, fuzzy #| msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." -msgstr "Initalise le temps à attendre avant de retenter de récupérer un WAL après une tentative infructueuse." +msgstr "Initialise le temps à attendre avant de retenter de récupérer un WAL après une tentative infructueuse." -#: utils/misc/guc.c:2197 +#: utils/misc/guc_tables.c:2022 #, fuzzy #| msgid "Sets the maximum time to wait for WAL replication." msgid "Sets the amount of time to wait after authentication on connection startup." msgstr "Initialise le temps maximum à attendre pour la réplication des WAL." -#: utils/misc/guc.c:2199 utils/misc/guc.c:2820 +#: utils/misc/guc_tables.c:2024 utils/misc/guc_tables.c:2658 msgid "This allows attaching a debugger to the process." msgstr "Ceci permet d'attacher un débogueur au processus." -#: utils/misc/guc.c:2208 +#: utils/misc/guc_tables.c:2033 msgid "Sets the default statistics target." msgstr "Initialise la cible par défaut des statistiques." -#: utils/misc/guc.c:2209 +#: utils/misc/guc_tables.c:2034 msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." msgstr "" "Ceci s'applique aux colonnes de tables qui n'ont pas de cible spécifique\n" "pour la colonne initialisée via ALTER TABLE SET STATISTICS." -#: utils/misc/guc.c:2218 +#: utils/misc/guc_tables.c:2043 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "" "Initialise la taille de la liste FROM en dehors de laquelle les\n" "sous-requêtes ne sont pas rassemblées." -#: utils/misc/guc.c:2220 +#: utils/misc/guc_tables.c:2045 msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." msgstr "" "Le planificateur fusionne les sous-requêtes dans des requêtes supérieures\n" "si la liste FROM résultante n'a pas plus de ce nombre d'éléments." -#: utils/misc/guc.c:2231 +#: utils/misc/guc_tables.c:2056 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "" "Initialise la taille de la liste FROM en dehors de laquelle les contructions\n" "JOIN ne sont pas aplanies." -#: utils/misc/guc.c:2233 +#: utils/misc/guc_tables.c:2058 msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." msgstr "" -"La planificateur applanira les constructions JOIN explicites dans des listes\n" +"La planificateur aplanira les constructions JOIN explicites dans des listes\n" "d'éléments FROM lorsqu'une liste d'au plus ce nombre d'éléments en\n" "résulterait." -#: utils/misc/guc.c:2244 +#: utils/misc/guc_tables.c:2069 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "Initialise la limite des éléments FROM en dehors de laquelle GEQO est utilisé." -#: utils/misc/guc.c:2254 +#: utils/misc/guc_tables.c:2079 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "" "GEQO : l'effort est utilisé pour initialiser une valeur par défaut pour les\n" "autres paramètres GEQO." -#: utils/misc/guc.c:2264 +#: utils/misc/guc_tables.c:2089 msgid "GEQO: number of individuals in the population." msgstr "GEQO : nombre d'individus dans une population." -#: utils/misc/guc.c:2265 utils/misc/guc.c:2275 +#: utils/misc/guc_tables.c:2090 utils/misc/guc_tables.c:2100 msgid "Zero selects a suitable default value." msgstr "Zéro sélectionne une valeur par défaut convenable." -#: utils/misc/guc.c:2274 +#: utils/misc/guc_tables.c:2099 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO : nombre d'itérations dans l'algorithme." -#: utils/misc/guc.c:2286 +#: utils/misc/guc_tables.c:2111 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Temps d'attente du verrou avant de vérifier les verrous bloqués." -#: utils/misc/guc.c:2297 +#: utils/misc/guc_tables.c:2122 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "Définit le délai maximum avant d'annuler les requêtes lorsqu'un serveur « hot standby » traite les données des journaux de transactions archivés" -#: utils/misc/guc.c:2308 +#: utils/misc/guc_tables.c:2133 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "" "Initialise le délai maximum avant d'annuler les requêtes lorsqu'un serveur en\n" "hotstandby traite les données des journaux de transactions envoyés en flux." -#: utils/misc/guc.c:2319 +#: utils/misc/guc_tables.c:2144 msgid "Sets the minimum delay for applying changes during recovery." msgstr "Définit la durée minimale pour appliquer des changements lors de la restauration." -#: utils/misc/guc.c:2330 +#: utils/misc/guc_tables.c:2155 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "Définit l'intervalle maximum entre les rapports du statut du walreceiver au serveur émetteur." -#: utils/misc/guc.c:2341 +#: utils/misc/guc_tables.c:2166 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "Définit la durée maximale d'attente pour réceptionner des donnés du serveur émetteur." -#: utils/misc/guc.c:2352 +#: utils/misc/guc_tables.c:2177 msgid "Sets the maximum number of concurrent connections." msgstr "Nombre maximum de connexions simultanées." -#: utils/misc/guc.c:2363 +#: utils/misc/guc_tables.c:2188 msgid "Sets the number of connection slots reserved for superusers." msgstr "Nombre de connexions réservées aux super-utilisateurs." -#: utils/misc/guc.c:2373 +#: utils/misc/guc_tables.c:2198 +#, fuzzy +#| msgid "Sets the number of connection slots reserved for superusers." +msgid "Sets the number of connection slots reserved for roles with privileges of pg_use_reserved_connections." +msgstr "Nombre de connexions réservées aux super-utilisateurs." + +#: utils/misc/guc_tables.c:2209 msgid "Amount of dynamic shared memory reserved at startup." msgstr "Quantité de mémoire partagée dynamique réservée au démarrage." -#: utils/misc/guc.c:2388 +#: utils/misc/guc_tables.c:2224 msgid "Sets the number of shared memory buffers used by the server." msgstr "Nombre de tampons en mémoire partagée utilisé par le serveur." -#: utils/misc/guc.c:2399 +#: utils/misc/guc_tables.c:2235 +msgid "Sets the buffer pool size for VACUUM, ANALYZE, and autovacuum." +msgstr "" + +#: utils/misc/guc_tables.c:2246 msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." msgstr "" -#: utils/misc/guc.c:2410 +#: utils/misc/guc_tables.c:2257 #, fuzzy #| msgid "Sets the number of disk-page buffers in shared memory for WAL." msgid "Shows the number of huge pages needed for the main shared memory area." @@ -28560,23 +29527,23 @@ msgstr "" "Initialise le nombre de tampons de pages disque dans la mémoire partagée\n" "pour les journaux de transactions." -#: utils/misc/guc.c:2411 +#: utils/misc/guc_tables.c:2258 msgid "-1 indicates that the value could not be determined." msgstr "-1 indique que la valeur n'a pas pu être déterminée." -#: utils/misc/guc.c:2421 +#: utils/misc/guc_tables.c:2268 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Nombre maximum de tampons en mémoire partagée utilisés par chaque session." -#: utils/misc/guc.c:2432 +#: utils/misc/guc_tables.c:2279 msgid "Sets the TCP port the server listens on." msgstr "Port TCP sur lequel le serveur écoutera." -#: utils/misc/guc.c:2442 +#: utils/misc/guc_tables.c:2289 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Droits d'accès au socket domaine Unix." -#: utils/misc/guc.c:2443 +#: utils/misc/guc_tables.c:2290 msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "" "Les sockets de domaine Unix utilise l'ensemble des droits habituels du système\n" @@ -28584,242 +29551,242 @@ msgstr "" "mode numérique de la forme acceptée par les appels système chmod et umask\n" "(pour utiliser le format octal, le nombre doit commencer par un zéro)." -#: utils/misc/guc.c:2457 +#: utils/misc/guc_tables.c:2304 msgid "Sets the file permissions for log files." msgstr "Initialise les droits des fichiers de trace." -#: utils/misc/guc.c:2458 +#: utils/misc/guc_tables.c:2305 msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "" "La valeur du paramètre est attendue dans le format numérique du mode accepté\n" "par les appels système chmod et umask (pour utiliser le format octal\n" "personnalisé, le numéro doit commencer par un zéro)." -#: utils/misc/guc.c:2472 +#: utils/misc/guc_tables.c:2319 msgid "Shows the mode of the data directory." msgstr "Affiche le mode du répertoire des données." -#: utils/misc/guc.c:2473 +#: utils/misc/guc_tables.c:2320 msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "" "La valeur du paramètre est une spécification numérique de mode dans la forme acceptée\n" "par les appels système chmod et umask (pour utiliser le format octal\n" "personnalisé, le numéro doit commencer par un 0 (zéro).)" -#: utils/misc/guc.c:2486 +#: utils/misc/guc_tables.c:2333 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Initialise la mémoire maximum utilisée pour les espaces de travail des requêtes." -#: utils/misc/guc.c:2487 +#: utils/misc/guc_tables.c:2334 msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." msgstr "" "Spécifie la mémoire à utiliser par les opérations de tris internes et par\n" "les tables de hachage avant de passer sur des fichiers temporaires sur disque." -#: utils/misc/guc.c:2499 +#: utils/misc/guc_tables.c:2346 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Initialise la mémoire maximum utilisée pour les opérations de maintenance." -#: utils/misc/guc.c:2500 +#: utils/misc/guc_tables.c:2347 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Ceci inclut les opérations comme VACUUM et CREATE INDEX." -#: utils/misc/guc.c:2510 +#: utils/misc/guc_tables.c:2357 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Initialise la mémoire maximum utilisée pour le décodage logique." -#: utils/misc/guc.c:2511 +#: utils/misc/guc_tables.c:2358 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." msgstr "Cette quantité de mémoire peut être utilisée par chaque cache de tri interne avant de passer sur des fichiers temporaires sur disque." -#: utils/misc/guc.c:2527 +#: utils/misc/guc_tables.c:2374 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Initialise la profondeur maximale de la pile, en Ko." -#: utils/misc/guc.c:2538 +#: utils/misc/guc_tables.c:2385 msgid "Limits the total size of all temporary files used by each process." msgstr "Limite la taille totale de tous les fichiers temporaires utilisés par chaque processus." -#: utils/misc/guc.c:2539 +#: utils/misc/guc_tables.c:2386 msgid "-1 means no limit." msgstr "-1 signifie sans limite." -#: utils/misc/guc.c:2549 +#: utils/misc/guc_tables.c:2396 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Coût d'un VACUUM pour une page trouvée dans le cache du tampon." -#: utils/misc/guc.c:2559 +#: utils/misc/guc_tables.c:2406 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Coût d'un VACUUM pour une page introuvable dans le cache du tampon." -#: utils/misc/guc.c:2569 +#: utils/misc/guc_tables.c:2416 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Coût d'un VACUUM pour une page modifiée par VACUUM." -#: utils/misc/guc.c:2579 +#: utils/misc/guc_tables.c:2426 msgid "Vacuum cost amount available before napping." msgstr "Coût du VACUUM disponible avant un repos." -#: utils/misc/guc.c:2589 +#: utils/misc/guc_tables.c:2436 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Coût du VACUUM disponible avant un repos, pour autovacuum." -#: utils/misc/guc.c:2599 +#: utils/misc/guc_tables.c:2446 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "" "Initialise le nombre maximum de fichiers ouverts simultanément pour chaque\n" "processus serveur." -#: utils/misc/guc.c:2612 +#: utils/misc/guc_tables.c:2459 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Initialise le nombre maximum de transactions préparées simultanément." -#: utils/misc/guc.c:2623 +#: utils/misc/guc_tables.c:2470 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Initialise l'OID minimum des tables pour tracer les verrous." -#: utils/misc/guc.c:2624 +#: utils/misc/guc_tables.c:2471 msgid "Is used to avoid output on system tables." msgstr "Est utilisé pour éviter la sortie sur des tables systèmes." -#: utils/misc/guc.c:2633 +#: utils/misc/guc_tables.c:2480 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Configure l'OID de la table avec une trace des verrous sans condition." -#: utils/misc/guc.c:2645 +#: utils/misc/guc_tables.c:2492 msgid "Sets the maximum allowed duration of any statement." msgstr "Initialise la durée maximum permise pour toute instruction." -#: utils/misc/guc.c:2646 utils/misc/guc.c:2657 utils/misc/guc.c:2668 -#: utils/misc/guc.c:2679 +#: utils/misc/guc_tables.c:2493 utils/misc/guc_tables.c:2504 +#: utils/misc/guc_tables.c:2515 utils/misc/guc_tables.c:2526 msgid "A value of 0 turns off the timeout." msgstr "Une valeur de 0 désactive le timeout." -#: utils/misc/guc.c:2656 +#: utils/misc/guc_tables.c:2503 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Initialise la durée maximum permise pour toute attente d'un verrou." -#: utils/misc/guc.c:2667 +#: utils/misc/guc_tables.c:2514 msgid "Sets the maximum allowed idle time between queries, when in a transaction." msgstr "Configure la durée maximale autorisée d'attente entre deux requêtes dans une transaction." -#: utils/misc/guc.c:2678 +#: utils/misc/guc_tables.c:2525 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." msgstr "Configure la durée maximale autorisée d'attente entre deux requêtes hors d'une transaction." -#: utils/misc/guc.c:2689 +#: utils/misc/guc_tables.c:2536 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "Âge minimum à partir duquel VACUUM devra geler une ligne de table." -#: utils/misc/guc.c:2699 +#: utils/misc/guc_tables.c:2546 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "Âge à partir duquel VACUUM devra parcourir une table complète pour geler les lignes." -#: utils/misc/guc.c:2709 +#: utils/misc/guc_tables.c:2556 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "Âge minimum à partir duquel VACUUM devra geler un MultiXactId dans une ligne de table." -#: utils/misc/guc.c:2719 +#: utils/misc/guc_tables.c:2566 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "" "Âge Multixact à partir duquel VACUUM devra parcourir une table complète pour geler les\n" "lignes." -#: utils/misc/guc.c:2729 -msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." -msgstr "Nombre de transactions à partir duquel les nettoyages VACUUM et HOT doivent être déferrés." - -#: utils/misc/guc.c:2738 +#: utils/misc/guc_tables.c:2576 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "Âge à partir duquel le VACUUM doit déclencher le système de sécurité pour éviter un problème de réutilisation des identifiants de transaction." -#: utils/misc/guc.c:2747 +#: utils/misc/guc_tables.c:2585 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "Âge du multixact à partir duquel le VACUUM doit déclencher le système de sécurité pour éviter un problème de réutilisation des identifiants de transaction." -#: utils/misc/guc.c:2760 +#: utils/misc/guc_tables.c:2598 msgid "Sets the maximum number of locks per transaction." msgstr "Initialise le nombre maximum de verrous par transaction." -#: utils/misc/guc.c:2761 -msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." +#: utils/misc/guc_tables.c:2599 +#, fuzzy +#| msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." +msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction objects per server process or prepared transaction will need to be locked at any one time." msgstr "" "La table des verrous partagés est dimensionnée sur l'idée qu'au plus\n" "max_locks_per_transaction * max_connections objets distincts auront besoin\n" "d'être verrouillés à tout moment." -#: utils/misc/guc.c:2772 +#: utils/misc/guc_tables.c:2610 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Initialise le nombre maximum de verrous prédicats par transaction." -#: utils/misc/guc.c:2773 -msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." +#: utils/misc/guc_tables.c:2611 +#, fuzzy +#| msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." +msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction objects per server process or prepared transaction will need to be locked at any one time." msgstr "" "La table des verrous de prédicat partagés est dimensionnée sur l'idée qu'au plus\n" "max_pred_locks_per_transaction * max_connections objets distincts auront besoin\n" "d'être verrouillés à tout moment." -#: utils/misc/guc.c:2784 +#: utils/misc/guc_tables.c:2622 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "Initialise le nombre maximum de pages et lignes verrouillées avec prédicats par transaction." -#: utils/misc/guc.c:2785 +#: utils/misc/guc_tables.c:2623 msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." msgstr "Si plus que ce nombre de pages et lignes dans la même relation sont verrouillées par une connexion, ces verrous sont remplacés par un verrou de niveau relation." -#: utils/misc/guc.c:2795 +#: utils/misc/guc_tables.c:2633 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "Initialise le nombre maximum de lignes verrouillées avec prédicat par transaction." -#: utils/misc/guc.c:2796 +#: utils/misc/guc_tables.c:2634 msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." msgstr "Si plus que ce nombre de lignes sur la même page sont verrouillées par une connexion, ces verrous sont remplacés par un verrou de niveau de page." -#: utils/misc/guc.c:2806 +#: utils/misc/guc_tables.c:2644 msgid "Sets the maximum allowed time to complete client authentication." msgstr "" "Initialise le temps maximum en secondes pour terminer l'authentification du\n" "client." -#: utils/misc/guc.c:2818 +#: utils/misc/guc_tables.c:2656 #, fuzzy #| msgid "Set the amount of traffic to send and receive before renegotiating the encryption keys." msgid "Sets the amount of time to wait before authentication on connection startup." msgstr "" -"Configure la quantité de trafic à envoyer et recevoir avant la renégotiation\n" +"Configure la quantité de trafic à envoyer et recevoir avant la renégociation\n" "des clés d'enchiffrement." -#: utils/misc/guc.c:2830 +#: utils/misc/guc_tables.c:2668 msgid "Buffer size for reading ahead in the WAL during recovery." msgstr "" -#: utils/misc/guc.c:2831 +#: utils/misc/guc_tables.c:2669 msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." msgstr "" -#: utils/misc/guc.c:2841 +#: utils/misc/guc_tables.c:2679 msgid "Sets the size of WAL files held for standby servers." msgstr "Initialise la volumétrie de journaux de transactions conservés pour les serveurs standby." -#: utils/misc/guc.c:2852 +#: utils/misc/guc_tables.c:2690 msgid "Sets the minimum size to shrink the WAL to." msgstr "Initialise la taille minimale à laquelle réduire l'espace des journaux de transaction." -#: utils/misc/guc.c:2864 +#: utils/misc/guc_tables.c:2702 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Initialise la volumétrie de journaux de transaction qui déclenche un checkpoint." -#: utils/misc/guc.c:2876 +#: utils/misc/guc_tables.c:2714 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "" "Initialise le temps maximum entre des points de vérification (checkpoints)\n" "pour les journaux de transactions." -#: utils/misc/guc.c:2887 +#: utils/misc/guc_tables.c:2725 msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." msgstr "" -#: utils/misc/guc.c:2889 +#: utils/misc/guc_tables.c:2727 #, fuzzy #| msgid "Write a message to the server log if checkpoints caused by the filling of checkpoint segment files happens more frequently than this number of seconds. Zero turns off the warning." msgid "Write a message to the server log if checkpoints caused by the filling of WAL segment files happen more frequently than this amount of time. Zero turns off the warning." @@ -28829,57 +29796,58 @@ msgstr "" "des points de vérification qui arrivent plus fréquemment que ce nombre de\n" "secondes. Une valeur 0 désactive l'avertissement." -#: utils/misc/guc.c:2902 utils/misc/guc.c:3120 utils/misc/guc.c:3168 +#: utils/misc/guc_tables.c:2740 utils/misc/guc_tables.c:2958 +#: utils/misc/guc_tables.c:2998 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "Nombre de pages après lequel les précédentes écritures seront synchronisées sur disque." -#: utils/misc/guc.c:2913 +#: utils/misc/guc_tables.c:2751 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "" "Initialise le nombre de tampons de pages disque dans la mémoire partagée\n" "pour les journaux de transactions." -#: utils/misc/guc.c:2924 +#: utils/misc/guc_tables.c:2762 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Temps entre les synchronisations des WAL sur disque effectuées par le processus d'écriture des journaux de transaction." -#: utils/misc/guc.c:2935 +#: utils/misc/guc_tables.c:2773 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "Quantité de WAL écrits par le processus d'écriture des journaux de transaction devant déclencher une synchronisation sur disque." -#: utils/misc/guc.c:2946 +#: utils/misc/guc_tables.c:2784 msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "Taille minimale d'un nouveau fichier à synchroniser sur disque au lieu d'écrire dans les journaux de transactions." -#: utils/misc/guc.c:2957 +#: utils/misc/guc_tables.c:2795 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "" "Initialise le nombre maximum de processus d'envoi des journaux de transactions\n" "exécutés simultanément." -#: utils/misc/guc.c:2968 +#: utils/misc/guc_tables.c:2806 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Initialise le nombre maximum de slots de réplication définis simultanément." -#: utils/misc/guc.c:2978 +#: utils/misc/guc_tables.c:2816 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "Initialise la volumétrie maximale des journaux de transactions pouvant être réservée pour les slots de réplication." -#: utils/misc/guc.c:2979 +#: utils/misc/guc_tables.c:2817 msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." msgstr "Les slots de réplication seront marqués comme échoués, et les segments relâchés pour suppression ou recyclage si autant d'espace est occupé par les journaux sur disque." -#: utils/misc/guc.c:2991 +#: utils/misc/guc_tables.c:2829 msgid "Sets the maximum time to wait for WAL replication." msgstr "Initialise le temps maximum à attendre pour la réplication des WAL." -#: utils/misc/guc.c:3002 +#: utils/misc/guc_tables.c:2840 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "" "Initialise le délai en microsecondes entre l'acceptation de la transaction\n" "et le vidage du journal de transaction sur disque." -#: utils/misc/guc.c:3014 +#: utils/misc/guc_tables.c:2852 #, fuzzy #| msgid "Sets the minimum concurrent open transactions before performing commit_delay." msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." @@ -28887,197 +29855,204 @@ msgstr "" "Initialise le nombre minimum de transactions ouvertes simultanément avant le\n" "commit_delay." -#: utils/misc/guc.c:3025 +#: utils/misc/guc_tables.c:2863 msgid "Sets the number of digits displayed for floating-point values." msgstr "Initialise le nombre de chiffres affichés pour les valeurs à virgule flottante." -#: utils/misc/guc.c:3026 +#: utils/misc/guc_tables.c:2864 msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." msgstr "Ceci affecte les types de données real, double precision et géométriques. Une valeur zéro ou négative du paramètre est ajoutée au nombre standard de chiffres (FLT_DIG ou DBL_DIG comme approprié). Toute valeur plus grande que zéro sélectionne le mode de sortie précis." -#: utils/misc/guc.c:3038 +#: utils/misc/guc_tables.c:2876 msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." msgstr "Initialise le temps d'exécution minimum au-dessus duquel un échantillon de requêtes est tracé. L'échantillonnage est déterminé par log_statement_sample_rate." -#: utils/misc/guc.c:3041 +#: utils/misc/guc_tables.c:2879 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "Zéro trace un échantillon de toutes les requêtes. -1 désactive cette fonctionnalité." -#: utils/misc/guc.c:3051 +#: utils/misc/guc_tables.c:2889 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "Initialise le temps d'exécution minimum au-dessus duquel toutes les requêtes seront tracées." -#: utils/misc/guc.c:3053 +#: utils/misc/guc_tables.c:2891 msgid "Zero prints all queries. -1 turns this feature off." msgstr "Zéro affiche toutes les requêtes. -1 désactive cette fonctionnalité." -#: utils/misc/guc.c:3063 +#: utils/misc/guc_tables.c:2901 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "" "Initialise le temps d'exécution minimum au-dessus duquel les actions\n" "autovacuum seront tracées." -#: utils/misc/guc.c:3065 +#: utils/misc/guc_tables.c:2903 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "Zéro affiche toutes les requêtes. -1 désactive cette fonctionnalité." -#: utils/misc/guc.c:3075 +#: utils/misc/guc_tables.c:2913 msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." msgstr "" -#: utils/misc/guc.c:3077 utils/misc/guc.c:3089 +#: utils/misc/guc_tables.c:2915 utils/misc/guc_tables.c:2927 msgid "-1 to print values in full." msgstr "-1 pour afficher les valeurs complètement." -#: utils/misc/guc.c:3087 +#: utils/misc/guc_tables.c:2925 msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." msgstr "" -#: utils/misc/guc.c:3099 +#: utils/misc/guc_tables.c:2937 msgid "Background writer sleep time between rounds." msgstr "Durée d'endormissement du processus d'écriture en tâche de fond (background writer) entre deux cycles." -#: utils/misc/guc.c:3110 +#: utils/misc/guc_tables.c:2948 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "Nombre maximum de pages LRU à nettoyer par le processus d'écriture en tâche de fond (background writer)" -#: utils/misc/guc.c:3133 +#: utils/misc/guc_tables.c:2971 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "Nombre de requêtes simultanées pouvant être gérées efficacement par le sous-système disque." -#: utils/misc/guc.c:3151 +#: utils/misc/guc_tables.c:2985 msgid "A variant of effective_io_concurrency that is used for maintenance work." msgstr "Une variante de effective_io_concurrency pouvant être utilisée pour les travaux de maintenance." -#: utils/misc/guc.c:3181 +#: utils/misc/guc_tables.c:3011 msgid "Maximum number of concurrent worker processes." msgstr "Nombre maximum de background workers simultanés." -#: utils/misc/guc.c:3193 +#: utils/misc/guc_tables.c:3023 msgid "Maximum number of logical replication worker processes." msgstr "Nombre maximum de processus workers de réplication logique." -#: utils/misc/guc.c:3205 +#: utils/misc/guc_tables.c:3035 msgid "Maximum number of table synchronization workers per subscription." msgstr "Nombre maximum de workers de synchronisation par souscription." -#: utils/misc/guc.c:3215 +#: utils/misc/guc_tables.c:3047 +#, fuzzy +#| msgid "Maximum number of table synchronization workers per subscription." +msgid "Maximum number of parallel apply workers per subscription." +msgstr "Nombre maximum de workers de synchronisation par souscription." + +#: utils/misc/guc_tables.c:3057 #, fuzzy #| msgid "Sets the maximum time to wait for WAL replication." msgid "Sets the amount of time to wait before forcing log file rotation." msgstr "Initialise le temps maximum à attendre pour la réplication des WAL." -#: utils/misc/guc.c:3227 +#: utils/misc/guc_tables.c:3069 #, fuzzy #| msgid "Sets the maximum WAL size that can be reserved by replication slots." msgid "Sets the maximum size a log file can reach before being rotated." msgstr "Initialise la volumétrie maximale des journaux de transactions pouvant être réservée pour les slots de réplication." -#: utils/misc/guc.c:3239 +#: utils/misc/guc_tables.c:3081 msgid "Shows the maximum number of function arguments." msgstr "Affiche le nombre maximum d'arguments de fonction." -#: utils/misc/guc.c:3250 +#: utils/misc/guc_tables.c:3092 msgid "Shows the maximum number of index keys." msgstr "Affiche le nombre maximum de clés d'index." -#: utils/misc/guc.c:3261 +#: utils/misc/guc_tables.c:3103 msgid "Shows the maximum identifier length." msgstr "Affiche la longueur maximum d'un identifiant." -#: utils/misc/guc.c:3272 +#: utils/misc/guc_tables.c:3114 msgid "Shows the size of a disk block." msgstr "Affiche la taille d'un bloc de disque." -#: utils/misc/guc.c:3283 +#: utils/misc/guc_tables.c:3125 msgid "Shows the number of pages per disk file." msgstr "Affiche le nombre de pages par fichier." -#: utils/misc/guc.c:3294 +#: utils/misc/guc_tables.c:3136 msgid "Shows the block size in the write ahead log." msgstr "Affiche la taille du bloc dans les journaux de transactions." -#: utils/misc/guc.c:3305 +#: utils/misc/guc_tables.c:3147 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." -msgstr "Initalise le temps à attendre avant de retenter de récupérer un WAL après une tentative infructueuse." +msgstr "Initialise le temps à attendre avant de retenter de récupérer un WAL après une tentative infructueuse." -#: utils/misc/guc.c:3317 +#: utils/misc/guc_tables.c:3159 msgid "Shows the size of write ahead log segments." msgstr "Affiche la taille des journaux de transactions." -#: utils/misc/guc.c:3330 +#: utils/misc/guc_tables.c:3172 msgid "Time to sleep between autovacuum runs." msgstr "Durée d'endormissement entre deux exécutions d'autovacuum." -#: utils/misc/guc.c:3340 +#: utils/misc/guc_tables.c:3182 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Nombre minimum de lignes mises à jour ou supprimées avant le VACUUM." -#: utils/misc/guc.c:3349 +#: utils/misc/guc_tables.c:3191 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." msgstr "Nombre minimum de lignes insérées avant un ANALYZE, ou -1 pour désactiver ce comportement" -#: utils/misc/guc.c:3358 +#: utils/misc/guc_tables.c:3200 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "Nombre minimum de lignes insérées, mises à jour ou supprimées avant un ANALYZE." -#: utils/misc/guc.c:3368 +#: utils/misc/guc_tables.c:3210 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "Âge à partir duquel l'autovacuum se déclenche sur une table pour empêcher un rebouclage des identifiants de transaction." -#: utils/misc/guc.c:3380 +#: utils/misc/guc_tables.c:3222 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "Âge multixact à partir duquel l'autovacuum se déclenche sur une table pour empêcher la réinitialisation du multixact" -#: utils/misc/guc.c:3390 +#: utils/misc/guc_tables.c:3232 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "Initialise le nombre maximum de processus autovacuum exécutés simultanément." -#: utils/misc/guc.c:3400 +#: utils/misc/guc_tables.c:3242 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "Initialise le nombre maximum de processus parallèles par opération de maintenance." -#: utils/misc/guc.c:3410 +#: utils/misc/guc_tables.c:3252 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Initialise le nombre maximum de processus parallèles par nÅ“ud d'exécution." -#: utils/misc/guc.c:3421 +#: utils/misc/guc_tables.c:3263 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "Configure le nombre maximum de processus parallélisés pouvant être actifs en même temps." -#: utils/misc/guc.c:3432 +#: utils/misc/guc_tables.c:3274 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "Initialise la mémoire maximum utilisée par chaque processus autovacuum worker." -#: utils/misc/guc.c:3443 +#: utils/misc/guc_tables.c:3285 msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." msgstr "Temps à partir duquel un snapshot est trop ancien pour lire des pages ayant changées après que le snapshot ait été effectué." -#: utils/misc/guc.c:3444 +#: utils/misc/guc_tables.c:3286 msgid "A value of -1 disables this feature." msgstr "Une valeur de -1 désactive cette fonctionnalité." -#: utils/misc/guc.c:3454 +#: utils/misc/guc_tables.c:3296 msgid "Time between issuing TCP keepalives." msgstr "Secondes entre l'exécution de « TCP keepalives »." -#: utils/misc/guc.c:3455 utils/misc/guc.c:3466 utils/misc/guc.c:3590 +#: utils/misc/guc_tables.c:3297 utils/misc/guc_tables.c:3308 +#: utils/misc/guc_tables.c:3432 msgid "A value of 0 uses the system default." msgstr "Une valeur de 0 utilise la valeur par défaut du système." -#: utils/misc/guc.c:3465 +#: utils/misc/guc_tables.c:3307 msgid "Time between TCP keepalive retransmits." msgstr "Secondes entre les retransmissions de « TCP keepalive »." -#: utils/misc/guc.c:3476 +#: utils/misc/guc_tables.c:3318 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "La renégociation SSL n'est plus supportée; ce paramètre ne peut être positionné qu'à 0." -#: utils/misc/guc.c:3487 +#: utils/misc/guc_tables.c:3329 msgid "Maximum number of TCP keepalive retransmits." msgstr "Nombre maximum de retransmissions de « TCP keepalive »." -#: utils/misc/guc.c:3488 +#: utils/misc/guc_tables.c:3330 #, fuzzy #| msgid "This controls the number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." msgid "Number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." @@ -29086,416 +30061,413 @@ msgstr "" "peuvent être perdues avant qu'une connexion ne soit considérée morte. Une\n" "valeur de 0 utilise la valeur par défaut du système." -#: utils/misc/guc.c:3499 +#: utils/misc/guc_tables.c:3341 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Configure le nombre maximum de résultats lors d'une recherche par GIN." -#: utils/misc/guc.c:3510 +#: utils/misc/guc_tables.c:3352 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "Initialise le sentiment du planificateur sur la taille des caches disques." -#: utils/misc/guc.c:3511 +#: utils/misc/guc_tables.c:3353 msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." msgstr "" "C'est-à-dire, la portion des caches disques (noyau et PostgreSQL) qui sera utilisé pour les\n" "fichiers de données de PostgreSQL. C'est mesuré en pages disque, qui font\n" "normalement 8 Ko chaque." -#: utils/misc/guc.c:3522 +#: utils/misc/guc_tables.c:3364 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "Configure la quantité minimale de données de table pour un parcours parallèle." -#: utils/misc/guc.c:3523 +#: utils/misc/guc_tables.c:3365 msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." msgstr "Si le planificateur estime qu'il lira un nombre de blocs de table trop petit pour atteindre cette limite, un parcours parallèle ne sera pas considéré." -#: utils/misc/guc.c:3533 +#: utils/misc/guc_tables.c:3375 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "Configure la quantité minimale de données d'index pour un parcours parallèle." -#: utils/misc/guc.c:3534 +#: utils/misc/guc_tables.c:3376 msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." msgstr "Si le planificateur estime qu'il lira un nombre de blocs d'index trop petit pour atteindre cette limite, un parcours parallèle ne sera pas considéré." -#: utils/misc/guc.c:3545 +#: utils/misc/guc_tables.c:3387 msgid "Shows the server version as an integer." msgstr "Affiche la version du serveur sous la forme d'un entier." -#: utils/misc/guc.c:3556 +#: utils/misc/guc_tables.c:3398 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "" "Trace l'utilisation de fichiers temporaires plus gros que ce nombre de\n" "kilooctets." -#: utils/misc/guc.c:3557 +#: utils/misc/guc_tables.c:3399 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "" "Zéro trace toutes les requêtes. La valeur par défaut est -1 (désactivant\n" "cette fonctionnalité)." -#: utils/misc/guc.c:3567 +#: utils/misc/guc_tables.c:3409 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Configure la taille réservée pour pg_stat_activity.query, en octets." -#: utils/misc/guc.c:3578 +#: utils/misc/guc_tables.c:3420 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Configure la taille maximale de la pending list d'un index GIN." -#: utils/misc/guc.c:3589 +#: utils/misc/guc_tables.c:3431 msgid "TCP user timeout." msgstr "Délai d'attente maximal TCP utilisateur." -#: utils/misc/guc.c:3600 +#: utils/misc/guc_tables.c:3442 msgid "The size of huge page that should be requested." msgstr "La taille du Huge Page devant être réclamé." -#: utils/misc/guc.c:3611 +#: utils/misc/guc_tables.c:3453 msgid "Aggressively flush system caches for debugging purposes." msgstr "Vide agressivement les caches systèmes pour du débogage." -#: utils/misc/guc.c:3634 +#: utils/misc/guc_tables.c:3476 msgid "Sets the time interval between checks for disconnection while running queries." msgstr "Configure l'intervalle de temps entre des vérifications de déconnexion lors de l'exécution de requêtes." -#: utils/misc/guc.c:3645 +#: utils/misc/guc_tables.c:3487 msgid "Time between progress updates for long-running startup operations." msgstr "Durée entre des mises à jour de progression pour les opérations longues de démarrage." -#: utils/misc/guc.c:3647 +#: utils/misc/guc_tables.c:3489 #, fuzzy #| msgid "Zero prints all queries. -1 turns this feature off." msgid "0 turns this feature off." msgstr "Zéro affiche toutes les requêtes. -1 désactive cette fonctionnalité." -#: utils/misc/guc.c:3666 +#: utils/misc/guc_tables.c:3499 +#, fuzzy +#| msgid "Sets the seed for random-number generation." +msgid "Sets the iteration count for SCRAM secret generation." +msgstr "Initialise la clé pour la génération de nombres aléatoires." + +#: utils/misc/guc_tables.c:3519 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "" "Initialise l'estimation du planificateur pour le coût d'une page disque\n" "récupérée séquentiellement." -#: utils/misc/guc.c:3677 +#: utils/misc/guc_tables.c:3530 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "" "Initialise l'estimation du plnnificateur pour le coût d'une page disque\n" "récupérée non séquentiellement." -#: utils/misc/guc.c:3688 +#: utils/misc/guc_tables.c:3541 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "" "Initialise l'estimation du planificateur pour le coût d'exécution sur chaque\n" "ligne." -#: utils/misc/guc.c:3699 +#: utils/misc/guc_tables.c:3552 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "" "Initialise l'estimation du planificateur pour le coût de traitement de\n" "chaque ligne indexée lors d'un parcours d'index." -#: utils/misc/guc.c:3710 +#: utils/misc/guc_tables.c:3563 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "" "Initialise l'estimation du planificateur pour le coût de traitement de\n" "chaque opérateur ou appel de fonction." -#: utils/misc/guc.c:3721 +#: utils/misc/guc_tables.c:3574 msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." msgstr "Configure l'estimation du planificateur pour le coût de passage de chaque ligne d'un processus worker vers son processus leader." -#: utils/misc/guc.c:3732 +#: utils/misc/guc_tables.c:3585 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "Initialise l'estimation du planificateur pour le coût de démarrage des processus d'exécution de requêtes parallèles." -#: utils/misc/guc.c:3744 +#: utils/misc/guc_tables.c:3597 msgid "Perform JIT compilation if query is more expensive." msgstr "Effectuer une compilation JIT si la requête est plus coûteuse." -#: utils/misc/guc.c:3745 +#: utils/misc/guc_tables.c:3598 msgid "-1 disables JIT compilation." msgstr "-1 désactive la compilation JIT." -#: utils/misc/guc.c:3755 +#: utils/misc/guc_tables.c:3608 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "Optimise les fonctions compilées avec JIT si la requête est plus coûteuse." -#: utils/misc/guc.c:3756 +#: utils/misc/guc_tables.c:3609 msgid "-1 disables optimization." msgstr "-1 désactive l'optimisation." -#: utils/misc/guc.c:3766 +#: utils/misc/guc_tables.c:3619 msgid "Perform JIT inlining if query is more expensive." msgstr "Effectuer un inlining JIT si la requête est plus coûteuse." -#: utils/misc/guc.c:3767 +#: utils/misc/guc_tables.c:3620 msgid "-1 disables inlining." msgstr "-1 désactive l'inlining." -#: utils/misc/guc.c:3777 +#: utils/misc/guc_tables.c:3630 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "Initialise l'estimation du planificateur de la fraction des lignes d'un curseur à récupérer." -#: utils/misc/guc.c:3789 +#: utils/misc/guc_tables.c:3642 #, fuzzy #| msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgid "Sets the planner's estimate of the average size of a recursive query's working table." msgstr "Initialise l'estimation du planificateur de la fraction des lignes d'un curseur à récupérer." -#: utils/misc/guc.c:3801 +#: utils/misc/guc_tables.c:3654 msgid "GEQO: selective pressure within the population." msgstr "GEQO : pression sélective dans la population." -#: utils/misc/guc.c:3812 +#: utils/misc/guc_tables.c:3665 msgid "GEQO: seed for random path selection." msgstr "GEQO : graine pour la sélection du chemin aléatoire." -#: utils/misc/guc.c:3823 +#: utils/misc/guc_tables.c:3676 msgid "Multiple of work_mem to use for hash tables." msgstr "Multiple de work_mem à utiliser pour les tables de hachage." -#: utils/misc/guc.c:3834 +#: utils/misc/guc_tables.c:3687 msgid "Multiple of the average buffer usage to free per round." msgstr "Multiplede l'utilisation moyenne des tampons à libérer à chaque tour." -#: utils/misc/guc.c:3844 +#: utils/misc/guc_tables.c:3697 msgid "Sets the seed for random-number generation." msgstr "Initialise la clé pour la génération de nombres aléatoires." -#: utils/misc/guc.c:3855 +#: utils/misc/guc_tables.c:3708 msgid "Vacuum cost delay in milliseconds." msgstr "Délai d'un coût de VACUUM en millisecondes." -#: utils/misc/guc.c:3866 +#: utils/misc/guc_tables.c:3719 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Délai d'un coût de VACUUM en millisecondes, pour autovacuum." -#: utils/misc/guc.c:3877 +#: utils/misc/guc_tables.c:3730 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "" "Nombre de lignes modifiées ou supprimées avant d'exécuter un VACUUM\n" "(fraction de reltuples)." -#: utils/misc/guc.c:3887 +#: utils/misc/guc_tables.c:3740 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "Nombre de lignes insérées avant d'effectuer un VACUUM (fraction de reltuples)." -#: utils/misc/guc.c:3897 +#: utils/misc/guc_tables.c:3750 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "" "Nombre de lignes insérées, mises à jour ou supprimées avant d'analyser\n" "une fraction de reltuples." -#: utils/misc/guc.c:3907 +#: utils/misc/guc_tables.c:3760 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "" "Temps passé à vider les tampons lors du point de vérification, en tant que\n" "fraction de l'intervalle du point de vérification." -#: utils/misc/guc.c:3917 +#: utils/misc/guc_tables.c:3770 msgid "Fraction of statements exceeding log_min_duration_sample to be logged." msgstr "Fraction de requêtes dépassant log_min_duration_sample à tracer" -#: utils/misc/guc.c:3918 +#: utils/misc/guc_tables.c:3771 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "Utilisez une valeur entre 0,0 (pas de trace) et 1.0 (tracer tout)." -#: utils/misc/guc.c:3927 +#: utils/misc/guc_tables.c:3780 msgid "Sets the fraction of transactions from which to log all statements." msgstr "Configure la fraction des transactions pour lesquelles il faut tracer toutes les requêtes" -#: utils/misc/guc.c:3928 +#: utils/misc/guc_tables.c:3781 msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." msgstr "Utiliser une valeur entre 0.0 (aucune trace) et 1.0 (trace tous les requêtes de toutes les transactions)." -#: utils/misc/guc.c:3947 +#: utils/misc/guc_tables.c:3800 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "La commande shell qui sera appelée pour archiver un journal de transaction." -#: utils/misc/guc.c:3948 +#: utils/misc/guc_tables.c:3801 msgid "This is used only if \"archive_library\" is not set." msgstr "Ceci est utilisé seulement si « archive_library » n'est pas configuré." -#: utils/misc/guc.c:3957 +#: utils/misc/guc_tables.c:3810 #, fuzzy #| msgid "Sets the shell command that will be called to archive a WAL file." msgid "Sets the library that will be called to archive a WAL file." msgstr "La commande shell qui sera appelée pour archiver un journal de transaction." -#: utils/misc/guc.c:3958 +#: utils/misc/guc_tables.c:3811 msgid "An empty string indicates that \"archive_command\" should be used." msgstr "Une chaîne vide indique que « archive_command » devrait être utilisé." -#: utils/misc/guc.c:3967 +#: utils/misc/guc_tables.c:3820 msgid "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "Définit la commande shell qui sera appelée pour récupérer un fichier WAL archivé." -#: utils/misc/guc.c:3977 +#: utils/misc/guc_tables.c:3830 msgid "Sets the shell command that will be executed at every restart point." msgstr "Définit la commande shell qui sera appelée à chaque point de reprise (restart point)." -#: utils/misc/guc.c:3987 +#: utils/misc/guc_tables.c:3840 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "Définit la commande shell qui sera appelée une fois à la fin de la restauration." -#: utils/misc/guc.c:3997 +#: utils/misc/guc_tables.c:3850 msgid "Specifies the timeline to recover into." msgstr "Définit la timeline cible de la restauration." -#: utils/misc/guc.c:4007 +#: utils/misc/guc_tables.c:3860 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "Positionner à « immediate » pour arrêter la restauration dès qu'un état consistent est atteint." -#: utils/misc/guc.c:4016 +#: utils/misc/guc_tables.c:3869 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "Définit l'identifiant de transaction jusqu'où la restauration s'effectuera." -#: utils/misc/guc.c:4025 +#: utils/misc/guc_tables.c:3878 msgid "Sets the time stamp up to which recovery will proceed." msgstr "Définit le point dans le temps jusqu'où la restauration s'effectuera." -#: utils/misc/guc.c:4034 +#: utils/misc/guc_tables.c:3887 msgid "Sets the named restore point up to which recovery will proceed." msgstr "Définit le point de restauration nommé jusqu'où la restauration va procéder." -#: utils/misc/guc.c:4043 +#: utils/misc/guc_tables.c:3896 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "Définit le LSN des journaux de transactions jusqu'où la restauration s'effectuera." -# trigger_file -#: utils/misc/guc.c:4053 -msgid "Specifies a file name whose presence ends recovery in the standby." -msgstr "Définit un nom de fichier dont la présence termine la restauration du serveur secondaire." - -#: utils/misc/guc.c:4063 +#: utils/misc/guc_tables.c:3906 msgid "Sets the connection string to be used to connect to the sending server." msgstr "Définit la chaîne de connexion à utiliser pour se connecter au serveur émetteur." -#: utils/misc/guc.c:4074 +#: utils/misc/guc_tables.c:3917 msgid "Sets the name of the replication slot to use on the sending server." msgstr "Définit le nom du slot de réplication à utiliser sur le serveur émetteur." -#: utils/misc/guc.c:4084 +#: utils/misc/guc_tables.c:3927 msgid "Sets the client's character set encoding." msgstr "Initialise l'encodage du client." -#: utils/misc/guc.c:4095 +#: utils/misc/guc_tables.c:3938 msgid "Controls information prefixed to each log line." msgstr "Contrôle l'information préfixée sur chaque ligne de trace." -#: utils/misc/guc.c:4096 +#: utils/misc/guc_tables.c:3939 msgid "If blank, no prefix is used." msgstr "Si vide, aucun préfixe n'est utilisé." -#: utils/misc/guc.c:4105 +#: utils/misc/guc_tables.c:3948 msgid "Sets the time zone to use in log messages." msgstr "Initialise le fuseau horaire à utiliser pour les journaux applicatifs." -#: utils/misc/guc.c:4115 +#: utils/misc/guc_tables.c:3958 msgid "Sets the display format for date and time values." msgstr "Initialise le format d'affichage des valeurs date et time." -#: utils/misc/guc.c:4116 +#: utils/misc/guc_tables.c:3959 msgid "Also controls interpretation of ambiguous date inputs." -msgstr "Contrôle aussi l'interprétation des dates ambigües en entrée." +msgstr "Contrôle aussi l'interprétation des dates ambiguës en entrée." -#: utils/misc/guc.c:4127 +#: utils/misc/guc_tables.c:3970 msgid "Sets the default table access method for new tables." msgstr "Définit la méthode d'accès par défaut pour les nouvelles tables." -#: utils/misc/guc.c:4138 +#: utils/misc/guc_tables.c:3981 msgid "Sets the default tablespace to create tables and indexes in." msgstr "Initialise le tablespace par défaut pour créer les tables et index." -#: utils/misc/guc.c:4139 +#: utils/misc/guc_tables.c:3982 msgid "An empty string selects the database's default tablespace." msgstr "Une chaîne vide sélectionne le tablespace par défaut de la base de données." -#: utils/misc/guc.c:4149 +#: utils/misc/guc_tables.c:3992 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "" "Initialise le(s) tablespace(s) à utiliser pour les tables temporaires et les\n" "fichiers de tri." -#: utils/misc/guc.c:4160 +#: utils/misc/guc_tables.c:4003 +msgid "Sets whether a CREATEROLE user automatically grants the role to themselves, and with which options." +msgstr "" + +#: utils/misc/guc_tables.c:4015 msgid "Sets the path for dynamically loadable modules." msgstr "Initialise le chemin des modules chargeables dynamiquement." -#: utils/misc/guc.c:4161 +#: utils/misc/guc_tables.c:4016 msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." msgstr "" "Si un module chargeable dynamiquement a besoin d'être ouvert et que le nom\n" "spécifié n'a pas une composante répertoire (c'est-à-dire que le nom ne\n" "contient pas un '/'), le système cherche le fichier spécifié sur ce chemin." -#: utils/misc/guc.c:4174 +#: utils/misc/guc_tables.c:4029 msgid "Sets the location of the Kerberos server key file." -msgstr "Initalise l'emplacement du fichier de la clé serveur pour Kerberos." +msgstr "Initialise l'emplacement du fichier de la clé serveur pour Kerberos." -#: utils/misc/guc.c:4185 +#: utils/misc/guc_tables.c:4040 msgid "Sets the Bonjour service name." msgstr "Initialise le nom du service Bonjour." -#: utils/misc/guc.c:4197 -msgid "Shows the collation order locale." -msgstr "Affiche la locale de tri et de groupement." - -#: utils/misc/guc.c:4208 -msgid "Shows the character classification and case conversion locale." -msgstr "Affiche la classification des caractères et la locale de conversions." - -#: utils/misc/guc.c:4219 +#: utils/misc/guc_tables.c:4050 msgid "Sets the language in which messages are displayed." msgstr "Initialise le langage dans lequel les messages sont affichés." -#: utils/misc/guc.c:4229 +#: utils/misc/guc_tables.c:4060 msgid "Sets the locale for formatting monetary amounts." -msgstr "Initialise la locale pour le formattage des montants monétaires." +msgstr "Initialise la locale pour le formatage des montants monétaires." -#: utils/misc/guc.c:4239 +#: utils/misc/guc_tables.c:4070 msgid "Sets the locale for formatting numbers." msgstr "Initialise la locale pour formater les nombres." -#: utils/misc/guc.c:4249 +#: utils/misc/guc_tables.c:4080 msgid "Sets the locale for formatting date and time values." msgstr "Initialise la locale pour formater les valeurs date et time." -#: utils/misc/guc.c:4259 +#: utils/misc/guc_tables.c:4090 msgid "Lists shared libraries to preload into each backend." msgstr "Liste les bibliothèques partagées à précharger dans chaque processus serveur." -#: utils/misc/guc.c:4270 +#: utils/misc/guc_tables.c:4101 msgid "Lists shared libraries to preload into server." msgstr "Liste les bibliothèques partagées à précharger dans le serveur." -#: utils/misc/guc.c:4281 +#: utils/misc/guc_tables.c:4112 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "Liste les bibliothèques partagées non privilégiées à précharger dans chaque processus serveur." -#: utils/misc/guc.c:4292 +#: utils/misc/guc_tables.c:4123 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "" "Initialise l'ordre de recherche des schémas pour les noms qui ne précisent\n" "pas le schéma." -#: utils/misc/guc.c:4304 +#: utils/misc/guc_tables.c:4135 msgid "Shows the server (database) character set encoding." msgstr "Affiche l'encodage des caractères pour le serveur (base de données)." -#: utils/misc/guc.c:4316 +#: utils/misc/guc_tables.c:4147 msgid "Shows the server version." msgstr "Affiche la version du serveur." -#: utils/misc/guc.c:4328 +#: utils/misc/guc_tables.c:4159 msgid "Sets the current role." msgstr "Initialise le rôle courant." -#: utils/misc/guc.c:4340 +#: utils/misc/guc_tables.c:4171 msgid "Sets the session user name." msgstr "Initialise le nom de l'utilisateur de la session." -#: utils/misc/guc.c:4351 +#: utils/misc/guc_tables.c:4182 msgid "Sets the destination for server log output." msgstr "Initialise la destination des journaux applicatifs du serveur." -#: utils/misc/guc.c:4352 +#: utils/misc/guc_tables.c:4183 #, fuzzy #| msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." @@ -29503,607 +30475,359 @@ msgstr "" "Les valeurs valides sont une combinaison de « stderr », « syslog »,\n" "« csvlog » et « eventlog », suivant la plateforme." -#: utils/misc/guc.c:4363 +#: utils/misc/guc_tables.c:4194 msgid "Sets the destination directory for log files." msgstr "Initialise le répertoire de destination pour les journaux applicatifs." -#: utils/misc/guc.c:4364 +#: utils/misc/guc_tables.c:4195 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "Accepte un chemin relatif ou absolu pour le répertoire des données." -#: utils/misc/guc.c:4374 +#: utils/misc/guc_tables.c:4205 msgid "Sets the file name pattern for log files." msgstr "Initialise le modèle de nom de fichiers pour les journaux applicatifs." -#: utils/misc/guc.c:4385 +#: utils/misc/guc_tables.c:4216 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "" "Initialise le nom du programme utilisé pour identifier les messages de\n" "PostgreSQL dans syslog." -#: utils/misc/guc.c:4396 +#: utils/misc/guc_tables.c:4227 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "" "Initialise le nom de l'application, utilisé pour identifier les messages de\n" "PostgreSQL dans eventlog." -#: utils/misc/guc.c:4407 +#: utils/misc/guc_tables.c:4238 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "Initialise la zone horaire pour afficher et interpréter les dates/heures." -#: utils/misc/guc.c:4417 +#: utils/misc/guc_tables.c:4248 msgid "Selects a file of time zone abbreviations." msgstr "Sélectionne un fichier contenant les abréviations des fuseaux horaires." -#: utils/misc/guc.c:4427 +#: utils/misc/guc_tables.c:4258 msgid "Sets the owning group of the Unix-domain socket." msgstr "Initialise le groupe d'appartenance du socket domaine Unix." -#: utils/misc/guc.c:4428 +#: utils/misc/guc_tables.c:4259 msgid "The owning user of the socket is always the user that starts the server." msgstr "Le propriétaire du socket est toujours l'utilisateur qui a lancé le serveur." -#: utils/misc/guc.c:4438 +#: utils/misc/guc_tables.c:4269 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Initialise les répertoires où les sockets de domaine Unix seront créés." -#: utils/misc/guc.c:4453 +#: utils/misc/guc_tables.c:4280 msgid "Sets the host name or IP address(es) to listen to." msgstr "Initialise le nom de l'hôte ou l'adresse IP à écouter." -#: utils/misc/guc.c:4468 +#: utils/misc/guc_tables.c:4295 msgid "Sets the server's data directory." msgstr "Initialise le répertoire des données du serveur." -#: utils/misc/guc.c:4479 +#: utils/misc/guc_tables.c:4306 msgid "Sets the server's main configuration file." msgstr "Voir le fichier de configuration principal du serveur." -#: utils/misc/guc.c:4490 +#: utils/misc/guc_tables.c:4317 msgid "Sets the server's \"hba\" configuration file." msgstr "Initialise le fichier de configuration « hba » du serveur." -#: utils/misc/guc.c:4501 +#: utils/misc/guc_tables.c:4328 msgid "Sets the server's \"ident\" configuration file." msgstr "Initialise le fichier de configuration « ident » du serveur." -#: utils/misc/guc.c:4512 +#: utils/misc/guc_tables.c:4339 msgid "Writes the postmaster PID to the specified file." msgstr "Écrit le PID du postmaster PID dans le fichier spécifié." -#: utils/misc/guc.c:4523 +#: utils/misc/guc_tables.c:4350 msgid "Shows the name of the SSL library." msgstr "Affiche le nom de la bibliothèque SSL." -#: utils/misc/guc.c:4538 +#: utils/misc/guc_tables.c:4365 msgid "Location of the SSL server certificate file." msgstr "Emplacement du fichier du certificat serveur SSL." -#: utils/misc/guc.c:4548 +#: utils/misc/guc_tables.c:4375 msgid "Location of the SSL server private key file." msgstr "Emplacement du fichier de la clé privée SSL du serveur." -#: utils/misc/guc.c:4558 +#: utils/misc/guc_tables.c:4385 msgid "Location of the SSL certificate authority file." msgstr "Emplacement du fichier du certificat autorité SSL." -#: utils/misc/guc.c:4568 +#: utils/misc/guc_tables.c:4395 msgid "Location of the SSL certificate revocation list file." msgstr "Emplacement du fichier de liste de révocation des certificats SSL." -#: utils/misc/guc.c:4578 +#: utils/misc/guc_tables.c:4405 msgid "Location of the SSL certificate revocation list directory." msgstr "Emplacement du répertoire de liste de révocation des certificats SSL." -#: utils/misc/guc.c:4588 +#: utils/misc/guc_tables.c:4415 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "Nombre de standbys synchrones et liste des noms des synchrones potentiels." -#: utils/misc/guc.c:4599 +#: utils/misc/guc_tables.c:4426 msgid "Sets default text search configuration." msgstr "Initialise la configuration par défaut de la recherche plein texte." -#: utils/misc/guc.c:4609 +#: utils/misc/guc_tables.c:4436 msgid "Sets the list of allowed SSL ciphers." msgstr "Initialise la liste des chiffrements SSL autorisés." -#: utils/misc/guc.c:4624 +#: utils/misc/guc_tables.c:4451 msgid "Sets the curve to use for ECDH." msgstr "Initialise la courbe à utiliser pour ECDH." -#: utils/misc/guc.c:4639 +#: utils/misc/guc_tables.c:4466 msgid "Location of the SSL DH parameters file." msgstr "Emplacement du fichier des paramètres DH SSL." -#: utils/misc/guc.c:4650 +#: utils/misc/guc_tables.c:4477 msgid "Command to obtain passphrases for SSL." msgstr "Commande pour obtenir la phrase de passe pour SSL." -#: utils/misc/guc.c:4661 +#: utils/misc/guc_tables.c:4488 msgid "Sets the application name to be reported in statistics and logs." msgstr "Configure le nom de l'application à indiquer dans les statistiques et les journaux." -#: utils/misc/guc.c:4672 +#: utils/misc/guc_tables.c:4499 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Configure le nom du cluster, qui est inclus dans le titre du processus." -#: utils/misc/guc.c:4683 +#: utils/misc/guc_tables.c:4510 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "Configure les gestionnaires de ressource des WAL pour lesquels des vérifications de cohérence sont effectuées." -#: utils/misc/guc.c:4684 +#: utils/misc/guc_tables.c:4511 msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." msgstr "Des images complètes de bloc seront tracées pour tous les blocs de données et vérifiées avec le résultat du rejeu des journaux de transactions." -#: utils/misc/guc.c:4694 +#: utils/misc/guc_tables.c:4521 msgid "JIT provider to use." msgstr "Fournisseur JIT à utiliser." -#: utils/misc/guc.c:4705 +#: utils/misc/guc_tables.c:4532 msgid "Log backtrace for errors in these functions." msgstr "Trace la pile pour les erreurs dans ces fonctions." -#: utils/misc/guc.c:4725 +#: utils/misc/guc_tables.c:4543 +msgid "Use direct I/O for file access." +msgstr "" + +#: utils/misc/guc_tables.c:4563 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Indique si « \\' » est autorisé dans une constante de chaîne." -#: utils/misc/guc.c:4735 +#: utils/misc/guc_tables.c:4573 msgid "Sets the output format for bytea." msgstr "Initialise le format de sortie pour bytea." -#: utils/misc/guc.c:4745 +#: utils/misc/guc_tables.c:4583 msgid "Sets the message levels that are sent to the client." msgstr "Initialise les niveaux de message envoyés au client." -#: utils/misc/guc.c:4746 utils/misc/guc.c:4832 utils/misc/guc.c:4843 -#: utils/misc/guc.c:4919 +#: utils/misc/guc_tables.c:4584 utils/misc/guc_tables.c:4680 +#: utils/misc/guc_tables.c:4691 utils/misc/guc_tables.c:4763 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr "" "Chaque niveau inclut les niveaux qui suivent. Plus loin sera le niveau,\n" "moindre sera le nombre de messages envoyés." -#: utils/misc/guc.c:4756 +#: utils/misc/guc_tables.c:4594 #, fuzzy #| msgid "Compute query identifiers." msgid "Enables in-core computation of query identifiers." msgstr "Calcule les identifiants de requête." -#: utils/misc/guc.c:4766 +#: utils/misc/guc_tables.c:4604 msgid "Enables the planner to use constraints to optimize queries." msgstr "Active l'utilisation des contraintes par le planificateur pour optimiser les requêtes." -#: utils/misc/guc.c:4767 +#: utils/misc/guc_tables.c:4605 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." msgstr "" "Les parcours de tables seront ignorés si leur contraintes garantissent\n" "qu'aucune ligne ne correspond à la requête." -#: utils/misc/guc.c:4778 +#: utils/misc/guc_tables.c:4616 msgid "Sets the default compression method for compressible values." msgstr "Définit la méthode de compression par défaut pour les valeurs compressibles." -#: utils/misc/guc.c:4789 +#: utils/misc/guc_tables.c:4627 msgid "Sets the transaction isolation level of each new transaction." msgstr "Initialise le niveau d'isolation des transactions pour chaque nouvelle transaction." -#: utils/misc/guc.c:4799 +#: utils/misc/guc_tables.c:4637 msgid "Sets the current transaction's isolation level." msgstr "Initialise le niveau d'isolation de la transaction courante." -#: utils/misc/guc.c:4810 +#: utils/misc/guc_tables.c:4648 msgid "Sets the display format for interval values." msgstr "Initialise le format d'affichage des valeurs interval." -#: utils/misc/guc.c:4821 +#: utils/misc/guc_tables.c:4659 +msgid "Log level for reporting invalid ICU locale strings." +msgstr "" + +#: utils/misc/guc_tables.c:4669 msgid "Sets the verbosity of logged messages." msgstr "Initialise la verbosité des messages tracés." -#: utils/misc/guc.c:4831 +#: utils/misc/guc_tables.c:4679 msgid "Sets the message levels that are logged." msgstr "Initialise les niveaux de messages tracés." -#: utils/misc/guc.c:4842 +#: utils/misc/guc_tables.c:4690 msgid "Causes all statements generating error at or above this level to be logged." msgstr "" "Génère une trace pour toutes les instructions qui produisent une erreur de\n" "ce niveau ou de niveaux plus importants." -#: utils/misc/guc.c:4853 +#: utils/misc/guc_tables.c:4701 msgid "Sets the type of statements logged." msgstr "Initialise le type d'instructions tracées." -#: utils/misc/guc.c:4863 +#: utils/misc/guc_tables.c:4711 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "" "Initialise le niveau (« facility ») de syslog à utiliser lors de l'activation\n" "de syslog." -#: utils/misc/guc.c:4878 +#: utils/misc/guc_tables.c:4722 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "" "Configure le comportement des sessions pour les triggers et les règles de\n" "ré-écriture." -#: utils/misc/guc.c:4888 +#: utils/misc/guc_tables.c:4732 msgid "Sets the current transaction's synchronization level." msgstr "Initialise le niveau d'isolation de la transaction courante." -#: utils/misc/guc.c:4898 +#: utils/misc/guc_tables.c:4742 msgid "Allows archiving of WAL files using archive_command." msgstr "Autorise l'archivage des journaux de transactions en utilisant archive_command." -#: utils/misc/guc.c:4908 +#: utils/misc/guc_tables.c:4752 msgid "Sets the action to perform upon reaching the recovery target." msgstr "Définit l'action à exécuter à l'arrivée à la cible de la restauration." -#: utils/misc/guc.c:4918 +#: utils/misc/guc_tables.c:4762 msgid "Enables logging of recovery-related debugging information." msgstr "Active les traces sur les informations de débogage relatives à la restauration." -#: utils/misc/guc.c:4935 +#: utils/misc/guc_tables.c:4779 msgid "Collects function-level statistics on database activity." msgstr "Récupère les statistiques niveau fonction sur l'activité de la base de données." -#: utils/misc/guc.c:4946 +#: utils/misc/guc_tables.c:4790 #, fuzzy #| msgid "Sets the default statistics target." msgid "Sets the consistency of accesses to statistics data." msgstr "Initialise la cible par défaut des statistiques." -#: utils/misc/guc.c:4956 +#: utils/misc/guc_tables.c:4800 #, fuzzy #| msgid "Compresses full-page writes written in WAL file." msgid "Compresses full-page writes written in WAL file with specified method." msgstr "Compresse les blocs complets écrits dans les journaux de transactions." -#: utils/misc/guc.c:4966 +#: utils/misc/guc_tables.c:4810 msgid "Sets the level of information written to the WAL." msgstr "Configure le niveau des informations écrites dans les journaux de transactions." -#: utils/misc/guc.c:4976 +#: utils/misc/guc_tables.c:4820 msgid "Selects the dynamic shared memory implementation used." msgstr "Sélectionne l'implémentation de la mémoire partagée dynamique." -#: utils/misc/guc.c:4986 +#: utils/misc/guc_tables.c:4830 msgid "Selects the shared memory implementation used for the main shared memory region." msgstr "Sélectionne l'implémentation de mémoire partagée utilisée pour la principale région de mémoire partagée." -#: utils/misc/guc.c:4996 +#: utils/misc/guc_tables.c:4840 msgid "Selects the method used for forcing WAL updates to disk." msgstr "" "Sélectionne la méthode utilisée pour forcer la mise à jour des journaux de\n" "transactions sur le disque." -#: utils/misc/guc.c:5006 +#: utils/misc/guc_tables.c:4850 msgid "Sets how binary values are to be encoded in XML." msgstr "Configure comment les valeurs binaires seront codées en XML." -#: utils/misc/guc.c:5016 +#: utils/misc/guc_tables.c:4860 msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." msgstr "" "Configure si les données XML dans des opérations d'analyse et de\n" "sérialisation implicite doivent être considérées comme des documents\n" "ou des fragments de contenu." -#: utils/misc/guc.c:5027 +#: utils/misc/guc_tables.c:4871 msgid "Use of huge pages on Linux or Windows." msgstr "Utilisation des HugePages sur Linux ou Windows." -#: utils/misc/guc.c:5037 +#: utils/misc/guc_tables.c:4881 #, fuzzy #| msgid "cannot execute %s during recovery" msgid "Prefetch referenced blocks during recovery." msgstr "ne peut pas exécuté %s lors de la restauration" -#: utils/misc/guc.c:5038 +#: utils/misc/guc_tables.c:4882 msgid "Look ahead in the WAL to find references to uncached data." msgstr "Recherche en avant dans le WAL pour trouver des références à des données non présentes en cache." -#: utils/misc/guc.c:5047 -msgid "Forces use of parallel query facilities." -msgstr "Force l'utilisation des fonctionnalités de requête parallèle." +#: utils/misc/guc_tables.c:4891 +#, fuzzy +#| msgid "Enables the planner's use of parallel append plans." +msgid "Forces the planner's use parallel query nodes." +msgstr "Active l'utilisation de plans Append parallèles par le planificateur." -#: utils/misc/guc.c:5048 -msgid "If possible, run query using a parallel worker and with parallel restrictions." -msgstr "Si possible, exécute des requêtes utilisant des processus parallèles et avec les restrictions parallèles." +#: utils/misc/guc_tables.c:4892 +msgid "This can be useful for testing the parallel query infrastructure by forcing the planner to generate plans that contain nodes that perform tuple communication between workers and the main process." +msgstr "" -#: utils/misc/guc.c:5058 +#: utils/misc/guc_tables.c:4904 msgid "Chooses the algorithm for encrypting passwords." msgstr "Choisit l'algorithme pour le chiffrement des mots de passe." -#: utils/misc/guc.c:5068 +#: utils/misc/guc_tables.c:4914 msgid "Controls the planner's selection of custom or generic plan." msgstr "Contrôle le choix par le planificateur du plan personnalisé ou du plan générique." -#: utils/misc/guc.c:5069 +#: utils/misc/guc_tables.c:4915 msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." msgstr "Les requêtes préparées peuvent avoir des plans particulier et générique, et le planificateur tentera de choisir le meilleur. Ceci peut être utilisé pour remplacer le comportement par défaut." -#: utils/misc/guc.c:5081 +#: utils/misc/guc_tables.c:4927 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "Définit la version minimale du protocole SSL/TLS à utiliser." -#: utils/misc/guc.c:5093 +#: utils/misc/guc_tables.c:4939 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "Définit la version maximum du protocole SSL/TLS à utiliser." -#: utils/misc/guc.c:5105 +#: utils/misc/guc_tables.c:4951 msgid "Sets the method for synchronizing the data directory before crash recovery." msgstr "Configure la méthode de synchronisation du répertoire de données avant la restauration après crash." -#: utils/misc/guc.c:5680 utils/misc/guc.c:5696 -#, c-format -msgid "invalid configuration parameter name \"%s\"" -msgstr "paramètre de configuration « %s » invalide" - -#: utils/misc/guc.c:5682 -#, c-format -msgid "Custom parameter names must be two or more simple identifiers separated by dots." -msgstr "Les noms de paramètres personnalisés doivent avoir deux ou plusieurs identifiants simples séparés par des points." - -#: utils/misc/guc.c:5698 -#, fuzzy, c-format -#| msgid "\"%s\" is a procedure." -msgid "\"%s\" is a reserved prefix." -msgstr "« %s » est une procédure." - -#: utils/misc/guc.c:5712 -#, c-format -msgid "unrecognized configuration parameter \"%s\"" -msgstr "paramètre de configuration « %s » non reconnu" - -#: utils/misc/guc.c:6104 -#, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n" - -#: utils/misc/guc.c:6109 -#, c-format -msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" -msgstr "Lancer initdb ou pg_basebackup pour initialiser un répertoire de données PostgreSQL.\n" - -#: utils/misc/guc.c:6129 -#, c-format -msgid "" -"%s does not know where to find the server configuration file.\n" -"You must specify the --config-file or -D invocation option or set the PGDATA environment variable.\n" -msgstr "" -"%s ne sait pas où trouver le fichier de configuration du serveur.\n" -"Vous devez soit spécifier l'option --config-file, soit spécifier l'option -D, soit initialiser la variable d'environnement PGDATA.\n" - -#: utils/misc/guc.c:6148 -#, c-format -msgid "%s: could not access the server configuration file \"%s\": %s\n" -msgstr "%s : n'a pas pu accéder au fichier de configuration « %s » : %s\n" - -#: utils/misc/guc.c:6174 -#, c-format -msgid "" -"%s does not know where to find the database system data.\n" -"This can be specified as \"data_directory\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" -msgstr "" -"%s ne sait pas où trouver les données du système de bases de données.\n" -"Il est configurable avec « data_directory » dans « %s » ou avec l'option -D ou encore avec la variable d'environnement PGDATA.\n" - -#: utils/misc/guc.c:6222 -#, c-format -msgid "" -"%s does not know where to find the \"hba\" configuration file.\n" -"This can be specified as \"hba_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" -msgstr "" -"%s ne sait pas où trouver le fichier de configuration « hba ».\n" -"Il est configurable avec « hba_file » dans « %s » ou avec l'option -D ou encore avec la variable d'environnement PGDATA.\n" - -#: utils/misc/guc.c:6245 -#, c-format -msgid "" -"%s does not know where to find the \"ident\" configuration file.\n" -"This can be specified as \"ident_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" -msgstr "" -"%s ne sait pas où trouver le fichier de configuration « hba ».\n" -"Il est configurable avec « ident_file » dans « %s » ou avec l'option -D ou encore avec la variable d'environnement PGDATA.\n" - -#: utils/misc/guc.c:7176 -msgid "Value exceeds integer range." -msgstr "La valeur dépasse l'échelle des entiers." - -#: utils/misc/guc.c:7412 -#, c-format -msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d%s%s est en dehors des limites valides pour le paramètre « %s » (%d .. %d)" - -#: utils/misc/guc.c:7448 -#, c-format -msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" -msgstr "%g%s%s est en dehors des limites valides pour le paramètre « %s » (%g .. %g)" - -#: utils/misc/guc.c:7648 utils/misc/guc.c:9096 -#, c-format -msgid "cannot set parameters during a parallel operation" -msgstr "ne peut pas configurer les paramètres lors d'une opération parallèle" - -#: utils/misc/guc.c:7665 utils/misc/guc.c:8920 -#, c-format -msgid "parameter \"%s\" cannot be changed" -msgstr "le paramètre « %s » ne peut pas être changé" - -#: utils/misc/guc.c:7698 -#, c-format -msgid "parameter \"%s\" cannot be changed now" -msgstr "le paramètre « %s » ne peut pas être modifié maintenant" - -#: utils/misc/guc.c:7725 utils/misc/guc.c:7783 utils/misc/guc.c:8896 -#: utils/misc/guc.c:11795 -#, c-format -msgid "permission denied to set parameter \"%s\"" -msgstr "droit refusé pour initialiser le paramètre « %s »" - -#: utils/misc/guc.c:7763 -#, c-format -msgid "parameter \"%s\" cannot be set after connection start" -msgstr "le paramètre « %s » ne peut pas être initialisé après le lancement du serveur" - -#: utils/misc/guc.c:7822 -#, c-format -msgid "cannot set parameter \"%s\" within security-definer function" +#: utils/misc/guc_tables.c:4960 +msgid "Forces immediate streaming or serialization of changes in large transactions." msgstr "" -"ne peut pas configurer le paramètre « %s » à l'intérieur d'une fonction\n" -"SECURITY DEFINER" - -#: utils/misc/guc.c:8475 utils/misc/guc.c:8522 utils/misc/guc.c:10001 -#, fuzzy, c-format -#| msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" -msgid "must be superuser or have privileges of pg_read_all_settings to examine \"%s\"" -msgstr "doit être super-utilisateur ou membre de pg_read_all_settings pour examiner « %s »" - -#: utils/misc/guc.c:8606 -#, c-format -msgid "SET %s takes only one argument" -msgstr "SET %s prend un seul argument" - -#: utils/misc/guc.c:8886 -#, fuzzy, c-format -#| msgid "permission denied for operator %s" -msgid "permission denied to perform ALTER SYSTEM RESET ALL" -msgstr "droit refusé pour l'opérateur %s" - -#: utils/misc/guc.c:8953 -#, c-format -msgid "parameter value for ALTER SYSTEM must not contain a newline" -msgstr "la valeur du paramètre pour ALTER SYSTEM ne doit pas contenir de caractère de retour à la ligne" - -#: utils/misc/guc.c:8998 -#, c-format -msgid "could not parse contents of file \"%s\"" -msgstr "n'a pas pu analyser le contenu du fichier « %s »" - -#: utils/misc/guc.c:9172 -#, c-format -msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" -msgstr "SET LOCAL TRANSACTION SNAPSHOT n'est pas implémenté" - -#: utils/misc/guc.c:9259 -#, c-format -msgid "SET requires parameter name" -msgstr "SET requiert le nom du paramètre" - -#: utils/misc/guc.c:9392 -#, c-format -msgid "attempt to redefine parameter \"%s\"" -msgstr "tentative de redéfinition du paramètre « %s »" - -#: utils/misc/guc.c:9719 -#, fuzzy, c-format -#| msgid "invalid configuration parameter name \"%s\"" -msgid "invalid configuration parameter name \"%s\", removing it" -msgstr "paramètre de configuration « %s » invalide" - -#: utils/misc/guc.c:9721 -#, fuzzy, c-format -#| msgid "\"%s\" is not a regular file" -msgid "\"%s\" is now a reserved prefix." -msgstr "« %s » n'est pas un fichier standard" - -#: utils/misc/guc.c:11235 -#, c-format -msgid "while setting parameter \"%s\" to \"%s\"" -msgstr "lors de la configuration du paramètre « %s » en « %s »" - -#: utils/misc/guc.c:11404 -#, c-format -msgid "parameter \"%s\" could not be set" -msgstr "le paramètre « %s » n'a pas pu être configuré" - -#: utils/misc/guc.c:11496 -#, c-format -msgid "could not parse setting for parameter \"%s\"" -msgstr "n'a pas pu analyser la configuration du paramètre « %s »" - -#: utils/misc/guc.c:11927 -#, c-format -msgid "invalid value for parameter \"%s\": %g" -msgstr "valeur invalide pour le paramètre « %s » : %g" - -#: utils/misc/guc.c:12240 -#, c-format -msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." -msgstr "« temp_buffers » ne peut pas être modifié après que des tables temporaires aient été utilisées dans la session." - -#: utils/misc/guc.c:12252 -#, c-format -msgid "Bonjour is not supported by this build" -msgstr "Bonjour n'est pas supporté dans cette installation" - -#: utils/misc/guc.c:12265 -#, c-format -msgid "SSL is not supported by this build" -msgstr "SSL n'est pas supporté dans cette installation" - -#: utils/misc/guc.c:12277 -#, c-format -msgid "Cannot enable parameter when \"log_statement_stats\" is true." -msgstr "Ne peut pas activer le paramètre avec « log_statement_stats » à true." -#: utils/misc/guc.c:12289 -#, c-format -msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." +#: utils/misc/guc_tables.c:4961 +msgid "On the publisher, it allows streaming or serializing each change in logical decoding. On the subscriber, it allows serialization of all changes to files and notifies the parallel apply workers to read and apply them at the end of the transaction." msgstr "" -"Ne peut pas activer « log_statement_stats » lorsque « log_parser_stats »,\n" -"« log_planner_stats » ou « log_executor_stats » est true." - -#: utils/misc/guc.c:12519 -#, c-format -msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." -msgstr "effective_io_concurrency doit être positionné à 0 sur les plateformes où manque posix_fadvise()" - -#: utils/misc/guc.c:12532 -#, c-format -msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." -msgstr "maintenance_io_concurrency doit être positionné à 0 sur les plateformes où manque posix_fadvise()" - -#: utils/misc/guc.c:12546 -#, c-format -msgid "huge_page_size must be 0 on this platform." -msgstr "huge_page_size doit valoir 0 sur cette plateforme" - -#: utils/misc/guc.c:12558 -#, fuzzy, c-format -#| msgid "client_connection_check_interval must be set to 0 on platforms that lack POLLRDHUP." -msgid "client_connection_check_interval must be set to 0 on this platform." -msgstr "client_connection_check_interval doit être positionné à 0 sur les plateformes où POLLRDHUP manque" - -#: utils/misc/guc.c:12670 -#, c-format -msgid "invalid character" -msgstr "caractère invalide" - -#: utils/misc/guc.c:12730 -#, c-format -msgid "recovery_target_timeline is not a valid number." -msgstr "recovery_target_timeline n'est pas un nombre valide ." - -#: utils/misc/guc.c:12770 -#, c-format -msgid "multiple recovery targets specified" -msgstr "multiples cibles de restauration spécifiées" - -#: utils/misc/guc.c:12771 -#, c-format -msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." -msgstr "Une seule valeur peut être spécifiée, parmi recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid." - -#: utils/misc/guc.c:12779 -#, c-format -msgid "The only allowed value is \"immediate\"." -msgstr "La seule valeur autorisée est « immediate »." -#: utils/misc/help_config.c:130 +#: utils/misc/help_config.c:129 #, c-format msgid "internal error: unrecognized run-time parameter type\n" msgstr "erreur interne : type de paramètre d'exécution non reconnu\n" -#: utils/misc/pg_controldata.c:60 utils/misc/pg_controldata.c:138 -#: utils/misc/pg_controldata.c:241 utils/misc/pg_controldata.c:306 +#: utils/misc/pg_controldata.c:51 utils/misc/pg_controldata.c:91 +#: utils/misc/pg_controldata.c:182 utils/misc/pg_controldata.c:223 #, c-format msgid "calculated CRC checksum does not match value stored in file" msgstr "la somme de contrôle CRC calculée ne correspond par à la valeur enregistrée dans le fichier" @@ -30205,25 +30929,25 @@ msgstr "" msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "@INCLUDE sans nom de fichier dans le fichier des fuseaux horaires « %s », ligne %d" -#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:239 +#: utils/mmgr/aset.c:446 utils/mmgr/generation.c:206 utils/mmgr/slab.c:367 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Échec lors de la création du contexte mémoire « %s »." -#: utils/mmgr/dsa.c:519 utils/mmgr/dsa.c:1329 +#: utils/mmgr/dsa.c:532 utils/mmgr/dsa.c:1346 #, c-format msgid "could not attach to dynamic shared area" msgstr "n'a pas pu attacher le segment de mémoire partagée dynamique" -#: utils/mmgr/mcxt.c:889 utils/mmgr/mcxt.c:925 utils/mmgr/mcxt.c:963 -#: utils/mmgr/mcxt.c:1001 utils/mmgr/mcxt.c:1089 utils/mmgr/mcxt.c:1120 -#: utils/mmgr/mcxt.c:1156 utils/mmgr/mcxt.c:1208 utils/mmgr/mcxt.c:1243 -#: utils/mmgr/mcxt.c:1278 +#: utils/mmgr/mcxt.c:1047 utils/mmgr/mcxt.c:1083 utils/mmgr/mcxt.c:1121 +#: utils/mmgr/mcxt.c:1159 utils/mmgr/mcxt.c:1247 utils/mmgr/mcxt.c:1278 +#: utils/mmgr/mcxt.c:1314 utils/mmgr/mcxt.c:1503 utils/mmgr/mcxt.c:1548 +#: utils/mmgr/mcxt.c:1605 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "Échec d'une requête de taille %zu dans le contexte mémoire « %s »." -#: utils/mmgr/mcxt.c:1052 +#: utils/mmgr/mcxt.c:1210 #, c-format msgid "logging memory contexts of PID %d" msgstr "trace des contextes mémoires du PID %d" @@ -30258,59 +30982,42 @@ msgstr "ne peut pas supprimer le portail actif « %s »" msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "ne peut pas préparer une transaction qui a créé un curseur WITH HOLD" -#: utils/mmgr/portalmem.c:1232 +#: utils/mmgr/portalmem.c:1230 #, c-format msgid "cannot perform transaction commands inside a cursor loop that is not read-only" msgstr "ne peut pas effectuer de commandes de transaction dans une boucle de curseur qui n'est pas en lecture seule" -#: utils/sort/logtape.c:266 utils/sort/logtape.c:289 +#: utils/sort/logtape.c:266 utils/sort/logtape.c:287 #, c-format msgid "could not seek to block %ld of temporary file" msgstr "n'a pas pu se positionner sur le bloc %ld du fichier temporaire" -#: utils/sort/logtape.c:295 -#, c-format -msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" -msgstr "n'a pas pu lire le bloc %ld du fichier temporaire : a lu seulement %zu octets sur %zu" - -#: utils/sort/sharedtuplestore.c:432 utils/sort/sharedtuplestore.c:441 -#: utils/sort/sharedtuplestore.c:464 utils/sort/sharedtuplestore.c:481 -#: utils/sort/sharedtuplestore.c:498 -#, c-format -msgid "could not read from shared tuplestore temporary file" -msgstr "n'a pas pu lire le fichier temporaire tuplestore partagé : %m" - -#: utils/sort/sharedtuplestore.c:487 +#: utils/sort/sharedtuplestore.c:467 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "tronçon non attendu dans le fichier temporaire tuplestore partagé" -#: utils/sort/sharedtuplestore.c:572 +#: utils/sort/sharedtuplestore.c:549 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "n'a pas pu lire le bloc %u dans le fichier temporaire tuplestore partagé" -#: utils/sort/sharedtuplestore.c:579 -#, c-format -msgid "could not read from shared tuplestore temporary file: read only %zu of %zu bytes" -msgstr "n'a pas pu lire le fichier temporaire tuplestore partagé : a lu seulement %zu octets sur %zu" - -#: utils/sort/tuplesort.c:3322 +#: utils/sort/tuplesort.c:2372 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "ne peut pas avoir plus de %d exécutions pour un tri externe" -#: utils/sort/tuplesort.c:4425 +#: utils/sort/tuplesortvariants.c:1363 #, c-format msgid "could not create unique index \"%s\"" msgstr "n'a pas pu créer l'index unique « %s »" -#: utils/sort/tuplesort.c:4427 +#: utils/sort/tuplesortvariants.c:1365 #, c-format msgid "Key %s is duplicated." msgstr "La clé %s est dupliquée." -#: utils/sort/tuplesort.c:4428 +#: utils/sort/tuplesortvariants.c:1366 #, c-format msgid "Duplicate keys exist." msgstr "Des clés dupliquées existent." @@ -30324,4084 +31031,52 @@ msgstr "Des clés dupliquées existent." msgid "could not seek in tuplestore temporary file" msgstr "n'a pas pu se déplacer dans le fichier temporaire tuplestore" -#: utils/sort/tuplestore.c:1477 utils/sort/tuplestore.c:1540 -#: utils/sort/tuplestore.c:1548 -#, c-format -msgid "could not read from tuplestore temporary file: read only %zu of %zu bytes" -msgstr "n'a pas pu lire le fichier temporaire tuplestore : a lu seulement %zu octets sur %zu" - -#: utils/time/snapmgr.c:570 +#: utils/time/snapmgr.c:571 #, c-format msgid "The source transaction is not running anymore." msgstr "La transaction source n'est plus en cours d'exécution." -#: utils/time/snapmgr.c:1164 +#: utils/time/snapmgr.c:1166 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "ne peut pas exporter un snapshot dans un sous-transaction" -#: utils/time/snapmgr.c:1323 utils/time/snapmgr.c:1328 -#: utils/time/snapmgr.c:1333 utils/time/snapmgr.c:1348 -#: utils/time/snapmgr.c:1353 utils/time/snapmgr.c:1358 -#: utils/time/snapmgr.c:1373 utils/time/snapmgr.c:1378 -#: utils/time/snapmgr.c:1383 utils/time/snapmgr.c:1485 -#: utils/time/snapmgr.c:1501 utils/time/snapmgr.c:1526 +#: utils/time/snapmgr.c:1325 utils/time/snapmgr.c:1330 +#: utils/time/snapmgr.c:1335 utils/time/snapmgr.c:1350 +#: utils/time/snapmgr.c:1355 utils/time/snapmgr.c:1360 +#: utils/time/snapmgr.c:1375 utils/time/snapmgr.c:1380 +#: utils/time/snapmgr.c:1385 utils/time/snapmgr.c:1487 +#: utils/time/snapmgr.c:1503 utils/time/snapmgr.c:1528 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "données invalides du snapshot dans le fichier « %s »" -#: utils/time/snapmgr.c:1420 +#: utils/time/snapmgr.c:1422 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "SET TRANSACTION SNAPSHOT doit être appelé avant toute requête" -#: utils/time/snapmgr.c:1429 +#: utils/time/snapmgr.c:1431 #, c-format msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" msgstr "une transaction important un snapshot doit avoir le niveau d'isolation SERIALIZABLE ou REPEATABLE READ" -#: utils/time/snapmgr.c:1438 utils/time/snapmgr.c:1447 +#: utils/time/snapmgr.c:1440 utils/time/snapmgr.c:1449 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "identifiant invalide du snapshot : « %s »" -#: utils/time/snapmgr.c:1539 +#: utils/time/snapmgr.c:1541 #, c-format msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" msgstr "une transaction sérialisable ne peut pas importer un snapshot provenant d'une transaction non sérialisable" -#: utils/time/snapmgr.c:1543 +#: utils/time/snapmgr.c:1545 #, c-format msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" msgstr "une transaction sérialisable en écriture ne peut pas importer un snapshot provenant d'une transaction en lecture seule" -#: utils/time/snapmgr.c:1558 +#: utils/time/snapmgr.c:1560 #, c-format msgid "cannot import a snapshot from a different database" msgstr "ne peut pas importer un snapshot à partir d'une base de données différente" - -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide, puis quitte\n" - -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version, puis quitte\n" - -#~ msgid " -A 1|0 enable/disable run-time assert checking\n" -#~ msgstr "" -#~ " -A 1|0 active/désactive la vérification des limites (assert) à\n" -#~ " l'exécution\n" - -#~ msgid " -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" -#~ msgstr " -o OPTIONS passe « OPTIONS » à chaque processus serveur (obsolète)\n" - -#, c-format -#~ msgid " -x NUM internal use\n" -#~ msgstr " -x NUM utilisation interne\n" - -#~ msgid " in schema %s" -#~ msgstr " dans le schéma %s" - -#~ msgid "\"%s\" has now caught up with upstream server" -#~ msgstr "« %s » a maintenant rattrapé le serveur en amont" - -#, c-format -#~ msgid "\"%s\" is a system table" -#~ msgstr "« %s » est une table système" - -#~ msgid "\"%s\" is already an attribute of type %s" -#~ msgstr "« %s » est déjà un attribut du type %s" - -#~ msgid "\"%s\" is not a table or a view" -#~ msgstr "« %s » n'est pas une table ou une vue" - -#, c-format -#~ msgid "\"%s\" is not a table or foreign table" -#~ msgstr "« %s » n'est ni une table ni une table distante" - -#, c-format -#~ msgid "\"%s\" is not a table or partitioned index" -#~ msgstr "« %s » n'est ni une table ni un index partitionné" - -#, c-format -#~ msgid "\"%s\" is not a table or view" -#~ msgstr "« %s » n'est ni une table ni une vue" - -#, c-format -#~ msgid "\"%s\" is not a table, composite type, or foreign table" -#~ msgstr "« %s » n'est ni une table, ni un type composite, ni une table distante" - -#~ msgid "\"%s\" is not a table, materialized view, composite type, or foreign table" -#~ msgstr "« %s » n'est ni une table, ni une vue matérialisée, ni un type composite, ni une table distante" - -#, c-format -#~ msgid "\"%s\" is not a table, materialized view, index, or foreign table" -#~ msgstr "« %s » n'est ni une table, ni une vue matérialisée, ni un index, ni une table distante" - -#, c-format -#~ msgid "\"%s\" is not a table, materialized view, index, or partitioned index" -#~ msgstr "« %s » n'est ni une table, ni une vue matérialisée, ni un index, ni un index partitionné" - -#, c-format -#~ msgid "\"%s\" is not a table, materialized view, index, partitioned index, or foreign table" -#~ msgstr "« %s » n'est ni une table, ni une vue matérialisée, ni un index, ni un index partitionné, ni une table distante" - -#, c-format -#~ msgid "\"%s\" is not a table, materialized view, or foreign table" -#~ msgstr "« %s » n'est ni une table, ni une vue matérialisée, ni une table distante" - -#, c-format -#~ msgid "\"%s\" is not a table, materialized view, or index" -#~ msgstr "« %s » n'est ni une table, ni une vue matérialisée, ni un index" - -#, c-format -#~ msgid "\"%s\" is not a table, view, materialized view, composite type, index, or foreign table" -#~ msgstr "« %s » n'est ni une table, ni une vue, ni une vue matérialisée, ni un type composite, ni un index, ni une table distante" - -#, c-format -#~ msgid "\"%s\" is not a table, view, materialized view, composite type, or foreign table" -#~ msgstr "« %s » n'est ni une table, ni une vue, ni une vue matérialisée, ni un type composite, ni une table distante" - -#, c-format -#~ msgid "\"%s\" is not a table, view, materialized view, index, or TOAST table" -#~ msgstr "« %s » n'est ni une table, ni une vue, ni une vue matérialisée, ni un index, ni une table TOAST" - -#, c-format -#~ msgid "\"%s\" is not a table, view, materialized view, or index" -#~ msgstr "« %s » n'est ni une table, ni une vue, ni une vue matérialisée, ni une séquence, ni une table distante" - -#, c-format -#~ msgid "\"%s\" is not a table, view, materialized view, sequence, or foreign table" -#~ msgstr "« %s » n'est ni une table, ni une vue, ni une vue matérialisée, ni une séquence, ni une table distante" - -#~ msgid "\"%s\" is not a table, view, or composite type" -#~ msgstr "« %s » n'est pas une table, une vue ou un type composite" - -#, c-format -#~ msgid "\"%s\" is not a table, view, or foreign table" -#~ msgstr "« %s » n'est ni une table, ni une vue, ni une table distante" - -#, c-format -#~ msgid "\"%s\" is not a table, view, sequence, or foreign table" -#~ msgstr "« %s » n'est ni une table, ni une vue, ni une séquence, ni une table distante" - -#, c-format -#~ msgid "\"%s\" is of the wrong type" -#~ msgstr "« %s » est du mauvais type" - -#~ msgid "\"%s\": moved %u row versions, truncated %u to %u pages" -#~ msgstr "« %s » : %u versions de ligne déplacées, %u pages tronquées sur %u" - -#~ msgid "\"%s\": removed %.0f row versions in %u pages" -#~ msgstr "« %s » : %.0f versions de ligne supprimées dans %u pages" - -#~ msgid "\"%s\": removed %d dead item identifiers in %u pages" -#~ msgstr "« %s »: %d versions de lignes mortes supprimées dans %u blocs" - -#, c-format -#~ msgid "\"%s.%s\" is a foreign table." -#~ msgstr "« %s.%s » est une table distante." - -#~ msgid "\"%s.%s\" is a partitioned table." -#~ msgstr "« %s.%s » est une table partitionnée." - -#, c-format -#~ msgid "\"%s.%s\" is not a table." -#~ msgstr "« %s.%s » n'est pas une table." - -#~ msgid "\"TZ\"/\"tz\" not supported" -#~ msgstr "« TZ »/« tz » non supporté" - -#~ msgid "\"TZ\"/\"tz\"/\"OF\" format patterns are not supported in to_date" -#~ msgstr "les motifs de format « TZ »/« tz »/« OF » ne sont pas supportés dans to_date" - -#~ msgid "\"interval\" time zone \"%s\" not valid" -#~ msgstr "le fuseau horaire « %s » n'est pas valide pour le type « interval »" - -#, c-format -#~ msgid "\"time with time zone\" units \"%s\" not recognized" -#~ msgstr "unités « %s » non reconnues pour le type « time with time zone »" - -#, c-format -#~ msgid "\"time\" units \"%s\" not recognized" -#~ msgstr "unités « %s » non reconnues pour le type « time »" - -#~ msgid "\"timeout\" must not be negative or zero" -#~ msgstr "« timeout » ne doit pas être négatif ou nul" - -#~ msgid "" -#~ "%.0f dead row versions cannot be removed yet.\n" -#~ "Nonremovable row versions range from %lu to %lu bytes long.\n" -#~ "There were %.0f unused item pointers.\n" -#~ "Total free space (including removable row versions) is %.0f bytes.\n" -#~ "%u pages are or will become empty, including %u at the end of the table.\n" -#~ "%u pages containing %.0f free bytes are potential move destinations.\n" -#~ "%s." -#~ msgstr "" -#~ "%.0f versions de lignes mortes ne peuvent pas encore être supprimées.\n" -#~ "Les versions non supprimables de ligne vont de %lu to %lu octets.\n" -#~ "Il existait %.0f pointeurs d'éléments inutilisés.\n" -#~ "L'espace libre total (incluant les versions supprimables de ligne) est de\n" -#~ "%.0f octets.\n" -#~ "%u pages sont ou deviendront vides, ceci incluant %u pages en fin de la\n" -#~ "table.\n" -#~ "%u pages contenant %.0f octets libres sont des destinations de déplacement\n" -#~ "disponibles.\n" -#~ "%s." - -#~ msgid "" -#~ "%.0f dead row versions cannot be removed yet.\n" -#~ "There were %.0f unused item pointers.\n" -#~ "%u pages are entirely empty.\n" -#~ "%s." -#~ msgstr "" -#~ "%.0f versions de lignes mortes ne peuvent pas encore être supprimées.\n" -#~ "Il y avait %.0f pointeurs d'éléments inutilisés.\n" -#~ "%u pages sont entièrement vides.\n" -#~ "%s." - -#, c-format -#~ msgid "%lld dead row versions cannot be removed yet, oldest xmin: %u\n" -#~ msgstr "%lld versions de lignes mortes ne peuvent pas encore être supprimées, plus ancien xmin : %u\n" - -#~ msgid "%s \"%s\": return code %d" -#~ msgstr "%s « %s » : code de retour %d" - -#~ msgid "%s %s will create implicit index \"%s\" for table \"%s\"" -#~ msgstr "%s %s créera un index implicite « %s » pour la table « %s »" - -#~ msgid "%s (%x)" -#~ msgstr "%s (%x)" - -#~ msgid "%s (PID %d) was terminated by signal %d" -#~ msgstr "%s (PID %d) a été arrêté par le signal %d" - -#~ msgid "%s already exists in schema \"%s\"" -#~ msgstr "%s existe déjà dans le schéma « %s »" - -#~ msgid "%s cannot be executed from a function or multi-command string" -#~ msgstr "" -#~ "%s ne peut pas être exécuté à partir d'une fonction ou d'une chaîne\n" -#~ "contenant plusieurs commandes" - -#~ msgid "%s failed: %m" -#~ msgstr "échec de %s : %m" - -#~ msgid "%s in publication %s" -#~ msgstr "%s dans la publication %s" - -#~ msgid "%s is already in schema \"%s\"" -#~ msgstr "%s existe déjà dans le schéma « %s »" - -#~ msgid "%s will create implicit sequence \"%s\" for serial column \"%s.%s\"" -#~ msgstr "%s créera des séquences implicites « %s » pour la colonne serial « %s.%s »" - -#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n" -#~ msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n" - -#~ msgid "%s: could not allocate SIDs: error code %lu\n" -#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n" - -#~ msgid "%s: could not create restricted token: error code %lu\n" -#~ msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n" - -#~ msgid "%s: could not determine user name (GetUserName failed)\n" -#~ msgstr "%s : n'a pas pu déterminer le nom de l'utilisateur (GetUserName a échoué)\n" - -#~ msgid "%s: could not dissociate from controlling TTY: %s\n" -#~ msgstr "%s : n'a pas pu se dissocier du TTY contrôlant : %s\n" - -#~ msgid "%s: could not fork background process: %s\n" -#~ msgstr "%s : n'a pas pu créer un processus fils : %s\n" - -#~ msgid "%s: could not fsync file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n" - -#~ msgid "%s: could not get exit code from subprocess: error code %lu\n" -#~ msgstr "%s : n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu\n" - -#~ msgid "%s: could not open directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" - -#~ msgid "%s: could not open file \"%s\" for reading: %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n" - -#~ msgid "%s: could not open file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" - -#~ msgid "%s: could not open log file \"%s/%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s/%s » : %s\n" - -#~ msgid "%s: could not open process token: error code %lu\n" -#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n" - -#~ msgid "%s: could not re-execute with restricted token: error code %lu\n" -#~ msgstr "%s : n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu\n" - -#~ msgid "%s: could not read directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" - -#~ msgid "%s: could not read file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le fichier « %s » : %s\n" - -#~ msgid "%s: could not read file \"%s\": read %d of %d\n" -#~ msgstr "%s : n'a pas pu lire le fichier « %s » : a lu %d sur %d\n" - -#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu renommer le fichier « %s » en « %s » : %s\n" - -#~ msgid "%s: could not start process for command \"%s\": error code %lu\n" -#~ msgstr "%s : n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu\n" - -#~ msgid "%s: could not stat file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n" - -#~ msgid "%s: invalid effective UID: %d\n" -#~ msgstr "%s : UID effectif invalide : %d\n" - -#~ msgid "%s: max_wal_senders must be less than max_connections\n" -#~ msgstr "%s : max_wal_senders doit être inférieur à max_connections\n" - -#~ msgid "%s: setsysinfo failed: %s\n" -#~ msgstr "%s : setsysinfo a échoué : %s\n" - -#~ msgid "%s: the number of buffers (-B) must be at least twice the number of allowed connections (-N) and at least 16\n" -#~ msgstr "" -#~ "%s : le nombre de tampons (-B) doit être au moins deux fois le nombre de\n" -#~ "connexions disponibles (-N) et au moins 16\n" - -#, c-format -#~ msgid "%u frozen page.\n" -#~ msgid_plural "%u frozen pages.\n" -#~ msgstr[0] "%u page gelée.\n" -#~ msgstr[1] "%u pages gelées.\n" - -#~ msgid "%u page is entirely empty.\n" -#~ msgid_plural "%u pages are entirely empty.\n" -#~ msgstr[0] "%u page est entièrement vide.\n" -#~ msgstr[1] "%u pages sont entièrement vides.\n" - -#~ msgid "%u page removed.\n" -#~ msgid_plural "%u pages removed.\n" -#~ msgstr[0] "%u bloc supprimé.\n" -#~ msgstr[1] "%u blocs supprimés.\n" - -#~ msgid "%u transaction needs to finish." -#~ msgid_plural "%u transactions need to finish." -#~ msgstr[0] "La transaction %u doit se terminer." -#~ msgstr[1] "Les transactions %u doivent se terminer." - -#~ msgid "=> is deprecated as an operator name" -#~ msgstr "=> est un nom d'opérateur obsolète" - -#~ msgid "@@ operator does not support lexeme weight restrictions in GIN index searches" -#~ msgstr "" -#~ "l'opérateur @@ ne supporte pas les restrictions de poids de lexeme dans les\n" -#~ "recherches par index GIN" - -#~ msgid "A function returning \"anyrange\" must have at least one \"anyrange\" argument." -#~ msgstr "Une fonction renvoyant « anyrange » doit avoir au moins un argument du type « anyrange »." - -#~ msgid "A function returning \"internal\" must have at least one \"internal\" argument." -#~ msgstr "Une fonction renvoyant « internal » doit avoir au moins un argument du type « internal »." - -#~ msgid "A function returning ANYRANGE must have at least one ANYRANGE argument." -#~ msgstr "" -#~ "Une fonction renvoyant ANYRANGE doit avoir au moins un argument du type\n" -#~ "ANYRANGE." - -#~ msgid "A function returning a polymorphic type must have at least one polymorphic argument." -#~ msgstr "Une fonction renvoyant un type polymorphique doit avoir au moins un argument de type polymorphique." - -#~ msgid "" -#~ "A total of %.0f page slots are in use (including overhead).\n" -#~ "%.0f page slots are required to track all free space.\n" -#~ "Current limits are: %d page slots, %d relations, using %.0f kB." -#~ msgstr "" -#~ "Un total de %.0f emplacements de pages est utilisé (ceci incluant la\n" -#~ "surcharge).\n" -#~ "%.0f emplacements de pages sont requis pour tracer tout l'espace libre.\n" -#~ "Les limites actuelles sont : %d emplacements de pages, %d relations,\n" -#~ "utilisant %.0f Ko." - -#~ msgid "ALTER TYPE USING is only supported on plain tables" -#~ msgstr "ALTER TYPE USING est seulement supportés sur les tables standards" - -#~ msgid "AM/PM hour must be between 1 and 12" -#~ msgstr "l'heure AM/PM doit être compris entre 1 et 12" - -#~ msgid "Adding partitioned tables to publications is not supported." -#~ msgstr "Ajouter des tables partitionnées à des publications n'est pas supporté." - -#~ msgid "All SQL statements that cause an error of the specified level or a higher level are logged." -#~ msgstr "" -#~ "Toutes les instructions SQL causant une erreur du niveau spécifié ou d'un\n" -#~ "niveau supérieur sont tracées." - -#~ msgid "An aggregate returning a polymorphic type must have at least one polymorphic argument." -#~ msgstr "Un agrégat renvoyant un type polymorphique doit avoir au moins un argument de type polymorphique." - -#~ msgid "An aggregate using a polymorphic transition type must have at least one polymorphic argument." -#~ msgstr "Un agrégat utilisant un type de transition polymorphique doit avoir au moins un argument polymorphique." - -#~ msgid "Anyone can use the client-side lo_export() provided by libpq." -#~ msgstr "Tout le monde peut utiliser lo_export(), fournie par libpq, du côté client." - -#~ msgid "Anyone can use the client-side lo_import() provided by libpq." -#~ msgstr "Tout le monde peut utiliser lo_import(), fourni par libpq, du côté client." - -#~ msgid "Apr" -#~ msgstr "Avr" - -#~ msgid "April" -#~ msgstr "Avril" - -#~ msgid "Aug" -#~ msgstr "Aoû" - -#~ msgid "August" -#~ msgstr "Août" - -#~ msgid "Automatic log file rotation will occur after N kilobytes." -#~ msgstr "La rotation automatique des journaux applicatifs s'effectuera après N kilooctets." - -#~ msgid "Automatic log file rotation will occur after N minutes." -#~ msgstr "La rotation automatique des journaux applicatifs s'effectuera toutes les N minutes." - -#~ msgid "Automatically adds missing table references to FROM clauses." -#~ msgstr "" -#~ "Ajoute automatiquement les références à la table manquant dans les clauses\n" -#~ "FROM." - -#, c-format -#~ msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" -#~ msgstr "BKPIMAGE_IS_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" - -#~ msgid "COPY BINARY is not supported to stdout or from stdin" -#~ msgstr "COPY BINARY n'est pas supporté vers stdout ou à partir de stdin" - -#, c-format -#~ msgid "COPY HEADER available only in CSV mode" -#~ msgstr "COPY HEADER disponible uniquement en mode CSV" - -#~ msgid "CREATE TABLE AS cannot specify INTO" -#~ msgstr "CREATE TABLE AS ne peut pas spécifier INTO" - -#~ msgid "CREATE TABLE AS specifies too many column names" -#~ msgstr "CREATE TABLE AS spécifie trop de noms de colonnes" - -#~ msgid "CREATE_REPLICATION_SLOT ... EXPORT_SNAPSHOT must not be called inside a transaction" -#~ msgstr "CREATE_REPLICATION_SLOT ... EXPORT_SNAPSHOT ne doit pas être appelé dans une sous-transaction" - -#~ msgid "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT must be called before any query" -#~ msgstr "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT doit être appelé avant toute requête" - -#~ msgid "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT must be called inside a transaction" -#~ msgstr "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT doit être appelé dans une transaction" - -#~ msgid "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT must not be called in a subtransaction" -#~ msgstr "CREATE_REPLICATION_SLOT ... USE_SNAPSHOT ne doit pas être appelé dans une sous-transaction" - -#~ msgid "Causes subtables to be included by default in various commands." -#~ msgstr "" -#~ "Fait que les sous-tables soient incluses par défaut dans les différentes\n" -#~ "commandes." - -#~ msgid "Certificates will not be checked against revocation list." -#~ msgstr "Les certificats ne seront pas vérifiés avec la liste de révocation." - -#~ msgid "Client Connection Defaults" -#~ msgstr "Valeurs par défaut pour les connexions client" - -#~ msgid "Close open transactions soon to avoid wraparound problems." -#~ msgstr "" -#~ "Fermez les transactions ouvertes rapidement pour éviter des problèmes de\n" -#~ "réinitialisation." - -#, c-format -#~ msgid "Compile with --with-gssapi to use GSSAPI connections." -#~ msgstr "Compilez avec --with-gssapi pour utiliser les connexions GSSAPI." - -#, c-format -#~ msgid "Compile with --with-ssl to use SSL connections." -#~ msgstr "Compilez avec --with-ssl pour utiliser les connexions SSL." - -#~ msgid "Connections and Authentication" -#~ msgstr "Connexions et authentification" - -#~ msgid "Consider increasing the configuration parameter \"checkpoint_segments\"." -#~ msgstr "Considèrez l'augmentation du paramètre « checkpoint_segments »." - -#~ msgid "Consider increasing the configuration parameter \"max_fsm_pages\" to a value over %.0f." -#~ msgstr "" -#~ "Considérez l'augmentation du paramètre de configuration « max_fsm_pages »\n" -#~ "à une valeur supérieure à %.0f." - -#~ msgid "Consider using VACUUM FULL on this relation or increasing the configuration parameter \"max_fsm_pages\"." -#~ msgstr "" -#~ "Pensez à compacter cette relation en utilisant VACUUM FULL ou à augmenter le\n" -#~ "paramètre de configuration « max_fsm_pages »." - -#~ msgid "Consider using pg_logfile_rotate(), which is part of core, instead." -#~ msgstr "Considérer l'utilisation de pg_logfile_rotate(), qui est présent par défaut, à la place." - -#~ msgid "Create new tables with OIDs by default." -#~ msgstr "Crée des nouvelles tables avec des OID par défaut." - -#~ msgid "DECLARE CURSOR cannot specify INTO" -#~ msgstr "DECLARE CURSOR ne peut pas spécifier INTO" - -#~ msgid "DEFAULT can only appear in a VALUES list within INSERT" -#~ msgstr "DEFAULT peut seulement apparaître dans la liste VALUES comprise dans un INSERT" - -#~ msgid "DISTINCT is supported only for single-argument aggregates" -#~ msgstr "DISTINCT est seulement supporté pour les agrégats à un seul argument" - -#~ msgid "DROP ASSERTION is not yet implemented" -#~ msgstr "DROP ASSERTION n'est pas encore implémenté" - -#~ msgid "Dec" -#~ msgstr "Déc" - -#~ msgid "December" -#~ msgstr "Décembre" - -#, c-format -#~ msgid "Did you mean to use pg_stop_backup('t')?" -#~ msgstr "Souhaitiez-vous utiliser pg_stop_backup('t') ?" - -#~ msgid "During recovery, allows connections and queries. During normal running, causes additional info to be written to WAL to enable hot standby mode on WAL standby nodes." -#~ msgstr "" -#~ "Lors de la restauration, autorise les connexions et les requêtes. Lors d'une\n" -#~ "exécution normale, fait que des informations supplémentaires sont écrites dans\n" -#~ "les journaux de transactions pour activer le mode Hot Standby sur les nÅ“uds\n" -#~ "en attente." - -#~ msgid "EXPLAIN option BUFFERS requires ANALYZE" -#~ msgstr "l'option BUFFERS d'EXPLAIN nécessite ANALYZE" - -#~ msgid "Each SQL transaction has an isolation level, which can be either \"read uncommitted\", \"read committed\", \"repeatable read\", or \"serializable\"." -#~ msgstr "" -#~ "Chaque transaction SQL a un niveau d'isolation qui peut être soit « read\n" -#~ "uncommitted », soit « read committed », soit « repeatable read », soit\n" -#~ "« serializable »." - -#~ msgid "Each session can be either \"origin\", \"replica\", or \"local\"." -#~ msgstr "Chaque session peut valoir soit « origin » soit « replica » soit « local »." - -#~ msgid "Either set wal_level to \"replica\" on the master, or turn off hot_standby here." -#~ msgstr "" -#~ "Vous devez soit positionner le paramètre wal_level à « replica » sur le maître,\n" -#~ "soit désactiver le hot_standby ici." - -#~ msgid "Emit a warning for constructs that changed meaning since PostgreSQL 9.4." -#~ msgstr "Émet un avertissement pour les constructions dont la signification a changé depuis PostgreSQL 9.4." - -#~ msgid "Enables the planner's use of result caching." -#~ msgstr "Active l'utilisation du cache de résultat par le planificateur." - -#~ msgid "Enables warnings if checkpoint segments are filled more frequently than this." -#~ msgstr "" -#~ "Active des messages d'avertissement si les segments des points de\n" -#~ "vérifications se remplissent plus fréquemment que cette durée." - -#~ msgid "Encrypt passwords." -#~ msgstr "Chiffre les mots de passe." - -#~ msgid "EnumValuesCreate() can only set a single OID" -#~ msgstr "EnumValuesCreate() peut seulement initialiser un seul OID" - -#~ msgid "Expected 1 tuple with 3 fields, got %d tuples with %d fields." -#~ msgstr "Attendait 1 ligne avec 3 champs, a obtenu %d lignes avec %d champs." - -#~ msgid "Expected a transaction log switchpoint location." -#~ msgstr "Attendait un emplacement de bascule dans le journal de transactions." - -#~ msgid "FROM version must be different from installation target version \"%s\"" -#~ msgstr "la version FROM doit être différente de la version cible d'installation « %s »" - -#~ msgid "Feb" -#~ msgstr "Fév" - -#~ msgid "February" -#~ msgstr "Février" - -#, c-format -#~ msgid "File \"%s\" could not be renamed to \"%s\": %m." -#~ msgstr "Le fichier « %s » n'a pas pu être renommé en « %s » : %m." - -#, c-format -#~ msgid "File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed to \"%s\": %m." -#~ msgstr "Le fichier « %s » a été renommé en « %s », mais le fichier « %s » n'a pas pu être renommé en « %s » : %m." - -#~ msgid "File must be owned by the database user and must have no permissions for \"group\" or \"other\"." -#~ msgstr "" -#~ "Le fichier doit appartenir au propriétaire de la base de données et ne doit\n" -#~ "pas avoir de droits pour un groupe ou pour les autres." - -#, c-format -#~ msgid "Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." -#~ msgstr "Les fichiers « %s » et « %s » sont renommés respectivement « %s » et « %s »." - -#~ msgid "For RAID arrays, this should be approximately the number of drive spindles in the array." -#~ msgstr "" -#~ "Pour les systèmes RAID, cela devrait être approximativement le nombre de\n" -#~ "têtes de lecture du système." - -#~ msgid "Forces a switch to the next WAL file if a new file has not been started within N seconds." -#~ msgstr "" -#~ "Force un changement du journal de transaction si un nouveau fichier n'a pas\n" -#~ "été créé depuis N secondes." - -#~ msgid "Found referenced table's DELETE trigger." -#~ msgstr "Trigger DELETE de la table référencée trouvé." - -#~ msgid "Found referenced table's UPDATE trigger." -#~ msgstr "Trigger UPDATE de la table référencée trouvé." - -#~ msgid "Found referencing table's trigger." -#~ msgstr "Trigger de la table référencée trouvé." - -#~ msgid "Fri" -#~ msgstr "Ven" - -#~ msgid "Friday" -#~ msgstr "Vendredi" - -#~ msgid "GIN index does not support search with void query" -#~ msgstr "les index GIN ne supportent pas la recherche avec des requêtes vides" - -#~ msgid "GSSAPI encryption can only be used with gss, trust, or reject authentication methods" -#~ msgstr "le chiffrement GSSAPI ne peut être utilisé qu'avec les méthodes d'authentification gss, trust ou reject" - -#~ msgid "GSSAPI encryption only supports gss, trust, or reject authentication" -#~ msgstr "le chiffrement GSSAPI ne supporte que l'authentification gss, trust ou reject" - -#~ msgid "GSSAPI is not supported in protocol version 2" -#~ msgstr "GSSAPI n'est pas supporté dans le protocole de version 2" - -#~ msgid "GSSAPI not implemented on this server" -#~ msgstr "GSSAPI non implémenté sur ce serveur" - -#, c-format -#~ msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" -#~ msgstr "IDENTIFY_SYSTEM n'a pas été exécuté avant START_REPLICATION" - -#~ msgid "INOUT arguments are permitted." -#~ msgstr "les arguments INOUT ne sont pas autorisés." - -#~ msgid "INSERT ... SELECT cannot specify INTO" -#~ msgstr "INSERT ... SELECT ne peut pas avoir INTO" - -#~ msgid "IS DISTINCT FROM does not support set arguments" -#~ msgstr "IS DISTINCT FROM ne supporte pas les arguments d'ensemble" - -#~ msgid "Ident authentication is not supported on local connections on this platform" -#~ msgstr "l'authentification Ident n'est pas supportée sur les connexions locales sur cette plateforme" - -#~ msgid "Ident protocol identifies remote user as \"%s\"" -#~ msgstr "le protocole Ident identifie l'utilisateur distant comme « %s »" - -#~ msgid "If this parameter is set, the server will automatically run in the background and any controlling terminals are dissociated." -#~ msgstr "" -#~ "Si ce paramètre est initialisé, le serveur sera exécuté automatiquement en\n" -#~ "tâche de fond et les terminaux de contrôles seront dés-associés." - -#~ msgid "If you are not restoring from a backup, try removing the file \"%s/backup_label\"." -#~ msgstr "" -#~ "Si vous n'avez pas pu restaurer une sauvegarde, essayez de supprimer le\n" -#~ "fichier « %s/backup_label »." - -#~ msgid "If you're sure there are no old server processes still running, remove the shared memory block or just delete the file \"%s\"." -#~ msgstr "" -#~ "Si vous êtes sûr qu'aucun processus serveur n'est toujours en cours\n" -#~ "d'exécution, supprimez le bloc de mémoire partagée\n" -#~ "ou supprimez simplement le fichier « %s »." - -#, c-format -#~ msgid "If you're sure there is no backup in progress, remove file \"%s\" and try again." -#~ msgstr "" -#~ "Si vous êtes certain qu'aucune sauvegarde n'est en cours, supprimez le\n" -#~ "fichier « %s » et recommencez de nouveau." - -#~ msgid "Incomplete insertion detected during crash replay." -#~ msgstr "" -#~ "Insertion incomplète détectée lors de la ré-exécution des requêtes suite à\n" -#~ "l'arrêt brutal." - -#~ msgid "Incorrect XLOG_BLCKSZ in page header." -#~ msgstr "XLOG_BLCKSZ incorrect dans l'en-tête de page." - -#~ msgid "Incorrect XLOG_SEG_SIZE in page header." -#~ msgstr "XLOG_SEG_SIZE incorrecte dans l'en-tête de page." - -#~ msgid "Is another postmaster already running on port %d? If not, remove socket file \"%s\" and retry." -#~ msgstr "Un autre postmaster fonctionne-t'il déjà sur le port %d ?Sinon, supprimez le fichier socket « %s » et réessayez." - -#~ msgid "It looks like you need to initdb or install locale support." -#~ msgstr "" -#~ "Il semble que vous avez besoin d'exécuter initdb ou d'installer le support\n" -#~ "des locales." - -#~ msgid "It's just here so that we won't choke on SET AUTOCOMMIT TO ON from 7.3-vintage clients." -#~ msgstr "" -#~ "C'est ici uniquement pour ne pas avoir de problèmes avec le SET AUTOCOMMIT\n" -#~ "TO ON des clients 7.3." - -#~ msgid "JOIN/ON clause refers to \"%s\", which is not part of JOIN" -#~ msgstr "la clause JOIN/ON se réfère à « %s », qui ne fait pas partie du JOIN" - -#~ msgid "JSON does not support infinite date values." -#~ msgstr "JSON ne supporte pas les valeurs infinies de date." - -#~ msgid "JSON does not support infinite timestamp values." -#~ msgstr "JSON ne supporte pas les valeurs infinies de timestamp." - -#~ msgid "Jan" -#~ msgstr "Jan" - -#~ msgid "January" -#~ msgstr "Janvier" - -#~ msgid "Jul" -#~ msgstr "Juil" - -#~ msgid "July" -#~ msgstr "Juillet" - -#~ msgid "Jun" -#~ msgstr "Juin" - -#~ msgid "June" -#~ msgstr "Juin" - -#~ msgid "Kerberos 5 authentication failed for user \"%s\"" -#~ msgstr "authentification Kerberos 5 échouée pour l'utilisateur « %s »" - -#~ msgid "Kerberos 5 not implemented on this server" -#~ msgstr "Kerberos 5 non implémenté sur ce serveur" - -#~ msgid "Kerberos initialization returned error %d" -#~ msgstr "l'initialisation de Kerberos a retourné l'erreur %d" - -#~ msgid "Kerberos keytab resolving returned error %d" -#~ msgstr "la résolution keytab de Kerberos a renvoyé l'erreur %d" - -#~ msgid "Kerberos recvauth returned error %d" -#~ msgstr "recvauth de Kerberos a renvoyé l'erreur %d" - -#~ msgid "Kerberos sname_to_principal(\"%s\", \"%s\") returned error %d" -#~ msgstr "sname_to_principal(« %s », « %s ») de Kerberos a renvoyé l'erreur %d" - -#~ msgid "Kerberos unparse_name returned error %d" -#~ msgstr "unparse_name de Kerberos a renvoyé l'erreur %d" - -#~ msgid "LDAP search failed for filter \"%s\" on server \"%s\": user is not unique (%ld matches)" -#~ msgstr "" -#~ "échec de la recherche LDAP pour le filtre « %s » sur le serveur « %s » :\n" -#~ "utilisateur non unique (%ld correspondances)" - -#~ msgid "Lines should have the format parameter = 'value'." -#~ msgstr "Les lignes devraient avoir le format paramètre = 'valeur'" - -#~ msgid "Lower bound of dimension array must be one." -#~ msgstr "La limite inférieure du tableau doit valoir un." - -#~ msgid "Make sure the root.crt file is present and readable." -#~ msgstr "Assurez-vous que le certificat racine (root.crt) est présent et lisible" - -#~ msgid "Mar" -#~ msgstr "Mar" - -#~ msgid "March" -#~ msgstr "Mars" - -#~ msgid "May" -#~ msgstr "Mai" - -#~ msgid "Mon" -#~ msgstr "Lun" - -#~ msgid "Monday" -#~ msgstr "Lundi" - -#~ msgid "MultiXact member stop limit is now %u based on MultiXact %u" -#~ msgstr "La limite d'arrêt d'un membre MultiXact est maintenant %u, basée sur le MultiXact %u" - -#~ msgid "MultiXactId wrap limit is %u, limited by database with OID %u" -#~ msgstr "La limite de réinitialisation MultiXactId est %u, limité par la base de données d'OID %u" - -#~ msgid "Must be superuser to drop a foreign-data wrapper." -#~ msgstr "Doit être super-utilisateur pour supprimer un wrapper de données distantes." - -#~ msgid "NEW used in query that is not in a rule" -#~ msgstr "NEW utilisé dans une requête qui ne fait pas partie d'une règle" - -#~ msgid "NULLIF does not support set arguments" -#~ msgstr "NULLIF ne supporte pas les arguments d'ensemble" - -#~ msgid "No description available." -#~ msgstr "Aucune description disponible." - -#~ msgid "No rows were found in \"%s\"." -#~ msgstr "Aucune ligne trouvée dans « %s »." - -#~ msgid "Not enough memory for reassigning the prepared transaction's locks." -#~ msgstr "Pas assez de mémoire pour réaffecter les verrous des transactions préparées." - -#~ msgid "Not safe to send CSV data\n" -#~ msgstr "Envoi non sûr des données CSV\n" - -#~ msgid "Nov" -#~ msgstr "Nov" - -#~ msgid "November" -#~ msgstr "Novembre" - -#~ msgid "Number of tuple inserts prior to index cleanup as a fraction of reltuples." -#~ msgstr "" -#~ "Nombre de lignes insérées avant d'effectuer un nettoyage des index\n" -#~ "(fraction de reltuples)." - -#~ msgid "OLD used in query that is not in a rule" -#~ msgstr "OLD utilisé dans une requête qui n'est pas une règle" - -#~ msgid "ON CONFLICT clause is not supported with partitioned tables" -#~ msgstr "la clause ON CONFLICT n'est pas supporté avec les tables partitionnées" - -#~ msgid "ORIGIN message sent out of order" -#~ msgstr "message ORIGIN en désordre" - -#~ msgid "Oct" -#~ msgstr "Oct" - -#~ msgid "October" -#~ msgstr "Octobre" - -#, c-format -#~ msgid "Online backup started with pg_start_backup() must be ended with pg_stop_backup(), and all WAL up to that point must be available at recovery." -#~ msgstr "" -#~ "Une sauvegarde en ligne commencée avec pg_start_backup() doit se terminer avec\n" -#~ "pg_stop_backup() et tous les journaux de transactions générés entre les deux\n" -#~ "doivent être disponibles pour la restauration." - -#~ msgid "Only superusers can use untrusted languages." -#~ msgstr "" -#~ "Seuls les super-utilisateurs peuvent utiliser des langages qui ne sont pas\n" -#~ "de confiance." - -#, c-format -#~ msgid "Only tables can be added to publications." -#~ msgstr "Seules des tables peuvent être ajoutées aux publications." - -#~ msgid "PID %d is among the slowest backends." -#~ msgstr "Le PID %d est parmi les processus serveur les plus lents." - -#~ msgid "Partitioned tables cannot have BEFORE / FOR EACH ROW triggers." -#~ msgstr "Les tables partitionnées ne peuvent pas avoir de triggers BEFORE / FOR EACH ROW." - -#~ msgid "Perhaps out of disk space?" -#~ msgstr "Peut-être manquez-vous de place disque ?" - -#~ msgid "Permissions should be u=rw (0600) or less." -#~ msgstr "Les droits devraient être u=rwx (0600) ou inférieures." - -#~ msgid "Please report this to ." -#~ msgstr "Veuillez rapporter ceci à ." - -#~ msgid "Prints the execution plan to server log." -#~ msgstr "Affiche le plan d'exécution dans les journaux applicatifs du serveur." - -#~ msgid "Prints the parse tree after rewriting to server log." -#~ msgstr "Affiche l'arbre d'analyse après ré-écriture dans les journaux applicatifs du serveur." - -#~ msgid "Prints the parse tree to the server log." -#~ msgstr "Affiche l'arbre d'analyse dans les journaux applicatifs du serveur." - -#~ msgid "Proceeding with relation creation anyway." -#~ msgstr "Poursuit malgré tout la création de la relation." - -#~ msgid "Process %d waits for %s on %s." -#~ msgstr "Le processus %d attend %s sur %s." - -#~ msgid "Process Title" -#~ msgstr "Titre du processus" - -#~ msgid "Query Tuning" -#~ msgstr "Optimisation des requêtes" - -#~ msgid "RANGE FOLLOWING is only supported with UNBOUNDED" -#~ msgstr "RANGE FOLLOWING est seulement supporté avec UNBOUNDED" - -#~ msgid "RANGE PRECEDING is only supported with UNBOUNDED" -#~ msgstr "RANGE PRECEDING est seulement supporté avec UNBOUNDED" - -#~ msgid "REINDEX is not yet implemented for partitioned indexes" -#~ msgstr "REINDEX n'est pas implémenté pour des index partitionnés" - -#~ msgid "REINDEX of partitioned tables is not yet implemented, skipping \"%s\"" -#~ msgstr "REINDEX n'est pas encore implémenté pour les tables partitionnées, « %s » ignoré" - -#~ msgid "RETURNING cannot contain references to other relations" -#~ msgstr "RETURNING ne doit pas contenir de références à d'autres relations" - -#~ msgid "Rebuild the index with REINDEX." -#~ msgstr "Reconstruisez l'index avec REINDEX." - -#~ msgid "Replication" -#~ msgstr "Réplication" - -#~ msgid "Reporting and Logging" -#~ msgstr "Rapports et traces" - -#~ msgid "Resource Usage" -#~ msgstr "Utilisation des ressources" - -#, c-format -#~ msgid "Run pg_stop_backup() and try again." -#~ msgstr "Exécutez pg_stop_backup() et tentez de nouveau." - -#~ msgid "Runs the server silently." -#~ msgstr "Lance le serveur de manière silencieuse." - -#~ msgid "S:May" -#~ msgstr "S:Mai" - -#~ msgid "SASL authentication is not supported in protocol version 2" -#~ msgstr "l'authentification SASL n'est pas supportée dans le protocole de version 2" - -#~ msgid "SELECT FOR UPDATE/SHARE cannot be used with foreign table \"%s\"" -#~ msgstr "SELECT FOR UPDATE/SHARE ne peut pas être utilisé avec une table distante « %s »" - -#~ msgid "SELECT FOR UPDATE/SHARE is not allowed in subqueries" -#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé dans les sous-requêtes" - -#~ msgid "SELECT FOR UPDATE/SHARE is not allowed with GROUP BY clause" -#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé avec la clause GROUP BY" - -#~ msgid "SELECT FOR UPDATE/SHARE is not allowed with HAVING clause" -#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé avec la clause HAVING" - -#~ msgid "SELECT FOR UPDATE/SHARE is not allowed with aggregate functions" -#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé avec les fonctions d'agrégats" - -#~ msgid "SELECT FOR UPDATE/SHARE is not allowed with window functions" -#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas autorisé avec les fonctions window" - -#~ msgid "SELECT FOR UPDATE/SHARE is not supported for inheritance queries" -#~ msgstr "SELECT FOR UPDATE/SHARE n'est pas supporté pour les requêtes d'héritage" - -#~ msgid "SELECT FOR UPDATE/SHARE is not supported within a query with multiple result relations" -#~ msgstr "" -#~ "SELECT FOR UPDATE/SHARE n'est pas supporté dans une requête avec plusieurs\n" -#~ "relations" - -#~ msgid "SSL certificate revocation list file \"%s\" ignored" -#~ msgstr "liste de révocation des certificats SSL « %s » ignorée" - -#~ msgid "SSL certificate revocation list file \"%s\" not found, skipping: %s" -#~ msgstr "liste de révocation des certificats SSL « %s » introuvable, continue : %s" - -#~ msgid "SSL connection from \"%s\"" -#~ msgstr "connexion SSL de « %s »" - -#~ msgid "SSL failed to renegotiate connection before limit expired" -#~ msgstr "SSL a échoué à renégotier la connexion avant l'expiration du délai" - -#~ msgid "SSL failure during renegotiation start" -#~ msgstr "échec SSL au début de la re-négotiation" - -#~ msgid "SSL handshake failure on renegotiation, retrying" -#~ msgstr "échec du handshake SSL lors de la renégotiation, nouvelle tentative" - -#~ msgid "SSL library does not support certificate revocation lists." -#~ msgstr "La bibliothèque SSL ne supporte pas les listes de révocation des certificats." - -#~ msgid "SSL off" -#~ msgstr "SSL inactif" - -#~ msgid "SSL on" -#~ msgstr "SSL actif" - -#~ msgid "SSL renegotiation failure" -#~ msgstr "échec lors de la re-négotiation SSL" - -#~ msgid "SSPI error %x" -#~ msgstr "erreur SSPI : %x" - -#~ msgid "SSPI is not supported in protocol version 2" -#~ msgstr "SSPI n'est pas supporté dans le protocole de version 2" - -#~ msgid "Sat" -#~ msgstr "Sam" - -#~ msgid "Saturday" -#~ msgstr "Samedi" - -#~ msgid "Security-barrier views are not automatically updatable." -#~ msgstr "Les vues avec barrière de sécurité ne sont pas automatiquement disponibles en écriture." - -#~ msgid "See server log for details." -#~ msgstr "Voir les journaux applicatifs du serveur pour plus de détails." - -#~ msgid "Sep" -#~ msgstr "Sep" - -#~ msgid "September" -#~ msgstr "Septembre" - -#~ msgid "Server has FLOAT4PASSBYVAL = %s, library has %s." -#~ msgstr "Le serveur a FLOAT4PASSBYVAL = %s, la bibliothèque a %s." - -#~ msgid "Set dynamic_shared_memory_type to a value other than \"none\"." -#~ msgstr "Configurez dynamic_shared_memory_type à une valeur autre que « none »." - -#~ msgid "Sets immediate fsync at commit." -#~ msgstr "Configure un fsync immédiat lors du commit." - -#~ msgid "Sets realm to match Kerberos and GSSAPI users against." -#~ msgstr "" -#~ "Indique le royaume pour l'authentification des utilisateurs via Kerberos et\n" -#~ "GSSAPI." - -#~ msgid "Sets the hostname of the Kerberos server." -#~ msgstr "Initalise le nom d'hôte du serveur Kerberos." - -#~ msgid "Sets the language used in DO statement if LANGUAGE is not specified." -#~ msgstr "" -#~ "Configure le langage utilisé dans une instruction DO si la clause LANGUAGE n'est\n" -#~ "pas spécifiée." - -#~ msgid "Sets the list of known custom variable classes." -#~ msgstr "Initialise la liste des classes variables personnalisées connues." - -#~ msgid "Sets the maximum distance in log segments between automatic WAL checkpoints." -#~ msgstr "" -#~ "Initialise la distance maximale dans les journaux de transaction entre chaque\n" -#~ "point de vérification (checkpoints) des journaux." - -#~ msgid "Sets the maximum number of tables and indexes for which free space is tracked." -#~ msgstr "" -#~ "Initialise le nombre maximum de tables et index pour lesquels l'espace libre\n" -#~ "est tracé." - -#~ msgid "Sets the maximum number of tuples to be sorted using replacement selection." -#~ msgstr "Configure le nombre maximum de lignes à trier en utilisant la sélection de remplacement." - -#~ msgid "Sets the name of the Kerberos service." -#~ msgstr "Initialise le nom du service Kerberos." - -#~ msgid "Sets the regular expression \"flavor\"." -#~ msgstr "Initialise l'expression rationnelle « flavor »." - -#, c-format -#~ msgid "Skipped %u page due to buffer pins, " -#~ msgid_plural "Skipped %u pages due to buffer pins, " -#~ msgstr[0] "Ignore %u page à cause des verrous de blocs, " -#~ msgstr[1] "Ignore %u pages à cause des verrous de blocs, " - -#~ msgid "Specify a USING expression to perform the conversion." -#~ msgstr "Donnez une expression USING pour réaliser la conversion." - -#~ msgid "Specify a relation name as well as a rule name." -#~ msgstr "Spécifier un nom de relation ainsi qu'un nom de règle." - -#~ msgid "Statistics" -#~ msgstr "Statistiques" - -#~ msgid "Sun" -#~ msgstr "Dim" - -#~ msgid "Sunday" -#~ msgstr "Dimanche" - -#, c-format -#~ msgid "System tables cannot be added to publications." -#~ msgstr "Les tables systèmes ne peuvent pas être ajoutées à une publication." - -#~ msgid "Table contains duplicated values." -#~ msgstr "La table contient des valeurs dupliquées." - -#~ msgid "The arguments of jsonb_build_object() must consist of alternating keys and values." -#~ msgstr "Les arguments de jsonb_build_object() doivent consister en des clés et valeurs alternées" - -#~ msgid "The cast requires a non-immutable conversion." -#~ msgstr "Cette conversion requiert une conversion non immutable." - -#~ msgid "The database cluster was initialized with HAVE_INT64_TIMESTAMP but the server was compiled without HAVE_INT64_TIMESTAMP." -#~ msgstr "" -#~ "Le cluster de bases de données a été initialisé avec HAVE_INT64_TIMESTAMP\n" -#~ "alors que le serveur a été compilé sans." - -#~ msgid "The database cluster was initialized with LOCALE_NAME_BUFLEN %d, but the server was compiled with LOCALE_NAME_BUFLEN %d." -#~ msgstr "" -#~ "Le cluster de bases de données a été initialisé avec un LOCALE_NAME_BUFLEN\n" -#~ "à %d alors que le serveur a été compilé avec un LOCALE_NAME_BUFLEN à %d." - -#~ msgid "The database cluster was initialized with USE_FLOAT4_BYVAL but the server was compiled without USE_FLOAT4_BYVAL." -#~ msgstr "" -#~ "Le cluster de base de données a été initialisé avec USE_FLOAT4_BYVAL\n" -#~ "alors que le serveur a été compilé sans USE_FLOAT4_BYVAL." - -#~ msgid "The database cluster was initialized with XLOG_SEG_SIZE %d, but the server was compiled with XLOG_SEG_SIZE %d." -#~ msgstr "" -#~ "Le cluster de bases de données a été initialisé avec un XLOG_SEG_SIZE à %d\n" -#~ "alors que le serveur a été compilé avec un XLOG_SEG_SIZE à %d." - -#~ msgid "The database cluster was initialized without HAVE_INT64_TIMESTAMP but the server was compiled with HAVE_INT64_TIMESTAMP." -#~ msgstr "Le cluster de bases de données a été initialisé sans HAVE_INT64_TIMESTAMPalors que le serveur a été compilé avec." - -#~ msgid "The database cluster was initialized without USE_FLOAT4_BYVAL but the server was compiled with USE_FLOAT4_BYVAL." -#~ msgstr "" -#~ "Le cluster de base de données a été initialisé sans USE_FLOAT4_BYVAL\n" -#~ "alors que le serveur a été compilé avec USE_FLOAT4_BYVAL." - -#~ msgid "The error was: %s" -#~ msgstr "L'erreur était : %s" - -#~ msgid "The supported languages are listed in the pg_pltemplate system catalog." -#~ msgstr "Les langages supportés sont listés dans le catalogue système pg_pltemplate." - -#~ msgid "There might be an idle transaction or a forgotten prepared transaction causing this." -#~ msgstr "" -#~ "Il pourait y avoir une transaction en attente ou une transaction préparée\n" -#~ "oubliée causant cela." - -#~ msgid "There were %.0f unused item identifiers.\n" -#~ msgstr "Il y avait %.0f identifiants d'éléments inutilisés.\n" - -#~ msgid "This can be caused by having a publisher with a higher PostgreSQL major version than the subscriber." -#~ msgstr "Ceci peut avoir pour cause un publieur ayant une version majeure de PostgreSQL supérieure à l'abonné" - -#~ msgid "This can be set to advanced, extended, or basic." -#~ msgstr "" -#~ "Ceci peut être initialisé avec advanced (avancé), extended (étendu) ou\n" -#~ "basic (basique)." - -#~ msgid "This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by \"client_encoding\"." -#~ msgstr "" -#~ "Cette erreur peut aussi survenir si la séquence d'octets ne correspond pas\n" -#~ "au jeu de caractères attendu par le serveur, le jeu étant contrôlé par\n" -#~ "« client_encoding »." - -#~ msgid "" -#~ "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter. You can either reduce the request size or reconfigure the kernel with larger SHMMAX. To reduce the request size (currently %lu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.\n" -#~ "If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.\n" -#~ "The PostgreSQL documentation contains more information about shared memory configuration." -#~ msgstr "" -#~ "Cette erreur signifie habituellement que la demande de PostgreSQL pour un\n" -#~ "segment de mémoire partagée a dépassé le paramètre SHMMAX de votre noyau.\n" -#~ "Vous pouvez soit réduire la taille de la requête soit reconfigurer le noyau\n" -#~ "avec un SHMMAX plus important. Pour réduire la taille de la requête\n" -#~ "(actuellement %lu octets), réduisez l'utilisation de la mémoire partagée par PostgreSQL,par exemple en réduisant shared_buffers ou max_connections\n" -#~ "Si la taille de la requête est déjà petite, il est possible qu'elle soit\n" -#~ "moindre que le paramètre SHMMIN de votre noyau, auquel cas, augmentez la\n" -#~ "taille de la requête ou reconfigurez SHMMIN.\n" -#~ "La documentation de PostgreSQL contient plus d'informations sur la\n" -#~ "configuration de la mémoire partagée." - -#~ msgid "This is a debugging aid." -#~ msgstr "C'est une aide de débogage." - -#~ msgid "This name may be disallowed altogether in future versions of PostgreSQL." -#~ msgstr "Ce nom pourrait être interdit dans les prochaines versions de PostgreSQL." - -#~ msgid "This parameter cannot be changed after server start." -#~ msgstr "Ce paramètre ne peut pas être modifié après le lancement du serveur" - -#~ msgid "This parameter doesn't do anything." -#~ msgstr "Ce paramètre ne fait rien." - -#~ msgid "Thu" -#~ msgstr "Jeu" - -#~ msgid "Thursday" -#~ msgstr "Jeudi" - -#~ msgid "Transaction ID %u finished; no more running transactions." -#~ msgstr "Identifiant de transaction %u terminé ; plus de transactions en cours." - -#, c-format -#~ msgid "Triggers on partitioned tables cannot have transition tables." -#~ msgstr "Les triggers sur les tables partitionnées ne peuvent pas avoir de tables de transition." - -#~ msgid "Try putting the literal value in single quotes." -#~ msgstr "Placer la valeur littérale en guillemets simples." - -#~ msgid "Tue" -#~ msgstr "Mar" - -#~ msgid "Tuesday" -#~ msgstr "Mardi" - -#~ msgid "Turns on various assertion checks." -#~ msgstr "Active les différentes vérifications des assertions." - -#~ msgid "UTF-16 to UTF-8 translation failed: %lu" -#~ msgstr "échec de la conversion d'UTF16 vers UTF8 : %lu" - -#~ msgid "Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8" -#~ msgstr "" -#~ "Les valeurs d'échappement unicode ne peuvent pas être utilisées pour les\n" -#~ "valeurs de point de code au-dessus de 007F quand l'encodage serveur n'est\n" -#~ "pas UTF8" - -#~ msgid "Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8." -#~ msgstr "" -#~ "Les valeurs d'échappement unicode ne peuvent pas être utilisées pour les valeurs de point de code\n" -#~ "au-dessus de 007F quand l'encodage serveur n'est pas UTF8." - -#~ msgid "Use ALTER AGGREGATE to change owner of aggregate functions." -#~ msgstr "Utiliser ALTER AGGREGATE pour changer le propriétaire des fonctions d'agrégat." - -#~ msgid "Use ALTER AGGREGATE to rename aggregate functions." -#~ msgstr "Utiliser ALTER AGGREGATE pour renommer les fonctions d'agrégat." - -#~ msgid "Use ALTER FOREIGN TABLE instead." -#~ msgstr "Utilisez ALTER FOREIGN TABLE à la place." - -#~ msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the detach operation." -#~ msgstr "Utiliser ALTER TABLE ... DETACH PARTITION ... FINALIZE pour terminer l'opération de détachement." - -#~ msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation" -#~ msgstr "Utilisez ALTER TABLE ... DETACH PARTITION ... FINALIZE pour terminer l'opération de détachement en attente" - -#~ msgid "Use SELECT ... UNION ALL ... instead." -#~ msgstr "Utilisez à la place SELECT ... UNION ALL ..." - -#~ msgid "User \"%s\" has an empty password." -#~ msgstr "L'utilisateur « %s » a un mot de passe vide." - -#~ msgid "Uses the indented output format for EXPLAIN VERBOSE." -#~ msgstr "Utilise le format de sortie indenté pour EXPLAIN VERBOSE." - -#~ msgid "VALUES must not contain OLD or NEW references" -#~ msgstr "VALUES ne doit pas contenir des références à OLD et NEW" - -#~ msgid "VALUES must not contain table references" -#~ msgstr "VALUES ne doit pas contenir de références de table" - -#~ msgid "Valid values are \"pause\", \"promote\", and \"shutdown\"." -#~ msgstr "Les valeurs valides sont « pause », « promote » et « shutdown »." - -#~ msgid "Valid values are '[]', '[)', '(]', and '()'." -#~ msgstr "Les valeurs valides sont « [] », « [) », « (] » et « () »." - -#~ msgid "Valid values are DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING, ERROR, LOG, FATAL, and PANIC. Each level includes all the levels that follow it." -#~ msgstr "" -#~ "Les valeurs valides sont DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO,\n" -#~ "NOTICE, WARNING, ERROR, LOG, FATAL et PANIC. Chaque niveau incut tous les\n" -#~ "niveaux qui le suit." - -#~ msgid "Valid values are DOCUMENT and CONTENT." -#~ msgstr "Les valeurs valides sont DOCUMENT et CONTENT." - -#~ msgid "Valid values are LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7." -#~ msgstr "" -#~ "Les valeurs valides sont LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5,\n" -#~ "LOCAL6, LOCAL7." - -#~ msgid "Valid values are ON, OFF, and SAFE_ENCODING." -#~ msgstr "Les valeurs valides sont ON, OFF et SAFE_ENCODING." - -#~ msgid "Version and Platform Compatibility" -#~ msgstr "Compatibilité des versions et des plateformes" - -#~ msgid "Views that return the same column more than once are not automatically updatable." -#~ msgstr "Les vues qui renvoient la même colonne plus d'une fois ne sont pas automatiquement disponibles en écriture." - -#~ msgid "WAL archival (archive_mode=on) requires wal_level \"archive\", \"hot_standby\", or \"logical\"" -#~ msgstr "" -#~ "l'archivage des journaux de transactions (archive_mode=on) nécessite que\n" -#~ "le paramètre wal_level soit initialisé avec « archive », « hot_standby » ou « logical »" - -#~ msgid "WAL archiving is not active" -#~ msgstr "l'archivage des journaux de transactions n'est pas actif" - -#~ msgid "WAL file SYSID is %s, pg_control SYSID is %s" -#~ msgstr "le SYSID du journal de transactions WAL est %s, celui de pg_control est %s" - -#~ msgid "WAL file is from different database system: Incorrect XLOG_BLCKSZ in page header." -#~ msgstr "" -#~ "le journal de transactions provient d'un système de bases de données différent :\n" -#~ "XLOG_BLCKSZ incorrect dans l'en-tête de page." - -#~ msgid "WAL file is from different database system: Incorrect XLOG_SEG_SIZE in page header." -#~ msgstr "" -#~ "le journal de transactions provient d'un système de bases de données différent :\n" -#~ "XLOG_SEG_SIZE incorrect dans l'en-tête de page." - -#~ msgid "WAL file is from different database system: WAL file database system identifier is %s, pg_control database system identifier is %s" -#~ msgstr "le fichier WAL provient d'une instance différente : l'identifiant système de la base dans le fichier WAL est %s, alors que l'identifiant système de l'instance dans pg_control est %s" - -#~ msgid "WAL file is from different database system: WAL file database system identifier is %s, pg_control database system identifier is %s." -#~ msgstr "" -#~ "L'identifiant du journal de transactions du système de base de données est %s,\n" -#~ "l'identifiant pg_control du système de base de données dans pg_control est %s." - -#~ msgid "WAL file is from different database system: incorrect XLOG_SEG_SIZE in page header" -#~ msgstr "le fichier WAL provient d'un système différent : XLOG_SEG_SIZE invalide dans l'en-tête de page" - -#~ msgid "WAL sender sleep time between WAL replications." -#~ msgstr "" -#~ "Temps d'endormissement du processus d'envoi des journaux de transactions entre\n" -#~ "les réplications des journaux de transactions." - -#~ msgid "WAL writer sleep time between WAL flushes." -#~ msgstr "" -#~ "Temps d'endormissement du processus d'écriture pendant le vidage des\n" -#~ "journaux de transactions en millisecondes." - -#~ msgid "" -#~ "WARNING: Calculated CRC checksum does not match value stored in file.\n" -#~ "Either the file is corrupt, or it has a different layout than this program\n" -#~ "is expecting. The results below are untrustworthy.\n" -#~ "\n" -#~ msgstr "" -#~ "ATTENTION : Les sommes de contrôle (CRC) calculées ne correspondent pas aux\n" -#~ "valeurs stockées dans le fichier.\n" -#~ "Soit le fichier est corrompu, soit son organisation diffère de celle\n" -#~ "attendue par le programme.\n" -#~ "Les résultats ci-dessous ne sont pas dignes de confiance.\n" -#~ "\n" - -#~ msgid "" -#~ "WARNING: possible byte ordering mismatch\n" -#~ "The byte ordering used to store the pg_control file might not match the one\n" -#~ "used by this program. In that case the results below would be incorrect, and\n" -#~ "the PostgreSQL installation would be incompatible with this data directory.\n" -#~ msgstr "" -#~ "ATTENTION : possible incohérence dans l'ordre des octets\n" -#~ "L'ordre des octets utilisé pour enregistrer le fichier pg_control peut ne\n" -#~ "pas correspondre à celui utilisé par ce programme. Dans ce cas, les\n" -#~ "résultats ci-dessous sont incorrects, et l'installation PostgreSQL\n" -#~ "incompatible avec ce répertoire des données.\n" - -#~ msgid "WHERE CURRENT OF is not supported on a view with grouping or aggregation" -#~ msgstr "WHERE CURRENT OF n'est pas supporté pour une vue avec regroupement ou agrégat" - -#~ msgid "WHERE CURRENT OF is not supported on a view with more than one underlying relation" -#~ msgstr "WHERE CURRENT OF n'est pas supporté pour une vue avec plus d'une table sous-jacente" - -#~ msgid "WHERE CURRENT OF is not supported on a view with no underlying relation" -#~ msgstr "WHERE CURRENT OF n'est pas supporté pour une vue sans table sous-jacente" - -#~ msgid "Waits N seconds on connection startup after authentication." -#~ msgstr "Attends N secondes après l'authentification." - -#~ msgid "Waits N seconds on connection startup before authentication." -#~ msgstr "Attends N secondes au lancement de la connexion avant l'authentification." - -#~ msgid "Wed" -#~ msgstr "Mer" - -#~ msgid "Wednesday" -#~ msgstr "Mercredi" - -#~ msgid "When a password is specified in CREATE USER or ALTER USER without writing either ENCRYPTED or UNENCRYPTED, this parameter determines whether the password is to be encrypted." -#~ msgstr "" -#~ "Lorsqu'un mot de passe est spécifié dans CREATE USER ou ALTER USER sans\n" -#~ "indiquer ENCRYPTED ou UNENCRYPTED, ce paramètre détermine si le mot de passe\n" -#~ "doit être chiffré." - -#~ msgid "When logging statements, limit logged parameter values to first N bytes." -#~ msgstr "Lors de la trace des requêtes, limite les valeurs des paramètres tracés aux N premiers octets." - -#~ msgid "When more tuples than this are present, quicksort will be used." -#~ msgstr "Quand plus de lignes que ça sont présentes, quicksort sera utilisé." - -#~ msgid "When reporting an error, limit logged parameter values to first N bytes." -#~ msgstr "Lors de la trace d'une erreur, limite les valeurs des paramètres tracés aux N premiers octets." - -#~ msgid "Write-Ahead Log" -#~ msgstr "Write-Ahead Log" - -#~ msgid "Write-Ahead Log / Streaming Replication" -#~ msgstr "Write-Ahead Log / Réplication en flux" - -#~ msgid "Writes temporary statistics files to the specified directory." -#~ msgstr "Écrit les fichiers statistiques temporaires dans le répertoire indiqué." - -#~ msgid "You can add the table partitions individually." -#~ msgstr "Vous pouvez ajouter les partitions de table individuellement." - -#~ msgid "You have at least %d relations. Consider increasing the configuration parameter \"max_fsm_relations\"." -#~ msgstr "" -#~ "Vous avez au moins %d relations.Considèrez l'augmentation du paramètre de\n" -#~ "configuration « max_fsm_relations »." - -#~ msgid "You might be able to work around this by marking column \"%s\" NOT NULL, or use ALTER TABLE ... SET WITHOUT CLUSTER to remove the cluster specification from the table." -#~ msgstr "" -#~ "Vous pourriez contourner ceci en marquant la colonne « %s » avec la\n" -#~ "contrainte NOT NULL ou en utilisant ALTER TABLE ... SET WITHOUT CLUSTER pour\n" -#~ "supprimer la spécification CLUSTER de la table." - -#~ msgid "You might be able to work around this by marking column \"%s\" NOT NULL." -#~ msgstr "Vous pouvez contourner ceci en marquant la colonne « %s » comme NOT NULL." - -#~ msgid "You need an unconditional ON DELETE DO INSTEAD rule or an INSTEAD OF DELETE trigger." -#~ msgstr "Vous avez besoin d'une règle inconditionnelle ON DELETE DO INSTEAD ou d'un trigger INSTEAD OF DELETE." - -#~ msgid "You need an unconditional ON INSERT DO INSTEAD rule or an INSTEAD OF INSERT trigger." -#~ msgstr "Vous avez besoin d'une règle ON INSERT DO INSTEAD sans condition ou d'un trigger INSTEAD OF INSERT." - -#~ msgid "You need an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger." -#~ msgstr "Vous avez besoin d'une règle non conditionnelle ON UPDATE DO INSTEAD ou d'un trigger INSTEAD OF UPDATE." - -#, c-format -#~ msgid "You need to rebuild PostgreSQL using %s." -#~ msgstr "Vous devez recompiler PostgreSQL en utilisant %s." - -#~ msgid "You need to rebuild PostgreSQL using --with-icu." -#~ msgstr "Vous devez recompiler PostgreSQL en utilisant --with-icu." - -#~ msgid "You need to rebuild PostgreSQL using --with-libxml." -#~ msgstr "Vous devez recompiler PostgreSQL en utilisant --with-libxml." - -#, c-format -#~ msgid "a backup is already in progress" -#~ msgstr "une sauvegarde est déjà en cours" - -#~ msgid "aborted" -#~ msgstr "annulé" - -#~ msgid "abstime out of range for date" -#~ msgstr "abstime en dehors des limites pour une date" - -#~ msgid "access method name cannot be qualified" -#~ msgstr "le nom de la méthode d'accès ne peut pas être qualifiée" - -#~ msgid "added subscription for table %s.%s" -#~ msgstr "souscription ajoutée pour la table %s.%s" - -#~ msgid "adding missing FROM-clause entry for table \"%s\"" -#~ msgstr "ajout d'une entrée manquante dans FROM (table « %s »)" - -#~ msgid "adding missing FROM-clause entry in subquery for table \"%s\"" -#~ msgstr "entrée manquante de la clause FROM dans la sous-requête pour la table « %s »" - -#~ msgid "aggregates not allowed in WHERE clause" -#~ msgstr "agrégats non autorisés dans une clause WHERE" - -#~ msgid "archive command was terminated by signal %d" -#~ msgstr "la commande d'archivage a été terminée par le signal %d" - -#~ msgid "archive member \"%s\" too large for tar format" -#~ msgstr "membre « %s » de l'archive trop volumineux pour le format tar" - -#~ msgid "archive_command must be defined before online backups can be made safely." -#~ msgstr "" -#~ "archive_command doit être défini avant que les sauvegardes à chaud puissent\n" -#~ "s'effectuer correctement." - -#~ msgid "archive_mode must be enabled at server start." -#~ msgstr "archive_mode doit être activé au lancement du serveur." - -#~ msgid "archived transaction log file \"%s\"" -#~ msgstr "journal des transactions archivé « %s »" - -#~ msgid "argument %d: could not determine data type" -#~ msgstr "argument %d : n'a pas pu déterminer le type de données" - -#~ msgid "argument declared \"anyrange\" is not consistent with argument declared \"anyelement\"" -#~ msgstr "" -#~ "l'argument déclaré « anyrange » n'est pas cohérent avec l'argument déclaré\n" -#~ "« anyelement »" - -#~ msgid "argument for function \"exp\" too big" -#~ msgstr "l'argument de la fonction « exp » est trop gros" - -#~ msgid "argument number is out of range" -#~ msgstr "le nombre en argument est en dehors des limites" - -#~ msgid "argument of %s must be type boolean, not type %s" -#~ msgstr "l'argument de %s doit être de type booléen, et non du type %s" - -#~ msgid "argument of %s must not contain aggregate functions" -#~ msgstr "l'argument de %s ne doit pas contenir de fonctions d'agrégats" - -#~ msgid "argument of %s must not contain window functions" -#~ msgstr "l'argument de %s ne doit pas contenir des fonctions window" - -#~ msgid "argument to pg_get_expr() must come from system catalogs" -#~ msgstr "l'argument de pg_get_expr() doit provenir des catalogues systèmes" - -#~ msgid "arguments declared \"anycompatiblemultirange\" are not all alike" -#~ msgstr "les arguments déclarés « anycompatiblemultirange » ne sont pas tous identiques" - -#~ msgid "arguments declared \"anycompatiblerange\" are not all alike" -#~ msgstr "les arguments déclarés « anycompatiblerange » ne sont pas tous identiques" - -#~ msgid "arguments declared \"anyelement\" are not all alike" -#~ msgstr "les arguments déclarés « anyelement » ne sont pas tous identiques" - -#~ msgid "arguments declared \"anymultirange\" are not all alike" -#~ msgstr "les arguments déclarés « anymultirange » ne sont pas tous identiques" - -#~ msgid "arguments declared \"anyrange\" are not all alike" -#~ msgstr "les arguments déclarés « anyrange » ne sont pas tous identiques" - -#~ msgid "arguments of row IN must all be row expressions" -#~ msgstr "les arguments de la ligne IN doivent tous être des expressions de ligne" - -#~ msgid "array assignment requires type %s but expression is of type %s" -#~ msgstr "l'affectation de tableaux requiert le type %s mais l'expression est de type %s" - -#~ msgid "at least one of leftarg or rightarg must be specified" -#~ msgstr "au moins un des arguments (le gauche ou le droit) doit être spécifié" - -#~ msgid "attempted change of parameter \"%s\" ignored" -#~ msgstr "tentative de modification du paramètre « %s » ignoré" - -#~ msgid "authentication file line too long" -#~ msgstr "ligne du fichier d'authentification trop longue" - -#~ msgid "automatic analyze of table \"%s.%s.%s\" system usage: %s" -#~ msgstr "ANALYZE automatique de la table « %s.%s.%s » ; utilisation système : %s" - -#~ msgid "automatic vacuum of table \"%s.%s.%s\": cannot (re)acquire exclusive lock for truncate scan" -#~ msgstr "vacuum automatique de la table « %s.%s.%s » : ne peut pas acquérir le verrou exclusif pour la tronquer" - -#~ msgid "" -#~ "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" -#~ "pages: %d removed, %d remain\n" -#~ "tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable\n" -#~ "buffer usage: %d hits, %d misses, %d dirtied\n" -#~ "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" -#~ "system usage: %s" -#~ msgstr "" -#~ "VACUUM automatique de la table « %s.%s.%s » : parcours d'index : %d\n" -#~ "pages : %d supprimées, %d restantes\n" -#~ "lignes : %.0f supprimées, %.0f restantes, %.0f sont mortes mais non supprimables\n" -#~ "utilisation des tampons : %d lus dans le cache, %d lus hors du cache, %d modifiés\n" -#~ "taux moyen de lecture : %.3f Mo/s, taux moyen d'écriture : %.3f Mo/s\n" -#~ "utilisation système : %s" - -#~ msgid "autovacuum launcher shutting down" -#~ msgstr "arrêt du processus de lancement de l'autovacuum" - -#~ msgid "autovacuum launcher started" -#~ msgstr "démarrage du processus de lancement de l'autovacuum" - -#~ msgid "autovacuum: found orphan temp table \"%s\".\"%s\" in database \"%s\"" -#~ msgstr "" -#~ "autovacuum : a trouvé la table temporaire orpheline « %s.%s » dans la base de\n" -#~ "données « %s »" - -#~ msgid "autovacuum: processing database \"%s\"" -#~ msgstr "autovacuum : traitement de la base de données « %s »" - -#, c-format -#~ msgid "background worker \"%s\": must attach to shared memory in order to request a database connection" -#~ msgstr "processus en tâche de fond « %s » : doit se lier à la mémoire partagée pour pouvoir demander une connexion à une base" - -#~ msgid "backup label %s in file \"%s\"" -#~ msgstr "label de sauvegarde %s dans le fichier « %s »" - -#~ msgid "backup time %s in file \"%s\"" -#~ msgstr "heure de sauvegarde %s dans le fichier « %s »" - -#~ msgid "backup timeline %u in file \"%s\"" -#~ msgstr "timeline de sauvegarde %u dans le fichier « %s »" - -#, c-format -#~ msgid "base backup could not send data, aborting backup" -#~ msgstr "la sauvegarde de base n'a pas pu envoyer les données, annulation de la sauvegarde" - -#~ msgid "binary value is out of range for type bigint" -#~ msgstr "la valeur binaire est en dehors des limites du type bigint" - -#~ msgid "bind %s to %s" -#~ msgstr "lie %s à %s" - -#~ msgid "brin operator family \"%s\" contains function %s with invalid support number %d" -#~ msgstr "" -#~ "la famille d'opérateur brin « %s » contient la fonction %s\n" -#~ "avec le numéro de support %d invalide" - -#~ msgid "brin operator family \"%s\" contains function %s with wrong signature for support number %d" -#~ msgstr "" -#~ "la famille d'opérateur brin « %s » contient la fonction %s\n" -#~ "avec une mauvaise signature pour le numéro de support %d" - -#~ msgid "brin operator family \"%s\" contains invalid ORDER BY specification for operator %s" -#~ msgstr "" -#~ "la famille d'opérateur brin « %s » contient une spécification\n" -#~ "ORDER BY invalide pour l'opérateur %s" - -#~ msgid "brin operator family \"%s\" contains operator %s with invalid strategy number %d" -#~ msgstr "" -#~ "la famille d'opérateur brin « %s » contient l'opérateur %s\n" -#~ "avec le numéro de stratégie %d invalide" - -#~ msgid "brin operator family \"%s\" contains operator %s with wrong signature" -#~ msgstr "la famille d'opérateur brin « %s » contient l'opérateur %s avec une mauvaise signature" - -#~ msgid "btree operator class \"%s\" is missing operator(s)" -#~ msgstr "il manque des opérateurs pour la classe d'opérateur btree « %s »" - -#~ msgid "btree operator family \"%s\" contains function %s with invalid support number %d" -#~ msgstr "" -#~ "la famille d'opérateur btree « %s » contient la fonction %s\n" -#~ "avec le numéro de support invalide %d" - -#~ msgid "btree operator family \"%s\" contains function %s with wrong signature for support number %d" -#~ msgstr "" -#~ "la famille d'opérateur btree « %s » contient la fonction %s\n" -#~ "avec une mauvaise signature pour le numéro de support %d" - -#~ msgid "btree operator family \"%s\" contains invalid ORDER BY specification for operator %s" -#~ msgstr "" -#~ "la famille d'opérateur btree « %s » contient une spécification\n" -#~ "ORDER BY invalide pour l'opérateur %s" - -#~ msgid "btree operator family \"%s\" contains operator %s with invalid strategy number %d" -#~ msgstr "" -#~ "la famille d'opérateur btree « %s » contient l'opérateur %s\n" -#~ "avec le numéro de stratégie invalide %d" - -#~ msgid "btree operator family \"%s\" contains operator %s with wrong signature" -#~ msgstr "la famille d'opérateur btree « %s » contient l'opérateur %s avec une mauvaise signature" - -#~ msgid "btree operator family \"%s\" is missing cross-type operator(s)" -#~ msgstr "il manque des opérateurs inter-type pour la famille d'opérateur btree « %s »" - -#~ msgid "btree operator family \"%s\" is missing operator(s) for types %s and %s" -#~ msgstr "" -#~ "la famille d'opérateur btree « %s » nécessite des opérateurs supplémentaires\n" -#~ "pour les types %s et %s" - -#~ msgid "building index \"%s\" on table \"%s\" serially" -#~ msgstr "construction de l'index « %s » sur la table « %s » séquentiellement" - -#~ msgid "building index \"%s\" on table \"%s\" with request for %d parallel worker" -#~ msgid_plural "building index \"%s\" on table \"%s\" with request for %d parallel workers" -#~ msgstr[0] "construction de l'index « %s » sur la table « %s » avec une demande de %d processus parallèle" -#~ msgstr[1] "construction de l'index « %s » sur la table « %s » avec une demande de %d processus parallèles" - -#~ msgid "built-in type %u not found" -#~ msgstr "type interne %u non trouvé" - -#~ msgid "cannot PREPARE a transaction that has manipulated logical replication workers" -#~ msgstr "" -#~ "ne peut pas préparer (PREPARE) une transaction qui a travaillé sur des\n" -#~ "workers de réplication logique" - -#~ msgid "cannot PREPARE a transaction that has operated on temporary namespace" -#~ msgstr "" -#~ "ne peut pas préparer (PREPARE) une transaction qui a travaillé sur un\n" -#~ "schéma temporaire" - -#~ msgid "cannot PREPARE a transaction that has operated on temporary tables" -#~ msgstr "" -#~ "ne peut pas préparer (PREPARE) une transaction qui a travaillé sur des\n" -#~ "tables temporaires" - -#~ msgid "cannot accept a value of type any" -#~ msgstr "ne peut pas accepter une valeur de type any" - -#~ msgid "cannot accept a value of type anyarray" -#~ msgstr "ne peut pas accepter une valeur de type anyarray" - -#~ msgid "cannot accept a value of type anyelement" -#~ msgstr "ne peut pas accepter une valeur de type anyelement" - -#~ msgid "cannot accept a value of type anyenum" -#~ msgstr "ne peut pas accepter une valeur de type anyenum" - -#~ msgid "cannot accept a value of type anynonarray" -#~ msgstr "ne peut pas accepter une valeur de type anynonarray" - -#~ msgid "cannot accept a value of type anyrange" -#~ msgstr "ne peut pas accepter une valeur de type anyrange" - -#~ msgid "cannot accept a value of type event_trigger" -#~ msgstr "ne peut pas accepter une valeur de type event_trigger" - -#~ msgid "cannot accept a value of type fdw_handler" -#~ msgstr "ne peut pas accepter une valeur de type fdw_handler" - -#~ msgid "cannot accept a value of type index_am_handler" -#~ msgstr "ne peut pas accepter une valeur de type index_am_handler" - -#~ msgid "cannot accept a value of type internal" -#~ msgstr "ne peut pas accepter une valeur de type internal" - -#~ msgid "cannot accept a value of type language_handler" -#~ msgstr "ne peut pas accepter une valeur de type language_handler" - -#~ msgid "cannot accept a value of type opaque" -#~ msgstr "ne peut pas accepter une valeur de type opaque" - -#~ msgid "cannot accept a value of type pg_node_tree" -#~ msgstr "ne peut pas accepter une valeur de type pg_node_tree" - -#~ msgid "cannot accept a value of type trigger" -#~ msgstr "ne peut pas accepter une valeur de type trigger" - -#~ msgid "cannot accept a value of type tsm_handler" -#~ msgstr "ne peut pas accepter une valeur de type tsm_handler" - -#~ msgid "cannot advance replication slot that has not previously reserved WAL" -#~ msgstr "impossible d'avancer un slot de réplication qui n'a pas auparavant réservé de WAL" - -#~ msgid "cannot alter type of column named in partition key" -#~ msgstr "ne peut pas modifier le type d'une colonne nommée dans une clé de partitionnement" - -#~ msgid "cannot alter type of column referenced in partition key expression" -#~ msgstr "ne peut pas utiliser le type d'une colonne référencée dans l'expression d'une clé de partitionnement" - -#~ msgid "cannot attach table \"%s\" with OIDs as partition of table \"%s\" without OIDs" -#~ msgstr "ne peut pas attacher la table « %s » avec OID comme partition de la table « %s » sans OID" - -#~ msgid "cannot attach table \"%s\" without OIDs as partition of table \"%s\" with OIDs" -#~ msgstr "ne peut pas attacher la table « %s » sans OID comme partition de la table « %s » avec OID" - -#~ msgid "cannot calculate week number without year information" -#~ msgstr "ne peut pas calculer le numéro de la semaine sans informations sur l'année" - -#~ msgid "cannot call json_array_elements on a non-array" -#~ msgstr "ne peut pas appeler json_array_elements sur un objet qui n'est pas un tableau" - -#~ msgid "cannot call json_array_elements on a scalar" -#~ msgstr "ne peut pas appeler json_array_elements sur un scalaire" - -#~ msgid "cannot call json_object_keys on an array" -#~ msgstr "ne peut pas appeler json_object_keys sur un tableau" - -#~ msgid "cannot call json_populate_recordset on a nested object" -#~ msgstr "ne peut pas appeler json_populate_recordset sur un objet imbriqué" - -#~ msgid "cannot call json_populate_recordset on a scalar" -#~ msgstr "ne peut pas appeler json_populate_recordset sur un scalaire" - -#~ msgid "cannot call json_populate_recordset on an object" -#~ msgstr "ne peut pas appeler json_populate_recordset sur un objet" - -#~ msgid "cannot call json_populate_recordset with nested arrays" -#~ msgstr "ne peut pas appeler json_populate_recordset avec des tableaux imbriqués" - -#~ msgid "cannot call json_populate_recordset with nested objects" -#~ msgstr "ne peut pas appeler json_populate_recordset sur des objets imbriqués" - -#~ msgid "cannot change number of columns in view" -#~ msgstr "ne peut pas modifier le nombre de colonnes dans la vue" - -#~ msgid "cannot cluster on expressional index \"%s\" because its index access method does not handle null values" -#~ msgstr "" -#~ "ne peut pas exécuter CLUSTER sur l'index à expression « %s » car sa méthode\n" -#~ "d'accès ne gère pas les valeurs NULL" - -#~ msgid "cannot cluster on index \"%s\" because access method does not handle null values" -#~ msgstr "" -#~ "ne peut pas créer un cluster sur l'index « %s » car la méthode d'accès de\n" -#~ "l'index ne gère pas les valeurs NULL" - -#~ msgid "cannot convert NaN to bigint" -#~ msgstr "ne peut pas convertir NaN en un entier de type bigint" - -#~ msgid "cannot convert NaN to integer" -#~ msgstr "ne peut pas convertir NaN en un entier" - -#~ msgid "cannot convert NaN to smallint" -#~ msgstr "ne peut pas convertir NaN en un entier de type smallint" - -#~ msgid "cannot convert abstime \"invalid\" to timestamp" -#~ msgstr "ne peut pas convertir un abstime « invalid » en timestamp" - -#~ msgid "cannot convert empty polygon to circle" -#~ msgstr "ne peut pas convertir un polygône vide en cercle" - -#~ msgid "cannot convert infinity to bigint" -#~ msgstr "ne peut pas convertir infinity en bigint" - -#~ msgid "cannot convert infinity to integer" -#~ msgstr "ne peut pas convertir infinity en integer" - -#~ msgid "cannot convert infinity to smallint" -#~ msgstr "ne peut pas convertir infinity en smallint" - -#~ msgid "cannot convert reltime \"invalid\" to interval" -#~ msgstr "ne peut pas convertir reltime « invalid » en interval" - -#~ msgid "cannot convert reserved abstime value to date" -#~ msgstr "ne peut pas convertir la valeur réservée abstime en date" - -#~ msgid "cannot copy to foreign table \"%s\"" -#~ msgstr "ne peut pas copier vers la table distante « %s »" - -#~ msgid "cannot create bounding box for empty polygon" -#~ msgstr "ne peut pas créer une boîte entourée pour un polygône vide" - -#~ msgid "cannot create range partition with empty range" -#~ msgstr "ne peut pas créer une partition par intervalle avec un intervalle vide" - -#~ msgid "cannot create restricted tokens on this platform" -#~ msgstr "ne peut pas créer les jetons restreints sur cette plateforme" - -#~ msgid "cannot create table with OIDs as partition of table without OIDs" -#~ msgstr "ne peut pas créer une table avec OID comme partition d'une table sans OID" - -#~ msgid "cannot display a value of type anyelement" -#~ msgstr "ne peut pas afficher une valeur de type anyelement" - -#~ msgid "cannot display a value of type anynonarray" -#~ msgstr "ne peut pas afficher une valeur de type anynonarray" - -#~ msgid "cannot display a value of type event_trigger" -#~ msgstr "ne peut pas afficher une valeur de type event_trigger" - -#~ msgid "cannot display a value of type fdw_handler" -#~ msgstr "ne peut pas afficher une valeur de type fdw_handler" - -#~ msgid "cannot display a value of type index_am_handler" -#~ msgstr "ne peut pas afficher une valeur de type index_am_handler" - -#~ msgid "cannot display a value of type internal" -#~ msgstr "ne peut pas afficher une valeur de type internal" - -#~ msgid "cannot display a value of type language_handler" -#~ msgstr "ne peut pas afficher une valeur de type language_handler" - -#~ msgid "cannot display a value of type opaque" -#~ msgstr "ne peut pas afficher une valeur de type opaque" - -#~ msgid "cannot display a value of type trigger" -#~ msgstr "ne peut pas afficher une valeur de type trigger" - -#~ msgid "cannot display a value of type tsm_handler" -#~ msgstr "ne peut pas afficher une valeur de type tsm_handler" - -#~ msgid "cannot drop \"%s\" because it is being used by active queries in this session" -#~ msgstr "" -#~ "ne peut pas supprimer « %s » car cet objet est en cours d'utilisation par\n" -#~ "des requêtes actives dans cette session" - -#~ msgid "cannot drop column named in partition key" -#~ msgstr "ne peut pas supprimer une colonne nommée dans une clé de partitionnement" - -#~ msgid "cannot extract array element from a non-array" -#~ msgstr "ne peut pas extraire un élément du tableau à partir d'un objet qui n'est pas un tableau" - -#~ msgid "cannot extract field from a non-object" -#~ msgstr "ne peut pas extraire le chemin à partir d'un non-objet" - -#~ msgid "cannot output a value of type %s" -#~ msgstr "ne peut pas afficher une valeur de type %s" - -#~ msgid "cannot override frame clause of window \"%s\"" -#~ msgstr "ne peut pas surcharger la frame clause du window « %s »" - -#~ msgid "cannot reference permanent table from temporary table constraint" -#~ msgstr "" -#~ "ne peut pas référencer une table permanente à partir de la contrainte de\n" -#~ "table temporaire" - -#~ msgid "cannot reference temporary table from permanent table constraint" -#~ msgstr "" -#~ "ne peut pas référencer une table temporaire à partir d'une contrainte de\n" -#~ "table permanente" - -#~ msgid "cannot reindex invalid index on TOAST table concurrently" -#~ msgstr "ne peut pas réindexer un index invalide sur une table TOAST de manière concurrente" - -#~ msgid "cannot route inserted tuples to a foreign table" -#~ msgstr "ne peut pas envoyer les lignes insérées dans une table distante" - -#~ msgid "cannot set session authorization within security-definer function" -#~ msgstr "ne peut pas exécuter SESSION AUTHORIZATION sur la fonction SECURITY DEFINER" - -#~ msgid "cannot specify CSV in BINARY mode" -#~ msgstr "ne peut pas spécifier CSV en mode binaire (BINARY)" - -#~ msgid "cannot truncate system relation \"%s\"" -#~ msgstr "ne peut pas tronquer la relation système « %s »" - -#~ msgid "cannot use Ident authentication without usermap field" -#~ msgstr "n'a pas pu utiliser l'authentication Ident sans le champ usermap" - -#~ msgid "cannot use advisory locks during a parallel operation" -#~ msgstr "ne peut pas utiliser les verrous informatifs lors d'une opération parallèle" - -#~ msgid "cannot use aggregate function in RETURNING" -#~ msgstr "ne peut pas utiliser une fonction d'agrégat dans RETURNING" - -#~ msgid "cannot use aggregate function in UPDATE" -#~ msgstr "ne peut pas utiliser une fonction d'agrégat dans un UPDATE" - -#~ msgid "cannot use aggregate function in VALUES" -#~ msgstr "ne peut pas utiliser la fonction d'agrégat dans un VALUES" - -#~ msgid "cannot use aggregate function in parameter default value" -#~ msgstr "" -#~ "ne peut pas utiliser une fonction d'agrégat dans la valeur par défaut d'un\n" -#~ "paramètre" - -#~ msgid "cannot use aggregate function in rule WHERE condition" -#~ msgstr "ne peut pas utiliser la fonction d'agrégat dans la condition d'une règle WHERE" - -#~ msgid "cannot use aggregate in index predicate" -#~ msgstr "ne peut pas utiliser un agrégat dans un prédicat d'index" - -#~ msgid "cannot use authentication method \"crypt\" because password is MD5-encrypted" -#~ msgstr "" -#~ "n'a pas pu utiliser la méthode d'authentification « crypt » car le mot de\n" -#~ "passe est chiffré avec MD5" - -#, c-format -#~ msgid "cannot use invalid index \"%s\" as replica identity" -#~ msgstr "ne peut pas utiliser l'index invalide « %s » comme identité de réplicat" - -#~ msgid "cannot use subquery in parameter default value" -#~ msgstr "ne peut pas utiliser une sous-requête dans une valeur par défaut d'un paramètre" - -#~ msgid "cannot use window function in EXECUTE parameter" -#~ msgstr "ne peut pas utiliser une fonction window dans le paramètre EXECUTE" - -#~ msgid "cannot use window function in RETURNING" -#~ msgstr "ne peut pas utiliser une fonction window dans RETURNING" - -#~ msgid "cannot use window function in UPDATE" -#~ msgstr "ne peut pas utiliser une fonction window dans un UPDATE" - -#~ msgid "cannot use window function in VALUES" -#~ msgstr "ne peut pas utiliser la fonction window dans un VALUES" - -#~ msgid "cannot use window function in check constraint" -#~ msgstr "ne peut pas utiliser une fonction window dans une contrainte de vérification" - -#~ msgid "cannot use window function in default expression" -#~ msgstr "ne peut pas utiliser une fonction window dans une expression par défaut" - -#~ msgid "cannot use window function in function expression in FROM" -#~ msgstr "" -#~ "ne peut pas utiliser la fonction window dans l'expression de la fonction\n" -#~ "du FROM" - -#~ msgid "cannot use window function in parameter default value" -#~ msgstr "ne peut pas utiliser la fonction window dans la valeur par défaut d'un paramètre" - -#~ msgid "cannot use window function in rule WHERE condition" -#~ msgstr "ne peut pas utiliser la fonction window dans la condition d'une règle WHERE" - -#~ msgid "cannot use window function in transform expression" -#~ msgstr "ne peut pas utiliser la fonction window dans l'expression de la transformation" - -#~ msgid "cannot use window function in trigger WHEN condition" -#~ msgstr "ne peut pas utiliser la fonction window dans la condition WHEN d'un trigger" - -#~ msgid "changing argument type of function %s from \"opaque\" to \"cstring\"" -#~ msgstr "changement du type d'argument de la fonction %s d'« opaque » à « cstring »" - -#~ msgid "changing argument type of function %s from \"opaque\" to %s" -#~ msgstr "changement du type d'argument de la fonction %s d'« opaque » à %s" - -#~ msgid "changing return type of function %s from \"opaque\" to \"cstring\"" -#~ msgstr "changement du type de retour de la fonction %s d'« opaque » vers « cstring »" - -#~ msgid "changing return type of function %s from \"opaque\" to \"language_handler\"" -#~ msgstr "" -#~ "changement du type du code retour de la fonction %s d'« opaque » à\n" -#~ "« language_handler »" - -#~ msgid "changing return type of function %s from \"opaque\" to \"trigger\"" -#~ msgstr "changement du type de retour de la fonction %s de « opaque » vers « trigger »" - -#~ msgid "changing return type of function %s from %s to %s" -#~ msgstr "changement du type de retour de la fonction %s de %s vers %s" - -#~ msgid "checkpoint record is at %X/%X" -#~ msgstr "l'enregistrement du point de vérification est à %X/%X" - -#~ msgid "checkpoint skipped because system is idle" -#~ msgstr "checkpoint ignoré car le système est inactif" - -#~ msgid "child process was terminated by signal %d" -#~ msgstr "le processus fils a été terminé par le signal %d" - -#~ msgid "child process was terminated by signal %s" -#~ msgstr "le processus fils a été terminé par le signal %s" - -#~ msgid "child table \"%s\" has a conflicting \"%s\" column" -#~ msgstr "la table fille « %s » a une colonne conflictuelle, « %s »" - -#~ msgid "client requires SCRAM channel binding, but it is not supported" -#~ msgstr "le client requiert le lien de canal SCRAM mais ceci n'est pas supporté" - -#~ msgid "clustering \"%s.%s\"" -#~ msgstr "exécution de CLUSTER sur « %s.%s »" - -#~ msgid "collation of partition bound value for column \"%s\" does not match partition key collation \"%s\"" -#~ msgstr "le collationnement de la valeur limite de partition de la colonne « %s » ne correspond pas à celui de la clé de partition « %s »" - -#, c-format -#~ msgid "collations with different collate and ctype values are not supported by ICU" -#~ msgstr "les collationnements avec des valeurs différentes pour le tri (collate) et le jeu de caractères (ctype) ne sont pas supportés par ICU" - -#~ msgid "column \"%s\" appears more than once in partition key" -#~ msgstr "la colonne « %s » apparaît plus d'une fois dans la clé de partitionnement" - -#~ msgid "column \"%s\" contains null values" -#~ msgstr "la colonne « %s » contient des valeurs NULL" - -#~ msgid "column \"%s\" has type \"unknown\"" -#~ msgstr "la colonne « %s » est de type « unknown »" - -#, c-format -#~ msgid "column alias list for \"%s\" has too many entries" -#~ msgstr "la liste d'alias de colonnes pour « %s » a beaucoup trop d'entrées" - -#~ msgid "column name list not allowed in CREATE TABLE / AS EXECUTE" -#~ msgstr "la liste de noms de colonnes n'est pas autorisée dans CREATE TABLE / AS EXECUTE" - -#~ msgid "combine function for aggregate %u must be declared as STRICT" -#~ msgstr "la fonction d'unification pour l'aggrégat %u doit être déclarée comme STRICT" - -#~ msgid "committed" -#~ msgstr "validé" - -#~ msgid "compacted fsync request queue from %d entries to %d entries" -#~ msgstr "a compacté la queue de requêtes fsync de %d entrées à %d" - -#~ msgid "composite type must have at least one attribute" -#~ msgstr "le type composite doit avoir au moins un attribut" - -#~ msgid "connect = false and copy_data = true are mutually exclusive options" -#~ msgstr "connect = false et copy_data = true sont des options mutuellement exclusives" - -#~ msgid "connect = false and create_slot = true are mutually exclusive options" -#~ msgstr "connect = false et create_slot = true sont des options mutuellement exclusives" - -#~ msgid "connection authorized: user=%s database=%s" -#~ msgstr "connexion autorisée : utilisateur=%s, base de données=%s" - -#~ msgid "connection authorized: user=%s database=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -#~ msgstr "connexion autorisée : utilisateur=%s, base de données=%s, SSL activé (protocole=%s, chiffrement=%s, bits=%d, compression=%s)" - -#~ msgid "connection authorized: user=%s database=%s application_name=%s" -#~ msgstr "connexion autorisée : utilisateur=%s base de données=%s nom d'application=%s" - -#~ msgid "connection authorized: user=%s database=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -#~ msgstr "connexion autorisée : utilisateur=%s base de données=%s nom d'application=%s SSL activé (protocole=%s, chiffrement=%s, bits=%d, compression=%s)" - -#~ msgid "connection limit exceeded for non-superusers" -#~ msgstr "limite de connexions dépassée pour les utilisateurs standards" - -#~ msgid "connection lost during COPY to stdout" -#~ msgstr "connexion perdue lors de l'opération COPY vers stdout" - -#~ msgid "connection was re-authenticated" -#~ msgstr "la connexion a été ré-authentifiée" - -#~ msgid "consistent state delayed because recovery snapshot incomplete" -#~ msgstr "état de cohérence pas encore atteint à cause d'un snapshot de restauration incomplet" - -#~ msgid "constraint definition for check constraint \"%s\" does not match" -#~ msgstr "" -#~ "la définition de la contrainte « %s » pour la contrainte de vérification ne\n" -#~ "correspond pas" - -#~ msgid "constraints on foreign tables are not supported" -#~ msgstr "les contraintes sur les tables distantes ne sont pas supportées" - -#~ msgid "converting trigger group into constraint \"%s\" %s" -#~ msgstr "conversion du groupe de trigger en une contrainte « %s » %s" - -#~ msgid "corrupted item pointer: offset = %u, length = %u" -#~ msgstr "pointeur d'élément corrompu : décalage = %u, longueur = %u" - -#~ msgid "could not access root certificate file \"%s\": %m" -#~ msgstr "n'a pas pu accéder au fichier du certificat racine « %s » : %m" - -#, c-format -#~ msgid "could not bind socket for statistics collector: %m" -#~ msgstr "n'a pas pu lier la socket au récupérateur de statistiques : %m" - -#~ msgid "could not change directory to \"%s\"" -#~ msgstr "n'a pas pu accéder au répertoire « %s »" - -#~ msgid "could not change directory to \"%s\": %s" -#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s" - -#~ msgid "could not close control file: %m" -#~ msgstr "n'a pas pu fermer le fichier de contrôle : %m" - -#~ msgid "could not close directory \"%s\": %s\n" -#~ msgstr "n'a pas pu fermer le répertoire « %s » : %s\n" - -#~ msgid "could not close log file %s: %m" -#~ msgstr "n'a pas pu fermer le fichier de transactions « %s » : %m" - -#~ msgid "could not close relation mapping file \"%s\": %m" -#~ msgstr "n'a pas pu fermer le fichier de correspondance des relations « %s » : %m" - -#~ msgid "could not close two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu fermer le fichier d'état de la validation en deux phases nommé\n" -#~ "« %s » : %m" - -#~ msgid "could not close two-phase state file: %m" -#~ msgstr "n'a pas pu fermer le fichier d'état de la validation en deux phases : %m" - -#~ msgid "could not complete SSL handshake on renegotiation, too many failures" -#~ msgstr "n'a pas pu terminer la poignée de main de renégotiation, trop d'échecs" - -#, c-format -#~ msgid "could not connect socket for statistics collector: %m" -#~ msgstr "n'a pas pu connecter la socket au récupérateur de statistiques : %m" - -#~ msgid "could not create %s socket: %m" -#~ msgstr "n'a pas pu créer le socket %s : %m" - -#~ msgid "could not create XPath object" -#~ msgstr "n'a pas pu créer l'objet XPath" - -#~ msgid "could not create control file \"%s\": %m" -#~ msgstr "n'a pas pu créer le fichier de contrôle « %s » : %m" - -#~ msgid "could not create log file \"%s\": %m" -#~ msgstr "n'a pas pu créer le journal applicatif « %s » : %m" - -#~ msgid "could not create signal dispatch thread: error code %lu\n" -#~ msgstr "n'a pas pu créer le thread de répartition des signaux : code d'erreur %lu\n" - -#, c-format -#~ msgid "could not create socket for statistics collector: %m" -#~ msgstr "n'a pas pu créer la socket pour le récupérateur de statistiques : %m" - -#~ msgid "could not create two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu créer le fichier de statut de la validation en deux phases nommé\n" -#~ "« %s » : %m" - -#, c-format -#~ msgid "could not delete shared fileset \"%s\": %m" -#~ msgstr "n'a pas pu supprimer l'ensemble de fichiers partagés « %s » : %m" - -#~ msgid "could not determine actual result type for function declared to return type %s" -#~ msgstr "" -#~ "n'a pas pu déterminer le type du résultat actuel pour la fonction déclarant\n" -#~ "renvoyer le type %s" - -#~ msgid "could not determine data type for argument 1" -#~ msgstr "n'a pas pu déterminer le type de données pour l'argument 1" - -#~ msgid "could not determine data type for argument 2" -#~ msgstr "n'a pas pu déterminer le type de données pour l'argument 2" - -#~ msgid "could not determine input data types" -#~ msgstr "n'a pas pu déterminer les types de données en entrée" - -#~ msgid "could not determine which collation to use for initcap() function" -#~ msgstr "n'a pas pu déterminer le collationnement à utiliser pour la fonction initcap()" - -#~ msgid "could not determine which collation to use for partition bound expression" -#~ msgstr "n'a pas pu déterminer le collationnement à utiliser pour l'expression de limites de partitionnement" - -#~ msgid "could not determine which collation to use for upper() function" -#~ msgstr "n'a pas pu déterminer le collationnement à utiliser pour la fonction upper()" - -#~ msgid "could not enable Lock Pages in Memory user right" -#~ msgstr "n'a pas pu activer le Lock Pages in Memory user right" - -#~ msgid "could not enable Lock Pages in Memory user right: error code %lu" -#~ msgstr "n'a pas pu activer le Lock Pages in Memory user right : code d'erreur %lu" - -#~ msgid "could not enable credential reception: %m" -#~ msgstr "n'a pas pu activer la réception de lettres de créance : %m" - -#~ msgid "could not extend relation %s: %m" -#~ msgstr "n'a pas pu étendre la relation %s : %m" - -#~ msgid "could not fdatasync log file %s: %m" -#~ msgstr "n'a pas pu synchroniser sur disque (fdatasync) le journal de transactions %s : %m" - -#~ msgid "could not fetch table info for table \"%s.%s\": %s" -#~ msgstr "n'a pas pu récupérer les informations sur la table « %s.%s » : %s" - -#~ msgid "could not fork archiver: %m" -#~ msgstr "n'a pas pu lancer le processus fils correspondant au processus d'archivage : %m" - -#, c-format -#~ msgid "could not fork statistics collector: %m" -#~ msgstr "" -#~ "n'a pas pu lancer le processus fils correspondant au récupérateur de\n" -#~ "statistiques : %m" - -#~ msgid "could not format \"circle\" value" -#~ msgstr "n'a pas pu formater la valeur « circle »" - -#~ msgid "could not format \"path\" value" -#~ msgstr "n'a pas pu formater la valeur « path »" - -#~ msgid "could not forward fsync request because request queue is full" -#~ msgstr "n'a pas pu envoyer la requête fsync car la queue des requêtes est pleine" - -#~ msgid "could not fseek in file \"%s\": %m" -#~ msgstr "n'a pas pu effectuer de fseek dans le fichier « %s » : %m" - -#~ msgid "could not fsync control file: %m" -#~ msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier de contrôle : %m" - -#~ msgid "could not fsync file \"%s\" but retrying: %m" -#~ msgstr "" -#~ "n'a pas pu synchroniser sur disque (fsync) le fichier « %s », nouvelle\n" -#~ "tentative : %m" - -#~ msgid "could not fsync log file %s: %m" -#~ msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier de transactions « %s » : %m" - -#~ msgid "could not fsync log segment %s: %m" -#~ msgstr "n'a pas pu synchroniser sur disque (fsync) le segment du journal des transactions %s : %m" - -#~ msgid "could not fsync relation mapping file \"%s\": %m" -#~ msgstr "n'a pas pu synchroniser (fsync) le fichier de correspondance des relations « %s » : %m" - -#~ msgid "could not fsync segment %u of relation %s but retrying: %m" -#~ msgstr "" -#~ "n'a pas pu synchroniser sur disque (fsync) le segment %u de la relation\n" -#~ "%s, nouvelle tentative : %m" - -#~ msgid "could not fsync segment %u of relation %s: %m" -#~ msgstr "" -#~ "n'a pas pu synchroniser sur disque (fsync) le segment %u de la relation\n" -#~ "%s : %m" - -#~ msgid "could not fsync two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu synchroniser sur disque (fsync) le fichier d'état de la\n" -#~ "validation en deux phases nommé « %s » : %m" - -#~ msgid "could not fsync two-phase state file: %m" -#~ msgstr "" -#~ "n'a pas pu synchroniser sur disque (fsync) le fichier d'état de la\n" -#~ "validation en deux phases : %m" - -#, c-format -#~ msgid "could not get address of socket for statistics collector: %m" -#~ msgstr "n'a pas pu obtenir l'adresse de la socket du récupérateur de statistiques : %m" - -#~ msgid "could not get effective UID from peer credentials: %m" -#~ msgstr "n'a pas pu obtenir l'UID réel à partir des pièces d'identité de l'autre : %m" - -#~ msgid "could not get keyword values for locale \"%s\": %s" -#~ msgstr "n'a pas pu obtenir les valeurs des mots clés pour la locale « %s » : %s" - -#~ msgid "could not get security token from context" -#~ msgstr "n'a pas pu récupérer le jeton de sécurité à partir du contexte" - -#~ msgid "could not identify current directory: %s" -#~ msgstr "n'a pas pu identifier le répertoire courant : %s" - -#~ msgid "could not link file \"%s\" to \"%s\" (initialization of log file): %m" -#~ msgstr "n'a pas pu lier le fichier « %s » à « %s » (initialisation du journal de transactions) : %m" - -#~ msgid "could not load wldap32.dll" -#~ msgstr "n'a pas pu charger wldap32.dll" - -#~ msgid "could not open %s: %m" -#~ msgstr "n'a pas pu ouvrir %s : %m" - -#~ msgid "could not open BufFile \"%s\"" -#~ msgstr "n'a pas pu ouvrir le BufFile « %s »" - -#~ msgid "could not open archive status directory \"%s\": %m" -#~ msgstr "n'a pas pu accéder au répertoire du statut des archives « %s » : %m" - -#~ msgid "could not open control file \"%s\": %m" -#~ msgstr "n'a pas pu ouvrir le fichier de contrôle « %s » : %m" - -#~ msgid "could not open directory \"%s\": %s\n" -#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s\n" - -#~ msgid "could not open directory \"pg_tblspc\": %m" -#~ msgstr "n'a pas pu ouvrir le répertoire « pg_tblspc » : %m" - -#~ msgid "could not open file \"%s\" (log file %u, segment %u): %m" -#~ msgstr "n'a pas pu ouvrir le fichier « %s » (journal de transactions %u, segment %u) : %m" - -#~ msgid "could not open new log file \"%s\": %m" -#~ msgstr "n'a pas pu ouvrir le nouveau journal applicatif « %s » : %m" - -#~ msgid "could not open recovery command file \"%s\": %m" -#~ msgstr "n'a pas pu ouvrir le fichier de restauration « %s » : %m" - -#~ msgid "could not open relation %s: %m" -#~ msgstr "n'a pas pu ouvrir la relation %s : %m" - -#~ msgid "could not open segment %u of relation %s: %m" -#~ msgstr "n'a pas pu ouvrir le segment %u de la relation %s : %m" - -#~ msgid "could not open tablespace directory \"%s\": %m" -#~ msgstr "n'a pas pu ouvrir le répertoire du tablespace « %s » : %m" - -#~ msgid "could not open two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu ouvrir le fichier d'état de la validation en deux phases nommé\n" -#~ "« %s » : %m" - -#~ msgid "could not open write-ahead log directory \"%s\": %m" -#~ msgstr "n'a pas pu ouvrir le répertoire des journaux de transactions « %s » : %m" - -#~ msgid "could not open write-ahead log file \"%s\": %m" -#~ msgstr "n'a pas pu écrire dans le journal de transactions « %s » : %m" - -#~ msgid "could not parse transaction log location \"%s\"" -#~ msgstr "n'a pas pu analyser l'emplacement du journal des transactions « %s »" - -#, c-format -#~ msgid "could not poll socket: %m" -#~ msgstr "n'a pas pu interroger la socket : %m" - -#~ msgid "could not read block %u of relation %s: %m" -#~ msgstr "n'a pas pu lire le bloc %u de la relation %s : %m" - -#~ msgid "could not read directory \"%s\": %s\n" -#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n" - -#~ msgid "could not read file \"%s\", read %d of %d: %m" -#~ msgstr "n'a pas pu lire le fichier « %s », lu %d sur %d : %m" - -#~ msgid "could not read file \"%s\", read %d of %u: %m" -#~ msgstr "n'a pas pu lire le fichier « %s », a lu %d sur %u : %m" - -#~ msgid "could not read file \"%s\": read %d of %d" -#~ msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %d" - -#~ msgid "could not read from control file: %m" -#~ msgstr "n'a pas pu lire le fichier de contrôle : %m" - -#~ msgid "could not read from control file: read %d bytes, expected %d" -#~ msgstr "n'a pas pu lire le fichier de contrôle : lu %d octets, %d attendus" - -#~ msgid "could not read from file \"%s\"" -#~ msgstr "n'a pas pu lire à partir du fichier « %s »" - -#~ msgid "could not read from log segment %s, offset %u, length %lu: %m" -#~ msgstr "n'a pas pu lire le journal de transactions %s, décalage %u, longueur %lu : %m" - -#~ msgid "could not read from log segment %s, offset %u, length %zu: %m" -#~ msgstr "n'a pas pu lire le segment %s du journal de transactions, décalage %u, longueur %zu : %m" - -#, c-format -#~ msgid "could not read from temporary file: %m" -#~ msgstr "n'a pas pu lire le fichier temporaire : %m" - -#~ msgid "could not read relation mapping file \"%s\": %m" -#~ msgstr "n'a pas pu lire le fichier de correspondance des relations « %s » : %m" - -#, c-format -#~ msgid "could not read statistics message: %m" -#~ msgstr "n'a pas pu lire le message des statistiques : %m" - -#~ msgid "could not read symbolic link \"%s\"" -#~ msgstr "n'a pas pu lire le lien symbolique « %s »" - -#~ msgid "could not read two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu lire le fichier d'état de la validation en deux phases nommé\n" -#~ "« %s » : %m" - -#, c-format -#~ msgid "could not receive test message on socket for statistics collector: %m" -#~ msgstr "" -#~ "n'a pas pu recevoir le message de tests sur la socket du récupérateur de\n" -#~ "statistiques : %m" - -#~ msgid "could not recreate two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu re-créer le fichier d'état de la validation en deux phases nommé\n" -#~ "« %s » : %m" - -#~ msgid "could not remove database directory \"%s\"" -#~ msgstr "n'a pas pu supprimer le répertoire de bases de données « %s »" - -#~ msgid "could not remove file or directory \"%s\": %s\n" -#~ msgstr "n'a pas pu supprimer le fichier ou répertoire « %s » : %s\n" - -#~ msgid "could not remove old transaction log file \"%s\": %m" -#~ msgstr "n'a pas pu supprimer l'ancien journal de transaction « %s » : %m" - -#~ msgid "could not remove relation %s: %m" -#~ msgstr "n'a pas pu supprimer la relation %s : %m" - -#~ msgid "could not remove segment %u of relation %s: %m" -#~ msgstr "n'a pas pu supprimer le segment %u de la relation %s : %m" - -#~ msgid "could not remove two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu supprimer le fichier d'état de la validation en deux phases\n" -#~ "« %s » : %m" - -#~ msgid "could not rename file \"%s\" to \"%s\" (initialization of log file): %m" -#~ msgstr "n'a pas pu renommer le fichier « %s » en « %s » (initialisation du journal de transactions) : %m" - -#~ msgid "could not rename old write-ahead log file \"%s\": %m" -#~ msgstr "n'a pas pu renommer l'ancien journal de transactions « %s » : %m" - -#~ msgid "could not reposition held cursor" -#~ msgstr "n'a pas pu repositionner le curseur détenu" - -#~ msgid "could not reread block %d of file \"%s\": %m" -#~ msgstr "n'a pas pu relire le bloc %d dans le fichier « %s » : %m" - -#, c-format -#~ msgid "could not resolve \"localhost\": %s" -#~ msgstr "n'a pas pu résoudre « localhost » : %s" - -#~ msgid "could not rmdir directory \"%s\": %m" -#~ msgstr "n'a pas pu supprimer le répertoire « %s » : %m" - -#~ msgid "could not seek in log file %s to offset %u: %m" -#~ msgstr "n'a pas pu se déplacer dans le fichier de transactions « %s » au décalage %u : %m" - -#~ msgid "could not seek in log segment %s to offset %u: %m" -#~ msgstr "n'a pas pu se déplacer dans le journal de transactions %s au décalage %u : %m" - -#~ msgid "could not seek in two-phase state file: %m" -#~ msgstr "" -#~ "n'a pas pu se déplacer dans le fichier de statut de la validation en deux\n" -#~ "phases : %m" - -#~ msgid "could not seek to block %u in file \"%s\": %m" -#~ msgstr "n'a pas pu trouver le bloc %u dans le fichier « %s » : %m" - -#~ msgid "could not seek to block %u of relation %s: %m" -#~ msgstr "n'a pas pu se positionner sur le bloc %u de la relation %s : %m" - -#~ msgid "could not seek to end of segment %u of relation %s: %m" -#~ msgstr "n'a pas pu se déplacer à la fin du segment %u de la relation %s : %m" - -#, c-format -#~ msgid "could not send test message on socket for statistics collector: %m" -#~ msgstr "" -#~ "n'a pas pu envoyer le message de tests sur la socket du récupérateur de\n" -#~ "statistiques : %m" - -#~ msgid "could not set socket to blocking mode: %m" -#~ msgstr "n'a pas pu activer le mode bloquant pour la socket : %m" - -#, c-format -#~ msgid "could not set statistics collector socket to nonblocking mode: %m" -#~ msgstr "" -#~ "n'a pas pu initialiser la socket du récupérateur de statistiques dans le mode\n" -#~ "non bloquant : %m" - -#~ msgid "could not set statistics collector timer: %m" -#~ msgstr "n'a pas pu configurer le timer du récupérateur de statistiques : %m" - -#~ msgid "could not stat control file \"%s\": %m" -#~ msgstr "n'a pas pu récupérer des informations sur le fichier de contrôle « %s » : %m" - -#~ msgid "could not stat file or directory \"%s\": %s\n" -#~ msgstr "" -#~ "n'a pas pu récupérer les informations sur le fichier ou répertoire\n" -#~ "« %s » : %s\n" - -#~ msgid "could not stat two-phase state file \"%s\": %m" -#~ msgstr "" -#~ "n'a pas pu récupérer des informations sur le fichier d'état de la validation\n" -#~ "en deux phases nommé « %s » : %m" - -#~ msgid "could not write block %ld of temporary file: %m" -#~ msgstr "n'a pas pu écrire le bloc %ld du fichier temporaire : %m" - -#~ msgid "could not write block %u of relation %s: %m" -#~ msgstr "n'a pas pu écrire le bloc %u de la relation %s : %m" - -#~ msgid "could not write to control file: %m" -#~ msgstr "n'a pas pu écrire le fichier de contrôle : %m" - -#~ msgid "could not write to hash-join temporary file: %m" -#~ msgstr "n'a pas pu écrire le fichier temporaire de la jointure hâchée : %m" - -#~ msgid "could not write to relation mapping file \"%s\": %m" -#~ msgstr "n'a pas pu écrire le fichier de correspondance des relations « %s » : %m" - -#~ msgid "could not write to temporary file: %m" -#~ msgstr "n'a pas pu écrire dans le fichier temporaire : %m" - -#~ msgid "could not write to tuplestore temporary file: %m" -#~ msgstr "n'a pas pu écrire le fichier temporaire tuplestore : %m" - -#~ msgid "could not write two-phase state file: %m" -#~ msgstr "n'a pas pu écrire dans le fichier d'état de la validation en deux phases : %m" - -#, fuzzy -#~ msgid "couldn't put socket to blocking mode: %m" -#~ msgstr "n'a pas pu activer le mode bloquant pour la socket : %s\n" - -#, fuzzy -#~ msgid "couldn't put socket to non-blocking mode: %m" -#~ msgstr "n'a pas pu activer le mode non-bloquant pour la socket : %s\n" - -#~ msgid "data directory \"%s\" has group or world access" -#~ msgstr "" -#~ "le répertoire des données « %s » est accessible par le groupe et/ou par les\n" -#~ "autres" - -#~ msgid "data type \"%s.%s\" required for logical replication does not exist" -#~ msgstr "le type de données « %s/%s » requis par la réplication logique n'existe pas" - -#~ msgid "data type %s has no default btree operator class" -#~ msgstr "le type de données %s n'a pas de classe d'opérateurs btree par défaut" - -#~ msgid "data type %s has no default hash operator class" -#~ msgstr "le type de données %s n'a pas de classe d'opérateurs hash par défaut" - -#~ msgid "database \"%s\" not found" -#~ msgstr "base de données « %s » non trouvée" - -#, c-format -#~ msgid "database hash table corrupted during cleanup --- abort" -#~ msgstr "" -#~ "corruption de la table hachée de la base de données lors du lancement\n" -#~ "--- annulation" - -#~ msgid "database name cannot be qualified" -#~ msgstr "le nom de la base de donnée ne peut être qualifié" - -#~ msgid "database system is in consistent recovery mode" -#~ msgstr "le système de bases de données est dans un mode de restauration cohérent" - -#~ msgid "date/time value \"%s\" is no longer supported" -#~ msgstr "la valeur date/time « %s » n'est plus supportée" - -#~ msgid "date/time value \"current\" is no longer supported" -#~ msgstr "la valeur « current » pour la date et heure n'est plus supportée" - -#~ msgid "default expression must not return a set" -#~ msgstr "l'expression par défaut ne doit pas renvoyer un ensemble" - -#~ msgid "default values on foreign tables are not supported" -#~ msgstr "les valeurs par défaut ne sont pas supportées sur les tables distantes" - -#~ msgid "deferrable snapshot was unsafe; trying a new one" -#~ msgstr "l'image déferrable est non sûre ; tentative avec une nouvelle image" - -#~ msgid "directory \"%s\" is not empty" -#~ msgstr "le répertoire « %s » n'est pas vide" - -#~ msgid "disabling huge pages" -#~ msgstr "désactivation des Huge Pages" - -#, c-format -#~ msgid "disabling statistics collector for lack of working socket" -#~ msgstr "" -#~ "désactivation du récupérateur de statistiques à cause du manque de socket\n" -#~ "fonctionnel" - -#~ msgid "distance in phrase operator should be non-negative and less than %d" -#~ msgstr "la distance dans l'opérateur de phrase devrait être non négative et inférieure à %d" - -#~ msgid "domain %s has multiple constraints named \"%s\"" -#~ msgstr "le domaine %s a plusieurs contraintes nommées « %s »" - -#~ msgid "drop auto-cascades to %s" -#~ msgstr "DROP cascade automatiquement sur %s" - -#~ msgid "encoding name too long" -#~ msgstr "nom d'encodage trop long" - -#~ msgid "epoll_ctl() failed: %m" -#~ msgstr "échec de epoll_ctl() : %m" - -#~ msgid "epoll_wait() failed: %m" -#~ msgstr "échec de epoll_wait() : %m" - -#~ msgid "event trigger name cannot be qualified" -#~ msgstr "le nom du trigger sur événement ne peut pas être qualifié" - -#, c-format -#~ msgid "exclusive backup not in progress" -#~ msgstr "une sauvegarde exclusive n'est pas en cours" - -#~ msgid "existing constraints on column \"%s.%s\" are sufficient to prove that it does not contain nulls" -#~ msgstr "les contraintes existantes sur la colonne « %s.%s » sont suffisantes pour prouver qu'elle ne contient aucun NULL" - -#~ msgid "extension name cannot be qualified" -#~ msgstr "le nom de l'extension ne peut pas être qualifié" - -#~ msgid "failed to create BIO" -#~ msgstr "échec pour la création de BIO" - -#~ msgid "failed to drop all objects depending on %s" -#~ msgstr "échec lors de la suppression de tous les objets dépendant de %s" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatal : " - -#~ msgid "fillfactor=%d is out of range (should be between %d and 100)" -#~ msgstr "le facteur de remplissage (%d) est en dehors des limites (il devrait être entre %d et 100)" - -#~ msgid "first argument of json_populate_record must be a row type" -#~ msgstr "le premier argument de json_populate_record doit être un type ROW" - -#~ msgid "first argument of json_populate_recordset must be a row type" -#~ msgstr "le premier argument de json_populate_recordset doit être un type ROW" - -#~ msgid "foreign key constraint \"%s\" of relation \"%s\" does not exist" -#~ msgstr "la clé étrangère « %s » de la relation « %s » n'existe pas" - -#~ msgid "foreign key constraints are not supported on partitioned tables" -#~ msgstr "les clés étrangères ne sont pas supportées sur les tables partitionnées" - -#~ msgid "foreign key referencing partitioned table \"%s\" must not be ONLY" -#~ msgstr "la clé étrangère référençant la table partitionnée « %s » ne doit pas être ONLY" - -#~ msgid "foreign-data wrapper name cannot be qualified" -#~ msgstr "le nom du wrapper de données distantes ne peut pas être qualifié" - -#~ msgid "frame start at CURRENT ROW is not implemented" -#~ msgstr "début du frame à CURRENT ROW n'est pas implémenté" - -#~ msgid "free space map contains %d pages in %d relations" -#~ msgstr "la structure FSM contient %d pages dans %d relations" - -#~ msgid "function \"%s\" already exists in schema \"%s\"" -#~ msgstr "la fonction « %s » existe déjà dans le schéma « %s »" - -#~ msgid "function \"%s\" is an aggregate function" -#~ msgstr "la fonction « %s » est une fonction d'agrégat" - -#~ msgid "function \"%s\" is not an aggregate function" -#~ msgstr "la fonction « %s » n'est pas une fonction d'agrégat" - -#~ msgid "function \"%s\" must return type \"event_trigger\"" -#~ msgstr "la fonction « %s » doit renvoyer le type « event_trigger »" - -#, c-format -#~ msgid "function \"close_lb\" not implemented" -#~ msgstr "la fonction « close_lb » n'est pas implémentée" - -#, c-format -#~ msgid "function \"close_sl\" not implemented" -#~ msgstr "la fonction « close_sl » n'est pas implémentée" - -#, c-format -#~ msgid "function \"dist_bl\" not implemented" -#~ msgstr "fonction « dist_lb » non implémentée" - -#, c-format -#~ msgid "function \"dist_lb\" not implemented" -#~ msgstr "la fonction « dist_lb » n'est pas implémentée" - -#, c-format -#~ msgid "function \"path_center\" not implemented" -#~ msgstr "la fonction « path_center » n'est pas implémentée" - -#, c-format -#~ msgid "function \"poly_distance\" not implemented" -#~ msgstr "la fonction « poly_distance » n'est pas implémentée" - -#~ msgid "function %s must return type \"fdw_handler\"" -#~ msgstr "la fonction %s doit renvoyer le type « fdw_handler »" - -#~ msgid "function %s must return type \"language_handler\"" -#~ msgstr "la fonction %s doit renvoyer le type « language_handler »" - -#~ msgid "function %s must return type \"trigger\"" -#~ msgstr "la fonction %s doit renvoyer le type « trigger »" - -#~ msgid "function %s must return type \"tsm_handler\"" -#~ msgstr "la fonction %s doit renvoyer le type « tsm_handler »" - -#~ msgid "function %u has too many arguments (%d, maximum is %d)" -#~ msgstr "la fonction %u a trop d'arguments (%d, le maximum étant %d)" - -#~ msgid "function expression in FROM cannot refer to other relations of same query level" -#~ msgstr "" -#~ "l'expression de la fonction du FROM ne peut pas faire référence à d'autres\n" -#~ "relations sur le même niveau de la requête" - -#~ msgid "function returning set of rows cannot return null value" -#~ msgstr "" -#~ "la fonction renvoyant un ensemble de lignes ne peut pas renvoyer une valeur\n" -#~ "NULL" - -#~ msgid "functions and operators can take at most one set argument" -#~ msgstr "les fonctions et opérateurs peuvent prendre au plus un argument d'ensemble" - -#~ msgid "gist operator family \"%s\" contains function %s with invalid support number %d" -#~ msgstr "" -#~ "la famille d'opérateur gist « %s » contient la fonction %s avec\n" -#~ "le numéro de support invalide %d" - -#~ msgid "gist operator family \"%s\" contains function %s with wrong signature for support number %d" -#~ msgstr "" -#~ "la famille d'opérateur gist « %s » contient la fonction %s avec une mauvaise\n" -#~ "signature pour le numéro de support %d" - -#~ msgid "gist operator family \"%s\" contains operator %s with invalid strategy number %d" -#~ msgstr "" -#~ "la famille d'opérateur gist « %s » contient l'opérateur %s avec le numéro\n" -#~ "de stratégie invalide %d" - -#~ msgid "gist operator family \"%s\" contains operator %s with wrong signature" -#~ msgstr "la famille d'opérateur gist « %s » contient l'opérateur %s avec une mauvaise signature" - -#~ msgid "gist operator family \"%s\" contains support procedure %s with cross-type registration" -#~ msgstr "" -#~ "la famille d'opérateur gist « %s » contient la procédure de support\n" -#~ "%s avec un enregistrement inter-type" - -#~ msgid "hash indexes are not WAL-logged and their use is discouraged" -#~ msgstr "les index hash ne sont pas journalisés, leur utilisation est donc déconseillée" - -#~ msgid "hash operator class \"%s\" is missing operator(s)" -#~ msgstr "il manque des opérateurs pour la classe d'opérateur hash « %s »" - -#~ msgid "hash operator family \"%s\" contains function %s with invalid support number %d" -#~ msgstr "" -#~ "la famille d'opérateur hash « %s » contient la fonction %s avec\n" -#~ "le numéro de support invalide %d" - -#~ msgid "hash operator family \"%s\" contains function %s with wrong signature for support number %d" -#~ msgstr "" -#~ "la famille d'opérateur hash « %s » contient la fonction %s avec une mauvaise\n" -#~ "signature pour le numéro de support %d" - -#~ msgid "hash operator family \"%s\" contains invalid ORDER BY specification for operator %s" -#~ msgstr "" -#~ "la famille d'opérateur hash « %s » contient la spécification ORDER BY\n" -#~ "non supportée pour l'opérateur %s" - -#~ msgid "hash operator family \"%s\" contains operator %s with invalid strategy number %d" -#~ msgstr "" -#~ "la famille d'opérateur hash « %s » contient l'opérateur %s avec le numéro\n" -#~ "de stratégie invalide %d" - -#~ msgid "hash operator family \"%s\" contains operator %s with wrong signature" -#~ msgstr "la famille d'opérateur hash « %s » contient l'opérateur %s avec une mauvaise signature" - -#~ msgid "hash operator family \"%s\" contains support procedure %s with cross-type registration" -#~ msgstr "" -#~ "la famille d'opérateur hash « %s » contient la procédure de support\n" -#~ "%s avec un enregistrement inter-type" - -#~ msgid "hash operator family \"%s\" is missing operator(s) for types %s and %s" -#~ msgstr "" -#~ "la famille d'opérateur hash « %s » nécessite des opérateurs supplémentaires\n" -#~ "pour les types %s et %s" - -#~ msgid "hostssl requires SSL to be turned on" -#~ msgstr "hostssl requiert que SSL soit activé" - -#~ msgid "huge TLB pages not supported on this platform" -#~ msgstr "Huge Pages TLB non supporté sur cette plateforme." - -#~ msgid "hurrying in-progress restartpoint" -#~ msgstr "accélération du restartpoint en cours" - -#~ msgid "ignoring \"%s\" file because no \"%s\" file exists" -#~ msgstr "ignore le fichier « %s » parce que le fichier « %s » n'existe pas" - -#~ msgid "ignoring incomplete trigger group for constraint \"%s\" %s" -#~ msgstr "ignore le groupe de trigger incomplet pour la contrainte « %s » %s" - -#~ msgid "in progress" -#~ msgstr "en cours" - -#~ msgid "inconsistent use of year %04d and \"BC\"" -#~ msgstr "utilisation non cohérente de l'année %04d et de « BC »" - -#~ msgid "incorrect hole size in record at %X/%X" -#~ msgstr "taille du trou incorrect à l'enregistrement %X/%X" - -#, c-format -#~ msgid "incorrect test message transmission on socket for statistics collector" -#~ msgstr "" -#~ "transmission incorrecte du message de tests sur la socket du récupérateur de\n" -#~ "statistiques" - -#~ msgid "incorrect total length in record at %X/%X" -#~ msgstr "longueur totale incorrecte à l'enregistrement %X/%X" - -#~ msgid "index \"%s\" is not a b-tree" -#~ msgstr "l'index « %s » n'est pas un btree" - -#~ msgid "index \"%s\" is not ready" -#~ msgstr "l'index « %s » n'est pas prêt" - -#~ msgid "index \"%s\" needs VACUUM FULL or REINDEX to finish crash recovery" -#~ msgstr "" -#~ "l'index « %s » a besoin d'un VACUUM FULL ou d'un REINDEX pour terminer la\n" -#~ "récupération suite à un arrêt brutal" - -#~ msgid "index \"%s\" needs VACUUM or REINDEX to finish crash recovery" -#~ msgstr "" -#~ "l'index « %s » a besoin d'un VACUUM ou d'un REINDEX pour terminer la\n" -#~ "récupération suite à un arrêt brutal" - -#~ msgid "index \"%s\" now contains %.0f row versions in %u pages as reported by parallel vacuum worker" -#~ msgstr "l'index « %s » contient maintenant %.0f versions de lignes dans %u pages, comme indiqué par le worker parallélisé du VACUUM" - -#~ msgid "index %u/%u/%u needs VACUUM FULL or REINDEX to finish crash recovery" -#~ msgstr "" -#~ "l'index %u/%u/%u a besoin d'un VACUUM FULL ou d'un REINDEX pour terminer la\n" -#~ "récupération suite à un arrêt brutal" - -#~ msgid "index expression cannot return a set" -#~ msgstr "l'expression de l'index ne peut pas renvoyer un ensemble" - -#~ msgid "index row size %lu exceeds btree maximum, %lu" -#~ msgstr "la taille de la ligne index %lu dépasse le maximum de btree, %lu" - -#~ msgid "index row size %lu exceeds maximum %lu for index \"%s\"" -#~ msgstr "la taille de la ligne index, %lu, dépasse le maximum, %lu, pour l'index « %s »" - -#~ msgid "initializing for hot standby" -#~ msgstr "initialisation pour « Hot Standby »" - -#~ msgid "insufficient columns in %s constraint definition" -#~ msgstr "colonnes infuffisantes dans la définition de contrainte de %s" - -#~ msgid "insufficient shared memory for free space map" -#~ msgstr "mémoire partagée insuffisante pour la structure FSM" - -#, c-format -#~ msgid "int2vector has too many elements" -#~ msgstr "int2vector a trop d'éléments" - -#~ msgid "interval precision specified twice" -#~ msgstr "précision d'intervalle spécifiée deux fois" - -#, c-format -#~ msgid "interval units \"%s\" not recognized" -#~ msgstr "les unités « %s » ne sont pas reconnues pour le type interval" - -#, c-format -#~ msgid "interval units \"%s\" not supported" -#~ msgstr "les unités « %s » ne sont pas supportées pour le type interval" - -#~ msgid "invalid LC_CTYPE setting" -#~ msgstr "paramètre LC_CTYPE invalide" - -#~ msgid "invalid MVNDistinct size %zd (expected at least %zd)" -#~ msgstr "taille MVNDistinct %zd invalide (attendue au moins %zd)" - -#~ msgid "invalid OID in COPY data" -#~ msgstr "OID invalide dans les données du COPY" - -#, fuzzy -#~ msgid "invalid WAL message received from primary" -#~ msgstr "format du message invalide" - -#~ msgid "invalid backup block size in record at %X/%X" -#~ msgstr "taille du bloc de sauvegarde invalide dans l'enregistrement à %X/%X" - -#, c-format -#~ msgid "invalid compressed image at %X/%X, block %d" -#~ msgstr "image compressée invalide à %X/%X, bloc %d" - -#~ msgid "invalid concatenation of jsonb objects" -#~ msgstr "concaténation invalide d'objets jsonb" - -#~ msgid "invalid contrecord length %u at %X/%X reading %X/%X, expected %u" -#~ msgstr "longueur %u invalide du contrecord à %X/%X en lisant %X/%X, attendait %u" - -#~ msgid "invalid contrecord length %u in log file %u, segment %u, offset %u" -#~ msgstr "" -#~ "longueur invalide du « contrecord » %u dans le journal de tranasctions %u,\n" -#~ "segment %u, décalage %u" - -#~ msgid "invalid entry in file \"%s\" at line %d, token \"%s\"" -#~ msgstr "entrée invalide dans le fichier « %s » à la ligne %d, jeton « %s »" - -#~ msgid "invalid hexadecimal digit" -#~ msgstr "chiffre hexadécimal invalide" - -#~ msgid "invalid input syntax for %s: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type %s : « %s »" - -#~ msgid "invalid input syntax for integer: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour l'entier : « %s »" - -#~ msgid "invalid input syntax for numeric time zone: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le fuseau horaire numérique : « %s »" - -#~ msgid "invalid input syntax for transaction log location: \"%s\"" -#~ msgstr "syntaxe invalide en entrée pour l'emplacement du journal de transactions : « %s »" - -#~ msgid "invalid input syntax for type boolean: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type booléen : « %s »" - -#~ msgid "invalid input syntax for type box: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type box : « %s »" - -#~ msgid "invalid input syntax for type bytea" -#~ msgstr "syntaxe en entrée invalide pour le type bytea" - -#~ msgid "invalid input syntax for type circle: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type circle : « %s »" - -#~ msgid "invalid input syntax for type double precision: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type double precision : « %s »" - -#~ msgid "invalid input syntax for type line: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type line: « %s »" - -#~ msgid "invalid input syntax for type lseg: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type lseg : « %s »" - -#~ msgid "invalid input syntax for type macaddr: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type macaddr : « %s »" - -#~ msgid "invalid input syntax for type money: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type money : « %s »" - -#~ msgid "invalid input syntax for type numeric: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type numeric : « %s »" - -#~ msgid "invalid input syntax for type oid: \"%s\"" -#~ msgstr "syntaxe invalide en entrée pour le type oid : « %s »" - -#~ msgid "invalid input syntax for type path: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type path : « %s »" - -#~ msgid "invalid input syntax for type pg_lsn: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type pg_lsn : « %s »" - -#~ msgid "invalid input syntax for type point: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type point : « %s »" - -#~ msgid "invalid input syntax for type polygon: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type polygon : « %s »" - -#~ msgid "invalid input syntax for type real: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type real : « %s »" - -#~ msgid "invalid input syntax for type tid: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type tid : « %s »" - -#~ msgid "invalid input syntax for type tinterval: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type tinterval : « %s »" - -#~ msgid "invalid input syntax for type txid_snapshot: \"%s\"" -#~ msgstr "syntaxe en entrée invalide pour le type txid_snapshot : « %s »" - -#~ msgid "invalid input syntax for uuid: \"%s\"" -#~ msgstr "syntaxe invalide en entrée pour l'uuid : « %s »" - -#~ msgid "invalid interval value for time zone: day not allowed" -#~ msgstr "valeur d'intervalle invalide pour le fuseau horaire : jour non autorisé" - -#~ msgid "invalid interval value for time zone: month not allowed" -#~ msgstr "valeur d'intervalle invalide pour le fuseau horaire : les mois ne sont pas autorisés" - -#~ msgid "invalid length in external \"numeric\" value" -#~ msgstr "longueur invalide dans la valeur externe « numeric »" - -#~ msgid "invalid length of secondary checkpoint record" -#~ msgstr "longueur invalide de l'enregistrement secondaire du point de vérification" - -#, c-format -#~ msgid "invalid list syntax for \"publish\" option" -#~ msgstr "syntaxe de liste invalide pour l'option « publish »" - -#~ msgid "invalid list syntax for \"unix_socket_directories\"" -#~ msgstr "syntaxe de liste invalide pour le paramètre « unix_socket_directories »" - -#~ msgid "invalid list syntax for parameter \"datestyle\"" -#~ msgstr "syntaxe de liste invalide pour le paramètre « datestyle »" - -#~ msgid "invalid list syntax for parameter \"log_destination\"" -#~ msgstr "syntaxe de liste invalide pour le paramètre « log_destination »" - -#~ msgid "invalid ndistinct magic %08x (expected %08x)" -#~ msgstr "nombre magique ndistinct invalide %08x (attendu %08x)" - -#~ msgid "invalid ndistinct type %d (expected %d)" -#~ msgstr "type ndistinct invalide %d (%d attendu)" - -#~ msgid "invalid number of arguments: object must be matched key value pairs" -#~ msgstr "nombre d'arguments invalide : l'objet doit correspond aux paires clé/valeur" - -#~ msgid "invalid privilege type USAGE for table" -#~ msgstr "droit USAGE invalide pour la table" - -#~ msgid "invalid procedure number %d, must be between 1 and %d" -#~ msgstr "numéro de procédure %d invalide, doit être compris entre 1 et %d" - -#~ msgid "invalid publish list" -#~ msgstr "liste de publication invalide" - -#~ msgid "invalid record length at %X/%X" -#~ msgstr "longueur invalide de l'enregistrement à %X/%X" - -#~ msgid "invalid regexp option: \"%c\"" -#~ msgstr "option invalide de l'expression rationnelle : « %c »" - -#~ msgid "invalid resource manager ID in secondary checkpoint record" -#~ msgstr "identifiant du gestionnaire de ressource invalide dans l'enregistrement secondaire du point de vérification" - -#~ msgid "invalid role name \"%s\"" -#~ msgstr "nom de rôle « %s » invalide" - -#~ msgid "invalid role password \"%s\"" -#~ msgstr "mot de passe « %s » de l'utilisateur invalide" - -#~ msgid "invalid secondary checkpoint link in control file" -#~ msgstr "lien du point de vérification secondaire invalide dans le fichier de contrôle" - -#~ msgid "invalid secondary checkpoint record" -#~ msgstr "enregistrement du point de vérification secondaire invalide" - -#~ msgid "invalid socket: %s" -#~ msgstr "socket invalide : %s" - -#~ msgid "invalid standby handshake message type %d" -#~ msgstr "type %d du message de handshake du serveur en attente invalide" - -#~ msgid "invalid standby query string: %s" -#~ msgstr "chaîne de requête invalide sur le serveur en attente : %s" - -#~ msgid "invalid status in external \"tinterval\" value" -#~ msgstr "statut invalide dans la valeur externe « tinterval »" - -#~ msgid "invalid symbol" -#~ msgstr "symbole invalide" - -#~ msgid "invalid time zone name: \"%s\"" -#~ msgstr "nom du fuseau horaire invalide : « %s »" - -#~ msgid "invalid value for \"buffering\" option" -#~ msgstr "valeur invalide pour l'option « buffering »" - -#~ msgid "invalid value for \"check_option\" option" -#~ msgstr "valeur invalide pour l'option « check_option »" - -#~ msgid "invalid value for parameter \"replication\"" -#~ msgstr "valeur invalide pour le paramètre « replication »" - -#~ msgid "invalid value for recovery parameter \"%s\": \"%s\"" -#~ msgstr "valeur invalide pour le paramètre de restauration « %s » : « %s »" - -#~ msgid "invalid value for recovery parameter \"recovery_target\"" -#~ msgstr "valeur invalide pour le paramètre de restauration « recovery_target »" - -#~ msgid "invalid xl_info in secondary checkpoint record" -#~ msgstr "xl_info invalide dans l'enregistrement du point de vérification secondaire" - -#~ msgid "invalid xlog switch record at %X/%X" -#~ msgstr "enregistrement de basculement du journal de transaction invalide à %X/%X" - -#~ msgid "invalid zero-length item array in MVDependencies" -#~ msgstr "tableau d'éléments de longueur zéro invalide dans MVDependencies" - -#~ msgid "invalid zero-length item array in MVNDistinct" -#~ msgstr "tableau d'élément de longueur zéro invalide dans MVNDistinct" - -#~ msgid "krb5 authentication is not supported on local sockets" -#~ msgstr "" -#~ "l'authentification krb5 n'est pas supportée sur les connexions locales par\n" -#~ "socket" - -#~ msgid "language name cannot be qualified" -#~ msgstr "le nom du langage ne peut pas être qualifié" - -#~ msgid "large object %u was already dropped" -#~ msgstr "le « Large Object » %u a déjà été supprimé" - -#~ msgid "large object %u was not opened for writing" -#~ msgstr "le « Large Object » %u n'a pas été ouvert en écriture" - -#~ msgid "leftover placeholder tuple detected in BRIN index \"%s\", deleting" -#~ msgstr "reste d'espace de ligne réservé dans l'index BRIN « %s », suppression" - -#~ msgid "loaded library \"%s\"" -#~ msgstr "bibliothèque « %s » chargée" - -#~ msgid "log_restartpoints = %s" -#~ msgstr "log_restartpoints = %s" - -#~ msgid "logger shutting down" -#~ msgstr "arrêt en cours des journaux applicatifs" - -#~ msgid "logical replication apply worker for subscription \"%s\" will restart because subscription's publications were changed" -#~ msgstr "le processus apply de réplication logique pour la souscription « %s » redémarrera car les publications ont été modifiées" - -#~ msgid "logical replication apply worker for subscription \"%s\" will restart because the connection information was changed" -#~ msgstr "le processus apply de réplication logique pour la souscription « %s » redémarrera car la souscription a été modifiée" - -#~ msgid "logical replication apply worker for subscription \"%s\" will restart because the replication slot name was changed" -#~ msgstr "le processus apply de réplication logique pour la souscription « %s » redémarrera car le nom du slot de réplication a été modifiée" - -#~ msgid "logical replication at prepare time requires begin_prepare_cb callback" -#~ msgstr "la réplication logique lors de la préparation requiert la fonction begin_prepare_cb" - -#~ msgid "logical replication at prepare time requires commit_prepared_cb callback" -#~ msgstr "la réplication logique lors de la préparation requiert la fonction commit_prepared_cb" - -#~ msgid "logical replication at prepare time requires rollback_prepared_cb callback" -#~ msgstr "la réplication logique lors de la préparation requiert la fonction rollback_prepared_cb" - -#~ msgid "logical replication could not find row for delete in replication target relation \"%s\"" -#~ msgstr "la réplication logique n'a pas pu trouver la ligne à supprimer dans la relation cible de réplication %s" - -#~ msgid "logical replication launcher shutting down" -#~ msgstr "arrêt du processus de lancement de la réplication logique" - -#~ msgid "logical replication launcher started" -#~ msgstr "lancement du processus de lancement de la réplication logique" - -#~ msgid "logical replication target relation \"%s.%s\" is not a table" -#~ msgstr "la relation cible de la réplication logique « %s.%s » n'est pas une table" - -#~ msgid "logical streaming requires a stream_abort_cb callback" -#~ msgstr "le flux logique requiert une fonction stream_abort_cb" - -#~ msgid "logical streaming requires a stream_change_cb callback" -#~ msgstr "le flux logique requiert une fonction stream_change_cb" - -#~ msgid "logical streaming requires a stream_commit_cb callback" -#~ msgstr "la réplication logique requiert la fonction stream_commit_cb" - -#~ msgid "logical streaming requires a stream_start_cb callback" -#~ msgstr "le flux logique requiert une fonction stream_start_cb" - -#~ msgid "mapped win32 error code %lu to %d" -#~ msgstr "correspondance du code d'erreur win32 %lu en %d" - -#~ msgid "max_fsm_pages must exceed max_fsm_relations * %d" -#~ msgstr "max_fsm_pages doit excéder max_fsm_relations * %d" - -#~ msgid "max_fsm_relations(%d) equals the number of relations checked" -#~ msgstr "max_fsm_relations(%d) équivaut au nombre de relations tracées" - -#~ msgid "memory for serializable conflict tracking is nearly exhausted" -#~ msgstr "la mémoire pour tracer les conflits sérialisables est pratiquement pleine" - -#~ msgid "missing FROM-clause entry in subquery for table \"%s\"" -#~ msgstr "entrée manquante de la clause FROM dans la sous-requête de la table « %s »" - -#~ msgid "missing assignment operator" -#~ msgstr "opérateur d'affectation manquant" - -#~ msgid "missing data for OID column" -#~ msgstr "données manquantes pour la colonne OID" - -#~ msgid "missing field in file \"%s\" at end of line %d" -#~ msgstr "champ manquant dans le fichier « %s » à la fin de la ligne %d" - -#~ msgid "missing or erroneous pg_hba.conf file" -#~ msgstr "fichier pg_hba.conf manquant ou erroné" - -#~ msgid "moving row to another partition during a BEFORE trigger is not supported" -#~ msgstr "déplacer une ligne vers une autre partition lors de l'exécution d'un trigger BEFORE n'est pas supporté" - -#~ msgid "multibyte flag character is not allowed" -#~ msgstr "un caractère drapeau multi-octet n'est pas autorisé" - -#~ msgid "multiple DELETE events specified" -#~ msgstr "multiples événements DELETE spécifiés" - -#~ msgid "multiple TRUNCATE events specified" -#~ msgstr "multiples événements TRUNCATE spécifiés" - -#~ msgid "multiple constraints named \"%s\" were dropped" -#~ msgstr "les contraintes multiples nommées « %s » ont été supprimées" - -#, c-format -#~ msgid "must be a superuser to log memory contexts" -#~ msgstr "doit être super-utilisateur pour tracer les contextes mémoires" - -#~ msgid "must be superuser or have the same role to cancel queries running in other server processes" -#~ msgstr "" -#~ "doit être super-utilisateur ou avoir le même rôle pour annuler des requêtes\n" -#~ "exécutées dans les autres processus serveur" - -#~ msgid "must be superuser or have the same role to terminate other server processes" -#~ msgstr "" -#~ "doit être super-utilisateur ou avoir le même rôle pour fermer les connexions\n" -#~ "exécutées dans les autres processus serveur" - -#~ msgid "must be superuser or replication role to run a backup" -#~ msgstr "doit être super-utilisateur ou avoir l'attribut de réplication pour exécuter une sauvegarde" - -#~ msgid "must be superuser to COPY to or from a file" -#~ msgstr "doit être super-utilisateur pour utiliser COPY à partir ou vers un fichier" - -#~ msgid "must be superuser to alter replication users" -#~ msgstr "doit être super-utilisateur pour modifier des utilisateurs ayant l'attribut réplication" - -#, c-format -#~ msgid "must be superuser to call pg_nextoid()" -#~ msgstr "doit être un super-utilisateur pour appeller pg_nextoid()" - -#~ msgid "must be superuser to comment on procedural language" -#~ msgstr "" -#~ "doit être super-utilisateur pour ajouter un commentaire sur un langage de\n" -#~ "procédures" - -#~ msgid "must be superuser to comment on text search parser" -#~ msgstr "" -#~ "doit être super-utilisateur pour ajouter un commentaire sur l'analyseur de\n" -#~ "recherche plein texte" - -#~ msgid "must be superuser to comment on text search template" -#~ msgstr "" -#~ "doit être super-utilisateur pour ajouter un commentaire sur un modèle de\n" -#~ "recherche plein texte" - -#, c-format -#~ msgid "must be superuser to connect during database shutdown" -#~ msgstr "" -#~ "doit être super-utilisateur pour se connecter pendant un arrêt de la base de\n" -#~ "données" - -#~ msgid "must be superuser to control recovery" -#~ msgstr "doit être super-utilisateur pour contrôler la restauration" - -#~ msgid "must be superuser to create a restore point" -#~ msgstr "doit être super-utilisateur pour créer un point de restauration" - -#~ msgid "must be superuser to create procedural language \"%s\"" -#~ msgstr "doit être super-utilisateur pour créer le langage de procédures « %s »" - -#~ msgid "must be superuser to drop access methods" -#~ msgstr "doit être super-utilisateur pour supprimer des méthodes d'accès" - -#~ msgid "must be superuser to drop text search parsers" -#~ msgstr "" -#~ "doit être super-utilisateur pour supprimer des analyseurs de recherche plein\n" -#~ "texte" - -#~ msgid "must be superuser to drop text search templates" -#~ msgstr "doit être super-utilisateur pour supprimer des modèles de recherche plein texte" - -#, c-format -#~ msgid "must be superuser to execute ALTER SYSTEM command" -#~ msgstr "doit être super-utilisateur pour exécuter la commande ALTER SYSTEM" - -#~ msgid "must be superuser to get directory listings" -#~ msgstr "doit être super-utilisateur pour obtenir le contenu du répertoire" - -#~ msgid "must be superuser to get file information" -#~ msgstr "doit être super-utilisateur pour obtenir des informations sur le fichier" - -#~ msgid "must be superuser to rename text search parsers" -#~ msgstr "" -#~ "doit être super-utilisateur pour renommer les analyseurs de recherche plein\n" -#~ "texte" - -#~ msgid "must be superuser to rename text search templates" -#~ msgstr "doit être super-utilisateur pour renommer les modèles de recherche plein texte" - -#~ msgid "must be superuser to reset statistics counters" -#~ msgstr "doit être super-utilisateur pour réinitialiser les compteurs statistiques" - -#~ msgid "must be superuser to signal the postmaster" -#~ msgstr "doit être super-utilisateur pour envoyer un signal au postmaster" - -#~ msgid "must be superuser to use server-side lo_export()" -#~ msgstr "doit être super-utilisateur pour utiliser lo_export() du côté serveur" - -#~ msgid "must be superuser to use server-side lo_import()" -#~ msgstr "doit être super-utilisateur pour utiliser lo_import() du côté serveur" - -#~ msgid "must call json_populate_recordset on an array of objects" -#~ msgstr "doit appeler json_populate_recordset sur un tableau d'objets" - -#, c-format -#~ msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image length is %u at %X/%X" -#~ msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_IS_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" - -#~ msgid "neither input type is an array" -#~ msgstr "aucun type de données n'est un tableau" - -#, c-format -#~ msgid "new replication connections are not allowed during database shutdown" -#~ msgstr "" -#~ "les nouvelles connexions pour la réplication ne sont pas autorisées pendant\n" -#~ "l'arrêt du serveur de base de données" - -#~ msgid "next MultiXactId: %u; next MultiXactOffset: %u" -#~ msgstr "prochain MultiXactId : %u ; prochain MultiXactOffset : %u" - -#~ msgid "next transaction ID: %u/%u; next OID: %u" -#~ msgstr "prochain identifiant de transaction : %u/%u ; prochain OID : %u" - -#~ msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\"" -#~ msgstr "" -#~ "aucune entrée dans pg_hba.conf pour l'hôte « %s », utilisateur « %s »,\n" -#~ "base de données « %s »" - -#~ msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\"" -#~ msgstr "" -#~ "aucune entrée dans pg_hba.conf pour la connexion de la réplication à partir de\n" -#~ "l'hôte « %s », utilisateur « %s »" - -#~ msgid "no such savepoint" -#~ msgstr "aucun point de sauvegarde" - -#, c-format -#~ msgid "non-exclusive backup in progress" -#~ msgstr "une sauvegarde non exclusive est en cours" - -#, c-format -#~ msgid "non-exclusive backup is not in progress" -#~ msgstr "une sauvegarde non exclusive n'est pas en cours" - -#~ msgid "not enough data in file \"%s\"" -#~ msgstr "données insuffisantes dans le fichier « %s »" - -#~ msgid "not enough shared memory for background writer" -#~ msgstr "pas assez de mémoire partagée pour le processus d'écriture en tâche de fond" - -#~ msgid "not enough shared memory for elements of data structure \"%s\" (%zu bytes requested)" -#~ msgstr "" -#~ "pas assez de mémoire partagée pour les éléments de la structure de données\n" -#~ "« %s » (%zu octets demandés)" - -#~ msgid "not enough shared memory for walreceiver" -#~ msgstr "" -#~ "pas assez de mémoire partagée pour le processus de réception des journaux de\n" -#~ "transactions" - -#~ msgid "not enough shared memory for walsender" -#~ msgstr "pas assez de mémoire partagée pour le processus d'envoi des journaux de transactions" - -#~ msgid "not unique \"S\"" -#~ msgstr "« S » non unique" - -#~ msgid "null OID in COPY data" -#~ msgstr "OID NULL dans les données du COPY" - -#~ msgid "number of distinct values %g is too low" -#~ msgstr "le nombre de valeurs distinctes %g est trop basse" - -#~ msgid "number of page slots needed (%.0f) exceeds max_fsm_pages (%d)" -#~ msgstr "le nombre d'emplacements de pages nécessaires (%.0f) dépasse max_fsm_pages (%d)" - -#~ msgid "off" -#~ msgstr "désactivé" - -#, c-format -#~ msgid "oidvector has too many elements" -#~ msgstr "oidvector a trop d'éléments" - -#~ msgid "oldest MultiXactId member is at offset %u" -#~ msgstr "le membre le plus ancien du MultiXactId est au décalage %u" - -#~ msgid "oldest unfrozen transaction ID: %u, in database %u" -#~ msgstr "" -#~ "identifiant de transaction non gelé le plus ancien : %u, dans la base de\n" -#~ "données %u" - -#~ msgid "on" -#~ msgstr "activé" - -#, c-format -#~ msgid "online backup mode canceled" -#~ msgstr "mode de sauvegarde en ligne annulé" - -#, c-format -#~ msgid "online backup mode was not canceled" -#~ msgstr "le mode de sauvegarde en ligne n'a pas été annulé" - -#~ msgid "only simple column references and expressions are allowed in CREATE STATISTICS" -#~ msgstr "seules des références et expressions à une seule colonne sont acceptées dans CREATE STATISTICS" - -#~ msgid "only superusers can query or manipulate replication origins" -#~ msgstr "seuls les super-utilisateurs peuvent lire ou manipuler les origines de réplication" - -#~ msgid "op ANY/ALL (array) does not support set arguments" -#~ msgstr "" -#~ "l'opérateur ANY/ALL (pour les types array) ne supporte pas les arguments\n" -#~ "d'ensemble" - -#~ msgid "operator precedence change: %s is now lower precedence than %s" -#~ msgstr "la précédence d'opérateur change : %s a maintenant une précédence inférieure à %s" - -#~ msgid "operator procedure must be specified" -#~ msgstr "la procédure de l'opérateur doit être spécifiée" - -#~ msgid "overflow of destination buffer in hex encoding" -#~ msgstr "Calcule les identifiants de requête" - -#~ msgid "parameter \"%s\" requires a numeric value" -#~ msgstr "le paramètre « %s » requiert une valeur numérique" - -#~ msgid "parameter \"recovery_target_inclusive\" requires a Boolean value" -#~ msgstr "le paramètre « recovery_target_inclusive » requiert une valeur booléenne" - -#~ msgid "parameter \"standby_mode\" requires a Boolean value" -#~ msgstr "le paramètre « standby_mode » requiert une valeur booléenne" - -#~ msgid "parse %s: %s" -#~ msgstr "analyse %s : %s" - -#~ msgid "parser stack overflow" -#~ msgstr "saturation de la pile de l'analyseur" - -#~ msgid "partition constraint for table \"%s\" is implied by existing constraints" -#~ msgstr "la contrainte de partitionnement pour la table « %s » provient des contraintes existantes" - -#~ msgid "partition key expressions cannot contain whole-row references" -#~ msgstr "les expressions de clé de partitionnement ne peuvent pas contenir des références à des lignes complètes" - -#~ msgid "password too long" -#~ msgstr "mot de passe trop long" - -#~ msgid "pclose failed: %m" -#~ msgstr "échec de pclose : %m" - -#~ msgid "permission denied to drop foreign-data wrapper \"%s\"" -#~ msgstr "droit refusé pour supprimer le wrapper de données distantes « %s »" - -#~ msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\"" -#~ msgstr "" -#~ "pg_hba.conf rejette la connexion pour l'hôte « %s », utilisateur « %s », base\n" -#~ "de données « %s »" - -#~ msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\"" -#~ msgstr "" -#~ "pg_hba.conf rejette la connexion de la réplication pour l'hôte « %s »,\n" -#~ "utilisateur « %s »" - -#~ msgid "pg_ident.conf was not reloaded" -#~ msgstr "pg_ident.conf n'a pas été rechargé" - -#~ msgid "pg_walfile_name() cannot be executed during recovery." -#~ msgstr "pg_walfile_name() ne peut pas être exécuté lors de la restauration." - -#~ msgid "pg_walfile_name_offset() cannot be executed during recovery." -#~ msgstr "pg_walfile_name_offset() ne peut pas être exécuté lors de la restauration." - -#~ msgid "poll() failed in statistics collector: %m" -#~ msgstr "échec du poll() dans le récupérateur de statistiques : %m" - -#~ msgid "poll() failed: %m" -#~ msgstr "échec de poll() : %m" - -#~ msgid "postmaster became multithreaded" -#~ msgstr "le postmaster est devenu multithreadé" - -#~ msgid "procedure number %d for (%s,%s) appears more than once" -#~ msgstr "le numéro de procédure %d pour (%s, %s) apparaît plus d'une fois" - -#~ msgid "procedures cannot have OUT arguments" -#~ msgstr "les procédures ne peuvent pas avoir d'argument OUT" - -#~ msgid "query requires full scan, which is not supported by GIN indexes" -#~ msgstr "" -#~ "la requête nécessite un parcours complet, ce qui n'est pas supporté par les\n" -#~ "index GIN" - -#, c-format -#~ msgid "query-specified return tuple and function return type are not compatible" -#~ msgstr "une ligne de sortie spécifiée à la requête et un type de sortie de fonction ne sont pas compatibles" - -#, c-format -#~ msgid "range_agg must be called with a range" -#~ msgstr "range_agg doit être appelé avec un intervalle" - -#, c-format -#~ msgid "range_intersect_agg must be called with a multirange" -#~ msgstr "range_intersect_agg doit être appelé avec un multirange" - -#, c-format -#~ msgid "range_intersect_agg must be called with a range" -#~ msgstr "range_intersect_agg doit être appelé avec un range" - -#~ msgid "received password packet" -#~ msgstr "paquet du mot de passe reçu" - -#~ msgid "record with zero length at %X/%X" -#~ msgstr "enregistrement de longueur nulle à %X/%X" - -#~ msgid "recovery is still in progress, can't accept WAL streaming connections" -#~ msgstr "la restauration est en cours, ne peut pas accepter les connexions de flux WAL" - -#~ msgid "recovery restart point at %X/%X with latest known log time %s" -#~ msgstr "" -#~ "point de relancement de la restauration sur %X/%X avec %s comme dernière\n" -#~ "date connue du journal" - -#~ msgid "recovery_target_time is not a valid timestamp: \"%s\"" -#~ msgstr "recovery_target_timeline n'est pas un horodatage valide : « %s »" - -#~ msgid "recovery_target_xid is not a valid number: \"%s\"" -#~ msgstr "recovery_target_xid n'est pas un nombre valide : « %s »" - -#~ msgid "recycled write-ahead log file \"%s\"" -#~ msgstr "recyclage du journal de transactions « %s »" - -#~ msgid "redo record is at %X/%X; shutdown %s" -#~ msgstr "l'enregistrement à ré-exécuter se trouve à %X/%X ; arrêt %s" - -#~ msgid "redo starts at %X/%X, consistency will be reached at %X/%X" -#~ msgstr "la restauration comme à %X/%X, la cohérence sera atteinte à %X/%X" - -#, c-format -#~ msgid "reference to parent directory (\"..\") not allowed" -#~ msgstr "référence non autorisée au répertoire parent (« .. »)" - -#, c-format -#~ msgid "referenced relation \"%s\" is not a table or foreign table" -#~ msgstr "la relation référencée « %s » n'est ni une table ni une table distante" - -#~ msgid "regexp_split_to_array does not support the global option" -#~ msgstr "regexp_split_to_array ne supporte pas l'option globale" - -#~ msgid "regexp_split_to_table does not support the global option" -#~ msgstr "regexp_split_to_table ne supporte pas l'option globale" - -#~ msgid "registering background worker \"%s\"" -#~ msgstr "enregistrement du processus en tâche de fond « %s »" - -#~ msgid "relation \"%s\" TID %u/%u: DeleteTransactionInProgress %u --- cannot shrink relation" -#~ msgstr "" -#~ "relation « %s », TID %u/%u : DeleteTransactionInProgress %u --- n'a pas pu\n" -#~ "diminuer la taille de la relation" - -#~ msgid "relation \"%s\" TID %u/%u: InsertTransactionInProgress %u --- cannot shrink relation" -#~ msgstr "" -#~ "relation « %s », TID %u/%u : InsertTransactionInProgress %u --- n'a pas pu\n" -#~ "diminuer la taille de la relation" - -#~ msgid "relation \"%s\" TID %u/%u: XMIN_COMMITTED not set for transaction %u --- cannot shrink relation" -#~ msgstr "" -#~ "relation « %s », TID %u/%u : XMIN_COMMITTED non configuré pour la\n" -#~ "transaction %u --- n'a pas pu diminuer la taille de la relation" - -#~ msgid "relation \"%s\" TID %u/%u: dead HOT-updated tuple --- cannot shrink relation" -#~ msgstr "" -#~ "relation « %s », TID %u/%u : ligne morte mise à jour par HOT --- n'a pas pu\n" -#~ "diminuer la taille de la relation" - -#, c-format -#~ msgid "relation \"%s\" is not a table, foreign table, or materialized view" -#~ msgstr "la relation « %s » n'est pas une table, une table distante ou une vue matérialisée" - -#~ msgid "relation \"%s\" page %u is uninitialized --- fixing" -#~ msgstr "relation « %s » : la page %u n'est pas initialisée --- correction en cours" - -#~ msgid "relation \"%s.%s\" contains more than \"max_fsm_pages\" pages with useful free space" -#~ msgstr "" -#~ "la relation « %s.%s » contient plus de « max_fsm_pages » pages d'espace\n" -#~ "libre utile" - -#~ msgid "relation \"pg_statistic\" does not have a composite type" -#~ msgstr "la relation « pg_statistic » n'a pas un type composite" - -#~ msgid "removed subscription for table %s.%s" -#~ msgstr "a supprimé une souscription pour la table %s.%s" - -#~ msgid "removing built-in function \"%s\"" -#~ msgstr "suppression de la fonction interne « %s »" - -#~ msgid "removing file \"%s\"" -#~ msgstr "suppression du fichier « %s »" - -#~ msgid "removing transaction log backup history file \"%s\"" -#~ msgstr "suppression du fichier historique des journaux de transaction « %s »" - -#~ msgid "removing write-ahead log file \"%s\"" -#~ msgstr "suppression du journal de transactions « %s »" - -#~ msgid "replication connection authorized: user=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -#~ msgstr "connexion autorisée : utilisateur=%s, SSL activé (protocole=%s, chiffrement=%s, bits=%d, compression=%s)" - -#~ msgid "replication connection authorized: user=%s application_name=%s" -#~ msgstr "connexion de réplication autorisée : utilisateur=%s nom d'application=%s" - -#~ msgid "replication connection authorized: user=%s application_name=%s SSL enabled (protocol=%s, cipher=%s, bits=%d, compression=%s)" -#~ msgstr "connexion de réplication autorisée : utilisateur=%s, nom d'application=%s, SSL activé (protocole=%s, chiffrement=%s, bits=%d, compression=%s)" - -#~ msgid "replication identifier %d is already active for PID %d" -#~ msgstr "l'identificateur de réplication %d est déjà actif pour le PID %d" - -#~ msgid "replication origin %d is already active for PID %d" -#~ msgstr "l'origine de réplication %d est déjà active pour le PID %d" - -#~ msgid "restartpoint_command = '%s'" -#~ msgstr "restartpoint_command = '%s'" - -#~ msgid "rewriting table \"%s\"" -#~ msgstr "ré-écriture de la table « %s »" - -#~ msgid "role \"%s\" could not be removed from policy \"%s\" on \"%s\"" -#~ msgstr "le rôle « %s » n'a pas pu être supprimé de la politique « %s » sur « %s »" - -#~ msgid "role \"%s\" is reserved" -#~ msgstr "le rôle « %s » est réservé" - -#~ msgid "role name cannot be qualified" -#~ msgstr "le nom du rôle ne peut pas être qualifié" - -#~ msgid "rule \"%s\" does not exist" -#~ msgstr "la règle « %s » n'existe pas" - -#~ msgid "scanned index \"%s\" to remove %d row versions by parallel vacuum worker" -#~ msgstr "a parcouru l'index « %s » pour supprimer %d versions de lignes par le worker parallélisé du VACUUM" - -#~ msgid "schema name cannot be qualified" -#~ msgstr "le nom du schéma ne peut pas être qualifié" - -#~ msgid "select() failed in logger process: %m" -#~ msgstr "échec de select() dans le processus des journaux applicatifs : %m" - -#, c-format -#~ msgid "select() failed in statistics collector: %m" -#~ msgstr "échec du select() dans le récupérateur de statistiques : %m" - -#~ msgid "select() failed: %m" -#~ msgstr "échec de select() : %m" - -#~ msgid "sending cancel to blocking autovacuum PID %d" -#~ msgstr "envoi de l'annulation pour bloquer le PID %d de l'autovacuum" - -#~ msgid "server does not exist, skipping" -#~ msgstr "le serveur n'existe pas, poursuite du traitement" - -#~ msgid "server name cannot be qualified" -#~ msgstr "le nom du serveur ne peut pas être qualifié" - -#~ msgid "setsockopt(SO_REUSEADDR) failed for %s address \"%s\": %m" -#~ msgstr "setsockopt(SO_REUSEADDR) a échoué pour %s, adresse « %s » : %m" - -#~ msgid "shared index \"%s\" can only be reindexed in stand-alone mode" -#~ msgstr "un index partagé « %s » peut seulement être réindexé en mode autonome" - -#~ msgid "shared table \"%s\" can only be reindexed in stand-alone mode" -#~ msgstr "la table partagée « %s » peut seulement être réindexé en mode autonome" - -#~ msgid "shared tables cannot be toasted after initdb" -#~ msgstr "" -#~ "les tables partagées ne peuvent pas avoir une table TOAST après la commande\n" -#~ "initdb" - -#~ msgid "shutdown requested, aborting active base backup" -#~ msgstr "arrêt demandé, annulation de la sauvegarde active de base" - -#~ msgid "skipping redundant vacuum to prevent wraparound of table \"%s.%s.%s\"" -#~ msgstr "ignore un VACUUM redondant pour éviter le rebouclage des identifiants dans la table \"%s.%s.%s\"" - -#~ msgid "skipping restartpoint, already performed at %X/%X" -#~ msgstr "ignore le point de redémarrage, déjà réalisé à %X/%X" - -#~ msgid "skipping restartpoint, recovery has already ended" -#~ msgstr "restartpoint ignoré, la récupération est déjà terminée" - -#~ msgid "slot_name = NONE and create_slot = true are mutually exclusive options" -#~ msgstr "slot_name = NONE et create_slot = true sont des options mutuellement exclusives" - -#~ msgid "slot_name = NONE and enabled = true are mutually exclusive options" -#~ msgstr "slot_name = NONE et enabled = true sont des options mutuellement exclusives" - -#~ msgid "socket not open" -#~ msgstr "socket non ouvert" - -#, fuzzy -#~ msgid "sorry, too many standbys already" -#~ msgstr "désolé, trop de clients sont déjà connectés" - -#~ msgid "spgist operator class \"%s\" is missing operator(s)" -#~ msgstr "il manque des opérateurs pour la classe d'opérateur spgist « %s »" - -#~ msgid "spgist operator family \"%s\" contains function %s with invalid support number %d" -#~ msgstr "" -#~ "la famille d'opérateur spgist « %s » contient la fonction %s\n" -#~ "avec le numéro de support %d invalide" - -#~ msgid "spgist operator family \"%s\" contains function %s with wrong signature for support number %d" -#~ msgstr "" -#~ "la famille d'opérateur spgist « %s » contient la fonction %s\n" -#~ "avec une mauvaise signature pour le numéro de support %d" - -#~ msgid "spgist operator family \"%s\" contains invalid ORDER BY specification for operator %s" -#~ msgstr "" -#~ "la famille d'opérateur spgist « %s » contient une spécification\n" -#~ "ORDER BY invalide pour l'opérateur %s" - -#~ msgid "spgist operator family \"%s\" contains operator %s with invalid strategy number %d" -#~ msgstr "" -#~ "la famille d'opérateur spgist « %s » contient l'opérateur %s\n" -#~ "avec le numéro de stratégie invalide %d" - -#~ msgid "spgist operator family \"%s\" contains operator %s with wrong signature" -#~ msgstr "la famille d'opérateur spgist « %s » contient l'opérateur %s avec une mauvaise signature" - -#~ msgid "spgist operator family \"%s\" contains support procedure %s with cross-type registration" -#~ msgstr "" -#~ "la famille d'opérateur spgist « %s » contient la procédure de support\n" -#~ "%s avec un enregistrement inter-type" - -#~ msgid "spgist operator family \"%s\" is missing operator(s) for types %s and %s" -#~ msgstr "" -#~ "la famille d'opérateur spgist « %s » nécessite des opérateurs supplémentaires\n" -#~ "pour les types %s et %s" - -#~ msgid "standby \"%s\" now has synchronous standby priority %u" -#~ msgstr "" -#~ "le serveur « %s » en standby a maintenant une priorité %u en tant que standby\n" -#~ "synchrone" - -#~ msgid "standby connections not allowed because wal_level=minimal" -#~ msgstr "connexions standby non autorisées car wal_level=minimal" - -#~ msgid "starting background worker process \"%s\"" -#~ msgstr "démarrage du processus d'écriture en tâche de fond « %s »" - -#~ msgid "starting logical replication worker for subscription \"%s\"" -#~ msgstr "lancement du processus worker de réplication logique pour la souscription « %s »" - -#~ msgid "statistics collector process" -#~ msgstr "processus de récupération des statistiques" - -#, c-format -#~ msgid "statistics collector's time %s is later than backend local time %s" -#~ msgstr "l'heure du collecteur de statistiques %s est plus avancé que l'heure locale du processus serveur %s" - -#, c-format -#~ msgid "stats_timestamp %s is later than collector's time %s for database %u" -#~ msgstr "stats_timestamp %s est plus avancé que l'heure du collecteur %s pour la base de données %u" - -#~ msgid "streaming replication successfully connected to primary" -#~ msgstr "réplication de flux connecté avec succès au serveur principal" - -#~ msgid "subquery cannot have SELECT INTO" -#~ msgstr "la sous-requête ne peut pas avoir de SELECT INTO" - -#~ msgid "subquery in FROM cannot have SELECT INTO" -#~ msgstr "la sous-requête du FROM ne peut pas avoir de SELECT INTO" - -#~ msgid "subquery in FROM cannot refer to other relations of same query level" -#~ msgstr "" -#~ "la sous-requête du FROM ne peut pas faire référence à d'autres relations\n" -#~ "dans le même niveau de la requête" - -#~ msgid "subquery in WITH cannot have SELECT INTO" -#~ msgstr "la sous-requête du WITH ne peut pas avoir de SELECT INTO" - -#~ msgid "subquery must return a column" -#~ msgstr "la sous-requête doit renvoyer une colonne" - -#~ msgid "subscription must contain at least one publication" -#~ msgstr "la souscription doit contenir au moins une publication" - -#~ msgid "subscription with slot_name = NONE must also set create_slot = false" -#~ msgstr "la souscription avec slot_name = NONE doit aussi être configurée avec create_slot = false" - -#~ msgid "syntax error in recovery command file: %s" -#~ msgstr "erreur de syntaxe dans le fichier de restauration : %s" - -#~ msgid "syntax error: cannot back up" -#~ msgstr "erreur de syntaxe : n'a pas pu revenir" - -#~ msgid "syntax error: unexpected character \"%s\"" -#~ msgstr "erreur de syntaxe : caractère « %s » inattendu" - -#~ msgid "syntax error; also virtual memory exhausted" -#~ msgstr "erreur de syntaxe ; de plus, mémoire virtuelle saturée" - -#~ msgid "system columns cannot be used in an ON CONFLICT clause" -#~ msgstr "les colonnes systèmes ne peuvent pas être utilisées dans une clause ON CONFLICT" - -#~ msgid "system usage: %s\n" -#~ msgstr "utilisation du système : %s\n" - -#, c-format -#~ msgid "table \"%s\" cannot be replicated" -#~ msgstr "la table « %s » ne peut pas être répliquée" - -#~ msgid "table \"%s\" does not have OIDs" -#~ msgstr "la table « %s » n'a pas d'OID" - -#~ msgid "table \"%s\" has multiple constraints named \"%s\"" -#~ msgstr "la table « %s » a de nombreuses contraintes nommées « %s »" - -#~ msgid "table \"%s\" without OIDs cannot inherit from table \"%s\" with OIDs" -#~ msgstr "la table « %s » qui n'a pas d'OID ne peut pas hériter de la table « %s » qui en a" - -#, c-format -#~ msgid "table \"%s\": found %lld removable, %lld nonremovable row versions in %u out of %u pages" -#~ msgstr "table « %s » : trouvé %lld versions de ligne supprimables, %lld non supprimables, dans %u blocs sur %u" - -#, c-format -#~ msgid "table \"%s\": index scan bypassed: %u pages from table (%.2f%% of total) have %lld dead item identifiers" -#~ msgstr "table \"%s\" : parcours d'index ignoré : %u pages de la table (%.2f%% au total) ont %lld identifiants de ligne morte" - -#~ msgid "table \"%s.%s\" added to subscription \"%s\"" -#~ msgstr "table « %s.%s » ajoutée à la souscription « %s »" - -#~ msgid "table \"%s.%s\" removed from subscription \"%s\"" -#~ msgstr "table « %s.%s » supprimée de la souscription « %s »" - -#~ msgid "tablespace %u is not empty" -#~ msgstr "le tablespace %u n'est pas vide" - -#~ msgid "tablespace name cannot be qualified" -#~ msgstr "le nom du tablespace ne peut pas être qualifié" - -#~ msgid "terminating all walsender processes to force cascaded standby(s) to update timeline and reconnect" -#~ msgstr "" -#~ "arrêt de tous les processus walsender pour forcer les serveurs standby en\n" -#~ "cascade à mettre à jour la timeline et à se reconnecter" - -#~ msgid "terminating walsender process to force cascaded standby to update timeline and reconnect" -#~ msgstr "" -#~ "arrêt du processus walreceiver pour forcer le serveur standby en cascade à\n" -#~ "mettre à jour la timeline et à se reconnecter" - -#, c-format -#~ msgid "test message did not get through on socket for statistics collector" -#~ msgstr "" -#~ "le message de test n'a pas pu arriver sur la socket du récupérateur de\n" -#~ "statistiques : %m" - -#~ msgid "there are multiple rules named \"%s\"" -#~ msgstr "il existe de nombreuses règles nommées « %s »" - -#~ msgid "there are objects dependent on %s" -#~ msgstr "des objets dépendent de %s" - -#~ msgid "there is no contrecord flag at %X/%X reading %X/%X" -#~ msgstr "il n'existe pas de drapeau contrecord à %X/%X en lisant %X/%X" - -#~ msgid "there is no contrecord flag in log file %u, segment %u, offset %u" -#~ msgstr "" -#~ "il n'y a pas de drapeaux « contrecord » dans le journal de transactions %u,\n" -#~ "segment %u, décalage %u" - -#~ msgid "time to inline: %.3fs, opt: %.3fs, emit: %.3fs" -#~ msgstr "temps pour inliner: %.3fs, opt: %.3fs, emit: %.3fs" - -#~ msgid "time zone abbreviation \"%s\" is not used in time zone \"%s\"" -#~ msgstr "l'abréviation « %s » du fuseau horaire n'est pas utilisée dans le fuseau horaire « %s »" - -#~ msgid "time zone offset %d is not a multiple of 900 sec (15 min) in time zone file \"%s\", line %d" -#~ msgstr "" -#~ "le décalage %d du fuseau horaire n'est pas un multiples de 900 secondes\n" -#~ "(15 minutes) dans le fichier des fuseaux horaires « %s », ligne %d" - -#, c-format -#~ msgid "timestamp units \"%s\" not recognized" -#~ msgstr "les unité « %s » ne sont pas reconnues pour le type timestamp" - -#, c-format -#~ msgid "timestamp units \"%s\" not supported" -#~ msgstr "les unités timestamp « %s » ne sont pas supportées" - -#, c-format -#~ msgid "timestamp with time zone units \"%s\" not recognized" -#~ msgstr "les unités « %s » ne sont pas reconnues pour le type « timestamp with time zone »" - -#, c-format -#~ msgid "timestamp with time zone units \"%s\" not supported" -#~ msgstr "les unités « %s » ne sont pas supportées pour le type « timestamp with time zone »" - -#~ msgid "too few arguments for format" -#~ msgstr "trop peu d'arguments pour le format" - -#, c-format -#~ msgid "too many range table entries" -#~ msgstr "trop d'enregistrements dans la table range" - -#~ msgid "transaction ID " -#~ msgstr "ID de transaction " - -#~ msgid "transaction ID wrap limit is %u, limited by database with OID %u" -#~ msgstr "" -#~ "la limite de réinitialisation de l'identifiant de transaction est %u,\n" -#~ "limité par la base de données d'OID %u" - -#~ msgid "transaction is read-only" -#~ msgstr "la transaction est en lecture seule" - -#~ msgid "transaction log switch forced (archive_timeout=%d)" -#~ msgstr "changement forcé du journal de transaction (archive_timeout=%d)" - -#~ msgid "transform expression must not return a set" -#~ msgstr "l'expression de transformation ne doit pas renvoyer un ensemble" - -#~ msgid "transform function must not be an aggregate function" -#~ msgstr "la fonction de transformation ne doit pas être une fonction d'agrégat" - -#~ msgid "trigger \"%s\" for table \"%s\" does not exist, skipping" -#~ msgstr "le trigger « %s » pour la table « %s » n'existe pas, poursuite du traitement" - -#, c-format -#~ msgid "trying another address for the statistics collector" -#~ msgstr "nouvelle tentative avec une autre adresse pour le récupérateur de statistiques" - -#~ msgid "tuple to be updated was already moved to another partition due to concurrent update" -#~ msgstr "la ligne à mettre à jour était déjà déplacée vers une autre partition du fait d'une mise à jour concurrente, nouvelle tentative" - -#~ msgid "two-phase state file for transaction %u is corrupt" -#~ msgstr "" -#~ "le fichier d'état de la validation en deux phases est corrompu pour la\n" -#~ "transaction %u" - -#~ msgid "type %u does not match constructor type" -#~ msgstr "le type %u ne correspond pas un type constructeur" - -#~ msgid "type output function %s must return type \"cstring\"" -#~ msgstr "le type de sortie de la fonction %s doit être « cstring »" - -#~ msgid "type send function %s must return type \"bytea\"" -#~ msgstr "la fonction send du type %s doit renvoyer le type « bytea »" - -#~ msgid "typmod_in function %s must return type \"integer\"" -#~ msgstr "la fonction typmod_in %s doit renvoyer le type « entier »" - -#~ msgid "ucnv_fromUChars failed: %s" -#~ msgstr "échec de ucnv_fromUChars : %s" - -#~ msgid "ucnv_toUChars failed: %s" -#~ msgstr "échec de ucnv_toUChars : %s" - -#~ msgid "unable to open directory pg_tblspc: %m" -#~ msgstr "impossible d'ouvrir le répertoire p_tblspc : %m" - -#~ msgid "unable to read symbolic link %s: %m" -#~ msgstr "incapable de lire le lien symbolique %s : %m" - -#~ msgid "uncataloged table %s" -#~ msgstr "table %s sans catalogue" - -#~ msgid "unexpected \"=\"" -#~ msgstr "« = » inattendu" - -#~ msgid "unexpected EOF on client connection" -#~ msgstr "fin de fichier (EOF) inattendue de la connexion du client" - -#~ msgid "unexpected Kerberos user name received from client (received \"%s\", expected \"%s\")" -#~ msgstr "" -#~ "nom d'utilisateur Kerberos inattendu reçu à partir du client (reçu « %s »,\n" -#~ "attendu « %s »)" - -#~ msgid "unexpected delimiter at line %d of thesaurus file \"%s\"" -#~ msgstr "délimiteur inattendu sur la ligne %d du thesaurus « %s »" - -#~ msgid "unexpected end of line at line %d of thesaurus file \"%s\"" -#~ msgstr "fin de ligne inattendue à la ligne %d du thésaurus « %s »" - -#~ msgid "unexpected end of line or lexeme at line %d of thesaurus file \"%s\"" -#~ msgstr "fin de ligne ou de lexeme inattendu sur la ligne %d du thesaurus « %s »" - -#~ msgid "unexpected standby message type \"%c\", after receiving CopyDone" -#~ msgstr "type de message standby « %c » inattendu, après avoir reçu CopyDone" - -#~ msgid "unlogged GiST indexes are not supported" -#~ msgstr "les index GiST non tracés ne sont pas supportés" - -#~ msgid "unlogged operation performed, data may be missing" -#~ msgstr "opération réalisée non tracée, les données pourraient manquer" - -#, c-format -#~ msgid "unlogged sequences are not supported" -#~ msgstr "les séquences non tracées ne sont pas supportées" - -#~ msgid "unrecognized \"datestyle\" key word: \"%s\"" -#~ msgstr "mot clé « datestyle » non reconnu : « %s »" - -#~ msgid "unrecognized \"log_destination\" key word: \"%s\"" -#~ msgstr "mot clé « log_destination » non reconnu : « %s »" - -#, c-format -#~ msgid "unrecognized \"publish\" value: \"%s\"" -#~ msgstr "type « publish » non reconnu : « %s »" - -#~ msgid "unrecognized error %d" -#~ msgstr "erreur %d non reconnue" - -#~ msgid "unrecognized function attribute \"%s\" ignored" -#~ msgstr "l'attribut « %s » non reconnu de la fonction a été ignoré" - -#~ msgid "unrecognized recovery parameter \"%s\"" -#~ msgstr "paramètre de restauration « %s » non reconnu" - -#~ msgid "unrecognized win32 error code: %lu" -#~ msgstr "code d'erreur win32 non reconnu : %lu" - -#~ msgid "unregistering background worker \"%s\"" -#~ msgstr "désenregistrement du processus en tâche de fond « %s »" - -#~ msgid "unsafe permissions on private key file \"%s\"" -#~ msgstr "droits non sûrs sur le fichier de la clé privée « %s »" - -#~ msgid "unsupported LZ4 compression method" -#~ msgstr "méthode compression LZ4 non supportée" - -#~ msgid "unsupported language \"%s\"" -#~ msgstr "langage non supporté « %s »" - -#~ msgid "updated min recovery point to %X/%X on timeline %u" -#~ msgstr "mise à jour du point minimum de restauration sur %X/%X pour la timeline %u" - -#~ msgid "updated partition constraint for default partition \"%s\" is implied by existing constraints" -#~ msgstr "la contrainte de partitionnement pour la partition par défaut « %s » est implicite du fait de contraintes existantes" - -#~ msgid "updated partition constraint for default partition would be violated by some row" -#~ msgstr "la contrainte de partition mise à jour pour la partition par défaut serait transgressée par des lignes" - -#~ msgid "usermap \"%s\"" -#~ msgstr "correspondance utilisateur « %s »" - -#~ msgid "using pg_pltemplate information instead of CREATE LANGUAGE parameters" -#~ msgstr "" -#~ "utilisation des informations de pg_pltemplate au lieu des paramètres de\n" -#~ "CREATE LANGUAGE" - -#~ msgid "using previous checkpoint record at %X/%X" -#~ msgstr "utilisation du précédent enregistrement d'un point de vérification à %X/%X" - -#, c-format -#~ msgid "using stale statistics instead of current ones because stats collector is not responding" -#~ msgstr "" -#~ "utilise de vieilles statistiques à la place des actuelles car le collecteur de\n" -#~ "statistiques ne répond pas" - -#, c-format -#~ msgid "utility statements cannot be prepared" -#~ msgstr "les instructions utilitaires ne peuvent pas être préparées" - -#~ msgid "validating foreign key constraint \"%s\"" -#~ msgstr "validation de la contraintes de clé étrangère « %s »" - -#, c-format -#~ msgid "value \"%s\" is out of range for 8-bit integer" -#~ msgstr "la valeur « %s » est en dehors des limites des entiers sur 8 bits" - -#~ msgid "value \"%s\" is out of range for type bigint" -#~ msgstr "la valeur « %s » est en dehors des limites du type bigint" - -#~ msgid "value \"%s\" is out of range for type integer" -#~ msgstr "la valeur « %s » est en dehors des limites du type integer" - -#~ msgid "value \"%s\" is out of range for type smallint" -#~ msgstr "la valeur « %s » est en dehors des limites du type smallint" - -#~ msgid "verifying table \"%s\"" -#~ msgstr "vérification de la table « %s »" - -#~ msgid "view must have at least one column" -#~ msgstr "la vue doit avoir au moins une colonne" - -#~ msgid "window functions cannot use named arguments" -#~ msgstr "les fonctions window ne peuvent pas renvoyer des arguments nommés" - -#~ msgid "window functions not allowed in GROUP BY clause" -#~ msgstr "fonctions window non autorisées dans une clause GROUP BY" - -#~ msgid "worker process" -#~ msgstr "processus de travail" - -#~ msgid "wrong affix file format for flag" -#~ msgstr "mauvais format de fichier affixe pour le drapeau" - -#~ msgid "wrong data type: %u, expected %u" -#~ msgstr "mauvais type de données : %u, alors que %u attendu" - -#~ msgid "wrong element type" -#~ msgstr "mauvais type d'élément" - -#, fuzzy -#~ msgid "wrong number of array_subscripts" -#~ msgstr "mauvais nombre d'indices du tableau" - -#~ msgid "xrecoff \"%X\" is out of valid range, 0..%X" -#~ msgstr "xrecoff « %X » en dehors des limites valides, 0..%X" diff --git a/src/backend/po/it.po b/src/backend/po/it.po index 673e2aaf007df..51b69431edd1a 100644 --- a/src/backend/po/it.po +++ b/src/backend/po/it.po @@ -26344,7 +26344,7 @@ msgid "Forces synchronization of updates to disk." msgstr "Forza la sincronizzazione degli aggiornamenti sul disco." #: utils/misc/guc.c:1297 -msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This insures that a database cluster will recover to a consistent state after an operating system or hardware crash." +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "Il server userà in diversi punti la chiamata di sistema fsync() per assicurarsi che gli aggiornamenti vengano scritti fisicamente sul disco. Questo assicura che un cluster di database possa essere recuperato in uno stato consistente dopo un crash di sistema o dell'hardware." #: utils/misc/guc.c:1308 diff --git a/src/backend/po/ja.po b/src/backend/po/ja.po index 9f6e2c32501ff..a690ed5f6813f 100644 --- a/src/backend/po/ja.po +++ b/src/backend/po/ja.po @@ -1,7 +1,7 @@ # postgres.po # Japanese message translation file for postgres # -# Copyright (C) 2011-2022 PostgreSQL Global Development Group +# Copyright (C) 2011-2024 PostgreSQL Global Development Group # # HOTTA Michihide , 2011. # @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: postgres (PostgreSQL 16)\n" +"Project-Id-Version: postgres (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-06-19 09:31+0900\n" -"PO-Revision-Date: 2023-06-19 09:58+0900\n" +"POT-Creation-Date: 2025-04-04 09:46+0900\n" +"PO-Revision-Date: 2025-04-04 11:04+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" @@ -24,6 +24,11 @@ msgstr "" "X-Poedit-Basepath: ..\n" "X-Poedit-SearchPath-0: .\n" +#: ../common/binaryheap.c:121 ../common/binaryheap.c:159 +#, c-format +msgid "out of binary heap slots" +msgstr "ãƒã‚¤ãƒŠãƒªãƒ’ープã®ã‚¹ãƒ­ãƒƒãƒˆãŒã„ã£ã±ã„ã§ã™" + #: ../common/compression.c:132 ../common/compression.c:141 ../common/compression.c:150 #, c-format msgid "this build does not support compression with %s" @@ -77,34 +82,34 @@ msgstr "圧縮アルゴリズム\"%s\"ã¯é•·è·é›¢ãƒ¢ãƒ¼ãƒ‰ã‚’サãƒãƒ¼ãƒˆã—ã¾ msgid "not recorded" msgstr "記録ã•れã¦ã„ã¾ã›ã‚“" -#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 commands/copyfrom.c:1669 commands/extension.c:3456 utils/adt/genfile.c:123 +#: ../common/controldata_utils.c:93 ../common/controldata_utils.c:97 commands/copyfrom.c:1739 commands/extension.c:3538 utils/adt/genfile.c:123 utils/time/snapmgr.c:1430 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読ã¿è¾¼ã¿ç”¨ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../common/controldata_utils.c:84 ../common/controldata_utils.c:86 access/transam/timeline.c:143 access/transam/timeline.c:362 access/transam/twophase.c:1346 access/transam/xlog.c:3193 access/transam/xlog.c:3996 access/transam/xlogrecovery.c:1199 access/transam/xlogrecovery.c:1291 access/transam/xlogrecovery.c:1328 access/transam/xlogrecovery.c:1388 backup/basebackup.c:1842 commands/extension.c:3466 libpq/hba.c:791 replication/logical/origin.c:745 -#: replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5050 replication/logical/snapbuild.c:2027 replication/slot.c:1946 replication/slot.c:1987 replication/walsender.c:643 storage/file/buffile.c:470 storage/file/copydir.c:185 utils/adt/genfile.c:197 utils/adt/misc.c:984 utils/cache/relmapper.c:827 +#: ../common/controldata_utils.c:108 ../common/controldata_utils.c:110 access/transam/timeline.c:143 access/transam/timeline.c:362 access/transam/twophase.c:1353 access/transam/xlog.c:3477 access/transam/xlog.c:4341 access/transam/xlogrecovery.c:1238 access/transam/xlogrecovery.c:1336 access/transam/xlogrecovery.c:1373 access/transam/xlogrecovery.c:1440 backup/basebackup.c:2123 backup/walsummary.c:283 commands/extension.c:3548 libpq/hba.c:764 +#: replication/logical/origin.c:745 replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5113 replication/logical/snapbuild.c:2052 replication/slot.c:2236 replication/slot.c:2277 replication/walsender.c:655 storage/file/buffile.c:470 storage/file/copydir.c:185 utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: ../common/controldata_utils.c:92 ../common/controldata_utils.c:95 access/transam/xlog.c:3198 access/transam/xlog.c:4001 backup/basebackup.c:1846 replication/logical/origin.c:750 replication/logical/origin.c:789 replication/logical/snapbuild.c:2032 replication/slot.c:1950 replication/slot.c:1991 replication/walsender.c:648 utils/cache/relmapper.c:831 +#: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 access/transam/xlog.c:3482 access/transam/xlog.c:4346 replication/logical/origin.c:750 replication/logical/origin.c:789 replication/logical/snapbuild.c:2057 replication/slot.c:2240 replication/slot.c:2281 replication/walsender.c:660 utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$zuãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" -#: ../common/controldata_utils.c:104 ../common/controldata_utils.c:108 ../common/controldata_utils.c:233 ../common/controldata_utils.c:236 access/heap/rewriteheap.c:1175 access/heap/rewriteheap.c:1280 access/transam/timeline.c:392 access/transam/timeline.c:438 access/transam/timeline.c:512 access/transam/twophase.c:1358 access/transam/twophase.c:1770 access/transam/xlog.c:3039 access/transam/xlog.c:3233 access/transam/xlog.c:3238 access/transam/xlog.c:3374 -#: access/transam/xlog.c:3966 access/transam/xlog.c:4885 commands/copyfrom.c:1729 commands/copyto.c:332 libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 replication/logical/origin.c:683 replication/logical/origin.c:822 replication/logical/reorderbuffer.c:5102 replication/logical/snapbuild.c:1798 replication/logical/snapbuild.c:1922 replication/slot.c:1837 replication/slot.c:1998 replication/walsender.c:658 storage/file/copydir.c:208 storage/file/copydir.c:213 -#: storage/file/fd.c:739 storage/file/fd.c:3650 storage/file/fd.c:3756 utils/cache/relmapper.c:839 utils/cache/relmapper.c:945 +#: ../common/controldata_utils.c:128 ../common/controldata_utils.c:132 ../common/controldata_utils.c:277 ../common/controldata_utils.c:280 access/heap/rewriteheap.c:1141 access/heap/rewriteheap.c:1246 access/transam/timeline.c:392 access/transam/timeline.c:438 access/transam/timeline.c:512 access/transam/twophase.c:1365 access/transam/twophase.c:1784 access/transam/xlog.c:3323 access/transam/xlog.c:3517 access/transam/xlog.c:3522 access/transam/xlog.c:3658 +#: access/transam/xlog.c:4311 access/transam/xlog.c:5246 commands/copyfrom.c:1799 commands/copyto.c:325 libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 replication/logical/origin.c:683 replication/logical/origin.c:822 replication/logical/reorderbuffer.c:5165 replication/logical/snapbuild.c:1819 replication/logical/snapbuild.c:1943 replication/slot.c:2126 replication/slot.c:2288 replication/walsender.c:670 storage/file/copydir.c:208 storage/file/copydir.c:213 +#: storage/file/fd.c:828 storage/file/fd.c:3753 storage/file/fd.c:3859 utils/cache/relmapper.c:841 utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../common/controldata_utils.c:124 +#: ../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒåˆã£ã¦ã„ã¾ã›ã‚“" -#: ../common/controldata_utils.c:126 +#: ../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -117,71 +122,85 @@ msgstr "" "ã•れるもã®ã¨ä¸€è‡´ã—ãªã„よã†ã§ã™ã€‚ã“ã®å ´åˆä»¥ä¸‹ã®çµæžœã¯ä¸æ­£ç¢ºã«ãªã‚Šã¾ã™ã€‚ã¾ãŸã€\n" "PostgreSQLインストレーションã¯ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨äº’æ›æ€§ãŒãªããªã‚Šã¾ã™ã€‚" -#: ../common/controldata_utils.c:181 ../common/controldata_utils.c:186 ../common/file_utils.c:228 ../common/file_utils.c:287 ../common/file_utils.c:361 access/heap/rewriteheap.c:1263 access/transam/timeline.c:111 access/transam/timeline.c:251 access/transam/timeline.c:348 access/transam/twophase.c:1302 access/transam/xlog.c:2946 access/transam/xlog.c:3109 access/transam/xlog.c:3148 access/transam/xlog.c:3341 access/transam/xlog.c:3986 -#: access/transam/xlogrecovery.c:4179 access/transam/xlogrecovery.c:4282 access/transam/xlogutils.c:838 backup/basebackup.c:538 backup/basebackup.c:1512 libpq/hba.c:651 postmaster/syslogger.c:1560 replication/logical/origin.c:735 replication/logical/reorderbuffer.c:3706 replication/logical/reorderbuffer.c:4257 replication/logical/reorderbuffer.c:5030 replication/logical/snapbuild.c:1753 replication/logical/snapbuild.c:1863 replication/slot.c:1918 -#: replication/walsender.c:616 replication/walsender.c:2731 storage/file/copydir.c:151 storage/file/fd.c:714 storage/file/fd.c:3407 storage/file/fd.c:3637 storage/file/fd.c:3727 storage/smgr/md.c:660 utils/cache/relmapper.c:816 utils/cache/relmapper.c:924 utils/error/elog.c:2082 utils/init/miscinit.c:1530 utils/init/miscinit.c:1664 utils/init/miscinit.c:1741 utils/misc/guc.c:4600 utils/misc/guc.c:4650 +#: ../common/controldata_utils.c:225 ../common/controldata_utils.c:230 ../common/file_utils.c:70 ../common/file_utils.c:347 ../common/file_utils.c:406 ../common/file_utils.c:480 access/heap/rewriteheap.c:1229 access/transam/timeline.c:111 access/transam/timeline.c:251 access/transam/timeline.c:348 access/transam/twophase.c:1309 access/transam/xlog.c:3230 access/transam/xlog.c:3393 access/transam/xlog.c:3432 access/transam/xlog.c:3625 access/transam/xlog.c:4331 +#: access/transam/xlogrecovery.c:4264 access/transam/xlogrecovery.c:4367 access/transam/xlogutils.c:836 backup/basebackup.c:547 backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:624 postmaster/syslogger.c:1511 replication/logical/origin.c:735 replication/logical/reorderbuffer.c:3766 replication/logical/reorderbuffer.c:4320 replication/logical/reorderbuffer.c:5093 replication/logical/snapbuild.c:1774 replication/logical/snapbuild.c:1884 +#: replication/slot.c:2208 replication/walsender.c:628 replication/walsender.c:3051 storage/file/copydir.c:151 storage/file/fd.c:803 storage/file/fd.c:3510 storage/file/fd.c:3740 storage/file/fd.c:3830 storage/smgr/md.c:661 utils/cache/relmapper.c:818 utils/cache/relmapper.c:935 utils/error/elog.c:2124 utils/init/miscinit.c:1580 utils/init/miscinit.c:1714 utils/init/miscinit.c:1791 utils/misc/guc.c:4777 utils/misc/guc.c:4827 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../common/controldata_utils.c:202 ../common/controldata_utils.c:205 access/transam/twophase.c:1743 access/transam/twophase.c:1752 access/transam/xlog.c:8751 access/transam/xlogfuncs.c:708 backup/basebackup_server.c:175 backup/basebackup_server.c:268 postmaster/postmaster.c:5570 postmaster/syslogger.c:1571 postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 utils/cache/relmapper.c:936 +#: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 access/transam/twophase.c:1757 access/transam/twophase.c:1766 access/transam/xlog.c:9280 access/transam/xlogfuncs.c:698 backup/basebackup_server.c:173 backup/basebackup_server.c:266 backup/walsummary.c:304 postmaster/postmaster.c:4127 postmaster/syslogger.c:1522 postmaster/syslogger.c:1535 postmaster/syslogger.c:1548 utils/cache/relmapper.c:947 #, c-format msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../common/controldata_utils.c:219 ../common/controldata_utils.c:224 ../common/file_utils.c:299 ../common/file_utils.c:369 access/heap/rewriteheap.c:959 access/heap/rewriteheap.c:1169 access/heap/rewriteheap.c:1274 access/transam/timeline.c:432 access/transam/timeline.c:506 access/transam/twophase.c:1764 access/transam/xlog.c:3032 access/transam/xlog.c:3227 access/transam/xlog.c:3959 access/transam/xlog.c:8141 access/transam/xlog.c:8186 -#: backup/basebackup_server.c:209 replication/logical/snapbuild.c:1791 replication/slot.c:1823 replication/slot.c:1928 storage/file/fd.c:731 storage/file/fd.c:3748 storage/smgr/md.c:1132 storage/smgr/md.c:1177 storage/sync/sync.c:451 utils/misc/guc.c:4370 +#: ../common/controldata_utils.c:263 ../common/controldata_utils.c:268 ../common/file_utils.c:418 ../common/file_utils.c:488 access/heap/rewriteheap.c:925 access/heap/rewriteheap.c:1135 access/heap/rewriteheap.c:1240 access/transam/timeline.c:432 access/transam/timeline.c:506 access/transam/twophase.c:1778 access/transam/xlog.c:3316 access/transam/xlog.c:3511 access/transam/xlog.c:4304 access/transam/xlog.c:8655 access/transam/xlog.c:8700 +#: backup/basebackup_server.c:207 commands/dbcommands.c:514 replication/logical/snapbuild.c:1812 replication/slot.c:2112 replication/slot.c:2218 storage/file/fd.c:820 storage/file/fd.c:3851 storage/smgr/md.c:1331 storage/smgr/md.c:1376 storage/sync/sync.c:446 utils/misc/guc.c:4530 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:133 ../common/cryptohash_openssl.c:332 ../common/exec.c:550 ../common/exec.c:595 ../common/exec.c:687 ../common/hmac.c:309 ../common/hmac.c:325 ../common/hmac_openssl.c:132 ../common/hmac_openssl.c:327 ../common/md5_common.c:155 ../common/psprintf.c:143 ../common/scram-common.c:258 ../common/stringinfo.c:305 ../port/path.c:751 ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1411 -#: access/transam/xlogrecovery.c:589 lib/dshash.c:253 libpq/auth.c:1345 libpq/auth.c:1389 libpq/auth.c:1946 libpq/be-secure-gssapi.c:524 postmaster/bgworker.c:352 postmaster/bgworker.c:934 postmaster/postmaster.c:2534 postmaster/postmaster.c:4127 postmaster/postmaster.c:5495 postmaster/postmaster.c:5866 replication/libpqwalreceiver/libpqwalreceiver.c:308 replication/logical/logical.c:208 replication/walsender.c:686 storage/buffer/localbuf.c:601 -#: storage/file/fd.c:823 storage/file/fd.c:1354 storage/file/fd.c:1515 storage/file/fd.c:2428 storage/ipc/procarray.c:1449 storage/ipc/procarray.c:2232 storage/ipc/procarray.c:2239 storage/ipc/procarray.c:2738 storage/ipc/procarray.c:3374 utils/adt/formatting.c:1690 utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/pg_locale.c:469 utils/adt/pg_locale.c:633 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:514 utils/hash/dynahash.c:614 -#: utils/hash/dynahash.c:1111 utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 utils/mb/mbutils.c:842 utils/misc/guc.c:640 utils/misc/guc.c:665 utils/misc/guc.c:1053 utils/misc/guc.c:4348 utils/misc/tzparser.c:476 utils/mmgr/aset.c:445 utils/mmgr/dsa.c:713 utils/mmgr/dsa.c:735 utils/mmgr/dsa.c:816 utils/mmgr/generation.c:205 utils/mmgr/mcxt.c:1046 utils/mmgr/mcxt.c:1082 utils/mmgr/mcxt.c:1120 utils/mmgr/mcxt.c:1158 utils/mmgr/mcxt.c:1246 -#: utils/mmgr/mcxt.c:1277 utils/mmgr/mcxt.c:1313 utils/mmgr/mcxt.c:1502 utils/mmgr/mcxt.c:1547 utils/mmgr/mcxt.c:1604 utils/mmgr/slab.c:366 +#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:158 ../common/cryptohash_openssl.c:356 ../common/exec.c:562 ../common/exec.c:607 ../common/exec.c:699 ../common/hmac.c:309 ../common/hmac.c:325 ../common/hmac_openssl.c:160 ../common/hmac_openssl.c:357 ../common/md5_common.c:156 ../common/parse_manifest.c:157 ../common/parse_manifest.c:852 ../common/psprintf.c:143 ../common/scram-common.c:268 ../common/stringinfo.c:314 ../port/path.c:828 ../port/path.c:865 +#: ../port/path.c:882 access/transam/twophase.c:1418 access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1352 libpq/auth.c:1396 libpq/auth.c:1953 libpq/be-secure-gssapi.c:524 postmaster/bgworker.c:355 postmaster/bgworker.c:945 postmaster/postmaster.c:3560 postmaster/postmaster.c:4021 postmaster/postmaster.c:4383 postmaster/walsummarizer.c:935 replication/libpqwalreceiver/libpqwalreceiver.c:387 replication/logical/logical.c:210 replication/walsender.c:835 +#: storage/buffer/localbuf.c:606 storage/file/fd.c:912 storage/file/fd.c:1443 storage/file/fd.c:1604 storage/file/fd.c:2531 storage/ipc/procarray.c:1465 storage/ipc/procarray.c:2219 storage/ipc/procarray.c:2226 storage/ipc/procarray.c:2731 storage/ipc/procarray.c:3435 utils/adt/formatting.c:1725 utils/adt/formatting.c:1873 utils/adt/formatting.c:2075 utils/adt/pg_locale.c:532 utils/adt/pg_locale.c:696 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:516 +#: utils/hash/dynahash.c:616 utils/hash/dynahash.c:1099 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:649 utils/misc/guc.c:674 utils/misc/guc.c:1062 utils/misc/guc.c:4508 utils/misc/tzparser.c:477 utils/mmgr/aset.c:451 utils/mmgr/bump.c:183 utils/mmgr/dsa.c:707 utils/mmgr/dsa.c:729 utils/mmgr/dsa.c:810 utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1154 utils/mmgr/slab.c:370 #, c-format msgid "out of memory" msgstr "メモリä¸è¶³ã§ã™" -#: ../common/cryptohash.c:266 ../common/cryptohash.c:272 ../common/cryptohash_openssl.c:344 ../common/cryptohash_openssl.c:352 ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:339 ../common/hmac_openssl.c:347 +#: ../common/cryptohash.c:266 ../common/cryptohash.c:272 ../common/cryptohash_openssl.c:368 ../common/cryptohash_openssl.c:376 ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:369 ../common/hmac_openssl.c:377 msgid "success" msgstr "æˆåŠŸ" -#: ../common/cryptohash.c:268 ../common/cryptohash_openssl.c:346 ../common/hmac_openssl.c:341 +#: ../common/cryptohash.c:268 ../common/cryptohash_openssl.c:370 ../common/hmac_openssl.c:371 msgid "destination buffer too small" msgstr "出力先ãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¾ã™" -#: ../common/cryptohash_openssl.c:348 ../common/hmac_openssl.c:343 +#: ../common/cryptohash_openssl.c:372 ../common/hmac_openssl.c:373 msgid "OpenSSL failure" msgstr "OpenSSLã®ã‚¨ãƒ©ãƒ¼" -#: ../common/exec.c:172 +#: ../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "䏿­£ãªãƒã‚¤ãƒŠãƒª\"%s\": %m" -#: ../common/exec.c:215 +#: ../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "ãƒã‚¤ãƒŠãƒª\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../common/exec.c:223 +#: ../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "実行ã™ã¹ã\"%s\"ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: ../common/exec.c:250 +#: ../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "パス\"%s\"を絶対パス形å¼ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../common/exec.c:412 libpq/pqcomm.c:728 storage/ipc/latch.c:1128 storage/ipc/latch.c:1308 storage/ipc/latch.c:1541 storage/ipc/latch.c:1703 storage/ipc/latch.c:1829 +#: ../common/exec.c:382 commands/collationcmds.c:876 commands/copyfrom.c:1723 commands/copyto.c:654 libpq/be-secure-common.c:59 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "コマンド\"%s\"を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../common/exec.c:394 libpq/be-secure-common.c:71 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "コマンド\"%s\"ã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "コマンド\"%s\"ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ãŒè¿”å´ã•れã¾ã›ã‚“ã§ã—ãŸ" + +#: ../common/exec.c:424 libpq/pqcomm.c:192 storage/ipc/latch.c:1169 storage/ipc/latch.c:1349 storage/ipc/latch.c:1589 storage/ipc/latch.c:1751 storage/ipc/latch.c:1877 #, c-format msgid "%s() failed: %m" msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" -#: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 ../port/path.c:808 utils/misc/ps_status.c:168 utils/misc/ps_status.c:176 utils/misc/ps_status.c:203 utils/misc/ps_status.c:211 +#: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 ../common/psprintf.c:145 ../port/path.c:830 ../port/path.c:867 ../port/path.c:884 utils/misc/ps_status.c:193 utils/misc/ps_status.c:201 utils/misc/ps_status.c:228 utils/misc/ps_status.c:236 #, c-format msgid "out of memory\n" msgstr "メモリä¸è¶³ã§ã™\n" @@ -191,23 +210,33 @@ msgstr "メモリä¸è¶³ã§ã™\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "nullãƒã‚¤ãƒ³ã‚¿ã¯è¤‡è£½ã§ãã¾ã›ã‚“(内部エラー)\n" -#: ../common/file_utils.c:87 ../common/file_utils.c:447 ../common/file_utils.c:451 access/transam/twophase.c:1314 access/transam/xlogarchive.c:112 access/transam/xlogarchive.c:229 backup/basebackup.c:346 backup/basebackup.c:544 backup/basebackup.c:615 commands/copyfrom.c:1679 commands/copyto.c:702 commands/extension.c:3445 commands/tablespace.c:810 commands/tablespace.c:899 postmaster/pgarch.c:590 replication/logical/snapbuild.c:1649 storage/file/fd.c:1879 -#: storage/file/fd.c:1965 storage/file/fd.c:3461 utils/adt/dbsize.c:106 utils/adt/dbsize.c:258 utils/adt/dbsize.c:338 utils/adt/genfile.c:483 utils/adt/genfile.c:658 utils/adt/misc.c:340 +#: ../common/file_utils.c:76 storage/file/fd.c:3516 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "ファイル\"%s\"ã«å¯¾ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã‚’åŒæœŸã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../common/file_utils.c:120 ../common/file_utils.c:566 ../common/file_utils.c:570 access/transam/twophase.c:1321 access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 backup/basebackup.c:355 backup/basebackup.c:553 backup/basebackup.c:624 backup/walsummary.c:247 backup/walsummary.c:254 commands/copyfrom.c:1749 commands/copyto.c:700 commands/extension.c:3527 commands/tablespace.c:804 commands/tablespace.c:893 postmaster/pgarch.c:680 +#: replication/logical/snapbuild.c:1670 replication/logical/snapbuild.c:2173 storage/file/fd.c:1968 storage/file/fd.c:2054 storage/file/fd.c:3564 utils/adt/dbsize.c:105 utils/adt/dbsize.c:257 utils/adt/dbsize.c:337 utils/adt/genfile.c:437 utils/adt/genfile.c:612 utils/adt/misc.c:340 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: ../common/file_utils.c:162 ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:734 commands/tablespace.c:744 postmaster/postmaster.c:1561 storage/file/fd.c:2830 storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:338 +#: ../common/file_utils.c:130 ../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ã“ã®ãƒ“ルドã§ã¯åŒæœŸæ–¹å¼\"%s\"をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" + +#: ../common/file_utils.c:151 ../common/file_utils.c:281 ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 commands/tablespace.c:738 postmaster/postmaster.c:1470 storage/file/fd.c:2933 storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:339 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../common/file_utils.c:196 ../common/pgfnames.c:69 ../common/rmtree.c:104 storage/file/fd.c:2842 +#: ../common/file_utils.c:169 ../common/file_utils.c:315 ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2945 #, c-format msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../common/file_utils.c:379 access/transam/xlogarchive.c:383 postmaster/pgarch.c:746 postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1810 replication/slot.c:723 replication/slot.c:1709 replication/slot.c:1851 storage/file/fd.c:749 utils/time/snapmgr.c:1284 +#: ../common/file_utils.c:498 access/transam/xlogarchive.c:389 postmaster/pgarch.c:834 postmaster/syslogger.c:1559 replication/logical/snapbuild.c:1831 replication/slot.c:936 replication/slot.c:1998 replication/slot.c:2140 storage/file/fd.c:838 utils/time/snapmgr.c:1255 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" @@ -216,89 +245,101 @@ msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: % msgid "internal error" msgstr "内部エラー" -#: ../common/jsonapi.c:1144 +#: ../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "å†å¸°é™ä¸‹ãƒ‘ーサーã¯å·®åˆ†å­—å¥è§£æžå™¨ã‚’使用ã§ãã¾ã›ã‚“。" + +#: ../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "差分パーサーã¯å·®åˆ†å­—å¥è§£æžå™¨ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚" + +#: ../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSONã®ãƒã‚¹ãƒˆãŒæ·±ã™ãŽã¾ã™ã€å¯èƒ½ãªæœ€å¤§ã®æ·±ã•ã¯6400ã§ã™ã€‚" + +#: ../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "エスケープシーケンス\"\\%s\"ã¯ä¸æ­£ã§ã™ã€‚" +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "エスケープシーケンス\"\\%.*s\"ã¯ä¸æ­£ã§ã™ã€‚" -#: ../common/jsonapi.c:1147 +#: ../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x値をæŒã¤æ–‡å­—ã¯ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: ../common/jsonapi.c:1150 +#: ../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "入力ã®çµ‚端を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected end of input, but found \"%.*s\"." +msgstr "入力ã®çµ‚端を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%.*s\"ã§ã—ãŸã€‚" -#: ../common/jsonapi.c:1153 +#: ../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "é…列è¦ç´ ã¾ãŸã¯\"]\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "é…列è¦ç´ ã¾ãŸã¯\"]\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%.*s\"ã§ã—ãŸã€‚" -#: ../common/jsonapi.c:1156 +#: ../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "\",\"ã¾ãŸã¯\"]\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "\",\"ã¾ãŸã¯\"]\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%.*s\"ã§ã—ãŸã€‚" -#: ../common/jsonapi.c:1159 +#: ../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "\":\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected \":\", but found \"%.*s\"." +msgstr "\":\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%.*s\"ã§ã—ãŸã€‚" -#: ../common/jsonapi.c:1162 +#: ../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "JSON値を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "JSON値を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%.*s\"ã§ã—ãŸã€‚" -#: ../common/jsonapi.c:1165 +#: ../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "入力文字列ãŒäºˆæœŸã›ãšçµ‚了ã—ã¾ã—ãŸã€‚" -#: ../common/jsonapi.c:1167 +#: ../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "文字列ã¾ãŸã¯\"}\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "文字列ã¾ãŸã¯\"}\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%.*s\"ã§ã—ãŸã€‚" -#: ../common/jsonapi.c:1170 +#: ../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "\",\"ã¾ãŸã¯\"}\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "\",\"ã¾ãŸã¯\"}\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%.*s\"ã§ã—ãŸã€‚" -#: ../common/jsonapi.c:1173 +#: ../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "文字列を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected string, but found \"%.*s\"." +msgstr "文字列を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%.*s\"ã§ã—ãŸã€‚" -#: ../common/jsonapi.c:1176 +#: ../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "トークン\"%s\"ã¯ä¸æ­£ã§ã™ã€‚" +msgid "Token \"%.*s\" is invalid." +msgstr "トークン\"%.*s\"ã¯ä¸æ­£ã§ã™ã€‚" -#: ../common/jsonapi.c:1179 jsonpath_scan.l:598 +#: ../common/jsonapi.c:2164 jsonpath_scan.l:608 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 ã¯ãƒ†ã‚­ã‚¹ãƒˆã«å¤‰æ›ã§ãã¾ã›ã‚“。" -#: ../common/jsonapi.c:1181 +#: ../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\"ã®å¾Œã«ã¯16進数ã®4æ¡ãŒç¶šã‹ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: ../common/jsonapi.c:1184 +#: ../common/jsonapi.c:2169 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "エンコーディングãŒUTF-8ã§ã¯ãªã„å ´åˆã€ã‚³ãƒ¼ãƒ‰ãƒã‚¤ãƒ³ãƒˆã®å€¤ãŒ 007F 以上ã«ã¤ã„ã¦ã¯Unicodeエスケープã®å€¤ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。" -#: ../common/jsonapi.c:1187 +#: ../common/jsonapi.c:2178 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "Unicodeエスケープã®å€¤ãŒã‚µãƒ¼ãƒãƒ¼ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°%sã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" -#: ../common/jsonapi.c:1190 jsonpath_scan.l:631 +#: ../common/jsonapi.c:2185 jsonpath_scan.l:641 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodeã®ãƒã‚¤ã‚µãƒ­ã‚²ãƒ¼ãƒˆã¯ãƒã‚¤ã‚µãƒ­ã‚²ãƒ¼ãƒˆã«ç¶šã„ã¦ã¯ã„ã‘ã¾ã›ã‚“。" -#: ../common/jsonapi.c:1192 jsonpath_scan.l:642 jsonpath_scan.l:652 jsonpath_scan.l:703 +#: ../common/jsonapi.c:2187 jsonpath_scan.l:652 jsonpath_scan.l:662 jsonpath_scan.l:713 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicodeã®ãƒ­ãƒ¼ã‚µãƒ­ã‚²ãƒ¼ãƒˆã¯ãƒã‚¤ã‚µãƒ­ã‚²ãƒ¼ãƒˆã«ç¶šã‹ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" @@ -323,7 +364,164 @@ msgstr "詳細: " msgid "hint: " msgstr "ヒント: " -#: ../common/percentrepl.c:79 ../common/percentrepl.c:85 ../common/percentrepl.c:118 ../common/percentrepl.c:124 postmaster/postmaster.c:2208 utils/misc/guc.c:3118 utils/misc/guc.c:3154 utils/misc/guc.c:3224 utils/misc/guc.c:4547 utils/misc/guc.c:6721 utils/misc/guc.c:6762 +#: ../common/parse_manifest.c:159 ../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®åˆæœŸåŒ–ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: ../common/parse_manifest.c:203 ../common/parse_manifest.c:260 +msgid "manifest ended unexpectedly" +msgstr "目録ãŒäºˆæœŸã›ãšçµ‚了ã—ã¾ã—ãŸã€‚" + +#: ../common/parse_manifest.c:209 ../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®æ›´æ–°ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: ../common/parse_manifest.c:301 +msgid "unexpected object start" +msgstr "予期ã—ãªã„オブジェクトã®é–‹å§‹" + +#: ../common/parse_manifest.c:336 +msgid "unexpected object end" +msgstr "予期ã—ãªã„オブジェクトã®çµ‚ã‚り" + +#: ../common/parse_manifest.c:365 +msgid "unexpected array start" +msgstr "予期ã—ãªã„é…列ã®é–‹å§‹" + +#: ../common/parse_manifest.c:390 +msgid "unexpected array end" +msgstr "予期ã—ãªã„é…列ã®çµ‚ã‚り" + +#: ../common/parse_manifest.c:417 +msgid "expected version indicator" +msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³æŒ‡ç¤ºå­ã‚’想定ã—ã¦ã„ã¾ã—ãŸ" + +#: ../common/parse_manifest.c:453 +msgid "unrecognized top-level field" +msgstr "èªè­˜ã§ããªã„トップレベルフィールド" + +#: ../common/parse_manifest.c:472 +msgid "unexpected file field" +msgstr "予期ã—ãªã„ファイルフィールド" + +#: ../common/parse_manifest.c:486 +msgid "unexpected WAL range field" +msgstr "予期ã—ãªã„WAL範囲フィールド" + +#: ../common/parse_manifest.c:492 +msgid "unexpected object field" +msgstr "予期ã—ãªã„オブジェクトフィールド" + +#: ../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "予期ã—ãªã„スカラー" + +#: ../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "目録ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒæ•´æ•°ã§ã¯ã‚りã¾ã›ã‚“" + +#: ../common/parse_manifest.c:612 +msgid "unexpected manifest version" +msgstr "予期ã—ãªã„目録ãƒãƒ¼ã‚¸ãƒ§ãƒ³" + +#: ../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "目録中ã®ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ãŒæ•´æ•°ã§ã¯ã‚りã¾ã›ã‚“" + +#: ../common/parse_manifest.c:661 +msgid "missing path name" +msgstr "パスåãŒã‚りã¾ã›ã‚“" + +#: ../common/parse_manifest.c:664 +msgid "both path name and encoded path name" +msgstr "パスåã¨ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•れãŸãƒ‘スåã®ä¸¡æ–¹" + +#: ../common/parse_manifest.c:666 +msgid "missing size" +msgstr "サイズãŒã‚りã¾ã›ã‚“" + +#: ../common/parse_manifest.c:669 +msgid "checksum without algorithm" +msgstr "アルゴリズムãªã—ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ " + +#: ../common/parse_manifest.c:683 +msgid "could not decode file name" +msgstr "ファイルåをデコードã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: ../common/parse_manifest.c:693 +msgid "file size is not an integer" +msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºãŒæ•´æ•°ã§ã¯ã‚りã¾ã›ã‚“" + +#: ../common/parse_manifest.c:699 backup/basebackup.c:870 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "èªè­˜ã§ããªã„ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ : \"%s\"" + +#: ../common/parse_manifest.c:718 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "\"%s\" ファイルã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒç„¡åй: \"%s\"" + +#: ../common/parse_manifest.c:761 +msgid "missing timeline" +msgstr "タイムラインãŒã‚りã¾ã›ã‚“" + +#: ../common/parse_manifest.c:763 +msgid "missing start LSN" +msgstr "é–‹å§‹LSNãŒã‚りã¾ã›ã‚“" + +#: ../common/parse_manifest.c:765 +msgid "missing end LSN" +msgstr "終了LSNãŒã‚りã¾ã›ã‚“" + +#: ../common/parse_manifest.c:771 +msgid "timeline is not an integer" +msgstr "ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ãŒæ•´æ•°ã§ã¯ã‚りã¾ã›ã‚“" + +#: ../common/parse_manifest.c:774 +msgid "could not parse start LSN" +msgstr "é–‹å§‹LSNをパースã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: ../common/parse_manifest.c:777 +msgid "could not parse end LSN" +msgstr "終了LSNをパースã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: ../common/parse_manifest.c:842 +msgid "expected at least 2 lines" +msgstr "å°‘ãªãã¨ã‚‚2行ãŒå¿…è¦ã§ã™" + +#: ../common/parse_manifest.c:845 +msgid "last line not newline-terminated" +msgstr "最後ã®è¡ŒãŒæ”¹è¡Œã§çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“" + +#: ../common/parse_manifest.c:864 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®å®Œäº†ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: ../common/parse_manifest.c:868 +#, c-format +msgid "manifest has no checksum" +msgstr "目録ã«ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒã‚りã¾ã›ã‚“" + +#: ../common/parse_manifest.c:872 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "無効ãªç›®éŒ²ãƒã‚§ãƒƒã‚¯ã‚µãƒ : \"%s\"" + +#: ../common/parse_manifest.c:876 +#, c-format +msgid "manifest checksum mismatch" +msgstr "目録ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ä¸ä¸€è‡´" + +#: ../common/parse_manifest.c:891 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録をパースã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: ../common/percentrepl.c:79 ../common/percentrepl.c:85 ../common/percentrepl.c:118 ../common/percentrepl.c:124 tcop/backend_startup.c:741 utils/misc/guc.c:3167 utils/misc/guc.c:3208 utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6931 utils/misc/guc.c:6972 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "パラメータ\"%s\"ã®å€¤ãŒä¸æ­£ã§ã™: \"%s\"" @@ -383,51 +581,51 @@ msgstr "制é™ä»˜ãトークンã§å†å®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—ãŸ: %lu" msgid "could not get exit code from subprocess: error code %lu" msgstr "サブプロセスã®çµ‚了コードをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" -#: ../common/rmtree.c:95 access/heap/rewriteheap.c:1248 access/transam/twophase.c:1703 access/transam/xlogarchive.c:120 access/transam/xlogarchive.c:393 postmaster/postmaster.c:1143 postmaster/syslogger.c:1537 replication/logical/origin.c:591 replication/logical/reorderbuffer.c:4526 replication/logical/snapbuild.c:1691 replication/logical/snapbuild.c:2121 replication/slot.c:1902 storage/file/fd.c:789 storage/file/fd.c:3275 storage/file/fd.c:3337 -#: storage/file/reinit.c:262 storage/ipc/dsm.c:316 storage/smgr/md.c:380 storage/smgr/md.c:439 storage/sync/sync.c:248 utils/time/snapmgr.c:1608 +#: ../common/rmtree.c:97 access/heap/rewriteheap.c:1214 access/transam/twophase.c:1717 access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:399 postmaster/postmaster.c:1048 postmaster/syslogger.c:1488 replication/logical/origin.c:591 replication/logical/reorderbuffer.c:4589 replication/logical/snapbuild.c:1712 replication/logical/snapbuild.c:2146 replication/slot.c:2192 storage/file/fd.c:878 storage/file/fd.c:3378 storage/file/fd.c:3440 +#: storage/file/reinit.c:261 storage/ipc/dsm.c:343 storage/smgr/md.c:381 storage/smgr/md.c:440 storage/sync/sync.c:243 utils/time/snapmgr.c:1591 #, c-format msgid "could not remove file \"%s\": %m" msgstr "ファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../common/rmtree.c:122 commands/tablespace.c:773 commands/tablespace.c:786 commands/tablespace.c:821 commands/tablespace.c:911 storage/file/fd.c:3267 storage/file/fd.c:3676 +#: ../common/rmtree.c:124 commands/tablespace.c:767 commands/tablespace.c:780 commands/tablespace.c:815 commands/tablespace.c:905 storage/file/fd.c:3370 storage/file/fd.c:3779 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../common/scram-common.c:271 +#: ../common/scram-common.c:281 msgid "could not encode salt" msgstr "saltã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: ../common/scram-common.c:287 +#: ../common/scram-common.c:297 msgid "could not encode stored key" msgstr "nonceã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: ../common/scram-common.c:304 +#: ../common/scram-common.c:314 msgid "could not encode server key" msgstr "サーãƒãƒ¼ã‚­ãƒ¼ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: ../common/stringinfo.c:306 +#: ../common/stringinfo.c:315 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." msgstr "%dãƒã‚¤ãƒˆã‚’æŒã¤æ–‡å­—列ãƒãƒƒãƒ•ã‚¡ã‚’%dãƒã‚¤ãƒˆå¤šãã€å¤§ããã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。" -#: ../common/stringinfo.c:310 +#: ../common/stringinfo.c:319 #, c-format msgid "" "out of memory\n" "\n" "Cannot enlarge string buffer containing %d bytes by %d more bytes.\n" msgstr "" -"メモリãŒè¶³ã‚Šã¾ã›ã‚“\n" +"メモリーä¸è¶³ã§ã™\n" "\n" -"%dãƒã‚¤ãƒˆã®æ–‡å­—列ãƒãƒƒãƒ•ã‚¡ã‚’%dãƒã‚¤ãƒˆæ‹¡ã’ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。\n" +"%dãƒã‚¤ãƒˆä½¿ç”¨ã—ã¦ã„る文字列ãƒãƒƒãƒ•ã‚¡ã‚’ã•らã«%dãƒã‚¤ãƒˆæ‹¡å¼µã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。\n" #: ../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" msgstr "実効ユーザーID %ld ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %s" -#: ../common/username.c:45 libpq/auth.c:1881 +#: ../common/username.c:45 libpq/auth.c:1888 msgid "user does not exist" msgstr "ユーザーãŒå­˜åœ¨ã—ã¾ã›ã‚“" @@ -519,22 +717,22 @@ msgstr "å†è©¦è¡Œã‚’30ç§’é–“ç¶šã‘ã¾ã™ã€‚" msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "データベースシステムã«å¹²æ¸‰ã™ã‚‹ã‚¢ãƒ³ãƒã‚¦ã‚£ãƒ«ã‚¹ã€ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¨ã„ã£ãŸã‚½ãƒ•トウェアãŒå­˜åœ¨ã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" -#: ../port/path.c:775 +#: ../port/path.c:852 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "ç¾åœ¨ã®ä½œæ¥­ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "ç¾åœ¨ã®ä½œæ¥­ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" #: ../port/strerror.c:72 #, c-format msgid "operating system error %d" msgstr "オペレーティングシステムエラー %d" -#: ../port/thread.c:50 ../port/thread.c:86 +#: ../port/user.c:43 ../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "ローカルユーザーID %dã®å‚ç…§ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: ../port/thread.c:55 ../port/thread.c:91 +#: ../port/user.c:48 ../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "ID %d ã‚’æŒã¤ãƒ­ãƒ¼ã‚«ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯å­˜åœ¨ã—ã¾ã›ã‚“" @@ -554,83 +752,82 @@ msgstr "PowerUsersグループã®SIDã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラー msgid "could not check access token membership: error code %lu\n" msgstr "アクセストークンã®ãƒ¡ãƒ³ãƒãƒ¼ã‚·ãƒƒãƒ—を確èªã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu\n" -#: access/brin/brin.c:216 +#: access/brin/brin.c:405 #, c-format msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "インデックス\"%s\" ページ%uã®BRIN範囲è¦ç´„ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“" -#: access/brin/brin.c:1036 access/brin/brin.c:1137 access/gin/ginfast.c:1035 access/transam/xlogfuncs.c:189 access/transam/xlogfuncs.c:214 access/transam/xlogfuncs.c:247 access/transam/xlogfuncs.c:286 access/transam/xlogfuncs.c:307 access/transam/xlogfuncs.c:328 access/transam/xlogfuncs.c:398 access/transam/xlogfuncs.c:456 +#: access/brin/brin.c:1387 access/brin/brin.c:1495 access/gin/ginfast.c:1040 access/transam/xlogfuncs.c:183 access/transam/xlogfuncs.c:208 access/transam/xlogfuncs.c:241 access/transam/xlogfuncs.c:280 access/transam/xlogfuncs.c:301 access/transam/xlogfuncs.c:322 access/transam/xlogfuncs.c:388 access/transam/xlogfuncs.c:446 #, c-format msgid "recovery is in progress" msgstr "リカãƒãƒªã¯ç¾åœ¨é€²è¡Œä¸­ã§ã™" -#: access/brin/brin.c:1037 access/brin/brin.c:1138 +#: access/brin/brin.c:1388 access/brin/brin.c:1496 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "BRIN制御関数ã¯ãƒªã‚«ãƒãƒªä¸­ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。" -#: access/brin/brin.c:1042 access/brin/brin.c:1143 +#: access/brin/brin.c:1393 access/brin/brin.c:1501 #, c-format msgid "block number out of range: %lld" msgstr "ブロック番å·ãŒç¯„囲外ã§ã™: %lld" -#: access/brin/brin.c:1086 access/brin/brin.c:1169 +#: access/brin/brin.c:1438 access/brin/brin.c:1527 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\"ã¯BRINインデックスã§ã¯ã‚りã¾ã›ã‚“" -#: access/brin/brin.c:1102 access/brin/brin.c:1185 +#: access/brin/brin.c:1454 access/brin/brin.c:1543 #, c-format msgid "could not open parent table of index \"%s\"" msgstr "インデックス\"%s\"ã®è¦ªãƒ†ãƒ¼ãƒ–ルをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/brin/brin_bloom.c:750 access/brin/brin_bloom.c:792 access/brin/brin_minmax_multi.c:3011 access/brin/brin_minmax_multi.c:3148 statistics/dependencies.c:663 statistics/dependencies.c:716 statistics/mcv.c:1484 statistics/mcv.c:1515 statistics/mvdistinct.c:344 statistics/mvdistinct.c:397 utils/adt/pseudotypes.c:43 utils/adt/pseudotypes.c:77 utils/adt/tsgistidx.c:93 +#: access/brin/brin.c:1463 access/brin/brin.c:1559 access/gin/ginfast.c:1085 parser/parse_utilcmd.c:2277 #, c-format -msgid "cannot accept a value of type %s" -msgstr "%såž‹ã®å€¤ã¯å—ã‘付ã‘られã¾ã›ã‚“" +msgid "index \"%s\" is not valid" +msgstr "インデックス\"%s\"ã¯æœ‰åйã§ã¯ã‚りã¾ã›ã‚“" -#: access/brin/brin_minmax_multi.c:2171 access/brin/brin_minmax_multi.c:2178 access/brin/brin_minmax_multi.c:2185 utils/adt/timestamp.c:941 utils/adt/timestamp.c:1518 utils/adt/timestamp.c:2708 utils/adt/timestamp.c:2778 utils/adt/timestamp.c:2795 utils/adt/timestamp.c:2848 utils/adt/timestamp.c:2887 utils/adt/timestamp.c:3184 utils/adt/timestamp.c:3189 utils/adt/timestamp.c:3194 utils/adt/timestamp.c:3244 utils/adt/timestamp.c:3251 utils/adt/timestamp.c:3258 -#: utils/adt/timestamp.c:3278 utils/adt/timestamp.c:3285 utils/adt/timestamp.c:3292 utils/adt/timestamp.c:3322 utils/adt/timestamp.c:3330 utils/adt/timestamp.c:3374 utils/adt/timestamp.c:3796 utils/adt/timestamp.c:3920 utils/adt/timestamp.c:4440 +#: access/brin/brin_bloom.c:785 access/brin/brin_bloom.c:827 access/brin/brin_minmax_multi.c:2984 access/brin/brin_minmax_multi.c:3121 statistics/dependencies.c:661 statistics/dependencies.c:714 statistics/mcv.c:1480 statistics/mcv.c:1511 statistics/mvdistinct.c:343 statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:40 utils/adt/pseudotypes.c:74 utils/adt/tsgistidx.c:94 #, c-format -msgid "interval out of range" -msgstr "intervalãŒç¯„囲外ã§ã™" +msgid "cannot accept a value of type %s" +msgstr "%såž‹ã®å€¤ã¯å—ã‘付ã‘られã¾ã›ã‚“" -#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 access/brin/brin_pageops.c:852 access/gin/ginentrypage.c:110 access/gist/gist.c:1442 access/spgist/spgdoinsert.c:2002 access/spgist/spgdoinsert.c:2279 +#: access/brin/brin_pageops.c:75 access/brin/brin_pageops.c:361 access/brin/brin_pageops.c:851 access/gin/ginentrypage.c:109 access/gist/gist.c:1463 access/spgist/spgdoinsert.c:2001 access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "インデックス行サイズ%1$zuã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\"%3$s\"ã§ã®æœ€å¤§å€¤%2$zuã‚’è¶…ãˆã¦ã„ã¾ã™" -#: access/brin/brin_revmap.c:393 access/brin/brin_revmap.c:399 +#: access/brin/brin_revmap.c:383 access/brin/brin_revmap.c:389 #, c-format msgid "corrupted BRIN index: inconsistent range map" msgstr "BRINインデックスãŒå£Šã‚Œã¦ã„ã¾ã™: 範囲マップã®ä¸æ•´åˆ" -#: access/brin/brin_revmap.c:593 +#: access/brin/brin_revmap.c:583 #, c-format msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" msgstr "BRINインデックス\"%2$s\"ã®ãƒ–ロック %3$u ã®ãƒšãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—ãŒäºˆæœŸã—ãªã„値 0x%1$04X ã§ã™" -#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:151 access/gist/gistvalidate.c:153 access/hash/hashvalidate.c:139 access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 +#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:149 access/gist/gistvalidate.c:152 access/hash/hashvalidate.c:139 access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with invalid support number %d" msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­æ—\"%1$s\"ã¯ä¸æ­£ãªã‚µãƒãƒ¼ãƒˆç•ªå·%4$dã‚’æŒã¤é–¢æ•°%3$sã‚’å«ã‚“ã§ã„ã¾ã™" -#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:163 access/gist/gistvalidate.c:165 access/hash/hashvalidate.c:118 access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 +#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:161 access/gist/gistvalidate.c:164 access/hash/hashvalidate.c:118 access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with wrong signature for support number %d" msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­æ—\"%1$s\"ã¯ã‚µãƒãƒ¼ãƒˆç•ªå·%4$dã«å¯¾ã—ã¦é–“é•ã£ãŸã‚·ã‚°ãƒãƒãƒ£ã‚’æŒã¤é–¢æ•°%3$sã‚’å«ã‚“ã§ã„ã¾ã™" -#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:182 access/gist/gistvalidate.c:185 access/hash/hashvalidate.c:160 access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 +#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:180 access/gist/gistvalidate.c:184 access/hash/hashvalidate.c:160 access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with invalid strategy number %d" msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­æ—\"%1$s\"ã¯ä¸æ­£ãªã‚¹ãƒˆãƒ©ãƒ†ã‚¸ç•ªå·%4$dã‚’æŒã¤æ¼”ç®—å­\"%3$s\"ã‚’å«ã‚“ã§ã„ã¾ã™" -#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:195 access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 access/spgist/spgvalidate.c:237 +#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:193 access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 access/spgist/spgvalidate.c:237 #, c-format msgid "operator family \"%s\" of access method %s contains invalid ORDER BY specification for operator %s" msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­æ—\"%1$s\"ã¯æ¼”ç®—å­%3$sã«å¯¾ã™ã‚‹ä¸æ­£ãªORDER BY指定をå«ã‚“ã§ã„ã¾ã™" -#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:208 access/gist/gistvalidate.c:233 access/hash/hashvalidate.c:186 access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 +#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:206 access/gist/gistvalidate.c:232 access/hash/hashvalidate.c:186 access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with wrong signature" msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­æ—\"%1$s\"ã¯é–“é•ã£ãŸã‚·ã‚°ãƒãƒãƒ£ã‚’æŒã¤æ¼”ç®—å­%3$sã‚’å«ã‚“ã§ã„ã¾ã™" @@ -650,37 +847,37 @@ msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­æ—\"%1$s\"ã¯åž‹%3$sã¨%4$s msgid "operator class \"%s\" of access method %s is missing operator(s)" msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­ã‚¯ãƒ©ã‚¹\"%1$s\"ã¯æ¼”ç®—å­ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“" -#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 access/gist/gistvalidate.c:274 +#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:248 access/gist/gistvalidate.c:273 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d" msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­ã‚¯ãƒ©ã‚¹\"%1$s\"ã¯ã‚µãƒãƒ¼ãƒˆé–¢æ•°%3$dã‚’å«ã‚“ã§ã„ã¾ã›ã‚“" -#: access/common/attmap.c:122 +#: access/common/attmap.c:121 #, c-format msgid "Returned type %s does not match expected type %s in column %d." msgstr "列%3$dã§è¿”ã•れãŸ%1$såž‹ãŒã€æœŸå¾…ã—ã¦ã„ã‚‹%2$såž‹ã¨ä¸€è‡´ã—ã¾ã›ã‚“。" -#: access/common/attmap.c:150 +#: access/common/attmap.c:149 #, c-format msgid "Number of returned columns (%d) does not match expected column count (%d)." msgstr "è¿”ã•れãŸåˆ—æ•°(%d)ãŒã€æœŸå¾…ã™ã‚‹åˆ—æ•°(%d)ã¨ä¸€è‡´ã—ã¾ã›ã‚“。" -#: access/common/attmap.c:234 access/common/attmap.c:246 +#: access/common/attmap.c:233 access/common/attmap.c:245 #, c-format msgid "could not convert row type" msgstr "行型ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/common/attmap.c:235 +#: access/common/attmap.c:234 #, c-format msgid "Attribute \"%s\" of type %s does not match corresponding attribute of type %s." msgstr "%2$såž‹ã®å±žæ€§\"%1$s\"ãŒ%3$såž‹ã®å¯¾å¿œã™ã‚‹å±žæ€§ã¨åˆè‡´ã—ã¾ã›ã‚“。" -#: access/common/attmap.c:247 +#: access/common/attmap.c:246 #, c-format msgid "Attribute \"%s\" of type %s does not exist in type %s." msgstr "%2$såž‹ã®å±žæ€§\"%1$s\"ãŒ%3$såž‹ã®ä¸­ã«å­˜åœ¨ã—ã¾ã›ã‚“。" -#: access/common/heaptuple.c:1036 access/common/heaptuple.c:1371 +#: access/common/heaptuple.c:1132 access/common/heaptuple.c:1467 #, c-format msgid "number of columns (%d) exceeds limit (%d)" msgstr "列数(%d)ãŒä¸Šé™(%d)ã‚’è¶…ãˆã¦ã„ã¾ã™" @@ -690,119 +887,109 @@ msgstr "列数(%d)ãŒä¸Šé™(%d)ã‚’è¶…ãˆã¦ã„ã¾ã™" msgid "number of index columns (%d) exceeds limit (%d)" msgstr "インデックス列数(%d)ãŒä¸Šé™(%d)ã‚’è¶…ãˆã¦ã„ã¾ã™" -#: access/common/indextuple.c:209 access/spgist/spgutils.c:950 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:970 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "インデックス行ãŒ%zuãƒã‚¤ãƒˆã‚’å¿…è¦ã¨ã—ã¾ã™ãŒæœ€å¤§å€¤ã¯%zuã§ã™" -#: access/common/printtup.c:292 tcop/fastpath.c:107 tcop/fastpath.c:454 tcop/postgres.c:1944 +#: access/common/printtup.c:292 commands/explain.c:5376 tcop/fastpath.c:107 tcop/fastpath.c:454 tcop/postgres.c:1956 #, c-format msgid "unsupported format code: %d" msgstr "éžã‚µãƒãƒ¼ãƒˆã®æ›¸å¼ã‚³ãƒ¼ãƒ‰: %d" -#: access/common/reloptions.c:521 access/common/reloptions.c:532 +#: access/common/reloptions.c:519 access/common/reloptions.c:530 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "有効ãªå€¤ã®ç¯„囲ã¯\"on\"ã€\"off\"ã€\"auto\"ã§ã™ã€‚" -#: access/common/reloptions.c:543 +#: access/common/reloptions.c:541 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "有効ãªå€¤ã¯\"local\"ã¨\"cascaded\"ã§ã™ã€‚" -#: access/common/reloptions.c:691 +#: access/common/reloptions.c:689 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "ユーザー定義リレーションã®ãƒ‘ラメータ型ã®åˆ¶é™ã‚’è¶…ãˆã¾ã—ãŸ" -#: access/common/reloptions.c:1233 +#: access/common/reloptions.c:1231 #, c-format msgid "RESET must not include values for parameters" msgstr "RESETã«ã¯ãƒ‘ラメータã®å€¤ã‚’å«ã‚ã¦ã¯ã„ã‘ã¾ã›ã‚“" -#: access/common/reloptions.c:1265 +#: access/common/reloptions.c:1263 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "èªè­˜ã§ããªã„パラメータ namaspace \"%s\"" -#: access/common/reloptions.c:1302 commands/variable.c:1167 +#: access/common/reloptions.c:1300 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "WITH OIDSã¨å®šç¾©ã•れãŸãƒ†ãƒ¼ãƒ–ルã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: access/common/reloptions.c:1470 +#: access/common/reloptions.c:1468 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "èªè­˜ã§ããªã„ラメータ \"%s\"" -#: access/common/reloptions.c:1582 +#: access/common/reloptions.c:1580 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "パラメータ\"%s\"ãŒè¤‡æ•°å›žæŒ‡å®šã•れã¾ã—ãŸ" -#: access/common/reloptions.c:1598 +#: access/common/reloptions.c:1596 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "䏿­£ãªãƒ–ール型オプションã®å€¤ \"%s\": %s" -#: access/common/reloptions.c:1610 +#: access/common/reloptions.c:1608 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "䏿­£ãªæ•´æ•°åž‹ã‚ªãƒ—ションã®å€¤ \"%s\": %s" -#: access/common/reloptions.c:1616 access/common/reloptions.c:1636 +#: access/common/reloptions.c:1614 access/common/reloptions.c:1634 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "値%sã¯ã‚ªãƒ—ション\"%s\"ã®ç¯„囲外ã§ã™" -#: access/common/reloptions.c:1618 +#: access/common/reloptions.c:1616 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "有効ãªå€¤ã®ç¯„囲ã¯\"%d\"~\"%d\"ã§ã™ã€‚" -#: access/common/reloptions.c:1630 +#: access/common/reloptions.c:1628 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "䏿­£ãªæµ®å‹•å°æ•°ç‚¹åž‹ã‚ªãƒ—ションã®å€¤ \"%s\": %s" -#: access/common/reloptions.c:1638 +#: access/common/reloptions.c:1636 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "有効ãªå€¤ã®ç¯„囲ã¯\"%f\"~\"%f\"ã§ã™ã€‚" -#: access/common/reloptions.c:1660 +#: access/common/reloptions.c:1658 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "䏿­£ãªåˆ—挙型オプションã®å€¤ \"%s\": %s" -#: access/common/reloptions.c:1991 +#: access/common/reloptions.c:1989 #, c-format msgid "cannot specify storage parameters for a partitioned table" msgstr "パーティション親テーブルã«å¯¾ã—ã¦ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: access/common/reloptions.c:1992 +#: access/common/reloptions.c:1990 #, c-format -msgid "Specify storage parameters for its leaf partitions, instead." +msgid "Specify storage parameters for its leaf partitions instead." msgstr "代ã‚りã«ãƒªãƒ¼ãƒ•パーティションã«å¯¾ã—ã¦ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãƒ‘ラメータを指定ã—ã¦ãã ã•ã„。" -#: access/common/toast_compression.c:33 +#: access/common/toast_compression.c:31 #, c-format msgid "compression method lz4 not supported" msgstr "åœ§ç¸®æ–¹å¼ lz4 ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: access/common/toast_compression.c:34 +#: access/common/toast_compression.c:32 #, c-format msgid "This functionality requires the server to be built with lz4 support." msgstr "ã“ã®æ©Ÿèƒ½ã¯lz4lサãƒãƒ¼ãƒˆä»˜ãã§ãƒ“ルドã—ãŸã‚µãƒ¼ãƒãƒ¼ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚" -#: access/common/tupdesc.c:837 commands/tablecmds.c:6953 commands/tablecmds.c:12973 -#, c-format -msgid "too many array dimensions" -msgstr "é…åˆ—ã®æ¬¡å…ƒå¤šã™ãŽã¾ã™" - -#: access/common/tupdesc.c:842 parser/parse_clause.c:772 parser/parse_relation.c:1912 -#, c-format -msgid "column \"%s\" cannot be declared SETOF" -msgstr "列\"%s\"ã¯SETOFã¨ã—ã¦å®£è¨€ã§ãã¾ã›ã‚“" - #: access/gin/ginbulk.c:44 #, c-format msgid "posting list is too long" @@ -810,20 +997,20 @@ msgstr "記録リストãŒé•·ã™ãŽã¾ã™" #: access/gin/ginbulk.c:45 #, c-format -msgid "Reduce maintenance_work_mem." -msgstr "maintenance_work_mem ã‚’å°ã•ãã—ã¦ãã ã•ã„。" +msgid "Reduce \"maintenance_work_mem\"." +msgstr "\"maintenance_work_mem\" ã‚’å°ã•ãã—ã¦ãã ã•ã„。" -#: access/gin/ginfast.c:1036 +#: access/gin/ginfast.c:1041 #, c-format msgid "GIN pending list cannot be cleaned up during recovery." msgstr "GINä¿ç•™ãƒªã‚¹ãƒˆã¯ãƒªã‚«ãƒãƒªä¸­ã«ã¯å‡¦ç†ã§ãã¾ã›ã‚“。" -#: access/gin/ginfast.c:1043 +#: access/gin/ginfast.c:1048 #, c-format msgid "\"%s\" is not a GIN index" msgstr "\"%s\"ã¯GINインデックスã§ã¯ã‚りã¾ã›ã‚“" -#: access/gin/ginfast.c:1054 +#: access/gin/ginfast.c:1059 #, c-format msgid "cannot access temporary indexes of other sessions" msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚インデックスã«ã¯ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“" @@ -833,52 +1020,52 @@ msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚インデックスã«ã¯ã‚¢ã‚¯ã‚»ã‚¹ã§ã msgid "failed to re-find tuple within index \"%s\"" msgstr "インデックス\"%s\"内ã§è¡Œã®å†æ¤œç´¢ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: access/gin/ginscan.c:431 +#: access/gin/ginscan.c:436 #, c-format msgid "old GIN indexes do not support whole-index scans nor searches for nulls" msgstr "å¤ã„GINインデックスã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å…¨ä½“ã®ã‚¹ã‚­ãƒ£ãƒ³ã‚„nullã®æ¤œç´¢ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: access/gin/ginscan.c:432 +#: access/gin/ginscan.c:437 #, c-format msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "ã“れを修復ã™ã‚‹ã«ã¯ REINDEX INDEX \"%s\" ã‚’ãŠã“ãªã£ã¦ãã ã•ã„。" -#: access/gin/ginutil.c:146 executor/execExpr.c:2169 utils/adt/arrayfuncs.c:3996 utils/adt/arrayfuncs.c:6683 utils/adt/rowtypes.c:984 +#: access/gin/ginutil.c:147 executor/execExpr.c:2200 utils/adt/arrayfuncs.c:4016 utils/adt/arrayfuncs.c:6714 utils/adt/rowtypes.c:974 #, c-format msgid "could not identify a comparison function for type %s" msgstr "%såž‹ã®æ¯”較関数ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 +#: access/gin/ginvalidate.c:90 access/gist/gistvalidate.c:92 access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 #, c-format msgid "operator family \"%s\" of access method %s contains support function %s with different left and right input types" msgstr "アクセスメソッド %2$s ã®æ¼”ç®—å­æ—\"%1$s\"ãŒå·¦å³è¾ºã®å…¥åŠ›åž‹ãŒç•°ãªã‚‹ã‚µãƒãƒ¼ãƒˆé–¢æ•° %3$s ã‚’å«ã‚“ã§ã„ã¾ã™" -#: access/gin/ginvalidate.c:260 +#: access/gin/ginvalidate.c:258 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d or %d" msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­ã‚¯ãƒ©ã‚¹\"%1$s\"ã¯ã‚µãƒãƒ¼ãƒˆé–¢æ•°%3$dã¾ãŸã¯%4$dã‚’å«ã‚“ã§ã„ã¾ã›ã‚“" -#: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:350 access/spgist/spgvalidate.c:387 +#: access/gin/ginvalidate.c:331 access/gist/gistvalidate.c:349 access/spgist/spgvalidate.c:387 #, c-format msgid "support function number %d is invalid for access method %s" msgstr "サãƒãƒ¼ãƒˆé–¢æ•°ç•ªå·%dã¯ã‚¢ã‚¯ã‚»ã‚¹ãƒ¡ã‚½ãƒƒãƒ‰%sã«å¯¾ã—ã¦ä¸æ­£ã§ã™" -#: access/gist/gist.c:759 access/gist/gistvacuum.c:426 +#: access/gist/gist.c:760 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "インデックス\"%s\"内ã«ç„¡åйã¨åˆ¤æ–­ã•れã¦ã„る内部タプルãŒã‚りã¾ã™" -#: access/gist/gist.c:761 access/gist/gistvacuum.c:428 +#: access/gist/gist.c:762 access/gist/gistvacuum.c:428 #, c-format msgid "This is caused by an incomplete page split at crash recovery before upgrading to PostgreSQL 9.1." msgstr "ã“れã¯ã€PostgreSQL 9.1ã¸ã‚¢ãƒƒãƒ—グレードã™ã‚‹å‰ã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ãƒªã‚«ãƒãƒªã«ãŠã‘ã‚‹ä¸å®Œå…¨ãªãƒšãƒ¼ã‚¸åˆ†å‰²ãŒåŽŸå› ã§ç™ºç”Ÿã—ã¾ã™ã€‚" -#: access/gist/gist.c:762 access/gist/gistutil.c:801 access/gist/gistutil.c:812 access/gist/gistvacuum.c:429 access/hash/hashutil.c:227 access/hash/hashutil.c:238 access/hash/hashutil.c:250 access/hash/hashutil.c:271 access/nbtree/nbtpage.c:813 access/nbtree/nbtpage.c:824 +#: access/gist/gist.c:763 access/gist/gistutil.c:800 access/gist/gistutil.c:811 access/gist/gistvacuum.c:429 access/hash/hashutil.c:226 access/hash/hashutil.c:237 access/hash/hashutil.c:249 access/hash/hashutil.c:270 access/nbtree/nbtpage.c:813 access/nbtree/nbtpage.c:824 #, c-format msgid "Please REINDEX it." msgstr "REINDEXを行ã£ã¦ãã ã•ã„。" -#: access/gist/gist.c:1176 +#: access/gist/gist.c:1196 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "インデックス\"%s\"内ã®ä¸å®Œå…¨ãªåˆ†å‰²ã‚’修正ã—ã¾ã™ã€ãƒ–ロック%u" @@ -893,43 +1080,43 @@ msgstr "インデックス\"%2$s\"ã®åˆ—%1$dã«å¯¾ã™ã‚‹ãƒ”ックスプリット msgid "The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command." msgstr "ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¯æœ€é©ã§ã¯ã‚りã¾ã›ã‚“。最é©åŒ–ã™ã‚‹ãŸã‚ã«ã¯é–‹ç™ºè€…ã«é€£çµ¡ã™ã‚‹ã‹ã€ã“ã®åˆ—ã‚’CREATE INDEXコマンドã®2番目ã®åˆ—ã¨ã—ã¦ã¿ã¦ãã ã•ã„。" -#: access/gist/gistutil.c:798 access/hash/hashutil.c:224 access/nbtree/nbtpage.c:810 +#: access/gist/gistutil.c:797 access/hash/hashutil.c:223 access/nbtree/nbtpage.c:810 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "インデックス\"%s\"ã®ãƒ–ロック%uã«äºˆæœŸã—ã¦ã„ãªã„ゼロã§åŸ‹ã‚られãŸãƒšãƒ¼ã‚¸ãŒã‚りã¾ã™" -#: access/gist/gistutil.c:809 access/hash/hashutil.c:235 access/hash/hashutil.c:247 access/nbtree/nbtpage.c:821 +#: access/gist/gistutil.c:808 access/hash/hashutil.c:234 access/hash/hashutil.c:246 access/nbtree/nbtpage.c:821 #, c-format msgid "index \"%s\" contains corrupted page at block %u" msgstr "インデックス\"%s\"ã®ãƒ–ロック%uã«ç ´æã—ãŸãƒšãƒ¼ã‚¸ãŒã‚りã¾ã™" -#: access/gist/gistvalidate.c:203 +#: access/gist/gistvalidate.c:202 #, c-format msgid "operator family \"%s\" of access method %s contains unsupported ORDER BY specification for operator %s" msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­æ—\"%1$s\"ã¯æ¼”ç®—å­%3$sã«å¯¾ã™ã‚‹éžã‚µãƒãƒ¼ãƒˆã®ORDER BY指定をå«ã‚“ã§ã„ã¾ã™" -#: access/gist/gistvalidate.c:214 +#: access/gist/gistvalidate.c:213 #, c-format msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY opfamily specification for operator %s" msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­æ—\"%1$s\"ã¯æ¼”ç®—å­%3$sã«å¯¾ã™ã‚‹æ­£ã—ããªã„ORDER BYæ¼”ç®—å­æ—ã‚’å«ã‚“ã§ã„ã¾ã™" -#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:333 utils/adt/varchar.c:1009 utils/adt/varchar.c:1064 +#: access/hash/hashfunc.c:277 access/hash/hashfunc.c:333 utils/adt/varchar.c:1008 utils/adt/varchar.c:1065 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "文字列ã®ãƒãƒƒã‚·ãƒ¥å€¤è¨ˆç®—ã§ä½¿ç”¨ã™ã‚‹ç…§åˆé †åºã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/hash/hashfunc.c:280 access/hash/hashfunc.c:334 catalog/heap.c:668 catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 commands/indexcmds.c:2023 commands/tablecmds.c:17490 commands/view.c:86 regex/regc_pg_locale.c:243 utils/adt/formatting.c:1648 utils/adt/formatting.c:1770 utils/adt/formatting.c:1893 utils/adt/like.c:191 utils/adt/like_support.c:1025 utils/adt/varchar.c:739 utils/adt/varchar.c:1010 utils/adt/varchar.c:1065 -#: utils/adt/varlena.c:1518 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 catalog/heap.c:673 catalog/heap.c:679 commands/createas.c:201 commands/createas.c:508 commands/indexcmds.c:2021 commands/tablecmds.c:18211 commands/view.c:81 regex/regc_pg_locale.c:245 utils/adt/formatting.c:1653 utils/adt/formatting.c:1801 utils/adt/formatting.c:1991 utils/adt/like.c:189 utils/adt/like_support.c:1024 utils/adt/varchar.c:738 utils/adt/varchar.c:1009 utils/adt/varchar.c:1066 +#: utils/adt/varlena.c:1521 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "ç…§åˆé †åºã‚’明示ã™ã‚‹ã«ã¯ COLLATE å¥ã‚’使ã„ã¾ã™ã€‚" -#: access/hash/hashinsert.c:86 +#: access/hash/hashinsert.c:84 #, c-format msgid "index row size %zu exceeds hash maximum %zu" msgstr "インデックス行ã®ã‚µã‚¤ã‚º%zuãŒãƒãƒƒã‚·ãƒ¥ã§ã®æœ€å¤§å€¤%zuã‚’è¶…ãˆã¦ã„ã¾ã™" -#: access/hash/hashinsert.c:88 access/spgist/spgdoinsert.c:2006 access/spgist/spgdoinsert.c:2283 access/spgist/spgutils.c:1011 +#: access/hash/hashinsert.c:86 access/spgist/spgdoinsert.c:2005 access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1031 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "ãƒãƒƒãƒ•ァページよりも大ããªå€¤ã‚’インデックスã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" @@ -944,17 +1131,17 @@ msgstr "䏿­£ãªã‚ªãƒ¼ãƒãƒ¼ãƒ•ローブロック番å·%u" msgid "out of overflow pages in hash index \"%s\"" msgstr "ãƒãƒƒã‚·ãƒ¥ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\"%s\"ã®ä¸­ã®ã‚ªãƒ¼ãƒãƒ¼ãƒ•ローページãŒè¶³ã‚Šã¾ã›ã‚“" -#: access/hash/hashsearch.c:315 +#: access/hash/hashsearch.c:311 #, c-format msgid "hash indexes do not support whole-index scans" msgstr "ãƒãƒƒã‚·ãƒ¥ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å…¨ä½“ã®ã‚¹ã‚­ãƒ£ãƒ³ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: access/hash/hashutil.c:263 +#: access/hash/hashutil.c:262 #, c-format msgid "index \"%s\" is not a hash index" msgstr "インデックス\"%s\"ã¯ãƒãƒƒã‚·ãƒ¥ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã¯ã‚りã¾ã›ã‚“" -#: access/hash/hashutil.c:269 +#: access/hash/hashutil.c:268 #, c-format msgid "index \"%s\" has wrong hash version" msgstr "インデックス\"%s\"ã®ãƒãƒƒã‚·ãƒ¥ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒä¸æ­£ã§ã™" @@ -969,212 +1156,217 @@ msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­æ—\"%1$s\"ã¯æ¼”ç®—å­%3$s msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­æ—\"%1$s\"ã¯ç•°ãªã‚‹åž‹é–“ã«å¯¾å¿œã™ã‚‹æ¼”ç®—å­ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“" -#: access/heap/heapam.c:2026 +#: access/heap/heapam.c:2206 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "並列ワーカーã§ã¯ã‚¿ãƒ—ãƒ«ã®æŒ¿å…¥ã¯ã§ãã¾ã›ã‚“" -#: access/heap/heapam.c:2545 +#: access/heap/heapam.c:2725 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "並列処ç†ä¸­ã¯ã‚¿ãƒ—ルã®å‰Šé™¤ã¯ã§ãã¾ã›ã‚“" -#: access/heap/heapam.c:2592 +#: access/heap/heapam.c:2772 #, c-format msgid "attempted to delete invisible tuple" msgstr "ä¸å¯è¦–ã®ã‚¿ãƒ—ルを削除ã—よã†ã¨ã—ã¾ã—ãŸ" -#: access/heap/heapam.c:3035 access/heap/heapam.c:5902 +#: access/heap/heapam.c:3220 access/heap/heapam.c:6501 access/index/genam.c:818 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "並列処ç†ä¸­ã¯ã‚¿ãƒ—ãƒ«ã®æ›´æ–°ã¯ã§ãã¾ã›ã‚“" -#: access/heap/heapam.c:3163 +#: access/heap/heapam.c:3397 #, c-format msgid "attempted to update invisible tuple" msgstr "ä¸å¯è¦–ã®ã‚¿ãƒ—ルを更新ã—よã†ã¨ã—ã¾ã—ãŸ" -#: access/heap/heapam.c:4550 access/heap/heapam.c:4588 access/heap/heapam.c:4853 access/heap/heapam_handler.c:467 +#: access/heap/heapam.c:4908 access/heap/heapam.c:4946 access/heap/heapam.c:5211 access/heap/heapam_handler.c:468 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "リレーション\"%s\"ã®è¡Œãƒ­ãƒƒã‚¯ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/heap/heapam_handler.c:412 +#: access/heap/heapam.c:6314 commands/trigger.c:3340 executor/nodeModifyTable.c:2376 executor/nodeModifyTable.c:2467 +#, c-format +msgid "tuple to be updated was already modified by an operation triggered by the current command" +msgstr "更新対象ã®ã‚¿ãƒ—ルã¯ã™ã§ã«ç¾åœ¨ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã‚ˆã£ã¦èµ·å‹•ã•ã‚ŒãŸæ“作ã«ã‚ˆã£ã¦å¤‰æ›´ã•れã¦ã„ã¾ã™" + +#: access/heap/heapam_handler.c:413 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update" msgstr "ロック対象ã®ã‚¿ãƒ—ルã¯åŒæ™‚ã«è¡Œã‚ã‚ŒãŸæ›´æ–°ã«ã‚ˆã£ã¦ã™ã§ã«ä»–ã®å­ãƒ†ãƒ¼ãƒ–ルã«ç§»å‹•ã•れã¦ã„ã¾ã™" -#: access/heap/hio.c:517 access/heap/rewriteheap.c:659 +#: access/heap/hio.c:535 access/heap/rewriteheap.c:640 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "行ãŒå¤§ãã™ãŽã¾ã™: サイズã¯%zuã€ä¸Šé™ã¯%zu" -#: access/heap/rewriteheap.c:919 +#: access/heap/rewriteheap.c:885 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "ファイル\"%1$s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€%3$dãƒã‚¤ãƒˆä¸­%2$dãƒã‚¤ãƒˆæ›¸ãè¾¼ã¿ã¾ã—ãŸ: %m" -#: access/heap/rewriteheap.c:1011 access/heap/rewriteheap.c:1128 access/transam/timeline.c:329 access/transam/timeline.c:481 access/transam/xlog.c:2971 access/transam/xlog.c:3162 access/transam/xlog.c:3938 access/transam/xlog.c:8740 access/transam/xlogfuncs.c:702 backup/basebackup_server.c:151 backup/basebackup_server.c:244 commands/dbcommands.c:518 postmaster/postmaster.c:4554 postmaster/postmaster.c:5557 replication/logical/origin.c:603 replication/slot.c:1770 -#: storage/file/copydir.c:157 storage/smgr/md.c:232 utils/time/snapmgr.c:1263 +#: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 access/transam/timeline.c:329 access/transam/timeline.c:481 access/transam/xlog.c:3255 access/transam/xlog.c:3446 access/transam/xlog.c:4283 access/transam/xlog.c:9269 access/transam/xlogfuncs.c:692 backup/basebackup_server.c:149 backup/basebackup_server.c:242 commands/dbcommands.c:494 postmaster/launch_backend.c:340 postmaster/postmaster.c:4114 postmaster/walsummarizer.c:1212 +#: replication/logical/origin.c:603 replication/slot.c:2059 storage/file/copydir.c:157 storage/smgr/md.c:230 utils/time/snapmgr.c:1234 #, c-format msgid "could not create file \"%s\": %m" msgstr "ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/heap/rewriteheap.c:1138 +#: access/heap/rewriteheap.c:1104 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "ファイル\"%s\"ã‚’%uãƒã‚¤ãƒˆã«åˆ‡ã‚Šè©°ã‚られã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/heap/rewriteheap.c:1156 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:498 access/transam/xlog.c:3021 access/transam/xlog.c:3218 access/transam/xlog.c:3950 commands/dbcommands.c:530 postmaster/postmaster.c:4564 postmaster/postmaster.c:4574 replication/logical/origin.c:615 replication/logical/origin.c:657 replication/logical/origin.c:676 replication/logical/snapbuild.c:1767 replication/slot.c:1805 -#: storage/file/buffile.c:545 storage/file/copydir.c:197 utils/init/miscinit.c:1605 utils/init/miscinit.c:1616 utils/init/miscinit.c:1624 utils/misc/guc.c:4331 utils/misc/guc.c:4362 utils/misc/guc.c:5490 utils/misc/guc.c:5508 utils/time/snapmgr.c:1268 utils/time/snapmgr.c:1275 +#: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:498 access/transam/xlog.c:3305 access/transam/xlog.c:3502 access/transam/xlog.c:4295 commands/dbcommands.c:506 postmaster/launch_backend.c:351 postmaster/launch_backend.c:363 replication/logical/origin.c:615 replication/logical/origin.c:657 replication/logical/origin.c:676 replication/logical/snapbuild.c:1788 replication/slot.c:2094 +#: storage/file/buffile.c:545 storage/file/copydir.c:197 utils/init/miscinit.c:1655 utils/init/miscinit.c:1666 utils/init/miscinit.c:1674 utils/misc/guc.c:4491 utils/misc/guc.c:4522 utils/misc/guc.c:5675 utils/misc/guc.c:5693 utils/time/snapmgr.c:1239 utils/time/snapmgr.c:1246 #, c-format msgid "could not write to file \"%s\": %m" msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/heap/vacuumlazy.c:482 +#: access/heap/vacuumlazy.c:473 #, c-format msgid "aggressively vacuuming \"%s.%s.%s\"" msgstr "\"%s.%s.%s\"ã«å¯¾ã—ã¦ç©æ¥µçš„VACUUMを実行ã—ã¦ã„ã¾ã™" -#: access/heap/vacuumlazy.c:487 +#: access/heap/vacuumlazy.c:478 #, c-format msgid "vacuuming \"%s.%s.%s\"" msgstr "\"%s.%s.%s\"ã«å¯¾ã—ã¦VACUUMを実行ã—ã¦ã„ã¾ã™" -#: access/heap/vacuumlazy.c:635 +#: access/heap/vacuumlazy.c:626 #, c-format msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" msgstr "テーブル\"%s.%s.%s\"ã®VACUUM完了: インデックススキャン: %d\n" -#: access/heap/vacuumlazy.c:646 +#: access/heap/vacuumlazy.c:637 #, c-format msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "テーブル\"%s.%s.%s\"ã®å‘¨å›žé˜²æ­¢ã®ãŸã‚ã®ç©æ¥µçš„自動VACUUM: インデックススキャン: %d\n" -#: access/heap/vacuumlazy.c:648 +#: access/heap/vacuumlazy.c:639 #, c-format msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "テーブル\"%s.%s.%s\"ã®å‘¨å›žé˜²æ­¢ã®ãŸã‚ã®è‡ªå‹•VACUUM: インデックススキャン: %d\n" -#: access/heap/vacuumlazy.c:653 +#: access/heap/vacuumlazy.c:644 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "テーブル\"%s.%s.%s\"ã®ç©æ¥µçš„自動VACUUM: インデックススキャン: %d\n" -#: access/heap/vacuumlazy.c:655 +#: access/heap/vacuumlazy.c:646 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "テーブル\"%s.%s.%s\"ã®è‡ªå‹•VACUUM: インデックススキャン: %d\n" -#: access/heap/vacuumlazy.c:662 +#: access/heap/vacuumlazy.c:653 #, c-format msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" msgstr "ページ: %u削除ã€%u残存ã€%uスキャン (全体ã®%.2f%%)\n" -#: access/heap/vacuumlazy.c:669 +#: access/heap/vacuumlazy.c:660 #, c-format msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" msgstr "タプル: %lld削除ã€%lld残存ã€%lldãŒå‰Šé™¤ã•れã¦ã„ã‚‹ãŒã¾ã é™¤åŽ»ã§ããªã„\n" -#: access/heap/vacuumlazy.c:675 +#: access/heap/vacuumlazy.c:666 #, c-format msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" msgstr "未処ç†ã®ã‚¿ãƒ—ル: クリーンナップロックã®ç«¶åˆã«ã‚ˆã‚Šã€%2$uページ中ã®%1$lld行ã®å‰Šé™¤æ¸ˆã¿ã‚¿ãƒ—ルã¯é™¤åŽ»ã•れã¾ã›ã‚“\n" -#: access/heap/vacuumlazy.c:681 +#: access/heap/vacuumlazy.c:672 #, c-format msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" msgstr "削除å¯èƒ½é™ç•Œ: %uã€ã“れã¯å‡¦ç†å®Œäº†æ™‚ã«ã¯%d XID分éŽåŽ»ã«ãªã‚Šã¾ã™\n" -#: access/heap/vacuumlazy.c:688 +#: access/heap/vacuumlazy.c:679 #, c-format msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" msgstr "æ–°ã—ã„relfrozenxid: %uã€ã“れã¯å‰å›žã®å€¤ã‚ˆã‚Šã‚‚%d XID分進んã§ã„ã¾ã™\n" -#: access/heap/vacuumlazy.c:696 +#: access/heap/vacuumlazy.c:687 #, c-format msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" msgstr "" "æ–°ã—ã„relminmxid: %uã€ã“れã¯å‰å›žã®å€¤ã‚ˆã‚Šã‚‚%d MXID分進んã§ã„ã¾ã™\n" "\n" -#: access/heap/vacuumlazy.c:699 +#: access/heap/vacuumlazy.c:690 #, c-format msgid "frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n" msgstr "å‡çµ: テーブルã‹ã‚‰%uページ(全体ã®%.2f%%)ã§%lldタプルãŒå‡çµã•れã¾ã—ãŸ\n" -#: access/heap/vacuumlazy.c:707 +#: access/heap/vacuumlazy.c:698 msgid "index scan not needed: " msgstr "インデックススキャンã¯ä¸è¦ã§ã™: " -#: access/heap/vacuumlazy.c:709 +#: access/heap/vacuumlazy.c:700 msgid "index scan needed: " msgstr "インデックススキャンãŒå¿…è¦ã§ã™: " -#: access/heap/vacuumlazy.c:711 +#: access/heap/vacuumlazy.c:702 #, c-format msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" msgstr "テーブル内ã®%uページ(全体ã®%.2f%%)ã«ã‚ã£ãŸ%lld行ã®å‰Šé™¤è¡Œè­˜åˆ¥å­ãŒå‰Šé™¤ã•れã¾ã—ãŸ\n" -#: access/heap/vacuumlazy.c:716 +#: access/heap/vacuumlazy.c:707 msgid "index scan bypassed: " msgstr "インデックススキャンã¯ã‚¹ã‚­ãƒƒãƒ—ã•れã¾ã—ãŸ: " -#: access/heap/vacuumlazy.c:718 +#: access/heap/vacuumlazy.c:709 msgid "index scan bypassed by failsafe: " msgstr "フェイルセーフã«ã‚ˆã‚Šã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚¹ã‚­ãƒ£ãƒ³ãŒã‚¹ã‚­ãƒƒãƒ—ã•れã¾ã—ãŸ: " -#: access/heap/vacuumlazy.c:720 +#: access/heap/vacuumlazy.c:711 #, c-format msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" msgstr "テーブル内ã®%uページ(全体ã®%.2f%%)ã«ã¯%lld行ã®å‰Šé™¤è¡Œè­˜åˆ¥å­ãŒã‚りã¾ã™\n" -#: access/heap/vacuumlazy.c:735 +#: access/heap/vacuumlazy.c:726 #, c-format msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" msgstr "インデックス\"%s\": ページ数: åˆè¨ˆ%uã€æ–°è¦å‰Šé™¤%uã€å‰Šé™¤æ¸ˆ%uã€å†åˆ©ç”¨å¯%u\n" -#: access/heap/vacuumlazy.c:747 commands/analyze.c:795 +#: access/heap/vacuumlazy.c:738 commands/analyze.c:794 #, c-format msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" msgstr "I/O時間: 読ã¿è¾¼ã¿: %.3fミリ秒, 書ãè¾¼ã¿: %.3fミリ秒\n" -#: access/heap/vacuumlazy.c:757 commands/analyze.c:798 +#: access/heap/vacuumlazy.c:748 commands/analyze.c:797 #, c-format msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" msgstr "å¹³å‡èª­ã¿è¾¼ã¿é€Ÿåº¦: %.3f MB/s, 平凿›¸ãè¾¼ã¿é€Ÿåº¦: %.3f MB/s\n" -#: access/heap/vacuumlazy.c:760 commands/analyze.c:800 +#: access/heap/vacuumlazy.c:751 commands/analyze.c:799 #, c-format msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" msgstr "ãƒãƒƒãƒ•ァ使用: %lldヒット, %lld失敗, %lld ダーティ化\n" -#: access/heap/vacuumlazy.c:765 +#: access/heap/vacuumlazy.c:756 #, c-format msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" msgstr "WAL使用é‡: %lldã®ãƒ¬ã‚³ãƒ¼ãƒ‰, %lldã®å…¨ãƒšãƒ¼ã‚¸ã‚¤ãƒ¡ãƒ¼ã‚¸, %lluãƒã‚¤ãƒˆ\n" -#: access/heap/vacuumlazy.c:769 commands/analyze.c:804 +#: access/heap/vacuumlazy.c:760 commands/analyze.c:803 #, c-format msgid "system usage: %s" msgstr "システム使用状æ³: %s" -#: access/heap/vacuumlazy.c:2482 +#: access/heap/vacuumlazy.c:2173 #, c-format msgid "table \"%s\": removed %lld dead item identifiers in %u pages" msgstr "テーブル\"%1$s\": %3$uページ内ã®%2$lldã®å‰Šé™¤æ¸ˆã¿è¡Œè­˜åˆ¥å­ã‚’除去" -#: access/heap/vacuumlazy.c:2642 +#: access/heap/vacuumlazy.c:2327 #, c-format msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" msgstr "%4$d回ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚¹ã‚­ãƒ£ãƒ³ã®ã®ã¡ã€ãƒ•ェイルセーフã¨ã—ã¦ãƒ†ãƒ¼ãƒ–ル\"%1$s.%2$s.%3$s\"ã®å¿…é ˆã§ã¯ãªã„メンテナンスをスキップã—ã¾ã™" -#: access/heap/vacuumlazy.c:2645 +#: access/heap/vacuumlazy.c:2330 #, c-format msgid "The table's relfrozenxid or relminmxid is too far in the past." msgstr "ã“ã®ãƒ†ãƒ¼ãƒ–ルã®relfrozenxidã¾ãŸã¯relminmxidã¯å¤ã™ãŽã¾ã™ã€‚" -#: access/heap/vacuumlazy.c:2646 +#: access/heap/vacuumlazy.c:2331 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1183,67 +1375,67 @@ msgstr "" "設定パラメータ\"maintenance_work_mem\"ã¾ãŸã¯\"autovacuum_work_mem\"を増やã™ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。\n" "VACUUMãŒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDã®å‰²ã‚Šå½“ã¦ã«è¿½å¾“ã§ãるよã†ã«ã™ã‚‹ä»–ã®æ–¹æ³•を検討ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: access/heap/vacuumlazy.c:2891 +#: access/heap/vacuumlazy.c:2593 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\":ç«¶åˆã™ã‚‹ãƒ­ãƒƒã‚¯ãŒå­˜åœ¨ã™ã‚‹ãŸã‚切り詰ã‚を中断ã—ã¾ã™" -#: access/heap/vacuumlazy.c:2961 +#: access/heap/vacuumlazy.c:2663 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "テーブル\"%s\": %uページã‹ã‚‰%uページã«åˆ‡ã‚Šè©°ã‚" -#: access/heap/vacuumlazy.c:3023 +#: access/heap/vacuumlazy.c:2725 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "テーブル\"%s\": ç«¶åˆã™ã‚‹ãƒ­ãƒƒã‚¯è¦æ±‚ãŒå­˜åœ¨ã™ã‚‹ãŸã‚ã€åˆ‡ã‚Šè©°ã‚ã‚’ä¿ç•™ã—ã¾ã™" -#: access/heap/vacuumlazy.c:3183 +#: access/heap/vacuumlazy.c:2844 #, c-format msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" msgstr "\"%s\"ã®VACUUMã«å¯¾ã™ã‚‹ãƒ‘ラレルオプションを無効化ã—ã¾ã™ --- 一時テーブルã¯ä¸¦åˆ—ã«VACUUMã§ãã¾ã›ã‚“" -#: access/heap/vacuumlazy.c:3399 +#: access/heap/vacuumlazy.c:3111 #, c-format msgid "while scanning block %u offset %u of relation \"%s.%s\"" msgstr "リレーション\"%3$s.%4$s\"ã®ãƒ–ロック%1$uã€ã‚ªãƒ•セット%2$uã®ã‚¹ã‚­ãƒ£ãƒ³ä¸­" -#: access/heap/vacuumlazy.c:3402 +#: access/heap/vacuumlazy.c:3114 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "リレーション\\\"%2$s.%3$s\\\"ã®ãƒ–ロック%1$uã®ã‚¹ã‚­ãƒ£ãƒ³ä¸­" -#: access/heap/vacuumlazy.c:3406 +#: access/heap/vacuumlazy.c:3118 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "リレーション\"%s.%s\"ã®ã‚¹ã‚­ãƒ£ãƒ³ä¸­" -#: access/heap/vacuumlazy.c:3414 +#: access/heap/vacuumlazy.c:3126 #, c-format msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" msgstr "リレーション\"%3$s.%4$s\"ã®ãƒ–ロック%1$uã€ã‚ªãƒ•セット%2$uã®VACUUM処ç†ä¸­" -#: access/heap/vacuumlazy.c:3417 +#: access/heap/vacuumlazy.c:3129 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "リレーション\\\"%2$s.%3$s\\\"ã®ãƒ–ロック%1$uã®VACUUM処ç†ä¸­" -#: access/heap/vacuumlazy.c:3421 +#: access/heap/vacuumlazy.c:3133 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "リレーション\"%s.%s\"ã®VACUUM処ç†ä¸­" -#: access/heap/vacuumlazy.c:3426 commands/vacuumparallel.c:1074 +#: access/heap/vacuumlazy.c:3138 commands/vacuumparallel.c:1112 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "リレーション\\\"%2$s.%3$s\\\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹%1$sã®VACUUM処ç†ä¸­" -#: access/heap/vacuumlazy.c:3431 commands/vacuumparallel.c:1080 +#: access/heap/vacuumlazy.c:3143 commands/vacuumparallel.c:1118 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "リレーション\\\"%2$s.%3$s\\\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹%1$sã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—処ç†ä¸­" -#: access/heap/vacuumlazy.c:3437 +#: access/heap/vacuumlazy.c:3149 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "リレーション \"%s.%s\"ã‚’%uブロックã«åˆ‡ã‚Šè©°ã‚中" @@ -1258,17 +1450,22 @@ msgstr "アクセスメソッド\"%s\"ã®ã‚¿ã‚¤ãƒ—ãŒ%sã§ã¯ã‚りã¾ã›ã‚“" msgid "index access method \"%s\" does not have a handler" msgstr "インデックスアクセスメソッド\"%s\"ã¯ãƒãƒ³ãƒ‰ãƒ©ã‚’æŒã£ã¦ã„ã¾ã›ã‚“" -#: access/index/genam.c:490 +#: access/index/genam.c:489 #, c-format msgid "transaction aborted during system catalog scan" msgstr "システムカタログã®ã‚¹ã‚­ãƒ£ãƒ³ä¸­ã«ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒã‚¢ãƒœãƒ¼ãƒˆã—ã¾ã—ãŸ" -#: access/index/indexam.c:142 catalog/objectaddress.c:1394 commands/indexcmds.c:2852 commands/tablecmds.c:272 commands/tablecmds.c:296 commands/tablecmds.c:17191 commands/tablecmds.c:18959 +#: access/index/genam.c:657 access/index/indexam.c:82 +#, c-format +msgid "cannot access index \"%s\" while it is being reindexed" +msgstr "å†ä½œæˆä¸­ã§ã‚ã‚‹ãŸã‚インデックス\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“" + +#: access/index/indexam.c:203 catalog/objectaddress.c:1356 commands/indexcmds.c:2851 commands/tablecmds.c:281 commands/tablecmds.c:305 commands/tablecmds.c:17906 commands/tablecmds.c:19795 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\"ã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã¯ã‚りã¾ã›ã‚“" -#: access/index/indexam.c:979 +#: access/index/indexam.c:1028 #, c-format msgid "operator class %s has no options" msgstr "演算å­ã‚¯ãƒ©ã‚¹%sã«ã¯ã‚ªãƒ—ションã¯ã‚りã¾ã›ã‚“" @@ -1288,7 +1485,7 @@ msgstr "キー %s ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€‚" msgid "This may be because of a non-immutable index expression." msgstr "ã“れã¯ä¸å¤‰ã§ãªã„インデックスå¼ãŒåŽŸå› ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™" -#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 parser/parse_utilcmd.c:2317 +#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 parser/parse_utilcmd.c:2323 #, c-format msgid "index \"%s\" is not a btree" msgstr "インデックス\"%s\"ã¯btreeã§ã¯ã‚りã¾ã›ã‚“" @@ -1298,27 +1495,27 @@ msgstr "インデックス\"%s\"ã¯btreeã§ã¯ã‚りã¾ã›ã‚“" msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" msgstr "インデックス\"%s\"ã«ãŠã‘ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸æ•´åˆ: ファイルãƒãƒ¼ã‚¸ãƒ§ãƒ³ %dã€ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %dã€ã‚µãƒãƒ¼ãƒˆã•れる最å°ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %d" -#: access/nbtree/nbtpage.c:1866 +#: access/nbtree/nbtpage.c:1861 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "インデックス\"%s\"ã«å‰Šé™¤å‡¦ç†ä¸­ã®å†…部ページãŒã‚りã¾ã™" -#: access/nbtree/nbtpage.c:1868 +#: access/nbtree/nbtpage.c:1863 #, c-format msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." msgstr "ã“れã¯9.3ã‹ãれ以å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã€ã‚¢ãƒƒãƒ—グレードå‰ã«VACUUMãŒä¸­æ–­ã•れãŸéš›ã«èµ·ããŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚REINDEXã—ã¦ãã ã•ã„。" -#: access/nbtree/nbtutils.c:2662 +#: access/nbtree/nbtutils.c:5108 #, c-format msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" msgstr "インデックス行サイズ%1$zuã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\"%4$s\"ã§ã®btreeãƒãƒ¼ã‚¸ãƒ§ãƒ³ %2$u ã®æœ€å¤§å€¤%3$zuã‚’è¶…ãˆã¦ã„ã¾ã™" -#: access/nbtree/nbtutils.c:2668 +#: access/nbtree/nbtutils.c:5114 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "インデックス行ã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%3$s\"ã®ã‚¿ãƒ—ル(%1$u,%2$u)ã‚’å‚ç…§ã—ã¦ã„ã¾ã™ã€‚" -#: access/nbtree/nbtutils.c:2672 +#: access/nbtree/nbtutils.c:5118 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1332,12 +1529,17 @@ msgstr "" msgid "operator family \"%s\" of access method %s is missing support function for types %s and %s" msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­æ—\"%1$s\"ã¯åž‹%3$sã¨%4$sã«å¯¾å¿œã™ã‚‹ã‚µãƒãƒ¼ãƒˆé–¢æ•°ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“" +#: access/sequence/sequence.c:75 access/table/table.c:145 optimizer/util/plancat.c:144 +#, c-format +msgid "cannot open relation \"%s\"" +msgstr "リレーション\"%s\"ã¯openã§ãã¾ã›ã‚“" + #: access/spgist/spgutils.c:245 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "リーフ型ãŒå…¥åŠ›åž‹ã¨ç•°ãªã‚‹å ´åˆã¯åœ§ç¸®ãƒ¡ã‚½ãƒƒãƒ‰ã®å®šç¾©ãŒå¿…è¦ã§ã™" -#: access/spgist/spgutils.c:1008 +#: access/spgist/spgutils.c:1028 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "SP-GiST内部タプルã®ã‚µã‚¤ã‚º%zuãŒæœ€å¤§å€¤%zuã‚’è¶…ãˆã¦ã„ã¾ã™" @@ -1352,67 +1554,62 @@ msgstr "SP-GiSTã®ãƒªãƒ¼ãƒ•データ型%sã¯å®£è¨€ã•れãŸåž‹%sã¨ä¸€è‡´ã—ã¾ msgid "operator family \"%s\" of access method %s is missing support function %d for type %s" msgstr "アクセスメソッド\"%2$s\"ã®æ¼”ç®—å­æ—\"%1$s\"ã¯%4$såž‹ã«å¯¾ã™ã‚‹ã‚µãƒãƒ¼ãƒˆé–¢æ•°%3$dã‚’å«ã‚“ã§ã„ã¾ã›ã‚“" -#: access/table/table.c:145 optimizer/util/plancat.c:145 -#, c-format -msgid "cannot open relation \"%s\"" -msgstr "リレーション\"%s\"ã¯openã§ãã¾ã›ã‚“" - -#: access/table/tableam.c:265 +#: access/table/tableam.c:256 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "tid (%u, %u) ã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã«å¯¾ã—ã¦å¦¥å½“ã§ã¯ã‚りã¾ã›ã‚“" -#: access/table/tableamapi.c:116 +#: access/table/tableamapi.c:109 #, c-format -msgid "%s cannot be empty." -msgstr "%sã¯ç©ºã«ã¯ã§ãã¾ã›ã‚“。" +msgid "\"%s\" cannot be empty." +msgstr "\"%s\"ã¯ç©ºã«ã¯ã§ãã¾ã›ã‚“。" -#: access/table/tableamapi.c:123 access/transam/xlogrecovery.c:4774 +#: access/table/tableamapi.c:116 access/transam/xlogrecovery.c:4859 #, c-format -msgid "%s is too long (maximum %d characters)." -msgstr "%s ãŒé•·éŽãŽã¾ã™ï¼ˆæœ€å¤§%d文字)。" +msgid "\"%s\" is too long (maximum %d characters)." +msgstr "\"%s\"ãŒé•·éŽãŽã¾ã™ï¼ˆæœ€å¤§%d文字)。" -#: access/table/tableamapi.c:146 +#: access/table/tableamapi.c:139 #, c-format msgid "table access method \"%s\" does not exist" msgstr "テーブルアクセスメソッド\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: access/table/tableamapi.c:151 +#: access/table/tableamapi.c:144 #, c-format msgid "Table access method \"%s\" does not exist." msgstr "テーブルアクセスメソッド\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“。" -#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:152 +#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:151 #, c-format msgid "sample percentage must be between 0 and 100" msgstr "サンプリングã®å‰²åˆã¯0ã¨100ã®é–“ã§ã™" -#: access/transam/commit_ts.c:279 +#: access/transam/commit_ts.c:287 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "トランザクション%uã®ã‚³ãƒŸãƒƒãƒˆã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã¯å–å¾—ã§ãã¾ã›ã‚“" -#: access/transam/commit_ts.c:377 +#: access/transam/commit_ts.c:385 #, c-format msgid "could not get commit timestamp data" msgstr "コミットタイムスタンプ情報をå–å¾—ã§ãã¾ã›ã‚“" -#: access/transam/commit_ts.c:379 +#: access/transam/commit_ts.c:387 #, c-format msgid "Make sure the configuration parameter \"%s\" is set on the primary server." msgstr "プライマリサーãƒãƒ¼ã§è¨­å®šãƒ‘ラメータ\"%s\"ãŒonã«è¨­å®šã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。" -#: access/transam/commit_ts.c:381 +#: access/transam/commit_ts.c:389 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "設定パラメータ\"%s\"ãŒè¨­å®šã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。" -#: access/transam/multixact.c:1023 +#: access/transam/multixact.c:1091 #, c-format -msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"" -msgstr "データベース\"%s\"ã«ãŠã‘ã‚‹MultiXactIds周回ã«ã‚ˆã‚‹ãƒ‡ãƒ¼ã‚¿æå¤±ã‚’防ããŸã‚ã«ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯æ–°ã—ãMultiXactIdsを生æˆã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’å—ã‘付ã‘ã¾ã›ã‚“" +msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database \"%s\"" +msgstr "データベース\"%s\"ã¯MultiXactIds周回ã«ã‚ˆã‚‹ãƒ‡ãƒ¼ã‚¿æå¤±ã‚’防ããŸã‚ã«ã€æ–°è¦ã®MultiXactIdsを割り当ã¦ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’å—ã‘付ã‘ã¦ã„ã¾ã›ã‚“" -#: access/transam/multixact.c:1025 access/transam/multixact.c:1032 access/transam/multixact.c:1056 access/transam/multixact.c:1065 +#: access/transam/multixact.c:1093 access/transam/multixact.c:1100 access/transam/multixact.c:1124 access/transam/multixact.c:1133 access/transam/varsup.c:158 access/transam/varsup.c:165 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" @@ -1421,234 +1618,239 @@ msgstr "" "ãã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å…¨ä½“ã® VACUUM を実行ã—ã¦ãã ã•ã„。\n" "å¤ã„準備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚³ãƒŸãƒƒãƒˆã¾ãŸã¯ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ã€ã‚‚ã—ãã¯å¤ã„レプリケーションスロットã®å‰Šé™¤ã‚‚å¿…è¦ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: access/transam/multixact.c:1030 +#: access/transam/multixact.c:1098 #, c-format -msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u" -msgstr "OID %u ã‚’æŒã¤ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯å‘¨å›žã«ã‚ˆã‚‹ãƒ‡ãƒ¼ã‚¿æå¤±ã‚’防ããŸã‚ã«ã€æ–°ã—ã„MultiXactIdsを生æˆã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’å—ã‘付ã‘ãªã„状態ã«ãªã£ã¦ã„ã¾ã™" +msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database with OID %u" +msgstr "OID %u ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯å‘¨å›žã«ã‚ˆã‚‹ãƒ‡ãƒ¼ã‚¿æå¤±ã‚’防ããŸã‚ã«ã€æ–°è¦ã®MultiXactIdsを割り当ã¦ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’å—ã‘付ã‘ã¦ã„ã¾ã›ã‚“" -#: access/transam/multixact.c:1051 access/transam/multixact.c:2333 +#: access/transam/multixact.c:1119 access/transam/multixact.c:2474 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" msgstr[0] "データベース\"%s\"ã¯ã‚ã¨%u個ã®MultiXactIdãŒä½¿ã‚れるå‰ã«VACUUMã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: access/transam/multixact.c:1060 access/transam/multixact.c:2342 +#: access/transam/multixact.c:1128 access/transam/multixact.c:2483 #, c-format msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" msgstr[0] "OID %u ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯ã‚ã¨%u個ã®MultiXactIdãŒä½¿ã‚れるå‰ã«VACUUMã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: access/transam/multixact.c:1121 +#: access/transam/multixact.c:1189 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "マルãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®\"メンãƒ\"ãŒåˆ¶é™ã‚’è¶…ãˆã¾ã—ãŸ" -#: access/transam/multixact.c:1122 +#: access/transam/multixact.c:1190 #, c-format msgid "This command would create a multixact with %u members, but the remaining space is only enough for %u member." msgid_plural "This command would create a multixact with %u members, but the remaining space is only enough for %u members." msgstr[0] "ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã§%u個ã®ãƒ¡ãƒ³ãƒã‚’æŒã¤ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒç”Ÿæˆã•れã¾ã™ãŒã€æ®‹ã‚Šã®ã‚¹ãƒšãƒ¼ã‚¹ã¯ %u 個ã®ãƒ¡ãƒ³ãƒåˆ†ã—ã‹ã‚りã¾ã›ã‚“。" -#: access/transam/multixact.c:1127 +#: access/transam/multixact.c:1195 #, c-format -msgid "Execute a database-wide VACUUM in database with OID %u with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." -msgstr "vacuum_multixact_freeze_min_age 㨠vacuum_multixact_freeze_table_age をよりå°ã•ãªå€¤ã«è¨­å®šã—ã¦OID %u ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å…¨ä½“ã«VACUUMを実行ã—ã¦ãã ã•ã„。" +msgid "Execute a database-wide VACUUM in database with OID %u with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." +msgstr "\"vacuum_multixact_freeze_min_age\"ã¨\"vacuum_multixact_freeze_table_age\"をよりå°ã•ãªå€¤ã«è¨­å®šã—ã¦OID %u ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å…¨ä½“ã«VACUUMを実行ã—ã¦ãã ã•ã„。" -#: access/transam/multixact.c:1158 +#: access/transam/multixact.c:1226 #, c-format msgid "database with OID %u must be vacuumed before %d more multixact member is used" msgid_plural "database with OID %u must be vacuumed before %d more multixact members are used" msgstr[0] "OID %u ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯æ›´ã«%d個ã®ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãƒ¡ãƒ³ãƒãŒä½¿ç”¨ã•れるå‰ã«VACUUMを実行ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: access/transam/multixact.c:1163 +#: access/transam/multixact.c:1231 #, c-format -msgid "Execute a database-wide VACUUM in that database with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." -msgstr "vacuum_multixact_freeze_min_age 㨠vacuum_multixact_freeze_table_age をよりå°ã•ãªå€¤ã«è¨­å®šã—ãŸä¸Šã§ã€ãã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§VACUUMを実行ã—ã¦ãã ã•ã„。" +msgid "Execute a database-wide VACUUM in that database with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." +msgstr "\"vacuum_multixact_freeze_min_age\"'ã¨\"vacuum_multixact_freeze_table_age\"をよりå°ã•ãªå€¤ã«è¨­å®šã—ãŸä¸Šã§ã€ãã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§VACUUMを実行ã—ã¦ãã ã•ã„。" -#: access/transam/multixact.c:1302 +#: access/transam/multixact.c:1371 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %uã¯ã‚‚ã†å­˜åœ¨ã—ã¾ã›ã‚“: 周回ã—ã¦ã„るよã†ã§ã™" -#: access/transam/multixact.c:1308 +#: access/transam/multixact.c:1377 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %uを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: 周回ã—ã¦ã„る様å­" -#: access/transam/multixact.c:2338 access/transam/multixact.c:2347 access/transam/varsup.c:151 access/transam/varsup.c:158 access/transam/varsup.c:466 access/transam/varsup.c:473 +#: access/transam/multixact.c:2479 access/transam/multixact.c:2488 #, c-format msgid "" -"To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" +"To avoid MultiXactId assignment failures, execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." msgstr "" -"データベースã®åœæ­¢ã‚’防ããŸã‚ã«ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å…¨ä½“ã® VACUUM を実行ã—ã¦ãã ã•ã„。\n" +"MultiXactIdã®å‰²ã‚Šå½“ã¦å¤±æ•—を防ããŸã‚ã«ã€ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å…¨ä½“ã«å¯¾ã™ã‚‹VACUUMを実行ã—ã¦ãã ã•ã„。\n" "å¤ã„準備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚³ãƒŸãƒƒãƒˆã¾ãŸã¯ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ã€ã‚‚ã—ãã¯å¤ã„レプリケーションスロットã®å‰Šé™¤ã‚‚å¿…è¦ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: access/transam/multixact.c:2622 +#: access/transam/multixact.c:2767 #, c-format msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" msgstr "最å¤ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆæ¸ˆã¿ã®ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%uãŒãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã«å­˜åœ¨ã—ãªã„ãŸã‚ã€ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãƒ¡ãƒ³ãƒãƒ¼ã®å‘¨å›žé˜²æ­¢æ©Ÿèƒ½ã‚’無効ã«ã—ã¾ã—ãŸ" -#: access/transam/multixact.c:2644 +#: access/transam/multixact.c:2789 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "マルãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãƒ¡ãƒ³ãƒãƒ¼ã®å‘¨å›žé˜²æ­¢æ©Ÿèƒ½ãŒæœ‰åйã«ãªã‚Šã¾ã—ãŸ" -#: access/transam/multixact.c:3027 +#: access/transam/multixact.c:3180 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "最å¤ã®ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%uãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãªæœ€å¤ã®ã‚‚ã®ã¯%uã€åˆ‡ã‚Šè©°ã‚をスキップã—ã¾ã™" -#: access/transam/multixact.c:3045 +#: access/transam/multixact.c:3198 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" msgstr "マルãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%uãŒãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã«å­˜åœ¨ã—ãªã„ãŸã‚ã€ãã“ã¾ã§ã®åˆ‡ã‚Šè©°ã‚ãŒã§ãã¾ã›ã‚“ã€åˆ‡ã‚Šè©°ã‚をスキップã—ã¾ã™" -#: access/transam/multixact.c:3359 +#: access/transam/multixact.c:3517 #, c-format msgid "invalid MultiXactId: %u" msgstr "䏿­£ãªMultiXactId: %u" -#: access/transam/parallel.c:729 access/transam/parallel.c:848 +#: access/transam/parallel.c:748 access/transam/parallel.c:867 #, c-format msgid "parallel worker failed to initialize" msgstr "パラレルワーカーã®åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: access/transam/parallel.c:730 access/transam/parallel.c:849 +#: access/transam/parallel.c:749 access/transam/parallel.c:868 #, c-format msgid "More details may be available in the server log." msgstr "è©³ç´°ãªæƒ…å ±ãŒã‚µãƒ¼ãƒãƒ¼ãƒ­ã‚°ã«ã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: access/transam/parallel.c:910 +#: access/transam/parallel.c:929 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "並列処ç†ä¸­ã«postmasterãŒçµ‚了ã—ã¾ã—ãŸ" -#: access/transam/parallel.c:1097 +#: access/transam/parallel.c:1116 #, c-format msgid "lost connection to parallel worker" msgstr "パラレルワーカーã¸ã®æŽ¥ç¶šã‚’失ã„ã¾ã—ãŸ" -#: access/transam/parallel.c:1163 access/transam/parallel.c:1165 +#: access/transam/parallel.c:1172 access/transam/parallel.c:1174 msgid "parallel worker" msgstr "パラレルワーカー" -#: access/transam/parallel.c:1319 +#: access/transam/parallel.c:1344 replication/logical/applyparallelworker.c:890 #, c-format msgid "could not map dynamic shared memory segment" msgstr "動的共有メモリセグメントをマップã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/parallel.c:1324 +#: access/transam/parallel.c:1349 replication/logical/applyparallelworker.c:896 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "動的共有メモリセグメントã®ãƒžã‚¸ãƒƒã‚¯ãƒŠãƒ³ãƒãƒ¼ãŒä¸æ­£ã§ã™" -#: access/transam/rmgr.c:84 +#: access/transam/rmgr.c:93 #, c-format msgid "resource manager with ID %d not registered" msgstr "ID %dã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“" -#: access/transam/rmgr.c:85 +#: access/transam/rmgr.c:94 #, c-format -msgid "Include the extension module that implements this resource manager in shared_preload_libraries." -msgstr "ã“ã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ã‚’実装ã™ã‚‹æ‹¡å¼µãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’shared_preload_librariesã«åŠ ãˆã¦ãã ã•ã„。" +msgid "Include the extension module that implements this resource manager in \"shared_preload_libraries\"." +msgstr "ã“ã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ã‚’実装ã™ã‚‹æ‹¡å¼µãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’\"shared_preload_libraries\"ã«åŠ ãˆã¦ãã ã•ã„。" -#: access/transam/rmgr.c:101 +#: access/transam/rmgr.c:110 #, c-format msgid "custom resource manager name is invalid" msgstr "独自リソースマãƒãƒ¼ã‚¸ãƒ£ã®åå‰ãŒä¸æ­£ã§ã™" -#: access/transam/rmgr.c:102 +#: access/transam/rmgr.c:111 #, c-format msgid "Provide a non-empty name for the custom resource manager." msgstr "独自リソースマãƒãƒ¼ã‚¸ãƒ£åã«ã¯ç©ºã§ã¯ãªã„文字列を設定ã—ã¦ãã ã•ã„。" -#: access/transam/rmgr.c:105 +#: access/transam/rmgr.c:114 #, c-format msgid "custom resource manager ID %d is out of range" msgstr "独自リソースマãƒãƒ¼ã‚¸ãƒ£ã®ID %dã¯ç¯„囲外ã§ã™" -#: access/transam/rmgr.c:106 +#: access/transam/rmgr.c:115 #, c-format msgid "Provide a custom resource manager ID between %d and %d." msgstr "独自リソースマãƒãƒ¼ã‚¸ãƒ£IDã¯%dã‹ã‚‰%dã®é–“ã®å€¤ã§æŒ‡å®šã—ã¦ãã ã•ã„。" -#: access/transam/rmgr.c:111 access/transam/rmgr.c:116 access/transam/rmgr.c:128 +#: access/transam/rmgr.c:120 access/transam/rmgr.c:125 access/transam/rmgr.c:137 #, c-format msgid "failed to register custom resource manager \"%s\" with ID %d" msgstr "独自リソースマãƒãƒ¼ã‚¸ãƒ£\"%s\"ã®ID %dã§ã®ç™»éŒ²ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: access/transam/rmgr.c:112 +#: access/transam/rmgr.c:121 #, c-format -msgid "Custom resource manager must be registered while initializing modules in shared_preload_libraries." -msgstr "独自リソースマãƒãƒ¼ã‚¸ãƒ£ã¯shared_preload_librariesã«ã‚るモジュールã®åˆæœŸåŒ–中ã«ç™»éŒ²ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" +msgid "Custom resource manager must be registered while initializing modules in \"shared_preload_libraries\"." +msgstr "独自リソースマãƒãƒ¼ã‚¸ãƒ£ã¯\"shared_preload_libraries\"ã«ã‚るモジュールã®åˆæœŸåŒ–中ã«ç™»éŒ²ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: access/transam/rmgr.c:117 +#: access/transam/rmgr.c:126 #, c-format msgid "Custom resource manager \"%s\" already registered with the same ID." msgstr "独自リソースマãƒãƒ¼ã‚¸ãƒ£\"%s\"ã¯ã™ã§ã«åŒä¸€ã®IDã§ç™»éŒ²ã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/rmgr.c:129 +#: access/transam/rmgr.c:138 #, c-format msgid "Existing resource manager with ID %d has the same name." msgstr "ID %d ã®æ—¢å­˜ã®ç‹¬è‡ªãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ãŒåŒã˜åå‰ã§ã™ã€‚" -#: access/transam/rmgr.c:135 +#: access/transam/rmgr.c:144 #, c-format msgid "registered custom resource manager \"%s\" with ID %d" msgstr "独自リソースマãƒãƒ¼ã‚¸ãƒ£\"%s\"ã‚’ID %dã§ç™»éŒ²ã—ã¾ã—ãŸ" -#: access/transam/slru.c:714 +#: access/transam/slru.c:361 +#, c-format +msgid "\"%s\" must be a multiple of %d" +msgstr "\"%s\"ã¯%dã®å€æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" + +#: access/transam/slru.c:830 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "ファイル\"%s\"ãŒå­˜åœ¨ã—ã¾ã›ã‚“。ゼロã¨ã—ã¦èª­ã¿è¾¼ã¿ã¾ã™" -#: access/transam/slru.c:946 access/transam/slru.c:952 access/transam/slru.c:960 access/transam/slru.c:965 access/transam/slru.c:972 access/transam/slru.c:977 access/transam/slru.c:984 access/transam/slru.c:991 +#: access/transam/slru.c:1059 access/transam/slru.c:1065 access/transam/slru.c:1073 access/transam/slru.c:1078 access/transam/slru.c:1085 access/transam/slru.c:1090 access/transam/slru.c:1097 access/transam/slru.c:1104 #, c-format msgid "could not access status of transaction %u" msgstr "トランザクション%uã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/slru.c:947 +#: access/transam/slru.c:1060 #, c-format msgid "Could not open file \"%s\": %m." msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m。" -#: access/transam/slru.c:953 +#: access/transam/slru.c:1066 #, c-format msgid "Could not seek in file \"%s\" to offset %d: %m." msgstr "ファイル\"%s\"ã®ã‚ªãƒ•セット%dã«ã‚·ãƒ¼ã‚¯ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m。" -#: access/transam/slru.c:961 +#: access/transam/slru.c:1074 #, c-format msgid "Could not read from file \"%s\" at offset %d: %m." msgstr "ファイル\"%s\"ã®ã‚ªãƒ•セット%dを読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m。" -#: access/transam/slru.c:966 +#: access/transam/slru.c:1079 #, c-format msgid "Could not read from file \"%s\" at offset %d: read too few bytes." msgstr "ファイル\"%s\"ã®ã‚ªãƒ•セット%dを読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: 読ã¿è¾¼ã‚“ã ãƒã‚¤ãƒˆæ•°ãŒè¶³ã‚Šã¾ã›ã‚“。" -#: access/transam/slru.c:973 +#: access/transam/slru.c:1086 #, c-format msgid "Could not write to file \"%s\" at offset %d: %m." msgstr "ファイル\"%s\"ã®ã‚ªãƒ•セット%dã«æ›¸ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m。" -#: access/transam/slru.c:978 +#: access/transam/slru.c:1091 #, c-format msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." msgstr "ファイル\"%s\"ã®ã‚ªãƒ•セット%dã«æ›¸ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: 書ã込んã ãƒã‚¤ãƒˆæ•°ãŒè¶³ã‚Šã¾ã›ã‚“。" -#: access/transam/slru.c:985 +#: access/transam/slru.c:1098 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m。" -#: access/transam/slru.c:992 +#: access/transam/slru.c:1105 #, c-format msgid "Could not close file \"%s\": %m." msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m。" -#: access/transam/slru.c:1253 +#: access/transam/slru.c:1431 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "ディレクトリ\"%s\"を切り詰ã‚ã§ãã¾ã›ã‚“ã§ã—ãŸ: 明らã‹ã«å‘¨å›žã—ã¦ã„ã¾ã™" @@ -1693,746 +1895,795 @@ msgstr "タイムラインIDã¯å­ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³IDよりå°ã•ããªã‘ msgid "requested timeline %u is not in this server's history" msgstr "è¦æ±‚ã•れãŸã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uãŒã‚µãƒ¼ãƒãƒ¼ã®å±¥æ­´ä¸Šã«å­˜åœ¨ã—ã¾ã›ã‚“" -#: access/transam/twophase.c:385 +#: access/transam/twophase.c:368 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "トランザクション識別å­\"%s\"ã¯é•·ã™ãŽã¾ã™" -#: access/transam/twophase.c:392 +#: access/transam/twophase.c:375 #, c-format msgid "prepared transactions are disabled" msgstr "ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®æº–å‚™ã¯ç„¡åйã«ã•れã¦ã„ã‚‹ãŸã‚ã§ãã¾ã›ã‚“。" -#: access/transam/twophase.c:393 +#: access/transam/twophase.c:376 #, c-format -msgid "Set max_prepared_transactions to a nonzero value." -msgstr "max_prepared_transactionsã‚’éžã‚¼ãƒ­ã«è¨­å®šã—ã¦ãã ã•ã„。" +msgid "Set \"max_prepared_transactions\" to a nonzero value." +msgstr "\"max_prepared_transactions\"ã‚’0以外ã®å€¤ã«è¨­å®šã—ã¦ãã ã•ã„。" -#: access/transam/twophase.c:412 +#: access/transam/twophase.c:395 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "トランザクション識別å­\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: access/transam/twophase.c:421 access/transam/twophase.c:2484 +#: access/transam/twophase.c:404 access/transam/twophase.c:2531 #, c-format msgid "maximum number of prepared transactions reached" msgstr "準備済ã¿ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®æœ€å¤§æ•°ã«é”ã—ã¾ã—ãŸ" -#: access/transam/twophase.c:422 access/transam/twophase.c:2485 +#: access/transam/twophase.c:405 access/transam/twophase.c:2532 #, c-format -msgid "Increase max_prepared_transactions (currently %d)." -msgstr "max_prepared_transactionsを増加ã—ã¦ãã ã•ã„(ç¾çж%d)。" +msgid "Increase \"max_prepared_transactions\" (currently %d)." +msgstr "\"max_prepared_transactions\"を大ããã—ã¦ãã ã•ã„(ç¾åœ¨ã¯%d)。" -#: access/transam/twophase.c:598 +#: access/transam/twophase.c:580 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "識別å­\"%s\"ã®æº–å‚™ã•れãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ãƒ­ãƒƒã‚¯ãŒå–å¾—ã§ãã¾ã›ã‚“" -#: access/transam/twophase.c:604 +#: access/transam/twophase.c:586 #, c-format msgid "permission denied to finish prepared transaction" msgstr "準備ã•れãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®çµ‚äº†ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: access/transam/twophase.c:605 +#: access/transam/twophase.c:587 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "スーパーユーザーã¾ãŸã¯ã“ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’準備ã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: access/transam/twophase.c:616 +#: access/transam/twophase.c:598 #, c-format msgid "prepared transaction belongs to another database" msgstr "準備ã•れãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯åˆ¥ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«å±žã—ã¦ã„ã¾ã™" -#: access/transam/twophase.c:617 +#: access/transam/twophase.c:599 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "終了ã•ã›ã‚‹ãŸã‚ã«ã¯ã“ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’準備ã—ãŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã—ã¦ãã ã•ã„。" -#: access/transam/twophase.c:632 +#: access/transam/twophase.c:614 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "識別å­\"%s\"ã®æº–å‚™ã•れãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯ã‚りã¾ã›ã‚“" -#: access/transam/twophase.c:1167 +#: access/transam/twophase.c:1174 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "2ç›¸çŠ¶æ…‹ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¤§é•·ãŒåˆ¶é™ã‚’è¶…ãˆã¾ã—ãŸ" -#: access/transam/twophase.c:1322 +#: access/transam/twophase.c:1329 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" msgstr[0] "ファイル\"%s\"ã®ã‚µã‚¤ã‚ºãŒä¸æ­£: %lld ãƒã‚¤ãƒˆ" -#: access/transam/twophase.c:1331 +#: access/transam/twophase.c:1338 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "ファイル\"%s\"ã®CRCオフセットã®ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆãŒä¸æ­£ã§ã™" -#: access/transam/twophase.c:1349 +#: access/transam/twophase.c:1356 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$lldãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" -#: access/transam/twophase.c:1364 +#: access/transam/twophase.c:1371 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "ファイル\"%s\"ã«æ ¼ç´ã•れã¦ã„るマジックナンãƒãƒ¼ãŒä¸æ­£ã§ã™" -#: access/transam/twophase.c:1370 +#: access/transam/twophase.c:1377 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "ファイル\"%s\"å†…ã«æ ¼ç´ã•れã¦ã„るサイズãŒä¸æ­£ã§ã™" -#: access/transam/twophase.c:1382 +#: access/transam/twophase.c:1389 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "算出ã•れãŸCRCãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒãƒ•ァイル\"%s\"ã«æ ¼ç´ã•れã¦ã„る値ã¨ä¸€è‡´ã—ã¾ã›ã‚“" -#: access/transam/twophase.c:1412 access/transam/xlogrecovery.c:590 replication/logical/logical.c:209 replication/walsender.c:687 +#: access/transam/twophase.c:1419 access/transam/xlogrecovery.c:565 postmaster/walsummarizer.c:936 replication/logical/logical.c:211 replication/walsender.c:836 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "WALリーダã®å‰²ã‚Šå½“ã¦ã«ä¸­ã«å¤±æ•—ã—ã¾ã—ãŸã€‚" -#: access/transam/twophase.c:1422 +#: access/transam/twophase.c:1429 #, c-format msgid "could not read two-phase state from WAL at %X/%X: %s" msgstr "WALã®%X/%Xã‹ã‚‰2相状態を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %s" -#: access/transam/twophase.c:1427 +#: access/transam/twophase.c:1434 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "WALã®%X/%Xã‹ã‚‰2相状態を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/twophase.c:1435 +#: access/transam/twophase.c:1442 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "WALã®%X/%Xã«ã‚ã‚‹ã¯ãšã®2相状態ã®ãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã›ã‚“" -#: access/transam/twophase.c:1731 +#: access/transam/twophase.c:1745 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "ファイル\"%s\"ã‚’å†ä½œæˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/twophase.c:1858 +#: access/transam/twophase.c:1872 #, c-format msgid "%u two-phase state file was written for a long-running prepared transaction" msgid_plural "%u two-phase state files were written for long-running prepared transactions" msgstr[0] "é•·æ™‚é–“å®Ÿè¡Œä¸­ã®æº–備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ãŸã‚ã«%u個ã®2ç›¸çŠ¶æ…‹ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ›¸ãè¾¼ã¾ã‚Œã¾ã—ãŸ" -#: access/transam/twophase.c:2092 +#: access/transam/twophase.c:2107 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "共有メモリã‹ã‚‰æº–備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%uを復元ã—ã¾ã™" -#: access/transam/twophase.c:2185 +#: access/transam/twophase.c:2200 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "ä¸è¦ã«ãªã£ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%uã®2相状態ファイルを削除ã—ã¾ã™" -#: access/transam/twophase.c:2192 +#: access/transam/twophase.c:2207 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "ä¸è¦ã«ãªã£ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%uã®2相状態をメモリã‹ã‚‰å‰Šé™¤ã—ã¾ã™" -#: access/transam/twophase.c:2205 +#: access/transam/twophase.c:2220 #, c-format msgid "removing future two-phase state file for transaction %u" -msgstr "未æ¥ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%uã®2相状態ファイルを削除ã—ã¾ã™" +msgstr "トランザクション%uã®æœªæ¥ã®2相状態ファイルを削除ã—ã¾ã™" -#: access/transam/twophase.c:2212 +#: access/transam/twophase.c:2227 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "未æ¥ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%uã®2相状態をメモリã‹ã‚‰å‰Šé™¤ã—ã¾ã™" -#: access/transam/twophase.c:2237 +#: access/transam/twophase.c:2252 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "トランザクション%uã®2相状態ファイルãŒç ´æã—ã¦ã„ã¾ã™" -#: access/transam/twophase.c:2242 +#: access/transam/twophase.c:2257 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "メモリ上ã«ã‚るトランザクション%uã®2相状態ãŒç ´æã—ã¦ã„ã¾ã™" -#: access/transam/varsup.c:129 +#: access/transam/twophase.c:2514 #, c-format -msgid "database is not accepting commands to avoid wraparound data loss in database \"%s\"" -msgstr "データベース\"%s\"ã«ãŠã‘る周回ã«ã‚ˆã‚‹ãƒ‡ãƒ¼ã‚¿æå¤±ã‚’防ããŸã‚ã«ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯å•ã„åˆã‚ã›ã‚’å—ã‘付ã‘ã¦ã„ã¾ã›ã‚“" +msgid "could not recover two-phase state file for transaction %u" +msgstr "トランザクション%uã®2相状態ファイルを復元ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/varsup.c:131 access/transam/varsup.c:138 +#: access/transam/twophase.c:2516 #, c-format -msgid "" -"Stop the postmaster and vacuum that database in single-user mode.\n" -"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." -msgstr "" -"postmaster ã‚’åœæ­¢å¾Œã€ã‚·ãƒ³ã‚°ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ¢ãƒ¼ãƒ‰ã§ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«VACUUMを実行ã—ã¦ãã ã•ã„。\n" -"å¤ã„準備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚³ãƒŸãƒƒãƒˆã¾ãŸã¯ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ã€ã‚‚ã—ãã¯å¤ã„レプリケーションスロットã®å‰Šé™¤ã‚‚å¿…è¦ã‹ã‚‚ã—れã¾ã›ã‚“。" +msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." +msgstr "2相状態ファイルãŒWALレコード%X/%Xã§è¦‹ã¤ã‹ã‚Šã¾ã—ãŸãŒã€ã“ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯ã™ã§ã«ãƒ‡ã‚£ã‚¹ã‚¯ã‹ã‚‰å¾©å…ƒæ¸ˆã¿ã§ã™ã€‚" + +#: access/transam/twophase.c:2524 storage/file/fd.c:514 utils/fmgr/dfmgr.c:209 +#, c-format +msgid "could not access file \"%s\": %m" +msgstr "ファイル\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/varsup.c:136 +#: access/transam/varsup.c:156 #, c-format -msgid "database is not accepting commands to avoid wraparound data loss in database with OID %u" -msgstr "OID %uã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯å‘¨å›žã«ã‚ˆã‚‹ãƒ‡ãƒ¼ã‚¿æå¤±ã‚’防ããŸã‚ã«ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯å•ã„åˆã‚ã›ã‚’å—ã‘付ã‘ã¦ã„ã¾ã›ã‚“" +msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database \"%s\"" +msgstr "データベース\"%s\"ã¯XID周回ã«ã‚ˆã‚‹ãƒ‡ãƒ¼ã‚¿æå¤±ã‚’防ããŸã‚ã«ã€æ–°è¦ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDを割り当ã¦ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’å—ã‘付ã‘ã¦ã„ã¾ã›ã‚“" -#: access/transam/varsup.c:148 access/transam/varsup.c:463 +#: access/transam/varsup.c:163 +#, c-format +msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database with OID %u" +msgstr "OID %u ã‚’æŒã¤ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯å‘¨å›žã«ã‚ˆã‚‹ãƒ‡ãƒ¼ã‚¿æå¤±ã‚’防ããŸã‚ã«ã€æ–°è¦ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDを割り当ã¦ã‚‹ãƒžãƒ³ãƒ‰ã‚’å—ã‘付ã‘ã¦ã„ã¾ã›ã‚“" + +#: access/transam/varsup.c:175 access/transam/varsup.c:490 #, c-format msgid "database \"%s\" must be vacuumed within %u transactions" msgstr "データベース\"%s\"ã¯%uトランザクション以内ã«VACUUMã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: access/transam/varsup.c:155 access/transam/varsup.c:470 +#: access/transam/varsup.c:178 +#, c-format +msgid "" +"To avoid transaction ID assignment failures, execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"トランザクションIDã®å‰²ã‚Šå½“ã¦å¤±æ•—を防ããŸã‚ã«ã€ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å…¨ä½“ã® VACUUM を実行ã—ã¦ãã ã•ã„。\n" +"å¤ã„準備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚³ãƒŸãƒƒãƒˆã¾ãŸã¯ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ã€ã‚‚ã—ãã¯å¤ã„レプリケーションスロットã®å‰Šé™¤ã‚‚å¿…è¦ã‹ã‚‚ã—れã¾ã›ã‚“。" + +#: access/transam/varsup.c:182 access/transam/varsup.c:497 #, c-format msgid "database with OID %u must be vacuumed within %u transactions" msgstr "OID %uã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯%uトランザクション以内ã«VACUUMを実行ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: access/transam/xact.c:1102 +#: access/transam/varsup.c:185 access/transam/varsup.c:493 access/transam/varsup.c:500 +#, c-format +msgid "" +"To avoid XID assignment failures, execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"XIDã®å‰²ã‚Šå½“ã¦å¤±æ•—を防ããŸã‚ã«ã€ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å…¨ä½“ã® VACUUM を実行ã—ã¦ãã ã•ã„。\n" +"å¤ã„準備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚³ãƒŸãƒƒãƒˆã¾ãŸã¯ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ã€ã‚‚ã—ãã¯å¤ã„レプリケーションスロットã®å‰Šé™¤ã‚‚å¿…è¦ã‹ã‚‚ã—れã¾ã›ã‚“。" + +#: access/transam/xact.c:649 +#, c-format +msgid "cannot assign transaction IDs during a parallel operation" +msgstr "並列処ç†ä¸­ã«ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDã®å‰²ã‚Šå½“ã¦ã¯ã§ãã¾ã›ã‚“" + +#: access/transam/xact.c:840 +#, c-format +msgid "cannot modify data in a parallel worker" +msgstr "並列ワーカーã§ã¯ãƒ‡ãƒ¼ã‚¿ã®æ›´æ–°ã¯ã§ãã¾ã›ã‚“" + +#: access/transam/xact.c:1115 +#, c-format +msgid "cannot start commands during a parallel operation" +msgstr "並列処ç†ä¸­ã«ã¯ã‚³ãƒžãƒ³ãƒ‰ã¯èµ·å‹•ã§ãã¾ã›ã‚“" + +#: access/transam/xact.c:1123 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "1トランザクション内ã§ã¯ 2^32-2 個より多ãã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã§ãã¾ã›ã‚“" -#: access/transam/xact.c:1643 +#: access/transam/xact.c:1664 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "コミットã•れãŸã‚µãƒ–ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³æ•°ã®æœ€å¤§å€¤(%d)ãŒåˆ¶é™ã‚’è¶Šãˆã¾ã—ãŸ" -#: access/transam/xact.c:2513 +#: access/transam/xact.c:2561 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "一時オブジェクトã«å¯¾ã™ã‚‹æ“作を行ã£ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’PREPAREã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: access/transam/xact.c:2523 +#: access/transam/xact.c:2571 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "エクスãƒãƒ¼ãƒˆã•れãŸã‚¹ãƒŠãƒƒãƒ—ショットをæŒã¤ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’PREPAREã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3489 +#: access/transam/xact.c:3593 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%sã¯ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãƒ–ロックã®å†…å´ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3499 +#: access/transam/xact.c:3603 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%sã¯ã‚µãƒ–トランザクションブロックã®å†…å´ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3509 +#: access/transam/xact.c:3613 #, c-format msgid "%s cannot be executed within a pipeline" -msgstr "%s ã¯ãƒ‘イプライン内ã§ã®å®Ÿè¡Œã¯ã§ãã¾ã›ã‚“" +msgstr "%s ã¯ãƒ‘イプライン中ã§ã®å®Ÿè¡Œã¯ã§ãã¾ã›ã‚“" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3519 +#: access/transam/xact.c:3623 #, c-format msgid "%s cannot be executed from a function" msgstr "%s ã¯é–¢æ•°å†…ã§ã®å®Ÿè¡Œã¯ã§ãã¾ã›ã‚“" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3590 access/transam/xact.c:3915 access/transam/xact.c:3994 access/transam/xact.c:4117 access/transam/xact.c:4268 access/transam/xact.c:4337 access/transam/xact.c:4448 +#: access/transam/xact.c:3694 access/transam/xact.c:4019 access/transam/xact.c:4098 access/transam/xact.c:4221 access/transam/xact.c:4372 access/transam/xact.c:4441 access/transam/xact.c:4552 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%sã¯ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãƒ–ロック内ã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™" -#: access/transam/xact.c:3801 +#: access/transam/xact.c:3905 #, c-format msgid "there is already a transaction in progress" msgstr "ã™ã§ã«ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒå®Ÿè¡Œä¸­ã§ã™" -#: access/transam/xact.c:3920 access/transam/xact.c:3999 access/transam/xact.c:4122 +#: access/transam/xact.c:4024 access/transam/xact.c:4103 access/transam/xact.c:4226 #, c-format msgid "there is no transaction in progress" msgstr "実行中ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã›ã‚“" -#: access/transam/xact.c:4010 +#: access/transam/xact.c:4114 #, c-format msgid "cannot commit during a parallel operation" msgstr "並列処ç†ä¸­ã«ã¯ã‚³ãƒŸãƒƒãƒˆã¯ã§ãã¾ã›ã‚“" -#: access/transam/xact.c:4133 +#: access/transam/xact.c:4237 #, c-format msgid "cannot abort during a parallel operation" msgstr "パラレル処ç†ä¸­ã«ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ã¯ã§ãã¾ã›ã‚“" -#: access/transam/xact.c:4232 +#: access/transam/xact.c:4336 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "パラレル処ç†ä¸­ã«ã‚»ãƒ¼ãƒ–ãƒã‚¤ãƒ³ãƒˆã¯å®šç¾©ã§ãã¾ã›ã‚“" -#: access/transam/xact.c:4319 +#: access/transam/xact.c:4423 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "並列処ç†ä¸­ã¯ã‚»ãƒ¼ãƒ–ãƒã‚¤ãƒ³ãƒˆã®è§£æ”¾ã¯ã§ãã¾ã›ã‚“" -#: access/transam/xact.c:4329 access/transam/xact.c:4380 access/transam/xact.c:4440 access/transam/xact.c:4489 +#: access/transam/xact.c:4433 access/transam/xact.c:4484 access/transam/xact.c:4544 access/transam/xact.c:4593 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "セーブãƒã‚¤ãƒ³ãƒˆ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: access/transam/xact.c:4386 access/transam/xact.c:4495 +#: access/transam/xact.c:4490 access/transam/xact.c:4599 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "セーブãƒã‚¤ãƒ³ãƒˆ\"%s\"ã¯ç¾åœ¨ã®ã‚»ãƒ¼ãƒ–ãƒã‚¤ãƒ³ãƒˆãƒ¬ãƒ™ãƒ«ã«ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: access/transam/xact.c:4428 +#: access/transam/xact.c:4532 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "パラレル処ç†ä¸­ã«ã‚»ãƒ¼ãƒ–ãƒã‚¤ãƒ³ãƒˆã®ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ã¯ã§ãã¾ã›ã‚“" -#: access/transam/xact.c:4556 -#, c-format -msgid "cannot start subtransactions during a parallel operation" -msgstr "並列処ç†ä¸­ã¯ã‚µãƒ–トランザクションを開始ã§ãã¾ã›ã‚“" - -#: access/transam/xact.c:4624 -#, c-format -msgid "cannot commit subtransactions during a parallel operation" -msgstr "並列処ç†ä¸­ã¯ã‚µãƒ–トランザクションをコミットã§ãã¾ã›ã‚“" - -#: access/transam/xact.c:5270 +#: access/transam/xact.c:5376 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "1トランザクション内ã«ã¯ 2^32-1 個より多ãã®ã‚µãƒ–トランザクションを作æˆã§ãã¾ã›ã‚“" -#: access/transam/xlog.c:1466 +#: access/transam/xlog.c:1542 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" msgstr "生æˆã•れãŸWALより先ã®ä½ç½®ã¾ã§ã®ãƒ•ãƒ©ãƒƒã‚·ãƒ¥è¦æ±‚; è¦æ±‚ %X/%X, ç¾åœ¨ä½ç½® %X/%X" +#: access/transam/xlog.c:1769 +#, c-format +msgid "cannot read past end of generated WAL: requested %X/%X, current position %X/%X" +msgstr "生æˆã•れãŸWALより先ã®ä½ç½®ã¾ã§ã®èª­ã¿è¾¼ã¿è¦æ±‚; è¦æ±‚ %X/%X, ç¾åœ¨ä½ç½® %X/%X" + +#: access/transam/xlog.c:2210 access/transam/xlog.c:4501 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WALセグメントサイズã¯1MBã‹ã‚‰1GBã¾ã§ã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" + #: access/transam/xlog.c:2228 #, c-format -msgid "could not write to log file %s at offset %u, length %zu: %m" -msgstr "ログファイル%sã®ã‚ªãƒ•セット%uã«é•·ã•%zuã®æ›¸ãè¾¼ã¿ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" +msgid "\"%s\" must be set to -1 during binary upgrade mode." +msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã¯\"%s\"ã¯-1ã«è¨­å®šã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: access/transam/xlog.c:3455 access/transam/xlogutils.c:833 replication/walsender.c:2725 +#: access/transam/xlog.c:2477 +#, c-format +msgid "could not write to log file \"%s\" at offset %u, length %zu: %m" +msgstr "ログファイル \"%s\" ã®ã‚ªãƒ•セット%uã«é•·ã•%zuã®æ›¸ãè¾¼ã¿ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: access/transam/xlog.c:3739 access/transam/xlogutils.c:831 replication/walsender.c:3045 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "è¦æ±‚ã•れ㟠WAL セグメント %s ã¯ã™ã§ã«å‰Šé™¤ã•れã¦ã„ã¾ã™" -#: access/transam/xlog.c:3739 +#: access/transam/xlog.c:4061 #, c-format msgid "could not rename file \"%s\": %m" msgstr "ファイル\"%s\"ã®åå‰ã‚’変更ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/xlog.c:3781 access/transam/xlog.c:3791 +#: access/transam/xlog.c:4104 access/transam/xlog.c:4115 access/transam/xlog.c:4136 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "WALディレクトリ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: access/transam/xlog.c:3797 +#: access/transam/xlog.c:4121 access/transam/xlog.c:4142 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "ãªã‹ã£ãŸWALディレクトリ\"%s\"を作æˆã—ã¦ã„ã¾ã™" -#: access/transam/xlog.c:3800 commands/dbcommands.c:3102 +#: access/transam/xlog.c:4125 access/transam/xlog.c:4145 commands/dbcommands.c:3262 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "ãªã‹ã£ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: access/transam/xlog.c:3867 +#: access/transam/xlog.c:4212 #, c-format msgid "could not generate secret authorization token" msgstr "秘密ã®èªè¨¼ãƒˆãƒ¼ã‚¯ãƒ³ã‚’生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/xlog.c:4017 access/transam/xlog.c:4026 access/transam/xlog.c:4050 access/transam/xlog.c:4057 access/transam/xlog.c:4064 access/transam/xlog.c:4069 access/transam/xlog.c:4076 access/transam/xlog.c:4083 access/transam/xlog.c:4090 access/transam/xlog.c:4097 access/transam/xlog.c:4104 access/transam/xlog.c:4111 access/transam/xlog.c:4120 access/transam/xlog.c:4127 utils/init/miscinit.c:1762 +#: access/transam/xlog.c:4363 access/transam/xlog.c:4373 access/transam/xlog.c:4399 access/transam/xlog.c:4407 access/transam/xlog.c:4415 access/transam/xlog.c:4421 access/transam/xlog.c:4429 access/transam/xlog.c:4437 access/transam/xlog.c:4445 access/transam/xlog.c:4453 access/transam/xlog.c:4461 access/transam/xlog.c:4469 access/transam/xlog.c:4479 access/transam/xlog.c:4487 utils/init/miscinit.c:1812 #, c-format msgid "database files are incompatible with server" msgstr "データベースファイルãŒã‚µãƒ¼ãƒãƒ¼ã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: access/transam/xlog.c:4018 +#: access/transam/xlog.c:4364 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "データベースクラスタã¯PG_CONTROL_VERSION %d (0x%08x)ã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯PG_CONTROL_VERSION %d (0x%08x)ã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/xlog.c:4022 +#: access/transam/xlog.c:4368 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "ã“れã¯ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ã®ä¸æ•´åˆã®å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚initdbを実行ã™ã‚‹å¿…è¦ãŒã‚りãã†ã§ã™ã€‚" -#: access/transam/xlog.c:4027 +#: access/transam/xlog.c:4374 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "データベースクラスタã¯PG_CONTROL_VERSION %d ã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ PG_CONTROL_VERSION %d ã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/xlog.c:4030 access/transam/xlog.c:4054 access/transam/xlog.c:4061 access/transam/xlog.c:4066 +#: access/transam/xlog.c:4377 access/transam/xlog.c:4403 access/transam/xlog.c:4411 access/transam/xlog.c:4417 #, c-format msgid "It looks like you need to initdb." msgstr "initdbãŒå¿…è¦ã®ã‚ˆã†ã§ã™ã€‚" -#: access/transam/xlog.c:4041 +#: access/transam/xlog.c:4389 #, c-format msgid "incorrect checksum in control file" msgstr "制御ファイル内ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸æ­£ã§ã™" -#: access/transam/xlog.c:4051 +#: access/transam/xlog.c:4400 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "データベースクラスタ㯠CATALOG_VERSION_NO %d ã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ CATALOG_VERSION_NO %d ã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/xlog.c:4058 +#: access/transam/xlog.c:4408 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "データベースクラスタ㯠MAXALIGN %d ã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ MAXALIGN %d ã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/xlog.c:4065 +#: access/transam/xlog.c:4416 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "データベースクラスタã¯ã‚µãƒ¼ãƒãƒ¼å®Ÿè¡Œãƒ•ァイルã¨ç•°ãªã‚‹æµ®å‹•å°æ•°ç‚¹æ›¸å¼ã‚’使用ã—ã¦ã„るよã†ã§ã™ã€‚" -#: access/transam/xlog.c:4070 +#: access/transam/xlog.c:4422 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "データベースクラスタ㯠BLCKSZ %d ã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ BLCKSZ %d ã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/xlog.c:4073 access/transam/xlog.c:4080 access/transam/xlog.c:4087 access/transam/xlog.c:4094 access/transam/xlog.c:4101 access/transam/xlog.c:4108 access/transam/xlog.c:4115 access/transam/xlog.c:4123 access/transam/xlog.c:4130 +#: access/transam/xlog.c:4425 access/transam/xlog.c:4433 access/transam/xlog.c:4441 access/transam/xlog.c:4449 access/transam/xlog.c:4457 access/transam/xlog.c:4465 access/transam/xlog.c:4473 access/transam/xlog.c:4482 access/transam/xlog.c:4490 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "å†ã‚³ãƒ³ãƒ‘イルもã—ã㯠initdb ãŒå¿…è¦ãã†ã§ã™ã€‚" -#: access/transam/xlog.c:4077 +#: access/transam/xlog.c:4430 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "データベースクラスタ㯠RELSEG_SIZE %d ã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ RELSEG_SIZE %d ã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/xlog.c:4084 +#: access/transam/xlog.c:4438 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "データベースクラスタ㯠XLOG_BLCKSZ %d ã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ XLOG_BLCKSZ %d ã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/xlog.c:4091 +#: access/transam/xlog.c:4446 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "データベースクラスタ㯠NAMEDATALEN %d ã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ NAMEDATALEN %d ã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/xlog.c:4098 +#: access/transam/xlog.c:4454 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "データベースクラスタ㯠INDEX_MAX_KEYS %d ã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ INDEX_MAX_KEYS %d ã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/xlog.c:4105 +#: access/transam/xlog.c:4462 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "データベースクラスタ㯠TOAST_MAX_CHUNK_SIZE %d ã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ TOAST_MAX_CHUNK_SIZE %d ã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/xlog.c:4112 +#: access/transam/xlog.c:4470 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "データベースクラスタ㯠LOBLKSIZE %d ã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ LOBLKSIZE %d ã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/xlog.c:4121 +#: access/transam/xlog.c:4480 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "データベースクラスタ㯠USE_FLOAT8_BYVAL ãªã—ã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼å´ã¯ USE_FLOAT8_BYVAL 付ãã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/xlog.c:4128 +#: access/transam/xlog.c:4488 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "データベースクラスタ㯠USE_FLOAT8_BYVAL 付ãã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼å´ã¯ USE_FLOAT8_BYVAL ãªã—ã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: access/transam/xlog.c:4137 +#: access/transam/xlog.c:4497 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" -msgstr[0] "WALセグメントã®ã‚µã‚¤ã‚ºæŒ‡å®šã¯1MBã¨1GBã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“ã€ã—ã‹ã—コントロールファイルã§ã¯%dãƒã‚¤ãƒˆã¨ãªã£ã¦ã„ã¾ã™" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "制御ファイル中ã®ä¸æ­£ãªWALセグメントサイズ (%dãƒã‚¤ãƒˆ)" -#: access/transam/xlog.c:4149 +#: access/transam/xlog.c:4510 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" -msgstr "\"min_wal_size\"ã¯æœ€ä½Žã§ã‚‚\"wal_segment_size\"ã®2å€ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" +msgstr "\"min_wal_size\"ã¯\"wal_segment_size\"ã®2å€ä»¥ä¸Šã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: access/transam/xlog.c:4153 +#: access/transam/xlog.c:4514 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" -msgstr "\"max_wal_size\"ã¯æœ€ä½Žã§ã‚‚\"wal_segment_size\"ã®2å€ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" +msgstr "\"max_wal_size\"ã¯\"wal_segment_size\"ã®2å€ä»¥ä¸Šã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: access/transam/xlog.c:4308 catalog/namespace.c:4335 commands/tablespace.c:1216 commands/user.c:2536 commands/variable.c:72 utils/error/elog.c:2205 +#: access/transam/xlog.c:4662 catalog/namespace.c:4696 commands/tablespace.c:1210 commands/user.c:2529 commands/variable.c:72 replication/slot.c:2446 tcop/postgres.c:3715 utils/error/elog.c:2247 #, c-format msgid "List syntax is invalid." msgstr "リスト文法ãŒç„¡åйã§ã™" -#: access/transam/xlog.c:4354 commands/user.c:2552 commands/variable.c:173 utils/error/elog.c:2231 +#: access/transam/xlog.c:4708 commands/user.c:2545 commands/variable.c:173 tcop/postgres.c:3731 utils/error/elog.c:2273 #, c-format msgid "Unrecognized key word: \"%s\"." msgstr "䏿˜Žãªã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã§ã™: \"%s\"" -#: access/transam/xlog.c:4768 +#: access/transam/xlog.c:5129 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "ブートストラップã®å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/xlog.c:4776 +#: access/transam/xlog.c:5137 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "ブートストラップã®å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ãƒ•ァイルをfsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/xlog.c:4782 +#: access/transam/xlog.c:5143 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "ブートストラップã®å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ãƒ•ァイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/xlog.c:4999 +#: access/transam/xlog.c:5368 #, c-format -msgid "WAL was generated with wal_level=minimal, cannot continue recovering" -msgstr "wal_level=minimal ã§WALãŒç”Ÿæˆã•れã¾ã—ãŸã€ãƒªã‚«ãƒãƒªã¯ç¶šè¡Œä¸å¯ã§ã™" +msgid "WAL was generated with \"wal_level=minimal\", cannot continue recovering" +msgstr "\"wal_level=minimal\"ã§WALãŒç”Ÿæˆã•れã¾ã—ãŸã€ãƒªã‚«ãƒãƒªã¯ç¶šè¡Œä¸å¯ã§ã™" -#: access/transam/xlog.c:5000 +#: access/transam/xlog.c:5369 #, c-format -msgid "This happens if you temporarily set wal_level=minimal on the server." -msgstr "ã“れã¯ã“ã®ã‚µãƒ¼ãƒãƒ¼ã§ä¸€æ™‚çš„ã«wal_level=minimalã«ã—ãŸå ´åˆã«èµ·ã“りã¾ã™ã€‚" +msgid "This happens if you temporarily set \"wal_level=minimal\" on the server." +msgstr "ã“れã¯ã“ã®ã‚µãƒ¼ãƒãƒ¼ã§ä¸€æ™‚çš„ã«\"wal_level=minimal\"ã«ã—ãŸå ´åˆã«èµ·ã“りã¾ã™ã€‚" -#: access/transam/xlog.c:5001 +#: access/transam/xlog.c:5370 #, c-format -msgid "Use a backup taken after setting wal_level to higher than minimal." -msgstr "wal_levelã‚’minimalより上ä½ã«è¨­å®šã—ãŸã‚ã¨ã«å–å¾—ã—ãŸãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を使用ã—ã¦ãã ã•ã„。" +msgid "Use a backup taken after setting \"wal_level\" to higher than \"minimal\"." +msgstr "\"wal_level\"ã‚’\"minimal\"より上ä½ã«è¨­å®šã—ãŸã‚ã¨ã«å–å¾—ã—ãŸãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を使用ã—ã¦ãã ã•ã„。" -#: access/transam/xlog.c:5065 +#: access/transam/xlog.c:5435 #, c-format msgid "control file contains invalid checkpoint location" msgstr "制御ファイル内ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆä½ç½®ãŒä¸æ­£ã§ã™" -#: access/transam/xlog.c:5076 +#: access/transam/xlog.c:5446 #, c-format msgid "database system was shut down at %s" msgstr "データベースシステム㯠%s ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã—ã¾ã—ãŸ" -#: access/transam/xlog.c:5082 +#: access/transam/xlog.c:5452 #, c-format msgid "database system was shut down in recovery at %s" msgstr "データベースシステムã¯ãƒªã‚«ãƒãƒªä¸­ %s ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã—ã¾ã—ãŸ" -#: access/transam/xlog.c:5088 +#: access/transam/xlog.c:5458 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "データベースシステムã¯ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ä¸­ã«ä¸­æ–­ã•れã¾ã—ãŸ; %s ã¾ã§å‹•作ã—ã¦ã„ãŸã“ã¨ã¯ç¢ºèªã§ãã¾ã™" -#: access/transam/xlog.c:5094 +#: access/transam/xlog.c:5464 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "データベースシステムã¯ãƒªã‚«ãƒãƒªä¸­ %s ã«ä¸­æ–­ã•れã¾ã—ãŸ" -#: access/transam/xlog.c:5096 +#: access/transam/xlog.c:5466 #, c-format msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." msgstr "ã“れã¯ãŠãらãデータ破æãŒã‚りã€ãƒªã‚«ãƒãƒªã®ãŸã‚ã«ç›´å‰ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を使用ã—ãªã‘れã°ãªã‚‰ãªã„ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚" -#: access/transam/xlog.c:5102 +#: access/transam/xlog.c:5472 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "データベースシステムã¯ãƒªã‚«ãƒãƒªä¸­ãƒ­ã‚°æ™‚刻 %s ã«ä¸­æ–­ã•れã¾ã—ãŸ" -#: access/transam/xlog.c:5104 +#: access/transam/xlog.c:5474 #, c-format msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." msgstr "ã“れãŒ1回以上起ããŸå ´åˆã¯ãƒ‡ãƒ¼ã‚¿ãŒç ´æã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€ã‚ˆã‚Šä»¥å‰ã®ãƒªã‚«ãƒãƒªç›®æ¨™ã‚’é¸ã¶å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: access/transam/xlog.c:5110 +#: access/transam/xlog.c:5480 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "データベースシステムã¯ä¸­æ–­ã•れã¾ã—ãŸ: %s ã¾ã§å‹•作ã—ã¦ã„ãŸã“ã¨ã¯ç¢ºèªã§ãã¾ã™" -#: access/transam/xlog.c:5116 +#: access/transam/xlog.c:5487 #, c-format msgid "control file contains invalid database cluster state" msgstr "制御ファイル内ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ»ã‚¯ãƒ©ã‚¹ã‚¿çŠ¶æ…‹ãŒä¸æ­£ã§ã™" -#: access/transam/xlog.c:5500 +#: access/transam/xlog.c:5875 #, c-format msgid "WAL ends before end of online backup" msgstr "オンラインãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®çµ‚了よりå‰ã«WALãŒçµ‚了ã—ã¾ã—ãŸ" -#: access/transam/xlog.c:5501 +#: access/transam/xlog.c:5876 #, c-format msgid "All WAL generated while online backup was taken must be available at recovery." msgstr "オンラインãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—中ã«ç”Ÿæˆã•れãŸã™ã¹ã¦ã®WALãŒãƒªã‚«ãƒãƒªã§åˆ©ç”¨å¯èƒ½ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: access/transam/xlog.c:5504 +#: access/transam/xlog.c:5880 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WALãŒä¸€è²«æ€§ãŒã‚るリカãƒãƒªãƒã‚¤ãƒ³ãƒˆã‚ˆã‚Šå‰ã§çµ‚了ã—ã¾ã—ãŸ" -#: access/transam/xlog.c:5550 +#: access/transam/xlog.c:5926 #, c-format msgid "selected new timeline ID: %u" msgstr "æ–°ã—ã„タイムラインIDã‚’é¸æŠž: %u" -#: access/transam/xlog.c:5583 +#: access/transam/xlog.c:5959 #, c-format msgid "archive recovery complete" msgstr "アーカイブリカãƒãƒªãŒå®Œäº†ã—ã¾ã—ãŸ" -#: access/transam/xlog.c:6185 +#: access/transam/xlog.c:6612 #, c-format msgid "shutting down" msgstr "シャットダウンã—ã¦ã„ã¾ã™" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6224 +#: access/transam/xlog.c:6651 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "リスタートãƒã‚¤ãƒ³ãƒˆé–‹å§‹:%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6236 +#: access/transam/xlog.c:6663 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆé–‹å§‹:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6301 +#: access/transam/xlog.c:6728 #, c-format msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "リスタートãƒã‚¤ãƒ³ãƒˆå®Œäº†: %d個ã®ãƒãƒƒãƒ•ァを出力 (%.1f%%); %d個ã®WALファイルを追加ã€%d個を削除ã€%d個をå†åˆ©ç”¨; 書ã出ã—=%ld.%03dç§’, åŒæœŸ=%ld.%03dç§’, 全体=%ld.%03dç§’; åŒæœŸã—ãŸãƒ•ァイル=%d, 最長=%ld.%03dç§’, å¹³å‡=%ld.%03dç§’; è·é›¢=%d kB, 予測=%d kB; lsn=%X/%X, å†ç”Ÿlsn=%X/%X" -#: access/transam/xlog.c:6324 +#: access/transam/xlog.c:6751 #, c-format msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆå®Œäº†: %d個ã®ãƒãƒƒãƒ•ァを出力 (%.1f%%); %d個ã®WALファイルを追加ã€%d個を削除ã€%d個をå†åˆ©ç”¨; 書ã出ã—=%ld.%03dç§’, åŒæœŸ=%ld.%03dç§’, 全体=%ld.%03dç§’; åŒæœŸã—ãŸãƒ•ァイル=%d, 最長=%ld.%03dç§’, å¹³å‡=%ld.%03dç§’; è·é›¢=%d kB, 予測=%d kB; lsn=%X/%X, å†ç”Ÿlsn=%X/%X" -#: access/transam/xlog.c:6762 +#: access/transam/xlog.c:7233 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "データベースã®ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã«ä¸¦è¡Œã—ã¦ã€å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ãŒç™ºç”Ÿã—ã¾ã—ãŸ" -#: access/transam/xlog.c:7323 +#: access/transam/xlog.c:7818 #, c-format msgid "recovery restart point at %X/%X" msgstr "リカãƒãƒªå†é–‹ãƒã‚¤ãƒ³ãƒˆã¯%X/%Xã§ã™" -#: access/transam/xlog.c:7325 +#: access/transam/xlog.c:7820 #, c-format msgid "Last completed transaction was at log time %s." msgstr "最後ã«å®Œäº†ã—ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯ãƒ­ã‚°æ™‚刻 %s ã®ã‚‚ã®ã§ã™" -#: access/transam/xlog.c:7573 +#: access/transam/xlog.c:8082 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "復帰ãƒã‚¤ãƒ³ãƒˆ\"%s\"ãŒ%X/%Xã«ä½œæˆã•れã¾ã—ãŸ" -#: access/transam/xlog.c:7780 +#: access/transam/xlog.c:8289 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "オンラインãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れã€ãƒªã‚«ãƒãƒªã‚’継続ã§ãã¾ã›ã‚“" -#: access/transam/xlog.c:7837 +#: access/transam/xlog.c:8347 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "シャットダウンãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰ã«ãŠã„ã¦æƒ³å®šå¤–ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ID %u(%uã®ã¯ãš)ãŒã‚りã¾ã—ãŸ" -#: access/transam/xlog.c:7895 +#: access/transam/xlog.c:8405 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "オンラインãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰ã«ãŠã„ã¦æƒ³å®šå¤–ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ID %u(%uã®ã¯ãš)ãŒã‚りã¾ã—ãŸ" -#: access/transam/xlog.c:7924 +#: access/transam/xlog.c:8434 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "リカãƒãƒªçµ‚了ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰ã«ãŠã„ã¦æƒ³å®šå¤–ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ID %u(%uã®ã¯ãš)ãŒã‚りã¾ã—ãŸ" -#: access/transam/xlog.c:8191 +#: access/transam/xlog.c:8705 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "ライトスルーファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/xlog.c:8196 +#: access/transam/xlog.c:8710 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "ファイル\"%s\"ã‚’fdatasyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/xlog.c:8281 access/transam/xlog.c:8604 +#: access/transam/xlog.c:8797 access/transam/xlog.c:9133 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "オンラインãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を行ã†ã«ã¯WALレベルãŒä¸å分ã§ã™" -#: access/transam/xlog.c:8282 access/transam/xlog.c:8605 access/transam/xlogfuncs.c:254 +#: access/transam/xlog.c:8798 access/transam/xlogfuncs.c:248 #, c-format -msgid "wal_level must be set to \"replica\" or \"logical\" at server start." -msgstr "サーãƒãƒ¼ã®é–‹å§‹æ™‚ã«wal_levelã‚’\"replica\"ã¾ãŸã¯ \"logical\"ã«ã‚»ãƒƒãƒˆã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" +msgid "\"wal_level\" must be set to \"replica\" or \"logical\" at server start." +msgstr "サーãƒãƒ¼ã®é–‹å§‹æ™‚ã«\"wal_level\"ã‚’\"replica\"ã¾ãŸã¯ \"logical\"ã«ã‚»ãƒƒãƒˆã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: access/transam/xlog.c:8287 +#: access/transam/xlog.c:8803 #, c-format msgid "backup label too long (max %d bytes)" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ラベルãŒé•·ã™ãŽã¾ã™ (最大%dãƒã‚¤ãƒˆ)" -#: access/transam/xlog.c:8408 +#: access/transam/xlog.c:8924 #, c-format -msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "full_page_writes=off ã§ç”Ÿæˆã•れãŸWALã¯æœ€çµ‚リスタートãƒã‚¤ãƒ³ãƒˆã‹ã‚‰å†ç”Ÿã•れã¾ã™" +msgid "WAL generated with \"full_page_writes=off\" was replayed since last restartpoint" +msgstr "\"full_page_writes=off\"ã§ç”Ÿæˆã•れãŸWALãŒæœ€çµ‚リスタートãƒã‚¤ãƒ³ãƒˆä»¥é™ã«å†ç”Ÿã•れã¾ã—ãŸ" -#: access/transam/xlog.c:8410 access/transam/xlog.c:8693 +#: access/transam/xlog.c:8926 access/transam/xlog.c:9222 #, c-format -msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." -msgstr "ã¤ã¾ã‚Šã“ã®ã‚¹ã‚¿ãƒ³ãƒã‚¤ã§å–å¾—ã•れãŸãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯ç ´æã—ã¦ãŠã‚Šã€ä½¿ç”¨ã™ã¹ãã§ã¯ã‚りã¾ã›ã‚“。プライマリã§full_page_writesを有効ã«ã—CHECKPOINTを実行ã—ãŸã®ã¡ã€å†åº¦ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を試行ã—ã¦ãã ã•ã„。" +msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable \"full_page_writes\" and run CHECKPOINT on the primary, and then try an online backup again." +msgstr "ã¤ã¾ã‚Šã“ã®ã‚¹ã‚¿ãƒ³ãƒã‚¤ã§å–å¾—ã•れãŸãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯ç ´æã—ã¦ãŠã‚Šã€ä½¿ç”¨ã™ã¹ãã§ã¯ã‚りã¾ã›ã‚“。プライマリã§\"full_page_writes\"を有効ã«ã—CHECKPOINTを実行ã—ãŸã®ã¡ã€å†åº¦ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を試行ã—ã¦ãã ã•ã„。" -#: access/transam/xlog.c:8477 backup/basebackup.c:1351 utils/adt/misc.c:354 +#: access/transam/xlog.c:9006 backup/basebackup.c:1417 utils/adt/misc.c:354 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を読ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/xlog.c:8484 backup/basebackup.c:1356 utils/adt/misc.c:359 +#: access/transam/xlog.c:9013 backup/basebackup.c:1422 utils/adt/misc.c:359 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "シンボリックリンク\"%s\"ã®å‚ç…§å…ˆãŒé•·ã™ãŽã¾ã™" -#: access/transam/xlog.c:8643 backup/basebackup.c:1217 +#: access/transam/xlog.c:9134 +#, c-format +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "サーãƒãƒ¼ã®é–‹å§‹æ™‚ã«wal_levelã‚’\"replica\"ã¾ãŸã¯ \"logical\"ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" + +#: access/transam/xlog.c:9172 backup/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "オンラインãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—中ã«ã‚¹ã‚¿ãƒ³ãƒã‚¤ãŒæ˜‡æ ¼ã—ã¾ã—ãŸ" -#: access/transam/xlog.c:8644 backup/basebackup.c:1218 +#: access/transam/xlog.c:9173 backup/basebackup.c:1282 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "ã¤ã¾ã‚Šå–得中ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯ç ´æã—ã¦ã„ã‚‹ãŸã‚使用ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。å†åº¦ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’å–å¾—ã—ã¦ãã ã•ã„。" -#: access/transam/xlog.c:8691 +#: access/transam/xlog.c:9220 #, c-format -msgid "WAL generated with full_page_writes=off was replayed during online backup" -msgstr "full_page_writes=offã§ç”Ÿæˆã•れãŸWALã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—中ã«å†ç”Ÿã•れã¾ã™" +msgid "WAL generated with \"full_page_writes=off\" was replayed during online backup" +msgstr "\"full_page_writes=off\"ã§ç”Ÿæˆã•れãŸWALãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—中ã«å†ç”Ÿã•れã¾ã—ãŸ" -#: access/transam/xlog.c:8807 +#: access/transam/xlog.c:9336 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "ベースãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—完了ã€å¿…è¦ãª WAL セグメントãŒã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã•れるã®ã‚’å¾…ã£ã¦ã„ã¾ã™" -#: access/transam/xlog.c:8821 +#: access/transam/xlog.c:9350 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "ã¾ã å¿…è¦ãªã™ã¹ã¦ã® WAL セグメントãŒã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã•れるã®ã‚’å¾…ã£ã¦ã„ã¾ã™ï¼ˆ%d 秒経éŽï¼‰" -#: access/transam/xlog.c:8823 +#: access/transam/xlog.c:9352 #, c-format -msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." -msgstr "archive_commandãŒé©åˆ‡ã«å®Ÿè¡Œã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—処ç†ã¯å®‰å…¨ã«å–り消ã™ã“ã¨ãŒã§ãã¾ã™ãŒã€å…¨ã¦ã®WALセグメントãŒãã‚ã‚ãªã‘れã°ã“ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。" +msgid "Check that your \"archive_command\" is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." +msgstr "\"archive_command\"ãŒæ­£ã—ã実行ã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—処ç†ã¯å®‰å…¨ã«å–り消ã™ã“ã¨ãŒã§ãã¾ã™ãŒã€å…¨ã¦ã®WALセグメントãŒãã‚ã‚ãªã‘れã°ã“ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。" -#: access/transam/xlog.c:8830 +#: access/transam/xlog.c:9359 #, c-format msgid "all required WAL segments have been archived" msgstr "å¿…è¦ãªã™ã¹ã¦ã® WAL セグメントãŒã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã•れã¾ã—ãŸ" -#: access/transam/xlog.c:8834 +#: access/transam/xlog.c:9363 #, c-format msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" msgstr "WAL ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã›ã‚“。ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を完了ã•ã›ã‚‹ã«ã¯ã€ã™ã¹ã¦ã®å¿…è¦ãªWALセグメントãŒä»–ã®æ–¹æ³•ã§ã‚³ãƒ”ーã•れãŸã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。" -#: access/transam/xlog.c:8873 +#: access/transam/xlog.c:9402 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãŒpg_backup_stopã®å‘¼ã³å‡ºã—å‰ã«çµ‚了ã—ãŸãŸã‚ã€ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯ç•°å¸¸çµ‚了ã—ã¾ã—ãŸ" -#: access/transam/xlogarchive.c:207 +#: access/transam/xlogarchive.c:213 #, c-format msgid "archive file \"%s\" has wrong size: %lld instead of %lld" msgstr "アーカイブファイル\"%s\"ã®ã‚µã‚¤ã‚ºãŒä¸æ­£ã§ã™: %lldã€æ­£ã—ãã¯%lld" -#: access/transam/xlogarchive.c:216 +#: access/transam/xlogarchive.c:222 #, c-format msgid "restored log file \"%s\" from archive" msgstr "ログファイル\"%s\"をアーカイブã‹ã‚‰ãƒªã‚¹ãƒˆã‚¢ã—ã¾ã—ãŸ" -#: access/transam/xlogarchive.c:230 +#: access/transam/xlogarchive.c:236 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "restore_commandãŒçµ‚了ステータス0ã‚’è¿”å´ã—ã¾ã—ãŸãŒã€stat()ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚" +msgid "\"restore_command\" returned a zero exit status, but stat() failed." +msgstr "\"restore_command\"ãŒçµ‚了ステータス0ã‚’è¿”å´ã—ã¾ã—ãŸãŒã€stat()ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚" -#: access/transam/xlogarchive.c:262 +#: access/transam/xlogarchive.c:268 #, c-format msgid "could not restore file \"%s\" from archive: %s" msgstr "ファイル\"%s\"をアーカイブã‹ã‚‰å¾©å…ƒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" @@ -2440,911 +2691,942 @@ msgstr "ファイル\"%s\"をアーカイブã‹ã‚‰å¾©å…ƒã§ãã¾ã›ã‚“ã§ã—㟠#. translator: First %s represents a postgresql.conf parameter name like #. "recovery_end_command", the 2nd is the value of that parameter, the #. third an already translated error message. -#: access/transam/xlogarchive.c:340 +#: access/transam/xlogarchive.c:346 #, c-format msgid "%s \"%s\": %s" msgstr "%s \"%s\": %s" -#: access/transam/xlogarchive.c:450 access/transam/xlogarchive.c:530 +#: access/transam/xlogarchive.c:456 access/transam/xlogarchive.c:536 #, c-format msgid "could not create archive status file \"%s\": %m" msgstr "アーカイブステータスファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/xlogarchive.c:458 access/transam/xlogarchive.c:538 +#: access/transam/xlogarchive.c:464 access/transam/xlogarchive.c:544 #, c-format msgid "could not write archive status file \"%s\": %m" msgstr "アーカイブステータスファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/xlogfuncs.c:75 backup/basebackup.c:973 +#: access/transam/xlogfuncs.c:69 backup/basebackup.c:997 #, c-format msgid "a backup is already in progress in this session" msgstr "ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã§ã¯ã™ã§ã«ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒé€²è¡Œä¸­ã§ã™" -#: access/transam/xlogfuncs.c:146 +#: access/transam/xlogfuncs.c:140 #, c-format msgid "backup is not in progress" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒé€²è¡Œä¸­ã§ã¯ã‚りã¾ã›ã‚“" -#: access/transam/xlogfuncs.c:147 +#: access/transam/xlogfuncs.c:141 #, c-format msgid "Did you call pg_backup_start()?" msgstr "pg_backup_start()を呼ã³å‡ºã—ã¾ã—ãŸã‹?" -#: access/transam/xlogfuncs.c:190 access/transam/xlogfuncs.c:248 access/transam/xlogfuncs.c:287 access/transam/xlogfuncs.c:308 access/transam/xlogfuncs.c:329 +#: access/transam/xlogfuncs.c:184 access/transam/xlogfuncs.c:242 access/transam/xlogfuncs.c:281 access/transam/xlogfuncs.c:302 access/transam/xlogfuncs.c:323 #, c-format msgid "WAL control functions cannot be executed during recovery." msgstr "リカãƒãƒªä¸­ã¯WAL制御関数ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。" -#: access/transam/xlogfuncs.c:215 access/transam/xlogfuncs.c:399 access/transam/xlogfuncs.c:457 +#: access/transam/xlogfuncs.c:209 access/transam/xlogfuncs.c:389 access/transam/xlogfuncs.c:447 #, c-format msgid "%s cannot be executed during recovery." msgstr "リカãƒãƒªä¸­ã¯ %s を実行ã§ãã¾ã›ã‚“。" -#: access/transam/xlogfuncs.c:221 +#: access/transam/xlogfuncs.c:215 #, c-format -msgid "pg_log_standby_snapshot() can only be used if wal_level >= replica" -msgstr "pg_log_standby_snapshot()㯠wal_level >= replica ã®ã¨ãã ã‘使用ã§ãã¾ã™" +msgid "pg_log_standby_snapshot() can only be used if \"wal_level\" >= \"replica\"" +msgstr "pg_log_standby_snapshot()ã¯\"wal_level >= replica\"ã®ã¨ãã ã‘使用ã§ãã¾ã™" -#: access/transam/xlogfuncs.c:253 +#: access/transam/xlogfuncs.c:247 #, c-format msgid "WAL level not sufficient for creating a restore point" msgstr "リストアãƒã‚¤ãƒ³ãƒˆã‚’作るã«ã¯WALレベルãŒä¸è¶³ã—ã¦ã„ã¾ã™" -#: access/transam/xlogfuncs.c:261 +#: access/transam/xlogfuncs.c:255 #, c-format msgid "value too long for restore point (maximum %d characters)" msgstr "リストアãƒã‚¤ãƒ³ãƒˆã¨ã—ã¦ã¯å€¤ãŒé•·ã™ãŽã¾ã™ï¼ˆæœ€å¤§%d文字)" -#: access/transam/xlogfuncs.c:496 +#: access/transam/xlogfuncs.c:486 #, c-format msgid "invalid WAL file name \"%s\"" msgstr "WALファイルå\"%s\"ã¯ä¸æ­£ã§ã™" -#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:562 access/transam/xlogfuncs.c:586 access/transam/xlogfuncs.c:609 access/transam/xlogfuncs.c:689 +#: access/transam/xlogfuncs.c:522 access/transam/xlogfuncs.c:552 access/transam/xlogfuncs.c:576 access/transam/xlogfuncs.c:599 access/transam/xlogfuncs.c:679 #, c-format msgid "recovery is not in progress" msgstr "リカãƒãƒªãŒé€²è¡Œä¸­ã§ã¯ã‚りã¾ã›ã‚“" -#: access/transam/xlogfuncs.c:533 access/transam/xlogfuncs.c:563 access/transam/xlogfuncs.c:587 access/transam/xlogfuncs.c:610 access/transam/xlogfuncs.c:690 +#: access/transam/xlogfuncs.c:523 access/transam/xlogfuncs.c:553 access/transam/xlogfuncs.c:577 access/transam/xlogfuncs.c:600 access/transam/xlogfuncs.c:680 #, c-format msgid "Recovery control functions can only be executed during recovery." msgstr "リカãƒãƒªåˆ¶å¾¡é–¢æ•°ãƒªã‚«ãƒãƒªä¸­ã«ã®ã¿ã‚’実行å¯èƒ½ã§ã™ã€‚" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 +#: access/transam/xlogfuncs.c:528 access/transam/xlogfuncs.c:558 #, c-format msgid "standby promotion is ongoing" msgstr "スタンãƒã‚¤ã®æ˜‡æ ¼ã‚’実行中ã§ã™" -#: access/transam/xlogfuncs.c:539 access/transam/xlogfuncs.c:569 +#: access/transam/xlogfuncs.c:529 access/transam/xlogfuncs.c:559 #, c-format msgid "%s cannot be executed after promotion is triggered." msgstr "%sã¯æ˜‡æ ¼ã‚’é–‹å§‹ã—ãŸå¾Œã«ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。" -#: access/transam/xlogfuncs.c:695 +#: access/transam/xlogfuncs.c:685 #, c-format msgid "\"wait_seconds\" must not be negative or zero" msgstr "\"wait_seconds\"ã¯è² ã®å€¤ã‚‚ã—ãã¯ã‚¼ãƒ­ã«ã¯ã§ãã¾ã›ã‚“" -#: access/transam/xlogfuncs.c:715 storage/ipc/signalfuncs.c:260 +#: access/transam/xlogfuncs.c:707 storage/ipc/signalfuncs.c:265 #, c-format msgid "failed to send signal to postmaster: %m" msgstr "postmasterã«ã‚·ã‚°ãƒŠãƒ«ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/xlogfuncs.c:751 +#: access/transam/xlogfuncs.c:739 libpq/be-secure.c:237 libpq/be-secure.c:346 +#, c-format +msgid "terminating connection due to unexpected postmaster exit" +msgstr "予期ã—ãªã„postmasterã®çµ‚了ã®ãŸã‚ã€ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’終了ã—ã¾ã™" + +#: access/transam/xlogfuncs.c:740 +#, c-format +msgid "while waiting on promotion" +msgstr "昇格ã®å¾…機中" + +#: access/transam/xlogfuncs.c:744 #, c-format msgid "server did not promote within %d second" msgid_plural "server did not promote within %d seconds" msgstr[0] "サーãƒãƒ¼ã¯%dç§’ä»¥å†…ã«æ˜‡æ ¼ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/xlogprefetcher.c:1092 +#: access/transam/xlogprefetcher.c:1088 #, c-format -msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." +msgid "\"recovery_prefetch\" is not supported on platforms that lack posix_fadvise()." msgstr "recovery_prefetchã¯posix_fadvise()ã‚’æŒãŸãªã„プラットフォームã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。" -#: access/transam/xlogreader.c:626 +#: access/transam/xlogreader.c:619 #, c-format msgid "invalid record offset at %X/%X: expected at least %u, got %u" msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚ªãƒ•セットãŒä¸æ­£ã§ã™:最低ã§ã‚‚%uを期待ã—ã¦ã„ã¾ã—ãŸãŒã€å®Ÿéš›ã¯%uã§ã—ãŸ" -#: access/transam/xlogreader.c:635 +#: access/transam/xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "%X/%Xã§ã¯ç¶™ç¶šãƒ¬ã‚³ãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™" -#: access/transam/xlogreader.c:676 access/transam/xlogreader.c:1123 +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰é•·ãŒä¸æ­£ã§ã™:é•·ã•ã¯æœ€ä½Žã§ã‚‚%uを期待ã—ã¦ã„ã¾ã—ãŸãŒã€å®Ÿéš›ã¯%uã§ã—ãŸ" -#: access/transam/xlogreader.c:705 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "é•·ã•%uã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ä¸­ã®ãƒ¡ãƒ¢ãƒªä¸è¶³" - -#: access/transam/xlogreader.c:727 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "%2$X/%3$Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰é•·%1$uãŒå¤§ãã™ãŽã¾ã™" - -#: access/transam/xlogreader.c:776 +#: access/transam/xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "%X/%Xã§contrecordフラグãŒã‚りã¾ã›ã‚“" -#: access/transam/xlogreader.c:789 +#: access/transam/xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "%3$X/%4$Xã®ç¶™ç¶šãƒ¬ã‚³ãƒ¼ãƒ‰ã®é•·ã•%1$u(æ­£ã—ãã¯%2$lld)ã¯ä¸æ­£ã§ã™" -#: access/transam/xlogreader.c:924 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "%X/%Xã«ç¶™ç¶šãƒ¬ã‚³ãƒ¼ãƒ‰ãŒã‚りã¾ã›ã‚“" - -#: access/transam/xlogreader.c:1131 +#: access/transam/xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "%2$X/%3$Xã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ID %1$uã¯ä¸æ­£ã§ã™" -#: access/transam/xlogreader.c:1144 access/transam/xlogreader.c:1160 +#: access/transam/xlogreader.c:1155 access/transam/xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "%3$X/%4$Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®å¾Œæ–¹ãƒªãƒ³ã‚¯%1$X/%2$XãŒä¸æ­£ã§ã™" -#: access/transam/xlogreader.c:1196 +#: access/transam/xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰å†…ã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ‡ãƒ¼ã‚¿ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸æ­£ã§ã™" -#: access/transam/xlogreader.c:1230 +#: access/transam/xlogreader.c:1243 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%2$sã€LSN %3$X/%4$Xã€ã‚ªãƒ•セット%5$uã§ä¸æ­£ãªãƒžã‚¸ãƒƒã‚¯ãƒŠãƒ³ãƒãƒ¼%1$04X" -#: access/transam/xlogreader.c:1245 access/transam/xlogreader.c:1287 +#: access/transam/xlogreader.c:1258 access/transam/xlogreader.c:1300 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント %2$sã€LSN %3$X/%4$Xã€ã‚ªãƒ•セット%5$uã§ä¸æ­£ãªæƒ…報ビット列%1$04X" -#: access/transam/xlogreader.c:1261 +#: access/transam/xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WALファイルã¯ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ç”±æ¥ã®ã‚‚ã®ã§ã™: WALファイルã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ã¯ %lluã§ã€pg_control ã«ãŠã‘るデータベースシステム識別å­ã¯ %lluã§ã™" -#: access/transam/xlogreader.c:1269 +#: access/transam/xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL ファイルã¯ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ç”±æ¥ã®ã‚‚ã®ã§ã™: ページヘッダーã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚ºãŒæ­£ã—ãã‚りã¾ã›ã‚“" -#: access/transam/xlogreader.c:1275 +#: access/transam/xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL ファイルã¯ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ç”±æ¥ã®ã‚‚ã®ã§ã™: ページヘッダーã®XLOG_BLCKSZãŒæ­£ã—ãã‚りã¾ã›ã‚“" -#: access/transam/xlogreader.c:1307 +#: access/transam/xlogreader.c:1320 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%3$sã€LSN %4$X/%5$Xã€ã‚ªãƒ•セット%6$uã§æƒ³å®šå¤–ã®ãƒšãƒ¼ã‚¸ã‚¢ãƒ‰ãƒ¬ã‚¹%1$X/%2$X" -#: access/transam/xlogreader.c:1333 +#: access/transam/xlogreader.c:1346 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%3$sã€LSN %4$X/%5$Xã€ã‚ªãƒ•セット%6$uã§ç•°å¸¸ãªé †åºã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ID %1$u(%2$uã®å¾Œ)" -#: access/transam/xlogreader.c:1739 +#: access/transam/xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %uãŒ%X/%Xã§ä¸æ­£ã§ã™" -#: access/transam/xlogreader.c:1763 +#: access/transam/xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATAãŒè¨­å®šã•れã¦ã„ã¾ã™ãŒã€%X/%Xã«ãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã›ã‚“" -#: access/transam/xlogreader.c:1770 +#: access/transam/xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATAãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“ãŒã€%2$X/%3$Xã®ãƒ‡ãƒ¼ã‚¿é•·ã¯%1$uã§ã™" -#: access/transam/xlogreader.c:1806 +#: access/transam/xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEãŒè¨­å®šã•れã¦ã„ã¾ã™ãŒã€%4$X/%5$Xã§ãƒ›ãƒ¼ãƒ«ã‚ªãƒ•セット%1$uã€é•·ã•%2$uã€ãƒ–ロックイメージ長%3$uã§ã™" -#: access/transam/xlogreader.c:1822 +#: access/transam/xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“ãŒã€%3$X/%4$Xã«ãŠã‘るホールオフセット%1$uã®é•·ã•ãŒ%2$uã§ã™" -#: access/transam/xlogreader.c:1836 +#: access/transam/xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSEDãŒè¨­å®šã•れã¦ã„ã¾ã™ãŒã€%2$X/%3$Xã«ãŠã„ã¦ãƒ–ロックイメージ長ãŒ%1$uã§ã™" -#: access/transam/xlogreader.c:1851 +#: access/transam/xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEã‚‚BKPIMAGE_COMPRESSEDも設定ã•れã¦ã„ã¾ã›ã‚“ãŒã€%2$X/%3$Xã«ãŠã„ã¦ãƒ–ロックイメージ長ãŒ%1$uã§ã™" -#: access/transam/xlogreader.c:1867 +#: access/transam/xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_RELãŒè¨­å®šã•れã¦ã„ã¾ã™ãŒã€%X/%Xã«ãŠã„ã¦ä»¥å‰ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã›ã‚“" -#: access/transam/xlogreader.c:1879 +#: access/transam/xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "%2$X/%3$Xã«ãŠã‘ã‚‹block_id %1$uãŒä¸æ­£ã§ã™" -#: access/transam/xlogreader.c:1946 +#: access/transam/xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã‚µã‚¤ã‚ºãŒä¸æ­£ã§ã™" -#: access/transam/xlogreader.c:1972 +#: access/transam/xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "WALレコード中ID %dã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ブロックを特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/xlogreader.c:2056 +#: access/transam/xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "%X/%Xã§ä¸æ­£ãªãƒ–ロック%dãŒæŒ‡å®šã•れã¦ã„ã‚‹ãŸã‚イメージãŒå¾©å…ƒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/xlogreader.c:2063 +#: access/transam/xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "%X/%Xã§ãƒ–ロック%dã®ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒä¸æ­£ãªçŠ¶æ…‹ã§ã‚ã‚‹ãŸã‚復元ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/xlogreader.c:2090 access/transam/xlogreader.c:2107 +#: access/transam/xlogreader.c:2100 access/transam/xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "%1$X/%2$Xã§ã€ãƒ–ロック%4$dãŒã“ã®ãƒ“ルドã§ã‚µãƒãƒ¼ãƒˆã•れãªã„圧縮方å¼%3$sã§åœ§ç¸®ã•れã¦ã„ã‚‹ãŸã‚復元ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/xlogreader.c:2116 +#: access/transam/xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "%X/%Xã§ãƒ–ロック%dã®ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒä¸æ˜Žãªæ–¹å¼ã§åœ§ç¸®ã•れã¦ã„ã‚‹ãŸã‚復元ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/xlogreader.c:2124 +#: access/transam/xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "%X/%Xã®ãƒ–ロック%dãŒä¼¸å¼µã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/xlogrecovery.c:547 -#, c-format -msgid "entering standby mode" -msgstr "スタンãƒã‚¤ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™" - -#: access/transam/xlogrecovery.c:550 -#, c-format -msgid "starting point-in-time recovery to XID %u" -msgstr "XID%uã¾ã§ã®ãƒã‚¤ãƒ³ãƒˆã‚¤ãƒ³ã‚¿ã‚¤ãƒ ãƒªã‚«ãƒãƒªã‚’é–‹å§‹ã—ã¾ã™" - -#: access/transam/xlogrecovery.c:554 -#, c-format -msgid "starting point-in-time recovery to %s" -msgstr "%sã¾ã§ã®ãƒã‚¤ãƒ³ãƒˆã‚¤ãƒ³ã‚¿ã‚¤ãƒ ãƒªã‚«ãƒãƒªã‚’é–‹å§‹ã—ã¾ã™" - -#: access/transam/xlogrecovery.c:558 -#, c-format -msgid "starting point-in-time recovery to \"%s\"" -msgstr "\"%s\"ã¾ã§ã®ãƒã‚¤ãƒ³ãƒˆã‚¤ãƒ³ã‚¿ã‚¤ãƒ ãƒªã‚«ãƒãƒªã‚’é–‹å§‹ã—ã¾ã™" - -#: access/transam/xlogrecovery.c:562 -#, c-format -msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" -msgstr "WALä½ç½®(LSN) \"%X/%X\"ã¾ã§ã®ãƒã‚¤ãƒ³ãƒˆã‚¤ãƒ³ã‚¿ã‚¤ãƒ ãƒªã‚«ãƒãƒªã‚’é–‹å§‹ã—ã¾ã™" - -#: access/transam/xlogrecovery.c:566 -#, c-format -msgid "starting point-in-time recovery to earliest consistent point" -msgstr "最もå¤ã„一貫性確ä¿ç‚¹ã¾ã§ã®ãƒã‚¤ãƒ³ãƒˆã‚¤ãƒ³ã‚¿ã‚¤ãƒ ãƒªã‚«ãƒãƒªã‚’é–‹å§‹ã—ã¾ã™" - -#: access/transam/xlogrecovery.c:569 +#: access/transam/xlogrecovery.c:617 #, c-format -msgid "starting archive recovery" -msgstr "アーカイブリカãƒãƒªã‚’é–‹å§‹ã—ã¦ã„ã¾ã™" +msgid "starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on timeline ID %u" +msgstr "タイムラインID %5$u上ã§REDO LSN %1$X/%2$Xã€ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆLSN %3$X/%4$Xã‹ã‚‰ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—・リカãƒãƒªã‚’é–‹å§‹ã—ã¾ã—ãŸ" -#: access/transam/xlogrecovery.c:653 +#: access/transam/xlogrecovery.c:649 #, c-format -msgid "could not find redo location referenced by checkpoint record" -msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰ãŒå‚ç…§ã—ã¦ã„ã‚‹ redo ä½ç½®ã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸ" +msgid "could not find redo location %X/%X referenced by checkpoint record at %X/%X" +msgstr "%3$X/%4$Xã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰ãŒå‚ç…§ã—ã¦ã„ã‚‹redoä½ç½®%1$X/%2$Xを見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/xlogrecovery.c:654 access/transam/xlogrecovery.c:664 +#: access/transam/xlogrecovery.c:651 access/transam/xlogrecovery.c:662 #, c-format msgid "" -"If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" +"If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/standby.signal\" and add required recovery options.\n" "If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" "Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." msgstr "" -"ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰å¾©æ—§ã—ã¦ã„ã‚‹ã®ã§ã‚れã°ã€touch \"%s/recovery.signal\" ã®å®Ÿè¡ŒãŠã‚ˆã³å¿…è¦ãªã‚ªãƒ—ションã®è¿½åŠ ã‚’è¡Œã£ã¦ãã ã•ã„。\n" -"ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰ã®å¾©æ—§ã§ãªã‘れã°ã€\"%s/backup_label\"ã®å‰Šé™¤ã‚’試ã¿ã¦ãã ã•ã„。.\n" -"ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰å¾©æ—§ã§\"%s/backup_label\"を削除ã™ã‚‹ã¨ã€ã‚¯ãƒ©ã‚¹ã‚¿ã¯å£Šã‚ŒãŸçŠ¶æ…‹ã§å¾©æ—§ã•れるã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。" +"ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰å¾©æ—§ã—ã¦ã„ã‚‹ã®ã§ã‚れã°ã€touch \"%s/recovery.signal\" ã¾ãŸã¯ touch \"%s/standby.signal\" ã®å®Ÿè¡ŒãŠã‚ˆã³\n" +"å¿…è¦ãªã‚ªãƒ—ションã®è¿½åŠ ã‚’è¡Œã£ã¦ãã ã•ã„。\n" +" ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰ã®å¾©æ—§ã§ãªã‘れã°ã€\"%s/backup_label\"ã®å‰Šé™¤ã‚’試ã¿ã¦ãã ã•ã„。.\n" +"ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‹ã‚‰ã®å¾©æ—§ã§\"%s/backup_label\"を削除ã™ã‚‹ã¨ã€ã‚¯ãƒ©ã‚¹ã‚¿ãŒç ´å£Šã•れるã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。" -#: access/transam/xlogrecovery.c:663 +#: access/transam/xlogrecovery.c:660 #, c-format -msgid "could not locate required checkpoint record" -msgstr "å¿…è¦ãªãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" +msgid "could not locate required checkpoint record at %X/%X" +msgstr "å¿…é ˆã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãŒ%X/%Xã§è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: access/transam/xlogrecovery.c:692 commands/tablespace.c:670 +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:664 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/xlogrecovery.c:724 access/transam/xlogrecovery.c:730 +#: access/transam/xlogrecovery.c:723 access/transam/xlogrecovery.c:729 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "ファイル\"%2$s\"ãŒå­˜åœ¨ã—ãªã„ãŸã‚ファイル\"%1$s\"を無視ã—ã¾ã™" -#: access/transam/xlogrecovery.c:726 +#: access/transam/xlogrecovery.c:725 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "ファイル\"%s\"ã¯\"%s\"ã«ãƒªãƒãƒ¼ãƒ ã•れã¾ã—ãŸã€‚" -#: access/transam/xlogrecovery.c:732 +#: access/transam/xlogrecovery.c:731 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m。" -#: access/transam/xlogrecovery.c:786 +#: access/transam/xlogrecovery.c:770 #, c-format -msgid "could not locate a valid checkpoint record" -msgstr "有効ãªãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" +msgid "restarting backup recovery with redo LSN %X/%X" +msgstr "REDO LSN %X/%Xã®ãƒãƒƒã‚¯ã‚¢ãƒ—リカãƒãƒªã‚’å†é–‹ã—ã¾ã—ãŸ" -#: access/transam/xlogrecovery.c:810 +#: access/transam/xlogrecovery.c:795 +#, c-format +msgid "could not locate a valid checkpoint record at %X/%X" +msgstr "%X/%Xã«ã¯æœ‰åйãªãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" + +#: access/transam/xlogrecovery.c:806 +#, c-format +msgid "entering standby mode" +msgstr "スタンãƒã‚¤ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™" + +#: access/transam/xlogrecovery.c:809 +#, c-format +msgid "starting point-in-time recovery to XID %u" +msgstr "XID%uã¾ã§ã®ãƒã‚¤ãƒ³ãƒˆã‚¤ãƒ³ã‚¿ã‚¤ãƒ ãƒªã‚«ãƒãƒªã‚’é–‹å§‹ã—ã¾ã™" + +#: access/transam/xlogrecovery.c:813 +#, c-format +msgid "starting point-in-time recovery to %s" +msgstr "%sã¾ã§ã®ãƒã‚¤ãƒ³ãƒˆã‚¤ãƒ³ã‚¿ã‚¤ãƒ ãƒªã‚«ãƒãƒªã‚’é–‹å§‹ã—ã¾ã™" + +#: access/transam/xlogrecovery.c:817 +#, c-format +msgid "starting point-in-time recovery to \"%s\"" +msgstr "\"%s\"ã¾ã§ã®ãƒã‚¤ãƒ³ãƒˆã‚¤ãƒ³ã‚¿ã‚¤ãƒ ãƒªã‚«ãƒãƒªã‚’é–‹å§‹ã—ã¾ã™" + +#: access/transam/xlogrecovery.c:821 +#, c-format +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "WALä½ç½®(LSN) \"%X/%X\"ã¾ã§ã®ãƒã‚¤ãƒ³ãƒˆã‚¤ãƒ³ã‚¿ã‚¤ãƒ ãƒªã‚«ãƒãƒªã‚’é–‹å§‹ã—ã¾ã™" + +#: access/transam/xlogrecovery.c:825 +#, c-format +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "最もå¤ã„一貫性確ä¿ç‚¹ã¾ã§ã®ãƒã‚¤ãƒ³ãƒˆã‚¤ãƒ³ã‚¿ã‚¤ãƒ ãƒªã‚«ãƒãƒªã‚’é–‹å§‹ã—ã¾ã™" + +#: access/transam/xlogrecovery.c:828 +#, c-format +msgid "starting archive recovery" +msgstr "アーカイブリカãƒãƒªã‚’é–‹å§‹ã—ã¦ã„ã¾ã™" + +#: access/transam/xlogrecovery.c:849 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "è¦æ±‚ã•れãŸã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uã¯ã“ã®ã‚µãƒ¼ãƒãƒ¼ã®å±¥æ­´ã‹ã‚‰ã®å­å­«ã§ã¯ã‚りã¾ã›ã‚“" -#: access/transam/xlogrecovery.c:812 +#: access/transam/xlogrecovery.c:851 #, c-format msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." msgstr "タイムライン%3$uã®æœ€çµ‚ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã¯%1$X/%2$Xã§ã™ãŒã€è¦æ±‚ã•れãŸã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ã®å±¥æ­´ã®ä¸­ã§ã¯ã‚µãƒ¼ãƒãƒ¼ã¯ãã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ã‹ã‚‰%4$X/%5$Xã§åˆ†å²ã—ã¦ã„ã¾ã™ã€‚" -#: access/transam/xlogrecovery.c:826 +#: access/transam/xlogrecovery.c:865 #, c-format msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" msgstr "è¦æ±‚ã•れãŸã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%1$uã¯ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%4$uã®æœ€å°ãƒªã‚«ãƒãƒªãƒã‚¤ãƒ³ãƒˆ%2$X/%3$Xã‚’å«ã¿ã¾ã›ã‚“" -#: access/transam/xlogrecovery.c:854 +#: access/transam/xlogrecovery.c:893 #, c-format msgid "invalid next transaction ID" msgstr "次ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDãŒä¸æ­£ã§ã™" -#: access/transam/xlogrecovery.c:859 +#: access/transam/xlogrecovery.c:898 #, c-format msgid "invalid redo in checkpoint record" msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰å†…ã®ä¸æ­£ãªREDO" -#: access/transam/xlogrecovery.c:870 +#: access/transam/xlogrecovery.c:909 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "シャットダウン・ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã‘ã‚‹ä¸æ­£ãªREDOレコード" -#: access/transam/xlogrecovery.c:899 +#: access/transam/xlogrecovery.c:938 #, c-format msgid "database system was not properly shut down; automatic recovery in progress" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã¯æ­£ã—ãシャットダウンã•れã¦ã„ã¾ã›ã‚“; 自動リカãƒãƒªã‚’実行中" -#: access/transam/xlogrecovery.c:903 +#: access/transam/xlogrecovery.c:942 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "タイムライン%uã‹ã‚‰ã€ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uを目標ã¨ã—ã¦ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ãƒªã‚«ãƒãƒªã‚’é–‹å§‹ã—ã¾ã™" -#: access/transam/xlogrecovery.c:946 +#: access/transam/xlogrecovery.c:985 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_labelã«åˆ¶å¾¡ãƒ•ã‚¡ã‚¤ãƒ«ã¨æ•´åˆã—ãªã„データãŒå«ã¾ã‚Œã¾ã™" -#: access/transam/xlogrecovery.c:947 +#: access/transam/xlogrecovery.c:986 #, c-format msgid "This means that the backup is corrupted and you will have to use another backup for recovery." msgstr "ã“れã¯ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒç ´æã—ã¦ãŠã‚Šã€ãƒªã‚«ãƒãƒªã«ã¯ä»–ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を使用ã—ãªã‘れã°ãªã‚‰ãªã„ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚" -#: access/transam/xlogrecovery.c:1001 +#: access/transam/xlogrecovery.c:1040 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "リカãƒãƒªã‚³ãƒžãƒ³ãƒ‰ãƒ•ァイル \"%s\"ã®ä½¿ç”¨ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: access/transam/xlogrecovery.c:1066 +#: access/transam/xlogrecovery.c:1105 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "スタンãƒã‚¤ãƒ¢ãƒ¼ãƒ‰ã¯ã‚·ãƒ³ã‚°ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚µãƒ¼ãƒãƒ¼ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: access/transam/xlogrecovery.c:1083 +#: access/transam/xlogrecovery.c:1122 #, c-format -msgid "specified neither primary_conninfo nor restore_command" -msgstr "primary_conninfo 㨠restore_command ã®ã©ã¡ã‚‰ã‚‚指定ã•れã¦ã„ã¾ã›ã‚“" +msgid "specified neither \"primary_conninfo\" nor \"restore_command\"" +msgstr "\"primary_conninfo\"ã¨\"restore_command\"ã®ã©ã¡ã‚‰ã‚‚指定ã•れã¦ã„ã¾ã›ã‚“" -#: access/transam/xlogrecovery.c:1084 +#: access/transam/xlogrecovery.c:1123 #, c-format msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." msgstr "データベースサーãƒãƒ¼ã¯pg_walサブディレクトリã«ç½®ã‹ã‚ŒãŸãƒ•ァイルを定期的ã«ç¢ºèªã—ã¾ã™ã€‚" -#: access/transam/xlogrecovery.c:1092 +#: access/transam/xlogrecovery.c:1131 #, c-format -msgid "must specify restore_command when standby mode is not enabled" -msgstr "スタンãƒã‚¤ãƒ¢ãƒ¼ãƒ‰ã‚’有効ã«ã—ãªã„å ´åˆã¯ã€restore_command ã®æŒ‡å®šãŒå¿…è¦ã§ã™" +msgid "must specify \"restore_command\" when standby mode is not enabled" +msgstr "スタンãƒã‚¤ãƒ¢ãƒ¼ãƒ‰ã‚’有効ã«ã—ãªã„å ´åˆã¯ã€\"restore_command\"ã®æŒ‡å®šãŒå¿…è¦ã§ã™" -#: access/transam/xlogrecovery.c:1130 +#: access/transam/xlogrecovery.c:1169 #, c-format msgid "recovery target timeline %u does not exist" msgstr "リカãƒãƒªç›®æ¨™ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uãŒå­˜åœ¨ã—ã¾ã›ã‚“" -#: access/transam/xlogrecovery.c:1213 access/transam/xlogrecovery.c:1220 access/transam/xlogrecovery.c:1279 access/transam/xlogrecovery.c:1359 access/transam/xlogrecovery.c:1383 +#: access/transam/xlogrecovery.c:1252 access/transam/xlogrecovery.c:1259 access/transam/xlogrecovery.c:1318 access/transam/xlogrecovery.c:1406 access/transam/xlogrecovery.c:1415 access/transam/xlogrecovery.c:1435 #, c-format msgid "invalid data in file \"%s\"" msgstr "ファイル\"%s\"内ã®ä¸æ­£ãªãƒ‡ãƒ¼ã‚¿" -#: access/transam/xlogrecovery.c:1280 +#: access/transam/xlogrecovery.c:1319 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "読ã¿å–られãŸã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³IDã¯%uã§ã—ãŸãŒã€%uã§ã‚ã‚‹ã¯ãšã§ã™ã€‚" -#: access/transam/xlogrecovery.c:1662 +#: access/transam/xlogrecovery.c:1330 +#, c-format +msgid "this is an incremental backup, not a data directory" +msgstr "ã“れã¯ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ãªãã€å·®åˆ†ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ã™" + +#: access/transam/xlogrecovery.c:1331 +#, c-format +msgid "Use pg_combinebackup to reconstruct a valid data directory." +msgstr "有効ãªãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’冿§‹ç¯‰ã™ã‚‹ã«ã¯pg_combinebackupを使ã£ã¦ãã ã•ã„。" + +#: access/transam/xlogrecovery.c:1717 +#, c-format +msgid "unexpected record type found at redo point %X/%X" +msgstr "REDOãƒã‚¤ãƒ³ãƒˆ%X/%Xã§æƒ³å®šå¤–ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚¿ã‚¤ãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ" + +#: access/transam/xlogrecovery.c:1740 #, c-format msgid "redo starts at %X/%X" msgstr "REDOã‚’%X/%Xã‹ã‚‰é–‹å§‹ã—ã¾ã™" -#: access/transam/xlogrecovery.c:1675 +#: access/transam/xlogrecovery.c:1753 #, c-format msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" msgstr "REDO進行中ã€çµŒéŽæ™‚é–“ %ld.%02dç§’, ç¾åœ¨ã®LSN: %X/%X" -#: access/transam/xlogrecovery.c:1767 +#: access/transam/xlogrecovery.c:1843 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "è¦æ±‚ã•れãŸãƒªã‚«ãƒãƒªåœæ­¢ãƒã‚¤ãƒ³ãƒˆã¯ã€ä¸€è²«æ€§ãŒã‚るリカãƒãƒªãƒã‚¤ãƒ³ãƒˆã‚ˆã‚Šå‰ã«ã‚りã¾ã™" -#: access/transam/xlogrecovery.c:1799 +#: access/transam/xlogrecovery.c:1875 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "REDOãŒ%X/%Xã§çµ‚了ã—ã¾ã—ãŸã€ã‚·ã‚¹ãƒ†ãƒ ä½¿ç”¨çжæ³: %s" -#: access/transam/xlogrecovery.c:1805 +#: access/transam/xlogrecovery.c:1881 #, c-format msgid "last completed transaction was at log time %s" msgstr "最後ã«å®Œäº†ã—ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ãƒ­ã‚°æ™‚刻ã¯%sã§ã—ãŸ" -#: access/transam/xlogrecovery.c:1814 +#: access/transam/xlogrecovery.c:1890 #, c-format msgid "redo is not required" msgstr "REDOã¯å¿…è¦ã‚りã¾ã›ã‚“" -#: access/transam/xlogrecovery.c:1825 +#: access/transam/xlogrecovery.c:1901 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "指定ã—ãŸãƒªã‚«ãƒãƒªã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«åˆ°é”ã™ã‚‹å‰ã«ãƒªã‚«ãƒãƒªãŒçµ‚了ã—ã¾ã—ãŸ" -#: access/transam/xlogrecovery.c:2019 +#: access/transam/xlogrecovery.c:2095 #, c-format msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" msgstr "%X/%Xã§%sã«ä¸Šæ›¸ãã•れã¦å¤±ã‚れãŸç¶™ç¶šè¡Œã‚’正常ã«ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã—ãŸ" -#: access/transam/xlogrecovery.c:2086 +#: access/transam/xlogrecovery.c:2162 #, c-format msgid "unexpected directory entry \"%s\" found in %s" msgstr "%2$s ã§æƒ³å®šå¤–ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚¨ãƒ³ãƒˆãƒª\"%1$s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ" -#: access/transam/xlogrecovery.c:2088 +#: access/transam/xlogrecovery.c:2164 #, c-format msgid "All directory entries in pg_tblspc/ should be symbolic links." -msgstr "Pg_tblspc/ ã®ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚¨ãƒ³ãƒˆãƒªã¯ã€ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" +msgstr "pg_tblspc/ 内ã®ã™ã¹ã¦ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚¨ãƒ³ãƒˆãƒªã¯ã€ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: access/transam/xlogrecovery.c:2089 +#: access/transam/xlogrecovery.c:2165 #, c-format -msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." -msgstr "ã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’削除ã™ã‚‹ã‹ã€ã¾ãŸã¯allow_in_place_tablespacesを一時的ã«ONã«è¨­å®šã™ã‚‹ã“ã¨ã§ãƒªã‚«ãƒãƒªã‚’完了ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" +msgid "Remove those directories, or set \"allow_in_place_tablespaces\" to ON transiently to let recovery complete." +msgstr "ã“れらã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’削除ã™ã‚‹ã‹ã€ã¾ãŸã¯\"allow_in_place_tablespaces\"を一時的ã«ONã«è¨­å®šã™ã‚‹ã“ã¨ã§ãƒªã‚«ãƒãƒªã‚’完了ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: access/transam/xlogrecovery.c:2163 +#: access/transam/xlogrecovery.c:2217 +#, c-format +msgid "completed backup recovery with redo LSN %X/%X and end LSN %X/%X" +msgstr "REDO LSN%X/%Xã€çµ‚了LSN %X/%Xã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—・リカãƒãƒªãŒå®Œäº†ã—ã¾ã—ãŸ" + +#: access/transam/xlogrecovery.c:2247 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "%X/%X ã§ãƒªã‚«ãƒãƒªã®ä¸€è²«æ€§ãŒç¢ºä¿ã•れã¾ã—ãŸ" #. translator: %s is a WAL record description -#: access/transam/xlogrecovery.c:2201 +#: access/transam/xlogrecovery.c:2285 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "%X/%Xã«ã‚ã‚‹%sã®WALå†ç”Ÿ" -#: access/transam/xlogrecovery.c:2299 +#: access/transam/xlogrecovery.c:2383 #, c-format msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰ã«ãŠã„ã¦æƒ³å®šå¤–ã®å‰å›žã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ID %u(ç¾åœ¨ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³IDã¯%u)ãŒã‚りã¾ã—ãŸ" -#: access/transam/xlogrecovery.c:2308 +#: access/transam/xlogrecovery.c:2392 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰ã«ãŠã„ã¦æƒ³å®šå¤–ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ID %u (%uã®å¾Œ)ãŒã‚りã¾ã—ãŸ" -#: access/transam/xlogrecovery.c:2324 +#: access/transam/xlogrecovery.c:2408 #, c-format msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" msgstr "タイムライン%4$uã®æœ€å°ãƒªã‚«ãƒãƒªãƒã‚¤ãƒ³ãƒˆ%2$X/%3$Xã«é”ã™ã‚‹å‰ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰å†…ã®æƒ³å®šå¤–ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ID%1$u。" -#: access/transam/xlogrecovery.c:2508 access/transam/xlogrecovery.c:2784 +#: access/transam/xlogrecovery.c:2592 access/transam/xlogrecovery.c:2868 #, c-format msgid "recovery stopping after reaching consistency" msgstr "リカãƒãƒªå‡¦ç†ã¯ä¸€è²«æ€§ç¢ºä¿å¾Œã«åœæ­¢ã—ã¾ã™" -#: access/transam/xlogrecovery.c:2529 +#: access/transam/xlogrecovery.c:2613 #, c-format msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" msgstr "リカãƒãƒªå‡¦ç†ã¯WALä½ç½®(LSN)\"%X/%X\"ã®å‰ã§åœæ­¢ã—ã¾ã™" -#: access/transam/xlogrecovery.c:2619 +#: access/transam/xlogrecovery.c:2703 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "リカãƒãƒªå‡¦ç†ã¯ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%uã®ã‚³ãƒŸãƒƒãƒˆã€æ™‚刻%sã®å‰ã«åœæ­¢ã—ã¾ã™" -#: access/transam/xlogrecovery.c:2626 +#: access/transam/xlogrecovery.c:2710 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "リカãƒãƒªå‡¦ç†ã¯ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%uã®ã‚¢ãƒœãƒ¼ãƒˆã€æ™‚刻%sã®å‰ã«åœæ­¢ã—ã¾ã™" -#: access/transam/xlogrecovery.c:2679 +#: access/transam/xlogrecovery.c:2763 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "リカãƒãƒªå‡¦ç†ã¯å¾©å…ƒãƒã‚¤ãƒ³ãƒˆ\"%s\"ã€æ™‚刻%s ã«åœæ­¢ã—ã¾ã™" -#: access/transam/xlogrecovery.c:2697 +#: access/transam/xlogrecovery.c:2781 #, c-format msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" msgstr "リカãƒãƒªå‡¦ç†ã¯WALä½ç½®(LSN)\"%X/%X\"ã®å¾Œã§åœæ­¢ã—ã¾ã™" -#: access/transam/xlogrecovery.c:2764 +#: access/transam/xlogrecovery.c:2848 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "リカãƒãƒªå‡¦ç†ã¯ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%uã®ã‚³ãƒŸãƒƒãƒˆã€æ™‚刻%sã®å¾Œã«åœæ­¢ã—ã¾ã™" -#: access/transam/xlogrecovery.c:2772 +#: access/transam/xlogrecovery.c:2856 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "リカãƒãƒªå‡¦ç†ã¯ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%uã®ã‚¢ãƒœãƒ¼ãƒˆã€æ™‚刻%sã®å¾Œã«åœæ­¢ã—ã¾ã™" -#: access/transam/xlogrecovery.c:2853 +#: access/transam/xlogrecovery.c:2937 #, c-format msgid "pausing at the end of recovery" msgstr "リカãƒãƒªå®Œäº†ä½ç½®ã§ä¸€æ™‚åœæ­¢ã—ã¦ã„ã¾ã™" -#: access/transam/xlogrecovery.c:2854 +#: access/transam/xlogrecovery.c:2938 #, c-format msgid "Execute pg_wal_replay_resume() to promote." msgstr "å†é–‹ã™ã‚‹ã«ã¯ pg_wal_replay_resume() を実行ã—ã¦ãã ã•ã„" -#: access/transam/xlogrecovery.c:2857 access/transam/xlogrecovery.c:4594 +#: access/transam/xlogrecovery.c:2941 access/transam/xlogrecovery.c:4679 #, c-format msgid "recovery has paused" msgstr "リカãƒãƒªã¯ä¸€æ™‚åœæ­¢ä¸­ã§ã™" -#: access/transam/xlogrecovery.c:2858 +#: access/transam/xlogrecovery.c:2942 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "å†é–‹ã™ã‚‹ã«ã¯ pg_xlog_replay_resume() を実行ã—ã¦ãã ã•ã„" -#: access/transam/xlogrecovery.c:3121 +#: access/transam/xlogrecovery.c:3205 #, c-format msgid "unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%2$sã€LSN %3$X/%4$Xã€ã‚ªãƒ•セット%5$uã§æƒ³å®šå¤–ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ID%1$u" -#: access/transam/xlogrecovery.c:3329 +#: access/transam/xlogrecovery.c:3413 #, c-format msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: %m" msgstr "WALセグメント%sã€LSN %X/%Xã€ã‚ªãƒ•セット%uを読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/xlogrecovery.c:3336 +#: access/transam/xlogrecovery.c:3420 #, c-format msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu" msgstr "WALセグメント%1$sã€LSN %2$X/%3$Xã€ã‚ªãƒ•セット%4$uを読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %6$zu 中 %5$d ã®èª­ã¿è¾¼ã¿" -#: access/transam/xlogrecovery.c:3976 +#: access/transam/xlogrecovery.c:4061 #, c-format msgid "invalid checkpoint location" msgstr "䏿­£ãªãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆä½ç½®" -#: access/transam/xlogrecovery.c:3986 +#: access/transam/xlogrecovery.c:4071 #, c-format msgid "invalid checkpoint record" msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰ãŒä¸æ­£ã§ã™" -#: access/transam/xlogrecovery.c:3992 +#: access/transam/xlogrecovery.c:4077 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰å†…ã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£IDãŒã§ä¸æ­£ã§ã™" -#: access/transam/xlogrecovery.c:4000 +#: access/transam/xlogrecovery.c:4085 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰å†…ã®xl_infoãŒä¸æ­£ã§ã™" -#: access/transam/xlogrecovery.c:4006 +#: access/transam/xlogrecovery.c:4091 #, c-format msgid "invalid length of checkpoint record" msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãƒ¬ã‚³ãƒ¼ãƒ‰é•·ãŒä¸æ­£ã§ã™" -#: access/transam/xlogrecovery.c:4060 +#: access/transam/xlogrecovery.c:4145 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "æ–°ã—ã„タイムライン%uã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uã®å­ã§ã¯ã‚りã¾ã›ã‚“" -#: access/transam/xlogrecovery.c:4074 +#: access/transam/xlogrecovery.c:4159 #, c-format msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" msgstr "æ–°ã—ã„タイムライン%uã¯ç¾åœ¨ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uã‹ã‚‰ç¾åœ¨ã®ãƒªã‚«ãƒãƒªãƒã‚¤ãƒ³ãƒˆ%X/%Xよりå‰ã«åˆ†å²ã—ã¦ã„ã¾ã™" -#: access/transam/xlogrecovery.c:4093 +#: access/transam/xlogrecovery.c:4178 #, c-format msgid "new target timeline is %u" msgstr "æ–°ã—ã„目標タイムラインã¯%uã§ã™" -#: access/transam/xlogrecovery.c:4296 +#: access/transam/xlogrecovery.c:4381 #, c-format msgid "WAL receiver process shutdown requested" msgstr "wal receiverプロセスã®ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ãŒè¦æ±‚ã•れã¾ã—ãŸ" -#: access/transam/xlogrecovery.c:4356 +#: access/transam/xlogrecovery.c:4441 #, c-format msgid "received promote request" msgstr "æ˜‡æ ¼è¦æ±‚ã‚’å—ä¿¡ã—ã¾ã—ãŸ" -#: access/transam/xlogrecovery.c:4585 +#: access/transam/xlogrecovery.c:4670 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "ä¸å分ãªãƒ‘ラメータ設定ã®ãŸã‚ã€ãƒ›ãƒƒãƒˆã‚¹ã‚¿ãƒ³ãƒã‚¤ã‚’使用ã§ãã¾ã›ã‚“" -#: access/transam/xlogrecovery.c:4586 access/transam/xlogrecovery.c:4613 access/transam/xlogrecovery.c:4643 +#: access/transam/xlogrecovery.c:4671 access/transam/xlogrecovery.c:4698 access/transam/xlogrecovery.c:4728 #, c-format msgid "%s = %d is a lower setting than on the primary server, where its value was %d." msgstr "%s = %d ã¯ãƒ—ライマリサーãƒãƒ¼ã®è¨­å®šå€¤ã‚ˆã‚Šå°ã•ã„ã§ã™ã€ãƒ—ライマリサーãƒãƒ¼ã§ã¯ã“ã®å€¤ã¯%dã§ã—ãŸã€‚" -#: access/transam/xlogrecovery.c:4595 +#: access/transam/xlogrecovery.c:4680 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "リカãƒãƒªã®ä¸€æ™‚åœæ­¢ã‚’解除ã™ã‚‹ã¨ã€ã‚µãƒ¼ãƒãƒ¼ã¯ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã—ã¾ã™ã€‚" -#: access/transam/xlogrecovery.c:4596 +#: access/transam/xlogrecovery.c:4681 #, c-format msgid "You can then restart the server after making the necessary configuration changes." msgstr "ãã®å¾Œã€å¿…è¦ãªè¨­å®šå¤‰æ›´ã‚’行ã£ãŸå¾Œã«ã‚µãƒ¼ãƒãƒ¼ã‚’å†èµ·å‹•ã§ãã¾ã™ã€‚" -#: access/transam/xlogrecovery.c:4607 +#: access/transam/xlogrecovery.c:4692 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "ä¸å分ãªãƒ‘ラメータ設定ã®ãŸã‚ã€æ˜‡æ ¼ã§ãã¾ã›ã‚“" -#: access/transam/xlogrecovery.c:4617 +#: access/transam/xlogrecovery.c:4702 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "å¿…è¦ãªè¨­å®šå¤‰æ›´ã‚’行ã£ãŸã®ã¡ã€ã‚µãƒ¼ãƒãƒ¼ã‚’å†èµ·å‹•ã—ã¦ãã ã•ã„。" -#: access/transam/xlogrecovery.c:4641 +#: access/transam/xlogrecovery.c:4726 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "ä¸å分ãªãƒ‘ラメータ設定値ã®ãŸã‚リカãƒãƒªãŒåœæ­¢ã—ã¾ã—ãŸ" -#: access/transam/xlogrecovery.c:4647 +#: access/transam/xlogrecovery.c:4732 #, c-format msgid "You can restart the server after making the necessary configuration changes." msgstr "å¿…è¦ãªè¨­å®šå¤‰æ›´ã‚’行ã†ã“ã¨ã§ã‚µãƒ¼ãƒãƒ¼ã‚’å†èµ·å‹•ã§ãã¾ã™ã€‚" -#: access/transam/xlogrecovery.c:4689 +#: access/transam/xlogrecovery.c:4774 #, c-format msgid "multiple recovery targets specified" msgstr "複数ã®ãƒªã‚«ãƒãƒªç›®æ¨™ãŒæŒ‡å®šã•れã¦ã„ã¾ã™" -#: access/transam/xlogrecovery.c:4690 +#: access/transam/xlogrecovery.c:4775 #, c-format -msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." -msgstr " recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid ã¯ã“ã®ä¸­ã®1ã¤ã¾ã§è¨­å®šå¯èƒ½ã§ã™ã€‚" +msgid "At most one of \"recovery_target\", \"recovery_target_lsn\", \"recovery_target_name\", \"recovery_target_time\", \"recovery_target_xid\" may be set." +msgstr "\" recovery_target\", \"recovery_target_lsn\", \"recovery_target_name\", \"recovery_target_time, recovery_target_xid\" ã¯ã“ã®ä¸­ã®1ã¤ã¾ã§è¨­å®šå¯èƒ½ã§ã™ã€‚" -#: access/transam/xlogrecovery.c:4701 +#: access/transam/xlogrecovery.c:4786 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "\"immediate\"ã®ã¿ãŒæŒ‡å®šå¯èƒ½ã§ã™ã€‚" -#: access/transam/xlogrecovery.c:4853 utils/adt/timestamp.c:186 utils/adt/timestamp.c:439 +#: access/transam/xlogrecovery.c:4938 utils/adt/timestamp.c:202 utils/adt/timestamp.c:455 #, c-format msgid "timestamp out of range: \"%s\"" msgstr "timestampãŒç¯„囲外ã§ã™: \"%s\"" -#: access/transam/xlogrecovery.c:4898 +#: access/transam/xlogrecovery.c:4983 #, c-format -msgid "recovery_target_timeline is not a valid number." -msgstr "recovery_target_timelineãŒå¦¥å½“ãªæ•°å€¤ã§ã¯ã‚りã¾ã›ã‚“。" +msgid "\"recovery_target_timeline\" is not a valid number." +msgstr "\"recovery_target_timeline\"ãŒæ•°å€¤ã¨ã—ã¦å¦¥å½“ã§ã¯ã‚りã¾ã›ã‚“。" -#: access/transam/xlogutils.c:1039 +#: access/transam/xlogutils.c:1032 #, c-format msgid "could not read from WAL segment %s, offset %d: %m" msgstr "WALセグメント%sã€ã‚ªãƒ•セット%dを読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: access/transam/xlogutils.c:1046 +#: access/transam/xlogutils.c:1039 #, c-format msgid "could not read from WAL segment %s, offset %d: read %d of %d" msgstr "WALセグメント%1$sã€ã‚ªãƒ•セット%2$dを読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %4$d 中 %3$d 読ã¿è¾¼ã¿ã¾ã—ãŸ" -#: archive/shell_archive.c:96 +#: archive/shell_archive.c:98 #, c-format msgid "archive command failed with exit code %d" msgstr "アーカイブコマンドãŒãƒªã‚¿ãƒ¼ãƒ³ã‚³ãƒ¼ãƒ‰ %dã§å¤±æ•—ã—ã¾ã—ãŸ" -#: archive/shell_archive.c:98 archive/shell_archive.c:108 archive/shell_archive.c:114 archive/shell_archive.c:123 +#: archive/shell_archive.c:100 archive/shell_archive.c:110 archive/shell_archive.c:116 archive/shell_archive.c:125 #, c-format msgid "The failed archive command was: %s" msgstr "失敗ã—ãŸã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã‚³ãƒžãƒ³ãƒ‰ã¯æ¬¡ã®ã¨ãŠã‚Šã§ã™: %s" -#: archive/shell_archive.c:105 +#: archive/shell_archive.c:107 #, c-format msgid "archive command was terminated by exception 0x%X" msgstr "アーカイブコマンドãŒä¾‹å¤–0x%Xã§çµ‚了ã—ã¾ã—ãŸ" -#: archive/shell_archive.c:107 postmaster/postmaster.c:3675 +#: archive/shell_archive.c:109 postmaster/postmaster.c:3095 #, c-format msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." msgstr "16進値ã®èª¬æ˜Žã«ã¤ã„ã¦ã¯C インクルードファイル\"ntstatus.h\"ã‚’å‚ç…§ã—ã¦ãã ã•ã„。" -#: archive/shell_archive.c:112 +#: archive/shell_archive.c:114 #, c-format msgid "archive command was terminated by signal %d: %s" msgstr "アーカイブコマンドã¯ã‚·ã‚°ãƒŠãƒ«%dã«ã‚ˆã‚Šçµ‚了ã—ã¾ã—ãŸ: %s" -#: archive/shell_archive.c:121 +#: archive/shell_archive.c:123 #, c-format msgid "archive command exited with unrecognized status %d" msgstr "アーカイブコマンドã¯ä¸æ˜Žã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹%dã§çµ‚了ã—ã¾ã—ãŸ" -#: backup/backup_manifest.c:253 +#: backup/backup_manifest.c:254 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "最終タイムライン%uを期待ã—ã¦ã„ã¾ã—ãŸãŒã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ" -#: backup/backup_manifest.c:277 +#: backup/backup_manifest.c:278 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "開始タイムライン%uを期待ã—ã¦ã„ã¾ã—ãŸãŒã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ" -#: backup/backup_manifest.c:304 +#: backup/backup_manifest.c:305 #, c-format msgid "start timeline %u not found in history of timeline %u" msgstr "開始タイムライン%uã¯ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uã®å±¥æ­´ä¸­ã«ã‚りã¾ã›ã‚“" -#: backup/backup_manifest.c:355 +#: backup/backup_manifest.c:356 #, c-format msgid "could not rewind temporary file" msgstr "ä¸€æ™‚ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å·»ãæˆ»ã—ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: backup/basebackup.c:470 +#: backup/basebackup.c:479 #, c-format msgid "could not find any WAL files" msgstr "WALファイルãŒå…¨ãã‚りã¾ã›ã‚“" -#: backup/basebackup.c:485 backup/basebackup.c:500 backup/basebackup.c:509 +#: backup/basebackup.c:494 backup/basebackup.c:509 backup/basebackup.c:518 #, c-format msgid "could not find WAL file \"%s\"" msgstr "WALファイル\"%s\"ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: backup/basebackup.c:551 backup/basebackup.c:576 +#: backup/basebackup.c:560 backup/basebackup.c:585 #, c-format msgid "unexpected WAL file size \"%s\"" msgstr "想定ã—ãªã„WALファイルã®ã‚µã‚¤ã‚º\"%s\"" -#: backup/basebackup.c:646 +#: backup/basebackup.c:656 #, c-format msgid "%lld total checksum verification failure" msgid_plural "%lld total checksum verification failures" msgstr[0] "åˆè¨ˆ%lld個ã®ãƒ‡ãƒ¼ã‚¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ æ¤œè¨¼ã‚¨ãƒ©ãƒ¼" -#: backup/basebackup.c:653 +#: backup/basebackup.c:663 #, c-format msgid "checksum verification failure during base backup" msgstr "ベースãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—中ã«ãƒã‚§ãƒƒã‚¯ã‚µãƒ ç¢ºèªãŒå¤±æ•—ã—ã¾ã—ãŸ" -#: backup/basebackup.c:722 backup/basebackup.c:731 backup/basebackup.c:742 backup/basebackup.c:759 backup/basebackup.c:768 backup/basebackup.c:779 backup/basebackup.c:796 backup/basebackup.c:805 backup/basebackup.c:817 backup/basebackup.c:841 backup/basebackup.c:855 backup/basebackup.c:866 backup/basebackup.c:877 backup/basebackup.c:890 +#: backup/basebackup.c:733 backup/basebackup.c:742 backup/basebackup.c:753 backup/basebackup.c:770 backup/basebackup.c:779 backup/basebackup.c:788 backup/basebackup.c:803 backup/basebackup.c:820 backup/basebackup.c:829 backup/basebackup.c:841 backup/basebackup.c:865 backup/basebackup.c:879 backup/basebackup.c:890 backup/basebackup.c:901 backup/basebackup.c:914 #, c-format msgid "duplicate option \"%s\"" msgstr "\"%s\"オプションã¯é‡è¤‡ã—ã¦ã„ã¾ã™" -#: backup/basebackup.c:750 +#: backup/basebackup.c:761 #, c-format msgid "unrecognized checkpoint type: \"%s\"" msgstr "èªè­˜ã•れãªã„ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã‚¿ã‚¤ãƒ—: \"%s\"" -#: backup/basebackup.c:785 +#: backup/basebackup.c:793 +#, c-format +msgid "incremental backups cannot be taken unless WAL summarization is enabled" +msgstr "WALé›†ç´„ãŒæœ‰åйã§ãªã‘れã°å·®åˆ†ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯å–å¾—ã§ãã¾ã›ã‚“" + +#: backup/basebackup.c:809 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%dã¯ãƒ‘ラメータ\"%s\"ã®æœ‰åŠ¹ç¯„å›²ã‚’è¶…ãˆã¦ã„ã¾ã™(%d .. %d)" -#: backup/basebackup.c:830 +#: backup/basebackup.c:854 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "èªè­˜ã§ããªã„目録オプション: \"%s\"" -#: backup/basebackup.c:846 -#, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "èªè­˜ã§ããªã„ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ : \"%s\"" - -#: backup/basebackup.c:881 +#: backup/basebackup.c:905 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "èªè­˜ã§ããªã„圧縮アルゴリズム: \"%s\"" -#: backup/basebackup.c:897 +#: backup/basebackup.c:921 #, c-format msgid "unrecognized base backup option: \"%s\"" msgstr "èªè­˜ã§ããªã„ベースãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—オプション: \"%s\"" -#: backup/basebackup.c:908 +#: backup/basebackup.c:932 #, c-format msgid "manifest checksums require a backup manifest" msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã«ã¯ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録ãŒå¿…è¦ã§ã™" -#: backup/basebackup.c:917 +#: backup/basebackup.c:941 #, c-format msgid "target detail cannot be used without target" msgstr "ターゲット詳細ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã®æŒ‡å®šãªã—ã§ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: backup/basebackup.c:926 backup/basebackup_target.c:218 +#: backup/basebackup.c:950 backup/basebackup_target.c:218 #, c-format msgid "target \"%s\" does not accept a target detail" msgstr "ターゲット\"%s\"ã¯ã‚¿ãƒ¼ã‚²ãƒƒãƒˆè©³ç´°ã‚’å—ã‘付ã‘ã¾ã›ã‚“" -#: backup/basebackup.c:937 +#: backup/basebackup.c:961 #, c-format msgid "compression detail cannot be specified unless compression is enabled" msgstr "圧縮詳細ã¯åœ§ç¸®ãŒæœ‰åйã§ãªã„å ´åˆã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: backup/basebackup.c:950 +#: backup/basebackup.c:974 #, c-format msgid "invalid compression specification: %s" msgstr "䏿­£ãªåœ§ç¸®æŒ‡å®š: %s" -#: backup/basebackup.c:1116 backup/basebackup.c:1294 +#: backup/basebackup.c:1024 +#, c-format +msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" +msgstr "差分ã®BASE_BACKUPã®å®Ÿè¡Œå‰ã«UPLOAD_MANIFESTを実行ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" + +#: backup/basebackup.c:1157 backup/basebackup.c:1358 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "\"%s\"ã¨ã„ã†ãƒ•ァイルã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®æƒ…報をå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚: %m" -#: backup/basebackup.c:1430 +#: backup/basebackup.c:1544 #, c-format msgid "skipping special file \"%s\"" msgstr "スペシャルファイル\"%s\"をスキップã—ã¦ã„ã¾ã™" -#: backup/basebackup.c:1542 -#, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "ファイル\"%2$s\"セグメント番å·%1$dã¯ä¸æ­£ã§ã™" - -#: backup/basebackup.c:1574 +#: backup/basebackup.c:1751 #, c-format msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" msgstr "ファイル\"%s\"ã€ãƒ–ロック%uã§ãƒã‚§ãƒƒã‚¯ã‚µãƒ æ¤œè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ: 読ã¿è¾¼ã¿ãƒãƒƒãƒ•ァサイズ%dã¨ãƒšãƒ¼ã‚¸ã‚µã‚¤ã‚º%dãŒç•°ãªã£ã¦ã„ã¾ã™" -#: backup/basebackup.c:1658 +#: backup/basebackup.c:1813 +#, c-format +msgid "file \"%s\" has a total of %d checksum verification failure" +msgid_plural "file \"%s\" has a total of %d checksum verification failures" +msgstr[0] "ファイル\"%s\"ã§ã¯åˆè¨ˆ%d個ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" + +#: backup/basebackup.c:1917 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" msgstr "ファイル\"%s\"ã®ãƒ–ロック%uã§ãƒã‚§ãƒƒã‚¯ã‚µãƒ æ¤œè¨¼ãŒå¤±æ•—ã—ã¾ã—ãŸ: 計算ã•れãŸãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯%Xã§ã™ãŒæƒ³å®šã¯%Xã§ã™" -#: backup/basebackup.c:1665 +#: backup/basebackup.c:1924 #, c-format msgid "further checksum verification failures in file \"%s\" will not be reported" msgstr "ファイル\"%s\"ã«ãŠã‘る以é™ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚¨ãƒ©ãƒ¼ã¯å ±å‘Šã•れã¾ã›ã‚“" -#: backup/basebackup.c:1721 -#, c-format -msgid "file \"%s\" has a total of %d checksum verification failure" -msgid_plural "file \"%s\" has a total of %d checksum verification failures" -msgstr[0] "ファイル\"%s\"ã§ã¯åˆè¨ˆ%d個ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" - -#: backup/basebackup.c:1767 +#: backup/basebackup.c:2048 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "ファイルåãŒtarフォーマットã«å¯¾ã—ã¦é•·ã™ãŽã¾ã™: \"%s\"" -#: backup/basebackup.c:1772 +#: backup/basebackup.c:2053 #, c-format msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" msgstr "シンボリックリンクã®ãƒªãƒ³ã‚¯å…ˆtarã®ãƒ•ォーマットã«ã¨ã£ã¦é•·ã™ãŽã¾ã™: ファイルå \"%s\", リンク先 \"%s\"" +#: backup/basebackup.c:2127 +#, c-format +msgid "could not read file \"%s\": read %zd of %zu" +msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$zuãƒã‚¤ãƒˆã®ã†ã¡%2$zdãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" + #: backup/basebackup_gzip.c:67 #, c-format msgid "gzip compression is not supported by this build" @@ -3355,47 +3637,107 @@ msgstr "ã“ã®ãƒ“ルドã§ã¯gzip圧縮ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" msgid "could not initialize compression library" msgstr "åœ§ç¸®ãƒ©ã‚¤ãƒ–ãƒ©ãƒªã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: backup/basebackup_lz4.c:67 +#: backup/basebackup_incremental.c:294 #, c-format -msgid "lz4 compression is not supported by this build" +msgid "manifest contains no required WAL ranges" +msgstr "å¿…è¦ã¨ãªã‚‹WAL範囲ãŒãƒžãƒ‹ãƒ•ェストã«å«ã¾ã‚Œã¦ã¾ã›ã‚“" + +#: backup/basebackup_incremental.c:349 +#, c-format +msgid "timeline %u found in manifest, but not in this server's history" +msgstr "タイムライン%uãŒãƒžãƒ‹ãƒ•ェストã«ã‚りã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã®å±¥æ­´ä¸Šã«å­˜åœ¨ã—ã¾ã›ã‚“" + +#: backup/basebackup_incremental.c:414 +#, c-format +msgid "manifest requires WAL from initial timeline %u starting at %X/%X, but that timeline begins at %X/%X" +msgstr "マニフェストãŒ%2$X/%3$Xã‹ã‚‰å§‹ã¾ã‚‹åˆæœŸã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%1$uã®WALã‚’å¿…è¦ã¨ã—ã¦ã¾ã™ãŒã€ã“ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ã¯%4$X/%5$Xã‹ã‚‰å§‹ã¾ã£ã¦ã„ã¾ã™" + +#: backup/basebackup_incremental.c:424 +#, c-format +msgid "manifest requires WAL from continuation timeline %u starting at %X/%X, but that timeline begins at %X/%X" +msgstr "マニフェストãŒ%2$X/%3$Xã‹ã‚‰å§‹ã¾ã‚‹ç¶™ç¶šã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%1$uã®WALã‚’ã‚’å¿…è¦ã¨ã—ã¦ã¾ã™ãŒã€ã“ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ã¯%4$X/%5$Xã‹ã‚‰å§‹ã¾ã£ã¦ã„ã¾ã™" + +#: backup/basebackup_incremental.c:435 +#, c-format +msgid "manifest requires WAL from final timeline %u ending at %X/%X, but this backup starts at %X/%X" +msgstr "マニフェストã¯%2$X/%3$Xã§çµ‚了ã™ã‚‹æœ€çµ‚タイムライン%1$uã‹ã‚‰ã®WALã‚’å¿…è¦ã¨ã—ã¾ã™ãŒã€ã“ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯%4$X/%5$Xã§é–‹å§‹ã•れã¾ã™" + +#: backup/basebackup_incremental.c:439 +#, c-format +msgid "This can happen for incremental backups on a standby if there was little activity since the previous backup." +msgstr "ã“れã¯ã‚¹ã‚¿ãƒ³ãƒã‚¤ä¸Šã®å·®åˆ†ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§å‰å›žã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—以é™ã®æ›´æ–°ãŒå°‘ãªã‹ã£ãŸå ´åˆã«èµ·ãã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚" + +#: backup/basebackup_incremental.c:446 +#, c-format +msgid "manifest requires WAL from non-final timeline %u ending at %X/%X, but this server switched timelines at %X/%X" +msgstr "マニフェストãŒ%2$X/%3$Xã§çµ‚了ã™ã‚‹éžæœ€çµ‚タイムライン%1$uã®WALã‚’ã‚’å¿…è¦ã¨ã—ã¦ã¾ã™ãŒã€ã“ã®ã‚µãƒ¼ãƒãƒ¼ã§ã¯ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ãŒ%4$X/%5$Xã§åˆ‡ã‚Šæ›¿ã‚ã£ã¦ã„ã¾ã™" + +#: backup/basebackup_incremental.c:527 +#, c-format +msgid "WAL summaries are required on timeline %u from %X/%X to %X/%X, but no summaries for that timeline and LSN range exist" +msgstr "WAL集計ãŒã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%u上ã®%X/%Xã‹ã‚‰%X/%Xã¾ã§å¿…è¦ã§ã™ãŒã€ãã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ä¸Šã®ãã®LSN範囲ã§ã®é›†è¨ˆã¯å­˜åœ¨ã—ã¾ã›ã‚“" + +#: backup/basebackup_incremental.c:534 +#, c-format +msgid "WAL summaries are required on timeline %u from %X/%X to %X/%X, but the summaries for that timeline and LSN range are incomplete" +msgstr "WAL集計ãŒã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%u上ã®%X/%Xã‹ã‚‰%X/%Xã¾ã§å¿…è¦ã§ã™ãŒã€ãã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ä¸Šã®ãã®LSN範囲ã§ã®é›†è¨ˆã¯ä¸å®Œå…¨ã§ã™" + +#: backup/basebackup_incremental.c:538 +#, c-format +msgid "The first unsummarized LSN in this range is %X/%X." +msgstr "ã“ã®ç¯„囲ã§é›†è¨ˆã•れã¦ã„ãªã„最åˆã®LSNã¯%X/%Xã§ã™ã€‚" + +#: backup/basebackup_incremental.c:938 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³1ã¯å·®åˆ†ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" + +#: backup/basebackup_incremental.c:956 +#, c-format +msgid "system identifier in backup manifest is %llu, but database system identifier is %llu" +msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録中ã®ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ãŒ%lluã§ã™ãŒã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ã¯%lluã§ã™" + +#: backup/basebackup_lz4.c:67 +#, c-format +msgid "lz4 compression is not supported by this build" msgstr "ã“ã®ãƒ“ルドã§ã¯lz4圧縮ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: backup/basebackup_server.c:75 +#: backup/basebackup_server.c:73 #, c-format msgid "permission denied to create backup stored on server" msgstr "サーãƒãƒ¼ä¸Šã«æ ¼ç´ã•れるãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を作æˆã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: backup/basebackup_server.c:76 +#: backup/basebackup_server.c:74 #, c-format msgid "Only roles with privileges of the \"%s\" role may create a backup stored on the server." msgstr "\"%s\"ãƒ­ãƒ¼ãƒ«ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã€ã‚µãƒ¼ãƒãƒ¼ä¸Šã«æ ¼ç´ã•れるãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: backup/basebackup_server.c:91 +#: backup/basebackup_server.c:89 #, c-format msgid "relative path not allowed for backup stored on server" msgstr "サーãƒãƒ¼ä¸Šã«æ ¼ç´ã•れるãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ã¯ç›¸å¯¾ãƒ‘ã‚¹ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: backup/basebackup_server.c:104 commands/dbcommands.c:501 commands/tablespace.c:163 commands/tablespace.c:179 commands/tablespace.c:599 commands/tablespace.c:644 replication/slot.c:1697 storage/file/copydir.c:47 +#: backup/basebackup_server.c:102 commands/dbcommands.c:477 commands/tablespace.c:157 commands/tablespace.c:173 commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:1986 storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: backup/basebackup_server.c:117 +#: backup/basebackup_server.c:115 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "ディレクトリ\"%s\"ã¯å­˜åœ¨ã—ã¾ã™ãŒã€ç©ºã§ã¯ã‚りã¾ã›ã‚“" -#: backup/basebackup_server.c:125 utils/init/postinit.c:1150 +#: backup/basebackup_server.c:123 utils/init/postinit.c:1178 #, c-format msgid "could not access directory \"%s\": %m" msgstr "ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: backup/basebackup_server.c:177 backup/basebackup_server.c:184 backup/basebackup_server.c:270 backup/basebackup_server.c:277 storage/smgr/md.c:501 storage/smgr/md.c:508 storage/smgr/md.c:590 storage/smgr/md.c:612 storage/smgr/md.c:862 +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 backup/basebackup_server.c:268 backup/basebackup_server.c:275 backup/walsummary.c:312 storage/smgr/md.c:502 storage/smgr/md.c:509 storage/smgr/md.c:591 storage/smgr/md.c:613 storage/smgr/md.c:999 #, c-format msgid "Check free disk space." msgstr "ディスクã®ç©ºã容é‡ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„。" -#: backup/basebackup_server.c:181 backup/basebackup_server.c:274 +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 backup/walsummary.c:309 #, c-format msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" msgstr "ファイル\"%1$s\"ã«æ›¸ãè¾¼ã¿ã§ãã¾ã›ã‚“ã§ã—ãŸ: オフセット%4$uã§%3$dãƒã‚¤ãƒˆä¸­%2$dãƒã‚¤ãƒˆåˆ†ã®ã¿ã‚’書ã出ã—ã¾ã—ãŸ" @@ -3422,689 +3764,699 @@ msgstr "圧縮ワーカー数を%dã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" #: backup/basebackup_zstd.c:129 #, c-format -msgid "could not set compression flag for %s: %s" -msgstr "%sã«å¯¾å¿œã™ã‚‹åœ§ç¸®ãƒ•ラグを設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not enable long-distance mode: %s" +msgstr "é•·è·é›¢ãƒ¢ãƒ¼ãƒ‰ã‚’有効化ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: backup/walsummaryfuncs.c:95 +#, c-format +msgid "invalid timeline %lld" +msgstr "䏿­£ãªã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%lld" -#: bootstrap/bootstrap.c:243 postmaster/postmaster.c:721 tcop/postgres.c:3819 +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:623 tcop/postgres.c:3946 #, c-format msgid "--%s requires a value" msgstr "--%sã«ã¯å€¤ãŒå¿…è¦ã§ã™" -#: bootstrap/bootstrap.c:248 postmaster/postmaster.c:726 tcop/postgres.c:3824 +#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:628 tcop/postgres.c:3951 #, c-format msgid "-c %s requires a value" msgstr "-c %sã¯å€¤ãŒå¿…è¦ã§ã™" -#: bootstrap/bootstrap.c:289 -#, c-format -msgid "-X requires a power of two value between 1 MB and 1 GB" -msgstr "-X オプションã®å€¤ã¯1MBã‹ã‚‰1GBã®é–“ã®2ã®ç´¯ä¹—を指定ã—ã¾ã™" - -#: bootstrap/bootstrap.c:295 postmaster/postmaster.c:844 postmaster/postmaster.c:857 +#: bootstrap/bootstrap.c:282 postmaster/postmaster.c:746 postmaster/postmaster.c:759 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "詳細ã«ã¤ã„ã¦ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。\n" -#: bootstrap/bootstrap.c:304 +#: bootstrap/bootstrap.c:291 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s: コマンドライン引数ãŒä¸æ­£ã§ã™\n" -#: catalog/aclchk.c:201 +#: catalog/aclchk.c:211 #, c-format msgid "grant options can only be granted to roles" msgstr "グラントオプションã¯ãƒ­ãƒ¼ãƒ«ã«ã®ã¿ä»˜ä¸Žã§ãã¾ã™" -#: catalog/aclchk.c:323 +#: catalog/aclchk.c:333 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã«ä»˜ä¸Žã•ã‚ŒãŸæ¨©é™ã¯ã‚りã¾ã›ã‚“" -#: catalog/aclchk.c:328 +#: catalog/aclchk.c:338 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "\"%s\"ã«ä»˜ä¸Žã•ã‚ŒãŸæ¨©é™ã¯ã‚りã¾ã›ã‚“" -#: catalog/aclchk.c:336 +#: catalog/aclchk.c:346 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã«å¯¾ã—ã¦ä¸€éƒ¨ã®æ¨©é™ãŒä»˜ä¸Žã•れã¾ã›ã‚“ã§ã—ãŸ" -#: catalog/aclchk.c:341 +#: catalog/aclchk.c:351 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "\"%s\"ã«å¯¾ã—ã¦ä¸€éƒ¨ã®æ¨©é™ãŒä»˜ä¸Žã•れã¾ã›ã‚“ã§ã—ãŸ" -#: catalog/aclchk.c:352 +#: catalog/aclchk.c:362 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã‹ã‚‰å‰¥å¥ªã§ããŸæ¨©é™ã¯ã‚りã¾ã›ã‚“" -#: catalog/aclchk.c:357 +#: catalog/aclchk.c:367 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "\"%s\"ã«å¯¾ã—ã¦å‰¥å¥ªã§ããŸæ¨©é™ã¯ã‚りã¾ã›ã‚“" -#: catalog/aclchk.c:365 +#: catalog/aclchk.c:375 #, c-format msgid "not all privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã«å¯¾ã—ã¦ä¸€éƒ¨ã®æ¨©é™ãŒå‰¥å¥ªã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: catalog/aclchk.c:370 +#: catalog/aclchk.c:380 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "\"%s\"ã«å¯¾ã—ã¦ä¸€éƒ¨ã®æ¨©é™ãŒå‰¥å¥ªã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: catalog/aclchk.c:402 +#: catalog/aclchk.c:412 #, c-format msgid "grantor must be current user" msgstr "権é™ä»˜ä¸Žè€…ã¯ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: catalog/aclchk.c:470 catalog/aclchk.c:1045 +#: catalog/aclchk.c:480 catalog/aclchk.c:1055 #, c-format msgid "invalid privilege type %s for relation" msgstr "リレーションã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã®ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:474 catalog/aclchk.c:1049 +#: catalog/aclchk.c:484 catalog/aclchk.c:1059 #, c-format msgid "invalid privilege type %s for sequence" msgstr "シーケンスã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã®ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:478 +#: catalog/aclchk.c:488 #, c-format msgid "invalid privilege type %s for database" msgstr "データベースã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:482 +#: catalog/aclchk.c:492 #, c-format msgid "invalid privilege type %s for domain" msgstr "ドメインã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:486 catalog/aclchk.c:1053 +#: catalog/aclchk.c:496 catalog/aclchk.c:1063 #, c-format msgid "invalid privilege type %s for function" msgstr "関数ã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:490 +#: catalog/aclchk.c:500 #, c-format msgid "invalid privilege type %s for language" msgstr "言語ã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:494 +#: catalog/aclchk.c:504 #, c-format msgid "invalid privilege type %s for large object" msgstr "ラージオブジェクトã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:498 catalog/aclchk.c:1069 +#: catalog/aclchk.c:508 catalog/aclchk.c:1079 #, c-format msgid "invalid privilege type %s for schema" msgstr "スキーマã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:502 catalog/aclchk.c:1057 +#: catalog/aclchk.c:512 catalog/aclchk.c:1067 #, c-format msgid "invalid privilege type %s for procedure" msgstr "プロシージャã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:506 catalog/aclchk.c:1061 +#: catalog/aclchk.c:516 catalog/aclchk.c:1071 #, c-format msgid "invalid privilege type %s for routine" msgstr "ルーãƒãƒ³ã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã®ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:510 +#: catalog/aclchk.c:520 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "テーブル空間ã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:514 catalog/aclchk.c:1065 +#: catalog/aclchk.c:524 catalog/aclchk.c:1075 #, c-format msgid "invalid privilege type %s for type" msgstr "åž‹ã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:518 +#: catalog/aclchk.c:528 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "外部データラッパーã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:522 +#: catalog/aclchk.c:532 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "外部サーãƒãƒ¼ã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:526 +#: catalog/aclchk.c:536 #, c-format msgid "invalid privilege type %s for parameter" msgstr "パラメータã«å¯¾ã™ã‚‹ä¸æ­£ãªæ¨©é™ã‚¿ã‚¤ãƒ— %s" -#: catalog/aclchk.c:565 +#: catalog/aclchk.c:575 #, c-format msgid "column privileges are only valid for relations" msgstr "列権é™ã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã«å¯¾ã—ã¦ã®ã¿æœ‰åйã§ã™" -#: catalog/aclchk.c:728 catalog/aclchk.c:3570 catalog/objectaddress.c:1092 catalog/pg_largeobject.c:116 storage/large_object/inv_api.c:287 +#: catalog/aclchk.c:738 catalog/aclchk.c:3629 catalog/objectaddress.c:1054 catalog/pg_largeobject.c:113 storage/large_object/inv_api.c:285 #, c-format msgid "large object %u does not exist" msgstr "ラージオブジェクト%uã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/aclchk.c:1102 +#: catalog/aclchk.c:1112 #, c-format msgid "default privileges cannot be set for columns" msgstr "デフォルト権é™ã¯åˆ—ã«ã¯è¨­å®šã§ãã¾ã›ã‚“" -#: catalog/aclchk.c:1138 +#: catalog/aclchk.c:1148 #, c-format msgid "permission denied to change default privileges" msgstr "デフォルト権é™ã‚’変更ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: catalog/aclchk.c:1256 +#: catalog/aclchk.c:1266 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "GRANT/REVOKE ON SCHEMAS を使ã£ã¦ã„る時ã«ã¯ IN SCHEMA å¥ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: catalog/aclchk.c:1595 catalog/catalog.c:631 catalog/objectaddress.c:1561 catalog/pg_publication.c:533 commands/analyze.c:389 commands/copy.c:837 commands/sequence.c:1663 commands/tablecmds.c:7339 commands/tablecmds.c:7495 commands/tablecmds.c:7545 commands/tablecmds.c:7619 commands/tablecmds.c:7689 commands/tablecmds.c:7801 commands/tablecmds.c:7895 commands/tablecmds.c:7954 commands/tablecmds.c:8043 commands/tablecmds.c:8073 commands/tablecmds.c:8201 -#: commands/tablecmds.c:8283 commands/tablecmds.c:8417 commands/tablecmds.c:8525 commands/tablecmds.c:12240 commands/tablecmds.c:12421 commands/tablecmds.c:12582 commands/tablecmds.c:13744 commands/tablecmds.c:16273 commands/trigger.c:949 parser/analyze.c:2480 parser/parse_relation.c:737 parser/parse_target.c:1054 parser/parse_type.c:144 parser/parse_utilcmd.c:3413 parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2884 -#: utils/adt/ruleutils.c:2799 +#: catalog/aclchk.c:1617 catalog/catalog.c:659 catalog/objectaddress.c:1523 catalog/pg_publication.c:528 commands/analyze.c:380 commands/copy.c:951 commands/sequence.c:1655 commands/tablecmds.c:7574 commands/tablecmds.c:7728 commands/tablecmds.c:7778 commands/tablecmds.c:7852 commands/tablecmds.c:7922 commands/tablecmds.c:8052 commands/tablecmds.c:8181 commands/tablecmds.c:8275 commands/tablecmds.c:8376 commands/tablecmds.c:8503 commands/tablecmds.c:8533 +#: commands/tablecmds.c:8675 commands/tablecmds.c:8768 commands/tablecmds.c:8902 commands/tablecmds.c:9014 commands/tablecmds.c:12830 commands/tablecmds.c:13022 commands/tablecmds.c:13183 commands/tablecmds.c:14372 commands/tablecmds.c:16999 commands/trigger.c:942 parser/analyze.c:2530 parser/parse_relation.c:737 parser/parse_target.c:1067 parser/parse_type.c:144 parser/parse_utilcmd.c:3409 parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2923 +#: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/aclchk.c:1840 +#: catalog/aclchk.c:1862 #, c-format msgid "\"%s\" is an index" msgstr "\"%s\"ã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã™" -#: catalog/aclchk.c:1847 commands/tablecmds.c:13901 commands/tablecmds.c:17200 +#: catalog/aclchk.c:1869 commands/tablecmds.c:14529 commands/tablecmds.c:17915 #, c-format msgid "\"%s\" is a composite type" msgstr "\"%s\"ã¯è¤‡åˆåž‹ã§ã™" -#: catalog/aclchk.c:1855 catalog/objectaddress.c:1401 commands/sequence.c:1171 commands/tablecmds.c:254 commands/tablecmds.c:17164 utils/adt/acl.c:2092 utils/adt/acl.c:2122 utils/adt/acl.c:2154 utils/adt/acl.c:2186 utils/adt/acl.c:2214 utils/adt/acl.c:2244 +#: catalog/aclchk.c:1877 catalog/objectaddress.c:1363 commands/tablecmds.c:263 commands/tablecmds.c:17879 utils/adt/acl.c:2107 utils/adt/acl.c:2137 utils/adt/acl.c:2170 utils/adt/acl.c:2206 utils/adt/acl.c:2237 utils/adt/acl.c:2268 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\"ã¯ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/aclchk.c:1893 +#: catalog/aclchk.c:1915 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "シーケンス \"%s\"ã§ã¯ USAGE, SELECT, UPDATE 権é™ã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™" -#: catalog/aclchk.c:1910 +#: catalog/aclchk.c:1932 #, c-format msgid "invalid privilege type %s for table" msgstr "テーブルã«å¯¾ã™ã‚‹æ¨©é™ã‚¿ã‚¤ãƒ—%sã¯ä¸æ­£ã§ã™" -#: catalog/aclchk.c:2072 +#: catalog/aclchk.c:2097 #, c-format msgid "invalid privilege type %s for column" msgstr "列ã§ã¯æ¨©é™ã‚¿ã‚¤ãƒ— %s ã¯ç„¡åйã§ã™" -#: catalog/aclchk.c:2085 +#: catalog/aclchk.c:2110 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "シーケンス \"%s\"ã§ã¯ USAGE, SELECT, UPDATE ã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™" -#: catalog/aclchk.c:2275 +#: catalog/aclchk.c:2301 #, c-format msgid "language \"%s\" is not trusted" msgstr "言語\"%s\"ã¯ä¿¡é ¼ã•れã¦ã„ã¾ã›ã‚“" -#: catalog/aclchk.c:2277 +#: catalog/aclchk.c:2303 #, c-format msgid "GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages." msgstr "ä¿¡é ¼ã•れãªã„言語ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã®ã¿ãŒä½¿ç”¨å¯èƒ½ãªãŸã‚ã€GRANTã¨REVOKEã¯ä¿¡é ¼ã•れãªã„言語上ã§ã¯å®Ÿè¡Œä¸å¯ã§ã™ã€‚" -#: catalog/aclchk.c:2427 +#: catalog/aclchk.c:2454 #, c-format msgid "cannot set privileges of array types" msgstr "é…åˆ—åž‹ã®æ¨©é™ã‚’設定ã§ãã¾ã›ã‚“" -#: catalog/aclchk.c:2428 +#: catalog/aclchk.c:2455 #, c-format msgid "Set the privileges of the element type instead." msgstr "代ã‚りã«è¦ç´ åž‹ã®æ¨©é™ã‚’設定ã—ã¦ãã ã•ã„。" -#: catalog/aclchk.c:2435 catalog/objectaddress.c:1667 +#: catalog/aclchk.c:2459 +#, c-format +msgid "cannot set privileges of multirange types" +msgstr "è¤‡ç¯„å›²åž‹ã®æ¨©é™ã‚’設定ã§ãã¾ã›ã‚“" + +#: catalog/aclchk.c:2460 +#, c-format +msgid "Set the privileges of the range type instead." +msgstr "代ã‚りã«ç¯„å›²åž‹ã®æ¨©é™ã‚’設定ã—ã¦ãã ã•ã„。" + +#: catalog/aclchk.c:2467 catalog/objectaddress.c:1629 #, c-format msgid "\"%s\" is not a domain" msgstr "\"%s\"ã¯ãƒ‰ãƒ¡ã‚¤ãƒ³ã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/aclchk.c:2621 +#: catalog/aclchk.c:2653 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "èªè­˜ã§ããªã„権é™ã‚¿ã‚¤ãƒ—\"%s\"" -#: catalog/aclchk.c:2688 +#: catalog/aclchk.c:2720 #, c-format msgid "permission denied for aggregate %s" msgstr "集約 %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2691 +#: catalog/aclchk.c:2723 #, c-format msgid "permission denied for collation %s" msgstr "ç…§åˆé †åº %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2694 +#: catalog/aclchk.c:2726 #, c-format msgid "permission denied for column %s" msgstr "列 %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2697 +#: catalog/aclchk.c:2729 #, c-format msgid "permission denied for conversion %s" msgstr "å¤‰æ› %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2700 +#: catalog/aclchk.c:2732 #, c-format msgid "permission denied for database %s" msgstr "データベース %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2703 +#: catalog/aclchk.c:2735 #, c-format msgid "permission denied for domain %s" msgstr "ドメイン %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2706 +#: catalog/aclchk.c:2738 #, c-format msgid "permission denied for event trigger %s" msgstr "イベントトリガ %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2709 +#: catalog/aclchk.c:2741 #, c-format msgid "permission denied for extension %s" msgstr "機能拡張 %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2712 +#: catalog/aclchk.c:2744 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "外部データラッパ %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2715 +#: catalog/aclchk.c:2747 #, c-format msgid "permission denied for foreign server %s" msgstr "外部サーãƒãƒ¼ %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2718 +#: catalog/aclchk.c:2750 #, c-format msgid "permission denied for foreign table %s" msgstr "外部テーブル %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2721 +#: catalog/aclchk.c:2753 #, c-format msgid "permission denied for function %s" msgstr "関数 %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2724 +#: catalog/aclchk.c:2756 #, c-format msgid "permission denied for index %s" msgstr "インデックス %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2727 +#: catalog/aclchk.c:2759 #, c-format msgid "permission denied for language %s" msgstr "言語 %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2730 +#: catalog/aclchk.c:2762 #, c-format msgid "permission denied for large object %s" msgstr "ラージオブジェクト %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2733 +#: catalog/aclchk.c:2765 #, c-format msgid "permission denied for materialized view %s" msgstr "実体化ビュー %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2736 +#: catalog/aclchk.c:2768 #, c-format msgid "permission denied for operator class %s" msgstr "演算å­ã‚¯ãƒ©ã‚¹ %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2739 +#: catalog/aclchk.c:2771 #, c-format msgid "permission denied for operator %s" msgstr "æ¼”ç®—å­ %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2742 +#: catalog/aclchk.c:2774 #, c-format msgid "permission denied for operator family %s" msgstr "æ¼”ç®—å­æ— %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2745 +#: catalog/aclchk.c:2777 #, c-format msgid "permission denied for parameter %s" msgstr "パラメータ %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2748 +#: catalog/aclchk.c:2780 #, c-format msgid "permission denied for policy %s" msgstr "ãƒãƒªã‚· %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2751 +#: catalog/aclchk.c:2783 #, c-format msgid "permission denied for procedure %s" msgstr "プロシージャ %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2754 +#: catalog/aclchk.c:2786 #, c-format msgid "permission denied for publication %s" msgstr "パブリケーション%sã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2757 +#: catalog/aclchk.c:2789 #, c-format msgid "permission denied for routine %s" msgstr "ルーãƒãƒ³ %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2760 +#: catalog/aclchk.c:2792 #, c-format msgid "permission denied for schema %s" msgstr "スキーマ %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2763 commands/sequence.c:659 commands/sequence.c:885 commands/sequence.c:927 commands/sequence.c:968 commands/sequence.c:1761 commands/sequence.c:1810 +#: catalog/aclchk.c:2795 commands/sequence.c:654 commands/sequence.c:880 commands/sequence.c:922 commands/sequence.c:963 commands/sequence.c:1753 commands/sequence.c:1799 #, c-format msgid "permission denied for sequence %s" msgstr "シーケンス %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2766 +#: catalog/aclchk.c:2798 #, c-format msgid "permission denied for statistics object %s" msgstr "統計情報オブジェクト %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2769 +#: catalog/aclchk.c:2801 #, c-format msgid "permission denied for subscription %s" msgstr "サブスクリプション %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2772 +#: catalog/aclchk.c:2804 #, c-format msgid "permission denied for table %s" msgstr "テーブル %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2775 +#: catalog/aclchk.c:2807 #, c-format msgid "permission denied for tablespace %s" msgstr "テーブル空間 %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2778 +#: catalog/aclchk.c:2810 #, c-format msgid "permission denied for text search configuration %s" msgstr "テキスト検索設定 %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2781 +#: catalog/aclchk.c:2813 #, c-format msgid "permission denied for text search dictionary %s" msgstr "テキスト検索辞書 %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2784 +#: catalog/aclchk.c:2816 #, c-format msgid "permission denied for type %s" msgstr "åž‹ %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2787 +#: catalog/aclchk.c:2819 #, c-format msgid "permission denied for view %s" msgstr "ビュー %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:2823 +#: catalog/aclchk.c:2855 #, c-format msgid "must be owner of aggregate %s" msgstr "集約 %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2826 +#: catalog/aclchk.c:2858 #, c-format msgid "must be owner of collation %s" msgstr "ç…§åˆé †åº %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2829 +#: catalog/aclchk.c:2861 #, c-format msgid "must be owner of conversion %s" msgstr "å¤‰æ› %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2832 +#: catalog/aclchk.c:2864 #, c-format msgid "must be owner of database %s" msgstr "データベース %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2835 +#: catalog/aclchk.c:2867 #, c-format msgid "must be owner of domain %s" msgstr "ドメイン %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2838 +#: catalog/aclchk.c:2870 #, c-format msgid "must be owner of event trigger %s" msgstr "イベントトリガ %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2841 +#: catalog/aclchk.c:2873 #, c-format msgid "must be owner of extension %s" msgstr "機能拡張 %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2844 +#: catalog/aclchk.c:2876 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "外部データラッパー %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2847 +#: catalog/aclchk.c:2879 #, c-format msgid "must be owner of foreign server %s" msgstr "外部サーãƒãƒ¼ %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2850 +#: catalog/aclchk.c:2882 #, c-format msgid "must be owner of foreign table %s" msgstr "外部テーブル %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2853 +#: catalog/aclchk.c:2885 #, c-format msgid "must be owner of function %s" msgstr "関数 %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2856 +#: catalog/aclchk.c:2888 #, c-format msgid "must be owner of index %s" msgstr "インデックス %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2859 +#: catalog/aclchk.c:2891 #, c-format msgid "must be owner of language %s" msgstr "言語 %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2862 +#: catalog/aclchk.c:2894 #, c-format msgid "must be owner of large object %s" msgstr "ラージオブジェクト %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2865 +#: catalog/aclchk.c:2897 #, c-format msgid "must be owner of materialized view %s" msgstr "実体化ビュー %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2868 +#: catalog/aclchk.c:2900 #, c-format msgid "must be owner of operator class %s" msgstr "演算å­ã‚¯ãƒ©ã‚¹ %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2871 +#: catalog/aclchk.c:2903 #, c-format msgid "must be owner of operator %s" msgstr "æ¼”ç®—å­ %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2874 +#: catalog/aclchk.c:2906 #, c-format msgid "must be owner of operator family %s" msgstr "æ¼”ç®—å­æ— %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2877 +#: catalog/aclchk.c:2909 #, c-format msgid "must be owner of procedure %s" msgstr "プロシージャ %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2880 +#: catalog/aclchk.c:2912 #, c-format msgid "must be owner of publication %s" msgstr "パブリケーション %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2883 +#: catalog/aclchk.c:2915 #, c-format msgid "must be owner of routine %s" msgstr "ルーãƒãƒ³ %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2886 +#: catalog/aclchk.c:2918 #, c-format msgid "must be owner of sequence %s" msgstr "シーケンス %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2889 +#: catalog/aclchk.c:2921 #, c-format msgid "must be owner of subscription %s" msgstr "サブスクリプション %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2892 +#: catalog/aclchk.c:2924 #, c-format msgid "must be owner of table %s" msgstr "テーブル %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2895 +#: catalog/aclchk.c:2927 #, c-format msgid "must be owner of type %s" msgstr "åž‹ %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2898 +#: catalog/aclchk.c:2930 #, c-format msgid "must be owner of view %s" msgstr "ビュー %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2901 +#: catalog/aclchk.c:2933 #, c-format msgid "must be owner of schema %s" msgstr "スキーマ %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2904 +#: catalog/aclchk.c:2936 #, c-format msgid "must be owner of statistics object %s" msgstr "統計情報オブジェクト %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2907 +#: catalog/aclchk.c:2939 #, c-format msgid "must be owner of tablespace %s" msgstr "テーブル空間 %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2910 +#: catalog/aclchk.c:2942 #, c-format msgid "must be owner of text search configuration %s" msgstr "テキスト検索設定 %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2913 +#: catalog/aclchk.c:2945 #, c-format msgid "must be owner of text search dictionary %s" msgstr "テキスト検索辞書 %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2927 +#: catalog/aclchk.c:2959 #, c-format msgid "must be owner of relation %s" msgstr "リレーション %s ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/aclchk.c:2973 +#: catalog/aclchk.c:3005 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: catalog/aclchk.c:3108 catalog/aclchk.c:3994 catalog/aclchk.c:4026 +#: catalog/aclchk.c:3162 catalog/aclchk.c:4170 catalog/aclchk.c:4201 #, c-format msgid "%s with OID %u does not exist" msgstr "OID %2$uã®%1$sã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/aclchk.c:3192 catalog/aclchk.c:3211 +#: catalog/aclchk.c:3245 catalog/aclchk.c:3264 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "OID %2$uã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã«å±žæ€§%1$dã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/aclchk.c:3306 +#: catalog/aclchk.c:3302 catalog/aclchk.c:3365 catalog/aclchk.c:4004 #, c-format msgid "relation with OID %u does not exist" msgstr "OID %uã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/aclchk.c:3491 +#: catalog/aclchk.c:3550 #, c-format msgid "parameter ACL with OID %u does not exist" msgstr "OID %uã®ãƒ‘ラメータACLã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/aclchk.c:3655 commands/collationcmds.c:808 commands/publicationcmds.c:1746 +#: catalog/aclchk.c:3723 commands/collationcmds.c:853 commands/publicationcmds.c:1739 #, c-format msgid "schema with OID %u does not exist" msgstr "OID %uã®ã‚¹ã‚­ãƒ¼ãƒžã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/aclchk.c:3720 utils/cache/typcache.c:385 utils/cache/typcache.c:440 +#: catalog/aclchk.c:3797 catalog/aclchk.c:3824 catalog/aclchk.c:3853 utils/cache/typcache.c:392 utils/cache/typcache.c:447 #, c-format msgid "type with OID %u does not exist" msgstr "OID %uã®åž‹ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/catalog.c:449 +#: catalog/catalog.c:477 #, c-format msgid "still searching for an unused OID in relation \"%s\"" msgstr "リレーション\"%s\"ã§ã®æœªä½¿ç”¨ã®OIDを探索を継続中" -#: catalog/catalog.c:451 +#: catalog/catalog.c:479 #, c-format msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." msgstr[0] "OID候補ã®ãƒã‚§ãƒƒã‚¯ã‚’%llu回行ã„ã¾ã—ãŸãŒã€ä½¿ç”¨ã•れã¦ã„ãªã„OIDã¯ã¾ã è¦‹ã¤ã‹ã£ã¦ã„ã¾ã›ã‚“。" -#: catalog/catalog.c:476 +#: catalog/catalog.c:504 #, c-format msgid "new OID has been assigned in relation \"%s\" after %llu retry" msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" msgstr[0] "リレーション\\\"%s\\\"ã§%llu回ã®è©¦è¡Œå¾Œã«æ–°ã—ã„OIDãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¾ã—ãŸ" -#: catalog/catalog.c:609 catalog/catalog.c:676 +#: catalog/catalog.c:637 catalog/catalog.c:704 #, c-format msgid "must be superuser to call %s()" msgstr "%s()を呼ã³å‡ºã™ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/catalog.c:618 +#: catalog/catalog.c:646 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() ã¯ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™" -#: catalog/catalog.c:623 parser/parse_utilcmd.c:2264 +#: catalog/catalog.c:651 parser/parse_utilcmd.c:2270 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "インデックス\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã«ã¯å±žã—ã¦ã„ã¾ã›ã‚“" -#: catalog/catalog.c:640 +#: catalog/catalog.c:668 #, c-format msgid "column \"%s\" is not of type oid" msgstr "列\"%s\"ã¯oidåž‹ã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/catalog.c:647 +#: catalog/catalog.c:675 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "インデックス\"%s\"ã¯åˆ—\"%s\"ã«å¯¾ã™ã‚‹ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/dependency.c:546 catalog/pg_shdepend.c:658 +#: catalog/dependency.c:497 catalog/pg_shdepend.c:703 #, c-format msgid "cannot drop %s because it is required by the database system" msgstr "データベースシステムãŒå¿…è¦ã¨ã—ã¦ã„ã‚‹ãŸã‚%sを削除ã§ãã¾ã›ã‚“" -#: catalog/dependency.c:838 catalog/dependency.c:1065 +#: catalog/dependency.c:789 catalog/dependency.c:1016 #, c-format msgid "cannot drop %s because %s requires it" msgstr "%2$sãŒå¿…è¦ã¨ã—ã¦ã„ã‚‹ãŸã‚%1$sを削除ã§ãã¾ã›ã‚“" -#: catalog/dependency.c:840 catalog/dependency.c:1067 +#: catalog/dependency.c:791 catalog/dependency.c:1018 #, c-format msgid "You can drop %s instead." msgstr "代ã‚りã«%sを削除ã§ãã¾ã™" -#: catalog/dependency.c:1146 catalog/dependency.c:1155 +#: catalog/dependency.c:1097 catalog/dependency.c:1106 #, c-format msgid "%s depends on %s" msgstr "%sã¯%sã«ä¾å­˜ã—ã¦ã„ã¾ã™" -#: catalog/dependency.c:1170 catalog/dependency.c:1179 +#: catalog/dependency.c:1121 catalog/dependency.c:1130 #, c-format msgid "drop cascades to %s" msgstr "削除ã¯%sã¸ä¼æ’­ã—ã¾ã™" -#: catalog/dependency.c:1187 catalog/pg_shdepend.c:823 +#: catalog/dependency.c:1138 catalog/pg_shdepend.c:868 #, c-format msgid "" "\n" @@ -4116,674 +4468,674 @@ msgstr[0] "" "\n" "ãŠã‚ˆã³%d個ã®ãã®ä»–ã®ã‚ªãƒ–ジェクト(一覧ã«ã¤ã„ã¦ã¯ã‚µãƒ¼ãƒãƒ¼ãƒ­ã‚°ã‚’å‚ç…§ã—ã¦ãã ã•ã„)" -#: catalog/dependency.c:1199 +#: catalog/dependency.c:1150 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "ä»–ã®ã‚ªãƒ–ジェクトãŒä¾å­˜ã—ã¦ã„ã‚‹ãŸã‚%sを削除ã§ãã¾ã›ã‚“" -#: catalog/dependency.c:1202 catalog/dependency.c:1209 catalog/dependency.c:1220 commands/tablecmds.c:1335 commands/tablecmds.c:14386 commands/tablespace.c:466 commands/user.c:1309 commands/vacuum.c:212 commands/view.c:446 libpq/auth.c:326 replication/logical/applyparallelworker.c:1044 replication/syncrep.c:1017 storage/lmgr/deadlock.c:1135 storage/lmgr/proc.c:1358 utils/misc/guc.c:3120 utils/misc/guc.c:3156 utils/misc/guc.c:3226 utils/misc/guc.c:6615 -#: utils/misc/guc.c:6649 utils/misc/guc.c:6683 utils/misc/guc.c:6726 utils/misc/guc.c:6768 +#: catalog/dependency.c:1153 catalog/dependency.c:1160 catalog/dependency.c:1171 commands/tablecmds.c:1459 commands/tablecmds.c:15121 commands/tablespace.c:460 commands/user.c:1302 commands/vacuum.c:211 commands/view.c:441 executor/execExprInterp.c:4655 executor/execExprInterp.c:4663 libpq/auth.c:324 replication/logical/applyparallelworker.c:1041 replication/syncrep.c:1011 storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1432 utils/misc/guc.c:3169 +#: utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6825 utils/misc/guc.c:6859 utils/misc/guc.c:6893 utils/misc/guc.c:6936 utils/misc/guc.c:6978 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1203 catalog/dependency.c:1210 +#: catalog/dependency.c:1154 catalog/dependency.c:1161 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "ä¾å­˜ã—ã¦ã„るオブジェクトも削除ã™ã‚‹ã«ã¯DROP ... CASCADEを使用ã—ã¦ãã ã•ã„" -#: catalog/dependency.c:1207 +#: catalog/dependency.c:1158 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "ä»–ã®ã‚ªãƒ–ジェクトãŒä¾å­˜ã—ã¦ã„ã‚‹ãŸã‚指定ã—ãŸã‚ªãƒ–ジェクトを削除ã§ãã¾ã›ã‚“" -#: catalog/dependency.c:1215 +#: catalog/dependency.c:1166 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" msgstr[0] "削除ã¯ä»–ã®%d個ã®ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ã‚‚行ã‚れã¾ã™" -#: catalog/dependency.c:1899 +#: catalog/dependency.c:1850 #, c-format msgid "constant of the type %s cannot be used here" msgstr "%såž‹ã®å®šæ•°ã‚’ã“ã“ã§ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: catalog/dependency.c:2420 parser/parse_relation.c:3403 parser/parse_relation.c:3413 +#: catalog/dependency.c:2375 parser/parse_relation.c:3407 parser/parse_relation.c:3417 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$d\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/heap.c:324 +#: catalog/heap.c:326 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "\"%s.%s\"を作æˆã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: catalog/heap.c:326 +#: catalog/heap.c:328 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ã®æ›´æ–°ã¯ç¾åœ¨ç¦æ­¢ã•れã¦ã„ã¾ã™" -#: catalog/heap.c:466 commands/tablecmds.c:2374 commands/tablecmds.c:3047 commands/tablecmds.c:6922 +#: catalog/heap.c:468 commands/tablecmds.c:2495 commands/tablecmds.c:2917 commands/tablecmds.c:7163 #, c-format msgid "tables can have at most %d columns" msgstr "ãƒ†ãƒ¼ãƒ–ãƒ«ã¯æœ€å¤§ã§%d列ã¾ã§ã—ã‹æŒã¦ã¾ã›ã‚“" -#: catalog/heap.c:484 commands/tablecmds.c:7229 +#: catalog/heap.c:486 commands/tablecmds.c:7465 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "列å\"%s\"ã¯ã‚·ã‚¹ãƒ†ãƒ ç”¨ã®åˆ—åã«ä½¿ã‚れã¦ã„ã¾ã™" -#: catalog/heap.c:500 +#: catalog/heap.c:502 #, c-format msgid "column name \"%s\" specified more than once" msgstr "列å\"%s\"ãŒè¤‡æ•°æŒ‡å®šã•れã¾ã—ãŸ" #. translator: first %s is an integer not a name -#: catalog/heap.c:575 +#: catalog/heap.c:580 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "パーティションキー列%sã¯ç–‘似型%sã§ã™" -#: catalog/heap.c:580 +#: catalog/heap.c:585 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "列\"%s\"ã¯ç–‘似型%sã§ã™" -#: catalog/heap.c:611 +#: catalog/heap.c:616 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "複åˆåž‹ %s ãŒãれ自身ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ãªã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" #. translator: first %s is an integer not a name -#: catalog/heap.c:666 +#: catalog/heap.c:671 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "ç…§åˆå¯èƒ½ãªåž‹ %2$s ã®ãƒ‘ーティションキー列%1$sã®ãŸã‚ã®ç…§åˆé †åºãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:677 commands/createas.c:198 commands/createas.c:505 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "ç…§åˆå¯èƒ½ãªåž‹ %2$s ã‚’æŒã¤åˆ—\"%1$s\"ã®ãŸã‚ã®ç…§åˆé †åºã‚’決定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: catalog/heap.c:1148 catalog/index.c:886 commands/createas.c:408 commands/tablecmds.c:3987 +#: catalog/heap.c:1162 catalog/index.c:899 commands/createas.c:401 commands/tablecmds.c:4171 #, c-format msgid "relation \"%s\" already exists" msgstr "リレーション\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: catalog/heap.c:1164 catalog/pg_type.c:434 catalog/pg_type.c:782 catalog/pg_type.c:954 commands/typecmds.c:249 commands/typecmds.c:261 commands/typecmds.c:754 commands/typecmds.c:1169 commands/typecmds.c:1395 commands/typecmds.c:1575 commands/typecmds.c:2546 +#: catalog/heap.c:1178 catalog/pg_type.c:434 catalog/pg_type.c:805 catalog/pg_type.c:977 commands/typecmds.c:253 commands/typecmds.c:265 commands/typecmds.c:758 commands/typecmds.c:1179 commands/typecmds.c:1405 commands/typecmds.c:1585 commands/typecmds.c:2556 #, c-format msgid "type \"%s\" already exists" msgstr "åž‹\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: catalog/heap.c:1165 +#: catalog/heap.c:1179 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "リレーションã¯åŒã˜åå‰ã®é–¢é€£ã™ã‚‹åž‹ã‚’æŒã¡ã¾ã™ã€‚ã“ã®ãŸã‚既存ã®åž‹ã¨ç«¶åˆã—ãªã„åå‰ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: catalog/heap.c:1205 +#: catalog/heap.c:1219 #, c-format msgid "toast relfilenumber value not set when in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã«TOASTã®relfilenumberã®å€¤ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#: catalog/heap.c:1216 +#: catalog/heap.c:1230 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã«pg_classã®ãƒ’ープOIDãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#: catalog/heap.c:1226 +#: catalog/heap.c:1240 #, c-format msgid "relfilenumber value not set when in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã«relfilenumberã®å€¤ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#: catalog/heap.c:2119 +#: catalog/heap.c:2185 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"ã« NO INHERIT 制約ã¯è¿½åŠ ã§ãã¾ã›ã‚“" -#: catalog/heap.c:2393 +#: catalog/heap.c:2452 #, c-format msgid "check constraint \"%s\" already exists" msgstr "検査制約\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: catalog/heap.c:2563 catalog/index.c:900 catalog/pg_constraint.c:682 commands/tablecmds.c:8900 +#: catalog/heap.c:2624 catalog/index.c:913 catalog/pg_constraint.c:724 commands/tablecmds.c:9389 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "ã™ã§ã«åˆ¶ç´„\"%s\"ã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã«å­˜åœ¨ã—ã¾ã™" -#: catalog/heap.c:2570 +#: catalog/heap.c:2631 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "制約\"%s\"ã¯ã€ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"上ã®ç¶™æ‰¿ã•れã¦ã„ãªã„制約ã¨ç«¶åˆã—ã¾ã™" -#: catalog/heap.c:2581 +#: catalog/heap.c:2642 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "制約\"%s\"ã¯ã€ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"上ã®ç¶™æ‰¿ã•れãŸåˆ¶ç´„ã¨ç«¶åˆã—ã¾ã™" -#: catalog/heap.c:2591 +#: catalog/heap.c:2652 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "制約\"%s\"ã¯ã€ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"上㮠NOT VALID 制約ã¨ç«¶åˆã—ã¾ã™" -#: catalog/heap.c:2596 +#: catalog/heap.c:2657 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "継承ã•れãŸå®šç¾©ã«ã‚ˆã‚Šåˆ¶ç´„\"%s\"をマージã—ã¦ã„ã¾ã™" -#: catalog/heap.c:2622 catalog/pg_constraint.c:811 commands/tablecmds.c:2672 commands/tablecmds.c:3199 commands/tablecmds.c:6858 commands/tablecmds.c:15208 commands/tablecmds.c:15349 +#: catalog/heap.c:2683 catalog/pg_constraint.c:853 commands/tablecmds.c:3074 commands/tablecmds.c:3377 commands/tablecmds.c:7089 commands/tablecmds.c:15940 commands/tablecmds.c:16071 #, c-format msgid "too many inheritance parents" msgstr "継承ã®è¦ªãƒ†ãƒ¼ãƒ–ルãŒå¤šã™ãŽã¾ã™" -#: catalog/heap.c:2706 +#: catalog/heap.c:2767 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "生æˆã‚«ãƒ©ãƒ \"%s\"ã¯ã‚«ãƒ©ãƒ ç”Ÿæˆå¼ä¸­ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: catalog/heap.c:2708 +#: catalog/heap.c:2769 #, c-format msgid "A generated column cannot reference another generated column." msgstr "生æˆã‚«ãƒ©ãƒ ã¯ä»–ã®ç”Ÿæˆã‚«ãƒ©ãƒ ã‚’å‚ç…§ã§ãã¾ã›ã‚“。" -#: catalog/heap.c:2714 +#: catalog/heap.c:2775 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "列生æˆå¼å†…ã§ã¯è¡Œå…¨ä½“å‚ç…§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: catalog/heap.c:2715 +#: catalog/heap.c:2776 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "ã“れã¯ç”Ÿæˆåˆ—を自身ã®å€¤ã«ä¾å­˜ã•ã›ã‚‹ã“ã¨ã«ã¤ãªãŒã‚Šã¾ã™ã€‚" -#: catalog/heap.c:2768 +#: catalog/heap.c:2831 #, c-format msgid "generation expression is not immutable" msgstr "生æˆå¼ã¯ä¸å¤‰ã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/heap.c:2796 rewrite/rewriteHandler.c:1297 +#: catalog/heap.c:2859 rewrite/rewriteHandler.c:1276 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "列\"%s\"ã®åž‹ã¯%sã§ã™ãŒã€ãƒ‡ãƒ•ォルトå¼ã®åž‹ã¯%sã§ã™" -#: catalog/heap.c:2801 commands/prepare.c:334 parser/analyze.c:2704 parser/parse_target.c:593 parser/parse_target.c:874 parser/parse_target.c:884 rewrite/rewriteHandler.c:1302 +#: catalog/heap.c:2864 commands/prepare.c:331 parser/analyze.c:2758 parser/parse_target.c:592 parser/parse_target.c:882 parser/parse_target.c:892 rewrite/rewriteHandler.c:1281 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "å¼ã‚’æ›¸ãæ›ãˆã‚‹ã‹ã‚­ãƒ£ã‚¹ãƒˆã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: catalog/heap.c:2848 +#: catalog/heap.c:2911 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "検査制約ã§ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã®ã¿ã‚’å‚ç…§ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™" -#: catalog/heap.c:3154 +#: catalog/heap.c:3217 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "ON COMMITã¨å¤–部キーã®çµ„ã¿åˆã‚ã›ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: catalog/heap.c:3155 +#: catalog/heap.c:3218 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "テーブル\"%s\"ã¯\"%s\"ã‚’å‚ç…§ã—ã¾ã™ã€‚ã—ã‹ã—ã€ã“れらã®ON COMMIT設定ã¯åŒä¸€ã§ã¯ã‚りã¾ã›ã‚“。" -#: catalog/heap.c:3160 +#: catalog/heap.c:3223 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "外部キー制約ã§å‚ç…§ã•れã¦ã„るテーブルを削除ã§ãã¾ã›ã‚“" -#: catalog/heap.c:3161 +#: catalog/heap.c:3224 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "テーブル\"%s\"ã¯\"%s\"ã‚’å‚ç…§ã—ã¾ã™ã€‚" -#: catalog/heap.c:3163 +#: catalog/heap.c:3226 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "åŒæ™‚ã«ãƒ†ãƒ¼ãƒ–ル\"%s\"ãŒtruncateã•れã¾ã—ãŸã€‚TRUNCATE ... CASCADEを使用ã—ã¦ãã ã•ã„。" -#: catalog/index.c:224 parser/parse_utilcmd.c:2170 +#: catalog/index.c:219 parser/parse_utilcmd.c:2176 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "テーブル\"%s\"ã«è¤‡æ•°ã®ãƒ—ライマリキーをæŒãŸã›ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: catalog/index.c:238 +#: catalog/index.c:233 #, c-format msgid "primary keys cannot use NULLS NOT DISTINCT indexes" msgstr "プライマリキーã§ã¯NULLS NOT DISTINCTã§ã‚るインデックスを使用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: catalog/index.c:255 +#: catalog/index.c:250 #, c-format msgid "primary keys cannot be expressions" msgstr "プライマリキーをå¼ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: catalog/index.c:272 +#: catalog/index.c:267 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "主キー列\"%s\"ãŒNOT NULL指定ã•れã¦ã„ã¾ã›ã‚“" -#: catalog/index.c:785 catalog/index.c:1941 +#: catalog/index.c:798 catalog/index.c:1915 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "ユーザーã«ã‚ˆã‚‹ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ãƒ†ãƒ¼ãƒ–ルã«å¯¾ã™ã‚‹ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®å®šç¾©ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: catalog/index.c:825 +#: catalog/index.c:838 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "éžæ±ºå®šçš„ç…§åˆé †åºã¯æ¼”ç®—å­ã‚¯ãƒ©ã‚¹ \"%s\" ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: catalog/index.c:840 +#: catalog/index.c:853 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "システムカタログテーブルã®ä¸¦è¡Œçš„インデックス作æˆã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: catalog/index.c:849 catalog/index.c:1317 +#: catalog/index.c:862 catalog/index.c:1331 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "排他制約ã®ãŸã‚ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ä¸¦åˆ—的作æˆã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: catalog/index.c:858 +#: catalog/index.c:871 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "initdbã®å¾Œã«å…±æœ‰ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’作æˆã§ãã¾ã›ã‚“" -#: catalog/index.c:878 commands/createas.c:423 commands/sequence.c:158 parser/parse_utilcmd.c:209 +#: catalog/index.c:891 commands/createas.c:416 commands/sequence.c:159 parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "リレーション\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: catalog/index.c:928 +#: catalog/index.c:941 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã«pg_classã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹OIDãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#: catalog/index.c:938 utils/cache/relcache.c:3730 +#: catalog/index.c:951 utils/cache/relcache.c:3791 #, c-format msgid "index relfilenumber value not set when in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã«ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®relfilenumberã®å€¤ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#: catalog/index.c:2240 +#: catalog/index.c:2214 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLYã¯ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å†…ã§æœ€åˆã®æ“作ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: catalog/index.c:3647 +#: catalog/index.c:3668 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚テーブルã¯ã‚¤ãƒ³ãƒ‡ã‚¯ã‚¹å†æ§‹ç¯‰ã§ãã¾ã›ã‚“" -#: catalog/index.c:3658 commands/indexcmds.c:3623 +#: catalog/index.c:3679 commands/indexcmds.c:3626 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "TOASTテーブルã®ç„¡åйãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®å†ä½œæˆã¯ã§ãã¾ã›ã‚“" -#: catalog/index.c:3674 commands/indexcmds.c:3503 commands/indexcmds.c:3647 commands/tablecmds.c:3402 +#: catalog/index.c:3695 commands/indexcmds.c:3504 commands/indexcmds.c:3650 commands/tablecmds.c:3581 #, c-format msgid "cannot move system relation \"%s\"" msgstr "システムリレーション\"%s\"を移動ã§ãã¾ã›ã‚“" -#: catalog/index.c:3818 +#: catalog/index.c:3832 #, c-format msgid "index \"%s\" was reindexed" msgstr "インデックス\"%s\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ãŒå®Œäº†ã—ã¾ã—ãŸ" -#: catalog/index.c:3955 +#: catalog/index.c:3998 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "TOASTテーブルã®ç„¡åйãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ \"%s.%s\"ã®å†ä½œæˆã¯ã§ãã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™ " -#: catalog/namespace.c:260 catalog/namespace.c:464 catalog/namespace.c:556 commands/trigger.c:5687 +#: catalog/namespace.c:462 catalog/namespace.c:666 catalog/namespace.c:758 commands/trigger.c:5729 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "データベース間ã®å‚ç…§ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“: \"%s.%s.%s\"" -#: catalog/namespace.c:317 +#: catalog/namespace.c:519 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "一時テーブルã«ã¯ã‚¹ã‚­ãƒ¼ãƒžåを指定ã§ãã¾ã›ã‚“" -#: catalog/namespace.c:398 +#: catalog/namespace.c:600 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" msgstr "リレーション\"%s.%s\"ã®ãƒ­ãƒƒã‚¯ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: catalog/namespace.c:403 commands/lockcmds.c:145 commands/lockcmds.c:225 +#: catalog/namespace.c:605 commands/lockcmds.c:143 commands/lockcmds.c:223 #, c-format msgid "could not obtain lock on relation \"%s\"" msgstr "リレーション\"%s\"ã®ãƒ­ãƒƒã‚¯ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: catalog/namespace.c:431 parser/parse_relation.c:1429 +#: catalog/namespace.c:633 parser/parse_relation.c:1430 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "リレーション\"%s.%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/namespace.c:436 parser/parse_relation.c:1442 parser/parse_relation.c:1450 utils/adt/regproc.c:913 +#: catalog/namespace.c:638 parser/parse_relation.c:1443 parser/parse_relation.c:1451 utils/adt/regproc.c:913 #, c-format msgid "relation \"%s\" does not exist" msgstr "リレーション\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/namespace.c:502 catalog/namespace.c:3073 commands/extension.c:1584 commands/extension.c:1590 +#: catalog/namespace.c:704 catalog/namespace.c:3522 commands/extension.c:1607 commands/extension.c:1613 #, c-format msgid "no schema has been selected to create in" msgstr "作æˆå…ˆã®ã‚¹ã‚­ãƒ¼ãƒžãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“" -#: catalog/namespace.c:654 catalog/namespace.c:667 +#: catalog/namespace.c:856 catalog/namespace.c:869 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚スキーマã®ä¸­ã«ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’作æˆã§ãã¾ã›ã‚“" -#: catalog/namespace.c:658 +#: catalog/namespace.c:860 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "éžä¸€æ™‚スキーマã®ä¸­ã«ä¸€æ™‚リレーションを作æˆã§ãã¾ã›ã‚“" -#: catalog/namespace.c:673 +#: catalog/namespace.c:875 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "一時スキーマã®ä¸­ã«ã¯ä¸€æ™‚リレーションã—ã‹ä½œæˆã§ãã¾ã›ã‚“" -#: catalog/namespace.c:2265 +#: catalog/namespace.c:2619 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "統計情報オブジェクト\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/namespace.c:2388 +#: catalog/namespace.c:2761 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "テキスト検索パーサ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/namespace.c:2514 utils/adt/regproc.c:1439 +#: catalog/namespace.c:2906 utils/adt/regproc.c:1459 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "テキスト検索辞書\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/namespace.c:2641 +#: catalog/namespace.c:3052 #, c-format msgid "text search template \"%s\" does not exist" msgstr "テキスト検索テンプレート\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/namespace.c:2767 commands/tsearchcmds.c:1162 utils/adt/regproc.c:1329 utils/cache/ts_cache.c:635 +#: catalog/namespace.c:3197 commands/tsearchcmds.c:1168 utils/adt/regproc.c:1349 utils/cache/ts_cache.c:635 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "テキスト検索設定\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/namespace.c:2880 parser/parse_expr.c:832 parser/parse_target.c:1246 +#: catalog/namespace.c:3329 parser/parse_expr.c:868 parser/parse_target.c:1259 #, c-format msgid "cross-database references are not implemented: %s" msgstr "データベース間ã®å‚ç…§ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“: %s" -#: catalog/namespace.c:2886 gram.y:18570 gram.y:18610 parser/parse_expr.c:839 parser/parse_target.c:1253 +#: catalog/namespace.c:3335 gram.y:19181 gram.y:19221 parser/parse_expr.c:875 parser/parse_target.c:1266 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "修飾åãŒä¸é©åˆ‡ã§ã™(ドット区切りã®åå‰ãŒå¤šã™ãŽã¾ã™): %s" -#: catalog/namespace.c:3016 +#: catalog/namespace.c:3465 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "一時スキーマã¸ã€ã¾ãŸã¯ä¸€æ™‚スキーマã‹ã‚‰ã‚ªãƒ–ジェクトを移動ã§ãã¾ã›ã‚“" -#: catalog/namespace.c:3022 +#: catalog/namespace.c:3471 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "TOASTスキーマã¸ã€ã¾ãŸã¯TOASTスキーマã‹ã‚‰ã‚ªãƒ–ジェクトを移動ã§ãã¾ã›ã‚“" -#: catalog/namespace.c:3095 commands/schemacmds.c:264 commands/schemacmds.c:344 commands/tablecmds.c:1280 utils/adt/regproc.c:1668 +#: catalog/namespace.c:3544 commands/schemacmds.c:264 commands/schemacmds.c:344 commands/tablecmds.c:1404 utils/adt/regproc.c:1688 #, c-format msgid "schema \"%s\" does not exist" msgstr "スキーマ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/namespace.c:3126 +#: catalog/namespace.c:3575 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "リレーションåãŒä¸é©åˆ‡ã§ã™(ドット区切りã®åå‰ãŒå¤šã™ãŽã¾ã™): %s" -#: catalog/namespace.c:3693 utils/adt/regproc.c:1056 +#: catalog/namespace.c:4016 utils/adt/regproc.c:1056 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "エンコーディング\"%2$s\"ã®ç…§åˆé †åº\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/namespace.c:3748 +#: catalog/namespace.c:4071 #, c-format msgid "conversion \"%s\" does not exist" msgstr "変æ›\"%sã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/namespace.c:4012 +#: catalog/namespace.c:4412 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "データベース\"%s\"ã«ä¸€æ™‚テーブルを作æˆã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: catalog/namespace.c:4028 +#: catalog/namespace.c:4428 #, c-format msgid "cannot create temporary tables during recovery" msgstr "リカãƒãƒªä¸­ã¯ä¸€æ™‚テーブルを作æˆã§ãã¾ã›ã‚“" -#: catalog/namespace.c:4034 +#: catalog/namespace.c:4434 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "並行処ç†ä¸­ã¯ä¸€æ™‚テーブルを作æˆã§ãã¾ã›ã‚“" -#: catalog/objectaddress.c:1409 commands/policy.c:96 commands/policy.c:376 commands/tablecmds.c:248 commands/tablecmds.c:290 commands/tablecmds.c:2206 commands/tablecmds.c:12357 +#: catalog/objectaddress.c:1371 commands/policy.c:93 commands/policy.c:373 commands/tablecmds.c:257 commands/tablecmds.c:299 commands/tablecmds.c:2327 commands/tablecmds.c:12958 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ルã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/objectaddress.c:1416 commands/tablecmds.c:260 commands/tablecmds.c:17169 commands/view.c:119 +#: catalog/objectaddress.c:1378 commands/tablecmds.c:269 commands/tablecmds.c:17884 commands/view.c:114 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\"ã¯ãƒ“ューã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/objectaddress.c:1423 commands/matview.c:187 commands/tablecmds.c:266 commands/tablecmds.c:17174 +#: catalog/objectaddress.c:1385 commands/matview.c:199 commands/tablecmds.c:275 commands/tablecmds.c:17889 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\"ã¯å®Ÿä½“化ビューã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/objectaddress.c:1430 commands/tablecmds.c:284 commands/tablecmds.c:17179 +#: catalog/objectaddress.c:1392 commands/tablecmds.c:293 commands/tablecmds.c:17894 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\"ã¯å¤–部テーブルã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/objectaddress.c:1471 +#: catalog/objectaddress.c:1433 #, c-format msgid "must specify relation and object name" msgstr "リレーションã¨ã‚ªãƒ–ジェクトã®åå‰ã®æŒ‡å®šãŒå¿…è¦ã§ã™" -#: catalog/objectaddress.c:1547 catalog/objectaddress.c:1600 +#: catalog/objectaddress.c:1509 catalog/objectaddress.c:1562 #, c-format msgid "column name must be qualified" msgstr "列åを修飾ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/objectaddress.c:1619 +#: catalog/objectaddress.c:1581 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã«å¯¾ã™ã‚‹ãƒ‡ãƒ•ォルト値ãŒå­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/objectaddress.c:1656 commands/functioncmds.c:137 commands/tablecmds.c:276 commands/typecmds.c:274 commands/typecmds.c:3689 parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 utils/adt/acl.c:4449 +#: catalog/objectaddress.c:1618 commands/functioncmds.c:132 commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3843 parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 utils/adt/acl.c:4560 #, c-format msgid "type \"%s\" does not exist" msgstr "åž‹\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/objectaddress.c:1775 +#: catalog/objectaddress.c:1737 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "%4$sã®æ¼”ç®—å­ %1$d (%2$s, %3$s) ãŒã‚りã¾ã›ã‚“" -#: catalog/objectaddress.c:1806 +#: catalog/objectaddress.c:1768 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "%4$s ã®é–¢æ•° %1$d (%2$s, %3$s) ãŒã‚りã¾ã›ã‚“" -#: catalog/objectaddress.c:1857 catalog/objectaddress.c:1883 +#: catalog/objectaddress.c:1819 catalog/objectaddress.c:1845 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "ユーザー\"%s\"ã«å¯¾ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒžãƒƒãƒ”ングãŒã‚µãƒ¼ãƒãƒ¼\"%s\"ã«ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/objectaddress.c:1872 commands/foreigncmds.c:430 commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:700 +#: catalog/objectaddress.c:1834 commands/foreigncmds.c:430 commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:713 #, c-format msgid "server \"%s\" does not exist" msgstr "サーãƒãƒ¼\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/objectaddress.c:1939 +#: catalog/objectaddress.c:1901 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" -msgstr "パブリケーション\"%2$s\"ã®ç™ºè¡Œãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" +msgstr "パブリケーション\"%2$s\"ã«ãƒ‘ブリケーションリレーション\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/objectaddress.c:1986 +#: catalog/objectaddress.c:1948 #, c-format msgid "publication schema \"%s\" in publication \"%s\" does not exist" -msgstr "パブリケーション\"%2$s\"ã«ç™ºè¡Œãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" +msgstr "パブリケーション\"%2$s\"ã«ãƒ‘ブリケーションスキーマ\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/objectaddress.c:2044 +#: catalog/objectaddress.c:2006 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "デフォルトã®ACLオブジェクトタイプ\"%c\"ã¯èªè­˜ã§ãã¾ã›ã‚“" -#: catalog/objectaddress.c:2045 +#: catalog/objectaddress.c:2007 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "有効ãªå€¤ã¯ \"%c\", \"%c\", \"%c\", \"%c\", \"%c\" ã§ã™ã€‚" -#: catalog/objectaddress.c:2096 +#: catalog/objectaddress.c:2058 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "ユーザー\"%s\"ã«å¯¾ã™ã‚‹ã€åå‰ç©ºé–“\"%s\"ã®%sã¸ã®ãƒ‡ãƒ•ォルトã®ACLã¯ã‚りã¾ã›ã‚“" -#: catalog/objectaddress.c:2101 +#: catalog/objectaddress.c:2063 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "ユーザー\"%s\"ã«å¯¾ã™ã‚‹%sã¸ã®ãƒ‡ãƒ•ォルトACLã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/objectaddress.c:2127 catalog/objectaddress.c:2184 catalog/objectaddress.c:2239 +#: catalog/objectaddress.c:2089 catalog/objectaddress.c:2146 catalog/objectaddress.c:2201 #, c-format msgid "name or argument lists may not contain nulls" msgstr "åå‰ã¾ãŸã¯å¼•æ•°ã®ãƒªã‚¹ãƒˆã¯nullã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: catalog/objectaddress.c:2161 +#: catalog/objectaddress.c:2123 #, c-format msgid "unsupported object type \"%s\"" msgstr "サãƒãƒ¼ãƒˆã•れãªã„オブジェクトタイプ\"%s\"" -#: catalog/objectaddress.c:2180 catalog/objectaddress.c:2197 catalog/objectaddress.c:2262 catalog/objectaddress.c:2346 +#: catalog/objectaddress.c:2142 catalog/objectaddress.c:2159 catalog/objectaddress.c:2224 catalog/objectaddress.c:2308 #, c-format msgid "name list length must be exactly %d" msgstr "åå‰ãƒªã‚¹ãƒˆã®é•·ã•ã¯æ­£ç¢ºã«%dã§ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: catalog/objectaddress.c:2201 +#: catalog/objectaddress.c:2163 #, c-format msgid "large object OID may not be null" msgstr "ラージオブジェクトã®OIDã¯nullã«ã¯ãªã‚Šå¾—ã¾ã›ã‚“" -#: catalog/objectaddress.c:2210 catalog/objectaddress.c:2280 catalog/objectaddress.c:2287 +#: catalog/objectaddress.c:2172 catalog/objectaddress.c:2242 catalog/objectaddress.c:2249 #, c-format msgid "name list length must be at least %d" msgstr "åå‰ãƒªã‚¹ãƒˆã®é•·ã•ã¯%d以上ã§ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: catalog/objectaddress.c:2273 catalog/objectaddress.c:2294 +#: catalog/objectaddress.c:2235 catalog/objectaddress.c:2256 #, c-format msgid "argument list length must be exactly %d" msgstr "引数リストã®é•·ã•ã¯ã¡ã‚‡ã†ã©%dã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/objectaddress.c:2508 libpq/be-fsstubs.c:329 +#: catalog/objectaddress.c:2470 libpq/be-fsstubs.c:329 #, c-format msgid "must be owner of large object %u" msgstr "ラージオブジェクト %u ã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/objectaddress.c:2523 commands/functioncmds.c:1561 +#: catalog/objectaddress.c:2485 commands/functioncmds.c:1560 #, c-format msgid "must be owner of type %s or type %s" msgstr "åž‹%sã¾ãŸã¯åž‹%sã®æ‰€æœ‰è€…ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/objectaddress.c:2550 catalog/objectaddress.c:2559 catalog/objectaddress.c:2565 +#: catalog/objectaddress.c:2512 catalog/objectaddress.c:2521 catalog/objectaddress.c:2527 #, c-format msgid "permission denied" msgstr "権é™ãŒã‚りã¾ã›ã‚“" -#: catalog/objectaddress.c:2551 catalog/objectaddress.c:2560 +#: catalog/objectaddress.c:2513 catalog/objectaddress.c:2522 #, c-format msgid "The current user must have the %s attribute." msgstr "ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯%s属性をæŒã¤å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: catalog/objectaddress.c:2566 +#: catalog/objectaddress.c:2528 #, c-format msgid "The current user must have the %s option on role \"%s\"." msgstr "ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯ãƒ­ãƒ¼ãƒ«\"%2$s\"ã«å¯¾ã™ã‚‹%1$sオプションをæŒã£ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: catalog/objectaddress.c:2580 +#: catalog/objectaddress.c:2542 #, c-format msgid "must be superuser" msgstr "スーパーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: catalog/objectaddress.c:2649 +#: catalog/objectaddress.c:2611 #, c-format msgid "unrecognized object type \"%s\"" msgstr "èªè­˜ã•れãªã„オブジェクトタイプ\"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2941 +#: catalog/objectaddress.c:2928 #, c-format msgid "column %s of %s" msgstr "%2$s ã®åˆ— %1$s" -#: catalog/objectaddress.c:2956 +#: catalog/objectaddress.c:2943 #, c-format msgid "function %s" msgstr "関数%s" -#: catalog/objectaddress.c:2969 +#: catalog/objectaddress.c:2956 #, c-format msgid "type %s" msgstr "åž‹%s" -#: catalog/objectaddress.c:3006 +#: catalog/objectaddress.c:2993 #, c-format msgid "cast from %s to %s" msgstr "%sã‹ã‚‰%sã¸ã®åž‹å¤‰æ›" -#: catalog/objectaddress.c:3039 +#: catalog/objectaddress.c:3026 #, c-format msgid "collation %s" msgstr "ç…§åˆé †åº%s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3070 +#: catalog/objectaddress.c:3057 #, c-format msgid "constraint %s on %s" msgstr "%2$sã«å¯¾ã™ã‚‹åˆ¶ç´„%1$s" -#: catalog/objectaddress.c:3076 +#: catalog/objectaddress.c:3063 #, c-format msgid "constraint %s" msgstr "制約%s" -#: catalog/objectaddress.c:3108 +#: catalog/objectaddress.c:3095 #, c-format msgid "conversion %s" msgstr "変æ›%s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3130 +#: catalog/objectaddress.c:3117 #, c-format msgid "default value for %s" msgstr "%s ã®ãƒ‡ãƒ•ォルト値" -#: catalog/objectaddress.c:3141 +#: catalog/objectaddress.c:3128 #, c-format msgid "language %s" msgstr "言語%s" -#: catalog/objectaddress.c:3149 +#: catalog/objectaddress.c:3136 #, c-format msgid "large object %u" msgstr "ラージオブジェクト%u" -#: catalog/objectaddress.c:3162 +#: catalog/objectaddress.c:3149 #, c-format msgid "operator %s" msgstr "演算å­%s" -#: catalog/objectaddress.c:3199 +#: catalog/objectaddress.c:3186 #, c-format msgid "operator class %s for access method %s" msgstr "アクセスメソッド%2$sç”¨ã®æ¼”ç®—å­ã‚¯ãƒ©ã‚¹%1$s" -#: catalog/objectaddress.c:3227 +#: catalog/objectaddress.c:3214 #, c-format msgid "access method %s" msgstr "アクセスメソッド%s" @@ -4792,7 +5144,7 @@ msgstr "アクセスメソッド%s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3276 +#: catalog/objectaddress.c:3269 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "%4$sã®æ¼”ç®—å­%1$d (%2$s, %3$s): %5$s" @@ -4801,236 +5153,236 @@ msgstr "%4$sã®æ¼”ç®—å­%1$d (%2$s, %3$s): %5$s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3333 +#: catalog/objectaddress.c:3334 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "%4$s ã®é–¢æ•° %1$d (%2$s, %3$s): %5$s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3385 +#: catalog/objectaddress.c:3388 #, c-format msgid "rule %s on %s" msgstr "%2$s ã®ãƒ«ãƒ¼ãƒ« %1$s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3431 +#: catalog/objectaddress.c:3434 #, c-format msgid "trigger %s on %s" msgstr "%2$s ã®ãƒˆãƒªã‚¬ %1$s" -#: catalog/objectaddress.c:3451 +#: catalog/objectaddress.c:3454 #, c-format msgid "schema %s" msgstr "スキーマ%s" -#: catalog/objectaddress.c:3479 +#: catalog/objectaddress.c:3482 #, c-format msgid "statistics object %s" msgstr "統計オブジェクト%s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3513 #, c-format msgid "text search parser %s" msgstr "テキスト検索パーサ%s" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3544 #, c-format msgid "text search dictionary %s" msgstr "テキスト検索辞書%s" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3575 #, c-format msgid "text search template %s" msgstr "テキスト検索テンプレート%s" -#: catalog/objectaddress.c:3603 +#: catalog/objectaddress.c:3606 #, c-format msgid "text search configuration %s" msgstr "テキスト検索設定%s" -#: catalog/objectaddress.c:3616 +#: catalog/objectaddress.c:3619 #, c-format msgid "role %s" msgstr "ロール%s" -#: catalog/objectaddress.c:3653 catalog/objectaddress.c:5505 +#: catalog/objectaddress.c:3656 catalog/objectaddress.c:5505 #, c-format msgid "membership of role %s in role %s" msgstr "ロール%sã®ãƒ­ãƒ¼ãƒ«%sã¸ã®æ‰€å±ž" -#: catalog/objectaddress.c:3674 +#: catalog/objectaddress.c:3677 #, c-format msgid "database %s" msgstr "データベース%s" -#: catalog/objectaddress.c:3690 +#: catalog/objectaddress.c:3693 #, c-format msgid "tablespace %s" msgstr "テーブル空間%s" -#: catalog/objectaddress.c:3701 +#: catalog/objectaddress.c:3704 #, c-format msgid "foreign-data wrapper %s" msgstr "外部データラッパー%s" -#: catalog/objectaddress.c:3711 +#: catalog/objectaddress.c:3714 #, c-format msgid "server %s" msgstr "サーãƒãƒ¼%s" -#: catalog/objectaddress.c:3744 +#: catalog/objectaddress.c:3747 #, c-format msgid "user mapping for %s on server %s" msgstr "サーãƒãƒ¼%2$s上ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒžãƒƒãƒ”ング%1$s" -#: catalog/objectaddress.c:3796 +#: catalog/objectaddress.c:3799 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "スキーマ %2$s ã®ãƒ­ãƒ¼ãƒ« %1$s ã®ã‚‚ã®ã§ã‚ã‚‹æ–°ã—ã„リレーションã®ãƒ‡ãƒ•ォルト権é™" -#: catalog/objectaddress.c:3800 +#: catalog/objectaddress.c:3803 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "æ–°ã—ã„リレーションã«é–¢ã™ã‚‹ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ¨©é™ã¯ã€ãƒ­ãƒ¼ãƒ«%sã«å±žã—ã¾ã™ã€‚" -#: catalog/objectaddress.c:3806 +#: catalog/objectaddress.c:3809 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "スキーマ %2$s ã®ãƒ­ãƒ¼ãƒ« %1$s ã®ã‚‚ã®ã§ã‚ã‚‹æ–°ã—ã„シーケンスã®ãƒ‡ãƒ•ォルト権é™" -#: catalog/objectaddress.c:3810 +#: catalog/objectaddress.c:3813 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "æ–°ã—ã„シーケンスã«é–¢ã™ã‚‹ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ¨©é™ã¯ã€ãƒ­ãƒ¼ãƒ«%sã«å±žã—ã¾ã™ã€‚" -#: catalog/objectaddress.c:3816 +#: catalog/objectaddress.c:3819 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "スキーマ %2$s ã®ãƒ­ãƒ¼ãƒ« %1$s ã®ã‚‚ã®ã§ã‚ã‚‹æ–°ã—ã„関数ã®ãƒ‡ãƒ•ォルト権é™" -#: catalog/objectaddress.c:3820 +#: catalog/objectaddress.c:3823 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "æ–°ã—ã„関数ã«é–¢ã™ã‚‹ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ¨©é™ã¯ã€ãƒ­ãƒ¼ãƒ«%sã«å±žã—ã¾ã™ã€‚" -#: catalog/objectaddress.c:3826 +#: catalog/objectaddress.c:3829 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "スキーマ %2$s ã®ãƒ­ãƒ¼ãƒ« %1$s ã®ã‚‚ã®ã§ã‚ã‚‹æ–°ã—ã„åž‹ã®ãƒ‡ãƒ•ォルト権é™" -#: catalog/objectaddress.c:3830 +#: catalog/objectaddress.c:3833 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "æ–°ã—ã„åž‹ã«é–¢ã™ã‚‹ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ¨©é™ã¯ã€ãƒ­ãƒ¼ãƒ«%sã«å±žã—ã¾ã™" -#: catalog/objectaddress.c:3836 +#: catalog/objectaddress.c:3839 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "ロール%sã«å±žã™ã‚‹æ–°ã—ã„スキーマ上ã®ãƒ‡ãƒ•ォルト権é™" -#: catalog/objectaddress.c:3843 +#: catalog/objectaddress.c:3846 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "スキーマ %2$s ã®ãƒ­ãƒ¼ãƒ« %1$s ã«å±žã™ã‚‹ãƒ‡ãƒ•ォルト権é™" -#: catalog/objectaddress.c:3847 +#: catalog/objectaddress.c:3850 #, c-format msgid "default privileges belonging to role %s" msgstr "ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ¨©é™ã¯ãƒ­ãƒ¼ãƒ«%sã«å±žã—ã¾ã™ã€‚" -#: catalog/objectaddress.c:3869 +#: catalog/objectaddress.c:3872 #, c-format msgid "extension %s" msgstr "機能拡張%s" -#: catalog/objectaddress.c:3886 +#: catalog/objectaddress.c:3889 #, c-format msgid "event trigger %s" msgstr "イベントトリガ%s" -#: catalog/objectaddress.c:3910 +#: catalog/objectaddress.c:3913 #, c-format msgid "parameter %s" msgstr "パラメータ %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3953 +#: catalog/objectaddress.c:3956 #, c-format msgid "policy %s on %s" msgstr "%2$s ã®ãƒãƒªã‚· %1$s" -#: catalog/objectaddress.c:3967 +#: catalog/objectaddress.c:3970 #, c-format msgid "publication %s" msgstr "パブリケーション%s" -#: catalog/objectaddress.c:3980 +#: catalog/objectaddress.c:3983 #, c-format msgid "publication of schema %s in publication %s" -msgstr "パブリケーション%2$sã§ã®ã‚¹ã‚­ãƒ¼ãƒž%1$sã®ç™ºè¡Œ" +msgstr "パブリケーション%2$sã§ã®ã‚¹ã‚­ãƒ¼ãƒž%1$sã®ãƒ‘ブリケーション" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:4011 +#: catalog/objectaddress.c:4014 #, c-format msgid "publication of %s in publication %s" -msgstr "パブリケーション %2$s ã§ã® %1$s ã®ç™ºè¡Œ" +msgstr "パブリケーション %2$s ã§ã® %1$s ã®ãƒ‘ブリケーション" -#: catalog/objectaddress.c:4024 +#: catalog/objectaddress.c:4027 #, c-format msgid "subscription %s" msgstr "サブスクリプション%s" -#: catalog/objectaddress.c:4045 +#: catalog/objectaddress.c:4048 #, c-format msgid "transform for %s language %s" msgstr "言語%2$sã®%1$såž‹ã«å¯¾ã™ã‚‹å¤‰æ›" -#: catalog/objectaddress.c:4116 +#: catalog/objectaddress.c:4117 #, c-format msgid "table %s" msgstr "テーブル%s" -#: catalog/objectaddress.c:4121 +#: catalog/objectaddress.c:4122 #, c-format msgid "index %s" msgstr "インデックス%s" -#: catalog/objectaddress.c:4125 +#: catalog/objectaddress.c:4126 #, c-format msgid "sequence %s" msgstr "シーケンス%s" -#: catalog/objectaddress.c:4129 +#: catalog/objectaddress.c:4130 #, c-format msgid "toast table %s" msgstr "TOASTテーブル%s" -#: catalog/objectaddress.c:4133 +#: catalog/objectaddress.c:4134 #, c-format msgid "view %s" msgstr "ビュー%s" -#: catalog/objectaddress.c:4137 +#: catalog/objectaddress.c:4138 #, c-format msgid "materialized view %s" msgstr "実体化ビュー%s" -#: catalog/objectaddress.c:4141 +#: catalog/objectaddress.c:4142 #, c-format msgid "composite type %s" msgstr "複åˆåž‹%s" -#: catalog/objectaddress.c:4145 +#: catalog/objectaddress.c:4146 #, c-format msgid "foreign table %s" msgstr "外部テーブル%s" -#: catalog/objectaddress.c:4150 +#: catalog/objectaddress.c:4151 #, c-format msgid "relation %s" msgstr "リレーション%s" -#: catalog/objectaddress.c:4191 +#: catalog/objectaddress.c:4192 #, c-format msgid "operator family %s for access method %s" msgstr "アクセスメソッド%2$sã®æ¼”ç®—å­æ—%1$s" @@ -5071,7 +5423,7 @@ msgstr "é·ç§»é–¢æ•°ãŒSTRICTã‹ã¤é·ç§»ç”¨ã®åž‹ãŒå…¥åŠ›åž‹ã¨ãƒã‚¤ãƒŠãƒªäº’ msgid "return type of inverse transition function %s is not %s" msgstr "逆é·ç§»é–¢æ•°%sã®æˆ»ã‚Šå€¤ã®åž‹ãŒ%sã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3009 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2991 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "集約ã®å‰é€²ã¨å転ã®é·ç§»é–¢æ•°ã®STRICT属性ã¯ä¸€è‡´ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™" @@ -5086,7 +5438,7 @@ msgstr "追加ã®å¼•æ•°ã‚’æŒã¤æœ€çµ‚関数ã¯STRICT宣言ã§ãã¾ã›ã‚“" msgid "return type of combine function %s is not %s" msgstr "çµåˆé–¢æ•°%sã®æˆ»ã‚Šå€¤ã®åž‹ãŒ%sã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3903 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3902 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "é·ç§»ã‚¿ã‚¤ãƒ—%sã®çµåˆé–¢æ•°ã¯STRICT宣言ã§ãã¾ã›ã‚“" @@ -5101,12 +5453,12 @@ msgstr "直列化関数%sã®æˆ»ã‚Šå€¤ã®åž‹ãŒ%sã§ã¯ã‚りã¾ã›ã‚“" msgid "return type of deserialization function %s is not %s" msgstr "復元関数%sã®æˆ»ã‚Šå€¤ã®åž‹ãŒ%sã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:191 catalog/pg_proc.c:225 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:189 catalog/pg_proc.c:223 #, c-format msgid "cannot determine result data type" msgstr "çµæžœã®ãƒ‡ãƒ¼ã‚¿åž‹ã‚’決定ã§ãã¾ã›ã‚“" -#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:204 catalog/pg_proc.c:233 +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:202 catalog/pg_proc.c:231 #, c-format msgid "unsafe use of pseudo-type \"internal\"" msgstr "\"internal\"疑似型ã®å®‰å…¨ã§ã¯ãªã„使用" @@ -5121,7 +5473,7 @@ msgstr "移動集約ã®å®Ÿè£…ãŒ%s型を返å´ã—ã¾ã—ãŸã€ã—ã‹ã—普通㮠msgid "sort operator can only be specified for single-argument aggregates" msgstr "ソート演算å­ã¯å˜ä¸€å¼•æ•°ã®é›†ç´„ã§ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™" -#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:384 #, c-format msgid "cannot change routine kind" msgstr "ルーãƒãƒ³ã®ç¨®åˆ¥ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" @@ -5146,8 +5498,8 @@ msgstr "\"%s\"ã¯ä»®èª¬é›†åˆé›†ç´„ã§ã™ã€‚" msgid "cannot change number of direct arguments of an aggregate function" msgstr "集約関数ã®ç›´æŽ¥å¼•æ•°ã®æ•°ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: catalog/pg_aggregate.c:858 commands/functioncmds.c:691 commands/typecmds.c:1975 commands/typecmds.c:2021 commands/typecmds.c:2073 commands/typecmds.c:2110 commands/typecmds.c:2144 commands/typecmds.c:2178 commands/typecmds.c:2212 commands/typecmds.c:2241 commands/typecmds.c:2328 commands/typecmds.c:2370 parser/parse_func.c:417 parser/parse_func.c:448 parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 parser/parse_func.c:631 -#: parser/parse_func.c:2171 parser/parse_func.c:2444 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:686 commands/typecmds.c:1985 commands/typecmds.c:2031 commands/typecmds.c:2083 commands/typecmds.c:2120 commands/typecmds.c:2154 commands/typecmds.c:2188 commands/typecmds.c:2222 commands/typecmds.c:2251 commands/typecmds.c:2338 commands/typecmds.c:2380 parser/parse_func.c:417 parser/parse_func.c:448 parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 parser/parse_func.c:631 +#: parser/parse_func.c:2172 parser/parse_func.c:2445 #, c-format msgid "function %s does not exist" msgstr "関数%sã¯å­˜åœ¨ã—ã¾ã›ã‚“" @@ -5222,132 +5574,132 @@ msgstr "ã“ã®æ“作ã¯ãƒ‘ーティション親テーブルã«å¯¾ã—ã¦ã¯ã‚µãƒ msgid "This operation is not supported for partitioned indexes." msgstr "ã“ã®æ“作ã¯ãƒ‘ーティションインデックスã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。" -#: catalog/pg_collation.c:102 catalog/pg_collation.c:160 +#: catalog/pg_collation.c:101 catalog/pg_collation.c:159 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "ç…§åˆé †åº\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: catalog/pg_collation.c:104 +#: catalog/pg_collation.c:103 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" msgstr "エンコーディング\"%2$s\"ã«å¯¾ã™ã‚‹ç…§åˆé †åº\"%1$s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: catalog/pg_collation.c:112 catalog/pg_collation.c:167 +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 #, c-format msgid "collation \"%s\" already exists" msgstr "ç…§åˆé †åº\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: catalog/pg_collation.c:114 +#: catalog/pg_collation.c:113 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "エンコーディング\"%2$s\"ã®ç…§åˆé †åº\"%1$s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: catalog/pg_constraint.c:690 +#: catalog/pg_constraint.c:732 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "ドメイン\"%2$s\"ã®åˆ¶ç´„\"%1$s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: catalog/pg_constraint.c:890 catalog/pg_constraint.c:983 +#: catalog/pg_constraint.c:932 catalog/pg_constraint.c:1025 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"ã®åˆ¶ç´„\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/pg_constraint.c:1083 +#: catalog/pg_constraint.c:1125 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "ドメイン\"%2$s\"ã«å¯¾ã™ã‚‹åˆ¶ç´„\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/pg_conversion.c:67 +#: catalog/pg_conversion.c:64 #, c-format msgid "conversion \"%s\" already exists" msgstr "変æ›\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: catalog/pg_conversion.c:80 +#: catalog/pg_conversion.c:77 #, c-format msgid "default conversion for %s to %s already exists" msgstr "%sã‹ã‚‰%sã¸ã®ãƒ‡ãƒ•ォルトã®å¤‰æ›ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: catalog/pg_depend.c:222 commands/extension.c:3344 +#: catalog/pg_depend.c:224 commands/extension.c:3397 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%sã¯ã™ã§ã«æ©Ÿèƒ½æ‹¡å¼µ\"%s\"ã®ãƒ¡ãƒ³ãƒã§ã™" -#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3384 +#: catalog/pg_depend.c:231 catalog/pg_depend.c:282 commands/extension.c:3437 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s ã¯æ©Ÿèƒ½æ‹¡å¼µ\"%s\"ã®ãƒ¡ãƒ³ãƒã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/pg_depend.c:232 +#: catalog/pg_depend.c:234 #, c-format msgid "An extension is not allowed to replace an object that it does not own." msgstr "機能拡張ã¯è‡ªèº«ãŒæ‰€æœ‰ã—ã¦ã„ãªã„ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’ç½®ãæ›ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。" -#: catalog/pg_depend.c:283 +#: catalog/pg_depend.c:285 #, c-format msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." msgstr "機能拡張ã¯CREATE ... IF NOT EXISTSを自身ãŒã™ã§ã«æ‰€æœ‰ã—ã¦ã„るオブジェクトã¨ç«¶åˆã™ã‚‹ã‚ªãƒ–ジェクトã®ç”Ÿæˆã‚’スキップã™ã‚‹ãŸã‚ã«ã®ã¿ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: catalog/pg_depend.c:646 +#: catalog/pg_depend.c:648 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "システムオブジェクトã§ã‚ã‚‹ãŸã‚ã€%sã®ä¾å­˜é–¢ä¿‚を削除ã§ãã¾ã›ã‚“。" -#: catalog/pg_enum.c:137 catalog/pg_enum.c:259 catalog/pg_enum.c:554 +#: catalog/pg_enum.c:175 catalog/pg_enum.c:314 catalog/pg_enum.c:624 #, c-format msgid "invalid enum label \"%s\"" msgstr "列挙ラベル\"%s\"ã¯ä¸æ­£ã§ã™" -#: catalog/pg_enum.c:138 catalog/pg_enum.c:260 catalog/pg_enum.c:555 +#: catalog/pg_enum.c:176 catalog/pg_enum.c:315 catalog/pg_enum.c:625 #, c-format msgid "Labels must be %d bytes or less." msgstr "ラベルã¯%d文字数以内ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: catalog/pg_enum.c:288 +#: catalog/pg_enum.c:343 #, c-format msgid "enum label \"%s\" already exists, skipping" msgstr "列挙ラベル\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: catalog/pg_enum.c:295 catalog/pg_enum.c:598 +#: catalog/pg_enum.c:350 catalog/pg_enum.c:668 #, c-format msgid "enum label \"%s\" already exists" msgstr "列挙ラベル\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: catalog/pg_enum.c:350 catalog/pg_enum.c:593 +#: catalog/pg_enum.c:405 catalog/pg_enum.c:663 #, c-format msgid "\"%s\" is not an existing enum label" msgstr "\"%s\"ã¯æ—¢å­˜ã®åˆ—挙型ラベルã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/pg_enum.c:408 +#: catalog/pg_enum.c:463 #, c-format msgid "pg_enum OID value not set when in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中㫠pg_enum ã®OIDãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#: catalog/pg_enum.c:418 +#: catalog/pg_enum.c:473 #, c-format msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" msgstr "ALTER TYPE ADD BEFORE/AFTER ã¯ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードã§ã¯äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: catalog/pg_inherits.c:593 +#: catalog/pg_inherits.c:592 #, c-format msgid "cannot detach partition \"%s\"" msgstr "パーティション\"%s\"ã‚’å–り外ã›ã¾ã›ã‚“" -#: catalog/pg_inherits.c:595 +#: catalog/pg_inherits.c:594 #, c-format msgid "The partition is being detached concurrently or has an unfinished detach." msgstr "ã“ã®ãƒ‘ーティションã¯ä»Šç¾åœ¨å–り外ã—中ã§ã‚ã‚‹ã‹å–り外ã—処ç†ãŒæœªå®Œäº†ã®çŠ¶æ…‹ã§ã™ã€‚" -#: catalog/pg_inherits.c:596 commands/tablecmds.c:4583 commands/tablecmds.c:15464 +#: catalog/pg_inherits.c:595 commands/tablecmds.c:4800 commands/tablecmds.c:16186 #, c-format msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." msgstr "ALTER TABLE ... DETACH PARTITION ... FINALIZE を実行ã—ã¦ä¿ç•™ä¸­ã®å–り外ã—処ç†ã‚’完了ã•ã›ã¦ãã ã•ã„。" -#: catalog/pg_inherits.c:600 +#: catalog/pg_inherits.c:599 #, c-format msgid "cannot complete detaching partition \"%s\"" msgstr "パーティション\"%s\"ã®å–り外ã—を完了ã§ãã¾ã›ã‚“" -#: catalog/pg_inherits.c:602 +#: catalog/pg_inherits.c:601 #, c-format msgid "There's no pending concurrent detach." msgstr "ä¿ç•™ä¸­ã®ä¸¦åˆ—çš„å–り外ã—ã¯ã‚りã¾ã›ã‚“。" @@ -5357,113 +5709,128 @@ msgstr "ä¿ç•™ä¸­ã®ä¸¦åˆ—çš„å–り外ã—ã¯ã‚りã¾ã›ã‚“。" msgid "schema \"%s\" already exists" msgstr "スキーマ\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: catalog/pg_operator.c:219 catalog/pg_operator.c:361 +#: catalog/pg_operator.c:213 catalog/pg_operator.c:355 #, c-format msgid "\"%s\" is not a valid operator name" msgstr "\"%s\"ã¯æœ‰åŠ¹ãªæ¼”ç®—å­åã§ã¯ã‚りã¾ã›ã‚“" -#: catalog/pg_operator.c:370 +#: catalog/pg_operator.c:379 +#, c-format +msgid "operator %s already exists" +msgstr "演算å­%sã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" + +#: catalog/pg_operator.c:445 commands/operatorcmds.c:600 +#, c-format +msgid "operator cannot be its own negator" +msgstr "演算å­ã¯è‡ªèº«ã®å¦å®šå­ã«ãªã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: catalog/pg_operator.c:572 #, c-format msgid "only binary operators can have commutators" msgstr "二項演算å­ã®ã¿ãŒäº¤æ›å­ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™" -#: catalog/pg_operator.c:374 commands/operatorcmds.c:509 +#: catalog/pg_operator.c:576 #, c-format msgid "only binary operators can have join selectivity" msgstr "二項演算å­ã®ã¿ãŒçµåˆé¸æŠžæ€§ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™" -#: catalog/pg_operator.c:378 +#: catalog/pg_operator.c:580 #, c-format msgid "only binary operators can merge join" msgstr "二項演算å­ã®ã¿ãŒãƒžãƒ¼ã‚¸çµåˆå¯èƒ½ã§ã™" -#: catalog/pg_operator.c:382 +#: catalog/pg_operator.c:584 #, c-format msgid "only binary operators can hash" msgstr "二項演算å­ã®ã¿ãŒãƒãƒƒã‚·ãƒ¥å¯èƒ½ã§ã™" -#: catalog/pg_operator.c:393 +#: catalog/pg_operator.c:593 #, c-format msgid "only boolean operators can have negators" msgstr "ブール型演算å­ã®ã¿ãŒå¦å®šæ¼”ç®—å­ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™" -#: catalog/pg_operator.c:397 commands/operatorcmds.c:517 +#: catalog/pg_operator.c:597 #, c-format msgid "only boolean operators can have restriction selectivity" msgstr "ブール型演算å­ã®ã¿ãŒåˆ¶é™é¸æŠžçŽ‡ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™" -#: catalog/pg_operator.c:401 commands/operatorcmds.c:521 +#: catalog/pg_operator.c:601 #, c-format msgid "only boolean operators can have join selectivity" msgstr "ブール型演算å­ã®ã¿ãŒçµåˆé¸æŠžçŽ‡ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™" -#: catalog/pg_operator.c:405 +#: catalog/pg_operator.c:605 #, c-format msgid "only boolean operators can merge join" msgstr "ブール型演算å­ã®ã¿ãŒãƒžãƒ¼ã‚¸çµåˆå¯èƒ½ã§ã™" -#: catalog/pg_operator.c:409 +#: catalog/pg_operator.c:609 #, c-format msgid "only boolean operators can hash" msgstr "ブール型演算å­ã®ã¿ãŒãƒãƒƒã‚·ãƒ¥å¯èƒ½ã§ã™" -#: catalog/pg_operator.c:421 +#: catalog/pg_operator.c:739 #, c-format -msgid "operator %s already exists" -msgstr "演算å­%sã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" +msgid "commutator operator %s is already the commutator of operator %s" +msgstr "äº¤æ›æ¼”ç®—å­ %s ã¯ã™ã§ã«æ¼”ç®—å­ %s ã®äº¤æ›å­ã§ã™" -#: catalog/pg_operator.c:621 +#: catalog/pg_operator.c:744 #, c-format -msgid "operator cannot be its own negator or sort operator" -msgstr "演算å­ã¯è‡ªèº«ã®å¦å®šå­ã‚„ソート演算å­ã«ãªã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" +msgid "commutator operator %s is already the commutator of operator %u" +msgstr "äº¤æ›æ¼”ç®—å­ %s ã¯ã™ã§ã«æ¼”ç®—å­ %u ã®äº¤æ›å­ã§ã™" -#: catalog/pg_parameter_acl.c:53 +#: catalog/pg_operator.c:807 #, c-format -msgid "parameter ACL \"%s\" does not exist" -msgstr "パラメータACL \"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" +msgid "negator operator %s is already the negator of operator %s" +msgstr "å¦å®šæ¼”ç®—å­ %s ã¯ã™ã§ã«æ¼”ç®—å­ %s ã®å¦å®šå­ã§ã™" + +#: catalog/pg_operator.c:812 +#, c-format +msgid "negator operator %s is already the negator of operator %u" +msgstr "å¦å®šæ¼”ç®—å­ %s ã¯ã™ã§ã«æ¼”ç®—å­ %u ã®å¦å®šå­ã§ã™" -#: catalog/pg_parameter_acl.c:88 +#: catalog/pg_parameter_acl.c:50 #, c-format -msgid "invalid parameter name \"%s\"" -msgstr "䏿­£ãªãƒ‘ラメータå\"%s\"" +msgid "parameter ACL \"%s\" does not exist" +msgstr "パラメータACL \"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: catalog/pg_proc.c:132 parser/parse_func.c:2233 +#: catalog/pg_proc.c:130 parser/parse_func.c:2234 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" msgstr[0] "関数ã¯%dã‚’è¶…ãˆã‚‹å¼•æ•°ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: catalog/pg_proc.c:376 +#: catalog/pg_proc.c:374 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "åŒã˜å¼•数型をæŒã¤é–¢æ•°\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: catalog/pg_proc.c:388 +#: catalog/pg_proc.c:386 #, c-format msgid "\"%s\" is an aggregate function." msgstr "\"%s\"ã¯é›†ç´„関数ã§ã™ã€‚" -#: catalog/pg_proc.c:390 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is a function." msgstr "\"%s\"ã¯é–¢æ•°ã§ã™ã€‚" -#: catalog/pg_proc.c:392 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a procedure." msgstr "\"%s\"ã¯ãƒ—ロシージャã§ã™ã€‚" -#: catalog/pg_proc.c:394 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a window function." msgstr "関数\"%s\"ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã§ã™ã€‚" -#: catalog/pg_proc.c:414 +#: catalog/pg_proc.c:412 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "プロシージャã®å‡ºåŠ›ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã®æœ‰ç„¡ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 +#: catalog/pg_proc.c:413 catalog/pg_proc.c:443 #, c-format msgid "cannot change return type of existing function" msgstr "既存ã®é–¢æ•°ã®æˆ»ã‚Šå€¤åž‹ã‚’変更ã§ãã¾ã›ã‚“" @@ -5472,112 +5839,112 @@ msgstr "既存ã®é–¢æ•°ã®æˆ»ã‚Šå€¤åž‹ã‚’変更ã§ãã¾ã›ã‚“" #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: catalog/pg_proc.c:421 catalog/pg_proc.c:448 catalog/pg_proc.c:493 catalog/pg_proc.c:519 catalog/pg_proc.c:543 +#: catalog/pg_proc.c:419 catalog/pg_proc.c:446 catalog/pg_proc.c:491 catalog/pg_proc.c:517 catalog/pg_proc.c:541 #, c-format msgid "Use %s %s first." msgstr "ã¾ãš %s %s を使用ã—ã¦ãã ã•ã„。" -#: catalog/pg_proc.c:446 +#: catalog/pg_proc.c:444 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "OUTパラメータã§å®šç¾©ã•れãŸè¡Œåž‹ãŒç•°ãªã‚Šã¾ã™ã€‚" -#: catalog/pg_proc.c:490 +#: catalog/pg_proc.c:488 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "入力パラメーター\"%s\"ã®å称を変更ã§ãã¾ã›ã‚“" -#: catalog/pg_proc.c:517 +#: catalog/pg_proc.c:515 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "既存ã®é–¢æ•°ã‹ã‚‰ãƒ‘ラメータã®ãƒ‡ãƒ•ォルト値を削除ã§ãã¾ã›ã‚“" -#: catalog/pg_proc.c:541 +#: catalog/pg_proc.c:539 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "既存ã®ãƒ‘ラメータã®ãƒ‡ãƒ•ォルト値ã®ãƒ‡ãƒ¼ã‚¿åž‹ã‚’変更ã§ãã¾ã›ã‚“" -#: catalog/pg_proc.c:752 +#: catalog/pg_proc.c:750 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "\"%s\"ã¨ã„ã†åå‰ã®çµ„ã¿è¾¼ã¿é–¢æ•°ã¯ã‚りã¾ã›ã‚“" -#: catalog/pg_proc.c:845 +#: catalog/pg_proc.c:843 #, c-format msgid "SQL functions cannot return type %s" msgstr "SQL関数ã¯åž‹%sã‚’è¿”ã™ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: catalog/pg_proc.c:860 +#: catalog/pg_proc.c:858 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "SQL関数ã¯åž‹%sã®å¼•æ•°ã¨å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: catalog/pg_proc.c:987 executor/functions.c:1466 +#: catalog/pg_proc.c:986 executor/functions.c:1468 #, c-format msgid "SQL function \"%s\"" msgstr "SQL関数\"%s\"" -#: catalog/pg_publication.c:71 catalog/pg_publication.c:79 catalog/pg_publication.c:87 catalog/pg_publication.c:93 +#: catalog/pg_publication.c:66 catalog/pg_publication.c:74 catalog/pg_publication.c:82 catalog/pg_publication.c:88 #, c-format msgid "cannot add relation \"%s\" to publication" msgstr "パブリケーションã«ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"を追加ã§ãã¾ã›ã‚“" -#: catalog/pg_publication.c:81 +#: catalog/pg_publication.c:76 #, c-format msgid "This operation is not supported for system tables." msgstr "ã“ã®æ“作ã¯ã‚·ã‚¹ãƒ†ãƒ ãƒ†ãƒ¼ãƒ–ルã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。" -#: catalog/pg_publication.c:89 +#: catalog/pg_publication.c:84 #, c-format msgid "This operation is not supported for temporary tables." msgstr "ã“ã®æ“作ã¯ä¸€æ™‚テーブルã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。" -#: catalog/pg_publication.c:95 +#: catalog/pg_publication.c:90 #, c-format msgid "This operation is not supported for unlogged tables." msgstr "ã“ã®æ“作ã¯UNLOGGEDテーブルã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。" -#: catalog/pg_publication.c:109 catalog/pg_publication.c:117 +#: catalog/pg_publication.c:104 catalog/pg_publication.c:112 #, c-format msgid "cannot add schema \"%s\" to publication" msgstr "パブリケーションã«ã‚¹ã‚­ãƒ¼ãƒž\"%s\"を追加ã§ãã¾ã›ã‚“" -#: catalog/pg_publication.c:111 +#: catalog/pg_publication.c:106 #, c-format msgid "This operation is not supported for system schemas." msgstr "ã“ã®æ“作ã¯ã‚·ã‚¹ãƒ†ãƒ ã‚¹ã‚­ãƒ¼ãƒžã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。" -#: catalog/pg_publication.c:119 +#: catalog/pg_publication.c:114 #, c-format msgid "Temporary schemas cannot be replicated." -msgstr "一時スキーマã¯ç™ºè¡Œã§ãã¾ã›ã‚“" +msgstr "一時スキーマã¯è¤‡è£½ã§ãã¾ã›ã‚“" -#: catalog/pg_publication.c:397 +#: catalog/pg_publication.c:392 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "リレーション\"%s\"ã¯ã™ã§ã«ãƒ‘ブリケーション\"%s\"ã®ãƒ¡ãƒ³ãƒã§ã™" -#: catalog/pg_publication.c:539 +#: catalog/pg_publication.c:534 #, c-format msgid "cannot use system column \"%s\" in publication column list" -msgstr "システム列\"%s\"ã¯ç™ºè¡Œåˆ—リスト内ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" +msgstr "システム列\"%s\"ã¯ãƒ‘ブリケーション列リスト内ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: catalog/pg_publication.c:545 +#: catalog/pg_publication.c:540 #, c-format msgid "cannot use generated column \"%s\" in publication column list" -msgstr "生æˆåˆ—\"%s\"ã¯ç™ºè¡Œåˆ—リスト内ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" +msgstr "生æˆåˆ—\"%s\"ã¯ãƒ‘ブリケーションã®åˆ—リストã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: catalog/pg_publication.c:551 +#: catalog/pg_publication.c:546 #, c-format msgid "duplicate column \"%s\" in publication column list" -msgstr "発行列リスト内ã«é‡è¤‡ã—ãŸåˆ— \"%s\"" +msgstr "パブリケーション列リスト内ã«é‡è¤‡ã—ãŸåˆ— \"%s\"" -#: catalog/pg_publication.c:641 +#: catalog/pg_publication.c:636 #, c-format msgid "schema \"%s\" is already member of publication \"%s\"" msgstr "スキーマ\"%s\"ã¯ã™ã§ã«ãƒ‘ブリケーション\"%s\"ã®ãƒ¡ãƒ³ãƒã§ã™" -#: catalog/pg_shdepend.c:830 +#: catalog/pg_shdepend.c:875 #, c-format msgid "" "\n" @@ -5589,64 +5956,69 @@ msgstr[0] "" "\n" "ãŠã‚ˆã³ã€ä»–ã®%dã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å†…ã®ã‚ªãƒ–ジェクト(一覧ã«ã¤ã„ã¦ã¯ã‚µãƒ¼ãƒãƒ¼ãƒ­ã‚°ã‚’å‚ç…§ã—ã¦ãã ã•ã„)" -#: catalog/pg_shdepend.c:1177 +#: catalog/pg_shdepend.c:1222 #, c-format msgid "role %u was concurrently dropped" msgstr "ロール%uã®å‰Šé™¤ãŒåŒæ™‚ã«è¡Œã‚れã¾ã—ãŸ" -#: catalog/pg_shdepend.c:1189 +#: catalog/pg_shdepend.c:1234 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "テーブル空間%uã®å‰Šé™¤ãŒåŒæ™‚ã«è¡Œã‚れã¾ã—ãŸ" -#: catalog/pg_shdepend.c:1203 +#: catalog/pg_shdepend.c:1248 #, c-format msgid "database %u was concurrently dropped" msgstr "データベース%uã®å‰Šé™¤ãŒåŒæ™‚ã«è¡Œã‚れã¾ã—ãŸ" -#: catalog/pg_shdepend.c:1254 +#: catalog/pg_shdepend.c:1299 #, c-format msgid "owner of %s" msgstr "%sã®æ‰€æœ‰è€…" -#: catalog/pg_shdepend.c:1256 +#: catalog/pg_shdepend.c:1301 #, c-format msgid "privileges for %s" msgstr "%sã®æ¨©é™" -#: catalog/pg_shdepend.c:1258 +#: catalog/pg_shdepend.c:1303 +#, c-format +msgid "initial privileges for %s" +msgstr "%sã®åˆæœŸæ¨©é™" + +#: catalog/pg_shdepend.c:1305 #, c-format msgid "target of %s" msgstr "%sã®å¯¾è±¡" -#: catalog/pg_shdepend.c:1260 +#: catalog/pg_shdepend.c:1307 #, c-format msgid "tablespace for %s" msgstr "%sã®ãƒ†ãƒ¼ãƒ–ル空間" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1268 +#: catalog/pg_shdepend.c:1315 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" msgstr[0] "%2$s内ã®%1$d個ã®ã‚ªãƒ–ジェクト" -#: catalog/pg_shdepend.c:1332 +#: catalog/pg_shdepend.c:1379 #, c-format msgid "cannot drop objects owned by %s because they are required by the database system" msgstr "データベースシステムãŒå¿…è¦ã¨ã—ã¦ã„ã‚‹ãŸã‚%sãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトを削除ã§ãã¾ã›ã‚“" -#: catalog/pg_shdepend.c:1498 +#: catalog/pg_shdepend.c:1560 #, c-format msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "データベースシステムãŒå¿…è¦ã¨ã—ã¦ã„ã‚‹ãŸã‚%sãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã‚’å†å‰²ã‚Šå½“ã¦ã§ãã¾ã›ã‚“" -#: catalog/pg_subscription.c:424 +#: catalog/pg_subscription.c:438 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "サブスクリプション\"%s\"ã«å¯¾ã™ã‚‹ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒžãƒƒãƒ”ングを削除ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: catalog/pg_subscription.c:426 +#: catalog/pg_subscription.c:440 #, c-format msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." msgstr "リレーション\\\"%s\\\"ã®ãƒ†ãƒ¼ãƒ–ãƒ«åŒæœŸãŒé€²è¡Œä¸­ã§ã€çŠ¶æ…‹ã¯\\\"%c\\\"ã§ã™ã€‚" @@ -5654,222 +6026,222 @@ msgstr "リレーション\\\"%s\\\"ã®ãƒ†ãƒ¼ãƒ–ãƒ«åŒæœŸãŒé€²è¡Œä¸­ã§ã€çж #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command #. -#: catalog/pg_subscription.c:433 +#: catalog/pg_subscription.c:447 #, c-format msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." msgstr "ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—ã‚·ãƒ§ãƒ³ãŒæœ‰åйã«ã•れã¦ã„ãªã„å ´åˆã¯%sを実行ã—ã¦æœ‰åŠ¹åŒ–ã™ã‚‹ã‹ã€%sを実行ã—ã¦ã“ã®ã‚µãƒ–スクリプションを削除ã—ã¦ãã ã•ã„。" -#: catalog/pg_type.c:134 catalog/pg_type.c:474 +#: catalog/pg_type.c:133 catalog/pg_type.c:474 #, c-format msgid "pg_type OID value not set when in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã«pg_typeã®OIDãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#: catalog/pg_type.c:254 +#: catalog/pg_type.c:253 #, c-format msgid "invalid type internal size %d" msgstr "åž‹ã®å†…部サイズ%dã¯ä¸æ­£ã§ã™" -#: catalog/pg_type.c:270 catalog/pg_type.c:278 catalog/pg_type.c:286 catalog/pg_type.c:295 +#: catalog/pg_type.c:269 catalog/pg_type.c:277 catalog/pg_type.c:285 catalog/pg_type.c:294 #, c-format msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" msgstr "値渡ã—åž‹ã§ã‚µã‚¤ã‚ºãŒ%2$dã®å ´åˆã€ã‚¢ãƒ©ã‚¤ãƒ³ãƒ¡ãƒ³ãƒˆ\"%1$c\"ã¯ä¸æ­£ã§ã™" -#: catalog/pg_type.c:302 +#: catalog/pg_type.c:301 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "値渡ã—åž‹ã®å ´åˆã€å†…部サイズ%dã¯ä¸æ­£ã§ã™" -#: catalog/pg_type.c:312 catalog/pg_type.c:318 +#: catalog/pg_type.c:311 catalog/pg_type.c:317 #, c-format msgid "alignment \"%c\" is invalid for variable-length type" msgstr "å¯å¤‰é•·åž‹ã®å ´åˆã€ã‚¢ãƒ©ã‚¤ãƒ³ãƒ¡ãƒ³ãƒˆ\"%c\"ã¯ä¸æ­£ã§ã™" -#: catalog/pg_type.c:326 commands/typecmds.c:4140 +#: catalog/pg_type.c:325 commands/typecmds.c:4363 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "固定長型ã®å ´åˆã¯PLAINæ ¼ç´æ–¹å¼ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: catalog/pg_type.c:955 +#: catalog/pg_type.c:978 #, c-format msgid "Failed while creating a multirange type for type \"%s\"." msgstr "\"%s\"ã®è¤‡ç¯„囲型ã®ä½œæˆä¸­ã«å¤±æ•—ã—ã¾ã—ãŸã€‚" -#: catalog/pg_type.c:956 +#: catalog/pg_type.c:979 #, c-format msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." msgstr "\"multirange_type_name\"属性ã§è¤‡ç¯„囲型ã®åž‹åã‚’æ‰‹å‹•ã§æŒ‡å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: catalog/storage.c:505 storage/buffer/bufmgr.c:1145 +#: catalog/storage.c:533 storage/buffer/bufmgr.c:1540 #, c-format msgid "invalid page in block %u of relation %s" msgstr "リレーション%2$sã®ãƒ–ロック%1$uã«ä¸æ­£ãªãƒšãƒ¼ã‚¸" -#: commands/aggregatecmds.c:171 +#: commands/aggregatecmds.c:167 #, c-format msgid "only ordered-set aggregates can be hypothetical" msgstr "é †åºé›†åˆé›†ç´„ã®ã¿ãŒä»®èª¬çš„集約ã«ãªã‚Šå¾—ã¾ã™" -#: commands/aggregatecmds.c:196 +#: commands/aggregatecmds.c:192 #, c-format msgid "aggregate attribute \"%s\" not recognized" msgstr "集約ã®å±žæ€§\"%sã¯èªè­˜ã§ãã¾ã›ã‚“" -#: commands/aggregatecmds.c:206 +#: commands/aggregatecmds.c:202 #, c-format msgid "aggregate stype must be specified" msgstr "集約ã®stypeを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/aggregatecmds.c:210 +#: commands/aggregatecmds.c:206 #, c-format msgid "aggregate sfunc must be specified" msgstr "集約用ã®çŠ¶æ…‹é·ç§»é–¢æ•°ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/aggregatecmds.c:222 +#: commands/aggregatecmds.c:218 #, c-format msgid "aggregate msfunc must be specified when mstype is specified" msgstr "mstype を指定ã—ãŸå ´åˆã¯é›†ç´„ã® msfunc も設定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/aggregatecmds.c:226 +#: commands/aggregatecmds.c:222 #, c-format msgid "aggregate minvfunc must be specified when mstype is specified" msgstr "mstype を指定ã—ãŸå ´åˆã¯é›†ç´„ã® minvfunc も設定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/aggregatecmds.c:233 +#: commands/aggregatecmds.c:229 #, c-format msgid "aggregate msfunc must not be specified without mstype" msgstr "集約㮠msfunc 㯠mstype を指定ã—ã¦ãªã„å ´åˆã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/aggregatecmds.c:237 +#: commands/aggregatecmds.c:233 #, c-format msgid "aggregate minvfunc must not be specified without mstype" msgstr "集約㮠minvfunc 㯠mstype を指定ã—ã¦ã„ãªã„å ´åˆã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/aggregatecmds.c:241 +#: commands/aggregatecmds.c:237 #, c-format msgid "aggregate mfinalfunc must not be specified without mstype" msgstr "集約㮠mfinalfunc 㯠mstype を指定ã—ã¦ã„ãªã„å ´åˆã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/aggregatecmds.c:245 +#: commands/aggregatecmds.c:241 #, c-format msgid "aggregate msspace must not be specified without mstype" msgstr "集約㮠msspace 㯠mstype を指定ã—ã¦ã„ãªã„å ´åˆã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/aggregatecmds.c:249 +#: commands/aggregatecmds.c:245 #, c-format msgid "aggregate minitcond must not be specified without mstype" msgstr "集約㮠minitcond 㯠mstype を指定ã—ã¦ã„ãªã„å ´åˆã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/aggregatecmds.c:278 +#: commands/aggregatecmds.c:274 #, c-format msgid "aggregate input type must be specified" msgstr "集約ã®å…¥åŠ›åž‹ã‚’æŒ‡å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/aggregatecmds.c:308 +#: commands/aggregatecmds.c:304 #, c-format msgid "basetype is redundant with aggregate input type specification" msgstr "集約ã®å…¥åŠ›åž‹æŒ‡å®šã§åŸºæœ¬åž‹ãŒå†—é•·ã§ã™" -#: commands/aggregatecmds.c:351 commands/aggregatecmds.c:392 +#: commands/aggregatecmds.c:347 commands/aggregatecmds.c:388 #, c-format msgid "aggregate transition data type cannot be %s" msgstr "集約ã®é·ç§»ãƒ‡ãƒ¼ã‚¿ã®åž‹ã‚’%sã«ã§ãã¾ã›ã‚“" -#: commands/aggregatecmds.c:363 +#: commands/aggregatecmds.c:359 #, c-format msgid "serialization functions may be specified only when the aggregate transition data type is %s" msgstr "直列化関数ã¯é›†ç´„é·ç§»ãƒ‡ãƒ¼ã‚¿ã®åž‹ãŒ%sã®å ´åˆã«ã ã‘指定å¯èƒ½ã§ã™" -#: commands/aggregatecmds.c:373 +#: commands/aggregatecmds.c:369 #, c-format msgid "must specify both or neither of serialization and deserialization functions" msgstr "直列化関数ã¨å¾©å…ƒé–¢æ•°ã¯ä¸¡æ–¹æŒ‡å®šã™ã‚‹ã‹ã€ä¸¡æ–¹æŒ‡å®šã—ãªã„ã‹ã®ã©ã¡ã‚‰ã‹ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/aggregatecmds.c:438 commands/functioncmds.c:639 +#: commands/aggregatecmds.c:434 commands/functioncmds.c:634 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "パラメータ\"parallel\"ã¯SAVEã€RESTRICTEDã¾ãŸã¯UNSAFEã®ã„ãšã‚Œã‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/aggregatecmds.c:494 +#: commands/aggregatecmds.c:490 #, c-format msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" msgstr "パラメータ\"%s\"㯠READ_ONLYã€SHAREABLE ã¾ãŸã¯ READ_WRITE ã§ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/alter.c:86 commands/event_trigger.c:174 +#: commands/alter.c:83 commands/event_trigger.c:191 #, c-format msgid "event trigger \"%s\" already exists" msgstr "イベントトリガ\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/alter.c:89 commands/foreigncmds.c:593 +#: commands/alter.c:86 commands/foreigncmds.c:593 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "外部データラッパー\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/alter.c:92 commands/foreigncmds.c:884 +#: commands/alter.c:89 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "サーãƒãƒ¼\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/alter.c:95 commands/proclang.c:133 +#: commands/alter.c:92 commands/proclang.c:131 #, c-format msgid "language \"%s\" already exists" msgstr "言語\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/alter.c:98 commands/publicationcmds.c:771 +#: commands/alter.c:95 commands/publicationcmds.c:764 #, c-format msgid "publication \"%s\" already exists" msgstr "パブリケーション\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/alter.c:101 commands/subscriptioncmds.c:657 +#: commands/alter.c:98 commands/subscriptioncmds.c:669 #, c-format msgid "subscription \"%s\" already exists" msgstr "サブスクリプション\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/alter.c:124 +#: commands/alter.c:121 #, c-format msgid "conversion \"%s\" already exists in schema \"%s\"" msgstr "変æ›\"%s\"ã¯ã‚¹ã‚­ãƒ¼ãƒž\"%s\"内ã«ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/alter.c:128 +#: commands/alter.c:125 #, c-format msgid "statistics object \"%s\" already exists in schema \"%s\"" msgstr "統計情報オブジェクト\"%s\"ã¯ã‚¹ã‚­ãƒ¼ãƒž\"%s\"内ã«ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/alter.c:132 +#: commands/alter.c:129 #, c-format msgid "text search parser \"%s\" already exists in schema \"%s\"" msgstr "テキスト検索パーサ\"%s\"ã¯ã™ã§ã«ã‚¹ã‚­ãƒ¼ãƒž\"%s\"存在ã—ã¾ã™" -#: commands/alter.c:136 +#: commands/alter.c:133 #, c-format msgid "text search dictionary \"%s\" already exists in schema \"%s\"" msgstr "テキスト検索辞書\"%s\"ã¯ã™ã§ã«ã‚¹ã‚­ãƒ¼ãƒž\"%s\"存在ã—ã¾ã™" -#: commands/alter.c:140 +#: commands/alter.c:137 #, c-format msgid "text search template \"%s\" already exists in schema \"%s\"" msgstr "テキスト検索テンプレート\"%s\"ã¯ã™ã§ã«ã‚¹ã‚­ãƒ¼ãƒž\"%s\"存在ã—ã¾ã™" -#: commands/alter.c:144 +#: commands/alter.c:141 #, c-format msgid "text search configuration \"%s\" already exists in schema \"%s\"" msgstr "テキスト検索設定\"%s\"ã¯ã™ã§ã«ã‚¹ã‚­ãƒ¼ãƒž\"%s\"存在ã—ã¾ã™" -#: commands/alter.c:217 +#: commands/alter.c:214 #, c-format msgid "must be superuser to rename %s" msgstr "%sã®åå‰ã‚’変更ã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/alter.c:259 commands/subscriptioncmds.c:636 commands/subscriptioncmds.c:1116 commands/subscriptioncmds.c:1198 commands/subscriptioncmds.c:1830 +#: commands/alter.c:256 commands/subscriptioncmds.c:648 commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1212 commands/subscriptioncmds.c:1918 #, c-format msgid "password_required=false is superuser-only" msgstr "password_required=falseã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã®ã¿å¯èƒ½ã§ã™" -#: commands/alter.c:260 commands/subscriptioncmds.c:637 commands/subscriptioncmds.c:1117 commands/subscriptioncmds.c:1199 commands/subscriptioncmds.c:1831 +#: commands/alter.c:257 commands/subscriptioncmds.c:649 commands/subscriptioncmds.c:1130 commands/subscriptioncmds.c:1213 commands/subscriptioncmds.c:1919 #, c-format msgid "Subscriptions with the password_required option set to false may only be created or modified by the superuser." msgstr "password_requiredオプションãŒfalseã«è¨­å®šã•れãŸã‚µãƒ–スクリプションã¯ã‚¹ãƒ¼ãƒ‘ーユーザã®ã¿ä½œæˆã¨å¤‰æ›´ãŒå¯èƒ½ã§ã™ã€‚" -#: commands/alter.c:775 +#: commands/alter.c:735 #, c-format msgid "must be superuser to set schema of %s" msgstr "%sã®ã‚¹ã‚­ãƒ¼ãƒžã‚’設定ã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" @@ -5889,7 +6261,7 @@ msgstr "アクセスメソッドを作æˆã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザー㧠msgid "access method \"%s\" already exists" msgstr "アクセスメソッド\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/amcmds.c:154 commands/indexcmds.c:217 commands/indexcmds.c:840 commands/opclasscmds.c:375 commands/opclasscmds.c:833 +#: commands/amcmds.c:154 commands/indexcmds.c:224 commands/indexcmds.c:850 commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" msgstr "アクセスメソッド\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" @@ -5899,172 +6271,172 @@ msgstr "アクセスメソッド\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" msgid "handler function is not specified" msgstr "ãƒãƒ³ãƒ‰ãƒ©é–¢æ•°ã®æŒ‡å®šãŒã‚りã¾ã›ã‚“" -#: commands/amcmds.c:264 commands/event_trigger.c:183 commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:709 parser/parse_clause.c:941 +#: commands/amcmds.c:264 commands/event_trigger.c:200 commands/foreigncmds.c:489 commands/proclang.c:78 commands/trigger.c:702 parser/parse_clause.c:943 #, c-format msgid "function %s must return type %s" msgstr "関数%sã¯åž‹%sã‚’è¿”ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/analyze.c:227 +#: commands/analyze.c:217 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "\"%s\"をスキップã—ã¦ã„ã¾ã™ --- ã“ã®å¤–部テーブルã«å¯¾ã—ã¦ANALYZEを実行ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/analyze.c:244 +#: commands/analyze.c:234 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "\"%s\"をスキップã—ã¦ã„ã¾ã™ --- テーブルã§ãªã„ã‚‚ã®ã‚„特別ãªã‚·ã‚¹ãƒ†ãƒ ãƒ†ãƒ¼ãƒ–ルã«å¯¾ã—ã¦ANALYZEを実行ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/analyze.c:324 +#: commands/analyze.c:314 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "\"%s.%s\"継承ツリーを解æžã—ã¦ã„ã¾ã™" -#: commands/analyze.c:329 +#: commands/analyze.c:319 #, c-format msgid "analyzing \"%s.%s\"" msgstr "\"%s.%s\"ã‚’è§£æžã—ã¦ã„ã¾ã™" -#: commands/analyze.c:394 +#: commands/analyze.c:385 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ãŒ2回以上ç¾ã‚Œã¾ã™" -#: commands/analyze.c:786 +#: commands/analyze.c:785 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" msgstr "テーブル\"%s.%s.%s\"ã«å¯¾ã™ã‚‹è‡ªå‹•ANALYZE\n" -#: commands/analyze.c:1333 +#: commands/analyze.c:1300 #, c-format msgid "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead rows; %d rows in sample, %.0f estimated total rows" msgstr "\"%1$s\": %3$uページã®å†…%2$dをスキャン。%4$.0fã®æœ‰åйãªè¡Œã¨%5$.0fã®ä¸è¦ãªè¡ŒãŒå­˜åœ¨ã€‚%6$d行をサンプリング。推定ç·è¡Œæ•°ã¯%7$.0f" -#: commands/analyze.c:1417 +#: commands/analyze.c:1384 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" msgstr "継承ツリー\"%s.%s\"ã®ANALYZEをスキップã—ã¾ã™ --- ã“ã®ãƒ„リーã«ã¯å­ãƒ†ãƒ¼ãƒ–ルãŒã‚りã¾ã›ã‚“" -#: commands/analyze.c:1515 +#: commands/analyze.c:1482 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no analyzable child tables" msgstr "継承ツリー\"%s.%s\"ã®ANALYZEをスキップã—ã¾ã™ --- ã“ã®ãƒ„リーã«ã¯ã‚¢ãƒŠãƒ©ã‚¤ã‚ºå¯èƒ½ãªå­ãƒ†ãƒ¼ãƒ–ルãŒã‚りã¾ã›ã‚“" -#: commands/async.c:646 +#: commands/async.c:612 #, c-format msgid "channel name cannot be empty" msgstr "ãƒãƒ£ãƒãƒ«åãŒç©ºã§ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/async.c:652 +#: commands/async.c:618 #, c-format msgid "channel name too long" msgstr "ãƒãƒ£ãƒãƒ«åãŒé•·ã™ãŽã¾ã™" -#: commands/async.c:657 +#: commands/async.c:623 #, c-format msgid "payload string too long" msgstr "ペイロード文字列ãŒé•·ã™ãŽã¾ã™" -#: commands/async.c:876 +#: commands/async.c:842 #, c-format msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" msgstr "LISTEN / UNLISTEN / NOTIFY を実行ã—ã¦ã„るトランザクション㯠PREPARE ã§ãã¾ã›ã‚“" -#: commands/async.c:980 +#: commands/async.c:946 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "NOTIFY キューã§ç™ºç”Ÿã—ãŸé€šçŸ¥ã‚¤ãƒ™ãƒ³ãƒˆãŒå¤šã™ãŽã¾ã™" -#: commands/async.c:1602 +#: commands/async.c:1553 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "NOTYFY キュー㌠%.0f%% ã¾ã§ä¸€æ¯ã«ãªã£ã¦ã„ã¾ã™" -#: commands/async.c:1604 +#: commands/async.c:1555 #, c-format msgid "The server process with PID %d is among those with the oldest transactions." msgstr "PID %d ã®ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスã¯ã€ã“ã®ä¸­ã§æœ€ã‚‚å¤ã„トランザクションを実行中ã§ã™ã€‚" -#: commands/async.c:1607 +#: commands/async.c:1558 #, c-format msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "ã“ã®ãƒ—ロセスãŒç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’終了ã™ã‚‹ã¾ã§ NOTYFY キューを空ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/cluster.c:131 +#: commands/cluster.c:128 #, c-format msgid "unrecognized CLUSTER option \"%s\"" msgstr "èªè­˜ã§ããªã„CLUSTERオプション \"%s\"" -#: commands/cluster.c:162 commands/cluster.c:435 +#: commands/cluster.c:159 commands/cluster.c:433 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚テーブルをクラスタ化ã§ãã¾ã›ã‚“" -#: commands/cluster.c:180 +#: commands/cluster.c:177 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "テーブル\"%s\"ã«ã¯äº‹å‰ã«ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã•れãŸã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¯ã‚りã¾ã›ã‚“" -#: commands/cluster.c:194 commands/tablecmds.c:14200 commands/tablecmds.c:16043 +#: commands/cluster.c:191 commands/tablecmds.c:14830 commands/tablecmds.c:16762 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"ã«ã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/cluster.c:424 +#: commands/cluster.c:422 #, c-format msgid "cannot cluster a shared catalog" msgstr "共有カタログをクラスタ化ã§ãã¾ã›ã‚“" -#: commands/cluster.c:439 +#: commands/cluster.c:437 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚テーブルã«å¯¾ã—ã¦ã¯VACUUMを実行ã§ãã¾ã›ã‚“" -#: commands/cluster.c:515 commands/tablecmds.c:16053 +#: commands/cluster.c:513 commands/tablecmds.c:16772 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/cluster.c:523 +#: commands/cluster.c:521 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "インデックス\"%s\"ã§ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã§ãã¾ã›ã‚“。アクセスメソッドãŒã‚¯ãƒ©ã‚¹ã‚¿åŒ–をサãƒãƒ¼ãƒˆã—ãªã„ãŸã‚ã§ã™" -#: commands/cluster.c:535 +#: commands/cluster.c:533 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "部分インデックス\"%s\"をクラスタ化ã§ãã¾ã›ã‚“" -#: commands/cluster.c:549 +#: commands/cluster.c:547 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "無効ãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\"%s\"ã§ã¯ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã§ãã¾ã›ã‚“" -#: commands/cluster.c:573 +#: commands/cluster.c:571 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "パーティションテーブル内ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¯ CLUSTER 済ã¿ã¨ãƒžãƒ¼ã‚¯ã§ãã¾ã›ã‚“`" -#: commands/cluster.c:952 +#: commands/cluster.c:956 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "\"%3$s\"ã«å¯¾ã™ã‚‹ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚¹ã‚­ãƒ£ãƒ³ã‚’使ã£ã¦\"%1$s.%2$s\"をクラスタ化ã—ã¦ã„ã¾ã™" -#: commands/cluster.c:958 +#: commands/cluster.c:962 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "シーケンシャルスキャンã¨ã‚½ãƒ¼ãƒˆã‚’使ã£ã¦\"%s.%s\"をクラスタ化ã—ã¦ã„ã¾ã™" -#: commands/cluster.c:963 +#: commands/cluster.c:967 #, c-format msgid "vacuuming \"%s.%s\"" msgstr "\"%s.%s\"ã«å¯¾ã—ã¦VACUUMを実行ã—ã¦ã„ã¾ã™" -#: commands/cluster.c:990 +#: commands/cluster.c:994 #, c-format msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" msgstr "\"%1$s.%2$s\": %5$u ページ中ã«è¦‹ã¤ã‹ã£ãŸè¡Œãƒãƒ¼ã‚¸ãƒ§ãƒ³: 移動å¯èƒ½ %3$.0f 行ã€å‰Šé™¤ä¸å¯ %4$.0f 行" -#: commands/cluster.c:995 +#: commands/cluster.c:999 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -6073,34 +6445,35 @@ msgstr "" "%.0f 個ã®ç„¡åйãªè¡ŒãŒä»Šã¯ã¾ã å‰Šé™¤ã§ãã¾ã›ã‚“。\n" "%s." -#: commands/cluster.c:1728 +#: commands/cluster.c:1744 #, c-format msgid "permission denied to cluster \"%s\", skipping it" -msgstr "\"%s\"をクラスタ化ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" +msgstr "\"%s\"ã®ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã‚’è¡Œã†æ¨©é™ãŒã‚りã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/collationcmds.c:112 +#: commands/collationcmds.c:110 #, c-format msgid "collation attribute \"%s\" not recognized" msgstr "ç…§åˆé †åºã®å±žæ€§\"%s\"ãŒèªè­˜ã§ãã¾ã›ã‚“" -#: commands/collationcmds.c:125 commands/collationcmds.c:131 commands/define.c:389 commands/tablecmds.c:7876 replication/pgoutput/pgoutput.c:310 replication/pgoutput/pgoutput.c:333 replication/pgoutput/pgoutput.c:347 replication/pgoutput/pgoutput.c:357 replication/pgoutput/pgoutput.c:367 replication/pgoutput/pgoutput.c:377 replication/pgoutput/pgoutput.c:387 replication/walsender.c:996 replication/walsender.c:1018 replication/walsender.c:1028 +#: commands/collationcmds.c:123 commands/collationcmds.c:129 commands/define.c:388 commands/tablecmds.c:8162 replication/pgoutput/pgoutput.c:314 replication/pgoutput/pgoutput.c:337 replication/pgoutput/pgoutput.c:351 replication/pgoutput/pgoutput.c:361 replication/pgoutput/pgoutput.c:371 replication/pgoutput/pgoutput.c:381 replication/pgoutput/pgoutput.c:393 replication/walsender.c:1146 replication/walsender.c:1168 replication/walsender.c:1178 +#: replication/walsender.c:1187 replication/walsender.c:1426 #, c-format msgid "conflicting or redundant options" msgstr "ç«¶åˆã™ã‚‹ã‚ªãƒ—ションã€ã‚ã‚‹ã„ã¯ä½™è¨ˆãªã‚ªãƒ—ションãŒã‚りã¾ã™" -#: commands/collationcmds.c:126 +#: commands/collationcmds.c:124 #, c-format msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." msgstr "" "LOCALE 㯠LC_COLLATE ã¾ãŸã¯ LC_CTYPE \n" "ã¨åŒæ™‚ã«æŒ‡å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/collationcmds.c:132 +#: commands/collationcmds.c:130 #, c-format msgid "FROM cannot be specified together with any other options." msgstr "FROMã¯ä»–ã®ã™ã¹ã¦ã®ã‚ªãƒ—ションã¨åŒæ™‚ã«æŒ‡å®šã¯ã§ãã¾ã›ã‚“。" -#: commands/collationcmds.c:191 +#: commands/collationcmds.c:189 #, c-format msgid "collation \"default\" cannot be copied" msgstr "ç…§åˆé †åº\"default\"ã¯è¤‡è£½ã§ãã¾ã›ã‚“" @@ -6110,97 +6483,84 @@ msgstr "ç…§åˆé †åº\"default\"ã¯è¤‡è£½ã§ãã¾ã›ã‚“" msgid "unrecognized collation provider: %s" msgstr "èªè­˜ã§ããªã„ã®ç…§åˆé †åºãƒ—ロãƒã‚¤ãƒ€: %s" -#: commands/collationcmds.c:253 -#, c-format -msgid "parameter \"lc_collate\" must be specified" -msgstr "\"lc_collate\"ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã®æŒ‡å®šãŒå¿…è¦ã§ã™" - -#: commands/collationcmds.c:258 +#: commands/collationcmds.c:253 commands/collationcmds.c:264 commands/collationcmds.c:270 commands/collationcmds.c:278 #, c-format -msgid "parameter \"lc_ctype\" must be specified" -msgstr "\"lc_ctype\"ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã®æŒ‡å®šãŒå¿…è¦ã§ã™" +msgid "parameter \"%s\" must be specified" +msgstr "パラメータ\"%s\"ã®æŒ‡å®šãŒå¿…è¦ã§ã™" -#: commands/collationcmds.c:265 -#, c-format -msgid "parameter \"locale\" must be specified" -msgstr "パラメータ\"locale\"ã®æŒ‡å®šãŒå¿…è¦ã§ã™" - -#: commands/collationcmds.c:279 commands/dbcommands.c:1081 +#: commands/collationcmds.c:293 commands/dbcommands.c:1134 #, c-format msgid "using standard form \"%s\" for ICU locale \"%s\"" msgstr "ICUロケール\"%s\"ã®æ¨™æº–å½¢å¼\"%s\"を使用ã—ã¾ã™" -#: commands/collationcmds.c:298 +#: commands/collationcmds.c:312 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "éžæ±ºå®šçš„ç…§åˆé †åºã¯ã“ã®ãƒ—ロãƒã‚¤ãƒ€ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: commands/collationcmds.c:303 commands/dbcommands.c:1100 +#: commands/collationcmds.c:317 commands/dbcommands.c:1087 #, c-format msgid "ICU rules cannot be specified unless locale provider is ICU" msgstr "ICUルールã¯ãƒ­ã‚±ãƒ¼ãƒ«ãƒ—ロãƒã‚¤ãƒ€ãŒICUã§ãªã‘ã‚Œã°æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/collationcmds.c:322 +#: commands/collationcmds.c:340 #, c-format msgid "current database's encoding is not supported with this provider" msgstr "ç¾åœ¨ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã¯ã“ã®ãƒ—ロãƒã‚¤ãƒ€ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: commands/collationcmds.c:382 +#: commands/collationcmds.c:409 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "エンコーディング\"%2$s\"ã®ãŸã‚ã®ç…§åˆé †åº\"%1$s\"ã¯ã™ã§ã«ã‚¹ã‚­ãƒ¼ãƒž\"%3$s\"内ã«å­˜åœ¨ã—ã¾ã™" -#: commands/collationcmds.c:393 +#: commands/collationcmds.c:420 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "ç…§åˆé †åº\"%s\"ã¯ã™ã§ã«ã‚¹ã‚­ãƒ¼ãƒž\"%s\"内ã«å­˜åœ¨ã—ã¾ã™" -#: commands/collationcmds.c:418 +#: commands/collationcmds.c:445 #, c-format msgid "cannot refresh version of default collation" msgstr "デフォルト照åˆé †åºã®ãƒãƒ¼ã‚·ãƒ§ãƒ³ã¯ãƒªãƒ•レッシュã§ãã¾ã›ã‚“" -#: commands/collationcmds.c:419 +#. translator: %s is an SQL command +#. translator: %s is an SQL ALTER command +#: commands/collationcmds.c:447 commands/subscriptioncmds.c:1376 commands/tablecmds.c:7938 commands/tablecmds.c:7948 commands/tablecmds.c:7950 commands/tablecmds.c:14532 commands/tablecmds.c:17917 commands/tablecmds.c:17938 commands/typecmds.c:3787 commands/typecmds.c:3872 commands/typecmds.c:4226 #, c-format -msgid "Use ALTER DATABASE ... REFRESH COLLATION VERSION instead." -msgstr "代ã‚りã«ALTER DATABASE ... REFRESH COLLATION VERSIONを使ã£ã¦ãã ã•ã„。" +msgid "Use %s instead." +msgstr "代ã‚りã«%sを使用ã—ã¦ãã ã•ã„" -#: commands/collationcmds.c:446 commands/dbcommands.c:2454 +#: commands/collationcmds.c:480 commands/dbcommands.c:2566 #, c-format msgid "changing version from %s to %s" msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã‹ã‚‰%sã¸ã®å¤‰æ›´" -#: commands/collationcmds.c:461 commands/dbcommands.c:2467 +#: commands/collationcmds.c:495 commands/dbcommands.c:2579 #, c-format msgid "version has not changed" msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¤‰ã‚ã£ã¦ã„ã¾ã›ã‚“" -#: commands/collationcmds.c:494 commands/dbcommands.c:2633 +#: commands/collationcmds.c:528 commands/dbcommands.c:2749 #, c-format msgid "database with OID %u does not exist" msgstr "OID %uã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/collationcmds.c:515 +#: commands/collationcmds.c:554 #, c-format msgid "collation with OID %u does not exist" msgstr "OID %uã®ç…§åˆé †åºã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/collationcmds.c:803 +#: commands/collationcmds.c:848 #, c-format msgid "must be superuser to import system collations" msgstr "システム照åˆé †åºã‚’インãƒãƒ¼ãƒˆã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/collationcmds.c:831 commands/copyfrom.c:1653 commands/copyto.c:656 libpq/be-secure-common.c:59 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "コマンド\"%s\"を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: commands/collationcmds.c:923 commands/collationcmds.c:1008 +#: commands/collationcmds.c:968 commands/collationcmds.c:1053 #, c-format msgid "no usable system locales were found" msgstr "使用ã§ãるシステムロケールãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: commands/comment.c:61 commands/dbcommands.c:1601 commands/dbcommands.c:1798 commands/dbcommands.c:1908 commands/dbcommands.c:2106 commands/dbcommands.c:2344 commands/dbcommands.c:2427 commands/dbcommands.c:2537 commands/dbcommands.c:3037 utils/init/postinit.c:1021 utils/init/postinit.c:1126 utils/init/postinit.c:1143 +#: commands/comment.c:61 commands/dbcommands.c:1665 commands/dbcommands.c:1883 commands/dbcommands.c:1995 commands/dbcommands.c:2193 commands/dbcommands.c:2433 commands/dbcommands.c:2526 commands/dbcommands.c:2650 commands/dbcommands.c:3161 utils/init/postinit.c:1034 utils/init/postinit.c:1098 utils/init/postinit.c:1171 #, c-format msgid "database \"%s\" does not exist" msgstr "データベース\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" @@ -6210,302 +6570,254 @@ msgstr "データベース\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" msgid "cannot set comment on relation \"%s\"" msgstr "リレーション\"%s\"ã«ã¯ã‚³ãƒ¡ãƒ³ãƒˆã‚’設定ã§ãã¾ã›ã‚“" -#: commands/constraint.c:63 utils/adt/ri_triggers.c:2028 +#: commands/constraint.c:61 utils/adt/ri_triggers.c:2019 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "関数\"%s\"ã¯ãƒˆãƒªã‚¬é–¢æ•°ã¨ã—ã¦å‘¼ã³å‡ºã•れã¦ã„ã¾ã›ã‚“" -#: commands/constraint.c:70 utils/adt/ri_triggers.c:2037 +#: commands/constraint.c:68 utils/adt/ri_triggers.c:2028 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "関数\"%s\"ã¯AFTER ROWトリガã§å®Ÿè¡Œã—ã¦ãã ã•ã„" -#: commands/constraint.c:84 +#: commands/constraint.c:82 #, c-format msgid "function \"%s\" must be fired for INSERT or UPDATE" msgstr "関数\"%s\"ã¯INSERTã¾ãŸã¯UPDATEトリガã§å®Ÿè¡Œã—ã¦ãã ã•ã„" -#: commands/conversioncmds.c:69 +#: commands/conversioncmds.c:62 #, c-format msgid "source encoding \"%s\" does not exist" msgstr "変æ›å…ƒç¬¦å·åŒ–æ–¹å¼\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/conversioncmds.c:76 +#: commands/conversioncmds.c:69 #, c-format msgid "destination encoding \"%s\" does not exist" msgstr "変æ›å…ˆç¬¦å·åŒ–æ–¹å¼\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/conversioncmds.c:89 +#: commands/conversioncmds.c:82 #, c-format msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" msgstr "SQL_ASCIIã¨ã®é–“ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°å¤‰æ›ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/conversioncmds.c:102 +#: commands/conversioncmds.c:95 #, c-format msgid "encoding conversion function %s must return type %s" msgstr "エンコード変æ›é–¢æ•°%sã¯%s型を返ã™å¿…è¦ãŒã‚りã¾ã™" -#: commands/conversioncmds.c:132 +#: commands/conversioncmds.c:125 #, c-format msgid "encoding conversion function %s returned incorrect result for empty input" msgstr "エンコーディング変æ›é–¢æ•°%sã¯ç©ºã®å…¥åŠ›ã«å¯¾ã—ã¦é–“é•ã£ãŸçµæžœã‚’è¿”å´ã—ã¾ã—ãŸ" -#: commands/copy.c:86 +#: commands/copy.c:84 #, c-format msgid "permission denied to COPY to or from an external program" msgstr "COPYã§å¤–部プログラムã¨ã®é–“ã®å…¥å‡ºåŠ›ã‚’è¡Œã†æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/copy.c:87 +#: commands/copy.c:85 #, c-format msgid "Only roles with privileges of the \"%s\" role may COPY to or from an external program." msgstr "\"%s\"ãƒ­ãƒ¼ãƒ«ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒCOPYã«ã‚ˆã‚‹å¤–部プログラムã¨ã®é–“ã®å…¥å‡ºåŠ›ã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: commands/copy.c:89 commands/copy.c:100 commands/copy.c:109 +#: commands/copy.c:87 commands/copy.c:98 commands/copy.c:107 #, c-format msgid "Anyone can COPY to stdout or from stdin. psql's \\copy command also works for anyone." msgstr "標準入出力経由ã®COPYã¯èª°ã§ã‚‚実行å¯èƒ½ã§ã™ã€‚ã¾ãŸpsqlã®\\\\copyも誰ã§ã‚‚実行ã§ãã¾ã™" -#: commands/copy.c:97 +#: commands/copy.c:95 #, c-format msgid "permission denied to COPY from a file" msgstr "COPYã§ãƒ•ァイルã‹ã‚‰ã®å…¥åŠ›ã‚’è¡Œã†æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/copy.c:98 +#: commands/copy.c:96 #, c-format msgid "Only roles with privileges of the \"%s\" role may COPY from a file." msgstr "\"%s\"ãƒ­ãƒ¼ãƒ«ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒCOPYã«ã‚ˆã‚‹ãƒ•ァイルã‹ã‚‰ã®å…¥åŠ›ã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: commands/copy.c:106 +#: commands/copy.c:104 #, c-format msgid "permission denied to COPY to a file" msgstr "COPYã§ãƒ•ァイルã¸ã®å‡ºåŠ›ã‚’è¡Œã†æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/copy.c:107 +#: commands/copy.c:105 #, c-format msgid "Only roles with privileges of the \"%s\" role may COPY to a file." msgstr "\"%s\"ãƒ­ãƒ¼ãƒ«ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒCOPYã«ã‚ˆã‚‹ãƒ•ァイルã¸ã®å‡ºåŠ›ã‚’è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: commands/copy.c:195 +#: commands/copy.c:193 #, c-format msgid "COPY FROM not supported with row-level security" msgstr "COPY FROM ã§è¡Œãƒ¬ãƒ™ãƒ«ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/copy.c:196 +#: commands/copy.c:194 #, c-format msgid "Use INSERT statements instead." msgstr "代ã‚りã«INSERTを文使用ã—ã¦ãã ã•ã„。" -#: commands/copy.c:290 -#, c-format -msgid "MERGE not supported in COPY" -msgstr "MERGEã¯COPYã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" - -#: commands/copy.c:383 +#: commands/copy.c:375 #, c-format msgid "cannot use \"%s\" with HEADER in COPY TO" msgstr "COPY TO ã® HEADERã§\"%s\"ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/copy.c:392 +#: commands/copy.c:384 #, c-format msgid "%s requires a Boolean value or \"match\"" msgstr "パラメータ\"%s\"ã¯Boolean値ã¾ãŸã¯\"match\"ã®ã¿ã‚’å–りã¾ã™" -#: commands/copy.c:451 +#. translator: first %s is the name of a COPY option, e.g. ON_ERROR, +#. second %s is a COPY with direction, e.g. COPY TO +#: commands/copy.c:402 commands/copy.c:782 commands/copy.c:798 commands/copy.c:815 commands/copy.c:841 commands/copy.c:851 +#, c-format +msgid "COPY %s cannot be used with %s" +msgstr "COPY %s 㯠%s ã¨åŒæ™‚ã«ã¯ä½¿ãˆã¾ã›ã‚“" + +#. translator: first %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:416 commands/copy.c:441 +#, c-format +msgid "COPY %s \"%s\" not recognized" +msgstr "COPY %s \"%s\"ã‚’èªè­˜ã§ãã¾ã›ã‚“" + +#: commands/copy.c:502 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "COPY フォーマット\"%s\"ã‚’èªè­˜ã§ãã¾ã›ã‚“" -#: commands/copy.c:509 commands/copy.c:522 commands/copy.c:535 commands/copy.c:554 +#: commands/copy.c:560 commands/copy.c:575 commands/copy.c:590 commands/copy.c:609 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "オプション\"%s\"ã®å¼•æ•°ã¯åˆ—åã®ãƒªã‚¹ãƒˆã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/copy.c:566 +#: commands/copy.c:621 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "オプション\"%s\"ã®å¼•æ•°ã¯æœ‰åйãªã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°åã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/copy.c:573 commands/dbcommands.c:859 commands/dbcommands.c:2292 +#: commands/copy.c:642 commands/dbcommands.c:866 commands/dbcommands.c:2381 #, c-format msgid "option \"%s\" not recognized" msgstr "タイムゾーン\"%s\"ã‚’èªè­˜ã§ãã¾ã›ã‚“" -#: commands/copy.c:585 -#, c-format -msgid "cannot specify DELIMITER in BINARY mode" -msgstr "BINARYモードã§ã¯DELIMITERを指定ã§ãã¾ã›ã‚“" - -#: commands/copy.c:590 +#. translator: %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:655 commands/copy.c:660 commands/copy.c:665 commands/copy.c:740 #, c-format -msgid "cannot specify NULL in BINARY mode" -msgstr "BINARYモードã§ã¯NULLを指定ã§ãã¾ã›ã‚“" +msgid "cannot specify %s in BINARY mode" +msgstr "BINARYモードã§ã¯%sを指定ã§ãã¾ã›ã‚“" -#: commands/copy.c:595 +#: commands/copy.c:670 #, c-format -msgid "cannot specify DEFAULT in BINARY mode" -msgstr "BINARYモードã§ã¯DEFAULTを指定ã§ãã¾ã›ã‚“" +msgid "only ON_ERROR STOP is allowed in BINARY mode" +msgstr "BINARYモードã§ã¯N_ERROR STOPã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™" -#: commands/copy.c:617 +#: commands/copy.c:692 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "COPYã®åŒºåˆ‡ã‚Šæ–‡å­—ã¯å˜ä¸€ã®1ãƒã‚¤ãƒˆæ–‡å­—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/copy.c:624 +#: commands/copy.c:699 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "COPYã®åŒºåˆ‡ã‚Šæ–‡å­—ã¯æ”¹è¡Œã‚„復帰記å·ã¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/copy.c:630 +#: commands/copy.c:705 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "COPYã®NULL表ç¾ã«ã¯æ”¹è¡Œã‚„復帰記å·ã‚’使用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/copy.c:640 +#: commands/copy.c:715 #, c-format msgid "COPY default representation cannot use newline or carriage return" msgstr "COPYã®ãƒ‡ãƒ•ォルト表ç¾ã«ã¯æ”¹è¡Œã‚„復帰記å·ã‚’使用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/copy.c:658 +#: commands/copy.c:733 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "COPYã®åŒºåˆ‡ã‚Šæ–‡å­—ã‚’\"%s\"ã¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/copy.c:664 +#. translator: %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:747 commands/copy.c:764 commands/copy.c:776 commands/copy.c:791 commands/copy.c:807 #, c-format -msgid "cannot specify HEADER in BINARY mode" -msgstr "BINARYモードã§ã¯HEADERを指定ã§ãã¾ã›ã‚“" +msgid "COPY %s requires CSV mode" +msgstr "COPY %s ã¯CSVãƒ¢ãƒ¼ãƒ‰ã‚’è¦æ±‚ã—ã¾ã™" -#: commands/copy.c:670 -#, c-format -msgid "COPY quote available only in CSV mode" -msgstr "COPYã®å¼•用符ã¯CSVモードã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™" - -#: commands/copy.c:675 +#: commands/copy.c:752 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "COPYã®å¼•用符ã¯å˜ä¸€ã®1ãƒã‚¤ãƒˆæ–‡å­—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/copy.c:680 +#: commands/copy.c:757 #, c-format msgid "COPY delimiter and quote must be different" msgstr "COPYã®åŒºåˆ‡ã‚Šæ–‡å­—ã¨å¼•用符ã¯ç•°ãªã‚‹æ–‡å­—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/copy.c:686 -#, c-format -msgid "COPY escape available only in CSV mode" -msgstr "COPYã®ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã¯CSVモードã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™" - -#: commands/copy.c:691 +#: commands/copy.c:769 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "COPYã®ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã¯å˜ä¸€ã®1ãƒã‚¤ãƒˆæ–‡å­—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/copy.c:697 -#, c-format -msgid "COPY force quote available only in CSV mode" -msgstr "COPYã®FORCE_QUOTEオプションã¯CSVモードã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™" - -#: commands/copy.c:701 -#, c-format -msgid "COPY force quote only available using COPY TO" -msgstr "COPYã®FORCE_QUOTEオプションã¯COPY TOã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™" - -#: commands/copy.c:707 -#, c-format -msgid "COPY force not null available only in CSV mode" -msgstr "COPYã®FORCE_NOT_NULLオプションã¯CSVモードã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™" - -#: commands/copy.c:711 -#, c-format -msgid "COPY force not null only available using COPY FROM" -msgstr "COPYã®FORCE_NOT_NULLオプションã¯COPY FROMã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™" - -#: commands/copy.c:717 -#, c-format -msgid "COPY force null available only in CSV mode" -msgstr "COPYã®FORCE_NULLオプションã¯CSVモードã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™" - -#: commands/copy.c:722 -#, c-format -msgid "COPY force null only available using COPY FROM" -msgstr "COPYã®FORCE_NOT_NULLオプションã¯COPY FROMã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™" - -#: commands/copy.c:728 -#, c-format -msgid "COPY delimiter must not appear in the NULL specification" -msgstr "COPYã®åŒºåˆ‡ã‚Šæ–‡å­—ã¯NULL指定ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" - -#: commands/copy.c:735 -#, c-format -msgid "CSV quote character must not appear in the NULL specification" -msgstr "COPYã®å¼•用符ã¯NULL指定ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" - -#: commands/copy.c:742 -#, c-format -msgid "COPY DEFAULT only available using COPY FROM" -msgstr "COPY DEFAULTã¯COPY FROMã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™" - -#: commands/copy.c:748 +#. translator: %s is the name of a COPY option, e.g. NULL +#: commands/copy.c:823 commands/copy.c:859 #, c-format -msgid "COPY delimiter must not appear in the DEFAULT specification" -msgstr "COPYã®åŒºåˆ‡ã‚Šæ–‡å­—ã¯DEFAULT指定ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" +msgid "COPY delimiter character must not appear in the %s specification" +msgstr "COPYã®åŒºåˆ‡ã‚Šæ–‡å­—ã¯%s指定ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/copy.c:755 +#. translator: %s is the name of a COPY option, e.g. NULL +#: commands/copy.c:832 commands/copy.c:868 #, c-format -msgid "CSV quote character must not appear in the DEFAULT specification" -msgstr "COPYã®å¼•用符ã¯DEFAULT指定ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" +msgid "CSV quote character must not appear in the %s specification" +msgstr "COPYã®å¼•用符ã¯%s指定ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/copy.c:763 +#: commands/copy.c:877 #, c-format msgid "NULL specification and DEFAULT specification cannot be the same" msgstr "NULL指定ã¨DEFAULT指定ã¯åŒã˜ã«ã¯ã§ãã¾ã›ã‚“" -#: commands/copy.c:825 +#: commands/copy.c:939 #, c-format msgid "column \"%s\" is a generated column" msgstr "列\"%s\"ã¯ç”Ÿæˆã‚«ãƒ©ãƒ ã§ã™" -#: commands/copy.c:827 +#: commands/copy.c:941 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "生æˆã‚«ãƒ©ãƒ ã¯COPYã§ã¯ä½¿ãˆã¾ã›ã‚“。" -#: commands/copy.c:842 commands/indexcmds.c:1894 commands/statscmds.c:242 commands/tablecmds.c:2405 commands/tablecmds.c:3127 commands/tablecmds.c:3626 parser/parse_relation.c:3688 parser/parse_relation.c:3698 parser/parse_relation.c:3716 parser/parse_relation.c:3723 parser/parse_relation.c:3737 utils/adt/tsvector_op.c:2855 +#: commands/copy.c:956 commands/indexcmds.c:1890 commands/statscmds.c:239 commands/tablecmds.c:2526 commands/tablecmds.c:2997 commands/tablecmds.c:3808 parser/parse_relation.c:3692 parser/parse_relation.c:3702 parser/parse_relation.c:3720 parser/parse_relation.c:3727 parser/parse_relation.c:3741 utils/adt/tsvector_op.c:2853 #, c-format msgid "column \"%s\" does not exist" msgstr "列\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/copy.c:849 commands/tablecmds.c:2431 commands/trigger.c:958 parser/parse_target.c:1070 parser/parse_target.c:1081 +#: commands/copy.c:963 commands/tablecmds.c:2552 commands/trigger.c:951 parser/parse_target.c:1083 parser/parse_target.c:1094 #, c-format msgid "column \"%s\" specified more than once" msgstr "列\"%s\"ãŒè¤‡æ•°æŒ‡å®šã•れã¾ã—ãŸ" -#: commands/copyfrom.c:122 +#: commands/copyfrom.c:118 #, c-format msgid "COPY %s" msgstr "%sã®COPY" -#: commands/copyfrom.c:130 +#: commands/copyfrom.c:126 #, c-format msgid "COPY %s, line %llu, column %s" msgstr "%sã®COPYã€è¡Œ %lluã€åˆ— %s" -#: commands/copyfrom.c:135 commands/copyfrom.c:181 +#: commands/copyfrom.c:131 commands/copyfrom.c:177 #, c-format msgid "COPY %s, line %llu" msgstr "%sã®COPYã€è¡Œ %llu" -#: commands/copyfrom.c:147 +#: commands/copyfrom.c:143 #, c-format msgid "COPY %s, line %llu, column %s: \"%s\"" msgstr "%sã®COPYã€è¡Œ %lluã€åˆ— %s: \"%s\"" -#: commands/copyfrom.c:157 +#: commands/copyfrom.c:153 #, c-format msgid "COPY %s, line %llu, column %s: null input" msgstr "%sã®COPYã€è¡Œ %lluã€åˆ— %s: null ãŒå…¥åŠ›ã•れã¾ã—ãŸ" -#: commands/copyfrom.c:174 +#: commands/copyfrom.c:170 #, c-format msgid "COPY %s, line %llu: \"%s\"" msgstr "%sã®COPYã€è¡Œ %llu: \"%s\"" @@ -6550,32 +6862,40 @@ msgstr "先行ã™ã‚‹ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å‡¦ç†ã®ãŸã‚COPY FREEZEを実行 msgid "cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction" msgstr "ã“ã®ãƒ†ãƒ¼ãƒ–ルã¯ç¾åœ¨ã®ã‚µãƒ–トランザクションã«ãŠã„ã¦ä½œæˆã¾ãŸã¯åˆ‡ã‚Šè©°ã‚ã•れã¦ã„ãªã„ãŸã‚ã€COPY FREEZEを実行ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/copyfrom.c:1411 +#: commands/copyfrom.c:1313 +#, c-format +msgid "%llu row was skipped due to data type incompatibility" +msgid_plural "%llu rows were skipped due to data type incompatibility" +msgstr[0] "%llu行ãŒãƒ‡ãƒ¼ã‚¿åž‹ã®ä¸é©åˆã«ã‚ˆã‚Šã‚¹ã‚­ãƒƒãƒ—ã•れã¾ã—ãŸ" + +#. translator: first %s is the name of a COPY option, e.g. FORCE_NOT_NULL +#. translator: %s is the name of a COPY option, e.g. FORCE_NOT_NULL +#: commands/copyfrom.c:1448 commands/copyfrom.c:1491 commands/copyto.c:601 #, c-format -msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" -msgstr "FORCE_NOT_NULL指定ã•れãŸåˆ—\"%s\"ã¯COPYã§å‚ç…§ã•れã¾ã›ã‚“" +msgid "%s column \"%s\" not referenced by COPY" +msgstr "%s指定ã•れãŸåˆ—\"%s\"ã¯COPYã§å‚ç…§ã•れã¾ã›ã‚“" -#: commands/copyfrom.c:1434 +#: commands/copyfrom.c:1544 utils/mb/mbutils.c:385 #, c-format -msgid "FORCE_NULL column \"%s\" not referenced by COPY" -msgstr "FORCE_NULL指定ã•れãŸåˆ—\"%s\"ã¯COPYã§å‚ç…§ã•れã¾ã›ã‚“" +msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" +msgstr "符å·åŒ–æ–¹å¼\"%s\"ã‹ã‚‰\"%s\"用ã®ãƒ‡ãƒ•ォルト変æ›é–¢æ•°ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/copyfrom.c:1672 +#: commands/copyfrom.c:1742 #, c-format msgid "COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \\copy." msgstr "COPY FROMã«ã‚ˆã£ã¦PostgreSQLサーãƒãƒ¼ãƒ—ロセスã¯ãƒ•ァイルを読ã¿è¾¼ã¿ã¾ã™ã€‚psqlã® \\copy ã®ã‚ˆã†ãªã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ä»•組ã¿ãŒå¿…è¦ã‹ã‚‚ã—れã¾ã›ã‚“" -#: commands/copyfrom.c:1685 commands/copyto.c:708 +#: commands/copyfrom.c:1755 commands/copyto.c:706 #, c-format msgid "\"%s\" is a directory" msgstr "\"%s\"ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã™" -#: commands/copyfrom.c:1753 commands/copyto.c:306 libpq/be-secure-common.c:83 +#: commands/copyfrom.c:1823 commands/copyto.c:299 libpq/be-secure-common.c:83 #, c-format msgid "could not close pipe to external command: %m" msgstr "外部コマンドã«å¯¾ã™ã‚‹ãƒ‘イプをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: commands/copyfrom.c:1768 commands/copyto.c:311 +#: commands/copyfrom.c:1838 commands/copyto.c:304 #, c-format msgid "program \"%s\" failed" msgstr "プログラム\"%s\"ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸ" @@ -6615,17 +6935,17 @@ msgstr "COPYファイルã®ãƒ˜ãƒƒãƒ€ãŒä¸æ­£ã§ã™(サイズãŒä¸æ­£ã§ã™)" msgid "could not read from COPY file: %m" msgstr "COPYファイルã‹ã‚‰èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: commands/copyfromparse.c:278 commands/copyfromparse.c:303 tcop/postgres.c:377 +#: commands/copyfromparse.c:278 commands/copyfromparse.c:303 replication/walsender.c:756 replication/walsender.c:782 tcop/postgres.c:381 #, c-format msgid "unexpected EOF on client connection with an open transaction" msgstr "トランザクションを実行中ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæŽ¥ç¶šã§æƒ³å®šå¤–ã®EOFãŒã‚りã¾ã—ãŸ" -#: commands/copyfromparse.c:294 +#: commands/copyfromparse.c:294 replication/walsender.c:772 #, c-format msgid "unexpected message type 0x%02X during COPY from stdin" msgstr "標準入力ã‹ã‚‰ã®COPYä¸­ã«æƒ³å®šå¤–ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—0x%02XãŒã‚りã¾ã—ãŸ" -#: commands/copyfromparse.c:317 +#: commands/copyfromparse.c:317 replication/walsender.c:803 #, c-format msgid "COPY from stdin failed: %s" msgstr "標準入力ã‹ã‚‰ã®COPYãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" @@ -6645,7 +6965,7 @@ msgstr "ヘッダ行フィールド%dã§ã‚«ãƒ©ãƒ åã®ä¸ä¸€è‡´: NULL値(\"%s\" msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" msgstr "ヘッダ行フィールド%dã§ã‚«ãƒ©ãƒ åã®ä¸ä¸€è‡´: \"%s\"を検出, 予期ã—ã¦ã„ãŸå€¤\"%s\"" -#: commands/copyfromparse.c:892 commands/copyfromparse.c:1514 commands/copyfromparse.c:1770 +#: commands/copyfromparse.c:892 commands/copyfromparse.c:1554 commands/copyfromparse.c:1810 #, c-format msgid "extra data after last expected column" msgstr "推定最終列ã®å¾Œã«ä½™è¨ˆãªãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã—ãŸ" @@ -6655,1097 +6975,1157 @@ msgstr "推定最終列ã®å¾Œã«ä½™è¨ˆãªãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã—ãŸ" msgid "missing data for column \"%s\"" msgstr "列\"%s\"ã®ãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã›ã‚“" -#: commands/copyfromparse.c:999 +#: commands/copyfromparse.c:990 +#, c-format +msgid "skipping row due to data type incompatibility at line %llu for column \"%s\": \"%s\"" +msgstr "行%lluã§ã®åˆ— \"%s\"ã«å¯¾ã™ã‚‹ãƒ‡ãƒ¼ã‚¿åž‹éžäº’æ›ã®ãŸã‚ã€ã“ã®è¡Œã‚’スキップã—ã¾ã™ : \"%s\"" + +#: commands/copyfromparse.c:998 +#, c-format +msgid "skipping row due to data type incompatibility at line %llu for column \"%s\": null input" +msgstr "行%lluã§ã®åˆ—\"%s\"ã«å¯¾ã™ã‚‹ãƒ‡ãƒ¼ã‚¿åž‹éžäº’æ›ã®ãŸã‚ã€ã“ã®è¡Œã‚’スキップã—ã¾ã™: NULL入力" + +#: commands/copyfromparse.c:1044 #, c-format msgid "received copy data after EOF marker" msgstr "EOF マーカーã®å¾Œã‚ã§ã‚³ãƒ”ーデータをå—ä¿¡ã—ã¾ã—ãŸ" -#: commands/copyfromparse.c:1006 +#: commands/copyfromparse.c:1051 #, c-format msgid "row field count is %d, expected %d" msgstr "行ã®ãƒ•ィールド数ã¯%dã€ãã®æœŸå¾…値ã¯%dã§ã™" -#: commands/copyfromparse.c:1296 commands/copyfromparse.c:1313 +#: commands/copyfromparse.c:1336 commands/copyfromparse.c:1353 #, c-format msgid "literal carriage return found in data" msgstr "データã®ä¸­ã«å¾©å¸°è¨˜å·ãã®ã‚‚ã®ãŒã‚りã¾ã—ãŸ" -#: commands/copyfromparse.c:1297 commands/copyfromparse.c:1314 +#: commands/copyfromparse.c:1337 commands/copyfromparse.c:1354 #, c-format msgid "unquoted carriage return found in data" msgstr "データã®ä¸­ã«å¼•用符ã®ãªã„復帰記å·ãŒã‚りã¾ã—ãŸ" -#: commands/copyfromparse.c:1299 commands/copyfromparse.c:1316 +#: commands/copyfromparse.c:1339 commands/copyfromparse.c:1356 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "復帰記å·ã¯\"\\r\"ã¨è¡¨ç¾ã—ã¦ãã ã•ã„" -#: commands/copyfromparse.c:1300 commands/copyfromparse.c:1317 +#: commands/copyfromparse.c:1340 commands/copyfromparse.c:1357 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "復帰記å·ã‚’表ç¾ã™ã‚‹ã«ã¯CSVãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚’å¼•ç”¨ç¬¦ã§æ‹¬ã£ã¦ãã ã•ã„" -#: commands/copyfromparse.c:1329 +#: commands/copyfromparse.c:1369 #, c-format msgid "literal newline found in data" msgstr "データã®ä¸­ã«æ”¹è¡Œè¨˜å·ãã®ã‚‚ã®ãŒã‚りã¾ã—ãŸ" -#: commands/copyfromparse.c:1330 +#: commands/copyfromparse.c:1370 #, c-format msgid "unquoted newline found in data" msgstr "データã®ä¸­ã«å¼•用符ã®ãªã„改行記å·ãŒã‚りã¾ã—ãŸ" -#: commands/copyfromparse.c:1332 +#: commands/copyfromparse.c:1372 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "改行記å·ã¯\"\\n\"ã¨è¡¨ç¾ã—ã¦ãã ã•ã„" -#: commands/copyfromparse.c:1333 +#: commands/copyfromparse.c:1373 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "改行記å·ã‚’表ç¾ã™ã‚‹ã«ã¯CSVãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚’å¼•ç”¨ç¬¦ã§æ‹¬ã£ã¦ãã ã•ã„" -#: commands/copyfromparse.c:1379 commands/copyfromparse.c:1415 +#: commands/copyfromparse.c:1419 commands/copyfromparse.c:1455 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "コピー終端記å·ãŒã“れã¾ã§ã®æ”¹è¡Œæ–¹å¼ã¨ä¸€è‡´ã—ã¾ã›ã‚“" -#: commands/copyfromparse.c:1388 commands/copyfromparse.c:1404 +#: commands/copyfromparse.c:1428 commands/copyfromparse.c:1444 #, c-format msgid "end-of-copy marker corrupt" msgstr "コピー終端記å·ãŒç ´æã—ã¦ã„ã¾ã™" -#: commands/copyfromparse.c:1706 commands/copyfromparse.c:1921 +#: commands/copyfromparse.c:1746 commands/copyfromparse.c:1961 #, c-format -msgid "unexpected DEFAULT in COPY data" -msgstr "COPYデータã®ä¸­ã«æƒ³å®šå¤–ã®DEFAULTãŒã‚りã¾ã™" +msgid "unexpected default marker in COPY data" +msgstr "COPYデータã®ä¸­ã«æƒ³å®šå¤–ã®ãƒ‡ãƒ•ォルトマーカーãŒã‚りã¾ã™" -#: commands/copyfromparse.c:1707 commands/copyfromparse.c:1922 +#: commands/copyfromparse.c:1747 commands/copyfromparse.c:1962 #, c-format -msgid "Column \"%s\" has no DEFAULT value." -msgstr "列\"%s\"ã¯DEFAULT値をæŒã¡ã¾ã›ã‚“。" +msgid "Column \"%s\" has no default value." +msgstr "列\"%s\"ã¯ãƒ‡ãƒ•ォルト値をæŒã¡ã¾ã›ã‚“。" -#: commands/copyfromparse.c:1854 +#: commands/copyfromparse.c:1894 #, c-format msgid "unterminated CSV quoted field" msgstr "CSV引用符ãŒé–‰ã˜ã¦ã„ã¾ã›ã‚“" -#: commands/copyfromparse.c:1956 commands/copyfromparse.c:1975 +#: commands/copyfromparse.c:1996 commands/copyfromparse.c:2015 #, c-format msgid "unexpected EOF in COPY data" msgstr "COPYデータã®ä¸­ã«æƒ³å®šå¤–ã®EOFãŒã‚りã¾ã™" -#: commands/copyfromparse.c:1965 +#: commands/copyfromparse.c:2005 #, c-format msgid "invalid field size" msgstr "フィールドサイズãŒä¸æ­£ã§ã™" -#: commands/copyfromparse.c:1988 +#: commands/copyfromparse.c:2028 #, c-format msgid "incorrect binary data format" msgstr "ãƒã‚¤ãƒŠãƒªãƒ‡ãƒ¼ã‚¿æ›¸å¼ãŒä¸æ­£ã§ã™" -#: commands/copyto.c:236 +#: commands/copyto.c:229 #, c-format msgid "could not write to COPY program: %m" msgstr "COPYãƒ—ãƒ­ã‚°ãƒ©ãƒ ã«æ›¸ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: commands/copyto.c:241 +#: commands/copyto.c:234 #, c-format msgid "could not write to COPY file: %m" msgstr "COPYãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: commands/copyto.c:386 +#: commands/copyto.c:379 #, c-format msgid "cannot copy from view \"%s\"" msgstr "ビュー\"%s\"ã‹ã‚‰ã®ã‚³ãƒ”ーã¯ã§ãã¾ã›ã‚“" -#: commands/copyto.c:388 commands/copyto.c:394 commands/copyto.c:400 commands/copyto.c:411 +#: commands/copyto.c:381 commands/copyto.c:387 commands/copyto.c:393 commands/copyto.c:404 #, c-format msgid "Try the COPY (SELECT ...) TO variant." msgstr "COPY (SELECT ...) TO構文を試ã—ã¦ãã ã•ã„" -#: commands/copyto.c:392 +#: commands/copyto.c:385 #, c-format msgid "cannot copy from materialized view \"%s\"" msgstr "実体化ビュー\"%s\"ã‹ã‚‰ã®ã‚³ãƒ”ーã¯ã§ãã¾ã›ã‚“" -#: commands/copyto.c:398 +#: commands/copyto.c:391 #, c-format msgid "cannot copy from foreign table \"%s\"" msgstr "外部テーブル \"%s\" ã‹ã‚‰ã®ã‚³ãƒ”ーã¯ã§ãã¾ã›ã‚“" -#: commands/copyto.c:404 +#: commands/copyto.c:397 #, c-format msgid "cannot copy from sequence \"%s\"" msgstr "シーケンス\"%s\"ã‹ã‚‰ã®ã‚³ãƒ”ーã¯ã§ãã¾ã›ã‚“" -#: commands/copyto.c:409 +#: commands/copyto.c:402 #, c-format msgid "cannot copy from partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"ã‹ã‚‰ã®ã‚³ãƒ”ーã¯ã§ãã¾ã›ã‚“" -#: commands/copyto.c:415 +#: commands/copyto.c:408 #, c-format msgid "cannot copy from non-table relation \"%s\"" msgstr "テーブル以外ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã‹ã‚‰ã®ã‚³ãƒ”ーã¯ã§ãã¾ã›ã‚“" -#: commands/copyto.c:467 +#: commands/copyto.c:460 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for COPY" msgstr "DO INSTEAD NOTHING ルール㯠COPY ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/copyto.c:481 +#: commands/copyto.c:474 #, c-format msgid "conditional DO INSTEAD rules are not supported for COPY" msgstr "æ¡ä»¶ä»˜ã DO INSTEAD ルール㯠COPY ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/copyto.c:485 +#: commands/copyto.c:478 #, c-format -msgid "DO ALSO rules are not supported for the COPY" +msgid "DO ALSO rules are not supported for COPY" msgstr "DO ALSO ルール㯠COPY ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/copyto.c:490 +#: commands/copyto.c:483 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for COPY" msgstr "マルãƒã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆã® DO INSTEAD ルール㯠COPY ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/copyto.c:500 +#: commands/copyto.c:493 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO)ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/copyto.c:517 +#: commands/copyto.c:499 +#, c-format +msgid "COPY query must not be a utility command" +msgstr "COPYå•ã„åˆã‚ã›ã¯ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã‚³ãƒžãƒ³ãƒ‰ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" + +#: commands/copyto.c:515 #, c-format msgid "COPY query must have a RETURNING clause" msgstr "COPY文中ã®å•ã„åˆã‚ã›ã§ã¯RETURNINGå¥ãŒå¿…é ˆã§ã™" -#: commands/copyto.c:546 +#: commands/copyto.c:544 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "COPYæ–‡ã§å‚ç…§ã•れã¦ã„るリレーションãŒå¤‰æ›´ã•れã¾ã—ãŸ" -#: commands/copyto.c:605 -#, c-format -msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" -msgstr "FORCE_QUOTE指定ã•れãŸåˆ—\"%s\"ã¯COPYã§å‚ç…§ã•れã¾ã›ã‚“" - -#: commands/copyto.c:673 +#: commands/copyto.c:671 #, c-format msgid "relative path not allowed for COPY to file" msgstr "ファイルã¸ã®COPYã§ã¯ç›¸å¯¾ãƒ‘ã‚¹ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/copyto.c:692 +#: commands/copyto.c:690 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "ファイル\"%s\"を書ãè¾¼ã¿ç”¨ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: commands/copyto.c:695 +#: commands/copyto.c:693 #, c-format msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." msgstr "COPY TOã«ã‚ˆã£ã¦PostgreSQLサーãƒãƒ¼ãƒ—ロセスã¯ãƒ•ã‚¡ã‚¤ãƒ«ã®æ›¸ãè¾¼ã¿ã‚’行ã„ã¾ã™ã€‚psqlã® \\copy ã®ã‚ˆã†ãªã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ä»•組ã¿ãŒå¿…è¦ã‹ã‚‚ã—れã¾ã›ã‚“" -#: commands/createas.c:215 commands/createas.c:523 +#: commands/createas.c:210 commands/createas.c:516 #, c-format msgid "too many column names were specified" msgstr "指定ã•れãŸåˆ—別åãŒå¤šã™ãŽã¾ã™" -#: commands/createas.c:546 +#: commands/createas.c:539 #, c-format msgid "policies not yet implemented for this command" msgstr "ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã¯ãƒãƒªã‚·ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: commands/dbcommands.c:822 +#: commands/dbcommands.c:829 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATIONã¯ã‚‚ã¯ã‚„サãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: commands/dbcommands.c:823 +#: commands/dbcommands.c:830 #, c-format msgid "Consider using tablespaces instead." msgstr "代ã‚りã«ãƒ†ãƒ¼ãƒ–ル空間ã®ä½¿ç”¨ã‚’検討ã—ã¦ãã ã•ã„" -#: commands/dbcommands.c:848 +#: commands/dbcommands.c:855 #, c-format msgid "OIDs less than %u are reserved for system objects" msgstr "%uよりå°ã•ã„OIDã¯ã‚·ã‚¹ãƒ†ãƒ ã‚ªãƒ–ジェクトã®ãŸã‚ã«äºˆç´„ã•れã¦ã„ã¾ã™" -#: commands/dbcommands.c:879 utils/adt/ascii.c:146 +#: commands/dbcommands.c:886 utils/adt/ascii.c:146 #, c-format msgid "%d is not a valid encoding code" msgstr "%dã¯æœ‰åйãªç¬¦å·åŒ–æ–¹å¼ã‚³ãƒ¼ãƒ‰ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/dbcommands.c:890 utils/adt/ascii.c:128 +#: commands/dbcommands.c:897 utils/adt/ascii.c:128 #, c-format msgid "%s is not a valid encoding name" msgstr "%sã¯æœ‰åйãªç¬¦å·åŒ–æ–¹å¼åã§ã¯ã‚りã¾ã›ã‚“" -#: commands/dbcommands.c:919 +#: commands/dbcommands.c:931 #, c-format msgid "unrecognized locale provider: %s" msgstr "èªè­˜ã§ããªã„ç…§åˆé †åºãƒ—ロãƒã‚¤ãƒ€: %s" -#: commands/dbcommands.c:932 commands/dbcommands.c:2325 commands/user.c:300 commands/user.c:740 +#: commands/dbcommands.c:944 commands/dbcommands.c:2414 commands/user.c:299 commands/user.c:739 #, c-format msgid "invalid connection limit: %d" msgstr "䏿­£ãªæŽ¥ç¶šæ•°åˆ¶é™: %d" -#: commands/dbcommands.c:953 +#: commands/dbcommands.c:965 #, c-format msgid "permission denied to create database" msgstr "データベースを作æˆã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/dbcommands.c:977 +#: commands/dbcommands.c:989 #, c-format msgid "template database \"%s\" does not exist" msgstr "テンプレートデータベース\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/dbcommands.c:989 +#: commands/dbcommands.c:999 +#, c-format +msgid "cannot use invalid database \"%s\" as template" +msgstr "無効ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%s\"ã¯ãƒ†ãƒ³ãƒ—レートã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#: commands/dbcommands.c:1000 commands/dbcommands.c:2444 utils/init/postinit.c:1113 +#, c-format +msgid "Use DROP DATABASE to drop invalid databases." +msgstr "DROP DATABASEを使用ã—ã¦ç„¡åйãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’削除ã—ã¦ãã ã•ã„。" + +#: commands/dbcommands.c:1011 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "データベース\"%s\"をコピーã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/dbcommands.c:1006 +#: commands/dbcommands.c:1028 #, c-format msgid "invalid create database strategy \"%s\"" msgstr "データベース作æˆã®æ–¹æ³•\"%s\"ã¯ä¸æ­£ã§ã™" -#: commands/dbcommands.c:1007 +#: commands/dbcommands.c:1029 #, c-format -msgid "Valid strategies are \"wal_log\", and \"file_copy\"." -msgstr "æœ‰åŠ¹ãªæ–¹æ³•ã¯ã¯\"wal_log\"ã¨\"file_copy\"ã§ã™ã€‚" +msgid "Valid strategies are \"wal_log\" and \"file_copy\"." +msgstr "æœ‰åŠ¹ãªæ–¹æ³•ã¯\"wal_log\"ã¨\"file_copy\"ã§ã™ã€‚" -#: commands/dbcommands.c:1033 +#: commands/dbcommands.c:1050 #, c-format msgid "invalid server encoding %d" msgstr "サーãƒãƒ¼ã®ç¬¦å·åŒ–æ–¹å¼%dã¯ä¸æ­£ã§ã™" -#: commands/dbcommands.c:1039 +#: commands/dbcommands.c:1056 #, c-format msgid "invalid LC_COLLATE locale name: \"%s\"" msgstr "LC_COLLATEã®ãƒ­ã‚±ãƒ¼ãƒ«å\"%s\"ã¯ä¸æ­£ã§ã™" -#: commands/dbcommands.c:1040 commands/dbcommands.c:1046 +#: commands/dbcommands.c:1057 commands/dbcommands.c:1063 #, c-format msgid "If the locale name is specific to ICU, use ICU_LOCALE." msgstr "ロケールåãŒICU特有ã®ã‚‚ã®ã§ã‚ã‚‹å ´åˆã¯ã€ICU_LOCALEを使用ã—ã¦ãã ã•ã„。" -#: commands/dbcommands.c:1045 +#: commands/dbcommands.c:1062 #, c-format msgid "invalid LC_CTYPE locale name: \"%s\"" msgstr "LC_CTYPEã®ãƒ­ã‚±ãƒ¼ãƒ«å\"%s\"ã¯ä¸æ­£ã§ã™" -#: commands/dbcommands.c:1056 +#: commands/dbcommands.c:1074 +#, c-format +msgid "BUILTIN_LOCALE cannot be specified unless locale provider is builtin" +msgstr "BUILTIN_LOCALEã¯ãƒ­ã‚±ãƒ¼ãƒ«ãƒ—ロãƒã‚¤ãƒ€ãŒbuiltinã§ãªã‘ã‚Œã°æŒ‡å®šã§ãã¾ã›ã‚“" + +#: commands/dbcommands.c:1082 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "ICUロケールã¯ãƒ­ã‚±ãƒ¼ãƒ«ãƒ—ロãƒã‚¤ãƒ€ãŒICUã§ãªã‘ã‚Œã°æŒ‡å®šã§ãã¾ã›ã‚“" + +#: commands/dbcommands.c:1100 +#, c-format +msgid "LOCALE or BUILTIN_LOCALE must be specified" +msgstr "LOCALEã‹BUILTIN_LOCALEã®ã„ãšã‚Œã‹ã‚’指定ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#: commands/dbcommands.c:1109 #, c-format msgid "encoding \"%s\" is not supported with ICU provider" msgstr "エンコーディング\"%s\"ã¯ICUã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/dbcommands.c:1066 +#: commands/dbcommands.c:1119 #, c-format msgid "LOCALE or ICU_LOCALE must be specified" msgstr "LOCALEã‹ICU_LOCALEã®ã„ãšã‚Œã‹ã‚’指定ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/dbcommands.c:1095 -#, c-format -msgid "ICU locale cannot be specified unless locale provider is ICU" -msgstr "ICUロケールã¯ãƒ­ã‚±ãƒ¼ãƒ«ãƒ—ロãƒã‚¤ãƒ€ãŒICUã§ãªã‘ã‚Œã°æŒ‡å®šã§ãã¾ã›ã‚“" - -#: commands/dbcommands.c:1118 +#: commands/dbcommands.c:1163 #, c-format msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" msgstr "æ–°ã—ã„符å·åŒ–æ–¹å¼(%s)ã¯ãƒ†ãƒ³ãƒ—レートデータベースã®ç¬¦å·åŒ–æ–¹å¼(%s)ã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: commands/dbcommands.c:1121 +#: commands/dbcommands.c:1166 #, c-format msgid "Use the same encoding as in the template database, or use template0 as template." msgstr "テンプレートデータベースã®ç¬¦å·åŒ–æ–¹å¼ã¨åŒã˜ã‚‚ã®ã‚’使ã†ã‹ã€ã‚‚ã—ã㯠template0 をテンプレートã¨ã—ã¦ä½¿ç”¨ã—ã¦ãã ã•ã„" -#: commands/dbcommands.c:1126 +#: commands/dbcommands.c:1171 #, c-format msgid "new collation (%s) is incompatible with the collation of the template database (%s)" msgstr "æ–°ã—ã„ç…§åˆé †åº(%s)ã¯ãƒ†ãƒ³ãƒ—レートデータベースã®ç…§åˆé †åº(%s)ã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: commands/dbcommands.c:1128 +#: commands/dbcommands.c:1173 #, c-format msgid "Use the same collation as in the template database, or use template0 as template." msgstr "テンプレートデータベースã®ç…§åˆé †åºã¨åŒã˜ã‚‚ã®ã‚’使ã†ã‹ã€ã‚‚ã—ã㯠template0 をテンプレートã¨ã—ã¦ä½¿ç”¨ã—ã¦ãã ã•ã„" -#: commands/dbcommands.c:1133 +#: commands/dbcommands.c:1178 #, c-format msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" msgstr "æ–°ã—ã„LC_CTYPE(%s)ã¯ãƒ†ãƒ³ãƒ—レートデータベース(%s)ã®LC_CTYPEã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: commands/dbcommands.c:1135 +#: commands/dbcommands.c:1180 #, c-format msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." msgstr "テンプレートデータベースã®LC_CTYPEã¨åŒã˜ã‚‚ã®ã‚’使ã†ã‹ã€ã‚‚ã—ãã¯template0をテンプレートã¨ã—ã¦ä½¿ç”¨ã—ã¦ãã ã•ã„" -#: commands/dbcommands.c:1140 +#: commands/dbcommands.c:1185 #, c-format msgid "new locale provider (%s) does not match locale provider of the template database (%s)" msgstr "æ–°ã—ã„ロケール・プロãƒã‚¤ãƒ€(%s)ã¯ãƒ†ãƒ³ãƒ—レートデータベースã®ãƒ­ã‚±ãƒ¼ãƒ«ãƒ»ãƒ—ロãƒã‚¤ãƒ€(%s)ã¨ä¸€è‡´ã—ã¾ã›ã‚“" -#: commands/dbcommands.c:1142 +#: commands/dbcommands.c:1187 #, c-format msgid "Use the same locale provider as in the template database, or use template0 as template." msgstr "テンプレートデータベースã¨åŒã˜ãƒ­ã‚±ãƒ¼ãƒ«ãƒ—ロãƒã‚¤ãƒ€ã‚’使ã†ã‹ã€ã‚‚ã—ã㯠template0 をテンプレートã¨ã—ã¦ä½¿ç”¨ã—ã¦ãã ã•ã„" -#: commands/dbcommands.c:1154 +#: commands/dbcommands.c:1199 #, c-format msgid "new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)" msgstr "æ–°ã—ã„ICUロケール(%s)ã¯ãƒ†ãƒ³ãƒ—レートデータベースã®ICUロケール(%s)ã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: commands/dbcommands.c:1156 +#: commands/dbcommands.c:1201 #, c-format msgid "Use the same ICU locale as in the template database, or use template0 as template." msgstr "テンプレートデータベースã¨åŒã˜ICUロケールを使ã†ã‹ã€ã‚‚ã—ã㯠template0 をテンプレートã¨ã—ã¦ä½¿ç”¨ã—ã¦ãã ã•ã„。" -#: commands/dbcommands.c:1167 +#: commands/dbcommands.c:1212 #, c-format msgid "new ICU collation rules (%s) are incompatible with the ICU collation rules of the template database (%s)" msgstr "æ–°ã—ã„ICUç…§åˆé †åºãƒ«ãƒ¼ãƒ«(%s)ã¯ãƒ†ãƒ³ãƒ—レートデータベースã®ICUç…§åˆé †åº(%s)ã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: commands/dbcommands.c:1169 +#: commands/dbcommands.c:1214 #, c-format msgid "Use the same ICU collation rules as in the template database, or use template0 as template." msgstr "テンプレートデータベースã®ICUç…§åˆé †åºãƒ«ãƒ¼ãƒ«ã¨åŒã˜ã‚‚ã®ã‚’使ã†ã‹ã€ã‚‚ã—ã㯠template0 をテンプレートã¨ã—ã¦ä½¿ç”¨ã—ã¦ãã ã•ã„" -#: commands/dbcommands.c:1192 +#: commands/dbcommands.c:1243 #, c-format msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" msgstr "テンプレートデータベース\"%s\"ã«ã¯ç…§åˆé †åºã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒè¨­å®šã•れã¦ã„ã¾ã™ãŒã€å®Ÿéš›ã®ç…§åˆé †åºãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒç‰¹å®šã§ãã¾ã›ã‚“" -#: commands/dbcommands.c:1197 +#: commands/dbcommands.c:1248 #, c-format msgid "template database \"%s\" has a collation version mismatch" msgstr "テンプレートデータベース\"%s\"ã§ã¯ç…§åˆé †åºãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´ãŒèµ·ãã¦ã„ã¾ã™" -#: commands/dbcommands.c:1199 +#: commands/dbcommands.c:1250 #, c-format msgid "The template database was created using collation version %s, but the operating system provides version %s." msgstr "データベース中ã®ç…§åˆé †åºã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã§ä½œæˆã•れã¦ã„ã¾ã™ãŒã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã‚’æä¾›ã—ã¦ã„ã¾ã™ã€‚" -#: commands/dbcommands.c:1202 +#: commands/dbcommands.c:1253 #, c-format msgid "Rebuild all objects in the template database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." msgstr "デフォルトã®ç…§åˆé †åºã‚’使用ã—ã¦ã„るテンプレート・データベースã®å…¨ã¦ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å†æ§‹ç¯‰ã—ã¦ã€ALTER DATABASE %s REFRESH COLLATION VERSIONを実行ã™ã‚‹ã‹ã€æ­£ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ©ã‚¤ãƒ–ラリを用ã„ã¦PostgreSQLをビルドã—ã¦ãã ã•ã„。" -#: commands/dbcommands.c:1238 commands/dbcommands.c:1954 +#: commands/dbcommands.c:1298 commands/dbcommands.c:2041 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "デフォルトã®ãƒ†ãƒ¼ãƒ–ル空間ã¨ã—ã¦pg_globalを使用ã§ãã¾ã›ã‚“" -#: commands/dbcommands.c:1264 +#: commands/dbcommands.c:1324 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "æ–°ã—ã„デフォルトã®ãƒ†ãƒ¼ãƒ–ル空間\"%s\"を割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“" -#: commands/dbcommands.c:1266 +#: commands/dbcommands.c:1326 #, c-format msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." msgstr "データベース\"%s\"ã®ã„ãã¤ã‹ãƒ†ãƒ¼ãƒ–ルã¯ã™ã§ã«ã“ã®ãƒ†ãƒ¼ãƒ–ル空間ã«ã‚ã‚‹ãŸã‚ã€ç«¶åˆã—ã¦ã„ã¾ã™ã€‚" -#: commands/dbcommands.c:1296 commands/dbcommands.c:1827 +#: commands/dbcommands.c:1356 commands/dbcommands.c:1912 #, c-format msgid "database \"%s\" already exists" msgstr "データベース\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/dbcommands.c:1310 +#: commands/dbcommands.c:1370 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "å…ƒã¨ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%s\"ã¯ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚ˆã£ã¦ã‚¢ã‚¯ã‚»ã‚¹ã•れã¦ã„ã¾ã™" -#: commands/dbcommands.c:1332 +#: commands/dbcommands.c:1392 #, c-format msgid "database OID %u is already in use by database \"%s\"" msgstr "データベースOID %uã¯ã™ã§ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%s\"ã§ä½¿ç”¨ã•れã¦ã„ã¾ã™" -#: commands/dbcommands.c:1338 +#: commands/dbcommands.c:1398 #, c-format msgid "data directory with the specified OID %u already exists" msgstr "指定ã•れãŸOID %uã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/dbcommands.c:1510 commands/dbcommands.c:1525 +#: commands/dbcommands.c:1571 commands/dbcommands.c:1586 utils/adt/pg_locale.c:2588 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "符å·åŒ–æ–¹å¼\"%s\"ãŒãƒ­ã‚±ãƒ¼ãƒ«\"%s\"ã«åˆã„ã¾ã›ã‚“" -#: commands/dbcommands.c:1513 +#: commands/dbcommands.c:1574 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "é¸æŠžã•れãŸLC_CTYPEを設定ã™ã‚‹ã«ã¯ã€ç¬¦å·åŒ–æ–¹å¼\"%s\"ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/dbcommands.c:1528 +#: commands/dbcommands.c:1589 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "é¸æŠžã•れãŸLC_COLLATEを設定ã™ã‚‹ã«ã¯ã€ç¬¦å·åŒ–æ–¹å¼\"%s\"ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/dbcommands.c:1608 +#: commands/dbcommands.c:1672 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "データベース\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dbcommands.c:1632 +#: commands/dbcommands.c:1696 #, c-format msgid "cannot drop a template database" msgstr "テンプレートデータベースを削除ã§ãã¾ã›ã‚“" -#: commands/dbcommands.c:1638 +#: commands/dbcommands.c:1702 #, c-format msgid "cannot drop the currently open database" msgstr "ç¾åœ¨ã‚ªãƒ¼ãƒ—ンã—ã¦ã„るデータベースを削除ã§ãã¾ã›ã‚“" -#: commands/dbcommands.c:1651 +#: commands/dbcommands.c:1715 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "データベース\"%s\"ã¯æœ‰åйãªè«–ç†ãƒ¬ãƒ—リケーションスロットã§ä½¿ç”¨ä¸­ã§ã™" -#: commands/dbcommands.c:1653 +#: commands/dbcommands.c:1717 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." msgstr[0] "%d 個ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚¹ãƒ­ãƒƒãƒˆãŒã‚りã¾ã™ã€‚" -#: commands/dbcommands.c:1667 +#: commands/dbcommands.c:1731 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "データベース\"%s\"ã¯è«–ç†ãƒ¬ãƒ—リケーションã®ã‚µãƒ–スクリプションã§ä½¿ç”¨ä¸­ã§ã™" -#: commands/dbcommands.c:1669 +#: commands/dbcommands.c:1733 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." msgstr[0] "%d個ã®ã‚µãƒ–スクリプションãŒã‚りã¾ã™" -#: commands/dbcommands.c:1690 commands/dbcommands.c:1849 commands/dbcommands.c:1976 +#: commands/dbcommands.c:1754 commands/dbcommands.c:1934 commands/dbcommands.c:2063 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "データベース\"%s\"ã¯ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã•れã¦ã„ã¾ã™" -#: commands/dbcommands.c:1809 +#: commands/dbcommands.c:1894 #, c-format msgid "permission denied to rename database" msgstr "データベースã®åå‰ã‚’変更ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/dbcommands.c:1838 +#: commands/dbcommands.c:1923 #, c-format msgid "current database cannot be renamed" msgstr "ç¾åœ¨ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®åå‰ã‚’変更ã§ãã¾ã›ã‚“" -#: commands/dbcommands.c:1932 +#: commands/dbcommands.c:2019 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "ç¾åœ¨ã‚ªãƒ¼ãƒ—ン中ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ãƒ†ãƒ¼ãƒ–ルスペースã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/dbcommands.c:2038 +#: commands/dbcommands.c:2125 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "データベース\"%s\"ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ä¸­ã«ã€ãƒ†ãƒ¼ãƒ–ルスペース\"%s\"ã«ã™ã§ã«å­˜åœ¨ã™ã‚‹ã‚‚ã®ãŒã‚りã¾ã™" -#: commands/dbcommands.c:2040 +#: commands/dbcommands.c:2127 #, c-format msgid "You must move them back to the database's default tablespace before using this command." msgstr "ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’使ã†å‰ã«ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ãƒ‡ãƒ•ォルトã®ãƒ†ãƒ¼ãƒ–ãƒ«ã‚¹ãƒšãƒ¼ã‚¹ã«æˆ»ã™å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/dbcommands.c:2167 commands/dbcommands.c:2875 commands/dbcommands.c:3139 commands/dbcommands.c:3252 +#: commands/dbcommands.c:2256 commands/dbcommands.c:2999 commands/dbcommands.c:3299 commands/dbcommands.c:3412 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "å…ƒã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"ã«ä¸è¦ãªãƒ•ã‚¡ã‚¤ãƒ«ãŒæ®‹ã£ã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“" -#: commands/dbcommands.c:2228 +#: commands/dbcommands.c:2317 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "DROP DATABASEã®ã‚ªãƒ—ション\"%s\"ãŒèªè­˜ã§ãã¾ã›ã‚“" -#: commands/dbcommands.c:2306 +#: commands/dbcommands.c:2395 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "オプション\"%s\"ã¯ä»–ã®ã‚ªãƒ—ションã¨ä¸€ç·’ã«æŒ‡å®šã¯ã§ãã¾ã›ã‚“" -#: commands/dbcommands.c:2362 +#: commands/dbcommands.c:2443 +#, c-format +msgid "cannot alter invalid database \"%s\"" +msgstr "無効ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%s\"ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" + +#: commands/dbcommands.c:2460 #, c-format msgid "cannot disallow connections for current database" msgstr "ç¾åœ¨ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¸ã®æŽ¥ç¶šã¯ç¦æ­¢ã§ãã¾ã›ã‚“" -#: commands/dbcommands.c:2577 +#: commands/dbcommands.c:2690 #, c-format msgid "permission denied to change owner of database" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ‰€æœ‰è€…を変更ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/dbcommands.c:2981 +#: commands/dbcommands.c:3105 #, c-format msgid "There are %d other session(s) and %d prepared transaction(s) using the database." msgstr "ä»–ã«ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’使ã£ã¦ã„ã‚‹ %d 個ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¨ %d å€‹ã®æº–備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã™ã€‚" -#: commands/dbcommands.c:2984 +#: commands/dbcommands.c:3108 #, c-format msgid "There is %d other session using the database." msgid_plural "There are %d other sessions using the database." msgstr[0] "ä»–ã«ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’使ã£ã¦ã„ã‚‹ %d 個ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŒã‚りã¾ã™ã€‚" -#: commands/dbcommands.c:2989 storage/ipc/procarray.c:3798 +#: commands/dbcommands.c:3113 storage/ipc/procarray.c:3859 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." msgstr[0] "ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’使用ã™ã‚‹æº–å‚™ã•れãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒ%d存在ã—ã¾ã™ã€‚" -#: commands/dbcommands.c:3095 +#: commands/dbcommands.c:3255 #, c-format msgid "missing directory \"%s\"" msgstr "ディレクトリ\"%s\"ãŒã‚りã¾ã›ã‚“" -#: commands/dbcommands.c:3153 commands/tablespace.c:190 commands/tablespace.c:639 +#: commands/dbcommands.c:3313 commands/tablespace.c:184 commands/tablespace.c:633 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "ディレクトリ\"%s\"ã®statãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: commands/define.c:54 commands/define.c:258 commands/define.c:290 commands/define.c:318 commands/define.c:364 +#: commands/define.c:53 commands/define.c:257 commands/define.c:289 commands/define.c:317 commands/define.c:363 #, c-format msgid "%s requires a parameter" msgstr "%sã¯ãƒ‘ラメータãŒå¿…è¦ã§ã™" -#: commands/define.c:87 commands/define.c:98 commands/define.c:192 commands/define.c:210 commands/define.c:225 commands/define.c:243 +#: commands/define.c:86 commands/define.c:97 commands/define.c:191 commands/define.c:209 commands/define.c:224 commands/define.c:242 #, c-format msgid "%s requires a numeric value" msgstr "%sã¯æ•°å€¤ãŒå¿…è¦ã§ã™" -#: commands/define.c:154 +#: commands/define.c:153 #, c-format msgid "%s requires a Boolean value" msgstr "パラメータ\"%s\"ã¯boolean値ãŒå¿…è¦ã§ã™" -#: commands/define.c:168 commands/define.c:177 commands/define.c:327 +#: commands/define.c:167 commands/define.c:176 commands/define.c:326 #, c-format msgid "%s requires an integer value" msgstr "%sã¯æ•´æ•°å€¤ãŒå¿…è¦ã§ã™" -#: commands/define.c:272 +#: commands/define.c:271 #, c-format msgid "argument of %s must be a name" msgstr "%sã®å¼•æ•°ã¯åå‰ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/define.c:302 +#: commands/define.c:301 #, c-format msgid "argument of %s must be a type name" msgstr "%sã®å¼•æ•°ã¯åž‹åã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/define.c:348 +#: commands/define.c:347 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "%sã®å¼•æ•°ãŒä¸æ­£ã§ã™: \"%s\"" -#: commands/dropcmds.c:101 commands/functioncmds.c:1387 utils/adt/ruleutils.c:2897 +#: commands/dropcmds.c:96 commands/functioncmds.c:1382 utils/adt/ruleutils.c:2910 #, c-format msgid "\"%s\" is an aggregate function" msgstr "\"%s\"ã¯é›†ç´„関数ã§ã™" -#: commands/dropcmds.c:103 +#: commands/dropcmds.c:98 #, c-format msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "集約関数を削除ã™ã‚‹ã«ã¯DROP AGGREGATEを使用ã—ã¦ãã ã•ã„" -#: commands/dropcmds.c:158 commands/sequence.c:474 commands/tablecmds.c:3710 commands/tablecmds.c:3868 commands/tablecmds.c:3920 commands/tablecmds.c:16468 tcop/utility.c:1335 +#: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:3892 commands/tablecmds.c:4050 commands/tablecmds.c:4102 commands/tablecmds.c:17194 tcop/utility.c:1325 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "リレーション\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1285 +#: commands/dropcmds.c:183 commands/dropcmds.c:282 commands/tablecmds.c:1409 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "スキーマ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:277 +#: commands/dropcmds.c:223 commands/dropcmds.c:262 commands/tablecmds.c:286 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "åž‹\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:257 +#: commands/dropcmds.c:252 #, c-format msgid "access method \"%s\" does not exist, skipping" msgstr "アクセスメソッド\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:275 +#: commands/dropcmds.c:270 #, c-format msgid "collation \"%s\" does not exist, skipping" msgstr "ç…§åˆé †åº\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:282 +#: commands/dropcmds.c:277 #, c-format msgid "conversion \"%s\" does not exist, skipping" msgstr "変æ›\"%sã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:293 commands/statscmds.c:654 +#: commands/dropcmds.c:288 commands/statscmds.c:664 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "統計情報オブジェクト\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:300 +#: commands/dropcmds.c:295 #, c-format msgid "text search parser \"%s\" does not exist, skipping" msgstr "テキスト検索パーサ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:307 +#: commands/dropcmds.c:302 #, c-format msgid "text search dictionary \"%s\" does not exist, skipping" msgstr "テキスト検索辞書\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:314 +#: commands/dropcmds.c:309 #, c-format msgid "text search template \"%s\" does not exist, skipping" msgstr "テキスト検索テンプレート\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:321 +#: commands/dropcmds.c:316 #, c-format msgid "text search configuration \"%s\" does not exist, skipping" msgstr "テキスト検索設定\"%sã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:326 +#: commands/dropcmds.c:321 #, c-format msgid "extension \"%s\" does not exist, skipping" msgstr "機能拡張\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:336 +#: commands/dropcmds.c:331 #, c-format msgid "function %s(%s) does not exist, skipping" msgstr "関数%s(%s)ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:349 +#: commands/dropcmds.c:344 #, c-format msgid "procedure %s(%s) does not exist, skipping" msgstr "プロシージャ %s(%s) ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:362 +#: commands/dropcmds.c:357 #, c-format msgid "routine %s(%s) does not exist, skipping" msgstr "ルーãƒãƒ³ %s(%s) ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:375 +#: commands/dropcmds.c:370 #, c-format msgid "aggregate %s(%s) does not exist, skipping" msgstr "集約%s(%s)ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:388 +#: commands/dropcmds.c:383 #, c-format msgid "operator %s does not exist, skipping" msgstr "演算å­%sã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:394 +#: commands/dropcmds.c:389 #, c-format msgid "language \"%s\" does not exist, skipping" msgstr "言語\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:403 +#: commands/dropcmds.c:398 #, c-format msgid "cast from type %s to type %s does not exist, skipping" msgstr "åž‹%sã‹ã‚‰åž‹%sã¸ã®ã‚­ãƒ£ã‚¹ãƒˆã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:412 +#: commands/dropcmds.c:407 #, c-format msgid "transform for type %s language \"%s\" does not exist, skipping" msgstr "åž‹%sã€è¨€èªž\"%s\"ã«å¯¾ã™ã‚‹å¤‰æ›ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:420 +#: commands/dropcmds.c:415 #, c-format msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" msgstr "リレーション\"%2$s\"ã®ãƒˆãƒªã‚¬\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:429 +#: commands/dropcmds.c:424 #, c-format msgid "policy \"%s\" for relation \"%s\" does not exist, skipping" msgstr "リレーション\"%2$s\"ã®ãƒãƒªã‚·\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:436 +#: commands/dropcmds.c:431 #, c-format msgid "event trigger \"%s\" does not exist, skipping" msgstr "イベントトリガ \"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:442 +#: commands/dropcmds.c:437 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist, skipping" msgstr "リレーション\"%2$s\"ã®ãƒ«ãƒ¼ãƒ«\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:449 +#: commands/dropcmds.c:444 #, c-format msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "外部データラッパ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 +#: commands/dropcmds.c:448 commands/foreigncmds.c:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "外部データラッパ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:462 +#: commands/dropcmds.c:457 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\", skipping" msgstr "アクセスメソッド\"%2$s\"ã«å¯¾ã™ã‚‹æ¼”ç®—å­ã‚¯ãƒ©ã‚¹\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:474 +#: commands/dropcmds.c:469 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\", skipping" msgstr "アクセスメソッド\"%2$s\"ã«å¯¾ã™ã‚‹æ¼”ç®—å­æ—\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/dropcmds.c:481 +#: commands/dropcmds.c:476 #, c-format msgid "publication \"%s\" does not exist, skipping" msgstr "パブリケーション\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/event_trigger.c:125 +#: commands/event_trigger.c:137 #, c-format msgid "permission denied to create event trigger \"%s\"" msgstr "イベントトリガ \"%s\"を作æˆã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/event_trigger.c:127 +#: commands/event_trigger.c:139 #, c-format msgid "Must be superuser to create an event trigger." msgstr "イベントトリガを作æˆã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/event_trigger.c:136 +#: commands/event_trigger.c:149 #, c-format msgid "unrecognized event name \"%s\"" msgstr "識別ã§ããªã„イベントå\"%s\"" -#: commands/event_trigger.c:153 +#: commands/event_trigger.c:166 #, c-format msgid "unrecognized filter variable \"%s\"" msgstr "識別ã§ããªã„フィルタ変数\"%s\"" -#: commands/event_trigger.c:207 +#: commands/event_trigger.c:181 +#, c-format +msgid "tag filtering is not supported for login event triggers" +msgstr "タグフィルタリングã¯ãƒ­ã‚°ã‚¤ãƒ³ã‚¤ãƒ™ãƒ³ãƒˆãƒˆãƒªã‚¬ãƒ¼ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" + +#: commands/event_trigger.c:224 #, c-format msgid "filter value \"%s\" not recognized for filter variable \"%s\"" msgstr "フィルタã®å€¤\"%s\"ã¯ãƒ•ィルタ変数\"%s\"ã§ã¯èªè­˜ã•れã¾ã›ã‚“" #. translator: %s represents an SQL statement name -#: commands/event_trigger.c:213 commands/event_trigger.c:235 +#: commands/event_trigger.c:230 commands/event_trigger.c:252 #, c-format msgid "event triggers are not supported for %s" msgstr "%sã§ã¯ã‚¤ãƒ™ãƒ³ãƒˆãƒˆãƒªã‚¬ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: commands/event_trigger.c:248 +#: commands/event_trigger.c:265 #, c-format msgid "filter variable \"%s\" specified more than once" msgstr "フィルタ変数\"%s\"ãŒè¤‡æ•°æŒ‡å®šã•れã¾ã—ãŸ" -#: commands/event_trigger.c:376 commands/event_trigger.c:420 commands/event_trigger.c:514 +#: commands/event_trigger.c:438 commands/event_trigger.c:490 commands/event_trigger.c:584 #, c-format msgid "event trigger \"%s\" does not exist" msgstr "イベントトリガ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/event_trigger.c:452 +#: commands/event_trigger.c:522 #, c-format msgid "event trigger with OID %u does not exist" msgstr "OID %uã®ã‚¤ãƒ™ãƒ³ãƒˆãƒˆãƒªã‚¬ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/event_trigger.c:482 +#: commands/event_trigger.c:552 #, c-format msgid "permission denied to change owner of event trigger \"%s\"" msgstr "イベントトリガ\"%s\"ã®æ‰€æœ‰è€…を変更ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/event_trigger.c:484 +#: commands/event_trigger.c:554 #, c-format msgid "The owner of an event trigger must be a superuser." msgstr "ã‚¤ãƒ™ãƒ³ãƒˆãƒˆãƒªã‚¬ã®æ‰€æœ‰è€…ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/event_trigger.c:1304 +#: commands/event_trigger.c:1409 #, c-format msgid "%s can only be called in a sql_drop event trigger function" msgstr "%sã¯sql_dropイベントトリガ関数内ã§ã®ã¿å‘¼ã³å‡ºã™ã“ã¨ãŒã§ãã¾ã™" -#: commands/event_trigger.c:1397 commands/event_trigger.c:1418 +#: commands/event_trigger.c:1502 commands/event_trigger.c:1523 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" msgstr "%sã¯table_rewriteイベントトリガ関数ã§ã®ã¿å‘¼ã³å‡ºã™ã“ã¨ãŒã§ãã¾ã™" -#: commands/event_trigger.c:1831 +#: commands/event_trigger.c:1936 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%sã¯ã‚¤ãƒ™ãƒ³ãƒˆãƒˆãƒªã‚¬é–¢æ•°ã§ã®ã¿å‘¼ã³å‡ºã™ã“ã¨ãŒã§ãã¾ã™" -#: commands/explain.c:220 +#: commands/explain.c:241 commands/explain.c:266 #, c-format msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" msgstr "EXPLAIN オプション\"%s\"ãŒèªè­˜ã§ããªã„値ã§ã™: \"%s\"" -#: commands/explain.c:227 +#: commands/explain.c:273 #, c-format msgid "unrecognized EXPLAIN option \"%s\"" msgstr "EXPLAIN オプション\"%s\"ãŒèªè­˜ã§ãã¾ã›ã‚“" -#: commands/explain.c:236 +#: commands/explain.c:282 #, c-format msgid "EXPLAIN option WAL requires ANALYZE" -msgstr "EXPLAINã®ã‚ªãƒ—ションWALã«ã¯ANALYZE指定ãŒå¿…è¦ã§ã™" +msgstr "EXPLAINã®ã‚ªãƒ—ション WAL ã«ã¯ ANALYZE 指定ãŒå¿…è¦ã§ã™" -#: commands/explain.c:245 +#: commands/explain.c:291 #, c-format msgid "EXPLAIN option TIMING requires ANALYZE" -msgstr "EXPLAINオプションã®TIMINGã«ã¯ANALYZE指定ãŒå¿…è¦ã§ã™" +msgstr "EXPLAINã®ã‚ªãƒ—ション TIMING ã«ã¯ ANALYZE 指定ãŒå¿…è¦ã§ã™" + +#: commands/explain.c:297 +#, c-format +msgid "EXPLAIN option SERIALIZE requires ANALYZE" +msgstr "EXPLAINã®ã‚ªãƒ—ション SERIALIZE ã«ã¯ ANALYZE 指定ãŒå¿…è¦ã§ã™" -#: commands/explain.c:251 +#: commands/explain.c:303 #, c-format msgid "EXPLAIN options ANALYZE and GENERIC_PLAN cannot be used together" msgstr "EXPLAINã®ã‚ªãƒ—ションANALYZEã¨GENERIC_PLANã¯åŒæ™‚ã«ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/extension.c:177 commands/extension.c:3009 +#: commands/extension.c:178 commands/extension.c:3031 #, c-format msgid "extension \"%s\" does not exist" msgstr "機能拡張\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/extension.c:276 commands/extension.c:285 commands/extension.c:297 commands/extension.c:307 +#: commands/extension.c:277 commands/extension.c:286 commands/extension.c:298 commands/extension.c:308 #, c-format msgid "invalid extension name: \"%s\"" msgstr "機能拡張åãŒä¸æ­£ã§ã™: \"%s\"" -#: commands/extension.c:277 +#: commands/extension.c:278 #, c-format msgid "Extension names must not be empty." msgstr "機能拡張åãŒç„¡åйã§ã™: 空ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/extension.c:286 +#: commands/extension.c:287 #, c-format msgid "Extension names must not contain \"--\"." msgstr "機能拡張åã«\"--\"ãŒå«ã¾ã‚Œã¦ã„ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/extension.c:298 +#: commands/extension.c:299 #, c-format msgid "Extension names must not begin or end with \"-\"." msgstr "機能拡張åãŒ\"-\"ã§å§‹ã¾ã£ãŸã‚Šçµ‚ã‚ã£ãŸã‚Šã—ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/extension.c:308 +#: commands/extension.c:309 #, c-format msgid "Extension names must not contain directory separator characters." msgstr "機能拡張åã«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åŒºåˆ‡ã‚Šæ–‡å­—ãŒå«ã¾ã‚Œã¦ã„ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/extension.c:323 commands/extension.c:332 commands/extension.c:341 commands/extension.c:351 +#: commands/extension.c:324 commands/extension.c:333 commands/extension.c:342 commands/extension.c:352 #, c-format msgid "invalid extension version name: \"%s\"" msgstr "機能拡張ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³åãŒä¸æ­£ã™: \"%s\"" -#: commands/extension.c:324 +#: commands/extension.c:325 #, c-format msgid "Version names must not be empty." msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³åãŒç„¡åйã§ã™: 空ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/extension.c:333 +#: commands/extension.c:334 #, c-format msgid "Version names must not contain \"--\"." msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³åã«\"--\"ãŒå«ã¾ã‚Œã¦ã„ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/extension.c:342 +#: commands/extension.c:343 #, c-format msgid "Version names must not begin or end with \"-\"." msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³åãŒ\"-\"ã§å§‹ã¾ã£ãŸã‚Šçµ‚ã‚ã£ãŸã‚Šã—ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/extension.c:352 +#: commands/extension.c:353 #, c-format msgid "Version names must not contain directory separator characters." msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³åã«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åŒºåˆ‡ã‚Šæ–‡å­—ãŒå«ã¾ã‚Œã¦ã„ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/extension.c:506 +#: commands/extension.c:507 #, c-format msgid "extension \"%s\" is not available" msgstr "機能拡張\"%s\" ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“" -#: commands/extension.c:507 +#: commands/extension.c:508 #, c-format msgid "Could not open extension control file \"%s\": %m." msgstr "機能拡張ã®åˆ¶å¾¡ãƒ•ァイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: commands/extension.c:509 +#: commands/extension.c:510 #, c-format msgid "The extension must first be installed on the system where PostgreSQL is running." msgstr "PostgreSQLãŒç¨¼åƒã—ã¦ã„るシステムã§ã€äº‹å‰ã«æ©Ÿèƒ½æ‹¡å¼µãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/extension.c:513 +#: commands/extension.c:514 #, c-format msgid "could not open extension control file \"%s\": %m" msgstr "機能拡張ã®åˆ¶å¾¡ãƒ•ァイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: commands/extension.c:536 commands/extension.c:546 +#: commands/extension.c:537 commands/extension.c:547 #, c-format msgid "parameter \"%s\" cannot be set in a secondary extension control file" msgstr "ã‚»ã‚«ãƒ³ãƒ€ãƒªã®æ©Ÿèƒ½æ‹¡å¼µåˆ¶å¾¡ãƒ•ァイルã«ãƒ‘ラメータ\"%s\"を設定ã§ãã¾ã›ã‚“" -#: commands/extension.c:568 commands/extension.c:576 commands/extension.c:584 utils/misc/guc.c:3098 +#: commands/extension.c:569 commands/extension.c:577 commands/extension.c:585 utils/misc/guc.c:3147 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "パラメータ\"%s\"ã«ã¯booleanを指定ã—ã¾ã™" -#: commands/extension.c:593 +#: commands/extension.c:594 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\"ã¯æœ‰åйãªç¬¦å·åŒ–æ–¹å¼åã§ã¯ã‚りã¾ã›ã‚“" -#: commands/extension.c:607 commands/extension.c:622 +#: commands/extension.c:608 commands/extension.c:623 #, c-format msgid "parameter \"%s\" must be a list of extension names" msgstr "パラメータ\"%s\"ã¯æ©Ÿèƒ½æ‹¡å¼µåã®ãƒªã‚¹ãƒˆã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/extension.c:629 +#: commands/extension.c:630 #, c-format msgid "unrecognized parameter \"%s\" in file \"%s\"" msgstr "ファイル\"%2$s\"中ã«èªè­˜ã§ããªã„パラメータ\"%1$s\"ãŒã‚りã¾ã™" -#: commands/extension.c:638 +#: commands/extension.c:639 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "\"relocatable\"ãŒçœŸã®å ´åˆã¯ãƒ‘ラメータ\"schema\"ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/extension.c:816 +#: commands/extension.c:817 #, c-format msgid "transaction control statements are not allowed within an extension script" msgstr "トランザクション制御ステートメントを機能拡張スクリプトã®ä¸­ã«æ›¸ãã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/extension.c:896 +#: commands/extension.c:897 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "機能拡張\"%s\"を作æˆã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/extension.c:899 +#: commands/extension.c:900 #, c-format msgid "Must have CREATE privilege on current database to create this extension." msgstr "ã“ã®æ©Ÿèƒ½æ‹¡å¼µã‚’生æˆã™ã‚‹ã«ã¯ç¾åœ¨ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®CREATE権é™ãŒå¿…è¦ã§ã™ã€‚" -#: commands/extension.c:900 +#: commands/extension.c:901 #, c-format msgid "Must be superuser to create this extension." msgstr "ã“ã®æ©Ÿèƒ½æ‹¡å¼µã‚’生æˆã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/extension.c:904 +#: commands/extension.c:905 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "機能拡張\"%s\"ã‚’æ›´æ–°ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/extension.c:907 +#: commands/extension.c:908 #, c-format msgid "Must have CREATE privilege on current database to update this extension." msgstr "ã“ã®æ©Ÿèƒ½æ‹¡å¼µã‚’æ›´æ–°ã™ã‚‹ã«ã¯ç¾åœ¨ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®CREATE権é™ãŒå¿…è¦ã§ã™ã€‚" -#: commands/extension.c:908 +#: commands/extension.c:909 #, c-format msgid "Must be superuser to update this extension." msgstr "ã“ã®æ©Ÿèƒ½æ‹¡å¼µã‚’æ›´æ–°ã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/extension.c:1265 +#: commands/extension.c:1042 +#, c-format +msgid "invalid character in extension owner: must not contain any of \"%s\"" +msgstr "æ©Ÿèƒ½æ‹¡å¼µã®æ‰€æœ‰è€…åã«ä¸æ­£ãªæ–‡å­—: \"%s\"ã®ã„ãšã‚Œã®æ–‡å­—ã‚‚å«ã‚€ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: commands/extension.c:1066 commands/extension.c:1093 +#, c-format +msgid "invalid character in extension \"%s\" schema: must not contain any of \"%s\"" +msgstr "機能拡張\"%s\"ã®ã‚¹ã‚­ãƒ¼ãƒžåã«ä¸æ­£ãªæ–‡å­—: \"%s\"ã®ã„ãšã‚Œã®æ–‡å­—ã‚‚å«ã‚€ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: commands/extension.c:1288 #, c-format msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgstr "機能拡張\"%s\"ã«ã¤ã„ã¦ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³\"%s\"ã‹ã‚‰ãƒãƒ¼ã‚¸ãƒ§ãƒ³\"%s\"ã¸ã®ã‚¢ãƒƒãƒ—デートパスãŒã‚りã¾ã›ã‚“" -#: commands/extension.c:1473 commands/extension.c:3067 +#: commands/extension.c:1496 commands/extension.c:3089 #, c-format msgid "version to install must be specified" msgstr "インストールã™ã‚‹ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’指定ã—ã¦ãã ã•ã„" -#: commands/extension.c:1510 +#: commands/extension.c:1533 #, c-format msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" msgstr "機能拡張\"%s\"ã«ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³\"%s\"ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚¹ã‚¯ãƒªãƒ—トもアップデートパスもã‚りã¾ã›ã‚“" -#: commands/extension.c:1544 +#: commands/extension.c:1567 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "機能拡張\"%s\"ã¯ã‚¹ã‚­ãƒ¼ãƒž\"%s\"内ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/extension.c:1704 +#: commands/extension.c:1727 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "機能拡張\"%s\"ã¨\"%s\"ã®é–“ã«å¾ªç’°ä¾å­˜é–¢ä¿‚ãŒæ¤œå‡ºã•れã¾ã—ãŸ" -#: commands/extension.c:1709 +#: commands/extension.c:1732 #, c-format msgid "installing required extension \"%s\"" msgstr "å¿…è¦ãªæ©Ÿèƒ½æ‹¡å¼µã‚’インストールã—ã¾ã™:\"%s\"" -#: commands/extension.c:1732 +#: commands/extension.c:1755 #, c-format msgid "required extension \"%s\" is not installed" msgstr "è¦æ±‚ã•ã‚ŒãŸæ©Ÿèƒ½æ‹¡å¼µ\"%s\"ã¯ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã›ã‚“" -#: commands/extension.c:1735 +#: commands/extension.c:1758 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "å¿…è¦ãªæ©Ÿèƒ½æ‹¡å¼µã‚’一緒ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹ã«ã¯ CREATE EXTENSION ... CASCADE を使ã£ã¦ãã ã•ã„。" -#: commands/extension.c:1770 +#: commands/extension.c:1793 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "機能拡張\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/extension.c:1777 +#: commands/extension.c:1800 #, c-format msgid "extension \"%s\" already exists" msgstr "機能拡張\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/extension.c:1788 +#: commands/extension.c:1811 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "入れå­ã® CREATE EXTENSION ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: commands/extension.c:1952 +#: commands/extension.c:1975 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "変更ã•れã¦ã„ã‚‹ãŸã‚æ‹¡å¼µ\"%s\"を削除ã§ãã¾ã›ã‚“" -#: commands/extension.c:2427 +#: commands/extension.c:2450 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "%s ã¯CREATE EXTENSIONã«ã‚ˆã‚Šå®Ÿè¡Œã•れるSQLスクリプトã‹ã‚‰ã®ã¿å‘¼ã³å‡ºã™ã“ã¨ãŒã§ãã¾ã™" -#: commands/extension.c:2439 +#: commands/extension.c:2462 #, c-format msgid "OID %u does not refer to a table" msgstr "OID %u ãŒãƒ†ãƒ¼ãƒ–ルをå‚ç…§ã—ã¦ã„ã¾ã›ã‚“" -#: commands/extension.c:2444 +#: commands/extension.c:2467 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "テーブル\"%s\"ã¯ç”Ÿæˆã•れよã†ã¨ã—ã¦ã„る機能拡張ã®ãƒ¡ãƒ³ãƒã§ã¯ã‚りã¾ã›ã‚“" -#: commands/extension.c:2790 +#: commands/extension.c:2813 #, c-format msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" msgstr "機能拡張ãŒãã®ã‚¹ã‚­ãƒ¼ãƒžã‚’å«ã‚“ã§ã„ã‚‹ãŸã‚ã€æ©Ÿèƒ½æ‹¡å¼µ\"%s\"をスキーマ\"%s\"ã«ç§»å‹•ã§ãã¾ã›ã‚“" -#: commands/extension.c:2831 commands/extension.c:2928 +#: commands/extension.c:2854 commands/extension.c:2948 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "機能拡張\"%s\"㯠SET SCHEMA をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: commands/extension.c:2885 +#: commands/extension.c:2911 #, c-format msgid "cannot SET SCHEMA of extension \"%s\" because other extensions prevent it" msgstr "ä»–ã®æ©Ÿèƒ½æ‹¡å¼µã«ã‚ˆã£ã¦ç¦æ­¢ã•れã¦ã„ã‚‹ãŸã‚ã€æ©Ÿèƒ½æ‹¡å¼µ\"%s\"ã® SET SCHEMAãŒå®Ÿè¡Œã§ãã¾ã›ã‚“" -#: commands/extension.c:2887 +#: commands/extension.c:2913 #, c-format msgid "Extension \"%s\" requests no relocation of extension \"%s\"." msgstr "機能拡張\"%s\"ã¯æ©Ÿèƒ½æ‹¡å¼µ\"%s\"ã®å†é…ç½®ç¦æ­¢ã‚’è¦æ±‚ã—ã¦ã„ã¾ã™ã€‚" -#: commands/extension.c:2930 +#: commands/extension.c:2950 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "機能拡張ã®ã‚¹ã‚­ãƒ¼ãƒž\"%2$s\"ã«%1$sãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: commands/extension.c:2989 +#: commands/extension.c:3011 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "入れå­ã«ãªã£ãŸ ALTER EXTENSION ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/extension.c:3078 +#: commands/extension.c:3100 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "機能拡張 \"%2$s\"ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³\"%1$s\"ã¯ã™ã§ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã™" -#: commands/extension.c:3290 +#: commands/extension.c:3311 #, c-format msgid "cannot add an object of this type to an extension" msgstr "ã“ã®åž‹ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã¯æ©Ÿèƒ½æ‹¡å¼µã«è¿½åŠ ã§ãã¾ã›ã‚“" -#: commands/extension.c:3356 +#: commands/extension.c:3409 #, c-format msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "スキーマ\"%s\"ã‚’æ‹¡å¼µ\"%s\"ã«è¿½åŠ ã§ãã¾ã›ã‚“。ãã®ã‚¹ã‚­ãƒ¼ãƒžã«ãã®æ‹¡å¼µãŒå«ã¾ã‚Œã¦ã„ã‚‹ãŸã‚ã§ã™" -#: commands/extension.c:3450 +#: commands/extension.c:3491 commands/typecmds.c:4042 utils/fmgr/funcapi.c:725 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "データ型%sã®è¤‡ç¯„囲型ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" + +#: commands/extension.c:3532 #, c-format msgid "file \"%s\" is too large" msgstr "ファイル\"%s\"ã¯å¤§ãã™ãŽã¾ã™" @@ -7775,7 +8155,7 @@ msgstr "å¤–éƒ¨ãƒ‡ãƒ¼ã‚¿ãƒ©ãƒƒãƒ‘ãƒ¼ã®æ‰€æœ‰è€…を変更ã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ー msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "å¤–éƒ¨ãƒ‡ãƒ¼ã‚¿ãƒ©ãƒƒãƒ‘ãƒ¼ã®æ‰€æœ‰è€…ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:678 +#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:691 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "外部データラッパー\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" @@ -7845,7 +8225,7 @@ msgstr "\"%s\"ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒžãƒƒãƒ”ングã¯ã‚µãƒ¼ãƒãƒ¼\"%s\"ã«å¯¾ã—ã¦ã¯ msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "\"%s\"ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒžãƒƒãƒ”ングã¯ã‚µãƒ¼ãƒãƒ¼\"%s\"ã«å¯¾ã—ã¦ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/foreigncmds.c:1507 foreign/foreign.c:391 +#: commands/foreigncmds.c:1507 foreign/foreign.c:404 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "外部データラッパー\"%s\"ã«ã¯ãƒãƒ³ãƒ‰ãƒ©ãŒã‚りã¾ã›ã‚“" @@ -7860,518 +8240,523 @@ msgstr "外部データラッパー\"%s\"㯠IMPORT FOREIGN SCHEMA をサãƒãƒ¼ msgid "importing foreign table \"%s\"" msgstr "外部テーブル\"%s\"をインãƒãƒ¼ãƒˆã—ã¾ã™" -#: commands/functioncmds.c:109 +#: commands/functioncmds.c:104 #, c-format msgid "SQL function cannot return shell type %s" msgstr "SQL関数ã¯ã‚·ã‚§ãƒ«åž‹%sã‚’è¿”å´ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/functioncmds.c:114 +#: commands/functioncmds.c:109 #, c-format msgid "return type %s is only a shell" msgstr "戻り値型%sã¯å˜ãªã‚‹ã‚·ã‚§ãƒ«åž‹ã§ã™" -#: commands/functioncmds.c:143 parser/parse_type.c:354 +#: commands/functioncmds.c:138 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "シェル型\"%s\"ã«åž‹ä¿®æ­£å­ã‚’指定ã§ãã¾ã›ã‚“" -#: commands/functioncmds.c:149 +#: commands/functioncmds.c:144 #, c-format msgid "type \"%s\" is not yet defined" msgstr "åž‹\"%s\"ã¯æœªå®šç¾©ã§ã™" -#: commands/functioncmds.c:150 +#: commands/functioncmds.c:145 #, c-format msgid "Creating a shell type definition." msgstr "シェル型ã®å®šç¾©ã‚’作æˆã—ã¾ã™" -#: commands/functioncmds.c:249 +#: commands/functioncmds.c:244 #, c-format msgid "SQL function cannot accept shell type %s" msgstr "SQL関数ã¯ã‚·ã‚§ãƒ«åž‹\"%s\"ã‚’å—ã‘付ã‘られã¾ã›ã‚“" -#: commands/functioncmds.c:255 +#: commands/functioncmds.c:250 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "集約ã¯ã‚·ã‚§ãƒ«åž‹\"%s\"ã‚’å—ã‘付ã‘られã¾ã›ã‚“" -#: commands/functioncmds.c:260 +#: commands/functioncmds.c:255 #, c-format msgid "argument type %s is only a shell" msgstr "引数型%sã¯å˜ãªã‚‹ã‚·ã‚§ãƒ«ã§ã™" -#: commands/functioncmds.c:270 +#: commands/functioncmds.c:265 #, c-format msgid "type %s does not exist" msgstr "åž‹%sã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/functioncmds.c:284 +#: commands/functioncmds.c:279 #, c-format msgid "aggregates cannot accept set arguments" msgstr "集約ã¯é›†åˆå¼•æ•°ã‚’å—ã‘付ã‘られã¾ã›ã‚“" -#: commands/functioncmds.c:288 +#: commands/functioncmds.c:283 #, c-format msgid "procedures cannot accept set arguments" msgstr "プロシージャã¯é›†åˆå¼•æ•°ã‚’å—ã‘付ã‘ã¾ã›ã‚“" -#: commands/functioncmds.c:292 +#: commands/functioncmds.c:287 #, c-format msgid "functions cannot accept set arguments" msgstr "関数ã¯é›†åˆã‚’引数ã¨ã—ã¦å—ã‘付ã‘られã¾ã›ã‚“" -#: commands/functioncmds.c:302 +#: commands/functioncmds.c:297 #, c-format msgid "VARIADIC parameter must be the last input parameter" msgstr "VARIADIC ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã¯æœ€å¾Œã®å…¥åŠ›ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:322 +#: commands/functioncmds.c:317 #, c-format msgid "VARIADIC parameter must be the last parameter" msgstr "VARIADIC ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã¯æœ€å¾Œã®ãƒ‘ラメータã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:347 +#: commands/functioncmds.c:342 #, c-format msgid "VARIADIC parameter must be an array" msgstr "VARIADIC パラメータã¯é…列ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:392 +#: commands/functioncmds.c:387 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "パラメータ\"%s\"ãŒè¤‡æ•°æŒ‡å®šã•れã¾ã—ãŸ" -#: commands/functioncmds.c:410 +#: commands/functioncmds.c:405 #, c-format msgid "only input parameters can have default values" msgstr "入力パラメータã®ã¿ãŒãƒ‡ãƒ•ォルト値をæŒã¦ã¾ã™" -#: commands/functioncmds.c:425 +#: commands/functioncmds.c:420 #, c-format msgid "cannot use table references in parameter default value" msgstr "パラメータã®ãƒ‡ãƒ•ォルト値ã¨ã—ã¦ãƒ†ãƒ¼ãƒ–ルå‚照を使用ã§ãã¾ã›ã‚“" -#: commands/functioncmds.c:449 +#: commands/functioncmds.c:444 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "デフォルト値をæŒã¤ãƒ‘ラメータã®å¾Œã«ã‚る入力パラメータã¯ã€å¿…ãšãƒ‡ãƒ•ォルト値をæŒãŸãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:459 +#: commands/functioncmds.c:454 #, c-format msgid "procedure OUT parameters cannot appear after one with a default value" msgstr "プロシージャã®å‡ºåŠ›ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã¯ãƒ‡ãƒ•ォルト値をæŒã¤ãƒ‘ラメータã®å¾Œã«ã¯ç½®ã‘ã¾ã›ã‚“" -#: commands/functioncmds.c:601 commands/functioncmds.c:780 +#: commands/functioncmds.c:596 commands/functioncmds.c:775 #, c-format msgid "invalid attribute in procedure definition" msgstr "プロシージャ定義内ã®ä¸æ­£ãªå±žæ€§" -#: commands/functioncmds.c:697 +#: commands/functioncmds.c:692 #, c-format msgid "support function %s must return type %s" msgstr "サãƒãƒ¼ãƒˆé–¢æ•°%sã¯%s型を返ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:708 +#: commands/functioncmds.c:703 #, c-format msgid "must be superuser to specify a support function" msgstr "サãƒãƒ¼ãƒˆé–¢æ•°ã‚’指定ã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/functioncmds.c:829 commands/functioncmds.c:1432 +#: commands/functioncmds.c:824 commands/functioncmds.c:1427 #, c-format msgid "COST must be positive" msgstr "COSTã¯æ­£æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:837 commands/functioncmds.c:1440 +#: commands/functioncmds.c:832 commands/functioncmds.c:1435 #, c-format msgid "ROWS must be positive" msgstr "ROWSã¯æ­£æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:866 +#: commands/functioncmds.c:861 #, c-format msgid "no function body specified" msgstr "é–¢æ•°æœ¬ä½“ã®æŒ‡å®šãŒã‚りã¾ã›ã‚“" -#: commands/functioncmds.c:871 +#: commands/functioncmds.c:866 #, c-format msgid "duplicate function body specified" msgstr "é–¢æ•°æœ¬ä½“ã®æŒ‡å®šãŒé‡è¤‡ã—ã¦ã„ã¾ã™" -#: commands/functioncmds.c:876 +#: commands/functioncmds.c:871 #, c-format msgid "inline SQL function body only valid for language SQL" msgstr "インラインã®SQL関数本体ã¯è¨€èªžæŒ‡å®šãŒSQLã®å ´åˆã«ã®ã¿æœ‰åйã§ã™" -#: commands/functioncmds.c:918 +#: commands/functioncmds.c:913 #, c-format msgid "SQL function with unquoted function body cannot have polymorphic arguments" msgstr "本体をクォートã›ãšã«å®šç¾©ã™ã‚‹SQL関数ã¯å¤šæ…‹å¼•ãæ•°ã‚’å–れã¾ã›ã‚“" -#: commands/functioncmds.c:944 commands/functioncmds.c:963 +#: commands/functioncmds.c:939 commands/functioncmds.c:958 #, c-format msgid "%s is not yet supported in unquoted SQL function body" msgstr "%sã¯ã‚¯ã‚©ãƒ¼ãƒˆã—ãªã„関数本体ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: commands/functioncmds.c:991 +#: commands/functioncmds.c:986 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "言語\"%s\"ã§ã¯ASé …ç›®ã¯1ã¤ã ã‘å¿…è¦ã§ã™" -#: commands/functioncmds.c:1096 +#: commands/functioncmds.c:1091 #, c-format msgid "no language specified" msgstr "è¨€èªžãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: commands/functioncmds.c:1104 commands/functioncmds.c:2105 commands/proclang.c:237 +#: commands/functioncmds.c:1099 commands/functioncmds.c:2117 commands/proclang.c:235 #, c-format msgid "language \"%s\" does not exist" msgstr "言語\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/functioncmds.c:1106 commands/functioncmds.c:2107 +#: commands/functioncmds.c:1101 commands/functioncmds.c:2119 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "言語をデータベースã«èª­ã¿è¾¼ã‚€ãŸã‚ã«ã¯ CREATE EXTENSION を使用ã—ã¦ãã ã•ã„" -#: commands/functioncmds.c:1139 commands/functioncmds.c:1424 +#: commands/functioncmds.c:1134 commands/functioncmds.c:1419 #, c-format msgid "only superuser can define a leakproof function" msgstr "スーパーユーザーã®ã¿ãŒãƒªãƒ¼ã‚¯ãƒ—ルーフ関数を定義ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™" -#: commands/functioncmds.c:1190 +#: commands/functioncmds.c:1185 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "OUTパラメータã§å®šç¾©ã•れã¦ã„ã‚‹ãŸã‚ã€é–¢æ•°ã®æˆ»ã‚Šå€¤åž‹ã¯%sã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:1203 +#: commands/functioncmds.c:1198 #, c-format msgid "function result type must be specified" msgstr "関数ã®çµæžœåž‹ã‚’指定ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:1256 commands/functioncmds.c:1444 +#: commands/functioncmds.c:1251 commands/functioncmds.c:1439 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "関数ãŒé›†åˆã‚’è¿”ã™å ´åˆã«ROWSã¯é©ã—ã¦ã„ã¾ã›ã‚“" -#: commands/functioncmds.c:1547 +#: commands/functioncmds.c:1546 #, c-format msgid "source data type %s is a pseudo-type" msgstr "変æ›å…ƒãƒ‡ãƒ¼ã‚¿åž‹%sã¯ç–‘似型ã§ã™" -#: commands/functioncmds.c:1553 +#: commands/functioncmds.c:1552 #, c-format msgid "target data type %s is a pseudo-type" msgstr "変æ›å…ˆãƒ‡ãƒ¼ã‚¿åž‹%sã¯ç–‘似型ã§ã™" -#: commands/functioncmds.c:1577 +#: commands/functioncmds.c:1576 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "å…ƒã®ãƒ‡ãƒ¼ã‚¿åž‹ãŒãƒ‰ãƒ¡ã‚¤ãƒ³ã§ã‚ã‚‹ãŸã‚ã€ã‚­ãƒ£ã‚¹ãƒˆã¯ç„¡è¦–ã•れã¾ã™" -#: commands/functioncmds.c:1582 +#: commands/functioncmds.c:1581 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "対象ã®ãƒ‡ãƒ¼ã‚¿åž‹ãŒãƒ‰ãƒ¡ã‚¤ãƒ³ã§ã‚ã‚‹ãŸã‚ã€ã‚­ãƒ£ã‚¹ãƒˆã¯ç„¡è¦–ã•れã¾ã™" -#: commands/functioncmds.c:1607 +#: commands/functioncmds.c:1606 #, c-format msgid "cast function must take one to three arguments" msgstr "キャスト関数ã®å¼•æ•°ã¯1ã¤ã‹ã‚‰3ã¤ã¾ã§ã§ã™" -#: commands/functioncmds.c:1613 +#: commands/functioncmds.c:1612 #, c-format msgid "argument of cast function must match or be binary-coercible from source data type" msgstr "キャスト関数ã®å¼•æ•°ã¯å¤‰æ›å…ƒãƒ‡ãƒ¼ã‚¿åž‹ã¨åŒä¸€ã§ã‚ã‚‹ã‹ã€å¤‰æ›å…ƒãƒ‡ãƒ¼ã‚¿åž‹ã‹ã‚‰ãƒã‚¤ãƒŠãƒªå¤‰æ›å¯èƒ½ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/functioncmds.c:1617 +#: commands/functioncmds.c:1616 #, c-format msgid "second argument of cast function must be type %s" msgstr "キャスト関数ã®ç¬¬2引数ã¯%såž‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:1622 +#: commands/functioncmds.c:1621 #, c-format msgid "third argument of cast function must be type %s" msgstr "キャスト関数ã®ç¬¬3引数ã¯%såž‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:1629 +#: commands/functioncmds.c:1628 #, c-format msgid "return data type of cast function must match or be binary-coercible to target data type" msgstr "ã‚­ãƒ£ã‚¹ãƒˆé–¢æ•°ã®æˆ»ã‚Šå€¤ãƒ‡ãƒ¼ã‚¿åž‹ã¯å¤‰æ›å…ˆãƒ‡ãƒ¼ã‚¿åž‹ã¨ä¸€è‡´ã™ã‚‹ã‹ã€å¤‰æ›å…ˆãƒ‡ãƒ¼ã‚¿åž‹ã¸ãƒã‚¤ãƒŠãƒªå¤‰æ›å¯èƒ½ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/functioncmds.c:1640 +#: commands/functioncmds.c:1639 #, c-format msgid "cast function must not be volatile" msgstr "キャスト関数ã¯volatileã§ã¯ã„ã‘ã¾ã›ã‚“" -#: commands/functioncmds.c:1645 +#: commands/functioncmds.c:1644 #, c-format msgid "cast function must be a normal function" msgstr "キャスト関数ã¯é€šå¸¸ã®é–¢æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:1649 +#: commands/functioncmds.c:1648 #, c-format msgid "cast function must not return a set" msgstr "キャスト関数ã¯é›†åˆã‚’è¿”ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“" -#: commands/functioncmds.c:1675 +#: commands/functioncmds.c:1674 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "WITHOUT FUNCTION指定ã®ã‚­ãƒ£ã‚¹ãƒˆã‚’作æˆã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/functioncmds.c:1690 +#: commands/functioncmds.c:1689 #, c-format msgid "source and target data types are not physically compatible" msgstr "変æ›å…ƒã¨å¤‰æ›å…ˆã®ãƒ‡ãƒ¼ã‚¿åž‹ã®é–“ã«ã¯ç‰©ç†çš„ãªäº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: commands/functioncmds.c:1705 +#: commands/functioncmds.c:1709 #, c-format msgid "composite data types are not binary-compatible" -msgstr "複åˆãƒ‡ãƒ¼ã‚¿åž‹ã¯ãƒã‚¤ãƒŠãƒªäº’æ›ã§ã¯ã‚りã¾ã›ã‚“" +msgstr "複åˆãƒ‡ãƒ¼ã‚¿åž‹ãŒãƒã‚¤ãƒŠãƒªäº’æ›ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/functioncmds.c:1711 +#: commands/functioncmds.c:1715 #, c-format -msgid "enum data types are not binary-compatible" -msgstr "列挙データ型ã¯ãƒã‚¤ãƒŠãƒªäº’æ›ã§ã¯ã‚りã¾ã›ã‚“" +msgid "array data types are not binary-compatible" +msgstr "é…列データ型ãŒãƒã‚¤ãƒŠãƒªäº’æ›ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/functioncmds.c:1717 +#: commands/functioncmds.c:1723 #, c-format -msgid "array data types are not binary-compatible" -msgstr "é…列データ型ã¯ãƒã‚¤ãƒŠãƒªäº’æ›ã§ã¯ã‚りã¾ã›ã‚“" +msgid "range data types are not binary-compatible" +msgstr "範囲データ型ãŒãƒã‚¤ãƒŠãƒªäº’æ›ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/functioncmds.c:1734 +#: commands/functioncmds.c:1729 +#, c-format +msgid "enum data types are not binary-compatible" +msgstr "列挙データ型ãŒãƒã‚¤ãƒŠãƒªäº’æ›ã§ã¯ã‚りã¾ã›ã‚“" + +#: commands/functioncmds.c:1746 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "ドメインデータ型ã¯ãƒã‚¤ãƒŠãƒªäº’æ›ã¨ã—ã¦ãƒžãƒ¼ã‚¯ã•れã¦ã„ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:1744 +#: commands/functioncmds.c:1756 #, c-format msgid "source data type and target data type are the same" msgstr "変æ›å…ƒã¨å¤‰æ›å…ˆã®ãƒ‡ãƒ¼ã‚¿åž‹ãŒåŒä¸€ã§ã™" -#: commands/functioncmds.c:1777 +#: commands/functioncmds.c:1789 #, c-format msgid "transform function must not be volatile" msgstr "変æ›é–¢æ•°ã¯volatileã§ã¯ã„ã‘ã¾ã›ã‚“" -#: commands/functioncmds.c:1781 +#: commands/functioncmds.c:1793 #, c-format msgid "transform function must be a normal function" msgstr "変æ›é–¢æ•°ã¯é€šå¸¸ã®é–¢æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:1785 +#: commands/functioncmds.c:1797 #, c-format msgid "transform function must not return a set" msgstr "変æ›é–¢æ•°ã¯é›†åˆã‚’è¿”ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“" -#: commands/functioncmds.c:1789 +#: commands/functioncmds.c:1801 #, c-format msgid "transform function must take one argument" msgstr "変æ›é–¢æ•°ã¯å¼•æ•°ã‚’1ã¤ã¨ã‚‰ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:1793 +#: commands/functioncmds.c:1805 #, c-format msgid "first argument of transform function must be type %s" msgstr "変æ›é–¢æ•°ã®ç¬¬1引数ã¯%såž‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:1832 +#: commands/functioncmds.c:1844 #, c-format msgid "data type %s is a pseudo-type" msgstr "データ型%sã¯æ“¬ä¼¼åž‹ã§ã™" -#: commands/functioncmds.c:1838 +#: commands/functioncmds.c:1850 #, c-format msgid "data type %s is a domain" msgstr "データ型%sã¯ãƒ‰ãƒ¡ã‚¤ãƒ³ã§ã™" -#: commands/functioncmds.c:1878 +#: commands/functioncmds.c:1890 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "FROM SQLé–¢æ•°ã®æˆ»ã‚Šå€¤ã®ãƒ‡ãƒ¼ã‚¿åž‹ã¯%sã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:1904 +#: commands/functioncmds.c:1916 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "TO SQLé–¢æ•°ã®æˆ»ã‚Šå€¤ãƒ‡ãƒ¼ã‚¿åž‹ã¯ã“ã®å¤‰æ›é–¢æ•°ã®ãƒ‡ãƒ¼ã‚¿åž‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/functioncmds.c:1931 +#: commands/functioncmds.c:1943 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "åž‹%sã€è¨€èªž\"%s\"ã®å¤‰æ›ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/functioncmds.c:2017 +#: commands/functioncmds.c:2029 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "åž‹%sã€è¨€èªž\"%s\"ã®å¤‰æ›ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/functioncmds.c:2041 +#: commands/functioncmds.c:2053 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "関数%sã¯ã™ã§ã«ã‚¹ã‚­ãƒ¼ãƒž\"%s\"内ã«å­˜åœ¨ã—ã¾ã™" -#: commands/functioncmds.c:2092 +#: commands/functioncmds.c:2104 #, c-format msgid "no inline code specified" msgstr "ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³ã‚³ãƒ¼ãƒ‰ã®æŒ‡å®šãŒã‚りã¾ã›ã‚“" -#: commands/functioncmds.c:2138 +#: commands/functioncmds.c:2150 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "言語\"%s\"ã§ã¯ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³ã‚³ãƒ¼ãƒ‰å®Ÿè¡Œã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: commands/functioncmds.c:2233 +#: commands/functioncmds.c:2245 #, c-format msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" msgstr[0] "プロシージャã«ã¯ %d 個以上ã®å¼•数を渡ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/indexcmds.c:641 +#: commands/indexcmds.c:656 #, c-format msgid "must specify at least one column" msgstr "å°‘ãªãã¨ã‚‚1ã¤ã®åˆ—を指定ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/indexcmds.c:645 +#: commands/indexcmds.c:660 #, c-format msgid "cannot use more than %d columns in an index" msgstr "インデックスã«ã¯%dã‚’è¶…ãˆã‚‹åˆ—を使用ã§ãã¾ã›ã‚“" -#: commands/indexcmds.c:688 +#: commands/indexcmds.c:703 #, c-format msgid "cannot create index on relation \"%s\"" msgstr "リレーション\"%s\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’作æˆã§ãã¾ã›ã‚“" -#: commands/indexcmds.c:714 +#: commands/indexcmds.c:729 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "パーティション親テーブル\"%s\"ã«ã¯ CREATE INDEX CONCURRENTLY ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: commands/indexcmds.c:719 -#, c-format -msgid "cannot create exclusion constraints on partitioned table \"%s\"" -msgstr "パーティション親テーブル\"%s\"ã«ã¯æŽ’他制約を作æˆã§ãã¾ã›ã‚“" - -#: commands/indexcmds.c:729 +#: commands/indexcmds.c:739 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚テーブルã«å¯¾ã™ã‚‹ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’作æˆã§ãã¾ã›ã‚“" -#: commands/indexcmds.c:767 commands/tablecmds.c:784 commands/tablespace.c:1184 +#: commands/indexcmds.c:777 commands/tablecmds.c:818 commands/tablespace.c:1178 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "パーティション親リレーションã«ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆãƒ†ãƒ¼ãƒ–ãƒ«ç©ºé–“ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/indexcmds.c:799 commands/tablecmds.c:819 commands/tablecmds.c:3409 +#: commands/indexcmds.c:809 commands/tablecmds.c:849 commands/tablecmds.c:3588 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "共有リレーションã®ã¿ã‚’pg_globalãƒ†ãƒ¼ãƒ–ãƒ«ç©ºé–“ã«æ ¼ç´ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™" -#: commands/indexcmds.c:832 +#: commands/indexcmds.c:842 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "å¤ã„メソッド\"rtree\"をアクセスメソッド\"gist\"ã«ç½®æ›ã—ã¦ã„ã¾ã™" -#: commands/indexcmds.c:853 +#: commands/indexcmds.c:863 #, c-format msgid "access method \"%s\" does not support unique indexes" -msgstr "アクセスメソッド\"%s\"ã§ã¯ä¸€æ„性インデックスをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" +msgstr "アクセスメソッド\"%s\"ã§ã¯ãƒ¦ãƒ‹ãƒ¼ã‚¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: commands/indexcmds.c:858 +#: commands/indexcmds.c:868 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "アクセスメソッド\"%s\"ã§ã¯åŒ…å«åˆ—をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: commands/indexcmds.c:863 +#: commands/indexcmds.c:873 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "アクセスメソッド\"%s\"ã¯è¤‡æ•°åˆ—インデックスをサãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: commands/indexcmds.c:868 +#: commands/indexcmds.c:878 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "アクセスメソッド\"%s\"ã¯æŽ’é™¤åˆ¶ç´„ã‚’ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: commands/indexcmds.c:995 +#: commands/indexcmds.c:1007 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "パーティションキーã¯ã‚¢ã‚¯ã‚»ã‚¹ãƒ¡ã‚½ãƒƒãƒ‰\"%s\"を使ã£ã¦ã„るインデックスã«ã¯é©åˆã•ã›ã‚‰ã‚Œã¾ã›ã‚“" -#: commands/indexcmds.c:1005 +#: commands/indexcmds.c:1017 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "パーティションキー定義ã§ã¯ %s 制約ã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: commands/indexcmds.c:1007 +#: commands/indexcmds.c:1019 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "%s 制約ã¯ãƒ‘ーティションキーãŒå¼ã‚’å«ã‚€å ´åˆã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/indexcmds.c:1046 +#: commands/indexcmds.c:1069 +#, c-format +msgid "cannot match partition key to index on column \"%s\" using non-equal operator \"%s\"" +msgstr "パーティションキーã®ã€åˆ—\"%s\"上ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¸ã®é©åˆã‚’éžç­‰ä¾¡æ¼”ç®—å­\"%s\"を使ã£ã¦è¡Œã†ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: commands/indexcmds.c:1085 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "パーティション親テーブル上ã®ãƒ¦ãƒ‹ãƒ¼ã‚¯åˆ¶ç´„ã¯ã™ã¹ã¦ã®ãƒ‘ーティショニング列をå«ã¾ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/indexcmds.c:1047 +#: commands/indexcmds.c:1086 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "テーブル\"%2$s\"上ã®%1$s制約ã«ãƒ‘ーティションキーã®ä¸€éƒ¨ã§ã‚る列\"%3$s\"ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。" -#: commands/indexcmds.c:1066 commands/indexcmds.c:1085 +#: commands/indexcmds.c:1105 commands/indexcmds.c:1124 #, c-format msgid "index creation on system columns is not supported" msgstr "システム列ã¸ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ä½œæˆã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/indexcmds.c:1314 tcop/utility.c:1525 +#: commands/indexcmds.c:1354 tcop/utility.c:1515 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"ã«ã¯ãƒ¦ãƒ‹ãƒ¼ã‚¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’構築ã§ãã¾ã›ã‚“" -#: commands/indexcmds.c:1316 tcop/utility.c:1527 +#: commands/indexcmds.c:1356 tcop/utility.c:1517 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "テーブル\"%s\"ã¯å¤–部テーブルをå­ãƒ†ãƒ¼ãƒ–ルã¨ã—ã¦å«ã‚“ã§ã„ã¾ã™" -#: commands/indexcmds.c:1811 +#: commands/indexcmds.c:1806 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "インデックスã®è¿°éƒ¨ã®é–¢æ•°ã¯IMMUTABLEマークãŒå¿…è¦ã§ã™" -#: commands/indexcmds.c:1889 parser/parse_utilcmd.c:2513 parser/parse_utilcmd.c:2648 +#: commands/indexcmds.c:1885 parser/parse_utilcmd.c:2519 parser/parse_utilcmd.c:2654 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "キーã¨ã—ã¦æŒ‡åã•れãŸåˆ—\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/indexcmds.c:1913 parser/parse_utilcmd.c:1812 +#: commands/indexcmds.c:1909 parser/parse_utilcmd.c:1807 #, c-format msgid "expressions are not supported in included columns" msgstr "包å«åˆ—ã§ã¯å¼ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: commands/indexcmds.c:1954 +#: commands/indexcmds.c:1950 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "å¼ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®é–¢æ•°ã¯IMMUTABLEマークãŒå¿…è¦ã§ã™" -#: commands/indexcmds.c:1969 +#: commands/indexcmds.c:1965 #, c-format msgid "including column does not support a collation" msgstr "包å«åˆ—ã¯ç…§åˆé †åºã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: commands/indexcmds.c:1973 +#: commands/indexcmds.c:1969 #, c-format msgid "including column does not support an operator class" msgstr "包å«åˆ—ã¯æ¼”ç®—å­ã‚¯ãƒ©ã‚¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: commands/indexcmds.c:1977 +#: commands/indexcmds.c:1973 #, c-format msgid "including column does not support ASC/DESC options" msgstr "包å«åˆ—㯠ASC/DESC オプションをサãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: commands/indexcmds.c:1981 +#: commands/indexcmds.c:1977 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "包å«åˆ—㯠NULLS FIRST/LAST オプションをサãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: commands/indexcmds.c:2022 +#: commands/indexcmds.c:2020 #, c-format msgid "could not determine which collation to use for index expression" msgstr "インデックスå¼ã§ä½¿ç”¨ã™ã‚‹ç…§åˆé †åºã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: commands/indexcmds.c:2030 commands/tablecmds.c:17497 commands/typecmds.c:807 parser/parse_expr.c:2722 parser/parse_type.c:568 parser/parse_utilcmd.c:3774 utils/adt/misc.c:586 +#: commands/indexcmds.c:2028 commands/tablecmds.c:18218 commands/typecmds.c:811 parser/parse_expr.c:2793 parser/parse_type.c:568 parser/parse_utilcmd.c:3771 utils/adt/misc.c:630 #, c-format msgid "collations are not supported by type %s" msgstr "%s åž‹ã§ã¯ç…§åˆé †åºã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" @@ -8406,92 +8791,97 @@ msgstr "アクセスメソッド\"%s\"ã¯ASC/DESCオプションをサãƒãƒ¼ãƒˆ msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "アクセスメソッド\"%s\"ã¯NULLS FIRST/LASTオプションをサãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: commands/indexcmds.c:2212 commands/tablecmds.c:17522 commands/tablecmds.c:17528 commands/typecmds.c:2301 +#: commands/indexcmds.c:2210 commands/tablecmds.c:18243 commands/tablecmds.c:18249 commands/typecmds.c:2311 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"ã«ã¯ãƒ‡ãƒ¼ã‚¿åž‹%1$s用ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ¼”ç®—å­ã‚¯ãƒ©ã‚¹ãŒã‚りã¾ã›ã‚“" -#: commands/indexcmds.c:2214 +#: commands/indexcmds.c:2212 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." msgstr "ã“ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®æ¼”ç®—å­ã‚¯ãƒ©ã‚¹ã‚’指定ã™ã‚‹ã‹ã€ã‚ã‚‹ã„ã¯ã“ã®ãƒ‡ãƒ¼ã‚¿åž‹ã®ãƒ‡ãƒ•ォルト演算å­ã‚¯ãƒ©ã‚¹ã‚’定義ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: commands/indexcmds.c:2243 commands/indexcmds.c:2251 commands/opclasscmds.c:205 +#: commands/indexcmds.c:2241 commands/indexcmds.c:2249 commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"ç”¨ã®æ¼”ç®—å­ã‚¯ãƒ©ã‚¹\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/indexcmds.c:2265 commands/typecmds.c:2289 +#: commands/indexcmds.c:2263 commands/typecmds.c:2299 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "演算å­ã‚¯ãƒ©ã‚¹\"%s\"ã¯ãƒ‡ãƒ¼ã‚¿åž‹%sã‚’å—ã‘付ã‘ã¾ã›ã‚“" -#: commands/indexcmds.c:2355 +#: commands/indexcmds.c:2353 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "データ型%sã«ã¯è¤‡æ•°ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ¼”ç®—å­ã‚¯ãƒ©ã‚¹ãŒã‚りã¾ã™" -#: commands/indexcmds.c:2683 +#: commands/indexcmds.c:2681 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "èªè­˜ã§ããªã„REINDEXã®ã‚ªãƒ—ション \"%s\"" -#: commands/indexcmds.c:2910 +#: commands/indexcmds.c:2913 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "テーブル\"%s\"ã«ã¯ä¸¦è¡Œã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†ä½œæˆãŒå¯èƒ½ãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒã‚りã¾ã›ã‚“" -#: commands/indexcmds.c:2924 +#: commands/indexcmds.c:2927 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "テーブル\"%s\"ã«ã¯å†æ§‹ç¯‰ã™ã¹ãインデックスã¯ã‚りã¾ã›ã‚“" -#: commands/indexcmds.c:2969 commands/indexcmds.c:3484 commands/indexcmds.c:3612 +#: commands/indexcmds.c:2974 commands/indexcmds.c:3485 commands/indexcmds.c:3615 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "システムカタログã§ã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ä¸¦è¡Œå†æ§‹ç¯‰ã¯ã§ãã¾ã›ã‚“" -#: commands/indexcmds.c:2993 +#: commands/indexcmds.c:2998 #, c-format msgid "can only reindex the currently open database" msgstr "ç¾åœ¨ã‚ªãƒ¼ãƒ—ンã—ã¦ã„るデータベースã®ã¿ã‚’ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™" -#: commands/indexcmds.c:3091 +#: commands/indexcmds.c:3090 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "システムカタログã§ã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ä¸¦è¡Œå†æ§‹ç¯‰ã¯ã§ãã¾ã›ã‚“ã€å…¨ã¦ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/indexcmds.c:3124 +#: commands/indexcmds.c:3123 #, c-format msgid "cannot move system relations, skipping all" msgstr "システムリレーションã¯ç§»å‹•ã§ãã¾ã›ã‚“ã€ã™ã¹ã¦ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/indexcmds.c:3170 +#: commands/indexcmds.c:3169 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "パーティションテーブル\"%s.%s\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ä¸­" -#: commands/indexcmds.c:3173 +#: commands/indexcmds.c:3172 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "パーティションインデックス\"%s.%s\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ä¸­" -#: commands/indexcmds.c:3364 commands/indexcmds.c:4220 +#: commands/indexcmds.c:3365 commands/indexcmds.c:4241 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "テーブル\"%s.%s\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ãŒå®Œäº†ã—ã¾ã—ãŸ" -#: commands/indexcmds.c:3516 commands/indexcmds.c:3568 +#: commands/indexcmds.c:3517 commands/indexcmds.c:3570 +#, c-format +msgid "skipping reindex of invalid index \"%s.%s\"" +msgstr "無効ãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\"%s.%s\"ã®å†æ§‹ç¯‰ã‚’スキップã—ã¾ã™" + +#: commands/indexcmds.c:3520 commands/indexcmds.c:3573 #, c-format -msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" -msgstr "無効ãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ \"%s.%s\"ã®ä¸¦è¡Œå†æ§‹ç¯‰ã¯ã§ãã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™ " +msgid "Use DROP INDEX or REINDEX INDEX." +msgstr "DROP INDEXã‚ã‚‹ã„ã¯REINDEX INDEXを使用ã—ã¦ãã ã•ã„。" -#: commands/indexcmds.c:3522 +#: commands/indexcmds.c:3524 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "排他制約インデックス\"%s.%s\"ã‚’ä¸¦è¡Œå†æ§‹ç¯‰ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™ " -#: commands/indexcmds.c:3677 +#: commands/indexcmds.c:3680 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "ã“ã®ã‚¿ã‚¤ãƒ—ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã§ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ä¸¦åˆ—冿§‹ç¯‰ã¯ã§ãã¾ã›ã‚“" @@ -8501,47 +8891,47 @@ msgstr "ã“ã®ã‚¿ã‚¤ãƒ—ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã§ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ä¸¦åˆ—冿§‹ç¯‰ msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "テーブルスペース\"%s\"ã¸ã®éžå…±æœ‰ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ç§»å‹•ã¯ã§ãã¾ã›ã‚“" -#: commands/indexcmds.c:4201 commands/indexcmds.c:4213 +#: commands/indexcmds.c:4222 commands/indexcmds.c:4234 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr " インデックス\"%s.%s\"ã®å†æ§‹ç¯‰ãŒå®Œäº†ã—ã¾ã—㟠" -#: commands/indexcmds.c:4203 commands/indexcmds.c:4222 +#: commands/indexcmds.c:4224 commands/indexcmds.c:4243 #, c-format msgid "%s." msgstr "%s。" -#: commands/lockcmds.c:93 +#: commands/lockcmds.c:91 #, c-format msgid "cannot lock relation \"%s\"" msgstr "リレーション\"%s\"ã¯ãƒ­ãƒƒã‚¯ã§ãã¾ã›ã‚“" -#: commands/matview.c:194 +#: commands/matview.c:206 #, c-format msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "実体化ビューã«ãƒ‡ãƒ¼ã‚¿ãŒæŠ•å…¥ã•れã¦ã„ãªã„å ´åˆã¯CONCURRENTLYを使用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/matview.c:200 gram.y:18307 +#: commands/matview.c:212 gram.y:18918 #, c-format msgid "%s and %s options cannot be used together" msgstr "%sオプションã¨%sオプションã¨ã‚’åŒæ™‚ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/matview.c:257 +#: commands/matview.c:269 #, c-format msgid "cannot refresh materialized view \"%s\" concurrently" msgstr "実体化ビュー\"%s\"ã‚’å¹³è¡Œçš„ã«æœ€æ–°åŒ–ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/matview.c:260 +#: commands/matview.c:272 #, c-format msgid "Create a unique index with no WHERE clause on one or more columns of the materialized view." -msgstr "実体化ビュー上ã®1ã¤ä»¥ä¸Šã®åˆ—ã«å¯¾ã—ã¦WHEREå¥ã‚’æŒãŸãªã„UNIQUEインデックスを作æˆã—ã¦ãã ã•ã„。" +msgstr "実体化ビュー上ã®1ã¤ä»¥ä¸Šã®åˆ—ã«å¯¾ã—ã¦WHEREå¥ã‚’æŒãŸãªã„ユニークインデックスを作æˆã—ã¦ãã ã•ã„。" -#: commands/matview.c:654 +#: commands/matview.c:666 #, c-format msgid "new data for materialized view \"%s\" contains duplicate rows without any null columns" msgstr "実体化ビュー\"%s\"ã«å¯¾ã™ã‚‹æ–°ã—ã„データã«ã¯NULL列をæŒãŸãªã„é‡è¤‡è¡ŒãŒã‚りã¾ã™" -#: commands/matview.c:656 +#: commands/matview.c:668 #, c-format msgid "Row: %s" msgstr "行: %s" @@ -8741,27 +9131,27 @@ msgstr "(%2$s,%3$s)ç”¨ã®æ¼”ç®—å­ç•ªå·%1$dãŒè¤‡æ•°ã‚りã¾ã™" msgid "operator %d(%s,%s) already exists in operator family \"%s\"" msgstr "演算å­%d(%s,%s)ã¯ã™ã§ã«æ¼”ç®—å­æ—\"%s\"ã«å­˜åœ¨ã—ã¾ã™" -#: commands/opclasscmds.c:1566 +#: commands/opclasscmds.c:1589 #, c-format msgid "function %d(%s,%s) already exists in operator family \"%s\"" msgstr "関数%d(%s,%s)ã¯ã™ã§ã«æ¼”ç®—å­æ—\"%s\"内ã«å­˜åœ¨ã—ã¾ã™" -#: commands/opclasscmds.c:1647 +#: commands/opclasscmds.c:1744 #, c-format msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" msgstr "演算å­%d(%s,%s)ã¯æ¼”ç®—å­æ—\"%s\"内ã«ã‚りã¾ã›ã‚“" -#: commands/opclasscmds.c:1687 +#: commands/opclasscmds.c:1784 #, c-format msgid "function %d(%s,%s) does not exist in operator family \"%s\"" msgstr "関数%d(%s,%s)ã¯æ¼”ç®—å­æ—\"%s\"内ã«å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/opclasscmds.c:1718 +#: commands/opclasscmds.c:1815 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "アクセスメソッド\"%2$s\"ç”¨ã®æ¼”ç®—å­ã‚¯ãƒ©ã‚¹\"%1$s\"ã¯ã‚¹ã‚­ãƒ¼ãƒž\"%3$s\"内ã«ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/opclasscmds.c:1741 +#: commands/opclasscmds.c:1838 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "アクセスメソッド\"%2$s\"ç”¨ã®æ¼”ç®—å­æ—\"%1$s\"ã¯ã‚¹ã‚­ãƒ¼ãƒž\"%3$s\"内ã«ã™ã§ã«å­˜åœ¨ã—ã¾ã™" @@ -8771,7 +9161,7 @@ msgstr "アクセスメソッド\"%2$s\"ç”¨ã®æ¼”ç®—å­æ—\"%1$s\"ã¯ã‚¹ã‚­ãƒ¼ msgid "SETOF type not allowed for operator argument" msgstr "演算å­ã®å¼•æ•°ã«ã¯SETOF型を使用ã§ãã¾ã›ã‚“" -#: commands/operatorcmds.c:154 commands/operatorcmds.c:481 +#: commands/operatorcmds.c:154 commands/operatorcmds.c:554 #, c-format msgid "operator attribute \"%s\" not recognized" msgstr "演算å­ã®å±žæ€§\"%s\"ã¯ä¸æ˜Žã§ã™" @@ -8811,47 +9201,62 @@ msgstr "JOIN推定関数 %s ãŒè¤‡æ•°åˆè‡´ã—ã¾ã—ãŸ" msgid "join estimator function %s must return type %s" msgstr "JOIN推定関数 %s 㯠%s型を返ã™å¿…è¦ãŒã‚りã¾ã™" -#: commands/operatorcmds.c:475 +#: commands/operatorcmds.c:388 parser/parse_oper.c:119 parser/parse_oper.c:637 utils/adt/regproc.c:509 utils/adt/regproc.c:683 +#, c-format +msgid "operator does not exist: %s" +msgstr "演算å­ãŒå­˜åœ¨ã—ã¾ã›ã‚“: %s" + +#: commands/operatorcmds.c:396 parser/parse_oper.c:702 parser/parse_oper.c:815 +#, c-format +msgid "operator is only a shell: %s" +msgstr "演算å­ã¯å˜ãªã‚‹ã‚·ã‚§ãƒ«ã§ã™: %s" + +#: commands/operatorcmds.c:548 #, c-format msgid "operator attribute \"%s\" cannot be changed" msgstr "演算å­ã®å±žæ€§\"%s\"ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 commands/tablecmds.c:1616 commands/tablecmds.c:2219 commands/tablecmds.c:3520 commands/tablecmds.c:6369 commands/tablecmds.c:9181 commands/tablecmds.c:17090 commands/tablecmds.c:17125 commands/trigger.c:323 commands/trigger.c:1339 commands/trigger.c:1449 rewrite/rewriteDefine.c:275 rewrite/rewriteDefine.c:786 rewrite/rewriteRemove.c:80 +#: commands/operatorcmds.c:615 commands/operatorcmds.c:622 commands/operatorcmds.c:628 commands/operatorcmds.c:634 +#, c-format +msgid "operator attribute \"%s\" cannot be changed if it has already been set" +msgstr "演算å­ã®å±žæ€§\"%s\"ã¯ã€ã™ã§ã«è¨­å®šã•れã¦ã„ã‚‹å ´åˆã«ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" + +#: commands/policy.c:86 commands/policy.c:379 commands/statscmds.c:146 commands/tablecmds.c:1740 commands/tablecmds.c:2340 commands/tablecmds.c:3702 commands/tablecmds.c:6605 commands/tablecmds.c:9670 commands/tablecmds.c:17805 commands/tablecmds.c:17840 commands/trigger.c:316 commands/trigger.c:1332 commands/trigger.c:1442 rewrite/rewriteDefine.c:268 rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "権é™ãŒã‚りã¾ã›ã‚“: \"%s\"ã¯ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ã§ã™" -#: commands/policy.c:172 +#: commands/policy.c:169 #, c-format msgid "ignoring specified roles other than PUBLIC" msgstr "PUBLICä»¥å¤–ã®æŒ‡å®šã•れãŸãƒ­ãƒ¼ãƒ«ã‚’無視ã—ã¾ã™" -#: commands/policy.c:173 +#: commands/policy.c:170 #, c-format msgid "All roles are members of the PUBLIC role." msgstr "å…¨ã¦ã®ãƒ­ãƒ¼ãƒ«ãŒPUBLICロールã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚" -#: commands/policy.c:606 +#: commands/policy.c:603 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "SELECTã¾ãŸã¯DELETEã«ã¯ WITH CHECK ã‚’é©ç”¨ã§ãã¾ã›ã‚“" -#: commands/policy.c:615 commands/policy.c:918 +#: commands/policy.c:612 commands/policy.c:915 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "INSERTã§ã¯WITH CHECKå¼ã®ã¿ãŒæŒ‡å®šå¯èƒ½ã§ã™" -#: commands/policy.c:689 commands/policy.c:1141 +#: commands/policy.c:686 commands/policy.c:1138 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "テーブル\"%2$s\"ã«å¯¾ã™ã‚‹ãƒãƒªã‚·\"%1$s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/policy.c:890 commands/policy.c:1169 commands/policy.c:1240 +#: commands/policy.c:887 commands/policy.c:1166 commands/policy.c:1237 #, c-format msgid "policy \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"ã«å¯¾ã™ã‚‹ãƒãƒªã‚·\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/policy.c:908 +#: commands/policy.c:905 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "SELECTã€DELETEã«ã¯USINGå¼ã®ã¿ãŒæŒ‡å®šå¯èƒ½ã§ã™" @@ -8866,241 +9271,241 @@ msgstr "カーソルåãŒä¸æ­£ã§ã™: 空ã§ã¯ã„ã‘ã¾ã›ã‚“" msgid "cannot create a cursor WITH HOLD within security-restricted operation" msgstr "ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼åˆ¶é™æ“作中ã¯ã€WITH HOLD指定ã®ã‚«ãƒ¼ã‚½ãƒ«ã‚’作æˆã§ãã¾ã›ã‚“" -#: commands/portalcmds.c:189 commands/portalcmds.c:242 executor/execCurrent.c:70 utils/adt/xml.c:2844 utils/adt/xml.c:3014 +#: commands/portalcmds.c:189 commands/portalcmds.c:242 executor/execCurrent.c:70 utils/adt/xml.c:2936 utils/adt/xml.c:3106 #, c-format msgid "cursor \"%s\" does not exist" msgstr "カーソル\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/prepare.c:75 +#: commands/prepare.c:72 #, c-format msgid "invalid statement name: must not be empty" msgstr "䏿­£ãªæ–‡ã®åå‰: 空ã§ã¯ã„ã‘ã¾ã›ã‚“" -#: commands/prepare.c:230 commands/prepare.c:235 +#: commands/prepare.c:227 commands/prepare.c:232 #, c-format msgid "prepared statement is not a SELECT" msgstr "準備ã•ã‚ŒãŸæ–‡ã¯SELECTã§ã¯ã‚りã¾ã›ã‚“" -#: commands/prepare.c:295 +#: commands/prepare.c:292 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "準備ã•ã‚ŒãŸæ–‡\"%s\"ã®ãƒ‘ラメータ数ãŒé–“é•ã£ã¦ã„ã¾ã™" -#: commands/prepare.c:297 +#: commands/prepare.c:294 #, c-format msgid "Expected %d parameters but got %d." msgstr "%dパラメータを想定ã—ã¾ã—ãŸãŒã€%dパラメータã§ã—ãŸ" -#: commands/prepare.c:330 +#: commands/prepare.c:327 #, c-format msgid "parameter $%d of type %s cannot be coerced to the expected type %s" msgstr "パラメータ$%dã®åž‹%sを想定ã—ã¦ã„ã‚‹åž‹%sã«å¼·åˆ¶ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/prepare.c:414 +#: commands/prepare.c:411 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "準備ã•ã‚ŒãŸæ–‡\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/prepare.c:453 +#: commands/prepare.c:450 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "準備ã•ã‚ŒãŸæ–‡\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/proclang.c:68 +#: commands/proclang.c:66 #, c-format msgid "must be superuser to create custom procedural language" msgstr "手続ã言語を生æˆã™ã‚‹ãŸã‚ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/publicationcmds.c:131 postmaster/postmaster.c:1205 postmaster/postmaster.c:1303 storage/file/fd.c:3861 utils/init/miscinit.c:1815 +#: commands/publicationcmds.c:124 postmaster/postmaster.c:1108 postmaster/postmaster.c:1210 utils/init/miscinit.c:1865 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "パラメータ\"%s\"ã®ãƒªã‚¹ãƒˆæ§‹æ–‡ãŒä¸æ­£ã§ã™" -#: commands/publicationcmds.c:150 +#: commands/publicationcmds.c:143 #, c-format msgid "unrecognized value for publication option \"%s\": \"%s\"" msgstr "パブリケーションオプション\"%s\"ã«å¯¾ã™ã‚‹èªè­˜ã§ããªã„値: \"%s\"" -#: commands/publicationcmds.c:164 +#: commands/publicationcmds.c:157 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "識別ã§ããªã„パブリケーションã®ãƒ‘ラメータ: \"%s\"" -#: commands/publicationcmds.c:205 +#: commands/publicationcmds.c:198 #, c-format msgid "no schema has been selected for CURRENT_SCHEMA" msgstr "SURRENT_SCHEMAã§ã‚¹ã‚­ãƒ¼ãƒžã®é¸æŠžãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: commands/publicationcmds.c:502 +#: commands/publicationcmds.c:495 msgid "System columns are not allowed." msgstr "システム列ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。" -#: commands/publicationcmds.c:509 commands/publicationcmds.c:514 commands/publicationcmds.c:531 +#: commands/publicationcmds.c:502 commands/publicationcmds.c:507 commands/publicationcmds.c:524 msgid "User-defined operators are not allowed." msgstr "ユーザー定義演算å­ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。" -#: commands/publicationcmds.c:555 +#: commands/publicationcmds.c:548 msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." msgstr "列ã€å®šæ•°ã€çµ„ã¿è¾¼ã¿æ¼”ç®—å­ã€çµ„ã¿è¾¼ã¿ãƒ‡ãƒ¼ã‚¿åž‹ã€çµ„ã¿è¾¼ã¿ç…§åˆé †åºã€ãã—ã¦ä¸å¤‰çµ„ã¿è¾¼ã¿é–¢æ•°ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™ã€‚" -#: commands/publicationcmds.c:567 +#: commands/publicationcmds.c:560 msgid "User-defined types are not allowed." msgstr "ユーザー定義型ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。" -#: commands/publicationcmds.c:570 +#: commands/publicationcmds.c:563 msgid "User-defined or built-in mutable functions are not allowed." msgstr "ユーザー定義ã¾ãŸã¯çµ„ã¿è¾¼ã¿ã®ä¸å¤‰é–¢æ•°ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。" -#: commands/publicationcmds.c:573 +#: commands/publicationcmds.c:566 msgid "User-defined collations are not allowed." msgstr "ユーザー定義照åˆé †åºã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。" -#: commands/publicationcmds.c:583 +#: commands/publicationcmds.c:576 #, c-format msgid "invalid publication WHERE expression" msgstr "パブリケーションã®WHEREå¼ãŒä¸æ­£ã§ã™" -#: commands/publicationcmds.c:636 +#: commands/publicationcmds.c:629 #, c-format msgid "cannot use publication WHERE clause for relation \"%s\"" msgstr "リレーション\"%s\"ã«å¯¾ã—ã¦ã¯ãƒ‘ブリケーションã®WHEREå¥ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/publicationcmds.c:638 +#: commands/publicationcmds.c:631 #, c-format msgid "WHERE clause cannot be used for a partitioned table when %s is false." msgstr "%sãŒå½ã®ã¨ãã¯WHEREå¥ã‚’パーティション親テーブルã«å¯¾ã—ã¦ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" -#: commands/publicationcmds.c:709 commands/publicationcmds.c:723 +#: commands/publicationcmds.c:702 commands/publicationcmds.c:716 #, c-format msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" msgstr "パブリケーション\"%3$s\"ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%1$s.%2$s\"ã«å¯¾ã—ã¦åˆ—リストを使用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/publicationcmds.c:712 +#: commands/publicationcmds.c:705 #, c-format msgid "Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements." msgstr "FOR TABLES IN SCHEMAè¦ç´ ã‚’å«ã‚€ãƒ‘ブリケーションã§åˆ—ãƒªã‚¹ãƒˆã¯æŒ‡å®šã§ãã¾ã›ã‚“。" -#: commands/publicationcmds.c:726 +#: commands/publicationcmds.c:719 #, c-format msgid "Column lists cannot be specified for partitioned tables when %s is false." msgstr "%sãŒå½ã®ã¨ãã¯ãƒ‘ーティション親テーブルã«å¯¾ã—ã¦åˆ—リストを使用ã§ãã¾ã›ã‚“。" -#: commands/publicationcmds.c:761 +#: commands/publicationcmds.c:754 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "FOR ALL TABLE 指定ã®ãƒ‘ブリケーションを生æˆã™ã‚‹ãŸã‚ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/publicationcmds.c:832 +#: commands/publicationcmds.c:825 #, c-format msgid "must be superuser to create FOR TABLES IN SCHEMA publication" msgstr "FOR TABLES IN SCHEMA設定ã®ãƒ‘ブリケーションを作æˆã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/publicationcmds.c:868 +#: commands/publicationcmds.c:861 #, c-format -msgid "wal_level is insufficient to publish logical changes" -msgstr "wal_level ãŒè«–ç†æ›´æ–°æƒ…å ±ã®ãƒ‘ブリッシュã«ã¯ä¸å分ã§ã™" +msgid "\"wal_level\" is insufficient to publish logical changes" +msgstr "\"wal_level\"ãŒè«–ç†æ›´æ–°æƒ…å ±ã®ãƒ‘ブリッシュã«ã¯ä¸å分ã§ã™" -#: commands/publicationcmds.c:869 +#: commands/publicationcmds.c:862 #, c-format -msgid "Set wal_level to \"logical\" before creating subscriptions." -msgstr "サブスクリプションを作æˆã™ã‚‹å‰ã«wal_levelã‚’\"logical\"ã«è¨­å®šã«ã—ã¦ãã ã•ã„。" +msgid "Set \"wal_level\" to \"logical\" before creating subscriptions." +msgstr "サブスクリプションを作æˆã™ã‚‹å‰ã«\"wal_level\"ã‚’\"logical\"ã«è¨­å®šã«ã—ã¦ãã ã•ã„。" -#: commands/publicationcmds.c:965 commands/publicationcmds.c:973 +#: commands/publicationcmds.c:958 commands/publicationcmds.c:966 #, c-format msgid "cannot set parameter \"%s\" to false for publication \"%s\"" msgstr "パブリケーション\"%2$s\"ã«å¯¾ã—ã¦ãƒ‘ラメーター\"%1$s\"ã‚’å½ã«è¨­å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/publicationcmds.c:968 +#: commands/publicationcmds.c:961 #, c-format msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." msgstr "ã“ã®ãƒ‘ブリケーションã¯ãƒ‘ーティション親テーブル\"%s\"ã«å¯¾ã™ã‚‹WHEREå¥ã‚’å«ã‚“ã§ã„ã¾ã™ãŒã€ã“れã¯\"%s\" ãŒå½ã®å ´åˆã¯è¨±å¯ã•れã¾ã›ã‚“。" -#: commands/publicationcmds.c:976 +#: commands/publicationcmds.c:969 #, c-format msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." msgstr "ã“ã®ãƒ‘ブリケーションã¯ãƒ‘ーティション親テーブルã«\"%s\"対ã™ã‚‹åˆ—リストをå«ã‚“ã§ã„ã¾ã™ãŒã€ã“れã¯\"%s\" ãŒå½ã®å ´åˆã¯è¨±å¯ã•れã¾ã›ã‚“。" -#: commands/publicationcmds.c:1299 +#: commands/publicationcmds.c:1292 #, c-format msgid "cannot add schema to publication \"%s\"" msgstr "パブリケーション\"%s\"ã«ã¯ã‚¹ã‚­ãƒ¼ãƒžã¯è¿½åŠ ã§ãã¾ã›ã‚“" -#: commands/publicationcmds.c:1301 +#: commands/publicationcmds.c:1294 #, c-format msgid "Schemas cannot be added if any tables that specify a column list are already part of the publication." msgstr "ã‚«ãƒ©ãƒ ãƒªã‚¹ãƒˆãŒæŒ‡å®šã•れã¦ã„るテーブルãŒãƒ‘ブリケーションã«å«ã¾ã‚Œã¦ã„ã‚‹å ´åˆã¯ã‚¹ã‚­ãƒ¼ãƒžã®è¿½åŠ ãŒã§ãã¾ã›ã‚“。" -#: commands/publicationcmds.c:1349 +#: commands/publicationcmds.c:1342 #, c-format msgid "must be superuser to add or set schemas" msgstr "スキーマを追加ã¾ãŸã¯è¨­å®šã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/publicationcmds.c:1358 commands/publicationcmds.c:1366 +#: commands/publicationcmds.c:1351 commands/publicationcmds.c:1359 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "パブリケーション\"%s\"ã¯ã€€FOR ALL TABLES ã¨å®šç¾©ã•れã¦ã„ã¾ã™" -#: commands/publicationcmds.c:1360 +#: commands/publicationcmds.c:1353 #, c-format msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." msgstr "FOR ALL TABLES指定ã®ãƒ‘ブリケーションã§ã¯ã‚¹ã‚­ãƒ¼ãƒžã®è¿½åŠ ã‚„å‰Šé™¤ã¯ã§ãã¾ã›ã‚“。" -#: commands/publicationcmds.c:1368 +#: commands/publicationcmds.c:1361 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "FOR ALL TABLES指定ã®ãƒ‘ブリケーションã§ã¯ãƒ†ãƒ¼ãƒ–ルã®è¿½åŠ ã‚„å‰Šé™¤ã¯ã§ãã¾ã›ã‚“。" -#: commands/publicationcmds.c:1392 commands/publicationcmds.c:1431 commands/publicationcmds.c:1968 utils/cache/lsyscache.c:3592 +#: commands/publicationcmds.c:1385 commands/publicationcmds.c:1424 commands/publicationcmds.c:1961 utils/cache/lsyscache.c:3634 #, c-format msgid "publication \"%s\" does not exist" msgstr "パブリケーション\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/publicationcmds.c:1594 commands/publicationcmds.c:1657 +#: commands/publicationcmds.c:1587 commands/publicationcmds.c:1650 #, c-format msgid "conflicting or redundant WHERE clauses for table \"%s\"" msgstr "テーブル\"%s\"ã§WHEREå¥ãŒè¡çªã—ã¦ã„ã‚‹ã‹é‡è¤‡ã—ã¦ã„ã¾ã™" -#: commands/publicationcmds.c:1601 commands/publicationcmds.c:1669 +#: commands/publicationcmds.c:1594 commands/publicationcmds.c:1662 #, c-format msgid "conflicting or redundant column lists for table \"%s\"" msgstr "テーブル\"%s\"ã§åˆ—リストãŒè¡çªã—ã¦ã„ã‚‹ã‹é‡è¤‡ã—ã¦ã„ã¾ã™" -#: commands/publicationcmds.c:1803 +#: commands/publicationcmds.c:1796 #, c-format msgid "column list must not be specified in ALTER PUBLICATION ... DROP" msgstr "ALTER PUBLICATION ... DROPã§ã¯ã€åˆ—ãƒªã‚¹ãƒˆã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/publicationcmds.c:1815 +#: commands/publicationcmds.c:1808 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "リレーション\"%s\"ã¯ãƒ‘ブリケーションã®ä¸€éƒ¨ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/publicationcmds.c:1822 +#: commands/publicationcmds.c:1815 #, c-format msgid "cannot use a WHERE clause when removing a table from a publication" msgstr "テーブルをパブリケーションã‹ã‚‰å‰Šé™¤ã™ã‚‹éš›ã«ã¯WHEREå¥ã‚’指定ã§ãã¾ã›ã‚“" -#: commands/publicationcmds.c:1882 +#: commands/publicationcmds.c:1875 #, c-format msgid "tables from schema \"%s\" are not part of the publication" msgstr "スキーマ\"%s\"ã®ãƒ†ãƒ¼ãƒ–ルã¯ã“ã®ãƒ‘ブリケーションã«å«ã¾ã‚Œã¦ã¾ã›ã‚“" -#: commands/publicationcmds.c:1925 commands/publicationcmds.c:1932 +#: commands/publicationcmds.c:1918 commands/publicationcmds.c:1925 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "パブリケーション\"%s\"ã®æ‰€æœ‰è€…を変更ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/publicationcmds.c:1927 +#: commands/publicationcmds.c:1920 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "FOR ALL TABLES設定ã®ãƒ‘ãƒ–ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã®æ‰€æœ‰è€…ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/publicationcmds.c:1934 +#: commands/publicationcmds.c:1927 #, c-format msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." msgstr "FOR TABLES IN SCHEMA設定ã®ãƒ‘ãƒ–ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã®æ‰€æœ‰è€…ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: commands/publicationcmds.c:2000 +#: commands/publicationcmds.c:1993 #, c-format msgid "publication with OID %u does not exist" msgstr "OID %uã®ãƒ‘ブリケーションã¯å­˜åœ¨ã—ã¾ã›ã‚“" @@ -9146,3085 +9551,3139 @@ msgid "cannot set security label on relation \"%s\"" msgstr "リレーション\"%s\"ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ©ãƒ™ãƒ«ã¯è¨­å®šã§ãã¾ã›ã‚“" # (%s) -#: commands/sequence.c:754 +#: commands/sequence.c:748 #, c-format msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" msgstr "nextval: シーケンス\"%s\"ã®æœ€å¤§å€¤(%lld)ã«é”ã—ã¾ã—ãŸ" -#: commands/sequence.c:773 +#: commands/sequence.c:767 #, c-format msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" msgstr "nextval: シーケンス\"%s\"ã®æœ€å°å€¤(%lld)ã«é”ã—ã¾ã—ãŸ" -#: commands/sequence.c:891 +#: commands/sequence.c:886 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "本セッションã§ã‚·ãƒ¼ã‚±ãƒ³ã‚¹\"%s\"ã®currvalã¯ã¾ã å®šç¾©ã•れã¦ã„ã¾ã›ã‚“" -#: commands/sequence.c:910 commands/sequence.c:916 +#: commands/sequence.c:905 commands/sequence.c:911 #, c-format msgid "lastval is not yet defined in this session" msgstr "本セッションã§lastvalã¯ã¾ã å®šç¾©ã•れã¦ã„ã¾ã›ã‚“" -#: commands/sequence.c:996 +#: commands/sequence.c:991 #, c-format msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" msgstr "setval: 値%lldã¯ã‚·ãƒ¼ã‚±ãƒ³ã‚¹\"%s\"ã®ç¯„囲(%lld..%lld)外ã§ã™\"" -#: commands/sequence.c:1365 +#: commands/sequence.c:1357 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "䏿­£ãªã‚ªãƒ—ション SEQUENCE NAME" -#: commands/sequence.c:1391 +#: commands/sequence.c:1383 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "識別列ã®åž‹ã¯smallintã€integerã¾ãŸã¯bigintã§ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/sequence.c:1392 +#: commands/sequence.c:1384 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "シーケンスã®åž‹ã¯smallintã€integerã¾ãŸã¯bigintã§ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/sequence.c:1426 +#: commands/sequence.c:1418 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENTã¯ã‚¼ãƒ­ã§ã¯ã„ã‘ã¾ã›ã‚“" -#: commands/sequence.c:1474 +#: commands/sequence.c:1466 #, c-format msgid "MAXVALUE (%lld) is out of range for sequence data type %s" msgstr "MAXVALUE (%lld) ã¯ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ‡ãƒ¼ã‚¿åž‹%sã®ç¯„囲外ã§ã™" -#: commands/sequence.c:1506 +#: commands/sequence.c:1498 #, c-format msgid "MINVALUE (%lld) is out of range for sequence data type %s" msgstr "MINVALUE (%lld) ã¯ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãƒ‡ãƒ¼ã‚¿åž‹%sã®ç¯„囲外ã§ã™" -#: commands/sequence.c:1514 +#: commands/sequence.c:1506 #, c-format msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" msgstr "MINVALUE (%lld)ã¯MAXVALUE (%lld)よりå°ã•ããªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/sequence.c:1535 +#: commands/sequence.c:1527 #, c-format msgid "START value (%lld) cannot be less than MINVALUE (%lld)" msgstr "STARTã®å€¤(%lld)ã¯MINVALUE(%lld)よりå°ã•ãã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/sequence.c:1541 +#: commands/sequence.c:1533 #, c-format msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" msgstr "STARTã®å€¤(%lld)ã¯MAXVALUE(%lld)より大ããã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/sequence.c:1565 +#: commands/sequence.c:1557 #, c-format msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" msgstr "RESTART ã®å€¤(%lld)㯠MINVALUE(%lld) よりå°ã•ãã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/sequence.c:1571 +#: commands/sequence.c:1563 #, c-format msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" msgstr "RESTART ã®å€¤(%lld)㯠MAXVALUE(%lld) より大ããã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/sequence.c:1582 +#: commands/sequence.c:1574 #, c-format msgid "CACHE (%lld) must be greater than zero" msgstr "CACHE(%lld)ã¯ã‚¼ãƒ­ã‚ˆã‚Šå¤§ãããªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/sequence.c:1618 +#: commands/sequence.c:1610 #, c-format msgid "invalid OWNED BY option" msgstr "䏿­£ãªOWNED BYオプションã§ã™" -#: commands/sequence.c:1619 +#: commands/sequence.c:1611 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "OWNED BY table.column ã¾ãŸã¯ OWNED BY NONEを指定ã—ã¦ãã ã•ã„。" -#: commands/sequence.c:1644 +#: commands/sequence.c:1636 #, c-format msgid "sequence cannot be owned by relation \"%s\"" msgstr "ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã®æ‰€æœ‰è€…をリレーション\"%s\"ã«ã¯ã§ãã¾ã›ã‚“" -#: commands/sequence.c:1652 +#: commands/sequence.c:1644 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "シーケンスã¯é–¢é€£ã™ã‚‹ãƒ†ãƒ¼ãƒ–ルã¨åŒã˜æ‰€æœ‰è€…ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/sequence.c:1656 +#: commands/sequence.c:1648 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "シーケンスã¯é–¢é€£ã™ã‚‹ãƒ†ãƒ¼ãƒ–ルã¨åŒã˜ã‚¹ã‚­ãƒ¼ãƒžã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/sequence.c:1678 +#: commands/sequence.c:1670 #, c-format msgid "cannot change ownership of identity sequence" msgstr "è­˜åˆ¥ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã®æ‰€æœ‰è€…ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/sequence.c:1679 commands/tablecmds.c:13891 commands/tablecmds.c:16488 +#: commands/sequence.c:1671 commands/tablecmds.c:14519 commands/tablecmds.c:17214 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "シーケンス\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã«ãƒªãƒ³ã‚¯ã•れã¦ã„ã¾ã™" -#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1886 +#: commands/statscmds.c:106 commands/statscmds.c:115 tcop/utility.c:1883 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "CREATE STATISTICSã§æŒ‡å®šå¯èƒ½ãªãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¯ä¸€ã¤ã®ã¿ã§ã™" -#: commands/statscmds.c:136 +#: commands/statscmds.c:133 #, c-format msgid "cannot define statistics for relation \"%s\"" msgstr "リレーション\"%s\"ã«å¯¾ã—ã¦çµ±è¨ˆæƒ…報を定義ã§ãã¾ã›ã‚“" -#: commands/statscmds.c:190 +#: commands/statscmds.c:187 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "統計情報オブジェクト\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/statscmds.c:198 +#: commands/statscmds.c:195 #, c-format msgid "statistics object \"%s\" already exists" msgstr "統計情報オブジェクト\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/statscmds.c:209 +#: commands/statscmds.c:206 #, c-format msgid "cannot have more than %d columns in statistics" msgstr "統計情報ã¯%dã‚’è¶…ãˆã‚‹åˆ—を使用ã§ãã¾ã›ã‚“" -#: commands/statscmds.c:250 commands/statscmds.c:273 commands/statscmds.c:307 +#: commands/statscmds.c:247 commands/statscmds.c:270 commands/statscmds.c:304 #, c-format msgid "statistics creation on system columns is not supported" msgstr "システム列ã«å¯¾ã™ã‚‹çµ±è¨ˆæƒ…å ±ã®ä½œæˆã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/statscmds.c:257 commands/statscmds.c:280 +#: commands/statscmds.c:254 commands/statscmds.c:277 #, c-format msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" msgstr "列\"%s\"ã®åž‹%sã¯ãƒ‡ãƒ•ォルトã®btreeオペレータクラスをæŒãŸãªã„ãŸã‚統計情報ã§ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“" -#: commands/statscmds.c:324 +#: commands/statscmds.c:321 #, c-format msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" msgstr "å¼ã®åž‹%sãŒãƒ‡ãƒ•ォルトbtree演算å­ã‚¯ãƒ©ã‚¹ã‚’æŒãŸãªã„ãŸã‚ã“ã®å¼ã¯å¤šå€¤çµ±è¨ˆæƒ…å ±ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/statscmds.c:345 +#: commands/statscmds.c:342 #, c-format msgid "when building statistics on a single expression, statistics kinds may not be specified" msgstr "å˜ä¸€å¼ä¸Šã®çµ±è¨ˆæƒ…å ±ã®æ§‹ç¯‰æ™‚ã«ã¯ã€çµ±è¨ˆç¨®åˆ¥ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/statscmds.c:374 +#: commands/statscmds.c:371 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "èªè­˜ã§ããªã„統計情報種別\"%s\"" -#: commands/statscmds.c:403 +#: commands/statscmds.c:400 #, c-format msgid "extended statistics require at least 2 columns" msgstr "拡張統計情報ã«ã¯æœ€ä½Žã§ã‚‚2ã¤ã®åˆ—ãŒå¿…è¦ã§ã™" -#: commands/statscmds.c:421 +#: commands/statscmds.c:418 #, c-format msgid "duplicate column name in statistics definition" msgstr "定形情報定義中ã®åˆ—åãŒé‡è¤‡ã—ã¦ã„ã¾ã™" -#: commands/statscmds.c:456 +#: commands/statscmds.c:453 #, c-format msgid "duplicate expression in statistics definition" msgstr "統計情報定義内ã«é‡è¤‡ã—ãŸå¼" -#: commands/statscmds.c:619 commands/tablecmds.c:8180 +#: commands/statscmds.c:628 commands/tablecmds.c:8653 #, c-format msgid "statistics target %d is too low" msgstr "統計情報目標%dã¯å°ã•ã™ãŽã¾ã™" -#: commands/statscmds.c:627 commands/tablecmds.c:8188 +#: commands/statscmds.c:636 commands/tablecmds.c:8661 #, c-format msgid "lowering statistics target to %d" msgstr "統計情報目標を%dã«æ¸›ã‚‰ã—ã¾ã™" -#: commands/statscmds.c:650 +#: commands/statscmds.c:660 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "統計情報オブジェクト\"%s.%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/subscriptioncmds.c:271 commands/subscriptioncmds.c:359 +#: commands/subscriptioncmds.c:275 commands/subscriptioncmds.c:372 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "èªè­˜ã§ããªã„サブスクリプションパラメータ: \"%s\"" -#: commands/subscriptioncmds.c:327 replication/pgoutput/pgoutput.c:398 +#: commands/subscriptioncmds.c:340 replication/pgoutput/pgoutput.c:404 #, c-format msgid "unrecognized origin value: \"%s\"" msgstr "識別ã§ããªã„originã®å€¤: \"%s\"" -#: commands/subscriptioncmds.c:350 +#: commands/subscriptioncmds.c:363 #, c-format msgid "invalid WAL location (LSN): %s" msgstr "䏿­£ãªWALä½ç½®(LSN): %s" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:374 commands/subscriptioncmds.c:381 commands/subscriptioncmds.c:388 commands/subscriptioncmds.c:410 commands/subscriptioncmds.c:426 +#: commands/subscriptioncmds.c:387 commands/subscriptioncmds.c:394 commands/subscriptioncmds.c:401 commands/subscriptioncmds.c:423 commands/subscriptioncmds.c:439 #, c-format msgid "%s and %s are mutually exclusive options" msgstr "%s 㨠%s ã¯æŽ’ä»–ãªã‚ªãƒ—ションã§ã™" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:416 commands/subscriptioncmds.c:432 +#: commands/subscriptioncmds.c:429 commands/subscriptioncmds.c:445 #, c-format msgid "subscription with %s must also set %s" msgstr "%s ã¨ã—ãŸã‚µãƒ–スクリプションã§ã¯ %s を設定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/subscriptioncmds.c:494 +#: commands/subscriptioncmds.c:506 #, c-format msgid "could not receive list of publications from the publisher: %s" -msgstr "パブリケーション一覧を発行者ã‹ã‚‰å—ã‘å–れã¾ã›ã‚“ã§ã—ãŸ: %s" +msgstr "パブリケーション一覧をパブリッシャã‹ã‚‰å—ã‘å–れã¾ã›ã‚“ã§ã—ãŸ: %s" -#: commands/subscriptioncmds.c:526 +#: commands/subscriptioncmds.c:538 #, c-format msgid "publication %s does not exist on the publisher" msgid_plural "publications %s do not exist on the publisher" -msgstr[0] "パブリケーション%sã¯ç™ºè¡Œã‚µãƒ¼ãƒãƒ¼ã«ã¯å­˜åœ¨ã—ã¾ã›ã‚“" +msgstr[0] "パブリケーション%sã¯ãƒ‘ブリッシャ上ã«ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/subscriptioncmds.c:614 +#: commands/subscriptioncmds.c:626 #, c-format msgid "permission denied to create subscription" msgstr "サブスクリプションを作æˆã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/subscriptioncmds.c:615 +#: commands/subscriptioncmds.c:627 #, c-format msgid "Only roles with privileges of the \"%s\" role may create subscriptions." msgstr "\"%s\"ãƒ­ãƒ¼ãƒ«ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã‚µãƒ–スクリプションを作æˆã§ãã¾ã™ã€‚" -#: commands/subscriptioncmds.c:745 commands/subscriptioncmds.c:878 replication/logical/tablesync.c:1309 replication/logical/worker.c:4622 +#: commands/subscriptioncmds.c:758 commands/subscriptioncmds.c:891 commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1345 replication/logical/worker.c:4514 #, c-format msgid "could not connect to the publisher: %s" -msgstr "発行サーãƒãƒ¼ã¸ã®æŽ¥ç¶šãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgstr "ãƒ‘ãƒ–ãƒªãƒƒã‚·ãƒ£ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: commands/subscriptioncmds.c:816 +#: commands/subscriptioncmds.c:829 #, c-format msgid "created replication slot \"%s\" on publisher" -msgstr "発行サーãƒãƒ¼ã§ãƒ¬ãƒ—リケーションスロット\"%s\"を作æˆã—ã¾ã—ãŸ" +msgstr "パブリッシャ上ã§ãƒ¬ãƒ—リケーションスロット\"%s\"を作æˆã—ã¾ã—ãŸ" -#: commands/subscriptioncmds.c:828 +#: commands/subscriptioncmds.c:841 #, c-format msgid "subscription was created, but is not connected" msgstr "サブスクリプションã¯ä½œæˆã•れã¾ã—ãŸãŒæŽ¥ç¶šã•れã¦ã„ã¾ã›ã‚“" -#: commands/subscriptioncmds.c:829 +#: commands/subscriptioncmds.c:842 #, c-format msgid "To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription." msgstr "レプリケーションを開始ã™ã‚‹ã«ã¯ãƒ¬ãƒ—リケーションスロットã®ä½œæˆã€ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—ã‚·ãƒ§ãƒ³ã®æœ‰åŠ¹åŒ–ãã—ã¦ã‚µãƒ–スクリプションã®ãƒªãƒ•レッシュを手動ã§è¡Œã†å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/subscriptioncmds.c:1096 commands/subscriptioncmds.c:1502 commands/subscriptioncmds.c:1885 utils/cache/lsyscache.c:3642 +#: commands/subscriptioncmds.c:1109 commands/subscriptioncmds.c:1590 commands/subscriptioncmds.c:1973 utils/cache/lsyscache.c:3684 #, c-format msgid "subscription \"%s\" does not exist" msgstr "サブスクリプション\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/subscriptioncmds.c:1152 +#: commands/subscriptioncmds.c:1166 commands/subscriptioncmds.c:1245 #, c-format msgid "cannot set %s for enabled subscription" msgstr "有効ã«ã•れã¦ã„るサブスクリプションã«ã¯ %s を指定ã§ãã¾ã›ã‚“" -#: commands/subscriptioncmds.c:1227 +#: commands/subscriptioncmds.c:1233 +#, c-format +msgid "cannot set option \"%s\" for a subscription that does not have a slot name" +msgstr "スロットåを指定ã•れã¦ã„ãªã„サブスクリプションã®ã‚ªãƒ—ション\"%s\"を設定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: commands/subscriptioncmds.c:1279 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "スロットåを指定ã•れã¦ã„ãªã„サブスクリプションを有効ã«ã¯ã§ãã¾ã›ã‚“" -#: commands/subscriptioncmds.c:1271 commands/subscriptioncmds.c:1322 +#: commands/subscriptioncmds.c:1323 commands/subscriptioncmds.c:1374 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "refresh指定ã•れ㟠ALTER SUBSCRIPTION ã¯ç„¡åŠ¹åŒ–ã•れã¦ã„るサブスクリプションã«ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: commands/subscriptioncmds.c:1272 +#: commands/subscriptioncmds.c:1324 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false) を使ã£ã¦ãã ã•ã„。" -#: commands/subscriptioncmds.c:1281 commands/subscriptioncmds.c:1336 +#: commands/subscriptioncmds.c:1333 commands/subscriptioncmds.c:1388 #, c-format msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" msgstr "two_phaseãŒæœ‰åйã§ã‚ã‚‹å ´åˆã€refreshãŠã‚ˆã³copy_data指定ã•れ㟠ALTER SUBSCRIPTIONã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: commands/subscriptioncmds.c:1282 +#: commands/subscriptioncmds.c:1334 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "refresh = false ã¾ãŸã¯ copy_data = false を指定ã—ã¦ALTER SUBSCRIPTION ... SET PUBLICATIONを実行ã™ã‚‹ã‹ã€DROP/CREATE SUBSCRIPTIONを実行ã—ã¦ãã ã•ã„。" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1324 -#, c-format -msgid "Use %s instead." -msgstr "代ã‚りã«%sを使用ã—ã¦ãã ã•ã„" - -#. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1338 +#: commands/subscriptioncmds.c:1390 #, c-format msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "refresh = false ã¾ãŸã¯ copy_data = false を指定ã—ã¦%sを実行ã™ã‚‹ã‹ã€DROP/CREATE SUBSCRIPTIONを実行ã—ã¦ãã ã•ã„。" -#: commands/subscriptioncmds.c:1360 +#: commands/subscriptioncmds.c:1412 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESHã¯ç„¡åŠ¹åŒ–ã•れã¦ã„るサブスクリプションã«ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: commands/subscriptioncmds.c:1385 +#: commands/subscriptioncmds.c:1437 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" msgstr "two_phaseãŒæœ‰åйã§ã‚ã‚‹å ´åˆã€copy_data指定ã®ALTER SUBSCRIPTION ... REFRESHã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: commands/subscriptioncmds.c:1386 +#: commands/subscriptioncmds.c:1438 #, c-format msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "ALTER SUBSCRIPTION ... REFRESH ã‚’ copy_data = false を指定ã—ã¦å®Ÿè¡Œã™ã‚‹ã‹ã€DROP/CREATE SUBSCRIPTIONを実行ã—ã¦ãã ã•ã„。" -#: commands/subscriptioncmds.c:1421 +#: commands/subscriptioncmds.c:1473 #, c-format msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" msgstr "WAL読ã¿é£›ã°ã—ä½ç½®(LSN %X/%X)ã¯åŸºç‚¹LSN %X/%Xより大ãããªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/subscriptioncmds.c:1506 +#: commands/subscriptioncmds.c:1594 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "サブスクリプション\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/subscriptioncmds.c:1775 +#: commands/subscriptioncmds.c:1863 #, c-format msgid "dropped replication slot \"%s\" on publisher" -msgstr "発行サーãƒãƒ¼ä¸Šã®ãƒ¬ãƒ—リケーションスロット\"%s\"を削除ã—ã¾ã—ãŸ" +msgstr "パブリッシャ上ã§ãƒ¬ãƒ—リケーションスロット\"%s\"を削除ã—ã¾ã—ãŸ" -#: commands/subscriptioncmds.c:1784 commands/subscriptioncmds.c:1792 +#: commands/subscriptioncmds.c:1872 commands/subscriptioncmds.c:1880 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" -msgstr "発行サーãƒãƒ¼ä¸Šã®ãƒ¬ãƒ—リケーションスロット\"%s\"ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" +msgstr "パブリッシャ上ã§ã®ãƒ¬ãƒ—リケーションスロット\"%s\"ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: commands/subscriptioncmds.c:1917 +#: commands/subscriptioncmds.c:2005 #, c-format msgid "subscription with OID %u does not exist" msgstr "OID %uã®ã‚µãƒ–スクリプションã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/subscriptioncmds.c:1988 commands/subscriptioncmds.c:2113 +#: commands/subscriptioncmds.c:2079 commands/subscriptioncmds.c:2204 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" -msgstr "発行テーブルã®ä¸€è¦§ã‚’発行サーãƒãƒ¼ã‹ã‚‰å—ã‘å–れã¾ã›ã‚“ã§ã—ãŸ: %s" +msgstr "パブリッシャã‹ã‚‰è¤‡è£½ãƒ†ãƒ¼ãƒ–ルã®ä¸€è¦§ã‚’å—ã‘å–れã¾ã›ã‚“ã§ã—ãŸ: %s" -#: commands/subscriptioncmds.c:2024 +#: commands/subscriptioncmds.c:2115 #, c-format msgid "subscription \"%s\" requested copy_data with origin = NONE but might copy data that had a different origin" msgstr "サブスクリプション\"%s\"ãŒcopy_dataã‚’origin = NONEã§è¦æ±‚ã—ã¾ã—ãŸãŒã€ç•°ãªã‚‹åŸºç‚¹ã‚’æŒã¤ãƒ‡ãƒ¼ã‚¿ã‚’コピーã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™" -#: commands/subscriptioncmds.c:2026 +#: commands/subscriptioncmds.c:2117 #, c-format -msgid "Subscribed publication %s is subscribing to other publications." -msgid_plural "Subscribed publications %s are subscribing to other publications." -msgstr[0] "購読ã—ã¦ã„るパブリケーション%sã¯ä»–ã®ãƒ‘ブリケーションを購読ã—ã¦ã„ã¾ã™ã€‚" +msgid "The subscription being created subscribes to a publication (%s) that contains tables that are written to by other subscriptions." +msgid_plural "The subscription being created subscribes to publications (%s) that contain tables that are written to by other subscriptions." +msgstr[0] "作æˆä¸­ã®ã‚µãƒ–スクリプションã¯ä»–ã®ã‚µãƒ–スクリプションã«ã‚ˆã£ã¦æ›¸ãè¾¼ã¾ã‚Œã‚‹ãƒ†ãƒ¼ãƒ–ルをå«ã‚€ãƒ‘ブリケーション(%s)をサブスクライブã—ã¾ã™" -#: commands/subscriptioncmds.c:2029 +#: commands/subscriptioncmds.c:2120 #, c-format msgid "Verify that initial data copied from the publisher tables did not come from other origins." -msgstr "発行元テーブルã‹ã‚‰ã‚³ãƒ”ーã•れãŸåˆæœŸãƒ‡ãƒ¼ã‚¿ãŒç•°ãªã‚‹åŸºç‚¹ã‹ã‚‰ã®ã‚‚ã®ã§ãªã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。" +msgstr "パブリッシャテーブルã‹ã‚‰ã‚³ãƒ”ーã•れãŸåˆæœŸãƒ‡ãƒ¼ã‚¿ãŒç•°ãªã‚‹èµ·æºã‹ã‚‰ã®ã‚‚ã®ã§ãªã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。" -#: commands/subscriptioncmds.c:2135 replication/logical/tablesync.c:876 replication/pgoutput/pgoutput.c:1115 +#: commands/subscriptioncmds.c:2226 replication/logical/tablesync.c:906 replication/pgoutput/pgoutput.c:1143 #, c-format msgid "cannot use different column lists for table \"%s.%s\" in different publications" msgstr "テーブル\"%s.%s\"ã«å¯¾ã—ã¦ã€ç•°ãªã‚‹ãƒ‘ブリケーションã§ç•°ãªã‚‹åˆ—リストを使用ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/subscriptioncmds.c:2185 +#: commands/subscriptioncmds.c:2276 #, c-format msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" -msgstr "レプリケーションスロット\"%s\"を削除ã™ã‚‹éš›ã«ç™ºè¡Œè€…サーãƒãƒ¼ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸ: %s" +msgstr "レプリケーションスロット\"%s\"を削除ã™ã‚‹éš›ã«ãƒ‘ブリッシャã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸ: %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:2188 +#: commands/subscriptioncmds.c:2279 #, c-format -msgid "Use %s to disassociate the subscription from the slot." -msgstr "サブスクリプションã®ã‚¹ãƒ­ãƒƒãƒˆã¸ã®é–¢é€£ä»˜ã‘を解除ã™ã‚‹ã«ã¯ %s を実行ã—ã¦ãã ã•ã„。" +msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." +msgstr "%s ã§ã‚µãƒ–スクリプションを無効化ã—ã¦ã‹ã‚‰ã€%s ã§ã‚¹ãƒ­ãƒƒãƒˆã¨ã®é–¢é€£ä»˜ã‘を解除ã—ã¦ãã ã•ã„。" -#: commands/subscriptioncmds.c:2218 +#: commands/subscriptioncmds.c:2310 #, c-format msgid "publication name \"%s\" used more than once" msgstr "パブリケーションå\"%s\"ãŒ2回以上使ã‚れã¦ã„ã¾ã™" -#: commands/subscriptioncmds.c:2262 +#: commands/subscriptioncmds.c:2354 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "パブリケーション\"%s\"ã¯ã‚µãƒ–スクリプション\"%s\"ã«ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/subscriptioncmds.c:2276 +#: commands/subscriptioncmds.c:2368 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "パブリケーション\"%s\"ã¯ã‚µãƒ–スクリプション\"%s\"ã«ã¯ã‚りã¾ã›ã‚“" -#: commands/subscriptioncmds.c:2287 +#: commands/subscriptioncmds.c:2379 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "サブスクリプションã‹ã‚‰ã™ã¹ã¦ã®ãƒ‘ブリケーションを削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/subscriptioncmds.c:2344 +#: commands/subscriptioncmds.c:2436 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "パラメータ\"%s\"ã¯Boolean値ã¾ãŸã¯\"parallel\"ã®ã¿ã‚’å–りã¾ã™" -#: commands/tablecmds.c:246 commands/tablecmds.c:288 +#: commands/tablecmds.c:255 commands/tablecmds.c:297 #, c-format msgid "table \"%s\" does not exist" msgstr "テーブル\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tablecmds.c:247 commands/tablecmds.c:289 +#: commands/tablecmds.c:256 commands/tablecmds.c:298 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "テーブル\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/tablecmds.c:249 commands/tablecmds.c:291 +#: commands/tablecmds.c:258 commands/tablecmds.c:300 msgid "Use DROP TABLE to remove a table." msgstr "テーブルを削除ã™ã‚‹ã«ã¯DROP TABLEを使用ã—ã¦ãã ã•ã„。" -#: commands/tablecmds.c:252 +#: commands/tablecmds.c:261 #, c-format msgid "sequence \"%s\" does not exist" msgstr "シーケンス\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tablecmds.c:253 +#: commands/tablecmds.c:262 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "シーケンス\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/tablecmds.c:255 +#: commands/tablecmds.c:264 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "シーケンスを削除ã™ã‚‹ã«ã¯DROP SEQUENCEを使用ã—ã¦ãã ã•ã„。" -#: commands/tablecmds.c:258 +#: commands/tablecmds.c:267 #, c-format msgid "view \"%s\" does not exist" msgstr "ビュー\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tablecmds.c:259 +#: commands/tablecmds.c:268 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "ビュー\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/tablecmds.c:261 +#: commands/tablecmds.c:270 msgid "Use DROP VIEW to remove a view." msgstr "ビューを削除ã™ã‚‹ã«ã¯DROP VIEWを使用ã—ã¦ãã ã•ã„。" -#: commands/tablecmds.c:264 +#: commands/tablecmds.c:273 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "実体化ビュー\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tablecmds.c:265 +#: commands/tablecmds.c:274 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "実体化ビュー\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/tablecmds.c:267 +#: commands/tablecmds.c:276 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "実体化ビューを削除ã™ã‚‹ã«ã¯DROP MATERIALIZED VIEWを使用ã—ã¦ãã ã•ã„。" -#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:19002 parser/parse_utilcmd.c:2245 +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19838 parser/parse_utilcmd.c:2251 #, c-format msgid "index \"%s\" does not exist" msgstr "インデックス\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tablecmds.c:271 commands/tablecmds.c:295 +#: commands/tablecmds.c:280 commands/tablecmds.c:304 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "インデックス\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/tablecmds.c:273 commands/tablecmds.c:297 +#: commands/tablecmds.c:282 commands/tablecmds.c:306 msgid "Use DROP INDEX to remove an index." msgstr "インデックスを削除ã™ã‚‹ã«ã¯DROP INDEXを使用ã—ã¦ãã ã•ã„" -#: commands/tablecmds.c:278 +#: commands/tablecmds.c:287 #, c-format msgid "\"%s\" is not a type" msgstr "\"%s\"ã¯åž‹ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:279 +#: commands/tablecmds.c:288 msgid "Use DROP TYPE to remove a type." msgstr "型を削除ã™ã‚‹ã«ã¯DROP TYPEを使用ã—ã¦ãã ã•ã„" -#: commands/tablecmds.c:282 commands/tablecmds.c:13730 commands/tablecmds.c:16193 +#: commands/tablecmds.c:291 commands/tablecmds.c:14358 commands/tablecmds.c:16919 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "外部テーブル\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tablecmds.c:283 +#: commands/tablecmds.c:292 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "外部テーブル\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/tablecmds.c:285 +#: commands/tablecmds.c:294 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "外部テーブルを削除ã™ã‚‹ã«ã¯ DROP FOREIGN TABLE を使用ã—ã¦ãã ã•ã„。" -#: commands/tablecmds.c:700 +#: commands/tablecmds.c:734 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMITã¯ä¸€æ™‚テーブルã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™" -#: commands/tablecmds.c:731 +#: commands/tablecmds.c:765 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼åˆ¶é™æ“作中ã¯ã€ä¸€æ™‚テーブルを作æˆã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:767 commands/tablecmds.c:15038 +#: commands/tablecmds.c:801 commands/tablecmds.c:15778 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "リレーション\"%s\"ãŒè¤‡æ•°å›žç¶™æ‰¿ã•れã¾ã—ãŸ" -#: commands/tablecmds.c:955 -#, c-format -msgid "specifying a table access method is not supported on a partitioned table" -msgstr "パーティション親テーブルã§ã¯ãƒ†ãƒ¼ãƒ–ãƒ«ã‚¢ã‚¯ã‚»ã‚¹ãƒ¡ã‚½ãƒƒãƒ‰ã®æŒ‡å®šã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" - -#: commands/tablecmds.c:1048 +#: commands/tablecmds.c:1067 #, c-format msgid "\"%s\" is not partitioned" msgstr "\"%s\"ã¯ãƒ‘ーティションã•れã¦ã„ã¾ã›ã‚“" -#: commands/tablecmds.c:1142 +#: commands/tablecmds.c:1161 #, c-format msgid "cannot partition using more than %d columns" msgstr "%d以上ã®åˆ—を使ã£ãŸãƒ‘ーティションã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:1198 +#: commands/tablecmds.c:1217 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "パーティションテーブル\"%s\"ã§ã¯å¤–部å­ãƒ†ãƒ¼ãƒ–ルを作æˆã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:1200 +#: commands/tablecmds.c:1219 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "テーブル\"%s\"ã¯ãƒ¦ãƒ‹ãƒ¼ã‚¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’æŒã£ã¦ã„ã¾ã™" -#: commands/tablecmds.c:1365 +#: commands/tablecmds.c:1338 commands/tablecmds.c:13374 +#, c-format +msgid "too many array dimensions" +msgstr "é…åˆ—ã®æ¬¡å…ƒå¤šã™ãŽã¾ã™" + +#: commands/tablecmds.c:1343 parser/parse_clause.c:774 parser/parse_relation.c:1912 +#, c-format +msgid "column \"%s\" cannot be declared SETOF" +msgstr "列\"%s\"ã¯SETOFã¨ã—ã¦å®£è¨€ã§ãã¾ã›ã‚“" + +#: commands/tablecmds.c:1489 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLYã¯è¤‡æ•°ã‚ªãƒ–ジェクトã®å‰Šé™¤ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: commands/tablecmds.c:1369 +#: commands/tablecmds.c:1493 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLYã¯CASCADEをサãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: commands/tablecmds.c:1473 +#: commands/tablecmds.c:1597 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "パーティション親インデックス\"%s\"ã¯ä¸¦è¡Œçš„ã«å‰Šé™¤ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:1761 +#: commands/tablecmds.c:1885 #, c-format msgid "cannot truncate only a partitioned table" msgstr "パーティションã®è¦ªãƒ†ãƒ¼ãƒ–ルã®ã¿ã®åˆ‡ã‚Šè©°ã‚ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:1762 +#: commands/tablecmds.c:1886 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "ONLY キーワードを指定ã—ãªã„ã§ãã ã•ã„ã€ã‚‚ã—ãã¯å­ãƒ†ãƒ¼ãƒ–ルã«å¯¾ã—ã¦ç›´æŽ¥ TRUNCATE ONLY を実行ã—ã¦ãã ã•ã„。" -#: commands/tablecmds.c:1835 +#: commands/tablecmds.c:1959 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "テーブル\"%s\"ã¸ã®ã‚«ã‚¹ã‚±ãƒ¼ãƒ‰ã‚’削除ã—ã¾ã™" -#: commands/tablecmds.c:2199 +#: commands/tablecmds.c:2320 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "外部テーブル\"%s\"ã®åˆ‡ã‚Šè©°ã‚ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:2256 +#: commands/tablecmds.c:2377 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚テーブルを削除ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:2488 commands/tablecmds.c:14935 +#: commands/tablecmds.c:2606 commands/tablecmds.c:15675 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"ã‹ã‚‰ã®ç¶™æ‰¿ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:2493 +#: commands/tablecmds.c:2611 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "パーティションå­ãƒ†ãƒ¼ãƒ–ル\"%s\"ã‹ã‚‰ã®ç¶™æ‰¿ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:2501 parser/parse_utilcmd.c:2475 parser/parse_utilcmd.c:2617 +#: commands/tablecmds.c:2619 parser/parse_utilcmd.c:2481 parser/parse_utilcmd.c:2623 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "継承ã—よã†ã¨ã—ãŸãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ルã¾ãŸã¯å¤–部テーブルã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:2513 +#: commands/tablecmds.c:2631 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "一時リレーションを永続リレーション\"%s\"ã®ãƒ‘ーティションå­ãƒ†ãƒ¼ãƒ–ルã¨ã—ã¦ä½œã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:2522 commands/tablecmds.c:14914 +#: commands/tablecmds.c:2640 commands/tablecmds.c:15654 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "一時リレーション\"%s\"ã‹ã‚‰ç¶™æ‰¿ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:2532 commands/tablecmds.c:14922 +#: commands/tablecmds.c:2650 commands/tablecmds.c:15662 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚リレーションã‹ã‚‰ç¶™æ‰¿ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:2585 +#: commands/tablecmds.c:2791 commands/tablecmds.c:2845 commands/tablecmds.c:13057 parser/parse_utilcmd.c:1265 parser/parse_utilcmd.c:1308 parser/parse_utilcmd.c:1735 parser/parse_utilcmd.c:1843 #, c-format -msgid "merging multiple inherited definitions of column \"%s\"" -msgstr "複数ã®ç¶™æ‰¿ã•れる列\"%s\"ã®å®šç¾©ã‚’マージã—ã¦ã„ã¾ã™" +msgid "cannot convert whole-row table reference" +msgstr "行全体テーブルå‚照を変æ›ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:2597 +#: commands/tablecmds.c:2792 parser/parse_utilcmd.c:1266 #, c-format -msgid "inherited column \"%s\" has a type conflict" -msgstr "継承ã•れる列\"%s\"ã®åž‹ãŒç«¶åˆã—ã¦ã„ã¾ã™" +msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "制約\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã¸ã®è¡Œå…¨ä½“å‚ç…§ã‚’å«ã¿ã¾ã™ã€‚" -#: commands/tablecmds.c:2599 commands/tablecmds.c:2628 commands/tablecmds.c:2647 commands/tablecmds.c:2919 commands/tablecmds.c:2955 commands/tablecmds.c:2971 parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 parser/parse_param.c:223 +#: commands/tablecmds.c:2846 parser/parse_utilcmd.c:1309 #, c-format -msgid "%s versus %s" -msgstr "%s対%s" +msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "制約\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã¸ã®è¡Œå…¨ä½“å‚ç…§ã‚’å«ã¿ã¾ã™ã€‚" -#: commands/tablecmds.c:2612 +#: commands/tablecmds.c:2956 commands/tablecmds.c:3227 #, c-format -msgid "inherited column \"%s\" has a collation conflict" -msgstr "継承ã•れる列 \"%s\"ã®ç…§åˆé †åºãŒç«¶åˆã—ã¦ã„ã¾ã™" +msgid "column \"%s\" inherits from generated column but specifies default" +msgstr "列\"%s\"ã¯ç”Ÿæˆåˆ—を継承ã—ã¾ã™ãŒã€default 指定ãŒã•れã¦ã„ã¾ã™" -#: commands/tablecmds.c:2614 commands/tablecmds.c:2935 commands/tablecmds.c:6849 +#: commands/tablecmds.c:2961 commands/tablecmds.c:3232 #, c-format -msgid "\"%s\" versus \"%s\"" -msgstr "\"%s\"対\"%s\"" +msgid "column \"%s\" inherits from generated column but specifies identity" +msgstr "列\"%s\"ã¯ç”Ÿæˆåˆ—を継承ã—ã¾ã™ãŒã€è­˜åˆ¥åˆ—ã¨æŒ‡å®šã•れã¦ã„ã¾ã™" -#: commands/tablecmds.c:2626 +#: commands/tablecmds.c:2969 commands/tablecmds.c:3240 #, c-format -msgid "inherited column \"%s\" has a storage parameter conflict" -msgstr "継承ã•れる列 \"%s\"ã®æ ¼ç´ãƒ‘ラメーターãŒç«¶åˆã—ã¦ã„ã¾ã™" +msgid "child column \"%s\" specifies generation expression" +msgstr "å­ãƒ†ãƒ¼ãƒ–ルã®åˆ—\"%s\"ã¯ç”Ÿæˆå¼ã‚’指定ã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:2645 commands/tablecmds.c:2969 +#: commands/tablecmds.c:2971 commands/tablecmds.c:3242 #, c-format -msgid "column \"%s\" has a compression method conflict" -msgstr "列\"%s\"ã®åœ§ç¸®æ–¹å¼ãŒç«¶åˆã—ã¦ã„ã¾ã™" +msgid "A child table column cannot be generated unless its parent column is." +msgstr "å­ãƒ†ãƒ¼ãƒ–ルã®åˆ—ã¯ã€è¦ªã¨ãªã‚‹åˆ—ãŒç”Ÿæˆåˆ—ã§ãªã‘れã°ç”Ÿæˆåˆ—ã«ã¯ã§ãã¾ã›ã‚“。" -#: commands/tablecmds.c:2661 +#: commands/tablecmds.c:3017 #, c-format -msgid "inherited column \"%s\" has a generation conflict" -msgstr "継承ã•れãŸåˆ— \"%s\"ã®ç”ŸæˆãŒç«¶åˆã—ã¦ã„ã¾ã™" +msgid "column \"%s\" inherits conflicting generation expressions" +msgstr "列\"%s\"ã¯ç«¶åˆã™ã‚‹ç”Ÿæˆå¼ã‚’継承ã—ã¾ã™" -#: commands/tablecmds.c:2767 commands/tablecmds.c:2822 commands/tablecmds.c:12456 parser/parse_utilcmd.c:1298 parser/parse_utilcmd.c:1341 parser/parse_utilcmd.c:1740 parser/parse_utilcmd.c:1848 +#: commands/tablecmds.c:3019 #, c-format -msgid "cannot convert whole-row table reference" -msgstr "行全体テーブルå‚照を変æ›ã§ãã¾ã›ã‚“" +msgid "To resolve the conflict, specify a generation expression explicitly." +msgstr "ã“ã®ç«¶åˆã‚’解消ã™ã‚‹ã«ã¯æ˜Žç¤ºçš„ã«ç”Ÿæˆå¼ã‚’指定ã—ã¦ãã ã•ã„。" -#: commands/tablecmds.c:2768 parser/parse_utilcmd.c:1299 +#: commands/tablecmds.c:3023 #, c-format -msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." -msgstr "制約\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã¸ã®è¡Œå…¨ä½“å‚ç…§ã‚’å«ã¿ã¾ã™ã€‚" +msgid "column \"%s\" inherits conflicting default values" +msgstr "列\"%s\"ã¯ç«¶åˆã™ã‚‹ãƒ‡ãƒ•ォルト値を継承ã—ã¾ã™" -#: commands/tablecmds.c:2823 parser/parse_utilcmd.c:1342 +#: commands/tablecmds.c:3025 #, c-format -msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." -msgstr "制約\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã¸ã®è¡Œå…¨ä½“å‚ç…§ã‚’å«ã¿ã¾ã™ã€‚" +msgid "To resolve the conflict, specify a default explicitly." +msgstr "ç«¶åˆã‚’解消ã™ã‚‹ã«ã¯æ˜Žç¤ºçš„ã«ãƒ‡ãƒ•ォルトを指定ã—ã¦ãã ã•ã„" + +#: commands/tablecmds.c:3080 +#, c-format +msgid "check constraint name \"%s\" appears multiple times but with different expressions" +msgstr "ç•°ãªã‚‹å¼ã‚’æŒã¤æ¤œæŸ»åˆ¶ç´„å\"%s\"ãŒè¤‡æ•°ã‚りã¾ã™ã€‚" -#: commands/tablecmds.c:2901 +#: commands/tablecmds.c:3131 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "継承ã•れる定義ã§åˆ—\"%s\"をマージã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:2905 +#: commands/tablecmds.c:3135 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "継承ã•れる定義ã§åˆ—\"%s\"を移動ã—ã¦ãƒžãƒ¼ã‚¸ã—ã¾ã™" -#: commands/tablecmds.c:2906 +#: commands/tablecmds.c:3136 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒæŒ‡å®šã—ãŸåˆ—ãŒç¶™æ‰¿ã—ãŸåˆ—ã®ä½ç½®ã«ç§»å‹•ã•れã¾ã—ãŸã€‚" -#: commands/tablecmds.c:2917 +#: commands/tablecmds.c:3148 #, c-format msgid "column \"%s\" has a type conflict" msgstr "列\"%s\"ã®åž‹ãŒç«¶åˆã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:2933 +#: commands/tablecmds.c:3150 commands/tablecmds.c:3184 commands/tablecmds.c:3200 commands/tablecmds.c:3307 commands/tablecmds.c:3340 commands/tablecmds.c:3356 parser/parse_coerce.c:2192 parser/parse_coerce.c:2212 parser/parse_coerce.c:2232 parser/parse_coerce.c:2253 parser/parse_coerce.c:2308 parser/parse_coerce.c:2342 parser/parse_coerce.c:2418 parser/parse_coerce.c:2449 parser/parse_coerce.c:2488 parser/parse_coerce.c:2555 parser/parse_param.c:223 #, c-format -msgid "column \"%s\" has a collation conflict" -msgstr "列\"%s\"ã®ç…§åˆé †åºãŒç«¶åˆã—ã¦ã„ã¾ã™" - -#: commands/tablecmds.c:2953 -#, c-format -msgid "column \"%s\" has a storage parameter conflict" -msgstr "列\"%s\"ã®æ ¼ç´ãƒ‘ラメーターãŒç«¶åˆã—ã¦ã„ã¾ã™" +msgid "%s versus %s" +msgstr "%s対%s" -#: commands/tablecmds.c:2999 commands/tablecmds.c:3086 +#: commands/tablecmds.c:3162 #, c-format -msgid "column \"%s\" inherits from generated column but specifies default" -msgstr "列\"%s\"ã¯ç”Ÿæˆåˆ—を継承ã—ã¾ã™ãŒã€default 指定ãŒã•れã¦ã„ã¾ã™" +msgid "column \"%s\" has a collation conflict" +msgstr "列\"%s\"ã®ç…§åˆé †åºãŒç«¶åˆã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:3004 commands/tablecmds.c:3091 +#: commands/tablecmds.c:3164 commands/tablecmds.c:3326 commands/tablecmds.c:7080 #, c-format -msgid "column \"%s\" inherits from generated column but specifies identity" -msgstr "列\"%s\"ã¯ç”Ÿæˆåˆ—を継承ã—ã¾ã™ãŒã€è­˜åˆ¥åˆ—ã¨æŒ‡å®šã•れã¦ã„ã¾ã™" +msgid "\"%s\" versus \"%s\"" +msgstr "\"%s\"対\"%s\"" -#: commands/tablecmds.c:3012 commands/tablecmds.c:3099 +#: commands/tablecmds.c:3182 #, c-format -msgid "child column \"%s\" specifies generation expression" -msgstr "å­ãƒ†ãƒ¼ãƒ–ルã®åˆ—\"%s\"ã¯ç”Ÿæˆå¼ã‚’指定ã—ã¦ã„ã¾ã™" +msgid "column \"%s\" has a storage parameter conflict" +msgstr "列\"%s\"ã§ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãƒ‘ラメータãŒç«¶åˆã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:3014 commands/tablecmds.c:3101 +#: commands/tablecmds.c:3198 commands/tablecmds.c:3354 #, c-format -msgid "A child table column cannot be generated unless its parent column is." -msgstr "å­ãƒ†ãƒ¼ãƒ–ルã®åˆ—ã¯ã€è¦ªã¨ãªã‚‹åˆ—ãŒç”Ÿæˆåˆ—ã§ãªã‘れã°ç”Ÿæˆåˆ—ã«ã¯ã§ãã¾ã›ã‚“。" +msgid "column \"%s\" has a compression method conflict" +msgstr "列\"%s\"ã§åœ§ç¸®æ–¹å¼ãŒç«¶åˆã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:3147 +#: commands/tablecmds.c:3293 #, c-format -msgid "column \"%s\" inherits conflicting generation expressions" -msgstr "列\"%s\"ã¯ç«¶åˆã™ã‚‹ç”Ÿæˆå¼ã‚’継承ã—ã¾ã™" +msgid "merging multiple inherited definitions of column \"%s\"" +msgstr "複数ã®ç¶™æ‰¿ã•れる列\"%s\"ã®å®šç¾©ã‚’マージã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:3149 +#: commands/tablecmds.c:3305 #, c-format -msgid "To resolve the conflict, specify a generation expression explicitly." -msgstr "ã“ã®ç«¶åˆã‚’解消ã™ã‚‹ã«ã¯æ˜Žç¤ºçš„ã«ç”Ÿæˆå¼ã‚’指定ã—ã¦ãã ã•ã„。" +msgid "inherited column \"%s\" has a type conflict" +msgstr "継承ã•れる列\"%s\"ã®åž‹ãŒç«¶åˆã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:3153 +#: commands/tablecmds.c:3324 #, c-format -msgid "column \"%s\" inherits conflicting default values" -msgstr "列\"%s\"ã¯ç«¶åˆã™ã‚‹ãƒ‡ãƒ•ォルト値を継承ã—ã¾ã™" +msgid "inherited column \"%s\" has a collation conflict" +msgstr "継承ã•れる列 \"%s\"ã®ç…§åˆé †åºãŒç«¶åˆã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:3155 +#: commands/tablecmds.c:3338 #, c-format -msgid "To resolve the conflict, specify a default explicitly." -msgstr "ç«¶åˆã‚’解消ã™ã‚‹ã«ã¯æ˜Žç¤ºçš„ã«ãƒ‡ãƒ•ォルトを指定ã—ã¦ãã ã•ã„" +msgid "inherited column \"%s\" has a storage parameter conflict" +msgstr "継承ã•れる列\"%s\"ã§ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ãƒ‘ラメータãŒç«¶åˆã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:3205 +#: commands/tablecmds.c:3366 #, c-format -msgid "check constraint name \"%s\" appears multiple times but with different expressions" -msgstr "ç•°ãªã‚‹å¼ã‚’æŒã¤æ¤œæŸ»åˆ¶ç´„å\"%s\"ãŒè¤‡æ•°ã‚りã¾ã™ã€‚" +msgid "inherited column \"%s\" has a generation conflict" +msgstr "継承ã•れãŸåˆ— \"%s\"ã®ç”ŸæˆãŒç«¶åˆã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:3418 +#: commands/tablecmds.c:3597 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚テーブルを移動ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:3488 +#: commands/tablecmds.c:3670 #, c-format msgid "cannot rename column of typed table" msgstr "型付ã‘ã•れãŸãƒ†ãƒ¼ãƒ–ルã®åˆ—をリãƒãƒ¼ãƒ ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:3507 +#: commands/tablecmds.c:3689 #, c-format msgid "cannot rename columns of relation \"%s\"" msgstr "リレーション\"%s\"ã®åˆ—åã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:3602 +#: commands/tablecmds.c:3784 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "継承ã•れる列\"%s\"ã®åå‰ã‚’å­ãƒ†ãƒ¼ãƒ–ルã§ã‚‚変更ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/tablecmds.c:3634 +#: commands/tablecmds.c:3816 #, c-format msgid "cannot rename system column \"%s\"" msgstr "システム列%s\"ã®åå‰ã‚’変更ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:3649 +#: commands/tablecmds.c:3831 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "継承ã•れる列\"%s\"ã®åå‰ã‚’変更ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:3801 +#: commands/tablecmds.c:3983 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "継承ã•れる制約\"%s\"ã®åå‰ã‚’å­ãƒ†ãƒ¼ãƒ–ルã§ã‚‚変更ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/tablecmds.c:3808 +#: commands/tablecmds.c:3990 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "継承ã•れる制約\"%s\"ã®åå‰ã‚’変更ã§ãã¾ã›ã‚“" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4105 +#: commands/tablecmds.c:4290 #, c-format msgid "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã§å®Ÿè¡Œä¸­ã®å•ã„åˆã‚ã›ã§ä½¿ç”¨ã•れã¦ã„ã‚‹ãŸã‚\"%2$s\"ã‚’%1$sã§ãã¾ã›ã‚“" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4114 +#: commands/tablecmds.c:4299 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "ä¿ç•™ä¸­ã®ãƒˆãƒªã‚¬ã‚¤ãƒ™ãƒ³ãƒˆãŒã‚ã‚‹ãŸã‚\"%2$s\"ã‚’%1$sã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:4581 +#: commands/tablecmds.c:4325 +#, c-format +msgid "cannot alter temporary tables of other sessions" +msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚テーブルã¯å¤‰æ›´ã§ãã¾ã›ã‚“" + +#: commands/tablecmds.c:4798 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "パーティションå­ãƒ†ãƒ¼ãƒ–ル\"%s\"ã¯ä¸å®Œå…¨ãªå–り外ã—状態ã§ã‚ã‚‹ãŸã‚変更ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:4774 commands/tablecmds.c:4789 +#: commands/tablecmds.c:5002 commands/tablecmds.c:5017 #, c-format msgid "cannot change persistence setting twice" msgstr "永続性設定ã®å¤‰æ›´ã¯2度ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:4810 -#, c-format -msgid "cannot change access method of a partitioned table" -msgstr "パーティション親テーブルã®ã‚¢ã‚¯ã‚»ã‚¹ãƒ¡ã‚½ãƒƒãƒ‰ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" - -#: commands/tablecmds.c:4816 +#: commands/tablecmds.c:5038 #, c-format msgid "cannot have multiple SET ACCESS METHOD subcommands" msgstr "SET ACCESS METHODサブコマンドを複数指定ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:5537 +#: commands/tablecmds.c:5768 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "システムリレーション\"%sã‚’æ›¸ãæ›ãˆã‚‰ã‚Œã¾ã›ã‚“" -#: commands/tablecmds.c:5543 +#: commands/tablecmds.c:5774 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "カタログテーブルã¨ã—ã¦ä½¿ç”¨ã•れã¦ã„るテーブル\"%s\"ã¯æ›¸ãæ›ãˆã‚‰ã‚Œã¾ã›ã‚“" -#: commands/tablecmds.c:5553 +#: commands/tablecmds.c:5786 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚ãƒ†ãƒ¼ãƒ–ãƒ«ã‚’æ›¸ãæ›ãˆã‚‰ã‚Œã¾ã›ã‚“" -#: commands/tablecmds.c:6048 +#: commands/tablecmds.c:6281 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã«NULL値ãŒã‚りã¾ã™" -#: commands/tablecmds.c:6065 +#: commands/tablecmds.c:6298 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "一部ã®è¡ŒãŒãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%2$s\"ã®æ¤œæŸ»åˆ¶ç´„\"%1$s\"ã«é•åã—ã¦ã¾ã™" -#: commands/tablecmds.c:6084 partitioning/partbounds.c:3388 +#: commands/tablecmds.c:6317 partitioning/partbounds.c:3387 #, c-format msgid "updated partition constraint for default partition \"%s\" would be violated by some row" msgstr "デフォルトパーティション\"%s\"ã®ä¸€éƒ¨ã®è¡ŒãŒæ›´æ–°å¾Œã®ãƒ‘ーティション制約ã«é•åã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:6090 +#: commands/tablecmds.c:6323 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "一部ã®è¡ŒãŒãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã®ãƒ‘ーティション制約ã«é•åã—ã¦ã„ã¾ã™" #. translator: %s is a group of some SQL keywords -#: commands/tablecmds.c:6352 +#: commands/tablecmds.c:6588 #, c-format msgid "ALTER action %s cannot be performed on relation \"%s\"" msgstr "ALTERã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³%sã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:6607 commands/tablecmds.c:6614 +#: commands/tablecmds.c:6843 commands/tablecmds.c:6850 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "åž‹\"%s\"を変更ã§ãã¾ã›ã‚“。列\"%s\".\"%s\"ã§ãã®åž‹ã‚’使用ã—ã¦ã„ã‚‹ãŸã‚ã§ã™" -#: commands/tablecmds.c:6621 +#: commands/tablecmds.c:6857 #, c-format msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "列%2$s\".\"%3$s\"ãŒãã®è¡Œåž‹ã‚’使用ã—ã¦ã„ã‚‹ãŸã‚ã€å¤–部テーブル\"%1$s\"を変更ã§ãã¾ã›ã‚“。" -#: commands/tablecmds.c:6628 +#: commands/tablecmds.c:6864 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "テーブル\"%s\"を変更ã§ãã¾ã›ã‚“。ãã®è¡Œåž‹ã‚’列\"%s\".\"%s\"ã§ä½¿ç”¨ã—ã¦ã„ã‚‹ãŸã‚ã§ã™" -#: commands/tablecmds.c:6684 +#: commands/tablecmds.c:6920 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "型付ã‘ã•れãŸãƒ†ãƒ¼ãƒ–ルã®åž‹ã§ã‚ã‚‹ãŸã‚ã€å¤–部テーブル\"%s\"を変更ã§ãã¾ã›ã‚“。" -#: commands/tablecmds.c:6686 +#: commands/tablecmds.c:6922 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "型付ã‘ã•れãŸãƒ†ãƒ¼ãƒ–ルを変更ã™ã‚‹å ´åˆã‚‚ ALTER .. CASCADE を使用ã—ã¦ãã ã•ã„" -#: commands/tablecmds.c:6732 +#: commands/tablecmds.c:6968 #, c-format msgid "type %s is not a composite type" msgstr "åž‹ %s ã¯è¤‡åˆåž‹ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:6759 +#: commands/tablecmds.c:6995 #, c-format msgid "cannot add column to typed table" msgstr "型付ã‘ã•れãŸãƒ†ãƒ¼ãƒ–ルã«åˆ—を追加ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:6812 +#: commands/tablecmds.c:7043 #, c-format msgid "cannot add column to a partition" msgstr "パーティションã«åˆ—ã¯è¿½åŠ ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:6841 commands/tablecmds.c:15165 +#: commands/tablecmds.c:7072 commands/tablecmds.c:15893 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "å­ãƒ†ãƒ¼ãƒ–ル\"%s\"ã«ç•°ãªã‚‹åž‹ã®åˆ—\"%s\"ãŒã‚りã¾ã™" -#: commands/tablecmds.c:6847 commands/tablecmds.c:15172 +#: commands/tablecmds.c:7078 commands/tablecmds.c:15899 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "å­ãƒ†ãƒ¼ãƒ–ル\"%s\"ã«ç•°ãªã‚‹ç…§åˆé †åºã®åˆ—\"%s\"ãŒã‚りã¾ã™" -#: commands/tablecmds.c:6865 +#: commands/tablecmds.c:7096 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "å­\"%2$s\"ã®åˆ—\"%1$s\"ã®å®šç¾©ã‚’マージã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:6908 +#: commands/tablecmds.c:7149 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "å­ãƒ†ãƒ¼ãƒ–ルをæŒã¤ãƒ†ãƒ¼ãƒ–ルã«è­˜åˆ¥åˆ—ã‚’å†å¸°çš„ã«è¿½åŠ ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:7159 +#: commands/tablecmds.c:7395 #, c-format msgid "column must be added to child tables too" msgstr "列ã¯å­ãƒ†ãƒ¼ãƒ–ルã§ã‚‚追加ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/tablecmds.c:7237 +#: commands/tablecmds.c:7473 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/tablecmds.c:7244 +#: commands/tablecmds.c:7480 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/tablecmds.c:7310 commands/tablecmds.c:12094 +#: commands/tablecmds.c:7546 commands/tablecmds.c:12685 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" -msgstr "パーティションãŒå­˜åœ¨ã™ã‚‹å ´åˆã«ã¯ãƒ‘ーティション親テーブルã®ã¿ã‹ã‚‰åˆ¶ç´„を削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" +msgstr "å­ãƒ†ãƒ¼ãƒ–ルãŒå­˜åœ¨ã™ã‚‹å ´åˆã«ã¯ãƒ‘ーティション親テーブルã®ã¿ã‹ã‚‰åˆ¶ç´„を削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:7311 commands/tablecmds.c:7628 commands/tablecmds.c:8593 commands/tablecmds.c:12095 +#: commands/tablecmds.c:7547 commands/tablecmds.c:7861 commands/tablecmds.c:8039 commands/tablecmds.c:8146 commands/tablecmds.c:8263 commands/tablecmds.c:9082 commands/tablecmds.c:12686 #, c-format msgid "Do not specify the ONLY keyword." msgstr "ONLYキーワードを指定ã—ãªã„ã§ãã ã•ã„。" -#: commands/tablecmds.c:7348 commands/tablecmds.c:7554 commands/tablecmds.c:7696 commands/tablecmds.c:7810 commands/tablecmds.c:7904 commands/tablecmds.c:7963 commands/tablecmds.c:8082 commands/tablecmds.c:8221 commands/tablecmds.c:8291 commands/tablecmds.c:8425 commands/tablecmds.c:12249 commands/tablecmds.c:13753 commands/tablecmds.c:16282 +#: commands/tablecmds.c:7583 commands/tablecmds.c:7787 commands/tablecmds.c:7929 commands/tablecmds.c:8061 commands/tablecmds.c:8190 commands/tablecmds.c:8284 commands/tablecmds.c:8385 commands/tablecmds.c:8542 commands/tablecmds.c:8695 commands/tablecmds.c:8776 commands/tablecmds.c:8910 commands/tablecmds.c:12839 commands/tablecmds.c:14381 commands/tablecmds.c:17008 #, c-format msgid "cannot alter system column \"%s\"" msgstr "システム列\"%s\"を変更ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:7354 commands/tablecmds.c:7702 +#: commands/tablecmds.c:7589 commands/tablecmds.c:7935 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯è­˜åˆ¥åˆ—ã§ã™" -#: commands/tablecmds.c:7397 +#: commands/tablecmds.c:7630 #, c-format msgid "column \"%s\" is in a primary key" msgstr "列\"%s\"ã¯ãƒ—ライマリキーã§ä½¿ç”¨ã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:7402 +#: commands/tablecmds.c:7635 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "列\"%s\"ã¯è¤‡è£½è­˜åˆ¥ã¨ã—ã¦ä½¿ç”¨ä¸­ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã«å«ã¾ã‚Œã¦ã„ã¾ã™" -#: commands/tablecmds.c:7425 +#: commands/tablecmds.c:7658 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "列\"%s\"ã¯è¦ªãƒ†ãƒ¼ãƒ–ルã§NOT NULL指定ã•れã¦ã„ã¾ã™" -#: commands/tablecmds.c:7625 commands/tablecmds.c:9077 +#: commands/tablecmds.c:7858 commands/tablecmds.c:9566 #, c-format msgid "constraint must be added to child tables too" msgstr "制約ã¯å­ãƒ†ãƒ¼ãƒ–ルã«ã‚‚追加ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/tablecmds.c:7626 +#: commands/tablecmds.c:7859 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." -msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯ã™ã§ã«NOT NULLLã§ã¯ã‚りã¾ã›ã‚“。" +msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯ã™ã§ã«NOT NULLã§ã¯ã‚りã¾ã›ã‚“。" -#: commands/tablecmds.c:7704 -#, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." -msgstr "代ã‚り㫠ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY を使ã£ã¦ãã ã•ã„。" - -#: commands/tablecmds.c:7709 +#: commands/tablecmds.c:7944 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯ç”Ÿæˆã‚«ãƒ©ãƒ ã§ã™" -#: commands/tablecmds.c:7712 +#: commands/tablecmds.c:8038 +#, c-format +msgid "cannot add identity to a column of only the partitioned table" +msgstr "パーティション親テーブルã®ã¿ã§åˆ—を識別列ã¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: commands/tablecmds.c:8044 #, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." -msgstr "代ã‚り㫠ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION を使ã£ã¦ãã ã•ã„。" +msgid "cannot add identity to a column of a partition" +msgstr "パーティションå­ãƒ†ãƒ¼ãƒ–ルã®åˆ—を識別列ã¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:7821 +#: commands/tablecmds.c:8072 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "識別列を追加ã™ã‚‹ã«ã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã®åˆ—\"%s\"ã¯NOT NULLã¨å®£è¨€ã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/tablecmds.c:7827 +#: commands/tablecmds.c:8078 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯ã™ã§ã«è­˜åˆ¥åˆ—ã§ã™" -#: commands/tablecmds.c:7833 +#: commands/tablecmds.c:8084 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯ã™ã§ã«ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ãŒæŒ‡å®šã•れã¦ã„ã¾ã™" -#: commands/tablecmds.c:7910 commands/tablecmds.c:7971 +#: commands/tablecmds.c:8145 +#, c-format +msgid "cannot change identity column of only the partitioned table" +msgstr "パーティション親テーブルã®ã¿ã§åˆ—ã®è­˜åˆ¥åˆ—属性を変更ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: commands/tablecmds.c:8151 +#, c-format +msgid "cannot change identity column of a partition" +msgstr "パーティションå­ãƒ†ãƒ¼ãƒ–ルã®åˆ—ã®è­˜åˆ¥åˆ—属性を変更ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: commands/tablecmds.c:8196 commands/tablecmds.c:8292 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯è­˜åˆ¥åˆ—ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:7976 +#: commands/tablecmds.c:8262 +#, c-format +msgid "cannot drop identity from a column of only the partitioned table" +msgstr "パーティション親テーブルã®ã¿ã§åˆ—ã®è­˜åˆ¥åˆ—属性を削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: commands/tablecmds.c:8268 +#, c-format +msgid "cannot drop identity from a column of a partition" +msgstr "パーティションå­ãƒ†ãƒ¼ãƒ–ルã®åˆ—ã®è­˜åˆ¥åˆ—属性を削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: commands/tablecmds.c:8297 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯è­˜åˆ¥åˆ—ã§ã¯ã‚りã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/tablecmds.c:8029 +#: commands/tablecmds.c:8391 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not a generated column" +msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯ç”Ÿæˆåˆ—ã§ã¯ã‚りã¾ã›ã‚“" + +#: commands/tablecmds.c:8489 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "ALTER TABLE / DROP EXPRESSIONã¯å­ãƒ†ãƒ¼ãƒ–ルã«å¯¾ã—ã¦ã‚‚é©ç”¨ã•れãªãã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/tablecmds.c:8051 +#: commands/tablecmds.c:8511 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "継承列ã‹ã‚‰ç”Ÿæˆå¼ã‚’削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:8090 +#: commands/tablecmds.c:8550 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯æ ¼ç´ç”Ÿæˆåˆ—ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:8095 +#: commands/tablecmds.c:8555 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯æ ¼ç´ç”Ÿæˆåˆ—ã§ã¯ã‚りã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/tablecmds.c:8168 +#: commands/tablecmds.c:8633 #, c-format msgid "cannot refer to non-index column by number" msgstr "éžã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åˆ—を番å·ã§å‚ç…§ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:8211 +#: commands/tablecmds.c:8685 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "リレーション \"%2$s\"ã®åˆ— %1$d ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tablecmds.c:8230 +#: commands/tablecmds.c:8704 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "インデックス\"%2$s\"ã®åŒ…å«åˆ—\"%1$s\"ã¸ã®çµ±è¨ˆæƒ…å ±ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:8235 +#: commands/tablecmds.c:8709 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "インデックス \"%2$s\"ã®éžå¼åˆ—\"%1$s\"ã®çµ±è¨ˆæƒ…å ±ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:8237 +#: commands/tablecmds.c:8711 #, c-format msgid "Alter statistics on table column instead." msgstr "代ã‚りã«ãƒ†ãƒ¼ãƒ–ルカラムã®çµ±è¨ˆæƒ…報を変更ã—ã¦ãã ã•ã„。" -#: commands/tablecmds.c:8472 +#: commands/tablecmds.c:8957 #, c-format msgid "cannot drop column from typed table" msgstr "型付ã‘ã•れãŸãƒ†ãƒ¼ãƒ–ルã‹ã‚‰åˆ—を削除ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:8531 +#: commands/tablecmds.c:9020 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/tablecmds.c:8544 +#: commands/tablecmds.c:9033 #, c-format msgid "cannot drop system column \"%s\"" msgstr "システム列\"%s\"を削除ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:8554 +#: commands/tablecmds.c:9043 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "継承ã•れる列\"%s\"を削除ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:8567 +#: commands/tablecmds.c:9056 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "列\"%s\"ã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã®ãƒ‘ーティションキーã®ä¸€éƒ¨ã§ã‚ã‚‹ãŸã‚ã€å‰Šé™¤ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:8592 +#: commands/tablecmds.c:9081 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "å­ãƒ†ãƒ¼ãƒ–ルãŒå­˜åœ¨ã™ã‚‹å ´åˆã«ã¯ãƒ‘ーティション親テーブルã®ã¿ã‹ã‚‰åˆ—を削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:8797 +#: commands/tablecmds.c:9286 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX ã¯ãƒ‘ーティションテーブルã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/tablecmds.c:8822 +#: commands/tablecmds.c:9311 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX ã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\"%s\"ã‚’\"%s\"ã«ãƒªãƒãƒ¼ãƒ ã—ã¾ã™" -#: commands/tablecmds.c:9159 +#: commands/tablecmds.c:9648 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "パーティションテーブル\"%s\"上ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã‚’å‚ç…§ã™ã‚‹å¤–部キー定義ã§ã¯ONLY指定ã¯ã§ãã¾ã›ã‚“ " -#: commands/tablecmds.c:9165 +#: commands/tablecmds.c:9654 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "パーティションテーブル\"%1$s\"ã«ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%2$s\"ã‚’å‚ç…§ã™ã‚‹ NOT VALID 指定ã®å¤–部キーã¯è¿½åŠ ã§ãã¾ã›ã‚“ " -#: commands/tablecmds.c:9168 +#: commands/tablecmds.c:9657 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "ã“ã®æ©Ÿèƒ½ã¯ãƒ‘ーティションテーブルã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。" -#: commands/tablecmds.c:9175 commands/tablecmds.c:9631 +#: commands/tablecmds.c:9664 commands/tablecmds.c:10125 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "å‚ç…§å…ˆã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ルã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:9198 +#: commands/tablecmds.c:9687 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "永続テーブルã®åˆ¶ç´„ã¯æ°¸ç¶šãƒ†ãƒ¼ãƒ–ルã ã‘ã‚’å‚ç…§ã§ãã¾ã™" -#: commands/tablecmds.c:9205 +#: commands/tablecmds.c:9694 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "UNLOGGEDテーブルã«å¯¾ã™ã‚‹åˆ¶ç´„ã¯ã€æ°¸ç¶šãƒ†ãƒ¼ãƒ–ルã¾ãŸã¯UNLOGGEDテーブルã ã‘ã‚’å‚ç…§ã™ã‚‹å ´åˆãŒã‚りã¾ã™" -#: commands/tablecmds.c:9211 +#: commands/tablecmds.c:9700 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "一時テーブルã«å¯¾ã™ã‚‹åˆ¶ç´„ã¯ä¸€æ™‚テーブルã ã‘ã‚’å‚ç…§ã™ã‚‹å ´åˆãŒã‚りã¾ã™" -#: commands/tablecmds.c:9215 +#: commands/tablecmds.c:9704 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "一時テーブルã«å¯¾ã™ã‚‹åˆ¶ç´„ã«ã¯ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚テーブルを加ãˆã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/tablecmds.c:9279 commands/tablecmds.c:9285 +#: commands/tablecmds.c:9768 commands/tablecmds.c:9774 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "生æˆã‚«ãƒ©ãƒ ã‚’å«ã‚€å¤–部キー制約ã«å¯¾ã™ã‚‹ä¸æ­£ãª %s 処ç†" -#: commands/tablecmds.c:9301 +#: commands/tablecmds.c:9790 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "外部キーã®å‚照列数ã¨è¢«å‚照列数ãŒåˆã„ã¾ã›ã‚“" -#: commands/tablecmds.c:9408 +#: commands/tablecmds.c:9897 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "外部キー制約\"%sã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: commands/tablecmds.c:9410 +#: commands/tablecmds.c:9899 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "キーã¨ãªã‚‹åˆ—\"%s\"ã¨\"%s\"ã¨ã®é–“ã§åž‹ã«äº’æ›æ€§ãŒã‚りã¾ã›ã‚“:%sã¨%s" -#: commands/tablecmds.c:9567 +#: commands/tablecmds.c:10068 #, c-format msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" msgstr "ON DELETE SETアクションã§å‚ç…§ã•れã¦ã„る列\"%s\"ã¯å¤–部キーã®ä¸€éƒ¨ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/tablecmds.c:9841 commands/tablecmds.c:10311 parser/parse_utilcmd.c:791 parser/parse_utilcmd.c:920 +#: commands/tablecmds.c:10425 commands/tablecmds.c:10865 parser/parse_utilcmd.c:822 parser/parse_utilcmd.c:945 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "外部テーブルã§ã¯å¤–部キー制約ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/tablecmds.c:10864 commands/tablecmds.c:11142 commands/tablecmds.c:12051 commands/tablecmds.c:12126 +#: commands/tablecmds.c:10848 +#, c-format +msgid "cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"" +msgstr "外部キー\"%2$s\"ã§å‚ç…§ã•れã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¼ãƒ–ル\"%1$s\"ã‚’å­ãƒ†ãƒ¼ãƒ–ルã¨ã—ã¦ã‚¢ã‚¿ãƒƒãƒã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: commands/tablecmds.c:11449 commands/tablecmds.c:11730 commands/tablecmds.c:12642 commands/tablecmds.c:12716 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"ã®åˆ¶ç´„\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tablecmds.c:10871 +#: commands/tablecmds.c:11456 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "リレーション\"%2$s\"ã®åˆ¶ç´„\"%1$s\"ã¯å¤–部キー制約ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:10909 +#: commands/tablecmds.c:11494 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "リレーション\"%2$s\"ã®åˆ¶ç´„\"%1$s\"を変更ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:10912 +#: commands/tablecmds.c:11497 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "制約\"%1$s\"ã¯ã€ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%3$s\"上ã®åˆ¶ç´„\"%2$s\"ã‹ã‚‰æ´¾ç”Ÿã—ã¦ã„ã¾ã™ã€‚" -#: commands/tablecmds.c:10914 +#: commands/tablecmds.c:11499 #, c-format -msgid "You may alter the constraint it derives from, instead." +msgid "You may alter the constraint it derives from instead." msgstr "ã“ã®åˆ¶ç´„ã®ä»£ã‚ã‚Šã«æ´¾ç”Ÿå…ƒã®åˆ¶ç´„を変更ã™ã‚‹ã“ã¨ã¯å¯èƒ½ã§ã™ã€‚" -#: commands/tablecmds.c:11150 +#: commands/tablecmds.c:11738 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "リレーション\"%2$s\"ã®åˆ¶ç´„\"%1$s\"ã¯å¤–部キー制約ã§ã‚‚検査制約ã§ã‚‚ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:11227 +#: commands/tablecmds.c:11815 #, c-format msgid "constraint must be validated on child tables too" msgstr "制約ã¯å­ãƒ†ãƒ¼ãƒ–ルã§ã‚‚検証ã•れる必è¦ãŒã‚りã¾ã™" -#: commands/tablecmds.c:11314 +#: commands/tablecmds.c:11902 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "外部キー制約ã§å‚ç…§ã•れる列\"%s\"ãŒå­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tablecmds.c:11320 +#: commands/tablecmds.c:11908 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "システム列ã¯å¤–部キーã«ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:11324 +#: commands/tablecmds.c:11912 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "外部キーã§ã¯%dã‚’è¶…ãˆã‚‹ã‚­ãƒ¼ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:11389 +#: commands/tablecmds.c:11977 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "被å‚照テーブル\"%s\"ã«ã¯é…å»¶å¯èƒ½ãƒ—ライマリキーã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:11406 +#: commands/tablecmds.c:11994 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "被å‚照テーブル\"%s\"ã«ã¯ãƒ—ライマリキーãŒã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:11470 +#: commands/tablecmds.c:12062 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "外部キーã®è¢«å‚照列リストã«ã¯é‡è¤‡ãŒã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/tablecmds.c:11562 +#: commands/tablecmds.c:12154 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "被å‚照テーブル\"%s\"ã«å¯¾ã—ã¦ã¯ã€é…å»¶å¯èƒ½ãªä¸€æ„性制約ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:11567 +#: commands/tablecmds.c:12159 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "被å‚照テーブル\"%s\"ã«ã€æŒ‡å®šã—ãŸã‚­ãƒ¼ã«ä¸€è‡´ã™ã‚‹ä¸€æ„性制約ãŒã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:12007 +#: commands/tablecmds.c:12598 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"ã®ç¶™æ‰¿ã•れãŸåˆ¶ç´„\"%1$s\"を削除ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:12057 +#: commands/tablecmds.c:12648 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "リレーション\"%2$s\"ã®åˆ¶ç´„\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/tablecmds.c:12233 +#: commands/tablecmds.c:12823 #, c-format msgid "cannot alter column type of typed table" msgstr "型付ã‘ã•れãŸãƒ†ãƒ¼ãƒ–ルã®åˆ—ã®åž‹ã‚’変更ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:12260 +#: commands/tablecmds.c:12849 +#, c-format +msgid "cannot specify USING when altering type of generated column" +msgstr "生æˆåˆ—ã®åž‹å¤‰æ›´ã®éš›ã«ã¯USINGを指定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: commands/tablecmds.c:12850 commands/tablecmds.c:18061 commands/tablecmds.c:18151 commands/trigger.c:656 rewrite/rewriteHandler.c:941 rewrite/rewriteHandler.c:976 +#, c-format +msgid "Column \"%s\" is a generated column." +msgstr "列\"%s\"ã¯ç”Ÿæˆã‚«ãƒ©ãƒ ã§ã™ã€‚" + +#: commands/tablecmds.c:12860 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "継承ã•れる列\"%s\"を変更ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:12269 +#: commands/tablecmds.c:12869 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "列\"%s\"ã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã®ãƒ‘ーティションキーã®ä¸€éƒ¨ã§ã‚ã‚‹ãŸã‚ã€å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:12319 +#: commands/tablecmds.c:12919 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"ã«å¯¾ã™ã‚‹USINGå¥ã®çµæžœã¯è‡ªå‹•çš„ã«%såž‹ã«åž‹å¤‰æ›ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:12322 +#: commands/tablecmds.c:12922 #, c-format msgid "You might need to add an explicit cast." msgstr "å¿…è¦ã«å¿œã˜ã¦æ˜Žç¤ºçš„ãªåž‹å¤‰æ›ã‚’追加ã—ã¦ãã ã•ã„。" -#: commands/tablecmds.c:12326 +#: commands/tablecmds.c:12926 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"ã¯åž‹%sã«ã¯è‡ªå‹•çš„ã«åž‹å¤‰æ›ã§ãã¾ã›ã‚“" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:12329 +#: commands/tablecmds.c:12930 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "å¿…è¦ã«å¿œã˜ã¦\"USING %s::%s\"を追加ã—ã¦ãã ã•ã„。" -#: commands/tablecmds.c:12428 +#: commands/tablecmds.c:13029 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"ã®ç¶™æ‰¿åˆ—\"%1$s\"ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:12457 +#: commands/tablecmds.c:13058 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USINGå¼ãŒè¡Œå…¨ä½“テーブルå‚ç…§ã‚’å«ã‚“ã§ã„ã¾ã™ã€‚" -#: commands/tablecmds.c:12468 +#: commands/tablecmds.c:13069 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "継承ã•れる列\"%s\"ã®åž‹ã‚’å­ãƒ†ãƒ¼ãƒ–ルã§å¤‰æ›´ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/tablecmds.c:12593 +#: commands/tablecmds.c:13194 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "列\"%s\"ã®åž‹ã‚’2回変更ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:12631 +#: commands/tablecmds.c:13232 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "カラム\"%s\"ã«å¯¾ã™ã‚‹ç”Ÿæˆå¼ã¯è‡ªå‹•çš„ã«%såž‹ã«ã‚­ãƒ£ã‚¹ãƒˆã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:12636 +#: commands/tablecmds.c:13237 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"ã®ãƒ‡ãƒ•ォルト値を自動的ã«%såž‹ã«ã‚­ãƒ£ã‚¹ãƒˆã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:12717 +#: commands/tablecmds.c:13541 #, c-format -msgid "cannot alter type of a column used by a view or rule" -msgstr "ビューã¾ãŸã¯ãƒ«ãƒ¼ãƒ«ã§ä½¿ç”¨ã•れる列ã®åž‹ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" +msgid "cannot alter type of a column used by a function or procedure" +msgstr "関数ã¾ãŸã¯ãƒ—ロシージャã§ä½¿ç”¨ã•れる列ã®åž‹ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:12718 commands/tablecmds.c:12737 commands/tablecmds.c:12755 +#: commands/tablecmds.c:13542 commands/tablecmds.c:13557 commands/tablecmds.c:13577 commands/tablecmds.c:13596 commands/tablecmds.c:13655 #, c-format msgid "%s depends on column \"%s\"" msgstr "%sã¯åˆ—\"%s\"ã«ä¾å­˜ã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:12736 +#: commands/tablecmds.c:13556 +#, c-format +msgid "cannot alter type of a column used by a view or rule" +msgstr "ビューã¾ãŸã¯ãƒ«ãƒ¼ãƒ«ã§ä½¿ç”¨ã•れる列ã®åž‹ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" + +#: commands/tablecmds.c:13576 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "トリガー定義ã§ä½¿ç”¨ã•れる列ã®åž‹ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:12754 +#: commands/tablecmds.c:13595 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "ãƒãƒªã‚·å®šç¾©ã§ä½¿ç”¨ã•れã¦ã„る列ã®åž‹ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:12785 +#: commands/tablecmds.c:13626 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "生æˆã‚«ãƒ©ãƒ ã§ä½¿ç”¨ã•れる列ã®åž‹ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:12786 +#: commands/tablecmds.c:13627 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "カラム\"%s\"ã¯ç”Ÿæˆã‚«ãƒ©ãƒ \"%s\"ã§ä½¿ã‚れã¦ã„ã¾ã™ã€‚" -#: commands/tablecmds.c:13861 commands/tablecmds.c:13873 +#: commands/tablecmds.c:13654 +#, c-format +msgid "cannot alter type of a column used by a publication WHERE clause" +msgstr "パブリケーションã®WHEREå¥ã§ä½¿ç”¨ã•れる列ã®åž‹ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" + +#: commands/tablecmds.c:14489 commands/tablecmds.c:14501 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "インデックス\"%s\"ã®æ‰€æœ‰è€…を変更ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:13863 commands/tablecmds.c:13875 +#: commands/tablecmds.c:14491 commands/tablecmds.c:14503 #, c-format -msgid "Change the ownership of the index's table, instead." -msgstr "代ã‚りã«ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ãƒ†ãƒ¼ãƒ–ãƒ«ã®æ‰€æœ‰è€…を変更ã—ã¦ãã ã•ã„" +msgid "Change the ownership of the index's table instead." +msgstr "代ã‚りã«ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ãƒ†ãƒ¼ãƒ–ãƒ«ã®æ‰€æœ‰è€…を変更ã—ã¦ãã ã•ã„。" -#: commands/tablecmds.c:13889 +#: commands/tablecmds.c:14517 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "シーケンス\"%s\"ã®æ‰€æœ‰è€…を変更ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:13903 commands/tablecmds.c:17201 commands/tablecmds.c:17220 -#, c-format -msgid "Use ALTER TYPE instead." -msgstr "代ã‚りã«ALTER TYPEを使用ã—ã¦ãã ã•ã„。" - -#: commands/tablecmds.c:13912 +#: commands/tablecmds.c:14542 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "リレーション\"%s\"ã®æ‰€æœ‰è€…を変更ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:14274 +#: commands/tablecmds.c:15009 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "SET TABLESPACEサブコマンドを複数指定ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:14351 +#: commands/tablecmds.c:15086 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "リレーション\"%s\"ã®ã‚ªãƒ—ションã¯è¨­å®šã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:14385 commands/view.c:445 +#: commands/tablecmds.c:15120 commands/view.c:440 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTIONã¯è‡ªå‹•æ›´æ–°å¯èƒ½ãƒ“ューã§ã®ã¿ã‚µãƒãƒ¼ãƒˆã•れã¾ã™" -#: commands/tablecmds.c:14635 +#: commands/tablecmds.c:15371 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "テーブルスペースã«ã¯ãƒ†ãƒ¼ãƒ–ルã€ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŠã‚ˆã³å®Ÿä½“化ビューã—ã‹ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:14647 +#: commands/tablecmds.c:15383 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "pg_globalテーブルスペースã¨ã®é–“ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ç§»å‹•ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:14739 +#: commands/tablecmds.c:15475 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "リレーション\"%s.%s\"ã®ãƒ­ãƒƒã‚¯ãŒç²å¾—ã§ããªã‹ã£ãŸãŸã‚中断ã—ã¾ã™" -#: commands/tablecmds.c:14755 +#: commands/tablecmds.c:15491 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "テーブルスペース\"%s\"ã«ã¯åˆè‡´ã™ã‚‹ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: commands/tablecmds.c:14873 +#: commands/tablecmds.c:15613 #, c-format msgid "cannot change inheritance of typed table" msgstr "型付ã‘ã•れãŸãƒ†ãƒ¼ãƒ–ルã®ç¶™æ‰¿ã‚’変更ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:14878 commands/tablecmds.c:15396 +#: commands/tablecmds.c:15618 commands/tablecmds.c:16118 #, c-format msgid "cannot change inheritance of a partition" msgstr "パーティションã®ç¶™æ‰¿ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:14883 +#: commands/tablecmds.c:15623 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "パーティションテーブルã®ç¶™æ‰¿ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:14929 +#: commands/tablecmds.c:15669 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚テーブルを継承ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:14942 +#: commands/tablecmds.c:15682 #, c-format msgid "cannot inherit from a partition" msgstr "パーティションã‹ã‚‰ã®ç¶™æ‰¿ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:14964 commands/tablecmds.c:17841 +#: commands/tablecmds.c:15704 commands/tablecmds.c:18562 #, c-format msgid "circular inheritance not allowed" msgstr "循環継承を行ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:14965 commands/tablecmds.c:17842 +#: commands/tablecmds.c:15705 commands/tablecmds.c:18563 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\"ã¯ã™ã§ã«\"%s\"ã®å­ã§ã™" -#: commands/tablecmds.c:14978 +#: commands/tablecmds.c:15718 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "トリガ\"%s\"ã«ã‚ˆã£ã¦ãƒ†ãƒ¼ãƒ–ル\"%s\"ãŒç¶™æ‰¿å­ãƒ†ãƒ¼ãƒ–ルã«ãªã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:14980 +#: commands/tablecmds.c:15720 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "é·ç§»ãƒ†ãƒ¼ãƒ–ルを使用ã—ãŸROWトリガã¯ç¶™æ‰¿é–¢ä¿‚ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。" -#: commands/tablecmds.c:15183 +#: commands/tablecmds.c:15909 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "å­ãƒ†ãƒ¼ãƒ–ルã®åˆ—\"%s\"ã¯NOT NULLã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/tablecmds.c:15192 +#: commands/tablecmds.c:15918 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "å­ãƒ†ãƒ¼ãƒ–ルã®åˆ—\"%s\"ã¯ç”Ÿæˆåˆ—ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/tablecmds.c:15197 +#: commands/tablecmds.c:15922 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "å­ãƒ†ãƒ¼ãƒ–ルã®åˆ—\"%s\"ã¯ç”Ÿæˆåˆ—ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/tablecmds.c:15228 +#: commands/tablecmds.c:15960 #, c-format msgid "child table is missing column \"%s\"" msgstr "å­ãƒ†ãƒ¼ãƒ–ルã«ã¯åˆ—\"%s\"ãŒã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:15316 +#: commands/tablecmds.c:16041 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "å­ãƒ†ãƒ¼ãƒ–ル\"%s\"ã§ã¯æ¤œæŸ»åˆ¶ç´„\"%s\"ã«ç•°ãªã£ãŸå®šç¾©ãŒã•れã¦ã„ã¾ã™" -#: commands/tablecmds.c:15324 +#: commands/tablecmds.c:16048 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "制約\"%s\"ã¯å­ãƒ†ãƒ¼ãƒ–ル\"%s\"上ã®ç¶™æ‰¿ã•れãªã„制約ã¨ç«¶åˆã—ã¾ã™" -#: commands/tablecmds.c:15335 +#: commands/tablecmds.c:16058 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "制約\"%s\"ã¯å­ãƒ†ãƒ¼ãƒ–ル\"%s\"ã®NOT VALID制約ã¨è¡çªã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:15374 +#: commands/tablecmds.c:16096 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "å­ãƒ†ãƒ¼ãƒ–ルã«ã¯åˆ¶ç´„\"%s\"ãŒã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:15460 +#: commands/tablecmds.c:16182 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "パーティション\"%s\"ã¯ã™ã§ã«ãƒ‘ーティションテーブル\"%s.%s\"ã‹ã‚‰ã®å–り外ã—ä¿ç•™ä¸­ã§ã™" -#: commands/tablecmds.c:15489 commands/tablecmds.c:15537 +#: commands/tablecmds.c:16211 commands/tablecmds.c:16257 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "リレーション\"%s\"ã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã®ãƒ‘ーティションå­ãƒ†ãƒ¼ãƒ–ルã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:15543 +#: commands/tablecmds.c:16263 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "リレーション\"%s\"ã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã®è¦ªã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:15771 +#: commands/tablecmds.c:16490 #, c-format msgid "typed tables cannot inherit" msgstr "型付ã‘ã•れãŸãƒ†ãƒ¼ãƒ–ルã¯ç¶™æ‰¿ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:15801 +#: commands/tablecmds.c:16520 #, c-format msgid "table is missing column \"%s\"" msgstr "テーブルã«ã¯åˆ—\"%s\"ãŒã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:15812 +#: commands/tablecmds.c:16531 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "テーブルã«ã¯åˆ—\"%s\"ãŒã‚りã¾ã™ãŒåž‹ã¯\"%s\"ã‚’å¿…è¦ã¨ã—ã¦ã„ã¾ã™" -#: commands/tablecmds.c:15821 +#: commands/tablecmds.c:16540 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "テーブル\"%s\"ã§ã¯åˆ—\"%s\"ã®åž‹ãŒç•°ãªã£ã¦ã„ã¾ã™" -#: commands/tablecmds.c:15835 +#: commands/tablecmds.c:16554 #, c-format msgid "table has extra column \"%s\"" msgstr "テーブルã«ä½™åˆ†ãªåˆ—\"%s\"ãŒã‚りã¾ã™" -#: commands/tablecmds.c:15887 +#: commands/tablecmds.c:16606 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\"ã¯åž‹ä»˜ã‘ã•れãŸãƒ†ãƒ¼ãƒ–ルã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:16061 +#: commands/tablecmds.c:16780 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "éžãƒ¦ãƒ‹ãƒ¼ã‚¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\"%s\"ã¯è¤‡è£½è­˜åˆ¥ã¨ã—ã¦ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:16067 +#: commands/tablecmds.c:16786 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "ä¸€æ„æ€§ã‚’峿™‚検査ã—ãªã„インデックス\"%s\"ã¯è¤‡è£½è­˜åˆ¥ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:16073 +#: commands/tablecmds.c:16792 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "å¼ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\"%s\"ã¯è¤‡è£½è­˜åˆ¥ã¨ã—ã¦ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:16079 +#: commands/tablecmds.c:16798 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "部分インデックス\"%s\"を複製識別ã¨ã—ã¦ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:16096 +#: commands/tablecmds.c:16815 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "列%2$dã¯ã‚·ã‚¹ãƒ†ãƒ åˆ—ã§ã‚ã‚‹ãŸã‚インデックス\"%1$s\"ã¯è¤‡è£½è­˜åˆ¥ã«ã¯ä½¿ãˆã¾ã›ã‚“" -#: commands/tablecmds.c:16103 +#: commands/tablecmds.c:16822 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "列\"%2$s\"ã¯nullå¯ã§ã‚ã‚‹ãŸã‚インデックス\"%1$s\"ã¯è¤‡è£½è­˜åˆ¥ã«ã¯ä½¿ãˆã¾ã›ã‚“" -#: commands/tablecmds.c:16348 +#: commands/tablecmds.c:17074 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "テーブル\"%s\"ã¯ä¸€æ™‚テーブルã§ã‚ã‚‹ãŸã‚ã€ãƒ­ã‚°å‡ºåŠ›è¨­å®šã‚’å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:16372 +#: commands/tablecmds.c:17098 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "テーブル\"%s\"ã¯ãƒ‘ブリケーションã®ä¸€éƒ¨ã§ã‚ã‚‹ãŸã‚ã€UNLOGGEDã«å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:16374 +#: commands/tablecmds.c:17100 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "UNLOGGEDリレーションã¯ãƒ¬ãƒ—リケーションã§ãã¾ã›ã‚“。" -#: commands/tablecmds.c:16419 +#: commands/tablecmds.c:17145 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "テーブル\"%s\"ã¯UNLOGGEDテーブル\"%s\"ã‚’å‚ç…§ã—ã¦ã„ã‚‹ãŸã‚LOGGEDã«ã¯è¨­å®šã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:16429 +#: commands/tablecmds.c:17155 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "テーブル\"%s\"ã¯LOGGEDテーブル\"%s\"ã‚’å‚ç…§ã—ã¦ã„ã‚‹ãŸã‚UNLOGGEDã«ã¯è¨­å®šã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:16487 +#: commands/tablecmds.c:17213 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "所有ã™ã‚‹ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã‚’ä»–ã®ã‚¹ã‚­ãƒ¼ãƒžã«ç§»å‹•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:16594 +#: commands/tablecmds.c:17321 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "リレーション\"%s\"ã¯ã‚¹ã‚­ãƒ¼ãƒž\"%s\"内ã«ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/tablecmds.c:17006 +#: commands/tablecmds.c:17746 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ルや実体化ビューã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:17184 +#: commands/tablecmds.c:17899 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\"ã¯è¤‡åˆåž‹ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablecmds.c:17212 +#: commands/tablecmds.c:17929 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "インデックス\"%s\"ã®ã‚¹ã‚­ãƒ¼ãƒžã‚’変更ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17214 commands/tablecmds.c:17226 +#: commands/tablecmds.c:17931 commands/tablecmds.c:17945 #, c-format msgid "Change the schema of the table instead." msgstr "代ã‚りã«ã“ã®ãƒ†ãƒ¼ãƒ–ルã®ã‚¹ã‚­ãƒ¼ãƒžã‚’変更ã—ã¦ãã ã•ã„。" -#: commands/tablecmds.c:17218 +#: commands/tablecmds.c:17935 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "複åˆåž‹%sã®ã‚¹ã‚­ãƒ¼ãƒžã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17224 +#: commands/tablecmds.c:17943 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "TOASTテーブル\"%s\"ã®ã‚¹ã‚­ãƒ¼ãƒžã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17256 +#: commands/tablecmds.c:17975 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "\"list\"パーティションストラテジã¯2ã¤ä»¥ä¸Šã®åˆ—ã«å¯¾ã—ã¦ã¯ä½¿ãˆã¾ã›ã‚“" -#: commands/tablecmds.c:17322 +#: commands/tablecmds.c:18041 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "ãƒ‘ãƒ¼ãƒ†ã‚£ã‚·ãƒ§ãƒ³ã‚­ãƒ¼ã«æŒ‡å®šã•れã¦ã„る列\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tablecmds.c:17330 +#: commands/tablecmds.c:18049 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "パーティションキーã§ã‚·ã‚¹ãƒ†ãƒ åˆ—\"%s\"ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17341 commands/tablecmds.c:17455 +#: commands/tablecmds.c:18060 commands/tablecmds.c:18150 #, c-format msgid "cannot use generated column in partition key" msgstr "パーティションキーã§ç”Ÿæˆã‚«ãƒ©ãƒ ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17342 commands/tablecmds.c:17456 commands/trigger.c:663 rewrite/rewriteHandler.c:936 rewrite/rewriteHandler.c:971 +#: commands/tablecmds.c:18133 #, c-format -msgid "Column \"%s\" is a generated column." -msgstr "列\"%s\"ã¯ç”Ÿæˆã‚«ãƒ©ãƒ ã§ã™ã€‚" +msgid "partition key expressions cannot contain system column references" +msgstr "パーティションキーå¼ã¯ã‚·ã‚¹ãƒ†ãƒ åˆ—ã¸ã®å‚ç…§ã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17418 +#: commands/tablecmds.c:18180 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "パーティションキーå¼ã§ä½¿ã‚れる関数ã¯IMMUTABLE指定ã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/tablecmds.c:17438 -#, c-format -msgid "partition key expressions cannot contain system column references" -msgstr "パーティションキーå¼ã¯ã‚·ã‚¹ãƒ†ãƒ åˆ—ã¸ã®å‚ç…§ã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“" - -#: commands/tablecmds.c:17468 +#: commands/tablecmds.c:18189 #, c-format msgid "cannot use constant expression as partition key" msgstr "定数å¼ã‚’パーティションキーã¨ã—ã¦ä½¿ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17489 +#: commands/tablecmds.c:18210 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "パーティションå¼ã§ä½¿ç”¨ã™ã‚‹ç…§åˆé †åºã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: commands/tablecmds.c:17524 +#: commands/tablecmds.c:18245 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "ãƒãƒƒã‚·ãƒ¥æ¼”ç®—å­ã‚¯ãƒ©ã‚¹ã‚’指定ã™ã‚‹ã‹ã€ã‚‚ã—ãã¯ã“ã®ãƒ‡ãƒ¼ã‚¿åž‹ã«ãƒ‡ãƒ•ォルトã®ãƒãƒƒã‚·ãƒ¥æ¼”ç®—å­ã‚¯ãƒ©ã‚¹ã‚’定義ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/tablecmds.c:17530 +#: commands/tablecmds.c:18251 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "btree演算å­ã‚¯ãƒ©ã‚¹ã‚’指定ã™ã‚‹ã‹ã€ã‚‚ã—ãã¯ã“ã®ãƒ‡ãƒ¼ã‚¿åž‹ã«ãƒ‡ãƒ•ォルトã®btree演算å­ã‚¯ãƒ©ã‚¹ã‚’定義ã™ã‚‹ã‹ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/tablecmds.c:17781 +#: commands/tablecmds.c:18502 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\"ã¯ã™ã§ãƒ‘ーティションã§ã™" -#: commands/tablecmds.c:17787 +#: commands/tablecmds.c:18508 #, c-format msgid "cannot attach a typed table as partition" msgstr "型付ã‘ã•れãŸãƒ†ãƒ¼ãƒ–ルをパーティションã«ã‚¢ã‚¿ãƒƒãƒã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17803 +#: commands/tablecmds.c:18524 #, c-format msgid "cannot attach inheritance child as partition" msgstr "継承å­ãƒ†ãƒ¼ãƒ–ルをパーティションã«ã‚¢ã‚¿ãƒƒãƒã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17817 +#: commands/tablecmds.c:18538 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "継承親テーブルをパーティションã«ã‚¢ã‚¿ãƒƒãƒã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17851 +#: commands/tablecmds.c:18572 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "一時リレーションを永続リレーション \"%s\" ã®ãƒ‘ーティションå­ãƒ†ãƒ¼ãƒ–ルã¨ã—ã¦ã‚¢ã‚¿ãƒƒãƒã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17859 +#: commands/tablecmds.c:18580 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "永続リレーションを一時リレーション\"%s\"ã®ãƒ‘ーティションå­ãƒ†ãƒ¼ãƒ–ルã¨ã—ã¦ã‚¢ã‚¿ãƒƒãƒã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17867 +#: commands/tablecmds.c:18588 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "他セッションã®ä¸€æ™‚リレーションã®ãƒ‘ーティションå­ãƒ†ãƒ¼ãƒ–ルã¨ã—ã¦ã‚¢ã‚¿ãƒƒãƒã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17874 +#: commands/tablecmds.c:18595 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "他セッションã®ä¸€æ™‚リレーションã«ãƒ‘ーティションå­ãƒ†ãƒ¼ãƒ–ルã¨ã—ã¦ã‚¢ã‚¿ãƒƒãƒã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:17894 +#: commands/tablecmds.c:18615 +#, c-format +msgid "table \"%s\" being attached contains an identity column \"%s\"" +msgstr "アタッãƒå¯¾è±¡ã®ãƒ†ãƒ¼ãƒ–ル\"%s\"ã«ã¯è­˜åˆ¥åˆ—\"%s\"ãŒå«ã¾ã‚Œã¦ã„ã¾ã™" + +#: commands/tablecmds.c:18617 +#, c-format +msgid "The new partition may not contain an identity column." +msgstr "æ–°ã—ã„パーティションã¯è­˜åˆ¥åˆ—ã‚’å«ã‚€ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: commands/tablecmds.c:18625 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "テーブル\"%1$s\"ã¯è¦ªãƒ†ãƒ¼ãƒ–ル\"%3$s\"ã«ãªã„列\"%2$s\"ã‚’å«ã‚“ã§ã„ã¾ã™" -#: commands/tablecmds.c:17897 +#: commands/tablecmds.c:18628 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "æ–°ã—ã„パーティションã¯è¦ªã«å­˜åœ¨ã™ã‚‹åˆ—ã®ã¿ã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: commands/tablecmds.c:17909 +#: commands/tablecmds.c:18640 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "トリガ\"%s\"ã®ãŸã‚ã€ãƒ†ãƒ¼ãƒ–ル\"%s\"ã¯ãƒ‘ーティションå­ãƒ†ãƒ¼ãƒ–ルã«ã¯ãªã‚Œã¾ã›ã‚“" -#: commands/tablecmds.c:17911 +#: commands/tablecmds.c:18642 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "é·ç§»ãƒ†ãƒ¼ãƒ–ルを使用ã™ã‚‹ROWトリガã¯ãƒ‘ーティションã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。" -#: commands/tablecmds.c:18090 +#: commands/tablecmds.c:18818 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "外部テーブル\"%s\"ã¯ãƒ‘ーティションテーブル\"%s\"ã®å­ãƒ†ãƒ¼ãƒ–ルã¨ã—ã¦ã‚¢ã‚¿ãƒƒãƒã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:18093 +#: commands/tablecmds.c:18821 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "パーティション親テーブル\"%s\"ã¯ãƒ¦ãƒ‹ãƒ¼ã‚¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’æŒã£ã¦ã„ã¾ã™ã€‚" -#: commands/tablecmds.c:18406 +#: commands/tablecmds.c:19143 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "デフォルトパーティションをæŒã¤ãƒ‘ーティションã¯ä¸¦åˆ—çš„ã«å–り外ã—ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:18515 +#: commands/tablecmds.c:19252 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "パーティション親テーブル\"%s\"ã«ã¯ CREATE INDEX CONCURRENTLY ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:18521 +#: commands/tablecmds.c:19258 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "パーティションå­ãƒ†ãƒ¼ãƒ–ル\\\"%s\\\"ã¯åŒæ™‚ã«å‰Šé™¤ã•れã¾ã—ãŸ" -#: commands/tablecmds.c:19036 commands/tablecmds.c:19056 commands/tablecmds.c:19077 commands/tablecmds.c:19096 commands/tablecmds.c:19138 +#: commands/tablecmds.c:19872 commands/tablecmds.c:19892 commands/tablecmds.c:19913 commands/tablecmds.c:19932 commands/tablecmds.c:19974 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "インデックス\"%s\"をインデックス\"%s\"ã®å­ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¨ã—ã¦ã‚¢ã‚¿ãƒƒãƒã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/tablecmds.c:19039 +#: commands/tablecmds.c:19875 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "インデックス\"%s\"ã¯ã™ã§ã«åˆ¥ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã«ã‚¢ã‚¿ãƒƒãƒã•れã¦ã„ã¾ã™ã€‚" -#: commands/tablecmds.c:19059 +#: commands/tablecmds.c:19895 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "インデックス\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã®ã©ã®å­ãƒ†ãƒ¼ãƒ–ルã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã‚‚ã‚りã¾ã›ã‚“。" -#: commands/tablecmds.c:19080 +#: commands/tablecmds.c:19916 #, c-format msgid "The index definitions do not match." msgstr "インデックス定義ãŒåˆè‡´ã—ã¾ã›ã‚“。" -#: commands/tablecmds.c:19099 +#: commands/tablecmds.c:19935 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "インデックス\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã®åˆ¶ç´„ã«å±žã—ã¦ã„ã¾ã™ãŒã€ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\"%s\"ã«ã¯åˆ¶ç´„ãŒã‚りã¾ã›ã‚“。" -#: commands/tablecmds.c:19141 +#: commands/tablecmds.c:19977 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "å­ãƒ†ãƒ¼ãƒ–ル\"%s\"ã«ã¯ã™ã§ã«ä»–ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒã‚¢ã‚¿ãƒƒãƒã•れã¦ã„ã¾ã™ã€‚" -#: commands/tablecmds.c:19370 +#: commands/tablecmds.c:20213 #, c-format msgid "column data type %s does not support compression" msgstr "列データ型%sã¯åœ§ç¸®ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: commands/tablecmds.c:19377 +#: commands/tablecmds.c:20220 #, c-format msgid "invalid compression method \"%s\"" msgstr "無効ãªåœ§ç¸®æ–¹å¼\"%s\"" -#: commands/tablecmds.c:19403 +#: commands/tablecmds.c:20246 #, c-format msgid "invalid storage type \"%s\"" msgstr "䏿­£ãªæ ¼ç´ã‚¿ã‚¤ãƒ—\"%s\"" -#: commands/tablecmds.c:19413 +#: commands/tablecmds.c:20256 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "列ã®ãƒ‡ãƒ¼ã‚¿åž‹%sã¯æ ¼ç´ã‚¿ã‚¤ãƒ—PLAINã—ã‹å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/tablespace.c:199 commands/tablespace.c:650 +#: commands/tablespace.c:193 commands/tablespace.c:644 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "\"%s\"ã¯å­˜åœ¨ã—ã¾ã™ãŒã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablespace.c:230 +#: commands/tablespace.c:224 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "テーブル空間\"%s\"を作æˆã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/tablespace.c:232 +#: commands/tablespace.c:226 #, c-format msgid "Must be superuser to create a tablespace." msgstr "テーブル空間を生æˆã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/tablespace.c:248 +#: commands/tablespace.c:242 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "テーブル空間ã®å ´æ‰€ã«ã¯å˜ä¸€å¼•用符をå«ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/tablespace.c:261 +#: commands/tablespace.c:255 #, c-format msgid "tablespace location must be an absolute path" msgstr "テーブル空間ã®å ´æ‰€ã¯çµ¶å¯¾ãƒ‘スã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/tablespace.c:273 +#: commands/tablespace.c:267 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "テーブル空間ã®å ´æ‰€\"%s\"ã¯é•·ã™ãŽã¾ã™" -#: commands/tablespace.c:280 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "テーブル空間ã®å ´æ‰€ã¯ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä¸­ã«æŒ‡å®šã™ã¹ãã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablespace.c:289 commands/tablespace.c:976 +#: commands/tablespace.c:283 commands/tablespace.c:970 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "テーブル空間å\"%s\"ã‚’å—ã‘付ã‘られã¾ã›ã‚“" -#: commands/tablespace.c:291 commands/tablespace.c:977 +#: commands/tablespace.c:285 commands/tablespace.c:971 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "接頭辞\"pg_\"ã¯ã‚·ã‚¹ãƒ†ãƒ ãƒ†ãƒ¼ãƒ–ル空間用ã«äºˆç´„ã•れã¦ã„ã¾ã™" -#: commands/tablespace.c:310 commands/tablespace.c:998 +#: commands/tablespace.c:304 commands/tablespace.c:992 #, c-format msgid "tablespace \"%s\" already exists" msgstr "テーブル空間\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/tablespace.c:326 +#: commands/tablespace.c:320 #, c-format msgid "pg_tablespace OID value not set when in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã«pg_tablespaceã®OID値ãŒè¨­å®šã•れã¦ã¾ã›ã‚“" -#: commands/tablespace.c:431 commands/tablespace.c:959 commands/tablespace.c:1048 commands/tablespace.c:1117 commands/tablespace.c:1263 commands/tablespace.c:1466 +#: commands/tablespace.c:425 commands/tablespace.c:953 commands/tablespace.c:1042 commands/tablespace.c:1111 commands/tablespace.c:1257 commands/tablespace.c:1460 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "テーブル空間\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tablespace.c:437 +#: commands/tablespace.c:431 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "テーブル空間\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/tablespace.c:463 +#: commands/tablespace.c:457 #, c-format msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" msgstr "一部ã®ã‚ªãƒ–ジェクトãŒä¾å­˜ã—ã¦ã„ã‚‹ãŸã‚テーブルスペース\"%s\"ã¯å‰Šé™¤ã§ãã¾ã›ã‚“" -#: commands/tablespace.c:530 +#: commands/tablespace.c:524 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "テーブル空間\"%s\"ã¯ç©ºã§ã¯ã‚りã¾ã›ã‚“" -#: commands/tablespace.c:617 +#: commands/tablespace.c:611 #, c-format msgid "directory \"%s\" does not exist" msgstr "ディレクトリ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tablespace.c:618 +#: commands/tablespace.c:612 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "サーãƒãƒ¼ã‚’å†èµ·å‹•ã™ã‚‹å‰ã«ãƒ†ãƒ¼ãƒ–ルスペース用ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’作æˆã—ã¦ãã ã•ã„" -#: commands/tablespace.c:623 +#: commands/tablespace.c:617 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "ディレクトリ\"%s\"ã«æ¨©é™ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: commands/tablespace.c:655 +#: commands/tablespace.c:649 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "ディレクトリ\"%s\"ã¯ã™ã§ã«ãƒ†ãƒ¼ãƒ–ルスペースã¨ã—ã¦ä½¿ã‚れã¦ã„ã¾ã™" -#: commands/tablespace.c:833 commands/tablespace.c:919 +#: commands/tablespace.c:827 commands/tablespace.c:913 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: commands/tablespace.c:842 commands/tablespace.c:927 +#: commands/tablespace.c:836 commands/tablespace.c:921 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "\"%s\"ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã‚‚シンボリックリンクã§ã‚‚ã‚りã¾ã›ã‚“" -#: commands/tablespace.c:1122 +#: commands/tablespace.c:1116 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "テーブル空間\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tablespace.c:1568 +#: commands/tablespace.c:1562 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "テーブル空間%u用ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’削除ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: commands/tablespace.c:1570 +#: commands/tablespace.c:1564 #, c-format msgid "You can remove the directories manually if necessary." msgstr "å¿…è¦ãªã‚‰ã°æ‰‹ä½œæ¥­ã§ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’削除ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™" -#: commands/trigger.c:232 commands/trigger.c:243 +#: commands/trigger.c:225 commands/trigger.c:236 #, c-format msgid "\"%s\" is a table" msgstr "\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ルã§ã™" -#: commands/trigger.c:234 commands/trigger.c:245 +#: commands/trigger.c:227 commands/trigger.c:238 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "テーブル㯠INSTEAD OF トリガーをæŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/trigger.c:266 +#: commands/trigger.c:259 #, c-format msgid "\"%s\" is a partitioned table" msgstr "\"%s\"ã¯ãƒ‘ーティション親テーブルã§ã™" -#: commands/trigger.c:268 +#: commands/trigger.c:261 #, c-format msgid "ROW triggers with transition tables are not supported on partitioned tables." msgstr "é·ç§»ãƒ†ãƒ¼ãƒ–ルを使用ã™ã‚‹ROWトリガã¯ãƒ‘ーティション親テーブルã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。" -#: commands/trigger.c:280 commands/trigger.c:287 commands/trigger.c:451 +#: commands/trigger.c:273 commands/trigger.c:280 commands/trigger.c:444 #, c-format msgid "\"%s\" is a view" msgstr "\"%s\"ã¯ãƒ“ューã§ã™" -#: commands/trigger.c:282 +#: commands/trigger.c:275 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "ビューã¯è¡Œãƒ¬ãƒ™ãƒ«ã® BEFORE / AFTER トリガーをæŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/trigger.c:289 +#: commands/trigger.c:282 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "ビュー㯠TRUNCATE トリガーをæŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/trigger.c:297 commands/trigger.c:309 commands/trigger.c:444 +#: commands/trigger.c:290 commands/trigger.c:302 commands/trigger.c:437 #, c-format msgid "\"%s\" is a foreign table" msgstr "\"%s\"ã¯å¤–部テーブルã§ã™" -#: commands/trigger.c:299 +#: commands/trigger.c:292 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "外部テーブル㯠INSTEAD OF トリガをæŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“。" -#: commands/trigger.c:311 +#: commands/trigger.c:304 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "外部テーブルã¯åˆ¶ç´„トリガをæŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“。" -#: commands/trigger.c:316 commands/trigger.c:1332 commands/trigger.c:1439 +#: commands/trigger.c:309 commands/trigger.c:1325 commands/trigger.c:1432 #, c-format msgid "relation \"%s\" cannot have triggers" msgstr "リレーション\"%s\"ã«ã¯ãƒˆãƒªã‚¬ãƒ¼ã‚’設定ã§ãã¾ã›ã‚“" -#: commands/trigger.c:387 +#: commands/trigger.c:380 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "TRUNCATE FOR EACH ROW トリガã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/trigger.c:395 +#: commands/trigger.c:388 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "INSTEAD OF トリガー㯠FOR EACH ROW ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/trigger.c:399 +#: commands/trigger.c:392 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "INSTEAD OF トリガー㯠WHEN æ¡ä»¶ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/trigger.c:403 +#: commands/trigger.c:396 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "INSTEAD OF トリガーã¯åˆ—リストをæŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/trigger.c:432 +#: commands/trigger.c:425 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "REFERENCINGå¥ã§ã®ROW変数ã®å‘½åã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/trigger.c:433 +#: commands/trigger.c:426 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "é·ç§»ãƒ†ãƒ¼ãƒ–ルを指定ã™ã‚‹ã«ã¯ OLD TABLE ã¾ãŸã¯ NEW TABLE を使ã£ã¦ãã ã•ã„" -#: commands/trigger.c:446 +#: commands/trigger.c:439 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "外部テーブルã«å¯¾ã™ã‚‹ãƒˆãƒªã‚¬ã¯é·ç§»ãƒ†ãƒ¼ãƒ–ルをæŒã¦ã¾ã›ã‚“。" -#: commands/trigger.c:453 +#: commands/trigger.c:446 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "ビューã«å¯¾ã™ã‚‹ãƒˆãƒªã‚¬ã¯é·ç§»ãƒ†ãƒ¼ãƒ–ルをæŒã¦ã¾ã›ã‚“。" -#: commands/trigger.c:469 +#: commands/trigger.c:462 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "é·ç§»ãƒ†ãƒ¼ãƒ–ルを使用ã™ã‚‹ROWトリガã¯ãƒ‘ーティションã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: commands/trigger.c:473 +#: commands/trigger.c:466 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" msgstr "é·ç§»ãƒ†ãƒ¼ãƒ–ルをもã£ãŸROWトリガã¯ç¶™æ‰¿å­ãƒ†ãƒ¼ãƒ–ルã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: commands/trigger.c:479 +#: commands/trigger.c:472 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "é·ç§»ãƒ†ãƒ¼ãƒ–ルåã¯AFTERトリガã§ã®æŒ‡å®šå¯èƒ½ã§ã™" -#: commands/trigger.c:484 +#: commands/trigger.c:477 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "é·ç§»ãƒ†ãƒ¼ãƒ–ルを使用ã™ã‚‹TRUNCATEトリガã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/trigger.c:501 +#: commands/trigger.c:494 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" msgstr "2ã¤ä»¥ä¸Šã®ã‚¤ãƒ™ãƒ³ãƒˆã«å¯¾ã™ã‚‹ãƒˆãƒªã‚¬ã«ã¯é·ç§»ãƒ†ãƒ¼ãƒ–ãƒ«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/trigger.c:512 +#: commands/trigger.c:505 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "列リストを指定ã—ãŸãƒˆãƒªã‚¬ã«å¯¾ã—ã¦ã¯é·ç§»ãƒ†ãƒ¼ãƒ–ãƒ«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/trigger.c:529 +#: commands/trigger.c:522 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE ã¯INSERTã¾ãŸã¯UPDATEトリガã«å¯¾ã—ã¦ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™" -#: commands/trigger.c:534 +#: commands/trigger.c:527 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE ã¯è¤‡æ•°å›žæŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/trigger.c:544 +#: commands/trigger.c:537 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE ã¯DELETEã¾ãŸã¯UPDATEトリガã«å¯¾ã—ã¦ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™" -#: commands/trigger.c:549 +#: commands/trigger.c:542 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE ã¯è¤‡æ•°å›žæŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/trigger.c:559 +#: commands/trigger.c:552 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "OLD TABLE ã®åå‰ã¨ NEW TABLE ã®åå‰ã¯åŒã˜ã«ã¯ã§ãã¾ã›ã‚“" -#: commands/trigger.c:623 commands/trigger.c:636 +#: commands/trigger.c:616 commands/trigger.c:629 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "ステートメントトリガー㮠WHEN æ¡ä»¶ã§ã¯åˆ—ã®å€¤ã‚’å‚ç…§ã§ãã¾ã›ã‚“" -#: commands/trigger.c:628 +#: commands/trigger.c:621 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "INSERT トリガー㮠WHEN æ¡ä»¶ã§ã¯ OLD 値をå‚ç…§ã§ãã¾ã›ã‚“" -#: commands/trigger.c:641 +#: commands/trigger.c:634 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "DELETE トリガー㮠WHEN æ¡ä»¶ã§ã¯ NEW 値をå‚ç…§ã§ãã¾ã›ã‚“" -#: commands/trigger.c:646 +#: commands/trigger.c:639 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "BEFORE トリガー㮠WHEN æ¡ä»¶ã§ã¯ NEW システム列をå‚ç…§ã§ãã¾ã›ã‚“" -#: commands/trigger.c:654 commands/trigger.c:662 +#: commands/trigger.c:647 commands/trigger.c:655 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "BEFORE トリガー㮠WHEN æ¡ä»¶ã§ã¯ NEW ã®ç”Ÿæˆåˆ—ã‚’å‚ç…§ã§ãã¾ã›ã‚“" -#: commands/trigger.c:655 +#: commands/trigger.c:648 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "行全体å‚ç…§ãŒä½¿ã‚れã¦ã„ã¦ã‹ã¤ã€ã“ã®ãƒ†ãƒ¼ãƒ–ルã¯ç”Ÿæˆã‚«ãƒ©ãƒ ã‚’å«ã‚“ã§ã„ã¾ã™ã€‚" -#: commands/trigger.c:770 commands/trigger.c:1614 +#: commands/trigger.c:763 commands/trigger.c:1607 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "リレーション\"%2$s\"用ã®ãƒˆãƒªã‚¬\"%1$s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/trigger.c:783 +#: commands/trigger.c:776 #, c-format msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" msgstr "リレーション\"%2$s\"ã®ãƒˆãƒªã‚¬ãƒ¼\"%1$s\"ã¯å†…部トリガーã¾ãŸã¯å­ãƒˆãƒªã‚¬ãƒ¼ã§ã™" -#: commands/trigger.c:802 +#: commands/trigger.c:795 #, c-format msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" msgstr "リレーション\"%2$s\"ã®ãƒˆãƒªã‚¬ãƒ¼\"%1$s\"ã¯åˆ¶ç´„トリガーã§ã™" -#: commands/trigger.c:1404 commands/trigger.c:1557 commands/trigger.c:1838 +#: commands/trigger.c:1397 commands/trigger.c:1550 commands/trigger.c:1831 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"ã®ãƒˆãƒªã‚¬\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/trigger.c:1529 +#: commands/trigger.c:1522 #, c-format msgid "cannot rename trigger \"%s\" on table \"%s\"" msgstr "テーブル\"%2$s\"ã®ãƒˆãƒªã‚¬ãƒ¼\"%1$s\"ã®åå‰ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/trigger.c:1531 +#: commands/trigger.c:1524 #, c-format msgid "Rename the trigger on the partitioned table \"%s\" instead." msgstr "代ã‚りã«ãƒ‘ーティション親テーブル\"%s\"ã§ã“ã®ãƒˆãƒªã‚¬ãƒ¼ã®åå‰ã‚’変更ã—ã¦ãã ã•ã„。" -#: commands/trigger.c:1631 +#: commands/trigger.c:1624 #, c-format msgid "renamed trigger \"%s\" on relation \"%s\"" msgstr "リレーション\"%2$s\"ã®ãƒˆãƒªã‚¬ãƒ¼\"%1$s\"ã®åå‰ã‚’変更ã—ã¾ã—ãŸ" -#: commands/trigger.c:1777 +#: commands/trigger.c:1770 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "権é™ãŒã‚りã¾ã›ã‚“: \"%s\"ã¯ã‚·ã‚¹ãƒ†ãƒ ãƒˆãƒªã‚¬ã§ã™" -#: commands/trigger.c:2386 +#: commands/trigger.c:2379 #, c-format msgid "trigger function %u returned null value" msgstr "トリガ関数%uã¯NULL値を返ã—ã¾ã—ãŸ" -#: commands/trigger.c:2446 commands/trigger.c:2664 commands/trigger.c:2917 commands/trigger.c:3252 +#: commands/trigger.c:2439 commands/trigger.c:2657 commands/trigger.c:2910 commands/trigger.c:3263 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "BEFORE STATEMENTトリガã¯å€¤ã‚’è¿”ã™ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/trigger.c:2522 +#: commands/trigger.c:2515 #, c-format msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" msgstr "BEFORE FOR EACH ROWトリガã®å®Ÿè¡Œã§ã¯ã€ä»–ã®ãƒ‘ーティションã¸ã®è¡Œã®ç§»å‹•ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/trigger.c:2523 +#: commands/trigger.c:2516 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "トリガ\"%s\"ã®å®Ÿè¡Œå‰ã«ã¯ã€ã“ã®è¡Œã¯ãƒ‘ーティション\"%s.%s\"ã«ç½®ã‹ã‚Œã‚‹ã¯ãšã§ã—ãŸã€‚" -#: commands/trigger.c:3329 executor/nodeModifyTable.c:2363 executor/nodeModifyTable.c:2446 -#, c-format -msgid "tuple to be updated was already modified by an operation triggered by the current command" -msgstr "更新対象ã®ã‚¿ãƒ—ルã¯ã™ã§ã«ç¾åœ¨ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã‚ˆã£ã¦ç™ºè¡Œã•ã‚ŒãŸæ“作ã«ã‚ˆã£ã¦å¤‰æ›´ã•れã¦ã„ã¾ã™" - -#: commands/trigger.c:3330 executor/nodeModifyTable.c:1531 executor/nodeModifyTable.c:1605 executor/nodeModifyTable.c:2364 executor/nodeModifyTable.c:2447 executor/nodeModifyTable.c:3077 +#: commands/trigger.c:3341 executor/nodeModifyTable.c:1541 executor/nodeModifyTable.c:1615 executor/nodeModifyTable.c:2377 executor/nodeModifyTable.c:2468 executor/nodeModifyTable.c:3132 executor/nodeModifyTable.c:3302 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "ä»–ã®è¡Œã¸ã®å¤‰æ›´ã‚’伿¬ã•ã›ã‚‹ãŸã‚ã«BEFOREトリガã§ã¯ãªãAFTERトリガã®ä½¿ç”¨ã‚’検討ã—ã¦ãã ã•ã„" -#: commands/trigger.c:3371 executor/nodeLockRows.c:228 executor/nodeLockRows.c:237 executor/nodeModifyTable.c:308 executor/nodeModifyTable.c:1547 executor/nodeModifyTable.c:2381 executor/nodeModifyTable.c:2589 +#: commands/trigger.c:3382 executor/nodeLockRows.c:228 executor/nodeLockRows.c:237 executor/nodeModifyTable.c:314 executor/nodeModifyTable.c:1557 executor/nodeModifyTable.c:2394 executor/nodeModifyTable.c:2618 #, c-format msgid "could not serialize access due to concurrent update" msgstr "æ›´æ–°ãŒåŒæ™‚ã«è¡Œã‚れãŸãŸã‚アクセスã®ç›´åˆ—化ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: commands/trigger.c:3379 executor/nodeModifyTable.c:1637 executor/nodeModifyTable.c:2464 executor/nodeModifyTable.c:2613 executor/nodeModifyTable.c:2965 +#: commands/trigger.c:3390 executor/nodeModifyTable.c:1647 executor/nodeModifyTable.c:2485 executor/nodeModifyTable.c:2642 executor/nodeModifyTable.c:3150 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "削除ãŒåŒæ™‚ã«è¡Œã‚れãŸãŸã‚アクセスã®ç›´åˆ—化ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: commands/trigger.c:4555 +#: commands/trigger.c:4599 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼åˆ¶é™æ“作中ã¯ã€é…延トリガーã¯ç™ºç«ã•ã›ã‚‰ã‚Œã¾ã›ã‚“" -#: commands/trigger.c:5738 +#: commands/trigger.c:5780 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "制約\"%s\"ã¯é…å»¶å¯èƒ½ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/trigger.c:5761 +#: commands/trigger.c:5803 #, c-format msgid "constraint \"%s\" does not exist" msgstr "制約\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:635 +#: commands/tsearchcmds.c:124 commands/tsearchcmds.c:641 #, c-format msgid "function %s should return type %s" msgstr "関数%sã¯åž‹%sã‚’è¿”ã™ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/tsearchcmds.c:194 +#: commands/tsearchcmds.c:200 #, c-format msgid "must be superuser to create text search parsers" msgstr "テキスト検索パーサを生æˆã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/tsearchcmds.c:247 +#: commands/tsearchcmds.c:253 #, c-format msgid "text search parser parameter \"%s\" not recognized" msgstr "テキスト検索パーサ\"%s\"ã¯ä¸æ˜Žã§ã™" -#: commands/tsearchcmds.c:257 +#: commands/tsearchcmds.c:263 #, c-format msgid "text search parser start method is required" msgstr "テキスト検索パーサã®é–‹å§‹ãƒ¡ã‚½ãƒƒãƒ‰ãŒå¿…è¦ã§ã™" -#: commands/tsearchcmds.c:262 +#: commands/tsearchcmds.c:268 #, c-format msgid "text search parser gettoken method is required" msgstr "テキスト検索パーサã®gettokenメソッドãŒå¿…è¦ã§ã™" -#: commands/tsearchcmds.c:267 +#: commands/tsearchcmds.c:273 #, c-format msgid "text search parser end method is required" msgstr "テキスト検索パーサã®çµ‚了メソッドãŒå¿…è¦ã§ã™" -#: commands/tsearchcmds.c:272 +#: commands/tsearchcmds.c:278 #, c-format msgid "text search parser lextypes method is required" msgstr "テキスト検索パーサã®lextypesメソッドãŒå¿…è¦ã§ã™" -#: commands/tsearchcmds.c:366 +#: commands/tsearchcmds.c:372 #, c-format msgid "text search template \"%s\" does not accept options" msgstr "テキスト検索テンプレート\"%s\"ã¯ã‚ªãƒ—ションをå—ã‘付ã‘ã¾ã›ã‚“" -#: commands/tsearchcmds.c:440 +#: commands/tsearchcmds.c:446 #, c-format msgid "text search template is required" msgstr "テキスト検索テンプレートãŒå¿…è¦ã§ã™" -#: commands/tsearchcmds.c:701 +#: commands/tsearchcmds.c:707 #, c-format msgid "must be superuser to create text search templates" msgstr "テキスト検索テンプレートを生æˆã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/tsearchcmds.c:743 +#: commands/tsearchcmds.c:749 #, c-format msgid "text search template parameter \"%s\" not recognized" msgstr "テキスト検索テンプレートã®ãƒ‘ラメータ\"%sã¯ä¸æ˜Žã§ã™ã€‚" -#: commands/tsearchcmds.c:753 +#: commands/tsearchcmds.c:759 #, c-format msgid "text search template lexize method is required" msgstr "テキスト検索テンプレートã®lexizeメソッドãŒå¿…è¦ã§ã™" -#: commands/tsearchcmds.c:933 +#: commands/tsearchcmds.c:939 #, c-format msgid "text search configuration parameter \"%s\" not recognized" msgstr "テキスト検索設定ã®ãƒ‘ラメータ\"%s\"ã¯ä¸æ˜Žã§ã™" -#: commands/tsearchcmds.c:940 +#: commands/tsearchcmds.c:946 #, c-format msgid "cannot specify both PARSER and COPY options" msgstr "PARSERã¨COPYオプションをã¾ã¨ã‚ã¦æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/tsearchcmds.c:976 +#: commands/tsearchcmds.c:982 #, c-format msgid "text search parser is required" msgstr "テキスト検索パーサãŒå¿…è¦ã§ã™" -#: commands/tsearchcmds.c:1241 +#: commands/tsearchcmds.c:1277 #, c-format msgid "token type \"%s\" does not exist" msgstr "トークン型\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tsearchcmds.c:1501 +#: commands/tsearchcmds.c:1540 #, c-format msgid "mapping for token type \"%s\" does not exist" msgstr "トークン型\"%s\"ã«å¯¾ã™ã‚‹ãƒžãƒƒãƒ—ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/tsearchcmds.c:1507 +#: commands/tsearchcmds.c:1546 #, c-format msgid "mapping for token type \"%s\" does not exist, skipping" msgstr "トークン型\"%s\"ã«å¯¾ã™ã‚‹ãƒžãƒƒãƒ—ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/tsearchcmds.c:1670 commands/tsearchcmds.c:1785 +#: commands/tsearchcmds.c:1707 commands/tsearchcmds.c:1822 #, c-format msgid "invalid parameter list format: \"%s\"" msgstr "䏿­£ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ãƒªã‚¹ãƒˆã®æ›¸å¼ã§ã™: \"%s\"" -#: commands/typecmds.c:217 +#: commands/typecmds.c:221 #, c-format msgid "must be superuser to create a base type" msgstr "基本型を作æˆã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/typecmds.c:275 +#: commands/typecmds.c:279 #, c-format msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." msgstr "最åˆã«åž‹ã‚’シェル型ã¨ã—ã¦ç”Ÿæˆã—ã¦ã€ç¶šã„ã¦I/O関数を生æˆã—ãŸå¾Œã«å®Œå…¨ãª CREATE TYPE を実行ã—ã¦ãã ã•ã„。" -#: commands/typecmds.c:327 commands/typecmds.c:1450 commands/typecmds.c:4257 +#: commands/typecmds.c:331 commands/typecmds.c:1460 commands/typecmds.c:4480 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "åž‹ã®å±žæ€§\"%s\"ã¯ä¸æ˜Žã§ã™" -#: commands/typecmds.c:382 +#: commands/typecmds.c:386 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "型カテゴリ\"%s\"ãŒä¸æ­£ã§ã™ã€‚å˜ç´”ãªASCIIã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/typecmds.c:401 +#: commands/typecmds.c:405 #, c-format msgid "array element type cannot be %s" msgstr "%sã‚’é…列è¦ç´ ã®åž‹ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/typecmds.c:433 +#: commands/typecmds.c:437 #, c-format msgid "alignment \"%s\" not recognized" msgstr "アライメント\"%s\"ã¯ä¸æ˜Žã§ã™" -#: commands/typecmds.c:450 commands/typecmds.c:4131 +#: commands/typecmds.c:454 commands/typecmds.c:4354 #, c-format msgid "storage \"%s\" not recognized" msgstr "æ ¼ç´æ–¹å¼\"%s\"ã¯ä¸æ˜Žã§ã™" -#: commands/typecmds.c:461 +#: commands/typecmds.c:465 #, c-format msgid "type input function must be specified" msgstr "åž‹ã®å…¥åŠ›é–¢æ•°ã®æŒ‡å®šãŒå¿…è¦ã§ã™" -#: commands/typecmds.c:465 +#: commands/typecmds.c:469 #, c-format msgid "type output function must be specified" msgstr "åž‹ã®å‡ºåŠ›é–¢æ•°ã®æŒ‡å®šãŒå¿…è¦ã§ã™" -#: commands/typecmds.c:470 +#: commands/typecmds.c:474 #, c-format msgid "type modifier output function is useless without a type modifier input function" msgstr "型修正入力関数ãŒãªã„å ´åˆã®åž‹ä¿®æ­£å‡ºåŠ›é–¢æ•°ã¯æ„味ãŒã‚りã¾ã›ã‚“" -#: commands/typecmds.c:512 +#: commands/typecmds.c:516 #, c-format msgid "element type cannot be specified without a subscripting function" msgstr "添字処ç†é–¢æ•°ãªã—ã§è¦ç´ åž‹ã‚’指定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/typecmds.c:781 +#: commands/typecmds.c:785 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "\"%s\"ã¯ãƒ‰ãƒ¡ã‚¤ãƒ³ã®åŸºæœ¬åž‹ã¨ã—ã¦ç„¡åйã§ã™" -#: commands/typecmds.c:879 +#: commands/typecmds.c:883 #, c-format msgid "multiple default expressions" msgstr "デフォルトå¼ãŒè¤‡æ•°ã‚りã¾ã™" -#: commands/typecmds.c:942 commands/typecmds.c:951 +#: commands/typecmds.c:946 commands/typecmds.c:955 #, c-format msgid "conflicting NULL/NOT NULL constraints" msgstr "NULL制約ã¨NOT NULL制約ãŒç«¶åˆã—ã¦ã„ã¾ã™" -#: commands/typecmds.c:967 +#: commands/typecmds.c:971 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "ドメインã«å¯¾ã™ã‚‹æ¤œæŸ»åˆ¶ç´„ã¯NO INHERITã¨ãƒžãƒ¼ã‚¯ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/typecmds.c:976 commands/typecmds.c:2956 +#: commands/typecmds.c:980 commands/typecmds.c:2940 #, c-format msgid "unique constraints not possible for domains" msgstr "ドメインã§ã¯ä¸€æ„性制約ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/typecmds.c:982 commands/typecmds.c:2962 +#: commands/typecmds.c:986 commands/typecmds.c:2946 #, c-format msgid "primary key constraints not possible for domains" msgstr "ドメインã§ã¯ãƒ—ライマリキー制約ã¯ã§ãã¾ã›ã‚“" -#: commands/typecmds.c:988 commands/typecmds.c:2968 +#: commands/typecmds.c:992 commands/typecmds.c:2952 #, c-format msgid "exclusion constraints not possible for domains" msgstr "ドメインã§ã¯æŽ’除制約ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: commands/typecmds.c:994 commands/typecmds.c:2974 +#: commands/typecmds.c:998 commands/typecmds.c:2958 #, c-format msgid "foreign key constraints not possible for domains" msgstr "ドメイン用ã®å¤–部キー制約ã¯ã§ãã¾ã›ã‚“" -#: commands/typecmds.c:1003 commands/typecmds.c:2983 +#: commands/typecmds.c:1007 commands/typecmds.c:2967 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "ドメインã§ã¯åˆ¶ç´„é…å»¶ã®æŒ‡å®šã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: commands/typecmds.c:1317 utils/cache/typcache.c:2561 +#: commands/typecmds.c:1327 utils/cache/typcache.c:2570 #, c-format msgid "%s is not an enum" msgstr "%s ã¯æ•°å€¤ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/typecmds.c:1458 +#: commands/typecmds.c:1468 #, c-format msgid "type attribute \"subtype\" is required" msgstr "åž‹ã®å±žæ€§\"subtype\"ãŒå¿…è¦ã§ã™" -#: commands/typecmds.c:1463 +#: commands/typecmds.c:1473 #, c-format msgid "range subtype cannot be %s" msgstr "ç¯„å›²ã®æ´¾ç”Ÿå…ƒåž‹ã‚’%sã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/typecmds.c:1482 +#: commands/typecmds.c:1492 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "範囲ã®ç…§åˆé †åºãŒæŒ‡å®šã•れã¾ã—ãŸãŒã€æ´¾ç”Ÿã‚‚ã¨åž‹ãŒç…§åˆé †åºã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: commands/typecmds.c:1492 +#: commands/typecmds.c:1502 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "事å‰ã«ã‚·ã‚§ãƒ«åž‹ã‚’生æˆã›ãšã«æ­£è¦åŒ–関数を指定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/typecmds.c:1493 +#: commands/typecmds.c:1503 #, c-format msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." msgstr "最åˆã«åž‹ã‚’シェル型ã¨ã—ã¦ç”Ÿæˆã—ã¦ã€ç¶šã„ã¦æ­£è¦åŒ–関数を生æˆã—ãŸå¾Œã«å®Œå…¨ãª CREATE TYPE を実行ã—ã¦ãã ã•ã„。" -#: commands/typecmds.c:1965 +#: commands/typecmds.c:1975 #, c-format msgid "type input function %s has multiple matches" msgstr "åž‹ã®å…¥åŠ›é–¢æ•°%sãŒè¤‡æ•°åˆè‡´ã—ã¾ã™" -#: commands/typecmds.c:1983 +#: commands/typecmds.c:1993 #, c-format msgid "type input function %s must return type %s" msgstr "åž‹ã®å…¥åŠ›é–¢æ•°%sã¯åž‹%sã‚’è¿”ã™å¿…è¦ãŒã‚りã¾ã™" -#: commands/typecmds.c:1999 +#: commands/typecmds.c:2009 #, c-format msgid "type input function %s should not be volatile" msgstr "åž‹ã®å…¥åŠ›é–¢æ•°%sã¯volatileã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/typecmds.c:2027 +#: commands/typecmds.c:2037 #, c-format msgid "type output function %s must return type %s" msgstr "åž‹ã®å‡ºåŠ›é–¢æ•°%sã¯åž‹%sã‚’è¿”ã™å¿…è¦ãŒã‚りã¾ã™" -#: commands/typecmds.c:2034 +#: commands/typecmds.c:2044 #, c-format msgid "type output function %s should not be volatile" msgstr "åž‹ã®å‡ºåŠ›é–¢æ•°%sã¯volatileã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/typecmds.c:2063 +#: commands/typecmds.c:2073 #, c-format msgid "type receive function %s has multiple matches" msgstr "åž‹ã®å—信関数 %s ãŒè¤‡æ•°åˆè‡´ã—ã¾ã—ãŸ" -#: commands/typecmds.c:2081 +#: commands/typecmds.c:2091 #, c-format msgid "type receive function %s must return type %s" msgstr "åž‹ã®å—信関数%sã¯åž‹%sã‚’è¿”ã™å¿…è¦ãŒã‚りã¾ã™" -#: commands/typecmds.c:2088 +#: commands/typecmds.c:2098 #, c-format msgid "type receive function %s should not be volatile" msgstr "åž‹ã®å—信関数%sã¯volatileã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/typecmds.c:2116 +#: commands/typecmds.c:2126 #, c-format msgid "type send function %s must return type %s" msgstr "åž‹ã®é€ä¿¡é–¢æ•°%sã¯åž‹%sã‚’è¿”ã™å¿…è¦ãŒã‚りã¾ã™" -#: commands/typecmds.c:2123 +#: commands/typecmds.c:2133 #, c-format msgid "type send function %s should not be volatile" msgstr "åž‹ã®é€ä¿¡é–¢æ•°%sã¯volatileã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/typecmds.c:2150 +#: commands/typecmds.c:2160 #, c-format msgid "typmod_in function %s must return type %s" msgstr "typmod_in関数%sã¯åž‹%sã‚’è¿”ã™å¿…è¦ãŒã‚りã¾ã™" -#: commands/typecmds.c:2157 +#: commands/typecmds.c:2167 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "型修正å­ã®å…¥åŠ›é–¢æ•°%sã¯volatileã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/typecmds.c:2184 +#: commands/typecmds.c:2194 #, c-format msgid "typmod_out function %s must return type %s" msgstr "typmod_out関数%sã¯åž‹%sã‚’è¿”ã™å¿…è¦ãŒã‚りã¾ã™" -#: commands/typecmds.c:2191 +#: commands/typecmds.c:2201 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "型修正å­ã®å‡ºåŠ›é–¢æ•°%sã¯volatileã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/typecmds.c:2218 +#: commands/typecmds.c:2228 #, c-format msgid "type analyze function %s must return type %s" msgstr "åž‹ã®ANALYZE関数%sã¯%s型を返ã™å¿…è¦ãŒã‚りã¾ã™" -#: commands/typecmds.c:2247 +#: commands/typecmds.c:2257 #, c-format msgid "type subscripting function %s must return type %s" msgstr "åž‹ã®æ·»å­—処ç†é–¢æ•°%sã¯åž‹%sã‚’è¿”ã™å¿…è¦ãŒã‚りã¾ã™" -#: commands/typecmds.c:2257 +#: commands/typecmds.c:2267 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©åž‹ã¯æ·»å­—処ç†é–¢æ•°%sを使用ã§ãã¾ã›ã‚“" -#: commands/typecmds.c:2303 +#: commands/typecmds.c:2313 #, c-format msgid "You must specify an operator class for the range type or define a default operator class for the subtype." msgstr "ã“ã®ç¯„å›²åž‹ã«æ¼”ç®—å­ã‚¯ãƒ©ã‚¹ã‚’指定ã™ã‚‹ã‹ã€æ´¾ç”Ÿå…ƒã®åž‹ã§ãƒ‡ãƒ•ォルト演算å­ã‚¯ãƒ©ã‚¹ã‚’定義ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/typecmds.c:2334 +#: commands/typecmds.c:2344 #, c-format msgid "range canonical function %s must return range type" msgstr "ç¯„å›²ã®æ­£è¦åŒ–関数 %s ã¯ç¯„囲型を返ã™å¿…è¦ãŒã‚りã¾ã™" -#: commands/typecmds.c:2340 +#: commands/typecmds.c:2350 #, c-format msgid "range canonical function %s must be immutable" msgstr "ç¯„å›²ã®æ­£è¦åŒ–関数 %s ã¯ä¸å¤‰é–¢æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/typecmds.c:2376 +#: commands/typecmds.c:2386 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "ç¯„å›²ã®æ´¾ç”Ÿå…ƒã®åž‹ã®å·®åˆ†é–¢æ•° %s 㯠%s型を返ã™å¿…è¦ãŒã‚りã¾ã™" -#: commands/typecmds.c:2383 +#: commands/typecmds.c:2393 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "ç¯„å›²ã®æ´¾ç”Ÿå…ƒã®åž‹ã®å·®åˆ†é–¢æ•° %s ã¯ä¸å¤‰é–¢æ•°ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/typecmds.c:2410 +#: commands/typecmds.c:2420 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã«pg_typeã®é…列型OIDãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#: commands/typecmds.c:2443 +#: commands/typecmds.c:2453 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã«pg_typeã®è¤‡ç¯„囲型OIDã®å€¤ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#: commands/typecmds.c:2476 +#: commands/typecmds.c:2486 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã«pg_typeã®è¤‡ç¯„囲é…列型OIDã®å€¤ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#: commands/typecmds.c:2772 -#, c-format -msgid "column \"%s\" of table \"%s\" contains null values" -msgstr "テーブル\"%2$s\"ã®åˆ—\"%1$s\"ã«NULL値ãŒã‚りã¾ã™" - -#: commands/typecmds.c:2885 commands/typecmds.c:3086 +#: commands/typecmds.c:2868 commands/typecmds.c:3093 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "ドメイン\"%2$s\"ã®åˆ¶ç´„\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/typecmds.c:2889 +#: commands/typecmds.c:2872 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "ドメイン\"%2$s\"ã®åˆ¶ç´„\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/typecmds.c:3093 +#: commands/typecmds.c:3100 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "ドメイン\"%2$s\"ã®åˆ¶ç´„\"%1$s\"ã¯æ¤œæŸ»åˆ¶ç´„ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/typecmds.c:3194 +#: commands/typecmds.c:3180 +#, c-format +msgid "column \"%s\" of table \"%s\" contains null values" +msgstr "テーブル\"%2$s\"ã®åˆ—\"%1$s\"ã«NULL値ãŒã‚りã¾ã™" + +#: commands/typecmds.c:3269 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "テーブル\"%2$s\"ã®åˆ—\"%1$s\"ã«æ–°ã—ã„制約ã«é•åã™ã‚‹å€¤ãŒã‚りã¾ã™" -#: commands/typecmds.c:3423 commands/typecmds.c:3622 commands/typecmds.c:3703 commands/typecmds.c:3889 +#: commands/typecmds.c:3498 commands/typecmds.c:3772 commands/typecmds.c:3857 commands/typecmds.c:4073 #, c-format msgid "%s is not a domain" msgstr "%s ã¯ãƒ‰ãƒ¡ã‚¤ãƒ³ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/typecmds.c:3455 +#: commands/typecmds.c:3532 commands/typecmds.c:3686 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "ドメイン\"%2$s\"ã®åˆ¶ç´„\"%1$s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/typecmds.c:3506 +#: commands/typecmds.c:3583 #, c-format msgid "cannot use table references in domain check constraint" msgstr "ãƒ‰ãƒ¡ã‚¤ãƒ³ã®æ¤œæŸ»åˆ¶ç´„ã§ã¯ãƒ†ãƒ¼ãƒ–ルå‚照を使用ã§ãã¾ã›ã‚“" -#: commands/typecmds.c:3634 commands/typecmds.c:3715 commands/typecmds.c:4006 +#: commands/typecmds.c:3784 commands/typecmds.c:3869 commands/typecmds.c:4223 #, c-format msgid "%s is a table's row type" msgstr "%sã¯ãƒ†ãƒ¼ãƒ–ルã®è¡Œåž‹ã§ã™" -#: commands/typecmds.c:3636 commands/typecmds.c:3717 commands/typecmds.c:4008 -#, c-format -msgid "Use ALTER TABLE instead." -msgstr "代ã‚りã«ALTER TABLEを使用ã—ã¦ãã ã•ã„" - -#: commands/typecmds.c:3642 commands/typecmds.c:3723 commands/typecmds.c:3921 +#: commands/typecmds.c:3794 commands/typecmds.c:3879 commands/typecmds.c:4121 #, c-format msgid "cannot alter array type %s" msgstr "é…列型%sを変更ã§ãã¾ã›ã‚“" -#: commands/typecmds.c:3644 commands/typecmds.c:3725 commands/typecmds.c:3923 +#: commands/typecmds.c:3796 commands/typecmds.c:3881 commands/typecmds.c:4123 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "åž‹%sを変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã¯åŒæ™‚ã«ãã®é…列型も変更ã—ã¾ã™ã€‚" -#: commands/typecmds.c:3991 +#: commands/typecmds.c:3892 +#, c-format +msgid "cannot alter multirange type %s" +msgstr "複範囲型%sを変更ã§ãã¾ã›ã‚“" + +#: commands/typecmds.c:3895 +#, c-format +msgid "You can alter type %s, which will alter the multirange type as well." +msgstr "åž‹%sを変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã¯åŒæ™‚ã«ãã®è¤‡ç¯„囲型も変更ã—ã¾ã™ã€‚" + +#: commands/typecmds.c:4202 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "åž‹\"%s\"ã¯ã‚¹ã‚­ãƒ¼ãƒž\"%s\"内ã«ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/typecmds.c:4159 +#: commands/typecmds.c:4382 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "åž‹ã®æ ¼ç´æ–¹å¼ã‚’PLAINã«ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/typecmds.c:4252 +#: commands/typecmds.c:4475 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "åž‹ã®å±žæ€§\"%s\"ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/typecmds.c:4270 +#: commands/typecmds.c:4493 #, c-format msgid "must be superuser to alter a type" msgstr "åž‹ã®å¤‰æ›´ã‚’行ã†ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/typecmds.c:4291 commands/typecmds.c:4300 +#: commands/typecmds.c:4514 commands/typecmds.c:4523 #, c-format msgid "%s is not a base type" msgstr "\"%s\"ã¯åŸºæœ¬åž‹ã§ã¯ã‚りã¾ã›ã‚“" -#: commands/user.c:201 +#: commands/user.c:200 #, c-format msgid "SYSID can no longer be specified" msgstr "SYSIDã¯ã‚‚ã†æŒ‡å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: commands/user.c:319 commands/user.c:325 commands/user.c:331 commands/user.c:337 commands/user.c:343 +#: commands/user.c:318 commands/user.c:324 commands/user.c:330 commands/user.c:336 commands/user.c:342 #, c-format msgid "permission denied to create role" msgstr "ロールを作æˆã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/user.c:320 +#: commands/user.c:319 #, c-format msgid "Only roles with the %s attribute may create roles." msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒãƒ­ãƒ¼ãƒ«ã‚’作æˆã§ãã¾ã™ã€‚" -#: commands/user.c:326 commands/user.c:332 commands/user.c:338 commands/user.c:344 +#: commands/user.c:325 commands/user.c:331 commands/user.c:337 commands/user.c:343 #, c-format -msgid "Only roles with the %s attribute may create roles with %s." +msgid "Only roles with the %s attribute may create roles with the %s attribute." msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒ%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã‚’作æˆã§ãã¾ã™ã€‚" -#: commands/user.c:355 commands/user.c:1393 commands/user.c:1400 gram.y:16727 gram.y:16773 utils/adt/acl.c:5409 utils/adt/acl.c:5415 +#: commands/user.c:354 commands/user.c:1386 commands/user.c:1393 gram.y:17310 gram.y:17356 utils/adt/acl.c:5574 utils/adt/acl.c:5580 #, c-format msgid "role name \"%s\" is reserved" msgstr "ロールå\"%s\"ã¯äºˆç´„ã•れã¦ã„ã¾ã™" -#: commands/user.c:357 commands/user.c:1395 commands/user.c:1402 +#: commands/user.c:356 commands/user.c:1388 commands/user.c:1395 #, c-format msgid "Role names starting with \"pg_\" are reserved." msgstr "\"pg_\"ã§å§‹ã¾ã‚‹ãƒ­ãƒ¼ãƒ«åã¯äºˆç´„ã•れã¦ã„ã¾ã™ã€‚" -#: commands/user.c:378 commands/user.c:1417 +#: commands/user.c:377 commands/user.c:1410 #, c-format msgid "role \"%s\" already exists" msgstr "ロール\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: commands/user.c:440 commands/user.c:925 +#: commands/user.c:439 commands/user.c:924 #, c-format msgid "empty string is not a valid password, clearing password" msgstr "ç©ºã®æ–‡å­—列ã¯ãƒ‘スワードã¨ã—ã¦ä½¿ãˆã¾ã›ã‚“ã€ãƒ‘スワードを消去ã—ã¾ã™" -#: commands/user.c:469 +#: commands/user.c:468 #, c-format msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã«pg_authidã®OIDãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#: commands/user.c:653 commands/user.c:1011 +#: commands/user.c:652 commands/user.c:1010 msgid "Cannot alter reserved roles." msgstr "予約ロールã¯å¤‰æ›´ã§ãã¾ã›ã‚“。" -#: commands/user.c:760 commands/user.c:766 commands/user.c:782 commands/user.c:790 commands/user.c:804 commands/user.c:810 commands/user.c:816 commands/user.c:825 commands/user.c:870 commands/user.c:1033 commands/user.c:1044 +#: commands/user.c:759 commands/user.c:765 commands/user.c:781 commands/user.c:789 commands/user.c:803 commands/user.c:809 commands/user.c:815 commands/user.c:824 commands/user.c:869 commands/user.c:1032 commands/user.c:1043 #, c-format msgid "permission denied to alter role" msgstr "ロールを変更ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/user.c:761 commands/user.c:1034 +#: commands/user.c:760 commands/user.c:1033 #, c-format -msgid "Only roles with the %s attribute may alter roles with %s." +msgid "Only roles with the %s attribute may alter roles with the %s attribute." msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒ%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã‚’変更ã§ãã¾ã™ã€‚" -#: commands/user.c:767 commands/user.c:805 commands/user.c:811 commands/user.c:817 +#: commands/user.c:766 commands/user.c:804 commands/user.c:810 commands/user.c:816 #, c-format msgid "Only roles with the %s attribute may change the %s attribute." msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒ%s属性を変更ã§ãã¾ã™ã€‚" -#: commands/user.c:783 commands/user.c:1045 +#: commands/user.c:782 commands/user.c:1044 #, c-format msgid "Only roles with the %s attribute and the %s option on role \"%s\" may alter this role." msgstr "%1$s属性ãŠã‚ˆã³ãƒ­ãƒ¼ãƒ«\"%3$s\"ã«å¯¾ã™ã‚‹%2$sオプションをæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã“ã®ãƒ­ãƒ¼ãƒ«ã‚’変更ã§ãã¾ã™ã€‚" -#: commands/user.c:791 +#: commands/user.c:790 #, c-format msgid "To change another role's password, the current user must have the %s attribute and the %s option on the role." msgstr "ä»–ã®ãƒ­ãƒ¼ãƒ«ã®ãƒ‘スワードを変更ã™ã‚‹ã«ã¯ã€ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯%s属性ãŠã‚ˆã³ã“ã®ãƒ­ãƒ¼ãƒ«ã«å¯¾ã™ã‚‹%sオプションをæŒã¤å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/user.c:826 +#: commands/user.c:825 #, c-format -msgid "Only roles with the %s option on role \"%s\" may add members." -msgstr "ロール\"%2$s\"ã«å¯¾ã™ã‚‹%1$sオプションをæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒãƒ¡ãƒ³ãƒã‚’追加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" +msgid "Only roles with the %s option on role \"%s\" may add or drop members." +msgstr "ロール\"%2$s\"ã«å¯¾ã™ã‚‹%1$sオプションをæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒãƒ¡ãƒ³ãƒã®è¿½åŠ ãŠã‚ˆã³å‰Šé™¤ã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: commands/user.c:871 +#: commands/user.c:870 #, c-format -msgid "The bootstrap user must have the %s attribute." -msgstr "ブートストラップユーザーã¯%s属性をæŒã¤å¿…è¦ãŒã‚りã¾ã™ã€‚" +msgid "The bootstrap superuser must have the %s attribute." +msgstr "ブートストラップスーパーユーザーã¯%s属性をæŒã¤å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/user.c:1076 +#: commands/user.c:1075 #, c-format msgid "permission denied to alter setting" msgstr "è¨­å®šå¤‰æ›´ã®æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/user.c:1077 +#: commands/user.c:1076 #, c-format msgid "Only roles with the %s attribute may alter settings globally." msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã‚µãƒ¼ãƒãƒ¼å…¨ä½“ã®è¨­å®šå¤‰æ›´ã‚’行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: commands/user.c:1101 commands/user.c:1173 commands/user.c:1179 +#: commands/user.c:1100 commands/user.c:1171 commands/user.c:1177 #, c-format msgid "permission denied to drop role" msgstr "ロールを削除ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/user.c:1102 +#: commands/user.c:1101 #, c-format msgid "Only roles with the %s attribute and the %s option on the target roles may drop roles." msgstr "%s属性ãŠã‚ˆã³å‰Šé™¤å¯¾è±¡ãƒ­ãƒ¼ãƒ«ã«å¯¾ã™ã‚‹%sオプションをæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒãƒ­ãƒ¼ãƒ«ã‚’削除ã§ãã¾ã™ã€‚" -#: commands/user.c:1127 +#: commands/user.c:1125 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "DROP ROLE ã§ç‰¹æ®Šãƒ­ãƒ¼ãƒ«ã®è­˜åˆ¥å­ã¯ä½¿ãˆã¾ã›ã‚“" -#: commands/user.c:1137 commands/user.c:1364 commands/variable.c:836 commands/variable.c:839 commands/variable.c:923 commands/variable.c:926 utils/adt/acl.c:359 utils/adt/acl.c:379 utils/adt/acl.c:5264 utils/adt/acl.c:5312 utils/adt/acl.c:5340 utils/adt/acl.c:5359 utils/adt/regproc.c:1551 utils/init/miscinit.c:757 +#: commands/user.c:1135 commands/user.c:1357 commands/variable.c:851 commands/variable.c:854 commands/variable.c:971 commands/variable.c:974 utils/adt/acl.c:365 utils/adt/acl.c:385 utils/adt/acl.c:5429 utils/adt/acl.c:5477 utils/adt/acl.c:5505 utils/adt/acl.c:5524 utils/adt/regproc.c:1571 utils/init/miscinit.c:799 #, c-format msgid "role \"%s\" does not exist" msgstr "ロール\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/user.c:1142 +#: commands/user.c:1140 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "ロール\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/user.c:1155 commands/user.c:1159 +#: commands/user.c:1153 commands/user.c:1157 #, c-format msgid "current user cannot be dropped" msgstr "ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’削除ã§ãã¾ã›ã‚“" -#: commands/user.c:1163 +#: commands/user.c:1161 #, c-format msgid "session user cannot be dropped" msgstr "セッションã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’削除ã§ãã¾ã›ã‚“" -#: commands/user.c:1174 +#: commands/user.c:1172 #, c-format -msgid "Only roles with the %s attribute may drop roles with %s." +msgid "Only roles with the %s attribute may drop roles with the %s attribute." msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒ%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã‚’削除ã§ãã¾ã™ã€‚" -#: commands/user.c:1180 +#: commands/user.c:1178 #, c-format msgid "Only roles with the %s attribute and the %s option on role \"%s\" may drop this role." msgstr "%1$s属性ã¨ãƒ­ãƒ¼ãƒ«\"%3$s\"ã«å¯¾ã™ã‚‹%2$sオプションをæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã“ã®ãƒ­ãƒ¼ãƒ«ã‚’削除ã§ãã¾ã™ã€‚" -#: commands/user.c:1306 +#: commands/user.c:1299 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "ä»–ã®ã‚ªãƒ–ジェクトãŒä¾å­˜ã—ã¦ã„ã¾ã™ã®ã§ãƒ­ãƒ¼ãƒ«\"%s\"を削除ã§ãã¾ã›ã‚“" -#: commands/user.c:1380 +#: commands/user.c:1373 #, c-format msgid "session user cannot be renamed" msgstr "セッションユーザーã®åå‰ã‚’変更ã§ãã¾ã›ã‚“" -#: commands/user.c:1384 +#: commands/user.c:1377 #, c-format msgid "current user cannot be renamed" msgstr "ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®åå‰ã‚’変更ã§ãã¾ã›ã‚“" -#: commands/user.c:1428 commands/user.c:1438 +#: commands/user.c:1421 commands/user.c:1431 #, c-format msgid "permission denied to rename role" msgstr "ロールã®åå‰ã‚’変更ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/user.c:1429 +#: commands/user.c:1422 #, c-format -msgid "Only roles with the %s attribute may rename roles with %s." +msgid "Only roles with the %s attribute may rename roles with the %s attribute." msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒ%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®åå‰ã‚’変更ã§ãã¾ã™ã€‚" -#: commands/user.c:1439 +#: commands/user.c:1432 #, c-format msgid "Only roles with the %s attribute and the %s option on role \"%s\" may rename this role." msgstr "%1$s属性ã¨ãƒ­ãƒ¼ãƒ«\"%3$s\"ã«å¯¾ã™ã‚‹%2$sオプションをæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã“ã®ãƒ­ãƒ¼ãƒ«ã®åå‰ã‚’変更ã§ãã¾ã™ã€‚" -#: commands/user.c:1461 +#: commands/user.c:1454 #, c-format msgid "MD5 password cleared because of role rename" msgstr "ロールåãŒå¤‰æ›´ã•れãŸãŸã‚MD5パスワードãŒã‚¯ãƒªã‚¢ã•れã¾ã—ãŸ" -#: commands/user.c:1525 gram.y:1263 +#: commands/user.c:1518 gram.y:1294 #, c-format msgid "unrecognized role option \"%s\"" msgstr "ロールオプション\"%s\"ãŒèªè­˜ã§ãã¾ã›ã‚“" -#: commands/user.c:1530 +#: commands/user.c:1523 #, c-format msgid "unrecognized value for role option \"%s\": \"%s\"" msgstr "ロールオプション\"%s\"ã«å¯¾ã™ã‚‹èªè­˜ã§ããªã„値: \"%s\"" -#: commands/user.c:1563 +#: commands/user.c:1556 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "列å㌠GRANT/REVOKE ROLE ã«å«ã¾ã‚Œã¦ã„ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/user.c:1603 +#: commands/user.c:1596 #, c-format msgid "permission denied to drop objects" msgstr "オブジェクトを削除ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/user.c:1604 +#: commands/user.c:1597 #, c-format msgid "Only roles with privileges of role \"%s\" may drop objects owned by it." msgstr "ロール\"%s\"ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã€ãã®ãƒ­ãƒ¼ãƒ«ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトを削除ã§ãã¾ã™ã€‚" -#: commands/user.c:1632 commands/user.c:1643 +#: commands/user.c:1625 commands/user.c:1636 #, c-format msgid "permission denied to reassign objects" msgstr "オブジェクトをå†å‰²å½“ã¦ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/user.c:1633 +#: commands/user.c:1626 #, c-format msgid "Only roles with privileges of role \"%s\" may reassign objects owned by it." msgstr "ロール\"%s\"ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã€ãã®ãƒ­ãƒ¼ãƒ«ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…を変更ã§ãã¾ã™ã€‚" -#: commands/user.c:1644 +#: commands/user.c:1637 #, c-format msgid "Only roles with privileges of role \"%s\" may reassign objects to it." msgstr "ロール\"%s\"ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã€ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã‚’ãã®ãƒ­ãƒ¼ãƒ«ã«å¤‰æ›´ã§ãã¾ã™ã€‚" -#: commands/user.c:1740 +#: commands/user.c:1733 #, c-format msgid "role \"%s\" cannot be a member of any role" msgstr "ロール\"%s\"ã¯ã©ã®ãƒ­ãƒ¼ãƒ«ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã‚‚ãªã‚Œã¾ã›ã‚“" -#: commands/user.c:1753 +#: commands/user.c:1746 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "ロール\"%s\"ã¯ãƒ­ãƒ¼ãƒ«\"%s\"ã®ãƒ¡ãƒ³ãƒã§ã™" -#: commands/user.c:1793 commands/user.c:1819 +#: commands/user.c:1786 commands/user.c:1812 #, c-format msgid "%s option cannot be granted back to your own grantor" msgstr "%sオプションã¯ã‚‚ã¨ã®ä»˜ä¸Žè€…ã«ä»˜ä¸Žã—è¿”ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/user.c:1896 +#: commands/user.c:1889 #, c-format msgid "role \"%s\" has already been granted membership in role \"%s\" by role \"%s\"" msgstr "ロール\"%s\"ã¯ã™ã§ã«ãƒ­ãƒ¼ãƒ«\"%s\"ã®ãƒ¡ãƒ³ãƒæ¨©é™ã‚’ロール\"%s\"ã«ã‚ˆã£ã¦ä»˜ä¸Žã•れã¦ã„ã¾ã™" -#: commands/user.c:2031 +#: commands/user.c:2024 #, c-format msgid "role \"%s\" has not been granted membership in role \"%s\" by role \"%s\"" msgstr "ロール\"%s\"ã¯ãƒ­ãƒ¼ãƒ«\"%s\"ã®ãƒ¡ãƒ³ãƒæ¨©é™ã‚’ロール\"%s\"ã«ã‚ˆã£ã¦ä»˜ä¸Žã•れã¦ã„ã¾ã›ã‚“" -#: commands/user.c:2131 +#: commands/user.c:2124 #, c-format msgid "role \"%s\" cannot have explicit members" msgstr "ロール\"%s\"ã¯æ˜Žç¤ºçš„ãªãƒ¡ãƒ³ãƒãƒ¼ã‚’æŒã¦ã¾ã›ã‚“" -#: commands/user.c:2142 commands/user.c:2165 +#: commands/user.c:2135 commands/user.c:2158 #, c-format msgid "permission denied to grant role \"%s\"" msgstr "ロール\"%s\"権é™ã‚’付与ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/user.c:2144 +#: commands/user.c:2137 #, c-format -msgid "Only roles with the %s attribute may grant roles with %s." +msgid "Only roles with the %s attribute may grant roles with the %s attribute." msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒ%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®æ¨©é™ã‚’付与ã§ãã¾ã™ã€‚" -#: commands/user.c:2149 commands/user.c:2172 +#: commands/user.c:2142 commands/user.c:2165 #, c-format msgid "permission denied to revoke role \"%s\"" msgstr "ロール\"%s\"ã®æ¨©é™ã‚’剥奪ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/user.c:2151 +#: commands/user.c:2144 #, c-format -msgid "Only roles with the %s attribute may revoke roles with %s." +msgid "Only roles with the %s attribute may revoke roles with the %s attribute." msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒ%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®æ¨©é™ã‚’剥奪ã§ãã¾ã™ã€‚" -#: commands/user.c:2167 +#: commands/user.c:2160 #, c-format msgid "Only roles with the %s option on role \"%s\" may grant this role." msgstr "ロール\"%2$s\"ã«å¯¾ã™ã‚‹%1$sオプションをæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã“ã®ãƒ­ãƒ¼ãƒ«æ¨©é™ã‚’付与ã§ãã¾ã™ã€‚" -#: commands/user.c:2174 +#: commands/user.c:2167 #, c-format msgid "Only roles with the %s option on role \"%s\" may revoke this role." msgstr "ロール\"%2$s\"ã«å¯¾ã™ã‚‹%1$sオプションをæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã“ã®ãƒ­ãƒ¼ãƒ«æ¨©é™ã‚’剥奪ã§ãã¾ã™ã€‚" -#: commands/user.c:2254 commands/user.c:2263 +#: commands/user.c:2247 commands/user.c:2256 #, c-format msgid "permission denied to grant privileges as role \"%s\"" msgstr "ロール\"%s\"ã¨ã—ã¦æ¨©é™ã‚’付与ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/user.c:2256 +#: commands/user.c:2249 #, c-format msgid "Only roles with privileges of role \"%s\" may grant privileges as this role." msgstr "ロール\"%s\"ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã“ã®ãƒ­ãƒ¼ãƒ«ã¨ã—ã¦æ¨©é™ã‚’付与ã§ãã¾ã™ã€‚" -#: commands/user.c:2265 +#: commands/user.c:2258 #, c-format msgid "The grantor must have the %s option on role \"%s\"." msgstr "付与者ã¯ãƒ­ãƒ¼ãƒ«\"%s\"ã«å¯¾ã™ã‚‹%sオプションをæŒã¤å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/user.c:2273 +#: commands/user.c:2266 #, c-format msgid "permission denied to revoke privileges granted by role \"%s\"" msgstr "ロール\"%s\"ã«ã‚ˆã£ã¦ä»˜ä¸Žã•ã‚ŒãŸæ¨©é™ã‚’剥奪ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/user.c:2275 +#: commands/user.c:2268 #, c-format msgid "Only roles with privileges of role \"%s\" may revoke privileges granted by this role." msgstr "ロール\"%s\"ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã“ã®ãƒ­ãƒ¼ãƒ«ãŒä»˜ä¸Žã—ãŸæ¨©é™ã‚’剥奪ã§ãã¾ã™ã€‚" -#: commands/user.c:2498 utils/adt/acl.c:1312 +#: commands/user.c:2491 utils/adt/acl.c:1324 #, c-format msgid "dependent privileges exist" msgstr "ä¾å­˜ã™ã‚‹æ¨©é™ãŒå­˜åœ¨ã—ã¾ã™" -#: commands/user.c:2499 utils/adt/acl.c:1313 +#: commands/user.c:2492 utils/adt/acl.c:1325 #, c-format msgid "Use CASCADE to revoke them too." msgstr "ã“れらも剥奪ã™ã‚‹ã«ã¯CASCADEを使用ã—ã¦ãã ã•ã„" -#: commands/vacuum.c:138 +#: commands/vacuum.c:134 #, c-format msgid "\"vacuum_buffer_usage_limit\" must be 0 or between %d kB and %d kB" msgstr "\"vacuum_buffer_usage_limit\"ã¯0ã¾ãŸã¯%d kBã¨%d kBã®é–“ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/vacuum.c:210 +#: commands/vacuum.c:209 #, c-format msgid "BUFFER_USAGE_LIMIT option must be 0 or between %d kB and %d kB" msgstr "BUFFER_USAGE_LIMITオプションã¯0ã¾ãŸã¯%d kBã¨%d kBã®é–“ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/vacuum.c:220 +#: commands/vacuum.c:219 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "ANALYZEオプション\"%s\"ãŒèªè­˜ã§ãã¾ã›ã‚“" -#: commands/vacuum.c:260 +#: commands/vacuum.c:259 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "パラレルオプションã«ã¯0ã‹ã‚‰%dã¾ã§ã®å€¤ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: commands/vacuum.c:272 +#: commands/vacuum.c:271 #, c-format msgid "parallel workers for vacuum must be between 0 and %d" msgstr "VACUUMã®ä¸¦åˆ—ãƒ¯ãƒ¼ã‚«ãƒ¼ã®æ•°ã¯ã¯0ã‹ã‚‰%dã¾ã§ã®å€¤ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: commands/vacuum.c:293 +#: commands/vacuum.c:292 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "èªè­˜ã§ããªã„VACUUMオプション \"%s\"" -#: commands/vacuum.c:319 +#: commands/vacuum.c:318 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULLã¯ä¸¦åˆ—実行ã§ãã¾ã›ã‚“" -#: commands/vacuum.c:330 +#: commands/vacuum.c:329 #, c-format msgid "BUFFER_USAGE_LIMIT cannot be specified for VACUUM FULL" msgstr "BUFFER_USAGE_LIMITã¯VACUUM FULLã«å¯¾ã—ã¦ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/vacuum.c:344 +#: commands/vacuum.c:343 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "ANALYZE オプションã¯åˆ—リストãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã‚‹ã¨ãã®ã¿æŒ‡å®šã§ãã¾ã™" -#: commands/vacuum.c:356 +#: commands/vacuum.c:355 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "VACUUM ã®ã‚ªãƒ—ションDISABLE_PAGE_SKIPPINGã¯FULLã¨åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: commands/vacuum.c:363 +#: commands/vacuum.c:362 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" msgstr "VACUUM FULLã§ã¯PROCESS_TOASTã®æŒ‡å®šãŒå¿…é ˆã§ã™" -#: commands/vacuum.c:372 +#: commands/vacuum.c:371 #, c-format msgid "ONLY_DATABASE_STATS cannot be specified with a list of tables" msgstr "ONLY_DATABASE_STATSã¯ãƒ†ãƒ¼ãƒ–ルã®ãƒªã‚¹ãƒˆã¨ä¸€ç·’ã«æŒ‡å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/vacuum.c:381 +#: commands/vacuum.c:380 #, c-format msgid "ONLY_DATABASE_STATS cannot be specified with other VACUUM options" msgstr "ONLY_DATABASE_STATSã¯ä»–ã®VACUUMオプションã¨ä¸€ç·’ã«æŒ‡å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/vacuum.c:516 +#: commands/vacuum.c:515 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%sã¯VACUUMã‚„ANALYZEã‹ã‚‰ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: commands/vacuum.c:736 +#: commands/vacuum.c:730 #, c-format msgid "permission denied to vacuum \"%s\", skipping it" msgstr "列%sã®VACUUMã‚’è¡Œã†æ¨©é™ãŒã‚りã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/vacuum.c:749 +#: commands/vacuum.c:743 #, c-format msgid "permission denied to analyze \"%s\", skipping it" msgstr "列%sã®ANALYZEã‚’è¡Œã†æ¨©é™ãŒã‚りã¾ã›ã‚“ã€ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™" -#: commands/vacuum.c:827 commands/vacuum.c:924 +#: commands/vacuum.c:821 commands/vacuum.c:918 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "\"%s\"ã®VACUUM処ç†ã‚’スキップã—ã¦ã„ã¾ã™ -- ロックをç²å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: commands/vacuum.c:832 +#: commands/vacuum.c:826 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "\"%s\"ã®VACUUM処ç†ã‚’スキップã—ã¦ã„ã¾ã™ -- リレーションã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/vacuum.c:848 commands/vacuum.c:929 +#: commands/vacuum.c:842 commands/vacuum.c:923 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "\"%s\"ã®ANALYZEをスキップã—ã¦ã„ã¾ã™ --- ロックç²å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: commands/vacuum.c:853 +#: commands/vacuum.c:847 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "\"%s\"ã®ANALYZEをスキップã—ã¾ã™ --- リレーションã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã›ã‚“" -#: commands/vacuum.c:1164 +#: commands/vacuum.c:1139 #, c-format msgid "cutoff for removing and freezing tuples is far in the past" msgstr "タプルã®å‰Šé™¤ãŠã‚ˆã³ãƒ•リーズã®ã‚«ãƒƒãƒˆã‚ªãƒ•値ãŒå¤ã™ãŽã¾ã™" -#: commands/vacuum.c:1165 commands/vacuum.c:1170 +#: commands/vacuum.c:1140 commands/vacuum.c:1145 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -12233,37 +12692,37 @@ msgstr "" "周回å•題を回é¿ã™ã‚‹ãŸã‚ã«ã™ãã«å®Ÿè¡Œä¸­ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’終了ã—ã¦ãã ã•ã„。\n" "å¤ã„準備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚³ãƒŸãƒƒãƒˆã¾ãŸã¯ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ã€ã‚‚ã—ãã¯å¤ã„レプリケーションスロットã®å‰Šé™¤ãŒå¿…è¦ãªå ´åˆã‚‚ã‚りã¾ã™ã€‚" -#: commands/vacuum.c:1169 +#: commands/vacuum.c:1144 #, c-format msgid "cutoff for freezing multixacts is far in the past" msgstr "マルãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ãƒ•リーズã®ã‚«ãƒƒãƒˆã‚ªãƒ•値ãŒå¤ã™ãŽã¾ã™" -#: commands/vacuum.c:1897 +#: commands/vacuum.c:1900 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "データベースã®ä¸€éƒ¨ã¯20億トランザクション以上ã®é–“ã«VACUUMを実行ã•れã¦ã„ã¾ã›ã‚“ã§ã—ãŸ" -#: commands/vacuum.c:1898 +#: commands/vacuum.c:1901 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "トランザクションã®å‘¨å›žã«ã‚ˆã‚‹ãƒ‡ãƒ¼ã‚¿æå¤±ãŒç™ºç”Ÿã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™" -#: commands/vacuum.c:2063 +#: commands/vacuum.c:2080 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "\"%s\"をスキップã—ã¦ã„ã¾ã™ --- テーブルã§ã¯ãªã„ã‚‚ã®ã‚„ã€ç‰¹åˆ¥ãªã‚·ã‚¹ãƒ†ãƒ ãƒ†ãƒ¼ãƒ–ルã«å¯¾ã—ã¦ã¯VACUUMを実行ã§ãã¾ã›ã‚“" -#: commands/vacuum.c:2488 +#: commands/vacuum.c:2512 #, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "%2$d行ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’削除ã™ã‚‹ãŸã‚インデックス\"%1$s\"をスキャンã—ã¾ã—ãŸ" +msgid "scanned index \"%s\" to remove %lld row versions" +msgstr "インデックス\"%s\"をスキャンã—ã¦%lldã®è¡Œãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’削除ã—ã¾ã—ãŸ" -#: commands/vacuum.c:2507 +#: commands/vacuum.c:2531 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "ç¾åœ¨ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\"%s\"ã¯%.0f行ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’%uページã§å«ã‚“ã§ã„ã¾ã™" -#: commands/vacuum.c:2511 +#: commands/vacuum.c:2535 #, c-format msgid "" "%.0f index row versions were removed.\n" @@ -12274,13 +12733,13 @@ msgstr "" "%uインデックスページを新ãŸã«å‰Šé™¤\n" "%uページãŒç¾åœ¨å‰Šé™¤ä¸­ã€ã†ã¡%uページãŒå†åˆ©ç”¨å¯èƒ½ã€‚" -#: commands/vacuumparallel.c:677 +#: commands/vacuumparallel.c:707 #, c-format msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" msgstr[0] "インデックスã®VACUUMã®ãŸã‚ã«%d個ã®ä¸¦åˆ—VACUUMワーカーを起動ã—ã¾ã—㟠(計画値: %d)" -#: commands/vacuumparallel.c:683 +#: commands/vacuumparallel.c:713 #, c-format msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" @@ -12341,7 +12800,7 @@ msgstr "SET TRANSACTION ISOLATION LEVEL ã¯å•ã„åˆã‚ã›ã‚ˆã‚Šå‰ã«å®Ÿè¡Œã™ msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" msgstr "SET TRANSACTION ISOLATION LEVELをサブトランザクションã§å‘¼ã³å‡ºã—ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: commands/variable.c:606 storage/lmgr/predicate.c:1629 +#: commands/variable.c:606 storage/lmgr/predicate.c:1685 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "ホットスタンãƒã‚¤ä¸­ã¯ã‚·ãƒªã‚¢ãƒ©ã‚¤ã‚ºãƒ¢ãƒ¼ãƒ‰ã‚’使用ã§ãã¾ã›ã‚“" @@ -12369,94 +12828,104 @@ msgstr "%sã¨%s é–“ã®å¤‰æ›ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。" #: commands/variable.c:720 #, c-format msgid "Cannot change \"client_encoding\" now." -msgstr "ç¾åœ¨ã¯\"client_encoding\"を変更ã§ãã¾ã›ã‚“。" +msgstr "ç¾åœ¨\"client_encoding\"を変更ã§ãã¾ã›ã‚“。" #: commands/variable.c:781 #, c-format -msgid "cannot change client_encoding during a parallel operation" +msgid "cannot change \"client_encoding\" during a parallel operation" msgstr "並列処ç†ä¸­ã¯\"client_encoding\"を変更ã§ãã¾ã›ã‚“" -#: commands/variable.c:948 +#: commands/variable.c:876 +#, c-format +msgid "permission will be denied to set session authorization \"%s\"" +msgstr "セッションèªè¨¼ã‚’\"%s\"ã«è¨­å®šã™ã‚‹æ¨©é™ã¯æ‹’å¦ã•れã¾ã™" + +#: commands/variable.c:881 +#, c-format +msgid "permission denied to set session authorization \"%s\"" +msgstr "セッションèªè¨¼ã‚’\"%s\"ã«è¨­å®šã™ã‚‹æ¨©é™ã¯æ‹’å¦ã•れã¾ã—ãŸ" + +#: commands/variable.c:991 #, c-format msgid "permission will be denied to set role \"%s\"" msgstr "ロール\"%s\"を設定ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/variable.c:953 +#: commands/variable.c:996 #, c-format msgid "permission denied to set role \"%s\"" msgstr "ロール\"%s\"を設定ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: commands/variable.c:1153 +#: commands/variable.c:1200 #, c-format msgid "Bonjour is not supported by this build" msgstr "ã“ã®ãƒ“ルドã§ã¯ bonjour ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/variable.c:1181 +#: commands/variable.c:1228 #, c-format -msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." +msgid "\"effective_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()." msgstr "posix_fadvise() ã‚’ã‚‚ãŸãªã„プラットフォームã§ã¯effective_io_concurrencyã¯0ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/variable.c:1194 +#: commands/variable.c:1241 #, c-format -msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." +msgid "\"maintenance_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()." msgstr "posix_fadvise() ã‚’ã‚‚ãŸãªã„プラットフォームã§ã¯maintenance_io_concurrencyã¯0ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: commands/variable.c:1207 +#: commands/variable.c:1254 #, c-format msgid "SSL is not supported by this build" msgstr "ã“ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã§ã¯SSLã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: commands/view.c:84 +#: commands/view.c:79 #, c-format msgid "could not determine which collation to use for view column \"%s\"" msgstr "ビューã®åˆ—\"%s\"ã§ä½¿ç”¨ã™ã‚‹ç…§åˆé †åºã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: commands/view.c:279 commands/view.c:290 +#: commands/view.c:274 commands/view.c:285 #, c-format msgid "cannot drop columns from view" msgstr "ビューã‹ã‚‰ã¯åˆ—を削除ã§ãã¾ã›ã‚“" -#: commands/view.c:295 +#: commands/view.c:290 #, c-format msgid "cannot change name of view column \"%s\" to \"%s\"" msgstr "ビューã®åˆ—åã‚’\"%s\"ã‹ã‚‰\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/view.c:298 +#: commands/view.c:293 #, c-format msgid "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." msgstr "代ã‚り㫠ALTER VIEW ... RENAME COLUMN ... を使用ã—ã¦ãƒ“ューカラムã®åå‰ã‚’変更ã—ã¦ãã ã•ã„。" -#: commands/view.c:309 +#: commands/view.c:304 #, c-format msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "ビューã®åˆ— \"%s\"ã®ãƒ‡ãƒ¼ã‚¿åž‹ã‚’ %s ã‹ã‚‰ %s ã«å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/view.c:323 +#: commands/view.c:318 #, c-format msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" msgstr "ビューã®åˆ—\"%s\"ã®ç…§åˆé †åºã‚’\"%s\"ã‹ã‚‰\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“" -#: commands/view.c:392 +#: commands/view.c:387 #, c-format msgid "views must not contain SELECT INTO" msgstr "ビューã§ã¯ SELECT INTO を使用ã§ãã¾ã›ã‚“" -#: commands/view.c:404 +#: commands/view.c:399 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "ビューã§ã¯ WITH å¥ã«ãƒ‡ãƒ¼ã‚¿ã‚’変更ã™ã‚‹ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆã‚’å«ã‚€ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: commands/view.c:474 +#: commands/view.c:469 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "CREATE VIEW ã§åˆ—よりも多ãã®åˆ—åãŒæŒ‡å®šã•れã¦ã„ã¾ã™" -#: commands/view.c:482 +#: commands/view.c:477 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "ビューã¯è‡ªèº«ã®æ ¼ç´é ˜åŸŸã‚’æŒãŸãªã„ã®ã§ã€UNLOGGEDã«ã¯ã§ãã¾ã›ã‚“" -#: commands/view.c:496 +#: commands/view.c:491 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "ビュー\"%s\"ã¯ä¸€æ™‚ビューã¨ãªã‚Šã¾ã™" @@ -12491,179 +12960,196 @@ msgstr "カーソル\"%s\"ã¯è¡Œä¸Šã«ä½ç½®ã—ã¦ã„ã¾ã›ã‚“" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "カーソル\"%s\"ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã‚’å˜ç´”ãªæ›´æ–°å¯èƒ½ã‚¹ã‚­ãƒ£ãƒ³ã§ã¯ã‚りã¾ã›ã‚“" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2497 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2555 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "パラメータã®åž‹%d(%s)ãŒå®Ÿè¡Œè¨ˆç”»(%s)を準備ã™ã‚‹æ™‚点ã¨ä¸€è‡´ã—ã¾ã›ã‚“" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2509 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2567 #, c-format msgid "no value found for parameter %d" msgstr "パラメータ%dã®å€¤ãŒã‚りã¾ã›ã‚“" -#: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 executor/execExprInterp.c:4229 executor/execExprInterp.c:4246 executor/execExprInterp.c:4345 executor/nodeModifyTable.c:197 executor/nodeModifyTable.c:208 executor/nodeModifyTable.c:225 executor/nodeModifyTable.c:233 +#: executor/execExpr.c:642 executor/execExpr.c:649 executor/execExpr.c:655 executor/execExprInterp.c:4852 executor/execExprInterp.c:4869 executor/execExprInterp.c:4968 executor/nodeModifyTable.c:203 executor/nodeModifyTable.c:214 executor/nodeModifyTable.c:231 executor/nodeModifyTable.c:239 #, c-format msgid "table row type and query-specified row type do not match" msgstr "テーブルã®è¡Œåž‹ã¨å•ã„åˆã‚ã›ã§æŒ‡å®šã—ãŸè¡Œåž‹ãŒä¸€è‡´ã—ã¾ã›ã‚“" -#: executor/execExpr.c:638 executor/nodeModifyTable.c:198 +#: executor/execExpr.c:643 executor/nodeModifyTable.c:204 #, c-format msgid "Query has too many columns." msgstr "å•ã„åˆã‚ã›ã®åˆ—ãŒå¤šã™ãŽã¾ã™" -#: executor/execExpr.c:645 executor/nodeModifyTable.c:226 +#: executor/execExpr.c:650 executor/nodeModifyTable.c:232 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "å•ã„åˆã‚ã›ã§ %d 番目ã«å‰Šé™¤ã•れる列ã®å€¤ã‚’指定ã—ã¦ã„ã¾ã™ã€‚" -#: executor/execExpr.c:651 executor/execExprInterp.c:4247 executor/nodeModifyTable.c:209 +#: executor/execExpr.c:656 executor/execExprInterp.c:4870 executor/nodeModifyTable.c:215 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "テーブルã§ã¯ %2$d 番目ã®åž‹ã¯ %1$s ã§ã™ãŒã€å•ã„åˆã‚ã›ã§ã¯ %3$s を想定ã—ã¦ã„ã¾ã™ã€‚" -#: executor/execExpr.c:1099 parser/parse_agg.c:827 +#: executor/execExpr.c:1104 parser/parse_agg.c:838 #, c-format msgid "window function calls cannot be nested" msgstr "ウィンドウ関数ã®å‘¼ã³å‡ºã—を入れå­ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: executor/execExpr.c:1618 +#: executor/execExpr.c:1649 #, c-format msgid "target type is not an array" msgstr "対象型ã¯é…列ã§ã¯ã‚りã¾ã›ã‚“" -#: executor/execExpr.c:1958 +#: executor/execExpr.c:1989 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "ROW()列ã®åž‹ãŒ%2$sã§ã¯ãªã%1$sã§ã™" -#: executor/execExpr.c:2587 executor/execSRF.c:719 parser/parse_func.c:138 parser/parse_func.c:655 parser/parse_func.c:1032 +#: executor/execExpr.c:2653 executor/execSRF.c:718 parser/parse_func.c:138 parser/parse_func.c:655 parser/parse_func.c:1033 #, c-format msgid "cannot pass more than %d argument to a function" msgid_plural "cannot pass more than %d arguments to a function" msgstr[0] "関数ã«%dã‚’è¶…ãˆã‚‹å¼•数を渡ã›ã¾ã›ã‚“" -#: executor/execExpr.c:2614 executor/execSRF.c:739 executor/functions.c:1066 utils/adt/jsonfuncs.c:3780 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 +#: executor/execExpr.c:2680 executor/execSRF.c:738 executor/functions.c:1068 utils/adt/jsonfuncs.c:4054 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§é›†åˆå€¤ã®é–¢æ•°ã¯é›†åˆã‚’å—ã‘付ã‘られã¾ã›ã‚“" -#: executor/execExpr.c:3020 parser/parse_node.c:277 parser/parse_node.c:327 +#: executor/execExpr.c:3086 parser/parse_node.c:272 parser/parse_node.c:322 #, c-format msgid "cannot subscript type %s because it does not support subscripting" msgstr "添字をサãƒãƒ¼ãƒˆã—ãªã„ãŸã‚ã€åž‹%sã«ã¯æ·»å­—ã‚’ã¤ã‘られã¾ã›ã‚“" -#: executor/execExpr.c:3148 executor/execExpr.c:3170 +#: executor/execExpr.c:3214 executor/execExpr.c:3236 #, c-format msgid "type %s does not support subscripted assignment" msgstr "åž‹%sã¯æ·»å­—を使ã£ãŸä»£å…¥ã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: executor/execExprInterp.c:1962 +#: executor/execExprInterp.c:2019 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "%2$såž‹ã®å±žæ€§%1$dãŒå‰Šé™¤ã•れã¦ã„ã¾ã™" -#: executor/execExprInterp.c:1968 +#: executor/execExprInterp.c:2025 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "åž‹%2$sã®å±žæ€§%1$dã®åž‹ãŒé–“é•ã£ã¦ã„ã¾ã™" -#: executor/execExprInterp.c:1970 executor/execExprInterp.c:3103 executor/execExprInterp.c:3149 +#: executor/execExprInterp.c:2027 executor/execExprInterp.c:3226 executor/execExprInterp.c:3272 #, c-format msgid "Table has type %s, but query expects %s." msgstr "テーブルã®åž‹ã¯%sã§ã™ãŒã€å•ã„åˆã‚ã›ã§ã¯%sを想定ã—ã¦ã„ã¾ã™ã€‚" -#: executor/execExprInterp.c:2049 utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1743 utils/cache/typcache.c:1902 utils/cache/typcache.c:2049 utils/fmgr/funcapi.c:561 +#: executor/execExprInterp.c:2107 utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1752 utils/cache/typcache.c:1911 utils/cache/typcache.c:2058 utils/fmgr/funcapi.c:569 #, c-format msgid "type %s is not composite" msgstr "åž‹%sã¯è¤‡åˆåž‹ã§ã¯ã‚りã¾ã›ã‚“" -#: executor/execExprInterp.c:2587 +#: executor/execExprInterp.c:2710 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "ã“ã®ã‚¿ã‚¤ãƒ—ã®ãƒ†ãƒ¼ãƒ–ルã§ã¯WHERE CURRENT OFをサãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: executor/execExprInterp.c:2800 +#: executor/execExprInterp.c:2923 #, c-format msgid "cannot merge incompatible arrays" msgstr "äº’æ›æ€§ãŒãªã„é…列をマージã§ãã¾ã›ã‚“" -#: executor/execExprInterp.c:2801 +#: executor/execExprInterp.c:2924 #, c-format msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "è¦ç´ åž‹%sã®é…列をè¦ç´ åž‹%sã®ARRAYå¼ã«å«ã‚られã¾ã›ã‚“" -#: executor/execExprInterp.c:2822 utils/adt/arrayfuncs.c:265 utils/adt/arrayfuncs.c:575 utils/adt/arrayfuncs.c:1329 utils/adt/arrayfuncs.c:3483 utils/adt/arrayfuncs.c:5567 utils/adt/arrayfuncs.c:6084 utils/adt/arraysubs.c:150 utils/adt/arraysubs.c:488 +#: executor/execExprInterp.c:2945 utils/adt/arrayfuncs.c:1305 utils/adt/arrayfuncs.c:3503 utils/adt/arrayfuncs.c:5593 utils/adt/arrayfuncs.c:6112 utils/adt/arraysubs.c:150 utils/adt/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "é…åˆ—ã®æ¬¡æ•°(%d)ãŒä¸Šé™(%d)ã‚’è¶…ãˆã¦ã„ã¾ã™" -#: executor/execExprInterp.c:2842 executor/execExprInterp.c:2877 +#: executor/execExprInterp.c:2965 executor/execExprInterp.c:3000 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "多次元é…列ã®é…列å¼ã®æ¬¡æ•°ãŒã‚ã£ã¦ã„ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: executor/execExprInterp.c:2854 utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:959 utils/adt/arrayfuncs.c:1568 utils/adt/arrayfuncs.c:3285 utils/adt/arrayfuncs.c:3513 utils/adt/arrayfuncs.c:6176 utils/adt/arrayfuncs.c:6517 utils/adt/arrayutils.c:104 utils/adt/arrayutils.c:113 utils/adt/arrayutils.c:120 +#: executor/execExprInterp.c:2977 utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:335 utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:727 utils/adt/arrayfuncs.c:1533 utils/adt/arrayfuncs.c:2341 utils/adt/arrayfuncs.c:2356 utils/adt/arrayfuncs.c:2618 utils/adt/arrayfuncs.c:2634 utils/adt/arrayfuncs.c:2895 utils/adt/arrayfuncs.c:2949 utils/adt/arrayfuncs.c:2964 utils/adt/arrayfuncs.c:3305 utils/adt/arrayfuncs.c:3533 utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:6204 utils/adt/arrayfuncs.c:6548 utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 utils/adt/arrayutils.c:99 #, c-format msgid "array size exceeds the maximum allowed (%d)" msgstr "é…åˆ—ã®æ¬¡æ•°ãŒä¸Šé™(%d)ã‚’è¶…ãˆã¦ã„ã¾ã™" -#: executor/execExprInterp.c:3102 executor/execExprInterp.c:3148 +#: executor/execExprInterp.c:3225 executor/execExprInterp.c:3271 #, c-format msgid "attribute %d has wrong type" msgstr "属性%dã®åž‹ãŒé–“é•ã£ã¦ã„ã¾ã™" -#: executor/execExprInterp.c:3730 utils/adt/domains.c:155 +#: executor/execExprInterp.c:3857 utils/adt/domains.c:158 #, c-format msgid "domain %s does not allow null values" msgstr "ドメイン%sã¯null値を許ã—ã¾ã›ã‚“" -#: executor/execExprInterp.c:3745 utils/adt/domains.c:193 +#: executor/execExprInterp.c:3872 utils/adt/domains.c:196 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "ドメイン%sã®å€¤ãŒæ¤œæŸ»åˆ¶ç´„\"%s\"ã«é•åã—ã¦ã„ã¾ã™" -#: executor/execExprInterp.c:4230 +#: executor/execExprInterp.c:4447 +#, c-format +msgid "no SQL/JSON item found for specified path of column \"%s\"" +msgstr "列\"%s\"ã®æŒ‡å®šã•れãŸãƒ‘スã«å¯¾å¿œã™ã‚‹SQL/JSONé …ç›®ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + +#: executor/execExprInterp.c:4452 +#, c-format +msgid "no SQL/JSON item found for specified path" +msgstr "指定ã•れãŸãƒ‘スã«å¯¾å¿œã™ã‚‹SQL/JSONé …ç›®ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + +#. translator: first %s is a SQL/JSON clause (e.g. ON ERROR) +#: executor/execExprInterp.c:4652 executor/execExprInterp.c:4660 +#, c-format +msgid "could not coerce %s expression (%s) to the RETURNING type" +msgstr "%så¼(%s)ã‚’RETURNINGåž‹ã«å¼·åˆ¶å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: executor/execExprInterp.c:4853 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." msgstr[0] "テーブル行ã«ã¯%d属性ã‚りã¾ã™ãŒã€å•ã„åˆã‚ã›ã§ã¯%dを想定ã—ã¦ã„ã¾ã™ã€‚" -#: executor/execExprInterp.c:4346 executor/execSRF.c:978 +#: executor/execExprInterp.c:4969 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "åºæ•°ä½ç½®%dã®å‰Šé™¤ã•れãŸå±žæ€§ã«ãŠã‘ã‚‹ç‰©ç†æ ¼ç´å½¢å¼ãŒä¸€è‡´ã—ã¾ã›ã‚“。" -#: executor/execIndexing.c:588 +#: executor/execIndexing.c:593 #, c-format msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" msgstr "ON CONFLICT ã¯é…å»¶å¯ãªãƒ¦ãƒ‹ãƒ¼ã‚¯åˆ¶ç´„/排除制約ã®èª¿åœä¸»ä½“ã¨ã—ã¦ã®æŒ‡å®šã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: executor/execIndexing.c:865 +#: executor/execIndexing.c:870 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "排除制約\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: executor/execIndexing.c:868 +#: executor/execIndexing.c:873 #, c-format msgid "Key %s conflicts with key %s." msgstr "キー %s ãŒã‚­ãƒ¼ %s ã¨ç«¶åˆã—ã¦ã„ã¾ã™" -#: executor/execIndexing.c:870 +#: executor/execIndexing.c:875 #, c-format msgid "Key conflicts exist." msgstr "キーã®ç«¶åˆãŒå­˜åœ¨ã—ã¾ã™" -#: executor/execIndexing.c:876 +#: executor/execIndexing.c:881 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "é‡è¤‡ã‚­ãƒ¼ã®å€¤ãŒæŽ’除制約\"%s\"ã«é•åã—ã¦ã„ã¾ã™" -#: executor/execIndexing.c:879 +#: executor/execIndexing.c:884 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "キー %s ãŒæ—¢å­˜ã®ã‚­ãƒ¼ %s ã¨ç«¶åˆã—ã¦ã„ã¾ã™" -#: executor/execIndexing.c:881 +#: executor/execIndexing.c:886 #, c-format msgid "Key conflicts with existing key." msgstr "ã‚­ãƒ¼ãŒæ—¢å­˜ã®ã‚­ãƒ¼ã¨è¡çªã—ã¦ã„ã¾ã™" @@ -12678,288 +13164,268 @@ msgstr "シーケンス\"%s\"を変更ã§ãã¾ã›ã‚“" msgid "cannot change TOAST relation \"%s\"" msgstr "TOASTリレーション\"%s\"を変更ã§ãã¾ã›ã‚“" -#: executor/execMain.c:1063 rewrite/rewriteHandler.c:3079 rewrite/rewriteHandler.c:3966 -#, c-format -msgid "cannot insert into view \"%s\"" -msgstr "ビュー\"%s\"ã¸ã¯æŒ¿å…¥(INSERT)ã§ãã¾ã›ã‚“" - -#: executor/execMain.c:1065 rewrite/rewriteHandler.c:3082 rewrite/rewriteHandler.c:3969 -#, c-format -msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." -msgstr "ビューã¸ã®æŒ¿å…¥ã‚’å¯èƒ½ã«ã™ã‚‹ãŸã‚ã«ã€INSTEAD OF INSERTトリガã¾ãŸã¯ç„¡æ¡ä»¶ã®ON INSERT DO INSTEADルールを作æˆã—ã¦ãã ã•ã„。" - -#: executor/execMain.c:1071 rewrite/rewriteHandler.c:3087 rewrite/rewriteHandler.c:3974 -#, c-format -msgid "cannot update view \"%s\"" -msgstr "ビュー\"%s\"ã¯æ›´æ–°ã§ãã¾ã›ã‚“" - -#: executor/execMain.c:1073 rewrite/rewriteHandler.c:3090 rewrite/rewriteHandler.c:3977 -#, c-format -msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." -msgstr "ビューã¸ã®æ›´æ–°ã‚’å¯èƒ½ã«ã™ã‚‹ãŸã‚ã«ã€INSTEAD OF UPDATEトリガã¾ãŸã¯ç„¡æ¡ä»¶ã®ON UPDATE DO INSTEADルールを作æˆã—ã¦ãã ã•ã„。" - -#: executor/execMain.c:1079 rewrite/rewriteHandler.c:3095 rewrite/rewriteHandler.c:3982 -#, c-format -msgid "cannot delete from view \"%s\"" -msgstr "ビュー\"%s\"ã‹ã‚‰ã¯å‰Šé™¤ã§ãã¾ã›ã‚“" - -#: executor/execMain.c:1081 rewrite/rewriteHandler.c:3098 rewrite/rewriteHandler.c:3985 -#, c-format -msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." -msgstr "ビューã‹ã‚‰ã®å‰Šé™¤ã‚’å¯èƒ½ã«ã™ã‚‹ãŸã‚ã«ã€INSTEAD OF DELETEトリガã¾ãŸã¯ç„¡æ¡ä»¶ã®ON DELETE DO INSTEADルールを作æˆã—ã¦ãã ã•ã„。" - -#: executor/execMain.c:1092 +#: executor/execMain.c:1064 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "実体化ビュー\"%s\"を変更ã§ãã¾ã›ã‚“" -#: executor/execMain.c:1104 +#: executor/execMain.c:1076 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "外部テーブル\"%s\"ã¸ã®æŒ¿å…¥ãŒã§ãã¾ã›ã‚“" -#: executor/execMain.c:1110 +#: executor/execMain.c:1082 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "外部テーブル\"%s\"ã¯æŒ¿å…¥ã‚’許ã—ã¾ã›ã‚“" -#: executor/execMain.c:1117 +#: executor/execMain.c:1089 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "外部テーブル \"%s\"ã®æ›´æ–°ãŒã§ãã¾ã›ã‚“" -#: executor/execMain.c:1123 +#: executor/execMain.c:1095 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "外部テーブル\"%s\"ã¯æ›´æ–°ã‚’許ã—ã¾ã›ã‚“" -#: executor/execMain.c:1130 +#: executor/execMain.c:1102 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "外部テーブル\"%s\"ã‹ã‚‰ã®å‰Šé™¤ãŒã§ãã¾ã›ã‚“" -#: executor/execMain.c:1136 +#: executor/execMain.c:1108 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "外部テーブル\"%s\"ã¯å‰Šé™¤ã‚’許ã—ã¾ã›ã‚“" -#: executor/execMain.c:1147 +#: executor/execMain.c:1119 #, c-format msgid "cannot change relation \"%s\"" msgstr "リレーション\"%s\"を変更ã§ãã¾ã›ã‚“" -#: executor/execMain.c:1174 +#: executor/execMain.c:1146 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "シーケンス\"%s\"ã§ã¯è¡Œã®ãƒ­ãƒƒã‚¯ã¯ã§ãã¾ã›ã‚“" -#: executor/execMain.c:1181 +#: executor/execMain.c:1153 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "TOAST リレーション\"%s\"ã§ã¯è¡Œã®ãƒ­ãƒƒã‚¯ã¯ã§ãã¾ã›ã‚“" -#: executor/execMain.c:1188 +#: executor/execMain.c:1160 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "ビュー\"%s\"ã§ã¯è¡Œã®ãƒ­ãƒƒã‚¯ã¯ã§ãã¾ã›ã‚“" -#: executor/execMain.c:1196 +#: executor/execMain.c:1168 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "実体化ビュー\"%s\"ã§ã¯è¡Œã®ãƒ­ãƒƒã‚¯ã¯ã§ãã¾ã›ã‚“" -#: executor/execMain.c:1205 executor/execMain.c:2708 executor/nodeLockRows.c:135 +#: executor/execMain.c:1177 executor/execMain.c:2689 executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "外部テーブル\"%s\"ã§ã¯è¡Œã®ãƒ­ãƒƒã‚¯ã¯ã§ãã¾ã›ã‚“" -#: executor/execMain.c:1211 +#: executor/execMain.c:1183 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "リレーション\"%s\"ã§ã¯è¡Œã®ãƒ­ãƒƒã‚¯ã¯ã§ãã¾ã›ã‚“" -#: executor/execMain.c:1922 +#: executor/execMain.c:1901 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "リレーション\"%s\"ã®æ–°ã—ã„行ã¯ãƒ‘ーティション制約ã«é•åã—ã¦ã„ã¾ã™" -#: executor/execMain.c:1924 executor/execMain.c:2008 executor/execMain.c:2059 executor/execMain.c:2169 +#: executor/execMain.c:1903 executor/execMain.c:1987 executor/execMain.c:2038 executor/execMain.c:2148 #, c-format msgid "Failing row contains %s." msgstr "失敗ã—ãŸè¡Œã¯%sã‚’å«ã¿ã¾ã™" -#: executor/execMain.c:2005 +#: executor/execMain.c:1984 #, c-format msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" msgstr "リレーション\"%2$s\"ã®åˆ—\"%1$s\"ã®NULL値ãŒéžNULL制約ã«é•åã—ã¦ã„ã¾ã™" -#: executor/execMain.c:2057 +#: executor/execMain.c:2036 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "リレーション\"%s\"ã®æ–°ã—ã„è¡Œã¯æ¤œæŸ»åˆ¶ç´„\"%s\"ã«é•åã—ã¦ã„ã¾ã™" -#: executor/execMain.c:2167 +#: executor/execMain.c:2146 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "æ–°ã—ã„行ã¯ãƒ“ュー\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚ªãƒ—ションã«é•åã—ã¦ã„ã¾ã™" -#: executor/execMain.c:2177 +#: executor/execMain.c:2156 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "æ–°ã—ã„行ã¯ãƒ†ãƒ¼ãƒ–ル\"%2$s\"行レベルセキュリティãƒãƒªã‚·\"%1$s\"ã«é•åã—ã¦ã„ã¾ã™" -#: executor/execMain.c:2182 +#: executor/execMain.c:2161 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "æ–°ã—ã„行ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã®è¡Œãƒ¬ãƒ™ãƒ«ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒãƒªã‚·ã«é•åã—ã¦ã„ã¾ã™" -#: executor/execMain.c:2190 +#: executor/execMain.c:2169 #, c-format msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "ターゲットã®è¡Œã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã®è¡Œãƒ¬ãƒ™ãƒ«ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒãƒªã‚·\"%s\"(USINGå¼)ã«é•åã—ã¦ã„ã¾ã™" -#: executor/execMain.c:2195 +#: executor/execMain.c:2174 #, c-format msgid "target row violates row-level security policy (USING expression) for table \"%s\"" msgstr "ターゲットã®è¡Œã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã®è¡Œãƒ¬ãƒ™ãƒ«ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒãƒªã‚·(USINGå¼)ã«é•åã—ã¦ã„ã¾ã™" -#: executor/execMain.c:2202 +#: executor/execMain.c:2181 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "æ–°ã—ã„行ã¯ãƒ†ãƒ¼ãƒ–ル\"%1$s\"ã®è¡Œãƒ¬ãƒ™ãƒ«ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒãƒªã‚·\"%2$s\"(USINGå¼)ã«é•åã—ã¦ã„ã¾ã™" -#: executor/execMain.c:2207 +#: executor/execMain.c:2186 #, c-format msgid "new row violates row-level security policy (USING expression) for table \"%s\"" msgstr "æ–°ã—ã„行ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã®è¡Œãƒ¬ãƒ™ãƒ«ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒãƒªã‚·(USINGå¼)ã«é•åã—ã¦ã„ã¾ã™" -#: executor/execPartition.c:330 +#: executor/execPartition.c:327 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "行ã«å¯¾å¿œã™ã‚‹ãƒ‘ーティションãŒãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: executor/execPartition.c:333 +#: executor/execPartition.c:330 #, c-format msgid "Partition key of the failing row contains %s." msgstr "失敗ã—ãŸè¡Œã®ãƒ‘ーティションキーã¯%sã‚’å«ã¿ã¾ã™ã€‚" -#: executor/execReplication.c:240 executor/execReplication.c:424 +#: executor/execReplication.c:272 executor/execReplication.c:456 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update, retrying" msgstr "ロック対象ã®ã‚¿ãƒ—ルã¯åŒæ™‚ã«è¡Œã‚ã‚ŒãŸæ›´æ–°ã«ã‚ˆã£ã¦ä»–ã®å­ãƒ†ãƒ¼ãƒ–ルã«ç§»å‹•ã•れã¦ã„ã¾ã™ã€å†è©¦è¡Œã—ã¦ã„ã¾ã™" -#: executor/execReplication.c:244 executor/execReplication.c:428 +#: executor/execReplication.c:276 executor/execReplication.c:460 #, c-format msgid "concurrent update, retrying" msgstr "åŒæ™‚æ›´æ–°ãŒã‚りã¾ã—ãŸã€ãƒªãƒˆãƒ©ã‚¤ã—ã¾ã™" -#: executor/execReplication.c:250 executor/execReplication.c:434 +#: executor/execReplication.c:282 executor/execReplication.c:466 #, c-format msgid "concurrent delete, retrying" msgstr "並行ã™ã‚‹å‰Šé™¤ãŒã‚りã¾ã—ãŸã€ãƒªãƒˆãƒ©ã‚¤ã—ã¾ã™" -#: executor/execReplication.c:320 parser/parse_cte.c:308 parser/parse_oper.c:233 utils/adt/array_userfuncs.c:1348 utils/adt/array_userfuncs.c:1491 utils/adt/arrayfuncs.c:3832 utils/adt/arrayfuncs.c:4387 utils/adt/arrayfuncs.c:6397 utils/adt/rowtypes.c:1230 +#: executor/execReplication.c:352 parser/parse_cte.c:302 parser/parse_oper.c:221 utils/adt/array_userfuncs.c:1334 utils/adt/array_userfuncs.c:1477 utils/adt/arrayfuncs.c:3852 utils/adt/arrayfuncs.c:4407 utils/adt/arrayfuncs.c:6428 utils/adt/rowtypes.c:1220 #, c-format msgid "could not identify an equality operator for type %s" -msgstr "åž‹%sã®ç­‰ä¾¡æ¼”ç®—å­ã‚’識別ã§ãã¾ã›ã‚“ã§ã—ãŸ" +msgstr "åž‹%sã®ç­‰ä¾¡æ¼”ç®—å­ã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: executor/execReplication.c:651 executor/execReplication.c:657 +#: executor/execReplication.c:687 executor/execReplication.c:693 #, c-format msgid "cannot update table \"%s\"" msgstr "テーブル\"%s\"ã®æ›´æ–°ãŒã§ãã¾ã›ã‚“" -#: executor/execReplication.c:653 executor/execReplication.c:665 +#: executor/execReplication.c:689 executor/execReplication.c:701 #, c-format msgid "Column used in the publication WHERE expression is not part of the replica identity." msgstr "ã“ã®ãƒ‘ブリケーションã®WHEREå¼ã§ä½¿ç”¨ã•れã¦ã„る列ã¯è­˜åˆ¥åˆ—ã®ä¸€éƒ¨ã§ã¯ã‚りã¾ã›ã‚“。" -#: executor/execReplication.c:659 executor/execReplication.c:671 +#: executor/execReplication.c:695 executor/execReplication.c:707 #, c-format msgid "Column list used by the publication does not cover the replica identity." msgstr "ã“ã®ãƒ‘ブリケーションã§ä½¿ç”¨ã•れã¦ã‚‹åˆ—リストã¯è­˜åˆ¥åˆ—を包å«ã—ã¦ã„ã¾ã›ã‚“。" -#: executor/execReplication.c:663 executor/execReplication.c:669 +#: executor/execReplication.c:699 executor/execReplication.c:705 #, c-format msgid "cannot delete from table \"%s\"" msgstr "テーブル\"%s\"ã‹ã‚‰ã®å‰Šé™¤ãŒã§ãã¾ã›ã‚“" -#: executor/execReplication.c:689 +#: executor/execReplication.c:725 #, c-format msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" -msgstr "テーブル\"%s\"ã¯è¤‡è£½è­˜åˆ¥ã‚’æŒãŸãšã‹ã¤æ›´æ–°ã‚’発行ã—ã¦ã„ã‚‹ãŸã‚ã€æ›´æ–°ã§ãã¾ã›ã‚“" +msgstr "テーブル\"%s\"ã¯è¤‡è£½è­˜åˆ¥ã‚’æŒãŸãšã‹ã¤æ›´æ–°ã‚’パブリッシュã—ã¦ã„ã‚‹ãŸã‚ã€æ›´æ–°ã§ãã¾ã›ã‚“" -#: executor/execReplication.c:691 +#: executor/execReplication.c:727 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "ãƒ†ãƒ¼ãƒ–ãƒ«ã®æ›´æ–°ã‚’å¯èƒ½ã«ã™ã‚‹ã«ã¯ ALTER TABLE ã§ REPLICA IDENTITY を設定ã—ã¦ãã ã•ã„。" -#: executor/execReplication.c:695 +#: executor/execReplication.c:731 #, c-format msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" -msgstr "テーブル\"%s\"ã¯è¤‡è£½è­˜åˆ¥ãŒãªãã‹ã¤å‰Šé™¤ã‚’発行ã—ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ãƒ†ãƒ¼ãƒ–ルã§ã¯è¡Œã®å‰Šé™¤ãŒã§ãã¾ã›ã‚“" +msgstr "テーブル\"%s\"ã¯è¤‡è£½è­˜åˆ¥ãŒãªãã‹ã¤å‰Šé™¤ã‚’パブリッシュã—ã¦ã„ã‚‹ãŸã‚ã€ã“ã®ãƒ†ãƒ¼ãƒ–ルã§ã¯è¡Œã®å‰Šé™¤ãŒã§ãã¾ã›ã‚“" -#: executor/execReplication.c:697 +#: executor/execReplication.c:733 #, c-format msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "ã“ã®ãƒ†ãƒ¼ãƒ–ルã§ã®è¡Œå‰Šé™¤ã‚’å¯èƒ½ã«ã™ã‚‹ã«ã¯ ALTER TABLE ã§ REPLICA IDENTITY を設定ã—ã¦ãã ã•ã„。" -#: executor/execReplication.c:713 +#: executor/execReplication.c:749 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "リレーション\"%s.%s\"ã¯è«–ç†ãƒ¬ãƒ—リケーション先ã¨ã—ã¦ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: executor/execSRF.c:316 +#: executor/execSRF.c:315 #, c-format msgid "rows returned by function are not all of the same row type" msgstr "関数ã‹ã‚‰æˆ»ã•れãŸè¡Œã¯ã™ã¹ã¦ãŒåŒã˜è¡Œåž‹ã§ã¯ã‚りã¾ã›ã‚“" -#: executor/execSRF.c:366 +#: executor/execSRF.c:365 #, c-format msgid "table-function protocol for value-per-call mode was not followed" msgstr "逿¬¡è¿”å´(value-per-call)モードã®ãƒ†ãƒ¼ãƒ–ル関数プロトコルã«å¾“ã£ã¦ã„ã¾ã›ã‚“" -#: executor/execSRF.c:374 executor/execSRF.c:668 +#: executor/execSRF.c:373 executor/execSRF.c:667 #, c-format msgid "table-function protocol for materialize mode was not followed" msgstr "実体化モードã®ãƒ†ãƒ¼ãƒ–ル関数プロトコルã«å¾“ã£ã¦ã„ã¾ã›ã‚“" -#: executor/execSRF.c:381 executor/execSRF.c:686 +#: executor/execSRF.c:380 executor/execSRF.c:685 #, c-format msgid "unrecognized table-function returnMode: %d" msgstr "識別ã§ããªã„テーブル関数ã®returnMode: %d" -#: executor/execSRF.c:895 +#: executor/execSRF.c:894 #, c-format msgid "function returning setof record called in context that cannot accept type record" msgstr "レコード集åˆã‚’è¿”ã™é–¢æ•°ãŒã€ãƒ¬ã‚³ãƒ¼ãƒ‰åž‹ãŒå—ã‘付ã‘られãªã„文脈ã§å‘¼ã³å‡ºã•れã¾ã—ãŸ" -#: executor/execSRF.c:951 executor/execSRF.c:967 executor/execSRF.c:977 +#: executor/execSRF.c:950 executor/execSRF.c:966 executor/execSRF.c:976 #, c-format msgid "function return row and query-specified return row do not match" msgstr "å•ã„åˆã‚ã›ãŒæŒ‡å®šã—ãŸæˆ»ã‚Šå€¤ã®è¡Œã¨å®Ÿéš›ã®é–¢æ•°ã®æˆ»ã‚Šå€¤ã®è¡ŒãŒä¸€è‡´ã—ã¾ã›ã‚“" -#: executor/execSRF.c:952 +#: executor/execSRF.c:951 #, c-format msgid "Returned row contains %d attribute, but query expects %d." msgid_plural "Returned row contains %d attributes, but query expects %d." msgstr[0] "%d属性をæŒã¤è¡ŒãŒè¿”ã•れã¾ã—ãŸã€‚å•ã„åˆã‚ã›ã§ã¯%d個を想定ã—ã¦ã„ã¾ã™ã€‚" -#: executor/execSRF.c:968 +#: executor/execSRF.c:967 #, c-format msgid "Returned type %s at ordinal position %d, but query expects %s." msgstr "åºæ•°ä½ç½®%2$dã®åž‹%1$sãŒè¿”ã•れã¾ã—ãŸã€‚å•ã„åˆã‚ã›ã§ã¯%3$sを想定ã—ã¦ã„ã¾ã™ã€‚" -#: executor/execTuples.c:146 executor/execTuples.c:353 executor/execTuples.c:521 executor/execTuples.c:713 +#: executor/execTuples.c:147 executor/execTuples.c:368 executor/execTuples.c:563 executor/execTuples.c:772 #, c-format msgid "cannot retrieve a system column in this context" msgstr "ã“ã®æ–‡è„ˆã§ã¯ã‚·ã‚¹ãƒ†ãƒ åˆ—ã¯å–り出ã›ã¾ã›ã‚“" -#: executor/execUtils.c:744 +#: executor/execTuples.c:163 executor/execTuples.c:580 +#, c-format +msgid "don't have transaction information for this type of tuple" +msgstr "ã“ã®ã‚¿ã‚¤ãƒ—ã®ã‚¿ãƒ—ルã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³æƒ…å ±ã¯æŒãŸãªã„ã§ãã ã•ã„" + +#: executor/execTuples.c:390 executor/execTuples.c:794 +#, c-format +msgid "don't have a storage tuple in this context" +msgstr "ã“ã®æ–‡è„ˆã§ã¯ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ã‚¿ãƒ—ãƒ«ã‚’ä¿æŒã—ãªã„ã§ãã ã•ã„" + +#: executor/execUtils.c:713 #, c-format msgid "materialized view \"%s\" has not been populated" msgstr "実体化ビュー\"%s\"ã«ã¯ãƒ‡ãƒ¼ã‚¿ãŒæ ¼ç´ã•れã¦ã„ã¾ã›ã‚“" -#: executor/execUtils.c:746 +#: executor/execUtils.c:715 #, c-format msgid "Use the REFRESH MATERIALIZED VIEW command." msgstr "REFRESH MATERIALIZED VIEWコマンドを使用ã—ã¦ãã ã•ã„。" @@ -12969,109 +13435,109 @@ msgstr "REFRESH MATERIALIZED VIEWコマンドを使用ã—ã¦ãã ã•ã„。" msgid "could not determine actual type of argument declared %s" msgstr "%sã¨å®£è¨€ã•れãŸå¼•æ•°ã®åž‹ã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: executor/functions.c:512 +#: executor/functions.c:513 #, c-format msgid "cannot COPY to/from client in an SQL function" msgstr "SQL関数ã®ä¸­ã§ã¯COPYæ–‡ã«ã‚ˆã‚‹ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã¨ã®é–“ã®å…¥å‡ºåŠ›ã¯ã§ãã¾ã›ã‚“" #. translator: %s is a SQL statement name -#: executor/functions.c:518 +#: executor/functions.c:519 #, c-format msgid "%s is not allowed in an SQL function" msgstr "SQL関数ã§ã¯%sã¯ä½¿ç”¨ä¸å¯ã§ã™" #. translator: %s is a SQL statement name -#: executor/functions.c:526 executor/spi.c:1742 executor/spi.c:2635 +#: executor/functions.c:527 executor/spi.c:1744 executor/spi.c:2657 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "volatile関数以外ã§ã¯%sã¯è¨±å¯ã•れã¾ã›ã‚“" -#: executor/functions.c:1450 +#: executor/functions.c:1452 #, c-format msgid "SQL function \"%s\" statement %d" msgstr "SQL関数\"%s\"ã®è¡Œç•ªå· %d" -#: executor/functions.c:1476 +#: executor/functions.c:1478 #, c-format msgid "SQL function \"%s\" during startup" msgstr "SQL関数\"%s\"ã®èµ·å‹•中" -#: executor/functions.c:1561 +#: executor/functions.c:1563 #, c-format msgid "calling procedures with output arguments is not supported in SQL functions" msgstr "出力引数をæŒã¤ãƒ—ロシージャã®å‘¼ã³å‡ºã—ã¯SQL関数ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: executor/functions.c:1694 executor/functions.c:1732 executor/functions.c:1746 executor/functions.c:1836 executor/functions.c:1869 executor/functions.c:1883 +#: executor/functions.c:1698 executor/functions.c:1736 executor/functions.c:1750 executor/functions.c:1845 executor/functions.c:1878 executor/functions.c:1892 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "%sã‚’è¿”ã™ã¨å®£è¨€ã•れãŸé–¢æ•°ã«ãŠã„ã¦æˆ»ã‚Šå€¤åž‹ãŒä¸€è‡´ã—ã¾ã›ã‚“" -#: executor/functions.c:1696 +#: executor/functions.c:1700 #, c-format -msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." -msgstr "é–¢æ•°ã®æœ€å¾Œã®ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆã¯ SELECT ã‚‚ã—ã㯠INSERT/UPDATE/DELETE RETURNING ã®ã„ãšã‚Œã‹ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" +msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE RETURNING." +msgstr "é–¢æ•°ä¸­ã®æœ€å¾Œã®æ–‡ã¯SELECTã¾ãŸã¯INSERT/UPDATE/DELETE/MERGE RETURNING ã®ã„ãšã‚Œã‹ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: executor/functions.c:1734 +#: executor/functions.c:1738 #, c-format msgid "Final statement must return exactly one column." msgstr "最後ã®ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆã¯ã¡ã‚‡ã†ã©1列を返ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: executor/functions.c:1748 +#: executor/functions.c:1752 #, c-format msgid "Actual return type is %s." msgstr "å®Ÿéš›ã®æˆ»ã‚Šå€¤åž‹ã¯%sã§ã™ã€‚" -#: executor/functions.c:1838 +#: executor/functions.c:1847 #, c-format msgid "Final statement returns too many columns." msgstr "最後ã®ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆãŒè¿”ã™åˆ—ãŒå¤šã™ãŽã¾ã™ã€‚" -#: executor/functions.c:1871 +#: executor/functions.c:1880 #, c-format msgid "Final statement returns %s instead of %s at column %d." msgstr "最後ã®ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆãŒåˆ—%3$dã§%2$sã§ã¯ãªã%1$sã‚’è¿”ã—ã¾ã—ãŸã€‚" -#: executor/functions.c:1885 +#: executor/functions.c:1894 #, c-format msgid "Final statement returns too few columns." msgstr "最後ã®ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆãŒè¿”ã™åˆ—ãŒå°‘ãªã™ãŽã¾ã™ã€‚" -#: executor/functions.c:1913 +#: executor/functions.c:1922 #, c-format msgid "return type %s is not supported for SQL functions" msgstr "戻り値型%sã¯SQL関数ã§ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: executor/nodeAgg.c:3937 executor/nodeWindowAgg.c:2993 +#: executor/nodeAgg.c:3936 executor/nodeWindowAgg.c:2975 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "集約%uã¯å…¥åŠ›ãƒ‡ãƒ¼ã‚¿åž‹ã¨é·ç§»ç”¨ã®åž‹é–“ã§äº’æ›æ€§ãŒå¿…è¦ã§ã™" -#: executor/nodeAgg.c:3967 parser/parse_agg.c:669 parser/parse_agg.c:697 +#: executor/nodeAgg.c:3966 parser/parse_agg.c:680 parser/parse_agg.c:708 #, c-format msgid "aggregate function calls cannot be nested" msgstr "集約関数ã®å‘¼ã³å‡ºã—を入れå­ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: executor/nodeCustom.c:154 executor/nodeCustom.c:165 +#: executor/nodeCustom.c:144 executor/nodeCustom.c:155 #, c-format msgid "custom scan \"%s\" does not support MarkPos" msgstr "カスタムスキャン\"%s\"ã¯MarkPosをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: executor/nodeHashjoin.c:1143 executor/nodeHashjoin.c:1173 +#: executor/nodeHashjoin.c:1131 executor/nodeHashjoin.c:1161 #, c-format msgid "could not rewind hash-join temporary file" msgstr "ãƒãƒƒã‚·ãƒ¥çµåˆç”¨ä¸€æ™‚ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å·»ãæˆ»ã›ã¾ã›ã‚“ã§ã—ãŸ" -#: executor/nodeIndexonlyscan.c:238 +#: executor/nodeIndexonlyscan.c:239 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "概算è·é›¢é–¢æ•°ã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚ªãƒ³ãƒªãƒ¼ã‚¹ã‚­ãƒ£ãƒ³ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: executor/nodeLimit.c:374 +#: executor/nodeLimit.c:373 #, c-format msgid "OFFSET must not be negative" msgstr "OFFSET ã¯è² æ•°ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: executor/nodeLimit.c:400 +#: executor/nodeLimit.c:399 #, c-format msgid "LIMIT must not be negative" msgstr "LIMIT ã¯è² æ•°ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" @@ -13086,73 +13552,73 @@ msgstr "RIGHT JOINã¯ãƒžãƒ¼ã‚¸çµåˆå¯èƒ½ãªçµåˆæ¡ä»¶ã§ã®ã¿ã‚µãƒãƒ¼ãƒˆ msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOINã¯ãƒžãƒ¼ã‚¸çµåˆå¯èƒ½ãªçµåˆæ¡ä»¶ã§ã®ã¿ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™" -#: executor/nodeModifyTable.c:234 +#: executor/nodeModifyTable.c:240 #, c-format msgid "Query has too few columns." msgstr "å•ã„åˆã‚ã›ã®åˆ—ãŒå°‘ãªã™ãŽã¾ã™ã€‚" -#: executor/nodeModifyTable.c:1530 executor/nodeModifyTable.c:1604 +#: executor/nodeModifyTable.c:1540 executor/nodeModifyTable.c:1614 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "削除対象ã®ã‚¿ãƒ—ルã¯ã™ã§ã«ç¾åœ¨ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã‚ˆã£ã¦å¼•ãèµ·ã“ã•ã‚ŒãŸæ“作ã«ã‚ˆã£ã¦å¤‰æ›´ã•れã¦ã„ã¾ã™" -#: executor/nodeModifyTable.c:1758 +#: executor/nodeModifyTable.c:1769 #, c-format msgid "invalid ON UPDATE specification" msgstr "䏿­£ãª ON UPDATE 指定ã§ã™" -#: executor/nodeModifyTable.c:1759 +#: executor/nodeModifyTable.c:1770 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "çµæžœã‚¿ãƒ—ルをもã¨ã®ãƒ‘ーティションã§ã¯ãªãç•°ãªã‚‹ãƒ‘ーティションã«è¿½åŠ ã—よã†ã¨ã—ã¾ã—ãŸã€‚" -#: executor/nodeModifyTable.c:2217 +#: executor/nodeModifyTable.c:2226 #, c-format msgid "cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key" msgstr "ソースパーティションã®ãƒ«ãƒ¼ãƒˆä»¥å¤–ã®ä¸Šä½ãƒ‘ーティションãŒå¤–部キーã§ç›´æŽ¥å‚ç…§ã•れã¦ã„ã‚‹å ´åˆã¯ãƒ‘ーティション間ã§ã‚¿ãƒ—ルを移動ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: executor/nodeModifyTable.c:2218 +#: executor/nodeModifyTable.c:2227 #, c-format msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "外部キーãŒãƒ‘ーティションルートテーブル\"%2$s\"ã§ã¯ãªãパーティション親テーブル\"%1$s\"を指ã—ã¦ã„ã¾ã™ã€‚" -#: executor/nodeModifyTable.c:2221 +#: executor/nodeModifyTable.c:2230 #, c-format msgid "Consider defining the foreign key on table \"%s\"." msgstr "テーブル\"%s\"上ã«å¤–部キー制約を定義ã™ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。" #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2567 executor/nodeModifyTable.c:2954 +#: executor/nodeModifyTable.c:2596 executor/nodeModifyTable.c:3138 executor/nodeModifyTable.c:3308 #, c-format msgid "%s command cannot affect row a second time" msgstr "%sコマンドã¯å˜ä¸€ã®è¡Œã«2度ã¯é©ç”¨ã§ãã¾ã›ã‚“" -#: executor/nodeModifyTable.c:2569 +#: executor/nodeModifyTable.c:2598 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "åŒã˜ã‚³ãƒžãƒ³ãƒ‰ã§ã®æŒ¿å…¥å€™è£œã®è¡ŒãŒåŒã˜åˆ¶ç´„値をæŒã¤ã“ã¨ãŒãªã„よã†ã«ã—ã¦ãã ã•ã„" -#: executor/nodeModifyTable.c:2956 +#: executor/nodeModifyTable.c:3131 executor/nodeModifyTable.c:3301 #, c-format -msgid "Ensure that not more than one source row matches any one target row." -msgstr "ソース行ãŒ2行以上ターゲット行ã«åˆè‡´ã—ãªã„よã†ã«ã—ã¦ãã ã•ã„。" +msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" +msgstr "æ›´æ–°ã¾ãŸã¯å‰Šé™¤å¯¾è±¡ã®ã‚¿ãƒ—ルã¯ã€ç¾åœ¨ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã‚ˆã£ã¦ç™ºç«ã—ãŸæ“作トリガーã«ã‚ˆã£ã¦ã™ã§ã«æ›´æ–°ã•れã¦ã„ã¾ã™" -#: executor/nodeModifyTable.c:3037 +#: executor/nodeModifyTable.c:3140 executor/nodeModifyTable.c:3310 #, c-format -msgid "tuple to be deleted was already moved to another partition due to concurrent update" -msgstr "削除対象ã®ã‚¿ãƒ—ルã¯åŒæ™‚ã«è¡Œã‚ã‚ŒãŸæ›´æ–°ã«ã‚ˆã£ã¦ã™ã§ã«ä»–ã®å­ãƒ†ãƒ¼ãƒ–ルã«ç§»å‹•ã•れã¦ã„ã¾ã™" +msgid "Ensure that not more than one source row matches any one target row." +msgstr "ソース行ãŒ2行以上ターゲット行ã«åˆè‡´ã—ãªã„よã†ã«ã—ã¦ãã ã•ã„。" -#: executor/nodeModifyTable.c:3076 +#: executor/nodeModifyTable.c:3209 #, c-format -msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" -msgstr "æ›´æ–°ã¾ãŸã¯å‰Šé™¤å¯¾è±¡ã®ã‚¿ãƒ—ルã¯ã€ç¾åœ¨ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã‚ˆã£ã¦ç™ºç«ã—ãŸæ“作トリガーã«ã‚ˆã£ã¦ã™ã§ã«æ›´æ–°ã•れã¦ã„ã¾ã™" +msgid "tuple to be merged was already moved to another partition due to concurrent update" +msgstr "マージ対象ã®ã‚¿ãƒ—ルã¯åŒæ™‚ã«è¡Œã‚ã‚ŒãŸæ›´æ–°ã«ã‚ˆã£ã¦ã™ã§ã«ä»–ã®å­ãƒ†ãƒ¼ãƒ–ルã«ç§»å‹•ã•れã¦ã„ã¾ã™" -#: executor/nodeSamplescan.c:260 +#: executor/nodeSamplescan.c:244 #, c-format msgid "TABLESAMPLE parameter cannot be null" msgstr "TABLESAMPLEパラメータã«nullã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: executor/nodeSamplescan.c:272 +#: executor/nodeSamplescan.c:256 #, c-format msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "TABLESAMPLE REPEATABLE パラメータã«nullã¯æŒ‡å®šã§ãã¾ã›ã‚“" @@ -13162,7 +13628,7 @@ msgstr "TABLESAMPLE REPEATABLE パラメータã«nullã¯æŒ‡å®šã§ãã¾ã›ã‚“" msgid "more than one row returned by a subquery used as an expression" msgstr "å¼ã¨ã—ã¦ä½¿ç”¨ã•れãŸå‰¯å•ã„åˆã‚ã›ãŒ2行以上ã®è¡Œã‚’è¿”ã—ã¾ã—ãŸ" -#: executor/nodeTableFuncscan.c:375 +#: executor/nodeTableFuncscan.c:370 #, c-format msgid "namespace URI must not be null" msgstr "åå‰ç©ºé–“URIã«nullã¯æŒ‡å®šã§ãã¾ã›ã‚“" @@ -13172,17 +13638,17 @@ msgstr "åå‰ç©ºé–“URIã«nullã¯æŒ‡å®šã§ãã¾ã›ã‚“" msgid "row filter expression must not be null" msgstr "行フィルタå¼ã¯nullã«ãªã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: executor/nodeTableFuncscan.c:415 +#: executor/nodeTableFuncscan.c:416 #, c-format msgid "column filter expression must not be null" msgstr "列フィルタå¼ã¯nullã«ãªã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: executor/nodeTableFuncscan.c:416 +#: executor/nodeTableFuncscan.c:417 #, c-format msgid "Filter for column \"%s\" is null." msgstr "列\"%s\"ã®ãƒ•ィルタãŒnullã§ã™ã€‚" -#: executor/nodeTableFuncscan.c:506 +#: executor/nodeTableFuncscan.c:507 #, c-format msgid "null is not allowed in column \"%s\"" msgstr "列\"%s\"ã§nullã¯è¨±å¯ã•れã¾ã›ã‚“" @@ -13212,84 +13678,84 @@ msgstr "フレームã®çµ‚了オフセット㯠NULL ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã› msgid "frame ending offset must not be negative" msgstr "フレームã®çµ‚了オフセットã¯è² æ•°ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: executor/nodeWindowAgg.c:2909 +#: executor/nodeWindowAgg.c:2891 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "集約関数 %s ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã¨ã—ã¦ã®ä½¿ç”¨ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: executor/spi.c:242 executor/spi.c:342 +#: executor/spi.c:241 executor/spi.c:341 #, c-format msgid "invalid transaction termination" msgstr "䏿­£ãªãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³çµ‚了" -#: executor/spi.c:257 +#: executor/spi.c:256 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "サブトランザクションã®å®Ÿè¡Œä¸­ã¯ã‚³ãƒŸãƒƒãƒˆã§ãã¾ã›ã‚“" -#: executor/spi.c:348 +#: executor/spi.c:347 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "サブトランザクションã®å®Ÿè¡Œä¸­ã¯ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ã§ãã¾ã›ã‚“" -#: executor/spi.c:472 +#: executor/spi.c:471 #, c-format msgid "transaction left non-empty SPI stack" msgstr "トランザクションã¯ç©ºã§ãªã„SPIスタックを残ã—ã¾ã—ãŸ" -#: executor/spi.c:473 executor/spi.c:533 +#: executor/spi.c:472 executor/spi.c:532 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "\"SPI_finish\"å‘¼å‡ºã®æŠœã‘を確èªãã ã•ã„" -#: executor/spi.c:532 +#: executor/spi.c:531 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "サブトランザクションãŒç©ºã§ãªã„SPIスタックを残ã—ã¾ã—ãŸ" -#: executor/spi.c:1600 +#: executor/spi.c:1602 #, c-format msgid "cannot open multi-query plan as cursor" msgstr "カーソルã«ãƒžãƒ«ãƒã‚¯ã‚¨ãƒªã®å®Ÿè¡Œè¨ˆç”»ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1610 +#: executor/spi.c:1612 #, c-format msgid "cannot open %s query as cursor" msgstr "カーソルã§%så•ã„åˆã‚ã›ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“" -#: executor/spi.c:1716 +#: executor/spi.c:1718 #, c-format msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHAREã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: executor/spi.c:1717 parser/analyze.c:2874 +#: executor/spi.c:1719 parser/analyze.c:2928 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "スクロールå¯èƒ½ã‚«ãƒ¼ã‚½ãƒ«ã¯èª­ã¿å–り専用ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: executor/spi.c:2474 +#: executor/spi.c:2496 #, c-format msgid "empty query does not return tuples" msgstr "空ã®å•ã„åˆã‚ã›ã¯çµæžœã‚’è¿”å´ã—ã¾ã›ã‚“" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:2548 +#: executor/spi.c:2570 #, c-format msgid "%s query does not return tuples" msgstr "%så•ã„åˆã‚ã›ãŒã‚¿ãƒ—ルを返ã—ã¾ã›ã‚“" -#: executor/spi.c:2963 +#: executor/spi.c:2987 #, c-format msgid "SQL expression \"%s\"" msgstr "SQL関数\"%s\"" -#: executor/spi.c:2968 +#: executor/spi.c:2992 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "PL/pgSQL代入\"%s\"" -#: executor/spi.c:2971 +#: executor/spi.c:2995 #, c-format msgid "SQL statement \"%s\"" msgstr "SQLæ–‡ \"%s\"" @@ -13299,482 +13765,502 @@ msgstr "SQLæ–‡ \"%s\"" msgid "could not send tuple to shared-memory queue" msgstr "共有メモリキューã«ã‚¿ãƒ—ルをé€å‡ºã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: foreign/foreign.c:222 +#: foreign/foreign.c:225 +#, c-format +msgid "user mapping not found for user \"%s\", server \"%s\"" +msgstr "ユーザー\"%s\"ã€ã‚µãƒ¼ãƒãƒ¼\"%s\"ã«å¯¾ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒžãƒƒãƒ”ングãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" + +#: foreign/foreign.c:336 optimizer/plan/createplan.c:7153 optimizer/util/plancat.c:540 #, c-format -msgid "user mapping not found for \"%s\"" -msgstr "\"%s\"ã«å¯¾ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒžãƒƒãƒ”ングãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" +msgid "access to non-system foreign table is restricted" +msgstr "éžã‚·ã‚¹ãƒ†ãƒ ã®å¤–部テーブルã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯åˆ¶é™ã•れã¦ã„ã¾ã™" -#: foreign/foreign.c:647 storage/file/fd.c:3881 +#: foreign/foreign.c:660 #, c-format msgid "invalid option \"%s\"" msgstr "䏿­£ãªã‚ªãƒ—ション\"%s\"" -#: foreign/foreign.c:649 +#: foreign/foreign.c:662 #, c-format msgid "Perhaps you meant the option \"%s\"." msgstr "ãŠãらãオプション\"%s\"ãªã®ã§ã¯ãªã„ã§ã—ょã†ã‹ã€‚" -#: foreign/foreign.c:651 +#: foreign/foreign.c:664 #, c-format msgid "There are no valid options in this context." msgstr "ã“ã®ã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆã§æœ‰åйãªã‚ªãƒ—ションã¯ã‚りã¾ã›ã‚“。" -#: gram.y:1200 +#: gram.y:1231 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD ã¯ä»Šå¾Œã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: gram.y:1201 +#: gram.y:1232 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "UNENCRYPTED を削除ã—ã¦ãã ã•ã„。ãã†ã™ã‚Œã°æ›¿ã‚りã«ãƒ‘スワードを暗å·åŒ–å½¢å¼ã§æ ¼ç´ã—ã¾ã™ã€‚" -#: gram.y:1528 gram.y:1544 +#: gram.y:1559 gram.y:1575 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTSã«ã¯ã‚¹ã‚­ãƒ¼ãƒžè¦ç´ ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: gram.y:1696 +#: gram.y:1727 #, c-format msgid "current database cannot be changed" msgstr "ç¾åœ¨ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’変更ã§ãã¾ã›ã‚“" -#: gram.y:1829 +#: gram.y:1860 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "タイムゾーンã®é–“éš”ã¯HOURã¾ãŸã¯HOUR TO MINUTEã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: gram.y:2446 +#: gram.y:2487 #, c-format msgid "column number must be in range from 1 to %d" msgstr "列番å·ã¯1ã‹ã‚‰%dã¾ã§ã®ç¯„囲ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: gram.y:3042 +#: gram.y:3083 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "シーケンスã®ã‚ªãƒ—ション\"%s\"ã¯ã“ã“ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: gram.y:3071 +#: gram.y:3122 #, c-format msgid "modulus for hash partition provided more than once" msgstr "ãƒãƒƒã‚·ãƒ¥ãƒ‘ãƒ¼ãƒ†ã‚£ã‚·ãƒ§ãƒ³ã§æ³•(除数)ãŒ2回以上指定ã•れã¦ã„ã¾ã™" -#: gram.y:3080 +#: gram.y:3131 #, c-format msgid "remainder for hash partition provided more than once" msgstr "ãƒãƒƒã‚·ãƒ¥ãƒ‘ーティションã§å‰°ä½™ãŒ2回以上指定ã•れã¦ã„ã¾ã™" -#: gram.y:3087 +#: gram.y:3138 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "ãƒãƒƒã‚·ãƒ¥ãƒ‘ーティションã®å¢ƒç•Œæ¡ä»¶\"%s\"ãŒèªè­˜ã§ãã¾ã›ã‚“" -#: gram.y:3095 +#: gram.y:3146 #, c-format msgid "modulus for hash partition must be specified" msgstr "ãƒãƒƒã‚·ãƒ¥ãƒ‘ーティションã§ã¯æ³•(除数)ã®æŒ‡å®šãŒå¿…è¦ã§ã™" -#: gram.y:3099 +#: gram.y:3150 #, c-format msgid "remainder for hash partition must be specified" msgstr "ãƒãƒƒã‚·ãƒ¥ãƒ‘ーティションã§ã¯å‰°ä½™ã®æŒ‡å®šãŒå¿…è¦ã§ã™" -#: gram.y:3307 gram.y:3341 +#: gram.y:3358 gram.y:3392 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUTã¯PROGRAMã¨åŒæ™‚ã«ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: gram.y:3313 +#: gram.y:3364 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "COPY TO ã§ WHERE å¥ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: gram.y:3652 gram.y:3659 gram.y:12824 gram.y:12832 +#: gram.y:3712 gram.y:3719 gram.y:13023 gram.y:13031 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "一時テーブル作æˆã«ãŠã‘ã‚‹GLOBALã¯å»ƒæ­¢äºˆå®šã§ã™" -#: gram.y:3935 +#: gram.y:3995 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "生æˆã‚«ãƒ©ãƒ ã«å¯¾ã—ã¦ã¯ GENERATED ALWAYS ã®æŒ‡å®šãŒå¿…é ˆã§ã™" -#: gram.y:4226 utils/adt/ri_triggers.c:2112 +#: gram.y:4340 utils/adt/ri_triggers.c:2103 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "MMATCH PARTIAL ã¯ã¾ã å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: gram.y:4318 +#: gram.y:4432 #, c-format msgid "a column list with %s is only supported for ON DELETE actions" msgstr "%sãŒæŒ‡å®šã•れãŸåˆ—リストã¯ON DELETEã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã«å¯¾ã—ã¦ã®ã¿ã‚µãƒãƒ¼ãƒˆã•れã¾ã™" -#: gram.y:5030 +#: gram.y:5151 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM ã¯ã™ã§ã«ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: gram.y:5728 +#: gram.y:5849 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "èªè­˜ã§ããªã„行セキュリティオプション \"%s\"" -#: gram.y:5729 +#: gram.y:5850 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "ç¾æ™‚点ã§ã¯PERMISSIVEã‚‚ã—ãã¯RESTRICTIVEãƒãƒªã‚·ã®ã¿ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™" -#: gram.y:5814 +#: gram.y:5935 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" msgstr "CREATE OR REPLACE CONSTRAINT TRIGGERã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: gram.y:5851 +#: gram.y:5972 msgid "duplicate trigger events specified" msgstr "é‡è¤‡ã—ãŸãƒˆãƒªã‚¬ãƒ¼ã‚¤ãƒ™ãƒ³ãƒˆãŒæŒ‡å®šã•れã¾ã—ãŸ" -#: gram.y:5993 parser/parse_utilcmd.c:3695 parser/parse_utilcmd.c:3721 +#: gram.y:6114 parser/parse_utilcmd.c:3692 parser/parse_utilcmd.c:3718 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "INITIALLY DEFERREDã¨å®£è¨€ã•れãŸåˆ¶ç´„ã¯DEFERRABLEã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: gram.y:6000 +#: gram.y:6121 #, c-format msgid "conflicting constraint properties" msgstr "制約属性ã®ç«¶åˆ" -#: gram.y:6099 +#: gram.y:6220 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTIONã¯ã¾ã å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: gram.y:6507 +#: gram.y:6537 +#, c-format +msgid "dropping an enum value is not implemented" +msgstr "列挙型ã®å€¤ã®å‰Šé™¤ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" + +#: gram.y:6655 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK ã¯ã‚‚ã¯ã‚„å¿…è¦ã¨ã•れã¾ã›ã‚“" -#: gram.y:6508 +#: gram.y:6656 #, c-format msgid "Update your data type." msgstr "データ型を更新ã—ã¦ãã ã•ã„" -#: gram.y:8381 +#: gram.y:8529 #, c-format msgid "aggregates cannot have output arguments" msgstr "集約ã¯å‡ºåŠ›ã®å¼•æ•°ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: gram.y:8844 utils/adt/regproc.c:670 +#: gram.y:8992 utils/adt/regproc.c:670 #, c-format msgid "missing argument" msgstr "引数ãŒè¶³ã‚Šã¾ã›ã‚“" -#: gram.y:8845 utils/adt/regproc.c:671 +#: gram.y:8993 utils/adt/regproc.c:671 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "å˜é …演算å­ã®å­˜åœ¨ã—ãªã„引数を表ã™ã«ã¯NONEを使用ã—ã¦ãã ã•ã„。" -#: gram.y:11057 gram.y:11076 +#: gram.y:11221 gram.y:11240 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTIONã¯å†å¸°ãƒ“ューã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: gram.y:12963 +#: gram.y:13162 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "LIMIT #,#æ§‹æ–‡ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: gram.y:12964 +#: gram.y:13163 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "分割ã—ã¦LIMITã¨OFFSETå¥ã‚’使用ã—ã¦ãã ã•ã„" -#: gram.y:13824 +#: gram.y:14038 #, c-format msgid "only one DEFAULT value is allowed" msgstr "DEFAULT値ã¯ä¸€ã¤ã ã‘指定å¯èƒ½ã§ã™" -#: gram.y:13833 +#: gram.y:14047 #, c-format msgid "only one PATH value per column is allowed" msgstr "列一ã¤ã«ã¤ãPATH値ã¯ä¸€ã¤ã ã‘指定å¯èƒ½ã§ã™" -#: gram.y:13842 +#: gram.y:14056 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "列\"%s\"ã§NULL / NOT NULL宣言ãŒè¡çªã—ã¦ã„ã‚‹ã‹é‡è¤‡ã—ã¦ã„ã¾ã™" -#: gram.y:13851 +#: gram.y:14065 #, c-format msgid "unrecognized column option \"%s\"" msgstr "èªè­˜ã§ããªã„列オプション \"%s\"" -#: gram.y:14105 +#: gram.y:14147 +#, c-format +msgid "only string constants are supported in JSON_TABLE path specification" +msgstr "JSON_TABLEパス指定ã§ã¯æ–‡å­—列定数ã®ã¿ãŒã‚µãƒãƒ¼ãƒˆã•れã¾ã™" + +#: gram.y:14469 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "æµ®å‹•å°æ•°ç‚¹æ•°ã®åž‹ã®ç²¾åº¦ã¯æœ€ä½Žã§ã‚‚1ビット必è¦ã§ã™" -#: gram.y:14114 +#: gram.y:14478 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "æµ®å‹•å°æ•°ç‚¹åž‹ã®ç²¾åº¦ã¯54ビットより低ããªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: gram.y:14617 +#: gram.y:14995 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "OVERLAPSå¼ã®å·¦è¾ºã®ãƒ‘ラメータ数ãŒé–“é•ã£ã¦ã„ã¾ã™" -#: gram.y:14622 +#: gram.y:15000 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "OVERLAPSå¼ã®å³è¾ºã®ãƒ‘ラメータ数ãŒé–“é•ã£ã¦ã„ã¾ã™" -#: gram.y:14799 +#: gram.y:15177 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE 述部ã¯ã¾ã å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: gram.y:15215 +#: gram.y:15591 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "複数ã®ORDER BYå¥ã¯WITHIN GROUPã¨ä¸€ç·’ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: gram.y:15220 +#: gram.y:15596 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT 㯠WITHIN GROUP ã¨åŒæ™‚ã«ã¯ä½¿ãˆã¾ã›ã‚“" -#: gram.y:15225 +#: gram.y:15601 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC 㯠WITHIN GROUP ã¨åŒæ™‚ã«ã¯ä½¿ãˆã¾ã›ã‚“" -#: gram.y:15859 gram.y:15883 +#: gram.y:16328 gram.y:16352 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "フレームã®é–‹å§‹ã¯ UNBOUNDED FOLLOWING ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: gram.y:15864 +#: gram.y:16333 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "次ã®è¡Œã‹ã‚‰å§‹ã¾ã‚‹ãƒ•レームã¯ã€ç¾åœ¨è¡Œã§ã¯çµ‚了ã§ãã¾ã›ã‚“" -#: gram.y:15888 +#: gram.y:16357 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "フレームã®çµ‚了㯠UNBOUNDED PRECEDING ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: gram.y:15894 +#: gram.y:16363 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "ç¾åœ¨è¡Œã‹ã‚‰å§‹ã¾ã‚‹ãƒ•レームã¯ã€å…ˆè¡Œã™ã‚‹è¡Œã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: gram.y:15901 +#: gram.y:16370 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "次ã®è¡Œã‹ã‚‰å§‹ã¾ã‚‹ãƒ•レームã¯ã€å…ˆè¡Œã™ã‚‹è¡Œã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: gram.y:16660 +#: gram.y:16919 +#, c-format +msgid "unrecognized JSON encoding: %s" +msgstr "䏿˜ŽãªJSON符å·åŒ–æ–¹å¼: \"%s\"" + +#: gram.y:17243 #, c-format msgid "type modifier cannot have parameter name" msgstr "型修正å­ã¯ãƒ‘ラメータåã‚’æŒã¤ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: gram.y:16666 +#: gram.y:17249 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "型修正å­ã¯ORDER BYã‚’æŒã¤ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: gram.y:16734 gram.y:16741 gram.y:16748 +#: gram.y:17317 gram.y:17324 gram.y:17331 #, c-format msgid "%s cannot be used as a role name here" msgstr "%sã¯ã“ã“ã§ã¯ãƒ­ãƒ¼ãƒ«åã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: gram.y:16838 gram.y:18295 +#: gram.y:17421 gram.y:18906 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIESã¯ORDER BYå¥ãªã—ã§ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: gram.y:17974 gram.y:18161 +#: gram.y:18597 gram.y:18772 msgid "improper use of \"*\"" msgstr "\"*\"ã®ä½¿ã„æ–¹ãŒä¸é©åˆ‡ã§ã™" -#: gram.y:18124 gram.y:18141 tsearch/spell.c:963 tsearch/spell.c:980 tsearch/spell.c:997 tsearch/spell.c:1014 tsearch/spell.c:1079 +#: gram.y:18735 gram.y:18752 tsearch/spell.c:964 tsearch/spell.c:981 tsearch/spell.c:998 tsearch/spell.c:1015 tsearch/spell.c:1081 #, c-format msgid "syntax error" msgstr "構文エラー" -#: gram.y:18225 +#: gram.y:18836 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "VARIADIC直接引数を使ã£ãŸé †åºé›†åˆé›†ç´„ã¯åŒã˜ãƒ‡ãƒ¼ã‚¿ã‚¿ã‚¤ãƒ—ã®VARIADICé›†ç´„å¼•æ•°ã‚’ä¸€ã¤æŒã¤å¿…è¦ãŒã‚りã¾ã™" -#: gram.y:18262 +#: gram.y:18873 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "複数ã®ORDER BYå¥ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: gram.y:18273 +#: gram.y:18884 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "複数ã®OFFSETå¥ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: gram.y:18282 +#: gram.y:18893 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "複数ã®LIMITå¥ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: gram.y:18291 +#: gram.y:18902 #, c-format msgid "multiple limit options not allowed" msgstr "複数ã®LIMITオプションã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: gram.y:18318 +#: gram.y:18929 #, c-format msgid "multiple WITH clauses not allowed" msgstr "複数㮠WITH å¥ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: gram.y:18511 +#: gram.y:19122 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "テーブル関数ã§ã¯ OUT 㨠INOUT 引数ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: gram.y:18644 +#: gram.y:19255 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "複数㮠COLLATE å¥ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18682 gram.y:18695 +#: gram.y:19293 gram.y:19306 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "%s制約ã¯é…å»¶å¯èƒ½ã«ã¯ã§ãã¾ã›ã‚“" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18708 +#: gram.y:19319 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "%s制約をNOT VALIDã¨ãƒžãƒ¼ã‚¯ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18721 +#: gram.y:19332 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s制約をNO INHERITをマークã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: gram.y:18743 +#: gram.y:19354 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "識別ã§ããªã„パーティションストラテジ \"%s\"" -#: gram.y:18767 +#: gram.y:19378 #, c-format msgid "invalid publication object list" msgstr "䏿­£ãªãƒ‘ブリケーションオブジェクトリスト" -#: gram.y:18768 +#: gram.y:19379 #, c-format msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." msgstr "テーブルåやスキーマåã‚’å˜ç‹¬è¨˜è¿°ã®å‰ã«TABLEã¾ãŸã¯TABLES IN SCHEMAã®ã„ãšã‚Œã‹ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: gram.y:18784 +#: gram.y:19395 #, c-format msgid "invalid table name" msgstr "䏿­£ãªãƒ†ãƒ¼ãƒ–ルå" -#: gram.y:18805 +#: gram.y:19416 #, c-format msgid "WHERE clause not allowed for schema" msgstr "WHEREå¥ã¯ã‚¹ã‚­ãƒ¼ãƒžã«å¯¾ã—ã¦ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: gram.y:18812 +#: gram.y:19423 #, c-format msgid "column specification not allowed for schema" msgstr "列指定ã¯ã‚¹ã‚­ãƒ¼ãƒžã«å¯¾ã—ã¦ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: gram.y:18826 +#: gram.y:19437 #, c-format msgid "invalid schema name" msgstr "䏿­£ãªã‚¹ã‚­ãƒ¼ãƒžå" -#: guc-file.l:193 +#: guc-file.l:192 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "空ã®è¨­å®šãƒ•ァイルå: \"%s\"" -#: guc-file.l:210 +#: guc-file.l:209 #, c-format msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" msgstr "設定ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: 入れå­é•·ãŒä¸Šé™ã‚’è¶…ãˆã¦ã„ã¾ã™" -#: guc-file.l:230 +#: guc-file.l:229 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "設定ファイル\"%s\"ãŒå†å¸°ã—ã¦ã„ã¾ã™" -#: guc-file.l:246 +#: guc-file.l:245 #, c-format msgid "could not open configuration file \"%s\": %m" msgstr "設定ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: guc-file.l:257 +#: guc-file.l:256 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "存在ã—ãªã„設定ファイル\"%s\"をスキップã—ã¾ã™" -#: guc-file.l:512 +#: guc-file.l:511 #, c-format msgid "syntax error in file \"%s\" line %u, near end of line" msgstr "ファイル\"%s\"ã®è¡Œ%uã®è¡Œæœ«è¿‘è¾ºã§æ§‹æ–‡ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã—ãŸ" -#: guc-file.l:522 +#: guc-file.l:521 #, c-format msgid "syntax error in file \"%s\" line %u, near token \"%s\"" msgstr "ファイル\"%s\"ã®è¡Œ%uã®ãƒˆãƒ¼ã‚¯ãƒ³\"%s\"è¿‘è¾ºã§æ§‹æ–‡ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã—ãŸ" -#: guc-file.l:542 +#: guc-file.l:541 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "多ãã®æ§‹æ–‡ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã—ãŸã€‚ファイル\"%s\"を断念ã—ã¾ã™" -#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:415 -#, c-format -msgid "could not access file \"%s\": %m" -msgstr "ファイル\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: jsonpath_gram.y:528 jsonpath_scan.l:630 jsonpath_scan.l:641 jsonpath_scan.l:651 jsonpath_scan.l:702 utils/adt/encode.c:492 utils/adt/encode.c:557 utils/adt/jsonfuncs.c:648 utils/adt/varlena.c:331 utils/adt/varlena.c:372 +#: jsonpath_gram.y:266 jsonpath_gram.y:598 jsonpath_scan.l:640 jsonpath_scan.l:651 jsonpath_scan.l:661 jsonpath_scan.l:712 utils/adt/encode.c:492 utils/adt/encode.c:557 utils/adt/jsonfuncs.c:659 utils/adt/varlena.c:333 utils/adt/varlena.c:374 #, c-format msgid "invalid input syntax for type %s" msgstr "%såž‹ã«å¯¾ã™ã‚‹ä¸æ­£ãªå…¥åŠ›æ§‹æ–‡" -#: jsonpath_gram.y:529 +#: jsonpath_gram.y:267 +#, c-format +msgid ".decimal() can only have an optional precision[,scale]." +msgstr ".decimal()ã§ã¯\"精度[,スケール]\"ã®ã‚ªãƒ—ションを1ã¤ã ã‘指定å¯èƒ½ã§ã™" + +#: jsonpath_gram.y:599 #, c-format msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." msgstr "LIKE_REGEX 述語ã®ä¸­ã«èªè­˜ã§ããªã„フラグ文字\"%.*s\"ãŒã‚りã¾ã™ã€‚" -#: jsonpath_gram.y:559 tsearch/spell.c:749 utils/adt/regexp.c:224 +#: jsonpath_gram.y:629 tsearch/spell.c:750 utils/adt/regexp.c:223 #, c-format msgid "invalid regular expression: %s" msgstr "æ­£è¦è¡¨ç¾ãŒä¸æ­£ã§ã™: %s" -#: jsonpath_gram.y:607 +#: jsonpath_gram.y:677 #, c-format msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" msgstr "XQueryã®\"x\"フラグ(拡張正è¦è¡¨ç¾)ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" #: jsonpath_scan.l:174 -msgid "invalid unicode sequence" -msgstr "䏿­£ãªUnicode文字列" +msgid "invalid Unicode escape sequence" +msgstr "䏿­£ãªUnicodeエスケープシーケンス" #: jsonpath_scan.l:180 -msgid "invalid hex character sequence" +msgid "invalid hexadecimal character sequence" msgstr "䏿­£ãª16進文字列" #: jsonpath_scan.l:195 msgid "unexpected end after backslash" msgstr "ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã®å¾Œã®æƒ³å®šå¤–ã®çµ‚了" -#: jsonpath_scan.l:201 -msgid "unexpected end of quoted string" -msgstr "クォートã•ã‚ŒãŸæ–‡å­—åˆ—ã®æƒ³å®šå¤–ã®çµ‚了" +#: jsonpath_scan.l:201 repl_scanner.l:211 scan.l:756 +msgid "unterminated quoted string" +msgstr "文字列ã®å¼•用符ãŒé–‰ã˜ã¦ã„ã¾ã›ã‚“" #: jsonpath_scan.l:228 msgid "unexpected end of comment" @@ -13784,41 +14270,41 @@ msgstr "ã‚³ãƒ¡ãƒ³ãƒˆã®æƒ³å®šå¤–ã®çµ‚了" msgid "invalid numeric literal" msgstr "䏿­£ãªnumericリテラル" -#: jsonpath_scan.l:325 jsonpath_scan.l:331 jsonpath_scan.l:337 scan.l:1049 scan.l:1053 scan.l:1057 scan.l:1061 scan.l:1065 scan.l:1069 scan.l:1073 +#: jsonpath_scan.l:325 jsonpath_scan.l:331 jsonpath_scan.l:337 scan.l:1064 scan.l:1068 scan.l:1072 scan.l:1076 msgid "trailing junk after numeric literal" msgstr "数値リテラルã®å¾Œã‚ã«ã‚´ãƒŸãŒã‚りã¾ã™" #. translator: %s is typically "syntax error" -#: jsonpath_scan.l:376 +#: jsonpath_scan.l:375 #, c-format msgid "%s at end of jsonpath input" msgstr "jsonpath ã®æœ€å¾Œã« %s ãŒã‚りã¾ã™" #. translator: first %s is typically "syntax error" -#: jsonpath_scan.l:383 +#: jsonpath_scan.l:382 #, c-format msgid "%s at or near \"%s\" of jsonpath input" msgstr "jsonpath 入力ã®\"%2$s\"ã¾ãŸã¯è¿‘ãã« %1$s ãŒã‚りã¾ã™" -#: jsonpath_scan.l:558 -msgid "bogus input" -msgstr "異常ãªå…¥åŠ›" +#: jsonpath_scan.l:568 +msgid "invalid input" +msgstr "䏿­£ãªå…¥åŠ›" -#: jsonpath_scan.l:584 +#: jsonpath_scan.l:594 msgid "invalid hexadecimal digit" msgstr "䏿­£ãª16進数æ¡" -#: jsonpath_scan.l:597 utils/adt/jsonfuncs.c:636 +#: jsonpath_scan.l:607 utils/adt/jsonfuncs.c:647 #, c-format msgid "unsupported Unicode escape sequence" msgstr "サãƒãƒ¼ãƒˆã•れãªã„Unicodeエスケープシーケンス" -#: jsonpath_scan.l:615 +#: jsonpath_scan.l:625 #, c-format -msgid "could not convert unicode to server encoding" +msgid "could not convert Unicode to server encoding" msgstr "Unicodeã®ã‚µãƒ¼ãƒãƒ¼ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã¸ã®å¤‰æ›ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: lib/dshash.c:254 utils/mmgr/dsa.c:714 utils/mmgr/dsa.c:736 utils/mmgr/dsa.c:817 +#: lib/dshash.c:254 utils/mmgr/dsa.c:708 utils/mmgr/dsa.c:730 utils/mmgr/dsa.c:811 #, c-format msgid "Failed on DSA request of size %zu." msgstr "サイズ%zuã®å‹•的共有エリアã®è¦æ±‚ã«å¤±æ•—ã—ã¾ã—ãŸã€‚" @@ -13828,699 +14314,694 @@ msgstr "サイズ%zuã®å‹•的共有エリアã®è¦æ±‚ã«å¤±æ•—ã—ã¾ã—ãŸã€‚" msgid "expected SASL response, got message type %d" msgstr "SASL応答を想定ã—ã¦ã„ã¾ã—ãŸãŒã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—%dã‚’å—ã‘å–りã¾ã—ãŸ" -#: libpq/auth-scram.c:270 +#: libpq/auth-scram.c:263 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "クライアントãŒç„¡åйãªSASLèªè¨¼æ©Ÿæ§‹ã‚’é¸æŠžã—ã¾ã—ãŸ" -#: libpq/auth-scram.c:294 libpq/auth-scram.c:543 libpq/auth-scram.c:554 +#: libpq/auth-scram.c:287 libpq/auth-scram.c:536 libpq/auth-scram.c:547 #, c-format msgid "invalid SCRAM secret for user \"%s\"" msgstr "ユーザー\"%s\"ã«å¯¾ã™ã‚‹ä¸æ­£ãªSCRAMシークレット" -#: libpq/auth-scram.c:305 +#: libpq/auth-scram.c:298 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "ユーザー\"%s\"ã¯æœ‰åйãªSCRAMシークレットをæŒã¡ã¾ã›ã‚“。" -#: libpq/auth-scram.c:385 libpq/auth-scram.c:390 libpq/auth-scram.c:744 libpq/auth-scram.c:752 libpq/auth-scram.c:857 libpq/auth-scram.c:870 libpq/auth-scram.c:880 libpq/auth-scram.c:988 libpq/auth-scram.c:995 libpq/auth-scram.c:1010 libpq/auth-scram.c:1025 libpq/auth-scram.c:1039 libpq/auth-scram.c:1057 libpq/auth-scram.c:1072 libpq/auth-scram.c:1386 libpq/auth-scram.c:1394 +#: libpq/auth-scram.c:378 libpq/auth-scram.c:383 libpq/auth-scram.c:737 libpq/auth-scram.c:745 libpq/auth-scram.c:850 libpq/auth-scram.c:863 libpq/auth-scram.c:873 libpq/auth-scram.c:981 libpq/auth-scram.c:988 libpq/auth-scram.c:1003 libpq/auth-scram.c:1018 libpq/auth-scram.c:1032 libpq/auth-scram.c:1050 libpq/auth-scram.c:1065 libpq/auth-scram.c:1379 libpq/auth-scram.c:1387 #, c-format msgid "malformed SCRAM message" msgstr "䏿­£ãªãƒ•ォーマットã®SCRAMメッセージã§ã™" -#: libpq/auth-scram.c:386 +#: libpq/auth-scram.c:379 #, c-format msgid "The message is empty." msgstr "メッセージãŒç©ºã§ã™ã€‚" -#: libpq/auth-scram.c:391 +#: libpq/auth-scram.c:384 #, c-format msgid "Message length does not match input length." msgstr "メッセージã®é•·ã•ãŒå…¥åŠ›ã®é•·ã•ã¨ä¸€è‡´ã—ã¾ã›ã‚“" -#: libpq/auth-scram.c:423 +#: libpq/auth-scram.c:416 #, c-format msgid "invalid SCRAM response" msgstr "䏿­£ãªSCRAM応答" -#: libpq/auth-scram.c:424 +#: libpq/auth-scram.c:417 #, c-format msgid "Nonce does not match." msgstr "Nonce ãŒåˆè‡´ã—ã¾ã›ã‚“" -#: libpq/auth-scram.c:500 +#: libpq/auth-scram.c:493 #, c-format msgid "could not generate random salt" msgstr "乱数ソルトを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/auth-scram.c:745 +#: libpq/auth-scram.c:738 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "属性\"%c\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" -#: libpq/auth-scram.c:753 libpq/auth-scram.c:881 +#: libpq/auth-scram.c:746 libpq/auth-scram.c:874 #, c-format msgid "Expected character \"=\" for attribute \"%c\"." msgstr "属性\"%c\"ã¨ã—ã¦ã¯æ–‡å­—\"=\"を想定ã—ã¦ã„ã¾ã—ãŸã€‚" -#: libpq/auth-scram.c:858 +#: libpq/auth-scram.c:851 #, c-format msgid "Attribute expected, but found end of string." msgstr "属性を想定ã—ã¾ã—ãŸãŒã€æ–‡å­—列ãŒçµ‚了ã—ã¾ã—ãŸã€‚" -#: libpq/auth-scram.c:871 +#: libpq/auth-scram.c:864 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "属性を想定ã—ã¾ã—ãŸãŒã€ä¸æ­£ãªæ–‡å­—\"%s\"ã§ã—ãŸã€‚" -#: libpq/auth-scram.c:989 libpq/auth-scram.c:1011 +#: libpq/auth-scram.c:982 libpq/auth-scram.c:1004 #, c-format msgid "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not include channel binding data." msgstr "クライアント㯠SCRAM-SHA-256-PLUS ã‚’é¸æŠžã—ã¾ã—ãŸãŒã€SCRAM メッセージã«ã¯ãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°æƒ…å ±ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。" -#: libpq/auth-scram.c:996 libpq/auth-scram.c:1026 +#: libpq/auth-scram.c:989 libpq/auth-scram.c:1019 #, c-format msgid "Comma expected, but found character \"%s\"." msgstr "カンマを想定ã—ã¦ã„ã¾ã—ãŸãŒã€æ–‡å­—\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ" -#: libpq/auth-scram.c:1017 +#: libpq/auth-scram.c:1010 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "SCRAM ãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã®ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã‚¨ãƒ©ãƒ¼" -#: libpq/auth-scram.c:1018 +#: libpq/auth-scram.c:1011 #, c-format msgid "The client supports SCRAM channel binding but thinks the server does not. However, this server does support channel binding." msgstr "クライアント㯠SCRAM ãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ãŒã€ã‚µãƒ¼ãƒãƒ¼ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ãªã„ã¨æ€ã£ã¦ã„ã¾ã™ã€‚ã—ã‹ã—実際ã«ã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚" -#: libpq/auth-scram.c:1040 +#: libpq/auth-scram.c:1033 #, c-format msgid "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM message includes channel binding data." msgstr "クライアントã¯ãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãªã—ã® SCRAM-SHA-256 ã‚’é¸æŠžã—ã¾ã—ãŸãŒã€SCRAM メッセージã«ã¯ãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°æƒ…å ±ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚" -#: libpq/auth-scram.c:1051 +#: libpq/auth-scram.c:1044 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "SCRAM ãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚¿ã‚¤ãƒ— \"%s\"ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: libpq/auth-scram.c:1058 +#: libpq/auth-scram.c:1051 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "予期ã—ãªã„ãƒãƒ£ãƒãƒ«å‰²ã‚Šå½“ã¦ãƒ•ラグ \"%s\"" -#: libpq/auth-scram.c:1068 +#: libpq/auth-scram.c:1061 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "クライアントã¯èªè¨¼è­˜åˆ¥å­ã‚’使ã£ã¦ã„ã¾ã™ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: libpq/auth-scram.c:1073 +#: libpq/auth-scram.c:1066 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "client-fist-message ã§ã®æƒ³å®šå¤–ã®å±žæ€§\"%s\"" -#: libpq/auth-scram.c:1089 +#: libpq/auth-scram.c:1082 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "クライアントã¯ã‚µãƒãƒ¼ãƒˆå¤–ã®SCRAMæ‹¡å¼µã‚’è¦æ±‚ã—ã¦ã„ã¾ã™" -#: libpq/auth-scram.c:1103 +#: libpq/auth-scram.c:1096 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "SCRAM nonce ã®ä¸­ã«è¡¨ç¤ºä¸èƒ½ãªæ–‡å­—ãŒã‚りã¾ã™" -#: libpq/auth-scram.c:1234 +#: libpq/auth-scram.c:1227 #, c-format msgid "could not generate random nonce" msgstr "乱数nonceを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/auth-scram.c:1244 +#: libpq/auth-scram.c:1237 #, c-format msgid "could not encode random nonce" msgstr "乱数nonceをエンコードã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/auth-scram.c:1350 +#: libpq/auth-scram.c:1343 #, c-format msgid "SCRAM channel binding check failed" msgstr "SCRAM ãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã®ç¢ºèªã§å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth-scram.c:1368 +#: libpq/auth-scram.c:1361 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "client-final-message ä¸­ã«æƒ³å®šå¤–ã® SCRAM channel-binding 属性ãŒã‚りã¾ã—ãŸ" -#: libpq/auth-scram.c:1387 +#: libpq/auth-scram.c:1380 #, c-format msgid "Malformed proof in client-final-message." msgstr "client-final-message 中㮠proof ã®å½¢å¼ãŒä¸æ­£ã§ã™" -#: libpq/auth-scram.c:1395 +#: libpq/auth-scram.c:1388 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "client-final-message ã®çµ‚端ã«ä¸è¦ãªãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã™ã€‚" -#: libpq/auth.c:271 +#: libpq/auth.c:269 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "ユーザー\"%s\"ã®èªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ: ホストを拒絶ã—ã¾ã—ãŸ" -#: libpq/auth.c:274 +#: libpq/auth.c:272 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"ã®\"trust\"èªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:277 +#: libpq/auth.c:275 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"ã®Identèªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:280 +#: libpq/auth.c:278 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"ã§å¯¾å‘(peer)èªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:285 +#: libpq/auth.c:283 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"ã®ãƒ‘スワードèªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:290 +#: libpq/auth.c:288 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"ã®GSSAPIèªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:293 +#: libpq/auth.c:291 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"ã®SSPIèªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:296 +#: libpq/auth.c:294 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"ã®PAMèªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:299 +#: libpq/auth.c:297 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"ã®BSDèªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:302 +#: libpq/auth.c:300 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"ã®LDAPèªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:305 +#: libpq/auth.c:303 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"ã®è¨¼æ˜Žæ›¸èªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:308 +#: libpq/auth.c:306 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"ã® RADIUS èªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:311 +#: libpq/auth.c:309 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "ユーザー\"%s\"ã®èªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ: èªè¨¼æ–¹å¼ãŒä¸æ­£ã§ã™" -#: libpq/auth.c:315 +#: libpq/auth.c:313 #, c-format -msgid "Connection matched %s line %d: \"%s\"" -msgstr "接続ã¯%sã®è¡Œ%dã«ä¸€è‡´ã—ã¾ã—ãŸ: \"%s\"" +msgid "Connection matched file \"%s\" line %d: \"%s\"" +msgstr "接続ã¯ãƒ•ァイル%sã®è¡Œ%dã«ä¸€è‡´ã—ã¾ã—ãŸ: \"%s\"" -#: libpq/auth.c:359 +#: libpq/auth.c:357 #, c-format msgid "authentication identifier set more than once" msgstr "èªè¨¼è­˜åˆ¥å­ãŒ2度以上設定ã•れã¾ã—ãŸ" -#: libpq/auth.c:360 +#: libpq/auth.c:358 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "以å‰ã®è­˜åˆ¥å­: \"%s\"; æ–°ã—ã„識別å­: \"%s\"" -#: libpq/auth.c:370 +#: libpq/auth.c:368 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "接続èªè¨¼å®Œäº†: 識別å=\"%s\" æ–¹å¼=%s (%s:%d)" -#: libpq/auth.c:410 +#: libpq/auth.c:408 #, c-format msgid "client certificates can only be checked if a root certificate store is available" msgstr "クライアント証明書ã¯ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ã‚¹ãƒˆã‚¢ãŒåˆ©ç”¨ã§ãã‚‹å ´åˆã«ã®ã¿æ¤œè¨¼ã•れã¾ã™" -#: libpq/auth.c:421 +#: libpq/auth.c:419 #, c-format msgid "connection requires a valid client certificate" msgstr "ã“ã®æŽ¥ç¶šã«ã¯æœ‰åйãªã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆè¨¼æ˜ŽãŒå¿…è¦ã§ã™" -#: libpq/auth.c:452 libpq/auth.c:498 +#: libpq/auth.c:450 libpq/auth.c:496 msgid "GSS encryption" msgstr "GSSæš—å·åŒ–" -#: libpq/auth.c:455 libpq/auth.c:501 +#: libpq/auth.c:453 libpq/auth.c:499 msgid "SSL encryption" msgstr "SSLæš—å·åŒ–" -#: libpq/auth.c:457 libpq/auth.c:503 +#: libpq/auth.c:455 libpq/auth.c:501 msgid "no encryption" msgstr "æš—å·åŒ–ãªã—" #. translator: last %s describes encryption state -#: libpq/auth.c:463 +#: libpq/auth.c:461 #, c-format msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" msgstr "pg_hba.conf ã®è¨­å®šã§ãƒ›ã‚¹ãƒˆ \"%s\"ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ \"%s\", %s 用ã®ãƒ¬ãƒ—リケーション接続を拒å¦ã—ã¾ã—ãŸ" #. translator: last %s describes encryption state -#: libpq/auth.c:470 +#: libpq/auth.c:468 #, c-format msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "pg_hba.conf ã®è¨­å®šã§ãƒ›ã‚¹ãƒˆ \"%s\"ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ \"%s\"ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ \"%s\", %sã®æŽ¥ç¶šã‚’æ‹’å¦ã—ã¾ã—ãŸ" -#: libpq/auth.c:508 +#: libpq/auth.c:506 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "クライアントIPアドレスã¯\"%s\"ã«è§£æ±ºã•れã€å‰æ–¹æ¤œç´¢ã¨ä¸€è‡´ã—ã¾ã—ãŸã€‚" -#: libpq/auth.c:511 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "クライアントIPアドレスã¯\"%s\"ã«è§£æ±ºã•れã¾ã—ãŸã€‚剿–¹æ¤œç´¢ã¯æ¤œæŸ»ã•れã¾ã›ã‚“。" -#: libpq/auth.c:514 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "クライアントIPアドレスã¯\"%s\"ã«è§£æ±ºã•れã€å‰æ–¹æ¤œç´¢ã¨ä¸€è‡´ã—ã¾ã›ã‚“ã§ã—ãŸã€‚" -#: libpq/auth.c:517 +#: libpq/auth.c:515 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "クライアントã®ãƒ›ã‚¹ãƒˆå\"%s\"ã‚’IPアドレスã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s。" -#: libpq/auth.c:522 +#: libpq/auth.c:520 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "クライアントã®IPアドレスをホストåã«è§£æ±ºã§ãã¾ã›ã‚“ã§ã—ãŸ: %s。" #. translator: last %s describes encryption state -#: libpq/auth.c:530 +#: libpq/auth.c:528 #, c-format msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" msgstr "pg_hba.conf ã«ãƒ›ã‚¹ãƒˆ\"%s\"ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\", %s用ã®ã‚¨ãƒ³ãƒˆãƒªãŒã‚りã¾ã›ã‚“" #. translator: last %s describes encryption state -#: libpq/auth.c:538 +#: libpq/auth.c:536 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "pg_hba.conf ã«ãƒ›ã‚¹ãƒˆ\"%s\"ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%s, %s用ã®ã‚¨ãƒ³ãƒˆãƒªãŒã‚りã¾ã›ã‚“" -#: libpq/auth.c:711 +#: libpq/auth.c:656 +#, c-format +msgid "connection authenticated: user=\"%s\" method=%s (%s:%d)" +msgstr "接続èªè¨¼å®Œäº†: ユーザー=\"%s\" æ–¹å¼=%s (%s:%d)" + +#: libpq/auth.c:725 #, c-format msgid "expected password response, got message type %d" msgstr "パスワード応答を想定ã—ã¾ã—ãŸãŒã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—%dã‚’å—ã‘å–りã¾ã—ãŸ" -#: libpq/auth.c:732 +#: libpq/auth.c:746 #, c-format msgid "invalid password packet size" msgstr "パスワードパケットã®ã‚µã‚¤ã‚ºãŒä¸æ­£ã§ã™" -#: libpq/auth.c:750 +#: libpq/auth.c:764 #, c-format msgid "empty password returned by client" msgstr "クライアントã‹ã‚‰ç©ºã®ãƒ‘スワードãŒè¿”ã•れã¾ã—ãŸ" -#: libpq/auth.c:879 libpq/hba.c:1749 -#, c-format -msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" -msgstr "\"db_user_namespace\"ãŒæœ‰åйã®å ´åˆã€MD5 èªè¨¼ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" - -#: libpq/auth.c:885 +#: libpq/auth.c:892 #, c-format msgid "could not generate random MD5 salt" msgstr "ランダムãªMD5ソルトã®ç”Ÿæˆã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:936 libpq/be-secure-gssapi.c:540 +#: libpq/auth.c:943 libpq/be-secure-gssapi.c:540 #, c-format msgid "could not set environment: %m" msgstr "環境を設定ã§ãã¾ã›ã‚“: %m" -#: libpq/auth.c:975 +#: libpq/auth.c:982 #, c-format msgid "expected GSS response, got message type %d" msgstr "GSS応答を想定ã—ã¾ã—ãŸãŒã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ— %d ã‚’å—ã‘å–りã¾ã—ãŸ" -#: libpq/auth.c:1041 +#: libpq/auth.c:1048 msgid "accepting GSS security context failed" msgstr "GSSセキュリティコンテキストã®å—ã‘付ã‘ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:1082 +#: libpq/auth.c:1089 msgid "retrieving GSS user name failed" msgstr "GSSユーザーåã®å—ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/auth.c:1228 +#: libpq/auth.c:1235 msgid "could not acquire SSPI credentials" msgstr "SSPIã®è³‡æ ¼ãƒãƒ³ãƒ‰ãƒ«ã‚’入手ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/auth.c:1253 +#: libpq/auth.c:1260 #, c-format msgid "expected SSPI response, got message type %d" msgstr "SSPI応答を想定ã—ã¾ã—ãŸãŒã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—%dã‚’å—ã‘å–りã¾ã—ãŸ" -#: libpq/auth.c:1331 +#: libpq/auth.c:1338 msgid "could not accept SSPI security context" msgstr "SSPIセキュリティコンテキストをå—ã‘付ã‘られã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/auth.c:1372 +#: libpq/auth.c:1379 msgid "could not get token from SSPI security context" msgstr "SSPIセキュリティコンテキストã‹ã‚‰ãƒˆãƒ¼ã‚¯ãƒ³ã‚’入手ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/auth.c:1508 libpq/auth.c:1527 +#: libpq/auth.c:1515 libpq/auth.c:1534 #, c-format msgid "could not translate name" msgstr "åå‰ã®å¤‰æ›ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/auth.c:1540 +#: libpq/auth.c:1547 #, c-format msgid "realm name too long" msgstr "realmåãŒé•·ã™ãŽã¾ã™" -#: libpq/auth.c:1555 +#: libpq/auth.c:1562 #, c-format msgid "translated account name too long" msgstr "変æ›å¾Œã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆåãŒé•·ã™ãŽã¾ã™" -#: libpq/auth.c:1734 +#: libpq/auth.c:1741 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "Ident接続用ã®ã‚½ã‚±ãƒƒãƒˆã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/auth.c:1749 +#: libpq/auth.c:1756 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "ローカルアドレス\"%s\"ã«ãƒã‚¤ãƒ³ãƒ‰ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/auth.c:1761 +#: libpq/auth.c:1768 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "アドレス\"%s\"ã€ãƒãƒ¼ãƒˆ%sã®Identサーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/auth.c:1783 +#: libpq/auth.c:1790 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "アドレス\"%s\"ã€ãƒãƒ¼ãƒˆ%sã®Identサーãƒãƒ¼ã«å•ã„åˆã‚ã›ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/auth.c:1800 +#: libpq/auth.c:1807 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "アドレス\"%s\"ã€ãƒãƒ¼ãƒˆ%sã®Identサーãƒãƒ¼ã‹ã‚‰ã®å¿œç­”ã‚’å—ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/auth.c:1810 +#: libpq/auth.c:1817 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "Identサーãƒãƒ¼ã‹ã‚‰ã®å¿œç­”ã®æ›¸å¼ãŒä¸æ­£ã§ã™: \"%s\"" -#: libpq/auth.c:1863 +#: libpq/auth.c:1870 #, c-format msgid "peer authentication is not supported on this platform" msgstr "ã“ã®ãƒ—ラットフォームã§ã¯å¯¾å‘(peer)èªè¨¼ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: libpq/auth.c:1867 +#: libpq/auth.c:1874 #, c-format msgid "could not get peer credentials: %m" msgstr "ピアã®è³‡æ ¼è¨¼æ˜Žã‚’入手ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/auth.c:1879 +#: libpq/auth.c:1886 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "ローカルユーザーID %ldã®å‚ç…§ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: libpq/auth.c:1981 +#: libpq/auth.c:1988 #, c-format msgid "error from underlying PAM layer: %s" msgstr "背後ã®PAM層ã§ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã—ãŸ: %s" -#: libpq/auth.c:1992 +#: libpq/auth.c:1999 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "éžã‚µãƒãƒ¼ãƒˆã®PAM変æ›%d/\"%s\"" -#: libpq/auth.c:2049 +#: libpq/auth.c:2056 #, c-format msgid "could not create PAM authenticator: %s" msgstr "PAM authenticatorを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/auth.c:2060 +#: libpq/auth.c:2067 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER)ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" -#: libpq/auth.c:2092 +#: libpq/auth.c:2099 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST)ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" -#: libpq/auth.c:2104 +#: libpq/auth.c:2111 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "\"pam_set_item(PAM_CONV)ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" -#: libpq/auth.c:2117 +#: libpq/auth.c:2124 #, c-format msgid "pam_authenticate failed: %s" msgstr "\"pam_authenticateãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" -#: libpq/auth.c:2130 +#: libpq/auth.c:2137 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmtãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" -#: libpq/auth.c:2141 +#: libpq/auth.c:2148 #, c-format msgid "could not release PAM authenticator: %s" msgstr "PAM authenticatorを解放ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/auth.c:2221 +#: libpq/auth.c:2228 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "LDAPã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ: %d" -#: libpq/auth.c:2258 +#: libpq/auth.c:2265 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "ldapbasedn ã‹ã‚‰ãƒ‰ãƒ¡ã‚¤ãƒ³åを抽出ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/auth.c:2266 +#: libpq/auth.c:2273 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "LDAPèªè¨¼ã§\"%s\"ã«å¯¾ã™ã‚‹ DNS SRV レコードãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/auth.c:2268 +#: libpq/auth.c:2275 #, c-format msgid "Set an LDAP server name explicitly." msgstr "LDAPサーãƒãƒ¼åã‚’æ˜Žç¤ºçš„ã«æŒ‡å®šã—ã¦ãã ã•ã„。" -#: libpq/auth.c:2320 +#: libpq/auth.c:2327 #, c-format msgid "could not initialize LDAP: %s" msgstr "LDAPã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/auth.c:2330 +#: libpq/auth.c:2337 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ã“ã® LDAP ライブラリã§ã¯ ldaps ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: libpq/auth.c:2338 +#: libpq/auth.c:2345 #, c-format msgid "could not initialize LDAP: %m" msgstr "LDAPã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/auth.c:2348 +#: libpq/auth.c:2355 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "LDAPプロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/auth.c:2364 +#: libpq/auth.c:2371 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "LDAP TLSセッションを開始ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/auth.c:2441 +#: libpq/auth.c:2448 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP サーãƒãƒ¼ã‚‚ ldapbasedn も指定ã•れã¦ã„ã¾ã›ã‚“" -#: libpq/auth.c:2448 +#: libpq/auth.c:2455 #, c-format msgid "LDAP server not specified" msgstr "LDAP サーãƒãƒ¼ã®æŒ‡å®šãŒã‚りã¾ã›ã‚“" -#: libpq/auth.c:2510 +#: libpq/auth.c:2517 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "LDAP èªè¨¼ã§ãƒ¦ãƒ¼ã‚¶ãƒ¼åã®ä¸­ã«ä¸æ­£ãªæ–‡å­—ãŒã‚りã¾ã™" -#: libpq/auth.c:2527 +#: libpq/auth.c:2534 #, c-format msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" msgstr "サーãƒãƒ¼\"%2$s\"ã§ã€ldapbinddn \"%1$s\"ã«ã‚ˆã‚‹LDAPãƒã‚¤ãƒ³ãƒ‰ã‚’実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %3$s" -#: libpq/auth.c:2557 +#: libpq/auth.c:2564 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "サーãƒãƒ¼\"%2$s\"ã§ã€ãƒ•ィルタ\"%1$s\"ã«ã‚ˆã‚‹LDAP検索ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %3$s" -#: libpq/auth.c:2573 +#: libpq/auth.c:2580 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAPサーãƒãƒ¼\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: libpq/auth.c:2574 +#: libpq/auth.c:2581 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "サーãƒãƒ¼\"%2$s\"ã§ã€ãƒ•ィルタ\"%1$s\"ã«ã‚ˆã‚‹LDAP検索ãŒä½•ã‚‚è¿”ã—ã¾ã›ã‚“ã§ã—ãŸã€‚" -#: libpq/auth.c:2578 +#: libpq/auth.c:2585 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAPユーザー\"%s\"ã¯ä¸€æ„ã§ã¯ã‚りã¾ã›ã‚“" -#: libpq/auth.c:2579 +#: libpq/auth.c:2586 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." msgstr[0] "サーãƒãƒ¼\"%2$s\"ã§ã€ãƒ•ィルタ\"%1$s\"ã«ã‚ˆã‚‹LDAP検索ãŒ%3$d項目返ã—ã¾ã—ãŸã€‚" -#: libpq/auth.c:2599 +#: libpq/auth.c:2606 #, c-format msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "サーãƒãƒ¼\"%2$s\"ã§\"%1$s\"ã«ãƒžãƒƒãƒã™ã‚‹æœ€åˆã®ã‚¨ãƒ³ãƒˆãƒªã® dn ã‚’å–å¾—ã§ãã¾ã›ã‚“: %3$s" -#: libpq/auth.c:2620 -#, c-format -msgid "could not unbind after searching for user \"%s\" on server \"%s\"" -msgstr "サーãƒãƒ¼\"%2$s\"ã§ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%1$s\"ã®æ¤œç´¢å¾Œã€unbindã§ãã¾ã›ã‚“ã§ã—ãŸ" - -#: libpq/auth.c:2651 +#: libpq/auth.c:2633 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "サーãƒãƒ¼\"%2$s\"ã§ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%1$s\"ã®LDAPログインãŒå¤±æ•—ã—ã¾ã—ãŸ: %3$s" -#: libpq/auth.c:2683 +#: libpq/auth.c:2665 #, c-format msgid "LDAP diagnostics: %s" msgstr "LDAP診断: %s" -#: libpq/auth.c:2721 +#: libpq/auth.c:2703 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "ユーザー \"%s\" ã®è¨¼æ˜Žæ›¸èªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ: クライアント証明書ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼åãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“" -#: libpq/auth.c:2742 +#: libpq/auth.c:2724 #, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" msgstr "ユーザー\"%s\"ã®è¨¼æ˜Žæ›¸èªè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ: サブジェクト識別å(DN)ãŒå–å¾—ã§ãã¾ã›ã‚“" -#: libpq/auth.c:2765 +#: libpq/auth.c:2747 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" msgstr "ユーザー\"%s\"ã«å¯¾ã™ã‚‹è¨¼æ˜Žæ›¸ã®æ¤œè¨¼(clientcert=verify-full) ã«å¤±æ•—ã—ã¾ã—ãŸ: DN ä¸ä¸€è‡´" -#: libpq/auth.c:2770 +#: libpq/auth.c:2752 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "ユーザー\"%s\"ã«å¯¾ã™ã‚‹è¨¼æ˜Žæ›¸ã®æ¤œè¨¼(clientcert=verify-full) ã«å¤±æ•—ã—ã¾ã—ãŸ: CN ä¸ä¸€è‡´" -#: libpq/auth.c:2872 +#: libpq/auth.c:2854 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS サーãƒãƒ¼ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: libpq/auth.c:2879 +#: libpq/auth.c:2861 #, c-format msgid "RADIUS secret not specified" msgstr "RADIUS secret ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: libpq/auth.c:2893 +#: libpq/auth.c:2875 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "RADIUSèªè¨¼ã§ã¯%d文字より長ã„パスワードã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: libpq/auth.c:2995 libpq/hba.c:2391 +#: libpq/auth.c:2977 libpq/hba.c:2352 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "RADIUS サーãƒãƒ¼å\"%s\"をアドレスã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/auth.c:3009 +#: libpq/auth.c:2991 #, c-format msgid "could not generate random encryption vector" msgstr "ãƒ©ãƒ³ãƒ€ãƒ ãªæš—å·åŒ–ベクトルを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/auth.c:3046 +#: libpq/auth.c:3028 #, c-format msgid "could not perform MD5 encryption of password: %s" msgstr "パスワードã®MD5æš—å·åŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: libpq/auth.c:3073 +#: libpq/auth.c:3055 #, c-format msgid "could not create RADIUS socket: %m" msgstr "RADIUSã®ã‚½ã‚±ãƒƒãƒˆã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/auth.c:3089 +#: libpq/auth.c:3071 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "ローカル㮠RADIUS ソケットをãƒã‚¤ãƒ³ãƒ‰ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/auth.c:3099 +#: libpq/auth.c:3081 #, c-format msgid "could not send RADIUS packet: %m" msgstr "RADIUS パケットをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/auth.c:3133 libpq/auth.c:3159 +#: libpq/auth.c:3115 libpq/auth.c:3141 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "%sã‹ã‚‰ã®RADIUSã®å¿œç­”å¾…ã¡ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ" -#: libpq/auth.c:3152 +#: libpq/auth.c:3134 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "RADIUSソケットã®çŠ¶æ…‹ã‚’ãƒã‚§ãƒƒã‚¯ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/auth.c:3182 +#: libpq/auth.c:3164 #, c-format msgid "could not read RADIUS response: %m" msgstr "RADIUS応答を読ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/auth.c:3190 +#: libpq/auth.c:3172 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "%sã‹ã‚‰ã®RADIUS応答ãŒèª¤ã£ãŸãƒãƒ¼ãƒˆã‹ã‚‰é€ã‚‰ã‚Œã¦ãã¾ã—ãŸ: %d" -#: libpq/auth.c:3198 +#: libpq/auth.c:3180 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "%sã‹ã‚‰ã®RADIUS応答ãŒçŸ­ã™ãŽã¾ã™: %d" -#: libpq/auth.c:3205 +#: libpq/auth.c:3187 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "%sã‹ã‚‰ã®RADIUS応答ãŒé–“é•ã£ãŸé•·ã•ã‚’ä¿æŒã—ã¦ã„ã¾ã™: %d(実際ã®é•·ã•ã¯%d)" -#: libpq/auth.c:3213 +#: libpq/auth.c:3195 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "%sã‹ã‚‰ã®RADIUS応答ã¯ç•°ãªã‚‹ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«å¯¾ã™ã‚‹ã‚‚ã®ã§ã™: %d (%d ã§ã‚ã‚‹ã¯ãš)" -#: libpq/auth.c:3238 +#: libpq/auth.c:3220 #, c-format msgid "could not perform MD5 encryption of received packet: %s" msgstr "å—信パケットã®MD5æš—å·åŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: libpq/auth.c:3248 +#: libpq/auth.c:3230 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "%sã‹ã‚‰ã®RADIUS応答ãŒé–“é•ã£ãŸMD5ã‚·ã‚°ãƒãƒãƒ£ã‚’ä¿æŒã—ã¦ã„ã¾ã™" -#: libpq/auth.c:3266 +#: libpq/auth.c:3248 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "%1$sã‹ã‚‰ã®RADIUS応答ãŒãƒ¦ãƒ¼ã‚¶ãƒ¼\"%3$s\"ã«ã¨ã£ã¦ä¸æ­£ãªã‚³ãƒ¼ãƒ‰(%2$d)ã‚’ä¿æŒã—ã¦ã„ã¾ã™" @@ -14575,61 +15056,51 @@ msgstr "サーãƒãƒ¼ãƒ•ァイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" msgid "large object read request is too large" msgstr "ラージオブジェクトã®èª­ã¿è¾¼ã¿è¦æ±‚ãŒå¤§ãã™ãŽã¾ã™" -#: libpq/be-fsstubs.c:816 utils/adt/genfile.c:262 utils/adt/genfile.c:294 utils/adt/genfile.c:315 +#: libpq/be-fsstubs.c:816 utils/adt/genfile.c:248 utils/adt/genfile.c:269 #, c-format msgid "requested length cannot be negative" msgstr "è² ã®é•·ã•を指定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: libpq/be-fsstubs.c:871 storage/large_object/inv_api.c:299 storage/large_object/inv_api.c:311 storage/large_object/inv_api.c:508 storage/large_object/inv_api.c:619 storage/large_object/inv_api.c:809 -#, c-format -msgid "permission denied for large object %u" -msgstr "ラージオブジェクト %u ã«å¯¾ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" - -#: libpq/be-secure-common.c:71 -#, c-format -msgid "could not read from command \"%s\": %m" -msgstr "コマンド\"%s\"ã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: libpq/be-secure-common.c:91 +#: libpq/be-secure-common.c:94 #, c-format msgid "command \"%s\" failed" msgstr "コマンド\"%s\"ã®å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/be-secure-common.c:119 +#: libpq/be-secure-common.c:123 #, c-format msgid "could not access private key file \"%s\": %m" msgstr "秘密éµãƒ•ァイル\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/be-secure-common.c:129 +#: libpq/be-secure-common.c:133 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "秘密éµãƒ•ァイル\"%s\"ã¯é€šå¸¸ã®ãƒ•ァイルã§ã¯ã‚りã¾ã›ã‚“" -#: libpq/be-secure-common.c:155 +#: libpq/be-secure-common.c:159 #, c-format msgid "private key file \"%s\" must be owned by the database user or root" msgstr "秘密éµãƒ•ァイル\"%s\"ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚‚ã—ãã¯rootã®æ‰€æœ‰ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: libpq/be-secure-common.c:165 +#: libpq/be-secure-common.c:169 #, c-format msgid "private key file \"%s\" has group or world access" msgstr "秘密éµãƒ•ァイル\"%s\"ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã¾ãŸã¯å…¨å“¡ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ã§ã™" -#: libpq/be-secure-common.c:167 +#: libpq/be-secure-common.c:171 #, c-format msgid "File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root." msgstr "ファイルã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æ‰€æœ‰ã®å ´åˆã¯ u=rw (0600) ã‹ãれよりも低ã„パーミッションã€root所有ã®å ´åˆã¯ u=rw,g=r (0640) ã‹ãれよりも低ã„パーミッションã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: libpq/be-secure-gssapi.c:204 +#: libpq/be-secure-gssapi.c:201 msgid "GSSAPI wrap error" msgstr "GSSAPIåラップエラー" -#: libpq/be-secure-gssapi.c:211 +#: libpq/be-secure-gssapi.c:208 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "é€å‡ºã•れるGSSAPIãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æ©Ÿå¯†æ€§ãŒé©ç”¨ã•れã¾ã›ã‚“" -#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:634 +#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "サーãƒãƒ¼ã¯éŽå¤§ãªã‚µã‚¤ã‚ºã®GSSAPIパケットをé€ä¿¡ã—よã†ã¨ã—ã¾ã—ãŸ: (%zu > %zu)" @@ -14661,800 +15132,794 @@ msgstr "GSSAPIセキュリティコンテキストをå—ã‘入れられã¾ã›ã‚“ msgid "GSSAPI size check error" msgstr "GSSAPIサイズãƒã‚§ãƒƒã‚¯ã‚¨ãƒ©ãƒ¼" -#: libpq/be-secure-openssl.c:125 +#: libpq/be-secure-openssl.c:131 #, c-format msgid "could not create SSL context: %s" msgstr "SSLコンテキストを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/be-secure-openssl.c:151 +#: libpq/be-secure-openssl.c:157 #, c-format msgid "could not load server certificate file \"%s\": %s" msgstr "サーãƒãƒ¼è¨¼æ˜Žæ›¸ãƒ•ァイル\"%s\"をロードã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/be-secure-openssl.c:171 +#: libpq/be-secure-openssl.c:177 #, c-format msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" msgstr "パスフレーズãŒè¦æ±‚ã•れãŸãŸã‚秘密éµãƒ•ァイル\"%s\"をリロードã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/be-secure-openssl.c:176 +#: libpq/be-secure-openssl.c:182 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "秘密éµãƒ•ァイル\"%s\"をロードã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/be-secure-openssl.c:185 +#: libpq/be-secure-openssl.c:191 #, c-format msgid "check of private key failed: %s" msgstr "秘密éµã®æ¤œæŸ»ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" #. translator: first %s is a GUC option name, second %s is its value -#: libpq/be-secure-openssl.c:198 libpq/be-secure-openssl.c:221 +#: libpq/be-secure-openssl.c:204 libpq/be-secure-openssl.c:227 #, c-format msgid "\"%s\" setting \"%s\" not supported by this build" -msgstr "ã“ã®ãƒ“ルドã§ã¯\"%s\"ã‚’\"%s\"ã«è¨­å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" +msgstr "ã“ã®ãƒ“ルドã§ã¯\"%s\"ã®\"%s\"ã¸ã®è¨­å®šã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: libpq/be-secure-openssl.c:208 +#: libpq/be-secure-openssl.c:214 #, c-format msgid "could not set minimum SSL protocol version" msgstr "最å°SSLプロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/be-secure-openssl.c:231 +#: libpq/be-secure-openssl.c:237 #, c-format msgid "could not set maximum SSL protocol version" msgstr "最大SSLプロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/be-secure-openssl.c:247 +#: libpq/be-secure-openssl.c:253 #, c-format msgid "could not set SSL protocol version range" msgstr "SSLプロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ç¯„囲を設定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/be-secure-openssl.c:248 +#: libpq/be-secure-openssl.c:254 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "\"%s\"ã¯\"%s\"より大ããã§ãã¾ã›ã‚“" -#: libpq/be-secure-openssl.c:285 +#: libpq/be-secure-openssl.c:307 #, c-format msgid "could not set the cipher list (no valid ciphers available)" msgstr "æš—å·æ–¹å¼ãƒªã‚¹ãƒˆãŒã‚»ãƒƒãƒˆã§ãã¾ã›ã‚“ (利用å¯èƒ½ãªæš—å·æ–¹å¼ãŒã‚りã¾ã›ã‚“)" -#: libpq/be-secure-openssl.c:305 +#: libpq/be-secure-openssl.c:327 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "ルート証明書ファイル\"%s\"をロードã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/be-secure-openssl.c:354 +#: libpq/be-secure-openssl.c:376 #, c-format msgid "could not load SSL certificate revocation list file \"%s\": %s" msgstr "SSL証明失効リストファイル\"%s\"をロードã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/be-secure-openssl.c:362 +#: libpq/be-secure-openssl.c:384 #, c-format msgid "could not load SSL certificate revocation list directory \"%s\": %s" msgstr "SSL証明失効リストディレクトリ\"%s\"をロードã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/be-secure-openssl.c:370 +#: libpq/be-secure-openssl.c:392 #, c-format msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" msgstr "SSL証明失効リストファイル\"%s\"ã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"をロードã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/be-secure-openssl.c:428 +#: libpq/be-secure-openssl.c:450 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "SSLæŽ¥ç¶šã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ: SSLã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆãŒæº–å‚™ã§ãã¦ã„ã¾ã›ã‚“" -#: libpq/be-secure-openssl.c:439 +#: libpq/be-secure-openssl.c:464 #, c-format msgid "could not initialize SSL connection: %s" msgstr "SSLæŽ¥ç¶šã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/be-secure-openssl.c:447 +#: libpq/be-secure-openssl.c:472 #, c-format msgid "could not set SSL socket: %s" msgstr "SSLソケットを設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/be-secure-openssl.c:502 +#: libpq/be-secure-openssl.c:528 #, c-format msgid "could not accept SSL connection: %m" msgstr "SSL接続をå—ã‘付ã‘られã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/be-secure-openssl.c:506 libpq/be-secure-openssl.c:561 +#: libpq/be-secure-openssl.c:532 libpq/be-secure-openssl.c:589 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "SSL接続をå—ã‘付ã‘られã¾ã›ã‚“ã§ã—ãŸ: EOFを検出ã—ã¾ã—ãŸ" -#: libpq/be-secure-openssl.c:545 +#: libpq/be-secure-openssl.c:573 #, c-format msgid "could not accept SSL connection: %s" msgstr "SSL接続をå—ã‘付ã‘られã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/be-secure-openssl.c:549 +#: libpq/be-secure-openssl.c:577 #, c-format msgid "This may indicate that the client does not support any SSL protocol version between %s and %s." msgstr "ã“ã®ã“ã¨ã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒSSLプロトコルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã‹ã‚‰%sã®ã„ãšã‚Œã‚‚サãƒãƒ¼ãƒˆã—ã¦ã„ãªã„ã“ã¨ã‚’示唆ã—ã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: libpq/be-secure-openssl.c:566 libpq/be-secure-openssl.c:746 libpq/be-secure-openssl.c:810 +#: libpq/be-secure-openssl.c:594 libpq/be-secure-openssl.c:809 libpq/be-secure-openssl.c:879 #, c-format msgid "unrecognized SSL error code: %d" msgstr "èªè­˜ã§ããªã„SSLエラーコード: %d" -#: libpq/be-secure-openssl.c:612 +#: libpq/be-secure-openssl.c:622 +#, c-format +msgid "received SSL connection request with unexpected ALPN protocol" +msgstr "想定外ã®ALPNプロトコルã«ã‚ˆã‚‹SSLæŽ¥ç¶šè¦æ±‚ã‚’å—ä¿¡ã—ã¾ã—ãŸ" + +#: libpq/be-secure-openssl.c:666 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "SSL 証明書ã®ã‚³ãƒ¢ãƒ³ãƒãƒ¼ãƒ ã« null ãŒå«ã¾ã‚Œã¦ã„ã¾ã™" -#: libpq/be-secure-openssl.c:652 +#: libpq/be-secure-openssl.c:712 #, c-format msgid "SSL certificate's distinguished name contains embedded null" msgstr "SSL証明書ã®è­˜åˆ¥åã®é€”中ã«nullãŒå«ã¾ã‚Œã¦ã„ã¾ã™" -#: libpq/be-secure-openssl.c:735 libpq/be-secure-openssl.c:794 +#: libpq/be-secure-openssl.c:798 libpq/be-secure-openssl.c:863 #, c-format msgid "SSL error: %s" msgstr "SSLエラー: %s" -#: libpq/be-secure-openssl.c:976 +#: libpq/be-secure-openssl.c:1038 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "DHパラメータファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/be-secure-openssl.c:988 +#: libpq/be-secure-openssl.c:1050 #, c-format msgid "could not load DH parameters file: %s" msgstr "DHパラメータをロードã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/be-secure-openssl.c:998 +#: libpq/be-secure-openssl.c:1060 #, c-format msgid "invalid DH parameters: %s" msgstr "䏿­£ãªDHパラメータã§ã™: %s" -#: libpq/be-secure-openssl.c:1007 +#: libpq/be-secure-openssl.c:1069 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "䏿­£ãªDHパラメータ: pã¯ç´ æ•°ã§ã¯ã‚りã¾ã›ã‚“" -#: libpq/be-secure-openssl.c:1016 +#: libpq/be-secure-openssl.c:1078 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "䏿­£ãªDHパラメータ: é©åˆ‡ãªç”Ÿæˆå™¨ã‚‚安全ãªç´ æ•°ã‚‚ã‚りã¾ã›ã‚“" -#: libpq/be-secure-openssl.c:1152 +#: libpq/be-secure-openssl.c:1214 #, c-format msgid "Client certificate verification failed at depth %d: %s." msgstr "ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆè¨¼æ˜Žæ›¸ã®æ¤œè¨¼ã«æ·±ã•%dã§å¤±æ•—ã—ã¾ã—ãŸ: %s。" -#: libpq/be-secure-openssl.c:1189 +#: libpq/be-secure-openssl.c:1251 #, c-format msgid "Failed certificate data (unverified): subject \"%s\", serial number %s, issuer \"%s\"." msgstr "失敗ã—ãŸè¨¼æ˜Žæ›¸ã®æƒ…å ±(未検証): サブジェクト \"%s\", ã‚·ãƒªã‚¢ãƒ«ç•ªå· %s, 発行者 \"%s\"。" -#: libpq/be-secure-openssl.c:1190 +#: libpq/be-secure-openssl.c:1252 msgid "unknown" msgstr "䏿˜Ž" -#: libpq/be-secure-openssl.c:1281 +#: libpq/be-secure-openssl.c:1389 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: DHパラメータをロードã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/be-secure-openssl.c:1289 +#: libpq/be-secure-openssl.c:1397 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: DHパラメータを設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/be-secure-openssl.c:1316 +#: libpq/be-secure-openssl.c:1424 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: èªè­˜ã§ããªã„曲線å: %s" -#: libpq/be-secure-openssl.c:1325 +#: libpq/be-secure-openssl.c:1433 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: キーを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/be-secure-openssl.c:1353 +#: libpq/be-secure-openssl.c:1461 msgid "no SSL error reported" msgstr "SSLエラーã¯ã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/be-secure-openssl.c:1357 +#: libpq/be-secure-openssl.c:1479 #, c-format msgid "SSL error code %lu" msgstr "SSLエラーコード: %lu" -#: libpq/be-secure-openssl.c:1516 +#: libpq/be-secure-openssl.c:1636 #, c-format msgid "could not create BIO" msgstr "BIOを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/be-secure-openssl.c:1526 +#: libpq/be-secure-openssl.c:1646 #, c-format msgid "could not get NID for ASN1_OBJECT object" msgstr "ASN1_OBJECTオブジェクトã®NIDã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/be-secure-openssl.c:1534 +#: libpq/be-secure-openssl.c:1654 #, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" msgstr "NID %dã‚’ASN1_OBJECT構造体ã¸å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq/be-secure.c:207 libpq/be-secure.c:303 -#, c-format -msgid "terminating connection due to unexpected postmaster exit" -msgstr "予期ã—ãªã„postmasterã®çµ‚了ã®ãŸã‚ã€ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’終了ã—ã¾ã™" - -#: libpq/crypt.c:49 +#: libpq/crypt.c:48 #, c-format msgid "Role \"%s\" does not exist." msgstr "ロール\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“。" -#: libpq/crypt.c:59 +#: libpq/crypt.c:58 #, c-format msgid "User \"%s\" has no password assigned." msgstr "ユーザー\"%s\"ã¯ãƒ‘スワードãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“。" -#: libpq/crypt.c:77 +#: libpq/crypt.c:76 #, c-format msgid "User \"%s\" has an expired password." msgstr "ユーザー\"%s\"ã®ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã¯æœŸé™åˆ‡ã‚Œã§ã™ã€‚" -#: libpq/crypt.c:183 +#: libpq/crypt.c:182 #, c-format msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "ユーザー\"%s\"ã®ãƒ‘スワードã¯MD5èªè¨¼ã§ä½¿ç”¨ä¸èƒ½ã§ã™ã€‚" -#: libpq/crypt.c:204 libpq/crypt.c:246 libpq/crypt.c:266 +#: libpq/crypt.c:203 libpq/crypt.c:245 libpq/crypt.c:265 #, c-format msgid "Password does not match for user \"%s\"." msgstr "ユーザー\"%s\"ã®ãƒ‘スワードãŒåˆè‡´ã—ã¾ã›ã‚“。" -#: libpq/crypt.c:285 +#: libpq/crypt.c:284 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "ユーザー\"%s\"ã®ãƒ‘スワードã¯è­˜åˆ¥ä¸èƒ½ãªå½¢å¼ã§ã™ã€‚" -#: libpq/hba.c:234 -#, c-format -msgid "authentication file token too long, skipping: \"%s\"" -msgstr "èªè¨¼ãƒ•ァイルã®ãƒˆãƒ¼ã‚¯ãƒ³ãŒé•·ã™ãŽã¾ã™ã®ã§ã€é£›ã°ã—ã¾ã™: \"%s\"" - -#: libpq/hba.c:357 +#: libpq/hba.c:327 #, c-format msgid "invalid regular expression \"%s\": %s" msgstr "䏿­£ãªæ­£è¦è¡¨ç¾\"%s\": %s" -#: libpq/hba.c:359 libpq/hba.c:688 libpq/hba.c:1272 libpq/hba.c:1292 libpq/hba.c:1315 libpq/hba.c:1328 libpq/hba.c:1381 libpq/hba.c:1409 libpq/hba.c:1417 libpq/hba.c:1429 libpq/hba.c:1450 libpq/hba.c:1463 libpq/hba.c:1488 libpq/hba.c:1515 libpq/hba.c:1527 libpq/hba.c:1586 libpq/hba.c:1606 libpq/hba.c:1620 libpq/hba.c:1640 libpq/hba.c:1651 libpq/hba.c:1666 libpq/hba.c:1685 libpq/hba.c:1701 libpq/hba.c:1713 libpq/hba.c:1750 libpq/hba.c:1791 libpq/hba.c:1804 -#: libpq/hba.c:1826 libpq/hba.c:1838 libpq/hba.c:1856 libpq/hba.c:1906 libpq/hba.c:1950 libpq/hba.c:1961 libpq/hba.c:1977 libpq/hba.c:1994 libpq/hba.c:2005 libpq/hba.c:2024 libpq/hba.c:2040 libpq/hba.c:2056 libpq/hba.c:2115 libpq/hba.c:2132 libpq/hba.c:2145 libpq/hba.c:2157 libpq/hba.c:2176 libpq/hba.c:2262 libpq/hba.c:2280 libpq/hba.c:2374 libpq/hba.c:2393 libpq/hba.c:2422 libpq/hba.c:2435 libpq/hba.c:2458 libpq/hba.c:2480 libpq/hba.c:2494 -#: tsearch/ts_locale.c:243 +#: libpq/hba.c:329 libpq/hba.c:661 libpq/hba.c:1245 libpq/hba.c:1265 libpq/hba.c:1288 libpq/hba.c:1301 libpq/hba.c:1354 libpq/hba.c:1382 libpq/hba.c:1390 libpq/hba.c:1402 libpq/hba.c:1423 libpq/hba.c:1436 libpq/hba.c:1461 libpq/hba.c:1488 libpq/hba.c:1500 libpq/hba.c:1559 libpq/hba.c:1579 libpq/hba.c:1593 libpq/hba.c:1613 libpq/hba.c:1624 libpq/hba.c:1639 libpq/hba.c:1658 libpq/hba.c:1674 libpq/hba.c:1686 libpq/hba.c:1752 libpq/hba.c:1765 libpq/hba.c:1787 +#: libpq/hba.c:1799 libpq/hba.c:1817 libpq/hba.c:1867 libpq/hba.c:1911 libpq/hba.c:1922 libpq/hba.c:1938 libpq/hba.c:1955 libpq/hba.c:1966 libpq/hba.c:1985 libpq/hba.c:2001 libpq/hba.c:2017 libpq/hba.c:2076 libpq/hba.c:2093 libpq/hba.c:2106 libpq/hba.c:2118 libpq/hba.c:2137 libpq/hba.c:2223 libpq/hba.c:2241 libpq/hba.c:2335 libpq/hba.c:2354 libpq/hba.c:2383 libpq/hba.c:2396 libpq/hba.c:2419 libpq/hba.c:2441 libpq/hba.c:2455 tsearch/ts_locale.c:241 #, c-format msgid "line %d of configuration file \"%s\"" msgstr "設定ファイル \"%2$s\" ã® %1$d 行目" -#: libpq/hba.c:484 +#: libpq/hba.c:457 #, c-format msgid "skipping missing authentication file \"%s\"" msgstr "存在ã—ãªã„èªè¨¼è¨­å®šãƒ•ァイル\"%s\"をスキップã—ã¾ã™" -#: libpq/hba.c:636 +#: libpq/hba.c:609 #, c-format msgid "could not open file \"%s\": maximum nesting depth exceeded" msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: 入れå­ã®æ·±ã•ãŒä¸Šé™ã‚’è¶…ãˆã¦ã„ã¾ã™" -#: libpq/hba.c:1243 +#: libpq/hba.c:1216 #, c-format msgid "error enumerating network interfaces: %m" msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェース列挙中ã®ã‚¨ãƒ©ãƒ¼: %m" #. translator: the second %s is a list of auth methods -#: libpq/hba.c:1270 +#: libpq/hba.c:1243 #, c-format msgid "authentication option \"%s\" is only valid for authentication methods %s" msgstr "èªè¨¼ã‚ªãƒ—ション\"%s\"ã¯èªè¨¼æ–¹å¼%sã§ã®ã¿æœ‰åйã§ã™" -#: libpq/hba.c:1290 +#: libpq/hba.c:1263 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "èªè¨¼æ–¹å¼\"%s\"ã®å ´åˆã¯å¼•æ•°\"%s\"ãŒã‚»ãƒƒãƒˆã•れãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: libpq/hba.c:1314 +#: libpq/hba.c:1287 #, c-format msgid "missing entry at end of line" msgstr "行末ã®è¦ç´ ãŒè¶³ã‚Šã¾ã›ã‚“" -#: libpq/hba.c:1327 +#: libpq/hba.c:1300 #, c-format msgid "multiple values in ident field" msgstr "identヂールド内ã®è¤‡æ•°ã®å€¤" -#: libpq/hba.c:1379 +#: libpq/hba.c:1352 #, c-format msgid "multiple values specified for connection type" msgstr "接続タイプã§è¤‡æ•°ã®å€¤ãŒæŒ‡å®šã•れã¾ã—ãŸ" -#: libpq/hba.c:1380 +#: libpq/hba.c:1353 #, c-format msgid "Specify exactly one connection type per line." msgstr "1行ã«1ã¤ã®æŽ¥ç¶šã‚¿ã‚¤ãƒ—ã ã‘を指定ã—ã¦ãã ã•ã„" -#: libpq/hba.c:1407 +#: libpq/hba.c:1380 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "SSLãŒç„¡åйãªãŸã‚ã€hostssl行ã¯ç…§åˆã§ãã¾ã›ã‚“" -#: libpq/hba.c:1408 +#: libpq/hba.c:1381 #, c-format -msgid "Set ssl = on in postgresql.conf." -msgstr "postgresql.confã§ ssl = on ã«è¨­å®šã—ã¦ãã ã•ã„。" +msgid "Set \"ssl = on\" in postgresql.conf." +msgstr "postgresql.confã§\"ssl = on\"ã«è¨­å®šã—ã¦ãã ã•ã„。" -#: libpq/hba.c:1416 +#: libpq/hba.c:1389 #, c-format msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "ã“ã®ãƒ“ルドã§ã¯hostsslã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ãªã„ãŸã‚ã€hostssl行ã¯ç…§åˆã§ãã¾ã›ã‚“" -#: libpq/hba.c:1428 +#: libpq/hba.c:1401 #, c-format msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" msgstr "ã“ã®ãƒ“ルドã§ã¯ GSSAPI をサãƒãƒ¼ãƒˆã—ã¦ã„ãªã„ãŸã‚ hostgssenc レコードã¯ç…§åˆã§ãã¾ã›ã‚“" -#: libpq/hba.c:1448 +#: libpq/hba.c:1421 #, c-format msgid "invalid connection type \"%s\"" msgstr "接続オプションタイプ \"%s\" ã¯ä¸æ­£ã§ã™" -#: libpq/hba.c:1462 +#: libpq/hba.c:1435 #, c-format msgid "end-of-line before database specification" msgstr "データベース指定ã®å‰ã«è¡Œæœ«ã‚’検出ã—ã¾ã—ãŸ" -#: libpq/hba.c:1487 +#: libpq/hba.c:1460 #, c-format msgid "end-of-line before role specification" msgstr "ロール指定ã®å‰ã«è¡Œæœ«ã‚’検出ã—ã¾ã—ãŸ" -#: libpq/hba.c:1514 +#: libpq/hba.c:1487 #, c-format msgid "end-of-line before IP address specification" msgstr "IP アドレス指定ã®å‰ã«è¡Œæœ«ã‚’検出ã—ã¾ã—ãŸ" -#: libpq/hba.c:1525 +#: libpq/hba.c:1498 #, c-format msgid "multiple values specified for host address" msgstr "ホストアドレスã§è¤‡æ•°ã®å€¤ãŒæŒ‡å®šã•れã¾ã—ãŸ" -#: libpq/hba.c:1526 +#: libpq/hba.c:1499 #, c-format msgid "Specify one address range per line." msgstr "1行ã«1ã¤ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ç¯„囲を指定ã—ã¦ãã ã•ã„" -#: libpq/hba.c:1584 +#: libpq/hba.c:1557 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "䏿­£ãªIPアドレス\"%s\": %s" -#: libpq/hba.c:1604 +#: libpq/hba.c:1577 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "ホストåã¨CIDRマスクを両方指定ã™ã‚‹ã®ã¯ä¸æ­£ã§ã™: \"%s\"" -#: libpq/hba.c:1618 +#: libpq/hba.c:1591 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "IPアドレス\"%s\"内㮠CIDR マスクãŒä¸æ­£ã§ã™" -#: libpq/hba.c:1638 +#: libpq/hba.c:1611 #, c-format msgid "end-of-line before netmask specification" msgstr "ãƒãƒƒãƒˆãƒžã‚¹ã‚¯æŒ‡å®šã®å‰ã«è¡Œæœ«ã‚’検出ã—ã¾ã—ãŸ" -#: libpq/hba.c:1639 +#: libpq/hba.c:1612 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "CIDR記法ã§ã‚¢ãƒ‰ãƒ¬ã‚¹ç¯„囲を指定ã—ã¦ã™ã‚‹ã‹ã€ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ã‚’分ã‘ã¦æŒ‡å®šã—ã¦ãã ã•ã„。" -#: libpq/hba.c:1650 +#: libpq/hba.c:1623 #, c-format msgid "multiple values specified for netmask" msgstr "ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ã§è¤‡æ•°ã®å€¤ãŒæŒ‡å®šã•れã¾ã—ãŸ" -#: libpq/hba.c:1664 +#: libpq/hba.c:1637 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "䏿­£ãªIPマスク\"%s\": %s" -#: libpq/hba.c:1684 +#: libpq/hba.c:1657 #, c-format msgid "IP address and mask do not match" msgstr "IPアドレスã¨ãƒžã‚¹ã‚¯ãŒä¸€è‡´ã—ã¾ã›ã‚“" -#: libpq/hba.c:1700 +#: libpq/hba.c:1673 #, c-format msgid "end-of-line before authentication method" msgstr "èªè¨¼æ–¹å¼æŒ‡å®šã®å‰ã«è¡Œæœ«ã‚’検出ã—ã¾ã—ãŸ" -#: libpq/hba.c:1711 +#: libpq/hba.c:1684 #, c-format msgid "multiple values specified for authentication type" msgstr "èªè¨¼ã‚¿ã‚¤ãƒ—ã§è¤‡æ•°ã®å€¤ãŒæŒ‡å®šã•れã¾ã—ãŸ" -#: libpq/hba.c:1712 +#: libpq/hba.c:1685 #, c-format msgid "Specify exactly one authentication type per line." msgstr "èªè¨¼ã‚¿ã‚¤ãƒ—ã¯1行ã«1ã¤ã ã‘指定ã—ã¦ãã ã•ã„。" -#: libpq/hba.c:1789 +#: libpq/hba.c:1750 #, c-format msgid "invalid authentication method \"%s\"" msgstr "䏿­£ãªèªè¨¼æ–¹å¼\"%s\"" -#: libpq/hba.c:1802 +#: libpq/hba.c:1763 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "䏿­£ãªèªè¨¼æ–¹å¼\"%s\": ã“ã®ãƒ“ルドã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: libpq/hba.c:1825 +#: libpq/hba.c:1786 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "ローカルソケットã§ã¯gssapièªè¨¼ã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: libpq/hba.c:1837 +#: libpq/hba.c:1798 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "peerèªè¨¼ã¯ãƒ­ãƒ¼ã‚«ãƒ«ã‚½ã‚±ãƒƒãƒˆã§ã®ã¿ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™" -#: libpq/hba.c:1855 +#: libpq/hba.c:1816 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "hostssl接続ã§ã¯è¨¼æ˜Žæ›¸èªè¨¼ã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™" -#: libpq/hba.c:1905 +#: libpq/hba.c:1866 #, c-format msgid "authentication option not in name=value format: %s" msgstr "èªè¨¼ã‚ªãƒ—ション㌠åå‰=値 å½¢å¼ã«ãªã£ã¦ã„ã¾ã›ã‚“: %s" -#: libpq/hba.c:1949 +#: libpq/hba.c:1910 #, c-format msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" msgstr "ldapbasedn〠ldapbinddnã€ldapbindpasswdã€ldapsearchattributeã€, ldapsearchfilter ã¾ãŸã¯ldapurlã¯ã€ldapprefixã¨åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: libpq/hba.c:1960 +#: libpq/hba.c:1921 #, c-format msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" msgstr "\"ldap\"èªè¨¼æ–¹å¼ã®å ´åˆã¯å¼•æ•° \"ldapbasedn\"ã€\"ldapprefix\"ã€\"ldapsuffix\"ã®ã„ãšã‚Œã‹ã‚’指定ã—ã¦ãã ã•ã„" -#: libpq/hba.c:1976 +#: libpq/hba.c:1937 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "ldapsearchattributeã€ldapsearchfilter ã¨åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: libpq/hba.c:1993 +#: libpq/hba.c:1954 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "RADIUSサーãƒãƒ¼ã®ãƒªã‚¹ãƒˆã¯ç©ºã«ã¯ã§ãã¾ã›ã‚“" -#: libpq/hba.c:2004 +#: libpq/hba.c:1965 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "RADIUSシークレットã®ãƒªã‚¹ãƒˆã¯ç©ºã«ã¯ã§ãã¾ã›ã‚“" -#: libpq/hba.c:2021 +#: libpq/hba.c:1982 #, c-format msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "RADIUSã‚·ãƒ¼ã‚¯ãƒ¬ãƒƒãƒˆã®æ•°(%d)ã¯1ã¾ãŸã¯RADIUSサーãƒãƒ¼ã®æ•°(%d)ã¨åŒã˜ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: libpq/hba.c:2037 +#: libpq/hba.c:1998 #, c-format msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "RADIUSãƒãƒ¼ãƒˆã®æ•°(%d)ã¯1ã¾ãŸã¯RADIUSサーãƒãƒ¼ã®æ•°(%d)ã¨åŒã˜ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: libpq/hba.c:2053 +#: libpq/hba.c:2014 #, c-format msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "RADIUS識別å­ã®æ•°(%d)ã¯1ã¾ãŸã¯RADIUSサーãƒãƒ¼ã®æ•°(%d)ã¨åŒã˜ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" # -#: libpq/hba.c:2105 +#: libpq/hba.c:2066 msgid "ident, peer, gssapi, sspi, and cert" msgstr "identã€peerã€gssapiã€sspiãŠã‚ˆã³cert" -#: libpq/hba.c:2114 +#: libpq/hba.c:2075 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "クライアント証明書ã¯\"hostssl\"ã®è¡Œã§ã®ã¿è¨­å®šã§ãã¾ã™" -#: libpq/hba.c:2131 +#: libpq/hba.c:2092 #, c-format msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "\"cert\"èªè¨¼ä½¿ç”¨æ™‚ã¯clientcertã¯\"verify-full\"ã«ã—ã‹è¨­å®šã§ãã¾ã›ã‚“" -#: libpq/hba.c:2144 +#: libpq/hba.c:2105 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "clientcertã®å€¤ãŒä¸æ­£ã§ã™: \"%s\"" -#: libpq/hba.c:2156 +#: libpq/hba.c:2117 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "クライアントåã¯\"hostssl\"ã®è¡Œã§ã®ã¿è¨­å®šã§ãã¾ã™" -#: libpq/hba.c:2175 +#: libpq/hba.c:2136 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "clientnameã®å€¤ãŒä¸æ­£ã§ã™: \"%s\"" -#: libpq/hba.c:2208 +#: libpq/hba.c:2169 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "LDAP URL\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/hba.c:2219 +#: libpq/hba.c:2180 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "éžã‚µãƒãƒ¼ãƒˆã®LDAP URLコード: %s" -#: libpq/hba.c:2243 +#: libpq/hba.c:2204 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "ã“ã®ãƒ—ラットフォームã§ã¯LDAP URLをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。" -#: libpq/hba.c:2261 +#: libpq/hba.c:2222 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "䏿­£ãª ldapscheme ã®å€¤: \"%s\"" -#: libpq/hba.c:2279 +#: libpq/hba.c:2240 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "䏿­£ãªLDAPãƒãƒ¼ãƒˆç•ªå·ã§ã™: \"%s\"" # -#: libpq/hba.c:2325 libpq/hba.c:2332 +#: libpq/hba.c:2286 libpq/hba.c:2293 msgid "gssapi and sspi" msgstr "gssapiãŠã‚ˆã³sspi" -#: libpq/hba.c:2341 libpq/hba.c:2350 +#: libpq/hba.c:2302 libpq/hba.c:2311 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:2372 +#: libpq/hba.c:2333 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "RADIUSサーãƒãƒ¼ã®ãƒªã‚¹ãƒˆ\"%s\"ã®ãƒ‘ースã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/hba.c:2420 +#: libpq/hba.c:2381 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "RADIUSãƒãƒ¼ãƒˆã®ãƒªã‚¹ãƒˆ\"%s\"ã®ãƒ‘ースã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/hba.c:2434 +#: libpq/hba.c:2395 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "䏿­£ãªRADIUSãƒãƒ¼ãƒˆç•ªå·: \"%s\"" -#: libpq/hba.c:2456 +#: libpq/hba.c:2417 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "RADIUSシークレットã®ãƒªã‚¹ãƒˆ\"%s\"ã®ãƒ‘ースã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/hba.c:2478 +#: libpq/hba.c:2439 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "RADIUS識別å­ã®ãƒªã‚¹ãƒˆ\"%s\"ã®ãƒ‘ースã«å¤±æ•—ã—ã¾ã—ãŸ" -#: libpq/hba.c:2492 +#: libpq/hba.c:2453 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "èªè¨¼ã‚ªãƒ—ションåã‚’èªè­˜ã§ãã¾ã›ã‚“: \"%s\"" -#: libpq/hba.c:2684 +#: libpq/hba.c:2645 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "設定ファイル\"%s\"ã«ã¯ä½•ã‚‚å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“" -#: libpq/hba.c:2838 +#: libpq/hba.c:2798 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "æ­£è¦è¡¨ç¾\"%s\"ã§ç…§åˆã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: libpq/hba.c:2862 +#: libpq/hba.c:2822 #, c-format msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" msgstr "æ­£è¦è¡¨ç¾\"%s\"ã«ã¯\"%s\"ã«ãŠã‘る後方å‚ç…§ãŒè¦æ±‚ã™ã‚‹å‰¯è¡¨ç¾ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“" -#: libpq/hba.c:2965 +#: libpq/hba.c:2925 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "与ãˆã‚‰ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ãƒ¼å (%s) ã¨èªè¨¼ã•れãŸãƒ¦ãƒ¼ã‚¶ãƒ¼å (%s) ãŒä¸€è‡´ã—ã¾ã›ã‚“" -#: libpq/hba.c:2985 +#: libpq/hba.c:2945 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "\"%3$s\"ã¨ã—ã¦èªè¨¼ã•れãŸãƒ¦ãƒ¼ã‚¶ãƒ¼\"%2$s\"ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒžãƒƒãƒ—\"%1$s\"ã«ä¸€è‡´ã—ã¾ã›ã‚“" -#: libpq/pqcomm.c:200 +#: libpq/pqcomm.c:211 libpq/pqcomm.c:219 libpq/pqcomm.c:250 libpq/pqcomm.c:259 libpq/pqcomm.c:1648 libpq/pqcomm.c:1693 libpq/pqcomm.c:1733 libpq/pqcomm.c:1777 libpq/pqcomm.c:1816 libpq/pqcomm.c:1855 libpq/pqcomm.c:1891 libpq/pqcomm.c:1930 +#, c-format +msgid "%s(%s) failed: %m" +msgstr "%s(%s)ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" + +#: libpq/pqcomm.c:296 #, c-format msgid "could not set socket to nonblocking mode: %m" msgstr "ソケットをéžãƒ–ロッキングモードã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/pqcomm.c:361 +#: libpq/pqcomm.c:456 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "Unixドメインソケットã®ãƒ‘ス\"%s\"ãŒé•·ã™ãŽã¾ã™(最大 %d ãƒã‚¤ãƒˆ)" -#: libpq/pqcomm.c:381 +#: libpq/pqcomm.c:476 #, c-format msgid "could not translate host name \"%s\", service \"%s\" to address: %s" msgstr "ホストå\"%s\"ã€ã‚µãƒ¼ãƒ“ス\"%s\"をアドレスã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/pqcomm.c:385 +#: libpq/pqcomm.c:480 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "サービス\"%s\"をアドレスã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq/pqcomm.c:412 +#: libpq/pqcomm.c:502 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "è¦æ±‚ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’å…¨ã¦ãƒã‚¤ãƒ³ãƒ‰ã§ãã¾ã›ã‚“ã§ã—ãŸ: MAXLISTEN (%d)ã‚’è¶…ãˆã¦ã„ã¾ã™" -#: libpq/pqcomm.c:421 +#: libpq/pqcomm.c:511 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:424 +#: libpq/pqcomm.c:514 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:427 +#: libpq/pqcomm.c:517 msgid "Unix" msgstr "Unix" -#: libpq/pqcomm.c:431 +#: libpq/pqcomm.c:521 #, c-format msgid "unrecognized address family %d" msgstr "アドレスファミリ %d ã‚’èªè­˜ã§ãã¾ã›ã‚“" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:455 +#: libpq/pqcomm.c:545 #, c-format msgid "could not create %s socket for address \"%s\": %m" msgstr "アドレス\"%s\"ã«å¯¾ã™ã‚‹%sソケットã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ: %m" #. translator: third %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:481 libpq/pqcomm.c:499 +#: libpq/pqcomm.c:574 libpq/pqcomm.c:592 #, c-format msgid "%s(%s) failed for %s address \"%s\": %m" msgstr "%3$sアドレス%4$sã«å¯¾ã™ã‚‹%1$s(%2$s)ãŒå¤±æ•—ã—ã¾ã—ãŸ: %5$m" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:522 +#: libpq/pqcomm.c:615 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "%sアドレス\"%s\"ã®bindã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: libpq/pqcomm.c:526 +#: libpq/pqcomm.c:619 #, c-format msgid "Is another postmaster already running on port %d?" msgstr "ã™ã§ã«ä»–ã®postmasterãŒãƒãƒ¼ãƒˆ%dã§ç¨¼å‹•ã—ã¦ã„ã¾ã›ã‚“ã‹?" -#: libpq/pqcomm.c:528 +#: libpq/pqcomm.c:621 #, c-format msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." msgstr "ã™ã§ã«ä»–ã«postmasterãŒãƒãƒ¼ãƒˆ%dã§ç¨¼å‹•ã—ã¦ã„ã¾ã›ã‚“ã‹? 稼動ã—ã¦ã„ãªã‘ã‚Œã°æ•°ç§’å¾…ã£ã¦ã‹ã‚‰å†è©¦è¡Œã—ã¦ãã ã•ã„。" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:557 +#: libpq/pqcomm.c:650 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "%sアドレス\"%s\"ã®listenã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: libpq/pqcomm.c:565 +#: libpq/pqcomm.c:658 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "Unixソケット\"%s\"ã§å¾…ã¡å—ã‘ã¦ã„ã¾ã™" #. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:570 +#: libpq/pqcomm.c:663 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "%sアドレス\"%s\"ã€ãƒãƒ¼ãƒˆ%dã§å¾…ã¡å—ã‘ã¦ã„ã¾ã™" -#: libpq/pqcomm.c:659 +#: libpq/pqcomm.c:753 #, c-format msgid "group \"%s\" does not exist" msgstr "グループ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: libpq/pqcomm.c:669 +#: libpq/pqcomm.c:763 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "ファイル\"%s\"ã®ã‚°ãƒ«ãƒ¼ãƒ—を設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/pqcomm.c:680 +#: libpq/pqcomm.c:774 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "ファイル\"%s\"ã®æ¨©é™ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/pqcomm.c:708 +#: libpq/pqcomm.c:803 #, c-format msgid "could not accept new connection: %m" msgstr "æ–°ã—ã„æŽ¥ç¶šã‚’å—ã‘付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/pqcomm.c:748 libpq/pqcomm.c:757 libpq/pqcomm.c:789 libpq/pqcomm.c:799 libpq/pqcomm.c:1624 libpq/pqcomm.c:1669 libpq/pqcomm.c:1709 libpq/pqcomm.c:1753 libpq/pqcomm.c:1792 libpq/pqcomm.c:1831 libpq/pqcomm.c:1867 libpq/pqcomm.c:1906 -#, c-format -msgid "%s(%s) failed: %m" -msgstr "%s(%s)ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" - -#: libpq/pqcomm.c:903 +#: libpq/pqcomm.c:885 #, c-format msgid "there is no client connection" msgstr "クライアント接続ãŒã‚りã¾ã›ã‚“" -#: libpq/pqcomm.c:954 libpq/pqcomm.c:1050 +#: libpq/pqcomm.c:941 libpq/pqcomm.c:1042 #, c-format msgid "could not receive data from client: %m" msgstr "クライアントã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/pqcomm.c:1155 tcop/postgres.c:4403 +#: libpq/pqcomm.c:1149 tcop/postgres.c:4533 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "プロトコルã®åŒæœŸãŒå¤±ã‚れãŸãŸã‚コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’終了ã—ã¾ã™" -#: libpq/pqcomm.c:1221 +#: libpq/pqcomm.c:1215 #, c-format msgid "unexpected EOF within message length word" msgstr "メッセージ長ワード内ã®EOFã¯æƒ³å®šå¤–ã§ã™" -#: libpq/pqcomm.c:1231 +#: libpq/pqcomm.c:1225 #, c-format msgid "invalid message length" msgstr "メッセージ長ãŒä¸æ­£ã§ã™" -#: libpq/pqcomm.c:1253 libpq/pqcomm.c:1266 +#: libpq/pqcomm.c:1247 libpq/pqcomm.c:1260 #, c-format msgid "incomplete message from client" msgstr "クライアントã‹ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä¸å®Œå…¨ã§ã™" -#: libpq/pqcomm.c:1377 +#: libpq/pqcomm.c:1401 #, c-format msgid "could not send data to client: %m" msgstr "クライアントã«ãƒ‡ãƒ¼ã‚¿ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: libpq/pqcomm.c:1592 +#: libpq/pqcomm.c:1616 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s)ãŒå¤±æ•—ã—ã¾ã—ãŸ: エラーコード %d" -#: libpq/pqcomm.c:1681 +#: libpq/pqcomm.c:1705 #, c-format msgid "setting the keepalive idle time is not supported" msgstr "キープアライブã®ã‚¢ã‚¤ãƒ‰ãƒ«æ™‚é–“ã®è¨­å®šã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: libpq/pqcomm.c:1765 libpq/pqcomm.c:1840 libpq/pqcomm.c:1915 +#: libpq/pqcomm.c:1789 libpq/pqcomm.c:1864 libpq/pqcomm.c:1939 #, c-format msgid "%s(%s) not supported" msgstr "%s(%s)ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: libpq/pqformat.c:407 +#: libpq/pqformat.c:404 #, c-format msgid "no data left in message" msgstr "メッセージ内ã«ãƒ‡ãƒ¼ã‚¿ãŒæ®‹ã£ã¦ã„ã¾ã›ã‚“" -#: libpq/pqformat.c:518 libpq/pqformat.c:536 libpq/pqformat.c:557 utils/adt/array_userfuncs.c:799 utils/adt/arrayfuncs.c:1506 utils/adt/rowtypes.c:615 +#: libpq/pqformat.c:515 libpq/pqformat.c:533 libpq/pqformat.c:554 utils/adt/array_userfuncs.c:797 utils/adt/arrayfuncs.c:1481 utils/adt/rowtypes.c:613 #, c-format msgid "insufficient data left in message" msgstr "ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸å†…ã«æ®‹ã‚‹ãƒ‡ãƒ¼ã‚¿ãŒä¸å分ã§ã™" -#: libpq/pqformat.c:598 libpq/pqformat.c:627 +#: libpq/pqformat.c:595 libpq/pqformat.c:624 #, c-format msgid "invalid string in message" msgstr "ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸å†…ã®æ–‡å­—列ãŒä¸æ­£ã§ã™" -#: libpq/pqformat.c:643 +#: libpq/pqformat.c:640 #, c-format msgid "invalid message format" msgstr "ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æ›¸å¼ãŒä¸æ­£ã§ã™" -#: main/main.c:235 +#: main/main.c:236 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: WSAStartupãŒå¤±æ•—ã—ã¾ã—ãŸ: %d\n" -#: main/main.c:329 +#: main/main.c:324 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -15463,7 +15928,7 @@ msgstr "" "%sã¯PostgreSQLサーãƒãƒ¼ã§ã™\n" "\n" -#: main/main.c:330 +#: main/main.c:325 #, c-format msgid "" "Usage:\n" @@ -15474,107 +15939,107 @@ msgstr "" " %s [オプション]...\n" "\n" -#: main/main.c:331 +#: main/main.c:326 #, c-format msgid "Options:\n" msgstr "オプション:\n" -#: main/main.c:332 +#: main/main.c:327 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS 共有ãƒãƒƒãƒ•ã‚¡ã®æ•°\n" -#: main/main.c:333 +#: main/main.c:328 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NAME=VALUE 実行時パラメータã®è¨­å®š\n" -#: main/main.c:334 +#: main/main.c:329 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C NAME 実行時パラメータã®å€¤ã‚’表示ã—ã€çµ‚了\n" -#: main/main.c:335 +#: main/main.c:330 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 デãƒãƒƒã‚°ãƒ¬ãƒ™ãƒ«\n" -#: main/main.c:336 +#: main/main.c:331 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D DATADIR データベースディレクトリ\n" -#: main/main.c:337 +#: main/main.c:332 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e ヨーロッパå¼ã®æ—¥ä»˜ãƒ•ォーマットã§ã®å…¥åŠ›(DMY)\n" -#: main/main.c:338 +#: main/main.c:333 #, c-format msgid " -F turn fsync off\n" msgstr " -F fsyncを無効ã«ã™ã‚‹\n" -#: main/main.c:339 +#: main/main.c:334 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h HOSTNAME 接続を待ã¡å—ã‘るホストåã¾ãŸã¯IPアドレス\n" -#: main/main.c:340 +#: main/main.c:335 #, c-format msgid " -i enable TCP/IP connections (deprecated)\n" msgstr " -i TCP/IP接続を有効ã«ã™ã‚‹ (éžæŽ¨å¥¨)\n" -#: main/main.c:341 +#: main/main.c:336 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k DIRECTORY Unixドメインソケットã®å ´æ‰€\n" -#: main/main.c:343 +#: main/main.c:338 #, c-format msgid " -l enable SSL connections\n" msgstr " -l SSL接続を有効ã«ã™ã‚‹\n" -#: main/main.c:345 +#: main/main.c:340 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N MAX-CONNECT 許容ã™ã‚‹æœ€å¤§æŽ¥ç¶šæ•°\n" -#: main/main.c:346 +#: main/main.c:341 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT 接続を待ã¡å—ã‘ã‚‹ãƒãƒ¼ãƒˆç•ªå·\n" -#: main/main.c:347 +#: main/main.c:342 #, c-format msgid " -s show statistics after each query\n" msgstr " -s å„å•ã„åˆã‚ã›ã®å¾Œã«çµ±è¨ˆæƒ…報を表示\n" -#: main/main.c:348 +#: main/main.c:343 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S WORK-MEM ソート用ã®ãƒ¡ãƒ¢ãƒªé‡ (KBå˜ä½)\n" -#: main/main.c:349 +#: main/main.c:344 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã€çµ‚了\n" -#: main/main.c:350 +#: main/main.c:345 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAME=VALUE 実行時パラメータを設定\n" -#: main/main.c:351 +#: main/main.c:346 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config 設定パラメータã®èª¬æ˜Žã‚’出力ã—ã€çµ‚了\n" -#: main/main.c:352 +#: main/main.c:347 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã€çµ‚了\n" -#: main/main.c:354 +#: main/main.c:349 #, c-format msgid "" "\n" @@ -15583,39 +16048,39 @@ msgstr "" "\n" "開発者å‘ã‘オプション:\n" -#: main/main.c:355 +#: main/main.c:350 #, c-format msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" msgstr " -f s|i|o|b|t|n|m|h ã„ãã¤ã‹ã®ãƒ—ãƒ©ãƒ³ã‚¿ã‚¤ãƒ—ã‚’ç¦æ­¢\n" -#: main/main.c:356 +#: main/main.c:351 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O システムテーブル構造ã®å¤‰æ›´ã‚’許å¯\n" -#: main/main.c:357 +#: main/main.c:352 #, c-format msgid " -P disable system indexes\n" msgstr " -P システムインデックスを無効ã«ã™ã‚‹\n" -#: main/main.c:358 +#: main/main.c:353 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex å„å•ã„åˆã‚ã›ã®å¾Œã«æ™‚間情報を表示\n" -#: main/main.c:359 +#: main/main.c:354 #, c-format msgid " -T send SIGABRT to all backend processes if one dies\n" msgstr "" " -T ã²ã¨ã¤ã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ—ロセスãŒç•°å¸¸åœæ­¢ã—ãŸæ™‚ã«å…¨ã¦ã®\n" " ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ—ロセスã«SIGABRTã‚’é€ä¿¡\n" -#: main/main.c:360 +#: main/main.c:355 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr " -W NUM デãƒãƒƒã‚¬ã‚’アタッãƒã§ãるよã†ã«NUM秒待機\n" -#: main/main.c:362 +#: main/main.c:357 #, c-format msgid "" "\n" @@ -15624,39 +16089,39 @@ msgstr "" "\n" "シングルユーザーモード用ã®ã‚ªãƒ—ション:\n" -#: main/main.c:363 +#: main/main.c:358 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr "" " --single ã‚·ãƒ³ã‚°ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ¢ãƒ¼ãƒ‰ã‚’é¸æŠž(最åˆã®å¼•æ•°ã§ãªã‘れã°\n" " ãªã‚Šã¾ã›ã‚“)\n" -#: main/main.c:364 +#: main/main.c:359 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME データベースå (デフォルトã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼å)\n" -#: main/main.c:365 +#: main/main.c:360 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 デãƒãƒƒã‚°ãƒ¬ãƒ™ãƒ«ã‚’上書ã\n" -#: main/main.c:366 +#: main/main.c:361 #, c-format msgid " -E echo statement before execution\n" msgstr " -E 実行å‰ã«æ–‡ã‚’表示\n" -#: main/main.c:367 +#: main/main.c:362 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr " -j 対話å¼å•ã„åˆã‚ã›ã®åŒºåˆ‡ã‚Šã¨ã—ã¦æ”¹è¡Œã‚’使用ã—ãªã„\n" -#: main/main.c:368 main/main.c:374 +#: main/main.c:363 main/main.c:369 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r FILENAME æ¨™æº–å‡ºåŠ›ã¨æ¨™æº–エラー出力を指定ã—ãŸãƒ•ァイルã«å‡ºåŠ›\n" -#: main/main.c:370 +#: main/main.c:365 #, c-format msgid "" "\n" @@ -15665,22 +16130,22 @@ msgstr "" "\n" "åˆæœŸèµ·å‹•用ã®ã‚ªãƒ—ション:\n" -#: main/main.c:371 +#: main/main.c:366 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot åˆæœŸèµ·å‹•ãƒ¢ãƒ¼ãƒ‰ã‚’é¸æŠž (最åˆã®å¼•æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“)\n" -#: main/main.c:372 +#: main/main.c:367 #, c-format msgid " --check selects check mode (must be first argument)\n" msgstr " --check ãƒã‚§ãƒƒã‚¯ãƒ¢ãƒ¼ãƒ‰ã‚’é¸æŠž (最åˆã®å¼•æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“)\n" -#: main/main.c:373 +#: main/main.c:368 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr " DBNAME データベースå (åˆæœŸèµ·å‹•モードã§ã¯å¿…é ˆã®å¼•æ•°)\n" -#: main/main.c:376 +#: main/main.c:371 #, c-format msgid "" "\n" @@ -15696,12 +16161,12 @@ msgstr "" "\n" "ä¸å…·åˆã¯<%s>ã¾ã§å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: main/main.c:380 +#: main/main.c:375 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: main/main.c:391 +#: main/main.c:386 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -15714,12 +16179,12 @@ msgstr "" "ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚é©åˆ‡ãªã‚µãƒ¼ãƒãƒ¼ã®èµ·å‹•方法ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’\n" "å‚ç…§ã—ã¦ãã ã•ã„\n" -#: main/main.c:408 +#: main/main.c:403 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: 実ユーザーIDã¨å®ŸåŠ¹ãƒ¦ãƒ¼ã‚¶ãƒ¼IDã¯ä¸€è‡´ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“\n" -#: main/main.c:415 +#: main/main.c:410 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -15743,17 +16208,12 @@ msgstr "æ‹¡å¼µå¯èƒ½ãƒŽãƒ¼ãƒ‰ã‚¿ã‚¤ãƒ—\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods \"%s\"ã¯ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“" -#: nodes/makefuncs.c:153 statistics/extended_stats.c:2335 +#: nodes/makefuncs.c:152 nodes/makefuncs.c:178 statistics/extended_stats.c:2310 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "リレーション\"%s\"ã¯è¤‡åˆåž‹ã‚’æŒã£ã¦ã„ã¾ã›ã‚“" -#: nodes/makefuncs.c:878 -#, c-format -msgid "unrecognized JSON encoding: %s" -msgstr "䏿˜ŽãªJSON符å·åŒ–æ–¹å¼: \"%s\"" - -#: nodes/nodeFuncs.c:116 nodes/nodeFuncs.c:147 parser/parse_coerce.c:2567 parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 parser/parse_expr.c:2049 parser/parse_func.c:710 parser/parse_oper.c:883 utils/fmgr/funcapi.c:661 +#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2604 parser/parse_coerce.c:2742 parser/parse_coerce.c:2789 parser/parse_expr.c:2120 parser/parse_func.c:710 parser/parse_oper.c:869 utils/fmgr/funcapi.c:669 #, c-format msgid "could not find array type for data type %s" msgstr "データ型%sã®é…列型ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" @@ -15773,917 +16233,922 @@ msgstr "パラメータをæŒã¤ç„¡åãƒãƒ¼ã‚¿ãƒ«: %s" msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN ã¯ãƒžãƒ¼ã‚¸çµåˆå¯èƒ½ã‚‚ã—ãã¯ãƒãƒƒã‚·ãƒ¥çµåˆå¯èƒ½ãªå ´åˆã®ã¿ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™" -#: optimizer/plan/createplan.c:7111 parser/parse_merge.c:182 parser/parse_merge.c:189 +#: optimizer/plan/createplan.c:7175 parser/parse_merge.c:203 rewrite/rewriteHandler.c:1680 #, c-format msgid "cannot execute MERGE on relation \"%s\"" msgstr "リレーション\"%s\"ã«å¯¾ã—ã¦MERGEã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1398 +#: optimizer/plan/initsplan.c:1407 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "外部çµåˆã®NULLå¯ãªå´ã§ã¯%sã‚’é©ç”¨ã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1359 parser/analyze.c:1723 parser/analyze.c:1980 parser/analyze.c:3193 +#: optimizer/plan/planner.c:1380 parser/analyze.c:1771 parser/analyze.c:2029 parser/analyze.c:3247 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "UNION/INTERSECT/EXCEPTã§ã¯%sを使用ã§ãã¾ã›ã‚“" -#: optimizer/plan/planner.c:2080 optimizer/plan/planner.c:4038 +#: optimizer/plan/planner.c:2121 optimizer/plan/planner.c:4108 #, c-format msgid "could not implement GROUP BY" msgstr "GROUP BY を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: optimizer/plan/planner.c:2081 optimizer/plan/planner.c:4039 optimizer/plan/planner.c:4679 optimizer/prep/prepunion.c:1053 +#: optimizer/plan/planner.c:2122 optimizer/plan/planner.c:4109 optimizer/plan/planner.c:4790 optimizer/prep/prepunion.c:1320 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "一部ã®ãƒ‡ãƒ¼ã‚¿åž‹ãŒãƒãƒƒã‚·ãƒ¥ã®ã¿ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ä¸€æ–¹ã§ã€åˆ¥ã®åž‹ã¯ã‚½ãƒ¼ãƒˆã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ã€‚" -#: optimizer/plan/planner.c:4678 +#: optimizer/plan/planner.c:4789 #, c-format msgid "could not implement DISTINCT" msgstr "DISTINCTを実行ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: optimizer/plan/planner.c:6017 +#: optimizer/plan/planner.c:6134 #, c-format msgid "could not implement window PARTITION BY" msgstr "ウィンドウ㮠PARTITION BY を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: optimizer/plan/planner.c:6018 +#: optimizer/plan/planner.c:6135 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "ウィンドウ分割ã«ä½¿ç”¨ã™ã‚‹åˆ—ã¯ã€ã‚½ãƒ¼ãƒˆå¯èƒ½ãªãƒ‡ãƒ¼ã‚¿åž‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: optimizer/plan/planner.c:6022 +#: optimizer/plan/planner.c:6139 #, c-format msgid "could not implement window ORDER BY" msgstr "ウィンドウ㮠ORDER BY を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: optimizer/plan/planner.c:6023 +#: optimizer/plan/planner.c:6140 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "ウィンドウã®é †åºä»˜ã‘ã‚’ã™ã‚‹åˆ—ã¯ã€ã‚½ãƒ¼ãƒˆå¯èƒ½ãªãƒ‡ãƒ¼ã‚¿åž‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: optimizer/prep/prepunion.c:516 +#: optimizer/prep/prepunion.c:467 #, c-format msgid "could not implement recursive UNION" msgstr "å†å¸°UNIONを実行ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: optimizer/prep/prepunion.c:517 +#: optimizer/prep/prepunion.c:468 #, c-format msgid "All column datatypes must be hashable." msgstr "ã™ã¹ã¦ã®åˆ—ã®ãƒ‡ãƒ¼ã‚¿åž‹ã¯ãƒãƒƒã‚·ãƒ¥å¯èƒ½ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1052 +#: optimizer/prep/prepunion.c:1319 #, c-format msgid "could not implement %s" msgstr "%sを実行ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: optimizer/util/clauses.c:4869 +#: optimizer/util/clauses.c:4963 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL関数\"%s\"ã®ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³åŒ–処ç†ä¸­" -#: optimizer/util/plancat.c:154 +#: optimizer/util/plancat.c:153 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "リカãƒãƒªä¸­ã¯ä¸€æ™‚テーブルやUNLOGGEDテーブルã«ã¯ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“" -#: optimizer/util/plancat.c:726 +#: optimizer/util/plancat.c:768 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "è¡Œå…¨ä½“ã«æ¸¡ã‚‹ãƒ¦ãƒ‹ãƒ¼ã‚¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®æŽ¨å®šæŒ‡å®šã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: optimizer/util/plancat.c:743 +#: optimizer/util/plancat.c:785 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "ON CONFLICTå¥ä¸­ã®åˆ¶ç´„ã«ã¯é–¢é€£ä»˜ã‘られるインデックスãŒã‚りã¾ã›ã‚“" -#: optimizer/util/plancat.c:793 +#: optimizer/util/plancat.c:835 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATEã§ã®æŽ’除制約ã®ä½¿ç”¨ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: optimizer/util/plancat.c:898 +#: optimizer/util/plancat.c:945 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "ON CONFLICT 指定ã«åˆè‡´ã™ã‚‹ãƒ¦ãƒ‹ãƒ¼ã‚¯åˆ¶ç´„ã¾ãŸã¯æŽ’除制約ãŒã‚りã¾ã›ã‚“" -#: parser/analyze.c:788 parser/analyze.c:1502 +#: parser/analyze.c:824 parser/analyze.c:1550 #, c-format msgid "VALUES lists must all be the same length" msgstr "VALUESリストã¯ã™ã¹ã¦åŒã˜é•·ã•ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/analyze.c:990 +#: parser/analyze.c:1027 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERTã«å¯¾è±¡åˆ—よりも多ãã®å¼ãŒã‚りã¾ã™" -#: parser/analyze.c:1008 +#: parser/analyze.c:1045 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERTã«å¼ã‚ˆã‚Šã‚‚多ãã®å¯¾è±¡åˆ—ãŒã‚りã¾ã™" -#: parser/analyze.c:1012 +#: parser/analyze.c:1049 #, c-format msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" msgstr "挿入ソースãŒINSERTãŒæœŸå¾…ã™ã‚‹ã®ã¨åŒã˜åˆ—æ•°ã‚’å«ã‚€è¡Œè¡¨ç¾ã«ãªã£ã¦ã„ã¾ã™ã€‚ã†ã£ã‹ã‚Šä½™è¨ˆãªã‚«ãƒƒã‚³ã‚’ã¤ã‘ãŸã‚Šã—ã¾ã›ã‚“ã§ã—ãŸã‹ï¼Ÿ" -#: parser/analyze.c:1309 parser/analyze.c:1696 +#: parser/analyze.c:1357 parser/analyze.c:1744 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "ã“ã“ã§ã¯SELECT ... INTOã¯è¨±å¯ã•れã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1625 parser/analyze.c:3425 +#: parser/analyze.c:1673 parser/analyze.c:3479 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%sã‚’VALUESã«ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/analyze.c:1862 +#: parser/analyze.c:1911 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "䏿­£ãªUNION/INTERSECT/EXCEPT ORDER BYå¥ã§ã™" -#: parser/analyze.c:1863 +#: parser/analyze.c:1912 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "å¼ã‚„関数ã§ã¯ãªãã€çµæžœåˆ—ã®åå‰ã®ã¿ãŒä½¿ç”¨ã§ãã¾ã™ã€‚" -#: parser/analyze.c:1864 +#: parser/analyze.c:1913 #, c-format msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." msgstr "å¼/関数をã™ã¹ã¦ã®SELECTã«ã¤ã‘ã¦ãã ã•ã„。ã¾ãŸã¯ã“ã®UNIONã‚’FROMå¥ã«ç§»å‹•ã—ã¦ãã ã•ã„。" -#: parser/analyze.c:1970 +#: parser/analyze.c:2019 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTOã¯UNION/INTERSECT/EXCEPTã®æœ€åˆã®SELECTã§ã®ã¿ä½¿ç”¨ã§ãã¾ã™" -#: parser/analyze.c:2042 +#: parser/analyze.c:2091 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "UNION/INTERSECT/EXCEPTã®è¦ç´ ã¨ãªã‚‹æ–‡ã§ã¯åŒä¸€å•ã„åˆã‚ã›ãƒ¬ãƒ™ãƒ«ã®ä»–ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å‚ç…§ã§ãã¾ã›ã‚“" -#: parser/analyze.c:2129 +#: parser/analyze.c:2178 #, c-format msgid "each %s query must have the same number of columns" msgstr "ã™ã¹ã¦ã®%så•ã„åˆã‚ã›ã¯åŒã˜åˆ—æ•°ã‚’è¿”ã™å¿…è¦ãŒã‚りã¾ã™" #: parser/analyze.c:2535 #, c-format +msgid "SET target columns cannot be qualified with the relation name." +msgstr "SETã®å¯¾è±¡åˆ—ã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³åã§ä¿®é£¾ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" + +#: parser/analyze.c:2589 +#, c-format msgid "RETURNING must have at least one column" msgstr "RETURNINGã«ã¯å°‘ãªãã¨ã‚‚1ã¤ã®åˆ—ãŒå¿…è¦ã§ã™" -#: parser/analyze.c:2638 +#: parser/analyze.c:2692 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" msgstr[0] "代入元ãŒ%d個ã®åˆ—ã‚’è¿”ã—ã¾ã—ãŸ" -#: parser/analyze.c:2699 +#: parser/analyze.c:2753 #, c-format msgid "variable \"%s\" is of type %s but expression is of type %s" msgstr "変数\"%s\"ã¯åž‹%sã§ã™ãŒã€å¼ã¯åž‹%sã§ã—ãŸ" #. translator: %s is a SQL keyword -#: parser/analyze.c:2824 parser/analyze.c:2832 +#: parser/analyze.c:2878 parser/analyze.c:2886 #, c-format msgid "cannot specify both %s and %s" msgstr "%sã¨%sã®ä¸¡æ–¹ã‚’åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: parser/analyze.c:2852 +#: parser/analyze.c:2906 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR ã§ã¯ WITH ã«ãƒ‡ãƒ¼ã‚¿ã‚’変更ã™ã‚‹æ–‡ã‚’å«ã‚“ã§ã¯ãªã‚Šã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2860 +#: parser/analyze.c:2914 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %sã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: parser/analyze.c:2863 +#: parser/analyze.c:2917 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "ä¿æŒå¯èƒ½ã‚«ãƒ¼ã‚½ãƒ«ã¯èª­ã¿å–り専用ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2871 +#: parser/analyze.c:2925 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %sã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2882 +#: parser/analyze.c:2936 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %sã¯ãŒä¸æ­£ã§ã™" -#: parser/analyze.c:2885 +#: parser/analyze.c:2939 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "INSENSITIVEカーソルã¯èª­ã¿å–り専用ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: parser/analyze.c:2979 +#: parser/analyze.c:3033 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "実体化ビューã§ã¯WITHå¥ã«ãƒ‡ãƒ¼ã‚¿ã‚’変更ã™ã‚‹æ–‡ã‚’å«ã‚“ã§ã¯ãªã‚Šã¾ã›ã‚“" -#: parser/analyze.c:2989 +#: parser/analyze.c:3043 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "実体化ビューã§ã¯ä¸€æ™‚テーブルやビューを使用ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“" -#: parser/analyze.c:2999 +#: parser/analyze.c:3053 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "実体化ビューã¯å¢ƒç•Œãƒ‘ラメータを用ã„ã¦å®šç¾©ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: parser/analyze.c:3011 +#: parser/analyze.c:3065 #, c-format msgid "materialized views cannot be unlogged" msgstr "実体化ビューをログéžå–å¾—ã«ã¯ã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3200 +#: parser/analyze.c:3254 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "DISTINCTå¥ã§ã¯%sを使用ã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3207 +#: parser/analyze.c:3261 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "GROUP BYå¥ã§%sを使用ã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3214 +#: parser/analyze.c:3268 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "HAVING å¥ã§ã¯%sを使用ã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3221 +#: parser/analyze.c:3275 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "集約関数ã§ã¯%sã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3228 +#: parser/analyze.c:3282 #, c-format msgid "%s is not allowed with window functions" msgstr "ウィンドウ関数ã§ã¯%sã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3235 +#: parser/analyze.c:3289 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "ターゲットリストã®ä¸­ã§ã¯%sを集åˆè¿”å´é–¢æ•°ã¨ä¸€ç·’ã«ä½¿ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3334 +#: parser/analyze.c:3388 #, c-format msgid "%s must specify unqualified relation names" msgstr "%sã§ã¯éžä¿®é£¾ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³åを指定ã—ã¦ãã ã•ã„" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3398 +#: parser/analyze.c:3452 #, c-format msgid "%s cannot be applied to a join" msgstr "%sã‚’çµåˆã«ä½¿ç”¨ã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3407 +#: parser/analyze.c:3461 #, c-format msgid "%s cannot be applied to a function" msgstr "%sを関数ã«ä½¿ç”¨ã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3416 +#: parser/analyze.c:3470 #, c-format msgid "%s cannot be applied to a table function" msgstr "%sã¯ãƒ†ãƒ¼ãƒ–ル関数ã«ã¯é©ç”¨ã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3434 +#: parser/analyze.c:3488 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%sã¯WITHå•ã„åˆã‚ã›ã«ã¯é©ç”¨ã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3443 +#: parser/analyze.c:3497 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%sã¯åå‰ä»˜ãタプルストアã«ã¯é©ç”¨ã§ãã¾ã›ã‚“" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3463 +#: parser/analyze.c:3517 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "%2$så¥ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%1$s\"ã¯FROMå¥ã«ã‚りã¾ã›ã‚“" -#: parser/parse_agg.c:221 parser/parse_oper.c:227 +#: parser/parse_agg.c:210 parser/parse_oper.c:215 #, c-format msgid "could not identify an ordering operator for type %s" -msgstr "åž‹%sã®é †åºæ¼”ç®—å­ã‚’識別ã§ãã¾ã›ã‚“ã§ã—ãŸ" +msgstr "åž‹%sã®é †åºæ¼”ç®—å­ã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: parser/parse_agg.c:223 +#: parser/parse_agg.c:212 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "DISTINCT 付ãã®é›†ç´„関数ã¯ã€å…¥åŠ›ãŒã‚½ãƒ¼ãƒˆå¯èƒ½ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: parser/parse_agg.c:258 +#: parser/parse_agg.c:270 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "GROUPINGã®å¼•æ•°ã¯32より少ããªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_agg.c:361 +#: parser/parse_agg.c:373 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "JOINæ¡ä»¶ã§é›†ç´„関数を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:363 +#: parser/parse_agg.c:375 msgid "grouping operations are not allowed in JOIN conditions" msgstr "グルーピング演算ã¯JOINæ¡ä»¶ã®ä¸­ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:375 +#: parser/parse_agg.c:385 msgid "aggregate functions are not allowed in FROM clause of their own query level" msgstr "集約関数ã¯è‡ªèº«ã®å•ã„åˆã‚ã›ãƒ¬ãƒ™ãƒ«ã®FROMå¥ã®ä¸­ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:377 +#: parser/parse_agg.c:387 msgid "grouping operations are not allowed in FROM clause of their own query level" msgstr "グルーピング演算ã¯è‡ªèº«ã®ã‚¯ã‚¨ãƒªãƒ¬ãƒ™ãƒ«ã®FROMå¥ã®ä¸­ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:382 +#: parser/parse_agg.c:392 msgid "aggregate functions are not allowed in functions in FROM" msgstr "集約関数ã¯FROMå¥å†…ã®é–¢æ•°ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:384 +#: parser/parse_agg.c:394 msgid "grouping operations are not allowed in functions in FROM" msgstr "グルーピング演算ã¯FROMå¥å†…ã®é–¢æ•°ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:392 +#: parser/parse_agg.c:402 msgid "aggregate functions are not allowed in policy expressions" msgstr "集約関数ã¯ãƒãƒªã‚·å¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:394 +#: parser/parse_agg.c:404 msgid "grouping operations are not allowed in policy expressions" msgstr "グルーピング演算ã¯ãƒãƒªã‚·å¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:411 +#: parser/parse_agg.c:421 msgid "aggregate functions are not allowed in window RANGE" msgstr "集約関数ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦RANGEã®ä¸­ã§ã¯é›†ç´„関数を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:413 +#: parser/parse_agg.c:423 msgid "grouping operations are not allowed in window RANGE" msgstr "ウィンドウ定義ã®RANGEå¥ã®ä¸­ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:418 +#: parser/parse_agg.c:428 msgid "aggregate functions are not allowed in window ROWS" msgstr "ウィンドウ定義ã®ROWSå¥ã§ã¯é›†ç´„関数ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:420 +#: parser/parse_agg.c:430 msgid "grouping operations are not allowed in window ROWS" msgstr "ウィンドウ定義ã®ROWSå¥ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:425 +#: parser/parse_agg.c:435 msgid "aggregate functions are not allowed in window GROUPS" msgstr "ウィンドウ定義ã®GROUPSå¥ã§ã¯é›†ç´„関数ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:427 +#: parser/parse_agg.c:437 msgid "grouping operations are not allowed in window GROUPS" msgstr "ウィンドウ定義ã®GROUPSå¥ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:440 +#: parser/parse_agg.c:450 msgid "aggregate functions are not allowed in MERGE WHEN conditions" msgstr "MERGE WHENæ¡ä»¶ã§ã¯é›†ç´„関数を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:442 +#: parser/parse_agg.c:452 msgid "grouping operations are not allowed in MERGE WHEN conditions" msgstr "MERGE WHENæ¡ä»¶ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:468 +#: parser/parse_agg.c:479 msgid "aggregate functions are not allowed in check constraints" msgstr "検査制約ã§ã¯é›†ç´„関数を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:470 +#: parser/parse_agg.c:481 msgid "grouping operations are not allowed in check constraints" msgstr "検査制約ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:477 +#: parser/parse_agg.c:488 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "DEFAULTå¼ã§ã¯é›†ç´„関数を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:479 +#: parser/parse_agg.c:490 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "DEFAULTå¼ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:484 +#: parser/parse_agg.c:495 msgid "aggregate functions are not allowed in index expressions" msgstr "インデックスå¼ã§ã¯é›†ç´„関数を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:486 +#: parser/parse_agg.c:497 msgid "grouping operations are not allowed in index expressions" msgstr "インデックスå¼ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:491 +#: parser/parse_agg.c:502 msgid "aggregate functions are not allowed in index predicates" msgstr "インデックス述語ã§ã¯é›†ç´„関数を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:493 +#: parser/parse_agg.c:504 msgid "grouping operations are not allowed in index predicates" msgstr "インデックス述語ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:498 +#: parser/parse_agg.c:509 msgid "aggregate functions are not allowed in statistics expressions" msgstr "統計情報å¼ã§ã¯é›†ç´„関数を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:500 +#: parser/parse_agg.c:511 msgid "grouping operations are not allowed in statistics expressions" msgstr "統計情報å¼ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:505 +#: parser/parse_agg.c:516 msgid "aggregate functions are not allowed in transform expressions" msgstr "変æ›å¼ã§ã¯é›†ç´„関数を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:507 +#: parser/parse_agg.c:518 msgid "grouping operations are not allowed in transform expressions" msgstr "変æ›å¼ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:512 +#: parser/parse_agg.c:523 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "EXECUTEã®ãƒ‘ラメータã§ã¯é›†ç´„関数を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:514 +#: parser/parse_agg.c:525 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "EXECUTEã®ãƒ‘ラメータã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:519 +#: parser/parse_agg.c:530 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "トリガã®WHENæ¡ä»¶ã§ã¯é›†ç´„関数を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:521 +#: parser/parse_agg.c:532 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "トリガã®WHENæ¡ä»¶ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:526 +#: parser/parse_agg.c:537 msgid "aggregate functions are not allowed in partition bound" msgstr "集約関数ã¯ãƒ‘ーティション境界ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:528 +#: parser/parse_agg.c:539 msgid "grouping operations are not allowed in partition bound" msgstr "グルーピング演算ã¯ãƒ‘ーティション境界ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:533 +#: parser/parse_agg.c:544 msgid "aggregate functions are not allowed in partition key expressions" msgstr "パーティションキーå¼ã§ã¯é›†ç´„関数ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:535 +#: parser/parse_agg.c:546 msgid "grouping operations are not allowed in partition key expressions" msgstr "パーティションキーå¼ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:541 +#: parser/parse_agg.c:552 msgid "aggregate functions are not allowed in column generation expressions" msgstr "集約関数ã¯ã‚«ãƒ©ãƒ ç”Ÿæˆå¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:543 +#: parser/parse_agg.c:554 msgid "grouping operations are not allowed in column generation expressions" msgstr "グルーピング演算ã¯ã‚«ãƒ©ãƒ ç”Ÿæˆå¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:549 +#: parser/parse_agg.c:560 msgid "aggregate functions are not allowed in CALL arguments" msgstr "CALLã®å¼•æ•°ã§ã¯é›†ç´„関数を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:551 +#: parser/parse_agg.c:562 msgid "grouping operations are not allowed in CALL arguments" msgstr "CALLã®å¼•æ•°ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:557 +#: parser/parse_agg.c:568 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "集約関数㯠COPY FROM ã® WHERE æ¡ä»¶ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:559 +#: parser/parse_agg.c:570 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "グルーピング演算㯠COPY FROM ã® WHERE æ¡ä»¶ã®ä¸­ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:586 parser/parse_clause.c:1955 +#: parser/parse_agg.c:597 parser/parse_clause.c:1962 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "%sã§ã¯é›†ç´„関数を使用ã§ãã¾ã›ã‚“" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:589 +#: parser/parse_agg.c:600 #, c-format msgid "grouping operations are not allowed in %s" msgstr "%sã§ã¯ã‚°ãƒ«ãƒ¼ãƒ”ング演算を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:690 +#: parser/parse_agg.c:701 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "アウタレベルã®é›†ç´„ã¯ç›´æŽ¥å¼•æ•°ã«ä½Žä½ã®å¤‰æ•°ã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:768 +#: parser/parse_agg.c:779 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "集åˆè¿”å´é–¢æ•°ã®å‘¼ã³å‡ºã—ã«é›†ç´„関数ã®å‘¼ã³å‡ºã—ã‚’å«ã‚€ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:769 parser/parse_expr.c:1700 parser/parse_expr.c:2182 parser/parse_func.c:884 +#: parser/parse_agg.c:780 parser/parse_expr.c:1762 parser/parse_expr.c:2253 parser/parse_func.c:885 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." msgstr "ã“ã®é›†åˆè¿”å´é–¢æ•°ã‚’LATERAL FROMé …ç›®ã«ç§»å‹•ã§ãã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: parser/parse_agg.c:774 +#: parser/parse_agg.c:785 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "集約関数ã®å‘¼ã³å‡ºã—ã«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã®å‘¼ã³å‡ºã—ã‚’å«ã‚€ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:853 +#: parser/parse_agg.c:864 msgid "window functions are not allowed in JOIN conditions" msgstr "JOINæ¡ä»¶ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:860 +#: parser/parse_agg.c:871 msgid "window functions are not allowed in functions in FROM" msgstr "FROMå¥å†…ã®é–¢æ•°ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:866 +#: parser/parse_agg.c:877 msgid "window functions are not allowed in policy expressions" msgstr "ãƒãƒªã‚·å¼ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:879 +#: parser/parse_agg.c:890 msgid "window functions are not allowed in window definitions" msgstr "ウィンドウ定義ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:890 +#: parser/parse_agg.c:901 msgid "window functions are not allowed in MERGE WHEN conditions" msgstr "MERGE WHENæ¡ä»¶ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:914 +#: parser/parse_agg.c:926 msgid "window functions are not allowed in check constraints" msgstr "検査制約ã®ä¸­ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:918 +#: parser/parse_agg.c:930 msgid "window functions are not allowed in DEFAULT expressions" msgstr "DEFAULTå¼ã®ä¸­ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:921 +#: parser/parse_agg.c:933 msgid "window functions are not allowed in index expressions" msgstr "インデックスå¼ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:924 +#: parser/parse_agg.c:936 msgid "window functions are not allowed in statistics expressions" msgstr "統計情報å¼ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:927 +#: parser/parse_agg.c:939 msgid "window functions are not allowed in index predicates" msgstr "インデックス述語ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:930 +#: parser/parse_agg.c:942 msgid "window functions are not allowed in transform expressions" msgstr "変æ›å¼ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:933 +#: parser/parse_agg.c:945 msgid "window functions are not allowed in EXECUTE parameters" msgstr "EXECUTEパラメータã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:936 +#: parser/parse_agg.c:948 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "トリガã®WHENæ¡ä»¶ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:939 +#: parser/parse_agg.c:951 msgid "window functions are not allowed in partition bound" msgstr "ウィンドウ関数ã¯ãƒ‘ーティション境界ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:942 +#: parser/parse_agg.c:954 msgid "window functions are not allowed in partition key expressions" msgstr "パーティションキーå¼ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:945 +#: parser/parse_agg.c:957 msgid "window functions are not allowed in CALL arguments" msgstr "CALLã®å¼•æ•°ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:948 +#: parser/parse_agg.c:960 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "ウィンドウ関数㯠COPY FROM ã® WHERE æ¡ä»¶ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:951 +#: parser/parse_agg.c:963 msgid "window functions are not allowed in column generation expressions" msgstr "ウィンドウ関数ã¯ã‚«ãƒ©ãƒ ç”Ÿæˆå¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:974 parser/parse_clause.c:1964 +#: parser/parse_agg.c:986 parser/parse_clause.c:1971 #, c-format msgid "window functions are not allowed in %s" msgstr "%sã®ä¸­ã§ã¯ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:1008 parser/parse_clause.c:2797 +#: parser/parse_agg.c:1020 parser/parse_clause.c:2804 #, c-format msgid "window \"%s\" does not exist" msgstr "ウィンドウ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: parser/parse_agg.c:1096 +#: parser/parse_agg.c:1108 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "ã‚°ãƒ«ãƒ¼ãƒ”ãƒ³ã‚°ã‚»ãƒƒãƒˆã®æ•°ãŒå¤šã™ãŽã¾ã™ (最大4096)" -#: parser/parse_agg.c:1236 +#: parser/parse_agg.c:1248 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "å†å¸°å•ã„åˆã‚ã›ã®å†å¸°é …ã§ã¯é›†ç´„関数を使用ã§ãã¾ã›ã‚“" -#: parser/parse_agg.c:1429 +#: parser/parse_agg.c:1441 #, c-format msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" msgstr "列\"%s.%s\"ã¯GROUP BYå¥ã§æŒ‡å®šã™ã‚‹ã‹ã€é›†ç´„関数内ã§ä½¿ç”¨ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_agg.c:1432 +#: parser/parse_agg.c:1444 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "é †åºé›†åˆé›†ç´„ã®ç›´æŽ¥å¼•æ•°ã¯ã‚°ãƒ«ãƒ¼ãƒ”ングã•れãŸåˆ—ã®ã¿ã‚’使用ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: parser/parse_agg.c:1437 +#: parser/parse_agg.c:1449 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "外部å•ã„åˆã‚ã›ã‹ã‚‰å‰¯å•ã„åˆã‚ã›ãŒã‚°ãƒ«ãƒ¼ãƒ—化ã•れã¦ã„ãªã„列\"%s.%s\"を使用ã—ã¦ã„ã¾ã™" -#: parser/parse_agg.c:1601 +#: parser/parse_agg.c:1613 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "GROUPINGã®å¼•æ•°ã¯é–¢é€£ã™ã‚‹ã‚¯ã‚¨ãƒªãƒ¬ãƒ™ãƒ«ã®ã‚°ãƒ«ãƒ¼ãƒ”ングå¼ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_clause.c:195 +#: parser/parse_clause.c:193 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "リレーション\"%s\"ã¯æ›´æ–°æ–‡ã®å¯¾è±¡ã«ã¯ãªã‚Œã¾ã›ã‚“" -#: parser/parse_clause.c:571 parser/parse_clause.c:599 parser/parse_func.c:2552 +#: parser/parse_clause.c:569 parser/parse_clause.c:597 parser/parse_func.c:2553 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "集åˆè¿”å´é–¢æ•°ã¯FROMã®æœ€ä¸Šä½ãƒ¬ãƒ™ãƒ«ã«ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: parser/parse_clause.c:611 +#: parser/parse_clause.c:609 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "åŒã˜é–¢æ•°ã«å¯¾ã—ã¦è¤‡æ•°ã®åˆ—定義リストをæŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:642 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "複数ã®é–¢æ•°ã‚’ä¼´ã£ãŸ ROWS FROM() ã¯åˆ—定義リストをæŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: parser/parse_clause.c:645 +#: parser/parse_clause.c:643 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "ROWS FROM() 内ã®ãれãžã‚Œã®é–¢æ•°ã”ã¨ã«å€‹åˆ¥ã®åˆ—定義リストを付ã‘ã¦ãã ã•ã„。" -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:649 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "複数ã®å¼•æ•°ã‚’ã‚‚ã¤UNNEST()ã¯åˆ—定義リストをæŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: parser/parse_clause.c:652 +#: parser/parse_clause.c:650 #, c-format msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." msgstr "ROWS FROM() ã®ä¸­ã§å€‹åˆ¥ã« UNNEST() をコールã—ã¦ã€åˆ—定義リストをãれãžã‚Œã«ä»˜åŠ ã—ã¦ãã ã•ã„。" -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:657 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY ã¯åˆ—定義リストãŒã‚ã‚‹ã¨ãã¯ä½¿ãˆã¾ã›ã‚“" -#: parser/parse_clause.c:660 +#: parser/parse_clause.c:658 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "ROWS FROM() ã®ä¸­ã«åˆ—定義リストをãŠã„ã¦ãã ã•ã„。" -#: parser/parse_clause.c:760 +#: parser/parse_clause.c:762 parser/parse_jsontable.c:295 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "FOR ORDINALITY 列ã¯ä¸€ã¤ã¾ã§ã§ã™" -#: parser/parse_clause.c:821 +#: parser/parse_clause.c:823 #, c-format msgid "column name \"%s\" is not unique" msgstr "列å\"%s\"ã¯ä¸€æ„ã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_clause.c:863 +#: parser/parse_clause.c:865 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "åå‰ç©ºé–“å\"%s\"ã¯ä¸€æ„ã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_clause.c:873 +#: parser/parse_clause.c:875 #, c-format msgid "only one default namespace is allowed" msgstr "デフォルトåå‰ç©ºé–“ã¯ä¸€ã¤ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™" -#: parser/parse_clause.c:933 +#: parser/parse_clause.c:935 #, c-format msgid "tablesample method %s does not exist" msgstr "テーブルサンプルメソッド%sã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: parser/parse_clause.c:955 +#: parser/parse_clause.c:957 #, c-format msgid "tablesample method %s requires %d argument, not %d" msgid_plural "tablesample method %s requires %d arguments, not %d" msgstr[0] "テーブルサンプルメソッド%sã¯%d個ã®å¼•æ•°ã‚’å¿…è¦ã¨ã—ã¾ã™ã€%d個ã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_clause.c:989 +#: parser/parse_clause.c:991 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "テーブルサンプルメソッド%sã¯REPEATABLEをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: parser/parse_clause.c:1138 +#: parser/parse_clause.c:1144 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "TABLESAMPLEå¥ã¯ãƒ†ãƒ¼ãƒ–ルãŠã‚ˆã³å®Ÿä½“化ビューã®ã¿ã«é©ç”¨å¯èƒ½ã§ã™" -#: parser/parse_clause.c:1325 +#: parser/parse_clause.c:1331 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "USINGå¥ã«åˆ—å\"%s\"ãŒè¤‡æ•°ã‚りã¾ã™" -#: parser/parse_clause.c:1340 +#: parser/parse_clause.c:1346 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "左テーブルã«åˆ—å\"%s\"ãŒè¤‡æ•°ã‚りã¾ã™" -#: parser/parse_clause.c:1349 +#: parser/parse_clause.c:1355 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "USINGå¥ã§æŒ‡å®šã—ãŸåˆ—\"%sãŒå·¦ãƒ†ãƒ¼ãƒ–ルã«å­˜åœ¨ã—ã¾ã›ã‚“" -#: parser/parse_clause.c:1364 +#: parser/parse_clause.c:1370 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "å³ãƒ†ãƒ¼ãƒ–ルã«åˆ—å\"%s\"ãŒè¤‡æ•°ã‚りã¾ã™" -#: parser/parse_clause.c:1373 +#: parser/parse_clause.c:1379 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "USINGå¥ã§æŒ‡å®šã—ãŸåˆ—\"%sãŒå³ãƒ†ãƒ¼ãƒ–ルã«å­˜åœ¨ã—ã¾ã›ã‚“" -#: parser/parse_clause.c:1900 +#: parser/parse_clause.c:1907 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" msgstr "FETCH FIRST ... WITH TIESå¥ã§è¡Œæ•°ã«NULLã¯æŒ‡å®šã§ãã¾ã›ã‚“" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1925 +#: parser/parse_clause.c:1932 #, c-format msgid "argument of %s must not contain variables" msgstr "%sã®å¼•æ•°ã«ã¯å¤‰æ•°ã‚’使用ã§ãã¾ã›ã‚“" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2090 +#: parser/parse_clause.c:2097 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "%s \"%s\"ã¯æ›–昧ã§ã™" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2118 +#: parser/parse_clause.c:2125 #, c-format msgid "non-integer constant in %s" msgstr "%sã«æ•´æ•°ä»¥å¤–ã®å®šæ•°ãŒã‚りã¾ã™" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2140 +#: parser/parse_clause.c:2147 #, c-format msgid "%s position %d is not in select list" msgstr "%sã®ä½ç½®%dã¯SELECTリストã«ã‚りã¾ã›ã‚“" -#: parser/parse_clause.c:2579 +#: parser/parse_clause.c:2586 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBEã¯12è¦ç´ ã«åˆ¶é™ã•れã¦ã„ã¾ã™" -#: parser/parse_clause.c:2785 +#: parser/parse_clause.c:2792 #, c-format msgid "window \"%s\" is already defined" msgstr "ウィンドウ\"%s\"ã¯ã™ã§ã«å®šç¾©æ¸ˆã¿ã§ã™" -#: parser/parse_clause.c:2846 +#: parser/parse_clause.c:2853 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "ウィンドウ\"%s\"ã®PARTITION BYå¥ã‚’オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã§ãã¾ã›ã‚“" -#: parser/parse_clause.c:2858 +#: parser/parse_clause.c:2865 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "ウィンドウ\"%s\"ã®ORDER BYå¥ã‚’オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã§ãã¾ã›ã‚“" -#: parser/parse_clause.c:2888 parser/parse_clause.c:2894 +#: parser/parse_clause.c:2895 parser/parse_clause.c:2901 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "フレームå¥ã‚’ã‚‚ã£ã¦ã„ã‚‹ãŸã‚ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦\"%s\"ã¯ã‚³ãƒ”ーã§ãã¾ã›ã‚“" -#: parser/parse_clause.c:2896 +#: parser/parse_clause.c:2903 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "ã“ã®OVERå¥ä¸­ã®æ‹¬å¼§ã‚’無視ã—ã¾ã—ãŸ" -#: parser/parse_clause.c:2916 +#: parser/parse_clause.c:2923 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "offset PRECEDING/FOLLOWING ã‚’ä¼´ã£ãŸ RANGE ã¯ãŸã ä¸€ã¤ã® ORDER BY 列を必è¦ã¨ã—ã¾ã™" -#: parser/parse_clause.c:2939 +#: parser/parse_clause.c:2946 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "GROUPSフレーム指定ã¯ORDER BYå¥ã‚’å¿…è¦ã¨ã—ã¾ã™" -#: parser/parse_clause.c:3010 +#: parser/parse_clause.c:3016 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "DISTINCT ã‚„ ORDER BY 表ç¾ã‚’ä¼´ãªã†é›†ç´„ã¯å¼•数リストã®ä¸­ã«ç¾ã‚Œãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_clause.c:3011 +#: parser/parse_clause.c:3017 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "SELECT DISTINCTã§ã¯ORDER BYã®å¼ã¯SELECTリスト内ã«ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_clause.c:3043 +#: parser/parse_clause.c:3049 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "DISTINCTã‚’ä¼´ã£ãŸé›†ç´„ã¯ã€æœ€ä½Žã§ã‚‚一ã¤ã®å¼•æ•°ã‚’å–ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: parser/parse_clause.c:3044 +#: parser/parse_clause.c:3050 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCTã«ã¯å°‘ãªãã¨ã‚‚1ã¤ã®åˆ—ãŒå¿…è¦ã§ã™" -#: parser/parse_clause.c:3110 parser/parse_clause.c:3142 +#: parser/parse_clause.c:3116 parser/parse_clause.c:3148 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "SELECT DISTINCT ONã®å¼ã¯ORDER BYå¼ã®å…ˆé ­ã«ä¸€è‡´ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_clause.c:3220 +#: parser/parse_clause.c:3226 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESCã¯ON CONFLICTå¥ã§ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: parser/parse_clause.c:3226 +#: parser/parse_clause.c:3232 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LASTã¯ON CONFLICTå¥ã§ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: parser/parse_clause.c:3305 +#: parser/parse_clause.c:3311 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE ã¯æŽ¨å®šæŒ‡å®šã¾ãŸã¯åˆ¶ç´„åã‚’å¿…è¦ã¨ã—ã¾ã™" -#: parser/parse_clause.c:3306 +#: parser/parse_clause.c:3312 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "例ãˆã°ã€ ON CONFLICT (column_name)。" -#: parser/parse_clause.c:3317 +#: parser/parse_clause.c:3323 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "システムカタログテーブルã§ã¯ON CONFLICTã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: parser/parse_clause.c:3325 +#: parser/parse_clause.c:3331 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT ã¯ã‚«ã‚¿ãƒ­ã‚°ãƒ†ãƒ¼ãƒ–ルã¨ã—ã¦ä½¿ç”¨ä¸­ã®ãƒ†ãƒ¼ãƒ–ル\"%s\"ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: parser/parse_clause.c:3456 +#: parser/parse_clause.c:3462 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "演算å­\"%s\"ã¯æœ‰åйãªé †åºä»˜ã‘演算å­åã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_clause.c:3458 +#: parser/parse_clause.c:3464 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "é †åºä»˜ã‘演算å­ã¯B-Treeæ¼”ç®—å­æ—ã®\"<\"ã¾ãŸã¯\">\"è¦ç´ ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: parser/parse_clause.c:3769 +#: parser/parse_clause.c:3775 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "offset PRECEDING/FOLLOWING ã‚’ä¼´ã£ãŸ RANGE ã¯åˆ—åž‹ %s ã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: parser/parse_clause.c:3775 +#: parser/parse_clause.c:3781 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" msgstr "offset PRECEDING/FOLLOWING ã‚’ä¼´ã£ãŸ RANGE ã¯åˆ—åž‹ %s ã¨ã‚ªãƒ•セット型 %s ã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: parser/parse_clause.c:3778 +#: parser/parse_clause.c:3784 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "オフセット値をé©åˆ‡ãªåž‹ã«ã‚­ãƒ£ã‚¹ãƒˆã—ã¦ãã ã•ã„。" -#: parser/parse_clause.c:3783 +#: parser/parse_clause.c:3789 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" msgstr "offset PRECEDING/FOLLOWING ã‚’ä¼´ã£ãŸ RANGE ã¯åˆ—åž‹ %s ã¨ã‚ªãƒ•セット型 %s ã«å¯¾ã—ã¦è¤‡æ•°ã®è§£é‡ˆãŒå¯èƒ½ã«ãªã£ã¦ã„ã¾ã™" -#: parser/parse_clause.c:3786 +#: parser/parse_clause.c:3792 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "オフセット値をæ„図ã—ãŸåž‹ãã®ã‚‚ã®ã«ã‚­ãƒ£ã‚¹ãƒˆã—ã¦ãã ã•ã„。" -#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 parser/parse_expr.c:2083 parser/parse_expr.c:2691 parser/parse_expr.c:3516 parser/parse_target.c:985 +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 parser/parse_expr.c:2154 parser/parse_expr.c:2762 parser/parse_expr.c:3413 parser/parse_expr.c:3642 parser/parse_target.c:998 #, c-format msgid "cannot cast type %s to %s" msgstr "åž‹%sã‹ã‚‰%sã¸ã®åž‹å¤‰æ›ãŒã§ãã¾ã›ã‚“" @@ -16718,113 +17183,113 @@ msgid "argument of %s must not return a set" msgstr "%sã®å¼•æ•°ã¯é›†åˆã‚’è¿”ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1383 +#: parser/parse_coerce.c:1420 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "%sã®åž‹%sã¨%sを一致ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: parser/parse_coerce.c:1499 +#: parser/parse_coerce.c:1536 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "引数ã®åž‹%sã¨%sã¯åˆè‡´ã•ã›ã‚‰ã‚Œã¾ã›ã‚“" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1551 +#: parser/parse_coerce.c:1588 #, c-format msgid "%s could not convert type %s to %s" msgstr "%sã§åž‹%sã‹ã‚‰%sã¸å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 +#: parser/parse_coerce.c:2191 parser/parse_coerce.c:2211 parser/parse_coerce.c:2231 parser/parse_coerce.c:2252 parser/parse_coerce.c:2307 parser/parse_coerce.c:2341 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "\"%s\"ã¨å®£è¨€ã•れãŸå¼•æ•°ãŒå…¨ã¦åŒã˜ã§ã‚りã¾ã›ã‚“" -#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 utils/fmgr/funcapi.c:592 +#: parser/parse_coerce.c:2286 parser/parse_coerce.c:2399 utils/fmgr/funcapi.c:600 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "%sã¨å®£è¨€ã•れãŸå¼•æ•°ãŒé…列ã§ã¯ãªã%såž‹ã§ã™" -#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 utils/fmgr/funcapi.c:606 +#: parser/parse_coerce.c:2319 parser/parse_coerce.c:2469 utils/fmgr/funcapi.c:614 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "%sã¨å®£è¨€ã•れãŸå¼•æ•°ãŒç¯„囲型ã§ã¯ãªãåž‹%sã§ã™" -#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:624 utils/fmgr/funcapi.c:689 +#: parser/parse_coerce.c:2353 parser/parse_coerce.c:2433 parser/parse_coerce.c:2566 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "%sã¨å®£è¨€ã•れãŸå¼•æ•°ãŒè¤‡ç¯„囲型ã§ã¯ãªãåž‹%sã§ã™" -#: parser/parse_coerce.c:2353 +#: parser/parse_coerce.c:2390 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "\"anyarray\"åž‹ã®å¼•æ•°ã®è¦ç´ åž‹ã‚’決定ã§ãã¾ã›ã‚“" -#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 +#: parser/parse_coerce.c:2416 parser/parse_coerce.c:2447 parser/parse_coerce.c:2486 parser/parse_coerce.c:2552 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "%sã¨å®£è¨€ã•れãŸå¼•æ•°ã¨%sã¨å®£è¨€ã•れãŸå¼•æ•°ã¨ã§æ•´åˆæ€§ãŒã‚りã¾ã›ã‚“" -#: parser/parse_coerce.c:2474 +#: parser/parse_coerce.c:2511 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "入力型ãŒ%sã§ã‚ã£ãŸãŸã‚多様型ãŒç‰¹å®šã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: parser/parse_coerce.c:2488 +#: parser/parse_coerce.c:2525 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "anynonarrayã¨ç…§åˆã•れãŸã¯é…列型ã§ã™: %s" -#: parser/parse_coerce.c:2498 +#: parser/parse_coerce.c:2535 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "anyenumã¨ç…§åˆã•れãŸåž‹ã¯åˆ—挙型ã§ã¯ã‚りã¾ã›ã‚“: %s" -#: parser/parse_coerce.c:2559 +#: parser/parse_coerce.c:2596 #, c-format msgid "arguments of anycompatible family cannot be cast to a common type" msgstr "anycompatibleç³»ã®å¼•数を共通ã®åž‹ã«ã‚­ãƒ£ã‚¹ãƒˆã§ãã¾ã›ã‚“" -#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 +#: parser/parse_coerce.c:2614 parser/parse_coerce.c:2635 parser/parse_coerce.c:2685 parser/parse_coerce.c:2690 parser/parse_coerce.c:2754 parser/parse_coerce.c:2766 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "入力型ãŒ%2$sã§ã‚ã‚‹ãŸã‚多様型%1$sãŒç‰¹å®šã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: parser/parse_coerce.c:2587 +#: parser/parse_coerce.c:2624 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "anycompatiblerangeåž‹%sã¯anycompatiblerangeåž‹%sã¨åˆè‡´ã—ã¾ã›ã‚“" -#: parser/parse_coerce.c:2608 +#: parser/parse_coerce.c:2645 #, c-format msgid "anycompatiblemultirange type %s does not match anycompatible type %s" msgstr "anycompatiblemultirangeåž‹%sã¯anycompatibleåž‹%sã¨åˆè‡´ã—ã¾ã›ã‚“" -#: parser/parse_coerce.c:2622 +#: parser/parse_coerce.c:2659 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "anycompatiblenonarrayã«å¯¾å¿œã™ã‚‹åž‹ãŒé…列型ã§ã™: %s" -#: parser/parse_coerce.c:2857 +#: parser/parse_coerce.c:2894 #, c-format msgid "A result of type %s requires at least one input of type anyrange or anymultirange." msgstr "%såž‹ã®è¿”å´å€¤ã«ã¯anyrangeã¾ãŸã¯anymultirangeåž‹ã®å…¥åŠ›ãŒæœ€ä½Žã§ã‚‚一ã¤å¿…è¦ã§ã™ã€‚" -#: parser/parse_coerce.c:2874 +#: parser/parse_coerce.c:2911 #, c-format msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." msgstr "%såž‹ã®è¿”å´å€¤ã«ã¯å°‘ãªãã¨ã‚‚一ã¤ã®anycompatiblerangeã¾ãŸã¯anycompatiblemultirangeåž‹ã®å…¥åŠ›ãŒå¿…è¦ã§ã™ã€‚" -#: parser/parse_coerce.c:2886 +#: parser/parse_coerce.c:2923 #, c-format msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." msgstr "%såž‹ã®è¿”å´å€¤ã«ã¯å°‘ãªãã¨ã‚‚一ã¤ã®anyelementã€anyarrayã€anynonarrayã€anyenumã€anyrange ã¾ãŸã¯anymultirangeåž‹ã®å…¥åŠ›ãŒå¿…è¦ã§ã™ã€‚" -#: parser/parse_coerce.c:2898 +#: parser/parse_coerce.c:2935 #, c-format msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." msgstr "%såž‹ã®è¿”å´å€¤ã«ã¯å°‘ãªãã¨ã‚‚一ã¤ã®anycompatibleã€anycompatiblearrayã€anycompatiblenonarrayã€anycompatiblerangeã¾ãŸã¯anycompatiblemultirangeåž‹ã®å…¥åŠ›ãŒå¿…è¦ã§ã™ã€‚" -#: parser/parse_coerce.c:2928 +#: parser/parse_coerce.c:2965 msgid "A result of type internal requires at least one input of type internal." msgstr "internalåž‹ã®è¿”å´å€¤ã«ã¯å°‘ãªãã¨ã‚‚1ã¤ã®internalåž‹ã®å…¥åŠ›ãŒå¿…è¦ã§ã™ã€‚" @@ -16868,433 +17333,545 @@ msgstr "å•ã„åˆã‚ã›\"%s\"ã¸ã®å†å¸°çš„å‚ç…§ãŒã€INTERSECT内ã«ç¾ã‚Œã¦ msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "å•ã„åˆã‚ã›\"%s\"ã¸ã®å†å¸°çš„å‚ç…§ãŒã€EXCEPT内ã§ç¾ã‚Œã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: parser/parse_cte.c:133 -#, c-format -msgid "MERGE not supported in WITH query" -msgstr "MERGEã¯WITHå•ã„åˆã‚ã›ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" - -#: parser/parse_cte.c:143 +#: parser/parse_cte.c:136 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "WITH å•ã„åˆã‚ã›å\"%s\"ãŒè¤‡æ•°å›žæŒ‡å®šã•れã¾ã—ãŸ" -#: parser/parse_cte.c:314 +#: parser/parse_cte.c:308 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "åž‹%sã®ä¸ç­‰æ¼”ç®—å­ã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: parser/parse_cte.c:341 +#: parser/parse_cte.c:335 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "データを変更ã™ã‚‹ã‚ˆã†ãªã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆã‚’å«ã‚€ WITH å¥ã¯ãƒˆãƒƒãƒ—レベルã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_cte.c:390 +#: parser/parse_cte.c:384 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "å†å¸°å•ã„åˆã‚ã›\"%s\"ã®åˆ—%dã®åž‹ã¯ã€éžå†å¸°é …ã®å†…ã§ã¯%sã«ãªã£ã¦ã„ã¾ã™ãŒå…¨ä½“ã¨ã—ã¦ã¯%sã§ã™" -#: parser/parse_cte.c:396 +#: parser/parse_cte.c:390 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "éžå†å¸°é …ã®å‡ºåŠ›ã‚’æ­£ã—ã„åž‹ã«å¤‰æ›ã—ã¦ãã ã•ã„。" -#: parser/parse_cte.c:401 +#: parser/parse_cte.c:395 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "å†å¸°å•ã„åˆã‚ã›\"%s\"ã®åˆ—%dã®ç…§åˆé †åºã¯ã€éžå†å¸°é …ã§ã¯\"%s\"ã§ã™ãŒå…¨ä½“ã¨ã—ã¦ã¯\"%s\"ã§ã™" -#: parser/parse_cte.c:405 +#: parser/parse_cte.c:399 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "COLLATEå¥ã‚’使ã£ã¦éžå†å¸°é …ã®ç…§åˆé †åºã‚’設定ã—ã¦ãã ã•ã„。" -#: parser/parse_cte.c:426 +#: parser/parse_cte.c:420 #, c-format msgid "WITH query is not recursive" msgstr "WITHå•ã„åˆã‚ã›ã¯å†å¸°çš„ã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_cte.c:457 +#: parser/parse_cte.c:451 #, c-format msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" msgstr "SEARCHã¾ãŸã¯CYCLEå¥ã‚’指定ã™ã‚‹å ´åˆã€UNIONã®å·¦è¾ºã¯SELECTã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_cte.c:462 +#: parser/parse_cte.c:456 #, c-format msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" msgstr "SEARCHã¾ãŸã¯CYCLEå¥ã‚’指定ã™ã‚‹å ´åˆã€UNIONã®å³è¾ºã¯SELECTã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_cte.c:477 +#: parser/parse_cte.c:471 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "検索カラム\\\"%s\\\"ã¯WITHå•ã„åˆã‚ã›ã®åˆ—リストã®ä¸­ã«ã‚りã¾ã›ã‚“" -#: parser/parse_cte.c:484 +#: parser/parse_cte.c:478 #, c-format msgid "search column \"%s\" specified more than once" msgstr "検索列\"%s\"ãŒè¤‡æ•°å›žæŒ‡å®šã•れã¦ã„ã¾ã™" -#: parser/parse_cte.c:493 +#: parser/parse_cte.c:487 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" msgstr "検索順åºåˆ—ã®åå‰\\\"%s\\\"ã¯ã™ã§ã«WITHå•ã„åˆã‚ã›ã®åˆ—リストã§ä½¿ã‚れã¦ã„ã¾ã™" -#: parser/parse_cte.c:510 +#: parser/parse_cte.c:504 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "循環列\"%s\"ãŒWITHå•ã„åˆã‚ã›ã®åˆ—リストã«å­˜åœ¨ã—ã¾ã›ã‚“" -#: parser/parse_cte.c:517 +#: parser/parse_cte.c:511 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "循環列\"%s\"ãŒè¤‡æ•°å›žæŒ‡å®šã•れã¦ã„ã¾ã™" -#: parser/parse_cte.c:526 +#: parser/parse_cte.c:520 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" msgstr "循環識別列ã®åå‰\\\"%s\\\"ã¯ã™ã§ã«WITHå•ã„åˆã‚ã›ã®åˆ—リストã§ä½¿ã‚れã¦ã„ã¾ã™" -#: parser/parse_cte.c:533 +#: parser/parse_cte.c:527 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" msgstr "循環経路列ã®åå‰\\\"%s\\\"ã¯ã™ã§ã«WITHå•ã„åˆã‚ã›ã®åˆ—リストã§ä½¿ã‚れã¦ã„ã¾ã™" -#: parser/parse_cte.c:541 +#: parser/parse_cte.c:535 #, c-format msgid "cycle mark column name and cycle path column name are the same" msgstr "循環識別列ã¨å¾ªç’°çµŒè·¯åˆ—ã®åå‰ãŒåŒä¸€ã§ã™" -#: parser/parse_cte.c:551 +#: parser/parse_cte.c:545 #, c-format msgid "search sequence column name and cycle mark column name are the same" msgstr "検索順åºåˆ—ã¨å¾ªç’°è­˜åˆ¥åˆ—ã®åå‰ãŒåŒä¸€ã§ã™" -#: parser/parse_cte.c:558 +#: parser/parse_cte.c:552 #, c-format msgid "search sequence column name and cycle path column name are the same" msgstr "検索順åºåˆ—ã¨å¾ªç’°çµŒè·¯åˆ—ã®åå‰ãŒåŒä¸€ã§ã™" -#: parser/parse_cte.c:642 +#: parser/parse_cte.c:636 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "WITHå•ã„åˆã‚ã›\"%s\"ã«ã¯%d列ã—ã‹ã‚りã¾ã›ã‚“ãŒã€%d列指定ã•れã¦ã„ã¾ã™" -#: parser/parse_cte.c:822 +#: parser/parse_cte.c:816 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "WITH項目間ã®å†å¸°ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_cte.c:874 +#: parser/parse_cte.c:868 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "å†å¸°å•ã„åˆã‚ã›\"%s\"ã¯ãƒ‡ãƒ¼ã‚¿ã‚’æ›´æ–°ã™ã‚‹ã‚¹æ–‡ã‚’å«ã‚“ã§ã„ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: parser/parse_cte.c:882 +#: parser/parse_cte.c:876 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "å†å¸°å•ã„åˆã‚ã›\"%s\"ãŒã€<éžå†å¸°é …> UNION [ALL] <å†å¸°é …> ã®å½¢å¼ã«ãªã£ã¦ã„ã¾ã›ã‚“" -#: parser/parse_cte.c:926 +#: parser/parse_cte.c:911 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "å†å¸°å•ã„åˆã‚ã›å†…ã® ORDER BY ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_cte.c:932 +#: parser/parse_cte.c:917 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "å†å¸°å•ã„åˆã‚ã›å†…ã® OFFSET ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_cte.c:938 +#: parser/parse_cte.c:923 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "å†å¸°å•ã„åˆã‚ã›å†…ã® LIMIT ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_cte.c:944 +#: parser/parse_cte.c:929 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "å†å¸°å•ã„åˆã‚ã›å†…ã® FOR UPDATE/SHARE ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_cte.c:1001 +#: parser/parse_cte.c:1008 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "å•ã„åˆã‚ã›\"%s\"ã¸ã®å†å¸°å‚ç…§ãŒ2回以上ç¾ã‚Œã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: parser/parse_expr.c:294 +#: parser/parse_expr.c:313 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "ã“ã®æ–‡è„ˆã§ã¯DEFAULTã¯ä½¿ãˆã¾ã›ã‚“" -#: parser/parse_expr.c:371 parser/parse_relation.c:3687 parser/parse_relation.c:3697 parser/parse_relation.c:3715 parser/parse_relation.c:3722 parser/parse_relation.c:3736 +#: parser/parse_expr.c:406 parser/parse_relation.c:3691 parser/parse_relation.c:3701 parser/parse_relation.c:3719 parser/parse_relation.c:3726 parser/parse_relation.c:3740 #, c-format msgid "column %s.%s does not exist" msgstr "列%s.%sã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: parser/parse_expr.c:383 +#: parser/parse_expr.c:418 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "データ型%2$sã®åˆ—\"%1$s\"ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_expr.c:389 +#: parser/parse_expr.c:424 #, c-format msgid "could not identify column \"%s\" in record data type" -msgstr "レコードデータ型ã®åˆ—\"%s\"を識別ã§ãã¾ã›ã‚“ã§ã—ãŸ" +msgstr "レコードデータ型ã®åˆ—\"%s\"を特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: parser/parse_expr.c:395 +#: parser/parse_expr.c:430 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "列記法 .%sãŒåž‹%sã«ä½¿ç”¨ã•れã¾ã—ãŸãŒã€ã“ã®åž‹ã¯è¤‡åˆåž‹ã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_expr.c:426 parser/parse_target.c:733 +#: parser/parse_expr.c:461 parser/parse_target.c:732 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "\"*\"を通ã—ãŸè¡Œå±•é–‹ã¯ã€ã“ã“ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_expr.c:548 +#: parser/parse_expr.c:584 msgid "cannot use column reference in DEFAULT expression" msgstr "列å‚ç…§ã¯DEFAULTå¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:551 +#: parser/parse_expr.c:587 msgid "cannot use column reference in partition bound expression" msgstr "列å‚ç…§ã¯ãƒ‘ーティション境界å¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:810 parser/parse_relation.c:833 parser/parse_relation.c:915 parser/parse_target.c:1225 +#: parser/parse_expr.c:846 parser/parse_relation.c:833 parser/parse_relation.c:915 parser/parse_target.c:1238 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "列å‚ç…§\"%s\"ã¯æ›–昧ã§ã™" -#: parser/parse_expr.c:866 parser/parse_param.c:110 parser/parse_param.c:142 parser/parse_param.c:204 parser/parse_param.c:303 +#: parser/parse_expr.c:902 parser/parse_param.c:110 parser/parse_param.c:142 parser/parse_param.c:204 parser/parse_param.c:303 #, c-format msgid "there is no parameter $%d" msgstr "パラメータ$%dãŒã‚りã¾ã›ã‚“" -#: parser/parse_expr.c:1066 +#. translator: %s is name of a SQL construct, eg NULLIF +#: parser/parse_expr.c:1103 parser/parse_expr.c:3073 #, c-format -msgid "NULLIF requires = operator to yield boolean" -msgstr "NULLIF ã§ã¯ = 演算å­ãŒ boolean ã‚’è¿”ã™å¿…è¦ãŒã‚りã¾ã™" +msgid "%s requires = operator to yield boolean" +msgstr "%sã¯çœŸå½å€¤ã‚’å¾—ã‚‹ãŸã‚ã« = 演算å­ã‚’å¿…è¦ã¨ã—ã¾ã™" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1072 parser/parse_expr.c:3007 +#: parser/parse_expr.c:1109 parser/parse_expr.c:3080 #, c-format msgid "%s must not return a set" msgstr "%sã¯é›†åˆã‚’è¿”ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: parser/parse_expr.c:1457 parser/parse_expr.c:1489 +#: parser/parse_expr.c:1395 +#, c-format +msgid "MERGE_ACTION() can only be used in the RETURNING list of a MERGE command" +msgstr "MERGE_ACTION()ã¯MERGEコマンドã®RETURNINGリストã®ä¸­ã§ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™" + +#: parser/parse_expr.c:1519 parser/parse_expr.c:1551 #, c-format msgid "number of columns does not match number of values" msgstr "åˆ—ã®æ•°ãŒVALUESã®æ•°ã¨ä¸€è‡´ã—ã¾ã›ã‚“" -#: parser/parse_expr.c:1503 +#: parser/parse_expr.c:1565 #, c-format msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" msgstr "複数列ã®UPDATEé …ç›®ã®ã‚½ãƒ¼ã‚¹ã¯å‰¯å•åˆã›ã¾ãŸã¯ROW()å¼ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1698 parser/parse_expr.c:2180 parser/parse_func.c:2677 +#: parser/parse_expr.c:1760 parser/parse_expr.c:2251 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "集åˆè¿”å´é–¢æ•°ã¯%sã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1761 +#: parser/parse_expr.c:1824 msgid "cannot use subquery in check constraint" msgstr "検査制約ã§ã¯å‰¯å•ã„åˆã‚ã›ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1765 +#: parser/parse_expr.c:1828 msgid "cannot use subquery in DEFAULT expression" msgstr "DEFAULTå¼ã«ã¯å‰¯å•ã„åˆã‚ã›ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1768 +#: parser/parse_expr.c:1831 msgid "cannot use subquery in index expression" msgstr "å¼ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã«ã¯å‰¯å•ã„åˆã‚ã›ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1771 +#: parser/parse_expr.c:1834 msgid "cannot use subquery in index predicate" msgstr "インデックスã®è¿°éƒ¨ã«å‰¯å•ã„åˆã‚ã›ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1774 +#: parser/parse_expr.c:1837 msgid "cannot use subquery in statistics expression" msgstr "時計情報å¼ã§ã¯å‰¯å•ã„åˆã‚ã›ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1777 +#: parser/parse_expr.c:1840 msgid "cannot use subquery in transform expression" msgstr "変æ›å¼ã§ã¯å‰¯å•ã„åˆã‚ã›ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1780 +#: parser/parse_expr.c:1843 msgid "cannot use subquery in EXECUTE parameter" msgstr "EXECUTEã®ãƒ‘ラメータã«å‰¯å•ã„åˆã‚ã›ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1783 +#: parser/parse_expr.c:1846 msgid "cannot use subquery in trigger WHEN condition" msgstr "トリガー㮠WHEN æ¡ä»¶ã§ã¯å‰¯å•ã„åˆã‚ã›ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1786 +#: parser/parse_expr.c:1849 msgid "cannot use subquery in partition bound" msgstr "副å•ã„åˆã‚ã›ã¯ãƒ‘ーティション境界ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1789 +#: parser/parse_expr.c:1852 msgid "cannot use subquery in partition key expression" msgstr "パーティションキーå¼ã§ã¯å‰¯å•ã„åˆã‚ã›ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1792 +#: parser/parse_expr.c:1855 msgid "cannot use subquery in CALL argument" msgstr "CALLã®å¼•æ•°ã§å‰¯å•ã„åˆã‚ã›ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1795 +#: parser/parse_expr.c:1858 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "副å•ã„åˆã‚ã›ã¯ COPY FROM ã® WHERE æ¡ä»¶ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1798 +#: parser/parse_expr.c:1861 msgid "cannot use subquery in column generation expression" msgstr "副å•ã„åˆã‚ã›ã¯ã‚«ãƒ©ãƒ ç”Ÿæˆå¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:1851 parser/parse_expr.c:3632 +#: parser/parse_expr.c:1914 parser/parse_expr.c:3772 #, c-format msgid "subquery must return only one column" msgstr "副å•ã„åˆã‚ã›ã¯1列ã®ã¿ã‚’è¿”ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_expr.c:1922 +#: parser/parse_expr.c:1985 #, c-format msgid "subquery has too many columns" msgstr "副å•ã„åˆã‚ã›ã®åˆ—ãŒå¤šã™ãŽã¾ã™" -#: parser/parse_expr.c:1927 +#: parser/parse_expr.c:1990 #, c-format msgid "subquery has too few columns" msgstr "副å•ã„åˆã‚ã›ã®åˆ—ãŒå°‘ãªã™ãŽã¾ã™" -#: parser/parse_expr.c:2023 +#: parser/parse_expr.c:2094 #, c-format msgid "cannot determine type of empty array" msgstr "空ã®é…列ã®ãƒ‡ãƒ¼ã‚¿åž‹ã‚’決定ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:2024 +#: parser/parse_expr.c:2095 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "å¿…è¦ãªåž‹ã«æ˜Žç¤ºçš„ã«ã‚­ãƒ£ã‚¹ãƒˆã—ã¦ãã ã•ã„。例: ARRAY[]::integer[]" -#: parser/parse_expr.c:2038 +#: parser/parse_expr.c:2109 #, c-format msgid "could not find element type for data type %s" msgstr "データ型%sã®è¦ç´ ã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸ" -#: parser/parse_expr.c:2121 +#: parser/parse_expr.c:2192 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "ROWå¼ã¯æœ€å¤§ã§ã‚‚%dエントリã¾ã§ã—ã‹æŒã¦ã¾ã›ã‚“" -#: parser/parse_expr.c:2326 +#: parser/parse_expr.c:2397 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "ç„¡åã®XML属性値ã¯åˆ—å‚ç…§ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_expr.c:2327 +#: parser/parse_expr.c:2398 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "ç„¡åã®XMLè¦ç´ å€¤ã¯åˆ—å‚ç…§ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_expr.c:2342 +#: parser/parse_expr.c:2413 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "XML属性å\"%s\"ãŒè¤‡æ•°ã‚りã¾ã™" -#: parser/parse_expr.c:2450 +#: parser/parse_expr.c:2521 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "XMLSERIALIZE ã®çµæžœã‚’ %s ã¸ã‚­ãƒ£ã‚¹ãƒˆã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:2764 parser/parse_expr.c:2960 +#: parser/parse_expr.c:2835 parser/parse_expr.c:3031 #, c-format msgid "unequal number of entries in row expressions" msgstr "行å¼ã«ãŠã„ã¦é …目数ãŒä¸€è‡´ã—ã¾ã›ã‚“" -#: parser/parse_expr.c:2774 +#: parser/parse_expr.c:2845 #, c-format msgid "cannot compare rows of zero length" msgstr "é•·ã•0ã®è¡Œã‚’比較ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:2799 +#: parser/parse_expr.c:2870 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "行比較演算å­ã¯åž‹%sã§ã¯ãªãbooleanã‚’è¿”ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_expr.c:2806 +#: parser/parse_expr.c:2877 #, c-format msgid "row comparison operator must not return a set" msgstr "行比較演算å­ã¯é›†åˆã‚’è¿”ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“" -#: parser/parse_expr.c:2865 parser/parse_expr.c:2906 +#: parser/parse_expr.c:2936 parser/parse_expr.c:2977 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "行比較演算å­%sã®è§£é‡ˆã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: parser/parse_expr.c:2867 +#: parser/parse_expr.c:2938 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "行比較演算å­ã¯btreeæ¼”ç®—å­æ—ã¨é–¢é€£ä»˜ã‘ã•れãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: parser/parse_expr.c:2908 +#: parser/parse_expr.c:2979 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "åŒç¨‹åº¦ã®é©åˆåº¦ã®å€™è£œãŒè¤‡æ•°å­˜åœ¨ã—ã¾ã™ã€‚" -#: parser/parse_expr.c:3001 -#, c-format -msgid "IS DISTINCT FROM requires = operator to yield boolean" -msgstr "IS DISTINCT FROMã§ã¯=演算å­ã¯booleanã‚’è¿”ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“" - -#: parser/parse_expr.c:3254 +#: parser/parse_expr.c:3314 #, c-format msgid "JSON ENCODING clause is only allowed for bytea input type" msgstr "JSON ENCODINGå¥ã¯å…¥åŠ›åž‹ãŒbyteaã®å ´åˆã«ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™" -#: parser/parse_expr.c:3261 -#, c-format -msgid "FORMAT JSON has no effect for json and jsonb types" -msgstr "FORMAT JSONã¯jsonãŠã‚ˆã³jsonbåž‹ã«å¯¾ã—ã¦ã¯åŠ¹æžœãŒã‚りã¾ã›ã‚“" - -#: parser/parse_expr.c:3284 +#: parser/parse_expr.c:3378 #, c-format msgid "cannot use non-string types with implicit FORMAT JSON clause" msgstr "éžæ–‡å­—åˆ—åž‹ã¯æš—é»™ã®FORMAT JSONå¥ã¨ã¨ã‚‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:3354 +#: parser/parse_expr.c:3379 +#, c-format +msgid "cannot use non-string types with explicit FORMAT JSON clause" +msgstr "éžæ–‡å­—åˆ—åž‹ã¯æ˜Žç¤ºçš„ãªFORMAT JSONå¥ã¨ã¨ã‚‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#: parser/parse_expr.c:3468 #, c-format msgid "cannot use JSON format with non-string output types" msgstr "JSONフォーマットã¯éžæ–‡å­—列出力型ã¨ã¨ã‚‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:3367 +#: parser/parse_expr.c:3481 #, c-format msgid "cannot set JSON encoding for non-bytea output types" msgstr "bytrea以外ã®å‡ºåŠ›åž‹ã«å¯¾ã—ã¦ã¯JSON符å·åŒ–æ–¹å¼ã¯è¨­å®šã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:3372 +#: parser/parse_expr.c:3486 #, c-format msgid "unsupported JSON encoding" msgstr "サãƒãƒ¼ãƒˆã•れã¦ãªã„JSON符å·åŒ–æ–¹å¼" -#: parser/parse_expr.c:3373 +#: parser/parse_expr.c:3487 #, c-format msgid "Only UTF8 JSON encoding is supported." msgstr "JSON符å·åŒ–æ–¹å¼ã§ã¯UTF8ã®ã¿ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™ã€‚" -#: parser/parse_expr.c:3410 +#: parser/parse_expr.c:3524 #, c-format msgid "returning SETOF types is not supported in SQL/JSON functions" msgstr "SQL/JSON関数ã§ã¯SETOFåž‹ã®è¿”å´ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_expr.c:3711 parser/parse_func.c:865 +#: parser/parse_expr.c:3529 +#, c-format +msgid "returning pseudo-types is not supported in SQL/JSON functions" +msgstr "SQL/JSON関数ã§ã¯ç–‘似型ã®è¿”å´ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" + +#: parser/parse_expr.c:3857 parser/parse_func.c:866 #, c-format msgid "aggregate ORDER BY is not implemented for window functions" msgstr "ウィンドウ関数ã«å¯¾ã™ã‚‹é›†ç´„ã® ORDER BY ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_expr.c:3930 +#: parser/parse_expr.c:4080 #, c-format msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" msgstr "bytrea以外ã®å…¥åŠ›åž‹ã«å¯¾ã—ã¦ã¯ JSON FORMAT ENCODINGå¥ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_expr.c:3950 +#: parser/parse_expr.c:4100 #, c-format msgid "cannot use type %s in IS JSON predicate" msgstr "JSON述語ã§ã¯åž‹%sを使用ã§ãã¾ã›ã‚“" +#: parser/parse_expr.c:4126 parser/parse_expr.c:4247 +#, c-format +msgid "cannot use type %s in RETURNING clause of %s" +msgstr "%s()ã®RETURNING節ã§ã¯åž‹%sã¯æŒ‡å®šã§ãã¾ã›ã‚“" + +#: parser/parse_expr.c:4128 +#, c-format +msgid "Try returning json or jsonb." +msgstr "jsonã¾ãŸã¯jsonbã§ã®è¿”å´ã‚’試ã—ã¦ãã ã•ã„。" + +#: parser/parse_expr.c:4176 +#, c-format +msgid "cannot use non-string types with WITH UNIQUE KEYS clause" +msgstr "éžæ–‡å­—列型ã¯WITH UNIQUE KEYSå¥ã¨ã¨ã‚‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#: parser/parse_expr.c:4250 +#, c-format +msgid "Try returning a string type or bytea." +msgstr "文字列型ã¾ãŸã¯BYTEAåž‹ã§ã®è¿”å´ã‚’試ã—ã¦ãã ã•ã„。" + +#: parser/parse_expr.c:4315 +#, c-format +msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" +msgstr "%s()ã®RETURNING節ã§ã¯FORMAT JSONã¯æŒ‡å®šã§ãã¾ã›ã‚“" + +#: parser/parse_expr.c:4328 +#, c-format +msgid "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" +msgstr "WITH WRAPPERãŒä½¿ã‚れã¦ã‚‹ã¨ãã«ã¯SQL/JSONã®QUOTESã®æŒ™å‹•ã¯æŒ‡å®šã§ãã¾ãˆã‚“" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4342 parser/parse_expr.c:4371 parser/parse_expr.c:4402 parser/parse_expr.c:4428 parser/parse_expr.c:4454 parser/parse_jsontable.c:94 +#, c-format +msgid "invalid %s behavior" +msgstr "䏿­£ãª%s挙動指定" + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4345 parser/parse_expr.c:4374 +#, c-format +msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s." +msgstr "%2$sã«å¯¾ã™ã‚‹%1$så¥ã§ã¯ERROR, NULL, EMPTY ARRAY, EMPTY OBJECTã¾ãŸã¯DEFAULTå¼ã®ã¿ãŒä½¿ç”¨å¯èƒ½ã§ã™ã€‚" + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4352 parser/parse_expr.c:4381 parser/parse_expr.c:4410 parser/parse_expr.c:4438 parser/parse_expr.c:4464 +#, c-format +msgid "invalid %s behavior for column \"%s\"" +msgstr "列\"%s\"ã«å¯¾ã™ã‚‹ä¸æ­£ãª%s挙動指定" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4355 parser/parse_expr.c:4384 +#, c-format +msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns." +msgstr "フォーマット化対象列ã«å¯¾ã™ã‚‹%så¥ã§ã¯ERROR, NULL, EMPTY ARRAY, EMPTY OBJECTã¾ãŸã¯DEFAULTå¼ã®ã¿ãŒä½¿ç”¨å¯èƒ½ã§ã™ã€‚" + +#: parser/parse_expr.c:4403 +#, c-format +msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s." +msgstr "%2$sã«å¯¾ã™ã‚‹%1$så¥ã§ã¯ERROR, TRUE, FALSEã¾ãŸã¯UNKNOWNã®ã¿ãŒä½¿ç”¨å¯èƒ½ã§ã™ã€‚" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4413 +#, c-format +msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns." +msgstr "EXIST列ã«å¯¾ã™ã‚‹%så¥ã§ã¯ERROR, TRUE, FALSEã¾ãŸã¯UNKNOWNã®ã¿ãŒä½¿ç”¨å¯èƒ½ã§ã™ã€‚" + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4431 parser/parse_expr.c:4457 +#, c-format +msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s." +msgstr "%2$sã«å¯¾ã™ã‚‹%1$så¥ã§ã¯ERROR, NULLã¾ãŸã¯DEFAULTå¼ã®ã¿ãŒä½¿ç”¨å¯èƒ½ã§ã™ã€‚" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4441 parser/parse_expr.c:4467 +#, c-format +msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns." +msgstr "スカラー列ã«å¯¾ã™ã‚‹%så¥ã§ã¯ERROR, NULLã¾ãŸã¯DEFAULTå¼ã®ã¿ãŒä½¿ç”¨å¯èƒ½ã§ã™ã€‚" + +#: parser/parse_expr.c:4497 +#, c-format +msgid "JSON path expression must be of type %s, not of type %s" +msgstr "JSONパスå¼ã¯åž‹%2$sã§ã¯ãªã%1$såž‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#: parser/parse_expr.c:4715 +#, c-format +msgid "can only specify a constant, non-aggregate function, or operator expression for DEFAULT" +msgstr "DEFAULTã«ã¯å®šæ•°ã€éžé›†ç´„関数ã€ãŠã‚ˆã³æ¼”ç®—å­å¼ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™" + +#: parser/parse_expr.c:4720 +#, c-format +msgid "DEFAULT expression must not contain column references" +msgstr "DEFAULTå¼ã¯åˆ—å‚ç…§ã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“" + +#: parser/parse_expr.c:4725 +#, c-format +msgid "DEFAULT expression must not return a set" +msgstr "DEFAULTå¼ã¯é›†åˆã‚’è¿”ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“" + +#: parser/parse_expr.c:4801 parser/parse_expr.c:4810 +#, c-format +msgid "cannot cast behavior expression of type %s to %s" +msgstr "åž‹%sã®æŒ™å‹•å¼ã®%sã¸ã®åž‹å¤‰æ›ã¯ã§ãã¾ã›ã‚“" + +#: parser/parse_expr.c:4804 +#, c-format +msgid "You will need to explicitly cast the expression to type %s." +msgstr "å¼ã‚’%såž‹ã«æ˜Žç¤ºçš„ã«ã‚­ãƒ£ã‚¹ãƒˆã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" + #: parser/parse_func.c:194 #, c-format msgid "argument name \"%s\" used more than once" @@ -17305,7 +17882,7 @@ msgstr "引数å\"%s\"ãŒè¤‡æ•°å›žæŒ‡å®šã•れã¾ã—ãŸ" msgid "positional argument cannot follow named argument" msgstr "ä½ç½®ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ãƒ¼ã®æ¬¡ã«ã¯åå‰ä»˜ãã®å¼•数を指定ã§ãã¾ã›ã‚“。" -#: parser/parse_func.c:287 parser/parse_func.c:2367 +#: parser/parse_func.c:287 parser/parse_func.c:2368 #, c-format msgid "%s is not a procedure" msgstr "%sã¯ãƒ—ロシージャã§ã¯ã‚りã¾ã›ã‚“" @@ -17422,7 +17999,7 @@ msgstr "最善ã®å€™è£œé–¢æ•°ã‚’é¸æŠžã§ãã¾ã›ã‚“ã§ã—ãŸã€‚明示的ãªåž‹ msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." msgstr "指定ã—ãŸåå‰ã¨å¼•æ•°åž‹ã«åˆè‡´ã™ã‚‹é›†ç´„関数ãŒã‚りã¾ã›ã‚“。ãŠãらã ORDER BY ã®ä½ç½®ã«èª¤ã‚ŠãŒã‚りã¾ã™ã€‚ORDER BY ã¯é›†ç´„関数ã®ã™ã¹ã¦ã®é€šå¸¸ã®å¼•æ•°ã®å¾Œã«ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: parser/parse_func.c:622 parser/parse_func.c:2410 +#: parser/parse_func.c:622 parser/parse_func.c:2411 #, c-format msgid "procedure %s does not exist" msgstr "プロシージャ %s ã¯å­˜åœ¨ã—ã¾ã›ã‚“" @@ -17442,7 +18019,7 @@ msgstr "指定ã—ãŸåå‰ã¨å¼•æ•°åž‹ã«åˆè‡´ã™ã‚‹é–¢æ•°ãŒã‚りã¾ã›ã‚“。 msgid "VARIADIC argument must be an array" msgstr "VARIADIC引数ã¯é…列ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_func.c:791 parser/parse_func.c:855 +#: parser/parse_func.c:791 parser/parse_func.c:856 #, c-format msgid "%s(*) must be used to call a parameterless aggregate function" msgstr "%s(*)ã¯ãƒ‘ラメータãŒãªã„集約関数ã®å‘¼ã³å‡ºã—ã«ä½¿ç”¨ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" @@ -17457,261 +18034,256 @@ msgstr "集約ã¯é›†åˆã‚’è¿”ã›ã¾ã›ã‚“" msgid "aggregates cannot use named arguments" msgstr "集約ã§ã¯åå‰ä»˜ã引数ã¯ä½¿ãˆã¾ã›ã‚“" -#: parser/parse_func.c:845 +#: parser/parse_func.c:846 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "ウィンドウ関数ã«å¯¾ã™ã‚‹DISTINCTã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_func.c:874 +#: parser/parse_func.c:875 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "éžé›†ç´„ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦é–¢æ•°ã«å¯¾ã™ã‚‹FILTERã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_func.c:883 +#: parser/parse_func.c:884 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "集約関数ã®å‘¼ã³å‡ºã—ã«é›†åˆè¿”å´é–¢æ•°ã®å‘¼ã³å‡ºã—ã‚’å«ã‚€ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:891 +#: parser/parse_func.c:892 #, c-format msgid "window functions cannot return sets" msgstr "ウィンドウ関数ã¯é›†åˆã‚’è¿”ã™ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2166 parser/parse_func.c:2439 +#: parser/parse_func.c:2167 parser/parse_func.c:2440 #, c-format msgid "could not find a function named \"%s\"" msgstr "\"%s\"ã¨ã„ã†åå‰ã®é–¢æ•°ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: parser/parse_func.c:2180 parser/parse_func.c:2457 +#: parser/parse_func.c:2181 parser/parse_func.c:2458 #, c-format msgid "function name \"%s\" is not unique" msgstr "関数å\"%s\"ã¯ä¸€æ„ã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_func.c:2182 parser/parse_func.c:2460 +#: parser/parse_func.c:2183 parser/parse_func.c:2461 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "関数を曖昧ã•ãªãé¸æŠžã™ã‚‹ã«ã¯å¼•数リストを指定ã—ã¦ãã ã•ã„。" -#: parser/parse_func.c:2226 +#: parser/parse_func.c:2227 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" msgstr[0] "プロシージャã¯%d個以上ã®å¼•æ•°ã‚’å–ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2357 +#: parser/parse_func.c:2358 #, c-format msgid "%s is not a function" msgstr "%s ã¯é–¢æ•°ã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_func.c:2377 +#: parser/parse_func.c:2378 #, c-format msgid "function %s is not an aggregate" msgstr "関数%sã¯é›†ç´„ã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_func.c:2405 +#: parser/parse_func.c:2406 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "\"%s\"ã¨ã„ã†åå‰ã®ãƒ—ロシージャã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: parser/parse_func.c:2419 +#: parser/parse_func.c:2420 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "\"%s\"ã¨ã„ã†åå‰ã®é›†ç´„ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: parser/parse_func.c:2424 +#: parser/parse_func.c:2425 #, c-format msgid "aggregate %s(*) does not exist" msgstr "集約%s(*)ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: parser/parse_func.c:2429 +#: parser/parse_func.c:2430 #, c-format msgid "aggregate %s does not exist" msgstr "集約%sã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: parser/parse_func.c:2465 +#: parser/parse_func.c:2466 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "プロシージャå\"%s\"ã¯ä¸€æ„ã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_func.c:2468 +#: parser/parse_func.c:2469 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "プロシージャを曖昧ã•ãªãé¸æŠžã™ã‚‹ã«ã¯å¼•数リストを指定ã—ã¦ãã ã•ã„。" -#: parser/parse_func.c:2473 +#: parser/parse_func.c:2474 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "集約å\"%s\"ã¯ä¸€æ„ã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_func.c:2476 +#: parser/parse_func.c:2477 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "集約を曖昧ã•ãªãé¸æŠžã™ã‚‹ã«ã¯å¼•数リストを指定ã—ã¦ãã ã•ã„。" -#: parser/parse_func.c:2481 +#: parser/parse_func.c:2482 #, c-format msgid "routine name \"%s\" is not unique" msgstr "ルーãƒãƒ³å\"%s\"ã¯ä¸€æ„ã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_func.c:2484 +#: parser/parse_func.c:2485 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "ルーãƒãƒ³ã‚’曖昧ã•ãªãé¸æŠžã™ã‚‹ã«ã¯å¼•数リストを指定ã—ã¦ãã ã•ã„。" -#: parser/parse_func.c:2539 +#: parser/parse_func.c:2540 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "集åˆè¿”å´é–¢æ•°ã¯JOINæ¡ä»¶ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2560 +#: parser/parse_func.c:2561 msgid "set-returning functions are not allowed in policy expressions" msgstr "集åˆè¿”å´é–¢æ•°ã¯ãƒãƒªã‚·å¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2576 +#: parser/parse_func.c:2577 msgid "set-returning functions are not allowed in window definitions" msgstr "ウィンドウ定義ã§ã¯é›†åˆè¿”å´é–¢æ•°ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2613 +#: parser/parse_func.c:2615 msgid "set-returning functions are not allowed in MERGE WHEN conditions" msgstr "集åˆè¿”å´é–¢æ•°ã¯MERGE WHENæ¡ä»¶ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2617 +#: parser/parse_func.c:2619 msgid "set-returning functions are not allowed in check constraints" msgstr "集åˆè¿”å´é–¢æ•°ã¯æ¤œæŸ»åˆ¶ç´„ã®ä¸­ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2621 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "集åˆè¿”å´é–¢æ•°ã¯DEFAULTå¼ã®ä¸­ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2624 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index expressions" msgstr "集åˆè¿”å´é–¢æ•°ã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2627 +#: parser/parse_func.c:2629 msgid "set-returning functions are not allowed in index predicates" msgstr "集åˆè¿”å´é–¢æ•°ã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹è¿°èªžã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2630 +#: parser/parse_func.c:2632 msgid "set-returning functions are not allowed in statistics expressions" msgstr "集åˆè¿”å´é–¢æ•°ã¯çµ±è¨ˆæƒ…å ±å¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2633 +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in transform expressions" msgstr "集åˆè¿”å´é–¢æ•°ã¯å¤‰æ›å¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2636 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "集åˆè¿”å´é–¢æ•°ã¯EXECUTEパラメータã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2639 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "集åˆè¿”å´é–¢æ•°ã¯ãƒˆãƒªã‚¬ã®WHENæ¡ä»¶ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2642 +#: parser/parse_func.c:2644 msgid "set-returning functions are not allowed in partition bound" msgstr "集åˆè¿”å´é–¢æ•°ã¯ãƒ‘ーティション境界ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2645 +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in partition key expressions" msgstr "集åˆè¿”å´é–¢æ•°ã¯ãƒ‘ーティションキーå¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2648 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in CALL arguments" msgstr "CALLã®å¼•æ•°ã«é›†åˆè¿”å´é–¢æ•°ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2651 +#: parser/parse_func.c:2653 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "集åˆè¿”å´é–¢æ•°ã¯ COPY FROM ã® WHEREæ¡ä»¶ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_func.c:2654 +#: parser/parse_func.c:2656 msgid "set-returning functions are not allowed in column generation expressions" msgstr "集åˆè¿”å´é–¢æ•°ã¯ã‚«ãƒ©ãƒ ç”Ÿæˆå¼ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_merge.c:119 +#: parser/parse_jsontable.c:95 +#, c-format +msgid "Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause." +msgstr "最上ä½ã®ON ERRORå¥ã§ã¯EMPTY [ ARRAY ] ã¾ãŸERRORã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™ã€‚" + +#: parser/parse_jsontable.c:189 parser/parse_jsontable.c:203 +#, c-format +msgid "duplicate JSON_TABLE column or path name: %s" +msgstr "JSON_TABLEã®ã‚«ãƒ©ãƒ ã¾ãŸã¯ãƒ‘スåã®é‡è¤‡: %s" + +#: parser/parse_merge.c:129 #, c-format msgid "WITH RECURSIVE is not supported for MERGE statement" msgstr "MERGEæ–‡ã§ã¯WITH RECURSIVEã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: parser/parse_merge.c:161 +#: parser/parse_merge.c:176 #, c-format msgid "unreachable WHEN clause specified after unconditional WHEN clause" msgstr "ç„¡æ¡ä»¶WHENå¥ã®å¾Œã«æŒ‡å®šã•れã¦åˆ°é”ä¸èƒ½ãªWHENå¥" -#: parser/parse_merge.c:191 -#, c-format -msgid "MERGE is not supported for relations with rules." -msgstr "MERGEã¯ãƒ«ãƒ¼ãƒ«ã‚’æŒã¤ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。" - -#: parser/parse_merge.c:208 +#: parser/parse_merge.c:222 #, c-format msgid "name \"%s\" specified more than once" msgstr "åå‰\"%s\"ãŒè¤‡æ•°å›žæŒ‡å®šã•れã¦ã„ã¾ã™" -#: parser/parse_merge.c:210 +#: parser/parse_merge.c:224 #, c-format msgid "The name is used both as MERGE target table and data source." msgstr "ã“ã®åå‰ã¯MERGEã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ†ãƒ¼ãƒ–ルã¨ãƒ‡ãƒ¼ã‚¿ã‚½ãƒ¼ã‚¹ã®ä¸¡æ–¹ã§ä½¿ç”¨ã•れã¦ã„ã¾ã™" -#: parser/parse_node.c:87 +#: parser/parse_node.c:82 #, c-format msgid "target lists can have at most %d entries" msgstr "ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒªã‚¹ãƒˆã¯æœ€å¤§ã§ã‚‚%dエントリã¾ã§ã—ã‹æŒã¦ã¾ã›ã‚“" -#: parser/parse_oper.c:123 parser/parse_oper.c:690 +#: parser/parse_oper.c:114 parser/parse_oper.c:678 #, c-format msgid "postfix operators are not supported" msgstr "後置演算å­ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:509 utils/adt/regproc.c:683 -#, c-format -msgid "operator does not exist: %s" -msgstr "演算å­ãŒå­˜åœ¨ã—ã¾ã›ã‚“: %s" - -#: parser/parse_oper.c:229 +#: parser/parse_oper.c:217 #, c-format msgid "Use an explicit ordering operator or modify the query." msgstr "明示的ã«é †åºæ¼”ç®—å­ã‚’使用ã™ã‚‹ã‹å•ã„åˆã‚ã›ã‚’変更ã—ã¦ãã ã•ã„。" -#: parser/parse_oper.c:485 +#: parser/parse_oper.c:473 #, c-format msgid "operator requires run-time type coercion: %s" msgstr "演算å­ã«å®Ÿè¡Œæ™‚ã®åž‹å¼·åˆ¶ãŒå¿…è¦ã§ã™: %s" -#: parser/parse_oper.c:641 +#: parser/parse_oper.c:629 #, c-format msgid "operator is not unique: %s" msgstr "演算å­ã¯ä¸€æ„ã§ã¯ã‚りã¾ã›ã‚“: %s" -#: parser/parse_oper.c:643 +#: parser/parse_oper.c:631 #, c-format msgid "Could not choose a best candidate operator. You might need to add explicit type casts." msgstr "最善ã®å€™è£œæ¼”ç®—å­ã‚’é¸æŠžã§ãã¾ã›ã‚“ã§ã—ãŸã€‚明示的ãªåž‹ã‚­ãƒ£ã‚¹ãƒˆãŒå¿…è¦ã‹ã‚‚ã—れã¾ã›ã‚“" -#: parser/parse_oper.c:652 +#: parser/parse_oper.c:640 #, c-format msgid "No operator matches the given name and argument type. You might need to add an explicit type cast." msgstr "指定ã—ãŸåç§°ã¨å¼•æ•°ã®åž‹ã«åˆã†æ¼”ç®—å­ãŒã‚りã¾ã›ã‚“。明示的ãªåž‹ã‚­ãƒ£ã‚¹ãƒˆãŒå¿…è¦ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: parser/parse_oper.c:654 +#: parser/parse_oper.c:642 #, c-format msgid "No operator matches the given name and argument types. You might need to add explicit type casts." msgstr "指定ã—ãŸåç§°ã¨å¼•æ•°ã®åž‹ã«åˆã†æ¼”ç®—å­ãŒã‚りã¾ã›ã‚“。明示的ãªåž‹ã‚­ãƒ£ã‚¹ãƒˆãŒå¿…è¦ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: parser/parse_oper.c:714 parser/parse_oper.c:828 -#, c-format -msgid "operator is only a shell: %s" -msgstr "演算å­ã¯å˜ãªã‚‹ã‚·ã‚§ãƒ«ã§ã™: %s" - -#: parser/parse_oper.c:816 +#: parser/parse_oper.c:803 #, c-format msgid "op ANY/ALL (array) requires array on right side" msgstr "æ¼”ç®—å­ ANY/ALL (é…列) å³è¾ºã«é…列ãŒå¿…è¦ã§ã™" -#: parser/parse_oper.c:858 +#: parser/parse_oper.c:844 #, c-format msgid "op ANY/ALL (array) requires operator to yield boolean" msgstr "æ¼”ç®—å­ ANY/ALL (é…列) ã¯ãƒ–ール型を返ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_oper.c:863 +#: parser/parse_oper.c:849 #, c-format msgid "op ANY/ALL (array) requires operator not to return a set" msgstr "æ¼”ç®—å­ ANY/ALL (é…列) 集åˆã‚’è¿”ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“" @@ -17721,7 +18293,7 @@ msgstr "æ¼”ç®—å­ ANY/ALL (é…列) 集åˆã‚’è¿”ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“" msgid "inconsistent types deduced for parameter $%d" msgstr "パラメータ$%dã«ã¤ã„ã¦æŽ¨å®šã•れãŸåž‹ãŒä¸æ•´åˆã§ã™" -#: parser/parse_param.c:309 tcop/postgres.c:740 +#: parser/parse_param.c:309 tcop/postgres.c:744 #, c-format msgid "could not determine data type of parameter $%d" msgstr "パラメータ$%dã®ãƒ‡ãƒ¼ã‚¿åž‹ãŒç‰¹å®šã§ãã¾ã›ã‚“ã§ã—ãŸ" @@ -17741,12 +18313,12 @@ msgstr "テーブルå‚ç…§%uã¯æ›–昧ã§ã™" msgid "table name \"%s\" specified more than once" msgstr "テーブルå\"%s\"ãŒè¤‡æ•°æŒ‡å®šã•れã¾ã—ãŸ" -#: parser/parse_relation.c:494 parser/parse_relation.c:3629 parser/parse_relation.c:3638 +#: parser/parse_relation.c:494 parser/parse_relation.c:3633 parser/parse_relation.c:3642 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "テーブル\"%s\"用ã®FROMå¥ã«å¯¾ã™ã‚‹ä¸æ­£ãªå‚ç…§" -#: parser/parse_relation.c:498 parser/parse_relation.c:3640 +#: parser/parse_relation.c:498 parser/parse_relation.c:3644 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "テーブル\"%s\"ã®é …ç›®ãŒã‚りã¾ã™ãŒã€å•ã„åˆã‚ã›ã®ã“ã®éƒ¨åˆ†ã‹ã‚‰ã¯å‚ç…§ã§ãã¾ã›ã‚“。\"" @@ -17771,17 +18343,17 @@ msgstr "カラム生æˆå¼ã§ã¯ã‚·ã‚¹ãƒ†ãƒ åˆ—\"%s\"ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" msgid "cannot use system column \"%s\" in MERGE WHEN condition" msgstr "MERGE WHENæ¡ä»¶ã§ã¯ã‚·ã‚¹ãƒ†ãƒ åˆ—\"%s\"ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_relation.c:1236 parser/parse_relation.c:1690 parser/parse_relation.c:2387 +#: parser/parse_relation.c:1236 parser/parse_relation.c:1691 parser/parse_relation.c:2384 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "テーブル\"%s\"ã§ã¯%d列使用ã§ãã¾ã™ãŒã€%d列指定ã•れã¾ã—ãŸ" -#: parser/parse_relation.c:1444 +#: parser/parse_relation.c:1445 #, c-format msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." msgstr "\"%s\"ã¨ã„ã†WITHé …ç›®ã¯ã‚りã¾ã™ãŒã€ã“れã¯å•ã„åˆã‚ã›ã®ã“ã®éƒ¨åˆ†ã‹ã‚‰ã¯å‚ç…§ã§ãã¾ã›ã‚“。" -#: parser/parse_relation.c:1446 +#: parser/parse_relation.c:1447 #, c-format msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." msgstr "WITH RECURSIVE を使ã†ã‹ã€ã‚‚ã—ã㯠WITH é …ç›®ã®å ´æ‰€ã‚’変ãˆã¦å‰æ–¹å‚ç…§ã‚’ãªãã—ã¦ãã ã•ã„" @@ -17816,127 +18388,127 @@ msgstr "åˆ—å®šç¾©ãƒªã‚¹ãƒˆã¯æœ€å¤§ã§ã‚‚%dエントリã¾ã§ã—ã‹æŒã¦ã¾ã› msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "FROMå¥ã®é–¢æ•°\"%s\"ã®æˆ»ã‚Šå€¤åž‹%sã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_relation.c:1981 parser/parse_relation.c:2067 +#: parser/parse_relation.c:1981 parser/parse_relation.c:2066 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "FROM内ã®é–¢æ•°ã¯æœ€å¤§%d列ã¾ã§ã—ã‹è¿”å´ã§ãã¾ã›ã‚“" -#: parser/parse_relation.c:2097 +#: parser/parse_relation.c:2096 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "%s関数ã§ã¯%d列使用ã§ãã¾ã™ãŒã€%d列指定ã•れã¾ã—ãŸ" -#: parser/parse_relation.c:2179 +#: parser/parse_relation.c:2177 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "VALUESリスト\"%s\"ã¯%d列使用å¯èƒ½ã§ã™ãŒã€%dåˆ—ãŒæŒ‡å®šã•れã¾ã—ãŸ" -#: parser/parse_relation.c:2245 +#: parser/parse_relation.c:2242 #, c-format msgid "joins can have at most %d columns" msgstr "JOIN ã§æŒ‡å®šã§ãã‚‹ã®ã¯ã€æœ€å¤§ %d 列ã§ã™" -#: parser/parse_relation.c:2270 +#: parser/parse_relation.c:2267 #, c-format msgid "join expression \"%s\" has %d columns available but %d columns specified" msgstr "çµåˆå¼\"%s\"ã§ã¯%d列使用ã§ãã¾ã™ãŒã€%d列指定ã•れã¾ã—ãŸ" -#: parser/parse_relation.c:2360 +#: parser/parse_relation.c:2357 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "WITH å•ã„åˆã‚ã›\"%s\"ã«RETURNINGå¥ãŒã‚りã¾ã›ã‚“" -#: parser/parse_relation.c:3631 +#: parser/parse_relation.c:3635 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "テーブル別å\"%s\"ã‚’å‚ç…§ã—よã†ã¨ã—ã¦ã„ãŸã‚ˆã†ã§ã™ã€‚" -#: parser/parse_relation.c:3643 +#: parser/parse_relation.c:3647 #, c-format msgid "To reference that table, you must mark this subquery with LATERAL." msgstr "ãã®ãƒ†ãƒ¼ãƒ–ルをå‚ç…§ã™ã‚‹ãŸã‚ã«ã¯ã€ã“ã®å‰¯å•åˆã›ã‚’LATERALã¨ãƒžãƒ¼ã‚¯ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: parser/parse_relation.c:3649 +#: parser/parse_relation.c:3653 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "テーブル\"%s\"用ã®FROMå¥ã‚¨ãƒ³ãƒˆãƒªãŒã‚りã¾ã›ã‚“" -#: parser/parse_relation.c:3689 +#: parser/parse_relation.c:3693 #, c-format msgid "There are columns named \"%s\", but they are in tables that cannot be referenced from this part of the query." msgstr "\"%s\"ã¨ã„ã†åå‰ã®åˆ—ã¯ã‚りã¾ã™ãŒã€å•ã„åˆã‚ã›ã®ã“ã®éƒ¨åˆ†ã‹ã‚‰ã¯å‚ç…§ã§ããªã„テーブルã«å±žã—ã¦ã„ã¾ã™ã€‚" -#: parser/parse_relation.c:3691 +#: parser/parse_relation.c:3695 #, c-format msgid "Try using a table-qualified name." msgstr "テーブルåã§ä¿®é£¾ã—ãŸåå‰ã‚’試ã—ã¦ãã ã•ã„。" -#: parser/parse_relation.c:3699 +#: parser/parse_relation.c:3703 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "テーブル\"%2$s\"ã«ã¯\"%1$s\"ã¨ã„ã†åå‰ã®åˆ—ãŒã‚りã¾ã™ãŒã€å•ã„åˆã‚ã›ã®ã“ã®éƒ¨åˆ†ã‹ã‚‰ã¯å‚ç…§ã§ãã¾ã›ã‚“。" -#: parser/parse_relation.c:3702 +#: parser/parse_relation.c:3706 #, c-format msgid "To reference that column, you must mark this subquery with LATERAL." msgstr "ãã®åˆ—ã‚’å‚ç…§ã™ã‚‹ã«ã¯ã€ã“ã®å‰¯å•åˆã›ã‚’LATERALã¨ãƒžãƒ¼ã‚¯ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: parser/parse_relation.c:3704 +#: parser/parse_relation.c:3708 #, c-format msgid "To reference that column, you must use a table-qualified name." msgstr "ãã®åˆ—ã‚’å‚ç…§ã™ã‚‹ã«ã¯ã€ãƒ†ãƒ¼ãƒ–ルåã§ä¿®é£¾ã—ãŸåå‰ã‚’使ã†å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: parser/parse_relation.c:3724 +#: parser/parse_relation.c:3728 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "列\"%s.%s\"ã‚’å‚ç…§ã—よã†ã¨ã—ã¦ã„ãŸã‚ˆã†ã§ã™ã€‚" -#: parser/parse_relation.c:3738 +#: parser/parse_relation.c:3742 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "列\"%s.%s\"ã¾ãŸã¯åˆ—\"%s.%s\"ã‚’å‚ç…§ã—よã†ã¨ã—ã¦ã„ãŸã‚ˆã†ã§ã™ã€‚" -#: parser/parse_target.c:481 parser/parse_target.c:796 +#: parser/parse_target.c:480 parser/parse_target.c:795 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "システム列\"%s\"ã«ä»£å…¥ã§ãã¾ã›ã‚“" -#: parser/parse_target.c:509 +#: parser/parse_target.c:508 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "é…列è¦ç´ ã«DEFAULTを設定ã§ãã¾ã›ã‚“" -#: parser/parse_target.c:514 +#: parser/parse_target.c:513 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "サブフィールドã«DEFAULTを設定ã§ãã¾ã›ã‚“" -#: parser/parse_target.c:588 +#: parser/parse_target.c:587 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "列\"%s\"ã¯åž‹%sã§ã™ãŒã€å¼ã¯åž‹%sã§ã—ãŸ" -#: parser/parse_target.c:780 +#: parser/parse_target.c:779 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" msgstr "åž‹%3$sãŒè¤‡åˆåž‹ã§ã‚りã¾ã›ã‚“ã®ã§ã€åˆ—\"%2$s\"ã®ãƒ•ィールド\"%1$s\"ã«ä»£å…¥ã§ãã¾ã›ã‚“。" -#: parser/parse_target.c:789 +#: parser/parse_target.c:788 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" msgstr "データ型%3$sã®åˆ—ãŒã‚りã¾ã›ã‚“ã®ã§ã€åˆ—\"%2$s\"ã®ãƒ•ィールド\"%1$s\"ã«ä»£å…¥ã§ãã¾ã›ã‚“。" -#: parser/parse_target.c:869 +#: parser/parse_target.c:877 #, c-format msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" msgstr "\"%s\"ã¸ã®æ·»å­—付ã代入ã«ã¯åž‹%sãŒå¿…è¦ã§ã™ãŒã€å¼ã¯åž‹%sã§ã—ãŸ" -#: parser/parse_target.c:879 +#: parser/parse_target.c:887 #, c-format msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "サブフィールド\"%s\"ã¯åž‹%sã§ã™ãŒã€å¼ã¯åž‹%sã§ã—ãŸ" -#: parser/parse_target.c:1314 +#: parser/parse_target.c:1327 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "テーブル指定ã®ãªã„SELECT *ã¯ç„¡åйã§ã™" @@ -17956,7 +18528,7 @@ msgstr "%%TYPEå‚ç…§ãŒä¸é©åˆ‡ã§ã™(ドット区切りã®åå‰ãŒå¤šã™ãŽ msgid "type reference %s converted to %s" msgstr "åž‹å‚ç…§%sã¯%sã«å¤‰æ›ã•れã¾ã—ãŸ" -#: parser/parse_type.c:278 parser/parse_type.c:813 utils/cache/typcache.c:390 utils/cache/typcache.c:445 +#: parser/parse_type.c:278 parser/parse_type.c:813 utils/cache/typcache.c:397 utils/cache/typcache.c:452 #, c-format msgid "type \"%s\" is only a shell" msgstr "åž‹\"%s\"ã¯å˜ãªã‚‹ã‚·ã‚§ãƒ«ã§ã™" @@ -17976,327 +18548,322 @@ msgstr "型修正å­ã¯å˜ç´”ãªå®šæ•°ã¾ãŸã¯è­˜åˆ¥å­ã§ãªã‘れã°ãªã‚Šã¾ msgid "invalid type name \"%s\"" msgstr "䏿­£ãªåž‹å\"%s\"" -#: parser/parse_utilcmd.c:264 +#: parser/parse_utilcmd.c:263 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "パーティション親テーブルを継承ã®å­ãƒ†ãƒ¼ãƒ–ルã¨ã—ã¦ä½œæˆã¯ã§ãã¾ã›ã‚“" -#: parser/parse_utilcmd.c:580 +#: parser/parse_utilcmd.c:475 +#, c-format +msgid "cannot set logged status of a temporary sequence" +msgstr "一時シーケンスã®ãƒ­ã‚°å‡ºåŠ›çŠ¶æ…‹ã¯è¨­å®šã§ãã¾ã›ã‚“" + +#: parser/parse_utilcmd.c:611 #, c-format msgid "array of serial is not implemented" msgstr "連番(SERIAL)ã®é…列ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 parser/parse_utilcmd.c:730 +#: parser/parse_utilcmd.c:690 parser/parse_utilcmd.c:702 parser/parse_utilcmd.c:761 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"ã®åˆ—\"%1$s\"ã§NULL宣言ã¨NOT NULL宣言ãŒç«¶åˆã—ã¦ã„ã¾ã™" -#: parser/parse_utilcmd.c:683 +#: parser/parse_utilcmd.c:714 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"ã®åˆ—\"%1$s\"ã§è¤‡æ•°ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã®æŒ‡å®šãŒã‚りã¾ã™" -#: parser/parse_utilcmd.c:700 +#: parser/parse_utilcmd.c:731 #, c-format msgid "identity columns are not supported on typed tables" msgstr "型付ã‘ã•れãŸãƒ†ãƒ¼ãƒ–ルã§ã¯è­˜åˆ¥åˆ—ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_utilcmd.c:704 +#: parser/parse_utilcmd.c:735 #, c-format msgid "identity columns are not supported on partitions" msgstr "パーティションã§ã¯è­˜åˆ¥åˆ—ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_utilcmd.c:713 +#: parser/parse_utilcmd.c:744 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"ã®åˆ—\"%1$s\"ã«è¤‡æ•°ã®è­˜åˆ¥æŒ‡å®šãŒã‚りã¾ã™" -#: parser/parse_utilcmd.c:743 +#: parser/parse_utilcmd.c:774 #, c-format msgid "generated columns are not supported on typed tables" msgstr "型付ã‘ã•れãŸãƒ†ãƒ¼ãƒ–ルã§ã¯ç”Ÿæˆã‚«ãƒ©ãƒ ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_utilcmd.c:747 +#: parser/parse_utilcmd.c:778 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"ã®åˆ—\"%1$s\"ã«è¤‡æ•°ã®GENERATEDå¥ã®æŒ‡å®šãŒã‚りã¾ã™" -#: parser/parse_utilcmd.c:765 parser/parse_utilcmd.c:880 +#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:911 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "外部テーブルã§ã¯ä¸»ã‚­ãƒ¼åˆ¶ç´„ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_utilcmd.c:774 parser/parse_utilcmd.c:890 +#: parser/parse_utilcmd.c:805 parser/parse_utilcmd.c:921 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "外部テーブルã§ã¯ãƒ¦ãƒ‹ãƒ¼ã‚¯åˆ¶ç´„ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_utilcmd.c:819 +#: parser/parse_utilcmd.c:850 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "デフォルト値ã¨è­˜åˆ¥æŒ‡å®šã®ä¸¡æ–¹ãŒãƒ†ãƒ¼ãƒ–ル\"%2$s\"ã®åˆ—\"%1$s\"ã«æŒ‡å®šã•れã¦ã„ã¾ã™" -#: parser/parse_utilcmd.c:827 +#: parser/parse_utilcmd.c:858 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"ã®åˆ—\"%1$s\"ã«ãƒ‡ãƒ•ォルト値ã¨ç”Ÿæˆå¼ã®ä¸¡æ–¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã™" -#: parser/parse_utilcmd.c:835 +#: parser/parse_utilcmd.c:866 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "テーブル\"%2$s\"ã®åˆ—\"%1$s\"ã«è­˜åˆ¥æŒ‡å®šã¨ç”Ÿæˆå¼ã®ä¸¡æ–¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã™" -#: parser/parse_utilcmd.c:900 +#: parser/parse_utilcmd.c:931 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "外部テーブルã§ã¯é™¤å¤–制約ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_utilcmd.c:906 -#, c-format -msgid "exclusion constraints are not supported on partitioned tables" -msgstr "パーティションテーブルã§ã¯é™¤å¤–制約ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" - -#: parser/parse_utilcmd.c:971 +#: parser/parse_utilcmd.c:996 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "外部テーブルã®ä½œæˆã«ãŠã„ã¦LIKEã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_utilcmd.c:984 +#: parser/parse_utilcmd.c:1009 #, c-format msgid "relation \"%s\" is invalid in LIKE clause" msgstr "LIKEå¥ã§ã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s\"ã¯ä¸æ­£ã§ã™" -#: parser/parse_utilcmd.c:1741 parser/parse_utilcmd.c:1849 +#: parser/parse_utilcmd.c:1736 parser/parse_utilcmd.c:1844 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "インデックス\"%s\"ã«ã¯è¡Œå…¨ä½“テーブルå‚ç…§ãŒå«ã¾ã‚Œã¾ã™" -#: parser/parse_utilcmd.c:2236 +#: parser/parse_utilcmd.c:2242 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "CREATE TABLE ã§ã¯æ—¢å­˜ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’使ãˆã¾ã›ã‚“" -#: parser/parse_utilcmd.c:2256 +#: parser/parse_utilcmd.c:2262 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "インデックス\"%s\"ã¯ã™ã§ã«1ã¤ã®åˆ¶ç´„ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™" -#: parser/parse_utilcmd.c:2271 -#, c-format -msgid "index \"%s\" is not valid" -msgstr "インデックス\"%s\"ã¯æœ‰åйã§ã¯ã‚りã¾ã›ã‚“" - -#: parser/parse_utilcmd.c:2277 +#: parser/parse_utilcmd.c:2283 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\"ã¯ãƒ¦ãƒ‹ãƒ¼ã‚¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_utilcmd.c:2278 parser/parse_utilcmd.c:2285 parser/parse_utilcmd.c:2292 parser/parse_utilcmd.c:2369 +#: parser/parse_utilcmd.c:2284 parser/parse_utilcmd.c:2291 parser/parse_utilcmd.c:2298 parser/parse_utilcmd.c:2375 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "ã“ã®ã‚ˆã†ãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’使ã£ã¦ãƒ—ãƒ©ã‚¤ãƒžãƒªã‚­ãƒ¼ã‚„ä¸€æ„æ€§åˆ¶ç´„を作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: parser/parse_utilcmd.c:2284 +#: parser/parse_utilcmd.c:2290 #, c-format msgid "index \"%s\" contains expressions" msgstr "インデックス\"%s\"ã¯å¼ã‚’å«ã‚“ã§ã„ã¾ã™" -#: parser/parse_utilcmd.c:2291 +#: parser/parse_utilcmd.c:2297 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\"ã¯éƒ¨åˆ†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã™" -#: parser/parse_utilcmd.c:2303 +#: parser/parse_utilcmd.c:2309 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\"ã¯é…å»¶å¯èƒ½ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã™" -#: parser/parse_utilcmd.c:2304 +#: parser/parse_utilcmd.c:2310 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "é…å»¶å¯èƒ½ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’使ã£ãŸé…å»¶ä¸å¯åˆ¶ç´„ã¯ä½œã‚Œã¾ã›ã‚“。" -#: parser/parse_utilcmd.c:2368 +#: parser/parse_utilcmd.c:2374 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "インデックス\"%s\"ã®åˆ—番å·%dã«ã¯ãƒ‡ãƒ•ォルトã®ã‚½ãƒ¼ãƒˆå‹•作ãŒã‚りã¾ã›ã‚“" -#: parser/parse_utilcmd.c:2525 +#: parser/parse_utilcmd.c:2531 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "列\"%s\"ãŒãƒ—ライマリキー制約内ã«2回出ç¾ã—ã¾ã™" -#: parser/parse_utilcmd.c:2531 +#: parser/parse_utilcmd.c:2537 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "列\"%s\"ãŒä¸€æ„性制約内ã«2回出ç¾ã—ã¾ã™" -#: parser/parse_utilcmd.c:2878 +#: parser/parse_utilcmd.c:2871 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "インデックスå¼ã¨è¿°èªžã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ä»˜ã‘ã•れるテーブルã®ã¿ã‚’å‚ç…§ã§ãã¾ã™" -#: parser/parse_utilcmd.c:2950 +#: parser/parse_utilcmd.c:2943 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "統計情報å¼ã¯å‚ç…§ã•れã¦ã„るテーブルã®ã¿ã‚’å‚ç…§ã§ãã¾ã™" -#: parser/parse_utilcmd.c:2993 +#: parser/parse_utilcmd.c:2986 #, c-format msgid "rules on materialized views are not supported" msgstr "実体化ビューã«å¯¾ã™ã‚‹ãƒ«ãƒ¼ãƒ«ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: parser/parse_utilcmd.c:3053 +#: parser/parse_utilcmd.c:3046 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "ルールã®WHEREæ¡ä»¶ã«ä»–ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¸ã®å‚ç…§ã‚’æŒãŸã›ã‚‰ã‚Œã¾ã›ã‚“" -#: parser/parse_utilcmd.c:3125 +#: parser/parse_utilcmd.c:3118 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "ルールã®WHEREæ¡ä»¶ã¯SELECTã€INSERTã€UPDATEã€DELETE動作ã®ã¿ã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™" -#: parser/parse_utilcmd.c:3143 parser/parse_utilcmd.c:3244 rewrite/rewriteHandler.c:539 rewrite/rewriteManip.c:1087 +#: parser/parse_utilcmd.c:3136 parser/parse_utilcmd.c:3237 rewrite/rewriteHandler.c:544 rewrite/rewriteManip.c:1096 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "æ¡ä»¶ä»˜ãã®UNION/INTERSECT/EXCEPTæ–‡ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_utilcmd.c:3161 +#: parser/parse_utilcmd.c:3154 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON SELECTルールã§ã¯OLDを使用ã§ãã¾ã›ã‚“" -#: parser/parse_utilcmd.c:3165 +#: parser/parse_utilcmd.c:3158 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON SELECTルールã§ã¯NEWを使用ã§ãã¾ã›ã‚“" -#: parser/parse_utilcmd.c:3174 +#: parser/parse_utilcmd.c:3167 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON INSERTルールã§ã¯OLDを使用ã§ãã¾ã›ã‚“" -#: parser/parse_utilcmd.c:3180 +#: parser/parse_utilcmd.c:3173 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON DELETEルールã§ã¯NEWを使用ã§ãã¾ã›ã‚“" -#: parser/parse_utilcmd.c:3208 +#: parser/parse_utilcmd.c:3201 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "WITH å•ã„åˆã‚ã›å†…ã§ã¯ OLD ã¯å‚ç…§ã§ãã¾ã›ã‚“" -#: parser/parse_utilcmd.c:3215 +#: parser/parse_utilcmd.c:3208 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "WITH å•ã„åˆã‚ã›å†…ã§ã¯ NEW ã¯å‚ç…§ã§ãã¾ã›ã‚“" -#: parser/parse_utilcmd.c:3667 +#: parser/parse_utilcmd.c:3664 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "DEFERRABLEå¥ã®å ´æ‰€ãŒé–“é•ã£ã¦ã„ã¾ã™" -#: parser/parse_utilcmd.c:3672 parser/parse_utilcmd.c:3687 +#: parser/parse_utilcmd.c:3669 parser/parse_utilcmd.c:3684 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "複数ã®DEFERRABLE/NOT DEFERRABLEå¥ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_utilcmd.c:3682 +#: parser/parse_utilcmd.c:3679 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "NOT DEFERRABLEå¥ã®å ´æ‰€ãŒé–“é•ã£ã¦ã„ã¾ã™" -#: parser/parse_utilcmd.c:3703 +#: parser/parse_utilcmd.c:3700 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "INITIALLY DEFERREDå¥ã®å ´æ‰€ãŒé–“é•ã£ã¦ã„ã¾ã™<" -#: parser/parse_utilcmd.c:3708 parser/parse_utilcmd.c:3734 +#: parser/parse_utilcmd.c:3705 parser/parse_utilcmd.c:3731 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "複数ã®INITIALLY IMMEDIATE/DEFERREDå¥ã‚’使用ã§ãã¾ã›ã‚“" -#: parser/parse_utilcmd.c:3729 +#: parser/parse_utilcmd.c:3726 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "INITIALLY IMMEDIATEå¥ã®å ´æ‰€ãŒé–“é•ã£ã¦ã„ã¾ã™<" -#: parser/parse_utilcmd.c:3922 +#: parser/parse_utilcmd.c:3919 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATEã§æŒ‡å®šã—ãŸã‚¹ã‚­ãƒ¼ãƒž(%s)ãŒä½œæˆå…ˆã®ã‚¹ã‚­ãƒ¼ãƒž(%s)ã¨ç•°ãªã‚Šã¾ã™" -#: parser/parse_utilcmd.c:3957 +#: parser/parse_utilcmd.c:3954 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\"ã¯ãƒ‘ーティションテーブルã§ã¯ã‚りã¾ã›ã‚“" -#: parser/parse_utilcmd.c:3964 +#: parser/parse_utilcmd.c:3961 #, c-format msgid "table \"%s\" is not partitioned" msgstr "テーブル\"%s\"ã¯ãƒ‘ーティションã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_utilcmd.c:3971 +#: parser/parse_utilcmd.c:3968 #, c-format msgid "index \"%s\" is not partitioned" msgstr "インデックス\"%s\"ã¯ãƒ‘ーティションã•れã¦ã„ã¾ã›ã‚“" -#: parser/parse_utilcmd.c:4011 +#: parser/parse_utilcmd.c:4008 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "ãƒãƒƒã‚·ãƒ¥ãƒ‘ーティションテーブルã¯ãƒ‡ãƒ•ォルトパーティションをæŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: parser/parse_utilcmd.c:4028 +#: parser/parse_utilcmd.c:4025 #, c-format msgid "invalid bound specification for a hash partition" msgstr "ãƒãƒƒã‚·ãƒ¥ãƒ‘ーティションã«å¯¾ã™ã‚‹ä¸æ­£ãªå¢ƒç•ŒæŒ‡å®š" -#: parser/parse_utilcmd.c:4034 partitioning/partbounds.c:4803 +#: parser/parse_utilcmd.c:4031 partitioning/partbounds.c:4802 #, c-format msgid "modulus for hash partition must be an integer value greater than zero" msgstr "ãƒãƒƒã‚·ãƒ¥ãƒ‘ãƒ¼ãƒ†ã‚£ã‚·ãƒ§ãƒ³ã®æ³•ã¯0より大ãã„æ•´æ•°ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: parser/parse_utilcmd.c:4041 partitioning/partbounds.c:4811 +#: parser/parse_utilcmd.c:4038 partitioning/partbounds.c:4810 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "ãƒãƒƒã‚·ãƒ¥ãƒ‘ーティションã®å‰°ä½™ã¯æ³•よりもå°ã•ããªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_utilcmd.c:4054 +#: parser/parse_utilcmd.c:4051 #, c-format msgid "invalid bound specification for a list partition" msgstr "リストパーティションã«å¯¾ã™ã‚‹ä¸æ­£ãªå¢ƒç•ŒæŒ‡å®š" -#: parser/parse_utilcmd.c:4107 +#: parser/parse_utilcmd.c:4104 #, c-format msgid "invalid bound specification for a range partition" msgstr "範囲パーティションã«å¯¾ã™ã‚‹ä¸æ­£ãªå¢ƒç•ŒæŒ‡å®š" -#: parser/parse_utilcmd.c:4113 +#: parser/parse_utilcmd.c:4110 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROMã¯å…¨ã¦ã®ãƒ‘ーティション列ã”ã¨ã«ä¸€ã¤ã®å€¤ã‚’指定ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_utilcmd.c:4117 +#: parser/parse_utilcmd.c:4114 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TOã¯å…¨ã¦ã®ãƒ‘ーティション列ã”ã¨ã«ä¸€ã¤ã®å€¤ã‚’指定ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_utilcmd.c:4231 +#: parser/parse_utilcmd.c:4228 #, c-format msgid "cannot specify NULL in range bound" msgstr "範囲境界ã§NULLã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: parser/parse_utilcmd.c:4280 +#: parser/parse_utilcmd.c:4277 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "MAXVALUEã«ç¶šã境界値ã¯MAXVALUEã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_utilcmd.c:4287 +#: parser/parse_utilcmd.c:4284 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "MINVALUEã«ç¶šã境界値ã¯MINVALUEã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: parser/parse_utilcmd.c:4330 +#: parser/parse_utilcmd.c:4327 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "指定ã—ãŸå€¤ã¯åˆ—\"%s\"ã®%såž‹ã«å¤‰æ›ã§ãã¾ã›ã‚“" @@ -18309,12 +18876,12 @@ msgstr "UESCAPE ã®å¾Œã«ã¯å˜ç´”ãªæ–‡å­—列リテラルãŒç¶šã‹ãªã‘れ㰠msgid "invalid Unicode escape character" msgstr "䏿­£ãªUnicodeエスケープ文字" -#: parser/parser.c:347 scan.l:1391 +#: parser/parser.c:347 scan.l:1393 #, c-format msgid "invalid Unicode escape value" msgstr "䏿­£ãªUnicodeエスケープシーケンスã®å€¤" -#: parser/parser.c:494 scan.l:701 utils/adt/varlena.c:6505 +#: parser/parser.c:494 scan.l:716 utils/adt/varlena.c:6640 #, c-format msgid "invalid Unicode escape" msgstr "䏿­£ãªUnicodeエスケープ" @@ -18324,7 +18891,7 @@ msgstr "䏿­£ãªUnicodeエスケープ" msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Unicodeエスケープã¯\\XXXXã¾ãŸã¯\\+XXXXXXã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: parser/parser.c:523 scan.l:662 scan.l:678 scan.l:694 utils/adt/varlena.c:6530 +#: parser/parser.c:523 scan.l:677 scan.l:693 scan.l:709 utils/adt/varlena.c:6665 #, c-format msgid "invalid Unicode surrogate pair" msgstr "䏿­£ãªUnicodeサロゲートペア" @@ -18334,87 +18901,87 @@ msgstr "䏿­£ãªUnicodeサロゲートペア" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "識別å­\"%s\"ã¯\"%.*s\"ã«åˆ‡ã‚Šè©°ã‚られã¾ã™" -#: partitioning/partbounds.c:2921 +#: partitioning/partbounds.c:2920 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "パーティション\"%s\"ã¯æ—¢å­˜ã®ãƒ‡ãƒ•ォルトパーティション\"%s\"ã¨é‡è¤‡ã—ã¦ã„ã¾ã™" -#: partitioning/partbounds.c:2973 partitioning/partbounds.c:2992 partitioning/partbounds.c:3014 +#: partitioning/partbounds.c:2972 partitioning/partbounds.c:2991 partitioning/partbounds.c:3013 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "ãƒãƒƒã‚·ãƒ¥ãƒ‘ãƒ¼ãƒ†ã‚£ã‚·ãƒ§ãƒ³ã®æ³•(除数)ã¯æ¬¡ã«å¤§ããªæ³•ã®å› æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: partitioning/partbounds.c:2974 partitioning/partbounds.c:3015 +#: partitioning/partbounds.c:2973 partitioning/partbounds.c:3014 #, c-format msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." msgstr "æ–°ã—ã„æ³•(除数)%1$dã¯æ—¢å­˜ã®ãƒ‘ーティション\"%3$s\"ã®æ³•ã§ã‚ã‚‹%2$dã®å› æ•°ã§ã¯ã‚りã¾ã›ã‚“。" -#: partitioning/partbounds.c:2993 +#: partitioning/partbounds.c:2992 #, c-format msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." msgstr "æ–°ã—ã„æ³•(除数)%1$dã¯æ—¢å­˜ã®ãƒ‘ーティション\"%3$s\"ã®æ³•ã§ã‚ã‚‹%2$dã§å‰²ã‚Šåˆ‡ã‚Œã¾ã›ã‚“。" -#: partitioning/partbounds.c:3128 +#: partitioning/partbounds.c:3127 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "リレーション\"%s\"ã«å¯¾ã—ã¦ç©ºã®ç¯„å›²å¢ƒç•ŒãŒæŒ‡å®šã•れã¾ã—ãŸ" -#: partitioning/partbounds.c:3130 +#: partitioning/partbounds.c:3129 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "指定ã•れãŸä¸‹é™%sã¯ä¸Šé™%sより大ãã„ã‹åŒã˜ã§ã™ã€‚" -#: partitioning/partbounds.c:3238 +#: partitioning/partbounds.c:3237 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "パーティション\"%s\"ã¯ãƒ‘ーティション\"%s\"ã¨é‡è¤‡ãŒã‚りã¾ã™" -#: partitioning/partbounds.c:3355 +#: partitioning/partbounds.c:3354 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "デフォルトパーティション\"%2$s\"ã®å­ãƒ†ãƒ¼ãƒ–ルã§ã‚ã‚‹ãŸã‚テーブル\"%1$s\"ã®ã‚¹ã‚­ãƒ£ãƒ³ã‚’スキップã—ã¾ã™" -#: partitioning/partbounds.c:4807 +#: partitioning/partbounds.c:4806 #, c-format msgid "remainder for hash partition must be an integer value greater than or equal to zero" msgstr "ãƒãƒƒã‚·ãƒ¥ãƒ‘ーティションã®å‰°ä½™ã¯`0ä»¥ä¸Šã®æ•´æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: partitioning/partbounds.c:4831 +#: partitioning/partbounds.c:4830 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\"ã¯ãƒãƒƒã‚·ãƒ¥ãƒ‘ーティションテーブルã§ã¯ã‚りã¾ã›ã‚“" -#: partitioning/partbounds.c:4842 partitioning/partbounds.c:4959 +#: partitioning/partbounds.c:4841 partitioning/partbounds.c:4958 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "ãƒ‘ãƒ¼ãƒ†ã‚£ã‚·ãƒ§ãƒ³åˆ—ã®æ•°(%d)ã¨ä¸Žãˆã‚‰ã‚ŒãŸã‚­ãƒ¼å€¤ã®æ•°(%d)ãŒä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“" -#: partitioning/partbounds.c:4864 +#: partitioning/partbounds.c:4863 #, c-format msgid "column %d of the partition key has type %s, but supplied value is of type %s" msgstr "パーティションキーã®åˆ—%dã¯%såž‹ã§ã™ã€ã—ã‹ã—与ãˆã‚‰ã‚ŒãŸå€¤ã¯%såž‹ã§ã™" -#: partitioning/partbounds.c:4896 +#: partitioning/partbounds.c:4895 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "パーティションキーã®åˆ— %d 㯠\"%s\"åž‹ã§ã™ã€ã—ã‹ã—与ãˆã‚‰ã‚ŒãŸå€¤ã¯ \"%s\"åž‹ã§ã™" -#: port/pg_sema.c:209 port/pg_shmem.c:708 port/posix_sema.c:209 port/sysv_sema.c:323 port/sysv_shmem.c:708 +#: port/pg_sema.c:209 port/pg_shmem.c:717 port/posix_sema.c:209 port/sysv_sema.c:329 port/sysv_shmem.c:717 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "データディレクトリ\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: port/pg_shmem.c:223 port/sysv_shmem.c:223 +#: port/pg_shmem.c:224 port/sysv_shmem.c:224 #, c-format msgid "could not create shared memory segment: %m" msgstr "共有メモリセグメントを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: port/pg_shmem.c:224 port/sysv_shmem.c:224 +#: port/pg_shmem.c:225 port/sysv_shmem.c:225 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "失敗ã—ãŸã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ¼ãƒ«ã¯shmget(key=%lu, size=%zu, 0%o)ã§ã™ã€‚" -#: port/pg_shmem.c:228 port/sysv_shmem.c:228 +#: port/pg_shmem.c:229 port/sysv_shmem.c:229 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" @@ -18423,7 +18990,7 @@ msgstr "" "通常ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ã€PostgreSQLãŒè¦æ±‚ã™ã‚‹å…±æœ‰ãƒ¡ãƒ¢ãƒªã‚»ã‚°ãƒ¡ãƒ³ãƒˆãŒã‚«ãƒ¼ãƒãƒ«ã®SHMMAXパラメータを超ãˆãŸå ´åˆã€ã¾ãŸã¯å¯èƒ½æ€§ã¨ã—ã¦ã¯ã‚«ãƒ¼ãƒãƒ«ã®SHMMINパラメータよりå°ã•ã„å ´åˆã«ç™ºç”Ÿã—ã¾ã™ã€‚\n" "共有メモリã®è¨­å®šã«é–¢ã™ã‚‹è©³ç´°æƒ…å ±ã¯ã€PostgreSQL ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«è¨˜è¼‰ã•れã¦ã„ã¾ã™ã€‚" -#: port/pg_shmem.c:235 port/sysv_shmem.c:235 +#: port/pg_shmem.c:236 port/sysv_shmem.c:236 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" @@ -18432,7 +18999,7 @@ msgstr "" "通常ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ã€PostgreSQLãŒè¦æ±‚ã™ã‚‹å…±æœ‰ãƒ¡ãƒ¢ãƒªã‚»ã‚°ãƒ¡ãƒ³ãƒˆãŒã‚«ãƒ¼ãƒãƒ«ã®SHMALLパラメータを超ãˆãŸå ´åˆã«ç™ºç”Ÿã—ã¾ã™ã€‚より大ããªSHMALLã§ã‚«ãƒ¼ãƒãƒ«ã‚’å†è¨­å®šã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。\n" "ã“れ以上ã®å…±æœ‰ãƒ¡ãƒ¢ãƒªã®è¨­å®šã«é–¢ã™ã‚‹æƒ…å ±ã¯ã€PostgreSQL ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«è¨˜è¼‰ã•れã¦ã„ã¾ã™ã€‚" -#: port/pg_shmem.c:241 port/sysv_shmem.c:241 +#: port/pg_shmem.c:242 port/sysv_shmem.c:242 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" @@ -18441,61 +19008,61 @@ msgstr "" "ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ãƒ‡ã‚£ã‚¹ã‚¯ã®å®¹é‡ä¸è¶³ã‚’æ„味ã—ã¦ã„ã¾ã›ã‚“。ã“ã®ã‚¨ãƒ©ãƒ¼ã®è¦å› ã®ä¸€ã¤ã¯å…±æœ‰ãƒ¡ãƒ¢ãƒªã®è­˜åˆ¥å­ã®æž¯æ¸‡ã§ã™ã€‚ã“ã®å ´åˆã¯ã‚«ãƒ¼ãƒãƒ«ã®SHMMNIパラメータを増やã™å¿…è¦ãŒã‚りã¾ã™ãŒã€ãã†ã§ãªã‘れã°è¦å› ã¯ã‚·ã‚¹ãƒ†ãƒ å…¨ä½“ã®å…±æœ‰ãƒ¡ãƒ¢ãƒªã®åˆ¶é™ã¸åˆ°é”ã¨ãªã‚Šã¾ã™ã€‚\n" "ã“れ以上ã®å…±æœ‰ãƒ¡ãƒ¢ãƒªã®è¨­å®šã«é–¢ã™ã‚‹æƒ…å ±ã¯ã€PostgreSQLã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«è¨˜è¼‰ã•れã¦ã„ã¾ã™ã€‚" -#: port/pg_shmem.c:583 port/sysv_shmem.c:583 port/win32_shmem.c:641 +#: port/pg_shmem.c:584 port/sysv_shmem.c:584 port/win32_shmem.c:646 #, c-format -msgid "huge_page_size must be 0 on this platform." -msgstr "ã“ã®ãƒ—ラットフォームã§ã¯huge_page_sizeã‚’0ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" +msgid "\"huge_page_size\" must be 0 on this platform." +msgstr "ã“ã®ãƒ—ラットフォームã§ã¯\"huge_page_size\"ã‚’0ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: port/pg_shmem.c:646 port/sysv_shmem.c:646 +#: port/pg_shmem.c:655 port/sysv_shmem.c:655 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "匿å共有メモリをマップã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: port/pg_shmem.c:648 port/sysv_shmem.c:648 +#: port/pg_shmem.c:657 port/sysv_shmem.c:657 #, c-format -msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." -msgstr "通常ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ã€PostgreSQL ãŒè¦æ±‚ã™ã‚‹å…±æœ‰ãƒ¡ãƒ¢ãƒªã®ã‚µã‚¤ã‚ºãŒåˆ©ç”¨å¯èƒ½ãªãƒ¡ãƒ¢ãƒªã‚„スワップ容é‡ã€ãªã„ã—ã¯ãƒ’ュージページを超ãˆãŸå ´åˆã«ç™ºç”Ÿã—ã¾ã™ã€‚è¦æ±‚サイズ(ç¾åœ¨ %zu ãƒã‚¤ãƒˆï¼‰ã‚’減らã™ãŸã‚ã«ã€shared_buffers ã¾ãŸã¯ max_connections を減らã™ã“ã¨ã§PostgreSQLã®å…±æœ‰ãƒ¡ãƒ¢ãƒªã®ä½¿ç”¨é‡ã‚’減らã—ã¦ãã ã•ã„。" +msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing \"shared_buffers\" or \"max_connections\"." +msgstr "通常ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ã€PostgreSQL ãŒè¦æ±‚ã™ã‚‹å…±æœ‰ãƒ¡ãƒ¢ãƒªã®ã‚µã‚¤ã‚ºãŒåˆ©ç”¨å¯èƒ½ãªãƒ¡ãƒ¢ãƒªã‚„スワップ容é‡ã€ãªã„ã—ã¯ãƒ’ュージページを超ãˆãŸå ´åˆã«ç™ºç”Ÿã—ã¾ã™ã€‚è¦æ±‚サイズ(ç¾åœ¨%zuãƒã‚¤ãƒˆï¼‰ã‚’減らã™ãŸã‚ã«PostgreSQLã®å…±æœ‰ãƒ¡ãƒ¢ãƒªã®ä½¿ç”¨é‡ã‚’減らã™ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。ãŸã¨ãˆã°\"shared_buffers\"ã¾ãŸã¯\"max_connections\"を減らã™ã“ã¨ãŒè€ƒãˆã‚‰ã‚Œã¾ã™ã€‚" -#: port/pg_shmem.c:716 port/sysv_shmem.c:716 +#: port/pg_shmem.c:725 port/sysv_shmem.c:725 #, c-format msgid "huge pages not supported on this platform" msgstr "ã“ã®ãƒ—ラットフォームã§ã¯ãƒ’ュージページをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: port/pg_shmem.c:723 port/sysv_shmem.c:723 +#: port/pg_shmem.c:732 port/sysv_shmem.c:732 #, c-format -msgid "huge pages not supported with the current shared_memory_type setting" -msgstr "ヒュージページã¯ç¾åœ¨ã®shared_memory_typeã®è¨­å®šã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" +msgid "huge pages not supported with the current \"shared_memory_type\" setting" +msgstr "ヒュージページã¯ç¾åœ¨ã®\"shared_memory_type\"ã®è¨­å®šã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: port/pg_shmem.c:783 port/sysv_shmem.c:783 utils/init/miscinit.c:1351 +#: port/pg_shmem.c:798 port/sysv_shmem.c:798 utils/init/miscinit.c:1401 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "既存ã®å…±æœ‰ãƒ¡ãƒ¢ãƒªãƒ–ロック(キー%luã€ID %lu)ãŒã¾ã ä½¿ç”¨ä¸­ã§ã™" -#: port/pg_shmem.c:786 port/sysv_shmem.c:786 utils/init/miscinit.c:1353 +#: port/pg_shmem.c:801 port/sysv_shmem.c:801 utils/init/miscinit.c:1403 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "データディレクトリ \"%s\". ã«å¯¾å¿œã™ã‚‹å¤ã„サーãƒãƒ¼ãƒ—ロセスをã™ã¹ã¦çµ‚了ã•ã›ã¦ãã ã•ã„。" -#: port/sysv_sema.c:120 +#: port/sysv_sema.c:126 #, c-format msgid "could not create semaphores: %m" msgstr "セマフォを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: port/sysv_sema.c:121 +#: port/sysv_sema.c:127 #, c-format msgid "Failed system call was semget(%lu, %d, 0%o)." msgstr "失敗ã—ãŸã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ¼ãƒ«ã¯semget(%lu, %d, 0%o)ã§ã™ã€‚" -#: port/sysv_sema.c:125 +#: port/sysv_sema.c:131 #, c-format msgid "" -"This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its max_connections parameter.\n" +"This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its \"max_connections\" parameter.\n" "The PostgreSQL documentation contains more information about configuring your system for PostgreSQL." msgstr "" -"ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ã€ãƒ‡ã‚£ã‚¹ã‚¯ãŒè¶³ã‚Šãªããªã£ãŸã“ã¨ã‚’æ„味ã—ã¦ã„ã¾ã›ã‚“。ã“ã®åŽŸå› ã¯ã‚»ãƒžãƒ•ォセット数ãŒä¸Šé™(SEMMNI)ã«é”ã—ãŸã‹ã€ã¾ãŸã¯ã‚·ã‚¹ãƒ†ãƒ å…¨ä½“ã§ã®ã‚»ãƒžãƒ•ォ数を上é™ã¾ã§(SEMMNS)を使ã„ãã£ãŸå ´åˆã§ã™ã€‚対処ã¨ã—ã¦ã¯ã€å¯¾å¿œã™ã‚‹ã‚«ãƒ¼ãƒãƒ«ã®ãƒ‘ラメータを増やã™å¿…è¦ãŒã‚りã¾ã™ã€‚ã‚‚ã—ã㯠PostgreSQLã® max_connections を減らã™ã“ã¨ã§ã€æ¶ˆè²»ã™ã‚‹ã‚»ãƒžãƒ•ã‚©ã®æ•°ã‚’減らã—ã¦ãã ã•ã„。\n" -"共有メモリã®è¨­å®šã«é–¢ã™ã‚‹è©³ç´°æƒ…å ±ã¯ã€PostgreSQL ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«è¨˜è¼‰ã•れã¦ã„ã¾ã™ã€‚" +"ã“ã®ã‚¨ãƒ©ãƒ¼ã¯ã€ãƒ‡ã‚£ã‚¹ã‚¯ãŒè¶³ã‚Šãªããªã£ãŸã“ã¨ã‚’æ„味ã—ã¦ã„ã¾ã›ã‚“。ã“ã®åŽŸå› ã¯ã‚»ãƒžãƒ•ォセット数ãŒä¸Šé™(SEMMNI)ã«é”ã—ãŸã‹ã€ã¾ãŸã¯ã‚·ã‚¹ãƒ†ãƒ å…¨ä½“ã§ã®ã‚»ãƒžãƒ•ォ数を上é™ã¾ã§(SEMMNS)を使ã„ãるよã†ãªå ´åˆã§ã™ã€‚対処ã¨ã—ã¦ã¯ã€å¯¾å¿œã™ã‚‹ã‚«ãƒ¼ãƒãƒ«ã®ãƒ‘ラメータを増やã™å¿…è¦ãŒã‚りã¾ã™ã€‚ã‚‚ã—ã㯠PostgreSQLã®\"max_connections\"設定をを減らã™ã“ã¨ã§ã€æ¶ˆè²»ã™ã‚‹ã‚»ãƒžãƒ•ã‚©ã®æ•°ã‚’減らã—ã¦ãã ã•ã„。\n" +"PostgreSQLå‘ã‘ã®å…±æœ‰ãƒ¡ãƒ¢ãƒªè¨­å®šã«é–¢ã™ã‚‹è©³ç´°æƒ…å ±ã¯ã€PostgreSQL ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«è¨˜è¼‰ã•れã¦ã„ã¾ã™ã€‚" -#: port/sysv_sema.c:155 +#: port/sysv_sema.c:161 #, c-format msgid "You possibly need to raise your kernel's SEMVMX value to be at least %d. Look into the PostgreSQL documentation for details." msgstr "" @@ -18619,963 +19186,863 @@ msgstr "失敗ã—ãŸã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ¼ãƒ«ã¯MapViewOfFileExã§ã™ã€‚" msgid "Failed system call was MapViewOfFileEx." msgstr "失敗ã—ãŸã‚·ã‚¹ãƒ†ãƒ ã‚³ãƒ¼ãƒ«ã¯MapViewOfFileExã§ã™ã€‚" -#: postmaster/autovacuum.c:417 -#, c-format -msgid "could not fork autovacuum launcher process: %m" -msgstr "自動VACUUM起動プロセスを fork ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: postmaster/autovacuum.c:764 +#: postmaster/autovacuum.c:686 #, c-format msgid "autovacuum worker took too long to start; canceled" msgstr "自動VACUUMワーカーã®èµ·å‹•ã«æ™‚é–“ãŒã‹ã‹ã‚Šã™ãŽã¦ã„ã¾ã™; キャンセルã—ã¾ã—ãŸ" -#: postmaster/autovacuum.c:1489 -#, c-format -msgid "could not fork autovacuum worker process: %m" -msgstr "自動VACUUMワーカープロセスをforkã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: postmaster/autovacuum.c:2322 +#: postmaster/autovacuum.c:2203 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "自動VACUUM: 孤立ã—ãŸä¸€æ™‚テーブル\"%s.%s.%s\"を削除ã—ã¾ã™" -#: postmaster/autovacuum.c:2558 +#: postmaster/autovacuum.c:2439 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "テーブル\"%s.%s.%s\"ã«å¯¾ã™ã‚‹è‡ªå‹•VACUUM" -#: postmaster/autovacuum.c:2561 +#: postmaster/autovacuum.c:2442 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "テーブル\"%s.%s.%s\"ã«å¯¾ã™ã‚‹è‡ªå‹•ANALYZE" -#: postmaster/autovacuum.c:2755 +#: postmaster/autovacuum.c:2636 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "リレーション\"%s.%s.%s\"ã®ä½œæ¥­ã‚¨ãƒ³ãƒˆãƒªã‚’処ç†ã—ã¦ã„ã¾ã™" -#: postmaster/autovacuum.c:3369 +#: postmaster/autovacuum.c:3254 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "誤設定ã®ãŸã‚自動VACUUMãŒèµ·å‹•ã§ãã¾ã›ã‚“" -#: postmaster/autovacuum.c:3370 +#: postmaster/autovacuum.c:3255 #, c-format msgid "Enable the \"track_counts\" option." msgstr "\"track_counts\"オプションを有効ã«ã—ã¦ãã ã•ã„。" -#: postmaster/bgworker.c:259 +#: postmaster/bgworker.c:260 #, c-format msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼çŠ¶æ…‹ã®çŸ›ç›¾ (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:669 +#: postmaster/bgworker.c:651 #, c-format msgid "background worker \"%s\": background workers without shared memory access are not supported" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼\"%s\": 共有メモリアクセスを伴ã‚ãªã„ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: postmaster/bgworker.c:680 +#: postmaster/bgworker.c:662 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼\"%s\": postmaster起動中ã«èµ·å‹•ã—ã¦ã„ã‚‹å ´åˆã«ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¦æ±‚ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: postmaster/bgworker.c:694 +#: postmaster/bgworker.c:676 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼\"%s\": 䏿­£ãªå†èµ·å‹•é–“éš”" -#: postmaster/bgworker.c:709 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼\"%s\": パラレルワーカーã¯å†èµ·å‹•ã™ã‚‹ã‚ˆã†ã«è¨­å®šã—ã¦ã¯ã„ã‘ã¾ã›ã‚“" -#: postmaster/bgworker.c:733 tcop/postgres.c:3255 +#: postmaster/bgworker.c:715 tcop/postgres.c:3312 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "管ç†è€…コマンドã«ã‚ˆã‚Šãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼\"%s\"を終了ã—ã¦ã„ã¾ã™" -#: postmaster/bgworker.c:890 +#: postmaster/bgworker.c:888 #, c-format -msgid "background worker \"%s\": must be registered in shared_preload_libraries" -msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼\"%s\": shared_preload_librariesã«ç™»éŒ²ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" +msgid "background worker \"%s\": must be registered in \"shared_preload_libraries\"" +msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼\"%s\": \"shared_preload_libraries\"ã«ç™»éŒ²ã•れã¦ã„ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: postmaster/bgworker.c:902 +#: postmaster/bgworker.c:911 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼\"%s\": å‹•çš„ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼ã®ã¿ãŒé€šçŸ¥ã‚’è¦æ±‚ã§ãã¾ã™" -#: postmaster/bgworker.c:917 +#: postmaster/bgworker.c:926 #, c-format msgid "too many background workers" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼ãŒå¤šã™ãŽã¾ã™" -#: postmaster/bgworker.c:918 +#: postmaster/bgworker.c:927 #, c-format msgid "Up to %d background worker can be registered with the current settings." msgid_plural "Up to %d background workers can be registered with the current settings." msgstr[0] "ç¾åœ¨ã®è¨­å®šã§ã¯æœ€å¤§%dã®ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼ã‚’登録ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: postmaster/bgworker.c:922 +#: postmaster/bgworker.c:931 postmaster/checkpointer.c:445 #, c-format -msgid "Consider increasing the configuration parameter \"max_worker_processes\"." -msgstr "設定パラメータ\"max_worker_processes\"を増やã™ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„" +msgid "Consider increasing the configuration parameter \"%s\"." +msgstr "設定パラメータ\"%s\"を増やã™ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。" -#: postmaster/checkpointer.c:431 +#: postmaster/checkpointer.c:441 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" msgstr[0] "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®ç™ºç”Ÿå‘¨æœŸãŒçŸ­ã™ãŽã¾ã™(%dç§’é–“éš”)" -#: postmaster/checkpointer.c:435 -#, c-format -msgid "Consider increasing the configuration parameter \"max_wal_size\"." -msgstr "設定パラメータ\"max_wal_size\"を増やã™ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„" - -#: postmaster/checkpointer.c:1059 +#: postmaster/checkpointer.c:1067 #, c-format msgid "checkpoint request failed" msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆè¦æ±‚ãŒå¤±æ•—ã—ã¾ã—ãŸ" -#: postmaster/checkpointer.c:1060 +#: postmaster/checkpointer.c:1068 #, c-format msgid "Consult recent messages in the server log for details." msgstr "詳細ã¯ã‚µãƒ¼ãƒãƒ¼ãƒ­ã‚°ã®æœ€è¿‘ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’調査ã—ã¦ãã ã•ã„" -#: postmaster/pgarch.c:416 +#: postmaster/launch_backend.c:381 #, c-format -msgid "archive_mode enabled, yet archiving is not configured" -msgstr "archive_modeã¯æœ‰åйã§ã™ãŒã€archive_commandãŒã¾ã è¨­å®šã•れã¦ã„ã¾ã›ã‚“" +msgid "could not execute server process \"%s\": %m" +msgstr "サーãƒãƒ¼ãƒ—ロセス\"%s\"を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: postmaster/pgarch.c:438 +#: postmaster/launch_backend.c:434 #, c-format -msgid "removed orphan archive status file \"%s\"" -msgstr "孤立ã—ãŸã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ステータスファイル\"%s\"を削除ã—ã¾ã—ãŸ" +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ‘ラメータファイルã®ãƒ•ァイルマッピングを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード%lu" -#: postmaster/pgarch.c:448 +#: postmaster/launch_backend.c:442 #, c-format -msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" -msgstr "孤立ã—ãŸã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ステータスファイル\"%s\"ã®å‰Šé™¤ã®å¤±æ•—回数ãŒä¸Šé™ã‚’è¶…ãˆã¾ã—ãŸã€ã‚ã¨ã§ãƒªãƒˆãƒ©ã‚¤ã—ã¾ã™" +msgid "could not map backend parameter memory: error code %lu" +msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ‘ラメータã®ãƒ¡ãƒ¢ãƒªã‚’マップã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" -#: postmaster/pgarch.c:484 +#: postmaster/launch_backend.c:459 #, c-format -msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" -msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ãƒ•ァイル\"%s\"ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–処ç†ã®å¤±æ•—回数ãŒè¶…éŽã—ã¾ã—ãŸã€å¾Œã§å†åº¦è©¦ã—ã¾ã™" +msgid "subprocess command line too long" +msgstr "サブプロセスã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ãŒé•·ã™ãŽã¾ã™" -#: postmaster/pgarch.c:791 postmaster/pgarch.c:830 +#: postmaster/launch_backend.c:477 #, c-format -msgid "both archive_command and archive_library set" -msgstr "archive_commandã¨archive_libraryãŒä¸¡æ–¹è¨­å®šã•れã¦ã„ã¾ã™" +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "CreateProcess() ã®å‘¼ã³å‡ºã—ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m (エラーコード %lu)" -#: postmaster/pgarch.c:792 postmaster/pgarch.c:831 +#: postmaster/launch_backend.c:504 #, c-format -msgid "Only one of archive_command, archive_library may be set." -msgstr "archive_commandã¨archive_libraryã®ã„ãšã‚Œã‹ä¸€æ–¹ã®ã¿è¨­å®šã§ãã¾ã™ã€‚" +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ‘ラメータファイルã®ãƒ“ューをアンマップã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" -#: postmaster/pgarch.c:809 +#: postmaster/launch_backend.c:508 #, c-format -msgid "restarting archiver process because value of \"archive_library\" was changed" -msgstr "\"archive_library\"ã®å€¤ãŒå¤‰æ›´ã•れãŸãŸã‚アーカイãƒãƒ—ロセスをå†èµ·å‹•ã—ã¾ã™" +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ‘ラメータファイルã®ãƒãƒ³ãƒ‰ãƒ«ã‚’クローズã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード%lu" -#: postmaster/pgarch.c:846 +#: postmaster/launch_backend.c:530 +#, c-format +msgid "giving up after too many tries to reserve shared memory" +msgstr "共有メモリã®ç¢ºä¿ã®ãƒªãƒˆãƒ©ã‚¤å›žæ•°ãŒå¤šã™ãŽã‚‹ãŸã‚中断ã—ã¾ã™" + +#: postmaster/launch_backend.c:531 +#, c-format +msgid "This might be caused by ASLR or antivirus software." +msgstr "ã“れã¯ASLRã¾ãŸã¯ã‚¢ãƒ³ãƒã‚¦ã‚¤ãƒ«ã‚¹ã‚½ãƒ•トウェアãŒåŽŸå› ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" + +#: postmaster/launch_backend.c:834 +#, c-format +msgid "could not duplicate socket %d for use in backend: error code %d" +msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã«ã‚½ã‚±ãƒƒãƒˆ%dを複製ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %d" + +#: postmaster/launch_backend.c:866 +#, c-format +msgid "could not create inherited socket: error code %d\n" +msgstr "継承ã—ãŸã‚½ã‚±ãƒƒãƒˆã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %d\n" + +#: postmaster/launch_backend.c:895 +#, c-format +msgid "could not open backend variables file \"%s\": %m\n" +msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰å¤‰æ•°ãƒ•ァイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" + +#: postmaster/launch_backend.c:901 +#, c-format +msgid "could not read from backend variables file \"%s\": %m\n" +msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰å¤‰æ•°ãƒ•ァイル\"%s\"ã‹ã‚‰èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m\n" + +#: postmaster/launch_backend.c:912 +#, c-format +msgid "could not read startup data from backend variables file \"%s\": %m\n" +msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰å¤‰æ•°ãƒ•ァイル\"%s\"ã‹ã‚‰èµ·å‹•データ読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m\n" + +#: postmaster/launch_backend.c:924 +#, c-format +msgid "could not remove file \"%s\": %m\n" +msgstr "ファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" + +#: postmaster/launch_backend.c:940 +#, c-format +msgid "could not map view of backend variables: error code %lu\n" +msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰å¤‰æ•°ã®ãƒ“ューをマップã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu\n" + +#: postmaster/launch_backend.c:959 +#, c-format +msgid "could not unmap view of backend variables: error code %lu\n" +msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰å¤‰æ•°ã®ãƒ“ューをアンマップã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu\n" + +#: postmaster/launch_backend.c:966 +#, c-format +msgid "could not close handle to backend parameter variables: error code %lu\n" +msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ‘ラメータ変数ã®ãƒãƒ³ãƒ‰ãƒ«ã‚’クローズã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード%lu\n" + +#: postmaster/pgarch.c:428 +#, c-format +msgid "\"archive_mode\" enabled, yet archiving is not configured" +msgstr "\"archive_mode\"ã¯æœ‰åйã§ã™ãŒã€ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–方法ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" + +#: postmaster/pgarch.c:452 +#, c-format +msgid "removed orphan archive status file \"%s\"" +msgstr "孤立ã—ãŸã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ステータスファイル\"%s\"を削除ã—ã¾ã—ãŸ" + +#: postmaster/pgarch.c:462 +#, c-format +msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" +msgstr "孤立ã—ãŸã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ステータスファイル\"%s\"ã®å‰Šé™¤ã®å¤±æ•—回数ãŒä¸Šé™ã‚’è¶…ãˆã¾ã—ãŸã€ã‚ã¨ã§ãƒªãƒˆãƒ©ã‚¤ã—ã¾ã™" + +#: postmaster/pgarch.c:498 +#, c-format +msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" +msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ãƒ•ァイル\"%s\"ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–処ç†ã®å¤±æ•—回数ãŒè¶…éŽã—ã¾ã—ãŸã€å¾Œã§å†åº¦è©¦ã—ã¾ã™" + +#: postmaster/pgarch.c:879 postmaster/pgarch.c:918 +#, c-format +msgid "both \"archive_command\" and \"archive_library\" set" +msgstr "\"archive_command\"ã¨\"archive_library\"ãŒä¸¡æ–¹è¨­å®šã•れã¦ã„ã¾ã™" + +#: postmaster/pgarch.c:880 postmaster/pgarch.c:919 +#, c-format +msgid "Only one of \"archive_command\", \"archive_library\" may be set." +msgstr "\"archive_command\"ã¨\"archive_library\"ã®ã„ãšã‚Œã‹ä¸€æ–¹ã®ã¿è¨­å®šã§ãã¾ã™ã€‚" + +#: postmaster/pgarch.c:897 +#, c-format +msgid "restarting archiver process because value of \"archive_library\" was changed" +msgstr "\"archive_library\"ã®è¨­å®šãŒå¤‰æ›´ã•れãŸãŸã‚アーカイãƒãƒ—ロセスをå†èµ·å‹•ã—ã¾ã™" + +#: postmaster/pgarch.c:934 #, c-format msgid "archive modules have to define the symbol %s" msgstr "アーカイブモジュールã¯ã‚·ãƒ³ãƒœãƒ«%sを定義ã—ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: postmaster/pgarch.c:852 +#: postmaster/pgarch.c:940 #, c-format msgid "archive modules must register an archive callback" msgstr "アーカイブモジュールã¯ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–コールãƒãƒƒã‚¯ã‚’登録ã—ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: postmaster/postmaster.c:759 +#: postmaster/postmaster.c:661 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: -fオプションã«å¯¾ã™ã‚‹ä¸æ­£ãªå¼•æ•°: \"%s\"\n" -#: postmaster/postmaster.c:832 +#: postmaster/postmaster.c:734 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: -tオプションã«å¯¾ã™ã‚‹ä¸æ­£ãªå¼•æ•°: \"%s\"\n" -#: postmaster/postmaster.c:855 +#: postmaster/postmaster.c:757 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: 䏿­£ãªå¼•æ•°: \"%s\"\n" -#: postmaster/postmaster.c:923 +#: postmaster/postmaster.c:825 +#, c-format +msgid "%s: \"superuser_reserved_connections\" (%d) plus \"reserved_connections\" (%d) must be less than \"max_connections\" (%d)\n" +msgstr "%s: \"superuser_reserved_connections\" (%d)ã¨\"reserved_connections\" (%d)ã¨ã®å’Œã¯ \"max_connections\" (%d)よりå°ã•ããªã‘れã°ãªã‚Šã¾ã›ã‚“\n" + +#: postmaster/postmaster.c:833 #, c-format -msgid "%s: superuser_reserved_connections (%d) plus reserved_connections (%d) must be less than max_connections (%d)\n" -msgstr "%s: superuser_reserved_connections (%d)ã¨reserved_connections (%d)ã¨ã®å’Œã¯ max_connections (%d)よりå°ã•ããªã‘れã°ãªã‚Šã¾ã›ã‚“\n" +msgid "WAL archival cannot be enabled when \"wal_level\" is \"minimal\"" +msgstr "\"wal_level\"ãŒ\"minimal\"ã®æ™‚ã¯WALã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã¯æœ‰åйã«ã§ãã¾ã›ã‚“" -#: postmaster/postmaster.c:931 +#: postmaster/postmaster.c:836 #, c-format -msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" -msgstr "wal_levelãŒ\"minimal\"ã®æ™‚ã¯WALã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã¯æœ‰åйã«ã§ãã¾ã›ã‚“" +msgid "WAL streaming (\"max_wal_senders\" > 0) requires \"wal_level\" to be \"replica\" or \"logical\"" +msgstr "WALストリーミング(\"max_wal_senders\" > 0)を行ã†ã«ã¯ wal_levelã‚’\"replica\"ã¾ãŸã¯\"logical\"ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: postmaster/postmaster.c:934 +#: postmaster/postmaster.c:839 #, c-format -msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" -msgstr "WALストリーミング(max_wal_senders > 0)を行ã†ã«ã¯ wal_levelã‚’\"replica\"ã¾ãŸã¯\"logical\"ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" +msgid "WAL cannot be summarized when \"wal_level\" is \"minimal\"" +msgstr "\"wal_level\"ãŒ\"minimal\"ã®æ™‚ã¯WALã¯é›†ç´„ã§ãã¾ã›ã‚“" -#: postmaster/postmaster.c:942 +#: postmaster/postmaster.c:847 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: データトークンテーブルãŒä¸æ­£ã§ã™ã€ä¿®å¾©ã—ã¦ãã ã•ã„\n" -#: postmaster/postmaster.c:1099 +#: postmaster/postmaster.c:1004 #, c-format msgid "could not create I/O completion port for child queue" msgstr "å­ã‚­ãƒ¥ãƒ¼å‘ã‘ã®I/O終了ãƒãƒ¼ãƒˆã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: postmaster/postmaster.c:1164 +#: postmaster/postmaster.c:1069 #, c-format msgid "ending log output to stderr" msgstr "標準エラー出力ã¸ã®ãƒ­ã‚°å‡ºåŠ›ã‚’çµ‚äº†ã—ã¦ã„ã¾ã™" -#: postmaster/postmaster.c:1165 +#: postmaster/postmaster.c:1070 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "ã“ã®å¾Œã®ãƒ­ã‚°å‡ºåŠ›ã¯ãƒ­ã‚°é…é€å…ˆ\"%s\"ã«å‡ºåŠ›ã•れã¾ã™ã€‚" -#: postmaster/postmaster.c:1176 +#: postmaster/postmaster.c:1081 #, c-format msgid "starting %s" msgstr "%s ã‚’èµ·å‹•ã—ã¦ã„ã¾ã™" -#: postmaster/postmaster.c:1236 +#: postmaster/postmaster.c:1143 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "\"%s\"ã«é–¢ã™ã‚‹ç›£è¦–用ソケットを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: postmaster/postmaster.c:1242 +#: postmaster/postmaster.c:1149 #, c-format msgid "could not create any TCP/IP sockets" msgstr "TCP/IPソケットを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: postmaster/postmaster.c:1274 +#: postmaster/postmaster.c:1181 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "DNSServiceRegister()ãŒå¤±æ•—ã—ã¾ã—ãŸ: エラーコード %ld" -#: postmaster/postmaster.c:1325 +#: postmaster/postmaster.c:1234 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "ディレクトリ\"%s\"ã«ãŠã„ã¦Unixドメインソケットを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: postmaster/postmaster.c:1331 +#: postmaster/postmaster.c:1240 #, c-format msgid "could not create any Unix-domain sockets" msgstr "Unixドメインソケットを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: postmaster/postmaster.c:1342 +#: postmaster/postmaster.c:1251 #, c-format msgid "no socket created for listening" msgstr "監視用ã«ä½œæˆã™ã‚‹ã‚½ã‚±ãƒƒãƒˆã¯ã‚りã¾ã›ã‚“" -#: postmaster/postmaster.c:1373 +#: postmaster/postmaster.c:1282 #, c-format -msgid "%s: could not change permissions of external PID file \"%s\": %s\n" -msgstr "%s: 外部PIDファイル\"%s\"ã®æ¨©é™ã‚’変更ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "%s: could not change permissions of external PID file \"%s\": %m\n" +msgstr "%s: 外部PIDファイル\"%s\"ã®æ¨©é™ã‚’変更ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" -#: postmaster/postmaster.c:1377 +#: postmaster/postmaster.c:1286 #, c-format -msgid "%s: could not write external PID file \"%s\": %s\n" -msgstr "%s: 外部PIDファイル\"%s\"ã«æ›¸ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "%s: could not write external PID file \"%s\": %m\n" +msgstr "%s: 外部PIDファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m\n" #. translator: %s is a configuration file -#: postmaster/postmaster.c:1405 utils/init/postinit.c:221 +#: postmaster/postmaster.c:1314 utils/init/postinit.c:221 #, c-format msgid "could not load %s" msgstr "%s\"をロードã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: postmaster/postmaster.c:1431 +#: postmaster/postmaster.c:1342 #, c-format msgid "postmaster became multithreaded during startup" -msgstr "postmasterã¯èµ·å‹•値処ç†ä¸­ã¯ãƒžãƒ«ãƒã‚¹ãƒ¬ãƒƒãƒ‰ã§å‹•作ã—ã¾ã™" +msgstr "postmasterã¯èµ·å‹•処ç†ä¸­ã¯ãƒžãƒ«ãƒã‚¹ãƒ¬ãƒƒãƒ‰ã§å‹•作ã—ã¾ã™" -#: postmaster/postmaster.c:1432 +#: postmaster/postmaster.c:1343 postmaster/postmaster.c:3684 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "LC_ALL環境変数を使用å¯èƒ½ãªãƒ­ã‚±ãƒ¼ãƒ«ã«è¨­å®šã—ã¦ãã ã•ã„。" -#: postmaster/postmaster.c:1533 +#: postmaster/postmaster.c:1442 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: 自身ã®å®Ÿè¡Œãƒ•ァイルã®ãƒ‘スãŒç‰¹å®šã§ãã¾ã›ã‚“" -#: postmaster/postmaster.c:1540 +#: postmaster/postmaster.c:1449 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: 一致ã™ã‚‹postgres実行ファイルãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: postmaster/postmaster.c:1563 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1472 utils/misc/tzparser.c:341 #, c-format msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." msgstr "ã“れã¯ã€PostgreSQLã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒä¸å®Œå…¨ã§ã‚ã‚‹ã‹ã¾ãŸã¯ã€ãƒ•ァイル\"%s\"ãŒæœ¬æ¥ã®å ´æ‰€ã‹ã‚‰ãªããªã£ã¦ã—ã¾ã£ãŸã“ã¨ã‚’示ã—ã¦ã„ã¾ã™ã€‚" -#: postmaster/postmaster.c:1590 +#: postmaster/postmaster.c:1499 #, c-format msgid "" "%s: could not find the database system\n" "Expected to find it in the directory \"%s\",\n" -"but could not open file \"%s\": %s\n" +"but could not open file \"%s\": %m\n" msgstr "" "%s: データベースシステムãŒã‚りã¾ã›ã‚“ã§ã—ãŸ\n" "ディレクトリ\"%s\"ã«ã‚ã‚‹ã‚‚ã®ã¨æƒ³å®šã—ã¦ã„ã¾ã—ãŸãŒã€\n" -"ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +"ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" #. translator: %s is SIGKILL or SIGABRT -#: postmaster/postmaster.c:1887 +#: postmaster/postmaster.c:1789 #, c-format msgid "issuing %s to recalcitrant children" msgstr "手ã«è² ãˆãªã„å­ãƒ—ロセスã«%sã‚’é€å‡ºã—ã¾ã™" -#: postmaster/postmaster.c:1909 +#: postmaster/postmaster.c:1811 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "データディレクトリã®ãƒ­ãƒƒã‚¯ãƒ•ァイルãŒä¸æ­£ãªãŸã‚ã€å³æ™‚シャットダウンを実行中ã§ã™" -#: postmaster/postmaster.c:1984 postmaster/postmaster.c:2012 -#, c-format -msgid "incomplete startup packet" -msgstr "開始パケットãŒä¸å®Œå…¨ã§ã™" - -#: postmaster/postmaster.c:1996 postmaster/postmaster.c:2029 -#, c-format -msgid "invalid length of startup packet" -msgstr "䏿­£ãªé–‹å§‹ãƒ‘ケット長" - -#: postmaster/postmaster.c:2058 -#, c-format -msgid "failed to send SSL negotiation response: %m" -msgstr "SSLãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³å¿œç­”ã®é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ: %m" - -#: postmaster/postmaster.c:2076 -#, c-format -msgid "received unencrypted data after SSL request" -msgstr "SSLè¦æ±‚ã®å¾Œã«éžæš—å·åŒ–データをå—ä¿¡ã—ã¾ã—ãŸ" - -#: postmaster/postmaster.c:2077 postmaster/postmaster.c:2121 -#, c-format -msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." -msgstr "ã“れã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚½ãƒ•トウェアã®ãƒã‚°ã§ã‚ã‚‹ã‹ã€man-in-the-middle攻撃ã®è¨¼å·¦ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" - -#: postmaster/postmaster.c:2102 -#, c-format -msgid "failed to send GSSAPI negotiation response: %m" -msgstr "GSSAPIãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³å¿œç­”ã®é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ: %m" - -#: postmaster/postmaster.c:2120 -#, c-format -msgid "received unencrypted data after GSSAPI encryption request" -msgstr "GSSAPIæš—å·åŒ–リクエストã®å¾Œã«éžæš—å·åŒ–データをå—ä¿¡" - -#: postmaster/postmaster.c:2144 -#, c-format -msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" -msgstr "フロントエンドプロトコル%u.%uをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“: サーãƒãƒ¼ã¯%u.0ã‹ã‚‰ %u.%uã¾ã§ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™" - -#: postmaster/postmaster.c:2211 -#, c-format -msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." -msgstr "有効ãªå€¤: \"false\", 0, \"true\", 1, \"database\"。" - -#: postmaster/postmaster.c:2252 -#, c-format -msgid "invalid startup packet layout: expected terminator as last byte" -msgstr "開始パケットã®é…ç½®ãŒä¸æ­£ã§ã™: 最終ãƒã‚¤ãƒˆã¯ã‚¿ãƒ¼ãƒŸãƒãƒ¼ã‚¿ã§ã‚ã‚‹ã¯ãšã§ã™" - -#: postmaster/postmaster.c:2269 -#, c-format -msgid "no PostgreSQL user name specified in startup packet" -msgstr "é–‹å§‹ãƒ‘ã‚±ãƒƒãƒˆã§æŒ‡å®šã•れãŸPostgreSQLユーザーåã¯å­˜åœ¨ã—ã¾ã›ã‚“" - -#: postmaster/postmaster.c:2333 -#, c-format -msgid "the database system is starting up" -msgstr "データベースシステムã¯èµ·å‹•処ç†ä¸­ã§ã™" - -#: postmaster/postmaster.c:2339 -#, c-format -msgid "the database system is not yet accepting connections" -msgstr "データベースシステムã¯ã¾ã æŽ¥ç¶šã‚’å—ã‘付ã‘ã¦ã„ã¾ã›ã‚“" - -#: postmaster/postmaster.c:2340 -#, c-format -msgid "Consistent recovery state has not been yet reached." -msgstr "リカãƒãƒªã®ä¸€è²«æ€§ã¯ã¾ã ç¢ºä¿ã•れã¦ã„ã¾ã›ã‚“。" - -#: postmaster/postmaster.c:2344 -#, c-format -msgid "the database system is not accepting connections" -msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã¯æŽ¥ç¶šã‚’å—ã‘付ã‘ã¦ã„ã¾ã›ã‚“" - -#: postmaster/postmaster.c:2345 -#, c-format -msgid "Hot standby mode is disabled." -msgstr "ホットスタンãƒã‚¤ãƒ¢ãƒ¼ãƒ‰ã¯ç„¡åйã§ã™ã€‚" - -#: postmaster/postmaster.c:2350 -#, c-format -msgid "the database system is shutting down" -msgstr "データベースシステムã¯ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã—ã¦ã„ã¾ã™" - -#: postmaster/postmaster.c:2355 -#, c-format -msgid "the database system is in recovery mode" -msgstr "データベースシステムã¯ãƒªã‚«ãƒãƒªãƒ¢ãƒ¼ãƒ‰ã§ã™" - -#: postmaster/postmaster.c:2360 storage/ipc/procarray.c:491 storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:353 -#, c-format -msgid "sorry, too many clients already" -msgstr "ç¾åœ¨ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæ•°ãŒå¤šã™ãŽã¾ã™" - -#: postmaster/postmaster.c:2447 +#: postmaster/postmaster.c:1874 #, c-format msgid "wrong key in cancel request for process %d" msgstr "プロセス%dã«å¯¾ã™ã‚‹ã‚­ãƒ£ãƒ³ã‚»ãƒ«è¦æ±‚ã«ãŠã„ã¦ã‚­ãƒ¼ãŒé–“é•ã£ã¦ã„ã¾ã™" -#: postmaster/postmaster.c:2459 +#: postmaster/postmaster.c:1886 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "ã‚­ãƒ£ãƒ³ã‚»ãƒ«è¦æ±‚内ã®PID %dãŒã©ã®ãƒ—ロセスã«ã‚‚一致ã—ã¾ã›ã‚“" -#: postmaster/postmaster.c:2726 +#: postmaster/postmaster.c:2106 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "SIGHUPã‚’å—ã‘å–りã¾ã—ãŸã€‚設定ファイルをリロードã—ã¦ã„ã¾ã™" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2750 postmaster/postmaster.c:2754 +#: postmaster/postmaster.c:2134 postmaster/postmaster.c:2138 #, c-format msgid "%s was not reloaded" msgstr "%s ã¯å†èª­ã¿è¾¼ã¿ã•れã¦ã„ã¾ã›ã‚“" -#: postmaster/postmaster.c:2764 +#: postmaster/postmaster.c:2148 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL設定ã¯å†èª­ã¿è¾¼ã¿ã•れã¦ã„ã¾ã›ã‚“" -#: postmaster/postmaster.c:2854 +#: postmaster/postmaster.c:2234 #, c-format msgid "received smart shutdown request" msgstr "ã‚¹ãƒžãƒ¼ãƒˆã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³è¦æ±‚ã‚’å—ã‘å–りã¾ã—ãŸ" -#: postmaster/postmaster.c:2895 +#: postmaster/postmaster.c:2275 #, c-format msgid "received fast shutdown request" msgstr "é«˜é€Ÿã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³è¦æ±‚ã‚’å—ã‘å–りã¾ã—ãŸ" -#: postmaster/postmaster.c:2913 +#: postmaster/postmaster.c:2293 #, c-format msgid "aborting any active transactions" msgstr "活動中ã®å…¨ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’アボートã—ã¦ã„ã¾ã™" -#: postmaster/postmaster.c:2937 +#: postmaster/postmaster.c:2317 #, c-format msgid "received immediate shutdown request" msgstr "峿™‚ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³è¦æ±‚ã‚’å—ã‘å–りã¾ã—ãŸ" -#: postmaster/postmaster.c:3013 +#: postmaster/postmaster.c:2389 #, c-format msgid "shutdown at recovery target" msgstr "リカãƒãƒªç›®æ¨™ã§ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã—ã¾ã™" -#: postmaster/postmaster.c:3031 postmaster/postmaster.c:3067 +#: postmaster/postmaster.c:2407 postmaster/postmaster.c:2443 msgid "startup process" msgstr "起動プロセス" -#: postmaster/postmaster.c:3034 +#: postmaster/postmaster.c:2410 #, c-format msgid "aborting startup due to startup process failure" msgstr "起動プロセスã®å¤±æ•—ã®ãŸã‚起動を中断ã—ã¦ã„ã¾ã™" -#: postmaster/postmaster.c:3107 +#: postmaster/postmaster.c:2485 #, c-format msgid "database system is ready to accept connections" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã®æŽ¥ç¶šå—ã‘ä»˜ã‘æº–å‚™ãŒæ•´ã„ã¾ã—ãŸ" -#: postmaster/postmaster.c:3128 +#: postmaster/postmaster.c:2506 msgid "background writer process" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰ãƒ©ã‚¤ã‚¿ãƒ—ロセス" -#: postmaster/postmaster.c:3175 +#: postmaster/postmaster.c:2553 msgid "checkpointer process" msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆå‡¦ç†ãƒ—ロセス" -#: postmaster/postmaster.c:3191 +#: postmaster/postmaster.c:2569 msgid "WAL writer process" msgstr "WALライタプロセス" -#: postmaster/postmaster.c:3206 +#: postmaster/postmaster.c:2584 msgid "WAL receiver process" msgstr "WAL å—信プロセス" -#: postmaster/postmaster.c:3221 +#: postmaster/postmaster.c:2598 +msgid "WAL summarizer process" +msgstr "WAL集約プロセス" + +#: postmaster/postmaster.c:2613 msgid "autovacuum launcher process" msgstr "自動VACUUM起動プロセス" -#: postmaster/postmaster.c:3239 +#: postmaster/postmaster.c:2631 msgid "archiver process" msgstr "アーカイãƒãƒ—ロセス" -#: postmaster/postmaster.c:3252 +#: postmaster/postmaster.c:2644 msgid "system logger process" msgstr "システムログå–得プロセス" -#: postmaster/postmaster.c:3309 +#: postmaster/postmaster.c:2661 +msgid "slot sync worker process" +msgstr "ã‚¹ãƒ­ãƒƒãƒˆåŒæœŸãƒ¯ãƒ¼ã‚«ãƒ¼ãƒ—ロセス" + +#: postmaster/postmaster.c:2717 #, c-format msgid "background worker \"%s\"" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼\"%s\"" -#: postmaster/postmaster.c:3388 postmaster/postmaster.c:3408 postmaster/postmaster.c:3415 postmaster/postmaster.c:3433 +#: postmaster/postmaster.c:2796 postmaster/postmaster.c:2816 postmaster/postmaster.c:2823 postmaster/postmaster.c:2841 msgid "server process" msgstr "サーãƒãƒ¼ãƒ—ロセス" -#: postmaster/postmaster.c:3487 +#: postmaster/postmaster.c:2895 #, c-format msgid "terminating any other active server processes" msgstr "ä»–ã®æ´»å‹•中ã®ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスを終了ã—ã¦ã„ã¾ã™" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3662 +#: postmaster/postmaster.c:3082 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d)ã¯çµ‚了コード%dã§çµ‚了ã—ã¾ã—ãŸ" -#: postmaster/postmaster.c:3664 postmaster/postmaster.c:3676 postmaster/postmaster.c:3686 postmaster/postmaster.c:3697 +#: postmaster/postmaster.c:3084 postmaster/postmaster.c:3096 postmaster/postmaster.c:3106 postmaster/postmaster.c:3117 #, c-format msgid "Failed process was running: %s" msgstr "失敗ã—ãŸãƒ—ロセスãŒå®Ÿè¡Œã—ã¦ã„ã¾ã—ãŸ: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3673 +#: postmaster/postmaster.c:3093 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d)ã¯ä¾‹å¤–%Xã§çµ‚了ã—ã¾ã—ãŸ" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3683 +#: postmaster/postmaster.c:3103 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d)ã¯ã‚·ã‚°ãƒŠãƒ«%dã§çµ‚了ã—ã¾ã—ãŸ: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3695 +#: postmaster/postmaster.c:3115 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d)ã¯èªè­˜ã§ããªã„ステータス%dã§çµ‚了ã—ã¾ã—ãŸ" -#: postmaster/postmaster.c:3903 +#: postmaster/postmaster.c:3331 #, c-format msgid "abnormal database system shutdown" msgstr "データベースシステムã¯ç•°å¸¸ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã—ã¾ã—ãŸ" -#: postmaster/postmaster.c:3929 +#: postmaster/postmaster.c:3357 #, c-format msgid "shutting down due to startup process failure" msgstr "起動プロセスã®å¤±æ•—ã®ãŸã‚シャットダウンã—ã¦ã„ã¾ã™" -#: postmaster/postmaster.c:3935 +#: postmaster/postmaster.c:3363 #, c-format -msgid "shutting down because restart_after_crash is off" -msgstr "restart_after_crashãŒoffã§ã‚ã‚‹ãŸã‚シャットダウンã—ã¾ã™" +msgid "shutting down because \"restart_after_crash\" is off" +msgstr "\"restart_after_crash\"ãŒoffã§ã‚ã‚‹ãŸã‚シャットダウンã—ã¾ã™" -#: postmaster/postmaster.c:3947 +#: postmaster/postmaster.c:3375 #, c-format msgid "all server processes terminated; reinitializing" msgstr "å…¨ã¦ã®ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスãŒçµ‚了ã—ã¾ã—ãŸ: å†åˆæœŸåŒ–ã—ã¦ã„ã¾ã™" -#: postmaster/postmaster.c:4141 postmaster/postmaster.c:5459 postmaster/postmaster.c:5857 +#: postmaster/postmaster.c:3574 postmaster/postmaster.c:3985 postmaster/postmaster.c:4374 #, c-format msgid "could not generate random cancel key" msgstr "ランダムãªã‚­ãƒ£ãƒ³ã‚»ãƒ«ã‚­ãƒ¼ã‚’生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: postmaster/postmaster.c:4203 +#: postmaster/postmaster.c:3607 #, c-format msgid "could not fork new process for connection: %m" msgstr "æŽ¥ç¶šç”¨ã®æ–°ã—ã„プロセスをforkã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: postmaster/postmaster.c:4245 +#: postmaster/postmaster.c:3649 msgid "could not fork new process for connection: " msgstr "æŽ¥ç¶šç”¨ã®æ–°ã—ã„プロセスをforkã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: postmaster/postmaster.c:4351 -#, c-format -msgid "connection received: host=%s port=%s" -msgstr "接続をå—ã‘付ã‘ã¾ã—ãŸ: ホスト=%s ãƒãƒ¼ãƒˆç•ªå·=%s" - -#: postmaster/postmaster.c:4356 -#, c-format -msgid "connection received: host=%s" -msgstr "接続をå—ã‘付ã‘ã¾ã—ãŸ: ホスト=%s" - -#: postmaster/postmaster.c:4593 -#, c-format -msgid "could not execute server process \"%s\": %m" -msgstr "サーãƒãƒ¼ãƒ—ロセス\"%s\"を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: postmaster/postmaster.c:4651 -#, c-format -msgid "could not create backend parameter file mapping: error code %lu" -msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ‘ラメータファイルã®ãƒ•ァイルマッピングを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード%lu" - -#: postmaster/postmaster.c:4660 -#, c-format -msgid "could not map backend parameter memory: error code %lu" -msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ‘ラメータã®ãƒ¡ãƒ¢ãƒªã‚’マップã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" - -#: postmaster/postmaster.c:4687 -#, c-format -msgid "subprocess command line too long" -msgstr "サブプロセスã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ãŒé•·ã™ãŽã¾ã™" - -#: postmaster/postmaster.c:4705 -#, c-format -msgid "CreateProcess() call failed: %m (error code %lu)" -msgstr "CreateProcess() ã®å‘¼ã³å‡ºã—ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m (エラーコード %lu)" - -#: postmaster/postmaster.c:4732 -#, c-format -msgid "could not unmap view of backend parameter file: error code %lu" -msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ‘ラメータファイルã®ãƒ“ューをアンマップã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" - -#: postmaster/postmaster.c:4736 -#, c-format -msgid "could not close handle to backend parameter file: error code %lu" -msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ‘ラメータファイルã®ãƒãƒ³ãƒ‰ãƒ«ã‚’クローズã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード%lu" - -#: postmaster/postmaster.c:4758 -#, c-format -msgid "giving up after too many tries to reserve shared memory" -msgstr "共有メモリã®ç¢ºä¿ã®ãƒªãƒˆãƒ©ã‚¤å›žæ•°ãŒå¤šã™ãŽã‚‹ãŸã‚中断ã—ã¾ã™" - -#: postmaster/postmaster.c:4759 -#, c-format -msgid "This might be caused by ASLR or antivirus software." -msgstr "ã“れã¯ASLRã¾ãŸã¯ã‚¢ãƒ³ãƒã‚¦ã‚¤ãƒ«ã‚¹ã‚½ãƒ•トウェアãŒåŽŸå› ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" - -#: postmaster/postmaster.c:4932 -#, c-format -msgid "SSL configuration could not be loaded in child process" -msgstr "SSLæ§‹æˆã¯å­ãƒ—ロセスã§ã¯èª­ã¿è¾¼ã‚ã¾ã›ã‚“" - -#: postmaster/postmaster.c:5057 +#: postmaster/postmaster.c:3683 #, c-format -msgid "Please report this to <%s>." -msgstr "ã“れを<%s>ã¾ã§å ±å‘Šã—ã¦ãã ã•ã„。" +msgid "postmaster became multithreaded" +msgstr "postmasterãŒãƒžãƒ«ãƒã‚¹ãƒ¬ãƒƒãƒ‰å‹•作ã«ãªã£ã¦ã„ã¾ã™" -#: postmaster/postmaster.c:5125 +#: postmaster/postmaster.c:3752 #, c-format msgid "database system is ready to accept read-only connections" msgstr "データベースシステムã¯ãƒªãƒ¼ãƒ‰ã‚ªãƒ³ãƒªãƒ¼æŽ¥ç¶šã®å—ã‘ä»˜ã‘æº–å‚™ãŒã§ãã¾ã—ãŸ" -#: postmaster/postmaster.c:5383 -#, c-format -msgid "could not fork startup process: %m" -msgstr "起動プロセスをforkã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: postmaster/postmaster.c:5387 -#, c-format -msgid "could not fork archiver process: %m" -msgstr "アーカイãƒãƒ—ロセスをforkã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: postmaster/postmaster.c:5391 -#, c-format -msgid "could not fork background writer process: %m" -msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰ãƒ©ã‚¤ã‚¿ãƒ—ロセスをforkã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: postmaster/postmaster.c:5395 -#, c-format -msgid "could not fork checkpointer process: %m" -msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆå‡¦ç†ãƒ—ロセスをforkã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: postmaster/postmaster.c:5399 -#, c-format -msgid "could not fork WAL writer process: %m" -msgstr "WALライタプロセスをforkã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: postmaster/postmaster.c:5403 -#, c-format -msgid "could not fork WAL receiver process: %m" -msgstr "WAL å—信プロセスを fork ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: postmaster/postmaster.c:5407 +#: postmaster/postmaster.c:3935 #, c-format -msgid "could not fork process: %m" -msgstr "プロセスをforkã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" +msgid "could not fork \"%s\" process: %m" +msgstr "\"%s\"プロセスをforkã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: postmaster/postmaster.c:5608 postmaster/postmaster.c:5635 +#: postmaster/postmaster.c:4173 postmaster/postmaster.c:4207 #, c-format msgid "database connection requirement not indicated during registration" msgstr "登録時ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹æŽ¥ç¶šã®å¿…è¦æ€§ãŒç¤ºã•れã¦ã„ã¾ã›ã‚“" -#: postmaster/postmaster.c:5619 postmaster/postmaster.c:5646 +#: postmaster/postmaster.c:4183 postmaster/postmaster.c:4217 #, c-format msgid "invalid processing mode in background worker" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼å†…ã®ä¸æ­£ãªå‡¦ç†ãƒ¢ãƒ¼ãƒ‰" -#: postmaster/postmaster.c:5731 -#, c-format -msgid "could not fork worker process: %m" -msgstr "ワーカープロセスをforkã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: postmaster/postmaster.c:5843 +#: postmaster/postmaster.c:4277 #, c-format -msgid "no slot available for new worker process" -msgstr "æ–°ã—ã„ワーカープロセスã«å‰²ã‚Šå½“ã¦å¯èƒ½ãªã‚¹ãƒ­ãƒƒãƒˆãŒã‚りã¾ã›ã‚“" +msgid "could not fork background worker process: %m" +msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼ãƒ—ロセスをforkã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: postmaster/postmaster.c:6174 +#: postmaster/postmaster.c:4360 #, c-format -msgid "could not duplicate socket %d for use in backend: error code %d" -msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã§ä½¿ç”¨ã™ã‚‹ãŸã‚ã«ã‚½ã‚±ãƒƒãƒˆ%dを複製ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %d" +msgid "no slot available for new background worker process" +msgstr "æ–°ã—ã„ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼ãƒ—ロセスã«å‰²ã‚Šå½“ã¦å¯èƒ½ãªã‚¹ãƒ­ãƒƒãƒˆãŒã‚りã¾ã›ã‚“" -#: postmaster/postmaster.c:6206 -#, c-format -msgid "could not create inherited socket: error code %d\n" -msgstr "継承ã—ãŸã‚½ã‚±ãƒƒãƒˆã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %d\n" - -#: postmaster/postmaster.c:6235 -#, c-format -msgid "could not open backend variables file \"%s\": %s\n" -msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰å¤‰æ•°ãƒ•ァイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" - -#: postmaster/postmaster.c:6242 -#, c-format -msgid "could not read from backend variables file \"%s\": %s\n" -msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰å¤‰æ•°ãƒ•ァイル\"%s\"ã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %s\n" - -#: postmaster/postmaster.c:6251 -#, c-format -msgid "could not remove file \"%s\": %s\n" -msgstr "ファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" - -#: postmaster/postmaster.c:6268 -#, c-format -msgid "could not map view of backend variables: error code %lu\n" -msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰å¤‰æ•°ã®ãƒ“ューをマップã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu\n" - -#: postmaster/postmaster.c:6277 -#, c-format -msgid "could not unmap view of backend variables: error code %lu\n" -msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰å¤‰æ•°ã®ãƒ“ューをアンマップã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu\n" - -#: postmaster/postmaster.c:6284 -#, c-format -msgid "could not close handle to backend parameter variables: error code %lu\n" -msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ‘ラメータ変数ã®ãƒãƒ³ãƒ‰ãƒ«ã‚’クローズã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード%lu\n" - -#: postmaster/postmaster.c:6443 +#: postmaster/postmaster.c:4623 #, c-format msgid "could not read exit code for process\n" msgstr "å­ãƒ—ロセスã®çµ‚了コードã®èª­ã¿è¾¼ã¿ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ\n" -#: postmaster/postmaster.c:6485 +#: postmaster/postmaster.c:4665 #, c-format msgid "could not post child completion status\n" msgstr "個プロセスã®çµ‚了コードを投稿ã§ãã¾ã›ã‚“ã§ã—ãŸ\n" -#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 +#: postmaster/syslogger.c:529 postmaster/syslogger.c:1173 #, c-format msgid "could not read from logger pipe: %m" msgstr "ロガーパイプã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 +#: postmaster/syslogger.c:629 postmaster/syslogger.c:643 #, c-format msgid "could not create pipe for syslog: %m" msgstr "syslog用ã®ãƒ‘イプを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: postmaster/syslogger.c:677 +#: postmaster/syslogger.c:712 #, c-format msgid "could not fork system logger: %m" msgstr "システムロガーをforkã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: postmaster/syslogger.c:713 +#: postmaster/syslogger.c:731 #, c-format msgid "redirecting log output to logging collector process" msgstr "ログ出力をログåŽé›†ãƒ—ロセスã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã—ã¦ã„ã¾ã™" -#: postmaster/syslogger.c:714 +#: postmaster/syslogger.c:732 #, c-format msgid "Future log output will appear in directory \"%s\"." msgstr "ã“ã“ã‹ã‚‰ã®ãƒ­ã‚°å‡ºåŠ›ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"ã«ç¾ã‚Œã¾ã™ã€‚" -#: postmaster/syslogger.c:722 +#: postmaster/syslogger.c:740 #, c-format msgid "could not redirect stdout: %m" msgstr "標準出力ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 +#: postmaster/syslogger.c:745 postmaster/syslogger.c:762 #, c-format msgid "could not redirect stderr: %m" msgstr "標準エラー出力ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: postmaster/syslogger.c:1177 +#: postmaster/syslogger.c:1128 #, c-format -msgid "could not write to log file: %s\n" -msgstr "ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "could not write to log file: %m\n" +msgstr "ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m\n" -#: postmaster/syslogger.c:1295 +#: postmaster/syslogger.c:1246 #, c-format msgid "could not open log file \"%s\": %m" msgstr "ロックファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: postmaster/syslogger.c:1385 +#: postmaster/syslogger.c:1336 #, c-format msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "自動ローテーションを無効ã«ã—ã¦ã„ã¾ã™(å†åº¦æœ‰åйã«ã™ã‚‹ã«ã¯SIGHUPを使用ã—ã¦ãã ã•ã„)" -#: regex/regc_pg_locale.c:242 +#: postmaster/walsummarizer.c:740 +#, c-format +msgid "WAL summarization is not progressing" +msgstr "WAL集計ãŒé€²ã‚“ã§ã„ã¾ã›ã‚“" + +#: postmaster/walsummarizer.c:741 +#, c-format +msgid "Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/%X in memory." +msgstr "集計ã¯%X/%Xã¾ã§é€²ã‚“ã§ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ãŒã€ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã§ã¯%X/%Xã€ãƒ¡ãƒ¢ãƒªä¸Šã§ã¯%X/%Xよりã‚ã¨ã¾ã§é€²ã‚“ã§ã„ã¾ã›ã‚“。" + +#: postmaster/walsummarizer.c:755 +#, c-format +msgid "still waiting for WAL summarization through %X/%X after %ld second" +msgid_plural "still waiting for WAL summarization through %X/%X after %ld seconds" +msgstr[0] "%3$ld秒経éŽã—ã¾ã—ãŸãŒã€WAL集計ãŒ%1$X/%2$Xã«åˆ°é”ã™ã‚‹ã®ã‚’ã¾ã å¾…ã£ã¦ã¾ã™" + +#: postmaster/walsummarizer.c:760 +#, c-format +msgid "Summarization has reached %X/%X on disk and %X/%X in memory." +msgstr "集計ãŒãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã§%X/%Xã€ãƒ¡ãƒ¢ãƒªä¸Šã§%X/%Xã«åˆ°é”ã—ã¾ã—ãŸã€‚" + +#: postmaster/walsummarizer.c:1000 +#, c-format +msgid "could not find a valid record after %X/%X" +msgstr "%X/%Xã®å¾Œã«æœ‰åйãªãƒ¬ã‚³ãƒ¼ãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" + +#: postmaster/walsummarizer.c:1045 +#, c-format +msgid "could not read WAL from timeline %u at %X/%X: %s" +msgstr "%X/%Xã§ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uã®WALを読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: postmaster/walsummarizer.c:1051 +#, c-format +msgid "could not read WAL from timeline %u at %X/%X" +msgstr "%X/%Xã§ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uã®WALを読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ" + +#: regex/regc_pg_locale.c:244 #, c-format msgid "could not determine which collation to use for regular expression" msgstr "æ­£è¦è¡¨ç¾ã§ä½¿ç”¨ã™ã‚‹ç…§åˆè¦å‰‡ã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: regex/regc_pg_locale.c:265 +#: regex/regc_pg_locale.c:262 #, c-format msgid "nondeterministic collations are not supported for regular expressions" msgstr "éžæ±ºå®šçš„ç…§åˆé †åºã¯æ­£è¦è¡¨ç¾ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: repl_gram.y:301 repl_gram.y:333 +#: repl_gram.y:318 repl_gram.y:359 #, c-format msgid "invalid timeline %u" msgstr "タイムライン%uã¯ä¸æ­£ã§ã™" -#: repl_scanner.l:151 +#: repl_scanner.l:154 msgid "invalid streaming start location" msgstr "䏿­£ãªã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°é–‹å§‹ä½ç½®" -#: repl_scanner.l:208 scan.l:741 -msgid "unterminated quoted string" -msgstr "文字列ã®å¼•用符ãŒé–‰ã˜ã¦ã„ã¾ã›ã‚“" - -#: replication/libpqwalreceiver/libpqwalreceiver.c:197 replication/libpqwalreceiver/libpqwalreceiver.c:280 +#: replication/libpqwalreceiver/libpqwalreceiver.c:267 replication/libpqwalreceiver/libpqwalreceiver.c:358 #, c-format msgid "password is required" msgstr "パスワードãŒå¿…è¦ã§ã™" -#: replication/libpqwalreceiver/libpqwalreceiver.c:198 +#: replication/libpqwalreceiver/libpqwalreceiver.c:268 #, c-format msgid "Non-superuser cannot connect if the server does not request a password." msgstr "éžã‚¹ãƒ¼ãƒ‘ーユーザーã¯ã‚µãƒ¼ãƒãƒ¼ãŒãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã‚’è¦æ±‚ã—ã¦ã“ãªã„å ´åˆã¯æŽ¥ç¶šã§ãã¾ã›ã‚“。" -#: replication/libpqwalreceiver/libpqwalreceiver.c:199 +#: replication/libpqwalreceiver/libpqwalreceiver.c:269 #, c-format -msgid "Target server's authentication method must be changed. or set password_required=false in the subscription attributes." +msgid "Target server's authentication method must be changed, or set password_required=false in the subscription parameters." msgstr "接続先サーãƒãƒ¼ã®èªè¨¼æ–¹å¼ã‚’変更ã™ã‚‹ã‹ã€ã‚µãƒ–スクリプション属性ã§password_requiredã‚’falseã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: replication/libpqwalreceiver/libpqwalreceiver.c:211 +#: replication/libpqwalreceiver/libpqwalreceiver.c:285 #, c-format msgid "could not clear search path: %s" msgstr "search_pathを消去ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:257 +#: replication/libpqwalreceiver/libpqwalreceiver.c:331 replication/libpqwalreceiver/libpqwalreceiver.c:517 #, c-format msgid "invalid connection string syntax: %s" msgstr "䏿­£ãªæŽ¥ç¶šæ–‡å­—åˆ—ã®æ§‹æ–‡: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:281 +#: replication/libpqwalreceiver/libpqwalreceiver.c:359 #, c-format msgid "Non-superusers must provide a password in the connection string." msgstr "éžã‚¹ãƒ¼ãƒ‘ãƒ¼ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯æŽ¥ç¶šæ–‡å­—åˆ—ä¸­ã§ãƒ‘スワードを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: replication/libpqwalreceiver/libpqwalreceiver.c:307 +#: replication/libpqwalreceiver/libpqwalreceiver.c:386 #, c-format msgid "could not parse connection string: %s" msgstr "接続文字列をパースã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:380 +#: replication/libpqwalreceiver/libpqwalreceiver.c:459 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "プライマリサーãƒãƒ¼ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã®è­˜åˆ¥å­ã¨ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ ID ã‚’å—ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:392 replication/libpqwalreceiver/libpqwalreceiver.c:635 +#: replication/libpqwalreceiver/libpqwalreceiver.c:476 replication/libpqwalreceiver/libpqwalreceiver.c:763 #, c-format msgid "invalid response from primary server" msgstr "プライマリサーãƒãƒ¼ã‹ã‚‰ã®å¿œç­”ãŒä¸æ­£ã§ã™" -#: replication/libpqwalreceiver/libpqwalreceiver.c:393 +#: replication/libpqwalreceiver/libpqwalreceiver.c:477 #, c-format msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." msgstr "システムを識別ã§ãã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%d行ã§%dåˆ—ã€æœŸå¾…ã—ã¦ã„ãŸã®ã¯%d行ã§%d以上ã®åˆ—ã§ã—ãŸã€‚" -#: replication/libpqwalreceiver/libpqwalreceiver.c:478 replication/libpqwalreceiver/libpqwalreceiver.c:485 replication/libpqwalreceiver/libpqwalreceiver.c:515 +#: replication/libpqwalreceiver/libpqwalreceiver.c:606 replication/libpqwalreceiver/libpqwalreceiver.c:613 replication/libpqwalreceiver/libpqwalreceiver.c:643 #, c-format msgid "could not start WAL streaming: %s" msgstr "WAL ストリーミングを開始ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:539 +#: replication/libpqwalreceiver/libpqwalreceiver.c:667 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "プライマリã«ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã®çµ‚了メッセージをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:562 +#: replication/libpqwalreceiver/libpqwalreceiver.c:690 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "ストリーミングã®çµ‚äº†å¾Œã®æƒ³å®šå¤–ã®çµæžœã‚»ãƒƒãƒˆ" -#: replication/libpqwalreceiver/libpqwalreceiver.c:577 +#: replication/libpqwalreceiver/libpqwalreceiver.c:705 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "ストリーミングCOPY終了中ã®ã‚¨ãƒ©ãƒ¼: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:587 +#: replication/libpqwalreceiver/libpqwalreceiver.c:715 #, c-format msgid "error reading result of streaming command: %s" msgstr "ストリーミングコマンドã®çµæžœèª­ã¿å–り中ã®ã‚¨ãƒ©ãƒ¼: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:596 replication/libpqwalreceiver/libpqwalreceiver.c:832 +#: replication/libpqwalreceiver/libpqwalreceiver.c:724 replication/libpqwalreceiver/libpqwalreceiver.c:957 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "CommandCompleteå¾Œã®æƒ³å®šå¤–ã®çµæžœ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:623 +#: replication/libpqwalreceiver/libpqwalreceiver.c:751 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "プライマリサーãƒãƒ¼ã‹ã‚‰ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³å±¥æ­´ãƒ•ァイルをå—ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:636 +#: replication/libpqwalreceiver/libpqwalreceiver.c:764 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "2個ã®ãƒ•ィールドをæŒã¤1個ã®ã‚¿ãƒ—ルを期待ã—ã¦ã„ã¾ã—ãŸãŒã€%2$d 個ã®ãƒ•ィールドをæŒã¤ %1$d 個ã®ã‚¿ãƒ—ルをå—ä¿¡ã—ã¾ã—ãŸã€‚" -#: replication/libpqwalreceiver/libpqwalreceiver.c:795 replication/libpqwalreceiver/libpqwalreceiver.c:848 replication/libpqwalreceiver/libpqwalreceiver.c:855 +#: replication/libpqwalreceiver/libpqwalreceiver.c:920 replication/libpqwalreceiver/libpqwalreceiver.c:973 replication/libpqwalreceiver/libpqwalreceiver.c:980 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "WAL ストリームã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:875 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1000 #, c-format msgid "could not send data to WAL stream: %s" msgstr "WAL ストリームã«ãƒ‡ãƒ¼ã‚¿ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:967 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1101 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "レプリケーションスロット\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1013 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1140 +#, c-format +msgid "could not alter replication slot \"%s\": %s" +msgstr "レプリケーションスロット\"%s\"を変更ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1174 #, c-format msgid "invalid query response" msgstr "䏿­£ãªå•ã„åˆã‚ã›å¿œç­”" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1014 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1175 #, c-format msgid "Expected %d fields, got %d fields." msgstr "%d個ã®åˆ—を期待ã—ã¦ã„ã¾ã—ãŸãŒã€%d列をå—ä¿¡ã—ã¾ã—ãŸã€‚" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1084 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1245 #, c-format msgid "the query interface requires a database connection" msgstr "クエリインタフェースã®å‹•作ã«ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ãŒå¿…è¦ã§ã™" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1115 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1277 msgid "empty query" msgstr "空ã®å•ã„åˆã‚ã›" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1121 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1283 msgid "unexpected pipeline mode" msgstr "想定ã•れã¦ã„ãªã„パイプラインモード" @@ -19584,194 +20051,194 @@ msgstr "想定ã•れã¦ã„ãªã„パイプラインモード" msgid "logical replication parallel apply worker for subscription \"%s\" has finished" msgstr "サブスクリプション\"%s\"ã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—リケーション並列é©ç”¨ãƒ¯ãƒ¼ã‚«ãƒ¼ãŒçµ‚了ã—ã¾ã—ãŸ" -#: replication/logical/applyparallelworker.c:825 +#: replication/logical/applyparallelworker.c:822 #, c-format msgid "lost connection to the logical replication apply worker" msgstr "è«–ç†ãƒ¬ãƒ—リケーションé©ç”¨ãƒ¯ãƒ¼ã‚«ãƒ¼ã¸ã®æŽ¥ç¶šã‚’失ã„ã¾ã—ãŸ" -#: replication/logical/applyparallelworker.c:893 -#, c-format -msgid "unable to map dynamic shared memory segment" -msgstr "動的共有メモリセグメントã¯ãƒžãƒƒãƒ—ã§ãã¾ã›ã‚“ã§ã—ãŸ" - -#: replication/logical/applyparallelworker.c:899 -#, c-format -msgid "bad magic number in dynamic shared memory segment" -msgstr "動的共有メモリセグメントã®ãƒžã‚¸ãƒƒã‚¯ãƒŠãƒ³ãƒãƒ¼ãŒä¸æ­£ã§ã™" - -#: replication/logical/applyparallelworker.c:1027 replication/logical/applyparallelworker.c:1029 replication/logical/worker.c:447 +#: replication/logical/applyparallelworker.c:1024 replication/logical/applyparallelworker.c:1026 msgid "logical replication parallel apply worker" msgstr "è«–ç†ãƒ¬ãƒ—リケーション並列é©ç”¨ãƒ¯ãƒ¼ã‚«ãƒ¼" -#: replication/logical/applyparallelworker.c:1043 +#: replication/logical/applyparallelworker.c:1040 #, c-format msgid "logical replication parallel apply worker exited due to error" msgstr "è«–ç†ãƒ¬ãƒ—リケーション並列é©ç”¨ãƒ¯ãƒ¼ã‚«ãƒ¼ãŒã‚¨ãƒ©ãƒ¼ã«ã‚ˆã‚Šçµ‚了ã—ã¾ã—ãŸ" -#: replication/logical/applyparallelworker.c:1130 replication/logical/applyparallelworker.c:1303 +#: replication/logical/applyparallelworker.c:1127 replication/logical/applyparallelworker.c:1300 #, c-format msgid "lost connection to the logical replication parallel apply worker" msgstr "è«–ç†ãƒ¬ãƒ—リケーション並列é©ç”¨ãƒ¯ãƒ¼ã‚«ãƒ¼ã¸ã®æŽ¥ç¶šã‚’失ã„ã¾ã—ãŸ" -#: replication/logical/applyparallelworker.c:1183 +#: replication/logical/applyparallelworker.c:1180 #, c-format msgid "could not send data to shared-memory queue" msgstr "共有メモリキューã«ãƒ‡ãƒ¼ã‚¿ã‚’é€å‡ºã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: replication/logical/applyparallelworker.c:1218 +#: replication/logical/applyparallelworker.c:1215 #, c-format msgid "logical replication apply worker will serialize the remaining changes of remote transaction %u to a file" msgstr "è«–ç†ãƒ¬ãƒ—リケーションt起用ワーカーã¯ãƒªãƒ¢ãƒ¼ãƒˆãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%uã®æ®‹ã‚Šã®å¤‰æ›´ã‚’シリアライズã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã«æ ¼ç´ã—ã¾ã™" -#: replication/logical/decode.c:180 replication/logical/logical.c:140 +#: replication/logical/decode.c:177 replication/logical/logical.c:141 #, c-format -msgid "logical decoding on standby requires wal_level >= logical on the primary" -msgstr "スタンãƒã‚¤ä¸Šã§è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚’行ã†ãŸã‚ã«ã¯ãƒ—ライマリ上ã§wal_level >= logicalã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" +msgid "logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary" +msgstr "スタンãƒã‚¤ä¸Šã§è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚’行ã†ãŸã‚ã«ã¯ãƒ—ライマリ上ã§\"wal_level\" >= \"logical\"ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: replication/logical/launcher.c:331 +#: replication/logical/launcher.c:334 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "max_replication_slots = 0 ã®æ™‚ã¯è«–ç†ãƒ¬ãƒ—リケーションワーカーã¯èµ·å‹•ã§ãã¾ã›ã‚“" -#: replication/logical/launcher.c:424 +#: replication/logical/launcher.c:427 #, c-format msgid "out of logical replication worker slots" msgstr "è«–ç†ãƒ¬ãƒ—リケーションワーカースロットã¯å…¨ã¦ä½¿ç”¨ä¸­ã§ã™" -#: replication/logical/launcher.c:425 +#: replication/logical/launcher.c:428 replication/logical/launcher.c:514 replication/slot.c:1524 storage/lmgr/lock.c:985 storage/lmgr/lock.c:1023 storage/lmgr/lock.c:2836 storage/lmgr/lock.c:4221 storage/lmgr/lock.c:4286 storage/lmgr/lock.c:4636 storage/lmgr/predicate.c:2469 storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:3881 #, c-format -msgid "You might need to increase max_logical_replication_workers." -msgstr "max_logical_replication_workersを増やã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。" +msgid "You might need to increase \"%s\"." +msgstr "\"%s\"を大ããã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: replication/logical/launcher.c:498 +#: replication/logical/launcher.c:513 #, c-format msgid "out of background worker slots" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ¯ãƒ¼ã‚«ãƒ¼ã‚¹ãƒ­ãƒƒãƒˆãŒè¶³ã‚Šã¾ã›ã‚“" -#: replication/logical/launcher.c:499 -#, c-format -msgid "You might need to increase max_worker_processes." -msgstr "max_worker_processesを増やã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“" - -#: replication/logical/launcher.c:705 +#: replication/logical/launcher.c:720 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "è«–ç†ãƒ¬ãƒ—リケーションワーカースロット%dãŒç©ºã„ã¦ã„ãªã„ãŸã‚接続ã§ãã¾ã›ã‚“" -#: replication/logical/launcher.c:714 +#: replication/logical/launcher.c:729 #, c-format msgid "logical replication worker slot %d is already used by another worker, cannot attach" msgstr "è«–ç†ãƒ¬ãƒ—リケーションワーカースロット%dãŒæ—¢ã«ä»–ã®ãƒ¯ãƒ¼ã‚«ãƒ¼ã«ä½¿ç”¨ã•れã¦ã„ã‚‹ãŸã‚接続ã§ãã¾ã›ã‚“" -#: replication/logical/logical.c:120 +#: replication/logical/logical.c:121 #, c-format -msgid "logical decoding requires wal_level >= logical" -msgstr "è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚’行ã†ãŸã‚ã«ã¯ wal_level >= logical ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" +msgid "logical decoding requires \"wal_level\" >= \"logical\"" +msgstr "è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚’行ã†ãŸã‚ã«ã¯\"wal_level\" >= \"logical\" ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: replication/logical/logical.c:125 +#: replication/logical/logical.c:126 #, c-format msgid "logical decoding requires a database connection" msgstr "è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚’行ã†ã«ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹æŽ¥ç¶šãŒå¿…è¦ã§ã™" -#: replication/logical/logical.c:363 replication/logical/logical.c:517 +#: replication/logical/logical.c:365 replication/logical/logical.c:519 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "物ç†ãƒ¬ãƒ—リケーションスロットを論ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã«ä½¿ç”¨ã™ã‚‹ã¨ã¯ã§ãã¾ã›ã‚“" -#: replication/logical/logical.c:368 replication/logical/logical.c:522 +#: replication/logical/logical.c:370 replication/logical/logical.c:529 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "レプリケーションスロット\"%s\"ã¯ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã§ã¯ä½œæˆã•れã¦ã„ã¾ã›ã‚“" -#: replication/logical/logical.c:375 +#: replication/logical/logical.c:377 #, c-format msgid "cannot create logical replication slot in transaction that has performed writes" msgstr "è«–ç†ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ãƒ­ãƒƒãƒˆã¯æ›¸ãè¾¼ã¿ã‚’行ã£ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ä¸­ã§ç”Ÿæˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: replication/logical/logical.c:534 replication/logical/logical.c:541 +#: replication/logical/logical.c:540 +#, c-format +msgid "cannot use replication slot \"%s\" for logical decoding" +msgstr "レプリケーションスロット\"%s\"ã¯è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#: replication/logical/logical.c:542 replication/slot.c:798 replication/slot.c:829 +#, c-format +msgid "This replication slot is being synchronized from the primary server." +msgstr "ã“ã®ãƒ¬ãƒ—リケーションスロットã¯ãƒ—ライマリサーãƒãƒ¼ã‹ã‚‰ã®åŒæœŸä¸­ã§ã™ã€‚" + +#: replication/logical/logical.c:543 +#, c-format +msgid "Specify another replication slot." +msgstr "ä»–ã®ãƒ¬ãƒ—リケーションスロットを指定ã—ã¦ãã ã•ã„。" + +#: replication/logical/logical.c:554 replication/logical/logical.c:561 #, c-format msgid "can no longer get changes from replication slot \"%s\"" msgstr "ã™ã§ã«ãƒ¬ãƒ—リケーションスロット\"%s\"ã‹ã‚‰å¤‰æ›´ã‚’å–り出ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: replication/logical/logical.c:536 +#: replication/logical/logical.c:556 #, c-format msgid "This slot has been invalidated because it exceeded the maximum reserved size." msgstr "最大留ä¿é‡ã‚’è¶…ãˆãŸãŸã‚ã€ã“ã®ã‚¹ãƒ­ãƒƒãƒˆã¯ç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™ã€‚" -#: replication/logical/logical.c:543 +#: replication/logical/logical.c:563 #, c-format msgid "This slot has been invalidated because it was conflicting with recovery." msgstr "リカãƒãƒªã¨ã®ç«¶åˆã®ãŸã‚ã€ã“ã®ã‚¹ãƒ­ãƒƒãƒˆã¯ç„¡åŠ¹åŒ–ã•れã¾ã—ãŸã€‚" -#: replication/logical/logical.c:608 +#: replication/logical/logical.c:628 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "スロット\"%s\"ã®è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚’é–‹å§‹ã—ã¾ã™" -#: replication/logical/logical.c:610 +#: replication/logical/logical.c:630 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "%3$X/%4$Xã‹ã‚‰WALを読ã¿å–ã£ã¦ã€%1$X/%2$X以é™ã«ã‚³ãƒŸãƒƒãƒˆã•れるトランザクションをストリーミングã—ã¾ã™ã€‚" -#: replication/logical/logical.c:758 +#: replication/logical/logical.c:778 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "スロット\"%s\", 出力プラグイン\"%s\", %sコールãƒãƒƒã‚¯ã®å‡¦ç†ä¸­, 関連LSN %X/%X" -#: replication/logical/logical.c:764 +#: replication/logical/logical.c:784 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "スロット\"%s\", 出力プラグイン\"%s\", %sコールãƒãƒƒã‚¯ã®å‡¦ç†ä¸­" -#: replication/logical/logical.c:935 replication/logical/logical.c:980 replication/logical/logical.c:1025 replication/logical/logical.c:1071 +#: replication/logical/logical.c:955 replication/logical/logical.c:1000 replication/logical/logical.c:1045 replication/logical/logical.c:1091 #, c-format msgid "logical replication at prepare time requires a %s callback" msgstr "プリペア時ã®è«–ç†ãƒ¬ãƒ—リケーションを行ã†ã«ã¯%sコールãƒãƒƒã‚¯ãŒå¿…è¦ã§ã™" -#: replication/logical/logical.c:1303 replication/logical/logical.c:1352 replication/logical/logical.c:1393 replication/logical/logical.c:1479 replication/logical/logical.c:1528 +#: replication/logical/logical.c:1323 replication/logical/logical.c:1372 replication/logical/logical.c:1413 replication/logical/logical.c:1499 replication/logical/logical.c:1548 #, c-format msgid "logical streaming requires a %s callback" msgstr "è«–ç†ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’行ã†ã«ã¯%sコールãƒãƒƒã‚¯ãŒå¿…è¦ã§ã™" -#: replication/logical/logical.c:1438 +#: replication/logical/logical.c:1458 #, c-format msgid "logical streaming at prepare time requires a %s callback" msgstr "プリペア時ã®è«–ç†ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’行ã†ã«ã¯%sコールãƒãƒƒã‚¯ãŒå¿…è¦ã§ã™" -#: replication/logical/logicalfuncs.c:126 +#: replication/logical/logicalfuncs.c:123 #, c-format msgid "slot name must not be null" msgstr "スロットåã¯nullã§ã¯ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: replication/logical/logicalfuncs.c:142 +#: replication/logical/logicalfuncs.c:139 #, c-format msgid "options array must not be null" msgstr "オプションé…列ã¯nullã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: replication/logical/logicalfuncs.c:159 +#: replication/logical/logicalfuncs.c:156 #, c-format msgid "array must be one-dimensional" msgstr "é…列ã¯1次元ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: replication/logical/logicalfuncs.c:165 +#: replication/logical/logicalfuncs.c:162 #, c-format msgid "array must not contain nulls" msgstr "é…列ã«ã¯NULL値をå«ã‚ã¦ã¯ã„ã‘ã¾ã›ã‚“" -#: replication/logical/logicalfuncs.c:180 utils/adt/json.c:1484 utils/adt/jsonb.c:1403 +#: replication/logical/logicalfuncs.c:177 utils/adt/json.c:1420 utils/adt/jsonb.c:1304 #, c-format msgid "array must have even number of elements" msgstr "é…列ã®è¦ç´ æ•°ã¯å¶æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: replication/logical/logicalfuncs.c:227 +#: replication/logical/logicalfuncs.c:224 #, c-format msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" msgstr "è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰å‡ºåŠ›ãƒ—ãƒ©ã‚°ã‚¤ãƒ³\"%s\"ã¯ãƒã‚¤ãƒŠãƒªå‡ºåŠ›ã‚’ç”Ÿæˆã—ã¾ã™, ã—ã‹ã—関数\"%s\"ã¯ãƒ†ã‚­ã‚¹ãƒˆãƒ‡ãƒ¼ã‚¿ã‚’期待ã—ã¦ã„ã¾ã™" #: replication/logical/origin.c:190 #, c-format -msgid "cannot query or manipulate replication origin when max_replication_slots = 0" -msgstr "max_replication_slots = 0 ã®æ™‚ã¯ãƒ¬ãƒ—リケーション基点ã®å•ã„åˆã‚ã›ã¯æ“作ã¯ã§ãã¾ã›ã‚“" +msgid "cannot query or manipulate replication origin when \"max_replication_slots\" is 0" +msgstr "\"max_replication_slots\"ãŒ0ã®æ™‚ã¯ãƒ¬ãƒ—リケーション基点ã®å•ã„åˆã‚ã›ã‚„æ“作ã¯ã§ãã¾ã›ã‚“" #: replication/logical/origin.c:195 #, c-format @@ -19805,8 +20272,8 @@ msgstr "レプリケーションãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®ãƒžã‚¸ãƒƒã‚¯ãƒŠãƒ³ãƒ #: replication/logical/origin.c:798 #, c-format -msgid "could not find free replication state, increase max_replication_slots" -msgstr "使用å¯èƒ½ãªãƒ¬ãƒ—リケーションステートãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€max_replication_slotsを増やã—ã¦ãã ã•ã„" +msgid "could not find free replication state, increase \"max_replication_slots\"" +msgstr "使用å¯èƒ½ãªãƒ¬ãƒ—リケーション状態領域ãŒã‚りã¾ã›ã‚“ã€\"max_replication_slots\"を増やã—ã¦ãã ã•ã„" #: replication/logical/origin.c:806 #, c-format @@ -19818,1238 +20285,1561 @@ msgstr "ノード%dã®ãƒ¬ãƒ—リケーション状態を%X/%Xã«å¾©å…ƒã—ã¾ã™" msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "レプリケーションスロットãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ %uã¯é–“é•ã£ã¦ã„ã¾ã™ã€æ­£ã—ãã¯%uã§ã™" -#: replication/logical/origin.c:944 replication/logical/origin.c:1141 +#: replication/logical/origin.c:944 replication/logical/origin.c:1143 #, c-format msgid "replication origin with ID %d is already active for PID %d" msgstr "ID%dã®ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³åŸºç‚¹ã¯æ—¢ã«PID%dã§ä½¿ç”¨ä¸­ã§ã™" -#: replication/logical/origin.c:955 replication/logical/origin.c:1153 +#: replication/logical/origin.c:955 replication/logical/origin.c:1156 #, c-format msgid "could not find free replication state slot for replication origin with ID %d" msgstr "ID%dã®ãƒ¬ãƒ—リケーション基点ã«å¯¾ã™ã‚‹ãƒ¬ãƒ—リケーション状態スロットã®ç©ºããŒã‚りã¾ã›ã‚“" -#: replication/logical/origin.c:957 replication/logical/origin.c:1155 replication/slot.c:2086 +#: replication/logical/origin.c:957 replication/logical/origin.c:1158 replication/slot.c:2401 #, c-format -msgid "Increase max_replication_slots and try again." -msgstr "max_replication_slotsを増やã—ã¦å†åº¦è©¦ã—ã¦ãã ã•ã„" +msgid "Increase \"max_replication_slots\" and try again." +msgstr "\"max_replication_slots\"を増やã—ã¦å†åº¦è©¦ã—ã¦ãã ã•ã„" -#: replication/logical/origin.c:1112 +#: replication/logical/origin.c:1114 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "æ—¢ã«åˆæœŸåŒ–ã•れã¦ã„ã‚‹å ´åˆã¯ãƒ¬ãƒ—リケーション基点ã®åˆæœŸåŒ–ã¯ã§ãã¾ã›ã‚“" -#: replication/logical/origin.c:1196 replication/logical/origin.c:1412 replication/logical/origin.c:1432 +#: replication/logical/origin.c:1199 replication/logical/origin.c:1415 replication/logical/origin.c:1435 #, c-format msgid "no replication origin is configured" msgstr "ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³åŸºç‚¹ãŒæ§‹æˆã•れã¦ã„ã¾ã›ã‚“" -#: replication/logical/origin.c:1282 +#: replication/logical/origin.c:1285 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "レプリケーション基点å\"%s\"ã¯äºˆç´„ã•れã¦ã„ã¾ã™" -#: replication/logical/origin.c:1284 +#: replication/logical/origin.c:1287 #, c-format msgid "Origin names \"%s\", \"%s\", and names starting with \"pg_\" are reserved." msgstr "\"%s\"ã€\"%s\"ã€ãŠã‚ˆã³\"pg_\"ã§å§‹ã¾ã‚‹åŸºç‚¹åã¯äºˆç´„ã•れã¦ã„ã¾ã™ã€‚" -#: replication/logical/relation.c:240 +#: replication/logical/relation.c:242 #, c-format msgid "\"%s\"" msgstr "\"%s\"" -#: replication/logical/relation.c:243 +#: replication/logical/relation.c:245 #, c-format msgid ", \"%s\"" msgstr ", \"%s\"" -#: replication/logical/relation.c:249 +#: replication/logical/relation.c:251 #, c-format msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" msgstr[0] "è«–ç†ãƒ¬ãƒ—リケーション先ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s.%s\"ã¯è¤‡è£½ã•れãŸåˆ—を失ã£ã¦ã„ã¾ã™: %s" -#: replication/logical/relation.c:304 +#: replication/logical/relation.c:306 #, c-format msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" msgstr "è«–ç†ãƒ¬ãƒ—リケーションã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s.%s\"ãŒREPLICA IDENTITYインデックスã§ã‚·ã‚¹ãƒ†ãƒ åˆ—を使用ã—ã¦ã„ã¾ã™" -#: replication/logical/relation.c:396 +#: replication/logical/relation.c:398 #, c-format msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "è«–ç†ãƒ¬ãƒ—リケーション先ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s.%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: replication/logical/reorderbuffer.c:3936 +#: replication/logical/reorderbuffer.c:3999 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "XID%uã®ãŸã‚ã®ãƒ‡ãƒ¼ã‚¿ãƒ•ã‚¡ã‚¤ãƒ«ã®æ›¸ã出ã—ã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: replication/logical/reorderbuffer.c:4282 replication/logical/reorderbuffer.c:4307 +#: replication/logical/reorderbuffer.c:4345 replication/logical/reorderbuffer.c:4370 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "ä¸¦ã¹æ›¿ãˆãƒãƒƒãƒ•ã‚¡ã®ã‚ãµã‚Œãƒ•ァイルã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: replication/logical/reorderbuffer.c:4286 replication/logical/reorderbuffer.c:4311 +#: replication/logical/reorderbuffer.c:4349 replication/logical/reorderbuffer.c:4374 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "ä¸¦ã¹æ›¿ãˆãƒãƒƒãƒ•ã‚¡ã®ã‚ãµã‚Œãƒ•ァイルã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ: %2$uãƒã‚¤ãƒˆã®ã¯ãšãŒ%1$dãƒã‚¤ãƒˆã§ã—ãŸ" -#: replication/logical/reorderbuffer.c:4561 +#: replication/logical/reorderbuffer.c:4624 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "pg_replslot/%2$s/xid* ã®å‰Šé™¤ä¸­ã«ãƒ•ァイル\"%1$s\"ãŒå‰Šé™¤ã§ãã¾ã›ã‚“ã§ã—ãŸ: %3$m" -#: replication/logical/reorderbuffer.c:5057 +#: replication/logical/reorderbuffer.c:5120 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "ファイル\"%1$s\"ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ: %3$dãƒã‚¤ãƒˆã®ã¯ãšãŒ%2$dãƒã‚¤ãƒˆã§ã—ãŸ" -#: replication/logical/snapbuild.c:639 +#: replication/logical/slotsync.c:215 +#, c-format +msgid "could not synchronize replication slot \"%s\" because remote slot precedes local slot" +msgstr "リモートã®ã‚¹ãƒ­ãƒƒãƒˆãŒãƒ­ãƒ¼ã‚«ãƒ«ã®ã‚¹ãƒ­ãƒƒãƒˆã‚ˆã‚Šã‚‚進んã§ã„ã‚‹ãŸã‚レプリケーションスロット\"%s\"ã‚’åŒæœŸã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: replication/logical/slotsync.c:217 +#, c-format +msgid "The remote slot has LSN %X/%X and catalog xmin %u, but the local slot has LSN %X/%X and catalog xmin %u." +msgstr "リモートスロットã®LSNã¯%X/%Xã§ã‚«ã‚¿ãƒ­ã‚°xminã¯%uã§ã™ãŒ, ローカルスロットã®LSNã¯%X/%Xã§ã‚«ã‚¿ãƒ­ã‚°xminã¯%uã§ã™ã€‚" + +#: replication/logical/slotsync.c:459 +#, c-format +msgid "dropped replication slot \"%s\" of database with OID %u" +msgstr "OID %2$uã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ãƒ¬ãƒ—リケーションスロット\"%1$s\"を削除ã—ã¾ã—ãŸ" + +#: replication/logical/slotsync.c:579 +#, c-format +msgid "could not synchronize replication slot \"%s\"" +msgstr "レプリケーションスロット\"%s\"ã‚’åŒæœŸã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: replication/logical/slotsync.c:580 +#, c-format +msgid "Logical decoding could not find consistent point from local slot's LSN %X/%X." +msgstr "è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ãŒä¸€è²«æ€§ãƒã‚¤ãƒ³ãƒˆã‚’ローカルスロットã®LSN%X/%Xã‹ã‚‰è¦‹ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚" + +#: replication/logical/slotsync.c:589 +#, c-format +msgid "newly created replication slot \"%s\" is sync-ready now" +msgstr "æ–°è¦ã«ä½œæˆã—ãŸãƒ¬ãƒ—リケーションスロット\"%s\"ãŒåŒæœŸå¯èƒ½ã«ãªã‚Šã¾ã—ãŸ" + +#: replication/logical/slotsync.c:628 +#, c-format +msgid "skipping slot synchronization because the received slot sync LSN %X/%X for slot \"%s\" is ahead of the standby position %X/%X" +msgstr "å—ä¿¡ã—ãŸã‚¹ãƒ­ãƒƒãƒˆ\"%3$s\"ã®ã‚¹ãƒ­ãƒƒãƒˆåŒæœŸLSN%1$X/%2$XãŒã‚¹ã‚¿ãƒ³ãƒã‚¤ã®LSN%4$X/%5$Xよりも進んã§ã„ã‚‹ãŸã‚ã‚¹ãƒ­ãƒƒãƒˆåŒæœŸã‚’スキップã—ã¾ã™" + +#: replication/logical/slotsync.c:650 +#, c-format +msgid "exiting from slot synchronization because same name slot \"%s\" already exists on the standby" +msgstr "スタンãƒã‚¤ã«åŒåã®ã‚¹ãƒ­ãƒƒãƒˆ\"%s\"ãŒã™ã§ã«å­˜åœ¨ã™ã‚‹ãŸã‚ã€ã‚¹ãƒ­ãƒƒãƒˆåŒæœŸã‚’終了ã—ã¾ã—ãŸ" + +#: replication/logical/slotsync.c:819 +#, c-format +msgid "could not fetch failover logical slots info from the primary server: %s" +msgstr "プライマリサーãƒãƒ¼ã‹ã‚‰ãƒ•ェイルオーãƒãƒ¼å±žæ€§ã‚’æŒã¤è«–ç†ã‚¹ãƒ­ãƒƒãƒˆã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: replication/logical/slotsync.c:965 +#, c-format +msgid "could not fetch primary_slot_name \"%s\" info from the primary server: %s" +msgstr "プライマリサーãƒãƒ¼ã‹ã‚‰ primary_slot_name \"%s\"ã®æƒ…報をå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: replication/logical/slotsync.c:967 +#, c-format +msgid "Check if primary_slot_name is configured correctly." +msgstr "\"primary_slot_name\"ãŒæ­£ã—ã設定ã•れã¦ã„ã‚‹ã‹ç¢ºèªã—ã¦ãã ã•ã„。" + +#: replication/logical/slotsync.c:987 +#, c-format +msgid "cannot synchronize replication slots from a standby server" +msgstr "スタンãƒã‚¤ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰ã®ãƒªãƒ—リケーションスロットã®åŒæœŸãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#. translator: second %s is a GUC variable name +#: replication/logical/slotsync.c:996 +#, c-format +msgid "replication slot \"%s\" specified by \"%s\" does not exist on primary server" +msgstr "%2$sã§æŒ‡å®šã•れãŸãƒ¬ãƒ—リケーションスロット\"%1$s\"ã¯ãƒ—ライマリサーãƒãƒ¼ã«å­˜åœ¨ã—ã¾ã›ã‚“" + +#. translator: first %s is a connection option; second %s is a GUC +#. variable name +#. +#: replication/logical/slotsync.c:1029 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be specified in \"%s\"" +msgstr "レプリケーションスロットã®åŒæœŸã‚’行ã†éš›ã¯\"%2$s\"ã§\"%1$s\"ãŒæŒ‡å®šã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™" + +#: replication/logical/slotsync.c:1050 +#, c-format +msgid "replication slot synchronization requires \"wal_level\" >= \"logical\"" +msgstr "レプリケーションスロットã®åŒæœŸã‚’行ã†éš›ã¯\"wal_level\" >= \"logical\" ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1063 replication/logical/slotsync.c:1091 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be set" +msgstr "レプリケーションスロットã®åŒæœŸã‚’行ã†éš›ã¯\"%s\"ãŒè¨­å®šã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1077 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be enabled" +msgstr "レプリケーションスロットã®åŒæœŸã‚’行ã†éš›ã¯\"%s\"ãŒæœ‰åйã«ãªã£ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1129 +#, c-format +msgid "replication slot synchronization worker will shut down because \"%s\" is disabled" +msgstr "\"%s\"ãŒç„¡åйã«ã•れãŸãŸã‚ã€ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ãƒ­ãƒƒãƒˆåŒæœŸãƒ¯ãƒ¼ã‚«ãƒ¼ãŒã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã—ã¾ã™" + +#: replication/logical/slotsync.c:1138 +#, c-format +msgid "replication slot synchronization worker will restart because of a parameter change" +msgstr "パラメータã®å¤‰æ›´ãŒã‚ã£ãŸãŸã‚ã€ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ãƒ­ãƒƒãƒˆåŒæœŸãƒ¯ãƒ¼ã‚«ãƒ¼ãŒå†èµ·å‹•ã—ã¾ã™" + +#: replication/logical/slotsync.c:1162 +#, c-format +msgid "replication slot synchronization worker is shutting down on receiving SIGINT" +msgstr "SIGINTã‚’å—ä¿¡ã—ãŸãŸã‚ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ãƒ­ãƒƒãƒˆåŒæœŸãƒ¯ãƒ¼ã‚«ãƒ¼ãŒã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã—ã¾ã™" + +#: replication/logical/slotsync.c:1287 +#, c-format +msgid "cannot synchronize replication slots when standby promotion is ongoing" +msgstr "スタンãƒã‚¤ã®æ˜‡æ ¼å‡¦ç†ä¸­ã¯ãƒªãƒ—リケーションスロットã®åŒæœŸã¯ã§ãã¾ã›ã‚“" + +#: replication/logical/slotsync.c:1295 +#, c-format +msgid "cannot synchronize replication slots concurrently" +msgstr "複数ã®ãƒ¬ãƒ—リケーションスロットã®ä¸¦è¡ŒåŒæœŸã¯ã§ãã¾ã›ã‚“" + +#: replication/logical/slotsync.c:1403 +#, c-format +msgid "slot sync worker started" +msgstr "ã‚¹ãƒ­ãƒƒãƒˆåŒæœŸãƒ¯ãƒ¼ã‚«ãƒ¼ãŒèµ·å‹•ã—ã¾ã—ãŸ" + +#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:926 replication/walreceiver.c:307 +#, c-format +msgid "could not connect to the primary server: %s" +msgstr "プライマリサーãƒãƒ¼ã¸ã®æŽ¥ç¶šãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: replication/logical/snapbuild.c:653 #, c-format msgid "initial slot snapshot too large" msgstr "åˆæœŸã‚¹ãƒ­ãƒƒãƒˆã‚¹ãƒŠãƒƒãƒ—ショットãŒå¤§ãã™ãŽã¾ã™" -#: replication/logical/snapbuild.c:693 +#: replication/logical/snapbuild.c:707 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" msgstr[0] "エクスãƒãƒ¼ãƒˆã•れãŸè«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚¹ãƒŠãƒƒãƒ—ショット: \"%s\" (%u個ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ID ã‚’å«ã‚€)" -#: replication/logical/snapbuild.c:1388 replication/logical/snapbuild.c:1480 replication/logical/snapbuild.c:1992 +#: replication/logical/snapbuild.c:1404 replication/logical/snapbuild.c:1501 replication/logical/snapbuild.c:2017 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã¯ä¸€è²«æ€§ãƒã‚¤ãƒ³ãƒˆã‚’%X/%Xã§ç™ºè¦‹ã—ã¾ã—ãŸ" -#: replication/logical/snapbuild.c:1390 +#: replication/logical/snapbuild.c:1406 #, c-format msgid "There are no running transactions." msgstr "実行中ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯ã‚りã¾ã›ã‚“。" -#: replication/logical/snapbuild.c:1432 +#: replication/logical/snapbuild.c:1453 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã¯åˆæœŸé–‹å§‹ç‚¹ã‚’%X/%Xã§ç™ºè¦‹ã—ã¾ã—ãŸ" -#: replication/logical/snapbuild.c:1434 replication/logical/snapbuild.c:1458 +#: replication/logical/snapbuild.c:1455 replication/logical/snapbuild.c:1479 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "%2$uよりå¤ã„トランザクション(ãŠãŠã‚ˆã%1$d個)ã®å®Œäº†ã‚’å¾…ã£ã¦ã„ã¾ã™" -#: replication/logical/snapbuild.c:1456 +#: replication/logical/snapbuild.c:1477 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã¯åˆæœŸã®ä¸€è²«æ€§ãƒã‚¤ãƒ³ãƒˆã‚’%X/%Xã§ç™ºè¦‹ã—ã¾ã—ãŸ" -#: replication/logical/snapbuild.c:1482 +#: replication/logical/snapbuild.c:1503 #, c-format msgid "There are no old transactions anymore." msgstr "å¤ã„トランザクションã¯ã“れ以上ã¯ã‚りã¾ã›ã‚“" -#: replication/logical/snapbuild.c:1883 +#: replication/logical/snapbuild.c:1904 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "スナップショット構築状態ファイル\"%1$s\"ã®ãƒžã‚¸ãƒƒã‚¯ãƒŠãƒ³ãƒãƒ¼ãŒä¸æ­£ã§ã™: %3$uã®ã¯ãšãŒ%2$uã§ã—ãŸ" -#: replication/logical/snapbuild.c:1889 +#: replication/logical/snapbuild.c:1910 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "スナップショット状態ファイル\"%1$s\"ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³%2$uã¯ã‚µãƒãƒ¼ãƒˆå¤–ã§ã™: %3$uã®ã¯ãšãŒ%2$uã§ã—ãŸ" -#: replication/logical/snapbuild.c:1930 +#: replication/logical/snapbuild.c:1951 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "スナップショット生æˆçŠ¶æ…‹ãƒ•ã‚¡ã‚¤ãƒ«\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸€è‡´ã—ã¾ã›ã‚“: %uã§ã™ãŒã€%uã§ã‚ã‚‹ã¹ãã§ã™" -#: replication/logical/snapbuild.c:1994 +#: replication/logical/snapbuild.c:2019 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã¯ä¿å­˜ã•れãŸã‚¹ãƒŠãƒƒãƒ—ショットを使ã£ã¦é–‹å§‹ã—ã¾ã™ã€‚" -#: replication/logical/snapbuild.c:2101 +#: replication/logical/snapbuild.c:2126 #, c-format msgid "could not parse file name \"%s\"" msgstr "ファイルå\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: replication/logical/tablesync.c:153 +#: replication/logical/tablesync.c:161 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "サブスクリプション\"%s\"ã€ãƒ†ãƒ¼ãƒ–ル\"%s\"ã«å¯¾ã™ã‚‹è«–ç†ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãƒ†ãƒ¼ãƒ–ãƒ«åŒæœŸãƒ¯ãƒ¼ã‚«ãƒ¼ãŒçµ‚了ã—ã¾ã—ãŸ" -#: replication/logical/tablesync.c:622 +#: replication/logical/tablesync.c:641 #, c-format msgid "logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled" msgstr "two_phaseを有効化å¯èƒ½ã«ã™ã‚‹ãŸã‚ã€ã‚µãƒ–スクリプション\"%s\"ã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—リケーションé©ç”¨ãƒ¯ãƒ¼ã‚«ãƒ¼ã‚’å†èµ·å‹•ã—ã¾ã™" -#: replication/logical/tablesync.c:797 replication/logical/tablesync.c:939 +#: replication/logical/tablesync.c:827 replication/logical/tablesync.c:969 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" -msgstr "テーブル\"%s.%s\"ã®ãƒ†ãƒ¼ãƒ–ル情報を発行サーãƒãƒ¼ã‹ã‚‰å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgstr "パブリッシャã‹ã‚‰ãƒ†ãƒ¼ãƒ–ル\"%s.%s\"ã®ãƒ†ãƒ¼ãƒ–ル情報をå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: replication/logical/tablesync.c:804 +#: replication/logical/tablesync.c:834 #, c-format msgid "table \"%s.%s\" not found on publisher" -msgstr "テーブル\"%s.%s\"ãŒç™ºè¡Œã‚µãƒ¼ãƒãƒ¼ä¸Šã§è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" +msgstr "テーブル\"%s.%s\"ãŒãƒ‘ブリッシャ上ã§è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: replication/logical/tablesync.c:862 +#: replication/logical/tablesync.c:892 #, c-format msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" -msgstr "テーブル\"%s.%s\"ã®åˆ—リスト情報を発行サーãƒãƒ¼ã‹ã‚‰å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgstr "パブリッシャã‹ã‚‰ãƒ†ãƒ¼ãƒ–ル\"%s.%s\"ã®åˆ—リスト情報をå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: replication/logical/tablesync.c:1041 +#: replication/logical/tablesync.c:1071 #, c-format msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" -msgstr "テーブル\"%s.%s\"ã®ãƒ†ãƒ¼ãƒ–ルã®ãƒ†ãƒ¼ãƒ–ルWHEREå¥ã‚’発行サーãƒãƒ¼ã‹ã‚‰å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgstr "パブリッシャã‹ã‚‰ãƒ†ãƒ¼ãƒ–ル\"%s.%s\"ã®ãƒ†ãƒ¼ãƒ–ルã®ãƒ†ãƒ¼ãƒ–ルWHEREå¥ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: replication/logical/tablesync.c:1192 +#: replication/logical/tablesync.c:1230 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "テーブル\"%s.%s\"ã®åˆæœŸå†…容ã®ã‚³ãƒ”ーを開始ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: replication/logical/tablesync.c:1393 +#: replication/logical/tablesync.c:1429 #, c-format msgid "table copy could not start transaction on publisher: %s" -msgstr "テーブルコピー中ã«ç™ºè¡Œã‚µãƒ¼ãƒãƒ¼ä¸Šã§ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³é–‹å§‹ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" +msgstr "テーブルコピー中ã«ãƒ‘ブリッシャ上ã§ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³é–‹å§‹ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: replication/logical/tablesync.c:1435 +#: replication/logical/tablesync.c:1472 #, c-format msgid "replication origin \"%s\" already exists" msgstr "レプリケーション基点\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: replication/logical/tablesync.c:1468 replication/logical/worker.c:2387 +#: replication/logical/tablesync.c:1505 replication/logical/worker.c:2361 #, c-format msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" msgstr "ユーザー\"%s\"ã¯è¡Œãƒ¬ãƒ™ãƒ«ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãŒæœ‰åйãªãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¸ã®ãƒ¬ãƒ—リケーションã¯ã§ãã¾ã›ã‚“: \"%s\"" -#: replication/logical/tablesync.c:1481 +#: replication/logical/tablesync.c:1518 #, c-format msgid "table copy could not finish transaction on publisher: %s" -msgstr "テーブルコピー中ã«ç™ºè¡Œã‚µãƒ¼ãƒãƒ¼ä¸Šã§ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³çµ‚了ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" - -#: replication/logical/worker.c:445 -msgid "logical replication table synchronization worker" -msgstr "è«–ç†ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãƒ†ãƒ¼ãƒ–ãƒ«åŒæœŸãƒ¯ãƒ¼ã‚«ãƒ¼" +msgstr "テーブルコピー中ã«ãƒ‘ブリッシャ上ã§ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³çµ‚了ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: replication/logical/worker.c:449 -msgid "logical replication apply worker" -msgstr "è«–ç†ãƒ¬ãƒ—リケーションé©ç”¨ãƒ¯ãƒ¼ã‚«ãƒ¼" - -#: replication/logical/worker.c:512 +#: replication/logical/worker.c:481 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop" msgstr "サブスクリプション\"%s\"ã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—リケーション並列é©ç”¨ãƒ¯ãƒ¼ã‚«ãƒ¼ãŒåœæ­¢ã—ã¾ã™" -#: replication/logical/worker.c:514 +#: replication/logical/worker.c:483 #, c-format msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." msgstr "ã™ã¹ã¦ã®ãƒ†ãƒ¼ãƒ–ルã®åŒæœŸãŒå®Œäº†ã™ã‚‹ã¾ã§ã¯ã€ã‚¹ãƒˆãƒªãƒ¼ãƒ ã•れãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’é©ç”¨ãƒ¯ãƒ¼ã‚«ãƒ¼ã§æ‰±ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。" -#: replication/logical/worker.c:876 replication/logical/worker.c:991 +#: replication/logical/worker.c:852 replication/logical/worker.c:967 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "è«–ç†ãƒ¬ãƒ—リケーション列%dã®ãƒã‚¤ãƒŠãƒªãƒ‡ãƒ¼ã‚¿æ›¸å¼ãŒä¸æ­£ã§ã™" -#: replication/logical/worker.c:2526 +#: replication/logical/worker.c:2504 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" -msgstr "è«–ç†ãƒ¬ãƒ—リケーション先ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s.%s\"ã¯è¤‡è£½ã®è­˜åˆ¥åˆ—を期待ã—ã¦ã„ã¾ã—ãŸãŒã€ç™ºè¡Œã‚µãƒ¼ãƒãƒ¼ã¯é€ä¿¡ã—ã¾ã›ã‚“ã§ã—ãŸ" +msgstr "è«–ç†ãƒ¬ãƒ—リケーション先ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s.%s\"ã¯è¤‡è£½ã®è­˜åˆ¥åˆ—を期待ã—ã¦ã„ã¾ã—ãŸãŒã€ãƒ‘ブリッシャã¯é€ä¿¡ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: replication/logical/worker.c:2533 +#: replication/logical/worker.c:2511 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" -msgstr "è«–ç†ãƒ¬ãƒ—リケーション先ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s.%s\"ãŒè­˜åˆ¥åˆ—インデックスも主キーをもã£ã¦ãŠã‚‰ãšã€ã‹ã¤ç™ºè¡Œã•れãŸãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒREPLICA IDENTITY FULLã¨ãªã£ã¦ã„ã¾ã›ã‚“" +msgstr "è«–ç†ãƒ¬ãƒ—リケーション先ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s.%s\"ãŒè­˜åˆ¥åˆ—インデックスも主キーをもã£ã¦ãŠã‚‰ãšã€ã‹ã¤ãƒ‘ブリッシュã•れãŸãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒREPLICA IDENTITY FULLã¨ãªã£ã¦ã„ã¾ã›ã‚“" -#: replication/logical/worker.c:3384 +#: replication/logical/worker.c:3382 #, c-format -msgid "invalid logical replication message type \"%c\"" -msgstr "䏿­£ãªè«–ç†ãƒ¬ãƒ—リケーションã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—\"%c\"" +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "䏿­£ãªè«–ç†ãƒ¬ãƒ—リケーションã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ— \"??? (%d)\"" -#: replication/logical/worker.c:3556 +#: replication/logical/worker.c:3554 #, c-format msgid "data stream from publisher has ended" -msgstr "発行サーãƒãƒ¼ã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã‚¹ãƒˆãƒªãƒ¼ãƒ ãŒçµ‚了ã—ã¾ã—ãŸ" +msgstr "パブリッシャã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã‚¹ãƒˆãƒªãƒ¼ãƒ ãŒçµ‚了ã—ã¾ã—ãŸ" -#: replication/logical/worker.c:3713 +#: replication/logical/worker.c:3708 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "タイムアウトã«ã‚ˆã‚Šè«–ç†ãƒ¬ãƒ—リケーションワーカーを終了ã—ã¦ã„ã¾ã™" -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:3908 +#: replication/logical/worker.c:3902 #, c-format -msgid "%s for subscription \"%s\" will stop because the subscription was removed" -msgstr "サブスクリプション\"%2$s\"ãŒå‰Šé™¤ã•れãŸãŸã‚ã€ã“ã®ã‚µãƒ–スクリプションã«å¯¾å¿œã™ã‚‹%1$sãŒåœæ­¢ã—ã¾ã™" +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" +msgstr "サブスクリプション\"%s\"ãŒå‰Šé™¤ã•れãŸãŸã‚ã€ã“ã®ã‚µãƒ–スクリプションã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—リケーションワーカーãŒåœæ­¢ã—ã¾ã™" -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:3922 +#: replication/logical/worker.c:3916 #, c-format -msgid "%s for subscription \"%s\" will stop because the subscription was disabled" -msgstr "サブスクリプション\"%2$s\"ãŒç„¡åŠ¹åŒ–ã•れãŸãŸã‚ã€ã“ã®ã‚µãƒ–スクリプションã«å¯¾å¿œã™ã‚‹%1$sãŒåœæ­¢ã—ã¾ã™" +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" +msgstr "サブスクリプション\"%s\"ãŒç„¡åŠ¹åŒ–ã•れãŸãŸã‚ã€ã“ã®ã‚µãƒ–スクリプションã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—リケーションワーカーãŒåœæ­¢ã—ã¾ã™" -#: replication/logical/worker.c:3953 +#: replication/logical/worker.c:3947 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" msgstr "パラメータã®å¤‰æ›´ãŒã‚ã£ãŸãŸã‚ã€ã‚µãƒ–スクリプション\"%s\"ã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—リケーション並列é©ç”¨ãƒ¯ãƒ¼ã‚«ãƒ¼ãŒåœæ­¢ã—ã¾ã™" -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:3958 +#: replication/logical/worker.c:3951 #, c-format -msgid "%s for subscription \"%s\" will restart because of a parameter change" -msgstr "パラメータã®å¤‰æ›´ãŒã‚ã£ãŸãŸã‚ã€ã‚µãƒ–スクリプション\"%2$s\"ã«å¯¾å¿œã™ã‚‹%1$sãŒå†èµ·å‹•ã—ã¾ã™" +msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" +msgstr "パラメータã®å¤‰æ›´ãŒã‚ã£ãŸãŸã‚ã€ã‚µãƒ–スクリプション\"%s\"ã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—リケーションワーカーãŒå†èµ·å‹•ã—ã¾ã™" -#. translator: %s is the name of logical replication worker -#: replication/logical/worker.c:4482 +#: replication/logical/worker.c:3965 #, c-format -msgid "%s for subscription %u will not start because the subscription was removed during startup" -msgstr "サブスクリプション%2$uãŒèµ·å‹•中ã«å‰Šé™¤ã•れãŸãŸã‚ã€ã“ã®ã‚µãƒ–スクリプションã«å¯¾å¿œã™ã‚‹%1$sã¯èµ·å‹•ã—ã¾ã›ã‚“" +msgid "logical replication parallel apply worker for subscription \"%s\" will stop because the subscription owner's superuser privileges have been revoked" +msgstr "サブスクリプション\"%s\"ã®æ‰€æœ‰è€…ã®ã‚¹ãƒ¼ãƒ‘ーユーザー権é™ãŒå‰¥å¥ªã•れãŸãŸã‚ã€ã“ã®ã‚µãƒ–スクリプションã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—リケーション並列é©ç”¨ãƒ¯ãƒ¼ã‚«ãƒ¼ãŒåœæ­¢ã—ã¾ã™" -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:4498 +#: replication/logical/worker.c:3969 #, c-format -msgid "%s for subscription \"%s\" will not start because the subscription was disabled during startup" -msgstr "サブスクリプション\"%2$s\"ãŒèµ·å‹•中ã«ç„¡åŠ¹åŒ–ã•れãŸãŸã‚ã€ã“ã®ã‚µãƒ–スクリプションã«å¯¾å¿œã™ã‚‹%1$sã¯èµ·å‹•ã—ã¾ã›ã‚“" +msgid "logical replication worker for subscription \"%s\" will restart because the subscription owner's superuser privileges have been revoked" +msgstr "サブスクリプション\"%s\"ã®æ‰€æœ‰è€…ã®ã‚¹ãƒ¼ãƒ‘ーユーザー権é™ãŒå‰¥å¥ªã•れãŸãŸã‚ã€ã“ã®ã‚µãƒ–スクリプションã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—リケーションワーカーãŒå†èµ·å‹•ã—ã¾ã™" -#: replication/logical/worker.c:4515 +#: replication/logical/worker.c:4489 #, c-format -msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" -msgstr "サブスクリプション\"%s\"ã€ãƒ†ãƒ¼ãƒ–ル\"%s\"ã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãƒ†ãƒ¼ãƒ–ãƒ«åŒæœŸãƒ¯ãƒ¼ã‚«ãƒ¼ãŒèµ·å‹•ã—ã¾ã—ãŸ" +msgid "subscription has no replication slot set" +msgstr "サブスクリプションã«ãƒ¬ãƒ—リケーションスロットãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#. translator: first %s is the name of logical replication worker -#: replication/logical/worker.c:4521 +#: replication/logical/worker.c:4602 #, c-format -msgid "%s for subscription \"%s\" has started" -msgstr "サブスクリプション\"%2$s\"ã«å¯¾å¿œã™ã‚‹%1$sãŒèµ·å‹•ã—ã¾ã—ãŸ" +msgid "logical replication worker for subscription %u will not start because the subscription was removed during startup" +msgstr "サブスクリプション%uãŒèµ·å‹•中ã«å‰Šé™¤ã•れãŸãŸã‚ã€ã“ã®ã‚µãƒ–スクリプションã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—リケーションワーカーã¯èµ·å‹•ã—ã¾ã›ã‚“" -#: replication/logical/worker.c:4596 +#: replication/logical/worker.c:4618 #, c-format -msgid "subscription has no replication slot set" -msgstr "サブスクリプションã«ãƒ¬ãƒ—リケーションスロットãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" +msgid "logical replication worker for subscription \"%s\" will not start because the subscription was disabled during startup" +msgstr "サブスクリプション\"%s\"ãŒèµ·å‹•中ã«ç„¡åŠ¹åŒ–ã•れãŸãŸã‚ã€ã“ã®ã‚µãƒ–スクリプションã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—リケーションワーカーã¯èµ·å‹•ã—ã¾ã›ã‚“" + +#: replication/logical/worker.c:4642 +#, c-format +msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" +msgstr "サブスクリプション\"%s\"ã€ãƒ†ãƒ¼ãƒ–ル\"%s\"ã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãƒ†ãƒ¼ãƒ–ãƒ«åŒæœŸãƒ¯ãƒ¼ã‚«ãƒ¼ãŒèµ·å‹•ã—ã¾ã—ãŸ" -#: replication/logical/worker.c:4763 +#: replication/logical/worker.c:4647 +#, c-format +msgid "logical replication apply worker for subscription \"%s\" has started" +msgstr "サブスクリプション\"%s\"ã«å¯¾å¿œã™ã‚‹è«–ç†ãƒ¬ãƒ—リケーションé©ç”¨ãƒ¯ãƒ¼ã‚«ãƒ¼ãŒèµ·å‹•ã—ã¾ã—ãŸ" + +#: replication/logical/worker.c:4769 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "サブスクリプション\"%s\"ã¯ã‚¨ãƒ©ãƒ¼ã®ãŸã‚無効化ã•れã¾ã—ãŸ" -#: replication/logical/worker.c:4811 +#: replication/logical/worker.c:4817 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "è«–ç†ãƒ¬ãƒ—リケーションã¯%X/%Xã§ã§ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚¹ã‚­ãƒƒãƒ—ã‚’é–‹å§‹ã—ã¾ã™" -#: replication/logical/worker.c:4825 +#: replication/logical/worker.c:4831 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "è«–ç†ãƒ¬ãƒ—リケーションã¯%X/%Xã§ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚¹ã‚­ãƒƒãƒ—を完了ã—ã¾ã—ãŸ" -#: replication/logical/worker.c:4907 +#: replication/logical/worker.c:4913 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "サブスクリプションã®\"%s\"スキップLSNをクリアã—ã¾ã—ãŸ" -#: replication/logical/worker.c:4908 +#: replication/logical/worker.c:4914 #, c-format msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." msgstr "リモートトランザクションã®å®Œäº†WALä½ç½®(LSN) %X/%XãŒã‚¹ã‚­ãƒƒãƒ—LSN %X/%X ã¨ä¸€è‡´ã—ã¾ã›ã‚“。" -#: replication/logical/worker.c:4934 +#: replication/logical/worker.c:4951 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" msgstr "メッセージタイプ \"%2$s\"ã§ãƒ¬ãƒ—リケーション基点\"%1$s\"ã®ãƒªãƒ¢ãƒ¼ãƒˆã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã‚’処ç†ä¸­" -#: replication/logical/worker.c:4938 +#: replication/logical/worker.c:4955 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" msgstr "トランザクション%3$u中ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—\"%2$s\"ã§ãƒ¬ãƒ—リケーション基点\"%1$s\"ã®ãƒªãƒ¢ãƒ¼ãƒˆã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã‚’処ç†ä¸­" -#: replication/logical/worker.c:4943 +#: replication/logical/worker.c:4960 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" msgstr "%4$X/%5$Xã§çµ‚了ã—ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%3$u中ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—\"%2$s\"ã§ãƒ¬ãƒ—リケーション基点\"%1$s\"ã®ãƒªãƒ¢ãƒ¼ãƒˆã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã‚’処ç†ä¸­" -#: replication/logical/worker.c:4954 +#: replication/logical/worker.c:4971 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u" msgstr "レプリケーション起点\"%1$s\"ã®ãƒªãƒ¢ãƒ¼ãƒˆãƒ‡ãƒ¼ã‚¿å‡¦ç†ä¸­ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%5$uã®ãƒ¬ãƒ—リケーション対象リレーション\"%3$s.%4$s\"ã«å¯¾ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—\"%2$s\"内" -#: replication/logical/worker.c:4961 +#: replication/logical/worker.c:4978 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" msgstr "%6$X/%7$Xã§çµ‚了ã—ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%5$u中ã€ãƒ¬ãƒ—リケーション先リレーション\"%3$s.%4$s\"ã«å¯¾ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—\"%2$s\"ã§ãƒ¬ãƒ—リケーション基点\"%1$s\"ã®ãƒªãƒ¢ãƒ¼ãƒˆã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã‚’処ç†ä¸­" -#: replication/logical/worker.c:4972 +#: replication/logical/worker.c:4989 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u" msgstr "レプリケーション起点\"%1$s\"ã®ãƒªãƒ¢ãƒ¼ãƒˆãƒ‡ãƒ¼ã‚¿å‡¦ç†ä¸­ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%6$uã®ãƒ¬ãƒ—リケーション対象リレーション\"%3$s.%4$s\"ã€åˆ—\"%5$s\"ã«å¯¾ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—\"%2$s\"内" -#: replication/logical/worker.c:4980 +#: replication/logical/worker.c:4997 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" msgstr "%7$X/%8$Xã§çµ‚了ã—ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%6$u中ã€ãƒ¬ãƒ—リケーション先リレーション\"%3$s.%4$s\"ã€åˆ—\"%5$s\"ã«å¯¾ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—\"%2$s\"ã§ãƒ¬ãƒ—リケーション基点\"%1$s\"ã®ãƒªãƒ¢ãƒ¼ãƒˆã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿ã‚’処ç†ä¸­" -#: replication/pgoutput/pgoutput.c:318 +#: replication/pgoutput/pgoutput.c:322 #, c-format msgid "invalid proto_version" msgstr "䏿­£ãªproto_version" -#: replication/pgoutput/pgoutput.c:323 +#: replication/pgoutput/pgoutput.c:327 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version \"%s\"ã¯ç¯„囲外ã§ã™" -#: replication/pgoutput/pgoutput.c:340 +#: replication/pgoutput/pgoutput.c:344 #, c-format msgid "invalid publication_names syntax" msgstr "publication_namesã®æ§‹æ–‡ãŒä¸æ­£ã§ã™" -#: replication/pgoutput/pgoutput.c:443 +#: replication/pgoutput/pgoutput.c:414 replication/pgoutput/pgoutput.c:418 +#, c-format +msgid "option \"%s\" missing" +msgstr "オプション\"%s\"ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" + +#: replication/pgoutput/pgoutput.c:478 #, c-format msgid "client sent proto_version=%d but server only supports protocol %d or lower" msgstr "クライアント㌠proto_version=%d ã‚’é€ä¿¡ã—ã¦ãã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³%d以下ã®ãƒ—ロトコルã®ã¿ã—ã‹ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: replication/pgoutput/pgoutput.c:449 +#: replication/pgoutput/pgoutput.c:484 #, c-format msgid "client sent proto_version=%d but server only supports protocol %d or higher" msgstr "クライアント㌠proto_version=%d ã‚’é€ä¿¡ã—ã¦ãã¾ã—ãŸãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³%d以上ã®ãƒ—ロトコルã®ã¿ã—ã‹ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: replication/pgoutput/pgoutput.c:455 -#, c-format -msgid "publication_names parameter missing" -msgstr "publication_namesãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" - -#: replication/pgoutput/pgoutput.c:469 +#: replication/pgoutput/pgoutput.c:499 #, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" msgstr "è¦æ±‚ã•れãŸproto_version=%dã§ã¯ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“ã€%d以上ãŒå¿…è¦ã§ã™" -#: replication/pgoutput/pgoutput.c:475 +#: replication/pgoutput/pgoutput.c:505 #, c-format msgid "requested proto_version=%d does not support parallel streaming, need %d or higher" msgstr "è¦æ±‚ã•れ㟠proto_version=%d ã¯ä¸¦åˆ—ストリーミングをサãƒãƒ¼ãƒˆã—ã¾ã›ã‚“ã€%d以上ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: replication/pgoutput/pgoutput.c:480 +#: replication/pgoutput/pgoutput.c:510 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "ストリーミングãŒè¦æ±‚ã•れã¾ã—ãŸãŒã€å‡ºåŠ›ãƒ—ãƒ©ã‚°ã‚¤ãƒ³ã§ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: replication/pgoutput/pgoutput.c:497 +#: replication/pgoutput/pgoutput.c:524 #, c-format msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" msgstr "è¦æ±‚ã•れãŸproto_version=%dã¯2相コミットをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“ã€%d以上ãŒå¿…è¦ã§ã™" -#: replication/pgoutput/pgoutput.c:502 +#: replication/pgoutput/pgoutput.c:529 #, c-format msgid "two-phase commit requested, but not supported by output plugin" msgstr "2相コミットãŒè¦æ±‚ã•れã¾ã—ãŸã€ã—ã‹ã—出力プラグインã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: replication/slot.c:207 +#: replication/slot.c:260 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "レプリケーションスロットå\"%s\"ã¯çŸ­ã™ãŽã¾ã™" -#: replication/slot.c:216 +#: replication/slot.c:269 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "レプリケーションスロットå\"%s\"ã¯é•·ã™ãŽã¾ã™" -#: replication/slot.c:229 +#: replication/slot.c:282 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "レプリケーションスロットå\"%s\"ã¯ä¸æ­£ãªæ–‡å­—ã‚’å«ã‚“ã§ã„ã¾ã™" -#: replication/slot.c:231 +#: replication/slot.c:284 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "レプリケーションスロットåã¯å°æ–‡å­—ã€æ•°å­—ã¨ã‚¢ãƒ³ãƒ€ãƒ¼ã‚¹ã‚³ã‚¢ã®ã¿ã‚’å«ã‚€ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: replication/slot.c:285 +#: replication/slot.c:333 +#, c-format +msgid "cannot enable failover for a replication slot created on the standby" +msgstr "スタンãƒã‚¤ä¸Šã§ä½œæˆã—ãŸãƒ¬ãƒ—リケーションスロットã®ãƒ•ェイルオーãƒãƒ¼ã‚’有効ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: replication/slot.c:345 replication/slot.c:849 +#, c-format +msgid "cannot enable failover for a temporary replication slot" +msgstr "一時レプリケーションスロットã®ãƒ•ェイルオーãƒãƒ¼ã‚’有効ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: replication/slot.c:370 #, c-format msgid "replication slot \"%s\" already exists" msgstr "レプリケーションスロット\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: replication/slot.c:295 +#: replication/slot.c:380 #, c-format msgid "all replication slots are in use" msgstr "レプリケーションスロットã¯å…¨ã¦ä½¿ç”¨ä¸­ã§ã™" -#: replication/slot.c:296 +#: replication/slot.c:381 #, c-format -msgid "Free one or increase max_replication_slots." -msgstr "ã©ã‚Œã‹ä¸€ã¤ã‚’解放ã™ã‚‹ã‹ã€max_replication_slots を大ããã—ã¦ãã ã•ã„。" +msgid "Free one or increase \"max_replication_slots\"." +msgstr "ã©ã‚Œã‹ä¸€ã¤ã‚’解放ã™ã‚‹ã‹ã€\"max_replication_slots\"を大ããã—ã¦ãã ã•ã„。" -#: replication/slot.c:474 replication/slotfuncs.c:736 utils/activity/pgstat_replslot.c:55 utils/adt/genfile.c:774 +#: replication/slot.c:560 replication/slot.c:2467 replication/slotfuncs.c:661 utils/activity/pgstat_replslot.c:56 utils/adt/genfile.c:728 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "レプリケーションスロット\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: replication/slot.c:520 replication/slot.c:1110 +#: replication/slot.c:606 replication/slot.c:1337 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "レプリケーションスロット\"%s\"ã¯PID%dã§ä½¿ç”¨ä¸­ã§ã™" -#: replication/slot.c:756 replication/slot.c:1638 replication/slot.c:2021 +#: replication/slot.c:638 +#, c-format +msgid "acquired logical replication slot \"%s\"" +msgstr "è«–ç†ãƒ¬ãƒ—リケーションスロット\"%s\"ã‚’å–å¾—ã—ã¾ã—ãŸ" + +#: replication/slot.c:640 +#, c-format +msgid "acquired physical replication slot \"%s\"" +msgstr "物ç†ãƒ¬ãƒ—リケーションスロット\"%s\"ã‚’å–å¾—ã—ã¾ã—ãŸ" + +#: replication/slot.c:729 +#, c-format +msgid "released logical replication slot \"%s\"" +msgstr "è«–ç†ãƒ¬ãƒ—リケーションスロット\"%s\"を解放ã—ã¾ã—ãŸ" + +#: replication/slot.c:731 +#, c-format +msgid "released physical replication slot \"%s\"" +msgstr "物ç†ãƒ¬ãƒ—リケーションスロット\"%s\"を解放ã—ã¾ã—ãŸ" + +#: replication/slot.c:797 +#, c-format +msgid "cannot drop replication slot \"%s\"" +msgstr "レプリケーションスロット\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: replication/slot.c:816 +#, c-format +msgid "cannot use %s with a physical replication slot" +msgstr "%sã¯ç‰©ç†ãƒ¬ãƒ—リケーションスロットã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#: replication/slot.c:828 +#, c-format +msgid "cannot alter replication slot \"%s\"" +msgstr "レプリケーションスロット\"%s\"を変更ã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: replication/slot.c:838 +#, c-format +msgid "cannot enable failover for a replication slot on the standby" +msgstr "スタンãƒã‚¤ä¸Šã§ã¯ãƒ¬ãƒ—リケーションスロットã®ãƒ•ェイルオーãƒãƒ¼ã‚’有効ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: replication/slot.c:969 replication/slot.c:1927 replication/slot.c:2311 #, c-format msgid "could not remove directory \"%s\"" msgstr "ディレクトリ\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: replication/slot.c:1145 +#: replication/slot.c:1372 #, c-format -msgid "replication slots can only be used if max_replication_slots > 0" -msgstr "レプリケーションスロット㯠max_replication_slots > 0 ã®ã¨ãã ã‘使用ã§ãã¾ã™" +msgid "replication slots can only be used if \"max_replication_slots\" > 0" +msgstr "レプリケーションスロットã¯\"max_replication_slots\" > 0 ã®ã¨ãã ã‘使用ã§ãã¾ã™" -#: replication/slot.c:1150 +#: replication/slot.c:1377 #, c-format -msgid "replication slots can only be used if wal_level >= replica" -msgstr "レプリケーションスロット㯠wal_level >= replica ã®ã¨ãã ã‘使用ã§ãã¾ã™" +msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" +msgstr "レプリケーションスロットã¯\"wal_level\" >= \"replica\" ã®ã¨ãã ã‘使用ã§ãã¾ã™" -#: replication/slot.c:1162 +#: replication/slot.c:1389 #, c-format msgid "permission denied to use replication slots" msgstr "レプリケーションスロットを使用ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: replication/slot.c:1163 +#: replication/slot.c:1390 #, c-format msgid "Only roles with the %s attribute may use replication slots." msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒãƒ¬ãƒ—リケーションスロットを使用ã§ãã¾ã™ã€‚" -#: replication/slot.c:1267 +#: replication/slot.c:1498 #, c-format -msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." -msgstr "ã“ã®ã‚¹ãƒ­ãƒƒãƒˆã®restart_lsn %X/%Xã¯åˆ¶é™ã‚’%lluãƒã‚¤ãƒˆè¶…éŽã—ã¦ã„ã¾ã™ã€‚" +msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu byte." +msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." +msgstr[0] "ã“ã®ã‚¹ãƒ­ãƒƒãƒˆã®restart_lsn %X/%Xã¯åˆ¶é™ã‚’%lluãƒã‚¤ãƒˆè¶…éŽã—ã¦ã„ã¾ã™ã€‚" -#: replication/slot.c:1272 +#: replication/slot.c:1506 #, c-format msgid "The slot conflicted with xid horizon %u." msgstr "ã“ã®ã‚¹ãƒ­ãƒƒãƒˆã¯XID地平線%uã¨ç«¶åˆã—ã¾ã—ãŸã€‚" -#: replication/slot.c:1277 -msgid "Logical decoding on standby requires wal_level >= logical on the primary server." -msgstr "è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚’行ã†ãŸã‚ã«ã¯ãƒ—ライマリサーãƒãƒ¼ä¸Šã§wal_level >= logical ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" +#: replication/slot.c:1511 +msgid "Logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary server." +msgstr "è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚’行ã†ãŸã‚ã«ã¯ãƒ—ライマリサーãƒãƒ¼ä¸Šã§\"wal_level\" >= \"logical\" ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: replication/slot.c:1285 +#: replication/slot.c:1519 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "プロセス%dを終了ã—ã¦ãƒ¬ãƒ—リケーションスロット\"%s\"を解放ã—ã¾ã™" -#: replication/slot.c:1287 +#: replication/slot.c:1521 #, c-format msgid "invalidating obsolete replication slot \"%s\"" msgstr "使用ä¸èƒ½ã®ãƒ¬ãƒ—リケーションスロット\"%s\"を無効化ã—ã¾ã™" -#: replication/slot.c:1290 -#, c-format -msgid "You might need to increase max_slot_wal_keep_size." -msgstr "max_slot_wal_keep_sizeを増やã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。" - -#: replication/slot.c:1959 +#: replication/slot.c:2249 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "レプリケーションスロットファイル\"%1$s\"ã®ãƒžã‚¸ãƒƒã‚¯ãƒŠãƒ³ãƒãƒ¼ãŒä¸æ­£ã§ã™: %3$uã®ã¯ãšãŒ%2$uã§ã—ãŸ" -#: replication/slot.c:1966 +#: replication/slot.c:2256 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "レプリケーションスロットファイル\"%s\"ã¯ã‚µãƒãƒ¼ãƒˆå¤–ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³%uã§ã™" -#: replication/slot.c:1973 +#: replication/slot.c:2263 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "レプリケーションスロットファイル\"%s\"ã®ã‚µã‚¤ã‚º%uã¯ç•°å¸¸ã§ã™" -#: replication/slot.c:2009 +#: replication/slot.c:2299 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "レプリケーションスロットファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸€è‡´ã—ã¾ã›ã‚“: %uã§ã™ãŒã€%uã§ã‚ã‚‹ã¹ãã§ã™" -#: replication/slot.c:2043 +#: replication/slot.c:2335 +#, c-format +msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" +msgstr "è«–ç†ãƒ¬ãƒ—リケーションスロット\"%s\"ãŒã‚りã¾ã™ãŒã€\"wal_level\" < \"logical\" ã§ã™" + +#: replication/slot.c:2337 #, c-format -msgid "logical replication slot \"%s\" exists, but wal_level < logical" -msgstr "è«–ç†ãƒ¬ãƒ—リケーションスロット\"%s\"ãŒã‚りã¾ã™ãŒã€wal_level < logical ã§ã™" +msgid "Change \"wal_level\" to be \"logical\" or higher." +msgstr "\"wal_level\"ã‚’\"logical\"ã‚‚ã—ãã¯ãれより上ä½ã®è¨­å®šã«ã—ã¦ãã ã•ã„。" -#: replication/slot.c:2045 +#: replication/slot.c:2349 #, c-format -msgid "Change wal_level to be logical or higher." -msgstr "wal_level ã‚’ logical ã‚‚ã—ãã¯ãれより上ä½ã®è¨­å®šã«ã—ã¦ãã ã•ã„。" +msgid "logical replication slot \"%s\" exists on the standby, but \"hot_standby\" = \"off\"" +msgstr "è«–ç†ãƒ¬ãƒ—リケーションスロット\"%s\"ãŒã‚りã¾ã™ãŒã€\"hot_standby\" = \"off\" ã§ã™" -#: replication/slot.c:2049 +#: replication/slot.c:2351 #, c-format -msgid "physical replication slot \"%s\" exists, but wal_level < replica" -msgstr "物ç†ãƒ¬ãƒ—リケーションスロット\"%s\"ãŒã‚りã¾ã™ãŒã€wal_level < replica ã§ã™" +msgid "Change \"hot_standby\" to be \"on\"." +msgstr "\"hot_standby\" ã‚’ \"on\" ã«å¤‰æ›´ã—ã¦ãã ã•ã„。" -#: replication/slot.c:2051 +#: replication/slot.c:2356 #, c-format -msgid "Change wal_level to be replica or higher." -msgstr "wal_level ã‚’ replica ã‚‚ã—ãã¯ãれより上ä½ã®è¨­å®šã«ã—ã¦ãã ã•ã„。" +msgid "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" +msgstr "物ç†ãƒ¬ãƒ—リケーションスロット\"%s\"ãŒã‚りã¾ã™ãŒã€\"wal_level\" < \"replica\" ã§ã™" -#: replication/slot.c:2085 +#: replication/slot.c:2358 +#, c-format +msgid "Change \"wal_level\" to be \"replica\" or higher." +msgstr "\"wal_level\"ã‚’\"replica\"ã‚‚ã—ãã¯ãれより上ä½ã®è¨­å®šã«ã—ã¦ãã ã•ã„。" + +#: replication/slot.c:2400 #, c-format msgid "too many replication slots active before shutdown" msgstr "シャットダウンå‰ã®ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ãƒ­ãƒƒãƒˆã®æ•°ãŒå¤šã™ãŽã¾ã™" -#: replication/slotfuncs.c:601 +#: replication/slot.c:2475 +#, c-format +msgid "\"%s\" is not a physical replication slot" +msgstr "\"%s\"ã¯ç‰©ç†ãƒ¬ãƒ—リケーションスロットã§ã¯ã‚りã¾ã›ã‚“。" + +#: replication/slot.c:2654 +#, c-format +msgid "replication slot \"%s\" specified in parameter \"%s\" does not exist" +msgstr "パラメータ\"%2$s\"ã§æŒ‡å®šã•れã¦ã„るレプリケーションスロット\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" + +#: replication/slot.c:2656 replication/slot.c:2690 replication/slot.c:2705 +#, c-format +msgid "Logical replication is waiting on the standby associated with replication slot \"%s\"." +msgstr "è«–ç†ãƒ¬ãƒ—リケーションã¯ãƒ¬ãƒ—リケーションスロットâ€%s\"ã«å¯¾å¿œã™ã‚‹ã‚¹ã‚¿ãƒ³ãƒã‚¤ã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚ " + +#: replication/slot.c:2658 +#, c-format +msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." +msgstr "レプリケーションスロット\"%s\"を作æˆã™ã‚‹ã‹ã€ãƒ‘ラメータ\"%s\"を修正ã—ã¦ãã ã•ã„。" + +#: replication/slot.c:2668 +#, c-format +msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" +msgstr "パラメータ\"%2$s\"ã§ã¯è«–ç†ãƒ¬ãƒ—リケーションスロット\"%1$s\"ã¯æŒ‡å®šã§ãã¾ã›ã‚“" + +#: replication/slot.c:2670 +#, c-format +msgid "Logical replication is waiting for correction on replication slot \"%s\"." +msgstr "è«–ç†ãƒ¬ãƒ—リケーションã¯ãƒ¬ãƒ—リケーションスロット\"%s\"ãŒä¿®æ­£ã•れるã®ã‚’å¾…ã£ã¦ã„ã¾ã™ã€‚" + +#: replication/slot.c:2672 +#, c-format +msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." +msgstr "è«–ç†ãƒ¬ãƒ—リケーションスロット\"%s\"をパラメータ\"%s\"ã‹ã‚‰å‰Šé™¤ã—ã¦ãã ã•ã„。" + +#: replication/slot.c:2688 +#, c-format +msgid "physical replication slot \"%s\" specified in parameter \"%s\" has been invalidated" +msgstr "パラメータ\"%2$s\"ã§æŒ‡å®šã•れãŸç‰©ç†ãƒ¬ãƒ—リケーションスロット\"%1$s\"ã¯ç„¡åŠ¹åŒ–ã•れã¦ã„ã¾ã™" + +#: replication/slot.c:2692 +#, c-format +msgid "Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." +msgstr "レプリケーションスロット\"%s\"を削除ã—ã¦å†ä½œæˆã™ã‚‹ã‹ã€ãƒ‘ラメータ\"%s\"を修正ã—ã¦ãã ã•ã„。" + +#: replication/slot.c:2703 +#, c-format +msgid "replication slot \"%s\" specified in parameter \"%s\" does not have active_pid" +msgstr "\"%2$s\"ã§æŒ‡å®šã•れãŸãƒ¬ãƒ—リケーションスロット\"%1$s\"ã«ã¯active_pidãŒã‚りã¾ã›ã‚“" + +#: replication/slot.c:2707 +#, c-format +msgid "Start the standby associated with the replication slot \"%s\", or amend parameter \"%s\"." +msgstr "レプリケーションスロット\"%s\"ã«é–¢é€£ä»˜ã‘られã¦ã„るスタンãƒã‚¤ã‚’èµ·å‹•ã™ã‚‹ã‹ã€ãƒ‘ラメータ%sを修正ã—ã¦ãã ã•ã„。" + +#: replication/slotfuncs.c:526 #, c-format msgid "invalid target WAL LSN" msgstr "䏿­£ãªç›®æ¨™WAL LSN" -#: replication/slotfuncs.c:623 +#: replication/slotfuncs.c:548 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "レプリケーションスロット\"%s\"ã¯é€²ã‚られã¾ã›ã‚“" -#: replication/slotfuncs.c:625 +#: replication/slotfuncs.c:550 #, c-format msgid "This slot has never previously reserved WAL, or it has been invalidated." msgstr "ã“ã®ã‚¹ãƒ­ãƒƒãƒˆã¯WALã‚’ç•™ä¿ã—ãŸã“ã¨ãŒãªã„ã‹ã€ç„¡åŠ¹åŒ–ã•ã¦ã„ã¾ã™ã€‚" -#: replication/slotfuncs.c:641 +#: replication/slotfuncs.c:566 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "レプリケーションスロットを %X/%X ã«é€²ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ã€æœ€å°å€¤ã¯ %X/%X" -#: replication/slotfuncs.c:748 +#: replication/slotfuncs.c:673 #, c-format msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "物ç†ãƒ¬ãƒ—リケーションスロット\"%s\"ã‚’è«–ç†ãƒ¬ãƒ—リケーションスロットã¨ã—ã¦ã‚³ãƒ”ーã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: replication/slotfuncs.c:750 +#: replication/slotfuncs.c:675 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "è«–ç†ãƒ¬ãƒ—リケーションスロット\"%s\"を物ç†ãƒ¬ãƒ—リケーションスロットã¨ã—ã¦ã‚³ãƒ”ーã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: replication/slotfuncs.c:757 +#: replication/slotfuncs.c:682 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "WAL ã®ç•™ä¿ã‚’ã—ã¦ã„ãªã„レプリケーションスロットã¯ã‚³ãƒ”ーã§ãã¾ã›ã‚“" -#: replication/slotfuncs.c:834 +#: replication/slotfuncs.c:688 +#, c-format +msgid "cannot copy invalidated replication slot \"%s\"" +msgstr "無効化ã•れãŸãƒ¬ãƒ—リケーションスロット\"%s\"ã¯ã‚³ãƒ”ーã§ãã¾ã›ã‚“" + +#: replication/slotfuncs.c:780 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"をコピーã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: replication/slotfuncs.c:836 +#: replication/slotfuncs.c:782 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "コピー処ç†ä¸­ã«ã‚³ãƒ”ー元ã®ãƒ¬ãƒ—リケーションスロットãŒéžäº’æ›çš„ã«å¤‰æ›´ã•れã¾ã—ãŸã€‚" -#: replication/slotfuncs.c:842 +#: replication/slotfuncs.c:788 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "未完æˆã®è«–ç†ãƒ¬ãƒ—リケーションスロット\"%s\"ã¯ã‚³ãƒ”ーã§ãã¾ã›ã‚“" -#: replication/slotfuncs.c:844 +#: replication/slotfuncs.c:790 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "ã“ã®ã‚½ãƒ¼ã‚¹ãƒ¬ãƒ—リケーションスロット㮠confirmed_flush_lsn ãŒæœ‰åй値ã«ãªã£ã¦ã‹ã‚‰å†åº¦å®Ÿè¡Œã—ã¦ãã ã•ã„。" -#: replication/syncrep.c:262 +#: replication/slotfuncs.c:802 +#, c-format +msgid "cannot copy replication slot \"%s\"" +msgstr "レプリケーションスロット\"%s\"ã¯ã‚³ãƒ”ーã§ãã¾ã›ã‚“" + +#: replication/slotfuncs.c:804 +#, c-format +msgid "The source replication slot was invalidated during the copy operation." +msgstr "コピー元ã®ãƒ¬ãƒ—リケーションスロットãŒã‚³ãƒ”ー処ç†ä¸­ã«ç„¡åŠ¹åŒ–ã•れã¾ã—ãŸã€‚" + +#: replication/slotfuncs.c:903 +#, c-format +msgid "replication slots can only be synchronized to a standby server" +msgstr "レプリケーションスロットã¯ã‚¹ã‚¿ãƒ³ãƒã‚¤ã‚µãƒ¼ãƒãƒ¼ã¸ã®ã¿åŒæœŸå¯èƒ½ã§ã™" + +#: replication/syncrep.c:261 #, c-format msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" msgstr "管ç†è€…コマンドã«ã‚ˆã‚ŠåŒæœŸãƒ¬ãƒ—リケーションã®å¾…ã¡çŠ¶æ…‹ã‚’ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã—ã€æŽ¥ç¶šã‚’çµ‚äº†ã—ã¦ã„ã¾ã™" -#: replication/syncrep.c:263 replication/syncrep.c:280 +#: replication/syncrep.c:262 replication/syncrep.c:279 #, c-format msgid "The transaction has already committed locally, but might not have been replicated to the standby." msgstr "トランザクションã¯ãƒ­ãƒ¼ã‚«ãƒ«ã§ã¯ã™ã§ã«ã‚³ãƒŸãƒƒãƒˆæ¸ˆã¿ã§ã™ãŒã€ã‚¹ã‚¿ãƒ³ãƒã‚¤å´ã«ã¯ãƒ¬ãƒ—リケーションã•れã¦ã„ãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" -#: replication/syncrep.c:279 +#: replication/syncrep.c:278 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "ユーザーã‹ã‚‰ã®è¦æ±‚ã«ã‚ˆã‚ŠåŒæœŸãƒ¬ãƒ—リケーションã®å¾…ã¡çŠ¶æ…‹ã‚’ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã—ã¦ã„ã¾ã™" # y, c-format -#: replication/syncrep.c:486 +#: replication/syncrep.c:485 #, c-format -msgid "standby \"%s\" is now a synchronous standby with priority %u" -msgstr "スタンãƒã‚¤\"%s\"ã¯å„ªå…ˆåº¦%uã®åŒæœŸã‚¹ã‚¿ãƒ³ãƒã‚¤ã«ãªã‚Šã¾ã—ãŸ" +msgid "standby \"%s\" is now a synchronous standby with priority %d" +msgstr "スタンãƒã‚¤\"%s\"ã¯å„ªå…ˆåº¦%dã®åŒæœŸã‚¹ã‚¿ãƒ³ãƒã‚¤ã«ãªã‚Šã¾ã—ãŸ" -#: replication/syncrep.c:490 +#: replication/syncrep.c:489 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "スタンãƒã‚¤\"%s\"ã¯å®šè¶³æ•°åŒæœŸã‚¹ã‚¿ãƒ³ãƒã‚¤ã®å€™è£œã«ãªã‚Šã¾ã—ãŸ" -#: replication/syncrep.c:1019 +#: replication/syncrep.c:1013 #, c-format -msgid "synchronous_standby_names parser failed" -msgstr "synchronous_standby_names ã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ" +msgid "\"synchronous_standby_names\" parser failed" +msgstr "\"synchronous_standby_names\" ã®ãƒ‘ースã«å¤±æ•—ã—ã¾ã—ãŸ" -#: replication/syncrep.c:1025 +#: replication/syncrep.c:1019 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "åŒæœŸã‚¹ã‚¿ãƒ³ãƒã‚¤ã®æ•°(%d)ã¯1以上ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: replication/walreceiver.c:180 +#: replication/walreceiver.c:176 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "管ç†è€…コマンドã«ã‚ˆã‚Š WAL å—信プロセスを終了ã—ã¦ã„ã¾ã™" -#: replication/walreceiver.c:305 -#, c-format -msgid "could not connect to the primary server: %s" -msgstr "プライマリサーãƒãƒ¼ã¸ã®æŽ¥ç¶šãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" - -#: replication/walreceiver.c:352 +#: replication/walreceiver.c:354 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "データベースシステムã®è­˜åˆ¥å­ãŒãƒ—ライマリサーãƒãƒ¼ã¨ã‚¹ã‚¿ãƒ³ãƒã‚¤ã‚µãƒ¼ãƒãƒ¼é–“ã§ç•°ãªã‚Šã¾ã™" -#: replication/walreceiver.c:353 +#: replication/walreceiver.c:355 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "プライマリå´ã®è­˜åˆ¥å­ã¯ %s ã§ã™ãŒã€ã‚¹ã‚¿ãƒ³ãƒã‚¤å´ã®è­˜åˆ¥å­ã¯ %s ã§ã™ã€‚" -#: replication/walreceiver.c:364 +#: replication/walreceiver.c:366 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "ãƒ—ãƒ©ã‚¤ãƒžãƒªã®æœ€å¤§ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uãŒã€ãƒªã‚«ãƒãƒªã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ %uよりé…れã¦ã„ã¾ã™" -#: replication/walreceiver.c:417 +#: replication/walreceiver.c:419 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "プライマリã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%3$uã® %1$X/%2$Xã‹ã‚‰ã§WALストリーミングを始ã‚ã¾ã™" -#: replication/walreceiver.c:421 +#: replication/walreceiver.c:423 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "タイムライン%3$uã® %1$X/%2$Xã‹ã‚‰ã§WALストリーミングをå†é–‹ã—ã¾ã™" -#: replication/walreceiver.c:457 +#: replication/walreceiver.c:458 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "WAL ストリーミングを継続ã§ãã¾ã›ã‚“。リカãƒãƒªã¯ã™ã§ã«çµ‚ã‚ã£ã¦ã„ã¾ã™ã€‚" -#: replication/walreceiver.c:501 +#: replication/walreceiver.c:502 #, c-format msgid "replication terminated by primary server" msgstr "プライマリサーãƒãƒ¼ã«ã‚ˆã‚Šãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãŒæ‰“ã¡åˆ‡ã‚‰ã‚Œã¾ã—ãŸ" -#: replication/walreceiver.c:502 +#: replication/walreceiver.c:503 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "タイムライン%uã®%X/%Xã§WALã®æœ€å¾Œã«é”ã—ã¾ã—ãŸ" -#: replication/walreceiver.c:592 +#: replication/walreceiver.c:593 #, c-format msgid "terminating walreceiver due to timeout" msgstr "レプリケーションタイムアウトã«ã‚ˆã‚Šwalreceiverを終了ã—ã¦ã„ã¾ã™" -#: replication/walreceiver.c:624 +#: replication/walreceiver.c:625 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "プライマリサーãƒãƒ¼ã«ã¯è¦æ±‚ã•れãŸã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%u上ã«ã“れ以上WALãŒã‚りã¾ã›ã‚“" -#: replication/walreceiver.c:640 replication/walreceiver.c:1066 +#: replication/walreceiver.c:641 replication/walreceiver.c:1071 #, c-format msgid "could not close WAL segment %s: %m" msgstr "WALセグメント%sをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: replication/walreceiver.c:759 +#: replication/walreceiver.c:760 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "プライマリサーãƒãƒ¼ã‹ã‚‰ãƒ©ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%u用ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³å±¥æ­´ãƒ•ァイルをå–り込ã¿ã—ã¦ã„ã¾ã™" -#: replication/walreceiver.c:954 +#: replication/walreceiver.c:959 #, c-format -msgid "could not write to WAL segment %s at offset %u, length %lu: %m" -msgstr "WALファイルセグメント%sã®ã‚ªãƒ•セット%uã€é•·ã•%luã®æ›¸ãè¾¼ã¿ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" +msgid "could not write to WAL segment %s at offset %d, length %lu: %m" +msgstr "WALファイルセグメント%sã®ã‚ªãƒ•セット%dã€é•·ã•%luã®æ›¸ãè¾¼ã¿ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" -#: replication/walsender.c:519 +#: replication/walsender.c:531 #, c-format msgid "cannot use %s with a logical replication slot" msgstr "%sã¯è«–ç†ãƒ¬ãƒ—リケーションスロットã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: replication/walsender.c:623 storage/smgr/md.c:1526 +#: replication/walsender.c:635 storage/smgr/md.c:1735 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "ファイル\"%s\"ã®çµ‚端ã¸ã‚·ãƒ¼ã‚¯ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: replication/walsender.c:627 +#: replication/walsender.c:639 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "ファイル\"%s\"ã®å…ˆé ­ã«ã‚·ãƒ¼ã‚¯ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: replication/walsender.c:704 +#: replication/walsender.c:853 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "è«–ç†ãƒ¬ãƒ—リケーションスロットã¯ç‰©ç†ãƒ¬ãƒ—リケーションã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: replication/walsender.c:770 +#: replication/walsender.c:919 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "タイムライン%3$u上ã®è¦æ±‚ã•れãŸé–‹å§‹ãƒã‚¤ãƒ³ãƒˆ%1$X/%2$Xã¯ã‚µãƒ¼ãƒãƒ¼ã®å±¥æ­´ã«ã‚りã¾ã›ã‚“" -#: replication/walsender.c:773 +#: replication/walsender.c:922 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "サーãƒãƒ¼ã®å±¥æ­´ã¯ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uã®%X/%Xã‹ã‚‰ãƒ•ォークã—ã¾ã—ãŸã€‚" -#: replication/walsender.c:817 +#: replication/walsender.c:966 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "è¦æ±‚ã•れãŸé–‹å§‹ãƒã‚¤ãƒ³ãƒˆ%X/%Xã¯ã‚µãƒ¼ãƒãƒ¼ã®WALフラッシュä½ç½®%X/%Xより進んã§ã„ã¾ã™" -#: replication/walsender.c:1010 +#: replication/walsender.c:1160 #, c-format msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" msgstr "CREATE_REPLICATION_SLOTã®ã‚ªãƒ—ション\"%s\"ã«å¯¾ã™ã‚‹èªè­˜ã§ããªã„値: \"%s\"" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1095 +#: replication/walsender.c:1266 #, c-format msgid "%s must not be called inside a transaction" msgstr "%sã¯ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å†…ã§ã¯å‘¼ã³å‡ºã›ã¾ã›ã‚“" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1105 +#: replication/walsender.c:1276 #, c-format msgid "%s must be called inside a transaction" msgstr "%sã¯ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å†…ã§å‘¼ã³å‡ºã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1111 +#: replication/walsender.c:1282 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s 㯠REPEATABLE READ 分離レベルã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã§å‘¼ã³å‡ºã•れãªã‘れã°ãªã‚Šã¾ã›ã‚“" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1116 +#: replication/walsender.c:1287 #, c-format -msgid "%s must be called in a read only transaction" +msgid "%s must be called in a read-only transaction" msgstr "%sã¯èª­ã¿å–り専用トランザクションã®ä¸­ã§å‘¼ã³å‡ºã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1122 +#: replication/walsender.c:1293 #, c-format msgid "%s must be called before any query" msgstr "%s ã¯å•ã„åˆã‚ã›ã®å®Ÿè¡Œå‰ã«å‘¼ã³å‡ºã•れãªã‘れã°ãªã‚Šã¾ã›ã‚“" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1128 +#: replication/walsender.c:1299 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s ã¯ã‚µãƒ–トランザクション内ã§ã¯å‘¼ã³å‡ºã›ã¾ã›ã‚“" -#: replication/walsender.c:1275 +#: replication/walsender.c:1472 #, c-format msgid "terminating walsender process after promotion" msgstr "昇格後ã«WALé€ä¿¡ãƒ—ロセスを終了ã—ã¾ã™" -#: replication/walsender.c:1696 +#: replication/walsender.c:2000 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "WALé€ä¿¡ãƒ—ロセスãŒåœæ­¢ãƒ¢ãƒ¼ãƒ‰ã®é–“ã¯æ–°ã—ã„コマンドを実行ã§ãã¾ã›ã‚“" -#: replication/walsender.c:1731 +#: replication/walsender.c:2035 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "物ç†ãƒ¬ãƒ—リケーション用ã®WALé€ä¿¡ãƒ—ロセスã§SQLコマンドã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: replication/walsender.c:1764 +#: replication/walsender.c:2068 #, c-format msgid "received replication command: %s" msgstr "レプリケーションコマンドをå—ä¿¡ã—ã¾ã—ãŸ: %s" -#: replication/walsender.c:1772 tcop/fastpath.c:209 tcop/postgres.c:1138 tcop/postgres.c:1496 tcop/postgres.c:1736 tcop/postgres.c:2210 tcop/postgres.c:2648 tcop/postgres.c:2726 +#: replication/walsender.c:2076 tcop/fastpath.c:209 tcop/postgres.c:1142 tcop/postgres.c:1500 tcop/postgres.c:1752 tcop/postgres.c:2234 tcop/postgres.c:2672 tcop/postgres.c:2749 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒã‚¢ãƒœãƒ¼ãƒˆã—ã¾ã—ãŸã€‚トランザクションブロックãŒçµ‚ã‚ã‚‹ã¾ã§ã‚³ãƒžãƒ³ãƒ‰ã¯ç„¡è¦–ã•れã¾ã™" -#: replication/walsender.c:1914 replication/walsender.c:1949 +#: replication/walsender.c:2233 replication/walsender.c:2268 #, c-format msgid "unexpected EOF on standby connection" msgstr "スタンãƒã‚¤æŽ¥ç¶šã§æƒ³å®šå¤–ã®EOFãŒã‚りã¾ã—ãŸ" -#: replication/walsender.c:1937 +#: replication/walsender.c:2256 #, c-format msgid "invalid standby message type \"%c\"" msgstr "スタンãƒã‚¤ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—\"%c\"ã¯ä¸æ­£ã§ã™" -#: replication/walsender.c:2026 +#: replication/walsender.c:2345 #, c-format msgid "unexpected message type \"%c\"" msgstr "想定ã—ãªã„メッセージタイプ\"%c\"" -#: replication/walsender.c:2439 +#: replication/walsender.c:2759 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "レプリケーションタイムアウトã«ã‚ˆã‚Š WAL é€ä¿¡ãƒ—ロセスを終了ã—ã¦ã„ã¾ã™" -#: rewrite/rewriteDefine.c:111 rewrite/rewriteDefine.c:842 +#: rewrite/rewriteDefine.c:104 rewrite/rewriteDefine.c:835 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "リレーション\"%2$s\"ã®ãƒ«ãƒ¼ãƒ«\"%1$s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: rewrite/rewriteDefine.c:268 rewrite/rewriteDefine.c:780 +#: rewrite/rewriteDefine.c:261 rewrite/rewriteDefine.c:773 #, c-format msgid "relation \"%s\" cannot have rules" msgstr "リレーション \"%s\"ã«ã¯ãƒ«ãƒ¼ãƒ«ã‚’定義ã§ãã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:299 +#: rewrite/rewriteDefine.c:292 #, c-format msgid "rule actions on OLD are not implemented" msgstr "OLDã«å¯¾ã™ã‚‹ãƒ«ãƒ¼ãƒ«ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:300 +#: rewrite/rewriteDefine.c:293 #, c-format msgid "Use views or triggers instead." msgstr "代ã‚りã«ãƒ“ューã‹ãƒˆãƒªã‚¬ã‚’使用ã—ã¦ãã ã•ã„。" -#: rewrite/rewriteDefine.c:304 +#: rewrite/rewriteDefine.c:297 #, c-format msgid "rule actions on NEW are not implemented" msgstr "NEWã«å¯¾ã™ã‚‹ãƒ«ãƒ¼ãƒ«ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:305 +#: rewrite/rewriteDefine.c:298 #, c-format msgid "Use triggers instead." msgstr "代ã‚りã«ãƒˆãƒªã‚¬ã‚’使用ã—ã¦ãã ã•ã„。" -#: rewrite/rewriteDefine.c:319 +#: rewrite/rewriteDefine.c:312 #, c-format msgid "relation \"%s\" cannot have ON SELECT rules" msgstr "リレーション \"%s\"ã«ã¯ON SELECTルールを定義ã§ãã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:329 +#: rewrite/rewriteDefine.c:322 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "SELECTã«å¯¾ã™ã‚‹INSTEAD NOTHINGルールã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:330 +#: rewrite/rewriteDefine.c:323 #, c-format msgid "Use views instead." msgstr "代ã‚りã«ãƒ“ューを使用ã—ã¦ãã ã•ã„" -#: rewrite/rewriteDefine.c:338 +#: rewrite/rewriteDefine.c:331 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "SELECTã«å¯¾ã™ã‚‹ãƒ«ãƒ¼ãƒ«ã«ãŠã‘る複数ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:348 +#: rewrite/rewriteDefine.c:341 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "SELECTã«å¯¾ã™ã‚‹ãƒ«ãƒ¼ãƒ«ã¯INSTEAD SELECTアクションをæŒãŸãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:356 +#: rewrite/rewriteDefine.c:349 #, c-format msgid "rules on SELECT must not contain data-modifying statements in WITH" msgstr "SELECT ã®ãƒ«ãƒ¼ãƒ«ã§ã¯ WITH ã«ãƒ‡ãƒ¼ã‚¿ã‚’変更ã™ã‚‹ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆã‚’å«ã‚€ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:364 +#: rewrite/rewriteDefine.c:357 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "SELECTã«å¯¾ã™ã‚‹ãƒ«ãƒ¼ãƒ«ã§ã¯ã‚¤ãƒ™ãƒ³ãƒˆæ¡ä»¶ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:391 +#: rewrite/rewriteDefine.c:384 #, c-format msgid "\"%s\" is already a view" msgstr "\"%s\"ã¯ã™ã§ã«ãƒ“ューã§ã™" -#: rewrite/rewriteDefine.c:415 +#: rewrite/rewriteDefine.c:408 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "\"%s\"ã«å¯¾ã™ã‚‹ãƒ“ューã®ãƒ«ãƒ¼ãƒ«ã®åå‰ã¯\"%s\"ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:442 +#: rewrite/rewriteDefine.c:435 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "ルールã¯è¤‡æ•°ã®RETURNINGリストをæŒã¤ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:447 +#: rewrite/rewriteDefine.c:440 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "æ¡ä»¶ä»˜ã®ãƒ«ãƒ¼ãƒ«ã§ã¯RETURNINGリストã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:451 +#: rewrite/rewriteDefine.c:444 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "INSTEAD以外ã®ãƒ«ãƒ¼ãƒ«ã§ã¯RETURNINGリストã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:465 +#: rewrite/rewriteDefine.c:458 #, c-format msgid "non-view rule for \"%s\" must not be named \"%s\"" msgstr "\"%s\"ã«å¯¾ã™ã‚‹ãƒ“ュー以外ã®ãƒ«ãƒ¼ãƒ«ã®åå‰ã¯\"%s\"ã«ã¯ã§ãã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:539 +#: rewrite/rewriteDefine.c:532 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "SELECTルールã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒªã‚¹ãƒˆã®è¦ç´ ãŒå¤šã™ãŽã¾ã™" -#: rewrite/rewriteDefine.c:540 +#: rewrite/rewriteDefine.c:533 #, c-format msgid "RETURNING list has too many entries" msgstr "RETURNINGリストã®è¦ç´ ãŒå¤šã™ãŽã¾ã™" -#: rewrite/rewriteDefine.c:567 +#: rewrite/rewriteDefine.c:560 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "削除ã•れãŸåˆ—ã‚’æŒã¤ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ビューã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: rewrite/rewriteDefine.c:568 +#: rewrite/rewriteDefine.c:561 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "削除ã•れãŸåˆ—ã‚’æŒã¤ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã«RETURNINGリストを生æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: rewrite/rewriteDefine.c:574 +#: rewrite/rewriteDefine.c:567 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "SELECTルールã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚¨ãƒ³ãƒˆãƒª%dã¯åˆ—\"%s\"ã¨ã¯ç•°ãªã‚‹åˆ—åã‚’æŒã£ã¦ã„ã¾ã™" -#: rewrite/rewriteDefine.c:576 +#: rewrite/rewriteDefine.c:569 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "SELECTã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚¨ãƒ³ãƒˆãƒªã¯\"%s\"ã¨å付ã‘られã¦ã„ã¾ã™ã€‚" -#: rewrite/rewriteDefine.c:585 +#: rewrite/rewriteDefine.c:578 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "SELECTルールã®å¯¾è±¡é …ç›®%dã¯\"%s\"ã¨ç•°ãªã‚‹åˆ—型をæŒã£ã¦ã„ã¾ã™" -#: rewrite/rewriteDefine.c:587 +#: rewrite/rewriteDefine.c:580 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "RETURNINGリスト項目%dã¯\"%s\"ã¨ç•°ãªã‚‹åˆ—型をæŒã£ã¦ã„ã¾ã™" -#: rewrite/rewriteDefine.c:590 rewrite/rewriteDefine.c:614 +#: rewrite/rewriteDefine.c:583 rewrite/rewriteDefine.c:607 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "SELECTã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚¨ãƒ³ãƒˆãƒªã®åž‹ã¯%sã§ã™ãŒã€åˆ—ã®åž‹ã¯%sã§ã™ã€‚" -#: rewrite/rewriteDefine.c:593 rewrite/rewriteDefine.c:618 +#: rewrite/rewriteDefine.c:586 rewrite/rewriteDefine.c:611 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "RETURNINGリストã®è¦ç´ ã®åž‹ã¯%sã§ã™ãŒã€åˆ—ã®åž‹ã¯%sã§ã™ã€‚" -#: rewrite/rewriteDefine.c:609 +#: rewrite/rewriteDefine.c:602 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "SELECTルールã®å¯¾è±¡é …ç›®%dã¯\"%s\"ã¨ç•°ãªã‚‹åˆ—ã®ã‚µã‚¤ã‚ºã‚’æŒã£ã¦ã„ã¾ã™" -#: rewrite/rewriteDefine.c:611 +#: rewrite/rewriteDefine.c:604 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "RETURNINGリスト項目%dã¯\"%s\"ã¨ç•°ãªã‚‹åˆ—ã®ã‚µã‚¤ã‚ºã‚’æŒã£ã¦ã„ã¾ã™" -#: rewrite/rewriteDefine.c:628 +#: rewrite/rewriteDefine.c:621 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "SELECTルールã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒªã‚¹ãƒˆã®é …ç›®ãŒå°‘ãªã™ãŽã¾ã™" -#: rewrite/rewriteDefine.c:629 +#: rewrite/rewriteDefine.c:622 #, c-format msgid "RETURNING list has too few entries" msgstr "RETURNINGリストã®é …ç›®ãŒå°‘ãªã™ãŽã¾ã™" -#: rewrite/rewriteDefine.c:718 rewrite/rewriteDefine.c:833 rewrite/rewriteSupport.c:109 +#: rewrite/rewriteDefine.c:711 rewrite/rewriteDefine.c:826 rewrite/rewriteSupport.c:108 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "リレーション\"%2$s\"ã®ãƒ«ãƒ¼ãƒ«\"%1$s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: rewrite/rewriteDefine.c:852 +#: rewrite/rewriteDefine.c:845 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "ON SELECTルールã®åå‰ã‚’変更ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:583 +#: rewrite/rewriteHandler.c:588 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "WITH ã®å•ã„åˆã‚ã›å\"%s\"ãŒã€ãƒ«ãƒ¼ãƒ«ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¨æ›¸ãæ›ãˆã‚‰ã‚Œã‚ˆã†ã¨ã—ã¦ã„ã‚‹å•ã„åˆã‚ã›ã®ä¸¡æ–¹ã«ç¾ã‚Œã¦ã„ã¾ã™" -#: rewrite/rewriteHandler.c:610 +#: rewrite/rewriteHandler.c:615 #, c-format msgid "INSERT ... SELECT rule actions are not supported for queries having data-modifying statements in WITH" msgstr "INSERT ... SELECTルールã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¯WITHã«ãƒ‡ãƒ¼ã‚¿æ›´æ–°æ–‡ã‚’æŒã¤å•ã„åˆã‚ã›ã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:663 +#: rewrite/rewriteHandler.c:668 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "複数ルールã§ã¯RETURNINGリストをæŒã¤ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:895 rewrite/rewriteHandler.c:934 +#: rewrite/rewriteHandler.c:900 rewrite/rewriteHandler.c:939 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "列\"%s\"ã¸ã®éžãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã®æŒ¿å…¥ã¯ã§ãã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:897 rewrite/rewriteHandler.c:963 +#: rewrite/rewriteHandler.c:902 rewrite/rewriteHandler.c:968 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "列\"%s\"㯠GENERATED ALWAYS ã¨ã—ã¦å®šç¾©ã•れã¦ã„ã¾ã™ã€‚" -#: rewrite/rewriteHandler.c:899 +#: rewrite/rewriteHandler.c:904 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "OVERRIDING SYSTEM VALUE を指定ã™ã‚‹ã“ã¨ã§æŒ¿å…¥ã‚’強制ã§ãã¾ã™ã€‚" -#: rewrite/rewriteHandler.c:961 rewrite/rewriteHandler.c:969 +#: rewrite/rewriteHandler.c:966 rewrite/rewriteHandler.c:974 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "列\"%s\"ã¯DEFAULTã«ã®ã¿æ›´æ–°å¯èƒ½ã§ã™" -#: rewrite/rewriteHandler.c:1116 rewrite/rewriteHandler.c:1134 +#: rewrite/rewriteHandler.c:1109 rewrite/rewriteHandler.c:1127 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "åŒã˜åˆ—\"%s\"ã«è¤‡æ•°ã®ä»£å…¥ãŒã‚りã¾ã™" -#: rewrite/rewriteHandler.c:2119 rewrite/rewriteHandler.c:4040 +#: rewrite/rewriteHandler.c:1682 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGEã¯ãƒ«ãƒ¼ãƒ«ã‚’æŒã¤ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。" + +#: rewrite/rewriteHandler.c:1722 rewrite/rewriteHandler.c:3262 +#, c-format +msgid "access to non-system view \"%s\" is restricted" +msgstr "éžã‚·ã‚¹ãƒ†ãƒ ã®ãƒ“ュー\"%s\"ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯åˆ¶é™ã•れã¦ã„ã¾ã™" + +#: rewrite/rewriteHandler.c:2122 rewrite/rewriteHandler.c:4254 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "リレーション\"%s\"ã®ãƒ«ãƒ¼ãƒ«ã§ç„¡é™å†å¸°ã‚’検出ã—ã¾ã—ãŸ" -#: rewrite/rewriteHandler.c:2204 +#: rewrite/rewriteHandler.c:2227 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "リレーション\"%s\"ã®ãƒãƒªã‚·ã§ç„¡é™å†å¸°ã‚’検出ã—ã¾ã—ãŸ" -#: rewrite/rewriteHandler.c:2524 +#: rewrite/rewriteHandler.c:2589 msgid "Junk view columns are not updatable." msgstr "ã‚¸ãƒ£ãƒ³ã‚¯ãƒ“ãƒ¥ãƒ¼åˆ—ã¯æ›´æ–°ä¸å¯ã§ã™ã€‚" -#: rewrite/rewriteHandler.c:2529 +#: rewrite/rewriteHandler.c:2594 msgid "View columns that are not columns of their base relation are not updatable." msgstr "基底リレーションã®åˆ—ã§ã¯ãªã„ãƒ“ãƒ¥ãƒ¼åˆ—ã¯æ›´æ–°ä¸å¯ã§ã™ã€‚" -#: rewrite/rewriteHandler.c:2532 +#: rewrite/rewriteHandler.c:2597 msgid "View columns that refer to system columns are not updatable." msgstr "システム列をå‚ç…§ã™ã‚‹ãƒ“ãƒ¥ãƒ¼åˆ—ã¯æ›´æ–°ä¸å¯ã§ã™ã€‚" -#: rewrite/rewriteHandler.c:2535 +#: rewrite/rewriteHandler.c:2600 msgid "View columns that return whole-row references are not updatable." msgstr "行全体å‚ç…§ã‚’è¿”ã™ãƒ“ãƒ¥ãƒ¼åˆ—ã¯æ›´æ–°ä¸å¯ã§ã™ã€‚" -#: rewrite/rewriteHandler.c:2596 +#: rewrite/rewriteHandler.c:2661 msgid "Views containing DISTINCT are not automatically updatable." msgstr "DISTINCTã‚’å«ã‚€ãƒ“ューã¯è‡ªå‹•æ›´æ–°ã§ãã¾ã›ã‚“。" -#: rewrite/rewriteHandler.c:2599 +#: rewrite/rewriteHandler.c:2664 msgid "Views containing GROUP BY are not automatically updatable." msgstr "GROUP BYã‚’å«ã‚€ãƒ“ューã¯è‡ªå‹•æ›´æ–°ã§ãã¾ã›ã‚“。" -#: rewrite/rewriteHandler.c:2602 +#: rewrite/rewriteHandler.c:2667 msgid "Views containing HAVING are not automatically updatable." msgstr "HAVINGã‚’å«ã‚€ãƒ“ューã¯è‡ªå‹•æ›´æ–°ã§ãã¾ã›ã‚“。" -#: rewrite/rewriteHandler.c:2605 +#: rewrite/rewriteHandler.c:2670 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "UNIONã€INTERSECTã€EXCEPTã‚’å«ã‚€ãƒ“ューã¯è‡ªå‹•æ›´æ–°ã§ãã¾ã›ã‚“。" -#: rewrite/rewriteHandler.c:2608 +#: rewrite/rewriteHandler.c:2673 msgid "Views containing WITH are not automatically updatable." msgstr "WITHã‚’å«ã‚€ãƒ“ューã¯è‡ªå‹•æ›´æ–°ã§ãã¾ã›ã‚“。" -#: rewrite/rewriteHandler.c:2611 +#: rewrite/rewriteHandler.c:2676 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "LIMITã€OFFSETã‚’å«ã‚€ãƒ“ューã¯è‡ªå‹•æ›´æ–°ã§ãã¾ã›ã‚“。" -#: rewrite/rewriteHandler.c:2623 +#: rewrite/rewriteHandler.c:2688 msgid "Views that return aggregate functions are not automatically updatable." msgstr "集約関数を返ã™ãƒ“ューã¯è‡ªå‹•æ›´æ–°ã§ãã¾ã›ã‚“。" -#: rewrite/rewriteHandler.c:2626 +#: rewrite/rewriteHandler.c:2691 msgid "Views that return window functions are not automatically updatable." msgstr "ウィンドウ関数を返ã™ãƒ“ューã¯è‡ªå‹•æ›´æ–°ã§ãã¾ã›ã‚“。" -#: rewrite/rewriteHandler.c:2629 +#: rewrite/rewriteHandler.c:2694 msgid "Views that return set-returning functions are not automatically updatable." msgstr "集åˆè¿”å´é–¢æ•°ã‚’è¿”ã™ãƒ“ューã¯è‡ªå‹•æ›´æ–°ã§ãã¾ã›ã‚“。" -#: rewrite/rewriteHandler.c:2636 rewrite/rewriteHandler.c:2640 rewrite/rewriteHandler.c:2648 +#: rewrite/rewriteHandler.c:2701 rewrite/rewriteHandler.c:2705 rewrite/rewriteHandler.c:2713 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "å˜ä¸€ã®ãƒ†ãƒ¼ãƒ–ルã¾ãŸã¯ãƒ“ューã‹ã‚‰selectã—ã¦ã„ãªã„ビューã¯è‡ªå‹•æ›´æ–°ã§ãã¾ã›ã‚“。" -#: rewrite/rewriteHandler.c:2651 +#: rewrite/rewriteHandler.c:2716 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "TABLESAMPLEã‚’å«ã‚€ãƒ“ューã¯è‡ªå‹•æ›´æ–°ã§ãã¾ã›ã‚“。" -#: rewrite/rewriteHandler.c:2675 +#: rewrite/rewriteHandler.c:2740 msgid "Views that have no updatable columns are not automatically updatable." msgstr "æ›´æ–°å¯èƒ½ãªåˆ—ã‚’æŒãŸãªã„ビューã¯è‡ªå‹•æ›´æ–°ã§ãã¾ã›ã‚“。" -#: rewrite/rewriteHandler.c:3155 +#: rewrite/rewriteHandler.c:3121 rewrite/rewriteHandler.c:3156 +#, c-format +msgid "cannot insert into view \"%s\"" +msgstr "ビュー\"%s\"ã¸ã¯æŒ¿å…¥(INSERT)ã§ãã¾ã›ã‚“" + +#: rewrite/rewriteHandler.c:3124 +#, c-format +msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." +msgstr "ビューã¸ã®æŒ¿å…¥ã‚’å¯èƒ½ã«ã™ã‚‹ãŸã‚ã«ã€INSTEAD OF INSERTトリガã¾ãŸã¯ç„¡æ¡ä»¶ã®ON INSERT DO INSTEADルールを作æˆã—ã¦ãã ã•ã„。" + +#: rewrite/rewriteHandler.c:3129 rewrite/rewriteHandler.c:3165 +#, c-format +msgid "cannot update view \"%s\"" +msgstr "ビュー\"%s\"ã¯æ›´æ–°ã§ãã¾ã›ã‚“" + +#: rewrite/rewriteHandler.c:3132 +#, c-format +msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." +msgstr "ビューã¸ã®æ›´æ–°ã‚’å¯èƒ½ã«ã™ã‚‹ãŸã‚ã«ã€INSTEAD OF UPDATEトリガã¾ãŸã¯ç„¡æ¡ä»¶ã®ON UPDATE DO INSTEADルールを作æˆã—ã¦ãã ã•ã„。" + +#: rewrite/rewriteHandler.c:3137 rewrite/rewriteHandler.c:3174 +#, c-format +msgid "cannot delete from view \"%s\"" +msgstr "ビュー\"%s\"ã‹ã‚‰ã¯å‰Šé™¤ã§ãã¾ã›ã‚“" + +#: rewrite/rewriteHandler.c:3140 +#, c-format +msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." +msgstr "ビューã‹ã‚‰ã®å‰Šé™¤ã‚’å¯èƒ½ã«ã™ã‚‹ãŸã‚ã«ã€INSTEAD OF DELETEトリガã¾ãŸã¯ç„¡æ¡ä»¶ã®ON DELETE DO INSTEADルールを作æˆã—ã¦ãã ã•ã„。" + +#: rewrite/rewriteHandler.c:3159 +#, c-format +msgid "To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT trigger." +msgstr "MERGEを用ã„ãŸãƒ“ューã¸ã®æŒ¿å…¥ã‚’å¯èƒ½ã«ã™ã‚‹ã«ã¯ã€INSTEAD OF INSERTトリガーを作æˆã—ã¦ãã ã•ã„。" + +#: rewrite/rewriteHandler.c:3168 +#, c-format +msgid "To enable updating the view using MERGE, provide an INSTEAD OF UPDATE trigger." +msgstr "MERGEを用ã„ãŸãƒ“ãƒ¥ãƒ¼ã®æ›´æ–°ã‚’å¯èƒ½ã«ã™ã‚‹ã«ã¯ã€INSTEAD OF UPDATEトリガーを作æˆã—ã¦ãã ã•ã„。" + +#: rewrite/rewriteHandler.c:3177 +#, c-format +msgid "To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE trigger." +msgstr "MERGEを用ã„ãŸãƒ“ューã‹ã‚‰ã®å‰Šé™¤ã‚’å¯èƒ½ã«ã™ã‚‹ãŸã‚ã«ã¯ã€INSTEAD OF DELETEトリガーを作æˆã—ã¦ãã ã•ã„。" + +#: rewrite/rewriteHandler.c:3352 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"ã®åˆ—\"%1$s\"ã¸ã®æŒ¿å…¥ã¯ã§ãã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:3163 +#: rewrite/rewriteHandler.c:3360 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"ã®åˆ—\"%1$s\"ã¯æ›´æ–°ã§ãã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:3667 +#: rewrite/rewriteHandler.c:3368 +#, c-format +msgid "cannot merge into column \"%s\" of view \"%s\"" +msgstr "ビュー\"%2$s\"ã®åˆ—\"%1$s\"ã¸ã®çµ±åˆã¯ã§ãã¾ã›ã‚“" + +#: rewrite/rewriteHandler.c:3396 +#, c-format +msgid "cannot merge into view \"%s\"" +msgstr "ビュー\"%s\"ã¸ã®çµ±åˆã¯ã§ãã¾ã›ã‚“" + +#: rewrite/rewriteHandler.c:3398 +#, c-format +msgid "MERGE is not supported for views with INSTEAD OF triggers for some actions but not all." +msgstr "MERGEã¯INSTEAD OFトリガーãŒå…¨ã¦ã§ã¯ãªã一部ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã«å¯¾ã—ã¦ã®ã¿è¨­å®šã•れã¦ã‚‹ãƒ“ューã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。" + +#: rewrite/rewriteHandler.c:3399 +#, c-format +msgid "To enable merging into the view, either provide a full set of INSTEAD OF triggers or drop the existing INSTEAD OF triggers." +msgstr "ビューã¸ã®çµ±åˆã‚’å¯èƒ½ã«ã™ã‚‹ãŸã‚ã«ã¯ã€å®Œå…¨ãªINSTEAD OF INSERTトリガーを作æˆã™ã‚‹ã‹ã€ã¾ãŸã¯æ—¢å­˜ã®INSTEAD OFトリガーを削除ã—ã¦ãã ã•ã„。" + +#: rewrite/rewriteHandler.c:3912 #, c-format msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" msgstr "DO INSTEAD NOTIFYルールã¯WITH内ã®ãƒ‡ãƒ¼ã‚¿æ›´æ–°æ–‡ã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:3678 +#: rewrite/rewriteHandler.c:3923 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "WITH ã«ãƒ‡ãƒ¼ã‚¿ã‚’変更ã™ã‚‹ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆãŒã‚ã‚‹å ´åˆã¯ DO INSTEAD NOTHING ルールã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:3692 +#: rewrite/rewriteHandler.c:3937 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "WITH ã«ãƒ‡ãƒ¼ã‚¿ã‚’変更ã™ã‚‹ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆãŒã‚ã‚‹å ´åˆã¯ã€æ¡ä»¶ä»˜ã DO INSTEAD ルールã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:3696 +#: rewrite/rewriteHandler.c:3941 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "WITH ã«ãƒ‡ãƒ¼ã‚¿ã‚’変更ã™ã‚‹ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆãŒã‚ã‚‹å ´åˆã¯ DO ALSO ルールã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:3701 +#: rewrite/rewriteHandler.c:3946 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "WITH ã«ãƒ‡ãƒ¼ã‚¿ã‚’変更ã™ã‚‹ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆãŒã‚ã‚‹å ´åˆã¯ãƒžãƒ«ãƒã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆã® DO INSTEAD ルールã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:3968 rewrite/rewriteHandler.c:3976 rewrite/rewriteHandler.c:3984 -#, c-format +#: rewrite/rewriteHandler.c:4206 msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "æ¡ä»¶ä»˜ãDO INSTEADルールをæŒã¤ãƒ“ューã¯è‡ªå‹•æ›´æ–°ã§ãã¾ã›ã‚“。" -#: rewrite/rewriteHandler.c:4089 +#: rewrite/rewriteHandler.c:4303 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"ã¸ã®INSERT RETURNINGを行ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:4091 +#: rewrite/rewriteHandler.c:4305 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "RETURNINGå¥ã‚’æŒã¤ç„¡æ¡ä»¶ã®ON INSERT DO INSTEADルールãŒå¿…è¦ã§ã™ã€‚" -#: rewrite/rewriteHandler.c:4096 +#: rewrite/rewriteHandler.c:4310 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"ã¸ã®UPDATE RETURNINGを行ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:4098 +#: rewrite/rewriteHandler.c:4312 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "RETURNINGå¥ã‚’æŒã¤ç„¡æ¡ä»¶ã®ON UPDATE DO INSTEADルールãŒå¿…è¦ã§ã™ã€‚" -#: rewrite/rewriteHandler.c:4103 +#: rewrite/rewriteHandler.c:4317 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"ã¸ã®DELETE RETURNINGを行ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:4105 +#: rewrite/rewriteHandler.c:4319 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "RETURNINGå¥ã‚’æŒã¤ç„¡æ¡ä»¶ã®ON DELETE DO INSTEADルールãŒå¿…è¦ã§ã™ã€‚" -#: rewrite/rewriteHandler.c:4123 +#: rewrite/rewriteHandler.c:4337 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "ON CONFLICTå¥ã‚’ä¼´ã†INSERTã¯ã€INSERTã¾ãŸã¯UPDATEルールをæŒã¤ãƒ†ãƒ¼ãƒ–ルã§ã¯ä½¿ãˆã¾ã›ã‚“" -#: rewrite/rewriteHandler.c:4180 +#: rewrite/rewriteHandler.c:4394 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "複数å•ã„åˆã‚ã›ã«å¯¾ã™ã‚‹ãƒ«ãƒ¼ãƒ«ã«ã‚ˆã‚Šæ›¸ãæ›ãˆã‚‰ã‚ŒãŸå•ã„åˆã‚ã›ã§ã¯ WITH を使用ã§ãã¾ã›ã‚“" -#: rewrite/rewriteManip.c:1075 +#: rewrite/rewriteManip.c:1084 #, c-format msgid "conditional utility statements are not implemented" msgstr "æ¡ä»¶ä»˜ãã®ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£æ–‡ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: rewrite/rewriteManip.c:1419 +#: rewrite/rewriteManip.c:1431 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "ビューã«å¯¾ã™ã‚‹WHERE CURRENT OFã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: rewrite/rewriteManip.c:1754 +#: rewrite/rewriteManip.c:1767 #, c-format msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" msgstr "ON UPDATE ルールã®NEW変数ã¯ã€å¯¾è±¡ã®UPDATEコマンドã§ã®è¤‡æ•°åˆ—代入ã®ä¸€éƒ¨ã¨ãªã‚‹åˆ—ã‚’å‚ç…§ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" @@ -21059,117 +21849,117 @@ msgstr "ON UPDATE ルールã®NEW変数ã¯ã€å¯¾è±¡ã®UPDATEコマンドã§ã® msgid "with a SEARCH or CYCLE clause, the recursive reference to WITH query \"%s\" must be at the top level of its right-hand SELECT" msgstr "SEARCHã¾ãŸã¯CYCLEå¥ã‚’指定ã™ã‚‹å ´åˆã€WITHå•ã„åˆã‚ã›\"%s\"ã¸ã®å†å¸°å‚ç…§ã¯å³è¾ºã®SELECTã®æœ€ä¸Šä½ã§è¡Œã†å¿…è¦ãŒã‚りã¾ã™" -#: scan.l:482 +#: scan.l:497 msgid "unterminated /* comment" msgstr "/*コメントãŒé–‰ã˜ã¦ã„ã¾ã›ã‚“" -#: scan.l:502 +#: scan.l:517 msgid "unterminated bit string literal" msgstr "ビット列リテラルã®çµ‚端ãŒã‚りã¾ã›ã‚“" -#: scan.l:516 +#: scan.l:531 msgid "unterminated hexadecimal string literal" msgstr "16進数文字列リテラルã®çµ‚端ãŒã‚りã¾ã›ã‚“" -#: scan.l:566 +#: scan.l:581 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "Unicodeエスケープを使ã£ãŸæ–‡å­—列定数ã®å±é™ºãªä½¿ç”¨" -#: scan.l:567 +#: scan.l:582 #, c-format -msgid "String constants with Unicode escapes cannot be used when standard_conforming_strings is off." -msgstr "Unicodeエスケープã¯standard_conforming_stringsãŒç„¡åŠ¹ãªæ™‚ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" +msgid "String constants with Unicode escapes cannot be used when \"standard_conforming_strings\" is off." +msgstr "Unicodeエスケープをå«ã‚€æ–‡å­—列定数ã¯\"standard_conforming_strings\"ãŒoffã®æ™‚ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" -#: scan.l:628 +#: scan.l:643 msgid "unhandled previous state in xqs" msgstr "xqsã®ä¸­ã§å‡¦ç†ã•れãªã„å‰ã‚¹ãƒ†ãƒ¼ãƒˆ" -#: scan.l:702 +#: scan.l:717 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "Unicodeエスケープã¯\\uXXXXã¾ãŸã¯\\UXXXXXXXXã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: scan.l:713 +#: scan.l:728 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "文字列リテラルã§å®‰å…¨ã§ã¯ãªã„\\'ãŒä½¿ç”¨ã•れã¾ã—ãŸã€‚" -#: scan.l:714 +#: scan.l:729 #, c-format msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." msgstr "文字列内ã§å¼•用符を記述ã™ã‚‹ã«ã¯''を使用ã—ã¦ãã ã•ã„。\\'ã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®ã¿ã§æœ‰åйãªç¬¦å·åŒ–å½¢å¼ã§ã¯å®‰å…¨ã§ã¯ã‚りã¾ã›ã‚“。" -#: scan.l:786 +#: scan.l:801 msgid "unterminated dollar-quoted string" msgstr "文字列ã®ãƒ‰ãƒ«å¼•用符ãŒé–‰ã˜ã¦ã„ã¾ã›ã‚“" -#: scan.l:803 scan.l:813 +#: scan.l:818 scan.l:828 msgid "zero-length delimited identifier" msgstr "二é‡å¼•用符ã§å›²ã¾ã‚ŒãŸè­˜åˆ¥å­ã®é•·ã•ãŒã‚¼ãƒ­ã§ã™" -#: scan.l:824 syncrep_scanner.l:101 +#: scan.l:839 syncrep_scanner.l:101 msgid "unterminated quoted identifier" msgstr "識別å­ã®å¼•用符ãŒé–‰ã˜ã¦ã„ã¾ã›ã‚“" -#: scan.l:987 +#: scan.l:1002 msgid "operator too long" msgstr "演算å­ãŒé•·ã™ãŽã¾ã™" -#: scan.l:1000 +#: scan.l:1015 msgid "trailing junk after parameter" msgstr "パラメータã®å¾Œã«ä½™åˆ†ãªæ–‡å­—" -#: scan.l:1021 +#: scan.l:1036 msgid "invalid hexadecimal integer" msgstr "䏿­£ãª16進整数" -#: scan.l:1025 +#: scan.l:1040 msgid "invalid octal integer" msgstr "䏿­£ãª8進整数" -#: scan.l:1029 +#: scan.l:1044 msgid "invalid binary integer" msgstr "䏿­£ãª2進整数" #. translator: %s is typically the translation of "syntax error" -#: scan.l:1237 +#: scan.l:1239 #, c-format msgid "%s at end of input" msgstr "å…¥åŠ›ã®æœ€å¾Œã§ %s" #. translator: first %s is typically the translation of "syntax error" -#: scan.l:1245 +#: scan.l:1247 #, c-format msgid "%s at or near \"%s\"" msgstr "\"%2$s\"ã¾ãŸã¯ãã®è¿‘辺ã§%1$s" -#: scan.l:1435 +#: scan.l:1439 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "文字列リテラルãªã„ã§ã®\\'ã®éžæ¨™æº–çš„ãªä½¿ç”¨" -#: scan.l:1436 +#: scan.l:1440 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "文字列内ã§å˜ä¸€å¼•用符を記述ã™ã‚‹ã«ã¯''ã€ã¾ãŸã¯ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—文字列構文(E'...')を使用ã—ã¦ãã ã•ã„。" -#: scan.l:1445 +#: scan.l:1449 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "文字列リテラル内ã§ã®\\\\ã®éžæ¨™æº–çš„ãªä½¿ç”¨" -#: scan.l:1446 +#: scan.l:1450 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã®ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—文字列構文ã€ä¾‹ãˆã°E'\\\\'を使用ã—ã¦ãã ã•ã„。" -#: scan.l:1460 +#: scan.l:1464 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "文字列リテラル内ã§ã®ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã®éžæ¨™æº–çš„ãªä½¿ç”¨" -#: scan.l:1461 +#: scan.l:1465 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "エスケープã®ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—文字列構文ã€ä¾‹ãˆã°E'\\r\\n'を使用ã—ã¦ãã ã•ã„。" @@ -21199,75 +21989,70 @@ msgstr "èªè­˜ã§ããªã„Snowballパラメータ: \"%s\"" msgid "missing Language parameter" msgstr "LanguageパラメータãŒã‚りã¾ã›ã‚“" -#: statistics/extended_stats.c:179 +#: statistics/extended_stats.c:176 #, c-format msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "統計オブジェクト\"%s.%s\"ãŒãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³\"%s.%s\"ã«å¯¾ã—ã¦è¨ˆç®—ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: statistics/mcv.c:1372 +#: statistics/mcv.c:1368 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "レコード型をå—ã‘付ã‘られãªã„コンテキストã§ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã™é–¢æ•°ãŒå‘¼ã³å‡ºã•れã¾ã—ãŸ" -#: storage/buffer/bufmgr.c:612 storage/buffer/bufmgr.c:769 +#: storage/buffer/bufmgr.c:649 storage/buffer/bufmgr.c:805 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "ä»–ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä¸€æ™‚テーブルã«ã¯ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“" -#: storage/buffer/bufmgr.c:1137 +#: storage/buffer/bufmgr.c:1532 #, c-format msgid "invalid page in block %u of relation %s; zeroing out page" msgstr "リレーション %2$s ã® %1$u ブロック目ã®ãƒšãƒ¼ã‚¸ãŒä¸æ­£ã§ã™: ページをゼロã§åŸ‹ã‚ã¾ã—ãŸ" -#: storage/buffer/bufmgr.c:1931 storage/buffer/localbuf.c:359 +#: storage/buffer/bufmgr.c:2277 storage/buffer/localbuf.c:361 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "リレーション\"%s\"ã‚’%uブロックを超ãˆã¦æ‹¡å¼µã§ãã¾ã›ã‚“" -#: storage/buffer/bufmgr.c:1998 +#: storage/buffer/bufmgr.c:2348 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "リレーション %2$s ã® %1$u ブロック目ã§ã€EOF ã®å…ˆã«æƒ³å®šå¤–ã®ãƒ‡ãƒ¼ã‚¿ã‚’検出ã—ã¾ã—ãŸ" -#: storage/buffer/bufmgr.c:2000 +#: storage/buffer/bufmgr.c:2350 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "ã“れã¯ã‚«ãƒ¼ãƒãƒ«ã®ä¸å…·åˆã§ç™ºç”Ÿã—ãŸæ¨¡æ§˜ã§ã™ã€‚ã‚·ã‚¹ãƒ†ãƒ ã®æ›´æ–°ã‚’検討ã—ã¦ãã ã•ã„。" -#: storage/buffer/bufmgr.c:5219 +#: storage/buffer/bufmgr.c:5654 #, c-format msgid "could not write block %u of %s" msgstr "%u ブロックを %s ã«æ›¸ã出ã›ã¾ã›ã‚“ã§ã—ãŸ" -#: storage/buffer/bufmgr.c:5221 +#: storage/buffer/bufmgr.c:5656 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "複数回失敗ã—ã¾ã—㟠---ãšã£ã¨æ›¸ãè¾¼ã¿ã‚¨ãƒ©ãƒ¼ãŒç¶šãã‹ã‚‚ã—れã¾ã›ã‚“。" -#: storage/buffer/bufmgr.c:5243 storage/buffer/bufmgr.c:5263 +#: storage/buffer/bufmgr.c:5678 storage/buffer/bufmgr.c:5698 #, c-format msgid "writing block %u of relation %s" msgstr "ブロック %u ã‚’ リレーション %s ã«æ›¸ã込んã§ã„ã¾ã™" -#: storage/buffer/bufmgr.c:5593 -#, c-format -msgid "snapshot too old" -msgstr "スナップショットãŒå¤ã™ãŽã¾ã™" - -#: storage/buffer/localbuf.c:219 +#: storage/buffer/localbuf.c:220 #, c-format msgid "no empty local buffer available" msgstr "利用ã§ãã‚‹ã€ç©ºã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒãƒƒãƒ•ã‚¡ãŒã‚りã¾ã›ã‚“" -#: storage/buffer/localbuf.c:592 +#: storage/buffer/localbuf.c:597 #, c-format msgid "cannot access temporary tables during a parallel operation" msgstr "並列処ç†ä¸­ã¯ä¸€æ™‚テーブルã«ã¯ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“" -#: storage/buffer/localbuf.c:699 +#: storage/buffer/localbuf.c:712 #, c-format msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." -msgstr "当該セッションã§ä½•らã‹ã®ä¸€æ™‚テーブルãŒã‚¢ã‚¯ã‚»ã‚¹ã•れãŸå¾Œã¯ \"temp_buffers\"を変更ã§ãã¾ã›ã‚“" +msgstr "当該セッションã§ä½•らã‹ã®ä¸€æ™‚テーブルãŒã‚¢ã‚¯ã‚»ã‚¹ã•れãŸå¾Œã¯\"temp_buffers\"を変更ã§ãã¾ã›ã‚“。" #: storage/file/buffile.c:338 #, c-format @@ -21284,150 +22069,155 @@ msgstr "ファイルセット\"%1$s\"ã‹ã‚‰ã®èª­ã¿è¾¼ã¿ãŒã§ãã¾ã›ã‚“ã§ msgid "could not read from temporary file: read only %zu of %zu bytes" msgstr "一時ファイルã‹ã‚‰ã®èª­ã¿è¾¼ã¿å¤±æ•—ã—ã¾ã—ãŸ: %2$zuãƒã‚¤ãƒˆä¸­%1$zuãƒã‚¤ãƒˆåˆ†ã®ã¿èª­ã¿è¾¼ã¿ã¾ã—ãŸ" -#: storage/file/buffile.c:774 storage/file/buffile.c:895 +#: storage/file/buffile.c:774 storage/file/buffile.c:877 #, c-format msgid "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" msgstr "BufFile \"%s\"ã®ä¸€æ™‚ファイル\"%s\"ã®ã‚µã‚¤ã‚ºã®ç¢ºèªã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: storage/file/buffile.c:974 +#: storage/file/buffile.c:956 #, c-format msgid "could not delete fileset \"%s\": %m" msgstr "ファイルセット\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: storage/file/buffile.c:992 storage/smgr/md.c:335 storage/smgr/md.c:1038 +#: storage/file/buffile.c:974 storage/smgr/md.c:336 storage/smgr/md.c:1194 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "ファイル\"%s\"ã®åˆ‡ã‚Šè©°ã‚処ç†ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: storage/file/fd.c:516 storage/file/fd.c:588 storage/file/fd.c:624 +#: storage/file/fd.c:583 storage/file/fd.c:655 storage/file/fd.c:691 #, c-format msgid "could not flush dirty data: %m" msgstr "ダーティーデータを書ã出ã—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: storage/file/fd.c:546 +#: storage/file/fd.c:613 #, c-format msgid "could not determine dirty data size: %m" msgstr "ダーティーデータã®ã‚µã‚¤ã‚ºã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: storage/file/fd.c:598 +#: storage/file/fd.c:665 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "ãƒ‡ãƒ¼ã‚¿ã®æ›¸ã出ã—中ã«munmap()ã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: storage/file/fd.c:894 +#: storage/file/fd.c:983 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimitãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" -#: storage/file/fd.c:984 +#: storage/file/fd.c:1073 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "サーãƒãƒ¼ãƒ—ロセスを起動ã•ã›ã‚‹ãŸã‚ã«åˆ©ç”¨ã§ãるファイル記述å­ãŒä¸è¶³ã—ã¦ã„ã¾ã™" -#: storage/file/fd.c:985 +#: storage/file/fd.c:1074 #, c-format msgid "System allows %d, server needs at least %d." msgstr "システムã§ã¯%d使用ã§ãã¾ã™ãŒã€ã‚µãƒ¼ãƒãƒ¼ã§ã¯å°‘ãªãã¨ã‚‚%då¿…è¦ã§ã™ã€‚" -#: storage/file/fd.c:1073 storage/file/fd.c:2515 storage/file/fd.c:2624 storage/file/fd.c:2775 +#: storage/file/fd.c:1162 storage/file/fd.c:2618 storage/file/fd.c:2727 storage/file/fd.c:2878 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "ファイル記述å­ãŒä¸è¶³ã—ã¦ã„ã¾ã™: %m: 解放後å†å®Ÿè¡Œã—ã¦ãã ã•ã„" -#: storage/file/fd.c:1447 +#: storage/file/fd.c:1536 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "一時ファイル: パス \"%s\"ã€ã‚µã‚¤ã‚º %lu" -#: storage/file/fd.c:1586 +#: storage/file/fd.c:1675 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "一時ディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: storage/file/fd.c:1593 +#: storage/file/fd.c:1682 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "一時サブディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: storage/file/fd.c:1790 +#: storage/file/fd.c:1879 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: storage/file/fd.c:1826 +#: storage/file/fd.c:1915 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: storage/file/fd.c:1867 +#: storage/file/fd.c:1956 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"ã‚’ unlink ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: storage/file/fd.c:1955 +#: storage/file/fd.c:2044 #, c-format msgid "could not delete file \"%s\": %m" msgstr "ファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: storage/file/fd.c:2138 +#: storage/file/fd.c:2234 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "一時ファイルã®ã‚µã‚¤ã‚ºãŒtemp_file_limit(%d KB)ã‚’è¶…ãˆã¦ã„ã¾ã™" -#: storage/file/fd.c:2491 storage/file/fd.c:2550 +#: storage/file/fd.c:2594 storage/file/fd.c:2653 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "ファイル\"%2$s\"をオープンã—よã†ã¨ã—ãŸæ™‚ã«maxAllocatedDescs(%1$d)を超ãˆã¾ã—ãŸ" -#: storage/file/fd.c:2595 +#: storage/file/fd.c:2698 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "コマンド\"%2$s\"を実行ã—よã†ã¨ã—ãŸæ™‚ã«maxAllocatedDescs(%1$d)を超ãˆã¾ã—ãŸ" -#: storage/file/fd.c:2751 +#: storage/file/fd.c:2854 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "ディレクトリ\"%2$s\"をオープンã—よã†ã¨ã—ãŸæ™‚ã«maxAllocatedDescs(%1$d)を超ãˆã¾ã—ãŸ" -#: storage/file/fd.c:3281 +#: storage/file/fd.c:3384 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "ä¸€æ™‚ãƒ•ã‚¡ã‚¤ãƒ«ç”¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«æƒ³å®šå¤–ã®ãƒ•ァイルãŒã‚りã¾ã—ãŸ: \"%s\"" -#: storage/file/fd.c:3399 +#: storage/file/fd.c:3502 #, c-format msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åŒæœŸã—ã¦ã„ã¾ã™(syncfs)ã€çµŒéŽæ™‚é–“: %ld.%02dç§’, ç¾åœ¨ã®ãƒ‘ス: %s" -#: storage/file/fd.c:3413 -#, c-format -msgid "could not synchronize file system for file \"%s\": %m" -msgstr "ファイル\"%s\"ã«å¯¾ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã‚’åŒæœŸã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: storage/file/fd.c:3626 +#: storage/file/fd.c:3729 #, c-format msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åŒæœŸã—ã¦ã„ã¾ã™(pre-syncfs)ã€çµŒéŽæ™‚é–“: %ld.%02dç§’, ç¾åœ¨ã®ãƒ‘ス: %s" -#: storage/file/fd.c:3658 +#: storage/file/fd.c:3761 #, c-format msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åŒæœŸã—ã¦ã„ã¾ã™(fsync)ã€çµŒéŽæ™‚é–“: %ld.%02dç§’, ç¾åœ¨ã®ãƒ‘ス: %s" -#: storage/file/fd.c:3847 +#: storage/file/fd.c:3950 +#, c-format +msgid "\"debug_io_direct\" is not supported on this platform." +msgstr "ã“ã®ãƒ—ラットフォームã§ã¯ \"debug_io_direct\" ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。" + +#: storage/file/fd.c:3964 +#, c-format +msgid "Invalid list syntax in parameter \"%s\"" +msgstr "パラメータ\"%s\"ã®ãƒªã‚¹ãƒˆæ§‹æ–‡ãŒä¸æ­£ã§ã™" + +#: storage/file/fd.c:3984 #, c-format -msgid "debug_io_direct is not supported on this platform." -msgstr "ã“ã®ãƒ—ラットフォームã§ã¯debug_io_directã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。" +msgid "Invalid option \"%s\"" +msgstr "䏿­£ãªã‚ªãƒ—ション\"%s\"" -#: storage/file/fd.c:3894 +#: storage/file/fd.c:3997 #, c-format -msgid "debug_io_direct is not supported for WAL because XLOG_BLCKSZ is too small" -msgstr "XLOG_BLCKSZãŒå°ã•ã™ãŽã‚‹ãŸã‚debug_io_directã¯WALã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" +msgid "\"debug_io_direct\" is not supported for WAL because XLOG_BLCKSZ is too small" +msgstr "XLOG_BLCKSZãŒå°ã•ã™ãŽã‚‹ãŸã‚ \"debug_io_direct\" ã¯WALã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: storage/file/fd.c:3901 +#: storage/file/fd.c:4004 #, c-format -msgid "debug_io_direct is not supported for data because BLCKSZ is too small" -msgstr "BLCKSZãŒå°ã•ã™ãŽã‚‹ãŸã‚debug_io_directã¯ãƒ‡ãƒ¼ã‚¿ã«å¯¾ã—ã¦ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" +msgid "\"debug_io_direct\" is not supported for data because BLCKSZ is too small" +msgstr "BLCKSZãŒå°ã•ã™ãŽã‚‹ãŸã‚ \"debug_io_direct\" ã¯ãƒ‡ãƒ¼ã‚¿ã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。" #: storage/file/reinit.c:145 #, c-format @@ -21439,22 +22229,22 @@ msgstr "éžãƒ­ã‚°ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’リセットã—ã¦ã„ã¾ã™(init)ã€çµŒéŽ msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" msgstr "éžãƒ­ã‚°ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’リセットã—ã¦ã„ã¾ã™(cleanup)ã€çµŒéŽæ™‚é–“: %ld.%02dç§’, ç¾åœ¨ã®ãƒ‘ス: %s" -#: storage/file/sharedfileset.c:79 +#: storage/file/sharedfileset.c:73 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "ã™ã§ã«ç ´æ£„ã•れã¦ã„ã‚‹ãŸã‚ SharedFileSet ã«ã‚¢ã‚¿ãƒƒãƒã§ãã¾ã›ã‚“" -#: storage/ipc/dsm.c:352 +#: storage/ipc/dsm.c:379 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "動的共有メモリã®åˆ¶å¾¡ã‚»ã‚°ãƒ¡ãƒ³ãƒˆãŒå£Šã‚Œã¦ã„ã¾ã™" -#: storage/ipc/dsm.c:417 +#: storage/ipc/dsm.c:444 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "動的共有メモリã®åˆ¶å¾¡ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã®å†…容ãŒä¸æ­£ã§ã™" -#: storage/ipc/dsm.c:599 +#: storage/ipc/dsm.c:626 #, c-format msgid "too many dynamic shared memory segments" msgstr "動的共有メモリセグメントãŒå¤šã™ãŽã¾ã™" @@ -21509,67 +22299,92 @@ msgstr "共有メモリセグメント\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã— msgid "could not duplicate handle for \"%s\": %m" msgstr "\"%s\"ã®ãƒãƒ³ãƒ‰ãƒ«ã®è¤‡è£½ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: storage/ipc/procarray.c:3796 +#: storage/ipc/dsm_registry.c:142 #, c-format -msgid "database \"%s\" is being used by prepared transactions" -msgstr "データベース\"%s\"ã¯æº–備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã§ä½¿ç”¨ä¸­ã§ã™" +msgid "DSM segment name cannot be empty" +msgstr "DSMセグメントåã¯ç©ºæ–‡å­—列ã«ã¯ã§ãã¾ã›ã‚“" + +#: storage/ipc/dsm_registry.c:146 +#, c-format +msgid "DSM segment name too long" +msgstr "DSMセグメントåãŒé•·ã™ãŽã¾ã™" + +#: storage/ipc/dsm_registry.c:150 +#, c-format +msgid "DSM segment size must be nonzero" +msgstr "DSMセグメントサイズã¯0以外ã®å€¤ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" + +#: storage/ipc/dsm_registry.c:176 +#, c-format +msgid "requested DSM segment size does not match size of existing segment" +msgstr "è¦æ±‚ã•れãŸDSMã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚ºãŒæ—¢å­˜ã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã®ã‚µã‚¤ã‚ºã¨ç•°ãªã£ã¦ã„ã¾ã™" + +#: storage/ipc/procarray.c:488 storage/lmgr/proc.c:357 tcop/backend_startup.c:304 +#, c-format +msgid "sorry, too many clients already" +msgstr "ç¾åœ¨ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæ•°ãŒå¤šã™ãŽã¾ã™" -#: storage/ipc/procarray.c:3828 +#: storage/ipc/procarray.c:3857 #, c-format -msgid "must be a superuser to terminate superuser process" -msgstr "スーパーユーザーã®ãƒ—ロセスを終了ã•ã›ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" +msgid "database \"%s\" is being used by prepared transactions" +msgstr "データベース\"%s\"ã¯æº–備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã§ä½¿ç”¨ä¸­ã§ã™" -#: storage/ipc/procarray.c:3835 storage/ipc/signalfuncs.c:230 storage/ipc/signalfuncs.c:237 +#: storage/ipc/procarray.c:3893 storage/ipc/procarray.c:3901 storage/ipc/signalfuncs.c:235 storage/ipc/signalfuncs.c:242 #, c-format msgid "permission denied to terminate process" msgstr "プロセスを終了ã•ã›ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: storage/ipc/procarray.c:3836 storage/ipc/signalfuncs.c:238 +#: storage/ipc/procarray.c:3894 storage/ipc/signalfuncs.c:236 +#, c-format +msgid "Only roles with the %s attribute may terminate processes of roles with the %s attribute." +msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒ%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ãŒæŽ¥ç¶šä¸­ã®ãƒ—ロセスを終了ã§ãã¾ã™ã€‚" + +#: storage/ipc/procarray.c:3902 storage/ipc/signalfuncs.c:243 #, c-format msgid "Only roles with privileges of the role whose process is being terminated or with privileges of the \"%s\" role may terminate this process." msgstr "終了ã•ã›ã‚ˆã†ã¨ã—ã¦ã„ã‚‹ãƒ—ãƒ­ã‚»ã‚¹ã«æŽ¥ç¶šã—ã¦ã„ã‚‹ãƒ­ãƒ¼ãƒ«ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã€ã¾ãŸã¯\"%sロール権é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã“ã®ãƒ—ロセスを終了ã§ãã¾ã™ã€‚" -#: storage/ipc/procsignal.c:420 +#: storage/ipc/procsignal.c:416 #, c-format msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" msgstr "PID %dã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãŒProcSignalBarrierã‚’å—ã‘付ã‘ã‚‹ã®ã‚’å¾…ã£ã¦ã„ã¾ã™" -#: storage/ipc/shm_mq.c:384 +#: storage/ipc/shm_mq.c:383 #, c-format msgid "cannot send a message of size %zu via shared memory queue" msgstr "共有メモリキュー経由ã§å¤§ãã•%zuã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯é€ä¿¡ã§ãã¾ã›ã‚“" -#: storage/ipc/shm_mq.c:719 +#: storage/ipc/shm_mq.c:718 #, c-format msgid "invalid message size %zu in shared memory queue" msgstr "共有メモリキュー内ã®ä¸æ­£ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸é•·%zu" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2810 storage/lmgr/lock.c:4195 storage/lmgr/lock.c:4260 storage/lmgr/lock.c:4610 storage/lmgr/predicate.c:2412 storage/lmgr/predicate.c:2427 storage/lmgr/predicate.c:3824 storage/lmgr/predicate.c:4871 utils/hash/dynahash.c:1107 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:984 storage/lmgr/lock.c:1022 storage/lmgr/lock.c:2835 storage/lmgr/lock.c:4220 storage/lmgr/lock.c:4285 storage/lmgr/lock.c:4635 storage/lmgr/predicate.c:2468 storage/lmgr/predicate.c:2483 storage/lmgr/predicate.c:3880 storage/lmgr/predicate.c:4927 utils/hash/dynahash.c:1095 #, c-format msgid "out of shared memory" msgstr "共有メモリãŒè¶³ã‚Šã¾ã›ã‚“" -#: storage/ipc/shmem.c:170 storage/ipc/shmem.c:266 +#: storage/ipc/shmem.c:161 storage/ipc/shmem.c:257 #, c-format msgid "out of shared memory (%zu bytes requested)" msgstr "共有メモリãŒè¶³ã‚Šã¾ã›ã‚“ (%zu ãƒã‚¤ãƒˆè¦æ±‚ã—ã¾ã—ãŸ)" -#: storage/ipc/shmem.c:445 +#: storage/ipc/shmem.c:436 #, c-format msgid "could not create ShmemIndex entry for data structure \"%s\"" msgstr "データ構造体\"%s\"ã®ãŸã‚ã®ShmemIndexエントリを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: storage/ipc/shmem.c:460 +#: storage/ipc/shmem.c:451 #, c-format msgid "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, actual %zu" msgstr "データ構造体\"%s\"ã®ãŸã‚ã®ShmemIndexエントリã®ã‚µã‚¤ã‚ºãŒèª¤ã£ã¦ã„ã¾ã™: %zuãƒã‚¤ãƒˆã‚’期待ã—ã¾ã—ãŸãŒã€å®Ÿéš›ã¯%zuãƒã‚¤ãƒˆã§ã—ãŸ" -#: storage/ipc/shmem.c:479 +#: storage/ipc/shmem.c:470 #, c-format msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" msgstr "データ構造体\"%s\"ã®ãŸã‚ã®å…±æœ‰ãƒ¡ãƒ¢ãƒªãŒä¸è¶³ã—ã¦ã„ã¾ã™ ( %zu ãƒã‚¤ãƒˆãŒå¿…è¦)" -#: storage/ipc/shmem.c:511 storage/ipc/shmem.c:530 +#: storage/ipc/shmem.c:502 storage/ipc/shmem.c:521 #, c-format msgid "requested shared memory size overflows size_t" msgstr "è¦æ±‚ã•れãŸå…±æœ‰ãƒ¡ãƒ¢ãƒªã®ã‚µã‚¤ã‚ºã¯size_tã‚’è¶…ãˆã¦ã„ã¾ã™" @@ -21579,451 +22394,565 @@ msgstr "è¦æ±‚ã•れãŸå…±æœ‰ãƒ¡ãƒ¢ãƒªã®ã‚µã‚¤ã‚ºã¯size_tã‚’è¶…ãˆã¦ã„ã¾ã™ msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %dã¯PostgreSQLãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãƒ—ロセスã§ã¯ã‚りã¾ã›ã‚“" -#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1379 utils/adt/mcxtfuncs.c:190 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1453 utils/adt/mcxtfuncs.c:182 #, c-format msgid "could not send signal to process %d: %m" msgstr "プロセス%dã«ã‚·ã‚°ãƒŠãƒ«ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: storage/ipc/signalfuncs.c:124 storage/ipc/signalfuncs.c:131 +#: storage/ipc/signalfuncs.c:129 storage/ipc/signalfuncs.c:136 #, c-format msgid "permission denied to cancel query" msgstr "å•ã„åˆã‚ã›ã‚’キャンセルã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: storage/ipc/signalfuncs.c:125 +#: storage/ipc/signalfuncs.c:130 #, c-format -msgid "Only roles with the %s attribute may cancel queries of roles with %s." +msgid "Only roles with the %s attribute may cancel queries of roles with the %s attribute." msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã€%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ãŒå®Ÿè¡Œä¸­ã®å•ã„åˆã‚ã›ã‚’キャンセルã§ãã¾ã™ã€‚" -#: storage/ipc/signalfuncs.c:132 +#: storage/ipc/signalfuncs.c:137 #, c-format msgid "Only roles with privileges of the role whose query is being canceled or with privileges of the \"%s\" role may cancel this query." msgstr "キャンセル対象ã®å•ã„åˆã‚ã›ã‚’実行ã—ã¦ã„ã‚‹ãƒ­ãƒ¼ãƒ«ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã€ã¾ãŸã¯\"%s\"ãƒ­ãƒ¼ãƒ«ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã“ã®å•ã„åˆã‚ã›ã‚’キャンセルã§ãã¾ã™ã€‚" -#: storage/ipc/signalfuncs.c:174 +#: storage/ipc/signalfuncs.c:179 #, c-format msgid "could not check the existence of the backend with PID %d: %m" msgstr "PID %dã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã®å­˜åœ¨ã®ç¢ºèªã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: storage/ipc/signalfuncs.c:192 +#: storage/ipc/signalfuncs.c:197 #, c-format msgid "backend with PID %d did not terminate within %lld millisecond" msgid_plural "backend with PID %d did not terminate within %lld milliseconds" msgstr[0] "PID %dã®ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãŒ%lldミリ秒ã§çµ‚了ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: storage/ipc/signalfuncs.c:223 +#: storage/ipc/signalfuncs.c:228 #, c-format msgid "\"timeout\" must not be negative" msgstr "\"timeout\"ã¯è² æ•°ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: storage/ipc/signalfuncs.c:231 -#, c-format -msgid "Only roles with the %s attribute may terminate processes of roles with %s." -msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒ%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ãŒæŽ¥ç¶šä¸­ã®ãƒ—ロセスを終了ã§ãã¾ã™ã€‚" - -#: storage/ipc/signalfuncs.c:279 -#, c-format -msgid "must be superuser to rotate log files with adminpack 1.0" -msgstr "adminpack 1.0 ã§ãƒ­ã‚°ãƒ•ァイルをローテートã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" - -#. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:281 utils/adt/genfile.c:250 -#, c-format -msgid "Consider using %s, which is part of core, instead." -msgstr "代ã‚りã«ã‚³ã‚¢ã®ä¸€éƒ¨ã§ã‚ã‚‹ %s ã®ä½¿ç”¨ã‚’検討ã—ã¦ãã ã•ã„。" - -#: storage/ipc/signalfuncs.c:287 storage/ipc/signalfuncs.c:307 +#: storage/ipc/signalfuncs.c:285 #, c-format msgid "rotation not possible because log collection not active" msgstr "ログåŽé›†ãŒæ´»å‹•ã—ã¦ã„ã¾ã›ã‚“ã®ã§ãƒ­ãƒ¼ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: storage/ipc/standby.c:330 +#: storage/ipc/standby.c:329 #, c-format msgid "recovery still waiting after %ld.%03d ms: %s" msgstr "リカãƒãƒªã¯%ld.%03dミリ秒経éŽå¾Œå¾…機継続中: %s" -#: storage/ipc/standby.c:339 +#: storage/ipc/standby.c:338 #, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "リカãƒãƒªã¯%ld.%03dミリ秒ã§å¾…機終了: %s" -#: storage/ipc/standby.c:921 tcop/postgres.c:3384 +#: storage/ipc/standby.c:920 tcop/postgres.c:3196 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "リカãƒãƒªã§ç«¶åˆãŒç™ºç”Ÿã—ãŸãŸã‚ステートメントをキャンセルã—ã¦ã„ã¾ã™" -#: storage/ipc/standby.c:922 tcop/postgres.c:2533 +#: storage/ipc/standby.c:921 tcop/postgres.c:2557 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "リカãƒãƒªæ™‚ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒãƒãƒƒãƒ•ã‚¡ã®ãƒ‡ãƒƒãƒ‰ãƒ­ãƒƒã‚¯ã‚’引ãèµ·ã“ã—ã¾ã—ãŸã€‚" -#: storage/ipc/standby.c:1488 +#: storage/ipc/standby.c:1486 msgid "unknown reason" msgstr "䏿˜Žãªç†ç”±" -#: storage/ipc/standby.c:1493 +#: storage/ipc/standby.c:1491 msgid "recovery conflict on buffer pin" msgstr "ãƒãƒƒãƒ•ァピンã«ã‚ˆã‚‹ãƒªã‚«ãƒãƒªç«¶åˆ" -#: storage/ipc/standby.c:1496 +#: storage/ipc/standby.c:1494 msgid "recovery conflict on lock" msgstr "ロック上ã®ãƒªã‚«ãƒãƒªè¡çª" -#: storage/ipc/standby.c:1499 +#: storage/ipc/standby.c:1497 msgid "recovery conflict on tablespace" msgstr "テーブル空間上ã®ãƒªã‚«ãƒãƒªè¡çª" -#: storage/ipc/standby.c:1502 +#: storage/ipc/standby.c:1500 msgid "recovery conflict on snapshot" msgstr "スナップショットã«ã‚ˆã‚‹ãƒªã‚«ãƒãƒªç«¶åˆ" -#: storage/ipc/standby.c:1505 +#: storage/ipc/standby.c:1503 msgid "recovery conflict on replication slot" msgstr "レプリケーションスロットã«å¯¾ã™ã‚‹ãƒªã‚«ãƒãƒªç«¶åˆ" -#: storage/ipc/standby.c:1508 +#: storage/ipc/standby.c:1506 msgid "recovery conflict on buffer deadlock" msgstr "ãƒãƒƒãƒ•ã‚¡ã®ãƒ‡ãƒƒãƒ‰ãƒ­ãƒƒã‚¯ã«ã‚ˆã‚‹ãƒªã‚«ãƒãƒªç«¶åˆ" -#: storage/ipc/standby.c:1511 +#: storage/ipc/standby.c:1509 msgid "recovery conflict on database" msgstr "データベース上ã®ãƒªã‚«ãƒãƒªè¡çª" -#: storage/large_object/inv_api.c:191 +#: storage/large_object/inv_api.c:190 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "OID%uã€ãƒšãƒ¼ã‚¸%dã«å¯¾å¿œã™ã‚‹pg_largeobjectã®ã‚¨ãƒ³ãƒˆãƒªã®ãƒ‡ãƒ¼ã‚¿ãƒ•ィールドã®å¤§ãã•%dã¯ä¸æ­£ã§ã™" -#: storage/large_object/inv_api.c:274 +#: storage/large_object/inv_api.c:272 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "ラージオブジェクトを開ããŸã‚ã®ãƒ•ラグãŒä¸æ­£ã§ã™: %d" -#: storage/large_object/inv_api.c:457 +#: storage/large_object/inv_api.c:297 storage/large_object/inv_api.c:309 storage/large_object/inv_api.c:506 storage/large_object/inv_api.c:617 storage/large_object/inv_api.c:807 +#, c-format +msgid "permission denied for large object %u" +msgstr "ラージオブジェクト %u ã«å¯¾ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" + +#: storage/large_object/inv_api.c:455 #, c-format msgid "invalid whence setting: %d" msgstr "䏿­£ãªwhence設定: %d" -#: storage/large_object/inv_api.c:629 +#: storage/large_object/inv_api.c:627 #, c-format msgid "invalid large object write request size: %d" msgstr "ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ›¸ã出ã—è¦æ±‚サイズãŒä¸æ­£ã§ã™: %d" -#: storage/lmgr/deadlock.c:1105 +#: storage/lmgr/deadlock.c:1104 #, c-format msgid "Process %d waits for %s on %s; blocked by process %d." msgstr "プロセス %d 㯠%s ã‚’ %s ã§å¾…機ã—ã¦ã„ã¾ã—ãŸãŒã€ãƒ—ロセス %d ã§ãƒ–ロックã•れã¾ã—ãŸ" -#: storage/lmgr/deadlock.c:1124 +#: storage/lmgr/deadlock.c:1123 #, c-format msgid "Process %d: %s" msgstr "プロセス %d: %s" -#: storage/lmgr/deadlock.c:1133 +#: storage/lmgr/deadlock.c:1132 #, c-format msgid "deadlock detected" msgstr "デッドロックを検出ã—ã¾ã—ãŸ" -#: storage/lmgr/deadlock.c:1136 +#: storage/lmgr/deadlock.c:1135 #, c-format msgid "See server log for query details." msgstr "å•ã„åˆã‚ã›ã®è©³ç´°ã¯ã‚µãƒ¼ãƒãƒ¼ãƒ­ã‚°ã‚’å‚ç…§ã—ã¦ãã ã•ã„" -#: storage/lmgr/lmgr.c:859 +#: storage/lmgr/lmgr.c:848 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"ã®ã‚¿ãƒ—ル(%1$u,%2$u)ã®æ›´æ–°ä¸­" -#: storage/lmgr/lmgr.c:862 +#: storage/lmgr/lmgr.c:851 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"ã®ã‚¿ãƒ—ル(%1$u,%2$u)ã®å‰Šé™¤ä¸­" -#: storage/lmgr/lmgr.c:865 +#: storage/lmgr/lmgr.c:854 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"ã®ã‚¿ãƒ—ル(%1$u,%2$u)ã®ãƒ­ãƒƒã‚¯ä¸­" -#: storage/lmgr/lmgr.c:868 +#: storage/lmgr/lmgr.c:857 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "リレーション\"%3$s\"ã®ã‚¿ãƒ—ãƒ«ã®æ›´æ–°å¾Œãƒãƒ¼ã‚¸ãƒ§ãƒ³(%1$u,%2$u)ã®ãƒ­ãƒƒã‚¯ä¸­" -#: storage/lmgr/lmgr.c:871 +#: storage/lmgr/lmgr.c:860 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚¿ãƒ—ル(%1$u,%2$u)ã®æŒ¿å…¥ä¸­" -#: storage/lmgr/lmgr.c:874 +#: storage/lmgr/lmgr.c:863 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"ã®ã‚¿ãƒ—ル(%1$u,%2$u)ã®ä¸€æ„性ã®ç¢ºèªä¸­" -#: storage/lmgr/lmgr.c:877 +#: storage/lmgr/lmgr.c:866 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"ã®æ›´æ–°ã•れãŸã‚¿ãƒ—ル(%1$u,%2$u)ã®å†ãƒã‚§ãƒƒã‚¯ä¸­" -#: storage/lmgr/lmgr.c:880 +#: storage/lmgr/lmgr.c:869 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"ã®ã‚¿ãƒ—ル(%1$u,%2$u)ã«å¯¾ã™ã‚‹æŽ’除制約ã®ãƒã‚§ãƒƒã‚¯ä¸­" -#: storage/lmgr/lmgr.c:1174 +#: storage/lmgr/lmgr.c:1239 #, c-format msgid "relation %u of database %u" msgstr "データベース%2$uã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³%1$u" -#: storage/lmgr/lmgr.c:1180 +#: storage/lmgr/lmgr.c:1245 #, c-format msgid "extension of relation %u of database %u" msgstr "データベース%2$uã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³%1$uã®æ‹¡å¼µ" -#: storage/lmgr/lmgr.c:1186 +#: storage/lmgr/lmgr.c:1251 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "データベース%uã®pg_database.datfrozenxid" -#: storage/lmgr/lmgr.c:1191 +#: storage/lmgr/lmgr.c:1256 #, c-format msgid "page %u of relation %u of database %u" msgstr "データベース%3$uã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³%2$uã®ãƒšãƒ¼ã‚¸%1$u" -#: storage/lmgr/lmgr.c:1198 +#: storage/lmgr/lmgr.c:1263 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "データベース%4$uã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³%3$uã®ã‚¿ãƒ—ル(%2$u,%1$u)" -#: storage/lmgr/lmgr.c:1206 +#: storage/lmgr/lmgr.c:1271 #, c-format msgid "transaction %u" msgstr "トランザクション %u" -#: storage/lmgr/lmgr.c:1211 +#: storage/lmgr/lmgr.c:1276 #, c-format msgid "virtual transaction %d/%u" msgstr "仮想トランザクション %d/%u" -#: storage/lmgr/lmgr.c:1217 +#: storage/lmgr/lmgr.c:1282 #, c-format msgid "speculative token %u of transaction %u" msgstr "トランザクション%2$uã®æŠ•æ©Ÿçš„æ›¸ãè¾¼ã¿ãƒˆãƒ¼ã‚¯ãƒ³%1$u" -#: storage/lmgr/lmgr.c:1223 +#: storage/lmgr/lmgr.c:1288 #, c-format msgid "object %u of class %u of database %u" msgstr "データベース%3$uã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³%2$uã®ã‚ªãƒ–ジェクト%1$u" -#: storage/lmgr/lmgr.c:1231 +#: storage/lmgr/lmgr.c:1296 #, c-format msgid "user lock [%u,%u,%u]" msgstr "ユーザーロック[%u,%u,%u]" -#: storage/lmgr/lmgr.c:1238 +#: storage/lmgr/lmgr.c:1303 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "アドãƒã‚¤ã‚¶ãƒªãƒ»ãƒ­ãƒƒã‚¯[%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1246 +#: storage/lmgr/lmgr.c:1311 #, c-format msgid "remote transaction %u of subscription %u of database %u" msgstr "データベース%3$uã®ã‚µãƒ–スクリプション%2$uã®ãƒªãƒ¢ãƒ¼ãƒˆãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³%1$u" -#: storage/lmgr/lmgr.c:1253 +#: storage/lmgr/lmgr.c:1318 #, c-format msgid "unrecognized locktag type %d" msgstr "ロックタグタイプ%dã¯ä¸æ˜Žã§ã™" -#: storage/lmgr/lock.c:803 +#: storage/lmgr/lock.c:812 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" msgstr "リカãƒãƒªã®å®Ÿè¡Œä¸­ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚ªãƒ–ジェクトã§ãƒ­ãƒƒã‚¯ãƒ¢ãƒ¼ãƒ‰ %s ã‚’ç²å¾—ã§ãã¾ã›ã‚“" -#: storage/lmgr/lock.c:805 +#: storage/lmgr/lock.c:814 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "リカãƒãƒªã®å®Ÿè¡Œä¸­ã¯ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚ªãƒ–ジェクト㧠RowExclusiveLock ã‚‚ã—ãã¯ãれ以下ã ã‘ãŒç²å¾—ã§ãã¾ã™" -#: storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 storage/lmgr/lock.c:2811 storage/lmgr/lock.c:4196 storage/lmgr/lock.c:4261 storage/lmgr/lock.c:4611 -#, c-format -msgid "You might need to increase max_locks_per_transaction." -msgstr "max_locks_per_transactionを増やã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“" - -#: storage/lmgr/lock.c:3259 storage/lmgr/lock.c:3327 storage/lmgr/lock.c:3443 +#: storage/lmgr/lock.c:3284 storage/lmgr/lock.c:3352 storage/lmgr/lock.c:3468 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" msgstr "åŒä¸€ã‚ªãƒ–ジェクト上ã«ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ¬ãƒ™ãƒ«ã¨ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãƒ¬ãƒ™ãƒ«ã®ãƒ­ãƒƒã‚¯ã®ä¸¡æ–¹ã‚’ä¿æŒã—ã¦ã„る時ã«PREPAREã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: storage/lmgr/predicate.c:649 +#: storage/lmgr/predicate.c:653 #, c-format msgid "not enough elements in RWConflictPool to record a read/write conflict" msgstr "RWConflictPoolã«èª­ã¿æ›¸ãç«¶åˆã‚’記録ã™ã‚‹ãŸã‚ã®è¦ç´ ãŒä¸è¶³ã—ã¦ã„ã¾ã™" -#: storage/lmgr/predicate.c:650 storage/lmgr/predicate.c:675 +#: storage/lmgr/predicate.c:654 storage/lmgr/predicate.c:679 #, c-format -msgid "You might need to run fewer transactions at a time or increase max_connections." -msgstr "トランザクションã®åŒæ™‚実行数を減らã™ã‹ max_connections を増やã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“" +msgid "You might need to run fewer transactions at a time or increase \"max_connections\"." +msgstr "トランザクションã®åŒæ™‚実行数を減らã™ã‹\"max_connections\"を増やã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: storage/lmgr/predicate.c:674 +#: storage/lmgr/predicate.c:678 #, c-format msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "RWConflictPoolã«èª­ã¿æ›¸ãç«¶åˆã®å¯èƒ½æ€§ã‚’記録ã™ã‚‹ãŸã‚ã®è¦ç´ ãŒä¸è¶³ã—ã¦ã„ã¾ã™" -#: storage/lmgr/predicate.c:1630 +#: storage/lmgr/predicate.c:1686 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "\"default_transaction_isolation\"ãŒ\"serializable\"ã«è¨­å®šã•れã¾ã—ãŸã€‚" -#: storage/lmgr/predicate.c:1631 +#: storage/lmgr/predicate.c:1687 #, c-format msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." msgstr "ã“ã®ãƒ‡ãƒ•ォルトを変更ã™ã‚‹ãŸã‚ã«ã¯\"SET default_transaction_isolation = 'repeatable read'\"を使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: storage/lmgr/predicate.c:1682 +#: storage/lmgr/predicate.c:1738 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "スナップショットをインãƒãƒ¼ãƒˆã™ã‚‹ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯READ ONLY DEFERRABLEã§ã¯ã„ã‘ã¾ã›ã‚“" -#: storage/lmgr/predicate.c:1761 utils/time/snapmgr.c:570 utils/time/snapmgr.c:576 +#: storage/lmgr/predicate.c:1817 utils/time/snapmgr.c:535 utils/time/snapmgr.c:541 #, c-format msgid "could not import the requested snapshot" msgstr "è¦æ±‚ã—ãŸã‚¹ãƒŠãƒƒãƒ—ショットをインãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: storage/lmgr/predicate.c:1762 utils/time/snapmgr.c:577 +#: storage/lmgr/predicate.c:1818 utils/time/snapmgr.c:542 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "PID%dã§ã‚ã‚‹ã‚½ãƒ¼ã‚¹ãƒ—ãƒ­ã‚»ã‚¹ã¯æ—¢ã«å®Ÿè¡Œä¸­ã§ã¯ã‚りã¾ã›ã‚“。" -#: storage/lmgr/predicate.c:2413 storage/lmgr/predicate.c:2428 storage/lmgr/predicate.c:3825 -#, c-format -msgid "You might need to increase max_pred_locks_per_transaction." -msgstr "max_pred_locks_per_transaction を増やã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“" - -#: storage/lmgr/predicate.c:3935 storage/lmgr/predicate.c:3971 storage/lmgr/predicate.c:4004 storage/lmgr/predicate.c:4012 storage/lmgr/predicate.c:4051 storage/lmgr/predicate.c:4281 storage/lmgr/predicate.c:4600 storage/lmgr/predicate.c:4612 storage/lmgr/predicate.c:4659 storage/lmgr/predicate.c:4695 +#: storage/lmgr/predicate.c:3991 storage/lmgr/predicate.c:4027 storage/lmgr/predicate.c:4060 storage/lmgr/predicate.c:4068 storage/lmgr/predicate.c:4107 storage/lmgr/predicate.c:4337 storage/lmgr/predicate.c:4656 storage/lmgr/predicate.c:4668 storage/lmgr/predicate.c:4715 storage/lmgr/predicate.c:4751 #, c-format msgid "could not serialize access due to read/write dependencies among transactions" msgstr "トランザクション間㧠read/write ã®ä¾å­˜æ€§ãŒã‚ã£ãŸãŸã‚ã€ã‚¢ã‚¯ã‚»ã‚¹ã®ç›´åˆ—化ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: storage/lmgr/predicate.c:3937 storage/lmgr/predicate.c:3973 storage/lmgr/predicate.c:4006 storage/lmgr/predicate.c:4014 storage/lmgr/predicate.c:4053 storage/lmgr/predicate.c:4283 storage/lmgr/predicate.c:4602 storage/lmgr/predicate.c:4614 storage/lmgr/predicate.c:4661 storage/lmgr/predicate.c:4697 +#: storage/lmgr/predicate.c:3993 storage/lmgr/predicate.c:4029 storage/lmgr/predicate.c:4062 storage/lmgr/predicate.c:4070 storage/lmgr/predicate.c:4109 storage/lmgr/predicate.c:4339 storage/lmgr/predicate.c:4658 storage/lmgr/predicate.c:4670 storage/lmgr/predicate.c:4717 storage/lmgr/predicate.c:4753 #, c-format msgid "The transaction might succeed if retried." msgstr "リトライãŒè¡Œã‚れãŸå ´åˆã€ã“ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯æˆåŠŸã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“" -#: storage/lmgr/proc.c:349 +#: storage/lmgr/proc.c:353 #, c-format -msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" -msgstr "è¦æ±‚ã•れãŸã‚¹ã‚¿ãƒ³ãƒã‚¤æŽ¥ç¶šãŒ max_wal_senders ã‚’è¶…ãˆã¦ã„ã¾ã™ï¼ˆç¾åœ¨ã¯ %d)" +msgid "number of requested standby connections exceeds \"max_wal_senders\" (currently %d)" +msgstr "è¦æ±‚ã•れãŸã‚¹ã‚¿ãƒ³ãƒã‚¤æŽ¥ç¶šãŒ\"max_wal_senders ã‚’è¶…ãˆã¦ã„ã¾ã™\" (ç¾åœ¨ã¯ %d)" -#: storage/lmgr/proc.c:1472 +#: storage/lmgr/proc.c:1546 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "プロセス%1$dã¯ã€%4$ld.%5$03d ms後ã«ã‚­ãƒ¥ãƒ¼ã®é †ç•ªã‚’å†èª¿æ•´ã™ã‚‹ã“ã¨ã§ã€%3$s上ã®%2$sã«å¯¾ã™ã‚‹ãƒ‡ãƒƒãƒ‰ãƒ­ãƒƒã‚¯ã‚’防ãŽã¾ã—ãŸã€‚" -#: storage/lmgr/proc.c:1487 +#: storage/lmgr/proc.c:1561 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "プロセス%1$dã¯ã€%3$s上ã®%2$sã«å¯¾ã—%4$ld.%5$03d ms待機ã™ã‚‹ãƒ‡ãƒƒãƒ‰ãƒ­ãƒƒã‚¯ã‚’検知ã—ã¾ã—ãŸ" -#: storage/lmgr/proc.c:1496 +#: storage/lmgr/proc.c:1570 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "プロセス%dã¯%sã‚’%sã§å¾…機ã—ã¦ã„ã¾ã™ã€‚%ld.%03dミリ秒後" -#: storage/lmgr/proc.c:1503 +#: storage/lmgr/proc.c:1577 +#, c-format +msgid "process %d acquired %s on %s after %ld.%03d ms" +msgstr "プロセス%1$dã¯%4$ld.%5$03d ms後ã«%3$s上ã®%2$sã‚’ç²å¾—ã—ã¾ã—ãŸ" + +#: storage/lmgr/proc.c:1594 +#, c-format +msgid "process %d failed to acquire %s on %s after %ld.%03d ms" +msgstr "プロセス%1$dã¯%4$ld.%5$03d ms後ã«%3$s上ã§%2$sã‚’ç²å¾—ã™ã‚‹ã“ã¨ã«å¤±æ•—ã—ã¾ã—ãŸ" + +#: storage/page/bufpage.c:152 +#, c-format +msgid "page verification failed, calculated checksum %u but expected %u" +msgstr "ページ検証ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚計算ã•れãŸãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯%uã§ã™ãŒæƒ³å®šã¯%uã§ã™" + +#: storage/page/bufpage.c:217 storage/page/bufpage.c:730 storage/page/bufpage.c:1073 storage/page/bufpage.c:1208 storage/page/bufpage.c:1314 storage/page/bufpage.c:1426 +#, c-format +msgid "corrupted page pointers: lower = %u, upper = %u, special = %u" +msgstr "ページãƒã‚¤ãƒ³ã‚¿ãŒç ´æã—ã¦ã„ã¾ã™: lower = %u, upper = %u, special = %u\"" + +#: storage/page/bufpage.c:759 +#, c-format +msgid "corrupted line pointer: %u" +msgstr "ラインãƒã‚¤ãƒ³ã‚¿ãŒç ´æã—ã¦ã„ã¾ã™: %u" + +#: storage/page/bufpage.c:789 storage/page/bufpage.c:1266 +#, c-format +msgid "corrupted item lengths: total %u, available space %u" +msgstr "アイテム長ãŒç ´æã—ã¦ã„ã¾ã™: åˆè¨ˆ %u 利用å¯èƒ½ç©ºé–“ %u" + +#: storage/page/bufpage.c:1092 storage/page/bufpage.c:1233 storage/page/bufpage.c:1330 storage/page/bufpage.c:1442 +#, c-format +msgid "corrupted line pointer: offset = %u, size = %u" +msgstr "ラインãƒã‚¤ãƒ³ã‚¿ãŒç ´æã—ã¦ã„ã¾ã™: オフセット = %u サイズ = %u" + +#: storage/smgr/md.c:485 storage/smgr/md.c:547 +#, c-format +msgid "cannot extend file \"%s\" beyond %u blocks" +msgstr "ファイル\"%s\"ã‚’%uãƒ–ãƒ­ãƒƒã‚¯ä»¥ä¸Šã«æ‹¡å¼µã§ãã¾ã›ã‚“" + +#: storage/smgr/md.c:500 storage/smgr/md.c:611 +#, c-format +msgid "could not extend file \"%s\": %m" +msgstr "ファイル\"%s\"ã‚’æ‹¡å¼µã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: storage/smgr/md.c:506 +#, c-format +msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" +msgstr "ファイル\"%1$s\"ã‚’æ‹¡å¼µã§ãã¾ã›ã‚“ã§ã—ãŸ: %4$uブロックã§%3$dãƒã‚¤ãƒˆä¸­%2$dãƒã‚¤ãƒˆåˆ†ã®ã¿ã‚’書ã出ã—ã¾ã—ãŸã€‚" + +#: storage/smgr/md.c:589 +#, c-format +msgid "could not extend file \"%s\" with FileFallocate(): %m" +msgstr "ファイル\"%s\"ã‚’FileFallocate()ã§æ‹¡å¼µã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: storage/smgr/md.c:869 +#, c-format +msgid "could not read blocks %u..%u in file \"%s\": %m" +msgstr "ファイル\"%3$s\"ã§ãƒ–ロック範囲 %1$u...%2$u を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %3$m" + +#: storage/smgr/md.c:895 +#, c-format +msgid "could not read blocks %u..%u in file \"%s\": read only %zu of %zu bytes" +msgstr "ファイル\"%3$s\"ã§ãƒ–ロック範囲 %1$u...%2$u を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %5$zuãƒã‚¤ãƒˆä¸­%4$zuãƒã‚¤ãƒˆåˆ†ã®ã¿èª­ã¿è¾¼ã¿ã¾ã—ãŸ" + +#: storage/smgr/md.c:995 +#, c-format +msgid "could not write blocks %u..%u in file \"%s\": %m" +msgstr "ファイル\"%3$s\"ã§ãƒ–ロック範囲 %1$u...%2$u を書ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$m" + +#: storage/smgr/md.c:1165 +#, c-format +msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" +msgstr "ファイル\"%s\"ã‚’%uブロックã«åˆ‡ã‚Šè©°ã‚られã¾ã›ã‚“ã§ã—ãŸ: ç¾åœ¨ã¯%uブロックã®ã¿ã¨ãªã‚Šã¾ã—ãŸ" + +#: storage/smgr/md.c:1220 +#, c-format +msgid "could not truncate file \"%s\" to %u blocks: %m" +msgstr "ファイル\"%s\"ã‚’%uブロックã«åˆ‡ã‚Šè©°ã‚られã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: storage/smgr/md.c:1700 +#, c-format +msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" +msgstr "ファイル\"%s\"(対象ブロック%u)をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: ç›´å‰ã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã¯%uブロックã ã‘ã§ã—ãŸ" + +#: storage/smgr/md.c:1714 +#, c-format +msgid "could not open file \"%s\" (target block %u): %m" +msgstr "ファイル \"%s\"(対象ブロック %u)をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: tcop/backend_startup.c:85 +#, c-format +msgid "SSL configuration could not be loaded in child process" +msgstr "SSLæ§‹æˆã¯å­ãƒ—ロセスã§ã¯èª­ã¿è¾¼ã‚ã¾ã›ã‚“" + +#: tcop/backend_startup.c:208 +#, c-format +msgid "connection received: host=%s port=%s" +msgstr "接続をå—ã‘付ã‘ã¾ã—ãŸ: ホスト=%s ãƒãƒ¼ãƒˆç•ªå·=%s" + +#: tcop/backend_startup.c:213 +#, c-format +msgid "connection received: host=%s" +msgstr "接続をå—ã‘付ã‘ã¾ã—ãŸ: ホスト=%s" + +#: tcop/backend_startup.c:277 +#, c-format +msgid "the database system is starting up" +msgstr "データベースシステムã¯èµ·å‹•処ç†ä¸­ã§ã™" + +#: tcop/backend_startup.c:283 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "データベースシステムã¯ã¾ã æŽ¥ç¶šã‚’å—ã‘付ã‘ã¦ã„ã¾ã›ã‚“" + +#: tcop/backend_startup.c:284 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "リカãƒãƒªã®ä¸€è²«æ€§ã¯ã¾ã ç¢ºä¿ã•れã¦ã„ã¾ã›ã‚“。" + +#: tcop/backend_startup.c:288 +#, c-format +msgid "the database system is not accepting connections" +msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã¯æŽ¥ç¶šã‚’å—ã‘付ã‘ã¦ã„ã¾ã›ã‚“" + +#: tcop/backend_startup.c:289 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "ホットスタンãƒã‚¤ãƒ¢ãƒ¼ãƒ‰ã¯ç„¡åйã§ã™ã€‚" + +#: tcop/backend_startup.c:294 +#, c-format +msgid "the database system is shutting down" +msgstr "データベースシステムã¯ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã—ã¦ã„ã¾ã™" + +#: tcop/backend_startup.c:299 #, c-format -msgid "process %d acquired %s on %s after %ld.%03d ms" -msgstr "プロセス%1$dã¯%4$ld.%5$03d ms後ã«%3$s上ã®%2$sã‚’ç²å¾—ã—ã¾ã—ãŸ" +msgid "the database system is in recovery mode" +msgstr "データベースシステムã¯ãƒªã‚«ãƒãƒªãƒ¢ãƒ¼ãƒ‰ã§ã™" -#: storage/lmgr/proc.c:1520 +#: tcop/backend_startup.c:414 #, c-format -msgid "process %d failed to acquire %s on %s after %ld.%03d ms" -msgstr "プロセス%1$dã¯%4$ld.%5$03d ms後ã«%3$s上ã§%2$sã‚’ç²å¾—ã™ã‚‹ã“ã¨ã«å¤±æ•—ã—ã¾ã—ãŸ" +msgid "received direct SSL connection request without ALPN protocol negotiation extension" +msgstr "ALPNプロトコルãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³æ‹¡å¼µã‚’æŒãŸãªã„直接SSLæŽ¥ç¶šè¦æ±‚ã‚’å—ä¿¡ã—ã¾ã—ãŸ" -#: storage/page/bufpage.c:152 +#: tcop/backend_startup.c:420 #, c-format -msgid "page verification failed, calculated checksum %u but expected %u" -msgstr "ページ検証ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚計算ã•れãŸãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯%uã§ã™ãŒæƒ³å®šã¯%uã§ã™" +msgid "direct SSL connection accepted" +msgstr "直接SSL接続をå—ã‘付ã‘られã¾ã—ãŸ" -#: storage/page/bufpage.c:217 storage/page/bufpage.c:730 storage/page/bufpage.c:1073 storage/page/bufpage.c:1208 storage/page/bufpage.c:1314 storage/page/bufpage.c:1426 +#: tcop/backend_startup.c:430 #, c-format -msgid "corrupted page pointers: lower = %u, upper = %u, special = %u" -msgstr "ページãƒã‚¤ãƒ³ã‚¿ãŒç ´æã—ã¦ã„ã¾ã™: lower = %u, upper = %u, special = %u\"" +msgid "direct SSL connection rejected" +msgstr "直接SSLæŽ¥ç¶šãŒæ‹’å¦ã•れã¾ã—ãŸ" -#: storage/page/bufpage.c:759 +#: tcop/backend_startup.c:489 tcop/backend_startup.c:517 #, c-format -msgid "corrupted line pointer: %u" -msgstr "ラインãƒã‚¤ãƒ³ã‚¿ãŒç ´æã—ã¦ã„ã¾ã™: %u" +msgid "incomplete startup packet" +msgstr "開始パケットãŒä¸å®Œå…¨ã§ã™" -#: storage/page/bufpage.c:789 storage/page/bufpage.c:1266 +#: tcop/backend_startup.c:501 tcop/backend_startup.c:538 #, c-format -msgid "corrupted item lengths: total %u, available space %u" -msgstr "アイテム長ãŒç ´æã—ã¦ã„ã¾ã™: åˆè¨ˆ %u 利用å¯èƒ½ç©ºé–“ %u" +msgid "invalid length of startup packet" +msgstr "䏿­£ãªé–‹å§‹ãƒ‘ケット長" -#: storage/page/bufpage.c:1092 storage/page/bufpage.c:1233 storage/page/bufpage.c:1330 storage/page/bufpage.c:1442 +#: tcop/backend_startup.c:573 #, c-format -msgid "corrupted line pointer: offset = %u, size = %u" -msgstr "ラインãƒã‚¤ãƒ³ã‚¿ãŒç ´æã—ã¦ã„ã¾ã™: オフセット = %u サイズ = %u" +msgid "SSLRequest accepted" +msgstr "SSLRequestã‚’å—ã‘付ã‘ã¾ã—ãŸ" -#: storage/smgr/md.c:484 storage/smgr/md.c:546 +#: tcop/backend_startup.c:576 #, c-format -msgid "cannot extend file \"%s\" beyond %u blocks" -msgstr "ファイル\"%s\"ã‚’%uãƒ–ãƒ­ãƒƒã‚¯ä»¥ä¸Šã«æ‹¡å¼µã§ãã¾ã›ã‚“" +msgid "SSLRequest rejected" +msgstr "SSLRequestã‚’æ‹’å¦ã—ã¾ã—ãŸ" -#: storage/smgr/md.c:499 storage/smgr/md.c:610 +#: tcop/backend_startup.c:585 #, c-format -msgid "could not extend file \"%s\": %m" -msgstr "ファイル\"%s\"ã‚’æ‹¡å¼µã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" +msgid "failed to send SSL negotiation response: %m" +msgstr "SSLãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³å¿œç­”ã®é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: storage/smgr/md.c:505 +#: tcop/backend_startup.c:603 #, c-format -msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" -msgstr "ファイル\"%1$s\"ã‚’æ‹¡å¼µã§ãã¾ã›ã‚“ã§ã—ãŸ: %4$uブロックã§%3$dãƒã‚¤ãƒˆä¸­%2$dãƒã‚¤ãƒˆåˆ†ã®ã¿ã‚’書ã出ã—ã¾ã—ãŸã€‚" +msgid "received unencrypted data after SSL request" +msgstr "SSLè¦æ±‚ã®å¾Œã«éžæš—å·åŒ–データをå—ä¿¡ã—ã¾ã—ãŸ" -#: storage/smgr/md.c:588 +#: tcop/backend_startup.c:604 tcop/backend_startup.c:658 #, c-format -msgid "could not extend file \"%s\" with FileFallocate(): %m" -msgstr "ファイル\"%s\"ã‚’FileFallocate()ã§æ‹¡å¼µã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" +msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." +msgstr "ã“れã¯ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚½ãƒ•トウェアã®ãƒã‚°ã§ã‚ã‚‹ã‹ã€man-in-the-middle攻撃ã®è¨¼å·¦ã§ã‚ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" -#: storage/smgr/md.c:779 +#: tcop/backend_startup.c:627 #, c-format -msgid "could not read block %u in file \"%s\": %m" -msgstr "ファイル\"%2$s\"ã§%1$uブロックを読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %3$m" +msgid "GSSENCRequest accepted" +msgstr "GSSENCRequestã‚’å—ã‘付ã‘ã¾ã—ãŸ" -#: storage/smgr/md.c:795 +#: tcop/backend_startup.c:630 #, c-format -msgid "could not read block %u in file \"%s\": read only %d of %d bytes" -msgstr "ファイル\"%2$s\"ã®ãƒ–ロック%1$uを読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %4$dãƒã‚¤ãƒˆä¸­%3$dãƒã‚¤ãƒˆåˆ†ã®ã¿èª­ã¿è¾¼ã¿ã¾ã—ãŸ" +msgid "GSSENCRequest rejected" +msgstr "GSSENCRequestã‚’æ‹’å¦ã—ã¾ã—ãŸ" -#: storage/smgr/md.c:853 +#: tcop/backend_startup.c:639 #, c-format -msgid "could not write block %u in file \"%s\": %m" -msgstr "ファイル\"%2$s\"ã§%1$uãƒ–ãƒ­ãƒƒã‚¯ãŒæ›¸ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %3$m" +msgid "failed to send GSSAPI negotiation response: %m" +msgstr "GSSAPIãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³å¿œç­”ã®é€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: storage/smgr/md.c:858 +#: tcop/backend_startup.c:657 #, c-format -msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" -msgstr "ファイル\"%2$s\"ã®ãƒ–ロック%1$uを書ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %4$dãƒã‚¤ãƒˆä¸­%3$dãƒã‚¤ãƒˆåˆ†ã®ã¿æ›¸ãè¾¼ã¿ã¾ã—ãŸ" +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "GSSAPIæš—å·åŒ–リクエストã®å¾Œã«éžæš—å·åŒ–データをå—ä¿¡" -#: storage/smgr/md.c:1009 +#: tcop/backend_startup.c:681 #, c-format -msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" -msgstr "ファイル\"%s\"ã‚’%uブロックã«åˆ‡ã‚Šè©°ã‚られã¾ã›ã‚“ã§ã—ãŸ: ç¾åœ¨ã¯%uブロックã®ã¿ã¨ãªã‚Šã¾ã—ãŸ" +msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" +msgstr "フロントエンドプロトコル%u.%uをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“: サーãƒãƒ¼ã¯%u.0ã‹ã‚‰ %u.%uã¾ã§ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™" -#: storage/smgr/md.c:1064 +#: tcop/backend_startup.c:744 #, c-format -msgid "could not truncate file \"%s\" to %u blocks: %m" -msgstr "ファイル\"%s\"ã‚’%uブロックã«åˆ‡ã‚Šè©°ã‚られã¾ã›ã‚“ã§ã—ãŸ: %m" +msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." +msgstr "有効ãªå€¤: \"false\", 0, \"true\", 1, \"database\"。" -#: storage/smgr/md.c:1491 +#: tcop/backend_startup.c:785 #, c-format -msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" -msgstr "ファイル\"%s\"(対象ブロック%u)をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: ç›´å‰ã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã¯%uブロックã ã‘ã§ã—ãŸ" +msgid "invalid startup packet layout: expected terminator as last byte" +msgstr "開始パケットã®é…ç½®ãŒä¸æ­£ã§ã™: 最終ãƒã‚¤ãƒˆã¯ã‚¿ãƒ¼ãƒŸãƒãƒ¼ã‚¿ã§ã‚ã‚‹ã¯ãšã§ã™" -#: storage/smgr/md.c:1505 +#: tcop/backend_startup.c:802 #, c-format -msgid "could not open file \"%s\" (target block %u): %m" -msgstr "ファイル \"%s\"(対象ブロック %u)をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" +msgid "no PostgreSQL user name specified in startup packet" +msgstr "é–‹å§‹ãƒ‘ã‚±ãƒƒãƒˆã§æŒ‡å®šã•れãŸPostgreSQLユーザーåã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: tcop/fastpath.c:142 utils/fmgr/fmgr.c:2132 +#: tcop/fastpath.c:142 utils/fmgr/fmgr.c:2161 #, c-format msgid "function with OID %u does not exist" msgstr "OID %uã®é–¢æ•°ã¯å­˜åœ¨ã—ã¾ã›ã‚“" @@ -22038,7 +22967,7 @@ msgstr "関数\"%s\"ã¯é«˜é€Ÿå‘¼ã³å‡ºã—インタフェースã§ã®å‘¼ã³å‡ºã— msgid "fastpath function call: \"%s\" (OID %u)" msgstr "è¿‘é“関数呼ã³å‡ºã—: \"%s\"(OID %u))" -#: tcop/fastpath.c:313 tcop/postgres.c:1365 tcop/postgres.c:1601 tcop/postgres.c:2059 tcop/postgres.c:2309 +#: tcop/fastpath.c:313 tcop/postgres.c:1369 tcop/postgres.c:1605 tcop/postgres.c:2071 tcop/postgres.c:2333 #, c-format msgid "duration: %s ms" msgstr "期間: %s ミリ秒" @@ -22068,155 +22997,155 @@ msgstr "関数呼ã³å‡ºã—メッセージ内ã®å¼•数サイズ%dãŒä¸æ­£ã§ã™" msgid "incorrect binary data format in function argument %d" msgstr "関数引数%dã®ãƒã‚¤ãƒŠãƒªãƒ‡ãƒ¼ã‚¿æ›¸å¼ãŒä¸æ­£ã§ã™" -#: tcop/postgres.c:463 tcop/postgres.c:4877 +#: tcop/postgres.c:467 tcop/postgres.c:5012 #, c-format msgid "invalid frontend message type %d" msgstr "フロントエンドメッセージタイプ%dãŒä¸æ­£ã§ã™" -#: tcop/postgres.c:1072 +#: tcop/postgres.c:1076 #, c-format msgid "statement: %s" msgstr "æ–‡: %s" -#: tcop/postgres.c:1370 +#: tcop/postgres.c:1374 #, c-format msgid "duration: %s ms statement: %s" msgstr "期間: %s ミリ秒 æ–‡: %s" -#: tcop/postgres.c:1476 +#: tcop/postgres.c:1480 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "準備ã•ã‚ŒãŸæ–‡ã«è¤‡æ•°ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’挿入ã§ãã¾ã›ã‚“" -#: tcop/postgres.c:1606 +#: tcop/postgres.c:1610 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "期間: %s ミリ秒 パース%s : %s" -#: tcop/postgres.c:1672 tcop/postgres.c:2629 +#: tcop/postgres.c:1677 tcop/postgres.c:2653 #, c-format msgid "unnamed prepared statement does not exist" msgstr "ç„¡åã®æº–å‚™ã•ã‚ŒãŸæ–‡ãŒå­˜åœ¨ã—ã¾ã›ã‚“" -#: tcop/postgres.c:1713 +#: tcop/postgres.c:1729 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "ãƒã‚¤ãƒ³ãƒ‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯%dパラメータ書å¼ã‚りã¾ã—ãŸãŒãƒ‘ラメータã¯%dã§ã—ãŸ" -#: tcop/postgres.c:1719 +#: tcop/postgres.c:1735 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "ãƒã‚¤ãƒ³ãƒ‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯%dパラメータをæä¾›ã—ã¾ã—ãŸãŒã€æº–å‚™ã•ã‚ŒãŸæ–‡\"%s\"ã§ã¯%då¿…è¦ã§ã—ãŸ" -#: tcop/postgres.c:1937 +#: tcop/postgres.c:1949 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "ãƒã‚¤ãƒ³ãƒ‰ãƒ‘ラメータ%dã«ãŠã„ã¦ãƒã‚¤ãƒŠãƒªãƒ‡ãƒ¼ã‚¿æ›¸å¼ãŒä¸æ­£ã§ã™" -#: tcop/postgres.c:2064 +#: tcop/postgres.c:2076 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "期間: %s ミリ秒 ãƒã‚¤ãƒ³ãƒ‰ %s%s%s: %s" -#: tcop/postgres.c:2118 tcop/postgres.c:2712 +#: tcop/postgres.c:2131 tcop/postgres.c:2735 #, c-format msgid "portal \"%s\" does not exist" msgstr "ãƒãƒ¼ã‚¿ãƒ«\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: tcop/postgres.c:2189 +#: tcop/postgres.c:2213 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2191 tcop/postgres.c:2317 +#: tcop/postgres.c:2215 tcop/postgres.c:2341 msgid "execute fetch from" msgstr "å–り出ã—実行" -#: tcop/postgres.c:2192 tcop/postgres.c:2318 +#: tcop/postgres.c:2216 tcop/postgres.c:2342 msgid "execute" msgstr "実行" -#: tcop/postgres.c:2314 +#: tcop/postgres.c:2338 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "期間: %s ミリ秒 %s %s%s%s: %s" -#: tcop/postgres.c:2462 +#: tcop/postgres.c:2486 #, c-format msgid "prepare: %s" msgstr "準備: %s" -#: tcop/postgres.c:2487 +#: tcop/postgres.c:2511 #, c-format -msgid "parameters: %s" +msgid "Parameters: %s" msgstr "パラメータ: %s" -#: tcop/postgres.c:2502 +#: tcop/postgres.c:2526 #, c-format -msgid "abort reason: recovery conflict" -msgstr "異常終了ã®ç†ç”±: リカãƒãƒªãŒè¡çªã—ãŸãŸã‚" +msgid "Abort reason: recovery conflict" +msgstr "異常終了ã®ç†ç”±: リカãƒãƒªè¡çª" -#: tcop/postgres.c:2518 +#: tcop/postgres.c:2542 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "ユーザーãŒå…±æœ‰ãƒãƒƒãƒ•ァ・ピンを長ãä¿æŒã—éŽãŽã¦ã„ã¾ã—ãŸ" -#: tcop/postgres.c:2521 +#: tcop/postgres.c:2545 #, c-format msgid "User was holding a relation lock for too long." msgstr "ユーザーリレーションã®ãƒ­ãƒƒã‚¯ã‚’é•·ãä¿æŒã—éŽãŽã¦ã„ã¾ã—ãŸ" -#: tcop/postgres.c:2524 +#: tcop/postgres.c:2548 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "削除ã•れるã¹ãテーブルスペースをユーザーãŒä½¿ã£ã¦ã„ã¾ã—ãŸï¼ˆã‚‚ã—ãã¯ãã®å¯èƒ½æ€§ãŒã‚りã¾ã—ãŸï¼‰ã€‚" -#: tcop/postgres.c:2527 +#: tcop/postgres.c:2551 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "削除ã•れるã¹ããƒãƒ¼ã‚¸ãƒ§ãƒ³ã®è¡Œã‚’ユーザーå•ã„åˆã‚ã›ãŒå‚ç…§ã—ãªã‘れã°ãªã‚‰ãªã‹ã£ãŸå¯èƒ½æ€§ãŒã‚りã¾ã—ãŸã€‚" -#: tcop/postgres.c:2530 +#: tcop/postgres.c:2554 #, c-format -msgid "User was using a logical slot that must be invalidated." -msgstr "無効化ã•れるã¹ãè«–ç†ã‚¹ãƒ­ãƒƒãƒˆã‚’ユーザーãŒä½¿ç”¨ã—ã¦ã„ã¾ã—ãŸã€‚" +msgid "User was using a logical replication slot that must be invalidated." +msgstr "無効化ã•れるã¹ãè«–ç†ãƒ¬ãƒ—リケーションスロットをユーザーãŒä½¿ç”¨ã—ã¦ã„ã¾ã—ãŸã€‚" -#: tcop/postgres.c:2536 +#: tcop/postgres.c:2560 #, c-format msgid "User was connected to a database that must be dropped." msgstr "削除ã•れるã¹ãデータベースã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒæŽ¥ç¶šã—ã¦ã„ã¾ã—ãŸã€‚" -#: tcop/postgres.c:2575 +#: tcop/postgres.c:2599 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "ãƒãƒ¼ã‚¿ãƒ«\"%s\" パラメータ$%d = %s" -#: tcop/postgres.c:2578 +#: tcop/postgres.c:2602 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "ãƒãƒ¼ã‚¿ãƒ«\"%s\" パラメータ $%d" -#: tcop/postgres.c:2584 +#: tcop/postgres.c:2608 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "ç„¡åãƒãƒ¼ã‚¿ãƒ«ãƒ‘ラメータ $%d = %s" -#: tcop/postgres.c:2587 +#: tcop/postgres.c:2611 #, c-format msgid "unnamed portal parameter $%d" msgstr "ç„¡åãƒãƒ¼ã‚¿ãƒ«ãƒ‘ラメータ $%d" -#: tcop/postgres.c:2932 +#: tcop/postgres.c:2955 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "予期ã—ãªã„SIGQUITシグナルã«ã‚ˆã‚Šã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’終了ã—ã¾ã™" -#: tcop/postgres.c:2938 +#: tcop/postgres.c:2961 #, c-format msgid "terminating connection because of crash of another server process" msgstr "ä»–ã®ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスãŒã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ãŸãŸã‚接続を終了ã—ã¾ã™" -#: tcop/postgres.c:2939 +#: tcop/postgres.c:2962 #, c-format msgid "The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory." msgstr "" @@ -22224,162 +23153,167 @@ msgstr "" "postmasterã¯ã“ã®ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスã«å¯¾ã—ã€ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’ロールãƒãƒƒã‚¯\n" "ã—終了ã™ã‚‹ã‚ˆã†æŒ‡ç¤ºã—ã¾ã—ãŸã€‚" -#: tcop/postgres.c:2943 tcop/postgres.c:3310 +#: tcop/postgres.c:2966 tcop/postgres.c:3219 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "ã“ã®å¾Œã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«å†æŽ¥ç¶šã—ã€ã‚³ãƒžãƒ³ãƒ‰ã‚’繰り返ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: tcop/postgres.c:2950 +#: tcop/postgres.c:2973 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "峿™‚シャットダウンコマンドã«ã‚ˆã‚Šã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’終了ã—ã¾ã™" -#: tcop/postgres.c:3036 +#: tcop/postgres.c:3051 #, c-format msgid "floating-point exception" msgstr "æµ®å‹•å°æ•°ç‚¹ä¾‹å¤–" -#: tcop/postgres.c:3037 +#: tcop/postgres.c:3052 #, c-format msgid "An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero." msgstr "䏿­£ãªæµ®å‹•å°æ•°ç‚¹æ¼”ç®—ãŒã‚·ã‚°ãƒŠãƒ«ã•れã¾ã—ãŸã€‚ãŠãらãã“れã¯ã€ç¯„囲外ã®çµæžœã‚‚ã—ãã¯0除算ã®ã‚ˆã†ãªä¸æ­£ãªæ¼”ç®—ã«ã‚ˆã‚‹ã‚‚ã®ã§ã™ã€‚" -#: tcop/postgres.c:3214 +#: tcop/postgres.c:3217 +#, c-format +msgid "terminating connection due to conflict with recovery" +msgstr "リカãƒãƒªã§ç«¶åˆãŒç™ºç”Ÿã—ãŸãŸã‚ã€æŽ¥ç¶šã‚’çµ‚äº†ã—ã¦ã„ã¾ã™" + +#: tcop/postgres.c:3289 #, c-format msgid "canceling authentication due to timeout" msgstr "タイムアウトã«ã‚ˆã‚Šèªè¨¼å‡¦ç†ã‚’キャンセルã—ã¦ã„ã¾ã™" -#: tcop/postgres.c:3218 +#: tcop/postgres.c:3293 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "管ç†è€…コマンドã«ã‚ˆã‚Šè‡ªå‹•VACUUM処ç†ã‚’終了ã—ã¦ã„ã¾ã™" -#: tcop/postgres.c:3222 +#: tcop/postgres.c:3297 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "管ç†è€…コマンドã«ã‚ˆã‚Šã€è«–ç†ãƒ¬ãƒ—リケーションワーカーを終了ã—ã¾ã™" -#: tcop/postgres.c:3239 tcop/postgres.c:3249 tcop/postgres.c:3308 -#, c-format -msgid "terminating connection due to conflict with recovery" -msgstr "リカãƒãƒªã§ç«¶åˆãŒç™ºç”Ÿã—ãŸãŸã‚ã€æŽ¥ç¶šã‚’çµ‚äº†ã—ã¦ã„ã¾ã™" - -#: tcop/postgres.c:3260 +#: tcop/postgres.c:3317 #, c-format msgid "terminating connection due to administrator command" msgstr "管ç†è€…コマンドã«ã‚ˆã‚ŠæŽ¥ç¶šã‚’çµ‚äº†ã—ã¦ã„ã¾ã™" -#: tcop/postgres.c:3291 +#: tcop/postgres.c:3348 #, c-format msgid "connection to client lost" msgstr "クライアントã¸ã®æŽ¥ç¶šãŒåˆ‡ã‚Œã¾ã—ãŸã€‚" -#: tcop/postgres.c:3361 +#: tcop/postgres.c:3400 #, c-format msgid "canceling statement due to lock timeout" msgstr "ロックã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã®ãŸã‚ステートメントをキャンセルã—ã¦ã„ã¾ã™" -#: tcop/postgres.c:3368 +#: tcop/postgres.c:3407 #, c-format msgid "canceling statement due to statement timeout" msgstr "ステートメントã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã®ãŸã‚ステートメントをキャンセルã—ã¦ã„ã¾ã™" -#: tcop/postgres.c:3375 +#: tcop/postgres.c:3414 #, c-format msgid "canceling autovacuum task" msgstr "自動VACUUM処ç†ã‚’キャンセルã—ã¦ã„ã¾ã™" -#: tcop/postgres.c:3398 +#: tcop/postgres.c:3427 #, c-format msgid "canceling statement due to user request" msgstr "ユーザーã‹ã‚‰ã®è¦æ±‚ã«ã‚ˆã‚Šæ–‡ã‚’キャンセルã—ã¦ã„ã¾ã™" -#: tcop/postgres.c:3412 +#: tcop/postgres.c:3448 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "トランザクション中アイドルタイムアウトã®ãŸã‚接続を終了ã—ã¾ã™" -#: tcop/postgres.c:3423 +#: tcop/postgres.c:3461 +#, c-format +msgid "terminating connection due to transaction timeout" +msgstr "トランザクションタイムアウトã®ãŸã‚接続を終了ã—ã¾ã™" + +#: tcop/postgres.c:3474 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "アイドルセッションタイムアウトã«ã‚ˆã‚ŠæŽ¥ç¶šã‚’çµ‚äº†ã—ã¾ã™" -#: tcop/postgres.c:3514 +#: tcop/postgres.c:3564 #, c-format msgid "stack depth limit exceeded" msgstr "スタック長制é™ã‚’è¶Šãˆã¾ã—ãŸ" -#: tcop/postgres.c:3515 +#: tcop/postgres.c:3565 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." -msgstr "ãŠä½¿ã„ã®ãƒ—ラットフォームã«ãŠã‘るスタック長ã®åˆ¶é™ã«é©åˆã™ã‚‹ã“ã¨ã‚’確èªå¾Œã€è¨­å®šãƒ‘ラメータ \"max_stack_depth\"(ç¾åœ¨ %dkB)を増やã—ã¦ãã ã•ã„。" +msgstr "プラットフォームã®ã‚¹ã‚¿ãƒƒã‚¯é•·åˆ¶é™ãŒé©åˆ‡ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ãŸå¾Œã«ã€è¨­å®šãƒ‘ラメータ\"max_stack_depth\" (ç¾åœ¨ %dkB)を増やã—ã¦ãã ã•ã„。" -#: tcop/postgres.c:3562 +#: tcop/postgres.c:3612 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "\"max_stack_depth\"ã¯%ldkBã‚’è¶Šãˆã¦ã¯ãªã‚Šã¾ã›ã‚“。" -#: tcop/postgres.c:3564 +#: tcop/postgres.c:3614 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "プラットフォームã®ã‚¹ã‚¿ãƒƒã‚¯é•·åˆ¶é™ã‚’\"ulimit -s\"ã¾ãŸã¯åŒç­‰ã®æ©Ÿèƒ½ã‚’使用ã—ã¦å¢—加ã—ã¦ãã ã•ã„" -#: tcop/postgres.c:3587 +#: tcop/postgres.c:3637 #, c-format -msgid "client_connection_check_interval must be set to 0 on this platform." -msgstr "ã“ã®ãƒ—ラットフォームã§ã¯client_connection_check_intervalã‚’0ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" +msgid "\"client_connection_check_interval\" must be set to 0 on this platform." +msgstr "ã“ã®ãƒ—ラットフォームã§ã¯\"client_connection_check_interval\"ã‚’0ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: tcop/postgres.c:3608 +#: tcop/postgres.c:3658 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "\"log_statement_stats\"ãŒçœŸã®å ´åˆã€ãƒ‘ラメータを有効ã«ã§ãã¾ã›ã‚“" -#: tcop/postgres.c:3623 +#: tcop/postgres.c:3673 #, c-format msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." -msgstr "\"log_parser_stats\"ã€\"log_planner_stats\"ã€\"log_executor_stats\"ã®ã„ãšã‚Œã‹ãŒçœŸã®å ´åˆã¯\"log_statement_stats\"を有効ã«ã§ãã¾ã›ã‚“" +msgstr "\"log_parser_stats\"ã€\"log_planner_stats\"ã€ã¾ãŸã¯\"log_executor_stats\"ã®ã„ãšã‚Œã‹ãŒtrueã®å ´åˆã¯\"log_statement_stats\"を有効ã«ã§ãã¾ã›ã‚“。" -#: tcop/postgres.c:3971 +#: tcop/postgres.c:4098 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "サーãƒãƒ¼ãƒ—ロセスã«å¯¾ã™ã‚‹ä¸æ­£ãªã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³å¼•æ•°: %s" -#: tcop/postgres.c:3972 tcop/postgres.c:3978 +#: tcop/postgres.c:4099 tcop/postgres.c:4105 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" -#: tcop/postgres.c:3976 +#: tcop/postgres.c:4103 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: 䏿­£ãªã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³å¼•æ•°: %s" -#: tcop/postgres.c:4029 +#: tcop/postgres.c:4156 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: データベースåもユーザーåも指定ã•れã¦ã„ã¾ã›ã‚“" -#: tcop/postgres.c:4774 +#: tcop/postgres.c:4909 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "䏿­£ãªCLOSEメッセージã®ã‚µãƒ–タイプ%d" -#: tcop/postgres.c:4811 +#: tcop/postgres.c:4946 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "䏿­£ãªDESCRIBEメッセージã®ã‚µãƒ–タイプ%d" -#: tcop/postgres.c:4898 +#: tcop/postgres.c:5033 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "レプリケーション接続ã§ã¯é«˜é€Ÿé–¢æ•°å‘¼ã³å‡ºã—ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: tcop/postgres.c:4902 +#: tcop/postgres.c:5037 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "レプリケーション接続ã§ã¯æ‹¡å¼µå•ã„åˆã‚ã›ãƒ—ロトコルã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: tcop/postgres.c:5082 +#: tcop/postgres.c:5217 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "接続を切断: セッション時間: %d:%02d:%02d.%03d ユーザー=%s データベース=%s ホスト=%s%s%s" @@ -22389,52 +23323,53 @@ msgstr "接続を切断: セッション時間: %d:%02d:%02d.%03d ユーザー=% msgid "bind message has %d result formats but query has %d columns" msgstr "ãƒã‚¤ãƒ³ãƒ‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯%dã®çµæžœæ›¸å¼ãŒã‚りã¾ã—ãŸãŒã€å•ã„åˆã‚ã›ã¯%d列ã§ã—ãŸ" -#: tcop/pquery.c:944 tcop/pquery.c:1701 +#: tcop/pquery.c:942 tcop/pquery.c:1696 #, c-format msgid "cursor can only scan forward" msgstr "カーゾルã¯å‰æ–¹ã¸ã®ã‚¹ã‚­ãƒ£ãƒ³ã—ã‹ã§ãã¾ã›ã‚“" -#: tcop/pquery.c:945 tcop/pquery.c:1702 +#: tcop/pquery.c:943 tcop/pquery.c:1697 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "後方スキャンを有効ã«ã™ã‚‹ãŸã‚ã«ã¯SCROLLオプションを付ã‘ã¦å®£è¨€ã—ã¦ãã ã•ã„。" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:417 +#: tcop/utility.c:410 #, c-format msgid "cannot execute %s in a read-only transaction" msgstr "リードオンリーã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ %s を実行ã§ãã¾ã›ã‚“" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:435 +#: tcop/utility.c:428 #, c-format msgid "cannot execute %s during a parallel operation" msgstr "並列処ç†ä¸­ã¯%sを実行ã§ãã¾ã›ã‚“" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:454 +#: tcop/utility.c:447 #, c-format msgid "cannot execute %s during recovery" msgstr "リカãƒãƒªä¸­ã¯ %s を実行ã§ãã¾ã›ã‚“" #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:472 +#: tcop/utility.c:465 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼åˆ¶é™æ“作ã®ä¸­ã§ã¯ %s を実行ã§ãã¾ã›ã‚“" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:828 +#: tcop/utility.c:821 #, c-format msgid "cannot execute %s within a background process" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ—ロセス内ã§%sを実行ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: tcop/utility.c:953 +#. translator: %s is name of a SQL command, eg CHECKPOINT +#: tcop/utility.c:947 #, c-format msgid "permission denied to execute %s command" msgstr "%sコマンドを実行ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: tcop/utility.c:955 +#: tcop/utility.c:949 #, c-format msgid "Only roles with privileges of the \"%s\" role may execute this command." msgstr "\"%s\"ãƒ­ãƒ¼ãƒ«ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã§ãã¾ã™ã€‚" @@ -22559,72 +23494,72 @@ msgstr "èªè­˜ã§ããªã„シソーラスパラメータ \"%s\"" msgid "missing Dictionary parameter" msgstr "DictionaryパラメータãŒã‚りã¾ã›ã‚“" -#: tsearch/spell.c:381 tsearch/spell.c:398 tsearch/spell.c:407 tsearch/spell.c:1043 +#: tsearch/spell.c:382 tsearch/spell.c:399 tsearch/spell.c:408 tsearch/spell.c:1045 #, c-format msgid "invalid affix flag \"%s\"" msgstr "䏿­£ãªæŽ¥è¾žãƒ•ラグ\"%s\"" -#: tsearch/spell.c:385 tsearch/spell.c:1047 +#: tsearch/spell.c:386 tsearch/spell.c:1049 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "接辞フラグ\"%s\"ã¯ç¯„囲外ã§ã™" -#: tsearch/spell.c:415 +#: tsearch/spell.c:416 #, c-format msgid "invalid character in affix flag \"%s\"" msgstr "接辞フラグ中ã®ä¸æ­£ãªæ–‡å­—\"%s\"" -#: tsearch/spell.c:435 +#: tsearch/spell.c:436 #, c-format msgid "invalid affix flag \"%s\" with \"long\" flag value" msgstr "\"long\"フラグ値を伴ã£ãŸä¸æ­£ãªæŽ¥è¾žãƒ•ラグ\"%s\"" -#: tsearch/spell.c:525 +#: tsearch/spell.c:526 #, c-format msgid "could not open dictionary file \"%s\": %m" msgstr "辞書ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: tsearch/spell.c:1170 tsearch/spell.c:1182 tsearch/spell.c:1742 tsearch/spell.c:1747 tsearch/spell.c:1752 +#: tsearch/spell.c:1173 tsearch/spell.c:1185 tsearch/spell.c:1746 tsearch/spell.c:1751 tsearch/spell.c:1756 #, c-format msgid "invalid affix alias \"%s\"" msgstr "䏿­£ãªæŽ¥è¾žã®åˆ¥å \"%s\"" -#: tsearch/spell.c:1223 tsearch/spell.c:1294 tsearch/spell.c:1443 +#: tsearch/spell.c:1226 tsearch/spell.c:1297 tsearch/spell.c:1446 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "affixファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: tsearch/spell.c:1277 +#: tsearch/spell.c:1280 #, c-format msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" msgstr "Ispell辞書ã¯ãƒ•ラグ値\"default\"ã€\"long\"ãŠã‚ˆã³\"num\"ã®ã¿ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™" -#: tsearch/spell.c:1321 +#: tsearch/spell.c:1324 #, c-format msgid "invalid number of flag vector aliases" msgstr "䏿­£ãªæ•°ã®ãƒ•ラグベクタã®åˆ¥å" -#: tsearch/spell.c:1344 +#: tsearch/spell.c:1347 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "別åã®æ•°ãŒæŒ‡å®šã•ã‚ŒãŸæ•° %d ã‚’è¶…ãˆã¦ã„ã¾ã™" -#: tsearch/spell.c:1559 +#: tsearch/spell.c:1562 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "æŽ¥è¾žãƒ•ã‚¡ã‚¤ãƒ«ãŒæ–°æ—§ä¸¡æ–¹ã®å½¢å¼ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’å«ã‚“ã§ã„ã¾ã™" -#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:278 utils/adt/tsvector_op.c:1128 +#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:274 utils/adt/tsvector_op.c:1126 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "TSベクターã®ãŸã‚ã®æ–‡å­—列ãŒé•·ã™ãŽã¾ã™(%dãƒã‚¤ãƒˆã€æœ€å¤§ã¯%dãƒã‚¤ãƒˆ)" -#: tsearch/ts_locale.c:238 +#: tsearch/ts_locale.c:236 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "設定ファイル\"%2$s\"ã®%1$d行目: \"%3$s\"" -#: tsearch/ts_locale.c:317 +#: tsearch/ts_locale.c:315 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "wchar_tã‹ã‚‰ã‚µãƒ¼ãƒãƒ¼ç¬¦å·åŒ–æ–¹å¼ã¸ã®å¤‰æ›ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" @@ -22649,72 +23584,67 @@ msgstr "テキスト検索設定ファイルåã¯%sã¯ä¸æ­£ã§ã™" msgid "could not open stop-word file \"%s\": %m" msgstr "ストップワードファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: tsearch/wparser.c:308 tsearch/wparser.c:396 tsearch/wparser.c:473 +#: tsearch/wparser.c:306 tsearch/wparser.c:394 tsearch/wparser.c:471 #, c-format msgid "text search parser does not support headline creation" msgstr "テキスト検索パーサã¯è¦‹å‡ºã—作æˆã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: tsearch/wparser_def.c:2648 +#: tsearch/wparser_def.c:2664 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "èªè­˜ã§ããªã„見出ã—パラメータ: \"%s\"" -#: tsearch/wparser_def.c:2658 -#, c-format -msgid "MinWords should be less than MaxWords" -msgstr "MinWordsã¯MaxWordsよりå°ã•ããªã‘れã°ãªã‚Šã¾ã›ã‚“" - -#: tsearch/wparser_def.c:2662 +#: tsearch/wparser_def.c:2674 #, c-format -msgid "MinWords should be positive" -msgstr "MinWordsã¯æ­£ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" +msgid "%s must be less than %s" +msgstr "\"%s\"ã¯\"%s\"よりå°ã•ããªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: tsearch/wparser_def.c:2666 +#: tsearch/wparser_def.c:2678 #, c-format -msgid "ShortWord should be >= 0" -msgstr "ShortWordã¯>= 0ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" +msgid "%s must be positive" +msgstr "%sã¯æ­£æ•°ã§ãªã‘れã°ãªã‚Šã¾sã‚“" -#: tsearch/wparser_def.c:2670 +#: tsearch/wparser_def.c:2682 tsearch/wparser_def.c:2686 #, c-format -msgid "MaxFragments should be >= 0" -msgstr "MaxFragments 㯠0 以上ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" +msgid "%s must be >= 0" +msgstr "%sã¯0以上ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/activity/pgstat.c:438 +#: utils/activity/pgstat.c:435 #, c-format msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "永続統計情報ファイル\"%s\"ã‚’unlinkã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/activity/pgstat.c:1252 +#: utils/activity/pgstat.c:1255 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "䏿­£ãªçµ±è¨ˆæƒ…報種別: \"%s\"" -#: utils/activity/pgstat.c:1332 +#: utils/activity/pgstat.c:1335 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/activity/pgstat.c:1444 +#: utils/activity/pgstat.c:1455 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"ã«æ›¸ãè¾¼ã¿ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/activity/pgstat.c:1453 +#: utils/activity/pgstat.c:1464 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/activity/pgstat.c:1461 +#: utils/activity/pgstat.c:1472 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/activity/pgstat.c:1510 +#: utils/activity/pgstat.c:1521 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "統計情報ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/activity/pgstat.c:1672 +#: utils/activity/pgstat.c:1683 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "統計情報ファイル\"%s\"ãŒç ´æã—ã¦ã„ã¾ã™" @@ -22724,112 +23654,122 @@ msgstr "統計情報ファイル\"%s\"ãŒç ´æã—ã¦ã„ã¾ã™" msgid "function call to dropped function" msgstr "削除ã•れãŸé–¢æ•°ã®å‘¼ã³å‡ºã—" -#: utils/activity/pgstat_xact.c:363 +#: utils/activity/pgstat_xact.c:362 #, c-format msgid "resetting existing statistics for kind %s, db=%u, oid=%u" msgstr "種類%sã€db=%uã€oid=%uã®æ—¢å­˜çµ±è¨ˆæƒ…報をリセットã—ã¾ã™" -#: utils/adt/acl.c:177 utils/adt/name.c:93 +#: utils/activity/wait_event.c:207 utils/activity/wait_event.c:232 +#, c-format +msgid "wait event \"%s\" already exists in type \"%s\"" +msgstr "待機イベント\"%s\"ã¯å¾…機イベントタイプ\"%s\"内ã«ã™ã§ã«å­˜åœ¨ã—ã¾ã™" + +#: utils/activity/wait_event.c:246 +#, c-format +msgid "too many custom wait events" +msgstr "ç‹¬è‡ªå¾…æ©Ÿã‚¤ãƒ™ãƒ³ãƒˆã®æ•°ãŒå¤šã™ãŽã¾ã™" + +#: utils/adt/acl.c:183 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "識別å­ãŒé•·ã™ãŽã¾ã™" -#: utils/adt/acl.c:178 utils/adt/name.c:94 +#: utils/adt/acl.c:184 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "識別å­ã¯%d文字より短ããªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/acl.c:266 +#: utils/adt/acl.c:272 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "キーワードãŒä¸æ˜Žã§ã™: \"%s\"" -#: utils/adt/acl.c:267 +#: utils/adt/acl.c:273 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "ACLキーワードã¯\"group\"ã¾ãŸã¯\"user\"ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/acl.c:275 +#: utils/adt/acl.c:281 #, c-format msgid "missing name" msgstr "åå‰ãŒã‚りã¾ã›ã‚“" -#: utils/adt/acl.c:276 +#: utils/adt/acl.c:282 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "\"group\"ã¾ãŸã¯\"user\"キーワードã®å¾Œã«ã¯åå‰ãŒå¿…è¦ã§ã™ã€‚" -#: utils/adt/acl.c:282 +#: utils/adt/acl.c:288 #, c-format msgid "missing \"=\" sign" msgstr "\"=\"記å·ãŒã‚りã¾ã›ã‚“" -#: utils/adt/acl.c:344 +#: utils/adt/acl.c:350 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "䏿­£ãªãƒ¢ãƒ¼ãƒ‰æ–‡å­—: \"%s\"ã®ä¸€ã¤ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/acl.c:374 +#: utils/adt/acl.c:380 #, c-format msgid "a name must follow the \"/\" sign" msgstr "\"/\"記å·ã®å¾Œã«ã¯åå‰ãŒå¿…è¦ã§ã™" -#: utils/adt/acl.c:386 +#: utils/adt/acl.c:392 #, c-format msgid "defaulting grantor to user ID %u" msgstr "権é™ä»˜ä¸Žè€…をデフォルトã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ID %uã«ã—ã¦ã„ã¾ã™" -#: utils/adt/acl.c:572 +#: utils/adt/acl.c:578 #, c-format msgid "ACL array contains wrong data type" msgstr "ACLé…列ã«ä¸æ­£ãªãƒ‡ãƒ¼ã‚¿åž‹ãŒã‚りã¾ã™ã€‚" -#: utils/adt/acl.c:576 +#: utils/adt/acl.c:582 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "ACLé…列ã¯1次元ã®é…列ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/acl.c:580 +#: utils/adt/acl.c:586 #, c-format msgid "ACL arrays must not contain null values" msgstr "ACLé…列ã«ã¯NULL値をå«ã‚ã¦ã¯ã„ã‘ã¾ã›ã‚“" -#: utils/adt/acl.c:609 +#: utils/adt/acl.c:615 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "ACL指定ã®å¾Œã«ä½™è¨ˆãªã”ã¿ãŒã‚りã¾ã™" -#: utils/adt/acl.c:1251 +#: utils/adt/acl.c:1263 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "グラントオプションã§ãã®æ¨©é™ä»˜ä¸Žè€…ã«æ¨©é™ã‚’付与ã—è¿”ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/acl.c:1567 +#: utils/adt/acl.c:1579 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsertã¯ã‚‚ã†ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/acl.c:1577 +#: utils/adt/acl.c:1589 #, c-format msgid "aclremove is no longer supported" msgstr "aclremoveã¯ã‚‚ã†ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/acl.c:1697 +#: utils/adt/acl.c:1709 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "権é™ã‚¿ã‚¤ãƒ—ãŒä¸æ˜Žã§ã™: \"%s\"" -#: utils/adt/acl.c:3484 utils/adt/regproc.c:100 utils/adt/regproc.c:265 +#: utils/adt/acl.c:3550 utils/adt/regproc.c:100 utils/adt/regproc.c:265 #, c-format msgid "function \"%s\" does not exist" msgstr "関数\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: utils/adt/acl.c:5031 +#: utils/adt/acl.c:5196 #, c-format msgid "must be able to SET ROLE \"%s\"" msgstr "SET ROLE\"%s\"ãŒã§ããªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/array_userfuncs.c:102 utils/adt/array_userfuncs.c:489 utils/adt/array_userfuncs.c:878 utils/adt/json.c:694 utils/adt/json.c:831 utils/adt/json.c:869 utils/adt/jsonb.c:1139 utils/adt/jsonb.c:1211 utils/adt/jsonb.c:1629 utils/adt/jsonb.c:1817 utils/adt/jsonb.c:1827 +#: utils/adt/array_userfuncs.c:102 utils/adt/array_userfuncs.c:489 utils/adt/array_userfuncs.c:866 utils/adt/json.c:602 utils/adt/json.c:740 utils/adt/json.c:790 utils/adt/jsonb.c:1025 utils/adt/jsonb.c:1098 utils/adt/jsonb.c:1530 utils/adt/jsonb.c:1718 utils/adt/jsonb.c:1728 #, c-format msgid "could not determine input data type" msgstr "入力データ型を特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" @@ -22839,8 +23779,8 @@ msgstr "入力データ型を特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" msgid "input data type is not an array" msgstr "入力データ型ã¯é…列ã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/array_userfuncs.c:151 utils/adt/array_userfuncs.c:203 utils/adt/float.c:1228 utils/adt/float.c:1302 utils/adt/float.c:4117 utils/adt/float.c:4155 utils/adt/int.c:778 utils/adt/int.c:800 utils/adt/int.c:814 utils/adt/int.c:828 utils/adt/int.c:859 utils/adt/int.c:880 utils/adt/int.c:997 utils/adt/int.c:1011 utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 utils/adt/int.c:1263 -#: utils/adt/int.c:1331 utils/adt/int.c:1337 utils/adt/int8.c:1257 utils/adt/numeric.c:1901 utils/adt/numeric.c:4388 utils/adt/rangetypes.c:1481 utils/adt/rangetypes.c:1494 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1132 utils/adt/varlena.c:3134 +#: utils/adt/array_userfuncs.c:151 utils/adt/array_userfuncs.c:203 utils/adt/float.c:1222 utils/adt/float.c:1296 utils/adt/float.c:4022 utils/adt/float.c:4060 utils/adt/int.c:778 utils/adt/int.c:800 utils/adt/int.c:814 utils/adt/int.c:828 utils/adt/int.c:859 utils/adt/int.c:880 utils/adt/int.c:997 utils/adt/int.c:1011 utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 utils/adt/int.c:1263 +#: utils/adt/int.c:1331 utils/adt/int.c:1337 utils/adt/int8.c:1256 utils/adt/numeric.c:1917 utils/adt/numeric.c:4454 utils/adt/rangetypes.c:1488 utils/adt/rangetypes.c:1501 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1135 utils/adt/varlena.c:3137 #, c-format msgid "integer out of range" msgstr "integerã®ç¯„囲外ã§ã™" @@ -22875,238 +23815,252 @@ msgstr "ç•°ãªã‚‹è¦ç´ æ¬¡æ•°ã®é…列ã®é€£çµã«ã¯äº’æ›æ€§ãŒã‚りã¾ã›ã‚“ msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "ç•°ãªã‚‹æ¬¡æ•°ã®é…列ã®é€£çµã«ã¯äº’æ›æ€§ãŒã‚りã¾ã›ã‚“。" -#: utils/adt/array_userfuncs.c:987 utils/adt/array_userfuncs.c:995 utils/adt/arrayfuncs.c:5590 utils/adt/arrayfuncs.c:5596 +#: utils/adt/array_userfuncs.c:975 utils/adt/array_userfuncs.c:983 utils/adt/arrayfuncs.c:5616 utils/adt/arrayfuncs.c:5622 #, c-format msgid "cannot accumulate arrays of different dimensionality" msgstr "次元ã®ç•°ãªã‚‹é…列ã¯çµåˆã§ãã¾ã›ã‚“" -#: utils/adt/array_userfuncs.c:1286 utils/adt/array_userfuncs.c:1440 +#: utils/adt/array_userfuncs.c:1272 utils/adt/array_userfuncs.c:1426 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "多次元é…列内ã®è¦ç´ ã®æ¤œç´¢ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: utils/adt/array_userfuncs.c:1315 +#: utils/adt/array_userfuncs.c:1301 #, c-format msgid "initial position must not be null" msgstr "åˆæœŸä½ç½®nullã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: utils/adt/array_userfuncs.c:1688 +#: utils/adt/array_userfuncs.c:1674 #, c-format msgid "sample size must be between 0 and %d" msgstr "サンプルã®å¤§ãã•ã¯0ã¨%dã®é–“ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:273 utils/adt/arrayfuncs.c:287 utils/adt/arrayfuncs.c:298 utils/adt/arrayfuncs.c:320 utils/adt/arrayfuncs.c:337 utils/adt/arrayfuncs.c:351 utils/adt/arrayfuncs.c:359 utils/adt/arrayfuncs.c:366 utils/adt/arrayfuncs.c:506 utils/adt/arrayfuncs.c:521 utils/adt/arrayfuncs.c:532 utils/adt/arrayfuncs.c:547 utils/adt/arrayfuncs.c:568 utils/adt/arrayfuncs.c:598 utils/adt/arrayfuncs.c:605 utils/adt/arrayfuncs.c:613 utils/adt/arrayfuncs.c:647 -#: utils/adt/arrayfuncs.c:670 utils/adt/arrayfuncs.c:690 utils/adt/arrayfuncs.c:807 utils/adt/arrayfuncs.c:816 utils/adt/arrayfuncs.c:846 utils/adt/arrayfuncs.c:861 utils/adt/arrayfuncs.c:914 +#: utils/adt/arrayfuncs.c:264 utils/adt/arrayfuncs.c:273 utils/adt/arrayfuncs.c:284 utils/adt/arrayfuncs.c:307 utils/adt/arrayfuncs.c:440 utils/adt/arrayfuncs.c:454 utils/adt/arrayfuncs.c:466 utils/adt/arrayfuncs.c:636 utils/adt/arrayfuncs.c:668 utils/adt/arrayfuncs.c:703 utils/adt/arrayfuncs.c:718 utils/adt/arrayfuncs.c:777 utils/adt/arrayfuncs.c:782 utils/adt/arrayfuncs.c:870 utils/adt/arrayfuncs.c:897 utils/adt/arrayfuncs.c:904 utils/adt/arrayfuncs.c:941 #, c-format msgid "malformed array literal: \"%s\"" msgstr "é…åˆ—ãƒªãƒ†ãƒ©ãƒ«ã®æ›¸å¼ãŒèª¤ã£ã¦ã„ã¾ã™: \"%s\"" -#: utils/adt/arrayfuncs.c:274 -#, c-format -msgid "\"[\" must introduce explicitly-specified array dimensions." -msgstr "\"[\"ã¯é…åˆ—æ¬¡å…ƒã®æ˜Žç¤ºçš„ãªæŒ‡å®šã®å…ˆé ­ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" - -#: utils/adt/arrayfuncs.c:288 +#: utils/adt/arrayfuncs.c:265 #, c-format -msgid "Missing array dimension value." -msgstr "é…åˆ—ã®æ¬¡å…ƒæ•°ã®å€¤ãŒã‚りã¾ã›ã‚“。" +msgid "Array value must start with \"{\" or dimension information." +msgstr "é…列値ã¯\"{\"ã¾ãŸã¯æ¬¡å…ƒæƒ…å ±ã‹ã‚‰å§‹ã¾ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: utils/adt/arrayfuncs.c:299 utils/adt/arrayfuncs.c:338 +#: utils/adt/arrayfuncs.c:274 utils/adt/arrayfuncs.c:467 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "é…åˆ—ã®æ¬¡å…ƒã®å¾Œã«\"%s\"ãŒã‚りã¾ã›ã‚“。" -#: utils/adt/arrayfuncs.c:308 utils/adt/arrayfuncs.c:2933 utils/adt/arrayfuncs.c:2965 utils/adt/arrayfuncs.c:2980 +#: utils/adt/arrayfuncs.c:285 #, c-format -msgid "upper bound cannot be less than lower bound" -msgstr "上é™ã‚’下é™ã‚ˆã‚Šå°ã•ãã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" +msgid "Array contents must start with \"{\"." +msgstr "é…列ã®å†…容ã¯\"{\"ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: utils/adt/arrayfuncs.c:321 +#: utils/adt/arrayfuncs.c:308 utils/adt/multirangetypes.c:292 #, c-format -msgid "Array value must start with \"{\" or dimension information." -msgstr "é…列値ã¯\"{\"ã¾ãŸã¯æ¬¡å…ƒæƒ…å ±ã‹ã‚‰å§‹ã¾ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" +msgid "Junk after closing right brace." +msgstr "å³å¤§æ‹¬å¼§ã®å¾Œã«ã”ã¿ãŒã‚りã¾ã™ã€‚" -#: utils/adt/arrayfuncs.c:352 +#: utils/adt/arrayfuncs.c:431 utils/adt/arrayfuncs.c:643 #, c-format -msgid "Array contents must start with \"{\"." -msgstr "é…列ã®å†…容ã¯\"{\"ã§å§‹ã¾ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "é…åˆ—ã®æ¬¡å…ƒæ•°ãŒåˆ¶é™å€¤(%d)ã‚’è¶…ãˆã¦ã„ã¾ã™" -#: utils/adt/arrayfuncs.c:360 utils/adt/arrayfuncs.c:367 +#: utils/adt/arrayfuncs.c:441 #, c-format -msgid "Specified array dimensions do not match array contents." -msgstr "指定ã•れãŸé…åˆ—ã®æ¬¡å…ƒæ•°ãŒé…列ã®å†…容ã¨åˆè‡´ã—ã¦ã„ã¾ã›ã‚“。" +msgid "\"[\" must introduce explicitly-specified array dimensions." +msgstr "\"[\"ã¯é…åˆ—æ¬¡å…ƒã®æ˜Žç¤ºçš„ãªæŒ‡å®šã®å…ˆé ­ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: utils/adt/arrayfuncs.c:507 utils/adt/arrayfuncs.c:533 utils/adt/multirangetypes.c:166 utils/adt/rangetypes.c:2405 utils/adt/rangetypes.c:2413 utils/adt/rowtypes.c:219 utils/adt/rowtypes.c:230 +#: utils/adt/arrayfuncs.c:455 #, c-format -msgid "Unexpected end of input." -msgstr "想定外ã®å…¥åŠ›ã®çµ‚端。" +msgid "Missing array dimension value." +msgstr "é…åˆ—ã®æ¬¡å…ƒæ•°ã®å€¤ãŒã‚りã¾ã›ã‚“。" + +#: utils/adt/arrayfuncs.c:481 utils/adt/arrayfuncs.c:2940 utils/adt/arrayfuncs.c:2985 utils/adt/arrayfuncs.c:3000 +#, c-format +msgid "upper bound cannot be less than lower bound" +msgstr "上é™ã‚’下é™ã‚ˆã‚Šå°ã•ãã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:522 utils/adt/arrayfuncs.c:569 utils/adt/arrayfuncs.c:599 utils/adt/arrayfuncs.c:648 +#: utils/adt/arrayfuncs.c:487 +#, c-format +msgid "array upper bound is too large: %d" +msgstr "é…列ã®ä¸Šç•ŒãŒå¤§ãã™ãŽã¾ã™: %d" + +#: utils/adt/arrayfuncs.c:538 +#, c-format +msgid "array bound is out of integer range" +msgstr "é…列ã®ä¸Šä¸‹é™å€¤ãŒæ•´æ•°ã®ç¯„囲を超ãˆã¦ã„ã¾ã™" + +#: utils/adt/arrayfuncs.c:637 utils/adt/arrayfuncs.c:669 utils/adt/arrayfuncs.c:704 utils/adt/arrayfuncs.c:898 #, c-format msgid "Unexpected \"%c\" character." msgstr "æƒ³å®šå¤–ã®æ–‡å­—\"%c\"。" -#: utils/adt/arrayfuncs.c:548 utils/adt/arrayfuncs.c:671 +#: utils/adt/arrayfuncs.c:719 #, c-format msgid "Unexpected array element." msgstr "想定外ã®é…列è¦ç´ ã€‚" -#: utils/adt/arrayfuncs.c:606 +#: utils/adt/arrayfuncs.c:778 #, c-format -msgid "Unmatched \"%c\" character." -msgstr "対応ã—ãªã„\"%c\"文字。" +msgid "Specified array dimensions do not match array contents." +msgstr "指定ã•れãŸé…åˆ—ã®æ¬¡å…ƒæ•°ãŒé…列ã®å†…容ã¨åˆè‡´ã—ã¦ã„ã¾ã›ã‚“。" -#: utils/adt/arrayfuncs.c:614 utils/adt/jsonfuncs.c:2553 +#: utils/adt/arrayfuncs.c:783 utils/adt/jsonfuncs.c:2598 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "多次元é…列ã¯åˆè‡´ã™ã‚‹æ¬¡å…ƒã®å‰¯é…列をæŒãŸãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/arrayfuncs.c:691 utils/adt/multirangetypes.c:293 +#: utils/adt/arrayfuncs.c:871 utils/adt/arrayfuncs.c:905 #, c-format -msgid "Junk after closing right brace." -msgstr "å³å¤§æ‹¬å¼§ã®å¾Œã«ã”ã¿ãŒã‚りã¾ã™ã€‚" +msgid "Incorrectly quoted array element." +msgstr "é…列è¦ç´ ãŒæ­£ã—ãクォートã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:1325 utils/adt/arrayfuncs.c:3479 utils/adt/arrayfuncs.c:6080 +#: utils/adt/arrayfuncs.c:942 utils/adt/multirangetypes.c:165 utils/adt/rangetypes.c:2464 utils/adt/rangetypes.c:2472 utils/adt/rowtypes.c:218 utils/adt/rowtypes.c:229 +#, c-format +msgid "Unexpected end of input." +msgstr "想定外ã®å…¥åŠ›ã®çµ‚端。" + +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 utils/adt/arrayfuncs.c:6108 #, c-format msgid "invalid number of dimensions: %d" msgstr "䏿­£ãªæ¬¡å…ƒæ•°: %d" -#: utils/adt/arrayfuncs.c:1336 +#: utils/adt/arrayfuncs.c:1312 #, c-format msgid "invalid array flags" msgstr "䏿­£ãªé…列フラグ" -#: utils/adt/arrayfuncs.c:1358 +#: utils/adt/arrayfuncs.c:1334 #, c-format msgid "binary data has array element type %u (%s) instead of expected %u (%s)" msgstr "ãƒã‚¤ãƒŠãƒªãƒ‡ãƒ¼ã‚¿ä¸­ã«æœŸå¾…ã•れる型%3$u(%4$s)ã®ä»£ã‚りã«%1$u(%2$s)ãŒã‚りã¾ã—ãŸ" -#: utils/adt/arrayfuncs.c:1402 utils/adt/multirangetypes.c:451 utils/adt/rangetypes.c:344 utils/cache/lsyscache.c:2916 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:450 utils/adt/rangetypes.c:351 utils/cache/lsyscache.c:2958 #, c-format msgid "no binary input function available for type %s" msgstr "åž‹%sã«ã¯ãƒã‚¤ãƒŠãƒªå…¥åŠ›é–¢æ•°ãŒã‚りã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:1542 +#: utils/adt/arrayfuncs.c:1509 #, c-format msgid "improper binary format in array element %d" msgstr "é…列è¦ç´ %dã®ãƒã‚¤ãƒŠãƒªæ›¸å¼ãŒä¸é©åˆ‡ã§ã™" -#: utils/adt/arrayfuncs.c:1623 utils/adt/multirangetypes.c:456 utils/adt/rangetypes.c:349 utils/cache/lsyscache.c:2949 +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:2991 #, c-format msgid "no binary output function available for type %s" msgstr "åž‹%sã«ã¯ãƒã‚¤ãƒŠãƒªå‡ºåŠ›é–¢æ•°ãŒã‚りã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:2102 +#: utils/adt/arrayfuncs.c:2067 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "固定長é…列ã®éƒ¨åˆ†é…列ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:2280 utils/adt/arrayfuncs.c:2302 utils/adt/arrayfuncs.c:2351 utils/adt/arrayfuncs.c:2589 utils/adt/arrayfuncs.c:2911 utils/adt/arrayfuncs.c:6066 utils/adt/arrayfuncs.c:6092 utils/adt/arrayfuncs.c:6103 utils/adt/json.c:1497 utils/adt/json.c:1569 utils/adt/jsonb.c:1416 utils/adt/jsonb.c:1500 utils/adt/jsonfuncs.c:4434 utils/adt/jsonfuncs.c:4587 utils/adt/jsonfuncs.c:4698 utils/adt/jsonfuncs.c:4746 +#: utils/adt/arrayfuncs.c:2245 utils/adt/arrayfuncs.c:2267 utils/adt/arrayfuncs.c:2316 utils/adt/arrayfuncs.c:2570 utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6094 utils/adt/arrayfuncs.c:6120 utils/adt/arrayfuncs.c:6131 utils/adt/json.c:1433 utils/adt/json.c:1505 utils/adt/jsonb.c:1317 utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4710 utils/adt/jsonfuncs.c:4863 utils/adt/jsonfuncs.c:4974 utils/adt/jsonfuncs.c:5022 #, c-format msgid "wrong number of array subscripts" msgstr "é…åˆ—ã®æ·»ãˆå­—ãŒä¸æ­£ãªæ•°å€¤ã§ã™" -#: utils/adt/arrayfuncs.c:2285 utils/adt/arrayfuncs.c:2393 utils/adt/arrayfuncs.c:2656 utils/adt/arrayfuncs.c:2970 +#: utils/adt/arrayfuncs.c:2250 utils/adt/arrayfuncs.c:2374 utils/adt/arrayfuncs.c:2653 utils/adt/arrayfuncs.c:2990 #, c-format msgid "array subscript out of range" msgstr "é…åˆ—ã®æ·»ãˆå­—ãŒç¯„囲外ã§ã™" -#: utils/adt/arrayfuncs.c:2290 +#: utils/adt/arrayfuncs.c:2255 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "固定長é…列ã®è¦ç´ ã«NULL値を代入ã§ãã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:2858 +#: utils/adt/arrayfuncs.c:2855 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "固定長é…列ã®éƒ¨åˆ†é…åˆ—ã®æ›´æ–°ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:2889 +#: utils/adt/arrayfuncs.c:2886 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "é…列ã®ã‚¹ãƒ©ã‚¤ã‚¹ã®æ·»ãˆå­—ã¯ä¸¡æ–¹ã®å¢ƒç•Œã‚’示ã™å¿…è¦ãŒã‚りã¾ã™" -#: utils/adt/arrayfuncs.c:2890 +#: utils/adt/arrayfuncs.c:2887 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "空ã®é…列値ã®ã‚¹ãƒ©ã‚¤ã‚¹ã«ä»£å…¥ã™ã‚‹ã«ã¯ã€ã‚¹ãƒ©ã‚¤ã‚¹ã®ç¯„囲ã¯å®Œå…¨ã«æŒ‡å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: utils/adt/arrayfuncs.c:2901 utils/adt/arrayfuncs.c:2997 +#: utils/adt/arrayfuncs.c:2905 utils/adt/arrayfuncs.c:3017 #, c-format msgid "source array too small" msgstr "å…ƒã®é…列ãŒå°ã•ã™ãŽã¾ã™" -#: utils/adt/arrayfuncs.c:3637 +#: utils/adt/arrayfuncs.c:3657 #, c-format msgid "null array element not allowed in this context" msgstr "ã“ã®æ–‡è„ˆã§ã¯NULLã®é…列è¦ç´ ã¯è¨±å¯ã•れã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:3808 utils/adt/arrayfuncs.c:3979 utils/adt/arrayfuncs.c:4370 +#: utils/adt/arrayfuncs.c:3828 utils/adt/arrayfuncs.c:3999 utils/adt/arrayfuncs.c:4390 #, c-format msgid "cannot compare arrays of different element types" msgstr "è¦ç´ åž‹ã®ç•°ãªã‚‹é…列を比較ã§ãã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:4157 utils/adt/multirangetypes.c:2806 utils/adt/multirangetypes.c:2878 utils/adt/rangetypes.c:1354 utils/adt/rangetypes.c:1418 utils/adt/rowtypes.c:1885 +#: utils/adt/arrayfuncs.c:4177 utils/adt/multirangetypes.c:2805 utils/adt/multirangetypes.c:2877 utils/adt/rangetypes.c:1361 utils/adt/rangetypes.c:1425 utils/adt/rowtypes.c:1875 #, c-format msgid "could not identify a hash function for type %s" -msgstr "åž‹ %s ã®ãƒãƒƒã‚·ãƒ¥é–¢æ•°ã‚’識別ã§ãã¾ã›ã‚“" +msgstr "åž‹ %s ã®ãƒãƒƒã‚·ãƒ¥é–¢æ•°ã‚’特定ã§ãã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:4285 utils/adt/rowtypes.c:2006 +#: utils/adt/arrayfuncs.c:4305 utils/adt/rowtypes.c:1996 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "åž‹ %s ã®æ‹¡å¼µãƒãƒƒã‚·ãƒ¥é–¢æ•°ã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/adt/arrayfuncs.c:5480 +#: utils/adt/arrayfuncs.c:5506 #, c-format msgid "data type %s is not an array type" msgstr "データ型%sã¯é…列型ã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:5535 +#: utils/adt/arrayfuncs.c:5561 #, c-format msgid "cannot accumulate null arrays" msgstr "nullé…列ã¯é€£çµã§ãã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:5563 +#: utils/adt/arrayfuncs.c:5589 #, c-format msgid "cannot accumulate empty arrays" msgstr "空ã®é…列ã¯é€£çµã§ãã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:5964 utils/adt/arrayfuncs.c:6004 +#: utils/adt/arrayfuncs.c:5992 utils/adt/arrayfuncs.c:6032 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "次元é…列もã—ãã¯ä¸‹é™å€¤é…列㌠NULL ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:6067 utils/adt/arrayfuncs.c:6093 +#: utils/adt/arrayfuncs.c:6095 utils/adt/arrayfuncs.c:6121 #, c-format msgid "Dimension array must be one dimensional." msgstr "次元é…列ã¯1次元ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:6072 utils/adt/arrayfuncs.c:6098 +#: utils/adt/arrayfuncs.c:6100 utils/adt/arrayfuncs.c:6126 #, c-format msgid "dimension values cannot be null" msgstr "次元値ã«nullã«ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:6104 +#: utils/adt/arrayfuncs.c:6132 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "下é™é…åˆ—ãŒæ¬¡å…ƒé…列ã®ã‚µã‚¤ã‚ºã¨ç•°ãªã£ã¦ã„ã¾ã™" -#: utils/adt/arrayfuncs.c:6382 +#: utils/adt/arrayfuncs.c:6413 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "多次元é…列ã‹ã‚‰ã®è¦ç´ å‰Šé™¤ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:6659 +#: utils/adt/arrayfuncs.c:6690 #, c-format msgid "thresholds must be one-dimensional array" msgstr "閾値ã¯1次元ã®é…列ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:6664 +#: utils/adt/arrayfuncs.c:6695 #, c-format msgid "thresholds array must not contain NULLs" msgstr "閾値é…列ã«ã¯NULL値をå«ã‚ã¦ã¯ã„ã‘ã¾ã›ã‚“" -#: utils/adt/arrayfuncs.c:6897 +#: utils/adt/arrayfuncs.c:6928 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "削除ã™ã‚‹è¦ç´ ã®æ•°ã¯0ã¨%dã¨ã®é–“ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" @@ -23121,22 +24075,22 @@ msgstr "é…åˆ—ã®æ·»ãˆå­—ã¯æ•´æ•°åž‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" msgid "array subscript in assignment must not be null" msgstr "代入ã«ãŠã‘ã‚‹é…åˆ—ã®æ·»ãˆå­—ã¯nullã«ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/arrayutils.c:161 +#: utils/adt/arrayutils.c:140 #, c-format msgid "array lower bound is too large: %d" msgstr "é…列ã®ä¸‹ç•ŒãŒå¤§ãã™ãŽã¾ã™: %d" -#: utils/adt/arrayutils.c:263 +#: utils/adt/arrayutils.c:242 #, c-format msgid "typmod array must be type cstring[]" msgstr "typmodé…列ã¯cstring[]åž‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/arrayutils.c:268 +#: utils/adt/arrayutils.c:247 #, c-format msgid "typmod array must be one-dimensional" msgstr "typmodé…列ã¯1次元ã®é…列ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/arrayutils.c:273 +#: utils/adt/arrayutils.c:252 #, c-format msgid "typmod array must not contain nulls" msgstr "typmodé…列ã«ã¯NULL値をå«ã‚ã¦ã¯ã„ã‘ã¾ã›ã‚“" @@ -23147,24 +24101,29 @@ msgid "encoding conversion from %s to ASCII not supported" msgstr "%s符å·åŒ–æ–¹å¼ã‹ã‚‰ASCIIã¸ã®å¤‰æ›ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:4017 utils/adt/float.c:206 utils/adt/float.c:293 utils/adt/float.c:307 utils/adt/float.c:412 utils/adt/float.c:495 utils/adt/float.c:509 utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1417 utils/adt/geo_ops.c:1454 utils/adt/geo_ops.c:1462 utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 utils/adt/geo_ops.c:4672 -#: utils/adt/int.c:174 utils/adt/int.c:186 utils/adt/jsonpath.c:183 utils/adt/mac.c:94 utils/adt/mac8.c:225 utils/adt/network.c:99 utils/adt/numeric.c:795 utils/adt/numeric.c:7136 utils/adt/numeric.c:7339 utils/adt/numeric.c:8286 utils/adt/numutils.c:273 utils/adt/numutils.c:451 utils/adt/numutils.c:629 utils/adt/numutils.c:668 utils/adt/numutils.c:690 utils/adt/numutils.c:754 utils/adt/numutils.c:776 utils/adt/pg_lsn.c:74 utils/adt/tid.c:72 utils/adt/tid.c:80 -#: utils/adt/tid.c:94 utils/adt/tid.c:103 utils/adt/timestamp.c:494 utils/adt/uuid.c:135 utils/adt/xid8funcs.c:354 +#: utils/adt/bool.c:149 utils/adt/cash.c:354 utils/adt/datetime.c:4142 utils/adt/float.c:200 utils/adt/float.c:287 utils/adt/float.c:301 utils/adt/float.c:406 utils/adt/float.c:489 utils/adt/float.c:503 utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1417 utils/adt/geo_ops.c:1454 utils/adt/geo_ops.c:1462 utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 utils/adt/geo_ops.c:4672 utils/adt/int.c:174 +#: utils/adt/int.c:186 utils/adt/jsonpath.c:185 utils/adt/mac.c:94 utils/adt/mac8.c:226 utils/adt/network.c:99 utils/adt/numeric.c:803 utils/adt/numeric.c:7221 utils/adt/numeric.c:7424 utils/adt/numeric.c:8371 utils/adt/numutils.c:356 utils/adt/numutils.c:618 utils/adt/numutils.c:880 utils/adt/numutils.c:919 utils/adt/numutils.c:941 utils/adt/numutils.c:1005 utils/adt/numutils.c:1027 utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 utils/adt/tid.c:94 +#: utils/adt/tid.c:103 utils/adt/timestamp.c:510 utils/adt/uuid.c:140 utils/adt/xid8funcs.c:323 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "\"%s\"åž‹ã®å…¥åŠ›æ§‹æ–‡ãŒä¸æ­£ã§ã™: \"%s\"" -#: utils/adt/cash.c:215 utils/adt/cash.c:240 utils/adt/cash.c:250 utils/adt/cash.c:290 utils/adt/int.c:180 utils/adt/numutils.c:267 utils/adt/numutils.c:445 utils/adt/numutils.c:623 utils/adt/numutils.c:674 utils/adt/numutils.c:713 utils/adt/numutils.c:760 +#: utils/adt/cash.c:98 utils/adt/cash.c:111 utils/adt/cash.c:124 utils/adt/cash.c:137 utils/adt/cash.c:150 #, c-format -msgid "value \"%s\" is out of range for type %s" -msgstr "値\"%s\"ã¯åž‹%sã®ç¯„囲外ã§ã™" +msgid "money out of range" +msgstr "マãƒãƒ¼åž‹ã®å€¤ãŒç¯„囲外ã§ã™" -#: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 utils/adt/float.c:105 utils/adt/int.c:843 utils/adt/int.c:959 utils/adt/int.c:1039 utils/adt/int.c:1101 utils/adt/int.c:1139 utils/adt/int.c:1167 utils/adt/int8.c:515 utils/adt/int8.c:573 utils/adt/int8.c:943 utils/adt/int8.c:1023 utils/adt/int8.c:1085 utils/adt/int8.c:1165 utils/adt/numeric.c:3175 utils/adt/numeric.c:3198 -#: utils/adt/numeric.c:3283 utils/adt/numeric.c:3301 utils/adt/numeric.c:3397 utils/adt/numeric.c:8835 utils/adt/numeric.c:9148 utils/adt/numeric.c:9496 utils/adt/numeric.c:9612 utils/adt/numeric.c:11122 utils/adt/timestamp.c:3406 +#: utils/adt/cash.c:161 utils/adt/cash.c:723 utils/adt/float.c:99 utils/adt/int.c:843 utils/adt/int.c:959 utils/adt/int.c:1039 utils/adt/int.c:1101 utils/adt/int.c:1139 utils/adt/int.c:1167 utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:942 utils/adt/int8.c:1022 utils/adt/int8.c:1084 utils/adt/int8.c:1164 utils/adt/numeric.c:3191 utils/adt/numeric.c:3214 utils/adt/numeric.c:3299 utils/adt/numeric.c:3317 utils/adt/numeric.c:3413 utils/adt/numeric.c:8920 +#: utils/adt/numeric.c:9233 utils/adt/numeric.c:9581 utils/adt/numeric.c:9697 utils/adt/numeric.c:11208 utils/adt/timestamp.c:3713 #, c-format msgid "division by zero" msgstr "0 ã«ã‚ˆã‚‹é™¤ç®—ãŒè¡Œã‚れã¾ã—ãŸ" +#: utils/adt/cash.c:292 utils/adt/cash.c:317 utils/adt/cash.c:327 utils/adt/cash.c:367 utils/adt/int.c:180 utils/adt/numutils.c:350 utils/adt/numutils.c:612 utils/adt/numutils.c:874 utils/adt/numutils.c:925 utils/adt/numutils.c:964 utils/adt/numutils.c:1011 +#, c-format +msgid "value \"%s\" is out of range for type %s" +msgstr "値\"%s\"ã¯åž‹%sã®ç¯„囲外ã§ã™" + #: utils/adt/char.c:197 #, c-format msgid "\"char\" out of range" @@ -23175,120 +24134,140 @@ msgstr "\"char\"ã®ç¯„囲外ã§ã™" msgid "could not compute %s hash: %s" msgstr "%sãƒãƒƒã‚·ãƒ¥ã‚’計算ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: utils/adt/date.c:63 utils/adt/timestamp.c:100 utils/adt/varbit.c:105 utils/adt/varchar.c:49 +#: utils/adt/date.c:64 utils/adt/timestamp.c:116 utils/adt/varbit.c:105 utils/adt/varchar.c:48 #, c-format msgid "invalid type modifier" msgstr "䏿­£ãªåž‹ä¿®é£¾å­ã§ã™ã€‚" -#: utils/adt/date.c:75 +#: utils/adt/date.c:76 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "(%d)%sã®ç²¾åº¦ã¯è² ã§ã¯ã„ã‘ã¾ã›ã‚“" -#: utils/adt/date.c:81 +#: utils/adt/date.c:82 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%sã®ä½å–りを許容最大値%dã¾ã§æ¸›ã‚‰ã—ã¾ã—ãŸ" -#: utils/adt/date.c:166 utils/adt/date.c:174 utils/adt/formatting.c:4241 utils/adt/formatting.c:4250 utils/adt/formatting.c:4363 utils/adt/formatting.c:4373 +#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4424 utils/adt/formatting.c:4433 utils/adt/formatting.c:4538 utils/adt/formatting.c:4548 #, c-format msgid "date out of range: \"%s\"" msgstr "日付ãŒç¯„囲外ã§ã™: \"%s\"" -#: utils/adt/date.c:221 utils/adt/date.c:519 utils/adt/date.c:543 utils/adt/rangetypes.c:1577 utils/adt/rangetypes.c:1592 utils/adt/xml.c:2460 +#: utils/adt/date.c:222 utils/adt/date.c:520 utils/adt/date.c:544 utils/adt/rangetypes.c:1584 utils/adt/rangetypes.c:1599 utils/adt/xml.c:2552 #, c-format msgid "date out of range" msgstr "日付ãŒç¯„囲外ã§ã™" -#: utils/adt/date.c:267 utils/adt/timestamp.c:582 +#: utils/adt/date.c:268 utils/adt/timestamp.c:598 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "日付フィールドã®å€¤ãŒç¯„囲外ã§ã™: %d-%02d-%02d" -#: utils/adt/date.c:274 utils/adt/date.c:283 utils/adt/timestamp.c:588 +#: utils/adt/date.c:275 utils/adt/date.c:284 utils/adt/timestamp.c:604 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "日付ãŒç¯„囲外ã§ã™: %d-%02d-%02d" -#: utils/adt/date.c:494 +#: utils/adt/date.c:495 #, c-format msgid "cannot subtract infinite dates" msgstr "ç„¡é™å¤§ã®æ—¥ä»˜ã¯æ¸›ç®—ã§ãã¾ã›ã‚“" -#: utils/adt/date.c:592 utils/adt/date.c:655 utils/adt/date.c:691 utils/adt/date.c:2885 utils/adt/date.c:2895 +#: utils/adt/date.c:593 utils/adt/date.c:656 utils/adt/date.c:692 utils/adt/date.c:2906 utils/adt/date.c:2916 #, c-format msgid "date out of range for timestamp" msgstr "ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã§æ—¥ä»˜ãŒç¯„囲外ã§ã™" -#: utils/adt/date.c:1121 utils/adt/date.c:1204 utils/adt/date.c:1220 utils/adt/date.c:2206 utils/adt/date.c:2990 utils/adt/timestamp.c:4097 utils/adt/timestamp.c:4290 utils/adt/timestamp.c:4432 utils/adt/timestamp.c:4685 utils/adt/timestamp.c:4886 utils/adt/timestamp.c:4933 utils/adt/timestamp.c:5157 utils/adt/timestamp.c:5204 utils/adt/timestamp.c:5334 +#: utils/adt/date.c:1122 utils/adt/date.c:1205 utils/adt/date.c:1221 utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4726 utils/adt/timestamp.c:4941 utils/adt/timestamp.c:5089 utils/adt/timestamp.c:5342 utils/adt/timestamp.c:5543 utils/adt/timestamp.c:5590 utils/adt/timestamp.c:5814 utils/adt/timestamp.c:5861 utils/adt/timestamp.c:5941 utils/adt/timestamp.c:6070 #, c-format msgid "unit \"%s\" not supported for type %s" msgstr "å˜ä½\"%s\"ã¯åž‹%sã«å¯¾ã—ã¦ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/date.c:1229 utils/adt/date.c:2222 utils/adt/date.c:3010 utils/adt/timestamp.c:4111 utils/adt/timestamp.c:4307 utils/adt/timestamp.c:4446 utils/adt/timestamp.c:4645 utils/adt/timestamp.c:4942 utils/adt/timestamp.c:5213 utils/adt/timestamp.c:5395 +#: utils/adt/date.c:1230 utils/adt/date.c:2231 utils/adt/date.c:3031 utils/adt/timestamp.c:4740 utils/adt/timestamp.c:4958 utils/adt/timestamp.c:5103 utils/adt/timestamp.c:5302 utils/adt/timestamp.c:5599 utils/adt/timestamp.c:5870 utils/adt/timestamp.c:5911 utils/adt/timestamp.c:6131 #, c-format msgid "unit \"%s\" not recognized for type %s" msgstr "å˜ä½\"%s\"ã¯åž‹%sã«å¯¾ã—ã¦ã¯èªè­˜ã§ãã¾ã›ã‚“" -#: utils/adt/date.c:1313 utils/adt/date.c:1359 utils/adt/date.c:1918 utils/adt/date.c:1949 utils/adt/date.c:1978 utils/adt/date.c:2848 utils/adt/date.c:3080 utils/adt/datetime.c:424 utils/adt/datetime.c:1809 utils/adt/formatting.c:4081 utils/adt/formatting.c:4117 utils/adt/formatting.c:4210 utils/adt/formatting.c:4339 utils/adt/json.c:467 utils/adt/json.c:506 utils/adt/timestamp.c:232 utils/adt/timestamp.c:264 utils/adt/timestamp.c:700 utils/adt/timestamp.c:709 -#: utils/adt/timestamp.c:787 utils/adt/timestamp.c:820 utils/adt/timestamp.c:2933 utils/adt/timestamp.c:2954 utils/adt/timestamp.c:2967 utils/adt/timestamp.c:2976 utils/adt/timestamp.c:2984 utils/adt/timestamp.c:3045 utils/adt/timestamp.c:3068 utils/adt/timestamp.c:3081 utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3100 utils/adt/timestamp.c:3801 utils/adt/timestamp.c:3925 utils/adt/timestamp.c:4015 utils/adt/timestamp.c:4105 utils/adt/timestamp.c:4198 -#: utils/adt/timestamp.c:4301 utils/adt/timestamp.c:4750 utils/adt/timestamp.c:5024 utils/adt/timestamp.c:5463 utils/adt/timestamp.c:5473 utils/adt/timestamp.c:5478 utils/adt/timestamp.c:5484 utils/adt/timestamp.c:5517 utils/adt/timestamp.c:5604 utils/adt/timestamp.c:5645 utils/adt/timestamp.c:5649 utils/adt/timestamp.c:5703 utils/adt/timestamp.c:5707 utils/adt/timestamp.c:5713 utils/adt/timestamp.c:5747 utils/adt/xml.c:2482 utils/adt/xml.c:2489 -#: utils/adt/xml.c:2509 utils/adt/xml.c:2516 +#: utils/adt/date.c:1314 utils/adt/date.c:1360 utils/adt/date.c:1919 utils/adt/date.c:1950 utils/adt/date.c:1979 utils/adt/date.c:2869 utils/adt/date.c:3101 utils/adt/datetime.c:422 utils/adt/datetime.c:1807 utils/adt/formatting.c:4269 utils/adt/formatting.c:4305 utils/adt/formatting.c:4392 utils/adt/formatting.c:4514 utils/adt/json.c:366 utils/adt/json.c:405 utils/adt/timestamp.c:248 utils/adt/timestamp.c:280 utils/adt/timestamp.c:716 utils/adt/timestamp.c:725 +#: utils/adt/timestamp.c:803 utils/adt/timestamp.c:836 utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3075 utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3097 utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3129 utils/adt/timestamp.c:3140 utils/adt/timestamp.c:3146 utils/adt/timestamp.c:3152 utils/adt/timestamp.c:3157 utils/adt/timestamp.c:3210 utils/adt/timestamp.c:3219 utils/adt/timestamp.c:3240 utils/adt/timestamp.c:3245 utils/adt/timestamp.c:3266 +#: utils/adt/timestamp.c:3279 utils/adt/timestamp.c:3293 utils/adt/timestamp.c:3301 utils/adt/timestamp.c:3307 utils/adt/timestamp.c:3312 utils/adt/timestamp.c:4380 utils/adt/timestamp.c:4532 utils/adt/timestamp.c:4608 utils/adt/timestamp.c:4644 utils/adt/timestamp.c:4734 utils/adt/timestamp.c:4813 utils/adt/timestamp.c:4849 utils/adt/timestamp.c:4952 utils/adt/timestamp.c:5407 utils/adt/timestamp.c:5681 utils/adt/timestamp.c:6199 utils/adt/timestamp.c:6209 +#: utils/adt/timestamp.c:6214 utils/adt/timestamp.c:6220 utils/adt/timestamp.c:6260 utils/adt/timestamp.c:6347 utils/adt/timestamp.c:6388 utils/adt/timestamp.c:6392 utils/adt/timestamp.c:6446 utils/adt/timestamp.c:6450 utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2574 utils/adt/xml.c:2581 utils/adt/xml.c:2601 utils/adt/xml.c:2608 #, c-format msgid "timestamp out of range" msgstr "timestampã®ç¯„囲外ã§ã™" -#: utils/adt/date.c:1535 utils/adt/date.c:2343 utils/adt/formatting.c:4431 +#: utils/adt/date.c:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4597 #, c-format msgid "time out of range" msgstr "時刻ãŒç¯„囲外ã§ã™" -#: utils/adt/date.c:1587 utils/adt/timestamp.c:597 +#: utils/adt/date.c:1588 utils/adt/timestamp.c:613 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "時刻フィールドã®å€¤ãŒç¯„囲外ã§ã™: %d:%02d:%02g" -#: utils/adt/date.c:2107 utils/adt/date.c:2647 utils/adt/float.c:1042 utils/adt/float.c:1118 utils/adt/int.c:635 utils/adt/int.c:682 utils/adt/int.c:717 utils/adt/int8.c:414 utils/adt/numeric.c:2579 utils/adt/timestamp.c:3455 utils/adt/timestamp.c:3482 utils/adt/timestamp.c:3513 +#: utils/adt/date.c:2020 +#, c-format +msgid "cannot convert infinite interval to time" +msgstr "ç„¡é™å¤§ã®intervalã¯timeã«å¤‰æ›ã§ãã¾ã›ã‚“" + +#: utils/adt/date.c:2061 utils/adt/date.c:2605 +#, c-format +msgid "cannot add infinite interval to time" +msgstr "ç„¡é™å¤§ã®intervalã®timeã¸ã®åŠ ç®—ã¯ã§ãã¾ã›ã‚“" + +#: utils/adt/date.c:2084 utils/adt/date.c:2632 +#, c-format +msgid "cannot subtract infinite interval from time" +msgstr "ç„¡é™å¤§ã®intervalã®timeã‹ã‚‰ã®æ¸›ç®—ã§ãã¾ã›ã‚“" + +#: utils/adt/date.c:2115 utils/adt/date.c:2667 utils/adt/float.c:1036 utils/adt/float.c:1112 utils/adt/int.c:635 utils/adt/int.c:682 utils/adt/int.c:717 utils/adt/int8.c:413 utils/adt/numeric.c:2595 utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 utils/adt/timestamp.c:3888 #, c-format msgid "invalid preceding or following size in window function" msgstr "ウィンドウ関数ã§ã®ä¸æ­£ãªã‚µã‚¤ã‚ºã® PRECEDING ã¾ãŸã¯ FOLLOWING 指定" -#: utils/adt/date.c:2351 +#: utils/adt/date.c:2360 #, c-format msgid "time zone displacement out of range" msgstr "タイムゾーンã®ç½®æ›ãŒç¯„囲外ã§ã™" -#: utils/adt/date.c:3110 utils/adt/timestamp.c:5506 utils/adt/timestamp.c:5736 +#: utils/adt/date.c:3132 utils/adt/timestamp.c:6242 utils/adt/timestamp.c:6479 +#, c-format +msgid "interval time zone \"%s\" must be finite" +msgstr "タイムゾーンã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒ«\"%s\"ã¯æœ‰é™ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#: utils/adt/date.c:3139 utils/adt/timestamp.c:6249 utils/adt/timestamp.c:6486 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "intervalã«ã‚ˆã‚‹ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³\"%s\"ã«ã¯æœˆã¾ãŸã¯æ—¥ã‚’å«ã‚ã¦ã¯ã„ã‘ã¾ã›ã‚“" -#: utils/adt/datetime.c:3223 utils/adt/datetime.c:4002 utils/adt/datetime.c:4008 utils/adt/timestamp.c:512 +#: utils/adt/datetime.c:3232 utils/adt/datetime.c:4127 utils/adt/datetime.c:4133 utils/adt/timestamp.c:528 #, c-format msgid "time zone \"%s\" not recognized" msgstr "タイムゾーン\"%s\"ã¯ä¸æ˜Žã§ã™" -#: utils/adt/datetime.c:3976 utils/adt/datetime.c:3983 +#: utils/adt/datetime.c:4101 utils/adt/datetime.c:4108 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "日付時刻ã®ãƒ•ィールドãŒç¯„囲外ã§ã™: \"%s\"" -#: utils/adt/datetime.c:3985 +#: utils/adt/datetime.c:4110 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "ä»–ã®\"datestyle\"設定ãŒå¿…è¦ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: utils/adt/datetime.c:3990 +#: utils/adt/datetime.c:4115 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "intervalフィールドã®å€¤ãŒç¯„囲外ã§ã™: \"%s\"" -#: utils/adt/datetime.c:3996 +#: utils/adt/datetime.c:4121 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "タイムゾーンã®ç½®æ›ãŒç¯„囲外ã§ã™: \"%s\"" -#: utils/adt/datetime.c:4010 +#: utils/adt/datetime.c:4135 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "ã“ã®ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³ã¯ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³çœç•¥å\"%s\"ã®æ§‹æˆãƒ•ァイルã«ã‚るよã†ã§ã™ã€‚" @@ -23298,22 +24277,22 @@ msgstr "ã“ã®ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³ã¯ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³çœç•¥å\"%s\"ã®æ§‹æˆãƒ• msgid "invalid Datum pointer" msgstr "䏿­£ãªDatumãƒã‚¤ãƒ³ã‚¿" -#: utils/adt/dbsize.c:761 utils/adt/dbsize.c:837 +#: utils/adt/dbsize.c:764 utils/adt/dbsize.c:840 #, c-format msgid "invalid size: \"%s\"" msgstr "䏿­£ãªã‚µã‚¤ã‚º: \"%s\"" -#: utils/adt/dbsize.c:838 +#: utils/adt/dbsize.c:841 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "䏿­£ãªã‚µã‚¤ã‚ºã®å˜ä½: \"%s\"" -#: utils/adt/dbsize.c:839 +#: utils/adt/dbsize.c:842 #, c-format msgid "Valid units are \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." msgstr "有効ãªå˜ä½ã¯ \"bytes\"ã€\"B\"ã€\"kB\"ã€\"MB\"ã€\"GB\"ã€\"TB\"ãã—ã¦\"PB\"ã§ã™ã€‚" -#: utils/adt/domains.c:92 +#: utils/adt/domains.c:95 #, c-format msgid "type %s is not a domain" msgstr "åž‹%sã¯ãƒ‰ãƒ¡ã‚¤ãƒ³ã§ã¯ã‚りã¾ã›ã‚“" @@ -23393,337 +24372,332 @@ msgstr "実際ã®åˆ—挙型を特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" msgid "enum %s contains no values" msgstr "列挙型 %s ã«å€¤ãŒã‚りã¾ã›ã‚“" -#: utils/adt/float.c:89 +#: utils/adt/float.c:83 #, c-format msgid "value out of range: overflow" msgstr "範囲外ã®å€¤ã§ã™: オーãƒãƒ¼ãƒ•ロー" -#: utils/adt/float.c:97 +#: utils/adt/float.c:91 #, c-format msgid "value out of range: underflow" msgstr "範囲外ã®å€¤ã§ã™: アンダーフロー" -#: utils/adt/float.c:286 +#: utils/adt/float.c:280 #, c-format msgid "\"%s\" is out of range for type real" msgstr "åž‹realã§ã¯\"%s\"ã¯ç¯„囲外ã§ã™" -#: utils/adt/float.c:488 +#: utils/adt/float.c:482 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "åž‹double precisionã§ã¯\"%s\"ã¯ç¯„囲外ã§ã™" -#: utils/adt/float.c:1253 utils/adt/float.c:1327 utils/adt/int.c:355 utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 utils/adt/int8.c:1278 utils/adt/numeric.c:4500 utils/adt/numeric.c:4505 +#: utils/adt/float.c:1247 utils/adt/float.c:1321 utils/adt/int.c:355 utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 utils/adt/int8.c:1277 utils/adt/numeric.c:4593 utils/adt/numeric.c:4598 #, c-format msgid "smallint out of range" msgstr "smallintã®ç¯„囲外ã§ã™" -#: utils/adt/float.c:1453 utils/adt/numeric.c:3693 utils/adt/numeric.c:10027 +#: utils/adt/float.c:1447 utils/adt/numeric.c:3709 utils/adt/numeric.c:10112 #, c-format msgid "cannot take square root of a negative number" msgstr "è² ã®å€¤ã®å¹³æ–¹æ ¹ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: utils/adt/float.c:1521 utils/adt/numeric.c:3981 utils/adt/numeric.c:4093 +#: utils/adt/float.c:1515 utils/adt/numeric.c:3997 utils/adt/numeric.c:4109 #, c-format msgid "zero raised to a negative power is undefined" msgstr "0 ã®è² æ•°ä¹—ã¯å®šç¾©ã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/float.c:1525 utils/adt/numeric.c:3985 utils/adt/numeric.c:10918 +#: utils/adt/float.c:1519 utils/adt/numeric.c:4001 utils/adt/numeric.c:11003 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "è² æ•°ã‚’æ•´æ•°ã§ãªã„æ•°ã§ã¹ãä¹—ã™ã‚‹ã¨ã€çµæžœãŒè¤‡é›‘ã«ãªã‚Šã¾ã™" -#: utils/adt/float.c:1701 utils/adt/float.c:1734 utils/adt/numeric.c:3893 utils/adt/numeric.c:10698 +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3909 utils/adt/numeric.c:10783 #, c-format msgid "cannot take logarithm of zero" msgstr "ゼロã®å¯¾æ•°ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: utils/adt/float.c:1705 utils/adt/float.c:1738 utils/adt/numeric.c:3831 utils/adt/numeric.c:3888 utils/adt/numeric.c:10702 +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3847 utils/adt/numeric.c:3904 utils/adt/numeric.c:10787 #, c-format msgid "cannot take logarithm of a negative number" msgstr "è² ã®å€¤ã®å¯¾æ•°ã‚’å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: utils/adt/float.c:1771 utils/adt/float.c:1802 utils/adt/float.c:1897 utils/adt/float.c:1924 utils/adt/float.c:1952 utils/adt/float.c:1979 utils/adt/float.c:2126 utils/adt/float.c:2163 utils/adt/float.c:2333 utils/adt/float.c:2389 utils/adt/float.c:2454 utils/adt/float.c:2511 utils/adt/float.c:2702 utils/adt/float.c:2726 +#: utils/adt/float.c:1765 utils/adt/float.c:1796 utils/adt/float.c:1891 utils/adt/float.c:1918 utils/adt/float.c:1946 utils/adt/float.c:1973 utils/adt/float.c:2120 utils/adt/float.c:2157 utils/adt/float.c:2327 utils/adt/float.c:2383 utils/adt/float.c:2448 utils/adt/float.c:2505 utils/adt/float.c:2696 utils/adt/float.c:2720 #, c-format msgid "input is out of range" msgstr "入力ãŒç¯„囲外ã§ã™" -#: utils/adt/float.c:2867 -#, c-format -msgid "setseed parameter %g is out of allowed range [-1,1]" -msgstr "setseed ã®ãƒ‘ラメータ %g ã¯è¨­å®šå¯èƒ½ãªç¯„囲 [-1, 1] ã«ã‚りã¾ã›ã‚“" - -#: utils/adt/float.c:4095 utils/adt/numeric.c:1841 +#: utils/adt/float.c:4000 utils/adt/numeric.c:1857 #, c-format msgid "count must be greater than zero" msgstr "カウントã¯0より大ãããªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/float.c:4100 utils/adt/numeric.c:1852 +#: utils/adt/float.c:4005 utils/adt/numeric.c:1868 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "オペランドã€ä¸‹é™ã€ä¸Šé™ã‚’NaNã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/float.c:4106 utils/adt/numeric.c:1857 +#: utils/adt/float.c:4011 utils/adt/numeric.c:1873 #, c-format msgid "lower and upper bounds must be finite" msgstr "下é™ãŠã‚ˆã³ä¸Šé™ã¯æœ‰é™ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/float.c:4172 utils/adt/numeric.c:1871 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1887 #, c-format msgid "lower bound cannot equal upper bound" msgstr "下é™ã‚’上é™ã¨åŒã˜ã«ã§ãã¾ã›ã‚“" -#: utils/adt/formatting.c:519 +#: utils/adt/formatting.c:530 #, c-format msgid "invalid format specification for an interval value" msgstr "\"tinterval\"値ã«å¯¾ã™ã‚‹ä¸æ­£ãªæ›¸å¼æŒ‡å®š" -#: utils/adt/formatting.c:520 +#: utils/adt/formatting.c:531 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "時間間隔ãŒç‰¹å®šã®æš¦æ—¥ä»˜ã«çµã³ã¤ã„ã¦ã„ã¾ã›ã‚“" -#: utils/adt/formatting.c:1150 +#: utils/adt/formatting.c:1161 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\"ã¯æœ€çµ‚パターンã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/formatting.c:1158 +#: utils/adt/formatting.c:1169 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\"ã¯\"PR\"ã®å‰ã«ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/formatting.c:1174 +#: utils/adt/formatting.c:1185 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\"ã¯\"PR\"ã®å‰ã«ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/formatting.c:1201 +#: utils/adt/formatting.c:1212 #, c-format msgid "multiple decimal points" msgstr "複数ã®å°æ•°ç‚¹ãŒã‚りã¾ã™" -#: utils/adt/formatting.c:1205 utils/adt/formatting.c:1288 +#: utils/adt/formatting.c:1216 utils/adt/formatting.c:1299 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "\"V\"ã¨å°æ•°ç‚¹ã‚’混在ã§ãã¾ã›ã‚“" -#: utils/adt/formatting.c:1217 +#: utils/adt/formatting.c:1228 #, c-format msgid "cannot use \"S\" twice" msgstr "\"S\"ã¯1回ã—ã‹ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: utils/adt/formatting.c:1221 +#: utils/adt/formatting.c:1232 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "\"S\"ã¨\"PL\"/\"MI\"/\"SG\"/\"PR\"を混在ã§ãã¾ã›ã‚“" -#: utils/adt/formatting.c:1241 +#: utils/adt/formatting.c:1252 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "\"S\"ã¨\"MI\"を混在ã§ãã¾ã›ã‚“" -#: utils/adt/formatting.c:1251 +#: utils/adt/formatting.c:1262 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "\"S\"ã¨\"PL\"を混在ã§ãã¾ã›ã‚“" -#: utils/adt/formatting.c:1261 +#: utils/adt/formatting.c:1272 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "\"S\"ã¨\"SG\"を混在ã§ãã¾ã›ã‚“" -#: utils/adt/formatting.c:1270 +#: utils/adt/formatting.c:1281 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "\"PR\"ã¨\"S\"/\"PL\"/\"MI\"/\"SG\"を混在ã§ãã¾ã›ã‚“" -#: utils/adt/formatting.c:1296 +#: utils/adt/formatting.c:1307 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "\"EEEE\"ã¯1回ã—ã‹ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: utils/adt/formatting.c:1302 +#: utils/adt/formatting.c:1313 #, c-format msgid "\"EEEE\" is incompatible with other formats" -msgstr "\"EEEE\"ãŒä»–ã®ãƒ•ォーマットã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“。" +msgstr "\"EEEE\"ãŒä»–ã®ãƒ•ォーマットã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: utils/adt/formatting.c:1303 +#: utils/adt/formatting.c:1314 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." -msgstr "\"EEEE\"ã¯æ•°å€¤ã¾ãŸã¯å°æ•°ç‚¹ãƒ‘ターンã¨å…±ã«æŒ‡å®šã—ã¦ãã ã•ã„。" +msgstr "\"EEEE\"ã¯æ•°å€¤ãŠã‚ˆã³å°æ•°ç‚¹ãƒ‘ターンã¨å…±ã«ã®ã¿ä½¿ç”¨ã§ãã¾ã™ã€‚" -#: utils/adt/formatting.c:1387 +#: utils/adt/formatting.c:1398 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "䏿­£ãªdatetime書å¼ã®ã‚»ãƒ‘レータ: \"%s\"" -#: utils/adt/formatting.c:1514 +#: utils/adt/formatting.c:1525 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\"ã¯æ•°å€¤ã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/formatting.c:1592 +#: utils/adt/formatting.c:1603 #, c-format msgid "case conversion failed: %s" msgstr "文字ケースã®å¤‰æ›ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: utils/adt/formatting.c:1646 utils/adt/formatting.c:1768 utils/adt/formatting.c:1891 +#: utils/adt/formatting.c:1651 utils/adt/formatting.c:1799 utils/adt/formatting.c:1989 #, c-format msgid "could not determine which collation to use for %s function" msgstr "%s 関数ã«å¯¾ã—ã¦ä½¿ç”¨ã™ã‚‹ç…§åˆé †åºã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/adt/formatting.c:2274 +#: utils/adt/formatting.c:2410 #, c-format msgid "invalid combination of date conventions" msgstr "䏿­£ãªæš¦æ³•ã®çµ„ã¿åˆã‚ã›" -#: utils/adt/formatting.c:2275 +#: utils/adt/formatting.c:2411 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "å˜ä¸€ã®æ›¸å¼ãƒ†ãƒ³ãƒ—レートã®ä¸­ã§ã¯ã€ã‚°ãƒ¬ã‚´ãƒªã‚ªæš¦ã¨ISO歴週日付を混在ã•ã›ãªã„ã§ãã ã•ã„。" -#: utils/adt/formatting.c:2297 +#: utils/adt/formatting.c:2433 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "æ›¸å¼æ–‡å­—列中ã§\"%s\"フィールドã®å€¤ãŒè¡çªã—ã¦ã„ã¾ã™" -#: utils/adt/formatting.c:2299 +#: utils/adt/formatting.c:2435 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "ã“ã®å€¤ã¯åŒã˜ãƒ•ィールド型ã«å¯¾ã™ã‚‹ä»¥å‰ã®è¨­å®šã¨çŸ›ç›¾ã—ã¦ã„ã¾ã™" -#: utils/adt/formatting.c:2366 +#: utils/adt/formatting.c:2502 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "書å¼ãƒ•ィールド\"%s\"ã«å¯¾ã—ã¦å…ƒã®æ–‡å­—列ãŒçŸ­ã™ãŽã¾ã™" -#: utils/adt/formatting.c:2368 +#: utils/adt/formatting.c:2504 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "フィールドã«ã¯%d文字必è¦ã§ã™ãŒã€%d文字ã—ã‹æ®‹ã£ã¦ã„ã¾ã›ã‚“。" -#: utils/adt/formatting.c:2370 utils/adt/formatting.c:2384 +#: utils/adt/formatting.c:2506 utils/adt/formatting.c:2520 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "å…ƒã®æ–‡å­—列ãŒå›ºå®šé•·ã§ãªã„å ´åˆã¯ã€ä¿®é£¾å­\"FM\"を試ã—ã¦ã¿ã¦ãã ã•ã„。" -#: utils/adt/formatting.c:2380 utils/adt/formatting.c:2393 utils/adt/formatting.c:2614 +#: utils/adt/formatting.c:2516 utils/adt/formatting.c:2529 utils/adt/formatting.c:2750 utils/adt/formatting.c:3650 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "\"%2$s\"ã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\"" -#: utils/adt/formatting.c:2382 +#: utils/adt/formatting.c:2518 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "ã“ã®ãƒ•ィールドã«ã¯%d文字必è¦ã§ã™ãŒã€%d文字ã—ã‹ãƒ‘ースã•れã¾ã›ã‚“ã§ã—ãŸã€‚" -#: utils/adt/formatting.c:2395 +#: utils/adt/formatting.c:2531 #, c-format msgid "Value must be an integer." msgstr "å€¤ã¯æ•´æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/formatting.c:2400 +#: utils/adt/formatting.c:2536 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "ã‚‚ã¨ã®æ–‡å­—列ã«ãŠã„ã¦\"%s\"ã«å¯¾å¿œã™ã‚‹å€¤ãŒç¯„囲外ã§ã™" -#: utils/adt/formatting.c:2402 +#: utils/adt/formatting.c:2538 #, c-format msgid "Value must be in the range %d to %d." msgstr "値ã¯%dã‹ã‚‰%dã¾ã§ã®ç¯„囲ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/formatting.c:2616 +#: utils/adt/formatting.c:2752 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "与ãˆã‚‰ã‚ŒãŸå€¤ãŒã“ã®é …ç›®ã«å¯¾ã—ã¦è¨±ã•れるã„ãšã‚Œã®å€¤ã¨ã‚‚マッãƒã—ã¾ã›ã‚“。" -#: utils/adt/formatting.c:2832 utils/adt/formatting.c:2852 utils/adt/formatting.c:2872 utils/adt/formatting.c:2892 utils/adt/formatting.c:2911 utils/adt/formatting.c:2930 utils/adt/formatting.c:2954 utils/adt/formatting.c:2972 utils/adt/formatting.c:2990 utils/adt/formatting.c:3008 utils/adt/formatting.c:3025 utils/adt/formatting.c:3042 +#: utils/adt/formatting.c:2968 utils/adt/formatting.c:2988 utils/adt/formatting.c:3008 utils/adt/formatting.c:3028 utils/adt/formatting.c:3047 utils/adt/formatting.c:3066 utils/adt/formatting.c:3090 utils/adt/formatting.c:3108 utils/adt/formatting.c:3126 utils/adt/formatting.c:3144 utils/adt/formatting.c:3161 utils/adt/formatting.c:3178 #, c-format msgid "localized string format value too long" msgstr "地域化ã—ãŸæ–‡å­—列ã®ãƒ•ォーマットãŒé•·ã™ãŽã¾ã™" -#: utils/adt/formatting.c:3322 +#: utils/adt/formatting.c:3458 #, c-format msgid "unmatched format separator \"%c\"" msgstr "åˆè‡´ã—ãªã„フォーマットセパレータ \"%c\"" -#: utils/adt/formatting.c:3383 +#: utils/adt/formatting.c:3519 #, c-format msgid "unmatched format character \"%s\"" msgstr "åˆè‡´ã—ãªã„フォーマット文字\"%s\"" -#: utils/adt/formatting.c:3491 +#: utils/adt/formatting.c:3652 #, c-format -msgid "formatting field \"%s\" is only supported in to_char" -msgstr "形弿Œ‡å®šãƒ•ィールド\"%s\"ã¯to_charã®ä¸­ã§ã®ã¿ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™" +msgid "Time zone abbreviation is not recognized." +msgstr "タイムゾーンçœç•¥åãŒèªè­˜ã•れã¾ã›ã‚“。" -#: utils/adt/formatting.c:3665 +#: utils/adt/formatting.c:3853 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr " \"Y,YYY\"ã«å¯¾å¿œã™ã‚‹å…¥åŠ›æ–‡å­—åˆ—ãŒä¸æ­£ã§ã™" -#: utils/adt/formatting.c:3754 +#: utils/adt/formatting.c:3942 #, c-format msgid "input string is too short for datetime format" msgstr "datetime書å¼ã«å¯¾ã—ã¦å…¥åŠ›æ–‡å­—åˆ—ãŒçŸ­ã™ãŽã¾ã™" -#: utils/adt/formatting.c:3762 +#: utils/adt/formatting.c:3950 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "datetimeãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆå¾Œã«æ–‡å­—ãŒå…¥åŠ›æ–‡å­—åˆ—ä¸­ã«æ®‹ã£ã¦ã„ã¾ã™" -#: utils/adt/formatting.c:4319 +#: utils/adt/formatting.c:4494 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "timestamptzåž‹ã«å¯¾å¿œã™ã‚‹å…¥åŠ›ã«æ™‚間帯ãŒã‚りã¾ã›ã‚“" -#: utils/adt/formatting.c:4325 +#: utils/adt/formatting.c:4500 #, c-format msgid "timestamptz out of range" msgstr "timestamptzã®ç¯„囲外ã§ã™" -#: utils/adt/formatting.c:4353 +#: utils/adt/formatting.c:4528 #, c-format msgid "datetime format is zoned but not timed" msgstr "datetimeãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã§æ™‚é–“å¸¯ã¯æŒ‡å®šã•れã¦ã„ã¾ã™ãŒã€æ™‚åˆ»ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/formatting.c:4411 +#: utils/adt/formatting.c:4577 #, c-format msgid "missing time zone in input string for type timetz" msgstr "timetzåž‹ã«å¯¾ã™ã‚‹å…¥åŠ›æ–‡å­—åˆ—ä¸­ã«æ™‚間帯ãŒã‚りã¾ã›ã‚“" -#: utils/adt/formatting.c:4417 +#: utils/adt/formatting.c:4583 #, c-format msgid "timetz out of range" msgstr "timetzã®ç¯„囲外ã§ã™" -#: utils/adt/formatting.c:4443 +#: utils/adt/formatting.c:4609 #, c-format msgid "datetime format is not dated and not timed" msgstr "datetimeãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã§æ—¥ä»˜ã¯æŒ‡å®šã•れã¦ã„ã¾ã™ãŒã€æ™‚é–“ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/formatting.c:4575 +#: utils/adt/formatting.c:4786 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "12時間形å¼ã§ã¯\"%d\"時ã¯ä¸æ­£ã§ã™" -#: utils/adt/formatting.c:4577 +#: utils/adt/formatting.c:4788 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "24時間形å¼ã‚’使ã†ã‹ã€ã‚‚ã—ã㯠1 ã‹ã‚‰ 12 ã®é–“ã§æŒ‡å®šã—ã¦ãã ã•ã„。" -#: utils/adt/formatting.c:4689 +#: utils/adt/formatting.c:4900 #, c-format msgid "cannot calculate day of year without year information" msgstr "å¹´ã®æƒ…å ±ãªã—ã§ã¯å¹´å†…ã®æ—¥æ•°ã¯è¨ˆç®—ã§ãã¾ã›ã‚“" -#: utils/adt/formatting.c:5621 +#: utils/adt/formatting.c:5852 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\"ã¯å…¥åŠ›ã¨ã—ã¦ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: utils/adt/formatting.c:5633 +#: utils/adt/formatting.c:5864 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\"ã¯å…¥åŠ›ã¨ã—ã¦ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" @@ -23753,12 +24727,7 @@ msgstr "ファイル\"%s\"をシークã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" msgid "file length too large" msgstr "ファイルãŒå¤§ãã™ãŽã¾ã™" -#: utils/adt/genfile.c:248 -#, c-format -msgid "must be superuser to read files with adminpack 1.0" -msgstr "adminpack 1.0 ã§ãƒ•ァイルを読ã¿è¾¼ã‚€ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" - -#: utils/adt/genfile.c:702 +#: utils/adt/genfile.c:656 #, c-format msgid "tablespace with OID %u does not exist" msgstr "OID %uã®ãƒ†ãƒ¼ãƒ–ル空間ã¯å­˜åœ¨ã—ã¾ã›ã‚“" @@ -23813,541 +24782,616 @@ msgstr "å°‘ãªãã¨ã‚‚2ãƒã‚¤ãƒ³ãƒˆã‚’è¦æ±‚ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" msgid "invalid int2vector data" msgstr "䏿­£ãªint2vectorデータ" -#: utils/adt/int.c:1529 utils/adt/int8.c:1404 utils/adt/numeric.c:1749 utils/adt/timestamp.c:5797 utils/adt/timestamp.c:5879 +#: utils/adt/int.c:1529 utils/adt/int8.c:1403 utils/adt/numeric.c:1765 utils/adt/timestamp.c:6546 utils/adt/timestamp.c:6632 #, c-format msgid "step size cannot equal zero" msgstr "ステップ数をゼロã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/int8.c:449 utils/adt/int8.c:472 utils/adt/int8.c:486 utils/adt/int8.c:500 utils/adt/int8.c:531 utils/adt/int8.c:555 utils/adt/int8.c:637 utils/adt/int8.c:705 utils/adt/int8.c:711 utils/adt/int8.c:737 utils/adt/int8.c:751 utils/adt/int8.c:775 utils/adt/int8.c:788 utils/adt/int8.c:900 utils/adt/int8.c:914 utils/adt/int8.c:928 utils/adt/int8.c:959 utils/adt/int8.c:981 utils/adt/int8.c:995 utils/adt/int8.c:1009 utils/adt/int8.c:1042 utils/adt/int8.c:1056 -#: utils/adt/int8.c:1070 utils/adt/int8.c:1101 utils/adt/int8.c:1123 utils/adt/int8.c:1137 utils/adt/int8.c:1151 utils/adt/int8.c:1313 utils/adt/int8.c:1348 utils/adt/numeric.c:4459 utils/adt/rangetypes.c:1528 utils/adt/rangetypes.c:1541 utils/adt/varbit.c:1676 +#: utils/adt/int8.c:448 utils/adt/int8.c:471 utils/adt/int8.c:485 utils/adt/int8.c:499 utils/adt/int8.c:530 utils/adt/int8.c:554 utils/adt/int8.c:636 utils/adt/int8.c:704 utils/adt/int8.c:710 utils/adt/int8.c:736 utils/adt/int8.c:750 utils/adt/int8.c:774 utils/adt/int8.c:787 utils/adt/int8.c:899 utils/adt/int8.c:913 utils/adt/int8.c:927 utils/adt/int8.c:958 utils/adt/int8.c:980 utils/adt/int8.c:994 utils/adt/int8.c:1008 utils/adt/int8.c:1041 utils/adt/int8.c:1055 +#: utils/adt/int8.c:1069 utils/adt/int8.c:1100 utils/adt/int8.c:1122 utils/adt/int8.c:1136 utils/adt/int8.c:1150 utils/adt/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4542 utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigintã®ç¯„囲外ã§ã™" -#: utils/adt/int8.c:1361 +#: utils/adt/int8.c:1360 #, c-format msgid "OID out of range" msgstr "OIDã®ç¯„囲外ã§ã™" -#: utils/adt/json.c:320 utils/adt/jsonb.c:781 +#: utils/adt/json.c:202 utils/adt/jsonb.c:664 #, c-format msgid "key value must be scalar, not array, composite, or json" msgstr "キー値ã¯é…列ã§ã‚‚複åˆåž‹ã§ã‚‚JSONã§ã‚‚ãªãã€ã‚¹ã‚«ãƒ©ã§ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: utils/adt/json.c:1113 utils/adt/json.c:1123 utils/fmgr/funcapi.c:2082 +#: utils/adt/json.c:1034 utils/adt/json.c:1044 utils/fmgr/funcapi.c:2090 #, c-format msgid "could not determine data type for argument %d" msgstr "引数%dã®ãƒ‡ãƒ¼ã‚¿åž‹ãŒç‰¹å®šã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/adt/json.c:1146 utils/adt/json.c:1337 utils/adt/json.c:1513 utils/adt/json.c:1591 utils/adt/jsonb.c:1432 utils/adt/jsonb.c:1522 +#: utils/adt/json.c:1067 utils/adt/json.c:1266 utils/adt/json.c:1449 utils/adt/json.c:1527 utils/adt/jsonb.c:1333 utils/adt/jsonb.c:1423 #, c-format msgid "null value not allowed for object key" msgstr "オブジェクトキーã«nullã¯ä½¿ãˆã¾ã›ã‚“" -#: utils/adt/json.c:1189 utils/adt/json.c:1352 +#: utils/adt/json.c:1117 utils/adt/json.c:1288 #, c-format -msgid "duplicate JSON key %s" -msgstr "é‡è¤‡ã—ãŸJSONキー %s" +msgid "duplicate JSON object key value: %s" +msgstr "JSONオブジェクトキー値ã®é‡è¤‡: %s" -#: utils/adt/json.c:1297 utils/adt/jsonb.c:1233 +#: utils/adt/json.c:1226 utils/adt/jsonb.c:1134 #, c-format msgid "argument list must have even number of elements" msgstr "引数リストã®è¦ç´ æ•°ã¯å¶æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" #. translator: %s is a SQL function name -#: utils/adt/json.c:1299 utils/adt/jsonb.c:1235 +#: utils/adt/json.c:1228 utils/adt/jsonb.c:1136 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "%s ã®å¼•æ•°ã§ã¯ã‚­ãƒ¼ã¨å€¤ãŒäº¤äº’ã«ãªã£ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: utils/adt/json.c:1491 utils/adt/jsonb.c:1410 +#: utils/adt/json.c:1427 utils/adt/jsonb.c:1311 #, c-format msgid "array must have two columns" msgstr "é…åˆ—ã¯æœ€ä½Žã§ã‚‚2ã¤ã®åˆ—ãŒå¿…è¦ã§ã™" -#: utils/adt/json.c:1580 utils/adt/jsonb.c:1511 +#: utils/adt/json.c:1516 utils/adt/jsonb.c:1412 #, c-format msgid "mismatched array dimensions" msgstr "é…åˆ—ã®æ¬¡å…ƒãŒåˆã£ã¦ã„ã¾ã›ã‚“" -#: utils/adt/json.c:1764 +#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1956 #, c-format msgid "duplicate JSON object key value" msgstr "JSONオブジェクトキー値ã®é‡è¤‡" -#: utils/adt/jsonb.c:294 +#: utils/adt/jsonb.c:282 #, c-format msgid "string too long to represent as jsonb string" msgstr "文字列ã¯jsonb文字列ã¨ã—ã¦è¡¨ç¾ã™ã‚‹ã«ã¯é•·ã™ãŽã¾ã™" -#: utils/adt/jsonb.c:295 +#: utils/adt/jsonb.c:283 #, c-format msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "実装上ã®åˆ¶ç´„ã®ãŸã‚ã€jsonb文字列ã¯%dãƒã‚¤ãƒˆã¾ã§ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: utils/adt/jsonb.c:1252 +#: utils/adt/jsonb.c:1153 #, c-format msgid "argument %d: key must not be null" msgstr "引数%d: キーã¯nullã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: utils/adt/jsonb.c:1843 +#: utils/adt/jsonb.c:1744 #, c-format msgid "field name must not be null" msgstr "フィールドåã¯nullã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: utils/adt/jsonb.c:1905 +#: utils/adt/jsonb.c:1806 #, c-format msgid "object keys must be strings" msgstr "オブエクã¨ã‚­ãƒ¼ã¯æ–‡å­—列ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: utils/adt/jsonb.c:2116 +#: utils/adt/jsonb.c:2017 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "jsonb null ã¯%såž‹ã«ã¯ã‚­ãƒ£ã‚¹ãƒˆã§ãã¾ã›ã‚“" -#: utils/adt/jsonb.c:2117 +#: utils/adt/jsonb.c:2018 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "jsonb文字列ã¯%såž‹ã¸ã¯ã‚­ãƒ£ã‚¹ãƒˆã§ãã¾ã›ã‚“" -#: utils/adt/jsonb.c:2118 +#: utils/adt/jsonb.c:2019 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "jsonb numericã¯%såž‹ã¸ã¯ã‚­ãƒ£ã‚¹ãƒˆã§ãã¾ã›ã‚“" -#: utils/adt/jsonb.c:2119 +#: utils/adt/jsonb.c:2020 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "jsonbブール型ã¯%såž‹ã¸ã¯ã‚­ãƒ£ã‚¹ãƒˆã§ãã¾ã›ã‚“" -#: utils/adt/jsonb.c:2120 +#: utils/adt/jsonb.c:2021 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "jsonbé…列ã¯%såž‹ã¸ã¯ã‚­ãƒ£ã‚¹ãƒˆã§ãã¾ã›ã‚“" -#: utils/adt/jsonb.c:2121 +#: utils/adt/jsonb.c:2022 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "jsonbオブジェクトã¯%såž‹ã¸ã¯ã‚­ãƒ£ã‚¹ãƒˆã§ãã¾ã›ã‚“" -#: utils/adt/jsonb.c:2122 +#: utils/adt/jsonb.c:2023 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "jsonbã®é…列ã¾ãŸã¯ã‚ªãƒ–ジェクトã¯%såž‹ã¸ã¯ã‚­ãƒ£ã‚¹ãƒˆã§ãã¾ã›ã‚“" -#: utils/adt/jsonb_util.c:758 +#: utils/adt/jsonb_util.c:756 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "jsonbオブジェクトペア数ãŒè¨±ã•ã‚ŒãŸæœ€å¤§ã®å€¤(%zu)を上回ã£ã¦ã„ã¾ã™" -#: utils/adt/jsonb_util.c:799 +#: utils/adt/jsonb_util.c:797 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "jsonbã®é…列è¦ç´ ã®æ•°ãŒè¨±ã•ã‚ŒãŸæœ€å¤§ã®å€¤(%zu)を上回ã£ã¦ã„ã¾ã™" -#: utils/adt/jsonb_util.c:1673 utils/adt/jsonb_util.c:1693 +#: utils/adt/jsonb_util.c:1671 utils/adt/jsonb_util.c:1691 #, c-format msgid "total size of jsonb array elements exceeds the maximum of %d bytes" msgstr "jsonbé…列全体ã®ã‚µã‚¤ã‚ºãŒæœ€å¤§å€¤%dãƒã‚¤ãƒˆã‚’è¶…ãˆã¦ã„ã¾ã™" -#: utils/adt/jsonb_util.c:1754 utils/adt/jsonb_util.c:1789 utils/adt/jsonb_util.c:1809 +#: utils/adt/jsonb_util.c:1752 utils/adt/jsonb_util.c:1787 utils/adt/jsonb_util.c:1807 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %d bytes" msgstr "jsonbオブジェクトè¦ç´ å…¨ä½“ã®ã‚µã‚¤ã‚ºãŒæœ€å¤§å€¤%dã‚’è¶…ãˆã¦ã„ã¾ã™" -#: utils/adt/jsonb_util.c:1958 -#, c-format -msgid "duplicate JSON object key" -msgstr "JSONオブジェクトキーã®é‡è¤‡" - -#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 +#: utils/adt/jsonbsubs.c:67 utils/adt/jsonbsubs.c:148 #, c-format msgid "jsonb subscript does not support slices" msgstr "jsonb添字ã¯ã‚¹ãƒ©ã‚¤ã‚¹ã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 +#: utils/adt/jsonbsubs.c:100 utils/adt/jsonbsubs.c:114 #, c-format msgid "subscript type %s is not supported" msgstr "添字型%sã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/jsonbsubs.c:104 +#: utils/adt/jsonbsubs.c:101 #, c-format msgid "jsonb subscript must be coercible to only one type, integer or text." msgstr "jsonbã®æ·»å­—ã¯å˜ä¸€ã®åž‹(integerã¾ãŸã¯text)ã«å¤‰æ›å¯èƒ½ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/jsonbsubs.c:118 +#: utils/adt/jsonbsubs.c:115 #, c-format msgid "jsonb subscript must be coercible to either integer or text." msgstr "jsonbã®æ·»å­—ã¯integerã¾ãŸã¯textã®ã„ãšã‚Œã‹ã«å¤‰æ›å¯èƒ½ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/jsonbsubs.c:139 +#: utils/adt/jsonbsubs.c:136 #, c-format msgid "jsonb subscript must have text type" msgstr "jsonb添字ã¯ãƒ†ã‚­ã‚¹ãƒˆåž‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/jsonbsubs.c:207 +#: utils/adt/jsonbsubs.c:204 #, c-format msgid "jsonb subscript in assignment must not be null" msgstr "代入ã«ãŠã‘ã‚‹jsonbæ·»ãˆå­—ã¯nullã«ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:572 utils/adt/jsonfuncs.c:821 utils/adt/jsonfuncs.c:2429 utils/adt/jsonfuncs.c:2881 utils/adt/jsonfuncs.c:3676 utils/adt/jsonfuncs.c:4018 +#: utils/adt/jsonfuncs.c:583 utils/adt/jsonfuncs.c:830 utils/adt/jsonfuncs.c:2439 utils/adt/jsonfuncs.c:3015 utils/adt/jsonfuncs.c:3948 utils/adt/jsonfuncs.c:4295 #, c-format msgid "cannot call %s on a scalar" msgstr "スカラã«å¯¾ã—ã¦%sを呼ã³å‡ºã™ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:577 utils/adt/jsonfuncs.c:806 utils/adt/jsonfuncs.c:2883 utils/adt/jsonfuncs.c:3663 +#: utils/adt/jsonfuncs.c:588 utils/adt/jsonfuncs.c:815 utils/adt/jsonfuncs.c:3017 utils/adt/jsonfuncs.c:3935 #, c-format msgid "cannot call %s on an array" msgstr "é…列ã«å¯¾ã—ã¦%sを呼ã³å‡ºã™ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:713 +#: utils/adt/jsonfuncs.c:724 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "JSONデータã€%d行目: %s%s%s" -#: utils/adt/jsonfuncs.c:1875 utils/adt/jsonfuncs.c:1912 +#: utils/adt/jsonfuncs.c:1883 utils/adt/jsonfuncs.c:1920 #, c-format msgid "cannot get array length of a scalar" msgstr "スカラã‹ã‚‰é…列長を得るã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:1879 utils/adt/jsonfuncs.c:1898 +#: utils/adt/jsonfuncs.c:1887 utils/adt/jsonfuncs.c:1906 #, c-format msgid "cannot get array length of a non-array" msgstr "é…列ã§ã¯ç„¡ã„ã‚‚ã®ã‹ã‚‰é…列長を得るã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:1978 +#: utils/adt/jsonfuncs.c:1986 #, c-format msgid "cannot call %s on a non-object" msgstr "éžã‚ªãƒ–ジェクトã«å¯¾ã—ã¦%sã¯å‘¼ã³å‡ºã›ã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:2166 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot deconstruct an array as an object" msgstr "é…列をオブジェクトã¨ã—ã¦å†æ§‹ç¯‰ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:2180 +#: utils/adt/jsonfuncs.c:2188 #, c-format msgid "cannot deconstruct a scalar" msgstr "ã‚¹ã‚«ãƒ©ã‚’å†æ§‹ç¯‰ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:2225 +#: utils/adt/jsonfuncs.c:2233 #, c-format msgid "cannot extract elements from a scalar" msgstr "スカラã‹ã‚‰è¦ç´ ã‚’å–り出ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:2229 +#: utils/adt/jsonfuncs.c:2237 #, c-format msgid "cannot extract elements from an object" msgstr "オブジェクトã‹ã‚‰è¦ç´ ã‚’å–り出ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:2414 utils/adt/jsonfuncs.c:3896 +#: utils/adt/jsonfuncs.c:2424 utils/adt/jsonfuncs.c:4173 #, c-format msgid "cannot call %s on a non-array" msgstr "éžé…列ã«å¯¾ã—ã¦%sを呼ã³å‡ºã™ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:2488 utils/adt/jsonfuncs.c:2493 utils/adt/jsonfuncs.c:2510 utils/adt/jsonfuncs.c:2516 +#: utils/adt/jsonfuncs.c:2515 utils/adt/jsonfuncs.c:2520 utils/adt/jsonfuncs.c:2538 utils/adt/jsonfuncs.c:2544 #, c-format msgid "expected JSON array" msgstr "JSONé…列を期待ã—ã¦ã„ã¾ã—ãŸ" -#: utils/adt/jsonfuncs.c:2489 +#: utils/adt/jsonfuncs.c:2516 #, c-format msgid "See the value of key \"%s\"." msgstr "キー\"%s\"ã®å€¤ã‚’見ã¦ãã ã•ã„。" -#: utils/adt/jsonfuncs.c:2511 +#: utils/adt/jsonfuncs.c:2539 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "キー\"%s\"ã®é…列è¦ç´ %sを見ã¦ãã ã•ã„。" -#: utils/adt/jsonfuncs.c:2517 +#: utils/adt/jsonfuncs.c:2545 #, c-format msgid "See the array element %s." msgstr "é…列è¦ç´ %sを見ã¦ãã ã•ã„。" -#: utils/adt/jsonfuncs.c:2552 +#: utils/adt/jsonfuncs.c:2597 #, c-format msgid "malformed JSON array" msgstr "䏿­£ãªå½¢å¼ã®JSONé…列" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3389 +#: utils/adt/jsonfuncs.c:3647 #, c-format msgid "first argument of %s must be a row type" msgstr "%sã®æœ€åˆã®å¼•æ•°ã¯è¡Œåž‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3413 +#: utils/adt/jsonfuncs.c:3671 #, c-format msgid "could not determine row type for result of %s" msgstr "%sã®çµæžœã«å¯¾å¿œã™ã‚‹è¡Œã®åž‹ã‚’決定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/adt/jsonfuncs.c:3415 +#: utils/adt/jsonfuncs.c:3673 #, c-format msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." msgstr "éžNULLã®ãƒ¬ã‚³ãƒ¼ãƒ‰å¼•数を与ãˆã‚‹ã‹ã€åˆ—定義リストを用ã„ã¦ã“ã®é–¢æ•°ã‚’FROMå¥ä¸­ã§å‘¼ã³å‡ºã—ã¦ãã ã•ã„。" -#: utils/adt/jsonfuncs.c:3785 utils/fmgr/funcapi.c:94 +#: utils/adt/jsonfuncs.c:4059 utils/fmgr/funcapi.c:94 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "マテリアライズモードãŒå¿…è¦ã§ã™ãŒã€ç¾åœ¨ã®ã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆã§ç¦æ­¢ã•れã¦ã„ã¾ã™" -#: utils/adt/jsonfuncs.c:3913 utils/adt/jsonfuncs.c:3997 +#: utils/adt/jsonfuncs.c:4190 utils/adt/jsonfuncs.c:4274 #, c-format msgid "argument of %s must be an array of objects" msgstr "%sã®å¼•æ•°ã¯ã‚ªãƒ–ジェクトé…列ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:3946 +#: utils/adt/jsonfuncs.c:4223 #, c-format msgid "cannot call %s on an object" msgstr "オブジェクトã«å¯¾ã—ã¦%sを呼ã³å‡ºã™ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:4380 utils/adt/jsonfuncs.c:4439 utils/adt/jsonfuncs.c:4519 +#: utils/adt/jsonfuncs.c:4656 utils/adt/jsonfuncs.c:4715 utils/adt/jsonfuncs.c:4795 #, c-format msgid "cannot delete from scalar" msgstr "スカラã‹ã‚‰å‰Šé™¤ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:4524 +#: utils/adt/jsonfuncs.c:4800 #, c-format msgid "cannot delete from object using integer index" msgstr "オブジェクトã‹ã‚‰æ•´æ•°æ·»å­—を使ã£ã¦å‰Šé™¤ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4751 +#: utils/adt/jsonfuncs.c:4868 utils/adt/jsonfuncs.c:5027 #, c-format msgid "cannot set path in scalar" msgstr "スカラã«ãƒ‘スを設定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:4633 utils/adt/jsonfuncs.c:4675 +#: utils/adt/jsonfuncs.c:4909 utils/adt/jsonfuncs.c:4951 #, c-format msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" msgstr "null_value_treatment 㯠\"delete_key\", \"return_target\", \"use_json_null\" ã¾ãŸã¯ \"raise_exception\"ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: utils/adt/jsonfuncs.c:4646 +#: utils/adt/jsonfuncs.c:4922 #, c-format msgid "JSON value must not be null" msgstr "JSON値ã¯nullã§ã¯ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:4647 +#: utils/adt/jsonfuncs.c:4923 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "null_value_treatmentãŒ\"raise_exception\"ã§ã‚ã‚‹ãŸã‚ã€ä¾‹å¤–ãŒå‡ºåŠ›ã•れã¾ã—ãŸ" -#: utils/adt/jsonfuncs.c:4648 +#: utils/adt/jsonfuncs.c:4924 #, c-format msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." msgstr "ã“れをé¿ã‘ã‚‹ã«ã¯ã€ null_value_treatment引数を変更ã™ã‚‹ã‹ã€SQLã®NULLを渡ã•ãªã„よã†ã«ã—ã¦ãã ã•ã„。" -#: utils/adt/jsonfuncs.c:4703 +#: utils/adt/jsonfuncs.c:4979 #, c-format msgid "cannot delete path in scalar" msgstr "スカラã§ãƒ‘スを削除ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:4917 +#: utils/adt/jsonfuncs.c:5193 #, c-format msgid "path element at position %d is null" msgstr "ä½ç½®%dã®ãƒ‘スè¦ç´ ãŒnullã§ã™" -#: utils/adt/jsonfuncs.c:4936 utils/adt/jsonfuncs.c:4967 utils/adt/jsonfuncs.c:5040 +#: utils/adt/jsonfuncs.c:5212 utils/adt/jsonfuncs.c:5243 utils/adt/jsonfuncs.c:5316 #, c-format msgid "cannot replace existing key" msgstr "既存ã®ã‚­ãƒ¼ã‚’ç½®ãæ›ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:4937 utils/adt/jsonfuncs.c:4968 +#: utils/adt/jsonfuncs.c:5213 utils/adt/jsonfuncs.c:5244 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." msgstr "ã“ã®ãƒ‘スã§ã¯ã‚­ãƒ¼å€¤ã¯è¤‡åˆã‚ªãƒ–ジェクトã§ã‚ã‚‹ã¨æƒ³å®šã—ã¦ã„ã¾ã™ãŒã€ã‚¹ã‚«ãƒ©ãƒ¼å€¤ã§ã—ãŸ" -#: utils/adt/jsonfuncs.c:5041 +#: utils/adt/jsonfuncs.c:5317 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "jsonb_set関数を使ã£ã¦ã‚­ãƒ¼å€¤ã‚’ç½®ãæ›ãˆã‚‹ã“ã¨ã‚’試ã—ã¦ãã ã•ã„。" -#: utils/adt/jsonfuncs.c:5145 +#: utils/adt/jsonfuncs.c:5421 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "ä½ç½®%dã®ãƒ‘スè¦ç´ ãŒæ•´æ•°ã§ã¯ã‚りã¾ã›ã‚“: \"%s\"" -#: utils/adt/jsonfuncs.c:5162 +#: utils/adt/jsonfuncs.c:5438 #, c-format msgid "path element at position %d is out of range: %d" msgstr "ä½ç½®%dã®ãƒ‘スè¦ç´ ã¯ç¯„囲外ã§ã™: %d" -#: utils/adt/jsonfuncs.c:5314 +#: utils/adt/jsonfuncs.c:5590 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "é–“é•ã£ãŸãƒ•ラグã®ã‚¿ã‚¤ãƒ—; é…列ãŠã‚ˆã³ã‚¹ã‚«ãƒ©ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™" -#: utils/adt/jsonfuncs.c:5321 +#: utils/adt/jsonfuncs.c:5597 #, c-format msgid "flag array element is not a string" msgstr "フラグé…列ã®è¦ç´ ãŒæ–‡å­—列ã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/jsonfuncs.c:5322 utils/adt/jsonfuncs.c:5344 +#: utils/adt/jsonfuncs.c:5598 utils/adt/jsonfuncs.c:5620 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "使用å¯èƒ½ãªå€¤ã¯: \"string\", \"numeric\", \"boolean\", \"key\"ã€ãŠã‚ˆã³ \"all\"。" -#: utils/adt/jsonfuncs.c:5342 +#: utils/adt/jsonfuncs.c:5618 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "フラグé…列内ã®é–“é•ã£ãŸãƒ•ラグ値: \"%s\"" -#: utils/adt/jsonpath.c:382 +#: utils/adt/jsonpath.c:389 #, c-format msgid "@ is not allowed in root expressions" msgstr "ルートå¼ã§ã¯@を使用ã§ãã¾ã›ã‚“" -#: utils/adt/jsonpath.c:388 +#: utils/adt/jsonpath.c:395 #, c-format msgid "LAST is allowed only in array subscripts" msgstr "LAST ã¯é…åˆ—ã®æ·»ãˆå­—ã§ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™" -#: utils/adt/jsonpath_exec.c:361 +#: utils/adt/jsonpath_exec.c:491 #, c-format msgid "single boolean result is expected" msgstr "å˜ä¸€ã®ãƒ–ール値ã®çµæžœãŒå¿…è¦ã§ã™" -#: utils/adt/jsonpath_exec.c:557 +#: utils/adt/jsonpath_exec.c:851 #, c-format -msgid "\"vars\" argument is not an object" -msgstr "引数\"vars\"ãŒã‚ªãƒ–ジェクトã§ã¯ã‚りã¾ã›ã‚“" +msgid "jsonpath wildcard array accessor can only be applied to an array" +msgstr "jsonpath ワイルドカードé…列アクセサã¯é…列ã«ã®ã¿é©ç”¨å¯èƒ½ã§ã™" -#: utils/adt/jsonpath_exec.c:558 +#: utils/adt/jsonpath_exec.c:874 #, c-format -msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." -msgstr "Jsonpath パラメータ㯠\"vars\"オブジェクト㮠key-value ペアã®å½¢ã«ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•れã¦ã„ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" +msgid "jsonpath wildcard member accessor can only be applied to an object" +msgstr "jsonpathワイルドカードメンãƒã‚¢ã‚¯ã‚»ã‚µã¯ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ã®ã¿é©ç”¨å¯èƒ½ã§ã™" + +#: utils/adt/jsonpath_exec.c:923 +#, c-format +msgid "jsonpath array subscript is out of bounds" +msgstr "jsonpathé…åˆ—ã®æ·»ãˆå­—ãŒç¯„囲外ã§ã™" -#: utils/adt/jsonpath_exec.c:675 +#: utils/adt/jsonpath_exec.c:980 +#, c-format +msgid "jsonpath array accessor can only be applied to an array" +msgstr "jsonpath é…列アクセサã¯é…列ã«ã®ã¿é©ç”¨å¯èƒ½ã§ã™" + +#: utils/adt/jsonpath_exec.c:1044 #, c-format msgid "JSON object does not contain key \"%s\"" msgstr "JSONオブジェクトã¯ã‚­ãƒ¼\"%s\"ã‚’å«ã‚“ã§ã„ã¾ã›ã‚“" -#: utils/adt/jsonpath_exec.c:687 +#: utils/adt/jsonpath_exec.c:1056 #, c-format msgid "jsonpath member accessor can only be applied to an object" msgstr "jsonpathメンãƒã‚¢ã‚¯ã‚»ã‚µã¯ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ã®ã¿é©ç”¨å¯èƒ½ã§ã™" -#: utils/adt/jsonpath_exec.c:716 +#: utils/adt/jsonpath_exec.c:1114 #, c-format -msgid "jsonpath wildcard array accessor can only be applied to an array" -msgstr "jsonpath ワイルドカードé…列アクセサã¯é…列ã«ã®ã¿é©ç”¨å¯èƒ½ã§ã™" +msgid "jsonpath item method .%s() can only be applied to an array" +msgstr "jsonpath 項目メソッド .%s() ã¯é…列ã«ã®ã¿é©ç”¨å¯èƒ½ã§ã™" -#: utils/adt/jsonpath_exec.c:764 +#: utils/adt/jsonpath_exec.c:1167 utils/adt/jsonpath_exec.c:1193 #, c-format -msgid "jsonpath array subscript is out of bounds" -msgstr "jsonpathé…åˆ—ã®æ·»ãˆå­—ãŒç¯„囲外ã§ã™" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type double precision" +msgstr "jsonpath項目メソッド .%2$s() ã®å¼•æ•°\"%1$s\"ãŒdouble precisionåž‹ã«é©åˆã—ã¾ã›ã‚“" -#: utils/adt/jsonpath_exec.c:821 +#: utils/adt/jsonpath_exec.c:1172 utils/adt/jsonpath_exec.c:1198 utils/adt/jsonpath_exec.c:1414 utils/adt/jsonpath_exec.c:1446 #, c-format -msgid "jsonpath array accessor can only be applied to an array" -msgstr "jsonpath é…列アクセサã¯é…列ã«ã®ã¿é©ç”¨å¯èƒ½ã§ã™" +msgid "NaN or Infinity is not allowed for jsonpath item method .%s()" +msgstr "NaNã¨Inifinityã¯jsonpath項目メソッド .%s() ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: utils/adt/jsonpath_exec.c:873 +#: utils/adt/jsonpath_exec.c:1211 utils/adt/jsonpath_exec.c:1313 utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1593 #, c-format -msgid "jsonpath wildcard member accessor can only be applied to an object" -msgstr "jsonpathワイルドカードメンãƒã‚¢ã‚¯ã‚»ã‚µã¯ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ã®ã¿é©ç”¨å¯èƒ½ã§ã™" +msgid "jsonpath item method .%s() can only be applied to a string or numeric value" +msgstr "jsonpath 項目メソッド .%s() ã¯æ–‡å­—列ã¾ãŸã¯æ•°å€¤ã«ã®ã¿é©ç”¨å¯èƒ½ã§ã™" -#: utils/adt/jsonpath_exec.c:1007 +#: utils/adt/jsonpath_exec.c:1281 utils/adt/jsonpath_exec.c:1305 #, c-format -msgid "jsonpath item method .%s() can only be applied to an array" -msgstr "jsonpath 項目メソッド .%s() ã¯é…列ã«ã®ã¿é©ç”¨å¯èƒ½ã§ã™" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type bigint" +msgstr "jsonpath項目メソッド .%2$s() ã®å¼•æ•°\"%1$s\"ãŒbigintåž‹ã«é©åˆã—ã¾ã›ã‚“" -#: utils/adt/jsonpath_exec.c:1060 +#: utils/adt/jsonpath_exec.c:1357 utils/adt/jsonpath_exec.c:1377 #, c-format -msgid "numeric argument of jsonpath item method .%s() is out of range for type double precision" -msgstr "JSONパス項目メソッド .%s() ã®numericåž‹ã®å¼•æ•°ãŒdouble precisionã®ç¯„囲外ã§ã™" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type boolean" +msgstr "jsonpath項目メソッド .%2$s() ã®å¼•æ•°\"%1$s\"ãŒbooleanåž‹ã«é©åˆã—ã¾ã›ã‚“" -#: utils/adt/jsonpath_exec.c:1081 +#: utils/adt/jsonpath_exec.c:1386 #, c-format -msgid "string argument of jsonpath item method .%s() is not a valid representation of a double precision number" -msgstr "jsonpath項目メソッド .%s() ã®æ–‡å­—åˆ—å¼•æ•°ã¯æœ‰åйãªå€ç²¾åº¦æ•°è¡¨ç¾ã§ã¯ã‚りã¾ã›ã‚“" +msgid "jsonpath item method .%s() can only be applied to a boolean, string, or numeric value" +msgstr "jsonpath 項目メソッド .%s() ã¯çœŸå½å€¤ã€æ–‡å­—列ã¾ãŸã¯æ•°å€¤ã«ã®ã¿é©ç”¨å¯èƒ½ã§ã™" -#: utils/adt/jsonpath_exec.c:1094 +#: utils/adt/jsonpath_exec.c:1439 utils/adt/jsonpath_exec.c:1528 #, c-format -msgid "jsonpath item method .%s() can only be applied to a string or numeric value" -msgstr "jsonpath 項目メソッド .%s() ã¯æ–‡å­—列ã¾ãŸã¯æ•°å€¤ã«ã®ã¿é©ç”¨å¯èƒ½ã§ã™" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type numeric" +msgstr "jsonpath項目メソッド .%2$s() ã®å¼•æ•°\"%1$s\"ãŒnumericåž‹ã«é©åˆã—ã¾ã›ã‚“" + +#: utils/adt/jsonpath_exec.c:1487 +#, c-format +msgid "precision of jsonpath item method .%s() is out of range for type integer" +msgstr "JSONパス項目メソッド .%s() ã®ç²¾åº¦ãŒintegeråž‹ã®ç¯„囲外ã§ã™" + +#: utils/adt/jsonpath_exec.c:1501 +#, c-format +msgid "scale of jsonpath item method .%s() is out of range for type integer" +msgstr "JSONパス項目メソッド .%s() ã®ã‚¹ã‚±ãƒ¼ãƒ«ãŒintegeråž‹ã®ç¯„囲外ã§ã™" -#: utils/adt/jsonpath_exec.c:1584 +#: utils/adt/jsonpath_exec.c:1561 utils/adt/jsonpath_exec.c:1585 +#, c-format +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type integer" +msgstr "jsonpath項目メソッド .%2$s() ã®å¼•æ•°\"%1$s\"ãŒintegeråž‹ã«é©åˆã—ã¾ã›ã‚“" + +#: utils/adt/jsonpath_exec.c:1648 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a boolean, string, numeric, or datetime value" +msgstr "jsonpath 項目メソッド .%s() ã¯çœŸå½å€¤ã€æ–‡å­—åˆ—ã€æ•°å€¤ã€ã¾ãŸã¯æ—¥æ™‚値ã«ã®ã¿é©ç”¨å¯èƒ½ã§ã™" + +#: utils/adt/jsonpath_exec.c:2137 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "jsonpathæ¼”ç®—å­ %s ã®å·¦è¾ºå€¤ãŒå˜ä¸€ã®æ•°å€¤ã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/jsonpath_exec.c:1591 +#: utils/adt/jsonpath_exec.c:2144 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "jsonpathæ¼”ç®—å­ %s ã®å³è¾ºå€¤ãŒå˜ä¸€ã®æ•°å€¤ã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/jsonpath_exec.c:1659 +#: utils/adt/jsonpath_exec.c:2212 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "å˜é …jsonpathæ¼”ç®—å­ %s ã®ã‚ªãƒšãƒ©ãƒ³ãƒ‰ãŒæ•°å€¤ã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/jsonpath_exec.c:1758 +#: utils/adt/jsonpath_exec.c:2311 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "jsonpath 項目メソッド .%s() ã¯æ•°å€¤ã«ã®ã¿é©ç”¨å¯èƒ½ã§ã™" -#: utils/adt/jsonpath_exec.c:1798 +#: utils/adt/jsonpath_exec.c:2357 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "jsonpath 項目メソッド .%s() ã¯æ–‡å­—列ã«ã®ã¿é©ç”¨å¯èƒ½ã§ã™" -#: utils/adt/jsonpath_exec.c:1901 +#: utils/adt/jsonpath_exec.c:2450 #, c-format -msgid "datetime format is not recognized: \"%s\"" -msgstr "datetime書å¼ã‚’èªè­˜ã§ãã¾ã›ã‚“: \"%s\"" +msgid "time precision of jsonpath item method .%s() is out of range for type integer" +msgstr "JSONパス項目メソッド .%s() ã®æ—¥ä»˜æ™‚刻精度ãŒintegeråž‹ã®ç¯„囲外ã§ã™" -#: utils/adt/jsonpath_exec.c:1903 +#: utils/adt/jsonpath_exec.c:2484 utils/adt/jsonpath_exec.c:2490 utils/adt/jsonpath_exec.c:2517 utils/adt/jsonpath_exec.c:2545 utils/adt/jsonpath_exec.c:2598 utils/adt/jsonpath_exec.c:2649 utils/adt/jsonpath_exec.c:2720 +#, c-format +msgid "%s format is not recognized: \"%s\"" +msgstr "%sã®æ›¸å¼ã‚’èªè­˜ã§ãã¾ã›ã‚“: \"%s\"" + +#: utils/adt/jsonpath_exec.c:2486 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "datetimeテンプレート引数を使ã£ã¦å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚’æŒ‡å®šã—ã¦ãã ã•ã„。" -#: utils/adt/jsonpath_exec.c:1971 +#: utils/adt/jsonpath_exec.c:2679 utils/adt/jsonpath_exec.c:2760 +#, c-format +msgid "time precision of jsonpath item method .%s() is invalid" +msgstr "jsonpath項目メソッド .%s() ã®æ—¥ä»˜æ™‚刻精度ãŒä¸æ­£ã§ã™" + +#: utils/adt/jsonpath_exec.c:2840 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "jsonpath項目メソッド .%s() ã¯ã‚ªãƒ–ジェクトã«å¯¾ã—ã¦ã®ã¿é©ç”¨å¯èƒ½ã§ã™" -#: utils/adt/jsonpath_exec.c:2153 +#: utils/adt/jsonpath_exec.c:3124 +#, c-format +msgid "could not convert value of type %s to jsonpath" +msgstr "åž‹%sã®å€¤ã®jsonpathã¸å¤‰æ›ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: utils/adt/jsonpath_exec.c:3158 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "jsonpath変数\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: utils/adt/jsonpath_exec.c:2417 +#: utils/adt/jsonpath_exec.c:3211 +#, c-format +msgid "\"vars\" argument is not an object" +msgstr "引数\"vars\"ãŒã‚ªãƒ–ジェクトã§ã¯ã‚りã¾ã›ã‚“" + +#: utils/adt/jsonpath_exec.c:3212 +#, c-format +msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +msgstr "Jsonpath パラメータ㯠\"vars\"オブジェクト㮠key-value ペアã®å½¢ã«ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•れã¦ã„ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" + +#: utils/adt/jsonpath_exec.c:3475 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "jsonpathé…列添ãˆå­—ãŒå˜ä¸€ã®æ•°å€¤ã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/jsonpath_exec.c:2429 +#: utils/adt/jsonpath_exec.c:3487 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "jsonpathé…åˆ—ã®æ·»ãˆå­—ãŒæ•´æ•°ã®ç¯„囲外ã§ã™" -#: utils/adt/jsonpath_exec.c:2606 +#: utils/adt/jsonpath_exec.c:3671 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "時間帯を使用ã›ãšã«%sã‹ã‚‰%sã¸ã®å€¤ã®å¤‰æ›ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/jsonpath_exec.c:2608 +#: utils/adt/jsonpath_exec.c:3673 #, c-format msgid "Use *_tz() function for time zone support." msgstr "*_tz() 関数を使用ã™ã‚‹ã“ã¨ã§æ™‚間帯ãŒã‚µãƒãƒ¼ãƒˆã•れã¾ã™ã€‚" +#: utils/adt/jsonpath_exec.c:3981 +#, c-format +msgid "JSON path expression for column \"%s\" must return single item when no wrapper is requested" +msgstr "ラッパーãŒè¦æ±‚ã•れã¦ã„ãªã„å ´åˆã¯ã€åˆ—\"%s\"ã«å¯¾ã™ã‚‹JSONパスå¼ã¯å˜ä¸€è¦ç´ ã‚’è¿”å´ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" + +#: utils/adt/jsonpath_exec.c:3983 utils/adt/jsonpath_exec.c:3988 +#, c-format +msgid "Use the WITH WRAPPER clause to wrap SQL/JSON items into an array." +msgstr "SQL/JSONè¦ç´ åˆ—ã‚’é…列ã«ã¾ã¨ã‚ã‚‹ã«ã¯WITH WRAPPERå¥ã‚’使用ã—ã¦ãã ã•ã„。" + +#: utils/adt/jsonpath_exec.c:3987 +#, c-format +msgid "JSON path expression in JSON_QUERY must return single item when no wrapper is requested" +msgstr "ラッパーãŒè¦æ±‚ã•れã¦ã„ãªã„å ´åˆã¯ã€JSON_QUERY中ã®JSONパスå¼ã¯å˜ä¸€è¦ç´ ã‚’è¿”å´ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" + +#: utils/adt/jsonpath_exec.c:4045 utils/adt/jsonpath_exec.c:4069 +#, c-format +msgid "JSON path expression for column \"%s\" must return single scalar item" +msgstr "列\"%s\"ã«å¯¾ã™ã‚‹JSONパスå¼ã¯å˜ä¸€ã®ã‚¹ã‚«ãƒ©ãƒ¼è¦ç´ ã‚’è¿”å´ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" + +#: utils/adt/jsonpath_exec.c:4050 utils/adt/jsonpath_exec.c:4074 +#, c-format +msgid "JSON path expression in JSON_VALUE must return single scalar item" +msgstr "JSON_VALUE中ã®JSONパスå¼ã¯å˜ä¸€ã®ã‚¹ã‚«ãƒ©ãƒ¼è¦ç´ ã‚’è¿”å´ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" + #: utils/adt/levenshtein.c:132 #, c-format msgid "levenshtein argument exceeds maximum length of %d characters" msgstr "レーベンシュタインè·é›¢é–¢æ•°ã®å¼•æ•°ã®é•·ã•ãŒä¸Šé™ã®%d文字を超ãˆã¦ã„ã¾ã™" -#: utils/adt/like.c:161 +#: utils/adt/like.c:159 #, c-format msgid "nondeterministic collations are not supported for LIKE" msgstr "éžæ±ºå®šçš„ç…§åˆé †åºã¯LIKEã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: utils/adt/like.c:190 utils/adt/like_support.c:1024 +#: utils/adt/like.c:188 utils/adt/like_support.c:1023 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "ILIKE ã§ä½¿ç”¨ã™ã‚‹ç…§åˆé †åºã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/adt/like.c:202 +#: utils/adt/like.c:200 #, c-format msgid "nondeterministic collations are not supported for ILIKE" msgstr "éžæ±ºå®šçš„ç…§åˆé †åºã¯ILIKEã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" @@ -24357,22 +25401,22 @@ msgstr "éžæ±ºå®šçš„ç…§åˆé †åºã¯ILIKEã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" msgid "LIKE pattern must not end with escape character" msgstr "LIKE パターンã¯ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—文字ã§çµ‚ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:801 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:800 #, c-format msgid "invalid escape string" msgstr "䏿­£ãªã‚¨ã‚¹ã‚±ãƒ¼ãƒ—文字列" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:802 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:801 #, c-format msgid "Escape string must be empty or one character." msgstr "エスケープ文字ã¯ç©ºã‹1文字ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/like_support.c:1014 +#: utils/adt/like_support.c:1013 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "åž‹byteaã§ã¯å¤§æ–‡å­—å°æ–‡å­—ã®åŒºåˆ¥ã‚’ã—ãªã„マッãƒã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: utils/adt/like_support.c:1115 +#: utils/adt/like_support.c:1114 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "åž‹byteaã§ã¯æ­£è¦è¡¨ç¾ã®ãƒžãƒƒãƒã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" @@ -24382,17 +25426,17 @@ msgstr "åž‹byteaã§ã¯æ­£è¦è¡¨ç¾ã®ãƒžãƒƒãƒã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "\"macaddr\"ã®å€¤ã§ã®ä¸æ­£ãªã‚ªã‚¯ãƒ†ãƒƒãƒˆå€¤: \"%s\"" -#: utils/adt/mac8.c:554 +#: utils/adt/mac8.c:555 #, c-format msgid "macaddr8 data out of range to convert to macaddr" msgstr "macaddr8データãŒmacaddråž‹ã«å¤‰æ›ã™ã‚‹ã«ã¯ç¯„囲外ã§ã™" -#: utils/adt/mac8.c:555 +#: utils/adt/mac8.c:556 #, c-format msgid "Only addresses that have FF and FE as values in the 4th and 5th bytes from the left, for example xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted from macaddr8 to macaddr." msgstr "å·¦ã‹ã‚‰4ã€5ãƒã‚¤ãƒˆç›®ã«FFã¨FEãŒã‚るアドレスã€å…·ä½“çš„ã«ã¯ xx:xx:xx:ff:fe:xx:xx:xx ã®ã¿ãŒmacaddr8ã‹ã‚‰macaddrã«å¤‰æ›ã§ãã¾ã™ã€‚" -#: utils/adt/mcxtfuncs.c:182 +#: utils/adt/mcxtfuncs.c:173 #, c-format msgid "PID %d is not a PostgreSQL server process" msgstr "PID %dã¯PostgreSQLサーãƒãƒ¼ãƒ—ロセスã§ã¯ã‚りã¾ã›ã‚“" @@ -24431,67 +25475,67 @@ msgstr "ASã¯çœç•¥å¯" msgid "requires AS" msgstr "ASãŒå¿…è¦" -#: utils/adt/misc.c:853 utils/adt/misc.c:867 utils/adt/misc.c:906 utils/adt/misc.c:912 utils/adt/misc.c:918 utils/adt/misc.c:941 +#: utils/adt/misc.c:897 utils/adt/misc.c:911 utils/adt/misc.c:950 utils/adt/misc.c:956 utils/adt/misc.c:962 utils/adt/misc.c:985 #, c-format msgid "string is not a valid identifier: \"%s\"" msgstr "æ–‡å­—åˆ—ã¯æœ‰åйãªè­˜åˆ¥å­ã§ã¯ã‚りã¾ã›ã‚“: \"%s\"" -#: utils/adt/misc.c:855 +#: utils/adt/misc.c:899 #, c-format msgid "String has unclosed double quotes." msgstr "文字列中ã«é–‰ã˜ã‚‰ã‚Œã¦ã„ãªã„二é‡å¼•用符ãŒã‚りã¾ã™ã€‚" -#: utils/adt/misc.c:869 +#: utils/adt/misc.c:913 #, c-format msgid "Quoted identifier must not be empty." msgstr "引用符ã§å›²ã¾ã‚ŒãŸè­˜åˆ¥å­ã¯ç©ºã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/misc.c:908 +#: utils/adt/misc.c:952 #, c-format msgid "No valid identifier before \".\"." msgstr "\".\"ã®å‰ã«æœ‰åйãªè­˜åˆ¥å­ãŒã‚りã¾ã›ã‚“。" -#: utils/adt/misc.c:914 +#: utils/adt/misc.c:958 #, c-format msgid "No valid identifier after \".\"." msgstr "\".\"ã®å¾Œã«æœ‰åйãªè­˜åˆ¥å­ãŒã‚りã¾ã›ã‚“。" -#: utils/adt/misc.c:974 +#: utils/adt/misc.c:1018 #, c-format msgid "log format \"%s\" is not supported" msgstr "ログ形å¼\"%s\"ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/misc.c:975 +#: utils/adt/misc.c:1019 #, c-format msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." msgstr "サãƒãƒ¼ãƒˆã•れã¦ã„るログ形å¼ã¯\"stderr\"ã€\"csvlog\"ã€ãã—ã¦\"jsonlog\"ã§ã™ã€‚" -#: utils/adt/multirangetypes.c:151 utils/adt/multirangetypes.c:164 utils/adt/multirangetypes.c:193 utils/adt/multirangetypes.c:267 utils/adt/multirangetypes.c:291 +#: utils/adt/multirangetypes.c:150 utils/adt/multirangetypes.c:163 utils/adt/multirangetypes.c:192 utils/adt/multirangetypes.c:266 utils/adt/multirangetypes.c:290 #, c-format msgid "malformed multirange literal: \"%s\"" msgstr "䏿­£ãªè¤‡ç¯„囲リテラル: \"%s\"" -#: utils/adt/multirangetypes.c:153 +#: utils/adt/multirangetypes.c:152 #, c-format msgid "Missing left brace." msgstr "左大括弧ãŒã‚りã¾ã›ã‚“" -#: utils/adt/multirangetypes.c:195 +#: utils/adt/multirangetypes.c:194 #, c-format msgid "Expected range start." msgstr "範囲ã®é–‹å§‹ã‚’予期ã—ã¦ã„ã¾ã—ãŸã€‚" -#: utils/adt/multirangetypes.c:269 +#: utils/adt/multirangetypes.c:268 #, c-format msgid "Expected comma or end of multirange." msgstr "カンマã¾ãŸã¯è¤‡ç¯„囲ã®çµ‚了を予期ã—ã¦ã„ã¾ã—ãŸã€‚" -#: utils/adt/multirangetypes.c:982 +#: utils/adt/multirangetypes.c:981 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "複範囲型ã¯å¤šæ¬¡å…ƒé…列ã‹ã‚‰ã¯ç”Ÿæˆã§ãã¾ã›ã‚“" -#: utils/adt/multirangetypes.c:1008 +#: utils/adt/multirangetypes.c:1007 #, c-format msgid "multirange values cannot contain null members" msgstr "複範囲値ã¯nullã®è¦ç´ ã‚’æŒã¦ã¾ã›ã‚“" @@ -24569,107 +25613,132 @@ msgstr "çµæžœãŒç¯„囲外ã§ã™" msgid "cannot subtract inet values of different sizes" msgstr "サイズãŒç•°ãªã‚‹inet値ã®å¼•ãç®—ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/numeric.c:785 utils/adt/numeric.c:3643 utils/adt/numeric.c:7131 utils/adt/numeric.c:7334 utils/adt/numeric.c:7806 utils/adt/numeric.c:10501 utils/adt/numeric.c:10975 utils/adt/numeric.c:11069 utils/adt/numeric.c:11203 +#: utils/adt/numeric.c:793 utils/adt/numeric.c:3659 utils/adt/numeric.c:7216 utils/adt/numeric.c:7419 utils/adt/numeric.c:7891 utils/adt/numeric.c:10586 utils/adt/numeric.c:11061 utils/adt/numeric.c:11155 utils/adt/numeric.c:11290 #, c-format msgid "value overflows numeric format" msgstr "値ãŒnumericã®å½¢å¼ã§ã‚ªãƒ¼ãƒãƒ•ローã—ã¾ã™" -#: utils/adt/numeric.c:1098 +#: utils/adt/numeric.c:1106 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "外部\"numeric\"ã®å€¤ã®ç¬¦å·ãŒä¸æ­£ã§ã™" -#: utils/adt/numeric.c:1104 +#: utils/adt/numeric.c:1112 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "外部\"numeric\"ã®å€¤ã®ä½å–りãŒä¸æ­£ã§ã™" -#: utils/adt/numeric.c:1113 +#: utils/adt/numeric.c:1121 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "外部\"numeric\"ã®å€¤ã®æ¡ãŒä¸æ­£ã§ã™" -#: utils/adt/numeric.c:1328 utils/adt/numeric.c:1342 +#: utils/adt/numeric.c:1336 utils/adt/numeric.c:1350 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "NUMERICã®ç²¾åº¦%dã¯1ã‹ã‚‰%dã¾ã§ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/numeric.c:1333 +#: utils/adt/numeric.c:1341 #, c-format msgid "NUMERIC scale %d must be between %d and %d" msgstr "NUMERICã®ä½å–り%dã¯%dã‹ã‚‰%dã¾ã§ã®é–“ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/numeric.c:1351 +#: utils/adt/numeric.c:1359 #, c-format msgid "invalid NUMERIC type modifier" msgstr "䏿­£ãªNUMERICåž‹ã®ä¿®æ­£å­" -#: utils/adt/numeric.c:1709 +#: utils/adt/numeric.c:1725 #, c-format msgid "start value cannot be NaN" msgstr "開始値ã¯NaNã«ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/numeric.c:1713 +#: utils/adt/numeric.c:1729 #, c-format msgid "start value cannot be infinity" msgstr "開始値ã¯ç„¡é™å¤§ã«ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/numeric.c:1720 +#: utils/adt/numeric.c:1736 #, c-format msgid "stop value cannot be NaN" msgstr "終了値ã¯NaNã«ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/numeric.c:1724 +#: utils/adt/numeric.c:1740 #, c-format msgid "stop value cannot be infinity" msgstr "終了値ã¯ç„¡é™å¤§ã«ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/numeric.c:1737 +#: utils/adt/numeric.c:1753 #, c-format msgid "step size cannot be NaN" msgstr "加算é‡ã¯NaNã«ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/numeric.c:1741 +#: utils/adt/numeric.c:1757 #, c-format msgid "step size cannot be infinity" msgstr "加算é‡ã¯ç„¡é™å¤§ã«ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/numeric.c:3633 +#: utils/adt/numeric.c:3649 #, c-format msgid "factorial of a negative number is undefined" msgstr "è² æ•°ã®éšŽä¹—ã¯å®šç¾©ã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/numeric.c:4366 utils/adt/numeric.c:4446 utils/adt/numeric.c:4487 utils/adt/numeric.c:4683 +#: utils/adt/numeric.c:4256 +#, c-format +msgid "lower bound cannot be NaN" +msgstr "下é™ã‚’NaNã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: utils/adt/numeric.c:4260 +#, c-format +msgid "lower bound cannot be infinity" +msgstr "下é™ã‚’ç„¡é™å€¤ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: utils/adt/numeric.c:4267 +#, c-format +msgid "upper bound cannot be NaN" +msgstr "上é™ã‚’NaNã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: utils/adt/numeric.c:4271 +#, c-format +msgid "upper bound cannot be infinity" +msgstr "上é™ã‚’ç„¡é™å€¤ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: utils/adt/numeric.c:4432 utils/adt/numeric.c:4520 utils/adt/numeric.c:4580 utils/adt/numeric.c:4776 #, c-format msgid "cannot convert NaN to %s" msgstr "NaNã‚’%sã«ã¯å¤‰æ›ã§ãã¾ã›ã‚“" -#: utils/adt/numeric.c:4370 utils/adt/numeric.c:4450 utils/adt/numeric.c:4491 utils/adt/numeric.c:4687 +#: utils/adt/numeric.c:4436 utils/adt/numeric.c:4524 utils/adt/numeric.c:4584 utils/adt/numeric.c:4780 #, c-format msgid "cannot convert infinity to %s" msgstr "ç„¡é™å¤§ã‚’%sã«å¤‰æ›ã§ãã¾ã›ã‚“" -#: utils/adt/numeric.c:4696 +#: utils/adt/numeric.c:4789 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsnã®ç¯„囲外ã§ã™" -#: utils/adt/numeric.c:7896 utils/adt/numeric.c:7947 +#: utils/adt/numeric.c:7981 utils/adt/numeric.c:8032 #, c-format msgid "numeric field overflow" msgstr "numericフィールドã®ã‚ªãƒ¼ãƒãƒ¼ãƒ•ロー" -#: utils/adt/numeric.c:7897 +#: utils/adt/numeric.c:7982 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "精度%dã€ä½å–り%dã‚’æŒã¤ãƒ•ィールドã¯ã€%s%dよりå°ã•ãªçµ¶å¯¾å€¤ã«ä¸¸ã‚られã¾ã™ã€‚" -#: utils/adt/numeric.c:7948 +#: utils/adt/numeric.c:8033 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "精度%dã€ä½å–り%dã‚’æŒã¤ãƒ•ィールドã¯ã€ç„¡é™å¤§å€¤ã‚’æ ¼ç´ã§ãã¾ã›ã‚“。" -#: utils/adt/oid.c:216 +#: utils/adt/numeric.c:11359 utils/adt/pseudorandomfuncs.c:135 utils/adt/pseudorandomfuncs.c:159 +#, c-format +msgid "lower bound must be less than or equal to upper bound" +msgstr "下é™ã¯ä¸Šé™ã¨åŒã˜ã‚ã‚‹ã„ã¯ã‚ˆã‚Šå°ã•ã„å¿…è¦ãŒã‚りã¾ã™" + +#: utils/adt/oid.c:217 #, c-format msgid "invalid oidvector data" msgstr "䏿­£ãªoidvectorデータ" @@ -24699,293 +25768,303 @@ msgstr "è¦æ±‚ã•ã‚ŒãŸæ–‡å­—ã¯ç¬¦å·åŒ–ã™ã‚‹ã«ã¯å¤§ãã™ãŽã¾ã™: %u" msgid "requested character not valid for encoding: %u" msgstr "è¦æ±‚ã•ã‚ŒãŸæ–‡å­—ã¯ç¬¦å·åŒ–æ–¹å¼ã«å¯¾ã—ã¦ä¸æ­£ã§ã™: %u" -#: utils/adt/orderedsetaggs.c:448 utils/adt/orderedsetaggs.c:553 utils/adt/orderedsetaggs.c:693 +#: utils/adt/orderedsetaggs.c:446 utils/adt/orderedsetaggs.c:551 utils/adt/orderedsetaggs.c:691 #, c-format msgid "percentile value %g is not between 0 and 1" msgstr "ç™¾åˆ†ä½æ•°ã®å€¤%gãŒ0ã¨1ã®é–“ã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/pg_locale.c:1406 +#: utils/adt/pg_locale.c:326 utils/adt/pg_locale.c:358 +#, c-format +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "ロケールå\"%s\"ã¯ä¸æ­£ãªéžASCII文字をå«ã‚“ã§ã„ã¾ã™" + +#: utils/adt/pg_locale.c:1507 #, c-format msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" msgstr "ルール\"%2$s\"ã‚’æŒã¤ãƒ­ã‚±ãƒ¼ãƒ«\"%1$s\"ã®ç…§åˆå™¨ã‚’オープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %3$s" -#: utils/adt/pg_locale.c:1417 utils/adt/pg_locale.c:2847 utils/adt/pg_locale.c:2919 +#: utils/adt/pg_locale.c:1518 utils/adt/pg_locale.c:2992 utils/adt/pg_locale.c:3065 #, c-format msgid "ICU is not supported in this build" msgstr "ã“ã®ãƒ“ルドã§ã¯ICUã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/pg_locale.c:1446 +#: utils/adt/pg_locale.c:1546 #, c-format msgid "could not create locale \"%s\": %m" msgstr "ロケール\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/adt/pg_locale.c:1449 +#: utils/adt/pg_locale.c:1549 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "オペレーティングシステムã¯ãƒ­ã‚±ãƒ¼ãƒ«å\"%s\"ã®ãƒ­ã‚±ãƒ¼ãƒ«ãƒ‡ãƒ¼ã‚¿ã‚’見ã¤ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚" -#: utils/adt/pg_locale.c:1564 +#: utils/adt/pg_locale.c:1670 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "ã“ã®ãƒ—ラットフォームã§ã¯å€¤ãŒç•°ãªã‚‹collateã¨ctypeã«ã‚ˆã‚‹ç…§åˆé †åºã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: utils/adt/pg_locale.c:1573 -#, c-format -msgid "collation provider LIBC is not supported on this platform" -msgstr "ç…§åˆé †åºãƒ—ロãƒã‚¤ãƒ€LIBCã¯ã“ã®ãƒ—ラットフォームã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" - -#: utils/adt/pg_locale.c:1614 +#: utils/adt/pg_locale.c:1717 #, c-format msgid "collation \"%s\" has no actual version, but a version was recorded" msgstr "ç…§åˆé †åº\"%s\"ã«ã¯å®Ÿéš›ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã‚りã¾ã›ã‚“ãŒã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒè¨˜éŒ²ã•れã¦ã„ã¾ã™" -#: utils/adt/pg_locale.c:1620 +#: utils/adt/pg_locale.c:1723 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "ç…§åˆé †åº\"%s\"ã§ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´ãŒèµ·ãã¦ã„ã¾ã™" -#: utils/adt/pg_locale.c:1622 +#: utils/adt/pg_locale.c:1725 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "データベース中ã®ç…§åˆé †åºã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã§ä½œæˆã•れã¦ã„ã¾ã™ãŒã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã‚’æä¾›ã—ã¦ã„ã¾ã™ã€‚" -#: utils/adt/pg_locale.c:1625 +#: utils/adt/pg_locale.c:1728 #, c-format msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgstr "ã“ã®ç…§åˆé †åºã®å½±éŸ¿ã‚’å—ã‘ã‚‹å…¨ã¦ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å†æ§‹ç¯‰ã—ã¦ã€ALTER COLLATION %s REFRESH VERSIONを実行ã™ã‚‹ã‹ã€æ­£ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ©ã‚¤ãƒ–ラリを用ã„ã¦PostgreSQLをビルドã—ã¦ãã ã•ã„。" -#: utils/adt/pg_locale.c:1691 +#: utils/adt/pg_locale.c:1772 utils/adt/pg_locale.c:2556 utils/adt/pg_locale.c:2581 +#, c-format +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "ロケールå\"%s\"ã¯çµ„ã¿è¾¼ã¿ãƒ—ロãƒã‚¤ãƒ€ã§ã¯ä¸æ­£ã§ã™" + +#: utils/adt/pg_locale.c:1814 #, c-format msgid "could not load locale \"%s\"" msgstr "ロケール\"%s\"をロードã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/adt/pg_locale.c:1716 +#: utils/adt/pg_locale.c:1839 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "ロケール\"%s\"ã«å¯¾å¿œã™ã‚‹ç…§åˆé †åºãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" -#: utils/adt/pg_locale.c:1772 utils/adt/pg_locale.c:1785 +#: utils/adt/pg_locale.c:1895 utils/adt/pg_locale.c:1908 #, c-format msgid "could not convert string to UTF-16: error code %lu" msgstr "文字列をUTF-16ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" -#: utils/adt/pg_locale.c:1799 +#: utils/adt/pg_locale.c:1920 #, c-format msgid "could not compare Unicode strings: %m" msgstr "Unicode文字列を比較ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/adt/pg_locale.c:1980 +#: utils/adt/pg_locale.c:2094 #, c-format msgid "collation failed: %s" msgstr "ç…§åˆé †åºã«ã‚ˆã‚‹æ¯”較ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: utils/adt/pg_locale.c:2201 utils/adt/pg_locale.c:2233 +#: utils/adt/pg_locale.c:2313 utils/adt/pg_locale.c:2345 #, c-format msgid "sort key generation failed: %s" msgstr "ソートキーã®ç”Ÿæˆã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: utils/adt/pg_locale.c:2474 utils/adt/pg_locale.c:2798 +#: utils/adt/pg_locale.c:2635 #, c-format msgid "could not get language from locale \"%s\": %s" msgstr "ロケール\"%s\"ã‹ã‚‰è¨€èªžã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: utils/adt/pg_locale.c:2495 utils/adt/pg_locale.c:2511 +#: utils/adt/pg_locale.c:2656 utils/adt/pg_locale.c:2672 #, c-format msgid "could not open collator for locale \"%s\": %s" msgstr "ロケール\"%s\"ã®ç…§åˆå™¨ã‚’オープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: utils/adt/pg_locale.c:2536 +#: utils/adt/pg_locale.c:2697 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "エンコーディング\"%s\"ã¯ICUã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/pg_locale.c:2543 +#: utils/adt/pg_locale.c:2704 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "エンコーディング\"%s\"ã®ICU変æ›å™¨ã‚’オープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: utils/adt/pg_locale.c:2561 utils/adt/pg_locale.c:2580 utils/adt/pg_locale.c:2636 utils/adt/pg_locale.c:2647 +#: utils/adt/pg_locale.c:2722 utils/adt/pg_locale.c:2741 utils/adt/pg_locale.c:2797 utils/adt/pg_locale.c:2808 #, c-format msgid "%s failed: %s" msgstr "%s ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" -#: utils/adt/pg_locale.c:2838 +#: utils/adt/pg_locale.c:2983 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "ロケールå\"%s\"ã‚’ã€è¨€èªžã‚¿ã‚°ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: utils/adt/pg_locale.c:2879 +#: utils/adt/pg_locale.c:3024 #, c-format msgid "could not get language from ICU locale \"%s\": %s" msgstr "ICUロケール\"%s\"ã‹ã‚‰è¨€èªžã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: utils/adt/pg_locale.c:2881 utils/adt/pg_locale.c:2910 +#: utils/adt/pg_locale.c:3026 utils/adt/pg_locale.c:3055 #, c-format -msgid "To disable ICU locale validation, set parameter icu_validation_level to DISABLED." -msgstr "ICUロケールを無効ã«ã™ã‚‹ã«ã¯ã€ãƒ‘ラメータicu_validation_levelã‚’DISABLEDã«è¨­å®šã—ã¦ãã ã•ã„。" +msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." +msgstr "ICUロケールを無効ã«ã™ã‚‹ã«ã¯ã€ãƒ‘ラメータ\"%s\"ã‚’\"%s\"ã«è¨­å®šã—ã¦ãã ã•ã„。" -#: utils/adt/pg_locale.c:2908 +#: utils/adt/pg_locale.c:3053 #, c-format msgid "ICU locale \"%s\" has unknown language \"%s\"" msgstr "ICUロケール\"%s\"ã«ã¯æœªçŸ¥ã®è¨€èªž\"%s\"ãŒå«ã¾ã‚Œã¦ã„ã¾ã™" -#: utils/adt/pg_locale.c:3088 +#: utils/adt/pg_locale.c:3204 #, c-format msgid "invalid multibyte character for locale" msgstr "ロケールã«å¯¾ã™ã‚‹ä¸æ­£ãªãƒžãƒ«ãƒãƒã‚¤ãƒˆæ–‡å­—" -#: utils/adt/pg_locale.c:3089 +#: utils/adt/pg_locale.c:3205 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "ãŠãらãサーãƒãƒ¼ã®LC_CTYPEロケールã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ç¬¦å·åŒ–æ–¹å¼ã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: utils/adt/pg_lsn.c:263 +#: utils/adt/pg_lsn.c:262 #, c-format msgid "cannot add NaN to pg_lsn" msgstr "pg_lsnã«NaNã¯åŠ ç®—ã§ãã¾ã›ã‚“" -#: utils/adt/pg_lsn.c:297 +#: utils/adt/pg_lsn.c:296 #, c-format msgid "cannot subtract NaN from pg_lsn" msgstr "pg_lsnã‹ã‚‰NaNã¯æ¸›ç®—ã§ãã¾ã›ã‚“" -#: utils/adt/pg_upgrade_support.c:29 +#: utils/adt/pg_upgrade_support.c:39 #, c-format msgid "function can only be called when server is in binary upgrade mode" msgstr "関数ã¯ã‚µãƒ¼ãƒãƒ¼ãŒãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモードã§ã‚ã‚‹ã¨ãã®ã¿å‘¼ã³å‡ºã›ã¾ã™" -#: utils/adt/pgstatfuncs.c:253 +#: utils/adt/pgstatfuncs.c:252 #, c-format msgid "invalid command name: \"%s\"" msgstr "䏿­£ãªã‚³ãƒžãƒ³ãƒ‰å: \"%s\"" -#: utils/adt/pgstatfuncs.c:1773 +#: utils/adt/pgstatfuncs.c:1739 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "èªè­˜ã§ããªã„リセットターゲット: \"%s\"" -#: utils/adt/pgstatfuncs.c:1774 +#: utils/adt/pgstatfuncs.c:1740 #, c-format -msgid "Target must be \"archiver\", \"bgwriter\", \"io\", \"recovery_prefetch\", or \"wal\"." -msgstr "対象ã¯\"archiver\"ã€\"bgwriter\"ã€\"io\"ã€\"recovery_prefetch\"ã¾ãŸã¯\"wal\"ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" +msgid "Target must be \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"recovery_prefetch\", \"slru\", or \"wal\"." +msgstr "対象ã¯\"archiver\"ã€\"bgwriter\"ã€\"checkpointer\"ã€\"io\"ã€\"recovery_prefetch\"ã€\"slru\"ã¾ãŸã¯\"wal\"ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/pgstatfuncs.c:1852 +#: utils/adt/pgstatfuncs.c:1822 #, c-format msgid "invalid subscription OID %u" msgstr "䏿­£ãªã‚µãƒ–スクリプションOID %u" -#: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 +#: utils/adt/pseudorandomfuncs.c:69 +#, c-format +msgid "setseed parameter %g is out of allowed range [-1,1]" +msgstr "setseed ã®ãƒ‘ラメータ %g ã¯è¨­å®šå¯èƒ½ãªç¯„囲 [-1, 1] ã«ã‚りã¾ã›ã‚“" + +#: utils/adt/pseudotypes.c:55 utils/adt/pseudotypes.c:89 #, c-format msgid "cannot display a value of type %s" msgstr "%såž‹ã®å€¤ã¯è¡¨ç¤ºã§ãã¾ã›ã‚“" -#: utils/adt/pseudotypes.c:310 +#: utils/adt/pseudotypes.c:307 #, c-format msgid "cannot accept a value of a shell type" msgstr "シェル型ã®å€¤ã¯å—ã‘付ã‘られã¾ã›ã‚“" -#: utils/adt/pseudotypes.c:320 +#: utils/adt/pseudotypes.c:317 #, c-format msgid "cannot display a value of a shell type" msgstr "シェル型ã®å€¤ã¯è¡¨ç¤ºã§ãã¾ã›ã‚“" -#: utils/adt/rangetypes.c:415 +#: utils/adt/rangetypes.c:422 #, c-format msgid "range constructor flags argument must not be null" msgstr "範囲コンストラクタフラグ引数ã¯NULLã§ã¯ã„ã‘ã¾ã›ã‚“" -#: utils/adt/rangetypes.c:1014 +#: utils/adt/rangetypes.c:1021 #, c-format msgid "result of range difference would not be contiguous" msgstr "範囲ã®å·®åˆ†ãŒé€£ç¶šã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/rangetypes.c:1075 +#: utils/adt/rangetypes.c:1082 #, c-format msgid "result of range union would not be contiguous" msgstr "範囲ã®å’ŒãŒé€£ç¶šã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/rangetypes.c:1750 +#: utils/adt/rangetypes.c:1757 #, c-format msgid "range lower bound must be less than or equal to range upper bound" msgstr "範囲ã®ä¸‹é™ã¯ç¯„囲ã®ä¸Šé™ä»¥ä¸‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/rangetypes.c:2197 utils/adt/rangetypes.c:2210 utils/adt/rangetypes.c:2224 +#: utils/adt/rangetypes.c:2256 utils/adt/rangetypes.c:2269 utils/adt/rangetypes.c:2283 #, c-format msgid "invalid range bound flags" msgstr "䏿­£ãªç¯„囲境界フラグ" -#: utils/adt/rangetypes.c:2198 utils/adt/rangetypes.c:2211 utils/adt/rangetypes.c:2225 +#: utils/adt/rangetypes.c:2257 utils/adt/rangetypes.c:2270 utils/adt/rangetypes.c:2284 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "有効ãªå€¤ã¯\"[]\"ã€\"[)\"ã€\"(]\"ã€\"()\"ã§ã™" -#: utils/adt/rangetypes.c:2293 utils/adt/rangetypes.c:2310 utils/adt/rangetypes.c:2325 utils/adt/rangetypes.c:2345 utils/adt/rangetypes.c:2356 utils/adt/rangetypes.c:2403 utils/adt/rangetypes.c:2411 +#: utils/adt/rangetypes.c:2352 utils/adt/rangetypes.c:2369 utils/adt/rangetypes.c:2384 utils/adt/rangetypes.c:2404 utils/adt/rangetypes.c:2415 utils/adt/rangetypes.c:2462 utils/adt/rangetypes.c:2470 #, c-format msgid "malformed range literal: \"%s\"" msgstr "䏿­£ãªç¯„囲リテラル: \"%s\"" -#: utils/adt/rangetypes.c:2295 +#: utils/adt/rangetypes.c:2354 #, c-format msgid "Junk after \"empty\" key word." msgstr "\"empty\"キーワードã®å¾Œã«ã‚´ãƒŸãŒã‚りã¾ã™ã€‚" -#: utils/adt/rangetypes.c:2312 +#: utils/adt/rangetypes.c:2371 #, c-format msgid "Missing left parenthesis or bracket." msgstr "左括弧ã¾ãŸã¯å·¦è§’括弧ãŒã‚りã¾ã›ã‚“" -#: utils/adt/rangetypes.c:2327 +#: utils/adt/rangetypes.c:2386 #, c-format msgid "Missing comma after lower bound." msgstr "下é™å€¤ã®å¾Œã«ã‚«ãƒ³ãƒžãŒã‚りã¾ã›ã‚“" -#: utils/adt/rangetypes.c:2347 +#: utils/adt/rangetypes.c:2406 #, c-format msgid "Too many commas." msgstr "カンマãŒå¤šã™ãŽã¾ã™" -#: utils/adt/rangetypes.c:2358 +#: utils/adt/rangetypes.c:2417 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "峿‹¬å¼§ã¾ãŸã¯å³è§’括弧ã®å¾Œã«ã”ã¿ãŒã‚りã¾ã™" -#: utils/adt/regexp.c:305 utils/adt/regexp.c:1997 utils/adt/varlena.c:4270 +#: utils/adt/regexp.c:304 utils/adt/regexp.c:1996 utils/adt/varlena.c:4273 #, c-format msgid "regular expression failed: %s" msgstr "æ­£è¦è¡¨ç¾ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" -#: utils/adt/regexp.c:446 utils/adt/regexp.c:681 +#: utils/adt/regexp.c:445 utils/adt/regexp.c:680 #, c-format msgid "invalid regular expression option: \"%.*s\"" msgstr "䏿­£ãªæ­£è¦è¡¨ç¾ã‚ªãƒ—ション: \"%.*s\"" -#: utils/adt/regexp.c:683 +#: utils/adt/regexp.c:682 #, c-format msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." msgstr "regexp_replace()ã§ãƒ‘ラメータstartを指定ã—ãŸã„ã®ã§ã‚れã°ã€4番目ã®ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã‚’æ˜Žç¤ºçš„ã«æ•´æ•°ã«ã‚­ãƒ£ã‚¹ãƒˆã—ã¦ãã ã•ã„。" -#: utils/adt/regexp.c:717 utils/adt/regexp.c:726 utils/adt/regexp.c:1083 utils/adt/regexp.c:1147 utils/adt/regexp.c:1156 utils/adt/regexp.c:1165 utils/adt/regexp.c:1174 utils/adt/regexp.c:1854 utils/adt/regexp.c:1863 utils/adt/regexp.c:1872 utils/misc/guc.c:6610 utils/misc/guc.c:6644 +#: utils/adt/regexp.c:716 utils/adt/regexp.c:725 utils/adt/regexp.c:1082 utils/adt/regexp.c:1146 utils/adt/regexp.c:1155 utils/adt/regexp.c:1164 utils/adt/regexp.c:1173 utils/adt/regexp.c:1853 utils/adt/regexp.c:1862 utils/adt/regexp.c:1871 utils/misc/guc.c:6820 utils/misc/guc.c:6854 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "パラメータ\"%s\"ã®å€¤ãŒç„¡åйã§ã™: %d" -#: utils/adt/regexp.c:937 +#: utils/adt/regexp.c:936 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "SQLæ­£è¦è¡¨ç¾ã¯ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã•れãŸãƒ€ãƒ–ルクオートを2ã¤ã‚ˆã‚Šå¤šãå«ã‚€ã“ã¨ã¯ã§ãã¾ã›ã‚“" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:1094 utils/adt/regexp.c:1185 utils/adt/regexp.c:1272 utils/adt/regexp.c:1311 utils/adt/regexp.c:1699 utils/adt/regexp.c:1754 utils/adt/regexp.c:1883 +#: utils/adt/regexp.c:1093 utils/adt/regexp.c:1184 utils/adt/regexp.c:1271 utils/adt/regexp.c:1310 utils/adt/regexp.c:1698 utils/adt/regexp.c:1753 utils/adt/regexp.c:1882 #, c-format msgid "%s does not support the \"global\" option" msgstr "%sã¯\"global\"オプションをサãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: utils/adt/regexp.c:1313 +#: utils/adt/regexp.c:1312 #, c-format msgid "Use the regexp_matches function instead." msgstr "代ã‚りã«regexp_matchesを使ã£ã¦ãã ã•ã„。" -#: utils/adt/regexp.c:1501 +#: utils/adt/regexp.c:1500 #, c-format msgid "too many regular expression matches" msgstr "æ­£è¦è¡¨ç¾ã®ãƒžãƒƒãƒãŒå¤šéŽãŽã¾ã™" @@ -25000,7 +26079,7 @@ msgstr "\"%s\"ã¨ã„ã†åå‰ã®é–¢æ•°ãŒè¤‡æ•°ã‚りã¾ã™" msgid "more than one operator named %s" msgstr "%sã¨ã„ã†åå‰ã®æ¼”ç®—å­ãŒè¤‡æ•°ã‚りã¾ã™" -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10013 utils/adt/ruleutils.c:10226 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10516 utils/adt/ruleutils.c:10729 #, c-format msgid "too many arguments" msgstr "引数ãŒå¤šã™ãŽã¾ã™" @@ -25010,157 +26089,157 @@ msgstr "引数ãŒå¤šã™ãŽã¾ã™" msgid "Provide two argument types for operator." msgstr "演算å­ã§ã¯2ã¤ã®å¼•数型を指定ã—ã¦ãã ã•ã„" -#: utils/adt/regproc.c:1544 utils/adt/regproc.c:1661 utils/adt/regproc.c:1790 utils/adt/regproc.c:1795 utils/adt/varlena.c:3410 utils/adt/varlena.c:3415 +#: utils/adt/regproc.c:1564 utils/adt/regproc.c:1681 utils/adt/regproc.c:1810 utils/adt/regproc.c:1815 utils/adt/varlena.c:3413 utils/adt/varlena.c:3418 #, c-format msgid "invalid name syntax" msgstr "䏿­£ãªåå‰ã®æ§‹æ–‡" -#: utils/adt/regproc.c:1904 +#: utils/adt/regproc.c:1924 #, c-format msgid "expected a left parenthesis" msgstr "左括弧を想定ã—ã¦ã„ã¾ã—ãŸ" -#: utils/adt/regproc.c:1922 +#: utils/adt/regproc.c:1942 #, c-format msgid "expected a right parenthesis" msgstr "峿‹¬å¼§ã‚’想定ã—ã¦ã„ã¾ã—ãŸ" -#: utils/adt/regproc.c:1941 +#: utils/adt/regproc.c:1961 #, c-format msgid "expected a type name" msgstr "åž‹ã®åå‰ã‚’想定ã—ã¦ã„ã¾ã—ãŸ" -#: utils/adt/regproc.c:1973 +#: utils/adt/regproc.c:1993 #, c-format msgid "improper type name" msgstr "åž‹ã®åå‰ãŒä¸é©åˆ‡ã§ã™" -#: utils/adt/ri_triggers.c:306 utils/adt/ri_triggers.c:1625 utils/adt/ri_triggers.c:2610 +#: utils/adt/ri_triggers.c:303 utils/adt/ri_triggers.c:1616 utils/adt/ri_triggers.c:2601 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "テーブル\"%s\"ã¸ã®æŒ¿å…¥ã€æ›´æ–°ã¯å¤–部キー制約\"%s\"ã«é•åã—ã¦ã„ã¾ã™" -#: utils/adt/ri_triggers.c:309 utils/adt/ri_triggers.c:1628 +#: utils/adt/ri_triggers.c:306 utils/adt/ri_triggers.c:1619 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MACTH FULLã§ã¯NULLキー値ã¨éžNULLキー値を混在ã§ãã¾ã›ã‚“" -#: utils/adt/ri_triggers.c:2045 +#: utils/adt/ri_triggers.c:2036 #, c-format msgid "function \"%s\" must be fired for INSERT" -msgstr "関数\"%s\"ã‚’INSERTã§ç™ºè¡Œã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" +msgstr "関数\"%s\"ã¯INSERTã§ç™ºç«ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/ri_triggers.c:2051 +#: utils/adt/ri_triggers.c:2042 #, c-format msgid "function \"%s\" must be fired for UPDATE" -msgstr "関数\"%s\"ã‚’UPDATEã§ç™ºè¡Œã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" +msgstr "関数\"%s\"ã¯UPDATEã§ç™ºç«ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/ri_triggers.c:2057 +#: utils/adt/ri_triggers.c:2048 #, c-format msgid "function \"%s\" must be fired for DELETE" -msgstr "関数\"%s\"ã‚’DELETEã§ç™ºè¡Œã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" +msgstr "関数\"%s\"ã¯DELETEã§ç™ºç«ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/ri_triggers.c:2080 +#: utils/adt/ri_triggers.c:2071 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "テーブル\"%2$s\"ã®ãƒˆãƒªã‚¬\"%1$s\"用ã®pg_constrainté …ç›®ãŒã‚りã¾ã›ã‚“" -#: utils/adt/ri_triggers.c:2082 +#: utils/adt/ri_triggers.c:2073 #, c-format msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." msgstr "ã“ã®å‚ç…§æ•´åˆæ€§ãƒˆãƒªã‚¬ã¨ãã®å¯¾è±¡ã‚’削除ã—ã€ALTER TABLE ADD CONSTRAINTを実行ã—ã¦ãã ã•ã„" -#: utils/adt/ri_triggers.c:2435 +#: utils/adt/ri_triggers.c:2426 #, c-format msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" msgstr "\"%3$s\"ã®åˆ¶ç´„\"%2$s\"ã‹ã‚‰\"%1$s\"ã«è¡Œã‚れãŸå‚ç…§æ•´åˆæ€§å•ã„åˆã‚ã›ãŒæƒ³å®šå¤–ã®çµæžœã«ãªã‚Šã¾ã—ãŸ" -#: utils/adt/ri_triggers.c:2439 +#: utils/adt/ri_triggers.c:2430 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "ã“ã‚Œã¯æ¦‚ã­ã“ã®å•ã„åˆã‚ã›ã‚’æ›¸ãæ›ãˆã‚‹ãƒ«ãƒ¼ãƒ«ãŒåŽŸå› ã§ã™" -#: utils/adt/ri_triggers.c:2600 +#: utils/adt/ri_triggers.c:2591 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "å­ãƒ†ãƒ¼ãƒ–ル \"%s\"ã®å‰Šé™¤ã¯å¤–部キー制約\"%s\"é•åã¨ãªã‚Šã¾ã™" -#: utils/adt/ri_triggers.c:2603 utils/adt/ri_triggers.c:2628 +#: utils/adt/ri_triggers.c:2594 utils/adt/ri_triggers.c:2619 #, c-format msgid "Key (%s)=(%s) is still referenced from table \"%s\"." msgstr "キー(%s)=(%s)ã¯ã¾ã ãƒ†ãƒ¼ãƒ–ル\"%s\"ã‹ã‚‰å‚ç…§ã•れã¦ã„ã¾ã™" -#: utils/adt/ri_triggers.c:2614 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "テーブル\"%3$s\"ã«ã‚­ãƒ¼(%1$s)=(%2$s)ãŒã‚りã¾ã›ã‚“" -#: utils/adt/ri_triggers.c:2617 +#: utils/adt/ri_triggers.c:2608 #, c-format msgid "Key is not present in table \"%s\"." msgstr "テーブル\"%s\"ã«ã‚­ãƒ¼ãŒã‚りã¾ã›ã‚“。" -#: utils/adt/ri_triggers.c:2623 +#: utils/adt/ri_triggers.c:2614 #, c-format msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" msgstr "テーブル\"%1$s\"ã®æ›´æ–°ã¾ãŸã¯å‰Šé™¤ã¯ã€ãƒ†ãƒ¼ãƒ–ル\"%3$s\"ã®å¤–部キー制約\"%2$s\"ã«é•åã—ã¾ã™" -#: utils/adt/ri_triggers.c:2631 +#: utils/adt/ri_triggers.c:2622 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "テーブル\"%s\"ã‹ã‚‰ã‚­ãƒ¼ãŒã¾ã å‚ç…§ã•れã¦ã„ã¾ã™ã€‚" -#: utils/adt/rowtypes.c:106 utils/adt/rowtypes.c:510 +#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:509 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "匿å複åˆåž‹ã®å…¥åŠ›ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/rowtypes.c:159 utils/adt/rowtypes.c:191 utils/adt/rowtypes.c:217 utils/adt/rowtypes.c:228 utils/adt/rowtypes.c:286 utils/adt/rowtypes.c:297 +#: utils/adt/rowtypes.c:158 utils/adt/rowtypes.c:190 utils/adt/rowtypes.c:216 utils/adt/rowtypes.c:227 utils/adt/rowtypes.c:285 utils/adt/rowtypes.c:296 #, c-format msgid "malformed record literal: \"%s\"" msgstr "ãŠã‹ã—ãªãƒ¬ã‚³ãƒ¼ãƒ‰ãƒªãƒ†ãƒ©ãƒ«ã§ã™: \"%s\"" -#: utils/adt/rowtypes.c:160 +#: utils/adt/rowtypes.c:159 #, c-format msgid "Missing left parenthesis." msgstr "左括弧ãŒã‚りã¾ã›ã‚“" -#: utils/adt/rowtypes.c:192 +#: utils/adt/rowtypes.c:191 #, c-format msgid "Too few columns." msgstr "列ãŒå°‘ãªã™ãŽã¾ã™" -#: utils/adt/rowtypes.c:287 +#: utils/adt/rowtypes.c:286 #, c-format msgid "Too many columns." msgstr "列ãŒå¤šã™ãŽã¾ã™" -#: utils/adt/rowtypes.c:298 +#: utils/adt/rowtypes.c:297 #, c-format msgid "Junk after right parenthesis." msgstr "峿‹¬å¼§ã®å¾Œã«ã”ã¿ãŒã‚りã¾ã™" -#: utils/adt/rowtypes.c:559 +#: utils/adt/rowtypes.c:558 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "列数ãŒé–“é•ã£ã¦ã„ã¾ã™: %d。%dを想定ã—ã¦ã„ã¾ã—ãŸ" -#: utils/adt/rowtypes.c:601 +#: utils/adt/rowtypes.c:599 #, c-format msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" msgstr "ãƒã‚¤ãƒŠãƒªãƒ‡ãƒ¼ã‚¿ã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚«ãƒ©ãƒ %5$dã§äºˆæœŸã—ã¦ã„ãŸ%3$u(%4$s)ã®ä»£ã‚りã«%1$u(%2$s)ãŒã‚りã¾ã—ãŸ" -#: utils/adt/rowtypes.c:668 +#: utils/adt/rowtypes.c:660 #, c-format msgid "improper binary format in record column %d" msgstr "レコード列%dã®ãƒã‚¤ãƒŠãƒªæ›¸å¼ãŒä¸é©åˆ‡ã§ã™" -#: utils/adt/rowtypes.c:959 utils/adt/rowtypes.c:1205 utils/adt/rowtypes.c:1463 utils/adt/rowtypes.c:1709 +#: utils/adt/rowtypes.c:949 utils/adt/rowtypes.c:1195 utils/adt/rowtypes.c:1453 utils/adt/rowtypes.c:1699 #, c-format msgid "cannot compare dissimilar column types %s and %s at record column %d" msgstr "レコードã®åˆ— %3$d ã«ãŠã„ã¦ã€å…¨ãç•°ãªã‚‹åž‹ %1$s 㨠%2$s ã§ã¯æ¯”較ãŒã§ãã¾ã›ã‚“" -#: utils/adt/rowtypes.c:1050 utils/adt/rowtypes.c:1275 utils/adt/rowtypes.c:1560 utils/adt/rowtypes.c:1745 +#: utils/adt/rowtypes.c:1040 utils/adt/rowtypes.c:1265 utils/adt/rowtypes.c:1550 utils/adt/rowtypes.c:1735 #, c-format msgid "cannot compare record types with different numbers of columns" msgstr "個数ãŒç•°ãªã‚‹åˆ—åŒå£«ã§ã¯ãƒ¬ã‚³ãƒ¼ãƒ‰åž‹ã®æ¯”較ãŒã§ãã¾ã›ã‚“" @@ -25180,112 +26259,123 @@ msgstr "å¼ãŒ2ã¤ä»¥ä¸Šã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®å¤‰æ•°ã‚’å«ã‚“ã§ã„ã¾ã™" msgid "expression contains variables" msgstr "å¼ãŒå¤‰æ•°ã‚’å«ã‚“ã§ã„ã¾ã™" -#: utils/adt/ruleutils.c:5227 +#: utils/adt/ruleutils.c:5246 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "ルール\"%s\"ã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ãªã„イベントタイプ%dã‚’æŒã¡ã¾ã™" -#: utils/adt/timestamp.c:112 +#: utils/adt/timestamp.c:128 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "TIMESTAMP(%d)%s ã®ç²¾åº¦ã¯è² ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: utils/adt/timestamp.c:118 +#: utils/adt/timestamp.c:134 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "TIMESTAMP(%d)%sã®ä½å–りを許容最大値%dã¾ã§æ¸›ã‚‰ã—ã¾ã—ãŸ" -#: utils/adt/timestamp.c:378 +#: utils/adt/timestamp.c:394 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "timestamp(%d)ã®ç²¾åº¦ã¯%dã‹ã‚‰%dã¾ã§ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/timestamp.c:496 +#: utils/adt/timestamp.c:512 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "数字タイムゾーンã¯å…ˆé ­ã®æ–‡å­—ãŒ\"-\"ã¾ãŸã¯\"+\"ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/timestamp.c:508 +#: utils/adt/timestamp.c:524 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "数値タイムゾーン\"%s\"ãŒç¯„囲外ã§ã™" -#: utils/adt/timestamp.c:609 utils/adt/timestamp.c:619 utils/adt/timestamp.c:627 +#: utils/adt/timestamp.c:625 utils/adt/timestamp.c:635 utils/adt/timestamp.c:643 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "timestampãŒç¯„囲外ã§ã™: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:728 +#: utils/adt/timestamp.c:744 #, c-format msgid "timestamp cannot be NaN" msgstr "タイムスタンプ㯠NaN ã«ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/timestamp.c:746 utils/adt/timestamp.c:758 +#: utils/adt/timestamp.c:762 utils/adt/timestamp.c:774 #, c-format msgid "timestamp out of range: \"%g\"" msgstr "timestampãŒç¯„囲外ã§ã™: \"%g\"" -#: utils/adt/timestamp.c:1065 utils/adt/timestamp.c:1098 +#: utils/adt/timestamp.c:957 utils/adt/timestamp.c:1516 utils/adt/timestamp.c:1526 utils/adt/timestamp.c:1587 utils/adt/timestamp.c:2807 utils/adt/timestamp.c:2816 utils/adt/timestamp.c:2831 utils/adt/timestamp.c:2905 utils/adt/timestamp.c:2922 utils/adt/timestamp.c:2979 utils/adt/timestamp.c:3022 utils/adt/timestamp.c:3400 utils/adt/timestamp.c:3458 utils/adt/timestamp.c:3481 utils/adt/timestamp.c:3490 utils/adt/timestamp.c:3514 utils/adt/timestamp.c:3537 +#: utils/adt/timestamp.c:3546 utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3782 utils/adt/timestamp.c:4189 utils/adt/timestamp.c:4226 utils/adt/timestamp.c:4274 utils/adt/timestamp.c:4283 utils/adt/timestamp.c:4375 utils/adt/timestamp.c:4422 utils/adt/timestamp.c:4431 utils/adt/timestamp.c:4527 utils/adt/timestamp.c:4580 utils/adt/timestamp.c:4590 utils/adt/timestamp.c:4785 utils/adt/timestamp.c:4795 utils/adt/timestamp.c:5097 +#, c-format +msgid "interval out of range" +msgstr "intervalãŒç¯„囲外ã§ã™" + +#: utils/adt/timestamp.c:1094 utils/adt/timestamp.c:1127 #, c-format msgid "invalid INTERVAL type modifier" msgstr "䏿­£ãªINTERVALåž‹ã®ä¿®æ­£å­ã§ã™" -#: utils/adt/timestamp.c:1081 +#: utils/adt/timestamp.c:1110 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d)ã®ç²¾åº¦ã¯è² ã§ã¯ã„ã‘ã¾ã›ã‚“" -#: utils/adt/timestamp.c:1087 +#: utils/adt/timestamp.c:1116 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d)ã®ç²¾åº¦ã‚’許容最大値%dã¾ã§æ¸›ã‚‰ã—ã¾ã—ãŸ" -#: utils/adt/timestamp.c:1473 +#: utils/adt/timestamp.c:1506 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "interval(%d)ã®ç²¾åº¦ã¯%dã‹ã‚‰%dã¾ã§ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/timestamp.c:2703 -#, c-format -msgid "cannot subtract infinite timestamps" -msgstr "ç„¡é™å¤§ã®timestampを減算ã§ãã¾ã›ã‚“" - -#: utils/adt/timestamp.c:3956 utils/adt/timestamp.c:4139 +#: utils/adt/timestamp.c:4564 utils/adt/timestamp.c:4769 #, c-format msgid "origin out of range" msgstr "基点ãŒç¯„囲外ã§ã™" -#: utils/adt/timestamp.c:3961 utils/adt/timestamp.c:4144 +#: utils/adt/timestamp.c:4569 utils/adt/timestamp.c:4774 +#, c-format +msgid "timestamps cannot be binned into infinite intervals" +msgstr "タイムスタンプã¯ç„¡é™ã®intervalã«ãƒ“ニングã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: utils/adt/timestamp.c:4574 utils/adt/timestamp.c:4779 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—åž‹ã¯æœˆã‚„å¹´ã‚’å«ã‚€é–“éš”ã«ãƒ“ニングã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/timestamp.c:3968 utils/adt/timestamp.c:4151 +#: utils/adt/timestamp.c:4585 utils/adt/timestamp.c:4790 #, c-format msgid "stride must be greater than zero" msgstr "増分ã¯0より大ãããªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/timestamp.c:4434 +#: utils/adt/timestamp.c:5091 #, c-format msgid "Months usually have fractional weeks." msgstr "月ã¯é€šå¸¸é€±ã®ç«¯æ•°ã‚’å«ã‚“ã§ã„ã¾ã™ã€‚" -#: utils/adt/trigfuncs.c:42 +#: utils/adt/timestamp.c:6551 utils/adt/timestamp.c:6637 +#, c-format +msgid "step size cannot be infinite" +msgstr "加算é‡ã¯ç„¡é™ã«ã¯ã§ãã¾ã›ã‚“" + +#: utils/adt/trigfuncs.c:41 #, c-format msgid "suppress_redundant_updates_trigger: must be called as trigger" msgstr "suppress_redundant_updates_trigger: トリガーã¨ã—ã¦å‘¼ã°ã‚Œãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/trigfuncs.c:48 +#: utils/adt/trigfuncs.c:47 #, c-format msgid "suppress_redundant_updates_trigger: must be called on update" msgstr "suppress_redundant_updates_trigger: update 時ã«å‘¼ã°ã‚Œãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/trigfuncs.c:54 +#: utils/adt/trigfuncs.c:53 #, c-format msgid "suppress_redundant_updates_trigger: must be called before update" msgstr "suppress_redundant_updates_trigger: update å‰ã«å‘¼ã°ã‚Œãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/trigfuncs.c:60 +#: utils/adt/trigfuncs.c:59 #, c-format msgid "suppress_redundant_updates_trigger: must be called for each row" msgstr "suppress_redundant_updates_trigger: å„行ã”ã¨ã«å‘¼ã°ã‚Œãªã‘れã°ãªã‚Šã¾ã›ã‚“" @@ -25300,32 +26390,32 @@ msgstr "フレーズ演算å­ã§ã®è·é›¢ã¯0以上%dä»¥ä¸‹ã®æ•´æ•°ã§ãªã㦠msgid "no operand in tsquery: \"%s\"" msgstr "tsquery内ã«ã‚ªãƒšãƒ©ãƒ³ãƒ‰ãŒã‚りã¾ã›ã‚“\"%s\"" -#: utils/adt/tsquery.c:558 +#: utils/adt/tsquery.c:554 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "tsquery内ã®å€¤ãŒå¤§ãã™ãŽã¾ã™: \"%s\"" -#: utils/adt/tsquery.c:563 +#: utils/adt/tsquery.c:559 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "tsqueryã®ã‚ªãƒšãƒ©ãƒ³ãƒ‰ãŒé•·éŽãŽã¾ã™: \"%s\"" -#: utils/adt/tsquery.c:591 +#: utils/adt/tsquery.c:587 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "tsquery内ã®å˜èªžãŒé•·ã™ãŽã¾ã™: \"%s\"" -#: utils/adt/tsquery.c:717 utils/adt/tsvector_parser.c:147 +#: utils/adt/tsquery.c:713 utils/adt/tsvector_parser.c:147 #, c-format msgid "syntax error in tsquery: \"%s\"" msgstr "tsqueryå†…ã®æ§‹æ–‡ã‚¨ãƒ©ãƒ¼: \"%s\"" -#: utils/adt/tsquery.c:883 +#: utils/adt/tsquery.c:879 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" msgstr "テキスト検索å•ã„åˆã‚ã›ãŒå­—å¥è¦ç´ ã‚’å«ã¿ã¾ã›ã‚“: \"%s\"" -#: utils/adt/tsquery.c:894 utils/adt/tsquery_util.c:376 +#: utils/adt/tsquery.c:890 utils/adt/tsquery_util.c:376 #, c-format msgid "tsquery is too large" msgstr "tsqueryãŒå¤§ãã™ãŽã¾ã™" @@ -25360,72 +26450,72 @@ msgstr "é‡ã¿é…列ã«ã¯NULL値をå«ã‚ã¦ã¯ã„ã‘ã¾ã›ã‚“" msgid "weight out of range" msgstr "é‡ã¿ãŒç¯„囲外ã§ã™" -#: utils/adt/tsvector.c:217 +#: utils/adt/tsvector.c:213 #, c-format msgid "word is too long (%ld bytes, max %ld bytes)" msgstr "å˜èªžãŒé•·ã™ãŽã¾ã™(%ldãƒã‚¤ãƒˆã€æœ€å¤§ã¯%ldãƒã‚¤ãƒˆ)" -#: utils/adt/tsvector.c:224 +#: utils/adt/tsvector.c:220 #, c-format msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "tsベクターã®ãŸã‚ã®æ–‡å­—列ãŒé•·ã™ãŽã¾ã™(%ldãƒã‚¤ãƒˆã€æœ€å¤§ã¯%ldãƒã‚¤ãƒˆ)" -#: utils/adt/tsvector_op.c:773 +#: utils/adt/tsvector_op.c:771 #, c-format msgid "lexeme array may not contain nulls" msgstr "語彙素é…列ã«ã¯nullã‚’å«ã‚ã¦ã¯ã„ã‘ã¾ã›ã‚“" -#: utils/adt/tsvector_op.c:778 +#: utils/adt/tsvector_op.c:776 #, c-format msgid "lexeme array may not contain empty strings" msgstr "語彙素é…列ã«ã¯ç©ºæ–‡å­—列をå«ã‚ã¦ã¯ã„ã‘ã¾ã›ã‚“" -#: utils/adt/tsvector_op.c:847 +#: utils/adt/tsvector_op.c:845 #, c-format msgid "weight array may not contain nulls" msgstr "é‡ã¿ä»˜ã‘é…列ã«ã¯nullã‚’å«ã‚ã¦ã¯ã„ã‘ã¾ã›ã‚“" -#: utils/adt/tsvector_op.c:871 +#: utils/adt/tsvector_op.c:869 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "識別ä¸èƒ½ãªé‡ã¿ä»˜ã‘: \"%c\"" -#: utils/adt/tsvector_op.c:2601 +#: utils/adt/tsvector_op.c:2599 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "ts_statã¯1ã¤ã®tsvector列ã®ã¿ã‚’è¿”ã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/tsvector_op.c:2790 +#: utils/adt/tsvector_op.c:2788 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "tsvector列\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: utils/adt/tsvector_op.c:2797 +#: utils/adt/tsvector_op.c:2795 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "値\"%s\"ã¯åž‹tsvectorã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/tsvector_op.c:2809 +#: utils/adt/tsvector_op.c:2807 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "設定列\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: utils/adt/tsvector_op.c:2815 +#: utils/adt/tsvector_op.c:2813 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "%s列ã¯regconfigåž‹ã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/tsvector_op.c:2822 +#: utils/adt/tsvector_op.c:2820 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "設定列\"%s\"ã‚’NULLã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/tsvector_op.c:2835 +#: utils/adt/tsvector_op.c:2833 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "テキスト検索設定åç§°\"%s\"ã¯ã‚¹ã‚­ãƒ¼ãƒžä¿®é£¾ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/tsvector_op.c:2860 +#: utils/adt/tsvector_op.c:2858 #, c-format msgid "column \"%s\" is not of a character type" msgstr "列\"%s\"ã¯æ–‡å­—åž‹ã§ã¯ã‚りã¾ã›ã‚“" @@ -25445,17 +26535,17 @@ msgstr "エスケープ文字ãŒã‚りã¾ã›ã‚“: \"%s\"" msgid "wrong position info in tsvector: \"%s\"" msgstr "tsvector内ã®ä½ç½®æƒ…å ±ãŒé–“é•ã£ã¦ã„ã¾ã™: \"%s\"" -#: utils/adt/uuid.c:413 +#: utils/adt/uuid.c:418 #, c-format msgid "could not generate random values" msgstr "乱数値を生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/adt/varbit.c:110 utils/adt/varchar.c:54 +#: utils/adt/varbit.c:110 utils/adt/varchar.c:53 #, c-format msgid "length for type %s must be at least 1" msgstr "åž‹%sã®é•·ã•ã¯æœ€ä½Žã§ã‚‚1ã§ã™" -#: utils/adt/varbit.c:115 utils/adt/varchar.c:58 +#: utils/adt/varbit.c:115 utils/adt/varchar.c:57 #, c-format msgid "length for type %s cannot exceed %d" msgstr "åž‹%sã®é•·ã•ã¯%dã‚’è¶…ãˆã‚‰ã‚Œã¾ã›ã‚“" @@ -25490,7 +26580,7 @@ msgstr "ビット列ã®å¤–部値ã®ä¸æ­£ãªé•·ã•" msgid "bit string too long for type bit varying(%d)" msgstr "ビット列ã¯åž‹bit varying(%d)ã«ã¯é•·ã™ãŽã¾ã™" -#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:908 utils/adt/varlena.c:971 utils/adt/varlena.c:1128 utils/adt/varlena.c:3052 utils/adt/varlena.c:3130 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:911 utils/adt/varlena.c:974 utils/adt/varlena.c:1131 utils/adt/varlena.c:3055 utils/adt/varlena.c:3133 #, c-format msgid "negative substring length not allowed" msgstr "è² ã®é•·ã•ã®substringã¯è¨±å¯ã•れã¾ã›ã‚“" @@ -25515,331 +26605,341 @@ msgstr "サイズãŒç•°ãªã‚‹ãƒ“ット列ã®XORã¯ã§ãã¾ã›ã‚“" msgid "bit index %d out of valid range (0..%d)" msgstr "ビットã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹%dãŒæœ‰åŠ¹ç¯„å›²0..%dã®é–“ã«ã‚りã¾ã›ã‚“" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3334 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3337 #, c-format msgid "new bit must be 0 or 1" msgstr "æ–°ã—ã„ビットã¯0ã‹1ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/varchar.c:162 utils/adt/varchar.c:313 +#: utils/adt/varchar.c:161 utils/adt/varchar.c:312 #, c-format msgid "value too long for type character(%d)" msgstr "値ã¯åž‹character(%d)ã¨ã—ã¦ã¯é•·ã™ãŽã¾ã™" -#: utils/adt/varchar.c:476 utils/adt/varchar.c:640 +#: utils/adt/varchar.c:475 utils/adt/varchar.c:639 #, c-format msgid "value too long for type character varying(%d)" msgstr "値ã¯åž‹character varying(%d)ã¨ã—ã¦ã¯é•·ã™ãŽã¾ã™" -#: utils/adt/varchar.c:738 utils/adt/varlena.c:1517 +#: utils/adt/varchar.c:737 utils/adt/varlena.c:1520 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "文字列比較ã§ä½¿ç”¨ã™ã‚‹ç…§åˆé †åºã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/adt/varlena.c:1227 utils/adt/varlena.c:1806 +#: utils/adt/varlena.c:1230 utils/adt/varlena.c:1809 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "éžæ±ºå®šçš„ç…§åˆé †åºã¯éƒ¨åˆ†æ–‡å­—列探索ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: utils/adt/varlena.c:3218 utils/adt/varlena.c:3285 +#: utils/adt/varlena.c:3221 utils/adt/varlena.c:3288 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "インデックス%dã¯æœ‰åŠ¹ç¯„å›²0..%dã®é–“ã«ã‚りã¾ã›ã‚“" -#: utils/adt/varlena.c:3249 utils/adt/varlena.c:3321 +#: utils/adt/varlena.c:3252 utils/adt/varlena.c:3324 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "インデックス%lldã¯æœ‰åŠ¹ç¯„å›²0..%lldã®é–“ã«ã‚りã¾ã›ã‚“" -#: utils/adt/varlena.c:4382 +#: utils/adt/varlena.c:4385 #, c-format msgid "field position must not be zero" msgstr "フィールドä½ç½®ã«ã¯0ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: utils/adt/varlena.c:5554 +#: utils/adt/varlena.c:5630 #, c-format msgid "unterminated format() type specifier" msgstr "終端ã•れã¦ã„ãªã„format()型指定å­" -#: utils/adt/varlena.c:5555 utils/adt/varlena.c:5689 utils/adt/varlena.c:5810 +#: utils/adt/varlena.c:5631 utils/adt/varlena.c:5765 utils/adt/varlena.c:5886 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "一ã¤ã®\"%%\"ã«ã¯\"%%%%\"を使ã£ã¦ãã ã•ã„。" -#: utils/adt/varlena.c:5687 utils/adt/varlena.c:5808 +#: utils/adt/varlena.c:5763 utils/adt/varlena.c:5884 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "èªè­˜ã§ããªã„ format() ã®åž‹æŒ‡å®šå­\"%.*s\"" -#: utils/adt/varlena.c:5700 utils/adt/varlena.c:5757 +#: utils/adt/varlena.c:5776 utils/adt/varlena.c:5833 #, c-format msgid "too few arguments for format()" msgstr "format()ã®å¼•æ•°ãŒå°‘ãªã™ãŽã¾ã™" -#: utils/adt/varlena.c:5853 utils/adt/varlena.c:6035 +#: utils/adt/varlena.c:5929 utils/adt/varlena.c:6111 #, c-format msgid "number is out of range" msgstr "数値ãŒç¯„囲外ã§ã™" -#: utils/adt/varlena.c:5916 utils/adt/varlena.c:5944 +#: utils/adt/varlena.c:5992 utils/adt/varlena.c:6020 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "書å¼ã¯å¼•æ•°0を指定ã—ã¦ã„ã¾ã™ãŒã€å¼•æ•°ãŒ1ã‹ã‚‰å§‹ã¾ã£ã¦ã„ã¾ã™" -#: utils/adt/varlena.c:5937 +#: utils/adt/varlena.c:6013 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "width引数ã®ä½ç½®ã¯\"$\"ã§çµ‚ã‚らãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/varlena.c:5982 +#: utils/adt/varlena.c:6058 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "NULLã¯SQL識別å­ã¨ã—ã¦æ›¸å¼ä»˜ã‘ã§ãã¾ã›ã‚“" -#: utils/adt/varlena.c:6190 +#: utils/adt/varlena.c:6266 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "Unicodeæ­£è¦åŒ–ã¯ã‚µãƒ¼ãƒãƒ¼ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ãŒUTF-8ã®å ´åˆã«ã®ã¿å®Ÿè¡Œã•れã¾ã™" -#: utils/adt/varlena.c:6203 +#: utils/adt/varlena.c:6279 #, c-format msgid "invalid normalization form: %s" msgstr "䏿­£ãªæ­£è¦åŒ–å½¢å¼: %s" -#: utils/adt/varlena.c:6406 utils/adt/varlena.c:6441 utils/adt/varlena.c:6476 +#: utils/adt/varlena.c:6324 +#, c-format +msgid "Unicode categorization can only be performed if server encoding is UTF8" +msgstr "Unicodeカテゴリー分類ã¯ã‚µãƒ¼ãƒãƒ¼ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ãŒUTF-8ã®å ´åˆã«ã®ã¿å®Ÿè¡Œå¯èƒ½ã§ã™" + +#: utils/adt/varlena.c:6541 utils/adt/varlena.c:6576 utils/adt/varlena.c:6611 #, c-format msgid "invalid Unicode code point: %04X" msgstr "䏿­£ãªUnicodeコードãƒã‚¤ãƒ³ãƒˆ: %04X" -#: utils/adt/varlena.c:6506 +#: utils/adt/varlena.c:6641 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "Unicodeエスケープ㯠\\XXXXã€\\+XXXXXXã€\\uXXXX ã¾ãŸã¯ \\UXXXXXXXX ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/windowfuncs.c:442 +#: utils/adt/windowfuncs.c:443 #, c-format msgid "argument of ntile must be greater than zero" msgstr "ntileã®å€¤ã¯0より大ãããªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/windowfuncs.c:706 +#: utils/adt/windowfuncs.c:707 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "nth_valueã®å€¤0より大ãããªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/adt/xid8funcs.c:125 +#: utils/adt/xid8funcs.c:120 #, c-format msgid "transaction ID %llu is in the future" msgstr "トランザクションID %lluã¯æœªæ¥ã®å€¤ã§ã™" -#: utils/adt/xid8funcs.c:547 +#: utils/adt/xid8funcs.c:522 #, c-format msgid "invalid external pg_snapshot data" msgstr "䏿­£ãªå¤–部pg_snapshotデータ" -#: utils/adt/xml.c:228 +#: utils/adt/xml.c:238 #, c-format msgid "unsupported XML feature" msgstr "éžã‚µãƒãƒ¼ãƒˆã®XML機能ã§ã™ã€‚" -#: utils/adt/xml.c:229 +#: utils/adt/xml.c:239 #, c-format msgid "This functionality requires the server to be built with libxml support." msgstr "ã“ã®æ©Ÿèƒ½ã¯libxmlサãƒãƒ¼ãƒˆä»˜ãã§ãƒ“ルドã•れãŸã‚µãƒ¼ãƒãƒ¼ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚" -#: utils/adt/xml.c:248 utils/mb/mbutils.c:628 +#: utils/adt/xml.c:258 utils/mb/mbutils.c:627 #, c-format msgid "invalid encoding name \"%s\"" msgstr "䏿­£ãªç¬¦å·åŒ–æ–¹å¼å\"%s\"" -#: utils/adt/xml.c:496 utils/adt/xml.c:501 +#: utils/adt/xml.c:506 utils/adt/xml.c:511 #, c-format msgid "invalid XML comment" msgstr "無効ãªXMLコメント" -#: utils/adt/xml.c:660 +#: utils/adt/xml.c:697 #, c-format msgid "not an XML document" msgstr "XML文書ã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/xml.c:956 utils/adt/xml.c:979 +#: utils/adt/xml.c:1008 utils/adt/xml.c:1031 #, c-format msgid "invalid XML processing instruction" msgstr "無効ãªXML処ç†å‘½ä»¤ã§ã™" -#: utils/adt/xml.c:957 +#: utils/adt/xml.c:1009 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "XML処ç†å‘½ä»¤ã®å¯¾è±¡åã‚’\"%s\"ã¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" -#: utils/adt/xml.c:980 +#: utils/adt/xml.c:1032 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML処ç†å‘½ä»¤ã«ã¯\"?>\"ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。" -#: utils/adt/xml.c:1059 +#: utils/adt/xml.c:1111 #, c-format msgid "xmlvalidate is not implemented" msgstr "XML ã®å¦¥å½“性検査ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/xml.c:1115 +#: utils/adt/xml.c:1167 #, c-format msgid "could not initialize XML library" msgstr "XMLãƒ©ã‚¤ãƒ–ãƒ©ãƒªã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/adt/xml.c:1116 +#: utils/adt/xml.c:1168 #, c-format msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." msgstr "libxml2ãŒäº’æ›æ€§ãŒãªã„文字型をæŒã¡ã¾ã™: sizeof(char)=%zuã€sizeof(xmlChar)=%zu" -#: utils/adt/xml.c:1202 +#: utils/adt/xml.c:1254 #, c-format msgid "could not set up XML error handler" msgstr "XMLエラーãƒãƒ³ãƒ‰ãƒ©ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/adt/xml.c:1203 +#: utils/adt/xml.c:1255 #, c-format msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." msgstr "ã“れã¯ãŠãらã使用ã™ã‚‹libxml2ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒPostgreSQLを構築ã™ã‚‹æ™‚ã«ä½¿ç”¨ã—ãŸlibxml2ヘッダã¨äº’æ›æ€§ãŒãªã„ã“ã¨ã‚’示ã—ã¾ã™ã€‚" -#: utils/adt/xml.c:2189 +#: utils/adt/xml.c:2281 msgid "Invalid character value." msgstr "文字ã®å€¤ãŒæœ‰åйã§ã¯ã‚りã¾ã›ã‚“" -#: utils/adt/xml.c:2192 +#: utils/adt/xml.c:2284 msgid "Space required." msgstr "スペースをã‚ã‘ã¦ãã ã•ã„。" -#: utils/adt/xml.c:2195 +#: utils/adt/xml.c:2287 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone ã«ã¯ 'yes' ã‹ 'no' ã ã‘ãŒæœ‰åйã§ã™ã€‚" -#: utils/adt/xml.c:2198 +#: utils/adt/xml.c:2290 msgid "Malformed declaration: missing version." msgstr "䏿­£ãªå½¢å¼ã®å®£è¨€: ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã‚りã¾ã›ã‚“。" -#: utils/adt/xml.c:2201 +#: utils/adt/xml.c:2293 msgid "Missing encoding in text declaration." msgstr "テキスト宣言ã«ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã®æŒ‡å®šãŒã‚りã¾ã›ã‚“。" -#: utils/adt/xml.c:2204 +#: utils/adt/xml.c:2296 msgid "Parsing XML declaration: '?>' expected." msgstr "XML 宣言ã®ãƒ‘ース中: '>?' ãŒå¿…è¦ã§ã™ã€‚" -#: utils/adt/xml.c:2207 +#: utils/adt/xml.c:2299 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "èªè­˜ã§ããªã„libxml ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰: %d" -#: utils/adt/xml.c:2461 +#: utils/adt/xml.c:2553 #, c-format msgid "XML does not support infinite date values." msgstr "XMLã¯ãƒ‡ãƒ¼ã‚¿å€¤ã¨ã—ã¦ç„¡é™ã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“。" -#: utils/adt/xml.c:2483 utils/adt/xml.c:2510 +#: utils/adt/xml.c:2575 utils/adt/xml.c:2602 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XMLタイムスタンプ値ã¨ã—ã¦ã¯ç„¡é™ã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“。" -#: utils/adt/xml.c:2926 +#: utils/adt/xml.c:3018 #, c-format msgid "invalid query" msgstr "䏿­£ãªç„¡åйãªå•ã„åˆã‚ã›" -#: utils/adt/xml.c:4266 +#: utils/adt/xml.c:3110 +#, c-format +msgid "portal \"%s\" does not return tuples" +msgstr "ãƒãƒ¼ã‚¿ãƒ«\"%s\"ã¯ã‚¿ãƒ—ルを返å´ã—ã¾ã›ã‚“" + +#: utils/adt/xml.c:4362 #, c-format msgid "invalid array for XML namespace mapping" msgstr "XMLåå‰ç©ºé–“マッピングã«å¯¾ã™ã‚‹ä¸æ­£ãªé…列" -#: utils/adt/xml.c:4267 +#: utils/adt/xml.c:4363 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "ã“ã®é…列ã¯ç¬¬2軸ã®é•·ã•ãŒ2ã§ã‚ã‚‹2次元é…列ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/adt/xml.c:4291 +#: utils/adt/xml.c:4387 #, c-format msgid "empty XPath expression" msgstr "空ã®XPathå¼" -#: utils/adt/xml.c:4343 +#: utils/adt/xml.c:4439 #, c-format msgid "neither namespace name nor URI may be null" msgstr "åå‰ç©ºé–“åã‚‚URIã‚‚nullã«ã¯ã§ãã¾ã›ã‚“" -#: utils/adt/xml.c:4350 +#: utils/adt/xml.c:4446 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "\"%s\"ã¨ã„ã†åå‰ã®XMLåå‰ç©ºé–“ãŠã‚ˆã³URI\"%s\"を登録ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/adt/xml.c:4693 +#: utils/adt/xml.c:4795 #, c-format msgid "DEFAULT namespace is not supported" msgstr "デフォルトåå‰ç©ºé–“ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: utils/adt/xml.c:4722 +#: utils/adt/xml.c:4824 #, c-format msgid "row path filter must not be empty string" msgstr "行パスフィルタã¯ç©ºæ–‡å­—列ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: utils/adt/xml.c:4753 +#: utils/adt/xml.c:4858 #, c-format msgid "column path filter must not be empty string" msgstr "列パスフィルタ空文字列ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: utils/adt/xml.c:4897 +#: utils/adt/xml.c:5005 #, c-format msgid "more than one value returned by column XPath expression" msgstr "列XPathå¼ãŒ2ã¤ä»¥ä¸Šã®å€¤ã‚’è¿”å´ã—ã¾ã—ãŸ" -#: utils/cache/lsyscache.c:1043 +#: utils/cache/lsyscache.c:1017 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "åž‹%sã‹ã‚‰åž‹%sã¸ã®ã‚­ãƒ£ã‚¹ãƒˆã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: utils/cache/lsyscache.c:2845 utils/cache/lsyscache.c:2878 utils/cache/lsyscache.c:2911 utils/cache/lsyscache.c:2944 +#: utils/cache/lsyscache.c:2887 utils/cache/lsyscache.c:2920 utils/cache/lsyscache.c:2953 utils/cache/lsyscache.c:2986 #, c-format msgid "type %s is only a shell" msgstr "åž‹%sã¯å˜ãªã‚‹ã‚·ã‚§ãƒ«ã§ã™" -#: utils/cache/lsyscache.c:2850 +#: utils/cache/lsyscache.c:2892 #, c-format msgid "no input function available for type %s" msgstr "åž‹%sã®åˆ©ç”¨å¯èƒ½ãªå…¥åŠ›é–¢æ•°ãŒã‚りã¾ã›ã‚“" -#: utils/cache/lsyscache.c:2883 +#: utils/cache/lsyscache.c:2925 #, c-format msgid "no output function available for type %s" msgstr "åž‹%sã®åˆ©ç”¨å¯èƒ½ãªå‡ºåŠ›é–¢æ•°ãŒã‚りã¾ã›ã‚“" -#: utils/cache/partcache.c:219 +#: utils/cache/partcache.c:216 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d for type %s" msgstr "アクセスメソッド %2$s ã®æ¼”ç®—å­ã‚¯ãƒ©ã‚¹\"%1$s\"ã¯%4$såž‹ã«å¯¾å¿œã™ã‚‹ã‚µãƒãƒ¼ãƒˆé–¢æ•°%3$dã‚’å«ã‚“ã§ã„ã¾ã›ã‚“" -#: utils/cache/plancache.c:720 +#: utils/cache/plancache.c:747 #, c-format msgid "cached plan must not change result type" msgstr "キャッシュã—ãŸå®Ÿè¡Œè¨ˆç”»ã¯çµæžœåž‹ã‚’変更ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: utils/cache/relcache.c:3740 +#: utils/cache/relcache.c:3801 #, c-format msgid "heap relfilenumber value not set when in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã«ãƒ’ープã®relfilenumberã®å€¤ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#: utils/cache/relcache.c:3748 +#: utils/cache/relcache.c:3809 #, c-format msgid "unexpected request for new relfilenumber in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—グレードモード中ã«ã€äºˆæœŸã—ãªã„æ–°è¦relfilenumberã®è¦æ±‚ãŒã‚りã¾ã—ãŸ" -#: utils/cache/relcache.c:6488 +#: utils/cache/relcache.c:6539 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚­ãƒ£ãƒƒã‚·ãƒ¥åˆæœŸåŒ–ファイル\"%sを作æˆã§ãã¾ã›ã‚“: %m" -#: utils/cache/relcache.c:6490 +#: utils/cache/relcache.c:6541 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "ã¨ã‚Šã‚ãˆãšç¶šè¡Œã—ã¾ã™ãŒã€ä½•ã‹ãŒãŠã‹ã—ã„ã§ã™ã€‚" -#: utils/cache/relcache.c:6812 +#: utils/cache/relcache.c:6871 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "キャッシュファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" @@ -25849,17 +26949,17 @@ msgstr "キャッシュファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "リレーションã®ãƒžãƒƒãƒ”ングを変更ã—ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯PREPAREã§ãã¾ã›ã‚“" -#: utils/cache/relmapper.c:850 +#: utils/cache/relmapper.c:852 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "リレーションマッピングファイル\"%s\"ã«ä¸æ­£ãªãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã™" -#: utils/cache/relmapper.c:860 +#: utils/cache/relmapper.c:862 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "リレーションマッピングファイル\"%s\"ã®ä¸­ã«ä¸æ­£ãªãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒã‚りã¾ã™" -#: utils/cache/typcache.c:1803 utils/fmgr/funcapi.c:566 +#: utils/cache/typcache.c:1812 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "レコード型ã¯ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“" @@ -25874,102 +26974,102 @@ msgstr "TRAP: 例外æ¡ä»¶: PID %dã§ä¸æ­£ãªå¼•æ•°\n" msgid "TRAP: failed Assert(\"%s\"), File: \"%s\", Line: %d, PID: %d\n" msgstr "TRAP: Assert(\"%s\")ãŒå¤±æ•—ã€ãƒ•ァイル: \"%s\"ã€è¡Œ: %dã€PID: %d)\n" -#: utils/error/elog.c:416 +#: utils/error/elog.c:415 #, c-format msgid "error occurred before error message processing is available\n" msgstr "エラーメッセージã®å‡¦ç†ãŒå¯èƒ½ã«ãªã‚‹å‰ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ\n" -#: utils/error/elog.c:2092 +#: utils/error/elog.c:2134 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "ファイル\"%s\"ã®æ¨™æº–エラー出力ã¨ã—ã¦ã®å†ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: utils/error/elog.c:2105 +#: utils/error/elog.c:2147 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "ファイル\"%s\"ã®æ¨™æº–出力ã¨ã—ã¦ã®å†ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: utils/error/elog.c:2141 +#: utils/error/elog.c:2183 #, c-format -msgid "invalid character" +msgid "Invalid character" msgstr "䏿­£ãªæ–‡å­—" -#: utils/error/elog.c:2847 utils/error/elog.c:2874 utils/error/elog.c:2890 +#: utils/error/elog.c:2889 utils/error/elog.c:2916 utils/error/elog.c:2932 msgid "[unknown]" msgstr "[䏿˜Ž]" -#: utils/error/elog.c:3163 utils/error/elog.c:3484 utils/error/elog.c:3591 +#: utils/error/elog.c:3202 utils/error/elog.c:3526 utils/error/elog.c:3633 msgid "missing error text" msgstr "エラーテキストãŒã‚りã¾ã›ã‚“" -#: utils/error/elog.c:3166 utils/error/elog.c:3169 +#: utils/error/elog.c:3205 utils/error/elog.c:3208 #, c-format msgid " at character %d" msgstr "(%d文字目)" -#: utils/error/elog.c:3179 utils/error/elog.c:3186 +#: utils/error/elog.c:3218 utils/error/elog.c:3225 msgid "DETAIL: " msgstr "詳細: " -#: utils/error/elog.c:3193 +#: utils/error/elog.c:3232 msgid "HINT: " msgstr "ヒント: " -#: utils/error/elog.c:3200 +#: utils/error/elog.c:3239 msgid "QUERY: " msgstr "å•ã„åˆã‚ã›: " -#: utils/error/elog.c:3207 +#: utils/error/elog.c:3246 msgid "CONTEXT: " msgstr "文脈: " -#: utils/error/elog.c:3217 +#: utils/error/elog.c:3256 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "場所: %s, %s:%d\n" -#: utils/error/elog.c:3224 +#: utils/error/elog.c:3263 #, c-format msgid "LOCATION: %s:%d\n" msgstr "場所: %s:%d\n" -#: utils/error/elog.c:3231 +#: utils/error/elog.c:3270 msgid "BACKTRACE: " msgstr "ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹: " -#: utils/error/elog.c:3243 +#: utils/error/elog.c:3282 msgid "STATEMENT: " msgstr "æ–‡: " -#: utils/error/elog.c:3636 +#: utils/error/elog.c:3678 msgid "DEBUG" msgstr "DEBUG" -#: utils/error/elog.c:3640 +#: utils/error/elog.c:3682 msgid "LOG" msgstr "LOG" -#: utils/error/elog.c:3643 +#: utils/error/elog.c:3685 msgid "INFO" msgstr "INFO" -#: utils/error/elog.c:3646 +#: utils/error/elog.c:3688 msgid "NOTICE" msgstr "NOTICE" -#: utils/error/elog.c:3650 +#: utils/error/elog.c:3692 msgid "WARNING" msgstr "WARNING" -#: utils/error/elog.c:3653 +#: utils/error/elog.c:3695 msgid "ERROR" msgstr "ERROR" -#: utils/error/elog.c:3656 +#: utils/error/elog.c:3698 msgid "FATAL" msgstr "FATAL" -#: utils/error/elog.c:3659 +#: utils/error/elog.c:3701 msgid "PANIC" msgstr "PANIC" @@ -26016,17 +27116,17 @@ msgstr "サーãƒãƒ¼å´ABIã¯\"%s\"ã€ãƒ©ã‚¤ãƒ–ラリå´ã¯\"%s\"ã§ã™ã€‚" #: utils/fmgr/dfmgr.c:361 #, c-format msgid "Server has FUNC_MAX_ARGS = %d, library has %d." -msgstr "サーãƒãƒ¼å´ã¯ FUNC_MAX_ARGS = %d ã§ã™ãŒã€ãƒ©ã‚¤ãƒ–ラリå´ã¯ %d ã§ã™" +msgstr "サーãƒãƒ¼å´ã¯ FUNC_MAX_ARGS = %d ã§ã™ãŒã€ãƒ©ã‚¤ãƒ–ラリå´ã¯ %d ã§ã™ã€‚" #: utils/fmgr/dfmgr.c:370 #, c-format msgid "Server has INDEX_MAX_KEYS = %d, library has %d." -msgstr "サーãƒãƒ¼å´ã¯ INDEX_MAX_KEYS = %d ã§ã™ãŒã€ãƒ©ã‚¤ãƒ–ラリå´ã¯ %d ã§ã™" +msgstr "サーãƒãƒ¼å´ã¯ INDEX_MAX_KEYS = %d ã§ã™ãŒã€ãƒ©ã‚¤ãƒ–ラリå´ã¯ %d ã§ã™ã€‚" #: utils/fmgr/dfmgr.c:379 #, c-format msgid "Server has NAMEDATALEN = %d, library has %d." -msgstr "サーãƒãƒ¼å´ã¯ NAMEDATALEN = %d ã§ã™ãŒã€ãƒ©ã‚¤ãƒ–ラリå´ã¯ %d ã§ã™" +msgstr "サーãƒãƒ¼å´ã¯ NAMEDATALEN = %d ã§ã™ãŒã€ãƒ©ã‚¤ãƒ–ラリå´ã¯ %d ã§ã™ã€‚" #: utils/fmgr/dfmgr.c:388 #, c-format @@ -26042,22 +27142,22 @@ msgstr "ãƒžã‚¸ãƒƒã‚¯ãƒ–ãƒ­ãƒƒã‚¯ãŒæ„図ã—ãªã„é•·ã•ã§ã‚ã‚‹ã‹ã€ã¾ãŸã¯ msgid "incompatible library \"%s\": magic block mismatch" msgstr "\"%s\"ã¯äº’æ›æ€§ãŒãªã„ライブラリã§ã™: マジックブロックã®ä¸ä¸€è‡´" -#: utils/fmgr/dfmgr.c:492 +#: utils/fmgr/dfmgr.c:475 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "ライブラリ\"%s\"ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯è¨±å¯ã•れã¾ã›ã‚“" -#: utils/fmgr/dfmgr.c:518 +#: utils/fmgr/dfmgr.c:501 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "ダイナミックライブラリパス内ã®ãƒžã‚¯ãƒ­ãŒä¸æ­£ã§ã™: %s" -#: utils/fmgr/dfmgr.c:558 +#: utils/fmgr/dfmgr.c:541 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "パラメータ\"dynamic_library_path\"内ã«é•·ã•ãŒ0ã®è¦ç´ ãŒã‚りã¾ã™" -#: utils/fmgr/dfmgr.c:577 +#: utils/fmgr/dfmgr.c:560 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "パラメータ\"dynamic_library_path\"内ã®è¦ç´ ãŒçµ¶å¯¾ãƒ‘スã§ã‚りã¾ã›ã‚“" @@ -26082,222 +27182,212 @@ msgstr "SQL呼ã³å‡ºã—å¯èƒ½ãªé–¢æ•°ã«ã¯PG_FUNCTION_INFO_V1(funcname)宣言 msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "info関数\"%2$s\"ã§å ±å‘Šã•れãŸAPIãƒãƒ¼ã‚¸ãƒ§ãƒ³%1$dãŒä¸æ˜Žã§ã™" -#: utils/fmgr/fmgr.c:2080 +#: utils/fmgr/fmgr.c:2109 #, c-format msgid "operator class options info is absent in function call context" msgstr "関数呼ã³å‡ºã—ã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆã«æ¼”ç®—å­ã‚¯ãƒ©ã‚¹ã‚ªãƒ—ション情報ãŒã‚りã¾ã›ã‚“" -#: utils/fmgr/fmgr.c:2147 +#: utils/fmgr/fmgr.c:2176 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "言語有効性検査関数%1$uãŒè¨€èªž%3$uã§ã¯ãªã%2$uã«å¯¾ã—ã¦å‘¼ã³å‡ºã•れã¾ã—ãŸ" -#: utils/fmgr/funcapi.c:489 +#: utils/fmgr/funcapi.c:496 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "戻り値型%2$sã¨ã—ã¦å®£è¨€ã•れãŸé–¢æ•°\"%1$s\"ã®å®Ÿéš›ã®çµæžœåž‹ã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/fmgr/funcapi.c:634 -#, c-format -msgid "argument declared %s does not contain a range type but type %s" -msgstr "%sã¨å®£è¨€ã•れãŸå¼•æ•°ãŒç¯„囲型ã§ã¯ãªãåž‹%sã‚’å«ã‚“ã§ã„ã¾ã™" - -#: utils/fmgr/funcapi.c:717 +#: utils/fmgr/funcapi.c:642 #, c-format -msgid "could not find multirange type for data type %s" -msgstr "データ型%sã®è¤‡ç¯„囲型ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" +msgid "argument declared %s does not contain a range type but type %s" +msgstr "%sã¨å®£è¨€ã•れãŸå¼•æ•°ãŒç¯„囲型ã§ã¯ãªãåž‹%sã‚’å«ã‚“ã§ã„ã¾ã™" -#: utils/fmgr/funcapi.c:1921 utils/fmgr/funcapi.c:1953 +#: utils/fmgr/funcapi.c:1929 utils/fmgr/funcapi.c:1961 #, c-format msgid "number of aliases does not match number of columns" msgstr "別åã®æ•°ãŒåˆ—ã®æ•°ã¨ä¸€è‡´ã—ã¾ã›ã‚“" -#: utils/fmgr/funcapi.c:1947 +#: utils/fmgr/funcapi.c:1955 #, c-format msgid "no column alias was provided" msgstr "列ã®åˆ¥åãŒæä¾›ã•れã¦ã„ã¾ã›ã‚“ã§ã—ãŸ" -#: utils/fmgr/funcapi.c:1971 +#: utils/fmgr/funcapi.c:1979 #, c-format msgid "could not determine row description for function returning record" msgstr "レコードを返ã™é–¢æ•°ã«ã¤ã„ã¦ã®è¡Œå®šç¾©ã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/init/miscinit.c:347 +#: utils/init/miscinit.c:353 #, c-format msgid "data directory \"%s\" does not exist" msgstr "データディレクトリ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: utils/init/miscinit.c:352 +#: utils/init/miscinit.c:358 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"ã®æ¨©é™ã‚’読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/init/miscinit.c:360 +#: utils/init/miscinit.c:366 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "指定ã•れãŸãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚りã¾ã›ã‚“" -#: utils/init/miscinit.c:376 +#: utils/init/miscinit.c:382 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "データディレクトリ\"%s\"ã®æ‰€æœ‰è€…情報ãŒé–“é•ã£ã¦ã„ã¾ã™" -#: utils/init/miscinit.c:378 +#: utils/init/miscinit.c:384 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "データディレクトリを所有ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚µãƒ¼ãƒãƒ¼ã‚’èµ·å‹•ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/init/miscinit.c:396 +#: utils/init/miscinit.c:402 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "データディレクトリ\"%s\"ã®æ¨©é™è¨­å®šãŒä¸æ­£ã§ã™" -#: utils/init/miscinit.c:398 +#: utils/init/miscinit.c:404 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "権é™ã¯ u=rwx(0700) ã¾ãŸã¯ u=rwx,g=rx (0750) ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/init/miscinit.c:456 +#: utils/init/miscinit.c:462 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "ディレクトリ\"%s\"ã«ç§»å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/init/miscinit.c:693 utils/misc/guc.c:3548 +#: utils/init/miscinit.c:720 utils/misc/guc.c:3650 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒ¼åˆ¶é™æ“作内ã§ãƒ‘ラメーター\"%s\"を設定ã§ãã¾ã›ã‚“" -#: utils/init/miscinit.c:765 +#: utils/init/miscinit.c:807 #, c-format msgid "role with OID %u does not exist" msgstr "OID ㌠%u ã§ã‚るロールã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: utils/init/miscinit.c:795 +#: utils/init/miscinit.c:853 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "ロール\"%s\"ã¯ãƒ­ã‚°ã‚¤ãƒ³ãŒè¨±å¯ã•れã¾ã›ã‚“" -#: utils/init/miscinit.c:813 +#: utils/init/miscinit.c:874 #, c-format msgid "too many connections for role \"%s\"" msgstr "ロール\"%s\"ã‹ã‚‰ã®æŽ¥ç¶šãŒå¤šã™ãŽã¾ã™" -#: utils/init/miscinit.c:912 -#, c-format -msgid "permission denied to set session authorization" -msgstr "set session authorizationç”¨ã®æ¨©é™ãŒã‚りã¾ã›ã‚“" - -#: utils/init/miscinit.c:995 +#: utils/init/miscinit.c:1045 #, c-format msgid "invalid role OID: %u" msgstr "䏿­£ãªãƒ­ãƒ¼ãƒ«ID: %u" -#: utils/init/miscinit.c:1142 +#: utils/init/miscinit.c:1192 #, c-format msgid "database system is shut down" msgstr "データベースシステムã¯ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã—ã¾ã—ãŸ" -#: utils/init/miscinit.c:1229 +#: utils/init/miscinit.c:1279 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "ロックファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/init/miscinit.c:1243 +#: utils/init/miscinit.c:1293 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "ロックファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/init/miscinit.c:1250 +#: utils/init/miscinit.c:1300 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "ロックファイル\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/init/miscinit.c:1259 +#: utils/init/miscinit.c:1309 #, c-format msgid "lock file \"%s\" is empty" msgstr "ロックファイル\"%s\"ãŒç©ºã§ã™" -#: utils/init/miscinit.c:1260 +#: utils/init/miscinit.c:1310 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." msgstr "ä»–ã®ã‚µãƒ¼ãƒãƒ¼ãŒç¨¼åƒã—ã¦ã„ã‚‹ã‹ã€å‰å›žã®ã‚µãƒ¼ãƒãƒ¼èµ·å‹•失敗ã®ãŸã‚ãƒ­ãƒƒã‚¯ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ®‹ã£ã¦ã„ã‚‹ã‹ã®ã„ãšã‚Œã‹ã§ã™" -#: utils/init/miscinit.c:1304 +#: utils/init/miscinit.c:1354 #, c-format msgid "lock file \"%s\" already exists" msgstr "ロックファイル\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: utils/init/miscinit.c:1308 +#: utils/init/miscinit.c:1358 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "ä»–ã®postgres(PID %d)ãŒãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"ã§ç¨¼å‹•ã—ã¦ã„ã¾ã›ã‚“ã‹?" -#: utils/init/miscinit.c:1310 +#: utils/init/miscinit.c:1360 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "ä»–ã®postmaster(PID %d)ãŒãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"ã§ç¨¼å‹•ã—ã¦ã„ã¾ã›ã‚“ã‹?" -#: utils/init/miscinit.c:1313 +#: utils/init/miscinit.c:1363 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "ä»–ã®postgres(PID %d)ãŒã‚½ã‚±ãƒƒãƒˆãƒ•ァイル\"%s\"を使用ã—ã¦ã„ã¾ã›ã‚“ã‹?" -#: utils/init/miscinit.c:1315 +#: utils/init/miscinit.c:1365 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "ä»–ã®postmaster(PID %d)ãŒã‚½ã‚±ãƒƒãƒˆãƒ•ァイル\"%s\"を使用ã—ã¦ã„ã¾ã›ã‚“ã‹?" -#: utils/init/miscinit.c:1366 +#: utils/init/miscinit.c:1416 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "å¤ã„ロックファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/init/miscinit.c:1368 +#: utils/init/miscinit.c:1418 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." msgstr "ã“ã®ãƒ•ァイルã¯å¶ç„¶æ®‹ã£ã¦ã—ã¾ã£ãŸã‚ˆã†ã§ã™ãŒã€å‰Šé™¤ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚手作業ã§ã“れを削除ã—å†å®Ÿè¡Œã—ã¦ãã ã•ã„。" -#: utils/init/miscinit.c:1405 utils/init/miscinit.c:1419 utils/init/miscinit.c:1430 +#: utils/init/miscinit.c:1455 utils/init/miscinit.c:1469 utils/init/miscinit.c:1480 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "ロックファイル\"%s\"ã«æ›¸ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/init/miscinit.c:1541 utils/init/miscinit.c:1683 utils/misc/guc.c:5580 +#: utils/init/miscinit.c:1591 utils/init/miscinit.c:1733 utils/misc/guc.c:5765 #, c-format msgid "could not read from file \"%s\": %m" msgstr "ファイル\"%s\"ã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/init/miscinit.c:1671 +#: utils/init/miscinit.c:1721 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m; ã¨ã‚Šã‚ãˆãšç¶šã‘ã¾ã™" -#: utils/init/miscinit.c:1696 +#: utils/init/miscinit.c:1746 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "ロックファイル\"%s\"ãŒèª¤ã£ãŸPIDã‚’ã‚‚ã£ã¦ã„ã¾ã™: %ldã€æ­£ã—ãã¯%ld" -#: utils/init/miscinit.c:1735 utils/init/miscinit.c:1751 +#: utils/init/miscinit.c:1785 utils/init/miscinit.c:1801 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\"ã¯æœ‰åйãªãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚りã¾ã›ã‚“" -#: utils/init/miscinit.c:1737 +#: utils/init/miscinit.c:1787 #, c-format msgid "File \"%s\" is missing." msgstr "ファイル\"%s\"ãŒå­˜åœ¨ã—ã¾ã›ã‚“" -#: utils/init/miscinit.c:1753 +#: utils/init/miscinit.c:1803 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "ファイル\"%s\"ã«æœ‰åйãªãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã›ã‚“。" -#: utils/init/miscinit.c:1755 +#: utils/init/miscinit.c:1805 #, c-format msgid "You might need to initdb." msgstr "initdbã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“" -#: utils/init/miscinit.c:1763 +#: utils/init/miscinit.c:1813 #, c-format msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." msgstr "データディレクトリã¯PostgreSQLãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã§åˆæœŸåŒ–ã•れã¾ã—ãŸãŒã€ã“れã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã¨ã¯äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" @@ -26370,92 +27460,97 @@ msgstr "データベース\"%s\"ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•れã¾ã—ãŸ" msgid "User does not have CONNECT privilege." msgstr "ユーザーã¯CONNECT権é™ã‚’æŒã¡ã¾ã›ã‚“。" -#: utils/init/postinit.c:386 +#: utils/init/postinit.c:389 #, c-format msgid "too many connections for database \"%s\"" msgstr "データベース\"%s\"ã¸ã®æŽ¥ç¶šãŒå¤šã™ãŽã¾ã™" -#: utils/init/postinit.c:410 utils/init/postinit.c:417 +#: utils/init/postinit.c:413 utils/init/postinit.c:420 #, c-format msgid "database locale is incompatible with operating system" msgstr "データベースã®ãƒ­ã‚±ãƒ¼ãƒ«ãŒã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: utils/init/postinit.c:411 +#: utils/init/postinit.c:414 #, c-format msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." msgstr "データベース㯠LC_COLLATE \"%s\"ã§åˆæœŸåŒ–ã•れã¦ã„ã¾ã™ãŒã€setlocale() ã§ã“れをèªè­˜ã•れã¾ã›ã‚“" -#: utils/init/postinit.c:413 utils/init/postinit.c:420 +#: utils/init/postinit.c:416 utils/init/postinit.c:423 #, c-format msgid "Recreate the database with another locale or install the missing locale." msgstr "データベースを別ã®ãƒ­ã‚±ãƒ¼ãƒ«ã§å†ç”Ÿæˆã™ã‚‹ã‹ã€ã¾ãŸã¯ä¸è¶³ã—ã¦ã„るロケールをインストールã—ã¦ãã ã•ã„" -#: utils/init/postinit.c:418 +#: utils/init/postinit.c:421 #, c-format msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." msgstr "データベース㯠LC_CTYPE \"%s\"ã§åˆæœŸåŒ–ã•れã¦ã„ã¾ã™ãŒã€setlocale()ã§ã“れをèªè­˜ã•れã¾ã›ã‚“" -#: utils/init/postinit.c:475 +#: utils/init/postinit.c:493 #, c-format msgid "database \"%s\" has a collation version mismatch" msgstr "データベース\"%s\"ã§ç…§åˆé †åºãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´ãŒèµ·ãã¦ã„ã¾ã™" -#: utils/init/postinit.c:477 +#: utils/init/postinit.c:495 #, c-format msgid "The database was created using collation version %s, but the operating system provides version %s." msgstr "データベースã¯ç…§åˆé †åºãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã§ä½œæˆã•れã¦ã„ã¾ã™ãŒã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã‚’æä¾›ã—ã¦ã„ã¾ã™ã€‚" -#: utils/init/postinit.c:480 +#: utils/init/postinit.c:498 #, c-format msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." msgstr "ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å†…ã§ãƒ‡ãƒ•ォルトã®ç…§åˆé †åºã‚’使用ã—ã¦ã„ã‚‹å…¨ã¦ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å†æ§‹ç¯‰ã—ã¦ã€ALTER DATABASE %s REFRESH COLLATION VERSIONを実行ã™ã‚‹ã‹ã€æ­£ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ©ã‚¤ãƒ–ラリを用ã„ã¦PostgreSQLをビルドã—ã¦ãã ã•ã„。" -#: utils/init/postinit.c:891 +#: utils/init/postinit.c:904 #, c-format msgid "no roles are defined in this database system" msgstr "データベースシステム内ã§ãƒ­ãƒ¼ãƒ«ãŒå®šç¾©ã•れã¦ã„ã¾ã›ã‚“" -#: utils/init/postinit.c:892 +#: utils/init/postinit.c:905 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "ã™ãã« CREATE USER \"%s\" SUPERUSER; を実行ã—ã¦ãã ã•ã„。" -#: utils/init/postinit.c:928 +#: utils/init/postinit.c:942 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "ãƒã‚¤ãƒŠãƒªã‚¢ãƒƒãƒ—ã‚°ãƒ¬ãƒ¼ãƒ‰ãƒ¢ãƒ¼ãƒ‰ä¸­ã«æŽ¥ç¶šã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: utils/init/postinit.c:949 +#: utils/init/postinit.c:962 #, c-format -msgid "remaining connection slots are reserved for roles with %s" +msgid "remaining connection slots are reserved for roles with the %s attribute" msgstr "æ®‹ã‚Šã®æŽ¥ç¶šæž ã¯%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ãŸã‚ã«äºˆç´„ã•れã¦ã„ã¾ã™" -#: utils/init/postinit.c:955 +#: utils/init/postinit.c:968 #, c-format msgid "remaining connection slots are reserved for roles with privileges of the \"%s\" role" msgstr "æ®‹ã‚Šã®æŽ¥ç¶šæž ã¯\"%s\"ãƒ­ãƒ¼ãƒ«ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ãŸã‚ã«äºˆç´„ã•れã¦ã„ã¾ã™" -#: utils/init/postinit.c:967 +#: utils/init/postinit.c:980 #, c-format msgid "permission denied to start WAL sender" msgstr "WALé€ä¿¡ãƒ—ロセスを開始ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: utils/init/postinit.c:968 +#: utils/init/postinit.c:981 #, c-format msgid "Only roles with the %s attribute may start a WAL sender process." msgstr "%s属性をæŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒWALé€ä¿¡ãƒ—ロセスを開始ã§ãã¾ã™ã€‚" -#: utils/init/postinit.c:1038 +#: utils/init/postinit.c:1099 +#, c-format +msgid "It seems to have just been dropped or renamed." +msgstr "削除ã¾ãŸã¯ãƒªãƒãƒ¼ãƒ ã•れãŸã°ã‹ã‚Šã®ã‚ˆã†ã§ã™ã€‚" + +#: utils/init/postinit.c:1103 #, c-format msgid "database %u does not exist" msgstr "データベース %u ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: utils/init/postinit.c:1127 +#: utils/init/postinit.c:1112 #, c-format -msgid "It seems to have just been dropped or renamed." -msgstr "削除ã¾ãŸã¯ãƒªãƒãƒ¼ãƒ ã•れãŸã°ã‹ã‚Šã®ã‚ˆã†ã§ã™ã€‚" +msgid "cannot connect to invalid database \"%s\"" +msgstr "無効ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%s\"ã¸ã®æŽ¥ç¶šã¯ã§ãã¾ã›ã‚“" -#: utils/init/postinit.c:1145 +#: utils/init/postinit.c:1173 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "データベースã®ã‚µãƒ–ディレクトリ\"%s\"ãŒã‚りã¾ã›ã‚“。" @@ -26480,52 +27575,47 @@ msgstr "ISO8859文字セットã«å¯¾ã™ã‚‹ç¬¦å·åŒ–æ–¹å¼ID %dã¯æƒ³å®šå¤–ã§ã™ msgid "unexpected encoding ID %d for WIN character sets" msgstr "WIN文字セットã«å¯¾ã™ã‚‹ç¬¦å·åŒ–æ–¹å¼ID %dã¯æƒ³å®šå¤–ã§ã™<" -#: utils/mb/mbutils.c:298 utils/mb/mbutils.c:901 +#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:900 #, c-format msgid "conversion between %s and %s is not supported" msgstr "%sã¨%sé–“ã®å¤‰æ›ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: utils/mb/mbutils.c:386 -#, c-format -msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" -msgstr "符å·åŒ–æ–¹å¼\"%s\"ã‹ã‚‰\"%s\"用ã®ãƒ‡ãƒ•ォルト変æ›é–¢æ•°ã¯å­˜åœ¨ã—ã¾ã›ã‚“" - -#: utils/mb/mbutils.c:403 utils/mb/mbutils.c:431 utils/mb/mbutils.c:816 utils/mb/mbutils.c:843 +#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 utils/mb/mbutils.c:842 #, c-format msgid "String of %d bytes is too long for encoding conversion." msgstr "%dãƒã‚¤ãƒˆã®æ–‡å­—列ã¯ç¬¦å·åŒ–変æ›ã§ã¯é•·ã™ãŽã¾ã™ã€‚" -#: utils/mb/mbutils.c:569 +#: utils/mb/mbutils.c:568 #, c-format msgid "invalid source encoding name \"%s\"" msgstr "䏿­£ãªå¤‰æ›å…ƒç¬¦å·åŒ–æ–¹å¼å: \"%s\"" -#: utils/mb/mbutils.c:574 +#: utils/mb/mbutils.c:573 #, c-format msgid "invalid destination encoding name \"%s\"" msgstr "䏿­£ãªå¤‰æ›å…ˆç¬¦å·åŒ–æ–¹å¼å: \"%s\"" -#: utils/mb/mbutils.c:714 +#: utils/mb/mbutils.c:713 #, c-format msgid "invalid byte value for encoding \"%s\": 0x%02x" msgstr "符å·åŒ–æ–¹å¼\"%s\"ã«å¯¾ã™ã‚‹ä¸æ­£ãªãƒã‚¤ãƒˆå€¤: 0x%02x" -#: utils/mb/mbutils.c:878 +#: utils/mb/mbutils.c:877 #, c-format msgid "invalid Unicode code point" msgstr "䏿­£ãªUnicodeコードãƒã‚¤ãƒ³ãƒˆ" -#: utils/mb/mbutils.c:1204 +#: utils/mb/mbutils.c:1201 #, c-format msgid "bind_textdomain_codeset failed" msgstr "bind_textdomain_codesetãŒå¤±æ•—ã—ã¾ã—ãŸ" -#: utils/mb/mbutils.c:1725 +#: utils/mb/mbutils.c:1718 #, c-format msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "符å·åŒ–æ–¹å¼\"%s\"ã«å¯¾ã™ã‚‹ä¸æ­£ãªãƒã‚¤ãƒˆåˆ—ã§ã™: %s" -#: utils/mb/mbutils.c:1758 +#: utils/mb/mbutils.c:1751 #, c-format msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "符å·åŒ–æ–¹å¼\"%2$s\"ã«ãŠã„ã¦ãƒã‚¤ãƒˆåˆ—%1$sã§ã‚る文字ã¯ç¬¦å·åŒ–æ–¹å¼\"%3$s\"ã§ç­‰ä¾¡ãªæ–‡å­—ã‚’æŒã¡ã¾ã›ã‚“" @@ -26540,80 +27630,80 @@ msgstr "空ã®è¨­å®šãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå: \"%s\"" msgid "could not open configuration directory \"%s\": %m" msgstr "設定ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/misc/guc.c:115 +#: utils/misc/guc.c:122 msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." msgstr "ã“ã®ãƒ‘ラメータã§ä½¿ç”¨å¯èƒ½ãªå˜ä½ã¯\"B\"ã€\"kB\"ã€\"MB\"ã€\"GB\"ãŠã‚ˆã³\"TB\"ã§ã™ã€‚" -#: utils/misc/guc.c:152 +#: utils/misc/guc.c:159 msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." msgstr "ã“ã®ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã®æœ‰åйå˜ä½ã¯ \"us\"ã€\"ms\"ã€\"s\"ã€\"min\"ã€\"h\"ãã—ã¦\"d\"ã§ã™ã€‚" -#: utils/misc/guc.c:421 +#: utils/misc/guc.c:430 #, c-format msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" msgstr "ファイル\"%2$s\"行%3$dã§èªè­˜ã§ããªã„設定パラメータ\"%1$s\"" -#: utils/misc/guc.c:461 utils/misc/guc.c:3406 utils/misc/guc.c:3646 utils/misc/guc.c:3744 utils/misc/guc.c:3842 utils/misc/guc.c:3966 utils/misc/guc.c:4069 +#: utils/misc/guc.c:470 utils/misc/guc.c:3504 utils/misc/guc.c:3748 utils/misc/guc.c:3846 utils/misc/guc.c:3944 utils/misc/guc.c:4071 utils/misc/guc.c:4212 #, c-format msgid "parameter \"%s\" cannot be changed without restarting the server" msgstr "パラメータ\"%s\"を変更ã™ã‚‹ã«ã¯ã‚µãƒ¼ãƒãƒ¼ã®å†èµ·å‹•ãŒå¿…è¦ã§ã™" -#: utils/misc/guc.c:497 +#: utils/misc/guc.c:506 #, c-format msgid "parameter \"%s\" removed from configuration file, reset to default" msgstr "パラメーター\"%s\"ãŒè¨­å®šãƒ•ァイルã‹ã‚‰å‰Šé™¤ã•れã¾ã—ãŸã€‚ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã«æˆ»ã‚Šã¾ã™ã€‚" -#: utils/misc/guc.c:562 +#: utils/misc/guc.c:571 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "パラメータ\"%s\"ã¯\"%s\"ã«å¤‰æ›´ã•れã¾ã—ãŸ" -#: utils/misc/guc.c:604 +#: utils/misc/guc.c:613 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "設定ファイル\"%s\"ã«ã¯ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã™" -#: utils/misc/guc.c:609 +#: utils/misc/guc.c:618 #, c-format msgid "configuration file \"%s\" contains errors; unaffected changes were applied" msgstr "設定ファイル\"%s\"ã«ã¯ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã™ã€‚影響ãŒãªã„変更ã¯é©ç”¨ã•れã¾ã—ãŸ" -#: utils/misc/guc.c:614 +#: utils/misc/guc.c:623 #, c-format msgid "configuration file \"%s\" contains errors; no changes were applied" msgstr "設定ファイル\"%s\"ã«ã¯ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã™ã€‚変更ã¯é©ç”¨ã•れã¾ã›ã‚“ã§ã—ãŸ" -#: utils/misc/guc.c:1211 utils/misc/guc.c:1227 +#: utils/misc/guc.c:1139 utils/misc/guc.c:1155 #, c-format msgid "invalid configuration parameter name \"%s\"" msgstr "設定パラメータå\"%s\"ã¯ä¸æ­£ã§ã™" -#: utils/misc/guc.c:1213 +#: utils/misc/guc.c:1141 #, c-format msgid "Custom parameter names must be two or more simple identifiers separated by dots." msgstr "独自パラメータã®åå‰ã¯2ã¤ä»¥ä¸Šã®å˜ç´”識別å­ã‚’ピリオドã§ã¤ãªã„ã å½¢å¼ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: utils/misc/guc.c:1229 +#: utils/misc/guc.c:1157 #, c-format msgid "\"%s\" is a reserved prefix." msgstr "\"%s\"ã¯äºˆç´„ã•れã¦ã„る接頭辞ã§ã™ã€‚" -#: utils/misc/guc.c:1243 +#: utils/misc/guc.c:1170 utils/misc/guc.c:1280 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "設定パラメータ\"%s\"ã¯ä¸æ˜Žã§ã™" -#: utils/misc/guc.c:1765 +#: utils/misc/guc.c:1802 #, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" -#: utils/misc/guc.c:1770 +#: utils/misc/guc.c:1806 #, c-format msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" msgstr "initdbã¾ãŸã¯pg_basebackupを実行ã—ã¦ã€PostgreSQLãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åˆæœŸåŒ–ã—ã¦ãã ã•ã„。\n" -#: utils/misc/guc.c:1794 +#: utils/misc/guc.c:1830 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -26623,22 +27713,22 @@ msgstr "" "--config-fileã¾ãŸã¯-Dオプションを指定ã™ã‚‹ã€ã‚ã‚‹ã„ã¯PGDATA環境変数を設\n" "定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚\n" -#: utils/misc/guc.c:1817 +#: utils/misc/guc.c:1853 #, c-format -msgid "%s: could not access the server configuration file \"%s\": %s\n" -msgstr "%s: サーãƒãƒ¼è¨­å®šãƒ•ァイル\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“: %s\n" +msgid "%s: could not access the server configuration file \"%s\": %m\n" +msgstr "%s: サーãƒãƒ¼è¨­å®šãƒ•ァイル\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" -#: utils/misc/guc.c:1845 +#: utils/misc/guc.c:1881 #, c-format msgid "" "%s does not know where to find the database system data.\n" "This can be specified as \"data_directory\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" msgstr "" "%sã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ãƒ‡ãƒ¼ã‚¿ã®å ´æ‰€ã‚’èªè­˜ã§ãã¾ã›ã‚“。\n" -"\"%s\"内ã§\"data_directory\"を指定ã™ã‚‹ã€-Dオプションを指定ã™ã‚‹ã€PGDATAç’°\n" +"\"%s\"内ã®\"data_directory\"ã§æŒ‡å®šã™ã‚‹ã‹ã€å®Ÿè¡Œæ™‚ã«-Dオプションを指定ã™ã‚‹ã€ã¾ãŸã¯PGDATAç’°\n" "境変数ã§è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n" -#: utils/misc/guc.c:1897 +#: utils/misc/guc.c:1933 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -26648,7 +27738,7 @@ msgstr "" "\"%s\"内ã§\"hba_directory\"を指定ã™ã‚‹ã€-Dオプションを指定ã™ã‚‹ã€PGDATAç’°\n" "境変数ã§è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n" -#: utils/misc/guc.c:1928 +#: utils/misc/guc.c:1964 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -26658,120 +27748,130 @@ msgstr "" "\"%s\"内ã§\"ident_directory\"を指定ã™ã‚‹ã€-Dオプションを指定ã™ã‚‹ã€PGDATAç’°\n" "境変数ã§è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n" -#: utils/misc/guc.c:2894 +#: utils/misc/guc.c:2943 msgid "Value exceeds integer range." msgstr "å€¤ãŒæ•´æ•°ç¯„囲を超ãˆã¦ã„ã¾ã™ã€‚" -#: utils/misc/guc.c:3130 +#: utils/misc/guc.c:3185 #, c-format -msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d%s%s ã¯ãƒ‘ラメータ\"%s\"ã®æœ‰åŠ¹ç¯„å›² (%d .. %d) ã‚’è¶…ãˆã¦ã„ã¾ã™" +msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d%s%s .. %d%s%s)" +msgstr "%d%s%sã¯ãƒ‘ラメータ\"%s\"ã®æœ‰åŠ¹ç¯„å›²(%d%s%s .. %d%s%s)ã®ç¯„囲外ã§ã™" -#: utils/misc/guc.c:3166 +#: utils/misc/guc.c:3226 #, c-format -msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" -msgstr "%g%s%s ã¯ãƒ‘ラメータ\"%s\"ã®æœ‰åŠ¹ç¯„å›² (%g .. %g) ã‚’è¶…ãˆã¦ã„ã¾ã™" +msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g%s%s .. %g%s%s)" +msgstr "%g%s%sã¯ãƒ‘ラメータ\"%s\"ã®æœ‰åŠ¹ç¯„å›²(%g%s%s .. %g%s%s)ã®ç¯„囲外ã§ã™" -#: utils/misc/guc.c:3366 utils/misc/guc_funcs.c:54 +#: utils/misc/guc.c:3465 #, c-format -msgid "cannot set parameters during a parallel operation" -msgstr "並列処ç†ä¸­ã¯ãƒ‘ラメータã®è¨­å®šã¯ã§ãã¾ã›ã‚“" +msgid "parameter \"%s\" cannot be set during a parallel operation" +msgstr "パラメータ\"%s\"ã¯ä¸¦åˆ—æ“作中ã«ã¯è¨­å®šã§ãã¾ã›ã‚“" -#: utils/misc/guc.c:3383 utils/misc/guc.c:4530 +#: utils/misc/guc.c:3481 utils/misc/guc.c:4696 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "パラメータ\"%s\"を変更ã§ãã¾ã›ã‚“" -#: utils/misc/guc.c:3416 +#: utils/misc/guc.c:3514 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "ç¾åœ¨ãƒ‘ラメータ\"%s\"を変更ã§ãã¾ã›ã‚“" -#: utils/misc/guc.c:3443 utils/misc/guc.c:3501 utils/misc/guc.c:4506 utils/misc/guc.c:6546 +#: utils/misc/guc.c:3541 utils/misc/guc.c:3603 utils/misc/guc.c:4671 utils/misc/guc.c:6756 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "パラメータ\"%s\"を設定ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: utils/misc/guc.c:3481 +#: utils/misc/guc.c:3583 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "接続開始後ã«ãƒ‘ラメータ\"%s\"を変更ã§ãã¾ã›ã‚“" -#: utils/misc/guc.c:3540 +#: utils/misc/guc.c:3642 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "セキュリティー定義用関数内ã§ãƒ‘ラメーター\"%s\"を設定ã§ãã¾ã›ã‚“" -#: utils/misc/guc.c:3561 +#: utils/misc/guc.c:3663 #, c-format msgid "parameter \"%s\" cannot be reset" msgstr "パラメータ\"%s\"ã¯è¨­å®šã§ãã¾ã›ã‚“" -#: utils/misc/guc.c:3568 +#: utils/misc/guc.c:3670 #, c-format msgid "parameter \"%s\" cannot be set locally in functions" msgstr "パラメータ\"%s\"ã¯é–¢æ•°å†…ã§ã¯å¤‰æ›´ã§ãã¾ã›ã‚“" -#: utils/misc/guc.c:4212 utils/misc/guc.c:4259 utils/misc/guc.c:5266 +#: utils/misc/guc.c:4370 utils/misc/guc.c:4418 utils/misc/guc.c:5450 #, c-format msgid "permission denied to examine \"%s\"" msgstr "â€%s\"ã‚’å‚ç…§ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: utils/misc/guc.c:4213 utils/misc/guc.c:4260 utils/misc/guc.c:5267 +#: utils/misc/guc.c:4371 utils/misc/guc.c:4419 utils/misc/guc.c:5451 #, c-format msgid "Only roles with privileges of the \"%s\" role may examine this parameter." msgstr "\"%s\"ãƒ­ãƒ¼ãƒ«ã®æ¨©é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ã¿ãŒã“ã®ãƒ‘ラメータをå‚ç…§ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: utils/misc/guc.c:4496 +#: utils/misc/guc.c:4629 +#, c-format +msgid "ALTER SYSTEM is not allowed in this environment" +msgstr "ALTER SYSTEMã¯ã“ã®ç’°å¢ƒã§ã¯è¨±å¯ã•れã¦ã„ã¾ã›ã‚“" + +#: utils/misc/guc.c:4661 #, c-format msgid "permission denied to perform ALTER SYSTEM RESET ALL" msgstr "ALTER SYSTEM RESET ALLã‚’è¡Œã†æ¨©é™ãŒã‚りã¾ã›ã‚“" -#: utils/misc/guc.c:4562 +#: utils/misc/guc.c:4740 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "ALTER SYSTEMã§ã®ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿å€¤ã¯æ”¹è¡Œã‚’å«ã‚“ã§ã¯ã„ã‘ã¾ã›ã‚“" -#: utils/misc/guc.c:4608 +#: utils/misc/guc.c:4785 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "ファイル\"%s\"ã®å†…容をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/misc/guc.c:4790 +#: utils/misc/guc.c:4967 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "パラメータ\"%s\"ã‚’å†å®šç¾©ã—よã†ã¨ã—ã¦ã„ã¾ã™" -#: utils/misc/guc.c:5129 +#: utils/misc/guc.c:5306 #, c-format msgid "invalid configuration parameter name \"%s\", removing it" msgstr "設定パラメータå\"%s\"ã¯ä¸æ­£ã§ã™ã€å‰Šé™¤ã—ã¾ã™" -#: utils/misc/guc.c:5131 +#: utils/misc/guc.c:5308 #, c-format msgid "\"%s\" is now a reserved prefix." msgstr "\"%s\" ã¯äºˆç´„ã•ã‚ŒãŸæŽ¥é ­è¾žã«ãªã‚Šã¾ã—ãŸã€‚" -#: utils/misc/guc.c:6000 +#: utils/misc/guc.c:6179 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "パラメータ\"%s\"ã®\"%s\"ã¸ã®å¤‰æ›´ä¸­" -#: utils/misc/guc.c:6169 +#: utils/misc/guc.c:6348 #, c-format msgid "parameter \"%s\" could not be set" msgstr "パラメータ\"%s\"を設定ã§ãã¾ã›ã‚“" -#: utils/misc/guc.c:6259 +#: utils/misc/guc.c:6438 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "パラメータ\"%s\"ã®è¨­å®šã‚’パースã§ãã¾ã›ã‚“" -#: utils/misc/guc.c:6678 +#: utils/misc/guc.c:6888 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "パラメータ\"%s\"ã®å€¤ãŒç„¡åйã§ã™: %g" +#: utils/misc/guc_funcs.c:54 +#, c-format +msgid "cannot set parameters during a parallel operation" +msgstr "並列処ç†ä¸­ã¯ãƒ‘ラメータã®è¨­å®šã¯ã§ãã¾ã›ã‚“" + #: utils/misc/guc_funcs.c:130 #, c-format msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" @@ -26787,59 +27887,59 @@ msgstr "SET %sã¯1ã¤ã®å¼•æ•°ã®ã¿ã‚’å–りã¾ã™" msgid "SET requires parameter name" msgstr "SETã«ã¯ãƒ‘ラメータåãŒå¿…è¦ã§ã™" -#: utils/misc/guc_tables.c:662 +#: utils/misc/guc_tables.c:676 msgid "Ungrouped" msgstr "ãã®ä»–" -#: utils/misc/guc_tables.c:664 +#: utils/misc/guc_tables.c:677 msgid "File Locations" msgstr "ファイルã®ä½ç½®" -#: utils/misc/guc_tables.c:666 +#: utils/misc/guc_tables.c:678 msgid "Connections and Authentication / Connection Settings" msgstr "接続ã¨èªè¨¼/接続設定" -#: utils/misc/guc_tables.c:668 +#: utils/misc/guc_tables.c:679 msgid "Connections and Authentication / TCP Settings" msgstr "接続ã¨èªè¨¼/TCP設定" -#: utils/misc/guc_tables.c:670 +#: utils/misc/guc_tables.c:680 msgid "Connections and Authentication / Authentication" msgstr "接続ã¨èªè¨¼/èªè¨¼" -#: utils/misc/guc_tables.c:672 +#: utils/misc/guc_tables.c:681 msgid "Connections and Authentication / SSL" msgstr "接続ã¨èªè¨¼/SSL" -#: utils/misc/guc_tables.c:674 +#: utils/misc/guc_tables.c:682 msgid "Resource Usage / Memory" msgstr "使用リソース/メモリ" -#: utils/misc/guc_tables.c:676 +#: utils/misc/guc_tables.c:683 msgid "Resource Usage / Disk" msgstr "使用リソース/ディスク" -#: utils/misc/guc_tables.c:678 +#: utils/misc/guc_tables.c:684 msgid "Resource Usage / Kernel Resources" msgstr "使用リソース/カーãƒãƒ«ãƒªã‚½ãƒ¼ã‚¹" -#: utils/misc/guc_tables.c:680 +#: utils/misc/guc_tables.c:685 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "使用リソース / コストベースvacuumé…å»¶" -#: utils/misc/guc_tables.c:682 +#: utils/misc/guc_tables.c:686 msgid "Resource Usage / Background Writer" msgstr "使用リソース / ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ»ãƒ©ã‚¤ã‚¿" -#: utils/misc/guc_tables.c:684 +#: utils/misc/guc_tables.c:687 msgid "Resource Usage / Asynchronous Behavior" msgstr "使用リソース / éžåŒæœŸå‹•作" -#: utils/misc/guc_tables.c:686 +#: utils/misc/guc_tables.c:688 msgid "Write-Ahead Log / Settings" msgstr "先行書ãè¾¼ã¿ãƒ­ã‚° / 設定" -#: utils/misc/guc_tables.c:688 +#: utils/misc/guc_tables.c:689 msgid "Write-Ahead Log / Checkpoints" msgstr "先行書ãè¾¼ã¿ãƒ­ã‚° / ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆ" @@ -26847,458 +27947,474 @@ msgstr "先行書ãè¾¼ã¿ãƒ­ã‚° / ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆ" msgid "Write-Ahead Log / Archiving" msgstr "先行書ãè¾¼ã¿ãƒ­ã‚° / アーカイビング" -#: utils/misc/guc_tables.c:692 +#: utils/misc/guc_tables.c:691 msgid "Write-Ahead Log / Recovery" msgstr "先行書ãè¾¼ã¿ãƒ­ã‚° / リカãƒãƒª" -#: utils/misc/guc_tables.c:694 +#: utils/misc/guc_tables.c:692 msgid "Write-Ahead Log / Archive Recovery" msgstr "先行書ãè¾¼ã¿ãƒ­ã‚° / アーカイブリカãƒãƒª" -#: utils/misc/guc_tables.c:696 +#: utils/misc/guc_tables.c:693 msgid "Write-Ahead Log / Recovery Target" msgstr "先行書ãè¾¼ã¿ãƒ­ã‚° / ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆ" -#: utils/misc/guc_tables.c:698 +#: utils/misc/guc_tables.c:694 +msgid "Write-Ahead Log / Summarization" +msgstr "先行書ãè¾¼ã¿ãƒ­ã‚° / 集約" + +#: utils/misc/guc_tables.c:695 msgid "Replication / Sending Servers" msgstr "レプリケーション / é€ä¿¡ã‚µãƒ¼ãƒãƒ¼" -#: utils/misc/guc_tables.c:700 +#: utils/misc/guc_tables.c:696 msgid "Replication / Primary Server" msgstr "レプリケーション / プライマリサーãƒãƒ¼" -#: utils/misc/guc_tables.c:702 +#: utils/misc/guc_tables.c:697 msgid "Replication / Standby Servers" msgstr "レプリケーション / スタンãƒã‚¤ã‚µãƒ¼ãƒãƒ¼" -#: utils/misc/guc_tables.c:704 +#: utils/misc/guc_tables.c:698 msgid "Replication / Subscribers" -msgstr "レプリケーション / 購読サーãƒãƒ¼" +msgstr "レプリケーション / サブスクライãƒ" -#: utils/misc/guc_tables.c:706 +#: utils/misc/guc_tables.c:699 msgid "Query Tuning / Planner Method Configuration" msgstr "å•ã„åˆã‚ã›ã®ãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚° / プランナ手法設定" -#: utils/misc/guc_tables.c:708 +#: utils/misc/guc_tables.c:700 msgid "Query Tuning / Planner Cost Constants" msgstr "å•ã„åˆã‚ã›ã®ãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚° / プランナコスト定数" -#: utils/misc/guc_tables.c:710 +#: utils/misc/guc_tables.c:701 msgid "Query Tuning / Genetic Query Optimizer" msgstr "å•ã„åˆã‚ã›ã®ãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚° / éºä¼çš„å•ã„åˆã‚ã›ã‚ªãƒ—ティマイザ" -#: utils/misc/guc_tables.c:712 +#: utils/misc/guc_tables.c:702 msgid "Query Tuning / Other Planner Options" msgstr "å•ã„åˆã‚ã›ã®ãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚° / ãã®ä»–ã®ãƒ—ランオプション" -#: utils/misc/guc_tables.c:714 +#: utils/misc/guc_tables.c:703 msgid "Reporting and Logging / Where to Log" msgstr "レãƒãƒ¼ãƒˆã¨ãƒ­ã‚°å‡ºåŠ› / ログã®å‡ºåŠ›å…ˆ" -#: utils/misc/guc_tables.c:716 +#: utils/misc/guc_tables.c:704 msgid "Reporting and Logging / When to Log" msgstr "レãƒãƒ¼ãƒˆã¨ãƒ­ã‚°å‡ºåŠ› / ログã®ã‚¿ã‚¤ãƒŸãƒ³ã‚°" -#: utils/misc/guc_tables.c:718 +#: utils/misc/guc_tables.c:705 msgid "Reporting and Logging / What to Log" msgstr "レãƒãƒ¼ãƒˆã¨ãƒ­ã‚°å‡ºåŠ› / ログã®å†…容" -#: utils/misc/guc_tables.c:720 +#: utils/misc/guc_tables.c:706 msgid "Reporting and Logging / Process Title" msgstr "レãƒãƒ¼ãƒˆã¨ãƒ­ã‚°å‡ºåŠ› / プロセス表記" -#: utils/misc/guc_tables.c:722 +#: utils/misc/guc_tables.c:707 msgid "Statistics / Monitoring" msgstr "統計情報 / 監視" -#: utils/misc/guc_tables.c:724 +#: utils/misc/guc_tables.c:708 msgid "Statistics / Cumulative Query and Index Statistics" msgstr "統計情報 / å•ã„åˆã‚ã›ã¨ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ç´¯ç©çµ±è¨ˆæƒ…å ±" -#: utils/misc/guc_tables.c:726 +#: utils/misc/guc_tables.c:709 msgid "Autovacuum" msgstr "自動VACUUM" -#: utils/misc/guc_tables.c:728 +#: utils/misc/guc_tables.c:710 msgid "Client Connection Defaults / Statement Behavior" msgstr "クライアント接続ã®ãƒ‡ãƒ•ォルト設定 / æ–‡ã®æŒ¯èˆžã„" -#: utils/misc/guc_tables.c:730 +#: utils/misc/guc_tables.c:711 msgid "Client Connection Defaults / Locale and Formatting" msgstr "クライアント接続ã®ãƒ‡ãƒ•ォルト設定 / ãƒ­ã‚±ãƒ¼ãƒ«ã¨æ•´å½¢" -#: utils/misc/guc_tables.c:732 +#: utils/misc/guc_tables.c:712 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "クライアント接続ã®ãƒ‡ãƒ•ォルト設定 / ライブラリã®äº‹å‰èª­ã¿è¾¼ã¿" -#: utils/misc/guc_tables.c:734 +#: utils/misc/guc_tables.c:713 msgid "Client Connection Defaults / Other Defaults" msgstr "クライアント接続ã®ãƒ‡ãƒ•ォルト設定 / ãã®ä»–ã®ãƒ‡ãƒ•ォルト設定" -#: utils/misc/guc_tables.c:736 +#: utils/misc/guc_tables.c:714 msgid "Lock Management" msgstr "ロック管ç†" -#: utils/misc/guc_tables.c:738 +#: utils/misc/guc_tables.c:715 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŠã‚ˆã³ãƒ—ラットフォーム間ã®äº’æ›æ€§ / PostgreSQLã®ä»¥å‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³" -#: utils/misc/guc_tables.c:740 +#: utils/misc/guc_tables.c:716 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŠã‚ˆã³ãƒ—ラットフォーム間ã®äº’æ›æ€§ / ä»–ã®ãƒ—ラットフォームãŠã‚ˆã³ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆ" -#: utils/misc/guc_tables.c:742 +#: utils/misc/guc_tables.c:717 msgid "Error Handling" msgstr "エラーãƒãƒ³ãƒ‰ãƒªãƒ³ã‚°" -#: utils/misc/guc_tables.c:744 +#: utils/misc/guc_tables.c:718 msgid "Preset Options" msgstr "事å‰è¨­å®šã‚ªãƒ—ション" -#: utils/misc/guc_tables.c:746 +#: utils/misc/guc_tables.c:719 msgid "Customized Options" msgstr "独自オプション" -#: utils/misc/guc_tables.c:748 +#: utils/misc/guc_tables.c:720 msgid "Developer Options" msgstr "開発者å‘ã‘オプション" -#: utils/misc/guc_tables.c:805 +#: utils/misc/guc_tables.c:775 msgid "Enables the planner's use of sequential-scan plans." msgstr "プランナã§ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚·ãƒ£ãƒ«ã‚¹ã‚­ãƒ£ãƒ³ãƒ—ランã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:815 +#: utils/misc/guc_tables.c:785 msgid "Enables the planner's use of index-scan plans." msgstr "プランナã§ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚¹ã‚­ãƒ£ãƒ³ãƒ—ランã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:825 +#: utils/misc/guc_tables.c:795 msgid "Enables the planner's use of index-only-scan plans." msgstr "プランナã§ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚ªãƒ³ãƒªãƒ¼ã‚¹ã‚­ãƒ£ãƒ³ãƒ—ランã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:835 +#: utils/misc/guc_tables.c:805 msgid "Enables the planner's use of bitmap-scan plans." msgstr "プランナã§ã®ãƒ“ットマップスキャンプランã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:845 +#: utils/misc/guc_tables.c:815 msgid "Enables the planner's use of TID scan plans." msgstr "プランナã§ã®TIDスキャンプランã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:855 +#: utils/misc/guc_tables.c:825 msgid "Enables the planner's use of explicit sort steps." msgstr "プランナã§ã®æ˜Žç¤ºçš„ソートã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:865 +#: utils/misc/guc_tables.c:835 msgid "Enables the planner's use of incremental sort steps." msgstr "プランナã§ã®å·®åˆ†ã‚½ãƒ¼ãƒˆå‡¦ç†ã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:875 +#: utils/misc/guc_tables.c:845 msgid "Enables the planner's use of hashed aggregation plans." msgstr "プランナã§ã®ãƒãƒƒã‚·ãƒ¥é›†ç´„プランã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:885 +#: utils/misc/guc_tables.c:855 msgid "Enables the planner's use of materialization." msgstr "プランナã§ã®å®Ÿä½“化ã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:895 +#: utils/misc/guc_tables.c:865 msgid "Enables the planner's use of memoization." msgstr "プランナã§ã®ãƒ¡ãƒ¢åŒ–ã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:905 +#: utils/misc/guc_tables.c:875 msgid "Enables the planner's use of nested-loop join plans." msgstr "プランナã§ã®ãƒã‚¹ãƒˆãƒ«ãƒ¼ãƒ—ジョインプランã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:915 +#: utils/misc/guc_tables.c:885 msgid "Enables the planner's use of merge join plans." msgstr "プランナã§ã®ãƒžãƒ¼ã‚¸ã‚¸ãƒ§ã‚¤ãƒ³ãƒ—ランã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:925 +#: utils/misc/guc_tables.c:895 msgid "Enables the planner's use of hash join plans." msgstr "プランナã§ã®ãƒãƒƒã‚·ãƒ¥ã‚¸ãƒ§ã‚¤ãƒ³ãƒ—ランã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:935 +#: utils/misc/guc_tables.c:905 msgid "Enables the planner's use of gather merge plans." msgstr "プランナã§ã®ã‚®ãƒ£ã‚¶ãƒ¼ãƒžãƒ¼ã‚¸ãƒ—ランã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:945 +#: utils/misc/guc_tables.c:915 msgid "Enables partitionwise join." msgstr "パーティションå˜ä½ã‚¸ãƒ§ã‚¤ãƒ³ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:955 +#: utils/misc/guc_tables.c:925 msgid "Enables partitionwise aggregation and grouping." msgstr "パーティションå˜ä½ã®é›†ç´„ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ”ングを有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:965 +#: utils/misc/guc_tables.c:935 msgid "Enables the planner's use of parallel append plans." msgstr "プランナã§ã®ä¸¦åˆ—アペンドプランã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:975 +#: utils/misc/guc_tables.c:945 msgid "Enables the planner's use of parallel hash plans." msgstr "プランナã§ã®ä¸¦åˆ—ãƒãƒƒã‚·ãƒ¥ãƒ—ランã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:985 +#: utils/misc/guc_tables.c:955 msgid "Enables plan-time and execution-time partition pruning." msgstr "å®Ÿè¡Œè¨ˆç”»ä½œæˆæ™‚ãŠã‚ˆã³å®Ÿè¡Œæ™‚ã®ãƒ‘ーティション除外処ç†ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:986 +#: utils/misc/guc_tables.c:956 msgid "Allows the query planner and executor to compare partition bounds to conditions in the query to determine which partitions must be scanned." msgstr "実行計画時ã¨å®Ÿè¡Œæ™‚ã®ã€ã‚¯ã‚¨ãƒªä¸­ã®æ¡ä»¶ã¨ãƒ‘ãƒ¼ãƒ†ã‚£ã‚·ãƒ§ãƒ³å¢ƒç•Œã®æ¯”較ã«åŸºã¥ã„ãŸãƒ‘ーティションå˜ä½ã®ã‚¹ã‚­ãƒ£ãƒ³é™¤å¤–処ç†ã‚’許å¯ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:997 -msgid "Enables the planner's ability to produce plans which provide presorted input for ORDER BY / DISTINCT aggregate functions." +#: utils/misc/guc_tables.c:967 +msgid "Enables the planner's ability to produce plans that provide presorted input for ORDER BY / DISTINCT aggregate functions." msgstr "プランナã«ãŠã„ã¦ORDER BY / DISTINCT集約関数ã«å¯¾ã—ã¦ã‚½ãƒ¼ãƒˆæ¸ˆã¿ã®å…¥åŠ›ã‚’ä¾›çµ¦ã™ã‚‹å®Ÿè¡Œè¨ˆç”»ã®ç”Ÿæˆã‚’有効化ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1000 -msgid "Allows the query planner to build plans which provide presorted input for aggregate functions with an ORDER BY / DISTINCT clause. When disabled, implicit sorts are always performed during execution." +#: utils/misc/guc_tables.c:970 +msgid "Allows the query planner to build plans that provide presorted input for aggregate functions with an ORDER BY / DISTINCT clause. When disabled, implicit sorts are always performed during execution." msgstr "å•ã„åˆã‚ã›ãƒ—ランナãŒORDER BY / DISTINCTå¥ã‚’使用ã™ã‚‹é›†ç´„関数ã«å¯¾ã—ã¦ã‚½ãƒ¼ãƒˆæ¸ˆã¿ã®å…¥åŠ›ã‚’ä¾›çµ¦ã™ã‚‹å®Ÿè¡Œè¨ˆç”»ã‚’生æˆã™ã‚‹ã“ã¨ã‚’許å¯ã—ã¾ã™ã€‚無効ã«ã™ã‚‹ã¨ã€å®Ÿè¡Œæ™‚ã«ã‚½ãƒ¼ãƒˆãŒå¸¸ã«æš—黙的ã«å®Ÿè¡Œã•れるよã†ã«ãªã‚Šã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1012 +#: utils/misc/guc_tables.c:982 msgid "Enables the planner's use of async append plans." msgstr "プランナã§ã®éžåŒæœŸã‚¢ãƒšãƒ³ãƒ‰ãƒ—ランã®ä½¿ç”¨ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1022 +#: utils/misc/guc_tables.c:992 +msgid "Enables reordering of GROUP BY keys." +msgstr "GROUP BYキーã«ã‚ˆã‚‹å†ã‚½ãƒ¼ãƒˆã‚’有効化ã—ã¾ã™ã€‚" + +#: utils/misc/guc_tables.c:1002 msgid "Enables genetic query optimization." msgstr "éºä¼çš„å•ã„åˆã‚ã›æœ€é©åŒ–を有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1023 +#: utils/misc/guc_tables.c:1003 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "ã“ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã§ã¯ã€å…¨æ•°æŽ¢ç´¢ã‚’ä¼´ã‚ãšã«è¡Œã†å®Ÿè¡Œè¨ˆç”»ã®ä½œæˆã‚’試ã¿ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1034 +#: utils/misc/guc_tables.c:1017 msgid "Shows whether the current user is a superuser." msgstr "ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚¹ãƒ¼ãƒ‘ーユーザーã‹ã©ã†ã‹ã‚’表示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1044 +#: utils/misc/guc_tables.c:1032 +msgid "Allows running the ALTER SYSTEM command." +msgstr "ALTER SYSTEMコマンドã®å®Ÿè¡Œã‚’許å¯ã—ã¾ã™ã€‚" + +#: utils/misc/guc_tables.c:1033 +msgid "Can be set to off for environments where global configuration changes should be made using a different method." +msgstr "グローãƒãƒ«è¨­å®šã®å¤‰æ›´ã‚’ä»–ã®æ–¹æ³•ã§è¡Œã†ã¹ã環境ã§ã¯offã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" + +#: utils/misc/guc_tables.c:1043 msgid "Enables advertising the server via Bonjour." msgstr "Bonjour を経由ã—ãŸã‚µãƒ¼ãƒãƒ¼ã®ã‚¢ãƒ‰ãƒã‚¿ã‚¤ã‚ºã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1053 +#: utils/misc/guc_tables.c:1052 msgid "Collects transaction commit time." msgstr "トランザクションã®ã‚³ãƒŸãƒƒãƒˆæ™‚刻をåŽé›†ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1062 +#: utils/misc/guc_tables.c:1061 msgid "Enables SSL connections." msgstr "SSL接続を有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1071 -msgid "Controls whether ssl_passphrase_command is called during server reload." -msgstr "サーãƒãƒ¼ãƒªãƒ­ãƒ¼ãƒ‰æ™‚ã«ã‚‚ ssl_passphrase_command を呼ã³å‡ºã™ã‹ã©ã†ã‹ã‚’指定ã—ã¾ã™ã€‚" +#: utils/misc/guc_tables.c:1070 +msgid "Controls whether \"ssl_passphrase_command\" is called during server reload." +msgstr "サーãƒãƒ¼ãƒªãƒ­ãƒ¼ãƒ‰æ™‚ã«\"ssl_passphrase_command\"を呼ã³å‡ºã™ã‹ã©ã†ã‹ã‚’制御ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1080 +#: utils/misc/guc_tables.c:1079 msgid "Give priority to server ciphersuite order." msgstr "サーãƒãƒ¼å´ã®æš—å·ã‚¹ã‚¤ãƒ¼ãƒˆé †åºã‚’優先ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1089 +#: utils/misc/guc_tables.c:1088 msgid "Forces synchronization of updates to disk." msgstr "å¼·åˆ¶çš„ã«æ›´æ–°ã‚’ディスクã«åŒæœŸã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1090 -msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This insures that a database cluster will recover to a consistent state after an operating system or hardware crash." +#: utils/misc/guc_tables.c:1089 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "サーãƒãƒ¼ã¯ã€ç¢ºå®Ÿã«æ›´æ–°ãŒç‰©ç†çš„ã«ãƒ‡ã‚£ã‚¹ã‚¯ã«æ›¸ãè¾¼ã¾ã‚Œã‚‹ã‚ˆã†ã«è¤‡æ•°ã®å ´æ‰€ã§fsync()システムコールを使用ã—ã¾ã™ã€‚ã“れã«ã‚ˆã‚Šã€ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã‚„ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ãŸå¾Œã§ã‚‚データベースクラスタã¯ä¸€è²«ã—ãŸçŠ¶æ…‹ã«å¾©æ—§ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1101 +#: utils/misc/guc_tables.c:1100 msgid "Continues processing after a checksum failure." msgstr "ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚¨ãƒ©ãƒ¼ã®ç™ºç”Ÿæ™‚ã«å‡¦ç†ã‚’継続ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1102 +#: utils/misc/guc_tables.c:1101 msgid "Detection of a checksum failure normally causes PostgreSQL to report an error, aborting the current transaction. Setting ignore_checksum_failure to true causes the system to ignore the failure (but still report a warning), and continue processing. This behavior could cause crashes or other serious problems. Only has an effect if checksums are enabled." msgstr "ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚¨ãƒ©ãƒ¼ã‚’検知ã™ã‚‹ã¨ã€é€šå¸¸PostgreSQLã¯ã‚¨ãƒ©ãƒ¼ã®å ±å‘Šã‚’行ãªã„ã€ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’中断ã•ã›ã¾ã™ã€‚ignore_checksum_failureを真ã«è¨­å®šã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã‚¨ãƒ©ãƒ¼ã‚’無視ã—ã¾ã™ï¼ˆä»£ã‚りã«è­¦å‘Šã‚’報告ã—ã¾ã™ï¼‰ã“ã®å‹•作ã¯ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚„ä»–ã®æ·±åˆ»ãªå•題を引ãèµ·ã“ã™ã‹ã‚‚ã—れã¾ã›ã‚“。ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒæœ‰åйãªå ´åˆã«ã®ã¿åŠ¹æžœãŒã‚りã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1116 +#: utils/misc/guc_tables.c:1115 msgid "Continues processing past damaged page headers." msgstr "ç ´æã—ãŸãƒšãƒ¼ã‚¸ãƒ˜ãƒƒãƒ€ãŒã‚ã£ã¦ã‚‚処ç†ã‚’継続ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1117 -msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting zero_damaged_pages to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." -msgstr "ページヘッダã®éšœå®³ãŒåˆ†ã‹ã‚‹ã¨ã€é€šå¸¸PostgreSQLã¯ã‚¨ãƒ©ãƒ¼ã®å ±å‘Šã‚’行ãªã„ã€ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’中断ã•ã›ã¾ã™ã€‚zero_damaged_pagesを真ã«è¨­å®šã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚·ã‚¹ãƒ†ãƒ ã¯ä»£ã‚りã«è­¦å‘Šã‚’報告ã—ã€éšœå®³ã®ã‚るページをゼロã§åŸ‹ã‚ã€å‡¦ç†ã‚’継続ã—ã¾ã™ã€‚ ã“ã®å‹•作ã«ã‚ˆã‚Šã€éšœå®³ã®ã‚ã£ãŸãƒšãƒ¼ã‚¸ä¸Šã«ã‚ã‚‹å…¨ã¦ã®è¡Œã®ãƒ‡ãƒ¼ã‚¿ã‚’破壊ã•れã¾ã™ã€‚" +#: utils/misc/guc_tables.c:1116 +msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting \"zero_damaged_pages\" to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." +msgstr "ページヘッダã®éšœå®³ãŒæ¤œå‡ºã•れるã¨ã€é€šå¸¸PostgreSQLã¯ã‚¨ãƒ©ãƒ¼ã®å ±å‘Šã‚’行ãªã„ã€ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’中断ã•ã›ã¾ã™ã€‚\"zero_damaged_pages\"ã‚’trueã«è¨­å®šã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚·ã‚¹ãƒ†ãƒ ã¯ä»£ã‚りã«è­¦å‘Šã‚’報告ã—ã€éšœå®³ã®ã‚るページをゼロã§åŸ‹ã‚ã€å‡¦ç†ã‚’継続ã—ã¾ã™ã€‚ ã“ã®å‹•作ã«ã‚ˆã‚Šã€éšœå®³ã®ã‚ã£ãŸãƒšãƒ¼ã‚¸ä¸Šã«ã‚ã‚‹å…¨ã¦ã®è¡Œã®ãƒ‡ãƒ¼ã‚¿ãŒç ´å£Šã•れã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1130 +#: utils/misc/guc_tables.c:1129 msgid "Continues recovery after an invalid pages failure." msgstr "䏿­£ãƒšãƒ¼ã‚¸ã‚¨ãƒ©ãƒ¼ã®ç™ºç”Ÿæ™‚ã«å‡¦ç†ã‚’継続ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1131 -msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting ignore_invalid_pages to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." -msgstr "リカãƒãƒªä¸­ã«ä¸æ­£ãªãƒšãƒ¼ã‚¸ã¸ã®å‚照を行ã†WALレコードを検出ã—ãŸå ´åˆã€PostgreSQLã¯PANICレベルã®ã‚¨ãƒ©ãƒ¼ã‚’出力ã—ã¦ãƒªã‚«ãƒãƒªã‚’中断ã—ã¾ã™ã€‚ignore_invalid_pagesã‚’trueã«è¨­å®šã™ã‚‹ã¨ã‚·ã‚¹ãƒ†ãƒ ã¯WALレコード中ã®ä¸æ­£ãªãƒšãƒ¼ã‚¸ã¸ã®å‚照を無視ã—ã¦ãƒªã‚«ãƒãƒªã‚’継続ã—ã¾ã™(ãŸã ã—ã€å¼•ãç¶šã警告ã¯å‡ºåŠ›ã—ã¾ã™)。ã“ã®æŒ™å‹•ã¯ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã€ãƒ‡ãƒ¼ã‚¿æå¤±ã€ç ´å£Šã®ä¼æ’­ãªã„ã—ã¯éš è”½ã¾ãŸã¯ä»–ã®æ·±åˆ»ãªå•題を引ãèµ·ã“ã—ã¾ã™ã€‚リカãƒãƒªãƒ¢ãƒ¼ãƒ‰ã‚‚ã—ãã¯ã‚¹ã‚¿ãƒ³ãƒã‚¤ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿æœ‰åйã¨ãªã‚Šã¾ã™ã€‚" +#: utils/misc/guc_tables.c:1130 +msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting \"ignore_invalid_pages\" to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." +msgstr "リカãƒãƒªä¸­ã«ä¸æ­£ãªãƒšãƒ¼ã‚¸ã¸ã®å‚照を行ã†WALレコードを検出ã—ãŸå ´åˆã€PostgreSQLã¯PANICレベルã®ã‚¨ãƒ©ãƒ¼ã‚’出力ã—ã¦ãƒªã‚«ãƒãƒªã‚’中断ã—ã¾ã™ã€‚â€ignore_invalid_pages\"ã‚’trueã«è¨­å®šã™ã‚‹ã¨ã‚·ã‚¹ãƒ†ãƒ ã¯WALレコード中ã®ä¸æ­£ãªãƒšãƒ¼ã‚¸ã¸ã®å‚照を無視ã—ã¦ãƒªã‚«ãƒãƒªã‚’継続ã—ã¾ã™(ãŸã ã—ã€å¼•ãç¶šã警告ã¯å‡ºåŠ›ã—ã¾ã™)。ã“ã®æŒ™å‹•ã¯ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã€ãƒ‡ãƒ¼ã‚¿æå¤±ã€ç ´å£Šã®ä¼æ’­ãªã„ã—ã¯éš è”½ã¾ãŸã¯ä»–ã®æ·±åˆ»ãªå•題を引ãèµ·ã“ã—ã¾ã™ã€‚リカãƒãƒªãƒ¢ãƒ¼ãƒ‰ã‚‚ã—ãã¯ã‚¹ã‚¿ãƒ³ãƒã‚¤ãƒ¢ãƒ¼ãƒ‰ã§ã®ã¿æœ‰åйã¨ãªã‚Šã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1149 +#: utils/misc/guc_tables.c:1148 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®å¾Œæœ€åˆã«å¤‰æ›´ã•れãŸéš›ã«ãƒšãƒ¼ã‚¸å…¨ä½“ã‚’WALã«å‡ºåŠ›ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1150 +#: utils/misc/guc_tables.c:1149 msgid "A page write in process during an operating system crash might be only partially written to disk. During recovery, the row changes stored in WAL are not enough to recover. This option writes pages when first modified after a checkpoint to WAL so full recovery is possible." msgstr "ページ書ãè¾¼ã¿å‡¦ç†ä¸­ã«ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ãŒã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã™ã‚‹ã¨ã€ãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®æ›¸ãè¾¼ã¿ãŒä¸€éƒ¨åˆ†ã®ã¿è¡Œã‚れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚リカãƒãƒªã§ã¯ã€WALã«ä¿å­˜ã•れãŸè¡Œã®å¤‰æ›´ã ã‘ã§ã¯å®Œå…¨ã«å¾©æ—§ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。ã“ã®ã‚ªãƒ—ションã«ã‚ˆã‚Šã€ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®å¾Œã®æœ€åˆã®æ›´æ–°æ™‚ã«WALã«ãƒšãƒ¼ã‚¸ã‚’出力ã™ã‚‹ãŸã‚ã€å®Œå…¨ãªå¾©æ—§ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1163 +#: utils/misc/guc_tables.c:1162 msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®å¾Œæœ€åˆã«æ›´æ–°ã•ã‚ŒãŸæ™‚ã«ã€é‡è¦ãªæ›´æ–°ã§ã¯ãªãã¦ã‚‚ページ全体をWALã«æ›¸ã出ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1173 +#: utils/misc/guc_tables.c:1172 msgid "Writes zeroes to new WAL files before first use." msgstr "æ–°ã—ã„WALファイルã®ä½¿ç”¨å‰ã«ã‚¼ãƒ­ã‚’書ãè¾¼ã¿ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1183 +#: utils/misc/guc_tables.c:1182 msgid "Recycles WAL files by renaming them." msgstr "WALファイルをåå‰ã‚’変更ã—ã¦å†åˆ©ç”¨ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1193 +#: utils/misc/guc_tables.c:1192 msgid "Logs each checkpoint." msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã‚’ログã«è¨˜éŒ²ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1202 +#: utils/misc/guc_tables.c:1201 msgid "Logs each successful connection." msgstr "æˆåŠŸã—ãŸæŽ¥ç¶šã‚’å…¨ã¦ãƒ­ã‚°ã«è¨˜éŒ²ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1211 +#: utils/misc/guc_tables.c:1210 +msgid "Logs details of pre-authentication connection handshake." +msgstr "èªè¨¼å‰æŽ¥ç¶šãƒãƒ³ãƒ‰ã‚·ã‚§ãƒ¼ã‚¯ã®è©³ç´°ã‚’ログã«å‡ºåŠ›ã—ã¾ã™ã€‚" + +#: utils/misc/guc_tables.c:1220 msgid "Logs end of a session, including duration." msgstr "セッションã®çµ‚了時刻ã¨ãã®æœŸé–“をログã«è¨˜éŒ²ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1220 +#: utils/misc/guc_tables.c:1229 msgid "Logs each replication command." msgstr "å„レプリケーションコマンドをログã«è¨˜éŒ²ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1229 +#: utils/misc/guc_tables.c:1238 msgid "Shows whether the running server has assertion checks enabled." msgstr "起動中ã®ã‚µãƒ¼ãƒãƒ¼ãŒã‚¢ã‚µãƒ¼ã‚·ãƒ§ãƒ³ãƒã‚§ãƒƒã‚¯ã‚’有効ã«ã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’表示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1240 +#: utils/misc/guc_tables.c:1249 msgid "Terminate session on any error." msgstr "何ã‹ã‚‰ã®ã‚¨ãƒ©ãƒ¼ãŒã‚れã°ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’終了ã—ã¾ã™" -#: utils/misc/guc_tables.c:1249 +#: utils/misc/guc_tables.c:1258 msgid "Reinitialize server after backend crash." msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ãŒã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ãŸå¾Œã‚µãƒ¼ãƒãƒ¼ã‚’å†åˆæœŸåŒ–ã—ã¾ã™" -#: utils/misc/guc_tables.c:1258 +#: utils/misc/guc_tables.c:1267 msgid "Remove temporary files after backend crash." msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥å¾Œã«ä¸€æ™‚ファイルを削除ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1268 +#: utils/misc/guc_tables.c:1277 msgid "Send SIGABRT not SIGQUIT to child processes after backend crash." msgstr "ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥å¾Œã«SIGQUITã§ã¯ãªãSIGABRTã‚’å­ãƒ—ロセスã«é€ä¿¡ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1278 +#: utils/misc/guc_tables.c:1287 msgid "Send SIGABRT not SIGKILL to stuck child processes." msgstr "固ã¾ã£ã¦ã„るプロセスã«SIGKILLã§ã¯ãªãSIGABRTã‚’é€ä¿¡ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1289 +#: utils/misc/guc_tables.c:1298 msgid "Logs the duration of each completed SQL statement." msgstr "完了ã—ãŸSQLå…¨ã¦ã®å®Ÿè¡Œæ™‚間をログã«è¨˜éŒ²ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1298 +#: utils/misc/guc_tables.c:1307 msgid "Logs each query's parse tree." msgstr "å•ã„åˆã‚ã›ã®ãƒ‘ースツリーをログã«è¨˜éŒ²ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1307 +#: utils/misc/guc_tables.c:1316 msgid "Logs each query's rewritten parse tree." msgstr "リライト後ã®å•ã„åˆã‚ã›ã®ãƒ‘ースツリーをログã«è¨˜éŒ²ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1316 +#: utils/misc/guc_tables.c:1325 msgid "Logs each query's execution plan." msgstr "å•ã„åˆã‚ã›ã®å®Ÿè¡Œè¨ˆç”»ã‚’ログã«è¨˜éŒ²ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1325 +#: utils/misc/guc_tables.c:1334 msgid "Indents parse and plan tree displays." msgstr "パースツリーã¨å®Ÿè¡Œè¨ˆç”»ãƒ„リーã®è¡¨ç¤ºã‚’インデントã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1334 +#: utils/misc/guc_tables.c:1343 msgid "Writes parser performance statistics to the server log." msgstr "ãƒ‘ãƒ¼ã‚µã®æ€§èƒ½çµ±è¨ˆæƒ…報をサーãƒãƒ¼ãƒ­ã‚°ã«å‡ºåŠ›ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1343 +#: utils/misc/guc_tables.c:1352 msgid "Writes planner performance statistics to the server log." msgstr "ãƒ—ãƒ©ãƒ³ãƒŠã®æ€§èƒ½çµ±è¨ˆæƒ…報をサーãƒãƒ¼ãƒ­ã‚°ã«å‡ºåŠ›ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1352 +#: utils/misc/guc_tables.c:1361 msgid "Writes executor performance statistics to the server log." msgstr "ã‚¨ã‚°ã‚¼ã‚­ãƒ¥ãƒ¼ã‚¿ã®æ€§èƒ½çµ±è¨ˆæƒ…報をサーãƒãƒ¼ãƒ­ã‚°ã«å‡ºåŠ›ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1361 +#: utils/misc/guc_tables.c:1370 msgid "Writes cumulative performance statistics to the server log." msgstr "ç´¯ç©ã®æ€§èƒ½çµ±è¨ˆæƒ…報をサーãƒãƒ¼ãƒ­ã‚°ã«å‡ºåŠ›ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1371 +#: utils/misc/guc_tables.c:1380 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "B-treeã®å„種æ“作ã«é–¢ã™ã‚‹ã‚·ã‚¹ãƒ†ãƒ ãƒªã‚½ãƒ¼ã‚¹(メモリã¨CPU)ã®ä½¿ç”¨çµ±è¨ˆã‚’ログã«è¨˜éŒ²ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1383 +#: utils/misc/guc_tables.c:1392 msgid "Collects information about executing commands." msgstr "実行中ã®ã‚³ãƒžãƒ³ãƒ‰ã«é–¢ã™ã‚‹æƒ…報をåŽé›†ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1384 +#: utils/misc/guc_tables.c:1393 msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." msgstr "ãã®ã‚³ãƒžãƒ³ãƒ‰ãŒå®Ÿè¡Œã‚’é–‹å§‹ã—ãŸæ™‚刻を伴ã£ãŸã€å„セッションã§ã®ç¾æ™‚点ã§å®Ÿè¡Œä¸­ã®ã‚³ãƒžãƒ³ãƒ‰ã«é–¢ã™ã‚‹æƒ…å ±ã®åŽé›†ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1394 +#: utils/misc/guc_tables.c:1403 msgid "Collects statistics on database activity." msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æ´»å‹•ã«ã¤ã„ã¦çµ±è¨ˆæƒ…報をåŽé›†ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1403 +#: utils/misc/guc_tables.c:1412 msgid "Collects timing statistics for database I/O activity." msgstr "データベースã®I/Oå‡¦ç†æ™‚é–“ã«é–¢ã™ã‚‹çµ±è¨ˆæƒ…報をåŽé›†ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1412 +#: utils/misc/guc_tables.c:1421 msgid "Collects timing statistics for WAL I/O activity." msgstr "WALã®I/Oå‡¦ç†æ™‚é–“ã«é–¢ã™ã‚‹çµ±è¨ˆæƒ…報をåŽé›†ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1422 +#: utils/misc/guc_tables.c:1431 msgid "Updates the process title to show the active SQL command." msgstr "活動中ã®SQLコマンドを表示ã™ã‚‹ã‚ˆã†ãƒ—ロセスタイトルを更新ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1423 +#: utils/misc/guc_tables.c:1432 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "æ–°ã—ã„SQLコマンドをサーãƒãƒ¼ãŒå—ä¿¡ã™ã‚‹åº¦ã«è¡Œã†ãƒ—ãƒ­ã‚»ã‚¹ã‚¿ã‚¤ãƒˆãƒ«ã®æ›´æ–°ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1432 +#: utils/misc/guc_tables.c:1441 msgid "Starts the autovacuum subprocess." msgstr "autovacuumサブプロセスを起動ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1442 +#: utils/misc/guc_tables.c:1451 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "LISTENã¨NOTIFYコマンドã®ãŸã‚ã®ãƒ‡ãƒãƒƒã‚°å‡ºåŠ›ã‚’ç”Ÿæˆã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1454 +#: utils/misc/guc_tables.c:1463 msgid "Emits information about lock usage." msgstr "ロック使用状æ³ã«é–¢ã™ã‚‹æƒ…報を出力ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1464 +#: utils/misc/guc_tables.c:1473 msgid "Emits information about user lock usage." msgstr "ユーザーロックã®ä½¿ç”¨çжæ³ã«é–¢ã™ã‚‹æƒ…報を出力ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1474 +#: utils/misc/guc_tables.c:1483 msgid "Emits information about lightweight lock usage." msgstr "軽é‡ãƒ­ãƒƒã‚¯ã®ä½¿ç”¨çжæ³ã«é–¢ã™ã‚‹æƒ…報を出力ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1484 +#: utils/misc/guc_tables.c:1493 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "デッドロックã®ç™ºç”Ÿæ™‚点ã®å…¨ã¦ã®ãƒ­ãƒƒã‚¯ã«ã¤ã„ã¦ã®æƒ…報をダンプã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1496 +#: utils/misc/guc_tables.c:1505 msgid "Logs long lock waits." msgstr "長時間ã®ãƒ­ãƒƒã‚¯å¾…機をログã«è¨˜éŒ²ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1505 +#: utils/misc/guc_tables.c:1514 msgid "Logs standby recovery conflict waits." msgstr "スタンãƒã‚¤ã®ãƒªã‚«ãƒãƒªè¡çªã«ã‚ˆã‚‹å¾…機をログ出力ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1514 +#: utils/misc/guc_tables.c:1523 msgid "Logs the host name in the connection logs." msgstr "接続ログ内ã§ãƒ›ã‚¹ãƒˆåを出力ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1515 +#: utils/misc/guc_tables.c:1524 msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." msgstr "デフォルトã§ã¯ã€æŽ¥ç¶šãƒ­ã‚°ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯æŽ¥ç¶šãƒ›ã‚¹ãƒˆã®IPアドレスã®ã¿ãŒè¡¨ç¤ºã•れã¾ã™ã€‚ ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã“ã¨ã§ã€ãƒ›ã‚¹ãƒˆåもログã«è¡¨ç¤ºã•れるよã†ã«ãªã‚Šã¾ã™ã€‚ ホストå解決ã®è¨­å®šã«ã‚ˆã£ã¦ã¯ã§ã€ç„¡è¦–ã§ããªã„ã»ã©ã®æ€§èƒ½ã®æ‚ªåŒ–ãŒèµ·ãã†ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。" -#: utils/misc/guc_tables.c:1526 +#: utils/misc/guc_tables.c:1535 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "\"expr=NULL\"ã¨ã„ã†å½¢ã®å¼ã¯\"expr IS NULL\"ã¨ã—ã¦æ‰±ã„ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1527 +#: utils/misc/guc_tables.c:1536 msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." msgstr "有効ã«ã—ãŸå ´åˆã€expr = NULL(ã¾ãŸã¯NULL = expr)ã¨ã„ã†å½¢ã®å¼ã¯expr IS NULLã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚ã¤ã¾ã‚Šã€exprã®è©•価ãŒNULL値ã®å ´åˆã«çœŸã‚’ã€ã•ã‚‚ãªãã°å½ã‚’è¿”ã—ã¾ã™ã€‚expr = NULLã®SQL仕様ã«åŸºã¥ã„ãŸæ­£ã—ã„動作ã¯å¸¸ã«NULL(未知)ã‚’è¿”ã™ã“ã¨ã§ã™ã€‚" -#: utils/misc/guc_tables.c:1539 -msgid "Enables per-database user names." -msgstr "データベース毎ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åを許å¯ã—ã¾ã™ã€‚" - #: utils/misc/guc_tables.c:1548 msgid "Sets the default read-only status of new transactions." msgstr "æ–°ã—ã„トランザクションã®ãƒªãƒ¼ãƒ‰ã‚ªãƒ³ãƒªãƒ¼è¨­å®šã®ãƒ‡ãƒ•ォルト値を設定。" @@ -27340,8 +28456,8 @@ msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS ã¯ä»Šå¾Œã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“; false ã®ã¿ã«è¨­å®šå¯èƒ½ã§ã™ã€‚" #: utils/misc/guc_tables.c:1632 -msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." -msgstr "標準エラー出力ã€CSVログã€ã¾ãŸã¯ãã®ä¸¡æ–¹ã‚’ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã«æ•æ‰ã™ã‚‹ãŸã‚ã®å­ãƒ—ロセスを開始ã—ã¾ã™ã€‚" +msgid "Start a subprocess to capture stderr, csvlog and/or jsonlog into log files." +msgstr "標準エラー出力ã€CSVログã€ãŠã‚ˆã³/ã¾ãŸã¯JSONログをログファイルã«è¨˜éŒ²ã™ã‚‹ãŸã‚ã®å­ãƒ—ロセスを開始ã—ã¾ã™ã€‚" #: utils/misc/guc_tables.c:1641 msgid "Truncate existing log files of same name during log rotation." @@ -27349,7 +28465,7 @@ msgstr "ãƒ­ã‚°ãƒ­ãƒ¼ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³æ™‚ã«æ—¢å­˜ã®åŒä¸€åç§°ã®ãƒ­ã‚°ãƒ•ァイ #: utils/misc/guc_tables.c:1652 msgid "Emit information about resource usage in sorting." -msgstr "ソート中ã«ãƒªã‚½ãƒ¼ã‚¹ä½¿ç”¨çжæ³ã«é–¢ã™ã‚‹æƒ…報を発行ã—ã¾ã™ã€‚" +msgstr "ソート中ã«ãƒªã‚½ãƒ¼ã‚¹ä½¿ç”¨çжæ³ã«é–¢ã™ã‚‹æƒ…報を出力ã—ã¾ã™ã€‚" #: utils/misc/guc_tables.c:1666 msgid "Generate debugging output for synchronized scanning." @@ -27357,7 +28473,7 @@ msgstr "åŒæœŸã‚¹ã‚­ãƒ£ãƒ³å‡¦ç†ã®ãƒ‡ãƒãƒƒã‚°å‡ºåŠ›ã‚’ç”Ÿæˆã—ã¾ã™ã€‚" #: utils/misc/guc_tables.c:1681 msgid "Enable bounded sorting using heap sort." -msgstr "ヒープソートを使用ã—ãŸå¢ƒç•Œã®ã‚½ãƒ¼ãƒˆå‡¦ç†ã‚’有効ã«ã—ã¾ã™" +msgstr "ヒープソートを使用ã—ãŸæœ‰ç•Œã‚½ãƒ¼ãƒˆå‡¦ç†ã‚’有効ã«ã—ã¾ã™ã€‚" #: utils/misc/guc_tables.c:1694 msgid "Emit WAL-related debugging output." @@ -27392,1367 +28508,1439 @@ msgid "Sets whether to include or exclude transaction with recovery target." msgstr "リカãƒãƒªç›®æ¨™ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’å«ã‚ã‚‹ã‹é™¤å¤–ã™ã‚‹ã‹ã‚’設定。" #: utils/misc/guc_tables.c:1778 +msgid "Starts the WAL summarizer process to enable incremental backup." +msgstr "差分ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’å¯èƒ½ã«ã™ã‚‹ãŸã‚ã®WAL集約プロセスを起動ã—ã¾ã™ã€‚" + +#: utils/misc/guc_tables.c:1788 msgid "Allows connections and queries during recovery." msgstr "リカãƒãƒªä¸­ã§ã‚‚接続ã¨å•ã„åˆã‚ã›ã‚’å—ã‘付ã‘ã¾ã™" -#: utils/misc/guc_tables.c:1788 +#: utils/misc/guc_tables.c:1798 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "å•ã„åˆã‚ã›ã®è¡çªã‚’é¿ã‘ã‚‹ãŸã‚ã®ãƒ›ãƒƒãƒˆã‚¹ã‚¿ãƒ³ãƒã‚¤ã‹ã‚‰ãƒ—ライマリã¸ã®ãƒ•ィードãƒãƒƒã‚¯ã‚’å—ã‘付ã‘ã¾ã™" -#: utils/misc/guc_tables.c:1798 +#: utils/misc/guc_tables.c:1808 msgid "Shows whether hot standby is currently active." msgstr "ç¾åœ¨ãƒ›ãƒƒãƒˆã‚¹ã‚¿ãƒ³ãƒã‚¤ãŒæœ‰åйã§ã‚ã‚‹ã‹ã©ã†ã‹ã‚’示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1809 +#: utils/misc/guc_tables.c:1819 msgid "Allows modifications of the structure of system tables." msgstr "システムテーブル構造ã®å¤‰æ›´ã‚’許å¯ã€‚" -#: utils/misc/guc_tables.c:1820 +#: utils/misc/guc_tables.c:1830 msgid "Disables reading from system indexes." msgstr "システムインデックスã®èª­ã¿è¾¼ã¿ã‚’無効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1821 +#: utils/misc/guc_tables.c:1831 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "ã“れã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®æ›´æ–°ã¯å¦¨ã’ãªã„ãŸã‚使用ã—ã¦ã‚‚安全ã§ã™ã€‚最も大ããªæ‚ªå½±éŸ¿ã¯ä½Žé€ŸåŒ–ã§ã™ã€‚" -#: utils/misc/guc_tables.c:1832 +#: utils/misc/guc_tables.c:1842 msgid "Allows tablespaces directly inside pg_tblspc, for testing." msgstr "pg_tblspc直下ã®ãƒ†ãƒ¼ãƒ–ル空間を許å¯ã—ã¾ã™ã€ãƒ†ã‚¹ãƒˆç”¨ã€‚" -#: utils/misc/guc_tables.c:1843 +#: utils/misc/guc_tables.c:1853 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã§æ¨©é™ãƒã‚§ãƒƒã‚¯ã‚’行ã†éš›ã€å¾Œæ–¹äº’æ›æ€§ãƒ¢ãƒ¼ãƒ‰ã‚’有効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1844 +#: utils/misc/guc_tables.c:1854 msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." msgstr "9.0 よりå‰ã®PostgreSQLã¨ã®äº’æ›ã®ãŸã‚ã€ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ジェクトを読んã ã‚Šå¤‰æ›´ã—ãŸã‚Šã™ã‚‹éš›ã«æ¨©é™ãƒã‚§ãƒƒã‚¯ã‚’スキップã™ã‚‹ã€‚" -#: utils/misc/guc_tables.c:1854 +#: utils/misc/guc_tables.c:1864 msgid "When generating SQL fragments, quote all identifiers." msgstr "SQL文を生æˆã™ã‚‹æ™‚ã«ã€ã™ã¹ã¦ã®è­˜åˆ¥å­ã‚’引用符ã§å›²ã¿ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1864 +#: utils/misc/guc_tables.c:1874 msgid "Shows whether data checksums are turned on for this cluster." msgstr "データãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§æœ‰åйã«ãªã£ã¦ã„ã‚‹ã‹ã©ã†ã‹ã‚’表示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1875 +#: utils/misc/guc_tables.c:1885 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "シーケンス番å·ã‚’付加ã™ã‚‹ã“ã¨ã§syslogメッセージã®é‡è¤‡ã‚’防ãŽã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1885 +#: utils/misc/guc_tables.c:1895 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "syslogã«é€å‡ºã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’行å˜ä½ã§åˆ†å‰²ã—ã¦ã€1024ãƒã‚¤ãƒˆã«åŽã¾ã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1895 +#: utils/misc/guc_tables.c:1905 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Gather ãŠã‚ˆã³ Gather Merge ã§ã‚‚下ä½ãƒ—ランを実行ã™ã‚‹ã‹ã©ã†ã‹ã‚’制御ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1896 +#: utils/misc/guc_tables.c:1906 msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "Gather ノードã§ã‚‚下ä½ãƒ—ランを実行ã™ã‚‹ã®ã‹ã€ã‚‚ã—ãã¯ãŸã ã‚¿ãƒ—ルã®åŽé›†ã®ã¿ã‚’行ã†ã®ã‹?" -#: utils/misc/guc_tables.c:1906 +#: utils/misc/guc_tables.c:1916 msgid "Allow JIT compilation." msgstr "JITコンパイルを許å¯ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1917 +#: utils/misc/guc_tables.c:1927 msgid "Register JIT-compiled functions with debugger." msgstr "JITコンパイルã•れãŸé–¢æ•°ã‚’デãƒãƒƒã‚¬ã«ç™»éŒ²ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1934 +#: utils/misc/guc_tables.c:1944 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "LLVMビットコードを出力ã—ã¦ã€JITデãƒãƒƒã‚°ã‚’容易ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1945 +#: utils/misc/guc_tables.c:1955 msgid "Allow JIT compilation of expressions." msgstr "å¼ã®JITコンパイルを許å¯ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1956 +#: utils/misc/guc_tables.c:1966 msgid "Register JIT-compiled functions with perf profiler." msgstr "perfプロファイラã«JITコンパイルã•れãŸé–¢æ•°ã‚’登録ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1973 +#: utils/misc/guc_tables.c:1983 msgid "Allow JIT compilation of tuple deforming." msgstr "タプル分解処ç†ã®JITコンパイルを許å¯ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:1984 +#: utils/misc/guc_tables.c:1994 msgid "Whether to continue running after a failure to sync data files." msgstr "データファイルã®åŒæœŸå¤±æ•—ã®å¾Œã«å‡¦ç†ã‚’継続ã™ã‚‹ã‹ã©ã†ã‹ã€‚" -#: utils/misc/guc_tables.c:1993 +#: utils/misc/guc_tables.c:2003 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "永続レプリケーションスロットãŒãªã„å ´åˆã«WALレシーãƒãŒä¸€æ™‚スロットを作æˆã™ã‚‹ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2011 +#: utils/misc/guc_tables.c:2012 +msgid "Enables event triggers." +msgstr "イベントトリガを有効ã«ã—ã¾ã™ã€‚" + +#: utils/misc/guc_tables.c:2013 +msgid "When enabled, event triggers will fire for all applicable statements." +msgstr "有効ã«ã™ã‚‹ã¨ã€ã‚¤ãƒ™ãƒ³ãƒˆãƒˆãƒªã‚¬ã¯é©ç”¨å¯èƒ½ãªã™ã¹ã¦ã®æ–‡ã«å¯¾ã—ã¦ç™ºç«ã—ã¾ã™ã€‚" + +#: utils/misc/guc_tables.c:2022 +msgid "Enables a physical standby to synchronize logical failover replication slots from the primary server." +msgstr "物ç†ã‚¹ã‚¿ãƒ³ãƒã‚¤ãŒãƒ—ライマリサーãƒãƒ¼ã‹ã‚‰è«–ç†ãƒ•ェイルオーãƒãƒ¼ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ãƒ­ãƒƒãƒˆã‚’åŒæœŸã§ãるよã†ã«ã™ã‚‹ã€‚" + +#: utils/misc/guc_tables.c:2040 msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." msgstr "次ã®WALã¸ã®å¼·åˆ¶åˆ‡ã‚Šæ›¿ãˆæ™‚間を設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2022 +#: utils/misc/guc_tables.c:2051 msgid "Sets the amount of time to wait after authentication on connection startup." msgstr "接続開始時ã®èªè¨¼å¾Œã®å¾…ã¡æ™‚間を設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2024 utils/misc/guc_tables.c:2658 +#: utils/misc/guc_tables.c:2053 utils/misc/guc_tables.c:2780 msgid "This allows attaching a debugger to the process." msgstr "ã“れã«ã‚ˆã‚Šãƒ‡ãƒãƒƒã‚¬ãŒãƒ—ãƒ­ã‚»ã‚¹ã«æŽ¥ç¶šã§ãã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2033 +#: utils/misc/guc_tables.c:2062 msgid "Sets the default statistics target." msgstr "デフォルトã®çµ±è¨ˆæƒ…å ±åŽé›†ç›®æ¨™ã‚’設定。" -#: utils/misc/guc_tables.c:2034 +#: utils/misc/guc_tables.c:2063 msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." msgstr "ALTER TABLE SET STATISTICS経由ã§åˆ—固有ã®ç›®æ¨™å€¤ã‚’æŒãŸãªã„テーブル列ã«ã¤ã„ã¦ã®çµ±è¨ˆæƒ…å ±åŽé›†ç›®æ¨™ã‚’設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2043 +#: utils/misc/guc_tables.c:2072 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "副å•ã„åˆã‚ã›ã‚’展開ã™ã‚‹ä¸Šé™ã®FROMリストã®ã‚µã‚¤ã‚ºã‚’設定。" -#: utils/misc/guc_tables.c:2045 +#: utils/misc/guc_tables.c:2074 msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." msgstr "最終的ãªFROMリストãŒã“ã®å€¤ã‚ˆã‚Šå¤šãã®è¦ç´ ã‚’æŒãŸãªã„時ã«ã€ãƒ—ランナã¯å‰¯å•ã„åˆã‚ã›ã‚’上ä½å•ã„åˆã‚ã›ã«ãƒžãƒ¼ã‚¸ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2056 +#: utils/misc/guc_tables.c:2085 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "JOINå¼ã‚’å¹³å¦åŒ–ã™ã‚‹ä¸Šé™ã®FROMリストã®ã‚µã‚¤ã‚ºã‚’設定。" -#: utils/misc/guc_tables.c:2058 +#: utils/misc/guc_tables.c:2087 msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." msgstr "最終的ã«FROMリストã®é …目数ãŒã“ã®å€¤ã‚’è¶…ãˆãªã„時ã«ã¯å¸¸ã«ã€ãƒ—ãƒ©ãƒ³ãƒŠã¯æ˜Žç¤ºçš„ãªJOIN構文をFROMé …ç›®ã®ãƒªã‚¹ãƒˆã«çµ„ã¿è¾¼ã¿ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2069 +#: utils/misc/guc_tables.c:2098 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "ã“ã®æ•°ã‚’è¶…ãˆã‚‹ã¨GEQOを使用ã™ã‚‹FROM項目数ã®é–¾å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:2079 +#: utils/misc/guc_tables.c:2108 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: effortã¯ä»–ã®GEQOパラメータã®ãƒ‡ãƒ•ォルトを設定ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•れã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2089 +#: utils/misc/guc_tables.c:2118 msgid "GEQO: number of individuals in the population." msgstr "GEQO: 集団内ã®å€‹ä½“数。" -#: utils/misc/guc_tables.c:2090 utils/misc/guc_tables.c:2100 +#: utils/misc/guc_tables.c:2119 utils/misc/guc_tables.c:2129 msgid "Zero selects a suitable default value." msgstr "0ã¯é©åˆ‡ãªãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã‚’é¸æŠžã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2099 +#: utils/misc/guc_tables.c:2128 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: アルゴリズムã®å復回数ã§ã™ã€‚" -#: utils/misc/guc_tables.c:2111 +#: utils/misc/guc_tables.c:2140 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "デッドロック状態ãŒã‚ã‚‹ã‹ã©ã†ã‹ã‚’調ã¹ã‚‹å‰ã«ãƒ­ãƒƒã‚¯ã‚’å¾…ã¤æ™‚間を設定。" -#: utils/misc/guc_tables.c:2122 +#: utils/misc/guc_tables.c:2151 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "ホットスタンãƒã‚¤ã‚µãƒ¼ãƒãƒ¼ãŒã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã•れ㟠WAL データを処ç†ã—ã¦ã„ã‚‹å ´åˆã¯ã€å•ã„åˆã‚ã›ã‚’キャンセルã™ã‚‹å‰ã«é…å»¶ç§’æ•°ã®æœ€å¤§å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:2133 +#: utils/misc/guc_tables.c:2162 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "ホットスタンãƒã‚¤ã‚µãƒ¼ãƒãƒ¼ãŒã‚¹ãƒˆãƒªãƒ¼ãƒ ã® WAL データを処ç†ã—ã¦ã„ã‚‹å ´åˆã¯ã€å•ã„åˆã‚ã›ã‚’キャンセルã™ã‚‹å‰ã«é…å»¶ç§’æ•°ã®æœ€å¤§å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:2144 +#: utils/misc/guc_tables.c:2173 msgid "Sets the minimum delay for applying changes during recovery." msgstr "リカãƒãƒªä¸­ã®å¤‰æ›´ã®é©ç”¨ã®æœ€å°é…延時間を設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2155 +#: utils/misc/guc_tables.c:2184 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "WALå—信プロセスãŒé€å‡ºå´ã‚µãƒ¼ãƒãƒ¼ã¸è¡Œã†çжæ³å ±å‘Šã®æœ€å¤§é–“隔を設定。" -#: utils/misc/guc_tables.c:2166 +#: utils/misc/guc_tables.c:2195 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "é€å‡ºå´ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰ã®ãƒ‡ãƒ¼ã‚¿å—信を待機ã™ã‚‹æœ€é•·æ™‚間を設定。" -#: utils/misc/guc_tables.c:2177 +#: utils/misc/guc_tables.c:2206 msgid "Sets the maximum number of concurrent connections." msgstr "åŒæ™‚æŽ¥ç¶šæ•°ã®æœ€å¤§å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:2188 +#: utils/misc/guc_tables.c:2217 msgid "Sets the number of connection slots reserved for superusers." msgstr "スーパーユーザーã«ã‚ˆã‚‹æŽ¥ç¶šç”¨ã«äºˆç´„ã•ã‚Œã‚‹æŽ¥ç¶šã‚¹ãƒ­ãƒƒãƒˆã®æ•°ã‚’設定。" -#: utils/misc/guc_tables.c:2198 +#: utils/misc/guc_tables.c:2227 msgid "Sets the number of connection slots reserved for roles with privileges of pg_use_reserved_connections." msgstr "pg_use_reserved_connections権é™ã‚’æŒã¤ãƒ­ãƒ¼ãƒ«ã®ãŸã‚ã«äºˆç´„ã™ã‚‹æŽ¥ç¶šã‚¹ãƒ­ãƒƒãƒˆã®æ•°ã‚’設定。" -#: utils/misc/guc_tables.c:2209 +#: utils/misc/guc_tables.c:2238 msgid "Amount of dynamic shared memory reserved at startup." msgstr "起動時ã«äºˆç´„ã•れる動的共有メモリã®é‡ã€‚" -#: utils/misc/guc_tables.c:2224 +#: utils/misc/guc_tables.c:2253 msgid "Sets the number of shared memory buffers used by the server." msgstr "サーãƒãƒ¼ã§ä½¿ç”¨ã•れる共有メモリã®ãƒãƒƒãƒ•ァ数を設定。" -#: utils/misc/guc_tables.c:2235 +#: utils/misc/guc_tables.c:2264 msgid "Sets the buffer pool size for VACUUM, ANALYZE, and autovacuum." msgstr "VACUUM, ANALYZE, ãŠã‚ˆã³è‡ªå‹•VACUUMã§ä½¿ç”¨ã™ã‚‹ãƒãƒƒãƒ•ァプールã®ã‚µã‚¤ã‚ºã‚’設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2246 +#: utils/misc/guc_tables.c:2275 msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." msgstr "サーãƒãƒ¼ã®ä¸»å…±æœ‰ãƒ¡ãƒ¢ãƒªé ˜åŸŸã®ã‚µã‚¤ã‚ºã‚’表示ã—ã¾ã™(MBå˜ä½ã«åˆ‡ã‚Šä¸Šã’られã¾ã™)" -#: utils/misc/guc_tables.c:2257 +#: utils/misc/guc_tables.c:2286 msgid "Shows the number of huge pages needed for the main shared memory area." msgstr "主共有メモリ領域ã«å¿…è¦ã¨ãªã‚‹ãƒ’ãƒ¥ãƒ¼ã‚¸ãƒšãƒ¼ã‚¸ã®æ•°ã‚’表示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2258 +#: utils/misc/guc_tables.c:2287 msgid "-1 indicates that the value could not be determined." msgstr "-1ã¯ã“ã®å€¤ãŒç¢ºå®šã§ããªã‹ã£ãŸã“ã¨ã‚’示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2268 +#: utils/misc/guc_tables.c:2297 +msgid "Sets the size of the dedicated buffer pool used for the commit timestamp cache." +msgstr "コミットタイムスタンプã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã§å°‚有ã™ã‚‹ãƒãƒƒãƒ•ァプールã®ã‚µã‚¤ã‚ºã‚’設定ã™ã‚‹ã€‚" + +#: utils/misc/guc_tables.c:2298 utils/misc/guc_tables.c:2353 utils/misc/guc_tables.c:2364 +msgid "Specify 0 to have this value determined as a fraction of shared_buffers." +msgstr "0ã§shared_buffersã«å¯¾ã™ã‚‹å‰²åˆã¨ã—ã¦ã“ã®å€¤ã‚’決定ã—ã¾ã™ã€‚" + +#: utils/misc/guc_tables.c:2308 +msgid "Sets the size of the dedicated buffer pool used for the MultiXact member cache." +msgstr "マルãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãƒ¡ãƒ³ãƒãƒ¼ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã§å°‚有ã™ã‚‹ãƒãƒƒãƒ•ァプールã®ã‚µã‚¤ã‚ºã‚’設定ã™ã‚‹ã€‚" + +#: utils/misc/guc_tables.c:2319 +msgid "Sets the size of the dedicated buffer pool used for the MultiXact offset cache." +msgstr "マルãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚ªãƒ•セットã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã§å°‚有ã™ã‚‹ãƒãƒƒãƒ•ァプールã®ã‚µã‚¤ã‚ºã‚’設定ã™ã‚‹ã€‚" + +#: utils/misc/guc_tables.c:2330 +msgid "Sets the size of the dedicated buffer pool used for the LISTEN/NOTIFY message cache." +msgstr "LISTEN/NOTIFYã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã§å°‚有ã™ã‚‹ãƒãƒƒãƒ•ァプールã®ã‚µã‚¤ã‚ºã‚’設定ã™ã‚‹ã€‚" + +#: utils/misc/guc_tables.c:2341 +msgid "Sets the size of the dedicated buffer pool used for the serializable transaction cache." +msgstr "直列化å¯èƒ½ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã§å°‚有ã™ã‚‹ãƒãƒƒãƒ•ァプールã®ã‚µã‚¤ã‚ºã‚’設定ã™ã‚‹ã€‚" + +#: utils/misc/guc_tables.c:2352 +msgid "Sets the size of the dedicated buffer pool used for the subtransaction cache." +msgstr "サブトランザクションキャッシュ専用ã®ãƒãƒƒãƒ•ァプールã®ã‚µã‚¤ã‚ºã‚’設定ã™ã‚‹ã€‚" + +#: utils/misc/guc_tables.c:2363 +msgid "Sets the size of the dedicated buffer pool used for the transaction status cache." +msgstr "トランザクション状態ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã§å°‚有ã™ã‚‹ãƒãƒƒãƒ•ァプールã®ã‚µã‚¤ã‚ºã‚’設定ã™ã‚‹ã€‚" + +#: utils/misc/guc_tables.c:2374 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "å„セッションã§ä½¿ç”¨ã•れる一時ãƒãƒƒãƒ•ã‚¡ã®æœ€å¤§æ•°ã‚’設定。" -#: utils/misc/guc_tables.c:2279 +#: utils/misc/guc_tables.c:2385 msgid "Sets the TCP port the server listens on." msgstr "サーãƒãƒ¼ãŒæŽ¥ç¶šã‚’監視ã™ã‚‹TCPãƒãƒ¼ãƒˆã‚’設定。" -#: utils/misc/guc_tables.c:2289 +#: utils/misc/guc_tables.c:2395 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Unixドメインソケットã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã‚’設定。" -#: utils/misc/guc_tables.c:2290 +#: utils/misc/guc_tables.c:2396 msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Unixドメインソケットã¯ã€é€šå¸¸ã®Unixファイルシステム権é™ã®è¨­å®šã‚’使ã„ã¾ã™ã€‚ ã“ã®ãƒ‘ラメータ値㯠chmod 㨠umask システムコールãŒå—ã‘付ã‘る数値ã®ãƒ¢ãƒ¼ãƒ‰æŒ‡å®šã‚’想定ã—ã¦ã„ã¾ã™ï¼ˆæ…£ç¿’çš„ãª8進数書å¼ã‚’使ã†ãŸã‚ã«ã¯ã€0(ゼロ)ã§å§‹ã‚ãªãã¦ã¯ãªã‚Šã¾ã›ã‚“)。 " -#: utils/misc/guc_tables.c:2304 +#: utils/misc/guc_tables.c:2410 msgid "Sets the file permissions for log files." msgstr "ログファイルã®ãƒ‘ーミッションを設定。" -#: utils/misc/guc_tables.c:2305 +#: utils/misc/guc_tables.c:2411 msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "ã“ã®ãƒ‘タメータ値㯠chmod ã‚„ umask システムコールã§ä½¿ãˆã‚‹ã‚ˆã†ãªæ•°å€¤ãƒ¢ãƒ¼ãƒ‰æŒ‡å®šã§ã‚ã‚‹ã“ã¨ãŒæƒ³å®šã•れã¾ã™ï¼ˆæ…£ç¿’çš„ãªè¨˜æ³•ã§ã‚ã‚‹8進数書å¼ã‚’使ã†å ´åˆã¯å…ˆé ­ã«0(ゼロ) ã‚’ã¤ã‘ã¦ãã ã•ã„)。 " -#: utils/misc/guc_tables.c:2319 +#: utils/misc/guc_tables.c:2425 msgid "Shows the mode of the data directory." msgstr "データディレクトリã®ãƒ¢ãƒ¼ãƒ‰ã‚’表示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2320 +#: utils/misc/guc_tables.c:2426 msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "ã“ã®ãƒ‘タメータ値㯠chmod ã‚„ umask システムコールãŒå—ã‘付ã‘る数値形å¼ã®ãƒ¢ãƒ¼ãƒ‰æŒ‡å®šã§ã™ï¼ˆæ…£ç¿’çš„ãª8進形å¼ã‚’使ã†å ´åˆã¯å…ˆé ­ã«0(ゼロ) ã‚’ã¤ã‘ã¦ãã ã•ã„)。 " -#: utils/misc/guc_tables.c:2333 +#: utils/misc/guc_tables.c:2439 msgid "Sets the maximum memory to be used for query workspaces." msgstr "å•ã„åˆã‚ã›ã®ä½œæ¥­ç”¨ç©ºé–“ã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã‚‹ãƒ¡ãƒ¢ãƒªã®æœ€å¤§å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:2334 +#: utils/misc/guc_tables.c:2440 msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." msgstr "内部ソートæ“作ã¨ãƒãƒƒã‚·ãƒ¥ãƒ†ãƒ¼ãƒ–ルã§ä½¿ã‚れるメモリã®é‡ãŒã“ã®é‡ã«é”ã—ãŸæ™‚ã«ä¸€æ™‚ディスクファイルã¸ã®åˆ‡æ›¿ãˆã‚’行ã„ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2346 +#: utils/misc/guc_tables.c:2457 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "ä¿å®ˆä½œæ¥­ã§ä½¿ç”¨ã•れる最大メモリé‡ã‚’設定。" -#: utils/misc/guc_tables.c:2347 +#: utils/misc/guc_tables.c:2458 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "VACUUMã‚„CREATE INDEXãªã©ã®ä½œæ¥­ãŒå«ã¾ã‚Œã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2357 +#: utils/misc/guc_tables.c:2468 msgid "Sets the maximum memory to be used for logical decoding." msgstr "è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã§ä½¿ç”¨ã™ã‚‹ãƒ¡ãƒ¢ãƒªé‡ã®ä¸Šé™ã‚’設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2358 +#: utils/misc/guc_tables.c:2469 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." msgstr "個々ã®å†…部リオーダãƒãƒƒãƒ•ã‚¡ã¯ãƒ‡ã‚£ã‚¹ã‚¯ã«æ›¸ã出ã™å‰ã«ã“れã ã‘ã®é‡ã®ãƒ¡ãƒ¢ãƒªã‚’使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2374 +#: utils/misc/guc_tables.c:2485 msgid "Sets the maximum stack depth, in kilobytes." msgstr "ã‚¹ã‚¿ãƒƒã‚¯é•·ã®æœ€å¤§å€¤ã‚’キロãƒã‚¤ãƒˆå˜ä½ã§è¨­å®šã€‚" -#: utils/misc/guc_tables.c:2385 +#: utils/misc/guc_tables.c:2496 msgid "Limits the total size of all temporary files used by each process." msgstr "å„プロセスã§ä½¿ç”¨ã•れる全ã¦ã®ä¸€æ™‚ファイルã®åˆè¨ˆã‚µã‚¤ã‚ºã‚’制é™ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2386 +#: utils/misc/guc_tables.c:2497 msgid "-1 means no limit." msgstr "-1ã¯ç„¡åˆ¶é™ã‚’æ„味ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2396 +#: utils/misc/guc_tables.c:2507 msgid "Vacuum cost for a page found in the buffer cache." msgstr "ãƒãƒƒãƒ•ァキャッシュã«ã‚ã‚‹1ã¤ã®ãƒšãƒ¼ã‚¸ã‚’VACUUM処ç†ã™ã‚‹éš›ã®ã‚³ã‚¹ãƒˆã€‚" -#: utils/misc/guc_tables.c:2406 +#: utils/misc/guc_tables.c:2517 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "ãƒãƒƒãƒ•ァキャッシュã«ãªã„1ã¤ã®ãƒšãƒ¼ã‚¸ã‚’VACUUM処ç†ã™ã‚‹éš›ã®ã‚³ã‚¹ãƒˆã€‚" -#: utils/misc/guc_tables.c:2416 +#: utils/misc/guc_tables.c:2527 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "VACUUM処ç†ãŒ1ã¤ã®ãƒšãƒ¼ã‚¸ã‚’ダーティã«ã—ãŸéš›ã«èª²ã™ã‚³ã‚¹ãƒˆã€‚" -#: utils/misc/guc_tables.c:2426 +#: utils/misc/guc_tables.c:2537 msgid "Vacuum cost amount available before napping." msgstr "VACUUM処ç†ã‚’一時休止ã•ã›ã‚‹ã¾ã§ã«ä½¿ç”¨ã§ãるコスト。" -#: utils/misc/guc_tables.c:2436 +#: utils/misc/guc_tables.c:2547 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "自動VACUUM用ã®VACUUM処ç†ã‚’一時休止ã•ã›ã‚‹ã¾ã§ã«ä½¿ç”¨ã§ãるコスト。" -#: utils/misc/guc_tables.c:2446 +#: utils/misc/guc_tables.c:2557 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "å„サーãƒãƒ¼ãƒ—ロセスã§åŒæ™‚ã«ã‚ªãƒ¼ãƒ—ンã§ãã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¤§æ•°ã‚’設定。" -#: utils/misc/guc_tables.c:2459 +#: utils/misc/guc_tables.c:2570 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "åŒæ™‚ã«æº–備状態ã«ã§ãã‚‹ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®æœ€å¤§æ•°ã‚’設定。" -#: utils/misc/guc_tables.c:2470 +#: utils/misc/guc_tables.c:2581 msgid "Sets the minimum OID of tables for tracking locks." msgstr "ロックã®è¿½è·¡ã‚’行ã†ãƒ†ãƒ¼ãƒ–ãƒ«ã®æœ€å°ã®OIDを設定。" -#: utils/misc/guc_tables.c:2471 +#: utils/misc/guc_tables.c:2582 msgid "Is used to avoid output on system tables." msgstr "システムテーブルã«é–¢ã™ã‚‹ã®å‡ºåŠ›ã‚’é¿ã‘ã‚‹ãŸã‚ã«ä½¿ã„ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2480 +#: utils/misc/guc_tables.c:2591 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "ç„¡æ¡ä»¶ã§ãƒ­ãƒƒã‚¯ã®è¿½è·¡ã‚’行ã†ãƒ†ãƒ¼ãƒ–ルã®OIDを設定。" -#: utils/misc/guc_tables.c:2492 +#: utils/misc/guc_tables.c:2603 msgid "Sets the maximum allowed duration of any statement." msgstr "ã‚らゆる文ã«å¯¾ã—ã¦å®Ÿè¡Œæ™‚é–“ã¨ã—ã¦è¨±å®¹ã™ã‚‹ä¸Šé™å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:2493 utils/misc/guc_tables.c:2504 utils/misc/guc_tables.c:2515 utils/misc/guc_tables.c:2526 +#: utils/misc/guc_tables.c:2604 utils/misc/guc_tables.c:2615 utils/misc/guc_tables.c:2626 utils/misc/guc_tables.c:2637 utils/misc/guc_tables.c:2648 msgid "A value of 0 turns off the timeout." msgstr "0ã§ã“ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã¯ç„¡åйã«ãªã‚Šã¾ã™ã€‚ " -#: utils/misc/guc_tables.c:2503 +#: utils/misc/guc_tables.c:2614 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "ロックã®å¾…æ©Ÿã®æœ€å¤§è¨±å®¹æ™‚間を設定。" -#: utils/misc/guc_tables.c:2514 +#: utils/misc/guc_tables.c:2625 msgid "Sets the maximum allowed idle time between queries, when in a transaction." msgstr "å•ã„åˆã‚ã›é–“ã®ã‚¢ã‚¤ãƒ‰ãƒ«æ™‚é–“ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å†…ã«ãŠã‘る最大許容値を設定。" -#: utils/misc/guc_tables.c:2525 +#: utils/misc/guc_tables.c:2636 +msgid "Sets the maximum allowed duration of any transaction within a session (not a prepared transaction)." +msgstr "(準備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ãªã„)セッション内ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®æœ€å¤§è¨±å®¹æ™‚間を設定。" + +#: utils/misc/guc_tables.c:2647 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." msgstr "å•ã„åˆã‚ã›é–“ã®ã‚¢ã‚¤ãƒ‰ãƒ«æ™‚é–“ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å¤–ã«ãŠã‘る最大許容値を設定。" -#: utils/misc/guc_tables.c:2536 +#: utils/misc/guc_tables.c:2658 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "VACUUM ã«ãƒ†ãƒ¼ãƒ–ル行ã®å‡çµã‚’ã•ã›ã‚‹æœ€å°ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ID差分。" -#: utils/misc/guc_tables.c:2546 +#: utils/misc/guc_tables.c:2668 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "行ã®å‡çµã®ãŸã‚ã®ãƒ†ãƒ¼ãƒ–ル全体スキャンを強制ã•ã›ã‚‹æ™‚ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ID差分。" -#: utils/misc/guc_tables.c:2556 +#: utils/misc/guc_tables.c:2678 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "テーブル行ã§ã®ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDã®å‡çµã‚’強制ã™ã‚‹æœ€å°ã®ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å·®åˆ†ã€‚" -#: utils/misc/guc_tables.c:2566 +#: utils/misc/guc_tables.c:2688 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "行ã®å‡çµã®ãŸã‚ã«ãƒ†ãƒ¼ãƒ–ル全体スキャンを強制ã™ã‚‹æ™‚点ã®ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å·®åˆ†ã€‚" -#: utils/misc/guc_tables.c:2576 +#: utils/misc/guc_tables.c:2698 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "VACUUMã«ãŠã„ã¦å‘¨å›žã«ã‚ˆã‚‹åœæ­¢ã‚’回é¿ã™ã‚‹ãŸã‚ã®ãƒ•ェイルセーフを実行ã•れるã¾ã§ã®çµŒéŽãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³æ•°ã€‚" -#: utils/misc/guc_tables.c:2585 +#: utils/misc/guc_tables.c:2707 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "VACUUMã«ãŠã„ã¦å‘¨å›žã«ã‚ˆã‚‹åœæ­¢ã‚’回é¿ã™ã‚‹ãŸã‚ã®ãƒ•ェイルセーフãŒå®Ÿè¡Œã•れるã¾ã§ã®çµŒéŽãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³æ•°ã€‚" -#: utils/misc/guc_tables.c:2598 +#: utils/misc/guc_tables.c:2720 msgid "Sets the maximum number of locks per transaction." msgstr "1トランザクション当ãŸã‚Šã®ãƒ­ãƒƒã‚¯æ•°ã®ä¸Šé™ã‚’設定。" -#: utils/misc/guc_tables.c:2599 -msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction objects per server process or prepared transaction will need to be locked at any one time." -msgstr "共有ロックテーブルã®å¤§ãã•ã¯ã€æœ€å¤§ã§ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスã¾ãŸã¯æº–備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã”ã¨ã«max_locks_per_transaction個ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れる必è¦ãŒã‚ã‚‹ã¨ã„ã†ä»®å®šã®ä¸‹ã«æ±ºå®šã•れã¾ã™ã€‚" +#: utils/misc/guc_tables.c:2721 +msgid "The shared lock table is sized on the assumption that at most \"max_locks_per_transaction\" objects per server process or prepared transaction will need to be locked at any one time." +msgstr "共有ロックテーブルã®å¤§ãã•ã¯ã€ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスã¾ãŸã¯æº–備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã”ã¨ã«æœ€å¤§ã§\"max_locks_per_transaction\"個ã®ã‚ªãƒ–ジェクトãŒåŒæ™‚ã«ãƒ­ãƒƒã‚¯ã•れるã“ã¨ã‚’剿ã¨ã—ã¦æ±ºå®šã•れã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2610 +#: utils/misc/guc_tables.c:2732 msgid "Sets the maximum number of predicate locks per transaction." msgstr "1トランザクション当ãŸã‚Šã®è¿°èªžãƒ­ãƒƒã‚¯æ•°ã®ä¸Šé™ã‚’設定。" -#: utils/misc/guc_tables.c:2611 -msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction objects per server process or prepared transaction will need to be locked at any one time." -msgstr "共有述語ロックテーブルã®å¤§ãã•ã¯ã€æœ€å¤§ã§ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスã¾ãŸã¯æº–備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã”ã¨ã«max_pred_locks_per_transaction個ã®ã‚ªãƒ–ジェクトãŒã„ã‹ãªã‚‹æ™‚点ã§ã‚‚ロックã•れる必è¦ãŒã‚ã‚‹ã¨ã„ã†ä»®å®šã®ä¸‹ã«æ±ºã‚られã¾ã™ã€‚" +#: utils/misc/guc_tables.c:2733 +msgid "The shared predicate lock table is sized on the assumption that at most \"max_pred_locks_per_transaction\" objects per server process or prepared transaction will need to be locked at any one time." +msgstr "共有述語ロックテーブルã®å¤§ãã•ã¯ã€ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスã¾ãŸã¯æº–備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã”ã¨ã«æœ€å¤§ã§\"max_pred_locks_per_transaction\"個ã®ã‚ªãƒ–ジェクトãŒåŒæ™‚ã«ãƒ­ãƒƒã‚¯ã•れるã“ã¨ã‚’剿ã¨ã—ã¦æ±ºå®šã•れã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2622 +#: utils/misc/guc_tables.c:2744 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "1リレーション当ãŸã‚Šã§è¿°èªžãƒ­ãƒƒã‚¯ã•れるページã¨ã‚¿ãƒ—ãƒ«ã®æ•°ã®ä¸Šé™å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:2623 +#: utils/misc/guc_tables.c:2745 msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." msgstr "ã‚るコãƒã‚¯ã‚·ãƒ§ãƒ³ã§ã€åŒã˜ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³å†…ã§ãƒ­ãƒƒã‚¯ã•れるページ数ã¨ã‚¿ãƒ—ル数ã®åˆè¨ˆãŒã“ã®å€¤ã‚’è¶…ãˆãŸã¨ãã«ã¯ã€ã“れらã®ãƒ­ãƒƒã‚¯ã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãƒ¬ãƒ™ãƒ«ã®ãƒ­ãƒƒã‚¯ã«ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2633 +#: utils/misc/guc_tables.c:2755 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "1ページã‚ãŸã‚Šã§è¿°èªžãƒ­ãƒƒã‚¯ã•れるタプル数ã®ä¸Šé™å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:2634 +#: utils/misc/guc_tables.c:2756 msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." msgstr "ã‚るコãƒã‚¯ã‚·ãƒ§ãƒ³ã§ ã€åŒã˜ãƒšãƒ¼ã‚¸ä¸Šã§ãƒ­ãƒƒã‚¯ã•ã‚Œã‚‹ã‚¿ãƒ—ãƒ«ã®æ•°ãŒã“ã®å€¤ã‚’è¶…ãˆãŸã¨ãã«ã¯ã€ã“れらã®ãƒ­ãƒƒã‚¯ã¯ãƒšãƒ¼ã‚¸ãƒ¬ãƒ™ãƒ«ã®ãƒ­ãƒƒã‚¯ã«ç½®ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2644 +#: utils/misc/guc_tables.c:2766 msgid "Sets the maximum allowed time to complete client authentication." msgstr "クライアントèªè¨¼ã®å®Œäº†ã¾ã§ã®æœ€å¤§è¨±å®¹æ™‚間を設定。" -#: utils/misc/guc_tables.c:2656 +#: utils/misc/guc_tables.c:2778 msgid "Sets the amount of time to wait before authentication on connection startup." msgstr "接続開始時ã®èªè¨¼å‰ã®å¾…ã¡æ™‚間を設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2668 +#: utils/misc/guc_tables.c:2790 +msgid "Sets the maximum number of allocated pages for NOTIFY / LISTEN queue." +msgstr "LISTEN / NOTIFYキュー用ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã‚‹ãƒšãƒ¼ã‚¸æ•°ã®ä¸Šé™ã‚’設定。" + +#: utils/misc/guc_tables.c:2800 msgid "Buffer size for reading ahead in the WAL during recovery." msgstr "リカãƒãƒªä¸­ã®WAL先読ã¿ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚ºã€‚" -#: utils/misc/guc_tables.c:2669 +#: utils/misc/guc_tables.c:2801 msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." msgstr "å‚照先データブロックã®å…ˆè¡Œèª­ã¿è¾¼ã¿ã®ãŸã‚ã®WAL先読ã¿ã®æœ€å¤§é‡ã€‚" -#: utils/misc/guc_tables.c:2679 +#: utils/misc/guc_tables.c:2811 msgid "Sets the size of WAL files held for standby servers." msgstr "スタンãƒã‚¤ã‚µãƒ¼ãƒãƒ¼ã®ãŸã‚ã«ç¢ºä¿ã™ã‚‹WALã®é‡ã‚’設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2690 +#: utils/misc/guc_tables.c:2822 msgid "Sets the minimum size to shrink the WAL to." msgstr "WALを縮å°ã•ã›ã‚‹éš›ã®æœ€å°ã®ã‚µã‚¤ã‚ºã‚’設定。" -#: utils/misc/guc_tables.c:2702 +#: utils/misc/guc_tables.c:2834 msgid "Sets the WAL size that triggers a checkpoint." msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®å¥‘機ã¨ãªã‚‹WALã®ã‚µã‚¤ã‚ºã‚’指定。" -#: utils/misc/guc_tables.c:2714 +#: utils/misc/guc_tables.c:2846 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "自動WALãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®æœ€å¤§é–“隔を設定。" -#: utils/misc/guc_tables.c:2725 +#: utils/misc/guc_tables.c:2857 msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." msgstr "WALã®é‡å¥‘機ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãŒé«˜é »åº¦ã§èµ·ãã‚‹å ´åˆã«ã€è­¦å‘Šã‚’発ã™ã‚‹ã¾ã§ã®å›žæ•°ã‚’設定。" -#: utils/misc/guc_tables.c:2727 +#: utils/misc/guc_tables.c:2859 msgid "Write a message to the server log if checkpoints caused by the filling of WAL segment files happen more frequently than this amount of time. Zero turns off the warning." -msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã‚»ã‚°ãƒ¡ãƒ³ãƒˆãƒ•ァイルを使ã„切るã“ã¨ãŒåŽŸå› ã§èµ·ãã‚‹ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãŒã“ã®æ™‚間間隔よりも頻ç¹ã«ç™ºç”Ÿã™ã‚‹å ´åˆã€ã‚µãƒ¼ãƒãƒ¼ãƒ­ã‚°ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’書ã出ã—ã¾ã™ã€‚ゼロã¯ã“ã®è­¦å‘Šã‚’無効ã«ã—ã¾ã™ã€‚ " +msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã‚»ã‚°ãƒ¡ãƒ³ãƒˆãƒ•ァイルを使ã„切るã“ã¨ãŒåŽŸå› ã§èµ·ãã‚‹ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãŒã“ã®æ™‚間間隔よりも頻ç¹ã«ç™ºç”Ÿã™ã‚‹å ´åˆã€ã‚µãƒ¼ãƒãƒ¼ãƒ­ã‚°ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’書ã出ã—ã¾ã™ã€‚ゼロã¯ã“ã®è­¦å‘Šã‚’無効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2740 utils/misc/guc_tables.c:2958 utils/misc/guc_tables.c:2998 +#: utils/misc/guc_tables.c:2872 utils/misc/guc_tables.c:3090 utils/misc/guc_tables.c:3144 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "ã™ã§ã«å®Ÿè¡Œã•ã‚ŒãŸæ›¸ãè¾¼ã¿ãŒãƒ‡ã‚£ã‚¹ã‚¯ã«æ›¸ã出ã•れるã¾ã§ã®ãƒšãƒ¼ã‚¸æ•°ã€‚" -#: utils/misc/guc_tables.c:2751 +#: utils/misc/guc_tables.c:2883 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "共有メモリ内ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸã€WALデータ用ã®ãƒ‡ã‚£ã‚¹ã‚¯ãƒšãƒ¼ã‚¸ãƒãƒƒãƒ•ァ数を設定。" -#: utils/misc/guc_tables.c:2762 +#: utils/misc/guc_tables.c:2884 +msgid "Specify -1 to have this value determined as a fraction of shared_buffers." +msgstr "-1ã§shared_buffersã«å¯¾ã™ã‚‹å‰²åˆã¨ã—ã¦ã“ã®å€¤ã‚’決定ã—ã¾ã™ã€‚" + +#: utils/misc/guc_tables.c:2894 msgid "Time between WAL flushes performed in the WAL writer." msgstr "WALライタã§å®Ÿè¡Œã™ã‚‹æ›¸ã出ã—ã®æ™‚間間隔。" -#: utils/misc/guc_tables.c:2773 +#: utils/misc/guc_tables.c:2905 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "書ã出ã—ãŒå®Ÿè¡Œã•れるã¾ã§ã«WALライタã§å‡ºåŠ›ã™ã‚‹WALã®é‡ã€‚" -#: utils/misc/guc_tables.c:2784 +#: utils/misc/guc_tables.c:2916 msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "WALを出力ã™ã‚‹ä»£ã‚りã«fsyncを使用ã™ã‚‹æ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å°ã‚µã‚¤ã‚ºã€‚" -#: utils/misc/guc_tables.c:2795 +#: utils/misc/guc_tables.c:2927 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "WALé€ä¿¡ãƒ—ãƒ­ã‚»ã‚¹ã®æœ€å¤§åŒæ™‚実行数を設定。" -#: utils/misc/guc_tables.c:2806 +#: utils/misc/guc_tables.c:2938 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "åŒæ™‚ã«å®šç¾©ã§ãã‚‹ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ãƒ­ãƒƒãƒˆã®æ•°ã®æœ€å¤§å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:2816 +#: utils/misc/guc_tables.c:2948 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "レプリケーションスロットã§ç¢ºä¿ã§ãã‚‹WALã®é‡ã®æœ€å¤§å€¤ã‚’設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2817 +#: utils/misc/guc_tables.c:2949 msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." msgstr "ディスク内ã®WALãŒã“ã®é‡ã«é”ã™ã‚‹ã¨ã€ãƒ¬ãƒ—リケーションスロットã¯åœæ­¢ã¨ãƒžãƒ¼ã‚¯ã•れã€ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã¯å‰Šé™¤ã‚ã‚‹ã„ã¯å†åˆ©ç”¨ã®ãŸã‚ã«è§£æ”¾ã•れã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2829 +#: utils/misc/guc_tables.c:2961 msgid "Sets the maximum time to wait for WAL replication." msgstr "WALãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å¾…ã¤æ™‚é–“ã®æœ€å¤§å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:2840 +#: utils/misc/guc_tables.c:2972 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "トランザクションã®ã‚³ãƒŸãƒƒãƒˆã‹ã‚‰WALã®ãƒ‡ã‚£ã‚¹ã‚¯æ›¸ã出ã—ã¾ã§ã®é…延時間をマイクロ秒å˜ä½ã§è¨­å®šã€‚" -#: utils/misc/guc_tables.c:2852 -msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." -msgstr "commit_delay ã®å®Ÿè¡Œã«å¿…è¦ã¨ãªã‚‹ã€åŒæ™‚ã«é–‹ã„ã¦ã„ã‚‹ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³æ•°ã®æœ€å°å€¤ã‚’設定。" +#: utils/misc/guc_tables.c:2984 +msgid "Sets the minimum number of concurrent open transactions required before performing \"commit_delay\"." +msgstr "â€commit_delay\"ã®å®Ÿè¡Œã«å¿…è¦ã¨ãªã‚‹ã€åŒæ™‚ã«é–‹ã„ã¦ã„ã‚‹ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³æ•°ã®æœ€å°å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:2863 +#: utils/misc/guc_tables.c:2995 msgid "Sets the number of digits displayed for floating-point values." msgstr "æµ®å‹•å°æ•°ç‚¹å€¤ã®è¡¨ç¤ºæ¡æ•°ã‚’設定。" -#: utils/misc/guc_tables.c:2864 +#: utils/misc/guc_tables.c:2996 msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." msgstr "ã“ã®ãƒ‘ラメータã¯ã€realã€double precisionã€å¹¾ä½•データ型ã«å½±éŸ¿ã—ã¾ã™ã€‚ゼロã¾ãŸã¯è² ã®ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿å€¤ã¯æ¨™æº–çš„ãªæ¡æ•°(FLT_DIG ã‚‚ã—ã㯠DBL_DIGã©ã¡ã‚‰ã‹é©åˆ‡ãªæ–¹)ã«è¿½åŠ ã•れã¾ã™ã€‚æ­£ã®å€¤ã¯ç›´æŽ¥å‡ºåЛ形å¼ã‚’指定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2876 +#: utils/misc/guc_tables.c:3008 msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." msgstr "æ–‡ãŒãƒ­ã‚°ã«å‡ºåŠ›ã•れる最å°ã®å®Ÿè¡Œæ™‚間を設定ã—ã¾ã™ã€‚サンプリングã«ã¤ã„ã¦ã¯log_statement_sample_rateã§æ±ºå®šã•れã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2879 +#: utils/misc/guc_tables.c:3011 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "ゼロã«ã™ã‚‹ã¨å…¨ã¦ã®å•ã„åˆã‚ã›ã‚’記録ã—ã¾ã™ã€‚-1ã¯ã“ã®æ©Ÿèƒ½ã‚’無効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2889 +#: utils/misc/guc_tables.c:3021 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "å…¨ã¦ã®æ–‡ã®ãƒ­ã‚°ã‚’記録ã™ã‚‹æœ€å°ã®å®Ÿè¡Œæ™‚間を設定。" -#: utils/misc/guc_tables.c:2891 +#: utils/misc/guc_tables.c:3023 msgid "Zero prints all queries. -1 turns this feature off." msgstr "ゼロã«ã™ã‚‹ã¨å…¨ã¦ã®å•ã„åˆã‚ã›ã‚’出力ã—ã¾ã™ã€‚-1ã¯ã“ã®æ©Ÿèƒ½ã‚’無効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2901 +#: utils/misc/guc_tables.c:3033 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "自動VACUUMã®æ´»å‹•ã®ãƒ­ã‚°ã‚’記録ã™ã‚‹æœ€å°ã®å®Ÿè¡Œæ™‚間を設定。" -#: utils/misc/guc_tables.c:2903 +#: utils/misc/guc_tables.c:3035 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "ゼロã¯ã™ã¹ã¦ã®æ´»å‹•を出力ã—ã¾ã™ã€‚-1ã¯è‡ªå‹•VACUUMã®ãƒ­ã‚°è¨˜éŒ²ã‚’無効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2913 +#: utils/misc/guc_tables.c:3045 msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." msgstr "å•ã„åˆã‚ã›æ–‡ã‚’ログ出力ã™ã‚‹éš›ã«ã€å‡ºåŠ›ã™ã‚‹bindãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿å€¤ãƒ‡ãƒ¼ã‚¿ã®æœ€å¤§ãƒã‚¤ãƒˆæ•°ã‚’設定。" -#: utils/misc/guc_tables.c:2915 utils/misc/guc_tables.c:2927 +#: utils/misc/guc_tables.c:3047 utils/misc/guc_tables.c:3059 msgid "-1 to print values in full." -msgstr "-1 ã§å€¤ã‚’å…¨ã¦å‡ºåŠ›ã—ã¾ã™ã€‚" +msgstr "-1 ã§å€¤å…¨ä½“を出力ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:2925 +#: utils/misc/guc_tables.c:3057 msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." msgstr "エラー時ã®å•ã„åˆã‚ã›æ–‡ã‚’ログ出力ã™ã‚‹éš›ã«ã€å‡ºåŠ›ã™ã‚‹bindãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿å€¤ãƒ‡ãƒ¼ã‚¿ã®æœ€å¤§ãƒã‚¤ãƒˆæ•°ã‚’設定。" -#: utils/misc/guc_tables.c:2937 +#: utils/misc/guc_tables.c:3069 msgid "Background writer sleep time between rounds." msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰ãƒ©ã‚¤ã‚¿ã®å‘¨æœŸæ¯Žã®å¾…機時間" -#: utils/misc/guc_tables.c:2948 +#: utils/misc/guc_tables.c:3080 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰ãƒ©ã‚¤ã‚¿ãŒ1å‘¨æœŸã§æ›¸ã出ã™LRUãƒšãƒ¼ã‚¸æ•°ã®æœ€å¤§å€¤ã€‚" -#: utils/misc/guc_tables.c:2971 +#: utils/misc/guc_tables.c:3103 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "ディスクサブシステムãŒåŠ¹çŽ‡çš„ã«å‡¦ç†å¯èƒ½ãªåŒæ™‚並行リクエスト数" -#: utils/misc/guc_tables.c:2985 -msgid "A variant of effective_io_concurrency that is used for maintenance work." -msgstr " effective_io_concurrency ã®ä¿å®ˆä½œæ¥­ã«ä½¿ç”¨ã•れる変種。" +#: utils/misc/guc_tables.c:3117 +msgid "A variant of \"effective_io_concurrency\" that is used for maintenance work." +msgstr "ä¿å®ˆä½œæ¥­ã«ä½¿ç”¨ã•れる\"effective_io_concurrency\"ã®äºœç¨®ã€‚" -#: utils/misc/guc_tables.c:3011 +#: utils/misc/guc_tables.c:3132 +msgid "Limit on the size of data reads and writes." +msgstr "データã®èª­ã¿è¾¼ã¿ã¨ã‹æ›¸ãè¾¼ã¿ã®ã‚µã‚¤ã‚ºåˆ¶é™" + +#: utils/misc/guc_tables.c:3157 msgid "Maximum number of concurrent worker processes." msgstr "åŒæ™‚ã«å®Ÿè¡Œã•ã‚Œã‚‹ãƒ¯ãƒ¼ã‚«ãƒ¼ãƒ—ãƒ­ã‚»ã‚¹æ•°ã®æœ€å¤§å€¤ã§ã™ã€‚" -#: utils/misc/guc_tables.c:3023 +#: utils/misc/guc_tables.c:3169 msgid "Maximum number of logical replication worker processes." msgstr "ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãƒ¯ãƒ¼ã‚«ãƒ¼ãƒ—ãƒ­ã‚»ã‚¹æ•°ã®æœ€å¤§å€¤ã§ã™ã€‚" -#: utils/misc/guc_tables.c:3035 +#: utils/misc/guc_tables.c:3181 msgid "Maximum number of table synchronization workers per subscription." msgstr "サブスクリプション毎ã®ãƒ†ãƒ¼ãƒ–ãƒ«åŒæœŸãƒ¯ãƒ¼ã‚«ãƒ¼æ•°ã®æœ€å¤§å€¤ã§ã™ã€‚" -#: utils/misc/guc_tables.c:3047 +#: utils/misc/guc_tables.c:3193 msgid "Maximum number of parallel apply workers per subscription." msgstr "サブスクリプション毎ã®ãƒ†ãƒ¼ãƒ–ルé©ç”¨ãƒ¯ãƒ¼ã‚«ãƒ¼æ•°ã®æœ€å¤§å€¤ã§ã™ã€‚" -#: utils/misc/guc_tables.c:3057 +#: utils/misc/guc_tables.c:3203 msgid "Sets the amount of time to wait before forcing log file rotation." msgstr "ログファイルã®ãƒ­ãƒ¼ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã‚’è¡Œã†æ™‚間間隔を設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3069 +#: utils/misc/guc_tables.c:3215 msgid "Sets the maximum size a log file can reach before being rotated." msgstr "ローテートã•れるã¾ã§ã«è¨±å®¹ã™ã‚‹ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å¤§ã‚µã‚¤ã‚ºã‚’設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3081 +#: utils/misc/guc_tables.c:3227 msgid "Shows the maximum number of function arguments." msgstr "関数ã®å¼•æ•°ã®æœ€å¤§æ•°ã‚’示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3092 +#: utils/misc/guc_tables.c:3238 msgid "Shows the maximum number of index keys." msgstr "ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚­ãƒ¼ã®æœ€å¤§æ•°ã‚’示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3103 +#: utils/misc/guc_tables.c:3249 msgid "Shows the maximum identifier length." msgstr "識別å­ã®æœ€å¤§é•·ã‚’示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3114 +#: utils/misc/guc_tables.c:3260 msgid "Shows the size of a disk block." msgstr "ディスクブロックサイズを示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3125 +#: utils/misc/guc_tables.c:3271 msgid "Shows the number of pages per disk file." msgstr "ディスクファイルã”ã¨ã®ãƒšãƒ¼ã‚¸æ•°ã‚’表示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3136 +#: utils/misc/guc_tables.c:3282 msgid "Shows the block size in the write ahead log." msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°(WAL)ã«ãŠã‘るブロックサイズを表示ã—ã¾ã™" -#: utils/misc/guc_tables.c:3147 +#: utils/misc/guc_tables.c:3293 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "WALã®å–り出ã—ã®å¤±æ•—後ã«å†è©¦è¡Œã™ã‚‹å›žæ•°ã‚’設定。" -#: utils/misc/guc_tables.c:3159 +#: utils/misc/guc_tables.c:3305 msgid "Shows the size of write ahead log segments." msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°(WAL)セグメントã®ã‚µã‚¤ã‚ºã‚’表示ã—ã¾ã™" -#: utils/misc/guc_tables.c:3172 +#: utils/misc/guc_tables.c:3318 +msgid "Time for which WAL summary files should be kept." +msgstr "WALé›†ç´„ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ä¿æŒã™ã‚‹æ™‚間。" + +#: utils/misc/guc_tables.c:3331 msgid "Time to sleep between autovacuum runs." msgstr "自動VACUUMã®å®Ÿè¡Œé–‹å§‹é–“隔。" -#: utils/misc/guc_tables.c:3182 +#: utils/misc/guc_tables.c:3341 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "VACUUMを行ã†ã¾ã§ã®ã€ã‚¿ãƒ—ルを更新ã¾ãŸã¯å‰Šé™¤ã—ãŸå›žæ•°ã®æœ€å°å€¤ã€‚" -#: utils/misc/guc_tables.c:3191 +#: utils/misc/guc_tables.c:3350 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." msgstr "VACUUMãŒè¡Œã‚れるã¾ã§ã®è¡ŒæŒ¿å…¥ã®å›žæ•°ã®æœ€å°å€¤ã€-1ã§æŒ¿å…¥å¥‘機ã®VACUUMを無効化ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3200 +#: utils/misc/guc_tables.c:3359 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "ANALYZEãŒå®Ÿè¡Œã•れるã¾ã§ã®ã€ã‚¿ãƒ—ãƒ«ã‚’æŒ¿å…¥ã€æ›´æ–°ã€å‰Šé™¤ã—ãŸå›žæ•°ã®æœ€å°å€¤ã€‚" -#: utils/misc/guc_tables.c:3210 +#: utils/misc/guc_tables.c:3369 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "トランザクションID周回を防ããŸã‚ã«ãƒ†ãƒ¼ãƒ–ルを自動VACUUMã™ã‚‹æ™‚点ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ID差分。" -#: utils/misc/guc_tables.c:3222 +#: utils/misc/guc_tables.c:3381 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "マルãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å‘¨å›žã‚’防止ã™ã‚‹ãŸã‚ã«ãƒ†ãƒ¼ãƒ–ルを自動VACUUMã™ã‚‹ã€ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å·®åˆ†ã€‚" -#: utils/misc/guc_tables.c:3232 +#: utils/misc/guc_tables.c:3391 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "自動VACUUMã®ãƒ¯ãƒ¼ã‚«ãƒ¼ãƒ—ãƒ­ã‚»ã‚¹ã®æœ€å¤§åŒæ™‚実行数を設定。" -#: utils/misc/guc_tables.c:3242 +#: utils/misc/guc_tables.c:3401 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "ã²ã¨ã¤ã®ä¿å®ˆä½œæ¥­ã«å‰²ã‚Šå½“ã¦ã‚‹ä¸¦åˆ—処ç†ãƒ—ãƒ­ã‚»ã‚¹ã®æ•°ã®æœ€å¤§å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:3252 +#: utils/misc/guc_tables.c:3411 msgid "Sets the maximum number of parallel processes per executor node." msgstr "エグゼキュータノードã‚ãŸã‚Šã®ä¸¦åˆ—処ç†ãƒ—ãƒ­ã‚»ã‚¹ã®æ•°ã®æœ€å¤§å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:3263 +#: utils/misc/guc_tables.c:3422 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "åŒæ™‚ã«æ´»å‹•å¯èƒ½ãªä¸¦åˆ—処ç†ãƒ¯ãƒ¼ã‚«ãƒ¼ã®æ•°ã®æœ€å¤§å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:3274 +#: utils/misc/guc_tables.c:3433 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "自動VACUUMプロセスã§ä½¿ç”¨ã™ã‚‹ãƒ¡ãƒ¢ãƒªé‡ã®æœ€å¤§å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:3285 -msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." -msgstr "スナップショットå–å¾—å¾Œã€æ›´æ–°ã•れãŸãƒšãƒ¼ã‚¸ãŒèª­ã¿å–れãªããªã‚‹ã¾ã§ã®æ™‚間。" - -#: utils/misc/guc_tables.c:3286 -msgid "A value of -1 disables this feature." -msgstr "-1ã§ã“ã®æ©Ÿèƒ½ã‚’無効ã«ã—ã¾ã™ã€‚" - -#: utils/misc/guc_tables.c:3296 +#: utils/misc/guc_tables.c:3444 msgid "Time between issuing TCP keepalives." msgstr "TCPキープアライブを発行ã™ã‚‹æ™‚間間隔。" -#: utils/misc/guc_tables.c:3297 utils/misc/guc_tables.c:3308 utils/misc/guc_tables.c:3432 +#: utils/misc/guc_tables.c:3445 utils/misc/guc_tables.c:3456 utils/misc/guc_tables.c:3580 msgid "A value of 0 uses the system default." msgstr "0ã§ã‚·ã‚¹ãƒ†ãƒ ã®ãƒ‡ãƒ•ォルトを使用ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3307 +#: utils/misc/guc_tables.c:3455 msgid "Time between TCP keepalive retransmits." msgstr "TCPキープアライブã®å†é€ä¿¡ã®æ™‚間間隔。" -#: utils/misc/guc_tables.c:3318 +#: utils/misc/guc_tables.c:3466 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "SSLã®å†ãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã¯ä»Šå¾Œã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“; 0ã®ã¿ã«è¨­å®šå¯èƒ½ã§ã™ã€‚" -#: utils/misc/guc_tables.c:3329 +#: utils/misc/guc_tables.c:3477 msgid "Maximum number of TCP keepalive retransmits." msgstr "TCPキープアライブã®å†é€ä¿¡å›žæ•°ã®æœ€å¤§å€¤ã§ã™ã€‚" -#: utils/misc/guc_tables.c:3330 +#: utils/misc/guc_tables.c:3478 msgid "Number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." msgstr "接続ãŒå¤±ã‚れるã¨åˆ¤æ–­ã™ã‚‹ã¾ã§ã«å†é€ä¿¡ã•れるã€ã²ã¨ã¤ã¥ãã®ã‚­ãƒ¼ãƒ—ã‚¢ãƒ©ã‚¤ãƒ–ã®æ•°ã€‚0ã®å ´åˆã¯ã‚·ã‚¹ãƒ†ãƒ ã®ãƒ‡ãƒ•ォルトを使用ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3341 +#: utils/misc/guc_tables.c:3489 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "GINã«ã‚ˆã‚‹æ­£ç¢ºãªæ¤œç´¢ã«å¯¾ã—ã¦è¨±å®¹ã™ã‚‹çµæžœæ•°ã®æœ€å¤§å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:3352 +#: utils/misc/guc_tables.c:3500 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "ãƒ—ãƒ©ãƒ³ãƒŠãŒæƒ³å®šã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ£ãƒƒã‚·ãƒ¥å…¨ä½“ã®ã‚µã‚¤ã‚ºã‚’設定。" -#: utils/misc/guc_tables.c:3353 +#: utils/misc/guc_tables.c:3501 msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." msgstr "ã¤ã¾ã‚Šã€PostgreSQLã®ãƒ‡ãƒ¼ã‚¿ãƒ•ァイルã«å¯¾ã—ã¦ä½¿ç”¨ã•れるキャッシュ(カーãƒãƒ«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ãŠã‚ˆã³å…±æœ‰ãƒãƒƒãƒ•ã‚¡)全体ã®é‡ã§ã™ã€‚ã“れã¯é€šå¸¸8KBã®ãƒ‡ã‚£ã‚¹ã‚¯ãƒšãƒ¼ã‚¸ã‚’å˜ä½ã¨ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3364 +#: utils/misc/guc_tables.c:3512 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "並列スキャンを検討ã™ã‚‹ãƒ†ãƒ¼ãƒ–ルデータã®é‡ã®æœ€å°å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:3365 +#: utils/misc/guc_tables.c:3513 msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." msgstr "ã“ã®é™åº¦ã«åˆ°é”ã§ããªã„よã†ãªå°‘ãªã„テーブルページ数ã—ã‹èª­ã¿å–らãªã„ã¨ãƒ—ランナãŒè¦‹ç©ã‚‚ã£ãŸå ´åˆã€ä¸¦åˆ—ã‚¹ã‚­ãƒ£ãƒ³ã¯æ¤œè¨Žã•れã¾ã›ã‚“。" -#: utils/misc/guc_tables.c:3375 +#: utils/misc/guc_tables.c:3523 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "並列スキャンを検討ã™ã‚‹ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãƒ‡ãƒ¼ã‚¿ã®é‡ã®æœ€å°å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:3376 +#: utils/misc/guc_tables.c:3524 msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." msgstr "ã“ã®é™åº¦ã«åˆ°é”ã§ããªã„よã†ãªå°‘ãªã„ページ数ã—ã‹èª­ã¿å–らãªã„ã¨ãƒ—ランナãŒè¦‹ç©ã‚‚ã£ãŸå ´åˆã€ä¸¦åˆ—ã‚¹ã‚­ãƒ£ãƒ³ã¯æ¤œè¨Žã•れã¾ã›ã‚“。" -#: utils/misc/guc_tables.c:3387 +#: utils/misc/guc_tables.c:3535 msgid "Shows the server version as an integer." msgstr "サーãƒãƒ¼ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’整数値ã§è¡¨ç¤ºã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3398 +#: utils/misc/guc_tables.c:3546 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "ã“ã®ã‚­ãƒ­ãƒã‚¤ãƒˆæ•°ã‚ˆã‚Šã‚‚大ããªä¸€æ™‚ファイルã®ä½¿ç”¨ã‚’ログã«è¨˜éŒ²ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3399 +#: utils/misc/guc_tables.c:3547 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "ゼロã«ã™ã‚‹ã¨ã€å…¨ã¦ã®ãƒ•ァイルを記録ã—ã¾ã™ã€‚デフォルトã¯-1ã§ã™(ã“ã®æ©Ÿèƒ½ã‚’無効ã«ã—ã¾ã™)。" -#: utils/misc/guc_tables.c:3409 +#: utils/misc/guc_tables.c:3557 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "pg_stat_activity.queryã®ãŸã‚ã«äºˆç´„ã™ã‚‹ã‚µã‚¤ã‚ºã‚’ãƒã‚¤ãƒˆå˜ä½ã§è¨­å®šã€‚" -#: utils/misc/guc_tables.c:3420 +#: utils/misc/guc_tables.c:3568 msgid "Sets the maximum size of the pending list for GIN index." msgstr "GINインデックスã®ä¿ç•™ãƒªã‚¹ãƒˆã®æœ€å¤§ã‚µã‚¤ã‚ºã‚’設定。" -#: utils/misc/guc_tables.c:3431 +#: utils/misc/guc_tables.c:3579 msgid "TCP user timeout." msgstr "TCPユーザータイムアウト。" -#: utils/misc/guc_tables.c:3442 +#: utils/misc/guc_tables.c:3590 msgid "The size of huge page that should be requested." msgstr "è¦æ±‚ãŒè¦‹è¾¼ã¾ã‚Œã‚‹ãƒ’ュージページã®ã‚µã‚¤ã‚ºã€‚" -#: utils/misc/guc_tables.c:3453 +#: utils/misc/guc_tables.c:3601 msgid "Aggressively flush system caches for debugging purposes." msgstr "デãƒãƒƒã‚°ç›®çš„ã®ãŸã‚ã«ç©æ¥µçš„ã«ã‚·ã‚¹ãƒ†ãƒ ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去ã™ã‚‹ã€‚" -#: utils/misc/guc_tables.c:3476 +#: utils/misc/guc_tables.c:3624 msgid "Sets the time interval between checks for disconnection while running queries." msgstr "å•ã„åˆã‚ã›å®Ÿè¡Œä¸­ã«æŽ¥ç¶šç¢ºèªã‚’è¡Œã†æ™‚間間隔を設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3487 +#: utils/misc/guc_tables.c:3635 msgid "Time between progress updates for long-running startup operations." msgstr "起動処ç†ãŒé•·å¼•ã„ãŸéš›ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹æ›´æ–°ã®æ™‚間間隔。" -#: utils/misc/guc_tables.c:3489 +#: utils/misc/guc_tables.c:3637 msgid "0 turns this feature off." msgstr "ゼロã«ã™ã‚‹ã¨ã“ã®æ©Ÿèƒ½ã‚’無効ã«ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3499 +#: utils/misc/guc_tables.c:3647 msgid "Sets the iteration count for SCRAM secret generation." msgstr "SCRAMシークレット生æˆã®éš›ã®å復回数を設定。" -#: utils/misc/guc_tables.c:3519 +#: utils/misc/guc_tables.c:3667 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "ã²ã¨ç¶šãã«èª­ã¿è¾¼ã‚€ãƒ‡ã‚£ã‚¹ã‚¯ãƒšãƒ¼ã‚¸ã«ã¤ã„ã¦ãƒ—ランナã§ä½¿ç”¨ã™ã‚‹è¦‹ç©ã‚‚りコストを設定。" -#: utils/misc/guc_tables.c:3530 +#: utils/misc/guc_tables.c:3678 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "ã²ã¨ç¶šãã§ã¯èª­ã¿è¾¼ã‚ãªã„ディスクページã«ã¤ã„ã¦ãƒ—ランナã§ä½¿ç”¨ã™ã‚‹è¦‹ç©ã‚‚りコストを設定。" -#: utils/misc/guc_tables.c:3541 +#: utils/misc/guc_tables.c:3689 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "一ã¤ã®ã‚¿ãƒ—ル(行)ã®å‡¦ç†ã«ã¤ã„ã¦ãƒ—ランナã§ä½¿ç”¨ã™ã‚‹è¦‹ç©ã‚‚りコストを設定。" -#: utils/misc/guc_tables.c:3552 +#: utils/misc/guc_tables.c:3700 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "インデックススキャンã«ãŠã‘る一ã¤ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚¨ãƒ³ãƒˆãƒªã®å‡¦ç†ã«ã¤ã„ã¦ãƒ—ランナã§ä½¿ç”¨ã™ã‚‹è¦‹ç©ã‚‚りコストを設定。 " -#: utils/misc/guc_tables.c:3563 +#: utils/misc/guc_tables.c:3711 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "一ã¤ã®æ¼”ç®—å­ã¾ãŸã¯é–¢æ•°ã®å‡¦ç†ã«ã¤ã„ã¦ãƒ—ランナã§ä½¿ç”¨ã™ã‚‹è¦‹ç©ã‚‚りコストを設定。" -#: utils/misc/guc_tables.c:3574 +#: utils/misc/guc_tables.c:3722 msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." msgstr "並列処ç†ãƒ¯ãƒ¼ã‚«ãƒ¼ã‹ã‚‰ãƒªãƒ¼ãƒ€ãƒ¼ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã¸ã®ä¸€ã¤ã®ã‚¿ãƒ—ル(行)ã®å—ã‘æ¸¡ã—ã«ã¤ã„ã¦ãƒ—ランナãŒä½¿ç”¨ã™ã‚‹è¦‹ç©ã‚‚りコストを設定。" -#: utils/misc/guc_tables.c:3585 +#: utils/misc/guc_tables.c:3733 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "並列å•ã„åˆã‚ã›å®Ÿè¡Œã®ãŸã‚ã®ãƒ¯ãƒ¼ã‚«ãƒ¼ãƒ—ロセスã®èµ·å‹•ã«ã¤ã„ã¦ãƒ—ランナã§ä½¿ç”¨ã™ã‚‹è¦‹ç©ã‚‚りコストを設定。" -#: utils/misc/guc_tables.c:3597 +#: utils/misc/guc_tables.c:3745 msgid "Perform JIT compilation if query is more expensive." msgstr "å•ã„åˆã‚ã›ãŒã“ã®å€¤ã‚ˆã‚Šé«˜ã‚³ã‚¹ãƒˆã§ã‚れã°JITコンパイルを実行ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3598 +#: utils/misc/guc_tables.c:3746 msgid "-1 disables JIT compilation." msgstr "-1 ã§JITã‚³ãƒ³ãƒ‘ã‚¤ãƒ«ã‚’ç¦æ­¢ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3608 +#: utils/misc/guc_tables.c:3756 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "å•ã„åˆã‚ã›ãŒã“ã®å€¤ã‚ˆã‚Šé«˜ã‚³ã‚¹ãƒˆã§ã‚れã°JITコンパイルã•れãŸé–¢æ•°ã‚’最é©åŒ–ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3609 +#: utils/misc/guc_tables.c:3757 msgid "-1 disables optimization." msgstr "-1ã§æœ€é©åŒ–を行ã‚ãªããªã‚Šã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3619 +#: utils/misc/guc_tables.c:3767 msgid "Perform JIT inlining if query is more expensive." msgstr "å•ã„åˆã‚ã›ãŒã“ã®å€¤ã‚ˆã‚Šé«˜ã‚³ã‚¹ãƒˆã§ã‚れã°JITコンパイルã•れãŸé–¢æ•°ã‚’インライン化ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3620 +#: utils/misc/guc_tables.c:3768 msgid "-1 disables inlining." msgstr "-1 ã§ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³åŒ–ã‚’ç¦æ­¢ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3630 +#: utils/misc/guc_tables.c:3778 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "カーソルã‹ã‚‰å–り出ã•れる行数ã®å…¨è¡Œã«å¯¾ã™ã‚‹å‰²åˆã«ã¤ã„ã¦ãƒ—ランナã§ä½¿ç”¨ã™ã‚‹å€¤ã‚’設定。" -#: utils/misc/guc_tables.c:3642 +#: utils/misc/guc_tables.c:3790 msgid "Sets the planner's estimate of the average size of a recursive query's working table." msgstr "å†å¸°å•ã„åˆã‚ã›ã§ãƒ—ランナãŒä½¿ç”¨ã™ã‚‹ä¸­é–“テーブルã®å¹³å‡è¦‹ç©ã‚‚りサイズを設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3654 +#: utils/misc/guc_tables.c:3802 msgid "GEQO: selective pressure within the population." msgstr "GEQO: 集åˆå†…ã®é¸æŠžåœ§åŠ›ã€‚" -#: utils/misc/guc_tables.c:3665 +#: utils/misc/guc_tables.c:3813 msgid "GEQO: seed for random path selection." msgstr "GEQO: ãƒ©ãƒ³ãƒ€ãƒ ãƒ‘ã‚¹é¸æŠžç”¨ã®ã‚·ãƒ¼ãƒ‰" -#: utils/misc/guc_tables.c:3676 -msgid "Multiple of work_mem to use for hash tables." -msgstr "ãƒãƒƒã‚·ãƒ¥ãƒ†ãƒ¼ãƒ–ルã§ä½¿ç”¨ã™ã‚‹work_memã®å€çŽ‡ã€‚" +#: utils/misc/guc_tables.c:3824 +msgid "Multiple of \"work_mem\" to use for hash tables." +msgstr "ãƒãƒƒã‚·ãƒ¥ãƒ†ãƒ¼ãƒ–ルã§ä½¿ç”¨ã™ã‚‹\"work_mem\"ã«å¯¾ã™ã‚‹å€çŽ‡ã€‚" -#: utils/misc/guc_tables.c:3687 +#: utils/misc/guc_tables.c:3835 msgid "Multiple of the average buffer usage to free per round." msgstr "周期ã”ã¨ã«è§£æ”¾ã™ã‚‹ãƒãƒƒãƒ•ã‚¡æ•°ã®å¹³å‡ãƒãƒƒãƒ•ァ使用é‡ã«å¯¾ã™ã‚‹å€æ•°" -#: utils/misc/guc_tables.c:3697 +#: utils/misc/guc_tables.c:3845 msgid "Sets the seed for random-number generation." msgstr "乱数生æˆç”¨ã®ã‚·ãƒ¼ãƒ‰ã‚’設定。" -#: utils/misc/guc_tables.c:3708 +#: utils/misc/guc_tables.c:3856 msgid "Vacuum cost delay in milliseconds." msgstr "ミリ秒å˜ä½ã®ã‚³ã‚¹ãƒˆãƒ™ãƒ¼ã‚¹ã®VACUUM処ç†ã®é…延時間ã§ã™ã€‚" -#: utils/misc/guc_tables.c:3719 +#: utils/misc/guc_tables.c:3867 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "自動VACUUM用ã®ãƒŸãƒªç§’å˜ä½ã®ã‚³ã‚¹ãƒˆãƒ™ãƒ¼ã‚¹ã®VACUUM処ç†ã®é…延時間ã§ã™ã€‚" -#: utils/misc/guc_tables.c:3730 +#: utils/misc/guc_tables.c:3878 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "VACUUMãŒå®Ÿè¡Œã•れるã¾ã§ã®ã‚¿ãƒ—ãƒ«ã®æ›´æ–°ã¾ãŸã¯å‰Šé™¤å›žæ•°ã®reltuplesã«å¯¾ã™ã‚‹å‰²åˆã€‚" -#: utils/misc/guc_tables.c:3740 +#: utils/misc/guc_tables.c:3888 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "VACUUMãŒå®Ÿè¡Œã•れるã¾ã§ã®ã‚¿ãƒ—ãƒ«ã®æŒ¿å…¥è¡Œæ•°ã®reltuplesã«å¯¾ã™ã‚‹å‰²åˆã€‚" -#: utils/misc/guc_tables.c:3750 +#: utils/misc/guc_tables.c:3898 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "ANALYZEãŒå®Ÿè¡Œã•れるã¾ã§ã®ã‚¿ãƒ—ãƒ«ã®æ›´æ–°ã¾ãŸã¯å‰Šé™¤å›žæ•°ã®reltuplesã«å¯¾ã™ã‚‹å‰²åˆã€‚" -#: utils/misc/guc_tables.c:3760 +#: utils/misc/guc_tables.c:3908 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆä¸­ã«ãƒ€ãƒ¼ãƒ†ã‚£ãƒãƒƒãƒ•ã‚¡ã®æ›¸ã出ã—ã«ä½¿ã†æ™‚é–“ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆé–“éš”ã«å¯¾ã™ã‚‹å‰²åˆã€‚" -#: utils/misc/guc_tables.c:3770 -msgid "Fraction of statements exceeding log_min_duration_sample to be logged." -msgstr "log_min_duration_sampleã‚’è¶…éŽã—ãŸæ–‡ã®ã†ã¡ãƒ­ã‚°å‡ºåŠ›ã‚’è¡Œã†å‰²åˆã€‚" +#: utils/misc/guc_tables.c:3918 +msgid "Fraction of statements exceeding \"log_min_duration_sample\" to be logged." +msgstr "\"log_min_duration_sample\"ã‚’è¶…éŽã—ãŸæ–‡ã®ã†ã¡ãƒ­ã‚°å‡ºåŠ›ã‚’è¡Œã†å‰²åˆã€‚" -#: utils/misc/guc_tables.c:3771 +#: utils/misc/guc_tables.c:3919 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "0.0(ログ出力ã—ãªã„)ã‹ã‚‰1.0(ã™ã¹ã¦ãƒ­ã‚°å‡ºåŠ›ã™ã‚‹)ã®é–“ã®å€¤ã‚’指定ã—ã¦ãã ã•ã„。" -#: utils/misc/guc_tables.c:3780 +#: utils/misc/guc_tables.c:3928 msgid "Sets the fraction of transactions from which to log all statements." msgstr "ã™ã¹ã¦ã®æ–‡ã‚’ログ出力ã™ã‚‹ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®å‰²åˆã‚’設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3781 +#: utils/misc/guc_tables.c:3929 msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." msgstr "0.0 (ログ出力ã—ãªã„)ã‹ã‚‰ 1.0 (å…¨ã¦ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®å…¨ã¦ã®æ–‡ã‚’ログ出力ã™ã‚‹)ã®é–“ã®å€¤ã‚’指定ã—ã¦ãã ã•ã„。" # hoge -#: utils/misc/guc_tables.c:3800 +#: utils/misc/guc_tables.c:3948 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "WALファイルã®ä¿ç®¡ã®ãŸã‚ã«å‘¼ã³å‡ºã•れるシェルスクリプトを設定。" -#: utils/misc/guc_tables.c:3801 +#: utils/misc/guc_tables.c:3949 msgid "This is used only if \"archive_library\" is not set." -msgstr "ã“れã¯\"archive_library\"ãŒè¨­å®šã•れã¦ã„ãªã„å ´åˆã«ã®ã¿ä½¿ç”¨ã•れã¾ã™ã€‚" +msgstr "ã“れã¯\"archive_library\"ã®è¨­å®šãŒã•れã¦ã„ãªã„å ´åˆã«ã®ã¿ä½¿ç”¨ã•れã¾ã™ã€‚" # hoge -#: utils/misc/guc_tables.c:3810 +#: utils/misc/guc_tables.c:3958 msgid "Sets the library that will be called to archive a WAL file." msgstr "WALファイルã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã®ãŸã‚ã«å‘¼ã³å‡ºã™ãƒ©ã‚¤ãƒ–ラリを設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3811 +#: utils/misc/guc_tables.c:3959 msgid "An empty string indicates that \"archive_command\" should be used." msgstr "空文字列ã§\"archive_command\"を使用ã™ã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚" # hoge -#: utils/misc/guc_tables.c:3820 +#: utils/misc/guc_tables.c:3968 msgid "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "アーカイブã•れãŸWALファイルをå–り出ã™ãŸã‚ã«å‘¼ã³å‡ºã™ã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’設定ã—ã¾ã™ã€‚" # hoge -#: utils/misc/guc_tables.c:3830 +#: utils/misc/guc_tables.c:3978 msgid "Sets the shell command that will be executed at every restart point." msgstr "リスタートãƒã‚¤ãƒ³ãƒˆã®æ™‚ã«å®Ÿè¡Œã™ã‚‹ã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã‚’設定。" # hoge -#: utils/misc/guc_tables.c:3840 +#: utils/misc/guc_tables.c:3988 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "リカãƒãƒªçµ‚了時ã«1度ã ã‘実行ã•れるシェルコマンドを設定。" -#: utils/misc/guc_tables.c:3850 +#: utils/misc/guc_tables.c:3998 msgid "Specifies the timeline to recover into." msgstr "リカãƒãƒªã®ç›®æ¨™ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ã‚’指定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3860 +#: utils/misc/guc_tables.c:4008 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "\"immediate\"を指定ã™ã‚‹ã¨ä¸€è²«æ€§ãŒç¢ºä¿ã§ããŸæ™‚点ã§ãƒªã‚«ãƒãƒªã‚’終了ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3869 +#: utils/misc/guc_tables.c:4017 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "リカãƒãƒªã‚’指定ã—ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDã¾ã§é€²ã‚ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3878 +#: utils/misc/guc_tables.c:4026 msgid "Sets the time stamp up to which recovery will proceed." msgstr "リカãƒãƒªã‚’指定ã—ãŸã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—ã®æ™‚刻ã¾ã§é€²ã‚ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3887 +#: utils/misc/guc_tables.c:4035 msgid "Sets the named restore point up to which recovery will proceed." msgstr "リカãƒãƒªã‚’指定ã—ãŸåå‰ã®ãƒªã‚¹ãƒˆã‚¢ãƒã‚¤ãƒ³ãƒˆã¾ã§é€²ã‚ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3896 +#: utils/misc/guc_tables.c:4044 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "リカãƒãƒªã‚’先行書ãè¾¼ã¿ãƒ­ã‚°ã®æŒ‡å®šã—ãŸLSNã¾ã§é€²ã‚ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3906 +#: utils/misc/guc_tables.c:4054 msgid "Sets the connection string to be used to connect to the sending server." msgstr "é€å‡ºå´ã‚µãƒ¼ãƒãƒ¼ã¸ã®æŽ¥ç¶šã«ä½¿ç”¨ã™ã‚‹æŽ¥ç¶šæ–‡å­—列をã—ã¦ã„ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3917 +#: utils/misc/guc_tables.c:4065 msgid "Sets the name of the replication slot to use on the sending server." msgstr "é€å‡ºã‚µãƒ¼ãƒãƒ¼ã§ä½¿ç”¨ã™ã‚‹ãƒ¬ãƒ—リケーションスロットã®åå‰ã‚’設定。" -#: utils/misc/guc_tables.c:3927 +#: utils/misc/guc_tables.c:4075 msgid "Sets the client's character set encoding." msgstr "ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®æ–‡å­—集åˆã®ç¬¦å·åŒ–æ–¹å¼ã‚’設定。" -#: utils/misc/guc_tables.c:3938 +#: utils/misc/guc_tables.c:4086 msgid "Controls information prefixed to each log line." msgstr "å„ログ行ã®å‰ã«ä»˜ã‘る情報を制御ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3939 +#: utils/misc/guc_tables.c:4087 msgid "If blank, no prefix is used." msgstr "ã‚‚ã—空ã§ã‚れã°ãªã«ã‚‚付加ã—ã¾ã›ã‚“。" -#: utils/misc/guc_tables.c:3948 +#: utils/misc/guc_tables.c:4096 msgid "Sets the time zone to use in log messages." msgstr "ログメッセージ使用ã™ã‚‹ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³ã‚’設定。" -#: utils/misc/guc_tables.c:3958 +#: utils/misc/guc_tables.c:4106 msgid "Sets the display format for date and time values." msgstr "日付時刻値ã®è¡¨ç¤ºç”¨æ›¸å¼ã‚’設定。" -#: utils/misc/guc_tables.c:3959 +#: utils/misc/guc_tables.c:4107 msgid "Also controls interpretation of ambiguous date inputs." msgstr "æ›–æ˜§ãªæ—¥ä»˜ã®å…¥åŠ›ã®è§£é‡ˆã‚‚制御ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3970 +#: utils/misc/guc_tables.c:4118 msgid "Sets the default table access method for new tables." msgstr "æ–°è¦ãƒ†ãƒ¼ãƒ–ルã§ä½¿ç”¨ã•れるデフォルトテーブルアクセスメソッドを設定。" -#: utils/misc/guc_tables.c:3981 +#: utils/misc/guc_tables.c:4129 msgid "Sets the default tablespace to create tables and indexes in." msgstr "テーブルã¨ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ä½œæˆå…ˆã¨ãªã‚‹ãƒ‡ãƒ•ォルトã®ãƒ†ãƒ¼ãƒ–ル空間を設定。" -#: utils/misc/guc_tables.c:3982 +#: utils/misc/guc_tables.c:4130 msgid "An empty string selects the database's default tablespace." msgstr "空文字列ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ãƒ‡ãƒ•ォルトã®ãƒ†ãƒ¼ãƒ–ãƒ«ç©ºé–“ã‚’é¸æŠžã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:3992 +#: utils/misc/guc_tables.c:4140 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "一時テーブルã¨ãƒ•ァイルã®ã‚½ãƒ¼ãƒˆã§ä½¿ç”¨ã•れるテーブル空間を設定。" -#: utils/misc/guc_tables.c:4003 +#: utils/misc/guc_tables.c:4151 msgid "Sets whether a CREATEROLE user automatically grants the role to themselves, and with which options." msgstr "CREATEROLEã‚’æŒã¤ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒè‡ªå‹•çš„ã«ãã®ãƒ­ãƒ¼ãƒ«ã‚’自身ã«GRANTã™ã‚‹ã‹ã©ã†ã‹ã‚’対象ã¨ãªã‚‹ã‚ªãƒ—ションã¨ã¨ã‚‚ã«è¨­å®šã—ã¾ã™" -#: utils/misc/guc_tables.c:4015 +#: utils/misc/guc_tables.c:4163 msgid "Sets the path for dynamically loadable modules." msgstr "動的ロードå¯èƒ½ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®ãƒ‘スを設定。" -#: utils/misc/guc_tables.c:4016 +#: utils/misc/guc_tables.c:4164 msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." msgstr "オープンã™ã‚‹å¿…è¦ãŒã‚る動的ロードå¯èƒ½ãªãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã«ã¤ã„ã¦ã€æŒ‡å®šã•れãŸãƒ•ァイルåã«ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªè¦ç´ ãŒãªã„(ã¤ã¾ã‚Šã€åå‰ã«ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ãŒå«ã¾ã‚Œãªã„)å ´åˆã€ã‚·ã‚¹ãƒ†ãƒ ã¯æŒ‡å®šã•れãŸãƒ•ァイルをã“ã®ãƒ‘スã‹ã‚‰æ¤œç´¢ã—ã¾ã™ã€‚ " -#: utils/misc/guc_tables.c:4029 +#: utils/misc/guc_tables.c:4177 msgid "Sets the location of the Kerberos server key file." msgstr "Kerberosサーãƒãƒ¼ã‚­ãƒ¼ãƒ•ァイルã®å ´æ‰€ã‚’設定。" -#: utils/misc/guc_tables.c:4040 +#: utils/misc/guc_tables.c:4188 msgid "Sets the Bonjour service name." msgstr "Bonjour サービスåを設定。" -#: utils/misc/guc_tables.c:4050 +#: utils/misc/guc_tables.c:4198 msgid "Sets the language in which messages are displayed." msgstr "表示用メッセージã®è¨€èªžã‚’設定。" -#: utils/misc/guc_tables.c:4060 +#: utils/misc/guc_tables.c:4208 msgid "Sets the locale for formatting monetary amounts." msgstr "通貨書å¼ã§ä½¿ç”¨ã™ã‚‹ãƒ­ã‚±ãƒ¼ãƒ«ã‚’設定。 " -#: utils/misc/guc_tables.c:4070 +#: utils/misc/guc_tables.c:4218 msgid "Sets the locale for formatting numbers." msgstr "æ•°å­—ã®æ›¸å¼ã§ä½¿ç”¨ã™ã‚‹ãƒ­ã‚±ãƒ¼ãƒ«ã‚’設定。" -#: utils/misc/guc_tables.c:4080 +#: utils/misc/guc_tables.c:4228 msgid "Sets the locale for formatting date and time values." msgstr "æ—¥ä»˜ã¨æ™‚é–“ã®æ›¸å¼ã§ä½¿ç”¨ã™ã‚‹ãƒ­ã‚±ãƒ¼ãƒ«ã‚’設定。" -#: utils/misc/guc_tables.c:4090 +#: utils/misc/guc_tables.c:4238 msgid "Lists shared libraries to preload into each backend." msgstr "å„ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã«äº‹å‰ãƒ­ãƒ¼ãƒ‰ã™ã‚‹å…±æœ‰ãƒ©ã‚¤ãƒ–ラリを列挙ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4101 +#: utils/misc/guc_tables.c:4249 msgid "Lists shared libraries to preload into server." msgstr "サーãƒãƒ¼ã«äº‹å‰ãƒ­ãƒ¼ãƒ‰ã™ã‚‹å…±æœ‰ãƒ©ã‚¤ãƒ–ラリを列挙ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4112 +#: utils/misc/guc_tables.c:4260 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "å„ãƒãƒƒã‚¯ã‚¨ãƒ³ãƒ‰ã«äº‹å‰èª­ã¿è¾¼ã¿ã™ã‚‹éžç‰¹æ¨©å…±æœ‰ãƒ©ã‚¤ãƒ–ラリを列挙ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4123 +#: utils/misc/guc_tables.c:4271 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "スキーマ部をå«ã¾ãªã„åå‰ã«å¯¾ã™ã‚‹ã‚¹ã‚­ãƒ¼ãƒžã®æ¤œç´¢é †ã‚’設定。" -#: utils/misc/guc_tables.c:4135 +#: utils/misc/guc_tables.c:4283 msgid "Shows the server (database) character set encoding." msgstr "サーãƒãƒ¼(データベース)文字セット符å·åŒ–æ–¹å¼ã‚’表示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4147 +#: utils/misc/guc_tables.c:4295 msgid "Shows the server version." msgstr "サーãƒãƒ¼ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4159 +#: utils/misc/guc_tables.c:4307 msgid "Sets the current role." msgstr "ç¾åœ¨ã®ãƒ­ãƒ¼ãƒ«ã‚’設定。" -#: utils/misc/guc_tables.c:4171 +#: utils/misc/guc_tables.c:4319 msgid "Sets the session user name." msgstr "セッションユーザーåを設定。" -#: utils/misc/guc_tables.c:4182 +#: utils/misc/guc_tables.c:4330 msgid "Sets the destination for server log output." msgstr "サーãƒãƒ¼ãƒ­ã‚°ã®å‡ºåŠ›å…ˆã‚’è¨­å®šã€‚" -#: utils/misc/guc_tables.c:4183 +#: utils/misc/guc_tables.c:4331 msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." msgstr "有効ãªå€¤ã¯ã€ãƒ—ラットフォームã«ä¾å­˜ã—ã¾ã™ãŒ\"stderr\"ã€\"syslog\"ã€\"csvlog\"ã€\"jsonlog\"ãã—ã¦\"eventlog\"ã®çµ„ã¿åˆã‚ã›ã§ã™ã€‚" -#: utils/misc/guc_tables.c:4194 +#: utils/misc/guc_tables.c:4342 msgid "Sets the destination directory for log files." msgstr "ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã®æ ¼ç´ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’設定。" -#: utils/misc/guc_tables.c:4195 +#: utils/misc/guc_tables.c:4343 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "データディレクトリã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã§ã‚‚絶対パスã§ã‚‚指定ã§ãã¾ã™" -#: utils/misc/guc_tables.c:4205 +#: utils/misc/guc_tables.c:4353 msgid "Sets the file name pattern for log files." msgstr "ログファイルã®ãƒ•ァイルåパターンを設定。" -#: utils/misc/guc_tables.c:4216 +#: utils/misc/guc_tables.c:4364 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "syslog内ã§PostgreSQLã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’識別ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•れるプログラムåを設定。" -#: utils/misc/guc_tables.c:4227 +#: utils/misc/guc_tables.c:4375 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "イベントログ内ã§PostgreSQLã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’識別ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã•れるアプリケーションåを設定。" -#: utils/misc/guc_tables.c:4238 +#: utils/misc/guc_tables.c:4386 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "タイムスタンプã®è¡¨ç¤ºã¨è§£é‡ˆã«ä½¿ç”¨ã™ã‚‹ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³ã‚’設定。" -#: utils/misc/guc_tables.c:4248 +#: utils/misc/guc_tables.c:4396 msgid "Selects a file of time zone abbreviations." msgstr "タイムゾーンçœç•¥å½¢ç”¨ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4258 +#: utils/misc/guc_tables.c:4406 msgid "Sets the owning group of the Unix-domain socket." msgstr "Unixドメインソケットを所有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—を設定。" -#: utils/misc/guc_tables.c:4259 +#: utils/misc/guc_tables.c:4407 msgid "The owning user of the socket is always the user that starts the server." msgstr "ソケットを所有ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯å¸¸ã«ã‚µãƒ¼ãƒãƒ¼ã‚’é–‹å§‹ã—ãŸãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã™ã€‚" -#: utils/misc/guc_tables.c:4269 +#: utils/misc/guc_tables.c:4417 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Unixドメインソケットã®ä½œæˆå…ˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’設定。" -#: utils/misc/guc_tables.c:4280 +#: utils/misc/guc_tables.c:4428 msgid "Sets the host name or IP address(es) to listen to." msgstr "接続を監視ã™ã‚‹ãƒ›ã‚¹ãƒˆåã¾ãŸã¯IPアドレスを設定。" -#: utils/misc/guc_tables.c:4295 +#: utils/misc/guc_tables.c:4443 msgid "Sets the server's data directory." msgstr "サーãƒãƒ¼ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’設定。" -#: utils/misc/guc_tables.c:4306 +#: utils/misc/guc_tables.c:4454 msgid "Sets the server's main configuration file." msgstr "サーãƒãƒ¼ã®ãƒ¡ã‚¤ãƒ³è¨­å®šãƒ•ァイルを設定。" -#: utils/misc/guc_tables.c:4317 +#: utils/misc/guc_tables.c:4465 msgid "Sets the server's \"hba\" configuration file." msgstr "サーãƒãƒ¼ã®\"hba\"設定ファイルを設定。" -#: utils/misc/guc_tables.c:4328 +#: utils/misc/guc_tables.c:4476 msgid "Sets the server's \"ident\" configuration file." msgstr "サーãƒãƒ¼ã®\"ident\"設定ファイルを設定。" -#: utils/misc/guc_tables.c:4339 +#: utils/misc/guc_tables.c:4487 msgid "Writes the postmaster PID to the specified file." msgstr "postmasterã®PIDを指定ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã¿ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4350 +#: utils/misc/guc_tables.c:4498 msgid "Shows the name of the SSL library." msgstr "SSLライブラリã®åå‰ã‚’表示ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4365 +#: utils/misc/guc_tables.c:4513 msgid "Location of the SSL server certificate file." msgstr "SSLサーãƒãƒ¼è¨¼æ˜Žæ›¸ãƒ•ァイルã®å ´æ‰€ã§ã™" -#: utils/misc/guc_tables.c:4375 +#: utils/misc/guc_tables.c:4523 msgid "Location of the SSL server private key file." msgstr "SSLサーãƒãƒ¼ç§˜å¯†éµãƒ•ァイルã®å ´æ‰€ã§ã™ã€‚" -#: utils/misc/guc_tables.c:4385 +#: utils/misc/guc_tables.c:4533 msgid "Location of the SSL certificate authority file." msgstr "SSLèªè¨¼å±€ãƒ•ァイルã®å ´æ‰€ã§ã™" -#: utils/misc/guc_tables.c:4395 +#: utils/misc/guc_tables.c:4543 msgid "Location of the SSL certificate revocation list file." msgstr "SSL証明書失効リストファイルã®å ´æ‰€ã§ã™ã€‚" -#: utils/misc/guc_tables.c:4405 +#: utils/misc/guc_tables.c:4553 msgid "Location of the SSL certificate revocation list directory." msgstr "SSL証明書失効リストディレクトリã®å ´æ‰€ã§ã™ã€‚" -#: utils/misc/guc_tables.c:4415 +#: utils/misc/guc_tables.c:4563 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "åŒæœŸã‚¹ã‚¿ãƒ³ãƒã‚¤ã®æ•°ã¨åŒæœŸã‚¹ã‚¿ãƒ³ãƒã‚¤å€™è£œã®åå‰ã®ä¸€è¦§ã€‚" -#: utils/misc/guc_tables.c:4426 +#: utils/misc/guc_tables.c:4574 msgid "Sets default text search configuration." msgstr "デフォルトã®ãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢è¨­å®šã‚’設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4436 +#: utils/misc/guc_tables.c:4584 msgid "Sets the list of allowed SSL ciphers." -msgstr "SSLæš—å·ã¨ã—ã¦è¨±ã•れるリストを設定。" +msgstr "SSLæš—å·ã¨ã—ã¦è¨±å¯ã™ã‚‹ãƒªã‚¹ãƒˆã‚’設定。" -#: utils/misc/guc_tables.c:4451 +#: utils/misc/guc_tables.c:4599 msgid "Sets the curve to use for ECDH." msgstr "ECDHã§ä½¿ç”¨ã™ã‚‹æ›²ç·šã‚’設定。" -#: utils/misc/guc_tables.c:4466 +#: utils/misc/guc_tables.c:4614 msgid "Location of the SSL DH parameters file." msgstr "SSLã®DHパラメータファイルã®å ´æ‰€ã§ã™ã€‚" -#: utils/misc/guc_tables.c:4477 +#: utils/misc/guc_tables.c:4625 msgid "Command to obtain passphrases for SSL." msgstr "SSLã®ãƒ‘スフレーズをå–å¾—ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã€‚" -#: utils/misc/guc_tables.c:4488 +#: utils/misc/guc_tables.c:4636 msgid "Sets the application name to be reported in statistics and logs." msgstr "統計やログã§å ±å‘Šã•れるアプリケーションåを設定。" -#: utils/misc/guc_tables.c:4499 +#: utils/misc/guc_tables.c:4647 msgid "Sets the name of the cluster, which is included in the process title." msgstr "プロセスã®ã‚¿ã‚¤ãƒˆãƒ«ã«å«ã¾ã‚Œã‚‹ã‚¯ãƒ©ã‚¹ã‚¿åを指定。" -#: utils/misc/guc_tables.c:4510 +#: utils/misc/guc_tables.c:4658 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "WALã®æ•´åˆæ€§ãƒã‚§ãƒƒã‚¯ã‚’行ã†å¯¾è±¡ã¨ã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ã‚’設定。" -#: utils/misc/guc_tables.c:4511 +#: utils/misc/guc_tables.c:4659 msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." msgstr "全ページイメージãŒå…¨ã¦ã®ãƒ‡ãƒ¼ã‚¿ãƒ–ロックã«å¯¾ã—ã¦è¨˜éŒ²ã•れã€WALå†ç”Ÿã®çµæžœã¨ã‚¯ãƒ­ã‚¹ãƒã‚§ãƒƒã‚¯ã•れã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4521 +#: utils/misc/guc_tables.c:4669 msgid "JIT provider to use." msgstr "使用ã™ã‚‹JITプロãƒã‚¤ãƒ€ã€‚" -#: utils/misc/guc_tables.c:4532 +#: utils/misc/guc_tables.c:4680 msgid "Log backtrace for errors in these functions." msgstr "ã“れらã®é–¢æ•°ã§ã‚¨ãƒ©ãƒ¼ãŒèµ·ããŸå ´åˆã«ã¯ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹ã‚’ログã«å‡ºåŠ›ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4543 +#: utils/misc/guc_tables.c:4691 msgid "Use direct I/O for file access." msgstr "ファイルアクセスã«ç›´æŽ¥I/Oを使用ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4563 +#: utils/misc/guc_tables.c:4702 +msgid "Lists streaming replication standby server replication slot names that logical WAL sender processes will wait for." +msgstr "è«–ç†WAL senderプロセスãŒå¾…ã¡å—ã‘対象ã¨ã™ã‚‹ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ¬ãƒ—リケーションã®ã‚¹ã‚¿ãƒ³ãƒã‚¤ã‚µãƒ¼ãƒãƒ¼ã®ãƒ¬ãƒ—リケーションスロットåを列挙ã—ã¾ã™ã€‚" + +#: utils/misc/guc_tables.c:4704 +msgid "Logical WAL sender processes will send decoded changes to output plugins only after the specified replication slots have confirmed receiving WAL." +msgstr "è«–ç†WAL senderãƒ—ãƒ­ã‚»ã‚¹ã¯æŒ‡å®šã•れãŸãƒ¬ãƒ—リケーションスロットã«ã‚ˆã‚‹WALã®å—ã‘å–り確èªå¾Œã«åˆã‚ã¦ãƒ‡ã‚³ãƒ¼ãƒ‰ã•れãŸå¤‰æ›´ã‚’出力プラグインã«é€å‡ºã—ã¾ã™ã€‚" + +#: utils/misc/guc_tables.c:4716 +msgid "Prohibits access to non-system relations of specified kinds." +msgstr "指定ã—ãŸç¨®åˆ¥ã®éžã‚·ã‚¹ãƒ†ãƒ ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ç¦æ­¢ã—ã¾ã™ã€‚" + +#: utils/misc/guc_tables.c:4736 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "文字列リテラルã§\"\\'\"ãŒè¨±å¯ã•れるã‹ã©ã†ã‹ã‚’設定。" -#: utils/misc/guc_tables.c:4573 +#: utils/misc/guc_tables.c:4746 msgid "Sets the output format for bytea." msgstr "bytea ã®å‡ºåŠ›ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚’è¨­å®šã€‚" -#: utils/misc/guc_tables.c:4583 +#: utils/misc/guc_tables.c:4756 msgid "Sets the message levels that are sent to the client." msgstr "クライアントã«é€ä¿¡ã•れる最å°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒ¬ãƒ™ãƒ«ã‚’設定。" -#: utils/misc/guc_tables.c:4584 utils/misc/guc_tables.c:4680 utils/misc/guc_tables.c:4691 utils/misc/guc_tables.c:4763 +#: utils/misc/guc_tables.c:4757 utils/misc/guc_tables.c:4853 utils/misc/guc_tables.c:4864 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr " å„レベルã«ã¯ãã®ãƒ¬ãƒ™ãƒ«ä»¥ä¸‹ã®å…¨ã¦ãŒå«ã¾ã‚Œã¾ã™ã€‚レベルを低ãã™ã‚‹ã»ã©ã€é€ä¿¡ã•れるメッセージã¯ã‚ˆã‚Šå°‘ãªããªã‚Šã¾ã™ã€‚ " -#: utils/misc/guc_tables.c:4594 +#: utils/misc/guc_tables.c:4767 msgid "Enables in-core computation of query identifiers." msgstr "å•ã„åˆã‚ã›è­˜åˆ¥å­ã®å†…部生æˆã‚’有効ã«ã™ã‚‹ã€‚" -#: utils/misc/guc_tables.c:4604 +#: utils/misc/guc_tables.c:4777 msgid "Enables the planner to use constraints to optimize queries." msgstr "å•ã„åˆã‚ã›ã®æœ€é©åŒ–ã®éš›ã«ãƒ—ランナã«åˆ¶ç´„を利用ã•ã›ã‚‹ã€‚" -#: utils/misc/guc_tables.c:4605 +#: utils/misc/guc_tables.c:4778 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." msgstr "制約ã«ã‚ˆã‚Šã€å•ã„åˆã‚ã›ã«ä¸€è‡´ã™ã‚‹è¡ŒãŒãªã„ã“ã¨ãŒä¿è¨¼ã•れã¦ã„るテーブルをスキップã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4616 +#: utils/misc/guc_tables.c:4789 msgid "Sets the default compression method for compressible values." msgstr "圧縮å¯èƒ½ãªå€¤ã«å¯¾ã—ã¦ä½¿ç”¨ã•れるデフォルト圧縮方å¼ã‚’設定。" -#: utils/misc/guc_tables.c:4627 +#: utils/misc/guc_tables.c:4800 msgid "Sets the transaction isolation level of each new transaction." msgstr "æ–°è¦ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³åˆ†é›¢ãƒ¬ãƒ™ãƒ«ã‚’設定。" -#: utils/misc/guc_tables.c:4637 +#: utils/misc/guc_tables.c:4810 msgid "Sets the current transaction's isolation level." msgstr "ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®åˆ†é›¢ãƒ¬ãƒ™ãƒ«ã‚’設定。" -#: utils/misc/guc_tables.c:4648 +#: utils/misc/guc_tables.c:4821 msgid "Sets the display format for interval values." msgstr "インターãƒãƒ«å€¤ã®è¡¨ç¤ºãƒ•ォーマットを設定。" -#: utils/misc/guc_tables.c:4659 +#: utils/misc/guc_tables.c:4832 msgid "Log level for reporting invalid ICU locale strings." msgstr "䏿­£ãªICUロケール設定ã®å ±å‘Šã«ä½¿ç”¨ã™ã‚‹ãƒ­ã‚°ãƒ¬ãƒ™ãƒ«ã€‚" -#: utils/misc/guc_tables.c:4669 +#: utils/misc/guc_tables.c:4842 msgid "Sets the verbosity of logged messages." msgstr "ログ出力メッセージã®è©³ç´°åº¦ã‚’設定。" -#: utils/misc/guc_tables.c:4679 +#: utils/misc/guc_tables.c:4852 msgid "Sets the message levels that are logged." msgstr "ログã«å‡ºåŠ›ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒ¬ãƒ™ãƒ«ã‚’設定。" -#: utils/misc/guc_tables.c:4690 +#: utils/misc/guc_tables.c:4863 msgid "Causes all statements generating error at or above this level to be logged." msgstr "ã“ã®ãƒ¬ãƒ™ãƒ«ä»¥ä¸Šã®ã‚¨ãƒ©ãƒ¼ã‚’発生ã•ã›ãŸå…¨ã¦ã®SQL文をログã«è¨˜éŒ²ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4701 +#: utils/misc/guc_tables.c:4874 msgid "Sets the type of statements logged." msgstr "ログ出力ã™ã‚‹æ–‡ã®ç¨®é¡žã‚’設定。" -#: utils/misc/guc_tables.c:4711 +#: utils/misc/guc_tables.c:4884 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "syslogを有効ã«ã—ãŸå ´åˆã«ä½¿ç”¨ã™ã‚‹syslog \"facility\"を設定。" -#: utils/misc/guc_tables.c:4722 +#: utils/misc/guc_tables.c:4895 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "ãƒˆãƒªã‚¬ã¨æ›¸ãæ›ãˆãƒ«ãƒ¼ãƒ«ã«é–¢ã™ã‚‹ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®å‹•作を設定。" -#: utils/misc/guc_tables.c:4732 +#: utils/misc/guc_tables.c:4905 msgid "Sets the current transaction's synchronization level." msgstr "ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®åŒæœŸãƒ¬ãƒ™ãƒ«ã‚’設定。" -#: utils/misc/guc_tables.c:4742 -msgid "Allows archiving of WAL files using archive_command." -msgstr "archive_command を使用ã—ãŸWALファイルã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–処ç†ã‚’許å¯ã€‚" +#: utils/misc/guc_tables.c:4915 +msgid "Allows archiving of WAL files using \"archive_command\"." +msgstr "\"archive_command\"を使用ã—ãŸWALファイルã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–処ç†ã‚’許å¯ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4752 +#: utils/misc/guc_tables.c:4925 msgid "Sets the action to perform upon reaching the recovery target." msgstr "リカãƒãƒªç›®æ¨™ã«åˆ°é”ã—ãŸéš›ã®å‹•作を設定。" -#: utils/misc/guc_tables.c:4762 -msgid "Enables logging of recovery-related debugging information." -msgstr "リカãƒãƒªé–¢é€£ã®ãƒ‡ãƒãƒƒã‚°æƒ…å ±ã®è¨˜éŒ²ã‚’行ã†" - -#: utils/misc/guc_tables.c:4779 +#: utils/misc/guc_tables.c:4935 msgid "Collects function-level statistics on database activity." msgstr "データベースã®å‹•作ã«é–¢ã—ã¦ã€é–¢æ•°ãƒ¬ãƒ™ãƒ«ã®çµ±è¨ˆæƒ…報をåŽé›†ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4790 +#: utils/misc/guc_tables.c:4946 msgid "Sets the consistency of accesses to statistics data." msgstr "統計情報読ã¿å‡ºã—時ã®ä¸€è²«æ€§ãƒ¬ãƒ™ãƒ«ã‚’設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4800 +#: utils/misc/guc_tables.c:4956 msgid "Compresses full-page writes written in WAL file with specified method." msgstr "WALファイルã«å‡ºåŠ›ã•れる全ページ出力を指定ã—ãŸæ–¹å¼ã§åœ§ç¸®ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4810 +#: utils/misc/guc_tables.c:4966 msgid "Sets the level of information written to the WAL." msgstr "WALã«æ›¸ã出ã•れる情報ã®ãƒ¬ãƒ™ãƒ«ã‚’設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4820 +#: utils/misc/guc_tables.c:4976 msgid "Selects the dynamic shared memory implementation used." msgstr "動的共有メモリã§ä½¿ç”¨ã™ã‚‹å®Ÿè£…ã‚’é¸æŠžã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4830 +#: utils/misc/guc_tables.c:4986 msgid "Selects the shared memory implementation used for the main shared memory region." msgstr "主共有メモリ領域ã«ä½¿ç”¨ã™ã‚‹å…±æœ‰ãƒ¡ãƒ¢ãƒªå®Ÿè£…ã‚’é¸æŠžã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4840 +#: utils/misc/guc_tables.c:4996 msgid "Selects the method used for forcing WAL updates to disk." msgstr "WALæ›´æ–°ã®ãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®æ›¸ã出ã—を強制ã™ã‚‹ã‚ã®æ–¹æ³•ã‚’é¸æŠžã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4850 +#: utils/misc/guc_tables.c:5006 msgid "Sets how binary values are to be encoded in XML." msgstr "XMLã§ã©ã®ã‚ˆã†ã«ãƒã‚¤ãƒŠãƒªå€¤ã‚’符å·åŒ–ã™ã‚‹ã‹ã‚’設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4860 +#: utils/misc/guc_tables.c:5016 msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." msgstr "暗黙的ãªãƒ‘ースãŠã‚ˆã³ç›´åˆ—化æ“作ã«ãŠã„ã¦XMLデータを文書ã¨ã¿ãªã™ã‹æ–­ç‰‡ã¨ã¿ãªã™ã‹ã‚’設定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4871 +#: utils/misc/guc_tables.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "LinuxãŠã‚ˆã³Windowsã§ãƒ’ュージページを使用。" -#: utils/misc/guc_tables.c:4881 +#: utils/misc/guc_tables.c:5037 +msgid "Indicates the status of huge pages." +msgstr "ヒュージページã®çŠ¶æ…‹ã‚’è¡¨ç¤ºã€‚" + +#: utils/misc/guc_tables.c:5048 msgid "Prefetch referenced blocks during recovery." msgstr "リカãƒãƒªä¸­ã«è¢«å‚照ブロックã®äº‹å‰èª­ã¿è¾¼ã¿ã‚’行ã†ã€‚" -#: utils/misc/guc_tables.c:4882 +#: utils/misc/guc_tables.c:5049 msgid "Look ahead in the WAL to find references to uncached data." msgstr "キャッシュã•れã¦ã„ãªã„データã¸ã®å‚ç…§ã®æ¤œå‡ºã®ãŸã‚ã«WALã®å…ˆèª­ã¿ã‚’行ã†ã€‚" -#: utils/misc/guc_tables.c:4891 +#: utils/misc/guc_tables.c:5058 msgid "Forces the planner's use parallel query nodes." msgstr "プランナã«ä¸¦åˆ—å•ã„åˆã‚ã›ãƒŽãƒ¼ãƒ‰ã®ä½¿ç”¨ã‚’強制ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4892 -msgid "This can be useful for testing the parallel query infrastructure by forcing the planner to generate plans which contains nodes which perform tuple communication between workers and the main process." +#: utils/misc/guc_tables.c:5059 +msgid "This can be useful for testing the parallel query infrastructure by forcing the planner to generate plans that contain nodes that perform tuple communication between workers and the main process." msgstr "ã“れã¯ä¸¦åˆ—å•ã„åˆã‚ã›æ©Ÿæ§‹ã®ãƒ†ã‚¹ãƒˆã®éš›ã«ã€ãƒ—ランナã«ãƒ¯ãƒ¼ã‚«ãƒ¼ã¨ãƒ¡ã‚¤ãƒ³ãƒ—ロセスã¨ã®é–“ã§ã‚¿ãƒ—ルã®ã‚„りå–りを行ã‚ã›ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’å«ã‚€å®Ÿè¡Œè¨ˆç”»ã‚’強制的ã«ç”Ÿæˆã•ã›ã‚‹ãŸã‚ã«ä½¿ç”¨ã§ãã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4904 +#: utils/misc/guc_tables.c:5071 msgid "Chooses the algorithm for encrypting passwords." msgstr "ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã®æš—å·åŒ–ã«ä½¿ç”¨ã™ã‚‹ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã‚’é¸æŠžã™ã‚‹ã€‚" -#: utils/misc/guc_tables.c:4914 +#: utils/misc/guc_tables.c:5081 msgid "Controls the planner's selection of custom or generic plan." msgstr "プランナã§ã®ã‚«ã‚¹ã‚¿ãƒ ãƒ—ãƒ©ãƒ³ã¨æ±Žç”¨ãƒ—ランã®é¸æŠžã‚’制御。" -#: utils/misc/guc_tables.c:4915 +#: utils/misc/guc_tables.c:5082 msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." msgstr "プリペアド文ã¯å€‹åˆ¥ãƒ—ランã¨ä¸€èˆ¬ãƒ—ランをæŒã¡ã€ãƒ—ランナã¯ã‚ˆã‚Šã‚ˆã„プランã®é¸æŠžã‚’試ã¿ã¾ã™ã€‚ã“れを設定ã™ã‚‹ã“ã¨ã§ãã®ãƒ‡ãƒ•ォルト動作を変更ã§ãã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4927 +#: utils/misc/guc_tables.c:5094 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "使用ã™ã‚‹ SSL/TLSãƒ—ãƒ­ãƒˆã‚³ãƒ«ã®æœ€å°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’設定。" -#: utils/misc/guc_tables.c:4939 +#: utils/misc/guc_tables.c:5106 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "使用å¯èƒ½ãªæœ€å¤§ã® SSL/TLS プロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’指定ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4951 +#: utils/misc/guc_tables.c:5118 msgid "Sets the method for synchronizing the data directory before crash recovery." msgstr "クラシュリカãƒãƒªå‰ã«è¡Œã†ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åŒæœŸã®æ–¹æ³•を設定ã™ã‚‹ã€‚" -#: utils/misc/guc_tables.c:4960 -msgid "Controls when to replicate or apply each change." -msgstr "å€‹ã€…ã®æ›´æ–°ã‚’ã„ã¤è¤‡è£½ã¾ãŸã¯é©ç”¨ã™ã‚‹ã‹ã‚’制御ã—ã¾ã™ã€‚" +#: utils/misc/guc_tables.c:5127 +msgid "Forces immediate streaming or serialization of changes in large transactions." +msgstr "大ããªãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã«ãŠã„ã¦ã€å³æ™‚ストリーミングã¾ãŸã¯å¤‰æ›´ã®ã‚·ãƒªã‚¢ãƒ©ã‚¤ã‚ºã‚’強制ã—ã¾ã™ã€‚" -#: utils/misc/guc_tables.c:4961 +#: utils/misc/guc_tables.c:5128 msgid "On the publisher, it allows streaming or serializing each change in logical decoding. On the subscriber, it allows serialization of all changes to files and notifies the parallel apply workers to read and apply them at the end of the transaction." msgstr "パブリッシャã§ã¯ã€ã“ã®è¨­å®šã¯ãƒ­ã‚¸ã‚«ãƒ«ã§ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã§å€‹ã€…ã®å¤‰æ›´ã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã¾ãŸã¯ã‚·ãƒªã‚¢ãƒ«åŒ–を実行ã•ã›ã¾ã™ã€‚サブスクライãƒã§ã¯ã™ã¹ã¦ã®å¤‰æ›´ã‚’ファイルã¸ã‚·ãƒªã‚¢ãƒ©ã‚¤ã‚ºã—ã€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³çµ‚了時ã«ãã®å¤‰æ›´æƒ…å ±ã®èª­ã¿å‡ºã—ãŠã‚ˆã³é©ç”¨ã®å®Ÿè¡Œã‚’ãƒ‘ãƒ©ãƒ¬ãƒ«ãƒ¯ãƒ¼ã‚«ãƒ¼ã«æŒ‡ç¤ºã™ã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚" @@ -28761,7 +29949,7 @@ msgstr "パブリッシャã§ã¯ã€ã“ã®è¨­å®šã¯ãƒ­ã‚¸ã‚«ãƒ«ã§ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ msgid "internal error: unrecognized run-time parameter type\n" msgstr "内部エラー: 実行時ã®ãƒ‘ラメータ型ãŒèªè­˜ã§ãã¾ã›ã‚“\n" -#: utils/misc/pg_controldata.c:48 utils/misc/pg_controldata.c:86 utils/misc/pg_controldata.c:175 utils/misc/pg_controldata.c:214 +#: utils/misc/pg_controldata.c:50 utils/misc/pg_controldata.c:90 utils/misc/pg_controldata.c:181 utils/misc/pg_controldata.c:222 #, c-format msgid "calculated CRC checksum does not match value stored in file" msgstr "算出ã•れãŸCRCãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒãƒ•ã‚¡ã‚¤ãƒ«ã«æ ¼ç´ã•れã¦ã„る値ã¨ä¸€è‡´ã—ã¾ã›ã‚“" @@ -28781,142 +29969,142 @@ msgstr "å•ã„åˆã‚ã›ã¯ãƒ†ãƒ¼ãƒ–ル\"%s\"ã«å¯¾ã™ã‚‹è¡Œãƒ¬ãƒ™ãƒ«ã‚»ã‚­ãƒ¥ãƒª msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." msgstr "ãƒ†ãƒ¼ãƒ–ãƒ«ã®æ‰€æœ‰è€…ã«å¯¾ã™ã‚‹ãƒãƒªã‚·ã‚’無効ã«ã™ã‚‹ã«ã¯ã€ALTER TABLE NO FORCE ROW LEVEL SECURITY を使ã£ã¦ãã ã•ã„。" -#: utils/misc/timeout.c:524 +#: utils/misc/timeout.c:520 #, c-format msgid "cannot add more timeout reasons" msgstr "ã“れ以上ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆè¦å› ã‚’追加ã§ãã¾ã›ã‚“" -#: utils/misc/tzparser.c:60 +#: utils/misc/tzparser.c:61 #, c-format msgid "time zone abbreviation \"%s\" is too long (maximum %d characters) in time zone file \"%s\", line %d" msgstr "タイムゾーンファイル\"%3$s\"ã®%4$d行ã®ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³çœç•¥å½¢\"%1$s\"ãŒé•·ã™ãŽã¾ã™ï¼ˆæœ€å¤§%2$d文字)" -#: utils/misc/tzparser.c:72 +#: utils/misc/tzparser.c:73 #, c-format msgid "time zone offset %d is out of range in time zone file \"%s\", line %d" msgstr "タイムゾーンファイル\"%2$s\"ã®%3$d行ã®ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³ã‚ªãƒ•セット%1$dã¯ç¯„囲外ã§ã™" -#: utils/misc/tzparser.c:111 +#: utils/misc/tzparser.c:112 #, c-format msgid "missing time zone abbreviation in time zone file \"%s\", line %d" msgstr "タイムゾーンファイル\"%s\"ã®è¡Œ%dã§ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³çœç•¥å½¢ãŒã‚りã¾ã›ã‚“" -#: utils/misc/tzparser.c:120 +#: utils/misc/tzparser.c:121 #, c-format msgid "missing time zone offset in time zone file \"%s\", line %d" msgstr "タイムゾーンファイル\"%s\"ã®è¡Œ%dã§ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³ã‚ªãƒ•セットãŒã‚りã¾ã›ã‚“" -#: utils/misc/tzparser.c:132 +#: utils/misc/tzparser.c:133 #, c-format msgid "invalid number for time zone offset in time zone file \"%s\", line %d" msgstr "タイムゾーンファイル\"%s\"ã®è¡Œ%dã®ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³ã‚ªãƒ•セット値ãŒç„¡åйã§ã™" -#: utils/misc/tzparser.c:168 +#: utils/misc/tzparser.c:169 #, c-format msgid "invalid syntax in time zone file \"%s\", line %d" msgstr "タイムゾーンファイル\"%s\"ã®è¡Œ%dã§æ§‹æ–‡ãŒç„¡åйã§ã™" -#: utils/misc/tzparser.c:236 +#: utils/misc/tzparser.c:237 #, c-format msgid "time zone abbreviation \"%s\" is multiply defined" msgstr "タイムゾーンçœç•¥å½¢\"%s\"ãŒè¤‡æ•°å®šç¾©ã•れã¦ã„ã¾ã™" -#: utils/misc/tzparser.c:238 +#: utils/misc/tzparser.c:239 #, c-format msgid "Entry in time zone file \"%s\", line %d, conflicts with entry in file \"%s\", line %d." msgstr "タイムゾーンファイル\"%s\"ã®è¡Œ%dã®é …ç›®ã¯ã€ãƒ•ァイル\"%s\"ã®è¡Œ%dã¨ç«¶åˆã—ã¾ã™ã€‚" -#: utils/misc/tzparser.c:300 +#: utils/misc/tzparser.c:301 #, c-format msgid "invalid time zone file name \"%s\"" msgstr "タイムゾーンファイルåãŒç„¡åйã§ã™: \"%s\"" -#: utils/misc/tzparser.c:313 +#: utils/misc/tzparser.c:314 #, c-format msgid "time zone file recursion limit exceeded in file \"%s\"" msgstr "ファイル\"%s\"ã§ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³ãƒ•ァイルã®å†å¸°ã®ä¸Šé™ã‚’è¶…ãˆã¾ã—ãŸã€‚" -#: utils/misc/tzparser.c:352 utils/misc/tzparser.c:365 +#: utils/misc/tzparser.c:353 utils/misc/tzparser.c:366 #, c-format msgid "could not read time zone file \"%s\": %m" msgstr "タイムゾーンファイル\"%s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: utils/misc/tzparser.c:376 +#: utils/misc/tzparser.c:377 #, c-format msgid "line is too long in time zone file \"%s\", line %d" msgstr "タイムゾーンファイル\"%s\"ã®è¡Œ%dãŒé•·ã™ãŽã¾ã™ã€‚" -#: utils/misc/tzparser.c:400 +#: utils/misc/tzparser.c:401 #, c-format msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "タイムゾーンファイル\"%s\"ã®è¡Œ%dã«ãƒ•ァイルåãŒãªã„@INCLUDEãŒã‚りã¾ã™" -#: utils/mmgr/aset.c:446 utils/mmgr/generation.c:206 utils/mmgr/slab.c:367 +#: utils/mmgr/aset.c:452 utils/mmgr/bump.c:184 utils/mmgr/generation.c:216 utils/mmgr/slab.c:371 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "メモリコンテキスト\"%s\"ã®ä½œæˆæ™‚ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: utils/mmgr/dsa.c:531 utils/mmgr/dsa.c:1341 +#: utils/mmgr/dsa.c:523 utils/mmgr/dsa.c:1364 #, c-format msgid "could not attach to dynamic shared area" msgstr "動的共有エリアをアタッãƒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/mmgr/mcxt.c:1047 utils/mmgr/mcxt.c:1083 utils/mmgr/mcxt.c:1121 utils/mmgr/mcxt.c:1159 utils/mmgr/mcxt.c:1247 utils/mmgr/mcxt.c:1278 utils/mmgr/mcxt.c:1314 utils/mmgr/mcxt.c:1503 utils/mmgr/mcxt.c:1548 utils/mmgr/mcxt.c:1605 +#: utils/mmgr/mcxt.c:1155 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "メモリコンテクスト\"%2$s\"ã§ã‚µã‚¤ã‚º%1$zuã®è¦æ±‚ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚" -#: utils/mmgr/mcxt.c:1210 +#: utils/mmgr/mcxt.c:1299 #, c-format msgid "logging memory contexts of PID %d" msgstr "PID %dã®ãƒ¡ãƒ¢ãƒªã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆã‚’記録ã—ã¾ã™" -#: utils/mmgr/portalmem.c:188 +#: utils/mmgr/portalmem.c:187 #, c-format msgid "cursor \"%s\" already exists" msgstr "カーソル\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" -#: utils/mmgr/portalmem.c:192 +#: utils/mmgr/portalmem.c:191 #, c-format msgid "closing existing cursor \"%s\"" msgstr "既存ã®ã‚«ãƒ¼ã‚½ãƒ«\"%s\"をクローズã—ã¦ã„ã¾ã™" -#: utils/mmgr/portalmem.c:402 +#: utils/mmgr/portalmem.c:401 #, c-format msgid "portal \"%s\" cannot be run" msgstr "ãƒãƒ¼ã‚¿ãƒ«\"%s\"を実行ã§ãã¾ã›ã‚“" -#: utils/mmgr/portalmem.c:480 +#: utils/mmgr/portalmem.c:479 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "固定ã•れãŸãƒãƒ¼ã‚¿ãƒ«\"%s\"ã¯å‰Šé™¤ã§ãã¾ã›ã‚“" -#: utils/mmgr/portalmem.c:488 +#: utils/mmgr/portalmem.c:487 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "アクティブãªãƒãƒ¼ã‚¿ãƒ«\"%s\"ã¯å‰Šé™¤ã§ãã¾ã›ã‚“" -#: utils/mmgr/portalmem.c:739 +#: utils/mmgr/portalmem.c:738 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "WITH HOLD 付ãã®ã‚«ãƒ¼ã‚½ãƒ«ã‚’作æˆã—ãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯ PREPARE ã§ãã¾ã›ã‚“" -#: utils/mmgr/portalmem.c:1230 +#: utils/mmgr/portalmem.c:1232 #, c-format msgid "cannot perform transaction commands inside a cursor loop that is not read-only" msgstr "読ã¿è¾¼ã¿å°‚用ã§ã¯ãªã„カーソルã®ãƒ«ãƒ¼ãƒ—内ã§ã¯ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å‘½ä»¤ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" #: utils/sort/logtape.c:266 utils/sort/logtape.c:287 #, c-format -msgid "could not seek to block %ld of temporary file" -msgstr "一時ファイルã®ãƒ–ロック%ldã¸ã®ã‚·ãƒ¼ã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸ" +msgid "could not seek to block %lld of temporary file" +msgstr "一時ファイルã®ãƒ–ロック%lldã¸ã®ã‚·ãƒ¼ã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: utils/sort/sharedtuplestore.c:467 +#: utils/sort/sharedtuplestore.c:466 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "タプルストア共有一時ファイル内ã«äºˆæœŸã—ãªã„ãƒãƒ£ãƒ³ã‚¯ãŒã‚りã¾ã—ãŸ" -#: utils/sort/sharedtuplestore.c:549 +#: utils/sort/sharedtuplestore.c:548 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "共有タプルストア一時ファイルã®ãƒ–ロック%uã¸ã®ã‚·ãƒ¼ã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸ" @@ -28926,17 +30114,17 @@ msgstr "共有タプルストア一時ファイルã®ãƒ–ロック%uã¸ã®ã‚·ãƒ¼ msgid "cannot have more than %d runs for an external sort" msgstr "外部ソートã§ã¯%d以上ã®ãƒ©ãƒ³æ•°ã¯æ‰±ãˆã¾ã›ã‚“" -#: utils/sort/tuplesortvariants.c:1363 +#: utils/sort/tuplesortvariants.c:1552 #, c-format msgid "could not create unique index \"%s\"" -msgstr "一æ„インデックス\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" +msgstr "ユニークインデックス\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: utils/sort/tuplesortvariants.c:1365 +#: utils/sort/tuplesortvariants.c:1554 #, c-format msgid "Key %s is duplicated." msgstr "キー%sã¯é‡è¤‡ã—ã¦ã„ã¾ã™ã€‚" -#: utils/sort/tuplesortvariants.c:1366 +#: utils/sort/tuplesortvariants.c:1555 #, c-format msgid "Duplicate keys exist." msgstr "é‡è¤‡ã—ãŸã‚­ãƒ¼ãŒå­˜åœ¨ã—ã¾ã™ã€‚" @@ -28946,47 +30134,52 @@ msgstr "é‡è¤‡ã—ãŸã‚­ãƒ¼ãŒå­˜åœ¨ã—ã¾ã™ã€‚" msgid "could not seek in tuplestore temporary file" msgstr "タプルストア一時ファイルã®ã‚·ãƒ¼ã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: utils/time/snapmgr.c:571 +#: utils/time/snapmgr.c:536 #, c-format msgid "The source transaction is not running anymore." msgstr "å…ƒã¨ãªã‚‹ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯ã™ã§ã«å®Ÿè¡Œä¸­ã§ã¯ã‚りã¾ã›ã‚“。" -#: utils/time/snapmgr.c:1166 +#: utils/time/snapmgr.c:1136 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "サブトランザクションã‹ã‚‰ã‚¹ãƒŠãƒƒãƒ—ショットをエクスãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: utils/time/snapmgr.c:1325 utils/time/snapmgr.c:1330 utils/time/snapmgr.c:1335 utils/time/snapmgr.c:1350 utils/time/snapmgr.c:1355 utils/time/snapmgr.c:1360 utils/time/snapmgr.c:1375 utils/time/snapmgr.c:1380 utils/time/snapmgr.c:1385 utils/time/snapmgr.c:1487 utils/time/snapmgr.c:1503 utils/time/snapmgr.c:1528 +#: utils/time/snapmgr.c:1296 utils/time/snapmgr.c:1301 utils/time/snapmgr.c:1306 utils/time/snapmgr.c:1321 utils/time/snapmgr.c:1326 utils/time/snapmgr.c:1331 utils/time/snapmgr.c:1346 utils/time/snapmgr.c:1351 utils/time/snapmgr.c:1356 utils/time/snapmgr.c:1470 utils/time/snapmgr.c:1486 utils/time/snapmgr.c:1511 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "ファイル\"%s\"内ã®ã‚¹ãƒŠãƒƒãƒ—ショットデータãŒä¸æ­£ã§ã™" -#: utils/time/snapmgr.c:1422 +#: utils/time/snapmgr.c:1393 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "SET TRANSACTION SNAPSHOTã‚’å…¨ã¦ã®å•ã„åˆã‚ã›ã®å‰ã«å‘¼ã³å‡ºã•ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/time/snapmgr.c:1431 +#: utils/time/snapmgr.c:1402 #, c-format msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" msgstr "スナップショットをインãƒãƒ¼ãƒˆã™ã‚‹ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯SERIALIZABLEã¾ãŸã¯REPEATABLE READ分離レベルã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: utils/time/snapmgr.c:1440 utils/time/snapmgr.c:1449 +#: utils/time/snapmgr.c:1411 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "無効ãªã‚¹ãƒŠãƒƒãƒ—ショット識別å­: \"%s\"" -#: utils/time/snapmgr.c:1541 +#: utils/time/snapmgr.c:1426 +#, c-format +msgid "snapshot \"%s\" does not exist" +msgstr "スナップショット\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" + +#: utils/time/snapmgr.c:1524 #, c-format msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" msgstr "シリアライザブルトランザクションã¯ã‚·ãƒªã‚¢ãƒ©ã‚¤ã‚¶ãƒ–ルã§ã¯ãªã„トランザクションã‹ã‚‰ã®ã‚¹ãƒŠãƒƒãƒ—ショットをインãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“" -#: utils/time/snapmgr.c:1545 +#: utils/time/snapmgr.c:1528 #, c-format msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" msgstr "読ã¿å–り専用ã®ã‚·ãƒªã‚¢ãƒ©ã‚¤ã‚¶ãƒ–ルトランザクションã§ã¯ã€èª­ã¿å–り専用トランザクションã‹ã‚‰ã‚¹ãƒŠãƒƒãƒ—ショットをインãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: utils/time/snapmgr.c:1560 +#: utils/time/snapmgr.c:1543 #, c-format msgid "cannot import a snapshot from a different database" msgstr "ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‹ã‚‰ã®ã‚¹ãƒŠãƒƒãƒ—ショットを読ã¿è¾¼ã‚€ã“ã¨ã¯ã§ãã¾ã›ã‚“" diff --git a/src/backend/po/ka.po b/src/backend/po/ka.po new file mode 100644 index 0000000000000..f626631f51660 --- /dev/null +++ b/src/backend/po/ka.po @@ -0,0 +1,30844 @@ +# Georgian message translation file for postgres +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the postgres (PostgreSQL) package. +# Temuri Doghonadze , 2022-2023. +# +msgid "" +msgstr "" +"Project-Id-Version: postgres (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-06-14 02:13+0000\n" +"PO-Revision-Date: 2024-06-14 06:17+0200\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: Georgian \n" +"Language: ka\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.3.2\n" + +#: ../common/binaryheap.c:121 ../common/binaryheap.c:159 +#, c-format +msgid "out of binary heap slots" +msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ დრáƒáƒ”ბითი მეხსიერების სლáƒáƒ¢áƒ”ბი áƒáƒ›áƒáƒ˜áƒ¬áƒ£áƒ áƒ" + +#: ../common/compression.c:132 ../common/compression.c:141 ../common/compression.c:150 +#, c-format +msgid "this build does not support compression with %s" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ %s-ით შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ áƒ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: ../common/compression.c:205 +msgid "found empty string where a compression option was expected" +msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრების მáƒáƒ’იერ მáƒáƒ¬áƒáƒ“ებული სტრიქáƒáƒœáƒ˜ ცáƒáƒ áƒ˜áƒ”ლიáƒ" + +#: ../common/compression.c:244 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "შეკუმშვის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: ../common/compression.c:283 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრ \"%s\"-ს მნიშვნელáƒáƒ‘რსჭირდებáƒ" + +#: ../common/compression.c:292 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "შემუმშვის პáƒáƒ áƒáƒ›áƒ”ტრ \"%s\"-ის ნიშვნელáƒáƒ‘რმთელი რიცხვი უნდრიყáƒáƒ¡" + +#: ../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘რ\"%s\" ლáƒáƒ’იკურ მნიშვნელáƒáƒ‘áƒáƒ¡ უნდრწáƒáƒ áƒ›áƒáƒáƒ“გენდეს" + +#: ../common/compression.c:379 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" შეკუმშვის დáƒáƒœáƒ” áƒáƒ  მიეთითებáƒ" + +#: ../common/compression.c:386 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" შეკუმშვის დáƒáƒœáƒ” %d-სრდრ%d-ს შáƒáƒ áƒ˜áƒ¡ უნდრიყáƒáƒ¡ (ნáƒáƒ’ულისხებირ%d)" + +#: ../common/compression.c:397 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების რáƒáƒáƒ“ენáƒáƒ‘რáƒáƒ  მიეთითებáƒ" + +#: ../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" long-distance რეჟიმის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../common/config_info.c:134 ../common/config_info.c:142 ../common/config_info.c:150 ../common/config_info.c:158 ../common/config_info.c:166 ../common/config_info.c:174 ../common/config_info.c:182 ../common/config_info.c:190 +msgid "not recorded" +msgstr "ჩáƒáƒ¬áƒ”რილი áƒáƒ áƒáƒ" + +#: ../common/controldata_utils.c:93 ../common/controldata_utils.c:97 commands/copyfrom.c:1737 commands/extension.c:3538 utils/adt/genfile.c:123 utils/time/snapmgr.c:1430 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../common/controldata_utils.c:108 ../common/controldata_utils.c:110 access/transam/timeline.c:143 access/transam/timeline.c:362 access/transam/twophase.c:1369 access/transam/xlog.c:3471 access/transam/xlog.c:4335 access/transam/xlogrecovery.c:1238 access/transam/xlogrecovery.c:1336 access/transam/xlogrecovery.c:1373 access/transam/xlogrecovery.c:1440 backup/basebackup.c:2123 backup/walsummary.c:283 commands/extension.c:3548 libpq/hba.c:764 +#: replication/logical/origin.c:745 replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5084 replication/logical/snapbuild.c:2035 replication/slot.c:2236 replication/slot.c:2277 replication/walsender.c:655 storage/file/buffile.c:470 storage/file/copydir.c:185 utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 access/transam/xlog.c:3476 access/transam/xlog.c:4340 replication/logical/origin.c:750 replication/logical/origin.c:789 replication/logical/snapbuild.c:2040 replication/slot.c:2240 replication/slot.c:2281 replication/walsender.c:660 utils/cache/relmapper.c:833 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\"-ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %zu-დáƒáƒœ" + +#: ../common/controldata_utils.c:128 ../common/controldata_utils.c:132 ../common/controldata_utils.c:277 ../common/controldata_utils.c:280 access/heap/rewriteheap.c:1141 access/heap/rewriteheap.c:1246 access/transam/timeline.c:392 access/transam/timeline.c:438 access/transam/timeline.c:512 access/transam/twophase.c:1381 access/transam/twophase.c:1793 access/transam/xlog.c:3317 access/transam/xlog.c:3511 access/transam/xlog.c:3516 access/transam/xlog.c:3652 +#: access/transam/xlog.c:4305 access/transam/xlog.c:5239 commands/copyfrom.c:1797 commands/copyto.c:325 libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 replication/logical/origin.c:683 replication/logical/origin.c:822 replication/logical/reorderbuffer.c:5136 replication/logical/snapbuild.c:1802 replication/logical/snapbuild.c:1926 replication/slot.c:2126 replication/slot.c:2288 replication/walsender.c:670 storage/file/copydir.c:208 storage/file/copydir.c:213 +#: storage/file/fd.c:828 storage/file/fd.c:3753 storage/file/fd.c:3859 utils/cache/relmapper.c:841 utils/cache/relmapper.c:956 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: ../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რáƒáƒ  ემთხვევáƒ" + +#: ../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘ის შესáƒáƒ«áƒšáƒ შეუსáƒáƒ‘áƒáƒ›áƒáƒ‘რpg_control ფáƒáƒ˜áƒšáƒ˜áƒ¡ შესáƒáƒœáƒáƒ®áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული \n" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რშესáƒáƒ«áƒšáƒáƒ áƒáƒ  ემთხვეáƒáƒ“ეს áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ მიერ გáƒáƒ›áƒáƒ§áƒ”ნებულს. áƒáƒ› შემთხვევáƒáƒ¨áƒ˜ ქვემáƒáƒ— \n" +"მáƒáƒªáƒ”მული შედეგები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იქნებრდრPostgreSQL ეს áƒáƒ’ებრáƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ შეუთáƒáƒ•სებელი იქნებáƒ." + +#: ../common/controldata_utils.c:225 ../common/controldata_utils.c:230 ../common/file_utils.c:70 ../common/file_utils.c:347 ../common/file_utils.c:406 ../common/file_utils.c:480 access/heap/rewriteheap.c:1229 access/transam/timeline.c:111 access/transam/timeline.c:251 access/transam/timeline.c:348 access/transam/twophase.c:1325 access/transam/xlog.c:3224 access/transam/xlog.c:3387 access/transam/xlog.c:3426 access/transam/xlog.c:3619 access/transam/xlog.c:4325 +#: access/transam/xlogrecovery.c:4263 access/transam/xlogrecovery.c:4366 access/transam/xlogutils.c:836 backup/basebackup.c:547 backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:624 postmaster/syslogger.c:1511 replication/logical/origin.c:735 replication/logical/reorderbuffer.c:3737 replication/logical/reorderbuffer.c:4291 replication/logical/reorderbuffer.c:5064 replication/logical/snapbuild.c:1757 replication/logical/snapbuild.c:1867 +#: replication/slot.c:2208 replication/walsender.c:628 replication/walsender.c:3051 storage/file/copydir.c:151 storage/file/fd.c:803 storage/file/fd.c:3510 storage/file/fd.c:3740 storage/file/fd.c:3830 storage/smgr/md.c:661 utils/cache/relmapper.c:818 utils/cache/relmapper.c:935 utils/error/elog.c:2091 utils/init/miscinit.c:1526 utils/init/miscinit.c:1660 utils/init/miscinit.c:1737 utils/misc/guc.c:4727 utils/misc/guc.c:4777 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 access/transam/twophase.c:1766 access/transam/twophase.c:1775 access/transam/xlog.c:9210 access/transam/xlogfuncs.c:698 backup/basebackup_server.c:173 backup/basebackup_server.c:266 backup/walsummary.c:304 postmaster/postmaster.c:4125 postmaster/syslogger.c:1522 postmaster/syslogger.c:1535 postmaster/syslogger.c:1548 utils/cache/relmapper.c:947 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: ../common/controldata_utils.c:263 ../common/controldata_utils.c:268 ../common/file_utils.c:418 ../common/file_utils.c:488 access/heap/rewriteheap.c:925 access/heap/rewriteheap.c:1135 access/heap/rewriteheap.c:1240 access/transam/timeline.c:432 access/transam/timeline.c:506 access/transam/twophase.c:1787 access/transam/xlog.c:3310 access/transam/xlog.c:3505 access/transam/xlog.c:4298 access/transam/xlog.c:8585 access/transam/xlog.c:8630 +#: backup/basebackup_server.c:207 commands/dbcommands.c:514 replication/logical/snapbuild.c:1795 replication/slot.c:2112 replication/slot.c:2218 storage/file/fd.c:820 storage/file/fd.c:3851 storage/smgr/md.c:1329 storage/smgr/md.c:1374 storage/sync/sync.c:446 utils/misc/guc.c:4480 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" + +#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:158 ../common/cryptohash_openssl.c:356 ../common/exec.c:562 ../common/exec.c:607 ../common/exec.c:699 ../common/hmac.c:309 ../common/hmac.c:325 ../common/hmac_openssl.c:160 ../common/hmac_openssl.c:357 ../common/md5_common.c:156 ../common/parse_manifest.c:157 ../common/parse_manifest.c:853 ../common/psprintf.c:143 ../common/scram-common.c:269 ../common/stringinfo.c:314 ../port/path.c:751 ../port/path.c:788 +#: ../port/path.c:805 access/transam/twophase.c:1434 access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1352 libpq/auth.c:1396 libpq/auth.c:1953 libpq/be-secure-gssapi.c:524 postmaster/bgworker.c:355 postmaster/bgworker.c:945 postmaster/postmaster.c:3559 postmaster/postmaster.c:4019 postmaster/postmaster.c:4381 postmaster/walsummarizer.c:820 replication/libpqwalreceiver/libpqwalreceiver.c:387 replication/logical/logical.c:209 replication/walsender.c:835 +#: storage/buffer/localbuf.c:606 storage/file/fd.c:912 storage/file/fd.c:1443 storage/file/fd.c:1604 storage/file/fd.c:2531 storage/ipc/procarray.c:1453 storage/ipc/procarray.c:2207 storage/ipc/procarray.c:2214 storage/ipc/procarray.c:2719 storage/ipc/procarray.c:3423 utils/adt/formatting.c:1725 utils/adt/formatting.c:1873 utils/adt/formatting.c:2075 utils/adt/pg_locale.c:509 utils/adt/pg_locale.c:673 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:516 +#: utils/hash/dynahash.c:616 utils/hash/dynahash.c:1099 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:649 utils/misc/guc.c:674 utils/misc/guc.c:1062 utils/misc/guc.c:4458 utils/misc/tzparser.c:477 utils/mmgr/aset.c:451 utils/mmgr/bump.c:183 utils/mmgr/dsa.c:707 utils/mmgr/dsa.c:729 utils/mmgr/dsa.c:810 utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1154 utils/mmgr/slab.c:370 +#, c-format +msgid "out of memory" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" + +#: ../common/cryptohash.c:266 ../common/cryptohash.c:272 ../common/cryptohash_openssl.c:368 ../common/cryptohash_openssl.c:376 ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:369 ../common/hmac_openssl.c:377 +msgid "success" +msgstr "წáƒáƒ áƒ›áƒáƒ¢áƒ”ბáƒ" + +#: ../common/cryptohash.c:268 ../common/cryptohash_openssl.c:370 ../common/hmac_openssl.c:371 +msgid "destination buffer too small" +msgstr "სáƒáƒ›áƒ˜áƒ–ნე ბუფერი ძáƒáƒšáƒ˜áƒáƒœ პáƒáƒ¢áƒáƒ áƒáƒ" + +#: ../common/cryptohash_openssl.c:372 ../common/hmac_openssl.c:373 +msgid "OpenSSL failure" +msgstr "OpenSSL -ის სეცდáƒáƒ›áƒ" + +#: ../common/exec.c:174 +#, c-format +msgid "invalid binary \"%s\": %m" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ \"%s\": %m" + +#: ../common/exec.c:217 +#, c-format +msgid "could not read binary \"%s\": %m" +msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../common/exec.c:225 +#, c-format +msgid "could not find a \"%s\" to execute" +msgstr "გáƒáƒ¡áƒáƒ¨áƒ•ებáƒáƒ“ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" პáƒáƒ•ნრშეუძლებელიáƒ" + +#: ../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "ბილიკის (\"%s\") áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ  ფáƒáƒ áƒ›áƒáƒ¨áƒ˜ áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../common/exec.c:382 commands/collationcmds.c:876 commands/copyfrom.c:1721 commands/copyto.c:649 libpq/be-secure-common.c:59 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "ბრძáƒáƒœáƒ”ბის (\"%s\") შესრულების შეცდáƒáƒ›áƒ: %m" + +#: ../common/exec.c:394 libpq/be-secure-common.c:71 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "ბრძáƒáƒœáƒ”ბიდáƒáƒœ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "ბრძáƒáƒœáƒ”ბáƒáƒ› \"%s\" მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  დáƒáƒáƒ‘რუნáƒ" + +#: ../common/exec.c:424 libpq/pqcomm.c:192 storage/ipc/latch.c:1169 storage/ipc/latch.c:1349 storage/ipc/latch.c:1582 storage/ipc/latch.c:1744 storage/ipc/latch.c:1870 +#, c-format +msgid "%s() failed: %m" +msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m" + +#: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:790 ../port/path.c:807 utils/misc/ps_status.c:193 utils/misc/ps_status.c:201 utils/misc/ps_status.c:228 utils/misc/ps_status.c:236 +#, c-format +msgid "out of memory\n" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" + +#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" + +#: ../common/file_utils.c:76 storage/file/fd.c:3516 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": %m" + +#: ../common/file_utils.c:120 ../common/file_utils.c:566 ../common/file_utils.c:570 access/transam/twophase.c:1337 access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 backup/basebackup.c:355 backup/basebackup.c:553 backup/basebackup.c:624 backup/walsummary.c:247 backup/walsummary.c:254 commands/copyfrom.c:1747 commands/copyto.c:695 commands/extension.c:3527 commands/tablespace.c:804 commands/tablespace.c:893 postmaster/pgarch.c:680 +#: replication/logical/snapbuild.c:1653 replication/logical/snapbuild.c:2156 storage/file/fd.c:1968 storage/file/fd.c:2054 storage/file/fd.c:3564 utils/adt/dbsize.c:105 utils/adt/dbsize.c:257 utils/adt/dbsize.c:337 utils/adt/genfile.c:437 utils/adt/genfile.c:612 utils/adt/misc.c:340 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" + +#: ../common/file_utils.c:130 ../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../common/file_utils.c:151 ../common/file_utils.c:281 ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 commands/tablespace.c:738 postmaster/postmaster.c:1468 storage/file/fd.c:2933 storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:339 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../common/file_utils.c:169 ../common/file_utils.c:315 ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2945 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../common/file_utils.c:498 access/transam/xlogarchive.c:389 postmaster/pgarch.c:834 postmaster/syslogger.c:1559 replication/logical/snapbuild.c:1814 replication/slot.c:936 replication/slot.c:1998 replication/slot.c:2140 storage/file/fd.c:838 utils/time/snapmgr.c:1255 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" + +#: ../common/hmac.c:323 +msgid "internal error" +msgstr "შიდრშეცდáƒáƒ›áƒ" + +#: ../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "რეკურსიულ დáƒáƒ¦áƒ›áƒáƒ•áƒáƒš დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელს ინკრემენტული lexer-ის გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ  შეუძლიáƒ." + +#: ../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "ინკრემენტულ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელს ინკრემენტული lexer სჭირდებáƒ." + +#: ../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON მეტისმეტáƒáƒ“ ღრმáƒáƒ“áƒáƒ ერთმáƒáƒœáƒ”თში ჩáƒáƒšáƒáƒ’ებული. მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ დáƒáƒ¡áƒáƒ¨áƒ•ები სიღრმერ6400." + +#: ../common/jsonapi.c:2127 +#, c-format +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "სპეციáƒáƒšáƒ£áƒ áƒ˜ მიმდევრáƒáƒ‘რ\"\\%.*s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ." + +#: ../common/jsonapi.c:2131 +#, c-format +msgid "Character with value 0x%02x must be escaped." +msgstr "სიმბáƒáƒšáƒ კáƒáƒ“ით 0x%02x áƒáƒ£áƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ ეკრáƒáƒœáƒ˜áƒ áƒ”ბული უნდრიყáƒáƒ¡." + +#: ../common/jsonapi.c:2135 +#, c-format +msgid "Expected end of input, but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი შეყვáƒáƒœáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ¡, მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../common/jsonapi.c:2138 +#, c-format +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი მáƒáƒ¡áƒ˜áƒ•ის ელემენტს áƒáƒœ \"]\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../common/jsonapi.c:2141 +#, c-format +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი \",\" áƒáƒœ \"]\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../common/jsonapi.c:2144 +#, c-format +msgid "Expected \":\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი \":\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../common/jsonapi.c:2147 +#, c-format +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი JSON მნიშვნელáƒáƒ‘áƒáƒ¡. მივიღე \"%.*s\"." + +#: ../common/jsonapi.c:2150 +msgid "The input string ended unexpectedly." +msgstr "შეყვáƒáƒœáƒ˜áƒ¡ სტრიქáƒáƒœáƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ." + +#: ../common/jsonapi.c:2152 +#, c-format +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი სტრიქáƒáƒœáƒ¡ áƒáƒœ \"}\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../common/jsonapi.c:2155 +#, c-format +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი \",\", áƒáƒœ \"}\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../common/jsonapi.c:2158 +#, c-format +msgid "Expected string, but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი სტრიქáƒáƒœáƒ¡, მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../common/jsonapi.c:2161 +#, c-format +msgid "Token \"%.*s\" is invalid." +msgstr "კáƒáƒ“ი \"%.*s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ." + +#: ../common/jsonapi.c:2164 jsonpath_scan.l:608 +#, c-format +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 ტექსტáƒáƒ“ ვერ გáƒáƒ áƒ“áƒáƒ˜áƒ¥áƒ›áƒœáƒ”ბáƒ." + +#: ../common/jsonapi.c:2166 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "\"\\u\" ს თექვსმეტáƒáƒ‘ითი ციფრები უნდრმáƒáƒ°áƒ§áƒ•ებáƒáƒ“ეს." + +#: ../common/jsonapi.c:2169 +msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." +msgstr "უნიკáƒáƒ“ის სპეციáƒáƒšáƒ£áƒ áƒ˜ კáƒáƒ“ების გáƒáƒ›áƒáƒ§áƒ”ნებრკáƒáƒ“ის წერტილის მნიშვნელáƒáƒ‘ებáƒáƒ“ 007F-ის ზემáƒáƒ— შეუძლებელიáƒ, თუ კáƒáƒ“ირებრUTF-8 áƒáƒ áƒáƒ." + +#: ../common/jsonapi.c:2178 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "უნიკáƒáƒ“ის სპეციáƒáƒšáƒ£áƒ áƒ˜ კáƒáƒ“ების სერვერის კáƒáƒ“ირებáƒáƒ¨áƒ˜ (%s) თáƒáƒ áƒ’მნრშეუძლებელიáƒ." + +#: ../common/jsonapi.c:2185 jsonpath_scan.l:641 +#, c-format +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "უნიკáƒáƒ“ის მáƒáƒ¦áƒáƒš სურáƒáƒ’áƒáƒ¢áƒ¡ მáƒáƒ¦áƒáƒšáƒ˜ სურáƒáƒ’áƒáƒ¢áƒ˜ áƒáƒ  უნდრმáƒáƒ¡áƒ“ევდეს." + +#: ../common/jsonapi.c:2187 jsonpath_scan.l:652 jsonpath_scan.l:662 jsonpath_scan.l:713 +#, c-format +msgid "Unicode low surrogate must follow a high surrogate." +msgstr "უნიკáƒáƒ“ის დáƒáƒ‘áƒáƒšáƒ˜ სურáƒáƒ’áƒáƒ¢áƒ˜ მáƒáƒ¦áƒáƒš სურáƒáƒ’áƒáƒ¢áƒ¡ უნდრმისდევდეს." + +#: ../common/logging.c:276 +#, c-format +msgid "error: " +msgstr "შეცდáƒáƒ›áƒ: " + +#: ../common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: " + +#: ../common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "დეტáƒáƒšáƒ”ბი: " + +#: ../common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "მინიშნებáƒ: " + +#: ../common/parse_manifest.c:159 ../common/parse_manifest.c:855 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: ../common/parse_manifest.c:204 ../common/parse_manifest.c:261 +msgid "manifest ended unexpectedly" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტი მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ" + +#: ../common/parse_manifest.c:210 ../common/parse_manifest.c:862 +#, c-format +msgid "could not update checksum of manifest" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბის შეცდáƒáƒ›áƒ" + +#: ../common/parse_manifest.c:302 +msgid "unexpected object start" +msgstr "áƒáƒ‘იექტის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜" + +#: ../common/parse_manifest.c:337 +msgid "unexpected object end" +msgstr "áƒáƒ‘იექტის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" + +#: ../common/parse_manifest.c:366 +msgid "unexpected array start" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜" + +#: ../common/parse_manifest.c:391 +msgid "unexpected array end" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" + +#: ../common/parse_manifest.c:418 +msgid "expected version indicator" +msgstr "მáƒáƒ¡áƒáƒšáƒáƒ“ნელი ვერსიის მáƒáƒ©áƒ•ენებელი" + +#: ../common/parse_manifest.c:454 +msgid "unrecognized top-level field" +msgstr "უცნáƒáƒ‘ი ველი ზედრდáƒáƒœáƒ”ზე" + +#: ../common/parse_manifest.c:473 +msgid "unexpected file field" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი ველი ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის" + +#: ../common/parse_manifest.c:487 +msgid "unexpected WAL range field" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი ველი WAL-ის დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡áƒ—ვის" + +#: ../common/parse_manifest.c:493 +msgid "unexpected object field" +msgstr "áƒáƒ‘იექტის მáƒáƒ£áƒšáƒáƒ“ნელი ველი" + +#: ../common/parse_manifest.c:583 +msgid "unexpected scalar" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი სკáƒáƒšáƒáƒ áƒ˜" + +#: ../common/parse_manifest.c:609 +msgid "manifest version not an integer" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის ვერსირმთელი რიცხვი áƒáƒ áƒáƒ" + +#: ../common/parse_manifest.c:613 +msgid "unexpected manifest version" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის მáƒáƒ£áƒšáƒáƒ“ნელი ვერსიáƒ" + +#: ../common/parse_manifest.c:637 +msgid "manifest system identifier not an integer" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სისტემის იდენფიტიკáƒáƒ¢áƒáƒ áƒ˜ მთელი რიცხვი áƒáƒ áƒáƒ" + +#: ../common/parse_manifest.c:662 +msgid "missing path name" +msgstr "áƒáƒ™áƒšáƒ˜áƒ ბილიკის სáƒáƒ®áƒ”ლი" + +#: ../common/parse_manifest.c:665 +msgid "both path name and encoded path name" +msgstr "áƒáƒ áƒ˜áƒ•ე, ბილიკის სáƒáƒ®áƒ”ლი დრბილიკის კáƒáƒ“ირებული სáƒáƒ®áƒ”ლი" + +#: ../common/parse_manifest.c:667 +msgid "missing size" +msgstr "ზáƒáƒ›áƒ áƒáƒ™áƒšáƒ˜áƒ" + +#: ../common/parse_manifest.c:670 +msgid "checksum without algorithm" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მის გáƒáƒ áƒ”შე" + +#: ../common/parse_manifest.c:684 +msgid "could not decode file name" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის გáƒáƒ¨áƒ˜áƒ¤áƒ•რის შეცდáƒáƒ›áƒ" + +#: ../common/parse_manifest.c:694 +msgid "file size is not an integer" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ მთელი რიცხვი áƒáƒ áƒáƒ" + +#: ../common/parse_manifest.c:700 backup/basebackup.c:870 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ უცნáƒáƒ‘ი áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მი: \"%s\"" + +#: ../common/parse_manifest.c:719 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": \"%s\"" + +#: ../common/parse_manifest.c:762 +msgid "missing timeline" +msgstr "áƒáƒ™áƒšáƒ˜áƒ დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი" + +#: ../common/parse_manifest.c:764 +msgid "missing start LSN" +msgstr "áƒáƒ™áƒšáƒ˜áƒ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ LSN" + +#: ../common/parse_manifest.c:766 +msgid "missing end LSN" +msgstr "áƒáƒ™áƒšáƒ˜áƒ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ¡ LSN" + +#: ../common/parse_manifest.c:772 +msgid "timeline is not an integer" +msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი მთელი რიცხვი áƒáƒ áƒáƒ" + +#: ../common/parse_manifest.c:775 +msgid "could not parse start LSN" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ LSN-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" + +#: ../common/parse_manifest.c:778 +msgid "could not parse end LSN" +msgstr "სáƒáƒ‘áƒáƒšáƒáƒ LSN-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" + +#: ../common/parse_manifest.c:843 +msgid "expected at least 2 lines" +msgstr "ველáƒáƒ“ებáƒáƒ“ი სულ ცáƒáƒ¢áƒ 2 ხáƒáƒ–ს" + +#: ../common/parse_manifest.c:846 +msgid "last line not newline-terminated" +msgstr "ბáƒáƒšáƒ ხáƒáƒ–ი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ— áƒáƒ  სრულდებáƒ" + +#: ../common/parse_manifest.c:865 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ" + +#: ../common/parse_manifest.c:869 +#, c-format +msgid "manifest has no checksum" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../common/parse_manifest.c:873 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: %s" + +#: ../common/parse_manifest.c:877 +#, c-format +msgid "manifest checksum mismatch" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ áƒáƒ  ემთხვევáƒ" + +#: ../common/parse_manifest.c:892 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ მáƒáƒœáƒ˜áƒ¤áƒ”სტის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცრáƒáƒ›áƒ: %s" + +#: ../common/percentrepl.c:79 ../common/percentrepl.c:85 ../common/percentrepl.c:118 ../common/percentrepl.c:124 tcop/backend_startup.c:741 utils/misc/guc.c:3167 utils/misc/guc.c:3208 utils/misc/guc.c:3283 utils/misc/guc.c:4662 utils/misc/guc.c:6887 utils/misc/guc.c:6928 +#, c-format +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რპáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\": \"%s\"" + +#: ../common/percentrepl.c:80 ../common/percentrepl.c:86 +#, c-format +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "სტრიქáƒáƒœáƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ სრულდებრსპეციáƒáƒšáƒ£áƒ áƒ˜ სიმბáƒáƒšáƒáƒ¡ \"%%\" შემდეგ." + +#: ../common/percentrepl.c:119 ../common/percentrepl.c:125 +#, c-format +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "სტრიქáƒáƒœáƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელ áƒáƒ“გილმჭერს \"%%%c\" შეიცáƒáƒ•ს." + +#: ../common/pgfnames.c:74 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: ../common/relpath.c:61 +#, c-format +msgid "invalid fork name" +msgstr "ფáƒáƒ áƒ™áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი" + +#: ../common/relpath.c:62 +#, c-format +msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." +msgstr "ფáƒáƒ áƒ™áƒ˜áƒ¡ მისáƒáƒ¦áƒ”ბი სáƒáƒ®áƒ”ლებირ\"main\", \"fsm\", \"vm\" დრ\"init\"." + +#: ../common/restricted_token.c:60 +#, c-format +msgid "could not open process token: error code %lu" +msgstr "პრáƒáƒªáƒ”სის კáƒáƒ“ის გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: ../common/restricted_token.c:74 +#, c-format +msgid "could not allocate SIDs: error code %lu" +msgstr "შეცდáƒáƒ›áƒ SSID-ების გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: ../common/restricted_token.c:94 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "შეზღუდული კáƒáƒ“ის შექმნრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: ../common/restricted_token.c:115 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "„%s“ ბრძáƒáƒœáƒ”ბის პრáƒáƒªáƒ”სის დáƒáƒ¬áƒ§áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: ../common/restricted_token.c:153 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "შეზღუდულ კáƒáƒ“ის ხელáƒáƒ®áƒšáƒ შესრულებრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: ../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "ქვეპრáƒáƒªáƒ”სიდáƒáƒœ გáƒáƒ¡áƒáƒ¡áƒ•ლელი კáƒáƒ“ი ვერ მივიღე: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: ../common/rmtree.c:97 access/heap/rewriteheap.c:1214 access/transam/twophase.c:1726 access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:399 postmaster/postmaster.c:1048 postmaster/syslogger.c:1488 replication/logical/origin.c:591 replication/logical/reorderbuffer.c:4560 replication/logical/snapbuild.c:1695 replication/logical/snapbuild.c:2129 replication/slot.c:2192 storage/file/fd.c:878 storage/file/fd.c:3378 storage/file/fd.c:3440 +#: storage/file/reinit.c:261 storage/ipc/dsm.c:343 storage/smgr/md.c:381 storage/smgr/md.c:440 storage/sync/sync.c:243 utils/time/snapmgr.c:1591 +#, c-format +msgid "could not remove file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m" + +#: ../common/rmtree.c:124 commands/tablespace.c:767 commands/tablespace.c:780 commands/tablespace.c:815 commands/tablespace.c:905 storage/file/fd.c:3370 storage/file/fd.c:3779 +#, c-format +msgid "could not remove directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../common/scram-common.c:282 +msgid "could not encode salt" +msgstr "მáƒáƒ áƒ˜áƒšáƒ˜áƒ¡ კáƒáƒ“ირების შეცდáƒáƒ›áƒ" + +#: ../common/scram-common.c:298 +msgid "could not encode stored key" +msgstr "დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებული გáƒáƒ¡áƒáƒ¦áƒ”ბის კáƒáƒ“ირების შეცდáƒáƒ›áƒ" + +#: ../common/scram-common.c:315 +msgid "could not encode server key" +msgstr "სერვერის გáƒáƒ¡áƒáƒ¦áƒ”ბის კáƒáƒ“ირების შეცდáƒáƒ›áƒ" + +#: ../common/stringinfo.c:315 +#, c-format +msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." +msgstr "სტრიქáƒáƒœáƒ”ბის ბáƒáƒ¤áƒ”რის, რáƒáƒ›áƒ”ლიც უკვე შეიცáƒáƒ•ს %d ბáƒáƒ˜áƒ¢áƒ¡, %d ბáƒáƒ˜áƒ¢áƒ˜áƒ— ვერ გáƒáƒ•áƒáƒ“იდებ." + +#: ../common/stringinfo.c:319 +#, c-format +msgid "" +"out of memory\n" +"\n" +"Cannot enlarge string buffer containing %d bytes by %d more bytes.\n" +msgstr "" +"áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერების\n" +"\n" +"შეუძლებელირსტრიქáƒáƒœáƒ˜áƒ¡ ბუფერის (%d ბáƒáƒ˜áƒ¢áƒ˜áƒ’) áƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ%d ბáƒáƒ˜áƒ¢áƒ˜áƒ—.\n" + +#: ../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ეფექტური ID-ის (%ld) áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %s" + +#: ../common/username.c:45 libpq/auth.c:1888 +msgid "user does not exist" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: ../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "მáƒáƒ›áƒ®áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu" + +#: ../common/wait_error.c:55 +#, c-format +msgid "command not executable" +msgstr "ბრძáƒáƒœáƒ”ბრგáƒáƒ¨áƒ•ებáƒáƒ“ი áƒáƒ áƒáƒ" + +#: ../common/wait_error.c:59 +#, c-format +msgid "command not found" +msgstr "ბრძáƒáƒœáƒ”ბრვერ ვიპáƒáƒ•ე" + +#: ../common/wait_error.c:64 +#, c-format +msgid "child process exited with exit code %d" +msgstr "შვილი პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d" + +#: ../common/wait_error.c:72 +#, c-format +msgid "child process was terminated by exception 0x%X" +msgstr "შვილი პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რგáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ— 0x%X" + +#: ../common/wait_error.c:76 +#, c-format +msgid "child process was terminated by signal %d: %s" +msgstr "პრáƒáƒªáƒ”სი გáƒáƒ©áƒ”რდრსიგნáƒáƒšáƒ˜áƒ—: %d: %s" + +#: ../common/wait_error.c:82 +#, c-format +msgid "child process exited with unrecognized status %d" +msgstr "შვილი პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რუცნáƒáƒ‘ი სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d" + +#: ../port/chklocale.c:283 +#, c-format +msgid "could not determine encoding for codeset \"%s\"" +msgstr "კáƒáƒ“ირების დáƒáƒ“გენრვერ მáƒáƒ®áƒ”რხდრ\"%s\"-ისთვის" + +#: ../port/chklocale.c:404 ../port/chklocale.c:410 +#, c-format +msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" +msgstr "ენისთვის \"%s\" კáƒáƒ“ირების დáƒáƒ“გენრვერ მáƒáƒ®áƒ”რხდáƒ: კáƒáƒ“ების ნáƒáƒ™áƒ áƒ”ბი áƒáƒ áƒ˜áƒ¡ \"%s\"" + +#: ../port/dirmod.c:284 +#, c-format +msgid "could not set junction for \"%s\": %s" +msgstr "\"%s\"-ისთვის შეერთების დáƒáƒ§áƒ”ნებრვერ მáƒáƒ®áƒ”რხდáƒ: %s" + +#: ../port/dirmod.c:287 +#, c-format +msgid "could not set junction for \"%s\": %s\n" +msgstr "\"%s\"-ისთვის შეერთების დáƒáƒ§áƒ”ნებრვერ მáƒáƒ®áƒ”რხდáƒ: %s\n" + +#: ../port/dirmod.c:364 +#, c-format +msgid "could not get junction for \"%s\": %s" +msgstr "\"%s\"-ისთვის შეერთების მიღებრვერ მáƒáƒ®áƒ”რხდáƒ: %s" + +#: ../port/dirmod.c:367 +#, c-format +msgid "could not get junction for \"%s\": %s\n" +msgstr "\"%s\"-ისთვის შეერთების მიღებრვერ მáƒáƒ®áƒ”რხდáƒ: %s\n" + +#: ../port/open.c:115 +#, c-format +msgid "could not open file \"%s\": %s" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %s" + +#: ../port/open.c:116 +msgid "lock violation" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ დáƒáƒ áƒ¦áƒ•ევáƒ" + +#: ../port/open.c:116 +msgid "sharing violation" +msgstr "გáƒáƒ–იáƒáƒ áƒ”ბის დáƒáƒ áƒ¦áƒ•ევáƒ" + +#: ../port/open.c:117 +#, c-format +msgid "Continuing to retry for 30 seconds." +msgstr "ვáƒáƒ’რძელებ თáƒáƒ•იდáƒáƒœ ცდáƒáƒ¡ 30 წáƒáƒ›áƒ˜áƒ—." + +#: ../port/open.c:118 +#, c-format +msgid "You might have antivirus, backup, or similar software interfering with the database system." +msgstr "შეიძლებრთქვენი áƒáƒœáƒ¢áƒ˜áƒ•ირუსი, მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ áƒáƒœ რáƒáƒ›áƒ” სხვრპრáƒáƒ’რáƒáƒ›áƒ ხელს უშლის მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემის მუშáƒáƒáƒ‘áƒáƒ¡." + +#: ../port/path.c:775 +#, c-format +msgid "could not get current working directory: %m\n" +msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ›áƒ£áƒ¨áƒáƒ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მიღების შეცდáƒáƒ›áƒ: %m\n" + +#: ../port/strerror.c:72 +#, c-format +msgid "operating system error %d" +msgstr "áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒšáƒ˜ სისტემის შეცდáƒáƒ›áƒ %d" + +#: ../port/user.c:43 ../port/user.c:79 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ID-ის (%d) áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %s" + +#: ../port/user.c:48 ../port/user.c:84 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ID-ით %d áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: ../port/win32security.c:62 +#, c-format +msgid "could not get SID for Administrators group: error code %lu\n" +msgstr "ვერ მივიღე SID áƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ—რჯგუფისთვის: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" + +#: ../port/win32security.c:72 +#, c-format +msgid "could not get SID for PowerUsers group: error code %lu\n" +msgstr "ვერ მივიღე SID PowerUsers ჯგუფისთვის: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" + +#: ../port/win32security.c:80 +#, c-format +msgid "could not check access token membership: error code %lu\n" +msgstr "კáƒáƒ“ის წევრáƒáƒ‘ის წვდáƒáƒ›áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" + +#: access/brin/brin.c:405 +#, c-format +msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" +msgstr "\"BRIN\" შეჯáƒáƒ›áƒ”ბის დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ ინდექსისთვის \"%s\" გვერდი %u ჩáƒáƒ¬áƒ”რილი áƒáƒ áƒáƒ" + +#: access/brin/brin.c:1385 access/brin/brin.c:1493 access/gin/ginfast.c:1040 access/transam/xlogfuncs.c:183 access/transam/xlogfuncs.c:208 access/transam/xlogfuncs.c:241 access/transam/xlogfuncs.c:280 access/transam/xlogfuncs.c:301 access/transam/xlogfuncs.c:322 access/transam/xlogfuncs.c:388 access/transam/xlogfuncs.c:446 +#, c-format +msgid "recovery is in progress" +msgstr "áƒáƒ¦áƒ“გენრმიმდინáƒáƒ áƒ”áƒáƒ‘ს" + +#: access/brin/brin.c:1386 access/brin/brin.c:1494 +#, c-format +msgid "BRIN control functions cannot be executed during recovery." +msgstr "áƒáƒ¦áƒ“გენის დრáƒáƒ¡ BRIN კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფუნქციების შესრულებრშეუძლებელიáƒ." + +#: access/brin/brin.c:1391 access/brin/brin.c:1499 +#, c-format +msgid "block number out of range: %lld" +msgstr "ბლáƒáƒ™áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რდიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: %lld" + +#: access/brin/brin.c:1436 access/brin/brin.c:1525 +#, c-format +msgid "\"%s\" is not a BRIN index" +msgstr "\"%s\" BRIN ინდექსი áƒáƒ áƒáƒ" + +#: access/brin/brin.c:1452 access/brin/brin.c:1541 +#, c-format +msgid "could not open parent table of index \"%s\"" +msgstr "ინდექსის \"%s\" მშáƒáƒ‘ელი ცხრილის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: access/brin/brin.c:1461 access/brin/brin.c:1557 access/gin/ginfast.c:1085 parser/parse_utilcmd.c:2252 +#, c-format +msgid "index \"%s\" is not valid" +msgstr "ინდექსი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: \"%s\"" + +#: access/brin/brin_bloom.c:783 access/brin/brin_bloom.c:825 access/brin/brin_minmax_multi.c:2993 access/brin/brin_minmax_multi.c:3130 statistics/dependencies.c:661 statistics/dependencies.c:714 statistics/mcv.c:1480 statistics/mcv.c:1511 statistics/mvdistinct.c:343 statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:40 utils/adt/pseudotypes.c:74 utils/adt/tsgistidx.c:94 +#, c-format +msgid "cannot accept a value of type %s" +msgstr "მნიშვნელáƒáƒ‘ის ეს ტიპი მიუღებელიáƒ: %s" + +#: access/brin/brin_pageops.c:75 access/brin/brin_pageops.c:361 access/brin/brin_pageops.c:851 access/gin/ginentrypage.c:109 access/gist/gist.c:1463 access/spgist/spgdoinsert.c:2001 access/spgist/spgdoinsert.c:2278 +#, c-format +msgid "index row size %zu exceeds maximum %zu for index \"%s\"" +msgstr "ინდექსის მწკრივის ზáƒáƒ›áƒ %zu მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ–ე (%zu) მეტირინდექსისთვის \"%s\"" + +#: access/brin/brin_revmap.c:383 access/brin/brin_revmap.c:389 +#, c-format +msgid "corrupted BRIN index: inconsistent range map" +msgstr "დáƒáƒ–იáƒáƒœáƒ”ბული BRIN ინდექსი: დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ რუკრáƒáƒ áƒáƒ›áƒ“გრáƒáƒ“იáƒ" + +#: access/brin/brin_revmap.c:583 +#, c-format +msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" +msgstr "გვერდის მáƒáƒ£áƒšáƒáƒ“ნელი ტიპი 0x%04X BRIN ინდექსში \"%s\" ბლáƒáƒ™áƒ¨áƒ˜ %u" + +#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:149 access/gist/gistvalidate.c:152 access/hash/hashvalidate.c:139 access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 +#, c-format +msgid "operator family \"%s\" of access method %s contains function %s with invalid support number %d" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“იდáƒáƒœ %s შეიცáƒáƒ•ს ფუნქციáƒáƒ¡ %s áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ნáƒáƒ›áƒ áƒ˜áƒ— %d" + +#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:161 access/gist/gistvalidate.c:164 access/hash/hashvalidate.c:118 access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 +#, c-format +msgid "operator family \"%s\" of access method %s contains function %s with wrong signature for support number %d" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ (\"%s\") (წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისგáƒáƒœ %s) შეიცáƒáƒ•ს ფუნქციáƒáƒ¡ %s, რáƒáƒ›áƒ”ლსáƒáƒª áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ხელმáƒáƒ¬áƒ”რრáƒáƒ¥áƒ•ს მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ნáƒáƒ›áƒ áƒ˜áƒ— %d" + +#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:180 access/gist/gistvalidate.c:184 access/hash/hashvalidate.c:160 access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 +#, c-format +msgid "operator family \"%s\" of access method %s contains operator %s with invalid strategy number %d" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ის %s შეიცáƒáƒ•ს áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¡ %s áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სტრáƒáƒ¢áƒ”გიის ნáƒáƒ›áƒ áƒ˜áƒ— %d" + +#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:193 access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 access/spgist/spgvalidate.c:237 +#, c-format +msgid "operator family \"%s\" of access method %s contains invalid ORDER BY specification for operator %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ის %s შეიცáƒáƒ•ს áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ORDER BY სპეციფიკáƒáƒªáƒ˜áƒáƒ¡ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡áƒ—ვის %s" + +#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:206 access/gist/gistvalidate.c:232 access/hash/hashvalidate.c:186 access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 +#, c-format +msgid "operator family \"%s\" of access method %s contains operator %s with wrong signature" +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ის %s áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ \"%s\" შეიცáƒáƒ•ს áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¡ %s áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ხელმáƒáƒ¬áƒ”რით" + +#: access/brin/brin_validate.c:236 access/hash/hashvalidate.c:226 access/nbtree/nbtvalidate.c:236 access/spgist/spgvalidate.c:280 +#, c-format +msgid "operator family \"%s\" of access method %s is missing operator(s) for types %s and %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ¡ \"%s\" ( წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისგáƒáƒœ \"%s\") áƒáƒ™áƒšáƒ˜áƒ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ ტიპებისთვის %s დრ%s" + +#: access/brin/brin_validate.c:246 +#, c-format +msgid "operator family \"%s\" of access method %s is missing support function(s) for types %s and %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ¡ \"%s\" ( წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისგáƒáƒœ \"%s\") áƒáƒ™áƒšáƒ˜áƒ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ ტიპებისთვის %s დრ%s" + +#: access/brin/brin_validate.c:259 access/hash/hashvalidate.c:240 access/nbtree/nbtvalidate.c:260 access/spgist/spgvalidate.c:315 +#, c-format +msgid "operator class \"%s\" of access method %s is missing operator(s)" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ¡ \"%s\" (წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“იდáƒáƒœ %s) áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბი áƒáƒ™áƒšáƒ˜áƒ" + +#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:248 access/gist/gistvalidate.c:273 +#, c-format +msgid "operator class \"%s\" of access method %s is missing support function %d" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ¡ \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“იდáƒáƒœ %s áƒáƒ™áƒšáƒ˜áƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფუნქცირ%d" + +#: access/common/attmap.c:121 +#, c-format +msgid "Returned type %s does not match expected type %s in column %d." +msgstr "დáƒáƒ‘რუნებული ტიპი %s áƒáƒ  ემთხვევრმáƒáƒ¡áƒáƒšáƒáƒ“ნელ ტიპს %s სვეტისთვის %d." + +#: access/common/attmap.c:149 +#, c-format +msgid "Number of returned columns (%d) does not match expected column count (%d)." +msgstr "სვეტების დáƒáƒ‘რუნებული რáƒáƒáƒ“ენáƒáƒ‘რ(%d) áƒáƒ  ემთხვევრმáƒáƒ¡áƒáƒšáƒáƒ“ნელს (%d) áƒáƒ  ემთხვევáƒ." + +#: access/common/attmap.c:233 access/common/attmap.c:245 +#, c-format +msgid "could not convert row type" +msgstr "მწკრივის ტიპის გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: access/common/attmap.c:234 +#, c-format +msgid "Attribute \"%s\" of type %s does not match corresponding attribute of type %s." +msgstr "áƒáƒ¢áƒ áƒ˜áƒ‘უტი %s ტიპისთვის %s ტიპის(%s) შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡ áƒáƒ¢áƒ áƒ˜áƒ‘უტს áƒáƒ  ემთხვევáƒ." + +#: access/common/attmap.c:246 +#, c-format +msgid "Attribute \"%s\" of type %s does not exist in type %s." +msgstr "áƒáƒ¢áƒ áƒ˜áƒ‘უტი \"%s\" ტიპისთვის \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს ტიპში \"%s\"." + +#: access/common/heaptuple.c:1132 access/common/heaptuple.c:1467 +#, c-format +msgid "number of columns (%d) exceeds limit (%d)" +msgstr "სვეტების რáƒáƒáƒ“ენáƒáƒ‘რ(%d) áƒáƒ¦áƒ”მáƒáƒ¢áƒ”ბრლიმიტს (%d)" + +#: access/common/indextuple.c:89 +#, c-format +msgid "number of index columns (%d) exceeds limit (%d)" +msgstr "ინდექსის სვეტების რáƒáƒáƒ“ენáƒáƒ‘რ(%d) áƒáƒ¦áƒ”მáƒáƒ¢áƒ”ბრლიმიტს (%d)" + +#: access/common/indextuple.c:209 access/spgist/spgutils.c:959 +#, c-format +msgid "index row requires %zu bytes, maximum size is %zu" +msgstr "ინდექსის მწკრივი მáƒáƒ˜áƒ—ხáƒáƒ•ს %zu ბáƒáƒ˜áƒ¢áƒ¡, მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ზáƒáƒ›áƒ %zu" + +#: access/common/printtup.c:291 commands/explain.c:5375 tcop/fastpath.c:107 tcop/fastpath.c:454 tcop/postgres.c:1940 +#, c-format +msgid "unsupported format code: %d" +msgstr "ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი კáƒáƒ“ი: %d" + +#: access/common/reloptions.c:519 access/common/reloptions.c:530 +msgid "Valid values are \"on\", \"off\", and \"auto\"." +msgstr "სწáƒáƒ áƒ˜ მნიშვნელáƒáƒ‘ებირ\"on\", \"off\" დრ\"auto\"." + +#: access/common/reloptions.c:541 +msgid "Valid values are \"local\" and \"cascaded\"." +msgstr "სწáƒáƒ áƒ˜ მნიშვნელáƒáƒ‘ებირ\"local\" დრ\"cascaded\"." + +#: access/common/reloptions.c:689 +#, c-format +msgid "user-defined relation parameter types limit exceeded" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ურთიერთáƒáƒ‘ის პáƒáƒ áƒáƒ›áƒ”ტრის ტიპებმრლიმიტს გáƒáƒ“áƒáƒáƒ­áƒáƒ áƒ‘áƒ" + +#: access/common/reloptions.c:1231 +#, c-format +msgid "RESET must not include values for parameters" +msgstr "RESET პáƒáƒ áƒáƒ›áƒ”ტრების მნიშვნელáƒáƒ‘ებს áƒáƒ  უნდრშეიცáƒáƒ•დეს" + +#: access/common/reloptions.c:1263 +#, c-format +msgid "unrecognized parameter namespace \"%s\"" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრების სáƒáƒ®áƒ”ლების უცნáƒáƒ‘ი სივრცე: \"%s\"" + +#: access/common/reloptions.c:1300 commands/variable.c:1191 +#, c-format +msgid "tables declared WITH OIDS are not supported" +msgstr "ცხრილები, áƒáƒ¦áƒ¬áƒ”რილი WITH OIDS-ით, მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: access/common/reloptions.c:1468 +#, c-format +msgid "unrecognized parameter \"%s\"" +msgstr "უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი\"%s\"" + +#: access/common/reloptions.c:1580 +#, c-format +msgid "parameter \"%s\" specified more than once" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" ერთზე მეტჯერáƒáƒ მითთებული" + +#: access/common/reloptions.c:1596 +#, c-format +msgid "invalid value for boolean option \"%s\": %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რლáƒáƒ’იკური პáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\": %s" + +#: access/common/reloptions.c:1608 +#, c-format +msgid "invalid value for integer option \"%s\": %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რმთელი რიცხვის პáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\": %s" + +#: access/common/reloptions.c:1614 access/common/reloptions.c:1634 +#, c-format +msgid "value %s out of bounds for option \"%s\"" +msgstr "მნიშვნელáƒáƒ‘რ%s პáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\" სáƒáƒ–ღვრებს გáƒáƒ áƒ”თáƒáƒ" + +#: access/common/reloptions.c:1616 +#, c-format +msgid "Valid values are between \"%d\" and \"%d\"." +msgstr "სწáƒáƒ áƒ˜ მნიშვნელáƒáƒ‘ები \"%d\"-სრდრ\"%d\"-ს შáƒáƒ áƒ˜áƒ¡áƒáƒ." + +#: access/common/reloptions.c:1628 +#, c-format +msgid "invalid value for floating point option \"%s\": %s" +msgstr "წილáƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრის (\"%s\") áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: %s" + +#: access/common/reloptions.c:1636 +#, c-format +msgid "Valid values are between \"%f\" and \"%f\"." +msgstr "სწáƒáƒ áƒ˜ მნიშვნელáƒáƒ‘ების დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ \"%f\"-სრდრ\"%f\"-ს შáƒáƒ áƒ˜áƒ¡." + +#: access/common/reloptions.c:1658 +#, c-format +msgid "invalid value for enum option \"%s\": %s" +msgstr "ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრის \"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: %s" + +#: access/common/reloptions.c:1989 +#, c-format +msgid "cannot specify storage parameters for a partitioned table" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილისთვის სáƒáƒªáƒáƒ•ის პáƒáƒ áƒáƒ›áƒ”ტრების მითითებრშეუძლებელიáƒ" + +#: access/common/reloptions.c:1990 +#, c-format +msgid "Specify storage parameters for its leaf partitions instead." +msgstr "" + +#: access/common/toast_compression.c:31 +#, c-format +msgid "compression method lz4 not supported" +msgstr "შეკუმშვის მეთáƒáƒ“ი lz4 მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: access/common/toast_compression.c:32 +#, c-format +msgid "This functionality requires the server to be built with lz4 support." +msgstr "ეს ფუნქციáƒáƒœáƒáƒšáƒ˜ მáƒáƒ˜áƒ—ხáƒáƒ•ს, რáƒáƒ› სერვერი lz4-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რით იყáƒáƒ¡ áƒáƒ’ებული." + +#: access/gin/ginbulk.c:44 +#, c-format +msgid "posting list is too long" +msgstr "პáƒáƒ¡áƒ¢áƒ˜áƒœáƒ’ის სირძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#: access/gin/ginbulk.c:45 +#, c-format +msgid "Reduce \"maintenance_work_mem\"." +msgstr "შეáƒáƒ›áƒªáƒ˜áƒ áƒ”თ \"maintenance_work_mem\"." + +#: access/gin/ginfast.c:1041 +#, c-format +msgid "GIN pending list cannot be cleaned up during recovery." +msgstr "GIN მáƒáƒšáƒáƒ“ინი სირáƒáƒ¦áƒ“გენის დრáƒáƒ¡ ვერ გáƒáƒ˜áƒ¬áƒ›áƒ˜áƒœáƒ“ებáƒ." + +#: access/gin/ginfast.c:1048 +#, c-format +msgid "\"%s\" is not a GIN index" +msgstr "\"%s\" GIN ინდექსი áƒáƒ áƒáƒ" + +#: access/gin/ginfast.c:1059 +#, c-format +msgid "cannot access temporary indexes of other sessions" +msgstr "სხვრსესიების დრáƒáƒ”ბით ინდექსებზე წვდáƒáƒ›áƒ შეუძლებელიáƒ" + +#: access/gin/ginget.c:271 access/nbtree/nbtinsert.c:762 +#, c-format +msgid "failed to re-find tuple within index \"%s\"" +msgstr "კáƒáƒ áƒ¢áƒ”ჟის თáƒáƒ•იდáƒáƒœ პáƒáƒ•ნის შეცდáƒáƒ›áƒ ინდექსში \"%s\"" + +#: access/gin/ginscan.c:431 +#, c-format +msgid "old GIN indexes do not support whole-index scans nor searches for nulls" +msgstr "ძველ GIN ინდექსებს áƒáƒ áƒª ინდექსების სრული სკáƒáƒœáƒ˜áƒ áƒ”ბის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ¥áƒ•ს, áƒáƒ áƒª ნულების ძებნის" + +#: access/gin/ginscan.c:432 +#, c-format +msgid "To fix this, do REINDEX INDEX \"%s\"." +msgstr "გáƒáƒ¡áƒáƒ¡áƒ¬áƒáƒ áƒ”ბლáƒáƒ“ გáƒáƒ£áƒ¨áƒ•ით REINDEX INDEX \"%s\"." + +#: access/gin/ginutil.c:147 executor/execExpr.c:2191 utils/adt/arrayfuncs.c:4009 utils/adt/arrayfuncs.c:6705 utils/adt/rowtypes.c:974 +#, c-format +msgid "could not identify a comparison function for type %s" +msgstr "ტიპისთვის \"%s\" შედáƒáƒ áƒ”ბის ფუნქცირვერ ვიპáƒáƒ•ე" + +#: access/gin/ginvalidate.c:90 access/gist/gistvalidate.c:92 access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 +#, c-format +msgid "operator family \"%s\" of access method %s contains support function %s with different left and right input types" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ \"%s\" (წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“იდáƒáƒœ %s) შეიცáƒáƒ•ს მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფუნქციáƒáƒ¡ %s, რáƒáƒ›áƒ”ლსáƒáƒª სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რმáƒáƒ áƒªáƒ®áƒ”ნრდრმáƒáƒ áƒ¯áƒ•ენრშეყვáƒáƒœáƒ”ბი გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: access/gin/ginvalidate.c:258 +#, c-format +msgid "operator class \"%s\" of access method %s is missing support function %d or %d" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ \"%s\" (წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“იდáƒáƒœ %s) áƒáƒ™áƒšáƒ˜áƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფუნქირ%d áƒáƒœ %d" + +#: access/gin/ginvalidate.c:331 access/gist/gistvalidate.c:349 access/spgist/spgvalidate.c:387 +#, c-format +msgid "support function number %d is invalid for access method %s" +msgstr "მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფუნქცირნáƒáƒ›áƒ áƒ˜áƒ— %d áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის: %s" + +#: access/gist/gist.c:760 access/gist/gistvacuum.c:426 +#, c-format +msgid "index \"%s\" contains an inner tuple marked as invalid" +msgstr "ინდექსი (\"%s\") შეიცáƒáƒ•ს შიდრკáƒáƒ áƒ¢áƒ”ჟს, რáƒáƒ›áƒ”ლიც მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜áƒ, რáƒáƒ’áƒáƒ áƒª áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜" + +#: access/gist/gist.c:762 access/gist/gistvacuum.c:428 +#, c-format +msgid "This is caused by an incomplete page split at crash recovery before upgrading to PostgreSQL 9.1." +msgstr "გáƒáƒ›áƒáƒ¬áƒ•ეულირáƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ¡ áƒáƒ¦áƒ“გენისáƒáƒ¡ გვერდის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ დáƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒ’áƒáƒœ, PostgreSQL 9.1-მდე გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ›áƒ“ე." + +#: access/gist/gist.c:763 access/gist/gistutil.c:800 access/gist/gistutil.c:811 access/gist/gistvacuum.c:429 access/hash/hashutil.c:226 access/hash/hashutil.c:237 access/hash/hashutil.c:249 access/hash/hashutil.c:270 access/nbtree/nbtpage.c:813 access/nbtree/nbtpage.c:824 +#, c-format +msgid "Please REINDEX it." +msgstr "გáƒáƒ“áƒáƒáƒ¢áƒáƒ áƒ”თ REINDEX." + +#: access/gist/gist.c:1196 +#, c-format +msgid "fixing incomplete split in index \"%s\", block %u" +msgstr "ინდექსის (%s) áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ დáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ. ბლáƒáƒ™áƒ˜ %u" + +#: access/gist/gistsplit.c:446 +#, c-format +msgid "picksplit method for column %d of index \"%s\" failed" +msgstr "picksplit მეთáƒáƒ“ის შეცდáƒáƒ›áƒ სვეტისთვის %d ინდექსიდáƒáƒœ \"%s\"" + +#: access/gist/gistsplit.c:448 +#, c-format +msgid "The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command." +msgstr "ინდექსი áƒáƒžáƒ¢áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ áƒáƒ áƒáƒ. áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის დáƒáƒ£áƒ™áƒáƒ•შირდით დეველáƒáƒžáƒ”რს áƒáƒœ სცáƒáƒ“ეთ ეს სვეტი CREATE INDEX ბრძáƒáƒœáƒ”ბáƒáƒ¨áƒ˜, რáƒáƒ’áƒáƒ áƒª მეáƒáƒ áƒ”, ისე გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—." + +#: access/gist/gistutil.c:797 access/hash/hashutil.c:223 access/nbtree/nbtpage.c:810 +#, c-format +msgid "index \"%s\" contains unexpected zero page at block %u" +msgstr "ინდექსი \"%s\" ბლáƒáƒ™ %u-სთáƒáƒœ მáƒáƒ£áƒšáƒáƒ“ნელ ნულáƒáƒ•áƒáƒœ გვერდს შეიცáƒáƒ•ს" + +#: access/gist/gistutil.c:808 access/hash/hashutil.c:234 access/hash/hashutil.c:246 access/nbtree/nbtpage.c:821 +#, c-format +msgid "index \"%s\" contains corrupted page at block %u" +msgstr "ინდექსი \"%s\" შეიცáƒáƒ•ს გáƒáƒ¤áƒ£áƒ­áƒ”ბულ გვერდს ბლáƒáƒ™áƒ—áƒáƒœ %u" + +#: access/gist/gistvalidate.c:202 +#, c-format +msgid "operator family \"%s\" of access method %s contains unsupported ORDER BY specification for operator %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ \"%s\" (წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“იდáƒáƒœ %s) áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡áƒ—ვის %s მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელ ORDER BY-ის სპეფიციკáƒáƒªáƒ˜áƒáƒ¡ შეიცáƒáƒ•ს" + +#: access/gist/gistvalidate.c:213 +#, c-format +msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY opfamily specification for operator %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ \"%s\" (წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“იდáƒáƒœ %s) áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡áƒ—ვის %s áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  ORDER BY-ის სპეფიციკáƒáƒªáƒ˜áƒáƒ¡ შეიცáƒáƒ•ს" + +#: access/hash/hashfunc.c:277 access/hash/hashfunc.c:331 utils/adt/varchar.c:1008 utils/adt/varchar.c:1063 +#, c-format +msgid "could not determine which collation to use for string hashing" +msgstr "სტრიქáƒáƒœáƒ”ბის ჰეშირებისთვის სáƒáƒ­áƒ˜áƒ áƒ კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ áƒ™áƒ•ევრშეუძლებელიáƒ" + +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:332 catalog/heap.c:672 catalog/heap.c:678 commands/createas.c:201 commands/createas.c:510 commands/indexcmds.c:2045 commands/tablecmds.c:18071 commands/view.c:81 regex/regc_pg_locale.c:245 utils/adt/formatting.c:1653 utils/adt/formatting.c:1801 utils/adt/formatting.c:1991 utils/adt/like.c:189 utils/adt/like_support.c:1024 utils/adt/varchar.c:738 utils/adt/varchar.c:1009 utils/adt/varchar.c:1064 +#: utils/adt/varlena.c:1521 +#, c-format +msgid "Use the COLLATE clause to set the collation explicitly." +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ ხელით მისáƒáƒ—ითებლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ COLLATE." + +#: access/hash/hashinsert.c:84 +#, c-format +msgid "index row size %zu exceeds hash maximum %zu" +msgstr "ინდექსის მწკრივის ზáƒáƒ›áƒ %zu áƒáƒ­áƒáƒ áƒ‘ებს ჰეშის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ¡ %zu" + +#: access/hash/hashinsert.c:86 access/spgist/spgdoinsert.c:2005 access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1020 +#, c-format +msgid "Values larger than a buffer page cannot be indexed." +msgstr "ბáƒáƒ¤áƒ”რის გვერდზე დიდი მნიშვნელáƒáƒ‘ების დáƒáƒ˜áƒœáƒ“ექსებრშეუძლებელიáƒ." + +#: access/hash/hashovfl.c:88 +#, c-format +msgid "invalid overflow block number %u" +msgstr "გáƒáƒ“áƒáƒ•სებული ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი: \"%u\"" + +#: access/hash/hashovfl.c:284 access/hash/hashpage.c:454 +#, c-format +msgid "out of overflow pages in hash index \"%s\"" +msgstr "ჰეშ-ინდექსში \"%s\" გáƒáƒ“áƒáƒ•სების გვერდები სáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒ áƒáƒ" + +#: access/hash/hashsearch.c:311 +#, c-format +msgid "hash indexes do not support whole-index scans" +msgstr "ჰეშის ინდექსებს სრული ინდექსების სკáƒáƒœáƒ˜áƒ áƒ”ბის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—" + +#: access/hash/hashutil.c:262 +#, c-format +msgid "index \"%s\" is not a hash index" +msgstr "ინდექსი \"%s\" ჰეშ ინდექსი áƒáƒ áƒáƒ" + +#: access/hash/hashutil.c:268 +#, c-format +msgid "index \"%s\" has wrong hash version" +msgstr "ინდექსს \"%s\" ჰეშის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ვერსირáƒáƒ¥áƒ•ს" + +#: access/hash/hashvalidate.c:198 +#, c-format +msgid "operator family \"%s\" of access method %s lacks support function for operator %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ¡ \"%s\" (წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“იდáƒáƒœ \"%s\") áƒáƒ™áƒšáƒ˜áƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფუნქცირáƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡áƒ—ვის %s" + +#: access/hash/hashvalidate.c:256 access/nbtree/nbtvalidate.c:276 +#, c-format +msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ¡ \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ში %s ჯვáƒáƒ áƒ”დინი ტიპის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბი áƒáƒ™áƒšáƒ˜áƒ" + +#: access/heap/heapam.c:2194 +#, c-format +msgid "cannot insert tuples in a parallel worker" +msgstr "პáƒáƒ áƒáƒšáƒ”ლურ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სში კáƒáƒ áƒ¢áƒ”ჟებს ვერ ჩáƒáƒ¡áƒ•áƒáƒ›áƒ—" + +#: access/heap/heapam.c:2713 +#, c-format +msgid "cannot delete tuples during a parallel operation" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ კáƒáƒ áƒ¢áƒ”ჟის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: access/heap/heapam.c:2760 +#, c-format +msgid "attempted to delete invisible tuple" +msgstr "უხილáƒáƒ•ი კáƒáƒ áƒ¢áƒ”ჟის წáƒáƒ¨áƒšáƒ˜áƒ¡ მცდელáƒáƒ‘áƒ" + +#: access/heap/heapam.c:3208 access/heap/heapam.c:6081 +#, c-format +msgid "cannot update tuples during a parallel operation" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ კáƒáƒ áƒ¢áƒ”ჟის გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელიáƒ" + +#: access/heap/heapam.c:3336 +#, c-format +msgid "attempted to update invisible tuple" +msgstr "უხილáƒáƒ•ი კáƒáƒ áƒ¢áƒ”ჟის გáƒáƒœáƒáƒ®áƒšáƒ”ბის მცდელáƒáƒ‘áƒ" + +#: access/heap/heapam.c:4725 access/heap/heapam.c:4763 access/heap/heapam.c:5028 access/heap/heapam_handler.c:468 +#, c-format +msgid "could not obtain lock on row in relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ \"%s\" მწკრივის დáƒáƒ‘ლáƒáƒ™áƒ•ის შეცდáƒáƒ›áƒ" + +#: access/heap/heapam_handler.c:413 +#, c-format +msgid "tuple to be locked was already moved to another partition due to concurrent update" +msgstr "დáƒáƒ¡áƒáƒ‘ლáƒáƒ™áƒ˜ კáƒáƒ áƒ¢áƒ”ჟი პáƒáƒ áƒáƒšáƒ”ლური გáƒáƒœáƒáƒ®áƒšáƒ”ბის გáƒáƒ›áƒ უკვე სხვრდáƒáƒœáƒáƒ§áƒáƒ¤áƒ¨áƒ˜áƒ გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜" + +#: access/heap/hio.c:535 access/heap/rewriteheap.c:640 +#, c-format +msgid "row is too big: size %zu, maximum size %zu" +msgstr "მწკრივი ძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ: ზáƒáƒ›áƒ %zu, მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ზáƒáƒ›áƒáƒ %zu" + +#: access/heap/rewriteheap.c:885 +#, c-format +msgid "could not write to file \"%s\", wrote %d of %d: %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ. ჩáƒáƒ¬áƒ”რილირ%d %d-დáƒáƒœ: %m" + +#: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 access/transam/timeline.c:329 access/transam/timeline.c:481 access/transam/xlog.c:3249 access/transam/xlog.c:3440 access/transam/xlog.c:4277 access/transam/xlog.c:9199 access/transam/xlogfuncs.c:692 backup/basebackup_server.c:149 backup/basebackup_server.c:242 commands/dbcommands.c:494 postmaster/launch_backend.c:328 postmaster/postmaster.c:4112 postmaster/walsummarizer.c:1067 +#: replication/logical/origin.c:603 replication/slot.c:2059 storage/file/copydir.c:157 storage/smgr/md.c:230 utils/time/snapmgr.c:1234 +#, c-format +msgid "could not create file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %m" + +#: access/heap/rewriteheap.c:1104 +#, c-format +msgid "could not truncate file \"%s\" to %u: %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) %u-მდე მáƒáƒ™áƒ•ეთის შეცდáƒáƒ›áƒ: %m" + +#: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:498 access/transam/xlog.c:3299 access/transam/xlog.c:3496 access/transam/xlog.c:4289 commands/dbcommands.c:506 postmaster/launch_backend.c:339 postmaster/launch_backend.c:351 replication/logical/origin.c:615 replication/logical/origin.c:657 replication/logical/origin.c:676 replication/logical/snapbuild.c:1771 replication/slot.c:2094 +#: storage/file/buffile.c:545 storage/file/copydir.c:197 utils/init/miscinit.c:1601 utils/init/miscinit.c:1612 utils/init/miscinit.c:1620 utils/misc/guc.c:4441 utils/misc/guc.c:4472 utils/misc/guc.c:5625 utils/misc/guc.c:5643 utils/time/snapmgr.c:1239 utils/time/snapmgr.c:1246 +#, c-format +msgid "could not write to file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: access/heap/vacuumlazy.c:473 +#, c-format +msgid "aggressively vacuuming \"%s.%s.%s\"" +msgstr "áƒáƒ’რესიული დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრ\"%s.%s.%s\"" + +#: access/heap/vacuumlazy.c:478 +#, c-format +msgid "vacuuming \"%s.%s.%s\"" +msgstr "დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრ\"%s.%s.%s\"" + +#: access/heap/vacuumlazy.c:626 +#, c-format +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრდáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულირ\"%s.%s.%s\": დáƒáƒ¡áƒ™áƒáƒœáƒ”რებული ინდექსები: %d\n" + +#: access/heap/vacuumlazy.c:637 +#, c-format +msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" +msgstr "ჩáƒáƒªáƒ˜áƒ™áƒ•ლის თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ áƒáƒ’რესიული მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრცხრილისთვის \"%s.%s.%s\": ინდექსის სკáƒáƒœáƒ˜áƒ áƒ”ბის რიცხვი: %d\n" + +#: access/heap/vacuumlazy.c:639 +#, c-format +msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" +msgstr "ჩáƒáƒªáƒ˜áƒ™áƒ•ლის თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრცხრილისთვის \"%s.%s.%s\": ინდექსის სკáƒáƒœáƒ˜áƒ áƒ”ბის რიცხვი: %d\n" + +#: access/heap/vacuumlazy.c:644 +#, c-format +msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" +msgstr "ცხრილის (\"%s.%s.%s\") áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ áƒáƒ’რესიული მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ: %d\n" + +#: access/heap/vacuumlazy.c:646 +#, c-format +msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" +msgstr "ცხრილის (\"%s.%s.%s\") áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ: ინდექსების სკáƒáƒœáƒ˜áƒ áƒ”ბáƒ: %d\n" + +#: access/heap/vacuumlazy.c:653 +#, c-format +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" +msgstr "გვერდები: %u წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜, %u რჩებáƒ, %u დáƒáƒ¡áƒ™áƒáƒœáƒ”რებული (სულ %.2f%%)\n" + +#: access/heap/vacuumlazy.c:660 +#, c-format +msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" +msgstr "კáƒáƒ áƒ¢áƒ”ჟები: %lld წáƒáƒ˜áƒ¨áƒáƒšáƒ, %lld დáƒáƒ áƒ©áƒ, %lld მკვდáƒáƒ áƒ˜áƒ, მáƒáƒ’რáƒáƒ› ჯერ ვერ წáƒáƒ•შლი\n" + +#: access/heap/vacuumlazy.c:666 +#, c-format +msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" +msgstr "გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ების ბლáƒáƒ™áƒ˜áƒ áƒ”ბის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜áƒ¡ გáƒáƒ›áƒ გáƒáƒ›áƒáƒ¢áƒáƒ•ებული სტრიქáƒáƒœáƒ”ბის ვერსიები: %lld, %u გვერდიდáƒáƒœ\n" + +#: access/heap/vacuumlazy.c:672 +#, c-format +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "წáƒáƒ¨áƒšáƒáƒ“ი áƒáƒ›áƒáƒ­áƒ áƒ˜áƒšáƒ˜: %u, რáƒáƒ›áƒ”ლიც იყრ%d XID áƒáƒ¡áƒáƒ™áƒ˜áƒ¡, რáƒáƒªáƒ áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ\n" + +#: access/heap/vacuumlazy.c:679 +#, c-format +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "áƒáƒ®áƒáƒšáƒ˜ relfrozenxid: %u, რáƒáƒ›áƒ”ლიც წინრმნიშვნელáƒáƒ‘áƒáƒ–ე %d XID-ით წინáƒáƒ\n" + +#: access/heap/vacuumlazy.c:687 +#, c-format +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "áƒáƒ®áƒáƒšáƒ˜ relminmxid: %u, რáƒáƒ›áƒ”ლიც წინრმნიშვნელáƒáƒ‘áƒáƒ–ე %d MXID-ით წინáƒáƒ\n" + +#: access/heap/vacuumlazy.c:690 +#, c-format +msgid "frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n" +msgstr "გáƒáƒ§áƒ˜áƒœáƒ£áƒšáƒ˜ : %u გვერდს ცხრილიდáƒáƒœ (%.2f%% სრული რáƒáƒáƒ“ენáƒáƒ‘იდáƒáƒœ) %lld კáƒáƒ áƒ¢áƒ”ჟი áƒáƒ¥áƒ•ს გáƒáƒ§áƒ˜áƒœáƒ£áƒšáƒ˜\n" + +#: access/heap/vacuumlazy.c:698 +msgid "index scan not needed: " +msgstr "ინდექსების სკáƒáƒœáƒ˜áƒ áƒ”ბრსáƒáƒ­áƒ˜áƒ áƒ áƒáƒ áƒáƒ: " + +#: access/heap/vacuumlazy.c:700 +msgid "index scan needed: " +msgstr "ინდექსების სკáƒáƒœáƒ˜áƒ áƒ”ბრსáƒáƒ­áƒ˜áƒ áƒáƒ: " + +#: access/heap/vacuumlazy.c:702 +#, c-format +msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" +msgstr "ცხრილის %u გვერდიდáƒáƒœ (სულ %.2f%%) წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ %lld ჩáƒáƒœáƒáƒ¬áƒ”რის მკვდáƒáƒ áƒ˜ იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜\n" + +#: access/heap/vacuumlazy.c:707 +msgid "index scan bypassed: " +msgstr "სკáƒáƒœáƒ˜áƒ áƒ”ბისáƒáƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒ•ებული ინდექსები: " + +#: access/heap/vacuumlazy.c:709 +msgid "index scan bypassed by failsafe: " +msgstr "სკáƒáƒœáƒ˜áƒ áƒ”ბისáƒáƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის გáƒáƒ›áƒ გáƒáƒ›áƒáƒ¢áƒáƒ•ებული ინდექსები: " + +#: access/heap/vacuumlazy.c:711 +#, c-format +msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" +msgstr "ცხრილის %u გვერდზე (სულ %.2f%%) ნáƒáƒžáƒáƒ•ნირ%lld ჩáƒáƒœáƒáƒ¬áƒ”რის მკვდáƒáƒ áƒ˜ იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜\n" + +#: access/heap/vacuumlazy.c:726 +#, c-format +msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" +msgstr "ინდექსი \"%s\": გვერდები: %u ჯáƒáƒ›áƒ¨áƒ˜ %u áƒáƒ®áƒšáƒáƒ“ წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜, %u áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜, %u მრáƒáƒ•áƒáƒšáƒ¯áƒ”რáƒáƒ“ი\n" + +#: access/heap/vacuumlazy.c:738 commands/analyze.c:789 +#, c-format +msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" +msgstr "I/O დრáƒáƒ”ბი: კითხვáƒ: %.3f მწმ, ჩáƒáƒ¬áƒ”რáƒ: %.3f მწმ\n" + +#: access/heap/vacuumlazy.c:748 commands/analyze.c:792 +#, c-format +msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" +msgstr "კითხვის სáƒáƒ¨. სიჩქáƒáƒ áƒ”: %.3f მბ/წმ, ჩáƒáƒ¬áƒ”რის სáƒáƒ¨. სიჩქáƒáƒ áƒ”: %.3f მბ/წმ\n" + +#: access/heap/vacuumlazy.c:751 commands/analyze.c:794 +#, c-format +msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgstr "ბáƒáƒ¤áƒ”რის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ: %lld მáƒáƒ®áƒ•ედრáƒ, %lld áƒáƒªáƒ“ენáƒ, %lld ტურტლიáƒáƒœáƒ˜\n" + +#: access/heap/vacuumlazy.c:756 +#, c-format +msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" +msgstr "WAL გáƒáƒ›áƒáƒ§áƒ”ნებáƒ: %lld ჩáƒáƒœáƒáƒ¬áƒ”რი, %lld სრული გვერდის áƒáƒ¡áƒšáƒ˜, %llu ბáƒáƒ˜áƒ¢áƒ˜\n" + +#: access/heap/vacuumlazy.c:760 commands/analyze.c:798 +#, c-format +msgid "system usage: %s" +msgstr "სისტემური გáƒáƒ›áƒáƒ§áƒ”ნებáƒ: %s" + +#: access/heap/vacuumlazy.c:2172 +#, c-format +msgid "table \"%s\": removed %lld dead item identifiers in %u pages" +msgstr "ცხრილი \"%s\": წáƒáƒ˜áƒ¨áƒáƒšáƒ %lld მკვდáƒáƒ áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ %u გვერდზე" + +#: access/heap/vacuumlazy.c:2326 +#, c-format +msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" +msgstr "ცხრილის \"%s.%s.%s\" უმნიშვნელრáƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒ•ებრდáƒáƒªáƒ•ის მიზნით %d ინდექსის სკáƒáƒœáƒ˜áƒ áƒ”ბის შემდეგ" + +#: access/heap/vacuumlazy.c:2329 +#, c-format +msgid "The table's relfrozenxid or relminmxid is too far in the past." +msgstr "ცხრილის relfrozenxid -ის დრrelminmxid -ის მნიშვნელáƒáƒ‘ები ძáƒáƒšáƒ˜áƒáƒœ უკáƒáƒœáƒáƒ წáƒáƒ áƒ¨áƒ£áƒšáƒ¨áƒ˜." + +#: access/heap/vacuumlazy.c:2330 +#, c-format +msgid "" +"Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" +"You might also need to consider other ways for VACUUM to keep up with the allocation of transaction IDs." +msgstr "" +"მხედველáƒáƒ‘áƒáƒ¨áƒ˜ იქáƒáƒœáƒ˜áƒ”თ, რáƒáƒ› სáƒáƒ­áƒ˜áƒ áƒáƒ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის \"maintenance_work_mem\" áƒáƒœ \"autovacuum_work_mem\" გáƒáƒ–რდáƒ.\n" +"áƒáƒ¡áƒ”ვე შეიძლებრდáƒáƒ’ჭირდეთ გáƒáƒœáƒ˜áƒ®áƒ˜áƒšáƒáƒ— მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის სხვრგზები, რáƒáƒ› დáƒáƒ”წიáƒáƒ— ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ”ბის ID-ების გáƒáƒ›áƒáƒ§áƒáƒ¤áƒáƒ¡." + +#: access/heap/vacuumlazy.c:2592 +#, c-format +msgid "\"%s\": stopping truncate due to conflicting lock request" +msgstr "%s: წáƒáƒ™áƒ•ეთის შეჩერებრბლáƒáƒ™áƒ˜áƒ áƒ”ბის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ£áƒ áƒ˜ მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ›áƒ" + +#: access/heap/vacuumlazy.c:2662 +#, c-format +msgid "table \"%s\": truncated %u to %u pages" +msgstr "ცხრილი \"%s\": წáƒáƒ˜áƒ™áƒ•ეთრ%u-დáƒáƒœ %u გვერდზე" + +#: access/heap/vacuumlazy.c:2724 +#, c-format +msgid "table \"%s\": suspending truncate due to conflicting lock request" +msgstr "ცხრილი %s: წáƒáƒ™áƒ•ეთის შეჩერებრბლáƒáƒ™áƒ˜áƒ áƒ”ბის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ£áƒ áƒ˜ მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ›áƒ" + +#: access/heap/vacuumlazy.c:2843 +#, c-format +msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" +msgstr "%s-ზე პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის გáƒáƒ›áƒáƒ áƒ—ვრ--- დრáƒáƒ”ბითი ცხრილების პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრშეუძლებელიáƒ" + +#: access/heap/vacuumlazy.c:3113 +#, c-format +msgid "while scanning block %u offset %u of relation \"%s.%s\"" +msgstr "ურთიერთáƒáƒ‘ის(%3$s.%4$s) წáƒáƒœáƒáƒªáƒ•ლების(%2$u) ბლáƒáƒ™áƒ˜áƒ¡(%1$u) სკáƒáƒœáƒ˜áƒ áƒ”ბისáƒáƒ¡" + +#: access/heap/vacuumlazy.c:3116 +#, c-format +msgid "while scanning block %u of relation \"%s.%s\"" +msgstr "%u ბლáƒáƒ™áƒ˜áƒ¡ (ურთიერთáƒáƒ‘ის %s.%s) სკáƒáƒœáƒ˜áƒ áƒ”ბისáƒáƒ¡" + +#: access/heap/vacuumlazy.c:3120 +#, c-format +msgid "while scanning relation \"%s.%s\"" +msgstr "ურთიერთáƒáƒ‘ის სკáƒáƒœáƒ˜áƒ áƒ”ბისáƒáƒ¡ \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3128 +#, c-format +msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ %u, წáƒáƒœáƒáƒªáƒ•ლებრ%u (ურთიერთáƒáƒ‘ის \"%s.%s\") მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისáƒáƒ¡" + +#: access/heap/vacuumlazy.c:3131 +#, c-format +msgid "while vacuuming block %u of relation \"%s.%s\"" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ (%u) მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისáƒáƒ¡ (ურთიერთáƒáƒ‘იდáƒáƒœ \"%s.%s\")" + +#: access/heap/vacuumlazy.c:3135 +#, c-format +msgid "while vacuuming relation \"%s.%s\"" +msgstr "ურთერთáƒáƒ‘ის დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისáƒáƒ¡ \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3140 commands/vacuumparallel.c:1113 +#, c-format +msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" +msgstr "ინდექსის (%s) მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისáƒáƒ¡ (ურთიერთáƒáƒ‘იდáƒáƒœ \"%s.%s\")" + +#: access/heap/vacuumlazy.c:3145 commands/vacuumparallel.c:1119 +#, c-format +msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" +msgstr "ინდექსის \"%s\" მáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებისáƒáƒ¡, რáƒáƒ›áƒ”ლიც ეკუთვნის ურთიერთáƒáƒ‘áƒáƒ¡ \"%s.%s\"" + +#: access/heap/vacuumlazy.c:3151 +#, c-format +msgid "while truncating relation \"%s.%s\" to %u blocks" +msgstr "ურთიერთáƒáƒ‘ის \"%s.%s\" %u ბლáƒáƒ™áƒáƒ›áƒ“ე მáƒáƒ™áƒ•ეთისáƒáƒ¡" + +#: access/index/amapi.c:83 commands/amcmds.c:143 +#, c-format +msgid "access method \"%s\" is not of type %s" +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ი \"%s\" áƒáƒ  áƒáƒ áƒ˜áƒ¡ ტიპის %s" + +#: access/index/amapi.c:99 +#, c-format +msgid "index access method \"%s\" does not have a handler" +msgstr "ინდექსის წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ს \"%s\" დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი áƒáƒ  áƒáƒ¥áƒ•ს" + +#: access/index/genam.c:487 +#, c-format +msgid "transaction aborted during system catalog scan" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ გáƒáƒ£áƒ¥áƒ›áƒ“რსისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ის სკáƒáƒœáƒ˜áƒ áƒ”ბისáƒáƒ¡" + +#: access/index/genam.c:655 access/index/indexam.c:82 +#, c-format +msgid "cannot access index \"%s\" while it is being reindexed" +msgstr "ინდექსთáƒáƒœ \"%s\" წვდáƒáƒ›áƒ მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ მისი რეინდექსი მიმდინáƒáƒ áƒ”áƒáƒ‘ს, შეუძლებელიáƒ" + +#: access/index/indexam.c:203 catalog/objectaddress.c:1356 commands/indexcmds.c:2873 commands/tablecmds.c:281 commands/tablecmds.c:305 commands/tablecmds.c:17766 commands/tablecmds.c:19584 +#, c-format +msgid "\"%s\" is not an index" +msgstr "\"%s\" ინდექსი áƒáƒ áƒáƒ" + +#: access/index/indexam.c:1028 +#, c-format +msgid "operator class %s has no options" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ¡ %s პáƒáƒ áƒáƒ›áƒ”ტრები áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: access/nbtree/nbtinsert.c:668 +#, c-format +msgid "duplicate key value violates unique constraint \"%s\"" +msgstr "დუბლირებული გáƒáƒ¡áƒáƒ¦áƒ”ბის მნიშვნელáƒáƒ‘რáƒáƒ áƒ¦áƒ•ევს უნიკáƒáƒšáƒ£áƒ  შეზღუდვáƒáƒ¡ \"%s\"" + +#: access/nbtree/nbtinsert.c:670 +#, c-format +msgid "Key %s already exists." +msgstr "გáƒáƒ¡áƒáƒ¦áƒ”ბი უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s." + +#: access/nbtree/nbtinsert.c:764 +#, c-format +msgid "This may be because of a non-immutable index expression." +msgstr "შეიძლებa ინდექსის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის შეცვლáƒáƒ“áƒáƒ‘ის ბრáƒáƒšáƒ˜ იყáƒáƒ¡." + +#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 parser/parse_utilcmd.c:2298 +#, c-format +msgid "index \"%s\" is not a btree" +msgstr "ინდექსი \"%s\" áƒáƒ áƒáƒ‘ითი ხე áƒáƒ áƒáƒ" + +#: access/nbtree/nbtpage.c:164 access/nbtree/nbtpage.c:618 +#, c-format +msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" +msgstr "შეუთáƒáƒ•სებელი ვერსირინდექსში \"%s\": ფáƒáƒ˜áƒšáƒ˜áƒ¡ ვერსირ%d, მიმდინáƒáƒ áƒ” ვერსირ%d, მინიმáƒáƒšáƒ£áƒ  მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი ვერსირ%d" + +#: access/nbtree/nbtpage.c:1861 +#, c-format +msgid "index \"%s\" contains a half-dead internal page" +msgstr "ინდექსი (\"%s\") ნáƒáƒ®áƒ”ვრáƒáƒ“ მკვდáƒáƒ  შიდრგვერდს შეიცáƒáƒ•ს" + +#: access/nbtree/nbtpage.c:1863 +#, c-format +msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." +msgstr "შესáƒáƒ«áƒšáƒ”ბელირგáƒáƒ›áƒáƒ¬áƒ•ეული იყáƒáƒ¡ შეწყვეტილი მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის მიერ 9.3 áƒáƒœ უფრრძველ ვერსიáƒáƒ¨áƒ˜. გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ›áƒ“ე სáƒáƒ­áƒ˜áƒ áƒáƒ REINDEX-ის გáƒáƒ“áƒáƒ¢áƒáƒ áƒ”ბáƒ." + +#: access/nbtree/nbtutils.c:5112 +#, c-format +msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" +msgstr "ინდექსის სტრიქáƒáƒœáƒ˜áƒ¡ ზáƒáƒ›áƒ %zu btree-ის ვერსიის (%u) მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ  (%zu) მნიშვნელáƒáƒ‘áƒáƒ–ე მეტიáƒ, ინდექსისთვის \"%s\"" + +#: access/nbtree/nbtutils.c:5118 +#, c-format +msgid "Index row references tuple (%u,%u) in relation \"%s\"." +msgstr "ინდექსის მწკრივები გáƒáƒ“áƒáƒ‘მულირკáƒáƒ áƒ¢áƒ”ჟზე (%u, %u) ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ \"%s\"." + +#: access/nbtree/nbtutils.c:5122 +#, c-format +msgid "" +"Values larger than 1/3 of a buffer page cannot be indexed.\n" +"Consider a function index of an MD5 hash of the value, or use full text indexing." +msgstr "" +"ბუფერის გვერდის 1/3-ზე მეტი მნიშვნელáƒáƒ‘ების ინდექსირებრშეუძლებელიáƒ.\n" +"სჯáƒáƒ‘ს დáƒáƒáƒ§áƒ”ნáƒáƒ— áƒáƒ› მნიშვნელáƒáƒ‘ის MD5 ჰეშის ფუნქციის ინდექსი áƒáƒœ სრული ტექსტური ინდექსირებრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: access/nbtree/nbtvalidate.c:246 +#, c-format +msgid "operator family \"%s\" of access method %s is missing support function for types %s and %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ის %s áƒáƒ™áƒšáƒ˜áƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფუნქცირტიპებისთვის %s დრ%s" + +#: access/sequence/sequence.c:75 access/table/table.c:145 optimizer/util/plancat.c:143 +#, c-format +msgid "cannot open relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘ის (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ" + +#: access/spgist/spgutils.c:245 +#, c-format +msgid "compress method must be defined when leaf type is different from input type" +msgstr "რáƒáƒ“ესáƒáƒª ფáƒáƒ—ლის ტიპი შეყვáƒáƒœáƒ˜áƒ¡ ტიპისგáƒáƒœ გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•დებáƒ, შეკუმშვის მეთáƒáƒ“ის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: access/spgist/spgutils.c:1017 +#, c-format +msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" +msgstr "SP-GiST-ის შიდრკáƒáƒ áƒ¢áƒ”ჟის ზáƒáƒ›áƒ%zu მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ¡ %zu áƒáƒ­áƒáƒ áƒ‘ებს" + +#: access/spgist/spgvalidate.c:136 +#, c-format +msgid "SP-GiST leaf data type %s does not match declared type %s" +msgstr "SP-GiST ფáƒáƒ—ლის მáƒáƒœáƒáƒªáƒ”მების ტიპი %s áƒáƒ  ემთხვევრáƒáƒ¦áƒ¬áƒ”რილ ტიპს: %s" + +#: access/spgist/spgvalidate.c:302 +#, c-format +msgid "operator family \"%s\" of access method %s is missing support function %d for type %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ¡ \"%s\" ( წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისგáƒáƒœ \"%s\") áƒáƒ™áƒšáƒ˜áƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფუნქცირ(%d) ტიპისთვის: %s" + +#: access/table/tableam.c:255 +#, c-format +msgid "tid (%u, %u) is not valid for relation \"%s\"" +msgstr "კáƒáƒ áƒ¢áƒ”ჟის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ (%u, %u) áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ ურთიერთáƒáƒ‘ისთვის: \"%s\"" + +#: access/table/tableamapi.c:109 +#, c-format +msgid "\"%s\" cannot be empty." +msgstr "\"%s\" ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  შეიძლებრიყáƒáƒ¡." + +#: access/table/tableamapi.c:116 access/transam/xlogrecovery.c:4858 +#, c-format +msgid "\"%s\" is too long (maximum %d characters)." +msgstr "\"%s\" ძáƒáƒšáƒ˜áƒáƒœ გრძელირ(მáƒáƒ¥áƒ¡ %d სიმბáƒáƒšáƒ)" + +#: access/table/tableamapi.c:139 +#, c-format +msgid "table access method \"%s\" does not exist" +msgstr "ცხრილის წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: access/table/tableamapi.c:144 +#, c-format +msgid "Table access method \"%s\" does not exist." +msgstr "ცხრილის წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს." + +#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:151 +#, c-format +msgid "sample percentage must be between 0 and 100" +msgstr "უბრáƒáƒšáƒ პრáƒáƒªáƒ”ნტის დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ 0-100" + +#: access/transam/commit_ts.c:287 +#, c-format +msgid "cannot retrieve commit timestamp for transaction %u" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ (%u) გáƒáƒ“áƒáƒªáƒ”მის დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜áƒ¡ მიღების შეცდáƒáƒ›áƒ" + +#: access/transam/commit_ts.c:385 +#, c-format +msgid "could not get commit timestamp data" +msgstr "მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒªáƒ”მის დრáƒáƒ˜áƒ¡ მიღების შეცდáƒáƒ›áƒ" + +#: access/transam/commit_ts.c:387 +#, c-format +msgid "Make sure the configuration parameter \"%s\" is set on the primary server." +msgstr "დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ“ით, რáƒáƒ› ძირითáƒáƒ“ სერვერზე კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" დáƒáƒ§áƒ”ნებულიáƒ." + +#: access/transam/commit_ts.c:389 +#, c-format +msgid "Make sure the configuration parameter \"%s\" is set." +msgstr "დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ“ით, რáƒáƒ› კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" დáƒáƒ§áƒ”ნებულიáƒ." + +#: access/transam/multixact.c:1050 +#, c-format +msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database \"%s\"" +msgstr "ბáƒáƒ–áƒáƒ¨áƒ˜ (\"%s\") მáƒáƒœáƒáƒªáƒ”მების ჩáƒáƒªáƒ˜áƒ™áƒ•ლის თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რბრძáƒáƒœáƒ”ბებს, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ®áƒáƒš მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბს áƒáƒœáƒ˜áƒ­áƒ”ბენ, áƒáƒ  იღებს" + +#: access/transam/multixact.c:1052 access/transam/multixact.c:1059 access/transam/multixact.c:1083 access/transam/multixact.c:1092 access/transam/varsup.c:158 access/transam/varsup.c:165 +#, c-format +msgid "" +"Execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"გáƒáƒ£áƒ¨áƒ•ით მთელი ბáƒáƒ–ის მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ.\n" +"áƒáƒ¡áƒ”ვე შეიძლებრდáƒáƒ’ჭირდეთ ძველი მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის გáƒáƒ“áƒáƒªáƒ”მრáƒáƒœ გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ, áƒáƒœ წáƒáƒ¨áƒáƒšáƒ”თ გáƒáƒ­áƒ”დილი რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბი." + +#: access/transam/multixact.c:1057 +#, c-format +msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database with OID %u" +msgstr "ბáƒáƒ–áƒáƒ¨áƒ˜ (OID-ით \"%u\") მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რბრძáƒáƒœáƒ”ბებს, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ®áƒáƒš მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბს áƒáƒœáƒ˜áƒ­áƒ”ბენ, áƒáƒ  იღებს" + +#: access/transam/multixact.c:1078 access/transam/multixact.c:2433 +#, c-format +msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" +msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" +msgstr[0] "კიდევ %2$u მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ ბáƒáƒ–ის (%1$s) მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒáƒ სáƒáƒ­áƒ˜áƒ áƒ" +msgstr[1] "კიდევ %2$u მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ ბáƒáƒ–ის (%1$s) მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒáƒ სáƒáƒ­áƒ˜áƒ áƒ" + +#: access/transam/multixact.c:1087 access/transam/multixact.c:2442 +#, c-format +msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" +msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" +msgstr[0] "კიდევ %2$u მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ OID-ი %1$u -ის მქáƒáƒœáƒ” ბáƒáƒ–რჯერ უნდრდáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ“ეს" +msgstr[1] "კიდევ %2$u მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ OID-ი %1$u -ის მქáƒáƒœáƒ” ბáƒáƒ–რჯერ უნდრდáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ“ეს" + +#: access/transam/multixact.c:1148 +#, c-format +msgid "multixact \"members\" limit exceeded" +msgstr "მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ£áƒšáƒ˜ \"წევრების\" ლიმიტი გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულიáƒ" + +#: access/transam/multixact.c:1149 +#, c-format +msgid "This command would create a multixact with %u members, but the remaining space is only enough for %u member." +msgid_plural "This command would create a multixact with %u members, but the remaining space is only enough for %u members." +msgstr[0] "ბრძáƒáƒœáƒ”ბრკი შექმნიდრ%u-წევრიáƒáƒœ მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¡, მáƒáƒ’რáƒáƒ› დáƒáƒ áƒ©áƒ”ნილი áƒáƒ“გილი მხáƒáƒšáƒáƒ“ %u წევრს ეყáƒáƒ¤áƒ." +msgstr[1] "ბრძáƒáƒœáƒ”ბრკი შექმნიდრ%u-წევრიáƒáƒœ მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¡, მáƒáƒ’რáƒáƒ› დáƒáƒ áƒ©áƒ”ნილი áƒáƒ“გილი მხáƒáƒšáƒáƒ“ %u წევრს ეყáƒáƒ¤áƒ." + +#: access/transam/multixact.c:1154 +#, c-format +msgid "Execute a database-wide VACUUM in database with OID %u with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." +msgstr "მთელ ბáƒáƒ–áƒáƒ–ე მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის შესრულებრბáƒáƒ–áƒáƒ¨áƒ˜ OID-ით %u შემცირებული \"vacuum_multixact_freeze_min_age\" დრ\"vacuum_multixact_freeze_table_age\" პáƒáƒ áƒáƒ›áƒ”ტრებით." + +#: access/transam/multixact.c:1185 +#, c-format +msgid "database with OID %u must be vacuumed before %d more multixact member is used" +msgid_plural "database with OID %u must be vacuumed before %d more multixact members are used" +msgstr[0] "ბáƒáƒ–რOID-ით %u უნდრმáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ“ეს მáƒáƒœáƒáƒ›áƒ“ე, სáƒáƒœáƒáƒ› კიდევ %d მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ£áƒšáƒ˜ წევრი იქნებრგáƒáƒ›áƒáƒ§áƒ”ნებული" +msgstr[1] "ბáƒáƒ–რOID-ით %u უნდრმáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ“ეს მáƒáƒœáƒáƒ›áƒ“ე, სáƒáƒœáƒáƒ› კიდევ %d მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ£áƒšáƒ˜ წევრი იქნებრგáƒáƒ›áƒáƒ§áƒ”ნებული" + +#: access/transam/multixact.c:1190 +#, c-format +msgid "Execute a database-wide VACUUM in that database with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." +msgstr "მთელ ბáƒáƒ–áƒáƒ–ე მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის შესრულებრმითითებულ ბáƒáƒ–áƒáƒ¨áƒ˜ შემცირებული \"vacuum_multixact_freeze_min_age\" დრ\"vacuum_multixact_freeze_table_age\" პáƒáƒ áƒáƒ›áƒ”ტრებით." + +#: access/transam/multixact.c:1330 +#, c-format +msgid "MultiXactId %u does no longer exist -- apparent wraparound" +msgstr "MultiXactId %u áƒáƒ¦áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს - áƒáƒ¨áƒ™áƒáƒ áƒ გáƒáƒ“áƒáƒ¢áƒáƒœáƒ" + +#: access/transam/multixact.c:1336 +#, c-format +msgid "MultiXactId %u has not been created yet -- apparent wraparound" +msgstr "MultiXactId %u ჯერ áƒáƒ  áƒáƒ áƒ˜áƒ¡ შექმნილი - áƒáƒ¨áƒ™áƒáƒ áƒ გáƒáƒ“áƒáƒ¢áƒáƒœáƒ" + +#: access/transam/multixact.c:2438 access/transam/multixact.c:2447 +#, c-format +msgid "" +"To avoid MultiXactId assignment failures, execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის მინიჭებების თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ გáƒáƒ£áƒ¨áƒ•ით VACUUM მთელ ბáƒáƒ–áƒáƒ–ე იმ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ისთვის.\n" +"შეიძლებáƒ, áƒáƒ¡áƒ”ვე, დáƒáƒ’ჭირდეთ ძველი მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის კáƒáƒ›áƒ˜áƒ¢áƒ˜ áƒáƒœ დáƒáƒ‘რუნებáƒ, áƒáƒœ გáƒáƒ›áƒáƒ£áƒ§áƒ”ნებელი რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის წáƒáƒ¨áƒšáƒ." + +#: access/transam/multixact.c:2726 +#, c-format +msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" +msgstr "მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ£áƒšáƒ˜ წევრის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ დáƒáƒªáƒ•ის ფუნქციები გáƒáƒ—იშულიáƒ, რáƒáƒ“გáƒáƒœ უძველესი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის მქáƒáƒœáƒ” მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ %u დისკზე áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: access/transam/multixact.c:2748 +#, c-format +msgid "MultiXact member wraparound protections are now enabled" +msgstr "მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის ჩáƒáƒªáƒ˜áƒ™áƒ•ლისგáƒáƒœ დáƒáƒªáƒ•ის მექáƒáƒœáƒ˜áƒ–მები áƒáƒ®áƒšáƒ ჩáƒáƒ áƒ—ულიáƒ" + +#: access/transam/multixact.c:3138 +#, c-format +msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" +msgstr "უძველესი მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ %u ვერ ვიპáƒáƒ•ე. უáƒáƒ®áƒšáƒ”სი მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ %u. წáƒáƒ™áƒ•ეთრგáƒáƒ›áƒáƒ¢áƒáƒ•ებული იქნებáƒ" + +#: access/transam/multixact.c:3156 +#, c-format +msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" +msgstr "მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ›áƒ“ე %u მáƒáƒ™áƒ•ეთრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ ის დისკზე áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. მáƒáƒ™áƒ•ეთრგáƒáƒ›áƒáƒ¢áƒáƒ•ებული იქნებáƒ" + +#: access/transam/multixact.c:3475 +#, c-format +msgid "invalid MultiXactId: %u" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ MultiXactId: %u" + +#: access/transam/parallel.c:731 access/transam/parallel.c:850 +#, c-format +msgid "parallel worker failed to initialize" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: access/transam/parallel.c:732 access/transam/parallel.c:851 +#, c-format +msgid "More details may be available in the server log." +msgstr "მეტი დეტáƒáƒšáƒ”ბი შეიძლებრსერვერის ჟურნáƒáƒšáƒ¨áƒ˜ იყáƒáƒ¡ ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜." + +#: access/transam/parallel.c:912 +#, c-format +msgid "postmaster exited during a parallel transaction" +msgstr "postmaster-ი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რპáƒáƒ áƒáƒšáƒ”ლური ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡" + +#: access/transam/parallel.c:1099 +#, c-format +msgid "lost connection to parallel worker" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სთáƒáƒœ კáƒáƒ•შირი დáƒáƒ™áƒáƒ áƒ’ულიáƒ" + +#: access/transam/parallel.c:1155 access/transam/parallel.c:1157 +msgid "parallel worker" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი" + +#: access/transam/parallel.c:1327 replication/logical/applyparallelworker.c:890 +#, c-format +msgid "could not map dynamic shared memory segment" +msgstr "დინáƒáƒ›áƒ˜áƒ£áƒ áƒ˜ გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების სეგმენტის მიბმის შეცდáƒáƒ›áƒ" + +#: access/transam/parallel.c:1332 replication/logical/applyparallelworker.c:896 +#, c-format +msgid "invalid magic number in dynamic shared memory segment" +msgstr "დინáƒáƒ›áƒ˜áƒ£áƒ áƒ˜ გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების სეგმენტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ’იური რიცხვი" + +#: access/transam/rmgr.c:93 +#, c-format +msgid "resource manager with ID %d not registered" +msgstr "რესურსის მმáƒáƒ áƒ—ველი ID-ით %d რეგისტრირებული áƒáƒ áƒáƒ" + +#: access/transam/rmgr.c:94 +#, c-format +msgid "Include the extension module that implements this resource manager in \"shared_preload_libraries\"." +msgstr "áƒáƒ¡áƒ”ვე ჩáƒáƒ˜áƒ áƒ—ვებრგáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის მáƒáƒ“ული, რáƒáƒ›áƒ”ლიც áƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებს რესურსის áƒáƒ› მმáƒáƒ áƒ—ველს \"shared_preload_libraries\"-ში." + +#: access/transam/rmgr.c:110 +#, c-format +msgid "custom resource manager name is invalid" +msgstr "რესურსების ხელით მითითებული მმáƒáƒ áƒ—ველის სáƒáƒ®áƒ”ლი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: access/transam/rmgr.c:111 +#, c-format +msgid "Provide a non-empty name for the custom resource manager." +msgstr "მიუთითეთ რესურსების ხელით მითითებული მმáƒáƒ áƒ—ველის áƒáƒ áƒáƒªáƒáƒ áƒ˜áƒ”ლი სáƒáƒ®áƒ”ლი." + +#: access/transam/rmgr.c:114 +#, c-format +msgid "custom resource manager ID %d is out of range" +msgstr "რესურსების ხელით მითითებული მმáƒáƒ áƒ—ველის ID %d დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: access/transam/rmgr.c:115 +#, c-format +msgid "Provide a custom resource manager ID between %d and %d." +msgstr "შეიყვáƒáƒœáƒ”თ რესურსების ხელით მითითებული მმáƒáƒ áƒ—ველის %d-დáƒáƒœ %d-მდე დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ“áƒáƒœ." + +#: access/transam/rmgr.c:120 access/transam/rmgr.c:125 access/transam/rmgr.c:137 +#, c-format +msgid "failed to register custom resource manager \"%s\" with ID %d" +msgstr "ვერ დáƒáƒ áƒ”გისტრირდრმáƒáƒ áƒ’ებული რესურსების მენეჯერი \"%s\" ID %d" + +#: access/transam/rmgr.c:121 +#, c-format +msgid "Custom resource manager must be registered while initializing modules in \"shared_preload_libraries\"." +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის რესურსების მმáƒáƒ áƒ—ველის რეგისტრáƒáƒªáƒ˜áƒ \"shared_preload_libraries\"-ში მáƒáƒ“ულების ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡ უნდრმáƒáƒ®áƒ“ეს." + +#: access/transam/rmgr.c:126 +#, c-format +msgid "Custom resource manager \"%s\" already registered with the same ID." +msgstr "მáƒáƒ áƒ’ებული რესურსების მმáƒáƒ áƒ—ველი \"%s\" უკვე რეგისტრირებულიáƒ, იგივე ID-ით." + +#: access/transam/rmgr.c:138 +#, c-format +msgid "Existing resource manager with ID %d has the same name." +msgstr "რესურსის მმáƒáƒ áƒ—ველს ID-ით %d იგივე სáƒáƒ®áƒ”ლი áƒáƒ¥áƒ•ს." + +#: access/transam/rmgr.c:144 +#, c-format +msgid "registered custom resource manager \"%s\" with ID %d" +msgstr "რეგისტრირებულირმáƒáƒ áƒ’ებული რესურსის მმáƒáƒ áƒ—ველი \"%s\" ID-ით %d" + +#: access/transam/slru.c:346 +#, c-format +msgid "\"%s\" must be a multiple of %d" +msgstr "\"%s\" %d-ის ნáƒáƒ›áƒ áƒáƒ•ლი უნდრიყáƒáƒ¡" + +#: access/transam/slru.c:815 +#, c-format +msgid "file \"%s\" doesn't exist, reading as zeroes" +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. წáƒáƒ™áƒ˜áƒ—ხული იქნებáƒ, რáƒáƒ’áƒáƒ áƒª ნულებ" + +#: access/transam/slru.c:1044 access/transam/slru.c:1050 access/transam/slru.c:1058 access/transam/slru.c:1063 access/transam/slru.c:1070 access/transam/slru.c:1075 access/transam/slru.c:1082 access/transam/slru.c:1089 +#, c-format +msgid "could not access status of transaction %u" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ %u სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: access/transam/slru.c:1045 +#, c-format +msgid "Could not open file \"%s\": %m." +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m." + +#: access/transam/slru.c:1051 +#, c-format +msgid "Could not seek in file \"%s\" to offset %d: %m." +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" წáƒáƒœáƒáƒªáƒ•ლებáƒáƒ–ე %d გáƒáƒ“áƒáƒ®áƒ•ევის შეცდáƒáƒ›áƒ: %m." + +#: access/transam/slru.c:1059 +#, c-format +msgid "Could not read from file \"%s\" at offset %d: %m." +msgstr "კითხვის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ \"%s\" წáƒáƒœáƒáƒªáƒ•ლებáƒáƒ¡áƒ—áƒáƒœ %d: %m." + +#: access/transam/slru.c:1064 +#, c-format +msgid "Could not read from file \"%s\" at offset %d: read too few bytes." +msgstr "კითხვის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ \"%s\" წáƒáƒœáƒáƒªáƒ•ლებáƒáƒ¡áƒ—áƒáƒœ %d: ყველრბáƒáƒ˜áƒ¢áƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ." + +#: access/transam/slru.c:1071 +#, c-format +msgid "Could not write to file \"%s\" at offset %d: %m." +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ წáƒáƒœáƒáƒªáƒ•ლებáƒáƒ¡áƒ—áƒáƒœ %d: %m." + +#: access/transam/slru.c:1076 +#, c-format +msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ წáƒáƒœáƒáƒªáƒ•ლებáƒáƒ¡áƒ—áƒáƒœ %d: ყველრბáƒáƒ˜áƒ¢áƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ." + +#: access/transam/slru.c:1083 +#, c-format +msgid "Could not fsync file \"%s\": %m." +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m." + +#: access/transam/slru.c:1090 +#, c-format +msgid "Could not close file \"%s\": %m." +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m." + +#: access/transam/slru.c:1416 +#, c-format +msgid "could not truncate directory \"%s\": apparent wraparound" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ების შეცდáƒáƒ›áƒ: \"%s\" áƒáƒ¨áƒ™áƒáƒ áƒ ჩáƒáƒªáƒ˜áƒ™áƒ•ლáƒ" + +#: access/transam/timeline.c:163 access/transam/timeline.c:168 +#, c-format +msgid "syntax error in history file: %s" +msgstr "სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ შეცდáƒáƒ›áƒ ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜: %s" + +#: access/transam/timeline.c:164 +#, c-format +msgid "Expected a numeric timeline ID." +msgstr "მáƒáƒ•ელáƒáƒ“ი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის რიცხვáƒáƒ‘რივ ID-ს." + +#: access/transam/timeline.c:169 +#, c-format +msgid "Expected a write-ahead log switchpoint location." +msgstr "მáƒáƒ•ელáƒáƒ“ი წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ გáƒáƒ“áƒáƒ áƒ—ვის წერტილის მდებáƒáƒ áƒ”áƒáƒ‘áƒáƒ¡." + +#: access/transam/timeline.c:173 +#, c-format +msgid "invalid data in history file: %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მები ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\"" + +#: access/transam/timeline.c:174 +#, c-format +msgid "Timeline IDs must be in increasing sequence." +msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID-ები ზრდáƒáƒ“áƒáƒ‘ით უნდრიყáƒáƒ¡ დáƒáƒšáƒáƒ’ებული." + +#: access/transam/timeline.c:194 +#, c-format +msgid "invalid data in history file \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მები ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\"" + +#: access/transam/timeline.c:195 +#, c-format +msgid "Timeline IDs must be less than child timeline's ID." +msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID-ები შვილი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID-ზე ნáƒáƒ™áƒšáƒ”ბი უნდრიყáƒáƒ¡." + +#: access/transam/timeline.c:589 +#, c-format +msgid "requested timeline %u is not in this server's history" +msgstr "მáƒáƒ—ხáƒáƒ•ნილი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u სერვერს ისტáƒáƒ áƒ˜áƒáƒ¨áƒ˜ áƒáƒ áƒáƒ" + +#: access/transam/twophase.c:368 +#, c-format +msgid "transaction identifier \"%s\" is too long" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ \"%s\" ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#: access/transam/twophase.c:375 +#, c-format +msgid "prepared transactions are disabled" +msgstr "მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბი გáƒáƒ›áƒáƒ áƒ—ულიáƒ" + +#: access/transam/twophase.c:376 +#, c-format +msgid "Set \"max_prepared_transactions\" to a nonzero value." +msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ \"max_prepared_tranzactions\"-ის áƒáƒ áƒáƒœáƒ£áƒšáƒáƒ•áƒáƒœ მნიშვნელáƒáƒ‘áƒáƒ–ე დáƒáƒ§áƒ”ნებáƒ." + +#: access/transam/twophase.c:395 +#, c-format +msgid "transaction identifier \"%s\" is already in use" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ \"%s\" უკვე გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: access/transam/twophase.c:404 access/transam/twophase.c:2541 +#, c-format +msgid "maximum number of prepared transactions reached" +msgstr "მიღწეულირმáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ" + +#: access/transam/twophase.c:405 access/transam/twophase.c:2542 +#, c-format +msgid "Increase \"max_prepared_transactions\" (currently %d)." +msgstr "გáƒáƒ–áƒáƒ áƒ“ეთ \"max_prepared_transactions\" (áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ %d)." + +#: access/transam/twophase.c:580 +#, c-format +msgid "prepared transaction with identifier \"%s\" is busy" +msgstr "მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ— \"%s\" დáƒáƒ™áƒáƒ•ებულიáƒ" + +#: access/transam/twophase.c:586 +#, c-format +msgid "permission denied to finish prepared transaction" +msgstr "მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: access/transam/twophase.c:587 +#, c-format +msgid "Must be superuser or the user that prepared the transaction." +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒœ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი, რáƒáƒ›áƒ”ლმáƒáƒª ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ მáƒáƒáƒ›áƒ–áƒáƒ“áƒ." + +#: access/transam/twophase.c:598 +#, c-format +msgid "prepared transaction belongs to another database" +msgstr "მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ სხვრბáƒáƒ–áƒáƒ¡ ეკუთვნის" + +#: access/transam/twophase.c:599 +#, c-format +msgid "Connect to the database where the transaction was prepared to finish it." +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¡áƒáƒ›áƒ—áƒáƒ•რებლáƒáƒ“ დáƒáƒ£áƒ™áƒáƒ•შირდით ბáƒáƒ–áƒáƒ¡, სáƒáƒ“áƒáƒª ის მáƒáƒ›áƒ–áƒáƒ“დáƒ." + +#: access/transam/twophase.c:614 +#, c-format +msgid "prepared transaction with identifier \"%s\" does not exist" +msgstr "მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ— \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: access/transam/twophase.c:1190 +#, c-format +msgid "two-phase state file maximum length exceeded" +msgstr "áƒáƒ áƒ¤áƒáƒ–იáƒáƒœáƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიგრძე გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულიáƒ" + +#: access/transam/twophase.c:1345 +#, c-format +msgid "incorrect size of file \"%s\": %lld byte" +msgid_plural "incorrect size of file \"%s\": %lld bytes" +msgstr[0] "ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ \"%s\": %lld ბáƒáƒ˜áƒ¢áƒ˜" +msgstr[1] "ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ \"%s\": %lld ბáƒáƒ˜áƒ¢áƒ˜" + +#: access/transam/twophase.c:1354 +#, c-format +msgid "incorrect alignment of CRC offset for file \"%s\"" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\" CRC-ს წáƒáƒœáƒáƒªáƒ•ლების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სწáƒáƒ áƒ”ბáƒ" + +#: access/transam/twophase.c:1372 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %lld-დáƒáƒœ" + +#: access/transam/twophase.c:1387 +#, c-format +msgid "invalid magic number stored in file \"%s\"" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებული მáƒáƒ’იური რიცხვი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: access/transam/twophase.c:1393 +#, c-format +msgid "invalid size stored in file \"%s\"" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებული ზáƒáƒ›áƒ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: access/transam/twophase.c:1405 +#, c-format +msgid "calculated CRC checksum does not match value stored in file \"%s\"" +msgstr "გáƒáƒ›áƒáƒ—ვლილი CRC სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ áƒáƒ  ემთხვევრმნიშვნელáƒáƒ‘áƒáƒ¡, რáƒáƒ›áƒ”ლიც ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" წერიáƒ" + +#: access/transam/twophase.c:1435 access/transam/xlogrecovery.c:565 postmaster/walsummarizer.c:821 replication/logical/logical.c:210 replication/walsender.c:836 +#, c-format +msgid "Failed while allocating a WAL reading processor." +msgstr "შეცდáƒáƒ›áƒ WAL კითხვის პრáƒáƒªáƒ”სáƒáƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡." + +#: access/transam/twophase.c:1445 +#, c-format +msgid "could not read two-phase state from WAL at %X/%X: %s" +msgstr "\"WAL\"-დáƒáƒœ 2ფáƒáƒ–იáƒáƒœáƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X: %s" + +#: access/transam/twophase.c:1450 +#, c-format +msgid "could not read two-phase state from WAL at %X/%X" +msgstr "\"WAL\"-დáƒáƒœ 2ფáƒáƒ–იáƒáƒœáƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/twophase.c:1458 +#, c-format +msgid "expected two-phase state data is not present in WAL at %X/%X" +msgstr "\"WAL\"-ში მáƒáƒ¡áƒáƒšáƒáƒ“ნელი áƒáƒ áƒ¤áƒáƒ–იáƒáƒœáƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის მáƒáƒœáƒáƒªáƒ”მები მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: access/transam/twophase.c:1754 +#, c-format +msgid "could not recreate file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") თáƒáƒ•იდáƒáƒœ შექმნის შეცდáƒáƒ›áƒ: %m" + +#: access/transam/twophase.c:1881 +#, c-format +msgid "%u two-phase state file was written for a long-running prepared transaction" +msgid_plural "%u two-phase state files were written for long-running prepared transactions" +msgstr[0] "დიდხáƒáƒœáƒ¡-გáƒáƒ¨áƒ•ებული მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბისთვის %u áƒáƒ áƒ¤áƒáƒ–იáƒáƒœáƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის ფáƒáƒ˜áƒšáƒ˜ ჩáƒáƒ˜áƒ¬áƒ”რáƒ" +msgstr[1] "დიდხáƒáƒœáƒ¡-გáƒáƒ¨áƒ•ებული მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბისთვის %u áƒáƒ áƒ¤áƒáƒ–იáƒáƒœáƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის ფáƒáƒ˜áƒšáƒ˜ ჩáƒáƒ˜áƒ¬áƒ”რáƒ" + +#: access/transam/twophase.c:2117 +#, c-format +msgid "recovering prepared transaction %u from shared memory" +msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერებიდáƒáƒœ წინáƒáƒ¡áƒ¬áƒáƒ  მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ áƒáƒ¦áƒ“გენáƒ: %u" + +#: access/transam/twophase.c:2210 +#, c-format +msgid "removing stale two-phase state file for transaction %u" +msgstr "áƒáƒ áƒ¤áƒáƒ–იáƒáƒœáƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის გáƒáƒ­áƒ”დილი ფáƒáƒ˜áƒšáƒ˜áƒ¡ მáƒáƒªáƒ˜áƒšáƒ”ბრტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡áƒ—ვის %u" + +#: access/transam/twophase.c:2217 +#, c-format +msgid "removing stale two-phase state from memory for transaction %u" +msgstr "áƒáƒ áƒ¤áƒáƒ–იáƒáƒœáƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის გáƒáƒ­áƒ”დილი მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის წáƒáƒ¨áƒšáƒ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡áƒ—ვის: %u" + +#: access/transam/twophase.c:2230 +#, c-format +msgid "removing future two-phase state file for transaction %u" +msgstr "მáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ áƒáƒ áƒ¤áƒáƒ–იáƒáƒœáƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡áƒ—ვის %u" + +#: access/transam/twophase.c:2237 +#, c-format +msgid "removing future two-phase state from memory for transaction %u" +msgstr "მáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ áƒáƒ áƒ¤áƒáƒ–იáƒáƒœáƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის მეხსიერებიდáƒáƒœ წáƒáƒ¨áƒšáƒ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡áƒ—ვის %u" + +#: access/transam/twophase.c:2262 +#, c-format +msgid "corrupted two-phase state file for transaction %u" +msgstr "áƒáƒ áƒ¤áƒáƒ–იáƒáƒœáƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ–იáƒáƒœáƒ”ბული ფáƒáƒ˜áƒšáƒ˜ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡áƒ—ვის %u" + +#: access/transam/twophase.c:2267 +#, c-format +msgid "corrupted two-phase state in memory for transaction %u" +msgstr "áƒáƒ áƒ¤áƒáƒ–იáƒáƒœáƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ–იáƒáƒœáƒ”ბული მეხსიერებრტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡áƒ—ვის %u" + +#: access/transam/twophase.c:2524 +#, c-format +msgid "could not recover two-phase state file for transaction %u" +msgstr "áƒáƒ áƒ¤áƒáƒ–იáƒáƒœáƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡áƒ—ვის %u შეუძლებელიáƒ" + +#: access/transam/twophase.c:2526 +#, c-format +msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." +msgstr "" + +#: access/transam/twophase.c:2534 storage/file/fd.c:514 utils/fmgr/dfmgr.c:209 +#, c-format +msgid "could not access file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: access/transam/varsup.c:156 +#, c-format +msgid "database is not accepting commands that assign new XIDs to avoid wraparound data loss in database \"%s\"" +msgstr "ბáƒáƒ–áƒáƒ¨áƒ˜ (\"%s\") მáƒáƒœáƒáƒªáƒ”მების ჩáƒáƒªáƒ˜áƒ™áƒ•ლის თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რბრძáƒáƒœáƒ”ბებს, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ®áƒáƒš XID-ებს áƒáƒœáƒ˜áƒ­áƒ”ბენ, áƒáƒ  იღებს" + +#: access/transam/varsup.c:163 +#, c-format +msgid "database is not accepting commands that assign new XIDs to avoid wraparound data loss in database with OID %u" +msgstr "ბáƒáƒ–áƒáƒ¨áƒ˜ (OID-ით \"%u\") მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რბრძáƒáƒœáƒ”ბებს, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ®áƒáƒš XID-ებს áƒáƒœáƒ˜áƒ­áƒ”ბენ, áƒáƒ  იღებს" + +#: access/transam/varsup.c:175 access/transam/varsup.c:490 +#, c-format +msgid "database \"%s\" must be vacuumed within %u transactions" +msgstr "ბáƒáƒ–რ\"%s\" ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜ %u უნდრმáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ“ეს" + +#: access/transam/varsup.c:178 access/transam/varsup.c:185 access/transam/varsup.c:493 access/transam/varsup.c:500 +#, c-format +msgid "" +"To avoid XID assignment failures, execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"XID-ების მინიჭებების თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ გáƒáƒ£áƒ¨áƒ•ით VACUUM მთელ ბáƒáƒ–áƒáƒ–ე იმ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ისთვის.\n" +"შეიძლებáƒ, áƒáƒ¡áƒ”ვე, დáƒáƒ’ჭირდეთ ძველი მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის კáƒáƒ›áƒ˜áƒ¢áƒ˜ áƒáƒœ დáƒáƒ‘რუნებáƒ, áƒáƒœ გáƒáƒ›áƒáƒ£áƒ§áƒ”ნებელი რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის წáƒáƒ¨áƒšáƒ." + +#: access/transam/varsup.c:182 access/transam/varsup.c:497 +#, c-format +msgid "database with OID %u must be vacuumed within %u transactions" +msgstr "ბáƒáƒ–რ\"%u\" %u ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒœáƒ›áƒáƒ•ლáƒáƒ‘áƒáƒ¨áƒ˜ უნდრმáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ“ეს" + +#: access/transam/xact.c:649 +#, c-format +msgid "cannot assign XIDs during a parallel operation" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ XID-ების მინიჭებრშეუძლებელიáƒ" + +#: access/transam/xact.c:840 +#, c-format +msgid "cannot modify data in a parallel worker" +msgstr "პáƒáƒ áƒáƒšáƒ”ლურ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სში მáƒáƒœáƒáƒªáƒ”მების შეცვლრშეუძლებელიáƒ" + +#: access/transam/xact.c:1115 +#, c-format +msgid "cannot start commands during a parallel operation" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ ბრძáƒáƒœáƒ”ბების გáƒáƒ¨áƒ•ებრშეუძლებელიáƒ" + +#: access/transam/xact.c:1123 +#, c-format +msgid "cannot have more than 2^32-2 commands in a transaction" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜ 2^32-2 ბრძáƒáƒœáƒ”ბáƒáƒ–ე მეტი ვერ იქნებáƒ" + +#: access/transam/xact.c:1664 +#, c-format +msgid "maximum number of committed subtransactions (%d) exceeded" +msgstr "გáƒáƒ“áƒáƒªáƒ˜áƒšáƒ”ბულირგáƒáƒ“áƒáƒªáƒ”მული ქვეტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ: %d" + +#: access/transam/xact.c:2561 +#, c-format +msgid "cannot PREPARE a transaction that has operated on temporary objects" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ–ე, რáƒáƒ›áƒ”ლიც დრáƒáƒ”ბით áƒáƒ‘იექტებზე მუშáƒáƒáƒ‘დáƒ, PREPARE-ს ვერ იზáƒáƒ›áƒ—" + +#: access/transam/xact.c:2571 +#, c-format +msgid "cannot PREPARE a transaction that has exported snapshots" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ–ე, რáƒáƒ›áƒšáƒ˜áƒ“áƒáƒœáƒáƒª სწრáƒáƒ¤áƒ˜ áƒáƒ¡áƒšáƒ”ბი გáƒáƒ˜áƒ¢áƒáƒœáƒ”ს, PREPARE-ს ვერ გáƒáƒ£áƒ¨áƒ•ებთ" + +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3593 +#, c-format +msgid "%s cannot run inside a transaction block" +msgstr "%s ქვეტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ბლáƒáƒ™áƒ˜áƒ¡ შიგნით ვერ გáƒáƒ”შვებáƒ" + +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3603 +#, c-format +msgid "%s cannot run inside a subtransaction" +msgstr "%s ქვეტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜ ვერ გáƒáƒ”შვებáƒ" + +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3613 +#, c-format +msgid "%s cannot be executed within a pipeline" +msgstr "%s ფუნქციიდáƒáƒœ ვერ გáƒáƒ”შვებáƒ" + +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3623 +#, c-format +msgid "%s cannot be executed from a function" +msgstr "%s ფუნქციიდáƒáƒœ ვერ გáƒáƒ”შვებáƒ" + +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3694 access/transam/xact.c:4019 access/transam/xact.c:4098 access/transam/xact.c:4221 access/transam/xact.c:4372 access/transam/xact.c:4441 access/transam/xact.c:4552 +#, c-format +msgid "%s can only be used in transaction blocks" +msgstr "%s მხáƒáƒšáƒáƒ“ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ბლáƒáƒ™áƒ¨áƒ˜ შეიძლებრიყáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული" + +#: access/transam/xact.c:3905 +#, c-format +msgid "there is already a transaction in progress" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ უკვე მიმდინáƒáƒ áƒ”áƒáƒ‘ს" + +#: access/transam/xact.c:4024 access/transam/xact.c:4103 access/transam/xact.c:4226 +#, c-format +msgid "there is no transaction in progress" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ გáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: access/transam/xact.c:4114 +#, c-format +msgid "cannot commit during a parallel operation" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ გáƒáƒ“áƒáƒªáƒ”მრშეუძლებელიáƒ" + +#: access/transam/xact.c:4237 +#, c-format +msgid "cannot abort during a parallel operation" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ გáƒáƒ£áƒ¥áƒ›áƒ”ბრშეუძლებელიáƒ" + +#: access/transam/xact.c:4336 +#, c-format +msgid "cannot define savepoints during a parallel operation" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ შესáƒáƒœáƒáƒ®áƒ˜ წერტილების áƒáƒ¦áƒ¬áƒ”რრშეუძლებელიáƒ" + +#: access/transam/xact.c:4423 +#, c-format +msgid "cannot release savepoints during a parallel operation" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ შესáƒáƒœáƒáƒ®áƒ˜ წერტილების წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: access/transam/xact.c:4433 access/transam/xact.c:4484 access/transam/xact.c:4544 access/transam/xact.c:4593 +#, c-format +msgid "savepoint \"%s\" does not exist" +msgstr "შესáƒáƒœáƒáƒ®áƒ˜ წერტილი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: access/transam/xact.c:4490 access/transam/xact.c:4599 +#, c-format +msgid "savepoint \"%s\" does not exist within current savepoint level" +msgstr "შესáƒáƒœáƒáƒ®áƒ˜ წერტილების მიმდინáƒáƒ áƒ” დáƒáƒœáƒ”ზე შესáƒáƒœáƒáƒ®áƒ˜ წერტილი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: access/transam/xact.c:4532 +#, c-format +msgid "cannot rollback to savepoints during a parallel operation" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ შენáƒáƒ®áƒ£áƒš წერტილზე დáƒáƒ‘რუნებრშეუძლებელიáƒ" + +#: access/transam/xact.c:5376 +#, c-format +msgid "cannot have more than 2^32-1 subtransactions in a transaction" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜ 2^32-1 ქვეტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ–ე მეტი ვერ იქნებáƒ" + +#: access/transam/xlog.c:1536 +#, c-format +msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" +msgstr "" + +#: access/transam/xlog.c:1763 +#, c-format +msgid "cannot read past end of generated WAL: requested %X/%X, current position %X/%X" +msgstr "" + +#: access/transam/xlog.c:2204 access/transam/xlog.c:4495 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, შუáƒáƒšáƒ”დიდáƒáƒœ 1მბ-1გბ." + +#: access/transam/xlog.c:2222 +#, c-format +msgid "\"%s\" must be set to -1 during binary upgrade mode." +msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის რეჟიმისáƒáƒ¡ \"%s\"-ის მნიშვნელáƒáƒ‘რ-1-ზე უნდრდáƒáƒáƒ§áƒ”ნáƒáƒ—." + +#: access/transam/xlog.c:2471 +#, c-format +msgid "could not write to log file \"%s\" at offset %u, length %zu: %m" +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ წáƒáƒœáƒáƒªáƒ•ლებრ%u, სიგრძე %zu: %m" + +#: access/transam/xlog.c:3733 access/transam/xlogutils.c:831 replication/walsender.c:3045 +#, c-format +msgid "requested WAL segment %s has already been removed" +msgstr "მáƒáƒ—ხáƒáƒ•ნილი WAL სეგმენტი %s უკვე წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ" + +#: access/transam/xlog.c:4055 +#, c-format +msgid "could not rename file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s: %m" + +#: access/transam/xlog.c:4098 access/transam/xlog.c:4109 access/transam/xlog.c:4130 +#, c-format +msgid "required WAL directory \"%s\" does not exist" +msgstr "wal-ის áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: access/transam/xlog.c:4115 access/transam/xlog.c:4136 +#, c-format +msgid "creating missing WAL directory \"%s\"" +msgstr "ნáƒáƒ™áƒšáƒ£áƒšáƒ˜ WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შექმნáƒ: \"%s\"" + +#: access/transam/xlog.c:4119 access/transam/xlog.c:4139 commands/dbcommands.c:3242 +#, c-format +msgid "could not create missing directory \"%s\": %m" +msgstr "ნáƒáƒ™áƒšáƒ£áƒšáƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") შექმნის შეცდáƒáƒ›áƒ: %m" + +#: access/transam/xlog.c:4206 +#, c-format +msgid "could not generate secret authorization token" +msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის ერთჯერáƒáƒ“ი კáƒáƒ“ის გენერáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: access/transam/xlog.c:4357 access/transam/xlog.c:4367 access/transam/xlog.c:4393 access/transam/xlog.c:4401 access/transam/xlog.c:4409 access/transam/xlog.c:4415 access/transam/xlog.c:4423 access/transam/xlog.c:4431 access/transam/xlog.c:4439 access/transam/xlog.c:4447 access/transam/xlog.c:4455 access/transam/xlog.c:4463 access/transam/xlog.c:4473 access/transam/xlog.c:4481 utils/init/miscinit.c:1758 +#, c-format +msgid "database files are incompatible with server" +msgstr "ბáƒáƒ–ის ფáƒáƒ˜áƒšáƒ”ბი სერვერთáƒáƒœ თáƒáƒ•სებáƒáƒ“ი áƒáƒ áƒáƒ" + +#: access/transam/xlog.c:4358 +#, c-format +msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." +msgstr "ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რPG_CONTROL_VERSION %d (0x%08x)-ით, მáƒáƒ’რáƒáƒ› სერვერის áƒáƒ’ებისáƒáƒ¡ PG_CONTROL_VERSION %d (0x%08x)." + +#: access/transam/xlog.c:4362 +#, c-format +msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." +msgstr "ეს შეიძლებრბáƒáƒ˜áƒ¢áƒ”ბის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ დáƒáƒšáƒáƒ’ების პრáƒáƒ‘ლემáƒáƒª იყáƒáƒ¡. რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, initdb გჭირდებáƒáƒ—." + +#: access/transam/xlog.c:4368 +#, c-format +msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." +msgstr "ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რPG_CONTROL_VERSION %d, მáƒáƒ’რáƒáƒ› სერვერის áƒáƒ’ებისáƒáƒ¡ PG_CONTROL_VERSION %d." + +#: access/transam/xlog.c:4371 access/transam/xlog.c:4397 access/transam/xlog.c:4405 access/transam/xlog.c:4411 +#, c-format +msgid "It looks like you need to initdb." +msgstr "რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, initdb გჭირდებáƒáƒ—." + +#: access/transam/xlog.c:4383 +#, c-format +msgid "incorrect checksum in control file" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ pg_control-ის ფáƒáƒ˜áƒšáƒ¨áƒ˜" + +#: access/transam/xlog.c:4394 +#, c-format +msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რCATALOG_VERSION_NO %d -ით, მáƒáƒ’რáƒáƒ› სერვერი áƒáƒ’ებულირCATALOG_VERSION_NO %d-ით." + +#: access/transam/xlog.c:4402 +#, c-format +msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რMAXALIGN %d -ით, მáƒáƒ’რáƒáƒ› სერვერი áƒáƒ’ებულირMAXALIGN %d-ით." + +#: access/transam/xlog.c:4410 +#, c-format +msgid "The database cluster appears to use a different floating-point number format than the server executable." +msgstr "რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რი წილáƒáƒ“ი რიცხვების სხვრფáƒáƒ áƒ›áƒáƒ¢áƒ¡ იყენებს, ვიდრე სერვერის გáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ˜." + +#: access/transam/xlog.c:4416 +#, c-format +msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რBLCKSZ %d -ით, მáƒáƒ’რáƒáƒ› სერვერი áƒáƒ’ებულირBLCKSZ %d-ით." + +#: access/transam/xlog.c:4419 access/transam/xlog.c:4427 access/transam/xlog.c:4435 access/transam/xlog.c:4443 access/transam/xlog.c:4451 access/transam/xlog.c:4459 access/transam/xlog.c:4467 access/transam/xlog.c:4476 access/transam/xlog.c:4484 +#, c-format +msgid "It looks like you need to recompile or initdb." +msgstr "რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, გჭირდებáƒáƒ— თáƒáƒ•იდáƒáƒœ áƒáƒáƒ’áƒáƒ— პრáƒáƒ“უქტი, áƒáƒœ initdb." + +#: access/transam/xlog.c:4424 +#, c-format +msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რRELSEG_SIZE%d -ით, მáƒáƒ’რáƒáƒ› სერვერი áƒáƒ’ებულირRELSEG_SIZE %d-ით." + +#: access/transam/xlog.c:4432 +#, c-format +msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რXLOG_BLCKSZ%d -ით, მáƒáƒ’რáƒáƒ› სერვერი áƒáƒ’ებულირXLOG_BLCKSZ%d-ით." + +#: access/transam/xlog.c:4440 +#, c-format +msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რNAMEDATALEN %d -ით, მáƒáƒ’რáƒáƒ› სერვერი áƒáƒ’ებულირNAMEDATALEN %d-ით." + +#: access/transam/xlog.c:4448 +#, c-format +msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რINDEX_MAX_KEYS %d -ით, მáƒáƒ’რáƒáƒ› სერვერი áƒáƒ’ებულირINDEX_MAX_KEYS %d-ით." + +#: access/transam/xlog.c:4456 +#, c-format +msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რTOAST_MAX_CHUNK_SIZE %d -ით, მáƒáƒ’რáƒáƒ› სერვერი áƒáƒ’ებულირTOAST_MAX_CHUNK_SIZE %d-ით." + +#: access/transam/xlog.c:4464 +#, c-format +msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რLOBLKSIZE %d -ით, მáƒáƒ’რáƒáƒ› სერვერი áƒáƒ’ებულირLOBLKSIZE %d-ით." + +#: access/transam/xlog.c:4474 +#, c-format +msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რUSE_FLOAT8_BYVAL-ის გáƒáƒ áƒ”შე, მáƒáƒ’რáƒáƒ› სერვერი áƒáƒ’ებულირUSE_FLOAT8_BYVAL-ით." + +#: access/transam/xlog.c:4482 +#, c-format +msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რUSE_FLOAT8_BYVA -ის გáƒáƒ áƒ”შე, მáƒáƒ’რáƒáƒ› სერვერი áƒáƒ’ებულირUSE_FLOAT8_BYVAL-ით." + +#: access/transam/xlog.c:4491 +#, c-format +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%d ბáƒáƒ˜áƒ¢áƒ˜)" +msgstr[1] "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%d ბáƒáƒ˜áƒ¢áƒ˜)" + +#: access/transam/xlog.c:4504 +#, c-format +msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" +msgstr "\"min_wal_size\"-ი \"wal_segment_size\"-ზე მინიმუმ áƒáƒ áƒ¯áƒ”რ მეტი უნდრიყáƒáƒ¡" + +#: access/transam/xlog.c:4508 +#, c-format +msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" +msgstr "\"max_wal_size\"-ი \"wal_segment_size\"-ზე, მინიმუმ, áƒáƒ áƒ¯áƒ”რ მეტი უნდრიყáƒáƒ¡" + +#: access/transam/xlog.c:4656 catalog/namespace.c:4681 commands/tablespace.c:1210 commands/user.c:2529 commands/variable.c:72 replication/slot.c:2429 utils/error/elog.c:2214 +#, c-format +msgid "List syntax is invalid." +msgstr "სირსინტáƒáƒ¥áƒ¡áƒ˜ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ." + +#: access/transam/xlog.c:4702 commands/user.c:2545 commands/variable.c:173 utils/error/elog.c:2240 +#, c-format +msgid "Unrecognized key word: \"%s\"." +msgstr "უცნáƒáƒ‘ი სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ სიტყვáƒ: \"%s\"." + +#: access/transam/xlog.c:5122 +#, c-format +msgid "could not write bootstrap write-ahead log file: %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: access/transam/xlog.c:5130 +#, c-format +msgid "could not fsync bootstrap write-ahead log file: %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜áƒ¡ fsync-ის შეცდáƒáƒ›áƒ: %m" + +#: access/transam/xlog.c:5136 +#, c-format +msgid "could not close bootstrap write-ahead log file: %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: access/transam/xlog.c:5354 +#, c-format +msgid "WAL was generated with \"wal_level=minimal\", cannot continue recovering" +msgstr "WAL-ი გენერირებული იყრ\"wal_level=minimal\"-ით. áƒáƒ¦áƒ“გენრვერ გáƒáƒ’რძელდებáƒ" + +#: access/transam/xlog.c:5355 +#, c-format +msgid "This happens if you temporarily set \"wal_level=minimal\" on the server." +msgstr "ეს ხდებáƒ, თუ სერვერზე დრáƒáƒ”ბით \"wal_level=minimal\"-ს დáƒáƒáƒ§áƒ”ნებთ." + +#: access/transam/xlog.c:5356 +#, c-format +msgid "Use a backup taken after setting \"wal_level\" to higher than \"minimal\"." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜, რáƒáƒ›áƒ”ლიც \"wal_level\"-ის \"minimal\"-ზე მეტზე დáƒáƒ§áƒ”ნების შემდეგ áƒáƒ˜áƒ¦áƒ”თ." + +#: access/transam/xlog.c:5421 +#, c-format +msgid "control file contains invalid checkpoint location" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  მდებáƒáƒ áƒ”áƒáƒ‘áƒáƒ¡ შეიცáƒáƒ•ს" + +#: access/transam/xlog.c:5432 +#, c-format +msgid "database system was shut down at %s" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემის გáƒáƒ—იშვის დრáƒ: %s" + +#: access/transam/xlog.c:5438 +#, c-format +msgid "database system was shut down in recovery at %s" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემის áƒáƒ¦áƒ“გენისáƒáƒ¡ გáƒáƒ—იშვის დრáƒ: %s" + +#: access/transam/xlog.c:5444 +#, c-format +msgid "database system shutdown was interrupted; last known up at %s" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რშეწყვეტილიáƒ; ბáƒáƒšáƒáƒ¡ ჩáƒáƒ áƒ—ული იყáƒ: %s" + +#: access/transam/xlog.c:5450 +#, c-format +msgid "database system was interrupted while in recovery at %s" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემის áƒáƒ¦áƒ“გენისáƒáƒ¡ გáƒáƒ—იშვის დრáƒ: %s" + +#: access/transam/xlog.c:5452 +#, c-format +msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." +msgstr "ეს áƒáƒšáƒ‘áƒáƒ— ნიშნáƒáƒ•ს, რáƒáƒ› ზáƒáƒ’იერთი მáƒáƒœáƒáƒªáƒ”მი დáƒáƒ–იáƒáƒœáƒ”ბულირდრáƒáƒ¦áƒ“გენისთვის ბáƒáƒšáƒ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებრმáƒáƒ’იწევთ." + +#: access/transam/xlog.c:5458 +#, c-format +msgid "database system was interrupted while in recovery at log time %s" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემრგáƒáƒ˜áƒ—იშრáƒáƒ¦áƒ“გენისáƒáƒ¡ ჟურნáƒáƒšáƒ˜áƒ¡ დრáƒáƒ¡ %s" + +#: access/transam/xlog.c:5460 +#, c-format +msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." +msgstr "თუ ეს კიდევ ერთხელ მáƒáƒ˜áƒœáƒª მáƒáƒ®áƒ“áƒ, ეს ნიშნáƒáƒ•ს, რáƒáƒ› მáƒáƒœáƒáƒªáƒ”მები დáƒáƒ–იáƒáƒœáƒ”ბულირდრუფრრძველი áƒáƒ¦áƒ“გენის სáƒáƒ›áƒ˜áƒ–ნე უნდრáƒáƒ˜áƒ áƒ©áƒ˜áƒáƒ—." + +#: access/transam/xlog.c:5466 +#, c-format +msgid "database system was interrupted; last known up at %s" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რშეწყვეტილიáƒ; ბáƒáƒšáƒáƒ¡ ჩáƒáƒ áƒ—ული იყáƒ: %s" + +#: access/transam/xlog.c:5473 +#, c-format +msgid "control file contains invalid database cluster state" +msgstr "კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒáƒ¡ შეიცáƒáƒ•ს" + +#: access/transam/xlog.c:5860 +#, c-format +msgid "WAL ends before end of online backup" +msgstr "WAL áƒáƒœáƒšáƒáƒ˜áƒœ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒáƒ›áƒ“ე მთáƒáƒ•რდებáƒ" + +#: access/transam/xlog.c:5861 +#, c-format +msgid "All WAL generated while online backup was taken must be available at recovery." +msgstr "áƒáƒ¦áƒ“გენისáƒáƒ¡ áƒáƒœáƒšáƒáƒ˜áƒœ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ áƒáƒ¦áƒ”ბისáƒáƒ¡ გენერირებული ყველრWAL-ი ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ უნდრიყáƒáƒ¡." + +#: access/transam/xlog.c:5865 +#, c-format +msgid "WAL ends before consistent recovery point" +msgstr "WAL áƒáƒ¦áƒ“გენის შეთáƒáƒœáƒ®áƒ›áƒ”ბულ წერტილáƒáƒ›áƒ“ე მთáƒáƒ•რდებáƒ" + +#: access/transam/xlog.c:5911 +#, c-format +msgid "selected new timeline ID: %u" +msgstr "დრáƒáƒ˜áƒ¡ áƒáƒ®áƒáƒšáƒ˜ ხáƒáƒ–ის áƒáƒ áƒ©áƒ”ული ID: %u" + +#: access/transam/xlog.c:5944 +#, c-format +msgid "archive recovery complete" +msgstr "áƒáƒ áƒ¥áƒ˜áƒ•იდáƒáƒœ áƒáƒ¦áƒ“გენრდáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ" + +#: access/transam/xlog.c:6552 +#, c-format +msgid "shutting down" +msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს გáƒáƒ›áƒáƒ áƒ—ვáƒ" + +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6591 +#, c-format +msgid "restartpoint starting:%s%s%s%s%s%s%s%s" +msgstr "გáƒáƒ“áƒáƒ¢áƒ•ირთვის წერტილი დáƒáƒ˜áƒ¬áƒ§áƒ:%s%s%s%s%s%s%s%s" + +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6603 +#, c-format +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილი იწყებáƒ:%s%s%s%s%s%s%s%s" + +#: access/transam/xlog.c:6668 +#, c-format +msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" +msgstr "" + +#: access/transam/xlog.c:6691 +#, c-format +msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" +msgstr "" + +#: access/transam/xlog.c:7165 +#, c-format +msgid "concurrent write-ahead log activity while database system is shutting down" +msgstr "კáƒáƒœáƒ™áƒ£áƒ áƒ”ნტული წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘áƒ, სáƒáƒœáƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რმუშáƒáƒáƒ‘áƒáƒ¡ áƒáƒ¡áƒ áƒ£áƒšáƒ”ბს" + +#: access/transam/xlog.c:7749 +#, c-format +msgid "recovery restart point at %X/%X" +msgstr "áƒáƒ¦áƒ“გენის გáƒáƒ“áƒáƒ¢áƒ•ირთვის წერტილი: %X/%X" + +#: access/transam/xlog.c:7751 +#, c-format +msgid "Last completed transaction was at log time %s." +msgstr "უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ მáƒáƒ®áƒ“რჟურნáƒáƒšáƒ˜áƒ¡ დრáƒáƒ˜áƒ— %s." + +#: access/transam/xlog.c:8013 +#, c-format +msgid "restore point \"%s\" created at %X/%X" +msgstr "áƒáƒ¦áƒ“გენის წერტილი \"%s\" შექმნილირ%X/%X -სთáƒáƒœ" + +#: access/transam/xlog.c:8220 +#, c-format +msgid "online backup was canceled, recovery cannot continue" +msgstr "áƒáƒœáƒšáƒáƒ˜áƒœ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ გáƒáƒ£áƒ¥áƒ›áƒ“áƒ. áƒáƒ¦áƒ“გენრვერ გáƒáƒ’რძელდებáƒ" + +#: access/transam/xlog.c:8277 +#, c-format +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" +msgstr "გáƒáƒ›áƒáƒ áƒ—ვის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილში ნáƒáƒžáƒáƒ•ნირდრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u მáƒáƒ£áƒšáƒáƒ“ნელირ(უნდრიყáƒáƒ¡ %u)" + +#: access/transam/xlog.c:8335 +#, c-format +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "ჩáƒáƒ áƒ—ვის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილში ნáƒáƒžáƒáƒ•ნირდრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u მáƒáƒ£áƒšáƒáƒ“ნელირ(უნდრიყáƒáƒ¡ %u)" + +#: access/transam/xlog.c:8364 +#, c-format +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" +msgstr "áƒáƒ¦áƒ“გენის ბáƒáƒšáƒ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილში ნáƒáƒžáƒáƒ•ნირდრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u მáƒáƒ£áƒšáƒáƒ“ნელირ(უნდრიყáƒáƒ¡ %u)" + +#: access/transam/xlog.c:8635 +#, c-format +msgid "could not fsync write-through file \"%s\": %m" +msgstr "გáƒáƒ›áƒ­áƒáƒšáƒáƒ“-ჩáƒáƒ¬áƒ”რáƒáƒ“ი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" + +#: access/transam/xlog.c:8640 +#, c-format +msgid "could not fdatasync file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" fdatasync შეუძლებელიáƒ: %m" + +#: access/transam/xlog.c:8727 access/transam/xlog.c:9063 +#, c-format +msgid "WAL level not sufficient for making an online backup" +msgstr "áƒáƒœáƒšáƒáƒ˜áƒœ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡áƒ—ვის WAL-ის მიმდინáƒáƒ áƒ” დáƒáƒœáƒ” სáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒ áƒáƒ" + +#: access/transam/xlog.c:8728 access/transam/xlogfuncs.c:248 +#, c-format +msgid "\"wal_level\" must be set to \"replica\" or \"logical\" at server start." +msgstr "სერვისის გáƒáƒ¨áƒ•ებისáƒáƒ¡ \"wal_level\"-ის მნიშვნელáƒáƒ‘რუნდრიყáƒáƒ¡ \"replica\" áƒáƒœ \"logical\"." + +#: access/transam/xlog.c:8733 +#, c-format +msgid "backup label too long (max %d bytes)" +msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ ჭდე ძáƒáƒšáƒ˜áƒáƒœ გრძელირ(max %d ბáƒáƒ˜áƒ¢áƒ˜)" + +#: access/transam/xlog.c:8854 +#, c-format +msgid "WAL generated with \"full_page_writes=off\" was replayed since last restartpoint" +msgstr "" + +#: access/transam/xlog.c:8856 access/transam/xlog.c:9152 +#, c-format +msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable \"full_page_writes\" and run CHECKPOINT on the primary, and then try an online backup again." +msgstr "ეს ნიშნáƒáƒ•ს, რáƒáƒ› უქმეზე áƒáƒ¦áƒ”ბული მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულირდრáƒáƒ  უნდრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—. ჩáƒáƒ áƒ—ეთ ძირითáƒáƒ“ სერვერზე \"full_page_writes\" დრგáƒáƒ£áƒ¨áƒ•ით CHECKPOINT დრმხáƒáƒšáƒáƒ“ შემდეგ სცáƒáƒ“ეთ áƒáƒœáƒšáƒáƒ˜áƒœ áƒáƒ¦áƒ“გენáƒ." + +#: access/transam/xlog.c:8936 backup/basebackup.c:1417 utils/adt/misc.c:354 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმის \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: access/transam/xlog.c:8943 backup/basebackup.c:1422 utils/adt/misc.c:359 +#, c-format +msgid "symbolic link \"%s\" target is too long" +msgstr "%s: სიმბმული ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#: access/transam/xlog.c:9064 +#, c-format +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "სერვისის გáƒáƒ¨áƒ•ებისáƒáƒ¡ wal_level -ის მნიშვნელáƒáƒ‘რუნდრიყáƒáƒ¡ \"replica\" áƒáƒœ \"logical\"." + +#: access/transam/xlog.c:9102 backup/basebackup.c:1281 +#, c-format +msgid "the standby was promoted during online backup" +msgstr "უქმე წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ“რáƒáƒœáƒšáƒáƒ˜áƒœ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ მიმდინáƒáƒ áƒ”áƒáƒ‘ის დრáƒáƒ¡" + +#: access/transam/xlog.c:9103 backup/basebackup.c:1282 +#, c-format +msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." +msgstr "ეს ნიშნáƒáƒ•ს, რáƒáƒ› მáƒáƒ áƒ¥áƒáƒ¤áƒ˜, რáƒáƒ›áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ”ბáƒáƒª მიმდინáƒáƒ áƒ”áƒáƒ‘ს, დáƒáƒ–იáƒáƒœáƒ”ბულირდრáƒáƒ  უნდრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—. სცáƒáƒ“ეთ, სხვრáƒáƒœáƒšáƒáƒ˜áƒœ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ áƒáƒ˜áƒ¦áƒáƒ—." + +#: access/transam/xlog.c:9150 +#, c-format +msgid "WAL generated with \"full_page_writes=off\" was replayed during online backup" +msgstr "" + +#: access/transam/xlog.c:9266 +#, c-format +msgid "base backup done, waiting for required WAL segments to be archived" +msgstr "ძირითáƒáƒ“ი მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ. ველáƒáƒ“ები áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელი WAL-ის სეგმენტების დáƒáƒáƒ áƒ¥áƒ˜áƒ•ებáƒáƒ¡" + +#: access/transam/xlog.c:9280 +#, c-format +msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" +msgstr "ჯერ კიდევ ველáƒáƒ“ები ყველრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელი WAL სეგმენტის დáƒáƒáƒ áƒ¥áƒ˜áƒ•ებáƒáƒ¡ (გáƒáƒ¡áƒ£áƒšáƒ˜áƒ %d წáƒáƒ›áƒ˜)" + +#: access/transam/xlog.c:9282 +#, c-format +msgid "Check that your \"archive_command\" is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." +msgstr "" + +#: access/transam/xlog.c:9289 +#, c-format +msgid "all required WAL segments have been archived" +msgstr "ყველრსáƒáƒ­áƒ˜áƒ áƒ WAL სეგმენტი დáƒáƒáƒ áƒ¥áƒ˜áƒ•ებულიáƒ" + +#: access/transam/xlog.c:9293 +#, c-format +msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" +msgstr "" + +#: access/transam/xlog.c:9332 +#, c-format +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ გáƒáƒ£áƒ¥áƒ›áƒ“áƒ, რáƒáƒ“გáƒáƒœ უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ› მუშáƒáƒáƒ‘რpg_backup_stop-ის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბáƒáƒ›áƒ“ე დáƒáƒáƒ¡áƒ áƒ£áƒšáƒ" + +#: access/transam/xlogarchive.c:213 +#, c-format +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ: %lld. უნდრიყáƒáƒ¡ %lld" + +#: access/transam/xlogarchive.c:222 +#, c-format +msgid "restored log file \"%s\" from archive" +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ áƒ¥áƒ˜áƒ•იდáƒáƒœ áƒáƒ¦áƒ“გáƒ" + +#: access/transam/xlogarchive.c:236 +#, c-format +msgid "\"restore_command\" returned a zero exit status, but stat() failed." +msgstr "\"restore_command\"-მრნულáƒáƒ•áƒáƒœáƒ˜ სტáƒáƒ¢áƒ£áƒ¡áƒ˜ დáƒáƒáƒ‘რუნáƒ, მáƒáƒ’რáƒáƒ› stat() ჩáƒáƒ•áƒáƒ áƒ“áƒ." + +#: access/transam/xlogarchive.c:268 +#, c-format +msgid "could not restore file \"%s\" from archive: %s" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") áƒáƒ áƒ¥áƒ˜áƒ•იდáƒáƒœ (\"%s\") áƒáƒ¦áƒ“გენრშეუძლებელიáƒ" + +#. translator: First %s represents a postgresql.conf parameter name like +#. "recovery_end_command", the 2nd is the value of that parameter, the +#. third an already translated error message. +#: access/transam/xlogarchive.c:346 +#, c-format +msgid "%s \"%s\": %s" +msgstr "%s \"%s\": %s" + +#: access/transam/xlogarchive.c:456 access/transam/xlogarchive.c:536 +#, c-format +msgid "could not create archive status file \"%s\": %m" +msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %m" + +#: access/transam/xlogarchive.c:464 access/transam/xlogarchive.c:544 +#, c-format +msgid "could not write archive status file \"%s\": %m" +msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: access/transam/xlogfuncs.c:69 backup/basebackup.c:997 +#, c-format +msgid "a backup is already in progress in this session" +msgstr "áƒáƒ› სესიáƒáƒ¨áƒ˜ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ უკვე მიმდინáƒáƒ áƒ”áƒáƒ‘ს" + +#: access/transam/xlogfuncs.c:140 +#, c-format +msgid "backup is not in progress" +msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ áƒáƒ  მიმდინáƒáƒ áƒ”áƒáƒ‘ს" + +#: access/transam/xlogfuncs.c:141 +#, c-format +msgid "Did you call pg_backup_start()?" +msgstr "თქვენ გáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒ”თ pg_backup_start()?" + +#: access/transam/xlogfuncs.c:184 access/transam/xlogfuncs.c:242 access/transam/xlogfuncs.c:281 access/transam/xlogfuncs.c:302 access/transam/xlogfuncs.c:323 +#, c-format +msgid "WAL control functions cannot be executed during recovery." +msgstr "WAL კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფუნქციების შესრულებრáƒáƒ¦áƒ“გენის დრáƒáƒ¡ შეუძლებელიáƒ." + +#: access/transam/xlogfuncs.c:209 access/transam/xlogfuncs.c:389 access/transam/xlogfuncs.c:447 +#, c-format +msgid "%s cannot be executed during recovery." +msgstr "%s áƒáƒ  შეიძლებრშესრულდეს áƒáƒ¦áƒ“გენის დრáƒáƒ¡." + +#: access/transam/xlogfuncs.c:215 +#, c-format +msgid "pg_log_standby_snapshot() can only be used if \"wal_level\" >= \"replica\"" +msgstr "pg_log_standby_snapshot()-ის გáƒáƒ›áƒáƒ§áƒ”ნებრშესáƒáƒ«áƒšáƒ”ბელიáƒ, მხáƒáƒšáƒáƒ“, მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ \"wal_level\" >= \"replica\"" + +#: access/transam/xlogfuncs.c:247 +#, c-format +msgid "WAL level not sufficient for creating a restore point" +msgstr "WAL დáƒáƒœáƒ” áƒáƒ  áƒáƒ áƒ˜áƒ¡ სáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒ¦áƒ“გენის წერტილის შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“" + +#: access/transam/xlogfuncs.c:255 +#, c-format +msgid "value too long for restore point (maximum %d characters)" +msgstr "áƒáƒ¦áƒ“გენის წერტილისთვის მნიშვნელáƒáƒ‘რძáƒáƒšáƒ˜áƒáƒœ გრძელირ(მáƒáƒ¥áƒ¡. %d სიმბáƒáƒšáƒ)" + +#: access/transam/xlogfuncs.c:486 +#, c-format +msgid "invalid WAL file name \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი \"%s\"" + +#: access/transam/xlogfuncs.c:522 access/transam/xlogfuncs.c:552 access/transam/xlogfuncs.c:576 access/transam/xlogfuncs.c:599 access/transam/xlogfuncs.c:679 +#, c-format +msgid "recovery is not in progress" +msgstr "áƒáƒ¦áƒ“გენრáƒáƒ  მიმდინáƒáƒ áƒ”áƒáƒ‘ს" + +#: access/transam/xlogfuncs.c:523 access/transam/xlogfuncs.c:553 access/transam/xlogfuncs.c:577 access/transam/xlogfuncs.c:600 access/transam/xlogfuncs.c:680 +#, c-format +msgid "Recovery control functions can only be executed during recovery." +msgstr "áƒáƒ¦áƒ“გენის კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფუნქციების შესრულებრმხáƒáƒšáƒáƒ“ áƒáƒ¦áƒ“გენის დრáƒáƒ¡ შეიძლებáƒ." + +#: access/transam/xlogfuncs.c:528 access/transam/xlogfuncs.c:558 +#, c-format +msgid "standby promotion is ongoing" +msgstr "მინდინáƒáƒ áƒ”áƒáƒ‘ს უქმáƒáƒ‘ის დáƒáƒ¬áƒ˜áƒœáƒáƒ£áƒ áƒ”ბáƒ" + +#: access/transam/xlogfuncs.c:529 access/transam/xlogfuncs.c:559 +#, c-format +msgid "%s cannot be executed after promotion is triggered." +msgstr "წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის დáƒáƒ¬áƒ§áƒ”ბის შემდეგ %s-ის შესრულებრშეუძლებელიáƒ." + +#: access/transam/xlogfuncs.c:685 +#, c-format +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "\"wait_seconds\" უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ—ი áƒáƒœ ნულáƒáƒ•áƒáƒœáƒ˜ áƒáƒ  უნდრიყáƒáƒ¡" + +#: access/transam/xlogfuncs.c:707 storage/ipc/signalfuncs.c:265 +#, c-format +msgid "failed to send signal to postmaster: %m" +msgstr "postmaster-ისთვის სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ: %m" + +#: access/transam/xlogfuncs.c:739 libpq/be-secure.c:237 libpq/be-secure.c:346 +#, c-format +msgid "terminating connection due to unexpected postmaster exit" +msgstr "მიერთების შეწყვეტრpostmaster-ის მáƒáƒ£áƒšáƒáƒ“ნელი გáƒáƒ¡áƒ•ლის გáƒáƒ›áƒ" + +#: access/transam/xlogfuncs.c:740 +#, c-format +msgid "while waiting on promotion" +msgstr "წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის მáƒáƒšáƒáƒ“ინისáƒáƒ¡" + +#: access/transam/xlogfuncs.c:744 +#, c-format +msgid "server did not promote within %d second" +msgid_plural "server did not promote within %d seconds" +msgstr[0] "სერვერი áƒáƒ  წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ“რ%d წáƒáƒ›áƒ¨áƒ˜" +msgstr[1] "სერვერი áƒáƒ  წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ“რ%d წáƒáƒ›áƒ¨áƒ˜" + +#: access/transam/xlogprefetcher.c:1088 +#, c-format +msgid "\"recovery_prefetch\" is not supported on platforms that lack posix_fadvise()." +msgstr "\"recovery_prefetch\" პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒ”ბზე, რáƒáƒ›áƒšáƒ”ბსáƒáƒª posix_fadvise() áƒáƒ  áƒáƒ¥áƒ•თ, მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: access/transam/xlogreader.c:619 +#, c-format +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წáƒáƒœáƒáƒªáƒ•ლებრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X: მáƒáƒ•ელáƒáƒ“ი მინიმუმ %u, მივიღე %u" + +#: access/transam/xlogreader.c:628 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "contrecord მáƒáƒ—ხáƒáƒ•ნილირ%X/%X-ის მიერ" + +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 +#, c-format +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X: მáƒáƒ•ელáƒáƒ“ი მინიმუმ %u, მივიღე %u" + +#: access/transam/xlogreader.c:758 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X contrecord áƒáƒšáƒáƒ›áƒ˜ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: access/transam/xlogreader.c:771 +#, c-format +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "contrecord -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე %u (მáƒáƒ•ელáƒáƒ“ი %lld) მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogreader.c:1142 +#, c-format +msgid "invalid resource manager ID %u at %X/%X" +msgstr "რესურსის მმáƒáƒ áƒ—ველის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ID %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogreader.c:1155 access/transam/xlogreader.c:1171 +#, c-format +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წინრბმულით %X/%X მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogreader.c:1209 +#, c-format +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "რესურსის მმáƒáƒ áƒ—ველის მáƒáƒœáƒáƒªáƒ”მების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ რიცხვი ჩáƒáƒœáƒáƒ¬áƒ”რში მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogreader.c:1243 +#, c-format +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ’იური რიცხვი %04X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u" + +#: access/transam/xlogreader.c:1258 access/transam/xlogreader.c:1300 +#, c-format +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ˜áƒœáƒ¤áƒáƒ áƒ›áƒáƒªáƒ˜áƒ ბიტები %04X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u" + +#: access/transam/xlogreader.c:1274 +#, c-format +msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" +msgstr "WAL ფáƒáƒ˜áƒšáƒ˜ სხვრმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემიდáƒáƒœáƒáƒ: WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ ბáƒáƒ–ის სისტემის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ %llu, pg_control-ის ბáƒáƒ–ის სისტემის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ %llu" + +#: access/transam/xlogreader.c:1282 +#, c-format +msgid "WAL file is from different database system: incorrect segment size in page header" +msgstr "WAL ფáƒáƒ˜áƒšáƒ˜ სხვრმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემიდáƒáƒœáƒáƒ: გვერდის თáƒáƒ•სáƒáƒ áƒ—ში მითითებული სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: access/transam/xlogreader.c:1288 +#, c-format +msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" +msgstr "WAL ფáƒáƒ˜áƒšáƒ˜ სხვრმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემიდáƒáƒœáƒáƒ: გვერდის თáƒáƒ•სáƒáƒ áƒ—ში მითითებული XLOG_BLKSZ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: access/transam/xlogreader.c:1320 +#, c-format +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი pageaddr %X/%X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u" + +#: access/transam/xlogreader.c:1346 +#, c-format +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "მიმდევრáƒáƒ‘ის-გáƒáƒ áƒ” დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID %u (%u-ის შემდეგ) ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u" + +#: access/transam/xlogreader.c:1749 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "ურიგრblock_id %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogreader.c:1773 +#, c-format +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATA დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› მáƒáƒœáƒáƒªáƒ”მები მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: access/transam/xlogreader.c:1780 +#, c-format +msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" +msgstr "BKPBLOCK_HAS_DATA დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს მáƒáƒœáƒáƒªáƒ”მები სიგრძით %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogreader.c:1816 +#, c-format +msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› ნáƒáƒ®áƒ•რეტის წáƒáƒœáƒáƒªáƒ•ლებრ%u სიგრძე %u ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძე %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogreader.c:1832 +#, c-format +msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ, მáƒáƒ’რáƒáƒ› ნáƒáƒ®áƒ•რეტის წáƒáƒœáƒáƒªáƒ•ლებრ%u სიგრძე %u მისáƒáƒœáƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogreader.c:1846 +#, c-format +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSED დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძერ%u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogreader.c:1861 +#, c-format +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "áƒáƒ áƒª BKPIMAGE_HAS_HOLE დრáƒáƒ áƒª BKPIMAGE_COMPRESSED დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ, მáƒáƒ’რáƒáƒ› ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძე %u-áƒ, მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogreader.c:1877 +#, c-format +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_REL დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› წინრმნიშვნელáƒáƒ‘რმითითებული áƒáƒ áƒáƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogreader.c:1889 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ block_id %u %X/%X" + +#: access/transam/xlogreader.c:1956 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძით მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogreader.c:1982 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "შეცდáƒáƒ›áƒ WAL ჩáƒáƒœáƒáƒ¬áƒ”რში მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ ბლáƒáƒ™áƒ˜áƒ¡, ID-ით %d, მáƒáƒ«áƒ”ბნისáƒáƒ¡" + +#: access/transam/xlogreader.c:2066 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, რáƒáƒªáƒ მითითებულირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბლáƒáƒ™áƒ˜ %d" + +#: access/transam/xlogreader.c:2073 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ შეკუმშული áƒáƒ¡áƒšáƒ˜ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, ბლáƒáƒ™áƒ˜ %d" + +#: access/transam/xlogreader.c:2100 access/transam/xlogreader.c:2117 +#, c-format +msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "%3$s მეთáƒáƒ“ით შეკუმშული áƒáƒ¡áƒšáƒ˜ მისáƒáƒ›áƒáƒ áƒ—ზე %1$X/%2$X, ბლáƒáƒ™áƒ˜ %4$d მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირáƒáƒ› áƒáƒ’ების მიერ" + +#: access/transam/xlogreader.c:2126 +#, c-format +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "áƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენის შეცდáƒáƒ›áƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X შეკუმშული უცნáƒáƒ‘ი მეთáƒáƒ“ით, ბლáƒáƒ™áƒ˜ %d" + +#: access/transam/xlogreader.c:2134 +#, c-format +msgid "could not decompress image at %X/%X, block %d" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ შეკუმშული áƒáƒ¡áƒšáƒ˜ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, ბლáƒáƒ™áƒ˜ %d" + +#: access/transam/xlogrecovery.c:617 +#, c-format +msgid "starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on timeline ID %u" +msgstr "იწყებრმáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ áƒáƒ¦áƒ“გენრგáƒáƒ›áƒ”áƒáƒ áƒ”ბის LSN-ით %X/%X სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილზე %X/%X დრáƒáƒ˜áƒ¡ ხáƒáƒ–ზე ID-ით %u" + +#: access/transam/xlogrecovery.c:649 +#, c-format +msgid "could not find redo location %X/%X referenced by checkpoint record at %X/%X" +msgstr "ვერ ვიპáƒáƒ•ე გáƒáƒ›áƒ”áƒáƒ áƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘რ%X/%X, რáƒáƒ›áƒ”ლსáƒáƒª მიმáƒáƒ áƒ—áƒáƒ•ს სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის ჩáƒáƒœáƒáƒ¬áƒ”რი მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogrecovery.c:651 access/transam/xlogrecovery.c:662 +#, c-format +msgid "" +"If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/standby.signal\" and add required recovery options.\n" +"If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" +"Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." +msgstr "" + +#: access/transam/xlogrecovery.c:660 +#, c-format +msgid "could not locate required checkpoint record at %X/%X" +msgstr "áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის მáƒáƒ«áƒ”ბნრშეუძლებელირმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:664 +#, c-format +msgid "could not create symbolic link \"%s\": %m" +msgstr "სიმბმულის შექმნის შეცდáƒáƒ›áƒ %s: %m" + +#: access/transam/xlogrecovery.c:723 access/transam/xlogrecovery.c:729 +#, c-format +msgid "ignoring file \"%s\" because no file \"%s\" exists" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") იგნáƒáƒ áƒ˜áƒ áƒ”ბრიმიტáƒáƒ›, რáƒáƒ› ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: access/transam/xlogrecovery.c:725 +#, c-format +msgid "File \"%s\" was renamed to \"%s\"." +msgstr "სáƒáƒ®áƒ”ლშეცვლილირ'%s' -დáƒáƒœ '%s'-ზე." + +#: access/transam/xlogrecovery.c:731 +#, c-format +msgid "Could not rename file \"%s\" to \"%s\": %m." +msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m." + +#: access/transam/xlogrecovery.c:770 +#, c-format +msgid "restarting backup recovery with redo LSN %X/%X" +msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ áƒáƒ¦áƒ“გენის თáƒáƒ•იდáƒáƒœ გáƒáƒ¨áƒ•ებრგáƒáƒ›áƒ”áƒáƒ áƒ”ბის LSN-ით %X/%X" + +#: access/transam/xlogrecovery.c:795 +#, c-format +msgid "could not locate a valid checkpoint record at %X/%X" +msgstr "სწáƒáƒ áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის ჩáƒáƒœáƒáƒ¬áƒ”რის მáƒáƒ«áƒ”ბნრშეუძლებელირმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: access/transam/xlogrecovery.c:806 +#, c-format +msgid "entering standby mode" +msgstr "უქმე რეჟიმზე გáƒáƒ“áƒáƒ áƒ—ვáƒ" + +#: access/transam/xlogrecovery.c:809 +#, c-format +msgid "starting point-in-time recovery to XID %u" +msgstr "დრáƒáƒ¨áƒ˜-მითითებული-წერტილით áƒáƒ¦áƒ“გენის დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ XID-მდე %u" + +#: access/transam/xlogrecovery.c:813 +#, c-format +msgid "starting point-in-time recovery to %s" +msgstr "დრáƒáƒ¨áƒ˜-მითითებული-წერტილით áƒáƒ¦áƒ“გენის დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ %s" + +#: access/transam/xlogrecovery.c:817 +#, c-format +msgid "starting point-in-time recovery to \"%s\"" +msgstr "დრáƒáƒ¨áƒ˜-მითითებული-წერტილით áƒáƒ¦áƒ“გენის დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ \"%s\"" + +#: access/transam/xlogrecovery.c:821 +#, c-format +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "" + +#: access/transam/xlogrecovery.c:825 +#, c-format +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "უáƒáƒ®áƒšáƒáƒ”ს თáƒáƒœáƒ›áƒ˜áƒ›áƒ“ევრულ წერტილáƒáƒ›áƒ“ე დრáƒáƒ¨áƒ˜-მითითებული-წერტილით áƒáƒ¦áƒ“გენის დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜" + +#: access/transam/xlogrecovery.c:828 +#, c-format +msgid "starting archive recovery" +msgstr "áƒáƒ áƒ¥áƒ˜áƒ•იდáƒáƒœ áƒáƒ¦áƒ“გენრდáƒáƒ˜áƒ¬áƒ§áƒ" + +#: access/transam/xlogrecovery.c:849 +#, c-format +msgid "requested timeline %u is not a child of this server's history" +msgstr "მáƒáƒ—ხáƒáƒ•ნილი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u სერვერის ისტáƒáƒ áƒ˜áƒ˜áƒ¡ შვილი áƒáƒ áƒáƒ" + +#: access/transam/xlogrecovery.c:851 +#, c-format +msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." +msgstr "" + +#: access/transam/xlogrecovery.c:865 +#, c-format +msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" +msgstr "" + +#: access/transam/xlogrecovery.c:893 +#, c-format +msgid "invalid next transaction ID" +msgstr "შემდეგი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ID" + +#: access/transam/xlogrecovery.c:898 +#, c-format +msgid "invalid redo in checkpoint record" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ›áƒ”áƒáƒ áƒ”ბრსáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის ჩáƒáƒœáƒáƒ¬áƒ”რში" + +#: access/transam/xlogrecovery.c:909 +#, c-format +msgid "invalid redo record in shutdown checkpoint" +msgstr "გáƒáƒ›áƒ”áƒáƒ áƒ”ბის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი გáƒáƒ›áƒáƒ áƒ—ვის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილში" + +#: access/transam/xlogrecovery.c:938 +#, c-format +msgid "database system was not properly shut down; automatic recovery in progress" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ áƒ—áƒ; მიმდინáƒáƒ áƒ”áƒáƒ‘ს áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ áƒáƒ¦áƒ“ეგენáƒ" + +#: access/transam/xlogrecovery.c:942 +#, c-format +msgid "crash recovery starts in timeline %u and has target timeline %u" +msgstr "áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ“áƒáƒœ áƒáƒ¦áƒ“გენრიწყებრდრáƒáƒ˜áƒ¡ ხáƒáƒ–ზე %u დრსáƒáƒ›áƒ˜áƒ–ნედ დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u áƒáƒ¥áƒ•ს" + +#: access/transam/xlogrecovery.c:985 +#, c-format +msgid "backup_label contains data inconsistent with control file" +msgstr "backup_label შეიცáƒáƒ•ს მáƒáƒœáƒáƒªáƒ”მებს, რáƒáƒ›áƒ”ლიც კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¡ áƒáƒ  შეესáƒáƒ‘áƒáƒ›áƒ”ბáƒ" + +#: access/transam/xlogrecovery.c:986 +#, c-format +msgid "This means that the backup is corrupted and you will have to use another backup for recovery." +msgstr "ეს ნიშნáƒáƒ•ს, რáƒáƒ› მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულირდრáƒáƒ¦áƒ“გენისთვის სხვრმáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებრმáƒáƒ’იწევთ." + +#: access/transam/xlogrecovery.c:1040 +#, c-format +msgid "using recovery command file \"%s\" is not supported" +msgstr "áƒáƒ¦áƒ“გენის ბრძáƒáƒœáƒ”ბის ფáƒáƒ˜áƒšáƒ˜ \"%s\" მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: access/transam/xlogrecovery.c:1105 +#, c-format +msgid "standby mode is not supported by single-user servers" +msgstr "ერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœ სერვერებს უქმე რეჟიმი áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—" + +#: access/transam/xlogrecovery.c:1122 +#, c-format +msgid "specified neither \"primary_conninfo\" nor \"restore_command\"" +msgstr "მითითებულირáƒáƒ áƒª\" primary_conninfo\" დრáƒáƒ áƒª \"restore_command\"" + +#: access/transam/xlogrecovery.c:1123 +#, c-format +msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." +msgstr "" + +#: access/transam/xlogrecovery.c:1131 +#, c-format +msgid "must specify \"restore_command\" when standby mode is not enabled" +msgstr "რáƒáƒªáƒ უქმე რეჟიმი ჩáƒáƒ áƒ—ული áƒáƒ áƒáƒ, \"restore_command\" პáƒáƒ áƒáƒ›áƒ”ტრის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: access/transam/xlogrecovery.c:1169 +#, c-format +msgid "recovery target timeline %u does not exist" +msgstr "áƒáƒ¦áƒ“გენის სáƒáƒ›áƒ˜áƒ–ნე დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %u" + +#: access/transam/xlogrecovery.c:1252 access/transam/xlogrecovery.c:1259 access/transam/xlogrecovery.c:1318 access/transam/xlogrecovery.c:1406 access/transam/xlogrecovery.c:1415 access/transam/xlogrecovery.c:1435 +#, c-format +msgid "invalid data in file \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მები ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\"" + +#: access/transam/xlogrecovery.c:1319 +#, c-format +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "დრáƒáƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებული ID %u-áƒ. მáƒáƒ•ელáƒáƒ“ი მნშვნელáƒáƒ‘áƒáƒ¡ %u." + +#: access/transam/xlogrecovery.c:1330 +#, c-format +msgid "this is an incremental backup, not a data directory" +msgstr "ეს ინკრემენტული მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ დრáƒáƒ áƒ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე" + +#: access/transam/xlogrecovery.c:1331 +#, c-format +msgid "Use pg_combinebackup to reconstruct a valid data directory." +msgstr "სწáƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒ’ებáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ბრძáƒáƒœáƒ”ბრpg_combinebackup." + +#: access/transam/xlogrecovery.c:1717 +#, c-format +msgid "unexpected record type found at redo point %X/%X" +msgstr "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირმáƒáƒ£áƒšáƒáƒ“ნელი ჩáƒáƒœáƒáƒ¬áƒ”რის ტიპი გáƒáƒ›áƒ”áƒáƒ áƒ”ბის წერტილზე %X/%X" + +#: access/transam/xlogrecovery.c:1740 +#, c-format +msgid "redo starts at %X/%X" +msgstr "გáƒáƒ›áƒ”áƒáƒ áƒ”ბრდáƒáƒ˜áƒ¬áƒ§áƒ”ბრმისáƒáƒ›áƒáƒ áƒ—იდáƒáƒœ %X/%X" + +#: access/transam/xlogrecovery.c:1753 +#, c-format +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს გáƒáƒ›áƒ”áƒáƒ áƒ”ბáƒ. გáƒáƒ¡áƒ£áƒšáƒ˜ დრáƒ: %ld.%02d მიმდინáƒáƒ áƒ” LSN: %X/%X" + +#: access/transam/xlogrecovery.c:1843 +#, c-format +msgid "requested recovery stop point is before consistent recovery point" +msgstr "მáƒáƒ—ხáƒáƒ•ნილი áƒáƒ¦áƒ“გენის წერტილი მუდმივი áƒáƒ¦áƒ“გენის წერტილáƒáƒ›áƒ“ეáƒ" + +#: access/transam/xlogrecovery.c:1875 +#, c-format +msgid "redo done at %X/%X system usage: %s" +msgstr "გáƒáƒ›áƒ”áƒáƒ áƒ”ბრდáƒáƒ¡áƒ áƒ£áƒšáƒ“რ%X/%X -სთáƒáƒœ. სისტემის დáƒáƒ¢áƒ•ირთვáƒ: %s" + +#: access/transam/xlogrecovery.c:1881 +#, c-format +msgid "last completed transaction was at log time %s" +msgstr "უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ მáƒáƒ®áƒ“რჟურნáƒáƒšáƒ˜áƒ¡ დრáƒáƒ˜áƒ— %s" + +#: access/transam/xlogrecovery.c:1890 +#, c-format +msgid "redo is not required" +msgstr "გáƒáƒ›áƒ”áƒáƒ áƒ”ბრსáƒáƒ­áƒ˜áƒ áƒ áƒáƒ áƒáƒ" + +#: access/transam/xlogrecovery.c:1901 +#, c-format +msgid "recovery ended before configured recovery target was reached" +msgstr "áƒáƒ¦áƒ“გენრმითითებული áƒáƒ¦áƒ“გენის სáƒáƒ›áƒ˜áƒ–ნის მიღწევáƒáƒ›áƒ“ე დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ" + +#: access/transam/xlogrecovery.c:2095 +#, c-format +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "" + +#: access/transam/xlogrecovery.c:2162 +#, c-format +msgid "unexpected directory entry \"%s\" found in %s" +msgstr "%2$s-ში ნáƒáƒžáƒáƒ•ნირმáƒáƒ£áƒšáƒáƒ“ნელი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ჩáƒáƒœáƒáƒ¬áƒ”რი \"%1$s\"" + +#: access/transam/xlogrecovery.c:2164 +#, c-format +msgid "All directory entries in pg_tblspc/ should be symbolic links." +msgstr "ყველრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ტიპის ელემენტი ph_tblspc/-ში სიმბმულს უნდრწáƒáƒ áƒ›áƒáƒáƒ“გენდეს." + +#: access/transam/xlogrecovery.c:2165 +#, c-format +msgid "Remove those directories, or set \"allow_in_place_tablespaces\" to ON transiently to let recovery complete." +msgstr "" + +#: access/transam/xlogrecovery.c:2217 +#, c-format +msgid "completed backup recovery with redo LSN %X/%X and end LSN %X/%X" +msgstr "" + +#: access/transam/xlogrecovery.c:2247 +#, c-format +msgid "consistent recovery state reached at %X/%X" +msgstr "თáƒáƒœáƒ›áƒ˜áƒ›áƒ“ევრული áƒáƒ¦áƒ“გენის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘რმიღწეულირმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2285 +#, c-format +msgid "WAL redo at %X/%X for %s" +msgstr "WAL გáƒáƒ›áƒ”áƒáƒ áƒ”ბრ%X/%X %s-სთვის" + +#: access/transam/xlogrecovery.c:2383 +#, c-format +msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი წინრდრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID %u (მიმდინáƒáƒ áƒ” დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID %u) სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის ჩáƒáƒœáƒáƒ¬áƒ”რში" + +#: access/transam/xlogrecovery.c:2392 +#, c-format +msgid "unexpected timeline ID %u (after %u) in checkpoint record" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID %u (%u-ის შემდეგ) სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის ჩáƒáƒœáƒáƒ¬áƒ”რში" + +#: access/transam/xlogrecovery.c:2408 +#, c-format +msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" +msgstr "" + +#: access/transam/xlogrecovery.c:2592 access/transam/xlogrecovery.c:2868 +#, c-format +msgid "recovery stopping after reaching consistency" +msgstr "áƒáƒ¦áƒ“გენრშეთáƒáƒœáƒ®áƒ›áƒ”ბული მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის მიღწევისáƒáƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ“ებáƒ" + +#: access/transam/xlogrecovery.c:2613 +#, c-format +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "áƒáƒ¦áƒ“გენრშეწყდრWAL-ის მდებáƒáƒ áƒ”áƒáƒ‘áƒáƒ›áƒ“ე (LSN) \"%X/%X\"" + +#: access/transam/xlogrecovery.c:2703 +#, c-format +msgid "recovery stopping before commit of transaction %u, time %s" +msgstr "áƒáƒ¦áƒ“გენრშეწყდრტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ (%u) გáƒáƒ“áƒáƒªáƒ”მáƒáƒ›áƒ“ე. დრრ%s" + +#: access/transam/xlogrecovery.c:2710 +#, c-format +msgid "recovery stopping before abort of transaction %u, time %s" +msgstr "áƒáƒ¦áƒ“გენრშეწყდრტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ (%u) გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒáƒ›áƒ“ე. დრრ%s" + +#: access/transam/xlogrecovery.c:2763 +#, c-format +msgid "recovery stopping at restore point \"%s\", time %s" +msgstr "áƒáƒ¦áƒ“გენრშეწყდრáƒáƒ¦áƒ“გენის წერტილთáƒáƒœ \"%s\". დრრ%s" + +#: access/transam/xlogrecovery.c:2781 +#, c-format +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "áƒáƒ¦áƒ“გენრშეწყდრWAL-ის მდებáƒáƒ áƒ”áƒáƒ‘áƒáƒ›áƒ“ე (LSN) \"%X/%X\"" + +#: access/transam/xlogrecovery.c:2848 +#, c-format +msgid "recovery stopping after commit of transaction %u, time %s" +msgstr "áƒáƒ¦áƒ“გენრშეწყდრტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ (%u) გáƒáƒ“áƒáƒªáƒ”მáƒáƒ›áƒ“ე. დრრ%s" + +#: access/transam/xlogrecovery.c:2856 +#, c-format +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "áƒáƒ¦áƒ“გენრტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ (%u) გáƒáƒ£áƒ¥áƒ›áƒ”ბის შემდეგ შეწყდáƒ. დრრ%s" + +#: access/transam/xlogrecovery.c:2937 +#, c-format +msgid "pausing at the end of recovery" +msgstr "შეჩერებრáƒáƒ¦áƒ“გენის ბáƒáƒšáƒáƒ¡" + +#: access/transam/xlogrecovery.c:2938 +#, c-format +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "წáƒáƒ¡áƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბლáƒáƒ“ გáƒáƒ£áƒ¨áƒ•ით pg_wal_replay_resume()." + +#: access/transam/xlogrecovery.c:2941 access/transam/xlogrecovery.c:4678 +#, c-format +msgid "recovery has paused" +msgstr "áƒáƒ¦áƒ“გენრშეჩერდáƒ" + +#: access/transam/xlogrecovery.c:2942 +#, c-format +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "გáƒáƒ¡áƒáƒ’რძელებლáƒáƒ“ გáƒáƒ£áƒ¨áƒ•ით pg_wal_replay_resume()." + +#: access/transam/xlogrecovery.c:3205 +#, c-format +msgid "unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID %u WAL სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u" + +#: access/transam/xlogrecovery.c:3413 +#, c-format +msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: %m" +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტიდáƒáƒœ (%s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: access/transam/xlogrecovery.c:3420 +#, c-format +msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu" +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტიდáƒáƒœ (%s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ•იკითხე %d %zu-დáƒáƒœ" + +#: access/transam/xlogrecovery.c:4060 +#, c-format +msgid "invalid checkpoint location" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘áƒ" + +#: access/transam/xlogrecovery.c:4070 +#, c-format +msgid "invalid checkpoint record" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი" + +#: access/transam/xlogrecovery.c:4076 +#, c-format +msgid "invalid resource manager ID in checkpoint record" +msgstr "რესურსის მმáƒáƒ áƒ—ველის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ID სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის ჩáƒáƒœáƒáƒ¬áƒ”რში" + +#: access/transam/xlogrecovery.c:4084 +#, c-format +msgid "invalid xl_info in checkpoint record" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ xl_info" + +#: access/transam/xlogrecovery.c:4090 +#, c-format +msgid "invalid length of checkpoint record" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე" + +#: access/transam/xlogrecovery.c:4144 +#, c-format +msgid "new timeline %u is not a child of database system timeline %u" +msgstr "áƒáƒ®áƒáƒšáƒ˜ დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u ბáƒáƒ–ის სისტემის დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის %u შვილი áƒáƒ áƒáƒ" + +#: access/transam/xlogrecovery.c:4158 +#, c-format +msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" +msgstr "" + +#: access/transam/xlogrecovery.c:4177 +#, c-format +msgid "new target timeline is %u" +msgstr "áƒáƒ®áƒáƒšáƒ˜ სáƒáƒ›áƒ˜áƒ–ნის დრáƒáƒ˜áƒ¡ ხáƒáƒ–ირ%u" + +#: access/transam/xlogrecovery.c:4380 +#, c-format +msgid "WAL receiver process shutdown requested" +msgstr "მáƒáƒ—ხáƒáƒ•ნილირWAL-ის მიმღები პრáƒáƒªáƒ”სის გáƒáƒ›áƒáƒ áƒ—ვáƒ" + +#: access/transam/xlogrecovery.c:4440 +#, c-format +msgid "received promote request" +msgstr "მიღებულრდáƒáƒ¬áƒ˜áƒœáƒáƒ£áƒ áƒ”ბის მáƒáƒ—ხáƒáƒ•ნáƒ" + +#: access/transam/xlogrecovery.c:4669 +#, c-format +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "ცხელი მáƒáƒ›áƒšáƒáƒ“ინე სერვერის áƒáƒ áƒ¡áƒ”ბáƒáƒ‘რშეუძლებელირáƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘ების გáƒáƒ›áƒ" + +#: access/transam/xlogrecovery.c:4670 access/transam/xlogrecovery.c:4697 access/transam/xlogrecovery.c:4727 +#, c-format +msgid "%s = %d is a lower setting than on the primary server, where its value was %d." +msgstr "%s = %d ნáƒáƒ™áƒšáƒ”ბიáƒ, ვიდრე ძირითáƒáƒ“ სერვერზე, სáƒáƒ“áƒáƒª მისი მნიშვნელáƒáƒ‘áƒáƒ %d." + +#: access/transam/xlogrecovery.c:4679 +#, c-format +msgid "If recovery is unpaused, the server will shut down." +msgstr "თუ áƒáƒ¦áƒ“გენრგáƒáƒ’რძელდებáƒ, სერვერი გáƒáƒ›áƒáƒ˜áƒ áƒ—ვებáƒ." + +#: access/transam/xlogrecovery.c:4680 +#, c-format +msgid "You can then restart the server after making the necessary configuration changes." +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ¨áƒ˜ სáƒáƒ­áƒ˜áƒ áƒ ცვლილებების შეტáƒáƒœáƒ˜áƒ¡ შემდეგ შეგიძლიáƒáƒ— სერვერი დáƒáƒáƒ áƒ”სტáƒáƒ áƒ¢áƒáƒ—." + +#: access/transam/xlogrecovery.c:4691 +#, c-format +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "დáƒáƒ¬áƒ˜áƒœáƒáƒ£áƒ áƒ”ბრშეუძლებელირáƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრების მნიშვნელáƒáƒ‘ების გáƒáƒ›áƒ" + +#: access/transam/xlogrecovery.c:4701 +#, c-format +msgid "Restart the server after making the necessary configuration changes." +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ¨áƒ˜ სáƒáƒ­áƒ˜áƒ áƒ ცვლილებების შეტáƒáƒœáƒ˜áƒ¡ შემდეგ გáƒáƒ“áƒáƒ¢áƒ•ირთეთ სერვერი." + +#: access/transam/xlogrecovery.c:4725 +#, c-format +msgid "recovery aborted because of insufficient parameter settings" +msgstr "áƒáƒ¦áƒ“გენრშეწყვეტილირáƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრების მნიშვნელáƒáƒ‘ების გáƒáƒ›áƒ" + +#: access/transam/xlogrecovery.c:4731 +#, c-format +msgid "You can restart the server after making the necessary configuration changes." +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ¨áƒ˜ სáƒáƒ­áƒ˜áƒ áƒ ცვლილებების შეტáƒáƒœáƒ˜áƒ¡ შემდეგ შეგიძლიáƒáƒ— სერვერი დáƒáƒáƒ áƒ”სტáƒáƒ áƒ¢áƒáƒ—." + +#: access/transam/xlogrecovery.c:4773 +#, c-format +msgid "multiple recovery targets specified" +msgstr "მითითებულირáƒáƒ¦áƒ“გენის მრáƒáƒ•áƒáƒšáƒ˜ სáƒáƒ›áƒ˜áƒ–ნე" + +#: access/transam/xlogrecovery.c:4774 +#, c-format +msgid "At most one of \"recovery_target\", \"recovery_target_lsn\", \"recovery_target_name\", \"recovery_target_time\", \"recovery_target_xid\" may be set." +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრებიდáƒáƒœ \"recovery_target\", \"recovery_target_lsn\", \"recovery_target_name\", \"recovery_target_time\" დრ\"recovery_target_xid\" მხáƒáƒšáƒáƒ“ ერთის დáƒáƒ§áƒ”ნებრშეგიძლიáƒáƒ—." + +#: access/transam/xlogrecovery.c:4785 +#, c-format +msgid "The only allowed value is \"immediate\"." +msgstr "დáƒáƒ¨áƒ•ებულირმხáƒáƒšáƒáƒ“ ერთი მნიშვნელáƒáƒ‘áƒ: \"immediate\"." + +#: access/transam/xlogrecovery.c:4937 utils/adt/timestamp.c:202 utils/adt/timestamp.c:455 +#, c-format +msgid "timestamp out of range: \"%s\"" +msgstr "დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: \"%s\"" + +#: access/transam/xlogrecovery.c:4982 +#, c-format +msgid "\"recovery_target_timeline\" is not a valid number." +msgstr "\"recovery_target_timeline\" სწáƒáƒ áƒ˜ რიცხვი áƒáƒ áƒáƒ." + +#: access/transam/xlogutils.c:1032 +#, c-format +msgid "could not read from WAL segment %s, offset %d: %m" +msgstr "'WAL'-ის სეგმენტიდáƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ %s, წáƒáƒœáƒáƒªáƒ•ლებრ%d: %m" + +#: access/transam/xlogutils.c:1039 +#, c-format +msgid "could not read from WAL segment %s, offset %d: read %d of %d" +msgstr "'WAL'-ის სეგმენტიდáƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ %s, წáƒáƒœáƒáƒªáƒ•ლებრ%d: წáƒáƒ™áƒ˜áƒ—ხულირ%d %d-დáƒáƒœ" + +#: archive/shell_archive.c:98 +#, c-format +msgid "archive command failed with exit code %d" +msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒáƒªáƒ˜áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის შეცდáƒáƒ›áƒ. შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %d" + +#: archive/shell_archive.c:100 archive/shell_archive.c:110 archive/shell_archive.c:116 archive/shell_archive.c:125 +#, c-format +msgid "The failed archive command was: %s" +msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ირების წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბლáƒáƒ“ გáƒáƒ¨áƒ•ებული ბრძáƒáƒœáƒ”ბრიყáƒ: %s" + +#: archive/shell_archive.c:107 +#, c-format +msgid "archive command was terminated by exception 0x%X" +msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒáƒªáƒ˜áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბრდáƒáƒ¡áƒ áƒ£áƒšáƒ“რგáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ— 0x%X" + +#: archive/shell_archive.c:109 postmaster/postmaster.c:3094 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "თექვსმეტáƒáƒ‘ითი მნიშვნელáƒáƒ‘ის áƒáƒ¦áƒ¬áƒ”რისთვის იხილეთ C-ის ჩáƒáƒ¡áƒáƒ¡áƒ›áƒ”ლი ფáƒáƒ˜áƒšáƒ˜ \"ntstatus.h\"." + +#: archive/shell_archive.c:114 +#, c-format +msgid "archive command was terminated by signal %d: %s" +msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒáƒªáƒ˜áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბრდáƒáƒ¡áƒ áƒ£áƒšáƒ“რსიგნáƒáƒšáƒ˜áƒ— %d: %s" + +#: archive/shell_archive.c:123 +#, c-format +msgid "archive command exited with unrecognized status %d" +msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის ბრძáƒáƒœáƒ”ბრუცნáƒáƒ‘ი სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ: %d" + +#: backup/backup_manifest.c:254 +#, c-format +msgid "expected end timeline %u but found timeline %u" +msgstr "მáƒáƒ•ელáƒáƒ“ი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის (%u) ბáƒáƒšáƒáƒ¡, მáƒáƒ’რáƒáƒ› ნáƒáƒžáƒáƒ•ნირდრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u" + +#: backup/backup_manifest.c:278 +#, c-format +msgid "expected start timeline %u but found timeline %u" +msgstr "მáƒáƒ•ელáƒáƒ“ი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის (%u) დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ¡, მáƒáƒ’რáƒáƒ› ნáƒáƒžáƒáƒ•ნირდრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u" + +#: backup/backup_manifest.c:305 +#, c-format +msgid "start timeline %u not found in history of timeline %u" +msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის %u დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის %u ისტáƒáƒ áƒ˜áƒáƒ¨áƒ˜ áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ" + +#: backup/backup_manifest.c:356 +#, c-format +msgid "could not rewind temporary file" +msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ“áƒáƒ®áƒ•ევის შეცდáƒáƒ›áƒ" + +#: backup/basebackup.c:479 +#, c-format +msgid "could not find any WAL files" +msgstr "ვერცერთი WAL ფáƒáƒ˜áƒšáƒ˜ ვერ ვიპáƒáƒ•ე" + +#: backup/basebackup.c:494 backup/basebackup.c:509 backup/basebackup.c:518 +#, c-format +msgid "could not find WAL file \"%s\"" +msgstr "\"WAL\" ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") მáƒáƒ«áƒ”ბნრშეუძლებელიáƒ" + +#: backup/basebackup.c:560 backup/basebackup.c:585 +#, c-format +msgid "unexpected WAL file size \"%s\"" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ \"%s\"" + +#: backup/basebackup.c:656 +#, c-format +msgid "%lld total checksum verification failure" +msgid_plural "%lld total checksum verification failures" +msgstr[0] "ჯáƒáƒ›áƒ¨áƒ˜ %lld სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ" +msgstr[1] "ჯáƒáƒ›áƒ¨áƒ˜ %lld სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ" + +#: backup/basebackup.c:663 +#, c-format +msgid "checksum verification failure during base backup" +msgstr "ბáƒáƒ–ის მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ" + +#: backup/basebackup.c:733 backup/basebackup.c:742 backup/basebackup.c:753 backup/basebackup.c:770 backup/basebackup.c:779 backup/basebackup.c:788 backup/basebackup.c:803 backup/basebackup.c:820 backup/basebackup.c:829 backup/basebackup.c:841 backup/basebackup.c:865 backup/basebackup.c:879 backup/basebackup.c:890 backup/basebackup.c:901 backup/basebackup.c:914 +#, c-format +msgid "duplicate option \"%s\"" +msgstr "დუბლიკáƒáƒ¢áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\"" + +#: backup/basebackup.c:761 +#, c-format +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის უცნáƒáƒ‘ი ტიპი: \"%s\"" + +#: backup/basebackup.c:793 +#, c-format +msgid "incremental backups cannot be taken unless WAL summarization is enabled" +msgstr "ინკრემენტული მáƒáƒ áƒ¥áƒáƒ¤áƒ”ბის áƒáƒ¦áƒ”ბრშეუძლებელიáƒ, სáƒáƒœáƒáƒ› WAL შეჯáƒáƒ›áƒ”ბáƒáƒ¡ áƒáƒ  ჩáƒáƒ áƒ—áƒáƒ•თ" + +#: backup/basebackup.c:809 +#, c-format +msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "%d პáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\" დáƒáƒ¡áƒáƒ¨áƒ•ებ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ (%d .. %d) გáƒáƒ áƒ”თáƒáƒ" + +#: backup/basebackup.c:854 +#, c-format +msgid "unrecognized manifest option: \"%s\"" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: backup/basebackup.c:905 +#, c-format +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "შეკუმშვის უცხრáƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მი: \"%s\"" + +#: backup/basebackup.c:921 +#, c-format +msgid "unrecognized base backup option: \"%s\"" +msgstr "ბáƒáƒ–ის მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: backup/basebackup.c:932 +#, c-format +msgid "manifest checksums require a backup manifest" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბს მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ მáƒáƒœáƒ˜áƒ¤áƒ”სტი ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ" + +#: backup/basebackup.c:941 +#, c-format +msgid "target detail cannot be used without target" +msgstr "სáƒáƒ›áƒ˜áƒ–ნის დეტáƒáƒšáƒ¡ სáƒáƒ›áƒ˜áƒ–ნის გáƒáƒ áƒ”შე ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: backup/basebackup.c:950 backup/basebackup_target.c:218 +#, c-format +msgid "target \"%s\" does not accept a target detail" +msgstr "სáƒáƒ›áƒ˜áƒ–ნეს \"%s\" სáƒáƒ›áƒ˜áƒ–ნის დეტáƒáƒšáƒ”ბის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: backup/basebackup.c:961 +#, c-format +msgid "compression detail cannot be specified unless compression is enabled" +msgstr "შეკუმშვის დეტáƒáƒšáƒ”ბს ვერ დáƒáƒáƒ§áƒ”ნებთ, სáƒáƒœáƒáƒ› შეკუმშვრჩáƒáƒ áƒ—ული áƒáƒ áƒáƒ" + +#: backup/basebackup.c:974 +#, c-format +msgid "invalid compression specification: %s" +msgstr "შეკუმშვის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციფიკáƒáƒªáƒ˜áƒ: %s" + +#: backup/basebackup.c:1024 +#, c-format +msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" +msgstr "ინკრემენტული BASE_BACKUP-ის შესრულებáƒáƒ›áƒ“ე áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირUPLOAD_MANIFEST" + +#: backup/basebackup.c:1157 backup/basebackup.c:1358 +#, c-format +msgid "could not stat file or directory \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒœ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის \"%s\" პáƒáƒ•ნრშეუძლებელიáƒ: %m" + +#: backup/basebackup.c:1544 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "სპეციáƒáƒšáƒ£áƒ áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒ•ებრ\"%s\"" + +#: backup/basebackup.c:1751 +#, c-format +msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბრშეუძლებელირფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\", ბლáƒáƒ™áƒ˜ %u: წáƒáƒ™áƒ˜áƒ—ხვის ბუფერის ზáƒáƒ›áƒ %d დრგვერდის ზáƒáƒ›áƒ %d გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•დებáƒ" + +#: backup/basebackup.c:1813 +#, c-format +msgid "file \"%s\" has a total of %d checksum verification failure" +msgid_plural "file \"%s\" has a total of %d checksum verification failures" +msgstr[0] "ფáƒáƒ˜áƒšáƒ¡ \"%s\" სულ %d სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბის ჩáƒáƒ•áƒáƒ áƒ“ნრáƒáƒ¦áƒ›áƒáƒáƒ©áƒœáƒ“áƒ" +msgstr[1] "ფáƒáƒ˜áƒšáƒ¡ \"%s\" სულ %d სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბის ჩáƒáƒ•áƒáƒ áƒ“ნრáƒáƒ¦áƒ›áƒáƒáƒ©áƒœáƒ“áƒ" + +#: backup/basebackup.c:1917 +#, c-format +msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ—ვლის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\", ბლáƒáƒ™áƒ˜ \"%u\": გáƒáƒ›áƒáƒ—ვლილი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ %X, მáƒáƒ’რáƒáƒ› მáƒáƒ•ელáƒáƒ“ი: %X" + +#: backup/basebackup.c:1924 +#, c-format +msgid "further checksum verification failures in file \"%s\" will not be reported" +msgstr "áƒáƒ›áƒ˜áƒ¡ შემდეგ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" შეხვედრილი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბის ჩáƒáƒ•áƒáƒ áƒ“ნები áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ¨áƒ˜ áƒáƒ¦áƒáƒ  გáƒáƒ›áƒáƒ©áƒœáƒ“ებáƒ" + +#: backup/basebackup.c:2048 +#, c-format +msgid "file name too long for tar format: \"%s\"" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი ძáƒáƒšáƒ˜áƒáƒœ გრძელირtar ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡áƒ—ვის: \"%s\"" + +#: backup/basebackup.c:2053 +#, c-format +msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" +msgstr "სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმულის სáƒáƒ›áƒ˜áƒ–ნე ძáƒáƒšáƒ˜áƒáƒœ გრძელირtar ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡áƒ—ვის: ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი '%s', სáƒáƒ›áƒ˜áƒ–ნე '%s'" + +#: backup/basebackup.c:2127 +#, c-format +msgid "could not read file \"%s\": read %zd of %zu" +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" ვერ წáƒáƒ•იკითხე: წáƒáƒ™áƒ˜áƒ—ხულირ%zd %zu-დáƒáƒœ" + +#: backup/basebackup_gzip.c:67 +#, c-format +msgid "gzip compression is not supported by this build" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ gzip შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: backup/basebackup_gzip.c:143 +#, c-format +msgid "could not initialize compression library" +msgstr "შეკუმშვის ბიბლიáƒáƒ—ეკის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: backup/basebackup_incremental.c:300 +#, c-format +msgid "manifest contains no required WAL ranges" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელ WAL შუáƒáƒšáƒ”დებს áƒáƒ  შეიცáƒáƒ•ს" + +#: backup/basebackup_incremental.c:355 +#, c-format +msgid "timeline %u found in manifest, but not in this server's history" +msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u ვიპáƒáƒ•ე მáƒáƒœáƒ˜áƒ¤áƒ”სტში, სერვერის ისტáƒáƒ áƒ˜áƒáƒ¨áƒ˜ კი - ვერáƒ" + +#: backup/basebackup_incremental.c:420 +#, c-format +msgid "manifest requires WAL from initial timeline %u starting at %X/%X, but that timeline begins at %X/%X" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტი მáƒáƒ˜áƒ—ხáƒáƒ•ს WAL-ს სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ დრáƒáƒ˜áƒ¡ ხáƒáƒ–იდáƒáƒœ %u სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ წერტილით %X/%X, მáƒáƒ’რáƒáƒ› დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი იწყებრმნიშვნელáƒáƒ‘áƒáƒ–ე %X/%X" + +#: backup/basebackup_incremental.c:430 +#, c-format +msgid "manifest requires WAL from continuation timeline %u starting at %X/%X, but that timeline begins at %X/%X" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტი მáƒáƒ˜áƒ—ხáƒáƒ•ს WAL-ს გáƒáƒ’რძელების დრáƒáƒ˜áƒ¡ ხáƒáƒ–იდáƒáƒœ %u სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ წერტილით %X/%X, მáƒáƒ’რáƒáƒ› დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი იწყებრმნიშვნელáƒáƒ‘áƒáƒ–ე %X/%X" + +#: backup/basebackup_incremental.c:441 +#, c-format +msgid "manifest requires WAL from final timeline %u ending at %X/%X, but this backup starts at %X/%X" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტი მáƒáƒ˜áƒ—ხáƒáƒ•ს WAL-ს ფინáƒáƒšáƒ£áƒ áƒ˜ დრáƒáƒ˜áƒ¡ ხáƒáƒ–იდáƒáƒœ %u სáƒáƒ‘áƒáƒšáƒáƒ წერტილით %X/%X, მáƒáƒ’რáƒáƒ› ეს მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ იწყებრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: backup/basebackup_incremental.c:451 +#, c-format +msgid "manifest requires WAL from non-final timeline %u ending at %X/%X, but this server switched timelines at %X/%X" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტი მáƒáƒ˜áƒ—ხáƒáƒ•ს WAL-ს áƒáƒ áƒáƒ¤áƒ˜áƒœáƒáƒšáƒ£áƒ áƒ˜ დრáƒáƒ˜áƒ¡ ხáƒáƒ–იდáƒáƒœ %u სáƒáƒ‘áƒáƒšáƒáƒ წერტილით %X/%X, მáƒáƒ’რáƒáƒ› áƒáƒ› სერვერმრგáƒáƒ“áƒáƒ áƒ—რდრáƒáƒ˜áƒ¡ ხáƒáƒ–ები მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: backup/basebackup_incremental.c:518 +#, c-format +msgid "WAL summarization is not progressing" +msgstr "" + +#: backup/basebackup_incremental.c:519 +#, c-format +msgid "Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/%X in memory." +msgstr "" + +#: backup/basebackup_incremental.c:532 +#, c-format +msgid "still waiting for WAL summarization through %X/%X after %ld seconds" +msgstr "" + +#: backup/basebackup_incremental.c:535 +#, c-format +msgid "Summarization has reached %X/%X on disk and %X/%X in memory." +msgstr "" + +#: backup/basebackup_incremental.c:604 +#, c-format +msgid "WAL summaries are required on timeline %u from %X/%X to %X/%X, but no summaries for that timeline and LSN range exist" +msgstr "" + +#: backup/basebackup_incremental.c:611 +#, c-format +msgid "WAL summaries are required on timeline %u from %X/%X to %X/%X, but the summaries for that timeline and LSN range are incomplete" +msgstr "" + +#: backup/basebackup_incremental.c:615 +#, c-format +msgid "The first unsummarized LSN in this range is %X/%X." +msgstr "" + +#: backup/basebackup_incremental.c:1015 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ მáƒáƒœáƒ˜áƒ¤áƒ”სტის ვერსიáƒáƒ¡ 1 ინკრემენტული მáƒáƒ áƒ¥áƒáƒ¤áƒ”ბის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: backup/basebackup_incremental.c:1033 +#, c-format +msgid "manifest system identifier is %llu, but database system identifier is %llu" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სისტემის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ %llu, მáƒáƒ’რáƒáƒ› კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜s მნიშვნელáƒáƒ‘áƒáƒ %llu" + +#: backup/basebackup_lz4.c:67 +#, c-format +msgid "lz4 compression is not supported by this build" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ lz4 შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: backup/basebackup_server.c:73 +#, c-format +msgid "permission denied to create backup stored on server" +msgstr "სერვერზე დáƒáƒ¡áƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებელი მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ შექმნის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: backup/basebackup_server.c:74 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may create a backup stored on the server." +msgstr "სერვერზე შენáƒáƒ®áƒ£áƒšáƒ˜ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ \"%s\" რáƒáƒšáƒ˜áƒ¡ პრივილეგიებირსáƒáƒ­áƒ˜áƒ áƒ." + +#: backup/basebackup_server.c:89 +#, c-format +msgid "relative path not allowed for backup stored on server" +msgstr "სერვერზე დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებული მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡áƒ—ვის ფáƒáƒ áƒ“áƒáƒ‘ითი ბილიკი დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: backup/basebackup_server.c:102 commands/dbcommands.c:477 commands/tablespace.c:157 commands/tablespace.c:173 commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:1986 storage/file/copydir.c:47 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m" + +#: backup/basebackup_server.c:115 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ áƒáƒ" + +#: backup/basebackup_server.c:123 utils/init/postinit.c:1177 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 backup/basebackup_server.c:268 backup/basebackup_server.c:275 backup/walsummary.c:312 storage/smgr/md.c:502 storage/smgr/md.c:509 storage/smgr/md.c:591 storage/smgr/md.c:613 storage/smgr/md.c:999 +#, c-format +msgid "Check free disk space." +msgstr "შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ, დისკზე áƒáƒ“გილი დáƒáƒ áƒ©áƒ, თუ áƒáƒ áƒ." + +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 backup/walsummary.c:309 +#, c-format +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: ჩáƒáƒ•წერე მხáƒáƒšáƒáƒ“ %d ბáƒáƒ˜áƒ¢áƒ˜ %d-დáƒáƒœ , წáƒáƒœáƒáƒªáƒ•ლებáƒáƒ–ე %u" + +#: backup/basebackup_target.c:146 +#, c-format +msgid "unrecognized target: \"%s\"" +msgstr "უცნáƒáƒ‘ი სáƒáƒ›áƒ˜áƒ–ნე: \"%s\"" + +#: backup/basebackup_target.c:237 +#, c-format +msgid "target \"%s\" requires a target detail" +msgstr "სáƒáƒ›áƒ˜áƒ–ნეს \"%s\" სáƒáƒ›áƒ˜áƒ–ნის დეტáƒáƒšáƒ”ბი ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ" + +#: backup/basebackup_zstd.c:66 +#, c-format +msgid "zstd compression is not supported by this build" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ zstd შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: backup/basebackup_zstd.c:117 +#, c-format +msgid "could not set compression worker count to %d: %s" +msgstr "შეკუმშვის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების რიცხვის %d-ზე დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" + +#: backup/basebackup_zstd.c:129 +#, c-format +msgid "could not enable long-distance mode: %s" +msgstr "long-distance რეჟიმი ვერ ჩáƒáƒ•რთე: %s" + +#: backup/walsummaryfuncs.c:95 +#, c-format +msgid "invalid timeline %lld" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %lld" + +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:623 tcop/postgres.c:3859 +#, c-format +msgid "--%s requires a value" +msgstr "--%s მნიშვნელáƒáƒ‘რსჭირდებáƒ" + +#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:628 tcop/postgres.c:3864 +#, c-format +msgid "-c %s requires a value" +msgstr "-c %s მნიშვნელáƒáƒ‘რსჭირდებáƒ" + +#: bootstrap/bootstrap.c:282 postmaster/postmaster.c:746 postmaster/postmaster.c:759 +#, c-format +msgid "Try \"%s --help\" for more information.\n" +msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'.\n" + +#: bootstrap/bootstrap.c:291 +#, c-format +msgid "%s: invalid command-line arguments\n" +msgstr "%s: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტები\n" + +#: catalog/aclchk.c:210 +#, c-format +msgid "grant options can only be granted to roles" +msgstr "უფლებების უფლების მიცემრმხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბზერშესáƒáƒ«áƒšáƒ”ბელი" + +#: catalog/aclchk.c:332 +#, c-format +msgid "no privileges were granted for column \"%s\" of relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘ის %2$s სვეტის %1$s პრივილეგიები მინიჭებული áƒáƒ áƒáƒ" + +#: catalog/aclchk.c:337 +#, c-format +msgid "no privileges were granted for \"%s\"" +msgstr "áƒáƒ‘იექტს \"%s\" პრივილეგიები მინიჭებული áƒáƒ  áƒáƒ¥áƒ•ს" + +#: catalog/aclchk.c:345 +#, c-format +msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘ის %2$s სვეტის %1$s ყველრპრივილეგირმინიჭებული áƒáƒ áƒáƒ" + +#: catalog/aclchk.c:350 +#, c-format +msgid "not all privileges were granted for \"%s\"" +msgstr "\"%s\"-სთვის სáƒáƒ­áƒ˜áƒ áƒ ყველრუფლებრმინიჭებული áƒáƒ  ყáƒáƒ¤áƒ˜áƒšáƒ" + +#: catalog/aclchk.c:361 +#, c-format +msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘ის %2$s სვეტის %1$s მáƒáƒ¡áƒáƒ®áƒ¡áƒœáƒ”ლი პრივილეგიები áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/aclchk.c:366 +#, c-format +msgid "no privileges could be revoked for \"%s\"" +msgstr "%s-სთვის უფლებები áƒáƒ  გáƒáƒ£áƒ¥áƒ›áƒ“ებáƒ" + +#: catalog/aclchk.c:374 +#, c-format +msgid "not all privileges could be revoked for column \"%s\" of relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘ის %2$s სვეტს %1$s ყველრპრივილეგიáƒáƒ¡ ვერ მáƒáƒ®áƒ¡áƒœáƒ˜áƒ—" + +#: catalog/aclchk.c:379 +#, c-format +msgid "not all privileges could be revoked for \"%s\"" +msgstr "\"%s\"-ზე ყველრპრივილეგიის გáƒáƒ£áƒ¥áƒ›áƒ”ბრშეუძლებელიáƒ" + +#: catalog/aclchk.c:411 +#, c-format +msgid "grantor must be current user" +msgstr "მიმნიჭებელი მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრიყáƒáƒ¡" + +#: catalog/aclchk.c:479 catalog/aclchk.c:1054 +#, c-format +msgid "invalid privilege type %s for relation" +msgstr "ურთიერთáƒáƒ‘ის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:483 catalog/aclchk.c:1058 +#, c-format +msgid "invalid privilege type %s for sequence" +msgstr "მიმდევრáƒáƒ‘ის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:487 +#, c-format +msgid "invalid privilege type %s for database" +msgstr "ბáƒáƒ–ის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:491 +#, c-format +msgid "invalid privilege type %s for domain" +msgstr "დáƒáƒ›áƒ”ნის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:495 catalog/aclchk.c:1062 +#, c-format +msgid "invalid privilege type %s for function" +msgstr "ფუნქციის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:499 +#, c-format +msgid "invalid privilege type %s for language" +msgstr "ენის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:503 +#, c-format +msgid "invalid privilege type %s for large object" +msgstr "დიდი áƒáƒ‘იექტის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:507 catalog/aclchk.c:1078 +#, c-format +msgid "invalid privilege type %s for schema" +msgstr "სქემის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:511 catalog/aclchk.c:1066 +#, c-format +msgid "invalid privilege type %s for procedure" +msgstr "პრáƒáƒªáƒ”დურის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:515 catalog/aclchk.c:1070 +#, c-format +msgid "invalid privilege type %s for routine" +msgstr "ქვეპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:519 +#, c-format +msgid "invalid privilege type %s for tablespace" +msgstr "ცხრილის სივრცის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:523 catalog/aclchk.c:1074 +#, c-format +msgid "invalid privilege type %s for type" +msgstr "ტიპის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:527 +#, c-format +msgid "invalid privilege type %s for foreign-data wrapper" +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:531 +#, c-format +msgid "invalid privilege type %s for foreign server" +msgstr "გáƒáƒ áƒ” სერვერის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:535 +#, c-format +msgid "invalid privilege type %s for parameter" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:574 +#, c-format +msgid "column privileges are only valid for relations" +msgstr "სვეტის პრივილეგიები მხáƒáƒšáƒáƒ“ ურთიერთáƒáƒ‘ებისთვის მáƒáƒ¥áƒ›áƒ”დებს" + +#: catalog/aclchk.c:737 catalog/aclchk.c:3626 catalog/objectaddress.c:1054 catalog/pg_largeobject.c:113 storage/large_object/inv_api.c:285 +#, c-format +msgid "large object %u does not exist" +msgstr "დიდი áƒáƒ‘იექტი %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/aclchk.c:1111 +#, c-format +msgid "default privileges cannot be set for columns" +msgstr "სვეტებისთვის ნáƒáƒ’ულისხმევი პრივილეგიების დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: catalog/aclchk.c:1147 +#, c-format +msgid "permission denied to change default privileges" +msgstr "ნáƒáƒ’ულისხმევი პრივილეგიების შეცვლის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: catalog/aclchk.c:1265 +#, c-format +msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" +msgstr "'IN SCHEMA' პირáƒáƒ‘ის გáƒáƒ›áƒáƒ§áƒ”ნებრGRANT/REVOKE ON SCHEMAS-ის გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ შეუძლებელიáƒ" + +#: catalog/aclchk.c:1616 catalog/catalog.c:629 catalog/objectaddress.c:1523 catalog/pg_publication.c:528 commands/analyze.c:380 commands/copy.c:913 commands/sequence.c:1645 commands/tablecmds.c:7549 commands/tablecmds.c:7703 commands/tablecmds.c:7753 commands/tablecmds.c:7827 commands/tablecmds.c:7897 commands/tablecmds.c:8027 commands/tablecmds.c:8156 commands/tablecmds.c:8250 commands/tablecmds.c:8351 commands/tablecmds.c:8478 commands/tablecmds.c:8508 +#: commands/tablecmds.c:8650 commands/tablecmds.c:8743 commands/tablecmds.c:8877 commands/tablecmds.c:8989 commands/tablecmds.c:12709 commands/tablecmds.c:12890 commands/tablecmds.c:13051 commands/tablecmds.c:14240 commands/tablecmds.c:16866 commands/trigger.c:942 parser/analyze.c:2530 parser/parse_relation.c:737 parser/parse_target.c:1067 parser/parse_type.c:144 parser/parse_utilcmd.c:3538 parser/parse_utilcmd.c:3578 parser/parse_utilcmd.c:3620 utils/adt/acl.c:2917 +#: utils/adt/ruleutils.c:2811 +#, c-format +msgid "column \"%s\" of relation \"%s\" does not exist" +msgstr "სვეტი \"%s\" ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/aclchk.c:1861 +#, c-format +msgid "\"%s\" is an index" +msgstr "\"%s\" ინდექსიáƒ" + +#: catalog/aclchk.c:1868 commands/tablecmds.c:14397 commands/tablecmds.c:17775 +#, c-format +msgid "\"%s\" is a composite type" +msgstr "\"%s\" კáƒáƒ›áƒžáƒáƒ–იტური ტიპიáƒ" + +#: catalog/aclchk.c:1876 catalog/objectaddress.c:1363 commands/tablecmds.c:263 commands/tablecmds.c:17739 utils/adt/acl.c:2101 utils/adt/acl.c:2131 utils/adt/acl.c:2164 utils/adt/acl.c:2200 utils/adt/acl.c:2231 utils/adt/acl.c:2262 +#, c-format +msgid "\"%s\" is not a sequence" +msgstr "\"%s\" მიმდევრáƒáƒ‘რáƒáƒ áƒáƒ" + +#: catalog/aclchk.c:1914 +#, c-format +msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" +msgstr "მიმდევრáƒáƒ‘რ\"%s\"-ს მხáƒáƒšáƒáƒ“ USAGE, SELECT დრUPDATE პრივილეგიების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრგáƒáƒáƒ©áƒœáƒ˜áƒáƒ—" + +#: catalog/aclchk.c:1931 +#, c-format +msgid "invalid privilege type %s for table" +msgstr "ცხრილის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:2094 +#, c-format +msgid "invalid privilege type %s for column" +msgstr "სვეტის პრივილეგიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: catalog/aclchk.c:2107 +#, c-format +msgid "sequence \"%s\" only supports SELECT column privileges" +msgstr "მიმდევრáƒáƒ‘რ\"%s\"-ს მხáƒáƒšáƒáƒ“ SELECT სვეტის პრივილეგიების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრგáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: catalog/aclchk.c:2297 +#, c-format +msgid "language \"%s\" is not trusted" +msgstr "ენრ\"%s\" სáƒáƒœáƒ“რáƒáƒ áƒáƒ" + +#: catalog/aclchk.c:2299 +#, c-format +msgid "GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages." +msgstr "GRANT დრREVOKE áƒáƒ áƒáƒ¡áƒáƒœáƒ“რენებზე დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ, რáƒáƒ“გáƒáƒœ áƒáƒ áƒáƒ¡áƒáƒœáƒ“რენების გáƒáƒ›áƒáƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებს შეუძლიáƒáƒ—." + +#: catalog/aclchk.c:2451 +#, c-format +msgid "cannot set privileges of array types" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის ტიპების პრივილეგიის დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: catalog/aclchk.c:2452 +#, c-format +msgid "Set the privileges of the element type instead." +msgstr "ნáƒáƒªáƒ•ლáƒáƒ“ დáƒáƒáƒ§áƒ”ნეთ ელემენტის ტიპის პრივილეგიები." + +#: catalog/aclchk.c:2456 +#, c-format +msgid "cannot set privileges of multirange types" +msgstr "მრáƒáƒ•áƒáƒšáƒ¨áƒ£áƒáƒšáƒ”დიáƒáƒœáƒ˜ ტიპების პრივილეგიების დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: catalog/aclchk.c:2457 +#, c-format +msgid "Set the privileges of the range type instead." +msgstr "სáƒáƒœáƒáƒªáƒ•ლáƒáƒ“ შუáƒáƒšáƒ”დის ტიპის პრივილეგიების დáƒáƒ§áƒ”ნებáƒ." + +#: catalog/aclchk.c:2464 catalog/objectaddress.c:1629 +#, c-format +msgid "\"%s\" is not a domain" +msgstr "\"%s\" დáƒáƒ›áƒ”ნი áƒáƒ áƒáƒ" + +#: catalog/aclchk.c:2650 +#, c-format +msgid "unrecognized privilege type \"%s\"" +msgstr "პრივილეგიის უცნáƒáƒ‘ი ტიპი \"%s\"" + +#: catalog/aclchk.c:2717 +#, c-format +msgid "permission denied for aggregate %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ áƒáƒ’რეგáƒáƒ¢áƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2720 +#, c-format +msgid "permission denied for collation %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ კáƒáƒšáƒáƒªáƒ˜áƒáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2723 +#, c-format +msgid "permission denied for column %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ სვეტზე: \"%s\"" + +#: catalog/aclchk.c:2726 +#, c-format +msgid "permission denied for conversion %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2729 +#, c-format +msgid "permission denied for database %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ áƒáƒ’რეგáƒáƒ¢áƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2732 +#, c-format +msgid "permission denied for domain %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ დáƒáƒ›áƒ”ნზე: \"%s\"" + +#: catalog/aclchk.c:2735 +#, c-format +msgid "permission denied for event trigger %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ მáƒáƒ•ლენის ტრიგერზე: \"%s\"" + +#: catalog/aclchk.c:2738 +#, c-format +msgid "permission denied for extension %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2741 +#, c-format +msgid "permission denied for foreign-data wrapper %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2744 +#, c-format +msgid "permission denied for foreign server %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ გáƒáƒ áƒ” სერვერზე: \"%s\"" + +#: catalog/aclchk.c:2747 +#, c-format +msgid "permission denied for foreign table %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ გáƒáƒ áƒ” ცხრილზე: \"%s\"" + +#: catalog/aclchk.c:2750 +#, c-format +msgid "permission denied for function %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ ფუნქციáƒáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2753 +#, c-format +msgid "permission denied for index %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ ინდექზე: \"%s\"" + +#: catalog/aclchk.c:2756 +#, c-format +msgid "permission denied for language %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ ენáƒáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2759 +#, c-format +msgid "permission denied for large object %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ დიდ áƒáƒ‘იექტზე: \"%s\"" + +#: catalog/aclchk.c:2762 +#, c-format +msgid "permission denied for materialized view %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებულ ხედზე: \"%s\"" + +#: catalog/aclchk.c:2765 +#, c-format +msgid "permission denied for operator class %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2768 +#, c-format +msgid "permission denied for operator %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2771 +#, c-format +msgid "permission denied for operator family %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2774 +#, c-format +msgid "permission denied for parameter %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ პáƒáƒ áƒáƒ›áƒ”ტრზე: \"%s\"" + +#: catalog/aclchk.c:2777 +#, c-format +msgid "permission denied for policy %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ წესზე: \"%s\"" + +#: catalog/aclchk.c:2780 +#, c-format +msgid "permission denied for procedure %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ პრáƒáƒªáƒ”დურáƒáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2783 +#, c-format +msgid "permission denied for publication %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ პუბლიკáƒáƒªáƒ˜áƒáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2786 +#, c-format +msgid "permission denied for routine %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ ქვეპრáƒáƒ’რáƒáƒ›áƒáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2789 +#, c-format +msgid "permission denied for schema %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ სქემáƒáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2792 commands/sequence.c:647 commands/sequence.c:873 commands/sequence.c:915 commands/sequence.c:956 commands/sequence.c:1743 commands/sequence.c:1789 +#, c-format +msgid "permission denied for sequence %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ მიმდევრáƒáƒ‘áƒáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2795 +#, c-format +msgid "permission denied for statistics object %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ‘იექტზე: \"%s\"" + +#: catalog/aclchk.c:2798 +#, c-format +msgid "permission denied for subscription %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ გáƒáƒ›áƒáƒ¬áƒ”რáƒáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2801 +#, c-format +msgid "permission denied for table %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ ცხრილზე: \"%s\"" + +#: catalog/aclchk.c:2804 +#, c-format +msgid "permission denied for tablespace %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ ცხრილების სივრცეზე: \"%s\"" + +#: catalog/aclchk.c:2807 +#, c-format +msgid "permission denied for text search configuration %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2810 +#, c-format +msgid "permission denied for text search dictionary %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ ტექსტის ძებნის ლექსიკáƒáƒœáƒ–ე: \"%s\"" + +#: catalog/aclchk.c:2813 +#, c-format +msgid "permission denied for type %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ ტიპტზე: \"%s\"" + +#: catalog/aclchk.c:2816 +#, c-format +msgid "permission denied for view %s" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ ხედზე: \"%s\"" + +#: catalog/aclchk.c:2852 +#, c-format +msgid "must be owner of aggregate %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2855 +#, c-format +msgid "must be owner of collation %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2858 +#, c-format +msgid "must be owner of conversion %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2861 +#, c-format +msgid "must be owner of database %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ ბáƒáƒ–ის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2864 +#, c-format +msgid "must be owner of domain %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ დáƒáƒ›áƒ”ნის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2867 +#, c-format +msgid "must be owner of event trigger %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ მáƒáƒ•ლენის ტრიგერის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2870 +#, c-format +msgid "must be owner of extension %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2873 +#, c-format +msgid "must be owner of foreign-data wrapper %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ გáƒáƒ áƒ” ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2876 +#, c-format +msgid "must be owner of foreign server %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ გáƒáƒ áƒ” სერვერის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2879 +#, c-format +msgid "must be owner of foreign table %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ გáƒáƒ áƒ” ცხრილის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2882 +#, c-format +msgid "must be owner of function %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ ფუნქციის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2885 +#, c-format +msgid "must be owner of index %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ ინდექსის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2888 +#, c-format +msgid "must be owner of language %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ ენის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2891 +#, c-format +msgid "must be owner of large object %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ დიდი áƒáƒ‘იექტის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2894 +#, c-format +msgid "must be owner of materialized view %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2897 +#, c-format +msgid "must be owner of operator class %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡ მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2900 +#, c-format +msgid "must be owner of operator %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2903 +#, c-format +msgid "must be owner of operator family %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜áƒ¡ მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2906 +#, c-format +msgid "must be owner of procedure %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ პრáƒáƒªáƒ”დურის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2909 +#, c-format +msgid "must be owner of publication %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒ›áƒ¤áƒšáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2912 +#, c-format +msgid "must be owner of routine %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ ქვეპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2915 +#, c-format +msgid "must be owner of sequence %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ მიმდევრáƒáƒ‘ის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2918 +#, c-format +msgid "must be owner of subscription %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ გáƒáƒ›áƒáƒ¬áƒ”რის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2921 +#, c-format +msgid "must be owner of table %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ ცხრილის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2924 +#, c-format +msgid "must be owner of type %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ ტიპის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2927 +#, c-format +msgid "must be owner of view %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ ხედის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2930 +#, c-format +msgid "must be owner of schema %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ სქემის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2933 +#, c-format +msgid "must be owner of statistics object %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ‘იექტის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2936 +#, c-format +msgid "must be owner of tablespace %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ ცხრილების სივრცის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2939 +#, c-format +msgid "must be owner of text search configuration %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2942 +#, c-format +msgid "must be owner of text search dictionary %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ ტექსტის ძებნის ლექსიკáƒáƒœáƒ˜áƒ¡ მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:2956 +#, c-format +msgid "must be owner of relation %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ ურთიერთáƒáƒ‘ის მფლáƒáƒ‘ელი: %s" + +#: catalog/aclchk.c:3002 +#, c-format +msgid "permission denied for column \"%s\" of relation \"%s\"" +msgstr "რელáƒáƒªáƒ˜áƒ˜áƒ¡ (%2$s) სვეტზე (%1$s) წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: catalog/aclchk.c:3159 catalog/aclchk.c:4167 catalog/aclchk.c:4198 +#, c-format +msgid "%s with OID %u does not exist" +msgstr "%s OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/aclchk.c:3242 catalog/aclchk.c:3261 +#, c-format +msgid "attribute %d of relation with OID %u does not exist" +msgstr "ურთერთáƒáƒ‘ის (OID-ით %2$u) áƒáƒ¢áƒ áƒ˜áƒ‘უტი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %1$d" + +#: catalog/aclchk.c:3299 catalog/aclchk.c:3362 catalog/aclchk.c:4001 +#, c-format +msgid "relation with OID %u does not exist" +msgstr "ურთიერთáƒáƒ‘რOID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/aclchk.c:3547 +#, c-format +msgid "parameter ACL with OID %u does not exist" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის ACL OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/aclchk.c:3720 commands/collationcmds.c:853 commands/publicationcmds.c:1739 +#, c-format +msgid "schema with OID %u does not exist" +msgstr "სქემრOID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/aclchk.c:3794 catalog/aclchk.c:3821 catalog/aclchk.c:3850 utils/cache/typcache.c:392 utils/cache/typcache.c:447 +#, c-format +msgid "type with OID %u does not exist" +msgstr "ტიპი OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/catalog.c:447 +#, c-format +msgid "still searching for an unused OID in relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ \"%s\" გáƒáƒ›áƒáƒ£áƒ§áƒ”ნებელი OID-ების ძებნრჯერ კიდევ მიმდინáƒáƒ áƒ”áƒáƒ‘ს" + +#: catalog/catalog.c:449 +#, c-format +msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." +msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." +msgstr[0] "OID-ის კáƒáƒœáƒ“იდáƒáƒ¢áƒ”ბი %llu-ჯერ შემáƒáƒ¬áƒ›áƒ“áƒ, მáƒáƒ’რáƒáƒ› გáƒáƒ›áƒáƒ£áƒ§áƒ”ნებელი OID-ი ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ." +msgstr[1] "OID-ის კáƒáƒœáƒ“იდáƒáƒ¢áƒ”ბი %llu-ჯერ შემáƒáƒ¬áƒ›áƒ“áƒ, მáƒáƒ’რáƒáƒ› გáƒáƒ›áƒáƒ£áƒ§áƒ”ნებელი OID-ი ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ." + +#: catalog/catalog.c:474 +#, c-format +msgid "new OID has been assigned in relation \"%s\" after %llu retry" +msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" +msgstr[0] "áƒáƒ®áƒáƒšáƒ˜ OID მინიჭებულირურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ \"%s\" %llu ცდის შემდეგ" +msgstr[1] "áƒáƒ®áƒáƒšáƒ˜ OID მინიჭებულირურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ \"%s\" %llu ცდის შემდეგ" + +#: catalog/catalog.c:607 catalog/catalog.c:674 +#, c-format +msgid "must be superuser to call %s()" +msgstr "%s()-ის გáƒáƒ›áƒáƒ¡áƒáƒ«áƒáƒ®áƒ”ბლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრიყáƒáƒ—" + +#: catalog/catalog.c:616 +#, c-format +msgid "pg_nextoid() can only be used on system catalogs" +msgstr "pg_nextoid() მხáƒáƒšáƒáƒ“ სისტემურ კáƒáƒ¢áƒáƒšáƒáƒ’ებზე შეიძლებრიყáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული" + +#: catalog/catalog.c:621 parser/parse_utilcmd.c:2245 +#, c-format +msgid "index \"%s\" does not belong to table \"%s\"" +msgstr "ინდექსი %s ცხრილს \"%s\" áƒáƒ  მიეკუთვნებáƒ" + +#: catalog/catalog.c:638 +#, c-format +msgid "column \"%s\" is not of type oid" +msgstr "სვეტი \"%s\" oild-ის ტიპი áƒáƒ áƒáƒ" + +#: catalog/catalog.c:645 +#, c-format +msgid "index \"%s\" is not the index for column \"%s\"" +msgstr "ინდექსი \"%s\" სვეტის \"%s\" ინდექსი áƒáƒ áƒáƒ" + +#: catalog/dependency.c:497 catalog/pg_shdepend.c:695 +#, c-format +msgid "cannot drop %s because it is required by the database system" +msgstr "%s-ის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ. სáƒáƒ­áƒ˜áƒ áƒáƒ ბáƒáƒ–ის სისტემისთვის" + +#: catalog/dependency.c:789 catalog/dependency.c:1016 +#, c-format +msgid "cannot drop %s because %s requires it" +msgstr "%s-ის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ. ის %s-ს სჭირდებáƒ" + +#: catalog/dependency.c:791 catalog/dependency.c:1018 +#, c-format +msgid "You can drop %s instead." +msgstr "სáƒáƒ›áƒáƒ’იერáƒáƒ“ შეგიძლიáƒáƒ— %s წáƒáƒ¨áƒáƒšáƒáƒ—." + +#: catalog/dependency.c:1097 catalog/dependency.c:1106 +#, c-format +msgid "%s depends on %s" +msgstr "%s დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულირ%s -ზე" + +#: catalog/dependency.c:1121 catalog/dependency.c:1130 +#, c-format +msgid "drop cascades to %s" +msgstr "წáƒáƒ¨áƒšáƒ %s-ზეც ვრცელდებáƒ" + +#: catalog/dependency.c:1138 catalog/pg_shdepend.c:860 +#, c-format +msgid "" +"\n" +"and %d other object (see server log for list)" +msgid_plural "" +"\n" +"and %d other objects (see server log for list)" +msgstr[0] "" +"\n" +"დრ%d სხვრáƒáƒ‘იექტი (სიისთვის იხილეთ სერვერის ჟურნáƒáƒšáƒ˜)" +msgstr[1] "" +"\n" +"დრ%d სხვრáƒáƒ‘იექტი (სიისთვის იხილეთ სერვერის ჟურნáƒáƒšáƒ˜)" + +#: catalog/dependency.c:1150 +#, c-format +msgid "cannot drop %s because other objects depend on it" +msgstr "%s-ის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ áƒáƒ áƒ˜áƒ¡ áƒáƒ‘იექტები, რáƒáƒ›áƒšáƒ”ბიც მáƒáƒ¡ ეყრდნáƒáƒ‘áƒ" + +#: catalog/dependency.c:1153 catalog/dependency.c:1160 catalog/dependency.c:1171 commands/tablecmds.c:1447 commands/tablecmds.c:14989 commands/tablespace.c:460 commands/user.c:1302 commands/vacuum.c:211 commands/view.c:441 libpq/auth.c:324 replication/logical/applyparallelworker.c:1041 replication/syncrep.c:1011 storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1427 utils/misc/guc.c:3169 utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6781 +#: utils/misc/guc.c:6815 utils/misc/guc.c:6849 utils/misc/guc.c:6892 utils/misc/guc.c:6934 +#, c-format +msgid "%s" +msgstr "%s" + +#: catalog/dependency.c:1154 catalog/dependency.c:1161 +#, c-format +msgid "Use DROP ... CASCADE to drop the dependent objects too." +msgstr "თუ გნებáƒáƒ•თ, წáƒáƒ¨áƒáƒšáƒáƒ— დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებული áƒáƒ‘იექტებიც, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ DROP ... CASCADE ." + +#: catalog/dependency.c:1158 +#, c-format +msgid "cannot drop desired object(s) because other objects depend on them" +msgstr "სáƒáƒ¡áƒ£áƒ áƒ•ელი áƒáƒ‘იექტის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ, სáƒáƒœáƒáƒ› áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს áƒáƒ‘იექტები, რáƒáƒ›áƒšáƒ”ბიც მáƒáƒ¡ ეყრდნáƒáƒ‘იáƒáƒœ" + +#: catalog/dependency.c:1166 +#, c-format +msgid "drop cascades to %d other object" +msgid_plural "drop cascades to %d other objects" +msgstr[0] "წáƒáƒ¨áƒšáƒ გáƒáƒ•რცელდებრ%d სხვრáƒáƒ‘იექტზე" +msgstr[1] "წáƒáƒ¨áƒšáƒ გáƒáƒ•რცელდებრ%d სხვრáƒáƒ‘იექტზე" + +#: catalog/dependency.c:1848 +#, c-format +msgid "constant of the type %s cannot be used here" +msgstr "%s ტიპის კáƒáƒœáƒ¡áƒ¢áƒáƒœáƒ¢áƒ˜áƒ¡ áƒáƒ¥ გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ  შეიძლებáƒ" + +#: catalog/dependency.c:2373 parser/parse_relation.c:3407 parser/parse_relation.c:3417 +#, c-format +msgid "column %d of relation \"%s\" does not exist" +msgstr "სვეტი \"%d\" ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/heap.c:325 +#, c-format +msgid "permission denied to create \"%s.%s\"" +msgstr "\"%s.%s\"-ის შექმნის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: catalog/heap.c:327 +#, c-format +msgid "System catalog modifications are currently disallowed." +msgstr "სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების შეცვლრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ." + +#: catalog/heap.c:467 commands/tablecmds.c:2483 commands/tablecmds.c:2905 commands/tablecmds.c:7171 +#, c-format +msgid "tables can have at most %d columns" +msgstr "ცხრილებს მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› %d სვეტი შეიძლებრჰქáƒáƒœáƒ“ეს" + +#: catalog/heap.c:485 commands/tablecmds.c:7440 +#, c-format +msgid "column name \"%s\" conflicts with a system column name" +msgstr "სვეტის სáƒáƒ®áƒ”ლი კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ¨áƒ˜áƒ სისტემური სვეტის სáƒáƒ®áƒ”ლთáƒáƒœ: \"%s\"" + +#: catalog/heap.c:501 +#, c-format +msgid "column name \"%s\" specified more than once" +msgstr "სვეტის სáƒáƒ®áƒ”ლი ერთზე მეტჯერáƒáƒ მითითებული: %s" + +#. translator: first %s is an integer not a name +#: catalog/heap.c:579 +#, c-format +msgid "partition key column %s has pseudo-type %s" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ სვეტის %s ფსევდრტიპირ%s" + +#: catalog/heap.c:584 +#, c-format +msgid "column \"%s\" has pseudo-type %s" +msgstr "სვეტს \"%s\" გáƒáƒáƒ©áƒœáƒ˜áƒ ფსევდრტიპი \"%s\"" + +#: catalog/heap.c:615 +#, c-format +msgid "composite type %s cannot be made a member of itself" +msgstr "კáƒáƒ›áƒžáƒáƒ–იტური ტიპი %s სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ თáƒáƒ•ის წევრი áƒáƒ  შეიძლებრგáƒáƒ®áƒ“ეს" + +#. translator: first %s is an integer not a name +#: catalog/heap.c:670 +#, c-format +msgid "no collation was derived for partition key column %s with collatable type %s" +msgstr "" + +#: catalog/heap.c:676 commands/createas.c:198 commands/createas.c:507 +#, c-format +msgid "no collation was derived for column \"%s\" with collatable type %s" +msgstr "" + +#: catalog/heap.c:1161 catalog/index.c:899 commands/createas.c:403 commands/tablecmds.c:4142 commands/tablecmds.c:20463 commands/tablecmds.c:20725 +#, c-format +msgid "relation \"%s\" already exists" +msgstr "ურთიერთáƒáƒ‘რ\"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/heap.c:1177 catalog/pg_type.c:434 catalog/pg_type.c:805 catalog/pg_type.c:977 commands/typecmds.c:253 commands/typecmds.c:265 commands/typecmds.c:758 commands/typecmds.c:1179 commands/typecmds.c:1405 commands/typecmds.c:1585 commands/typecmds.c:2556 +#, c-format +msgid "type \"%s\" already exists" +msgstr "ტიპი \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/heap.c:1178 +#, c-format +msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." +msgstr "ურთიერთáƒáƒ‘áƒáƒ¡ იგივე სáƒáƒ®áƒ”ლის მქáƒáƒœáƒ” ტიპი áƒáƒ¥áƒ•ს áƒáƒ¡áƒáƒªáƒ˜áƒ áƒ”ბული, áƒáƒ¡áƒ” რáƒáƒ› თქვენ უნდრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— სáƒáƒ®áƒ”ლი, რáƒáƒ›áƒ”ლიც áƒáƒ áƒª ერთ áƒáƒ áƒ¡áƒ”ბულ ტიპთáƒáƒœ კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ¨áƒ˜ áƒáƒ  შედის." + +#: catalog/heap.c:1218 +#, c-format +msgid "toast relfilenumber value not set when in binary upgrade mode" +msgstr "toast relfilenumber-ის მნიშვნელáƒáƒ‘რბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის დრáƒáƒ¡ დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: catalog/heap.c:1229 +#, c-format +msgid "pg_class heap OID value not set when in binary upgrade mode" +msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის რეჟიმში pg_class-ის დრáƒáƒ”ბითი მეხსიერების OID-ის მნიშვნელáƒáƒ‘რდáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: catalog/heap.c:1239 +#, c-format +msgid "relfilenumber value not set when in binary upgrade mode" +msgstr "relfilenumber-ის მნიშვნელáƒáƒ‘რბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის დრáƒáƒ¡ დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: catalog/heap.c:2121 +#, c-format +msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილს (\"%s\") NO INHERIT შეზღუდვáƒáƒ¡ ვერ დáƒáƒáƒ›áƒáƒ¢áƒ”ბთ" + +#: catalog/heap.c:2393 +#, c-format +msgid "check constraint \"%s\" already exists" +msgstr "შეზღუდვის შემმáƒáƒ¬áƒ›áƒ”ბელი \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/heap.c:2565 catalog/index.c:913 catalog/pg_constraint.c:724 commands/tablecmds.c:9364 +#, c-format +msgid "constraint \"%s\" for relation \"%s\" already exists" +msgstr "შეზღუდვრ\"%s\" ურთიერთáƒáƒ‘ისთვის \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/heap.c:2572 +#, c-format +msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" +msgstr "შეზღუდვრ\"%s\" კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ¨áƒ˜áƒ áƒáƒ áƒ-მემკვიდრეáƒáƒ‘ით მიღებულ შეზღუდვáƒáƒ¡áƒ—áƒáƒœ ურთიერთáƒáƒ‘áƒáƒ–ე \"%s\"" + +#: catalog/heap.c:2583 +#, c-format +msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" +msgstr "შეზღუდვრ\"%s\" კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ¨áƒ˜áƒ მემკვიდრეáƒáƒ‘ით მიღებულ შეზღუდვáƒáƒ¡áƒ—áƒáƒœ ურთიერთáƒáƒ‘áƒáƒ–ე \"%s\"" + +#: catalog/heap.c:2593 +#, c-format +msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" +msgstr "შეზღუდვრ\"%s\" კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ¨áƒ˜áƒ შეზღუდვáƒáƒ¡áƒ—áƒáƒœ NOT VALID ურთიერთáƒáƒ‘áƒáƒ–ე \"%s\"" + +#: catalog/heap.c:2598 +#, c-format +msgid "merging constraint \"%s\" with inherited definition" +msgstr "შეზღუდვის (\"%s\") შერწყმრმემკვიდრეáƒáƒ‘ითი áƒáƒ¦áƒ¬áƒ”რით" + +#: catalog/heap.c:2624 catalog/pg_constraint.c:853 commands/tablecmds.c:3062 commands/tablecmds.c:3365 commands/tablecmds.c:7097 commands/tablecmds.c:15807 commands/tablecmds.c:15938 +#, c-format +msgid "too many inheritance parents" +msgstr "მეტისმეტáƒáƒ“ ბევრი მემკვიდრეáƒáƒ‘ის მშáƒáƒ‘ლები" + +#: catalog/heap.c:2708 +#, c-format +msgid "cannot use generated column \"%s\" in column generation expression" +msgstr "სვეტის გენერáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨áƒ˜ გენერირებული სვეტის (%s) გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: catalog/heap.c:2710 +#, c-format +msgid "A generated column cannot reference another generated column." +msgstr "გენერირებული სვეტი სხვრგენერირებული სვეტის მიმáƒáƒ áƒ—ვრვერ იქნებáƒ." + +#: catalog/heap.c:2716 +#, c-format +msgid "cannot use whole-row variable in column generation expression" +msgstr "" + +#: catalog/heap.c:2717 +#, c-format +msgid "This would cause the generated column to depend on its own value." +msgstr "áƒáƒ›áƒáƒœ შეიძლებრდáƒáƒ’ენერირებული სვეტის თáƒáƒ•ის სáƒáƒ™áƒ£áƒ—áƒáƒ  მნიშვნელáƒáƒ‘áƒáƒ–ე დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡." + +#: catalog/heap.c:2772 +#, c-format +msgid "generation expression is not immutable" +msgstr "თáƒáƒáƒ‘ის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრუცვლელი áƒáƒ áƒáƒ" + +#: catalog/heap.c:2800 rewrite/rewriteHandler.c:1281 +#, c-format +msgid "column \"%s\" is of type %s but default expression is of type %s" +msgstr "სვეტის \"%s\" ტიპირ%s, მáƒáƒ’რáƒáƒ› ნáƒáƒ’ულისხმევი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ტიპირ%s" + +#: catalog/heap.c:2805 commands/prepare.c:331 parser/analyze.c:2758 parser/parse_target.c:592 parser/parse_target.c:882 parser/parse_target.c:892 rewrite/rewriteHandler.c:1286 +#, c-format +msgid "You will need to rewrite or cast the expression." +msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ áƒáƒœ გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ." + +#: catalog/heap.c:2852 +#, c-format +msgid "only table \"%s\" can be referenced in check constraint" +msgstr "შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვáƒáƒ¨áƒ˜ მხáƒáƒšáƒáƒ“ %s ცხრილზე მიმáƒáƒ áƒ—ვრშეიძლებáƒ" + +#: catalog/heap.c:3158 +#, c-format +msgid "unsupported ON COMMIT and foreign key combination" +msgstr "\"ON COMMIT\"-ისრდრგáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბის წყვილი მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: catalog/heap.c:3159 +#, c-format +msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." +msgstr "ცხრილი \"%s\", მითითებრ\"%s\", მáƒáƒ’რáƒáƒ› მáƒáƒ— იგივე ON COMMIT პáƒáƒ áƒáƒ›áƒ”ტრი áƒáƒ  áƒáƒ¥áƒ•თ." + +#: catalog/heap.c:3164 +#, c-format +msgid "cannot truncate a table referenced in a foreign key constraint" +msgstr "გáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვáƒáƒ¨áƒ˜ მიმáƒáƒ áƒ—ული ცხრილის შემცველáƒáƒ‘ის დáƒáƒªáƒáƒ áƒ˜áƒ”ლებრშეუძლებელიáƒ" + +#: catalog/heap.c:3165 +#, c-format +msgid "Table \"%s\" references \"%s\"." +msgstr "ცხრილი \"%s\" მიუთითებს \"%s\"." + +#: catalog/heap.c:3167 +#, c-format +msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." +msgstr "წáƒáƒ¨áƒáƒšáƒ”თ შემცველáƒáƒ‘რცხრილისთვის \"%s\" პáƒáƒ áƒáƒšáƒ”ლურáƒáƒ“, áƒáƒœ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ TRUNCATE ... CASCADE." + +#: catalog/index.c:219 parser/parse_utilcmd.c:2151 +#, c-format +msgid "multiple primary keys for table \"%s\" are not allowed" +msgstr "ცხრილისთვის \"%s\" ერთზე მეტი ძირითáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბი დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: catalog/index.c:233 +#, c-format +msgid "primary keys cannot use NULLS NOT DISTINCT indexes" +msgstr "ძირითáƒáƒ“ გáƒáƒ¡áƒáƒ¦áƒ”ბებს NULLS NOT DISTINCT ინდექსების გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ  შეუძლიáƒáƒ—" + +#: catalog/index.c:250 +#, c-format +msgid "primary keys cannot be expressions" +msgstr "ძირითáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრáƒáƒ  შეიძლებრიყáƒáƒ¡" + +#: catalog/index.c:267 +#, c-format +msgid "primary key column \"%s\" is not marked NOT NULL" +msgstr "ძირითáƒáƒ“ის გáƒáƒ¡áƒáƒ¦áƒ”ბის ტიპის სვეტი \"%s\" áƒáƒ áƒáƒ áƒáƒ¦áƒ¬áƒ”რილი, რáƒáƒ’áƒáƒ áƒª NOT NULL" + +#: catalog/index.c:798 catalog/index.c:1914 +#, c-format +msgid "user-defined indexes on system catalog tables are not supported" +msgstr "სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ცხრილებზე მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილი ინდექსების დáƒáƒ“ებრშეუძლებელიáƒ" + +#: catalog/index.c:838 +#, c-format +msgid "nondeterministic collations are not supported for operator class \"%s\"" +msgstr "áƒáƒ áƒáƒ“ეტერმინისტული კáƒáƒšáƒáƒªáƒ˜áƒ”ბი áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡áƒ—ვის \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: catalog/index.c:853 +#, c-format +msgid "concurrent index creation on system catalog tables is not supported" +msgstr "სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ცხრილებზე ინდექსების პáƒáƒ áƒáƒšáƒ”ლური შექმნრმხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: catalog/index.c:862 catalog/index.c:1330 +#, c-format +msgid "concurrent index creation for exclusion constraints is not supported" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური ინდექსის შექმნრგáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒ•ის შეზღუდვებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: catalog/index.c:871 +#, c-format +msgid "shared indexes cannot be created after initdb" +msgstr "გáƒáƒ–იáƒáƒ áƒ”ბული ინდექსების შექმნრშეუძლებელირinitdb-ის შემდეგ" + +#: catalog/index.c:891 commands/createas.c:418 commands/sequence.c:159 parser/parse_utilcmd.c:212 +#, c-format +msgid "relation \"%s\" already exists, skipping" +msgstr "შეერთებრ\"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: catalog/index.c:941 +#, c-format +msgid "pg_class index OID value not set when in binary upgrade mode" +msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის რეჟიმში pg_class-ის ინდექსის OID-ის მნიშვნელáƒáƒ‘რდáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: catalog/index.c:951 utils/cache/relcache.c:3787 +#, c-format +msgid "index relfilenumber value not set when in binary upgrade mode" +msgstr "index relfilenumber-ის მნიშვნელáƒáƒ‘რბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის დრáƒáƒ¡ დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: catalog/index.c:2213 +#, c-format +msgid "DROP INDEX CONCURRENTLY must be first action in transaction" +msgstr "DROP INDEX CONCURRENTLY ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ პირველი ქმედებრუნდრიყáƒáƒ¡" + +#: catalog/index.c:3669 +#, c-format +msgid "cannot reindex temporary tables of other sessions" +msgstr "სხვრსესიების დრáƒáƒ”ბითი ცხრილების რეინდექსი შეუძლებელიáƒ" + +#: catalog/index.c:3680 commands/indexcmds.c:3648 +#, c-format +msgid "cannot reindex invalid index on TOAST table" +msgstr "\"TOAST\" ცხრილზე áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ინდექსის რეინდექსი შეუძლებელიáƒ" + +#: catalog/index.c:3696 commands/indexcmds.c:3526 commands/indexcmds.c:3672 commands/tablecmds.c:3557 +#, c-format +msgid "cannot move system relation \"%s\"" +msgstr "სისტემური ურთიერთáƒáƒ‘ის გáƒáƒáƒ“áƒáƒáƒ“გილებრáƒáƒ  შეიძლებáƒ: \"%s\"" + +#: catalog/index.c:3833 +#, c-format +msgid "index \"%s\" was reindexed" +msgstr "\"%s\"-ის რეინდექსი დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ" + +#: catalog/index.c:3999 +#, c-format +msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" +msgstr "'TOAST' ცხრილზე მდებáƒáƒ áƒ” áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ინდექსის \"%s.%s\" რეინდექსი შეუძლებელიáƒ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: catalog/namespace.c:447 catalog/namespace.c:651 catalog/namespace.c:743 commands/trigger.c:5729 +#, c-format +msgid "cross-database references are not implemented: \"%s.%s.%s\"" +msgstr "ბáƒáƒ–ებს შáƒáƒ áƒ˜áƒ¡ ბმულები გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ: \"%s.%s.%s\"" + +#: catalog/namespace.c:504 +#, c-format +msgid "temporary tables cannot specify a schema name" +msgstr "დრáƒáƒ”ბით ცხრილებს სქემის სáƒáƒ®áƒ”ლი áƒáƒ  მიეთითებáƒáƒ—" + +#: catalog/namespace.c:585 +#, c-format +msgid "could not obtain lock on relation \"%s.%s\"" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ მიღების შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘áƒáƒ–ე %s.%s\"" + +#: catalog/namespace.c:590 commands/lockcmds.c:143 commands/lockcmds.c:223 +#, c-format +msgid "could not obtain lock on relation \"%s\"" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ მიღების შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘áƒáƒ–ე %s\"" + +#: catalog/namespace.c:618 parser/parse_relation.c:1430 +#, c-format +msgid "relation \"%s.%s\" does not exist" +msgstr "ურთიერთáƒáƒ‘რ\"%s.%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/namespace.c:623 parser/parse_relation.c:1443 parser/parse_relation.c:1451 utils/adt/regproc.c:913 +#, c-format +msgid "relation \"%s\" does not exist" +msgstr "ურთიერთáƒáƒ‘რ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/namespace.c:689 catalog/namespace.c:3507 commands/extension.c:1607 commands/extension.c:1613 +#, c-format +msgid "no schema has been selected to create in" +msgstr "შიგნით შესáƒáƒ¥áƒ›áƒœáƒ”ლი სქემრმáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ áƒáƒ áƒáƒ" + +#: catalog/namespace.c:841 catalog/namespace.c:854 +#, c-format +msgid "cannot create relations in temporary schemas of other sessions" +msgstr "სხვრსესიების დრáƒáƒ”ბით სქემებთáƒáƒœ ურთიერთáƒáƒ‘ის შექმნრშეუძლებელიáƒ" + +#: catalog/namespace.c:845 +#, c-format +msgid "cannot create temporary relation in non-temporary schema" +msgstr "დრáƒáƒ”ბითი ურთიერთáƒáƒ‘ების შექმნრáƒáƒ áƒ-დრáƒáƒ”ბით სქემáƒáƒ¨áƒ˜ შეუძლებელიáƒ" + +#: catalog/namespace.c:860 +#, c-format +msgid "only temporary relations may be created in temporary schemas" +msgstr "დრáƒáƒ”ბით სქემებში მხáƒáƒšáƒáƒ“ დრáƒáƒ”ბითი ურთიერთáƒáƒ‘ების შექმნრშეიძლებáƒ" + +#: catalog/namespace.c:2604 +#, c-format +msgid "statistics object \"%s\" does not exist" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ‘იექტი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/namespace.c:2746 +#, c-format +msgid "text search parser \"%s\" does not exist" +msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/namespace.c:2891 utils/adt/regproc.c:1459 +#, c-format +msgid "text search dictionary \"%s\" does not exist" +msgstr "ტექსტის ძებნის ლექსიკáƒáƒœáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/namespace.c:3037 +#, c-format +msgid "text search template \"%s\" does not exist" +msgstr "ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/namespace.c:3182 commands/tsearchcmds.c:1168 utils/adt/regproc.c:1349 utils/cache/ts_cache.c:635 +#, c-format +msgid "text search configuration \"%s\" does not exist" +msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/namespace.c:3314 parser/parse_expr.c:869 parser/parse_target.c:1259 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "ბáƒáƒ–ებს შáƒáƒ áƒ˜áƒ¡ ბმულები გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ: %s" + +#: catalog/namespace.c:3320 gram.y:19230 gram.y:19270 parser/parse_expr.c:876 parser/parse_target.c:1266 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სრული სáƒáƒ®áƒ”ლი (ძáƒáƒšáƒ˜áƒáƒœ ბევრი წერტილიáƒáƒœáƒ˜ სáƒáƒ®áƒ”ლი): %s" + +#: catalog/namespace.c:3450 +#, c-format +msgid "cannot move objects into or out of temporary schemas" +msgstr "áƒáƒ‘იექტის დრáƒáƒ”ბითი სქემიდáƒáƒœ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ áƒáƒœ სქემáƒáƒ¨áƒ˜ შეტáƒáƒœáƒ შეუძლებელიáƒ" + +#: catalog/namespace.c:3456 +#, c-format +msgid "cannot move objects into or out of TOAST schema" +msgstr "\"TOAST\" სქემიდáƒáƒœ áƒáƒ‘იექტს ვერც გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ—, ვერც შეიტáƒáƒœáƒ—" + +#: catalog/namespace.c:3529 commands/schemacmds.c:264 commands/schemacmds.c:344 commands/tablecmds.c:1392 utils/adt/regproc.c:1688 +#, c-format +msgid "schema \"%s\" does not exist" +msgstr "სქემრ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/namespace.c:3560 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "ურთიერთáƒáƒ‘ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი (ძáƒáƒšáƒ˜áƒáƒœ ბევრი წერტილიáƒáƒœáƒ˜ სáƒáƒ®áƒ”ლი): %s" + +#: catalog/namespace.c:4001 utils/adt/regproc.c:1056 +#, c-format +msgid "collation \"%s\" for encoding \"%s\" does not exist" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ \"%s\" კáƒáƒ“ირებისთვის \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/namespace.c:4056 +#, c-format +msgid "conversion \"%s\" does not exist" +msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/namespace.c:4397 +#, c-format +msgid "permission denied to create temporary tables in database \"%s\"" +msgstr "ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\" დრáƒáƒ”ბითი ცხრილების შექმნის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: catalog/namespace.c:4413 +#, c-format +msgid "cannot create temporary tables during recovery" +msgstr "áƒáƒ¦áƒ“გენისáƒáƒ¡ დრáƒáƒ”ბითი ცხრილების შექმნრშეუძლებელიáƒ" + +#: catalog/namespace.c:4419 +#, c-format +msgid "cannot create temporary tables during a parallel operation" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ მიმდინáƒáƒ áƒ”áƒáƒ‘ისáƒáƒ¡ დრáƒáƒ”ბითი ცხრილების შექმნრშეუძლებელიáƒ" + +#: catalog/objectaddress.c:1371 commands/policy.c:93 commands/policy.c:373 commands/tablecmds.c:257 commands/tablecmds.c:299 commands/tablecmds.c:2315 commands/tablecmds.c:12826 parser/parse_utilcmd.c:3249 +#, c-format +msgid "\"%s\" is not a table" +msgstr "\"%s\" ცხრილი áƒáƒ áƒáƒ" + +#: catalog/objectaddress.c:1378 commands/tablecmds.c:269 commands/tablecmds.c:17744 commands/view.c:114 +#, c-format +msgid "\"%s\" is not a view" +msgstr "\"%s\" ხედი áƒáƒ áƒáƒ" + +#: catalog/objectaddress.c:1385 commands/matview.c:183 commands/tablecmds.c:275 commands/tablecmds.c:17749 +#, c-format +msgid "\"%s\" is not a materialized view" +msgstr "\"%s\" áƒáƒ  áƒáƒ áƒ˜áƒ¡ მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედი" + +#: catalog/objectaddress.c:1392 commands/tablecmds.c:293 commands/tablecmds.c:17754 +#, c-format +msgid "\"%s\" is not a foreign table" +msgstr "\"%s\" გáƒáƒ áƒ” ცხრილი áƒáƒ áƒáƒ" + +#: catalog/objectaddress.c:1433 +#, c-format +msgid "must specify relation and object name" +msgstr "ურთიერთáƒáƒ‘ის დრáƒáƒ‘იექტის სáƒáƒ®áƒ”ლის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: catalog/objectaddress.c:1509 catalog/objectaddress.c:1562 +#, c-format +msgid "column name must be qualified" +msgstr "სვეტს სáƒáƒ®áƒ”ლი სრულáƒáƒ“ უნდრმიუთითáƒáƒ—" + +#: catalog/objectaddress.c:1581 +#, c-format +msgid "default value for column \"%s\" of relation \"%s\" does not exist" +msgstr "ურთიერთáƒáƒ‘ის (%2$s) სვეტის (%1$s) ნáƒáƒ’ულისხმევი მნიშვნელáƒáƒ‘რáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/objectaddress.c:1618 commands/functioncmds.c:132 commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3843 parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 utils/adt/acl.c:4554 +#, c-format +msgid "type \"%s\" does not exist" +msgstr "ტიპი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/objectaddress.c:1737 +#, c-format +msgid "operator %d (%s, %s) of %s does not exist" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ %d (%s, %s) %s-დáƒáƒœ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/objectaddress.c:1768 +#, c-format +msgid "function %d (%s, %s) of %s does not exist" +msgstr "ფუნქცირ%d (%s, %s) %s-დáƒáƒœ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/objectaddress.c:1819 catalog/objectaddress.c:1845 +#, c-format +msgid "user mapping for user \"%s\" on server \"%s\" does not exist" +msgstr "სერვერზე (%2$s) მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ბმრ%1$s-სთვის áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/objectaddress.c:1834 commands/foreigncmds.c:430 commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:703 +#, c-format +msgid "server \"%s\" does not exist" +msgstr "სერვერი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/objectaddress.c:1901 +#, c-format +msgid "publication relation \"%s\" in publication \"%s\" does not exist" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ურთიერთáƒáƒ‘რ%s პუბლიკáƒáƒªáƒ˜áƒáƒ¨áƒ˜ %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘" + +#: catalog/objectaddress.c:1948 +#, c-format +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სქემრ%s პუბლიკáƒáƒªáƒ˜áƒáƒ¨áƒ˜ %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/objectaddress.c:2006 +#, c-format +msgid "unrecognized default ACL object type \"%c\"" +msgstr "ნáƒáƒ’ულისხმევი ACL áƒáƒ‘იექტის უცნáƒáƒ‘ი ტიპი \"%c\"" + +#: catalog/objectaddress.c:2007 +#, c-format +msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." +msgstr "áƒáƒ‘იექტის სწáƒáƒ áƒ˜ ტიპებირ\"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." + +#: catalog/objectaddress.c:2058 +#, c-format +msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" +msgstr "ნáƒáƒ’ულისხმევი ACL მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის %s სქემáƒáƒ¨áƒ˜ %s %s-ზე áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/objectaddress.c:2063 +#, c-format +msgid "default ACL for user \"%s\" on %s does not exist" +msgstr "ნáƒáƒ’ულისხმევი ACL მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\" \"%s\"-ზე áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/objectaddress.c:2089 catalog/objectaddress.c:2146 catalog/objectaddress.c:2201 +#, c-format +msgid "name or argument lists may not contain nulls" +msgstr "სáƒáƒ®áƒ”ლი áƒáƒœ áƒáƒ áƒ’უმენტი áƒáƒ  შეიძლებრნულáƒáƒ•áƒáƒœ სიმბáƒáƒšáƒáƒ¡ შეიცáƒáƒ•დეს" + +#: catalog/objectaddress.c:2123 +#, c-format +msgid "unsupported object type \"%s\"" +msgstr "áƒáƒ‘იექტის მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი ტიპი: \"%s\"" + +#: catalog/objectaddress.c:2142 catalog/objectaddress.c:2159 catalog/objectaddress.c:2224 catalog/objectaddress.c:2308 +#, c-format +msgid "name list length must be exactly %d" +msgstr "სáƒáƒ®áƒ”ლების სიის სიგრძე ზუსტáƒáƒ“ %d უნდრიყáƒáƒ¡" + +#: catalog/objectaddress.c:2163 +#, c-format +msgid "large object OID may not be null" +msgstr "დიდი áƒáƒ‘იექტის OID ნულის ტáƒáƒšáƒ˜ áƒáƒ  შეიძლებრიყáƒáƒ¡" + +#: catalog/objectaddress.c:2172 catalog/objectaddress.c:2242 catalog/objectaddress.c:2249 +#, c-format +msgid "name list length must be at least %d" +msgstr "სáƒáƒ®áƒ”ლების სიის სიგრძე ყველáƒáƒ–ე ცáƒáƒ¢áƒ %d უნდრიყáƒáƒ¡" + +#: catalog/objectaddress.c:2235 catalog/objectaddress.c:2256 +#, c-format +msgid "argument list length must be exactly %d" +msgstr "áƒáƒ áƒ’უმენტების სიის სიგრძე ზუსტáƒáƒ“ %d უნდრიყáƒáƒ¡" + +#: catalog/objectaddress.c:2470 libpq/be-fsstubs.c:329 +#, c-format +msgid "must be owner of large object %u" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ დიდი áƒáƒ‘იექტის მფლáƒáƒ‘ელი: %u" + +#: catalog/objectaddress.c:2485 commands/functioncmds.c:1560 +#, c-format +msgid "must be owner of type %s or type %s" +msgstr "უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ მფლáƒáƒ‘ელი ტიპისრ%s áƒáƒœ %s" + +#: catalog/objectaddress.c:2512 catalog/objectaddress.c:2521 catalog/objectaddress.c:2527 +#, c-format +msgid "permission denied" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: catalog/objectaddress.c:2513 catalog/objectaddress.c:2522 +#, c-format +msgid "The current user must have the %s attribute." +msgstr "მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს %s áƒáƒ¢áƒ áƒ˜áƒ‘უტი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ უნდრჰქáƒáƒœáƒ“ეს." + +#: catalog/objectaddress.c:2528 +#, c-format +msgid "The current user must have the %s option on role \"%s\"." +msgstr "მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს უნდრჰქáƒáƒœáƒ“ეს %s პáƒáƒ áƒáƒ›áƒ”ტრი რáƒáƒšáƒ–ე \"%s\"." + +#: catalog/objectaddress.c:2542 +#, c-format +msgid "must be superuser" +msgstr "უნდრიყáƒáƒ¡ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი" + +#: catalog/objectaddress.c:2611 +#, c-format +msgid "unrecognized object type \"%s\"" +msgstr "áƒáƒ‘იექტის უცნáƒáƒ‘ი ტიპი: %s" + +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:2903 +#, c-format +msgid "column %s of %s" +msgstr "სვეტი %s %s-ზე" + +#: catalog/objectaddress.c:2918 +#, c-format +msgid "function %s" +msgstr "ფუნქცირ%s" + +#: catalog/objectaddress.c:2931 +#, c-format +msgid "type %s" +msgstr "ტიპი %s" + +#: catalog/objectaddress.c:2968 +#, c-format +msgid "cast from %s to %s" +msgstr "%s-დáƒáƒœ %s" + +#: catalog/objectaddress.c:3001 +#, c-format +msgid "collation %s" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ %s" + +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:3032 +#, c-format +msgid "constraint %s on %s" +msgstr "%s-ის შეზღუდვრ%s-ზე" + +#: catalog/objectaddress.c:3038 +#, c-format +msgid "constraint %s" +msgstr "შეზღუდვრ%s" + +#: catalog/objectaddress.c:3070 +#, c-format +msgid "conversion %s" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ: %s" + +#. translator: %s is typically "column %s of table %s" +#: catalog/objectaddress.c:3092 +#, c-format +msgid "default value for %s" +msgstr "%s-ის ნáƒáƒ’ულისხმევი მნიშვნელáƒáƒ‘áƒ" + +#: catalog/objectaddress.c:3103 +#, c-format +msgid "language %s" +msgstr "ენრ%s" + +#: catalog/objectaddress.c:3111 +#, c-format +msgid "large object %u" +msgstr "დიდი áƒáƒ‘იექტი %u" + +#: catalog/objectaddress.c:3124 +#, c-format +msgid "operator %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ %s" + +#: catalog/objectaddress.c:3161 +#, c-format +msgid "operator class %s for access method %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡ %s წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის %s" + +#: catalog/objectaddress.c:3189 +#, c-format +msgid "access method %s" +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ი: %s" + +#. translator: %d is the operator strategy (a number), the +#. first two %s's are data type names, the third %s is the +#. description of the operator family, and the last %s is the +#. textual form of the operator with arguments. +#: catalog/objectaddress.c:3238 +#, c-format +msgid "operator %d (%s, %s) of %s: %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ %d (%s, %s) of %s: %s" + +#. translator: %d is the function number, the first two %s's +#. are data type names, the third %s is the description of the +#. operator family, and the last %s is the textual form of the +#. function with arguments. +#: catalog/objectaddress.c:3295 +#, c-format +msgid "function %d (%s, %s) of %s: %s" +msgstr "ფუნქცირ%d (%s, %s) of %s: %s" + +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:3347 +#, c-format +msgid "rule %s on %s" +msgstr "წესი %s %s-ზე" + +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:3393 +#, c-format +msgid "trigger %s on %s" +msgstr "ტრიგერი %s %s-ზე" + +#: catalog/objectaddress.c:3413 +#, c-format +msgid "schema %s" +msgstr "სქემრ%s" + +#: catalog/objectaddress.c:3441 +#, c-format +msgid "statistics object %s" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ‘იექტი %s" + +#: catalog/objectaddress.c:3472 +#, c-format +msgid "text search parser %s" +msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი \"%s\"" + +#: catalog/objectaddress.c:3503 +#, c-format +msgid "text search dictionary %s" +msgstr "ტექსტის ძებნის ლექსიკáƒáƒœáƒ˜ %s" + +#: catalog/objectaddress.c:3534 +#, c-format +msgid "text search template %s" +msgstr "ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ˜ %s" + +#: catalog/objectaddress.c:3565 +#, c-format +msgid "text search configuration %s" +msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ \"%s\"" + +#: catalog/objectaddress.c:3578 +#, c-format +msgid "role %s" +msgstr "რáƒáƒšáƒ˜ %s" + +#: catalog/objectaddress.c:3615 catalog/objectaddress.c:5464 +#, c-format +msgid "membership of role %s in role %s" +msgstr "რáƒáƒšáƒ˜áƒ¡ (%s) წევრáƒáƒ‘რრáƒáƒšáƒ¨áƒ˜ %s" + +#: catalog/objectaddress.c:3636 +#, c-format +msgid "database %s" +msgstr "ბáƒáƒ–áƒ: %s" + +#: catalog/objectaddress.c:3652 +#, c-format +msgid "tablespace %s" +msgstr "ცხრილების სივრცე %s" + +#: catalog/objectaddress.c:3663 +#, c-format +msgid "foreign-data wrapper %s" +msgstr "გáƒáƒ áƒ”-მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜ %s" + +#: catalog/objectaddress.c:3673 +#, c-format +msgid "server %s" +msgstr "სერვერი %s" + +#: catalog/objectaddress.c:3706 +#, c-format +msgid "user mapping for %s on server %s" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ბმრ%s-სთვის სერვერზე %s" + +#: catalog/objectaddress.c:3758 +#, c-format +msgid "default privileges on new relations belonging to role %s in schema %s" +msgstr "ნáƒáƒ’ულისხმევი პრივილეგიები áƒáƒ®áƒáƒš ურთიერთáƒáƒ‘ებზე, რáƒáƒ›áƒ”ლიც ეკუთვნის რáƒáƒšáƒ¡ %s, სქემáƒáƒ¨áƒ˜ %s" + +#: catalog/objectaddress.c:3762 +#, c-format +msgid "default privileges on new relations belonging to role %s" +msgstr "ნáƒáƒ’ულისხმევი პრივილეგიები áƒáƒ®áƒáƒš ურთიერთáƒáƒ‘ებზე, რáƒáƒ›áƒ”ლიც ეკუთვნის რáƒáƒšáƒ¡ %s" + +#: catalog/objectaddress.c:3768 +#, c-format +msgid "default privileges on new sequences belonging to role %s in schema %s" +msgstr "ნáƒáƒ’ულისხმევი პრივილეგიები áƒáƒ®áƒáƒš მიმდევრáƒáƒ‘ებზე, რáƒáƒ›áƒ”ლიც ეკუთვნის რáƒáƒšáƒ¡ %s სქემáƒáƒ¨áƒ˜ %s" + +#: catalog/objectaddress.c:3772 +#, c-format +msgid "default privileges on new sequences belonging to role %s" +msgstr "ნáƒáƒ’ულისხმევი პრივილეგიები áƒáƒ®áƒáƒš მიმდევრáƒáƒ‘ებზე, რáƒáƒ›áƒ”ლიც ეკუთვნის რáƒáƒšáƒ¡ %s" + +#: catalog/objectaddress.c:3778 +#, c-format +msgid "default privileges on new functions belonging to role %s in schema %s" +msgstr "ნáƒáƒ’ულისხმევი პრივილეგიები áƒáƒ®áƒáƒš ფუნქციებზე, რáƒáƒ›áƒ”ლიც ეკუთვნის რáƒáƒšáƒ¡ %s სქემáƒáƒ¨áƒ˜ %s" + +#: catalog/objectaddress.c:3782 +#, c-format +msgid "default privileges on new functions belonging to role %s" +msgstr "ნáƒáƒ’ულისხმევი პრივილეგიები áƒáƒ®áƒáƒš ფუნქციებზე, რáƒáƒ›áƒ”ლიც ეკუთვნის რáƒáƒšáƒ¡ %s" + +#: catalog/objectaddress.c:3788 +#, c-format +msgid "default privileges on new types belonging to role %s in schema %s" +msgstr "ნáƒáƒ’ულისხმევი პრივილეგიები áƒáƒ®áƒáƒš სქემáƒáƒ–ე, რáƒáƒ›áƒ”ლიც ეკუთვნის რáƒáƒšáƒ¡ %s სქემáƒáƒ¨áƒ˜ %s" + +#: catalog/objectaddress.c:3792 +#, c-format +msgid "default privileges on new types belonging to role %s" +msgstr "ნáƒáƒ’ულისხმევი პრივილეგიები áƒáƒ®áƒáƒš ტიპებზე, რáƒáƒ›áƒ”ლიც ეკუთვნის რáƒáƒšáƒ¡ %s" + +#: catalog/objectaddress.c:3798 +#, c-format +msgid "default privileges on new schemas belonging to role %s" +msgstr "ნáƒáƒ’ულისხმევი პრივილეგიები áƒáƒ®áƒáƒš სქემáƒáƒ–ე, რáƒáƒ›áƒ”ლიც ეკუთვნის რáƒáƒšáƒ¡ %s" + +#: catalog/objectaddress.c:3805 +#, c-format +msgid "default privileges belonging to role %s in schema %s" +msgstr "სქემáƒáƒ¨áƒ˜ (%s) რáƒáƒšáƒ˜áƒ¡ (%s) ნáƒáƒ’ულისხმევი პრივილეგიები" + +#: catalog/objectaddress.c:3809 +#, c-format +msgid "default privileges belonging to role %s" +msgstr "რáƒáƒšáƒ˜áƒ¡ (%s) ნáƒáƒ’ულისხმევი პრივილეგიები" + +#: catalog/objectaddress.c:3831 +#, c-format +msgid "extension %s" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბa %s" + +#: catalog/objectaddress.c:3848 +#, c-format +msgid "event trigger %s" +msgstr "მáƒáƒ•ლენის ტრიგერი %s" + +#: catalog/objectaddress.c:3872 +#, c-format +msgid "parameter %s" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი %s" + +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:3915 +#, c-format +msgid "policy %s on %s" +msgstr "წესი %s %s-ზე" + +#: catalog/objectaddress.c:3929 +#, c-format +msgid "publication %s" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ %s" + +#: catalog/objectaddress.c:3942 +#, c-format +msgid "publication of schema %s in publication %s" +msgstr "სქემის (%s) პუბლიკáƒáƒªáƒ˜áƒ პუბლიკáƒáƒªáƒ˜áƒáƒ¨áƒ˜ %s" + +#. translator: first %s is, e.g., "table %s" +#: catalog/objectaddress.c:3973 +#, c-format +msgid "publication of %s in publication %s" +msgstr "%s-ის პუბლიკáƒáƒªáƒ˜áƒ პუბლიკáƒáƒªáƒ˜áƒáƒ¨áƒ˜ %s" + +#: catalog/objectaddress.c:3986 +#, c-format +msgid "subscription %s" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რრ%s" + +#: catalog/objectaddress.c:4007 +#, c-format +msgid "transform for %s language %s" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ %s-სთვის, ენისთვის %s" + +#: catalog/objectaddress.c:4076 +#, c-format +msgid "table %s" +msgstr "ცხრილი %s" + +#: catalog/objectaddress.c:4081 +#, c-format +msgid "index %s" +msgstr "ინდექსი %s" + +#: catalog/objectaddress.c:4085 +#, c-format +msgid "sequence %s" +msgstr "თáƒáƒœáƒ›áƒ˜áƒ›áƒ“ევრáƒáƒ‘რ%s" + +#: catalog/objectaddress.c:4089 +#, c-format +msgid "toast table %s" +msgstr "toast ცხრილი \"%s\"" + +#: catalog/objectaddress.c:4093 +#, c-format +msgid "view %s" +msgstr "%s-ის ხედი" + +#: catalog/objectaddress.c:4097 +#, c-format +msgid "materialized view %s" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედი %s" + +#: catalog/objectaddress.c:4101 +#, c-format +msgid "composite type %s" +msgstr "კáƒáƒ›áƒžáƒáƒ–იტის ტიპი \"%s\"" + +#: catalog/objectaddress.c:4105 +#, c-format +msgid "foreign table %s" +msgstr "გáƒáƒ áƒ” ცხრილი \"%s\"" + +#: catalog/objectaddress.c:4110 +#, c-format +msgid "relation %s" +msgstr "ურთიერთáƒáƒ‘რ%s" + +#: catalog/objectaddress.c:4151 +#, c-format +msgid "operator family %s for access method %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ %s წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის %s" + +#: catalog/pg_aggregate.c:129 +#, c-format +msgid "aggregates cannot have more than %d argument" +msgid_plural "aggregates cannot have more than %d arguments" +msgstr[0] "áƒáƒ’რეგáƒáƒ¢áƒ”ბს %d áƒáƒ áƒ’უმენტზე მეტი áƒáƒ  შეიძლებრჰქáƒáƒœáƒ“ეთ" +msgstr[1] "áƒáƒ’რეგáƒáƒ¢áƒ”ბს %d áƒáƒ áƒ’უმენტზე მეტი áƒáƒ  შეიძლებრჰქáƒáƒœáƒ“ეთ" + +#: catalog/pg_aggregate.c:144 catalog/pg_aggregate.c:158 +#, c-format +msgid "cannot determine transition data type" +msgstr "მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ტიპის გáƒáƒœáƒ¡áƒáƒ–ღვრრშეუძლებელიáƒ" + +#: catalog/pg_aggregate.c:173 +#, c-format +msgid "a variadic ordered-set aggregate must use VARIADIC type ANY" +msgstr "" + +#: catalog/pg_aggregate.c:199 +#, c-format +msgid "a hypothetical-set aggregate must have direct arguments matching its aggregated arguments" +msgstr "" + +#: catalog/pg_aggregate.c:246 catalog/pg_aggregate.c:290 +#, c-format +msgid "return type of transition function %s is not %s" +msgstr "ტიპი, რáƒáƒ›áƒ”ლსáƒáƒª გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ფუნქცირ%s-ი áƒáƒ‘რუნებს, %s áƒáƒ áƒáƒ" + +#: catalog/pg_aggregate.c:266 catalog/pg_aggregate.c:309 +#, c-format +msgid "must not omit initial value when transition function is strict and transition type is not compatible with input type" +msgstr "" + +#: catalog/pg_aggregate.c:335 +#, c-format +msgid "return type of inverse transition function %s is not %s" +msgstr "ინვერსიული გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ფუნქციის (\"%s\") დáƒáƒ‘რუნების ტიპი %s áƒáƒ áƒáƒ" + +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2992 +#, c-format +msgid "strictness of aggregate's forward and inverse transition functions must match" +msgstr "" + +#: catalog/pg_aggregate.c:396 catalog/pg_aggregate.c:554 +#, c-format +msgid "final function with extra arguments must not be declared STRICT" +msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბითი áƒáƒ áƒ’უმენტებს მქáƒáƒœáƒ” ფინáƒáƒšáƒ£áƒ áƒ˜ ფუნქცირáƒáƒ  შეიძლებრSTRICT-ით áƒáƒ¦áƒ¬áƒ”რáƒáƒ—" + +#: catalog/pg_aggregate.c:427 +#, c-format +msgid "return type of combine function %s is not %s" +msgstr "ტიპი, რáƒáƒ›áƒ”ლსáƒáƒª კáƒáƒ›áƒ‘ინირებული ფუნქცირ%s-ი áƒáƒ‘რუნებს, %s áƒáƒ áƒáƒ" + +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3902 +#, c-format +msgid "combine function with transition type %s must not be declared STRICT" +msgstr "კáƒáƒ›áƒ‘ინირებული ფუნქცირგáƒáƒ áƒ“áƒáƒ¡áƒ•ლის ტიპით %s áƒáƒ  შეიძლებრáƒáƒ¦áƒ¬áƒ”რილი იყáƒáƒ¡, რáƒáƒ’áƒáƒ áƒª STRICT" + +#: catalog/pg_aggregate.c:458 +#, c-format +msgid "return type of serialization function %s is not %s" +msgstr "სერიáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ ფუნქციის (%s) დáƒáƒ‘რუნების ტიპი %s áƒáƒ áƒáƒ" + +#: catalog/pg_aggregate.c:479 +#, c-format +msgid "return type of deserialization function %s is not %s" +msgstr "დესერიáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ ფუნქციის (%s) დáƒáƒ‘რუნების ტიპი %s áƒáƒ áƒáƒ" + +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:189 catalog/pg_proc.c:223 +#, c-format +msgid "cannot determine result data type" +msgstr "შედეგის მáƒáƒœáƒáƒªáƒ”მების ტიპის დáƒáƒ“გენრშეუძლებელიáƒ" + +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:202 catalog/pg_proc.c:231 +#, c-format +msgid "unsafe use of pseudo-type \"internal\"" +msgstr "ფსევდáƒ-ტიპი \"internal\" áƒáƒ áƒáƒ£áƒ¡áƒáƒ¤áƒ áƒ—ხáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: catalog/pg_aggregate.c:567 +#, c-format +msgid "moving-aggregate implementation returns type %s, but plain implementation returns type %s" +msgstr "" + +#: catalog/pg_aggregate.c:578 +#, c-format +msgid "sort operator can only be specified for single-argument aggregates" +msgstr "" + +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:384 +#, c-format +msgid "cannot change routine kind" +msgstr "ქვეპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ ტიპის შეცვლრშეუძლებელიáƒ" + +#: catalog/pg_aggregate.c:708 +#, c-format +msgid "\"%s\" is an ordinary aggregate function." +msgstr "\"%s\" ჩვეულებრივი áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციáƒáƒ." + +#: catalog/pg_aggregate.c:710 +#, c-format +msgid "\"%s\" is an ordered-set aggregate." +msgstr "\"%s\" დáƒáƒšáƒáƒ’ებული-სეტის áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ." + +#: catalog/pg_aggregate.c:712 +#, c-format +msgid "\"%s\" is a hypothetical-set aggregate." +msgstr "\"%s\" ჰიპáƒáƒ—ეტიკური-სეტის áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ." + +#: catalog/pg_aggregate.c:717 +#, c-format +msgid "cannot change number of direct arguments of an aggregate function" +msgstr "" + +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:686 commands/typecmds.c:1985 commands/typecmds.c:2031 commands/typecmds.c:2083 commands/typecmds.c:2120 commands/typecmds.c:2154 commands/typecmds.c:2188 commands/typecmds.c:2222 commands/typecmds.c:2251 commands/typecmds.c:2338 commands/typecmds.c:2380 parser/parse_func.c:417 parser/parse_func.c:448 parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 parser/parse_func.c:631 +#: parser/parse_func.c:2172 parser/parse_func.c:2445 +#, c-format +msgid "function %s does not exist" +msgstr "ფუნქცირ%s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/pg_aggregate.c:864 +#, c-format +msgid "function %s returns a set" +msgstr "ფუნქცირ%s სეტს áƒáƒ‘რუნებს" + +#: catalog/pg_aggregate.c:879 +#, c-format +msgid "function %s must accept VARIADIC ANY to be used in this aggregate" +msgstr "áƒáƒ› áƒáƒ’რეგáƒáƒ¢áƒ¨áƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ ფუნქცირ(%s) VARIADIC ANY-ს უნდრიღებდეს" + +#: catalog/pg_aggregate.c:903 +#, c-format +msgid "function %s requires run-time type coercion" +msgstr "" + +#: catalog/pg_cast.c:75 +#, c-format +msgid "cast from type %s to type %s already exists" +msgstr "დáƒáƒ™áƒáƒ¡áƒ¢áƒ•რტიპიდáƒáƒœ %s ტიპáƒáƒ›áƒ“ე %s უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/pg_class.c:29 +#, c-format +msgid "This operation is not supported for tables." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ ცხრილებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_class.c:31 +#, c-format +msgid "This operation is not supported for indexes." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ ინდექსებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_class.c:33 +#, c-format +msgid "This operation is not supported for sequences." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ მიმდევრáƒáƒ‘ებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_class.c:35 +#, c-format +msgid "This operation is not supported for TOAST tables." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ TOAST ცხრილებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_class.c:37 +#, c-format +msgid "This operation is not supported for views." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ ხედებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_class.c:39 +#, c-format +msgid "This operation is not supported for materialized views." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_class.c:41 +#, c-format +msgid "This operation is not supported for composite types." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ კáƒáƒ›áƒžáƒáƒ–იტური ტიპებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_class.c:43 +#, c-format +msgid "This operation is not supported for foreign tables." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ გáƒáƒ áƒ” ცხრილებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_class.c:45 +#, c-format +msgid "This operation is not supported for partitioned tables." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_class.c:47 +#, c-format +msgid "This operation is not supported for partitioned indexes." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ინდექსებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_collation.c:101 catalog/pg_collation.c:159 +#, c-format +msgid "collation \"%s\" already exists, skipping" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: catalog/pg_collation.c:103 +#, c-format +msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ \"%s\" კáƒáƒ“ირებისთვის \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 +#, c-format +msgid "collation \"%s\" already exists" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/pg_collation.c:113 +#, c-format +msgid "collation \"%s\" for encoding \"%s\" already exists" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ \"%s\" კáƒáƒ“ირებისთვის \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/pg_constraint.c:732 +#, c-format +msgid "constraint \"%s\" for domain %s already exists" +msgstr "შეზღუდვრ\"%s\" დáƒáƒ›áƒ”ნისთვის %s უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/pg_constraint.c:932 catalog/pg_constraint.c:1025 +#, c-format +msgid "constraint \"%s\" for table \"%s\" does not exist" +msgstr "ცხრილის (%2$s) შეზღუდვრ(%1$s) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/pg_constraint.c:1125 +#, c-format +msgid "constraint \"%s\" for domain %s does not exist" +msgstr "დáƒáƒ›áƒ”ნის (%2$s) შეზღუდვრ(%1$s) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/pg_conversion.c:64 +#, c-format +msgid "conversion \"%s\" already exists" +msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" + +#: catalog/pg_conversion.c:77 +#, c-format +msgid "default conversion for %s to %s already exists" +msgstr "%s-დáƒáƒœ %s-ზე ნáƒáƒ’ულისხმევი გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/pg_depend.c:224 commands/extension.c:3397 +#, c-format +msgid "%s is already a member of extension \"%s\"" +msgstr "%s გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის (\"%s\") წევრს უკვე წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: catalog/pg_depend.c:231 catalog/pg_depend.c:282 commands/extension.c:3437 +#, c-format +msgid "%s is not a member of extension \"%s\"" +msgstr "%s გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის \"%s\"წევრი áƒáƒ áƒáƒ" + +#: catalog/pg_depend.c:234 +#, c-format +msgid "An extension is not allowed to replace an object that it does not own." +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ¡ უფლებáƒ, ჩáƒáƒáƒœáƒáƒªáƒ•ლáƒáƒ¡ áƒáƒ‘იექტი, რáƒáƒ›áƒ”ლიც მáƒáƒ¡ áƒáƒ  ეკუთვნის, áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." + +#: catalog/pg_depend.c:285 +#, c-format +msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ¡ CREATE … IF NOT EXISTS-ის გáƒáƒ›áƒáƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ იმისთვის შეუძლიáƒáƒ—, რáƒáƒ› გáƒáƒ›áƒáƒ¢áƒáƒ•áƒáƒœ áƒáƒ‘იექტის შექმნáƒ, თუ კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ£áƒ áƒ˜ áƒáƒ‘იექტი მáƒáƒ¡ უკვე ეკუთვნის." + +#: catalog/pg_depend.c:648 +#, c-format +msgid "cannot remove dependency on %s because it is a system object" +msgstr "%s-ზე დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებáƒáƒ¡ ვერ მáƒáƒáƒªáƒ˜áƒšáƒ”ბთ. ის სისტემური áƒáƒ‘იექტიáƒ" + +#: catalog/pg_enum.c:175 catalog/pg_enum.c:314 catalog/pg_enum.c:624 +#, c-format +msgid "invalid enum label \"%s\"" +msgstr "ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ჭდე: \"%s\"" + +#: catalog/pg_enum.c:176 catalog/pg_enum.c:315 catalog/pg_enum.c:625 +#, c-format +msgid "Labels must be %d bytes or less." +msgstr "ჭდეები %d áƒáƒœ ნáƒáƒ™áƒšáƒ”ბი ბáƒáƒ˜áƒ¢áƒ˜ უნდრიყáƒáƒ¡." + +#: catalog/pg_enum.c:343 +#, c-format +msgid "enum label \"%s\" already exists, skipping" +msgstr "ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜áƒ¡ ჭდე (\"%s\") უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: catalog/pg_enum.c:350 catalog/pg_enum.c:668 +#, c-format +msgid "enum label \"%s\" already exists" +msgstr "ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜áƒ¡ ჭდე (\"%s\") უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/pg_enum.c:405 catalog/pg_enum.c:663 +#, c-format +msgid "\"%s\" is not an existing enum label" +msgstr "\"%s\" ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜áƒ¡ áƒáƒ áƒ¡áƒ”ბულ ჭდეს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: catalog/pg_enum.c:463 +#, c-format +msgid "pg_enum OID value not set when in binary upgrade mode" +msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის რეჟიმში pg_enum-ის OID-ის მნიშვნელáƒáƒ‘რდáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: catalog/pg_enum.c:473 +#, c-format +msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" +msgstr "ALTER TYPE ADD წინáƒáƒ¡áƒ¬áƒáƒ / შემდეგ შეუთáƒáƒ•სებელირáƒáƒ áƒáƒ‘ითი გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ¡áƒ—áƒáƒœ" + +#: catalog/pg_inherits.c:592 +#, c-format +msgid "cannot detach partition \"%s\"" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ \"%s\" მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: catalog/pg_inherits.c:594 +#, c-format +msgid "The partition is being detached concurrently or has an unfinished detach." +msgstr "ხდებრდáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ®áƒ¡áƒœáƒ áƒáƒœ მáƒáƒ®áƒ¡áƒœáƒ დáƒáƒ£áƒ›áƒ—áƒáƒ•რებელიáƒ." + +#: catalog/pg_inherits.c:595 commands/tablecmds.c:4778 commands/tablecmds.c:16053 +#, c-format +msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." +msgstr "მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ”ბლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ALTER TABLE ... DETACH PARTITION ... FINALIZE ." + +#: catalog/pg_inherits.c:599 +#, c-format +msgid "cannot complete detaching partition \"%s\"" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ \"%s\" მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ" + +#: catalog/pg_inherits.c:601 +#, c-format +msgid "There's no pending concurrent detach." +msgstr "დáƒáƒ áƒ©áƒ”ნილი პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ®áƒ¡áƒœáƒ რიგში áƒáƒ áƒáƒ." + +#: catalog/pg_namespace.c:64 commands/schemacmds.c:273 +#, c-format +msgid "schema \"%s\" already exists" +msgstr "სქემრ\"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/pg_operator.c:213 catalog/pg_operator.c:355 +#, c-format +msgid "\"%s\" is not a valid operator name" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\"" + +#: catalog/pg_operator.c:379 +#, c-format +msgid "operator %s already exists" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ %s უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/pg_operator.c:445 commands/operatorcmds.c:600 +#, c-format +msgid "operator cannot be its own negator" +msgstr "" + +#: catalog/pg_operator.c:572 +#, c-format +msgid "only binary operators can have commutators" +msgstr "კáƒáƒ›áƒ£áƒ¢áƒáƒ¢áƒáƒ áƒ”ბი მხáƒáƒšáƒáƒ“ ბინáƒáƒ áƒ£áƒš áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბს შეიძლებრჰქáƒáƒœáƒ“ეთ" + +#: catalog/pg_operator.c:576 +#, c-format +msgid "only binary operators can have join selectivity" +msgstr "შეერთების áƒáƒ áƒ©áƒ”ვáƒáƒ“áƒáƒ‘რმხáƒáƒšáƒáƒ“" + +#: catalog/pg_operator.c:580 +#, c-format +msgid "only binary operators can merge join" +msgstr "შერწყმრმხáƒáƒšáƒáƒ“ ბინáƒáƒ áƒ£áƒš áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბს შეუძლიáƒáƒ—" + +#: catalog/pg_operator.c:584 +#, c-format +msgid "only binary operators can hash" +msgstr "ჰეში მხáƒáƒšáƒáƒ“ ბინáƒáƒ áƒ£áƒš áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბს შეუძლიáƒáƒ—" + +#: catalog/pg_operator.c:593 +#, c-format +msgid "only boolean operators can have negators" +msgstr "" + +#: catalog/pg_operator.c:597 +#, c-format +msgid "only boolean operators can have restriction selectivity" +msgstr "შეზღუდვის áƒáƒ áƒ©áƒ”ვáƒáƒ“áƒáƒ‘რმხáƒáƒšáƒáƒ“ ლáƒáƒ’იკურ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბს შეიძლებრჰქáƒáƒœáƒ“ეთ" + +#: catalog/pg_operator.c:601 +#, c-format +msgid "only boolean operators can have join selectivity" +msgstr "შეერთების áƒáƒ áƒ©áƒ”ვáƒáƒ“áƒáƒ‘რმხáƒáƒšáƒáƒ“ ლáƒáƒ’იკურ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბს შეიძლებრჰქáƒáƒœáƒ“ეთ" + +#: catalog/pg_operator.c:605 +#, c-format +msgid "only boolean operators can merge join" +msgstr "შეერთების შერწყმრმხáƒáƒšáƒáƒ“ ლáƒáƒ’იკურ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბს შეუძლიáƒáƒ—" + +#: catalog/pg_operator.c:609 +#, c-format +msgid "only boolean operators can hash" +msgstr "ჰეშáƒáƒ‘რმხáƒáƒšáƒáƒ“ ლáƒáƒ’იკურ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბს შეუძლიáƒáƒ—" + +#: catalog/pg_operator.c:739 +#, c-format +msgid "commutator operator %s is already the commutator of operator %s" +msgstr "კáƒáƒ›áƒ£áƒ¢áƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ %s უკვე კáƒáƒ›áƒ£áƒ¢áƒáƒ¢áƒáƒ áƒ˜áƒ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡áƒ—ვის %s" + +#: catalog/pg_operator.c:744 +#, c-format +msgid "commutator operator %s is already the commutator of operator %u" +msgstr "" + +#: catalog/pg_operator.c:807 +#, c-format +msgid "negator operator %s is already the negator of operator %s" +msgstr "" + +#: catalog/pg_operator.c:812 +#, c-format +msgid "negator operator %s is already the negator of operator %u" +msgstr "" + +#: catalog/pg_parameter_acl.c:50 +#, c-format +msgid "parameter ACL \"%s\" does not exist" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი ACL \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/pg_proc.c:130 parser/parse_func.c:2234 +#, c-format +msgid "functions cannot have more than %d argument" +msgid_plural "functions cannot have more than %d arguments" +msgstr[0] "ფუნქციებს %d-ზე მეტი áƒáƒ áƒ’უმენტი áƒáƒ  შეიძლებრჰქáƒáƒœáƒ“ეთ" +msgstr[1] "ფუნქციებს %d-ზე მეტი áƒáƒ áƒ’უმენტი áƒáƒ  შეიძლებრჰქáƒáƒœáƒ“ეთ" + +#: catalog/pg_proc.c:374 +#, c-format +msgid "function \"%s\" already exists with same argument types" +msgstr "ფუნქცირ\"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს იგივე áƒáƒ áƒ’უმენტის ტიპებით" + +#: catalog/pg_proc.c:386 +#, c-format +msgid "\"%s\" is an aggregate function." +msgstr "\"%s\" áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციáƒáƒ." + +#: catalog/pg_proc.c:388 +#, c-format +msgid "\"%s\" is a function." +msgstr "\"%s\" ფუნქციáƒáƒ." + +#: catalog/pg_proc.c:390 +#, c-format +msgid "\"%s\" is a procedure." +msgstr "\"%s\" პრáƒáƒªáƒ”დურáƒáƒ." + +#: catalog/pg_proc.c:392 +#, c-format +msgid "\"%s\" is a window function." +msgstr "\"%s\" ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციáƒáƒ." + +#: catalog/pg_proc.c:412 +#, c-format +msgid "cannot change whether a procedure has output parameters" +msgstr "ფáƒáƒ¥áƒ¢áƒ¡, áƒáƒ¥áƒ•ს თუ áƒáƒ áƒ პრáƒáƒªáƒ”დურáƒáƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები, ვერ შეცვლით" + +#: catalog/pg_proc.c:413 catalog/pg_proc.c:443 +#, c-format +msgid "cannot change return type of existing function" +msgstr "áƒáƒ áƒ¡áƒ”ბული ფუნქციის მნიშვნელáƒáƒ‘ის დáƒáƒ‘რუნების ტიპს ვერ შეცვლით" + +#. translator: first %s is DROP FUNCTION, DROP PROCEDURE, or DROP +#. AGGREGATE +#. +#. translator: first %s is DROP FUNCTION or DROP PROCEDURE +#: catalog/pg_proc.c:419 catalog/pg_proc.c:446 catalog/pg_proc.c:491 catalog/pg_proc.c:517 catalog/pg_proc.c:541 +#, c-format +msgid "Use %s %s first." +msgstr "ჯერ შეáƒáƒ¡áƒ áƒ£áƒšáƒ”თ %s %s." + +#: catalog/pg_proc.c:444 +#, c-format +msgid "Row type defined by OUT parameters is different." +msgstr "OUT პáƒáƒ áƒáƒ›áƒ”ტრების მიერ áƒáƒ¦áƒ¬áƒ”რილი მწკრივის ტიპი გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ებულიáƒ." + +#: catalog/pg_proc.c:488 +#, c-format +msgid "cannot change name of input parameter \"%s\"" +msgstr "შეყვáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის სáƒáƒ®áƒ”ლის შეცვლრშეუძლებელიáƒ: \"%s\"" + +#: catalog/pg_proc.c:515 +#, c-format +msgid "cannot remove parameter defaults from existing function" +msgstr "áƒáƒ áƒ¡áƒ”ბული ფუნქციიდáƒáƒœ პáƒáƒ áƒáƒ›áƒ”ტრის ნáƒáƒ’ულისხმევი მნიშვნელáƒáƒ‘ების წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: catalog/pg_proc.c:539 +#, c-format +msgid "cannot change data type of existing parameter default value" +msgstr "áƒáƒ áƒ¡áƒ”ბული პáƒáƒ áƒáƒ›áƒ”ტრის ნáƒáƒ’ულისხმევი მნიშვნელáƒáƒ‘ის მáƒáƒœáƒáƒªáƒ”მის ტიპს ვერ შეცვლით" + +#: catalog/pg_proc.c:750 +#, c-format +msgid "there is no built-in function named \"%s\"" +msgstr "ჩáƒáƒ¨áƒ”ნებული ფუნქცირსáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: catalog/pg_proc.c:843 +#, c-format +msgid "SQL functions cannot return type %s" +msgstr "SQL ფუნქციებს %s ტიპის დáƒáƒ‘რუნებრáƒáƒ  შეუძლიáƒáƒ—" + +#: catalog/pg_proc.c:858 +#, c-format +msgid "SQL functions cannot have arguments of type %s" +msgstr "SQL ფუნქციებს \"%s\" ტიპის áƒáƒ áƒ’უმენტები ვერ იქნებáƒ" + +#: catalog/pg_proc.c:986 executor/functions.c:1467 +#, c-format +msgid "SQL function \"%s\"" +msgstr "SQL ფუნქცირ\"%s\"" + +#: catalog/pg_publication.c:66 catalog/pg_publication.c:74 catalog/pg_publication.c:82 catalog/pg_publication.c:88 +#, c-format +msgid "cannot add relation \"%s\" to publication" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის ურთიერთáƒáƒ‘ის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ: %s" + +#: catalog/pg_publication.c:76 +#, c-format +msgid "This operation is not supported for system tables." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ სისტემური ცხრილებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_publication.c:84 +#, c-format +msgid "This operation is not supported for temporary tables." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ დრáƒáƒ”ბითი ცხრილებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_publication.c:90 +#, c-format +msgid "This operation is not supported for unlogged tables." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ áƒáƒ áƒáƒŸáƒ£áƒ áƒœáƒáƒšáƒ˜áƒ áƒ”ბáƒáƒ“ი ცხრილებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_publication.c:104 catalog/pg_publication.c:112 +#, c-format +msgid "cannot add schema \"%s\" to publication" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სქემის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ: %s" + +#: catalog/pg_publication.c:106 +#, c-format +msgid "This operation is not supported for system schemas." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ სისტემური სქემებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: catalog/pg_publication.c:114 +#, c-format +msgid "Temporary schemas cannot be replicated." +msgstr "დრáƒáƒ”ბითი სქემების რეპლიკáƒáƒªáƒ˜áƒ შეუძლებელიáƒ." + +#: catalog/pg_publication.c:392 +#, c-format +msgid "relation \"%s\" is already member of publication \"%s\"" +msgstr "სქემრ%s პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ (%s) ნáƒáƒ¬áƒ˜áƒšáƒ¡ უკვე წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: catalog/pg_publication.c:534 +#, c-format +msgid "cannot use system column \"%s\" in publication column list" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტების სიáƒáƒ¨áƒ˜ სისტემური სვეტის (\"%s\") გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: catalog/pg_publication.c:540 +#, c-format +msgid "cannot use generated column \"%s\" in publication column list" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტების სიáƒáƒ¨áƒ˜ გენერირებული სვეტის (\"%s\") გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: catalog/pg_publication.c:546 +#, c-format +msgid "duplicate column \"%s\" in publication column list" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტების სიáƒáƒ¨áƒ˜ დუბლიკáƒáƒ¢áƒ˜áƒ: %s" + +#: catalog/pg_publication.c:636 +#, c-format +msgid "schema \"%s\" is already member of publication \"%s\"" +msgstr "სქემრ%s პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ (%s) ნáƒáƒ¬áƒ˜áƒšáƒ¡ უკვე წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: catalog/pg_shdepend.c:867 +#, c-format +msgid "" +"\n" +"and objects in %d other database (see server log for list)" +msgid_plural "" +"\n" +"and objects in %d other databases (see server log for list)" +msgstr[0] "" +"\n" +"დრáƒáƒ‘იექტები %d სხვრბáƒáƒ–áƒáƒ¨áƒ˜ (სიისთვის იხილეთ სერვერის ჟურნáƒáƒšáƒ˜)" +msgstr[1] "" +"\n" +"დრáƒáƒ‘იექტები %d სხვრბáƒáƒ–áƒáƒ¨áƒ˜ (სიისთვის იხილეთ სერვერის ჟურნáƒáƒšáƒ˜)" + +#: catalog/pg_shdepend.c:1214 +#, c-format +msgid "role %u was concurrently dropped" +msgstr "რáƒáƒšáƒ˜ %u სხვრპრáƒáƒªáƒ”სის მიერ წáƒáƒ˜áƒ¨áƒáƒšáƒ" + +#: catalog/pg_shdepend.c:1226 +#, c-format +msgid "tablespace %u was concurrently dropped" +msgstr "ცხრილების სივრცე %u სხვრპრáƒáƒªáƒ”სის მიერ წáƒáƒ˜áƒ¨áƒáƒšáƒ" + +#: catalog/pg_shdepend.c:1240 +#, c-format +msgid "database %u was concurrently dropped" +msgstr "ბáƒáƒ–რ%u სხვრპრáƒáƒªáƒ”სის მიერ წáƒáƒ˜áƒ¨áƒáƒšáƒ" + +#: catalog/pg_shdepend.c:1291 +#, c-format +msgid "owner of %s" +msgstr "%s -ის მფლáƒáƒ‘ელი" + +#: catalog/pg_shdepend.c:1293 +#, c-format +msgid "privileges for %s" +msgstr "პრივილეგიები %s-სთვის" + +#: catalog/pg_shdepend.c:1295 +#, c-format +msgid "initial privileges for %s" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ პრივილეგიები %s-სთვის" + +#: catalog/pg_shdepend.c:1297 +#, c-format +msgid "target of %s" +msgstr "%s-ის სáƒáƒ›áƒ˜áƒ–ნე" + +#: catalog/pg_shdepend.c:1299 +#, c-format +msgid "tablespace for %s" +msgstr "ცხრილების სივრცე %s-სთვის" + +#. translator: %s will always be "database %s" +#: catalog/pg_shdepend.c:1307 +#, c-format +msgid "%d object in %s" +msgid_plural "%d objects in %s" +msgstr[0] "%d áƒáƒ‘იექტი %s-ში" +msgstr[1] "%d áƒáƒ‘იექტი %s-ში" + +#: catalog/pg_shdepend.c:1371 +#, c-format +msgid "cannot drop objects owned by %s because they are required by the database system" +msgstr "%s-ის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ. სáƒáƒ­áƒ˜áƒ áƒáƒ ბáƒáƒ–ის სისტემისთვის" + +#: catalog/pg_shdepend.c:1545 +#, c-format +msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" +msgstr "%s-ის მფლáƒáƒ‘ელáƒáƒ‘áƒáƒ¨áƒ˜ მყáƒáƒ¤áƒ˜ áƒáƒ‘იექტების წვდáƒáƒ›áƒ”ბის თáƒáƒ•იდáƒáƒœ მინიჭებრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ ისინი ბáƒáƒ–ის სისტემისთვისáƒáƒ სáƒáƒ­áƒ˜áƒ áƒ" + +#: catalog/pg_subscription.c:438 +#, c-format +msgid "could not drop relation mapping for subscription \"%s\"" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რისთვის \"%s\" ურთიერთáƒáƒ‘ის მიბმის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: catalog/pg_subscription.c:440 +#, c-format +msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." +msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს ცხრილის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ურთიერთáƒáƒ‘ისთვის \"%s\" დრმისი მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒáƒ \"%c\"." + +#. translator: first %s is a SQL ALTER command and second %s is a +#. SQL DROP command +#. +#: catalog/pg_subscription.c:447 +#, c-format +msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რის ჩáƒáƒ¡áƒáƒ áƒ—áƒáƒ•áƒáƒ“, თუ ის უკვე ჩáƒáƒ áƒ—ული áƒáƒ áƒáƒ, %s გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ, áƒáƒœ, %s, გáƒáƒ›áƒáƒ¬áƒ”რის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“." + +#: catalog/pg_type.c:133 catalog/pg_type.c:474 +#, c-format +msgid "pg_type OID value not set when in binary upgrade mode" +msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის რეჟიმში pg_type-ის OID-ის მნიშვნელáƒáƒ‘რდáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: catalog/pg_type.c:253 +#, c-format +msgid "invalid type internal size %d" +msgstr "ტიპის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შიდრზáƒáƒ›áƒ: %d" + +#: catalog/pg_type.c:269 catalog/pg_type.c:277 catalog/pg_type.c:285 catalog/pg_type.c:294 +#, c-format +msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" +msgstr "სწáƒáƒ áƒ”ბრ\"%c\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ მნიშვნელáƒáƒ‘ით-გáƒáƒ“áƒáƒªáƒ”მული-ტიპისთვის ზáƒáƒ›áƒ˜áƒ— %d" + +#: catalog/pg_type.c:301 +#, c-format +msgid "internal size %d is invalid for passed-by-value type" +msgstr "შიდრზáƒáƒ›áƒ %d მნიშვნელáƒáƒ‘ით-გáƒáƒ“áƒáƒªáƒ”მული ტიპისთვის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: catalog/pg_type.c:311 catalog/pg_type.c:317 +#, c-format +msgid "alignment \"%c\" is invalid for variable-length type" +msgstr "სწáƒáƒ áƒ”ბრ\"%c\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ ცვლáƒáƒ“ი-სიგრძის ტიპისთვის" + +#: catalog/pg_type.c:325 commands/typecmds.c:4363 +#, c-format +msgid "fixed-size types must have storage PLAIN" +msgstr "ფიქსირებული ზáƒáƒ›áƒ˜áƒ¡ ტიპებს უნდრPLAIN ტიპის სáƒáƒªáƒáƒ•ი უნდრჰქáƒáƒœáƒ“ეთ" + +#: catalog/pg_type.c:978 +#, c-format +msgid "Failed while creating a multirange type for type \"%s\"." +msgstr "შეცდáƒáƒ›áƒ მრáƒáƒ•áƒáƒšáƒ“იáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒáƒœáƒ˜ ტიპის შექმნისáƒáƒ¡ ტიპისთვის \"%s\"." + +#: catalog/pg_type.c:979 +#, c-format +msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." +msgstr "მრáƒáƒ•áƒáƒšáƒ“იáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒáƒœáƒ˜ ტიპის სáƒáƒ®áƒ”ლი ხელით, \"multirange_type_name\" áƒáƒ¢áƒ áƒ˜áƒ‘უტით უნდრმიუთითáƒáƒ—." + +#: catalog/storage.c:508 storage/buffer/bufmgr.c:1540 +#, c-format +msgid "invalid page in block %u of relation %s" +msgstr "ურთიერთáƒáƒ‘ის (%2$s) ბლáƒáƒ™áƒ˜áƒ¡ (%1$u) áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  გვერდი" + +#: commands/aggregatecmds.c:167 +#, c-format +msgid "only ordered-set aggregates can be hypothetical" +msgstr "ჰიპáƒáƒ—ეზური მხáƒáƒšáƒáƒ“ დáƒáƒšáƒáƒ’ებული-სეტის áƒáƒ’რეგáƒáƒ¢áƒ”ბი შეიძლებáƒ, იყáƒáƒ¡" + +#: commands/aggregatecmds.c:192 +#, c-format +msgid "aggregate attribute \"%s\" not recognized" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ უცნáƒáƒ‘ი áƒáƒ¢áƒ áƒ˜áƒ‘უტი: %s" + +#: commands/aggregatecmds.c:202 +#, c-format +msgid "aggregate stype must be specified" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ style-ის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/aggregatecmds.c:206 +#, c-format +msgid "aggregate sfunc must be specified" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ sfunc -ის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/aggregatecmds.c:218 +#, c-format +msgid "aggregate msfunc must be specified when mstype is specified" +msgstr "რáƒáƒªáƒ mstype მითითებულიáƒ, áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ msfunc-იც áƒáƒ£áƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ უნდრიყáƒáƒ¡ მითითებული" + +#: commands/aggregatecmds.c:222 +#, c-format +msgid "aggregate minvfunc must be specified when mstype is specified" +msgstr "რáƒáƒªáƒ minvfunc მითითებულიáƒ, áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ msfunc-იც áƒáƒ£áƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ უნდრიყáƒáƒ¡ მითითებული" + +#: commands/aggregatecmds.c:229 +#, c-format +msgid "aggregate msfunc must not be specified without mstype" +msgstr "mstype-ის გáƒáƒ áƒ”შე áƒáƒ’რეგáƒáƒ¢áƒ˜ msfunc მითითებული áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/aggregatecmds.c:233 +#, c-format +msgid "aggregate minvfunc must not be specified without mstype" +msgstr "mstype-ის გáƒáƒ áƒ”შე áƒáƒ’რეგáƒáƒ¢áƒ˜ minvfunc მითითებული áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/aggregatecmds.c:237 +#, c-format +msgid "aggregate mfinalfunc must not be specified without mstype" +msgstr "mstype-ის გáƒáƒ áƒ”შე áƒáƒ’რეგáƒáƒ¢áƒ˜ mfinalfunc მითითებული áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/aggregatecmds.c:241 +#, c-format +msgid "aggregate msspace must not be specified without mstype" +msgstr "mstype-ის გáƒáƒ áƒ”შე áƒáƒ’რეგáƒáƒ¢áƒ˜ msspace მითითებული áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/aggregatecmds.c:245 +#, c-format +msgid "aggregate minitcond must not be specified without mstype" +msgstr "mstype-ის გáƒáƒ áƒ”შე áƒáƒ’რეგáƒáƒ¢áƒ˜ minitcond მითითებული áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/aggregatecmds.c:274 +#, c-format +msgid "aggregate input type must be specified" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ შეყვáƒáƒœáƒ˜áƒ¡ ტიპის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/aggregatecmds.c:304 +#, c-format +msgid "basetype is redundant with aggregate input type specification" +msgstr "" + +#: commands/aggregatecmds.c:347 commands/aggregatecmds.c:388 +#, c-format +msgid "aggregate transition data type cannot be %s" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ტიპი %s áƒáƒ  შეიძლებრიყáƒáƒ¡" + +#: commands/aggregatecmds.c:359 +#, c-format +msgid "serialization functions may be specified only when the aggregate transition data type is %s" +msgstr "სერიáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ ფუნქციების მითითებრმხáƒáƒšáƒáƒ“ მáƒáƒ¨áƒ˜áƒœ შეგიძლიáƒáƒ—, რáƒáƒªáƒ áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ გáƒáƒ“áƒáƒ¡áƒ•ლის მáƒáƒœáƒáƒªáƒ”მის ტიპი %s-ს წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: commands/aggregatecmds.c:369 +#, c-format +msgid "must specify both or neither of serialization and deserialization functions" +msgstr "áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირმიუთითáƒáƒ— áƒáƒœ áƒáƒ áƒ˜áƒ•ე, სერიáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ დრდესერიáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ ფუნქციები, áƒáƒœ áƒáƒ áƒª ერთი" + +#: commands/aggregatecmds.c:434 commands/functioncmds.c:634 +#, c-format +msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"parallel\" SAFE, RESTRICTED áƒáƒœ UNSAFE -ს შეიძლებრუდრიდეს" + +#: commands/aggregatecmds.c:490 +#, c-format +msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" READ_ONLY, SHAREABLE, áƒáƒœ READ_WRITE უნდრიყáƒáƒ¡" + +#: commands/alter.c:82 commands/event_trigger.c:191 +#, c-format +msgid "event trigger \"%s\" already exists" +msgstr "მáƒáƒ•ლენის ტრიგერი უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: commands/alter.c:85 commands/foreigncmds.c:593 +#, c-format +msgid "foreign-data wrapper \"%s\" already exists" +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜ უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: commands/alter.c:88 commands/foreigncmds.c:884 +#, c-format +msgid "server \"%s\" already exists" +msgstr "სერვერი \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/alter.c:91 commands/proclang.c:131 +#, c-format +msgid "language \"%s\" already exists" +msgstr "ენრ\"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/alter.c:94 commands/publicationcmds.c:764 +#, c-format +msgid "publication \"%s\" already exists" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/alter.c:97 commands/subscriptioncmds.c:669 +#, c-format +msgid "subscription \"%s\" already exists" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რრ\"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/alter.c:120 +#, c-format +msgid "conversion \"%s\" already exists in schema \"%s\"" +msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს სქემáƒáƒ¨áƒ˜ \"%s\"" + +#: commands/alter.c:124 +#, c-format +msgid "statistics object \"%s\" already exists in schema \"%s\"" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ‘იექტი \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს სქემáƒáƒ¨áƒ˜ \"%s\"" + +#: commands/alter.c:128 +#, c-format +msgid "text search parser \"%s\" already exists in schema \"%s\"" +msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს სქემáƒáƒ¨áƒ˜ \"%s\"" + +#: commands/alter.c:132 +#, c-format +msgid "text search dictionary \"%s\" already exists in schema \"%s\"" +msgstr "ტექსტის ძებნის ლექსიკáƒáƒœáƒ˜ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს სქემáƒáƒ¨áƒ˜ \"%s\"" + +#: commands/alter.c:136 +#, c-format +msgid "text search template \"%s\" already exists in schema \"%s\"" +msgstr "ტექსტის ძიების შáƒáƒ‘ლáƒáƒœáƒ˜ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს სქემáƒáƒ¨áƒ˜ \"%s\"" + +#: commands/alter.c:140 +#, c-format +msgid "text search configuration \"%s\" already exists in schema \"%s\"" +msgstr "ტექსტის ძიების კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს სქემáƒáƒ¨áƒ˜ \"%s\"" + +#: commands/alter.c:213 +#, c-format +msgid "must be superuser to rename %s" +msgstr "%s -ის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვისთვის სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებები" + +#: commands/alter.c:255 commands/subscriptioncmds.c:648 commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1212 commands/subscriptioncmds.c:1918 +#, c-format +msgid "password_required=false is superuser-only" +msgstr "password_required=false მხáƒáƒšáƒáƒ“ superuser-only-სთვისáƒáƒ" + +#: commands/alter.c:256 commands/subscriptioncmds.c:649 commands/subscriptioncmds.c:1130 commands/subscriptioncmds.c:1213 commands/subscriptioncmds.c:1919 +#, c-format +msgid "Subscriptions with the password_required option set to false may only be created or modified by the superuser." +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რები, რáƒáƒ›áƒšáƒ˜áƒ¡ password_required პáƒáƒ áƒáƒ›áƒ”ტრი ჭეშმáƒáƒ áƒ˜áƒ¢áƒ˜ áƒáƒ áƒáƒ, მხáƒáƒšáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ შეიძლებრშეიქმნáƒáƒ¡ დრშეიცვáƒáƒšáƒáƒ¡." + +#: commands/alter.c:734 +#, c-format +msgid "must be superuser to set schema of %s" +msgstr "%s-ის სქემის დáƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებები" + +#: commands/amcmds.c:60 +#, c-format +msgid "permission denied to create access method \"%s\"" +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ის (\"%s\") შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/amcmds.c:62 +#, c-format +msgid "Must be superuser to create an access method." +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ის შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებები." + +#: commands/amcmds.c:71 +#, c-format +msgid "access method \"%s\" already exists" +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ი \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/amcmds.c:154 commands/indexcmds.c:221 commands/indexcmds.c:841 commands/opclasscmds.c:374 commands/opclasscmds.c:832 +#, c-format +msgid "access method \"%s\" does not exist" +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/amcmds.c:243 +#, c-format +msgid "handler function is not specified" +msgstr "დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი ფუნქცირმითითებული áƒáƒ áƒáƒ" + +#: commands/amcmds.c:264 commands/event_trigger.c:200 commands/foreigncmds.c:489 commands/proclang.c:78 commands/trigger.c:702 parser/parse_clause.c:943 +#, c-format +msgid "function %s must return type %s" +msgstr "ფუნქციáƒáƒ› (%s) áƒáƒ£áƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ უნდრდáƒáƒáƒ‘რუნáƒáƒ¡ ტიპი %s" + +#: commands/analyze.c:217 +#, c-format +msgid "skipping \"%s\" --- cannot analyze this foreign table" +msgstr "%s-ის გáƒáƒ›áƒáƒ¢áƒáƒ•ებრ--- გáƒáƒ áƒ” ცხრილის áƒáƒœáƒáƒšáƒ˜áƒ–ი შეუძლებელიáƒ" + +#: commands/analyze.c:234 +#, c-format +msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" +msgstr "%s-ის გáƒáƒ›áƒáƒ¢áƒáƒ•ებრ--- áƒáƒ áƒáƒªáƒ®áƒ áƒ˜áƒšáƒ”ბის დრსპეციáƒáƒšáƒ£áƒ áƒ˜ სისტემური ცხრილების áƒáƒœáƒáƒšáƒ˜áƒ–ი შეუძლებელიáƒ" + +#: commands/analyze.c:314 +#, c-format +msgid "analyzing \"%s.%s\" inheritance tree" +msgstr "\"%s.%s\" -ის მემკვიდრეáƒáƒ‘ითი ხის áƒáƒœáƒáƒšáƒ˜áƒ–ი" + +#: commands/analyze.c:319 +#, c-format +msgid "analyzing \"%s.%s\"" +msgstr "\"%s.%s\"-ის áƒáƒœáƒáƒšáƒ˜áƒ–ი" + +#: commands/analyze.c:385 +#, c-format +msgid "column \"%s\" of relation \"%s\" appears more than once" +msgstr "ურთიერთáƒáƒ‘ის (%2$s) სვეტი (%1$s) ერთზე მეტჯერ ჩნდებáƒ" + +#: commands/analyze.c:780 +#, c-format +msgid "automatic analyze of table \"%s.%s.%s\"\n" +msgstr "ცხრილის áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ áƒáƒœáƒáƒšáƒ˜áƒ–ი \"%s.%s.%s\"\n" + +#: commands/analyze.c:1295 +#, c-format +msgid "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead rows; %d rows in sample, %.0f estimated total rows" +msgstr "\"%s\": სკáƒáƒœáƒ˜áƒ áƒ”ბული %d გვერდი %u-დáƒáƒœ, შეიცáƒáƒ•ს %.0f ცáƒáƒªáƒ®áƒáƒš მწკრივს დრ%.0f მკვდáƒáƒ  მწკრივს; %d მწკრივს სემპლში, %.0f დáƒáƒáƒ®áƒšáƒáƒ”ბით მწკრივები სულ" + +#: commands/analyze.c:1379 +#, c-format +msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" +msgstr "\"%s.%s\"-ის მემკვიდრეáƒáƒ‘ის ხის áƒáƒœáƒáƒšáƒ˜áƒ–ის გáƒáƒ›áƒáƒ¢áƒáƒ•ებრ--- მემკვიდრეáƒáƒ‘ითáƒáƒ‘ის ხე შვილ ცხრილებს áƒáƒ  შეიცáƒáƒ•ს" + +#: commands/analyze.c:1477 +#, c-format +msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no analyzable child tables" +msgstr "\"%s.%s\"-ის მემკვიდრეáƒáƒ‘ის ხის áƒáƒœáƒáƒšáƒ˜áƒ–ის გáƒáƒ›áƒáƒ¢áƒáƒ•ებრ--- მემკვიდრეáƒáƒ‘ითáƒáƒ‘ის ხე გáƒáƒáƒœáƒáƒšáƒ˜áƒ–ებáƒáƒ“ შვილ ცხრილებს áƒáƒ  შეიცáƒáƒ•ს" + +#: commands/async.c:612 +#, c-format +msgid "channel name cannot be empty" +msgstr "áƒáƒ áƒ®áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  შეიძლებრიყáƒáƒ¡" + +#: commands/async.c:618 +#, c-format +msgid "channel name too long" +msgstr "áƒáƒ áƒ®áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#: commands/async.c:623 +#, c-format +msgid "payload string too long" +msgstr "სáƒáƒ¡áƒáƒ áƒ’ებლრდáƒáƒ¢áƒ•ირთვის სტრიქáƒáƒœáƒ˜ ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#: commands/async.c:842 +#, c-format +msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" +msgstr "შეუძლებელირგáƒáƒœáƒ•áƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლრPREPARE ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ–ე, რáƒáƒ›áƒ”ლმáƒáƒª შეáƒáƒ¡áƒ áƒ£áƒšáƒ LISTEN, UNLSTEN áƒáƒœ NOTIFY" + +#: commands/async.c:946 +#, c-format +msgid "too many notifications in the NOTIFY queue" +msgstr "\"NOTIFY\" რიგში მეტისმეტáƒáƒ“ ბევრი გáƒáƒ¤áƒ áƒ—ხილებáƒáƒ" + +#: commands/async.c:1553 +#, c-format +msgid "NOTIFY queue is %.0f%% full" +msgstr "NOTIFY-ის რიგი %.0f%% -ით სáƒáƒ•სეáƒ" + +#: commands/async.c:1555 +#, c-format +msgid "The server process with PID %d is among those with the oldest transactions." +msgstr "სერვერის პრáƒáƒªáƒ”სი PID-ით %d უძველესი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის მფლáƒáƒ‘ელთრშáƒáƒ áƒ˜áƒ¡áƒáƒ." + +#: commands/async.c:1558 +#, c-format +msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." +msgstr "რიგის NOTIFY დáƒáƒªáƒáƒ áƒ˜áƒ”ლებრპრáƒáƒªáƒ”სის მიერ მიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბáƒáƒ›áƒ“ე შეუძლებელიáƒ." + +#: commands/cluster.c:128 +#, c-format +msgid "unrecognized CLUSTER option \"%s\"" +msgstr "\"CLUSTER\"-ის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\"" + +#: commands/cluster.c:159 commands/cluster.c:433 +#, c-format +msgid "cannot cluster temporary tables of other sessions" +msgstr "სხვრსესიების დრáƒáƒ”ბით ცხრილების დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებრშეუძლებელიáƒ" + +#: commands/cluster.c:177 +#, c-format +msgid "there is no previously clustered index for table \"%s\"" +msgstr "ცხრილისთვის \"%s\" წინáƒáƒ¡áƒ¬áƒáƒ  დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებული ინდექსი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/cluster.c:191 commands/tablecmds.c:14698 commands/tablecmds.c:16629 +#, c-format +msgid "index \"%s\" for table \"%s\" does not exist" +msgstr "ინდექსი %s ცხრილისთვის %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/cluster.c:422 +#, c-format +msgid "cannot cluster a shared catalog" +msgstr "გáƒáƒ–იáƒáƒ áƒ”ბული კáƒáƒ¢áƒáƒšáƒáƒ’ის დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებრშეუძლებელიáƒ" + +#: commands/cluster.c:437 +#, c-format +msgid "cannot vacuum temporary tables of other sessions" +msgstr "სხვრსესიების დრáƒáƒ”ბითი ცხრილების მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრშეუძლებელიáƒ" + +#: commands/cluster.c:513 commands/tablecmds.c:16639 +#, c-format +msgid "\"%s\" is not an index for table \"%s\"" +msgstr "\"%s\" áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს ინდექსს ცხრილისთვის \"%s\"" + +#: commands/cluster.c:521 +#, c-format +msgid "cannot cluster on index \"%s\" because access method does not support clustering" +msgstr "" + +#: commands/cluster.c:533 +#, c-format +msgid "cannot cluster on partial index \"%s\"" +msgstr "ნáƒáƒ¬áƒ˜áƒšáƒáƒ‘რივი ინდექსის (\"%s\") დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებრშეუძლებელიáƒ" + +#: commands/cluster.c:547 +#, c-format +msgid "cannot cluster on invalid index \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ინდექსის (\"%s\") დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებრშეუძლებელიáƒ" + +#: commands/cluster.c:571 +#, c-format +msgid "cannot mark index clustered in partitioned table" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილში ინდექსის დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებულáƒáƒ“ მáƒáƒœáƒ˜áƒ¨áƒ•ნრშეუძლებელიáƒ" + +#: commands/cluster.c:956 +#, c-format +msgid "clustering \"%s.%s\" using index scan on \"%s\"" +msgstr "\"%s.%s\"-ის დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებრინდექსის სკáƒáƒœáƒ˜áƒ áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებით \"%s\"" + +#: commands/cluster.c:962 +#, c-format +msgid "clustering \"%s.%s\" using sequential scan and sort" +msgstr "\"%s.%s\"-ის დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებრთáƒáƒœáƒ›áƒ˜áƒ›áƒ“ევრული სკáƒáƒœáƒ˜áƒ áƒ”ბის დრდáƒáƒ®áƒáƒ áƒ˜áƒ¡áƒ®áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებით" + +#: commands/cluster.c:967 +#, c-format +msgid "vacuuming \"%s.%s\"" +msgstr "დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრ\"%s.%s\"" + +#: commands/cluster.c:994 +#, c-format +msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" +msgstr "\"%s.%s\": áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირ%.0f წáƒáƒ¨áƒšáƒáƒ“ი დრ%.0f áƒáƒ áƒáƒ¬áƒáƒ¨áƒšáƒáƒ“ი მწკრივის ვერსირ%u გვერდში" + +#: commands/cluster.c:999 +#, c-format +msgid "" +"%.0f dead row versions cannot be removed yet.\n" +"%s." +msgstr "" +"%.0f მკვდáƒáƒ áƒ˜ მწკრივის ვერსების წáƒáƒ¨áƒšáƒ ჯერჯერáƒáƒ‘ით შეუძლებელიáƒ.\n" +"%s." + +#: commands/cluster.c:1744 +#, c-format +msgid "permission denied to cluster \"%s\", skipping it" +msgstr "კლáƒáƒ¡áƒ¢áƒ”რისთვის \"%s\" წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/collationcmds.c:110 +#, c-format +msgid "collation attribute \"%s\" not recognized" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ უცნáƒáƒ‘ი áƒáƒ¢áƒ áƒ˜áƒ‘უტი: \"%s\"" + +#: commands/collationcmds.c:123 commands/collationcmds.c:129 commands/define.c:388 commands/tablecmds.c:8137 replication/pgoutput/pgoutput.c:307 replication/pgoutput/pgoutput.c:330 replication/pgoutput/pgoutput.c:344 replication/pgoutput/pgoutput.c:354 replication/pgoutput/pgoutput.c:364 replication/pgoutput/pgoutput.c:374 replication/pgoutput/pgoutput.c:386 replication/walsender.c:1146 replication/walsender.c:1168 replication/walsender.c:1178 +#: replication/walsender.c:1187 replication/walsender.c:1426 +#, c-format +msgid "conflicting or redundant options" +msgstr "კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ£áƒ áƒ˜ áƒáƒœ ზედმეტი პáƒáƒ áƒáƒ›áƒ”ტრები" + +#: commands/collationcmds.c:124 +#, c-format +msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." +msgstr "LC_COLLATE-სთáƒáƒœ დრLC_TYPE-სთáƒáƒœ ერთáƒáƒ“ LOCALE-ს ვერ მიუთითებთ." + +#: commands/collationcmds.c:130 +#, c-format +msgid "FROM cannot be specified together with any other options." +msgstr "FROM-ის მითითებრშეუძლებელირნებისმიერ სხვრპáƒáƒ áƒáƒ›áƒ”ტრთáƒáƒœ ერთáƒáƒ“." + +#: commands/collationcmds.c:189 +#, c-format +msgid "collation \"default\" cannot be copied" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ \"ნáƒáƒ’ულისხმევი\" კáƒáƒžáƒ˜áƒ áƒ”ბრშეუძლებელიáƒ" + +#: commands/collationcmds.c:225 +#, c-format +msgid "unrecognized collation provider: %s" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ უცნáƒáƒ‘ი მáƒáƒ›áƒ¬áƒáƒ“ებელი: %s" + +#: commands/collationcmds.c:253 commands/collationcmds.c:264 commands/collationcmds.c:270 commands/collationcmds.c:278 +#, c-format +msgid "parameter \"%s\" must be specified" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის \"%s\" მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/collationcmds.c:293 commands/dbcommands.c:1134 +#, c-format +msgid "using standard form \"%s\" for ICU locale \"%s\"" +msgstr "ვიყენებ სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒš ფáƒáƒ áƒ›áƒáƒ¡ \"%s\" ICU ლáƒáƒ™áƒáƒšáƒ˜áƒ¡áƒ—ვის \"%s\"" + +#: commands/collationcmds.c:312 +#, c-format +msgid "nondeterministic collations not supported with this provider" +msgstr "áƒáƒ áƒáƒ“ემინისტური კáƒáƒšáƒáƒªáƒ˜áƒ”ბი, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ  áƒáƒ áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ› მáƒáƒ›áƒ¬áƒáƒ“ებელთáƒáƒœ" + +#: commands/collationcmds.c:317 commands/dbcommands.c:1087 +#, c-format +msgid "ICU rules cannot be specified unless locale provider is ICU" +msgstr "ICU-ის წესების მითითებრმáƒáƒœáƒáƒ›áƒ“ე, სáƒáƒœáƒáƒ› ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ მáƒáƒ›áƒ¬áƒáƒ“ებელი ICU áƒáƒ áƒáƒ, შეუძლებელიáƒ" + +#: commands/collationcmds.c:340 +#, c-format +msgid "current database's encoding is not supported with this provider" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კáƒáƒ“ირებრáƒáƒ  áƒáƒ áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ› მáƒáƒ›áƒ¬áƒáƒ“ებელთáƒáƒœ" + +#: commands/collationcmds.c:409 +#, c-format +msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ \"%s\" კáƒáƒ“ირებისთვის \"%s\" სქემáƒáƒ¨áƒ˜ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/collationcmds.c:420 +#, c-format +msgid "collation \"%s\" already exists in schema \"%s\"" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს სქემáƒáƒ¨áƒ˜ \"%s\"" + +#: commands/collationcmds.c:445 +#, c-format +msgid "cannot refresh version of default collation" +msgstr "ნáƒáƒ’ულისხმევი კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ ვერსიის გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელიáƒ" + +#. translator: %s is an SQL command +#. translator: %s is an SQL ALTER command +#: commands/collationcmds.c:447 commands/subscriptioncmds.c:1376 commands/tablecmds.c:7913 commands/tablecmds.c:7923 commands/tablecmds.c:7925 commands/tablecmds.c:14400 commands/tablecmds.c:17777 commands/tablecmds.c:17798 commands/typecmds.c:3787 commands/typecmds.c:3872 commands/typecmds.c:4226 +#, c-format +msgid "Use %s instead." +msgstr "áƒáƒ›áƒ˜áƒ¡ ნáƒáƒªáƒ•ლáƒáƒ“ %s გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: commands/collationcmds.c:480 commands/dbcommands.c:2550 +#, c-format +msgid "changing version from %s to %s" +msgstr "ვერსიის შეცვლრ%s-დáƒáƒœ %s-ზე" + +#: commands/collationcmds.c:495 commands/dbcommands.c:2563 +#, c-format +msgid "version has not changed" +msgstr "ვერსირáƒáƒ  შეცვლილáƒ" + +#: commands/collationcmds.c:528 commands/dbcommands.c:2729 +#, c-format +msgid "database with OID %u does not exist" +msgstr "ბáƒáƒ–რOID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/collationcmds.c:554 +#, c-format +msgid "collation with OID %u does not exist" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/collationcmds.c:848 +#, c-format +msgid "must be superuser to import system collations" +msgstr "სისტემური კáƒáƒšáƒáƒªáƒ˜áƒ”ბის შემáƒáƒ¡áƒáƒ¢áƒáƒœáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებები" + +#: commands/collationcmds.c:968 commands/collationcmds.c:1053 +#, c-format +msgid "no usable system locales were found" +msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒáƒ“ი სისტემური ენები ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" + +#: commands/comment.c:61 commands/dbcommands.c:1663 commands/dbcommands.c:1875 commands/dbcommands.c:1985 commands/dbcommands.c:2183 commands/dbcommands.c:2421 commands/dbcommands.c:2512 commands/dbcommands.c:2633 commands/dbcommands.c:3141 utils/init/postinit.c:1033 utils/init/postinit.c:1097 utils/init/postinit.c:1170 +#, c-format +msgid "database \"%s\" does not exist" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/comment.c:101 +#, c-format +msgid "cannot set comment on relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘áƒáƒ–ე \"%s\" კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜áƒ¡ დáƒáƒ“ებრშეუძლებელიáƒ" + +#: commands/constraint.c:61 utils/adt/ri_triggers.c:2019 +#, c-format +msgid "function \"%s\" was not called by trigger manager" +msgstr "ფუნქცირტრიგერის მმáƒáƒ áƒ—ველის მიერ áƒáƒ  გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბულáƒ: %s" + +#: commands/constraint.c:68 utils/adt/ri_triggers.c:2028 +#, c-format +msgid "function \"%s\" must be fired AFTER ROW" +msgstr "ფუნქცირ%s AFTER-ის ტრიგერით უნდრგáƒáƒ”შვáƒáƒ¡" + +#: commands/constraint.c:82 +#, c-format +msgid "function \"%s\" must be fired for INSERT or UPDATE" +msgstr "ფუნქცირ%s INSERT-ის áƒáƒœ UPDATE-ის ტრიგერით უნდრგáƒáƒ”შვáƒáƒ¡" + +#: commands/conversioncmds.c:62 +#, c-format +msgid "source encoding \"%s\" does not exist" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ კáƒáƒ“ირებრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" + +#: commands/conversioncmds.c:69 +#, c-format +msgid "destination encoding \"%s\" does not exist" +msgstr "სáƒáƒ›áƒ˜áƒ–ნე კáƒáƒ“ირებრ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/conversioncmds.c:82 +#, c-format +msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" +msgstr "\"SQL_ASCII\"-დáƒáƒœ áƒáƒœ მáƒáƒ¡áƒ¨áƒ˜ კáƒáƒ“ირების გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/conversioncmds.c:95 +#, c-format +msgid "encoding conversion function %s must return type %s" +msgstr "კáƒáƒ“ირების გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ ფუნქცირ%s-ი %s ტიპს უნდრáƒáƒ‘რუნებდეს" + +#: commands/conversioncmds.c:125 +#, c-format +msgid "encoding conversion function %s returned incorrect result for empty input" +msgstr "დáƒáƒ¨áƒ˜áƒ¤áƒ•რის ფუნქციáƒáƒ› %s ცáƒáƒ áƒ˜áƒ”ლი შეყვáƒáƒœáƒ˜áƒ¡áƒ—ვის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ¡áƒ£áƒ®áƒ˜ დáƒáƒáƒ‘რუნáƒ" + +#: commands/copy.c:84 +#, c-format +msgid "permission denied to COPY to or from an external program" +msgstr "გáƒáƒ áƒ” პრáƒáƒ’რáƒáƒ›áƒ˜áƒ“áƒáƒœ áƒáƒœ გáƒáƒ áƒ” პრáƒáƒ’რáƒáƒ›áƒáƒ¨áƒ˜ COPY-ის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/copy.c:85 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may COPY to or from an external program." +msgstr "გáƒáƒ áƒ” პრáƒáƒ’რáƒáƒ›áƒ˜áƒ“áƒáƒœ/პრáƒáƒ’რáƒáƒ›áƒáƒ¨áƒ˜ COPY-ის უფლებრმხáƒáƒšáƒáƒ“ \"%s\" პრივილეგიების მქáƒáƒœáƒ” რáƒáƒšáƒ”ბს გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—." + +#: commands/copy.c:87 commands/copy.c:98 commands/copy.c:107 +#, c-format +msgid "Anyone can COPY to stdout or from stdin. psql's \\copy command also works for anyone." +msgstr "COPY stdin-დáƒáƒœ დრstdout-ში ყველáƒáƒ¡ შეუძლიáƒ. plsql-ის ბრძáƒáƒœáƒ”ბრ\\copy-იც ყველáƒáƒ¡áƒ—ვის მუშáƒáƒáƒ‘ს." + +#: commands/copy.c:95 +#, c-format +msgid "permission denied to COPY from a file" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ COPY-ის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/copy.c:96 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may COPY from a file." +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ COPY-ის უფლებები მხáƒáƒšáƒáƒ“ '%s' რáƒáƒšáƒ¡ გáƒáƒáƒ©áƒœáƒ˜áƒ." + +#: commands/copy.c:104 +#, c-format +msgid "permission denied to COPY to a file" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ COPY-ის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/copy.c:105 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may COPY to a file." +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ COPY-ის უფლებები მხáƒáƒšáƒáƒ“ '%s' რáƒáƒšáƒ¡ გáƒáƒáƒ©áƒœáƒ˜áƒ." + +#: commands/copy.c:193 +#, c-format +msgid "COPY FROM not supported with row-level security" +msgstr "მწკრივის-დáƒáƒœáƒ˜áƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბით COPY FROM მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/copy.c:194 +#, c-format +msgid "Use INSERT statements instead." +msgstr "უკეთესირგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— INSERT áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜." + +#: commands/copy.c:375 +#, c-format +msgid "cannot use \"%s\" with HEADER in COPY TO" +msgstr "\"COPY TO\"-ში %s-ის HEADER-თáƒáƒœ ერთáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: commands/copy.c:384 +#, c-format +msgid "%s requires a Boolean value or \"match\"" +msgstr "%s -ს ლáƒáƒ’იკური მნიშვნელáƒáƒ‘რუნდრჰქáƒáƒœáƒ“ეს, áƒáƒœ \"match\"" + +#: commands/copy.c:400 +#, c-format +msgid "COPY ON_ERROR cannot be used with COPY TO" +msgstr "COPY ON_ERROR-ს COPY TO-სთáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/copy.c:413 +#, c-format +msgid "COPY ON_ERROR \"%s\" not recognized" +msgstr "COPY ON_ERROR \"%s\" უცნáƒáƒ‘იáƒ" + +#: commands/copy.c:437 +#, c-format +msgid "COPY LOG_VERBOSITY \"%s\" not recognized" +msgstr "COPY LOG_VERBOSITY \"%s\" უცნáƒáƒ‘იáƒ" + +#: commands/copy.c:498 +#, c-format +msgid "COPY format \"%s\" not recognized" +msgstr "COPY-ის უცნáƒáƒ‘ი ფáƒáƒ áƒ›áƒáƒ¢áƒ˜: \"%s\"" + +#: commands/copy.c:556 commands/copy.c:571 commands/copy.c:586 commands/copy.c:605 +#, c-format +msgid "argument to option \"%s\" must be a list of column names" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის (%s) áƒáƒ áƒ’უმენტი სვეტების სáƒáƒ®áƒ”ლების სირუნდრიყáƒáƒ¡" + +#: commands/copy.c:617 +#, c-format +msgid "argument to option \"%s\" must be a valid encoding name" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის (%s) áƒáƒ áƒ’უმენტი კáƒáƒ“ირების სწáƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი უნდრიყáƒáƒ¡" + +#: commands/copy.c:638 commands/dbcommands.c:866 commands/dbcommands.c:2369 +#, c-format +msgid "option \"%s\" not recognized" +msgstr "უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: %s" + +#: commands/copy.c:650 +#, c-format +msgid "cannot specify DELIMITER in BINARY mode" +msgstr "რეჟიმში BINARY \"DELIMITER\"-ს ვერ მიუთითებთ" + +#: commands/copy.c:655 +#, c-format +msgid "cannot specify NULL in BINARY mode" +msgstr "რეჟიმში BINARY \"NULL\"-ს ვერ მიუთითებთ" + +#: commands/copy.c:660 +#, c-format +msgid "cannot specify DEFAULT in BINARY mode" +msgstr "'BINARY' რეჟიმში DEFAULT-ს ვერ მიუთითებთ" + +#: commands/copy.c:665 +#, c-format +msgid "only ON_ERROR STOP is allowed in BINARY mode" +msgstr "" + +#: commands/copy.c:687 +#, c-format +msgid "COPY delimiter must be a single one-byte character" +msgstr "COPY-ის გáƒáƒ›áƒ§áƒáƒ¤áƒ˜ ერთბáƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ სიმბáƒáƒšáƒ უნდრიყáƒáƒ¡" + +#: commands/copy.c:694 +#, c-format +msgid "COPY delimiter cannot be newline or carriage return" +msgstr "COPY-ის გáƒáƒ›áƒ§áƒáƒ¤áƒ˜ ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებრáƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/copy.c:700 +#, c-format +msgid "COPY null representation cannot use newline or carriage return" +msgstr "COPY-ის ნულáƒáƒ•áƒáƒœ რეპრეზენტáƒáƒªáƒ˜áƒáƒ¡ áƒáƒ®áƒáƒšáƒ˜ ხáƒáƒ–ის áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებრგáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ  შეუძლიáƒ" + +#: commands/copy.c:710 +#, c-format +msgid "COPY default representation cannot use newline or carriage return" +msgstr "COPY-ის ნáƒáƒ’ულისხმევ რეპრეზენტáƒáƒªáƒ˜áƒáƒ¡ áƒáƒ®áƒáƒšáƒ˜ ხáƒáƒ–ის áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებრგáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ  შეუძლიáƒ" + +#: commands/copy.c:728 +#, c-format +msgid "COPY delimiter cannot be \"%s\"" +msgstr "COPY-ის გáƒáƒ›áƒ§áƒáƒ¤áƒ˜ \"%s\" áƒáƒ  შეიძლებრიყáƒáƒ¡" + +#: commands/copy.c:734 +#, c-format +msgid "cannot specify HEADER in BINARY mode" +msgstr "რეჟიმში BINARY \"HEADER\"-ს ვერ მიუთითებთ" + +#: commands/copy.c:740 +#, c-format +msgid "COPY QUOTE requires CSV mode" +msgstr "COPY QUOTE-ს CSV რეჟიმი სჭირდებáƒ" + +#: commands/copy.c:745 +#, c-format +msgid "COPY quote must be a single one-byte character" +msgstr "COPY-ის ბრჭყáƒáƒšáƒ˜ ერთბáƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ სიმბáƒáƒšáƒ უნდრიყáƒáƒ¡" + +#: commands/copy.c:750 +#, c-format +msgid "COPY delimiter and quote must be different" +msgstr "COPY-ის გáƒáƒ›áƒ§áƒáƒ¤áƒ˜ დრბრჭყáƒáƒšáƒ˜ სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რსიმბáƒáƒšáƒ უნდრიყáƒáƒ¡" + +#: commands/copy.c:756 +#, c-format +msgid "COPY ESCAPE requires CSV mode" +msgstr "COPY ESCAPE-ს CSV რეჟიმი სჭირდებáƒ" + +#: commands/copy.c:761 +#, c-format +msgid "COPY escape must be a single one-byte character" +msgstr "COPY-ის სპეცსიმბáƒáƒšáƒ ერთბáƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ სიმბáƒáƒšáƒ უნდრიყáƒáƒ¡" + +#: commands/copy.c:767 +#, c-format +msgid "COPY FORCE_QUOTE requires CSV mode" +msgstr "COPY FORCE_QUOTE-ს CSV რეჟიმი სჭირდებáƒ" + +#: commands/copy.c:771 +#, c-format +msgid "COPY FORCE_QUOTE cannot be used with COPY FROM" +msgstr "COPY FORCE_QUOTE-ს COPY FROM-სთáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/copy.c:777 +#, c-format +msgid "COPY FORCE_NOT_NULL requires CSV mode" +msgstr "COPY FORCE_NOT_NULL-ს CSV რეჟიმი სჭირდებáƒ" + +#: commands/copy.c:781 +#, c-format +msgid "COPY FORCE_NOT_NULL cannot be used with COPY TO" +msgstr "COPY FORCE_NOT_NULL-ს COPY TO-სთáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/copy.c:787 +#, c-format +msgid "COPY FORCE_NULL requires CSV mode" +msgstr "COPY FORCE_NULL-ს CSV რეჟიმი სჭირდებáƒ" + +#: commands/copy.c:792 +#, c-format +msgid "COPY FORCE_NULL cannot be used with COPY TO" +msgstr "COPY FORCE_NULL-ს COPY TO-სთáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/copy.c:798 +#, c-format +msgid "COPY delimiter character must not appear in the NULL specification" +msgstr "COPY-ის გáƒáƒ›áƒ§áƒáƒ¤áƒ˜ სიმბáƒáƒšáƒ NULL-ის სპეციფიკáƒáƒªáƒ˜áƒáƒ¨áƒ˜ áƒáƒ  ჩáƒáƒœáƒ“ეს" + +#: commands/copy.c:805 +#, c-format +msgid "CSV quote character must not appear in the NULL specification" +msgstr "CSV-ის ბრჭყáƒáƒšáƒ˜áƒ¡ სიმბáƒáƒšáƒ NULL-ის სპეციფიკáƒáƒªáƒ˜áƒáƒ¨áƒ˜ áƒáƒ  უნდრგáƒáƒ›áƒáƒ©áƒœáƒ“ეს" + +#: commands/copy.c:811 +#, c-format +msgid "COPY FREEZE cannot be used with COPY TO" +msgstr "COPY FREEZE-ს COPY TO-სთáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/copy.c:818 +#, c-format +msgid "COPY DEFAULT only available using COPY FROM" +msgstr "COPY DEFAULT მხáƒáƒšáƒáƒ“ COPY FROM-ის გáƒáƒ›áƒáƒ§áƒ”ნების დრáƒáƒ¡áƒáƒ ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜" + +#: commands/copy.c:824 +#, c-format +msgid "COPY delimiter must not appear in the DEFAULT specification" +msgstr "COPY-ის გáƒáƒ›áƒ§áƒáƒ¤áƒ˜ DEFAULT-ის სპეციფიკáƒáƒªáƒ˜áƒáƒ¨áƒ˜ áƒáƒ  უნდრგáƒáƒ›áƒáƒ©áƒœáƒ“ეს" + +#: commands/copy.c:831 +#, c-format +msgid "CSV quote character must not appear in the DEFAULT specification" +msgstr "CSV-ის ბრჭყáƒáƒšáƒ˜áƒ¡ სიმბáƒáƒšáƒ DEFAULT-ის სპეციფიკáƒáƒªáƒ˜áƒáƒ¨áƒ˜ áƒáƒ  უნდრგáƒáƒ›áƒáƒ©áƒœáƒ“ეს" + +#: commands/copy.c:839 +#, c-format +msgid "NULL specification and DEFAULT specification cannot be the same" +msgstr "NULL-ის სპეციფიკáƒáƒªáƒ˜áƒ დრDEFAULT-ის სპეციფიკáƒáƒªáƒ˜áƒ ერთი დრიგივე ვერ იქნებáƒ" + +#: commands/copy.c:901 +#, c-format +msgid "column \"%s\" is a generated column" +msgstr "სვეტი \"%s\" გენერირებული სვეტიáƒ" + +#: commands/copy.c:903 +#, c-format +msgid "Generated columns cannot be used in COPY." +msgstr "გენერირებული სვეტები COPY-ში áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ." + +#: commands/copy.c:918 commands/indexcmds.c:1915 commands/statscmds.c:239 commands/tablecmds.c:2514 commands/tablecmds.c:2985 commands/tablecmds.c:3781 parser/parse_relation.c:3692 parser/parse_relation.c:3702 parser/parse_relation.c:3720 parser/parse_relation.c:3727 parser/parse_relation.c:3741 utils/adt/tsvector_op.c:2853 +#, c-format +msgid "column \"%s\" does not exist" +msgstr "სვეტი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" + +#: commands/copy.c:925 commands/tablecmds.c:2540 commands/trigger.c:951 parser/parse_target.c:1083 parser/parse_target.c:1094 +#, c-format +msgid "column \"%s\" specified more than once" +msgstr "სვეტი ერთზე მეტჯერáƒáƒ მითითებული: \"%s\"" + +#: commands/copyfrom.c:118 +#, c-format +msgid "COPY %s" +msgstr "COPY %s" + +#: commands/copyfrom.c:126 +#, c-format +msgid "COPY %s, line %llu, column %s" +msgstr "COPY %s, ხáƒáƒ–ი %llu, სვეტი %s" + +#: commands/copyfrom.c:131 commands/copyfrom.c:177 +#, c-format +msgid "COPY %s, line %llu" +msgstr "COPY %s, ხáƒáƒ–ი %llu" + +#: commands/copyfrom.c:143 +#, c-format +msgid "COPY %s, line %llu, column %s: \"%s\"" +msgstr "COPY %s, ხáƒáƒ–ი %llu, სვეტი %s: \"%s\"" + +#: commands/copyfrom.c:153 +#, c-format +msgid "COPY %s, line %llu, column %s: null input" +msgstr "COPY %s, ხáƒáƒ–ი %llu, სვეტი %s: ნულáƒáƒ•áƒáƒœáƒ˜ შეყვáƒáƒœáƒ" + +#: commands/copyfrom.c:170 +#, c-format +msgid "COPY %s, line %llu: \"%s\"" +msgstr "COPY %s, ხáƒáƒ–ი %llu: \"%s\"" + +#: commands/copyfrom.c:673 +#, c-format +msgid "cannot copy to view \"%s\"" +msgstr "ხედზე კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ: \"%s\"" + +#: commands/copyfrom.c:675 +#, c-format +msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." +msgstr "ხედში კáƒáƒžáƒ˜áƒ áƒ”ბისთვის INSTEAD OF INSERT ტრიგერი წáƒáƒ áƒ›áƒáƒáƒ“გინეთ." + +#: commands/copyfrom.c:679 +#, c-format +msgid "cannot copy to materialized view \"%s\"" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებულ ხედში კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: commands/copyfrom.c:684 +#, c-format +msgid "cannot copy to sequence \"%s\"" +msgstr "მიმდევრáƒáƒ‘áƒáƒ¨áƒ˜ (%s) კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ" + +#: commands/copyfrom.c:689 +#, c-format +msgid "cannot copy to non-table relation \"%s\"" +msgstr "áƒáƒ áƒ-ცხრილáƒáƒ•áƒáƒœ ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: commands/copyfrom.c:729 +#, c-format +msgid "cannot perform COPY FREEZE on a partitioned table" +msgstr "\"COPY FREEZE\"-ის გáƒáƒ›áƒáƒ§áƒ”ნებრდáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილზე შეუძლებელიáƒ" + +#: commands/copyfrom.c:744 +#, c-format +msgid "cannot perform COPY FREEZE because of prior transaction activity" +msgstr "\"COPY FREEZE\"-ის გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელირწინრტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ის გáƒáƒ›áƒ" + +#: commands/copyfrom.c:750 +#, c-format +msgid "cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction" +msgstr "'COPY FREEZE'-ის გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ ცხრილი მიმდინáƒáƒ áƒ” ქვეტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜ áƒáƒ áƒª შექმნილრდრáƒáƒ áƒª მáƒáƒ™áƒ•ეთილáƒ" + +#: commands/copyfrom.c:1313 +#, c-format +msgid "%llu row was skipped due to data type incompatibility" +msgid_plural "%llu rows were skipped due to data type incompatibility" +msgstr[0] "გáƒáƒ›áƒáƒ¢áƒáƒ•ებულირ%llu მწკრივი მáƒáƒœáƒáƒªáƒ”მების ტიპის შეუთáƒáƒ•სებლáƒáƒ‘ის გáƒáƒ›áƒ" +msgstr[1] "გáƒáƒ›áƒáƒ¢áƒáƒ•ებულირ%llu მწკრივი მáƒáƒœáƒáƒªáƒ”მების ტიპის შეუთáƒáƒ•სებლáƒáƒ‘ის გáƒáƒ›áƒ" + +#: commands/copyfrom.c:1447 +#, c-format +msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" +msgstr "FORCE_NOT_NULL სვეტი \"%s\" COPY-ის მიერ მითითებული áƒáƒ áƒáƒ" + +#: commands/copyfrom.c:1489 +#, c-format +msgid "FORCE_NULL column \"%s\" not referenced by COPY" +msgstr "FORCE_NULL სვეტი \"%s\" COPY-ის მიერ მითითებული áƒáƒ áƒáƒ" + +#: commands/copyfrom.c:1542 utils/mb/mbutils.c:385 +#, c-format +msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" +msgstr "ნáƒáƒ’ულისხმევი გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ ფუნქცირკáƒáƒ“ირებისთვის \"%s\"-დáƒáƒœ %s-ზე áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/copyfrom.c:1740 +#, c-format +msgid "COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \\copy." +msgstr "ინსტრუქცირ'COPY TO' PostgreSQL-ის სერვერის პრáƒáƒªáƒ”სს ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვáƒáƒ¡ უბრძáƒáƒœáƒ”ბს. შეიძლებრგნებáƒáƒ•თ კლიენტის მხáƒáƒ áƒ”, რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ psql-ის \\copy." + +#: commands/copyfrom.c:1753 commands/copyto.c:701 +#, c-format +msgid "\"%s\" is a directory" +msgstr "\"%s\" სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეáƒ" + +#: commands/copyfrom.c:1821 commands/copyto.c:299 libpq/be-secure-common.c:83 +#, c-format +msgid "could not close pipe to external command: %m" +msgstr "გáƒáƒ áƒ” ბრძáƒáƒœáƒ”ბáƒáƒ›áƒ“ე ფáƒáƒ˜áƒ¤áƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: commands/copyfrom.c:1836 commands/copyto.c:304 +#, c-format +msgid "program \"%s\" failed" +msgstr "პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ (\"%s\") შეცდáƒáƒ›áƒ" + +#: commands/copyfromparse.c:200 +#, c-format +msgid "COPY file signature not recognized" +msgstr "COPY-ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ უცნáƒáƒ‘ი სიგნáƒáƒ¢áƒ£áƒ áƒ" + +#: commands/copyfromparse.c:205 +#, c-format +msgid "invalid COPY file header (missing flags)" +msgstr "\"COPY\"-ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ თáƒáƒ•სáƒáƒ áƒ—ი (áƒáƒ™áƒšáƒ˜áƒ áƒáƒšáƒ›áƒ”ბი)" + +#: commands/copyfromparse.c:209 +#, c-format +msgid "invalid COPY file header (WITH OIDS)" +msgstr "\"COPY\"-ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ თáƒáƒ•სáƒáƒ áƒ—ი (WITH OIDS)" + +#: commands/copyfromparse.c:214 +#, c-format +msgid "unrecognized critical flags in COPY file header" +msgstr "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირუცნáƒáƒ‘ი კრიტიკული áƒáƒšáƒ›áƒ”ბი COPY ფáƒáƒ˜áƒšáƒ˜áƒ¡ თáƒáƒ•სáƒáƒ áƒ—ში" + +#: commands/copyfromparse.c:220 +#, c-format +msgid "invalid COPY file header (missing length)" +msgstr "\"COPY\"-ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ თáƒáƒ•სáƒáƒ áƒ—ი (áƒáƒ™áƒšáƒ˜áƒ სიგრძე)" + +#: commands/copyfromparse.c:227 +#, c-format +msgid "invalid COPY file header (wrong length)" +msgstr "\"COPY\"-ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ თáƒáƒ•სáƒáƒ áƒ—ი (áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე)" + +#: commands/copyfromparse.c:256 +#, c-format +msgid "could not read from COPY file: %m" +msgstr "\"COPY\" ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: commands/copyfromparse.c:278 commands/copyfromparse.c:303 replication/walsender.c:756 replication/walsender.c:782 tcop/postgres.c:377 +#, c-format +msgid "unexpected EOF on client connection with an open transaction" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი EOF ღირტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ მქáƒáƒœáƒ” კლიენტის შეერთებáƒáƒ–ე" + +#: commands/copyfromparse.c:294 replication/walsender.c:772 +#, c-format +msgid "unexpected message type 0x%02X during COPY from stdin" +msgstr "stdin-დáƒáƒœ COPY áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡ მიღებულირმáƒáƒ£áƒšáƒáƒ“ნელი შეტყáƒáƒ‘ინების ტიპი 0x%02X" + +#: commands/copyfromparse.c:317 replication/walsender.c:803 +#, c-format +msgid "COPY from stdin failed: %s" +msgstr "COPY-ი stdin-დáƒáƒœ წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელიáƒ: %s" + +#: commands/copyfromparse.c:785 +#, c-format +msgid "wrong number of fields in header line: got %d, expected %d" +msgstr "ველების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘რთáƒáƒ•სáƒáƒ áƒ—ის ხáƒáƒ–ში: მივიღე %d, მáƒáƒ•ელáƒáƒ“ი %d" + +#: commands/copyfromparse.c:801 +#, c-format +msgid "column name mismatch in header line field %d: got null value (\"%s\"), expected \"%s\"" +msgstr "სვეტი სáƒáƒ®áƒ”ლი áƒáƒ  ემთხვევრთáƒáƒ•სáƒáƒ áƒ—ის %d ხáƒáƒ–ის ველზე: მიღებულირნულáƒáƒ•áƒáƒœáƒ˜ მნიშვნელáƒáƒ‘რ(\"%s\"). მáƒáƒ•ელáƒáƒ“ი: \"%s\"" + +#: commands/copyfromparse.c:808 +#, c-format +msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "სვეტი სáƒáƒ®áƒ”ლი áƒáƒ  ემთხვევრთáƒáƒ•სáƒáƒ áƒ—ის %d ხáƒáƒ–ის ველზე: მიღებულირმნიშვნელáƒáƒ‘áƒ: \"%s\". მáƒáƒ•ელáƒáƒ“ი: \"%s\"" + +#: commands/copyfromparse.c:892 commands/copyfromparse.c:1554 commands/copyfromparse.c:1810 +#, c-format +msgid "extra data after last expected column" +msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბითი მáƒáƒœáƒáƒªáƒ”მები ბáƒáƒšáƒ მáƒáƒ¡áƒáƒšáƒáƒ“ნელი სვეტის შემდეგ" + +#: commands/copyfromparse.c:906 +#, c-format +msgid "missing data for column \"%s\"" +msgstr "áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს მáƒáƒœáƒáƒªáƒ”მები სვეტისთვის \"%s\"" + +#: commands/copyfromparse.c:990 +#, c-format +msgid "skipping row due to data type incompatibility at line %llu for column %s: \"%s\"" +msgstr "" + +#: commands/copyfromparse.c:998 +#, c-format +msgid "skipping row due to data type incompatibility at line %llu for column %s: null input" +msgstr "" + +#: commands/copyfromparse.c:1044 +#, c-format +msgid "received copy data after EOF marker" +msgstr "მიღებულირკáƒáƒžáƒ˜áƒ áƒ”ბის მáƒáƒœáƒáƒªáƒ”მები EOF ნიშნის შემდეგ" + +#: commands/copyfromparse.c:1051 +#, c-format +msgid "row field count is %d, expected %d" +msgstr "მწკრივების ველის რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ %d. ველáƒáƒ“ებáƒáƒ“ი %d" + +#: commands/copyfromparse.c:1336 commands/copyfromparse.c:1353 +#, c-format +msgid "literal carriage return found in data" +msgstr "მáƒáƒœáƒáƒªáƒ”მებში áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირáƒáƒ¨áƒ™áƒáƒ áƒ ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სიმბáƒáƒšáƒ" + +#: commands/copyfromparse.c:1337 commands/copyfromparse.c:1354 +#, c-format +msgid "unquoted carriage return found in data" +msgstr "მáƒáƒœáƒáƒªáƒ”მებში áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სიმბáƒáƒšáƒ ბრჭყáƒáƒšáƒ”ბის გáƒáƒ áƒ”შე" + +#: commands/copyfromparse.c:1339 commands/copyfromparse.c:1356 +#, c-format +msgid "Use \"\\r\" to represent carriage return." +msgstr "კáƒáƒ áƒ”ტის დáƒáƒ‘რუნების სიმბáƒáƒšáƒáƒ¡áƒ—ვის გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \"\\r\"." + +#: commands/copyfromparse.c:1340 commands/copyfromparse.c:1357 +#, c-format +msgid "Use quoted CSV field to represent carriage return." +msgstr "CSV-ის ველში კáƒáƒ áƒ”ტის დáƒáƒ‘რუნების სიმბáƒáƒšáƒáƒ¡ ბრჭყáƒáƒšáƒ”ბში ჩáƒáƒ¡áƒ›áƒ." + +#: commands/copyfromparse.c:1369 +#, c-format +msgid "literal newline found in data" +msgstr "მáƒáƒœáƒáƒªáƒ”მებში áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სიმბáƒáƒšáƒ" + +#: commands/copyfromparse.c:1370 +#, c-format +msgid "unquoted newline found in data" +msgstr "მáƒáƒœáƒáƒªáƒ”მებში áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სიმბáƒáƒšáƒ ბრჭყáƒáƒšáƒ”ბის გáƒáƒ áƒ”შე" + +#: commands/copyfromparse.c:1372 +#, c-format +msgid "Use \"\\n\" to represent newline." +msgstr "áƒáƒ®áƒáƒšáƒ˜ ხáƒáƒ–ს წáƒáƒ áƒ›áƒáƒ¡áƒáƒ“გენáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \"\\n\"." + +#: commands/copyfromparse.c:1373 +#, c-format +msgid "Use quoted CSV field to represent newline." +msgstr "CSV-ის ველში áƒáƒ®áƒáƒšáƒ˜ ხáƒáƒ–ის სიმბáƒáƒšáƒáƒ¡ ბრჭყáƒáƒšáƒ”ბში ჩáƒáƒ¡áƒ›áƒ." + +#: commands/copyfromparse.c:1419 commands/copyfromparse.c:1455 +#, c-format +msgid "end-of-copy marker does not match previous newline style" +msgstr "კáƒáƒžáƒ˜áƒ áƒ”ბის-დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ¡ მáƒáƒ áƒ™áƒ”რი წინრáƒáƒ®áƒáƒšáƒ˜ ხáƒáƒ–ის სტილს áƒáƒ  ემთხვევáƒ" + +#: commands/copyfromparse.c:1428 commands/copyfromparse.c:1444 +#, c-format +msgid "end-of-copy marker corrupt" +msgstr "კáƒáƒžáƒ˜áƒ áƒ”ბის-დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ¡ სáƒáƒœáƒ˜áƒ¨áƒœáƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ" + +#: commands/copyfromparse.c:1746 commands/copyfromparse.c:1961 +#, c-format +msgid "unexpected default marker in COPY data" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი ნáƒáƒ’ულისხმევი მáƒáƒ áƒ™áƒ”რი COPY-ის მáƒáƒœáƒáƒªáƒ”მებში" + +#: commands/copyfromparse.c:1747 commands/copyfromparse.c:1962 +#, c-format +msgid "Column \"%s\" has no default value." +msgstr "სვეტს \"%s\" DEFAULT მნიშვნელáƒáƒ‘რáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." + +#: commands/copyfromparse.c:1894 +#, c-format +msgid "unterminated CSV quoted field" +msgstr "\"CSV\"-ის ველის დáƒáƒ›áƒ®áƒ£áƒ áƒáƒ•ი ბრჭყáƒáƒšáƒ˜ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/copyfromparse.c:1996 commands/copyfromparse.c:2015 +#, c-format +msgid "unexpected EOF in COPY data" +msgstr "\"COPY\"-ის მáƒáƒœáƒáƒªáƒ”მებში ნáƒáƒžáƒáƒ•ნირმáƒáƒ£áƒšáƒáƒ“ნელი EOF" + +#: commands/copyfromparse.c:2005 +#, c-format +msgid "invalid field size" +msgstr "ველის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ" + +#: commands/copyfromparse.c:2028 +#, c-format +msgid "incorrect binary data format" +msgstr "ბინáƒáƒ áƒ£áƒš მáƒáƒœáƒáƒªáƒ”მების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜" + +#: commands/copyto.c:229 +#, c-format +msgid "could not write to COPY program: %m" +msgstr "\"COPY\"-ის პრáƒáƒ’რáƒáƒ›áƒáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: commands/copyto.c:234 +#, c-format +msgid "could not write to COPY file: %m" +msgstr "\"COPY\"-ის ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: commands/copyto.c:379 +#, c-format +msgid "cannot copy from view \"%s\"" +msgstr "ხედიდáƒáƒœ კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ: \"%s\"" + +#: commands/copyto.c:381 commands/copyto.c:387 commands/copyto.c:393 commands/copyto.c:404 +#, c-format +msgid "Try the COPY (SELECT ...) TO variant." +msgstr "სცáƒáƒ“ეთ COPY (SELECT ...) TO ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ˜." + +#: commands/copyto.c:385 +#, c-format +msgid "cannot copy from materialized view \"%s\"" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედიდáƒáƒœ კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: commands/copyto.c:391 +#, c-format +msgid "cannot copy from foreign table \"%s\"" +msgstr "გáƒáƒ áƒ” ცხრილიდáƒáƒœ კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: commands/copyto.c:397 +#, c-format +msgid "cannot copy from sequence \"%s\"" +msgstr "მიმდევრáƒáƒ‘იდáƒáƒœ კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: commands/copyto.c:402 +#, c-format +msgid "cannot copy from partitioned table \"%s\"" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილიდáƒáƒœ კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: commands/copyto.c:408 +#, c-format +msgid "cannot copy from non-table relation \"%s\"" +msgstr "áƒáƒ áƒ-ცხრილáƒáƒ•áƒáƒœáƒ˜ ურთიერთáƒáƒ‘იდáƒáƒœ კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: commands/copyto.c:460 +#, c-format +msgid "DO INSTEAD NOTHING rules are not supported for COPY" +msgstr "DO INSTEAD NOTHING -ის წესები COPY-სთვის მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: commands/copyto.c:474 +#, c-format +msgid "conditional DO INSTEAD rules are not supported for COPY" +msgstr "\"DO INSTEAD\" -ის პირáƒáƒ‘ითი წესები COPY-სთვის მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: commands/copyto.c:478 +#, c-format +msgid "DO ALSO rules are not supported for the COPY" +msgstr "DO ALSO -ის წესები COPY-სთვის მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: commands/copyto.c:483 +#, c-format +msgid "multi-statement DO INSTEAD rules are not supported for COPY" +msgstr "ერთზე მეტი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის მქáƒáƒœáƒ” DO INSTEAD-ის წესები COPY-ისთვის მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: commands/copyto.c:493 +#, c-format +msgid "COPY (SELECT INTO) is not supported" +msgstr "COPY (SELECT INTO) მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: commands/copyto.c:511 +#, c-format +msgid "COPY query must have a RETURNING clause" +msgstr "COPY მáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ RETURNING პირáƒáƒ‘რáƒáƒ£áƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ უნდრგáƒáƒáƒ©áƒœáƒ“ეს" + +#: commands/copyto.c:540 +#, c-format +msgid "relation referenced by COPY statement has changed" +msgstr "" + +#: commands/copyto.c:596 +#, c-format +msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" +msgstr "FORCE_QUOTE სვეტი \"%s\" COPY-ის მიერ მითითებული áƒáƒ áƒáƒ" + +#: commands/copyto.c:666 +#, c-format +msgid "relative path not allowed for COPY to file" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ COPY-სთვის შედáƒáƒ áƒ”ბითი ბილიკის მითითებრდáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: commands/copyto.c:685 +#, c-format +msgid "could not open file \"%s\" for writing: %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") ჩáƒáƒ¡áƒáƒ¬áƒ”რáƒáƒ“ გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %m" + +#: commands/copyto.c:688 +#, c-format +msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." +msgstr "ინსტრუქცირ'COPY TO' PostgreSQL-ის სერვერის პრáƒáƒªáƒ”სს ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒáƒ¡ უბრძáƒáƒœáƒ”ბს. შეიძლებრგნებáƒáƒ•თ კლიენტის მხáƒáƒ áƒ”, რáƒáƒ’áƒáƒ áƒ˜áƒªáƒáƒ psql-ის \\copy." + +#: commands/createas.c:210 commands/createas.c:518 +#, c-format +msgid "too many column names were specified" +msgstr "მითითებულირმეტისმეტáƒáƒ“ ბევრი სვეტის სáƒáƒ®áƒ”ლი" + +#: commands/createas.c:541 +#, c-format +msgid "policies not yet implemented for this command" +msgstr "áƒáƒ› ბრძáƒáƒœáƒ”ბისთვის წესები ჯერ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/dbcommands.c:829 +#, c-format +msgid "LOCATION is not supported anymore" +msgstr "LOCATION მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ¦áƒáƒ áƒáƒ" + +#: commands/dbcommands.c:830 +#, c-format +msgid "Consider using tablespaces instead." +msgstr "მის მáƒáƒ’იერ სჯáƒáƒ‘ს ცხრილის სივრცეები გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—." + +#: commands/dbcommands.c:855 +#, c-format +msgid "OIDs less than %u are reserved for system objects" +msgstr "%u-ზე მცირე OID-ები დáƒáƒªáƒ£áƒšáƒ˜áƒ სისტემური áƒáƒ‘იექტებისთვის" + +#: commands/dbcommands.c:886 utils/adt/ascii.c:146 +#, c-format +msgid "%d is not a valid encoding code" +msgstr "\"%d\" კáƒáƒ“ირების სწáƒáƒ  კáƒáƒ“ს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: commands/dbcommands.c:897 utils/adt/ascii.c:128 +#, c-format +msgid "%s is not a valid encoding name" +msgstr "\"%s\" კáƒáƒ“ირების სწáƒáƒ  სáƒáƒ®áƒ”ლს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: commands/dbcommands.c:931 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "ენის უცნáƒáƒ‘ი მáƒáƒ›áƒ¬áƒáƒ“ებელი: %s" + +#: commands/dbcommands.c:944 commands/dbcommands.c:2402 commands/user.c:299 commands/user.c:739 +#, c-format +msgid "invalid connection limit: %d" +msgstr "კáƒáƒ•შირის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ლიმიტი: %d" + +#: commands/dbcommands.c:965 +#, c-format +msgid "permission denied to create database" +msgstr "ბáƒáƒ–ის შექმნის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/dbcommands.c:989 +#, c-format +msgid "template database \"%s\" does not exist" +msgstr "შáƒáƒ‘ლáƒáƒœáƒ£áƒ áƒ˜ ბáƒáƒ–რ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/dbcommands.c:999 +#, c-format +msgid "cannot use invalid database \"%s\" as template" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის \"%s\" შáƒáƒ‘ლáƒáƒœáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: commands/dbcommands.c:1000 commands/dbcommands.c:2431 utils/init/postinit.c:1112 +#, c-format +msgid "Use DROP DATABASE to drop invalid databases." +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ების წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ბრძáƒáƒœáƒ”ბრDROP DATABASE." + +#: commands/dbcommands.c:1011 +#, c-format +msgid "permission denied to copy database \"%s\"" +msgstr "ბáƒáƒ–ის (\"%s\") კáƒáƒžáƒ˜áƒ áƒ”ბის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/dbcommands.c:1028 +#, c-format +msgid "invalid create database strategy \"%s\"" +msgstr "ბáƒáƒ–ის შექმნის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სტრáƒáƒ¢áƒ”გირ\"%s\"" + +#: commands/dbcommands.c:1029 +#, c-format +msgid "Valid strategies are \"wal_log\" and \"file_copy\"." +msgstr "სწáƒáƒ áƒ˜ სტრáƒáƒ¢áƒ”გიებირ\"wal_log\" დრ\"file_copy\"." + +#: commands/dbcommands.c:1050 +#, c-format +msgid "invalid server encoding %d" +msgstr "სერვერის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒ“ირებრ%d" + +#: commands/dbcommands.c:1056 +#, c-format +msgid "invalid LC_COLLATE locale name: \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ LC_COLLATE ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი: \"%s\"" + +#: commands/dbcommands.c:1057 commands/dbcommands.c:1063 +#, c-format +msgid "If the locale name is specific to ICU, use ICU_LOCALE." +msgstr "თუ ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი მხáƒáƒšáƒáƒ“ ICU-სთვისრდáƒáƒ›áƒáƒ®áƒáƒ¡áƒ˜áƒáƒ—ებელი, ICU_LOCALE გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: commands/dbcommands.c:1062 +#, c-format +msgid "invalid LC_CTYPE locale name: \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ LC_TYPE ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი: \"%s\"" + +#: commands/dbcommands.c:1074 +#, c-format +msgid "BUILTIN_LOCALE cannot be specified unless locale provider is builtin" +msgstr "BUILTIN_LOCALE-ის მითითებრშეუძლებელიáƒ, სáƒáƒœáƒáƒ› ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ მáƒáƒ›áƒ¬áƒáƒ“ებელი builtin áƒáƒ áƒáƒ" + +#: commands/dbcommands.c:1082 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "ICU-ის ენის მითითებრმáƒáƒœáƒáƒ›áƒ“ე, სáƒáƒœáƒáƒ› ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ მáƒáƒ›áƒ¬áƒáƒ“ებელი ICU áƒáƒ áƒáƒ, შეუძლებელიáƒ" + +#: commands/dbcommands.c:1100 +#, c-format +msgid "LOCALE or BUILTIN_LOCALE must be specified" +msgstr "LOCALE-ის áƒáƒœ BUILTIN_LOCALE-ის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/dbcommands.c:1109 +#, c-format +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კáƒáƒ“ირებრ\"%s\" ICU მáƒáƒ›áƒ¬áƒáƒ“ებელთáƒáƒœ ერთáƒáƒ“ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/dbcommands.c:1119 +#, c-format +msgid "LOCALE or ICU_LOCALE must be specified" +msgstr "LOCALE-ის áƒáƒœ ICU_LOCALE-ის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/dbcommands.c:1163 +#, c-format +msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" +msgstr "áƒáƒ®áƒáƒšáƒ˜ კáƒáƒ“ირებრ(%s) შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ ბáƒáƒ–ის (%s) კáƒáƒ“ირებáƒáƒ¡áƒ—áƒáƒœ თáƒáƒ•სებáƒáƒ“ი áƒáƒ áƒáƒ" + +#: commands/dbcommands.c:1166 +#, c-format +msgid "Use the same encoding as in the template database, or use template0 as template." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ იგივე კáƒáƒ“ირებáƒ, რáƒáƒª შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ ბáƒáƒ–áƒáƒ¡ გáƒáƒáƒ©áƒœáƒ˜áƒ, áƒáƒœ შáƒáƒ‘ლáƒáƒœáƒáƒ“ template0 გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: commands/dbcommands.c:1171 +#, c-format +msgid "new collation (%s) is incompatible with the collation of the template database (%s)" +msgstr "áƒáƒ®áƒáƒšáƒ˜ კáƒáƒšáƒáƒªáƒ˜áƒ (%s) შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ ბáƒáƒ–ის (%s) კáƒáƒšáƒáƒªáƒ˜áƒáƒ¡áƒ—áƒáƒœ თáƒáƒ•სებáƒáƒ“ი áƒáƒ áƒáƒ" + +#: commands/dbcommands.c:1173 +#, c-format +msgid "Use the same collation as in the template database, or use template0 as template." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ იგივე კáƒáƒšáƒáƒªáƒ˜áƒ, რáƒáƒª შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ ბáƒáƒ–áƒáƒ¡ გáƒáƒáƒ©áƒœáƒ˜áƒ, áƒáƒœ შáƒáƒ‘ლáƒáƒœáƒáƒ“ template0 გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: commands/dbcommands.c:1178 +#, c-format +msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" +msgstr "áƒáƒ®áƒáƒšáƒ˜ LC_TYPE (%s) შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ ბáƒáƒ–ის (%s) LC_TYPE-სთáƒáƒœ თáƒáƒ•სებáƒáƒ“ი áƒáƒ áƒáƒ" + +#: commands/dbcommands.c:1180 +#, c-format +msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ იგივე LC_CTYPE, რáƒáƒª შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ ბáƒáƒ–áƒáƒ¡ გáƒáƒáƒ©áƒœáƒ˜áƒ, áƒáƒœ შáƒáƒ‘ლáƒáƒœáƒáƒ“ template0 გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: commands/dbcommands.c:1185 +#, c-format +msgid "new locale provider (%s) does not match locale provider of the template database (%s)" +msgstr "áƒáƒ®áƒáƒšáƒ˜ ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ მáƒáƒ›áƒ¬áƒáƒ“ებელი (%s) შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ ბáƒáƒ–ის (%s) ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ მáƒáƒ›áƒ¬áƒáƒ“ებელს áƒáƒ  ემთხვევáƒ" + +#: commands/dbcommands.c:1187 +#, c-format +msgid "Use the same locale provider as in the template database, or use template0 as template." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ იგივე ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ მáƒáƒ›áƒ¬áƒáƒ“ებელი, რáƒáƒª შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ ბáƒáƒ–áƒáƒ¡ გáƒáƒáƒ©áƒœáƒ˜áƒ, áƒáƒœ შáƒáƒ‘ლáƒáƒœáƒáƒ“ template0 გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: commands/dbcommands.c:1199 +#, c-format +msgid "new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)" +msgstr "áƒáƒ®áƒáƒšáƒ˜ ICU ლáƒáƒ™áƒáƒšáƒ˜ (%s) შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ ბáƒáƒ–ის (%s) ICU ლáƒáƒ™áƒáƒšáƒ—áƒáƒœ თáƒáƒ•სებáƒáƒ“ი áƒáƒ áƒáƒ" + +#: commands/dbcommands.c:1201 +#, c-format +msgid "Use the same ICU locale as in the template database, or use template0 as template." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ იგივე ICU ლáƒáƒ™áƒáƒšáƒ˜, რáƒáƒª შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ ბáƒáƒ–áƒáƒ¡ გáƒáƒáƒ©áƒœáƒ˜áƒ, áƒáƒœ შáƒáƒ‘ლáƒáƒœáƒáƒ“ template0 გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: commands/dbcommands.c:1212 +#, c-format +msgid "new ICU collation rules (%s) are incompatible with the ICU collation rules of the template database (%s)" +msgstr "áƒáƒ®áƒáƒšáƒ˜ ICU კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ წესები (%s) შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ ბáƒáƒ–ის (%s) ICU კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ წესებთáƒáƒœ თáƒáƒ•სებáƒáƒ“ი áƒáƒ áƒáƒ" + +#: commands/dbcommands.c:1214 +#, c-format +msgid "Use the same ICU collation rules as in the template database, or use template0 as template." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ იგივე ICU კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ წესები, რáƒáƒª შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ ბáƒáƒ–áƒáƒ¡ გáƒáƒáƒ©áƒœáƒ˜áƒ, áƒáƒœ შáƒáƒ‘ლáƒáƒœáƒáƒ“ template0 გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: commands/dbcommands.c:1243 +#, c-format +msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" +msgstr "შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ ბáƒáƒ–áƒáƒ¡ \"%s\" კáƒáƒšáƒáƒªáƒ˜áƒ გáƒáƒáƒ©áƒœáƒ˜áƒ, მáƒáƒ’რáƒáƒ› ნáƒáƒ›áƒ“ვილი კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ ვერსიის დáƒáƒ“გენრშეუძლებელიáƒ" + +#: commands/dbcommands.c:1248 +#, c-format +msgid "template database \"%s\" has a collation version mismatch" +msgstr "შáƒáƒ‘ლáƒáƒœáƒ£áƒšáƒ˜ ბáƒáƒ–ის (%s) კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ ვერსირáƒáƒ  ემთხვევáƒ" + +#: commands/dbcommands.c:1250 +#, c-format +msgid "The template database was created using collation version %s, but the operating system provides version %s." +msgstr "ნიმუში ბáƒáƒ–რშეიქმნრკáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ ვერსიით %s, მáƒáƒ’რáƒáƒ› áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒšáƒ˜ სისტემის ვერსიáƒáƒ %s." + +#: commands/dbcommands.c:1253 +#, c-format +msgid "Rebuild all objects in the template database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." +msgstr "სáƒáƒœáƒ˜áƒ›áƒ£áƒ¨áƒ” ბáƒáƒ–áƒáƒ¨áƒ˜ ყველრáƒáƒ‘იექტი, რáƒáƒ›áƒšáƒ”ბიც ნáƒáƒ’ულისხმევ კáƒáƒšáƒáƒªáƒ˜áƒáƒ¡ იყენებს, თáƒáƒ•იáƒáƒœ áƒáƒáƒ’ეთ დრგáƒáƒ£áƒ¨áƒ•ით ALTER DATABASE %s REFRESH COLLATION VERSION, áƒáƒœ PostgreSQL სწáƒáƒ áƒ˜ ბიბლიáƒáƒ—ეკის ვერსიით áƒáƒáƒ’ეთ." + +#: commands/dbcommands.c:1298 commands/dbcommands.c:2031 +#, c-format +msgid "pg_global cannot be used as default tablespace" +msgstr "pg_global áƒáƒ  შეიძლებრგáƒáƒ›áƒáƒ§áƒ”ნებულ იქნáƒáƒ¡ რáƒáƒ’áƒáƒ áƒª ნáƒáƒ’ულისხმევი ცხრილის სივრცე" + +#: commands/dbcommands.c:1324 +#, c-format +msgid "cannot assign new default tablespace \"%s\"" +msgstr "ცხრილების áƒáƒ®áƒáƒšáƒ˜ ნáƒáƒ’ულისხმევი სივრცის \"%s\" მინიჭებრშეუძლებელიáƒ" + +#: commands/dbcommands.c:1326 +#, c-format +msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." +msgstr "áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜, რáƒáƒ“გáƒáƒœ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡ \"%s\" áƒáƒ› ცხრილების სივრცეში ცხრილები უკვე გáƒáƒáƒ©áƒœáƒ˜áƒ." + +#: commands/dbcommands.c:1356 commands/dbcommands.c:1904 +#, c-format +msgid "database \"%s\" already exists" +msgstr "ბáƒáƒ–რ\"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/dbcommands.c:1370 +#, c-format +msgid "source database \"%s\" is being accessed by other users" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡ ბáƒáƒ–რ%s-სთáƒáƒœ áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებიცáƒáƒ მიერთებული" + +#: commands/dbcommands.c:1392 +#, c-format +msgid "database OID %u is already in use by database \"%s\"" +msgstr "ბáƒáƒ–ის OID %u უკვე გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრბáƒáƒ–ის \"%s\" მიერ" + +#: commands/dbcommands.c:1398 +#, c-format +msgid "data directory with the specified OID %u already exists" +msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული OID-ით (%u) უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/dbcommands.c:1571 commands/dbcommands.c:1586 utils/adt/pg_locale.c:2565 +#, c-format +msgid "encoding \"%s\" does not match locale \"%s\"" +msgstr "კáƒáƒ“ირებრ(%s) ენáƒáƒ¡ (%s) áƒáƒ  ემთხვევáƒ" + +#: commands/dbcommands.c:1574 +#, c-format +msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." +msgstr "\"LC_CTYPE\"-ის áƒáƒ áƒ©áƒ”ულ პáƒáƒ áƒáƒ›áƒ”ტრს სჭირდებრკáƒáƒ“ირებáƒ: \"%s\"." + +#: commands/dbcommands.c:1589 +#, c-format +msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." +msgstr "\"LC_COLLATE\"-ის áƒáƒ áƒ©áƒ”ულ პáƒáƒ áƒáƒ›áƒ”ტრს სჭირდებრკáƒáƒ“ირებáƒ: \"%s\"." + +#: commands/dbcommands.c:1670 +#, c-format +msgid "database \"%s\" does not exist, skipping" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dbcommands.c:1694 +#, c-format +msgid "cannot drop a template database" +msgstr "შáƒáƒ‘ლáƒáƒœáƒ£áƒ áƒ˜ ბáƒáƒ–ის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: commands/dbcommands.c:1700 +#, c-format +msgid "cannot drop the currently open database" +msgstr "ღირბáƒáƒ–ის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: commands/dbcommands.c:1713 +#, c-format +msgid "database \"%s\" is used by an active logical replication slot" +msgstr "ბáƒáƒ–რ%s áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ მიერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: commands/dbcommands.c:1715 +#, c-format +msgid "There is %d active slot." +msgid_plural "There are %d active slots." +msgstr[0] "ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜áƒ %d áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ სლáƒáƒ¢áƒ˜." +msgstr[1] "ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜áƒ %d áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ სლáƒáƒ¢áƒ˜." + +#: commands/dbcommands.c:1729 +#, c-format +msgid "database \"%s\" is being used by logical replication subscription" +msgstr "ბáƒáƒ–რ%s ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¬áƒ”რის მიერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: commands/dbcommands.c:1731 +#, c-format +msgid "There is %d subscription." +msgid_plural "There are %d subscriptions." +msgstr[0] "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირ%d გáƒáƒ›áƒáƒ¬áƒ”რáƒ." +msgstr[1] "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირ%d გáƒáƒ›áƒáƒ¬áƒ”რáƒ." + +#: commands/dbcommands.c:1752 commands/dbcommands.c:1926 commands/dbcommands.c:2053 +#, c-format +msgid "database \"%s\" is being accessed by other users" +msgstr "ბáƒáƒ–რ%s-სთáƒáƒœ áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ სხვრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებიცáƒáƒ მიერთებული" + +#: commands/dbcommands.c:1886 +#, c-format +msgid "permission denied to rename database" +msgstr "ბáƒáƒ–ის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/dbcommands.c:1915 +#, c-format +msgid "current database cannot be renamed" +msgstr "მიმდინáƒáƒ áƒ” ბáƒáƒ–ის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრშეუძლებელიáƒ" + +#: commands/dbcommands.c:2009 +#, c-format +msgid "cannot change the tablespace of the currently open database" +msgstr "ღირბáƒáƒ–ის ცხრილების სივრცის შეცვლრშეუძლებელიáƒ" + +#: commands/dbcommands.c:2115 +#, c-format +msgid "some relations of database \"%s\" are already in tablespace \"%s\"" +msgstr "ბáƒáƒ–ის (%s) ზáƒáƒ’იერთი ურთიერთáƒáƒ‘რცხრილების სივრცეში \"%s\" უკვე იმყáƒáƒ¤áƒ”ბáƒ" + +#: commands/dbcommands.c:2117 +#, c-format +msgid "You must move them back to the database's default tablespace before using this command." +msgstr "áƒáƒ› ბრძáƒáƒœáƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებáƒáƒ›áƒ“ე ბáƒáƒ–ის ნáƒáƒ’ულისხმევ ცხრილების სივრცეში უნდრდáƒáƒ‘რუნდეთ." + +#: commands/dbcommands.c:2244 commands/dbcommands.c:2979 commands/dbcommands.c:3279 commands/dbcommands.c:3392 +#, c-format +msgid "some useless files may be left behind in old database directory \"%s\"" +msgstr "ძველი ბáƒáƒ–ის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში \"%s\" შეიძლებრრáƒáƒ›áƒ“ენიმე გáƒáƒ›áƒáƒ£áƒ¡áƒáƒ“ეგáƒáƒ áƒ˜ ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ áƒ©áƒ" + +#: commands/dbcommands.c:2305 +#, c-format +msgid "unrecognized DROP DATABASE option \"%s\"" +msgstr "\"DROP DATABASE\"-ის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\"" + +#: commands/dbcommands.c:2383 +#, c-format +msgid "option \"%s\" cannot be specified with other options" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის \"%s\" მითითებრსხვრპáƒáƒ áƒáƒ›áƒ”ტრებთáƒáƒœ ერთáƒáƒ“ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/dbcommands.c:2430 +#, c-format +msgid "cannot alter invalid database \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბáƒáƒ–ის (\"%s\") შეცვლრშეუძლებელიáƒ" + +#: commands/dbcommands.c:2447 +#, c-format +msgid "cannot disallow connections for current database" +msgstr "მიმდინáƒáƒ áƒ” ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•შირების უáƒáƒ áƒ§áƒáƒ¤áƒ შეუძლებელიáƒ" + +#: commands/dbcommands.c:2673 +#, c-format +msgid "permission denied to change owner of database" +msgstr "ბáƒáƒ–ის მფლáƒáƒ‘ელის შეცვლის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/dbcommands.c:3085 +#, c-format +msgid "There are %d other session(s) and %d prepared transaction(s) using the database." +msgstr "áƒáƒ› ბáƒáƒ–áƒáƒ¡ %d სხვრსესირდრ%d მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ იყენებს." + +#: commands/dbcommands.c:3088 +#, c-format +msgid "There is %d other session using the database." +msgid_plural "There are %d other sessions using the database." +msgstr[0] "%d სხვრსესიáƒ, რáƒáƒ›áƒ”ლიც ბáƒáƒ–áƒáƒ¡ იყენებს." +msgstr[1] "%d სხვრსესიáƒ, რáƒáƒ›áƒ”ლიც ბáƒáƒ–áƒáƒ¡ იყენებს." + +#: commands/dbcommands.c:3093 storage/ipc/procarray.c:3847 +#, c-format +msgid "There is %d prepared transaction using the database." +msgid_plural "There are %d prepared transactions using the database." +msgstr[0] "ბáƒáƒ–áƒáƒ¡ %d მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ იყენებს." +msgstr[1] "ბáƒáƒ–áƒáƒ¡ %d მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ იყენებს." + +#: commands/dbcommands.c:3235 +#, c-format +msgid "missing directory \"%s\"" +msgstr "ნáƒáƒ™áƒšáƒ£áƒšáƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\"" + +#: commands/dbcommands.c:3293 commands/tablespace.c:184 commands/tablespace.c:633 +#, c-format +msgid "could not stat directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის \"%s\" პáƒáƒ•ნრშეუძლებელიáƒ: %m" + +#: commands/define.c:53 commands/define.c:257 commands/define.c:289 commands/define.c:317 commands/define.c:363 +#, c-format +msgid "%s requires a parameter" +msgstr "%s მáƒáƒ˜áƒ—ხáƒáƒ•ს პáƒáƒ áƒáƒ›áƒ”ტრს" + +#: commands/define.c:86 commands/define.c:97 commands/define.c:191 commands/define.c:209 commands/define.c:224 commands/define.c:242 +#, c-format +msgid "%s requires a numeric value" +msgstr "%s მáƒáƒ˜áƒ—ხáƒáƒ•ს რიცხვით მნიშვნელáƒáƒ‘áƒáƒ¡" + +#: commands/define.c:153 +#, c-format +msgid "%s requires a Boolean value" +msgstr "%s მáƒáƒ˜áƒ—ხáƒáƒ•ს ლáƒáƒ’იკურ მნიშვნელáƒáƒ‘áƒáƒ¡" + +#: commands/define.c:167 commands/define.c:176 commands/define.c:326 +#, c-format +msgid "%s requires an integer value" +msgstr "%s-ის მნიშვნელáƒáƒ‘რმთელი რიცხვი უნდრიყáƒáƒ¡" + +#: commands/define.c:271 +#, c-format +msgid "argument of %s must be a name" +msgstr "%s-ის áƒáƒ áƒ’უმენტი სáƒáƒ®áƒ”ლი უნდრიყáƒáƒ¡" + +#: commands/define.c:301 +#, c-format +msgid "argument of %s must be a type name" +msgstr "%s-ის áƒáƒ áƒ’უმენტი ტიპის სáƒáƒ®áƒ”ლი უნდრიყáƒáƒ¡" + +#: commands/define.c:347 +#, c-format +msgid "invalid argument for %s: \"%s\"" +msgstr "%s-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი: \"%s\"" + +#: commands/dropcmds.c:96 commands/functioncmds.c:1382 utils/adt/ruleutils.c:2909 +#, c-format +msgid "\"%s\" is an aggregate function" +msgstr "\"%s\" áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციáƒáƒ" + +#: commands/dropcmds.c:98 +#, c-format +msgid "Use DROP AGGREGATE to drop aggregate functions." +msgstr "áƒáƒ’რეგირებული ფუნქციების წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ DROP AGGREGATE." + +#: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:3865 commands/tablecmds.c:4023 commands/tablecmds.c:4075 commands/tablecmds.c:17061 tcop/utility.c:1325 +#, c-format +msgid "relation \"%s\" does not exist, skipping" +msgstr "ურთიერთáƒáƒ‘რ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებს" + +#: commands/dropcmds.c:183 commands/dropcmds.c:282 commands/tablecmds.c:1397 +#, c-format +msgid "schema \"%s\" does not exist, skipping" +msgstr "სქემრ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:223 commands/dropcmds.c:262 commands/tablecmds.c:286 +#, c-format +msgid "type \"%s\" does not exist, skipping" +msgstr "ტიპი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:252 +#, c-format +msgid "access method \"%s\" does not exist, skipping" +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:270 +#, c-format +msgid "collation \"%s\" does not exist, skipping" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:277 +#, c-format +msgid "conversion \"%s\" does not exist, skipping" +msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:288 commands/statscmds.c:664 +#, c-format +msgid "statistics object \"%s\" does not exist, skipping" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ‘იექტი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:295 +#, c-format +msgid "text search parser \"%s\" does not exist, skipping" +msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:302 +#, c-format +msgid "text search dictionary \"%s\" does not exist, skipping" +msgstr "ტექსტის ძებნის ლექსიკáƒáƒœáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:309 +#, c-format +msgid "text search template \"%s\" does not exist, skipping" +msgstr "ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:316 +#, c-format +msgid "text search configuration \"%s\" does not exist, skipping" +msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:321 +#, c-format +msgid "extension \"%s\" does not exist, skipping" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:331 +#, c-format +msgid "function %s(%s) does not exist, skipping" +msgstr "ფუნქცირ%s (%s) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:344 +#, c-format +msgid "procedure %s(%s) does not exist, skipping" +msgstr "პრáƒáƒªáƒ”დურრ%s (%s) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:357 +#, c-format +msgid "routine %s(%s) does not exist, skipping" +msgstr "ქვეპრáƒáƒ’რáƒáƒ›áƒ %s (%s) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:370 +#, c-format +msgid "aggregate %s(%s) does not exist, skipping" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜ %s (%s) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:383 +#, c-format +msgid "operator %s does not exist, skipping" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:389 +#, c-format +msgid "language \"%s\" does not exist, skipping" +msgstr "ენრ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:398 +#, c-format +msgid "cast from type %s to type %s does not exist, skipping" +msgstr "დáƒáƒ™áƒáƒ¡áƒ¢áƒ•რტიპიდáƒáƒœ %s ტიპáƒáƒ›áƒ“ე %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:407 +#, c-format +msgid "transform for type %s language \"%s\" does not exist, skipping" +msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ ტიპისთვის %s ენრ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:415 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" +msgstr "ურთიერთáƒáƒ‘ისთვის \"%2$s\" ტრიგერი \"%1$s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:424 +#, c-format +msgid "policy \"%s\" for relation \"%s\" does not exist, skipping" +msgstr "ურთიერთáƒáƒ‘ისთვის \"%2$s\" წესი \"%1$s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:431 +#, c-format +msgid "event trigger \"%s\" does not exist, skipping" +msgstr "მáƒáƒ•ლენის ტრიგერი (\"%s\") áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:437 +#, c-format +msgid "rule \"%s\" for relation \"%s\" does not exist, skipping" +msgstr "წესი %s ურთიერთáƒáƒ‘ისთვის \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:444 +#, c-format +msgid "foreign-data wrapper \"%s\" does not exist, skipping" +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:448 commands/foreigncmds.c:1360 +#, c-format +msgid "server \"%s\" does not exist, skipping" +msgstr "სერვერი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:457 +#, c-format +msgid "operator class \"%s\" does not exist for access method \"%s\", skipping" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜ \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:469 +#, c-format +msgid "operator family \"%s\" does not exist for access method \"%s\", skipping" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/dropcmds.c:476 +#, c-format +msgid "publication \"%s\" does not exist, skipping" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/event_trigger.c:137 +#, c-format +msgid "permission denied to create event trigger \"%s\"" +msgstr "მáƒáƒ•ლენის ტრიგერის (\"%s\") შექმნის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/event_trigger.c:139 +#, c-format +msgid "Must be superuser to create an event trigger." +msgstr "მáƒáƒ•ლენის ტრიგერის შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პრივილეგიები." + +#: commands/event_trigger.c:149 +#, c-format +msgid "unrecognized event name \"%s\"" +msgstr "მáƒáƒ•ლენის უცნáƒáƒ‘ი სáƒáƒ®áƒ”ლი \"%s\"" + +#: commands/event_trigger.c:166 +#, c-format +msgid "unrecognized filter variable \"%s\"" +msgstr "ფილტრის უცნáƒáƒ‘ი ცვლáƒáƒ“ი \"%s\"" + +#: commands/event_trigger.c:181 +#, c-format +msgid "tag filtering is not supported for login event triggers" +msgstr "ჭდის გáƒáƒ¤áƒ˜áƒšáƒ¢áƒ•რრმხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირშესვლის მáƒáƒ•ლენის ტრიგერისთვის" + +#: commands/event_trigger.c:224 +#, c-format +msgid "filter value \"%s\" not recognized for filter variable \"%s\"" +msgstr "ფილტრის მნიშვნელáƒáƒ‘რ\"%s\" ფილტრის ცვლáƒáƒ“ისთვის \"%s\" უცნáƒáƒ‘იáƒ" + +#. translator: %s represents an SQL statement name +#: commands/event_trigger.c:230 commands/event_trigger.c:252 +#, c-format +msgid "event triggers are not supported for %s" +msgstr "მáƒáƒ•ლენის ტრიგერები %s-ისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/event_trigger.c:265 +#, c-format +msgid "filter variable \"%s\" specified more than once" +msgstr "ფილტრის ცვლáƒáƒ“ი ერთზე მეტჯერáƒáƒ მითითებული: %s" + +#: commands/event_trigger.c:435 commands/event_trigger.c:487 commands/event_trigger.c:581 +#, c-format +msgid "event trigger \"%s\" does not exist" +msgstr "მáƒáƒ•ლენის ტრიგერი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" + +#: commands/event_trigger.c:519 +#, c-format +msgid "event trigger with OID %u does not exist" +msgstr "მáƒáƒ•ლენის ტრიგერი OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/event_trigger.c:549 +#, c-format +msgid "permission denied to change owner of event trigger \"%s\"" +msgstr "მáƒáƒ•ლენის ტრიგერის მფლáƒáƒ‘ელის შეცვლის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ: %s" + +#: commands/event_trigger.c:551 +#, c-format +msgid "The owner of an event trigger must be a superuser." +msgstr "მáƒáƒ•ლენის ტრიგერის მფლáƒáƒ‘ელი ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრიყáƒáƒ¡." + +#: commands/event_trigger.c:1411 +#, c-format +msgid "%s can only be called in a sql_drop event trigger function" +msgstr "%s-ის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბრsql_drop მáƒáƒ•ლენის ტრიგერიდáƒáƒœ შეგიძლიáƒáƒ—" + +#: commands/event_trigger.c:1504 commands/event_trigger.c:1525 +#, c-format +msgid "%s can only be called in a table_rewrite event trigger function" +msgstr "%s-ის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბრtable_rewrite მáƒáƒ•ლენის ტრიგერიდáƒáƒœ შეგიძლიáƒáƒ—" + +#: commands/event_trigger.c:1938 +#, c-format +msgid "%s can only be called in an event trigger function" +msgstr "%s-ის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბრმხáƒáƒšáƒáƒ“ მáƒáƒ•ლენის ტრიგერის ფუნქციიდáƒáƒœ შეგიძლიáƒáƒ—" + +#: commands/explain.c:240 commands/explain.c:265 +#, c-format +msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" +msgstr "\"EXPLAIN\"-ის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\": \"%s\"" + +#: commands/explain.c:272 +#, c-format +msgid "unrecognized EXPLAIN option \"%s\"" +msgstr "\"EXPLAIN\"-ის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\"" + +#: commands/explain.c:281 +#, c-format +msgid "EXPLAIN option WAL requires ANALYZE" +msgstr "EXPLAIN -ის პáƒáƒ áƒáƒ›áƒ”ტრ WAL-ს ANALYZE სჭირდებáƒ" + +#: commands/explain.c:290 +#, c-format +msgid "EXPLAIN option TIMING requires ANALYZE" +msgstr "EXPLAIN -ის პáƒáƒ áƒáƒ›áƒ”ტრ TIMING-ს ANALYZE სჭირდებáƒ" + +#: commands/explain.c:296 +#, c-format +msgid "EXPLAIN option SERIALIZE requires ANALYZE" +msgstr "EXPLAIN-ის პáƒáƒ áƒáƒ›áƒ”ტრს SERIALIZE 'ANALYZE' სჭირდებáƒ" + +#: commands/explain.c:302 +#, c-format +msgid "EXPLAIN options ANALYZE and GENERIC_PLAN cannot be used together" +msgstr "EXPLAIN-ის პáƒáƒ áƒáƒ›áƒ”ტრები ANALYZE დრGENERIC_PLAN ერთáƒáƒ“ áƒáƒ  შეიძლებáƒ, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—" + +#: commands/extension.c:178 commands/extension.c:3031 +#, c-format +msgid "extension \"%s\" does not exist" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ%s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/extension.c:277 commands/extension.c:286 commands/extension.c:298 commands/extension.c:308 +#, c-format +msgid "invalid extension name: \"%s\"" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\"" + +#: commands/extension.c:278 +#, c-format +msgid "Extension names must not be empty." +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის სáƒáƒ®áƒ”ლები ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  უნდრიყáƒáƒ¡." + +#: commands/extension.c:287 +#, c-format +msgid "Extension names must not contain \"--\"." +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის სáƒáƒ®áƒ”ლები áƒáƒ  უნდრშეიცáƒáƒ•დეს \"---\"." + +#: commands/extension.c:299 +#, c-format +msgid "Extension names must not begin or end with \"-\"." +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის სáƒáƒ®áƒ”ლები áƒáƒ  უნდრდáƒáƒ˜áƒ¬áƒ§áƒáƒ¡ áƒáƒœ დáƒáƒ¡áƒ áƒ£áƒšáƒ“ეს \"-\"." + +#: commands/extension.c:309 +#, c-format +msgid "Extension names must not contain directory separator characters." +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის სáƒáƒ®áƒ”ლები áƒáƒ  უნდრშეიცáƒáƒ•დეს სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის გáƒáƒ›áƒ§áƒáƒ¤áƒ˜ სიმბáƒáƒšáƒáƒ¡." + +#: commands/extension.c:324 commands/extension.c:333 commands/extension.c:342 commands/extension.c:352 +#, c-format +msgid "invalid extension version name: \"%s\"" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ვერსიáƒ: \"%s\"" + +#: commands/extension.c:325 +#, c-format +msgid "Version names must not be empty." +msgstr "ვერსიის სáƒáƒ®áƒ”ლები áƒáƒ  უნდრიყáƒáƒ¡ ცáƒáƒ áƒ˜áƒ”ლი." + +#: commands/extension.c:334 +#, c-format +msgid "Version names must not contain \"--\"." +msgstr "ვერსიის სáƒáƒ®áƒ”ლები áƒáƒ  უნდრშეიცáƒáƒ•დეს \"---\"." + +#: commands/extension.c:343 +#, c-format +msgid "Version names must not begin or end with \"-\"." +msgstr "ვერსიის სáƒáƒ®áƒ”ლები áƒáƒ  უნდრდáƒáƒ˜áƒ¬áƒ§áƒáƒ¡ áƒáƒœ დáƒáƒ¡áƒ áƒ£áƒšáƒ“ეს \"-\"." + +#: commands/extension.c:353 +#, c-format +msgid "Version names must not contain directory separator characters." +msgstr "ვერსიის სáƒáƒ®áƒ”ლები áƒáƒ  უნდრშეიცáƒáƒ•დეს სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის გáƒáƒ›áƒ§áƒáƒ¤ სიმბáƒáƒšáƒáƒ”ბს." + +#: commands/extension.c:507 +#, c-format +msgid "extension \"%s\" is not available" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ\"%s\" ხელმიუწვდáƒáƒ›áƒ”ლიáƒ" + +#: commands/extension.c:508 +#, c-format +msgid "Could not open extension control file \"%s\": %m." +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m." + +#: commands/extension.c:510 +#, c-format +msgid "The extension must first be installed on the system where PostgreSQL is running." +msgstr "ჯერ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრუნდრდáƒáƒáƒ§áƒ”ნáƒáƒ— სისტემáƒáƒ–ე, სáƒáƒ“áƒáƒª PostgreSQL-ირგáƒáƒ¨áƒ•ებული." + +#: commands/extension.c:514 +#, c-format +msgid "could not open extension control file \"%s\": %m" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: commands/extension.c:537 commands/extension.c:547 +#, c-format +msgid "parameter \"%s\" cannot be set in a secondary extension control file" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრს \"%s\" მეáƒáƒ áƒáƒ“ი გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ ვერ დáƒáƒáƒ§áƒ”ნებთ" + +#: commands/extension.c:569 commands/extension.c:577 commands/extension.c:585 utils/misc/guc.c:3147 +#, c-format +msgid "parameter \"%s\" requires a Boolean value" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრს %s ლáƒáƒ’იკური მნიშვნელáƒáƒ‘რსჭირდებáƒ" + +#: commands/extension.c:594 +#, c-format +msgid "\"%s\" is not a valid encoding name" +msgstr "\"%s\" კáƒáƒ“ირების სწáƒáƒ  სáƒáƒ®áƒ”ლს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: commands/extension.c:608 commands/extension.c:623 +#, c-format +msgid "parameter \"%s\" must be a list of extension names" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების სáƒáƒ®áƒ”ლების სიáƒáƒ¡ უნდრშეიცáƒáƒ•დეს" + +#: commands/extension.c:630 +#, c-format +msgid "unrecognized parameter \"%s\" in file \"%s\"" +msgstr "უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\"" + +#: commands/extension.c:639 +#, c-format +msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" +msgstr "რáƒáƒªáƒ \"relocatable\" ჭეშმáƒáƒ áƒ˜áƒ¢áƒ˜áƒ, პáƒáƒ áƒáƒ›áƒ”ტრს \"schema\" ვერ მიუთითებთ" + +#: commands/extension.c:817 +#, c-format +msgid "transaction control statements are not allowed within an extension script" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის სკრიპტში ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბები დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: commands/extension.c:897 +#, c-format +msgid "permission denied to create extension \"%s\"" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის (\"%s\") შექმნის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ" + +#: commands/extension.c:900 +#, c-format +msgid "Must have CREATE privilege on current database to create this extension." +msgstr "áƒáƒ› გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირმიმდინáƒáƒ áƒ” ბáƒáƒ–áƒáƒ–ე პრივილეგირCREATE-ის ქáƒáƒœáƒ." + +#: commands/extension.c:901 +#, c-format +msgid "Must be superuser to create this extension." +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებები." + +#: commands/extension.c:905 +#, c-format +msgid "permission denied to update extension \"%s\"" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის (\"%s\") გáƒáƒœáƒáƒ®áƒšáƒ”ბის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/extension.c:908 +#, c-format +msgid "Must have CREATE privilege on current database to update this extension." +msgstr "áƒáƒ› გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის გáƒáƒœáƒáƒ®áƒšáƒ”ბისთვის áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირმიმდინáƒáƒ áƒ” ბáƒáƒ–áƒáƒ–ე პრივილეგირCREATE-ის ქáƒáƒœáƒ." + +#: commands/extension.c:909 +#, c-format +msgid "Must be superuser to update this extension." +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის გáƒáƒ¡áƒáƒáƒ®áƒšáƒ”ბლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებები." + +#: commands/extension.c:1042 +#, c-format +msgid "invalid character in extension owner: must not contain any of \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიმბáƒáƒšáƒ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის მფლáƒáƒ‘ელში: áƒáƒ  უნდრშეიცáƒáƒ•დეს სიმბáƒáƒšáƒáƒ”ბს სიიდáƒáƒœ \"%s\"" + +#: commands/extension.c:1066 commands/extension.c:1093 +#, c-format +msgid "invalid character in extension \"%s\" schema: must not contain any of \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიმბáƒáƒšáƒ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ¨áƒ˜ \"%s\": სქემáƒ: áƒáƒ  უნდრშეიცáƒáƒ•დეს სიმბáƒáƒšáƒáƒ”ბს სიიდáƒáƒœ \"%s\"" + +#: commands/extension.c:1288 +#, c-format +msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ¡ \"%s\" ვერსიიდáƒáƒœ \"%s\" ვერსიáƒáƒ›áƒ“ე \"%s\" გáƒáƒœáƒáƒ®áƒšáƒ”ბის ბილიკი áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/extension.c:1496 commands/extension.c:3089 +#, c-format +msgid "version to install must be specified" +msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ დáƒáƒ¡áƒáƒ§áƒ”ნებელი ვერსიის მითითებáƒ" + +#: commands/extension.c:1533 +#, c-format +msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ¡ \"%s\" ვერსიისთვის \"%s\" áƒáƒ áƒª დáƒáƒ§áƒ”ნების სკრიპტი გáƒáƒáƒ©áƒœáƒ˜áƒ, áƒáƒ áƒª გáƒáƒœáƒáƒ®áƒšáƒ”ბის ბილიკი" + +#: commands/extension.c:1567 +#, c-format +msgid "extension \"%s\" must be installed in schema \"%s\"" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ\"%s\" დáƒáƒ§áƒ”ნებული უნდრიყáƒáƒ¡ სქემáƒáƒ¨áƒ˜ \"%s\"" + +#: commands/extension.c:1727 +#, c-format +msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" +msgstr "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირციკლური დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებები \"%s\" დრ\"%s\" გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბებს შáƒáƒ áƒ˜áƒ¡" + +#: commands/extension.c:1732 +#, c-format +msgid "installing required extension \"%s\"" +msgstr "მáƒáƒ—ხáƒáƒ•ნილი გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის დáƒáƒ§áƒ”ნებáƒ: \"%s\"" + +#: commands/extension.c:1755 +#, c-format +msgid "required extension \"%s\" is not installed" +msgstr "მáƒáƒ—ხáƒáƒ•ნილი გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრდáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ: %s" + +#: commands/extension.c:1758 +#, c-format +msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." +msgstr "სáƒáƒ­áƒ˜áƒ áƒ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების დáƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ CREATE EXTENSION ... CASCADE." + +#: commands/extension.c:1793 +#, c-format +msgid "extension \"%s\" already exists, skipping" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ\"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/extension.c:1800 +#, c-format +msgid "extension \"%s\" already exists" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ\"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/extension.c:1811 +#, c-format +msgid "nested CREATE EXTENSION is not supported" +msgstr "ჩáƒáƒ“გმული CREATE EXTENSION მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: commands/extension.c:1975 +#, c-format +msgid "cannot drop extension \"%s\" because it is being modified" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის \"%s\" წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ მიმდინáƒáƒ áƒ”áƒáƒ‘ს მისი ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ" + +#: commands/extension.c:2450 +#, c-format +msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" +msgstr "%s-ის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბრმხáƒáƒšáƒáƒ“ CREATE EXTENSION-ის მიერ შესრულებულ SQL სკრიპტიდáƒáƒœ შეგიძლიáƒáƒ—" + +#: commands/extension.c:2462 +#, c-format +msgid "OID %u does not refer to a table" +msgstr "OID %u ცხრილს áƒáƒ  ეხებáƒ" + +#: commands/extension.c:2467 +#, c-format +msgid "table \"%s\" is not a member of the extension being created" +msgstr "ცხრილი (%s) áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს იმ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის წევრს, რáƒáƒ›áƒšáƒ˜áƒ¡ შექმნáƒáƒª მიმდინáƒáƒ áƒ”áƒáƒ‘ს" + +#: commands/extension.c:2813 +#, c-format +msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის (\"%s\") სქემáƒáƒ¨áƒ˜ (\"%s\") გáƒáƒ“áƒáƒ¢áƒáƒœáƒ შეუძლებელირიმიტáƒáƒ›, რáƒáƒ› გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრსქემáƒáƒ¡ შეიცáƒáƒ•ს" + +#: commands/extension.c:2854 commands/extension.c:2948 +#, c-format +msgid "extension \"%s\" does not support SET SCHEMA" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ¡ SET SCHEMA-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ: %s" + +#: commands/extension.c:2911 +#, c-format +msgid "cannot SET SCHEMA of extension \"%s\" because other extensions prevent it" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ\"%s\"-ის SET SCHEMA შეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ ეს იკრძáƒáƒšáƒ”ბრსხვრგáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების მიერ" + +#: commands/extension.c:2913 +#, c-format +msgid "Extension \"%s\" requests no relocation of extension \"%s\"." +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ\"%s\" გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის \"%s\" გáƒáƒ“áƒáƒáƒ“გილებáƒáƒ¡ áƒáƒ  მáƒáƒ˜áƒ—ხáƒáƒ•ს." + +#: commands/extension.c:2950 +#, c-format +msgid "%s is not in the extension's schema \"%s\"" +msgstr "%s áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის სქემáƒáƒ¡ \"%s\"" + +#: commands/extension.c:3011 +#, c-format +msgid "nested ALTER EXTENSION is not supported" +msgstr "ჩáƒáƒ“გმული ALTER EXTENSION მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: commands/extension.c:3100 +#, c-format +msgid "version \"%s\" of extension \"%s\" is already installed" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის %2$s ვერსირ%1$s უკვე დáƒáƒ§áƒ”ნებულიáƒ" + +#: commands/extension.c:3311 +#, c-format +msgid "cannot add an object of this type to an extension" +msgstr "áƒáƒ› ტიპის áƒáƒ‘იექტის გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ–ე დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ" + +#: commands/extension.c:3409 +#, c-format +msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" +msgstr "სქემის (\"%s\") გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ სქემრგáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ¡ შეიცáƒáƒ•ს" + +#: commands/extension.c:3491 commands/typecmds.c:4042 utils/fmgr/funcapi.c:725 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "მáƒáƒœáƒáƒªáƒ”მების ტიპისთვის %s მრáƒáƒ•áƒáƒšáƒ“იáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒáƒœáƒ˜ ტიპი ვერ ვიპáƒáƒ•ე" + +#: commands/extension.c:3532 +#, c-format +msgid "file \"%s\" is too large" +msgstr "%s: ფáƒáƒ˜áƒšáƒ˜ ძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ" + +#: commands/foreigncmds.c:148 commands/foreigncmds.c:157 +#, c-format +msgid "option \"%s\" not found" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/foreigncmds.c:167 +#, c-format +msgid "option \"%s\" provided more than once" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი ერთზე მეტჯერáƒáƒ მითითებული: \"%s\"" + +#: commands/foreigncmds.c:221 commands/foreigncmds.c:229 +#, c-format +msgid "permission denied to change owner of foreign-data wrapper \"%s\"" +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ მფლáƒáƒ‘ელის შეცვლის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ : \"%s\"" + +#: commands/foreigncmds.c:223 +#, c-format +msgid "Must be superuser to change owner of a foreign-data wrapper." +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ მფლáƒáƒ‘ელის შეცვლáƒáƒ¡ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის წვდáƒáƒ›áƒ”ბი სჭირდებáƒ." + +#: commands/foreigncmds.c:231 +#, c-format +msgid "The owner of a foreign-data wrapper must be a superuser." +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ მფლáƒáƒ‘ელი ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრიყáƒáƒ¡." + +#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:681 +#, c-format +msgid "foreign-data wrapper \"%s\" does not exist" +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: commands/foreigncmds.c:325 +#, c-format +msgid "foreign-data wrapper with OID %u does not exist" +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜ OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/foreigncmds.c:462 +#, c-format +msgid "foreign server with OID %u does not exist" +msgstr "გáƒáƒ áƒ” სერვერი OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/foreigncmds.c:580 +#, c-format +msgid "permission denied to create foreign-data wrapper \"%s\"" +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ შექმნის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ: %s" + +#: commands/foreigncmds.c:582 +#, c-format +msgid "Must be superuser to create a foreign-data wrapper." +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ." + +#: commands/foreigncmds.c:697 +#, c-format +msgid "permission denied to alter foreign-data wrapper \"%s\"" +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ შეცვლის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ: %s" + +#: commands/foreigncmds.c:699 +#, c-format +msgid "Must be superuser to alter a foreign-data wrapper." +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ შესáƒáƒªáƒ•ლელáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ." + +#: commands/foreigncmds.c:730 +#, c-format +msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის შეცვლáƒáƒ¡ შეუძლირáƒáƒ áƒ¡áƒ”ბული გáƒáƒ áƒ” ცხრილების ქცევრშეცვáƒáƒšáƒáƒ¡" + +#: commands/foreigncmds.c:745 +#, c-format +msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" +msgstr "" + +#: commands/foreigncmds.c:876 +#, c-format +msgid "server \"%s\" already exists, skipping" +msgstr "სერვერი \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/foreigncmds.c:1144 +#, c-format +msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ბმრ%s სერვერისთვის %s უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/foreigncmds.c:1154 +#, c-format +msgid "user mapping for \"%s\" already exists for server \"%s\"" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ბმრ%s სერვერისთვის %s უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 +#, c-format +msgid "user mapping for \"%s\" does not exist for server \"%s\"" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ბმრ%s სერვერისთვის %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/foreigncmds.c:1379 +#, c-format +msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ბმრ%s სერვერისთვის %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/foreigncmds.c:1507 foreign/foreign.c:394 +#, c-format +msgid "foreign-data wrapper \"%s\" has no handler" +msgstr "გáƒáƒ áƒ”-მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ¡ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ: %s" + +#: commands/foreigncmds.c:1513 +#, c-format +msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" +msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ¡ IMPORT FOREIGN SCHEMA-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ: %s" + +#: commands/foreigncmds.c:1615 +#, c-format +msgid "importing foreign table \"%s\"" +msgstr "გáƒáƒ áƒ” ცხრილის შემáƒáƒ¢áƒáƒœáƒ (\"%s\")" + +#: commands/functioncmds.c:104 +#, c-format +msgid "SQL function cannot return shell type %s" +msgstr "SQL ფუნქციებს %s გáƒáƒ áƒ¡áƒ˜áƒ¡ ტიპის დáƒáƒ‘რუნებრáƒáƒ  შეუძლიáƒáƒ—" + +#: commands/functioncmds.c:109 +#, c-format +msgid "return type %s is only a shell" +msgstr "დáƒáƒ‘რუნებáƒáƒ“ი ტიპი %s ცáƒáƒ áƒ˜áƒ”ლიáƒ" + +#: commands/functioncmds.c:138 parser/parse_type.c:354 +#, c-format +msgid "type modifier cannot be specified for shell type \"%s\"" +msgstr "ტიპის მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ¡ \"%s\" ტიპი გáƒáƒ áƒ”მáƒáƒ¡áƒ—ვის ვერ მიუთითებთ" + +#: commands/functioncmds.c:144 +#, c-format +msgid "type \"%s\" is not yet defined" +msgstr "ტიპი \"%s\" ჯერ áƒáƒ  áƒáƒ áƒ˜áƒ¡ გáƒáƒœáƒ¡áƒáƒ–ღვრული" + +#: commands/functioncmds.c:145 +#, c-format +msgid "Creating a shell type definition." +msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ ტიპის áƒáƒ¦áƒ¬áƒ”რის შექმნáƒ." + +#: commands/functioncmds.c:244 +#, c-format +msgid "SQL function cannot accept shell type %s" +msgstr "SQL ფუნქციებს %s გáƒáƒ áƒ¡áƒ˜áƒ¡ ტიპის მიღებრáƒáƒ  შეუძლიáƒáƒ—" + +#: commands/functioncmds.c:250 +#, c-format +msgid "aggregate cannot accept shell type %s" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ¡ áƒáƒ  შეუძლირცáƒáƒ áƒ˜áƒ”ლი ტიპის მიღებáƒ: %s" + +#: commands/functioncmds.c:255 +#, c-format +msgid "argument type %s is only a shell" +msgstr "áƒáƒ áƒ’უმენტის ტიპი %s მხáƒáƒšáƒáƒ“ გáƒáƒ áƒ¡áƒ˜áƒ" + +#: commands/functioncmds.c:265 +#, c-format +msgid "type %s does not exist" +msgstr "ტიპი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/functioncmds.c:279 +#, c-format +msgid "aggregates cannot accept set arguments" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ”ბს áƒáƒ áƒ’უმენტების სეტის მიღებრáƒáƒ  შეუძლიáƒáƒ—" + +#: commands/functioncmds.c:283 +#, c-format +msgid "procedures cannot accept set arguments" +msgstr "პრáƒáƒªáƒ”დურებს áƒáƒ áƒ’უმენტების სეტის მიღებრáƒáƒ  შეუძლიáƒáƒ—" + +#: commands/functioncmds.c:287 +#, c-format +msgid "functions cannot accept set arguments" +msgstr "ფუნქციებს áƒáƒ áƒ’უმენტების სეტის მიღებრáƒáƒ  შეუძლიáƒáƒ—" + +#: commands/functioncmds.c:297 +#, c-format +msgid "VARIADIC parameter must be the last input parameter" +msgstr "VARIADIC პáƒáƒ áƒáƒ›áƒ”ტრი ბáƒáƒšáƒ შეყვáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი უნდრიყáƒáƒ¡" + +#: commands/functioncmds.c:317 +#, c-format +msgid "VARIADIC parameter must be the last parameter" +msgstr "VARIADIC პáƒáƒ áƒáƒ›áƒ”ტრი ბáƒáƒšáƒ უნდრიყáƒáƒ¡" + +#: commands/functioncmds.c:342 +#, c-format +msgid "VARIADIC parameter must be an array" +msgstr "VARIADIC პáƒáƒ áƒáƒ›áƒ”ტრი მáƒáƒ¡áƒ˜áƒ•ი უნდრიყáƒáƒ¡" + +#: commands/functioncmds.c:387 +#, c-format +msgid "parameter name \"%s\" used more than once" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის სáƒáƒ®áƒ”ლი \"%s\" ერთზე მეტჯერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: commands/functioncmds.c:405 +#, c-format +msgid "only input parameters can have default values" +msgstr "ნáƒáƒ’ულისხმევი მნიშვნელáƒáƒ‘ების დáƒáƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ შემáƒáƒ›áƒáƒ•áƒáƒš პáƒáƒ áƒáƒ›áƒ”ტრებზერშესáƒáƒ«áƒšáƒ”ბელი" + +#: commands/functioncmds.c:420 +#, c-format +msgid "cannot use table references in parameter default value" +msgstr "ცხრილის ბმის პáƒáƒ áƒáƒ›áƒ”ტრის ნáƒáƒ’ულისხმევ მნიშვნელáƒáƒ‘áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: commands/functioncmds.c:444 +#, c-format +msgid "input parameters after one with a default value must also have defaults" +msgstr "შეყვáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრებში, მáƒáƒ¡ შემდეგ, რáƒáƒª ერთს áƒáƒ¥áƒ•ს ნáƒáƒ’ულისხმევი მნიშვნელáƒáƒ‘áƒ, ის სხვებსáƒáƒª უნდრჰქáƒáƒœáƒ“ეთ" + +#: commands/functioncmds.c:454 +#, c-format +msgid "procedure OUT parameters cannot appear after one with a default value" +msgstr "პრáƒáƒªáƒ”დური OUT პáƒáƒ áƒáƒ›áƒ”ტრები ვერ გáƒáƒ›áƒáƒ©áƒœáƒ“ებრერთის შემდეგ, რáƒáƒ›áƒ”ლსáƒáƒª ნáƒáƒ’ულისხმევი მნიშვნელáƒáƒ‘რგáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/functioncmds.c:596 commands/functioncmds.c:775 +#, c-format +msgid "invalid attribute in procedure definition" +msgstr "პრáƒáƒªáƒ”დურის áƒáƒ¦áƒ¬áƒ”რáƒáƒ¨áƒ˜ ნáƒáƒžáƒáƒ•ნირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ¢áƒ áƒ˜áƒ‘უტი" + +#: commands/functioncmds.c:692 +#, c-format +msgid "support function %s must return type %s" +msgstr "მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფუნქციáƒáƒ› (%s) უნდრდáƒáƒáƒ‘რუნáƒáƒ¡ ტიპი %s" + +#: commands/functioncmds.c:703 +#, c-format +msgid "must be superuser to specify a support function" +msgstr "მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფუნქციის მისáƒáƒ—ითებლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის წვდáƒáƒ›áƒ”ლირსáƒáƒ­áƒ˜áƒ áƒ" + +#: commands/functioncmds.c:824 commands/functioncmds.c:1427 +#, c-format +msgid "COST must be positive" +msgstr "COST დáƒáƒ“ებითი უნდრიყáƒáƒ¡" + +#: commands/functioncmds.c:832 commands/functioncmds.c:1435 +#, c-format +msgid "ROWS must be positive" +msgstr "ROWS დáƒáƒ“ებითი უნდრიყáƒáƒ¡" + +#: commands/functioncmds.c:861 +#, c-format +msgid "no function body specified" +msgstr "ფუნქციის ტáƒáƒœáƒ˜ მითითებული áƒáƒ áƒáƒ" + +#: commands/functioncmds.c:866 +#, c-format +msgid "duplicate function body specified" +msgstr "მითითებულირფუნქციის დუბლირებული ტáƒáƒœáƒ˜" + +#: commands/functioncmds.c:871 +#, c-format +msgid "inline SQL function body only valid for language SQL" +msgstr "" + +#: commands/functioncmds.c:913 +#, c-format +msgid "SQL function with unquoted function body cannot have polymorphic arguments" +msgstr "ბრჭყáƒáƒšáƒ”ბის áƒáƒ áƒ›áƒ¥áƒáƒœáƒ” ტáƒáƒœáƒ˜áƒ¡ მáƒáƒ¢áƒáƒ áƒ”ბელ SQL ფუნქციáƒáƒ¡ პáƒáƒšáƒ˜áƒ›áƒáƒ áƒ¤áƒ£áƒšáƒ˜ áƒáƒ áƒ’უმენტები áƒáƒ  შეიძლებრჰქáƒáƒœáƒ“ეს" + +#: commands/functioncmds.c:939 commands/functioncmds.c:958 +#, c-format +msgid "%s is not yet supported in unquoted SQL function body" +msgstr "%s ბრჭყáƒáƒšáƒ’áƒáƒ áƒ”შე SQL ფუნქციის სხეულში ჯერ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/functioncmds.c:986 +#, c-format +msgid "only one AS item needed for language \"%s\"" +msgstr "ენისთვის მხáƒáƒšáƒáƒ“ ერთი AS áƒáƒ áƒ˜áƒ¡ სáƒáƒ­áƒ˜áƒ áƒ: %s" + +#: commands/functioncmds.c:1091 +#, c-format +msgid "no language specified" +msgstr "ენრáƒáƒ  áƒáƒ áƒ˜áƒ¡ მითითებული" + +#: commands/functioncmds.c:1099 commands/functioncmds.c:2104 commands/proclang.c:235 +#, c-format +msgid "language \"%s\" does not exist" +msgstr "ენრ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/functioncmds.c:1101 commands/functioncmds.c:2106 +#, c-format +msgid "Use CREATE EXTENSION to load the language into the database." +msgstr "ენის ბáƒáƒ–áƒáƒ¨áƒ˜ შესáƒáƒ¢áƒ•ირთáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ CREATE EXTENSION." + +#: commands/functioncmds.c:1134 commands/functioncmds.c:1419 +#, c-format +msgid "only superuser can define a leakproof function" +msgstr "leakproof áƒáƒ¢áƒ áƒ˜áƒ‘უტის მქáƒáƒœáƒ” ფუნქციის áƒáƒ¦áƒ¬áƒ”რრმხáƒáƒšáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს შეუძლიáƒ" + +#: commands/functioncmds.c:1185 +#, c-format +msgid "function result type must be %s because of OUT parameters" +msgstr "\"OUT\" პáƒáƒ áƒáƒ›áƒ”ტრების გáƒáƒ›áƒ ფუნქციის შედეგის ტიპი %s უნდრიყáƒáƒ¡" + +#: commands/functioncmds.c:1198 +#, c-format +msgid "function result type must be specified" +msgstr "ფუნქციის შედეგის ტიპის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/functioncmds.c:1251 commands/functioncmds.c:1439 +#, c-format +msgid "ROWS is not applicable when function does not return a set" +msgstr "ROWS შესáƒáƒ¤áƒ”რისი áƒáƒ áƒáƒ, რáƒáƒªáƒ ფუნქცირსეტს áƒáƒ  áƒáƒ‘რუნებს" + +#: commands/functioncmds.c:1546 +#, c-format +msgid "source data type %s is a pseudo-type" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ მáƒáƒœáƒáƒªáƒ”მთრტიპი %s ფსევდრტიპიáƒ" + +#: commands/functioncmds.c:1552 +#, c-format +msgid "target data type %s is a pseudo-type" +msgstr "სáƒáƒ‘áƒáƒšáƒáƒ მáƒáƒœáƒáƒªáƒ”მთრტიპი %s ფსევდრტიპიáƒ" + +#: commands/functioncmds.c:1576 +#, c-format +msgid "cast will be ignored because the source data type is a domain" +msgstr "მáƒáƒ®áƒ“ებრგáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ დáƒáƒ˜áƒ’ნáƒáƒ áƒ”ბრიმის გáƒáƒ›áƒ, რáƒáƒ› მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ტიპი დáƒáƒ›áƒ”ნს წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: commands/functioncmds.c:1581 +#, c-format +msgid "cast will be ignored because the target data type is a domain" +msgstr "მáƒáƒ®áƒ“ებრგáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ დáƒáƒ˜áƒ’ნáƒáƒ áƒ”ბრიმის გáƒáƒ›áƒ, რáƒáƒ› მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ›áƒ˜áƒ–ნე ტიპი დáƒáƒ›áƒ”ნს წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: commands/functioncmds.c:1606 +#, c-format +msgid "cast function must take one to three arguments" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ფუნქციáƒáƒ› ერთიდáƒáƒœ სáƒáƒ› áƒáƒ áƒ’უმენტáƒáƒ›áƒ“ე უნდრმიიღáƒáƒ¡" + +#: commands/functioncmds.c:1612 +#, c-format +msgid "argument of cast function must match or be binary-coercible from source data type" +msgstr "" + +#: commands/functioncmds.c:1616 +#, c-format +msgid "second argument of cast function must be type %s" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ფუნქციის მეáƒáƒ áƒ” áƒáƒ áƒ’უმენტის ტიპი %s უნდრიყáƒáƒ¡" + +#: commands/functioncmds.c:1621 +#, c-format +msgid "third argument of cast function must be type %s" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ფუნქციის მესáƒáƒ›áƒ” áƒáƒ áƒ’უმენტის ტიპი %s უნდრიყáƒáƒ¡" + +#: commands/functioncmds.c:1628 +#, c-format +msgid "return data type of cast function must match or be binary-coercible to target data type" +msgstr "" + +#: commands/functioncmds.c:1639 +#, c-format +msgid "cast function must not be volatile" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ფუნქცირცვáƒáƒšáƒ”ბáƒáƒ“ი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/functioncmds.c:1644 +#, c-format +msgid "cast function must be a normal function" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ფუნქცირნáƒáƒ áƒ›áƒáƒšáƒ£áƒ áƒ˜ ფუნქცირუნდრიყáƒáƒ¡" + +#: commands/functioncmds.c:1648 +#, c-format +msgid "cast function must not return a set" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ფუნქციáƒáƒ› სეტი áƒáƒ  უნდრდáƒáƒáƒ‘რუნáƒáƒ¡" + +#: commands/functioncmds.c:1674 +#, c-format +msgid "must be superuser to create a cast WITHOUT FUNCTION" +msgstr "\"WITHOUT FUNCTION\"-ის გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ ზეáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ" + +#: commands/functioncmds.c:1689 +#, c-format +msgid "source and target data types are not physically compatible" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ დრსáƒáƒ›áƒ˜áƒ–ნე მáƒáƒœáƒáƒªáƒ”მის ტიპები ფიზიკურáƒáƒ“ შეუთáƒáƒ•სებელიáƒ" + +#: commands/functioncmds.c:1704 +#, c-format +msgid "composite data types are not binary-compatible" +msgstr "მáƒáƒœáƒáƒªáƒ”მების კáƒáƒ›áƒžáƒáƒ–იტური ტიპები შეუთáƒáƒ•სებელირáƒáƒ áƒáƒ‘ით დáƒáƒœáƒ”ზე" + +#: commands/functioncmds.c:1710 +#, c-format +msgid "enum data types are not binary-compatible" +msgstr "მáƒáƒœáƒáƒªáƒ”მების ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜áƒ¡ ტიპები შეუთáƒáƒ•სებელირáƒáƒ áƒáƒ‘ით დáƒáƒœáƒ”ზე" + +#: commands/functioncmds.c:1716 +#, c-format +msgid "array data types are not binary-compatible" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის მáƒáƒœáƒáƒªáƒ”მების ტიპები შეუთáƒáƒ•სებელირáƒáƒ áƒáƒ‘ით დáƒáƒœáƒ”ზე" + +#: commands/functioncmds.c:1733 +#, c-format +msgid "domain data types must not be marked binary-compatible" +msgstr "დáƒáƒ›áƒ”ნის მáƒáƒœáƒáƒªáƒ”მების ტიპები შეუთáƒáƒ•სებელირáƒáƒ áƒáƒ‘ით დáƒáƒœáƒ”ზე" + +#: commands/functioncmds.c:1743 +#, c-format +msgid "source data type and target data type are the same" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ დრსáƒáƒ›áƒ˜áƒ–ნე მáƒáƒœáƒáƒªáƒ”მების ტიპები ერთი დრიგივეáƒ" + +#: commands/functioncmds.c:1776 +#, c-format +msgid "transform function must not be volatile" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ფუნქცირცვáƒáƒšáƒ”ბáƒáƒ“ი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/functioncmds.c:1780 +#, c-format +msgid "transform function must be a normal function" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ფუნქცირნáƒáƒ áƒ›áƒáƒšáƒ£áƒ áƒ˜ ფუნქცირუნდრიყáƒáƒ¡" + +#: commands/functioncmds.c:1784 +#, c-format +msgid "transform function must not return a set" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ფუნქციáƒáƒ› სეტი áƒáƒ  უნდრდáƒáƒáƒ‘რუნáƒáƒ¡" + +#: commands/functioncmds.c:1788 +#, c-format +msgid "transform function must take one argument" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ფუნქციáƒáƒ› ერთი áƒáƒ áƒ’უმენტი უნდრმიიღáƒáƒ¡" + +#: commands/functioncmds.c:1792 +#, c-format +msgid "first argument of transform function must be type %s" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ ფუნქციის პირველი áƒáƒ áƒ’უმენტის ტიპი %s უნდრიყáƒáƒ¡" + +#: commands/functioncmds.c:1831 +#, c-format +msgid "data type %s is a pseudo-type" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრტიპი %s ფსევდრტიპიáƒ" + +#: commands/functioncmds.c:1837 +#, c-format +msgid "data type %s is a domain" +msgstr "მáƒáƒœáƒáƒªáƒ”მების ტიპი %s დáƒáƒ›áƒ”ნიáƒ" + +#: commands/functioncmds.c:1877 +#, c-format +msgid "return data type of FROM SQL function must be %s" +msgstr "\"FROM SQL\" ფუნქციის დáƒáƒ‘რუნებული მáƒáƒœáƒáƒªáƒ”მები áƒáƒ£áƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ უნდრიყáƒáƒ¡: %s" + +#: commands/functioncmds.c:1903 +#, c-format +msgid "return data type of TO SQL function must be the transform data type" +msgstr "" + +#: commands/functioncmds.c:1930 +#, c-format +msgid "transform for type %s language \"%s\" already exists" +msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ ტიპისთვის %s ენრ\"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/functioncmds.c:2016 +#, c-format +msgid "transform for type %s language \"%s\" does not exist" +msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ ტიპისთვის %s ენრ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/functioncmds.c:2040 +#, c-format +msgid "function %s already exists in schema \"%s\"" +msgstr "ფუნქცირ(%s) სქემáƒáƒ¨áƒ˜ (%s) უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/functioncmds.c:2091 +#, c-format +msgid "no inline code specified" +msgstr "ჩáƒáƒ“გმული კáƒáƒ“ი მითითებული áƒáƒ áƒáƒ" + +#: commands/functioncmds.c:2137 +#, c-format +msgid "language \"%s\" does not support inline code execution" +msgstr "" + +#: commands/functioncmds.c:2232 +#, c-format +msgid "cannot pass more than %d argument to a procedure" +msgid_plural "cannot pass more than %d arguments to a procedure" +msgstr[0] "პრáƒáƒªáƒ”დურისთვის %d-ზე მეტი áƒáƒ áƒ’უმენტის გáƒáƒ“áƒáƒªáƒ”მრშეუძლებელიáƒ" +msgstr[1] "პრáƒáƒªáƒ”დურისთვის %d-ზე მეტი áƒáƒ áƒ’უმენტის გáƒáƒ“áƒáƒªáƒ”მრშეუძლებელიáƒ" + +#: commands/indexcmds.c:647 +#, c-format +msgid "must specify at least one column" +msgstr "უნდრმიეთითáƒáƒ¡ მინიმუმ ერთი სვეტი" + +#: commands/indexcmds.c:651 +#, c-format +msgid "cannot use more than %d columns in an index" +msgstr "ინდექსში %d სვეტზე მეტს ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/indexcmds.c:694 +#, c-format +msgid "cannot create index on relation \"%s\"" +msgstr "ურთიერთბáƒáƒ–ე \"%s\" ინდექსის შექმნრშეიძლებელიáƒ" + +#: commands/indexcmds.c:720 +#, c-format +msgid "cannot create index on partitioned table \"%s\" concurrently" +msgstr "ინდექსს დáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილზე %s პáƒáƒ áƒáƒšáƒ”ლურáƒáƒ“ ვერ შექმნით" + +#: commands/indexcmds.c:730 +#, c-format +msgid "cannot create indexes on temporary tables of other sessions" +msgstr "სხვრსესიების დრáƒáƒ”ბითი ცხრილებზე ინდექსების შექმნრშეუძლებელიáƒ" + +#: commands/indexcmds.c:768 commands/tablecmds.c:806 commands/tablespace.c:1178 +#, c-format +msgid "cannot specify default tablespace for partitioned relations" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ურთიერთáƒáƒ‘ებისთვის ნáƒáƒ’ულისხმევი ცხრილის სივრცეების მითითებრშეუძლებელიáƒ" + +#: commands/indexcmds.c:800 commands/tablecmds.c:837 commands/tablecmds.c:3564 +#, c-format +msgid "only shared relations can be placed in pg_global tablespace" +msgstr "pg_global ცხრილის სივრცეში მხáƒáƒšáƒáƒ“ გáƒáƒ–იáƒáƒ áƒ”ბული ურთიერთáƒáƒ‘ების მáƒáƒ—áƒáƒ•სებრშეგიძლიáƒáƒ—" + +#: commands/indexcmds.c:833 +#, c-format +msgid "substituting access method \"gist\" for obsolete method \"rtree\"" +msgstr "მáƒáƒ«áƒ•ელებული მეთáƒáƒ“ი \"rtree\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ით \"gist\" ჩáƒáƒœáƒáƒªáƒ•ლდებáƒ" + +#: commands/indexcmds.c:854 +#, c-format +msgid "access method \"%s\" does not support unique indexes" +msgstr "სწვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ს (%s) უნიკáƒáƒšáƒ£áƒ áƒ˜ ინდექსების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/indexcmds.c:859 +#, c-format +msgid "access method \"%s\" does not support included columns" +msgstr "სწვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ს (%s) ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ სვეტების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/indexcmds.c:864 +#, c-format +msgid "access method \"%s\" does not support multicolumn indexes" +msgstr "სწვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ს (%s) მრáƒáƒ•áƒáƒšáƒ¡áƒ•ეტიáƒáƒœáƒ˜ ინდექსების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/indexcmds.c:869 +#, c-format +msgid "access method \"%s\" does not support exclusion constraints" +msgstr "სწვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ს (%s) გáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒ•ის შეზღუდვების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/indexcmds.c:998 +#, c-format +msgid "cannot match partition key to an index using access method \"%s\"" +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ით \"%s\" დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბის ინდექსთáƒáƒœ დáƒáƒ›áƒ—ხვევრშეუძლებელიáƒ" + +#: commands/indexcmds.c:1008 +#, c-format +msgid "unsupported %s constraint with partition key definition" +msgstr "მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი %s შეზღუდვრდáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბის áƒáƒ¦áƒ¬áƒ”რით" + +#: commands/indexcmds.c:1010 +#, c-format +msgid "%s constraints cannot be used when partition keys include expressions." +msgstr "" + +#: commands/indexcmds.c:1060 +#, c-format +msgid "cannot match partition key to index on column \"%s\" using non-equal operator \"%s\"" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბის დáƒáƒ›áƒ—ხვევრსვეტზე \"%s\" მდებáƒáƒ áƒ” ინდექსთáƒáƒœ უტáƒáƒšáƒáƒ‘ის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ— \"%s\" შეუძლებელიáƒ" + +#: commands/indexcmds.c:1076 +#, c-format +msgid "unique constraint on partitioned table must include all partitioning columns" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილზე áƒáƒ áƒ¡áƒ”ბული უნიკáƒáƒšáƒ£áƒ áƒ˜ შეზღუდვრყველრდáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ სვეტს უნდრშეიცáƒáƒ•დეს" + +#: commands/indexcmds.c:1077 +#, c-format +msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." +msgstr "" + +#: commands/indexcmds.c:1096 commands/indexcmds.c:1115 +#, c-format +msgid "index creation on system columns is not supported" +msgstr "სისტემური სვეტებზე ინდექსების შექმნრმხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: commands/indexcmds.c:1344 tcop/utility.c:1515 +#, c-format +msgid "cannot create unique index on partitioned table \"%s\"" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილზე (%s) უნიკáƒáƒšáƒ£áƒ áƒ˜ ინდექსის შექმნრშეუძლებელიáƒ" + +#: commands/indexcmds.c:1346 tcop/utility.c:1517 +#, c-format +msgid "Table \"%s\" contains partitions that are foreign tables." +msgstr "ცხრილი (%s) შეიცáƒáƒ•ს დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბს, რáƒáƒ›áƒšáƒ”ბც გáƒáƒ áƒ” ცხრილებიáƒ." + +#: commands/indexcmds.c:1831 +#, c-format +msgid "functions in index predicate must be marked IMMUTABLE" +msgstr "ფუნქციები ინდექსის პრედიკáƒáƒ¢áƒ¨áƒ˜ მáƒáƒœáƒ˜áƒ¨áƒœáƒ”თ, რáƒáƒ’áƒáƒ áƒª IMMUTABLE" + +#: commands/indexcmds.c:1910 parser/parse_utilcmd.c:2494 parser/parse_utilcmd.c:2629 +#, c-format +msgid "column \"%s\" named in key does not exist" +msgstr "გáƒáƒ¡áƒáƒ¦áƒ”ბში დáƒáƒ¡áƒáƒ®áƒ”ლებული სვეტი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: commands/indexcmds.c:1934 parser/parse_utilcmd.c:1782 +#, c-format +msgid "expressions are not supported in included columns" +msgstr "ჩáƒáƒ¡áƒ›áƒ£áƒš სვეტებში გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბები მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/indexcmds.c:1975 +#, c-format +msgid "functions in index expression must be marked IMMUTABLE" +msgstr "ფუნქციები ინდექსის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨áƒ˜ მáƒáƒœáƒ˜áƒ¨áƒœáƒ”თ, რáƒáƒ’áƒáƒ áƒª IMMUTABLE" + +#: commands/indexcmds.c:1990 +#, c-format +msgid "including column does not support a collation" +msgstr "ჩáƒáƒ¡áƒ›áƒ£áƒš სვეტს კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/indexcmds.c:1994 +#, c-format +msgid "including column does not support an operator class" +msgstr "ჩáƒáƒ¡áƒ›áƒ£áƒš სვეტს áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/indexcmds.c:1998 +#, c-format +msgid "including column does not support ASC/DESC options" +msgstr "ჩáƒáƒ¡áƒ›áƒ£áƒš სვეტს ASC/DESC პáƒáƒ áƒáƒ›áƒ”ტრების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/indexcmds.c:2002 +#, c-format +msgid "including column does not support NULLS FIRST/LAST options" +msgstr "ჩáƒáƒ¡áƒ›áƒ£áƒš სვეტს NULLS FIRST/LAST მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/indexcmds.c:2044 +#, c-format +msgid "could not determine which collation to use for index expression" +msgstr "ინდექსის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბისთვის გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებელი კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒªáƒœáƒáƒ‘რშეუძლებელიáƒ" + +#: commands/indexcmds.c:2052 commands/tablecmds.c:18078 commands/typecmds.c:811 parser/parse_expr.c:2785 parser/parse_type.c:568 parser/parse_utilcmd.c:3918 utils/adt/misc.c:630 +#, c-format +msgid "collations are not supported by type %s" +msgstr "ტიპს \"%s\" კáƒáƒšáƒáƒªáƒ˜áƒ”ბის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/indexcmds.c:2117 +#, c-format +msgid "operator %s is not commutative" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ %s áƒáƒ áƒáƒ™áƒáƒ›áƒ£áƒ¢áƒáƒªáƒ˜áƒ£áƒ áƒ˜áƒ" + +#: commands/indexcmds.c:2119 +#, c-format +msgid "Only commutative operators can be used in exclusion constraints." +msgstr "გáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒ•ის შეზღუდვებში მხáƒáƒšáƒáƒ“ კáƒáƒ›áƒ£áƒ¢áƒáƒªáƒ˜áƒ£áƒ áƒ˜ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრშეგიძლიáƒáƒ—." + +#: commands/indexcmds.c:2145 +#, c-format +msgid "operator %s is not a member of operator family \"%s\"" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ (%s) áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜áƒ¡ (%s) წევრი áƒáƒ áƒáƒ" + +#: commands/indexcmds.c:2148 +#, c-format +msgid "The exclusion operator must be related to the index operator class for the constraint." +msgstr "" + +#: commands/indexcmds.c:2183 +#, c-format +msgid "access method \"%s\" does not support ASC/DESC options" +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ს \"%s\" ASC/DESC პáƒáƒ áƒáƒ›áƒ”ტრების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/indexcmds.c:2188 +#, c-format +msgid "access method \"%s\" does not support NULLS FIRST/LAST options" +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ს \"%s\" 'NULLS FIRST/LAST' პáƒáƒ áƒáƒ›áƒ”ტრების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/indexcmds.c:2232 commands/tablecmds.c:18103 commands/tablecmds.c:18109 commands/typecmds.c:2311 +#, c-format +msgid "data type %s has no default operator class for access method \"%s\"" +msgstr "მáƒáƒœáƒáƒªáƒ”მის ტიპს %s წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის \"%s\" ნáƒáƒ’ულისხმევი áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/indexcmds.c:2234 +#, c-format +msgid "You must specify an operator class for the index or define a default operator class for the data type." +msgstr "áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირმიუთითáƒáƒ— áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜ ინდექსისთვის áƒáƒœ áƒáƒ¦áƒ¬áƒ”რáƒáƒ— ნáƒáƒ’ულისხმევი áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜ მáƒáƒœáƒáƒªáƒ”მის ტიპისთვის." + +#: commands/indexcmds.c:2263 commands/indexcmds.c:2271 commands/opclasscmds.c:204 +#, c-format +msgid "operator class \"%s\" does not exist for access method \"%s\"" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜ \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/indexcmds.c:2285 commands/typecmds.c:2299 +#, c-format +msgid "operator class \"%s\" does not accept data type %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜ \"%s\" მáƒáƒœáƒáƒªáƒ”მების ტიპს %s áƒáƒ  იღებს" + +#: commands/indexcmds.c:2375 +#, c-format +msgid "there are multiple default operator classes for data type %s" +msgstr "მáƒáƒœáƒáƒªáƒ”მის ტიპისთვის %s ერთზე მეტი ნáƒáƒ’ულისხმევი áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/indexcmds.c:2703 +#, c-format +msgid "unrecognized REINDEX option \"%s\"" +msgstr "\"REINDEX\"-ის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\"" + +#: commands/indexcmds.c:2935 +#, c-format +msgid "table \"%s\" has no indexes that can be reindexed concurrently" +msgstr "ცხრილს \"%s\" áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ ინდექსები, რáƒáƒ›áƒšáƒ”ბის პáƒáƒ áƒáƒšáƒ”ლური რეინდექსიც შესáƒáƒ«áƒšáƒ”ბელიáƒ" + +#: commands/indexcmds.c:2949 +#, c-format +msgid "table \"%s\" has no indexes to reindex" +msgstr "ცხრილს \"%s\" რეინდექსისთვის ცხრილები áƒáƒ  áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/indexcmds.c:2996 commands/indexcmds.c:3507 commands/indexcmds.c:3637 +#, c-format +msgid "cannot reindex system catalogs concurrently" +msgstr "სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ" + +#: commands/indexcmds.c:3020 +#, c-format +msgid "can only reindex the currently open database" +msgstr "შესáƒáƒ«áƒšáƒ”ბელირმხáƒáƒšáƒáƒ“ áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ ღირბáƒáƒ–ის რეინდექსი" + +#: commands/indexcmds.c:3112 +#, c-format +msgid "cannot reindex system catalogs concurrently, skipping all" +msgstr "სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ. ყველáƒáƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/indexcmds.c:3145 +#, c-format +msgid "cannot move system relations, skipping all" +msgstr "სისტემური დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბის გáƒáƒ“áƒáƒáƒ“გილებრშეუძლებელიáƒ. ყველáƒáƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/indexcmds.c:3191 +#, c-format +msgid "while reindexing partitioned table \"%s.%s\"" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილის რეინდექსისáƒáƒ¡: \"%s.%s\"" + +#: commands/indexcmds.c:3194 +#, c-format +msgid "while reindexing partitioned index \"%s.%s\"" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ინდექსის რეინდექსისáƒáƒ¡: \"%s.%s\"" + +#: commands/indexcmds.c:3387 commands/indexcmds.c:4255 +#, c-format +msgid "table \"%s.%s\" was reindexed" +msgstr "\"%s.%s\"-ის რეინდექსი დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ" + +#: commands/indexcmds.c:3539 commands/indexcmds.c:3592 +#, c-format +msgid "skipping reindex of invalid index \"%s.%s\"" +msgstr "რეინდექსის გáƒáƒ›áƒáƒ¢áƒáƒ•ებრáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ინდექსისთვის \"%s.%s\"" + +#: commands/indexcmds.c:3542 commands/indexcmds.c:3595 +#, c-format +msgid "Use DROP INDEX or REINDEX INDEX." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ DROP INDEX áƒáƒœ REINDEX INDEX." + +#: commands/indexcmds.c:3546 +#, c-format +msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" +msgstr "გáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒ•ის შეზღუდვის ინდექსის \"%s.%s\" პáƒáƒ áƒáƒšáƒ”ლური რეინდექსი შეუძლებელიáƒ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/indexcmds.c:3702 +#, c-format +msgid "cannot reindex this type of relation concurrently" +msgstr "áƒáƒ› ტიპის ურთიერთáƒáƒ‘ის პáƒáƒ áƒáƒšáƒ”ლური რეინდექსი შეუძლებელიáƒ" + +#: commands/indexcmds.c:3720 +#, c-format +msgid "cannot move non-shared relation to tablespace \"%s\"" +msgstr "áƒáƒ áƒáƒ’áƒáƒ–იáƒáƒ áƒ”ბული ურთიერთáƒáƒ‘ის ცხრილების სივრცეში \"%s\" გáƒáƒ“áƒáƒ¢áƒáƒœáƒ შეუძლებელიáƒ" + +#: commands/indexcmds.c:4236 commands/indexcmds.c:4248 +#, c-format +msgid "index \"%s.%s\" was reindexed" +msgstr "\"%s.%s\"-ის რეინდექსი დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ" + +#: commands/indexcmds.c:4238 commands/indexcmds.c:4257 +#, c-format +msgid "%s." +msgstr "%s." + +#: commands/lockcmds.c:91 +#, c-format +msgid "cannot lock relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘ის დáƒáƒ‘ლáƒáƒ™áƒ•რ(\"%s\") შეუძლებელიáƒ" + +#: commands/matview.c:190 +#, c-format +msgid "CONCURRENTLY cannot be used when the materialized view is not populated" +msgstr "CONCURRENTLY-ის გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ, რáƒáƒªáƒ მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედი შევსებული áƒáƒ áƒáƒ" + +#: commands/matview.c:196 gram.y:18967 +#, c-format +msgid "%s and %s options cannot be used together" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები %s დრ%s შეუთáƒáƒ•სებლებიáƒ" + +#: commands/matview.c:253 +#, c-format +msgid "cannot refresh materialized view \"%s\" concurrently" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედის (%s) პáƒáƒ áƒáƒšáƒ”ლური გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელიáƒ" + +#: commands/matview.c:256 +#, c-format +msgid "Create a unique index with no WHERE clause on one or more columns of the materialized view." +msgstr "" + +#: commands/matview.c:650 +#, c-format +msgid "new data for materialized view \"%s\" contains duplicate rows without any null columns" +msgstr "áƒáƒ®áƒáƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მები მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებულ ხედისთვის \"%s\" დუბლირებულ მწკრივებს შეიცáƒáƒ•ს, ნულáƒáƒ•áƒáƒœáƒ˜ მწკრივების გáƒáƒ áƒ”შე" + +#: commands/matview.c:652 +#, c-format +msgid "Row: %s" +msgstr "მწკრივი: %s" + +#: commands/opclasscmds.c:123 +#, c-format +msgid "operator family \"%s\" does not exist for access method \"%s\"" +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის (%2$s) áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ (%1$s) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/opclasscmds.c:266 +#, c-format +msgid "operator family \"%s\" for access method \"%s\" already exists" +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის (%2$s) áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ (%1$s) უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/opclasscmds.c:415 +#, c-format +msgid "must be superuser to create an operator class" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡ შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებებრსáƒáƒ­áƒ˜áƒ áƒ" + +#: commands/opclasscmds.c:492 commands/opclasscmds.c:909 commands/opclasscmds.c:1055 +#, c-format +msgid "invalid operator number %d, must be between 1 and %d" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი: %d. უნდრიყáƒáƒ¡ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¨áƒ˜ 1..%d" + +#: commands/opclasscmds.c:537 commands/opclasscmds.c:959 commands/opclasscmds.c:1071 +#, c-format +msgid "invalid function number %d, must be between 1 and %d" +msgstr "ფუნქციის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი: %d. უნდრიყáƒáƒ¡ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¨áƒ˜ 1..%d" + +#: commands/opclasscmds.c:566 +#, c-format +msgid "storage type specified more than once" +msgstr "სáƒáƒªáƒáƒ•ის ტიპი ერთზე მეტჯერáƒáƒ მითითებული" + +#: commands/opclasscmds.c:593 +#, c-format +msgid "storage type cannot be different from data type for access method \"%s\"" +msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის \"%s\" სáƒáƒªáƒáƒ•ის ტიპი áƒáƒ  შეიძლებáƒ, მáƒáƒœáƒáƒªáƒ”მის ტიპისგáƒáƒœ გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•დებáƒáƒ“ეს" + +#: commands/opclasscmds.c:609 +#, c-format +msgid "operator class \"%s\" for access method \"%s\" already exists" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜ \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/opclasscmds.c:637 +#, c-format +msgid "could not make operator class \"%s\" be default for type %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡ \"%s\" ტიპისთვის %s ნáƒáƒ’ულისხმევáƒáƒ“ დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: commands/opclasscmds.c:640 +#, c-format +msgid "Operator class \"%s\" already is the default." +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜ \"%s\" უკვე ნáƒáƒ’ულისხმევიáƒ." + +#: commands/opclasscmds.c:800 +#, c-format +msgid "must be superuser to create an operator family" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜áƒ¡ შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებები" + +#: commands/opclasscmds.c:860 +#, c-format +msgid "must be superuser to alter an operator family" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜áƒ¡ შესáƒáƒªáƒ•ლელáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებები" + +#: commands/opclasscmds.c:918 +#, c-format +msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" +msgstr "'ALTER OPERATOR FAMILY'-ში áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒ’უმენის ტიპების მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/opclasscmds.c:993 +#, c-format +msgid "STORAGE cannot be specified in ALTER OPERATOR FAMILY" +msgstr "ALTER OPERATOR FAMILY-ში STORAGE-ს ვერ მიუთითებთ" + +#: commands/opclasscmds.c:1127 +#, c-format +msgid "one or two argument types must be specified" +msgstr "უნდრიყáƒáƒ¡ მითითებული ერთი áƒáƒœ áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტის ტიპი" + +#: commands/opclasscmds.c:1153 +#, c-format +msgid "index operators must be binary" +msgstr "ინდექსის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბი ბინáƒáƒ áƒ£áƒšáƒ˜ უნდრიყáƒáƒ¡" + +#: commands/opclasscmds.c:1172 +#, c-format +msgid "access method \"%s\" does not support ordering operators" +msgstr "სწვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ს (%s) áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის დáƒáƒšáƒáƒ’ების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/opclasscmds.c:1183 +#, c-format +msgid "index search operators must return boolean" +msgstr "ინდექსის ძებნის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბმრლáƒáƒ’იკური მნიშვნელáƒáƒ‘რუნდრდáƒáƒáƒ‘რუნáƒáƒœ" + +#: commands/opclasscmds.c:1223 +#, c-format +msgid "associated data types for operator class options parsing functions must match opclass input type" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების ფუნქციებისთვის áƒáƒ¡áƒáƒªáƒ˜áƒ áƒ”ბული მáƒáƒœáƒáƒªáƒ”მის ტიპები opclass-ის შეყვáƒáƒœáƒ˜áƒ¡ ტიპებს უნდრემთხვეáƒáƒ“ეს" + +#: commands/opclasscmds.c:1230 +#, c-format +msgid "left and right associated data types for operator class options parsing functions must match" +msgstr "" + +#: commands/opclasscmds.c:1238 +#, c-format +msgid "invalid operator class options parsing function" +msgstr "კლáƒáƒ¡áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების ფუნქციის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜" + +#: commands/opclasscmds.c:1239 +#, c-format +msgid "Valid signature of operator class options parsing function is %s." +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი ფუნქციის სწáƒáƒ áƒ˜ სიგნáƒáƒ¢áƒ£áƒ áƒáƒ %s." + +#: commands/opclasscmds.c:1258 +#, c-format +msgid "btree comparison functions must have two arguments" +msgstr "áƒáƒ áƒáƒ‘ითი ხის შედáƒáƒ áƒ”ბით ფუნქციებს áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი უნდრჰქáƒáƒœáƒ“ეთ" + +#: commands/opclasscmds.c:1262 +#, c-format +msgid "btree comparison functions must return integer" +msgstr "áƒáƒ áƒáƒ‘ითი ხის შედáƒáƒ áƒ”ბით ფუნქციებმრáƒáƒ áƒ˜ მთელი რიცხვი უნდრდáƒáƒáƒ‘რუნáƒáƒ¡" + +#: commands/opclasscmds.c:1279 +#, c-format +msgid "btree sort support functions must accept type \"internal\"" +msgstr "áƒáƒ áƒáƒ‘ითი ხის დáƒáƒšáƒáƒ’ების ფუნქციები უნდრიღებდნენ ტიპს \"internal\"" + +#: commands/opclasscmds.c:1283 +#, c-format +msgid "btree sort support functions must return void" +msgstr "áƒáƒ áƒáƒ‘ითი ხის დáƒáƒšáƒáƒ’ების ფუნქციებმრáƒáƒ áƒáƒ¤áƒ”რი უნდრდáƒáƒáƒ‘რუნáƒáƒœ" + +#: commands/opclasscmds.c:1294 +#, c-format +msgid "btree in_range functions must have five arguments" +msgstr "btree in_range ფუნქციებს 5 áƒáƒ áƒ’უმენტი უნდრჰქáƒáƒœáƒ“ეთ" + +#: commands/opclasscmds.c:1298 +#, c-format +msgid "btree in_range functions must return boolean" +msgstr "áƒáƒ áƒáƒ‘ითი ხის in_range ფუნქციები ლáƒáƒ’იკურ მნიშვნელáƒáƒ‘ებს უნდრáƒáƒ‘რუნებდნენ" + +#: commands/opclasscmds.c:1314 +#, c-format +msgid "btree equal image functions must have one argument" +msgstr "áƒáƒ áƒáƒ‘ითი ტáƒáƒšáƒáƒ‘ის áƒáƒ¡áƒšáƒ˜áƒ¡ ფუნქციებს ერთი áƒáƒ áƒ’უმენტი უნდრჰქáƒáƒœáƒ“ეთ" + +#: commands/opclasscmds.c:1318 +#, c-format +msgid "btree equal image functions must return boolean" +msgstr "áƒáƒ áƒáƒ‘ითი ტáƒáƒšáƒáƒ‘ის áƒáƒ¡áƒšáƒ˜áƒ¡ ფუნქციებმრლáƒáƒ’იკური მნიშვნელáƒáƒ‘რუნდრდáƒáƒáƒ‘რუნáƒáƒœ" + +#: commands/opclasscmds.c:1331 +#, c-format +msgid "btree equal image functions must not be cross-type" +msgstr "áƒáƒ áƒáƒ‘ითი ტáƒáƒšáƒáƒ‘ის áƒáƒ¡áƒšáƒ˜áƒ¡ ფუნქციები ჯვáƒáƒ áƒ”დინი ტიპის áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/opclasscmds.c:1341 +#, c-format +msgid "hash function 1 must have one argument" +msgstr "ჰეშის ფუნქცირ1-ს ერთი áƒáƒ áƒ’უმენტი უნდრჰქáƒáƒœáƒ“ეს" + +#: commands/opclasscmds.c:1345 +#, c-format +msgid "hash function 1 must return integer" +msgstr "ჰეშის ფუნქცირ1-მრმთელი რიცხვი უნდრდáƒáƒáƒ‘რუნáƒáƒ¡" + +#: commands/opclasscmds.c:1352 +#, c-format +msgid "hash function 2 must have two arguments" +msgstr "ჰეშის ფუნქცირ2-ს áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი უნდრჰქáƒáƒœáƒ“ეს" + +#: commands/opclasscmds.c:1356 +#, c-format +msgid "hash function 2 must return bigint" +msgstr "ჰეშის ფუნქცირ2-მრbigint უნდრდáƒáƒáƒ‘რინáƒáƒ¡" + +#: commands/opclasscmds.c:1381 +#, c-format +msgid "associated data types must be specified for index support function" +msgstr "ინდექსის მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფუნქციისთვის áƒáƒ¡áƒáƒªáƒ˜áƒ áƒ”ბული მáƒáƒœáƒáƒªáƒ”მის ტიპების მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/opclasscmds.c:1406 +#, c-format +msgid "function number %d for (%s,%s) appears more than once" +msgstr "ფუნქციის ნáƒáƒ›áƒ”რი %d (%s,%s)-სთვის ერთზე მეტჯერ ჩნდებáƒ" + +#: commands/opclasscmds.c:1413 +#, c-format +msgid "operator number %d for (%s,%s) appears more than once" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ნáƒáƒ›áƒ”რი %d (%s,%s)-სთვის ერთზე მეტჯერ ჩნდებáƒ" + +#: commands/opclasscmds.c:1459 +#, c-format +msgid "operator %d(%s,%s) already exists in operator family \"%s\"" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ %d(%s,%s) áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ¨áƒ˜ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/opclasscmds.c:1565 +#, c-format +msgid "function %d(%s,%s) already exists in operator family \"%s\"" +msgstr "ფუნქცირ%d(%s,%s) áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ¨áƒ˜ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/opclasscmds.c:1646 +#, c-format +msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ %d(%s,%s) áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ¨áƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/opclasscmds.c:1686 +#, c-format +msgid "function %d(%s,%s) does not exist in operator family \"%s\"" +msgstr "ფუნქცირ%d(%s,%s) áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ¨áƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/opclasscmds.c:1717 +#, c-format +msgid "operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜ \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის \"%s\" სქემáƒáƒ¨áƒ˜ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/opclasscmds.c:1740 +#, c-format +msgid "operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის \"%s\" სქემáƒáƒ¨áƒ˜ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/operatorcmds.c:113 commands/operatorcmds.c:121 +#, c-format +msgid "SETOF type not allowed for operator argument" +msgstr "ტიპის \"SETOF\" áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒ’უმენტáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/operatorcmds.c:154 commands/operatorcmds.c:554 +#, c-format +msgid "operator attribute \"%s\" not recognized" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¢áƒ áƒ˜áƒ‘უტი უცნáƒáƒ‘იáƒ: \"%s\"" + +#: commands/operatorcmds.c:165 +#, c-format +msgid "operator function must be specified" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ფუნქციის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/operatorcmds.c:183 +#, c-format +msgid "operator argument types must be specified" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒ’უმენტის ტიპების მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/operatorcmds.c:187 +#, c-format +msgid "operator right argument type must be specified" +msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მáƒáƒ áƒ¯áƒ•ენრáƒáƒ áƒ’უმენტის ტიპის მითითებáƒ" + +#: commands/operatorcmds.c:188 +#, c-format +msgid "Postfix operators are not supported." +msgstr "პáƒáƒ¡áƒ¢áƒ¤áƒ˜áƒ¥áƒ¡áƒ£áƒ áƒ˜ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბი მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ." + +#: commands/operatorcmds.c:292 +#, c-format +msgid "restriction estimator function %s must return type %s" +msgstr "" + +#: commands/operatorcmds.c:335 +#, c-format +msgid "join estimator function %s has multiple matches" +msgstr "შეერთების შემფáƒáƒ¡áƒ”ბელ ფუნქციáƒáƒ¡ %s ერთზე მეტი დáƒáƒ›áƒ—ხვევრგáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/operatorcmds.c:350 +#, c-format +msgid "join estimator function %s must return type %s" +msgstr "შეერთების შემფáƒáƒ¡áƒ”ბელ ფუნქცირ%s ტიპს %s უნდრáƒáƒ‘რუნებდეს" + +#: commands/operatorcmds.c:388 parser/parse_oper.c:119 parser/parse_oper.c:637 utils/adt/regproc.c:509 utils/adt/regproc.c:683 +#, c-format +msgid "operator does not exist: %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: commands/operatorcmds.c:396 parser/parse_oper.c:702 parser/parse_oper.c:815 +#, c-format +msgid "operator is only a shell: %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ მხáƒáƒšáƒáƒ“ გáƒáƒ áƒ¡áƒ˜áƒ: %s" + +#: commands/operatorcmds.c:548 +#, c-format +msgid "operator attribute \"%s\" cannot be changed" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¢áƒ áƒ˜áƒ‘უტის შეცვლრშეუძლებელიáƒ: %s" + +#: commands/operatorcmds.c:615 commands/operatorcmds.c:622 commands/operatorcmds.c:628 commands/operatorcmds.c:634 +#, c-format +msgid "operator attribute \"%s\" cannot be changed if it has already been set" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¢áƒ áƒ˜áƒ‘უტს \"%s\", თუ ის უკვე დáƒáƒ§áƒ”ნებულიáƒ, ვერ შეცვლით" + +#: commands/policy.c:86 commands/policy.c:379 commands/statscmds.c:146 commands/tablecmds.c:1728 commands/tablecmds.c:2328 commands/tablecmds.c:3675 commands/tablecmds.c:6613 commands/tablecmds.c:9645 commands/tablecmds.c:17665 commands/tablecmds.c:17700 commands/trigger.c:316 commands/trigger.c:1332 commands/trigger.c:1442 rewrite/rewriteDefine.c:268 rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 +#, c-format +msgid "permission denied: \"%s\" is a system catalog" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ: '%s\" სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’იáƒ" + +#: commands/policy.c:169 +#, c-format +msgid "ignoring specified roles other than PUBLIC" +msgstr "'PUBLIC'-ის გáƒáƒ áƒ“რყველრმითითებული რáƒáƒšáƒ˜ გáƒáƒ›áƒáƒ¢áƒáƒ•ებული იქნებáƒ" + +#: commands/policy.c:170 +#, c-format +msgid "All roles are members of the PUBLIC role." +msgstr "ყველრრáƒáƒšáƒ˜ PUBLIC რáƒáƒšáƒ˜áƒ¡ წევრიáƒ." + +#: commands/policy.c:603 +#, c-format +msgid "WITH CHECK cannot be applied to SELECT or DELETE" +msgstr "SELECT-ზე დრDELETE-ზე WITH CHECK-ის გáƒáƒ“áƒáƒ¢áƒáƒ áƒ”ბრშეუძლებელიáƒ" + +#: commands/policy.c:612 commands/policy.c:915 +#, c-format +msgid "only WITH CHECK expression allowed for INSERT" +msgstr "\"INSERT\"-სთვის მხáƒáƒšáƒáƒ“ WITH CHECK გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ დáƒáƒ¨áƒ•ებული" + +#: commands/policy.c:686 commands/policy.c:1138 +#, c-format +msgid "policy \"%s\" for table \"%s\" already exists" +msgstr "წესი \"%s\" ცხრილისთვის \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/policy.c:887 commands/policy.c:1166 commands/policy.c:1237 +#, c-format +msgid "policy \"%s\" for table \"%s\" does not exist" +msgstr "წესი \"%s\" ცხრილისთვის \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/policy.c:905 +#, c-format +msgid "only USING expression allowed for SELECT, DELETE" +msgstr "\"SELECT\" დრDELETE-სთვის მხáƒáƒšáƒáƒ“ USING გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ ნებáƒáƒ“áƒáƒ áƒ—ული" + +#: commands/portalcmds.c:60 commands/portalcmds.c:181 commands/portalcmds.c:232 +#, c-format +msgid "invalid cursor name: must not be empty" +msgstr "კურსáƒáƒ áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი. ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/portalcmds.c:72 +#, c-format +msgid "cannot create a cursor WITH HOLD within security-restricted operation" +msgstr "უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბáƒáƒ–ე-შეზღუდული áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ შიგნით კურსáƒáƒ áƒ¡ WITH HOLD ვერ შექმნით" + +#: commands/portalcmds.c:189 commands/portalcmds.c:242 executor/execCurrent.c:70 utils/adt/xml.c:2873 utils/adt/xml.c:3043 +#, c-format +msgid "cursor \"%s\" does not exist" +msgstr "კურსáƒáƒ áƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/prepare.c:72 +#, c-format +msgid "invalid statement name: must not be empty" +msgstr "áƒáƒ”პრáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/prepare.c:227 commands/prepare.c:232 +#, c-format +msgid "prepared statement is not a SELECT" +msgstr "მáƒáƒ›áƒ–áƒáƒ“ებული áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ SELECT áƒáƒ áƒáƒ" + +#: commands/prepare.c:292 +#, c-format +msgid "wrong number of parameters for prepared statement \"%s\"" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘რმáƒáƒ›áƒ–áƒáƒ“ებული გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბისთვის \"%s\"" + +#: commands/prepare.c:294 +#, c-format +msgid "Expected %d parameters but got %d." +msgstr "მáƒáƒ¡áƒáƒšáƒáƒ“ნელი %d პáƒáƒ áƒáƒ›áƒ”ტრის მáƒáƒ’იერ მივიღე %d." + +#: commands/prepare.c:327 +#, c-format +msgid "parameter $%d of type %s cannot be coerced to the expected type %s" +msgstr "" + +#: commands/prepare.c:411 +#, c-format +msgid "prepared statement \"%s\" already exists" +msgstr "მáƒáƒ›áƒ–áƒáƒ“ებული áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/prepare.c:450 +#, c-format +msgid "prepared statement \"%s\" does not exist" +msgstr "მáƒáƒ›áƒ–áƒáƒ“ებული áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/proclang.c:66 +#, c-format +msgid "must be superuser to create custom procedural language" +msgstr "პრáƒáƒªáƒ”დურული ენის ხელით მისáƒáƒ—ითებლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პრივილეგიებირსáƒáƒ­áƒ˜áƒ áƒ" + +#: commands/publicationcmds.c:124 postmaster/postmaster.c:1108 postmaster/postmaster.c:1210 utils/init/miscinit.c:1811 +#, c-format +msgid "invalid list syntax in parameter \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიის სინტáƒáƒ¥áƒ¡áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრში \"%s\"" + +#: commands/publicationcmds.c:143 +#, c-format +msgid "unrecognized value for publication option \"%s\": \"%s\"" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის (\"%s\") უცნáƒáƒ‘ი მნიშვნელáƒáƒ‘áƒ: \"%s\"" + +#: commands/publicationcmds.c:157 +#, c-format +msgid "unrecognized publication parameter: \"%s\"" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: commands/publicationcmds.c:198 +#, c-format +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "'CURRENT_SCHEMA'-სთვის სქემრáƒáƒ áƒ©áƒ”ული áƒáƒ áƒáƒ" + +#: commands/publicationcmds.c:495 +msgid "System columns are not allowed." +msgstr "სისტემური სვეტები დáƒáƒ£áƒ¨áƒ•ებელიáƒ." + +#: commands/publicationcmds.c:502 commands/publicationcmds.c:507 commands/publicationcmds.c:524 +msgid "User-defined operators are not allowed." +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილი áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბი დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ." + +#: commands/publicationcmds.c:548 +msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." +msgstr "დáƒáƒ¨áƒ•ებულირმხáƒáƒšáƒáƒ“ სვეტები, მუდმივები, ჩáƒáƒ¨áƒ”ნებული áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბი, ჩáƒáƒ¨áƒ”ნებული მáƒáƒœáƒáƒªáƒ”მის ტიპები, ჩáƒáƒ¨áƒ”ნებული კáƒáƒšáƒáƒªáƒ˜áƒ”ბი დრáƒáƒ áƒáƒ“áƒáƒ“უმებáƒáƒ“ი ჩáƒáƒ¨áƒ”ნებული ფუნქციები." + +#: commands/publicationcmds.c:560 +msgid "User-defined types are not allowed." +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ტიპები დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ." + +#: commands/publicationcmds.c:563 +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის-მიერ-áƒáƒ¦áƒ¬áƒ”რილი áƒáƒœ ჩáƒáƒ¨áƒ”ნებული დáƒáƒ“უმებáƒáƒ“ი ფუნქციები დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ." + +#: commands/publicationcmds.c:566 +msgid "User-defined collations are not allowed." +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული კáƒáƒšáƒáƒªáƒ˜áƒ”ბი დáƒáƒ£áƒ¨áƒ•ებელიáƒ." + +#: commands/publicationcmds.c:576 +#, c-format +msgid "invalid publication WHERE expression" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ WHERE გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ" + +#: commands/publicationcmds.c:629 +#, c-format +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘ისთვის \"%s\"გáƒáƒ›áƒáƒªáƒ”მის პირáƒáƒ‘áƒáƒ¡ WHERE ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/publicationcmds.c:631 +#, c-format +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილზე პირáƒáƒ‘ის WHERE გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ, რáƒáƒªáƒ %s ჭეშმáƒáƒ áƒ˜áƒ¢áƒ˜ áƒáƒ áƒáƒ." + +#: commands/publicationcmds.c:702 commands/publicationcmds.c:716 +#, c-format +msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" +msgstr "შეუძლებელირსვეტების სიის გáƒáƒ›áƒáƒ§áƒ”ნებრურთიერთáƒáƒ‘ისთვის \"%s.%s\" პუბლიკáƒáƒªáƒ˜áƒáƒ¨áƒ˜ \"%s\"" + +#: commands/publicationcmds.c:705 +#, c-format +msgid "Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements." +msgstr "გáƒáƒ›áƒáƒªáƒ”მებში რáƒáƒ›áƒšáƒ”ბიც ელემენტებს FOR TABLES IN SCHEMA შეიცáƒáƒ•ენ, სვეტების სიáƒáƒ¡ ვერ მიუთითებთ." + +#: commands/publicationcmds.c:719 +#, c-format +msgid "Column lists cannot be specified for partitioned tables when %s is false." +msgstr "სვეტების სირშეუძლებელირმიუთითáƒáƒ— დáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილს, რáƒáƒªáƒ %s false-áƒ." + +#: commands/publicationcmds.c:754 +#, c-format +msgid "must be superuser to create FOR ALL TABLES publication" +msgstr "'FOR ALL TABLES' პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ შექმნისთვის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებები áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/publicationcmds.c:825 +#, c-format +msgid "must be superuser to create FOR TABLES IN SCHEMA publication" +msgstr "\"FOR TABLES IN SCHEMA\" პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ" + +#: commands/publicationcmds.c:861 +#, c-format +msgid "\"wal_level\" is insufficient to publish logical changes" +msgstr "\"wal_level\" áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜áƒ ლáƒáƒ’იკური ცვლილებების გáƒáƒ›áƒáƒ¡áƒáƒ¥áƒ•ეყნებლáƒáƒ“" + +#: commands/publicationcmds.c:862 +#, c-format +msgid "Set \"wal_level\" to \"logical\" before creating subscriptions." +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რების შექმნáƒáƒ›áƒ“ე სáƒáƒ­áƒ˜áƒ áƒáƒ \"wal_level\" -ის \"logical\" (ლáƒáƒ’იკურზე) დáƒáƒ§áƒ”ნებáƒ." + +#: commands/publicationcmds.c:958 commands/publicationcmds.c:966 +#, c-format +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის (\"%s\") false-ზე დáƒáƒ§áƒ”ნებრპუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის \"%s\" შეუძლებელიáƒ" + +#: commands/publicationcmds.c:961 +#, c-format +msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "გáƒáƒ›áƒáƒªáƒ”მრშეიცáƒáƒ•ს პირáƒáƒ‘áƒáƒ¡ WHERE დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილისთვის \"%s\", რáƒáƒª, მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ \"%s\" ჭეშმáƒáƒ áƒ˜áƒ¢áƒ˜ áƒáƒ áƒ, დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ." + +#: commands/publicationcmds.c:969 +#, c-format +msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "გáƒáƒ›áƒáƒªáƒ”მრშეიცáƒáƒ•ს სვეტების სიáƒáƒ¡ დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილისთვის \"%s\", რáƒáƒª მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ \"%s\" ჭეშმáƒáƒ áƒ˜áƒ¢áƒ˜ áƒáƒ áƒáƒ, დáƒáƒ£áƒ¨áƒ•ებელიáƒ." + +#: commands/publicationcmds.c:1292 +#, c-format +msgid "cannot add schema to publication \"%s\"" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის (%s) სქემის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ" + +#: commands/publicationcmds.c:1294 +#, c-format +msgid "Schemas cannot be added if any tables that specify a column list are already part of the publication." +msgstr "სქემების დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ, თუ ნებისმიერი ცხრილი, რáƒáƒ›áƒ”ლიც შეიცáƒáƒ•ს სვეტების სიáƒáƒ¡, რáƒáƒ›áƒ”ლიც უკვე გáƒáƒ›áƒáƒªáƒ”მის ნáƒáƒ¬áƒ˜áƒšáƒ˜áƒ." + +#: commands/publicationcmds.c:1342 +#, c-format +msgid "must be superuser to add or set schemas" +msgstr "სქემის დáƒáƒ›áƒáƒ¢áƒ”ბის áƒáƒœ დáƒáƒ§áƒ”ნებისთვის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებებირსáƒáƒ­áƒ˜áƒ áƒ" + +#: commands/publicationcmds.c:1351 commands/publicationcmds.c:1359 +#, c-format +msgid "publication \"%s\" is defined as FOR ALL TABLES" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ %s áƒáƒ¦áƒ¬áƒ”რილიáƒ, რáƒáƒ’áƒáƒ áƒª FOR ALL TABLES" + +#: commands/publicationcmds.c:1353 +#, c-format +msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "სქემების FOR ALL TABLES გáƒáƒ›áƒáƒªáƒ”მებიდáƒáƒœ წáƒáƒ¨áƒšáƒ áƒáƒœ მáƒáƒ¡áƒ¨áƒ˜ ჩáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ." + +#: commands/publicationcmds.c:1361 +#, c-format +msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "FOR ALL TABLES გáƒáƒ›áƒáƒªáƒ”მებში ცხრილების ჩáƒáƒ›áƒáƒ¢áƒ”ბრáƒáƒœ მáƒáƒ—ი წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ." + +#: commands/publicationcmds.c:1385 commands/publicationcmds.c:1424 commands/publicationcmds.c:1961 utils/cache/lsyscache.c:3634 +#, c-format +msgid "publication \"%s\" does not exist" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/publicationcmds.c:1587 commands/publicationcmds.c:1650 +#, c-format +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ£áƒ áƒ˜ áƒáƒœ ზედმეტი WHERE პირáƒáƒ‘ები ცხრილისთვის \"%s\"" + +#: commands/publicationcmds.c:1594 commands/publicationcmds.c:1662 +#, c-format +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ£áƒ áƒ˜ áƒáƒœ ზედმეტი სვეტის სიები ცხრილისთვის \"%s\"" + +#: commands/publicationcmds.c:1796 +#, c-format +msgid "column list must not be specified in ALTER PUBLICATION ... DROP" +msgstr "column list must not be specified in ALTER PUBLICATION ... DROP" + +#: commands/publicationcmds.c:1808 +#, c-format +msgid "relation \"%s\" is not part of the publication" +msgstr "ურთიერთáƒáƒ‘რ(%s) პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ¬áƒ˜áƒšáƒ¡ áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: commands/publicationcmds.c:1815 +#, c-format +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "გáƒáƒ›áƒáƒªáƒ”მის ცხრილიდáƒáƒœ წáƒáƒ¨áƒšáƒ˜áƒ¡áƒáƒ¡ პირáƒáƒ‘áƒáƒ¡ WHERE ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/publicationcmds.c:1875 +#, c-format +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "ცხრილი სქემიდáƒáƒœ \"%s\" პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ¬áƒ˜áƒšáƒ¡ áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: commands/publicationcmds.c:1918 commands/publicationcmds.c:1925 +#, c-format +msgid "permission denied to change owner of publication \"%s\"" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ (%s) მფლáƒáƒ‘ელის შეცვლის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/publicationcmds.c:1920 +#, c-format +msgid "The owner of a FOR ALL TABLES publication must be a superuser." +msgstr "FOR ALL TABLES გáƒáƒ›áƒáƒªáƒ”მის მფლáƒáƒ‘ელი ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრიყáƒáƒ¡." + +#: commands/publicationcmds.c:1927 +#, c-format +msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." +msgstr "FOR TABLES IN SCHEMA პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ მფლáƒáƒ‘ელი ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრიყáƒáƒ¡." + +#: commands/publicationcmds.c:1993 +#, c-format +msgid "publication with OID %u does not exist" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/schemacmds.c:109 commands/schemacmds.c:289 +#, c-format +msgid "unacceptable schema name \"%s\"" +msgstr "სქემის დáƒáƒ£áƒ¨áƒ•ებელი სáƒáƒ®áƒ”ლი: \"%s\"" + +#: commands/schemacmds.c:110 commands/schemacmds.c:290 +#, c-format +msgid "The prefix \"pg_\" is reserved for system schemas." +msgstr "პრეფიქსი \"pg_\" დáƒáƒªáƒ£áƒšáƒ˜áƒ სისტემური სქემებისთვის." + +#: commands/schemacmds.c:134 +#, c-format +msgid "schema \"%s\" already exists, skipping" +msgstr "სქემრ(\"%s\") უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/seclabel.c:131 +#, c-format +msgid "no security label providers have been loaded" +msgstr "უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჭდის მáƒáƒ›áƒ¬áƒáƒ“ებლები áƒáƒ  ჩáƒáƒ¢áƒ•ირთულáƒ" + +#: commands/seclabel.c:135 +#, c-format +msgid "must specify provider when multiple security label providers have been loaded" +msgstr "რáƒáƒªáƒ ჩáƒáƒ¢áƒ•ირთულირერთზე მეტი უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჭდის მáƒáƒ›áƒ¬áƒáƒ“ებელი, მისი áƒáƒ¨áƒ™áƒáƒ áƒáƒ“ მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/seclabel.c:153 +#, c-format +msgid "security label provider \"%s\" is not loaded" +msgstr "უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჭდის მáƒáƒ›áƒ¬áƒáƒ“ებელი \"%s\" ჯერ ჩáƒáƒ¢áƒ•ირთული áƒáƒ áƒáƒáƒ" + +#: commands/seclabel.c:160 +#, c-format +msgid "security labels are not supported for this type of object" +msgstr "áƒáƒ› ტიპის áƒáƒ‘იექტისთვის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჭდეები მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/seclabel.c:193 +#, c-format +msgid "cannot set security label on relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘áƒáƒ–ე \"%s\" უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჭდის დáƒáƒ“ებრშეუძლებელიáƒ" + +#: commands/sequence.c:741 +#, c-format +msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" +msgstr "nextval: მიღწეულირმáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ მნიშვნელáƒáƒ‘რმიმდევრáƒáƒ‘ისთვის \"%s\" (%lld)" + +#: commands/sequence.c:760 +#, c-format +msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" +msgstr "nextval: მიღწეულირმინიმáƒáƒšáƒ£áƒ áƒ˜ მნიშვნელáƒáƒ‘რმიმდევრáƒáƒ‘ისთვის \"%s\" (%lld)" + +#: commands/sequence.c:879 +#, c-format +msgid "currval of sequence \"%s\" is not yet defined in this session" +msgstr "მიმდევრáƒáƒ‘ის \"%s\" მიმდინáƒáƒ áƒ” მნიშვნელáƒáƒ‘რáƒáƒ› სესიáƒáƒ¨áƒ˜ ჯერ áƒáƒ¦áƒ¬áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/sequence.c:898 commands/sequence.c:904 +#, c-format +msgid "lastval is not yet defined in this session" +msgstr "áƒáƒ› სესიáƒáƒ¨áƒ˜ lastval ჯერ áƒáƒ¦áƒ¬áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/sequence.c:984 +#, c-format +msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" +msgstr "setval: მნიშვნელáƒáƒ‘რ%lld სáƒáƒ–ღვრებს გáƒáƒ áƒ”თáƒáƒ მიმდევრáƒáƒ‘ისთვის \"%s\" (%lld..%lld)" + +#: commands/sequence.c:1347 +#, c-format +msgid "invalid sequence option SEQUENCE NAME" +msgstr "მიმდევრáƒáƒ‘ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი SEQUENCE NAME" + +#: commands/sequence.c:1373 +#, c-format +msgid "identity column type must be smallint, integer, or bigint" +msgstr "იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტის ტიპი smallint, integer áƒáƒœ bigint უნდრიყáƒáƒ¡" + +#: commands/sequence.c:1374 +#, c-format +msgid "sequence type must be smallint, integer, or bigint" +msgstr "მიმდევრáƒáƒ‘ის ტიპი smallint, integer áƒáƒœ bigint უნდრიყáƒáƒ¡" + +#: commands/sequence.c:1408 +#, c-format +msgid "INCREMENT must not be zero" +msgstr "INCREMENT ნული áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/sequence.c:1456 +#, c-format +msgid "MAXVALUE (%lld) is out of range for sequence data type %s" +msgstr "MAXVALUE (%lld) მიმდევრáƒáƒ‘ის მáƒáƒœáƒáƒªáƒ”მის ტიპის დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ %s" + +#: commands/sequence.c:1488 +#, c-format +msgid "MINVALUE (%lld) is out of range for sequence data type %s" +msgstr "MINVALUE (%lld) მიმდევრáƒáƒ‘ის მáƒáƒœáƒáƒªáƒ”მის ტიპის დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ %s" + +#: commands/sequence.c:1496 +#, c-format +msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" +msgstr "MINVALUE (%lld)-ი MAXVALUE (%lld)-ზე ნáƒáƒ™áƒšáƒ”ბი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/sequence.c:1517 +#, c-format +msgid "START value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "START -ის მნიშვნელáƒáƒ‘რ(%lld)-ი MINVALUE (%lld)-ზე ნáƒáƒ™áƒšáƒ”ბი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/sequence.c:1523 +#, c-format +msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "START -ის მნიშვნელáƒáƒ‘რ(%lld)-ი MAXVALUE (%lld)-ზე მეტი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/sequence.c:1547 +#, c-format +msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "RESTART -ის მნიშვნელáƒáƒ‘რ(%lld) MINVALUE (%lld)-ზე ნáƒáƒ™áƒšáƒ”ბი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/sequence.c:1553 +#, c-format +msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "RESTART -ის მნიშვნელáƒáƒ‘რ(%lld) MAXVALUE (%lld)-ზე დიდი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/sequence.c:1564 +#, c-format +msgid "CACHE (%lld) must be greater than zero" +msgstr "CACHE (%lld) ნულზე მეტი უნდრიყáƒáƒ¡" + +#: commands/sequence.c:1600 +#, c-format +msgid "invalid OWNED BY option" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი OWNED BY" + +#: commands/sequence.c:1601 +#, c-format +msgid "Specify OWNED BY table.column or OWNED BY NONE." +msgstr "მიუთითეთ OWNED BY ცხრილი.სვეტი áƒáƒœ OWNED BY NONE." + +#: commands/sequence.c:1626 +#, c-format +msgid "sequence cannot be owned by relation \"%s\"" +msgstr "მიმდევრáƒáƒ‘ის მფლáƒáƒ‘ელი ურთიერთáƒáƒ‘რ%s ვერ იქნებáƒ" + +#: commands/sequence.c:1634 +#, c-format +msgid "sequence must have same owner as table it is linked to" +msgstr "მიმდევრáƒáƒ‘áƒáƒ¡ იგივე მფლáƒáƒ‘ელი უნდრჰყáƒáƒ•დეს, რáƒáƒª ცხრილს, რáƒáƒ›áƒ”ლზედáƒáƒª ის მიბმულიáƒ" + +#: commands/sequence.c:1638 +#, c-format +msgid "sequence must be in same schema as table it is linked to" +msgstr "მიმდევრáƒáƒ‘áƒáƒ¡ იგივე სქემრუნდრჰქáƒáƒœáƒ“ეს, რáƒáƒª ცხრილს, რáƒáƒ›áƒ”ლზედáƒáƒª ის მიბმულიáƒ" + +#: commands/sequence.c:1660 +#, c-format +msgid "cannot change ownership of identity sequence" +msgstr "იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ მიმდევრáƒáƒ‘ის მფლáƒáƒ‘ელის შეცვლრშეუძლებელიáƒ" + +#: commands/sequence.c:1661 commands/tablecmds.c:14387 commands/tablecmds.c:17081 +#, c-format +msgid "Sequence \"%s\" is linked to table \"%s\"." +msgstr "მიმდევრáƒáƒ‘რ%s მიბმულირცხრილზე \"%s\"." + +#: commands/statscmds.c:106 commands/statscmds.c:115 tcop/utility.c:1883 +#, c-format +msgid "only a single relation is allowed in CREATE STATISTICS" +msgstr "'CREATE STATISTICS'-ში მხáƒáƒšáƒáƒ“ ერთი ურთიერთáƒáƒ‘áƒáƒ დáƒáƒ¨áƒ•ებული" + +#: commands/statscmds.c:133 +#, c-format +msgid "cannot define statistics for relation \"%s\"" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რრურთიერთáƒáƒ‘ისთვის %s შეუძლებელიáƒ" + +#: commands/statscmds.c:187 +#, c-format +msgid "statistics object \"%s\" already exists, skipping" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ‘იექტის %s უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/statscmds.c:195 +#, c-format +msgid "statistics object \"%s\" already exists" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ‘იექტი უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: commands/statscmds.c:206 +#, c-format +msgid "cannot have more than %d columns in statistics" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒáƒ¨áƒ˜ %d-ზე მეტი სვეტი ვერ გექნებáƒáƒ—" + +#: commands/statscmds.c:247 commands/statscmds.c:270 commands/statscmds.c:304 +#, c-format +msgid "statistics creation on system columns is not supported" +msgstr "სისტემურ სვეტებზე სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ შექმნრშეუძლებელიáƒ" + +#: commands/statscmds.c:254 commands/statscmds.c:277 +#, c-format +msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" +msgstr "სვეტს \"%s\" სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒáƒ¨áƒ˜ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ, რáƒáƒ“გáƒáƒœ მის ტიპს (\"%s\") ნáƒáƒ’ულისხმევი áƒáƒ áƒáƒ‘ითი ხის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/statscmds.c:321 +#, c-format +msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" +msgstr "" + +#: commands/statscmds.c:342 +#, c-format +msgid "when building statistics on a single expression, statistics kinds may not be specified" +msgstr "რáƒáƒªáƒ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ’ებრერთ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ–ე მიმდინáƒáƒ áƒ”áƒáƒ‘ს, სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ ტიპის მითითებრშეუძლებელიáƒ" + +#: commands/statscmds.c:371 +#, c-format +msgid "unrecognized statistics kind \"%s\"" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ უცნáƒáƒ‘ი ტიპი: \"%s\"" + +#: commands/statscmds.c:400 +#, c-format +msgid "extended statistics require at least 2 columns" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბულ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒáƒ¡ მინიმუმ 2 სვეტი სჭირდებáƒ" + +#: commands/statscmds.c:418 +#, c-format +msgid "duplicate column name in statistics definition" +msgstr "სვეტის დუბლირებული სáƒáƒ®áƒ”ლი სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒáƒ¨áƒ˜" + +#: commands/statscmds.c:453 +#, c-format +msgid "duplicate expression in statistics definition" +msgstr "დუბლირებული გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრსტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒáƒ¨áƒ˜" + +#: commands/statscmds.c:628 commands/tablecmds.c:8628 +#, c-format +msgid "statistics target %d is too low" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნე %d ძáƒáƒšáƒ˜áƒáƒœ დáƒáƒ‘áƒáƒšáƒ˜áƒ" + +#: commands/statscmds.c:636 commands/tablecmds.c:8636 +#, c-format +msgid "lowering statistics target to %d" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნის ჩáƒáƒ›áƒáƒ¬áƒ”ვრ%d-მდე" + +#: commands/statscmds.c:660 +#, c-format +msgid "statistics object \"%s.%s\" does not exist, skipping" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ‘იექტი \"%s.%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/subscriptioncmds.c:275 commands/subscriptioncmds.c:372 +#, c-format +msgid "unrecognized subscription parameter: \"%s\"" +msgstr "უცნáƒáƒ‘ი გáƒáƒ›áƒáƒ¬áƒ”რის პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: commands/subscriptioncmds.c:340 replication/pgoutput/pgoutput.c:397 +#, c-format +msgid "unrecognized origin value: \"%s\"" +msgstr "\"origin\"-ის უცნáƒáƒ‘ი მნიშვნელáƒáƒ‘áƒ: \"%s\"" + +#: commands/subscriptioncmds.c:363 +#, c-format +msgid "invalid WAL location (LSN): %s" +msgstr "\"WAL\"-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘რ(LSN): %s" + +#. translator: both %s are strings of the form "option = value" +#: commands/subscriptioncmds.c:387 commands/subscriptioncmds.c:394 commands/subscriptioncmds.c:401 commands/subscriptioncmds.c:423 commands/subscriptioncmds.c:439 +#, c-format +msgid "%s and %s are mutually exclusive options" +msgstr "%s დრ%s ურთიერთგáƒáƒ›áƒáƒ›áƒ áƒ˜áƒªáƒ®áƒáƒ•ი პáƒáƒ áƒáƒ›áƒ”ტრებიáƒ" + +#. translator: both %s are strings of the form "option = value" +#: commands/subscriptioncmds.c:429 commands/subscriptioncmds.c:445 +#, c-format +msgid "subscription with %s must also set %s" +msgstr "%s-ის გáƒáƒ›áƒáƒ¬áƒ”რáƒáƒ› %s-იც უნდრდáƒáƒáƒ§áƒ”ნáƒáƒ¡" + +#: commands/subscriptioncmds.c:506 +#, c-format +msgid "could not receive list of publications from the publisher: %s" +msgstr "გáƒáƒ›áƒáƒ›áƒªáƒ”მლისგáƒáƒœ პუბლიკáƒáƒªáƒ˜áƒ”ბის სიის მიღებრშეუძლებელიáƒ: %s" + +#: commands/subscriptioncmds.c:538 +#, c-format +msgid "publication %s does not exist on the publisher" +msgid_plural "publications %s do not exist on the publisher" +msgstr[0] "პუბლიკáƒáƒªáƒ˜áƒ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" +msgstr[1] "პუბლიკáƒáƒªáƒ˜áƒ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/subscriptioncmds.c:626 +#, c-format +msgid "permission denied to create subscription" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რის შექმნის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/subscriptioncmds.c:627 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may create subscriptions." +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რების შექმნრმხáƒáƒšáƒáƒ“ \"%s\" რáƒáƒšáƒ˜áƒ¡ პრივილეგიების მქáƒáƒœáƒ”ებს შეუძლიáƒáƒ—." + +#: commands/subscriptioncmds.c:758 commands/subscriptioncmds.c:891 commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1345 replication/logical/worker.c:4503 +#, c-format +msgid "could not connect to the publisher: %s" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სერვერთáƒáƒœ მიერთების პრáƒáƒ‘ლემáƒ: %s" + +#: commands/subscriptioncmds.c:829 +#, c-format +msgid "created replication slot \"%s\" on publisher" +msgstr "გáƒáƒ›áƒáƒ›áƒªáƒ”მელზე შექმნილირრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სეტი \"%s\"" + +#: commands/subscriptioncmds.c:841 +#, c-format +msgid "subscription was created, but is not connected" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რრშეიქმნáƒ, მáƒáƒ’რáƒáƒ› მიერთებული áƒáƒ áƒáƒ" + +#: commands/subscriptioncmds.c:842 +#, c-format +msgid "To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription." +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¬áƒ§áƒ”ბáƒáƒ“ ხელით უნდრშექმნáƒáƒ— რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜, ჩáƒáƒ áƒ—áƒáƒ— გáƒáƒ›áƒáƒ¬áƒ”რრდრგáƒáƒœáƒáƒáƒ®áƒšáƒáƒ— გáƒáƒ›áƒáƒ¬áƒ”რáƒ." + +#: commands/subscriptioncmds.c:1109 commands/subscriptioncmds.c:1590 commands/subscriptioncmds.c:1973 utils/cache/lsyscache.c:3684 +#, c-format +msgid "subscription \"%s\" does not exist" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რრ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/subscriptioncmds.c:1166 commands/subscriptioncmds.c:1245 +#, c-format +msgid "cannot set %s for enabled subscription" +msgstr "ჩáƒáƒ áƒ—ული გáƒáƒ›áƒáƒ¬áƒ”რისთვის %s-ის დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: commands/subscriptioncmds.c:1233 +#, c-format +msgid "cannot set %s for a subscription that does not have a slot name" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რებისთვის, რáƒáƒ›áƒšáƒ”ბსáƒáƒª სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი áƒáƒ  áƒáƒ¥áƒ•თ, %s-ს ვერ დáƒáƒ•áƒáƒ§áƒ”ნებ" + +#: commands/subscriptioncmds.c:1279 +#, c-format +msgid "cannot enable subscription that does not have a slot name" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რების, რáƒáƒ›áƒšáƒ”ბსáƒáƒª სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი áƒáƒ  áƒáƒ¥áƒ•თ, ჩáƒáƒ áƒ—ვრშეუძლებელიáƒ" + +#: commands/subscriptioncmds.c:1323 commands/subscriptioncmds.c:1374 +#, c-format +msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" +msgstr "ALTER SUBSCRIPTION გáƒáƒœáƒáƒ®áƒšáƒ”ბით დáƒáƒ£áƒ¨áƒ•ებელირგáƒáƒ—იშული გáƒáƒ›áƒáƒ¬áƒ”რებისთვის" + +#: commands/subscriptioncmds.c:1324 +#, c-format +msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (გáƒáƒœáƒáƒ®áƒšáƒ”ბრ= გáƒáƒ›áƒáƒ áƒ—ულიáƒ)." + +#: commands/subscriptioncmds.c:1333 commands/subscriptioncmds.c:1388 +#, c-format +msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" +msgstr "ALTER SUBSCRIPTION ... გáƒáƒœáƒáƒ®áƒšáƒ”ბით დრcopy_data-ით დáƒáƒ£áƒ¨áƒ•ებელიáƒ, რáƒáƒªáƒ two_phase ჩáƒáƒ áƒ—ულიáƒ" + +#: commands/subscriptioncmds.c:1334 +#, c-format +msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ALTER SUBSCRIPTION ... SET PUBLICATION refresh = false-ით, copy_data = false-ით áƒáƒœ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ DROP/CREATE SUBSCRIPTION." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1390 +#, c-format +msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ %s 'refresh = false'-ით áƒáƒœ 'copy_data = false'-ით áƒáƒœ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ DROP/CREATE SUBSCRIPTION." + +#: commands/subscriptioncmds.c:1412 +#, c-format +msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" +msgstr "ALTER SUBSCRIPTION ... REFRESH დáƒáƒ£áƒ¨áƒ•ებელირგáƒáƒ—იშული გáƒáƒ›áƒáƒ¬áƒ”რებისთვის" + +#: commands/subscriptioncmds.c:1437 +#, c-format +msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" +msgstr "ALTER SUBSCRIPTION ... REFRESH -ი copy_data-ით დáƒáƒ£áƒ¨áƒ•ებელიáƒ, რáƒáƒªáƒ two_phase ჩáƒáƒ áƒ—ულიáƒ" + +#: commands/subscriptioncmds.c:1438 +#, c-format +msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ALTER SUBSCRIPTION ... REFRESH 'copy_data = false'-ით áƒáƒœ DROP/CREATE SUBSCRIPTION." + +#: commands/subscriptioncmds.c:1473 +#, c-format +msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" +msgstr "გáƒáƒ›áƒáƒ¢áƒáƒ•ებრWAL-ის მდებáƒáƒ áƒ”áƒáƒ‘რ(LSN %X/%X) სáƒáƒ¬áƒ§áƒ˜áƒ¡ LSN-ზე %X/%X დიდი უნდრიყáƒáƒ¡" + +#: commands/subscriptioncmds.c:1594 +#, c-format +msgid "subscription \"%s\" does not exist, skipping" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რრ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/subscriptioncmds.c:1863 +#, c-format +msgid "dropped replication slot \"%s\" on publisher" +msgstr "გáƒáƒ›áƒáƒ›áƒªáƒ”მელზე რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სეტი \"%s\" წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜áƒ" + +#: commands/subscriptioncmds.c:1872 commands/subscriptioncmds.c:1880 +#, c-format +msgid "could not drop replication slot \"%s\" on publisher: %s" +msgstr "შეუძლებელირრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ \"%s\" წáƒáƒ¨áƒšáƒ გáƒáƒ›áƒáƒ›áƒªáƒ”მელზე: %s" + +#: commands/subscriptioncmds.c:2005 +#, c-format +msgid "subscription with OID %u does not exist" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რრOID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/subscriptioncmds.c:2076 commands/subscriptioncmds.c:2201 +#, c-format +msgid "could not receive list of replicated tables from the publisher: %s" +msgstr "შეცდáƒáƒ›áƒ რეპლიცირებული ცხრილების სიის მიგებრგáƒáƒ›áƒáƒ›áƒªáƒ”მლისგáƒáƒœ: %s" + +#: commands/subscriptioncmds.c:2112 +#, c-format +msgid "subscription \"%s\" requested copy_data with origin = NONE but might copy data that had a different origin" +msgstr "" + +#: commands/subscriptioncmds.c:2114 +#, c-format +msgid "The subscription being created subscribes to a publication (%s) that contains tables that are written to by other subscriptions." +msgid_plural "The subscription being created subscribes to publications (%s) that contain tables that are written to by other subscriptions." +msgstr[0] "" +msgstr[1] "" + +#: commands/subscriptioncmds.c:2117 +#, c-format +msgid "Verify that initial data copied from the publisher tables did not come from other origins." +msgstr "" + +#: commands/subscriptioncmds.c:2223 replication/logical/tablesync.c:906 replication/pgoutput/pgoutput.c:1117 +#, c-format +msgid "cannot use different column lists for table \"%s.%s\" in different publications" +msgstr "" + +#: commands/subscriptioncmds.c:2273 +#, c-format +msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ \"%s\" წáƒáƒ¨áƒšáƒ˜áƒ¡ მცდელáƒáƒ‘ისáƒáƒ¡ გáƒáƒ›áƒáƒ›áƒªáƒ”მელთáƒáƒœ მიერთებრშეუძლებელიáƒ: %s" + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:2276 +#, c-format +msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რის გáƒáƒ¡áƒáƒ—იშáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ %s, შემდეგ კი, სლáƒáƒ¢áƒ—áƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒ áƒ”ბის მáƒáƒ¡áƒáƒ®áƒ¡áƒœáƒ”ლáƒáƒ“, %s გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: commands/subscriptioncmds.c:2307 +#, c-format +msgid "publication name \"%s\" used more than once" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი \"%s\" ერთზე მეტჯერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: commands/subscriptioncmds.c:2351 +#, c-format +msgid "publication \"%s\" is already in subscription \"%s\"" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ \"%s\" უკვე \"%s\" გáƒáƒ›áƒáƒ¬áƒ”რáƒáƒ¨áƒ˜áƒ" + +#: commands/subscriptioncmds.c:2365 +#, c-format +msgid "publication \"%s\" is not in subscription \"%s\"" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ \"%s\" \"%s\" გáƒáƒ›áƒáƒ¬áƒ”რáƒáƒ¨áƒ˜ áƒáƒ áƒáƒ" + +#: commands/subscriptioncmds.c:2376 +#, c-format +msgid "cannot drop all the publications from a subscription" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რიდáƒáƒœ ყველრპუბლიკáƒáƒªáƒ˜áƒáƒ¡ ვერ წáƒáƒ¨áƒšáƒ˜áƒ—" + +#: commands/subscriptioncmds.c:2433 +#, c-format +msgid "%s requires a Boolean value or \"parallel\"" +msgstr "%s -ს ლáƒáƒ’იკური მნიშვნელáƒáƒ‘რუნდრჰქáƒáƒœáƒ“ეს, áƒáƒœ \"parallel\"" + +#: commands/tablecmds.c:255 commands/tablecmds.c:297 +#, c-format +msgid "table \"%s\" does not exist" +msgstr "ცხრილი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: commands/tablecmds.c:256 commands/tablecmds.c:298 +#, c-format +msgid "table \"%s\" does not exist, skipping" +msgstr "ცხრილი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/tablecmds.c:258 commands/tablecmds.c:300 +msgid "Use DROP TABLE to remove a table." +msgstr "ცხრილის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ DROP TABLE." + +#: commands/tablecmds.c:261 +#, c-format +msgid "sequence \"%s\" does not exist" +msgstr "მიმდევრáƒáƒ‘რ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/tablecmds.c:262 +#, c-format +msgid "sequence \"%s\" does not exist, skipping" +msgstr "მიმდევრáƒáƒ‘რ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/tablecmds.c:264 +msgid "Use DROP SEQUENCE to remove a sequence." +msgstr "მიმდევრáƒáƒ‘ის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ DROP SEQUENCE." + +#: commands/tablecmds.c:267 +#, c-format +msgid "view \"%s\" does not exist" +msgstr "ხედი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/tablecmds.c:268 +#, c-format +msgid "view \"%s\" does not exist, skipping" +msgstr "ხედი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/tablecmds.c:270 +msgid "Use DROP VIEW to remove a view." +msgstr "ხედის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ DROP VIEW." + +#: commands/tablecmds.c:273 +#, c-format +msgid "materialized view \"%s\" does not exist" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/tablecmds.c:274 +#, c-format +msgid "materialized view \"%s\" does not exist, skipping" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/tablecmds.c:276 +msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ DROP MATERIALIZED VIEW." + +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19627 parser/parse_utilcmd.c:2226 +#, c-format +msgid "index \"%s\" does not exist" +msgstr "ინდექსი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/tablecmds.c:280 commands/tablecmds.c:304 +#, c-format +msgid "index \"%s\" does not exist, skipping" +msgstr "ინდექსი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/tablecmds.c:282 commands/tablecmds.c:306 +msgid "Use DROP INDEX to remove an index." +msgstr "ინდექსის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ DROP INDEX." + +#: commands/tablecmds.c:287 +#, c-format +msgid "\"%s\" is not a type" +msgstr "\"%s\" ტიპი áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:288 +msgid "Use DROP TYPE to remove a type." +msgstr "ტიპის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ DROP TYPE." + +#: commands/tablecmds.c:291 commands/tablecmds.c:14226 commands/tablecmds.c:16786 +#, c-format +msgid "foreign table \"%s\" does not exist" +msgstr "გáƒáƒ áƒ” ცხრილი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/tablecmds.c:292 +#, c-format +msgid "foreign table \"%s\" does not exist, skipping" +msgstr "გáƒáƒ áƒ” ცხრილი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/tablecmds.c:294 +msgid "Use DROP FOREIGN TABLE to remove a foreign table." +msgstr "გáƒáƒ áƒ” ცხრილის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ DROP FOREIGN TABLE გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: commands/tablecmds.c:722 +#, c-format +msgid "ON COMMIT can only be used on temporary tables" +msgstr "ON COMMIT მხáƒáƒšáƒáƒ“ დრáƒáƒ”ბით ცხრილებზე გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: commands/tablecmds.c:753 +#, c-format +msgid "cannot create temporary table within security-restricted operation" +msgstr "უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბáƒáƒ–ე-შეზღუდული áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ შიგნით დრáƒáƒ”ბითი ცხრილის შექმნრშეუძლებელიáƒ" + +#: commands/tablecmds.c:789 commands/tablecmds.c:15645 +#, c-format +msgid "relation \"%s\" would be inherited from more than once" +msgstr "ურთიერთáƒáƒ‘რ\"%s\" მემკვირდრეáƒáƒ‘ით ერზე მეტჯერ იქნებáƒáƒ“რმიღებული" + +#: commands/tablecmds.c:1055 +#, c-format +msgid "\"%s\" is not partitioned" +msgstr "\"%s\" დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:1149 +#, c-format +msgid "cannot partition using more than %d columns" +msgstr "%d-ზე მეტი სვეტის გáƒáƒ›áƒáƒ§áƒ”ნებით დáƒáƒ§áƒáƒ¤áƒ შეუძლებელიáƒ" + +#: commands/tablecmds.c:1205 +#, c-format +msgid "cannot create foreign partition of partitioned table \"%s\"" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილის (%s) გáƒáƒ áƒ” დáƒáƒœáƒáƒ§áƒáƒ¤áƒ¡ ვერ შექმნით" + +#: commands/tablecmds.c:1207 +#, c-format +msgid "Table \"%s\" contains indexes that are unique." +msgstr "ცხრილი %s შეიცáƒáƒ•ს სვეტებს, რáƒáƒ›áƒšáƒ”ბიც უნიკáƒáƒšáƒ£áƒ áƒ˜áƒ." + +#: commands/tablecmds.c:1326 commands/tablecmds.c:13242 +#, c-format +msgid "too many array dimensions" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის მეტისმეტáƒáƒ“ ბევრი გáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბáƒ" + +#: commands/tablecmds.c:1331 parser/parse_clause.c:774 parser/parse_relation.c:1912 +#, c-format +msgid "column \"%s\" cannot be declared SETOF" +msgstr "სვეტი \"%s\" áƒáƒ  შეიძლებრგáƒáƒ›áƒáƒªáƒ®áƒáƒ“დეს SETOF" + +#: commands/tablecmds.c:1477 +#, c-format +msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" +msgstr "DROP INDEX CONCURRENTLY-ს ერთზე მეტი áƒáƒ‘იექტის წáƒáƒ¨áƒšáƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/tablecmds.c:1481 +#, c-format +msgid "DROP INDEX CONCURRENTLY does not support CASCADE" +msgstr "DROP INDEX CONCURRENTLY-ს CASCADE-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/tablecmds.c:1585 +#, c-format +msgid "cannot drop partitioned index \"%s\" concurrently" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒš ინდექსს \"%s\" პáƒáƒ áƒáƒšáƒ”ლურáƒáƒ“ ვერ წáƒáƒ¨áƒšáƒ˜áƒ—" + +#: commands/tablecmds.c:1873 +#, c-format +msgid "cannot truncate only a partitioned table" +msgstr "თვითáƒáƒœ დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილის დáƒáƒªáƒáƒ áƒ˜áƒ”ლებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:1874 +#, c-format +msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." +msgstr "áƒáƒ  მიუთითáƒáƒ— სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ სიტყვრONLY, áƒáƒœ პირდáƒáƒžáƒ˜áƒ  დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბზე გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ TRUNCATE ONLY." + +#: commands/tablecmds.c:1947 +#, c-format +msgid "truncate cascades to table \"%s\"" +msgstr "მáƒáƒ™áƒ•ეთრგáƒáƒ“áƒáƒ”ცემრცხრილáƒáƒ›áƒ“ე %s" + +#: commands/tablecmds.c:2308 +#, c-format +msgid "cannot truncate foreign table \"%s\"" +msgstr "გáƒáƒ áƒ” ცხრილის (\"%s\") მáƒáƒ™áƒ•ეთის შეცდáƒáƒ›áƒ" + +#: commands/tablecmds.c:2365 +#, c-format +msgid "cannot truncate temporary tables of other sessions" +msgstr "სხვრსესიების დრáƒáƒ”ბითი ცხრილების მáƒáƒ™áƒ•ეთის შეცდáƒáƒ›áƒ" + +#: commands/tablecmds.c:2594 commands/tablecmds.c:15542 +#, c-format +msgid "cannot inherit from partitioned table \"%s\"" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილიდáƒáƒœ \"%s\" მემკვიდრეáƒáƒ‘ის მიღებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:2599 +#, c-format +msgid "cannot inherit from partition \"%s\"" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ“áƒáƒœ \"%s\" მემკვიდრეáƒáƒ‘ის მიღებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:2607 parser/parse_utilcmd.c:2456 parser/parse_utilcmd.c:2598 +#, c-format +msgid "inherited relation \"%s\" is not a table or foreign table" +msgstr "მემკვიდრეáƒáƒ‘ით მიღებული ურთიერთáƒáƒ‘რ\"%s\" ცხრილს áƒáƒœ გáƒáƒ áƒ” ცხრილს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: commands/tablecmds.c:2619 commands/tablecmds.c:20391 +#, c-format +msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" +msgstr "შეუძლებელირშექმნáƒáƒ— დრáƒáƒ”ბით ურთიერთáƒáƒ‘áƒ, რáƒáƒ›áƒ”ლიც მუდმივი ურთიერთáƒáƒ‘ის \"%s\" დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜ იქნებáƒ" + +#: commands/tablecmds.c:2628 commands/tablecmds.c:15521 +#, c-format +msgid "cannot inherit from temporary relation \"%s\"" +msgstr "დრáƒáƒ”ბითი ურთიერთáƒáƒ‘იდáƒáƒœ (%s) მემკვიდრეáƒáƒ‘ითáƒáƒ‘რშეუძლებელიáƒ" + +#: commands/tablecmds.c:2638 commands/tablecmds.c:15529 +#, c-format +msgid "cannot inherit from temporary relation of another session" +msgstr "სხვრსესიის დრáƒáƒ”ბითი ურთიერთáƒáƒ‘იდáƒáƒœ მემკვიდრეáƒáƒ‘ითáƒáƒ‘რშეუძლებელიáƒ" + +#: commands/tablecmds.c:2779 commands/tablecmds.c:2833 commands/tablecmds.c:12925 parser/parse_utilcmd.c:1240 parser/parse_utilcmd.c:1283 parser/parse_utilcmd.c:1710 parser/parse_utilcmd.c:1818 +#, c-format +msgid "cannot convert whole-row table reference" +msgstr "" + +#: commands/tablecmds.c:2780 parser/parse_utilcmd.c:1241 +#, c-format +msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "" + +#: commands/tablecmds.c:2834 parser/parse_utilcmd.c:1284 +#, c-format +msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "" + +#: commands/tablecmds.c:2944 commands/tablecmds.c:3215 +#, c-format +msgid "column \"%s\" inherits from generated column but specifies default" +msgstr "ცხრილი \"%s\" მემკვიდრეáƒáƒ‘ით იღებს გენერირებული ცხრილიდáƒáƒœ, მáƒáƒ’რáƒáƒ› ნáƒáƒ’ულისხმევიც მითითებულიáƒ" + +#: commands/tablecmds.c:2949 commands/tablecmds.c:3220 +#, c-format +msgid "column \"%s\" inherits from generated column but specifies identity" +msgstr "ცხრილი \"%s\" მემკვიდრეáƒáƒ‘ით იღებს გენერირებული ცხრილიდáƒáƒœ, მáƒáƒ’რáƒáƒ› იდენტიფიკáƒáƒªáƒ˜áƒáƒª მითითებულიáƒ" + +#: commands/tablecmds.c:2957 commands/tablecmds.c:3228 +#, c-format +msgid "child column \"%s\" specifies generation expression" +msgstr "შვილი სვეტისთვის \"%s\" მითითებულირგენერáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ" + +#: commands/tablecmds.c:2959 commands/tablecmds.c:3230 +#, c-format +msgid "A child table column cannot be generated unless its parent column is." +msgstr "შვილი ცხრილის სვეტი áƒáƒ  შეიძლებáƒ, გენერირებული იყáƒáƒ¡, თუ მისი მშáƒáƒ‘ელიც áƒáƒ áƒáƒ." + +#: commands/tablecmds.c:3005 +#, c-format +msgid "column \"%s\" inherits conflicting generation expressions" +msgstr "სვეტი \"%s\" მემკვიდრეáƒáƒ‘ით კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜áƒ¡ მქáƒáƒœáƒ” გენერáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¡ იღებს" + +#: commands/tablecmds.c:3007 +#, c-format +msgid "To resolve the conflict, specify a generation expression explicitly." +msgstr "კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜áƒ¡ გáƒáƒ“áƒáƒ¡áƒáƒ­áƒ áƒ”ლáƒáƒ“ გენერáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრáƒáƒ¨áƒ™áƒáƒ áƒáƒ“ მიუთითეთ." + +#: commands/tablecmds.c:3011 +#, c-format +msgid "column \"%s\" inherits conflicting default values" +msgstr "სვეტი \"%s\" მემკვიდრეáƒáƒ‘ით ურთიერთგáƒáƒ›áƒáƒ›áƒ áƒ˜áƒªáƒ®áƒáƒ• ნáƒáƒ’ულისხმევ მნიშვნელáƒáƒ‘ებს იღებს" + +#: commands/tablecmds.c:3013 +#, c-format +msgid "To resolve the conflict, specify a default explicitly." +msgstr "კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜áƒ¡ გáƒáƒ“áƒáƒ¡áƒáƒ­áƒ áƒ”ლáƒáƒ“ ნáƒáƒ’ულისხმევი áƒáƒ¨áƒ™áƒáƒ áƒáƒ“ მიუთითეთ." + +#: commands/tablecmds.c:3068 +#, c-format +msgid "check constraint name \"%s\" appears multiple times but with different expressions" +msgstr "შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვის სáƒáƒ®áƒ”ლი \"%s\" ბევრჯერ გáƒáƒ›áƒáƒ©áƒœáƒ“áƒ, მáƒáƒ’რáƒáƒ› სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რგáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებთáƒáƒœ ერთáƒáƒ“" + +#: commands/tablecmds.c:3119 +#, c-format +msgid "merging column \"%s\" with inherited definition" +msgstr "სვეტის (\"%s\") შერწყმრმემკვიდრეáƒáƒ‘ითი áƒáƒ¦áƒ¬áƒ”რით" + +#: commands/tablecmds.c:3123 +#, c-format +msgid "moving and merging column \"%s\" with inherited definition" +msgstr "" + +#: commands/tablecmds.c:3124 +#, c-format +msgid "User-specified column moved to the position of the inherited column." +msgstr "" + +#: commands/tablecmds.c:3136 +#, c-format +msgid "column \"%s\" has a type conflict" +msgstr "ტიპის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜ სვეტში \"%s\"" + +#: commands/tablecmds.c:3138 commands/tablecmds.c:3172 commands/tablecmds.c:3188 commands/tablecmds.c:3295 commands/tablecmds.c:3328 commands/tablecmds.c:3344 parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 parser/parse_param.c:223 +#, c-format +msgid "%s versus %s" +msgstr "%s-ი %s-ის წინáƒáƒáƒ¦áƒ›áƒ“ეგ" + +#: commands/tablecmds.c:3150 +#, c-format +msgid "column \"%s\" has a collation conflict" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜ სვეტში \"%s\"" + +#: commands/tablecmds.c:3152 commands/tablecmds.c:3314 commands/tablecmds.c:7088 +#, c-format +msgid "\"%s\" versus \"%s\"" +msgstr "'%s\" -ი \"%s\"-ის წინáƒáƒáƒ¦áƒ›áƒ“ეგ" + +#: commands/tablecmds.c:3170 +#, c-format +msgid "column \"%s\" has a storage parameter conflict" +msgstr "სáƒáƒªáƒáƒ•ის პáƒáƒ áƒáƒ›áƒ”ტრის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜ სვეტში \"%s\"" + +#: commands/tablecmds.c:3186 commands/tablecmds.c:3342 +#, c-format +msgid "column \"%s\" has a compression method conflict" +msgstr "სვეტის (%s) შეკუმშვის მეთáƒáƒ“ის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜" + +#: commands/tablecmds.c:3281 +#, c-format +msgid "merging multiple inherited definitions of column \"%s\"" +msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს სვეტის (\"%s\") მიერ მემკვიდრეáƒáƒ‘ით მიღებული áƒáƒ¦áƒ¬áƒ”რების შერწყმáƒ" + +#: commands/tablecmds.c:3293 +#, c-format +msgid "inherited column \"%s\" has a type conflict" +msgstr "მემკივდრეáƒáƒ‘ითი სვეტის \"%s\" ტიპის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜" + +#: commands/tablecmds.c:3312 +#, c-format +msgid "inherited column \"%s\" has a collation conflict" +msgstr "მემკივდრეáƒáƒ‘ითი სვეტის \"%s\" კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜" + +#: commands/tablecmds.c:3326 +#, c-format +msgid "inherited column \"%s\" has a storage parameter conflict" +msgstr "მემკივდრეáƒáƒ‘ითი სვეტის \"%s\" სáƒáƒªáƒáƒ•ის პáƒáƒ áƒáƒ›áƒ”ტრის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜" + +#: commands/tablecmds.c:3354 +#, c-format +msgid "inherited column \"%s\" has a generation conflict" +msgstr "მემკივდრეáƒáƒ‘ითი სვეტის \"%s\" თáƒáƒáƒ‘ის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜" + +#: commands/tablecmds.c:3573 +#, c-format +msgid "cannot move temporary tables of other sessions" +msgstr "სხვრსესიების დრáƒáƒ”ბითი ცხრილების გáƒáƒ“áƒáƒáƒ“გილებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:3643 +#, c-format +msgid "cannot rename column of typed table" +msgstr "ტიპიზირებული ცხრილის სვეტის გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ შეუძლებელიáƒ" + +#: commands/tablecmds.c:3662 +#, c-format +msgid "cannot rename columns of relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘ის (\"%s\") სვეტების სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრშეუძლებელიáƒ" + +#: commands/tablecmds.c:3757 +#, c-format +msgid "inherited column \"%s\" must be renamed in child tables too" +msgstr "მემკვიდრეáƒáƒ‘ით მიღებული სვეტს (\"%s\") სáƒáƒ®áƒ”ლი შვილ ცხრილებშიც უნდრგáƒáƒ“áƒáƒ”რქვáƒáƒ¡" + +#: commands/tablecmds.c:3789 +#, c-format +msgid "cannot rename system column \"%s\"" +msgstr "სისტემური სვეტის \"%s\" გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრშეუძლებელიáƒ" + +#: commands/tablecmds.c:3804 +#, c-format +msgid "cannot rename inherited column \"%s\"" +msgstr "მემკვიდრეáƒáƒ‘ითი სვეტის (\"%s\") სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრშეუძლებელიáƒ" + +#: commands/tablecmds.c:3956 +#, c-format +msgid "inherited constraint \"%s\" must be renamed in child tables too" +msgstr "მემკვიდრეáƒáƒ‘ით მიღებული შეზღუდვáƒáƒ¡ (\"%s\") სáƒáƒ®áƒ”ლი შვილ ცხრილებშიც უნდრგáƒáƒ“áƒáƒ”რქვáƒáƒ¡" + +#: commands/tablecmds.c:3963 +#, c-format +msgid "cannot rename inherited constraint \"%s\"" +msgstr "მემკვიდრეáƒáƒ‘ითი შეზღუდვის (\"%s\") სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრშეუძლებელიáƒ" + +#. translator: first %s is a SQL command, eg ALTER TABLE +#: commands/tablecmds.c:4260 +#, c-format +msgid "cannot %s \"%s\" because it is being used by active queries in this session" +msgstr "%s-ის \"%s\" შეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ ის áƒáƒ› სესიáƒáƒ¨áƒ˜ áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ მáƒáƒ—ხáƒáƒ•ნების მიერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#. translator: first %s is a SQL command, eg ALTER TABLE +#: commands/tablecmds.c:4269 +#, c-format +msgid "cannot %s \"%s\" because it has pending trigger events" +msgstr "%s-ის \"%s\" შეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ მáƒáƒ¡ დáƒáƒ áƒ©áƒ”ნილი ტრიგერის მáƒáƒ•ლენები გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/tablecmds.c:4295 +#, c-format +msgid "cannot alter temporary tables of other sessions" +msgstr "სხვრსესიების დრáƒáƒ”ბითი ცხრილების შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:4776 +#, c-format +msgid "cannot alter partition \"%s\" with an incomplete detach" +msgstr "áƒáƒ áƒáƒ¡áƒ áƒ£áƒšáƒ˜ მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ მქáƒáƒœáƒ” დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ \"%s\" შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:4980 commands/tablecmds.c:4995 +#, c-format +msgid "cannot change persistence setting twice" +msgstr "შენáƒáƒ®áƒ•ის პáƒáƒ áƒáƒ›áƒ”ტრების áƒáƒ áƒ¯áƒ”რ შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:5016 +#, c-format +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "ერთზე მეტი SET ACCESS METHOD ქვებრძáƒáƒœáƒ”ბრვერ გექნებáƒáƒ—" + +#: commands/tablecmds.c:5772 +#, c-format +msgid "cannot rewrite system relation \"%s\"" +msgstr "სისტემური შეერთების \"%s\" გáƒáƒ“áƒáƒ¬áƒ”რრშეუძლებელიáƒ" + +#: commands/tablecmds.c:5778 +#, c-format +msgid "cannot rewrite table \"%s\" used as a catalog table" +msgstr "კáƒáƒ¢áƒáƒšáƒáƒ’ის ცხრილáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული ცხრილის \"%s\" თáƒáƒ•იდáƒáƒœ ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ" + +#: commands/tablecmds.c:5790 +#, c-format +msgid "cannot rewrite temporary tables of other sessions" +msgstr "სხვრსესიების დრáƒáƒ”ბით ცხრილებს ვერ გáƒáƒ“áƒáƒáƒ¬áƒ”რთ" + +#: commands/tablecmds.c:6285 +#, c-format +msgid "column \"%s\" of relation \"%s\" contains null values" +msgstr "ურთიერთáƒáƒ‘ის %2$s სვეტი %1$s ნულáƒáƒ•áƒáƒœ მნიშვნელáƒáƒ‘ებს შეიცáƒáƒ•ს" + +#: commands/tablecmds.c:6302 +#, c-format +msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" +msgstr "ურთიერთáƒáƒ‘ის (\"%2$s\") შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვრ\"%1$s\" რáƒáƒ›áƒ”ლიღáƒáƒª მწკრივის მიერ ირღვევáƒ" + +#: commands/tablecmds.c:6321 partitioning/partbounds.c:3388 +#, c-format +msgid "updated partition constraint for default partition \"%s\" would be violated by some row" +msgstr "გáƒáƒœáƒáƒ®áƒ”ბული დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ შეზღუდვრნáƒáƒ’ულისხმევი დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒ—ვის \"%s\" რáƒáƒ›áƒ”ლიღáƒáƒª მწკრივის მიერ დáƒáƒ˜áƒ áƒ¦áƒ•ეáƒáƒ“áƒ" + +#: commands/tablecmds.c:6327 +#, c-format +msgid "partition constraint of relation \"%s\" is violated by some row" +msgstr "ურთიერთáƒáƒ‘ის (\"%s\") დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ შეზღუდვრრáƒáƒ›áƒ”ლიღáƒáƒª მწკრივის მიერ ირღვევáƒ" + +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6596 +#, c-format +msgid "ALTER action %s cannot be performed on relation \"%s\"" +msgstr "ALTER-ის ქმედებáƒáƒ¡ %s ურთიერთáƒáƒ‘áƒáƒ–ე \"%s\" ვერ შეáƒáƒ¡áƒ áƒ£áƒšáƒ”ბთ" + +#: commands/tablecmds.c:6851 commands/tablecmds.c:6858 +#, c-format +msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" +msgstr "ტიპის \"%s\" შეცვლრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ მáƒáƒ¡ სვეტი \"%s.%s\" იყენებს" + +#: commands/tablecmds.c:6865 +#, c-format +msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" +msgstr "გáƒáƒ áƒ” ცხრილის \"%s\" შეცვლრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ სვეტი \"%s.%s\" თáƒáƒ•ისი მწკრივის ტიპს იყენებს" + +#: commands/tablecmds.c:6872 +#, c-format +msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" +msgstr "ცხრილის \"%s\" შეცვლრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ სვეტი \"%s.%s\" თáƒáƒ•ისი მწკრივის ტიპს იყენებს" + +#: commands/tablecmds.c:6928 +#, c-format +msgid "cannot alter type \"%s\" because it is the type of a typed table" +msgstr "ტიპის \"%s\" შეცვლრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ ის ტიპიზირებული ცხრილის ტიპისáƒáƒ" + +#: commands/tablecmds.c:6930 +#, c-format +msgid "Use ALTER ... CASCADE to alter the typed tables too." +msgstr "ტიპიზირებული ცხრილების ჩáƒáƒ¡áƒáƒ¡áƒ¬áƒáƒ áƒ”ბლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ALTER ... CASCADE." + +#: commands/tablecmds.c:6976 +#, c-format +msgid "type %s is not a composite type" +msgstr "ტიპი %s კáƒáƒ›áƒžáƒáƒ–იტური áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:7003 +#, c-format +msgid "cannot add column to typed table" +msgstr "ტიპიზირებულ ცხრილში სვეტების ჩáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ" + +#: commands/tablecmds.c:7051 +#, c-format +msgid "cannot add column to a partition" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ¡ სვეტს ვერ დáƒáƒ£áƒ›áƒáƒ¢áƒ”ბთ" + +#: commands/tablecmds.c:7080 commands/tablecmds.c:15760 +#, c-format +msgid "child table \"%s\" has different type for column \"%s\"" +msgstr "შვილ ცხრილს \"%s\" სვეტისთვის \"%s\" სხვრტიპი გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/tablecmds.c:7086 commands/tablecmds.c:15766 +#, c-format +msgid "child table \"%s\" has different collation for column \"%s\"" +msgstr "შვილ ცხრილს \"%s\" სვეტისთვის \"%s\" სხვრკáƒáƒšáƒáƒªáƒ˜áƒ გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/tablecmds.c:7104 +#, c-format +msgid "merging definition of column \"%s\" for child \"%s\"" +msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს áƒáƒ¦áƒ¬áƒ”რის შერწყმრსვეტისთვის \"%s\" შვილისთვის \"%s\"" + +#: commands/tablecmds.c:7157 +#, c-format +msgid "cannot recursively add identity column to table that has child tables" +msgstr "ცხრილისთვის, რáƒáƒ›áƒ”ლსáƒáƒª შვილი ცხრილები გáƒáƒáƒ©áƒœáƒ˜áƒ, იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტის რეკურსიული დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ" + +#: commands/tablecmds.c:7370 +#, c-format +msgid "column must be added to child tables too" +msgstr "სვეტი შვილ ცხრილებსáƒáƒª უნდრდáƒáƒ”მáƒáƒ¢áƒáƒ—" + +#: commands/tablecmds.c:7448 +#, c-format +msgid "column \"%s\" of relation \"%s\" already exists, skipping" +msgstr "ურთიერთáƒáƒ‘ის (%2$s) სვეტი %1$s უკვე რსებáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/tablecmds.c:7455 +#, c-format +msgid "column \"%s\" of relation \"%s\" already exists" +msgstr "ურთიერთáƒáƒ‘ის (%2$s) სვეტი %1$s უკვე რსებáƒáƒ‘ს" + +#: commands/tablecmds.c:7521 commands/tablecmds.c:12564 +#, c-format +msgid "cannot remove constraint from only the partitioned table when partitions exist" +msgstr "შეზღუდვის წáƒáƒ¨áƒšáƒ მხáƒáƒšáƒáƒ“ დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილიდáƒáƒœ მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბი áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, შეუძლებელიáƒ" + +#: commands/tablecmds.c:7522 commands/tablecmds.c:7836 commands/tablecmds.c:8014 commands/tablecmds.c:8121 commands/tablecmds.c:8238 commands/tablecmds.c:9057 commands/tablecmds.c:12565 +#, c-format +msgid "Do not specify the ONLY keyword." +msgstr "ONLY áƒáƒ  მიუთითáƒáƒ—." + +#: commands/tablecmds.c:7558 commands/tablecmds.c:7762 commands/tablecmds.c:7904 commands/tablecmds.c:8036 commands/tablecmds.c:8165 commands/tablecmds.c:8259 commands/tablecmds.c:8360 commands/tablecmds.c:8517 commands/tablecmds.c:8670 commands/tablecmds.c:8751 commands/tablecmds.c:8885 commands/tablecmds.c:12718 commands/tablecmds.c:14249 commands/tablecmds.c:16875 +#, c-format +msgid "cannot alter system column \"%s\"" +msgstr "სისტემური სვეტის \"%s\" შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:7564 commands/tablecmds.c:7910 +#, c-format +msgid "column \"%s\" of relation \"%s\" is an identity column" +msgstr "ურთიერთáƒáƒ‘ის \"%2$s\" სვეტი \"%1$s\" იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ სვეტიáƒ" + +#: commands/tablecmds.c:7605 +#, c-format +msgid "column \"%s\" is in a primary key" +msgstr "სვეტი \"%s\" პირველáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბიáƒ" + +#: commands/tablecmds.c:7610 +#, c-format +msgid "column \"%s\" is in index used as replica identity" +msgstr "სვეტი \"%s\" რეპლიკის იდენტიფიკáƒáƒ¢áƒáƒ áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული ინდექსიáƒ" + +#: commands/tablecmds.c:7633 +#, c-format +msgid "column \"%s\" is marked NOT NULL in parent table" +msgstr "სვეტი \"%s\" მშáƒáƒ‘ელ ცხრილში NOT NULL-ით დáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:7833 commands/tablecmds.c:9541 +#, c-format +msgid "constraint must be added to child tables too" +msgstr "შეზღუდვრშვილ ცხრილებსáƒáƒª უნდრდáƒáƒ”მáƒáƒ¢áƒáƒ—" + +#: commands/tablecmds.c:7834 +#, c-format +msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." +msgstr "ურთიერთáƒáƒ‘ის \"%2$s\" სვეტი \"%1$s\" უკვე NOT NULL áƒáƒ áƒáƒ." + +#: commands/tablecmds.c:7919 +#, c-format +msgid "column \"%s\" of relation \"%s\" is a generated column" +msgstr "ურთიერთáƒáƒ‘ის \"%2$s\" სვეტი \"%1$s\" გენერირებული სვეტიáƒ" + +#: commands/tablecmds.c:8013 +#, c-format +msgid "cannot add identity to a column of only the partitioned table" +msgstr "მხáƒáƒšáƒáƒ“, დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილში იდენტიფიკáƒáƒªáƒ˜áƒáƒ¡ სვეტს ვერ დáƒáƒáƒ›áƒáƒ¢áƒ”ბთ" + +#: commands/tablecmds.c:8019 +#, c-format +msgid "cannot add identity to a column of a partition" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ¡ სვეტს იდენტიფიკáƒáƒ¢áƒáƒ áƒ¡ ვერ დáƒáƒ£áƒ›áƒáƒ¢áƒ”ბთ" + +#: commands/tablecmds.c:8047 +#, c-format +msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" +msgstr "ურთიერთáƒáƒ‘ის \"%2$s\" სვეტი \"%1$s\" უნდრáƒáƒ¦áƒ¬áƒ”რáƒáƒ— რáƒáƒ’áƒáƒ áƒª NOT NULL მáƒáƒœáƒáƒ›áƒ“ე, სáƒáƒœáƒáƒ› იდენტიფიკáƒáƒªáƒ˜áƒáƒ¡ დáƒáƒáƒ›áƒáƒ¢áƒ”ბთ" + +#: commands/tablecmds.c:8053 +#, c-format +msgid "column \"%s\" of relation \"%s\" is already an identity column" +msgstr "ურთიერთáƒáƒ‘ის \"%2$s\" სვეტი \"%1$s\" უკვე იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ სვეტიáƒ" + +#: commands/tablecmds.c:8059 +#, c-format +msgid "column \"%s\" of relation \"%s\" already has a default value" +msgstr "ურთიერთáƒáƒ‘ის \"%2$s\" სვეტს \"%1$s\" ნáƒáƒ’ულისხმევი მნიშვნელáƒáƒ‘რუკვე გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/tablecmds.c:8120 +#, c-format +msgid "cannot change identity column of only the partitioned table" +msgstr "მხáƒáƒšáƒáƒ“, დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტს ვერ შეცვლით" + +#: commands/tablecmds.c:8126 +#, c-format +msgid "cannot change identity column of a partition" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტს ვერ შეცვლით" + +#: commands/tablecmds.c:8171 commands/tablecmds.c:8267 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not an identity column" +msgstr "ურთიერთáƒáƒ‘ის \"%2$s\" სვეტი \"%1$s\" იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ სვეტი áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:8237 +#, c-format +msgid "cannot drop identity from a column of only the partitioned table" +msgstr "მხáƒáƒšáƒáƒ“, დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილში სვეტიდáƒáƒœ იდენტიფიკáƒáƒªáƒ˜áƒáƒ¡ ვერ წáƒáƒ¨áƒšáƒ˜áƒ—" + +#: commands/tablecmds.c:8243 +#, c-format +msgid "cannot drop identity from a column of a partition" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ¡ სვეტიდáƒáƒœ იდენტიფიკáƒáƒ¢áƒáƒ áƒ¡ ვერ წáƒáƒ¨áƒšáƒ˜áƒ—" + +#: commands/tablecmds.c:8272 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" +msgstr "ურთიერთáƒáƒ‘ის \"%2$s\" სვეტი \"%1$s\" იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ სვეტი áƒáƒ áƒáƒ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/tablecmds.c:8366 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not a generated column" +msgstr "ურთიერთáƒáƒ‘ის \"%2$s\" სვეტი \"%1$s\" გენერირებული სვეტი áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:8464 +#, c-format +msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" +msgstr "ALTER TABLE / DROP EXPRESSION შვილ ცხრილებზეც უნდრგáƒáƒ“áƒáƒ¢áƒáƒ áƒ“ეს" + +#: commands/tablecmds.c:8486 +#, c-format +msgid "cannot drop generation expression from inherited column" +msgstr "მემკვიდრეáƒáƒ‘ითი სვეტიდáƒáƒœ გენერáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: commands/tablecmds.c:8525 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not a stored generated column" +msgstr "ურთიერთáƒáƒ‘ის \"%2$s\" სვეტი \"%1$s\" დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებული გენერირებული სვეტი áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:8530 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" +msgstr "ურთიერთáƒáƒ‘ის \"%2$s\" სვეტი \"%1$s\" დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებული გენერირებული სვეტი áƒáƒ áƒáƒ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/tablecmds.c:8608 +#, c-format +msgid "cannot refer to non-index column by number" +msgstr "áƒáƒ áƒ-ინდექსი სვეტის ნáƒáƒ›áƒ áƒ˜áƒ— მიმáƒáƒ áƒ—ვრშეუძლებელიáƒ" + +#: commands/tablecmds.c:8660 +#, c-format +msgid "column number %d of relation \"%s\" does not exist" +msgstr "ურთიერთáƒáƒ‘ის (%2$s) სვეტი (%1$d) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/tablecmds.c:8679 +#, c-format +msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" +msgstr "ინდექსის \"%2$s\" ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ სვეტის \"%1$s\" სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:8684 +#, c-format +msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" +msgstr "" + +#: commands/tablecmds.c:8686 +#, c-format +msgid "Alter statistics on table column instead." +msgstr "áƒáƒ›áƒ˜áƒ¡ ნáƒáƒªáƒ•ლáƒáƒ“ ცხრილის სვეტის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ შეცვáƒáƒšáƒ”თ." + +#: commands/tablecmds.c:8932 +#, c-format +msgid "cannot drop column from typed table" +msgstr "ტიპიზირებული ცხრილის სვეტის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: commands/tablecmds.c:8995 +#, c-format +msgid "column \"%s\" of relation \"%s\" does not exist, skipping" +msgstr "სვეტი \"%s\" ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/tablecmds.c:9008 +#, c-format +msgid "cannot drop system column \"%s\"" +msgstr "სისტემური სვეტის \"%s\" წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: commands/tablecmds.c:9018 +#, c-format +msgid "cannot drop inherited column \"%s\"" +msgstr "მემკვიდრეáƒáƒ‘ით მიღებული სვეტის \"%s\" წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: commands/tablecmds.c:9031 +#, c-format +msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" +msgstr "" + +#: commands/tablecmds.c:9056 +#, c-format +msgid "cannot drop column from only the partitioned table when partitions exist" +msgstr "" + +#: commands/tablecmds.c:9261 +#, c-format +msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" +msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX დáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილებზე მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: commands/tablecmds.c:9286 +#, c-format +msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" +msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX ინდექსის სáƒáƒ®áƒ”ლს \"%s\"-დáƒáƒœ \"%s\"-ზე გáƒáƒ“áƒáƒáƒ áƒ¥áƒ›áƒ”ვს" + +#: commands/tablecmds.c:9623 +#, c-format +msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" +msgstr "" + +#: commands/tablecmds.c:9629 +#, c-format +msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" +msgstr "" + +#: commands/tablecmds.c:9632 +#, c-format +msgid "This feature is not yet supported on partitioned tables." +msgstr "ეს áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილებისთვის ჯერჯერáƒáƒ‘ით მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: commands/tablecmds.c:9639 commands/tablecmds.c:10095 +#, c-format +msgid "referenced relation \"%s\" is not a table" +msgstr "მითითებული ურთიერთáƒáƒ‘რ\"%s\" ცხრილი áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:9662 +#, c-format +msgid "constraints on permanent tables may reference only permanent tables" +msgstr "მუდმივ ცხრილებზე áƒáƒ áƒ¡áƒ”ბული შეზღუდვები მხáƒáƒšáƒáƒ“ მუდმივ ცხრილებზე შეიძლებáƒ, მიუთითებდეს" + +#: commands/tablecmds.c:9669 +#, c-format +msgid "constraints on unlogged tables may reference only permanent or unlogged tables" +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ გáƒáƒ áƒ”შე მყáƒáƒ¤áƒ˜ ცხრილების შეზღუდვები მხáƒáƒšáƒáƒ“ მუდმივ áƒáƒœ ჟურნáƒáƒšáƒ˜áƒ¡ გáƒáƒ áƒ”შე მყáƒáƒ¤ ცხრილებზე შეიძლებáƒ, მიუთითებდეს" + +#: commands/tablecmds.c:9675 +#, c-format +msgid "constraints on temporary tables may reference only temporary tables" +msgstr "დრáƒáƒ”ბით ცხრილებზე áƒáƒ áƒ¡áƒ”ბული შეზღუდვები მხáƒáƒšáƒáƒ“ დრáƒáƒ”ბით ცხრილებზე შეიძლებáƒ, მიუთითებდეს" + +#: commands/tablecmds.c:9679 +#, c-format +msgid "constraints on temporary tables must involve temporary tables of this session" +msgstr "დრáƒáƒ”ბითი ცხრილის შეზღუდვები მიმდინáƒáƒ áƒ” სესიის დრáƒáƒ”ბით ცხრილებს უნდრმიმáƒáƒ áƒ—áƒáƒ•დეს" + +#: commands/tablecmds.c:9743 commands/tablecmds.c:9749 +#, c-format +msgid "invalid %s action for foreign key constraint containing generated column" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ქმედებრ%s გáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვის შემცველი გენერირებული სვეტისთვის" + +#: commands/tablecmds.c:9765 +#, c-format +msgid "number of referencing and referenced columns for foreign key disagree" +msgstr "" + +#: commands/tablecmds.c:9872 +#, c-format +msgid "foreign key constraint \"%s\" cannot be implemented" +msgstr "გáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვის \"%s\" გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:9874 +#, c-format +msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." +msgstr "გáƒáƒ¡áƒáƒ¦áƒ”ბის სვეტები \"%s\" დრ\"%s\" შეუთáƒáƒ•სებელი ტიპებისáƒáƒ: %s დრ%s." + +#: commands/tablecmds.c:10031 +#, c-format +msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" +msgstr "" + +#: commands/tablecmds.c:10305 commands/tablecmds.c:10775 parser/parse_utilcmd.c:797 parser/parse_utilcmd.c:920 +#, c-format +msgid "foreign key constraints are not supported on foreign tables" +msgstr "გáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვები გáƒáƒ áƒ” ცხრილებზე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:11328 commands/tablecmds.c:11609 commands/tablecmds.c:12521 commands/tablecmds.c:12595 +#, c-format +msgid "constraint \"%s\" of relation \"%s\" does not exist" +msgstr "ურთიერთáƒáƒ‘ის \"%2$s\" შეზღუდვრ\"%1$s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/tablecmds.c:11335 +#, c-format +msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" +msgstr "ურთიერთáƒáƒ‘ის (\"%2$s\") შეზღუდვრ\"%1$s\" გáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვრáƒáƒ áƒáƒ" + +#: commands/tablecmds.c:11373 +#, c-format +msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘áƒáƒ–ე \"%2$s\" შეზღუდვის \"%1$s\" შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:11376 +#, c-format +msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." +msgstr "შეზღუდვრ\"%1$s\" ურთიერთáƒáƒ‘ის \"%3$s\" შეზღუდვიდáƒáƒœáƒ \"%2$s\"-ირნáƒáƒ¬áƒáƒ áƒ›áƒáƒ”ბი." + +#: commands/tablecmds.c:11378 +#, c-format +msgid "You may alter the constraint it derives from instead." +msgstr "" + +#: commands/tablecmds.c:11617 +#, c-format +msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" +msgstr "ურთიერთáƒáƒ‘ის (\"%2$s\") შეზღუდვრ\"%1$s\" გáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბი áƒáƒœ შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვრáƒáƒ áƒáƒ" + +#: commands/tablecmds.c:11694 +#, c-format +msgid "constraint must be validated on child tables too" +msgstr "შეზღუდვრშვილ ცხრილებზეც უნდრგáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ“ეს" + +#: commands/tablecmds.c:11781 +#, c-format +msgid "column \"%s\" referenced in foreign key constraint does not exist" +msgstr "გáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვáƒáƒ¨áƒ˜ მითითებული სვეტი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/tablecmds.c:11787 +#, c-format +msgid "system columns cannot be used in foreign keys" +msgstr "უცხრგáƒáƒ¡áƒáƒ¦áƒ”ბებში სისტემურ სვეტებს ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/tablecmds.c:11791 +#, c-format +msgid "cannot have more than %d keys in a foreign key" +msgstr "გáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბში %d გáƒáƒ¡áƒáƒ¦áƒ”ბზე მეტი ვერ გექნებáƒáƒ—" + +#: commands/tablecmds.c:11856 +#, c-format +msgid "cannot use a deferrable primary key for referenced table \"%s\"" +msgstr "" + +#: commands/tablecmds.c:11873 +#, c-format +msgid "there is no primary key for referenced table \"%s\"" +msgstr "მითითებული ცხრილისთვის \"%s\" ძირითáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/tablecmds.c:11941 +#, c-format +msgid "foreign key referenced-columns list must not contain duplicates" +msgstr "" + +#: commands/tablecmds.c:12033 +#, c-format +msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" +msgstr "" + +#: commands/tablecmds.c:12038 +#, c-format +msgid "there is no unique constraint matching given keys for referenced table \"%s\"" +msgstr "" + +#: commands/tablecmds.c:12477 +#, c-format +msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" +msgstr "მემკვიდრეáƒáƒ‘ით მიღებული ურთიერთáƒáƒ‘ის \"%2$s\" შეზღუდვის \"%1$s\" წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: commands/tablecmds.c:12527 +#, c-format +msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" +msgstr "ურთიერთáƒáƒ‘ის (\"%2$s\") შეზღუდვრ(\"%1$s\") áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/tablecmds.c:12702 +#, c-format +msgid "cannot alter column type of typed table" +msgstr "ტიპიზირებული ცხრილის სვეტის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:12729 +#, c-format +msgid "cannot alter inherited column \"%s\"" +msgstr "მემკვიდრეáƒáƒ‘ით მიღებული სვეტის \"%s\" შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:12738 +#, c-format +msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" +msgstr "სვეტის \"%s\" შეცვლრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ ის ურთიერთáƒáƒ‘ის \"%s\" დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბის ნáƒáƒ¬áƒ˜áƒšáƒ˜áƒ" + +#: commands/tablecmds.c:12788 +#, c-format +msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" +msgstr "" + +#: commands/tablecmds.c:12791 +#, c-format +msgid "You might need to add an explicit cast." +msgstr "შეიძლებრáƒáƒ¨áƒ™áƒáƒ áƒ დáƒáƒ™áƒáƒ¡áƒ¢áƒ•რუნდრდáƒáƒáƒ›áƒáƒ¢áƒáƒ—." + +#: commands/tablecmds.c:12795 +#, c-format +msgid "column \"%s\" cannot be cast automatically to type %s" +msgstr "სვეტის \"%s\" áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ დáƒáƒ™áƒáƒ¡áƒ¢áƒ•რტიპáƒáƒ›áƒ“ე %s შეუძლებელიáƒ" + +#. translator: USING is SQL, don't translate it +#: commands/tablecmds.c:12798 +#, c-format +msgid "You might need to specify \"USING %s::%s\"." +msgstr "შეიძლებáƒ, გჭირდებáƒáƒ—, მიუთითáƒáƒ— \"USING %s::%s\"." + +#: commands/tablecmds.c:12897 +#, c-format +msgid "cannot alter inherited column \"%s\" of relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘ის \"%2$s\" სვეტის \"%1$s\" შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:12926 +#, c-format +msgid "USING expression contains a whole-row table reference." +msgstr "" + +#: commands/tablecmds.c:12937 +#, c-format +msgid "type of inherited column \"%s\" must be changed in child tables too" +msgstr "" + +#: commands/tablecmds.c:13062 +#, c-format +msgid "cannot alter type of column \"%s\" twice" +msgstr "სვეტის (\"%s\") ტიპის áƒáƒ áƒ¯áƒ”რ შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:13100 +#, c-format +msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" +msgstr "" + +#: commands/tablecmds.c:13105 +#, c-format +msgid "default for column \"%s\" cannot be cast automatically to type %s" +msgstr "" + +#: commands/tablecmds.c:13409 +#, c-format +msgid "cannot alter type of a column used by a function or procedure" +msgstr "ფუნქციის áƒáƒœ პრáƒáƒªáƒ”დურის მიერ გáƒáƒ›áƒáƒ§áƒ”ნებული სვეტის ტიპის შექმნრშეუძლებელიáƒ" + +#: commands/tablecmds.c:13410 commands/tablecmds.c:13425 commands/tablecmds.c:13445 commands/tablecmds.c:13464 commands/tablecmds.c:13523 +#, c-format +msgid "%s depends on column \"%s\"" +msgstr "%s ეყრდნáƒáƒ‘რსვეტს \"%s\"" + +#: commands/tablecmds.c:13424 +#, c-format +msgid "cannot alter type of a column used by a view or rule" +msgstr "ხედის áƒáƒœ წესის მიერ გáƒáƒ›áƒáƒ§áƒ”ნებული სვეტის ტიპის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:13444 +#, c-format +msgid "cannot alter type of a column used in a trigger definition" +msgstr "ტრიგერის áƒáƒ¦áƒ¬áƒ”რáƒáƒ¨áƒ˜ გáƒáƒ›áƒáƒ§áƒ”ნებული სვეტის ტიპის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:13463 +#, c-format +msgid "cannot alter type of a column used in a policy definition" +msgstr "პáƒáƒšáƒ˜áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒáƒ¨áƒ˜ გáƒáƒ›áƒáƒ§áƒ”ნებული სვეტის ტიპის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:13494 +#, c-format +msgid "cannot alter type of a column used by a generated column" +msgstr "გენერირებული სვეტის მიერ გáƒáƒ›áƒáƒ§áƒ”ნებული სვეტის ტიპის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:13495 +#, c-format +msgid "Column \"%s\" is used by generated column \"%s\"." +msgstr "სვეტი (%s\") გენერირებული სვეტის (%s) მიერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ." + +#: commands/tablecmds.c:13522 +#, c-format +msgid "cannot alter type of a column used by a publication WHERE clause" +msgstr "გáƒáƒ›áƒáƒªáƒ”მის WHERE პირáƒáƒ‘ის მიერ გáƒáƒ›áƒáƒ§áƒ”ნებული სვეტის ტიპის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:14357 commands/tablecmds.c:14369 +#, c-format +msgid "cannot change owner of index \"%s\"" +msgstr "ინდექსის \"%s\" მფლáƒáƒ‘ელის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:14359 commands/tablecmds.c:14371 +#, c-format +msgid "Change the ownership of the index's table instead." +msgstr "áƒáƒ›áƒ˜áƒ¡ მáƒáƒ’იერ ინდექსის ცხრილის მფლáƒáƒ‘ელი შეცვáƒáƒšáƒ”თ." + +#: commands/tablecmds.c:14385 +#, c-format +msgid "cannot change owner of sequence \"%s\"" +msgstr "მიმდევრáƒáƒ‘ის \"%s\" მფლáƒáƒ‘ელის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:14410 +#, c-format +msgid "cannot change owner of relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘ის \"%s\" მფლáƒáƒ‘ელის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:14877 +#, c-format +msgid "cannot have multiple SET TABLESPACE subcommands" +msgstr "ერთზე მეტი SET TABLESPACE ქვებრძáƒáƒœáƒ”ბრვერ გექნებáƒáƒ—" + +#: commands/tablecmds.c:14954 +#, c-format +msgid "cannot set options for relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘ის (%s) პáƒáƒ áƒáƒ›áƒ”ტრების დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:14988 commands/view.c:440 +#, c-format +msgid "WITH CHECK OPTION is supported only on automatically updatable views" +msgstr "WITH CHECK OPTION მხáƒáƒšáƒáƒ“ áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ ხედებზერმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი" + +#: commands/tablecmds.c:15238 +#, c-format +msgid "only tables, indexes, and materialized views exist in tablespaces" +msgstr "ცხრილის სივრცეში მხáƒáƒšáƒáƒ“ ცხრილები, ინდექსები დრმáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედები შეიძლებრáƒáƒ áƒ¡áƒ”ბáƒáƒ‘დეს" + +#: commands/tablecmds.c:15250 +#, c-format +msgid "cannot move relations in to or out of pg_global tablespace" +msgstr "ცხრილების სივრცეში pg_globl ურთიერთáƒáƒ‘ების შეტáƒáƒœáƒ/გáƒáƒ›áƒáƒ¢áƒáƒœáƒ შეუძლებელიáƒ" + +#: commands/tablecmds.c:15342 +#, c-format +msgid "aborting because lock on relation \"%s.%s\" is not available" +msgstr "შეწყვეტáƒ, რáƒáƒ“გáƒáƒœ ბლáƒáƒ™áƒ˜ ურთიერთáƒáƒ‘áƒáƒ–ე \"%s.%s\" ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:15358 +#, c-format +msgid "no matching relations in tablespace \"%s\" found" +msgstr "ცხრილების სივრცეში \"%s\" ურთიერთáƒáƒ‘áƒ, რáƒáƒ›áƒ”ლიც ემთხვევáƒ, ვერ ვიპáƒáƒ•ე" + +#: commands/tablecmds.c:15480 +#, c-format +msgid "cannot change inheritance of typed table" +msgstr "ტიპიზირებული ცხრილის მემკვიდრეáƒáƒ‘ითáƒáƒ‘ის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:15485 commands/tablecmds.c:15985 +#, c-format +msgid "cannot change inheritance of a partition" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ მემკვიდრეáƒáƒ‘ითáƒáƒ‘ის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:15490 +#, c-format +msgid "cannot change inheritance of partitioned table" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილის მემკვიდრეáƒáƒ‘ითáƒáƒ‘ის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:15536 +#, c-format +msgid "cannot inherit to temporary relation of another session" +msgstr "სხვრსესიის დრáƒáƒ”ბითი ურთიერთáƒáƒ‘ის მემკვიდრეáƒáƒ‘ით მიღებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:15549 +#, c-format +msgid "cannot inherit from a partition" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ“áƒáƒœ მემკვიდრეáƒáƒ‘ითáƒáƒ‘რშეუძლებელიáƒ" + +#: commands/tablecmds.c:15571 commands/tablecmds.c:18453 +#, c-format +msgid "circular inheritance not allowed" +msgstr "წრიული მემკვიდრეáƒáƒ‘ითáƒáƒ‘რდáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: commands/tablecmds.c:15572 commands/tablecmds.c:18454 +#, c-format +msgid "\"%s\" is already a child of \"%s\"." +msgstr "\"%s\" უკვე \"%s\"-ის შვილიáƒ." + +#: commands/tablecmds.c:15585 +#, c-format +msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" +msgstr "ტრიგერი \"%s\" ხელს უშლის ცხრილს \"%s\" მემკვიდრეáƒáƒ‘ის შვილáƒáƒ“ გáƒáƒ“áƒáƒ˜áƒ¥áƒªáƒ”ს" + +#: commands/tablecmds.c:15587 +#, c-format +msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." +msgstr "ROW ტრიგერები, რáƒáƒ›áƒšáƒ”ბსáƒáƒª გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ცხრილები გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, მემკვიდრეáƒáƒ‘ითáƒáƒ‘ის იერáƒáƒ áƒ¥áƒ˜áƒ”ბში მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: commands/tablecmds.c:15776 +#, c-format +msgid "column \"%s\" in child table must be marked NOT NULL" +msgstr "სვეტი \"%s\" შვილ ცხრილში NOT NULL-ით უნდრიყáƒáƒ¡ დáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜" + +#: commands/tablecmds.c:15785 +#, c-format +msgid "column \"%s\" in child table must be a generated column" +msgstr "შვილ ცხრილში სვეტი \"%s\" გენერირებული სვეტი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/tablecmds.c:15789 +#, c-format +msgid "column \"%s\" in child table must not be a generated column" +msgstr "შვილ ცხრილში სვეტი \"%s\" გენერირებული სვეტი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/tablecmds.c:15827 +#, c-format +msgid "child table is missing column \"%s\"" +msgstr "შვილ ცხრილს áƒáƒ™áƒšáƒ˜áƒ სვეტი \"%s\"" + +#: commands/tablecmds.c:15908 +#, c-format +msgid "child table \"%s\" has different definition for check constraint \"%s\"" +msgstr "შვილ ცხრილს \"%s\" შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვისთვის \"%s\" სხვრგáƒáƒœáƒ¡áƒáƒ–ღვრებრგáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/tablecmds.c:15915 +#, c-format +msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" +msgstr "შეზღუდვრ\"%s\" კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ¨áƒ˜áƒ áƒáƒ áƒ-მემკვიდრეáƒáƒ‘ით მიღებულ შეზღუდვáƒáƒ¡áƒ—áƒáƒœ შვილ ცხრილზე \"%s\"" + +#: commands/tablecmds.c:15925 +#, c-format +msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" +msgstr "შეზღუდვრ\"%s\" კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ¨áƒ˜áƒ შეზღუდვáƒáƒ¡áƒ—áƒáƒœ NOT VALID შვილ ცხრილზე \"%s\"" + +#: commands/tablecmds.c:15963 +#, c-format +msgid "child table is missing constraint \"%s\"" +msgstr "შვილ ცხრილს áƒáƒ™áƒšáƒ˜áƒ შეზღუდვრ\"%s\"" + +#: commands/tablecmds.c:16049 +#, c-format +msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜ \"%s\" უკვე დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილიდáƒáƒœ \"%s.%s\" მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ რიგშიáƒ" + +#: commands/tablecmds.c:16078 commands/tablecmds.c:16124 parser/parse_utilcmd.c:3261 +#, c-format +msgid "relation \"%s\" is not a partition of relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘რ\"%s\" ურთიერთáƒáƒ‘ის \"%s\" დáƒáƒœáƒáƒ§áƒáƒ¤áƒ¡ áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: commands/tablecmds.c:16130 +#, c-format +msgid "relation \"%s\" is not a parent of relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘რ\"%s\" ურთიერთáƒáƒ‘ის \"%s\" მშáƒáƒ‘ელს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: commands/tablecmds.c:16357 +#, c-format +msgid "typed tables cannot inherit" +msgstr "ტიპიზირებულ ცხრილებს მემკვიდრეáƒáƒ‘ითáƒáƒ‘რáƒáƒ  შეუძლიáƒáƒ—" + +#: commands/tablecmds.c:16387 +#, c-format +msgid "table is missing column \"%s\"" +msgstr "ცხრილს áƒáƒ™áƒšáƒ˜áƒ სვეტი \"%s\"" + +#: commands/tablecmds.c:16398 +#, c-format +msgid "table has column \"%s\" where type requires \"%s\"" +msgstr "ცხრილს áƒáƒ¥áƒ•ს სვეტი \"%s\" მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ ტიპი \"%s\"-ს მáƒáƒ˜áƒ—ხáƒáƒ•ს" + +#: commands/tablecmds.c:16407 +#, c-format +msgid "table \"%s\" has different type for column \"%s\"" +msgstr "ცხრილს \"%s\" სვეტისთვის \"%s\" სხვრტიპი áƒáƒ¥áƒ•ს" + +#: commands/tablecmds.c:16421 +#, c-format +msgid "table has extra column \"%s\"" +msgstr "ცხრილს áƒáƒ¥áƒ•ს დáƒáƒ›áƒáƒ¢áƒ”ბითი სვეტი \"%s\"" + +#: commands/tablecmds.c:16473 +#, c-format +msgid "\"%s\" is not a typed table" +msgstr "\"%s\" ტიპიზირებული ცხრილი áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:16647 +#, c-format +msgid "cannot use non-unique index \"%s\" as replica identity" +msgstr "áƒáƒ áƒáƒ£áƒœáƒ˜áƒ™áƒáƒšáƒ£áƒ  ინდექსს \"%s\" რეპლიკის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/tablecmds.c:16653 +#, c-format +msgid "cannot use non-immediate index \"%s\" as replica identity" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ£áƒ§áƒáƒ•ნებლივ ინდექსს \"%s\" რეპლიკის იდენფიტიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/tablecmds.c:16659 +#, c-format +msgid "cannot use expression index \"%s\" as replica identity" +msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ინდექსს \"%s\" რეპლიკის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/tablecmds.c:16665 +#, c-format +msgid "cannot use partial index \"%s\" as replica identity" +msgstr "ნáƒáƒ¬áƒ˜áƒšáƒáƒ‘რივი ინდექსის (\"%s\") რეპლიკის იდენტიფიკáƒáƒ¢áƒáƒ áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:16682 +#, c-format +msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" +msgstr "ინდექსს \"%s\" რეპლიკის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ, რáƒáƒ“გáƒáƒœ სვეტი %d სისტემური სვეტიáƒ" + +#: commands/tablecmds.c:16689 +#, c-format +msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" +msgstr "ინდექსს \"%s\" რეპლიკის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ, რáƒáƒ“გáƒáƒœ სვეტი %s გáƒáƒœáƒ£áƒšáƒ”ბáƒáƒ“იáƒ" + +#: commands/tablecmds.c:16941 +#, c-format +msgid "cannot change logged status of table \"%s\" because it is temporary" +msgstr "ცხრილის \"%s\" ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რის სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ შეცვლრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ ის დრáƒáƒ”ბითიáƒ" + +#: commands/tablecmds.c:16965 +#, c-format +msgid "cannot change table \"%s\" to unlogged because it is part of a publication" +msgstr "" + +#: commands/tablecmds.c:16967 +#, c-format +msgid "Unlogged relations cannot be replicated." +msgstr "უჟურნáƒáƒšáƒ ურთიერთáƒáƒ‘ების რეპლიკáƒáƒªáƒ˜áƒ შეუძლებელიáƒ." + +#: commands/tablecmds.c:17012 +#, c-format +msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" +msgstr "" + +#: commands/tablecmds.c:17022 +#, c-format +msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" +msgstr "" + +#: commands/tablecmds.c:17080 +#, c-format +msgid "cannot move an owned sequence into another schema" +msgstr "" + +#: commands/tablecmds.c:17185 +#, c-format +msgid "relation \"%s\" already exists in schema \"%s\"" +msgstr "სქემáƒáƒ¨áƒ˜ (%2$s) ურთიერთáƒáƒ‘რ(%1$s) უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/tablecmds.c:17606 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "\"%s\" ცხრილი áƒáƒœ მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედი áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:17759 +#, c-format +msgid "\"%s\" is not a composite type" +msgstr "ტიპი %s კáƒáƒ›áƒžáƒáƒ–იტური áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:17789 +#, c-format +msgid "cannot change schema of index \"%s\"" +msgstr "ინდექსის (%s) სქემის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:17791 commands/tablecmds.c:17805 +#, c-format +msgid "Change the schema of the table instead." +msgstr "áƒáƒ›áƒ˜áƒ¡ მáƒáƒ’იერ ცხრილის სქემრშეცვლáƒáƒ—." + +#: commands/tablecmds.c:17795 +#, c-format +msgid "cannot change schema of composite type \"%s\"" +msgstr "კáƒáƒ›áƒžáƒáƒ–იტური ტიპის (%s) სქემის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:17803 +#, c-format +msgid "cannot change schema of TOAST table \"%s\"" +msgstr "\"TOAST\" ცხრილის (%s) სქემის შეცვლრშეუძლებელიáƒ" + +#: commands/tablecmds.c:17835 +#, c-format +msgid "cannot use \"list\" partition strategy with more than one column" +msgstr "ერთზე მეტ სვეტთáƒáƒœ ერთáƒáƒ“ დáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ სტრáƒáƒ¢áƒ”გიáƒáƒ¡ \"list\" ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/tablecmds.c:17901 +#, c-format +msgid "column \"%s\" named in partition key does not exist" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბში დáƒáƒ¡áƒáƒ®áƒ”ლებული სვეტი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/tablecmds.c:17909 +#, c-format +msgid "cannot use system column \"%s\" in partition key" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბში სისტემური სვეტის (%s) გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:17920 commands/tablecmds.c:18010 +#, c-format +msgid "cannot use generated column in partition key" +msgstr "გენერირებულ სვეტს დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბში ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/tablecmds.c:17921 commands/tablecmds.c:18011 commands/trigger.c:656 rewrite/rewriteHandler.c:934 rewrite/rewriteHandler.c:969 +#, c-format +msgid "Column \"%s\" is a generated column." +msgstr "სვეტი \"%s\" გენერირებული სვეტიáƒ." + +#: commands/tablecmds.c:17993 +#, c-format +msgid "partition key expressions cannot contain system column references" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბები, áƒáƒ  შეიძლებáƒ, სისტემურ სვეტზე მითითებებს შეიცáƒáƒ•დნენ" + +#: commands/tablecmds.c:18040 +#, c-format +msgid "functions in partition key expression must be marked IMMUTABLE" +msgstr "ფუნქცირდáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨áƒ˜ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ უნდრიყáƒáƒ¡ მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜, რáƒáƒ’áƒáƒ áƒª IMMUTABLE" + +#: commands/tablecmds.c:18049 +#, c-format +msgid "cannot use constant expression as partition key" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨áƒ˜ მუდმივ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/tablecmds.c:18070 +#, c-format +msgid "could not determine which collation to use for partition expression" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბისáƒáƒ—ვის კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ“გენრშეუძლებელიáƒ" + +#: commands/tablecmds.c:18105 +#, c-format +msgid "You must specify a hash operator class or define a default hash operator class for the data type." +msgstr "" + +#: commands/tablecmds.c:18111 +#, c-format +msgid "You must specify a btree operator class or define a default btree operator class for the data type." +msgstr "" + +#: commands/tablecmds.c:18393 +#, c-format +msgid "\"%s\" is already a partition" +msgstr "\"%s\" უკვე დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ" + +#: commands/tablecmds.c:18399 +#, c-format +msgid "cannot attach a typed table as partition" +msgstr "ტიპიზირებული ცხრილის, რáƒáƒ’áƒáƒ áƒª დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ მიბმრშეუძლებელიáƒ" + +#: commands/tablecmds.c:18415 +#, c-format +msgid "cannot attach inheritance child as partition" +msgstr "მემკვიდრეáƒáƒ‘ის შვილის დáƒáƒœáƒáƒ§áƒáƒ¤áƒáƒ“ მიმáƒáƒ’რებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:18429 +#, c-format +msgid "cannot attach inheritance parent as partition" +msgstr "მემკვიდრეáƒáƒ‘ის მშáƒáƒ‘ლის დáƒáƒœáƒáƒ§áƒáƒ¤áƒáƒ“ მიმáƒáƒ’რებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:18463 +#, c-format +msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" +msgstr "დრáƒáƒ”ბითი ურითერთáƒáƒ‘ის, რáƒáƒ’áƒáƒ áƒª მუდმივი ურთიერთáƒáƒ‘ის (\"%s\") დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ მიმáƒáƒ’რებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:18471 +#, c-format +msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" +msgstr "მუდმივი ურთიერთáƒáƒ‘ის, რáƒáƒ’áƒáƒ áƒª დრáƒáƒ”ბითი ურთიერთáƒáƒ‘ის (%s) დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ მიმáƒáƒ’რებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:18479 +#, c-format +msgid "cannot attach as partition of temporary relation of another session" +msgstr "სხვრსესიის დრáƒáƒ”ბითი ურთიერთáƒáƒ‘ის დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ მიმáƒáƒ’რებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:18486 +#, c-format +msgid "cannot attach temporary relation of another session as partition" +msgstr "სხვრსესიის დრáƒáƒ”ბითი ურთიერთáƒáƒ‘ის დáƒáƒœáƒáƒ§áƒáƒ¤áƒáƒ“ მიმáƒáƒ’რებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:18506 +#, c-format +msgid "table \"%s\" being attached contains an identity column \"%s\"" +msgstr "ცხრილი \"%s\", რáƒáƒ›áƒšáƒ˜áƒ¡ მიმáƒáƒ’რებáƒáƒª მიმდინáƒáƒ áƒ”áƒáƒ‘ს, შეიცáƒáƒ•ს იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტს \"%s\"" + +#: commands/tablecmds.c:18508 +#, c-format +msgid "The new partition may not contain an identity column." +msgstr "áƒáƒ®áƒáƒšáƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜ áƒáƒ  შეიძლებáƒ, იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ სვეტს შეიცáƒáƒ•დეს." + +#: commands/tablecmds.c:18516 +#, c-format +msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" +msgstr "ცხრილი \"%s\" შეიცáƒáƒ•ს სვეტს \"%s\", რáƒáƒ›áƒ”ლიც მშáƒáƒ‘ელში \"%s\" áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ" + +#: commands/tablecmds.c:18519 +#, c-format +msgid "The new partition may contain only the columns present in parent." +msgstr "áƒáƒ®áƒáƒšáƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜ მხáƒáƒšáƒáƒ“ მშáƒáƒ‘ელში áƒáƒ áƒ¡áƒ”ბულ სვეტებს შეიძლებáƒ, შეიცáƒáƒ•დეს." + +#: commands/tablecmds.c:18531 +#, c-format +msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" +msgstr "ტრიგერი \"%s\" ხელს უშლის ცხრილს \"%s\" დáƒáƒœáƒáƒ§áƒáƒ¤áƒáƒ“ გáƒáƒ“áƒáƒ˜áƒ¥áƒªáƒ”ს" + +#: commands/tablecmds.c:18533 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitions." +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბზე იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტები მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: commands/tablecmds.c:18694 +#, c-format +msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" +msgstr "გáƒáƒ áƒ” ცხრილის \"%s\" დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილის (\"%s\") დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ®áƒ˜áƒ— მიმáƒáƒ’რებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:18697 +#, c-format +msgid "Partitioned table \"%s\" contains unique indexes." +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილი \"%s\" უნიკáƒáƒšáƒ£áƒ  ცხრილებს შეიცáƒáƒ•ს." + +#: commands/tablecmds.c:19019 +#, c-format +msgid "cannot detach partitions concurrently when a default partition exists" +msgstr "ნáƒáƒ’ულისხმევი დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ის შემთხვევáƒáƒ¨áƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბის ერთდრáƒáƒ£áƒšáƒ˜ მáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ" + +#: commands/tablecmds.c:19128 +#, c-format +msgid "partitioned table \"%s\" was removed concurrently" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილი \"%s\" ერთდრáƒáƒ£áƒšáƒáƒ“ წáƒáƒ˜áƒ¨áƒáƒšáƒ" + +#: commands/tablecmds.c:19134 +#, c-format +msgid "partition \"%s\" was removed concurrently" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜ \"%s\" ერთდრáƒáƒ£áƒšáƒáƒ“ წáƒáƒ˜áƒ¨áƒáƒšáƒ" + +#: commands/tablecmds.c:19661 commands/tablecmds.c:19681 commands/tablecmds.c:19702 commands/tablecmds.c:19721 commands/tablecmds.c:19763 +#, c-format +msgid "cannot attach index \"%s\" as a partition of index \"%s\"" +msgstr "ერთი ინდექსის ინდექსის (%s) მეáƒáƒ áƒ” ინდექსის (\"%s) დáƒáƒœáƒáƒ§áƒáƒ¤áƒáƒ“ მიმáƒáƒ’რებრშეუძლებელიáƒ" + +#: commands/tablecmds.c:19664 +#, c-format +msgid "Index \"%s\" is already attached to another index." +msgstr "ინდექსი %s სხვრინდექსზერუკვე მიმáƒáƒ’რებული." + +#: commands/tablecmds.c:19684 +#, c-format +msgid "Index \"%s\" is not an index on any partition of table \"%s\"." +msgstr "ინდექსი %s ცხრილის (%s) áƒáƒ áƒªáƒ”რთი დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ ინდექსი áƒáƒ áƒáƒ." + +#: commands/tablecmds.c:19705 +#, c-format +msgid "The index definitions do not match." +msgstr "ინდექსის áƒáƒ¦áƒ¬áƒ”რები áƒáƒ  ემთხვევáƒ." + +#: commands/tablecmds.c:19724 +#, c-format +msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." +msgstr "" + +#: commands/tablecmds.c:19766 +#, c-format +msgid "Another index is already attached for partition \"%s\"." +msgstr "ცხრილისთვის %s სხვრინდექსი უკვე მიმáƒáƒ’რებულიáƒ." + +#: commands/tablecmds.c:20002 +#, c-format +msgid "column data type %s does not support compression" +msgstr "სვეტის მáƒáƒœáƒáƒªáƒ”მის ტიპს (%s) შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: commands/tablecmds.c:20009 +#, c-format +msgid "invalid compression method \"%s\"" +msgstr "შეკუმშვის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მეთáƒáƒ“ი \"%s\"" + +#: commands/tablecmds.c:20035 +#, c-format +msgid "invalid storage type \"%s\"" +msgstr "სáƒáƒªáƒáƒ•ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი \"%s\"" + +#: commands/tablecmds.c:20045 +#, c-format +msgid "column data type %s can only have storage PLAIN" +msgstr "სვეტის მáƒáƒœáƒáƒªáƒ”მების ტიპს %s სáƒáƒªáƒáƒ•ის ტიპáƒáƒ“ მხáƒáƒšáƒáƒ“ PLAIN შეიძლებáƒ, ჰქáƒáƒœáƒ“ეს" + +#: commands/tablecmds.c:20242 +#, c-format +msgid "can not find partition for split partition row" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ მწკრივისთვის დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜ ვერ ვიპáƒáƒ•ე" + +#: commands/tablecmds.c:20328 +#, c-format +msgid "cannot create as partition of temporary relation of another session" +msgstr "სხვრსესის დრáƒáƒ”ბითი ურთიერთáƒáƒ‘ის დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ®áƒ˜áƒ— ვერ შექმნით" + +#: commands/tablecmds.c:20399 +#, c-format +msgid "cannot create a permanent relation as partition of temporary relation \"%s\"" +msgstr "მუდმივ ურთიერთáƒáƒ‘áƒáƒ¡ დრáƒáƒ”ბითი ურთიერთáƒáƒ‘ის \"%s\" დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ®áƒ˜áƒ— ვერ შექმნით" + +#: commands/tablespace.c:193 commands/tablespace.c:644 +#, c-format +msgid "\"%s\" exists but is not a directory" +msgstr "%s áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე áƒáƒ áƒáƒ" + +#: commands/tablespace.c:224 +#, c-format +msgid "permission denied to create tablespace \"%s\"" +msgstr "ცხრილების სივრცის შექმნის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ: \"%s\"" + +#: commands/tablespace.c:226 +#, c-format +msgid "Must be superuser to create a tablespace." +msgstr "ცხრილის სივრცეების შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებები." + +#: commands/tablespace.c:242 +#, c-format +msgid "tablespace location cannot contain single quotes" +msgstr "ცხრილის სივრცის მდებáƒáƒ áƒ”áƒáƒ‘რერთმáƒáƒ’ ფრჩხილებს áƒáƒ  შეიცáƒáƒ•ს" + +#: commands/tablespace.c:255 +#, c-format +msgid "tablespace location must be an absolute path" +msgstr "ცხრილის სივრცის მდებáƒáƒ áƒ”áƒáƒ‘რáƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ ბილიკი უნდრიყáƒáƒ¡" + +#: commands/tablespace.c:267 +#, c-format +msgid "tablespace location \"%s\" is too long" +msgstr "ცხრილის სივრცის მდებáƒáƒ áƒ”áƒáƒ‘რ\"%s\" ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#: commands/tablespace.c:274 +#, c-format +msgid "tablespace location should not be inside the data directory" +msgstr "ცხრილის სივრცის მდებáƒáƒ áƒ”áƒáƒ‘რმáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შიგნით áƒáƒ  უნდრმდებáƒáƒ áƒ”áƒáƒ‘დეს" + +#: commands/tablespace.c:283 commands/tablespace.c:970 +#, c-format +msgid "unacceptable tablespace name \"%s\"" +msgstr "ცხრილის სივრცის დáƒáƒ£áƒ¨áƒ•ებელი სáƒáƒ®áƒ”ლი: %s" + +#: commands/tablespace.c:285 commands/tablespace.c:971 +#, c-format +msgid "The prefix \"pg_\" is reserved for system tablespaces." +msgstr "პრეფიქსი \"pg_\" დáƒáƒªáƒ£áƒšáƒ˜áƒ სისტემური ცხრილის სივრცეებისთვის." + +#: commands/tablespace.c:304 commands/tablespace.c:992 +#, c-format +msgid "tablespace \"%s\" already exists" +msgstr "ცხრილის სივრცე უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: commands/tablespace.c:320 +#, c-format +msgid "pg_tablespace OID value not set when in binary upgrade mode" +msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის რეჟიმში pg_tablespace-ის OID-ის მნიშვნელáƒáƒ‘რდáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: commands/tablespace.c:425 commands/tablespace.c:953 commands/tablespace.c:1042 commands/tablespace.c:1111 commands/tablespace.c:1257 commands/tablespace.c:1460 +#, c-format +msgid "tablespace \"%s\" does not exist" +msgstr "ცხრილის სივრცე áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: commands/tablespace.c:431 +#, c-format +msgid "tablespace \"%s\" does not exist, skipping" +msgstr "ცხრილის სივრცე áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/tablespace.c:457 +#, c-format +msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" +msgstr "ცხრილების სივრცის (%s) წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ. მáƒáƒ¡ სხვრáƒáƒ‘იექტები ეყრდნáƒáƒ‘áƒ" + +#: commands/tablespace.c:524 +#, c-format +msgid "tablespace \"%s\" is not empty" +msgstr "ცხრილის სივრცე %s ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ áƒáƒ" + +#: commands/tablespace.c:611 +#, c-format +msgid "directory \"%s\" does not exist" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: commands/tablespace.c:612 +#, c-format +msgid "Create this directory for the tablespace before restarting the server." +msgstr "სერვერის გáƒáƒ“áƒáƒ¢áƒ•ირთვáƒáƒ›áƒ“ე ცხრილის სივრცეებისთვის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე შექმენით ." + +#: commands/tablespace.c:617 +#, c-format +msgid "could not set permissions on directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეზე \"%s\" წვდáƒáƒ›áƒ”ბის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %m" + +#: commands/tablespace.c:649 +#, c-format +msgid "directory \"%s\" already in use as a tablespace" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" ცხრილების სივრცის მიერ უკვე გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: commands/tablespace.c:827 commands/tablespace.c:913 +#, c-format +msgid "could not remove symbolic link \"%s\": %m" +msgstr "სიმბმულის წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ %s: %m" + +#: commands/tablespace.c:836 commands/tablespace.c:921 +#, c-format +msgid "\"%s\" is not a directory or symbolic link" +msgstr "%s სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეს áƒáƒœ სიმბმულს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: commands/tablespace.c:1116 +#, c-format +msgid "Tablespace \"%s\" does not exist." +msgstr "ცხრილის სივრცე áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s." + +#: commands/tablespace.c:1562 +#, c-format +msgid "directories for tablespace %u could not be removed" +msgstr "ცხრილების სივრცის (%u) სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეების წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: commands/tablespace.c:1564 +#, c-format +msgid "You can remove the directories manually if necessary." +msgstr "თუ გჭირდებáƒáƒ—, სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეები შეგიძლიáƒáƒ— ხელითáƒáƒª წáƒáƒ¨áƒáƒšáƒáƒ—." + +#: commands/trigger.c:225 commands/trigger.c:236 +#, c-format +msgid "\"%s\" is a table" +msgstr "\"%s\" ცხრილიáƒ" + +#: commands/trigger.c:227 commands/trigger.c:238 +#, c-format +msgid "Tables cannot have INSTEAD OF triggers." +msgstr "ცხრილებს INSTEAD OF ტიპის ტრიგერები ვერ ექნებáƒáƒ—." + +#: commands/trigger.c:259 +#, c-format +msgid "\"%s\" is a partitioned table" +msgstr "\"%s\" დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილიáƒ" + +#: commands/trigger.c:261 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitioned tables." +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბზე იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტები მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: commands/trigger.c:273 commands/trigger.c:280 commands/trigger.c:444 +#, c-format +msgid "\"%s\" is a view" +msgstr "\"%s\" ხედიáƒ" + +#: commands/trigger.c:275 +#, c-format +msgid "Views cannot have row-level BEFORE or AFTER triggers." +msgstr "ხედებს მწკრივის დáƒáƒœáƒ˜áƒ¡ BEFORE დრAFTER ტრიგერები ვერ ექნებáƒáƒ—." + +#: commands/trigger.c:282 +#, c-format +msgid "Views cannot have TRUNCATE triggers." +msgstr "ხედებს TRUNCATE ტიპის ტრიგერები ვერ ექნებáƒáƒ—." + +#: commands/trigger.c:290 commands/trigger.c:302 commands/trigger.c:437 +#, c-format +msgid "\"%s\" is a foreign table" +msgstr "\"%s\" გáƒáƒ áƒ” ცხრილიáƒ" + +#: commands/trigger.c:292 +#, c-format +msgid "Foreign tables cannot have INSTEAD OF triggers." +msgstr "გáƒáƒ áƒ” ცხრილებს INSTEAD OF ტრიგერები ვერ ექნებáƒáƒ—." + +#: commands/trigger.c:304 +#, c-format +msgid "Foreign tables cannot have constraint triggers." +msgstr "გáƒáƒ áƒ” ცხრილებს შეზღუდვის ტრიგერები ვერ ექნებáƒáƒ—." + +#: commands/trigger.c:309 commands/trigger.c:1325 commands/trigger.c:1432 +#, c-format +msgid "relation \"%s\" cannot have triggers" +msgstr "ურთიერთáƒáƒ‘áƒáƒ¡ \"%s\" ტრიგერები áƒáƒ  შეიძლებრჰქáƒáƒœáƒ“ეთ" + +#: commands/trigger.c:380 +#, c-format +msgid "TRUNCATE FOR EACH ROW triggers are not supported" +msgstr "TRUNCATE FOR EACH ROW ტრიგერები მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: commands/trigger.c:388 +#, c-format +msgid "INSTEAD OF triggers must be FOR EACH ROW" +msgstr "INSTEAD OF ტრიგერები უნდრიყáƒáƒ¡ FOR EACH ROW" + +#: commands/trigger.c:392 +#, c-format +msgid "INSTEAD OF triggers cannot have WHEN conditions" +msgstr "INSTEAD OF ტრიგერებს WHEN პირáƒáƒ‘ები áƒáƒ  შეიძლებრჰქáƒáƒœáƒ“ეს" + +#: commands/trigger.c:396 +#, c-format +msgid "INSTEAD OF triggers cannot have column lists" +msgstr "INSTEAD OF ტრიგერებს სვეტების სიები áƒáƒ  შეიძლებრჰქáƒáƒœáƒ“ეთ" + +#: commands/trigger.c:425 +#, c-format +msgid "ROW variable naming in the REFERENCING clause is not supported" +msgstr "" + +#: commands/trigger.c:426 +#, c-format +msgid "Use OLD TABLE or NEW TABLE for naming transition tables." +msgstr "გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ცხრილების სáƒáƒ®áƒ”ლებისთვის OLD TABLE áƒáƒœ NEW TABLE გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: commands/trigger.c:439 +#, c-format +msgid "Triggers on foreign tables cannot have transition tables." +msgstr "გáƒáƒ áƒ” ცხრილებზე áƒáƒ áƒ¡áƒ”ბულ ტრიგერებს გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ცხრილები ვერ ექნებáƒáƒ—." + +#: commands/trigger.c:446 +#, c-format +msgid "Triggers on views cannot have transition tables." +msgstr "ხედებზე áƒáƒ áƒ¡áƒ”ბულ ტრიგერებს გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ცხრილები ვერ ექნებáƒáƒ—." + +#: commands/trigger.c:462 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitions" +msgstr "ROW ტრიგერები გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ცხრილებით დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბზე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/trigger.c:466 +#, c-format +msgid "ROW triggers with transition tables are not supported on inheritance children" +msgstr "ROW ტრიგერები გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ცხრილებით მემკვიდრეáƒáƒ‘ის შვილებზე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/trigger.c:472 +#, c-format +msgid "transition table name can only be specified for an AFTER trigger" +msgstr "გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ცხრილის სáƒáƒ®áƒ”ლი მხáƒáƒšáƒáƒ“ ტრიგერისთვის AFTER შეგიძლიáƒáƒ—, მიუთითáƒáƒ—" + +#: commands/trigger.c:477 +#, c-format +msgid "TRUNCATE triggers with transition tables are not supported" +msgstr "ტრიგერები TRUNCATE გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ცხრილებით მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/trigger.c:494 +#, c-format +msgid "transition tables cannot be specified for triggers with more than one event" +msgstr "გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ცხრილების მითითებრტრიგერებისთვის, რáƒáƒ›áƒšáƒ”ბსáƒáƒª ერთზე მეტი მáƒáƒ•ლენრგáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, შეუძლებელიáƒ" + +#: commands/trigger.c:505 +#, c-format +msgid "transition tables cannot be specified for triggers with column lists" +msgstr "გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜ ცხრილების მითითებრტრიგერებისთვის, რáƒáƒ›áƒšáƒ”ბსáƒáƒª სვეტების სიები გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, შეუძლებელიáƒ" + +#: commands/trigger.c:522 +#, c-format +msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" +msgstr "NEW TABLE მხáƒáƒšáƒáƒ“ INSERT áƒáƒœ UPDATE ტრიგერისთვის შეგიძლიáƒáƒ—, მიუთითáƒáƒ—" + +#: commands/trigger.c:527 +#, c-format +msgid "NEW TABLE cannot be specified multiple times" +msgstr "NEW TABLE -ის რáƒáƒ›áƒ“ენჯერმე მითითებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/trigger.c:537 +#, c-format +msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" +msgstr "OLD TABLE მხáƒáƒšáƒáƒ“ DELETE áƒáƒœ UPDATE ტრიგერისთვის შეგიძლიáƒáƒ—, მიუთითáƒáƒ—" + +#: commands/trigger.c:542 +#, c-format +msgid "OLD TABLE cannot be specified multiple times" +msgstr "OLD TABLE -ის რáƒáƒ›áƒ“ენჯერმე მითითებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/trigger.c:552 +#, c-format +msgid "OLD TABLE name and NEW TABLE name cannot be the same" +msgstr "OLD TABLE-ის დრNEW TABLE-ის სáƒáƒ®áƒ”ლები ერთი დრიგივე ვერ იქნებáƒ" + +#: commands/trigger.c:616 commands/trigger.c:629 +#, c-format +msgid "statement trigger's WHEN condition cannot reference column values" +msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ტრიგერის WHEN პირáƒáƒ‘რáƒáƒ  შეუძლებáƒ, სვეტის მნიშვნელáƒáƒ‘ებზე მიუთითებდეს" + +#: commands/trigger.c:621 +#, c-format +msgid "INSERT trigger's WHEN condition cannot reference OLD values" +msgstr "INSERT-ის ტრიგერის WHEN პირáƒáƒ‘რáƒáƒ  შეიძლებáƒ, OLD მნიშვნელáƒáƒ‘ებზე მიუთითებდეს" + +#: commands/trigger.c:634 +#, c-format +msgid "DELETE trigger's WHEN condition cannot reference NEW values" +msgstr "DELETE-ის ტრიგერის WHEN პირáƒáƒ‘რáƒáƒ  შეიძლებáƒ, NEW მნიშვნელáƒáƒ‘ებზე მიუთითებდეს" + +#: commands/trigger.c:639 +#, c-format +msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" +msgstr "BEFORE-ის ტრიგერის WHEN პირáƒáƒ‘რáƒáƒ  შეიძლებáƒ, NEW სისტემურ სვეტებზე მიუთითებდეს" + +#: commands/trigger.c:647 commands/trigger.c:655 +#, c-format +msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" +msgstr "BEFORE-ის ტრიგერის WHEN პირáƒáƒ‘რáƒáƒ  შეიძლებáƒ, NEW გენერირებულ სვეტებზე მიუთითებდეს" + +#: commands/trigger.c:648 +#, c-format +msgid "A whole-row reference is used and the table contains generated columns." +msgstr "" + +#: commands/trigger.c:763 commands/trigger.c:1607 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" already exists" +msgstr "ტრიგერი \"%s\" ურთიერთáƒáƒ‘ისთვის \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/trigger.c:776 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" +msgstr "ტრიგერი \"%s\" ურთიერთáƒáƒ‘ისთვის \"%s\" შიდრáƒáƒœ შვილი ტრიგერიáƒ" + +#: commands/trigger.c:795 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" +msgstr "ტრიგერი \"%s\" ურთიერთáƒáƒ‘ისთვის \"%s\", შეზღუდვის ტრიგერიáƒ" + +#: commands/trigger.c:1397 commands/trigger.c:1550 commands/trigger.c:1831 +#, c-format +msgid "trigger \"%s\" for table \"%s\" does not exist" +msgstr "ტრიგერი \"%s\" ცხრილისთვის \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/trigger.c:1522 +#, c-format +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "ტრიგერის (%s) (ცხრილზე %s) სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრშეუძლებელიáƒ" + +#: commands/trigger.c:1524 +#, c-format +msgid "Rename the trigger on the partitioned table \"%s\" instead." +msgstr "áƒáƒ›áƒ˜áƒ¡ მáƒáƒ’იერ დáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილზე ('%s\") ტრიგერს გáƒáƒ“áƒáƒáƒ áƒ¥áƒ•ით სáƒáƒ®áƒ”ლი." + +#: commands/trigger.c:1624 +#, c-format +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘áƒáƒ–ე \"%2$s\" ტრიგერს \"%1$s\" სáƒáƒ®áƒ”ლი გáƒáƒ“áƒáƒ”რქვáƒ" + +#: commands/trigger.c:1770 +#, c-format +msgid "permission denied: \"%s\" is a system trigger" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ: %s სისტემური ტრიგერიáƒ" + +#: commands/trigger.c:2379 +#, c-format +msgid "trigger function %u returned null value" +msgstr "ტრიგერის ფუნქციáƒáƒ› %u ნულáƒáƒ•áƒáƒœáƒ˜ მნიშვნელáƒáƒ‘რდáƒáƒáƒ‘რუნáƒ" + +#: commands/trigger.c:2439 commands/trigger.c:2657 commands/trigger.c:2910 commands/trigger.c:3263 +#, c-format +msgid "BEFORE STATEMENT trigger cannot return a value" +msgstr "BEFORE STATEMENT ტრიგერს მნიშვნელáƒáƒ‘ის დáƒáƒ‘რუნებრáƒáƒ  შეუძლიáƒ" + +#: commands/trigger.c:2515 +#, c-format +msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" +msgstr "მწკრივის სხვრდáƒáƒœáƒáƒ§áƒáƒ¤áƒ¨áƒ˜ გáƒáƒ“áƒáƒ¢áƒáƒœáƒ BEFORE FOR EACH ROW ტრიგერის დრáƒáƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: commands/trigger.c:2516 +#, c-format +msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." +msgstr "ტრიგერის \"%s\" შესრულებáƒáƒ›áƒ“ე სვეტი დáƒáƒœáƒáƒ§áƒáƒ¤áƒ¨áƒ˜ \"%s.%s\" უნდრყáƒáƒ¤áƒ˜áƒšáƒ˜áƒ§áƒ." + +#: commands/trigger.c:3340 executor/nodeModifyTable.c:2363 executor/nodeModifyTable.c:2446 +#, c-format +msgid "tuple to be updated was already modified by an operation triggered by the current command" +msgstr "" + +#: commands/trigger.c:3341 executor/nodeModifyTable.c:1532 executor/nodeModifyTable.c:1606 executor/nodeModifyTable.c:2364 executor/nodeModifyTable.c:2447 executor/nodeModifyTable.c:3075 executor/nodeModifyTable.c:3236 +#, c-format +msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." +msgstr "" + +#: commands/trigger.c:3382 executor/nodeLockRows.c:228 executor/nodeLockRows.c:237 executor/nodeModifyTable.c:305 executor/nodeModifyTable.c:1548 executor/nodeModifyTable.c:2381 executor/nodeModifyTable.c:2589 +#, c-format +msgid "could not serialize access due to concurrent update" +msgstr "ერთდრáƒáƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის გáƒáƒ›áƒ წვდáƒáƒ›áƒ˜áƒ¡ სერიáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ შეუძლებელიáƒ" + +#: commands/trigger.c:3390 executor/nodeModifyTable.c:1638 executor/nodeModifyTable.c:2464 executor/nodeModifyTable.c:2613 executor/nodeModifyTable.c:3093 +#, c-format +msgid "could not serialize access due to concurrent delete" +msgstr "ერთდრáƒáƒ£áƒšáƒ˜ წáƒáƒ¨áƒšáƒ˜áƒ¡ გáƒáƒ›áƒ წვდáƒáƒ›áƒ˜áƒ¡ სერიáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ შეუძლებელიáƒ" + +#: commands/trigger.c:4597 +#, c-format +msgid "cannot fire deferred trigger within security-restricted operation" +msgstr "" + +#: commands/trigger.c:5780 +#, c-format +msgid "constraint \"%s\" is not deferrable" +msgstr "შეზღუდვრგáƒáƒ“áƒáƒ“ებáƒáƒ“ი áƒáƒ áƒáƒ %s" + +#: commands/trigger.c:5803 +#, c-format +msgid "constraint \"%s\" does not exist" +msgstr "შეზღუდვრ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/tsearchcmds.c:124 commands/tsearchcmds.c:641 +#, c-format +msgid "function %s should return type %s" +msgstr "ფუნქციáƒáƒ› %s უნდრდáƒáƒáƒ‘რუნáƒáƒ¡ ტიპი %s" + +#: commands/tsearchcmds.c:200 +#, c-format +msgid "must be superuser to create text search parsers" +msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლების შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის წვდáƒáƒ›áƒ”ლი" + +#: commands/tsearchcmds.c:253 +#, c-format +msgid "text search parser parameter \"%s\" not recognized" +msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" უცნáƒáƒ‘იáƒ" + +#: commands/tsearchcmds.c:263 +#, c-format +msgid "text search parser start method is required" +msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის გáƒáƒ¨áƒ•ების მეთáƒáƒ“ი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/tsearchcmds.c:268 +#, c-format +msgid "text search parser gettoken method is required" +msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის gettoken მეთáƒáƒ“ი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/tsearchcmds.c:273 +#, c-format +msgid "text search parser end method is required" +msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის end მეთáƒáƒ“ი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/tsearchcmds.c:278 +#, c-format +msgid "text search parser lextypes method is required" +msgstr "" + +#: commands/tsearchcmds.c:372 +#, c-format +msgid "text search template \"%s\" does not accept options" +msgstr "ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ˜ '%s\" პáƒáƒ áƒáƒ›áƒ”ტრებს áƒáƒ  იღებს" + +#: commands/tsearchcmds.c:446 +#, c-format +msgid "text search template is required" +msgstr "ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ˜ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/tsearchcmds.c:707 +#, c-format +msgid "must be superuser to create text search templates" +msgstr "ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ”ბის შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებებირსáƒáƒ­áƒ˜áƒ áƒ" + +#: commands/tsearchcmds.c:749 +#, c-format +msgid "text search template parameter \"%s\" not recognized" +msgstr "ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: commands/tsearchcmds.c:759 +#, c-format +msgid "text search template lexize method is required" +msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ lexize მეთáƒáƒ“ი" + +#: commands/tsearchcmds.c:939 +#, c-format +msgid "text search configuration parameter \"%s\" not recognized" +msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: commands/tsearchcmds.c:946 +#, c-format +msgid "cannot specify both PARSER and COPY options" +msgstr "áƒáƒ áƒ˜áƒ•ე, PARSER დრCOPY პáƒáƒ áƒáƒ›áƒ”ტრებს ვერ მიუთითებთ" + +#: commands/tsearchcmds.c:982 +#, c-format +msgid "text search parser is required" +msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლი" + +#: commands/tsearchcmds.c:1277 +#, c-format +msgid "token type \"%s\" does not exist" +msgstr "კáƒáƒ“ის ტიპი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: commands/tsearchcmds.c:1540 +#, c-format +msgid "mapping for token type \"%s\" does not exist" +msgstr "მიბმრკáƒáƒ“ის ტიპისთვის %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/tsearchcmds.c:1546 +#, c-format +msgid "mapping for token type \"%s\" does not exist, skipping" +msgstr "მიბმრკáƒáƒ“ის ტიპისთვის %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/tsearchcmds.c:1707 commands/tsearchcmds.c:1822 +#, c-format +msgid "invalid parameter list format: \"%s\"" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრების სიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜: \"%s\"" + +#: commands/typecmds.c:221 +#, c-format +msgid "must be superuser to create a base type" +msgstr "სáƒáƒ‘áƒáƒ–ისრტიპის შესáƒáƒªáƒ•ლელáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პრივილეგიები" + +#: commands/typecmds.c:279 +#, c-format +msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." +msgstr "" + +#: commands/typecmds.c:331 commands/typecmds.c:1460 commands/typecmds.c:4480 +#, c-format +msgid "type attribute \"%s\" not recognized" +msgstr "ტიპის უცნáƒáƒ‘ი áƒáƒ¢áƒ áƒ˜áƒ‘უტი: %s" + +#: commands/typecmds.c:386 +#, c-format +msgid "invalid type category \"%s\": must be simple ASCII" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპის კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ \"%s\": უნდრწáƒáƒ áƒ›áƒáƒáƒ“გენდეს უბრáƒáƒšáƒ ASCII-ს" + +#: commands/typecmds.c:405 +#, c-format +msgid "array element type cannot be %s" +msgstr "%s მáƒáƒ¡áƒ˜áƒ•ის ელემენტის ტიპი áƒáƒ  შეიძლებრიყáƒáƒ¡" + +#: commands/typecmds.c:437 +#, c-format +msgid "alignment \"%s\" not recognized" +msgstr "სწáƒáƒ áƒ”ბრ\"%s\" უცნáƒáƒ‘იáƒ" + +#: commands/typecmds.c:454 commands/typecmds.c:4354 +#, c-format +msgid "storage \"%s\" not recognized" +msgstr "სáƒáƒªáƒáƒ•ი \"%s\" უცნáƒáƒ‘იáƒ" + +#: commands/typecmds.c:465 +#, c-format +msgid "type input function must be specified" +msgstr "áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირტიპის შეყვáƒáƒœáƒ˜áƒ¡ ფუნქციის მითითებáƒ" + +#: commands/typecmds.c:469 +#, c-format +msgid "type output function must be specified" +msgstr "áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირტიპის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფუნქციის მითითებáƒ" + +#: commands/typecmds.c:474 +#, c-format +msgid "type modifier output function is useless without a type modifier input function" +msgstr "ტიპის მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფუნქცირტიპის მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ შეყვáƒáƒœáƒ˜áƒ¡ ფუნქციის გáƒáƒ áƒ”შე უáƒáƒ–რáƒáƒ" + +#: commands/typecmds.c:516 +#, c-format +msgid "element type cannot be specified without a subscripting function" +msgstr "ელემენტის ტიპის მითითებრგáƒáƒ›áƒáƒ›áƒ¬áƒ”რი ფუნქციის გáƒáƒ áƒ”შე შეუძლებელიáƒ" + +#: commands/typecmds.c:785 +#, c-format +msgid "\"%s\" is not a valid base type for a domain" +msgstr "%s დáƒáƒ›áƒ”ნისთვის სწáƒáƒ  ბáƒáƒ–ისურ ტიპს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: commands/typecmds.c:883 +#, c-format +msgid "multiple default expressions" +msgstr "ერთზე მეტი ნáƒáƒ’ულისხმევი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ" + +#: commands/typecmds.c:946 commands/typecmds.c:955 +#, c-format +msgid "conflicting NULL/NOT NULL constraints" +msgstr "კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ£áƒ áƒ˜ NULL/NOT NULL შეზღუდვები" + +#: commands/typecmds.c:971 +#, c-format +msgid "check constraints for domains cannot be marked NO INHERIT" +msgstr "დáƒáƒ›áƒ”ნის შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვების, რáƒáƒ’áƒáƒ áƒª NO INHERIT, მáƒáƒœáƒ˜áƒ¨áƒ•ნრშეუძლებელიáƒ" + +#: commands/typecmds.c:980 commands/typecmds.c:2940 +#, c-format +msgid "unique constraints not possible for domains" +msgstr "უნიკáƒáƒšáƒ£áƒ áƒ˜ შეზღუდვები დáƒáƒ›áƒ”ნებისთვის შეუძლებელიáƒ" + +#: commands/typecmds.c:986 commands/typecmds.c:2946 +#, c-format +msgid "primary key constraints not possible for domains" +msgstr "ძირითáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვრდáƒáƒ›áƒ”ნებისთვის შეუძლებელიáƒ" + +#: commands/typecmds.c:992 commands/typecmds.c:2952 +#, c-format +msgid "exclusion constraints not possible for domains" +msgstr "გáƒáƒ¨áƒ•ების შეზღუდვრდáƒáƒ›áƒ”ნებისთვის შეუძლებელიáƒ" + +#: commands/typecmds.c:998 commands/typecmds.c:2958 +#, c-format +msgid "foreign key constraints not possible for domains" +msgstr "გáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვრდáƒáƒ›áƒ”ნებისთვის შეუძლებელიáƒ" + +#: commands/typecmds.c:1007 commands/typecmds.c:2967 +#, c-format +msgid "specifying constraint deferrability not supported for domains" +msgstr "" + +#: commands/typecmds.c:1327 utils/cache/typcache.c:2570 +#, c-format +msgid "%s is not an enum" +msgstr "%s ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜ áƒáƒ áƒáƒ" + +#: commands/typecmds.c:1468 +#, c-format +msgid "type attribute \"subtype\" is required" +msgstr "ტიპის áƒáƒ¢áƒ áƒ˜áƒ‘უტი \"subtype\" áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/typecmds.c:1473 +#, c-format +msgid "range subtype cannot be %s" +msgstr "%s დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ ქვეტიპი ვერ იქნებáƒ" + +#: commands/typecmds.c:1492 +#, c-format +msgid "range collation specified but subtype does not support collation" +msgstr "" + +#: commands/typecmds.c:1502 +#, c-format +msgid "cannot specify a canonical function without a pre-created shell type" +msgstr "" + +#: commands/typecmds.c:1503 +#, c-format +msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." +msgstr "" + +#: commands/typecmds.c:1975 +#, c-format +msgid "type input function %s has multiple matches" +msgstr "ტიპის შეყვáƒáƒœáƒ˜áƒ¡ ფუნქციის (%s) რáƒáƒ›áƒ“ენიმე áƒáƒ¡áƒšáƒ˜ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/typecmds.c:1993 +#, c-format +msgid "type input function %s must return type %s" +msgstr "ტიპის შეყვáƒáƒœáƒ˜áƒ¡ ფუნქციáƒáƒ› (\"%s\") უნდრდáƒáƒáƒ‘რუნáƒáƒ¡ ტიპი \"%s\"" + +#: commands/typecmds.c:2009 +#, c-format +msgid "type input function %s should not be volatile" +msgstr "ტიპის შეყვáƒáƒœáƒ˜áƒ¡ ფუნქცირ(%s) ცვáƒáƒšáƒ”ბáƒáƒ“ი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/typecmds.c:2037 +#, c-format +msgid "type output function %s must return type %s" +msgstr "ტიპის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფუნქციáƒáƒ› (%s) უნდრდáƒáƒáƒ‘რუნáƒáƒ¡ ტიპი \"%s\"" + +#: commands/typecmds.c:2044 +#, c-format +msgid "type output function %s should not be volatile" +msgstr "ტიპის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფუნქცირ(%s) ცვáƒáƒšáƒ”ბáƒáƒ“ი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/typecmds.c:2073 +#, c-format +msgid "type receive function %s has multiple matches" +msgstr "ტიპის მიღების ფუქნციის (%s) რáƒáƒ›áƒ“ენიმე áƒáƒ¡áƒšáƒ˜ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/typecmds.c:2091 +#, c-format +msgid "type receive function %s must return type %s" +msgstr "ტიპის მიღების ფუნქციáƒáƒ› (%s) უნდრდáƒáƒáƒ‘რუნáƒáƒ¡ ტიპი %s" + +#: commands/typecmds.c:2098 +#, c-format +msgid "type receive function %s should not be volatile" +msgstr "ტიპის მიღების ფუნქცირ(%s) ცვáƒáƒšáƒ”ბáƒáƒ“ი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/typecmds.c:2126 +#, c-format +msgid "type send function %s must return type %s" +msgstr "ტიპის გáƒáƒ’ზáƒáƒ•ნის ფუნქციáƒáƒ› (%s) უნდრდáƒáƒáƒ‘რუნáƒáƒ¡ ტიპი \"%s\"" + +#: commands/typecmds.c:2133 +#, c-format +msgid "type send function %s should not be volatile" +msgstr "ტიპის გáƒáƒ’ზáƒáƒ•ნის ფუნქცირ(%s) ცვáƒáƒšáƒ”ბáƒáƒ“ი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/typecmds.c:2160 +#, c-format +msgid "typmod_in function %s must return type %s" +msgstr "typmod_in ფუნქციáƒáƒ› (%s) უნდრდáƒáƒáƒ‘რუნáƒáƒ¡ ტიპი %s" + +#: commands/typecmds.c:2167 +#, c-format +msgid "type modifier input function %s should not be volatile" +msgstr "ტიპის მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ შეყვáƒáƒœáƒ˜áƒ¡ ფუნქცირ(%s) ცვáƒáƒšáƒ”ბáƒáƒ“ი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/typecmds.c:2194 +#, c-format +msgid "typmod_out function %s must return type %s" +msgstr "typmod_out ფუნქციáƒáƒ› (%s) უნდრდáƒáƒáƒ‘რუნáƒáƒ¡ ტიპი %s" + +#: commands/typecmds.c:2201 +#, c-format +msgid "type modifier output function %s should not be volatile" +msgstr "ტიპის მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფუნქცირ(%s) ცვáƒáƒšáƒ”ბáƒáƒ“ი áƒáƒ  უნდრიყáƒáƒ¡" + +#: commands/typecmds.c:2228 +#, c-format +msgid "type analyze function %s must return type %s" +msgstr "ტიპის áƒáƒœáƒáƒšáƒ˜áƒ–ის ფუნქციáƒáƒ› (%s) უნდრდáƒáƒáƒ‘რუნáƒáƒ¡ ტიპი %s" + +#: commands/typecmds.c:2257 +#, c-format +msgid "type subscripting function %s must return type %s" +msgstr "" + +#: commands/typecmds.c:2267 +#, c-format +msgid "user-defined types cannot use subscripting function %s" +msgstr "" + +#: commands/typecmds.c:2313 +#, c-format +msgid "You must specify an operator class for the range type or define a default operator class for the subtype." +msgstr "" + +#: commands/typecmds.c:2344 +#, c-format +msgid "range canonical function %s must return range type" +msgstr "კáƒáƒœáƒáƒœáƒ˜áƒ™áƒ£áƒ áƒ˜ დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ ფუნქციáƒáƒ› (%s) დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ ტიპი უნდრდáƒáƒáƒ‘რუნáƒáƒ¡" + +#: commands/typecmds.c:2350 +#, c-format +msgid "range canonical function %s must be immutable" +msgstr "კáƒáƒœáƒáƒœáƒ˜áƒ™áƒ£áƒ áƒ˜ დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ ფუნქცირ(%s) მუდმივი უნდრიყáƒáƒ¡" + +#: commands/typecmds.c:2386 +#, c-format +msgid "range subtype diff function %s must return type %s" +msgstr "დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ ქვეტიპის გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ების ფუნქციáƒáƒ› (%s) უნდრდáƒáƒáƒ‘რუნáƒáƒ¡ ტიპი: %s" + +#: commands/typecmds.c:2393 +#, c-format +msgid "range subtype diff function %s must be immutable" +msgstr "დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ ქვეტიპის გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ების ფუნქცირ(%s) უცვლელი უნდრიყáƒáƒ¡" + +#: commands/typecmds.c:2420 +#, c-format +msgid "pg_type array OID value not set when in binary upgrade mode" +msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის რეჟიმში pg_type-ის მáƒáƒ¡áƒ˜áƒ•ის OID-ის მნიშვნელáƒáƒ‘რდáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: commands/typecmds.c:2453 +#, c-format +msgid "pg_type multirange OID value not set when in binary upgrade mode" +msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის რეჟიმში pg_type-ის მრáƒáƒ•áƒáƒšáƒ“იáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒáƒœáƒ˜ OID-ის მნიშვნელáƒáƒ‘რდáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: commands/typecmds.c:2486 +#, c-format +msgid "pg_type multirange array OID value not set when in binary upgrade mode" +msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის რეჟიმში pg_type-ის მრáƒáƒ•áƒáƒšáƒ“იáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒáƒœáƒ˜ მáƒáƒ¡áƒ˜áƒ•ის OID-ის მნიშვნელáƒáƒ‘რდáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: commands/typecmds.c:2868 commands/typecmds.c:3093 +#, c-format +msgid "constraint \"%s\" of domain \"%s\" does not exist" +msgstr "დáƒáƒ›áƒ”ნის (\"%2$s\") შეზღუდვრ(\"%1$s\") áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/typecmds.c:2872 +#, c-format +msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" +msgstr "დáƒáƒ›áƒ”ნის (\"%2$s\") შეზღუდვრ(\"%1$s\") áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/typecmds.c:3100 +#, c-format +msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" +msgstr "დáƒáƒ›áƒ”ნის (\"%2$s\") შეზღუდვრ(\"%1$s\") შეზღუდვის შემáƒáƒ¬áƒ›áƒ”ბრáƒáƒ áƒáƒ" + +#: commands/typecmds.c:3180 +#, c-format +msgid "column \"%s\" of table \"%s\" contains null values" +msgstr "სვეტი \"%s\" (ცხრილში %s) ნულáƒáƒ•áƒáƒœ მნიშვნელáƒáƒ‘ებს შეიცáƒáƒ•ს" + +#: commands/typecmds.c:3269 +#, c-format +msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" +msgstr "სვეტი \"%s\" ცხრილიდáƒáƒœ \"%s\" შეიცáƒáƒ•ს მნიშვნელáƒáƒ‘ებს, რáƒáƒ›áƒ”ლიც áƒáƒ®áƒáƒš შეზღუდვáƒáƒ¡ áƒáƒ áƒ¦áƒ•ევს" + +#: commands/typecmds.c:3498 commands/typecmds.c:3772 commands/typecmds.c:3857 commands/typecmds.c:4073 +#, c-format +msgid "%s is not a domain" +msgstr "\"%s\" დáƒáƒ›áƒ”ნი áƒáƒ áƒáƒ" + +#: commands/typecmds.c:3532 commands/typecmds.c:3686 +#, c-format +msgid "constraint \"%s\" for domain \"%s\" already exists" +msgstr "შეზღუდვრ\"%s\" დáƒáƒ›áƒ”ნისთვის %s უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/typecmds.c:3583 +#, c-format +msgid "cannot use table references in domain check constraint" +msgstr "" + +#: commands/typecmds.c:3784 commands/typecmds.c:3869 commands/typecmds.c:4223 +#, c-format +msgid "%s is a table's row type" +msgstr "%s ცხრილის მწკრივის ტიპიáƒ" + +#: commands/typecmds.c:3794 commands/typecmds.c:3879 commands/typecmds.c:4121 +#, c-format +msgid "cannot alter array type %s" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის ტიპის (\"%s\") შეცვლრშეუძლებელიáƒ" + +#: commands/typecmds.c:3796 commands/typecmds.c:3881 commands/typecmds.c:4123 +#, c-format +msgid "You can alter type %s, which will alter the array type as well." +msgstr "ტიპი %s შეგიძლიáƒáƒ—, შეცვáƒáƒšáƒáƒ—, რáƒáƒª მáƒáƒ¡áƒ˜áƒ•ის ტიპსáƒáƒª შეცვლის." + +#: commands/typecmds.c:3892 +#, c-format +msgid "cannot alter multirange type %s" +msgstr "მრáƒáƒ•áƒáƒšáƒ¨áƒ£áƒáƒšáƒ”დáƒáƒœáƒ˜ ტიპის %s შეცვლრშეუძლებელიáƒ" + +#: commands/typecmds.c:3895 +#, c-format +msgid "You can alter type %s, which will alter the multirange type as well." +msgstr "შეგიძლიáƒáƒ— შეცვáƒáƒšáƒáƒ— ტიპი %s, რáƒáƒ›áƒ”ლიც მრáƒáƒ•áƒáƒšáƒ¨áƒ£áƒáƒšáƒ”დიáƒáƒœ ტიპსáƒáƒª შეცვლის." + +#: commands/typecmds.c:4202 +#, c-format +msgid "type \"%s\" already exists in schema \"%s\"" +msgstr "ტიპი \"%s\" სქემáƒáƒ¨áƒ˜ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/typecmds.c:4382 +#, c-format +msgid "cannot change type's storage to PLAIN" +msgstr "ტიპის სáƒáƒªáƒáƒ•ს PLAIN-ზე ვერ შეცვლით" + +#: commands/typecmds.c:4475 +#, c-format +msgid "type attribute \"%s\" cannot be changed" +msgstr "ტიპის áƒáƒ¢áƒ áƒ˜áƒ‘უტის შეცვლრშეუძლებელიáƒ: %s" + +#: commands/typecmds.c:4493 +#, c-format +msgid "must be superuser to alter a type" +msgstr "ტიპის შესáƒáƒªáƒ•ლელáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებებირსáƒáƒ­áƒ˜áƒ áƒ" + +#: commands/typecmds.c:4514 commands/typecmds.c:4523 +#, c-format +msgid "%s is not a base type" +msgstr "%s სáƒáƒ‘áƒáƒ–ისრტიპი áƒáƒ áƒáƒ" + +#: commands/user.c:200 +#, c-format +msgid "SYSID can no longer be specified" +msgstr "SYSID-ის შეცვლრáƒáƒ®áƒšáƒ უკვე შეუძლებელიáƒ" + +#: commands/user.c:318 commands/user.c:324 commands/user.c:330 commands/user.c:336 commands/user.c:342 +#, c-format +msgid "permission denied to create role" +msgstr "რáƒáƒšáƒ˜áƒ¡ შექმნის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/user.c:319 +#, c-format +msgid "Only roles with the %s attribute may create roles." +msgstr "რáƒáƒšáƒ”ბის შექმნრმხáƒáƒšáƒáƒ“ %s áƒáƒ¢áƒ áƒ˜áƒ‘უტის მქáƒáƒœáƒ” რáƒáƒšáƒ”ბს შეუძლიáƒáƒ—." + +#: commands/user.c:325 commands/user.c:331 commands/user.c:337 commands/user.c:343 +#, c-format +msgid "Only roles with the %s attribute may create roles with the %s attribute." +msgstr "მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბსáƒáƒª %s áƒáƒ¢áƒ áƒ˜áƒ‘უტი გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, შეუძლიáƒáƒ— რáƒáƒšáƒ˜áƒ¡ შექმნáƒ, რáƒáƒ›áƒ”ლსáƒáƒª áƒáƒ¥áƒ•ს áƒáƒ¢áƒ áƒ˜áƒ‘უტი %s." + +#: commands/user.c:354 commands/user.c:1386 commands/user.c:1393 gram.y:17355 gram.y:17401 utils/adt/acl.c:5568 utils/adt/acl.c:5574 +#, c-format +msgid "role name \"%s\" is reserved" +msgstr "რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი \"%s\" დáƒáƒªáƒ£áƒšáƒ˜áƒ" + +#: commands/user.c:356 commands/user.c:1388 commands/user.c:1395 +#, c-format +msgid "Role names starting with \"pg_\" are reserved." +msgstr "რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლები, რáƒáƒ›áƒšáƒ”ბიც \"pg_\"-ით იწყებáƒ, დáƒáƒªáƒ£áƒšáƒ˜áƒ." + +#: commands/user.c:377 commands/user.c:1410 +#, c-format +msgid "role \"%s\" already exists" +msgstr "რáƒáƒšáƒ˜ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/user.c:439 commands/user.c:924 +#, c-format +msgid "empty string is not a valid password, clearing password" +msgstr "ცáƒáƒ áƒ˜áƒ”ლი სტრიქáƒáƒœáƒ˜ áƒáƒ  áƒáƒ áƒ˜áƒ¡ სწáƒáƒ áƒ˜ პáƒáƒ áƒáƒšáƒ˜, პáƒáƒ áƒáƒšáƒ˜áƒ¡ გáƒáƒ¬áƒ›áƒ”ნდáƒ" + +#: commands/user.c:468 +#, c-format +msgid "pg_authid OID value not set when in binary upgrade mode" +msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის რეჟიმში pg_authid-ის OID-ის მნიშვნელáƒáƒ‘რდáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: commands/user.c:652 commands/user.c:1010 +msgid "Cannot alter reserved roles." +msgstr "დáƒáƒ áƒ”ზერვებულირრáƒáƒšáƒ”ბის შეცვლრშეუძლებელიáƒ." + +#: commands/user.c:759 commands/user.c:765 commands/user.c:781 commands/user.c:789 commands/user.c:803 commands/user.c:809 commands/user.c:815 commands/user.c:824 commands/user.c:869 commands/user.c:1032 commands/user.c:1043 +#, c-format +msgid "permission denied to alter role" +msgstr "რáƒáƒšáƒ˜áƒ¡ შეცვლის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/user.c:760 commands/user.c:1033 +#, c-format +msgid "Only roles with the %s attribute may alter roles with the %s attribute." +msgstr "მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს რáƒáƒ›áƒšáƒ”ბსáƒáƒª %s áƒáƒ¢áƒ áƒ˜áƒ‘უტი გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, შეუძლიáƒáƒ— შეცვáƒáƒšáƒáƒœ რáƒáƒšáƒ”ბი, რáƒáƒ›áƒšáƒ”ბსáƒáƒª %s áƒáƒ¢áƒ áƒ˜áƒ‘უტი გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—." + +#: commands/user.c:766 commands/user.c:804 commands/user.c:810 commands/user.c:816 +#, c-format +msgid "Only roles with the %s attribute may change the %s attribute." +msgstr "მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბსáƒáƒª %s áƒáƒ¢áƒ áƒ˜áƒ‘უტი გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, შეუძლიáƒáƒ— %s áƒáƒ¢áƒ áƒ˜áƒ‘უტი შეცვáƒáƒšáƒáƒœ." + +#: commands/user.c:782 commands/user.c:1044 +#, c-format +msgid "Only roles with the %s attribute and the %s option on role \"%s\" may alter this role." +msgstr "მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბსáƒáƒª %s áƒáƒ¢áƒ áƒ˜áƒ‘უტი დრ%s პáƒáƒ áƒáƒ›áƒ”ტრი გáƒáƒáƒ©áƒœáƒ˜áƒáƒ— რáƒáƒšáƒ–ე \"%s\", შეუძლიáƒáƒ—, ეს რáƒáƒšáƒ˜ შეცვáƒáƒšáƒáƒœ." + +#: commands/user.c:790 +#, c-format +msgid "To change another role's password, the current user must have the %s attribute and the %s option on the role." +msgstr "სხვრრáƒáƒšáƒ˜áƒ¡ პáƒáƒ áƒáƒšáƒ˜áƒ¡ შესáƒáƒªáƒ•ლელáƒáƒ“ მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს áƒáƒ› რáƒáƒšáƒ–ე %s áƒáƒ¢áƒ áƒ˜áƒ‘უტი დრ%s პáƒáƒ áƒáƒ›áƒ”ტრი უნდრჰქáƒáƒœáƒ“ეს." + +#: commands/user.c:825 +#, c-format +msgid "Only roles with the %s option on role \"%s\" may add members." +msgstr "წევრების დáƒáƒ›áƒáƒ¢áƒ”ბრმხáƒáƒšáƒáƒ“ \"%2$s\" რáƒáƒšáƒ–ე %1$s პáƒáƒ áƒáƒ›áƒ”ტრის მქáƒáƒœáƒ” რáƒáƒšáƒ”ბს შეუძლიáƒáƒ—." + +#: commands/user.c:870 +#, c-format +msgid "The bootstrap superuser must have the %s attribute." +msgstr "ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს %s áƒáƒ¢áƒ áƒ˜áƒ‘უტი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ უნდრჰქáƒáƒœáƒ“ეს." + +#: commands/user.c:1075 +#, c-format +msgid "permission denied to alter setting" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის შეცვლის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/user.c:1076 +#, c-format +msgid "Only roles with the %s attribute may alter settings globally." +msgstr "გლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრების შეცვლრმხáƒáƒšáƒáƒ“ %s áƒáƒ¢áƒ áƒ˜áƒ‘უტის მქáƒáƒœáƒ” რáƒáƒšáƒ”ბს შეუძლიáƒáƒ—." + +#: commands/user.c:1100 commands/user.c:1171 commands/user.c:1177 +#, c-format +msgid "permission denied to drop role" +msgstr "რáƒáƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/user.c:1101 +#, c-format +msgid "Only roles with the %s attribute and the %s option on the target roles may drop roles." +msgstr "რáƒáƒšáƒ”ბის წáƒáƒ¨áƒšáƒ მხáƒáƒšáƒáƒ“ სáƒáƒ›áƒ˜áƒ–ნე რáƒáƒšáƒ–ე %s áƒáƒ¢áƒ áƒ˜áƒ‘უტისრდრ%s პáƒáƒ áƒáƒ›áƒ”ტრის მქáƒáƒœáƒ” რáƒáƒšáƒ”ბს შეუძლიáƒáƒ—." + +#: commands/user.c:1125 +#, c-format +msgid "cannot use special role specifier in DROP ROLE" +msgstr "სპეციáƒáƒšáƒ£áƒ áƒ˜ რáƒáƒšáƒ˜áƒ¡ მიმთითებლის გáƒáƒ›áƒáƒ§áƒ”ნებრDROP ROLE-ში შეუძლებელიáƒ" + +#: commands/user.c:1135 commands/user.c:1357 commands/variable.c:838 commands/variable.c:841 commands/variable.c:947 commands/variable.c:950 utils/adt/acl.c:365 utils/adt/acl.c:385 utils/adt/acl.c:5423 utils/adt/acl.c:5471 utils/adt/acl.c:5499 utils/adt/acl.c:5518 utils/adt/regproc.c:1571 utils/init/miscinit.c:762 +#, c-format +msgid "role \"%s\" does not exist" +msgstr "რáƒáƒšáƒ˜ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" + +#: commands/user.c:1140 +#, c-format +msgid "role \"%s\" does not exist, skipping" +msgstr "რáƒáƒšáƒ˜ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\". გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/user.c:1153 commands/user.c:1157 +#, c-format +msgid "current user cannot be dropped" +msgstr "მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: commands/user.c:1161 +#, c-format +msgid "session user cannot be dropped" +msgstr "სესიის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: commands/user.c:1172 +#, c-format +msgid "Only roles with the %s attribute may drop roles with the %s attribute." +msgstr "%2$s áƒáƒ¢áƒ áƒ˜áƒ‘უტის მქáƒáƒœáƒ” რáƒáƒšáƒ”ბის წáƒáƒ¨áƒšáƒ მხáƒáƒšáƒáƒ“ %1$s áƒáƒ¢áƒ áƒ˜áƒ‘უტის მქáƒáƒœáƒ” რáƒáƒšáƒ”ბს შეუძლიáƒáƒ—." + +#: commands/user.c:1178 +#, c-format +msgid "Only roles with the %s attribute and the %s option on role \"%s\" may drop this role." +msgstr "áƒáƒ› რáƒáƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ \"%3$s\" რáƒáƒšáƒ–ე %1$s áƒáƒ¢áƒ áƒ˜áƒ‘უტისრდრ%2$s პáƒáƒ áƒáƒ›áƒ”ტრის მქáƒáƒœáƒ” რáƒáƒšáƒ”ბს შეუძლიáƒáƒ—." + +#: commands/user.c:1299 +#, c-format +msgid "role \"%s\" cannot be dropped because some objects depend on it" +msgstr "რáƒáƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ენ áƒáƒ‘იექტები, რáƒáƒ›áƒšáƒ”ბიც მáƒáƒ¡ ეყრდნáƒáƒ‘იáƒáƒœ" + +#: commands/user.c:1373 +#, c-format +msgid "session user cannot be renamed" +msgstr "სესიის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრშეუძლებელიáƒ" + +#: commands/user.c:1377 +#, c-format +msgid "current user cannot be renamed" +msgstr "იმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრშეუძლებელიáƒ" + +#: commands/user.c:1421 commands/user.c:1431 +#, c-format +msgid "permission denied to rename role" +msgstr "რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/user.c:1422 +#, c-format +msgid "Only roles with the %s attribute may rename roles with the %s attribute." +msgstr "%2$s áƒáƒ¢áƒ áƒ˜áƒ‘უტის მქáƒáƒœáƒ” რáƒáƒšáƒ”ბის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრმხáƒáƒšáƒáƒ“ %1$s áƒáƒ¢áƒ áƒ˜áƒ‘უტის მქáƒáƒœáƒ” რáƒáƒšáƒ”ბს შეუძლიáƒáƒ—." + +#: commands/user.c:1432 +#, c-format +msgid "Only roles with the %s attribute and the %s option on role \"%s\" may rename this role." +msgstr "áƒáƒ› რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრმხáƒáƒšáƒáƒ“ \"%3$s\" რáƒáƒšáƒ–ე %1$s áƒáƒ¢áƒ áƒ˜áƒ‘უტისრდრ%2$s პáƒáƒ áƒáƒ›áƒ”ტრის მქáƒáƒœáƒ” რáƒáƒšáƒ”ბს შეუძლიáƒáƒ—." + +#: commands/user.c:1454 +#, c-format +msgid "MD5 password cleared because of role rename" +msgstr "MD5 პáƒáƒ áƒáƒšáƒ˜ გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•დრრáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის შეცვლის გáƒáƒ›áƒ" + +#: commands/user.c:1518 gram.y:1297 +#, c-format +msgid "unrecognized role option \"%s\"" +msgstr "რáƒáƒšáƒ˜áƒ¡ უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: commands/user.c:1523 +#, c-format +msgid "unrecognized value for role option \"%s\": \"%s\"" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის (%s) უცნáƒáƒ‘ი მნიშვნელáƒáƒ‘áƒ: %s" + +#: commands/user.c:1556 +#, c-format +msgid "column names cannot be included in GRANT/REVOKE ROLE" +msgstr "'GRANT/REVOKE ROLE'-ში სვეტის სáƒáƒ®áƒ”ლებს ვერ ჩáƒáƒ¡áƒ•áƒáƒ›áƒ—" + +#: commands/user.c:1596 +#, c-format +msgid "permission denied to drop objects" +msgstr "áƒáƒ‘იექტების წáƒáƒ¨áƒšáƒ˜áƒ¡ წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/user.c:1597 +#, c-format +msgid "Only roles with privileges of role \"%s\" may drop objects owned by it." +msgstr "მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბსáƒáƒª რáƒáƒšáƒ˜áƒ¡, '%s' პრივილეგიები გáƒáƒáƒ©áƒœáƒ˜áƒ, შეუძლიáƒ, მის მფლáƒáƒ‘ელáƒáƒ‘áƒáƒ¨áƒ˜ მყáƒáƒ¤áƒ˜ áƒáƒ‘იექტები წáƒáƒ¨áƒáƒšáƒáƒ¡." + +#: commands/user.c:1625 commands/user.c:1636 +#, c-format +msgid "permission denied to reassign objects" +msgstr "áƒáƒ‘იექტების თáƒáƒ•იდáƒáƒœ მინიჭების უფლებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/user.c:1626 +#, c-format +msgid "Only roles with privileges of role \"%s\" may reassign objects owned by it." +msgstr "მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბსáƒáƒª რáƒáƒšáƒ˜áƒ¡, '%s' პრივილეგიები გáƒáƒáƒ©áƒœáƒ˜áƒ, შეუძლიáƒ, მის მფლáƒáƒ‘ელáƒáƒ‘áƒáƒ¨áƒ˜ მყáƒáƒ¤áƒ˜ áƒáƒ‘იექტები თáƒáƒ•იდáƒáƒœ მიáƒáƒœáƒ˜áƒ­áƒáƒ¡." + +#: commands/user.c:1637 +#, c-format +msgid "Only roles with privileges of role \"%s\" may reassign objects to it." +msgstr "მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბსáƒáƒª რáƒáƒšáƒ˜áƒ¡, '%s' პრივილეგიები გáƒáƒáƒ©áƒœáƒ˜áƒ, შეუძლიáƒ, áƒáƒ‘იექტები თáƒáƒ•იდáƒáƒœ მიáƒáƒœáƒ˜áƒ­áƒáƒ¡." + +#: commands/user.c:1733 +#, c-format +msgid "role \"%s\" cannot be a member of any role" +msgstr "რáƒáƒšáƒ˜ \"%s\" სხვრრáƒáƒšáƒ˜áƒ¡ წევრი ვერ იქნებáƒ" + +#: commands/user.c:1746 +#, c-format +msgid "role \"%s\" is a member of role \"%s\"" +msgstr "რáƒáƒšáƒ˜ \"%s\" რáƒáƒšáƒ˜áƒ¡ \"%s\" წევრიáƒ" + +#: commands/user.c:1786 commands/user.c:1812 +#, c-format +msgid "%s option cannot be granted back to your own grantor" +msgstr "%s პáƒáƒ áƒáƒ›áƒ”ტრს მáƒáƒ›áƒœáƒ˜áƒ­áƒ”ბელს ვერ მიáƒáƒœáƒ˜áƒ­áƒ”ბთ" + +#: commands/user.c:1889 +#, c-format +msgid "role \"%s\" has already been granted membership in role \"%s\" by role \"%s\"" +msgstr "რáƒáƒšáƒ˜ \"%s\" უკვე გáƒáƒ¬áƒ”ვრდრრáƒáƒšáƒ¨áƒ˜ \"%s\" \"%s\" რáƒáƒšáƒ˜áƒ¡ მიერ" + +#: commands/user.c:2024 +#, c-format +msgid "role \"%s\" has not been granted membership in role \"%s\" by role \"%s\"" +msgstr "რáƒáƒšáƒ¡ \"%s\" უáƒáƒ áƒ˜ ეთქვრრáƒáƒšáƒ¨áƒ˜ \"%s\" გáƒáƒ¬áƒ”ვრებáƒáƒ–ე \"%s\" რáƒáƒšáƒ˜áƒ¡ მიერ" + +#: commands/user.c:2124 +#, c-format +msgid "role \"%s\" cannot have explicit members" +msgstr "რáƒáƒšáƒ˜ \"%s\" áƒáƒ  შეიძლებáƒ, áƒáƒ¨áƒ™áƒáƒ áƒ წევრებს შეიცáƒáƒ•დეს" + +#: commands/user.c:2135 commands/user.c:2158 +#, c-format +msgid "permission denied to grant role \"%s\"" +msgstr "რáƒáƒšáƒ˜áƒ¡ (\"%s\") დáƒáƒ§áƒ”ნების წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/user.c:2137 +#, c-format +msgid "Only roles with the %s attribute may grant roles with the %s attribute." +msgstr "მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბსáƒáƒª %s áƒáƒ¢áƒ áƒ˜áƒ‘უტი გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, შეუძლიáƒáƒ—, რáƒáƒšáƒ”ბს %s áƒáƒ¢áƒ áƒ˜áƒ‘უტი მიáƒáƒœáƒ˜áƒ­áƒáƒœ." + +#: commands/user.c:2142 commands/user.c:2165 +#, c-format +msgid "permission denied to revoke role \"%s\"" +msgstr "რáƒáƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ£áƒ¥áƒ›áƒ”ბის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/user.c:2144 +#, c-format +msgid "Only roles with the %s attribute may revoke roles with the %s attribute." +msgstr "მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბსáƒáƒª %s áƒáƒ¢áƒ áƒ˜áƒ‘უტი გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, შეუძლიáƒáƒ—, რáƒáƒšáƒ”ბს %s áƒáƒ¢áƒ áƒ˜áƒ‘უტი მáƒáƒáƒªáƒ˜áƒšáƒáƒœ." + +#: commands/user.c:2160 +#, c-format +msgid "Only roles with the %s option on role \"%s\" may grant this role." +msgstr "მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბსáƒáƒª რáƒáƒšáƒ–ე \"%2$s\" პáƒáƒ áƒáƒ›áƒ”ტრი \"%1$s\" გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, შეუძლიáƒáƒ—, მიáƒáƒœáƒ˜áƒ­áƒáƒœ ეს რáƒáƒšáƒ˜." + +#: commands/user.c:2167 +#, c-format +msgid "Only roles with the %s option on role \"%s\" may revoke this role." +msgstr "მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბსáƒáƒª რáƒáƒšáƒ–ე \"%2$s\" პáƒáƒ áƒáƒ›áƒ”ტრი \"%1$s\" გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, შეუძლიáƒáƒ—, მáƒáƒáƒªáƒ˜áƒšáƒáƒœ ეს რáƒáƒšáƒ˜." + +#: commands/user.c:2247 commands/user.c:2256 +#, c-format +msgid "permission denied to grant privileges as role \"%s\"" +msgstr "რáƒáƒšáƒ˜áƒ¡ (\"%s\") მინიჭების წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/user.c:2249 +#, c-format +msgid "Only roles with privileges of role \"%s\" may grant privileges as this role." +msgstr "მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბსáƒáƒª რáƒáƒšáƒ˜áƒ¡ \"%s\" პრივილეგიები გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, შეუძლიáƒáƒ— პრივილეგიები, რáƒáƒ’áƒáƒ áƒª, áƒáƒ› რáƒáƒšáƒ›áƒ, მიáƒáƒœáƒ˜áƒ­áƒáƒœ." + +#: commands/user.c:2258 +#, c-format +msgid "The grantor must have the %s option on role \"%s\"." +msgstr "მიმნიჭებელს უნდრჰქáƒáƒœáƒ“ეს %s პáƒáƒ áƒáƒ›áƒ”ტრი რáƒáƒšáƒ–ე \"%s\"." + +#: commands/user.c:2266 +#, c-format +msgid "permission denied to revoke privileges granted by role \"%s\"" +msgstr "რáƒáƒšáƒ˜áƒ¡ (\"%s\") მიერ მინიჭებული პრივილეგიების გáƒáƒ£áƒ¥áƒ›áƒ”ბის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/user.c:2268 +#, c-format +msgid "Only roles with privileges of role \"%s\" may revoke privileges granted by this role." +msgstr "მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბსáƒáƒª რáƒáƒšáƒ˜áƒ¡ \"%s\" პრივილეგიები გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, შეუძლიáƒáƒ— áƒáƒ› რáƒáƒšáƒ˜áƒ¡ მიერ მინიჭებული პრივილეგიები მáƒáƒáƒªáƒ˜áƒšáƒáƒœ." + +#: commands/user.c:2491 utils/adt/acl.c:1318 +#, c-format +msgid "dependent privileges exist" +msgstr "დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებული პრივილეგიები áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/user.c:2492 utils/adt/acl.c:1319 +#, c-format +msgid "Use CASCADE to revoke them too." +msgstr "მáƒáƒ— გáƒáƒ¡áƒáƒ£áƒ¥áƒ›áƒ”ბლáƒáƒ“áƒáƒª CASCADE გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: commands/vacuum.c:134 +#, c-format +msgid "\"vacuum_buffer_usage_limit\" must be 0 or between %d kB and %d kB" +msgstr "\"vacuum_buffer_usage_limit\"-ის მნიშვნელáƒáƒ‘რ0 áƒáƒœ %d კბ-სრდრ%d კბ-ს შáƒáƒ áƒ˜áƒ¡ უნდრიყáƒáƒ¡" + +#: commands/vacuum.c:209 +#, c-format +msgid "BUFFER_USAGE_LIMIT option must be 0 or between %d kB and %d kB" +msgstr "BUFFER_USAGE_LIMIT პáƒáƒ áƒáƒ›áƒ”ტრი 0 áƒáƒœ %d კბ-სრდრ%d კბ-ს შáƒáƒ áƒ˜áƒ¡ უნდრიყáƒáƒ¡" + +#: commands/vacuum.c:219 +#, c-format +msgid "unrecognized ANALYZE option \"%s\"" +msgstr "\"ANALYZE\"-ის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: %s" + +#: commands/vacuum.c:259 +#, c-format +msgid "parallel option requires a value between 0 and %d" +msgstr "პáƒáƒ áƒáƒšáƒ”ლურ პáƒáƒ áƒáƒ›áƒ”ტრს ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბრმნიშვნელáƒáƒ‘რ0-სრდრ%d-ს შáƒáƒ áƒ˜áƒ¡" + +#: commands/vacuum.c:271 +#, c-format +msgid "parallel workers for vacuum must be between 0 and %d" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების რáƒáƒáƒ“ენáƒáƒ‘რმáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისთვის 0-სრდრ%d-ს შáƒáƒ áƒ˜áƒ¡ უნდრიყáƒáƒ¡" + +#: commands/vacuum.c:292 +#, c-format +msgid "unrecognized VACUUM option \"%s\"" +msgstr "\"VACUUM\"-ის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: %s" + +#: commands/vacuum.c:318 +#, c-format +msgid "VACUUM FULL cannot be performed in parallel" +msgstr "VACUUM FULL პáƒáƒ áƒáƒšáƒ”ლურáƒáƒ“ ვერ შესრულდებáƒ" + +#: commands/vacuum.c:329 +#, c-format +msgid "BUFFER_USAGE_LIMIT cannot be specified for VACUUM FULL" +msgstr "VACUUM FULL-სთვის BUFFER_USAGE_LIMIT-ს ვერ მიუთითებთ" + +#: commands/vacuum.c:343 +#, c-format +msgid "ANALYZE option must be specified when a column list is provided" +msgstr "რáƒáƒªáƒ მიწáƒáƒ“ებულირსვეტების სიáƒ, პáƒáƒ áƒáƒ›áƒ”ტრის ANALYZE მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/vacuum.c:355 +#, c-format +msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" +msgstr "VACUUM-ის პáƒáƒ áƒáƒ›áƒ”ტრს 'DISABLE_PAGE_SKIPPING' FULL-თáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: commands/vacuum.c:362 +#, c-format +msgid "PROCESS_TOAST required with VACUUM FULL" +msgstr "VACUUM FULL-თáƒáƒœ ერთáƒáƒ“ PROCESS_TOAST áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: commands/vacuum.c:371 +#, c-format +msgid "ONLY_DATABASE_STATS cannot be specified with a list of tables" +msgstr "ONLY_DATABASE_STATS -ის მითითებრცხრილების სიáƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“ შეუძლებელიáƒ" + +#: commands/vacuum.c:380 +#, c-format +msgid "ONLY_DATABASE_STATS cannot be specified with other VACUUM options" +msgstr "ONLY_DATABASE_STAT-ის მითითებრსხვრVACUMM პáƒáƒ áƒáƒ›áƒ”ტრებთáƒáƒœ ერთáƒáƒ“ შეუძლებელიáƒ" + +#: commands/vacuum.c:515 +#, c-format +msgid "%s cannot be executed from VACUUM or ANALYZE" +msgstr "%s-ს VACUUM-დáƒáƒœ áƒáƒœ ANALYZE-დáƒáƒœ ვერ შეáƒáƒ¡áƒáƒ áƒ£áƒšáƒ”ბთ" + +#: commands/vacuum.c:730 +#, c-format +msgid "permission denied to vacuum \"%s\", skipping it" +msgstr "\"%s\"-ის მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/vacuum.c:743 +#, c-format +msgid "permission denied to analyze \"%s\", skipping it" +msgstr "\"%s\"-ის áƒáƒœáƒáƒšáƒ˜áƒ–ისთვის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: commands/vacuum.c:821 commands/vacuum.c:918 +#, c-format +msgid "skipping vacuum of \"%s\" --- lock not available" +msgstr "\"%s\"-ის მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრგáƒáƒ›áƒáƒ¢áƒáƒ•ებულირ-- ბლáƒáƒ™áƒ˜ ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ áƒáƒ áƒáƒ" + +#: commands/vacuum.c:826 +#, c-format +msgid "skipping vacuum of \"%s\" --- relation no longer exists" +msgstr "\"%s\"-ის მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრგáƒáƒ›áƒáƒ¢áƒáƒ•ებულირ-- ურთიერთáƒáƒ‘რáƒáƒ¦áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/vacuum.c:842 commands/vacuum.c:923 +#, c-format +msgid "skipping analyze of \"%s\" --- lock not available" +msgstr "\"%s\"-ის áƒáƒœáƒáƒšáƒ˜áƒ–ი გáƒáƒ›áƒáƒ¢áƒáƒ•ებულირ-- ბლáƒáƒ™áƒ˜ ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ áƒáƒ áƒáƒ" + +#: commands/vacuum.c:847 +#, c-format +msgid "skipping analyze of \"%s\" --- relation no longer exists" +msgstr "\"%s\"-ის áƒáƒœáƒáƒšáƒ˜áƒ–ი გáƒáƒ›áƒáƒ¢áƒáƒ•ებულირ-- ურთიერთáƒáƒ‘რáƒáƒ¦áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: commands/vacuum.c:1139 +#, c-format +msgid "cutoff for removing and freezing tuples is far in the past" +msgstr "" + +#: commands/vacuum.c:1140 commands/vacuum.c:1145 +#, c-format +msgid "" +"Close open transactions soon to avoid wraparound problems.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" + +#: commands/vacuum.c:1144 +#, c-format +msgid "cutoff for freezing multixacts is far in the past" +msgstr "" + +#: commands/vacuum.c:1890 +#, c-format +msgid "some databases have not been vacuumed in over 2 billion transactions" +msgstr "ზáƒáƒ’იერთი ბáƒáƒ–რ2 მილიáƒáƒ áƒ“ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ–ე მეტიáƒ, რáƒáƒª áƒáƒ  მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბულáƒ" + +#: commands/vacuum.c:1891 +#, c-format +msgid "You might have already suffered transaction-wraparound data loss." +msgstr "" + +#: commands/vacuum.c:2070 +#, c-format +msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" +msgstr "" + +#: commands/vacuum.c:2502 +#, c-format +msgid "scanned index \"%s\" to remove %lld row versions" +msgstr "სკáƒáƒœáƒ˜áƒ áƒ”ბული ინდექსი \"%s\" %lld მწკრივის ვერსიის წáƒáƒ¨áƒšáƒáƒ¡ áƒáƒžáƒ˜áƒ áƒ”ბს" + +#: commands/vacuum.c:2521 +#, c-format +msgid "index \"%s\" now contains %.0f row versions in %u pages" +msgstr "ინდექსი \"%s\" áƒáƒ®áƒšáƒ %.0f მწკრივის ვერსიáƒáƒ¡ შეიცáƒáƒ•ს, %u გვერდში" + +#: commands/vacuum.c:2525 +#, c-format +msgid "" +"%.0f index row versions were removed.\n" +"%u index pages were newly deleted.\n" +"%u index pages are currently deleted, of which %u are currently reusable." +msgstr "" + +#: commands/vacuumparallel.c:708 +#, c-format +msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" +msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" +msgstr[0] "ინდექსის მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისთვის გáƒáƒ¨áƒ•ებულირ%d პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი (დáƒáƒ’ეგმილიáƒ: %d)" +msgstr[1] "ინდექსის მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისთვის გáƒáƒ¨áƒ•ებულირ%d პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი (დáƒáƒ’ეგმილიáƒ: %d)" + +#: commands/vacuumparallel.c:714 +#, c-format +msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" +msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" +msgstr[0] "ინდექსის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებისთვის გáƒáƒ¨áƒ•ებულირ%d პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი (დáƒáƒ’ეგმილიáƒ: %d)" +msgstr[1] "ინდექსის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებისთვის გáƒáƒ¨áƒ•ებულირ%d პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი (დáƒáƒ’ეგმილიáƒ: %d)" + +#: commands/variable.c:185 +#, c-format +msgid "Conflicting \"datestyle\" specifications." +msgstr "კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ£áƒ áƒ˜ \"datestyle\"-ის სპეციფიკáƒáƒªáƒ˜áƒ”ბი." + +#: commands/variable.c:307 +#, c-format +msgid "Cannot specify months in time zone interval." +msgstr "დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლის ინტერვáƒáƒšáƒ¨áƒ˜ თვეებს ვერ მიუთითებთ." + +#: commands/variable.c:313 +#, c-format +msgid "Cannot specify days in time zone interval." +msgstr "დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლის ინტერვáƒáƒšáƒ¨áƒ˜ დღეებს ვერ მიუთითებთ." + +#: commands/variable.c:351 commands/variable.c:433 +#, c-format +msgid "time zone \"%s\" appears to use leap seconds" +msgstr "დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლი \"%s\", რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, დáƒáƒ›áƒáƒ¢áƒ”ბით წáƒáƒ›áƒ”ბს იყენებს" + +#: commands/variable.c:353 commands/variable.c:435 +#, c-format +msgid "PostgreSQL does not support leap seconds." +msgstr "PostgreSQL-ს დáƒáƒ›áƒáƒ¢áƒ”ბითი წáƒáƒ›áƒ”ბის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." + +#: commands/variable.c:362 +#, c-format +msgid "UTC timezone offset is out of range." +msgstr "UTC დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლი ზღვáƒáƒ áƒ¡ მიღმáƒáƒ." + +#: commands/variable.c:552 +#, c-format +msgid "cannot set transaction read-write mode inside a read-only transaction" +msgstr "მხáƒáƒšáƒáƒ“-კითხვáƒáƒ“ი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ შიგნით ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ რეჟიმის ჩáƒáƒ¬áƒ”რáƒ-წáƒáƒ™áƒ˜áƒ—ხვის რეჟიმზე გáƒáƒ“áƒáƒ áƒ—ვრშეუძლებელიáƒ" + +#: commands/variable.c:559 +#, c-format +msgid "transaction read-write mode must be set before any query" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რáƒ-წáƒáƒ™áƒ˜áƒ—ხვის რეჟიმი ყველრმáƒáƒ—ხáƒáƒ•ნის წინ უნდრიქნეს დáƒáƒ§áƒ”ნებული" + +#: commands/variable.c:566 +#, c-format +msgid "cannot set transaction read-write mode during recovery" +msgstr "áƒáƒ¦áƒ“გენისáƒáƒ¡ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რáƒ-წáƒáƒ™áƒ˜áƒ—ხვის რეჟიმის დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: commands/variable.c:592 +#, c-format +msgid "SET TRANSACTION ISOLATION LEVEL must be called before any query" +msgstr "SET TRANSACTION ISOLATION LEVEL ყველრმáƒáƒ—ხáƒáƒ•ნáƒáƒ–ე áƒáƒ“რე უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ—" + +#: commands/variable.c:599 +#, c-format +msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" +msgstr "SET TRANSACTION ISOLATION LEVEL ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¨áƒ˜ áƒáƒ  უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ—" + +#: commands/variable.c:606 storage/lmgr/predicate.c:1680 +#, c-format +msgid "cannot use serializable mode in a hot standby" +msgstr "ცხელი მáƒáƒšáƒáƒ“ინში სერიáƒáƒšáƒ˜áƒ–ებáƒáƒ“ი რეჟიმის გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: commands/variable.c:607 +#, c-format +msgid "You can use REPEATABLE READ instead." +msgstr "სáƒáƒ›áƒáƒ’იერáƒáƒ“, შეგიძლიáƒáƒ—, REPEATABLE READ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—." + +#: commands/variable.c:625 +#, c-format +msgid "SET TRANSACTION [NOT] DEFERRABLE cannot be called within a subtransaction" +msgstr "SET TRANSACTION [NOT] DEFERRABLE-ს ქვეტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜ ვერ გáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒ”ბთ" + +#: commands/variable.c:631 +#, c-format +msgid "SET TRANSACTION [NOT] DEFERRABLE must be called before any query" +msgstr "SET TRANSACTION [NOT] DEFERRABLE ყველრმáƒáƒ—ხáƒáƒ•ნáƒáƒ–ე áƒáƒ“რე უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ—" + +#: commands/variable.c:713 +#, c-format +msgid "Conversion between %s and %s is not supported." +msgstr "%s-დáƒáƒœ %s-ზე გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: commands/variable.c:720 +#, c-format +msgid "Cannot change \"client_encoding\" now." +msgstr "áƒáƒ®áƒšáƒ \"client_encoding\"-ს ვერ შეცვლით." + +#: commands/variable.c:781 +#, c-format +msgid "cannot change \"client_encoding\" during a parallel operation" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ \"client_encoding\" პáƒáƒ áƒáƒ›áƒ”ტრს ვერ შეცვლით" + +#: commands/variable.c:863 +#, c-format +msgid "permission will be denied to set session authorization \"%s\"" +msgstr "სესიის áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ \"%s\" დáƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜ იქნებáƒ" + +#: commands/variable.c:868 +#, c-format +msgid "permission denied to set session authorization \"%s\"" +msgstr "სესიის áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ \"%s\" დáƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/variable.c:972 +#, c-format +msgid "permission will be denied to set role \"%s\"" +msgstr "რáƒáƒšáƒ˜áƒ¡ (\"%s\") დáƒáƒ§áƒ”ნების წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜ იქნებáƒ" + +#: commands/variable.c:977 +#, c-format +msgid "permission denied to set role \"%s\"" +msgstr "რáƒáƒšáƒ˜áƒ¡ (\"%s\") დáƒáƒ§áƒ”ნების წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: commands/variable.c:1177 +#, c-format +msgid "Bonjour is not supported by this build" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ Bonjour -ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბბს" + +#: commands/variable.c:1205 +#, c-format +msgid "\"effective_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()." +msgstr "პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒ”ბზე, რáƒáƒ›áƒšáƒ”ბზეც posix_fadvise() ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ áƒáƒ áƒáƒ, \"effective_io_concurrency\"-ის მნიშვნელáƒáƒ‘რ0-ის ტáƒáƒšáƒ˜ უნდრყáƒáƒ¡." + +#: commands/variable.c:1218 +#, c-format +msgid "\"maintenance_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()." +msgstr "პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒ”ბზე, რáƒáƒ›áƒšáƒ”ბზეც posix_fadvise() ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ áƒáƒ áƒáƒ, \"maintenance_io_concurrency\"-ის მნიშვნელáƒáƒ‘რ0-ის ტáƒáƒšáƒ˜ უნდრყáƒáƒ¡." + +#: commands/variable.c:1231 +#, c-format +msgid "SSL is not supported by this build" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ SSL-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბბს" + +#: commands/view.c:79 +#, c-format +msgid "could not determine which collation to use for view column \"%s\"" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒªáƒœáƒáƒ‘ის შეცდáƒáƒ›áƒ ხედის სვეტისთვის \"%s\"" + +#: commands/view.c:274 commands/view.c:285 +#, c-format +msgid "cannot drop columns from view" +msgstr "ხედიდáƒáƒœ სვეტების წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: commands/view.c:290 +#, c-format +msgid "cannot change name of view column \"%s\" to \"%s\"" +msgstr "ხედის სვეტის სáƒáƒ®áƒ”ლის \"%s\" \"%s\"-ზე გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრშეუძლებელიáƒ" + +#: commands/view.c:293 +#, c-format +msgid "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." +msgstr "ხედის სვეტის სáƒáƒ®áƒ”ლის შესáƒáƒªáƒ•ლელáƒáƒ“ შეგიძლიáƒáƒ— ALTER VIEW ... RENAME COLUMN ... გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—." + +#: commands/view.c:304 +#, c-format +msgid "cannot change data type of view column \"%s\" from %s to %s" +msgstr "ხედის სვეტის (\"%s\") მáƒáƒœáƒáƒªáƒ”მის ტიპის შეცვლრ%s-დáƒáƒœ %s-ზე შეუძლებელიáƒ" + +#: commands/view.c:318 +#, c-format +msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" +msgstr "ხედის სვეტის (\"%s\") კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ შეცვლრ%s-დáƒáƒœ %s-ზე შეუძლებელიáƒ" + +#: commands/view.c:387 +#, c-format +msgid "views must not contain SELECT INTO" +msgstr "ხედები SELECT INTO-ს áƒáƒ  უნდრშეიცáƒáƒ•დნენ" + +#: commands/view.c:399 +#, c-format +msgid "views must not contain data-modifying statements in WITH" +msgstr "ხედები WITH-ში მáƒáƒœáƒáƒªáƒ”მების შემცვლელ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებს áƒáƒ  უნდრშეიცáƒáƒ•დნენ" + +#: commands/view.c:469 +#, c-format +msgid "CREATE VIEW specifies more column names than columns" +msgstr "CREATE VIEW áƒáƒ¦áƒ¬áƒ”რს მეტ სვეტის სáƒáƒ®áƒ”ლს, ვიდრე სვეტს" + +#: commands/view.c:477 +#, c-format +msgid "views cannot be unlogged because they do not have storage" +msgstr "" + +#: commands/view.c:491 +#, c-format +msgid "view \"%s\" will be a temporary view" +msgstr "ხედი დრáƒáƒ”ბითი იქნებáƒ: \"%s\"" + +#: executor/execCurrent.c:79 +#, c-format +msgid "cursor \"%s\" is not a SELECT query" +msgstr "კურსáƒáƒ áƒ˜ SELECT მáƒáƒ—ხáƒáƒ•ნრáƒáƒ áƒáƒ: \"%s\"" + +#: executor/execCurrent.c:85 +#, c-format +msgid "cursor \"%s\" is held from a previous transaction" +msgstr "კურსáƒáƒ áƒ˜ \"%s\" წინრტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ“áƒáƒœáƒáƒ შემáƒáƒ áƒ©áƒ”ნილი" + +#: executor/execCurrent.c:118 +#, c-format +msgid "cursor \"%s\" has multiple FOR UPDATE/SHARE references to table \"%s\"" +msgstr "კურსáƒáƒ áƒ¡ \"%s\" ცხრილáƒáƒ›áƒ“ე \"%s\" ერთზე მეტი FOR UPDATE/SHARE მიმáƒáƒ áƒ—ვრგáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: executor/execCurrent.c:127 +#, c-format +msgid "cursor \"%s\" does not have a FOR UPDATE/SHARE reference to table \"%s\"" +msgstr "კურსáƒáƒ áƒ¡ \"%s\" ცხრილáƒáƒ›áƒ“ე \"%s\" 'FOR UPDATE/SHARE' მიმáƒáƒ áƒ—ვრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: executor/execCurrent.c:137 executor/execCurrent.c:182 +#, c-format +msgid "cursor \"%s\" is not positioned on a row" +msgstr "კურსáƒáƒ áƒ˜ \"%s\" მწკრივზე áƒáƒ  მდებáƒáƒ áƒ”áƒáƒ‘ს" + +#: executor/execCurrent.c:169 executor/execCurrent.c:228 executor/execCurrent.c:239 +#, c-format +msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" +msgstr "კურსáƒáƒ áƒ˜ \"%s\" ცხრილის (\"%s\") მáƒáƒ áƒ¢áƒ˜áƒ•áƒáƒ“ი გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი სკáƒáƒœáƒ˜áƒ áƒ”ბáƒáƒ¡ áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: executor/execCurrent.c:280 executor/execExprInterp.c:2543 +#, c-format +msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის %d (%s) ტიპი áƒáƒ  ემთხვევრიმáƒáƒ¡, რáƒáƒ›áƒšáƒ˜áƒ—áƒáƒª გეგმრმზáƒáƒ“დებáƒáƒ“რ(%s)" + +#: executor/execCurrent.c:292 executor/execExprInterp.c:2555 +#, c-format +msgid "no value found for parameter %d" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრისთვის მნიშვნელáƒáƒ‘ების პáƒáƒ•ნრშეუძლებელიáƒ: %d" + +#: executor/execExpr.c:641 executor/execExpr.c:648 executor/execExpr.c:654 executor/execExprInterp.c:4741 executor/execExprInterp.c:4758 executor/execExprInterp.c:4857 executor/nodeModifyTable.c:194 executor/nodeModifyTable.c:205 executor/nodeModifyTable.c:222 executor/nodeModifyTable.c:230 +#, c-format +msgid "table row type and query-specified row type do not match" +msgstr "" + +#: executor/execExpr.c:642 executor/nodeModifyTable.c:195 +#, c-format +msgid "Query has too many columns." +msgstr "მáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ მეტისმეტáƒáƒ“ ბევრი სვეტ áƒáƒ¥áƒ•ს." + +#: executor/execExpr.c:649 executor/nodeModifyTable.c:223 +#, c-format +msgid "Query provides a value for a dropped column at ordinal position %d." +msgstr "" + +#: executor/execExpr.c:655 executor/execExprInterp.c:4759 executor/nodeModifyTable.c:206 +#, c-format +msgid "Table has type %s at ordinal position %d, but query expects %s." +msgstr "" + +#: executor/execExpr.c:1103 parser/parse_agg.c:840 +#, c-format +msgid "window function calls cannot be nested" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბებს ერთმáƒáƒœáƒ”თში ვერ ჩáƒáƒ“გáƒáƒ›áƒ—" + +#: executor/execExpr.c:1640 +#, c-format +msgid "target type is not an array" +msgstr "სáƒáƒ›áƒ˜áƒ–ნე ტიპი მáƒáƒ¡áƒ˜áƒ•ი áƒáƒ áƒáƒ" + +#: executor/execExpr.c:1980 +#, c-format +msgid "ROW() column has type %s instead of type %s" +msgstr "ROW() სვეტს %s ტიპის მáƒáƒ’იერ %s áƒáƒ¥áƒ•ს" + +#: executor/execExpr.c:2642 executor/execSRF.c:718 parser/parse_func.c:138 parser/parse_func.c:655 parser/parse_func.c:1033 +#, c-format +msgid "cannot pass more than %d argument to a function" +msgid_plural "cannot pass more than %d arguments to a function" +msgstr[0] "ფუნქციისთვის %d -ზე მეტი áƒáƒ áƒ’უმენტის გáƒáƒ“áƒáƒªáƒ”მრშეუძლებელიáƒ" +msgstr[1] "ფუნქციისთვის %d -ზე მეტი áƒáƒ áƒ’უმენტის გáƒáƒ“áƒáƒªáƒ”მრშეუძლებელიáƒ" + +#: executor/execExpr.c:2669 executor/execSRF.c:738 executor/functions.c:1067 utils/adt/jsonfuncs.c:4032 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "ფუნქციáƒ, რáƒáƒ›áƒ”ლიც სეტს áƒáƒ‘რუნებს, გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბულირკáƒáƒœáƒ¢áƒ”ქსტში, რáƒáƒ›áƒ”ლიც სეტებს ვერ იღებს" + +#: executor/execExpr.c:3075 parser/parse_node.c:272 parser/parse_node.c:322 +#, c-format +msgid "cannot subscript type %s because it does not support subscripting" +msgstr "" + +#: executor/execExpr.c:3203 executor/execExpr.c:3225 +#, c-format +msgid "type %s does not support subscripted assignment" +msgstr "" + +#: executor/execExprInterp.c:2007 +#, c-format +msgid "attribute %d of type %s has been dropped" +msgstr "%2$s ტიპის áƒáƒ¢áƒ áƒ˜áƒ‘უტი %1$d წáƒáƒ˜áƒ¨áƒáƒšáƒ" + +#: executor/execExprInterp.c:2013 +#, c-format +msgid "attribute %d of type %s has wrong type" +msgstr "%2$s ტიპის áƒáƒ¢áƒ áƒ˜áƒ‘უტის %1$d ტიპი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: executor/execExprInterp.c:2015 executor/execExprInterp.c:3214 executor/execExprInterp.c:3260 +#, c-format +msgid "Table has type %s, but query expects %s." +msgstr "ცხრილის ტიპირ%s, მáƒáƒ—ხáƒáƒ•ნრკი %s-ს მáƒáƒ”ლáƒáƒ“áƒ." + +#: executor/execExprInterp.c:2095 utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1752 utils/cache/typcache.c:1911 utils/cache/typcache.c:2058 utils/fmgr/funcapi.c:569 +#, c-format +msgid "type %s is not composite" +msgstr "ტიპი %s კáƒáƒ›áƒžáƒáƒ–იტური áƒáƒ áƒáƒ" + +#: executor/execExprInterp.c:2698 +#, c-format +msgid "WHERE CURRENT OF is not supported for this table type" +msgstr "WHERE CURRENT OF áƒáƒ› ტიპის ცხრილისთვის მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: executor/execExprInterp.c:2911 +#, c-format +msgid "cannot merge incompatible arrays" +msgstr "შეუთáƒáƒ•სებელი მáƒáƒ¡áƒ˜áƒ•ების შერწყმრშეუძლებელიáƒ" + +#: executor/execExprInterp.c:2912 +#, c-format +msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." +msgstr "" + +#: executor/execExprInterp.c:2933 utils/adt/arrayfuncs.c:1305 utils/adt/arrayfuncs.c:3496 utils/adt/arrayfuncs.c:5586 utils/adt/arrayfuncs.c:6103 utils/adt/arraysubs.c:150 utils/adt/arraysubs.c:488 +#, c-format +msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის ზáƒáƒ›áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რ(%d) მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› დáƒáƒ¡áƒáƒ¨áƒ•ებზე (%d) დიდიáƒ" + +#: executor/execExprInterp.c:2953 executor/execExprInterp.c:2988 +#, c-format +msgid "multidimensional arrays must have array expressions with matching dimensions" +msgstr "მრáƒáƒ•áƒáƒšáƒ’áƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœ მáƒáƒ¡áƒ˜áƒ•ებს უნდრჰქáƒáƒœáƒ“ეთ მáƒáƒ¡áƒ˜áƒ•ის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბები შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ზáƒáƒ›áƒ”ბით" + +#: executor/execExprInterp.c:2965 utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:335 utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:727 utils/adt/arrayfuncs.c:1533 utils/adt/arrayfuncs.c:2341 utils/adt/arrayfuncs.c:2356 utils/adt/arrayfuncs.c:2618 utils/adt/arrayfuncs.c:2634 utils/adt/arrayfuncs.c:2942 utils/adt/arrayfuncs.c:2957 utils/adt/arrayfuncs.c:3298 utils/adt/arrayfuncs.c:3526 utils/adt/arrayfuncs.c:5358 utils/adt/arrayfuncs.c:6195 +#: utils/adt/arrayfuncs.c:6539 utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 utils/adt/arrayutils.c:99 +#, c-format +msgid "array size exceeds the maximum allowed (%d)" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის ზáƒáƒ›áƒ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ  დáƒáƒ¡áƒáƒ¨áƒ•ებს(%d) áƒáƒ­áƒáƒ áƒ‘ებს" + +#: executor/execExprInterp.c:3213 executor/execExprInterp.c:3259 +#, c-format +msgid "attribute %d has wrong type" +msgstr "áƒáƒ¢áƒ áƒ˜áƒ‘უტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %d" + +#: executor/execExprInterp.c:3845 utils/adt/domains.c:158 +#, c-format +msgid "domain %s does not allow null values" +msgstr "დáƒáƒ›áƒ”ნ %s-ს ნულáƒáƒ•áƒáƒœáƒ˜ მნიშვნელáƒáƒ‘ების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: executor/execExprInterp.c:3860 utils/adt/domains.c:196 +#, c-format +msgid "value for domain %s violates check constraint \"%s\"" +msgstr "მნიშვნელáƒáƒ‘რდáƒáƒ›áƒ”ნისთვის %s áƒáƒ áƒ¦áƒ•ევს შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვáƒáƒ¡ \"%s\"" + +#: executor/execExprInterp.c:4433 +#, c-format +msgid "no SQL/JSON item found for specified path of column \"%s\"" +msgstr "" + +#: executor/execExprInterp.c:4438 +#, c-format +msgid "no SQL/JSON item found for specified path" +msgstr "" + +#: executor/execExprInterp.c:4742 +#, c-format +msgid "Table row contains %d attribute, but query expects %d." +msgid_plural "Table row contains %d attributes, but query expects %d." +msgstr[0] "ცხრილის მწკრივი %d áƒáƒ¢áƒ áƒ˜áƒ‘უტს შეიცáƒáƒ•ს, მáƒáƒ—ხáƒáƒ•ნრკი %d-ს მáƒáƒ”ლáƒáƒ“áƒ." +msgstr[1] "ცხრილის მწკრივი %d áƒáƒ¢áƒ áƒ˜áƒ‘უტს შეიცáƒáƒ•ს, მáƒáƒ—ხáƒáƒ•ნრკი %d-ს მáƒáƒ”ლáƒáƒ“áƒ." + +#: executor/execExprInterp.c:4858 executor/execSRF.c:977 +#, c-format +msgid "Physical storage mismatch on dropped attribute at ordinal position %d." +msgstr "" + +#: executor/execIndexing.c:593 +#, c-format +msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" +msgstr "" + +#: executor/execIndexing.c:870 +#, c-format +msgid "could not create exclusion constraint \"%s\"" +msgstr "გáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒ•ის შეზღუდვის (\"%s\") შექმნრშეუძლებელიáƒ" + +#: executor/execIndexing.c:873 +#, c-format +msgid "Key %s conflicts with key %s." +msgstr "გáƒáƒ¡áƒáƒ¦áƒ”ბი %s კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒáƒ‘ს გáƒáƒ¡áƒáƒ¦áƒ”ბ %s-სთáƒáƒœ." + +#: executor/execIndexing.c:875 +#, c-format +msgid "Key conflicts exist." +msgstr "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირგáƒáƒ¡áƒáƒ¦áƒ”ბების კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜." + +#: executor/execIndexing.c:881 +#, c-format +msgid "conflicting key value violates exclusion constraint \"%s\"" +msgstr "კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜áƒ¡ მქáƒáƒœáƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბის მნიშვნელáƒáƒ‘რáƒáƒ áƒ¦áƒ•ევს უნიკáƒáƒšáƒ£áƒ  შეზღუდვáƒáƒ¡ \"%s\"" + +#: executor/execIndexing.c:884 +#, c-format +msgid "Key %s conflicts with existing key %s." +msgstr "გáƒáƒ¡áƒáƒ¦áƒ”ბი %s კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒáƒ‘ს áƒáƒ áƒ¡áƒ”ბულ გáƒáƒ¡áƒáƒ¦áƒ”ბ %s-სთáƒáƒœ." + +#: executor/execIndexing.c:886 +#, c-format +msgid "Key conflicts with existing key." +msgstr "გáƒáƒ¡áƒáƒ¦áƒ”ბი áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ  გáƒáƒ¡áƒáƒ¦áƒ”ბთáƒáƒœ კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒáƒ‘ს." + +#: executor/execMain.c:1041 +#, c-format +msgid "cannot change sequence \"%s\"" +msgstr "მიმდევრáƒáƒ‘ის შეცვლრშეუძლებელიáƒ: \"%s\"" + +#: executor/execMain.c:1047 +#, c-format +msgid "cannot change TOAST relation \"%s\"" +msgstr "'TOAST' ტიპის ურთიერთáƒáƒ‘ის \"%s\" შეცვლრშეუძლებელიáƒ" + +#: executor/execMain.c:1066 +#, c-format +msgid "cannot change materialized view \"%s\"" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედის შეცვლრშეუძლებელიáƒ: %s" + +#: executor/execMain.c:1078 +#, c-format +msgid "cannot insert into foreign table \"%s\"" +msgstr "გáƒáƒ áƒ” ცხრილში ჩáƒáƒ›áƒáƒ¢áƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: executor/execMain.c:1084 +#, c-format +msgid "foreign table \"%s\" does not allow inserts" +msgstr "გáƒáƒ áƒ” ცხრილი ჩáƒáƒ›áƒáƒ¢áƒ”ბის სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ  იძლევáƒ: %s" + +#: executor/execMain.c:1091 +#, c-format +msgid "cannot update foreign table \"%s\"" +msgstr "გáƒáƒ áƒ” ცხრილის გáƒáƒœáƒáƒ®áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: executor/execMain.c:1097 +#, c-format +msgid "foreign table \"%s\" does not allow updates" +msgstr "გáƒáƒ áƒ” ცხრილი გáƒáƒœáƒáƒ®áƒšáƒ”ბების სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ  იძლევáƒ: %s" + +#: executor/execMain.c:1104 +#, c-format +msgid "cannot delete from foreign table \"%s\"" +msgstr "გáƒáƒ áƒ” ცხრილიდáƒáƒœ წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" + +#: executor/execMain.c:1110 +#, c-format +msgid "foreign table \"%s\" does not allow deletes" +msgstr "გáƒáƒ áƒ” ცხრილი წáƒáƒ¨áƒšáƒ˜áƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ”ბáƒáƒ¡ áƒáƒ  იძლევáƒ: %s" + +#: executor/execMain.c:1121 +#, c-format +msgid "cannot change relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘ის შეცვლის შეცდáƒáƒ›áƒ: %s" + +#: executor/execMain.c:1148 +#, c-format +msgid "cannot lock rows in sequence \"%s\"" +msgstr "მიმდევრáƒáƒ‘áƒáƒ¨áƒ˜ მწკრივების ჩáƒáƒ™áƒ”ტვრშეუძლებელიáƒ: %s" + +#: executor/execMain.c:1155 +#, c-format +msgid "cannot lock rows in TOAST relation \"%s\"" +msgstr "\"TOAST\" ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ მწკრივების ჩáƒáƒ™áƒ”ტვრშეუძლებელიáƒ: %s" + +#: executor/execMain.c:1162 +#, c-format +msgid "cannot lock rows in view \"%s\"" +msgstr "ხედში მწკრივების ჩáƒáƒ™áƒ”ტვრშეუძლებელიáƒ: %s" + +#: executor/execMain.c:1170 +#, c-format +msgid "cannot lock rows in materialized view \"%s\"" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებულ ხედში მწკრივების ჩáƒáƒ™áƒ”ტვრშეუძლებელიáƒ: %s" + +#: executor/execMain.c:1179 executor/execMain.c:2684 executor/nodeLockRows.c:135 +#, c-format +msgid "cannot lock rows in foreign table \"%s\"" +msgstr "გáƒáƒ áƒ” ცხრილში მწკრივების ჩáƒáƒ™áƒ”ტვრშეუძლებელიáƒ: %s" + +#: executor/execMain.c:1185 +#, c-format +msgid "cannot lock rows in relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ მწკრივების ჩáƒáƒ™áƒ”ტვრშეუძლებელიáƒ: %s" + +#: executor/execMain.c:1898 +#, c-format +msgid "new row for relation \"%s\" violates partition constraint" +msgstr "áƒáƒ®áƒáƒšáƒ˜ მწკრივი ურთიერთáƒáƒ‘ისთვის \"%s\" დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ შეზღუდვáƒáƒ¡ áƒáƒ áƒ¦áƒ•ევს" + +#: executor/execMain.c:1900 executor/execMain.c:1984 executor/execMain.c:2035 executor/execMain.c:2145 +#, c-format +msgid "Failing row contains %s." +msgstr "შეცდáƒáƒ›áƒ˜áƒáƒœáƒ˜ მწკრივი \"%s\"-ს შეიცáƒáƒ•ს." + +#: executor/execMain.c:1981 +#, c-format +msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მნიშვნელáƒáƒ‘რსვეტში \"%s\" ურთიერთáƒáƒ‘ისთვის \"%s\" áƒáƒ áƒáƒœáƒ£áƒšáƒáƒ•áƒáƒœ შეზღუდვáƒáƒ¡ áƒáƒ áƒ¦áƒ•ევს" + +#: executor/execMain.c:2033 +#, c-format +msgid "new row for relation \"%s\" violates check constraint \"%s\"" +msgstr "áƒáƒ®áƒáƒšáƒ˜ მწკრივი ურთიერთáƒáƒ‘ისთვის \"%s\" áƒáƒ áƒ¦áƒ•ევს შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვáƒáƒ¡ \"%s\"" + +#: executor/execMain.c:2143 +#, c-format +msgid "new row violates check option for view \"%s\"" +msgstr "áƒáƒ®áƒáƒšáƒ˜ მწკრივი áƒáƒ áƒ¦áƒ•ევს შემáƒáƒ¬áƒ›áƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრს ხედისთვის \"%s\"" + +#: executor/execMain.c:2153 +#, c-format +msgid "new row violates row-level security policy \"%s\" for table \"%s\"" +msgstr "áƒáƒ®áƒáƒšáƒ˜ მწკრივი áƒáƒ áƒ¦áƒ•ევს მწკრივის-დáƒáƒœáƒ˜áƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის პáƒáƒšáƒ˜áƒ¢áƒ˜áƒ™áƒáƒ¡ \"%s\" ცხრილისთვის \"%s\"" + +#: executor/execMain.c:2158 +#, c-format +msgid "new row violates row-level security policy for table \"%s\"" +msgstr "áƒáƒ®áƒáƒšáƒ˜ მწკრივი ცხრილისთვის \"%s\" მწკრივის-დáƒáƒœáƒ˜áƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის პáƒáƒšáƒ˜áƒ¢áƒ˜áƒ™áƒ áƒáƒ áƒ¦áƒ•ევს" + +#: executor/execMain.c:2166 +#, c-format +msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" +msgstr "" + +#: executor/execMain.c:2171 +#, c-format +msgid "target row violates row-level security policy (USING expression) for table \"%s\"" +msgstr "" + +#: executor/execMain.c:2178 +#, c-format +msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" +msgstr "" + +#: executor/execMain.c:2183 +#, c-format +msgid "new row violates row-level security policy (USING expression) for table \"%s\"" +msgstr "" + +#: executor/execPartition.c:327 +#, c-format +msgid "no partition of relation \"%s\" found for row" +msgstr "მწკრივისთვის ურთიერთáƒáƒ‘ის \"%s\" დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜ ვერ ვიპáƒáƒ•ე" + +#: executor/execPartition.c:330 +#, c-format +msgid "Partition key of the failing row contains %s." +msgstr "შეცდáƒáƒ›áƒ˜áƒáƒœáƒ˜ მწკრივის დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბი \"%s\"-ს შეიცáƒáƒ•ს." + +#: executor/execReplication.c:272 executor/execReplication.c:456 +#, c-format +msgid "tuple to be locked was already moved to another partition due to concurrent update, retrying" +msgstr "დáƒáƒ¡áƒáƒ‘ლáƒáƒ™áƒ˜ კáƒáƒ áƒ¢áƒ”ჟი პáƒáƒ áƒáƒšáƒ”ლური გáƒáƒœáƒáƒ®áƒšáƒ”ბის გáƒáƒ›áƒ უკვე სხვრდáƒáƒœáƒáƒ§áƒáƒ¤áƒ¨áƒ˜áƒ გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜. თáƒáƒ•იდáƒáƒœ ვცდი" + +#: executor/execReplication.c:276 executor/execReplication.c:460 +#, c-format +msgid "concurrent update, retrying" +msgstr "ერთდრáƒáƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ. თáƒáƒ•იდáƒáƒœ ვცდი" + +#: executor/execReplication.c:282 executor/execReplication.c:466 +#, c-format +msgid "concurrent delete, retrying" +msgstr "ერთდრáƒáƒ£áƒšáƒ˜ წáƒáƒ¨áƒšáƒ. თáƒáƒ•იდáƒáƒœ ვცდი" + +#: executor/execReplication.c:352 parser/parse_cte.c:302 parser/parse_oper.c:221 utils/adt/array_userfuncs.c:1334 utils/adt/array_userfuncs.c:1477 utils/adt/arrayfuncs.c:3845 utils/adt/arrayfuncs.c:4400 utils/adt/arrayfuncs.c:6419 utils/adt/rowtypes.c:1220 +#, c-format +msgid "could not identify an equality operator for type %s" +msgstr "ტიპისთვის \"%s\" ტáƒáƒšáƒáƒ‘ის ფუნქცირვერ ვიპáƒáƒ•ე" + +#: executor/execReplication.c:683 executor/execReplication.c:689 +#, c-format +msgid "cannot update table \"%s\"" +msgstr "ცხრილის გáƒáƒœáƒáƒ®áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: executor/execReplication.c:685 executor/execReplication.c:697 +#, c-format +msgid "Column used in the publication WHERE expression is not part of the replica identity." +msgstr "გáƒáƒ›áƒáƒªáƒ”მის WHERE გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨áƒ˜ გáƒáƒ›áƒáƒ§áƒ”ნებული სვეტი რეპლიკის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ¬áƒ˜áƒšáƒ¡ áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს." + +#: executor/execReplication.c:691 executor/execReplication.c:703 +#, c-format +msgid "Column list used by the publication does not cover the replica identity." +msgstr "გáƒáƒ›áƒáƒªáƒ”მის მიერ გáƒáƒ›áƒáƒ§áƒ”ნებული სვეტების სირრეპლიკის იდენტიფიკáƒáƒªáƒ˜áƒáƒ¡ áƒáƒ  ფáƒáƒ áƒáƒ•ს." + +#: executor/execReplication.c:695 executor/execReplication.c:701 +#, c-format +msgid "cannot delete from table \"%s\"" +msgstr "ცხრილიდáƒáƒœ წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" + +#: executor/execReplication.c:721 +#, c-format +msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" +msgstr "ცხრილის \"%s\" გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ მáƒáƒ¡ რეპლიკის იდენტიფიკáƒáƒªáƒ˜áƒ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ დრგáƒáƒœáƒáƒ®áƒšáƒ”ბებს áƒáƒ¥áƒ•ეყნებს" + +#: executor/execReplication.c:723 +#, c-format +msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." +msgstr "ცხრილის გáƒáƒœáƒáƒ®áƒšáƒ”ბის ჩáƒáƒ¡áƒáƒ áƒ—áƒáƒ•áƒáƒ“ ALTER TABLE-ით REPLICA IDENTITY დáƒáƒáƒ§áƒ”ნეთ." + +#: executor/execReplication.c:727 +#, c-format +msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" +msgstr "ცხრილიდáƒáƒœ \"%s\" წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ მáƒáƒ¡ რეპლიკის იდენტიფიკáƒáƒªáƒ˜áƒ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ დრწáƒáƒ¨áƒšáƒ”ბს áƒáƒ¥áƒ•ეყნებს" + +#: executor/execReplication.c:729 +#, c-format +msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." +msgstr "ცხრილიდáƒáƒœ წáƒáƒ¨áƒšáƒ˜áƒ¡ ჩáƒáƒ¡áƒáƒ áƒ—áƒáƒ•áƒáƒ“ ALTER TABLE-ის გáƒáƒ›áƒáƒ§áƒ”ნებით REPLICA IDENTITY დáƒáƒáƒ§áƒ”ნეთ." + +#: executor/execReplication.c:745 +#, c-format +msgid "cannot use relation \"%s.%s\" as logical replication target" +msgstr "ურთიერთáƒáƒ‘áƒáƒ¡ \"%s.%s\" ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნედ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: executor/execSRF.c:315 +#, c-format +msgid "rows returned by function are not all of the same row type" +msgstr "ფუნქციის მიერ დáƒáƒ‘რუნებული მწკრივები ერთი ტიპის áƒáƒ áƒáƒ" + +#: executor/execSRF.c:365 +#, c-format +msgid "table-function protocol for value-per-call mode was not followed" +msgstr "" + +#: executor/execSRF.c:373 executor/execSRF.c:667 +#, c-format +msgid "table-function protocol for materialize mode was not followed" +msgstr "" + +#: executor/execSRF.c:380 executor/execSRF.c:685 +#, c-format +msgid "unrecognized table-function returnMode: %d" +msgstr "" + +#: executor/execSRF.c:894 +#, c-format +msgid "function returning setof record called in context that cannot accept type record" +msgstr "" + +#: executor/execSRF.c:950 executor/execSRF.c:966 executor/execSRF.c:976 +#, c-format +msgid "function return row and query-specified return row do not match" +msgstr "" + +#: executor/execSRF.c:951 +#, c-format +msgid "Returned row contains %d attribute, but query expects %d." +msgid_plural "Returned row contains %d attributes, but query expects %d." +msgstr[0] "" +msgstr[1] "" + +#: executor/execSRF.c:967 +#, c-format +msgid "Returned type %s at ordinal position %d, but query expects %s." +msgstr "" + +#: executor/execTuples.c:147 executor/execTuples.c:368 executor/execTuples.c:563 executor/execTuples.c:772 +#, c-format +msgid "cannot retrieve a system column in this context" +msgstr "áƒáƒ› კáƒáƒœáƒ¢áƒ”ქსტში სისტემური სვეტის მიღებრშეუძლებელიáƒ" + +#: executor/execTuples.c:163 executor/execTuples.c:580 +#, c-format +msgid "don't have transaction information for this type of tuple" +msgstr "" + +#: executor/execTuples.c:390 executor/execTuples.c:794 +#, c-format +msgid "don't have a storage tuple in this context" +msgstr "áƒáƒ› კáƒáƒœáƒ¢áƒ”ქსტში სáƒáƒªáƒáƒ•ის კáƒáƒ áƒ¢áƒ”ჟი áƒáƒ  áƒáƒ¥áƒ•ს" + +#: executor/execUtils.c:713 +#, c-format +msgid "materialized view \"%s\" has not been populated" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედი \"%s\" შევსებული áƒáƒ áƒáƒ" + +#: executor/execUtils.c:715 +#, c-format +msgid "Use the REFRESH MATERIALIZED VIEW command." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ბრძáƒáƒœáƒ”ბრREFRESH MATERIALIZED VIEW." + +#: executor/functions.c:217 +#, c-format +msgid "could not determine actual type of argument declared %s" +msgstr "áƒáƒ áƒ’უმენტის, áƒáƒ¦áƒ¬áƒ”რილის, რáƒáƒ’áƒáƒ áƒª '%s' ტიპის დáƒáƒ“გენრშეუძლებელიáƒ" + +#: executor/functions.c:512 +#, c-format +msgid "cannot COPY to/from client in an SQL function" +msgstr "'SQL' ფუნქციáƒáƒ¨áƒ˜ კლიენტიდáƒáƒœ/კლიენტáƒáƒ›áƒ“ე COPY შეუძლებელიáƒ" + +#. translator: %s is a SQL statement name +#: executor/functions.c:518 +#, c-format +msgid "%s is not allowed in an SQL function" +msgstr "%s SQL ფუნქციáƒáƒ¨áƒ˜ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#. translator: %s is a SQL statement name +#: executor/functions.c:526 executor/spi.c:1741 executor/spi.c:2649 +#, c-format +msgid "%s is not allowed in a non-volatile function" +msgstr "%s-ის გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ áƒáƒáƒ¥áƒ áƒáƒšáƒáƒ“ ფუნქციáƒáƒ¨áƒ˜ დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: executor/functions.c:1451 +#, c-format +msgid "SQL function \"%s\" statement %d" +msgstr "SQL ფუნქცირ\"%s\" გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრ%d" + +#: executor/functions.c:1477 +#, c-format +msgid "SQL function \"%s\" during startup" +msgstr "SQL ფუნქცირ\"%s\" გáƒáƒ¨áƒ•ებისáƒáƒ¡" + +#: executor/functions.c:1562 +#, c-format +msgid "calling procedures with output arguments is not supported in SQL functions" +msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტების მქáƒáƒœáƒ” პრáƒáƒªáƒ”დურების გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბრSQL-ის ფუნქციებში მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: executor/functions.c:1697 executor/functions.c:1735 executor/functions.c:1749 executor/functions.c:1844 executor/functions.c:1877 executor/functions.c:1891 +#, c-format +msgid "return type mismatch in function declared to return %s" +msgstr "დáƒáƒ‘რუნების ტიპის შეცდáƒáƒ›áƒ ფუნქციáƒáƒ¨áƒ˜, რáƒáƒ›áƒ”ლსáƒáƒª áƒáƒ¦áƒ¬áƒ”რილი áƒáƒ¥áƒ•ს, დáƒáƒáƒ‘რუნáƒáƒ¡ %s" + +#: executor/functions.c:1699 +#, c-format +msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE RETURNING." +msgstr "ფუნქციის ბáƒáƒšáƒ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრSELECT áƒáƒœ INSERT/UPDATE/DELETE/MERGE RETURNING უნდრიყáƒáƒ¡." + +#: executor/functions.c:1737 +#, c-format +msgid "Final statement must return exactly one column." +msgstr "პირველი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრზუსტáƒáƒ“ ერთ სვეტს უნდრáƒáƒ‘რუნებდეს." + +#: executor/functions.c:1751 +#, c-format +msgid "Actual return type is %s." +msgstr "დáƒáƒ‘რუნების ნáƒáƒ›áƒ“ვილი ტიპირ%s." + +#: executor/functions.c:1846 +#, c-format +msgid "Final statement returns too many columns." +msgstr "პირველი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრმეტისმეტáƒáƒ“ ბევრ სვეტს áƒáƒ‘რუნებს." + +#: executor/functions.c:1879 +#, c-format +msgid "Final statement returns %s instead of %s at column %d." +msgstr "" + +#: executor/functions.c:1893 +#, c-format +msgid "Final statement returns too few columns." +msgstr "ბáƒáƒšáƒ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრმეტისმეტáƒáƒ“ ცáƒáƒ¢áƒ სვეტს áƒáƒ‘რუნებს." + +#: executor/functions.c:1921 +#, c-format +msgid "return type %s is not supported for SQL functions" +msgstr "დáƒáƒ‘რუნების ტიპი %s SQL ფუნქციებში მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: executor/nodeAgg.c:3936 executor/nodeWindowAgg.c:2976 +#, c-format +msgid "aggregate %u needs to have compatible input type and transition type" +msgstr "" + +#: executor/nodeAgg.c:3966 parser/parse_agg.c:682 parser/parse_agg.c:710 +#, c-format +msgid "aggregate function calls cannot be nested" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒš ფუნქციებს ერთáƒáƒœáƒ”თში ვერ ჩáƒáƒ“გáƒáƒ›áƒ—" + +#: executor/nodeCustom.c:144 executor/nodeCustom.c:155 +#, c-format +msgid "custom scan \"%s\" does not support MarkPos" +msgstr "" + +#: executor/nodeHashjoin.c:1130 executor/nodeHashjoin.c:1160 +#, c-format +msgid "could not rewind hash-join temporary file" +msgstr "" + +#: executor/nodeIndexonlyscan.c:239 +#, c-format +msgid "lossy distance functions are not supported in index-only scans" +msgstr "" + +#: executor/nodeLimit.c:373 +#, c-format +msgid "OFFSET must not be negative" +msgstr "OFFSET უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ—ი უნდრიყáƒáƒ¡" + +#: executor/nodeLimit.c:399 +#, c-format +msgid "LIMIT must not be negative" +msgstr "LIMIT უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ—ი áƒáƒ  უნდრიყáƒáƒ¡" + +#: executor/nodeMergejoin.c:1578 +#, c-format +msgid "RIGHT JOIN is only supported with merge-joinable join conditions" +msgstr "" + +#: executor/nodeMergejoin.c:1596 +#, c-format +msgid "FULL JOIN is only supported with merge-joinable join conditions" +msgstr "" + +#: executor/nodeModifyTable.c:231 +#, c-format +msgid "Query has too few columns." +msgstr "მáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ძáƒáƒšáƒ˜áƒáƒœ ცáƒáƒ¢áƒ სვეტი áƒáƒ¥áƒ•ს." + +#: executor/nodeModifyTable.c:1531 executor/nodeModifyTable.c:1605 +#, c-format +msgid "tuple to be deleted was already modified by an operation triggered by the current command" +msgstr "" + +#: executor/nodeModifyTable.c:1760 +#, c-format +msgid "invalid ON UPDATE specification" +msgstr "\"ON UPDATE\"-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციფიკáƒáƒªáƒ˜áƒ" + +#: executor/nodeModifyTable.c:1761 +#, c-format +msgid "The result tuple would appear in a different partition than the original tuple." +msgstr "" + +#: executor/nodeModifyTable.c:2217 +#, c-format +msgid "cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key" +msgstr "" + +#: executor/nodeModifyTable.c:2218 +#, c-format +msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." +msgstr "" + +#: executor/nodeModifyTable.c:2221 +#, c-format +msgid "Consider defining the foreign key on table \"%s\"." +msgstr "გáƒáƒœáƒ˜áƒ®áƒ˜áƒšáƒ”თ გáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბის áƒáƒ¦áƒ¬áƒ”რრცხრილზე \"%s\"." + +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2567 executor/nodeModifyTable.c:3081 executor/nodeModifyTable.c:3242 +#, c-format +msgid "%s command cannot affect row a second time" +msgstr "ბრძáƒáƒœáƒ”ბáƒáƒ¡ %s მწკრივის მეáƒáƒ áƒ”დ შეცვლრáƒáƒ  შეუძლიáƒ" + +#: executor/nodeModifyTable.c:2569 +#, c-format +msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." +msgstr "" + +#: executor/nodeModifyTable.c:3074 executor/nodeModifyTable.c:3235 +#, c-format +msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" +msgstr "გáƒáƒ¡áƒáƒáƒ®áƒšáƒ”ბელი áƒáƒœ წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლ კáƒáƒ áƒ¢áƒ”ჟი მიმდინáƒáƒ áƒ” ბრძáƒáƒœáƒ”ბის მიერ დáƒáƒ¢áƒ áƒ˜áƒ’ერებულმრáƒáƒžáƒ”რáƒáƒªáƒ˜áƒáƒ› უკვე შეცვáƒáƒšáƒ" + +#: executor/nodeModifyTable.c:3083 executor/nodeModifyTable.c:3244 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "" + +#: executor/nodeModifyTable.c:3152 +#, c-format +msgid "tuple to be merged was already moved to another partition due to concurrent update" +msgstr "შესáƒáƒ áƒ¬áƒ§áƒ›áƒ”ლი კáƒáƒ áƒ¢áƒ”ჟები პáƒáƒ áƒáƒšáƒ”ლური გáƒáƒœáƒáƒ®áƒšáƒ”ბის გáƒáƒ›áƒ უკვე სხვრდáƒáƒœáƒáƒ§áƒáƒ¤áƒ¨áƒ˜áƒ გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜" + +#: executor/nodeSamplescan.c:244 +#, c-format +msgid "TABLESAMPLE parameter cannot be null" +msgstr "TABLESAMPLE პáƒáƒ áƒáƒ›áƒ”ტრი ნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" + +#: executor/nodeSamplescan.c:256 +#, c-format +msgid "TABLESAMPLE REPEATABLE parameter cannot be null" +msgstr "TABLESAMPLE REPEATABLE პáƒáƒ áƒáƒ›áƒ”ტრი ნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" + +#: executor/nodeSubplan.c:325 executor/nodeSubplan.c:351 executor/nodeSubplan.c:405 executor/nodeSubplan.c:1174 +#, c-format +msgid "more than one row returned by a subquery used as an expression" +msgstr "" + +#: executor/nodeTableFuncscan.c:370 +#, c-format +msgid "namespace URI must not be null" +msgstr "სáƒáƒ®áƒ”ლების სივრცის URI ნულáƒáƒ•áƒáƒœáƒ˜ áƒáƒ  შეიძლებáƒ, იყáƒáƒ¡" + +#: executor/nodeTableFuncscan.c:389 +#, c-format +msgid "row filter expression must not be null" +msgstr "მწკრივის ფილტრის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრნულáƒáƒ•áƒáƒœáƒ˜ áƒáƒ  შეიძლებáƒ, იყáƒáƒ¡" + +#: executor/nodeTableFuncscan.c:416 +#, c-format +msgid "column filter expression must not be null" +msgstr "სვეტის ფილტრის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრნულáƒáƒ•áƒáƒœáƒ˜ áƒáƒ  შეიძლებáƒ, იყáƒáƒ¡" + +#: executor/nodeTableFuncscan.c:417 +#, c-format +msgid "Filter for column \"%s\" is null." +msgstr "ფილტრი სვეტისთვის \"%s\" ნულáƒáƒ•áƒáƒœáƒ˜áƒ." + +#: executor/nodeTableFuncscan.c:507 +#, c-format +msgid "null is not allowed in column \"%s\"" +msgstr "სვეტში \"%s\" ნულáƒáƒ•áƒáƒœáƒ˜ მნიშვნელáƒáƒ‘რდáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: executor/nodeWindowAgg.c:356 +#, c-format +msgid "moving-aggregate transition function must not return null" +msgstr "" + +#: executor/nodeWindowAgg.c:2083 +#, c-format +msgid "frame starting offset must not be null" +msgstr "ჩáƒáƒ áƒ©áƒáƒ¡ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ წáƒáƒœáƒáƒªáƒ•ლებრნულის ტáƒáƒšáƒ˜ ვერ იქნებáƒ" + +#: executor/nodeWindowAgg.c:2096 +#, c-format +msgid "frame starting offset must not be negative" +msgstr "ჩáƒáƒ áƒ©áƒáƒ¡ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ წáƒáƒœáƒáƒªáƒ•ლებრუáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ—ი ვერ იქნებáƒ" + +#: executor/nodeWindowAgg.c:2108 +#, c-format +msgid "frame ending offset must not be null" +msgstr "ჩáƒáƒ áƒ©áƒáƒ¡ ბáƒáƒšáƒáƒ¡ წáƒáƒœáƒáƒªáƒ•ლებრნულის ტáƒáƒšáƒ˜ ვერ იქნებáƒ" + +#: executor/nodeWindowAgg.c:2121 +#, c-format +msgid "frame ending offset must not be negative" +msgstr "ჩáƒáƒ áƒ©áƒáƒ¡ ბáƒáƒšáƒáƒ¡ წáƒáƒœáƒáƒªáƒ•ლებრუáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ—ი ვერ იქნებáƒ" + +#: executor/nodeWindowAgg.c:2892 +#, c-format +msgid "aggregate function %s does not support use as a window function" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒš ფუნქციáƒáƒ¡ %s ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციáƒáƒ“ გáƒáƒ¨áƒ•ების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: executor/spi.c:241 executor/spi.c:341 +#, c-format +msgid "invalid transaction termination" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" + +#: executor/spi.c:256 +#, c-format +msgid "cannot commit while a subtransaction is active" +msgstr "რáƒáƒªáƒ ქვეტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ, კáƒáƒ›áƒ˜áƒ¢áƒ˜ შეუძლებელიáƒ" + +#: executor/spi.c:347 +#, c-format +msgid "cannot roll back while a subtransaction is active" +msgstr "რáƒáƒªáƒ ქვეტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ, ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ£áƒ¥áƒ›áƒ”ბრშეუძლებელიáƒ" + +#: executor/spi.c:471 +#, c-format +msgid "transaction left non-empty SPI stack" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ¡ შემდეგ დáƒáƒ áƒ©áƒ”ნილი SPI სტეკი ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ áƒáƒ" + +#: executor/spi.c:472 executor/spi.c:532 +#, c-format +msgid "Check for missing \"SPI_finish\" calls." +msgstr "ნáƒáƒ™áƒšáƒ£áƒš \"SPI_finish\" გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბებზე შემáƒáƒ¬áƒ›áƒ”ბáƒ." + +#: executor/spi.c:531 +#, c-format +msgid "subtransaction left non-empty SPI stack" +msgstr "ქვეტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ¡ შემდეგ დáƒáƒ áƒ©áƒ”ნილი SPI სტეკი ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ áƒáƒ" + +#: executor/spi.c:1599 +#, c-format +msgid "cannot open multi-query plan as cursor" +msgstr "მრáƒáƒ•áƒáƒšáƒ›áƒáƒ—ხáƒáƒ•ნიáƒáƒœáƒ˜ გეგმის კურსáƒáƒ áƒ˜áƒ¡ სáƒáƒ®áƒ˜áƒ— გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ" + +#. translator: %s is name of a SQL command, eg INSERT +#: executor/spi.c:1609 +#, c-format +msgid "cannot open %s query as cursor" +msgstr "%s გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის კურსáƒáƒ áƒ˜áƒ¡ სáƒáƒ®áƒ˜áƒ— გáƒáƒ®áƒœáƒ შეუძლებელიáƒ" + +#: executor/spi.c:1715 +#, c-format +msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" +msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: executor/spi.c:1716 parser/analyze.c:2928 +#, c-format +msgid "Scrollable cursors must be READ ONLY." +msgstr "გáƒáƒ“áƒáƒ®áƒ•ევáƒáƒ“ი კურსáƒáƒ áƒ”ბი READ ONLY უნდრიყáƒáƒ¡." + +#: executor/spi.c:2488 +#, c-format +msgid "empty query does not return tuples" +msgstr "ცáƒáƒ áƒ˜áƒ”ლი მáƒáƒ—ხáƒáƒ•ნრკáƒáƒ áƒ¢áƒ”ჟებს áƒáƒ  áƒáƒ‘რუნებს" + +#. translator: %s is name of a SQL command, eg INSERT +#: executor/spi.c:2562 +#, c-format +msgid "%s query does not return tuples" +msgstr "მáƒáƒ—ხáƒáƒ•ნრ%s კáƒáƒ áƒ¢áƒ”ჟებს áƒáƒ  áƒáƒ‘რუნებს" + +#: executor/spi.c:2979 +#, c-format +msgid "SQL expression \"%s\"" +msgstr "SQL გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრ\"%s\"" + +#: executor/spi.c:2984 +#, c-format +msgid "PL/pgSQL assignment \"%s\"" +msgstr "PL/pgSQL მინიჭებრ\"%s\"" + +#: executor/spi.c:2987 +#, c-format +msgid "SQL statement \"%s\"" +msgstr "SQL áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ \"%s\"" + +#: executor/tqueue.c:74 +#, c-format +msgid "could not send tuple to shared-memory queue" +msgstr "გáƒáƒ–იáƒáƒ áƒ”ბული-მეხსიერების მქáƒáƒœáƒ” რიგში კáƒáƒ áƒ¢áƒ”ჟის გáƒáƒ’ზáƒáƒ•ნრშეუძლებელიáƒ" + +#: foreign/foreign.c:224 +#, c-format +msgid "user mapping not found for user \"%s\", server \"%s\"" +msgstr "\"%s\"-სთვის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒ¡áƒáƒ®áƒ•რვერ ვიპáƒáƒ•ე. სერვერი \"%s\"" + +#: foreign/foreign.c:650 +#, c-format +msgid "invalid option \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\"" + +#: foreign/foreign.c:652 +#, c-format +msgid "Perhaps you meant the option \"%s\"." +msgstr "შესáƒáƒ«áƒšáƒáƒ, გულისხმáƒáƒ‘დით პáƒáƒ áƒáƒ›áƒ”ტრს \"%s\"." + +#: foreign/foreign.c:654 +#, c-format +msgid "There are no valid options in this context." +msgstr "áƒáƒ› კáƒáƒœáƒ¢áƒ”ქსტში სწáƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს." + +#: gram.y:1234 +#, c-format +msgid "UNENCRYPTED PASSWORD is no longer supported" +msgstr "UNENCRYPTED PASSWORD მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ¦áƒáƒ áƒáƒ" + +#: gram.y:1235 +#, c-format +msgid "Remove UNENCRYPTED to store the password in encrypted form instead." +msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ£áƒš ფáƒáƒ áƒ›áƒáƒ¨áƒ˜ დáƒáƒ¡áƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებლáƒáƒ“ წáƒáƒ¨áƒáƒšáƒ”თ UNENCRYPTED." + +#: gram.y:1562 gram.y:1578 +#, c-format +msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" +msgstr "CREATE SCHEMA IF NOT EXISTS áƒáƒ  შეიძლებáƒ, სქემის ელემენტებს შეიცáƒáƒ•დეს" + +#: gram.y:1730 +#, c-format +msgid "current database cannot be changed" +msgstr "მიმდინáƒáƒ áƒ” ბáƒáƒ–ის შეცვლრშეუძლებელიáƒ" + +#: gram.y:1863 +#, c-format +msgid "time zone interval must be HOUR or HOUR TO MINUTE" +msgstr "დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒšáƒ˜áƒ¡ ინტერვáƒáƒšáƒ˜ HOUR áƒáƒœ HOUR TO MINUTE უნდრიყáƒáƒ¡" + +#: gram.y:2539 +#, c-format +msgid "column number must be in range from 1 to %d" +msgstr "სვეტის ნáƒáƒ›áƒ”რი უნდრიყáƒáƒ¡ 1-დáƒáƒœ %d-მდე" + +#: gram.y:3135 +#, c-format +msgid "sequence option \"%s\" not supported here" +msgstr "მიმდევრáƒáƒ‘ის პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" áƒáƒ¥ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: gram.y:3174 +#, c-format +msgid "modulus for hash partition provided more than once" +msgstr "ჰეშ-დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ მáƒáƒ“ული ერთზე მეტჯერáƒáƒ მითითებული" + +#: gram.y:3183 +#, c-format +msgid "remainder for hash partition provided more than once" +msgstr "დáƒáƒ áƒ©áƒ”ნილი ნáƒáƒ¬áƒ˜áƒšáƒ˜ ჰეშ-დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒ—ვის ერთზე მეტჯერáƒáƒ მითითებული" + +#: gram.y:3190 +#, c-format +msgid "unrecognized hash partition bound specification \"%s\"" +msgstr "" + +#: gram.y:3198 +#, c-format +msgid "modulus for hash partition must be specified" +msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ ჰეშ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ მáƒáƒ“ულის მითითებáƒ" + +#: gram.y:3202 +#, c-format +msgid "remainder for hash partition must be specified" +msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ ჰეშ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ ნáƒáƒ¨áƒ—ის მითითებáƒ" + +#: gram.y:3410 gram.y:3444 +#, c-format +msgid "STDIN/STDOUT not allowed with PROGRAM" +msgstr "STDIN/STDOUT-ი PROGRAM-თáƒáƒœ ერთáƒáƒ“ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: gram.y:3416 +#, c-format +msgid "WHERE clause not allowed with COPY TO" +msgstr "პირáƒáƒ‘რ'WHERE' 'COPY TO'-სთáƒáƒœ ერთáƒáƒ“ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: gram.y:3764 gram.y:3771 gram.y:13068 gram.y:13076 +#, c-format +msgid "GLOBAL is deprecated in temporary table creation" +msgstr "დრáƒáƒ”ბითი ცხრილის შექმნáƒáƒ¨áƒ˜ GLOBAL-ი მáƒáƒ«áƒ•ელებულიáƒ" + +#: gram.y:4047 +#, c-format +msgid "for a generated column, GENERATED ALWAYS must be specified" +msgstr "გენერირებული სვეტისთვის GENERATED ALWAYS-ის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: gram.y:4392 utils/adt/ri_triggers.c:2103 +#, c-format +msgid "MATCH PARTIAL not yet implemented" +msgstr "MATCH PARTIAL ჯერ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: gram.y:4484 +#, c-format +msgid "a column list with %s is only supported for ON DELETE actions" +msgstr "" + +#: gram.y:5196 +#, c-format +msgid "CREATE EXTENSION ... FROM is no longer supported" +msgstr "CREATE EXTENSION ... FROM უკვე მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: gram.y:5894 +#, c-format +msgid "unrecognized row security option \"%s\"" +msgstr "მწკრივის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი:\"%s\"" + +#: gram.y:5895 +#, c-format +msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." +msgstr "" + +#: gram.y:5980 +#, c-format +msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" +msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: gram.y:6017 +msgid "duplicate trigger events specified" +msgstr "მითითებულირტრიგერი მეáƒáƒ áƒ“ებáƒ" + +#: gram.y:6159 parser/parse_utilcmd.c:3839 parser/parse_utilcmd.c:3865 +#, c-format +msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" +msgstr "" + +#: gram.y:6166 +#, c-format +msgid "conflicting constraint properties" +msgstr "ერთმáƒáƒœáƒ”თთáƒáƒœ შეუთáƒáƒ•სებელი შეზღუდვის თვისებები" + +#: gram.y:6265 +#, c-format +msgid "CREATE ASSERTION is not yet implemented" +msgstr "CREATE ASSERTION ჯერ გáƒáƒœáƒ£áƒ®áƒáƒ áƒªáƒ”ლებიáƒ" + +#: gram.y:6582 +#, c-format +msgid "dropping an enum value is not implemented" +msgstr "ჩáƒáƒ›áƒáƒœáƒáƒ—ვლის მნიშვნელáƒáƒ‘ის მáƒáƒªáƒ˜áƒšáƒ”ბრგáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: gram.y:6700 +#, c-format +msgid "RECHECK is no longer required" +msgstr "RECHECK სáƒáƒ­áƒ˜áƒ áƒ áƒáƒ¦áƒáƒ áƒáƒ" + +#: gram.y:6701 +#, c-format +msgid "Update your data type." +msgstr "გáƒáƒœáƒáƒáƒ®áƒšáƒ”თ თქვენი მáƒáƒœáƒáƒªáƒ”მთრტიპი." + +#: gram.y:8574 +#, c-format +msgid "aggregates cannot have output arguments" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ”ბს გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტები ვერ ექნებáƒ" + +#: gram.y:9037 utils/adt/regproc.c:670 +#, c-format +msgid "missing argument" +msgstr "ნáƒáƒ™áƒšáƒ£áƒšáƒ˜ áƒáƒ áƒ’უმენტი" + +#: gram.y:9038 utils/adt/regproc.c:671 +#, c-format +msgid "Use NONE to denote the missing argument of a unary operator." +msgstr "" + +#: gram.y:11266 gram.y:11285 +#, c-format +msgid "WITH CHECK OPTION not supported on recursive views" +msgstr "WITH CHECK OPTION რეკურსიულ ხედებზე მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: gram.y:13207 +#, c-format +msgid "LIMIT #,# syntax is not supported" +msgstr "LIMIT #,# სინტáƒáƒ¥áƒ¡áƒ˜ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: gram.y:13208 +#, c-format +msgid "Use separate LIMIT and OFFSET clauses." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ გáƒáƒœáƒªáƒáƒšáƒ™áƒ”ვებული LIMIT დრOFFSET პირáƒáƒ‘ები." + +#: gram.y:14083 +#, c-format +msgid "only one DEFAULT value is allowed" +msgstr "დáƒáƒ¡áƒáƒ¨áƒ•ებირDEFAULT_ის მხáƒáƒšáƒáƒ“ ერთი მნიშვნელáƒáƒ‘áƒ" + +#: gram.y:14092 +#, c-format +msgid "only one PATH value per column is allowed" +msgstr "ყáƒáƒ•ელ სვეტზე PATH-ის მხáƒáƒšáƒáƒ“ ერთი მნიშვნელáƒáƒ‘áƒáƒ დáƒáƒ¡áƒáƒ¨áƒ•ები" + +#: gram.y:14101 +#, c-format +msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" +msgstr "" + +#: gram.y:14110 +#, c-format +msgid "unrecognized column option \"%s\"" +msgstr "სვეტის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი %s" + +#: gram.y:14192 +#, c-format +msgid "only string constants are supported in JSON_TABLE path specification" +msgstr "" + +#: gram.y:14514 +#, c-format +msgid "precision for type float must be at least 1 bit" +msgstr "წილáƒáƒ“ი რიცხვების სიზუსტე 1 ბიტი მáƒáƒ˜áƒœáƒª უნდრიყáƒáƒ¡" + +#: gram.y:14523 +#, c-format +msgid "precision for type float must be less than 54 bits" +msgstr "წილáƒáƒ“ი რიცხვების სიზუსტე 54 ბიტზე მეტი ვერ იქნებáƒ" + +#: gram.y:15040 +#, c-format +msgid "wrong number of parameters on left side of OVERLAPS expression" +msgstr "" + +#: gram.y:15045 +#, c-format +msgid "wrong number of parameters on right side of OVERLAPS expression" +msgstr "" + +#: gram.y:15222 +#, c-format +msgid "UNIQUE predicate is not yet implemented" +msgstr "პრედიკáƒáƒ¢áƒ˜ UNIQUE ჯერ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: gram.y:15636 +#, c-format +msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" +msgstr "'WITHIN GROUP'-თáƒáƒœ ერთáƒáƒ“ ერთზე მეტი ORDER BY პირáƒáƒ‘ის გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: gram.y:15641 +#, c-format +msgid "cannot use DISTINCT with WITHIN GROUP" +msgstr "\"DISTINCT\"-ს \"WITHIN GROUP\"-თáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: gram.y:15646 +#, c-format +msgid "cannot use VARIADIC with WITHIN GROUP" +msgstr "\"VARIADIC\"-ს \"WITHIN GROUP\"-თáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: gram.y:16373 gram.y:16397 +#, c-format +msgid "frame start cannot be UNBOUNDED FOLLOWING" +msgstr "ჩáƒáƒ áƒ©áƒáƒ¡ დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ UNBOUNDED FOLLOWING ვერ იქნებáƒ" + +#: gram.y:16378 +#, c-format +msgid "frame starting from following row cannot end with current row" +msgstr "ჩáƒáƒ áƒ©áƒ, რáƒáƒ›áƒ”ლიც შემდეგი მწკრივიდáƒáƒœ იწყებáƒ, მიმდინáƒáƒ áƒ” მწკრივზე ვერ დáƒáƒ¡áƒ áƒ£áƒšáƒ“ებáƒ" + +#: gram.y:16402 +#, c-format +msgid "frame end cannot be UNBOUNDED PRECEDING" +msgstr "ჩáƒáƒ áƒ©áƒáƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜ UNBOUNDED PRECEDING ვერ იქნებáƒ" + +#: gram.y:16408 +#, c-format +msgid "frame starting from current row cannot have preceding rows" +msgstr "ჩáƒáƒ áƒ©áƒáƒ¡, რáƒáƒ›áƒ”ლიც მიმდინáƒáƒ áƒ” მწკრივიდáƒáƒœ იწყებáƒ, წინრჩáƒáƒ áƒ©áƒáƒ”ბი ვერ ექნებáƒ" + +#: gram.y:16415 +#, c-format +msgid "frame starting from following row cannot have preceding rows" +msgstr "ჩáƒáƒ áƒ©áƒáƒ¡, რáƒáƒ›áƒ”ლიც შემდეგი მწკრივიდáƒáƒœ იწყებáƒ, წინრჩáƒáƒ áƒ©áƒáƒ”ბი ვერ ექნებáƒ" + +#: gram.y:16964 +#, c-format +msgid "unrecognized JSON encoding: %s" +msgstr "უცნáƒáƒ‘ი JSON კáƒáƒ“ირებრ\"%s\"" + +#: gram.y:17288 +#, c-format +msgid "type modifier cannot have parameter name" +msgstr "ტიპის მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის სáƒáƒ®áƒ”ლი ვერ ექნებáƒ" + +#: gram.y:17294 +#, c-format +msgid "type modifier cannot have ORDER BY" +msgstr "ტიპის მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ¡ ORDER BY ვერ ექნებáƒ" + +#: gram.y:17362 gram.y:17369 gram.y:17376 +#, c-format +msgid "%s cannot be used as a role name here" +msgstr "%s áƒáƒ¥ რáƒáƒ’áƒáƒ áƒª რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლს ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: gram.y:17466 gram.y:18955 +#, c-format +msgid "WITH TIES cannot be specified without ORDER BY clause" +msgstr "WITH TIES-ს ORDER BY პირáƒáƒ‘ის გáƒáƒ áƒ”შე ვერ მიუთითებთ" + +#: gram.y:18646 gram.y:18821 +msgid "improper use of \"*\"" +msgstr "\"*\"-ის áƒáƒ áƒáƒ¡áƒáƒ—áƒáƒœáƒáƒ“რგáƒáƒ›áƒáƒ§áƒ”ნებáƒ" + +#: gram.y:18784 gram.y:18801 tsearch/spell.c:963 tsearch/spell.c:980 tsearch/spell.c:997 tsearch/spell.c:1014 tsearch/spell.c:1079 +#, c-format +msgid "syntax error" +msgstr "სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: gram.y:18885 +#, c-format +msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" +msgstr "" + +#: gram.y:18922 +#, c-format +msgid "multiple ORDER BY clauses not allowed" +msgstr "\"ORDER BY\"-ის გáƒáƒ›áƒáƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ ერთხელ შეგიძლიáƒáƒ—" + +#: gram.y:18933 +#, c-format +msgid "multiple OFFSET clauses not allowed" +msgstr "\"OFFSET\"-ის გáƒáƒ›áƒáƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ ერთხელ შეგიძლიáƒáƒ—" + +#: gram.y:18942 +#, c-format +msgid "multiple LIMIT clauses not allowed" +msgstr "\"LIMIT\"-ის გáƒáƒ›áƒáƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ ერთხელ შეგიძლიáƒáƒ—" + +#: gram.y:18951 +#, c-format +msgid "multiple limit options not allowed" +msgstr "ლიმიტის პáƒáƒ áƒáƒ›áƒ”ტრების მითითებრმხáƒáƒšáƒáƒ“ ერთხელ შეგიძლიáƒáƒ—" + +#: gram.y:18978 +#, c-format +msgid "multiple WITH clauses not allowed" +msgstr "\"WITH\"-ის გáƒáƒ›áƒáƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ ერთხელ შეგიძლიáƒáƒ—" + +#: gram.y:19171 +#, c-format +msgid "OUT and INOUT arguments aren't allowed in TABLE functions" +msgstr "" + +#: gram.y:19304 +#, c-format +msgid "multiple COLLATE clauses not allowed" +msgstr "\"COLLATE\"-ის გáƒáƒ›áƒáƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ ერთხელ შეგიძლიáƒáƒ—" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:19342 gram.y:19355 +#, c-format +msgid "%s constraints cannot be marked DEFERRABLE" +msgstr "%s -ის შეზღუდვებიs, რáƒáƒ’áƒáƒ áƒª DEFERRABLE, მáƒáƒœáƒ˜áƒ¨áƒ•ნრშეუძლებელიáƒ" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:19368 +#, c-format +msgid "%s constraints cannot be marked NOT VALID" +msgstr "%s -ის შეზღუდვებიs, რáƒáƒ’áƒáƒ áƒª NOT VALID, მáƒáƒœáƒ˜áƒ¨áƒ•ნრშეუძლებელიáƒ" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:19381 +#, c-format +msgid "%s constraints cannot be marked NO INHERIT" +msgstr "%s -ის შეზღუდვებიs, რáƒáƒ’áƒáƒ áƒª NO INHERIT, მáƒáƒœáƒ˜áƒ¨áƒ•ნრშეუძლებელიáƒ" + +#: gram.y:19403 +#, c-format +msgid "unrecognized partitioning strategy \"%s\"" +msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ უცნáƒáƒ‘ი სტრáƒáƒ¢áƒ”გიáƒ: %s" + +#: gram.y:19427 +#, c-format +msgid "invalid publication object list" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ”ბის áƒáƒ‘იექტების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიáƒ" + +#: gram.y:19428 +#, c-format +msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." +msgstr "" + +#: gram.y:19444 +#, c-format +msgid "invalid table name" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ცხრილის სáƒáƒ®áƒ”ლი" + +#: gram.y:19465 +#, c-format +msgid "WHERE clause not allowed for schema" +msgstr "WHERE პირáƒáƒ‘რსქემისთვის დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: gram.y:19472 +#, c-format +msgid "column specification not allowed for schema" +msgstr "სქემისთვის სვეტის მითითებრდáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: gram.y:19486 +#, c-format +msgid "invalid schema name" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სქემის სáƒáƒ®áƒ”ლი" + +#: guc-file.l:192 +#, c-format +msgid "empty configuration file name: \"%s\"" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ცáƒáƒ áƒ˜áƒ”ლი სáƒáƒ®áƒ”ლი: \"%s\"" + +#: guc-file.l:209 +#, c-format +msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: ჩáƒáƒšáƒáƒ’ების სიღრმე გáƒáƒ“áƒáƒªáƒ˜áƒšáƒ”ბულიáƒ" + +#: guc-file.l:229 +#, c-format +msgid "configuration file recursion in \"%s\"" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ რეკურსირ\"%s\"-ში" + +#: guc-file.l:245 +#, c-format +msgid "could not open configuration file \"%s\": %m" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ('%s') გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: guc-file.l:256 +#, c-format +msgid "skipping missing configuration file \"%s\"" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒ•ებრ\"%s\"" + +#: guc-file.l:511 +#, c-format +msgid "syntax error in file \"%s\" line %u, near end of line" +msgstr "სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ხáƒáƒ–ზე %u, ხáƒáƒ–ის ბáƒáƒšáƒáƒ¡áƒ—áƒáƒœ áƒáƒ®áƒšáƒáƒ¡" + +#: guc-file.l:521 +#, c-format +msgid "syntax error in file \"%s\" line %u, near token \"%s\"" +msgstr "სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ხáƒáƒ–ზე %u, áƒáƒ®áƒšáƒáƒ¡ კáƒáƒ“თáƒáƒœ \"%s\"" + +#: guc-file.l:541 +#, c-format +msgid "too many syntax errors found, abandoning file \"%s\"" +msgstr "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირმეტისმეტáƒáƒ“ ბევრი შეცდáƒáƒ›áƒ. ფáƒáƒ˜áƒšáƒ˜ \"%s\" მიტáƒáƒ•ებულიáƒ" + +#: jsonpath_gram.y:266 jsonpath_gram.y:598 jsonpath_scan.l:640 jsonpath_scan.l:651 jsonpath_scan.l:661 jsonpath_scan.l:712 utils/adt/encode.c:492 utils/adt/encode.c:557 utils/adt/jsonfuncs.c:658 utils/adt/varlena.c:333 utils/adt/varlena.c:374 +#, c-format +msgid "invalid input syntax for type %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შეყვáƒáƒœáƒ˜áƒ¡ სინტáƒáƒ¥áƒ¡áƒ˜ ტიპისთვის %s" + +#: jsonpath_gram.y:267 +#, c-format +msgid ".decimal() can only have an optional precision[,scale]." +msgstr "" + +#: jsonpath_gram.y:599 +#, c-format +msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." +msgstr "უცნáƒáƒ‘ი áƒáƒšáƒ›áƒ˜áƒ¡ სიმბáƒáƒšáƒ \"%.*s\" LIKE_REGEX პრედიკáƒáƒ¢áƒ¨áƒ˜." + +#: jsonpath_gram.y:629 tsearch/spell.c:749 utils/adt/regexp.c:223 +#, c-format +msgid "invalid regular expression: %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ: %s" + +#: jsonpath_gram.y:677 +#, c-format +msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" +msgstr "ენის XQuery áƒáƒšáƒáƒ›áƒ˜ \"x\" (გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბები) გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: jsonpath_scan.l:174 +msgid "invalid Unicode escape sequence" +msgstr "უნიკáƒáƒ“ის სპეცკáƒáƒ“ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მიმდევრáƒáƒ‘áƒ" + +#: jsonpath_scan.l:180 +msgid "invalid hexadecimal character sequence" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ თექვსმეტáƒáƒ‘ითი სიმბáƒáƒšáƒáƒ¡ მიმდევრáƒáƒ‘áƒ" + +#: jsonpath_scan.l:195 +msgid "unexpected end after backslash" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜ '\\' სიმბáƒáƒšáƒáƒ¡ შემდეგ" + +#: jsonpath_scan.l:201 repl_scanner.l:211 scan.l:742 +msgid "unterminated quoted string" +msgstr "ბრჭყáƒáƒšáƒ”ბში ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ ციტáƒáƒ¢áƒ˜áƒ¡ დáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელი სტრიქáƒáƒœáƒ˜" + +#: jsonpath_scan.l:228 +msgid "unexpected end of comment" +msgstr "კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" + +#: jsonpath_scan.l:319 +msgid "invalid numeric literal" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რიცხვითი მუდმივáƒ" + +#: jsonpath_scan.l:325 jsonpath_scan.l:331 jsonpath_scan.l:337 scan.l:1050 scan.l:1054 scan.l:1058 scan.l:1062 scan.l:1066 scan.l:1070 scan.l:1074 +msgid "trailing junk after numeric literal" +msgstr "რიცხვითი მნიშვნელáƒáƒ‘ის შემდეგ მáƒáƒœáƒáƒªáƒ”მები ნáƒáƒ’áƒáƒ•იáƒ" + +#. translator: %s is typically "syntax error" +#: jsonpath_scan.l:375 +#, c-format +msgid "%s at end of jsonpath input" +msgstr "%s jsonpath-ის შეყვáƒáƒœáƒ˜áƒ¡ ბáƒáƒšáƒáƒ¨áƒ˜" + +#. translator: first %s is typically "syntax error" +#: jsonpath_scan.l:382 +#, c-format +msgid "%s at or near \"%s\" of jsonpath input" +msgstr "" + +#: jsonpath_scan.l:568 +msgid "invalid input" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შეყვáƒáƒœáƒ" + +#: jsonpath_scan.l:594 +msgid "invalid hexadecimal digit" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ თექვსმეტáƒáƒ‘ითი ციფრი" + +#: jsonpath_scan.l:607 utils/adt/jsonfuncs.c:646 +#, c-format +msgid "unsupported Unicode escape sequence" +msgstr "უნიკáƒáƒ“ის სპეცკáƒáƒ“ის მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი მიმდევრáƒáƒ‘áƒ" + +#: jsonpath_scan.l:625 +#, c-format +msgid "could not convert Unicode to server encoding" +msgstr "უნიკáƒáƒ“ის სერვერის კáƒáƒ“ირებáƒáƒ¨áƒ˜ გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ" + +#: lib/dshash.c:254 utils/mmgr/dsa.c:708 utils/mmgr/dsa.c:730 utils/mmgr/dsa.c:811 +#, c-format +msgid "Failed on DSA request of size %zu." +msgstr "შეცდáƒáƒ›áƒ DSA მეხსიერების გáƒáƒ›áƒáƒ—ხáƒáƒ•ისáƒáƒ¡ (ზáƒáƒ›áƒ %zu ბáƒáƒ˜áƒ¢áƒ˜)." + +#: libpq/auth-sasl.c:97 +#, c-format +msgid "expected SASL response, got message type %d" +msgstr "მáƒáƒ•ელáƒáƒ“ი SASL პáƒáƒ¡áƒ£áƒ®áƒ¡. მიღებული შეტყáƒáƒ‘ინების ტიპირ%d" + +#: libpq/auth-scram.c:263 +#, c-format +msgid "client selected an invalid SASL authentication mechanism" +msgstr "კლიენტის áƒáƒ áƒ©áƒ”ული SASL áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მექáƒáƒœáƒ˜áƒ–მი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: libpq/auth-scram.c:287 libpq/auth-scram.c:536 libpq/auth-scram.c:547 +#, c-format +msgid "invalid SCRAM secret for user \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ SCRAM სáƒáƒ˜áƒ“უმლრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\"" + +#: libpq/auth-scram.c:298 +#, c-format +msgid "User \"%s\" does not have a valid SCRAM secret." +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს \"%s\" სწáƒáƒ áƒ˜ SCRAM სáƒáƒ˜áƒ“უმლრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." + +#: libpq/auth-scram.c:378 libpq/auth-scram.c:383 libpq/auth-scram.c:737 libpq/auth-scram.c:745 libpq/auth-scram.c:850 libpq/auth-scram.c:863 libpq/auth-scram.c:873 libpq/auth-scram.c:981 libpq/auth-scram.c:988 libpq/auth-scram.c:1003 libpq/auth-scram.c:1018 libpq/auth-scram.c:1032 libpq/auth-scram.c:1050 libpq/auth-scram.c:1065 libpq/auth-scram.c:1379 libpq/auth-scram.c:1387 +#, c-format +msgid "malformed SCRAM message" +msgstr "დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული SCRAM-ის შეტყáƒáƒ‘ინებáƒ" + +#: libpq/auth-scram.c:379 +#, c-format +msgid "The message is empty." +msgstr "შეტყáƒáƒ‘ინებრცáƒáƒ áƒ˜áƒ”ლიáƒ." + +#: libpq/auth-scram.c:384 +#, c-format +msgid "Message length does not match input length." +msgstr "შეტყáƒáƒ‘ინების სიგრძე შეყვáƒáƒœáƒ˜áƒ¡ სიგრძეს áƒáƒ áƒ”მთხვევáƒ." + +#: libpq/auth-scram.c:416 +#, c-format +msgid "invalid SCRAM response" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ SCRAM პáƒáƒ¡áƒ£áƒ®áƒ˜" + +#: libpq/auth-scram.c:417 +#, c-format +msgid "Nonce does not match." +msgstr "ერთჯერáƒáƒ“ი რიცხვები áƒáƒ  ემთხვევáƒ." + +#: libpq/auth-scram.c:493 +#, c-format +msgid "could not generate random salt" +msgstr "შემთხვევითი მáƒáƒ áƒ˜áƒšáƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: libpq/auth-scram.c:738 +#, c-format +msgid "Expected attribute \"%c\" but found \"%s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი áƒáƒ¢áƒ áƒ˜áƒ‘უტს \"%c\" მáƒáƒ’რáƒáƒ› მივიღე \"%s\"." + +#: libpq/auth-scram.c:746 libpq/auth-scram.c:874 +#, c-format +msgid "Expected character \"=\" for attribute \"%c\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი სიმბáƒáƒšáƒáƒ¡ \"=\" áƒáƒ¢áƒ áƒ˜áƒ‘უტისთვის \"%c\"." + +#: libpq/auth-scram.c:851 +#, c-format +msgid "Attribute expected, but found end of string." +msgstr "მáƒáƒ•ელáƒáƒ“ი áƒáƒ¢áƒ áƒ˜áƒ‘უტს, მáƒáƒ’რáƒáƒ› სტრიქáƒáƒœáƒ˜áƒ¡ ბáƒáƒšáƒ მივიღე." + +#: libpq/auth-scram.c:864 +#, c-format +msgid "Attribute expected, but found invalid character \"%s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი áƒáƒ¢áƒ áƒ˜áƒ‘უტს, მáƒáƒ’რáƒáƒ› მივიღე áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიმბáƒáƒšáƒ \"%s\"." + +#: libpq/auth-scram.c:982 libpq/auth-scram.c:1004 +#, c-format +msgid "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not include channel binding data." +msgstr "კლიენტმრáƒáƒ˜áƒ áƒ©áƒ˜áƒ SCRAM-SHA-256-PLUS, მáƒáƒ’რáƒáƒ› SCRAM შეტყáƒáƒ‘ინებრáƒáƒ áƒ®áƒ–ე მიბმის მáƒáƒœáƒáƒªáƒ”მებს áƒáƒ  შეიცáƒáƒ•ს." + +#: libpq/auth-scram.c:989 libpq/auth-scram.c:1019 +#, c-format +msgid "Comma expected, but found character \"%s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი მძიმეს, მáƒáƒ’რáƒáƒ› áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირსიმბáƒáƒšáƒ \"%s\"." + +#: libpq/auth-scram.c:1010 +#, c-format +msgid "SCRAM channel binding negotiation error" +msgstr "SCRAM áƒáƒ áƒ®áƒ–ე მიბმის მáƒáƒšáƒáƒžáƒáƒ áƒáƒ™áƒ”ბის შეცდáƒáƒ›áƒ" + +#: libpq/auth-scram.c:1011 +#, c-format +msgid "The client supports SCRAM channel binding but thinks the server does not. However, this server does support channel binding." +msgstr "კლიენტს áƒáƒ¥áƒ•ს SCRAM áƒáƒ áƒ®áƒ–ე მიბმის მხáƒáƒ áƒ“áƒáƒ­áƒ”რáƒ, მáƒáƒ’რáƒáƒ› ფიქრáƒáƒ‘ს, რáƒáƒ› სერვერს - áƒáƒ áƒ. მáƒáƒ’რáƒáƒ› სერვერს áƒáƒ¥áƒ•ს áƒáƒ áƒ®áƒ–ე მიბმის მხáƒáƒ áƒ“áƒáƒ­áƒ”რáƒ." + +#: libpq/auth-scram.c:1033 +#, c-format +msgid "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM message includes channel binding data." +msgstr "კლიენტმრSCRAM-SHA-256 áƒáƒ áƒ®áƒ–ე მიბმის გáƒáƒ áƒ”შე áƒáƒ˜áƒ áƒ©áƒ˜áƒ, მáƒáƒ’რáƒáƒ› SCRAM შეტყáƒáƒ‘ინებრáƒáƒ áƒ®áƒ–ე მიბმის მáƒáƒœáƒáƒªáƒ”მებს შეიცáƒáƒ•ს." + +#: libpq/auth-scram.c:1044 +#, c-format +msgid "unsupported SCRAM channel-binding type \"%s\"" +msgstr "მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი SCRAM-ის áƒáƒ áƒ®áƒ–ე მიბმის ტიპი \"%s\"" + +#: libpq/auth-scram.c:1051 +#, c-format +msgid "Unexpected channel-binding flag \"%s\"." +msgstr "áƒáƒ áƒ®áƒ–ე მიბმის მáƒáƒ£áƒšáƒáƒ“ნელი áƒáƒšáƒáƒ›áƒ˜: \"%s\"." + +#: libpq/auth-scram.c:1061 +#, c-format +msgid "client uses authorization identity, but it is not supported" +msgstr "კლიენტი იყენებს áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ იდენტიფიკáƒáƒªáƒ˜áƒáƒ¡, მáƒáƒ’რáƒáƒ› ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: libpq/auth-scram.c:1066 +#, c-format +msgid "Unexpected attribute \"%s\" in client-first-message." +msgstr "" + +#: libpq/auth-scram.c:1082 +#, c-format +msgid "client requires an unsupported SCRAM extension" +msgstr "კლიენტი მáƒáƒ˜áƒ—ხáƒáƒ•ს SCRAM გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ¡, რáƒáƒ›áƒ”ლიც მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: libpq/auth-scram.c:1096 +#, c-format +msgid "non-printable characters in SCRAM nonce" +msgstr "" + +#: libpq/auth-scram.c:1227 +#, c-format +msgid "could not generate random nonce" +msgstr "ერთჯერáƒáƒ“ი კáƒáƒ“ის გენერáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: libpq/auth-scram.c:1237 +#, c-format +msgid "could not encode random nonce" +msgstr "ერთჯერáƒáƒ“ი კáƒáƒ“ის კáƒáƒ“ირების შეცდáƒáƒ›áƒ" + +#: libpq/auth-scram.c:1343 +#, c-format +msgid "SCRAM channel binding check failed" +msgstr "SCRAM áƒáƒ áƒ®áƒ–ე მიბმის შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ" + +#: libpq/auth-scram.c:1361 +#, c-format +msgid "unexpected SCRAM channel-binding attribute in client-final-message" +msgstr "" + +#: libpq/auth-scram.c:1380 +#, c-format +msgid "Malformed proof in client-final-message." +msgstr "" + +#: libpq/auth-scram.c:1388 +#, c-format +msgid "Garbage found at the end of client-final-message." +msgstr "კლიენტის-სáƒáƒ‘áƒáƒšáƒáƒ-შეტყáƒáƒ‘ინების ბáƒáƒšáƒáƒ¨áƒ˜ áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირნáƒáƒ’áƒáƒ•ი." + +#: libpq/auth.c:269 +#, c-format +msgid "authentication failed for user \"%s\": host rejected" +msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\": ჰáƒáƒ¡áƒ¢áƒ›áƒ ის უáƒáƒ áƒ§áƒ" + +#: libpq/auth.c:272 +#, c-format +msgid "\"trust\" authentication failed for user \"%s\"" +msgstr "\"ნდáƒáƒ‘ით\" áƒáƒ•თენტიფიკáƒáƒªáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\" ვერ მáƒáƒ®áƒ”რხდáƒ" + +#: libpq/auth.c:275 +#, c-format +msgid "Ident authentication failed for user \"%s\"" +msgstr "იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ— áƒáƒ•თენტიფიკáƒáƒªáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\" ვერ მáƒáƒ®áƒ”რხდáƒ" + +#: libpq/auth.c:278 +#, c-format +msgid "Peer authentication failed for user \"%s\"" +msgstr "პáƒáƒ áƒ¢áƒœáƒ˜áƒáƒ áƒ˜áƒ¡ áƒáƒ•თენტიფიკáƒáƒªáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\" ვერ მáƒáƒ®áƒ”რხდáƒ" + +#: libpq/auth.c:283 +#, c-format +msgid "password authentication failed for user \"%s\"" +msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ— áƒáƒ•თენტიფიკáƒáƒªáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\" ვერ მáƒáƒ®áƒ”რხდáƒ" + +#: libpq/auth.c:288 +#, c-format +msgid "GSSAPI authentication failed for user \"%s\"" +msgstr "GSSAPI áƒáƒ•თენტიფიკáƒáƒªáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\" ვერ მáƒáƒ®áƒ”რხდáƒ" + +#: libpq/auth.c:291 +#, c-format +msgid "SSPI authentication failed for user \"%s\"" +msgstr "SSPI áƒáƒ•თენტიფიკáƒáƒªáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\" ვერ მáƒáƒ®áƒ”რხდáƒ" + +#: libpq/auth.c:294 +#, c-format +msgid "PAM authentication failed for user \"%s\"" +msgstr "PAM áƒáƒ•თენტიფიკáƒáƒªáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\" ვერ მáƒáƒ®áƒ”რხდáƒ" + +#: libpq/auth.c:297 +#, c-format +msgid "BSD authentication failed for user \"%s\"" +msgstr "BSD áƒáƒ•თენტიფიკáƒáƒªáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\" ვერ მáƒáƒ®áƒ”რხდáƒ" + +#: libpq/auth.c:300 +#, c-format +msgid "LDAP authentication failed for user \"%s\"" +msgstr "LDAP áƒáƒ•თენტიფიკáƒáƒªáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\" ვერ მáƒáƒ®áƒ”რხდáƒ" + +#: libpq/auth.c:303 +#, c-format +msgid "certificate authentication failed for user \"%s\"" +msgstr "სერტიფიკáƒáƒ¢áƒ˜áƒ— áƒáƒ•თენტიფიკáƒáƒªáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\" ვერ მáƒáƒ®áƒ”რხდáƒ" + +#: libpq/auth.c:306 +#, c-format +msgid "RADIUS authentication failed for user \"%s\"" +msgstr "რáƒáƒ“იუსით áƒáƒ•თენტიფიკáƒáƒªáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\" ვერ მáƒáƒ®áƒ”რხდáƒ" + +#: libpq/auth.c:309 +#, c-format +msgid "authentication failed for user \"%s\": invalid authentication method" +msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\": áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი" + +#: libpq/auth.c:313 +#, c-format +msgid "Connection matched file \"%s\" line %d: \"%s\"" +msgstr "მიერთებრდáƒáƒ”მთხვრფáƒáƒ˜áƒš %s-ს ხáƒáƒ–ზე %d: \"%s\"" + +#: libpq/auth.c:357 +#, c-format +msgid "authentication identifier set more than once" +msgstr "áƒáƒ•თენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ ერთზე მეტჯერáƒáƒ დáƒáƒ§áƒ”ნებული" + +#: libpq/auth.c:358 +#, c-format +msgid "previous identifier: \"%s\"; new identifier: \"%s\"" +msgstr "წინრიდენტიფიკáƒáƒ¢áƒáƒ áƒ˜: \"%s\"; áƒáƒ®áƒáƒšáƒ˜ იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜: \"%s\"" + +#: libpq/auth.c:368 +#, c-format +msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" +msgstr "მიერთებრáƒáƒ•თენტიფიცირებულიáƒ: იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜=\"%s\" მეთáƒáƒ“ი=%s (%s:%d)" + +#: libpq/auth.c:408 +#, c-format +msgid "client certificates can only be checked if a root certificate store is available" +msgstr "კლიენტის სერტიფიკáƒáƒ¢áƒ”ბის შემáƒáƒ¬áƒ›áƒ”ბრმხáƒáƒšáƒáƒ“ მáƒáƒ¨áƒ˜áƒœáƒáƒ შესáƒáƒ«áƒšáƒ”ბელი, რáƒáƒªáƒ ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜áƒ ძირითáƒáƒ“ი სერტიფიკáƒáƒ¢áƒ”ბის სáƒáƒªáƒáƒ•ი" + +#: libpq/auth.c:419 +#, c-format +msgid "connection requires a valid client certificate" +msgstr "მიერთების მცდელáƒáƒ‘áƒáƒ¡ კლიენტის სწáƒáƒ áƒ˜ სერტიფიკáƒáƒ¢áƒ˜ ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ" + +#: libpq/auth.c:450 libpq/auth.c:496 +msgid "GSS encryption" +msgstr "GSS დáƒáƒ¨áƒ˜áƒ¤áƒ•რáƒ" + +#: libpq/auth.c:453 libpq/auth.c:499 +msgid "SSL encryption" +msgstr "SSL დáƒáƒ¨áƒ˜áƒ¤áƒ•რáƒ" + +#: libpq/auth.c:455 libpq/auth.c:501 +msgid "no encryption" +msgstr "დáƒáƒ¨áƒ˜áƒ¤áƒ•რის გáƒáƒ áƒ”შე" + +#. translator: last %s describes encryption state +#: libpq/auth.c:461 +#, c-format +msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" +msgstr "pg_hba.conf უáƒáƒ áƒ§áƒáƒ¤áƒ¡ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ მიერთებáƒáƒ¡ ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡áƒ—ვის \"%s\", მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\", %s" + +#. translator: last %s describes encryption state +#: libpq/auth.c:468 +#, c-format +msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" +msgstr "pg_hba.conf უáƒáƒ áƒ§áƒáƒ¤áƒ¡ მიერთებáƒáƒ¡ ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡áƒ—ვის \"%s\", მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\", ბáƒáƒ–რ\"%s\", %s" + +#: libpq/auth.c:506 +#, c-format +msgid "Client IP address resolved to \"%s\", forward lookup matches." +msgstr "კლიენტის IP მისáƒáƒ›áƒáƒ áƒ—ი იხსნებრ\"%s\" პირდáƒáƒžáƒ˜áƒ áƒ˜ DNS ემთხვევáƒ." + +#: libpq/auth.c:509 +#, c-format +msgid "Client IP address resolved to \"%s\", forward lookup not checked." +msgstr "კლიენტის IP მისáƒáƒ›áƒáƒ áƒ—ი იხსნებრ\"%s\" პირდáƒáƒžáƒ˜áƒ áƒ˜ DNS áƒáƒ  შემáƒáƒ¬áƒ›áƒ”ბულáƒ." + +#: libpq/auth.c:512 +#, c-format +msgid "Client IP address resolved to \"%s\", forward lookup does not match." +msgstr "კლიენტის IP მისáƒáƒ›áƒáƒ áƒ—ი იხსნებრ\"%s\" პირდáƒáƒžáƒ˜áƒ áƒ˜ DNS áƒáƒ  ემთხვევáƒ." + +#: libpq/auth.c:515 +#, c-format +msgid "Could not translate client host name \"%s\" to IP address: %s." +msgstr "კლიენტის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლის (\"%s\") IP მისáƒáƒ›áƒáƒ áƒ—ში თáƒáƒ áƒ’მნის შეცდáƒáƒ›áƒ: %s." + +#: libpq/auth.c:520 +#, c-format +msgid "Could not resolve client IP address to a host name: %s." +msgstr "კლიენტის IP მისáƒáƒ›áƒáƒ áƒ—იდáƒáƒœ ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლის áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s." + +#. translator: last %s describes encryption state +#: libpq/auth.c:528 +#, c-format +msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" +msgstr "pg_hba.conf-ში ჩáƒáƒœáƒáƒ¬áƒ”რი რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ შეერთების შესáƒáƒ®áƒ”ბ ჰáƒáƒ¡áƒ¢áƒ˜áƒ“áƒáƒœ \"%s\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\", %s áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ" + +#. translator: last %s describes encryption state +#: libpq/auth.c:536 +#, c-format +msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" +msgstr "pg_hba.conf-ში ჩáƒáƒœáƒáƒ¬áƒ”რი ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡áƒ—ვის \"%s\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\", ბáƒáƒ–რ\"%s\", %s áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ" + +#: libpq/auth.c:656 +#, c-format +msgid "connection authenticated: user=\"%s\" method=%s (%s:%d)" +msgstr "მიერთებრáƒáƒ•თენტიფიცირებულიáƒ: მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი =\"%s\" მეთáƒáƒ“ი=%s (%s:%d)" + +#: libpq/auth.c:725 +#, c-format +msgid "expected password response, got message type %d" +msgstr "მáƒáƒ•ელáƒáƒ“ი პáƒáƒ áƒáƒšáƒ˜áƒ¡ პáƒáƒ¡áƒ£áƒ®áƒ¡, მივიღე შეტყáƒáƒ‘ინების ტიპი %d" + +#: libpq/auth.c:746 +#, c-format +msgid "invalid password packet size" +msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ პáƒáƒ™áƒ”ტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ" + +#: libpq/auth.c:764 +#, c-format +msgid "empty password returned by client" +msgstr "კლიენტმრცáƒáƒ áƒ˜áƒ”ლი პáƒáƒ áƒáƒšáƒ˜ დáƒáƒáƒ‘რუნáƒ" + +#: libpq/auth.c:892 +#, c-format +msgid "could not generate random MD5 salt" +msgstr "შემთხვევითი MD5 მáƒáƒ áƒ˜áƒšáƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: libpq/auth.c:943 libpq/be-secure-gssapi.c:540 +#, c-format +msgid "could not set environment: %m" +msgstr "გáƒáƒ áƒ”მáƒáƒ¡ მáƒáƒ áƒ’ების შეცდáƒáƒ›áƒ: %m" + +#: libpq/auth.c:982 +#, c-format +msgid "expected GSS response, got message type %d" +msgstr "მáƒáƒ•ელáƒáƒ“ი GSS პáƒáƒ¡áƒ£áƒ®áƒ¡, მივიღე შეტყáƒáƒ‘ინების ტიპი %d" + +#: libpq/auth.c:1048 +msgid "accepting GSS security context failed" +msgstr "'GSS'-ის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის კáƒáƒœáƒ¢áƒ”ქსტის მიღების შეცდáƒáƒ›áƒ" + +#: libpq/auth.c:1089 +msgid "retrieving GSS user name failed" +msgstr "'GSS'-ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის მიღების შეცდáƒáƒ›áƒ" + +#: libpq/auth.c:1235 +msgid "could not acquire SSPI credentials" +msgstr "შეცდáƒáƒ›áƒ SSPI-ის მáƒáƒ›áƒ®áƒ›./პáƒáƒ áƒáƒšáƒ˜áƒ¡ მიღებისáƒáƒ¡" + +#: libpq/auth.c:1260 +#, c-format +msgid "expected SSPI response, got message type %d" +msgstr "მáƒáƒ•ელáƒáƒ“ი SSPI პáƒáƒ¡áƒ£áƒ®áƒ¡, მივიღე შეტყáƒáƒ‘ინების ტიპი %d" + +#: libpq/auth.c:1338 +msgid "could not accept SSPI security context" +msgstr "'SSPI'-ის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის კáƒáƒœáƒ¢áƒ”ქსტის მიღების შეცდáƒáƒ›áƒ" + +#: libpq/auth.c:1379 +msgid "could not get token from SSPI security context" +msgstr "'SSPI'-ის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის კáƒáƒœáƒ¢áƒ”ქსტიდáƒáƒœ კáƒáƒ“ის მიღების შეცდáƒáƒ›áƒ" + +#: libpq/auth.c:1515 libpq/auth.c:1534 +#, c-format +msgid "could not translate name" +msgstr "სáƒáƒ®áƒ”ლის თáƒáƒ áƒ’მნრშეუძლებელიáƒ" + +#: libpq/auth.c:1547 +#, c-format +msgid "realm name too long" +msgstr "რეáƒáƒšáƒ›áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#: libpq/auth.c:1562 +#, c-format +msgid "translated account name too long" +msgstr "áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ ნáƒáƒ—áƒáƒ áƒ’მნი სáƒáƒ®áƒ”ლი ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#: libpq/auth.c:1741 +#, c-format +msgid "could not create socket for Ident connection: %m" +msgstr "ident მიერთებისთვის სáƒáƒ™áƒ”ტის შექმნრშეუძლებელიáƒ: %m" + +#: libpq/auth.c:1756 +#, c-format +msgid "could not bind to local address \"%s\": %m" +msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ  მისáƒáƒ›áƒáƒ áƒ—ზე \"%s\" მიბმის შეცდáƒáƒ›áƒ: %m" + +#: libpq/auth.c:1768 +#, c-format +msgid "could not connect to Ident server at address \"%s\", port %s: %m" +msgstr "შეცდáƒáƒ›áƒ LDAP სერვერთáƒáƒœ მიერთებისáƒáƒ¡. მისáƒáƒ›áƒáƒ áƒ—ი - \"%s\",პáƒáƒ áƒ¢áƒ˜ - %s: %m" + +#: libpq/auth.c:1790 +#, c-format +msgid "could not send query to Ident server at address \"%s\", port %s: %m" +msgstr "შეცდáƒáƒ›áƒ LDAP სერვერზე მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ’ზáƒáƒ•ნისáƒáƒ¡. მისáƒáƒ›áƒáƒ áƒ—ი - \"%s\", პáƒáƒ áƒ¢áƒ˜ - %s: %m" + +#: libpq/auth.c:1807 +#, c-format +msgid "could not receive response from Ident server at address \"%s\", port %s: %m" +msgstr "პáƒáƒ¡áƒ£áƒ®áƒ˜ Ident-ის სერვერიდáƒáƒœ მისáƒáƒ›áƒáƒ áƒ—ით \"%s\" პáƒáƒ áƒ¢áƒ–ე %s ვერ მივიღე: %m" + +#: libpq/auth.c:1817 +#, c-format +msgid "invalidly formatted response from Ident server: \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ დáƒáƒ¤áƒáƒ áƒ›áƒáƒ¢áƒ”ბული პáƒáƒ¡áƒ£áƒ®áƒ˜ Ident სერვერიდáƒáƒœ: \"%s\"" + +#: libpq/auth.c:1870 +#, c-format +msgid "peer authentication is not supported on this platform" +msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე პáƒáƒ áƒ¢áƒœáƒ˜áƒáƒ áƒ˜áƒ¡ áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: libpq/auth.c:1874 +#, c-format +msgid "could not get peer credentials: %m" +msgstr "პáƒáƒ áƒ¢áƒœáƒ˜áƒáƒ áƒ˜áƒ¡ áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ დეტáƒáƒšáƒ”ბის მიღების შეცდáƒáƒ›áƒ: %m" + +#: libpq/auth.c:1886 +#, c-format +msgid "could not look up local user ID %ld: %s" +msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ID-ით %ld მáƒáƒ«áƒ”ბნრშეუძლებელიáƒ: %s" + +#: libpq/auth.c:1988 +#, c-format +msgid "error from underlying PAM layer: %s" +msgstr "შეცდáƒáƒ›áƒ ქვედრPAM ფენიდáƒáƒœ: %s" + +#: libpq/auth.c:1999 +#, c-format +msgid "unsupported PAM conversation %d/\"%s\"" +msgstr "მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი PAM სáƒáƒ£áƒ‘áƒáƒ áƒ˜ %d/\"%s\"" + +#: libpq/auth.c:2056 +#, c-format +msgid "could not create PAM authenticator: %s" +msgstr "შეცდáƒáƒ›áƒ PAM áƒáƒ•თენტიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ შექმნისáƒáƒ¡: %s" + +#: libpq/auth.c:2067 +#, c-format +msgid "pam_set_item(PAM_USER) failed: %s" +msgstr "pam_set_item(PAM_USER) -ის შეცდáƒáƒ›áƒ: %s" + +#: libpq/auth.c:2099 +#, c-format +msgid "pam_set_item(PAM_RHOST) failed: %s" +msgstr "pam_set_item(PAM_RHOST) -ის შეცდáƒáƒ›áƒ: %s" + +#: libpq/auth.c:2111 +#, c-format +msgid "pam_set_item(PAM_CONV) failed: %s" +msgstr "pam_set_item(PAM_CONV) -ის შეცდáƒáƒ›áƒ: %s" + +#: libpq/auth.c:2124 +#, c-format +msgid "pam_authenticate failed: %s" +msgstr "pam_authenticate -ის შეცდáƒáƒ›áƒ: %s" + +#: libpq/auth.c:2137 +#, c-format +msgid "pam_acct_mgmt failed: %s" +msgstr "pam_acct_mgmt-ის შეცდáƒáƒ›áƒ: %s" + +#: libpq/auth.c:2148 +#, c-format +msgid "could not release PAM authenticator: %s" +msgstr "შეცდáƒáƒ›áƒ PAM áƒáƒ•თენტიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡áƒáƒ¡: %s" + +#: libpq/auth.c:2228 +#, c-format +msgid "could not initialize LDAP: error code %d" +msgstr "შეცდáƒáƒ›áƒ LDAP-ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %d" + +#: libpq/auth.c:2265 +#, c-format +msgid "could not extract domain name from ldapbasedn" +msgstr "ldapbasedn-დáƒáƒœ დáƒáƒ›áƒ”ნის სáƒáƒ®áƒ”ლის გáƒáƒ›áƒáƒ¦áƒ”ბრშეუძლებელიáƒ" + +#: libpq/auth.c:2273 +#, c-format +msgid "LDAP authentication could not find DNS SRV records for \"%s\"" +msgstr "LDAP áƒáƒ•თენტიკáƒáƒªáƒ˜áƒáƒ› \"%s\"-სთვის DNS SRV ჩáƒáƒœáƒáƒ¬áƒ”რები ვერ იპáƒáƒ•áƒ" + +#: libpq/auth.c:2275 +#, c-format +msgid "Set an LDAP server name explicitly." +msgstr "LDAP სერვერის სáƒáƒ®áƒ”ლი áƒáƒ¨áƒ™áƒáƒ áƒáƒ“ უნდრდáƒáƒáƒ§áƒ”ნáƒáƒ—." + +#: libpq/auth.c:2327 +#, c-format +msgid "could not initialize LDAP: %s" +msgstr "\"LDAP\"-ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" + +#: libpq/auth.c:2337 +#, c-format +msgid "ldaps not supported with this LDAP library" +msgstr "áƒáƒ› LDAP ბიბლიáƒáƒ—ეკáƒáƒ¡ ldaps-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: libpq/auth.c:2345 +#, c-format +msgid "could not initialize LDAP: %m" +msgstr "\"LDAP\"-ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: libpq/auth.c:2355 +#, c-format +msgid "could not set LDAP protocol version: %s" +msgstr "\"LDAP\"-ის ვერსიის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" + +#: libpq/auth.c:2371 +#, c-format +msgid "could not start LDAP TLS session: %s" +msgstr "\"LDAP TLS\" სესიის დáƒáƒ¬áƒ§áƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: libpq/auth.c:2448 +#, c-format +msgid "LDAP server not specified, and no ldapbasedn" +msgstr "LDAP სერვერი დრldapbasedn მითითებული áƒáƒ áƒáƒ" + +#: libpq/auth.c:2455 +#, c-format +msgid "LDAP server not specified" +msgstr "LDAP სერვერი მითითებული áƒáƒ áƒáƒ" + +#: libpq/auth.c:2517 +#, c-format +msgid "invalid character in user name for LDAP authentication" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიმბáƒáƒšáƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლში LDAP-ით áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡" + +#: libpq/auth.c:2534 +#, c-format +msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" +msgstr "ldapbinddn \"%s\"-სთვის სერვერზე \"%s\" სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ LDAP მიბმრვერ გáƒáƒœáƒ•áƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლე: %s" + +#: libpq/auth.c:2564 +#, c-format +msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" +msgstr "ფილტრისთვის \"%s\" სერვერზე \"%s\" LDAP ძებნის გáƒáƒ¨áƒ•ებრშეუძლებელიáƒ: %s" + +#: libpq/auth.c:2580 +#, c-format +msgid "LDAP user \"%s\" does not exist" +msgstr "LDAP-ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: libpq/auth.c:2581 +#, c-format +msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." +msgstr "LDAP ძებნáƒáƒ› ფილტრისთვის \"%s\" სერვერზე \"%s\" ჩáƒáƒœáƒáƒ¬áƒ”რები áƒáƒ  დáƒáƒáƒ‘რუნáƒ." + +#: libpq/auth.c:2585 +#, c-format +msgid "LDAP user \"%s\" is not unique" +msgstr "LDAP-ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" უნიკáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ áƒáƒ" + +#: libpq/auth.c:2586 +#, c-format +msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." +msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." +msgstr[0] "LDAP ძებნáƒáƒ› ფილტრისთვის \"%s\" სერვერზე \"%s\" %d ჩáƒáƒœáƒáƒ¬áƒ”რი დáƒáƒáƒ‘რუნáƒ." +msgstr[1] "LDAP ძებნáƒáƒ› ფილტრისთვის \"%s\" სერვერზე \"%s\" %d ჩáƒáƒœáƒáƒ¬áƒ”რი დáƒáƒáƒ‘რუნáƒ." + +#: libpq/auth.c:2606 +#, c-format +msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" +msgstr "" + +#: libpq/auth.c:2633 +#, c-format +msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" +msgstr "LDAP-ით შესვლის შეცდáƒáƒ›áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\" სერვერზე \"%s\": %s" + +#: libpq/auth.c:2665 +#, c-format +msgid "LDAP diagnostics: %s" +msgstr "LDAP-ის დიáƒáƒ’ნáƒáƒ¡áƒ¢áƒ˜áƒ™áƒ: %s" + +#: libpq/auth.c:2703 +#, c-format +msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" +msgstr "სერტიფიკáƒáƒ¢áƒ˜áƒ— áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\": კლიენტის სერტიფიკáƒáƒ¢áƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლს áƒáƒ  შეიცáƒáƒ•ს" + +#: libpq/auth.c:2724 +#, c-format +msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" +msgstr "სერტიფიკáƒáƒ¢áƒ˜áƒ— áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ ჩáƒáƒ•áƒáƒ áƒ“რმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\": სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ¡ DN-ის მიღებრშეუძლებელáƒ" + +#: libpq/auth.c:2747 +#, c-format +msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" +msgstr "სერტიფიკáƒáƒ¢áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბის (clientcert=verify-full) შეცდáƒáƒ›áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\": DN áƒáƒ  ემთხვევáƒ" + +#: libpq/auth.c:2752 +#, c-format +msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" +msgstr "სერტიფიკáƒáƒ¢áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბის (clientcert=verify-full) შეცდáƒáƒ›áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\": CN áƒáƒ  ემთხვევáƒ" + +#: libpq/auth.c:2854 +#, c-format +msgid "RADIUS server not specified" +msgstr "RADIUS სერვერი მითითებული áƒáƒ áƒáƒ" + +#: libpq/auth.c:2861 +#, c-format +msgid "RADIUS secret not specified" +msgstr "RADIUS-ის პáƒáƒ áƒáƒšáƒ˜ მითითებული áƒáƒ áƒáƒ" + +#: libpq/auth.c:2875 +#, c-format +msgid "RADIUS authentication does not support passwords longer than %d characters" +msgstr "RADIUS-ით áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡ %d სიმბáƒáƒšáƒáƒ–ე გრძელი პáƒáƒ áƒáƒšáƒ”ბი მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: libpq/auth.c:2977 libpq/hba.c:2352 +#, c-format +msgid "could not translate RADIUS server name \"%s\" to address: %s" +msgstr "შეცდáƒáƒ›áƒ RADIUS სერვერის სáƒáƒ®áƒ”ლის \"%s\" მისáƒáƒ›áƒáƒ áƒ—ში თáƒáƒ áƒ’მნისáƒáƒ¡: %s" + +#: libpq/auth.c:2991 +#, c-format +msgid "could not generate random encryption vector" +msgstr "შემთხვევითი დáƒáƒ¨áƒ˜áƒ¤áƒ•რის ვექტáƒáƒ áƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: libpq/auth.c:3028 +#, c-format +msgid "could not perform MD5 encryption of password: %s" +msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ MD5-ით დáƒáƒ¨áƒ˜áƒ¤áƒ•რრშეუძლებელიáƒ: %s" + +#: libpq/auth.c:3055 +#, c-format +msgid "could not create RADIUS socket: %m" +msgstr "შეცდáƒáƒ›áƒ RADIUS სáƒáƒ™áƒ”ტის შექმნისáƒáƒ¡: %m" + +#: libpq/auth.c:3071 +#, c-format +msgid "could not bind local RADIUS socket: %m" +msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ  RADIUS სáƒáƒ™áƒ”ტზე მიბმის შეცდáƒáƒ›áƒ: %m" + +#: libpq/auth.c:3081 +#, c-format +msgid "could not send RADIUS packet: %m" +msgstr "შეცდáƒáƒ›áƒ RADIUS პáƒáƒ™áƒ”ტის გáƒáƒ’ზáƒáƒ•ნისáƒáƒ¡: %m" + +#: libpq/auth.c:3115 libpq/auth.c:3141 +#, c-format +msgid "timeout waiting for RADIUS response from %s" +msgstr "%s-დáƒáƒœ RADIUS პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ მáƒáƒšáƒáƒ“ინის ვáƒáƒ“რáƒáƒ›áƒáƒ˜áƒ¬áƒ£áƒ áƒ" + +#: libpq/auth.c:3134 +#, c-format +msgid "could not check status on RADIUS socket: %m" +msgstr "შეცდáƒáƒ›áƒ RADIUS სáƒáƒ™áƒ”ტის სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბისáƒáƒ¡: %m" + +#: libpq/auth.c:3164 +#, c-format +msgid "could not read RADIUS response: %m" +msgstr "შეცდáƒáƒ›áƒ RADIUS პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვისáƒáƒ¡: %m" + +#: libpq/auth.c:3172 +#, c-format +msgid "RADIUS response from %s was sent from incorrect port: %d" +msgstr "RADIUS პáƒáƒ¡áƒ£áƒ®áƒ˜ \"%s\" გáƒáƒ›áƒáƒ’ზáƒáƒ•ნილირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒ¢áƒ˜áƒ“áƒáƒœ: %d" + +#: libpq/auth.c:3180 +#, c-format +msgid "RADIUS response from %s too short: %d" +msgstr "RADIUS პáƒáƒ¡áƒ£áƒ®áƒ˜ %s-დáƒáƒœ მეტისმეტáƒáƒ“ მáƒáƒ™áƒšáƒ”áƒ: %d" + +#: libpq/auth.c:3187 +#, c-format +msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" +msgstr "RADIUS პáƒáƒ¡áƒ£áƒ®áƒ¡ %s-დáƒáƒœ დáƒáƒ–იáƒáƒœáƒ”ბული სიგრძე გáƒáƒáƒ©áƒœáƒ˜áƒ: %d (რეáƒáƒšáƒ£áƒ áƒ˜ სიგრძე %d)" + +#: libpq/auth.c:3195 +#, c-format +msgid "RADIUS response from %s is to a different request: %d (should be %d)" +msgstr "RADIUS პáƒáƒ¡áƒ£áƒ®áƒ˜ %s-დáƒáƒœ სხვრმáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ეკუთვნის: %d (უნდრიყáƒáƒ¡ %d)" + +#: libpq/auth.c:3220 +#, c-format +msgid "could not perform MD5 encryption of received packet: %s" +msgstr "მიღებული პáƒáƒ™áƒ”ტის MD5-ით დáƒáƒ¨áƒ˜áƒ¤áƒ•რრშეუძლებელიáƒ: %s" + +#: libpq/auth.c:3230 +#, c-format +msgid "RADIUS response from %s has incorrect MD5 signature" +msgstr "%s-დáƒáƒœ მიღებული RADIUS პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ MD5 ხელმáƒáƒ¬áƒ”რრáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: libpq/auth.c:3248 +#, c-format +msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" +msgstr "%s-დáƒáƒœ მიღებულ RADIUS-ს პáƒáƒ¡áƒ£áƒ®áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒ“ი (%d) გáƒáƒáƒ©áƒœáƒ˜áƒ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის \"%s\"" + +#: libpq/be-fsstubs.c:133 libpq/be-fsstubs.c:162 libpq/be-fsstubs.c:190 libpq/be-fsstubs.c:216 libpq/be-fsstubs.c:241 libpq/be-fsstubs.c:283 libpq/be-fsstubs.c:306 libpq/be-fsstubs.c:560 +#, c-format +msgid "invalid large-object descriptor: %d" +msgstr "დიდი áƒáƒ‘იექტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ დესკრიპტáƒáƒ áƒ˜: %d" + +#: libpq/be-fsstubs.c:173 +#, c-format +msgid "large object descriptor %d was not opened for reading" +msgstr "დიდი áƒáƒ‘იექტის დესკრიპტáƒáƒ áƒ˜ %d წáƒáƒ™áƒ˜áƒ—ხვისთვის áƒáƒ  გáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ" + +#: libpq/be-fsstubs.c:197 libpq/be-fsstubs.c:567 +#, c-format +msgid "large object descriptor %d was not opened for writing" +msgstr "დიდი áƒáƒ‘იექტის დესკრიპტáƒáƒ áƒ˜ %d ჩáƒáƒ¬áƒ”რისთვის áƒáƒ  გáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ" + +#: libpq/be-fsstubs.c:224 +#, c-format +msgid "lo_lseek result out of range for large-object descriptor %d" +msgstr "lo_lseek-ის შედეგი დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ დიდი-áƒáƒ‘იექტის დესკრიპტáƒáƒ áƒ˜áƒ¡áƒ—ვის %d" + +#: libpq/be-fsstubs.c:291 +#, c-format +msgid "lo_tell result out of range for large-object descriptor %d" +msgstr "lo_tell-ის შედეგი დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ დიდი-áƒáƒ‘იექტის დესკრიპტáƒáƒ áƒ˜áƒ¡áƒ—ვის %d" + +#: libpq/be-fsstubs.c:439 +#, c-format +msgid "could not open server file \"%s\": %m" +msgstr "სერვერის ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: libpq/be-fsstubs.c:462 +#, c-format +msgid "could not read server file \"%s\": %m" +msgstr "სერვერის ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: libpq/be-fsstubs.c:521 +#, c-format +msgid "could not create server file \"%s\": %m" +msgstr "სერვერის ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შექმნის შეცდáƒáƒ›áƒ: %m" + +#: libpq/be-fsstubs.c:533 +#, c-format +msgid "could not write server file \"%s\": %m" +msgstr "სერვერის ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: libpq/be-fsstubs.c:774 +#, c-format +msgid "large object read request is too large" +msgstr "დიდი áƒáƒ‘იექტის წáƒáƒ™áƒ˜áƒ—ხვის მáƒáƒ—ხáƒáƒ•ნრმეტისმეტáƒáƒ“ დიდიáƒ" + +#: libpq/be-fsstubs.c:816 utils/adt/genfile.c:248 utils/adt/genfile.c:269 +#, c-format +msgid "requested length cannot be negative" +msgstr "მáƒáƒ—ხáƒáƒ•ნილი სიგრძე áƒáƒ  შეიძლებáƒ, უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ—ი იყáƒáƒ¡" + +#: libpq/be-secure-common.c:94 +#, c-format +msgid "command \"%s\" failed" +msgstr "ბრძáƒáƒœáƒ”ბის (\"%s\") შეცდáƒáƒ›áƒ" + +#: libpq/be-secure-common.c:123 +#, c-format +msgid "could not access private key file \"%s\": %m" +msgstr "პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ—áƒáƒœ (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: libpq/be-secure-common.c:133 +#, c-format +msgid "private key file \"%s\" is not a regular file" +msgstr "პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ˜ \"%s\" ჩვეულებრივი ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒáƒ" + +#: libpq/be-secure-common.c:159 +#, c-format +msgid "private key file \"%s\" must be owned by the database user or root" +msgstr "პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" მფლáƒáƒ‘ელი ბáƒáƒ–ის მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒœ root უნდრიყáƒáƒ¡" + +#: libpq/be-secure-common.c:169 +#, c-format +msgid "private key file \"%s\" has group or world access" +msgstr "პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ–ე \"%s\" ჯგუფისთვის áƒáƒœ დáƒáƒœáƒáƒ áƒ©áƒ”ნი ყველáƒáƒ¡áƒ—ვის წვდáƒáƒ›áƒ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: libpq/be-secure-common.c:171 +#, c-format +msgid "File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root." +msgstr "ფáƒáƒ˜áƒšáƒ”ბს u=rw (0600) áƒáƒœ ნáƒáƒ™áƒšáƒ”ბი წვდáƒáƒ›áƒ”ბი უნდრჰქáƒáƒœáƒ“ეს, თუ მáƒáƒ—ი მფლáƒáƒ‘ელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელიáƒ, áƒáƒœ წვდáƒáƒ›áƒ”ბი u=rw,g=r (0640), თუ მფლáƒáƒ‘ელი root-იáƒ." + +#: libpq/be-secure-gssapi.c:201 +msgid "GSSAPI wrap error" +msgstr "GSSAPI -ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: libpq/be-secure-gssapi.c:208 +#, c-format +msgid "outgoing GSSAPI message would not use confidentiality" +msgstr "გáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ GSSAPI შეტყáƒáƒ‘ინებრკáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒáƒ‘áƒáƒ¡ ვერ იყენებს" + +#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 +#, c-format +msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" +msgstr "სერვერმრძáƒáƒšáƒ˜áƒáƒœ დიდი GSSAPI პáƒáƒ™áƒ”ტის გáƒáƒ›áƒáƒ’ზáƒáƒ•ნრსცáƒáƒ“რ(%zu > %zu)" + +#: libpq/be-secure-gssapi.c:351 +#, c-format +msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" +msgstr "კლიენტის მიერ გáƒáƒ›áƒáƒ’ზáƒáƒ•ნილი GSSAPI-ის პáƒáƒ™áƒ”ტი ძáƒáƒšáƒ˜áƒáƒœ დიდირ(%zu > %zu)" + +#: libpq/be-secure-gssapi.c:389 +msgid "GSSAPI unwrap error" +msgstr "GSSAPI-ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: libpq/be-secure-gssapi.c:396 +#, c-format +msgid "incoming GSSAPI message did not use confidentiality" +msgstr "შემáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ GSSAPI შეტყáƒáƒ‘ინებრკáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒáƒ‘áƒáƒ¡ ვერ იყენებს" + +#: libpq/be-secure-gssapi.c:575 +#, c-format +msgid "oversize GSSAPI packet sent by the client (%zu > %d)" +msgstr "კლიენტის მიერ გáƒáƒ›áƒáƒ’ზáƒáƒ•ნილი GSSAPI-ის პáƒáƒ™áƒ”ტი ძáƒáƒšáƒ˜áƒáƒœ დიდირ(%zu > %d)" + +#: libpq/be-secure-gssapi.c:600 +msgid "could not accept GSSAPI security context" +msgstr "\"GSSAPI\"-ის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის კáƒáƒœáƒ¢áƒ”ქსტის მიღების შეცდáƒáƒ›áƒ" + +#: libpq/be-secure-gssapi.c:701 +msgid "GSSAPI size check error" +msgstr "GSSAPI-ის ზáƒáƒ›áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ" + +#: libpq/be-secure-openssl.c:131 +#, c-format +msgid "could not create SSL context: %s" +msgstr "შეცდáƒáƒ›áƒ SSL კáƒáƒœáƒ¢áƒ”ქსტის შექმნისáƒáƒ¡: %s" + +#: libpq/be-secure-openssl.c:157 +#, c-format +msgid "could not load server certificate file \"%s\": %s" +msgstr "სერვერის სერტიფიკáƒáƒ¢áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ \"%s\": %s" + +#: libpq/be-secure-openssl.c:177 +#, c-format +msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" +msgstr "პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" თáƒáƒ•იდáƒáƒœ ჩáƒáƒ¢áƒ•ირთვრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ მáƒáƒ¡ სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ ფრáƒáƒ–რესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ" + +#: libpq/be-secure-openssl.c:182 +#, c-format +msgid "could not load private key file \"%s\": %s" +msgstr "პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ: %s" + +#: libpq/be-secure-openssl.c:191 +#, c-format +msgid "check of private key failed: %s" +msgstr "პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#. translator: first %s is a GUC option name, second %s is its value +#: libpq/be-secure-openssl.c:204 libpq/be-secure-openssl.c:227 +#, c-format +msgid "\"%s\" setting \"%s\" not supported by this build" +msgstr "\"%s\"-ის პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ áƒáƒ’ებისáƒáƒ¡ ჩáƒáƒ áƒ—ული áƒáƒ  იყáƒ" + +#: libpq/be-secure-openssl.c:214 +#, c-format +msgid "could not set minimum SSL protocol version" +msgstr "'SSL' პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ ვერსიის მინიმáƒáƒšáƒ£áƒ áƒ˜ მნიშვნელáƒáƒ‘ის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ" + +#: libpq/be-secure-openssl.c:237 +#, c-format +msgid "could not set maximum SSL protocol version" +msgstr "'SSL' პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ ვერსიის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ მნიშვნელáƒáƒ‘ის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ" + +#: libpq/be-secure-openssl.c:253 +#, c-format +msgid "could not set SSL protocol version range" +msgstr "'SSL' პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ ვერსიის დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ" + +#: libpq/be-secure-openssl.c:254 +#, c-format +msgid "\"%s\" cannot be higher than \"%s\"" +msgstr "\"%s\"-ი \"%s\"-ზე მáƒáƒ¦áƒáƒšáƒ˜ ვერ იქნებáƒ" + +#: libpq/be-secure-openssl.c:296 +#, c-format +msgid "could not set the cipher list (no valid ciphers available)" +msgstr "შიფრების სიის დáƒáƒ§áƒ”ნებრშეუძლებელირ(სწáƒáƒ áƒ˜ შიფრები ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ áƒáƒ áƒáƒ)" + +#: libpq/be-secure-openssl.c:316 +#, c-format +msgid "could not load root certificate file \"%s\": %s" +msgstr "root სერტიფიკáƒáƒ¢áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s" + +#: libpq/be-secure-openssl.c:365 +#, c-format +msgid "could not load SSL certificate revocation list file \"%s\": %s" +msgstr "" + +#: libpq/be-secure-openssl.c:373 +#, c-format +msgid "could not load SSL certificate revocation list directory \"%s\": %s" +msgstr "" + +#: libpq/be-secure-openssl.c:381 +#, c-format +msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" +msgstr "" + +#: libpq/be-secure-openssl.c:439 +#, c-format +msgid "could not initialize SSL connection: SSL context not set up" +msgstr "" + +#: libpq/be-secure-openssl.c:453 +#, c-format +msgid "could not initialize SSL connection: %s" +msgstr "\"SSL\" შეერთების ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" + +#: libpq/be-secure-openssl.c:461 +#, c-format +msgid "could not set SSL socket: %s" +msgstr "\"SSL\" სáƒáƒ™áƒ”ტის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" + +#: libpq/be-secure-openssl.c:517 +#, c-format +msgid "could not accept SSL connection: %m" +msgstr "'SSL' შეერთების მიღების შეცდáƒáƒ›áƒ: %m" + +#: libpq/be-secure-openssl.c:521 libpq/be-secure-openssl.c:578 +#, c-format +msgid "could not accept SSL connection: EOF detected" +msgstr "'SSL' შეერთების მიღების შეცდáƒáƒ›áƒ: áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირEOF" + +#: libpq/be-secure-openssl.c:562 +#, c-format +msgid "could not accept SSL connection: %s" +msgstr "'SSL' შეერთების მიღების შეცდáƒáƒ›áƒ: %s" + +#: libpq/be-secure-openssl.c:566 +#, c-format +msgid "This may indicate that the client does not support any SSL protocol version between %s and %s." +msgstr "" + +#: libpq/be-secure-openssl.c:583 libpq/be-secure-openssl.c:798 libpq/be-secure-openssl.c:868 +#, c-format +msgid "unrecognized SSL error code: %d" +msgstr "უცნáƒáƒ‘ი SSL-ის შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %d" + +#: libpq/be-secure-openssl.c:611 +#, c-format +msgid "received SSL connection request with unexpected ALPN protocol" +msgstr "" + +#: libpq/be-secure-openssl.c:655 +#, c-format +msgid "SSL certificate's common name contains embedded null" +msgstr "SSL სერტიფიკáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ”რთრსáƒáƒ®áƒ”ლი ჩáƒáƒ“გმულ ნულáƒáƒ•áƒáƒœáƒ¡ შეიცáƒáƒ•ს" + +#: libpq/be-secure-openssl.c:701 +#, c-format +msgid "SSL certificate's distinguished name contains embedded null" +msgstr "SSL სერტიფიკáƒáƒ¢áƒ˜áƒ¡ გáƒáƒ›áƒáƒ áƒ©áƒ”ული სáƒáƒ®áƒ”ლი ჩáƒáƒ“გმულ ნულáƒáƒ•áƒáƒœáƒ¡ შეიცáƒáƒ•ს" + +#: libpq/be-secure-openssl.c:787 libpq/be-secure-openssl.c:852 +#, c-format +msgid "SSL error: %s" +msgstr "SSL-ის შეცდáƒáƒ›áƒ: %s" + +#: libpq/be-secure-openssl.c:1027 +#, c-format +msgid "could not open DH parameters file \"%s\": %m" +msgstr "dh პáƒáƒ áƒáƒ›áƒ”ტრების ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: libpq/be-secure-openssl.c:1039 +#, c-format +msgid "could not load DH parameters file: %s" +msgstr "dh პáƒáƒ áƒáƒ›áƒ”ტრების ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ: %s" + +#: libpq/be-secure-openssl.c:1049 +#, c-format +msgid "invalid DH parameters: %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ DH-ის პáƒáƒ áƒáƒ›áƒ”ტრები: %s" + +#: libpq/be-secure-openssl.c:1058 +#, c-format +msgid "invalid DH parameters: p is not prime" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ DH-ის პáƒáƒ áƒáƒ›áƒ”ტრები: p მáƒáƒ áƒ¢áƒ˜áƒ•ი რიცხვი áƒáƒ áƒáƒ" + +#: libpq/be-secure-openssl.c:1067 +#, c-format +msgid "invalid DH parameters: neither suitable generator or safe prime" +msgstr "" + +#: libpq/be-secure-openssl.c:1203 +#, c-format +msgid "Client certificate verification failed at depth %d: %s." +msgstr "კლიენტის სერტიფიკáƒáƒ¢áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ სიღრმეზე %d: %s." + +#: libpq/be-secure-openssl.c:1240 +#, c-format +msgid "Failed certificate data (unverified): subject \"%s\", serial number %s, issuer \"%s\"." +msgstr "შეცდáƒáƒ›áƒ˜áƒ¡ მქáƒáƒœáƒ” სერტიფიკáƒáƒ¢áƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მების (გáƒáƒ“áƒáƒ£áƒ›áƒáƒ¬áƒ›áƒ”ბელი): სáƒáƒ—áƒáƒ£áƒ áƒ˜ \"%s\", სერიული ნáƒáƒ›áƒ”რი %s, გáƒáƒ›áƒáƒ›áƒªáƒ”მელი \"%s\"." + +#: libpq/be-secure-openssl.c:1241 +msgid "unknown" +msgstr "უცნáƒáƒ‘ი" + +#: libpq/be-secure-openssl.c:1378 +#, c-format +msgid "DH: could not load DH parameters" +msgstr "DH: DH-ის პáƒáƒ áƒáƒ›áƒ”ტრების ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ" + +#: libpq/be-secure-openssl.c:1386 +#, c-format +msgid "DH: could not set DH parameters: %s" +msgstr "DH: DH-ის პáƒáƒ áƒáƒ›áƒ”ტრების დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" + +#: libpq/be-secure-openssl.c:1413 +#, c-format +msgid "ECDH: unrecognized curve name: %s" +msgstr "ECDH: მრუდის უცნáƒáƒ‘ი სáƒáƒ®áƒ”ლი: %s" + +#: libpq/be-secure-openssl.c:1422 +#, c-format +msgid "ECDH: could not create key" +msgstr "ECDH: გáƒáƒ¡áƒáƒ¦áƒ”ბის შექნის შეცდáƒáƒ›áƒ" + +#: libpq/be-secure-openssl.c:1450 +msgid "no SSL error reported" +msgstr "შეცდáƒáƒ›áƒ SSL-ში áƒáƒ  დáƒáƒ¤áƒ˜áƒ¥áƒ¡áƒ˜áƒ áƒ”ბულáƒ" + +#: libpq/be-secure-openssl.c:1467 +#, c-format +msgid "SSL error code %lu" +msgstr "SSL-ის შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: libpq/be-secure-openssl.c:1624 +#, c-format +msgid "could not create BIO" +msgstr "\"BIO\"-ს შექმნის შეცდáƒáƒ›áƒ" + +#: libpq/be-secure-openssl.c:1634 +#, c-format +msgid "could not get NID for ASN1_OBJECT object" +msgstr "'ASN1_OBJECT' ტიპის áƒáƒ‘იექტისთვის NID-ის მიღებრშეუძლებელიáƒ" + +#: libpq/be-secure-openssl.c:1642 +#, c-format +msgid "could not convert NID %d to an ASN1_OBJECT structure" +msgstr "'NID %d'-ის ASN1_OBJECT ტიპის სტრუქტურáƒáƒ“ გáƒáƒ áƒ“áƒáƒ¥áƒœáƒ შეუძლებელიáƒ" + +#: libpq/crypt.c:48 +#, c-format +msgid "Role \"%s\" does not exist." +msgstr "რáƒáƒšáƒ˜ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"." + +#: libpq/crypt.c:58 +#, c-format +msgid "User \"%s\" has no password assigned." +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს პáƒáƒ áƒáƒšáƒ˜ მინიჭებული áƒáƒ  áƒáƒ¥áƒ•ს: %s." + +#: libpq/crypt.c:76 +#, c-format +msgid "User \"%s\" has an expired password." +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒšáƒ˜áƒ¡ ვáƒáƒ“რგáƒáƒ¡áƒ£áƒšáƒ˜áƒ: %s." + +#: libpq/crypt.c:182 +#, c-format +msgid "User \"%s\" has a password that cannot be used with MD5 authentication." +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის (\"%s\") პáƒáƒ áƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებრMD5-ით áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის შეუძლებელიáƒ." + +#: libpq/crypt.c:203 libpq/crypt.c:245 libpq/crypt.c:265 +#, c-format +msgid "Password does not match for user \"%s\"." +msgstr "პáƒáƒ áƒáƒšáƒ˜ áƒáƒ  ემთხვევრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს \"%s." + +#: libpq/crypt.c:284 +#, c-format +msgid "Password of user \"%s\" is in unrecognized format." +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის (\"%s\") პáƒáƒ áƒáƒšáƒ˜áƒ¡ უცნáƒáƒ‘ი ფáƒáƒ áƒ›áƒáƒ¢áƒ˜." + +#: libpq/hba.c:327 +#, c-format +msgid "invalid regular expression \"%s\": %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრ(%s): %s" + +#: libpq/hba.c:329 libpq/hba.c:661 libpq/hba.c:1245 libpq/hba.c:1265 libpq/hba.c:1288 libpq/hba.c:1301 libpq/hba.c:1354 libpq/hba.c:1382 libpq/hba.c:1390 libpq/hba.c:1402 libpq/hba.c:1423 libpq/hba.c:1436 libpq/hba.c:1461 libpq/hba.c:1488 libpq/hba.c:1500 libpq/hba.c:1559 libpq/hba.c:1579 libpq/hba.c:1593 libpq/hba.c:1613 libpq/hba.c:1624 libpq/hba.c:1639 libpq/hba.c:1658 libpq/hba.c:1674 libpq/hba.c:1686 libpq/hba.c:1752 libpq/hba.c:1765 libpq/hba.c:1787 +#: libpq/hba.c:1799 libpq/hba.c:1817 libpq/hba.c:1867 libpq/hba.c:1911 libpq/hba.c:1922 libpq/hba.c:1938 libpq/hba.c:1955 libpq/hba.c:1966 libpq/hba.c:1985 libpq/hba.c:2001 libpq/hba.c:2017 libpq/hba.c:2076 libpq/hba.c:2093 libpq/hba.c:2106 libpq/hba.c:2118 libpq/hba.c:2137 libpq/hba.c:2223 libpq/hba.c:2241 libpq/hba.c:2335 libpq/hba.c:2354 libpq/hba.c:2383 libpq/hba.c:2396 libpq/hba.c:2419 libpq/hba.c:2441 libpq/hba.c:2455 tsearch/ts_locale.c:241 +#, c-format +msgid "line %d of configuration file \"%s\"" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%2$s\" ხáƒáƒ–ზე %1$d" + +#: libpq/hba.c:457 +#, c-format +msgid "skipping missing authentication file \"%s\"" +msgstr "ნáƒáƒ™áƒšáƒ£áƒšáƒ˜ áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒ•ებრ\"%s\"" + +#: libpq/hba.c:609 +#, c-format +msgid "could not open file \"%s\": maximum nesting depth exceeded" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: გáƒáƒ“áƒáƒªáƒ˜áƒšáƒ”ბულირჩáƒáƒšáƒáƒ’ების სიღრმე" + +#: libpq/hba.c:1216 +#, c-format +msgid "error enumerating network interfaces: %m" +msgstr "ქსელის ინტერფეისების ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜áƒ¡ მიღების შეცდáƒáƒ›áƒ: %m" + +#. translator: the second %s is a list of auth methods +#: libpq/hba.c:1243 +#, c-format +msgid "authentication option \"%s\" is only valid for authentication methods %s" +msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" მხáƒáƒšáƒáƒ“ áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ებისთვის %s შეგიძლიáƒáƒ—, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—" + +#: libpq/hba.c:1263 +#, c-format +msgid "authentication method \"%s\" requires argument \"%s\" to be set" +msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ს \"%s\" áƒáƒ áƒ’უმენტის (\"%s\") დáƒáƒ§áƒ”ნებრსჭირდებáƒ" + +#: libpq/hba.c:1287 +#, c-format +msgid "missing entry at end of line" +msgstr "ხáƒáƒ–ის ბáƒáƒšáƒáƒ¨áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ" + +#: libpq/hba.c:1300 +#, c-format +msgid "multiple values in ident field" +msgstr "ერთზე მეტი მნიშვნელáƒáƒ‘რველში ident" + +#: libpq/hba.c:1352 +#, c-format +msgid "multiple values specified for connection type" +msgstr "მიერთების ტიპში მითითებულირერთზე მეტი მნიშვნელáƒáƒ‘áƒ" + +#: libpq/hba.c:1353 +#, c-format +msgid "Specify exactly one connection type per line." +msgstr "ერთ ხáƒáƒ–ზე ზუსტáƒáƒ“ ერთი მიერთების ტიპი უნდრმიუთითáƒáƒ—." + +#: libpq/hba.c:1380 +#, c-format +msgid "hostssl record cannot match because SSL is disabled" +msgstr "hostssl-ის ჩáƒáƒœáƒáƒ¬áƒ”რის დáƒáƒ›áƒ—ხვევრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ SSL გáƒáƒ—იშულიáƒ" + +#: libpq/hba.c:1381 +#, c-format +msgid "Set \"ssl = on\" in postgresql.conf." +msgstr "დáƒáƒáƒ§áƒ”ნეთ \"ssl = on\" postgresql.conf-ში." + +#: libpq/hba.c:1389 +#, c-format +msgid "hostssl record cannot match because SSL is not supported by this build" +msgstr "hostssl-ის ჩáƒáƒœáƒáƒ¬áƒ”რის დáƒáƒ›áƒ—ხვევრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ SSL-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ› áƒáƒ’ებისáƒáƒ¡ ჩáƒáƒ áƒ—ული áƒáƒ  იყáƒ" + +#: libpq/hba.c:1401 +#, c-format +msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" +msgstr "hostgssenc-ის ჩáƒáƒœáƒáƒ¬áƒ”რის დáƒáƒ›áƒ—ხვევრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ GSSAPI -ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ› áƒáƒ’ებისáƒáƒ¡ ჩáƒáƒ áƒ—ული áƒáƒ  იყáƒ" + +#: libpq/hba.c:1421 +#, c-format +msgid "invalid connection type \"%s\"" +msgstr "შეერთების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" + +#: libpq/hba.c:1435 +#, c-format +msgid "end-of-line before database specification" +msgstr "ხáƒáƒ–ის-დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜ ბáƒáƒ–ის მითითებáƒáƒ›áƒ“ე" + +#: libpq/hba.c:1460 +#, c-format +msgid "end-of-line before role specification" +msgstr "ხáƒáƒ–ის-დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜ რáƒáƒšáƒ˜áƒ¡ მითითებáƒáƒ›áƒ“ე" + +#: libpq/hba.c:1487 +#, c-format +msgid "end-of-line before IP address specification" +msgstr "ხáƒáƒ–ის-დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜ IP მისáƒáƒ›áƒáƒ áƒ—ის მითითებáƒáƒ›áƒ“ე" + +#: libpq/hba.c:1498 +#, c-format +msgid "multiple values specified for host address" +msgstr "მითითებულირჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის ერთზე მეტი მნიშვნელáƒáƒ‘áƒ" + +#: libpq/hba.c:1499 +#, c-format +msgid "Specify one address range per line." +msgstr "ერთ ხáƒáƒ–ზე ერთი მისáƒáƒ›áƒáƒ áƒ—ების დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜ მიუთითეთ." + +#: libpq/hba.c:1557 +#, c-format +msgid "invalid IP address \"%s\": %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ IP მისáƒáƒ›áƒáƒ áƒ—ი \"%s\": %s" + +#: libpq/hba.c:1577 +#, c-format +msgid "specifying both host name and CIDR mask is invalid: \"%s\"" +msgstr "áƒáƒ áƒ˜áƒ•ეს, ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლის დრCIDR-ის ნიღბის მითითებრáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: \"%s\"" + +#: libpq/hba.c:1591 +#, c-format +msgid "invalid CIDR mask in address \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ CIDR ნიღáƒáƒ‘ი მისáƒáƒ›áƒáƒ áƒ—ში \"%s\"" + +#: libpq/hba.c:1611 +#, c-format +msgid "end-of-line before netmask specification" +msgstr "ხáƒáƒ–ის-დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜ ქსელური ნიღბის მითითებáƒáƒ›áƒ“ე" + +#: libpq/hba.c:1612 +#, c-format +msgid "Specify an address range in CIDR notation, or provide a separate netmask." +msgstr "" + +#: libpq/hba.c:1623 +#, c-format +msgid "multiple values specified for netmask" +msgstr "მითითებულირქსელის ნიღბის ერთზე მეტი მნიშვნელáƒáƒ‘áƒ" + +#: libpq/hba.c:1637 +#, c-format +msgid "invalid IP mask \"%s\": %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ IP ნიღáƒáƒ‘ი \"%s\": %s" + +#: libpq/hba.c:1657 +#, c-format +msgid "IP address and mask do not match" +msgstr "IP მისáƒáƒ›áƒáƒ áƒ—ი დრნიღáƒáƒ‘ი áƒáƒ  ემთხვევáƒ" + +#: libpq/hba.c:1673 +#, c-format +msgid "end-of-line before authentication method" +msgstr "ხáƒáƒ–ის-დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜ áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“áƒáƒ›áƒ“ე" + +#: libpq/hba.c:1684 +#, c-format +msgid "multiple values specified for authentication type" +msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ტიპში მითითებულირერთზე მეტი მნიშვნელáƒáƒ‘áƒ" + +#: libpq/hba.c:1685 +#, c-format +msgid "Specify exactly one authentication type per line." +msgstr "ერთ ხáƒáƒ–ზე ზუსტáƒáƒ“ ერთი áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ტიპი უნდრმიუთითáƒáƒ—." + +#: libpq/hba.c:1750 +#, c-format +msgid "invalid authentication method \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი \"%s\"" + +#: libpq/hba.c:1763 +#, c-format +msgid "invalid authentication method \"%s\": not supported by this build" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი \"%s\": მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირáƒáƒ› ვერსიის მიერ" + +#: libpq/hba.c:1786 +#, c-format +msgid "gssapi authentication is not supported on local sockets" +msgstr "gssapi áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ ლáƒáƒ™áƒáƒšáƒ£áƒ  სáƒáƒ™áƒ”ტებზე მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: libpq/hba.c:1798 +#, c-format +msgid "peer authentication is only supported on local sockets" +msgstr "პáƒáƒ áƒ¢áƒœáƒ˜áƒáƒ áƒ˜áƒ¡ áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ მხáƒáƒšáƒáƒ“ ლáƒáƒ™áƒáƒšáƒ£áƒ  სáƒáƒ™áƒ”ტებზერმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი" + +#: libpq/hba.c:1816 +#, c-format +msgid "cert authentication is only supported on hostssl connections" +msgstr "სერტიფიკáƒáƒ¢áƒ˜áƒ— áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ მხáƒáƒšáƒáƒ“ hostssl მიერთებებზერმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი" + +#: libpq/hba.c:1866 +#, c-format +msgid "authentication option not in name=value format: %s" +msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი სáƒáƒ®áƒ”ლი=მნიშვნელáƒáƒ‘რფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜ áƒáƒ áƒáƒ: %s" + +#: libpq/hba.c:1910 +#, c-format +msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" +msgstr "ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, áƒáƒœ ldapurl-ის ldapprefix-სთáƒáƒœ ერთáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: libpq/hba.c:1921 +#, c-format +msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" +msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ს \"ldap\" áƒáƒ áƒ’უმენტების \"ldapbasedn\", \"ldapprefix\", áƒáƒœ \"ldapsuffix\" დáƒáƒ§áƒ”ნებრსჭირდებáƒ" + +#: libpq/hba.c:1937 +#, c-format +msgid "cannot use ldapsearchattribute together with ldapsearchfilter" +msgstr "ldapsearchattribute-ს დრldapsearchfilter-ს ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: libpq/hba.c:1954 +#, c-format +msgid "list of RADIUS servers cannot be empty" +msgstr "'RADIUS' სერვერების სირáƒáƒ  შეიძლებáƒ, ცáƒáƒ áƒ˜áƒ”ლი იყáƒáƒ¡" + +#: libpq/hba.c:1965 +#, c-format +msgid "list of RADIUS secrets cannot be empty" +msgstr "'RADIUS' სáƒáƒ˜áƒ“უმლáƒáƒ”ბის სირáƒáƒ  შეიძლებáƒ, ცáƒáƒ áƒ˜áƒ”ლი იყáƒáƒ¡" + +#: libpq/hba.c:1982 +#, c-format +msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "" + +#: libpq/hba.c:1998 +#, c-format +msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "" + +#: libpq/hba.c:2014 +#, c-format +msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "" + +#: libpq/hba.c:2066 +msgid "ident, peer, gssapi, sspi, and cert" +msgstr "ident, peer, gssapi, sspi, დრcert" + +#: libpq/hba.c:2075 +#, c-format +msgid "clientcert can only be configured for \"hostssl\" rows" +msgstr "clientcert-ის მáƒáƒ áƒ’ებრმხáƒáƒšáƒáƒ“ \"hostssl\" ხáƒáƒ–ებისთვის შეგიძლიáƒáƒ—" + +#: libpq/hba.c:2092 +#, c-format +msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" +msgstr "\"cert\" ტიპის áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ clientcert-ს მხáƒáƒšáƒáƒ“ \"verify-full\" შეგიძლიáƒáƒ—, მიუთითáƒáƒ—" + +#: libpq/hba.c:2105 +#, c-format +msgid "invalid value for clientcert: \"%s\"" +msgstr "invalid value for clientcert: \"%s\"" + +#: libpq/hba.c:2117 +#, c-format +msgid "clientname can only be configured for \"hostssl\" rows" +msgstr "clientname-ის მáƒáƒ áƒ’ებრმხáƒáƒšáƒáƒ“ \"hostssl\" ხáƒáƒ–ებისთვის შეგიძლიáƒáƒ—" + +#: libpq/hba.c:2136 +#, c-format +msgid "invalid value for clientname: \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რკლიენტის სáƒáƒ®áƒ”ლისთვის: \"%s\"" + +#: libpq/hba.c:2169 +#, c-format +msgid "could not parse LDAP URL \"%s\": %s" +msgstr "\"LDAP URL\"-ის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: %s" + +#: libpq/hba.c:2180 +#, c-format +msgid "unsupported LDAP URL scheme: %s" +msgstr "\"LDAP URL\"-ის მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი სქემáƒ: %s" + +#: libpq/hba.c:2204 +#, c-format +msgid "LDAP URLs not supported on this platform" +msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე LDAP URL მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: libpq/hba.c:2222 +#, c-format +msgid "invalid ldapscheme value: \"%s\"" +msgstr "ldapscheme -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: \"%s\"" + +#: libpq/hba.c:2240 +#, c-format +msgid "invalid LDAP port number: \"%s\"" +msgstr "\"LDAP\"-ის პáƒáƒ áƒ¢áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი: %s" + +#: libpq/hba.c:2286 libpq/hba.c:2293 +msgid "gssapi and sspi" +msgstr "gssapi დრsspi" + +#: libpq/hba.c:2302 libpq/hba.c:2311 +msgid "sspi" +msgstr "sspi" + +#: libpq/hba.c:2333 +#, c-format +msgid "could not parse RADIUS server list \"%s\"" +msgstr "\"RADIUS\"-ის სერვერების სიის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებრშეუძლებელიáƒ: %s" + +#: libpq/hba.c:2381 +#, c-format +msgid "could not parse RADIUS port list \"%s\"" +msgstr "\"RADIUS\"-ის პáƒáƒ áƒ¢áƒ”ბის სიის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებრშეუძლებელიáƒ: %s" + +#: libpq/hba.c:2395 +#, c-format +msgid "invalid RADIUS port number: \"%s\"" +msgstr "\"RADIUS\"-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒ¢áƒ˜: \"%s\"" + +#: libpq/hba.c:2417 +#, c-format +msgid "could not parse RADIUS secret list \"%s\"" +msgstr "'RADIUS'-ის სáƒáƒ˜áƒ“უმლáƒáƒ”ბის სიის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებრშეუძლებელიáƒ: %s" + +#: libpq/hba.c:2439 +#, c-format +msgid "could not parse RADIUS identifiers list \"%s\"" +msgstr "'RADIUS'-ის იდენტიფიკáƒáƒ¢áƒáƒ áƒ”ბის ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜áƒ¡ \"%s\" დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებრშეუძლებელიáƒ" + +#: libpq/hba.c:2453 +#, c-format +msgid "unrecognized authentication option name: \"%s\"" +msgstr "უცნáƒáƒ‘ი áƒáƒ•თნტიკáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის სáƒáƒ®áƒ”ლი: \"%s\"" + +#: libpq/hba.c:2645 +#, c-format +msgid "configuration file \"%s\" contains no entries" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ \"%s\" ჩáƒáƒœáƒáƒ¬áƒ”რებს áƒáƒ  შეიცáƒáƒ•ს" + +#: libpq/hba.c:2798 +#, c-format +msgid "regular expression match for \"%s\" failed: %s" +msgstr "რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის დáƒáƒ›áƒ—ხვევრ\"%s\"-სთვის ჩáƒáƒ•áƒáƒ áƒ“áƒ: %s" + +#: libpq/hba.c:2822 +#, c-format +msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" +msgstr "" + +#: libpq/hba.c:2925 +#, c-format +msgid "provided user name (%s) and authenticated user name (%s) do not match" +msgstr "" + +#: libpq/hba.c:2945 +#, c-format +msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" +msgstr "" + +#: libpq/pqcomm.c:211 libpq/pqcomm.c:219 libpq/pqcomm.c:250 libpq/pqcomm.c:259 libpq/pqcomm.c:1648 libpq/pqcomm.c:1693 libpq/pqcomm.c:1733 libpq/pqcomm.c:1777 libpq/pqcomm.c:1816 libpq/pqcomm.c:1855 libpq/pqcomm.c:1891 libpq/pqcomm.c:1930 +#, c-format +msgid "%s(%s) failed: %m" +msgstr "%s(%s)-ის შეცდáƒáƒ›áƒ: %m" + +#: libpq/pqcomm.c:296 +#, c-format +msgid "could not set socket to nonblocking mode: %m" +msgstr "სáƒáƒ™áƒ”ტის áƒáƒ áƒáƒ‘ლáƒáƒ™áƒ˜áƒ áƒ”ბული რეჟიმის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %m" + +#: libpq/pqcomm.c:456 +#, c-format +msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" +msgstr "Unix-დáƒáƒ›áƒ”ნის სáƒáƒ™áƒ”ტის მისáƒáƒ›áƒáƒ áƒ—ი \"%s\" ძáƒáƒšáƒ˜áƒáƒœ გრძელირ(დáƒáƒ¡áƒáƒ¨áƒ•ებირ%d ბáƒáƒ˜áƒ¢áƒ˜)" + +#: libpq/pqcomm.c:476 +#, c-format +msgid "could not translate host name \"%s\", service \"%s\" to address: %s" +msgstr "ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლის \"%s\" დრსერვისის სáƒáƒ®áƒ”ლის \"%s\" მისáƒáƒ›áƒáƒ áƒ—ში თáƒáƒ áƒ’მნრშეუძლებელიáƒ: %s" + +#: libpq/pqcomm.c:480 +#, c-format +msgid "could not translate service \"%s\" to address: %s" +msgstr "სერვისის \"%s\" მისáƒáƒ›áƒáƒ áƒ—ში თáƒáƒ áƒ’მნრშეუძლებელიáƒ: %s" + +#: libpq/pqcomm.c:502 +#, c-format +msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" +msgstr "ყველრმáƒáƒ—ხáƒáƒ•ნილ მისáƒáƒ›áƒáƒ áƒ—ზე მიმáƒáƒ’რებრშეუძლებელიáƒ: MAXLISTEN (%d) გáƒáƒ“áƒáƒªáƒ˜áƒšáƒ”ბულიáƒ" + +#: libpq/pqcomm.c:511 +msgid "IPv4" +msgstr "IPv4" + +#: libpq/pqcomm.c:514 +msgid "IPv6" +msgstr "IPv6" + +#: libpq/pqcomm.c:517 +msgid "Unix" +msgstr "Unix" + +#: libpq/pqcomm.c:521 +#, c-format +msgid "unrecognized address family %d" +msgstr "მისáƒáƒ›áƒáƒ áƒ—ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ¯áƒáƒ®áƒ˜ %d" + +#. translator: first %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:545 +#, c-format +msgid "could not create %s socket for address \"%s\": %m" +msgstr "%s სáƒáƒ™áƒ”ტის შექმნის შეცდáƒáƒ›áƒ მისáƒáƒ›áƒáƒ áƒ—ისთვის \"%s\": %m" + +#. translator: third %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:574 libpq/pqcomm.c:592 +#, c-format +msgid "%s(%s) failed for %s address \"%s\": %m" +msgstr "%s(%s)-ის შეცდáƒáƒ›áƒ %s-სთვის მისáƒáƒ›áƒáƒ áƒ—ი \"%s\": %m" + +#. translator: first %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:615 +#, c-format +msgid "could not bind %s address \"%s\": %m" +msgstr "%s მისáƒáƒ›áƒáƒ áƒ—ზე \"%s\" მიბმის შეცდáƒáƒ›áƒ: %m" + +#: libpq/pqcomm.c:619 +#, c-format +msgid "Is another postmaster already running on port %d?" +msgstr "იქნებ პáƒáƒ áƒ¢áƒ–ე %d სხვრpostmaster პრáƒáƒªáƒ”სი უკვე უსმენს?" + +#: libpq/pqcomm.c:621 +#, c-format +msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." +msgstr "იქნებ პáƒáƒ áƒ¢áƒ–ე %d სხვრpostmaster პრáƒáƒªáƒ”სი უკვე უსმენს? თუ áƒáƒ áƒ, დáƒáƒ˜áƒªáƒáƒ“ეთ რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜ დრთáƒáƒ•იდáƒáƒœ სცáƒáƒ“ეთ." + +#. translator: first %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:650 +#, c-format +msgid "could not listen on %s address \"%s\": %m" +msgstr "%s მისáƒáƒ›áƒáƒ áƒ—ზე \"%s\" მáƒáƒ¡áƒ›áƒ”ნრშეუძლებელიáƒ: %m" + +#: libpq/pqcomm.c:658 +#, c-format +msgid "listening on Unix socket \"%s\"" +msgstr "ვუსმენ Unix სáƒáƒ™áƒ”ტს \"%s\"" + +#. translator: first %s is IPv4 or IPv6 +#: libpq/pqcomm.c:663 +#, c-format +msgid "listening on %s address \"%s\", port %d" +msgstr "ვუსმენ %s მისáƒáƒ›áƒáƒ áƒ—ი \"%s\", პáƒáƒ áƒ¢áƒ˜ %d" + +#: libpq/pqcomm.c:753 +#, c-format +msgid "group \"%s\" does not exist" +msgstr "ჯგუფი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: libpq/pqcomm.c:763 +#, c-format +msgid "could not set group of file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" ჯგუფის დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ: %m" + +#: libpq/pqcomm.c:774 +#, c-format +msgid "could not set permissions of file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ–ე \"%s\" წვდáƒáƒ›áƒ”ბის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %m" + +#: libpq/pqcomm.c:803 +#, c-format +msgid "could not accept new connection: %m" +msgstr "áƒáƒ®áƒáƒšáƒ˜ მიერთების მიღებრშეუძლებელიáƒ: %m" + +#: libpq/pqcomm.c:885 +#, c-format +msgid "there is no client connection" +msgstr "კლიენტის მიერთებრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: libpq/pqcomm.c:941 libpq/pqcomm.c:1042 +#, c-format +msgid "could not receive data from client: %m" +msgstr "კლიენტიდáƒáƒœ მáƒáƒœáƒáƒªáƒ”მების მიღების შეცდáƒáƒ›áƒ: %m" + +#: libpq/pqcomm.c:1149 tcop/postgres.c:4446 +#, c-format +msgid "terminating connection because protocol synchronization was lost" +msgstr "მიერთებრშეწყდებáƒ, რáƒáƒ“გáƒáƒœ პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ დáƒáƒ˜áƒ™áƒáƒ áƒ’áƒ" + +#: libpq/pqcomm.c:1215 +#, c-format +msgid "unexpected EOF within message length word" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი EOF შეტყáƒáƒ‘ინების სიგრძის სიტყვáƒáƒ¨áƒ˜" + +#: libpq/pqcomm.c:1225 +#, c-format +msgid "invalid message length" +msgstr "შეტყáƒáƒ‘ინების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე" + +#: libpq/pqcomm.c:1247 libpq/pqcomm.c:1260 +#, c-format +msgid "incomplete message from client" +msgstr "კლიენტიდáƒáƒœ მიღებული შეტყáƒáƒ‘ინებრდáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელიáƒ" + +#: libpq/pqcomm.c:1401 +#, c-format +msgid "could not send data to client: %m" +msgstr "კლიენტისთვის მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ: %m" + +#: libpq/pqcomm.c:1616 +#, c-format +msgid "%s(%s) failed: error code %d" +msgstr "%s(%s) -ის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %d" + +#: libpq/pqcomm.c:1705 +#, c-format +msgid "setting the keepalive idle time is not supported" +msgstr "" + +#: libpq/pqcomm.c:1789 libpq/pqcomm.c:1864 libpq/pqcomm.c:1939 +#, c-format +msgid "%s(%s) not supported" +msgstr "%s (%s) მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: libpq/pqformat.c:404 +#, c-format +msgid "no data left in message" +msgstr "შეტყáƒáƒ‘ინებáƒáƒ¨áƒ˜ მáƒáƒœáƒáƒªáƒ”მები áƒáƒ¦áƒáƒ  დáƒáƒ áƒ©áƒ" + +#: libpq/pqformat.c:515 libpq/pqformat.c:533 libpq/pqformat.c:554 utils/adt/array_userfuncs.c:797 utils/adt/arrayfuncs.c:1481 utils/adt/rowtypes.c:613 +#, c-format +msgid "insufficient data left in message" +msgstr "შეტყáƒáƒ‘ინებáƒáƒ¨áƒ˜ დáƒáƒ áƒ©áƒ”ნილი მáƒáƒœáƒáƒªáƒ”მები áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜áƒ" + +#: libpq/pqformat.c:595 libpq/pqformat.c:624 +#, c-format +msgid "invalid string in message" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სტრიქáƒáƒœáƒ˜ შეტყáƒáƒ‘ინებáƒáƒ¨áƒ˜" + +#: libpq/pqformat.c:640 +#, c-format +msgid "invalid message format" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შეტყáƒáƒ‘ინების ფáƒáƒ áƒ›áƒáƒ¢áƒ˜" + +#: main/main.c:234 +#, c-format +msgid "%s: WSAStartup failed: %d\n" +msgstr "%s: WSAStartup-ის შეცდáƒáƒ›áƒ: %d\n" + +#: main/main.c:322 +#, c-format +msgid "" +"%s is the PostgreSQL server.\n" +"\n" +msgstr "" +"%s PostgreSQL სერვერიáƒ.\n" +"\n" + +#: main/main.c:323 +#, c-format +msgid "" +"Usage:\n" +" %s [OPTION]...\n" +"\n" +msgstr "" +"გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" +"%s [პáƒáƒ áƒáƒ›áƒ”ტრი]..\n" +"\n" +"\n" + +#: main/main.c:324 +#, c-format +msgid "Options:\n" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები:\n" + +#: main/main.c:325 +#, c-format +msgid " -B NBUFFERS number of shared buffers\n" +msgstr " -B NBUFFERS გáƒáƒ–იáƒáƒ áƒ”ბული ბáƒáƒ¤áƒ”რების რáƒáƒáƒ“ენáƒáƒ‘áƒ\n" + +#: main/main.c:326 +#, c-format +msgid " -c NAME=VALUE set run-time parameter\n" +msgstr " -c სáƒáƒ®áƒ”ლი=მნიშვნელáƒáƒ‘რგáƒáƒ¨áƒ•ებული პრáƒáƒªáƒ”სის პáƒáƒ áƒáƒ›áƒ”ტრის დáƒáƒ§áƒ”ნებáƒ\n" + +#: main/main.c:327 +#, c-format +msgid " -C NAME print value of run-time parameter, then exit\n" +msgstr " -C სáƒáƒ®áƒ”ლი გáƒáƒ¨áƒ•ებული პრáƒáƒªáƒ”სის პáƒáƒ áƒáƒ›áƒ”ტრის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" + +#: main/main.c:328 +#, c-format +msgid " -d 1-5 debugging level\n" +msgstr " -d 1-5 გáƒáƒ›áƒáƒ áƒ—ვის დáƒáƒœáƒ”\n" + +#: main/main.c:329 +#, c-format +msgid " -D DATADIR database directory\n" +msgstr " -D DATADIR მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის დირექტáƒáƒ áƒ˜áƒ\n" + +#: main/main.c:330 +#, c-format +msgid " -e use European date input format (DMY)\n" +msgstr " -e ევრáƒáƒžáƒ£áƒšáƒ˜ თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡ შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ (DMY) გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" + +#: main/main.c:331 +#, c-format +msgid " -F turn fsync off\n" +msgstr " -F fsync-ის გáƒáƒ›áƒáƒ áƒ—ვáƒ\n" + +#: main/main.c:332 +#, c-format +msgid " -h HOSTNAME host name or IP address to listen on\n" +msgstr " -h ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი áƒáƒœ IP მისáƒáƒ›áƒáƒ áƒ—ი, რáƒáƒ›áƒ”ლზეც უნდრმáƒáƒ•უსმინáƒ\n" + +#: main/main.c:333 +#, c-format +msgid " -i enable TCP/IP connections (deprecated)\n" +msgstr " -i TCP/IP-ის ჩáƒáƒ áƒ—ვრ(მáƒáƒ«áƒ•ელებული)\n" + +#: main/main.c:334 +#, c-format +msgid " -k DIRECTORY Unix-domain socket location\n" +msgstr " -k სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე Unix-დáƒáƒ›áƒ”ნის სáƒáƒ™áƒ”ტის მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n" + +#: main/main.c:336 +#, c-format +msgid " -l enable SSL connections\n" +msgstr " -l SSL-ის ჩáƒáƒ áƒ—ვáƒ\n" + +#: main/main.c:338 +#, c-format +msgid " -N MAX-CONNECT maximum number of allowed connections\n" +msgstr " -N მáƒáƒ¥áƒ¡-მიერთ მიერთებების დáƒáƒ¨áƒ•ებული მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ\n" + +#: main/main.c:339 +#, c-format +msgid " -p PORT port number to listen on\n" +msgstr " -p პáƒáƒ áƒ¢áƒ˜ მáƒáƒ¡áƒáƒ¡áƒ›áƒ”ნი პáƒáƒ áƒ¢áƒ˜áƒ¡ ნáƒáƒ›áƒ”რი\n" + +#: main/main.c:340 +#, c-format +msgid " -s show statistics after each query\n" +msgstr " -s ყáƒáƒ•ელი მáƒáƒ—ხáƒáƒ•ნის შემდეგ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ¡áƒ˜ ჩვენებáƒ\n" + +#: main/main.c:341 +#, c-format +msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" +msgstr " -S სáƒáƒ›áƒ£áƒ¨-მეხს დáƒáƒšáƒáƒ’ებისთვის გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ მეხსიერების დáƒáƒ§áƒ”ნებრ(კილáƒáƒ‘áƒáƒ˜áƒ¢áƒ”ბში)\n" + +#: main/main.c:342 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" + +#: main/main.c:343 +#, c-format +msgid " --NAME=VALUE set run-time parameter\n" +msgstr " --სáƒáƒ®áƒ”ლი=მნიშვნელáƒáƒ‘რგáƒáƒ¨áƒ•ებული პრáƒáƒªáƒ”სის პáƒáƒ áƒáƒ›áƒ”ტრის დáƒáƒ§áƒ”ნებáƒ\n" + +#: main/main.c:344 +#, c-format +msgid " --describe-config describe configuration parameters, then exit\n" +msgstr " --describe-config კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" + +#: main/main.c:345 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" + +#: main/main.c:347 +#, c-format +msgid "" +"\n" +"Developer options:\n" +msgstr "" +"\n" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡áƒ¢áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები:\n" + +#: main/main.c:348 +#, c-format +msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" +msgstr " -f s|i|o|b|t|n|m|h ზáƒáƒ’იერთი გეგმის ტიპის გáƒáƒ›áƒáƒ§áƒ”ნების áƒáƒ™áƒ áƒ«áƒáƒšáƒ•áƒ\n" + +#: main/main.c:349 +#, c-format +msgid " -O allow system table structure changes\n" +msgstr " -O სისტემური ცხრილის სტრუქტურის შეცვლის დáƒáƒ¨áƒ•ებáƒ\n" + +#: main/main.c:350 +#, c-format +msgid " -P disable system indexes\n" +msgstr " -P სისტემური ინდექსების გáƒáƒ›áƒáƒ áƒ—ვáƒ\n" + +#: main/main.c:351 +#, c-format +msgid " -t pa|pl|ex show timings after each query\n" +msgstr " -t pa|pl|ex ყáƒáƒ•ელი მáƒáƒ—ხáƒáƒ•ნის დრáƒáƒ˜áƒ¡ მნიშვნელáƒáƒ‘ების ჩვენებáƒ\n" + +#: main/main.c:352 +#, c-format +msgid " -T send SIGABRT to all backend processes if one dies\n" +msgstr " -T ერთის სიკვდილის შემთხვევáƒáƒ¨áƒ˜ ყველრუკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ პრáƒáƒªáƒ”სისთვის SIGABRT სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნáƒ\n" + +#: main/main.c:353 +#, c-format +msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" +msgstr " -W რიცხვი გáƒáƒ›áƒ›áƒáƒ áƒ—ველისგáƒáƒœ მიმáƒáƒ’რებისáƒáƒ¡ მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის წáƒáƒ›áƒ”ბის დáƒáƒªáƒ“áƒ\n" + +#: main/main.c:355 +#, c-format +msgid "" +"\n" +"Options for single-user mode:\n" +msgstr "" +"\n" +"ერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ რეჟიმის პáƒáƒ áƒáƒ›áƒ”ტრები:\n" + +#: main/main.c:356 +#, c-format +msgid " --single selects single-user mode (must be first argument)\n" +msgstr " --single ერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ რეჟიმი (უნდრიყáƒáƒ¡ პირველი áƒáƒ áƒ’უმენტი)\n" + +#: main/main.c:357 +#, c-format +msgid " DBNAME database name (defaults to user name)\n" +msgstr " DBNAME ბáƒáƒ–ის სáƒáƒ®áƒ”ლი (ნáƒáƒ’ულისხმევი მნიშვნელáƒáƒ‘რმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლიáƒ)\n" + +#: main/main.c:358 +#, c-format +msgid " -d 0-5 override debugging level\n" +msgstr " -d 0-5 პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ áƒ—ვის დáƒáƒœáƒ˜áƒ¡ მითითებáƒ\n" + +#: main/main.c:359 +#, c-format +msgid " -E echo statement before execution\n" +msgstr " -E áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ მის შესრულებáƒáƒ›áƒ“ე\n" + +#: main/main.c:360 +#, c-format +msgid " -j do not use newline as interactive query delimiter\n" +msgstr " -j áƒáƒ®áƒáƒš ხáƒáƒ–ზე გáƒáƒ“áƒáƒ¢áƒáƒœáƒ ინტერáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ›áƒ§áƒáƒ¤áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული áƒáƒ  იქნებáƒ\n" + +#: main/main.c:361 main/main.c:367 +#, c-format +msgid " -r FILENAME send stdout and stderr to given file\n" +msgstr " -r FILENAME stdout-ის დრstderr-ის მითითებულ ფáƒáƒ˜áƒšáƒ¨áƒ˜ გáƒáƒ’ზáƒáƒ•ნáƒ\n" + +#: main/main.c:363 +#, c-format +msgid "" +"\n" +"Options for bootstrapping mode:\n" +msgstr "" +"\n" +"სáƒáƒ›áƒ£áƒ¨áƒáƒáƒ“ მáƒáƒ›áƒ–áƒáƒ“ების პáƒáƒ áƒáƒ›áƒ”ტრები\n" + +#: main/main.c:364 +#, c-format +msgid " --boot selects bootstrapping mode (must be first argument)\n" +msgstr " --boot სáƒáƒ›áƒ£áƒ¨áƒáƒáƒ“ მáƒáƒ›áƒ–áƒáƒ“ების რეჟიმი (უნდრიყáƒáƒ¡ პირველი áƒáƒ áƒ’უმენტი)\n" + +#: main/main.c:365 +#, c-format +msgid " --check selects check mode (must be first argument)\n" +msgstr " --check შემáƒáƒ¬áƒ›áƒ”ბის რეჟიმი (უნდრიყáƒáƒ¡ პირველი áƒáƒ áƒ’უმენტი)\n" + +#: main/main.c:366 +#, c-format +msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" +msgstr " DBNAME ბáƒáƒ–ის სáƒáƒ®áƒ”ლი (áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელი áƒáƒ áƒ’უმენტი სáƒáƒ›áƒ£áƒ¨áƒáƒáƒ“ მáƒáƒ›áƒ–áƒáƒ“ებისáƒáƒ¡)\n" + +#: main/main.c:369 +#, c-format +msgid "" +"\n" +"Please read the documentation for the complete list of run-time\n" +"configuration settings and how to set them on the command line or in\n" +"the configuration file.\n" +"\n" +"Report bugs to <%s>.\n" +msgstr "" + +#: main/main.c:373 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" + +#: main/main.c:384 +#, c-format +msgid "" +"\"root\" execution of the PostgreSQL server is not permitted.\n" +"The server must be started under an unprivileged user ID to prevent\n" +"possible system security compromise. See the documentation for\n" +"more information on how to properly start the server.\n" +msgstr "" + +#: main/main.c:401 +#, c-format +msgid "%s: real and effective user IDs must match\n" +msgstr "%s: რეáƒáƒšáƒ£áƒ áƒ˜ დრმიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ID-ები უნდრემთხვეáƒáƒ“ეს\n" + +#: main/main.c:408 +#, c-format +msgid "" +"Execution of PostgreSQL by a user with administrative permissions is not\n" +"permitted.\n" +"The server must be started under an unprivileged user ID to prevent\n" +"possible system security compromises. See the documentation for\n" +"more information on how to properly start the server.\n" +msgstr "" + +#: nodes/extensible.c:66 +#, c-format +msgid "extensible node type \"%s\" already exists" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბáƒáƒ“ი კვáƒáƒœáƒ«áƒ˜áƒ¡ ტიპი \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: nodes/extensible.c:114 +#, c-format +msgid "ExtensibleNodeMethods \"%s\" was not registered" +msgstr "ExtensibleNodeMethods \"%s\" რეგისტრირებული áƒáƒ  იყáƒ" + +#: nodes/makefuncs.c:152 statistics/extended_stats.c:2310 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "ურთიერთáƒáƒ‘áƒáƒ¡ \"%s\" კáƒáƒ›áƒžáƒáƒ–იტური ტიპი áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2567 parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 parser/parse_expr.c:2112 parser/parse_func.c:710 parser/parse_oper.c:869 utils/fmgr/funcapi.c:669 +#, c-format +msgid "could not find array type for data type %s" +msgstr "მáƒáƒœáƒáƒªáƒ”მების ტიპისთვის %s მáƒáƒ¡áƒ˜áƒ•ის ტიპი ვერ ვიპáƒáƒ•ე" + +#: nodes/params.c:417 +#, c-format +msgid "portal \"%s\" with parameters: %s" +msgstr "პáƒáƒ áƒ¢áƒáƒšáƒ˜ \"%s\" პáƒáƒ áƒáƒ›áƒ”ტრებით: %s" + +#: nodes/params.c:420 +#, c-format +msgid "unnamed portal with parameters: %s" +msgstr "უსáƒáƒ®áƒ”ლრპáƒáƒ áƒ¢áƒáƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრებით: %s" + +#: optimizer/path/joinrels.c:972 +#, c-format +msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" +msgstr "" + +#: optimizer/plan/createplan.c:7162 parser/parse_merge.c:203 rewrite/rewriteHandler.c:1695 +#, c-format +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘áƒáƒ–ე \"%s\" MERGE-ს ვერ გáƒáƒ£áƒ¨áƒ•ებთ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: optimizer/plan/initsplan.c:1407 +#, c-format +msgid "%s cannot be applied to the nullable side of an outer join" +msgstr "" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: optimizer/plan/planner.c:1380 parser/analyze.c:1771 parser/analyze.c:2029 parser/analyze.c:3247 +#, c-format +msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" +msgstr "%s áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ UNION/INTERSECT/EXCEPT-სთáƒáƒœ ერთáƒáƒ“" + +#: optimizer/plan/planner.c:2121 optimizer/plan/planner.c:4107 +#, c-format +msgid "could not implement GROUP BY" +msgstr "\"GROUP BY\"-ის გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებრშეუძლებელიáƒ" + +#: optimizer/plan/planner.c:2122 optimizer/plan/planner.c:4108 optimizer/plan/planner.c:4789 optimizer/prep/prepunion.c:1320 +#, c-format +msgid "Some of the datatypes only support hashing, while others only support sorting." +msgstr "ზáƒáƒ’იერთ მáƒáƒœáƒáƒªáƒ”მის ტიპს მხáƒáƒšáƒáƒ“ ჰეშირების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრგáƒáƒáƒ©áƒœáƒ˜áƒ, მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ სხვებს მხáƒáƒšáƒáƒ“ დáƒáƒšáƒáƒ’ებრშეუძლიáƒáƒ—." + +#: optimizer/plan/planner.c:4788 +#, c-format +msgid "could not implement DISTINCT" +msgstr "\"DISTINCT\"-ის გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებრშეუძლებელიáƒ" + +#: optimizer/plan/planner.c:6133 +#, c-format +msgid "could not implement window PARTITION BY" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡, \"PARTITION BY\" გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებრშეუძლებელიáƒ" + +#: optimizer/plan/planner.c:6134 +#, c-format +msgid "Window partitioning columns must be of sortable datatypes." +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ დáƒáƒ›áƒ§áƒáƒ¤áƒ˜ სვეტები დáƒáƒšáƒáƒ’ებáƒáƒ“ი მáƒáƒœáƒáƒªáƒ”მის ტიპის უნდრიყáƒáƒ¡." + +#: optimizer/plan/planner.c:6138 +#, c-format +msgid "could not implement window ORDER BY" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡, \"ORDER BY\" გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებრშეუძლებელიáƒ" + +#: optimizer/plan/planner.c:6139 +#, c-format +msgid "Window ordering columns must be of sortable datatypes." +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ დáƒáƒ›áƒšáƒáƒ’ებელი სვეტები დáƒáƒšáƒáƒ’ებáƒáƒ“ი მáƒáƒœáƒáƒªáƒ”მის ტიპის უნდრიყáƒáƒ¡." + +#: optimizer/prep/prepunion.c:467 +#, c-format +msgid "could not implement recursive UNION" +msgstr "რეკურსიული UNION_ის გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებრშეუძლებელიáƒ" + +#: optimizer/prep/prepunion.c:468 +#, c-format +msgid "All column datatypes must be hashable." +msgstr "ყველრსვეტის მáƒáƒœáƒáƒªáƒ”მის ტიპი ჰეშირებáƒáƒ“ი უნდრიყáƒáƒ¡." + +#. translator: %s is UNION, INTERSECT, or EXCEPT +#: optimizer/prep/prepunion.c:1319 +#, c-format +msgid "could not implement %s" +msgstr "ვერ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლდრ%s" + +#: optimizer/util/clauses.c:4951 +#, c-format +msgid "SQL function \"%s\" during inlining" +msgstr "SQL ფუნქცირ\"%s\" ხáƒáƒ–ში ჩáƒáƒ¡áƒ›áƒ˜áƒ¡áƒáƒ¡" + +#: optimizer/util/plancat.c:152 +#, c-format +msgid "cannot access temporary or unlogged relations during recovery" +msgstr "áƒáƒ¦áƒ“გენისáƒáƒ¡ დრáƒáƒ”ბით áƒáƒœ უჟურნáƒáƒšáƒ ურთიერთáƒáƒ‘ებთáƒáƒœ წვდáƒáƒ›áƒ შეუძლებელიáƒ" + +#: optimizer/util/plancat.c:756 +#, c-format +msgid "whole row unique index inference specifications are not supported" +msgstr "" + +#: optimizer/util/plancat.c:773 +#, c-format +msgid "constraint in ON CONFLICT clause has no associated index" +msgstr "შეზღუდვáƒáƒ¡ ON CONFLICT პირáƒáƒ‘áƒáƒ¨áƒ˜ áƒáƒ¡áƒáƒªáƒ˜áƒ áƒ”ბული ინდექსი áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: optimizer/util/plancat.c:823 +#, c-format +msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" +msgstr "ON CONFLICT DO UPDATE გáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒ•ის შეზღუდვებთáƒáƒœ ერთáƒáƒ“ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: optimizer/util/plancat.c:933 +#, c-format +msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" +msgstr "უნიკáƒáƒšáƒ£áƒ áƒ˜ áƒáƒœ გáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒ•ის შეზღუდვáƒ, რáƒáƒ›áƒ”ლიც ON CONFLICT-ის áƒáƒ¦áƒ¬áƒ”რáƒáƒ¡ ემთხვევáƒ, áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: parser/analyze.c:824 parser/analyze.c:1550 +#, c-format +msgid "VALUES lists must all be the same length" +msgstr "VALUES-ის სიები ყველრტáƒáƒšáƒ˜ სიგრძის უნდრიყáƒáƒ¡" + +#: parser/analyze.c:1027 +#, c-format +msgid "INSERT has more expressions than target columns" +msgstr "INSERT-ს მეტი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრგáƒáƒáƒ©áƒœáƒ˜áƒ, ვიდრე სáƒáƒ›áƒ˜áƒ–ნე სვეტი" + +#: parser/analyze.c:1045 +#, c-format +msgid "INSERT has more target columns than expressions" +msgstr "INSERT-ს მეტი სáƒáƒ›áƒ˜áƒ–ნე სვეტი გáƒáƒáƒ©áƒœáƒ˜áƒ, ვიდრე გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ" + +#: parser/analyze.c:1049 +#, c-format +msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" +msgstr "" + +#: parser/analyze.c:1357 parser/analyze.c:1744 +#, c-format +msgid "SELECT ... INTO is not allowed here" +msgstr "SELECT ... INTO áƒáƒ¥ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:1673 parser/analyze.c:3479 +#, c-format +msgid "%s cannot be applied to VALUES" +msgstr "%s-ს VALUES-ზე ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/analyze.c:1911 +#, c-format +msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ UNION/INTERSECT/EXCEPT ORDER BY პირáƒáƒ‘áƒ" + +#: parser/analyze.c:1912 +#, c-format +msgid "Only result column names can be used, not expressions or functions." +msgstr "" + +#: parser/analyze.c:1913 +#, c-format +msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." +msgstr "" + +#: parser/analyze.c:2019 +#, c-format +msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" +msgstr "" + +#: parser/analyze.c:2091 +#, c-format +msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" +msgstr "" + +#: parser/analyze.c:2178 +#, c-format +msgid "each %s query must have the same number of columns" +msgstr "ყáƒáƒ•ელ %s მáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ სვეტების ტáƒáƒšáƒ˜ რáƒáƒáƒ“ენáƒáƒ‘რუნდრჰქáƒáƒœáƒ“ეს" + +#: parser/analyze.c:2535 +#, c-format +msgid "SET target columns cannot be qualified with the relation name." +msgstr "" + +#: parser/analyze.c:2589 +#, c-format +msgid "RETURNING must have at least one column" +msgstr "RETURNING-ს ერთი სვეტი მáƒáƒ˜áƒœáƒª უნდრჰქáƒáƒœáƒ“ეს" + +#: parser/analyze.c:2692 +#, c-format +msgid "assignment source returned %d column" +msgid_plural "assignment source returned %d columns" +msgstr[0] "მინიჭების წყáƒáƒ áƒáƒ› %d სვეტი დáƒáƒáƒ‘რუნáƒ" +msgstr[1] "მინიჭების წყáƒáƒ áƒáƒ› %d სვეტი დáƒáƒáƒ‘რუნáƒ" + +#: parser/analyze.c:2753 +#, c-format +msgid "variable \"%s\" is of type %s but expression is of type %s" +msgstr "\"%s\" ცვლáƒáƒ“ის ტიპირ\"%s\", მáƒáƒ’რáƒáƒ› გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრ%s ტიპისáƒáƒ" + +#. translator: %s is a SQL keyword +#: parser/analyze.c:2878 parser/analyze.c:2886 +#, c-format +msgid "cannot specify both %s and %s" +msgstr "áƒáƒ áƒ˜áƒ•ე, %s დრ%s ერთáƒáƒ“ მითითებრშეუძლებელიáƒ" + +#: parser/analyze.c:2906 +#, c-format +msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" +msgstr "DECLARE CURSOR-ი WITH-ში მáƒáƒœáƒáƒªáƒ”მების შემცვლელ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებს áƒáƒ  უნდრშეიცáƒáƒ•დეს" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:2914 +#, c-format +msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" +msgstr "DECLARE CURSOR WITH HOLD ... %s მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: parser/analyze.c:2917 +#, c-format +msgid "Holdable cursors must be READ ONLY." +msgstr "შენáƒáƒ®áƒ•áƒáƒ“ი კურსáƒáƒ áƒ”ბი READ ONLY ტიპის უნდრიყáƒáƒ¡." + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:2925 +#, c-format +msgid "DECLARE SCROLL CURSOR ... %s is not supported" +msgstr "DECLARE SCROLL CURSOR ... %s მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:2936 +#, c-format +msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" +msgstr "DECLARE INSENSITIVE CURSOR ... %s áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: parser/analyze.c:2939 +#, c-format +msgid "Insensitive cursors must be READ ONLY." +msgstr "დáƒáƒ›áƒáƒ£áƒ™áƒ˜áƒ“ებელი კურსáƒáƒ áƒ”ბი READ ONLY ტიპის უნდრიყáƒáƒ¡." + +#: parser/analyze.c:3033 +#, c-format +msgid "materialized views must not use data-modifying statements in WITH" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებულმრხედებმრWITH-ში მáƒáƒœáƒáƒªáƒ”მების-შემცვლელი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბები áƒáƒ  უნდრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ" + +#: parser/analyze.c:3043 +#, c-format +msgid "materialized views must not use temporary tables or views" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებულმრხედებმრდრáƒáƒ”ბითი ცხრილები áƒáƒœ ხედები áƒáƒ  უნდრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ" + +#: parser/analyze.c:3053 +#, c-format +msgid "materialized views may not be defined using bound parameters" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედის áƒáƒ¦áƒ¬áƒ”რრმიმáƒáƒ’რებული პáƒáƒ áƒáƒ›áƒ”ტრების გáƒáƒ›áƒáƒ§áƒ”ნებით შეუძლებელიáƒ" + +#: parser/analyze.c:3065 +#, c-format +msgid "materialized views cannot be unlogged" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედების ჟურნáƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ áƒ—ვრშეუძლებელიáƒ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3254 +#, c-format +msgid "%s is not allowed with DISTINCT clause" +msgstr "%s-ი DISTINCT პირáƒáƒ‘áƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3261 +#, c-format +msgid "%s is not allowed with GROUP BY clause" +msgstr "%s-ი GROUP BY პირáƒáƒ‘áƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3268 +#, c-format +msgid "%s is not allowed with HAVING clause" +msgstr "%s-ი HAVING პირáƒáƒ‘áƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3275 +#, c-format +msgid "%s is not allowed with aggregate functions" +msgstr "%s áƒáƒ’რეგáƒáƒ¢áƒ£áƒš ფუნქციებთáƒáƒœ ერთáƒáƒ“ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3282 +#, c-format +msgid "%s is not allowed with window functions" +msgstr "%s ფáƒáƒœáƒ¯áƒ áƒ£áƒš ფუნქციებთáƒáƒœ ერთáƒáƒ“ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3289 +#, c-format +msgid "%s is not allowed with set-returning functions in the target list" +msgstr "%s სáƒáƒ›áƒ˜áƒ–ნეების სიáƒáƒ¨áƒ˜ სეტების-დáƒáƒ›áƒ‘რუნებელ ფუნქციებთáƒáƒœ ერთáƒáƒ“ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3388 +#, c-format +msgid "%s must specify unqualified relation names" +msgstr "" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3452 +#, c-format +msgid "%s cannot be applied to a join" +msgstr "%s join-ზე ვერ გáƒáƒ“áƒáƒ¢áƒáƒ áƒ“ებáƒ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3461 +#, c-format +msgid "%s cannot be applied to a function" +msgstr "%s ფუნქციáƒáƒ–ე ვერ გáƒáƒ“áƒáƒ¢áƒáƒ áƒ“ებáƒ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3470 +#, c-format +msgid "%s cannot be applied to a table function" +msgstr "%s ცხრილის ფუნქციáƒáƒ–ე ვერ გáƒáƒ“áƒáƒ¢áƒáƒ áƒ“ებáƒ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3488 +#, c-format +msgid "%s cannot be applied to a WITH query" +msgstr "%s WITH მáƒáƒ—ხáƒáƒ•ნáƒáƒ–ე ვერ გáƒáƒ“áƒáƒ¢áƒáƒ áƒ“ებáƒ" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3497 +#, c-format +msgid "%s cannot be applied to a named tuplestore" +msgstr "" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3517 +#, c-format +msgid "relation \"%s\" in %s clause not found in FROM clause" +msgstr "" + +#: parser/parse_agg.c:210 parser/parse_oper.c:215 +#, c-format +msgid "could not identify an ordering operator for type %s" +msgstr "ტიპისთვის %s დáƒáƒšáƒáƒ’ების áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ იდენტიფიკáƒáƒªáƒ˜áƒ შეუძლებელიáƒ" + +#: parser/parse_agg.c:212 +#, c-format +msgid "Aggregates with DISTINCT must be able to sort their inputs." +msgstr "DISTINCT-ის მქáƒáƒœáƒ” áƒáƒ’რეგáƒáƒ¢áƒ”ბს შეყვáƒáƒœáƒ˜áƒšáƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒšáƒáƒ’ებრთვითáƒáƒœ უნდრშეეძლáƒáƒ—." + +#: parser/parse_agg.c:270 +#, c-format +msgid "GROUPING must have fewer than 32 arguments" +msgstr "GROUPING-ის áƒáƒ áƒ’უმენტების რიცხვი 32-ზე ნáƒáƒ™áƒšáƒ”ბი უნდრიყáƒáƒ¡" + +#: parser/parse_agg.c:373 +msgid "aggregate functions are not allowed in JOIN conditions" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒš ფუნქციებს JOIN-ის პირáƒáƒ‘ებში ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_agg.c:375 +msgid "grouping operations are not allowed in JOIN conditions" +msgstr "დáƒáƒ¯áƒ’უფების áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბს JOIN-ის პირáƒáƒ‘ებში ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_agg.c:387 +msgid "aggregate functions are not allowed in FROM clause of their own query level" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები მáƒáƒ—ი სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ მáƒáƒ—ხáƒáƒ•ნის დáƒáƒœáƒ˜áƒ¡ FROM პირáƒáƒ‘áƒáƒ¨áƒ˜ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:389 +msgid "grouping operations are not allowed in FROM clause of their own query level" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები მáƒáƒ—ი სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ მáƒáƒ—ხáƒáƒ•ნის დáƒáƒœáƒ˜áƒ¡ FROM პირáƒáƒ‘áƒáƒ¨áƒ˜ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:394 +msgid "aggregate functions are not allowed in functions in FROM" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒš ფუნქციებს FROM-ში ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_agg.c:396 +msgid "grouping operations are not allowed in functions in FROM" +msgstr "დáƒáƒ¯áƒ’უფების áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბს FROM-ში ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_agg.c:404 +msgid "aggregate functions are not allowed in policy expressions" +msgstr "წესის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:406 +msgid "grouping operations are not allowed in policy expressions" +msgstr "წესის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში დáƒáƒ¯áƒ’უფების áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბი დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:423 +msgid "aggregate functions are not allowed in window RANGE" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ RANGE-ში áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:425 +msgid "grouping operations are not allowed in window RANGE" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ RANGE-ში დáƒáƒ¯áƒ’უფების áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბი დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:430 +msgid "aggregate functions are not allowed in window ROWS" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ROWS-ში áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:432 +msgid "grouping operations are not allowed in window ROWS" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ROWS_ში დáƒáƒ¯áƒ’უფების áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბი დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:437 +msgid "aggregate functions are not allowed in window GROUPS" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ GROUPS-ში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:439 +msgid "grouping operations are not allowed in window GROUPS" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ GROUPS-ში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:452 +msgid "aggregate functions are not allowed in MERGE WHEN conditions" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები MERGE WHEN-ის პირáƒáƒ‘ებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:454 +msgid "grouping operations are not allowed in MERGE WHEN conditions" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები MERGE WHEN-ის პირáƒáƒ‘ებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:481 +msgid "aggregate functions are not allowed in check constraints" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები შეზღუდვის შემáƒáƒ¬áƒ›áƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:483 +msgid "grouping operations are not allowed in check constraints" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები შეზღუდვის შემáƒáƒ¬áƒ›áƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:490 +msgid "aggregate functions are not allowed in DEFAULT expressions" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები DEFAULT გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:492 +msgid "grouping operations are not allowed in DEFAULT expressions" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები DEFAULT გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:497 +msgid "aggregate functions are not allowed in index expressions" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები ინდექსის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:499 +msgid "grouping operations are not allowed in index expressions" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები ინდექსის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:504 +msgid "aggregate functions are not allowed in index predicates" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები ინდექსის პრედიკáƒáƒ¢áƒ”ბში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:506 +msgid "grouping operations are not allowed in index predicates" +msgstr "დáƒáƒ¨áƒ•ებული ფუნქციები ინდექსის პრედიკáƒáƒ¢áƒ”ბში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:511 +msgid "aggregate functions are not allowed in statistics expressions" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:513 +msgid "grouping operations are not allowed in statistics expressions" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:518 +msgid "aggregate functions are not allowed in transform expressions" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:520 +msgid "grouping operations are not allowed in transform expressions" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:525 +msgid "aggregate functions are not allowed in EXECUTE parameters" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები EXECUTE-ის პáƒáƒ áƒáƒ›áƒ”ტრებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:527 +msgid "grouping operations are not allowed in EXECUTE parameters" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები EXECUTE-ის პáƒáƒ áƒáƒ›áƒ”ტრებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:532 +msgid "aggregate functions are not allowed in trigger WHEN conditions" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები WHEN-ის ტრიგერის პირáƒáƒ‘ებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:534 +msgid "grouping operations are not allowed in trigger WHEN conditions" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები WHEN-ის ტრიგერის პირáƒáƒ‘ებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:539 +msgid "aggregate functions are not allowed in partition bound" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ–ღვáƒáƒ áƒ¨áƒ˜ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:541 +msgid "grouping operations are not allowed in partition bound" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ–ღვáƒáƒ áƒ¨áƒ˜ დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:546 +msgid "aggregate functions are not allowed in partition key expressions" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:548 +msgid "grouping operations are not allowed in partition key expressions" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:554 +msgid "aggregate functions are not allowed in column generation expressions" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები სვეტის გენერáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:556 +msgid "grouping operations are not allowed in column generation expressions" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები სვეტის გენერáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:562 +msgid "aggregate functions are not allowed in CALL arguments" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები CALL-ის áƒáƒ áƒ’უმენტებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:564 +msgid "grouping operations are not allowed in CALL arguments" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები CALL-ის áƒáƒ áƒ’უმენტებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:570 +msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები COPY FROM WHERE პირáƒáƒ‘ებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:572 +msgid "grouping operations are not allowed in COPY FROM WHERE conditions" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები COPY FROM WHERE პირáƒáƒ‘ებში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#. translator: %s is name of a SQL construct, eg GROUP BY +#: parser/parse_agg.c:599 parser/parse_clause.c:1962 +#, c-format +msgid "aggregate functions are not allowed in %s" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციები %s-ში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#. translator: %s is name of a SQL construct, eg GROUP BY +#: parser/parse_agg.c:602 +#, c-format +msgid "grouping operations are not allowed in %s" +msgstr "დáƒáƒ¯áƒ’უფების ფუნქციები %s-ში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_agg.c:703 +#, c-format +msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" +msgstr "" + +#: parser/parse_agg.c:781 +#, c-format +msgid "aggregate function calls cannot contain set-returning function calls" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბები áƒáƒ  შეძლებáƒ, სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბებს შეიცáƒáƒ•დეს" + +#: parser/parse_agg.c:782 parser/parse_expr.c:1762 parser/parse_expr.c:2245 parser/parse_func.c:885 +#, c-format +msgid "You might be able to move the set-returning function into a LATERAL FROM item." +msgstr "" + +#: parser/parse_agg.c:787 +#, c-format +msgid "aggregate function calls cannot contain window function calls" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბები áƒáƒ  შეიძლებáƒ, ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბებს შეიცáƒáƒ•დეს" + +#: parser/parse_agg.c:866 +msgid "window functions are not allowed in JOIN conditions" +msgstr "\"JOIN\"-ის პირáƒáƒ‘ებში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:873 +msgid "window functions are not allowed in functions in FROM" +msgstr "\"FROM\"-ის ფუნქციებში ფáƒáƒœáƒ¯áƒ áƒ”ბის ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:879 +msgid "window functions are not allowed in policy expressions" +msgstr "წესების გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:892 +msgid "window functions are not allowed in window definitions" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რებში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:903 +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "\"MERGE WHEN\" პირáƒáƒ‘ებში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:928 +msgid "window functions are not allowed in check constraints" +msgstr "შეზღუდვის შემáƒáƒ¬áƒ›áƒ”ბáƒáƒ¨áƒ˜ ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:932 +msgid "window functions are not allowed in DEFAULT expressions" +msgstr "ნáƒáƒ’ულისხმევ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:935 +msgid "window functions are not allowed in index expressions" +msgstr "ინდექსის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:938 +msgid "window functions are not allowed in statistics expressions" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:941 +msgid "window functions are not allowed in index predicates" +msgstr "ინდექსის პრედიკáƒáƒ¢áƒ”ბში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:944 +msgid "window functions are not allowed in transform expressions" +msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:947 +msgid "window functions are not allowed in EXECUTE parameters" +msgstr "\"EXECUTE\"-ის პáƒáƒ áƒáƒ›áƒ”ტრებში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ\"" + +#: parser/parse_agg.c:950 +msgid "window functions are not allowed in trigger WHEN conditions" +msgstr "\"WHEN\"-ის პირáƒáƒ‘ების ტრიგერში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:953 +msgid "window functions are not allowed in partition bound" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ–ღვáƒáƒ áƒ¨áƒ˜ ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:956 +msgid "window functions are not allowed in partition key expressions" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:959 +msgid "window functions are not allowed in CALL arguments" +msgstr "\"CALL\"-ის áƒáƒ áƒ’უმენტებში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:962 +msgid "window functions are not allowed in COPY FROM WHERE conditions" +msgstr "\"COPY FROM WHERE\"-ის პირáƒáƒ‘ებში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_agg.c:965 +msgid "window functions are not allowed in column generation expressions" +msgstr "სვეტის გენერáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#. translator: %s is name of a SQL construct, eg GROUP BY +#: parser/parse_agg.c:988 parser/parse_clause.c:1971 +#, c-format +msgid "window functions are not allowed in %s" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციები áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ¨áƒ•ებული %s-ში" + +#: parser/parse_agg.c:1022 parser/parse_clause.c:2804 +#, c-format +msgid "window \"%s\" does not exist" +msgstr "ფáƒáƒœáƒ¯áƒáƒ áƒ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: parser/parse_agg.c:1110 +#, c-format +msgid "too many grouping sets present (maximum 4096)" +msgstr "ძáƒáƒšáƒ˜áƒáƒœ ბევრი დáƒáƒ¯áƒ’უფების ნáƒáƒ™áƒ áƒ”ბირ(მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› 4096)" + +#: parser/parse_agg.c:1250 +#, c-format +msgid "aggregate functions are not allowed in a recursive query's recursive term" +msgstr "" + +#: parser/parse_agg.c:1443 +#, c-format +msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" +msgstr "" + +#: parser/parse_agg.c:1446 +#, c-format +msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." +msgstr "" + +#: parser/parse_agg.c:1451 +#, c-format +msgid "subquery uses ungrouped column \"%s.%s\" from outer query" +msgstr "ქვემáƒáƒ—ხáƒáƒ•ნრouter მáƒáƒ—ხáƒáƒ•ნიდáƒáƒœ დáƒáƒ£áƒ¯áƒ’უფებელ სვეტს \"%s.%s\" იყენებს" + +#: parser/parse_agg.c:1615 +#, c-format +msgid "arguments to GROUPING must be grouping expressions of the associated query level" +msgstr "" + +#: parser/parse_clause.c:193 +#, c-format +msgid "relation \"%s\" cannot be the target of a modifying statement" +msgstr "ურთიერთáƒáƒ‘რ\"%s\" áƒáƒ  შეიძლებáƒ, შემცვლელი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის სáƒáƒ›áƒ˜áƒ–ნეს წáƒáƒ áƒ›áƒáƒáƒ“გენდეს" + +#: parser/parse_clause.c:569 parser/parse_clause.c:597 parser/parse_func.c:2553 +#, c-format +msgid "set-returning functions must appear at top level of FROM" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციები FROM-ის ზედრდáƒáƒœáƒ”ზე უნდრგáƒáƒ›áƒáƒ©áƒœáƒ“ნენ" + +#: parser/parse_clause.c:609 +#, c-format +msgid "multiple column definition lists are not allowed for the same function" +msgstr "იგივე ფუნქციისთვის ერთზე მეტი სვეტის áƒáƒ¦áƒ¬áƒ”რის სიები დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_clause.c:642 +#, c-format +msgid "ROWS FROM() with multiple functions cannot have a column definition list" +msgstr "ერთზე მეტი ფუნქციის მქáƒáƒœáƒ” ROW FROM ()-ს áƒáƒ  შეიძლებáƒ, სვეტის áƒáƒ¦áƒ¬áƒ”რების სირჰქáƒáƒœáƒ“ეს" + +#: parser/parse_clause.c:643 +#, c-format +msgid "Put a separate column definition list for each function inside ROWS FROM()." +msgstr "" + +#: parser/parse_clause.c:649 +#, c-format +msgid "UNNEST() with multiple arguments cannot have a column definition list" +msgstr "" + +#: parser/parse_clause.c:650 +#, c-format +msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." +msgstr "" + +#: parser/parse_clause.c:657 +#, c-format +msgid "WITH ORDINALITY cannot be used with a column definition list" +msgstr "WITH ORDINALITY სვეტების áƒáƒ¦áƒ¬áƒ”რის სიáƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“ áƒáƒ  უნდრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—" + +#: parser/parse_clause.c:658 +#, c-format +msgid "Put the column definition list inside ROWS FROM()." +msgstr "სვეტის áƒáƒ¦áƒ¬áƒ”რის სირROWS FROM()-ის შიგნით გáƒáƒ“áƒáƒ˜áƒ¢áƒáƒœáƒ”თ." + +#: parser/parse_clause.c:762 +#, c-format +msgid "only one FOR ORDINALITY column is allowed" +msgstr "დáƒáƒ¨áƒ•ებულირმხáƒáƒšáƒáƒ“ FOR ORDINALITY სვეტი" + +#: parser/parse_clause.c:823 +#, c-format +msgid "column name \"%s\" is not unique" +msgstr "სვეტის სáƒáƒ®áƒ”ლი \"%s\" áƒáƒ  áƒáƒ áƒ˜áƒ¡ უნიკáƒáƒšáƒ£áƒ áƒ˜" + +#: parser/parse_clause.c:865 +#, c-format +msgid "namespace name \"%s\" is not unique" +msgstr "სáƒáƒ®áƒ”ლების სივრცის სáƒáƒ®áƒ”ლი \"%s\" უნიკáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ áƒáƒ" + +#: parser/parse_clause.c:875 +#, c-format +msgid "only one default namespace is allowed" +msgstr "დáƒáƒ¡áƒáƒ¨áƒ•ებირმხáƒáƒšáƒáƒ“ ერთი ნáƒáƒ’ულისხმევი სáƒáƒ®áƒ”ლის სივრცე" + +#: parser/parse_clause.c:935 +#, c-format +msgid "tablesample method %s does not exist" +msgstr "" + +#: parser/parse_clause.c:957 +#, c-format +msgid "tablesample method %s requires %d argument, not %d" +msgid_plural "tablesample method %s requires %d arguments, not %d" +msgstr[0] "" +msgstr[1] "" + +#: parser/parse_clause.c:991 +#, c-format +msgid "tablesample method %s does not support REPEATABLE" +msgstr "" + +#: parser/parse_clause.c:1144 +#, c-format +msgid "TABLESAMPLE clause can only be applied to tables and materialized views" +msgstr "" + +#: parser/parse_clause.c:1331 +#, c-format +msgid "column name \"%s\" appears more than once in USING clause" +msgstr "პირáƒáƒ‘áƒáƒ¨áƒ˜ USIN სვეტის სáƒáƒ®áƒ”ლი \"%s\" ერთზე მეტჯერ გáƒáƒ›áƒáƒ©áƒœáƒ“áƒ" + +#: parser/parse_clause.c:1346 +#, c-format +msgid "common column name \"%s\" appears more than once in left table" +msgstr "სáƒáƒ”რთრსვეტის სáƒáƒ®áƒ”ლი \"%s\" ერთხელ, მáƒáƒ áƒªáƒ®áƒ”ნრცხრილში გáƒáƒ›áƒáƒ©áƒœáƒ“áƒ" + +#: parser/parse_clause.c:1355 +#, c-format +msgid "column \"%s\" specified in USING clause does not exist in left table" +msgstr "სვეტი \"%s\", რáƒáƒ›áƒ”ლიც USING პირáƒáƒ‘áƒáƒ¨áƒ˜áƒ მითითებული, მáƒáƒ áƒªáƒ®áƒ”ნრცხრილში áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: parser/parse_clause.c:1370 +#, c-format +msgid "common column name \"%s\" appears more than once in right table" +msgstr "სáƒáƒ”რთრსვეტის სáƒáƒ®áƒ”ლი \"%s\" ერთხელ, მáƒáƒ áƒ¯áƒ•ენრცხრილში გáƒáƒ›áƒáƒ©áƒœáƒ“áƒ" + +#: parser/parse_clause.c:1379 +#, c-format +msgid "column \"%s\" specified in USING clause does not exist in right table" +msgstr "სვეტი \"%s\", რáƒáƒ›áƒ”ლიც USING პირáƒáƒ‘áƒáƒ¨áƒ˜áƒ მითითებული, მáƒáƒ áƒ¯áƒ•ენრცხრილში áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: parser/parse_clause.c:1907 +#, c-format +msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" +msgstr "'FETCH FIRST ... WITH TIES' პირáƒáƒ‘áƒáƒ¨áƒ˜ მწკრივების რáƒáƒáƒ“ენáƒáƒ‘რნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" + +#. translator: %s is name of a SQL construct, eg LIMIT +#: parser/parse_clause.c:1932 +#, c-format +msgid "argument of %s must not contain variables" +msgstr "%s-ის áƒáƒ áƒ’უმენტი ცვლáƒáƒ“ებს áƒáƒ  უნდრშეიცáƒáƒ•დეს" + +#. translator: first %s is name of a SQL construct, eg ORDER BY +#: parser/parse_clause.c:2097 +#, c-format +msgid "%s \"%s\" is ambiguous" +msgstr "%s \"%s\" გáƒáƒ£áƒ áƒ™áƒ•ეველიáƒ" + +#. translator: %s is name of a SQL construct, eg ORDER BY +#: parser/parse_clause.c:2125 +#, c-format +msgid "non-integer constant in %s" +msgstr "áƒáƒ áƒ-მთელი რიცხვის კáƒáƒœáƒ¡áƒ¢áƒáƒœáƒ¢áƒ %s -ში" + +#. translator: %s is name of a SQL construct, eg ORDER BY +#: parser/parse_clause.c:2147 +#, c-format +msgid "%s position %d is not in select list" +msgstr "" + +#: parser/parse_clause.c:2586 +#, c-format +msgid "CUBE is limited to 12 elements" +msgstr "CUBE-ის ლიმიტირ12 ელემენტი" + +#: parser/parse_clause.c:2792 +#, c-format +msgid "window \"%s\" is already defined" +msgstr "ფáƒáƒœáƒ¯áƒáƒ áƒ \"%s\" უკვე გáƒáƒœáƒ¡áƒáƒ–ღვრულიáƒ" + +#: parser/parse_clause.c:2853 +#, c-format +msgid "cannot override PARTITION BY clause of window \"%s\"" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ \"%s\" 'PARTITION BY' პირáƒáƒ‘ის გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•რშეუძლებელიáƒ" + +#: parser/parse_clause.c:2865 +#, c-format +msgid "cannot override ORDER BY clause of window \"%s\"" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ \"%s\" 'ORDER BY' პირáƒáƒ‘ის გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•რშეუძლებელიáƒ" + +#: parser/parse_clause.c:2895 parser/parse_clause.c:2901 +#, c-format +msgid "cannot copy window \"%s\" because it has a frame clause" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ \"%s\" კáƒáƒžáƒ˜áƒ áƒ”ბრშეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ მáƒáƒ¡ ჩáƒáƒ áƒ©áƒáƒ¡ პირáƒáƒ‘რგáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: parser/parse_clause.c:2903 +#, c-format +msgid "Omit the parentheses in this OVER clause." +msgstr "" + +#: parser/parse_clause.c:2923 +#, c-format +msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" +msgstr "PRECEDING/FOLLOWING წáƒáƒœáƒáƒªáƒ•ლებების მქáƒáƒœáƒ” RANGE-ებს ზუსტáƒáƒ“ ერთი ORDER BY სვეტი უნდრგქáƒáƒœáƒ“ეთ" + +#: parser/parse_clause.c:2946 +#, c-format +msgid "GROUPS mode requires an ORDER BY clause" +msgstr "რეჟიმს 'GROUPS' 'ORDER BY' პირáƒáƒ‘რსჭირდებáƒ" + +#: parser/parse_clause.c:3016 +#, c-format +msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ¨áƒ˜ áƒáƒ áƒ’უმენტების სიáƒáƒ¨áƒ˜ DISTINCT დრORDER BY გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბების ქáƒáƒœáƒ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: parser/parse_clause.c:3017 +#, c-format +msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" +msgstr "" + +#: parser/parse_clause.c:3049 +#, c-format +msgid "an aggregate with DISTINCT must have at least one argument" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ¡, რáƒáƒ›áƒ”ლსáƒáƒª DISTINCT áƒáƒ¥áƒ•ს, ერთი áƒáƒ áƒ’უმენტი მáƒáƒ˜áƒœáƒª უნდრჰქáƒáƒœáƒ“ეს" + +#: parser/parse_clause.c:3050 +#, c-format +msgid "SELECT DISTINCT must have at least one column" +msgstr "SELECT DISTINCT-ს ერთი სვეტი მáƒáƒ˜áƒœáƒª უნდრჰქáƒáƒœáƒ“ეს" + +#: parser/parse_clause.c:3116 parser/parse_clause.c:3148 +#, c-format +msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" +msgstr "SELECT DISTINCT ON ტიპის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბები სáƒáƒ¬áƒ§áƒ˜áƒ¡ ORDER BY გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებს უნდრემთხვეáƒáƒ“ეს" + +#: parser/parse_clause.c:3226 +#, c-format +msgid "ASC/DESC is not allowed in ON CONFLICT clause" +msgstr "ASC/DESC პირáƒáƒ‘áƒáƒ–ე ON CONFLICT დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_clause.c:3232 +#, c-format +msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" +msgstr "NULLS FIRST/LAST პირáƒáƒ‘áƒáƒ–ე ON CONFLICT დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_clause.c:3311 +#, c-format +msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" +msgstr "" + +#: parser/parse_clause.c:3312 +#, c-format +msgid "For example, ON CONFLICT (column_name)." +msgstr "მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, ON CONFLICT (column_name)." + +#: parser/parse_clause.c:3323 +#, c-format +msgid "ON CONFLICT is not supported with system catalog tables" +msgstr "ON CONFLICT სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ის ცხრილებთáƒáƒœ ერთáƒáƒ“ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: parser/parse_clause.c:3331 +#, c-format +msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" +msgstr "კáƒáƒ¢áƒáƒšáƒáƒ’ის ცხრილáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული ცხრილზე \"%s\" ბრძáƒáƒœáƒ”ბრON CONFLICT მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: parser/parse_clause.c:3462 +#, c-format +msgid "operator %s is not a valid ordering operator" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ %s სწáƒáƒ áƒ˜ დáƒáƒ›áƒšáƒáƒ’ებელი áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ áƒáƒ áƒáƒ" + +#: parser/parse_clause.c:3464 +#, c-format +msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." +msgstr "" + +#: parser/parse_clause.c:3775 +#, c-format +msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" +msgstr "" + +#: parser/parse_clause.c:3781 +#, c-format +msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" +msgstr "" + +#: parser/parse_clause.c:3784 +#, c-format +msgid "Cast the offset value to an appropriate type." +msgstr "წáƒáƒœáƒáƒªáƒ•ლების მნიშვნელáƒáƒ‘ის დáƒáƒ›áƒáƒ™áƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ”ბელ ტიპში დáƒáƒ™áƒáƒ¡áƒ¢áƒ•áƒ." + +#: parser/parse_clause.c:3789 +#, c-format +msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" +msgstr "" + +#: parser/parse_clause.c:3792 +#, c-format +msgid "Cast the offset value to the exact intended type." +msgstr "წáƒáƒœáƒáƒªáƒ•ლების მნიშვნელáƒáƒ‘ის ზუსტáƒáƒ“ გáƒáƒœáƒ¡áƒáƒ–ღვრულ ტიპში დáƒáƒ™áƒáƒ¡áƒ¢áƒ•áƒ." + +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 parser/parse_expr.c:2146 parser/parse_expr.c:2754 parser/parse_expr.c:3403 parser/parse_expr.c:3624 parser/parse_expr.c:4388 parser/parse_target.c:998 +#, c-format +msgid "cannot cast type %s to %s" +msgstr "%s ტიპის %s-ში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ" + +#: parser/parse_coerce.c:1091 +#, c-format +msgid "Input has too few columns." +msgstr "შეყვáƒáƒœáƒáƒ¡ ძáƒáƒšáƒ˜áƒáƒœ ცáƒáƒ¢áƒ სვეტი áƒáƒ¥áƒ•ს." + +#: parser/parse_coerce.c:1109 +#, c-format +msgid "Cannot cast type %s to %s in column %d." +msgstr "%3$d სვეტში %1$s ტიპის დáƒáƒ™áƒáƒ¡áƒ¢áƒ•რტიპáƒáƒ›áƒ“ე %2$s შეუძლებელიáƒ." + +#: parser/parse_coerce.c:1124 +#, c-format +msgid "Input has too many columns." +msgstr "შეყვáƒáƒœáƒáƒ¡ ძáƒáƒšáƒ˜áƒáƒœ ბევრი სვეტი áƒáƒ¥áƒ•ს." + +#. translator: first %s is name of a SQL construct, eg WHERE +#. translator: first %s is name of a SQL construct, eg LIMIT +#: parser/parse_coerce.c:1179 parser/parse_coerce.c:1227 +#, c-format +msgid "argument of %s must be type %s, not type %s" +msgstr "%s-ის áƒáƒ áƒ’უმენტის ტიპი %s უნდრიყáƒáƒ¡ დრáƒáƒ áƒ %s" + +#. translator: %s is name of a SQL construct, eg WHERE +#. translator: %s is name of a SQL construct, eg LIMIT +#: parser/parse_coerce.c:1190 parser/parse_coerce.c:1239 +#, c-format +msgid "argument of %s must not return a set" +msgstr "%s-ის áƒáƒ áƒ’უმენტმრსეტი áƒáƒ  უნდრდáƒáƒáƒ‘რუნáƒáƒ¡" + +#. translator: first %s is name of a SQL construct, eg CASE +#: parser/parse_coerce.c:1383 +#, c-format +msgid "%s types %s and %s cannot be matched" +msgstr "%s-ის ტიპები %s დრ%s áƒáƒ  შეიძლებáƒ, ერთმáƒáƒœáƒ”თს ემთხვეáƒáƒ“ეს" + +#: parser/parse_coerce.c:1499 +#, c-format +msgid "argument types %s and %s cannot be matched" +msgstr "áƒáƒ áƒ’უმენტის ტიპებს %s დრ%s სáƒáƒ”რთრáƒáƒ áƒáƒ¤áƒ”რი გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—" + +#. translator: first %s is name of a SQL construct, eg CASE +#: parser/parse_coerce.c:1551 +#, c-format +msgid "%s could not convert type %s to %s" +msgstr "%s-მრტიპი %s-დáƒáƒœ %s-ში ვერ გáƒáƒ“áƒáƒ˜áƒ§áƒ•áƒáƒœáƒ" + +#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 +#, c-format +msgid "arguments declared \"%s\" are not all alike" +msgstr "\"%s\"-áƒáƒ“ áƒáƒ¦áƒ¬áƒ”რილი áƒáƒ áƒ’უმენტები ყველრერთნáƒáƒ˜áƒ áƒ˜ áƒáƒ áƒáƒ" + +#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 utils/fmgr/funcapi.c:600 +#, c-format +msgid "argument declared %s is not an array but type %s" +msgstr "\"%s\"-áƒáƒ“ áƒáƒ¦áƒ¬áƒ”რილი áƒáƒ áƒ’უმენტი მáƒáƒ¡áƒ˜áƒ•ი áƒáƒ áƒáƒ, მáƒáƒ’რáƒáƒ› მისი ტიპირ%s" + +#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 utils/fmgr/funcapi.c:614 +#, c-format +msgid "argument declared %s is not a range type but type %s" +msgstr "\"%s\"-áƒáƒ“ áƒáƒ¦áƒ¬áƒ”რილი áƒáƒ áƒ’უმენტი დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ მáƒáƒ’იერ áƒáƒ áƒ˜áƒ¡ %s" + +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 +#, c-format +msgid "argument declared %s is not a multirange type but type %s" +msgstr "\"%s\"-áƒáƒ“ áƒáƒ¦áƒ¬áƒ”რილი áƒáƒ áƒ’უმენტი მრáƒáƒ•áƒáƒšáƒ“იáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ მáƒáƒ’იერ áƒáƒ áƒ˜áƒ¡ %s" + +#: parser/parse_coerce.c:2353 +#, c-format +msgid "cannot determine element type of \"anyarray\" argument" +msgstr "\"anyarray\" áƒáƒ áƒ’უმენტის ტიპის დáƒáƒ“გენრშეუძლებელიáƒ" + +#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 +#, c-format +msgid "argument declared %s is not consistent with argument declared %s" +msgstr "" + +#: parser/parse_coerce.c:2474 +#, c-format +msgid "could not determine polymorphic type because input has type %s" +msgstr "" + +#: parser/parse_coerce.c:2488 +#, c-format +msgid "type matched to anynonarray is an array type: %s" +msgstr "ტიპი, რáƒáƒ›áƒ”ლიც anytoarray-ს ემთხვევáƒ, მáƒáƒ¡áƒ˜áƒ•ის ტიპისáƒáƒ: %s" + +#: parser/parse_coerce.c:2498 +#, c-format +msgid "type matched to anyenum is not an enum type: %s" +msgstr "ტიპი, რáƒáƒ›áƒ”ლიც anytoenum-ს ემთხვევáƒ, ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜áƒ¡ ტიპის áƒáƒ áƒáƒ: %s" + +#: parser/parse_coerce.c:2559 +#, c-format +msgid "arguments of anycompatible family cannot be cast to a common type" +msgstr "" + +#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 +#, c-format +msgid "could not determine polymorphic type %s because input has type %s" +msgstr "" + +#: parser/parse_coerce.c:2587 +#, c-format +msgid "anycompatiblerange type %s does not match anycompatible type %s" +msgstr "" + +#: parser/parse_coerce.c:2608 +#, c-format +msgid "anycompatiblemultirange type %s does not match anycompatible type %s" +msgstr "" + +#: parser/parse_coerce.c:2622 +#, c-format +msgid "type matched to anycompatiblenonarray is an array type: %s" +msgstr "" + +#: parser/parse_coerce.c:2857 +#, c-format +msgid "A result of type %s requires at least one input of type anyrange or anymultirange." +msgstr "" + +#: parser/parse_coerce.c:2874 +#, c-format +msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." +msgstr "" + +#: parser/parse_coerce.c:2886 +#, c-format +msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." +msgstr "" + +#: parser/parse_coerce.c:2898 +#, c-format +msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." +msgstr "" + +#: parser/parse_coerce.c:2928 +msgid "A result of type internal requires at least one input of type internal." +msgstr "" + +#: parser/parse_collate.c:228 parser/parse_collate.c:475 parser/parse_collate.c:1005 +#, c-format +msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" +msgstr "" + +#: parser/parse_collate.c:231 parser/parse_collate.c:478 parser/parse_collate.c:1008 +#, c-format +msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." +msgstr "" + +#: parser/parse_collate.c:855 +#, c-format +msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" +msgstr "" + +#: parser/parse_cte.c:46 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within its non-recursive term" +msgstr "" + +#: parser/parse_cte.c:48 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within a subquery" +msgstr "" + +#: parser/parse_cte.c:50 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within an outer join" +msgstr "" + +#: parser/parse_cte.c:52 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within INTERSECT" +msgstr "" + +#: parser/parse_cte.c:54 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within EXCEPT" +msgstr "" + +#: parser/parse_cte.c:136 +#, c-format +msgid "WITH query name \"%s\" specified more than once" +msgstr "WITH მáƒáƒ—ხáƒáƒ•ნის სáƒáƒ®áƒ”ლი \"%s\" ერთზე მეტჯერáƒáƒ მითითებული" + +#: parser/parse_cte.c:308 +#, c-format +msgid "could not identify an inequality operator for type %s" +msgstr "" + +#: parser/parse_cte.c:335 +#, c-format +msgid "WITH clause containing a data-modifying statement must be at the top level" +msgstr "WITH პირáƒáƒ‘ის შემცველი მáƒáƒœáƒáƒªáƒ”მების-შემცვლელი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრუმáƒáƒ¦áƒšáƒ”ს დáƒáƒœáƒ”ზე უნდრიიყáƒáƒ¡" + +#: parser/parse_cte.c:384 +#, c-format +msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" +msgstr "" + +#: parser/parse_cte.c:390 +#, c-format +msgid "Cast the output of the non-recursive term to the correct type." +msgstr "" + +#: parser/parse_cte.c:395 +#, c-format +msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" +msgstr "" + +#: parser/parse_cte.c:399 +#, c-format +msgid "Use the COLLATE clause to set the collation of the non-recursive term." +msgstr "" + +#: parser/parse_cte.c:420 +#, c-format +msgid "WITH query is not recursive" +msgstr "WITH მáƒáƒ—ხáƒáƒ•ნრრეკურსიული áƒáƒ áƒáƒ" + +#: parser/parse_cte.c:451 +#, c-format +msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" +msgstr "" + +#: parser/parse_cte.c:456 +#, c-format +msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" +msgstr "" + +#: parser/parse_cte.c:471 +#, c-format +msgid "search column \"%s\" not in WITH query column list" +msgstr "ძებნის სვეტი \"%s\" WITH მáƒáƒ—ხáƒáƒ•ნის სვეტების სიáƒáƒ¨áƒ˜ áƒáƒ áƒáƒ" + +#: parser/parse_cte.c:478 +#, c-format +msgid "search column \"%s\" specified more than once" +msgstr "ძებნის სვეტი \"%s\" ერთზე მეტჯერáƒáƒ მითითებული" + +#: parser/parse_cte.c:487 +#, c-format +msgid "search sequence column name \"%s\" already used in WITH query column list" +msgstr "" + +#: parser/parse_cte.c:504 +#, c-format +msgid "cycle column \"%s\" not in WITH query column list" +msgstr "ციკლის სვეტი \"%s\" WITH მáƒáƒ—ხáƒáƒ•ნის სვეტების სიáƒáƒ¨áƒ˜ áƒáƒ áƒáƒ" + +#: parser/parse_cte.c:511 +#, c-format +msgid "cycle column \"%s\" specified more than once" +msgstr "ციკლის სვეტი \"%s\" ერთზემეტჯერáƒáƒ მითითებული" + +#: parser/parse_cte.c:520 +#, c-format +msgid "cycle mark column name \"%s\" already used in WITH query column list" +msgstr "" + +#: parser/parse_cte.c:527 +#, c-format +msgid "cycle path column name \"%s\" already used in WITH query column list" +msgstr "" + +#: parser/parse_cte.c:535 +#, c-format +msgid "cycle mark column name and cycle path column name are the same" +msgstr "" + +#: parser/parse_cte.c:545 +#, c-format +msgid "search sequence column name and cycle mark column name are the same" +msgstr "" + +#: parser/parse_cte.c:552 +#, c-format +msgid "search sequence column name and cycle path column name are the same" +msgstr "" + +#: parser/parse_cte.c:636 +#, c-format +msgid "WITH query \"%s\" has %d columns available but %d columns specified" +msgstr "" + +#: parser/parse_cte.c:816 +#, c-format +msgid "mutual recursion between WITH items is not implemented" +msgstr "\"WITH\"-ის ჩáƒáƒœáƒáƒ¬áƒ”რებს შáƒáƒ áƒ˜áƒ¡ ურთიერთრეკურსირმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: parser/parse_cte.c:868 +#, c-format +msgid "recursive query \"%s\" must not contain data-modifying statements" +msgstr "" + +#: parser/parse_cte.c:876 +#, c-format +msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" +msgstr "" + +#: parser/parse_cte.c:920 +#, c-format +msgid "ORDER BY in a recursive query is not implemented" +msgstr "რეკურსიულ მáƒáƒ—ხáƒáƒ•ნáƒáƒ¨áƒ˜ ORDER BY გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: parser/parse_cte.c:926 +#, c-format +msgid "OFFSET in a recursive query is not implemented" +msgstr "რეკურსიულ მáƒáƒ—ხáƒáƒ•ნáƒáƒ¨áƒ˜ OFFSET გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: parser/parse_cte.c:932 +#, c-format +msgid "LIMIT in a recursive query is not implemented" +msgstr "რეკურსიულ მáƒáƒ—ხáƒáƒ•ნáƒáƒ¨áƒ˜ LIMIT გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: parser/parse_cte.c:938 +#, c-format +msgid "FOR UPDATE/SHARE in a recursive query is not implemented" +msgstr "რეკურსიულ მáƒáƒ—ხáƒáƒ•ნáƒáƒ¨áƒ˜ FOR UPDATE/SHARE გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: parser/parse_cte.c:995 +#, c-format +msgid "recursive reference to query \"%s\" must not appear more than once" +msgstr "" + +#: parser/parse_expr.c:314 +#, c-format +msgid "DEFAULT is not allowed in this context" +msgstr "áƒáƒ› კáƒáƒœáƒ¢áƒ”ქსტში ნáƒáƒ’ულისხმევს ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:407 parser/parse_relation.c:3691 parser/parse_relation.c:3701 parser/parse_relation.c:3719 parser/parse_relation.c:3726 parser/parse_relation.c:3740 +#, c-format +msgid "column %s.%s does not exist" +msgstr "სვეტი %s.%s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: parser/parse_expr.c:419 +#, c-format +msgid "column \"%s\" not found in data type %s" +msgstr "სვეტი \"%s\" მáƒáƒœáƒáƒªáƒ”მის ტიპში %s áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ" + +#: parser/parse_expr.c:425 +#, c-format +msgid "could not identify column \"%s\" in record data type" +msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის მáƒáƒœáƒáƒªáƒ”მის ტიპში სვეტის \"%s\" იდენტიფიკáƒáƒªáƒ˜áƒ შეუძლებელიáƒ" + +#: parser/parse_expr.c:431 +#, c-format +msgid "column notation .%s applied to type %s, which is not a composite type" +msgstr "" + +#: parser/parse_expr.c:462 parser/parse_target.c:732 +#, c-format +msgid "row expansion via \"*\" is not supported here" +msgstr "" + +#: parser/parse_expr.c:585 +msgid "cannot use column reference in DEFAULT expression" +msgstr "" + +#: parser/parse_expr.c:588 +msgid "cannot use column reference in partition bound expression" +msgstr "" + +#: parser/parse_expr.c:847 parser/parse_relation.c:833 parser/parse_relation.c:915 parser/parse_target.c:1238 +#, c-format +msgid "column reference \"%s\" is ambiguous" +msgstr "სვეტის მითითებრ\"%s\" áƒáƒ áƒáƒ–რáƒáƒ•áƒáƒœáƒ˜áƒ" + +#: parser/parse_expr.c:903 parser/parse_param.c:110 parser/parse_param.c:142 parser/parse_param.c:204 parser/parse_param.c:303 +#, c-format +msgid "there is no parameter $%d" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი $%d áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: parser/parse_expr.c:1103 +#, c-format +msgid "NULLIF requires = operator to yield boolean" +msgstr "" + +#. translator: %s is name of a SQL construct, eg NULLIF +#: parser/parse_expr.c:1109 parser/parse_expr.c:3070 +#, c-format +msgid "%s must not return a set" +msgstr "%s -მრსეტი áƒáƒ  უნდრდáƒáƒáƒ‘რუნáƒáƒ¡" + +#: parser/parse_expr.c:1395 +#, c-format +msgid "MERGE_ACTION() can only be used in the RETURNING list of a MERGE command" +msgstr "" + +#: parser/parse_expr.c:1519 parser/parse_expr.c:1551 +#, c-format +msgid "number of columns does not match number of values" +msgstr "" + +#: parser/parse_expr.c:1565 +#, c-format +msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" +msgstr "" + +#. translator: %s is name of a SQL construct, eg GROUP BY +#: parser/parse_expr.c:1760 parser/parse_expr.c:2243 parser/parse_func.c:2679 +#, c-format +msgid "set-returning functions are not allowed in %s" +msgstr "%s-ში სეტის-დáƒáƒ›áƒ‘რუნებელი ფუნქციები დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_expr.c:1824 +msgid "cannot use subquery in check constraint" +msgstr "შეზღუდვის შემმáƒáƒ¬áƒ›áƒ”ბელში ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:1828 +msgid "cannot use subquery in DEFAULT expression" +msgstr "ნáƒáƒ’ულისხმევ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨áƒ˜ ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:1831 +msgid "cannot use subquery in index expression" +msgstr "ინდექსის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨áƒ˜ ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:1834 +msgid "cannot use subquery in index predicate" +msgstr "ინდექსის პრედიკáƒáƒ¢áƒ¨áƒ˜ ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:1837 +msgid "cannot use subquery in statistics expression" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨áƒ˜ ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:1840 +msgid "cannot use subquery in transform expression" +msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨áƒ˜ ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:1843 +msgid "cannot use subquery in EXECUTE parameter" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრში \"EXECUTE\" ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:1846 +msgid "cannot use subquery in trigger WHEN condition" +msgstr "\"WHEN\" პირáƒáƒ‘ის ტრიგერში ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:1849 +msgid "cannot use subquery in partition bound" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ–ღვáƒáƒ áƒ¨áƒ˜ ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:1852 +msgid "cannot use subquery in partition key expression" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨áƒ˜ ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:1855 +msgid "cannot use subquery in CALL argument" +msgstr "\"CALL\"-ის áƒáƒ áƒ’უმენტში ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:1858 +msgid "cannot use subquery in COPY FROM WHERE condition" +msgstr "\"COPY FROM WHERE\" პირáƒáƒ‘áƒáƒ¨áƒ˜ ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:1861 +msgid "cannot use subquery in column generation expression" +msgstr "სვეტების გენერáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨áƒ˜ ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:1914 parser/parse_expr.c:3756 +#, c-format +msgid "subquery must return only one column" +msgstr "ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ› მხáƒáƒšáƒáƒ“ ერთი სვეტი უნდრდáƒáƒáƒ‘რუნáƒáƒ¡" + +#: parser/parse_expr.c:1985 +#, c-format +msgid "subquery has too many columns" +msgstr "ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ძáƒáƒšáƒ˜áƒáƒœ ბევრი სვეტი áƒáƒ¥áƒ•ს" + +#: parser/parse_expr.c:1990 +#, c-format +msgid "subquery has too few columns" +msgstr "ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ ძáƒáƒšáƒ˜áƒáƒœ ცáƒáƒ¢áƒ სვეტი áƒáƒ¥áƒ•ს" + +#: parser/parse_expr.c:2086 +#, c-format +msgid "cannot determine type of empty array" +msgstr "ცáƒáƒ áƒ˜áƒ”ლი მáƒáƒ¡áƒ˜áƒ•ის ტიპის დáƒáƒ“გენრშეუძლებელიáƒ" + +#: parser/parse_expr.c:2087 +#, c-format +msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." +msgstr "" + +#: parser/parse_expr.c:2101 +#, c-format +msgid "could not find element type for data type %s" +msgstr "" + +#: parser/parse_expr.c:2184 +#, c-format +msgid "ROW expressions can have at most %d entries" +msgstr "ROW გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებს მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› %d ელემენტი შეიძლებრჰქáƒáƒœáƒ“ეს" + +#: parser/parse_expr.c:2389 +#, c-format +msgid "unnamed XML attribute value must be a column reference" +msgstr "უსáƒáƒ®áƒ”ლრXML áƒáƒ¢áƒ áƒ˜áƒ‘უტის მნიშვნელáƒáƒ‘რსვეტის მიმáƒáƒ áƒ—ვáƒáƒ¡ უნდრწáƒáƒ áƒ›áƒáƒáƒ“გენდეს" + +#: parser/parse_expr.c:2390 +#, c-format +msgid "unnamed XML element value must be a column reference" +msgstr "უსáƒáƒ®áƒ”ლრXML ელემენტის მნიშვნელáƒáƒ‘რსვეტის მიმáƒáƒ áƒ—ვáƒáƒ¡ უნდრწáƒáƒ áƒ›áƒáƒáƒ“გენდეს" + +#: parser/parse_expr.c:2405 +#, c-format +msgid "XML attribute name \"%s\" appears more than once" +msgstr "XML áƒáƒ¢áƒ áƒ˜áƒ‘უტის სáƒáƒ®áƒ”ლი \"%s\" ერთზე მეტჯერ გáƒáƒ›áƒáƒ©áƒœáƒ“áƒ" + +#: parser/parse_expr.c:2513 +#, c-format +msgid "cannot cast XMLSERIALIZE result to %s" +msgstr "'XMLSERIALIZE'-ის შედეგის %s-ში დáƒáƒ™áƒáƒ¡áƒ¢áƒ•რშეუძლებელიáƒ" + +#: parser/parse_expr.c:2827 parser/parse_expr.c:3023 +#, c-format +msgid "unequal number of entries in row expressions" +msgstr "მწკრივის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში ჩáƒáƒœáƒáƒ¬áƒ”რების რáƒáƒáƒ“ენáƒáƒ‘რტáƒáƒšáƒ˜ áƒáƒ áƒáƒ" + +#: parser/parse_expr.c:2837 +#, c-format +msgid "cannot compare rows of zero length" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ სიგრძის მწკრივების შედáƒáƒ áƒ”ბრშეუძლებელიáƒ" + +#: parser/parse_expr.c:2862 +#, c-format +msgid "row comparison operator must yield type boolean, not type %s" +msgstr "მწკრივის შედáƒáƒ áƒ”ბის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ›áƒ ლáƒáƒ’იკური მნიშვნელáƒáƒ‘რუნდრდáƒáƒáƒ‘რუნáƒáƒ¡ დრáƒáƒ áƒ ტიპი %s" + +#: parser/parse_expr.c:2869 +#, c-format +msgid "row comparison operator must not return a set" +msgstr "მწკრივის შედáƒáƒ áƒ”ბის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ›áƒ სეტი áƒáƒ  უნდრდáƒáƒáƒ‘რუნáƒáƒ¡" + +#: parser/parse_expr.c:2928 parser/parse_expr.c:2969 +#, c-format +msgid "could not determine interpretation of row comparison operator %s" +msgstr "მწკრივის შედáƒáƒ áƒ”ბის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ %s ინტერპრეტáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ“გენრშეუძლებელიáƒ" + +#: parser/parse_expr.c:2930 +#, c-format +msgid "Row comparison operators must be associated with btree operator families." +msgstr "მწკრივის შედáƒáƒ áƒ”ბის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბი ბინáƒáƒ áƒ£áƒšáƒ˜ ხის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ”ბთáƒáƒœ უნდრიყáƒáƒ¡ áƒáƒ¡áƒáƒªáƒ˜áƒ áƒ”ბული." + +#: parser/parse_expr.c:2971 +#, c-format +msgid "There are multiple equally-plausible candidates." +msgstr "" + +#: parser/parse_expr.c:3064 +#, c-format +msgid "IS DISTINCT FROM requires = operator to yield boolean" +msgstr "IS DISTINCT FROM-ს სჭირდებáƒ, რáƒáƒ› áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ '=' ლáƒáƒ’იკურ მნიშვნელáƒáƒ‘áƒáƒ¡ áƒáƒ‘რუნებდეს" + +#: parser/parse_expr.c:3304 +#, c-format +msgid "JSON ENCODING clause is only allowed for bytea input type" +msgstr "" + +#: parser/parse_expr.c:3368 +#, c-format +msgid "cannot use non-string types with implicit FORMAT JSON clause" +msgstr "" + +#: parser/parse_expr.c:3369 +#, c-format +msgid "cannot use non-string types with explicit FORMAT JSON clause" +msgstr "" + +#: parser/parse_expr.c:3458 +#, c-format +msgid "cannot use JSON format with non-string output types" +msgstr "'JSON' ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ áƒáƒ áƒ-სტრიქáƒáƒœáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ტიპებთáƒáƒœ ერთáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: parser/parse_expr.c:3471 +#, c-format +msgid "cannot set JSON encoding for non-bytea output types" +msgstr "" + +#: parser/parse_expr.c:3476 +#, c-format +msgid "unsupported JSON encoding" +msgstr "\"JSON\"-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒ“ირებáƒ" + +#: parser/parse_expr.c:3477 +#, c-format +msgid "Only UTF8 JSON encoding is supported." +msgstr "მხáƒáƒ áƒ“áƒáƒ­áƒ”რილირმხáƒáƒšáƒáƒ“ UTF8 JSON კáƒáƒ“ირებáƒ." + +#: parser/parse_expr.c:3514 +#, c-format +msgid "returning SETOF types is not supported in SQL/JSON functions" +msgstr "" + +#: parser/parse_expr.c:3519 +#, c-format +msgid "returning pseudo-types is not supported in SQL/JSON functions" +msgstr "ფსევდáƒáƒ¢áƒ˜áƒžáƒ”ბის დáƒáƒ‘რუნებრSQL/JSON ფუნქციებში მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: parser/parse_expr.c:3841 parser/parse_func.c:866 +#, c-format +msgid "aggregate ORDER BY is not implemented for window functions" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციებისთვის áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ORDER BY გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: parser/parse_expr.c:4063 +#, c-format +msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" +msgstr "" + +#: parser/parse_expr.c:4083 +#, c-format +msgid "cannot use type %s in IS JSON predicate" +msgstr "%s ტიპის IS JSON პრედიკáƒáƒ¢áƒ¨áƒ˜ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: parser/parse_expr.c:4109 parser/parse_expr.c:4229 +#, c-format +msgid "cannot use RETURNING type %s in %s" +msgstr "'RETURNING'-ის ტიპს '%s' %s-ში ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_expr.c:4158 +#, c-format +msgid "cannot use non-string types with WITH UNIQUE KEYS clause" +msgstr "" + +#: parser/parse_expr.c:4232 +#, c-format +msgid "Try returning a string type or bytea." +msgstr "" + +#: parser/parse_expr.c:4297 +#, c-format +msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" +msgstr "" + +#: parser/parse_expr.c:4309 +#, c-format +msgid "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" +msgstr "" + +#: parser/parse_expr.c:4336 +#, c-format +msgid "JSON path expression must be of type %s, not of type %s" +msgstr "JSON ბილიკის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ტიპი %s უნდრიყáƒáƒ¡ დრáƒáƒ áƒ %s" + +#: parser/parse_expr.c:4677 +#, c-format +msgid "can only specify a constant, non-aggregate function, or operator expression for DEFAULT" +msgstr "" + +#: parser/parse_expr.c:4682 +#, c-format +msgid "DEFAULT expression must not contain column references" +msgstr "DEFAULT გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრსვეტზე მიმáƒáƒ áƒ—ვებს áƒáƒ  უნდრშეიცáƒáƒ•დეს" + +#: parser/parse_expr.c:4687 +#, c-format +msgid "DEFAULT expression must not return a set" +msgstr "DEFAULT გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ› სეტი áƒáƒ  უნდრდáƒáƒáƒ‘რუნáƒáƒ¡" + +#: parser/parse_expr.c:4721 +#, c-format +msgid "cannot cast behavior expression of type %s to %s" +msgstr "%s ქცევის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ტიპის %s-ში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ" + +#: parser/parse_func.c:194 +#, c-format +msgid "argument name \"%s\" used more than once" +msgstr "áƒáƒ áƒ’უმენტის სáƒáƒ®áƒ”ლი \"%s\" ერთზე მეტჯერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: parser/parse_func.c:205 +#, c-format +msgid "positional argument cannot follow named argument" +msgstr "" + +#: parser/parse_func.c:287 parser/parse_func.c:2368 +#, c-format +msgid "%s is not a procedure" +msgstr "%s áƒáƒ  áƒáƒ áƒ˜áƒ¡ პრáƒáƒªáƒ”დურáƒ" + +#: parser/parse_func.c:291 +#, c-format +msgid "To call a function, use SELECT." +msgstr "ფუნქციის გáƒáƒ›áƒáƒ¡áƒáƒ«áƒáƒ®áƒ”ბლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ SELECT." + +#: parser/parse_func.c:297 +#, c-format +msgid "%s is a procedure" +msgstr "\"%s\" პრáƒáƒªáƒ”დურáƒáƒ" + +#: parser/parse_func.c:301 +#, c-format +msgid "To call a procedure, use CALL." +msgstr "პრáƒáƒªáƒ”დურის გáƒáƒ›áƒáƒ¡áƒáƒ«áƒáƒ®áƒ”ბლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ CALL." + +#: parser/parse_func.c:315 +#, c-format +msgid "%s(*) specified, but %s is not an aggregate function" +msgstr "%s(*) მითითებულიáƒ, მáƒáƒ’რáƒáƒ› %s áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქცირáƒáƒ áƒáƒ" + +#: parser/parse_func.c:322 +#, c-format +msgid "DISTINCT specified, but %s is not an aggregate function" +msgstr "DISTINCT მითითებულიáƒ, მáƒáƒ’რáƒáƒ› %s áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქცირáƒáƒ áƒáƒ" + +#: parser/parse_func.c:328 +#, c-format +msgid "WITHIN GROUP specified, but %s is not an aggregate function" +msgstr "WITHIN GROUP მითითებულიáƒ, მáƒáƒ’რáƒáƒ› %s áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქცირáƒáƒ áƒáƒ" + +#: parser/parse_func.c:334 +#, c-format +msgid "ORDER BY specified, but %s is not an aggregate function" +msgstr "ORDER BY მითითებულიáƒ, მáƒáƒ’რáƒáƒ› %s áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქცირáƒáƒ áƒáƒ" + +#: parser/parse_func.c:340 +#, c-format +msgid "FILTER specified, but %s is not an aggregate function" +msgstr "FILTER მითითებულიáƒ, მáƒáƒ’რáƒáƒ› %s áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქცირáƒáƒ áƒáƒ" + +#: parser/parse_func.c:346 +#, c-format +msgid "OVER specified, but %s is not a window function nor an aggregate function" +msgstr "" + +#: parser/parse_func.c:384 +#, c-format +msgid "WITHIN GROUP is required for ordered-set aggregate %s" +msgstr "" + +#: parser/parse_func.c:390 +#, c-format +msgid "OVER is not supported for ordered-set aggregate %s" +msgstr "" + +#: parser/parse_func.c:421 parser/parse_func.c:452 +#, c-format +msgid "There is an ordered-set aggregate %s, but it requires %d direct argument, not %d." +msgid_plural "There is an ordered-set aggregate %s, but it requires %d direct arguments, not %d." +msgstr[0] "" +msgstr[1] "" + +#: parser/parse_func.c:479 +#, c-format +msgid "To use the hypothetical-set aggregate %s, the number of hypothetical direct arguments (here %d) must match the number of ordering columns (here %d)." +msgstr "" + +#: parser/parse_func.c:493 +#, c-format +msgid "There is an ordered-set aggregate %s, but it requires at least %d direct argument." +msgid_plural "There is an ordered-set aggregate %s, but it requires at least %d direct arguments." +msgstr[0] "" +msgstr[1] "" + +#: parser/parse_func.c:514 +#, c-format +msgid "%s is not an ordered-set aggregate, so it cannot have WITHIN GROUP" +msgstr "" + +#: parser/parse_func.c:527 +#, c-format +msgid "window function %s requires an OVER clause" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციáƒáƒ¡ %s პირáƒáƒ‘რOVER ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ" + +#: parser/parse_func.c:534 +#, c-format +msgid "window function %s cannot have WITHIN GROUP" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციáƒáƒ¡ '%s' 'WITHIN GROUP' ვერ ექნებáƒ" + +#: parser/parse_func.c:563 +#, c-format +msgid "procedure %s is not unique" +msgstr "პრáƒáƒªáƒ”დურრუნიკáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ áƒáƒ: %s" + +#: parser/parse_func.c:566 +#, c-format +msgid "Could not choose a best candidate procedure. You might need to add explicit type casts." +msgstr "" + +#: parser/parse_func.c:572 +#, c-format +msgid "function %s is not unique" +msgstr "ფუნქცირუნიკáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ áƒáƒ: %s" + +#: parser/parse_func.c:575 +#, c-format +msgid "Could not choose a best candidate function. You might need to add explicit type casts." +msgstr "" + +#: parser/parse_func.c:614 +#, c-format +msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." +msgstr "" + +#: parser/parse_func.c:622 parser/parse_func.c:2411 +#, c-format +msgid "procedure %s does not exist" +msgstr "პრáƒáƒªáƒ”დურრ%s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: parser/parse_func.c:625 +#, c-format +msgid "No procedure matches the given name and argument types. You might need to add explicit type casts." +msgstr "" + +#: parser/parse_func.c:634 +#, c-format +msgid "No function matches the given name and argument types. You might need to add explicit type casts." +msgstr "" + +#: parser/parse_func.c:736 +#, c-format +msgid "VARIADIC argument must be an array" +msgstr "VARIADIC -ის áƒáƒ áƒ’უმენტი მáƒáƒ¡áƒ˜áƒ•ი უნდრიყáƒáƒ¡" + +#: parser/parse_func.c:791 parser/parse_func.c:856 +#, c-format +msgid "%s(*) must be used to call a parameterless aggregate function" +msgstr "უპáƒáƒ áƒáƒ›áƒ”ტრრáƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციის გáƒáƒ›áƒáƒ¡áƒáƒ«áƒáƒ®áƒ”ბელáƒáƒ“ %s(*) უნდრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—" + +#: parser/parse_func.c:798 +#, c-format +msgid "aggregates cannot return sets" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ”ბს სეტების დáƒáƒ‘რუნებრáƒáƒ  შეუძლიáƒáƒ—" + +#: parser/parse_func.c:813 +#, c-format +msgid "aggregates cannot use named arguments" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ”ბი სáƒáƒ®áƒ”ლიáƒáƒœ áƒáƒ áƒ’უმენტებს ვერ იყენებენ" + +#: parser/parse_func.c:846 +#, c-format +msgid "DISTINCT is not implemented for window functions" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციებისთვის DISTINCT გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: parser/parse_func.c:875 +#, c-format +msgid "FILTER is not implemented for non-aggregate window functions" +msgstr "áƒáƒ áƒáƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციებისთვის FILTER გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: parser/parse_func.c:884 +#, c-format +msgid "window function calls cannot contain set-returning function calls" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბები áƒáƒ  შეიძლებáƒ, სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბებს შეიცáƒáƒ•დეს" + +#: parser/parse_func.c:892 +#, c-format +msgid "window functions cannot return sets" +msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციებს სეტების დáƒáƒ‘რუნებრáƒáƒ  შეუძლიáƒáƒ—" + +#: parser/parse_func.c:2167 parser/parse_func.c:2440 +#, c-format +msgid "could not find a function named \"%s\"" +msgstr "ფუნქცირსáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: parser/parse_func.c:2181 parser/parse_func.c:2458 +#, c-format +msgid "function name \"%s\" is not unique" +msgstr "ფუნქციის სáƒáƒ®áƒ”ლი უნიკáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ áƒáƒ: %s" + +#: parser/parse_func.c:2183 parser/parse_func.c:2461 +#, c-format +msgid "Specify the argument list to select the function unambiguously." +msgstr "" + +#: parser/parse_func.c:2227 +#, c-format +msgid "procedures cannot have more than %d argument" +msgid_plural "procedures cannot have more than %d arguments" +msgstr[0] "პრáƒáƒªáƒ”დურáƒáƒ¡ %d-ზე მეტი áƒáƒ áƒ’უმენტი ვერ ექნებáƒ" +msgstr[1] "პრáƒáƒªáƒ”დურáƒáƒ¡ %d-ზე მეტი áƒáƒ áƒ’უმენტი ვერ ექნებáƒ" + +#: parser/parse_func.c:2358 +#, c-format +msgid "%s is not a function" +msgstr "%s áƒáƒ  áƒáƒ áƒ˜áƒ¡ ფუნქციáƒ" + +#: parser/parse_func.c:2378 +#, c-format +msgid "function %s is not an aggregate" +msgstr "ფუნქცირ%s áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒ’რეგáƒáƒ¢áƒ˜" + +#: parser/parse_func.c:2406 +#, c-format +msgid "could not find a procedure named \"%s\"" +msgstr "პრáƒáƒªáƒ”დურრსáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: parser/parse_func.c:2420 +#, c-format +msgid "could not find an aggregate named \"%s\"" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜ სáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: parser/parse_func.c:2425 +#, c-format +msgid "aggregate %s(*) does not exist" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜ %s (*) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: parser/parse_func.c:2430 +#, c-format +msgid "aggregate %s does not exist" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜ %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: parser/parse_func.c:2466 +#, c-format +msgid "procedure name \"%s\" is not unique" +msgstr "პრáƒáƒªáƒ”დურის სáƒáƒ®áƒ”ლი უნიკáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ áƒáƒ: %s" + +#: parser/parse_func.c:2469 +#, c-format +msgid "Specify the argument list to select the procedure unambiguously." +msgstr "" + +#: parser/parse_func.c:2474 +#, c-format +msgid "aggregate name \"%s\" is not unique" +msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი უნიკáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ áƒáƒ: %s" + +#: parser/parse_func.c:2477 +#, c-format +msgid "Specify the argument list to select the aggregate unambiguously." +msgstr "" + +#: parser/parse_func.c:2482 +#, c-format +msgid "routine name \"%s\" is not unique" +msgstr "ქვეპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი უნიკáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ áƒáƒ: %s" + +#: parser/parse_func.c:2485 +#, c-format +msgid "Specify the argument list to select the routine unambiguously." +msgstr "" + +#: parser/parse_func.c:2540 +msgid "set-returning functions are not allowed in JOIN conditions" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების JOIN-ის პირáƒáƒ‘ებში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2561 +msgid "set-returning functions are not allowed in policy expressions" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების წესების გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის პირáƒáƒ‘ებში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2577 +msgid "set-returning functions are not allowed in window definitions" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რებში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2615 +msgid "set-returning functions are not allowed in MERGE WHEN conditions" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების MERGE WHEN-ის პირáƒáƒ‘ებში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2619 +msgid "set-returning functions are not allowed in check constraints" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების შეზღუდვების შემმáƒáƒ¬áƒ›áƒ”ბელში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2623 +msgid "set-returning functions are not allowed in DEFAULT expressions" +msgstr "ფუნქციები, რáƒáƒ›áƒšáƒ”ბიც სეტებს áƒáƒ‘რუნებენ, DEFAULT გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: parser/parse_func.c:2626 +msgid "set-returning functions are not allowed in index expressions" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების ინდექსის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨áƒ˜ გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2629 +msgid "set-returning functions are not allowed in index predicates" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების ინდექსის პრედიკáƒáƒ¢áƒ”ბში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2632 +msgid "set-returning functions are not allowed in statistics expressions" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2635 +msgid "set-returning functions are not allowed in transform expressions" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2638 +msgid "set-returning functions are not allowed in EXECUTE parameters" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების EXECUTE-ის პáƒáƒ áƒáƒ›áƒ”ტრებში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2641 +msgid "set-returning functions are not allowed in trigger WHEN conditions" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების WHEN-ის ტრიგერში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2644 +msgid "set-returning functions are not allowed in partition bound" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ–ღვáƒáƒ áƒ¨áƒ˜ გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2647 +msgid "set-returning functions are not allowed in partition key expressions" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2650 +msgid "set-returning functions are not allowed in CALL arguments" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების CALL-ის áƒáƒ áƒ’უმენტებში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2653 +msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების COPY FROM WHERE-ის პირáƒáƒ‘ებში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_func.c:2656 +msgid "set-returning functions are not allowed in column generation expressions" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი ფუნქციების სვეტების გენერáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებში გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: parser/parse_jsontable.c:94 +#, c-format +msgid "invalid ON ERROR behavior" +msgstr "\"ON UPDATE\"-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ქცევáƒ" + +#: parser/parse_jsontable.c:95 +#, c-format +msgid "Only EMPTY or ERROR is allowed in the top-level ON ERROR clause." +msgstr "" + +#: parser/parse_jsontable.c:189 parser/parse_jsontable.c:203 +#, c-format +msgid "duplicate JSON_TABLE column or path name: %s" +msgstr "დუბლირებული JSON_TABLE სვეტის áƒáƒœ ბილიკის სáƒáƒ®áƒ”ლი: %s" + +#: parser/parse_jsontable.c:295 +#, c-format +msgid "cannot use more than one FOR ORDINALITY column" +msgstr "ერთზე მეტ FOR ORDINALITY სვეტს ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_merge.c:129 +#, c-format +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "MERGE გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბისთვის WITH RECURSIVE მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: parser/parse_merge.c:176 +#, c-format +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "" + +#: parser/parse_merge.c:222 +#, c-format +msgid "name \"%s\" specified more than once" +msgstr "სáƒáƒ®áƒ”ლი ერთზე მეტჯერáƒáƒ მითითებული: %s" + +#: parser/parse_merge.c:224 +#, c-format +msgid "The name is used both as MERGE target table and data source." +msgstr "სáƒáƒ®áƒ”ლი გáƒáƒ›áƒáƒ§áƒ”ნებულირáƒáƒ áƒ˜áƒ•ე, რáƒáƒ’áƒáƒ áƒª MERGE-ის სáƒáƒ›áƒ˜áƒ–ნე ცხრილის, ისე მáƒáƒœáƒáƒªáƒ”მების წყáƒáƒ áƒáƒ¡ სáƒáƒ®áƒ˜áƒ—." + +#: parser/parse_node.c:82 +#, c-format +msgid "target lists can have at most %d entries" +msgstr "სáƒáƒ›áƒ˜áƒ–ნე სიáƒáƒ¨áƒ˜ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› %d ჩáƒáƒœáƒáƒ¬áƒ”რი შეიძლებრიყáƒáƒ¡" + +#: parser/parse_oper.c:114 parser/parse_oper.c:678 +#, c-format +msgid "postfix operators are not supported" +msgstr "პáƒáƒ¡áƒ¢áƒ¤áƒ˜áƒ¥áƒ¡áƒ£áƒ áƒ˜ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბი მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: parser/parse_oper.c:217 +#, c-format +msgid "Use an explicit ordering operator or modify the query." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ áƒáƒ¨áƒ™áƒáƒ áƒ დáƒáƒšáƒáƒ’ების áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ áƒáƒœ შეცვáƒáƒšáƒ”თ მáƒáƒ—ხáƒáƒ•ნáƒ." + +#: parser/parse_oper.c:473 +#, c-format +msgid "operator requires run-time type coercion: %s" +msgstr "" + +#: parser/parse_oper.c:629 +#, c-format +msgid "operator is not unique: %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ უნიკáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ áƒáƒ: %s" + +#: parser/parse_oper.c:631 +#, c-format +msgid "Could not choose a best candidate operator. You might need to add explicit type casts." +msgstr "" + +#: parser/parse_oper.c:640 +#, c-format +msgid "No operator matches the given name and argument type. You might need to add an explicit type cast." +msgstr "" + +#: parser/parse_oper.c:642 +#, c-format +msgid "No operator matches the given name and argument types. You might need to add explicit type casts." +msgstr "" + +#: parser/parse_oper.c:803 +#, c-format +msgid "op ANY/ALL (array) requires array on right side" +msgstr "" + +#: parser/parse_oper.c:844 +#, c-format +msgid "op ANY/ALL (array) requires operator to yield boolean" +msgstr "" + +#: parser/parse_oper.c:849 +#, c-format +msgid "op ANY/ALL (array) requires operator not to return a set" +msgstr "" + +#: parser/parse_param.c:221 +#, c-format +msgid "inconsistent types deduced for parameter $%d" +msgstr "" + +#: parser/parse_param.c:309 tcop/postgres.c:740 +#, c-format +msgid "could not determine data type of parameter $%d" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრისთვის $%d მáƒáƒœáƒáƒªáƒ”მის ტიპის გáƒáƒœáƒ¡áƒáƒ–ღვრრშეუძლებელიáƒ" + +#: parser/parse_relation.c:221 +#, c-format +msgid "table reference \"%s\" is ambiguous" +msgstr "" + +#: parser/parse_relation.c:265 +#, c-format +msgid "table reference %u is ambiguous" +msgstr "" + +#: parser/parse_relation.c:465 +#, c-format +msgid "table name \"%s\" specified more than once" +msgstr "" + +#: parser/parse_relation.c:494 parser/parse_relation.c:3633 parser/parse_relation.c:3642 +#, c-format +msgid "invalid reference to FROM-clause entry for table \"%s\"" +msgstr "" + +#: parser/parse_relation.c:498 parser/parse_relation.c:3644 +#, c-format +msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." +msgstr "" + +#: parser/parse_relation.c:500 +#, c-format +msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." +msgstr "" + +#: parser/parse_relation.c:703 +#, c-format +msgid "system column \"%s\" reference in check constraint is invalid" +msgstr "" + +#: parser/parse_relation.c:712 +#, c-format +msgid "cannot use system column \"%s\" in column generation expression" +msgstr "სვეტის გენერáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¨áƒ˜ სისტემურ სვეტს \"%s\" ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_relation.c:723 +#, c-format +msgid "cannot use system column \"%s\" in MERGE WHEN condition" +msgstr "'MERGE WHEN' პირáƒáƒ‘áƒáƒ¨áƒ˜ სისტემურ სვეტს \"%s\" ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_relation.c:1236 parser/parse_relation.c:1691 parser/parse_relation.c:2384 +#, c-format +msgid "table \"%s\" has %d columns available but %d columns specified" +msgstr "" + +#: parser/parse_relation.c:1445 +#, c-format +msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." +msgstr "" + +#: parser/parse_relation.c:1447 +#, c-format +msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." +msgstr "" + +#: parser/parse_relation.c:1833 +#, c-format +msgid "a column definition list is redundant for a function with OUT parameters" +msgstr "" + +#: parser/parse_relation.c:1839 +#, c-format +msgid "a column definition list is redundant for a function returning a named composite type" +msgstr "" + +#: parser/parse_relation.c:1846 +#, c-format +msgid "a column definition list is only allowed for functions returning \"record\"" +msgstr "" + +#: parser/parse_relation.c:1857 +#, c-format +msgid "a column definition list is required for functions returning \"record\"" +msgstr "" + +#: parser/parse_relation.c:1894 +#, c-format +msgid "column definition lists can have at most %d entries" +msgstr "სვეტის áƒáƒ¦áƒ¬áƒ”რის სიებს მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› %d ჩáƒáƒœáƒáƒ¬áƒ”რი შეიძლებრჰქáƒáƒœáƒ“ეს" + +#: parser/parse_relation.c:1954 +#, c-format +msgid "function \"%s\" in FROM has unsupported return type %s" +msgstr "" + +#: parser/parse_relation.c:1981 parser/parse_relation.c:2066 +#, c-format +msgid "functions in FROM can return at most %d columns" +msgstr "ფუნქციებს FROM-შ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› %d სვეტის დáƒáƒ‘რუნებრშეუძლიáƒáƒ—" + +#: parser/parse_relation.c:2096 +#, c-format +msgid "%s function has %d columns available but %d columns specified" +msgstr "ფუნქციáƒáƒ¡ %s %d სვეტი ჰქáƒáƒœáƒ“რხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜, მითითებული კი %d" + +#: parser/parse_relation.c:2177 +#, c-format +msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" +msgstr "" + +#: parser/parse_relation.c:2242 +#, c-format +msgid "joins can have at most %d columns" +msgstr "შეერთებებს მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› %d სვეტი შეიძლებáƒ, ჰქáƒáƒœáƒ“ეთ" + +#: parser/parse_relation.c:2267 +#, c-format +msgid "join expression \"%s\" has %d columns available but %d columns specified" +msgstr "" + +#: parser/parse_relation.c:2357 +#, c-format +msgid "WITH query \"%s\" does not have a RETURNING clause" +msgstr "WITH მáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ \"%s\" RETURNING პირáƒáƒ‘რáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: parser/parse_relation.c:3635 +#, c-format +msgid "Perhaps you meant to reference the table alias \"%s\"." +msgstr "" + +#: parser/parse_relation.c:3647 +#, c-format +msgid "To reference that table, you must mark this subquery with LATERAL." +msgstr "" + +#: parser/parse_relation.c:3653 +#, c-format +msgid "missing FROM-clause entry for table \"%s\"" +msgstr "" + +#: parser/parse_relation.c:3693 +#, c-format +msgid "There are columns named \"%s\", but they are in tables that cannot be referenced from this part of the query." +msgstr "" + +#: parser/parse_relation.c:3695 +#, c-format +msgid "Try using a table-qualified name." +msgstr "" + +#: parser/parse_relation.c:3703 +#, c-format +msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." +msgstr "" + +#: parser/parse_relation.c:3706 +#, c-format +msgid "To reference that column, you must mark this subquery with LATERAL." +msgstr "" + +#: parser/parse_relation.c:3708 +#, c-format +msgid "To reference that column, you must use a table-qualified name." +msgstr "" + +#: parser/parse_relation.c:3728 +#, c-format +msgid "Perhaps you meant to reference the column \"%s.%s\"." +msgstr "" + +#: parser/parse_relation.c:3742 +#, c-format +msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." +msgstr "" + +#: parser/parse_target.c:480 parser/parse_target.c:795 +#, c-format +msgid "cannot assign to system column \"%s\"" +msgstr "სისტემური სვეტზე (%s) მინიჭებრშეუძლებელიáƒ" + +#: parser/parse_target.c:508 +#, c-format +msgid "cannot set an array element to DEFAULT" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის ელემენტების DEFAULT-ზე დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: parser/parse_target.c:513 +#, c-format +msgid "cannot set a subfield to DEFAULT" +msgstr "ქვეველის DEFAULT მნიშვნელáƒáƒ‘ის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ" + +#: parser/parse_target.c:587 +#, c-format +msgid "column \"%s\" is of type %s but expression is of type %s" +msgstr "" + +#: parser/parse_target.c:779 +#, c-format +msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" +msgstr "" + +#: parser/parse_target.c:788 +#, c-format +msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" +msgstr "" + +#: parser/parse_target.c:877 +#, c-format +msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" +msgstr "" + +#: parser/parse_target.c:887 +#, c-format +msgid "subfield \"%s\" is of type %s but expression is of type %s" +msgstr "" + +#: parser/parse_target.c:1327 +#, c-format +msgid "SELECT * with no tables specified is not valid" +msgstr "" + +#: parser/parse_type.c:100 +#, c-format +msgid "improper %%TYPE reference (too few dotted names): %s" +msgstr "" + +#: parser/parse_type.c:122 +#, c-format +msgid "improper %%TYPE reference (too many dotted names): %s" +msgstr "" + +#: parser/parse_type.c:157 +#, c-format +msgid "type reference %s converted to %s" +msgstr "ტიპის მიმáƒáƒ áƒ—ვრ%s გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜áƒ %s-ში" + +#: parser/parse_type.c:278 parser/parse_type.c:813 utils/cache/typcache.c:397 utils/cache/typcache.c:452 +#, c-format +msgid "type \"%s\" is only a shell" +msgstr "ტიპი \"%s\" მხáƒáƒšáƒáƒ“ გáƒáƒ áƒ¡áƒ˜áƒ" + +#: parser/parse_type.c:363 +#, c-format +msgid "type modifier is not allowed for type \"%s\"" +msgstr "ტიპის მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ˜ ტიპისთვის \"%s\" დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: parser/parse_type.c:409 +#, c-format +msgid "type modifiers must be simple constants or identifiers" +msgstr "ტიპის მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ”ბის მáƒáƒ áƒ¢áƒ˜áƒ•ი შეზღუდვები áƒáƒœ იდენტიფიკáƒáƒ¢áƒáƒ áƒ”ბი უნდრიყáƒáƒ¡" + +#: parser/parse_type.c:723 parser/parse_type.c:773 +#, c-format +msgid "invalid type name \"%s\"" +msgstr "ტიპის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\"" + +#: parser/parse_utilcmd.c:266 +#, c-format +msgid "cannot create partitioned table as inheritance child" +msgstr "" + +#: parser/parse_utilcmd.c:586 +#, c-format +msgid "array of serial is not implemented" +msgstr "სერიáƒáƒšáƒ”ბის მáƒáƒ¡áƒ˜áƒ•ი გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:665 parser/parse_utilcmd.c:677 parser/parse_utilcmd.c:736 +#, c-format +msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:689 +#, c-format +msgid "multiple default values specified for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:706 +#, c-format +msgid "identity columns are not supported on typed tables" +msgstr "ტიპიზირებულ ცხრილებზე იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტები მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:710 +#, c-format +msgid "identity columns are not supported on partitions" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბზე იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტები მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:719 +#, c-format +msgid "multiple identity specifications for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:749 +#, c-format +msgid "generated columns are not supported on typed tables" +msgstr "ტიპიზირებულ ცხრილებზე გენერირებული სვეტები მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:753 +#, c-format +msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:771 parser/parse_utilcmd.c:886 +#, c-format +msgid "primary key constraints are not supported on foreign tables" +msgstr "ძირითáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვები გáƒáƒ áƒ” ცხრილებზე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:780 parser/parse_utilcmd.c:896 +#, c-format +msgid "unique constraints are not supported on foreign tables" +msgstr "გáƒáƒ áƒ” ცხრილებზე უნიკáƒáƒšáƒ£áƒ áƒ˜ შეზღუდვები მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:825 +#, c-format +msgid "both default and identity specified for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:833 +#, c-format +msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:841 +#, c-format +msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" +msgstr "" + +#: parser/parse_utilcmd.c:906 +#, c-format +msgid "exclusion constraints are not supported on foreign tables" +msgstr "" + +#: parser/parse_utilcmd.c:971 +#, c-format +msgid "LIKE is not supported for creating foreign tables" +msgstr "გáƒáƒ áƒ” ცხრილების შექმნისთვის LIKE მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:984 +#, c-format +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "პირáƒáƒ‘áƒáƒ¨áƒ˜ LIKE ურთიერთáƒáƒ‘რ\"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: parser/parse_utilcmd.c:1711 parser/parse_utilcmd.c:1819 +#, c-format +msgid "Index \"%s\" contains a whole-row table reference." +msgstr "" + +#: parser/parse_utilcmd.c:2217 +#, c-format +msgid "cannot use an existing index in CREATE TABLE" +msgstr "'CREATE TABLE'-ში áƒáƒ áƒ¡áƒ”ბულ ინდექსს ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_utilcmd.c:2237 +#, c-format +msgid "index \"%s\" is already associated with a constraint" +msgstr "ინდექსი \"%s\" შეზღუდვáƒáƒ¡áƒ—áƒáƒœ უკვე áƒáƒ¡áƒáƒªáƒ˜áƒ áƒ”ბულიáƒ" + +#: parser/parse_utilcmd.c:2258 +#, c-format +msgid "\"%s\" is not a unique index" +msgstr "\"%s\" უნიკáƒáƒšáƒ£áƒ áƒ˜ ინდექსი áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:2259 parser/parse_utilcmd.c:2266 parser/parse_utilcmd.c:2273 parser/parse_utilcmd.c:2350 +#, c-format +msgid "Cannot create a primary key or unique constraint using such an index." +msgstr "" + +#: parser/parse_utilcmd.c:2265 +#, c-format +msgid "index \"%s\" contains expressions" +msgstr "ინდექსი \"%s\" გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებს შეიცáƒáƒ•ს" + +#: parser/parse_utilcmd.c:2272 +#, c-format +msgid "\"%s\" is a partial index" +msgstr "\"%s\" ნáƒáƒ¬áƒ˜áƒšáƒáƒ‘რივი ინდექსიáƒ" + +#: parser/parse_utilcmd.c:2284 +#, c-format +msgid "\"%s\" is a deferrable index" +msgstr "\"%s\" გáƒáƒ“áƒáƒ“ებáƒáƒ“ი ინდექსიáƒ" + +#: parser/parse_utilcmd.c:2285 +#, c-format +msgid "Cannot create a non-deferrable constraint using a deferrable index." +msgstr "" + +#: parser/parse_utilcmd.c:2349 +#, c-format +msgid "index \"%s\" column number %d does not have default sorting behavior" +msgstr "" + +#: parser/parse_utilcmd.c:2506 +#, c-format +msgid "column \"%s\" appears twice in primary key constraint" +msgstr "" + +#: parser/parse_utilcmd.c:2512 +#, c-format +msgid "column \"%s\" appears twice in unique constraint" +msgstr "" + +#: parser/parse_utilcmd.c:2846 +#, c-format +msgid "index expressions and predicates can refer only to the table being indexed" +msgstr "" + +#: parser/parse_utilcmd.c:2918 +#, c-format +msgid "statistics expressions can refer only to the table being referenced" +msgstr "" + +#: parser/parse_utilcmd.c:2961 +#, c-format +msgid "rules on materialized views are not supported" +msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებულ ხედებზე წესები მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:3021 +#, c-format +msgid "rule WHERE condition cannot contain references to other relations" +msgstr "" + +#: parser/parse_utilcmd.c:3093 +#, c-format +msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" +msgstr "" + +#: parser/parse_utilcmd.c:3111 parser/parse_utilcmd.c:3212 rewrite/rewriteHandler.c:537 rewrite/rewriteManip.c:1095 +#, c-format +msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" +msgstr "პირáƒáƒ‘ითი UNION/INTERSECT/EXCEPT áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბი გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:3129 +#, c-format +msgid "ON SELECT rule cannot use OLD" +msgstr "ON SELECT წესში OLD-ს ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_utilcmd.c:3133 +#, c-format +msgid "ON SELECT rule cannot use NEW" +msgstr "ON SELECT წესში NEW-ს ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_utilcmd.c:3142 +#, c-format +msgid "ON INSERT rule cannot use OLD" +msgstr "ON INSERT წესში OLD-ს ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_utilcmd.c:3148 +#, c-format +msgid "ON DELETE rule cannot use NEW" +msgstr "ON DELETE წესში NEW-ს ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: parser/parse_utilcmd.c:3176 +#, c-format +msgid "cannot refer to OLD within WITH query" +msgstr "'WITH' მáƒáƒ—ხáƒáƒ•ნáƒáƒ¨áƒ˜ OLD-ზე მიმáƒáƒ áƒ—ვრშეუძლებელიáƒ" + +#: parser/parse_utilcmd.c:3183 +#, c-format +msgid "cannot refer to NEW within WITH query" +msgstr "'WITH' მáƒáƒ—ხáƒáƒ•ნáƒáƒ¨áƒ˜ NEW-ზე მიმáƒáƒ áƒ—ვრშეუძლებელიáƒ" + +#: parser/parse_utilcmd.c:3255 +#, c-format +msgid "\"%s\" is not a partition" +msgstr "\"%s\" დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜ áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:3290 parser/parse_utilcmd.c:3335 parser/parse_utilcmd.c:4101 +#, c-format +msgid "\"%s\" is not a partitioned table" +msgstr "\"%s\" დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილი áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:3343 +#, c-format +msgid "partition of hash-partitioned table cannot be merged" +msgstr "ჰეშით დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილის დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბის შერწყმრშეუძლებელიáƒ" + +#: parser/parse_utilcmd.c:3361 +#, c-format +msgid "partition with name \"%s\" is already used" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜ სáƒáƒ®áƒ”ლით \"%s\" უკვე გáƒáƒ›áƒáƒ§áƒ”ნებულიáƒ" + +#: parser/parse_utilcmd.c:3673 +#, c-format +msgid "list of new partitions should contain at least two items" +msgstr "" + +#: parser/parse_utilcmd.c:3811 +#, c-format +msgid "misplaced DEFERRABLE clause" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  áƒáƒ“გილáƒáƒ¡ დáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ DEFERRABLE პირáƒáƒ‘áƒ" + +#: parser/parse_utilcmd.c:3816 parser/parse_utilcmd.c:3831 +#, c-format +msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" +msgstr "ერთზე მეტი DEFERRABLE/NOT DEFERRABLE პირáƒáƒ‘რდáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:3826 +#, c-format +msgid "misplaced NOT DEFERRABLE clause" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  áƒáƒ“გილáƒáƒ¡ დáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ NOT DEFERRABLE პირáƒáƒ‘áƒ" + +#: parser/parse_utilcmd.c:3847 +#, c-format +msgid "misplaced INITIALLY DEFERRED clause" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  áƒáƒ“გილáƒáƒ¡ დáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ INITIALLY DEFERRABLE პირáƒáƒ‘áƒ" + +#: parser/parse_utilcmd.c:3852 parser/parse_utilcmd.c:3878 +#, c-format +msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" +msgstr "ერთზე მეტი INITIALLY IMMEDIATE/DEFERRED დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:3873 +#, c-format +msgid "misplaced INITIALLY IMMEDIATE clause" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  áƒáƒ“გილáƒáƒ¡ დáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ INITIALLY IMMEDIATE პირáƒáƒ‘áƒ" + +#: parser/parse_utilcmd.c:4066 +#, c-format +msgid "CREATE specifies a schema (%s) different from the one being created (%s)" +msgstr "" + +#: parser/parse_utilcmd.c:4108 +#, c-format +msgid "table \"%s\" is not partitioned" +msgstr "ცხრილი \"%s\" დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:4115 +#, c-format +msgid "index \"%s\" is not partitioned" +msgstr "ინდექსი \"%s\" დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ áƒáƒ áƒáƒ" + +#: parser/parse_utilcmd.c:4155 +#, c-format +msgid "a hash-partitioned table may not have a default partition" +msgstr "" + +#: parser/parse_utilcmd.c:4172 +#, c-format +msgid "invalid bound specification for a hash partition" +msgstr "" + +#: parser/parse_utilcmd.c:4178 partitioning/partbounds.c:4803 +#, c-format +msgid "modulus for hash partition must be an integer value greater than zero" +msgstr "" + +#: parser/parse_utilcmd.c:4185 partitioning/partbounds.c:4811 +#, c-format +msgid "remainder for hash partition must be less than modulus" +msgstr "" + +#: parser/parse_utilcmd.c:4198 +#, c-format +msgid "invalid bound specification for a list partition" +msgstr "" + +#: parser/parse_utilcmd.c:4251 +#, c-format +msgid "invalid bound specification for a range partition" +msgstr "" + +#: parser/parse_utilcmd.c:4257 +#, c-format +msgid "FROM must specify exactly one value per partitioning column" +msgstr "" + +#: parser/parse_utilcmd.c:4261 +#, c-format +msgid "TO must specify exactly one value per partitioning column" +msgstr "" + +#: parser/parse_utilcmd.c:4375 +#, c-format +msgid "cannot specify NULL in range bound" +msgstr "დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ სáƒáƒ–ღვრებში NULL-ის მითითებრშეუძლებელიáƒ" + +#: parser/parse_utilcmd.c:4424 +#, c-format +msgid "every bound following MAXVALUE must also be MAXVALUE" +msgstr "ყáƒáƒ•ელი MAXVALUE სáƒáƒ–ღვის შემდეგ ყველრMAXVALUE უნდრიყáƒáƒ¡" + +#: parser/parse_utilcmd.c:4431 +#, c-format +msgid "every bound following MINVALUE must also be MINVALUE" +msgstr "ყáƒáƒ•ელი MINVALUE სáƒáƒ–ღვის შემდეგ ყველრMINVALUE უნდრიყáƒáƒ¡" + +#: parser/parse_utilcmd.c:4474 +#, c-format +msgid "specified value cannot be cast to type %s for column \"%s\"" +msgstr "" + +#: parser/parser.c:273 +msgid "UESCAPE must be followed by a simple string literal" +msgstr "" + +#: parser/parser.c:278 +msgid "invalid Unicode escape character" +msgstr "უნიკáƒáƒ“ის სპეცკáƒáƒ“ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიმბáƒáƒšáƒ" + +#: parser/parser.c:347 scan.l:1391 +#, c-format +msgid "invalid Unicode escape value" +msgstr "უნიკáƒáƒ“ის სპეცკáƒáƒ“ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ" + +#: parser/parser.c:494 scan.l:702 utils/adt/varlena.c:6640 +#, c-format +msgid "invalid Unicode escape" +msgstr "უნიკáƒáƒ“ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეცკáƒáƒ“ი" + +#: parser/parser.c:495 +#, c-format +msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." +msgstr "უნიკáƒáƒ“ის სპეცკáƒáƒ“ების შესáƒáƒ«áƒšáƒ ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ”ბირ\\XXXX დრ\\+XXXXXXXX." + +#: parser/parser.c:523 scan.l:663 scan.l:679 scan.l:695 utils/adt/varlena.c:6665 +#, c-format +msgid "invalid Unicode surrogate pair" +msgstr "უნკáƒáƒ“ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სურáƒáƒ’áƒáƒ¢áƒ£áƒšáƒ˜ წყვილი" + +#: parser/scansup.c:101 +#, c-format +msgid "identifier \"%s\" will be truncated to \"%.*s\"" +msgstr "" + +#: partitioning/partbounds.c:2920 +#, c-format +msgid "partition \"%s\" conflicts with existing default partition \"%s\"" +msgstr "" + +#: partitioning/partbounds.c:2972 partitioning/partbounds.c:2991 partitioning/partbounds.c:3013 +#, c-format +msgid "every hash partition modulus must be a factor of the next larger modulus" +msgstr "" + +#: partitioning/partbounds.c:2973 partitioning/partbounds.c:3014 +#, c-format +msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." +msgstr "" + +#: partitioning/partbounds.c:2992 +#, c-format +msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." +msgstr "" + +#: partitioning/partbounds.c:3127 partitioning/partbounds.c:5202 +#, c-format +msgid "empty range bound specified for partition \"%s\"" +msgstr "" + +#: partitioning/partbounds.c:3129 partitioning/partbounds.c:5204 +#, c-format +msgid "Specified lower bound %s is greater than or equal to upper bound %s." +msgstr "" + +#: partitioning/partbounds.c:3238 +#, c-format +msgid "partition \"%s\" would overlap partition \"%s\"" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜ \"%s\" გáƒáƒ“áƒáƒ¤áƒáƒ áƒáƒ•დრდáƒáƒœáƒáƒ§áƒáƒ¤áƒ¡ \"%s\"" + +#: partitioning/partbounds.c:3355 +#, c-format +msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" +msgstr "" + +#: partitioning/partbounds.c:4807 +#, c-format +msgid "remainder for hash partition must be an integer value greater than or equal to zero" +msgstr "" + +#: partitioning/partbounds.c:4831 +#, c-format +msgid "\"%s\" is not a hash partitioned table" +msgstr "\"%s\" ჰეშით დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილიáƒ" + +#: partitioning/partbounds.c:4842 partitioning/partbounds.c:4959 +#, c-format +msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" +msgstr "დáƒáƒ›áƒ§áƒáƒ¤áƒ˜ სვეტების რáƒáƒáƒ“ენáƒáƒ‘რ(%d) მáƒáƒ¬áƒáƒ“ებული დáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბების რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ¡ (%d) áƒáƒ  ემთხვევáƒ" + +#: partitioning/partbounds.c:4864 +#, c-format +msgid "column %d of the partition key has type %s, but supplied value is of type %s" +msgstr "" + +#: partitioning/partbounds.c:4896 +#, c-format +msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" +msgstr "" + +#: partitioning/partbounds.c:5038 +#, c-format +msgid "lower bound of partition \"%s\" conflicts with upper bound of previous partition \"%s\"" +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ \"%s\" ქვედრზღვáƒáƒ áƒ˜ კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ¨áƒ˜áƒ ზედრზღვáƒáƒ áƒ—áƒáƒœ წინრდáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒ—ვის \"%s\"" + +#: partitioning/partbounds.c:5092 +#, c-format +msgid "new partition \"%s\" would overlap with another new partition \"%s\"" +msgstr "áƒáƒ®áƒáƒšáƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜ \"%s\" გáƒáƒ“áƒáƒ¤áƒáƒ áƒáƒ•დრსხვრáƒáƒ®áƒáƒš დáƒáƒœáƒáƒ§áƒáƒ¤áƒ¡ \"%s\"" + +#: partitioning/partbounds.c:5239 +#, c-format +msgid "lower bound of partition \"%s\" is not equal to lower bound of split partition" +msgstr "ქვედრზღვáƒáƒ áƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒ—ვის \"%s\" áƒáƒ  უდრის დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ ქვედრსáƒáƒ–ღვáƒáƒ áƒ¡" + +#: partitioning/partbounds.c:5251 +#, c-format +msgid "lower bound of partition \"%s\" is less than lower bound of split partition" +msgstr "ქვედრზღვáƒáƒ áƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒ—ვის \"%s\" დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ ქვედრსáƒáƒ–ღვáƒáƒ áƒ–ე ნáƒáƒ™áƒšáƒ”ბიáƒ" + +#: partitioning/partbounds.c:5280 +#, c-format +msgid "upper bound of partition \"%s\" is not equal to upper bound of split partition" +msgstr "ზედრზღვáƒáƒ áƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒ—ვის \"%s\" áƒáƒ  უდრის დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ ზედრსáƒáƒ–ღვáƒáƒ áƒ¡" + +#: partitioning/partbounds.c:5292 +#, c-format +msgid "upper bound of partition \"%s\" is greater than upper bound of split partition" +msgstr "ზედრზღვáƒáƒ áƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒ—ვის \"%s\" დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ ზედრსáƒáƒ–ღვáƒáƒ áƒ–ე მეტიáƒ" + +#: partitioning/partbounds.c:5364 +#, c-format +msgid "new partition \"%s\" cannot have this value because split partition does not have" +msgstr "" + +#: partitioning/partbounds.c:5380 +#, c-format +msgid "new partition \"%s\" cannot have NULL value because split partition does not have" +msgstr "" + +#: partitioning/partbounds.c:5390 +#, c-format +msgid "new partition \"%s\" would overlap with another (not split) partition \"%s\"" +msgstr "áƒáƒ®áƒáƒšáƒ˜ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜ \"%s\" გáƒáƒ“áƒáƒ¤áƒáƒ áƒáƒ•დრსხვრ(áƒáƒ áƒ დáƒáƒ§áƒáƒ¤áƒ˜áƒš) დáƒáƒœáƒáƒ§áƒáƒ¤áƒ¡ \"%s\"" + +#: partitioning/partbounds.c:5530 +#, c-format +msgid "new partitions do not have value %s but split partition does" +msgstr "áƒáƒ®áƒáƒš დáƒáƒœáƒáƒ§áƒáƒ¤áƒ¡ áƒáƒ  áƒáƒ¥áƒ•ს მნიშვნელáƒáƒ‘რ%s, მáƒáƒ’რáƒáƒ› გáƒáƒ§áƒáƒ¤áƒ˜áƒš დáƒáƒœáƒáƒ§áƒáƒ¤áƒ¡ áƒáƒ¥áƒ•ს" + +#: partitioning/partbounds.c:5607 +#, c-format +msgid "DEFAULT partition should be one" +msgstr "" + +#: partitioning/partbounds.c:5623 +#, c-format +msgid "partition of hash-partitioned table cannot be split" +msgstr "ჰეშით დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილის დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბის დáƒáƒ§áƒáƒ¤áƒ შეუძლებელიáƒ" + +#: partitioning/partbounds.c:5677 +#, c-format +msgid "one partition in the list should be DEFAULT because split partition is DEFAULT" +msgstr "" + +#: partitioning/partbounds.c:5687 +#, c-format +msgid "new partition cannot be DEFAULT because DEFAULT partition already exists" +msgstr "" + +#: partitioning/partbounds.c:5746 +#, c-format +msgid "name \"%s\" is already used" +msgstr "სáƒáƒ®áƒ”ლი \"%s\" უკვე გáƒáƒ›áƒáƒ§áƒ”ნებულიáƒ" + +#: port/pg_sema.c:209 port/pg_shmem.c:717 port/posix_sema.c:209 port/sysv_sema.c:323 port/sysv_shmem.c:717 +#, c-format +msgid "could not stat data directory \"%s\": %m" +msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) პáƒáƒ•ნრშეუძლებელიáƒ: %m" + +#: port/pg_shmem.c:224 port/sysv_shmem.c:224 +#, c-format +msgid "could not create shared memory segment: %m" +msgstr "გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების სეგმენტის შექმნრშეუძლებელიáƒ: %m" + +#: port/pg_shmem.c:225 port/sysv_shmem.c:225 +#, c-format +msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." +msgstr "შეცდáƒáƒ›áƒ˜áƒ¡ მქáƒáƒœáƒ” სისტემური ფუნქცირიყრshmget(გáƒáƒ¡áƒáƒ¦áƒ”ბი=%lu, ზáƒáƒ›áƒ=%zu, 0%o)." + +#: port/pg_shmem.c:229 port/sysv_shmem.c:229 +#, c-format +msgid "" +"This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" +"The PostgreSQL documentation contains more information about shared memory configuration." +msgstr "" + +#: port/pg_shmem.c:236 port/sysv_shmem.c:236 +#, c-format +msgid "" +"This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" +"The PostgreSQL documentation contains more information about shared memory configuration." +msgstr "" + +#: port/pg_shmem.c:242 port/sysv_shmem.c:242 +#, c-format +msgid "" +"This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" +"The PostgreSQL documentation contains more information about shared memory configuration." +msgstr "" + +#: port/pg_shmem.c:584 port/sysv_shmem.c:584 port/win32_shmem.c:646 +#, c-format +msgid "\"huge_page_size\" must be 0 on this platform." +msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე \"huge_page_size\" 0 უნდრიყáƒáƒ¡." + +#: port/pg_shmem.c:655 port/sysv_shmem.c:655 +#, c-format +msgid "could not map anonymous shared memory: %m" +msgstr "áƒáƒœáƒáƒœáƒ˜áƒ›áƒ£áƒ áƒ˜ გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების მიბმრშეუძლებელიáƒ: %m" + +#: port/pg_shmem.c:657 port/sysv_shmem.c:657 +#, c-format +msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing \"shared_buffers\" or \"max_connections\"." +msgstr "ეს შეცდáƒáƒ›áƒ ჩვეულებრივ ნიშნáƒáƒ•ს, რáƒáƒ› PostgreSQL-ის მáƒáƒ—ხáƒáƒ•ნრგáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების სეგმენტის გáƒáƒ›áƒáƒ¡áƒáƒ—ხáƒáƒ•áƒáƒ“ ხელმისáƒáƒ¬áƒ•დáƒáƒ› მეხსიერებáƒáƒ–ე, სვáƒáƒžáƒ˜áƒ¡ áƒáƒ“გილზე áƒáƒœ უზáƒáƒ áƒ›áƒáƒ–áƒáƒ  გვერდებზე დიდიáƒ. áƒáƒ› მáƒáƒ—ხáƒáƒ•ნის ზáƒáƒ›áƒ˜áƒ¡ შესáƒáƒ›áƒªáƒ˜áƒ áƒ”ბლáƒáƒ“ შეáƒáƒ›áƒªáƒ˜áƒ áƒ”თ (áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ %zu ბáƒáƒ˜áƒ¢áƒ˜) PostgreSQL-ის გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ, áƒáƒšáƒ‘áƒáƒ—, \"shared_buffers\"-ის áƒáƒœ \"max_connections\"-ის შემცირებით." + +#: port/pg_shmem.c:725 port/sysv_shmem.c:725 +#, c-format +msgid "huge pages not supported on this platform" +msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე უზáƒáƒ áƒ›áƒáƒ–áƒáƒ áƒ˜ გვერდები მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: port/pg_shmem.c:732 port/sysv_shmem.c:732 +#, c-format +msgid "huge pages not supported with the current \"shared_memory_type\" setting" +msgstr "\"shared_memory_type\" პáƒáƒ áƒáƒ›áƒ”ტრთáƒáƒœ ერთáƒáƒ“ უზáƒáƒ áƒ›áƒáƒ–áƒáƒ áƒ˜ გვერდები მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: port/pg_shmem.c:798 port/sysv_shmem.c:798 utils/init/miscinit.c:1347 +#, c-format +msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" +msgstr "უკვე áƒáƒ áƒ¡áƒ”ბული გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების ბლáƒáƒ™áƒ˜ (გáƒáƒ¡áƒáƒ¦áƒ”ბი %lu, ID %lu) ჯერ კიდევ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: port/pg_shmem.c:801 port/sysv_shmem.c:801 utils/init/miscinit.c:1349 +#, c-format +msgid "Terminate any old server processes associated with data directory \"%s\"." +msgstr "" + +#: port/sysv_sema.c:120 +#, c-format +msgid "could not create semaphores: %m" +msgstr "სემáƒáƒ¤áƒáƒ áƒ”ბის შექმნის შეცდáƒáƒ›áƒ: %m" + +#: port/sysv_sema.c:121 +#, c-format +msgid "Failed system call was semget(%lu, %d, 0%o)." +msgstr "áƒáƒ•áƒáƒ áƒ˜áƒ£áƒšáƒ˜ სისტემური ფუნქცირიყრsemget(%lu, %d, 0%o)." + +#: port/sysv_sema.c:125 +#, c-format +msgid "" +"This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its \"max_connections\" parameter.\n" +"The PostgreSQL documentation contains more information about configuring your system for PostgreSQL." +msgstr "" + +#: port/sysv_sema.c:155 +#, c-format +msgid "You possibly need to raise your kernel's SEMVMX value to be at least %d. Look into the PostgreSQL documentation for details." +msgstr "" + +#: port/win32/crashdump.c:119 +#, c-format +msgid "could not load dbghelp.dll, cannot write crash dump\n" +msgstr "dbghelp.dll-ის ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ. áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒžáƒ¡ ვერ ჩáƒáƒ•წერ\n" + +#: port/win32/crashdump.c:127 +#, c-format +msgid "could not load required functions in dbghelp.dll, cannot write crash dump\n" +msgstr "dbghelp.dll-დáƒáƒœ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელი ფუნქციების ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ. áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒžáƒ¡ ვერ ჩáƒáƒ•წერ\n" + +#: port/win32/crashdump.c:158 +#, c-format +msgid "could not open crash dump file \"%s\" for writing: error code %lu\n" +msgstr "áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒžáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" ჩáƒáƒ¡áƒáƒ¬áƒ”რáƒáƒ“ გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" + +#: port/win32/crashdump.c:165 +#, c-format +msgid "wrote crash dump to file \"%s\"\n" +msgstr "áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒžáƒ˜ ჩáƒáƒ˜áƒ¬áƒ”რრფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\"\n" + +#: port/win32/crashdump.c:167 +#, c-format +msgid "could not write crash dump to file \"%s\": error code %lu\n" +msgstr "áƒáƒ•áƒáƒ áƒ˜áƒ¡ დáƒáƒ›áƒžáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" + +#: port/win32/signal.c:240 +#, c-format +msgid "could not create signal listener pipe for PID %d: error code %lu" +msgstr "" + +#: port/win32/signal.c:295 +#, c-format +msgid "could not create signal listener pipe: error code %lu; retrying\n" +msgstr "" + +#: port/win32_sema.c:104 +#, c-format +msgid "could not create semaphore: error code %lu" +msgstr "სემáƒáƒ¤áƒáƒ áƒ˜áƒ¡ შექმნრშეუძლებელიáƒ. შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: port/win32_sema.c:180 +#, c-format +msgid "could not lock semaphore: error code %lu" +msgstr "სემáƒáƒ¤áƒáƒ áƒ˜áƒ¡ დáƒáƒ‘ლáƒáƒ™áƒ•რშეუძლებელიáƒ. შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: port/win32_sema.c:200 +#, c-format +msgid "could not unlock semaphore: error code %lu" +msgstr "სემáƒáƒ¤áƒáƒ áƒ˜áƒ¡ გáƒáƒœáƒ‘ლáƒáƒ™áƒ•რშეუძლებელიáƒ. შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: port/win32_sema.c:230 +#, c-format +msgid "could not try-lock semaphore: error code %lu" +msgstr "" + +#: port/win32_shmem.c:146 port/win32_shmem.c:161 port/win32_shmem.c:173 port/win32_shmem.c:189 +#, c-format +msgid "could not enable user right \"%s\": error code %lu" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლების ჩáƒáƒ áƒ—ვის შეცდáƒáƒ›áƒ: %s შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu" + +#. translator: This is a term from Windows and should be translated to +#. match the Windows localization. +#. +#: port/win32_shmem.c:152 port/win32_shmem.c:161 port/win32_shmem.c:173 port/win32_shmem.c:184 port/win32_shmem.c:186 port/win32_shmem.c:189 +msgid "Lock pages in memory" +msgstr "გვერდების დáƒáƒ‘ლáƒáƒ™áƒ•რმეხსიერებáƒáƒ¨áƒ˜" + +#: port/win32_shmem.c:154 port/win32_shmem.c:162 port/win32_shmem.c:174 port/win32_shmem.c:190 +#, c-format +msgid "Failed system call was %s." +msgstr "წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი სისტემური ფუნქციáƒ: %s." + +#: port/win32_shmem.c:184 +#, c-format +msgid "could not enable user right \"%s\"" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლების ჩáƒáƒ áƒ—ვის შეცდáƒáƒ›áƒ: %s" + +#: port/win32_shmem.c:185 +#, c-format +msgid "Assign user right \"%s\" to the Windows user account which runs PostgreSQL." +msgstr "" + +#: port/win32_shmem.c:244 +#, c-format +msgid "the processor does not support large pages" +msgstr "პრáƒáƒªáƒ”სáƒáƒ áƒ¡ დიდი გვერდების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: port/win32_shmem.c:313 port/win32_shmem.c:349 port/win32_shmem.c:374 +#, c-format +msgid "could not create shared memory segment: error code %lu" +msgstr "" + +#: port/win32_shmem.c:314 +#, c-format +msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." +msgstr "" + +#: port/win32_shmem.c:339 +#, c-format +msgid "pre-existing shared memory block is still in use" +msgstr "წინáƒáƒ¡áƒ¬áƒáƒ  áƒáƒ áƒ¡áƒ”ბული გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების ბლáƒáƒ™ ჯერ კიდევ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: port/win32_shmem.c:340 +#, c-format +msgid "Check if there are any old server processes still running, and terminate them." +msgstr "" + +#: port/win32_shmem.c:350 +#, c-format +msgid "Failed system call was DuplicateHandle." +msgstr "წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბლáƒáƒ“ გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბული სისტემური ფუნქციáƒ: DuplicateHandle." + +#: port/win32_shmem.c:375 +#, c-format +msgid "Failed system call was MapViewOfFileEx." +msgstr "წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბლáƒáƒ“ გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბული სისტემური ფუნქციáƒ: MapViewOfFileEx." + +#: postmaster/autovacuum.c:686 +#, c-format +msgid "autovacuum worker took too long to start; canceled" +msgstr "áƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის გáƒáƒ¨áƒ•ებáƒáƒ¡ მეტისმეტáƒáƒ“ დიდი დრრმáƒáƒ£áƒœáƒ“áƒ. ის გáƒáƒ£áƒ¥áƒ›áƒ“áƒ" + +#: postmaster/autovacuum.c:2199 +#, c-format +msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" +msgstr "áƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ: წáƒáƒ˜áƒ¨áƒšáƒ”ბრმიტáƒáƒ•ებული დრáƒáƒ”ბითი ცხრილი \"%s.%s.%s\"" + +#: postmaster/autovacuum.c:2435 +#, c-format +msgid "automatic vacuum of table \"%s.%s.%s\"" +msgstr "ცხრილის áƒáƒ•ტáƒáƒ“áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ: \"%s.%s.%s\"" + +#: postmaster/autovacuum.c:2438 +#, c-format +msgid "automatic analyze of table \"%s.%s.%s\"" +msgstr "ცხრილის áƒáƒ•ტáƒáƒáƒœáƒáƒšáƒ˜áƒ–ი: \"%s.%s.%s\"" + +#: postmaster/autovacuum.c:2632 +#, c-format +msgid "processing work entry for relation \"%s.%s.%s\"" +msgstr "" + +#: postmaster/autovacuum.c:3250 +#, c-format +msgid "autovacuum not started because of misconfiguration" +msgstr "áƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრáƒáƒ  გáƒáƒ¨áƒ•ებულრკáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ" + +#: postmaster/autovacuum.c:3251 +#, c-format +msgid "Enable the \"track_counts\" option." +msgstr "ჩáƒáƒ áƒ—ეთ \"track_counts\" პáƒáƒ áƒáƒ›áƒ”ტრი." + +#: postmaster/bgworker.c:260 +#, c-format +msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" +msgstr "" + +#: postmaster/bgworker.c:651 +#, c-format +msgid "background worker \"%s\": background workers without shared memory access are not supported" +msgstr "" + +#: postmaster/bgworker.c:662 +#, c-format +msgid "background worker \"%s\": cannot request database access if starting at postmaster start" +msgstr "" + +#: postmaster/bgworker.c:676 +#, c-format +msgid "background worker \"%s\": invalid restart interval" +msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი \"%s\": áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ“áƒáƒ¢áƒ•ირთვის ინტერვáƒáƒšáƒ˜" + +#: postmaster/bgworker.c:691 +#, c-format +msgid "background worker \"%s\": parallel workers may not be configured for restart" +msgstr "" + +#: postmaster/bgworker.c:715 tcop/postgres.c:3285 +#, c-format +msgid "terminating background worker \"%s\" due to administrator command" +msgstr "" + +#: postmaster/bgworker.c:888 +#, c-format +msgid "background worker \"%s\": must be registered in \"shared_preload_libraries\"" +msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი \"%s\": \"shared_preload_libraries\"-ში დáƒáƒ áƒ”გისტრირებული უნდრიყáƒáƒ¡" + +#: postmaster/bgworker.c:911 +#, c-format +msgid "background worker \"%s\": only dynamic background workers can request notification" +msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ დáƒáƒ®áƒ›áƒáƒ›áƒ áƒ” პრáƒáƒªáƒ”სი \"%s\": გáƒáƒ¤áƒ áƒ—ხილების მáƒáƒ—ხáƒáƒ•ნრმხáƒáƒšáƒáƒ“ დინáƒáƒ›áƒ˜áƒ™áƒ£áƒ  ფáƒáƒœáƒ£áƒ  დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სებს შეუძლიáƒáƒ—" + +#: postmaster/bgworker.c:926 +#, c-format +msgid "too many background workers" +msgstr "მეტისმეტáƒáƒ“ ბევრი ფáƒáƒœáƒ£áƒ áƒ˜ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი" + +#: postmaster/bgworker.c:927 +#, c-format +msgid "Up to %d background worker can be registered with the current settings." +msgid_plural "Up to %d background workers can be registered with the current settings." +msgstr[0] "" +msgstr[1] "" + +#: postmaster/bgworker.c:931 +#, c-format +msgid "Consider increasing the configuration parameter \"max_worker_processes\"." +msgstr "გáƒáƒ˜áƒ—ვáƒáƒšáƒ˜áƒ¡áƒ¬áƒ˜áƒœáƒ”თ, რáƒáƒ› შეიძლებრკáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის \"max_worker_processes\" გáƒáƒ–რდრგჭირდებáƒáƒ—." + +#: postmaster/checkpointer.c:441 +#, c-format +msgid "checkpoints are occurring too frequently (%d second apart)" +msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" +msgstr[0] "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილები მეტისმეტáƒáƒ“ ხშირáƒáƒ“ ხდებრ(%d წáƒáƒ›áƒ˜áƒáƒœáƒ˜ შუáƒáƒšáƒ”დით)" +msgstr[1] "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილები მეტისმეტáƒáƒ“ ხშირáƒáƒ“ ხდებრ(%d წáƒáƒ›áƒ˜áƒáƒœáƒ˜ შუáƒáƒšáƒ”დით)" + +#: postmaster/checkpointer.c:445 +#, c-format +msgid "Consider increasing the configuration parameter \"%s\"." +msgstr "გáƒáƒ˜áƒ—ვáƒáƒšáƒ˜áƒ¡áƒ¬áƒ˜áƒœáƒ”თ, რáƒáƒ› შეიძლებრკáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის \"%s\" გáƒáƒ–რდრგჭირდებáƒáƒ—." + +#: postmaster/checkpointer.c:1067 +#, c-format +msgid "checkpoint request failed" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის მáƒáƒ—ხáƒáƒ•ნის შეცდáƒáƒ›áƒ" + +#: postmaster/checkpointer.c:1068 +#, c-format +msgid "Consult recent messages in the server log for details." +msgstr "დეტáƒáƒšáƒ”ბისთვის იხილეთ სერვერის ჟურნáƒáƒšáƒ˜áƒ¡ უáƒáƒ®áƒšáƒ”სი შეტყáƒáƒ‘ინებები." + +#: postmaster/launch_backend.c:369 +#, c-format +msgid "could not execute server process \"%s\": %m" +msgstr "სერვერის პრáƒáƒªáƒ”სის (\"%s\") შესრულების შეცდáƒáƒ›áƒ: %m" + +#: postmaster/launch_backend.c:422 +#, c-format +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის ფáƒáƒ˜áƒšáƒ˜áƒ¡ მიბმის შექმნის შეცდáƒáƒ›áƒ. შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu" + +#: postmaster/launch_backend.c:430 +#, c-format +msgid "could not map backend parameter memory: error code %lu" +msgstr "უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის მეხსიერების მიმáƒáƒ’რების პრáƒáƒ‘ლემáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: postmaster/launch_backend.c:447 +#, c-format +msgid "subprocess command line too long" +msgstr "ქვეპრáƒáƒ”ქტების ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜ ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#: postmaster/launch_backend.c:465 +#, c-format +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბის შეცდáƒáƒ›áƒ: CreateProcess(): %m (შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu)" + +#: postmaster/launch_backend.c:492 +#, c-format +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის ფáƒáƒ˜áƒšáƒ˜áƒ¡ ხედის მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ. შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu" + +#: postmaster/launch_backend.c:496 +#, c-format +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის დáƒáƒ®áƒ£áƒ áƒ•რშეუძლებელიáƒ. შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu" + +#: postmaster/launch_backend.c:518 +#, c-format +msgid "giving up after too many tries to reserve shared memory" +msgstr "გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡ მეტისმეტáƒáƒ“ ბევრი ცდის შემდეგ შევეშვი ცდáƒáƒ¡" + +#: postmaster/launch_backend.c:519 +#, c-format +msgid "This might be caused by ASLR or antivirus software." +msgstr "ეს შეიძლებრგáƒáƒ›áƒáƒ¬áƒ•ეული იყáƒáƒ¡ ASLR áƒáƒœ áƒáƒœáƒ¢áƒ˜áƒ•ირუსული პრáƒáƒ’რáƒáƒ›áƒ£áƒšáƒ˜ უზრუნველყáƒáƒ¤áƒ˜áƒ¡ მიერ." + +#: postmaster/launch_backend.c:817 +#, c-format +msgid "could not duplicate socket %d for use in backend: error code %d" +msgstr "" + +#: postmaster/launch_backend.c:849 +#, c-format +msgid "could not create inherited socket: error code %d\n" +msgstr "მემკვიდრეáƒáƒ‘ით მიღებული სáƒáƒ™áƒ”ტის შექმნრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %d\n" + +#: postmaster/launch_backend.c:878 +#, c-format +msgid "could not open backend variables file \"%s\": %m\n" +msgstr "უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ ცვლáƒáƒ“ების ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %m\n" + +#: postmaster/launch_backend.c:884 +#, c-format +msgid "could not read from backend variables file \"%s\": %m\n" +msgstr "უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ ცვლáƒáƒ“ების ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: %m\n" + +#: postmaster/launch_backend.c:895 +#, c-format +msgid "could not read startup data from backend variables file \"%s\": %m\n" +msgstr "უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ ცვლáƒáƒ“ების ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ \"%s\" გáƒáƒ¨áƒ•ების მáƒáƒœáƒáƒªáƒ”მების წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: %m\n" + +#: postmaster/launch_backend.c:907 +#, c-format +msgid "could not remove file \"%s\": %m\n" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m\n" + +#: postmaster/launch_backend.c:923 +#, c-format +msgid "could not map view of backend variables: error code %lu\n" +msgstr "უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ ცვლáƒáƒ“ების ხედის მიბმრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" + +#: postmaster/launch_backend.c:942 +#, c-format +msgid "could not unmap view of backend variables: error code %lu\n" +msgstr "უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ ცვლáƒáƒ“ების ხედის მáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" + +#: postmaster/launch_backend.c:949 +#, c-format +msgid "could not close handle to backend parameter variables: error code %lu\n" +msgstr "უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის ცვლáƒáƒ“ების დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის დáƒáƒ®áƒ£áƒ áƒ•რშეუძლებელიáƒ. შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu\n" + +#: postmaster/pgarch.c:428 +#, c-format +msgid "\"archive_mode\" enabled, yet archiving is not configured" +msgstr "\"archive_mode\" ჩáƒáƒ áƒ—ულიáƒ, მáƒáƒ’რáƒáƒ› დáƒáƒáƒ áƒ¥áƒ˜áƒ•ებრჯერ მáƒáƒ áƒ’ებული áƒáƒ áƒáƒ" + +#: postmaster/pgarch.c:452 +#, c-format +msgid "removed orphan archive status file \"%s\"" +msgstr "წáƒáƒ˜áƒ¨áƒáƒšáƒ მიტáƒáƒ•ებული áƒáƒ áƒ¥áƒ˜áƒ•ის სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ \"%s\"" + +#: postmaster/pgarch.c:462 +#, c-format +msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" +msgstr "" + +#: postmaster/pgarch.c:498 +#, c-format +msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" +msgstr "" + +#: postmaster/pgarch.c:879 postmaster/pgarch.c:918 +#, c-format +msgid "both \"archive_command\" and \"archive_library\" set" +msgstr "დáƒáƒ§áƒ”ნებულირáƒáƒ áƒ˜áƒ•ე, \"archive_command\" დრ\"archive_library\"" + +#: postmaster/pgarch.c:880 postmaster/pgarch.c:919 +#, c-format +msgid "Only one of \"archive_command\", \"archive_library\" may be set." +msgstr "\"archive_command\"-დáƒáƒœ დრ\"archive_library\"-დáƒáƒœ, მხáƒáƒšáƒáƒ“, ერთ-ერთი შეგიძლიáƒáƒ—, დáƒáƒáƒ§áƒ”ნáƒáƒ—." + +#: postmaster/pgarch.c:897 +#, c-format +msgid "restarting archiver process because value of \"archive_library\" was changed" +msgstr "" + +#: postmaster/pgarch.c:934 +#, c-format +msgid "archive modules have to define the symbol %s" +msgstr "" + +#: postmaster/pgarch.c:940 +#, c-format +msgid "archive modules must register an archive callback" +msgstr "" + +#: postmaster/postmaster.c:661 +#, c-format +msgid "%s: invalid argument for option -f: \"%s\"\n" +msgstr "%s: -f პáƒáƒ áƒáƒ›áƒ”ტრის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი: \"%s\"\n" + +#: postmaster/postmaster.c:734 +#, c-format +msgid "%s: invalid argument for option -t: \"%s\"\n" +msgstr "%s: -t პáƒáƒ áƒáƒ›áƒ”ტრის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი: \"%s\"\n" + +#: postmaster/postmaster.c:757 +#, c-format +msgid "%s: invalid argument: \"%s\"\n" +msgstr "%s: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი: \"%s\"\n" + +#: postmaster/postmaster.c:825 +#, c-format +msgid "%s: \"superuser_reserved_connections\" (%d) plus \"reserved_connections\" (%d) must be less than \"max_connections\" (%d)\n" +msgstr "" + +#: postmaster/postmaster.c:833 +#, c-format +msgid "WAL archival cannot be enabled when \"wal_level\" is \"minimal\"" +msgstr "" + +#: postmaster/postmaster.c:836 +#, c-format +msgid "WAL streaming (\"max_wal_senders\" > 0) requires \"wal_level\" to be \"replica\" or \"logical\"" +msgstr "" + +#: postmaster/postmaster.c:839 +#, c-format +msgid "WAL cannot be summarized when \"wal_level\" is \"minimal\"" +msgstr "" + +#: postmaster/postmaster.c:847 +#, c-format +msgid "%s: invalid datetoken tables, please fix\n" +msgstr "" + +#: postmaster/postmaster.c:1004 +#, c-format +msgid "could not create I/O completion port for child queue" +msgstr "" + +#: postmaster/postmaster.c:1069 +#, c-format +msgid "ending log output to stderr" +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ stderr-ზე გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბáƒ" + +#: postmaster/postmaster.c:1070 +#, c-format +msgid "Future log output will go to log destination \"%s\"." +msgstr "" + +#: postmaster/postmaster.c:1081 +#, c-format +msgid "starting %s" +msgstr "\"%s\"-ის გáƒáƒ¨áƒ•ებáƒ" + +#: postmaster/postmaster.c:1143 +#, c-format +msgid "could not create listen socket for \"%s\"" +msgstr "მáƒáƒ¡áƒ›áƒ”ნის სáƒáƒ™áƒ”ტის შექმნრ\"%s\"-სთვის შეუძლებელიáƒ" + +#: postmaster/postmaster.c:1149 +#, c-format +msgid "could not create any TCP/IP sockets" +msgstr "\"TCP/IP\" სáƒáƒ™áƒ”ტების შექმნის შეცდáƒáƒ›áƒ" + +#: postmaster/postmaster.c:1181 +#, c-format +msgid "DNSServiceRegister() failed: error code %ld" +msgstr "DNSServiceRegister()-ის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %ld" + +#: postmaster/postmaster.c:1234 +#, c-format +msgid "could not create Unix-domain socket in directory \"%s\"" +msgstr "შეცდáƒáƒ›áƒ Unix სáƒáƒ™áƒ”ტის შექმნისáƒáƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში \"%s\"" + +#: postmaster/postmaster.c:1240 +#, c-format +msgid "could not create any Unix-domain sockets" +msgstr "\"Unix-domain\" სáƒáƒ™áƒ”ტების შექმნის შეცდáƒáƒ›áƒ" + +#: postmaster/postmaster.c:1251 +#, c-format +msgid "no socket created for listening" +msgstr "მáƒáƒ¡áƒáƒ¡áƒ›áƒ”ნი სáƒáƒ™áƒ”ტი áƒáƒ  შექმნილáƒ" + +#: postmaster/postmaster.c:1282 +#, c-format +msgid "%s: could not change permissions of external PID file \"%s\": %m\n" +msgstr "%s: გáƒáƒ áƒ” PID ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" წვდáƒáƒ›áƒ”ბის შეცვლრშეუძლებელიáƒ: %m\n" + +#: postmaster/postmaster.c:1286 +#, c-format +msgid "%s: could not write external PID file \"%s\": %m\n" +msgstr "%s: გáƒáƒ áƒ” PID ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ \"%s\": %m\n" + +#. translator: %s is a configuration file +#: postmaster/postmaster.c:1314 utils/init/postinit.c:221 +#, c-format +msgid "could not load %s" +msgstr "%s-ის ჩáƒáƒ¢áƒ•ირთვრშეუძლებელიáƒ" + +#: postmaster/postmaster.c:1340 +#, c-format +msgid "postmaster became multithreaded during startup" +msgstr "პრáƒáƒªáƒ”სი postmaster გáƒáƒ¨áƒ•ებისáƒáƒ¡ მრáƒáƒ•áƒáƒšáƒœáƒáƒ™áƒáƒ“იáƒáƒœáƒ˜ გáƒáƒ®áƒ“áƒ" + +#: postmaster/postmaster.c:1341 +#, c-format +msgid "Set the LC_ALL environment variable to a valid locale." +msgstr "დáƒáƒáƒ§áƒ”ნეთ LC_ALL გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი სწáƒáƒ  ლáƒáƒ™áƒáƒšáƒ–ე." + +#: postmaster/postmaster.c:1440 +#, c-format +msgid "%s: could not locate my own executable path" +msgstr "%s: ჩემი სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ გáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ˜áƒ¡ ბილიკის მáƒáƒ«áƒ”ბნრშეუძლებელიáƒ" + +#: postmaster/postmaster.c:1447 +#, c-format +msgid "%s: could not locate matching postgres executable" +msgstr "%s: გáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ˜ postgres ვერ ვიპáƒáƒ•ე" + +#: postmaster/postmaster.c:1470 utils/misc/tzparser.c:341 +#, c-format +msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." +msgstr "" + +#: postmaster/postmaster.c:1497 +#, c-format +msgid "" +"%s: could not find the database system\n" +"Expected to find it in the directory \"%s\",\n" +"but could not open file \"%s\": %m\n" +msgstr "" + +#. translator: %s is SIGKILL or SIGABRT +#: postmaster/postmaster.c:1787 +#, c-format +msgid "issuing %s to recalcitrant children" +msgstr "" + +#: postmaster/postmaster.c:1809 +#, c-format +msgid "performing immediate shutdown because data directory lock file is invalid" +msgstr "" + +#: postmaster/postmaster.c:1872 +#, c-format +msgid "wrong key in cancel request for process %d" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ¡áƒáƒ¦áƒ”ბი გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•ნáƒáƒ¨áƒ˜ პრáƒáƒªáƒ”სისთვის %d" + +#: postmaster/postmaster.c:1884 +#, c-format +msgid "PID %d in cancel request did not match any process" +msgstr "PID %d, მáƒáƒ—ხáƒáƒ•ნილი გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•ნáƒáƒ¨áƒ˜, áƒáƒ áƒª ერთ პრáƒáƒªáƒ”სს áƒáƒ  ემთხვევáƒ" + +#: postmaster/postmaster.c:2105 +#, c-format +msgid "received SIGHUP, reloading configuration files" +msgstr "მიღებულირSIGHUP, მიმდინáƒáƒ áƒ”áƒáƒ‘ს კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის თáƒáƒ•იდáƒáƒœ ჩáƒáƒ¢áƒ•ირთვáƒ" + +#. translator: %s is a configuration file +#: postmaster/postmaster.c:2133 postmaster/postmaster.c:2137 +#, c-format +msgid "%s was not reloaded" +msgstr "%s áƒáƒ  გáƒáƒ“áƒáƒ¢áƒ•ირთულáƒ" + +#: postmaster/postmaster.c:2147 +#, c-format +msgid "SSL configuration was not reloaded" +msgstr "SSL კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ áƒáƒ  იყრგáƒáƒ“áƒáƒ¢áƒ•ირთული" + +#: postmaster/postmaster.c:2233 +#, c-format +msgid "received smart shutdown request" +msgstr "მიღებულირჭკვიáƒáƒœáƒ˜ გáƒáƒ›áƒáƒ áƒ—ვის მáƒáƒ—ხáƒáƒ•ნáƒ" + +#: postmaster/postmaster.c:2274 +#, c-format +msgid "received fast shutdown request" +msgstr "მიღებულირსწრáƒáƒ¤áƒ˜ გáƒáƒ›áƒáƒ áƒ—ვის მáƒáƒ—ხáƒáƒ•ნáƒ" + +#: postmaster/postmaster.c:2292 +#, c-format +msgid "aborting any active transactions" +msgstr "ყველრáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ შეწყვეტáƒ" + +#: postmaster/postmaster.c:2316 +#, c-format +msgid "received immediate shutdown request" +msgstr "მიღებულირდáƒáƒ£áƒ§áƒáƒ•ნებლივი გáƒáƒ›áƒáƒ áƒ—ვის მáƒáƒ—ხáƒáƒ•ნáƒ" + +#: postmaster/postmaster.c:2388 +#, c-format +msgid "shutdown at recovery target" +msgstr "გáƒáƒ›áƒáƒ áƒ—ვრáƒáƒ¦áƒ“გენის სáƒáƒ›áƒ˜áƒ–ნეზე" + +#: postmaster/postmaster.c:2406 postmaster/postmaster.c:2442 +msgid "startup process" +msgstr "გáƒáƒ¨áƒ•ების პრáƒáƒªáƒ”სი" + +#: postmaster/postmaster.c:2409 +#, c-format +msgid "aborting startup due to startup process failure" +msgstr "გáƒáƒ¨áƒ•ების გáƒáƒ£áƒ¥áƒ›áƒ”ბრგáƒáƒ¨áƒ•ების პრáƒáƒªáƒ”სის შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ" + +#: postmaster/postmaster.c:2484 +#, c-format +msgid "database system is ready to accept connections" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემრმზáƒáƒ“áƒáƒ შეერთებების მისáƒáƒ¦áƒ”ბáƒáƒ“" + +#: postmaster/postmaster.c:2505 +msgid "background writer process" +msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ ჩáƒáƒ›áƒ¬áƒ”რი პრáƒáƒªáƒ”სი" + +#: postmaster/postmaster.c:2552 +msgid "checkpointer process" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის პრáƒáƒªáƒ”სი" + +#: postmaster/postmaster.c:2568 +msgid "WAL writer process" +msgstr "WAL-ის ჩáƒáƒ›áƒ¬áƒ”რი პრáƒáƒªáƒ”სი" + +#: postmaster/postmaster.c:2583 +msgid "WAL receiver process" +msgstr "WAL-ის მიმღები პრáƒáƒªáƒ”სი" + +#: postmaster/postmaster.c:2597 +msgid "WAL summarizer process" +msgstr "WAL-ის შეჯáƒáƒ›áƒ”ბის პრáƒáƒªáƒ”სი" + +#: postmaster/postmaster.c:2612 +msgid "autovacuum launcher process" +msgstr "áƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის გáƒáƒ›áƒ¨áƒ•ები პრáƒáƒªáƒ”სი" + +#: postmaster/postmaster.c:2630 +msgid "archiver process" +msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის პრáƒáƒªáƒ”სი" + +#: postmaster/postmaster.c:2643 +msgid "system logger process" +msgstr "სისტემური ჟურნáƒáƒšáƒ˜áƒ¡ პრáƒáƒªáƒ”სი" + +#: postmaster/postmaster.c:2660 +msgid "slot sync worker process" +msgstr "სლáƒáƒ¢áƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი" + +#: postmaster/postmaster.c:2716 +#, c-format +msgid "background worker \"%s\"" +msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი \"%s\"" + +#: postmaster/postmaster.c:2795 postmaster/postmaster.c:2815 postmaster/postmaster.c:2822 postmaster/postmaster.c:2840 +msgid "server process" +msgstr "სერვერის პრáƒáƒªáƒ”სი" + +#: postmaster/postmaster.c:2894 +#, c-format +msgid "terminating any other active server processes" +msgstr "სერვერის სხვრდáƒáƒœáƒáƒ áƒ©áƒ”ნი áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ პრáƒáƒªáƒ”სები შეჩერდებáƒ" + +#. translator: %s is a noun phrase describing a child process, such as +#. "server process" +#: postmaster/postmaster.c:3081 +#, c-format +msgid "%s (PID %d) exited with exit code %d" +msgstr "%s (PID %d) დáƒáƒ¡áƒ áƒ£áƒšáƒ“რსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d" + +#: postmaster/postmaster.c:3083 postmaster/postmaster.c:3095 postmaster/postmaster.c:3105 postmaster/postmaster.c:3116 +#, c-format +msgid "Failed process was running: %s" +msgstr "შეცდáƒáƒ›áƒ˜áƒ¡ მქáƒáƒœáƒ” პრáƒáƒªáƒ”სს გáƒáƒ¨áƒ•ებული ჰქáƒáƒœáƒ“áƒ: %s" + +#. translator: %s is a noun phrase describing a child process, such as +#. "server process" +#: postmaster/postmaster.c:3092 +#, c-format +msgid "%s (PID %d) was terminated by exception 0x%X" +msgstr "%s (PID %d) დáƒáƒ¡áƒ áƒ£áƒšáƒ“რშეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ით 0x%X" + +#. translator: %s is a noun phrase describing a child process, such as +#. "server process" +#: postmaster/postmaster.c:3102 +#, c-format +msgid "%s (PID %d) was terminated by signal %d: %s" +msgstr "%s (PID %d) დáƒáƒ¡áƒ áƒ£áƒšáƒ“რსიგნáƒáƒšáƒ˜áƒ—: %d: %s" + +#. translator: %s is a noun phrase describing a child process, such as +#. "server process" +#: postmaster/postmaster.c:3114 +#, c-format +msgid "%s (PID %d) exited with unrecognized status %d" +msgstr "%s (PID %d) დáƒáƒ¡áƒ áƒ£áƒšáƒ“რუცნáƒáƒ‘ი სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d" + +#: postmaster/postmaster.c:3330 +#, c-format +msgid "abnormal database system shutdown" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემის áƒáƒ áƒáƒœáƒáƒ áƒ›áƒáƒšáƒ£áƒ áƒ˜ გáƒáƒ›áƒáƒ áƒ—ვáƒ" + +#: postmaster/postmaster.c:3356 +#, c-format +msgid "shutting down due to startup process failure" +msgstr "მუშáƒáƒáƒ‘ის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბრგáƒáƒ›áƒ¨áƒ•ები პრáƒáƒªáƒ”სის შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ" + +#: postmaster/postmaster.c:3362 +#, c-format +msgid "shutting down because \"restart_after_crash\" is off" +msgstr "მუშáƒáƒáƒ‘რდáƒáƒ¡áƒ áƒ£áƒšáƒ“ებáƒ. რáƒáƒ“გáƒáƒœ \"restart_after_crash\" გáƒáƒ›áƒáƒ áƒ—ულიáƒ" + +#: postmaster/postmaster.c:3374 +#, c-format +msgid "all server processes terminated; reinitializing" +msgstr "სერვერის ყველრპრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ; მიმდინáƒáƒ áƒ”áƒáƒ‘ს რეინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ" + +#: postmaster/postmaster.c:3573 postmaster/postmaster.c:3983 postmaster/postmaster.c:4372 +#, c-format +msgid "could not generate random cancel key" +msgstr "შემთხვევითი გáƒáƒ£áƒ¥áƒ›áƒ”ბის გáƒáƒ¡áƒáƒ¦áƒ”ბის გენერáƒáƒªáƒ˜áƒ შეუძლებელიáƒ" + +#: postmaster/postmaster.c:3606 +#, c-format +msgid "could not fork new process for connection: %m" +msgstr "áƒáƒ®áƒáƒšáƒ˜ პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ შეერთებისთვის: %m" + +#: postmaster/postmaster.c:3648 +msgid "could not fork new process for connection: " +msgstr "áƒáƒ®áƒáƒšáƒ˜ პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ შეერთებისთვის: " + +#: postmaster/postmaster.c:3682 +#, c-format +msgid "Please report this to <%s>." +msgstr "გთხáƒáƒ•თ, შეáƒáƒ¢áƒ§áƒáƒ‘ინáƒáƒ— <%s>." + +#: postmaster/postmaster.c:3750 +#, c-format +msgid "database system is ready to accept read-only connections" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემრმზáƒáƒ“áƒáƒ მხáƒáƒšáƒáƒ“-კითხვáƒáƒ“ი შეერთებების მისáƒáƒ¦áƒ”ბáƒáƒ“" + +#: postmaster/postmaster.c:3933 +#, c-format +msgid "could not fork \"%s\" process: %m" +msgstr "\"%s\" პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: postmaster/postmaster.c:4171 postmaster/postmaster.c:4205 +#, c-format +msgid "database connection requirement not indicated during registration" +msgstr "" + +#: postmaster/postmaster.c:4181 postmaster/postmaster.c:4215 +#, c-format +msgid "invalid processing mode in background worker" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების რეჟიმი ფáƒáƒœáƒ£áƒ  დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სში" + +#: postmaster/postmaster.c:4275 +#, c-format +msgid "could not fork background worker process: %m" +msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: postmaster/postmaster.c:4358 +#, c-format +msgid "no slot available for new background worker process" +msgstr "áƒáƒ®áƒáƒšáƒ˜ ფáƒáƒœáƒ£áƒ áƒ˜ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სისთვის სლáƒáƒ¢áƒ˜ ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ áƒáƒ áƒáƒ" + +#: postmaster/postmaster.c:4621 +#, c-format +msgid "could not read exit code for process\n" +msgstr "პრáƒáƒªáƒ”სის გáƒáƒ›áƒáƒ¡áƒ•ლის კáƒáƒ“ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ\n" + +#: postmaster/postmaster.c:4663 +#, c-format +msgid "could not post child completion status\n" +msgstr "შვილი პრáƒáƒªáƒ”სის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ\n" + +#: postmaster/syslogger.c:529 postmaster/syslogger.c:1173 +#, c-format +msgid "could not read from logger pipe: %m" +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒ¤áƒ˜áƒ“áƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: %m" + +#: postmaster/syslogger.c:629 postmaster/syslogger.c:643 +#, c-format +msgid "could not create pipe for syslog: %m" +msgstr "სისტემური ჟურნáƒáƒšáƒ˜áƒ¡áƒ—ვის ფáƒáƒ˜áƒ¤áƒ˜áƒ¡ შექმნრშეუძლებელიáƒ: %m" + +#: postmaster/syslogger.c:712 +#, c-format +msgid "could not fork system logger: %m" +msgstr "სისტემის ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: postmaster/syslogger.c:731 +#, c-format +msgid "redirecting log output to logging collector process" +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ებრჟურნáƒáƒšáƒ˜áƒ¡ შემგრáƒáƒ•ებლის პრáƒáƒªáƒ”სისკენ" + +#: postmaster/syslogger.c:732 +#, c-format +msgid "Future log output will appear in directory \"%s\"." +msgstr "" + +#: postmaster/syslogger.c:740 +#, c-format +msgid "could not redirect stdout: %m" +msgstr "stdout-ის გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ების შეცდáƒáƒ›áƒ: %m" + +#: postmaster/syslogger.c:745 postmaster/syslogger.c:762 +#, c-format +msgid "could not redirect stderr: %m" +msgstr "stderr-ის გáƒáƒ“áƒáƒ›áƒ˜áƒ¡áƒáƒ›áƒáƒ áƒ—ების შეცდáƒáƒ›áƒ: %m" + +#: postmaster/syslogger.c:1128 +#, c-format +msgid "could not write to log file: %m\n" +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m\n" + +#: postmaster/syslogger.c:1246 +#, c-format +msgid "could not open log file \"%s\": %m" +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m" + +#: postmaster/syslogger.c:1336 +#, c-format +msgid "disabling automatic rotation (use SIGHUP to re-enable)" +msgstr "" + +#: postmaster/walsummarizer.c:384 +#, c-format +msgid "switch point from TLI %u to TLI %u is at %X/%X" +msgstr "" + +#: postmaster/walsummarizer.c:885 +#, c-format +msgid "could not find a valid record after %X/%X" +msgstr "%X/%X -ის შემდეგ სწáƒáƒ áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: postmaster/walsummarizer.c:930 +#, c-format +msgid "could not read WAL from timeline %u at %X/%X: %s" +msgstr "ვერ წáƒáƒ•იკითხე WAL დრáƒáƒ˜áƒ¡ ხáƒáƒ–იდáƒáƒœ %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X: %s" + +#: postmaster/walsummarizer.c:936 +#, c-format +msgid "could not read WAL from timeline %u at %X/%X" +msgstr "ვერ წáƒáƒ•იკითხე WAL დრáƒáƒ˜áƒ¡ ხáƒáƒ–იდáƒáƒœ %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#: postmaster/walsummarizer.c:1077 +#, c-format +msgid "summarized WAL on TLI %u from %X/%X to %X/%X" +msgstr "" + +#: postmaster/walsummarizer.c:1385 +#, c-format +msgid "timeline %u became historic, can read up to %X/%X" +msgstr "" + +#: regex/regc_pg_locale.c:244 +#, c-format +msgid "could not determine which collation to use for regular expression" +msgstr "" + +#: regex/regc_pg_locale.c:262 +#, c-format +msgid "nondeterministic collations are not supported for regular expressions" +msgstr "" + +#: repl_gram.y:318 repl_gram.y:359 +#, c-format +msgid "invalid timeline %u" +msgstr "დრáƒáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ხáƒáƒ–ი: %u" + +#: repl_scanner.l:154 +msgid "invalid streaming start location" +msgstr "ნáƒáƒ™áƒáƒ“ის დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘áƒ" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:267 replication/libpqwalreceiver/libpqwalreceiver.c:358 +#, c-format +msgid "password is required" +msgstr "პáƒáƒ áƒáƒšáƒ˜ სáƒáƒ•áƒáƒšáƒ“ებულáƒáƒ" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:268 +#, c-format +msgid "Non-superuser cannot connect if the server does not request a password." +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:269 +#, c-format +msgid "Target server's authentication method must be changed, or set password_required=false in the subscription parameters." +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:285 +#, c-format +msgid "could not clear search path: %s" +msgstr "ძებნის ბილიკების გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ების შეცდáƒáƒ›áƒ: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:331 replication/libpqwalreceiver/libpqwalreceiver.c:517 +#, c-format +msgid "invalid connection string syntax: %s" +msgstr "შეერთების სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სინტáƒáƒ¥áƒ¡áƒ˜: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#, c-format +msgid "Non-superusers must provide a password in the connection string." +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:386 +#, c-format +msgid "could not parse connection string: %s" +msgstr "შეერთების სტრიქáƒáƒœáƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:459 +#, c-format +msgid "could not receive database system identifier and timeline ID from the primary server: %s" +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:476 replication/libpqwalreceiver/libpqwalreceiver.c:763 +#, c-format +msgid "invalid response from primary server" +msgstr "ძირითáƒáƒ“ი სერვერის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ¡áƒ£áƒ®áƒ˜" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:477 +#, c-format +msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:606 replication/libpqwalreceiver/libpqwalreceiver.c:613 replication/libpqwalreceiver/libpqwalreceiver.c:643 +#, c-format +msgid "could not start WAL streaming: %s" +msgstr "wal ნáƒáƒ™áƒáƒ“ის დáƒáƒ¬áƒ§áƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:667 +#, c-format +msgid "could not send end-of-streaming message to primary: %s" +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:690 +#, c-format +msgid "unexpected result set after end-of-streaming" +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:705 +#, c-format +msgid "error while shutting down streaming COPY: %s" +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:715 +#, c-format +msgid "error reading result of streaming command: %s" +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:724 replication/libpqwalreceiver/libpqwalreceiver.c:957 +#, c-format +msgid "unexpected result after CommandComplete: %s" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი შედეგი CommandComplete-ის შემდეგ: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:751 +#, c-format +msgid "could not receive timeline history file from the primary server: %s" +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:764 +#, c-format +msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." +msgstr "" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:920 replication/libpqwalreceiver/libpqwalreceiver.c:973 replication/libpqwalreceiver/libpqwalreceiver.c:980 +#, c-format +msgid "could not receive data from WAL stream: %s" +msgstr "\"WAL\" ნáƒáƒ™áƒáƒ“იდáƒáƒœ მáƒáƒœáƒáƒªáƒ”მების მიღების შეცდáƒáƒ›áƒ: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1000 +#, c-format +msgid "could not send data to WAL stream: %s" +msgstr "'WAL' ნáƒáƒ™áƒáƒ“ისთვის მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ’ზáƒáƒ•ნრშეუძლებელიáƒ: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1101 +#, c-format +msgid "could not create replication slot \"%s\": %s" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ \"%s\" შექმნის შეცდáƒáƒ›áƒ: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1140 +#, c-format +msgid "could not alter replication slot \"%s\": %s" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ \"%s\" შეცვლრშეუძლებელიáƒ: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1174 +#, c-format +msgid "invalid query response" +msgstr "მáƒáƒ—ხáƒáƒ•ნის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ¡áƒ£áƒ®áƒ˜" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1175 +#, c-format +msgid "Expected %d fields, got %d fields." +msgstr "მáƒáƒ•ელáƒáƒ“ი %d ველს. მივიღე %d." + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1245 +#, c-format +msgid "the query interface requires a database connection" +msgstr "მáƒáƒ—ხáƒáƒ•ნის ინტერფეისს ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებრსჭირდებáƒ" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1277 +msgid "empty query" +msgstr "ცáƒáƒ áƒ˜áƒ”ლი მáƒáƒ—ხáƒáƒ•ნáƒ" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1283 +msgid "unexpected pipeline mode" +msgstr "áƒáƒ áƒ®áƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი რეჟიმი" + +#: replication/logical/applyparallelworker.c:719 +#, c-format +msgid "logical replication parallel apply worker for subscription \"%s\" has finished" +msgstr "" + +#: replication/logical/applyparallelworker.c:822 +#, c-format +msgid "lost connection to the logical replication apply worker" +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ“áƒáƒ¢áƒáƒ áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სთáƒáƒœ კáƒáƒ•შირი დáƒáƒ™áƒáƒ áƒ’ულიáƒ" + +#: replication/logical/applyparallelworker.c:1024 replication/logical/applyparallelworker.c:1026 +msgid "logical replication parallel apply worker" +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒšáƒ”ლური გáƒáƒ“áƒáƒ¢áƒáƒ áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი" + +#: replication/logical/applyparallelworker.c:1040 +#, c-format +msgid "logical replication parallel apply worker exited due to error" +msgstr "" + +#: replication/logical/applyparallelworker.c:1127 replication/logical/applyparallelworker.c:1300 +#, c-format +msgid "lost connection to the logical replication parallel apply worker" +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒšáƒ”ლური გáƒáƒ“áƒáƒ¢áƒáƒ áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სთáƒáƒœ კáƒáƒ•შირი დáƒáƒ™áƒáƒ áƒ’ულიáƒ" + +#: replication/logical/applyparallelworker.c:1180 +#, c-format +msgid "could not send data to shared-memory queue" +msgstr "გáƒáƒ–იáƒáƒ áƒ”ბული-მეხსიერების მქáƒáƒœáƒ” რიგში მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ’ზáƒáƒ•ნრშეუძლებელიáƒ" + +#: replication/logical/applyparallelworker.c:1215 +#, c-format +msgid "logical replication apply worker will serialize the remaining changes of remote transaction %u to a file" +msgstr "" + +#: replication/logical/decode.c:177 replication/logical/logical.c:141 +#, c-format +msgid "logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary" +msgstr "ლáƒáƒ’იკურ გáƒáƒ¨áƒ˜áƒ¤áƒ•რáƒáƒ¡ უქმეზე ძირითáƒáƒ“ სერვერზე \"wal_level\" >= \"logical\" ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ" + +#: replication/logical/launcher.c:334 +#, c-format +msgid "cannot start logical replication workers when max_replication_slots = 0" +msgstr "" + +#: replication/logical/launcher.c:427 +#, c-format +msgid "out of logical replication worker slots" +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბი áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜áƒ" + +#: replication/logical/launcher.c:428 replication/logical/launcher.c:514 replication/slot.c:1524 storage/lmgr/lock.c:963 storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2804 storage/lmgr/lock.c:4189 storage/lmgr/lock.c:4254 storage/lmgr/lock.c:4604 storage/lmgr/predicate.c:2464 storage/lmgr/predicate.c:2479 storage/lmgr/predicate.c:3876 +#, c-format +msgid "You might need to increase \"%s\"." +msgstr "რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, გჭირდებáƒáƒ—, \"%s\" გáƒáƒ–áƒáƒ áƒ“áƒáƒ—." + +#: replication/logical/launcher.c:513 +#, c-format +msgid "out of background worker slots" +msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების სლáƒáƒ¢áƒ”ბი áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜áƒ" + +#: replication/logical/launcher.c:720 +#, c-format +msgid "logical replication worker slot %d is empty, cannot attach" +msgstr "" + +#: replication/logical/launcher.c:729 +#, c-format +msgid "logical replication worker slot %d is already used by another worker, cannot attach" +msgstr "" + +#: replication/logical/logical.c:121 +#, c-format +msgid "logical decoding requires \"wal_level\" >= \"logical\"" +msgstr "ლáƒáƒ’იკურ გáƒáƒ¨áƒ˜áƒ¤áƒ•რáƒáƒ¡ \"wal_level\" >= \"logical\" ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ" + +#: replication/logical/logical.c:126 +#, c-format +msgid "logical decoding requires a database connection" +msgstr "ლáƒáƒ’იკურ გáƒáƒ¨áƒ˜áƒ¤áƒ•რáƒáƒ¡ ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებრესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ" + +#: replication/logical/logical.c:364 replication/logical/logical.c:518 +#, c-format +msgid "cannot use physical replication slot for logical decoding" +msgstr "ლáƒáƒ’იკური გáƒáƒ¨áƒ˜áƒ¤áƒ•რისთვის ფიზიკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: replication/logical/logical.c:369 replication/logical/logical.c:528 +#, c-format +msgid "replication slot \"%s\" was not created in this database" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\" áƒáƒ› ბáƒáƒ–áƒáƒ¨áƒ˜ áƒáƒ  შექმნილáƒ" + +#: replication/logical/logical.c:376 +#, c-format +msgid "cannot create logical replication slot in transaction that has performed writes" +msgstr "შეუძლებელირლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ შექმნრტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜, რáƒáƒ›áƒ”ლიც ჩáƒáƒ¬áƒ”რებს áƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებს" + +#: replication/logical/logical.c:539 +#, c-format +msgid "cannot use replication slot \"%s\" for logical decoding" +msgstr "ლáƒáƒ’იკური გáƒáƒ¨áƒ˜áƒ¤áƒ•რისთვის რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ \"%s\" გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: replication/logical/logical.c:541 +#, c-format +msgid "This slot is being synchronized from the primary server." +msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს áƒáƒ› სლáƒáƒ¢áƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ძირითáƒáƒ“ი სერვერიდáƒáƒœ." + +#: replication/logical/logical.c:542 +#, c-format +msgid "Specify another replication slot." +msgstr "მიუთითეთ სხვრრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜." + +#: replication/logical/logical.c:553 replication/logical/logical.c:560 +#, c-format +msgid "can no longer get changes from replication slot \"%s\"" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ“áƒáƒœ \"%s\" ცვლილებების მიღებრუკვე შეუძლებელიáƒ" + +#: replication/logical/logical.c:555 +#, c-format +msgid "This slot has been invalidated because it exceeded the maximum reserved size." +msgstr "" + +#: replication/logical/logical.c:562 +#, c-format +msgid "This slot has been invalidated because it was conflicting with recovery." +msgstr "" + +#: replication/logical/logical.c:627 +#, c-format +msgid "starting logical decoding for slot \"%s\"" +msgstr "იწყებრლáƒáƒ’იკური გáƒáƒ¨áƒ˜áƒ¤áƒ•რრსლáƒáƒ¢áƒ˜áƒ¡áƒ—ვის \"%s\"" + +#: replication/logical/logical.c:629 +#, c-format +msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." +msgstr "" + +#: replication/logical/logical.c:777 +#, c-format +msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" +msgstr "" + +#: replication/logical/logical.c:783 +#, c-format +msgid "slot \"%s\", output plugin \"%s\", in the %s callback" +msgstr "" + +#: replication/logical/logical.c:954 replication/logical/logical.c:999 replication/logical/logical.c:1044 replication/logical/logical.c:1090 +#, c-format +msgid "logical replication at prepare time requires a %s callback" +msgstr "" + +#: replication/logical/logical.c:1322 replication/logical/logical.c:1371 replication/logical/logical.c:1412 replication/logical/logical.c:1498 replication/logical/logical.c:1547 +#, c-format +msgid "logical streaming requires a %s callback" +msgstr "" + +#: replication/logical/logical.c:1457 +#, c-format +msgid "logical streaming at prepare time requires a %s callback" +msgstr "" + +#: replication/logical/logicalfuncs.c:123 +#, c-format +msgid "slot name must not be null" +msgstr "სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი ნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" + +#: replication/logical/logicalfuncs.c:139 +#, c-format +msgid "options array must not be null" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრების მáƒáƒ¡áƒ˜áƒ•ი ნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" + +#: replication/logical/logicalfuncs.c:156 +#, c-format +msgid "array must be one-dimensional" +msgstr "მáƒáƒ¡áƒ˜áƒ•ი ერთგáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœáƒ˜ უნდრიყáƒáƒ¡" + +#: replication/logical/logicalfuncs.c:162 +#, c-format +msgid "array must not contain nulls" +msgstr "მáƒáƒ¡áƒ˜áƒ•ი ნულáƒáƒ•áƒáƒœ მნიშვნელáƒáƒ‘ებს áƒáƒ  უნდრშეიცáƒáƒ•დეს" + +#: replication/logical/logicalfuncs.c:177 utils/adt/json.c:1406 utils/adt/jsonb.c:1304 +#, c-format +msgid "array must have even number of elements" +msgstr "მáƒáƒ¡áƒ˜áƒ•ს ლუწი რáƒáƒáƒ“ენáƒáƒ‘ის ელემენტები უნდრჰქáƒáƒœáƒ“ეს" + +#: replication/logical/logicalfuncs.c:224 +#, c-format +msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" +msgstr "" + +#: replication/logical/origin.c:190 +#, c-format +msgid "cannot query or manipulate replication origin when \"max_replication_slots\" is 0" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ წყáƒáƒ áƒáƒ“áƒáƒœ გáƒáƒ›áƒáƒ—ხáƒáƒ•რáƒáƒœ მისით მáƒáƒœáƒ˜áƒžáƒ£áƒšáƒáƒªáƒ˜áƒ შეუძლებელიáƒ, რáƒáƒªáƒ \"max_replicaion_slots\" ნულს უდრის" + +#: replication/logical/origin.c:195 +#, c-format +msgid "cannot manipulate replication origins during recovery" +msgstr "áƒáƒ¦áƒ“გენისრრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ წყáƒáƒ áƒáƒ”ბს ვერ შეცვლით" + +#: replication/logical/origin.c:240 +#, c-format +msgid "replication origin \"%s\" does not exist" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ წყáƒáƒ áƒ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: replication/logical/origin.c:331 +#, c-format +msgid "could not find free replication origin ID" +msgstr "თáƒáƒ•ისუფáƒáƒšáƒ˜ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ წყáƒáƒ áƒáƒ¡ ID-ის პáƒáƒ•ნრშეუძლებელიáƒ" + +#: replication/logical/origin.c:365 +#, c-format +msgid "could not drop replication origin with ID %d, in use by PID %d" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ წყáƒáƒ áƒáƒ¡, ID-ით %d გáƒáƒ“áƒáƒ’დების შეცდáƒáƒ›áƒ. გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრPID-ის მიერ %d" + +#: replication/logical/origin.c:492 +#, c-format +msgid "replication origin with ID %d does not exist" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ წყáƒáƒ áƒ ID-ით %d áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: replication/logical/origin.c:757 +#, c-format +msgid "replication checkpoint has wrong magic %u instead of %u" +msgstr "" + +#: replication/logical/origin.c:798 +#, c-format +msgid "could not find free replication state, increase \"max_replication_slots\"" +msgstr "თáƒáƒ•ისუფáƒáƒšáƒ˜ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის პáƒáƒ•ნრშეუძლებელიáƒ. გáƒáƒ–áƒáƒ áƒ“ეთ \"max_replication_slots\"" + +#: replication/logical/origin.c:806 +#, c-format +msgid "recovered replication state of node %d to %X/%X" +msgstr "áƒáƒ¦áƒ“გენილირკვáƒáƒœáƒ«áƒ˜áƒ¡ %d რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘რ%X/%X-მდე" + +#: replication/logical/origin.c:816 +#, c-format +msgid "replication slot checkpoint has wrong checksum %u, expected %u" +msgstr "" + +#: replication/logical/origin.c:944 replication/logical/origin.c:1143 +#, c-format +msgid "replication origin with ID %d is already active for PID %d" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ წყáƒáƒ áƒ ID-ით %d უკვე áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ PID-სთვის %d" + +#: replication/logical/origin.c:955 replication/logical/origin.c:1156 +#, c-format +msgid "could not find free replication state slot for replication origin with ID %d" +msgstr "" + +#: replication/logical/origin.c:957 replication/logical/origin.c:1158 replication/slot.c:2384 +#, c-format +msgid "Increase \"max_replication_slots\" and try again." +msgstr "გáƒáƒ–áƒáƒ áƒ“ეთ \"max_replication_slots\"-ის მნიშვნელáƒáƒ‘რდრთáƒáƒ•იდáƒáƒœ სცáƒáƒ“ეთ." + +#: replication/logical/origin.c:1114 +#, c-format +msgid "cannot setup replication origin when one is already setup" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ წყáƒáƒ áƒáƒ¡ მáƒáƒ áƒ’ებრმáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ ის უკვე მáƒáƒ áƒ’ებულიáƒ, შეუძლებელიáƒ" + +#: replication/logical/origin.c:1199 replication/logical/origin.c:1415 replication/logical/origin.c:1435 +#, c-format +msgid "no replication origin is configured" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ წყáƒáƒ áƒ მáƒáƒ áƒ’ებული áƒáƒ áƒáƒ" + +#: replication/logical/origin.c:1285 +#, c-format +msgid "replication origin name \"%s\" is reserved" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ წყáƒáƒ áƒáƒ¡ სáƒáƒ®áƒ”ლი \"%s\" დáƒáƒªáƒ£áƒšáƒ˜áƒ" + +#: replication/logical/origin.c:1287 +#, c-format +msgid "Origin names \"%s\", \"%s\", and names starting with \"pg_\" are reserved." +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სáƒáƒ®áƒ”ლები, \"%s\", \"%s\" დრსáƒáƒ®áƒ”ლები, რáƒáƒ›áƒšáƒ”ბიც \"pg_\"-ით იწყებáƒ, დáƒáƒ áƒ”ზერვებულიáƒ." + +#: replication/logical/relation.c:242 +#, c-format +msgid "\"%s\"" +msgstr "\"%s\"" + +#: replication/logical/relation.c:245 +#, c-format +msgid ", \"%s\"" +msgstr ", \"%s\"" + +#: replication/logical/relation.c:251 +#, c-format +msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" +msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" +msgstr[0] "" +msgstr[1] "" + +#: replication/logical/relation.c:306 +#, c-format +msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" +msgstr "" + +#: replication/logical/relation.c:398 +#, c-format +msgid "logical replication target relation \"%s.%s\" does not exist" +msgstr "" + +#: replication/logical/reorderbuffer.c:3970 +#, c-format +msgid "could not write to data file for XID %u: %m" +msgstr "შეცდáƒáƒ›áƒ მáƒáƒœáƒáƒªáƒ”მის ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რისáƒáƒ¡ XID-სთვის %u: %m" + +#: replication/logical/reorderbuffer.c:4316 replication/logical/reorderbuffer.c:4341 +#, c-format +msgid "could not read from reorderbuffer spill file: %m" +msgstr "" + +#: replication/logical/reorderbuffer.c:4320 replication/logical/reorderbuffer.c:4345 +#, c-format +msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" +msgstr "" + +#: replication/logical/reorderbuffer.c:4595 +#, c-format +msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" +msgstr "" + +#: replication/logical/reorderbuffer.c:5091 +#, c-format +msgid "could not read from file \"%s\": read %d instead of %d bytes" +msgstr "" + +#: replication/logical/slotsync.c:215 +#, c-format +msgid "could not sync slot \"%s\" as remote slot precedes local slot" +msgstr "" + +#: replication/logical/slotsync.c:217 +#, c-format +msgid "Remote slot has LSN %X/%X and catalog xmin %u, but local slot has LSN %X/%X and catalog xmin %u." +msgstr "" + +#: replication/logical/slotsync.c:459 +#, c-format +msgid "dropped replication slot \"%s\" of dbid %u" +msgstr "წáƒáƒ˜áƒ¨áƒáƒšáƒ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\" dbid-სთვის %u" + +#: replication/logical/slotsync.c:579 +#, c-format +msgid "could not sync slot \"%s\"" +msgstr "სლáƒáƒ¢áƒ˜áƒ¡ \"%s\" სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ შეუძლებელიáƒ" + +#: replication/logical/slotsync.c:580 +#, c-format +msgid "Logical decoding cannot find consistent point from local slot's LSN %X/%X." +msgstr "" + +#: replication/logical/slotsync.c:589 +#, c-format +msgid "newly created slot \"%s\" is sync-ready now" +msgstr "" + +#: replication/logical/slotsync.c:628 +#, c-format +msgid "skipping slot synchronization as the received slot sync LSN %X/%X for slot \"%s\" is ahead of the standby position %X/%X" +msgstr "" + +#: replication/logical/slotsync.c:650 +#, c-format +msgid "exiting from slot synchronization because same name slot \"%s\" already exists on the standby" +msgstr "" + +#: replication/logical/slotsync.c:819 +#, c-format +msgid "could not fetch failover logical slots info from the primary server: %s" +msgstr "ვერ გáƒáƒ›áƒáƒ•ითხáƒáƒ•ე გáƒáƒ“áƒáƒ áƒ—ვის ლáƒáƒ’იკური სლáƒáƒ¢áƒ”ბის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ ძირითáƒáƒ“ი სერვერიდáƒáƒœ: %s" + +#: replication/logical/slotsync.c:965 +#, c-format +msgid "could not fetch primary_slot_name \"%s\" info from the primary server: %s" +msgstr "ვერ გáƒáƒ›áƒáƒ•ითხáƒáƒ•ე prmary_slot_name \"%s\"-ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ ძირითáƒáƒ“ი სერვერიდáƒáƒœ: %s" + +#: replication/logical/slotsync.c:967 +#, c-format +msgid "Check if primary_slot_name is configured correctly." +msgstr "" + +#: replication/logical/slotsync.c:987 +#, c-format +msgid "cannot synchronize replication slots from a standby server" +msgstr "უქმე სერვერიდáƒáƒœ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ შეუძლებელიáƒ" + +#: replication/logical/slotsync.c:995 +#, c-format +msgid "slot synchronization requires valid primary_slot_name" +msgstr "" + +#. translator: second %s is a GUC variable name +#: replication/logical/slotsync.c:997 +#, c-format +msgid "The replication slot \"%s\" specified by %s does not exist on the primary server." +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\", რáƒáƒ›áƒ”ლიც %s-მრმიუთითáƒ, áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს ძირითáƒáƒ“ სერვერზე." + +#: replication/logical/slotsync.c:1029 +#, c-format +msgid "slot synchronization requires dbname to be specified in %s" +msgstr "სლáƒáƒ¢áƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒáƒ¡ \"%s\"-ში ბáƒáƒ–ის სáƒáƒ®áƒ”ლის მითითებრსჭირდებáƒ" + +#: replication/logical/slotsync.c:1050 +#, c-format +msgid "slot synchronization requires \"wal_level\" >= \"logical\"" +msgstr "სლáƒáƒ¢áƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒáƒ¡ \"wal_level\" >= \"logical\" ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ" + +#: replication/logical/slotsync.c:1063 replication/logical/slotsync.c:1091 +#, c-format +msgid "slot synchronization requires %s to be defined" +msgstr "სლáƒáƒ¢áƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒáƒ¡ %s-ის áƒáƒ¦áƒ¬áƒ”რრსჭირდებáƒ" + +#: replication/logical/slotsync.c:1077 +#, c-format +msgid "slot synchronization requires %s to be enabled" +msgstr "სლáƒáƒ¢áƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒáƒ¡ %s-ის ჩáƒáƒ áƒ—ვრსჭირდებáƒ" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1129 +#, c-format +msgid "slot sync worker will shutdown because %s is disabled" +msgstr "" + +#: replication/logical/slotsync.c:1138 +#, c-format +msgid "slot sync worker will restart because of a parameter change" +msgstr "" + +#: replication/logical/slotsync.c:1162 +#, c-format +msgid "slot sync worker is shutting down on receiving SIGINT" +msgstr "" + +#: replication/logical/slotsync.c:1287 +#, c-format +msgid "cannot synchronize replication slots when standby promotion is ongoing" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ შეუძლებელირუქმეს წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის მიმდინáƒáƒ áƒ”áƒáƒ‘ისáƒáƒ¡" + +#: replication/logical/slotsync.c:1295 +#, c-format +msgid "cannot synchronize replication slots concurrently" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის ერთდრáƒáƒ£áƒšáƒ˜ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ შეუძლებელიáƒ" + +#: replication/logical/slotsync.c:1403 +#, c-format +msgid "slot sync worker started" +msgstr "სლáƒáƒ¢áƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი გáƒáƒ”შვáƒ" + +#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:900 replication/walreceiver.c:307 +#, c-format +msgid "could not connect to the primary server: %s" +msgstr "შეუძლებელირმიერთებრძირითáƒáƒ“ სერვერთáƒáƒœ: %s" + +#: replication/logical/snapbuild.c:643 +#, c-format +msgid "initial slot snapshot too large" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სლáƒáƒ¢áƒ˜áƒ¡ სწრáƒáƒ¤áƒ˜ áƒáƒ¡áƒšáƒ˜ ძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ" + +#: replication/logical/snapbuild.c:697 +#, c-format +msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" +msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" +msgstr[0] "" +msgstr[1] "" + +#: replication/logical/snapbuild.c:1392 replication/logical/snapbuild.c:1484 replication/logical/snapbuild.c:2000 +#, c-format +msgid "logical decoding found consistent point at %X/%X" +msgstr "" + +#: replication/logical/snapbuild.c:1394 +#, c-format +msgid "There are no running transactions." +msgstr "გáƒáƒ¨áƒ•ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის გáƒáƒ áƒ”შე." + +#: replication/logical/snapbuild.c:1436 +#, c-format +msgid "logical decoding found initial starting point at %X/%X" +msgstr "" + +#: replication/logical/snapbuild.c:1438 replication/logical/snapbuild.c:1462 +#, c-format +msgid "Waiting for transactions (approximately %d) older than %u to end." +msgstr "" + +#: replication/logical/snapbuild.c:1460 +#, c-format +msgid "logical decoding found initial consistent point at %X/%X" +msgstr "" + +#: replication/logical/snapbuild.c:1486 +#, c-format +msgid "There are no old transactions anymore." +msgstr "ძველი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბი áƒáƒ¦áƒáƒ  დáƒáƒ áƒ©áƒ." + +#: replication/logical/snapbuild.c:1887 +#, c-format +msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" +msgstr "" + +#: replication/logical/snapbuild.c:1893 +#, c-format +msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" +msgstr "" + +#: replication/logical/snapbuild.c:1934 +#, c-format +msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" +msgstr "" + +#: replication/logical/snapbuild.c:2002 +#, c-format +msgid "Logical decoding will begin using saved snapshot." +msgstr "ლáƒáƒ’იკური გáƒáƒ¨áƒ˜áƒ¤áƒ•რრშენáƒáƒ®áƒ£áƒšáƒ˜ სწრáƒáƒ¤áƒ˜ áƒáƒ¡áƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებáƒáƒ¡ დáƒáƒ˜áƒ¬áƒ§áƒ”ბს." + +#: replication/logical/snapbuild.c:2109 +#, c-format +msgid "could not parse file name \"%s\"" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: \"%s\"" + +#: replication/logical/tablesync.c:161 +#, c-format +msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" +msgstr "" + +#: replication/logical/tablesync.c:641 +#, c-format +msgid "logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled" +msgstr "" + +#: replication/logical/tablesync.c:827 replication/logical/tablesync.c:969 +#, c-format +msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" +msgstr "" + +#: replication/logical/tablesync.c:834 +#, c-format +msgid "table \"%s.%s\" not found on publisher" +msgstr "ცხრილი \"%s.%s\" გáƒáƒ›áƒáƒ›áƒªáƒ”მელზე ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" + +#: replication/logical/tablesync.c:892 +#, c-format +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "" + +#: replication/logical/tablesync.c:1071 +#, c-format +msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" +msgstr "" + +#: replication/logical/tablesync.c:1230 +#, c-format +msgid "could not start initial contents copy for table \"%s.%s\": %s" +msgstr "" + +#: replication/logical/tablesync.c:1429 +#, c-format +msgid "table copy could not start transaction on publisher: %s" +msgstr "ცხრილის კáƒáƒžáƒ˜áƒ áƒ”ბáƒáƒ› ვერ გáƒáƒ£áƒ¨áƒ•რტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ გáƒáƒ›áƒáƒ›áƒªáƒ”მელზე: %s" + +#: replication/logical/tablesync.c:1472 +#, c-format +msgid "replication origin \"%s\" already exists" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ წყáƒáƒ áƒ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: replication/logical/tablesync.c:1505 replication/logical/worker.c:2361 +#, c-format +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "" + +#: replication/logical/tablesync.c:1518 +#, c-format +msgid "table copy could not finish transaction on publisher: %s" +msgstr "ცხრილის კáƒáƒžáƒ˜áƒ áƒ”ბáƒáƒ› ვერ დáƒáƒáƒ¡áƒ áƒ£áƒšáƒ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ გáƒáƒ›áƒáƒ›áƒªáƒ”მელზე: %s" + +#: replication/logical/worker.c:481 +#, c-format +msgid "logical replication parallel apply worker for subscription \"%s\" will stop" +msgstr "" + +#: replication/logical/worker.c:483 +#, c-format +msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." +msgstr "" + +#: replication/logical/worker.c:852 replication/logical/worker.c:967 +#, c-format +msgid "incorrect binary data format in logical replication column %d" +msgstr "" + +#: replication/logical/worker.c:2500 +#, c-format +msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" +msgstr "" + +#: replication/logical/worker.c:2507 +#, c-format +msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" +msgstr "" + +#: replication/logical/worker.c:3371 +#, c-format +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ შეტყáƒáƒ‘ინების ტიპი \"??? (%d)\"" + +#: replication/logical/worker.c:3543 +#, c-format +msgid "data stream from publisher has ended" +msgstr "გáƒáƒ›áƒáƒ›áƒªáƒ”მლის მáƒáƒœáƒáƒªáƒ”მების ნáƒáƒ™áƒáƒ“ი დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ" + +#: replication/logical/worker.c:3697 +#, c-format +msgid "terminating logical replication worker due to timeout" +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის შეწყვეტრმáƒáƒšáƒáƒ“ინის ვáƒáƒ“ის áƒáƒ›áƒáƒ¬áƒ£áƒ áƒ•ის გáƒáƒ›áƒ" + +#: replication/logical/worker.c:3891 +#, c-format +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" +msgstr "" + +#: replication/logical/worker.c:3905 +#, c-format +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" +msgstr "" + +#: replication/logical/worker.c:3936 +#, c-format +msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" +msgstr "" + +#: replication/logical/worker.c:3940 +#, c-format +msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" +msgstr "" + +#: replication/logical/worker.c:3954 +#, c-format +msgid "logical replication parallel apply worker for subscription \"%s\" will stop because the subscription owner's superuser privileges have been revoked" +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒšáƒ”ლური გáƒáƒ“áƒáƒ¢áƒáƒ áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი გáƒáƒ›áƒáƒ¬áƒ”რისთვის \"%s\" გáƒáƒ©áƒ”რდებáƒ, რáƒáƒ“გáƒáƒœ გáƒáƒ›áƒáƒ¬áƒ”რის მფლáƒáƒ‘ელის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პრივილეგიები გáƒáƒ£áƒ¥áƒ›áƒ“áƒ" + +#: replication/logical/worker.c:3958 +#, c-format +msgid "logical replication worker for subscription \"%s\" will restart because the subscription owner's superuser privileges have been revoked" +msgstr "" + +#: replication/logical/worker.c:4478 +#, c-format +msgid "subscription has no replication slot set" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რáƒáƒ¡ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ დáƒáƒ§áƒ”ნებული áƒáƒ  áƒáƒ¥áƒ•ს" + +#: replication/logical/worker.c:4591 +#, c-format +msgid "logical replication worker for subscription %u will not start because the subscription was removed during startup" +msgstr "" + +#: replication/logical/worker.c:4607 +#, c-format +msgid "logical replication worker for subscription \"%s\" will not start because the subscription was disabled during startup" +msgstr "" + +#: replication/logical/worker.c:4631 +#, c-format +msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" +msgstr "" + +#: replication/logical/worker.c:4636 +#, c-format +msgid "logical replication apply worker for subscription \"%s\" has started" +msgstr "გáƒáƒ”შვრლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ“áƒáƒ¢áƒáƒ áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი გáƒáƒ›áƒáƒ¬áƒ”რისთვის \"%s\"" + +#: replication/logical/worker.c:4734 +#, c-format +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რრ\"%s\" გáƒáƒ˜áƒ—იშრშეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ" + +#: replication/logical/worker.c:4782 +#, c-format +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ იწყებს ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒáƒ¡ მისáƒáƒ›áƒáƒ áƒ—ზე LSN %X/%X" + +#: replication/logical/worker.c:4796 +#, c-format +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "ლáƒáƒ’იკურმრრეპლიკáƒáƒªáƒ˜áƒáƒ› დáƒáƒáƒ¡áƒ áƒ£áƒšáƒ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒ•ებრმისáƒáƒ›áƒáƒ áƒ—ზე LSN %X/%X" + +#: replication/logical/worker.c:4878 +#, c-format +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "skip-LSN გáƒáƒ›áƒáƒ¬áƒ”რისთვის \"%s\" გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებულიáƒ" + +#: replication/logical/worker.c:4879 +#, c-format +msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." +msgstr "" + +#: replication/logical/worker.c:4905 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" +msgstr "" + +#: replication/logical/worker.c:4909 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" +msgstr "" + +#: replication/logical/worker.c:4914 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" +msgstr "" + +#: replication/logical/worker.c:4925 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u" +msgstr "" + +#: replication/logical/worker.c:4932 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" +msgstr "" + +#: replication/logical/worker.c:4943 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u" +msgstr "" + +#: replication/logical/worker.c:4951 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" +msgstr "" + +#: replication/pgoutput/pgoutput.c:315 +#, c-format +msgid "invalid proto_version" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ proto_version" + +#: replication/pgoutput/pgoutput.c:320 +#, c-format +msgid "proto_version \"%s\" out of range" +msgstr "proto_version \"%s\" დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: replication/pgoutput/pgoutput.c:337 +#, c-format +msgid "invalid publication_names syntax" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ publication_names syntax" + +#: replication/pgoutput/pgoutput.c:407 +#, c-format +msgid "proto_version option missing" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი proto_version მითითებული áƒáƒ áƒáƒ" + +#: replication/pgoutput/pgoutput.c:411 +#, c-format +msgid "publication_names option missing" +msgstr "áƒáƒ™áƒšáƒ პáƒáƒ áƒáƒ›áƒ”ტრი publication_names" + +#: replication/pgoutput/pgoutput.c:452 +#, c-format +msgid "client sent proto_version=%d but server only supports protocol %d or lower" +msgstr "კლიენტმრგáƒáƒ›áƒáƒáƒ’ზáƒáƒ•ნრproto_version=%d მáƒáƒ’რáƒáƒ› სერვერს მხáƒáƒšáƒáƒ“ %d პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ დრქვემáƒáƒ— გáƒáƒáƒ©áƒœáƒ˜áƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რáƒ" + +#: replication/pgoutput/pgoutput.c:458 +#, c-format +msgid "client sent proto_version=%d but server only supports protocol %d or higher" +msgstr "კლიენტმრგáƒáƒ›áƒáƒáƒ’ზáƒáƒ•ნრproto_version=%d მáƒáƒ’რáƒáƒ› სერვერს მხáƒáƒšáƒáƒ“ %d პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ დრზემáƒáƒ— გáƒáƒáƒ©áƒœáƒ˜áƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რáƒ" + +#: replication/pgoutput/pgoutput.c:473 +#, c-format +msgid "requested proto_version=%d does not support streaming, need %d or higher" +msgstr "" + +#: replication/pgoutput/pgoutput.c:479 +#, c-format +msgid "requested proto_version=%d does not support parallel streaming, need %d or higher" +msgstr "" + +#: replication/pgoutput/pgoutput.c:484 +#, c-format +msgid "streaming requested, but not supported by output plugin" +msgstr "" + +#: replication/pgoutput/pgoutput.c:498 +#, c-format +msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" +msgstr "" + +#: replication/pgoutput/pgoutput.c:503 +#, c-format +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "" + +#: replication/slot.c:260 +#, c-format +msgid "replication slot name \"%s\" is too short" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი \"%s\" ძáƒáƒšáƒ˜áƒáƒœ მáƒáƒ™áƒšáƒ”áƒ" + +#: replication/slot.c:269 +#, c-format +msgid "replication slot name \"%s\" is too long" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი \"%s\" ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#: replication/slot.c:282 +#, c-format +msgid "replication slot name \"%s\" contains invalid character" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი \"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  სიმბáƒáƒšáƒáƒ¡ შეიცáƒáƒ•ს" + +#: replication/slot.c:284 +#, c-format +msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." +msgstr "" + +#: replication/slot.c:333 +#, c-format +msgid "cannot enable failover for a replication slot created on the standby" +msgstr "" + +#: replication/slot.c:345 replication/slot.c:849 +#, c-format +msgid "cannot enable failover for a temporary replication slot" +msgstr "დრáƒáƒ”ბითი რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡áƒ—ვის გáƒáƒ“áƒáƒ áƒ—ვის ჩáƒáƒ áƒ—ვრშეუძლებელიáƒ" + +#: replication/slot.c:370 +#, c-format +msgid "replication slot \"%s\" already exists" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: replication/slot.c:380 +#, c-format +msgid "all replication slots are in use" +msgstr "ყველრრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: replication/slot.c:381 +#, c-format +msgid "Free one or increase \"max_replication_slots\"." +msgstr "გáƒáƒáƒ—áƒáƒ•ისუფლეთ ერთი მáƒáƒ˜áƒœáƒª áƒáƒœ გáƒáƒ–áƒáƒ áƒ“ეთ \"max_replication_slots\"." + +#: replication/slot.c:560 replication/slot.c:2453 replication/slotfuncs.c:661 utils/activity/pgstat_replslot.c:56 utils/adt/genfile.c:728 +#, c-format +msgid "replication slot \"%s\" does not exist" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" + +#: replication/slot.c:606 replication/slot.c:1337 +#, c-format +msgid "replication slot \"%s\" is active for PID %d" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ (%s) áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ PID-ისთვის %d" + +#: replication/slot.c:638 +#, c-format +msgid "acquired logical replication slot \"%s\"" +msgstr "მივიღე ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\"" + +#: replication/slot.c:640 +#, c-format +msgid "acquired physical replication slot \"%s\"" +msgstr "მივიღე ფიზიკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\"" + +#: replication/slot.c:729 +#, c-format +msgid "released logical replication slot \"%s\"" +msgstr "გáƒáƒ—áƒáƒ•ისუფლდრლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\"" + +#: replication/slot.c:731 +#, c-format +msgid "released physical replication slot \"%s\"" +msgstr "გáƒáƒ—áƒáƒ•ისუფლდრფიზიკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\"" + +#: replication/slot.c:797 +#, c-format +msgid "cannot drop replication slot \"%s\"" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ \"%s\" წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: replication/slot.c:798 replication/slot.c:829 +#, c-format +msgid "This slot is being synced from the primary server." +msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს áƒáƒ› სლáƒáƒ¢áƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ძირითáƒáƒ“ი სერვერიდáƒáƒœ." + +#: replication/slot.c:816 +#, c-format +msgid "cannot use %s with a physical replication slot" +msgstr "%s-ის გáƒáƒ›áƒáƒ§áƒ”ნებრფიზიკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ—áƒáƒœ ერთáƒáƒ“ შეუძლებელიáƒ" + +#: replication/slot.c:828 +#, c-format +msgid "cannot alter replication slot \"%s\"" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ \"%s\" შეცვლრშეუძლებელიáƒ" + +#: replication/slot.c:838 +#, c-format +msgid "cannot enable failover for a replication slot on the standby" +msgstr "" + +#: replication/slot.c:969 replication/slot.c:1927 replication/slot.c:2311 +#, c-format +msgid "could not remove directory \"%s\"" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: replication/slot.c:1372 +#, c-format +msgid "replication slots can only be used if \"max_replication_slots\" > 0" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრშესáƒáƒ«áƒšáƒ”ბელიáƒ, მხáƒáƒšáƒáƒ“, რáƒáƒªáƒ \"max_replication_slots\" > 0" + +#: replication/slot.c:1377 +#, c-format +msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრშესáƒáƒ«áƒšáƒ”ბელიáƒ, მხáƒáƒšáƒáƒ“, რáƒáƒªáƒ \"wal_level\" >= \"replica\"" + +#: replication/slot.c:1389 +#, c-format +msgid "permission denied to use replication slots" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნების წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: replication/slot.c:1390 +#, c-format +msgid "Only roles with the %s attribute may use replication slots." +msgstr "" + +#: replication/slot.c:1498 +#, c-format +msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu byte." +msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." +msgstr[0] "" +msgstr[1] "" + +#: replication/slot.c:1506 +#, c-format +msgid "The slot conflicted with xid horizon %u." +msgstr "სლáƒáƒ¢áƒ˜ კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ¨áƒ˜áƒ XID-ის ჰáƒáƒ áƒ˜áƒ–áƒáƒœáƒ¢áƒ—áƒáƒœ %u." + +#: replication/slot.c:1511 +msgid "Logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary server." +msgstr "ლáƒáƒ’იკურ გáƒáƒ¨áƒ˜áƒ¤áƒ•რáƒáƒ¡ უქმეზე ძირითáƒáƒ“ სერვერზე \"wal_level\" >= \"logical\" ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ." + +#: replication/slot.c:1519 +#, c-format +msgid "terminating process %d to release replication slot \"%s\"" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ (%2$s) გáƒáƒ¡áƒáƒ—áƒáƒ•ისუფლებლáƒáƒ“ მáƒáƒ®áƒ“ებრპრáƒáƒªáƒ”სის მáƒáƒ™áƒ•ლáƒ: %1$d" + +#: replication/slot.c:1521 +#, c-format +msgid "invalidating obsolete replication slot \"%s\"" +msgstr "მáƒáƒ«áƒ•ელებული რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ (\"%s\") áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ გáƒáƒ›áƒáƒªáƒ®áƒáƒ“ებáƒ" + +#: replication/slot.c:2249 +#, c-format +msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ (%s) ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ’იური რიცხვი: %u (უნდრიყáƒáƒ¡ %u)" + +#: replication/slot.c:2256 +#, c-format +msgid "replication slot file \"%s\" has unsupported version %u" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი ვერსირ%u" + +#: replication/slot.c:2263 +#, c-format +msgid "replication slot file \"%s\" has corrupted length %u" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ–იáƒáƒœáƒ”ბული სიგრძე: %u" + +#: replication/slot.c:2299 +#, c-format +msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" +msgstr "" + +#: replication/slot.c:2333 +#, c-format +msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜\"%s\" áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› \"wal_level\" < \"logical\"" + +#: replication/slot.c:2335 +#, c-format +msgid "Change \"wal_level\" to be \"logical\" or higher." +msgstr "შეცვáƒáƒšáƒ”თ \"wal_level\" \"logical\"-ზე áƒáƒœ უფრრმáƒáƒ¦áƒáƒšáƒ–ე." + +#: replication/slot.c:2339 +#, c-format +msgid "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" +msgstr "ფიზიკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜\"%s\" áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› \"wal_level\" < \"replica\"" + +#: replication/slot.c:2341 +#, c-format +msgid "Change \"wal_level\" to be \"replica\" or higher." +msgstr "შეცვáƒáƒšáƒ”თ \"wal_level\" \"replica\"-ზე áƒáƒœ ზემáƒáƒ—." + +#: replication/slot.c:2383 +#, c-format +msgid "too many replication slots active before shutdown" +msgstr "გáƒáƒ›áƒáƒ áƒ—ვáƒáƒ›áƒ“ე მეტისმეტáƒáƒ“ ბევრი რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ იყრáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜" + +#: replication/slot.c:2461 +#, c-format +msgid "\"%s\" is not a physical replication slot" +msgstr "\"%s\" ფიზიკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ áƒáƒ áƒáƒ" + +#: replication/slot.c:2637 +#, c-format +msgid "replication slot \"%s\" specified in parameter %s does not exist" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ›áƒ \"%s\" მიუთითრპáƒáƒ áƒáƒ›áƒ”ტრი %s, რáƒáƒ›áƒ”ლიც áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: replication/slot.c:2639 replication/slot.c:2680 replication/slot.c:2695 +#, c-format +msgid "Logical replication is waiting on the standby associated with \"%s\"." +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ \"%s\"-სთáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒ áƒ”ბულ უქმეს ელáƒáƒ“ებáƒ." + +#: replication/slot.c:2641 +#, c-format +msgid "Consider creating the slot \"%s\" or amend parameter %s." +msgstr "გáƒáƒœáƒ˜áƒ®áƒ˜áƒšáƒ”თ, შექმნáƒáƒ— სლáƒáƒ¢áƒ˜ \"%s\", áƒáƒœ მიáƒáƒ¬áƒ”რეთ პáƒáƒ áƒáƒ›áƒ”ტრი %s." + +#: replication/slot.c:2658 +#, c-format +msgid "cannot have logical replication slot \"%s\" in parameter %s" +msgstr "ვერ გექნებáƒáƒ— ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\" პáƒáƒ áƒáƒ›áƒ”ტრში %s" + +#: replication/slot.c:2660 +#, c-format +msgid "Logical replication is waiting for correction on \"%s\"." +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ ელáƒáƒ“ებრგáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒáƒ¡ \"%s\"-ზე." + +#: replication/slot.c:2662 +#, c-format +msgid "Consider removing logical slot \"%s\" from parameter %s." +msgstr "" + +#: replication/slot.c:2678 +#, c-format +msgid "physical slot \"%s\" specified in parameter %s has been invalidated" +msgstr "" + +#: replication/slot.c:2682 +#, c-format +msgid "Consider dropping and recreating the slot \"%s\" or amend parameter %s." +msgstr "გáƒáƒœáƒ˜áƒ®áƒ˜áƒšáƒ”თ მáƒáƒªáƒ˜áƒšáƒ”ბრáƒáƒœ თáƒáƒ•იდáƒáƒœ შექმნრსლáƒáƒ¢áƒ˜áƒ¡áƒ—ვის \"%s\" áƒáƒœ მიáƒáƒ¬áƒ”რეთ პáƒáƒ áƒáƒ›áƒ”ტრი %s." + +#: replication/slot.c:2693 +#, c-format +msgid "replication slot \"%s\" specified in parameter %s does not have active_pid" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ¡ \"%s\", რáƒáƒ›áƒ”ლიც მითითებულირპáƒáƒ áƒáƒ›áƒ”ტრში %s, active_pid áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: replication/slot.c:2697 +#, c-format +msgid "Consider starting standby associated with \"%s\" or amend parameter %s." +msgstr "" + +#: replication/slotfuncs.c:526 +#, c-format +msgid "invalid target WAL LSN" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ›áƒ˜áƒ–ნე WAL LSN" + +#: replication/slotfuncs.c:548 +#, c-format +msgid "replication slot \"%s\" cannot be advanced" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ (%s) წინ წáƒáƒ¬áƒ”ვრშეუძლებელიáƒ" + +#: replication/slotfuncs.c:550 +#, c-format +msgid "This slot has never previously reserved WAL, or it has been invalidated." +msgstr "" + +#: replication/slotfuncs.c:566 +#, c-format +msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" +msgstr "" + +#: replication/slotfuncs.c:673 +#, c-format +msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" +msgstr "ფიზიკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ (%s) ლáƒáƒ’იკურ სლáƒáƒ¢áƒáƒ“ კáƒáƒžáƒ˜áƒ áƒ”ბრშეუძლებელიáƒ" + +#: replication/slotfuncs.c:675 +#, c-format +msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ (%s) ფიზიკურ სლáƒáƒ¢áƒáƒ“ კáƒáƒžáƒ˜áƒ áƒ”ბრშეუძლებელიáƒ" + +#: replication/slotfuncs.c:682 +#, c-format +msgid "cannot copy a replication slot that doesn't reserve WAL" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡, რáƒáƒ›áƒ”ლიც WAL რეზერვáƒáƒªáƒ˜áƒáƒ¡ áƒáƒ  áƒáƒ™áƒ”თებს, კáƒáƒžáƒ˜áƒ áƒ”ბრშეუძლებელიáƒ" + +#: replication/slotfuncs.c:768 +#, c-format +msgid "could not copy replication slot \"%s\"" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ კáƒáƒžáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: replication/slotfuncs.c:770 +#, c-format +msgid "The source replication slot was modified incompatibly during the copy operation." +msgstr "კáƒáƒžáƒ˜áƒ áƒ”ბის áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ შეუთáƒáƒ•სებლáƒáƒ“ შეიცვáƒáƒšáƒ." + +#: replication/slotfuncs.c:776 +#, c-format +msgid "cannot copy unfinished logical replication slot \"%s\"" +msgstr "დáƒáƒ£áƒ›áƒ—áƒáƒ•რებელი ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ კáƒáƒžáƒ˜áƒ áƒ”ბრშეუძლებელიáƒ: %s" + +#: replication/slotfuncs.c:778 +#, c-format +msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." +msgstr "" + +#: replication/slotfuncs.c:877 +#, c-format +msgid "replication slots can only be synchronized to a standby server" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ, მხáƒáƒšáƒáƒ“, უქმე სერვერთáƒáƒœáƒáƒ შესáƒáƒ«áƒšáƒ”ბელი" + +#: replication/syncrep.c:261 +#, c-format +msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" +msgstr "" + +#: replication/syncrep.c:262 replication/syncrep.c:279 +#, c-format +msgid "The transaction has already committed locally, but might not have been replicated to the standby." +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ უკვე გáƒáƒ“áƒáƒªáƒ”მულირლáƒáƒ™áƒáƒšáƒ£áƒ áƒáƒ“, მáƒáƒ’რáƒáƒ› შეიძლებრმáƒáƒ›áƒšáƒáƒ“ინეზე ჯერ რეპლიცირებული áƒáƒ áƒáƒ." + +#: replication/syncrep.c:278 +#, c-format +msgid "canceling wait for synchronous replication due to user request" +msgstr "სინქრáƒáƒœáƒ£áƒšáƒ˜ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒšáƒáƒ“ინის გáƒáƒ£áƒ¥áƒ›áƒ”ბრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ›áƒ" + +#: replication/syncrep.c:485 +#, c-format +msgid "standby \"%s\" is now a synchronous standby with priority %d" +msgstr "" + +#: replication/syncrep.c:489 +#, c-format +msgid "standby \"%s\" is now a candidate for quorum synchronous standby" +msgstr "" + +#: replication/syncrep.c:1013 +#, c-format +msgid "\"synchronous_standby_names\" parser failed" +msgstr "\"synchronous_standby_names\"-ის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის შეცდáƒáƒ›áƒ" + +#: replication/syncrep.c:1019 +#, c-format +msgid "number of synchronous standbys (%d) must be greater than zero" +msgstr "სინქრáƒáƒœáƒ£áƒšáƒ˜ მáƒáƒ›áƒšáƒáƒ“ინეების რáƒáƒáƒ“ენáƒáƒ‘რ(%d) ნულზე მეტი უნდრიყáƒáƒ¡" + +#: replication/walreceiver.c:176 +#, c-format +msgid "terminating walreceiver process due to administrator command" +msgstr "walreceiver პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ შეწყვეტრáƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის გáƒáƒ›áƒ" + +#: replication/walreceiver.c:354 +#, c-format +msgid "database system identifier differs between the primary and standby" +msgstr "ბáƒáƒ–ის სისტემის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•დებრძირითáƒáƒ“სრდრმáƒáƒ›áƒšáƒáƒ“ინეს შáƒáƒ áƒ˜áƒ¡" + +#: replication/walreceiver.c:355 +#, c-format +msgid "The primary's identifier is %s, the standby's identifier is %s." +msgstr "ძირითáƒáƒ“ი სერვერის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ %s, მáƒáƒ›áƒšáƒáƒ“ინესი კი %s." + +#: replication/walreceiver.c:366 +#, c-format +msgid "highest timeline %u of the primary is behind recovery timeline %u" +msgstr "" + +#: replication/walreceiver.c:419 +#, c-format +msgid "started streaming WAL from primary at %X/%X on timeline %u" +msgstr "" + +#: replication/walreceiver.c:423 +#, c-format +msgid "restarted WAL streaming at %X/%X on timeline %u" +msgstr "" + +#: replication/walreceiver.c:458 +#, c-format +msgid "cannot continue WAL streaming, recovery has already ended" +msgstr "" + +#: replication/walreceiver.c:502 +#, c-format +msgid "replication terminated by primary server" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ შეწყვეტილირძირითáƒáƒ“ი სერვერის მიერ" + +#: replication/walreceiver.c:503 +#, c-format +msgid "End of WAL reached on timeline %u at %X/%X." +msgstr "" + +#: replication/walreceiver.c:593 +#, c-format +msgid "terminating walreceiver due to timeout" +msgstr "walreceiver პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ შეწყვეტრმáƒáƒšáƒáƒ“ინის ვáƒáƒ“ის áƒáƒ›áƒáƒ¬áƒ£áƒ áƒ•ის გáƒáƒ›áƒ" + +#: replication/walreceiver.c:625 +#, c-format +msgid "primary server contains no more WAL on requested timeline %u" +msgstr "" + +#: replication/walreceiver.c:641 replication/walreceiver.c:1071 +#, c-format +msgid "could not close WAL segment %s: %m" +msgstr "'WAL' სეგმენტის %s დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: replication/walreceiver.c:760 +#, c-format +msgid "fetching timeline history file for timeline %u from primary server" +msgstr "" + +#: replication/walreceiver.c:959 +#, c-format +msgid "could not write to WAL segment %s at offset %d, length %lu: %m" +msgstr "'WAL'-ის სეგმენტში (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ. წáƒáƒœáƒáƒªáƒ•ლებრ%d, სიგრძე %lu: %m" + +#: replication/walsender.c:531 +#, c-format +msgid "cannot use %s with a logical replication slot" +msgstr "%s-ის გáƒáƒ›áƒáƒ§áƒ”ნებრლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ—áƒáƒœ ერთáƒáƒ“ შეუძლებელიáƒ" + +#: replication/walsender.c:635 storage/smgr/md.c:1723 +#, c-format +msgid "could not seek to end of file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") ბáƒáƒšáƒáƒ¨áƒ˜ გáƒáƒ“áƒáƒ®áƒ•ევის პრáƒáƒ‘ლემáƒ: %m" + +#: replication/walsender.c:639 +#, c-format +msgid "could not seek to beginning of file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ¨áƒ˜ გáƒáƒ“áƒáƒ®áƒ•ევის პრáƒáƒ‘ლემáƒ: %m" + +#: replication/walsender.c:853 +#, c-format +msgid "cannot use a logical replication slot for physical replication" +msgstr "" + +#: replication/walsender.c:919 +#, c-format +msgid "requested starting point %X/%X on timeline %u is not in this server's history" +msgstr "" + +#: replication/walsender.c:922 +#, c-format +msgid "This server's history forked from timeline %u at %X/%X." +msgstr "" + +#: replication/walsender.c:966 +#, c-format +msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" +msgstr "" + +#: replication/walsender.c:1160 +#, c-format +msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" +msgstr "უცნáƒáƒ‘ი მნიშვნელáƒáƒ‘რCREATE_REPLICATION_SLOT-ის პáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\": \"%s\"" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1266 +#, c-format +msgid "%s must not be called inside a transaction" +msgstr "%s ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ¡ შიგნიდáƒáƒœ áƒáƒ  უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ—" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1276 +#, c-format +msgid "%s must be called inside a transaction" +msgstr "%s ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ შიგნიდáƒáƒœ უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ—" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1282 +#, c-format +msgid "%s must be called in REPEATABLE READ isolation mode transaction" +msgstr "" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1287 +#, c-format +msgid "%s must be called in a read-only transaction" +msgstr "%s მხáƒáƒšáƒáƒ“-წáƒáƒ™áƒ˜áƒ—ხვáƒáƒ“ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜ უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ—" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1293 +#, c-format +msgid "%s must be called before any query" +msgstr "%s ყველრმáƒáƒ—ხáƒáƒ•ნáƒáƒ–ე áƒáƒ“რე უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ—" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1299 +#, c-format +msgid "%s must not be called in a subtransaction" +msgstr "%s ქვეტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜ áƒáƒ  უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ—" + +#: replication/walsender.c:1472 +#, c-format +msgid "terminating walsender process after promotion" +msgstr "walsender პრáƒáƒªáƒ”სის შეწყვეტრდáƒáƒ¬áƒ˜áƒœáƒáƒ£áƒ áƒ”ბის შემდეგ" + +#: replication/walsender.c:2000 +#, c-format +msgid "cannot execute new commands while WAL sender is in stopping mode" +msgstr "'WAL'-გáƒáƒ›áƒ’ზáƒáƒ•ნის გáƒáƒ©áƒ”რების რეჟიმში ყáƒáƒ¤áƒœáƒ˜áƒ¡ დრáƒáƒ¡ áƒáƒ®áƒáƒšáƒ˜ ბრძáƒáƒœáƒ”ბების შესრულებრშეუძლებელიáƒ" + +#: replication/walsender.c:2035 +#, c-format +msgid "cannot execute SQL commands in WAL sender for physical replication" +msgstr "ფიზიკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის WAL-ის გáƒáƒ›áƒ’ზáƒáƒ•ნში SQL ბრძáƒáƒœáƒ”ბების შესრულებრშეუძლებელიáƒ" + +#: replication/walsender.c:2068 +#, c-format +msgid "received replication command: %s" +msgstr "მიღებულირრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბáƒ: %s" + +#: replication/walsender.c:2076 tcop/fastpath.c:209 tcop/postgres.c:1138 tcop/postgres.c:1496 tcop/postgres.c:1736 tcop/postgres.c:2206 tcop/postgres.c:2644 tcop/postgres.c:2722 +#, c-format +msgid "current transaction is aborted, commands ignored until end of transaction block" +msgstr "" + +#: replication/walsender.c:2233 replication/walsender.c:2268 +#, c-format +msgid "unexpected EOF on standby connection" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი EOF მáƒáƒ›áƒšáƒáƒ“ინის მიერთებáƒáƒ–ე" + +#: replication/walsender.c:2256 +#, c-format +msgid "invalid standby message type \"%c\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ›áƒšáƒáƒ“ინის შეტყáƒáƒ‘ინების ტიპი \"%c\"" + +#: replication/walsender.c:2345 +#, c-format +msgid "unexpected message type \"%c\"" +msgstr "შეტყáƒáƒ‘ინების მáƒáƒ£áƒšáƒáƒ“ნელი ტიპი: \"%c\"" + +#: replication/walsender.c:2759 +#, c-format +msgid "terminating walsender process due to replication timeout" +msgstr "walsender პრáƒáƒªáƒ”სის შეწყვეტრრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒšáƒáƒ“ინის ვáƒáƒ“ის áƒáƒ›áƒáƒ¬áƒ£áƒ áƒ•ის გáƒáƒ›áƒ" + +#: rewrite/rewriteDefine.c:104 rewrite/rewriteDefine.c:835 +#, c-format +msgid "rule \"%s\" for relation \"%s\" already exists" +msgstr "წესი \"%s\" ურთიერთáƒáƒ‘ისთვის \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: rewrite/rewriteDefine.c:261 rewrite/rewriteDefine.c:773 +#, c-format +msgid "relation \"%s\" cannot have rules" +msgstr "ურთიერთáƒáƒ‘áƒáƒ¡ \"%s\" წესები ვერ ექნებáƒ" + +#: rewrite/rewriteDefine.c:292 +#, c-format +msgid "rule actions on OLD are not implemented" +msgstr "\"OLD\"-ზე წესის ქმედებები გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒ" + +#: rewrite/rewriteDefine.c:293 +#, c-format +msgid "Use views or triggers instead." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ხედები áƒáƒœ ტრიგერები." + +#: rewrite/rewriteDefine.c:297 +#, c-format +msgid "rule actions on NEW are not implemented" +msgstr "\"NEW\"-ზე წესის ქმედებები გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒ" + +#: rewrite/rewriteDefine.c:298 +#, c-format +msgid "Use triggers instead." +msgstr "áƒáƒ›áƒ˜áƒ¡ ნáƒáƒªáƒ•ლáƒáƒ“ ტრიგერები გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: rewrite/rewriteDefine.c:312 +#, c-format +msgid "relation \"%s\" cannot have ON SELECT rules" +msgstr "ურთიერთáƒáƒ‘áƒáƒ¡ \"%s\" ON SELECT წესები ვერ ექნებáƒ" + +#: rewrite/rewriteDefine.c:322 +#, c-format +msgid "INSTEAD NOTHING rules on SELECT are not implemented" +msgstr "SELECT-ზე INSTEAD NOTHING წესები გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: rewrite/rewriteDefine.c:323 +#, c-format +msgid "Use views instead." +msgstr "áƒáƒ›áƒ˜áƒ¡ ნáƒáƒªáƒ•ლáƒáƒ“ ხედები გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: rewrite/rewriteDefine.c:331 +#, c-format +msgid "multiple actions for rules on SELECT are not implemented" +msgstr "\"SELECT\"-ზე ერთზე მეტი წესის ქმედებრმხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: rewrite/rewriteDefine.c:341 +#, c-format +msgid "rules on SELECT must have action INSTEAD SELECT" +msgstr "\"SELECT\"-ზე áƒáƒ áƒ¡áƒ”ბულ წესებს ქმედებრINSTEAD SELECT áƒáƒ£áƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ უნდრჰქáƒáƒœáƒ“ეთ" + +#: rewrite/rewriteDefine.c:349 +#, c-format +msgid "rules on SELECT must not contain data-modifying statements in WITH" +msgstr "\"SELECT\"-ზე áƒáƒ áƒ¡áƒ”ბულ წესები \"WITH\"-ში მáƒáƒœáƒáƒªáƒ”მების შემცვლელ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბს áƒáƒ  უნდრშეიცáƒáƒ•დნენ" + +#: rewrite/rewriteDefine.c:357 +#, c-format +msgid "event qualifications are not implemented for rules on SELECT" +msgstr "'SELECT'-ზე წესებისთვის პირáƒáƒ‘ების ქáƒáƒœáƒ გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: rewrite/rewriteDefine.c:384 +#, c-format +msgid "\"%s\" is already a view" +msgstr "\"%s\" უკვე ხედიáƒ" + +#: rewrite/rewriteDefine.c:408 +#, c-format +msgid "view rule for \"%s\" must be named \"%s\"" +msgstr "ხედის წესის \"%s\" სáƒáƒ®áƒ”ლი \"%s\" უნდრიყáƒáƒ¡" + +#: rewrite/rewriteDefine.c:435 +#, c-format +msgid "cannot have multiple RETURNING lists in a rule" +msgstr "წესში ერთზე მეტი RETURNING ტიპის სირვერ გექნებáƒáƒ—" + +#: rewrite/rewriteDefine.c:440 +#, c-format +msgid "RETURNING lists are not supported in conditional rules" +msgstr "RETURNING ტიპის სიები პირáƒáƒ‘ის მქáƒáƒœáƒ” წესებში მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: rewrite/rewriteDefine.c:444 +#, c-format +msgid "RETURNING lists are not supported in non-INSTEAD rules" +msgstr "სიები RETURNING áƒáƒ áƒ-INSTEAD წესებში მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: rewrite/rewriteDefine.c:458 +#, c-format +msgid "non-view rule for \"%s\" must not be named \"%s\"" +msgstr "კურსáƒáƒ áƒ¡ %s áƒáƒ áƒ’უმენტი სáƒáƒ®áƒ”ლáƒáƒ“ %s áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: rewrite/rewriteDefine.c:532 +#, c-format +msgid "SELECT rule's target list has too many entries" +msgstr "SELECT-ის წესის სáƒáƒ›áƒ˜áƒ–ნე სირმეტისმეტáƒáƒ“ ბევრ ელემენტს ჩáƒáƒœáƒáƒ¬áƒ”რს შეიცáƒáƒ•ს" + +#: rewrite/rewriteDefine.c:533 +#, c-format +msgid "RETURNING list has too many entries" +msgstr "RETURNING ტიპის სიáƒáƒ¨áƒ˜ მეტისმეტáƒáƒ“ ბევრი ჩáƒáƒœáƒáƒ¬áƒ”რიáƒ" + +#: rewrite/rewriteDefine.c:560 +#, c-format +msgid "cannot convert relation containing dropped columns to view" +msgstr "" + +#: rewrite/rewriteDefine.c:561 +#, c-format +msgid "cannot create a RETURNING list for a relation containing dropped columns" +msgstr "" + +#: rewrite/rewriteDefine.c:567 +#, c-format +msgid "SELECT rule's target entry %d has different column name from column \"%s\"" +msgstr "" + +#: rewrite/rewriteDefine.c:569 +#, c-format +msgid "SELECT target entry is named \"%s\"." +msgstr "SELECT-ის სáƒáƒ›áƒ˜áƒ–ნე ჩáƒáƒœáƒáƒ¬áƒ”რის სáƒáƒ®áƒ”ლირ\"%s\"." + +#: rewrite/rewriteDefine.c:578 +#, c-format +msgid "SELECT rule's target entry %d has different type from column \"%s\"" +msgstr "" + +#: rewrite/rewriteDefine.c:580 +#, c-format +msgid "RETURNING list's entry %d has different type from column \"%s\"" +msgstr "" + +#: rewrite/rewriteDefine.c:583 rewrite/rewriteDefine.c:607 +#, c-format +msgid "SELECT target entry has type %s, but column has type %s." +msgstr "" + +#: rewrite/rewriteDefine.c:586 rewrite/rewriteDefine.c:611 +#, c-format +msgid "RETURNING list entry has type %s, but column has type %s." +msgstr "" + +#: rewrite/rewriteDefine.c:602 +#, c-format +msgid "SELECT rule's target entry %d has different size from column \"%s\"" +msgstr "" + +#: rewrite/rewriteDefine.c:604 +#, c-format +msgid "RETURNING list's entry %d has different size from column \"%s\"" +msgstr "" + +#: rewrite/rewriteDefine.c:621 +#, c-format +msgid "SELECT rule's target list has too few entries" +msgstr "" + +#: rewrite/rewriteDefine.c:622 +#, c-format +msgid "RETURNING list has too few entries" +msgstr "RETURNING ტიპის სიáƒáƒ¨áƒ˜ მეტისმეტáƒáƒ“ ცáƒáƒ¢áƒ ჩáƒáƒœáƒáƒ¬áƒ”რიáƒ" + +#: rewrite/rewriteDefine.c:711 rewrite/rewriteDefine.c:826 rewrite/rewriteSupport.c:108 +#, c-format +msgid "rule \"%s\" for relation \"%s\" does not exist" +msgstr "წესი %s ურთიერთáƒáƒ‘ისთვის \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: rewrite/rewriteDefine.c:845 +#, c-format +msgid "renaming an ON SELECT rule is not allowed" +msgstr "'ON SELECT' წესზე სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრდáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: rewrite/rewriteHandler.c:581 +#, c-format +msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" +msgstr "" + +#: rewrite/rewriteHandler.c:608 +#, c-format +msgid "INSERT ... SELECT rule actions are not supported for queries having data-modifying statements in WITH" +msgstr "INSERT … SELECT წესის ქმედებები მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირმáƒáƒ—ხáƒáƒ•ნებისთვის, რáƒáƒ›áƒšáƒ”ბსáƒáƒª WITH-ის შემცველი მáƒáƒœáƒáƒªáƒ”მების შემცვლელი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბები გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—" + +#: rewrite/rewriteHandler.c:661 +#, c-format +msgid "cannot have RETURNING lists in multiple rules" +msgstr "" + +#: rewrite/rewriteHandler.c:893 rewrite/rewriteHandler.c:932 +#, c-format +msgid "cannot insert a non-DEFAULT value into column \"%s\"" +msgstr "" + +#: rewrite/rewriteHandler.c:895 rewrite/rewriteHandler.c:961 +#, c-format +msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." +msgstr "" + +#: rewrite/rewriteHandler.c:897 +#, c-format +msgid "Use OVERRIDING SYSTEM VALUE to override." +msgstr "გáƒáƒ“áƒáƒ¡áƒáƒ¤áƒáƒ áƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ OVERRIDING SYSTEM VALUE." + +#: rewrite/rewriteHandler.c:959 rewrite/rewriteHandler.c:967 +#, c-format +msgid "column \"%s\" can only be updated to DEFAULT" +msgstr "სვეტი \"%s\" მხáƒáƒšáƒáƒ“ DEFAULT-მდე შეიძლებáƒ, გáƒáƒœáƒáƒ®áƒšáƒ“ეს" + +#: rewrite/rewriteHandler.c:1114 rewrite/rewriteHandler.c:1132 +#, c-format +msgid "multiple assignments to same column \"%s\"" +msgstr "" + +#: rewrite/rewriteHandler.c:1697 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "წესების მქáƒáƒœáƒ” ურთიერთáƒáƒ‘ებისთვის MERGE მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2110 rewrite/rewriteHandler.c:4197 +#, c-format +msgid "infinite recursion detected in rules for relation \"%s\"" +msgstr "" + +#: rewrite/rewriteHandler.c:2195 +#, c-format +msgid "infinite recursion detected in policy for relation \"%s\"" +msgstr "" + +#: rewrite/rewriteHandler.c:2547 +msgid "Junk view columns are not updatable." +msgstr "ნáƒáƒ’ვის ნáƒáƒ®áƒ•ის სვეტები გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2552 +msgid "View columns that are not columns of their base relation are not updatable." +msgstr "ხედის სვეტები, რáƒáƒ›áƒšáƒ”ბიც მáƒáƒ—ი სáƒáƒ‘áƒáƒ–ისრურთიერთáƒáƒ‘ის სვეტები áƒáƒ áƒ˜áƒáƒœ, გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2555 +msgid "View columns that refer to system columns are not updatable." +msgstr "ხედის სვეტები, რáƒáƒ›áƒšáƒ”ბიც სისტემურ სვეტებზერმიბმული, გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2558 +msgid "View columns that return whole-row references are not updatable." +msgstr "ხედის სვეტები, რáƒáƒ›áƒšáƒ”ბიც მთელ-მწკრივიáƒáƒœ ბმებზე მიუთითებენ, გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2619 +msgid "Views containing DISTINCT are not automatically updatable." +msgstr "\"DISTINCT\"-ის შემცველი ხედები გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2622 +msgid "Views containing GROUP BY are not automatically updatable." +msgstr "\"GROUP BY\"-ის შემცველი ხედები თვითგáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2625 +msgid "Views containing HAVING are not automatically updatable." +msgstr "\"HAVING\"-ის შემცველი ხედები თვითგáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2628 +msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." +msgstr "\"UNION\"-ის, \"INTERSECT\"-ის დრ\"EXCEPT\"-ის შემცველი ხედები თვითგáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2631 +msgid "Views containing WITH are not automatically updatable." +msgstr "\"WITH\"-ის შემცველი ხედები თვითგáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2634 +msgid "Views containing LIMIT or OFFSET are not automatically updatable." +msgstr "\"LIMIT\"-ის დრ\"OFFSET\"-ის შემცველი ხედები თვითგáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2646 +msgid "Views that return aggregate functions are not automatically updatable." +msgstr "ხედები, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ’რეგáƒáƒ¢áƒ£áƒš ფუნქციებს áƒáƒ‘რუნებენ, თვითგáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2649 +msgid "Views that return window functions are not automatically updatable." +msgstr "ხედები, რáƒáƒ›áƒšáƒ”ბიც ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡ ფუნქციებს áƒáƒ‘რუნებენ, თვითგáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2652 +msgid "Views that return set-returning functions are not automatically updatable." +msgstr "ხედები, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ‘რუნებენ ფუნქციებს, რáƒáƒ›áƒšáƒ”ბიც სეტებს áƒáƒ‘რუნებენ, თვითგáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი áƒáƒ áƒáƒ." + +#: rewrite/rewriteHandler.c:2659 rewrite/rewriteHandler.c:2663 rewrite/rewriteHandler.c:2671 +msgid "Views that do not select from a single table or view are not automatically updatable." +msgstr "" + +#: rewrite/rewriteHandler.c:2674 +msgid "Views containing TABLESAMPLE are not automatically updatable." +msgstr "" + +#: rewrite/rewriteHandler.c:2698 +msgid "Views that have no updatable columns are not automatically updatable." +msgstr "ხედები, რáƒáƒ›áƒšáƒ”ბსáƒáƒª გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ი ცხრილები áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ, áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ“ები áƒáƒ  áƒáƒ áƒ˜áƒáƒœ." + +#: rewrite/rewriteHandler.c:3079 rewrite/rewriteHandler.c:3114 +#, c-format +msgid "cannot insert into view \"%s\"" +msgstr "ხედში ჩáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ: %s" + +#: rewrite/rewriteHandler.c:3082 +#, c-format +msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." +msgstr "" + +#: rewrite/rewriteHandler.c:3087 rewrite/rewriteHandler.c:3123 +#, c-format +msgid "cannot update view \"%s\"" +msgstr "ხედის გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელიáƒ: %s" + +#: rewrite/rewriteHandler.c:3090 +#, c-format +msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." +msgstr "" + +#: rewrite/rewriteHandler.c:3095 rewrite/rewriteHandler.c:3132 +#, c-format +msgid "cannot delete from view \"%s\"" +msgstr "ხედიდáƒáƒœ წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ: %s" + +#: rewrite/rewriteHandler.c:3098 +#, c-format +msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." +msgstr "" + +#: rewrite/rewriteHandler.c:3117 +#, c-format +msgid "To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT trigger." +msgstr "ხედში MERGE-ით ჩáƒáƒ¡áƒ›áƒ˜áƒ¡ ჩáƒáƒ¡áƒáƒ áƒ—áƒáƒ•áƒáƒ“ მიუთითეთ INSTEAD OF INSERT ტრიგერი." + +#: rewrite/rewriteHandler.c:3126 +#, c-format +msgid "To enable updating the view using MERGE, provide an INSTEAD OF UPDATE trigger." +msgstr "ხედის MERGE-ით გáƒáƒœáƒáƒ®áƒšáƒ”ბის ჩáƒáƒ¡áƒáƒ áƒ—áƒáƒ•áƒáƒ“ მიუთითეთ INSTEAD OF UPDATE ტრიგერი." + +#: rewrite/rewriteHandler.c:3135 +#, c-format +msgid "To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE trigger." +msgstr "áƒáƒ› ხედიდáƒáƒœ MERGE-ის სáƒáƒ¨áƒ£áƒáƒšáƒ”ბით წáƒáƒ¨áƒšáƒ˜áƒ¡ ჩáƒáƒ¡áƒáƒ áƒ—áƒáƒ•áƒáƒ“ მიუთითეთ INSTEAD OF DELETE ტრიგერი." + +#: rewrite/rewriteHandler.c:3289 +#, c-format +msgid "cannot insert into column \"%s\" of view \"%s\"" +msgstr "ხედის (\"%2$s\") სვეტში \"%1$s\" მáƒáƒœáƒáƒªáƒ”მის ჩáƒáƒ¡áƒ›áƒ შეუძლებელიáƒ" + +#: rewrite/rewriteHandler.c:3297 +#, c-format +msgid "cannot update column \"%s\" of view \"%s\"" +msgstr "ხედის (\"%2$s\") სვეტის \"%1$s\" გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელიáƒ" + +#: rewrite/rewriteHandler.c:3305 +#, c-format +msgid "cannot merge into column \"%s\" of view \"%s\"" +msgstr "ხედის (\"%2$s\") სვეტთáƒáƒœ \"%1$s\" შერწყმრშეუძლებელიáƒ" + +#: rewrite/rewriteHandler.c:3333 +#, c-format +msgid "cannot merge into view \"%s\"" +msgstr "შეუძლებელირშერწყმრხედში \"%s\"" + +#: rewrite/rewriteHandler.c:3335 +#, c-format +msgid "MERGE is not supported for views with INSTEAD OF triggers for some actions, but not others." +msgstr "" + +#: rewrite/rewriteHandler.c:3336 +#, c-format +msgid "To enable merging into the view, either provide a full set of INSTEAD OF triggers or drop the existing INSTEAD OF triggers." +msgstr "áƒáƒ› ხედში შერწყმის ჩáƒáƒ¡áƒáƒ áƒ—áƒáƒ•áƒáƒ“, áƒáƒœ შეიყვáƒáƒœáƒ”თ INSTEAD OF ტრიგერების სრული სიáƒ, áƒáƒœ წáƒáƒ¨áƒáƒšáƒ”თ áƒáƒ áƒ¡áƒ”ბული INSTEAD OF ტრიგერები." + +#: rewrite/rewriteHandler.c:3855 +#, c-format +msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" +msgstr "" + +#: rewrite/rewriteHandler.c:3866 +#, c-format +msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" +msgstr "" + +#: rewrite/rewriteHandler.c:3880 +#, c-format +msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" +msgstr "" + +#: rewrite/rewriteHandler.c:3884 +#, c-format +msgid "DO ALSO rules are not supported for data-modifying statements in WITH" +msgstr "" + +#: rewrite/rewriteHandler.c:3889 +#, c-format +msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" +msgstr "" + +#: rewrite/rewriteHandler.c:4149 +msgid "Views with conditional DO INSTEAD rules are not automatically updatable." +msgstr "" + +#: rewrite/rewriteHandler.c:4246 +#, c-format +msgid "cannot perform INSERT RETURNING on relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘áƒáƒ–ე \"%s\" 'INSERT RETURNING'-ის გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებრშეუძლებელიáƒ" + +#: rewrite/rewriteHandler.c:4248 +#, c-format +msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." +msgstr "" + +#: rewrite/rewriteHandler.c:4253 +#, c-format +msgid "cannot perform UPDATE RETURNING on relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘áƒáƒ–ე \"%s\" 'UPDATE RETURNING'-ის გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებრშეუძლებელიáƒ" + +#: rewrite/rewriteHandler.c:4255 +#, c-format +msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." +msgstr "" + +#: rewrite/rewriteHandler.c:4260 +#, c-format +msgid "cannot perform DELETE RETURNING on relation \"%s\"" +msgstr "ურთიერთáƒáƒ‘áƒáƒ–ე \"%s\" 'DELETE RETURNING'-ის გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებრშეუძლებელიáƒ" + +#: rewrite/rewriteHandler.c:4262 +#, c-format +msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." +msgstr "" + +#: rewrite/rewriteHandler.c:4280 +#, c-format +msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" +msgstr "" + +#: rewrite/rewriteHandler.c:4337 +#, c-format +msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" +msgstr "" + +#: rewrite/rewriteManip.c:1083 +#, c-format +msgid "conditional utility statements are not implemented" +msgstr "პირáƒáƒ‘ითი სáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒ áƒ”áƒáƒ‘რივი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბები გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: rewrite/rewriteManip.c:1427 +#, c-format +msgid "WHERE CURRENT OF on a view is not implemented" +msgstr "WHERE CURRENT OF ხედზე გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: rewrite/rewriteManip.c:1762 +#, c-format +msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" +msgstr "" + +#: rewrite/rewriteSearchCycle.c:410 +#, c-format +msgid "with a SEARCH or CYCLE clause, the recursive reference to WITH query \"%s\" must be at the top level of its right-hand SELECT" +msgstr "" + +#: scan.l:483 +msgid "unterminated /* comment" +msgstr "დáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელი /* კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜" + +#: scan.l:503 +msgid "unterminated bit string literal" +msgstr "გáƒáƒ¬áƒ§áƒ•ეტილი ბიტური სტრიქáƒáƒœáƒ˜" + +#: scan.l:517 +msgid "unterminated hexadecimal string literal" +msgstr "გáƒáƒ¬áƒ§áƒ•ეტილი თექვსმეტáƒáƒ‘ითი სტრიქáƒáƒœáƒ˜" + +#: scan.l:567 +#, c-format +msgid "unsafe use of string constant with Unicode escapes" +msgstr "" + +#: scan.l:568 +#, c-format +msgid "String constants with Unicode escapes cannot be used when \"standard_conforming_strings\" is off." +msgstr "" + +#: scan.l:629 +msgid "unhandled previous state in xqs" +msgstr "დáƒáƒ£áƒ›áƒ£áƒ¨áƒáƒ•ებელი წინრმდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘რდáƒáƒ›áƒ®áƒ£áƒ áƒáƒ•ი ბრჭყáƒáƒšáƒ˜áƒ¡ áƒáƒ¦áƒ›áƒáƒ©áƒ”ნისáƒáƒ¡" + +#: scan.l:703 +#, c-format +msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." +msgstr "უნიკáƒáƒ“ის სპეცკáƒáƒ“ების შესáƒáƒ«áƒšáƒ ვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ”ბირ\\uXXXX დრ\\UXXXXXXXX." + +#: scan.l:714 +#, c-format +msgid "unsafe use of \\' in a string literal" +msgstr "სტრიქáƒáƒœáƒ¨áƒ˜ \\'-ის გáƒáƒ›áƒáƒ§áƒ”ნებრუსáƒáƒ¤áƒ áƒ—ხრáƒáƒ áƒáƒ" + +#: scan.l:715 +#, c-format +msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." +msgstr "" + +#: scan.l:787 +msgid "unterminated dollar-quoted string" +msgstr "$-ით დáƒáƒ¬áƒ§áƒ”ბული სტრიქáƒáƒœ დáƒáƒ£áƒ›áƒ—áƒáƒ•რებელიáƒ" + +#: scan.l:804 scan.l:814 +msgid "zero-length delimited identifier" +msgstr "გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ¡ ნულáƒáƒ•áƒáƒœáƒ˜ სიგრძის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜" + +#: scan.l:825 syncrep_scanner.l:101 +msgid "unterminated quoted identifier" +msgstr "დáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელი იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ ბრჭყáƒáƒšáƒ”ბში" + +#: scan.l:988 +msgid "operator too long" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#: scan.l:1001 +msgid "trailing junk after parameter" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის შემდეგ მáƒáƒ§áƒáƒšáƒ˜áƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მები ნáƒáƒ’áƒáƒ•იáƒ" + +#: scan.l:1022 +msgid "invalid hexadecimal integer" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ თექვსმეტáƒáƒ‘ითი მთელი რიცხვი" + +#: scan.l:1026 +msgid "invalid octal integer" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რვáƒáƒáƒ‘ითი მთელი რიცხვი" + +#: scan.l:1030 +msgid "invalid binary integer" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბინáƒáƒ áƒ£áƒšáƒ˜ მთელი რიცხვი" + +#. translator: %s is typically the translation of "syntax error" +#: scan.l:1237 +#, c-format +msgid "%s at end of input" +msgstr "%s შეყვáƒáƒœáƒ˜áƒ¡ ბáƒáƒšáƒáƒ¡" + +#. translator: first %s is typically the translation of "syntax error" +#: scan.l:1245 +#, c-format +msgid "%s at or near \"%s\"" +msgstr "%s \"%s\"-სთáƒáƒœ áƒáƒœ áƒáƒ®áƒšáƒáƒ¡" + +#: scan.l:1437 +#, c-format +msgid "nonstandard use of \\' in a string literal" +msgstr "სტრიქáƒáƒœáƒ¨áƒ˜ \\' áƒáƒ áƒáƒ¡áƒ¢áƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒáƒ“áƒáƒ გáƒáƒ›áƒáƒ§áƒ”ნებული" + +#: scan.l:1438 +#, c-format +msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." +msgstr "" + +#: scan.l:1447 +#, c-format +msgid "nonstandard use of \\\\ in a string literal" +msgstr "სტრიქáƒáƒœáƒ¨áƒ˜ \\\\ áƒáƒ áƒáƒ¡áƒ¢áƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒáƒ“áƒáƒ გáƒáƒ›áƒáƒ§áƒ”ნებული" + +#: scan.l:1448 +#, c-format +msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." +msgstr "" + +#: scan.l:1462 +#, c-format +msgid "nonstandard use of escape in a string literal" +msgstr "" + +#: scan.l:1463 +#, c-format +msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." +msgstr "" + +#: snowball/dict_snowball.c:215 +#, c-format +msgid "no Snowball stemmer available for language \"%s\" and encoding \"%s\"" +msgstr "" + +#: snowball/dict_snowball.c:238 tsearch/dict_ispell.c:74 tsearch/dict_simple.c:49 +#, c-format +msgid "multiple StopWords parameters" +msgstr "გáƒáƒ›áƒ”áƒáƒ áƒ”ბáƒáƒ“ი StopWords პáƒáƒ áƒáƒ›áƒ”ტრი" + +#: snowball/dict_snowball.c:247 +#, c-format +msgid "multiple Language parameters" +msgstr "გáƒáƒ›áƒ”áƒáƒ áƒ”ბáƒáƒ“ი Language პáƒáƒ áƒáƒ›áƒ”ტრი" + +#: snowball/dict_snowball.c:254 +#, c-format +msgid "unrecognized Snowball parameter: \"%s\"" +msgstr "" + +#: snowball/dict_snowball.c:262 +#, c-format +msgid "missing Language parameter" +msgstr "áƒáƒ™áƒšáƒ˜áƒ პáƒáƒ áƒáƒ›áƒ”ტრი Language" + +#: statistics/extended_stats.c:176 +#, c-format +msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" +msgstr "" + +#: statistics/mcv.c:1368 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "ფუნქციáƒ, რáƒáƒ›áƒ”ლიც ჩáƒáƒœáƒáƒ¬áƒ”რს áƒáƒ‘რუნებს, გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბულირკáƒáƒœáƒ¢áƒ”ქსტში, რáƒáƒ›áƒ”ლსáƒáƒª ჩáƒáƒœáƒáƒ¬áƒ”რის მიღებრáƒáƒ  შეუძლიáƒ" + +#: storage/buffer/bufmgr.c:649 storage/buffer/bufmgr.c:805 +#, c-format +msgid "cannot access temporary tables of other sessions" +msgstr "სხვრსესიების დრáƒáƒ”ბით ცხრილებთáƒáƒœ წვდáƒáƒ›áƒ შეუძლებელიáƒ" + +#: storage/buffer/bufmgr.c:1532 +#, c-format +msgid "invalid page in block %u of relation %s; zeroing out page" +msgstr "" + +#: storage/buffer/bufmgr.c:2277 storage/buffer/localbuf.c:361 +#, c-format +msgid "cannot extend relation %s beyond %u blocks" +msgstr "" + +#: storage/buffer/bufmgr.c:2348 +#, c-format +msgid "unexpected data beyond EOF in block %u of relation %s" +msgstr "" + +#: storage/buffer/bufmgr.c:2350 +#, c-format +msgid "This has been seen to occur with buggy kernels; consider updating your system." +msgstr "" + +#: storage/buffer/bufmgr.c:5653 +#, c-format +msgid "could not write block %u of %s" +msgstr "%2$s-ის %1$u ბლáƒáƒ™áƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ" + +#: storage/buffer/bufmgr.c:5655 +#, c-format +msgid "Multiple failures --- write error might be permanent." +msgstr "ბევრი შეცდáƒáƒ›áƒ --- ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ შეიძლებრმუდმივი იყáƒáƒ¡." + +#: storage/buffer/bufmgr.c:5677 storage/buffer/bufmgr.c:5697 +#, c-format +msgid "writing block %u of relation %s" +msgstr "" + +#: storage/buffer/localbuf.c:220 +#, c-format +msgid "no empty local buffer available" +msgstr "ცáƒáƒ áƒ˜áƒ”ლი ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ ბáƒáƒ¤áƒ”რები მიუწვდáƒáƒ›áƒ”ლიáƒ" + +#: storage/buffer/localbuf.c:597 +#, c-format +msgid "cannot access temporary tables during a parallel operation" +msgstr "" + +#: storage/buffer/localbuf.c:712 +#, c-format +msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." +msgstr "" + +#: storage/file/buffile.c:338 +#, c-format +msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" +msgstr "" + +#: storage/file/buffile.c:632 +#, c-format +msgid "could not read from file set \"%s\": read only %zu of %zu bytes" +msgstr "ფáƒáƒ˜áƒšáƒ”ბის სეტიდáƒáƒœ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ•იკითხე მხáƒáƒšáƒáƒ“ %zu ბáƒáƒ˜áƒ¢áƒ˜ %zu-დáƒáƒœ" + +#: storage/file/buffile.c:634 +#, c-format +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "დრáƒáƒ”ბით ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ•იკითხე მხáƒáƒšáƒáƒ“ %zu ბáƒáƒ˜áƒ¢áƒ˜ %zu-დáƒáƒœ" + +#: storage/file/buffile.c:774 storage/file/buffile.c:877 +#, c-format +msgid "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" +msgstr "" + +#: storage/file/buffile.c:956 +#, c-format +msgid "could not delete fileset \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ”ბის სეტის (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: storage/file/buffile.c:974 storage/smgr/md.c:336 storage/smgr/md.c:1192 +#, c-format +msgid "could not truncate file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) მáƒáƒ™áƒ•ეთის შეცდáƒáƒ›áƒ: %m" + +#: storage/file/fd.c:583 storage/file/fd.c:655 storage/file/fd.c:691 +#, c-format +msgid "could not flush dirty data: %m" +msgstr "" + +#: storage/file/fd.c:613 +#, c-format +msgid "could not determine dirty data size: %m" +msgstr "" + +#: storage/file/fd.c:665 +#, c-format +msgid "could not munmap() while flushing data: %m" +msgstr "" + +#: storage/file/fd.c:983 +#, c-format +msgid "getrlimit failed: %m" +msgstr "getrlimit-ის შეცდáƒáƒ›áƒ: %m" + +#: storage/file/fd.c:1073 +#, c-format +msgid "insufficient file descriptors available to start server process" +msgstr "სერვერის პრáƒáƒªáƒ”სის გáƒáƒ¡áƒáƒ¨áƒ•ებáƒáƒ“ სáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დესკრიპტáƒáƒ áƒ”ბის ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ áƒáƒ áƒáƒ" + +#: storage/file/fd.c:1074 +#, c-format +msgid "System allows %d, server needs at least %d." +msgstr "სისტემრგვიშვებს %d, სერვერს კი სჭირდებრ%d." + +#: storage/file/fd.c:1162 storage/file/fd.c:2618 storage/file/fd.c:2727 storage/file/fd.c:2878 +#, c-format +msgid "out of file descriptors: %m; release and retry" +msgstr "ფáƒáƒ˜áƒšáƒ”ბის დესკრიპტáƒáƒ áƒ”ბის სáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒ áƒáƒ: %m. გáƒáƒáƒ—áƒáƒ•ისუფლეთ დრთáƒáƒ•იდáƒáƒœ სცáƒáƒ“ეთ" + +#: storage/file/fd.c:1536 +#, c-format +msgid "temporary file: path \"%s\", size %lu" +msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜: ბილიკი \"%s\", ზáƒáƒ›áƒ %lu" + +#: storage/file/fd.c:1675 +#, c-format +msgid "cannot create temporary directory \"%s\": %m" +msgstr "დრáƒáƒ”ბითი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m" + +#: storage/file/fd.c:1682 +#, c-format +msgid "cannot create temporary subdirectory \"%s\": %m" +msgstr "დრáƒáƒ”ბითი ქვესáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m" + +#: storage/file/fd.c:1879 +#, c-format +msgid "could not create temporary file \"%s\": %m" +msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %m" + +#: storage/file/fd.c:1915 +#, c-format +msgid "could not open temporary file \"%s\": %m" +msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: storage/file/fd.c:1956 +#, c-format +msgid "could not unlink temporary file \"%s\": %m" +msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) ბმულის მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: storage/file/fd.c:2044 +#, c-format +msgid "could not delete file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: storage/file/fd.c:2234 +#, c-format +msgid "temporary file size exceeds temp_file_limit (%dkB)" +msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ temp_file_limit-ს (%dკბ) áƒáƒ­áƒáƒ áƒ‘ებს" + +#: storage/file/fd.c:2594 storage/file/fd.c:2653 +#, c-format +msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" +msgstr "გáƒáƒ“áƒáƒªáƒ˜áƒšáƒ”ბულირmaxAllocatedDescs (%d) რáƒáƒªáƒ ვცდილáƒáƒ‘დი, გáƒáƒ›áƒ”ხსნრფáƒáƒ˜áƒšáƒ˜ \"%s\"" + +#: storage/file/fd.c:2698 +#, c-format +msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" +msgstr "გáƒáƒ“áƒáƒªáƒ˜áƒšáƒ”ბულირmaxAllocatedDescs (%d) რáƒáƒªáƒ ვცდილáƒáƒ‘დი, გáƒáƒ›áƒ”შვრბრძáƒáƒœáƒ”ბრ\"%s\"" + +#: storage/file/fd.c:2854 +#, c-format +msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" +msgstr "გáƒáƒ“áƒáƒªáƒ˜áƒšáƒ”ბულირmaxAllocatedDescs (%d) რáƒáƒªáƒ ვცდილáƒáƒ‘დი, გáƒáƒ›áƒ”ხსნრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\"" + +#: storage/file/fd.c:3384 +#, c-format +msgid "unexpected file found in temporary-files directory: \"%s\"" +msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირმáƒáƒ£áƒšáƒáƒ“ნელი ფáƒáƒ˜áƒšáƒ˜: \"%s\"" + +#: storage/file/fd.c:3502 +#, c-format +msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/fd.c:3729 +#, c-format +msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/fd.c:3761 +#, c-format +msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/fd.c:3950 +#, c-format +msgid "\"debug_io_direct\" is not supported on this platform." +msgstr "\"debug_io_direct\" áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ." + +#: storage/file/fd.c:3964 +#, c-format +msgid "Invalid list syntax in parameter \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიის სინტáƒáƒ¥áƒ¡áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრში \"%s\"" + +#: storage/file/fd.c:3984 +#, c-format +msgid "Invalid option \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\"" + +#: storage/file/fd.c:3997 +#, c-format +msgid "\"debug_io_direct\" is not supported for WAL because XLOG_BLCKSZ is too small" +msgstr "\"debug_io_direct\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ WAL-სთვის, რáƒáƒ“გáƒáƒœ XLOG_BLCKSZ ძáƒáƒšáƒ˜áƒáƒœ პáƒáƒ¢áƒáƒ áƒáƒ" + +#: storage/file/fd.c:4004 +#, c-format +msgid "\"debug_io_direct\" is not supported for data because BLCKSZ is too small" +msgstr "\"debug_io_direct\" მáƒáƒœáƒáƒªáƒ”მებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ, რáƒáƒ“გáƒáƒœ BLCKSZ ძáƒáƒšáƒ˜áƒáƒœ პáƒáƒ¢áƒáƒ áƒáƒ" + +#: storage/file/reinit.c:145 +#, c-format +msgid "resetting unlogged relations (init), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/reinit.c:148 +#, c-format +msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/sharedfileset.c:73 +#, c-format +msgid "could not attach to a SharedFileSet that is already destroyed" +msgstr "" + +#: storage/ipc/dsm.c:379 +#, c-format +msgid "dynamic shared memory control segment is corrupt" +msgstr "დინáƒáƒ›áƒ˜áƒ£áƒ áƒ˜ გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სეგმენტი დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ" + +#: storage/ipc/dsm.c:444 +#, c-format +msgid "dynamic shared memory control segment is not valid" +msgstr "დინáƒáƒ›áƒ˜áƒ£áƒ áƒ˜ გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ სეგმენტი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: storage/ipc/dsm.c:626 +#, c-format +msgid "too many dynamic shared memory segments" +msgstr "მეტისმეტáƒáƒ“ ბევრი დინáƒáƒ›áƒ˜áƒ£áƒ áƒ˜ გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების სეგმენტი" + +#: storage/ipc/dsm_impl.c:231 storage/ipc/dsm_impl.c:537 storage/ipc/dsm_impl.c:641 storage/ipc/dsm_impl.c:812 +#, c-format +msgid "could not unmap shared memory segment \"%s\": %m" +msgstr "მეხსიერების გáƒáƒ–იáƒáƒ áƒ”ბული სეგმენტის (\"%s\") მიბმის მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: storage/ipc/dsm_impl.c:241 storage/ipc/dsm_impl.c:547 storage/ipc/dsm_impl.c:651 storage/ipc/dsm_impl.c:822 +#, c-format +msgid "could not remove shared memory segment \"%s\": %m" +msgstr "მეხსიერების გáƒáƒ–იáƒáƒ áƒ”ბული სეგმენტის (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: storage/ipc/dsm_impl.c:265 storage/ipc/dsm_impl.c:722 storage/ipc/dsm_impl.c:836 +#, c-format +msgid "could not open shared memory segment \"%s\": %m" +msgstr "მეხსიერების გáƒáƒ–იáƒáƒ áƒ”ბული სეგმენტის (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: storage/ipc/dsm_impl.c:290 storage/ipc/dsm_impl.c:563 storage/ipc/dsm_impl.c:767 storage/ipc/dsm_impl.c:860 +#, c-format +msgid "could not stat shared memory segment \"%s\": %m" +msgstr "მეხსიერების გáƒáƒ–იáƒáƒ áƒ”ბული სეგმენტის (\"%s\") პáƒáƒ•ნის შეცდáƒáƒ›áƒ: %m" + +#: storage/ipc/dsm_impl.c:309 storage/ipc/dsm_impl.c:911 +#, c-format +msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" +msgstr "მეხსიერების გáƒáƒ–იáƒáƒ áƒ”ბული სეგმენტის (\"%s\") ზáƒáƒ›áƒ˜áƒ¡ %zu ბáƒáƒ˜áƒ¢áƒáƒ›áƒ” გáƒáƒ–რდის შეცდáƒáƒ›áƒ: %m" + +#: storage/ipc/dsm_impl.c:331 storage/ipc/dsm_impl.c:584 storage/ipc/dsm_impl.c:743 storage/ipc/dsm_impl.c:933 +#, c-format +msgid "could not map shared memory segment \"%s\": %m" +msgstr "მეხსიერების გáƒáƒ–იáƒáƒ áƒ”ბული სეგმენტის (\"%s\") მიბმის შეცდáƒáƒ›áƒ: %m" + +#: storage/ipc/dsm_impl.c:519 +#, c-format +msgid "could not get shared memory segment: %m" +msgstr "მეხსიერების გáƒáƒ–იáƒáƒ áƒ”ბული სეგმენტის მიღების შეცდáƒáƒ›áƒ: %m" + +#: storage/ipc/dsm_impl.c:707 +#, c-format +msgid "could not create shared memory segment \"%s\": %m" +msgstr "მეხსიერების გáƒáƒ–იáƒáƒ áƒ”ბული სეგმენტის (\"%s\") შექმნის შეცდáƒáƒ›áƒ: %m" + +#: storage/ipc/dsm_impl.c:944 +#, c-format +msgid "could not close shared memory segment \"%s\": %m" +msgstr "მეხსიერების გáƒáƒ–იáƒáƒ áƒ”ბული სეგმენტის (\"%s\") დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: storage/ipc/dsm_impl.c:984 storage/ipc/dsm_impl.c:1033 +#, c-format +msgid "could not duplicate handle for \"%s\": %m" +msgstr "\"%s\"-ის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის დუბლირებრშეუძლებელიáƒ: %m" + +#: storage/ipc/dsm_registry.c:142 +#, c-format +msgid "DSM segment name cannot be empty" +msgstr "DSM სეგმენტის სáƒáƒ®áƒ”ლი, ცáƒáƒ áƒ˜áƒ”ლი, áƒáƒ  შეიძლებრიყáƒáƒ¡" + +#: storage/ipc/dsm_registry.c:146 +#, c-format +msgid "DSM segment name too long" +msgstr "DSM სეგმენტის სáƒáƒ®áƒ”ლი მეტისმეტáƒáƒ“ გრძელიáƒ" + +#: storage/ipc/dsm_registry.c:150 +#, c-format +msgid "DSM segment size must be nonzero" +msgstr "DSM სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒáƒœáƒ£áƒšáƒáƒ•áƒáƒœáƒ˜ უნდრიყáƒáƒ¡" + +#: storage/ipc/dsm_registry.c:176 +#, c-format +msgid "requested DSM segment size does not match size of existing segment" +msgstr "" + +#: storage/ipc/procarray.c:488 storage/lmgr/proc.c:352 tcop/backend_startup.c:304 +#, c-format +msgid "sorry, too many clients already" +msgstr "უკáƒáƒªáƒ áƒáƒ•áƒáƒ“, უკვე მეტისმეტáƒáƒ“ ბევრი კლიენტიáƒ" + +#: storage/ipc/procarray.c:3845 +#, c-format +msgid "database \"%s\" is being used by prepared transactions" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რ\"%s\" მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის მიერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" + +#: storage/ipc/procarray.c:3881 storage/ipc/procarray.c:3889 storage/ipc/signalfuncs.c:235 storage/ipc/signalfuncs.c:242 +#, c-format +msgid "permission denied to terminate process" +msgstr "პრáƒáƒªáƒ”სის შეწყვეტის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: storage/ipc/procarray.c:3882 storage/ipc/signalfuncs.c:236 +#, c-format +msgid "Only roles with the %s attribute may terminate processes of roles with the %s attribute." +msgstr "" + +#: storage/ipc/procarray.c:3890 storage/ipc/signalfuncs.c:243 +#, c-format +msgid "Only roles with privileges of the role whose process is being terminated or with privileges of the \"%s\" role may terminate this process." +msgstr "" + +#: storage/ipc/procsignal.c:416 +#, c-format +msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" +msgstr "" + +#: storage/ipc/shm_mq.c:383 +#, c-format +msgid "cannot send a message of size %zu via shared memory queue" +msgstr "გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების რიგის გáƒáƒ•ლით %zu ბáƒáƒ˜áƒ¢áƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ¡ მქáƒáƒœáƒ” შეტყáƒáƒ‘ინების გáƒáƒ’ზáƒáƒ•ნრშეუძლებელიáƒ" + +#: storage/ipc/shm_mq.c:718 +#, c-format +msgid "invalid message size %zu in shared memory queue" +msgstr "გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების რიგში áƒáƒ áƒ¡áƒ”ბული შეტყáƒáƒ‘ინების ზáƒáƒ›áƒ %zu áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:962 storage/lmgr/lock.c:1000 storage/lmgr/lock.c:2803 storage/lmgr/lock.c:4188 storage/lmgr/lock.c:4253 storage/lmgr/lock.c:4603 storage/lmgr/predicate.c:2463 storage/lmgr/predicate.c:2478 storage/lmgr/predicate.c:3875 storage/lmgr/predicate.c:4922 utils/hash/dynahash.c:1095 +#, c-format +msgid "out of shared memory" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერებáƒ" + +#: storage/ipc/shmem.c:161 storage/ipc/shmem.c:257 +#, c-format +msgid "out of shared memory (%zu bytes requested)" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერებრ(მáƒáƒ—ხáƒáƒ•ნილი იყრ%zu ბáƒáƒ˜áƒ¢áƒ˜)" + +#: storage/ipc/shmem.c:436 +#, c-format +msgid "could not create ShmemIndex entry for data structure \"%s\"" +msgstr "" + +#: storage/ipc/shmem.c:451 +#, c-format +msgid "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, actual %zu" +msgstr "" + +#: storage/ipc/shmem.c:470 +#, c-format +msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" +msgstr "" + +#: storage/ipc/shmem.c:502 storage/ipc/shmem.c:521 +#, c-format +msgid "requested shared memory size overflows size_t" +msgstr "მáƒáƒ—ხáƒáƒ•ნილი გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების ზáƒáƒ›áƒ site_t-ის გáƒáƒ“áƒáƒ•სებáƒáƒ¡ იწვევს" + +#: storage/ipc/signalfuncs.c:72 +#, c-format +msgid "PID %d is not a PostgreSQL backend process" +msgstr "პრáƒáƒªáƒ”სი PID-ით %d PostgreSQL-ის უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ პრáƒáƒªáƒ”სს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1448 utils/adt/mcxtfuncs.c:182 +#, c-format +msgid "could not send signal to process %d: %m" +msgstr "პრáƒáƒªáƒ”სისთვის %d სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნრშეუძლებელიáƒ: %m" + +#: storage/ipc/signalfuncs.c:129 storage/ipc/signalfuncs.c:136 +#, c-format +msgid "permission denied to cancel query" +msgstr "მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ£áƒ¥áƒ›áƒ”ბის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: storage/ipc/signalfuncs.c:130 +#, c-format +msgid "Only roles with the %s attribute may cancel queries of roles with the %s attribute." +msgstr "" + +#: storage/ipc/signalfuncs.c:137 +#, c-format +msgid "Only roles with privileges of the role whose query is being canceled or with privileges of the \"%s\" role may cancel this query." +msgstr "" + +#: storage/ipc/signalfuncs.c:179 +#, c-format +msgid "could not check the existence of the backend with PID %d: %m" +msgstr "" + +#: storage/ipc/signalfuncs.c:197 +#, c-format +msgid "backend with PID %d did not terminate within %lld millisecond" +msgid_plural "backend with PID %d did not terminate within %lld milliseconds" +msgstr[0] "" +msgstr[1] "" + +#: storage/ipc/signalfuncs.c:228 +#, c-format +msgid "\"timeout\" must not be negative" +msgstr "\"timeout\" უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ—ი áƒáƒ  შეიძლებáƒ, იყáƒáƒ¡" + +#: storage/ipc/signalfuncs.c:285 +#, c-format +msgid "rotation not possible because log collection not active" +msgstr "" + +#: storage/ipc/standby.c:329 +#, c-format +msgid "recovery still waiting after %ld.%03d ms: %s" +msgstr "" + +#: storage/ipc/standby.c:338 +#, c-format +msgid "recovery finished waiting after %ld.%03d ms: %s" +msgstr "" + +#: storage/ipc/standby.c:920 tcop/postgres.c:3169 +#, c-format +msgid "canceling statement due to conflict with recovery" +msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის გáƒáƒ£áƒ¥áƒ›áƒ”ბრáƒáƒ¦áƒ“გენáƒáƒ¡áƒ—áƒáƒœ კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜áƒ¡ გáƒáƒ›áƒ" + +#: storage/ipc/standby.c:921 tcop/postgres.c:2529 +#, c-format +msgid "User transaction caused buffer deadlock with recovery." +msgstr "" + +#: storage/ipc/standby.c:1486 +msgid "unknown reason" +msgstr "უცნáƒáƒ‘ი მიზეზი" + +#: storage/ipc/standby.c:1491 +msgid "recovery conflict on buffer pin" +msgstr "áƒáƒ¦áƒ“გენის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜ ბáƒáƒ¤áƒ”რის მიმáƒáƒ’რებისáƒáƒ¡" + +#: storage/ipc/standby.c:1494 +msgid "recovery conflict on lock" +msgstr "áƒáƒ¦áƒ“გენის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜ ბლáƒáƒ™áƒ˜áƒ áƒ”ბისáƒáƒ¡" + +#: storage/ipc/standby.c:1497 +msgid "recovery conflict on tablespace" +msgstr "áƒáƒ¦áƒ“გენის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜ ცხრილების სივრცეზე" + +#: storage/ipc/standby.c:1500 +msgid "recovery conflict on snapshot" +msgstr "áƒáƒ¦áƒ“გენის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜ სწრáƒáƒ¤ áƒáƒ¡áƒšáƒ–ე" + +#: storage/ipc/standby.c:1503 +msgid "recovery conflict on replication slot" +msgstr "áƒáƒ¦áƒ“გენის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ–ე" + +#: storage/ipc/standby.c:1506 +msgid "recovery conflict on buffer deadlock" +msgstr "áƒáƒ¦áƒ“გენის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜ ბáƒáƒ¤áƒ”რის ურთერთბლáƒáƒ™áƒ˜áƒ áƒ”ბისáƒáƒ¡" + +#: storage/ipc/standby.c:1509 +msgid "recovery conflict on database" +msgstr "áƒáƒ¦áƒ“გენის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ–ე" + +#: storage/large_object/inv_api.c:190 +#, c-format +msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" +msgstr "" + +#: storage/large_object/inv_api.c:272 +#, c-format +msgid "invalid flags for opening a large object: %d" +msgstr "დიდი áƒáƒ‘იექტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒšáƒ›áƒ”ბი: %d" + +#: storage/large_object/inv_api.c:297 storage/large_object/inv_api.c:309 storage/large_object/inv_api.c:506 storage/large_object/inv_api.c:617 storage/large_object/inv_api.c:807 +#, c-format +msgid "permission denied for large object %u" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ დიდ áƒáƒ‘იექტზე: \"%u\"" + +#: storage/large_object/inv_api.c:455 +#, c-format +msgid "invalid whence setting: %d" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ˜áƒ”ნტირის პáƒáƒ áƒáƒ›áƒ”ტრი: %d" + +#: storage/large_object/inv_api.c:627 +#, c-format +msgid "invalid large object write request size: %d" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ დიდი áƒáƒ‘იექტის ჩáƒáƒ¬áƒ”რის ზáƒáƒ›áƒ: %d" + +#: storage/lmgr/deadlock.c:1104 +#, c-format +msgid "Process %d waits for %s on %s; blocked by process %d." +msgstr "" + +#: storage/lmgr/deadlock.c:1123 +#, c-format +msgid "Process %d: %s" +msgstr "პრáƒáƒªáƒ”სი %d: %s" + +#: storage/lmgr/deadlock.c:1132 +#, c-format +msgid "deadlock detected" +msgstr "ნáƒáƒžáƒáƒ•ნირურთიერთბლáƒáƒ™áƒ˜áƒ áƒ”ბáƒ" + +#: storage/lmgr/deadlock.c:1135 +#, c-format +msgid "See server log for query details." +msgstr "მáƒáƒ—ხáƒáƒ•ნის დეტáƒáƒšáƒ”ბისთვის იხილეთ სერვერის ჟურნáƒáƒšáƒ˜." + +#: storage/lmgr/lmgr.c:858 +#, c-format +msgid "while updating tuple (%u,%u) in relation \"%s\"" +msgstr "კáƒáƒ áƒ¢áƒ”ჟის (%u,%u) გáƒáƒœáƒáƒ®áƒšáƒ”ბისáƒáƒ¡ ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ \"%s\"" + +#: storage/lmgr/lmgr.c:861 +#, c-format +msgid "while deleting tuple (%u,%u) in relation \"%s\"" +msgstr "კáƒáƒ áƒ¢áƒ”ჟის (%u,%u) წáƒáƒ¨áƒšáƒ˜áƒ¡áƒáƒ¡ ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ \"%s\"" + +#: storage/lmgr/lmgr.c:864 +#, c-format +msgid "while locking tuple (%u,%u) in relation \"%s\"" +msgstr "კáƒáƒ áƒ¢áƒ”ჟის (%u,%u) დáƒáƒ‘ლáƒáƒ™áƒ•ისáƒáƒ¡ ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ \"%s\"" + +#: storage/lmgr/lmgr.c:867 +#, c-format +msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" +msgstr "კáƒáƒ áƒ¢áƒ”ჟის (%u,%u) გáƒáƒœáƒáƒ®áƒšáƒ”ბული ვერსიის დáƒáƒ‘ლáƒáƒ™áƒ•ისáƒáƒ¡ ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ \"%s\"" + +#: storage/lmgr/lmgr.c:870 +#, c-format +msgid "while inserting index tuple (%u,%u) in relation \"%s\"" +msgstr "" + +#: storage/lmgr/lmgr.c:873 +#, c-format +msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" +msgstr "" + +#: storage/lmgr/lmgr.c:876 +#, c-format +msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" +msgstr "" + +#: storage/lmgr/lmgr.c:879 +#, c-format +msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" +msgstr "" + +#: storage/lmgr/lmgr.c:1249 +#, c-format +msgid "relation %u of database %u" +msgstr "ურთიერთáƒáƒ‘რ%u ბáƒáƒ–ისთვის %u" + +#: storage/lmgr/lmgr.c:1255 +#, c-format +msgid "extension of relation %u of database %u" +msgstr "ურთიერთáƒáƒ‘ის %u გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრბáƒáƒ–ისთვის %u" + +#: storage/lmgr/lmgr.c:1261 +#, c-format +msgid "pg_database.datfrozenxid of database %u" +msgstr "pg_database.datfrozenxid ბáƒáƒ–ისთვის %u" + +#: storage/lmgr/lmgr.c:1266 +#, c-format +msgid "page %u of relation %u of database %u" +msgstr "გვერდი %u ურთიერთáƒáƒ‘ისთვის %u ბáƒáƒ–ისთვის %u" + +#: storage/lmgr/lmgr.c:1273 +#, c-format +msgid "tuple (%u,%u) of relation %u of database %u" +msgstr "" + +#: storage/lmgr/lmgr.c:1281 +#, c-format +msgid "transaction %u" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ %u" + +#: storage/lmgr/lmgr.c:1286 +#, c-format +msgid "virtual transaction %d/%u" +msgstr "ვირტუáƒáƒšáƒ£áƒ áƒ˜ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ %d/%u" + +#: storage/lmgr/lmgr.c:1292 +#, c-format +msgid "speculative token %u of transaction %u" +msgstr "" + +#: storage/lmgr/lmgr.c:1298 +#, c-format +msgid "object %u of class %u of database %u" +msgstr "" + +#: storage/lmgr/lmgr.c:1306 +#, c-format +msgid "user lock [%u,%u,%u]" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ბლáƒáƒ™áƒ˜ [%u,%u,%u]" + +#: storage/lmgr/lmgr.c:1313 +#, c-format +msgid "advisory lock [%u,%u,%u,%u]" +msgstr "რეკáƒáƒ›áƒ”ნდებული ბლáƒáƒ™áƒ˜ [%u,%u,%u,%u]" + +#: storage/lmgr/lmgr.c:1321 +#, c-format +msgid "remote transaction %u of subscription %u of database %u" +msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ %u გáƒáƒ›áƒáƒ¬áƒ”რრ%u ბáƒáƒ–ისთვის %u" + +#: storage/lmgr/lmgr.c:1328 +#, c-format +msgid "unrecognized locktag type %d" +msgstr "locktag-ის უცნáƒáƒ‘ი ტიპი %d" + +#: storage/lmgr/lock.c:790 +#, c-format +msgid "cannot acquire lock mode %s on database objects while recovery is in progress" +msgstr "" + +#: storage/lmgr/lock.c:792 +#, c-format +msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." +msgstr "" + +#: storage/lmgr/lock.c:3252 storage/lmgr/lock.c:3320 storage/lmgr/lock.c:3436 +#, c-format +msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" +msgstr "" + +#: storage/lmgr/predicate.c:653 +#, c-format +msgid "not enough elements in RWConflictPool to record a read/write conflict" +msgstr "" + +#: storage/lmgr/predicate.c:654 storage/lmgr/predicate.c:679 +#, c-format +msgid "You might need to run fewer transactions at a time or increase \"max_connections\"." +msgstr "" + +#: storage/lmgr/predicate.c:678 +#, c-format +msgid "not enough elements in RWConflictPool to record a potential read/write conflict" +msgstr "" + +#: storage/lmgr/predicate.c:1681 +#, c-format +msgid "\"default_transaction_isolation\" is set to \"serializable\"." +msgstr "\"default_transaction_isolation\"-ი \"serializable\"-ზერდáƒáƒ§áƒ”ნებული." + +#: storage/lmgr/predicate.c:1682 +#, c-format +msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." +msgstr "" + +#: storage/lmgr/predicate.c:1733 +#, c-format +msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" +msgstr "" + +#: storage/lmgr/predicate.c:1812 utils/time/snapmgr.c:535 utils/time/snapmgr.c:541 +#, c-format +msgid "could not import the requested snapshot" +msgstr "მáƒáƒ—ხáƒáƒ•ნილი სწრáƒáƒ¤áƒ˜ áƒáƒ¡áƒšáƒ˜áƒ¡ შემáƒáƒ¢áƒáƒœáƒ შეუძლებელიáƒ" + +#: storage/lmgr/predicate.c:1813 utils/time/snapmgr.c:542 +#, c-format +msgid "The source process with PID %d is not running anymore." +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ პრáƒáƒªáƒ”სი PID-ით %d გáƒáƒ¨áƒ•ებული áƒáƒ¦áƒáƒ áƒáƒ." + +#: storage/lmgr/predicate.c:3986 storage/lmgr/predicate.c:4022 storage/lmgr/predicate.c:4055 storage/lmgr/predicate.c:4063 storage/lmgr/predicate.c:4102 storage/lmgr/predicate.c:4332 storage/lmgr/predicate.c:4651 storage/lmgr/predicate.c:4663 storage/lmgr/predicate.c:4710 storage/lmgr/predicate.c:4746 +#, c-format +msgid "could not serialize access due to read/write dependencies among transactions" +msgstr "" + +#: storage/lmgr/predicate.c:3988 storage/lmgr/predicate.c:4024 storage/lmgr/predicate.c:4057 storage/lmgr/predicate.c:4065 storage/lmgr/predicate.c:4104 storage/lmgr/predicate.c:4334 storage/lmgr/predicate.c:4653 storage/lmgr/predicate.c:4665 storage/lmgr/predicate.c:4712 storage/lmgr/predicate.c:4748 +#, c-format +msgid "The transaction might succeed if retried." +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ შეიძლებრგáƒáƒ˜áƒ¢áƒáƒœáƒáƒ¡, თუ გáƒáƒ˜áƒ›áƒ”áƒáƒ áƒ”ბთ." + +#: storage/lmgr/proc.c:348 +#, c-format +msgid "number of requested standby connections exceeds \"max_wal_senders\" (currently %d)" +msgstr "" + +#: storage/lmgr/proc.c:1541 +#, c-format +msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" +msgstr "" + +#: storage/lmgr/proc.c:1556 +#, c-format +msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" +msgstr "" + +#: storage/lmgr/proc.c:1565 +#, c-format +msgid "process %d still waiting for %s on %s after %ld.%03d ms" +msgstr "" + +#: storage/lmgr/proc.c:1572 +#, c-format +msgid "process %d acquired %s on %s after %ld.%03d ms" +msgstr "" + +#: storage/lmgr/proc.c:1589 +#, c-format +msgid "process %d failed to acquire %s on %s after %ld.%03d ms" +msgstr "" + +#: storage/page/bufpage.c:152 +#, c-format +msgid "page verification failed, calculated checksum %u but expected %u" +msgstr "" + +#: storage/page/bufpage.c:217 storage/page/bufpage.c:730 storage/page/bufpage.c:1073 storage/page/bufpage.c:1208 storage/page/bufpage.c:1314 storage/page/bufpage.c:1426 +#, c-format +msgid "corrupted page pointers: lower = %u, upper = %u, special = %u" +msgstr "" + +#: storage/page/bufpage.c:759 +#, c-format +msgid "corrupted line pointer: %u" +msgstr "ხáƒáƒ–ის დáƒáƒ–იáƒáƒœáƒ”ბული მáƒáƒ©áƒ•ენებელი: %u" + +#: storage/page/bufpage.c:789 storage/page/bufpage.c:1266 +#, c-format +msgid "corrupted item lengths: total %u, available space %u" +msgstr "" + +#: storage/page/bufpage.c:1092 storage/page/bufpage.c:1233 storage/page/bufpage.c:1330 storage/page/bufpage.c:1442 +#, c-format +msgid "corrupted line pointer: offset = %u, size = %u" +msgstr "" + +#: storage/smgr/md.c:485 storage/smgr/md.c:547 +#, c-format +msgid "cannot extend file \"%s\" beyond %u blocks" +msgstr "" + +#: storage/smgr/md.c:500 storage/smgr/md.c:611 +#, c-format +msgid "could not extend file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის შეცდáƒáƒ›áƒ \"%s\": %m" + +#: storage/smgr/md.c:506 +#, c-format +msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" +msgstr "" + +#: storage/smgr/md.c:589 +#, c-format +msgid "could not extend file \"%s\" with FileFallocate(): %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") FileFallocate()-ით გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის შეცდáƒáƒ›áƒ: %m" + +#: storage/smgr/md.c:869 +#, c-format +msgid "could not read blocks %u..%u in file \"%s\": %m" +msgstr "ბლáƒáƒ™áƒ”ბის %u..%u წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": %m" + +#: storage/smgr/md.c:895 +#, c-format +msgid "could not read blocks %u..%u in file \"%s\": read only %zu of %zu bytes" +msgstr "ვერ წáƒáƒ•იკითხე ბლáƒáƒ™áƒ”ბი %u..%u ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": წáƒáƒ•იკითხე, მხáƒáƒšáƒáƒ“, %zu ბáƒáƒ˜áƒ¢áƒ˜ %zu-დáƒáƒœ" + +#: storage/smgr/md.c:995 +#, c-format +msgid "could not write blocks %u..%u in file \"%s\": %m" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ %u..%u ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": %m" + +#: storage/smgr/md.c:1163 +#, c-format +msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" +msgstr "" + +#: storage/smgr/md.c:1218 +#, c-format +msgid "could not truncate file \"%s\" to %u blocks: %m" +msgstr "" + +#: storage/smgr/md.c:1688 +#, c-format +msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" +msgstr "" + +#: storage/smgr/md.c:1702 +#, c-format +msgid "could not open file \"%s\" (target block %u): %m" +msgstr "" + +#: tcop/backend_startup.c:85 +#, c-format +msgid "SSL configuration could not be loaded in child process" +msgstr "SSL კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ შვილ პრáƒáƒªáƒ”სში შეტვირთვის შეცდáƒáƒ›áƒ" + +#: tcop/backend_startup.c:208 +#, c-format +msgid "connection received: host=%s port=%s" +msgstr "შემáƒáƒ¡áƒ£áƒšáƒ˜ დáƒáƒ™áƒáƒ•შირებáƒ: ჰáƒáƒ¡áƒ¢áƒ˜=%s პáƒáƒ áƒ¢áƒ˜=%s" + +#: tcop/backend_startup.c:213 +#, c-format +msgid "connection received: host=%s" +msgstr "შემáƒáƒ¡áƒ£áƒšáƒ˜ დáƒáƒ™áƒáƒ•შირებáƒ: ჰáƒáƒ¡áƒ¢áƒ˜=%s" + +#: tcop/backend_startup.c:277 +#, c-format +msgid "the database system is starting up" +msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემის გáƒáƒ¨áƒ•ებáƒ" + +#: tcop/backend_startup.c:283 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემრჯერ მიერთებებს áƒáƒ  იღებს" + +#: tcop/backend_startup.c:284 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "" + +#: tcop/backend_startup.c:288 +#, c-format +msgid "the database system is not accepting connections" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემრმიერთებებს áƒáƒ  იღებს" + +#: tcop/backend_startup.c:289 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "ცხელი ლáƒáƒ“ინის რეჟიმი გáƒáƒ›áƒáƒ áƒ—ულიáƒ." + +#: tcop/backend_startup.c:294 +#, c-format +msgid "the database system is shutting down" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემრითიშებáƒ" + +#: tcop/backend_startup.c:299 +#, c-format +msgid "the database system is in recovery mode" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემრáƒáƒ¦áƒ“გენის რეჟიმშიáƒ" + +#: tcop/backend_startup.c:414 +#, c-format +msgid "received direct SSL connection request without ALPN protocol negotiation extension" +msgstr "" + +#: tcop/backend_startup.c:420 +#, c-format +msgid "direct SSL connection accepted" +msgstr "პირდáƒáƒžáƒ˜áƒ áƒ˜ SSL მიერთებრმიღებულიáƒ" + +#: tcop/backend_startup.c:430 +#, c-format +msgid "direct SSL connection rejected" +msgstr "პირდáƒáƒžáƒ˜áƒ áƒ˜ SSL მიერთებრუáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒšáƒ˜áƒ" + +#: tcop/backend_startup.c:489 tcop/backend_startup.c:517 +#, c-format +msgid "incomplete startup packet" +msgstr "გáƒáƒ¨áƒ•ების დáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელი პáƒáƒ™áƒ”ტი" + +#: tcop/backend_startup.c:501 tcop/backend_startup.c:538 +#, c-format +msgid "invalid length of startup packet" +msgstr "გáƒáƒ¨áƒ•ების პáƒáƒ™áƒ”ტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე" + +#: tcop/backend_startup.c:573 +#, c-format +msgid "SSLRequest accepted" +msgstr "" + +#: tcop/backend_startup.c:576 +#, c-format +msgid "SSLRequest rejected" +msgstr "" + +#: tcop/backend_startup.c:585 +#, c-format +msgid "failed to send SSL negotiation response: %m" +msgstr "შეცდáƒáƒ›áƒ SSL მáƒáƒšáƒáƒžáƒáƒ áƒáƒ™áƒ”ბის პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნისáƒáƒ¡: %m" + +#: tcop/backend_startup.c:603 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "'SSL'-ის მáƒáƒ—ხáƒáƒ•ნის შემდეგ მიღებულირდáƒáƒ£áƒ¨áƒ˜áƒ¤áƒ áƒáƒ•ი მáƒáƒœáƒáƒªáƒ”მები" + +#: tcop/backend_startup.c:604 tcop/backend_startup.c:658 +#, c-format +msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." +msgstr "" + +#: tcop/backend_startup.c:627 +#, c-format +msgid "GSSENCRequest accepted" +msgstr "" + +#: tcop/backend_startup.c:630 +#, c-format +msgid "GSSENCRequest rejected" +msgstr "" + +#: tcop/backend_startup.c:639 +#, c-format +msgid "failed to send GSSAPI negotiation response: %m" +msgstr "შეცდáƒáƒ›áƒ GSSAPI მáƒáƒšáƒáƒžáƒáƒ áƒáƒ™áƒ”ბის პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნისáƒáƒ¡: %m" + +#: tcop/backend_startup.c:657 +#, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "'GSSAPI' დáƒáƒ¨áƒ˜áƒ¤áƒ•რის მáƒáƒ—ხáƒáƒ•ნის შემდეგ მიღებული მáƒáƒœáƒáƒªáƒ”მები დáƒáƒ£áƒ¨áƒ˜áƒ¤áƒ áƒáƒ•იáƒ" + +#: tcop/backend_startup.c:681 +#, c-format +msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" +msgstr "" + +#: tcop/backend_startup.c:744 +#, c-format +msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." +msgstr "სწáƒáƒ áƒ˜ მნიშვნელáƒáƒ‘ებიáƒ: \"false\", 0, \"true\", 1, \"database\"." + +#: tcop/backend_startup.c:785 +#, c-format +msgid "invalid startup packet layout: expected terminator as last byte" +msgstr "" + +#: tcop/backend_startup.c:802 +#, c-format +msgid "no PostgreSQL user name specified in startup packet" +msgstr "გáƒáƒ¨áƒ•ების პáƒáƒ™áƒ”ტში PostgreSQL-ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი მითითებული áƒáƒ áƒáƒ" + +#: tcop/fastpath.c:142 utils/fmgr/fmgr.c:2161 +#, c-format +msgid "function with OID %u does not exist" +msgstr "ფუნქცირOID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: tcop/fastpath.c:149 +#, c-format +msgid "cannot call function \"%s\" via fastpath interface" +msgstr "" + +#: tcop/fastpath.c:234 +#, c-format +msgid "fastpath function call: \"%s\" (OID %u)" +msgstr "" + +#: tcop/fastpath.c:313 tcop/postgres.c:1365 tcop/postgres.c:1601 tcop/postgres.c:2055 tcop/postgres.c:2305 +#, c-format +msgid "duration: %s ms" +msgstr "ხáƒáƒœáƒ’რძლივáƒáƒ‘áƒ: %s მწმ" + +#: tcop/fastpath.c:317 +#, c-format +msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" +msgstr "" + +#: tcop/fastpath.c:353 +#, c-format +msgid "function call message contains %d arguments but function requires %d" +msgstr "" + +#: tcop/fastpath.c:361 +#, c-format +msgid "function call message contains %d argument formats but %d arguments" +msgstr "" + +#: tcop/fastpath.c:385 +#, c-format +msgid "invalid argument size %d in function call message" +msgstr "" + +#: tcop/fastpath.c:448 +#, c-format +msgid "incorrect binary data format in function argument %d" +msgstr "" + +#: tcop/postgres.c:463 tcop/postgres.c:4925 +#, c-format +msgid "invalid frontend message type %d" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წინáƒáƒ‘áƒáƒšáƒáƒ¡ შეტყáƒáƒ‘ინების ტიპი %d" + +#: tcop/postgres.c:1072 +#, c-format +msgid "statement: %s" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜: %s" + +#: tcop/postgres.c:1370 +#, c-format +msgid "duration: %s ms statement: %s" +msgstr "ხáƒáƒœáƒ’რძლივáƒáƒ‘áƒ: %s მწმ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ: %s" + +#: tcop/postgres.c:1476 +#, c-format +msgid "cannot insert multiple commands into a prepared statement" +msgstr "" + +#: tcop/postgres.c:1606 +#, c-format +msgid "duration: %s ms parse %s: %s" +msgstr "ხáƒáƒœáƒ’რძლივáƒáƒ‘áƒ: %s მწმ %s-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒ: %s" + +#: tcop/postgres.c:1672 tcop/postgres.c:2625 +#, c-format +msgid "unnamed prepared statement does not exist" +msgstr "" + +#: tcop/postgres.c:1713 +#, c-format +msgid "bind message has %d parameter formats but %d parameters" +msgstr "" + +#: tcop/postgres.c:1719 +#, c-format +msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" +msgstr "" + +#: tcop/postgres.c:1933 +#, c-format +msgid "incorrect binary data format in bind parameter %d" +msgstr "" + +#: tcop/postgres.c:2060 +#, c-format +msgid "duration: %s ms bind %s%s%s: %s" +msgstr "ხáƒáƒœáƒ’რძლივáƒáƒ‘áƒ: %s მწმ მიბმრ%s%s%s: %s" + +#: tcop/postgres.c:2114 tcop/postgres.c:2708 +#, c-format +msgid "portal \"%s\" does not exist" +msgstr "პáƒáƒ áƒ¢áƒáƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: tcop/postgres.c:2185 +#, c-format +msgid "%s %s%s%s: %s" +msgstr "%s %s%s%s: %s" + +#: tcop/postgres.c:2187 tcop/postgres.c:2313 +msgid "execute fetch from" +msgstr "" + +#: tcop/postgres.c:2188 tcop/postgres.c:2314 +msgid "execute" +msgstr "გáƒáƒ¨áƒ•ებáƒ" + +#: tcop/postgres.c:2310 +#, c-format +msgid "duration: %s ms %s %s%s%s: %s" +msgstr "ხáƒáƒœáƒ’რძლივáƒáƒ‘áƒ: %s მწმs %s %s%s%s: %s" + +#: tcop/postgres.c:2458 +#, c-format +msgid "prepare: %s" +msgstr "მáƒáƒ›áƒ–áƒáƒ“ებáƒ: %s" + +#: tcop/postgres.c:2483 +#, c-format +msgid "Parameters: %s" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები: %s" + +#: tcop/postgres.c:2498 +#, c-format +msgid "Abort reason: recovery conflict" +msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მიზეზი: áƒáƒ¦áƒ“გენის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜" + +#: tcop/postgres.c:2514 +#, c-format +msgid "User was holding shared buffer pin for too long." +msgstr "" + +#: tcop/postgres.c:2517 +#, c-format +msgid "User was holding a relation lock for too long." +msgstr "" + +#: tcop/postgres.c:2520 +#, c-format +msgid "User was or might have been using tablespace that must be dropped." +msgstr "" + +#: tcop/postgres.c:2523 +#, c-format +msgid "User query might have needed to see row versions that must be removed." +msgstr "" + +#: tcop/postgres.c:2526 +#, c-format +msgid "User was using a logical replication slot that must be invalidated." +msgstr "" + +#: tcop/postgres.c:2532 +#, c-format +msgid "User was connected to a database that must be dropped." +msgstr "" + +#: tcop/postgres.c:2571 +#, c-format +msgid "portal \"%s\" parameter $%d = %s" +msgstr "პáƒáƒ áƒ¢áƒáƒšáƒ˜áƒ¡ \"%s\" პáƒáƒ áƒáƒ›áƒ”ტრი $%d = %s" + +#: tcop/postgres.c:2574 +#, c-format +msgid "portal \"%s\" parameter $%d" +msgstr "პáƒáƒ áƒ¢áƒáƒšáƒ˜áƒ¡ \"%s\" პáƒáƒ áƒáƒ›áƒ”ტრი $%d" + +#: tcop/postgres.c:2580 +#, c-format +msgid "unnamed portal parameter $%d = %s" +msgstr "უსáƒáƒ®áƒ”ლრპáƒáƒ áƒ¢áƒáƒšáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი $%d = %s" + +#: tcop/postgres.c:2583 +#, c-format +msgid "unnamed portal parameter $%d" +msgstr "უსáƒáƒ®áƒ”ლრპáƒáƒ áƒ¢áƒáƒšáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი $%d" + +#: tcop/postgres.c:2928 +#, c-format +msgid "terminating connection because of unexpected SIGQUIT signal" +msgstr "" + +#: tcop/postgres.c:2934 +#, c-format +msgid "terminating connection because of crash of another server process" +msgstr "" + +#: tcop/postgres.c:2935 +#, c-format +msgid "The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory." +msgstr "" + +#: tcop/postgres.c:2939 tcop/postgres.c:3192 +#, c-format +msgid "In a moment you should be able to reconnect to the database and repeat your command." +msgstr "" + +#: tcop/postgres.c:2946 +#, c-format +msgid "terminating connection due to immediate shutdown command" +msgstr "მიერთების შეწყვეტრდáƒáƒ£áƒ§áƒáƒ•ნებლივი გáƒáƒ›áƒáƒ áƒ—ვის ბრძáƒáƒœáƒ”ბის გáƒáƒ›áƒ" + +#: tcop/postgres.c:3024 +#, c-format +msgid "floating-point exception" +msgstr "წილáƒáƒ“ი რიცხვების áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: tcop/postgres.c:3025 +#, c-format +msgid "An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero." +msgstr "" + +#: tcop/postgres.c:3190 +#, c-format +msgid "terminating connection due to conflict with recovery" +msgstr "მიერთების შეწყვეტრáƒáƒ¦áƒ“გენáƒáƒ¡áƒ—áƒáƒœ კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜áƒ¡ გáƒáƒ›áƒ" + +#: tcop/postgres.c:3262 +#, c-format +msgid "canceling authentication due to timeout" +msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ გáƒáƒ£áƒ¥áƒ›áƒ“რმáƒáƒšáƒáƒ“ინის ვáƒáƒ“ის áƒáƒ›áƒáƒ¬áƒ£áƒ áƒ•ის გáƒáƒ›áƒ" + +#: tcop/postgres.c:3266 +#, c-format +msgid "terminating autovacuum process due to administrator command" +msgstr "áƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის პრáƒáƒªáƒ”სის შეწყვეტრáƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის გáƒáƒ›áƒ" + +#: tcop/postgres.c:3270 +#, c-format +msgid "terminating logical replication worker due to administrator command" +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის შეწყვეტრáƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის გáƒáƒ›áƒ" + +#: tcop/postgres.c:3290 +#, c-format +msgid "terminating connection due to administrator command" +msgstr "მიერთების შეწყვეტრáƒáƒ“მინისტრáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის გáƒáƒ›áƒ" + +#: tcop/postgres.c:3321 +#, c-format +msgid "connection to client lost" +msgstr "კლიენტთáƒáƒœ შეერთების შეცდáƒáƒ›áƒ" + +#: tcop/postgres.c:3373 +#, c-format +msgid "canceling statement due to lock timeout" +msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბრგáƒáƒ£áƒ¥áƒ›áƒ“ებრბლáƒáƒ™áƒ˜áƒ¡ მáƒáƒšáƒáƒ“ინის ვáƒáƒ“ის áƒáƒ›áƒáƒ¬áƒ£áƒ áƒ•ის გáƒáƒ›áƒ" + +#: tcop/postgres.c:3380 +#, c-format +msgid "canceling statement due to statement timeout" +msgstr "" + +#: tcop/postgres.c:3387 +#, c-format +msgid "canceling autovacuum task" +msgstr "áƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის áƒáƒ›áƒáƒªáƒáƒœáƒ˜áƒ¡ გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ" + +#: tcop/postgres.c:3400 +#, c-format +msgid "canceling statement due to user request" +msgstr "" + +#: tcop/postgres.c:3421 +#, c-format +msgid "terminating connection due to idle-in-transaction timeout" +msgstr "" + +#: tcop/postgres.c:3434 +#, c-format +msgid "terminating connection due to transaction timeout" +msgstr "მიერთების შეწყვეტრტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ მáƒáƒšáƒáƒ“ინის ვáƒáƒ“ის áƒáƒ›áƒáƒ¬áƒ£áƒ áƒ•ის გáƒáƒ›áƒ" + +#: tcop/postgres.c:3447 +#, c-format +msgid "terminating connection due to idle-session timeout" +msgstr "" + +#: tcop/postgres.c:3537 +#, c-format +msgid "stack depth limit exceeded" +msgstr "გáƒáƒ“áƒáƒªáƒ˜áƒšáƒ”ბულირსტეკის სიღრმის ლიმიტი" + +#: tcop/postgres.c:3538 +#, c-format +msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." +msgstr "" + +#: tcop/postgres.c:3585 +#, c-format +msgid "\"max_stack_depth\" must not exceed %ldkB." +msgstr "\"max_stack_depth\" %ldკბ-ს áƒáƒ  უნდრზცდებáƒáƒ“ეს." + +#: tcop/postgres.c:3587 +#, c-format +msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." +msgstr "" + +#: tcop/postgres.c:3610 +#, c-format +msgid "\"client_connection_check_interval\" must be set to 0 on this platform." +msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე \"client_connection_check_interval\" 0 უნდრიყáƒáƒ¡." + +#: tcop/postgres.c:3631 +#, c-format +msgid "Cannot enable parameter when \"log_statement_stats\" is true." +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის ჩáƒáƒ áƒ—ვრმáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ \"log_statement_stats\" ჩáƒáƒ áƒ—ულიáƒ, შეუძლებელიáƒ." + +#: tcop/postgres.c:3646 +#, c-format +msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." +msgstr "ვერ ჩáƒáƒ áƒ—áƒáƒ•თ \"log_statement_stats\"-ს, რáƒáƒªáƒ \"when log_parser_stats\", \"log_planner_stats\", áƒáƒœ \"log_executor_stats\" ჭეშმáƒáƒ áƒ˜áƒ¢áƒ˜áƒ." + +#: tcop/postgres.c:4011 +#, c-format +msgid "invalid command-line argument for server process: %s" +msgstr "" + +#: tcop/postgres.c:4012 tcop/postgres.c:4018 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." + +#: tcop/postgres.c:4016 +#, c-format +msgid "%s: invalid command-line argument: %s" +msgstr "%s: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი: %s" + +#: tcop/postgres.c:4069 +#, c-format +msgid "%s: no database nor user name specified" +msgstr "%s: áƒáƒ áƒª ბáƒáƒ–áƒ, áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი მითითებული áƒáƒ áƒáƒ" + +#: tcop/postgres.c:4822 +#, c-format +msgid "invalid CLOSE message subtype %d" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ CLOSE შეტყáƒáƒ‘ინების ქვეტიპი %d" + +#: tcop/postgres.c:4859 +#, c-format +msgid "invalid DESCRIBE message subtype %d" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ DESCRIBE შეტყáƒáƒ‘ინების ქვეტიპი %d" + +#: tcop/postgres.c:4946 +#, c-format +msgid "fastpath function calls not supported in a replication connection" +msgstr "" + +#: tcop/postgres.c:4950 +#, c-format +msgid "extended query protocol not supported in a replication connection" +msgstr "" + +#: tcop/postgres.c:5130 +#, c-format +msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" +msgstr "" + +#: tcop/pquery.c:641 +#, c-format +msgid "bind message has %d result formats but query has %d columns" +msgstr "" + +#: tcop/pquery.c:944 tcop/pquery.c:1701 +#, c-format +msgid "cursor can only scan forward" +msgstr "კურსáƒáƒ áƒ¡ მხáƒáƒšáƒáƒ“ წინ სკáƒáƒœáƒ˜áƒ áƒ”ბრშეუძლიáƒ" + +#: tcop/pquery.c:945 tcop/pquery.c:1702 +#, c-format +msgid "Declare it with SCROLL option to enable backward scan." +msgstr "" + +#. translator: %s is name of a SQL command, eg CREATE +#: tcop/utility.c:410 +#, c-format +msgid "cannot execute %s in a read-only transaction" +msgstr "" + +#. translator: %s is name of a SQL command, eg CREATE +#: tcop/utility.c:428 +#, c-format +msgid "cannot execute %s during a parallel operation" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ %s შესრულებრშეუძლებელიáƒ" + +#. translator: %s is name of a SQL command, eg CREATE +#: tcop/utility.c:447 +#, c-format +msgid "cannot execute %s during recovery" +msgstr "áƒáƒ¦áƒ“გენის დრáƒáƒ¡ %s შესრულებრშეუძლებელიáƒ" + +#. translator: %s is name of a SQL command, eg PREPARE +#: tcop/utility.c:465 +#, c-format +msgid "cannot execute %s within security-restricted operation" +msgstr "" + +#. translator: %s is name of a SQL command, eg LISTEN +#: tcop/utility.c:821 +#, c-format +msgid "cannot execute %s within a background process" +msgstr "ფáƒáƒœáƒ˜áƒ¡ პრáƒáƒªáƒ”სში %s-ის შესრულებრშეუძლებელიáƒ" + +#. translator: %s is name of a SQL command, eg CHECKPOINT +#: tcop/utility.c:947 +#, c-format +msgid "permission denied to execute %s command" +msgstr "ბრძáƒáƒœáƒ”ბის შესრულების წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ: %s" + +#: tcop/utility.c:949 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may execute this command." +msgstr "áƒáƒ› ბრძáƒáƒœáƒ”ბის შესრულებრმხáƒáƒšáƒáƒ“ \"%s\" რáƒáƒšáƒ˜áƒ¡ პრივილეგიების მქáƒáƒœáƒ”ებს შეუძლიáƒáƒ—." + +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:616 +#, c-format +msgid "multiple DictFile parameters" +msgstr "გáƒáƒ›áƒ”áƒáƒ áƒ”ბáƒáƒ“ი DictFile პáƒáƒ áƒáƒ›áƒ”ტრი" + +#: tsearch/dict_ispell.c:63 +#, c-format +msgid "multiple AffFile parameters" +msgstr "გáƒáƒ›áƒ”áƒáƒ áƒ”ბáƒáƒ“ი AffFile პáƒáƒ áƒáƒ›áƒ”ტრი" + +#: tsearch/dict_ispell.c:82 +#, c-format +msgid "unrecognized Ispell parameter: \"%s\"" +msgstr "უცნáƒáƒ‘ი lspell-ის პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: tsearch/dict_ispell.c:96 +#, c-format +msgid "missing AffFile parameter" +msgstr "áƒáƒ™áƒšáƒ˜áƒ პáƒáƒ áƒáƒ›áƒ”ტრი AffFile" + +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:640 +#, c-format +msgid "missing DictFile parameter" +msgstr "áƒáƒ™áƒšáƒ˜áƒ პáƒáƒ áƒáƒ›áƒ”ტრი DictFile" + +#: tsearch/dict_simple.c:58 +#, c-format +msgid "multiple Accept parameters" +msgstr "გáƒáƒ›áƒ”áƒáƒ áƒ”ბáƒáƒ“ი Accept პáƒáƒ áƒáƒ›áƒ”ტრი" + +#: tsearch/dict_simple.c:66 +#, c-format +msgid "unrecognized simple dictionary parameter: \"%s\"" +msgstr "უცნáƒáƒ‘ი მáƒáƒ áƒ¢áƒ˜áƒ•ი ლექსიკáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: tsearch/dict_synonym.c:118 +#, c-format +msgid "unrecognized synonym parameter: \"%s\"" +msgstr "უცნáƒáƒ‘ი სინáƒáƒœáƒ˜áƒ›áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: tsearch/dict_synonym.c:125 +#, c-format +msgid "missing Synonyms parameter" +msgstr "áƒáƒ™áƒšáƒ˜áƒ პáƒáƒ áƒáƒ›áƒ”ტრი Synonyms" + +#: tsearch/dict_synonym.c:132 +#, c-format +msgid "could not open synonym file \"%s\": %m" +msgstr "სინáƒáƒœáƒ˜áƒ›áƒ¡ ფáƒáƒ˜áƒšáƒ˜ \"%s\" ვერ გáƒáƒ•ხსენი: %m" + +#: tsearch/dict_thesaurus.c:179 +#, c-format +msgid "could not open thesaurus file \"%s\": %m" +msgstr "გáƒáƒœáƒ›áƒáƒ áƒ¢áƒ”ბითი ლექსიკáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ \"%s\" ვერ გáƒáƒ•ხსენი: %m" + +#: tsearch/dict_thesaurus.c:212 +#, c-format +msgid "unexpected delimiter" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი გáƒáƒ›áƒ§áƒáƒ¤áƒ˜" + +#: tsearch/dict_thesaurus.c:262 tsearch/dict_thesaurus.c:278 +#, c-format +msgid "unexpected end of line or lexeme" +msgstr "" + +#: tsearch/dict_thesaurus.c:287 +#, c-format +msgid "unexpected end of line" +msgstr "ხáƒáƒ–ის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" + +#: tsearch/dict_thesaurus.c:292 +#, c-format +msgid "too many lexemes in thesaurus entry" +msgstr "" + +#: tsearch/dict_thesaurus.c:416 +#, c-format +msgid "thesaurus sample word \"%s\" isn't recognized by subdictionary (rule %d)" +msgstr "" + +#: tsearch/dict_thesaurus.c:422 +#, c-format +msgid "thesaurus sample word \"%s\" is a stop word (rule %d)" +msgstr "" + +#: tsearch/dict_thesaurus.c:425 +#, c-format +msgid "Use \"?\" to represent a stop word within a sample phrase." +msgstr "" + +#: tsearch/dict_thesaurus.c:567 +#, c-format +msgid "thesaurus substitute word \"%s\" is a stop word (rule %d)" +msgstr "" + +#: tsearch/dict_thesaurus.c:574 +#, c-format +msgid "thesaurus substitute word \"%s\" isn't recognized by subdictionary (rule %d)" +msgstr "" + +#: tsearch/dict_thesaurus.c:586 +#, c-format +msgid "thesaurus substitute phrase is empty (rule %d)" +msgstr "" + +#: tsearch/dict_thesaurus.c:625 +#, c-format +msgid "multiple Dictionary parameters" +msgstr "გáƒáƒœáƒ›áƒ”áƒáƒ áƒ”ბáƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრი Dictionary" + +#: tsearch/dict_thesaurus.c:632 +#, c-format +msgid "unrecognized Thesaurus parameter: \"%s\"" +msgstr "გáƒáƒ›áƒáƒ£áƒªáƒœáƒáƒ‘ი გáƒáƒœáƒ›áƒáƒ áƒ¢áƒ”ბითი ლექსიკáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: tsearch/dict_thesaurus.c:644 +#, c-format +msgid "missing Dictionary parameter" +msgstr "áƒáƒ™áƒšáƒ˜áƒ პáƒáƒ áƒáƒ›áƒ”ტრი Dictionary" + +#: tsearch/spell.c:381 tsearch/spell.c:398 tsearch/spell.c:407 tsearch/spell.c:1043 +#, c-format +msgid "invalid affix flag \"%s\"" +msgstr "áƒáƒ¤áƒ˜áƒ¥áƒ¡áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒšáƒáƒ›áƒ˜: %s" + +#: tsearch/spell.c:385 tsearch/spell.c:1047 +#, c-format +msgid "affix flag \"%s\" is out of range" +msgstr "áƒáƒ¤áƒ˜áƒ¥áƒ¡áƒ˜áƒ¡ áƒáƒšáƒáƒ›áƒ˜ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: %s" + +#: tsearch/spell.c:415 +#, c-format +msgid "invalid character in affix flag \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიმბáƒáƒšáƒ áƒáƒ¤áƒ˜áƒ¥áƒ¡áƒ˜áƒ¡ áƒáƒšáƒáƒ›áƒ¨áƒ˜: %s" + +#: tsearch/spell.c:435 +#, c-format +msgid "invalid affix flag \"%s\" with \"long\" flag value" +msgstr "áƒáƒ¤áƒ˜áƒ¥áƒ¡áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒšáƒáƒ›áƒ˜ \"%s\" áƒáƒšáƒáƒ›áƒ˜áƒ¡ მნიშვნელáƒáƒ‘ით \"long\"" + +#: tsearch/spell.c:525 +#, c-format +msgid "could not open dictionary file \"%s\": %m" +msgstr "ლექსიკáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: tsearch/spell.c:1170 tsearch/spell.c:1182 tsearch/spell.c:1742 tsearch/spell.c:1747 tsearch/spell.c:1752 +#, c-format +msgid "invalid affix alias \"%s\"" +msgstr "áƒáƒ¤áƒ˜áƒ¡áƒ¥áƒ¡áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მეტსáƒáƒ®áƒ”ლი: %s" + +#: tsearch/spell.c:1223 tsearch/spell.c:1294 tsearch/spell.c:1443 +#, c-format +msgid "could not open affix file \"%s\": %m" +msgstr "áƒáƒ¤áƒ˜áƒ¥áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: tsearch/spell.c:1277 +#, c-format +msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" +msgstr "" + +#: tsearch/spell.c:1321 +#, c-format +msgid "invalid number of flag vector aliases" +msgstr "áƒáƒšáƒ›áƒ˜áƒ¡ ვექტáƒáƒ áƒ˜áƒ¡ მეტსáƒáƒ®áƒ”ლების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რიცხვი" + +#: tsearch/spell.c:1344 +#, c-format +msgid "number of aliases exceeds specified number %d" +msgstr "მეტსáƒáƒ®áƒ”ლების რიცხვი მითითებულ მნიშვნელáƒáƒ‘áƒáƒ–ე მეტიáƒ: %d" + +#: tsearch/spell.c:1559 +#, c-format +msgid "affix file contains both old-style and new-style commands" +msgstr "áƒáƒ¤áƒ˜áƒ¥áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒ˜áƒ•ე, áƒáƒ®áƒáƒšáƒ˜ დრძველი სტილის ბრძáƒáƒœáƒ”ბებს შეიცáƒáƒ•ს" + +#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:277 utils/adt/tsvector_op.c:1126 +#, c-format +msgid "string is too long for tsvector (%d bytes, max %d bytes)" +msgstr "სტრიქáƒáƒœáƒ˜ tsvector-ისთვის ძáƒáƒšáƒ˜áƒáƒœáƒ’რძელირ(%d ბáƒáƒ˜áƒ¢áƒ˜, მáƒáƒ¥áƒ¡ %d ბáƒáƒ˜áƒ¢áƒ˜)" + +#: tsearch/ts_locale.c:236 +#, c-format +msgid "line %d of configuration file \"%s\": \"%s\"" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%2$s\" %1$d-ე ხáƒáƒ–ზე: \"%3$s\"" + +#: tsearch/ts_locale.c:315 +#, c-format +msgid "conversion from wchar_t to server encoding failed: %m" +msgstr "" + +#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 tsearch/ts_parse.c:580 +#, c-format +msgid "word is too long to be indexed" +msgstr "სიტყვრძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ, რáƒáƒ› დáƒáƒ˜áƒœáƒ“ექსდეს" + +#: tsearch/ts_parse.c:388 tsearch/ts_parse.c:395 tsearch/ts_parse.c:574 tsearch/ts_parse.c:581 +#, c-format +msgid "Words longer than %d characters are ignored." +msgstr "%d სიმბáƒáƒšáƒáƒ–ე გრძელი სიტყვები იგნáƒáƒ áƒ˜áƒ áƒ“ებáƒ." + +#: tsearch/ts_utils.c:51 +#, c-format +msgid "invalid text search configuration file name \"%s\"" +msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\"" + +#: tsearch/ts_utils.c:83 +#, c-format +msgid "could not open stop-word file \"%s\": %m" +msgstr "" + +#: tsearch/wparser.c:306 tsearch/wparser.c:394 tsearch/wparser.c:471 +#, c-format +msgid "text search parser does not support headline creation" +msgstr "" + +#: tsearch/wparser_def.c:2664 +#, c-format +msgid "unrecognized headline parameter: \"%s\"" +msgstr "" + +#: tsearch/wparser_def.c:2674 +#, c-format +msgid "MinWords should be less than MaxWords" +msgstr "MinWords MaxWords-ზე ნáƒáƒ™áƒšáƒ”ბი უნდრიყáƒáƒ¡" + +#: tsearch/wparser_def.c:2678 +#, c-format +msgid "MinWords should be positive" +msgstr "MinWords დáƒáƒ“ებით უნდრიყáƒáƒ¡" + +#: tsearch/wparser_def.c:2682 +#, c-format +msgid "ShortWord should be >= 0" +msgstr "ShortWord >= 0 უნდრიყáƒáƒ¡" + +#: tsearch/wparser_def.c:2686 +#, c-format +msgid "MaxFragments should be >= 0" +msgstr "MaxFragments >= 0 უნდრიყáƒáƒ¡" + +#: utils/activity/pgstat.c:435 +#, c-format +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "" + +#: utils/activity/pgstat.c:1252 +#, c-format +msgid "invalid statistics kind: \"%s\"" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: \"%s\"" + +#: utils/activity/pgstat.c:1332 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %m" + +#: utils/activity/pgstat.c:1444 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ: %m" + +#: utils/activity/pgstat.c:1453 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") დáƒáƒ®áƒ£áƒ áƒ•რშეუძლებელიáƒ: %m" + +#: utils/activity/pgstat.c:1461 +#, c-format +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\"-დáƒáƒœ \"%s\" -მდე სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრშეუძლებელიáƒ: %m" + +#: utils/activity/pgstat.c:1510 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %m" + +#: utils/activity/pgstat.c:1672 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ დáƒáƒ–იáƒáƒœáƒ”ბული ფáƒáƒ˜áƒšáƒ˜ \"%s\"" + +#: utils/activity/pgstat_function.c:118 +#, c-format +msgid "function call to dropped function" +msgstr "ფუნქცირწáƒáƒ¨áƒšáƒ˜áƒš ფუნქციáƒáƒ¡ იძáƒáƒ®áƒ”ბს" + +#: utils/activity/pgstat_xact.c:362 +#, c-format +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "" + +#: utils/activity/wait_event.c:210 +#, c-format +msgid "too many wait events for extensions" +msgstr "მეტისმეტáƒáƒ“ ბევრი მáƒáƒªáƒ“ის მáƒáƒ•ლენრგáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბებისთვის" + +#: utils/adt/acl.c:183 utils/adt/name.c:93 +#, c-format +msgid "identifier too long" +msgstr "იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#: utils/adt/acl.c:184 utils/adt/name.c:94 +#, c-format +msgid "Identifier must be less than %d characters." +msgstr "" + +#: utils/adt/acl.c:272 +#, c-format +msgid "unrecognized key word: \"%s\"" +msgstr "უცნáƒáƒ‘ი სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ სიტყვáƒ: \"%s\"" + +#: utils/adt/acl.c:273 +#, c-format +msgid "ACL key word must be \"group\" or \"user\"." +msgstr "ACL-ის სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ სიტყვრუნდრიყáƒáƒ¡ \"group\" áƒáƒœ \"user\"." + +#: utils/adt/acl.c:281 +#, c-format +msgid "missing name" +msgstr "სáƒáƒ®áƒ”ლი áƒáƒ™áƒšáƒ˜áƒ" + +#: utils/adt/acl.c:282 +#, c-format +msgid "A name must follow the \"group\" or \"user\" key word." +msgstr "" + +#: utils/adt/acl.c:288 +#, c-format +msgid "missing \"=\" sign" +msgstr "áƒáƒ™áƒšáƒ˜áƒ \"=\" ნიშáƒáƒœáƒ˜" + +#: utils/adt/acl.c:350 +#, c-format +msgid "invalid mode character: must be one of \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რეჟიმის სიმბáƒáƒšáƒ: უნდრიყáƒáƒ¡ ერთ-ერთი სიიდáƒáƒœ \"%s\"" + +#: utils/adt/acl.c:380 +#, c-format +msgid "a name must follow the \"/\" sign" +msgstr "\"/\" სიმბáƒáƒšáƒáƒ¡ სáƒáƒ®áƒ”ლი უნდრმáƒáƒ°áƒ§áƒ•ებáƒáƒ“ეს" + +#: utils/adt/acl.c:392 +#, c-format +msgid "defaulting grantor to user ID %u" +msgstr "" + +#: utils/adt/acl.c:578 +#, c-format +msgid "ACL array contains wrong data type" +msgstr "ACL-ის მáƒáƒ¡áƒ˜áƒ•ი მáƒáƒœáƒáƒªáƒ”მების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  ტიპს შეიცáƒáƒ•ს" + +#: utils/adt/acl.c:582 +#, c-format +msgid "ACL arrays must be one-dimensional" +msgstr "ACL-ის მáƒáƒ¡áƒ˜áƒ•ები ერთგáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœáƒ˜ უნდრიყáƒáƒ¡" + +#: utils/adt/acl.c:586 +#, c-format +msgid "ACL arrays must not contain null values" +msgstr "ACL-ის მáƒáƒ¡áƒ˜áƒ•ები ნულáƒáƒ•áƒáƒœ მნიშვნელáƒáƒ‘ებს áƒáƒ  უნდრშეიცáƒáƒ•დეს" + +#: utils/adt/acl.c:615 +#, c-format +msgid "extra garbage at the end of the ACL specification" +msgstr "" + +#: utils/adt/acl.c:1257 +#, c-format +msgid "grant options cannot be granted back to your own grantor" +msgstr "" + +#: utils/adt/acl.c:1573 +#, c-format +msgid "aclinsert is no longer supported" +msgstr "aclinsert მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ¦áƒáƒ áƒáƒ" + +#: utils/adt/acl.c:1583 +#, c-format +msgid "aclremove is no longer supported" +msgstr "aclremove მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ¦áƒáƒ áƒáƒ" + +#: utils/adt/acl.c:1703 +#, c-format +msgid "unrecognized privilege type: \"%s\"" +msgstr "პრივილეგიის უცნáƒáƒ‘ი ტიპი \"%s\"" + +#: utils/adt/acl.c:3544 utils/adt/regproc.c:100 utils/adt/regproc.c:265 +#, c-format +msgid "function \"%s\" does not exist" +msgstr "ფუნქცირáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" + +#: utils/adt/acl.c:5190 +#, c-format +msgid "must be able to SET ROLE \"%s\"" +msgstr "უნდრშეეძლáƒáƒ¡ SET ROLE \"%s\"" + +#: utils/adt/array_userfuncs.c:102 utils/adt/array_userfuncs.c:489 utils/adt/array_userfuncs.c:866 utils/adt/json.c:602 utils/adt/json.c:740 utils/adt/json.c:790 utils/adt/jsonb.c:1025 utils/adt/jsonb.c:1098 utils/adt/jsonb.c:1530 utils/adt/jsonb.c:1718 utils/adt/jsonb.c:1728 +#, c-format +msgid "could not determine input data type" +msgstr "შეყვáƒáƒœáƒ˜áƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მების ტიპის გáƒáƒœáƒ¡áƒáƒ–ღვრრშეუძლებელიáƒ" + +#: utils/adt/array_userfuncs.c:107 +#, c-format +msgid "input data type is not an array" +msgstr "შემáƒáƒ¢áƒáƒœáƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მების ტიპი მáƒáƒ¡áƒ˜áƒ•ი áƒáƒ áƒáƒ" + +#: utils/adt/array_userfuncs.c:151 utils/adt/array_userfuncs.c:203 utils/adt/float.c:1222 utils/adt/float.c:1296 utils/adt/float.c:4022 utils/adt/float.c:4060 utils/adt/int.c:778 utils/adt/int.c:800 utils/adt/int.c:814 utils/adt/int.c:828 utils/adt/int.c:859 utils/adt/int.c:880 utils/adt/int.c:997 utils/adt/int.c:1011 utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 utils/adt/int.c:1263 +#: utils/adt/int.c:1331 utils/adt/int.c:1337 utils/adt/int8.c:1256 utils/adt/numeric.c:1902 utils/adt/numeric.c:4439 utils/adt/rangetypes.c:1488 utils/adt/rangetypes.c:1501 utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1135 utils/adt/varlena.c:3137 +#, c-format +msgid "integer out of range" +msgstr "მთელი მნიშვნელáƒáƒ‘რდიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/array_userfuncs.c:158 utils/adt/array_userfuncs.c:213 +#, c-format +msgid "argument must be empty or one-dimensional array" +msgstr "áƒáƒ áƒ’უმენტი ცáƒáƒ áƒ˜áƒ”ლი áƒáƒœ ერთგáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœáƒ˜ მáƒáƒ¡áƒ˜áƒ•ი უნდრიყáƒáƒ¡" + +#: utils/adt/array_userfuncs.c:295 utils/adt/array_userfuncs.c:334 utils/adt/array_userfuncs.c:371 utils/adt/array_userfuncs.c:400 utils/adt/array_userfuncs.c:428 +#, c-format +msgid "cannot concatenate incompatible arrays" +msgstr "შეუთáƒáƒ•სებელი მáƒáƒ¡áƒ˜áƒ•ების შერწყმრშეუძლებელიáƒ" + +#: utils/adt/array_userfuncs.c:296 +#, c-format +msgid "Arrays with element types %s and %s are not compatible for concatenation." +msgstr "%s დრ%s ტიპის ელემენტების მქáƒáƒœáƒ” მáƒáƒ¡áƒ˜áƒ•ები შერწყმისთვის თáƒáƒ•სებáƒáƒ“ები áƒáƒ  áƒáƒ áƒ˜áƒáƒœ." + +#: utils/adt/array_userfuncs.c:335 +#, c-format +msgid "Arrays of %d and %d dimensions are not compatible for concatenation." +msgstr "" + +#: utils/adt/array_userfuncs.c:372 +#, c-format +msgid "Arrays with differing element dimensions are not compatible for concatenation." +msgstr "" + +#: utils/adt/array_userfuncs.c:401 utils/adt/array_userfuncs.c:429 +#, c-format +msgid "Arrays with differing dimensions are not compatible for concatenation." +msgstr "" + +#: utils/adt/array_userfuncs.c:975 utils/adt/array_userfuncs.c:983 utils/adt/arrayfuncs.c:5609 utils/adt/arrayfuncs.c:5615 +#, c-format +msgid "cannot accumulate arrays of different dimensionality" +msgstr "სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რგáƒáƒœáƒ¡áƒáƒ–ღვრების მქáƒáƒœáƒ” მáƒáƒ¡áƒ˜áƒ•ების შეგრáƒáƒ•ებრშეუძლებელიáƒ" + +#: utils/adt/array_userfuncs.c:1272 utils/adt/array_userfuncs.c:1426 +#, c-format +msgid "searching for elements in multidimensional arrays is not supported" +msgstr "" + +#: utils/adt/array_userfuncs.c:1301 +#, c-format +msgid "initial position must not be null" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘რნულáƒáƒ•áƒáƒœ ვერ იქნებáƒ" + +#: utils/adt/array_userfuncs.c:1674 +#, c-format +msgid "sample size must be between 0 and %d" +msgstr "სემპლის ზáƒáƒ›áƒ 0-სრდრ%d-ს შáƒáƒ áƒ˜áƒ¡ უნდრიყáƒáƒ¡" + +#: utils/adt/arrayfuncs.c:264 utils/adt/arrayfuncs.c:273 utils/adt/arrayfuncs.c:284 utils/adt/arrayfuncs.c:307 utils/adt/arrayfuncs.c:440 utils/adt/arrayfuncs.c:454 utils/adt/arrayfuncs.c:466 utils/adt/arrayfuncs.c:636 utils/adt/arrayfuncs.c:668 utils/adt/arrayfuncs.c:703 utils/adt/arrayfuncs.c:718 utils/adt/arrayfuncs.c:777 utils/adt/arrayfuncs.c:782 utils/adt/arrayfuncs.c:870 utils/adt/arrayfuncs.c:897 utils/adt/arrayfuncs.c:904 utils/adt/arrayfuncs.c:941 +#, c-format +msgid "malformed array literal: \"%s\"" +msgstr "" + +#: utils/adt/arrayfuncs.c:265 +#, c-format +msgid "Array value must start with \"{\" or dimension information." +msgstr "მáƒáƒ¡áƒ˜áƒ•ის მნიშვნელáƒáƒ‘რ\"{\"-ით áƒáƒœ მáƒáƒ¡áƒ˜áƒ•ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ— უნდრიწყებáƒáƒ“ეს." + +#: utils/adt/arrayfuncs.c:274 utils/adt/arrayfuncs.c:467 +#, c-format +msgid "Missing \"%s\" after array dimensions." +msgstr "მáƒáƒ¡áƒ˜áƒ•ის გáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბების შემდეგ áƒáƒ™áƒšáƒ˜áƒ \"%s\"." + +#: utils/adt/arrayfuncs.c:285 +#, c-format +msgid "Array contents must start with \"{\"." +msgstr "მáƒáƒ¡áƒ˜áƒ•ის შემცველáƒáƒ‘რ\"{\"-ით უნდრდáƒáƒ˜áƒ¬áƒ§áƒáƒ¡." + +#: utils/adt/arrayfuncs.c:308 utils/adt/multirangetypes.c:292 +#, c-format +msgid "Junk after closing right brace." +msgstr "ნáƒáƒ’áƒáƒ•ი დáƒáƒ›áƒ®áƒ£áƒ áƒáƒ•ი მáƒáƒ áƒ¯áƒ•ენრფრჩხილის შემდეგ." + +#: utils/adt/arrayfuncs.c:431 utils/adt/arrayfuncs.c:643 +#, c-format +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის ზáƒáƒ›áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რმáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› დáƒáƒ¡áƒáƒ¨áƒ•ებზე (%d) დიდიáƒ" + +#: utils/adt/arrayfuncs.c:441 +#, c-format +msgid "\"[\" must introduce explicitly-specified array dimensions." +msgstr "" + +#: utils/adt/arrayfuncs.c:455 +#, c-format +msgid "Missing array dimension value." +msgstr "áƒáƒ™áƒšáƒ˜áƒ მáƒáƒ¡áƒ˜áƒ•ის გáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბის მნიშვნელáƒáƒ‘áƒ." + +#: utils/adt/arrayfuncs.c:481 utils/adt/arrayfuncs.c:2933 utils/adt/arrayfuncs.c:2978 utils/adt/arrayfuncs.c:2993 +#, c-format +msgid "upper bound cannot be less than lower bound" +msgstr "" + +#: utils/adt/arrayfuncs.c:487 +#, c-format +msgid "array upper bound is too large: %d" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის ზედრსáƒáƒ–ღვáƒáƒ áƒ˜ მეტისმეტáƒáƒ“ დიდიáƒ: %d" + +#: utils/adt/arrayfuncs.c:538 +#, c-format +msgid "array bound is out of integer range" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის სáƒáƒ–ღვáƒáƒ áƒ˜ მთელი რიცხვების დáƒáƒ¨áƒ•ებული შუáƒáƒšáƒ”დის გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/arrayfuncs.c:637 utils/adt/arrayfuncs.c:669 utils/adt/arrayfuncs.c:704 utils/adt/arrayfuncs.c:898 +#, c-format +msgid "Unexpected \"%c\" character." +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი სიმბáƒáƒšáƒ \"%c\"." + +#: utils/adt/arrayfuncs.c:719 +#, c-format +msgid "Unexpected array element." +msgstr "მáƒáƒ¡áƒ˜áƒ•ის მáƒáƒ£áƒšáƒáƒ“ნელი ელემენტი." + +#: utils/adt/arrayfuncs.c:778 +#, c-format +msgid "Specified array dimensions do not match array contents." +msgstr "მითითებული მáƒáƒ¡áƒ˜áƒ•ის ზáƒáƒ›áƒ”ბი მáƒáƒ¡áƒ˜áƒ•ის შემცველáƒáƒ‘áƒáƒ¡ áƒáƒ  ემთხვევáƒ." + +#: utils/adt/arrayfuncs.c:783 utils/adt/jsonfuncs.c:2597 +#, c-format +msgid "Multidimensional arrays must have sub-arrays with matching dimensions." +msgstr "მრáƒáƒ•áƒáƒšáƒ’áƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœ მáƒáƒ¡áƒ˜áƒ•ებს უნდრჰქáƒáƒœáƒ“ეთ ქვე-მáƒáƒ¡áƒ˜áƒ•ები იგივე ზáƒáƒ›áƒ”ბით." + +#: utils/adt/arrayfuncs.c:871 utils/adt/arrayfuncs.c:905 +#, c-format +msgid "Incorrectly quoted array element." +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ ციტირებული მáƒáƒ¡áƒ˜áƒ•ის ელემენტი." + +#: utils/adt/arrayfuncs.c:942 utils/adt/multirangetypes.c:165 utils/adt/rangetypes.c:2464 utils/adt/rangetypes.c:2472 utils/adt/rowtypes.c:218 utils/adt/rowtypes.c:229 +#, c-format +msgid "Unexpected end of input." +msgstr "შეყვáƒáƒœáƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜." + +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3492 utils/adt/arrayfuncs.c:6099 +#, c-format +msgid "invalid number of dimensions: %d" +msgstr "გáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ: %d" + +#: utils/adt/arrayfuncs.c:1312 +#, c-format +msgid "invalid array flags" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒšáƒ›áƒ”ბი" + +#: utils/adt/arrayfuncs.c:1334 +#, c-format +msgid "binary data has array element type %u (%s) instead of expected %u (%s)" +msgstr "" + +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:450 utils/adt/rangetypes.c:351 utils/cache/lsyscache.c:2958 +#, c-format +msgid "no binary input function available for type %s" +msgstr "" + +#: utils/adt/arrayfuncs.c:1509 +#, c-format +msgid "improper binary format in array element %d" +msgstr "" + +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:2991 +#, c-format +msgid "no binary output function available for type %s" +msgstr "" + +#: utils/adt/arrayfuncs.c:2067 +#, c-format +msgid "slices of fixed-length arrays not implemented" +msgstr "" + +#: utils/adt/arrayfuncs.c:2245 utils/adt/arrayfuncs.c:2267 utils/adt/arrayfuncs.c:2316 utils/adt/arrayfuncs.c:2570 utils/adt/arrayfuncs.c:2908 utils/adt/arrayfuncs.c:6085 utils/adt/arrayfuncs.c:6111 utils/adt/arrayfuncs.c:6122 utils/adt/json.c:1419 utils/adt/json.c:1491 utils/adt/jsonb.c:1317 utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4688 utils/adt/jsonfuncs.c:4841 utils/adt/jsonfuncs.c:4952 utils/adt/jsonfuncs.c:5000 +#, c-format +msgid "wrong number of array subscripts" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის ქვესკრიპტების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ" + +#: utils/adt/arrayfuncs.c:2250 utils/adt/arrayfuncs.c:2374 utils/adt/arrayfuncs.c:2653 utils/adt/arrayfuncs.c:2983 +#, c-format +msgid "array subscript out of range" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის ინდექსი დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/arrayfuncs.c:2255 +#, c-format +msgid "cannot assign null value to an element of a fixed-length array" +msgstr "" + +#: utils/adt/arrayfuncs.c:2855 +#, c-format +msgid "updates on slices of fixed-length arrays not implemented" +msgstr "" + +#: utils/adt/arrayfuncs.c:2886 +#, c-format +msgid "array slice subscript must provide both boundaries" +msgstr "" + +#: utils/adt/arrayfuncs.c:2887 +#, c-format +msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." +msgstr "" + +#: utils/adt/arrayfuncs.c:2898 utils/adt/arrayfuncs.c:3010 +#, c-format +msgid "source array too small" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ მáƒáƒ¡áƒ˜áƒ•ი ძáƒáƒšáƒ˜áƒáƒœ პáƒáƒ¢áƒáƒ áƒáƒ" + +#: utils/adt/arrayfuncs.c:3650 +#, c-format +msgid "null array element not allowed in this context" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ¡áƒ˜áƒ•ის ელემენტი áƒáƒ› კáƒáƒœáƒ¢áƒ”ქსტში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: utils/adt/arrayfuncs.c:3821 utils/adt/arrayfuncs.c:3992 utils/adt/arrayfuncs.c:4383 +#, c-format +msgid "cannot compare arrays of different element types" +msgstr "გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ებული ელემენტის ტიპების მქáƒáƒœáƒ” მáƒáƒ¡áƒ˜áƒ•ების შედáƒáƒ áƒ”ბრშეუძლებელიáƒ" + +#: utils/adt/arrayfuncs.c:4170 utils/adt/multirangetypes.c:2805 utils/adt/multirangetypes.c:2877 utils/adt/rangetypes.c:1361 utils/adt/rangetypes.c:1425 utils/adt/rowtypes.c:1875 +#, c-format +msgid "could not identify a hash function for type %s" +msgstr "ტიპისთვის \"%s\" ჰეშის ფუნქცირვერ ვიპáƒáƒ•ე" + +#: utils/adt/arrayfuncs.c:4298 utils/adt/rowtypes.c:1996 +#, c-format +msgid "could not identify an extended hash function for type %s" +msgstr "ტიპისთვის \"%s\" გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული ჰეშის ფუნქცირვერ ვიპáƒáƒ•ე" + +#: utils/adt/arrayfuncs.c:5499 +#, c-format +msgid "data type %s is not an array type" +msgstr "მáƒáƒœáƒáƒªáƒ”მის ტიპი %s მáƒáƒ¡áƒ˜áƒ•ის ტიპი áƒáƒ áƒáƒ" + +#: utils/adt/arrayfuncs.c:5554 +#, c-format +msgid "cannot accumulate null arrays" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ¡áƒ˜áƒ•ების დáƒáƒ’რáƒáƒ•ებრშეუძლებელიáƒ" + +#: utils/adt/arrayfuncs.c:5582 +#, c-format +msgid "cannot accumulate empty arrays" +msgstr "ცáƒáƒ áƒ˜áƒ”ლი მáƒáƒ¡áƒ˜áƒ•ების დáƒáƒ’რáƒáƒ•ებრშეუძლებელიáƒ" + +#: utils/adt/arrayfuncs.c:5983 utils/adt/arrayfuncs.c:6023 +#, c-format +msgid "dimension array or low bound array cannot be null" +msgstr "" + +#: utils/adt/arrayfuncs.c:6086 utils/adt/arrayfuncs.c:6112 +#, c-format +msgid "Dimension array must be one dimensional." +msgstr "გáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბის მáƒáƒ¡áƒ˜áƒ•ი ერთგáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœáƒ˜ უნდრიყáƒáƒ¡." + +#: utils/adt/arrayfuncs.c:6091 utils/adt/arrayfuncs.c:6117 +#, c-format +msgid "dimension values cannot be null" +msgstr "გáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბის მნიშვნელáƒáƒ‘ები ნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" + +#: utils/adt/arrayfuncs.c:6123 +#, c-format +msgid "Low bound array has different size than dimensions array." +msgstr "" + +#: utils/adt/arrayfuncs.c:6404 +#, c-format +msgid "removing elements from multidimensional arrays is not supported" +msgstr "" + +#: utils/adt/arrayfuncs.c:6681 +#, c-format +msgid "thresholds must be one-dimensional array" +msgstr "" + +#: utils/adt/arrayfuncs.c:6686 +#, c-format +msgid "thresholds array must not contain NULLs" +msgstr "" + +#: utils/adt/arrayfuncs.c:6919 +#, c-format +msgid "number of elements to trim must be between 0 and %d" +msgstr "" + +#: utils/adt/arraysubs.c:93 utils/adt/arraysubs.c:130 +#, c-format +msgid "array subscript must have type integer" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის ქვესკრიპტის ტიპი integer უნდრჰქáƒáƒœáƒ“ეს" + +#: utils/adt/arraysubs.c:198 utils/adt/arraysubs.c:217 +#, c-format +msgid "array subscript in assignment must not be null" +msgstr "" + +#: utils/adt/arrayutils.c:140 +#, c-format +msgid "array lower bound is too large: %d" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის ქვედრსáƒáƒ–ღვáƒáƒ áƒ˜ მეტისმეტáƒáƒ“ დიდიáƒ: %d" + +#: utils/adt/arrayutils.c:242 +#, c-format +msgid "typmod array must be type cstring[]" +msgstr "typmod ტიპის მáƒáƒ¡áƒ˜áƒ•ი cstring[] ტიპის უნდრიყáƒáƒ¡" + +#: utils/adt/arrayutils.c:247 +#, c-format +msgid "typmod array must be one-dimensional" +msgstr "typmod ტიპის მáƒáƒ¡áƒ˜áƒ•ი ერთგáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœáƒ˜ უნდრიყáƒáƒ¡" + +#: utils/adt/arrayutils.c:252 +#, c-format +msgid "typmod array must not contain nulls" +msgstr "typmod ტიპის მáƒáƒ¡áƒ˜áƒ•ი ნულáƒáƒ•áƒáƒœ მáƒáƒœáƒáƒªáƒ”მებს áƒáƒ  შეიძლებáƒ, შეიცáƒáƒ•დეს" + +#: utils/adt/ascii.c:77 +#, c-format +msgid "encoding conversion from %s to ASCII not supported" +msgstr "" + +#. translator: first %s is inet or cidr +#: utils/adt/bool.c:149 utils/adt/cash.c:277 utils/adt/datetime.c:4142 utils/adt/float.c:200 utils/adt/float.c:287 utils/adt/float.c:301 utils/adt/float.c:406 utils/adt/float.c:489 utils/adt/float.c:503 utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1417 utils/adt/geo_ops.c:1454 utils/adt/geo_ops.c:1462 utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 utils/adt/geo_ops.c:4672 utils/adt/int.c:174 +#: utils/adt/int.c:186 utils/adt/jsonpath.c:185 utils/adt/mac.c:94 utils/adt/mac8.c:226 utils/adt/network.c:99 utils/adt/numeric.c:796 utils/adt/numeric.c:7206 utils/adt/numeric.c:7409 utils/adt/numeric.c:8356 utils/adt/numutils.c:356 utils/adt/numutils.c:618 utils/adt/numutils.c:880 utils/adt/numutils.c:919 utils/adt/numutils.c:941 utils/adt/numutils.c:1005 utils/adt/numutils.c:1027 utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 utils/adt/tid.c:94 +#: utils/adt/tid.c:103 utils/adt/timestamp.c:510 utils/adt/uuid.c:140 utils/adt/xid8funcs.c:360 +#, c-format +msgid "invalid input syntax for type %s: \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შეყვáƒáƒœáƒ˜áƒ¡ სინტáƒáƒ¥áƒ¡áƒ˜ ტიპისთვის %s: \"%s\"" + +#: utils/adt/cash.c:215 utils/adt/cash.c:240 utils/adt/cash.c:250 utils/adt/cash.c:290 utils/adt/int.c:180 utils/adt/numutils.c:350 utils/adt/numutils.c:612 utils/adt/numutils.c:874 utils/adt/numutils.c:925 utils/adt/numutils.c:964 utils/adt/numutils.c:1011 +#, c-format +msgid "value \"%s\" is out of range for type %s" +msgstr "" + +#: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 utils/adt/float.c:99 utils/adt/int.c:843 utils/adt/int.c:959 utils/adt/int.c:1039 utils/adt/int.c:1101 utils/adt/int.c:1139 utils/adt/int.c:1167 utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:942 utils/adt/int8.c:1022 utils/adt/int8.c:1084 utils/adt/int8.c:1164 utils/adt/numeric.c:3176 utils/adt/numeric.c:3199 +#: utils/adt/numeric.c:3284 utils/adt/numeric.c:3302 utils/adt/numeric.c:3398 utils/adt/numeric.c:8905 utils/adt/numeric.c:9218 utils/adt/numeric.c:9566 utils/adt/numeric.c:9682 utils/adt/numeric.c:11192 utils/adt/timestamp.c:3713 +#, c-format +msgid "division by zero" +msgstr "ნულზე გáƒáƒ§áƒáƒ¤áƒ" + +#: utils/adt/char.c:197 +#, c-format +msgid "\"char\" out of range" +msgstr "\"char\" დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/cryptohashfuncs.c:48 utils/adt/cryptohashfuncs.c:70 +#, c-format +msgid "could not compute %s hash: %s" +msgstr "%s ჰეშის გáƒáƒ›áƒáƒ—ვლრშეუძლებელიáƒ: %s" + +#: utils/adt/date.c:64 utils/adt/timestamp.c:116 utils/adt/varbit.c:105 utils/adt/varchar.c:48 +#, c-format +msgid "invalid type modifier" +msgstr "ტიპის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ˜" + +#: utils/adt/date.c:76 +#, c-format +msgid "TIME(%d)%s precision must not be negative" +msgstr "TIME(%d)%s-ის სიზუსტე უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ— áƒáƒ  უნდრიყáƒáƒ¡" + +#: utils/adt/date.c:82 +#, c-format +msgid "TIME(%d)%s precision reduced to maximum allowed, %d" +msgstr "" + +#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4424 utils/adt/formatting.c:4433 utils/adt/formatting.c:4538 utils/adt/formatting.c:4548 +#, c-format +msgid "date out of range: \"%s\"" +msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: \"%s\"" + +#: utils/adt/date.c:222 utils/adt/date.c:520 utils/adt/date.c:544 utils/adt/rangetypes.c:1584 utils/adt/rangetypes.c:1599 utils/adt/xml.c:2489 +#, c-format +msgid "date out of range" +msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/date.c:268 utils/adt/timestamp.c:598 +#, c-format +msgid "date field value out of range: %d-%02d-%02d" +msgstr "მáƒáƒœáƒáƒªáƒ”მის ველის მნიშვნელáƒáƒ‘რდიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: %d-%02d-%02d" + +#: utils/adt/date.c:275 utils/adt/date.c:284 utils/adt/timestamp.c:604 +#, c-format +msgid "date out of range: %d-%02d-%02d" +msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: %d-%02d-%02d" + +#: utils/adt/date.c:495 +#, c-format +msgid "cannot subtract infinite dates" +msgstr "უსáƒáƒ¡áƒ áƒ£áƒšáƒ თáƒáƒ áƒ˜áƒ¦áƒ”ბის გáƒáƒ›áƒáƒ™áƒšáƒ”ბრშეუძლებელიáƒ" + +#: utils/adt/date.c:593 utils/adt/date.c:656 utils/adt/date.c:692 utils/adt/date.c:2906 utils/adt/date.c:2916 +#, c-format +msgid "date out of range for timestamp" +msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜ დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜áƒ¡ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ მიღმáƒáƒ" + +#: utils/adt/date.c:1122 utils/adt/date.c:1205 utils/adt/date.c:1221 utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4726 utils/adt/timestamp.c:4941 utils/adt/timestamp.c:5089 utils/adt/timestamp.c:5342 utils/adt/timestamp.c:5543 utils/adt/timestamp.c:5590 utils/adt/timestamp.c:5814 utils/adt/timestamp.c:5861 utils/adt/timestamp.c:5941 utils/adt/timestamp.c:6070 +#, c-format +msgid "unit \"%s\" not supported for type %s" +msgstr "ერთეული \"%s\" ტიპისთვის %s მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: utils/adt/date.c:1230 utils/adt/date.c:2231 utils/adt/date.c:3031 utils/adt/timestamp.c:4740 utils/adt/timestamp.c:4958 utils/adt/timestamp.c:5103 utils/adt/timestamp.c:5302 utils/adt/timestamp.c:5599 utils/adt/timestamp.c:5870 utils/adt/timestamp.c:5911 utils/adt/timestamp.c:6131 +#, c-format +msgid "unit \"%s\" not recognized for type %s" +msgstr "ერთეული \"%s\" ტიპისთვის %s შეუძლებელიáƒ" + +#: utils/adt/date.c:1314 utils/adt/date.c:1360 utils/adt/date.c:1919 utils/adt/date.c:1950 utils/adt/date.c:1979 utils/adt/date.c:2869 utils/adt/date.c:3101 utils/adt/datetime.c:422 utils/adt/datetime.c:1807 utils/adt/formatting.c:4269 utils/adt/formatting.c:4305 utils/adt/formatting.c:4392 utils/adt/formatting.c:4514 utils/adt/json.c:366 utils/adt/json.c:405 utils/adt/timestamp.c:248 utils/adt/timestamp.c:280 utils/adt/timestamp.c:716 utils/adt/timestamp.c:725 +#: utils/adt/timestamp.c:803 utils/adt/timestamp.c:836 utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3075 utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3097 utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3129 utils/adt/timestamp.c:3140 utils/adt/timestamp.c:3146 utils/adt/timestamp.c:3152 utils/adt/timestamp.c:3157 utils/adt/timestamp.c:3210 utils/adt/timestamp.c:3219 utils/adt/timestamp.c:3240 utils/adt/timestamp.c:3245 utils/adt/timestamp.c:3266 +#: utils/adt/timestamp.c:3279 utils/adt/timestamp.c:3293 utils/adt/timestamp.c:3301 utils/adt/timestamp.c:3307 utils/adt/timestamp.c:3312 utils/adt/timestamp.c:4380 utils/adt/timestamp.c:4532 utils/adt/timestamp.c:4608 utils/adt/timestamp.c:4644 utils/adt/timestamp.c:4734 utils/adt/timestamp.c:4813 utils/adt/timestamp.c:4849 utils/adt/timestamp.c:4952 utils/adt/timestamp.c:5407 utils/adt/timestamp.c:5681 utils/adt/timestamp.c:6199 utils/adt/timestamp.c:6209 +#: utils/adt/timestamp.c:6214 utils/adt/timestamp.c:6220 utils/adt/timestamp.c:6260 utils/adt/timestamp.c:6347 utils/adt/timestamp.c:6388 utils/adt/timestamp.c:6392 utils/adt/timestamp.c:6446 utils/adt/timestamp.c:6450 utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2511 utils/adt/xml.c:2518 utils/adt/xml.c:2538 utils/adt/xml.c:2545 +#, c-format +msgid "timestamp out of range" +msgstr "დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/date.c:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4597 +#, c-format +msgid "time out of range" +msgstr "დრáƒáƒ˜áƒ¡ მნიშვნელáƒáƒ‘რდიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/date.c:1588 utils/adt/timestamp.c:613 +#, c-format +msgid "time field value out of range: %d:%02d:%02g" +msgstr "დრáƒáƒ˜áƒ¡ ველის მნიშვნელáƒáƒ‘რდიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: %d:%02d:%02g" + +#: utils/adt/date.c:2020 +#, c-format +msgid "cannot convert infinite interval to time" +msgstr "უსáƒáƒ¡áƒ áƒ£áƒšáƒ ინტერვáƒáƒšáƒ˜áƒ¡ დრáƒáƒ¨áƒ˜ გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ" + +#: utils/adt/date.c:2061 utils/adt/date.c:2605 +#, c-format +msgid "cannot add infinite interval to time" +msgstr "დრáƒáƒ˜áƒ¡áƒ—ვის უსáƒáƒ¡áƒ áƒ£áƒšáƒ ინტერვáƒáƒšáƒ”ბის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ" + +#: utils/adt/date.c:2084 utils/adt/date.c:2632 +#, c-format +msgid "cannot subtract infinite interval from time" +msgstr "დრáƒáƒ˜áƒ¡áƒ—ვის უსáƒáƒ¡áƒ áƒ£áƒšáƒ ინტერვáƒáƒšáƒ”ბის გáƒáƒ›áƒáƒ™áƒšáƒ”ბრშეუძლებელიáƒ" + +#: utils/adt/date.c:2115 utils/adt/date.c:2667 utils/adt/float.c:1036 utils/adt/float.c:1112 utils/adt/int.c:635 utils/adt/int.c:682 utils/adt/int.c:717 utils/adt/int8.c:413 utils/adt/numeric.c:2580 utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 utils/adt/timestamp.c:3888 +#, c-format +msgid "invalid preceding or following size in window function" +msgstr "" + +#: utils/adt/date.c:2360 +#, c-format +msgid "time zone displacement out of range" +msgstr "დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒšáƒ˜áƒ¡ წáƒáƒœáƒáƒªáƒ•ლებრდიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/date.c:3132 utils/adt/timestamp.c:6242 utils/adt/timestamp.c:6479 +#, c-format +msgid "interval time zone \"%s\" must be finite" +msgstr "ინტერვáƒáƒšáƒ˜áƒ¡ დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლი \"%s\" სáƒáƒ¡áƒ áƒ£áƒšáƒ˜ უნდრიყáƒáƒ¡" + +#: utils/adt/date.c:3139 utils/adt/timestamp.c:6249 utils/adt/timestamp.c:6486 +#, c-format +msgid "interval time zone \"%s\" must not include months or days" +msgstr "ინტერვáƒáƒšáƒ˜áƒ¡ დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლი \"%s\" თვეებს áƒáƒœ დღეებს áƒáƒ  უნდრშეიცáƒáƒ•დეს" + +#: utils/adt/datetime.c:3232 utils/adt/datetime.c:4127 utils/adt/datetime.c:4133 utils/adt/timestamp.c:528 +#, c-format +msgid "time zone \"%s\" not recognized" +msgstr "უცნáƒáƒ‘ი დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლი: %s" + +#: utils/adt/datetime.c:4101 utils/adt/datetime.c:4108 +#, c-format +msgid "date/time field value out of range: \"%s\"" +msgstr "დრáƒáƒ˜áƒ¡/თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡ ველის მნიშვნელáƒáƒ‘რდიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: \"%s\"" + +#: utils/adt/datetime.c:4110 +#, c-format +msgid "Perhaps you need a different \"datestyle\" setting." +msgstr "" + +#: utils/adt/datetime.c:4115 +#, c-format +msgid "interval field value out of range: \"%s\"" +msgstr "ინტერვáƒáƒšáƒ˜áƒ¡ ველის მნიშვნელáƒáƒ‘რდიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: \"%s\"" + +#: utils/adt/datetime.c:4121 +#, c-format +msgid "time zone displacement out of range: \"%s\"" +msgstr "" + +#: utils/adt/datetime.c:4135 +#, c-format +msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." +msgstr "" + +#: utils/adt/datum.c:90 utils/adt/datum.c:102 +#, c-format +msgid "invalid Datum pointer" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ©áƒ•ენებელი: Datum" + +#: utils/adt/dbsize.c:760 utils/adt/dbsize.c:836 +#, c-format +msgid "invalid size: \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ: %s" + +#: utils/adt/dbsize.c:837 +#, c-format +msgid "Invalid size unit: \"%s\"." +msgstr "ერთეულის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ: \"%s\"." + +#: utils/adt/dbsize.c:838 +#, c-format +msgid "Valid units are \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის სწáƒáƒ áƒ˜ ერთეულებირ\"ბ\", \"კბ\", \"მბ\", \"გბ\", \"ტბ\" დრ\"პბ\"." + +#: utils/adt/domains.c:95 +#, c-format +msgid "type %s is not a domain" +msgstr "ტიპი \"%s\" დáƒáƒ›áƒ”ნი áƒáƒ áƒáƒ" + +#: utils/adt/encode.c:66 utils/adt/encode.c:114 +#, c-format +msgid "unrecognized encoding: \"%s\"" +msgstr "უცნáƒáƒ‘ი კáƒáƒ“ირებრ\"%s\"" + +#: utils/adt/encode.c:80 +#, c-format +msgid "result of encoding conversion is too large" +msgstr "დáƒáƒ¨áƒ˜áƒ¤áƒ•რის შედეგი ძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ" + +#: utils/adt/encode.c:128 +#, c-format +msgid "result of decoding conversion is too large" +msgstr "გáƒáƒ¨áƒ˜áƒ¤áƒ•რის შედეგი ძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ" + +#: utils/adt/encode.c:217 utils/adt/encode.c:227 +#, c-format +msgid "invalid hexadecimal digit: \"%.*s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ თექვსმეტáƒáƒ‘ითი რიცხვი: \"%.*s\"" + +#: utils/adt/encode.c:223 +#, c-format +msgid "invalid hexadecimal data: odd number of digits" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ თექვსმეტáƒáƒ‘ითი მáƒáƒœáƒáƒªáƒ”მები: ციფრების კენტი რáƒáƒáƒ“ენáƒáƒ‘áƒ" + +#: utils/adt/encode.c:344 +#, c-format +msgid "unexpected \"=\" while decoding base64 sequence" +msgstr "base64 მიმდევრáƒáƒ‘ის გáƒáƒ¨áƒ˜áƒ¤áƒ•რისáƒáƒ¡ áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირმáƒáƒ£áƒšáƒáƒ“ნელი \"=\"" + +#: utils/adt/encode.c:356 +#, c-format +msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" +msgstr "base64 მიმდევრáƒáƒ‘ის გáƒáƒ¨áƒ˜áƒ¤áƒ•რისáƒáƒ¡ áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიმბáƒáƒšáƒ \"%.*s\"" + +#: utils/adt/encode.c:377 +#, c-format +msgid "invalid base64 end sequence" +msgstr "base64-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის მიმდევრáƒáƒ‘áƒ" + +#: utils/adt/encode.c:378 +#, c-format +msgid "Input data is missing padding, is truncated, or is otherwise corrupted." +msgstr "" + +#: utils/adt/enum.c:99 +#, c-format +msgid "unsafe use of new value \"%s\" of enum type %s" +msgstr "" + +#: utils/adt/enum.c:102 +#, c-format +msgid "New enum values must be committed before they can be used." +msgstr "" + +#: utils/adt/enum.c:121 utils/adt/enum.c:131 utils/adt/enum.c:194 utils/adt/enum.c:204 +#, c-format +msgid "invalid input value for enum %s: \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შეყვáƒáƒœáƒ˜áƒšáƒ˜ მნიშვნელáƒáƒ‘რჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜áƒ¡áƒ—ვის %s: \"%s\"" + +#: utils/adt/enum.c:166 utils/adt/enum.c:232 utils/adt/enum.c:291 +#, c-format +msgid "invalid internal value for enum: %u" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შიდრმნიშვნელáƒáƒ‘რჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜áƒ¡áƒ—ვის: %u" + +#: utils/adt/enum.c:451 utils/adt/enum.c:480 utils/adt/enum.c:520 utils/adt/enum.c:540 +#, c-format +msgid "could not determine actual enum type" +msgstr "ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜áƒ¡ მიმდინáƒáƒ áƒ” ტიპის დáƒáƒ“გენრშეუძლებელიáƒ" + +#: utils/adt/enum.c:459 utils/adt/enum.c:488 +#, c-format +msgid "enum %s contains no values" +msgstr "ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜ %s მნიშვნელáƒáƒ‘ებს áƒáƒ  შეიცáƒáƒ•ს" + +#: utils/adt/float.c:83 +#, c-format +msgid "value out of range: overflow" +msgstr "მნიშვნელáƒáƒ‘რდიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: გáƒáƒ“áƒáƒ•სებáƒ" + +#: utils/adt/float.c:91 +#, c-format +msgid "value out of range: underflow" +msgstr "მნიშვნელáƒáƒ‘რდიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: áƒáƒ áƒ¨áƒ”ვსებáƒ" + +#: utils/adt/float.c:280 +#, c-format +msgid "\"%s\" is out of range for type real" +msgstr "%s დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ ტიპისთვის: real" + +#: utils/adt/float.c:482 +#, c-format +msgid "\"%s\" is out of range for type double precision" +msgstr "%s დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ ტიპისთვის: double precision" + +#: utils/adt/float.c:1247 utils/adt/float.c:1321 utils/adt/int.c:355 utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 utils/adt/int8.c:1277 utils/adt/numeric.c:4578 utils/adt/numeric.c:4583 +#, c-format +msgid "smallint out of range" +msgstr "smallint დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/float.c:1447 utils/adt/numeric.c:3694 utils/adt/numeric.c:10097 +#, c-format +msgid "cannot take square root of a negative number" +msgstr "უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ—ი რიცხვიდáƒáƒœ ფესვის áƒáƒ›áƒáƒ¦áƒ”ბრშეუძლებელიáƒ" + +#: utils/adt/float.c:1515 utils/adt/numeric.c:3982 utils/adt/numeric.c:4094 +#, c-format +msgid "zero raised to a negative power is undefined" +msgstr "ნული უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ— ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ¨áƒ˜ გáƒáƒœáƒ£áƒ¡áƒáƒ–ღვრელიáƒ" + +#: utils/adt/float.c:1519 utils/adt/numeric.c:3986 utils/adt/numeric.c:10988 +#, c-format +msgid "a negative number raised to a non-integer power yields a complex result" +msgstr "" + +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3894 utils/adt/numeric.c:10768 +#, c-format +msgid "cannot take logarithm of zero" +msgstr "ნულის ლáƒáƒ’áƒáƒ áƒ˜áƒ—მის áƒáƒ¦áƒ”ბრშეუძლებელიáƒ" + +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3832 utils/adt/numeric.c:3889 utils/adt/numeric.c:10772 +#, c-format +msgid "cannot take logarithm of a negative number" +msgstr "უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ—ი რიცხვის ლáƒáƒ’áƒáƒ áƒ˜áƒ—მის áƒáƒ¦áƒ”ბრშეუძლებელიáƒ" + +#: utils/adt/float.c:1765 utils/adt/float.c:1796 utils/adt/float.c:1891 utils/adt/float.c:1918 utils/adt/float.c:1946 utils/adt/float.c:1973 utils/adt/float.c:2120 utils/adt/float.c:2157 utils/adt/float.c:2327 utils/adt/float.c:2383 utils/adt/float.c:2448 utils/adt/float.c:2505 utils/adt/float.c:2696 utils/adt/float.c:2720 +#, c-format +msgid "input is out of range" +msgstr "შეყვáƒáƒœáƒ˜áƒšáƒ˜ მნიშვნელáƒáƒ‘რდიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/float.c:4000 utils/adt/numeric.c:1842 +#, c-format +msgid "count must be greater than zero" +msgstr "რáƒáƒáƒ“ენáƒáƒ‘რნულზე მეტი უნდრიყáƒáƒ¡" + +#: utils/adt/float.c:4005 utils/adt/numeric.c:1853 +#, c-format +msgid "operand, lower bound, and upper bound cannot be NaN" +msgstr "" + +#: utils/adt/float.c:4011 utils/adt/numeric.c:1858 +#, c-format +msgid "lower and upper bounds must be finite" +msgstr "ქვედრდრზედრზღვრები სáƒáƒ¡áƒ áƒ£áƒšáƒ˜ უნდრყáƒáƒ¡" + +#: utils/adt/float.c:4077 utils/adt/numeric.c:1872 +#, c-format +msgid "lower bound cannot equal upper bound" +msgstr "ქვედრზღვáƒáƒ áƒ˜ ზედრზღვáƒáƒ áƒ˜áƒ¡ ტáƒáƒšáƒ˜ ვერ იქნებáƒ" + +#: utils/adt/formatting.c:530 +#, c-format +msgid "invalid format specification for an interval value" +msgstr "ინტერვáƒáƒšáƒ˜áƒ¡ მნიშვნელáƒáƒ‘ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციფიკáƒáƒªáƒ˜áƒ" + +#: utils/adt/formatting.c:531 +#, c-format +msgid "Intervals are not tied to specific calendar dates." +msgstr "" + +#: utils/adt/formatting.c:1161 +#, c-format +msgid "\"EEEE\" must be the last pattern used" +msgstr "\"EEEE\" ბáƒáƒšáƒ გáƒáƒ›áƒáƒ§áƒ”ნებული შáƒáƒ‘ლáƒáƒœáƒ˜ უნდრიყáƒáƒ¡" + +#: utils/adt/formatting.c:1169 +#, c-format +msgid "\"9\" must be ahead of \"PR\"" +msgstr "\"9\" \"PR\"-ზე წინ უნდრიყáƒáƒ¡" + +#: utils/adt/formatting.c:1185 +#, c-format +msgid "\"0\" must be ahead of \"PR\"" +msgstr "\"0\" \"PR\"-ზე წინ უნდრიყáƒáƒ¡" + +#: utils/adt/formatting.c:1212 +#, c-format +msgid "multiple decimal points" +msgstr "ბევრი áƒáƒ—áƒáƒ‘ითი წერტილი" + +#: utils/adt/formatting.c:1216 utils/adt/formatting.c:1299 +#, c-format +msgid "cannot use \"V\" and decimal point together" +msgstr "\"V\"-ს დრáƒáƒ—áƒáƒ‘ით წერტილს ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: utils/adt/formatting.c:1228 +#, c-format +msgid "cannot use \"S\" twice" +msgstr "\"S\"-ს áƒáƒ áƒ¯áƒ”რ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: utils/adt/formatting.c:1232 +#, c-format +msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" +msgstr "\"S\"-ის დრ\"PL\"/\"MI\"/\"SG\"/\"PR\"-ის ერთáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: utils/adt/formatting.c:1252 +#, c-format +msgid "cannot use \"S\" and \"MI\" together" +msgstr "\"S\"-ის დრ\"MI\"-ის ერთáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: utils/adt/formatting.c:1262 +#, c-format +msgid "cannot use \"S\" and \"PL\" together" +msgstr "\"S\"-ის დრ\"PL\"-ის ერთáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: utils/adt/formatting.c:1272 +#, c-format +msgid "cannot use \"S\" and \"SG\" together" +msgstr "\"S\"-ის დრ\"SG\"-ის ერთáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: utils/adt/formatting.c:1281 +#, c-format +msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" +msgstr "\"PR\"-ის დრ\"S\"/\"PL\"/\"MI\"/\"SG\"-ის ერთáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: utils/adt/formatting.c:1307 +#, c-format +msgid "cannot use \"EEEE\" twice" +msgstr "\"EEEE\"-ს áƒáƒ áƒ¯áƒ”რ ვერ გáƒáƒ›áƒáƒ§áƒ”ნებთ" + +#: utils/adt/formatting.c:1313 +#, c-format +msgid "\"EEEE\" is incompatible with other formats" +msgstr "\"EEEE\" სხვრფáƒáƒ áƒ›áƒáƒ¢áƒ”ბთáƒáƒœ შეუთáƒáƒ•სებელიáƒ" + +#: utils/adt/formatting.c:1314 +#, c-format +msgid "\"EEEE\" may only be used together with digit and decimal point patterns." +msgstr "" + +#: utils/adt/formatting.c:1398 +#, c-format +msgid "invalid datetime format separator: \"%s\"" +msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜/დრáƒáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ›áƒ§áƒáƒ¤áƒ˜: \"%s\"" + +#: utils/adt/formatting.c:1525 +#, c-format +msgid "\"%s\" is not a number" +msgstr "\"%s\" რიცხვი áƒáƒ áƒáƒ" + +#: utils/adt/formatting.c:1603 +#, c-format +msgid "case conversion failed: %s" +msgstr "სიმბáƒáƒšáƒáƒ”ბის ზáƒáƒ›áƒ˜áƒ¡ გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" + +#: utils/adt/formatting.c:1651 utils/adt/formatting.c:1799 utils/adt/formatting.c:1989 +#, c-format +msgid "could not determine which collation to use for %s function" +msgstr "" + +#: utils/adt/formatting.c:2410 +#, c-format +msgid "invalid combination of date conventions" +msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡ გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒ›áƒ‘ინáƒáƒªáƒ˜áƒ" + +#: utils/adt/formatting.c:2411 +#, c-format +msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." +msgstr "" + +#: utils/adt/formatting.c:2433 +#, c-format +msgid "conflicting values for \"%s\" field in formatting string" +msgstr "" + +#: utils/adt/formatting.c:2435 +#, c-format +msgid "This value contradicts a previous setting for the same field type." +msgstr "ეს მნიშვნელáƒáƒ‘რიგივე ველის ტიპისთვის წინრპáƒáƒ áƒáƒ›áƒ”ტრს ეწინáƒáƒáƒ¦áƒ›áƒ“ეგებáƒ." + +#: utils/adt/formatting.c:2502 +#, c-format +msgid "source string too short for \"%s\" formatting field" +msgstr "" + +#: utils/adt/formatting.c:2504 +#, c-format +msgid "Field requires %d characters, but only %d remain." +msgstr "ველს %d სიმბáƒáƒšáƒ სჭირდებáƒ, მáƒáƒ’რáƒáƒ› მხáƒáƒšáƒáƒ“ %d-ღáƒáƒ დáƒáƒ áƒ©áƒ”ნილი." + +#: utils/adt/formatting.c:2506 utils/adt/formatting.c:2520 +#, c-format +msgid "If your source string is not fixed-width, try using the \"FM\" modifier." +msgstr "" + +#: utils/adt/formatting.c:2516 utils/adt/formatting.c:2529 utils/adt/formatting.c:2750 utils/adt/formatting.c:3650 +#, c-format +msgid "invalid value \"%s\" for \"%s\"" +msgstr "მნიშვნელáƒáƒ‘რ\"%s\" \"%s\"-თვის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: utils/adt/formatting.c:2518 +#, c-format +msgid "Field requires %d characters, but only %d could be parsed." +msgstr "" + +#: utils/adt/formatting.c:2531 +#, c-format +msgid "Value must be an integer." +msgstr "მნიშვნელáƒáƒ‘რმთელი რიცხვი უნდრიყáƒáƒ¡." + +#: utils/adt/formatting.c:2536 +#, c-format +msgid "value for \"%s\" in source string is out of range" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡ სტრიქáƒáƒœáƒ¨áƒ˜ \"%s\"-ის მნიშვნელáƒáƒ‘რდიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/formatting.c:2538 +#, c-format +msgid "Value must be in the range %d to %d." +msgstr "მნიშვნელáƒáƒ‘რუნდრიყáƒáƒ¡ დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ“áƒáƒœ %d-%d." + +#: utils/adt/formatting.c:2752 +#, c-format +msgid "The given value did not match any of the allowed values for this field." +msgstr "" + +#: utils/adt/formatting.c:2968 utils/adt/formatting.c:2988 utils/adt/formatting.c:3008 utils/adt/formatting.c:3028 utils/adt/formatting.c:3047 utils/adt/formatting.c:3066 utils/adt/formatting.c:3090 utils/adt/formatting.c:3108 utils/adt/formatting.c:3126 utils/adt/formatting.c:3144 utils/adt/formatting.c:3161 utils/adt/formatting.c:3178 +#, c-format +msgid "localized string format value too long" +msgstr "ლáƒáƒ™áƒáƒšáƒ˜áƒ–ებული სტრიქáƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რმეტისმეტáƒáƒ“ გრძელიáƒ" + +#: utils/adt/formatting.c:3458 +#, c-format +msgid "unmatched format separator \"%c\"" +msgstr "" + +#: utils/adt/formatting.c:3519 +#, c-format +msgid "unmatched format character \"%s\"" +msgstr "" + +#: utils/adt/formatting.c:3652 +#, c-format +msgid "Time zone abbreviation is not recognized." +msgstr "დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლის áƒáƒ‘რევიáƒáƒ¢áƒ£áƒ áƒ უცნáƒáƒ‘იáƒ." + +#: utils/adt/formatting.c:3853 +#, c-format +msgid "invalid input string for \"Y,YYY\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შეყვáƒáƒœáƒ˜áƒšáƒ˜ სტრიქáƒáƒœáƒ˜ \"Y,YYY\"-სთვის" + +#: utils/adt/formatting.c:3942 +#, c-format +msgid "input string is too short for datetime format" +msgstr "შეყვáƒáƒœáƒ˜áƒšáƒ˜ სტრიქáƒáƒœáƒ˜ datetime ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡áƒ—ვის მეტისმეტáƒáƒ“ მáƒáƒ™áƒšáƒ”áƒ" + +#: utils/adt/formatting.c:3950 +#, c-format +msgid "trailing characters remain in input string after datetime format" +msgstr "" + +#: utils/adt/formatting.c:4494 +#, c-format +msgid "missing time zone in input string for type timestamptz" +msgstr "" + +#: utils/adt/formatting.c:4500 +#, c-format +msgid "timestamptz out of range" +msgstr "timestamptz დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/formatting.c:4528 +#, c-format +msgid "datetime format is zoned but not timed" +msgstr "" + +#: utils/adt/formatting.c:4577 +#, c-format +msgid "missing time zone in input string for type timetz" +msgstr "" + +#: utils/adt/formatting.c:4583 +#, c-format +msgid "timetz out of range" +msgstr "timetz დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/formatting.c:4609 +#, c-format +msgid "datetime format is not dated and not timed" +msgstr "" + +#: utils/adt/formatting.c:4786 +#, c-format +msgid "hour \"%d\" is invalid for the 12-hour clock" +msgstr "სáƒáƒáƒ—ი \"%d\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ 12-სáƒáƒáƒ—იáƒáƒœáƒ˜ áƒáƒ—ვლისთვის" + +#: utils/adt/formatting.c:4788 +#, c-format +msgid "Use the 24-hour clock, or give an hour between 1 and 12." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ 24-სáƒáƒáƒ—იáƒáƒœáƒ˜ áƒáƒ—ვლრáƒáƒœ მიუთითეთ სáƒáƒáƒ—ი დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ“áƒáƒœ 1-12." + +#: utils/adt/formatting.c:4900 +#, c-format +msgid "cannot calculate day of year without year information" +msgstr "წლის დღის გáƒáƒ›áƒáƒ—ვლრწლის მითითების გáƒáƒ áƒ”შე შეუძლებელიáƒ" + +#: utils/adt/formatting.c:5852 +#, c-format +msgid "\"EEEE\" not supported for input" +msgstr "\"EEEE\" შეყვáƒáƒœáƒ˜áƒ¡áƒ—ვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: utils/adt/formatting.c:5864 +#, c-format +msgid "\"RN\" not supported for input" +msgstr "\"RN\" შეყვáƒáƒœáƒ˜áƒ¡áƒ—ვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: utils/adt/genfile.c:84 +#, c-format +msgid "absolute path not allowed" +msgstr "áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ ბილიკი დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: utils/adt/genfile.c:89 +#, c-format +msgid "path must be in or below the data directory" +msgstr "ბილიკი მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში áƒáƒœ უფრრქვემáƒáƒ— უნდრიყáƒáƒ¡" + +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:190 utils/adt/oracle_compat.c:288 utils/adt/oracle_compat.c:839 utils/adt/oracle_compat.c:1142 +#, c-format +msgid "requested length too large" +msgstr "მáƒáƒ—ხáƒáƒ•ნილი სიგრძე ძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ" + +#: utils/adt/genfile.c:131 +#, c-format +msgid "could not seek in file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) გáƒáƒ“áƒáƒ®áƒ•ევის პრáƒáƒ‘ლემáƒ: %m" + +#: utils/adt/genfile.c:171 +#, c-format +msgid "file length too large" +msgstr "ფáƒáƒšáƒ˜áƒ¡ სიგრძე მეტისმეáƒáƒ“ დიდიáƒ" + +#: utils/adt/genfile.c:656 +#, c-format +msgid "tablespace with OID %u does not exist" +msgstr "ცხრილების სივრცე OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: utils/adt/geo_ops.c:998 utils/adt/geo_ops.c:1052 +#, c-format +msgid "invalid line specification: A and B cannot both be zero" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ხáƒáƒ–ის გáƒáƒœáƒ¡áƒáƒ–ღვრებáƒ: A დრB áƒáƒ áƒ˜áƒ•ე ნულის ტáƒáƒšáƒ˜ ვერ იქნებáƒ" + +#: utils/adt/geo_ops.c:1008 utils/adt/geo_ops.c:1124 +#, c-format +msgid "invalid line specification: must be two distinct points" +msgstr "" + +#: utils/adt/geo_ops.c:1438 utils/adt/geo_ops.c:3438 utils/adt/geo_ops.c:4368 utils/adt/geo_ops.c:5253 +#, c-format +msgid "too many points requested" +msgstr "მáƒáƒ—ხáƒáƒ•ნილირმეტისმეტáƒáƒ“ ბევრი წერტილი" + +#: utils/adt/geo_ops.c:1502 +#, c-format +msgid "invalid number of points in external \"path\" value" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წერტილების რáƒáƒáƒ“ენáƒáƒ‘რგáƒáƒ áƒ” ცვლáƒáƒ“ის \"path\" მნიშვნელáƒáƒ‘áƒáƒ¨áƒ˜" + +#: utils/adt/geo_ops.c:3487 +#, c-format +msgid "invalid number of points in external \"polygon\" value" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წერტილების რáƒáƒáƒ“ენáƒáƒ‘რგáƒáƒ áƒ” ცვლáƒáƒ“ის \"polygon\" მნიშვნელáƒáƒ‘áƒáƒ¨áƒ˜" + +#: utils/adt/geo_ops.c:4463 +#, c-format +msgid "open path cannot be converted to polygon" +msgstr "გáƒáƒ®áƒ¡áƒœáƒ˜áƒš ბილიკს პáƒáƒšáƒ˜áƒ’áƒáƒœáƒáƒ“ ვერ გáƒáƒ“áƒáƒáƒ™áƒ”თებთ" + +#: utils/adt/geo_ops.c:4718 +#, c-format +msgid "invalid radius in external \"circle\" value" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒ“იუსი გáƒáƒ áƒ” ცვლáƒáƒ“ის \"circle\" მნიშვნელáƒáƒ‘áƒáƒ¨áƒ˜" + +#: utils/adt/geo_ops.c:5239 +#, c-format +msgid "cannot convert circle with radius zero to polygon" +msgstr "" + +#: utils/adt/geo_ops.c:5244 +#, c-format +msgid "must request at least 2 points" +msgstr "უნდრმáƒáƒ˜áƒ—ხáƒáƒ•áƒáƒ— სულ ცáƒáƒ¢áƒ 2 წერტილი" + +#: utils/adt/int.c:264 +#, c-format +msgid "invalid int2vector data" +msgstr "int2vector -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მები" + +#: utils/adt/int.c:1529 utils/adt/int8.c:1403 utils/adt/numeric.c:1750 utils/adt/timestamp.c:6546 utils/adt/timestamp.c:6632 +#, c-format +msgid "step size cannot equal zero" +msgstr "ბიჯის ზáƒáƒ›áƒ ნულის ტáƒáƒšáƒ˜ ვერ იქნებáƒ" + +#: utils/adt/int8.c:448 utils/adt/int8.c:471 utils/adt/int8.c:485 utils/adt/int8.c:499 utils/adt/int8.c:530 utils/adt/int8.c:554 utils/adt/int8.c:636 utils/adt/int8.c:704 utils/adt/int8.c:710 utils/adt/int8.c:736 utils/adt/int8.c:750 utils/adt/int8.c:774 utils/adt/int8.c:787 utils/adt/int8.c:899 utils/adt/int8.c:913 utils/adt/int8.c:927 utils/adt/int8.c:958 utils/adt/int8.c:980 utils/adt/int8.c:994 utils/adt/int8.c:1008 utils/adt/int8.c:1041 utils/adt/int8.c:1055 +#: utils/adt/int8.c:1069 utils/adt/int8.c:1100 utils/adt/int8.c:1122 utils/adt/int8.c:1136 utils/adt/int8.c:1150 utils/adt/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4527 utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 utils/adt/varbit.c:1676 +#, c-format +msgid "bigint out of range" +msgstr "bigint დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/int8.c:1360 +#, c-format +msgid "OID out of range" +msgstr "OID დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/json.c:202 utils/adt/jsonb.c:664 +#, c-format +msgid "key value must be scalar, not array, composite, or json" +msgstr "" + +#: utils/adt/json.c:1034 utils/adt/json.c:1044 utils/fmgr/funcapi.c:2090 +#, c-format +msgid "could not determine data type for argument %d" +msgstr "áƒáƒ áƒ’უმენტისთვის %d მáƒáƒœáƒáƒªáƒ”მების ტიპის გáƒáƒœáƒ¡áƒáƒ–ღვრრშეუძლებელიáƒ" + +#: utils/adt/json.c:1067 utils/adt/json.c:1259 utils/adt/json.c:1435 utils/adt/json.c:1513 utils/adt/jsonb.c:1333 utils/adt/jsonb.c:1423 +#, c-format +msgid "null value not allowed for object key" +msgstr "áƒáƒ‘იექტის გáƒáƒ¡áƒáƒ¦áƒ”ბისთვის ნულáƒáƒ•áƒáƒœáƒ˜ მნიშვნელáƒáƒ‘რდáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: utils/adt/json.c:1110 utils/adt/json.c:1274 +#, c-format +msgid "duplicate JSON object key value: %s" +msgstr "დუბლირებული JSON áƒáƒ‘იექტის გáƒáƒ¡áƒáƒ¦áƒ”ბის მნიშვნელáƒáƒ‘áƒ: %s" + +#: utils/adt/json.c:1219 utils/adt/jsonb.c:1134 +#, c-format +msgid "argument list must have even number of elements" +msgstr "áƒáƒ áƒ’უმენტების სიáƒáƒ¡ ლუწი რáƒáƒáƒ“ენáƒáƒ‘ის ელემენტები უნდრჰქáƒáƒœáƒ“ეს" + +#. translator: %s is a SQL function name +#: utils/adt/json.c:1221 utils/adt/jsonb.c:1136 +#, c-format +msgid "The arguments of %s must consist of alternating keys and values." +msgstr "%s-ის áƒáƒ áƒ’უმენტები პáƒáƒ áƒáƒ›áƒ”ტრებისრდრმნიშვნელáƒáƒ‘ების მáƒáƒœáƒáƒªáƒ•ლეáƒáƒ‘ით სიáƒáƒ¡ უნდრწáƒáƒ áƒ›áƒáƒáƒ“გენდეს." + +#: utils/adt/json.c:1413 utils/adt/jsonb.c:1311 +#, c-format +msgid "array must have two columns" +msgstr "მáƒáƒ¡áƒ˜áƒ•ს áƒáƒ áƒ˜ სვეტი უნდრჰქáƒáƒœáƒ“ეს" + +#: utils/adt/json.c:1502 utils/adt/jsonb.c:1412 +#, c-format +msgid "mismatched array dimensions" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის ზáƒáƒ›áƒ”ბი áƒáƒ  ემთხვევáƒ" + +#: utils/adt/json.c:1688 utils/adt/jsonb_util.c:1956 +#, c-format +msgid "duplicate JSON object key value" +msgstr "დუბლირებული JSON áƒáƒ‘იექტის გáƒáƒ¡áƒáƒ¦áƒ”ბის მნიშვნელáƒáƒ‘áƒ" + +#: utils/adt/jsonb.c:282 +#, c-format +msgid "string too long to represent as jsonb string" +msgstr "" + +#: utils/adt/jsonb.c:283 +#, c-format +msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." +msgstr "" + +#: utils/adt/jsonb.c:1153 +#, c-format +msgid "argument %d: key must not be null" +msgstr "áƒáƒ áƒ’უმენტი %d: გáƒáƒ¡áƒáƒ¦áƒ”ბი ნულáƒáƒ•áƒáƒœ ვერ იქნებáƒ" + +#: utils/adt/jsonb.c:1744 +#, c-format +msgid "field name must not be null" +msgstr "ველის სáƒáƒ®áƒ”ლი ნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" + +#: utils/adt/jsonb.c:1806 +#, c-format +msgid "object keys must be strings" +msgstr "áƒáƒ‘იექტის გáƒáƒ¡áƒáƒ¦áƒ”ბები სტრიქáƒáƒœáƒ”ბი უნდრიყáƒáƒ¡" + +#: utils/adt/jsonb.c:2017 +#, c-format +msgid "cannot cast jsonb null to type %s" +msgstr "jsonb null-ის %s-ის ტიპში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ" + +#: utils/adt/jsonb.c:2018 +#, c-format +msgid "cannot cast jsonb string to type %s" +msgstr "jsonb სტრიქáƒáƒœáƒ˜áƒ¡ %s-ის ტიპში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ" + +#: utils/adt/jsonb.c:2019 +#, c-format +msgid "cannot cast jsonb numeric to type %s" +msgstr "jsonb რიცხვის %s-ის ტიპში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ" + +#: utils/adt/jsonb.c:2020 +#, c-format +msgid "cannot cast jsonb boolean to type %s" +msgstr "jsonb ლáƒáƒ’იკური მნიშვნელáƒáƒ‘ის %s-ის ტიპში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ" + +#: utils/adt/jsonb.c:2021 +#, c-format +msgid "cannot cast jsonb array to type %s" +msgstr "jsonb მáƒáƒ¡áƒ˜áƒ•ის %s-ის ტიპში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ" + +#: utils/adt/jsonb.c:2022 +#, c-format +msgid "cannot cast jsonb object to type %s" +msgstr "jsonb áƒáƒ‘იექტის %s-ის ტიპში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ" + +#: utils/adt/jsonb.c:2023 +#, c-format +msgid "cannot cast jsonb array or object to type %s" +msgstr "jsonb áƒáƒ‘იექტის áƒáƒœ მáƒáƒ¡áƒ˜áƒ•ის %s-ის ტიპში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ" + +#: utils/adt/jsonb_util.c:756 +#, c-format +msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" +msgstr "" + +#: utils/adt/jsonb_util.c:797 +#, c-format +msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" +msgstr "" + +#: utils/adt/jsonb_util.c:1671 utils/adt/jsonb_util.c:1691 +#, c-format +msgid "total size of jsonb array elements exceeds the maximum of %d bytes" +msgstr "jsonb მáƒáƒ¡áƒ˜áƒ•ის ელემენტების სრული ზáƒáƒ›áƒ”ბრმáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› დáƒáƒ¡áƒáƒ¨áƒ•ებზე (%d ბáƒáƒ˜áƒ¢áƒ˜) დიდიáƒ" + +#: utils/adt/jsonb_util.c:1752 utils/adt/jsonb_util.c:1787 utils/adt/jsonb_util.c:1807 +#, c-format +msgid "total size of jsonb object elements exceeds the maximum of %d bytes" +msgstr "" + +#: utils/adt/jsonbsubs.c:67 utils/adt/jsonbsubs.c:148 +#, c-format +msgid "jsonb subscript does not support slices" +msgstr "" + +#: utils/adt/jsonbsubs.c:100 utils/adt/jsonbsubs.c:114 +#, c-format +msgid "subscript type %s is not supported" +msgstr "ქვეკრიპტის ტიპი %s მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: utils/adt/jsonbsubs.c:101 +#, c-format +msgid "jsonb subscript must be coercible to only one type, integer or text." +msgstr "" + +#: utils/adt/jsonbsubs.c:115 +#, c-format +msgid "jsonb subscript must be coercible to either integer or text." +msgstr "" + +#: utils/adt/jsonbsubs.c:136 +#, c-format +msgid "jsonb subscript must have text type" +msgstr "jsonb ქვესკრიპტს ტექსტური ტიპი უნდრჰქáƒáƒœáƒ“ეს" + +#: utils/adt/jsonbsubs.c:204 +#, c-format +msgid "jsonb subscript in assignment must not be null" +msgstr "" + +#: utils/adt/jsonfuncs.c:582 utils/adt/jsonfuncs.c:829 utils/adt/jsonfuncs.c:2438 utils/adt/jsonfuncs.c:3013 utils/adt/jsonfuncs.c:3926 utils/adt/jsonfuncs.c:4273 +#, c-format +msgid "cannot call %s on a scalar" +msgstr "%s-ის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბრსკáƒáƒšáƒáƒ áƒ–ე შეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:587 utils/adt/jsonfuncs.c:814 utils/adt/jsonfuncs.c:3015 utils/adt/jsonfuncs.c:3913 +#, c-format +msgid "cannot call %s on an array" +msgstr "%s-ის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბრმáƒáƒ¡áƒ˜áƒ•ზე შეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:723 +#, c-format +msgid "JSON data, line %d: %s%s%s" +msgstr "JSON მáƒáƒœáƒáƒªáƒ”მი, ხáƒáƒ–ი %d: %s%s%s" + +#: utils/adt/jsonfuncs.c:1882 utils/adt/jsonfuncs.c:1919 +#, c-format +msgid "cannot get array length of a scalar" +msgstr "სკáƒáƒšáƒáƒ áƒ˜áƒ¡ მáƒáƒ¡áƒ˜áƒ•ის სიგრძის მიღებრშეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:1886 utils/adt/jsonfuncs.c:1905 +#, c-format +msgid "cannot get array length of a non-array" +msgstr "áƒáƒ áƒ-მáƒáƒ¡áƒ˜áƒ•ის მáƒáƒ¡áƒ˜áƒ•ის სიგრძის მიღებრშეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:1985 +#, c-format +msgid "cannot call %s on a non-object" +msgstr "áƒáƒ áƒ-áƒáƒ‘იექტზე %s-ის გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბრშეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:2173 +#, c-format +msgid "cannot deconstruct an array as an object" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის დეკáƒáƒœáƒ¡áƒ¢áƒ áƒ£áƒ¥áƒªáƒ˜áƒ áƒáƒ‘იექტáƒáƒ“ შეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:2187 +#, c-format +msgid "cannot deconstruct a scalar" +msgstr "სკáƒáƒšáƒáƒ áƒ˜áƒ¡ დეკáƒáƒœáƒ¡áƒ¢áƒ áƒ£áƒ¥áƒªáƒ˜áƒ შეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:2232 +#, c-format +msgid "cannot extract elements from a scalar" +msgstr "სკáƒáƒšáƒáƒ áƒ˜áƒ“áƒáƒœ ელემენტების გáƒáƒ›áƒáƒ¦áƒ”ბრშეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:2236 +#, c-format +msgid "cannot extract elements from an object" +msgstr "áƒáƒ‘იექტიდáƒáƒœ ელემენტების გáƒáƒ›áƒáƒ¦áƒ”ბრშეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:2423 utils/adt/jsonfuncs.c:4151 +#, c-format +msgid "cannot call %s on a non-array" +msgstr "áƒáƒ áƒ-მáƒáƒ¡áƒ˜áƒ•ზე %s-ს ვერ გáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒ”ბთ" + +#: utils/adt/jsonfuncs.c:2514 utils/adt/jsonfuncs.c:2519 utils/adt/jsonfuncs.c:2537 utils/adt/jsonfuncs.c:2543 +#, c-format +msgid "expected JSON array" +msgstr "მáƒáƒ•ელáƒáƒ“ი JSON მáƒáƒ¡áƒ˜áƒ•ს" + +#: utils/adt/jsonfuncs.c:2515 +#, c-format +msgid "See the value of key \"%s\"." +msgstr "იხილეთ მáƒáƒ¡áƒ˜áƒ•ის ელემენტი \"%s\"." + +#: utils/adt/jsonfuncs.c:2538 +#, c-format +msgid "See the array element %s of key \"%s\"." +msgstr "იხილეთ მáƒáƒ¡áƒ˜áƒ•ის ელემენტი %s გáƒáƒ¡áƒáƒ¦áƒ”ბიდáƒáƒœ \"%s\"." + +#: utils/adt/jsonfuncs.c:2544 +#, c-format +msgid "See the array element %s." +msgstr "იხილეთ მáƒáƒ¡áƒ˜áƒ•ის ელემენტი %s." + +#: utils/adt/jsonfuncs.c:2596 +#, c-format +msgid "malformed JSON array" +msgstr "დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული JSON მáƒáƒ¡áƒ˜áƒ•ი" + +#. translator: %s is a function name, eg json_to_record +#: utils/adt/jsonfuncs.c:3625 +#, c-format +msgid "first argument of %s must be a row type" +msgstr "%s-ის პირველი áƒáƒ áƒ’უმენტი მწკრივის ტიპის უნდრიყáƒáƒ¡" + +#. translator: %s is a function name, eg json_to_record +#: utils/adt/jsonfuncs.c:3649 +#, c-format +msgid "could not determine row type for result of %s" +msgstr "%s-ის შედეგის მწკრივის ტიპის დáƒáƒ“გენრშეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:3651 +#, c-format +msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." +msgstr "" + +#: utils/adt/jsonfuncs.c:4037 utils/fmgr/funcapi.c:94 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული რეჟიმი, მáƒáƒ’რáƒáƒ› áƒáƒ› კáƒáƒœáƒ¢áƒ”ქსტში ეს დáƒáƒ£áƒ¨áƒ•ებელიáƒ" + +#: utils/adt/jsonfuncs.c:4168 utils/adt/jsonfuncs.c:4252 +#, c-format +msgid "argument of %s must be an array of objects" +msgstr "%s-ის áƒáƒ áƒ’უმენტი áƒáƒ‘იექტების მáƒáƒ¡áƒ˜áƒ•ს უნდრწáƒáƒ áƒ›áƒáƒáƒ“გენდეს" + +#: utils/adt/jsonfuncs.c:4201 +#, c-format +msgid "cannot call %s on an object" +msgstr "%s-ს áƒáƒ‘იექტზე ვერ გáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒ”ბთ" + +#: utils/adt/jsonfuncs.c:4634 utils/adt/jsonfuncs.c:4693 utils/adt/jsonfuncs.c:4773 +#, c-format +msgid "cannot delete from scalar" +msgstr "სკáƒáƒšáƒáƒ áƒ˜áƒ“áƒáƒœ წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:4778 +#, c-format +msgid "cannot delete from object using integer index" +msgstr "áƒáƒ‘იექტიდáƒáƒœ წáƒáƒ¨áƒšáƒ მთელი რიცხვის ინდექსის გáƒáƒ›áƒáƒ§áƒ”ნებით შეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:4846 utils/adt/jsonfuncs.c:5005 +#, c-format +msgid "cannot set path in scalar" +msgstr "სკáƒáƒšáƒáƒ áƒ¨áƒ˜ ბილიკის დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:4887 utils/adt/jsonfuncs.c:4929 +#, c-format +msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" +msgstr "" + +#: utils/adt/jsonfuncs.c:4900 +#, c-format +msgid "JSON value must not be null" +msgstr "JSON მნიშვნელáƒáƒ‘რნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" + +#: utils/adt/jsonfuncs.c:4901 +#, c-format +msgid "Exception was raised because null_value_treatment is \"raise_exception\"." +msgstr "" + +#: utils/adt/jsonfuncs.c:4902 +#, c-format +msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." +msgstr "" + +#: utils/adt/jsonfuncs.c:4957 +#, c-format +msgid "cannot delete path in scalar" +msgstr "სკáƒáƒšáƒáƒ áƒ¨áƒ˜ ბილიკის წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:5171 +#, c-format +msgid "path element at position %d is null" +msgstr "ბილიკის ელემენტი პáƒáƒ–იციáƒáƒ–ე %d ნულáƒáƒ•áƒáƒœáƒ˜áƒ" + +#: utils/adt/jsonfuncs.c:5190 utils/adt/jsonfuncs.c:5221 utils/adt/jsonfuncs.c:5294 +#, c-format +msgid "cannot replace existing key" +msgstr "áƒáƒ áƒ¡áƒ”ბული გáƒáƒ¡áƒáƒ¦áƒ”ბის ჩáƒáƒœáƒáƒªáƒ•ლებრშეუძლებელიáƒ" + +#: utils/adt/jsonfuncs.c:5191 utils/adt/jsonfuncs.c:5222 +#, c-format +msgid "The path assumes key is a composite object, but it is a scalar value." +msgstr "" + +#: utils/adt/jsonfuncs.c:5295 +#, c-format +msgid "Try using the function jsonb_set to replace key value." +msgstr "" + +#: utils/adt/jsonfuncs.c:5399 +#, c-format +msgid "path element at position %d is not an integer: \"%s\"" +msgstr "" + +#: utils/adt/jsonfuncs.c:5416 +#, c-format +msgid "path element at position %d is out of range: %d" +msgstr "" + +#: utils/adt/jsonfuncs.c:5568 +#, c-format +msgid "wrong flag type, only arrays and scalars are allowed" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒšáƒ›áƒ˜áƒ¡ ტიპი. დáƒáƒ¨áƒ•ებულირმხáƒáƒšáƒáƒ“ მáƒáƒ¡áƒ˜áƒ•ები დრსკáƒáƒšáƒáƒ áƒ”ბი" + +#: utils/adt/jsonfuncs.c:5575 +#, c-format +msgid "flag array element is not a string" +msgstr "áƒáƒšáƒ›áƒ˜áƒ¡ მáƒáƒ¡áƒ˜áƒ•ის ელემენტი სტრიქáƒáƒœáƒ˜ áƒáƒ áƒáƒ" + +#: utils/adt/jsonfuncs.c:5576 utils/adt/jsonfuncs.c:5598 +#, c-format +msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." +msgstr "" + +#: utils/adt/jsonfuncs.c:5596 +#, c-format +msgid "wrong flag in flag array: \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒšáƒáƒ›áƒ˜ áƒáƒšáƒ›áƒ”ბის მáƒáƒ¡áƒ˜áƒ•ში: \"%s\"" + +#: utils/adt/jsonpath.c:389 +#, c-format +msgid "@ is not allowed in root expressions" +msgstr "" + +#: utils/adt/jsonpath.c:395 +#, c-format +msgid "LAST is allowed only in array subscripts" +msgstr "" + +#: utils/adt/jsonpath_exec.c:490 +#, c-format +msgid "single boolean result is expected" +msgstr "მáƒáƒ•ელáƒáƒ“ი ერთ ლáƒáƒ’იკურ შედეგს" + +#: utils/adt/jsonpath_exec.c:850 +#, c-format +msgid "jsonpath wildcard array accessor can only be applied to an array" +msgstr "" + +#: utils/adt/jsonpath_exec.c:873 +#, c-format +msgid "jsonpath wildcard member accessor can only be applied to an object" +msgstr "" + +#: utils/adt/jsonpath_exec.c:922 +#, c-format +msgid "jsonpath array subscript is out of bounds" +msgstr "" + +#: utils/adt/jsonpath_exec.c:979 +#, c-format +msgid "jsonpath array accessor can only be applied to an array" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1043 +#, c-format +msgid "JSON object does not contain key \"%s\"" +msgstr "JSON áƒáƒ‘იექტი áƒáƒ  შეიცáƒáƒ•ს გáƒáƒ¡áƒáƒ¦áƒ”ბს \"%s\"" + +#: utils/adt/jsonpath_exec.c:1055 +#, c-format +msgid "jsonpath member accessor can only be applied to an object" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1113 +#, c-format +msgid "jsonpath item method .%s() can only be applied to an array" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1166 utils/adt/jsonpath_exec.c:1192 +#, c-format +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type double precision" +msgstr "áƒáƒ áƒ’უმენტი \"%s\" jsonpath-ის ელემენტის მეთáƒáƒ“ისთვის .%s() áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ ტიპისთვის double precision" + +#: utils/adt/jsonpath_exec.c:1171 utils/adt/jsonpath_exec.c:1197 utils/adt/jsonpath_exec.c:1413 utils/adt/jsonpath_exec.c:1445 +#, c-format +msgid "NaN or Infinity is not allowed for jsonpath item method .%s()" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1210 utils/adt/jsonpath_exec.c:1312 utils/adt/jsonpath_exec.c:1454 utils/adt/jsonpath_exec.c:1592 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a string or numeric value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1280 utils/adt/jsonpath_exec.c:1304 +#, c-format +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type bigint" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1356 utils/adt/jsonpath_exec.c:1376 +#, c-format +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type boolean" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1385 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a bool, string, or numeric value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1438 utils/adt/jsonpath_exec.c:1527 +#, c-format +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type numeric" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1486 +#, c-format +msgid "precision of jsonpath item method .%s() is out of range for type integer" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1500 +#, c-format +msgid "scale of jsonpath item method .%s() is out of range for type integer" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1560 utils/adt/jsonpath_exec.c:1584 +#, c-format +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type integer" +msgstr "" + +#: utils/adt/jsonpath_exec.c:1663 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a bool, string, numeric, or datetime value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2152 +#, c-format +msgid "left operand of jsonpath operator %s is not a single numeric value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2159 +#, c-format +msgid "right operand of jsonpath operator %s is not a single numeric value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2227 +#, c-format +msgid "operand of unary jsonpath operator %s is not a numeric value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2326 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a numeric value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2372 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a string" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2465 +#, c-format +msgid "time precision of jsonpath item method .%s() is out of range for type integer" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2499 utils/adt/jsonpath_exec.c:2505 utils/adt/jsonpath_exec.c:2532 utils/adt/jsonpath_exec.c:2560 utils/adt/jsonpath_exec.c:2613 utils/adt/jsonpath_exec.c:2664 utils/adt/jsonpath_exec.c:2720 +#, c-format +msgid "%s format is not recognized: \"%s\"" +msgstr "%s-ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ უცნáƒáƒ‘იáƒ: \"%s\"" + +#: utils/adt/jsonpath_exec.c:2501 +#, c-format +msgid "Use a datetime template argument to specify the input data format." +msgstr "" + +#: utils/adt/jsonpath_exec.c:2694 utils/adt/jsonpath_exec.c:2750 +#, c-format +msgid "time precision of jsonpath item method .%s() is invalid" +msgstr "" + +#: utils/adt/jsonpath_exec.c:2830 +#, c-format +msgid "jsonpath item method .%s() can only be applied to an object" +msgstr "" + +#: utils/adt/jsonpath_exec.c:3113 +#, c-format +msgid "could not convert value of type %s to jsonpath" +msgstr "%s ტიპის მნიშვნელáƒáƒ‘ის jsonpath-ში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ ვერ შევძელი" + +#: utils/adt/jsonpath_exec.c:3147 +#, c-format +msgid "could not find jsonpath variable \"%s\"" +msgstr "" + +#: utils/adt/jsonpath_exec.c:3200 +#, c-format +msgid "\"vars\" argument is not an object" +msgstr "áƒáƒ áƒ’უმენტი \"vars\" áƒáƒ‘იექტი áƒáƒ áƒáƒ" + +#: utils/adt/jsonpath_exec.c:3201 +#, c-format +msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +msgstr "" + +#: utils/adt/jsonpath_exec.c:3464 +#, c-format +msgid "jsonpath array subscript is not a single numeric value" +msgstr "" + +#: utils/adt/jsonpath_exec.c:3476 +#, c-format +msgid "jsonpath array subscript is out of integer range" +msgstr "" + +#: utils/adt/jsonpath_exec.c:3660 +#, c-format +msgid "cannot convert value from %s to %s without time zone usage" +msgstr "" + +#: utils/adt/jsonpath_exec.c:3662 +#, c-format +msgid "Use *_tz() function for time zone support." +msgstr "" + +#: utils/adt/jsonpath_exec.c:3956 +#, c-format +msgid "JSON path expression for column \"%s\" should return single item without wrapper" +msgstr "" + +#: utils/adt/jsonpath_exec.c:3958 utils/adt/jsonpath_exec.c:3963 +#, c-format +msgid "Use WITH WRAPPER clause to wrap SQL/JSON items into array." +msgstr "" + +#: utils/adt/jsonpath_exec.c:3962 +#, c-format +msgid "JSON path expression in JSON_QUERY should return single item without wrapper" +msgstr "" + +#: utils/adt/jsonpath_exec.c:4020 utils/adt/jsonpath_exec.c:4044 +#, c-format +msgid "JSON path expression for column \"%s\" should return single scalar item" +msgstr "" + +#: utils/adt/jsonpath_exec.c:4025 utils/adt/jsonpath_exec.c:4049 +#, c-format +msgid "JSON path expression in JSON_VALUE should return single scalar item" +msgstr "" + +#: utils/adt/levenshtein.c:132 +#, c-format +msgid "levenshtein argument exceeds maximum length of %d characters" +msgstr "" + +#: utils/adt/like.c:159 +#, c-format +msgid "nondeterministic collations are not supported for LIKE" +msgstr "" + +#: utils/adt/like.c:188 utils/adt/like_support.c:1023 +#, c-format +msgid "could not determine which collation to use for ILIKE" +msgstr "" + +#: utils/adt/like.c:200 +#, c-format +msgid "nondeterministic collations are not supported for ILIKE" +msgstr "" + +#: utils/adt/like_match.c:108 utils/adt/like_match.c:168 +#, c-format +msgid "LIKE pattern must not end with escape character" +msgstr "" + +#: utils/adt/like_match.c:293 utils/adt/regexp.c:800 +#, c-format +msgid "invalid escape string" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციáƒáƒšáƒ£áƒ áƒ˜ სიმბáƒáƒšáƒ" + +#: utils/adt/like_match.c:294 utils/adt/regexp.c:801 +#, c-format +msgid "Escape string must be empty or one character." +msgstr "" + +#: utils/adt/like_support.c:1013 +#, c-format +msgid "case insensitive matching not supported on type bytea" +msgstr "" + +#: utils/adt/like_support.c:1114 +#, c-format +msgid "regular-expression matching not supported on type bytea" +msgstr "" + +#: utils/adt/mac.c:102 +#, c-format +msgid "invalid octet value in \"macaddr\" value: \"%s\"" +msgstr "" + +#: utils/adt/mac8.c:555 +#, c-format +msgid "macaddr8 data out of range to convert to macaddr" +msgstr "" + +#: utils/adt/mac8.c:556 +#, c-format +msgid "Only addresses that have FF and FE as values in the 4th and 5th bytes from the left, for example xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted from macaddr8 to macaddr." +msgstr "" + +#: utils/adt/mcxtfuncs.c:173 +#, c-format +msgid "PID %d is not a PostgreSQL server process" +msgstr "პრáƒáƒªáƒ”სი PID-ით %d PostgreSQL-ის სერვერის პრáƒáƒªáƒ”სს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: utils/adt/misc.c:237 +#, c-format +msgid "global tablespace never has databases" +msgstr "ცხრილების სივრცეში 'global' მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ები áƒáƒ áƒáƒ¡áƒáƒ“ეს ყáƒáƒ¤áƒ˜áƒšáƒ" + +#: utils/adt/misc.c:259 +#, c-format +msgid "%u is not a tablespace OID" +msgstr "ცხრილების სივრცე OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: utils/adt/misc.c:454 +msgid "unreserved" +msgstr "რეზერვირებული áƒáƒ áƒáƒ" + +#: utils/adt/misc.c:458 +msgid "unreserved (cannot be function or type name)" +msgstr "რეზერვირებული áƒáƒ áƒáƒ (ფუნქციის áƒáƒœ ტიპის სáƒáƒ®áƒ”ლი áƒáƒ  შეიძლებრიყáƒáƒ¡)" + +#: utils/adt/misc.c:462 +msgid "reserved (can be function or type name)" +msgstr "რეზერვირებული (შეიძლებრიყáƒáƒ¡ ფუნქციის áƒáƒœ ტიპის სáƒáƒ®áƒ”ლი)" + +#: utils/adt/misc.c:466 +msgid "reserved" +msgstr "რეზერვირებული" + +#: utils/adt/misc.c:477 +msgid "can be bare label" +msgstr "შეიძლებრიყáƒáƒ¡ შიშველი ჭდე" + +#: utils/adt/misc.c:482 +msgid "requires AS" +msgstr "მáƒáƒ˜áƒ—ხáƒáƒ•ს \"AS\"" + +#: utils/adt/misc.c:897 utils/adt/misc.c:911 utils/adt/misc.c:950 utils/adt/misc.c:956 utils/adt/misc.c:962 utils/adt/misc.c:985 +#, c-format +msgid "string is not a valid identifier: \"%s\"" +msgstr "სტრიქáƒáƒœáƒ˜ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ: \"%s\"" + +#: utils/adt/misc.c:899 +#, c-format +msgid "String has unclosed double quotes." +msgstr "სტრიქáƒáƒœáƒ¡ დáƒáƒ£áƒ®áƒ£áƒ áƒáƒ•ი áƒáƒ áƒ›áƒáƒ’ი ბრჭყáƒáƒšáƒ˜ გáƒáƒáƒ©áƒœáƒ˜áƒ." + +#: utils/adt/misc.c:913 +#, c-format +msgid "Quoted identifier must not be empty." +msgstr "" + +#: utils/adt/misc.c:952 +#, c-format +msgid "No valid identifier before \".\"." +msgstr "" + +#: utils/adt/misc.c:958 +#, c-format +msgid "No valid identifier after \".\"." +msgstr "" + +#: utils/adt/misc.c:1018 +#, c-format +msgid "log format \"%s\" is not supported" +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: utils/adt/misc.c:1019 +#, c-format +msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." +msgstr "" + +#: utils/adt/multirangetypes.c:150 utils/adt/multirangetypes.c:163 utils/adt/multirangetypes.c:192 utils/adt/multirangetypes.c:266 utils/adt/multirangetypes.c:290 +#, c-format +msgid "malformed multirange literal: \"%s\"" +msgstr "" + +#: utils/adt/multirangetypes.c:152 +#, c-format +msgid "Missing left brace." +msgstr "áƒáƒ™áƒšáƒ˜áƒ მáƒáƒ áƒªáƒ®áƒ”ნრფრჩხილი." + +#: utils/adt/multirangetypes.c:194 +#, c-format +msgid "Expected range start." +msgstr "მáƒáƒ•ელáƒáƒ“ი დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ¡." + +#: utils/adt/multirangetypes.c:268 +#, c-format +msgid "Expected comma or end of multirange." +msgstr "მáƒáƒ•ელáƒáƒ“ი მძიმეს áƒáƒœ მულტიდიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ¡." + +#: utils/adt/multirangetypes.c:981 +#, c-format +msgid "multiranges cannot be constructed from multidimensional arrays" +msgstr "მულტიდიáƒáƒžáƒáƒ–áƒáƒœáƒ˜ მრáƒáƒ•áƒáƒšáƒ’áƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœáƒ˜ მáƒáƒ¡áƒ˜áƒ•ებისგáƒáƒœ ვერ შეიქმნებáƒ" + +#: utils/adt/multirangetypes.c:1007 +#, c-format +msgid "multirange values cannot contain null members" +msgstr "მულტიდიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒáƒœáƒ˜ მნიშვნელáƒáƒ‘ები ნულáƒáƒ•áƒáƒœ მწკრივებს áƒáƒ  შეიძლებრშეიცáƒáƒ•დეს" + +#: utils/adt/network.c:110 +#, c-format +msgid "invalid cidr value: \"%s\"" +msgstr "cidr-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: %s" + +#: utils/adt/network.c:111 utils/adt/network.c:241 +#, c-format +msgid "Value has bits set to right of mask." +msgstr "" + +#: utils/adt/network.c:152 utils/adt/network.c:1184 utils/adt/network.c:1209 utils/adt/network.c:1234 +#, c-format +msgid "could not format inet value: %m" +msgstr "inet-ის მნიშვნელáƒáƒ‘ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#. translator: %s is inet or cidr +#: utils/adt/network.c:209 +#, c-format +msgid "invalid address family in external \"%s\" value" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მისáƒáƒ›áƒáƒ áƒ—ის áƒáƒ¯áƒáƒ®áƒ˜ გáƒáƒ áƒ” \"%s\"-ის მნიშვნელáƒáƒ‘áƒáƒ¨áƒ˜" + +#. translator: %s is inet or cidr +#: utils/adt/network.c:216 +#, c-format +msgid "invalid bits in external \"%s\" value" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბიტები გáƒáƒ áƒ” \"%s\"-ის მნიშვნელáƒáƒ‘áƒáƒ¨áƒ˜" + +#. translator: %s is inet or cidr +#: utils/adt/network.c:225 +#, c-format +msgid "invalid length in external \"%s\" value" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე გáƒáƒ áƒ” \"%s\"-ის მნიშვნელáƒáƒ‘áƒáƒ¨áƒ˜" + +#: utils/adt/network.c:240 +#, c-format +msgid "invalid external \"cidr\" value" +msgstr "გáƒáƒ áƒ” cidr-ს áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ" + +#: utils/adt/network.c:336 utils/adt/network.c:359 +#, c-format +msgid "invalid mask length: %d" +msgstr "ნიღბის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე: %d" + +#: utils/adt/network.c:1252 +#, c-format +msgid "could not format cidr value: %m" +msgstr "cird-ის მნიშვნელáƒáƒ‘ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: utils/adt/network.c:1485 +#, c-format +msgid "cannot merge addresses from different families" +msgstr "სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რáƒáƒ¯áƒáƒ®áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ების შერწყმრშეუძლებელიáƒ" + +#: utils/adt/network.c:1893 +#, c-format +msgid "cannot AND inet values of different sizes" +msgstr "გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ებული ზáƒáƒ›áƒ˜áƒ¡ მქáƒáƒœáƒ” inet-ის მნიშვნელáƒáƒ‘ების AND შეუძლებელიáƒ" + +#: utils/adt/network.c:1925 +#, c-format +msgid "cannot OR inet values of different sizes" +msgstr "გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ებული ზáƒáƒ›áƒ˜áƒ¡ მქáƒáƒœáƒ” inet-ის მნიშვნელáƒáƒ‘ების OR შეუძლებელიáƒ" + +#: utils/adt/network.c:1986 utils/adt/network.c:2062 +#, c-format +msgid "result is out of range" +msgstr "შედეგი დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/network.c:2027 +#, c-format +msgid "cannot subtract inet values of different sizes" +msgstr "" + +#: utils/adt/numeric.c:786 utils/adt/numeric.c:3644 utils/adt/numeric.c:7201 utils/adt/numeric.c:7404 utils/adt/numeric.c:7876 utils/adt/numeric.c:10571 utils/adt/numeric.c:11045 utils/adt/numeric.c:11139 utils/adt/numeric.c:11273 +#, c-format +msgid "value overflows numeric format" +msgstr "მნიშვნელáƒáƒ‘რგáƒáƒ“áƒáƒáƒ•სებს რიცხვის ფáƒáƒ áƒ›áƒáƒ¢áƒ¡" + +#: utils/adt/numeric.c:1099 +#, c-format +msgid "invalid sign in external \"numeric\" value" +msgstr "" + +#: utils/adt/numeric.c:1105 +#, c-format +msgid "invalid scale in external \"numeric\" value" +msgstr "" + +#: utils/adt/numeric.c:1114 +#, c-format +msgid "invalid digit in external \"numeric\" value" +msgstr "" + +#: utils/adt/numeric.c:1329 utils/adt/numeric.c:1343 +#, c-format +msgid "NUMERIC precision %d must be between 1 and %d" +msgstr "" + +#: utils/adt/numeric.c:1334 +#, c-format +msgid "NUMERIC scale %d must be between %d and %d" +msgstr "" + +#: utils/adt/numeric.c:1352 +#, c-format +msgid "invalid NUMERIC type modifier" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ NUMERIC ტიპის მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ˜" + +#: utils/adt/numeric.c:1710 +#, c-format +msgid "start value cannot be NaN" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ მნიშვნელáƒáƒ‘რNaN ვერ იქნებáƒ" + +#: utils/adt/numeric.c:1714 +#, c-format +msgid "start value cannot be infinity" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ მნიშვნელáƒáƒ‘რუსáƒáƒ¡áƒ áƒ£áƒšáƒ ვერ იქნებáƒ" + +#: utils/adt/numeric.c:1721 +#, c-format +msgid "stop value cannot be NaN" +msgstr "სáƒáƒ‘áƒáƒšáƒáƒ მნიშვნელáƒáƒ‘რNaN ვერ იქნებáƒ" + +#: utils/adt/numeric.c:1725 +#, c-format +msgid "stop value cannot be infinity" +msgstr "სáƒáƒ‘áƒáƒšáƒáƒ მნიშვნელáƒáƒ‘რუსáƒáƒ¡áƒ áƒ£áƒšáƒ ვერ იქნებáƒ" + +#: utils/adt/numeric.c:1738 +#, c-format +msgid "step size cannot be NaN" +msgstr "ბიჯის ზáƒáƒ›áƒ NaN ვერ იქნებáƒ" + +#: utils/adt/numeric.c:1742 +#, c-format +msgid "step size cannot be infinity" +msgstr "ბიჯის ზáƒáƒ›áƒ უსáƒáƒ¡áƒ áƒ£áƒšáƒ ვერ იქნებáƒ" + +#: utils/adt/numeric.c:3634 +#, c-format +msgid "factorial of a negative number is undefined" +msgstr "უáƒáƒ¡áƒ áƒ§áƒáƒ¤áƒ˜áƒ—ი რიცხვის ფáƒáƒ¥áƒ¢áƒáƒ áƒ˜áƒáƒšáƒ˜ გáƒáƒ£áƒ áƒ™áƒ•ეველიáƒ" + +#: utils/adt/numeric.c:4241 +#, c-format +msgid "lower bound cannot be NaN" +msgstr "ქვედრზღვáƒáƒ áƒ˜ ნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" + +#: utils/adt/numeric.c:4245 +#, c-format +msgid "lower bound cannot be infinity" +msgstr "ქვედრზღვáƒáƒ áƒ˜ უსáƒáƒ¡áƒ áƒ£áƒšáƒáƒ‘რვერ იქნებáƒ" + +#: utils/adt/numeric.c:4252 +#, c-format +msgid "upper bound cannot be NaN" +msgstr "ზედრზღვáƒáƒ áƒ˜ ნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" + +#: utils/adt/numeric.c:4256 +#, c-format +msgid "upper bound cannot be infinity" +msgstr "ზედრზღვáƒáƒ áƒ˜ უსáƒáƒ¡áƒ áƒ£áƒšáƒáƒ‘რვერ იქნებáƒ" + +#: utils/adt/numeric.c:4417 utils/adt/numeric.c:4505 utils/adt/numeric.c:4565 utils/adt/numeric.c:4761 +#, c-format +msgid "cannot convert NaN to %s" +msgstr "\"NaN\"-ის %s-ში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ" + +#: utils/adt/numeric.c:4421 utils/adt/numeric.c:4509 utils/adt/numeric.c:4569 utils/adt/numeric.c:4765 +#, c-format +msgid "cannot convert infinity to %s" +msgstr "უსáƒáƒ¡áƒ áƒ£áƒšáƒáƒ‘ის %s-ში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ" + +#: utils/adt/numeric.c:4774 +#, c-format +msgid "pg_lsn out of range" +msgstr "pg_lsn დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/numeric.c:7966 utils/adt/numeric.c:8017 +#, c-format +msgid "numeric field overflow" +msgstr "რიცხვითი ველის გáƒáƒ“áƒáƒ•სებáƒ" + +#: utils/adt/numeric.c:7967 +#, c-format +msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." +msgstr "" + +#: utils/adt/numeric.c:8018 +#, c-format +msgid "A field with precision %d, scale %d cannot hold an infinite value." +msgstr "" + +#: utils/adt/numeric.c:11342 utils/adt/pseudorandomfuncs.c:135 utils/adt/pseudorandomfuncs.c:159 +#, c-format +msgid "lower bound must be less than or equal to upper bound" +msgstr "ქვედრზღვáƒáƒ áƒ˜ ზედრზღვáƒáƒ áƒ–ე ნáƒáƒ™áƒšáƒ”ბი áƒáƒœ ტáƒáƒšáƒ˜ უნდრიყáƒáƒ¡" + +#: utils/adt/oid.c:217 +#, c-format +msgid "invalid oidvector data" +msgstr "oidvevtor-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მები" + +#: utils/adt/oracle_compat.c:976 +#, c-format +msgid "requested character too large" +msgstr "მáƒáƒ—ხáƒáƒ•ნილი სიმბáƒáƒšáƒ ძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ" + +#: utils/adt/oracle_compat.c:1020 +#, c-format +msgid "character number must be positive" +msgstr "cost დáƒáƒ“ებით უნდრიყáƒáƒ¡" + +#: utils/adt/oracle_compat.c:1024 +#, c-format +msgid "null character not permitted" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ სიმბáƒáƒšáƒ áƒáƒ“უშვებელიáƒ" + +#: utils/adt/oracle_compat.c:1042 utils/adt/oracle_compat.c:1095 +#, c-format +msgid "requested character too large for encoding: %u" +msgstr "მáƒáƒ—ხáƒáƒ•ნილი სიმბáƒáƒšáƒ ძáƒáƒšáƒ˜áƒáƒœ დიდირკáƒáƒ“ირებისთვის: %u" + +#: utils/adt/oracle_compat.c:1083 +#, c-format +msgid "requested character not valid for encoding: %u" +msgstr "მáƒáƒ—ხáƒáƒ•ნილი სიმბáƒáƒšáƒ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ კáƒáƒ“ირებისთვის: %u" + +#: utils/adt/orderedsetaggs.c:446 utils/adt/orderedsetaggs.c:551 utils/adt/orderedsetaggs.c:691 +#, c-format +msgid "percentile value %g is not between 0 and 1" +msgstr "" + +#: utils/adt/pg_locale.c:1484 +#, c-format +msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" +msgstr "ლáƒáƒ™áƒáƒšáƒ˜áƒ¡áƒ—ვის \"%s\" წესებით \"%s\" კáƒáƒšáƒáƒ¢áƒáƒ áƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" + +#: utils/adt/pg_locale.c:1495 utils/adt/pg_locale.c:2969 utils/adt/pg_locale.c:3042 +#, c-format +msgid "ICU is not supported in this build" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ ICU-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბბს" + +#: utils/adt/pg_locale.c:1523 +#, c-format +msgid "could not create locale \"%s\": %m" +msgstr "ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ \"%s\" შექმნრშეუძლებელიáƒ: %m" + +#: utils/adt/pg_locale.c:1526 +#, c-format +msgid "The operating system could not find any locale data for the locale name \"%s\"." +msgstr "" + +#: utils/adt/pg_locale.c:1647 +#, c-format +msgid "collations with different collate and ctype values are not supported on this platform" +msgstr "" + +#: utils/adt/pg_locale.c:1694 +#, c-format +msgid "collation \"%s\" has no actual version, but a version was recorded" +msgstr "" + +#: utils/adt/pg_locale.c:1700 +#, c-format +msgid "collation \"%s\" has version mismatch" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ ვერსირáƒáƒ  ემთხვევáƒ: %s" + +#: utils/adt/pg_locale.c:1702 +#, c-format +msgid "The collation in the database was created using version %s, but the operating system provides version %s." +msgstr "" + +#: utils/adt/pg_locale.c:1705 +#, c-format +msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." +msgstr "" + +#: utils/adt/pg_locale.c:1749 utils/adt/pg_locale.c:2533 utils/adt/pg_locale.c:2558 +#, c-format +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი \"%s\" ჩáƒáƒ¨áƒ”ნებული მáƒáƒ›áƒ¬áƒáƒ“ებლისთვის" + +#: utils/adt/pg_locale.c:1791 +#, c-format +msgid "could not load locale \"%s\"" +msgstr "ენის ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ: %s" + +#: utils/adt/pg_locale.c:1816 +#, c-format +msgid "could not get collation version for locale \"%s\": error code %lu" +msgstr "" + +#: utils/adt/pg_locale.c:1872 utils/adt/pg_locale.c:1885 +#, c-format +msgid "could not convert string to UTF-16: error code %lu" +msgstr "" + +#: utils/adt/pg_locale.c:1897 +#, c-format +msgid "could not compare Unicode strings: %m" +msgstr "უნიკáƒáƒ“ის სტრიქáƒáƒœáƒ”ბის შედáƒáƒ áƒ”ბრშეუძლებელიáƒ: %m" + +#: utils/adt/pg_locale.c:2071 +#, c-format +msgid "collation failed: %s" +msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" + +#: utils/adt/pg_locale.c:2290 utils/adt/pg_locale.c:2322 +#, c-format +msgid "sort key generation failed: %s" +msgstr "დáƒáƒšáƒáƒ’ების გáƒáƒ¡áƒáƒ¦áƒ”ბის გენერáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" + +#: utils/adt/pg_locale.c:2612 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "ლáƒáƒ™áƒáƒšáƒ˜áƒ“áƒáƒœ \"%s\" ენის მიღების შეცდáƒáƒ›áƒ: %s" + +#: utils/adt/pg_locale.c:2633 utils/adt/pg_locale.c:2649 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "" + +#: utils/adt/pg_locale.c:2674 +#, c-format +msgid "encoding \"%s\" not supported by ICU" +msgstr "კáƒáƒ“ირებრ\"%s\" ICU-ის მიერ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: utils/adt/pg_locale.c:2681 +#, c-format +msgid "could not open ICU converter for encoding \"%s\": %s" +msgstr "შეცდáƒáƒ›áƒ ICU გáƒáƒ áƒ“áƒáƒ›áƒ¥áƒ›áƒœáƒ”ლის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡áƒáƒ¡ კáƒáƒ“ირებისთვის \"%s\": %s" + +#: utils/adt/pg_locale.c:2699 utils/adt/pg_locale.c:2718 utils/adt/pg_locale.c:2774 utils/adt/pg_locale.c:2785 +#, c-format +msgid "%s failed: %s" +msgstr "%s ვერ მáƒáƒ®áƒ”რხდáƒ: %s" + +#: utils/adt/pg_locale.c:2960 +#, c-format +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "მდებáƒáƒ áƒ”áƒáƒ‘ის კáƒáƒ“ის \"%s\" ენის ჭდეში (%s) გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: utils/adt/pg_locale.c:3001 +#, c-format +msgid "could not get language from ICU locale \"%s\": %s" +msgstr "'ICU' ლáƒáƒ™áƒáƒšáƒ˜áƒ“áƒáƒœ \"%s\" ენის მიღების შეცდáƒáƒ›áƒ: %s" + +#: utils/adt/pg_locale.c:3003 utils/adt/pg_locale.c:3032 +#, c-format +msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." +msgstr "ICU ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბის გáƒáƒ¡áƒáƒ—იშáƒáƒ“ პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" დáƒáƒáƒ§áƒ”ნეთ მნიშვნელáƒáƒ‘áƒáƒ–ე \"%s\"." + +#: utils/adt/pg_locale.c:3030 +#, c-format +msgid "ICU locale \"%s\" has unknown language \"%s\"" +msgstr "ICU ლáƒáƒ™áƒáƒšáƒ¡ \"%s\" გáƒáƒáƒ©áƒœáƒ˜áƒ უცნáƒáƒ‘ი ენრ\"%s\"" + +#: utils/adt/pg_locale.c:3181 +#, c-format +msgid "invalid multibyte character for locale" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მრáƒáƒ•áƒáƒšáƒ‘áƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ სიმბáƒáƒšáƒ ლáƒáƒ™áƒáƒšáƒ˜áƒ¡áƒ—ვის" + +#: utils/adt/pg_locale.c:3182 +#, c-format +msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." +msgstr "" + +#: utils/adt/pg_lsn.c:262 +#, c-format +msgid "cannot add NaN to pg_lsn" +msgstr "pg_lsn-ში NaN-ის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ" + +#: utils/adt/pg_lsn.c:296 +#, c-format +msgid "cannot subtract NaN from pg_lsn" +msgstr "pg_lsn-დáƒáƒœ NaN-ის გáƒáƒ›áƒáƒ™áƒšáƒ”ბრშეუძლებელიáƒ" + +#: utils/adt/pg_upgrade_support.c:39 +#, c-format +msgid "function can only be called when server is in binary upgrade mode" +msgstr "" + +#: utils/adt/pgstatfuncs.c:252 +#, c-format +msgid "invalid command name: \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბრძáƒáƒœáƒ”ბის სáƒáƒ®áƒ”ლი: \"%s\"" + +#: utils/adt/pgstatfuncs.c:1739 +#, c-format +msgid "unrecognized reset target: \"%s\"" +msgstr "მáƒáƒ—ხáƒáƒ•ნილირუცნáƒáƒ‘ი მთვლელის გáƒáƒœáƒ£áƒšáƒ”ბáƒ: %s" + +#: utils/adt/pgstatfuncs.c:1740 +#, c-format +msgid "Target must be \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"recovery_prefetch\", \"slru\", or \"wal\"." +msgstr "სáƒáƒ›áƒ˜áƒ–ნე უნდრიყáƒáƒ¡ ერთ-ერთი სიიდáƒáƒœ: \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"recovery_prefetch\", \"slru\", áƒáƒœ \"wal\"." + +#: utils/adt/pgstatfuncs.c:1822 +#, c-format +msgid "invalid subscription OID %u" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ›áƒáƒ¬áƒ”რის OID %u" + +#: utils/adt/pseudorandomfuncs.c:69 +#, c-format +msgid "setseed parameter %g is out of allowed range [-1,1]" +msgstr "" + +#: utils/adt/pseudotypes.c:55 utils/adt/pseudotypes.c:89 +#, c-format +msgid "cannot display a value of type %s" +msgstr "ტიპის (%s) მნიშვნელáƒáƒ‘ის ჩვენების შეცდáƒáƒ›áƒ" + +#: utils/adt/pseudotypes.c:307 +#, c-format +msgid "cannot accept a value of a shell type" +msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ ტიპის მნიშვნელáƒáƒ‘ის მიღებრშეუძლებელიáƒ" + +#: utils/adt/pseudotypes.c:317 +#, c-format +msgid "cannot display a value of a shell type" +msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ ტიპის მნიშვნელáƒáƒ‘ის ჩვენებრშეუძლებელიáƒ" + +#: utils/adt/rangetypes.c:422 +#, c-format +msgid "range constructor flags argument must not be null" +msgstr "" + +#: utils/adt/rangetypes.c:1021 +#, c-format +msgid "result of range difference would not be contiguous" +msgstr "" + +#: utils/adt/rangetypes.c:1082 +#, c-format +msgid "result of range union would not be contiguous" +msgstr "" + +#: utils/adt/rangetypes.c:1757 +#, c-format +msgid "range lower bound must be less than or equal to range upper bound" +msgstr "" + +#: utils/adt/rangetypes.c:2256 utils/adt/rangetypes.c:2269 utils/adt/rangetypes.c:2283 +#, c-format +msgid "invalid range bound flags" +msgstr "" + +#: utils/adt/rangetypes.c:2257 utils/adt/rangetypes.c:2270 utils/adt/rangetypes.c:2284 +#, c-format +msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." +msgstr "სწáƒáƒ áƒ˜ მნიშვნელáƒáƒ‘ებირ\"[]\", \"[)\", \"(]\" დრ\"()\"." + +#: utils/adt/rangetypes.c:2352 utils/adt/rangetypes.c:2369 utils/adt/rangetypes.c:2384 utils/adt/rangetypes.c:2404 utils/adt/rangetypes.c:2415 utils/adt/rangetypes.c:2462 utils/adt/rangetypes.c:2470 +#, c-format +msgid "malformed range literal: \"%s\"" +msgstr "დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სტრიქáƒáƒœáƒ˜: %s" + +#: utils/adt/rangetypes.c:2354 +#, c-format +msgid "Junk after \"empty\" key word." +msgstr "ნáƒáƒ’áƒáƒ•ი სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ სიტყვრ\"empty\"-ის შემდეგ." + +#: utils/adt/rangetypes.c:2371 +#, c-format +msgid "Missing left parenthesis or bracket." +msgstr "áƒáƒ™áƒšáƒ˜áƒ მáƒáƒ áƒªáƒ®áƒ”ნრფრჩხილი áƒáƒœ მრგვáƒáƒšáƒ˜ ფრჩხილი." + +#: utils/adt/rangetypes.c:2386 +#, c-format +msgid "Missing comma after lower bound." +msgstr "ქვედრზღვáƒáƒ áƒ˜áƒ¡ შემდეგ მძიმე áƒáƒ™áƒšáƒ˜áƒ." + +#: utils/adt/rangetypes.c:2406 +#, c-format +msgid "Too many commas." +msgstr "ძáƒáƒšáƒ˜áƒáƒœ ბევრი მძიმე." + +#: utils/adt/rangetypes.c:2417 +#, c-format +msgid "Junk after right parenthesis or bracket." +msgstr "ნáƒáƒ’áƒáƒ•ი მáƒáƒ áƒ¯áƒ•ენრფრჩხილის áƒáƒœ მრგვáƒáƒšáƒ˜ ფრჩხილის შემდეგ." + +#: utils/adt/regexp.c:304 utils/adt/regexp.c:1996 utils/adt/varlena.c:4273 +#, c-format +msgid "regular expression failed: %s" +msgstr "რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#: utils/adt/regexp.c:445 utils/adt/regexp.c:680 +#, c-format +msgid "invalid regular expression option: \"%.*s\"" +msgstr "რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი: \"%.*s\"" + +#: utils/adt/regexp.c:682 +#, c-format +msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." +msgstr "" + +#: utils/adt/regexp.c:716 utils/adt/regexp.c:725 utils/adt/regexp.c:1082 utils/adt/regexp.c:1146 utils/adt/regexp.c:1155 utils/adt/regexp.c:1164 utils/adt/regexp.c:1173 utils/adt/regexp.c:1853 utils/adt/regexp.c:1862 utils/adt/regexp.c:1871 utils/misc/guc.c:6776 utils/misc/guc.c:6810 +#, c-format +msgid "invalid value for parameter \"%s\": %d" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რპáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\": %d" + +#: utils/adt/regexp.c:936 +#, c-format +msgid "SQL regular expression may not contain more than two escape-double-quote separators" +msgstr "" + +#. translator: %s is a SQL function name +#: utils/adt/regexp.c:1093 utils/adt/regexp.c:1184 utils/adt/regexp.c:1271 utils/adt/regexp.c:1310 utils/adt/regexp.c:1698 utils/adt/regexp.c:1753 utils/adt/regexp.c:1882 +#, c-format +msgid "%s does not support the \"global\" option" +msgstr "%s-ს პáƒáƒ áƒáƒ›áƒ”ტრის \"global\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: utils/adt/regexp.c:1312 +#, c-format +msgid "Use the regexp_matches function instead." +msgstr "სáƒáƒ›áƒáƒ’იერáƒáƒ“ ფუნქცირregexp_matches გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." + +#: utils/adt/regexp.c:1500 +#, c-format +msgid "too many regular expression matches" +msgstr "რეგულáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ძáƒáƒšáƒ˜áƒáƒœ ბევრი დáƒáƒ›áƒ—ხვევáƒ" + +#: utils/adt/regproc.c:104 +#, c-format +msgid "more than one function named \"%s\"" +msgstr "ერთზე მეტი ფუნქცირსáƒáƒ®áƒ”ლწáƒáƒ“ებით \"%s\"" + +#: utils/adt/regproc.c:513 +#, c-format +msgid "more than one operator named %s" +msgstr "ერთზე მეტი áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜, სáƒáƒ®áƒ”ლáƒáƒ“ %s" + +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10424 utils/adt/ruleutils.c:10637 +#, c-format +msgid "too many arguments" +msgstr "მეტისმეტáƒáƒ“ ბევრი áƒáƒ áƒ’უმენტი" + +#: utils/adt/regproc.c:676 +#, c-format +msgid "Provide two argument types for operator." +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡áƒ—ვის áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტის ტიპი მიáƒáƒ¬áƒáƒ“ეთ." + +#: utils/adt/regproc.c:1564 utils/adt/regproc.c:1681 utils/adt/regproc.c:1810 utils/adt/regproc.c:1815 utils/adt/varlena.c:3413 utils/adt/varlena.c:3418 +#, c-format +msgid "invalid name syntax" +msgstr "სáƒáƒ®áƒ”ლის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სინტáƒáƒ¥áƒ¡áƒ˜" + +#: utils/adt/regproc.c:1924 +#, c-format +msgid "expected a left parenthesis" +msgstr "მáƒáƒ•ელáƒáƒ“ი მáƒáƒ áƒªáƒ®áƒ”ნრფრჩხილს" + +#: utils/adt/regproc.c:1942 +#, c-format +msgid "expected a right parenthesis" +msgstr "მáƒáƒ•ელáƒáƒ“ი მáƒáƒ áƒ¯áƒ•ენრფრჩხილს" + +#: utils/adt/regproc.c:1961 +#, c-format +msgid "expected a type name" +msgstr "მáƒáƒ•ელáƒáƒ“ი ტიპის სáƒáƒ®áƒ”ლს" + +#: utils/adt/regproc.c:1993 +#, c-format +msgid "improper type name" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპის სáƒáƒ®áƒ”ლი" + +#: utils/adt/ri_triggers.c:303 utils/adt/ri_triggers.c:1616 utils/adt/ri_triggers.c:2601 +#, c-format +msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" +msgstr "" + +#: utils/adt/ri_triggers.c:306 utils/adt/ri_triggers.c:1619 +#, c-format +msgid "MATCH FULL does not allow mixing of null and nonnull key values." +msgstr "" + +#: utils/adt/ri_triggers.c:2036 +#, c-format +msgid "function \"%s\" must be fired for INSERT" +msgstr "\"INSERT\"-ისთვის სáƒáƒ­áƒ˜áƒ áƒáƒ %s ფუნქციის გáƒáƒ¨áƒ•ებáƒ" + +#: utils/adt/ri_triggers.c:2042 +#, c-format +msgid "function \"%s\" must be fired for UPDATE" +msgstr "\"UPDATE\"-ისთვის სáƒáƒ­áƒ˜áƒ áƒáƒ %s ფუნქციის გáƒáƒ¨áƒ•ებáƒ" + +#: utils/adt/ri_triggers.c:2048 +#, c-format +msgid "function \"%s\" must be fired for DELETE" +msgstr "\"DELETE\"-ისთვის სáƒáƒ­áƒ˜áƒ áƒáƒ %s ფუნქციის გáƒáƒ¨áƒ•ებáƒ" + +#: utils/adt/ri_triggers.c:2071 +#, c-format +msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" +msgstr "" + +#: utils/adt/ri_triggers.c:2073 +#, c-format +msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." +msgstr "" + +#: utils/adt/ri_triggers.c:2426 +#, c-format +msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" +msgstr "" + +#: utils/adt/ri_triggers.c:2430 +#, c-format +msgid "This is most likely due to a rule having rewritten the query." +msgstr "დიდი შáƒáƒœáƒ¡áƒ˜áƒ, ეს გáƒáƒ›áƒáƒ˜áƒ¬áƒ•ირწესმáƒ, რáƒáƒ›áƒ”ლმáƒáƒª მáƒáƒ—ხáƒáƒ•ნრთáƒáƒ•იდáƒáƒœ დáƒáƒ¬áƒ”რáƒ." + +#: utils/adt/ri_triggers.c:2591 +#, c-format +msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" +msgstr "" + +#: utils/adt/ri_triggers.c:2594 utils/adt/ri_triggers.c:2619 +#, c-format +msgid "Key (%s)=(%s) is still referenced from table \"%s\"." +msgstr "" + +#: utils/adt/ri_triggers.c:2605 +#, c-format +msgid "Key (%s)=(%s) is not present in table \"%s\"." +msgstr "" + +#: utils/adt/ri_triggers.c:2608 +#, c-format +msgid "Key is not present in table \"%s\"." +msgstr "ცხრილში \"%s\" გáƒáƒ¡áƒáƒ¦áƒ”ბი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს." + +#: utils/adt/ri_triggers.c:2614 +#, c-format +msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" +msgstr "" + +#: utils/adt/ri_triggers.c:2622 +#, c-format +msgid "Key is still referenced from table \"%s\"." +msgstr "" + +#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:509 +#, c-format +msgid "input of anonymous composite types is not implemented" +msgstr "" + +#: utils/adt/rowtypes.c:158 utils/adt/rowtypes.c:190 utils/adt/rowtypes.c:216 utils/adt/rowtypes.c:227 utils/adt/rowtypes.c:285 utils/adt/rowtypes.c:296 +#, c-format +msgid "malformed record literal: \"%s\"" +msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სტრიქáƒáƒœáƒ˜: %s" + +#: utils/adt/rowtypes.c:159 +#, c-format +msgid "Missing left parenthesis." +msgstr "áƒáƒ™áƒšáƒ˜áƒ მáƒáƒ áƒªáƒ®áƒ”ნრფრჩხილი." + +#: utils/adt/rowtypes.c:191 +#, c-format +msgid "Too few columns." +msgstr "მეტისმეტáƒáƒ“ ცáƒáƒ¢áƒ სვეტი." + +#: utils/adt/rowtypes.c:286 +#, c-format +msgid "Too many columns." +msgstr "მეტისმეტáƒáƒ“ ბევრი სვეტი." + +#: utils/adt/rowtypes.c:297 +#, c-format +msgid "Junk after right parenthesis." +msgstr "ნáƒáƒ’áƒáƒ•ი მáƒáƒ áƒ¯áƒ•ენრდáƒáƒ›áƒ®áƒ£áƒ áƒáƒ•ი ფრჩხილის შემდეგ." + +#: utils/adt/rowtypes.c:558 +#, c-format +msgid "wrong number of columns: %d, expected %d" +msgstr "სვეტების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ: %d, მáƒáƒ•ელáƒáƒ“ი %d" + +#: utils/adt/rowtypes.c:599 +#, c-format +msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" +msgstr "" + +#: utils/adt/rowtypes.c:660 +#, c-format +msgid "improper binary format in record column %d" +msgstr "" + +#: utils/adt/rowtypes.c:949 utils/adt/rowtypes.c:1195 utils/adt/rowtypes.c:1453 utils/adt/rowtypes.c:1699 +#, c-format +msgid "cannot compare dissimilar column types %s and %s at record column %d" +msgstr "" + +#: utils/adt/rowtypes.c:1040 utils/adt/rowtypes.c:1265 utils/adt/rowtypes.c:1550 utils/adt/rowtypes.c:1735 +#, c-format +msgid "cannot compare record types with different numbers of columns" +msgstr "" + +#: utils/adt/ruleutils.c:2693 +#, c-format +msgid "input is a query, not an expression" +msgstr "შეყვáƒáƒœáƒ áƒáƒ áƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•ნრდრáƒáƒ áƒ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ" + +#: utils/adt/ruleutils.c:2705 +#, c-format +msgid "expression contains variables of more than one relation" +msgstr "" + +#: utils/adt/ruleutils.c:2712 +#, c-format +msgid "expression contains variables" +msgstr "გáƒáƒ›áƒáƒ®áƒáƒ¢áƒ£áƒšáƒ”ბრშეიცáƒáƒ•ს ცვლáƒáƒ“ებს" + +#: utils/adt/ruleutils.c:5242 +#, c-format +msgid "rule \"%s\" has unsupported event type %d" +msgstr "წესს \"%s\" გáƒáƒáƒ©áƒœáƒ˜áƒ მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი მáƒáƒ•ლენის ტიპი %d" + +#: utils/adt/timestamp.c:128 +#, c-format +msgid "TIMESTAMP(%d)%s precision must not be negative" +msgstr "TIMESTAMP(%d)%s-ის სიზუსტე უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ— áƒáƒ  უნდრიყáƒáƒ¡" + +#: utils/adt/timestamp.c:134 +#, c-format +msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" +msgstr "" + +#: utils/adt/timestamp.c:394 +#, c-format +msgid "timestamp(%d) precision must be between %d and %d" +msgstr "" + +#: utils/adt/timestamp.c:512 +#, c-format +msgid "Numeric time zones must have \"-\" or \"+\" as first character." +msgstr "" + +#: utils/adt/timestamp.c:524 +#, c-format +msgid "numeric time zone \"%s\" out of range" +msgstr "რიცხვითი დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლი \"%s\" დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/timestamp.c:625 utils/adt/timestamp.c:635 utils/adt/timestamp.c:643 +#, c-format +msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" +msgstr "დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: %d-%02d-%02d %d:%02d:%02g" + +#: utils/adt/timestamp.c:744 +#, c-format +msgid "timestamp cannot be NaN" +msgstr "დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜ NaN ვერ იქნებáƒ" + +#: utils/adt/timestamp.c:762 utils/adt/timestamp.c:774 +#, c-format +msgid "timestamp out of range: \"%g\"" +msgstr "დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: \"%g\"" + +#: utils/adt/timestamp.c:957 utils/adt/timestamp.c:1516 utils/adt/timestamp.c:1526 utils/adt/timestamp.c:1587 utils/adt/timestamp.c:2807 utils/adt/timestamp.c:2816 utils/adt/timestamp.c:2831 utils/adt/timestamp.c:2905 utils/adt/timestamp.c:2922 utils/adt/timestamp.c:2979 utils/adt/timestamp.c:3022 utils/adt/timestamp.c:3400 utils/adt/timestamp.c:3458 utils/adt/timestamp.c:3481 utils/adt/timestamp.c:3490 utils/adt/timestamp.c:3514 utils/adt/timestamp.c:3537 +#: utils/adt/timestamp.c:3546 utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3782 utils/adt/timestamp.c:4274 utils/adt/timestamp.c:4283 utils/adt/timestamp.c:4375 utils/adt/timestamp.c:4422 utils/adt/timestamp.c:4431 utils/adt/timestamp.c:4527 utils/adt/timestamp.c:4580 utils/adt/timestamp.c:4590 utils/adt/timestamp.c:4785 utils/adt/timestamp.c:4795 utils/adt/timestamp.c:5097 +#, c-format +msgid "interval out of range" +msgstr "ინტერვáƒáƒšáƒ˜ სáƒáƒ–ღვრებს გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/timestamp.c:1094 utils/adt/timestamp.c:1127 +#, c-format +msgid "invalid INTERVAL type modifier" +msgstr "\"INTERVAL\" ტიპის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ˜" + +#: utils/adt/timestamp.c:1110 +#, c-format +msgid "INTERVAL(%d) precision must not be negative" +msgstr "INTERVAL(%d)-ის სიზუსტე უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ— áƒáƒ  უნდრიყáƒáƒ¡" + +#: utils/adt/timestamp.c:1116 +#, c-format +msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" +msgstr "" + +#: utils/adt/timestamp.c:1506 +#, c-format +msgid "interval(%d) precision must be between %d and %d" +msgstr "" + +#: utils/adt/timestamp.c:4189 utils/adt/timestamp.c:4226 +#, c-format +msgid "interval out of range." +msgstr "ინტერვáƒáƒšáƒ˜ დáƒáƒ¨áƒ•ებული შუáƒáƒšáƒ”დის გáƒáƒ áƒ”თáƒáƒ." + +#: utils/adt/timestamp.c:4564 utils/adt/timestamp.c:4769 +#, c-format +msgid "origin out of range" +msgstr "წყáƒáƒ áƒ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/timestamp.c:4569 utils/adt/timestamp.c:4774 +#, c-format +msgid "timestamps cannot be binned into infinite intervals" +msgstr "" + +#: utils/adt/timestamp.c:4574 utils/adt/timestamp.c:4779 +#, c-format +msgid "timestamps cannot be binned into intervals containing months or years" +msgstr "" + +#: utils/adt/timestamp.c:4585 utils/adt/timestamp.c:4790 +#, c-format +msgid "stride must be greater than zero" +msgstr "ბიჯი ნულზე მეტი უნდრიყáƒáƒ¡" + +#: utils/adt/timestamp.c:5091 +#, c-format +msgid "Months usually have fractional weeks." +msgstr "თვეში რáƒáƒ’áƒáƒ áƒª წესი გáƒáƒ§áƒáƒ¤áƒáƒ“ი რáƒáƒáƒ“ენáƒáƒ‘ის კვირებიáƒ." + +#: utils/adt/timestamp.c:6551 utils/adt/timestamp.c:6637 +#, c-format +msgid "step size cannot be infinite" +msgstr "ბიჯის ზáƒáƒ›áƒ უსáƒáƒ¡áƒ áƒ£áƒšáƒ ვერ იქნებáƒ" + +#: utils/adt/trigfuncs.c:41 +#, c-format +msgid "suppress_redundant_updates_trigger: must be called as trigger" +msgstr "suppress_redundant_updates_trigger: უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ—, რáƒáƒ’áƒáƒ áƒª ტრიგერი" + +#: utils/adt/trigfuncs.c:47 +#, c-format +msgid "suppress_redundant_updates_trigger: must be called on update" +msgstr "suppress_redundant_updates_trigger: უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ— გáƒáƒœáƒáƒ®áƒšáƒ”ბისáƒáƒ¡" + +#: utils/adt/trigfuncs.c:53 +#, c-format +msgid "suppress_redundant_updates_trigger: must be called before update" +msgstr "suppress_redundant_updates_trigger: უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ— გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ›áƒ“ე" + +#: utils/adt/trigfuncs.c:59 +#, c-format +msgid "suppress_redundant_updates_trigger: must be called for each row" +msgstr "suppress_redundant_updates_trigger: უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ— თითáƒáƒ”ული მწკრივისთვის" + +#: utils/adt/tsquery.c:210 utils/adt/tsquery_op.c:125 +#, c-format +msgid "distance in phrase operator must be an integer value between zero and %d inclusive" +msgstr "" + +#: utils/adt/tsquery.c:344 +#, c-format +msgid "no operand in tsquery: \"%s\"" +msgstr "tsquery-ში áƒáƒžáƒ”რáƒáƒœáƒ“ი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" + +#: utils/adt/tsquery.c:554 +#, c-format +msgid "value is too big in tsquery: \"%s\"" +msgstr "tsquery-ის მნიშვნელáƒáƒ‘რძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ: %s" + +#: utils/adt/tsquery.c:559 +#, c-format +msgid "operand is too long in tsquery: \"%s\"" +msgstr "tsquery-ში áƒáƒžáƒ”რáƒáƒœáƒ“ი ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ: %s" + +#: utils/adt/tsquery.c:587 +#, c-format +msgid "word is too long in tsquery: \"%s\"" +msgstr "tsquery-ში სიტყვრძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ: %s" + +#: utils/adt/tsquery.c:713 utils/adt/tsvector_parser.c:147 +#, c-format +msgid "syntax error in tsquery: \"%s\"" +msgstr "სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ შეცდáƒáƒ›áƒ tsquery-ში: \"%s\"" + +#: utils/adt/tsquery.c:879 +#, c-format +msgid "text-search query doesn't contain lexemes: \"%s\"" +msgstr "" + +#: utils/adt/tsquery.c:890 utils/adt/tsquery_util.c:376 +#, c-format +msgid "tsquery is too large" +msgstr "tsquery ძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ" + +#: utils/adt/tsquery_cleanup.c:409 +#, c-format +msgid "text-search query contains only stop words or doesn't contain lexemes, ignored" +msgstr "" + +#: utils/adt/tsquery_rewrite.c:321 +#, c-format +msgid "ts_rewrite query must return two tsquery columns" +msgstr "ts_rewrite მáƒáƒ—ხáƒáƒ•ნáƒáƒ› áƒáƒ áƒ˜ tsquery სვეტი უნდრდáƒáƒáƒ‘რუნáƒáƒ¡" + +#: utils/adt/tsrank.c:412 +#, c-format +msgid "array of weight must be one-dimensional" +msgstr "წáƒáƒœáƒ˜áƒ¡ მáƒáƒ¡áƒ˜áƒ•ი ერთგáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœáƒ˜ უნდრიყáƒáƒ¡" + +#: utils/adt/tsrank.c:417 +#, c-format +msgid "array of weight is too short" +msgstr "წáƒáƒœáƒ˜áƒ¡ მáƒáƒ¡áƒ˜áƒ•ი ძáƒáƒšáƒ˜áƒáƒœ მáƒáƒ™áƒšáƒ”áƒ" + +#: utils/adt/tsrank.c:422 +#, c-format +msgid "array of weight must not contain nulls" +msgstr "წáƒáƒœáƒ˜áƒ¡ მáƒáƒ¡áƒ˜áƒ•ი áƒáƒ  შეიძლებáƒ, ნულáƒáƒ•áƒáƒœ მნიშვნელáƒáƒ‘ებს შეიცáƒáƒ•დეს" + +#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:871 +#, c-format +msgid "weight out of range" +msgstr "სიმძიმე დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/tsvector.c:216 +#, c-format +msgid "word is too long (%ld bytes, max %ld bytes)" +msgstr "სიტყვრმეტისმეტáƒáƒ“ მáƒáƒ™áƒšáƒ”რ(%ld ბáƒáƒ˜áƒ¢áƒ˜, მáƒáƒ¥áƒ¡ %ld ბáƒáƒ˜áƒ¢áƒ˜)" + +#: utils/adt/tsvector.c:223 +#, c-format +msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" +msgstr "" + +#: utils/adt/tsvector_op.c:771 +#, c-format +msgid "lexeme array may not contain nulls" +msgstr "ლექსემის მáƒáƒ¡áƒ˜áƒ•ი áƒáƒ  შეიძლებáƒ, ნულáƒáƒ•áƒáƒœ მნიშვნელáƒáƒ‘ებს შეიცáƒáƒ•დეს" + +#: utils/adt/tsvector_op.c:776 +#, c-format +msgid "lexeme array may not contain empty strings" +msgstr "ლექსემის მáƒáƒ¡áƒ˜áƒ•ი áƒáƒ  შეიძლებáƒ, ცáƒáƒ áƒ˜áƒ”ლ სტრიქáƒáƒœáƒ”ბს შეიცáƒáƒ•დეს" + +#: utils/adt/tsvector_op.c:845 +#, c-format +msgid "weight array may not contain nulls" +msgstr "წáƒáƒœáƒ”ბის მáƒáƒ¡áƒ˜áƒ•ი áƒáƒ  შეიძლებრნულáƒáƒ•áƒáƒœ მნიშვნელáƒáƒ‘ებს შეიცáƒáƒ•დეს" + +#: utils/adt/tsvector_op.c:869 +#, c-format +msgid "unrecognized weight: \"%c\"" +msgstr "უცნáƒáƒ‘ი სიმძიმე: \"%c\"" + +#: utils/adt/tsvector_op.c:2599 +#, c-format +msgid "ts_stat query must return one tsvector column" +msgstr "მáƒáƒ—ხáƒáƒ•ნáƒáƒ› ts_stat ერთი tsvector სვეტი უნდრდáƒáƒáƒ‘რუნáƒáƒ¡" + +#: utils/adt/tsvector_op.c:2788 +#, c-format +msgid "tsvector column \"%s\" does not exist" +msgstr "tsvector სვეტი %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: utils/adt/tsvector_op.c:2795 +#, c-format +msgid "column \"%s\" is not of tsvector type" +msgstr "სვეტი \"%s\" tsvector-ის ტიპის áƒáƒ áƒáƒ" + +#: utils/adt/tsvector_op.c:2807 +#, c-format +msgid "configuration column \"%s\" does not exist" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: utils/adt/tsvector_op.c:2813 +#, c-format +msgid "column \"%s\" is not of regconfig type" +msgstr "სვეტი regconfig ტიპის áƒáƒ áƒáƒ: %s" + +#: utils/adt/tsvector_op.c:2820 +#, c-format +msgid "configuration column \"%s\" must not be null" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტ %s ნულáƒáƒ•áƒáƒœáƒ˜ áƒáƒ  უნდრიყáƒáƒ¡" + +#: utils/adt/tsvector_op.c:2833 +#, c-format +msgid "text search configuration name \"%s\" must be schema-qualified" +msgstr "" + +#: utils/adt/tsvector_op.c:2858 +#, c-format +msgid "column \"%s\" is not of a character type" +msgstr "სვეტი სტრიქáƒáƒœáƒ˜áƒ¡ ტიპის áƒáƒ áƒáƒ: %s" + +#: utils/adt/tsvector_parser.c:148 +#, c-format +msgid "syntax error in tsvector: \"%s\"" +msgstr "სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ შეცდáƒáƒ›áƒ tsvector-ში: \"%s\"" + +#: utils/adt/tsvector_parser.c:221 +#, c-format +msgid "there is no escaped character: \"%s\"" +msgstr "სპეციáƒáƒšáƒ£áƒ áƒ˜ სიმბáƒáƒšáƒ \"%s\" ვერ ვიპáƒáƒ•ე" + +#: utils/adt/tsvector_parser.c:339 +#, c-format +msgid "wrong position info in tsvector: \"%s\"" +msgstr "" + +#: utils/adt/uuid.c:418 +#, c-format +msgid "could not generate random values" +msgstr "შემთხვევითი რიცხვების გენერáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: utils/adt/varbit.c:110 utils/adt/varchar.c:53 +#, c-format +msgid "length for type %s must be at least 1" +msgstr "ტიპის (%s) სიგრძე 1 მáƒáƒ˜áƒœáƒª უნდრიყáƒáƒ¡" + +#: utils/adt/varbit.c:115 utils/adt/varchar.c:57 +#, c-format +msgid "length for type %s cannot exceed %d" +msgstr "ტიპის (%s) სიგრძე %d-ზე მეტი ვერ იქნებáƒ" + +#: utils/adt/varbit.c:198 utils/adt/varbit.c:499 utils/adt/varbit.c:994 +#, c-format +msgid "bit string length exceeds the maximum allowed (%d)" +msgstr "" + +#: utils/adt/varbit.c:212 utils/adt/varbit.c:356 utils/adt/varbit.c:406 +#, c-format +msgid "bit string length %d does not match type bit(%d)" +msgstr "" + +#: utils/adt/varbit.c:234 utils/adt/varbit.c:535 +#, c-format +msgid "\"%.*s\" is not a valid binary digit" +msgstr "\"%.*s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒáƒ‘ითი რიცხვიáƒ" + +#: utils/adt/varbit.c:259 utils/adt/varbit.c:560 +#, c-format +msgid "\"%.*s\" is not a valid hexadecimal digit" +msgstr "\"%.*s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ თექვსმეტáƒáƒ‘ითი რიცხვიáƒ" + +#: utils/adt/varbit.c:347 utils/adt/varbit.c:652 +#, c-format +msgid "invalid length in external bit string" +msgstr "გáƒáƒ áƒ” ბიტური სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე" + +#: utils/adt/varbit.c:513 utils/adt/varbit.c:661 utils/adt/varbit.c:757 +#, c-format +msgid "bit string too long for type bit varying(%d)" +msgstr "" + +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:911 utils/adt/varlena.c:974 utils/adt/varlena.c:1131 utils/adt/varlena.c:3055 utils/adt/varlena.c:3133 +#, c-format +msgid "negative substring length not allowed" +msgstr "ქვესტრიქáƒáƒœáƒ˜áƒ¡ სიგრძე უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ—ი áƒáƒ  შეიძლებრიყáƒáƒ¡" + +#: utils/adt/varbit.c:1261 +#, c-format +msgid "cannot AND bit strings of different sizes" +msgstr "გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ებული სიგრძის სტრიქáƒáƒœáƒ”ბზე AND áƒáƒžáƒ”რáƒáƒªáƒ˜áƒáƒ¡ ვერ გáƒáƒœáƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებთ" + +#: utils/adt/varbit.c:1302 +#, c-format +msgid "cannot OR bit strings of different sizes" +msgstr "გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ებული სიგრძის სტრიქáƒáƒœáƒ”ბზე OR áƒáƒžáƒ”რáƒáƒªáƒ˜áƒáƒ¡ ვერ გáƒáƒœáƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებთ" + +#: utils/adt/varbit.c:1342 +#, c-format +msgid "cannot XOR bit strings of different sizes" +msgstr "გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ებული სიგრძის სტრიქáƒáƒœáƒ”ბზე XOR áƒáƒžáƒ”რáƒáƒªáƒ˜áƒáƒ¡ ვერ გáƒáƒœáƒáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებთ" + +#: utils/adt/varbit.c:1824 utils/adt/varbit.c:1882 +#, c-format +msgid "bit index %d out of valid range (0..%d)" +msgstr "" + +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3337 +#, c-format +msgid "new bit must be 0 or 1" +msgstr "áƒáƒ®áƒáƒšáƒ˜ ბიტი უნდრიყáƒáƒ¡ 0 áƒáƒœ 1" + +#: utils/adt/varchar.c:161 utils/adt/varchar.c:312 +#, c-format +msgid "value too long for type character(%d)" +msgstr "მნიშვნელáƒáƒ‘რსიმბáƒáƒšáƒáƒ¡ ტიპისთვის ძáƒáƒšáƒ˜áƒáƒœ გრძელირ(%d)" + +#: utils/adt/varchar.c:475 utils/adt/varchar.c:639 +#, c-format +msgid "value too long for type character varying(%d)" +msgstr "" + +#: utils/adt/varchar.c:737 utils/adt/varlena.c:1520 +#, c-format +msgid "could not determine which collation to use for string comparison" +msgstr "" + +#: utils/adt/varlena.c:1230 utils/adt/varlena.c:1809 +#, c-format +msgid "nondeterministic collations are not supported for substring searches" +msgstr "" + +#: utils/adt/varlena.c:3221 utils/adt/varlena.c:3288 +#, c-format +msgid "index %d out of valid range, 0..%d" +msgstr "ინდექსი %d დáƒáƒ¡áƒáƒ¨áƒ•ებ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ (0..%d) გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/varlena.c:3252 utils/adt/varlena.c:3324 +#, c-format +msgid "index %lld out of valid range, 0..%lld" +msgstr "ინდექსი %lld დáƒáƒ¡áƒáƒ¨áƒ•ებ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ (0..%lld) გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/varlena.c:4385 +#, c-format +msgid "field position must not be zero" +msgstr "ველის მდებáƒáƒ áƒ”áƒáƒ‘რნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" + +#: utils/adt/varlena.c:5630 +#, c-format +msgid "unterminated format() type specifier" +msgstr "" + +#: utils/adt/varlena.c:5631 utils/adt/varlena.c:5765 utils/adt/varlena.c:5886 +#, c-format +msgid "For a single \"%%\" use \"%%%%\"." +msgstr "ერთი \"%%\"-სთვის გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \"%%%%\"." + +#: utils/adt/varlena.c:5763 utils/adt/varlena.c:5884 +#, c-format +msgid "unrecognized format() type specifier \"%.*s\"" +msgstr "" + +#: utils/adt/varlena.c:5776 utils/adt/varlena.c:5833 +#, c-format +msgid "too few arguments for format()" +msgstr "format()-ის áƒáƒ áƒ’უმენტები სáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒ áƒáƒ" + +#: utils/adt/varlena.c:5929 utils/adt/varlena.c:6111 +#, c-format +msgid "number is out of range" +msgstr "რიცხვი დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ" + +#: utils/adt/varlena.c:5992 utils/adt/varlena.c:6020 +#, c-format +msgid "format specifies argument 0, but arguments are numbered from 1" +msgstr "" + +#: utils/adt/varlena.c:6013 +#, c-format +msgid "width argument position must be ended by \"$\"" +msgstr "" + +#: utils/adt/varlena.c:6058 +#, c-format +msgid "null values cannot be formatted as an SQL identifier" +msgstr "" + +#: utils/adt/varlena.c:6266 +#, c-format +msgid "Unicode normalization can only be performed if server encoding is UTF8" +msgstr "" + +#: utils/adt/varlena.c:6279 +#, c-format +msgid "invalid normalization form: %s" +msgstr "ნáƒáƒ áƒ›áƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒ: %s" + +#: utils/adt/varlena.c:6324 +#, c-format +msgid "Unicode categorization can only be performed if server encoding is UTF8" +msgstr "" + +#: utils/adt/varlena.c:6541 utils/adt/varlena.c:6576 utils/adt/varlena.c:6611 +#, c-format +msgid "invalid Unicode code point: %04X" +msgstr "უნიკáƒáƒ“ის კáƒáƒ“ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წერტილი: %04X" + +#: utils/adt/varlena.c:6641 +#, c-format +msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." +msgstr "" + +#: utils/adt/windowfuncs.c:443 +#, c-format +msgid "argument of ntile must be greater than zero" +msgstr "ntile -ის áƒáƒ áƒ’უმენტი ნულზე მეტი უნდრიყáƒáƒ¡" + +#: utils/adt/windowfuncs.c:707 +#, c-format +msgid "argument of nth_value must be greater than zero" +msgstr "nth_value-ის áƒáƒ áƒ’უმენტი ნულზე მეტი უნდრიყáƒáƒ¡" + +#: utils/adt/xid8funcs.c:124 +#, c-format +msgid "transaction ID %llu is in the future" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID მáƒáƒ›áƒáƒ•áƒáƒšáƒ¨áƒ˜áƒ: %llu" + +#: utils/adt/xid8funcs.c:553 +#, c-format +msgid "invalid external pg_snapshot data" +msgstr "pg_snapshot-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მები" + +#: utils/adt/xml.c:238 +#, c-format +msgid "unsupported XML feature" +msgstr "\"XML\"-ის მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი ფუნქციáƒ" + +#: utils/adt/xml.c:239 +#, c-format +msgid "This functionality requires the server to be built with libxml support." +msgstr "" + +#: utils/adt/xml.c:258 utils/mb/mbutils.c:627 +#, c-format +msgid "invalid encoding name \"%s\"" +msgstr "კáƒáƒ“ირების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\"" + +#: utils/adt/xml.c:506 utils/adt/xml.c:511 +#, c-format +msgid "invalid XML comment" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ XML კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜" + +#: utils/adt/xml.c:691 +#, c-format +msgid "not an XML document" +msgstr "áƒáƒ  áƒáƒ áƒ˜áƒ¡ XML დáƒáƒ™áƒ£áƒ›áƒ”ნტი" + +#: utils/adt/xml.c:987 utils/adt/xml.c:1010 +#, c-format +msgid "invalid XML processing instruction" +msgstr "xml-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ინსტრუქციáƒ" + +#: utils/adt/xml.c:988 +#, c-format +msgid "XML processing instruction target name cannot be \"%s\"." +msgstr "" + +#: utils/adt/xml.c:1011 +#, c-format +msgid "XML processing instruction cannot contain \"?>\"." +msgstr "" + +#: utils/adt/xml.c:1090 +#, c-format +msgid "xmlvalidate is not implemented" +msgstr "xmlvalidate გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: utils/adt/xml.c:1146 +#, c-format +msgid "could not initialize XML library" +msgstr "xml ბიბლიáƒáƒ—ეკის ინიციáƒáƒšáƒ˜áƒ–ებრვერ მáƒáƒ®áƒ”რხდáƒ" + +#: utils/adt/xml.c:1147 +#, c-format +msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." +msgstr "libxml2 áƒáƒ¥áƒ•ს შეუთáƒáƒ•სებელი char ტიპის: ზáƒáƒ›áƒ (char)=%zu, sizeof(xmlChar)=%zu." + +#: utils/adt/xml.c:1233 +#, c-format +msgid "could not set up XML error handler" +msgstr "\"XML\" შეცდáƒáƒ›áƒ”ბის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის მáƒáƒ áƒ’ების შეცდáƒáƒ›áƒ" + +#: utils/adt/xml.c:1234 +#, c-format +msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." +msgstr "" + +#: utils/adt/xml.c:2218 +msgid "Invalid character value." +msgstr "სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნშვნელáƒáƒ‘áƒ." + +#: utils/adt/xml.c:2221 +msgid "Space required." +msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ." + +#: utils/adt/xml.c:2224 +msgid "standalone accepts only 'yes' or 'no'." +msgstr "standalone-ის მნიშვნელáƒáƒ‘რშეიძლებრიყáƒáƒ¡ \"yes\"(დიáƒáƒ®) áƒáƒœ \"no\"(áƒáƒ áƒ)." + +#: utils/adt/xml.c:2227 +msgid "Malformed declaration: missing version." +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ¦áƒ¬áƒ”რáƒ: ვერსირმითითებული áƒáƒ áƒáƒ." + +#: utils/adt/xml.c:2230 +msgid "Missing encoding in text declaration." +msgstr "ტექსტის áƒáƒ¦áƒ¬áƒ”რáƒáƒ¨áƒ˜ კáƒáƒ“ირებრმითითებული áƒáƒ áƒáƒ." + +#: utils/adt/xml.c:2233 +msgid "Parsing XML declaration: '?>' expected." +msgstr "" + +#: utils/adt/xml.c:2236 +#, c-format +msgid "Unrecognized libxml error code: %d." +msgstr "Libxml-ის შეცდáƒáƒ›áƒ˜áƒ¡ უცნáƒáƒ‘ი კáƒáƒ“ი: %d." + +#: utils/adt/xml.c:2490 +#, c-format +msgid "XML does not support infinite date values." +msgstr "XML-ს უსáƒáƒ¡áƒ áƒ£áƒšáƒ თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡ მნიშვნელáƒáƒ‘ების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." + +#: utils/adt/xml.c:2512 utils/adt/xml.c:2539 +#, c-format +msgid "XML does not support infinite timestamp values." +msgstr "XML-ს უსáƒáƒ¡áƒ áƒ£áƒšáƒ დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜áƒ¡ მნიშვნელáƒáƒ‘ების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." + +#: utils/adt/xml.c:2955 +#, c-format +msgid "invalid query" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ—ხáƒáƒ•ნáƒ" + +#: utils/adt/xml.c:3047 +#, c-format +msgid "portal \"%s\" does not return tuples" +msgstr "პáƒáƒ áƒ¢áƒáƒšáƒ˜ \"%s\" კáƒáƒ áƒ¢áƒ”ჟებს áƒáƒ  áƒáƒ‘რუნებს" + +#: utils/adt/xml.c:4299 +#, c-format +msgid "invalid array for XML namespace mapping" +msgstr "" + +#: utils/adt/xml.c:4300 +#, c-format +msgid "The array must be two-dimensional with length of the second axis equal to 2." +msgstr "" + +#: utils/adt/xml.c:4324 +#, c-format +msgid "empty XPath expression" +msgstr "ცáƒáƒ áƒ˜áƒ”ლი XPath გáƒáƒ›áƒáƒ®áƒáƒ¢áƒ£áƒšáƒ”ბáƒ" + +#: utils/adt/xml.c:4376 +#, c-format +msgid "neither namespace name nor URI may be null" +msgstr "სáƒáƒ®áƒ”ლების სივრცის სáƒáƒ®áƒ”ლი დრURI ნულáƒáƒ•áƒáƒœáƒ˜ áƒáƒ  შეიძლებáƒ, იყáƒáƒ¡" + +#: utils/adt/xml.c:4383 +#, c-format +msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" +msgstr "" + +#: utils/adt/xml.c:4726 +#, c-format +msgid "DEFAULT namespace is not supported" +msgstr "სáƒáƒ®áƒ”ლების სივრცე DEFAULT მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: utils/adt/xml.c:4755 +#, c-format +msgid "row path filter must not be empty string" +msgstr "მწკრივის ბილიკის ფილტრი ცáƒáƒ áƒ˜áƒ”ლი სტრიქáƒáƒœáƒ˜ áƒáƒ  შეიძლებრიყáƒáƒ¡" + +#: utils/adt/xml.c:4786 +#, c-format +msgid "column path filter must not be empty string" +msgstr "სვეტის ბილიკის ფილტრი ცáƒáƒ áƒ˜áƒ”ლი სტრიქáƒáƒœáƒ˜ áƒáƒ  შეიძლებრიყáƒáƒ¡" + +#: utils/adt/xml.c:4930 +#, c-format +msgid "more than one value returned by column XPath expression" +msgstr "" + +#: utils/cache/lsyscache.c:1017 +#, c-format +msgid "cast from type %s to type %s does not exist" +msgstr "" + +#: utils/cache/lsyscache.c:2887 utils/cache/lsyscache.c:2920 utils/cache/lsyscache.c:2953 utils/cache/lsyscache.c:2986 +#, c-format +msgid "type %s is only a shell" +msgstr "ტიპი %s ცáƒáƒ áƒ˜áƒ”ლიáƒ" + +#: utils/cache/lsyscache.c:2892 +#, c-format +msgid "no input function available for type %s" +msgstr "ტიპისთვის %s შეყვáƒáƒœáƒ˜áƒ¡ ფუნქცირáƒáƒ  áƒáƒ  áƒáƒ¡áƒ”ბáƒáƒ‘ს" + +#: utils/cache/lsyscache.c:2925 +#, c-format +msgid "no output function available for type %s" +msgstr "ტიპისთვის %s გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფუნქცირáƒáƒ  áƒáƒ  áƒáƒ¡áƒ”ბáƒáƒ‘ს" + +#: utils/cache/partcache.c:216 +#, c-format +msgid "operator class \"%s\" of access method %s is missing support function %d for type %s" +msgstr "" + +#: utils/cache/plancache.c:747 +#, c-format +msgid "cached plan must not change result type" +msgstr "დáƒáƒ™áƒ”შილი გეგმრშედეგის ტიპს áƒáƒ  უნდრცვლიდეს" + +#: utils/cache/relcache.c:3797 +#, c-format +msgid "heap relfilenumber value not set when in binary upgrade mode" +msgstr "heap relfilenumber-ის მნიშვნელáƒáƒ‘რბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის დრáƒáƒ¡ დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: utils/cache/relcache.c:3805 +#, c-format +msgid "unexpected request for new relfilenumber in binary upgrade mode" +msgstr "áƒáƒ®áƒáƒšáƒ˜ relfilenumber-ის მáƒáƒ£áƒšáƒáƒ“ნელი მáƒáƒ—ხáƒáƒ•ნრბინáƒáƒ áƒ£áƒšáƒ˜ გáƒáƒœáƒáƒ®áƒšáƒ”ბის რეჟიმში" + +#: utils/cache/relcache.c:6533 +#, c-format +msgid "could not create relation-cache initialization file \"%s\": %m" +msgstr "" + +#: utils/cache/relcache.c:6535 +#, c-format +msgid "Continuing anyway, but there's something wrong." +msgstr "მáƒáƒ˜áƒœáƒª ვáƒáƒ’რძელებ, მáƒáƒ’რáƒáƒ› რáƒáƒ¦áƒáƒª ცუდი ხდებáƒ." + +#: utils/cache/relcache.c:6865 +#, c-format +msgid "could not remove cache file \"%s\": %m" +msgstr "კეშის ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: utils/cache/relmapper.c:596 +#, c-format +msgid "cannot PREPARE a transaction that modified relation mapping" +msgstr "" + +#: utils/cache/relmapper.c:852 +#, c-format +msgid "relation mapping file \"%s\" contains invalid data" +msgstr "ურთიერთáƒáƒ‘ის მიბმის ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  მáƒáƒœáƒáƒªáƒ”მებს შეიცáƒáƒ•ს" + +#: utils/cache/relmapper.c:862 +#, c-format +msgid "relation mapping file \"%s\" contains incorrect checksum" +msgstr "ურთიერთáƒáƒ‘ის მიბმის ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ¡ შეიცáƒáƒ•ს" + +#: utils/cache/typcache.c:1812 utils/fmgr/funcapi.c:574 +#, c-format +msgid "record type has not been registered" +msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის ტიპი რეგისტრირებული áƒáƒ  áƒáƒ áƒ˜áƒ¡" + +#: utils/error/assert.c:37 +#, c-format +msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" +msgstr "" + +#: utils/error/assert.c:40 +#, c-format +msgid "TRAP: failed Assert(\"%s\"), File: \"%s\", Line: %d, PID: %d\n" +msgstr "ხáƒáƒ¤áƒáƒœáƒ’ი: გáƒáƒ›áƒáƒ—ხáƒáƒ•ის შეცდáƒáƒ›áƒ (\"%s\"), ფáƒáƒ˜áƒšáƒ˜: \"%s\", ხáƒáƒ–ი: %d, PID: %d\n" + +#: utils/error/elog.c:415 +#, c-format +msgid "error occurred before error message processing is available\n" +msgstr "áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირშეცდáƒáƒ›áƒ მáƒáƒœáƒáƒ›áƒ“ე, სáƒáƒœáƒáƒ› შეცდáƒáƒ›áƒ˜áƒ¡ შეტყáƒáƒ‘ინებების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებრხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ გáƒáƒ®áƒ“ებáƒáƒ“áƒ\n" + +#: utils/error/elog.c:2101 +#, c-format +msgid "could not reopen file \"%s\" as stderr: %m" +msgstr "" + +#: utils/error/elog.c:2114 +#, c-format +msgid "could not reopen file \"%s\" as stdout: %m" +msgstr "" + +#: utils/error/elog.c:2150 +#, c-format +msgid "Invalid character" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიმბáƒáƒšáƒ" + +#: utils/error/elog.c:2856 utils/error/elog.c:2883 utils/error/elog.c:2899 +msgid "[unknown]" +msgstr "[უცნáƒáƒ‘ი]" + +#: utils/error/elog.c:3169 utils/error/elog.c:3493 utils/error/elog.c:3600 +msgid "missing error text" +msgstr "შეცდáƒáƒ›áƒ˜áƒ¡ ტექსტი ხელმიუწვდáƒáƒ›áƒ”ლიáƒ" + +#: utils/error/elog.c:3172 utils/error/elog.c:3175 +#, c-format +msgid " at character %d" +msgstr " სიმბáƒáƒšáƒáƒ¡áƒ—áƒáƒœ %d" + +#: utils/error/elog.c:3185 utils/error/elog.c:3192 +msgid "DETAIL: " +msgstr "დეტáƒáƒšáƒ”ბი: " + +#: utils/error/elog.c:3199 +msgid "HINT: " +msgstr "მინიშნებáƒ: " + +#: utils/error/elog.c:3206 +msgid "QUERY: " +msgstr "მáƒáƒ—ხáƒáƒ•ნáƒ: " + +#: utils/error/elog.c:3213 +msgid "CONTEXT: " +msgstr "კáƒáƒœáƒ¢áƒ”ქსტი: " + +#: utils/error/elog.c:3223 +#, c-format +msgid "LOCATION: %s, %s:%d\n" +msgstr "მდებáƒáƒ áƒ”áƒáƒ‘áƒ: %s, %s:%d\n" + +#: utils/error/elog.c:3230 +#, c-format +msgid "LOCATION: %s:%d\n" +msgstr "მდებáƒáƒ áƒ”áƒáƒ‘áƒ: %s:%d\n" + +#: utils/error/elog.c:3237 +msgid "BACKTRACE: " +msgstr "სტეკი: " + +#: utils/error/elog.c:3249 +msgid "STATEMENT: " +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜: " + +#: utils/error/elog.c:3645 +msgid "DEBUG" +msgstr "გáƒáƒ›áƒáƒ áƒ—ვáƒ" + +#: utils/error/elog.c:3649 +msgid "LOG" +msgstr "ჟურნáƒáƒšáƒ˜" + +#: utils/error/elog.c:3652 +msgid "INFO" +msgstr "ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ" + +#: utils/error/elog.c:3655 +msgid "NOTICE" +msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ" + +#: utils/error/elog.c:3659 +msgid "WARNING" +msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ" + +#: utils/error/elog.c:3662 +msgid "ERROR" +msgstr "შეცდáƒáƒ›áƒ" + +#: utils/error/elog.c:3665 +msgid "FATAL" +msgstr "ფáƒáƒ¢áƒáƒšáƒ£áƒ áƒ˜" + +#: utils/error/elog.c:3668 +msgid "PANIC" +msgstr "პáƒáƒœáƒ˜áƒ™áƒ" + +#: utils/fmgr/dfmgr.c:128 +#, c-format +msgid "could not find function \"%s\" in file \"%s\"" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%1$s\" ფუნქცირ\"%2$s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: utils/fmgr/dfmgr.c:247 +#, c-format +msgid "could not load library \"%s\": %s" +msgstr "ბიბლიáƒáƒ—ეკის (\"%s\") ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ: %s" + +#: utils/fmgr/dfmgr.c:279 +#, c-format +msgid "incompatible library \"%s\": missing magic block" +msgstr "áƒáƒ áƒáƒ—áƒáƒ•სებáƒáƒ“ი ბიბლიáƒáƒ—ეკრ\"%s\": მáƒáƒ’იური ბლáƒáƒ™áƒ˜ áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ" + +#: utils/fmgr/dfmgr.c:281 +#, c-format +msgid "Extension libraries are required to use the PG_MODULE_MAGIC macro." +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის ბიბლიáƒáƒ—ეკების მიერ PG_MODULE_MAGIC მáƒáƒ™áƒ áƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ." + +#: utils/fmgr/dfmgr.c:327 +#, c-format +msgid "incompatible library \"%s\": version mismatch" +msgstr "áƒáƒ áƒáƒ—áƒáƒ•სებáƒáƒ“ი ბიბლიáƒáƒ—ეკრ\"%s\": შეუსáƒáƒ‘áƒáƒ›áƒ ვერსიáƒ" + +#: utils/fmgr/dfmgr.c:329 +#, c-format +msgid "Server is version %d, library is version %s." +msgstr "სერვერის ვერსიáƒáƒ %d. ბიბლიáƒáƒ—ეკის კი %s." + +#: utils/fmgr/dfmgr.c:341 +#, c-format +msgid "incompatible library \"%s\": ABI mismatch" +msgstr "áƒáƒ áƒáƒ—áƒáƒ•სებáƒáƒ“ი ბიბლიáƒáƒ—ეკრ\"%s\": ABI áƒáƒ  ემთხვევáƒ" + +#: utils/fmgr/dfmgr.c:343 +#, c-format +msgid "Server has ABI \"%s\", library has \"%s\"." +msgstr "სერვერის ABI \"%s\"-áƒ, ბიბლიáƒáƒ—ეკის კი \"%s\"." + +#: utils/fmgr/dfmgr.c:361 +#, c-format +msgid "Server has FUNC_MAX_ARGS = %d, library has %d." +msgstr "სერვერის FUNC_MAX_ARGS = %d, ბიბლიáƒáƒ—ეკáƒáƒ¡ კი %d." + +#: utils/fmgr/dfmgr.c:370 +#, c-format +msgid "Server has INDEX_MAX_KEYS = %d, library has %d." +msgstr "სერვერის INDEX_MAX_KEYS = %d, ბიბლიáƒáƒ—ეკáƒáƒ¡ კი %d." + +#: utils/fmgr/dfmgr.c:379 +#, c-format +msgid "Server has NAMEDATALEN = %d, library has %d." +msgstr "სერვერის NAMEDATALEN = %d, ბიბლიáƒáƒ—ეკáƒáƒ¡ კი %d." + +#: utils/fmgr/dfmgr.c:388 +#, c-format +msgid "Server has FLOAT8PASSBYVAL = %s, library has %s." +msgstr "სერვერის FLOAT8PASSBYVAL = %s, ბიბლიáƒáƒ—ეკáƒáƒ¡ კი %s." + +#: utils/fmgr/dfmgr.c:395 +msgid "Magic block has unexpected length or padding difference." +msgstr "" + +#: utils/fmgr/dfmgr.c:398 +#, c-format +msgid "incompatible library \"%s\": magic block mismatch" +msgstr "áƒáƒ áƒáƒ—áƒáƒ•სებáƒáƒ“ი ბიბლიáƒáƒ—ეკრ\"%s\": მáƒáƒ’იური ბლáƒáƒ™áƒ˜ áƒáƒ  ემთხვევáƒ" + +#: utils/fmgr/dfmgr.c:475 +#, c-format +msgid "access to library \"%s\" is not allowed" +msgstr "წვდáƒáƒ›áƒ ბიბლიáƒáƒ—ეკáƒáƒ¡áƒ—áƒáƒœ \"%s\"" + +#: utils/fmgr/dfmgr.c:501 +#, c-format +msgid "invalid macro name in dynamic library path: %s" +msgstr "მáƒáƒ™áƒ áƒáƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი დინáƒáƒ›áƒ˜áƒ™áƒ£áƒ áƒ˜ ბიბლიáƒáƒ—ეკის ბილიკში: %s" + +#: utils/fmgr/dfmgr.c:541 +#, c-format +msgid "zero-length component in parameter \"dynamic_library_path\"" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ სიგრძის კáƒáƒ›áƒžáƒáƒœáƒ”ნტი პáƒáƒ áƒáƒ›áƒ”ტრში \"dynamic_library_path\"" + +#: utils/fmgr/dfmgr.c:560 +#, c-format +msgid "component in parameter \"dynamic_library_path\" is not an absolute path" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრში \"dynamic_library_path\" კáƒáƒ›áƒžáƒáƒœáƒ”ნტი áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ ბილიკი áƒáƒ áƒáƒ" + +#: utils/fmgr/fmgr.c:236 +#, c-format +msgid "internal function \"%s\" is not in internal lookup table" +msgstr "შიდრფუნქცირ\"%s\" შიდრძებნის ცხრილში áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ" + +#: utils/fmgr/fmgr.c:470 +#, c-format +msgid "could not find function information for function \"%s\"" +msgstr "ფუნქციისთვის \"%s\" ფუნქციის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ•ნრშეუძლებელიáƒ" + +#: utils/fmgr/fmgr.c:472 +#, c-format +msgid "SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname)." +msgstr "" + +#: utils/fmgr/fmgr.c:490 +#, c-format +msgid "unrecognized API version %d reported by info function \"%s\"" +msgstr "" + +#: utils/fmgr/fmgr.c:2109 +#, c-format +msgid "operator class options info is absent in function call context" +msgstr "" + +#: utils/fmgr/fmgr.c:2176 +#, c-format +msgid "language validation function %u called for language %u instead of %u" +msgstr "" + +#: utils/fmgr/funcapi.c:496 +#, c-format +msgid "could not determine actual result type for function \"%s\" declared to return type %s" +msgstr "" + +#: utils/fmgr/funcapi.c:642 +#, c-format +msgid "argument declared %s does not contain a range type but type %s" +msgstr "" + +#: utils/fmgr/funcapi.c:1929 utils/fmgr/funcapi.c:1961 +#, c-format +msgid "number of aliases does not match number of columns" +msgstr "მეტსáƒáƒ®áƒ”ლების რიცხვი სვეტების რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ¡ áƒáƒ  ემთხვევáƒ" + +#: utils/fmgr/funcapi.c:1955 +#, c-format +msgid "no column alias was provided" +msgstr "სვეტის მეტსáƒáƒ®áƒ”ლი მითითებული áƒáƒ áƒáƒ" + +#: utils/fmgr/funcapi.c:1979 +#, c-format +msgid "could not determine row description for function returning record" +msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის დáƒáƒ›áƒ‘რუნებელი ფუნქციისთვის მწკრივის áƒáƒ¦áƒ¬áƒ”რის დáƒáƒ“გენრშეუძლებელიáƒ" + +#: utils/init/miscinit.c:352 +#, c-format +msgid "data directory \"%s\" does not exist" +msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" + +#: utils/init/miscinit.c:357 +#, c-format +msgid "could not read permissions of directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წვდáƒáƒ›áƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელირ\"%s\": %m" + +#: utils/init/miscinit.c:365 +#, c-format +msgid "specified data directory \"%s\" is not a directory" +msgstr "მáƒáƒœáƒáƒªáƒ”მების მითითებული სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე áƒáƒ áƒáƒ" + +#: utils/init/miscinit.c:381 +#, c-format +msgid "data directory \"%s\" has wrong ownership" +msgstr "მáƒáƒœáƒáƒªáƒ”მების მითითებული სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") მფლáƒáƒ‘ელი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: utils/init/miscinit.c:383 +#, c-format +msgid "The server must be started by the user that owns the data directory." +msgstr "სერვერი იმ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლით უნდრგáƒáƒ”შვáƒáƒ¡, რáƒáƒ›áƒ”ლიც მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მფლáƒáƒ‘ელიáƒ." + +#: utils/init/miscinit.c:401 +#, c-format +msgid "data directory \"%s\" has invalid permissions" +msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის \"%s\" წვდáƒáƒ›áƒ”ბი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: utils/init/miscinit.c:403 +#, c-format +msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." +msgstr "წვდáƒáƒ›áƒ”ბი უნდრიყáƒáƒ¡ u=rwx (0700) áƒáƒœ u=rwx,g=rx (0750)." + +#: utils/init/miscinit.c:461 +#, c-format +msgid "could not change directory to \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე შეცვლის შეცდáƒáƒ›áƒ: %m" + +#: utils/init/miscinit.c:697 utils/misc/guc.c:3641 +#, c-format +msgid "cannot set parameter \"%s\" within security-restricted operation" +msgstr "" + +#: utils/init/miscinit.c:770 +#, c-format +msgid "role with OID %u does not exist" +msgstr "რáƒáƒšáƒ˜ OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: utils/init/miscinit.c:800 +#, c-format +msgid "role \"%s\" is not permitted to log in" +msgstr "რáƒáƒšáƒ¡ შესვლის უფლებრáƒáƒ  áƒáƒ¥áƒ•ს: %s" + +#: utils/init/miscinit.c:818 +#, c-format +msgid "too many connections for role \"%s\"" +msgstr "მეტისმეტáƒáƒ“ ბევრი კáƒáƒ•შირი რáƒáƒšáƒ˜áƒ¡áƒ—ვის \"%s\"" + +#: utils/init/miscinit.c:991 +#, c-format +msgid "invalid role OID: %u" +msgstr "რáƒáƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ OID: %u" + +#: utils/init/miscinit.c:1138 +#, c-format +msgid "database system is shut down" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემრგáƒáƒ—იშულიáƒ" + +#: utils/init/miscinit.c:1225 +#, c-format +msgid "could not create lock file \"%s\": %m" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %m" + +#: utils/init/miscinit.c:1239 +#, c-format +msgid "could not open lock file \"%s\": %m" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: utils/init/miscinit.c:1246 +#, c-format +msgid "could not read lock file \"%s\": %m" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: utils/init/miscinit.c:1255 +#, c-format +msgid "lock file \"%s\" is empty" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ (\"%s\") ცáƒáƒ áƒ˜áƒ”ლიáƒ" + +#: utils/init/miscinit.c:1256 +#, c-format +msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." +msgstr "" + +#: utils/init/miscinit.c:1300 +#, c-format +msgid "lock file \"%s\" already exists" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ (\"%s\") უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: utils/init/miscinit.c:1304 +#, c-format +msgid "Is another postgres (PID %d) running in data directory \"%s\"?" +msgstr "áƒáƒ áƒ˜áƒ¡ სხვრpostgres (PID %d) გáƒáƒ¨áƒ•ებული მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში \"%s\"?" + +#: utils/init/miscinit.c:1306 +#, c-format +msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" +msgstr "áƒáƒ áƒ˜áƒ¡ სხვრpostmaster (PID %d) გáƒáƒ¨áƒ•ებული მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒšáƒ“ეში \"%s\"?" + +#: utils/init/miscinit.c:1309 +#, c-format +msgid "Is another postgres (PID %d) using socket file \"%s\"?" +msgstr "იყენებს სხვრpostgres (PID %d) სáƒáƒ™áƒ”ტის ფáƒáƒ˜áƒšáƒ¡ \"%s\"?" + +#: utils/init/miscinit.c:1311 +#, c-format +msgid "Is another postmaster (PID %d) using socket file \"%s\"?" +msgstr "იყენებს სხვრpostmaster (PID %d) სáƒáƒ™áƒ”ტის ფáƒáƒ˜áƒšáƒ¡ \"%s\"?" + +#: utils/init/miscinit.c:1362 +#, c-format +msgid "could not remove old lock file \"%s\": %m" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ ძველი ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m" + +#: utils/init/miscinit.c:1364 +#, c-format +msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." +msgstr "" + +#: utils/init/miscinit.c:1401 utils/init/miscinit.c:1415 utils/init/miscinit.c:1426 +#, c-format +msgid "could not write lock file \"%s\": %m" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: utils/init/miscinit.c:1537 utils/init/miscinit.c:1679 utils/misc/guc.c:5715 +#, c-format +msgid "could not read from file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: utils/init/miscinit.c:1667 +#, c-format +msgid "could not open file \"%s\": %m; continuing anyway" +msgstr "შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡áƒáƒ¡: %m; მáƒáƒ˜áƒœáƒª ვáƒáƒ’რძელებ" + +#: utils/init/miscinit.c:1692 +#, c-format +msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ \"%s\" შეიცáƒáƒ•ს áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  PID-ს: %ld-ს %ld-ის მáƒáƒ’იერ" + +#: utils/init/miscinit.c:1731 utils/init/miscinit.c:1747 +#, c-format +msgid "\"%s\" is not a valid data directory" +msgstr "%s მáƒáƒœáƒáƒªáƒ”მების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეáƒ" + +#: utils/init/miscinit.c:1733 +#, c-format +msgid "File \"%s\" is missing." +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ™áƒšáƒ˜áƒ." + +#: utils/init/miscinit.c:1749 +#, c-format +msgid "File \"%s\" does not contain valid data." +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" სწáƒáƒ  მáƒáƒœáƒáƒªáƒ”მებს áƒáƒ  შეიცáƒáƒ•ს." + +#: utils/init/miscinit.c:1751 +#, c-format +msgid "You might need to initdb." +msgstr "რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, initdb გჭირდებáƒáƒ—." + +#: utils/init/miscinit.c:1759 +#, c-format +msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." +msgstr "მáƒáƒœáƒáƒªáƒ”მის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე ინიციáƒáƒšáƒ˜áƒ–ებული იყრPostgreSQL-ის %s ვერსიით, რáƒáƒ›áƒ”ლიც áƒáƒ› ვერსიáƒáƒ¡áƒ—áƒáƒœ, %s, თáƒáƒ•სებáƒáƒ“ი áƒáƒ áƒáƒ." + +#: utils/init/postinit.c:259 +#, c-format +msgid "replication connection authorized: user=%s" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ შეერთებრáƒáƒ•ტáƒáƒ áƒ˜áƒ–ებულიáƒ: მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი=%s" + +#: utils/init/postinit.c:262 +#, c-format +msgid "connection authorized: user=%s" +msgstr "შეერთებრáƒáƒ•ტáƒáƒ áƒ˜áƒ–ებულიáƒ: მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი=%s" + +#: utils/init/postinit.c:265 +#, c-format +msgid " database=%s" +msgstr " ბáƒáƒ–áƒ=%s" + +#: utils/init/postinit.c:268 +#, c-format +msgid " application_name=%s" +msgstr " áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი=%s" + +#: utils/init/postinit.c:273 +#, c-format +msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" +msgstr " SSL ჩáƒáƒ áƒ—ულირ(პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜=%s, შიფრი=%s, ბიტები=%d)" + +#: utils/init/postinit.c:285 +#, c-format +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s, principal=%s)" +msgstr " GSS (áƒáƒ•თენტიფიცირებული=%s, დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ£áƒšáƒ˜=%s, delegated_credentials=%s, პრინციპáƒáƒšáƒ˜=%s)" + +#: utils/init/postinit.c:286 utils/init/postinit.c:287 utils/init/postinit.c:288 utils/init/postinit.c:293 utils/init/postinit.c:294 utils/init/postinit.c:295 +msgid "no" +msgstr "áƒáƒ áƒ" + +#: utils/init/postinit.c:286 utils/init/postinit.c:287 utils/init/postinit.c:288 utils/init/postinit.c:293 utils/init/postinit.c:294 utils/init/postinit.c:295 +msgid "yes" +msgstr "დიáƒáƒ®" + +#: utils/init/postinit.c:292 +#, c-format +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)" +msgstr " GSS (áƒáƒ•თენტიფიცირებული=%s, დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ£áƒšáƒ˜=%s, delegated_credentials=%s)" + +#: utils/init/postinit.c:333 +#, c-format +msgid "database \"%s\" has disappeared from pg_database" +msgstr "ბáƒáƒ–რ\"%s\" pg_database-დáƒáƒœ გáƒáƒ¥áƒ áƒ" + +#: utils/init/postinit.c:335 +#, c-format +msgid "Database OID %u now seems to belong to \"%s\"." +msgstr "ბáƒáƒ–ის OID %u, რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, áƒáƒ®áƒšáƒ \"%s\"-ს ეკუთვნის." + +#: utils/init/postinit.c:355 +#, c-format +msgid "database \"%s\" is not currently accepting connections" +msgstr "ბáƒáƒ–რ\"%s\" áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მიერთებებს áƒáƒ  იღებს" + +#: utils/init/postinit.c:368 +#, c-format +msgid "permission denied for database \"%s\"" +msgstr "წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ ბáƒáƒ–áƒáƒ–ე: \"%s\"" + +#: utils/init/postinit.c:369 +#, c-format +msgid "User does not have CONNECT privilege." +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს CONNECT პრივილეგირáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." + +#: utils/init/postinit.c:386 +#, c-format +msgid "too many connections for database \"%s\"" +msgstr "ძáƒáƒšáƒ˜áƒáƒœ ბევრი კáƒáƒ•შირი ბáƒáƒ–ისთვის \"%s\"" + +#: utils/init/postinit.c:410 utils/init/postinit.c:417 +#, c-format +msgid "database locale is incompatible with operating system" +msgstr "ბáƒáƒ–ის ენრáƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒš სისტემáƒáƒ¡áƒ—áƒáƒœ შეუთáƒáƒ•სებელიáƒ" + +#: utils/init/postinit.c:411 +#, c-format +msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." +msgstr "ბáƒáƒ–რინიციáƒáƒšáƒ˜áƒ–ებული იყრLC_COLLATE \"%s\"-ით, რáƒáƒ›áƒ”ლსáƒáƒª setlocale() ვერ ცნáƒáƒ‘ს." + +#: utils/init/postinit.c:413 utils/init/postinit.c:420 +#, c-format +msgid "Recreate the database with another locale or install the missing locale." +msgstr "თáƒáƒ•იდáƒáƒœ შექმენით ბáƒáƒ–რსხვრლáƒáƒ™áƒáƒšáƒ˜áƒ— áƒáƒœ დáƒáƒáƒ§áƒ”ნეთ ლáƒáƒ™áƒáƒšáƒ˜, რáƒáƒ›áƒ”ლიც ვერ ვიპáƒáƒ•ე." + +#: utils/init/postinit.c:418 +#, c-format +msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." +msgstr "ბáƒáƒ–რინიციáƒáƒšáƒ˜áƒ–ებული იყრLC_CTYPE \"%s\"-ით, რáƒáƒ›áƒ”ლსáƒáƒª setlocale() ვერ ცნáƒáƒ‘ს." + +#: utils/init/postinit.c:491 +#, c-format +msgid "database \"%s\" has a collation version mismatch" +msgstr "ბáƒáƒ–ის \"%s\" კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ ვერსირáƒáƒ  ემთხვევáƒ" + +#: utils/init/postinit.c:493 +#, c-format +msgid "The database was created using collation version %s, but the operating system provides version %s." +msgstr "" + +#: utils/init/postinit.c:496 +#, c-format +msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." +msgstr "" + +#: utils/init/postinit.c:902 +#, c-format +msgid "no roles are defined in this database system" +msgstr "áƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ რáƒáƒšáƒ”ბი áƒáƒ¦áƒ¬áƒ”რილი áƒáƒ áƒáƒ" + +#: utils/init/postinit.c:903 +#, c-format +msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." +msgstr "მáƒáƒ¨áƒ˜áƒœáƒ•ე უნდრგáƒáƒ£áƒ¨áƒ•áƒáƒ— CREATE USER \"%s\" SUPERUSER;." + +#: utils/init/postinit.c:940 +#, c-format +msgid "must be superuser to connect in binary upgrade mode" +msgstr "áƒáƒ áƒáƒ‘ითი გáƒáƒœáƒáƒ®áƒšáƒ”ბისáƒáƒ¡ მისáƒáƒ”რთებლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ" + +#: utils/init/postinit.c:961 +#, c-format +msgid "remaining connection slots are reserved for roles with the %s attribute" +msgstr "დáƒáƒ áƒ©áƒ”ნილი მიერთების სლáƒáƒ¢áƒ”ბი დáƒáƒªáƒ£áƒšáƒ˜áƒ %s áƒáƒ¢áƒ áƒ˜áƒ‘უტის მქáƒáƒœáƒ” რáƒáƒšáƒ”ბისთვის" + +#: utils/init/postinit.c:967 +#, c-format +msgid "remaining connection slots are reserved for roles with privileges of the \"%s\" role" +msgstr "დáƒáƒ áƒ©áƒ”ნილი მიერთების სლáƒáƒ¢áƒ”ბი დáƒáƒªáƒ£áƒšáƒ˜áƒ %s რáƒáƒšáƒ˜áƒ¡ პრივილეგიების მქáƒáƒœáƒ” რáƒáƒšáƒ”ბისთვის" + +#: utils/init/postinit.c:979 +#, c-format +msgid "permission denied to start WAL sender" +msgstr "'WAL' გáƒáƒ›áƒ’ზáƒáƒ•ნის გáƒáƒ¨áƒ•ების წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: utils/init/postinit.c:980 +#, c-format +msgid "Only roles with the %s attribute may start a WAL sender process." +msgstr "" + +#: utils/init/postinit.c:1098 +#, c-format +msgid "It seems to have just been dropped or renamed." +msgstr "რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, áƒáƒ®áƒšáƒáƒ®áƒáƒœáƒ¡ წáƒáƒ˜áƒ¨áƒáƒšáƒ áƒáƒœ სáƒáƒ®áƒ”ლი გáƒáƒ“áƒáƒ”რქვáƒ." + +#: utils/init/postinit.c:1102 +#, c-format +msgid "database %u does not exist" +msgstr "ბáƒáƒ–რáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %u" + +#: utils/init/postinit.c:1111 +#, c-format +msgid "cannot connect to invalid database \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" დáƒáƒ™áƒáƒ•შირებრვერ მáƒáƒ®áƒ”რხდáƒ" + +#: utils/init/postinit.c:1172 +#, c-format +msgid "The database subdirectory \"%s\" is missing." +msgstr "ბáƒáƒ–ის ქვესáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s." + +#: utils/init/usercontext.c:43 +#, c-format +msgid "role \"%s\" cannot SET ROLE to \"%s\"" +msgstr "რáƒáƒšáƒ¡ \"%s\" \"%s\"-ზე SET ROLE áƒáƒ  შეუძლიáƒ" + +#: utils/mb/conv.c:522 utils/mb/conv.c:733 +#, c-format +msgid "invalid encoding number: %d" +msgstr "კáƒáƒ“ირების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი: %d" + +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:129 utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:165 +#, c-format +msgid "unexpected encoding ID %d for ISO 8859 character sets" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¨áƒ˜áƒ¤áƒ•რის ID %d 'ISO 8859' სიმბáƒáƒšáƒáƒ”ბის ნáƒáƒ™áƒ áƒ”ბებისთვის" + +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:110 utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:146 +#, c-format +msgid "unexpected encoding ID %d for WIN character sets" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¨áƒ˜áƒ¤áƒ•რის ID %d WIN სიმბáƒáƒšáƒáƒ”ბის ნáƒáƒ™áƒ áƒ”ბებისთვის" + +#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:900 +#, c-format +msgid "conversion between %s and %s is not supported" +msgstr "%s-დáƒáƒœ %s-ზე გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 utils/mb/mbutils.c:842 +#, c-format +msgid "String of %d bytes is too long for encoding conversion." +msgstr "%d ბáƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ სტრიქáƒáƒœáƒ˜ კáƒáƒ“ირების გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡áƒ—ვის მეტისმეტáƒáƒ“ გრძელიáƒ." + +#: utils/mb/mbutils.c:568 +#, c-format +msgid "invalid source encoding name \"%s\"" +msgstr "წყáƒáƒ áƒáƒ¡ კáƒáƒ“ირების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\"" + +#: utils/mb/mbutils.c:573 +#, c-format +msgid "invalid destination encoding name \"%s\"" +msgstr "სáƒáƒ›áƒ˜áƒ–ნის კáƒáƒ“ირების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\"" + +#: utils/mb/mbutils.c:713 +#, c-format +msgid "invalid byte value for encoding \"%s\": 0x%02x" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბáƒáƒ˜áƒ¢áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რკáƒáƒ“ირებისთვის \"%s\": 0x%02x" + +#: utils/mb/mbutils.c:877 +#, c-format +msgid "invalid Unicode code point" +msgstr "უნიკáƒáƒ“ის კáƒáƒ“ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წერტილი" + +#: utils/mb/mbutils.c:1201 +#, c-format +msgid "bind_textdomain_codeset failed" +msgstr "bind_textdomain_codeset-ის შეცდáƒáƒ›áƒ" + +#: utils/mb/mbutils.c:1718 +#, c-format +msgid "invalid byte sequence for encoding \"%s\": %s" +msgstr "ბáƒáƒ˜áƒ¢áƒ”ბის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მიმდევრáƒáƒ‘რკáƒáƒ“ირებისთვის \"%s\": %s" + +#: utils/mb/mbutils.c:1751 +#, c-format +msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" +msgstr "" + +#: utils/misc/conffiles.c:88 +#, c-format +msgid "empty configuration directory name: \"%s\"" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის სáƒáƒ®áƒ”ლი ცáƒáƒ áƒ˜áƒ”ლიáƒ: \"%s\"" + +#: utils/misc/conffiles.c:100 +#, c-format +msgid "could not open configuration directory \"%s\": %m" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: utils/misc/guc.c:122 +msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის სწáƒáƒ áƒ˜ ერთეულებირ\"ბ\", \"კბ\", \"მბ\", \"გბ\" დრ\"ტბ\"." + +#: utils/misc/guc.c:159 +msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის სწáƒáƒ áƒ˜ ერთეულებირ\"მკწმ\", \"მწმ\", \"წმ\", \"წთ\", \"სთ\" დრ\"დღე\"." + +#: utils/misc/guc.c:430 +#, c-format +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "უცნáƒáƒ‘ი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ხáƒáƒ–ზე %d" + +#: utils/misc/guc.c:470 utils/misc/guc.c:3495 utils/misc/guc.c:3739 utils/misc/guc.c:3837 utils/misc/guc.c:3935 utils/misc/guc.c:4059 utils/misc/guc.c:4162 +#, c-format +msgid "parameter \"%s\" cannot be changed without restarting the server" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" -ის შეცვლრსერვერის გáƒáƒ“áƒáƒ¢áƒ•ირთვის გáƒáƒ áƒ”შე შეუძლებელიáƒ" + +#: utils/misc/guc.c:506 +#, c-format +msgid "parameter \"%s\" removed from configuration file, reset to default" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" წáƒáƒ˜áƒ¨áƒáƒšáƒ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ. დáƒáƒ‘რუნდრნáƒáƒ’ულისხმევ მნიშვნელáƒáƒ‘áƒáƒ–ე" + +#: utils/misc/guc.c:571 +#, c-format +msgid "parameter \"%s\" changed to \"%s\"" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" შეიცვáƒáƒšáƒ \"%s\"-ზე" + +#: utils/misc/guc.c:613 +#, c-format +msgid "configuration file \"%s\" contains errors" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ \"%s\" შეცდáƒáƒ›áƒ”ბს შეიცáƒáƒ•ს" + +#: utils/misc/guc.c:618 +#, c-format +msgid "configuration file \"%s\" contains errors; unaffected changes were applied" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ \"%s\" შეცდáƒáƒ›áƒ”ბს შეიცáƒáƒ•ს; გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრმხáƒáƒšáƒáƒ“ სწáƒáƒ áƒ˜ ნáƒáƒ¬áƒ˜áƒšáƒ˜" + +#: utils/misc/guc.c:623 +#, c-format +msgid "configuration file \"%s\" contains errors; no changes were applied" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ \"%s\" შეცდáƒáƒ›áƒ”ბს შეიცáƒáƒ•ს; ცვლილებები áƒáƒ  მáƒáƒ®áƒ“ებáƒ" + +#: utils/misc/guc.c:1139 utils/misc/guc.c:1155 +#, c-format +msgid "invalid configuration parameter name \"%s\"" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: %s" + +#: utils/misc/guc.c:1141 +#, c-format +msgid "Custom parameter names must be two or more simple identifiers separated by dots." +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒ›áƒ”ტრის სáƒáƒ®áƒ”ლები áƒáƒ áƒ˜ áƒáƒœ მეტი მáƒáƒ áƒ¢áƒ˜áƒ•ი, წერტილებით გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ უნდრიყáƒáƒ¡." + +#: utils/misc/guc.c:1157 +#, c-format +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\" დáƒáƒªáƒ£áƒšáƒ˜ პრეფიქსიáƒ." + +#: utils/misc/guc.c:1170 utils/misc/guc.c:1280 +#, c-format +msgid "unrecognized configuration parameter \"%s\"" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: utils/misc/guc.c:1802 +#, c-format +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ %s წვდáƒáƒ›áƒ˜áƒ¡ უფლებრáƒáƒ  გáƒáƒ¥áƒ•თ: %m\n" + +#: utils/misc/guc.c:1806 +#, c-format +msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" +msgstr "PostgreSQL-ის მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის initdb áƒáƒœ pg_basebackup გáƒáƒ£áƒ¨áƒ•ით.\n" + +#: utils/misc/guc.c:1830 +#, c-format +msgid "" +"%s does not know where to find the server configuration file.\n" +"You must specify the --config-file or -D invocation option or set the PGDATA environment variable.\n" +msgstr "" + +#: utils/misc/guc.c:1853 +#, c-format +msgid "%s: could not access the server configuration file \"%s\": %m\n" +msgstr "%s: სერვერის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ—áƒáƒœ ('%s') წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ: %m\n" + +#: utils/misc/guc.c:1881 +#, c-format +msgid "" +"%s does not know where to find the database system data.\n" +"This can be specified as \"data_directory\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "" +"%s-მრáƒáƒ  იცის, სáƒáƒ“ იპáƒáƒ•áƒáƒ¡ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემური მáƒáƒœáƒáƒªáƒ”მები.\n" +"áƒáƒ›áƒ˜áƒ¡ მითითებრ\"%s\"-ში \"data_directory\" პáƒáƒ áƒáƒ›áƒ”ტრით შეგიძლიáƒáƒ—, áƒáƒœ -D გáƒáƒ¨áƒ•ების პáƒáƒ áƒáƒ›áƒ”ტრით, áƒáƒœ PGDATA გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ით.\n" + +#: utils/misc/guc.c:1933 +#, c-format +msgid "" +"%s does not know where to find the \"hba\" configuration file.\n" +"This can be specified as \"hba_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "" + +#: utils/misc/guc.c:1964 +#, c-format +msgid "" +"%s does not know where to find the \"ident\" configuration file.\n" +"This can be specified as \"ident_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "" + +#: utils/misc/guc.c:2943 +msgid "Value exceeds integer range." +msgstr "\"lo_write\" -ის áƒáƒ áƒ’უმენტიმთელი რიცხვის დáƒáƒ¡áƒáƒ¨áƒ•ებ სáƒáƒ–ღვრებს სცდებáƒ." + +#: utils/misc/guc.c:3185 +#, c-format +msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d%s%s .. %d%s%s)" +msgstr "%d%s%s დáƒáƒ¨áƒ•ებულ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ პáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\" (%d%s%s .. %d%s%s)" + +#: utils/misc/guc.c:3226 +#, c-format +msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g%s%s .. %g%s%s)" +msgstr "%g%s%s დáƒáƒ¨áƒ•ებულ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ პáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\" (%g%s%s .. %g%s%s)" + +#: utils/misc/guc.c:3447 utils/misc/guc_funcs.c:54 +#, c-format +msgid "cannot set parameters during a parallel operation" +msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: utils/misc/guc.c:3472 utils/misc/guc.c:4646 +#, c-format +msgid "parameter \"%s\" cannot be changed" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" áƒáƒ  შეიძლებრშეიცვáƒáƒšáƒáƒ¡" + +#: utils/misc/guc.c:3505 +#, c-format +msgid "parameter \"%s\" cannot be changed now" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" áƒáƒ®áƒšáƒ áƒáƒ  შეიძლებრშეიცვáƒáƒšáƒáƒ¡" + +#: utils/misc/guc.c:3532 utils/misc/guc.c:3594 utils/misc/guc.c:4621 utils/misc/guc.c:6712 +#, c-format +msgid "permission denied to set parameter \"%s\"" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის (\"%s\") დáƒáƒ§áƒ”ნების წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: utils/misc/guc.c:3574 +#, c-format +msgid "parameter \"%s\" cannot be set after connection start" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\"-ის დáƒáƒ§áƒ”ნებრკáƒáƒ•შირის დáƒáƒ›áƒ§áƒáƒ áƒ”ბის შემდეგ შეუძლებელიáƒ" + +#: utils/misc/guc.c:3633 +#, c-format +msgid "cannot set parameter \"%s\" within security-definer function" +msgstr "უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის áƒáƒ¦áƒ›áƒ¬áƒ”რ ფუნქციáƒáƒ¨áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრ \"%s\"-ს ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: utils/misc/guc.c:3654 +#, c-format +msgid "parameter \"%s\" cannot be reset" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის სáƒáƒ¬áƒ§áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ–ე დáƒáƒ‘რუნების შეცდáƒáƒ›áƒ: \"%s\"" + +#: utils/misc/guc.c:3661 +#, c-format +msgid "parameter \"%s\" cannot be set locally in functions" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\"-ის ფუნქციებში ლáƒáƒ™áƒáƒšáƒ£áƒ áƒáƒ“ დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#: utils/misc/guc.c:4320 utils/misc/guc.c:4368 utils/misc/guc.c:5400 +#, c-format +msgid "permission denied to examine \"%s\"" +msgstr "\"%s\"-ის მáƒáƒ¡áƒ˜áƒœáƒ¯áƒ•ის წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: utils/misc/guc.c:4321 utils/misc/guc.c:4369 utils/misc/guc.c:5401 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may examine this parameter." +msgstr "áƒáƒ› პáƒáƒ áƒáƒ›áƒ”ტრის შემáƒáƒ¬áƒ›áƒ”ბრმხáƒáƒšáƒáƒ“ \"%s\" პრივილეგიის მქáƒáƒœáƒ” რáƒáƒšáƒ”ბს შეუძლიáƒáƒ—." + +#: utils/misc/guc.c:4579 +#, c-format +msgid "ALTER SYSTEM is not allowed in this environment" +msgstr "áƒáƒ› გáƒáƒ áƒ”მáƒáƒ¨áƒ˜ ALTER SYSTEM დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: utils/misc/guc.c:4611 +#, c-format +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "\"ALTER SYSTEM RESET ALL\"-ის შესრულების წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ" + +#: utils/misc/guc.c:4690 +#, c-format +msgid "parameter value for ALTER SYSTEM must not contain a newline" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘რALTER SYSTEM-სთვის áƒáƒ  შეიძლებáƒ, áƒáƒ®áƒáƒšáƒ˜ ხáƒáƒ–ის სიმბáƒáƒšáƒáƒ¡ შეიცáƒáƒ•დეს" + +#: utils/misc/guc.c:4735 +#, c-format +msgid "could not parse contents of file \"%s\"" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ დშემცველáƒáƒ‘ის áƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ \"%s\"" + +#: utils/misc/guc.c:4917 +#, c-format +msgid "attempt to redefine parameter \"%s\"" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის თáƒáƒ•იდáƒáƒœ áƒáƒ¦áƒ¬áƒ”რის მცდელáƒáƒ‘áƒ: \"%s\"" + +#: utils/misc/guc.c:5256 +#, c-format +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\". წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ" + +#: utils/misc/guc.c:5258 +#, c-format +msgid "\"%s\" is now a reserved prefix." +msgstr "\"%s\" áƒáƒ®áƒšáƒ დáƒáƒªáƒ£áƒšáƒ˜ პრეფიქსიáƒ." + +#: utils/misc/guc.c:6135 +#, c-format +msgid "while setting parameter \"%s\" to \"%s\"" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის \"%s\" \"%s\"-ზე დáƒáƒ§áƒ”ნებისáƒáƒ¡" + +#: utils/misc/guc.c:6304 +#, c-format +msgid "parameter \"%s\" could not be set" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: \"%s\"" + +#: utils/misc/guc.c:6394 +#, c-format +msgid "could not parse setting for parameter \"%s\"" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: %s" + +#: utils/misc/guc.c:6844 +#, c-format +msgid "invalid value for parameter \"%s\": %g" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რპáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\": %g" + +#: utils/misc/guc_funcs.c:130 +#, c-format +msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" +msgstr "SET LOCAL TRANSACTION SNAPSHOT გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#: utils/misc/guc_funcs.c:218 +#, c-format +msgid "SET %s takes only one argument" +msgstr "SET %s მხáƒáƒšáƒáƒ“ ერთ áƒáƒ áƒ’უმენტს იღებს" + +#: utils/misc/guc_funcs.c:342 +#, c-format +msgid "SET requires parameter name" +msgstr "SET მáƒáƒ˜áƒ—ხáƒáƒ•ს პáƒáƒ áƒáƒ›áƒ”ტრის სáƒáƒ®áƒ”ლს" + +#: utils/misc/guc_tables.c:675 +msgid "Ungrouped" +msgstr "დáƒáƒ¯áƒ’უფებრმáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜áƒ" + +#: utils/misc/guc_tables.c:676 +msgid "File Locations" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘ები" + +#: utils/misc/guc_tables.c:677 +msgid "Connections and Authentication / Connection Settings" +msgstr "დáƒáƒ™áƒáƒ•შირებრდრáƒáƒ•თენტიკáƒáƒªáƒ˜áƒ / შეერთების პáƒáƒ áƒáƒ›áƒ”ტრები" + +#: utils/misc/guc_tables.c:678 +msgid "Connections and Authentication / TCP Settings" +msgstr "დáƒáƒ™áƒáƒ•შირებრდრáƒáƒ•თენტიკáƒáƒªáƒ˜áƒ / TCP-ის პáƒáƒ áƒáƒ›áƒ”ტრები" + +#: utils/misc/guc_tables.c:679 +msgid "Connections and Authentication / Authentication" +msgstr "დáƒáƒ™áƒáƒ•შირებრდრáƒáƒ•თენტიკáƒáƒªáƒ˜áƒ / áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ" + +#: utils/misc/guc_tables.c:680 +msgid "Connections and Authentication / SSL" +msgstr "დáƒáƒ™áƒáƒ•შირებრდრáƒáƒ•თენტიკáƒáƒªáƒ˜áƒ / SSL" + +#: utils/misc/guc_tables.c:681 +msgid "Resource Usage / Memory" +msgstr "რესურსების გáƒáƒ›áƒáƒ§áƒ”ნებრ/ მეხსიერებáƒ" + +#: utils/misc/guc_tables.c:682 +msgid "Resource Usage / Disk" +msgstr "რესურსების გáƒáƒ›áƒáƒ§áƒ”ნებრ/ დისკი" + +#: utils/misc/guc_tables.c:683 +msgid "Resource Usage / Kernel Resources" +msgstr "რესურსების გáƒáƒ›áƒáƒ§áƒ”ნებრ/ ბირთვის რესურსები" + +#: utils/misc/guc_tables.c:684 +msgid "Resource Usage / Cost-Based Vacuum Delay" +msgstr "რესურსების გáƒáƒ›áƒáƒ§áƒ”ნებრ/ ფáƒáƒ¡áƒ–ე-დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებული დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის დáƒáƒ§áƒáƒ•ნებáƒ" + +#: utils/misc/guc_tables.c:685 +msgid "Resource Usage / Background Writer" +msgstr "რესურსების გáƒáƒ›áƒáƒ§áƒ”ნებრ/ ფáƒáƒœáƒ£áƒ áƒ˜ ჩáƒáƒ›áƒ¬áƒ”რი" + +#: utils/misc/guc_tables.c:686 +msgid "Resource Usage / Asynchronous Behavior" +msgstr "რესურსების გáƒáƒ›áƒáƒ§áƒ”ნებრ/ áƒáƒ¡áƒ˜áƒœáƒ¥áƒ áƒáƒœáƒ£áƒšáƒ˜ ქცევáƒ" + +#: utils/misc/guc_tables.c:687 +msgid "Write-Ahead Log / Settings" +msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რი ჟურნáƒáƒšáƒ˜ / მáƒáƒ áƒ’ებáƒ" + +#: utils/misc/guc_tables.c:688 +msgid "Write-Ahead Log / Checkpoints" +msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რი ჟურნáƒáƒšáƒ˜ / სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილები" + +#: utils/misc/guc_tables.c:689 +msgid "Write-Ahead Log / Archiving" +msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რი ჟურნáƒáƒšáƒ˜ / áƒáƒ áƒ¥áƒ˜áƒ•ირებáƒ" + +#: utils/misc/guc_tables.c:690 +msgid "Write-Ahead Log / Recovery" +msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რი ჟურნáƒáƒšáƒ˜ / áƒáƒ¦áƒ“გენáƒ" + +#: utils/misc/guc_tables.c:691 +msgid "Write-Ahead Log / Archive Recovery" +msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რი ჟურნáƒáƒšáƒ˜ / áƒáƒ áƒ¥áƒ˜áƒ•ის áƒáƒ¦áƒ“გენáƒ" + +#: utils/misc/guc_tables.c:692 +msgid "Write-Ahead Log / Recovery Target" +msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რი ჟურნáƒáƒšáƒ˜ / სáƒáƒ›áƒ˜áƒ–ნის áƒáƒ¦áƒ“გენáƒ" + +#: utils/misc/guc_tables.c:693 +msgid "Write-Ahead Log / Summarization" +msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რი ჟურნáƒáƒšáƒ˜ / შეჯáƒáƒ›áƒ”ბáƒ" + +#: utils/misc/guc_tables.c:694 +msgid "Replication / Sending Servers" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ / სერვერების გáƒáƒ’ზáƒáƒ•ნáƒ" + +#: utils/misc/guc_tables.c:695 +msgid "Replication / Primary Server" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ / ძირითáƒáƒ“ი სერვერი" + +#: utils/misc/guc_tables.c:696 +msgid "Replication / Standby Servers" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ / უქმე სერვერები" + +#: utils/misc/guc_tables.c:697 +msgid "Replication / Subscribers" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ / გáƒáƒ›áƒáƒ›áƒ¬áƒ”რები" + +#: utils/misc/guc_tables.c:698 +msgid "Query Tuning / Planner Method Configuration" +msgstr "მáƒáƒ—ხáƒáƒ•ნის მáƒáƒ áƒ’ებრ/ დáƒáƒ›áƒ’ეგმáƒáƒ•ის მეთáƒáƒ“ის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ" + +#: utils/misc/guc_tables.c:699 +msgid "Query Tuning / Planner Cost Constants" +msgstr "მáƒáƒ—ხáƒáƒ•ნის მáƒáƒ áƒ’ებრ/ დáƒáƒ›áƒ’ეგმáƒáƒ•ის ფáƒáƒ¡áƒ˜áƒ¡ შეზღუდვები" + +#: utils/misc/guc_tables.c:700 +msgid "Query Tuning / Genetic Query Optimizer" +msgstr "მáƒáƒ—ხáƒáƒ•ნის მáƒáƒ áƒ’ებრ/ მáƒáƒ—ხáƒáƒ•ნის ზáƒáƒ’áƒáƒ“ი áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜" + +#: utils/misc/guc_tables.c:701 +msgid "Query Tuning / Other Planner Options" +msgstr "მáƒáƒ—ხáƒáƒ•ნის მáƒáƒ áƒ’ებრ/ დáƒáƒ›áƒ’ეგმáƒáƒ•ის სხვრპáƒáƒ áƒáƒ›áƒ”ტრები" + +#: utils/misc/guc_tables.c:702 +msgid "Reporting and Logging / Where to Log" +msgstr "áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბი დრჟურნáƒáƒšáƒ˜ / სáƒáƒ“ ჩáƒáƒ•წერრჟურნáƒáƒšáƒ˜" + +#: utils/misc/guc_tables.c:703 +msgid "Reporting and Logging / When to Log" +msgstr "áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბი დრჟურნáƒáƒšáƒ˜ / რáƒáƒ“ის ჩáƒáƒ•წერრჟურნáƒáƒšáƒ˜" + +#: utils/misc/guc_tables.c:704 +msgid "Reporting and Logging / What to Log" +msgstr "áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბი დრჟურნáƒáƒšáƒ˜ / რრჩáƒáƒ•წერრჟურნáƒáƒšáƒ¨áƒ˜" + +#: utils/misc/guc_tables.c:705 +msgid "Reporting and Logging / Process Title" +msgstr "áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ”ბი დრჟურნáƒáƒšáƒ˜ / პრáƒáƒªáƒ”სის სáƒáƒ—áƒáƒ£áƒ áƒ˜" + +#: utils/misc/guc_tables.c:706 +msgid "Statistics / Monitoring" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ / მáƒáƒœáƒ˜áƒ¢áƒáƒ áƒ˜áƒœáƒ’ი" + +#: utils/misc/guc_tables.c:707 +msgid "Statistics / Cumulative Query and Index Statistics" +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ / კუმულáƒáƒªáƒ˜áƒ£áƒ áƒ˜ მáƒáƒ—ხáƒáƒ•ნისრდრინდექსის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ" + +#: utils/misc/guc_tables.c:708 +msgid "Autovacuum" +msgstr "áƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ" + +#: utils/misc/guc_tables.c:709 +msgid "Client Connection Defaults / Statement Behavior" +msgstr "კლიენტის შეერთების ნáƒáƒ’ულისხმევი პáƒáƒ áƒáƒ›áƒ”ტრები / ბრძáƒáƒœáƒ”ბის ქცევáƒ" + +#: utils/misc/guc_tables.c:710 +msgid "Client Connection Defaults / Locale and Formatting" +msgstr "კლიენტის შეერთების ნáƒáƒ’ულისხმევი პáƒáƒ áƒáƒ›áƒ”ტრები / ენრდრფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბáƒ" + +#: utils/misc/guc_tables.c:711 +msgid "Client Connection Defaults / Shared Library Preloading" +msgstr "კლიენტის შეერთების ნáƒáƒ’ულისხმევი პáƒáƒ áƒáƒ›áƒ”ტრები / გáƒáƒ–იáƒáƒ áƒ”ბული ბიბლიáƒáƒ—ეკის წინáƒáƒ¡áƒ¬áƒáƒ áƒ˜ ჩáƒáƒ¢áƒ•ირთვáƒ" + +#: utils/misc/guc_tables.c:712 +msgid "Client Connection Defaults / Other Defaults" +msgstr "კლიენტის შეერთების ნáƒáƒ’ულისხმევი პáƒáƒ áƒáƒ›áƒ”ტრები / სხვრნáƒáƒ’ულისხმევი პáƒáƒ áƒáƒ›áƒ”ტრები" + +#: utils/misc/guc_tables.c:713 +msgid "Lock Management" +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ მáƒáƒ áƒ—ვáƒ" + +#: utils/misc/guc_tables.c:714 +msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" +msgstr "ვერსიისრდრპლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒ˜áƒ¡ თáƒáƒ•სებáƒáƒ“áƒáƒ‘რ/ PostgreSQL-ის წინრვერსიები" + +#: utils/misc/guc_tables.c:715 +msgid "Version and Platform Compatibility / Other Platforms and Clients" +msgstr "ვერსიისრდრპლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒ˜áƒ¡ თáƒáƒ•სებáƒáƒ“áƒáƒ‘რ/ სხვრპლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒ”ბი დრკლიენტები" + +#: utils/misc/guc_tables.c:716 +msgid "Error Handling" +msgstr "შეცდáƒáƒ›áƒ”ბის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒ" + +#: utils/misc/guc_tables.c:717 +msgid "Preset Options" +msgstr "პრესეტის მáƒáƒ áƒ’ებáƒ" + +#: utils/misc/guc_tables.c:718 +msgid "Customized Options" +msgstr "ხელით მითითებული პáƒáƒ áƒáƒ›áƒ”ტრები" + +#: utils/misc/guc_tables.c:719 +msgid "Developer Options" +msgstr "პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡áƒ¢áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები" + +#: utils/misc/guc_tables.c:774 +msgid "Enables the planner's use of sequential-scan plans." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის მიმდევრáƒáƒ‘ითი სკáƒáƒœáƒ˜áƒ áƒ”ბის გეგმების გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:784 +msgid "Enables the planner's use of index-scan plans." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის ინდექსის სკáƒáƒœáƒ˜áƒ áƒ”ბის გეგმების გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:794 +msgid "Enables the planner's use of index-only-scan plans." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის მხáƒáƒšáƒáƒ“ ინდექსის სკáƒáƒœáƒ˜áƒ áƒ”ბის გეგმების გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:804 +msgid "Enables the planner's use of bitmap-scan plans." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის ბიტური რუკების სკáƒáƒœáƒ˜áƒ áƒ”ბის გეგმების გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:814 +msgid "Enables the planner's use of TID scan plans." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის TID-ის სკáƒáƒœáƒ˜áƒ áƒ”ბის გეგმების გáƒáƒ›áƒáƒ§áƒ”ნების უფლები მიცემáƒ." + +#: utils/misc/guc_tables.c:824 +msgid "Enables the planner's use of explicit sort steps." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის áƒáƒ¨áƒ™áƒáƒ áƒ დáƒáƒšáƒáƒ’ების ნáƒáƒ‘იჯების გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:834 +msgid "Enables the planner's use of incremental sort steps." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის ინკრემენტული დáƒáƒšáƒáƒ’ების ნáƒáƒ‘იჯების გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:844 +msgid "Enables the planner's use of hashed aggregation plans." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის დáƒáƒ°áƒ”შიილი áƒáƒ’რეგáƒáƒªáƒ˜áƒ˜áƒ¡ გეგმების გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:854 +msgid "Enables the planner's use of materialization." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:864 +msgid "Enables the planner's use of memoization." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის მემáƒáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:874 +msgid "Enables the planner's use of nested-loop join plans." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის ერთმáƒáƒœáƒ”თში ჩáƒáƒšáƒáƒ’ებული მáƒáƒ áƒ§áƒ£áƒŸáƒ˜ შერწყმის გეგმების გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:884 +msgid "Enables the planner's use of merge join plans." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის შეერთების გეგმების შერწყმის გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:894 +msgid "Enables the planner's use of hash join plans." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის ჰეშის შეერთების გეგმების გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:904 +msgid "Enables the planner's use of gather merge plans." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის შერწყმის გეგმების შეგრáƒáƒ•ების გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:914 +msgid "Enables partitionwise join." +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ—ვáƒáƒšáƒ˜áƒ¡áƒ¬áƒ˜áƒœáƒ”ბით შეერთების ჩáƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:924 +msgid "Enables partitionwise aggregation and grouping." +msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ გáƒáƒ—ვáƒáƒšáƒ˜áƒ¡áƒ¬áƒ˜áƒœáƒ”ბით áƒáƒ’რეგáƒáƒªáƒ˜áƒ˜áƒ¡áƒ დრდáƒáƒ¯áƒ’უფებს ჩáƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:934 +msgid "Enables the planner's use of parallel append plans." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის პáƒáƒ áƒáƒšáƒ”ლური ბáƒáƒšáƒáƒ¨áƒ˜ მიწერის გეგმების გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:944 +msgid "Enables the planner's use of parallel hash plans." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ისთვის პáƒáƒ áƒáƒšáƒ”ლური ჰეშის გეგმების გáƒáƒ›áƒáƒ§áƒ”ნების უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:954 +msgid "Enables plan-time and execution-time partition pruning." +msgstr "" + +#: utils/misc/guc_tables.c:955 +msgid "Allows the query planner and executor to compare partition bounds to conditions in the query to determine which partitions must be scanned." +msgstr "" + +#: utils/misc/guc_tables.c:966 +msgid "Enables the planner's ability to produce plans that provide presorted input for ORDER BY / DISTINCT aggregate functions." +msgstr "" + +#: utils/misc/guc_tables.c:969 +msgid "Allows the query planner to build plans that provide presorted input for aggregate functions with an ORDER BY / DISTINCT clause. When disabled, implicit sorts are always performed during execution." +msgstr "" + +#: utils/misc/guc_tables.c:981 +msgid "Enables the planner's use of async append plans." +msgstr "" + +#: utils/misc/guc_tables.c:991 +msgid "Enables reordering of GROUP BY keys." +msgstr "გáƒáƒ¡áƒáƒ¦áƒ”ბის (GROUP BY) გáƒáƒ“áƒáƒšáƒáƒ’ების ჩáƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:1001 +msgid "Enables genetic query optimization." +msgstr "მáƒáƒ—ხáƒáƒ•ნების ზáƒáƒ’áƒáƒ“ი áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:1002 +msgid "This algorithm attempts to do planning without exhaustive searching." +msgstr "" + +#: utils/misc/guc_tables.c:1016 +msgid "Shows whether the current user is a superuser." +msgstr "áƒáƒ©áƒ•ენებს, áƒáƒ áƒ˜áƒ¡ მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი, თუ áƒáƒ áƒ." + +#: utils/misc/guc_tables.c:1031 +msgid "Allows running the ALTER SYSTEM command." +msgstr "" + +#: utils/misc/guc_tables.c:1032 +msgid "Can be set to off for environments where global configuration changes should be made using a different method." +msgstr "" + +#: utils/misc/guc_tables.c:1042 +msgid "Enables advertising the server via Bonjour." +msgstr "სერვისის Bonjour-ით გáƒáƒ›áƒáƒ¥áƒ•ეყნების ჩáƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:1051 +msgid "Collects transaction commit time." +msgstr "áƒáƒ’რáƒáƒ•ებს ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ“áƒáƒªáƒ”მის დრáƒáƒ¡." + +#: utils/misc/guc_tables.c:1060 +msgid "Enables SSL connections." +msgstr "SSL შეერთებების ჩáƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:1069 +msgid "Controls whether \"ssl_passphrase_command\" is called during server reload." +msgstr "" + +#: utils/misc/guc_tables.c:1078 +msgid "Give priority to server ciphersuite order." +msgstr "" + +#: utils/misc/guc_tables.c:1087 +msgid "Forces synchronization of updates to disk." +msgstr "დისკის გáƒáƒœáƒáƒ®áƒšáƒ”ბების ნáƒáƒ«áƒáƒšáƒáƒ“ევი სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ." + +#: utils/misc/guc_tables.c:1088 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." +msgstr "" + +#: utils/misc/guc_tables.c:1099 +msgid "Continues processing after a checksum failure." +msgstr "áƒáƒ’რძელებს დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒáƒ¡ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ჩáƒáƒ•áƒáƒ áƒ“ნის შემდეგ." + +#: utils/misc/guc_tables.c:1100 +msgid "Detection of a checksum failure normally causes PostgreSQL to report an error, aborting the current transaction. Setting ignore_checksum_failure to true causes the system to ignore the failure (but still report a warning), and continue processing. This behavior could cause crashes or other serious problems. Only has an effect if checksums are enabled." +msgstr "" + +#: utils/misc/guc_tables.c:1114 +msgid "Continues processing past damaged page headers." +msgstr "áƒáƒ’რძელებს დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒáƒ¡ დáƒáƒ–იáƒáƒœáƒ”ბული გვერდის თáƒáƒ•სáƒáƒ áƒ—ების შემდეგ." + +#: utils/misc/guc_tables.c:1115 +msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting \"zero_damaged_pages\" to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." +msgstr "" + +#: utils/misc/guc_tables.c:1128 +msgid "Continues recovery after an invalid pages failure." +msgstr "áƒáƒ’რძელებს áƒáƒ¦áƒ“გენáƒáƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გვერდის ჩáƒáƒ•áƒáƒ áƒ“ნების შემდეგ." + +#: utils/misc/guc_tables.c:1129 +msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting \"ignore_invalid_pages\" to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." +msgstr "" + +#: utils/misc/guc_tables.c:1147 +msgid "Writes full pages to WAL when first modified after a checkpoint." +msgstr "" + +#: utils/misc/guc_tables.c:1148 +msgid "A page write in process during an operating system crash might be only partially written to disk. During recovery, the row changes stored in WAL are not enough to recover. This option writes pages when first modified after a checkpoint to WAL so full recovery is possible." +msgstr "" + +#: utils/misc/guc_tables.c:1161 +msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." +msgstr "" + +#: utils/misc/guc_tables.c:1171 +msgid "Writes zeroes to new WAL files before first use." +msgstr "áƒáƒ®áƒáƒš WAL-ის ფáƒáƒ˜áƒšáƒ”ბში მáƒáƒ— პირველ გáƒáƒ›áƒáƒ§áƒ”ნებáƒáƒ›áƒ“ე ნულიáƒáƒœáƒ”ბის ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:1181 +msgid "Recycles WAL files by renaming them." +msgstr "WAL-ის ფáƒáƒ˜áƒšáƒ”ბის თáƒáƒ•იდáƒáƒœ გáƒáƒ›áƒáƒ§áƒ”ნებრმáƒáƒ—ი სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვით." + +#: utils/misc/guc_tables.c:1191 +msgid "Logs each checkpoint." +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილების ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:1200 +msgid "Logs each successful connection." +msgstr "ყáƒáƒ•ელი წáƒáƒ áƒ›áƒáƒ¢áƒ”ბული შესვლის ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:1209 +msgid "Logs details of pre-authentication connection handshake." +msgstr "ჩáƒáƒ˜áƒ¬áƒ”რს áƒáƒ•თენტიკáƒáƒªáƒ˜áƒáƒ›áƒ“ე მიერთების ხელის ჩáƒáƒ›áƒáƒ áƒ—მევის დეტáƒáƒšáƒ”ბს." + +#: utils/misc/guc_tables.c:1219 +msgid "Logs end of a session, including duration." +msgstr "სესიის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ, ხáƒáƒœáƒ’რძლივáƒáƒ‘ის ჩáƒáƒ áƒ—ვლით." + +#: utils/misc/guc_tables.c:1228 +msgid "Logs each replication command." +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ყáƒáƒ•ელი ბრძáƒáƒœáƒ”ბის ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:1237 +msgid "Shows whether the running server has assertion checks enabled." +msgstr "" + +#: utils/misc/guc_tables.c:1248 +msgid "Terminate session on any error." +msgstr "სესიის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბრნებისმიერი შეცდáƒáƒ›áƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜." + +#: utils/misc/guc_tables.c:1257 +msgid "Reinitialize server after backend crash." +msgstr "უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ¡ შემდეგ სერვერის თáƒáƒ•იდáƒáƒœ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ." + +#: utils/misc/guc_tables.c:1266 +msgid "Remove temporary files after backend crash." +msgstr "უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ¡ შემდეგ დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ." + +#: utils/misc/guc_tables.c:1276 +msgid "Send SIGABRT not SIGQUIT to child processes after backend crash." +msgstr "უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡ áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ¡ შემდეგ შვილი პრáƒáƒªáƒ”სებისთვის SIGQUIT-ის მáƒáƒ’იერ SIGABRT-ის გáƒáƒ’ზáƒáƒ•ნáƒ." + +#: utils/misc/guc_tables.c:1286 +msgid "Send SIGABRT not SIGKILL to stuck child processes." +msgstr "გáƒáƒ­áƒ”დილი შვილი პრáƒáƒªáƒ”სებისთვის SIGKILL-ის მáƒáƒ’იერ SIGABRT-ის გáƒáƒ’ზáƒáƒ•ნáƒ." + +#: utils/misc/guc_tables.c:1297 +msgid "Logs the duration of each completed SQL statement." +msgstr "თითáƒáƒ”ული დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბული SQL გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის ხáƒáƒœáƒ’რძლივáƒáƒ‘ის ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:1306 +msgid "Logs each query's parse tree." +msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ თითáƒáƒ”ული მáƒáƒ—ხáƒáƒ•ნის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების ხის ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:1315 +msgid "Logs each query's rewritten parse tree." +msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ თითáƒáƒ”ული მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ“áƒáƒ¬áƒ”რილი დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების ხის ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:1324 +msgid "Logs each query's execution plan." +msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ თითáƒáƒ”ული მáƒáƒ—ხáƒáƒ•ნის შესრულების გეგმის ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:1333 +msgid "Indents parse and plan tree displays." +msgstr "" + +#: utils/misc/guc_tables.c:1342 +msgid "Writes parser performance statistics to the server log." +msgstr "დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის წáƒáƒ áƒ›áƒáƒ“áƒáƒ‘ის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒáƒ¡ სერვერის ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რს." + +#: utils/misc/guc_tables.c:1351 +msgid "Writes planner performance statistics to the server log." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ის წáƒáƒ áƒ›áƒáƒ“áƒáƒ‘ის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒáƒ¡ სერვერის ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რს." + +#: utils/misc/guc_tables.c:1360 +msgid "Writes executor performance statistics to the server log." +msgstr "შემსრულებლის წáƒáƒ áƒ›áƒáƒ“áƒáƒ‘ის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒáƒ¡ სერვერის ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რს." + +#: utils/misc/guc_tables.c:1369 +msgid "Writes cumulative performance statistics to the server log." +msgstr "სáƒáƒ”რთრწáƒáƒ áƒ›áƒáƒ“áƒáƒ‘ის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒáƒ¡ სერვერის ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რს." + +#: utils/misc/guc_tables.c:1379 +msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." +msgstr "" + +#: utils/misc/guc_tables.c:1391 +msgid "Collects information about executing commands." +msgstr "áƒáƒ’რáƒáƒ•ებს ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒáƒ¡ ბრძáƒáƒœáƒ”ბების შესრულების შესáƒáƒ®áƒ”ბ." + +#: utils/misc/guc_tables.c:1392 +msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." +msgstr "" + +#: utils/misc/guc_tables.c:1402 +msgid "Collects statistics on database activity." +msgstr "áƒáƒ’რáƒáƒ•ებს სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒáƒ¡ ბáƒáƒ–ის áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ების შესáƒáƒ®áƒ”ბ." + +#: utils/misc/guc_tables.c:1411 +msgid "Collects timing statistics for database I/O activity." +msgstr "áƒáƒ’რáƒáƒ•ებს ბáƒáƒ–ის შეყვáƒáƒœáƒ/გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ების დრáƒáƒ˜áƒ— სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒáƒ¡." + +#: utils/misc/guc_tables.c:1420 +msgid "Collects timing statistics for WAL I/O activity." +msgstr "áƒáƒ’რáƒáƒ•ებს WAL-ის შეყვáƒáƒœáƒ/გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ების დრáƒáƒ˜áƒ— სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒáƒ¡." + +#: utils/misc/guc_tables.c:1430 +msgid "Updates the process title to show the active SQL command." +msgstr "გáƒáƒœáƒáƒ®áƒšáƒ”ბს პრáƒáƒªáƒ”სის სáƒáƒ—áƒáƒ£áƒ áƒ¡, რáƒáƒ—რმáƒáƒœ áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ SQL ბრძáƒáƒœáƒ”ბრáƒáƒ©áƒ•ენáƒáƒ¡." + +#: utils/misc/guc_tables.c:1431 +msgid "Enables updating of the process title every time a new SQL command is received by the server." +msgstr "" + +#: utils/misc/guc_tables.c:1440 +msgid "Starts the autovacuum subprocess." +msgstr "áƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის ქვეპრáƒáƒªáƒ”სის გáƒáƒ¨áƒ•ებáƒ." + +#: utils/misc/guc_tables.c:1450 +msgid "Generates debugging output for LISTEN and NOTIFY." +msgstr "LISTEN-ის დრNOTIFY-ის გáƒáƒ›áƒáƒ áƒ—ვის შეტყáƒáƒ‘ინებების გენერáƒáƒªáƒ˜áƒ." + +#: utils/misc/guc_tables.c:1462 +msgid "Emits information about lock usage." +msgstr "ბლáƒáƒ™áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნების შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ." + +#: utils/misc/guc_tables.c:1472 +msgid "Emits information about user lock usage." +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ბლáƒáƒ™áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნების შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ." + +#: utils/misc/guc_tables.c:1482 +msgid "Emits information about lightweight lock usage." +msgstr "მსუბუქი ბლáƒáƒ™áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნების შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ." + +#: utils/misc/guc_tables.c:1492 +msgid "Dumps information about all current locks when a deadlock timeout occurs." +msgstr "" + +#: utils/misc/guc_tables.c:1504 +msgid "Logs long lock waits." +msgstr "ბლáƒáƒ™áƒ˜áƒ áƒ”ბის დიდხნიáƒáƒœáƒ˜áƒ ლáƒáƒ“ინის ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:1513 +msgid "Logs standby recovery conflict waits." +msgstr "მáƒáƒ›áƒšáƒáƒ“ინის áƒáƒ¦áƒ“გენის კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜áƒ¡ ლáƒáƒ“ინების ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:1522 +msgid "Logs the host name in the connection logs." +msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლის ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:1523 +msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." +msgstr "" + +#: utils/misc/guc_tables.c:1534 +msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." +msgstr "\"expr=NULL\" მიღებული იქნებáƒ, რáƒáƒ’áƒáƒ áƒª \"expr IS NULL\"." + +#: utils/misc/guc_tables.c:1535 +msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." +msgstr "" + +#: utils/misc/guc_tables.c:1547 +msgid "Sets the default read-only status of new transactions." +msgstr "áƒáƒ®áƒáƒšáƒ˜ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის მხáƒáƒšáƒáƒ“ კითხვáƒáƒ“áƒáƒ‘ის სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ ნáƒáƒ’ულისხმევáƒáƒ“ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:1557 +msgid "Sets the current transaction's read-only status." +msgstr "მიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ მხáƒáƒšáƒáƒ“-კითხვáƒáƒ“áƒáƒ‘ის სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:1567 +msgid "Sets the default deferrable status of new transactions." +msgstr "" + +#: utils/misc/guc_tables.c:1576 +msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." +msgstr "" + +#: utils/misc/guc_tables.c:1586 +msgid "Enable row security." +msgstr "მწკრივების უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჩáƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:1587 +msgid "When enabled, row security will be applied to all users." +msgstr "თუ ჩáƒáƒ áƒ—áƒáƒ•თ, მწკრივის უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბრყველრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელზე გáƒáƒ“áƒáƒ¢áƒáƒ áƒ“ებáƒ." + +#: utils/misc/guc_tables.c:1595 +msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." +msgstr "ქვეპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ სხეულების შემáƒáƒ¬áƒ›áƒ”ბრCREATE FUNCTION-ის დრCREATE PROCEDURE-ის დრáƒáƒ¡." + +#: utils/misc/guc_tables.c:1604 +msgid "Enable input of NULL elements in arrays." +msgstr "მáƒáƒ¡áƒ˜áƒ•ებში NULL ტიპის ელემენტების შეყვáƒáƒœáƒ˜áƒ¡ ჩáƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:1605 +msgid "When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally." +msgstr "" + +#: utils/misc/guc_tables.c:1621 +msgid "WITH OIDS is no longer supported; this can only be false." +msgstr "WITH OIDS მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ¦áƒáƒ áƒáƒ. ის ყáƒáƒ•ელთვის ნულის ტáƒáƒšáƒ˜áƒ." + +#: utils/misc/guc_tables.c:1631 +msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." +msgstr "" + +#: utils/misc/guc_tables.c:1640 +msgid "Truncate existing log files of same name during log rotation." +msgstr "" + +#: utils/misc/guc_tables.c:1651 +msgid "Emit information about resource usage in sorting." +msgstr "ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დáƒáƒšáƒáƒ’ების მიერ რესურსების გáƒáƒ›áƒáƒ§áƒ”ნების შესáƒáƒ®áƒ”ბ." + +#: utils/misc/guc_tables.c:1665 +msgid "Generate debugging output for synchronized scanning." +msgstr "სინქრáƒáƒœáƒ˜áƒ–ებული სკáƒáƒœáƒ˜áƒ áƒ”ბის შესáƒáƒ®áƒ”ბ გáƒáƒ›áƒáƒ áƒ—ვის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ." + +#: utils/misc/guc_tables.c:1680 +msgid "Enable bounded sorting using heap sort." +msgstr "" + +#: utils/misc/guc_tables.c:1693 +msgid "Emit WAL-related debugging output." +msgstr "'WAL'-თáƒáƒœ დáƒáƒ™áƒáƒ•შირებული გáƒáƒ›áƒáƒ áƒ—ვის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ." + +#: utils/misc/guc_tables.c:1705 +msgid "Shows whether datetimes are integer based." +msgstr "áƒáƒ©áƒ•ენებს, áƒáƒ áƒ˜áƒ¡ თუ áƒáƒ áƒ თáƒáƒ áƒ˜áƒ¦áƒ˜ დრდრრმთელი რიცხვი." + +#: utils/misc/guc_tables.c:1716 +msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." +msgstr "იქნებრKerberos-ის დრGSSAPI-ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლები რეგისტრზე-დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებული, თუ áƒáƒ áƒ." + +#: utils/misc/guc_tables.c:1726 +msgid "Sets whether GSSAPI delegation should be accepted from the client." +msgstr "მივიღებთ კლიენტიდáƒáƒœ GSSAPI-ის დელეგáƒáƒªáƒ˜áƒáƒ¡, თუ áƒáƒ áƒ." + +#: utils/misc/guc_tables.c:1736 +msgid "Warn about backslash escapes in ordinary string literals." +msgstr "" + +#: utils/misc/guc_tables.c:1746 +msgid "Causes '...' strings to treat backslashes literally." +msgstr "" + +#: utils/misc/guc_tables.c:1757 +msgid "Enable synchronized sequential scans." +msgstr "სინქრáƒáƒœáƒ£áƒšáƒ˜ მიმდევრáƒáƒ‘ითი სკáƒáƒœáƒ˜áƒ áƒ”ბების ჩáƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:1767 +msgid "Sets whether to include or exclude transaction with recovery target." +msgstr "áƒáƒ§áƒ”ნებს იქნებრჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ áƒáƒ¦áƒ“გენის სáƒáƒ›áƒ˜áƒ–ნესთáƒáƒœ ერთáƒáƒ“, თუ áƒáƒ áƒ." + +#: utils/misc/guc_tables.c:1777 +msgid "Starts the WAL summarizer process to enable incremental backup." +msgstr "" + +#: utils/misc/guc_tables.c:1787 +msgid "Allows connections and queries during recovery." +msgstr "áƒáƒ¦áƒ“გენისáƒáƒ¡ მიერთებების დრმáƒáƒ—ხáƒáƒ•ნების დáƒáƒ¨áƒ•ებáƒ." + +#: utils/misc/guc_tables.c:1797 +msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." +msgstr "" + +#: utils/misc/guc_tables.c:1807 +msgid "Shows whether hot standby is currently active." +msgstr "áƒáƒ©áƒ•ენებს, áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ ცხელი მáƒáƒ›áƒšáƒáƒ“ინე áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ, თუ áƒáƒ áƒ." + +#: utils/misc/guc_tables.c:1818 +msgid "Allows modifications of the structure of system tables." +msgstr "სისტემური ცხრილების სტრუქტურის ცვლილების დáƒáƒ¨áƒ•ებáƒ." + +#: utils/misc/guc_tables.c:1829 +msgid "Disables reading from system indexes." +msgstr "სისტემური ინდექსებიდáƒáƒœ კითხვის გáƒáƒ›áƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:1830 +msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." +msgstr "ის ინდექსების გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒáƒ¡ ხელს áƒáƒ  უშლის, áƒáƒ¡áƒ” რáƒáƒ›, გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ. ყველáƒáƒ–ე ცუდი, რáƒáƒª სჭირს, ნელიáƒ." + +#: utils/misc/guc_tables.c:1841 +msgid "Allows tablespaces directly inside pg_tblspc, for testing." +msgstr "გáƒáƒ›áƒáƒ¡áƒáƒªáƒ“ელáƒáƒ“ ცხრილის სივრცეების პირდáƒáƒžáƒ˜áƒ  ph_tblspc-ში დáƒáƒ¨áƒ•ებáƒ." + +#: utils/misc/guc_tables.c:1852 +msgid "Enables backward compatibility mode for privilege checks on large objects." +msgstr "დიდი áƒáƒ‘იექტების პრივილეგიების შემáƒáƒ¬áƒ›áƒ”ბის წინრვერსიებთáƒáƒœ თáƒáƒ•სებáƒáƒ“ი რეჟიმის ჩáƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:1853 +msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." +msgstr "PostgreSQL-ის 9.0 დრუფრრძველ ვერსიებთáƒáƒœ თáƒáƒ•სებáƒáƒ“áƒáƒ‘ისთვის პრივილეგიების შემáƒáƒ¬áƒ›áƒ”ბის გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ, დიდი áƒáƒ‘იექტების კითხვისრდრშეცვლისáƒáƒ¡." + +#: utils/misc/guc_tables.c:1863 +msgid "When generating SQL fragments, quote all identifiers." +msgstr "SQL ფრáƒáƒ’მენტების გენერáƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡ ყველრიდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ბრჭყáƒáƒšáƒ”ბში ჩáƒáƒ¡áƒ›áƒ." + +#: utils/misc/guc_tables.c:1873 +msgid "Shows whether data checksums are turned on for this cluster." +msgstr "áƒáƒ©áƒ•ენებს, áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რზე მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი ჩáƒáƒ áƒ—ულიáƒ, თუ áƒáƒ áƒ." + +#: utils/misc/guc_tables.c:1884 +msgid "Add sequence number to syslog messages to avoid duplicate suppression." +msgstr "დუბლირებული შეტყáƒáƒ‘ინებების შეკვეცის თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ ჟურნáƒáƒšáƒ¨áƒ˜ გáƒáƒ’ზáƒáƒ•ნილი შეტყáƒáƒ‘ინებებისთვის მიმდევრáƒáƒ‘ის ნáƒáƒ›áƒ áƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბáƒ." + +#: utils/misc/guc_tables.c:1894 +msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." +msgstr "Syslog-ისთვის გáƒáƒ’ზáƒáƒ•ნილი შეტყáƒáƒ‘ინებების დáƒáƒ­áƒ áƒ დრ1024 ბáƒáƒ˜áƒ¢áƒ¨áƒ˜ ჩáƒáƒ¢áƒ”ვáƒ." + +#: utils/misc/guc_tables.c:1904 +msgid "Controls whether Gather and Gather Merge also run subplans." +msgstr "" + +#: utils/misc/guc_tables.c:1905 +msgid "Should gather nodes also run subplans or just gather tuples?" +msgstr "" + +#: utils/misc/guc_tables.c:1915 +msgid "Allow JIT compilation." +msgstr "JIT კáƒáƒ›áƒžáƒ˜áƒšáƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:1926 +msgid "Register JIT-compiled functions with debugger." +msgstr "JIT-ით კáƒáƒ›áƒžáƒ˜áƒšáƒ˜áƒ áƒ”ბული ფუნქციების გáƒáƒ›áƒ›áƒáƒ áƒ—ველთáƒáƒœ რეგისტრáƒáƒªáƒ˜áƒ." + +#: utils/misc/guc_tables.c:1943 +msgid "Write out LLVM bitcode to facilitate JIT debugging." +msgstr "" + +#: utils/misc/guc_tables.c:1954 +msgid "Allow JIT compilation of expressions." +msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბების JIT კáƒáƒ›áƒžáƒ˜áƒšáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¨áƒ•ებáƒ." + +#: utils/misc/guc_tables.c:1965 +msgid "Register JIT-compiled functions with perf profiler." +msgstr "" + +#: utils/misc/guc_tables.c:1982 +msgid "Allow JIT compilation of tuple deforming." +msgstr "კáƒáƒ áƒ¢áƒ”ჟის დეფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ JIT კáƒáƒ›áƒžáƒ˜áƒšáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¨áƒ•ებáƒ." + +#: utils/misc/guc_tables.c:1993 +msgid "Whether to continue running after a failure to sync data files." +msgstr "გáƒáƒ’რძელდებრმუშáƒáƒáƒ‘რმáƒáƒœáƒáƒªáƒ”მის ფáƒáƒ˜áƒšáƒ”ბის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ•áƒáƒ áƒ“ნის შემდეგ, თუ áƒáƒ áƒ." + +#: utils/misc/guc_tables.c:2002 +msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." +msgstr "" + +#: utils/misc/guc_tables.c:2011 +msgid "Enables event triggers." +msgstr "ჩáƒáƒ áƒ—áƒáƒ•ს მáƒáƒ•ლენის ტრიგერებს." + +#: utils/misc/guc_tables.c:2012 +msgid "When enabled, event triggers will fire for all applicable statements." +msgstr "" + +#: utils/misc/guc_tables.c:2021 +msgid "Enables a physical standby to synchronize logical failover slots from the primary server." +msgstr "" + +#: utils/misc/guc_tables.c:2039 +msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." +msgstr "" + +#: utils/misc/guc_tables.c:2050 +msgid "Sets the amount of time to wait after authentication on connection startup." +msgstr "" + +#: utils/misc/guc_tables.c:2052 utils/misc/guc_tables.c:2774 +msgid "This allows attaching a debugger to the process." +msgstr "პრáƒáƒªáƒ”სისთვის გáƒáƒ›áƒ›áƒáƒ áƒ—ველის მიბმის უფლების მიცემáƒ." + +#: utils/misc/guc_tables.c:2061 +msgid "Sets the default statistics target." +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ ნáƒáƒ’ულისხმევი სáƒáƒ›áƒ˜áƒ–ნის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2062 +msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." +msgstr "" + +#: utils/misc/guc_tables.c:2071 +msgid "Sets the FROM-list size beyond which subqueries are not collapsed." +msgstr "" + +#: utils/misc/guc_tables.c:2073 +msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." +msgstr "" + +#: utils/misc/guc_tables.c:2084 +msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." +msgstr "" + +#: utils/misc/guc_tables.c:2086 +msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." +msgstr "" + +#: utils/misc/guc_tables.c:2097 +msgid "Sets the threshold of FROM items beyond which GEQO is used." +msgstr "" + +#: utils/misc/guc_tables.c:2107 +msgid "GEQO: effort is used to set the default for other GEQO parameters." +msgstr "" + +#: utils/misc/guc_tables.c:2117 +msgid "GEQO: number of individuals in the population." +msgstr "GEQO: ინდივიდების რáƒáƒáƒ“ენáƒáƒ‘რპáƒáƒžáƒ£áƒšáƒáƒªáƒ˜áƒáƒ¨áƒ˜." + +#: utils/misc/guc_tables.c:2118 utils/misc/guc_tables.c:2128 +msgid "Zero selects a suitable default value." +msgstr "ნული შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡ ნáƒáƒ’ულისხმევ მნიშვნელáƒáƒ‘áƒáƒ¡ áƒáƒ˜áƒ áƒ©áƒ”ვს." + +#: utils/misc/guc_tables.c:2127 +msgid "GEQO: number of iterations of the algorithm." +msgstr "GEQO: áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მის იტერáƒáƒªáƒ˜áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘áƒ." + +#: utils/misc/guc_tables.c:2139 +msgid "Sets the time to wait on a lock before checking for deadlock." +msgstr "" + +#: utils/misc/guc_tables.c:2150 +msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." +msgstr "" + +#: utils/misc/guc_tables.c:2161 +msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." +msgstr "" + +#: utils/misc/guc_tables.c:2172 +msgid "Sets the minimum delay for applying changes during recovery." +msgstr "áƒáƒ¦áƒ“გენისáƒáƒ¡ ცვლილებების გáƒáƒ“áƒáƒ¢áƒáƒ áƒ”ბის მინიმáƒáƒšáƒ£áƒ áƒ˜ დáƒáƒ§áƒáƒ•ნების დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2183 +msgid "Sets the maximum interval between WAL receiver status reports to the sending server." +msgstr "" + +#: utils/misc/guc_tables.c:2194 +msgid "Sets the maximum wait time to receive data from the sending server." +msgstr "" + +#: utils/misc/guc_tables.c:2205 +msgid "Sets the maximum number of concurrent connections." +msgstr "áƒáƒ§áƒ”ნებს ერთდრáƒáƒ£áƒšáƒ˜ შეერთებების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ  რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ¡." + +#: utils/misc/guc_tables.c:2216 +msgid "Sets the number of connection slots reserved for superusers." +msgstr "áƒáƒ§áƒ”ნებს ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებისთვის რეზერვირებული შეერთების სლáƒáƒ¢áƒ”ბს." + +#: utils/misc/guc_tables.c:2226 +msgid "Sets the number of connection slots reserved for roles with privileges of pg_use_reserved_connections." +msgstr "" + +#: utils/misc/guc_tables.c:2237 +msgid "Amount of dynamic shared memory reserved at startup." +msgstr "გáƒáƒ¨áƒ•ებისáƒáƒ¡ დáƒáƒ áƒ”ზერვებული დინáƒáƒ›áƒ˜áƒ£áƒ áƒ˜ გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების რáƒáƒáƒ“ენáƒáƒ‘áƒ." + +#: utils/misc/guc_tables.c:2252 +msgid "Sets the number of shared memory buffers used by the server." +msgstr "სერვერის მიერ გáƒáƒ›áƒáƒ§áƒ”ნებული გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების ბáƒáƒ¤áƒ”რების რáƒáƒáƒ“ენáƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2263 +msgid "Sets the buffer pool size for VACUUM, ANALYZE, and autovacuum." +msgstr "ბუფერი პულის ზáƒáƒ›áƒ VACUUM, ANALYZE დრáƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისთვის." + +#: utils/misc/guc_tables.c:2274 +msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." +msgstr "" + +#: utils/misc/guc_tables.c:2285 +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "" + +#: utils/misc/guc_tables.c:2286 +msgid "-1 indicates that the value could not be determined." +msgstr "-1 ნიშნáƒáƒ•ს, რáƒáƒ› მნიშვნელáƒáƒ‘რვერ გáƒáƒœáƒ˜áƒ¡áƒáƒ–ღვრáƒ." + +#: utils/misc/guc_tables.c:2296 +msgid "Sets the size of the dedicated buffer pool used for the commit timestamp cache." +msgstr "" + +#: utils/misc/guc_tables.c:2297 utils/misc/guc_tables.c:2352 utils/misc/guc_tables.c:2363 +msgid "Specify 0 to have this value determined as a fraction of shared_buffers." +msgstr "" + +#: utils/misc/guc_tables.c:2307 +msgid "Sets the size of the dedicated buffer pool used for the MultiXact member cache." +msgstr "" + +#: utils/misc/guc_tables.c:2318 +msgid "Sets the size of the dedicated buffer pool used for the MultiXact offset cache." +msgstr "" + +#: utils/misc/guc_tables.c:2329 +msgid "Sets the size of the dedicated buffer pool used for the LISTEN/NOTIFY message cache." +msgstr "" + +#: utils/misc/guc_tables.c:2340 +msgid "Sets the size of the dedicated buffer pool used for the serializable transaction cache." +msgstr "" + +#: utils/misc/guc_tables.c:2351 +msgid "Sets the size of the dedicated buffer pool used for the sub-transaction cache." +msgstr "" + +#: utils/misc/guc_tables.c:2362 +msgid "Sets the size of the dedicated buffer pool used for the transaction status cache." +msgstr "" + +#: utils/misc/guc_tables.c:2373 +msgid "Sets the maximum number of temporary buffers used by each session." +msgstr "" + +#: utils/misc/guc_tables.c:2384 +msgid "Sets the TCP port the server listens on." +msgstr "TCP პáƒáƒ áƒ¢áƒ˜áƒ¡ მითითებáƒ, რáƒáƒ›áƒ”ლზეც სერვერი უსმენს." + +#: utils/misc/guc_tables.c:2394 +msgid "Sets the access permissions of the Unix-domain socket." +msgstr "Unix-დáƒáƒ›áƒ”ნის სáƒáƒ™áƒ”ტზე წვდáƒáƒ›áƒ˜áƒ¡ უფლებების დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2395 +msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" +msgstr "" + +#: utils/misc/guc_tables.c:2409 +msgid "Sets the file permissions for log files." +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის წვდáƒáƒ›áƒ”ბის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2410 +msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" +msgstr "" + +#: utils/misc/guc_tables.c:2424 +msgid "Shows the mode of the data directory." +msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წვდáƒáƒ›áƒ˜áƒ¡ ჩვენებáƒ." + +#: utils/misc/guc_tables.c:2425 +msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" +msgstr "" + +#: utils/misc/guc_tables.c:2438 +msgid "Sets the maximum memory to be used for query workspaces." +msgstr "მáƒáƒ—ხáƒáƒ•ნის სáƒáƒ›áƒ£áƒ¨áƒáƒ სივრცის მიერ გáƒáƒ›áƒáƒ§áƒ”ნებული მეხსიერების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2439 +msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." +msgstr "" + +#: utils/misc/guc_tables.c:2451 +msgid "Sets the maximum memory to be used for maintenance operations." +msgstr "ტექნიკური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბისთვის გáƒáƒ›áƒáƒ§áƒ”ნებული მეხსიერების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2452 +msgid "This includes operations such as VACUUM and CREATE INDEX." +msgstr "მáƒáƒ˜áƒªáƒáƒ•ს ისეთ áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბს, რáƒáƒ’áƒáƒ áƒ”ბიცáƒáƒ VACUUM დრCREATE INDEX." + +#: utils/misc/guc_tables.c:2462 +msgid "Sets the maximum memory to be used for logical decoding." +msgstr "ლáƒáƒ’იკური გáƒáƒ¨áƒ˜áƒ¤áƒ•რისთვის გáƒáƒ›áƒáƒ§áƒ”ნებული მეხსიერების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2463 +msgid "This much memory can be used by each internal reorder buffer before spilling to disk." +msgstr "" + +#: utils/misc/guc_tables.c:2479 +msgid "Sets the maximum stack depth, in kilobytes." +msgstr "სტეკის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიღრმე კილáƒáƒ‘áƒáƒ˜áƒ¢áƒ”ბში." + +#: utils/misc/guc_tables.c:2490 +msgid "Limits the total size of all temporary files used by each process." +msgstr "" + +#: utils/misc/guc_tables.c:2491 +msgid "-1 means no limit." +msgstr "-1 ნიშნáƒáƒ•ს ლიმიტის გáƒáƒ áƒ”შე." + +#: utils/misc/guc_tables.c:2501 +msgid "Vacuum cost for a page found in the buffer cache." +msgstr "ბáƒáƒ¤áƒ”რის ქეშში ნáƒáƒžáƒáƒ•ნი გვერდის მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის ფáƒáƒ¡áƒ˜." + +#: utils/misc/guc_tables.c:2511 +msgid "Vacuum cost for a page not found in the buffer cache." +msgstr "ბáƒáƒ¤áƒ”რის ქეშში გვერდის მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის ფáƒáƒ¡áƒ˜ ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ." + +#: utils/misc/guc_tables.c:2521 +msgid "Vacuum cost for a page dirtied by vacuum." +msgstr "" + +#: utils/misc/guc_tables.c:2531 +msgid "Vacuum cost amount available before napping." +msgstr "" + +#: utils/misc/guc_tables.c:2541 +msgid "Vacuum cost amount available before napping, for autovacuum." +msgstr "" + +#: utils/misc/guc_tables.c:2551 +msgid "Sets the maximum number of simultaneously open files for each server process." +msgstr "" + +#: utils/misc/guc_tables.c:2564 +msgid "Sets the maximum number of simultaneously prepared transactions." +msgstr "" + +#: utils/misc/guc_tables.c:2575 +msgid "Sets the minimum OID of tables for tracking locks." +msgstr "" + +#: utils/misc/guc_tables.c:2576 +msgid "Is used to avoid output on system tables." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრსისტემურ ცხრილებზე გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“." + +#: utils/misc/guc_tables.c:2585 +msgid "Sets the OID of the table with unconditionally lock tracing." +msgstr "" + +#: utils/misc/guc_tables.c:2597 +msgid "Sets the maximum allowed duration of any statement." +msgstr "áƒáƒ§áƒ”ნებს ნებისმიერი გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის დáƒáƒ¨áƒ•ებულ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ  ხáƒáƒœáƒ’რძლივáƒáƒ‘áƒáƒ¡." + +#: utils/misc/guc_tables.c:2598 utils/misc/guc_tables.c:2609 utils/misc/guc_tables.c:2620 utils/misc/guc_tables.c:2631 utils/misc/guc_tables.c:2642 +msgid "A value of 0 turns off the timeout." +msgstr "0 მáƒáƒšáƒáƒ“ინის ვáƒáƒ“áƒáƒ¡ გáƒáƒ›áƒáƒ áƒ—áƒáƒ•ს." + +#: utils/misc/guc_tables.c:2608 +msgid "Sets the maximum allowed duration of any wait for a lock." +msgstr "áƒáƒ§áƒ”ნებს ბლáƒáƒ™áƒ˜áƒ áƒ”ბის ნებისმიერი მáƒáƒšáƒáƒ“ინისთვის დáƒáƒ¨áƒ•ებულ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ  ხáƒáƒœáƒ’რძლივáƒáƒ‘áƒáƒ¡." + +#: utils/misc/guc_tables.c:2619 +msgid "Sets the maximum allowed idle time between queries, when in a transaction." +msgstr "áƒáƒ§áƒ”ნებს მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ  დáƒáƒ§áƒáƒ•ნებáƒáƒ¡ მáƒáƒ—ხáƒáƒ•ნებს შáƒáƒ áƒ˜áƒ¡, რáƒáƒªáƒ ის ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜áƒ." + +#: utils/misc/guc_tables.c:2630 +msgid "Sets the maximum allowed duration of any transaction within a session (not a prepared transaction)." +msgstr "áƒáƒ§áƒ”ნებს მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ  დáƒáƒ¨áƒ•ებულ ხáƒáƒœáƒ’რძლივáƒáƒ‘áƒáƒ¡ ნებისმიერი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სესიის შიგნით (მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ áƒáƒ áƒáƒ)." + +#: utils/misc/guc_tables.c:2641 +msgid "Sets the maximum allowed idle time between queries, when not in a transaction." +msgstr "áƒáƒ§áƒ”ნებს მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ  დáƒáƒ§áƒáƒ•ნებáƒáƒ¡ მáƒáƒ—ხáƒáƒ•ნებს შáƒáƒ áƒ˜áƒ¡, რáƒáƒªáƒ ის ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜ áƒáƒ áƒáƒ." + +#: utils/misc/guc_tables.c:2652 +msgid "Minimum age at which VACUUM should freeze a table row." +msgstr "" + +#: utils/misc/guc_tables.c:2662 +msgid "Age at which VACUUM should scan whole table to freeze tuples." +msgstr "" + +#: utils/misc/guc_tables.c:2672 +msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." +msgstr "" + +#: utils/misc/guc_tables.c:2682 +msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." +msgstr "" + +#: utils/misc/guc_tables.c:2692 +msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "" + +#: utils/misc/guc_tables.c:2701 +msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "" + +#: utils/misc/guc_tables.c:2714 +msgid "Sets the maximum number of locks per transaction." +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜ ბლáƒáƒ™áƒ”ბის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2715 +msgid "The shared lock table is sized on the assumption that at most \"max_locks_per_transaction\" objects per server process or prepared transaction will need to be locked at any one time." +msgstr "" + +#: utils/misc/guc_tables.c:2726 +msgid "Sets the maximum number of predicate locks per transaction." +msgstr "" + +#: utils/misc/guc_tables.c:2727 +msgid "The shared predicate lock table is sized on the assumption that at most \"max_pred_locks_per_transaction\" objects per server process or prepared transaction will need to be locked at any one time." +msgstr "" + +#: utils/misc/guc_tables.c:2738 +msgid "Sets the maximum number of predicate-locked pages and tuples per relation." +msgstr "" + +#: utils/misc/guc_tables.c:2739 +msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." +msgstr "" + +#: utils/misc/guc_tables.c:2749 +msgid "Sets the maximum number of predicate-locked tuples per page." +msgstr "" + +#: utils/misc/guc_tables.c:2750 +msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." +msgstr "" + +#: utils/misc/guc_tables.c:2760 +msgid "Sets the maximum allowed time to complete client authentication." +msgstr "კლიენტის áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბისთვის დáƒáƒ¨áƒ•ებული მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ დრáƒáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2772 +msgid "Sets the amount of time to wait before authentication on connection startup." +msgstr "" + +#: utils/misc/guc_tables.c:2784 +msgid "Sets the maximum number of allocated pages for NOTIFY / LISTEN queue." +msgstr "áƒáƒ§áƒ”ნებს გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ გვერდების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ  რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ¡ NOTIFY / LISTEN რიგისთვის." + +#: utils/misc/guc_tables.c:2794 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "áƒáƒ¦áƒ“გენისáƒáƒ¡ WAL-ში წინáƒáƒ¡áƒ¬áƒáƒ -კითხვის ბáƒáƒ¤áƒ”რის ზáƒáƒ›áƒ." + +#: utils/misc/guc_tables.c:2795 +msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "" + +#: utils/misc/guc_tables.c:2805 +msgid "Sets the size of WAL files held for standby servers." +msgstr "მáƒáƒ›áƒšáƒáƒ“ინე სერვერებისთვის WAL ფáƒáƒ˜áƒšáƒ”ბისთვის შენáƒáƒ®áƒ£áƒšáƒ˜ ზáƒáƒ›áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2816 +msgid "Sets the minimum size to shrink the WAL to." +msgstr "WAL-ის შემცირების მინიმáƒáƒšáƒ£áƒ áƒ˜ ზáƒáƒ›áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2828 +msgid "Sets the WAL size that triggers a checkpoint." +msgstr "áƒáƒ§áƒ”ნებს WAL-ის ზáƒáƒ›áƒáƒ¡, რáƒáƒ›áƒ”ლიც სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილს áƒáƒ¢áƒ áƒ˜áƒ’ერებს." + +#: utils/misc/guc_tables.c:2840 +msgid "Sets the maximum time between automatic WAL checkpoints." +msgstr "áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ WAL სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილებს შáƒáƒ áƒ˜áƒ¡ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ დრáƒáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2851 +msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." +msgstr "" + +#: utils/misc/guc_tables.c:2853 +msgid "Write a message to the server log if checkpoints caused by the filling of WAL segment files happen more frequently than this amount of time. Zero turns off the warning." +msgstr "" + +#: utils/misc/guc_tables.c:2866 utils/misc/guc_tables.c:3084 utils/misc/guc_tables.c:3138 +msgid "Number of pages after which previously performed writes are flushed to disk." +msgstr "" + +#: utils/misc/guc_tables.c:2877 +msgid "Sets the number of disk-page buffers in shared memory for WAL." +msgstr "" + +#: utils/misc/guc_tables.c:2878 +msgid "Specify -1 to have this value determined as a fraction of shared_buffers." +msgstr "" + +#: utils/misc/guc_tables.c:2888 +msgid "Time between WAL flushes performed in the WAL writer." +msgstr "" + +#: utils/misc/guc_tables.c:2899 +msgid "Amount of WAL written out by WAL writer that triggers a flush." +msgstr "" + +#: utils/misc/guc_tables.c:2910 +msgid "Minimum size of new file to fsync instead of writing WAL." +msgstr "" + +#: utils/misc/guc_tables.c:2921 +msgid "Sets the maximum number of simultaneously running WAL sender processes." +msgstr "" + +#: utils/misc/guc_tables.c:2932 +msgid "Sets the maximum number of simultaneously defined replication slots." +msgstr "" + +#: utils/misc/guc_tables.c:2942 +msgid "Sets the maximum WAL size that can be reserved by replication slots." +msgstr "" + +#: utils/misc/guc_tables.c:2943 +msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." +msgstr "" + +#: utils/misc/guc_tables.c:2955 +msgid "Sets the maximum time to wait for WAL replication." +msgstr "WAL რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒšáƒáƒ“ინის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ვáƒáƒ“ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:2966 +msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." +msgstr "" + +#: utils/misc/guc_tables.c:2978 +msgid "Sets the minimum number of concurrent open transactions required before performing \"commit_delay\"." +msgstr "დáƒáƒáƒ§áƒ”ნებს \"commit_delay\"-ის შესრულებáƒáƒ›áƒ“ე სáƒáƒ­áƒ˜áƒ áƒ ერთდრáƒáƒ£áƒšáƒ˜ ღირტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის მინიმáƒáƒšáƒ£áƒ  რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ¡." + +#: utils/misc/guc_tables.c:2989 +msgid "Sets the number of digits displayed for floating-point values." +msgstr "" + +#: utils/misc/guc_tables.c:2990 +msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." +msgstr "" + +#: utils/misc/guc_tables.c:3002 +msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." +msgstr "" + +#: utils/misc/guc_tables.c:3005 +msgid "Zero logs a sample of all queries. -1 turns this feature off." +msgstr "" + +#: utils/misc/guc_tables.c:3015 +msgid "Sets the minimum execution time above which all statements will be logged." +msgstr "" + +#: utils/misc/guc_tables.c:3017 +msgid "Zero prints all queries. -1 turns this feature off." +msgstr "0-ს ყველრმáƒáƒ—ხáƒáƒ•ნრგáƒáƒ›áƒáƒáƒ¥áƒ•ს, -1 გáƒáƒ›áƒáƒ áƒ—áƒáƒ•ს áƒáƒ› ფუნქციáƒáƒ¡." + +#: utils/misc/guc_tables.c:3027 +msgid "Sets the minimum execution time above which autovacuum actions will be logged." +msgstr "" + +#: utils/misc/guc_tables.c:3029 +msgid "Zero prints all actions. -1 turns autovacuum logging off." +msgstr "0-ს ყველრქმედებრგáƒáƒ›áƒáƒáƒ¥áƒ•ს. -1 გáƒáƒ›áƒáƒ áƒ—áƒáƒ•ს áƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒáƒ¡." + +#: utils/misc/guc_tables.c:3039 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." +msgstr "" + +#: utils/misc/guc_tables.c:3041 utils/misc/guc_tables.c:3053 +msgid "-1 to print values in full." +msgstr "-1 მნიშვნელáƒáƒ‘ების სრულáƒáƒ“ გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒáƒ“." + +#: utils/misc/guc_tables.c:3051 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." +msgstr "" + +#: utils/misc/guc_tables.c:3063 +msgid "Background writer sleep time between rounds." +msgstr "" + +#: utils/misc/guc_tables.c:3074 +msgid "Background writer maximum number of LRU pages to flush per round." +msgstr "" + +#: utils/misc/guc_tables.c:3097 +msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." +msgstr "" + +#: utils/misc/guc_tables.c:3111 +msgid "A variant of \"effective_io_concurrency\" that is used for maintenance work." +msgstr "" + +#: utils/misc/guc_tables.c:3126 +msgid "Limit on the size of data reads and writes." +msgstr "" + +#: utils/misc/guc_tables.c:3151 +msgid "Maximum number of concurrent worker processes." +msgstr "ერთდრáƒáƒ£áƒšáƒáƒ“ გáƒáƒ¨áƒ•ებული დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ." + +#: utils/misc/guc_tables.c:3163 +msgid "Maximum number of logical replication worker processes." +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ." + +#: utils/misc/guc_tables.c:3175 +msgid "Maximum number of table synchronization workers per subscription." +msgstr "თითáƒáƒ”ული გáƒáƒ›áƒáƒ¬áƒ”რის ცხრილის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ." + +#: utils/misc/guc_tables.c:3187 +msgid "Maximum number of parallel apply workers per subscription." +msgstr "თითáƒáƒ”ული გáƒáƒ›áƒáƒ¬áƒ”რის პáƒáƒ áƒáƒšáƒ”ლური გáƒáƒ“áƒáƒ¢áƒáƒ áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ." + +#: utils/misc/guc_tables.c:3197 +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "" + +#: utils/misc/guc_tables.c:3209 +msgid "Sets the maximum size a log file can reach before being rotated." +msgstr "" + +#: utils/misc/guc_tables.c:3221 +msgid "Shows the maximum number of function arguments." +msgstr "ფუნქციის áƒáƒ áƒ’უმენტების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘ის ჩვენებáƒ." + +#: utils/misc/guc_tables.c:3232 +msgid "Shows the maximum number of index keys." +msgstr "ინდექსის გáƒáƒ¡áƒáƒ¦áƒ”ბების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘ის ჩვენებáƒ." + +#: utils/misc/guc_tables.c:3243 +msgid "Shows the maximum identifier length." +msgstr "იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიგრძის ჩვენებáƒ." + +#: utils/misc/guc_tables.c:3254 +msgid "Shows the size of a disk block." +msgstr "დისკის ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ¡ ჩვენებáƒ." + +#: utils/misc/guc_tables.c:3265 +msgid "Shows the number of pages per disk file." +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ áƒáƒ áƒ¡áƒ”ბული გვერდების რáƒáƒáƒ“ენáƒáƒ‘ის ჩვენებáƒ." + +#: utils/misc/guc_tables.c:3276 +msgid "Shows the block size in the write ahead log." +msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ¡ ჩვენებáƒ." + +#: utils/misc/guc_tables.c:3287 +msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." +msgstr "" + +#: utils/misc/guc_tables.c:3299 +msgid "Shows the size of write ahead log segments." +msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტების ზáƒáƒ›áƒ˜áƒ¡ ჩვენებáƒ." + +#: utils/misc/guc_tables.c:3312 +msgid "Time for which WAL summary files should be kept." +msgstr "" + +#: utils/misc/guc_tables.c:3325 +msgid "Time to sleep between autovacuum runs." +msgstr "ძილის დრრáƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბების გáƒáƒ¨áƒ•ებებს შáƒáƒ áƒ˜áƒ¡." + +#: utils/misc/guc_tables.c:3335 +msgid "Minimum number of tuple updates or deletes prior to vacuum." +msgstr "" + +#: utils/misc/guc_tables.c:3344 +msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." +msgstr "" + +#: utils/misc/guc_tables.c:3353 +msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." +msgstr "" + +#: utils/misc/guc_tables.c:3363 +msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." +msgstr "" + +#: utils/misc/guc_tables.c:3375 +msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." +msgstr "" + +#: utils/misc/guc_tables.c:3385 +msgid "Sets the maximum number of simultaneously running autovacuum worker processes." +msgstr "ერთდრáƒáƒ£áƒšáƒáƒ“ გáƒáƒ¨áƒ•ებული áƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების რáƒáƒáƒ“ენáƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:3395 +msgid "Sets the maximum number of parallel processes per maintenance operation." +msgstr "თითáƒáƒ”ული რემáƒáƒœáƒ¢áƒ˜áƒ¡ áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის პáƒáƒ áƒáƒšáƒ”ლური პრáƒáƒªáƒ”სების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:3405 +msgid "Sets the maximum number of parallel processes per executor node." +msgstr "თითáƒáƒ”ული შემსრულებელი კვáƒáƒœáƒ«áƒ˜áƒ¡áƒ—ვის პáƒáƒ áƒáƒšáƒ”ლურáƒáƒ“ გáƒáƒ¨áƒ•ებული პრáƒáƒªáƒ”სების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:3416 +msgid "Sets the maximum number of parallel workers that can be active at one time." +msgstr "ერთდრáƒáƒ£áƒšáƒáƒ“ áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ პáƒáƒ áƒáƒšáƒ”ლური დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:3427 +msgid "Sets the maximum memory to be used by each autovacuum worker process." +msgstr "თითáƒáƒ”ული áƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის მიერ გáƒáƒ›áƒáƒ§áƒ”ნებული მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ მეხსიერების რáƒáƒáƒ“ენáƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:3438 +msgid "Time between issuing TCP keepalives." +msgstr "დáƒáƒ§áƒáƒ•ნებრTCP keepalive პáƒáƒ™áƒ”ტებს შáƒáƒ áƒ˜áƒ¡." + +#: utils/misc/guc_tables.c:3439 utils/misc/guc_tables.c:3450 utils/misc/guc_tables.c:3574 +msgid "A value of 0 uses the system default." +msgstr "სისტემური ნáƒáƒ’ულისხმევი მნიშვნელáƒáƒ‘ის გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ მიუთითეთ 0." + +#: utils/misc/guc_tables.c:3449 +msgid "Time between TCP keepalive retransmits." +msgstr "დáƒáƒ§áƒáƒ•ნებრTCP keepalive პáƒáƒ™áƒ”ტების გáƒáƒ“áƒáƒ’ზáƒáƒ•ნებს შáƒáƒ áƒ˜áƒ¡." + +#: utils/misc/guc_tables.c:3460 +msgid "SSL renegotiation is no longer supported; this can only be 0." +msgstr "SSL-ის თáƒáƒ•იდáƒáƒœ დáƒáƒ§áƒ”ნებრუკვე მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ. შეგიძლიáƒáƒ— დáƒáƒáƒ§áƒ”ნáƒáƒ— მხáƒáƒšáƒáƒ“ 0." + +#: utils/misc/guc_tables.c:3471 +msgid "Maximum number of TCP keepalive retransmits." +msgstr "TCP Keepalive-ების გáƒáƒ“áƒáƒ’ზáƒáƒ•ნის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ." + +#: utils/misc/guc_tables.c:3472 +msgid "Number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." +msgstr "" + +#: utils/misc/guc_tables.c:3483 +msgid "Sets the maximum allowed result for exact search by GIN." +msgstr "" + +#: utils/misc/guc_tables.c:3494 +msgid "Sets the planner's assumption about the total size of the data caches." +msgstr "" + +#: utils/misc/guc_tables.c:3495 +msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." +msgstr "" + +#: utils/misc/guc_tables.c:3506 +msgid "Sets the minimum amount of table data for a parallel scan." +msgstr "ცხრილის მáƒáƒœáƒáƒªáƒ”მების მინიმáƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘რპáƒáƒ áƒáƒšáƒ”ლური სკáƒáƒœáƒ˜áƒ áƒ”ბისთვის." + +#: utils/misc/guc_tables.c:3507 +msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." +msgstr "" + +#: utils/misc/guc_tables.c:3517 +msgid "Sets the minimum amount of index data for a parallel scan." +msgstr "" + +#: utils/misc/guc_tables.c:3518 +msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." +msgstr "" + +#: utils/misc/guc_tables.c:3529 +msgid "Shows the server version as an integer." +msgstr "სერვერის ვერსიáƒáƒ¡, რáƒáƒ’áƒáƒ áƒª მთელ რიცხვს, ისე áƒáƒ©áƒ•ენებს." + +#: utils/misc/guc_tables.c:3540 +msgid "Log the use of temporary files larger than this number of kilobytes." +msgstr "მითითებული რáƒáƒáƒ“ენáƒáƒ‘რკილáƒáƒ‘áƒáƒ˜áƒ¢áƒ–ე უფრრდიდი დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნების ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:3541 +msgid "Zero logs all files. The default is -1 (turning this feature off)." +msgstr "" + +#: utils/misc/guc_tables.c:3551 +msgid "Sets the size reserved for pg_stat_activity.query, in bytes." +msgstr "'pg_stat_activity.query'-სთვის დáƒáƒªáƒ£áƒšáƒ˜ მეხსიერების ზáƒáƒ›áƒ˜áƒ¡ დáƒáƒ§áƒœáƒ”ბáƒ, ბáƒáƒ˜áƒ¢áƒ”ბში." + +#: utils/misc/guc_tables.c:3562 +msgid "Sets the maximum size of the pending list for GIN index." +msgstr "" + +#: utils/misc/guc_tables.c:3573 +msgid "TCP user timeout." +msgstr "TCP მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ლáƒáƒ“ინის ვáƒáƒ“áƒ." + +#: utils/misc/guc_tables.c:3584 +msgid "The size of huge page that should be requested." +msgstr "მáƒáƒ¡áƒáƒ—ხáƒáƒ•ი უზáƒáƒ áƒ›áƒáƒ–áƒáƒ áƒ˜ გვერდების (hugepages) ზáƒáƒ›áƒ." + +#: utils/misc/guc_tables.c:3595 +msgid "Aggressively flush system caches for debugging purposes." +msgstr "" + +#: utils/misc/guc_tables.c:3618 +msgid "Sets the time interval between checks for disconnection while running queries." +msgstr "" + +#: utils/misc/guc_tables.c:3629 +msgid "Time between progress updates for long-running startup operations." +msgstr "" + +#: utils/misc/guc_tables.c:3631 +msgid "0 turns this feature off." +msgstr "0 გáƒáƒ›áƒáƒ áƒ—áƒáƒ•ს áƒáƒ› ფუნქციáƒáƒ¡." + +#: utils/misc/guc_tables.c:3641 +msgid "Sets the iteration count for SCRAM secret generation." +msgstr "áƒáƒ§áƒ”ნებს იტერáƒáƒªáƒ˜áƒ”ბის რიცხვს SCRAM-ის პáƒáƒ áƒáƒšáƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის." + +#: utils/misc/guc_tables.c:3661 +msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." +msgstr "" + +#: utils/misc/guc_tables.c:3672 +msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." +msgstr "" + +#: utils/misc/guc_tables.c:3683 +msgid "Sets the planner's estimate of the cost of processing each tuple (row)." +msgstr "" + +#: utils/misc/guc_tables.c:3694 +msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." +msgstr "" + +#: utils/misc/guc_tables.c:3705 +msgid "Sets the planner's estimate of the cost of processing each operator or function call." +msgstr "" + +#: utils/misc/guc_tables.c:3716 +msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." +msgstr "" + +#: utils/misc/guc_tables.c:3727 +msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." +msgstr "" + +#: utils/misc/guc_tables.c:3739 +msgid "Perform JIT compilation if query is more expensive." +msgstr "თუ მáƒáƒ—ხáƒáƒ•ნრუფრრძვირიáƒ, JIT კáƒáƒ›áƒžáƒ˜áƒšáƒáƒªáƒ˜áƒ˜áƒ¡ შესრულებáƒ." + +#: utils/misc/guc_tables.c:3740 +msgid "-1 disables JIT compilation." +msgstr "-1 JIT კáƒáƒ›áƒžáƒ˜áƒšáƒáƒªáƒ˜áƒáƒ¡ გáƒáƒ›áƒáƒ áƒ—áƒáƒ•ს." + +#: utils/misc/guc_tables.c:3750 +msgid "Optimize JIT-compiled functions if query is more expensive." +msgstr "" + +#: utils/misc/guc_tables.c:3751 +msgid "-1 disables optimization." +msgstr "-1 áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒªáƒ˜áƒáƒ¡ გáƒáƒ›áƒáƒ áƒ—áƒáƒ•ს." + +#: utils/misc/guc_tables.c:3761 +msgid "Perform JIT inlining if query is more expensive." +msgstr "" + +#: utils/misc/guc_tables.c:3762 +msgid "-1 disables inlining." +msgstr "-1 გáƒáƒ›áƒáƒ áƒ—áƒáƒ•ს კáƒáƒ“ის ჩáƒáƒ“გმáƒáƒ¡." + +#: utils/misc/guc_tables.c:3772 +msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." +msgstr "" + +#: utils/misc/guc_tables.c:3784 +msgid "Sets the planner's estimate of the average size of a recursive query's working table." +msgstr "" + +#: utils/misc/guc_tables.c:3796 +msgid "GEQO: selective pressure within the population." +msgstr "GEQO: შერჩევითი ზეწáƒáƒšáƒ პáƒáƒžáƒ£áƒšáƒáƒªáƒ˜áƒáƒ¨áƒ˜." + +#: utils/misc/guc_tables.c:3807 +msgid "GEQO: seed for random path selection." +msgstr "" + +#: utils/misc/guc_tables.c:3818 +msgid "Multiple of \"work_mem\" to use for hash tables." +msgstr "" + +#: utils/misc/guc_tables.c:3829 +msgid "Multiple of the average buffer usage to free per round." +msgstr "" + +#: utils/misc/guc_tables.c:3839 +msgid "Sets the seed for random-number generation." +msgstr "" + +#: utils/misc/guc_tables.c:3850 +msgid "Vacuum cost delay in milliseconds." +msgstr "დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის დáƒáƒ§áƒáƒ•ნებრმილიწáƒáƒ›áƒ”ბში." + +#: utils/misc/guc_tables.c:3861 +msgid "Vacuum cost delay in milliseconds, for autovacuum." +msgstr "დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის დáƒáƒ§áƒáƒ•ნებრმილიწáƒáƒ›áƒ”ბში, áƒáƒ•ტáƒáƒ“áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისთვის." + +#: utils/misc/guc_tables.c:3872 +msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." +msgstr "" + +#: utils/misc/guc_tables.c:3882 +msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." +msgstr "" + +#: utils/misc/guc_tables.c:3892 +msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." +msgstr "" + +#: utils/misc/guc_tables.c:3902 +msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." +msgstr "" + +#: utils/misc/guc_tables.c:3912 +msgid "Fraction of statements exceeding \"log_min_duration_sample\" to be logged." +msgstr "" + +#: utils/misc/guc_tables.c:3913 +msgid "Use a value between 0.0 (never log) and 1.0 (always log)." +msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ მნიშვნელáƒáƒ‘ები 0.0-დáƒáƒœ (áƒáƒ áƒáƒ¡áƒáƒ“ეს ჩáƒáƒ¬áƒ”რრჟურნáƒáƒšáƒ¨áƒ˜) დრ1.0-ს (ჟურნáƒáƒšáƒ¨áƒ˜ ყáƒáƒ•ელთვის ჩáƒáƒ¬áƒ”რáƒ) შუáƒ." + +#: utils/misc/guc_tables.c:3922 +msgid "Sets the fraction of transactions from which to log all statements." +msgstr "áƒáƒ“გენს ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ¬áƒ˜áƒšáƒ¡, რáƒáƒ›áƒšáƒ˜áƒ¡ შემდეგáƒáƒª ყველრáƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ˜áƒ¬áƒ”რებáƒ." + +#: utils/misc/guc_tables.c:3923 +msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." +msgstr "" + +#: utils/misc/guc_tables.c:3942 +msgid "Sets the shell command that will be called to archive a WAL file." +msgstr "" + +#: utils/misc/guc_tables.c:3943 +msgid "This is used only if \"archive_library\" is not set." +msgstr "" + +#: utils/misc/guc_tables.c:3952 +msgid "Sets the library that will be called to archive a WAL file." +msgstr "" + +#: utils/misc/guc_tables.c:3953 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "" + +#: utils/misc/guc_tables.c:3962 +msgid "Sets the shell command that will be called to retrieve an archived WAL file." +msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ირებული WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ მისáƒáƒ¦áƒ”ბáƒáƒ“ გáƒáƒ›áƒáƒ¡áƒáƒ«áƒáƒ®áƒ”ბელი გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:3972 +msgid "Sets the shell command that will be executed at every restart point." +msgstr "ყáƒáƒ•ელ გáƒáƒ“áƒáƒ¢áƒ•ირთვის წერტილზე გáƒáƒ¡áƒáƒ¨áƒ•ები გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:3982 +msgid "Sets the shell command that will be executed once at the end of recovery." +msgstr "" + +#: utils/misc/guc_tables.c:3992 +msgid "Specifies the timeline to recover into." +msgstr "áƒáƒ¦áƒ“გენისთვის დრáƒáƒ˜áƒ¡ მითითებáƒ." + +#: utils/misc/guc_tables.c:4002 +msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." +msgstr "" + +#: utils/misc/guc_tables.c:4011 +msgid "Sets the transaction ID up to which recovery will proceed." +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID, რáƒáƒ›áƒšáƒáƒ›áƒ“ეც áƒáƒ¦áƒ“გენრმáƒáƒ®áƒ“ებáƒ." + +#: utils/misc/guc_tables.c:4020 +msgid "Sets the time stamp up to which recovery will proceed." +msgstr "" + +#: utils/misc/guc_tables.c:4029 +msgid "Sets the named restore point up to which recovery will proceed." +msgstr "" + +#: utils/misc/guc_tables.c:4038 +msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." +msgstr "" + +#: utils/misc/guc_tables.c:4048 +msgid "Sets the connection string to be used to connect to the sending server." +msgstr "" + +#: utils/misc/guc_tables.c:4059 +msgid "Sets the name of the replication slot to use on the sending server." +msgstr "" + +#: utils/misc/guc_tables.c:4069 +msgid "Sets the client's character set encoding." +msgstr "კლიენტის სიმბáƒáƒšáƒáƒ”ბის კáƒáƒ“ირების დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4080 +msgid "Controls information prefixed to each log line." +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ თითáƒáƒ”ული ჩáƒáƒœáƒáƒ¬áƒ”რის პრეფიქსის კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜." + +#: utils/misc/guc_tables.c:4081 +msgid "If blank, no prefix is used." +msgstr "თუ ცáƒáƒ áƒ˜áƒ”ლიáƒ, პრეფიქსი áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4090 +msgid "Sets the time zone to use in log messages." +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ შეტყáƒáƒ‘ინებების დáƒáƒ¡áƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებლáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒšáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4100 +msgid "Sets the display format for date and time values." +msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡áƒ დრდრáƒáƒ˜áƒ¡ მნიშვნელáƒáƒ‘ების ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4101 +msgid "Also controls interpretation of ambiguous date inputs." +msgstr "" + +#: utils/misc/guc_tables.c:4112 +msgid "Sets the default table access method for new tables." +msgstr "áƒáƒ®áƒáƒšáƒ˜ ცხრილების ნáƒáƒ’ულისხმევი წვდáƒáƒ›áƒ˜áƒ¡ უფლებების მითითებáƒ." + +#: utils/misc/guc_tables.c:4123 +msgid "Sets the default tablespace to create tables and indexes in." +msgstr "" + +#: utils/misc/guc_tables.c:4124 +msgid "An empty string selects the database's default tablespace." +msgstr "ცáƒáƒ áƒ˜áƒ”ლი სტრიქáƒáƒœáƒ˜ ბáƒáƒ–ის ნáƒáƒ’ულისხმევ ცხრილების სივრცეს áƒáƒ˜áƒ áƒ©áƒ”ვს." + +#: utils/misc/guc_tables.c:4134 +msgid "Sets the tablespace(s) to use for temporary tables and sort files." +msgstr "" + +#: utils/misc/guc_tables.c:4145 +msgid "Sets whether a CREATEROLE user automatically grants the role to themselves, and with which options." +msgstr "" + +#: utils/misc/guc_tables.c:4157 +msgid "Sets the path for dynamically loadable modules." +msgstr "დინáƒáƒ›áƒ˜áƒ£áƒ áƒáƒ“ ჩáƒáƒ¢áƒ•ირთული მáƒáƒ“ულების ბილიკის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4158 +msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." +msgstr "თუ სáƒáƒ­áƒ˜áƒ áƒáƒ დინáƒáƒ›áƒ˜áƒ£áƒ áƒáƒ“ ჩáƒáƒ¢áƒ•ირთვáƒáƒ“ი მáƒáƒ“ულის გáƒáƒ®áƒ¡áƒœáƒ დრმითითებულ სáƒáƒ®áƒ”ლს áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის კáƒáƒ›áƒžáƒáƒœáƒ”ნტი (áƒáƒœáƒ£ სáƒáƒ®áƒ”ლი áƒáƒ  შეიცáƒáƒ•ს დáƒáƒ®áƒ áƒ˜áƒš ხáƒáƒ–ს), სისტემრმითითებულ ფáƒáƒ˜áƒšáƒ¡ áƒáƒ› ბილიკებში მáƒáƒ«áƒ”ბნის." + +#: utils/misc/guc_tables.c:4171 +msgid "Sets the location of the Kerberos server key file." +msgstr "Kerberos-ის სერვერის გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘ის მითითებáƒ." + +#: utils/misc/guc_tables.c:4182 +msgid "Sets the Bonjour service name." +msgstr "Bonjour-ის სერვისის სáƒáƒ®áƒ”ლის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4192 +msgid "Sets the language in which messages are displayed." +msgstr "შეტყáƒáƒ‘ინებების სáƒáƒ©áƒ•ენებელი ენის მითითებáƒ." + +#: utils/misc/guc_tables.c:4202 +msgid "Sets the locale for formatting monetary amounts." +msgstr "თáƒáƒœáƒ®áƒ˜áƒ¡ რიცხვების ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბის სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4212 +msgid "Sets the locale for formatting numbers." +msgstr "რიცხვების ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბის ენის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4222 +msgid "Sets the locale for formatting date and time values." +msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡áƒ დრდრáƒáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბის ენის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4232 +msgid "Lists shared libraries to preload into each backend." +msgstr "თითáƒáƒ”ული უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡áƒ—ვის გáƒáƒ¨áƒ•ებáƒáƒ›áƒ“ე ჩáƒáƒ¡áƒáƒ¢áƒ•ირთი გáƒáƒ–იáƒáƒ áƒ”ბული ბიბლიáƒáƒ—ეკების სიáƒ." + +#: utils/misc/guc_tables.c:4243 +msgid "Lists shared libraries to preload into server." +msgstr "სერვერის გáƒáƒ¨áƒ•ებáƒáƒ›áƒ“ე ჩáƒáƒ¡áƒáƒ¢áƒ•ირთი გáƒáƒ–იáƒáƒ áƒ”ბული ბიბლიáƒáƒ—ეკების სიáƒ." + +#: utils/misc/guc_tables.c:4254 +msgid "Lists unprivileged shared libraries to preload into each backend." +msgstr "თითáƒáƒ”ული უკáƒáƒœáƒáƒ‘áƒáƒšáƒáƒ¡áƒ—ვის გáƒáƒ¨áƒ•ებáƒáƒ›áƒ“ე ჩáƒáƒ¡áƒáƒ¢áƒ•ირთი áƒáƒ áƒáƒžáƒ áƒ˜áƒ•ილეგირებული გáƒáƒ–იáƒáƒ áƒ”ბული ბიბლიáƒáƒ—ეკების სიáƒ." + +#: utils/misc/guc_tables.c:4265 +msgid "Sets the schema search order for names that are not schema-qualified." +msgstr "" + +#: utils/misc/guc_tables.c:4277 +msgid "Shows the server (database) character set encoding." +msgstr "სერვერის (ბáƒáƒ–ის) სიმბáƒáƒšáƒáƒ”ბის კáƒáƒ“ირების ჩვენებáƒ." + +#: utils/misc/guc_tables.c:4289 +msgid "Shows the server version." +msgstr "სერვერის ვერსიის ჩვენებáƒ." + +#: utils/misc/guc_tables.c:4301 +msgid "Sets the current role." +msgstr "მიმდინáƒáƒ áƒ” რáƒáƒšáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4313 +msgid "Sets the session user name." +msgstr "სესიის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლი სáƒáƒ®áƒ”ლის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4324 +msgid "Sets the destination for server log output." +msgstr "სერვერის ჟურნáƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4325 +msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." +msgstr "" + +#: utils/misc/guc_tables.c:4336 +msgid "Sets the destination directory for log files." +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4337 +msgid "Can be specified as relative to the data directory or as absolute path." +msgstr "" + +#: utils/misc/guc_tables.c:4347 +msgid "Sets the file name pattern for log files." +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ®áƒ”ლის შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4358 +msgid "Sets the program name used to identify PostgreSQL messages in syslog." +msgstr "Syslog-ში PostgreSQL-ის შეტყáƒáƒ‘ინებების იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ სáƒáƒ®áƒ”ლის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4369 +msgid "Sets the application name used to identify PostgreSQL messages in the event log." +msgstr "მáƒáƒ•ლენების ჟურნáƒáƒšáƒ¨áƒ˜ PostgreSQL-ის შეტყáƒáƒ‘ინებების იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ®áƒ”ლის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4380 +msgid "Sets the time zone for displaying and interpreting time stamps." +msgstr "" + +#: utils/misc/guc_tables.c:4390 +msgid "Selects a file of time zone abbreviations." +msgstr "დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒšáƒ”ბის áƒáƒ‘რევიáƒáƒ¢áƒ£áƒ áƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ მითითებáƒ." + +#: utils/misc/guc_tables.c:4400 +msgid "Sets the owning group of the Unix-domain socket." +msgstr "Unix-დáƒáƒ›áƒ”ნის სáƒáƒ™áƒ”ტის მფლáƒáƒ‘ლის ჯგუფის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4401 +msgid "The owning user of the socket is always the user that starts the server." +msgstr "სáƒáƒ™áƒ”ტის მფლáƒáƒ‘ელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ყáƒáƒ•ელთვის იგივე მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელიáƒ, ვინც სერვერი გáƒáƒ£áƒ¨áƒ•áƒ." + +#: utils/misc/guc_tables.c:4411 +msgid "Sets the directories where Unix-domain sockets will be created." +msgstr "áƒáƒ§áƒ”ნებს სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეებს, სáƒáƒ“áƒáƒª Unix-ის სáƒáƒ™áƒ”ტები შეიქმნებáƒ." + +#: utils/misc/guc_tables.c:4422 +msgid "Sets the host name or IP address(es) to listen to." +msgstr "მáƒáƒ¡áƒáƒ¡áƒ›áƒ”ნი IP მისáƒáƒ›áƒáƒ áƒ—ი áƒáƒœ ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი." + +#: utils/misc/guc_tables.c:4437 +msgid "Sets the server's data directory." +msgstr "სერვერის მáƒáƒœáƒáƒªáƒ›áƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4448 +msgid "Sets the server's main configuration file." +msgstr "სერვერის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მთáƒáƒ•áƒáƒ áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4459 +msgid "Sets the server's \"hba\" configuration file." +msgstr "სერვერის hba კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4470 +msgid "Sets the server's \"ident\" configuration file." +msgstr "სერვერის ident კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4481 +msgid "Writes the postmaster PID to the specified file." +msgstr "Postmaster-ის PID-ის მითითებულ ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:4492 +msgid "Shows the name of the SSL library." +msgstr "SSL ბიბლიáƒáƒ—ეკის სáƒáƒ®áƒ”ლის ჩვენებáƒ." + +#: utils/misc/guc_tables.c:4507 +msgid "Location of the SSL server certificate file." +msgstr "SSL სერვერის სერტიფიკáƒáƒ¢áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘áƒ." + +#: utils/misc/guc_tables.c:4517 +msgid "Location of the SSL server private key file." +msgstr "SSL სერვერის პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘áƒ." + +#: utils/misc/guc_tables.c:4527 +msgid "Location of the SSL certificate authority file." +msgstr "SSL სერვერის CA ფáƒáƒ˜áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘áƒ." + +#: utils/misc/guc_tables.c:4537 +msgid "Location of the SSL certificate revocation list file." +msgstr "SSL სერვერის გáƒáƒ£áƒ¥áƒ›áƒ”ბული სერტიფიკáƒáƒ¢áƒ”ბის სიის ფáƒáƒ˜áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘áƒ." + +#: utils/misc/guc_tables.c:4547 +msgid "Location of the SSL certificate revocation list directory." +msgstr "SSL სერვერის გáƒáƒ£áƒ¥áƒ›áƒ”ბული სერტიფიკáƒáƒ¢áƒ”ბის სიის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘áƒ." + +#: utils/misc/guc_tables.c:4557 +msgid "Number of synchronous standbys and list of names of potential synchronous ones." +msgstr "" + +#: utils/misc/guc_tables.c:4568 +msgid "Sets default text search configuration." +msgstr "ტექსტის ძებნის ნáƒáƒ’ულისხმევი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4578 +msgid "Sets the list of allowed SSL ciphers." +msgstr "ჩáƒáƒ áƒ—ული SSL შიფრáƒáƒªáƒ˜áƒ”ბის სიის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4593 +msgid "Sets the curve to use for ECDH." +msgstr "ECDH-სთვის გáƒáƒ›áƒáƒ§áƒ”ნებული მრუდის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4608 +msgid "Location of the SSL DH parameters file." +msgstr "SSH DH პáƒáƒ áƒáƒ›áƒ”ტრების ფáƒáƒ˜áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘áƒ." + +#: utils/misc/guc_tables.c:4619 +msgid "Command to obtain passphrases for SSL." +msgstr "SSL-ის სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ ფრáƒáƒ–ების მისáƒáƒ¦áƒ”ბი ბრძáƒáƒœáƒ”ბáƒ." + +#: utils/misc/guc_tables.c:4630 +msgid "Sets the application name to be reported in statistics and logs." +msgstr "" + +#: utils/misc/guc_tables.c:4641 +msgid "Sets the name of the cluster, which is included in the process title." +msgstr "" + +#: utils/misc/guc_tables.c:4652 +msgid "Sets the WAL resource managers for which WAL consistency checks are done." +msgstr "" + +#: utils/misc/guc_tables.c:4653 +msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." +msgstr "" + +#: utils/misc/guc_tables.c:4663 +msgid "JIT provider to use." +msgstr "JIT სერვისის მáƒáƒ›áƒ¬áƒáƒ“ებელი." + +#: utils/misc/guc_tables.c:4674 +msgid "Log backtrace for errors in these functions." +msgstr "მითითებულ ფუნქციებში შეცდáƒáƒ›áƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜ სტეკის ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ." + +#: utils/misc/guc_tables.c:4685 +msgid "Use direct I/O for file access." +msgstr "ფáƒáƒ˜áƒšáƒ”ბთáƒáƒœ წვდáƒáƒ›áƒ˜áƒ¡áƒ—ვის პირდáƒáƒžáƒ˜áƒ áƒ˜ შეტáƒáƒœáƒ/გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4696 +msgid "Lists streaming replication standby server slot names that logical WAL sender processes will wait for." +msgstr "" + +#: utils/misc/guc_tables.c:4698 +msgid "Logical WAL sender processes will send decoded changes to plugins only after the specified replication slots confirm receiving WAL." +msgstr "" + +#: utils/misc/guc_tables.c:4719 +msgid "Sets whether \"\\'\" is allowed in string literals." +msgstr "შეიძლებრთუ áƒáƒ áƒ ტექსტურ სტრიქáƒáƒœáƒ”ბში \"\\\" სიმბáƒáƒšáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4729 +msgid "Sets the output format for bytea." +msgstr "\"bytea\"-ის გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4739 +msgid "Sets the message levels that are sent to the client." +msgstr "კლიენტთáƒáƒœ გáƒáƒ’ზáƒáƒ•ნილი შეტყáƒáƒ‘ინების დáƒáƒœáƒ”ების დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4740 utils/misc/guc_tables.c:4836 utils/misc/guc_tables.c:4847 +msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." +msgstr "" + +#: utils/misc/guc_tables.c:4750 +msgid "Enables in-core computation of query identifiers." +msgstr "მáƒáƒ—ხáƒáƒ•ნის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ბირთვის-შიდრგáƒáƒ›áƒáƒ—ვლის ჩáƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:4760 +msgid "Enables the planner to use constraints to optimize queries." +msgstr "მგეგმáƒáƒ•ისთვის შეზღუდვების ჩáƒáƒ áƒ—ვáƒ, მáƒáƒ—ხáƒáƒ•ნების áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის." + +#: utils/misc/guc_tables.c:4761 +msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." +msgstr "" + +#: utils/misc/guc_tables.c:4772 +msgid "Sets the default compression method for compressible values." +msgstr "შეკუმშვáƒáƒ“ი მნიშვნელáƒáƒ‘ების ნáƒáƒ’ულისხმევი შეკუმშვის მეთáƒáƒ“ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4783 +msgid "Sets the transaction isolation level of each new transaction." +msgstr "áƒáƒ®áƒáƒšáƒ˜ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის იზáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒœáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4793 +msgid "Sets the current transaction's isolation level." +msgstr "მიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ იზáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒœáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4804 +msgid "Sets the display format for interval values." +msgstr "ინტერვáƒáƒšáƒ˜áƒ¡ მნიშვნელáƒáƒ‘ების სáƒáƒ©áƒ•ენებელი ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4815 +msgid "Log level for reporting invalid ICU locale strings." +msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ დáƒáƒœáƒ” áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ICU ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ სტრიქáƒáƒœáƒ”ბის áƒáƒœáƒ’áƒáƒ áƒ˜áƒ¨áƒ˜áƒ¡áƒ—ვის." + +#: utils/misc/guc_tables.c:4825 +msgid "Sets the verbosity of logged messages." +msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რილი შეტყáƒáƒ‘ინებების დეტáƒáƒšáƒ£áƒ áƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4835 +msgid "Sets the message levels that are logged." +msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¡áƒáƒ¬áƒ”რი შეტყáƒáƒ‘ინების დáƒáƒœáƒ”ების დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4846 +msgid "Causes all statements generating error at or above this level to be logged." +msgstr "შეცდáƒáƒ›áƒ˜áƒ¡ მითითებული áƒáƒœ უფრრზედრკáƒáƒ“ების ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რის მითითებáƒ." + +#: utils/misc/guc_tables.c:4857 +msgid "Sets the type of statements logged." +msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¡áƒáƒ¬áƒ”რი áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ტიპების დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4867 +msgid "Sets the syslog \"facility\" to be used when syslog enabled." +msgstr "თუ სისტემურ ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რრჩáƒáƒ áƒ—ულიáƒ, მიუთითებს syslog-ის \"facility\"-ის." + +#: utils/misc/guc_tables.c:4878 +msgid "Sets the session's behavior for triggers and rewrite rules." +msgstr "სესიის ქცევის დáƒáƒ§áƒ”ნებრტრიგერებისრდრგáƒáƒ“áƒáƒ¬áƒ”რის წესებისთვის." + +#: utils/misc/guc_tables.c:4888 +msgid "Sets the current transaction's synchronization level." +msgstr "მიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒœáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4898 +msgid "Allows archiving of WAL files using \"archive_command\"." +msgstr "'WAL' ფáƒáƒ˜áƒšáƒ”ბის დáƒáƒáƒ áƒ¥áƒ˜áƒ•ების დáƒáƒ¨áƒ•ებრ'archive_command'-ის გáƒáƒ›áƒáƒ§áƒ”ნებით." + +#: utils/misc/guc_tables.c:4908 +msgid "Sets the action to perform upon reaching the recovery target." +msgstr "" + +#: utils/misc/guc_tables.c:4918 +msgid "Collects function-level statistics on database activity." +msgstr "áƒáƒ’რáƒáƒ•ებს ფუნქციის დáƒáƒœáƒ˜áƒ¡ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒáƒ¡ ბáƒáƒ–ის áƒáƒ¥áƒ¢áƒ˜áƒ•áƒáƒ‘ების შესáƒáƒ®áƒ”ბ." + +#: utils/misc/guc_tables.c:4929 +msgid "Sets the consistency of accesses to statistics data." +msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მáƒáƒœáƒáƒªáƒ”მებთáƒáƒœ წვდáƒáƒ›áƒ˜áƒ¡ მიმდევრáƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4939 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "'WAL' ფáƒáƒ˜áƒšáƒ¨áƒ˜ მითითებული მეთáƒáƒ“ით ჩáƒáƒ¬áƒ”რილი სრული გვერდის ჩáƒáƒ¬áƒ”რების შეკუმშვáƒ." + +#: utils/misc/guc_tables.c:4949 +msgid "Sets the level of information written to the WAL." +msgstr "WAL-ში ჩáƒáƒ¬áƒ”რილი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒœáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4959 +msgid "Selects the dynamic shared memory implementation used." +msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებული გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლების áƒáƒ áƒ©áƒ”ვáƒ." + +#: utils/misc/guc_tables.c:4969 +msgid "Selects the shared memory implementation used for the main shared memory region." +msgstr "" + +#: utils/misc/guc_tables.c:4979 +msgid "Selects the method used for forcing WAL updates to disk." +msgstr "WAL-ისთვის დისკზე გáƒáƒœáƒáƒ®áƒšáƒ”ბების ნáƒáƒ«áƒáƒšáƒáƒ“ევáƒáƒ“ ჩáƒáƒ¬áƒ”რის მეთáƒáƒ“ის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4989 +msgid "Sets how binary values are to be encoded in XML." +msgstr "XML-ში ბინáƒáƒ áƒ£áƒšáƒ˜ მნიშვნელáƒáƒ‘ების კáƒáƒ“ირების ტიპის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:4999 +msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." +msgstr "" + +#: utils/misc/guc_tables.c:5010 +msgid "Use of huge pages on Linux or Windows." +msgstr "Linux-ზე დრWindows-ზე უზáƒáƒ áƒ›áƒáƒ–áƒáƒ áƒ˜ გვერდების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:5020 +msgid "Indicates the status of huge pages." +msgstr "" + +#: utils/misc/guc_tables.c:5031 +msgid "Prefetch referenced blocks during recovery." +msgstr "áƒáƒ¦áƒ“გენისáƒáƒ¡ მიბმული ბლáƒáƒ™áƒ”ბის წინáƒáƒ¡áƒ¬áƒáƒ  გáƒáƒ›áƒáƒ—ხáƒáƒ•áƒ." + +#: utils/misc/guc_tables.c:5032 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "" + +#: utils/misc/guc_tables.c:5041 +msgid "Forces the planner's use parallel query nodes." +msgstr "დáƒáƒ›áƒ’ეგმáƒáƒ•ის მიერ პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ—ხáƒáƒ•ნის კვáƒáƒœáƒ«áƒ”ბის ნáƒáƒ«áƒáƒšáƒáƒ“ევი გáƒáƒ›áƒáƒ§áƒ”ნების ჩáƒáƒ áƒ—ვáƒ." + +#: utils/misc/guc_tables.c:5042 +msgid "This can be useful for testing the parallel query infrastructure by forcing the planner to generate plans that contain nodes that perform tuple communication between workers and the main process." +msgstr "" + +#: utils/misc/guc_tables.c:5054 +msgid "Chooses the algorithm for encrypting passwords." +msgstr "áƒáƒ˜áƒ áƒ©áƒ˜áƒ”თ პáƒáƒ áƒáƒšáƒ”ბის დáƒáƒ¡áƒáƒ¨áƒ˜áƒ¤áƒ áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მი." + +#: utils/misc/guc_tables.c:5064 +msgid "Controls the planner's selection of custom or generic plan." +msgstr "" + +#: utils/misc/guc_tables.c:5065 +msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." +msgstr "" + +#: utils/misc/guc_tables.c:5077 +msgid "Sets the minimum SSL/TLS protocol version to use." +msgstr "SSL/TLS-ის პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ მინიმáƒáƒšáƒ£áƒ áƒ˜ ვერსიის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:5089 +msgid "Sets the maximum SSL/TLS protocol version to use." +msgstr "SSL/TLS-ის პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ვერსიის დáƒáƒ§áƒ”ნებáƒ." + +#: utils/misc/guc_tables.c:5101 +msgid "Sets the method for synchronizing the data directory before crash recovery." +msgstr "" + +#: utils/misc/guc_tables.c:5110 +msgid "Forces immediate streaming or serialization of changes in large transactions." +msgstr "" + +#: utils/misc/guc_tables.c:5111 +msgid "On the publisher, it allows streaming or serializing each change in logical decoding. On the subscriber, it allows serialization of all changes to files and notifies the parallel apply workers to read and apply them at the end of the transaction." +msgstr "" + +#: utils/misc/help_config.c:129 +#, c-format +msgid "internal error: unrecognized run-time parameter type\n" +msgstr "შიდრშეცდáƒáƒ›áƒ: გáƒáƒ¨áƒ•ების დრáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული ტიპი უცნáƒáƒ‘იáƒ\n" + +#: utils/misc/pg_controldata.c:50 utils/misc/pg_controldata.c:90 utils/misc/pg_controldata.c:181 utils/misc/pg_controldata.c:222 +#, c-format +msgid "calculated CRC checksum does not match value stored in file" +msgstr "გáƒáƒ›áƒáƒ—ვლილი CRC სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ ფáƒáƒ˜áƒšáƒ¨áƒ˜ დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებულ მნიშვნელáƒáƒ‘áƒáƒ¡ áƒáƒ  ემთხვევáƒ" + +#: utils/misc/pg_rusage.c:64 +#, c-format +msgid "CPU: user: %d.%02d s, system: %d.%02d s, elapsed: %d.%02d s" +msgstr "CPU: მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი: %d.%02d წმ, სისტემáƒ: %d.%02d წმ, გáƒáƒ•იდáƒ: %d.%02d წმ" + +#: utils/misc/rls.c:127 +#, c-format +msgid "query would be affected by row-level security policy for table \"%s\"" +msgstr "" + +#: utils/misc/rls.c:129 +#, c-format +msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." +msgstr "" + +#: utils/misc/timeout.c:520 +#, c-format +msgid "cannot add more timeout reasons" +msgstr "კáƒáƒ•შირის დრáƒáƒ˜áƒ¡ გáƒáƒ¡áƒ•ლის მეტი მიზეზის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ" + +#: utils/misc/tzparser.c:61 +#, c-format +msgid "time zone abbreviation \"%s\" is too long (maximum %d characters) in time zone file \"%s\", line %d" +msgstr "" + +#: utils/misc/tzparser.c:73 +#, c-format +msgid "time zone offset %d is out of range in time zone file \"%s\", line %d" +msgstr "" + +#: utils/misc/tzparser.c:112 +#, c-format +msgid "missing time zone abbreviation in time zone file \"%s\", line %d" +msgstr "" + +#: utils/misc/tzparser.c:121 +#, c-format +msgid "missing time zone offset in time zone file \"%s\", line %d" +msgstr "" + +#: utils/misc/tzparser.c:133 +#, c-format +msgid "invalid number for time zone offset in time zone file \"%s\", line %d" +msgstr "" + +#: utils/misc/tzparser.c:169 +#, c-format +msgid "invalid syntax in time zone file \"%s\", line %d" +msgstr "დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლის ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სინტáƒáƒ¥áƒ¡áƒ˜ ხáƒáƒ–ზე %d" + +#: utils/misc/tzparser.c:237 +#, c-format +msgid "time zone abbreviation \"%s\" is multiply defined" +msgstr "დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლის áƒáƒ‘რევიáƒáƒ¢áƒ£áƒ áƒ ერთზე მეტჯერáƒáƒ áƒáƒ¦áƒ¬áƒ”რილი: %s" + +#: utils/misc/tzparser.c:239 +#, c-format +msgid "Entry in time zone file \"%s\", line %d, conflicts with entry in file \"%s\", line %d." +msgstr "" + +#: utils/misc/tzparser.c:301 +#, c-format +msgid "invalid time zone file name \"%s\"" +msgstr "დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლის ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ˜áƒšáƒ˜\"%s\"" + +#: utils/misc/tzparser.c:314 +#, c-format +msgid "time zone file recursion limit exceeded in file \"%s\"" +msgstr "დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ რეკურსიის ლიმიტი გáƒáƒ“áƒáƒªáƒ˜áƒšáƒ”ბულირფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\"" + +#: utils/misc/tzparser.c:353 utils/misc/tzparser.c:366 +#, c-format +msgid "could not read time zone file \"%s\": %m" +msgstr "დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლის ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ \"%s\": %m" + +#: utils/misc/tzparser.c:377 +#, c-format +msgid "line is too long in time zone file \"%s\", line %d" +msgstr "დრáƒáƒ˜áƒ¡ სáƒáƒ áƒ¢áƒ§áƒ”ლის ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") ძáƒáƒšáƒ˜áƒáƒœ გრძელი ხáƒáƒ–ი (\"%d\")" + +#: utils/misc/tzparser.c:401 +#, c-format +msgid "@INCLUDE without file name in time zone file \"%s\", line %d" +msgstr "" + +#: utils/mmgr/aset.c:452 utils/mmgr/bump.c:184 utils/mmgr/generation.c:216 utils/mmgr/slab.c:371 +#, c-format +msgid "Failed while creating memory context \"%s\"." +msgstr "შეცდáƒáƒ›áƒ მეხსიერების კáƒáƒœáƒ¢áƒ”ქსტის შექმნისáƒáƒ¡ \"%s\"." + +#: utils/mmgr/dsa.c:523 utils/mmgr/dsa.c:1364 +#, c-format +msgid "could not attach to dynamic shared area" +msgstr "დინáƒáƒ›áƒ˜áƒ£áƒ áƒ˜ გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების მიმáƒáƒ’რების შეცდáƒáƒ›áƒ" + +#: utils/mmgr/mcxt.c:1155 +#, c-format +msgid "Failed on request of size %zu in memory context \"%s\"." +msgstr "%zu ზáƒáƒ›áƒ˜áƒ¡ მეხსიერების კáƒáƒœáƒ¢áƒ”ქსტიდáƒáƒœ \"%s\" გáƒáƒ›áƒáƒ—ხáƒáƒ•რჩáƒáƒ•áƒáƒ áƒ“áƒ." + +#: utils/mmgr/mcxt.c:1299 +#, c-format +msgid "logging memory contexts of PID %d" +msgstr "პრáƒáƒªáƒ”სის, PID-ით %d მეხსიერების კáƒáƒœáƒ¢áƒ”ქსტები ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ˜áƒ¬áƒ”რებáƒ" + +#: utils/mmgr/portalmem.c:187 +#, c-format +msgid "cursor \"%s\" already exists" +msgstr "კურსáƒáƒ áƒ˜ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: utils/mmgr/portalmem.c:191 +#, c-format +msgid "closing existing cursor \"%s\"" +msgstr "áƒáƒ áƒ¡áƒ”ბული კურსáƒáƒ áƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•რ\"%s\"" + +#: utils/mmgr/portalmem.c:401 +#, c-format +msgid "portal \"%s\" cannot be run" +msgstr "პáƒáƒ áƒ¢áƒáƒšáƒ˜áƒ¡ \"%s\" გáƒáƒ¨áƒ•ებრშეუძლებელიáƒ" + +#: utils/mmgr/portalmem.c:479 +#, c-format +msgid "cannot drop pinned portal \"%s\"" +msgstr "მიჭიკáƒáƒ áƒ¢áƒ”ბული პáƒáƒ áƒ¢áƒáƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ:\"%s\"" + +#: utils/mmgr/portalmem.c:487 +#, c-format +msgid "cannot drop active portal \"%s\"" +msgstr "áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ პáƒáƒ áƒ¢áƒáƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ სეუძლებელიáƒ: %s" + +#: utils/mmgr/portalmem.c:738 +#, c-format +msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" +msgstr "" + +#: utils/mmgr/portalmem.c:1229 +#, c-format +msgid "cannot perform transaction commands inside a cursor loop that is not read-only" +msgstr "" + +#: utils/sort/logtape.c:266 utils/sort/logtape.c:287 +#, c-format +msgid "could not seek to block %lld of temporary file" +msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ %lld-ე ბლáƒáƒ™áƒ–ე გáƒáƒ“áƒáƒ®áƒ•ევრშეუძლებელიáƒ" + +#: utils/sort/sharedtuplestore.c:466 +#, c-format +msgid "unexpected chunk in shared tuplestore temporary file" +msgstr "" + +#: utils/sort/sharedtuplestore.c:548 +#, c-format +msgid "could not seek to block %u in shared tuplestore temporary file" +msgstr "" + +#: utils/sort/tuplesort.c:2372 +#, c-format +msgid "cannot have more than %d runs for an external sort" +msgstr "" + +#: utils/sort/tuplesortvariants.c:1552 +#, c-format +msgid "could not create unique index \"%s\"" +msgstr "უნიკáƒáƒšáƒ£áƒ áƒ˜ ინდექსის შექმნრშეუძლებელიáƒ: \"%s\"" + +#: utils/sort/tuplesortvariants.c:1554 +#, c-format +msgid "Key %s is duplicated." +msgstr "გáƒáƒ¡áƒáƒ¦áƒ”ბი %s დუბლირებულიáƒ." + +#: utils/sort/tuplesortvariants.c:1555 +#, c-format +msgid "Duplicate keys exist." +msgstr "áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს დუბლიკáƒáƒ¢áƒ˜ გáƒáƒ¡áƒáƒ¦áƒ”ბები." + +#: utils/sort/tuplestore.c:518 utils/sort/tuplestore.c:528 utils/sort/tuplestore.c:869 utils/sort/tuplestore.c:973 utils/sort/tuplestore.c:1037 utils/sort/tuplestore.c:1054 utils/sort/tuplestore.c:1256 utils/sort/tuplestore.c:1321 utils/sort/tuplestore.c:1330 +#, c-format +msgid "could not seek in tuplestore temporary file" +msgstr "კáƒáƒ áƒ¢áƒ”ჟების სáƒáƒªáƒáƒ•ი დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ“áƒáƒ®áƒ•ევრშეუძლებელიáƒ" + +#: utils/time/snapmgr.c:536 +#, c-format +msgid "The source transaction is not running anymore." +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ გáƒáƒ¨áƒ•ებული áƒáƒ¦áƒáƒ áƒáƒ." + +#: utils/time/snapmgr.c:1136 +#, c-format +msgid "cannot export a snapshot from a subtransaction" +msgstr "ქვეტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ“áƒáƒœ სწრáƒáƒ¤áƒ˜ áƒáƒ¡áƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ შეუძლებელიáƒ" + +#: utils/time/snapmgr.c:1296 utils/time/snapmgr.c:1301 utils/time/snapmgr.c:1306 utils/time/snapmgr.c:1321 utils/time/snapmgr.c:1326 utils/time/snapmgr.c:1331 utils/time/snapmgr.c:1346 utils/time/snapmgr.c:1351 utils/time/snapmgr.c:1356 utils/time/snapmgr.c:1470 utils/time/snapmgr.c:1486 utils/time/snapmgr.c:1511 +#, c-format +msgid "invalid snapshot data in file \"%s\"" +msgstr "სწრáƒáƒ¤áƒ˜ áƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მები ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\"" + +#: utils/time/snapmgr.c:1393 +#, c-format +msgid "SET TRANSACTION SNAPSHOT must be called before any query" +msgstr "SET TRANSACTION SNAPSHOT ყველრმáƒáƒ—ხáƒáƒ•ნáƒáƒ–ე áƒáƒ“რე უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ—" + +#: utils/time/snapmgr.c:1402 +#, c-format +msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" +msgstr "" + +#: utils/time/snapmgr.c:1411 +#, c-format +msgid "invalid snapshot identifier: \"%s\"" +msgstr "სწრáƒáƒ¤áƒ˜ áƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜: \"%s\"" + +#: utils/time/snapmgr.c:1426 +#, c-format +msgid "snapshot \"%s\" does not exist" +msgstr "სწრáƒáƒ¤áƒ˜ áƒáƒ¡áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: utils/time/snapmgr.c:1524 +#, c-format +msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" +msgstr "" + +#: utils/time/snapmgr.c:1528 +#, c-format +msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" +msgstr "" + +#: utils/time/snapmgr.c:1543 +#, c-format +msgid "cannot import a snapshot from a different database" +msgstr "სხვრბáƒáƒ–იდáƒáƒœ სწრáƒáƒ¤áƒ˜ áƒáƒ¡áƒšáƒ˜áƒ¡ შემáƒáƒ¢áƒáƒœáƒ შეუძლებელიáƒ" + +#, c-format +#~ msgid " GSS (authenticated=%s, encrypted=%s)" +#~ msgstr " GSS (áƒáƒ•თენტიფიცირებული=%s, დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ£áƒšáƒ˜=%s)" + +#, c-format +#~ msgid "-X requires a power of two value between 1 MB and 1 GB" +#~ msgstr "-X მáƒáƒ˜áƒ—ხáƒáƒ•ს მნიშვნელáƒáƒ‘áƒáƒ¡, რáƒáƒ›áƒ”ლიც áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜áƒ დრáƒáƒ áƒ˜áƒ¡ 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡" + +#~ msgid "A value of -1 disables this feature." +#~ msgstr "მნიშვნელáƒáƒ‘რ-1 გáƒáƒ›áƒáƒ áƒ—áƒáƒ•ს áƒáƒ› ფუნქციáƒáƒ¡." + +#, c-format +#~ msgid "COPY escape available only in CSV mode" +#~ msgstr "COPY-ის სპეცსიმბáƒáƒšáƒ მხáƒáƒšáƒáƒ“ CSV -ის რეჟიმშირხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜" + +#, c-format +#~ msgid "COPY force not null available only in CSV mode" +#~ msgstr "COPY-ის პáƒáƒ áƒáƒ›áƒ”ტრი force not null მხáƒáƒšáƒáƒ“ CSV რეჟიმში შეგიძლიáƒáƒ—, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—" + +#, c-format +#~ msgid "COPY force not null only available using COPY FROM" +#~ msgstr "COPY-ის პáƒáƒ áƒáƒ›áƒ”ტრი force not null მხáƒáƒšáƒáƒ“ COPY FROM-ის გáƒáƒ›áƒáƒ§áƒ”ნების დრáƒáƒ¡áƒáƒ ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜" + +#, c-format +#~ msgid "COPY force null available only in CSV mode" +#~ msgstr "COPY-ის პáƒáƒ áƒáƒ›áƒ”ტრი force null მხáƒáƒšáƒáƒ“ CSV რეჟიმში შეგიძლიáƒáƒ—, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—" + +#, c-format +#~ msgid "COPY force null only available using COPY FROM" +#~ msgstr "COPY-ის პáƒáƒ áƒáƒ›áƒ”ტრი force null მხáƒáƒšáƒáƒ“ COPY FROM-ის გáƒáƒ›áƒáƒ§áƒ”ნების დრáƒáƒ¡áƒáƒ ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜" + +#, c-format +#~ msgid "COPY force quote available only in CSV mode" +#~ msgstr "COPY-ის პáƒáƒ áƒáƒ›áƒ”ტრი force quote მხáƒáƒšáƒáƒ“ CSV რეჟიმში შეგიძლიáƒáƒ—, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—" + +#, c-format +#~ msgid "COPY force quote only available using COPY TO" +#~ msgstr "COPY-ის პáƒáƒ áƒáƒ›áƒ”ტრი force quote მხáƒáƒšáƒáƒ“ COPY TO-ის გáƒáƒ›áƒáƒ§áƒ”ნების დრáƒáƒ¡áƒáƒ ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜" + +#, c-format +#~ msgid "COPY quote available only in CSV mode" +#~ msgstr "COPY-ის ბრჭყáƒáƒšáƒ˜ მხáƒáƒšáƒáƒ“ CSV -ის რეჟიმშირხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜" + +#~ msgid "Controls when to replicate or apply each change." +#~ msgstr "áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბს, რáƒáƒ“ის მáƒáƒ®áƒ“ებრთითáƒáƒ”ული ცვლილების რეპლიკáƒáƒªáƒ˜áƒ áƒáƒœ გáƒáƒ“áƒáƒ¢áƒáƒ áƒ”ბáƒ." + +#, c-format +#~ msgid "Could not translate strategy number %d for operator class \"%s\" for access method \"%s\"." +#~ msgstr "ვერ ვთáƒáƒ áƒ’მნე სტრáƒáƒ¢áƒ”გიის ნáƒáƒ›áƒ”რი %d áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡áƒ—ვის \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის \"%s\"." + +#~ msgid "Enables logging of recovery-related debugging information." +#~ msgstr "áƒáƒ¦áƒ“გენáƒáƒ¡áƒ—áƒáƒœ კáƒáƒ•შირში მყáƒáƒ¤áƒ˜ გáƒáƒ›áƒáƒ áƒ—ვის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჟურნáƒáƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რის ჩáƒáƒ áƒ—ვáƒ." + +#~ msgid "Enables per-database user names." +#~ msgstr "თითáƒáƒ”ული ბáƒáƒ–ისთვის სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლების ჩáƒáƒ áƒ—ვáƒ." + +#, c-format +#~ msgid "Existing constraint \"%s\" is marked NO INHERIT." +#~ msgstr "áƒáƒ áƒ¡áƒ”ბული შეზღუდვრ\"%s\" დáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜áƒ, რáƒáƒ’áƒáƒ áƒª NO INHERIT." + +#, c-format +#~ msgid "For example, FROM (SELECT ...) [AS] foo." +#~ msgstr "მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, FROM (SELECT ...) [AS] foo." + +#, c-format +#~ msgid "For example, FROM (VALUES ...) [AS] foo." +#~ msgstr "მáƒáƒ’áƒáƒšáƒ˜áƒ—áƒáƒ“, FROM (VALUES ...) [AS] foo." + +#, c-format +#~ msgid "Foreign tables cannot have TRUNCATE triggers." +#~ msgstr "გáƒáƒ áƒ” ცხრილებს TRUNCATE ტრიგერები ვერ ექნებáƒáƒ—." + +#~ msgid "Incremental parser requires incremental lexer" +#~ msgstr "ინკრემენტულ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელს ინკრემენტული lexer სჭირდებáƒ" + +#, c-format +#~ msgid "Invalid list syntax in parameter %s" +#~ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიის სინტáƒáƒ¥áƒ¡áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრში %s" + +#~ msgid "JSON nested too deep, maximum permitted depth is 6400" +#~ msgstr "JSON მეტისმეტáƒáƒ“ ღრმáƒáƒ“áƒáƒ ერთმáƒáƒœáƒ”თში ჩáƒáƒšáƒáƒ’ებული. მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ დáƒáƒ¡áƒáƒ¨áƒ•ები სიღრმერ6400" + +#, c-format +#~ msgid "JSON_TABLE column names must be distinct from one another" +#~ msgstr "JSON_TABLE-ის სვეტის სáƒáƒ®áƒ”ლები ერთმáƒáƒœáƒ”თისგáƒáƒœ უნდრგáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•დებáƒáƒ“ნენ" + +#~ msgid "Log backtrace for any error with error code XX000 (internal error)." +#~ msgstr "ნებისმიერი შეცდáƒáƒ›áƒ˜áƒ¡ უკუტრეისის ჩáƒáƒ¬áƒ”რრჟურნáƒáƒšáƒ¨áƒ˜ შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ით XX000 (შიდრშეცდáƒáƒ›áƒ)." + +#, c-format +#~ msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" +#~ msgstr "MD5 áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ \"db_user_namespace\" ჩáƒáƒ áƒ—ულიáƒ, მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#, c-format +#~ msgid "MERGE not supported in COPY" +#~ msgstr "COPY-ში MERGE მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#, c-format +#~ msgid "MERGE not supported in WITH query" +#~ msgstr "\"MERGE\"-ი \"WITH\" მáƒáƒ—ხáƒáƒ•ნáƒáƒ¨áƒ˜ მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#, c-format +#~ msgid "Object keys should be text." +#~ msgstr "áƒáƒ‘იექტის გáƒáƒ¡áƒáƒ¦áƒ”ბები ტექსტი უნდრიყáƒáƒ¡." + +#, c-format +#~ msgid "Only range and multirange are supported." +#~ msgstr "მხáƒáƒ áƒ“áƒáƒ­áƒ”რილიáƒ, მხáƒáƒšáƒáƒ“, შუáƒáƒšáƒ”დი დრმრáƒáƒ•áƒáƒšáƒ˜ შუáƒáƒšáƒ”დი." + +#~ msgid "Recursive descent parser cannot use incremental lexer" +#~ msgstr "რეკურსიულ დáƒáƒ¦áƒ›áƒáƒ•áƒáƒš დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელს ინკრემენტული lexer-ის გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ  შეუძლიáƒ" + +#, c-format +#~ msgid "SQL/JSON item cannot be cast to target type" +#~ msgstr "SQL/JSON ჩáƒáƒœáƒáƒ¬áƒ”რი მითითებულ ტიპში ვერ გáƒáƒ“áƒáƒ•áƒ" + +#~ msgid "Shows the character classification and case conversion locale." +#~ msgstr "სიმბáƒáƒšáƒáƒ”ბის ზáƒáƒ›áƒ˜áƒ¡ გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡áƒ დრსიმბáƒáƒšáƒáƒ”ბის კლáƒáƒ¡áƒ˜áƒ¤áƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ ენის ჩვენებáƒ." + +#~ msgid "Shows the collation order locale." +#~ msgstr "დáƒáƒšáƒáƒ’ების წესის ჩვენებáƒ." + +#, c-format +#~ msgid "Subscribed publication %s is subscribing to other publications." +#~ msgid_plural "Subscribed publications %s are subscribing to other publications." +#~ msgstr[0] "გáƒáƒ›áƒáƒ¬áƒ”რილი პუბლიკáƒáƒªáƒ˜áƒ %s სხვრპუბლიკáƒáƒªáƒ˜áƒ”ბს იწერს." +#~ msgstr[1] "გáƒáƒ›áƒáƒ¬áƒ”რილი პუბლიკáƒáƒªáƒ˜áƒ %s სხვრპუბლიკáƒáƒªáƒ˜áƒ”ბს იწერს." + +#, c-format +#~ msgid "The column has an inherited not-null constraint." +#~ msgstr "სვეტს მემკვიდრეáƒáƒ‘ით მიღებული áƒáƒ áƒáƒœáƒ£áƒšáƒáƒ•áƒáƒœáƒ˜ შეზღუდვრგáƒáƒáƒ©áƒœáƒ˜áƒ." + +#, c-format +#~ msgid "There is no suitable operator in operator family \"%s\" for access method \"%s\"." +#~ msgstr "ვერ ვიპáƒáƒ•ე შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის áƒáƒ¯áƒáƒ®áƒ¨áƒ˜ \"%s\" წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ისთვის \"%s\"." + +#, c-format +#~ msgid "Unmatched \"%c\" character." +#~ msgstr "სიმბáƒáƒšáƒ \"%c\" áƒáƒ  ემთხვევáƒ." + +#, c-format +#~ msgid "Use ALTER DATABASE ... REFRESH COLLATION VERSION instead." +#~ msgstr "სáƒáƒœáƒáƒªáƒ•ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ALTER DATABASE ... REFRESH COLLATION VERSION." + +#, c-format +#~ msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." +#~ msgstr "სáƒáƒœáƒáƒªáƒ•ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION." + +#, c-format +#~ msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." +#~ msgstr "სáƒáƒœáƒáƒªáƒ•ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." + +#, c-format +#~ msgid "Use ALTER TABLE instead." +#~ msgstr "áƒáƒ›áƒ˜áƒ¡ ნáƒáƒªáƒ•ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ALTER TABLE." + +#, c-format +#~ msgid "Use ALTER TYPE instead." +#~ msgstr "áƒáƒ›áƒ˜áƒ¡ ნáƒáƒªáƒ•ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ALTER TYPE." + +#, c-format +#~ msgid "VALUES in FROM must have an alias" +#~ msgstr "FROM-ში VALUES-ს áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელირმეტსáƒáƒ®áƒ”ლი ჰქáƒáƒœáƒ“ეს" + +#, c-format +#~ msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" +#~ msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" +#~ msgstr[0] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ მითითებულირ%d ბáƒáƒ˜áƒ¢áƒ˜" +#~ msgstr[1] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ მითითებულირ%d ბáƒáƒ˜áƒ¢áƒ˜" + +#, c-format +#~ msgid "Waiting for LSN can only be executed during recovery." +#~ msgstr "LSN-ის მáƒáƒšáƒáƒ“ინი, მხáƒáƒšáƒáƒ“, áƒáƒ¦áƒ“გენისáƒáƒ¡ შეიძლებáƒ, შესრულდეს." + +#, c-format +#~ msgid "argument %d cannot be null" +#~ msgstr "áƒáƒ áƒ’უმენტი %d ნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" + +#, c-format +#~ msgid "authentication file token too long, skipping: \"%s\"" +#~ msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ კáƒáƒ“ი ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ: \"%s\"" + +#, c-format +#~ msgid "bad magic number in dynamic shared memory segment" +#~ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ’იური რიცხვი დინáƒáƒ›áƒ˜áƒ£áƒ  გáƒáƒ–იáƒáƒ áƒ”ბულ მეხსიერების სეგმენტში" + +#~ msgid "bogus input" +#~ msgstr "სáƒáƒ”ჭვრშეყვáƒáƒœáƒ" + +#, c-format +#~ msgid "cannot add NOT NULL constraint to column \"%s\" of relation \"%s\" with inheritance children" +#~ msgstr "ვერ დáƒáƒ•áƒáƒ›áƒáƒ¢áƒ” NOT NULL შეზღუდვრსვეტს \"%s\" ურთიერთáƒáƒ‘áƒáƒ–ე \"%s\" რáƒáƒ›áƒ”ლსáƒáƒª მემკვიდრეáƒáƒ‘ითი შვილები გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#, c-format +#~ msgid "cannot change NO INHERIT status of NOT NULL constraint \"%s\" in relation \"%s\"" +#~ msgstr "ურთიერთáƒáƒ‘áƒáƒ–ე \"%2$s\" NOT NULL შეზღუდვის \"%1$s\" NO INHERIT სტáƒáƒ¢áƒ£áƒ¡áƒ¡ ვერ შეცვლით" + +#, c-format +#~ msgid "cannot change NO INHERIT status of NOT NULL constraint \"%s\" on relation \"%s\"" +#~ msgstr "ურთიერთáƒáƒ‘áƒáƒ–ე \"%2$s\" NOT NULL შეზღუდვის \"%1$s\" NO INHERIT სტáƒáƒ¢áƒ£áƒ¡áƒ¡ ვერ შეცვლით" + +#, c-format +#~ msgid "cannot change access method of a partitioned table" +#~ msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილის წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ის შეცვლრშეუძლებელიáƒ" + +#, c-format +#~ msgid "cannot commit subtransactions during a parallel operation" +#~ msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ ქვეტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ”ბის გáƒáƒ“áƒáƒ’ზáƒáƒ•ნრშეუძლებელიáƒ" + +#, c-format +#~ msgid "cannot create exclusion constraints on partitioned table \"%s\"" +#~ msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილზე (\"%s\") ექსკლუზიური შეზღუდვების შექმნრშეუძლებელიáƒ" + +#, c-format +#~ msgid "cannot create restricted tokens on this platform: error code %lu" +#~ msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე შეზღუდული კáƒáƒ“ების შექმნრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#, c-format +#~ msgid "cannot move table \"%s\" to schema \"%s\"" +#~ msgstr "ცხრილის (%s) სქემáƒáƒ¨áƒ˜ (%s) გáƒáƒ“áƒáƒ¢áƒáƒœáƒ შეუძლებელიáƒ" + +#, c-format +#~ msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" +#~ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ინდექსის \"%s.%s\" პáƒáƒ áƒáƒšáƒ”ლური რეინდექსი შეუძლებელიáƒ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#, c-format +#~ msgid "cannot start subtransactions during a parallel operation" +#~ msgstr "პáƒáƒ áƒáƒšáƒ”ლური áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ¡ ქვეტრáƒáƒœáƒ¡áƒáƒ¥áƒªáƒ˜áƒ”ბის დáƒáƒ¬áƒ§áƒ”ბრშეუძლებელიáƒ" + +#, c-format +#~ msgid "cannot subtract infinite timestamps" +#~ msgstr "უსáƒáƒ¡áƒ áƒ£áƒšáƒ დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ”ბის გáƒáƒ›áƒáƒ™áƒšáƒ”ბრშეუძლებელიáƒ" + +#, c-format +#~ msgid "collation provider LIBC is not supported on this platform" +#~ msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ›áƒ¬áƒáƒ“ებელი LIBC áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#, c-format +#~ msgid "conversion with OID %u does not exist" +#~ msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#, c-format +#~ msgid "could not fork WAL receiver process: %m" +#~ msgstr "\"WAL\"-ის მიმღების პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#, c-format +#~ msgid "could not fork WAL summarizer process: %m" +#~ msgstr "\"WAL\"-ის შემჯáƒáƒ›áƒ”ბელი პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#, c-format +#~ msgid "could not fork WAL writer process: %m" +#~ msgstr "\"WAL\" -ის ჩáƒáƒ›áƒ¬áƒ”რი პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#, c-format +#~ msgid "could not fork archiver process: %m" +#~ msgstr "áƒáƒ áƒ¥áƒ˜áƒ•áƒáƒ¢áƒáƒ áƒ˜áƒ¡ პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#, c-format +#~ msgid "could not fork autovacuum launcher process: %m" +#~ msgstr "გáƒáƒ›áƒ¨áƒ•ების პრáƒáƒªáƒ”სის áƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის პრáƒáƒ‘ლემáƒ: %m" + +#, c-format +#~ msgid "could not fork autovacuum worker process: %m" +#~ msgstr "áƒáƒ•ტáƒáƒ›áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#, c-format +#~ msgid "could not fork background writer process: %m" +#~ msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ ჩáƒáƒ›áƒ¬áƒ”რის პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#, c-format +#~ msgid "could not fork checkpointer process: %m" +#~ msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილების პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#, c-format +#~ msgid "could not fork slot sync worker process: %m" +#~ msgstr "სლáƒáƒ¢áƒ”ბის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜ შეუძლებელიáƒ: %m" + +#, c-format +#~ msgid "could not fork startup process: %m" +#~ msgstr "გáƒáƒ›áƒ¨áƒ•ები პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#, c-format +#~ msgid "could not fork worker process: %m" +#~ msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის ფáƒáƒ áƒ™áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#, c-format +#~ msgid "could not form array type name for type \"%s\"" +#~ msgstr "ტიპისთვის (%s) მáƒáƒ¡áƒ˜áƒ•ის ტიპის სáƒáƒ®áƒ”ლის ფáƒáƒ áƒ›áƒ˜áƒ áƒ”ბრშეუძლებელიáƒ" + +#, c-format +#~ msgid "could not identify a contained-by operator for type %s" +#~ msgstr "ტიპისთვის \"%s\" áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ constained-by ვერ ვიპáƒáƒ•ე" + +#, c-format +#~ msgid "could not identify an equality operator for foreign key" +#~ msgstr "გáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბისთვის ტáƒáƒšáƒáƒ‘ის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ ვერ ვიპáƒáƒ•ე" + +#, c-format +#~ msgid "could not identify an overlaps operator for foreign key" +#~ msgstr "ვერ áƒáƒ¦áƒ›áƒáƒ•áƒáƒ©áƒ˜áƒœáƒ” გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•ების áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ გáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბისთვის" + +#, c-format +#~ msgid "could not identify an overlaps operator for type %s" +#~ msgstr "ვერ áƒáƒ¦áƒ›áƒáƒ•áƒáƒ©áƒ˜áƒœáƒ” გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•ების áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ ტიპისთვის %s" + +#, c-format +#~ msgid "could not identify current directory: %m" +#~ msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: %m" + +#, c-format +#~ msgid "could not load library \"%s\": error code %lu" +#~ msgstr "ბიბლიáƒáƒ—ეკის (\"%s\") ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu" + +#, c-format +#~ msgid "could not load pg_hba.conf" +#~ msgstr "pg_hba.conf -ის ჩáƒáƒ¢áƒ•ირთვის სეცდáƒáƒ›áƒ" + +#, c-format +#~ msgid "could not read from streaming transaction's changes file \"%s\": read only %zu of %zu bytes" +#~ msgstr "შეკუმშული ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%zu %zu-დáƒáƒœ" + +#, c-format +#~ msgid "could not read from streaming transaction's subxact file \"%s\": read only %zu of %zu bytes" +#~ msgstr "შეკუმშული ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%zu ბáƒáƒ˜áƒ¢áƒ˜ %zu-დáƒáƒœ" + +#, c-format +#~ msgid "could not remove file \"%s\": %s\n" +#~ msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %s\n" + +#, c-format +#~ msgid "could not remove file or directory \"%s\": %m" +#~ msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒœ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე „%s“ ვერ წáƒáƒ˜áƒ¨áƒáƒšáƒ: %m" + +#, c-format +#~ msgid "could not set compression flag for %s: %s" +#~ msgstr "%s-სთვის შეკუმშვის დáƒáƒœáƒ˜áƒ¡ დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" + +#, c-format +#~ msgid "could not stat promote trigger file \"%s\": %m" +#~ msgstr "წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის ტრიგერის ფáƒáƒ˜áƒšáƒ˜ (\"%s\") áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" + +#, c-format +#~ msgid "could not unlink file \"%s\": %m" +#~ msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) ბმულის მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#, c-format +#~ msgid "database is not accepting commands to avoid wraparound data loss in database \"%s\"" +#~ msgstr "ბáƒáƒ–რბრძáƒáƒœáƒ”ბებს áƒáƒ  იღებს, რáƒáƒ—რთáƒáƒ•იდáƒáƒœ áƒáƒ˜áƒªáƒ˜áƒšáƒáƒ¡ ჩáƒáƒªáƒ˜áƒ™áƒ•ლით მáƒáƒœáƒáƒªáƒ”მების კáƒáƒ áƒ’ვრბáƒáƒ–ისთვის \"%s\"" + +#, c-format +#~ msgid "database is not accepting commands to avoid wraparound data loss in database with OID %u" +#~ msgstr "ბáƒáƒ–რბრძáƒáƒœáƒ”ბებს áƒáƒ  იღებს, რáƒáƒ—რთáƒáƒ•იდáƒáƒœ áƒáƒ˜áƒªáƒ˜áƒšáƒáƒ¡ ჩáƒáƒªáƒ˜áƒ™áƒ•ლით მáƒáƒœáƒáƒªáƒ”მების კáƒáƒ áƒ’ვრბáƒáƒ–ისთვის OID-ით %u" + +#, c-format +#~ msgid "date format is not recognized: \"%s\"" +#~ msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ უცნáƒáƒ‘იáƒ: \"%s\"" + +#, c-format +#~ msgid "datetime format is not recognized: \"%s\"" +#~ msgstr "datetime-ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ უცნáƒáƒ‘იáƒ: \"%s\"" + +#, c-format +#~ msgid "duplicate JSON key %s" +#~ msgstr "დუბლირებული JSON გáƒáƒ¡áƒáƒ¦áƒ”ბი %s" + +#, c-format +#~ msgid "duplicate JSON object key" +#~ msgstr "დუბლირებული JSON áƒáƒ‘იექტის გáƒáƒ¡áƒáƒ¦áƒ”ბი" + +#, c-format +#~ msgid "extension with OID %u does not exist" +#~ msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრOID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#, c-format +#~ msgid "gtsvector_in not implemented" +#~ msgstr "gtsvector_in გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" + +#, c-format +#~ msgid "int2vector has too many elements" +#~ msgstr "int2vector -ს მეტისმეტáƒáƒ“ ბევრი ელემენტი áƒáƒ¥áƒ•ს" + +#, c-format +#~ msgid "invalid JSON_TABLE expression" +#~ msgstr "\"JSON_TABLE\"-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ" + +#, c-format +#~ msgid "invalid JSON_TABLE plan" +#~ msgstr "\"JSON_TABLE\"-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გეგმáƒ" + +#, c-format +#~ msgid "invalid checkpoint link in backup_label file" +#~ msgstr "backup_label ფáƒáƒ˜áƒšáƒ¨áƒ˜ áƒáƒ áƒ¡áƒ”ბული სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#, c-format +#~ msgid "invalid length of primary checkpoint record" +#~ msgstr "ძირითáƒáƒ“ი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე" + +#, c-format +#~ msgid "invalid parameter name \"%s\"" +#~ msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი \"%s\"" + +#, c-format +#~ msgid "invalid primary key definition" +#~ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ძირითáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის áƒáƒ¦áƒ¬áƒ”რáƒ" + +#, c-format +#~ msgid "invalid record offset at %X/%X" +#~ msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წáƒáƒœáƒáƒªáƒ•ლებრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#, c-format +#~ msgid "invalid resource manager ID in primary checkpoint record" +#~ msgstr "ძირითáƒáƒ“ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილში áƒáƒ¦áƒ¬áƒ”რილი რესურსის მმáƒáƒ áƒ—ველის ID áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#, c-format +#~ msgid "invalid segment number %d in file \"%s\"" +#~ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სეგმენტის ნáƒáƒ›áƒ”რი %d ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\"" + +#~ msgid "invalid unicode sequence" +#~ msgstr "უნიკáƒáƒ“ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მიმდევრáƒáƒ‘áƒ" + +#, c-format +#~ msgid "invalid xl_info in primary checkpoint record" +#~ msgstr "ძირითáƒáƒ“ი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ xl_info" + +#, c-format +#~ msgid "language with OID %u does not exist" +#~ msgstr "ენრOID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#~ msgid "logical replication apply worker" +#~ msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ“áƒáƒ¢áƒáƒ áƒ”ბის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი" + +#~ msgid "logical replication table synchronization worker" +#~ msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ცხრილის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი" + +#, c-format +#~ msgid "missing contrecord at %X/%X" +#~ msgstr "მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X contrecord áƒáƒšáƒáƒ›áƒ˜ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#, c-format +#~ msgid "must be a superuser to terminate superuser process" +#~ msgstr "ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პრáƒáƒªáƒ”სის დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ”ბლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ" + +#, c-format +#~ msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" +#~ msgstr "\"COPY\"-ის ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¡áƒáƒ¬áƒ”რáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœ pg_write_server_files რáƒáƒšáƒ˜áƒ¡ პრივილეგიებირსáƒáƒ­áƒ˜áƒ áƒ" + +#, c-format +#~ msgid "must be superuser or replication role to use replication slots" +#~ msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის შექმნისთვის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒœ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ წვდáƒáƒ›áƒ”ბირსáƒáƒ­áƒ˜áƒ áƒ" + +#, c-format +#~ msgid "must be superuser to alter superusers" +#~ msgstr "ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის შესáƒáƒªáƒ•ლელáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ" + +#, c-format +#~ msgid "must be superuser to create bypassrls users" +#~ msgstr "bypassrls მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ" + +#, c-format +#~ msgid "must be superuser to create replication users" +#~ msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ" + +#, c-format +#~ msgid "must be superuser to create superusers" +#~ msgstr "ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ" + +#, c-format +#~ msgid "must be superuser to drop superusers" +#~ msgstr "ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ" + +#, c-format +#~ msgid "must be superuser to rename superusers" +#~ msgstr "ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ¡áƒáƒ áƒ¥áƒ›áƒ”ვáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ" + +#, c-format +#~ msgid "must be superuser to set grantor" +#~ msgstr "მიმნიჭებლის დáƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი უნდრბრძáƒáƒœáƒ“ებáƒáƒ“ეთ" + +#, c-format +#~ msgid "must be superuser to skip transaction" +#~ msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒ•ებლáƒáƒ“ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის უფლებებირსáƒáƒ­áƒ˜áƒ áƒ" + +#, c-format +#~ msgid "must have CREATEROLE privilege" +#~ msgstr "უნდრგქáƒáƒœáƒ“ეთ CREATEROLE პრივილეგიáƒ" + +#, c-format +#~ msgid "must have privileges of pg_create_subscription to create subscriptions" +#~ msgstr "გáƒáƒ›áƒáƒ¬áƒ”რების შესáƒáƒ¥áƒ›áƒœáƒ”ლáƒáƒ“ pg_create_subscription-ის პრივილეგიები გჭიდებáƒáƒ—" + +#, c-format +#~ msgid "no SQL/JSON item" +#~ msgstr "\"SQL/JSON\" ჩáƒáƒœáƒáƒ¬áƒ”რების გáƒáƒ áƒ”შე" + +#, c-format +#~ msgid "not-null constraint on column \"%s\" must be removed in child tables too" +#~ msgstr "áƒáƒ áƒáƒœáƒ£áƒšáƒáƒ•áƒáƒœáƒ˜ შეზღუდვრსვეტზე \"%s\" შვილ ცხრილებშიც უნდრწáƒáƒ˜áƒ¨áƒáƒšáƒáƒ¡" + +#, c-format +#~ msgid "not-null constraints on partitioned tables cannot be NO INHERIT" +#~ msgstr "áƒáƒ áƒáƒœáƒ£áƒšáƒáƒ•áƒáƒœáƒ˜ შეზღუდვები დáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილზე NO INHERIT ვერ იქნებáƒ" + +#, c-format +#~ msgid "oidvector has too many elements" +#~ msgstr "oidvector-ს მეტისმეტáƒáƒ“ ბევრი ელემენტი áƒáƒ¥áƒ•ს" + +#, c-format +#~ msgid "operator class with OID %u does not exist" +#~ msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜ OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#, c-format +#~ msgid "operator family with OID %u does not exist" +#~ msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜ OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#, c-format +#~ msgid "operator with OID %u does not exist" +#~ msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#, c-format +#~ msgid "out of memory while trying to decode a record of length %u" +#~ msgstr "%u სიგრძის მქáƒáƒœáƒ” ჩáƒáƒœáƒáƒ¬áƒ”რის დეკáƒáƒ“ირებისთვის მეხსიერებრსáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒ áƒáƒ" + +#, c-format +#~ msgid "parameter \"lc_collate\" must be specified" +#~ msgstr "უნდრიყáƒáƒ¡ მითითებული პáƒáƒ áƒáƒ›áƒ”ტრი \"lc_collate\"" + +#, c-format +#~ msgid "parameter \"lc_ctype\" must be specified" +#~ msgstr "უნდრიყáƒáƒ¡ მითითებული პáƒáƒ áƒáƒ›áƒ”ტრი \"lc_ctype\"" + +#, c-format +#~ msgid "promote trigger file found: %s" +#~ msgstr "ნáƒáƒžáƒáƒ•ნირწáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის ტრიგერის ფáƒáƒ˜áƒšáƒ˜: %s" + +#, c-format +#~ msgid "record length %u at %X/%X too long" +#~ msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის სიგრძე %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#, c-format +#~ msgid "snapshot too old" +#~ msgstr "სწრáƒáƒ¤áƒ˜ áƒáƒ¡áƒšáƒ˜ ძáƒáƒšáƒ˜áƒáƒœ ძველიáƒ" + +#, c-format +#~ msgid "specifying a table access method is not supported on a partitioned table" +#~ msgstr "ცხრილთáƒáƒœ წვდáƒáƒ›áƒ˜áƒ¡ მითითებრდáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილზე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#, c-format +#~ msgid "statistics object with OID %u does not exist" +#~ msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ‘იექტი OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#, c-format +#~ msgid "subquery in FROM must have an alias" +#~ msgstr "ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ \"FROM\"-ში მეტსáƒáƒ®áƒ”ლი უნდრჰქáƒáƒœáƒ“ეს" + +#, c-format +#~ msgid "tablespaces are not supported on this platform" +#~ msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე ცხრილის სივრცეები მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#, c-format +#~ msgid "text search configuration with OID %u does not exist" +#~ msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ OID-ით \"%u\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#, c-format +#~ msgid "text search dictionary with OID %u does not exist" +#~ msgstr "ტექსტის ძებნის ლექსიკáƒáƒœáƒ˜ OID-ით \"%u\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#, c-format +#~ msgid "time format is not recognized: \"%s\"" +#~ msgstr "დრáƒáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ უცნáƒáƒ‘იáƒ: \"%s\"" + +#, c-format +#~ msgid "time_tz format is not recognized: \"%s\"" +#~ msgstr "time_tz-ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ უცნáƒáƒ‘იáƒ: \"%s\"" + +#, c-format +#~ msgid "timestamp format is not recognized: \"%s\"" +#~ msgstr "დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ უცნáƒáƒ‘იáƒ: \"%s\"" + +#, c-format +#~ msgid "timestamp_tz format is not recognized: \"%s\"" +#~ msgstr "timestamp_tz-ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ უცნáƒáƒ‘იáƒ: \"%s\"" + +#, c-format +#~ msgid "unable to map dynamic shared memory segment" +#~ msgstr "დინáƒáƒ›áƒ˜áƒ£áƒ áƒ˜ გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების სეგმენტის მიბმის შეცდáƒáƒ›áƒ" + +#, c-format +#~ msgid "unexpected DEFAULT in COPY data" +#~ msgstr "\"COPY\"-ის მáƒáƒœáƒáƒªáƒ”მებში ნáƒáƒžáƒáƒ•ნირმáƒáƒ£áƒšáƒáƒ“ნელი DEFAULT" + +#~ msgid "unexpected end of quoted string" +#~ msgstr "ციტირებული სტრიქáƒáƒœáƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" + +#, c-format +#~ msgid "unexpected json parse error type: %d" +#~ msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი json-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ˜áƒ¡ ტიპი: %d" + +#, c-format +#~ msgid "unknown compression option \"%s\"" +#~ msgstr "შეკუმშვის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#, c-format +#~ msgid "unlinked permanent statistics file \"%s\"" +#~ msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მუდმივი ფáƒáƒ˜áƒšáƒ˜ მáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜áƒ: %s" + +#, c-format +#~ msgid "unsupported %s action for foreign key constraint using PERIOD" +#~ msgstr "მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი %s ქმედებრგáƒáƒ áƒ” გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვისთვის, რáƒáƒ›áƒ”ლიც PERIOD-ს იყენებს" diff --git a/src/backend/po/ko.po b/src/backend/po/ko.po index f330f3da7e24a..d71eed4b6c0eb 100644 --- a/src/backend/po/ko.po +++ b/src/backend/po/ko.po @@ -3,10 +3,10 @@ # msgid "" msgstr "" -"Project-Id-Version: postgres (PostgreSQL) 13\n" +"Project-Id-Version: postgres (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 20:39+0000\n" -"PO-Revision-Date: 2020-10-27 14:19+0900\n" +"POT-Creation-Date: 2025-01-17 04:41+0000\n" +"PO-Revision-Date: 2025-01-20 16:44+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean Team \n" "Language: ko\n" @@ -15,6 +15,64 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ../common/binaryheap.c:121 ../common/binaryheap.c:159 +#, c-format +msgid "out of binary heap slots" +msgstr "ë°”ì´ë„ˆë¦¬ íž™ 슬롯수 초과" + +#: ../common/compression.c:132 ../common/compression.c:141 +#: ../common/compression.c:150 +#, c-format +msgid "this build does not support compression with %s" +msgstr "ì´ ì„œë²„ëŠ” %s ì••ì¶•ì„ ì§€ì›í•˜ì§€ 않습니다." + +#: ../common/compression.c:205 +msgid "found empty string where a compression option was expected" +msgstr "ì••ì¶• 옵션 ê°’ì´ ì™€ì•¼í•  ìžë¦¬ì— 빈 문ìžì—´ì´ 있습니다." + +#: ../common/compression.c:244 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "알 수 없는 ì••ì¶• 옵션 \"%s\"" + +#: ../common/compression.c:283 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "\"%s\" ì••ì¶• ì˜µì…˜ì€ í•´ë‹¹ ê°’ì„ ì§€ì •í•´ì•¼ 합니다" + +#: ../common/compression.c:292 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "\"%s\" ì••ì¶• ì˜µì…˜ì˜ ê°’ì€ ì •ìˆ˜í˜•ìœ¼ë¡œ 지정해야 합니다." + +#: ../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "\"%s\" ì••ì¶• ì˜µì…˜ì˜ ê°’ì€ ë¶ˆë¦¬ì–¸í˜•ìœ¼ë¡œ 지정해야 합니다." + +#: ../common/compression.c:379 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "\"%s\" ì••ì¶• ì•Œê³ ë¦¬ì¦˜ì€ ì••ì¶• ìˆ˜ì¤€ì„ ì§€ì •í•  수 없습니다." + +#: ../common/compression.c:386 +#, c-format +msgid "" +"compression algorithm \"%s\" expects a compression level between %d and %d " +"(default at %d)" +msgstr "" +"\"%s\" ì••ì¶• ì•Œê³ ë¦¬ì¦˜ì˜ ì••ì¶• ìˆ˜ì¤€ê°’ì€ %d부터 %d까지만 가능합니다. (기본값 %d)" + +#: ../common/compression.c:397 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "\"%s\" ì••ì¶• ì•Œê³ ë¦¬ì¦˜ì€ ë³‘ë ¬ ìž‘ì—…ìž ìˆ˜ë¥¼ 지정할 수 없습니다" + +#: ../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "\"%s\" ì••ì¶• ì•Œê³ ë¦¬ì¦˜ì€ long-distance mode를 ì§€ì›í•˜ì§€ 않ìŒ" + #: ../common/config_info.c:134 ../common/config_info.c:142 #: ../common/config_info.c:150 ../common/config_info.c:158 #: ../common/config_info.c:166 ../common/config_info.c:174 @@ -22,69 +80,66 @@ msgstr "" msgid "not recorded" msgstr "기ë¡ë˜ì–´ 있지 않ìŒ" -#: ../common/controldata_utils.c:68 ../common/controldata_utils.c:73 -#: commands/copy.c:3495 commands/extension.c:3436 utils/adt/genfile.c:125 +#: ../common/controldata_utils.c:93 ../common/controldata_utils.c:97 +#: commands/copyfrom.c:1739 commands/extension.c:3538 utils/adt/genfile.c:123 +#: utils/time/snapmgr.c:1430 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "\"%s\" íŒŒì¼ ì¼ê¸° 모드로 열기 실패: %m" -#: ../common/controldata_utils.c:86 ../common/controldata_utils.c:89 +#: ../common/controldata_utils.c:108 ../common/controldata_utils.c:110 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1276 access/transam/xlog.c:3503 -#: access/transam/xlog.c:4728 access/transam/xlog.c:11121 -#: access/transam/xlog.c:11134 access/transam/xlog.c:11587 -#: access/transam/xlog.c:11667 access/transam/xlog.c:11706 -#: access/transam/xlog.c:11749 access/transam/xlogfuncs.c:662 -#: access/transam/xlogfuncs.c:681 commands/extension.c:3446 libpq/hba.c:499 -#: replication/logical/origin.c:717 replication/logical/origin.c:753 -#: replication/logical/reorderbuffer.c:3599 -#: replication/logical/snapbuild.c:1741 replication/logical/snapbuild.c:1783 -#: replication/logical/snapbuild.c:1811 replication/logical/snapbuild.c:1838 -#: replication/slot.c:1622 replication/slot.c:1663 replication/walsender.c:543 -#: storage/file/buffile.c:441 storage/file/copydir.c:195 -#: utils/adt/genfile.c:200 utils/adt/misc.c:763 utils/cache/relmapper.c:741 +#: access/transam/twophase.c:1369 access/transam/xlog.c:3477 +#: access/transam/xlog.c:4341 access/transam/xlogrecovery.c:1238 +#: access/transam/xlogrecovery.c:1336 access/transam/xlogrecovery.c:1373 +#: access/transam/xlogrecovery.c:1440 backup/basebackup.c:2123 +#: backup/walsummary.c:283 commands/extension.c:3548 libpq/hba.c:764 +#: replication/logical/origin.c:745 replication/logical/origin.c:781 +#: replication/logical/reorderbuffer.c:5113 +#: replication/logical/snapbuild.c:2052 replication/slot.c:2236 +#: replication/slot.c:2277 replication/walsender.c:655 +#: storage/file/buffile.c:470 storage/file/copydir.c:185 +#: utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 #, c-format msgid "could not read file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: ../common/controldata_utils.c:97 ../common/controldata_utils.c:101 -#: access/transam/twophase.c:1279 access/transam/xlog.c:3508 -#: access/transam/xlog.c:4733 replication/logical/origin.c:722 -#: replication/logical/origin.c:761 replication/logical/snapbuild.c:1746 -#: replication/logical/snapbuild.c:1788 replication/logical/snapbuild.c:1816 -#: replication/logical/snapbuild.c:1843 replication/slot.c:1626 -#: replication/slot.c:1667 replication/walsender.c:548 -#: utils/cache/relmapper.c:745 +#: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 +#: access/transam/xlog.c:3482 access/transam/xlog.c:4346 +#: replication/logical/origin.c:750 replication/logical/origin.c:789 +#: replication/logical/snapbuild.c:2057 replication/slot.c:2240 +#: replication/slot.c:2281 replication/walsender.c:660 +#: utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %zu" -#: ../common/controldata_utils.c:112 ../common/controldata_utils.c:117 -#: ../common/controldata_utils.c:256 ../common/controldata_utils.c:259 -#: access/heap/rewriteheap.c:1181 access/heap/rewriteheap.c:1284 +#: ../common/controldata_utils.c:128 ../common/controldata_utils.c:132 +#: ../common/controldata_utils.c:277 ../common/controldata_utils.c:280 +#: access/heap/rewriteheap.c:1141 access/heap/rewriteheap.c:1246 #: access/transam/timeline.c:392 access/transam/timeline.c:438 -#: access/transam/timeline.c:516 access/transam/twophase.c:1288 -#: access/transam/twophase.c:1676 access/transam/xlog.c:3375 -#: access/transam/xlog.c:3543 access/transam/xlog.c:3548 -#: access/transam/xlog.c:3876 access/transam/xlog.c:4698 -#: access/transam/xlog.c:5622 access/transam/xlogfuncs.c:687 -#: commands/copy.c:1810 libpq/be-fsstubs.c:462 libpq/be-fsstubs.c:533 -#: replication/logical/origin.c:655 replication/logical/origin.c:794 -#: replication/logical/reorderbuffer.c:3657 -#: replication/logical/snapbuild.c:1653 replication/logical/snapbuild.c:1851 -#: replication/slot.c:1513 replication/slot.c:1674 replication/walsender.c:558 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:704 -#: storage/file/fd.c:3425 storage/file/fd.c:3528 utils/cache/relmapper.c:753 -#: utils/cache/relmapper.c:892 +#: access/transam/timeline.c:512 access/transam/twophase.c:1381 +#: access/transam/twophase.c:1800 access/transam/xlog.c:3323 +#: access/transam/xlog.c:3517 access/transam/xlog.c:3522 +#: access/transam/xlog.c:3658 access/transam/xlog.c:4311 +#: access/transam/xlog.c:5246 commands/copyfrom.c:1799 commands/copyto.c:325 +#: libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 +#: replication/logical/origin.c:683 replication/logical/origin.c:822 +#: replication/logical/reorderbuffer.c:5165 +#: replication/logical/snapbuild.c:1819 replication/logical/snapbuild.c:1943 +#: replication/slot.c:2126 replication/slot.c:2288 replication/walsender.c:670 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:828 +#: storage/file/fd.c:3753 storage/file/fd.c:3859 utils/cache/relmapper.c:841 +#: utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: ../common/controldata_utils.c:135 +#: ../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "ë°”ì´íЏ 순서 불ì¼ì¹˜" -#: ../common/controldata_utils.c:137 +#: ../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -99,248 +154,301 @@ msgstr "" "ì§€ 않으며\n" "현재 PostgreSQL 설치본과 ì´ ë°ì´í„° 디렉터리가 호환하지 않습니다." -#: ../common/controldata_utils.c:197 ../common/controldata_utils.c:203 -#: ../common/file_utils.c:224 ../common/file_utils.c:283 -#: ../common/file_utils.c:357 access/heap/rewriteheap.c:1267 -#: access/transam/timeline.c:111 access/transam/timeline.c:251 -#: access/transam/timeline.c:348 access/transam/twophase.c:1232 -#: access/transam/xlog.c:3277 access/transam/xlog.c:3417 -#: access/transam/xlog.c:3458 access/transam/xlog.c:3656 -#: access/transam/xlog.c:3741 access/transam/xlog.c:3844 -#: access/transam/xlog.c:4718 access/transam/xlogutils.c:807 -#: postmaster/syslogger.c:1488 replication/basebackup.c:621 -#: replication/basebackup.c:1593 replication/logical/origin.c:707 -#: replication/logical/reorderbuffer.c:2465 -#: replication/logical/reorderbuffer.c:2825 -#: replication/logical/reorderbuffer.c:3579 -#: replication/logical/snapbuild.c:1608 replication/logical/snapbuild.c:1712 -#: replication/slot.c:1594 replication/walsender.c:516 -#: replication/walsender.c:2516 storage/file/copydir.c:161 -#: storage/file/fd.c:679 storage/file/fd.c:3412 storage/file/fd.c:3499 -#: storage/smgr/md.c:475 utils/cache/relmapper.c:724 -#: utils/cache/relmapper.c:836 utils/error/elog.c:1858 -#: utils/init/miscinit.c:1316 utils/init/miscinit.c:1450 -#: utils/init/miscinit.c:1527 utils/misc/guc.c:8252 utils/misc/guc.c:8284 +#: ../common/controldata_utils.c:225 ../common/controldata_utils.c:230 +#: ../common/file_utils.c:70 ../common/file_utils.c:347 +#: ../common/file_utils.c:406 ../common/file_utils.c:480 +#: access/heap/rewriteheap.c:1229 access/transam/timeline.c:111 +#: access/transam/timeline.c:251 access/transam/timeline.c:348 +#: access/transam/twophase.c:1325 access/transam/xlog.c:3230 +#: access/transam/xlog.c:3393 access/transam/xlog.c:3432 +#: access/transam/xlog.c:3625 access/transam/xlog.c:4331 +#: access/transam/xlogrecovery.c:4263 access/transam/xlogrecovery.c:4366 +#: access/transam/xlogutils.c:836 backup/basebackup.c:547 +#: backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:624 +#: postmaster/syslogger.c:1511 replication/logical/origin.c:735 +#: replication/logical/reorderbuffer.c:3766 +#: replication/logical/reorderbuffer.c:4320 +#: replication/logical/reorderbuffer.c:5093 +#: replication/logical/snapbuild.c:1774 replication/logical/snapbuild.c:1884 +#: replication/slot.c:2208 replication/walsender.c:628 +#: replication/walsender.c:3051 storage/file/copydir.c:151 +#: storage/file/fd.c:803 storage/file/fd.c:3510 storage/file/fd.c:3740 +#: storage/file/fd.c:3830 storage/smgr/md.c:661 utils/cache/relmapper.c:818 +#: utils/cache/relmapper.c:935 utils/error/elog.c:2124 +#: utils/init/miscinit.c:1580 utils/init/miscinit.c:1714 +#: utils/init/miscinit.c:1791 utils/misc/guc.c:4777 utils/misc/guc.c:4827 #, c-format msgid "could not open file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: ../common/controldata_utils.c:221 ../common/controldata_utils.c:224 -#: access/transam/twophase.c:1649 access/transam/twophase.c:1658 -#: access/transam/xlog.c:10878 access/transam/xlog.c:10916 -#: access/transam/xlog.c:11329 access/transam/xlogfuncs.c:741 -#: postmaster/syslogger.c:1499 postmaster/syslogger.c:1512 -#: utils/cache/relmapper.c:870 +#: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 +#: access/transam/twophase.c:1773 access/transam/twophase.c:1782 +#: access/transam/xlog.c:9280 access/transam/xlogfuncs.c:698 +#: backup/basebackup_server.c:173 backup/basebackup_server.c:266 +#: backup/walsummary.c:304 postmaster/postmaster.c:4124 +#: postmaster/syslogger.c:1522 postmaster/syslogger.c:1535 +#: postmaster/syslogger.c:1548 utils/cache/relmapper.c:947 #, c-format msgid "could not write file \"%s\": %m" msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m" -#: ../common/controldata_utils.c:239 ../common/controldata_utils.c:245 -#: ../common/file_utils.c:295 ../common/file_utils.c:365 -#: access/heap/rewriteheap.c:961 access/heap/rewriteheap.c:1175 -#: access/heap/rewriteheap.c:1278 access/transam/timeline.c:432 -#: access/transam/timeline.c:510 access/transam/twophase.c:1670 -#: access/transam/xlog.c:3368 access/transam/xlog.c:3537 -#: access/transam/xlog.c:4691 access/transam/xlog.c:10386 -#: access/transam/xlog.c:10413 replication/logical/snapbuild.c:1646 -#: replication/slot.c:1499 replication/slot.c:1604 storage/file/fd.c:696 -#: storage/file/fd.c:3520 storage/smgr/md.c:921 storage/smgr/md.c:962 -#: storage/sync/sync.c:396 utils/cache/relmapper.c:885 utils/misc/guc.c:8035 +#: ../common/controldata_utils.c:263 ../common/controldata_utils.c:268 +#: ../common/file_utils.c:418 ../common/file_utils.c:488 +#: access/heap/rewriteheap.c:925 access/heap/rewriteheap.c:1135 +#: access/heap/rewriteheap.c:1240 access/transam/timeline.c:432 +#: access/transam/timeline.c:506 access/transam/twophase.c:1794 +#: access/transam/xlog.c:3316 access/transam/xlog.c:3511 +#: access/transam/xlog.c:4304 access/transam/xlog.c:8655 +#: access/transam/xlog.c:8700 backup/basebackup_server.c:207 +#: commands/dbcommands.c:514 replication/logical/snapbuild.c:1812 +#: replication/slot.c:2112 replication/slot.c:2218 storage/file/fd.c:820 +#: storage/file/fd.c:3851 storage/smgr/md.c:1331 storage/smgr/md.c:1376 +#: storage/sync/sync.c:446 utils/misc/guc.c:4530 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "\"%s\" íŒŒì¼ fsync 실패: %m" -#: ../common/exec.c:137 ../common/exec.c:254 ../common/exec.c:300 +#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:158 +#: ../common/cryptohash_openssl.c:356 ../common/exec.c:562 ../common/exec.c:607 +#: ../common/exec.c:699 ../common/hmac.c:309 ../common/hmac.c:325 +#: ../common/hmac_openssl.c:160 ../common/hmac_openssl.c:357 +#: ../common/md5_common.c:156 ../common/parse_manifest.c:157 +#: ../common/parse_manifest.c:852 ../common/psprintf.c:143 +#: ../common/scram-common.c:268 ../common/stringinfo.c:314 ../port/path.c:751 +#: ../port/path.c:788 ../port/path.c:805 access/transam/twophase.c:1434 +#: access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1352 +#: libpq/auth.c:1396 libpq/auth.c:1953 libpq/be-secure-gssapi.c:524 +#: postmaster/bgworker.c:355 postmaster/bgworker.c:945 +#: postmaster/postmaster.c:3558 postmaster/postmaster.c:4018 +#: postmaster/postmaster.c:4380 postmaster/walsummarizer.c:935 +#: replication/libpqwalreceiver/libpqwalreceiver.c:387 +#: replication/logical/logical.c:210 replication/walsender.c:835 +#: storage/buffer/localbuf.c:606 storage/file/fd.c:912 storage/file/fd.c:1443 +#: storage/file/fd.c:1604 storage/file/fd.c:2531 storage/ipc/procarray.c:1465 +#: storage/ipc/procarray.c:2219 storage/ipc/procarray.c:2226 +#: storage/ipc/procarray.c:2731 storage/ipc/procarray.c:3435 +#: utils/adt/formatting.c:1725 utils/adt/formatting.c:1873 +#: utils/adt/formatting.c:2075 utils/adt/pg_locale.c:532 +#: utils/adt/pg_locale.c:696 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:516 +#: utils/hash/dynahash.c:616 utils/hash/dynahash.c:1099 utils/mb/mbutils.c:401 +#: utils/mb/mbutils.c:429 utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 +#: utils/misc/guc.c:649 utils/misc/guc.c:674 utils/misc/guc.c:1062 +#: utils/misc/guc.c:4508 utils/misc/tzparser.c:477 utils/mmgr/aset.c:451 +#: utils/mmgr/bump.c:183 utils/mmgr/dsa.c:707 utils/mmgr/dsa.c:729 +#: utils/mmgr/dsa.c:810 utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1154 +#: utils/mmgr/slab.c:370 #, c-format -msgid "could not identify current directory: %m" -msgstr "현재 디렉터리를 파악할 수 ì—†ìŒ: %m" +msgid "out of memory" +msgstr "메모리 부족" + +#: ../common/cryptohash.c:266 ../common/cryptohash.c:272 +#: ../common/cryptohash_openssl.c:368 ../common/cryptohash_openssl.c:376 +#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:369 +#: ../common/hmac_openssl.c:377 +msgid "success" +msgstr "성공" + +#: ../common/cryptohash.c:268 ../common/cryptohash_openssl.c:370 +#: ../common/hmac_openssl.c:371 +msgid "destination buffer too small" +msgstr "ëŒ€ìƒ ë²„í¼ê°€ 너무 작습니다." + +#: ../common/cryptohash_openssl.c:372 ../common/hmac_openssl.c:373 +msgid "OpenSSL failure" +msgstr "OpenSSL 실패" -#: ../common/exec.c:156 +#: ../common/exec.c:174 #, c-format -msgid "invalid binary \"%s\"" -msgstr "ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ íŒŒì¼ \"%s\"" +msgid "invalid binary \"%s\": %m" +msgstr "\"%s\" 파ì¼ì€ ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼ìž„: %m" -#: ../common/exec.c:206 +#: ../common/exec.c:217 #, c-format -msgid "could not read binary \"%s\"" -msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ" +msgid "could not read binary \"%s\": %m" +msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" # translator: %s is IPv4, IPv6, or Unix -#: ../common/exec.c:214 +#: ../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "\"%s\" 실행 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: ../common/exec.c:270 ../common/exec.c:309 utils/init/miscinit.c:395 +#: ../common/exec.c:252 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "\"%s\" ì´ë¦„ì˜ ë””ë ‰í„°ë¦¬ë¡œ ì´ë™í•  수 없습니다: %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "\"%s\" ìƒëŒ€ 경로를 절대 경로로 바꿀 수 ì—†ìŒ: %m" -#: ../common/exec.c:287 access/transam/xlog.c:10750 -#: replication/basebackup.c:1418 utils/adt/misc.c:337 +#: ../common/exec.c:382 commands/collationcmds.c:876 commands/copyfrom.c:1723 +#: commands/copyto.c:654 libpq/be-secure-common.c:59 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "\"%s\" 심볼릭 ë§í¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" +msgid "could not execute command \"%s\": %m" +msgstr "\"%s\" ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ: %m" -#: ../common/exec.c:410 -#, c-format -msgid "pclose failed: %m" -msgstr "pclose 실패: %m" - -#: ../common/exec.c:539 ../common/exec.c:584 ../common/exec.c:676 -#: ../common/psprintf.c:143 ../common/stringinfo.c:305 ../port/path.c:630 -#: ../port/path.c:668 ../port/path.c:685 access/transam/twophase.c:1341 -#: access/transam/xlog.c:6493 lib/dshash.c:246 libpq/auth.c:1090 -#: libpq/auth.c:1491 libpq/auth.c:1559 libpq/auth.c:2089 -#: libpq/be-secure-gssapi.c:484 postmaster/bgworker.c:336 -#: postmaster/bgworker.c:893 postmaster/postmaster.c:2518 -#: postmaster/postmaster.c:2540 postmaster/postmaster.c:4166 -#: postmaster/postmaster.c:4868 postmaster/postmaster.c:4938 -#: postmaster/postmaster.c:5635 postmaster/postmaster.c:5995 -#: replication/libpqwalreceiver/libpqwalreceiver.c:276 -#: replication/logical/logical.c:176 replication/walsender.c:590 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:834 storage/file/fd.c:1304 -#: storage/file/fd.c:1465 storage/file/fd.c:2270 storage/ipc/procarray.c:1045 -#: storage/ipc/procarray.c:1541 storage/ipc/procarray.c:1548 -#: storage/ipc/procarray.c:1972 storage/ipc/procarray.c:2597 -#: utils/adt/cryptohashes.c:45 utils/adt/cryptohashes.c:65 -#: utils/adt/formatting.c:1700 utils/adt/formatting.c:1824 -#: utils/adt/formatting.c:1949 utils/adt/pg_locale.c:484 -#: utils/adt/pg_locale.c:648 utils/adt/regexp.c:223 utils/fmgr/dfmgr.c:229 -#: utils/hash/dynahash.c:450 utils/hash/dynahash.c:559 -#: utils/hash/dynahash.c:1071 utils/mb/mbutils.c:401 utils/mb/mbutils.c:428 -#: utils/mb/mbutils.c:757 utils/mb/mbutils.c:783 utils/misc/guc.c:4846 -#: utils/misc/guc.c:4862 utils/misc/guc.c:4875 utils/misc/guc.c:8013 -#: utils/misc/tzparser.c:467 utils/mmgr/aset.c:475 utils/mmgr/dsa.c:701 -#: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:233 -#: utils/mmgr/mcxt.c:821 utils/mmgr/mcxt.c:857 utils/mmgr/mcxt.c:895 -#: utils/mmgr/mcxt.c:933 utils/mmgr/mcxt.c:969 utils/mmgr/mcxt.c:1000 -#: utils/mmgr/mcxt.c:1036 utils/mmgr/mcxt.c:1088 utils/mmgr/mcxt.c:1123 -#: utils/mmgr/mcxt.c:1158 utils/mmgr/slab.c:235 +#: ../common/exec.c:394 libpq/be-secure-common.c:71 #, c-format -msgid "out of memory" -msgstr "메모리 부족" +msgid "could not read from command \"%s\": %m" +msgstr "\"%s\" 명령ì—서 ì½ì„ 수 ì—†ìŒ: %m" + +#: ../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "\"%s\" ëª…ë ¹ì€ ì•„ë¬´ëŸ° ë°ì´í„°ë„ 반환하지 않았ìŒ" + +#: ../common/exec.c:424 libpq/pqcomm.c:192 storage/ipc/latch.c:1169 +#: storage/ipc/latch.c:1349 storage/ipc/latch.c:1582 storage/ipc/latch.c:1744 +#: storage/ipc/latch.c:1870 +#, c-format +msgid "%s() failed: %m" +msgstr "%s() 실패: %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 -#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:162 -#: ../common/psprintf.c:145 ../port/path.c:632 ../port/path.c:670 -#: ../port/path.c:687 utils/misc/ps_status.c:181 utils/misc/ps_status.c:189 -#: utils/misc/ps_status.c:219 utils/misc/ps_status.c:227 +#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 +#: ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:790 +#: ../port/path.c:807 utils/misc/ps_status.c:193 utils/misc/ps_status.c:201 +#: utils/misc/ps_status.c:228 utils/misc/ps_status.c:236 #, c-format msgid "out of memory\n" msgstr "메모리 부족\n" -#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:154 +#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "null í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" -#: ../common/file_utils.c:79 ../common/file_utils.c:181 -#: access/transam/twophase.c:1244 access/transam/xlog.c:10854 -#: access/transam/xlog.c:10892 access/transam/xlog.c:11109 -#: access/transam/xlogarchive.c:110 access/transam/xlogarchive.c:226 -#: commands/copy.c:1938 commands/copy.c:3505 commands/extension.c:3425 -#: commands/tablespace.c:795 commands/tablespace.c:886 -#: replication/basebackup.c:444 replication/basebackup.c:627 -#: replication/basebackup.c:700 replication/logical/snapbuild.c:1522 -#: storage/file/copydir.c:68 storage/file/copydir.c:107 storage/file/fd.c:1816 -#: storage/file/fd.c:3096 storage/file/fd.c:3278 storage/file/fd.c:3364 -#: utils/adt/dbsize.c:70 utils/adt/dbsize.c:222 utils/adt/dbsize.c:302 -#: utils/adt/genfile.c:416 utils/adt/genfile.c:642 guc-file.l:1061 +#: ../common/file_utils.c:76 storage/file/fd.c:3516 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ëŒ€ìƒìœ¼ë¡œ íŒŒì¼ ì‹œìŠ¤í…œ ë™ê¸°í™”를 í•  수 없습니다: %m" + +#: ../common/file_utils.c:120 ../common/file_utils.c:566 +#: ../common/file_utils.c:570 access/transam/twophase.c:1337 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 +#: backup/basebackup.c:355 backup/basebackup.c:553 backup/basebackup.c:624 +#: backup/walsummary.c:247 backup/walsummary.c:254 commands/copyfrom.c:1749 +#: commands/copyto.c:700 commands/extension.c:3527 commands/tablespace.c:804 +#: commands/tablespace.c:893 postmaster/pgarch.c:680 +#: replication/logical/snapbuild.c:1670 replication/logical/snapbuild.c:2173 +#: storage/file/fd.c:1968 storage/file/fd.c:2054 storage/file/fd.c:3564 +#: utils/adt/dbsize.c:105 utils/adt/dbsize.c:257 utils/adt/dbsize.c:337 +#: utils/adt/genfile.c:437 utils/adt/genfile.c:612 utils/adt/misc.c:340 #, c-format msgid "could not stat file \"%s\": %m" msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m" -#: ../common/file_utils.c:158 ../common/pgfnames.c:48 commands/tablespace.c:718 -#: commands/tablespace.c:728 postmaster/postmaster.c:1509 -#: storage/file/fd.c:2673 storage/file/reinit.c:122 utils/adt/misc.c:259 -#: utils/misc/tzparser.c:338 +#: ../common/file_utils.c:130 ../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ì´ ë¹Œë“œëŠ” \"%s\" ë™ê¸°í™” ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: ../common/file_utils.c:151 ../common/file_utils.c:281 +#: ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 +#: commands/tablespace.c:738 postmaster/postmaster.c:1468 +#: storage/file/fd.c:2933 storage/file/reinit.c:126 utils/adt/misc.c:256 +#: utils/misc/tzparser.c:339 #, c-format msgid "could not open directory \"%s\": %m" msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m" -#: ../common/file_utils.c:192 ../common/pgfnames.c:69 storage/file/fd.c:2685 +#: ../common/file_utils.c:169 ../common/file_utils.c:315 +#: ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2945 #, c-format msgid "could not read directory \"%s\": %m" msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" -#: ../common/file_utils.c:375 access/transam/xlogarchive.c:411 -#: postmaster/syslogger.c:1523 replication/logical/snapbuild.c:1665 -#: replication/slot.c:650 replication/slot.c:1385 replication/slot.c:1527 -#: storage/file/fd.c:714 utils/time/snapmgr.c:1350 +#: ../common/file_utils.c:498 access/transam/xlogarchive.c:389 +#: postmaster/pgarch.c:834 postmaster/syslogger.c:1559 +#: replication/logical/snapbuild.c:1831 replication/slot.c:936 +#: replication/slot.c:1998 replication/slot.c:2140 storage/file/fd.c:838 +#: utils/time/snapmgr.c:1255 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" -#: ../common/jsonapi.c:1064 +#: ../common/hmac.c:323 +msgid "internal error" +msgstr "ë‚´ë¶€ 오류" + +#: ../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "ìž¬ê·€ì  í•˜í–¥ 구문분ì„기는 ì¦ë¶„ 토í°ë¶„ì„ê¸°ì„ ì‚¬ìš©í•  수 없습니다." + +#: ../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "ì¦ë¶„ 구문분ì„기는 ì¦ë¶„ 토í°ë¶„ì„기를 필요로 합니다." + +#: ../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON ê³„ì¸µì´ ë„ˆë¬´ 깊ìŒ, 허용하는 최대 깊ì´ëŠ” 6400입니다." + +#: ../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "ìž˜ëª»ëœ ì´ìŠ¤ì¼€ì´í”„ ì¡°í•©: \"\\%s\"" +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "ìž˜ëª»ëœ ì´ìŠ¤ì¼€ì´í”„ ì¡°í•©: \"\\%.*s\"" -#: ../common/jsonapi.c:1067 +#: ../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x ê°’ì˜ ë¬¸ìžëŠ” ì´ìŠ¤ì¼€ì´í”„ 처리를 해야함." -#: ../common/jsonapi.c:1070 +#: ../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "ìž…ë ¥ ìžë£Œì˜ ëì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%s\" ê°’ì´ ë” ìžˆìŒ." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "ìž…ë ¥ ìžë£Œì˜ ëì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%.*s\" ê°’ì´ ë” ìžˆìŒ." -#: ../common/jsonapi.c:1073 +#: ../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "\"]\" ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "ë°°ì—´ 요소나 \"]\" ê°€ í•„ìš”í•œë° \"%.*s\"ì´(ê°€) 있ìŒ" -#: ../common/jsonapi.c:1076 +#: ../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "\",\" ë˜ëŠ” \"]\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "\",\" ë˜ëŠ” \"]\"ê°€ í•„ìš”í•œë° \"%.*s\"ì´(ê°€) 있ìŒ" -#: ../common/jsonapi.c:1079 +#: ../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "\":\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" +msgid "Expected \":\", but found \"%.*s\"." +msgstr "\":\"ê°€ í•„ìš”í•œë° \"%.*s\"ì´(ê°€) 있ìŒ" -#: ../common/jsonapi.c:1082 +#: ../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "JSON ê°’ì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%s\" ê°’ìž„" +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "JSON ê°’ì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%.*s\" ê°’ìž„" -#: ../common/jsonapi.c:1085 +#: ../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "ìž…ë ¥ 문ìžì—´ì´ 예ìƒì¹˜ 않게 ë났ìŒ." -#: ../common/jsonapi.c:1087 +#: ../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "\"}\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "문ìžì—´ì´ë‚˜ \"}\"ê°€ í•„ìš”í•œë° \"%.*s\"ì´(ê°€) 있ìŒ" -#: ../common/jsonapi.c:1090 +#: ../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "\",\" ë˜ëŠ” \"}\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "\",\" ë˜ëŠ” \"}\"ê°€ í•„ìš”í•œë° \"%.*s\"ì´(ê°€) 있ìŒ" -#: ../common/jsonapi.c:1093 +#: ../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "문ìžì—´ ê°’ì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%s\" ê°’ìž„" +msgid "Expected string, but found \"%.*s\"." +msgstr "문ìžì—´ ê°’ì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%.*s\" ê°’ìž„" -#: ../common/jsonapi.c:1096 +#: ../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "ìž˜ëª»ëœ í† í°: \"%s\"" +msgid "Token \"%.*s\" is invalid." +msgstr "ìž˜ëª»ëœ í† í°: \"%.*s\"" -#: ../common/jsonapi.c:1099 jsonpath_scan.l:499 +#: ../common/jsonapi.c:2164 jsonpath_scan.l:608 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 ê°’ì€ text 형으로 변환할 수 ì—†ìŒ." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." -msgstr "\"\\u\" í‘œê¸°ë²•ì€ ë’¤ì— 4ê°œì˜ 16진수가 와야합니다." +msgstr "\"\\u\" í‘œê¸°ë²•ì€ ë’¤ì— 4ê°œì˜ 16진수가 와야 합니다." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:2169 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -348,32 +456,219 @@ msgstr "" "서버 ì¸ì½”ë”©ì´ UTF8ì´ ì•„ë‹Œ 경우 007F보다 í° ì½”ë“œ ì§€ì  ê°’ì—는 유니코드 ì´ìŠ¤ì¼€ì´" "프 ê°’ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: ../common/jsonapi.c:1106 jsonpath_scan.l:520 +#: ../common/jsonapi.c:2178 +#, c-format +msgid "" +"Unicode escape value could not be translated to the server's encoding %s." +msgstr "유니코드 ì´ìŠ¤ì¼€ì´í”„ ê°’ì„ %s 서버 ì¸ì½”딩으로 변환할 수 ì—†ìŒ." + +#: ../common/jsonapi.c:2185 jsonpath_scan.l:641 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "유니코드 ìƒìœ„ surrogate(딸림 코드)는 ìƒìœ„ 딸림 코드 ë’¤ì— ì˜¤ë©´ 안ë¨." -#: ../common/jsonapi.c:1108 jsonpath_scan.l:531 jsonpath_scan.l:541 -#: jsonpath_scan.l:583 +#: ../common/jsonapi.c:2187 jsonpath_scan.l:652 jsonpath_scan.l:662 +#: jsonpath_scan.l:713 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "유니코드 ìƒìœ„ surrogate(딸림 코드) ë’¤ì—는 하위 딸림 코드가 있어야 함." -#: ../common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "심ê°: " - -#: ../common/logging.c:243 +#: ../common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../common/logging.c:250 +#: ../common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " +#: ../common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + +#: ../common/parse_manifest.c:159 ../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "ë§¤ë‹ˆíŽ˜ìŠ¤íŠ¸ì˜ ì²´í¬ì„¬ì„ 초기화할 수 ì—†ìŒ" + +#: ../common/parse_manifest.c:203 ../common/parse_manifest.c:260 +msgid "manifest ended unexpectedly" +msgstr "매니페스트가 예ìƒì¹˜ 않게 ë났ìŒ." + +#: ../common/parse_manifest.c:209 ../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "ë§¤ë‹ˆíŽ˜ìŠ¤íŠ¸ì˜ ì²´í¬ì„¬ì„ 갱신할 수 ì—†ìŒ" + +#: ../common/parse_manifest.c:301 +msgid "unexpected object start" +msgstr "예ìƒì¹˜ ì•Šì€ ê°ì²´ 시작" + +#: ../common/parse_manifest.c:336 +msgid "unexpected object end" +msgstr "예ìƒì¹˜ ì•Šì€ ê°ì²´ ë" + +#: ../common/parse_manifest.c:365 +msgid "unexpected array start" +msgstr "예ìƒì¹˜ ì•Šì€ ë°°ì—´ 시작" + +#: ../common/parse_manifest.c:390 +msgid "unexpected array end" +msgstr "예ìƒì¹˜ ì•Šì€ ë°°ì—´ ë" + +#: ../common/parse_manifest.c:417 +msgid "expected version indicator" +msgstr "예ìƒì¹˜ ì•Šì€ ë²„ì „ 지시ìž" + +#: ../common/parse_manifest.c:453 +msgid "unrecognized top-level field" +msgstr "알 수 없는 최ìƒìœ„ 수준 필드" + +#: ../common/parse_manifest.c:472 +msgid "unexpected file field" +msgstr "예기치 ì•Šì€ íŒŒì¼ í•„ë“œ" + +#: ../common/parse_manifest.c:486 +msgid "unexpected WAL range field" +msgstr "예ìƒì¹˜ ì•Šì€ WAL 범위 필드" + +#: ../common/parse_manifest.c:492 +msgid "unexpected object field" +msgstr "예기치 ì•Šì€ ê°ì²´ 필드" + +#: ../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "예기치 ì•Šì€ ìŠ¤ì¹¼ë¼" + +#: ../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "매니페스트 ë²„ì „ì´ ì •ìˆ˜ê°€ 아님" + +#: ../common/parse_manifest.c:612 +msgid "unexpected manifest version" +msgstr "예기치 ì•Šì€ ë§¤ë‹ˆíŽ˜ìŠ¤íŠ¸ 버전" + +#: ../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "ë§¤ë‹ˆíŽ˜ìŠ¤íŠ¸ì— ìžˆëŠ” 시스템 ì‹ë³„ 번호가 정수가 아님" + +#: ../common/parse_manifest.c:661 +msgid "missing path name" +msgstr "경로 ì´ë¦„ì´ ë¹ ì¡ŒìŒ" + +#: ../common/parse_manifest.c:664 +msgid "both path name and encoded path name" +msgstr "경로 ì´ë¦„ê³¼ ì¸ì½”ë”©ëœ ê²½ë¡œ ì´ë¦„ 모ë‘" + +#: ../common/parse_manifest.c:666 +msgid "missing size" +msgstr "í¬ê¸°ê°€ 빠졌ìŒ" + +#: ../common/parse_manifest.c:669 +msgid "checksum without algorithm" +msgstr "알고리즘 ìƒëžµëœ ì²´í¬ì„¬" + +#: ../common/parse_manifest.c:683 +msgid "could not decode file name" +msgstr "íŒŒì¼ ì´ë¦„ì„ ë””ì½”ë”©í•  수 ì—†ìŒ" + +#: ../common/parse_manifest.c:693 +msgid "file size is not an integer" +msgstr "íŒŒì¼ í¬ê¸°ê°€ 정수가 아님" + +#: ../common/parse_manifest.c:699 backup/basebackup.c:870 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "알 수 없는 ì²´í¬ì„¬ 알고리즘: \"%s\"" + +#: ../common/parse_manifest.c:718 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "\"%s\" 파ì¼ì˜ ìž˜ëª»ëœ ì²´í¬ì„¬: \"%s\"" + +#: ../common/parse_manifest.c:761 +msgid "missing timeline" +msgstr "타임ë¼ì¸ ì—†ìŒ" + +#: ../common/parse_manifest.c:763 +msgid "missing start LSN" +msgstr "시작 LSN ì—†ìŒ" + +#: ../common/parse_manifest.c:765 +msgid "missing end LSN" +msgstr "마침 LSN ì—†ìŒ" + +#: ../common/parse_manifest.c:771 +msgid "timeline is not an integer" +msgstr "타림ë¼ì¸ ê°’ì´ ìˆ«ìžê°€ 아님" + +#: ../common/parse_manifest.c:774 +msgid "could not parse start LSN" +msgstr "시작 LSN 구문 오류" + +#: ../common/parse_manifest.c:777 +msgid "could not parse end LSN" +msgstr "마침 LSN 구문 오류" + +#: ../common/parse_manifest.c:842 +msgid "expected at least 2 lines" +msgstr "최소 ë‘ ì¤„ì´ í•„ìš”í•¨" + +#: ../common/parse_manifest.c:845 +msgid "last line not newline-terminated" +msgstr "마지막 ì¤„ì— ì¤„ë°”ê¿ˆ ë¬¸ìž ì—†ìŒ" + +#: ../common/parse_manifest.c:864 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "매니페스트 ì²´í¬ì„¬ 최종 정리를 못했ìŒ" + +#: ../common/parse_manifest.c:868 +#, c-format +msgid "manifest has no checksum" +msgstr "ë§¤ë‹ˆíŽ˜ìŠ¤íŠ¸ì— ì²´í¬ì„¬ ì—†ìŒ" + +#: ../common/parse_manifest.c:872 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "ìž˜ëª»ëœ ë§¤ë‹ˆíŽ˜ìŠ¤íŠ¸ ì²´í¬ì„¬: \"%s\"" + +#: ../common/parse_manifest.c:876 +#, c-format +msgid "manifest checksum mismatch" +msgstr "매니페스트 ì²´í¬ì„¬ 불ì¼ì¹˜" + +#: ../common/parse_manifest.c:891 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "백업 매니페스트 ë¶„ì„ ì‹¤íŒ¨: %s" + +#: ../common/percentrepl.c:79 ../common/percentrepl.c:85 +#: ../common/percentrepl.c:118 ../common/percentrepl.c:124 +#: tcop/backend_startup.c:741 utils/misc/guc.c:3167 utils/misc/guc.c:3208 +#: utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6931 +#: utils/misc/guc.c:6972 +#, c-format +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "ìž˜ëª»ëœ \"%s\" 매개 ë³€ìˆ˜ì˜ ê°’: \"%s\"" + +#: ../common/percentrepl.c:80 ../common/percentrepl.c:86 +#, c-format +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "\"%%\" ì´ìŠ¤ì¼€ì´í”„ ë¬¸ìž ë’¤ì— ìž˜ëª»ëœ ë¬¸ìžì—´ ë" + +#: ../common/percentrepl.c:119 ../common/percentrepl.c:125 +#, c-format +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "\"%%%c\" 치환 형ì‹ì— 안맞는 문ìžì—´" + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -389,69 +684,75 @@ msgstr "ìž˜ëª»ëœ í¬í¬ ì´ë¦„" msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "유효한 í¬í¬ ì´ë¦„ì€ \"main\", \"fsm\" ë° \"vm\"입니다." -#: ../common/restricted_token.c:64 libpq/auth.c:1521 libpq/auth.c:2520 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "\"%s\" ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 불러 올 수 ì—†ìŒ: 오류 코드 %lu" - -#: ../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "ì´ ìš´ì˜ì²´ì œì—서 restricted 토í°ì„ 만들 수 ì—†ìŒ: 오류 코드 %lu" - -#: ../common/restricted_token.c:82 +#: ../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "프로세스 토í°ì„ ì—´ 수 ì—†ìŒ: 오류 코드 %lu" -#: ../common/restricted_token.c:97 +#: ../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "SID를 할당할 수 ì—†ìŒ: 오류 코드 %lu" -#: ../common/restricted_token.c:119 +#: ../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "restricted 토í°ì„ 만들 수 ì—†ìŒ: 오류 코드 %lu" -#: ../common/restricted_token.c:140 +#: ../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "\"%s\" 명령용 프로세스를 시작할 수 ì—†ìŒ: 오류 코드 %lu" -#: ../common/restricted_token.c:178 +#: ../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "restricted 토í°ìœ¼ë¡œ 재실행할 수 ì—†ìŒ: 오류 코드 %lu" -#: ../common/restricted_token.c:194 +#: ../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "하위 í”„ë¡œì„¸ìŠ¤ì˜ ì¢…ë£Œ 코드를 구할 수 ì—†ìŒ: 오류 코드 %lu" -#: ../common/rmtree.c:79 replication/basebackup.c:1171 -#: replication/basebackup.c:1347 +#: ../common/rmtree.c:97 access/heap/rewriteheap.c:1214 +#: access/transam/twophase.c:1733 access/transam/xlogarchive.c:119 +#: access/transam/xlogarchive.c:399 postmaster/postmaster.c:1048 +#: postmaster/syslogger.c:1488 replication/logical/origin.c:591 +#: replication/logical/reorderbuffer.c:4589 +#: replication/logical/snapbuild.c:1712 replication/logical/snapbuild.c:2146 +#: replication/slot.c:2192 storage/file/fd.c:878 storage/file/fd.c:3378 +#: storage/file/fd.c:3440 storage/file/reinit.c:261 storage/ipc/dsm.c:343 +#: storage/smgr/md.c:381 storage/smgr/md.c:440 storage/sync/sync.c:243 +#: utils/time/snapmgr.c:1591 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "íŒŒì¼ ë˜ëŠ” 디렉터리 \"%s\"ì˜ ìƒíƒœë¥¼ 확ì¸í•  수 ì—†ìŒ: %m" +msgid "could not remove file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 삭제할 수 ì—†ìŒ: %m" -#: ../common/rmtree.c:101 ../common/rmtree.c:113 +#: ../common/rmtree.c:124 commands/tablespace.c:767 commands/tablespace.c:780 +#: commands/tablespace.c:815 commands/tablespace.c:905 storage/file/fd.c:3370 +#: storage/file/fd.c:3779 #, c-format -msgid "could not remove file or directory \"%s\": %m" -msgstr "\"%s\" 디렉터리나 파ì¼ì„ 삭제할 수 ì—†ìŒ: %m" +msgid "could not remove directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 삭제할 수 ì—†ìŒ: %m" -# # nonun 부분 begin -#: ../common/saslprep.c:1087 -#, c-format -msgid "password too long" -msgstr "비밀번호가 너무 ê¹ë‹ˆë‹¤." +#: ../common/scram-common.c:281 +msgid "could not encode salt" +msgstr "salt를 ì¸ì½”드할 수 ì—†ìŒ" + +#: ../common/scram-common.c:297 +msgid "could not encode stored key" +msgstr "저장 키를 ì¸ì½”드할 수 ì—†ìŒ" -#: ../common/stringinfo.c:306 +#: ../common/scram-common.c:314 +msgid "could not encode server key" +msgstr "서버 키를 ì¸ì½”드할 수 ì—†ìŒ" + +#: ../common/stringinfo.c:315 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." msgstr "%dë°”ì´íŠ¸ê°€ í¬í•¨ëœ 문ìžì—´ 버í¼ë¥¼ %dë°”ì´íЏ ë” í™•ìž¥í•  수 없습니다." -#: ../common/stringinfo.c:310 +#: ../common/stringinfo.c:319 #, c-format msgid "" "out of memory\n" @@ -467,7 +768,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "%ld UID를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" -#: ../common/username.c:45 libpq/auth.c:2027 +#: ../common/username.c:45 libpq/auth.c:1888 msgid "user does not exist" msgstr "ì‚¬ìš©ìž ì—†ìŒ" @@ -476,86 +777,86 @@ msgstr "ì‚¬ìš©ìž ì—†ìŒ" msgid "user name lookup failure: error code %lu" msgstr "ì‚¬ìš©ìž ì´ë¦„ 찾기 실패: 오류 코드 %lu" -#: ../common/wait_error.c:45 +#: ../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ" -#: ../common/wait_error.c:49 +#: ../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "해당 명령어 ì—†ìŒ" -#: ../common/wait_error.c:54 +#: ../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "하위 í”„ë¡œê·¸ëž¨ì€ %d 코드로 마쳤습니다" -#: ../common/wait_error.c:62 +#: ../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "0x%X 예외처리로 하위 프로세스가 종료ë˜ì—ˆìŠµë‹ˆë‹¤" -#: ../common/wait_error.c:66 +#: ../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "하위 í”„ë¡œê·¸ëž¨ì€ %d ì‹ í˜¸ì— ì˜í•´ì„œ 종료ë˜ì—ˆìŠµë‹ˆë‹¤: %s" -#: ../common/wait_error.c:72 +#: ../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "하위 프로그램 í”„ë¡œê·¸ëž¨ì€ ì˜ˆìƒì¹˜ 못한 %d ìƒíƒœê°’으로 종료ë˜ì—ˆìŠµë‹ˆë‹¤" -#: ../port/chklocale.c:307 +#: ../port/chklocale.c:283 #, c-format msgid "could not determine encoding for codeset \"%s\"" msgstr "\"%s\" 코드 세트 í™˜ê²½ì— ì‚¬ìš©í•  ì¸ì½”ë”©ì„ ê²°ì •í•  수 없습니다" -#: ../port/chklocale.c:428 ../port/chklocale.c:434 +#: ../port/chklocale.c:404 ../port/chklocale.c:410 #, c-format msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" msgstr "" "\"%s\" ë¡œì¼€ì¼ í™˜ê²½ì—서 사용할 ì¸ì½”ë”©ì„ ê²°ì •í•  수 없습니다. 코드 세트: \"%s\"" -#: ../port/dirmod.c:218 +#: ../port/dirmod.c:284 #, c-format msgid "could not set junction for \"%s\": %s" msgstr "\"%s\" 디렉터리 ì—°ê²°ì„ í•  수 ì—†ìŒ: %s" -#: ../port/dirmod.c:221 +#: ../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" msgstr "\"%s\" 디렉터리 ì—°ê²°ì„ í•  수 ì—†ìŒ: %s\n" -#: ../port/dirmod.c:295 +#: ../port/dirmod.c:364 #, c-format msgid "could not get junction for \"%s\": %s" msgstr "\"%s\" 파ì¼ì˜ ì •ì…˜ì„ êµ¬í•  수 ì—†ìŒ: %s" -#: ../port/dirmod.c:298 +#: ../port/dirmod.c:367 #, c-format msgid "could not get junction for \"%s\": %s\n" msgstr "\"%s\" 파ì¼ì˜ ì •ì…˜ì„ êµ¬í•  수 ì—†ìŒ: %s\n" -#: ../port/open.c:126 +#: ../port/open.c:115 #, c-format msgid "could not open file \"%s\": %s" msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s" -#: ../port/open.c:127 +#: ../port/open.c:116 msgid "lock violation" msgstr "잠금 위반" -#: ../port/open.c:127 +#: ../port/open.c:116 msgid "sharing violation" msgstr "공유 위반" -#: ../port/open.c:128 +#: ../port/open.c:117 #, c-format msgid "Continuing to retry for 30 seconds." msgstr "30ì´ˆ ë™ì•ˆ 계ì†í•´ì„œ 다시 시ë„합니다." -#: ../port/open.c:129 +#: ../port/open.c:118 #, c-format msgid "" "You might have antivirus, backup, or similar software interfering with the " @@ -564,16 +865,26 @@ msgstr "" "ë°”ì´ëŸ¬ìФ 백신 프로그램, 백업 ë˜ëŠ” 유사한 소프트웨어가 ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì„ " "ë°©í•´í•  수 있습니다." -#: ../port/path.c:654 +#: ../port/path.c:775 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "현재 작업 디렉터리를 알 수 ì—†ìŒ: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "현재 작업 디렉터리를 알 수 ì—†ìŒ: %m\n" #: ../port/strerror.c:72 #, c-format msgid "operating system error %d" msgstr "ìš´ì˜ì²´ì œ 오류 %d" +#: ../port/user.c:43 ../port/user.c:79 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "UID %dì— í•´ë‹¹í•˜ëŠ” 로컬 사용ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" + +#: ../port/user.c:48 ../port/user.c:84 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "%d OIDì— í•´ë‹¹í•˜ëŠ” 로컬 사용ìžê°€ ì—†ìŒ" + #: ../port/win32security.c:62 #, c-format msgid "could not get SID for Administrators group: error code %lu\n" @@ -589,63 +900,79 @@ msgstr "PowerUsers ê·¸ë£¹ì˜ SID를 가져올 수 ì—†ìŒ: 오류 코드 %lu\n" msgid "could not check access token membership: error code %lu\n" msgstr "í† í° ë§´ë²„ì‰½ ì ‘ê·¼ì„ í™•ì¸ í•  수 ì—†ìŒ: 오류 코드 %lu\n" -#: access/brin/brin.c:210 +#: access/brin/brin.c:405 #, c-format msgid "" "request for BRIN range summarization for index \"%s\" page %u was not " "recorded" msgstr "\"%s\" ì¸ë±ìФì—서 BRIN 범위 요약 ìš”ì²­ì´ ê¸°ë¡ë˜ì§€ 못함, 해당 페ì´ì§€: %u" -#: access/brin/brin.c:873 access/brin/brin.c:950 access/gin/ginfast.c:1035 -#: access/transam/xlog.c:10522 access/transam/xlog.c:11060 -#: access/transam/xlogfuncs.c:274 access/transam/xlogfuncs.c:301 -#: access/transam/xlogfuncs.c:340 access/transam/xlogfuncs.c:361 -#: access/transam/xlogfuncs.c:382 access/transam/xlogfuncs.c:452 -#: access/transam/xlogfuncs.c:509 +#: access/brin/brin.c:1385 access/brin/brin.c:1493 access/gin/ginfast.c:1040 +#: access/transam/xlogfuncs.c:183 access/transam/xlogfuncs.c:208 +#: access/transam/xlogfuncs.c:241 access/transam/xlogfuncs.c:280 +#: access/transam/xlogfuncs.c:301 access/transam/xlogfuncs.c:322 +#: access/transam/xlogfuncs.c:388 access/transam/xlogfuncs.c:446 #, c-format msgid "recovery is in progress" msgstr "복구 작업 ì§„í–‰ 중" -#: access/brin/brin.c:874 access/brin/brin.c:951 +#: access/brin/brin.c:1386 access/brin/brin.c:1494 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "BRIN 제어 함수는 복구 작업 중ì—는 실행 ë  ìˆ˜ ì—†ìŒ" -#: access/brin/brin.c:882 access/brin/brin.c:959 +#: access/brin/brin.c:1391 access/brin/brin.c:1499 #, c-format -msgid "block number out of range: %s" -msgstr "ë¸”ë¡ ë²ˆí˜¸ê°€ 범위를 벗어남: %s" +msgid "block number out of range: %lld" +msgstr "ë¸”ë¡ ë²ˆí˜¸ê°€ 범위를 벗어남: %lld" -#: access/brin/brin.c:905 access/brin/brin.c:982 +#: access/brin/brin.c:1436 access/brin/brin.c:1525 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\" 개체는 BRIN ì¸ë±ìŠ¤ê°€ 아닙니다" -#: access/brin/brin.c:921 access/brin/brin.c:998 +#: access/brin/brin.c:1452 access/brin/brin.c:1541 +#, c-format +msgid "could not open parent table of index \"%s\"" +msgstr "\"%s\" ì¸ë±ìŠ¤ì— ëŒ€í•œ 파티션 í…Œì´ë¸”ì„ ì—´ 수 ì—†ìŒ" + +#: access/brin/brin.c:1461 access/brin/brin.c:1557 access/gin/ginfast.c:1085 +#: parser/parse_utilcmd.c:2277 +#, c-format +msgid "index \"%s\" is not valid" +msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” 사용가능 ìƒíƒœê°€ 아님" + +#: access/brin/brin_bloom.c:783 access/brin/brin_bloom.c:825 +#: access/brin/brin_minmax_multi.c:2993 access/brin/brin_minmax_multi.c:3130 +#: statistics/dependencies.c:661 statistics/dependencies.c:714 +#: statistics/mcv.c:1480 statistics/mcv.c:1511 statistics/mvdistinct.c:343 +#: statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:40 +#: utils/adt/pseudotypes.c:74 utils/adt/tsgistidx.c:94 #, c-format -msgid "could not open parent table of index %s" -msgstr "%s ì¸ë±ìŠ¤ì— ëŒ€í•œ ìƒìœ„ í…Œì´ë¸”ì„ ì—´ 수 ì—†ìŒ" +msgid "cannot accept a value of type %s" +msgstr "%s 형ì‹ì˜ ê°’ì€ ì‚¬ìš©í•  수 ì—†ìŒ" -#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 -#: access/brin/brin_pageops.c:843 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1435 access/spgist/spgdoinsert.c:1957 +#: access/brin/brin_pageops.c:75 access/brin/brin_pageops.c:361 +#: access/brin/brin_pageops.c:851 access/gin/ginentrypage.c:109 +#: access/gist/gist.c:1463 access/spgist/spgdoinsert.c:2001 +#: access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "ì¸ë±ìФ í–‰ í¬ê¸° %zuì´(ê°€) 최대값 %zu(\"%s\" ì¸ë±ìФ)ì„(를) 초과함" -#: access/brin/brin_revmap.c:392 access/brin/brin_revmap.c:398 +#: access/brin/brin_revmap.c:383 access/brin/brin_revmap.c:389 #, c-format msgid "corrupted BRIN index: inconsistent range map" msgstr "BRIN ì¸ë±ìФ ì†ìƒ: 범위 ì§€ë„ê°€ ì—°ê²°ë˜ì§€ 않ìŒ" -#: access/brin/brin_revmap.c:601 +#: access/brin/brin_revmap.c:583 #, c-format msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" msgstr "예ìƒì¹˜ 못한 0x%04X 페ì´ì§€ 타입: \"%s\" BRIN ì¸ë±ìФ %u 블ë¡" -#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:151 -#: access/gist/gistvalidate.c:149 access/hash/hashvalidate.c:136 -#: access/nbtree/nbtvalidate.c:117 access/spgist/spgvalidate.c:168 +#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:149 +#: access/gist/gistvalidate.c:152 access/hash/hashvalidate.c:139 +#: access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 #, c-format msgid "" "operator family \"%s\" of access method %s contains function %s with invalid " @@ -654,9 +981,9 @@ msgstr "" "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: %s)ì— í¬í•¨ëœ %s 함수가 ìž˜ëª»ëœ ì§€ì› ë²ˆí˜¸ %d " "로 지정ë˜ì—ˆìŠµë‹ˆë‹¤." -#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:163 -#: access/gist/gistvalidate.c:161 access/hash/hashvalidate.c:115 -#: access/nbtree/nbtvalidate.c:129 access/spgist/spgvalidate.c:180 +#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:161 +#: access/gist/gistvalidate.c:164 access/hash/hashvalidate.c:118 +#: access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 #, c-format msgid "" "operator family \"%s\" of access method %s contains function %s with wrong " @@ -665,9 +992,9 @@ msgstr "" "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: %s)ì— í¬í•¨ëœ %s 함수가 ìž˜ëª»ëœ signature ì§€ì› " "번호 %d 로 지정ë˜ì—ˆìŠµë‹ˆë‹¤." -#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:182 -#: access/gist/gistvalidate.c:181 access/hash/hashvalidate.c:157 -#: access/nbtree/nbtvalidate.c:149 access/spgist/spgvalidate.c:200 +#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:180 +#: access/gist/gistvalidate.c:184 access/hash/hashvalidate.c:160 +#: access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 #, c-format msgid "" "operator family \"%s\" of access method %s contains operator %s with invalid " @@ -676,9 +1003,9 @@ msgstr "" "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: %s)ì— í¬í•¨ëœ %s ì—°ì‚°ìžì˜ %d 번 ì „ëžµ 번호가 잘" "못ë˜ì—ˆìŠµë‹ˆë‹¤." -#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:195 -#: access/hash/hashvalidate.c:170 access/nbtree/nbtvalidate.c:162 -#: access/spgist/spgvalidate.c:216 +#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:193 +#: access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 +#: access/spgist/spgvalidate.c:237 #, c-format msgid "" "operator family \"%s\" of access method %s contains invalid ORDER BY " @@ -687,9 +1014,9 @@ msgstr "" "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: %s)ì— %s ì—°ì‚°ìžê°€ ìž˜ëª»ëœ ORDER BY 명세를 사용" "합니다." -#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:208 -#: access/gist/gistvalidate.c:229 access/hash/hashvalidate.c:183 -#: access/nbtree/nbtvalidate.c:175 access/spgist/spgvalidate.c:232 +#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:206 +#: access/gist/gistvalidate.c:232 access/hash/hashvalidate.c:186 +#: access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 #, c-format msgid "" "operator family \"%s\" of access method %s contains operator %s with wrong " @@ -697,8 +1024,8 @@ msgid "" msgstr "" "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: %s)ì— %s ì—°ì‚°ìžê°€ ìž˜ëª»ëœ ê¸°í˜¸ë¥¼ 사용합니다." -#: access/brin/brin_validate.c:236 access/hash/hashvalidate.c:223 -#: access/nbtree/nbtvalidate.c:233 access/spgist/spgvalidate.c:259 +#: access/brin/brin_validate.c:236 access/hash/hashvalidate.c:226 +#: access/nbtree/nbtvalidate.c:236 access/spgist/spgvalidate.c:280 #, c-format msgid "" "operator family \"%s\" of access method %s is missing operator(s) for types " @@ -715,38 +1042,38 @@ msgstr "" "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: %s)ì—는 %s, %s ìžë£Œí˜•용으로 쓸 함수가 없습니" "다" -#: access/brin/brin_validate.c:259 access/hash/hashvalidate.c:237 -#: access/nbtree/nbtvalidate.c:257 access/spgist/spgvalidate.c:294 +#: access/brin/brin_validate.c:259 access/hash/hashvalidate.c:240 +#: access/nbtree/nbtvalidate.c:260 access/spgist/spgvalidate.c:315 #, c-format msgid "operator class \"%s\" of access method %s is missing operator(s)" msgstr "\"%s\" ì—°ì‚°ìž í´ëž˜ìФ(ì ‘ê·¼ 방법: %s)ì— ì—°ì‚°ìžê°€ 빠졌습니다" -#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 -#: access/gist/gistvalidate.c:270 +#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:248 +#: access/gist/gistvalidate.c:273 #, c-format msgid "" "operator class \"%s\" of access method %s is missing support function %d" msgstr "\"%s\" ì—°ì‚°ìž í´ëž˜ìФ(ì ‘ê·¼ 방법: %s)ì— %d ì§€ì› í•¨ìˆ˜ê°€ 빠졌습니다." -#: access/common/attmap.c:122 +#: access/common/attmap.c:121 #, c-format msgid "Returned type %s does not match expected type %s in column %d." msgstr "" "반환 ìžë£Œí˜•으로 %s í˜•ì„ ì§€ì •í–ˆì§€ë§Œ, ì¹¼ëŸ¼ì€ %s ìžë£Œí˜•입니다. 해당 칼럼: %d 번" "째 칼럼" -#: access/common/attmap.c:150 +#: access/common/attmap.c:149 #, c-format msgid "" "Number of returned columns (%d) does not match expected column count (%d)." msgstr "반환할 칼럼 수(%d)와 예ìƒë˜ëŠ” 칼럼수(%d)ê°€ 다릅니다." -#: access/common/attmap.c:229 access/common/attmap.c:241 +#: access/common/attmap.c:233 access/common/attmap.c:245 #, c-format msgid "could not convert row type" msgstr "로우 ìžë£Œí˜•ì„ ë³€í™˜ í•  수 ì—†ìŒ" -#: access/common/attmap.c:230 +#: access/common/attmap.c:234 #, c-format msgid "" "Attribute \"%s\" of type %s does not match corresponding attribute of type " @@ -754,110 +1081,125 @@ msgid "" msgstr "" " \"%s\" ì†ì„±(ëŒ€ìƒ ìžë£Œí˜• %s)ì´ %s ìžë£Œí˜•ì˜ ì†ì„± ê°€ìš´ë° ê´€ë ¨ëœ ê²ƒì´ ì—†ìŠµë‹ˆë‹¤" -#: access/common/attmap.c:242 +#: access/common/attmap.c:246 #, c-format msgid "Attribute \"%s\" of type %s does not exist in type %s." msgstr "\"%s\" ì†ì„±(ëŒ€ìƒ ìžë£Œí˜• %s)ì´ %s ìžë£Œí˜•ì—는 없습니다." -#: access/common/heaptuple.c:1036 access/common/heaptuple.c:1371 +#: access/common/heaptuple.c:1132 access/common/heaptuple.c:1467 #, c-format msgid "number of columns (%d) exceeds limit (%d)" msgstr "칼럼 개수(%d)ê°€ 최대값(%d)ì„ ì´ˆê³¼í–ˆìŠµë‹ˆë‹¤" -#: access/common/indextuple.c:70 +#: access/common/indextuple.c:89 #, c-format msgid "number of index columns (%d) exceeds limit (%d)" msgstr "ì¸ë±ìФ 칼럼 개수(%d)ê°€ 최대값(%d)ì„ ì´ˆê³¼í–ˆìŠµë‹ˆë‹¤" -#: access/common/indextuple.c:187 access/spgist/spgutils.c:703 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:970 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "ì¸ë±ìФ í–‰(row)ì€ %zu ë°”ì´íŠ¸ë¥¼ 필요로 함, 최대 í¬ê¸°ëŠ” %zu" -#: access/common/printtup.c:369 tcop/fastpath.c:180 tcop/fastpath.c:530 -#: tcop/postgres.c:1904 +#: access/common/printtup.c:292 commands/explain.c:5376 tcop/fastpath.c:107 +#: tcop/fastpath.c:454 tcop/postgres.c:1956 #, c-format msgid "unsupported format code: %d" msgstr "ì§€ì›í•˜ì§€ 않는 í¬ë§· 코드: %d" -#: access/common/reloptions.c:506 +#: access/common/reloptions.c:519 access/common/reloptions.c:530 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "유효한 ê°’: \"on\", \"off\", \"auto\"" -#: access/common/reloptions.c:517 +#: access/common/reloptions.c:541 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "사용할 수 있는 ê°’ì€ \"local\" ë˜ëŠ” \"cascaded\" 입니다" -#: access/common/reloptions.c:665 +#: access/common/reloptions.c:689 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "ì‚¬ìš©ìž ì •ì˜ ê´€ê³„ 매개 변수 í˜•ì‹ ì œí•œì„ ì´ˆê³¼í•¨" -#: access/common/reloptions.c:1208 +#: access/common/reloptions.c:1231 #, c-format msgid "RESET must not include values for parameters" msgstr "매개 ë³€ìˆ˜ì˜ ê°’ìœ¼ë¡œ RESETì€ ì˜¬ 수 ì—†ìŒ" -#: access/common/reloptions.c:1240 +#: access/common/reloptions.c:1263 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "\"%s\" 매개 변수 네임스페ì´ìŠ¤ë¥¼ ì¸ì‹í•  수 ì—†ìŒ" -#: access/common/reloptions.c:1277 utils/misc/guc.c:12004 +#: access/common/reloptions.c:1300 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "WITH OIDS í…Œì´ë¸”ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: access/common/reloptions.c:1447 +#: access/common/reloptions.c:1468 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "알 수 없는 환경 설정 ì´ë¦„입니다 \"%s\"" -#: access/common/reloptions.c:1559 +#: access/common/reloptions.c:1580 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "\"%s\" 매개 변수가 여러 번 지정ë¨" -#: access/common/reloptions.c:1575 +#: access/common/reloptions.c:1596 #, c-format msgid "invalid value for boolean option \"%s\": %s" -msgstr "\"%s\" 부울 옵션 ê°’ì´ ìž˜ëª»ë¨: %s" +msgstr "\"%s\" 불리언 옵션 ê°’ì´ ìž˜ëª»ë¨: %s" -#: access/common/reloptions.c:1587 +#: access/common/reloptions.c:1608 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "\"%s\" 정수 옵션 ê°’ì´ ìž˜ëª»ë¨: %s" -#: access/common/reloptions.c:1593 access/common/reloptions.c:1613 +#: access/common/reloptions.c:1614 access/common/reloptions.c:1634 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "ê°’ %sì€(는) \"%s\" 옵션 범위를 벗어남" -#: access/common/reloptions.c:1595 +#: access/common/reloptions.c:1616 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "유효한 ê°’ì€ \"%d\"ì—서 \"%d\" 사ì´ìž…니다." -#: access/common/reloptions.c:1607 +#: access/common/reloptions.c:1628 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "\"%s\" ë¶€ë™ ì†Œìˆ˜ì  ì˜µì…˜ ê°’ì´ ìž˜ëª»ë¨: %s" -#: access/common/reloptions.c:1615 +#: access/common/reloptions.c:1636 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "유효한 ê°’ì€ \"%f\"ì—서 \"%f\" 사ì´ìž…니다." -#: access/common/reloptions.c:1637 +#: access/common/reloptions.c:1658 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "\"%s\" enum 옵션 ê°’ì´ ìž˜ëª»ë¨: %s" -#: access/common/tupdesc.c:842 parser/parse_clause.c:772 -#: parser/parse_relation.c:1803 +#: access/common/reloptions.c:1989 #, c-format -msgid "column \"%s\" cannot be declared SETOF" -msgstr "\"%s\" ì¹¼ëŸ¼ì€ SETOF를 지정할 수 없습니다" +msgid "cannot specify storage parameters for a partitioned table" +msgstr "파티션 ìƒìœ„ í…Œì´ë¸” 대ìƒìœ¼ë¡œëŠ” 스토리지 매개 변수를 지정할 수 ì—†ìŒ" + +#: access/common/reloptions.c:1990 +#, c-format +msgid "Specify storage parameters for its leaf partitions instead." +msgstr "" +"ëŒ€ì‹ ì— ê° í•˜ìœ„ 파티션 í…Œì´ë¸” 대ìƒìœ¼ë¡œ ê°ê° 스토리지 매개 변수를 지정하세요." + +#: access/common/toast_compression.c:31 +#, c-format +msgid "compression method lz4 not supported" +msgstr "lz4 ì••ì¶• ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않습니다" + +#: access/common/toast_compression.c:32 +#, c-format +msgid "This functionality requires the server to be built with lz4 support." +msgstr "ì´ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë ¤ë©´ lz4 ì§€ì›ìœ¼ë¡œ 서버를 빌드해야 합니다." #: access/gin/ginbulk.c:44 #, c-format @@ -866,25 +1208,25 @@ msgstr "í¬ìŠ¤íŒ… 목ë¡ì´ 너무 ê¹ë‹ˆë‹¤" #: access/gin/ginbulk.c:45 #, c-format -msgid "Reduce maintenance_work_mem." -msgstr "maintenance_work_mem ì„¤ì •ê°’ì„ ì¤„ì´ì„¸ìš”." +msgid "Reduce \"maintenance_work_mem\"." +msgstr "\"maintenance_work_mem\" ì„¤ì •ê°’ì„ ì¤„ì´ì„¸ìš”." -#: access/gin/ginfast.c:1036 +#: access/gin/ginfast.c:1041 #, c-format msgid "GIN pending list cannot be cleaned up during recovery." msgstr "GIN 팬딩 목ë¡ì€ 복구 작업 중ì—는 ì •ë¦¬ë  ìˆ˜ 없습니다." -#: access/gin/ginfast.c:1043 +#: access/gin/ginfast.c:1048 #, c-format msgid "\"%s\" is not a GIN index" msgstr "\"%s\" 개체는 GIN ì¸ë±ìŠ¤ê°€ 아닙니다" -#: access/gin/ginfast.c:1054 +#: access/gin/ginfast.c:1059 #, c-format msgid "cannot access temporary indexes of other sessions" msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ ì¸ë±ìŠ¤ëŠ” 접근할 수 ì—†ìŒ" -#: access/gin/ginget.c:270 access/nbtree/nbtinsert.c:745 +#: access/gin/ginget.c:271 access/nbtree/nbtinsert.c:762 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "\"%s\" ì¸ë±ìФì—서 튜플 재검색 실패" @@ -901,15 +1243,15 @@ msgstr "" msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "ì´ ë¬¸ì œë¥¼ 고치려면, ë‹¤ìŒ ëª…ë ¹ì„ ìˆ˜í–‰í•˜ì„¸ìš”: REINDEX INDEX \"%s\"" -#: access/gin/ginutil.c:144 executor/execExpr.c:1862 -#: utils/adt/arrayfuncs.c:3790 utils/adt/arrayfuncs.c:6418 -#: utils/adt/rowtypes.c:936 +#: access/gin/ginutil.c:147 executor/execExpr.c:2200 +#: utils/adt/arrayfuncs.c:4016 utils/adt/arrayfuncs.c:6712 +#: utils/adt/rowtypes.c:974 #, c-format msgid "could not identify a comparison function for type %s" msgstr "%s ìžë£Œí˜•ì—서 사용할 비êµí•¨ìˆ˜ë¥¼ ì°¾ì„ ìˆ˜ 없습니다." -#: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 -#: access/hash/hashvalidate.c:99 access/spgist/spgvalidate.c:99 +#: access/gin/ginvalidate.c:90 access/gist/gistvalidate.c:92 +#: access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 #, c-format msgid "" "operator family \"%s\" of access method %s contains support function %s with " @@ -918,7 +1260,7 @@ msgstr "" "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: %s)ì— ì„œë¡œ 다른 양쪽 ìž…ë ¥ ìžë£Œí˜• ì¸ìžë¥¼ 사용" "í•  수 있는 %s ì§€ì› í•¨ìˆ˜ê°€ í¬í•¨ë˜ì–´ 있ìŒ" -#: access/gin/ginvalidate.c:260 +#: access/gin/ginvalidate.c:258 #, c-format msgid "" "operator class \"%s\" of access method %s is missing support function %d or " @@ -926,12 +1268,18 @@ msgid "" msgstr "" "\"%s\" ì—°ì‚°ìž í´ëž˜ìФ(ì ‘ê·¼ 방법: %s)ì—는 %d ë˜ëŠ” %d ì§€ì› í•¨ìˆ˜ê°€ 빠졌습니다" -#: access/gist/gist.c:753 access/gist/gistvacuum.c:408 +#: access/gin/ginvalidate.c:331 access/gist/gistvalidate.c:349 +#: access/spgist/spgvalidate.c:387 +#, c-format +msgid "support function number %d is invalid for access method %s" +msgstr "ì§€ì› í•¨ìˆ˜ 번호 %d 잘못ë¨, ëŒ€ìƒ ì ‘ê·¼ 방법: %s" + +#: access/gist/gist.c:760 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "\"%s\" ì¸ë±ìŠ¤ì— ìž˜ëª»ëœ ë‚´ë¶€ íŠœí”Œì´ ìžˆë‹¤ê³  확ì¸ë˜ì—ˆìŠµë‹ˆë‹¤." -#: access/gist/gist.c:755 access/gist/gistvacuum.c:410 +#: access/gist/gist.c:762 access/gist/gistvacuum.c:428 #, c-format msgid "" "This is caused by an incomplete page split at crash recovery before " @@ -940,15 +1288,20 @@ msgstr "" "ì´ ë¬¸ì œëŠ” PostgreSQL 9.1 버전으로 업그레ì´ë“œ 하기 ì „ì— ìž¥ì•  복구 처리ì—서 잘" "ëª»ëœ íŽ˜ì´ì§€ 분리 ë•Œë¬¸ì— ë°œìƒí–ˆìŠµë‹ˆë‹¤." -#: access/gist/gist.c:756 access/gist/gistutil.c:786 access/gist/gistutil.c:797 -#: access/gist/gistvacuum.c:411 access/hash/hashutil.c:227 -#: access/hash/hashutil.c:238 access/hash/hashutil.c:250 -#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:741 -#: access/nbtree/nbtpage.c:752 +#: access/gist/gist.c:763 access/gist/gistutil.c:800 access/gist/gistutil.c:811 +#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:226 +#: access/hash/hashutil.c:237 access/hash/hashutil.c:249 +#: access/hash/hashutil.c:270 access/nbtree/nbtpage.c:813 +#: access/nbtree/nbtpage.c:824 #, c-format msgid "Please REINDEX it." msgstr "REINDEX 명령으로 다시 ì¸ë±ìŠ¤ë¥¼ 만드세요" +#: access/gist/gist.c:1196 +#, c-format +msgid "fixing incomplete split in index \"%s\", block %u" +msgstr "\"%s\" ì¸ë±ìŠ¤ì˜ ë¶ˆì™„ì „í•œ 분기 수정중, 블ë¡ë²ˆí˜¸: %u" + #: access/gist/gistsplit.c:446 #, c-format msgid "picksplit method for column %d of index \"%s\" failed" @@ -963,19 +1316,19 @@ msgstr "" "ì¸ë±ìŠ¤ê°€ 최ì í™”ë˜ì§€ 않았습니다. 최ì í™”하려면 개발ìžì—게 문ì˜í•˜ê±°ë‚˜, CREATE " "INDEX 명령ì—서 해당 ì¹¼ëŸ¼ì„ ë‘ ë²ˆì§¸ ì¸ë±ìŠ¤ë¡œ 사용하십시오." -#: access/gist/gistutil.c:783 access/hash/hashutil.c:224 -#: access/nbtree/nbtpage.c:738 +#: access/gist/gistutil.c:797 access/hash/hashutil.c:223 +#: access/nbtree/nbtpage.c:810 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "\"%s\" ì¸ë±ìŠ¤ì˜ %u번째 블럭ì—서 예ìƒì¹˜ ì•Šì€ zero pageê°€ 있습니다" -#: access/gist/gistutil.c:794 access/hash/hashutil.c:235 -#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:749 +#: access/gist/gistutil.c:808 access/hash/hashutil.c:234 +#: access/hash/hashutil.c:246 access/nbtree/nbtpage.c:821 #, c-format msgid "index \"%s\" contains corrupted page at block %u" msgstr "\"%s\" ì¸ë±ìŠ¤íŠ¸ %u번째 ë¸”ëŸ­ì´ ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤" -#: access/gist/gistvalidate.c:199 +#: access/gist/gistvalidate.c:202 #, c-format msgid "" "operator family \"%s\" of access method %s contains unsupported ORDER BY " @@ -984,7 +1337,7 @@ msgstr "" "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: %s)ì— %s ì—°ì‚°ìžê°€ ì§€ì›í•˜ì§€ 않는 ORDER BY 명세" "를 사용합니다." -#: access/gist/gistvalidate.c:210 +#: access/gist/gistvalidate.c:213 #, c-format msgid "" "operator family \"%s\" of access method %s contains incorrect ORDER BY " @@ -993,168 +1346,180 @@ msgstr "" "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: %s)ì— %s ì—°ì‚°ìžê°€ ìž˜ëª»ëœ ORDER BY 명세를 사용" "합니다." -#: access/hash/hashfunc.c:255 access/hash/hashfunc.c:311 -#: utils/adt/varchar.c:993 utils/adt/varchar.c:1053 +#: access/hash/hashfunc.c:277 access/hash/hashfunc.c:333 +#: utils/adt/varchar.c:1008 utils/adt/varchar.c:1065 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "문ìžì—´ 해시 ìž‘ì—…ì— ì‚¬ìš©í•  정렬규칙(collation)ì„ ê²°ì •í•  수 ì—†ìŒ" -#: access/hash/hashfunc.c:256 access/hash/hashfunc.c:312 catalog/heap.c:702 -#: catalog/heap.c:708 commands/createas.c:206 commands/createas.c:489 -#: commands/indexcmds.c:1814 commands/tablecmds.c:16035 commands/view.c:86 -#: parser/parse_utilcmd.c:4203 regex/regc_pg_locale.c:263 -#: utils/adt/formatting.c:1667 utils/adt/formatting.c:1791 -#: utils/adt/formatting.c:1916 utils/adt/like.c:194 -#: utils/adt/like_support.c:1003 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:994 utils/adt/varchar.c:1054 utils/adt/varlena.c:1476 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 catalog/heap.c:672 +#: catalog/heap.c:678 commands/createas.c:201 commands/createas.c:508 +#: commands/indexcmds.c:2021 commands/tablecmds.c:18178 commands/view.c:81 +#: regex/regc_pg_locale.c:245 utils/adt/formatting.c:1653 +#: utils/adt/formatting.c:1801 utils/adt/formatting.c:1991 utils/adt/like.c:189 +#: utils/adt/like_support.c:1024 utils/adt/varchar.c:738 +#: utils/adt/varchar.c:1009 utils/adt/varchar.c:1066 utils/adt/varlena.c:1521 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "명시ì ìœ¼ë¡œ ì •ë ¬ ê·œì¹™ì„ ì§€ì •í•˜ë ¤ë©´ COLLATE ì ˆì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: access/hash/hashinsert.c:82 +#: access/hash/hashinsert.c:84 #, c-format msgid "index row size %zu exceeds hash maximum %zu" msgstr "ì¸ë±ìФ í–‰ í¬ê¸°ê°€ 초과ë¨: 현재값 %zu, 최대값 %zu" -#: access/hash/hashinsert.c:84 access/spgist/spgdoinsert.c:1961 -#: access/spgist/spgutils.c:764 +#: access/hash/hashinsert.c:86 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1031 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "ë²„í¼ íŽ˜ì´ì§€ë³´ë‹¤ í° ê°’ì€ ì¸ë±ì‹±í•  수 없습니다." -#: access/hash/hashovfl.c:87 +#: access/hash/hashovfl.c:88 #, c-format msgid "invalid overflow block number %u" msgstr "ìž˜ëª»ëœ ì˜¤ë²„í”Œë¡œìš° ë¸”ë¡ ë²ˆí˜¸: %u" -#: access/hash/hashovfl.c:283 access/hash/hashpage.c:453 +#: access/hash/hashovfl.c:284 access/hash/hashpage.c:454 #, c-format msgid "out of overflow pages in hash index \"%s\"" msgstr "\"%s\" 해시 ì¸ë±ìФì—서 오버플로우 페ì´ì§€ 초과" -#: access/hash/hashsearch.c:315 +#: access/hash/hashsearch.c:311 #, c-format msgid "hash indexes do not support whole-index scans" msgstr "해시 ì¸ë±ìŠ¤ëŠ” whole-index scanì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: access/hash/hashutil.c:263 +#: access/hash/hashutil.c:262 #, c-format msgid "index \"%s\" is not a hash index" msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” 해시 ì¸ë±ìŠ¤ê°€ 아님" -#: access/hash/hashutil.c:269 +#: access/hash/hashutil.c:268 #, c-format msgid "index \"%s\" has wrong hash version" msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” ìž˜ëª»ëœ í•´ì‹œ 버전임" -#: access/hash/hashvalidate.c:195 +#: access/hash/hashvalidate.c:198 #, c-format msgid "" "operator family \"%s\" of access method %s lacks support function for " "operator %s" msgstr "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: %s)ì— %s ì—°ì‚°ìžìš© ì§€ì› í•¨ìˆ˜ê°€ ì—†ìŒ" -#: access/hash/hashvalidate.c:253 access/nbtree/nbtvalidate.c:273 +#: access/hash/hashvalidate.c:256 access/nbtree/nbtvalidate.c:276 #, c-format msgid "" "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "%s ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: %s)ì— cross-type ì—°ì‚°ìžê°€ 빠졌ìŒ" -#: access/heap/heapam.c:2024 +#: access/heap/heapam.c:2204 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "병렬 작업ìžëŠ” íŠœí”Œì„ ì¶”ê°€ í•  수 ì—†ìŒ" -#: access/heap/heapam.c:2442 +#: access/heap/heapam.c:2723 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "병렬 작업 중ì—는 íŠœí”Œì„ ì§€ìš¸ 수 ì—†ìŒ" -#: access/heap/heapam.c:2488 +#: access/heap/heapam.c:2770 #, c-format msgid "attempted to delete invisible tuple" msgstr "ë³¼ 수 없는 íŠœí”Œì„ ì‚­ì œ 하려고 함" -#: access/heap/heapam.c:2914 access/heap/heapam.c:5703 +#: access/heap/heapam.c:3218 access/heap/heapam.c:6454 access/index/genam.c:818 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "병렬 작업 ì¤‘ì— íŠœí”Œ ê°±ì‹ ì€ í•  수 ì—†ìŒ" -#: access/heap/heapam.c:3047 +#: access/heap/heapam.c:3350 #, c-format msgid "attempted to update invisible tuple" msgstr "ë³¼ 수 없는 íŠœí”Œì„ ë³€ê²½í•˜ë ¤ê³  함" -#: access/heap/heapam.c:4358 access/heap/heapam.c:4396 -#: access/heap/heapam.c:4653 access/heap/heapam_handler.c:450 +#: access/heap/heapam.c:4861 access/heap/heapam.c:4899 +#: access/heap/heapam.c:5164 access/heap/heapam_handler.c:468 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "\"%s\" 릴레ì´ì…˜ì˜ 잠금 정보를 구할 수 ì—†ìŒ" -#: access/heap/heapam_handler.c:399 +#: access/heap/heapam.c:6267 commands/trigger.c:3340 +#: executor/nodeModifyTable.c:2376 executor/nodeModifyTable.c:2467 +#, c-format +msgid "" +"tuple to be updated was already modified by an operation triggered by the " +"current command" +msgstr "" +"현재 명령으로 ì‹¤í–‰ëœ íŠ¸ë¦¬ê±° 작업으로 변경해야할 ìžë£Œê°€ ì´ë¯¸ 바뀌었습니다." + +#: access/heap/heapam_handler.c:413 #, c-format msgid "" "tuple to be locked was already moved to another partition due to concurrent " "update" msgstr "잠글 íŠœí”Œì€ ë™ì‹œ ì—…ë°ì´íŠ¸ë¡œ 다른 파티션으로 ì´ë¯¸ 옮겨졌ìŒ" -#: access/heap/hio.c:345 access/heap/rewriteheap.c:662 +#: access/heap/hio.c:535 access/heap/rewriteheap.c:640 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "로우가 너무 í½ë‹ˆë‹¤: í¬ê¸° %zu, 최대값 %zu" -#: access/heap/rewriteheap.c:921 +#: access/heap/rewriteheap.c:885 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패, %d / %d 기ë¡í•¨: %m." -#: access/heap/rewriteheap.c:1015 access/heap/rewriteheap.c:1134 -#: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:3300 access/transam/xlog.c:3472 -#: access/transam/xlog.c:4670 access/transam/xlog.c:10869 -#: access/transam/xlog.c:10907 access/transam/xlog.c:11312 -#: access/transam/xlogfuncs.c:735 postmaster/postmaster.c:4629 -#: replication/logical/origin.c:575 replication/slot.c:1446 -#: storage/file/copydir.c:167 storage/smgr/md.c:218 utils/time/snapmgr.c:1329 +#: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 +#: access/transam/timeline.c:329 access/transam/timeline.c:481 +#: access/transam/xlog.c:3255 access/transam/xlog.c:3446 +#: access/transam/xlog.c:4283 access/transam/xlog.c:9269 +#: access/transam/xlogfuncs.c:692 backup/basebackup_server.c:149 +#: backup/basebackup_server.c:242 commands/dbcommands.c:494 +#: postmaster/launch_backend.c:340 postmaster/postmaster.c:4111 +#: postmaster/walsummarizer.c:1212 replication/logical/origin.c:603 +#: replication/slot.c:2059 storage/file/copydir.c:157 storage/smgr/md.c:230 +#: utils/time/snapmgr.c:1234 #, c-format msgid "could not create file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %m" -#: access/heap/rewriteheap.c:1144 +#: access/heap/rewriteheap.c:1104 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "\"%s\" 파ì¼ì„ %u í¬ê¸°ë¡œ 정리할 수 ì—†ìŒ: %m" -#: access/heap/rewriteheap.c:1162 access/transam/timeline.c:384 -#: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3356 access/transam/xlog.c:3528 -#: access/transam/xlog.c:4682 postmaster/postmaster.c:4639 -#: postmaster/postmaster.c:4649 replication/logical/origin.c:587 -#: replication/logical/origin.c:629 replication/logical/origin.c:648 -#: replication/logical/snapbuild.c:1622 replication/slot.c:1481 -#: storage/file/buffile.c:502 storage/file/copydir.c:207 -#: utils/init/miscinit.c:1391 utils/init/miscinit.c:1402 -#: utils/init/miscinit.c:1410 utils/misc/guc.c:7996 utils/misc/guc.c:8027 -#: utils/misc/guc.c:9947 utils/misc/guc.c:9961 utils/time/snapmgr.c:1334 -#: utils/time/snapmgr.c:1341 +#: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 +#: access/transam/timeline.c:424 access/transam/timeline.c:498 +#: access/transam/xlog.c:3305 access/transam/xlog.c:3502 +#: access/transam/xlog.c:4295 commands/dbcommands.c:506 +#: postmaster/launch_backend.c:351 postmaster/launch_backend.c:363 +#: replication/logical/origin.c:615 replication/logical/origin.c:657 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1788 +#: replication/slot.c:2094 storage/file/buffile.c:545 +#: storage/file/copydir.c:197 utils/init/miscinit.c:1655 +#: utils/init/miscinit.c:1666 utils/init/miscinit.c:1674 utils/misc/guc.c:4491 +#: utils/misc/guc.c:4522 utils/misc/guc.c:5675 utils/misc/guc.c:5693 +#: utils/time/snapmgr.c:1239 utils/time/snapmgr.c:1246 #, c-format msgid "could not write to file \"%s\": %m" msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m" -#: access/heap/rewriteheap.c:1252 access/transam/twophase.c:1609 -#: access/transam/xlogarchive.c:118 access/transam/xlogarchive.c:421 -#: postmaster/postmaster.c:1092 postmaster/syslogger.c:1465 -#: replication/logical/origin.c:563 replication/logical/reorderbuffer.c:3079 -#: replication/logical/snapbuild.c:1564 replication/logical/snapbuild.c:2006 -#: replication/slot.c:1578 storage/file/fd.c:754 storage/file/fd.c:3116 -#: storage/file/fd.c:3178 storage/file/reinit.c:255 storage/ipc/dsm.c:302 -#: storage/smgr/md.c:311 storage/smgr/md.c:367 storage/sync/sync.c:210 -#: utils/time/snapmgr.c:1674 +#: access/heap/vacuumlazy.c:473 #, c-format -msgid "could not remove file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ 삭제할 수 ì—†ìŒ: %m" +msgid "aggressively vacuuming \"%s.%s.%s\"" +msgstr "ì ê·¹ì ìœ¼ë¡œ \"%s.%s.%s\" 청소 중" + +#: access/heap/vacuumlazy.c:478 +#, c-format +msgid "vacuuming \"%s.%s.%s\"" +msgstr "\"%s.%s.%s\" 청소 중" + +#: access/heap/vacuumlazy.c:626 +#, c-format +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "\"%s.%s.%s\" í…Œì´ë¸” 청소 ë남: ì¸ë±ìФ íƒìƒ‰: %d\n" -#: access/heap/vacuumlazy.c:648 +#: access/heap/vacuumlazy.c:637 #, c-format msgid "" "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": " @@ -1163,234 +1528,234 @@ msgstr "" "트랙ì ì…˜ ID 겹침 방지를 위한 ì ê·¹ì ì¸ \"%s.%s.%s\" í…Œì´ë¸” ìžë™ 청소: ì¸ë±ìФ " "íƒìƒ‰: %d\n" -#: access/heap/vacuumlazy.c:650 +#: access/heap/vacuumlazy.c:639 #, c-format msgid "" "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: " "%d\n" msgstr "" -"트랙ì ì…˜ ID 겹침 방지를 위한 \"%s.%s.%s\" í…Œì´ë¸” ìžë™ 청소: ì¸ë±ìФ " -"íƒìƒ‰: %d\n" +"트랙ì ì…˜ ID 겹침 방지를 위한 \"%s.%s.%s\" í…Œì´ë¸” ìžë™ 청소: ì¸ë±ìФ íƒìƒ‰: %d\n" -#: access/heap/vacuumlazy.c:655 +#: access/heap/vacuumlazy.c:644 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "ì ê·¹ì ì¸ \"%s.%s.%s\" í…Œì´ë¸” ìžë™ 청소: ì¸ë±ìФ íƒìƒ‰: %d\n" -#: access/heap/vacuumlazy.c:657 +#: access/heap/vacuumlazy.c:646 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "\"%s.%s.%s\" í…Œì´ë¸” ìžë™ 청소: ì¸ë±ìФ íƒìƒ‰: %d\n" -#: access/heap/vacuumlazy.c:664 +#: access/heap/vacuumlazy.c:653 #, c-format -msgid "" -"pages: %u removed, %u remain, %u skipped due to pins, %u skipped frozen\n" -msgstr "페ì´ì§€: %u ì‚­ì œë¨, %u 남ìŒ, %u í•€ë‹ìœ¼ë¡œ 건너뜀, %u ë™ê²°ë˜ì–´ 건너뜀\n" +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" +msgstr "페ì´ì§€: %u ì‚­ì œë¨, %u 남ìŒ, %u ê²€ì‚¬ë¨ (ì „ì²´ì˜ %.2f%%)\n" -#: access/heap/vacuumlazy.c:670 +#: access/heap/vacuumlazy.c:660 #, c-format msgid "" -"tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable, " -"oldest xmin: %u\n" +"tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" msgstr "" -"튜플: %.0f ì‚­ì œë¨, %.0f 남ìŒ, %.0f 삭제할 수 없는 ì£½ì€ íŠœí”Œ, ì œì¼ ëŠ™ì€ xmin: " -"%u\n" +"튜플: %.lld ì‚­ì œë¨, %lld 남ìŒ, ì•„ì§ %lld ê°œì˜ íŠœí”Œì„ ì§€ì›Œì•¼í•˜ì§€ë§Œ 못지웠ìŒ\n" -#: access/heap/vacuumlazy.c:676 +#: access/heap/vacuumlazy.c:666 #, c-format -msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" -msgstr "ë²„í¼ ì‚¬ìš©ëŸ‰: %lld 조회, %lld 놓침, %lld 변경ë¨\n" +msgid "" +"tuples missed: %lld dead from %u pages not removed due to cleanup lock " +"contention\n" +msgstr "" +"놓친 튜플: %lld ê°œì˜ ì£½ì€ íŠœí”Œì´ %u ê°œì˜ íŽ˜ì´ì§€ ì•ˆì— ìžˆìŒ: cleanup 잠금 ì—°ê²° " +"때문\n" -#: access/heap/vacuumlazy.c:680 +#: access/heap/vacuumlazy.c:672 #, c-format -msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" -msgstr "í‰ê·  ì½ê¸° ì†ë„: %.3f MB/s, í‰ê·  쓰기 ì†ë„: %.3f MB/s\n" +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "ì‚­ì œ 가능한 컷오프: %u, which was %d XIDs old when operation ended\n" -#: access/heap/vacuumlazy.c:682 +#: access/heap/vacuumlazy.c:679 #, c-format -msgid "system usage: %s\n" -msgstr "시스템 사용량: %s\n" +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "새 relfrozenxid: %u, which is %d XIDs ahead of previous value\n" -#: access/heap/vacuumlazy.c:684 +#: access/heap/vacuumlazy.c:687 #, c-format -msgid "WAL usage: %ld records, %ld full page images, %llu bytes" -msgstr "WAL 사용량: %ld 레코드, %ld 페ì´ì§€ ì „ì²´ ì´ë¯¸ì§€, %llu ë°”ì´íЏ" +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "새 relminmxid: %u, which is %d MXIDs ahead of previous value\n" -#: access/heap/vacuumlazy.c:795 +#: access/heap/vacuumlazy.c:690 #, c-format -msgid "aggressively vacuuming \"%s.%s\"" -msgstr "ì ê·¹ì ìœ¼ë¡œ \"%s.%s\" 청소 중" +msgid "frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n" +msgstr "" +"ì˜êµ¬ë³´ê´€: í…Œì´ë¸”ì˜ %uê°œ 페ì´ì§€(ì „ì²´ì˜ %.2f%%)ì—서 %lld ê°œì˜ íŠœí”Œì„ ì˜êµ¬ ë³´ê´€" +"함\n" -#: access/heap/vacuumlazy.c:800 commands/cluster.c:874 -#, c-format -msgid "vacuuming \"%s.%s\"" -msgstr "\"%s.%s\" 청소 중" +#: access/heap/vacuumlazy.c:698 +msgid "index scan not needed: " +msgstr "ì¸ë±ìФ 검사 í•„ìš” ì—†ìŒ: " -#: access/heap/vacuumlazy.c:837 +#: access/heap/vacuumlazy.c:700 +msgid "index scan needed: " +msgstr "ì¸ë±ìФ 검사 필요함: " + +#: access/heap/vacuumlazy.c:702 #, c-format msgid "" -"disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary " -"tables in parallel" +"%u pages from table (%.2f%% of total) had %lld dead item identifiers " +"removed\n" msgstr "" -"\"%s\" 청소 작업ì—ì„œì˜ ë³‘ë ¬ ì˜µì…˜ì€ ë¬´ì‹œí•¨ --- 임시 í…Œì´ë¸”ì€ ë³‘ë ¬ 처리로 " -"청소 í•  수 ì—†ìŒ" - -#: access/heap/vacuumlazy.c:1725 -#, c-format -msgid "\"%s\": removed %.0f row versions in %u pages" -msgstr "\"%s\": %.0fê°œì˜ í–‰ ë²„ì „ì„ %uê°œ 페ì´ì§€ì—서 삭제했습니다." +"í…Œì´ë¸”ì˜ %uê°œ 페ì´ì§€(ì „ì²´ì˜ %.2f%%)ì—서 %lld ê°œì˜ ì£½ì€ í•­ëª© ì‹ë³„ìžë¥¼ 지웠ìŒ\n" -#: access/heap/vacuumlazy.c:1735 -#, c-format -msgid "%.0f dead row versions cannot be removed yet, oldest xmin: %u\n" -msgstr "%.0fê°œì˜ ì£½ì€ ë¡œìš° ë²„ì „ì„ ì•„ì§ ì§€ìš¸ 수 없습니다, ì œì¼ ëŠ™ì€ xmin: %u\n" +#: access/heap/vacuumlazy.c:707 +msgid "index scan bypassed: " +msgstr "ì¸ë±ìФ 검사 통과ë¨: " -#: access/heap/vacuumlazy.c:1737 -#, c-format -msgid "There were %.0f unused item identifiers.\n" -msgstr "%.0fê°œì˜ ì‚¬ìš©ë˜ì§€ ì•Šì€ ì•„ì´í…œ ì‹ë³„ìžë“¤ì´ 있습니다.\n" +#: access/heap/vacuumlazy.c:709 +msgid "index scan bypassed by failsafe: " +msgstr "failsafeì˜ ì˜í•´ ì¸ë±ìФ 검사 통과ë¨: " -#: access/heap/vacuumlazy.c:1739 +#: access/heap/vacuumlazy.c:711 #, c-format -msgid "Skipped %u page due to buffer pins, " -msgid_plural "Skipped %u pages due to buffer pins, " -msgstr[0] "%u 페ì´ì§€ë¥¼ ë²„í¼ í•€ë‹ìœ¼ë¡œ 건너 뛰었습니다, " +msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" +msgstr "" +"í…Œì´ë¸”ì˜ %u ê°œ 페ì´ì§€(ì „ì²´ì˜ %.2f%%)ì—서 %lld ê°œì˜ ì£½ì€ í•­ëª© ì‹ë³„ìžê°€ 있ìŒ\n" -#: access/heap/vacuumlazy.c:1743 +#: access/heap/vacuumlazy.c:726 #, c-format -msgid "%u frozen page.\n" -msgid_plural "%u frozen pages.\n" -msgstr[0] "" +msgid "" +"index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u " +"reusable\n" +msgstr "" +"\"%s\" ì¸ë±ìФ: 페ì´ì§€: ì „ì²´ ê°€ìš´ë° %u, 새롭게 지운거 %u, 현재 지운거 %u, 재사" +"용한 것 %u\n" -#: access/heap/vacuumlazy.c:1747 +#: access/heap/vacuumlazy.c:738 commands/analyze.c:794 #, c-format -msgid "%u page is entirely empty.\n" -msgid_plural "%u pages are entirely empty.\n" -msgstr[0] "" +msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" +msgstr "I/O ì†ë„: ì½ê¸°: %.3f ms, 쓰기: %.3f ms\n" -#: access/heap/vacuumlazy.c:1751 commands/indexcmds.c:3487 -#: commands/indexcmds.c:3505 +#: access/heap/vacuumlazy.c:748 commands/analyze.c:797 #, c-format -msgid "%s." -msgstr "%s." +msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" +msgstr "í‰ê·  ì½ê¸° ì†ë„: %.3f MB/s, í‰ê·  쓰기 ì†ë„: %.3f MB/s\n" -#: access/heap/vacuumlazy.c:1754 +#: access/heap/vacuumlazy.c:751 commands/analyze.c:799 #, c-format -msgid "" -"\"%s\": found %.0f removable, %.0f nonremovable row versions in %u out of %u " -"pages" -msgstr "" -"\"%s\": 지울 수 있는 ìžë£Œ %.0fê°œ, 지울 수 없는 ìžë£Œ %.0f개를 %u/%uê°œ 페ì´ì§€ì—" -"서 찾았ìŒ" +msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgstr "ë²„í¼ ì‚¬ìš©ëŸ‰: %lld 조회, %lld 놓침, %lld 변경ë¨\n" -#: access/heap/vacuumlazy.c:1888 +#: access/heap/vacuumlazy.c:756 #, c-format -msgid "\"%s\": removed %d row versions in %d pages" -msgstr "\"%s\": %d ê°œ ìžë£Œë¥¼ %d 페ì´ì§€ì—서 삭제했ìŒ" +msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" +msgstr "WAL 사용량: %lld 레코드, %lld full page ì´ë¯¸ì§€, %llu ë°”ì´íЏ\n" -#: access/heap/vacuumlazy.c:2143 +#: access/heap/vacuumlazy.c:760 commands/analyze.c:803 #, c-format -msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" -msgid_plural "" -"launched %d parallel vacuum workers for index cleanup (planned: %d)" -msgstr[0] "" +msgid "system usage: %s" +msgstr "시스템 사용량: %s" -#: access/heap/vacuumlazy.c:2149 +#: access/heap/vacuumlazy.c:2170 #, c-format -msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" -msgid_plural "" -"launched %d parallel vacuum workers for index vacuuming (planned: %d)" -msgstr[0] "" +msgid "table \"%s\": removed %lld dead item identifiers in %u pages" +msgstr "" +"\"%s\" í…Œì´ë¸”: %lld ê°œì˜ ì£½ì€ í•­ëª© 실별ìžë¥¼ %u ê°œì˜ íŽ˜ì´ì§€ì—서 삭제했ìŒ" -#: access/heap/vacuumlazy.c:2441 +#: access/heap/vacuumlazy.c:2324 #, c-format msgid "" -"scanned index \"%s\" to remove %d row versions by parallel vacuum worker" +"bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after " +"%d index scans" msgstr "" -"\"%s\" ì¸ë±ìŠ¤ë¥¼ 스캔해서 %dê°œì˜ í–‰ ë²„ì „ë“¤ì„ ë³‘ë ¬ vacuum 작업ìžê°€ 지웠습니다" +"\"%s.%s.%s\" í…Œì´ë¸”ì˜ ë¶ˆí•„ìš”í•œ 관리 ìž‘ì—…ì€ í†µê³¼í–ˆìŒ, %d ë²ˆì˜ ì¸ë±ìФ 검사로 êµ³" +"ì´ í•„ìš” ì—†ìŒ" -#: access/heap/vacuumlazy.c:2443 +#: access/heap/vacuumlazy.c:2327 #, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "\"%s\" ì¸ë±ìŠ¤ë¥¼ 스캔해서 %dê°œì˜ í–‰ ë²„ì „ë“¤ì„ ì§€ì› ìŠµë‹ˆë‹¤" +msgid "The table's relfrozenxid or relminmxid is too far in the past." +msgstr "해당 í…Œì´ë¸”ì˜ relfrozenxid 나 relminmxid ê°’ì´ ë„ˆë¬´ 오래 ëœ ê²ƒìž…ë‹ˆë‹¤." -#: access/heap/vacuumlazy.c:2501 +#: access/heap/vacuumlazy.c:2328 #, c-format msgid "" -"index \"%s\" now contains %.0f row versions in %u pages as reported by " -"parallel vacuum worker" +"Consider increasing configuration parameter \"maintenance_work_mem\" or " +"\"autovacuum_work_mem\".\n" +"You might also need to consider other ways for VACUUM to keep up with the " +"allocation of transaction IDs." msgstr "" -"\"%s\" ì¸ë±ìŠ¤ëŠ” %.0f í–‰ ë²„ì „ì„ %u 페ì´ì§€ì—서 í¬í•¨ìžˆìŒì„ " -"병렬 vacuum 작업ìžê°€ 보고함" +"\"maintenance_work_mem\" ë˜ëŠ” \"autovacuum_work_mem\" 환경 설정 매개 변수값 " +"늘리는 ê²ƒì„ ê³ ë ¤í•´ 보세요.\n" +"VACUUM ìž‘ì—…ì´ íŠ¸ëžœìž­ì…˜ IDê°€ ì¦ê°€í•˜ëŠ” ê²ƒì„ ë”°ë¼ ìž¡ì„ ìžˆëŠ” 다른 ë°©ë²•ë„ í•´ ë´ì•¼ " +"í•  것 같습니다." -#: access/heap/vacuumlazy.c:2503 +#: access/heap/vacuumlazy.c:2590 #, c-format -msgid "index \"%s\" now contains %.0f row versions in %u pages" -msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” %.0f í–‰ ë²„ì „ì„ %u 페ì´ì§€ì—서 í¬í•¨í•˜ê³  있습니다." +msgid "\"%s\": stopping truncate due to conflicting lock request" +msgstr "\"%s\": 잠금 요청 ì¶©ëŒë¡œ ìžë£Œ 비우기 ìž‘ì—…ì„ ì¤‘ì§€í•©ë‹ˆë‹¤" -#: access/heap/vacuumlazy.c:2510 +#: access/heap/vacuumlazy.c:2660 #, c-format -msgid "" -"%.0f index row versions were removed.\n" -"%u index pages have been deleted, %u are currently reusable.\n" -"%s." -msgstr "" -"%.0fê°œì˜ ì¸ë±ìФ í–‰ ë²„ì „ì„ ì‚­ì œí–ˆìŠµë‹ˆë‹¤.\n" -"%uê°œ ì¸ë±ìФ 페ì´ì§€ë¥¼ 삭제해서, %uê°œ 페ì´ì§€ë¥¼ 다시 사용합니다.\n" -"%s." +msgid "table \"%s\": truncated %u to %u pages" +msgstr "\"%s\" í…Œì´ë¸”: %u ì—서 %u 페ì´ì§€ë¡œ 정리했ìŒ" -#: access/heap/vacuumlazy.c:2613 +#: access/heap/vacuumlazy.c:2722 #, c-format -msgid "\"%s\": stopping truncate due to conflicting lock request" -msgstr "\"%s\": 잠금 요청 ì¶©ëŒë¡œ ìžë£Œ 비우기 ìž‘ì—…ì„ ì¤‘ì§€í•©ë‹ˆë‹¤" +msgid "table \"%s\": suspending truncate due to conflicting lock request" +msgstr "\"%s\" í…Œì´ë¸”: 잠금 요청 ì¶©ëŒë¡œ ìžë£Œ 비우기 ìž‘ì—…ì´ ì§€ì—°ë˜ê³  있ìŒ" -#: access/heap/vacuumlazy.c:2679 +#: access/heap/vacuumlazy.c:2841 #, c-format -msgid "\"%s\": truncated %u to %u pages" -msgstr "\"%s\": %u ì—서 %u 페ì´ì§€ë¡œ 정지했ìŒ" +msgid "" +"disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary " +"tables in parallel" +msgstr "" +"\"%s\" 청소 작업ì—ì„œì˜ ë³‘ë ¬ ì˜µì…˜ì€ ë¬´ì‹œí•¨ --- 임시 í…Œì´ë¸”ì€ ë³‘ë ¬ 처리로 청소 " +"í•  수 ì—†ìŒ" -#: access/heap/vacuumlazy.c:2744 +#: access/heap/vacuumlazy.c:3108 #, c-format -msgid "\"%s\": suspending truncate due to conflicting lock request" -msgstr "\"%s\": 잠금 요청 ì¶©ëŒë¡œ ìžë£Œ 비우기 ìž‘ì—…ì„ ì§€ì—°í•©ë‹ˆë‹¤" +msgid "while scanning block %u offset %u of relation \"%s.%s\"" +msgstr "%u ë¸”ë¡ %u 오프셋 íƒìƒ‰ 중 (해당 릴레ì´ì…˜: \"%s.%s\")" -#: access/heap/vacuumlazy.c:3583 +#: access/heap/vacuumlazy.c:3111 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "%u 블ë¡(해당 릴레ì´ì…˜: \"%s.%s\")ì„ íƒìƒ‰ 중" -#: access/heap/vacuumlazy.c:3586 +#: access/heap/vacuumlazy.c:3115 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "\"%s.%s\" 릴레ì´ì…˜ì„ íƒìƒ‰ 중" -#: access/heap/vacuumlazy.c:3592 +#: access/heap/vacuumlazy.c:3123 +#, c-format +msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" +msgstr "%u ë¸”ë¡ %u 오프셋 청소 중 (해당 릴레ì´ì…˜: \"%s.%s\")" + +#: access/heap/vacuumlazy.c:3126 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "%u 블ë¡(해당 릴레ì´ì…˜: \"%s.%s\")ì„ ì²­ì†Œ 중" -#: access/heap/vacuumlazy.c:3595 +#: access/heap/vacuumlazy.c:3130 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "\"%s.%s\" 릴레ì´ì…˜ 청소 중" -#: access/heap/vacuumlazy.c:3600 +#: access/heap/vacuumlazy.c:3135 commands/vacuumparallel.c:1112 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "\"%s\" ì¸ë±ìФ(해당 릴레ì´ì…˜ \"%s.%s\") 청소 중" -#: access/heap/vacuumlazy.c:3605 +#: access/heap/vacuumlazy.c:3140 commands/vacuumparallel.c:1118 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "\"%s\" ì¸ë±ìФ (해당 릴레ì´ì…˜ \"%s.%s\")ì„ ì •ëˆ(clean up) 중" -#: access/heap/vacuumlazy.c:3611 +#: access/heap/vacuumlazy.c:3146 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "\"%s.%s\" 릴레ì´ì…˜ì„ %u 블럭으로 줄ì´ëŠ” 중" -#: access/index/amapi.c:83 commands/amcmds.c:170 +#: access/index/amapi.c:83 commands/amcmds.c:143 #, c-format msgid "access method \"%s\" is not of type %s" msgstr "\"%s\" ì ‘ê·¼ ë°©ë²•ì€ %s ìžë£Œí˜•ì—는 쓸 수 ì—†ìŒ" @@ -1400,40 +1765,50 @@ msgstr "\"%s\" ì ‘ê·¼ ë°©ë²•ì€ %s ìžë£Œí˜•ì—는 쓸 수 ì—†ìŒ" msgid "index access method \"%s\" does not have a handler" msgstr "\"%s\" ì¸ë±ìФ ì ‘ê·¼ ë°©ë²•ì— ëŒ€í•œ 핸들러가 ì—†ìŒ" -#: access/index/indexam.c:142 catalog/objectaddress.c:1260 -#: commands/indexcmds.c:2516 commands/tablecmds.c:254 commands/tablecmds.c:278 -#: commands/tablecmds.c:15733 commands/tablecmds.c:17188 +#: access/index/genam.c:489 +#, c-format +msgid "transaction aborted during system catalog scan" +msgstr "시스템 카탈로그 íƒìƒ‰ 중 트랜잭션 중지ë¨" + +#: access/index/genam.c:657 access/index/indexam.c:82 +#, c-format +msgid "cannot access index \"%s\" while it is being reindexed" +msgstr "reindex 시작할 때는 \"%s\" ì¸ë±ìŠ¤ë¥¼ 접근할 ì—†ìŒ" + +#: access/index/indexam.c:203 catalog/objectaddress.c:1356 +#: commands/indexcmds.c:2851 commands/tablecmds.c:281 commands/tablecmds.c:305 +#: commands/tablecmds.c:17873 commands/tablecmds.c:19740 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" 개체는 ì¸ë±ìŠ¤ê°€ 아닙니다" -#: access/index/indexam.c:970 +#: access/index/indexam.c:1028 #, c-format msgid "operator class %s has no options" msgstr "%s ì—°ì‚°ìž í´ëž˜ìŠ¤ëŠ” ì˜µì…˜ì´ ì—†ìŠµë‹ˆë‹¤" -#: access/nbtree/nbtinsert.c:651 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "ì¤‘ë³µëœ í‚¤ ê°’ì´ \"%s\" 고유 제약 ì¡°ê±´ì„ ìœ„ë°˜í•¨" -#: access/nbtree/nbtinsert.c:653 +#: access/nbtree/nbtinsert.c:670 #, c-format msgid "Key %s already exists." msgstr "%s 키가 ì´ë¯¸ 있습니다." -#: access/nbtree/nbtinsert.c:747 +#: access/nbtree/nbtinsert.c:764 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "ì´ ë¬¸ì œëŠ” non-immutable ì¸ë±ìФ í‘œí˜„ì‹ ë•Œë¬¸ì¸ë“¯ 합니다." -#: access/nbtree/nbtpage.c:150 access/nbtree/nbtpage.c:538 -#: parser/parse_utilcmd.c:2244 +#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 +#: parser/parse_utilcmd.c:2323 #, c-format msgid "index \"%s\" is not a btree" msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” btree ì¸ë±ìŠ¤ê°€ 아닙니다" -#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:545 +#: access/nbtree/nbtpage.c:164 access/nbtree/nbtpage.c:618 #, c-format msgid "" "version mismatch in index \"%s\": file version %d, current version %d, " @@ -1442,12 +1817,12 @@ msgstr "" "\"%s\" ì¸ë±ìŠ¤ì˜ ë²„ì „ì´ í‹€ë¦½ë‹ˆë‹¤: íŒŒì¼ ë²„ì „ %d, 현재 버전 %d, 최소 ì§€ì› ë²„ì „ " "%d" -#: access/nbtree/nbtpage.c:1501 +#: access/nbtree/nbtpage.c:1861 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "\"%s\" ì¸ë±ìŠ¤ì— ë°˜ì¯¤ 죽ì€(half-dead) ë‚´ë¶€ 페ì´ì§€ê°€ 있ìŒ" -#: access/nbtree/nbtpage.c:1503 +#: access/nbtree/nbtpage.c:1863 #, c-format msgid "" "This can be caused by an interrupted VACUUM in version 9.3 or older, before " @@ -1456,7 +1831,7 @@ msgstr "" "ì´ ë¬¸ì œëŠ” 9.3 버전 ì´í•˜ 환경ì—서 VACUUM ìž‘ì—…ì´ ì¤‘ì§€ë˜ê³ , ê·¸ ìƒíƒœë¡œ 업그레ì´ë“œ" "ë˜ì—ˆì„ ê°€ëŠ¥ì„±ì´ í½ë‹ˆë‹¤. 해당 ì¸ë±ìŠ¤ë¥¼ 다시 만드십시오." -#: access/nbtree/nbtutils.c:2664 +#: access/nbtree/nbtutils.c:5108 #, c-format msgid "" "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" @@ -1464,12 +1839,12 @@ msgstr "" "ì¸ë±ìФ í–‰ í¬ê¸°(%zu)ê°€ btree(%u 버전)ì˜ ìµœëŒ€ê°’(%zu)ì„ ì´ˆê³¼í•¨ (해당 ì¸ë±ìФ: " "\"%s\")" -#: access/nbtree/nbtutils.c:2670 +#: access/nbtree/nbtutils.c:5114 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "ì¸ë±ìФ 로우가 %u,%u 튜플(해당 릴레ì´ì…˜ \"%s\")ì„ ì°¸ì¡°í•¨." -#: access/nbtree/nbtutils.c:2674 +#: access/nbtree/nbtutils.c:5118 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1479,7 +1854,7 @@ msgstr "" "ë²„í¼ íŽ˜ì´ì§€ì˜ 1/3보다 í° ê°’ì€ ì¸ë±ì‹±í•  수 없습니다.\n" "ê°’ì˜ MD5 해시 함수 ì¸ë±ìŠ¤ë¥¼ 고려하거나 ì „ì²´ í…스트 ì¸ë±ì‹±ì„ 사용하십시오." -#: access/nbtree/nbtvalidate.c:243 +#: access/nbtree/nbtvalidate.c:246 #, c-format msgid "" "operator family \"%s\" of access method %s is missing support function for " @@ -1488,18 +1863,29 @@ msgstr "" "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: %s)ì—는 %s ìžë£Œí˜•ê³¼ %s ìžë£Œí˜•ìš© ì§€ì› í•¨ìˆ˜ê°€ " "빠졌ìŒ" -#: access/spgist/spgutils.c:147 +#: access/sequence/sequence.c:75 access/table/table.c:145 +#: optimizer/util/plancat.c:144 +#, c-format +msgid "cannot open relation \"%s\"" +msgstr "\"%s\" 릴레ì´ì…˜ì„ ì—´ 수 ì—†ìŒ" + +#: access/spgist/spgutils.c:245 #, c-format msgid "" "compress method must be defined when leaf type is different from input type" msgstr "ìž…ë ¥ ìžë£Œí˜•ì—서 리프 ìœ í˜•ì´ ë‹¤ë¥¼ 때 ì••ì¶• ë°©ë²•ì€ ë°˜ë“œì‹œ ì •ì˜í•´ì•¼ 함" -#: access/spgist/spgutils.c:761 +#: access/spgist/spgutils.c:1028 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "SP-GiST ë‚´ë¶€ 튜플 í¬ê¸°ê°€ 초과ë¨: 현재값 %zu, 최대값 %zu" -#: access/spgist/spgvalidate.c:281 +#: access/spgist/spgvalidate.c:136 +#, c-format +msgid "SP-GiST leaf data type %s does not match declared type %s" +msgstr "%s í˜•ì´ SP-GiST 리프 ìžë£Œí˜•ì¸ë°, ì„ ì–¸ì€ %s 형으로 í–ˆìŒ" + +#: access/spgist/spgvalidate.c:302 #, c-format msgid "" "operator family \"%s\" of access method %s is missing support function %d " @@ -1508,80 +1894,69 @@ msgstr "" "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: %s)ì— %d ì§€ì› í•¨ìˆ˜ê°€ %s ìžë£Œí˜•용으로 없습니" "다." -#: access/table/table.c:49 access/table/table.c:78 access/table/table.c:111 -#: catalog/aclchk.c:1806 -#, c-format -msgid "\"%s\" is an index" -msgstr "\"%s\" 개체는 ì¸ë±ìŠ¤ìž„" - -#: access/table/table.c:54 access/table/table.c:83 access/table/table.c:116 -#: catalog/aclchk.c:1813 commands/tablecmds.c:12554 commands/tablecmds.c:15742 -#, c-format -msgid "\"%s\" is a composite type" -msgstr "\"%s\" 개체는 복합 ìžë£Œí˜•입니다" - -#: access/table/tableam.c:244 +#: access/table/tableam.c:255 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "tid (%u, %u)ê°€ 바르지 않ìŒ, 해당 릴레ì´ì…˜: \"%s\"" -#: access/table/tableamapi.c:115 +#: access/table/tableamapi.c:109 #, c-format -msgid "%s cannot be empty." -msgstr "%s ê°’ì€ ë¹„ì›Œ 둘 수 ì—†ìŒ" +msgid "\"%s\" cannot be empty." +msgstr "\"%s\" ê°’ì€ ë¹„ì›Œ 둘 수 ì—†ìŒ" -#: access/table/tableamapi.c:122 utils/misc/guc.c:11928 +#: access/table/tableamapi.c:116 access/transam/xlogrecovery.c:4858 #, c-format -msgid "%s is too long (maximum %d characters)." -msgstr "%s ì„¤ì •ê°’ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤ (최대 %d 문ìž)" +msgid "\"%s\" is too long (maximum %d characters)." +msgstr "\"%s\" ì„¤ì •ê°’ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤ (최대 %d 문ìž)" -#: access/table/tableamapi.c:145 +#: access/table/tableamapi.c:139 #, c-format msgid "table access method \"%s\" does not exist" msgstr "\"%s\" í…Œì´ë¸” ì ‘ê·¼ ë°©ë²•ì´ ì—†ìŠµë‹ˆë‹¤" -#: access/table/tableamapi.c:150 +#: access/table/tableamapi.c:144 #, c-format msgid "Table access method \"%s\" does not exist." msgstr "\"%s\" í…Œì´ë¸” ì ‘ê·¼ ë°©ë²•ì´ ì—†ìŠµë‹ˆë‹¤." -#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:152 +#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:151 #, c-format msgid "sample percentage must be between 0 and 100" msgstr "샘플 í¼ì„¼íЏ ê°’ì€ 0ì—서 100 사ì´ì—¬ì•¼ 함" -#: access/transam/commit_ts.c:295 +#: access/transam/commit_ts.c:287 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "%u íŠ¸ëžœìž­ì…˜ì˜ ì»¤ë°‹ 타임스탬프를 알 수 ì—†ìŒ" -#: access/transam/commit_ts.c:393 +#: access/transam/commit_ts.c:385 #, c-format msgid "could not get commit timestamp data" msgstr "커밋 타임스탬프 ìžë£Œë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: access/transam/commit_ts.c:395 +#: access/transam/commit_ts.c:387 #, c-format msgid "" -"Make sure the configuration parameter \"%s\" is set on the master server." -msgstr "ìš´ì˜ ì„œë²„ì—서 \"%s\" 환경 설정 매개 ë³€ìˆ˜ê°’ì„ ì§€ì • 하세요." +"Make sure the configuration parameter \"%s\" is set on the primary server." +msgstr "ìš´ì˜ ì„œë²„ì—서 \"%s\" 환경 설정 매개 변수를 설정했는지 확ì¸í•˜ì„¸ìš”." -#: access/transam/commit_ts.c:397 +#: access/transam/commit_ts.c:389 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "\"%s\" 환경 설정 매개 변수를 지정하세요." -#: access/transam/multixact.c:1002 +#: access/transam/multixact.c:1091 #, c-format msgid "" -"database is not accepting commands that generate new MultiXactIds to avoid " +"database is not accepting commands that assign new MultiXactIds to avoid " "wraparound data loss in database \"%s\"" msgstr "" "\"%s\" ë°ì´í„°ë² ì´ìФ ìžë£Œ ì†ì‹¤ì„ 막기 위해 새로운 MultiXactId 만드는 ìž‘ì—…ì„ " "ë” ì´ìƒ í•  수 없습니다." -#: access/transam/multixact.c:1004 access/transam/multixact.c:1011 -#: access/transam/multixact.c:1035 access/transam/multixact.c:1044 +#: access/transam/multixact.c:1093 access/transam/multixact.c:1100 +#: access/transam/multixact.c:1124 access/transam/multixact.c:1133 +#: access/transam/varsup.c:158 access/transam/varsup.c:165 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" @@ -1589,19 +1964,19 @@ msgid "" "drop stale replication slots." msgstr "" "해당 ë°ì´í„°ë² ì´ìФ 단위로 VACUUM ìž‘ì—…ì„ ì§„í–‰í•˜ì‹­ì‹œì˜¤.\n" -"ë˜í•œ ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ì„ ì»¤ë°‹ë˜ëŠ” 롤백하거나 잠긴 복제 ìŠ¬ë¡¯ì„ ì§€ìš¸ 필요가 있습" +"ë˜í•œ ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ì„ ì»¤ë°‹ ë˜ëŠ” 롤백하거나 잠긴 복제 ìŠ¬ë¡¯ì„ ì§€ìš¸ 필요가 있습" "니다." -#: access/transam/multixact.c:1009 +#: access/transam/multixact.c:1098 #, c-format msgid "" -"database is not accepting commands that generate new MultiXactIds to avoid " +"database is not accepting commands that assign new MultiXactIds to avoid " "wraparound data loss in database with OID %u" msgstr "" "%u OID ë°ì´í„°ë² ì´ìФ ìžë£Œ ì†ì‹¤ì„ 막기 위해 새로운 MultiXactId 만드는 ìž‘ì—…ì„ " "ë” ì´ìƒ í•  수 없습니다." -#: access/transam/multixact.c:1030 access/transam/multixact.c:2320 +#: access/transam/multixact.c:1119 access/transam/multixact.c:2474 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "" @@ -1610,7 +1985,7 @@ msgstr[0] "" "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ëŠ” %uë²ˆì˜ íŠ¸ëžœìž­ì…˜ì´ ë°œìƒë˜ê¸° ì „ì— VACUUM ìž‘ì—…ì„ í•´ì•¼ 합니" "다." -#: access/transam/multixact.c:1039 access/transam/multixact.c:2329 +#: access/transam/multixact.c:1128 access/transam/multixact.c:2483 #, c-format msgid "" "database with OID %u must be vacuumed before %u more MultiXactId is used" @@ -1620,12 +1995,12 @@ msgstr[0] "" "%u OID ë°ì´í„°ë² ì´ìŠ¤ëŠ” %uë²ˆì˜ íŠ¸ëžœìž­ì…˜ì´ ë°œìƒë˜ê¸° ì „ì— VACUUM ìž‘ì—…ì„ í•´ì•¼ 합니" "다." -#: access/transam/multixact.c:1100 +#: access/transam/multixact.c:1189 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "multixact \"회수\" 초과" -#: access/transam/multixact.c:1101 +#: access/transam/multixact.c:1190 #, c-format msgid "" "This command would create a multixact with %u members, but the remaining " @@ -1636,17 +2011,17 @@ msgid_plural "" msgstr[0] "" "ì´ ëª…ë ¹ì€ %u ê°œì˜ multixact를 ì¨ì•¼í•˜ëŠ”ë°, 쓸 수 있는 ê³µê°„ì€ %u ê°œ ë¿ìž…니다." -#: access/transam/multixact.c:1106 +#: access/transam/multixact.c:1195 #, c-format msgid "" "Execute a database-wide VACUUM in database with OID %u with reduced " -"vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age " -"settings." +"\"vacuum_multixact_freeze_min_age\" and " +"\"vacuum_multixact_freeze_table_age\" settings." msgstr "" -"vacuum_multixact_freeze_min_age, vacuum_multixact_freeze_table_age ê°’ì„ ì¡°ì •" -"하고, %u OID ë°ì´í„°ë² ì´ìФ 대ìƒìœ¼ë¡œ VACUUM ìž‘ì—…ì„ í•˜ì‹­ì‹œì˜¤." +"\"vacuum_multixact_freeze_min_age\", \"vacuum_multixact_freeze_table_age\" ê°’" +"ì„ ì¡°ì •í•˜ê³ , %u OID ë°ì´í„°ë² ì´ìФ 대ìƒìœ¼ë¡œ VACUUM ìž‘ì—…ì„ í•˜ì‹­ì‹œì˜¤." -#: access/transam/multixact.c:1137 +#: access/transam/multixact.c:1226 #, c-format msgid "" "database with OID %u must be vacuumed before %d more multixact member is used" @@ -1657,52 +2032,41 @@ msgstr[0] "" "%u OID ë°ì´í„°ë² ì´ìŠ¤ëŠ” %d ê°œì˜ ë©€í‹°íŠ¸ëžœìž­ì…˜ì„ ì‚¬ìš©í•˜ê¸° ì „ì— vacuum ìž‘ì—…ì„ í•´" "야 합니다." -#: access/transam/multixact.c:1142 +#: access/transam/multixact.c:1231 #, c-format msgid "" "Execute a database-wide VACUUM in that database with reduced " -"vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age " -"settings." +"\"vacuum_multixact_freeze_min_age\" and " +"\"vacuum_multixact_freeze_table_age\" settings." msgstr "" -"vacuum_multixact_freeze_min_age 설정값과 vacuum_multixact_freeze_table_age ê°’" -"ì„ ì¤„ì—¬ì„œ ë°ì´í„°ë² ì´ìФ 단위로 VACUUM ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”." +"\"vacuum_multixact_freeze_min_age\" 설정값과 " +"\"vacuum_multixact_freeze_table_age\" ê°’ì„ ì¤„ì—¬ì„œ ë°ì´í„°ë² ì´ìФ 단위로 VACUUM " +"ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”." -#: access/transam/multixact.c:1279 +#: access/transam/multixact.c:1371 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "%u번 MultiXactId ë”ì´ìƒ ì—†ìŒ -- 번호 겹침 í˜„ìƒ ë°œìƒ" -#: access/transam/multixact.c:1287 +#: access/transam/multixact.c:1377 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "%u번 MultiXactId를 만들 수 ì—†ìŒ -- 번호 겹침 í˜„ìƒ ë°œìƒ" -#: access/transam/multixact.c:2270 -#, c-format -msgid "MultiXactId wrap limit is %u, limited by database with OID %u" -msgstr "MultiXactId 겹침 한계는 %u 입니다. %u OID ë°ì´í„°ë² ì´ìФì—서 제한ë¨" - -#: access/transam/multixact.c:2325 access/transam/multixact.c:2334 -#: access/transam/varsup.c:149 access/transam/varsup.c:156 -#: access/transam/varsup.c:447 access/transam/varsup.c:454 +#: access/transam/multixact.c:2479 access/transam/multixact.c:2488 #, c-format msgid "" -"To avoid a database shutdown, execute a database-wide VACUUM in that " -"database.\n" +"To avoid MultiXactId assignment failures, execute a database-wide VACUUM in " +"that database.\n" "You might also need to commit or roll back old prepared transactions, or " "drop stale replication slots." msgstr "" -"ë°ì´í„°ë² ì´ìŠ¤ê°€ 종료ë˜ì§€ 않ë„ë¡ í•˜ë ¤ë©´ ë°ì´í„°ë² ì´ìФ ìˆ˜ì¤€ì˜ VACUUMì„ ì‹¤í–‰í•˜ì‹­ì‹œ" +"MultiXactId 할당 실패를 피하려면, ë°ì´í„°ë² ì´ìФ ìˆ˜ì¤€ì˜ VACUUMì„ ì‹¤í–‰í•˜ì‹­ì‹œ" "오.\n" -"ë˜í•œ ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ì„ ì»¤ë°‹ë˜ëŠ” 롤백 하거나, 잠긴 복제 ìŠ¬ë¡¯ì„ ì§€ìš¸ 필요가 있" +"ë˜í•œ ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ì„ ì»¤ë°‹ ë˜ëŠ” 롤백 하거나, 잠긴 복제 ìŠ¬ë¡¯ì„ ì§€ìš¸ 필요가 있" "습니다." -#: access/transam/multixact.c:2604 -#, c-format -msgid "oldest MultiXactId member is at offset %u" -msgstr "ì œì¼ ì˜¤ëž˜ëœ MultiXactId ê°’ì€ %u ìœ„ì¹˜ì— ìžˆìŒ" - -#: access/transam/multixact.c:2608 +#: access/transam/multixact.c:2767 #, c-format msgid "" "MultiXact member wraparound protections are disabled because oldest " @@ -1711,24 +2075,19 @@ msgstr "" "가장 ì˜¤ëž˜ëœ ì²´í¬í¬ì¸íЏ ìž‘ì—…ì´ ì™„ë£Œëœ %u 멀티 트랜잭션 번호가 디스í¬ì— 없기 때" "문ì—, 멀티 트랜잭션 번호 겹침 ë°©ì§€ ê¸°ëŠ¥ì´ ë¹„í™œì„±í™” ë˜ì–´ 있습니다." -#: access/transam/multixact.c:2630 +#: access/transam/multixact.c:2789 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "멀티 트랜잭션 번호 겹침 ë°©ì§€ ê¸°ëŠ¥ì´ í™œì„±í™” ë˜ì—ˆìŒ" -#: access/transam/multixact.c:2633 -#, c-format -msgid "MultiXact member stop limit is now %u based on MultiXact %u" -msgstr "멀티 트랜잭션 중지 제한 번호는 %u 입니다. (%u ë©€í‹°íŠ¸ëžœìž­ì…˜ì— ê¸°ì´ˆí•¨)" - -#: access/transam/multixact.c:3013 +#: access/transam/multixact.c:3180 #, c-format msgid "" "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "" "가장 ì˜¤ëž˜ëœ ë©€í‹° 트랜잭션 번호는 %u, 가장 최신 ê²ƒì€ %u, truncate 작업 건너뜀" -#: access/transam/multixact.c:3031 +#: access/transam/multixact.c:3198 #, c-format msgid "" "cannot truncate up to MultiXact %u because it does not exist on disk, " @@ -1737,108 +2096,172 @@ msgstr "" "디스í¬ì— 해당 멀티 트랜잭션 번호가 없어, %u 멀티 트랜잭션 번호로 truncate 못" "함, truncate 작업 건너뜀" -#: access/transam/multixact.c:3345 +#: access/transam/multixact.c:3517 #, c-format msgid "invalid MultiXactId: %u" msgstr "ìž˜ëª»ëœ MultiXactId: %u" -#: access/transam/parallel.c:706 access/transam/parallel.c:825 +#: access/transam/parallel.c:748 access/transam/parallel.c:867 #, c-format msgid "parallel worker failed to initialize" msgstr "병렬 ìž‘ì—…ìž ì´ˆê¸°í™” 실패" -#: access/transam/parallel.c:707 access/transam/parallel.c:826 +#: access/transam/parallel.c:749 access/transam/parallel.c:868 #, c-format msgid "More details may be available in the server log." msgstr "보다 ìžì„¸í•œ ë‚´ìš©ì€ ì„œë²„ ë¡œê·¸ì— ë‚¨ê²¨ì¡Œì„ ìˆ˜ 있습니다." -#: access/transam/parallel.c:887 +#: access/transam/parallel.c:929 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "병렬 트랜잭션 처리 중 postmaster 종료ë¨" -#: access/transam/parallel.c:1074 +#: access/transam/parallel.c:1116 #, c-format msgid "lost connection to parallel worker" msgstr "병렬 처리 ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ ì—°ê²° ëŠê¹€" -#: access/transam/parallel.c:1140 access/transam/parallel.c:1142 +#: access/transam/parallel.c:1172 access/transam/parallel.c:1174 msgid "parallel worker" msgstr "병렬 처리 작업ìž" -#: access/transam/parallel.c:1293 +#: access/transam/parallel.c:1344 replication/logical/applyparallelworker.c:890 #, c-format msgid "could not map dynamic shared memory segment" msgstr "ë™ì  공유 메모리 세그먼트를 할당할 수 ì—†ìŒ" -#: access/transam/parallel.c:1298 +#: access/transam/parallel.c:1349 replication/logical/applyparallelworker.c:896 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "ë™ì  공유 메모리 ì„¸ê·¸ë¨¼íŠ¸ì— ìž˜ëª»ëœ ë§¤ì§ ë²ˆí˜¸ê°€ 있ìŒ" -#: access/transam/slru.c:696 +#: access/transam/rmgr.c:93 #, c-format -msgid "file \"%s\" doesn't exist, reading as zeroes" -msgstr "\"%s\" íŒŒì¼ ì—†ìŒ, 0으로 ì½ìŒ" +msgid "resource manager with ID %d not registered" +msgstr "%d IDì˜ ìžì› 관리ìžê°€ 등ë¡ë˜ì–´ 있지 않ìŒ" -#: access/transam/slru.c:937 access/transam/slru.c:943 -#: access/transam/slru.c:951 access/transam/slru.c:956 -#: access/transam/slru.c:963 access/transam/slru.c:968 -#: access/transam/slru.c:975 access/transam/slru.c:982 +#: access/transam/rmgr.c:94 #, c-format -msgid "could not access status of transaction %u" -msgstr "%u íŠ¸ëžœìž­ì…˜ì˜ ìƒíƒœë¥¼ 액세스할 수 ì—†ìŒ" +msgid "" +"Include the extension module that implements this resource manager in " +"\"shared_preload_libraries\"." +msgstr "" +"ì´ ìžì› ê´€ë¦¬ìž êµ¬í˜„í•˜ëŠ” ê·¸ 확장 ëª¨ë“ˆì„ \"shared_preload_libraries\" 설정값으" +"로 추가해주세요." + +#: access/transam/rmgr.c:110 +#, c-format +msgid "custom resource manager name is invalid" +msgstr "ì‚¬ìš©ìž ì •ì˜ ìžì› ê´€ë¦¬ìž ì´ë¦„ì´ ë°”ë¥´ì§€ 않ìŒ" + +#: access/transam/rmgr.c:111 +#, c-format +msgid "Provide a non-empty name for the custom resource manager." +msgstr "ì‚¬ìš©ìž ì •ì˜ ìžì› ê´€ë¦¬ìž ì´ë¦„ì€ ë¹„ì›Œë‘˜ 수 없습니다." + +#: access/transam/rmgr.c:114 +#, c-format +msgid "custom resource manager ID %d is out of range" +msgstr "ì‚¬ìš©ìž ì •ì˜ ìžì› ê´€ë¦¬ìž %d ID ë²ˆí˜¸ì˜ ë²”ìœ„ê°€ 벗어남" + +#: access/transam/rmgr.c:115 +#, c-format +msgid "Provide a custom resource manager ID between %d and %d." +msgstr "ì‚¬ìš©ìž ì •ì˜ ìžì› ê´€ë¦¬ìž ID는 %d ì—서 %d 까지만 지정할 수 있ìŒ." + +#: access/transam/rmgr.c:120 access/transam/rmgr.c:125 +#: access/transam/rmgr.c:137 +#, c-format +msgid "failed to register custom resource manager \"%s\" with ID %d" +msgstr "\"%s\" ì‚¬ìš©ìž ì •ì˜ ìžì› 관리ìžë¥¼ %d ID로 등ë¡í•  수 ì—†ìŒ" + +#: access/transam/rmgr.c:121 +#, c-format +msgid "" +"Custom resource manager must be registered while initializing modules in " +"\"shared_preload_libraries\"." +msgstr "" +"ì‚¬ìš©ìž ì •ì˜ ìžì› 관리ìžë¥¼ 사용하려면 먼저 \"shared_preload_libraries\" 설정값" +"으로 등ë¡ë˜ì–´ì•¼ 합니다." + +#: access/transam/rmgr.c:126 +#, c-format +msgid "Custom resource manager \"%s\" already registered with the same ID." +msgstr "\"%s\" ì‚¬ìš©ìž ì •ì˜ ìžì› ê´€ë¦¬ìž IDê°€ ì´ë¯¸ 등ë¡ë˜ì–´ 있습니다." + +#: access/transam/rmgr.c:138 +#, c-format +msgid "Existing resource manager with ID %d has the same name." +msgstr "%d ID ìžì› 관리ìžê°€ ê°™ì€ ì´ë¦„입니다." + +#: access/transam/rmgr.c:144 +#, c-format +msgid "registered custom resource manager \"%s\" with ID %d" +msgstr "\"%s\" ì‚¬ìš©ìž ì •ì˜ ìžì› 관리ìžê°€ %d ID로 등ë¡ë¨" + +#: access/transam/slru.c:361 +#, c-format +msgid "\"%s\" must be a multiple of %d" +msgstr "\"%s\" ê°’ì€ %dì˜ ë°°ìˆ˜ì—¬ì•¼ 함" + +#: access/transam/slru.c:830 +#, c-format +msgid "file \"%s\" doesn't exist, reading as zeroes" +msgstr "\"%s\" íŒŒì¼ ì—†ìŒ, 0으로 ì½ìŒ" + +#: access/transam/slru.c:1059 access/transam/slru.c:1065 +#: access/transam/slru.c:1073 access/transam/slru.c:1078 +#: access/transam/slru.c:1085 access/transam/slru.c:1090 +#: access/transam/slru.c:1097 access/transam/slru.c:1104 +#, c-format +msgid "could not access status of transaction %u" +msgstr "%u íŠ¸ëžœìž­ì…˜ì˜ ìƒíƒœë¥¼ 액세스할 수 ì—†ìŒ" -#: access/transam/slru.c:938 +#: access/transam/slru.c:1060 #, c-format msgid "Could not open file \"%s\": %m." msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m." -#: access/transam/slru.c:944 +#: access/transam/slru.c:1066 #, c-format -msgid "Could not seek in file \"%s\" to offset %u: %m." -msgstr "\"%s\" 파ì¼ì—서 %u 위치를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %m." +msgid "Could not seek in file \"%s\" to offset %d: %m." +msgstr "\"%s\" 파ì¼ì—서 %d 위치를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %m." -#: access/transam/slru.c:952 +#: access/transam/slru.c:1074 #, c-format -msgid "Could not read from file \"%s\" at offset %u: %m." -msgstr "\"%s\" 파ì¼ì—서 %u 위치를 ì½ì„ 수 ì—†ìŒ: %m." +msgid "Could not read from file \"%s\" at offset %d: %m." +msgstr "\"%s\" 파ì¼ì—서 %d 위치를 ì½ì„ 수 ì—†ìŒ: %m." -#: access/transam/slru.c:957 +#: access/transam/slru.c:1079 #, c-format -msgid "Could not read from file \"%s\" at offset %u: read too few bytes." -msgstr "\"%s\" 파ì¼ì—서 %u 위치를 ì½ì„ 수 ì—†ìŒ: 너무 ì ì€ ë°”ì´íŠ¸ë¥¼ ì½ìŒ." +msgid "Could not read from file \"%s\" at offset %d: read too few bytes." +msgstr "\"%s\" 파ì¼ì—서 %d 위치를 ì½ì„ 수 ì—†ìŒ: 너무 ì ì€ ë°”ì´íŠ¸ë¥¼ ì½ìŒ." -#: access/transam/slru.c:964 +#: access/transam/slru.c:1086 #, c-format -msgid "Could not write to file \"%s\" at offset %u: %m." -msgstr "\"%s\" 파ì¼ì—서 %u ìœ„ì¹˜ì— ì“¸ 수 ì—†ìŒ: %m." +msgid "Could not write to file \"%s\" at offset %d: %m." +msgstr "\"%s\" 파ì¼ì—서 %d ìœ„ì¹˜ì— ì“¸ 수 ì—†ìŒ: %m." -#: access/transam/slru.c:969 +#: access/transam/slru.c:1091 #, c-format -msgid "Could not write to file \"%s\" at offset %u: wrote too few bytes." -msgstr "\"%s\" 파ì¼ì—서 %u ìœ„ì¹˜ì— ì“¸ 수 ì—†ìŒ: 너무 ì ì€ ë°”ì´íŠ¸ë¥¼ 씀." +msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." +msgstr "\"%s\" 파ì¼ì—서 %d ìœ„ì¹˜ì— ì“¸ 수 ì—†ìŒ: 너무 ì ì€ ë°”ì´íŠ¸ë¥¼ 씀." -#: access/transam/slru.c:976 +#: access/transam/slru.c:1098 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "\"%s\" íŒŒì¼ fsync 실패: %m." -#: access/transam/slru.c:983 +#: access/transam/slru.c:1105 #, c-format msgid "Could not close file \"%s\": %m." msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m." -#: access/transam/slru.c:1258 +#: access/transam/slru.c:1431 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "\"%s\" 디렉터리를 비울 수 ì—†ìŒ: 랩어ë¼ìš´ë“œ ë°œìƒ" -#: access/transam/slru.c:1313 access/transam/slru.c:1369 -#, c-format -msgid "removing file \"%s\"" -msgstr "\"%s\" íŒŒì¼ ì‚­ì œ 중" - #: access/transam/timeline.c:163 access/transam/timeline.c:168 #, c-format msgid "syntax error in history file: %s" @@ -1862,7 +2285,7 @@ msgstr "작업내역 파ì¼ì— ìž˜ëª»ëœ ìžë£Œê°€ 있ìŒ: %s" #: access/transam/timeline.c:174 #, c-format msgid "Timeline IDs must be in increasing sequence." -msgstr "타임ë¼ì¸ ID ê°’ì€ ê·¸ ê°’ì´ ì¦ê°€í•˜ëŠ” 순번값ì´ì–´ì•¼í•©ë‹ˆë‹¤." +msgstr "타임ë¼ì¸ ID ê°’ì€ ê·¸ ê°’ì´ ì¦ê°€í•˜ëŠ” 순번값ì´ì–´ì•¼ 합니다." #: access/transam/timeline.c:194 #, c-format @@ -1874,124 +2297,136 @@ msgstr "작업내역 파ì¼ì— ìž˜ëª»ëœ ìžë£Œê°€ 있ìŒ: \"%s\"" msgid "Timeline IDs must be less than child timeline's ID." msgstr "타임ë¼ì¸ ID는 하위 타임ë¼ì¸ ID보다 작아야 합니다." -#: access/transam/timeline.c:597 +#: access/transam/timeline.c:589 #, c-format msgid "requested timeline %u is not in this server's history" msgstr "요청한 %u 타ì´ë¼ì¸ì´ ì´ ì„œë²„ ë‚´ì—­ì—는 ì—†ìŒ" -#: access/transam/twophase.c:381 +#: access/transam/twophase.c:368 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "\"%s\" 트랜잭션 ì‹ë³„ìžê°€ 너무 ê¹ë‹ˆë‹¤" -#: access/transam/twophase.c:388 +#: access/transam/twophase.c:375 #, c-format msgid "prepared transactions are disabled" msgstr "ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì´ ë¹„í™œì„±í™”ë¨" -#: access/transam/twophase.c:389 +#: access/transam/twophase.c:376 #, c-format -msgid "Set max_prepared_transactions to a nonzero value." -msgstr "max_prepared_transactions ì„¤ì •ê°’ì„ 0ì´ ì•„ë‹Œ 값으로 설정하십시오." +msgid "Set \"max_prepared_transactions\" to a nonzero value." +msgstr "\"max_prepared_transactions\" ì„¤ì •ê°’ì„ 0ì´ ì•„ë‹Œ 값으로 설정하십시오." -#: access/transam/twophase.c:408 +#: access/transam/twophase.c:395 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "\"%s\" ì´ë¦„ì˜ íŠ¸ëžœìž­ì…˜ ì‹ë³„ìžê°€ ì´ë¯¸ 사용 중입니다" -#: access/transam/twophase.c:417 access/transam/twophase.c:2368 +#: access/transam/twophase.c:404 access/transam/twophase.c:2547 #, c-format msgid "maximum number of prepared transactions reached" msgstr "ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì˜ ìµœëŒ€ 개수를 ëª¨ë‘ ì‚¬ìš©í–ˆìŠµë‹ˆë‹¤" -#: access/transam/twophase.c:418 access/transam/twophase.c:2369 +#: access/transam/twophase.c:405 access/transam/twophase.c:2548 #, c-format -msgid "Increase max_prepared_transactions (currently %d)." -msgstr "max_prepared_transactions ê°’ì„ ëŠ˜ë ¤ì£¼ì„¸ìš” (현재 %d)." +msgid "Increase \"max_prepared_transactions\" (currently %d)." +msgstr "\"max_prepared_transactions\" ê°’ì„ ëŠ˜ë ¤ì£¼ì„¸ìš” (현재 %d)." -#: access/transam/twophase.c:586 +#: access/transam/twophase.c:580 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "\"%s\" ì´ë¦„ì˜ ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ ì‹ë³„ìžê°€ 여러 ê³³ì—서 ì“°ì´ê³  있습니다" -#: access/transam/twophase.c:592 +#: access/transam/twophase.c:586 #, c-format msgid "permission denied to finish prepared transaction" msgstr "ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ ë내기 작업 권한 ì—†ìŒ" -#: access/transam/twophase.c:593 +#: access/transam/twophase.c:587 #, c-format msgid "Must be superuser or the user that prepared the transaction." -msgstr "해당 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì˜ ì†Œìœ ì£¼ì´ê±°ë‚˜ superuser여야합니다" +msgstr "해당 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì˜ ì†Œìœ ì£¼ì´ê±°ë‚˜ superuser여야 합니다" -#: access/transam/twophase.c:604 +#: access/transam/twophase.c:598 #, c-format msgid "prepared transaction belongs to another database" msgstr "ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì´ ë‹¤ë¥¸ ë°ì´í„°ë² ì´ìŠ¤ì— ì†í•´ 있ìŒ" -#: access/transam/twophase.c:605 +#: access/transam/twophase.c:599 #, c-format msgid "" "Connect to the database where the transaction was prepared to finish it." msgstr "ìž‘ì—…ì„ ë§ˆì¹˜ë ¤ë©´ ê·¸ ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì´ ìžˆëŠ” ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í•˜ì‹­ì‹œì˜¤." -#: access/transam/twophase.c:620 +#: access/transam/twophase.c:614 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì´ ì—†ìŠµë‹ˆë‹¤" -#: access/transam/twophase.c:1098 +#: access/transam/twophase.c:1190 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "2단계 ìƒíƒœ íŒŒì¼ ìµœëŒ€ 길ì´ë¥¼ 초과함" -#: access/transam/twophase.c:1252 +#: access/transam/twophase.c:1345 #, c-format -msgid "incorrect size of file \"%s\": %zu byte" -msgid_plural "incorrect size of file \"%s\": %zu bytes" -msgstr[0] "\"%s\" íŒŒì¼ í¬ê¸°ê°€ ì´ìƒí•¨: %zu ë°”ì´íЏ" +msgid "incorrect size of file \"%s\": %lld byte" +msgid_plural "incorrect size of file \"%s\": %lld bytes" +msgstr[0] "\"%s\" íŒŒì¼ í¬ê¸°ê°€ ì´ìƒí•¨: %lld ë°”ì´íЏ" -#: access/transam/twophase.c:1261 +#: access/transam/twophase.c:1354 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "\"%s\" 파ì¼ì˜ CRC ê°’ 맞춤 실패" -#: access/transam/twophase.c:1294 +#: access/transam/twophase.c:1372 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %lld" + +#: access/transam/twophase.c:1387 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "\"%s\" 파ì¼ì— ìž˜ëª»ëœ ë§¤ì§ ë²ˆí˜¸ê°€ 저장ë˜ì–´ 있ìŒ" -#: access/transam/twophase.c:1300 +#: access/transam/twophase.c:1393 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "\"%s\" íŒŒì¼ í¬ê¸°ê°€ ì´ìƒí•¨" -#: access/transam/twophase.c:1312 +#: access/transam/twophase.c:1405 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "ê³„ì‚°ëœ CRC ì²´í¬ì„¬ ê°’ì´ íŒŒì¼ì— \"%s\" 파ì¼ì— ì €ìž¥ëœ ê°’ê³¼ 다름" -#: access/transam/twophase.c:1342 access/transam/xlog.c:6494 +#: access/transam/twophase.c:1435 access/transam/xlogrecovery.c:565 +#: postmaster/walsummarizer.c:936 replication/logical/logical.c:211 +#: replication/walsender.c:836 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "WAL ì½ê¸° 프로세서를 할당하는 ì¤‘ì— ì˜¤ë¥˜ ë°œìƒ" -#: access/transam/twophase.c:1349 +#: access/transam/twophase.c:1445 +#, c-format +msgid "could not read two-phase state from WAL at %X/%X: %s" +msgstr "two-phase ìƒíƒœì •ë³´ì„ ì½ì„ 수 ì—†ìŒ WAL 위치: %X/%X, %s" + +#: access/transam/twophase.c:1450 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "two-phase ìƒíƒœì •ë³´ì„ ì½ì„ 수 ì—†ìŒ WAL 위치: %X/%X" -#: access/transam/twophase.c:1357 +#: access/transam/twophase.c:1458 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "WAL %X/%X ìœ„ì¹˜ì— 2단계 커밋 ìƒíƒœ ìžë£Œê°€ 없습니다" -#: access/transam/twophase.c:1637 +#: access/transam/twophase.c:1761 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ 다시 만들 수 ì—†ìŒ: %m" -#: access/transam/twophase.c:1764 +#: access/transam/twophase.c:1888 #, c-format msgid "" "%u two-phase state file was written for a long-running prepared transaction" @@ -2000,288 +2435,311 @@ msgid_plural "" msgstr[0] "" "긴 실행 미리 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ ìš© %u ê°œì˜ 2단계 ìƒíƒœ 파ì¼ì´ 저장ë˜ì—ˆìŒ" -#: access/transam/twophase.c:1998 +#: access/transam/twophase.c:2123 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "공유 메모리ì—서 %u ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì„ ë³µêµ¬í•¨" -#: access/transam/twophase.c:2089 +#: access/transam/twophase.c:2216 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "%u 트랜잭션ì—서 사용하는 ì˜¤ëž˜ëœ two-phase ìƒíƒœì •ë³´ 파ì¼ì„ 삭제함" -#: access/transam/twophase.c:2096 +#: access/transam/twophase.c:2223 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "" "%u 트랜잭션ì—서 사용하는 ì˜¤ëž˜ëœ two-phase ìƒíƒœì •보를 공유 메모리ì—서 삭제함" -#: access/transam/twophase.c:2109 +#: access/transam/twophase.c:2236 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "%u 트랜잭션ì—서 사용하는 future two-phase ìƒíƒœì •ë³´ 파ì¼ì„ 삭제함" -#: access/transam/twophase.c:2116 +#: access/transam/twophase.c:2243 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "%u 트랜잭션ì—서 사용하는 future two-phase ìƒíƒœì •보를 메모리ì—서 삭제함" -#: access/transam/twophase.c:2141 +#: access/transam/twophase.c:2268 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "%u 트랜잭션ì—서 사용하는 two-phase ìƒíƒœì •ë³´ 파ì¼ì´ ì†ìƒë˜ì—ˆìŒ" -#: access/transam/twophase.c:2146 +#: access/transam/twophase.c:2273 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "%u 트랜잭션ì—서 사용하는 ë©”ëª¨ë¦¬ì— ìžˆëŠ” two-phase ìƒíƒœì •ë³´ê°€ ì†ìƒë˜ì—ˆìŒ" -#: access/transam/varsup.c:127 +#: access/transam/twophase.c:2530 +#, c-format +msgid "could not recover two-phase state file for transaction %u" +msgstr "%u 트랜잭션ì—서 사용하는 two-phase ìƒíƒœì •ë³´ 파ì¼ì„ 복구할 ì—†ìŒ" + +#: access/transam/twophase.c:2532 #, c-format msgid "" -"database is not accepting commands to avoid wraparound data loss in database " -"\"%s\"" +"Two-phase state file has been found in WAL record %X/%X, but this " +"transaction has already been restored from disk." msgstr "" -"\"%s\" ë°ì´í„°ë² ì´ìФ 트랜잭션 ID ê²¹ì¹¨ì— ì˜í•œ ìžë£Œ ì†ì‹¤ì„ 방지하기 위해 ë” ì´" -"ìƒ ìžë£Œ ì¡°ìž‘ ìž‘ì—…ì„ í—ˆìš©í•˜ì§€ 않습니다" +"WAL 레코드 %X/%X ì—서 2PC ìƒíƒœ 파ì¼ì„ 찾았지만, ê·¸ íŠ¸ëžœìž­ì…˜ì€ ì´ë¯¸ 디스í¬ì— " +"기ë¡í•œ ìƒíƒœìž…니다." + +#: access/transam/twophase.c:2540 storage/file/fd.c:514 utils/fmgr/dfmgr.c:209 +#, c-format +msgid "could not access file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì— 액세스할 수 ì—†ìŒ: %m" -#: access/transam/varsup.c:129 access/transam/varsup.c:136 +#: access/transam/varsup.c:156 #, c-format msgid "" -"Stop the postmaster and vacuum that database in single-user mode.\n" -"You might also need to commit or roll back old prepared transactions, or " -"drop stale replication slots." +"database is not accepting commands that assign new transaction IDs to avoid " +"wraparound data loss in database \"%s\"" msgstr "" -"postmaster를 중지하고 ë‹¨ì¼ ì‚¬ìš©ìž ëª¨ë“œë¡œ 서버를 실행한 ë’¤ VACUUM ìž‘ì—…ì„ í•˜ì‹­" -"시오.\n" -"ë˜í•œ ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ì„ ì»¤ë°‹ ë˜ëŠ” 롤백하거나, 잠긴 복제 ìŠ¬ë¡¯ì„ ì§€ìš¸ 필요가 있" -"습니다." +"\"%s\" ë°ì´í„°ë² ì´ìФ ìžë£Œ ì†ì‹¤ì„ 막기 위해 새로운 트랜잭션 ID 만드는 ìž‘ì—…ì„ " +"ë” ì´ìƒ í•  수 없습니다." -#: access/transam/varsup.c:134 +#: access/transam/varsup.c:163 #, c-format msgid "" -"database is not accepting commands to avoid wraparound data loss in database " -"with OID %u" +"database is not accepting commands that assign new transaction IDs to avoid " +"wraparound data loss in database with OID %u" msgstr "" -"%u OID ë°ì´í„°ë² ì´ìФì—서 ìžë£Œ 겹침으로 ë°œìƒí•  수 있는 ìžë£Œ ì†ì‹¤ì„ 방지하기 위" -"í•´ ëª…ë ¹ì„ ìˆ˜ë½í•˜ì§€ 않ìŒ" +"%u OID ë°ì´í„°ë² ì´ìФ ìžë£Œ ì†ì‹¤ì„ 막기 위해 새로운 트랜잭션 ID 만드는 ìž‘ì—…ì„ " +"ë” ì´ìƒ í•  수 없습니다." -#: access/transam/varsup.c:146 access/transam/varsup.c:444 +#: access/transam/varsup.c:175 access/transam/varsup.c:490 #, c-format msgid "database \"%s\" must be vacuumed within %u transactions" msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ëŠ” %uë²ˆì˜ íŠ¸ëžœìž­ì…˜ì´ ë°œìƒë˜ê¸° ì „ì— ì²­ì†Œí•´ì•¼ 합니다" -#: access/transam/varsup.c:153 access/transam/varsup.c:451 +#: access/transam/varsup.c:178 +#, c-format +msgid "" +"To avoid transaction ID assignment failures, execute a database-wide VACUUM " +"in that database.\n" +"You might also need to commit or roll back old prepared transactions, or " +"drop stale replication slots." +msgstr "" +"트랜잭션 ID를 ê³„ì† í• ë‹¹í•  수 있게 하려면 ë°ì´í„°ë² ì´ìФ ìˆ˜ì¤€ì˜ VACUUMì„ ì‹¤í–‰í•˜" +"십시오.\n" +"ë˜í•œ ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ì„ ì»¤ë°‹ ë˜ëŠ” 롤백 하거나, 잠긴 복제 ìŠ¬ë¡¯ì„ ì§€ìš¸ 필요가 있" +"습니다." + +#: access/transam/varsup.c:182 access/transam/varsup.c:497 #, c-format msgid "database with OID %u must be vacuumed within %u transactions" msgstr "%u OID ë°ì´í„°ë² ì´ìŠ¤ëŠ” %uë²ˆì˜ íŠ¸ëžœìž­ì…˜ì´ ë°œìƒë˜ê¸° ì „ì— ì²­ì†Œí•´ì•¼ 합니다" -#: access/transam/varsup.c:409 +#: access/transam/varsup.c:185 access/transam/varsup.c:493 +#: access/transam/varsup.c:500 +#, c-format +msgid "" +"To avoid XID assignment failures, execute a database-wide VACUUM in that " +"database.\n" +"You might also need to commit or roll back old prepared transactions, or " +"drop stale replication slots." +msgstr "" +"XID 할당 실패를 피하려면 ë°ì´í„°ë² ì´ìФ ìˆ˜ì¤€ì˜ VACUUMì„ ì‹¤í–‰í•˜ì‹­ì‹œì˜¤.\n" +"ë˜í•œ ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ì„ ì»¤ë°‹ ë˜ëŠ” 롤백 하거나, 잠긴 복제 ìŠ¬ë¡¯ì„ ì§€ìš¸ 필요가 있" +"습니다." + +#: access/transam/xact.c:649 +#, c-format +msgid "cannot assign transaction IDs during a parallel operation" +msgstr "병렬 처리 중ì—는 트랜잭션 ID를 지정할 수 ì—†ìŒ" + +#: access/transam/xact.c:840 #, c-format -msgid "transaction ID wrap limit is %u, limited by database with OID %u" -msgstr "트랜잭션 ID 겹침 ì œí•œì€ %u번 입니다., %u OID ë°ì´í„°ë² ì´ìФì—서 제한ë¨" +msgid "cannot modify data in a parallel worker" +msgstr "병렬 작업ìžëŠ” ìžë£Œ ë³€ê²½ì„ í•  수 ì—†ìŒ" -#: access/transam/xact.c:1030 +#: access/transam/xact.c:1115 +#, c-format +msgid "cannot start commands during a parallel operation" +msgstr "병렬 처리 중ì—는 ëª…ë ¹ì„ ì‹œìž‘í•  수 ì—†ìŒ" + +#: access/transam/xact.c:1123 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "í•˜ë‚˜ì˜ íŠ¸ëžœìž­ì…˜ 안ì—서는 2^32-2 ê°œì˜ ëª…ë ¹ì„ ì´ˆê³¼í•  수 ì—†ìŒ" -#: access/transam/xact.c:1555 +#: access/transam/xact.c:1664 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "ì»¤ë°‹ëœ í•˜ìœ„ 트랜잭션 수(%d)ê°€ 최대치를 초과함" -#: access/transam/xact.c:2395 +#: access/transam/xact.c:2561 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "임시 개체 대해 ì‹¤í–‰ëœ íŠ¸ëžœìž­ì…˜ì„ PREPAREí•  수 ì—†ìŒ" -#: access/transam/xact.c:2405 +#: access/transam/xact.c:2571 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "스냅샷으로 내보낸 íŠ¸ëžœìž­ì…˜ì€ PREPARE ìž‘ì—…ì„ í•  수 ì—†ìŒ" -#: access/transam/xact.c:2414 -#, c-format -msgid "" -"cannot PREPARE a transaction that has manipulated logical replication workers" -msgstr "논리 복제 작업ìžë¥¼ 사용하는 íŠ¸ëžœìž­ì…˜ì€ PREPARE í•  수 ì—†ìŒ" - #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3359 +#: access/transam/xact.c:3593 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s ëª…ë ¹ì€ íŠ¸ëžœìž­ì…˜ 블럭안ì—서 실행할 수 ì—†ìŒ" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3369 +#: access/transam/xact.c:3603 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s ëª…ë ¹ì€ ì„œë¸ŒíŠ¸ëžœìž­ì…˜ 블럭안ì—서 실행할 수 ì—†ìŒ" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3379 +#: access/transam/xact.c:3613 +#, c-format +msgid "%s cannot be executed within a pipeline" +msgstr "%s ì ˆì€ íŒŒì´í”„ë¼ì¸ì—서 ì‹¤í–‰ë  ìˆ˜ ì—†ìŒ" + +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3623 #, c-format msgid "%s cannot be executed from a function" msgstr "%s ì ˆì€ í•¨ìˆ˜ì—서 ì‹¤í–‰ë  ìˆ˜ ì—†ìŒ" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3448 access/transam/xact.c:3754 -#: access/transam/xact.c:3833 access/transam/xact.c:3956 -#: access/transam/xact.c:4107 access/transam/xact.c:4176 -#: access/transam/xact.c:4287 +#: access/transam/xact.c:3694 access/transam/xact.c:4019 +#: access/transam/xact.c:4098 access/transam/xact.c:4221 +#: access/transam/xact.c:4372 access/transam/xact.c:4441 +#: access/transam/xact.c:4552 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s ëª…ë ¹ì€ íŠ¸ëžœìž­ì…˜ 블럭ì—서만 ì‚¬ìš©ë  ìˆ˜ 있ìŒ" -#: access/transam/xact.c:3640 +#: access/transam/xact.c:3905 #, c-format msgid "there is already a transaction in progress" msgstr "ì´ë¯¸ 트랜잭션 ìž‘ì—…ì´ ì§„í–‰ 중입니다" -#: access/transam/xact.c:3759 access/transam/xact.c:3838 -#: access/transam/xact.c:3961 +#: access/transam/xact.c:4024 access/transam/xact.c:4103 +#: access/transam/xact.c:4226 #, c-format msgid "there is no transaction in progress" msgstr "현재 트랜잭션 ìž‘ì—…ì„ í•˜ì§€ 않고 있습니다" -#: access/transam/xact.c:3849 +#: access/transam/xact.c:4114 #, c-format msgid "cannot commit during a parallel operation" msgstr "ë°ì´í„°ë² ì´ìФ íŠ¸ëžœìž­ì…˜ì„ commit í•  수 ì—†ìŒ" -#: access/transam/xact.c:3972 +#: access/transam/xact.c:4237 #, c-format msgid "cannot abort during a parallel operation" msgstr "병렬 작업 중ì—는 중지 í•  수 ì—†ìŒ" -#: access/transam/xact.c:4071 +#: access/transam/xact.c:4336 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "병렬 작업 중ì—는 savepoint ì§€ì •ì„ í•  수 ì—†ìŒ" -#: access/transam/xact.c:4158 +#: access/transam/xact.c:4423 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "병렬 작업 중ì—는 savepoint를 지울 수 ì—†ìŒ" -#: access/transam/xact.c:4168 access/transam/xact.c:4219 -#: access/transam/xact.c:4279 access/transam/xact.c:4328 +#: access/transam/xact.c:4433 access/transam/xact.c:4484 +#: access/transam/xact.c:4544 access/transam/xact.c:4593 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ì €ìž¥ìœ„ì¹˜ê°€ ì—†ìŒ" -#: access/transam/xact.c:4225 access/transam/xact.c:4334 +#: access/transam/xact.c:4490 access/transam/xact.c:4599 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "현재 저장위치 수준ì—서 \"%s\" ì´ë¦„ì˜ ì €ìž¥ìœ„ì¹˜ê°€ ì—†ìŒ" -#: access/transam/xact.c:4267 +#: access/transam/xact.c:4532 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "병렬 작업 중ì—는 savepoint 지정 취소 ìž‘ì—…ì„ í•  수 ì—†ìŒ" -#: access/transam/xact.c:4395 -#, c-format -msgid "cannot start subtransactions during a parallel operation" -msgstr "병렬 처리 중ì—는 í•˜ìœ„íŠ¸ëžœìž­ì…˜ì„ ì‹œìž‘í•  수 ì—†ìŒ" - -#: access/transam/xact.c:4463 -#, c-format -msgid "cannot commit subtransactions during a parallel operation" -msgstr "병렬 처리 중ì—는 í•˜ìœ„íŠ¸ëžœìž­ì…˜ì„ ì»¤ë°‹í•  수 ì—†ìŒ" - -#: access/transam/xact.c:5103 +#: access/transam/xact.c:5376 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "í•˜ë‚˜ì˜ íŠ¸ëžœìž­ì…˜ 안ì—서는 2^32-1 ê°œì˜ í•˜ìœ„íŠ¸ëžœìž­ì…˜ì„ ì´ˆê³¼í•  수 ì—†ìŒ" -#: access/transam/xlog.c:2554 +#: access/transam/xlog.c:1542 +#, c-format +msgid "" +"request to flush past end of generated WAL; request %X/%X, current position " +"%X/%X" +msgstr "ìƒì„±ëœ WALì˜ ëì„ ì§€ë‚œ flush 요청, 요청위치: %X/%X, 현재위치: %X/%X" + +#: access/transam/xlog.c:1769 #, c-format -msgid "could not write to log file %s at offset %u, length %zu: %m" -msgstr "%s 로그 íŒŒì¼ ì“°ê¸° 실패, 위치 %u, ê¸¸ì´ %zu: %m" +msgid "" +"cannot read past end of generated WAL: requested %X/%X, current position %X/" +"%X" +msgstr "" +"ìƒì„±ëœ WALì˜ ëì„ ì§€ë‚˜ì„œ ì½ì„ 수 ì—†ìŒ: 요청위치: %X/%X, 현재위치: %X/%X" -#: access/transam/xlog.c:2830 +#: access/transam/xlog.c:2210 access/transam/xlog.c:4501 #, c-format -msgid "updated min recovery point to %X/%X on timeline %u" -msgstr "최소 복구 ì§€ì : %X/%X, 타임ë¼ì¸: %u 변경 완료" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL ì¡°ê° íŒŒì¼ì€ 1MB부터 1GB ì‚¬ì´ 2^n í¬ê¸°ì—¬ì•¼ 합니다." -#: access/transam/xlog.c:3944 access/transam/xlogutils.c:802 -#: replication/walsender.c:2510 +#: access/transam/xlog.c:2228 #, c-format -msgid "requested WAL segment %s has already been removed" -msgstr "요청한 %s WAL ì¡°ê° íŒŒì¼ì€ ì´ë¯¸ 지워졌ìŒ" +msgid "\"%s\" must be set to -1 during binary upgrade mode." +msgstr "ë°”ì´ë„ˆë¦¬ 업그레ì´ë“œ 모드 중는 \"%s\" ê°’ì€ -1ì´ì–´ì•¼ 합니다." -#: access/transam/xlog.c:4187 +#: access/transam/xlog.c:2477 #, c-format -msgid "recycled write-ahead log file \"%s\"" -msgstr "\"%s\" 트랜잭션 로그 íŒŒì¼ ìž¬í™œìš©í•¨" +msgid "could not write to log file \"%s\" at offset %u, length %zu: %m" +msgstr "\"%s\" 로그 íŒŒì¼ ì“°ê¸° 실패, 위치 %u, ê¸¸ì´ %zu: %m" -#: access/transam/xlog.c:4199 +#: access/transam/xlog.c:3739 access/transam/xlogutils.c:831 +#: replication/walsender.c:3045 #, c-format -msgid "removing write-ahead log file \"%s\"" -msgstr "\"%s\" 트랜잭션 로그 íŒŒì¼ ì‚­ì œ 중" +msgid "requested WAL segment %s has already been removed" +msgstr "요청한 %s WAL ì¡°ê° íŒŒì¼ì€ ì´ë¯¸ 지워졌ìŒ" -#: access/transam/xlog.c:4219 +#: access/transam/xlog.c:4061 #, c-format msgid "could not rename file \"%s\": %m" msgstr "\"%s\" 파ì¼ì˜ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" -#: access/transam/xlog.c:4261 access/transam/xlog.c:4271 +#: access/transam/xlog.c:4104 access/transam/xlog.c:4115 +#: access/transam/xlog.c:4136 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "필요한 WAL 디렉터리 \"%s\"ì´(ê°€) ì—†ìŒ" -#: access/transam/xlog.c:4277 +#: access/transam/xlog.c:4121 access/transam/xlog.c:4142 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "누ë½ëœ WAL 디렉터리 \"%s\"ì„(를) 만드는 중" -#: access/transam/xlog.c:4280 +#: access/transam/xlog.c:4125 access/transam/xlog.c:4145 +#: commands/dbcommands.c:3262 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "누ë½ëœ \"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m" -#: access/transam/xlog.c:4383 -#, c-format -msgid "unexpected timeline ID %u in log segment %s, offset %u" -msgstr "예ìƒì¹˜ 못한 타임ë¼ì¸ ID %u, 로그 ì¡°ê°: %s, 위치: %u" - -#: access/transam/xlog.c:4521 -#, c-format -msgid "new timeline %u is not a child of database system timeline %u" -msgstr "요청한 %u 타임ë¼ì¸ì€ %u ë°ì´í„°ë² ì´ìФ 시스템 타임ë¼ì¸ì˜ 하위가 아님" - -#: access/transam/xlog.c:4535 -#, c-format -msgid "" -"new timeline %u forked off current database system timeline %u before " -"current recovery point %X/%X" -msgstr "" - -#: access/transam/xlog.c:4554 -#, c-format -msgid "new target timeline is %u" -msgstr "새 ëŒ€ìƒ íƒ€ìž„ë¼ì¸: %u" - -#: access/transam/xlog.c:4590 +#: access/transam/xlog.c:4212 #, c-format msgid "could not generate secret authorization token" msgstr "비밀 ì¸ì¦ 토í°ì„ 만들 수 ì—†ìŒ" -#: access/transam/xlog.c:4749 access/transam/xlog.c:4758 -#: access/transam/xlog.c:4782 access/transam/xlog.c:4789 -#: access/transam/xlog.c:4796 access/transam/xlog.c:4801 -#: access/transam/xlog.c:4808 access/transam/xlog.c:4815 -#: access/transam/xlog.c:4822 access/transam/xlog.c:4829 -#: access/transam/xlog.c:4836 access/transam/xlog.c:4843 -#: access/transam/xlog.c:4852 access/transam/xlog.c:4859 -#: utils/init/miscinit.c:1548 +#: access/transam/xlog.c:4363 access/transam/xlog.c:4373 +#: access/transam/xlog.c:4399 access/transam/xlog.c:4407 +#: access/transam/xlog.c:4415 access/transam/xlog.c:4421 +#: access/transam/xlog.c:4429 access/transam/xlog.c:4437 +#: access/transam/xlog.c:4445 access/transam/xlog.c:4453 +#: access/transam/xlog.c:4461 access/transam/xlog.c:4469 +#: access/transam/xlog.c:4479 access/transam/xlog.c:4487 +#: utils/init/miscinit.c:1812 #, c-format msgid "database files are incompatible with server" msgstr "ë°ì´í„°ë² ì´ìФ 파ì¼ë“¤ì´ 서버와 í˜¸í™˜ì„±ì´ ì—†ìŠµë‹ˆë‹¤" -#: access/transam/xlog.c:4750 +#: access/transam/xlog.c:4364 #, c-format msgid "" "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), " @@ -2290,7 +2748,7 @@ msgstr "" "ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” PG_CONTROL_VERSION %d (0x%08x)(으)로 초기화ë˜ì—ˆì§€ë§Œ " "서버는 PG_CONTROL_VERSION %d (0x%08x)(으)로 컴파ì¼ë˜ì—ˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:4754 +#: access/transam/xlog.c:4368 #, c-format msgid "" "This could be a problem of mismatched byte ordering. It looks like you need " @@ -2298,7 +2756,7 @@ msgid "" msgstr "" "ì´ê²ƒì€ ë°”ì´íЏ 순서 불ì¼ì¹˜ ë¬¸ì œì¼ ìˆ˜ 있습니다. initdb ìž‘ì—…ì´ í•„ìš”í•´ 보입니다." -#: access/transam/xlog.c:4759 +#: access/transam/xlog.c:4374 #, c-format msgid "" "The database cluster was initialized with PG_CONTROL_VERSION %d, but the " @@ -2307,18 +2765,18 @@ msgstr "" "ì´ ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” PG_CONTROL_VERSION %d 버전으로 초기화 ë˜ì—ˆì§€ë§Œ, 서" "버는 PG_CONTROL_VERSION %d 버전으로 ì»´íŒŒì¼ ë˜ì–´ìžˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:4762 access/transam/xlog.c:4786 -#: access/transam/xlog.c:4793 access/transam/xlog.c:4798 +#: access/transam/xlog.c:4377 access/transam/xlog.c:4403 +#: access/transam/xlog.c:4411 access/transam/xlog.c:4417 #, c-format msgid "It looks like you need to initdb." msgstr "initdb ëª…ë ¹ì´ í•„ìš”í•œ 듯 합니다" -#: access/transam/xlog.c:4773 +#: access/transam/xlog.c:4389 #, c-format msgid "incorrect checksum in control file" msgstr "컨트롤 파ì¼ì— ìž˜ëª»ëœ ì²´í¬ì„¬ ê°’ì´ ìžˆìŠµë‹ˆë‹¤" -#: access/transam/xlog.c:4783 +#: access/transam/xlog.c:4400 #, c-format msgid "" "The database cluster was initialized with CATALOG_VERSION_NO %d, but the " @@ -2327,7 +2785,7 @@ msgstr "" "ì´ ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” CATALOG_VERSION_NO %d 버전으로 초기화 ë˜ì—ˆì§€ë§Œ, 서" "버는 CATALOG_VERSION_NO %d 버전으로 ì»´íŒŒì¼ ë˜ì–´ìžˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:4790 +#: access/transam/xlog.c:4408 #, c-format msgid "" "The database cluster was initialized with MAXALIGN %d, but the server was " @@ -2336,7 +2794,7 @@ msgstr "" "ì´ ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” MAXALIGN %d (으)로 초기화 ë˜ì—ˆì§€ë§Œ, 서버는 " "MAXALIGN %d (으)로 ì»´íŒŒì¼ ë˜ì–´ìžˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:4797 +#: access/transam/xlog.c:4416 #, c-format msgid "" "The database cluster appears to use a different floating-point number format " @@ -2345,7 +2803,7 @@ msgstr "" "ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ì™€ 서버 실행 파ì¼ì´ 서로 다른 ë¶€ë™ ì†Œìˆ˜ì  ìˆ«ìž í˜•ì‹ì„ 사" "용하고 있습니다." -#: access/transam/xlog.c:4802 +#: access/transam/xlog.c:4422 #, c-format msgid "" "The database cluster was initialized with BLCKSZ %d, but the server was " @@ -2354,18 +2812,18 @@ msgstr "" "ì´ ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” BLCKSZ %d (으)로 초기화 ë˜ì—ˆì§€ë§Œ, 서버는 BLCKSZ " "%d (으)로 ì»´íŒŒì¼ ë˜ì–´ìžˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:4805 access/transam/xlog.c:4812 -#: access/transam/xlog.c:4819 access/transam/xlog.c:4826 -#: access/transam/xlog.c:4833 access/transam/xlog.c:4840 -#: access/transam/xlog.c:4847 access/transam/xlog.c:4855 -#: access/transam/xlog.c:4862 +#: access/transam/xlog.c:4425 access/transam/xlog.c:4433 +#: access/transam/xlog.c:4441 access/transam/xlog.c:4449 +#: access/transam/xlog.c:4457 access/transam/xlog.c:4465 +#: access/transam/xlog.c:4473 access/transam/xlog.c:4482 +#: access/transam/xlog.c:4490 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "" "서버를 새로 ì»´íŒŒì¼ í•˜ê±°ë‚˜ initdb ëª…ë ¹ì„ ì‚¬ìš©í•´ 새로 ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ë¥¼ " "다시 만들거나 해야할 것 같습니다." -#: access/transam/xlog.c:4809 +#: access/transam/xlog.c:4430 #, c-format msgid "" "The database cluster was initialized with RELSEG_SIZE %d, but the server was " @@ -2374,7 +2832,7 @@ msgstr "" "ì´ ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” RELSEG_SIZE %d (으)로 초기화 ë˜ì—ˆì§€ë§Œ, 서버는 " "RELSEG_SIZE %d (으)로 ì»´íŒŒì¼ ë˜ì–´ìžˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:4816 +#: access/transam/xlog.c:4438 #, c-format msgid "" "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was " @@ -2383,7 +2841,7 @@ msgstr "" "ì´ ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” XLOG_BLCKSZ %d (으)로 초기화 ë˜ì—ˆì§€ë§Œ, 서버는 " "XLOG_BLCKSZ %d (으)로 ì»´íŒŒì¼ ë˜ì–´ìžˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:4823 +#: access/transam/xlog.c:4446 #, c-format msgid "" "The database cluster was initialized with NAMEDATALEN %d, but the server was " @@ -2392,7 +2850,7 @@ msgstr "" "ì´ ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” NAMEDATALEN %d (으)로 초기화 ë˜ì—ˆì§€ë§Œ, 서버는 " "NAMEDATALEN %d (으)로 ì»´íŒŒì¼ ë˜ì–´ìžˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:4830 +#: access/transam/xlog.c:4454 #, c-format msgid "" "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server " @@ -2401,7 +2859,7 @@ msgstr "" "ì´ ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” INDEX_MAX_KEYS %d (으)로 초기화 ë˜ì—ˆì§€ë§Œ, 서버는 " "INDEX_MAX_KEYS %d (으)로 ì»´íŒŒì¼ ë˜ì–´ìžˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:4837 +#: access/transam/xlog.c:4462 #, c-format msgid "" "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the " @@ -2410,7 +2868,7 @@ msgstr "" "ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” TOAST_MAX_CHUNK_SIZE %d(으)로 초기화ë˜ì—ˆì§€ë§Œ 서버는 " "TOAST_MAX_CHUNK_SIZE %d(으)로 ì»´íŒŒì¼ ë˜ì—ˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:4844 +#: access/transam/xlog.c:4470 #, c-format msgid "" "The database cluster was initialized with LOBLKSIZE %d, but the server was " @@ -2419,7 +2877,7 @@ msgstr "" "ì´ ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” LOBLKSIZE %d(으)로 초기화 ë˜ì—ˆì§€ë§Œ, 서버는 " "LOBLKSIZE %d (으)로 ì»´íŒŒì¼ ë˜ì–´ìžˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:4853 +#: access/transam/xlog.c:4480 #, c-format msgid "" "The database cluster was initialized without USE_FLOAT8_BYVAL but the server " @@ -2428,7 +2886,7 @@ msgstr "" "ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” USE_FLOAT8_BYVAL ì—†ì´ ì´ˆê¸°í™”ë˜ì—ˆì§€ë§Œ, 서버는 " "USE_FLOAT8_BYVALì„ ì‚¬ìš©í•˜ì—¬ 컴파ì¼ë˜ì—ˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:4860 +#: access/transam/xlog.c:4488 #, c-format msgid "" "The database cluster was initialized with USE_FLOAT8_BYVAL but the server " @@ -2437,215 +2895,100 @@ msgstr "" "ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” USE_FLOAT8_BYVALì„ ì‚¬ìš©í•˜ì—¬ 초기화ë˜ì—ˆì§€ë§Œ, 서버는 " "USE_FLOAT8_BYVAL ì—†ì´ ì»´íŒŒì¼ë˜ì—ˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:4869 +#: access/transam/xlog.c:4497 #, c-format -msgid "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the " -"control file specifies %d byte" -msgid_plural "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the " -"control file specifies %d bytes" -msgstr[0] "" -"WAL ì¡°ê° íŒŒì¼ì€ 1MB부터 1GB ì‚¬ì´ 2^n í¬ê¸°ì—¬ì•¼ 하지만, 컨트롤 파ì¼ì—는 %d ë°”ì´" -"트로 지정ë˜ì—ˆìŒ" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "컨트롤 íŒŒì¼ ì•ˆ ìž˜ëª»ëœ WAL ì¡°ê° í¬ê¸° (%d ë°”ì´íЏ)" -#: access/transam/xlog.c:4881 +#: access/transam/xlog.c:4510 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"min_wal_size\" ê°’ì€ \"wal_segment_size\" ê°’ì˜ ìµœì†Œ 2ë°° ì´ìƒì´ì–´ì•¼ 함" -#: access/transam/xlog.c:4885 +#: access/transam/xlog.c:4514 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"max_wal_size\" ê°’ì€ \"wal_segment_size\" ê°’ì˜ ìµœì†Œ 2ë°° ì´ìƒì´ì–´ì•¼ 함" -#: access/transam/xlog.c:5318 +#: access/transam/xlog.c:4662 catalog/namespace.c:4696 +#: commands/tablespace.c:1210 commands/user.c:2529 commands/variable.c:72 +#: replication/slot.c:2429 tcop/postgres.c:3715 utils/error/elog.c:2247 +#, c-format +msgid "List syntax is invalid." +msgstr "ëª©ë¡ ë¬¸ë²•ì´ í‹€ë ¸ìŠµë‹ˆë‹¤." + +#: access/transam/xlog.c:4708 commands/user.c:2545 commands/variable.c:173 +#: tcop/postgres.c:3731 utils/error/elog.c:2273 +#, c-format +msgid "Unrecognized key word: \"%s\"." +msgstr "알 수 없는 키워드: \"%s\"" + +#: access/transam/xlog.c:5129 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "bootstrap 트랜잭션 로그 파ì¼ì„ 쓸 수 ì—†ìŒ: %m" -#: access/transam/xlog.c:5326 +#: access/transam/xlog.c:5137 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "bootstrap 트랜잭션 로그 파ì¼ì„ fsyncí•  수 ì—†ìŒ: %m" -#: access/transam/xlog.c:5332 +#: access/transam/xlog.c:5143 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "bootstrap 트랜잭션 로그 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: access/transam/xlog.c:5393 -#, c-format -msgid "using recovery command file \"%s\" is not supported" -msgstr "\"%s\" 복구 명령 파ì¼ì„ 사용하는 ê²ƒì„ ì§€ì›í•˜ì§€ 않습니다" - -#: access/transam/xlog.c:5458 -#, c-format -msgid "standby mode is not supported by single-user servers" -msgstr "ë‹¨ì¼ ì‚¬ìš©ìž ì„œë²„ë¥¼ 대ìƒìœ¼ë¡œ 대기 모드를 사용할 수 없습니다." - -#: access/transam/xlog.c:5475 -#, c-format -msgid "specified neither primary_conninfo nor restore_command" -msgstr "primary_conninfo 설정ë„, restore_command ì„¤ì •ë„ ì—†ìŒ" - -#: access/transam/xlog.c:5476 -#, c-format -msgid "" -"The database server will regularly poll the pg_wal subdirectory to check for " -"files placed there." -msgstr "" -"ë°ì´í„°ë² ì´ìФ 서버는 ì¼ë°˜ì ìœ¼ë¡œ 주 서버ì—서 ë°œìƒí•œ 트랜잭션 로그를 ë°˜ì˜í•˜ê¸° 위" -"í•´ pg_wal 하위 디렉터리를 조사할 것입니다." - -#: access/transam/xlog.c:5484 -#, c-format -msgid "must specify restore_command when standby mode is not enabled" -msgstr "" -"대기 모드를 활성화 하지 않았다면(standby_mode = off), restore_command ì„¤ì •ì€ " -"반드시 있어야 함" - -#: access/transam/xlog.c:5522 -#, c-format -msgid "recovery target timeline %u does not exist" -msgstr "%u 복구 ëŒ€ìƒ íƒ€ìž„ë¼ì¸ì´ ì—†ìŒ" - -#: access/transam/xlog.c:5644 -#, c-format -msgid "archive recovery complete" -msgstr "ì•„ì¹´ì´ë¸Œ 복구 완료" - -#: access/transam/xlog.c:5710 access/transam/xlog.c:5983 -#, c-format -msgid "recovery stopping after reaching consistency" -msgstr "ì¼ê´€ì„±ì„ 다 맞추어 복구 ìž‘ì—…ì„ ì¤‘ì§€í•©ë‹ˆë‹¤." - -#: access/transam/xlog.c:5731 -#, c-format -msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" -msgstr "복구 중지 위치(LSN): \"%X/%X\" ì´ì „" - -#: access/transam/xlog.c:5817 -#, c-format -msgid "recovery stopping before commit of transaction %u, time %s" -msgstr "%u 트랜잭션 커밋 ì „ 복구 중지함, 시간 %s" - -#: access/transam/xlog.c:5824 -#, c-format -msgid "recovery stopping before abort of transaction %u, time %s" -msgstr "%u 트랜잭션 중단 ì „ 복구 중지함, 시간 %s" - -#: access/transam/xlog.c:5877 -#, c-format -msgid "recovery stopping at restore point \"%s\", time %s" -msgstr "복구 중지함, 복구 위치 \"%s\", 시간 %s" - -#: access/transam/xlog.c:5895 -#, c-format -msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" -msgstr "복구 중지 위치(LSN): \"%X/%X\" ì´í›„" - -#: access/transam/xlog.c:5963 -#, c-format -msgid "recovery stopping after commit of transaction %u, time %s" -msgstr "%u 트랜잭션 커밋 후 복구 중지함, 시간 %s" - -#: access/transam/xlog.c:5971 -#, c-format -msgid "recovery stopping after abort of transaction %u, time %s" -msgstr "%u 트랜잭션 중단 후 복구 중지함, 시간 %s" - -#: access/transam/xlog.c:6020 -#, c-format -msgid "pausing at the end of recovery" -msgstr "복구 ëì— ê¸°ë‹¤ë¦¬ëŠ” 중" - -#: access/transam/xlog.c:6021 -#, c-format -msgid "Execute pg_wal_replay_resume() to promote." -msgstr "ìš´ì˜ ì„œë²„ë¡œ 바꾸려면, pg_wal_replay_resume() 함수를 호출하세요." - -#: access/transam/xlog.c:6024 -#, c-format -msgid "recovery has paused" -msgstr "복구 ìž‘ì—…ì´ ì¼ì‹œ 중지 ë¨" - -#: access/transam/xlog.c:6025 -#, c-format -msgid "Execute pg_wal_replay_resume() to continue." -msgstr "ê³„ì† ì§„í–‰í•˜ë ¤ë©´, pg_wal_replay_resume() 함수를 호출하세요." - -#: access/transam/xlog.c:6242 -#, c-format -msgid "" -"hot standby is not possible because %s = %d is a lower setting than on the " -"master server (its value was %d)" -msgstr "" -"ì½ê¸° ì „ìš© 대기 서버로 ìš´ì˜ì´ 불가능합니다. 현재 %s = %d ì„¤ì •ì€ ì£¼ ì„œë²„ì˜ ì„¤ì •" -"ê°’(%d)보다 낮게 설정 ë˜ì–´ 있기 때문입니다." - -#: access/transam/xlog.c:6266 -#, c-format -msgid "WAL was generated with wal_level=minimal, data may be missing" -msgstr "" -"WAL ë‚´ìš©ì´ wal_level=minimal 설정으로 만들여졌습니다. ìžë£Œê°€ ì†ì‹¤ ë  ìˆ˜ 있습" -"니다." - -#: access/transam/xlog.c:6267 +#: access/transam/xlog.c:5368 #, c-format msgid "" -"This happens if you temporarily set wal_level=minimal without taking a new " -"base backup." +"WAL was generated with \"wal_level=minimal\", cannot continue recovering" msgstr "" -"ì´ ë¬¸ì œëŠ” 새 ë² ì´ìФ ë°±ì—…ì„ ë°›ì§€ ì•Šì€ ìƒíƒœì—서 서버가 ì¼ì‹œì ìœ¼ë¡œ " -"wal_level=minimal 설정으로 ìš´ì˜ëœ ì ì´ 있다면 ë°œìƒí•©ë‹ˆë‹¤." +"WAL ë‚´ìš©ì´ \"wal_level=minimal\" 설정으로 만들여졌습니다. 복구 ìž‘ì—…ì„ ê³„ì† " +"í•  수 ì—†ìŒ" -#: access/transam/xlog.c:6278 +#: access/transam/xlog.c:5369 #, c-format msgid "" -"hot standby is not possible because wal_level was not set to \"replica\" or " -"higher on the master server" +"This happens if you temporarily set \"wal_level=minimal\" on the server." msgstr "" -"주 서버 wal_level ì„¤ì •ì´ \"replica\" ë˜ëŠ” ê·¸ ì´ìƒ 수준으로 설정ë˜ì§€ 않아, ì½" -"기 ì „ìš© ë³´ì¡° 서버로 ìš´ì˜ë  수 ì—†ìŒ" +"ì´ ë¬¸ì œëŠ” 서버가 ì¼ì‹œì ìœ¼ë¡œ \"wal_level=minimal\" 설정으로 ìš´ì˜ëœ ì ì´ 있다" +"ë©´ ë°œìƒí•©ë‹ˆë‹¤." -#: access/transam/xlog.c:6279 +#: access/transam/xlog.c:5370 #, c-format msgid "" -"Either set wal_level to \"replica\" on the master, or turn off hot_standby " -"here." -msgstr "" -"ìš´ì˜ ì„œë²„ì˜ í™˜ê²½ 설정ì—서 wal_leve = \"replica\" 형태로 지정하든가 " -"hot_standby = off 형태로 지정하십시오." +"Use a backup taken after setting \"wal_level\" to higher than \"minimal\"." +msgstr "\"wal_level\" ê°’ì„ \"minimal\" 보다 ë†’ì€ ê²ƒìœ¼ë¡œ 설정해서 백업하세요." -#: access/transam/xlog.c:6341 +#: access/transam/xlog.c:5435 #, c-format msgid "control file contains invalid checkpoint location" msgstr "컨트롤 파ì¼ì— ìž˜ëª»ëœ ì²´í¬í¬ì¸íЏ 위치가 있습니다" -#: access/transam/xlog.c:6352 +#: access/transam/xlog.c:5446 #, c-format msgid "database system was shut down at %s" msgstr "ë°ì´í„°ë² ì´ìФ 시스템 마지막 ê°€ë™ ì¤‘ì§€ 시ê°: %s" -#: access/transam/xlog.c:6358 +#: access/transam/xlog.c:5452 #, c-format msgid "database system was shut down in recovery at %s" msgstr "복구 중 ë°ì´í„°ë² ì´ìФ 시스템 마지막 ê°€ë™ ì¤‘ì§€ 시ê°: %s" -#: access/transam/xlog.c:6364 +#: access/transam/xlog.c:5458 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "" "ë°ì´í„°ë² ì´ìФ 시스템 셧다운 ìž‘ì—…ì´ ë¹„ì •ìƒì ìœ¼ë¡œ 종료ë˜ì—ˆìŒ; 마지막 ìš´ì˜ì‹œê°„: " "%s" -#: access/transam/xlog.c:6370 +#: access/transam/xlog.c:5464 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "ë°ì´í„°ë² ì´ìФ 시스템 복구하는 ë„중 비정ìƒì ìœ¼ë¡œ ê°€ë™ ì¤‘ì§€ëœ ì‹œê°: %s" -#: access/transam/xlog.c:6372 +#: access/transam/xlog.c:5466 #, c-format msgid "" "This probably means that some data is corrupted and you will have to use the " @@ -2654,12 +2997,12 @@ msgstr "" "ì´ ì‚¬íƒœëŠ” 몇몇 ë°ì´í„°ê°€ ì†ìƒë˜ì—ˆì„ ì˜ë¯¸í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. 확ì¸í•´ ë³´ê³ , 필요하" "다면, 마지막 백업 ìžë£Œë¡œ 복구해서 사용하세요." -#: access/transam/xlog.c:6378 +#: access/transam/xlog.c:5472 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì´ ë¡œê·¸ 시간 %sì— ë³µêµ¬ ë„중 중지 ë˜ì—ˆìŒ" -#: access/transam/xlog.c:6380 +#: access/transam/xlog.c:5474 #, c-format msgid "" "If this has occurred more than once some data might be corrupted and you " @@ -2668,108 +3011,699 @@ msgstr "" "ì´ ì‚¬íƒœë¡œ 몇몇 ìžë£Œê°€ ì†ìƒë˜ì—ˆì„ ìˆ˜ë„ ìžˆëŠ”ë°, ì´ëŸ° 경우ë¼ë©´,확ì¸í•´ ë³´ê³ , í•„ìš”" "하다면, 마지막 백업 ìžë£Œë¡œ 복구해서 사용하세요." -#: access/transam/xlog.c:6386 +#: access/transam/xlog.c:5480 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì´ ë¹„ì •ìƒì ìœ¼ë¡œ 종료ë˜ì—ˆìŒ; 마지막 ìš´ì˜ì‹œê°„: %s" -#: access/transam/xlog.c:6392 +#: access/transam/xlog.c:5487 #, c-format msgid "control file contains invalid database cluster state" msgstr "컨트롤 파ì¼ì— ìž˜ëª»ëœ ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„° ìƒíƒœê°’ì´ ìžˆìŠµë‹ˆë‹¤" -#: access/transam/xlog.c:6449 +#: access/transam/xlog.c:5875 #, c-format -msgid "entering standby mode" -msgstr "대기 모드로 전환합니다" +msgid "WAL ends before end of online backup" +msgstr "온ë¼ì¸ 백업 작업 ëë‚˜ê¸°ì „ì— WAL 작업 종료ë¨" -#: access/transam/xlog.c:6452 +#: access/transam/xlog.c:5876 #, c-format -msgid "starting point-in-time recovery to XID %u" -msgstr "%u XID까지 ì‹œì  ê¸°ë°˜ 복구 ìž‘ì—…ì„ ì‹œìž‘í•©ë‹ˆë‹¤" +msgid "" +"All WAL generated while online backup was taken must be available at " +"recovery." +msgstr "" +"온ë¼ì¸ 백업 중 만들어진 WAL ì¡°ê° íŒŒì¼ì€ 복구 작업ì—서 반드시 ëª¨ë‘ ìžˆì–´ì•¼ 합니" +"다." -#: access/transam/xlog.c:6456 +#: access/transam/xlog.c:5880 #, c-format -msgid "starting point-in-time recovery to %s" -msgstr "%s 까지 ì‹œì  ë³µêµ¬ ìž‘ì—…ì„ ì‹œìž‘í•©ë‹ˆë‹¤" +msgid "WAL ends before consistent recovery point" +msgstr "WALì´ ì¼ì¹˜í•˜ëŠ” 복구 ì§€ì  ì•žì—서 종료ë¨" -#: access/transam/xlog.c:6460 +#: access/transam/xlog.c:5926 #, c-format -msgid "starting point-in-time recovery to \"%s\"" -msgstr "\"%s\" 복구 ëŒ€ìƒ ì´ë¦„까지 ì‹œì  ë³µêµ¬ ìž‘ì—…ì„ ì‹œìž‘í•©ë‹ˆë‹¤" +msgid "selected new timeline ID: %u" +msgstr "지정한 새 타임ë¼ì¸ ID: %u" -#: access/transam/xlog.c:6464 +#: access/transam/xlog.c:5959 #, c-format -msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" -msgstr "\"%X/%X\" 위치(LSN)까지 ì‹œì  ë³µêµ¬ ìž‘ì—…ì„ ì‹œìž‘í•©ë‹ˆë‹¤" +msgid "archive recovery complete" +msgstr "ì•„ì¹´ì´ë¸Œ 복구 완료" -#: access/transam/xlog.c:6469 +#: access/transam/xlog.c:6612 #, c-format -msgid "starting point-in-time recovery to earliest consistent point" -msgstr "ë™ê¸°í™” í•  수 있는 마지막 ì§€ì ê¹Œì§€ ì‹œì  ë³µêµ¬ ìž‘ì—…ì„ ì‹œìž‘í•©ë‹ˆë‹¤" +msgid "shutting down" +msgstr "서비스를 멈추고 있습니다" -#: access/transam/xlog.c:6472 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6651 #, c-format -msgid "starting archive recovery" -msgstr "ì•„ì¹´ì´ë¸Œ 복구 ìž‘ì—…ì„ ì‹œìž‘í•©ë‹ˆë‹¤" +msgid "restartpoint starting:%s%s%s%s%s%s%s%s" +msgstr "restartpoint 시작:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6531 access/transam/xlog.c:6664 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6663 #, c-format -msgid "checkpoint record is at %X/%X" -msgstr "ì²´í¬í¬ì¸íЏ 레코드 위치: %X/%X" +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "ì²´í¬í¬ì¸íЏ 시작:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6546 +#: access/transam/xlog.c:6728 #, c-format -msgid "could not find redo location referenced by checkpoint record" -msgstr "ì²´í¬í¬ì¸íЏ 기ë¡ìœ¼ë¡œ 참조하는 재실행 위치를 ì°¾ì„ ìˆ˜ ì—†ìŒ" +msgid "" +"restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d " +"removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; " +"sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, " +"estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" +msgstr "" +"restartpoint 작업완료: %dê°œ(%.1f%%) ë²„í¼ ì”€; %dê°œ WAL íŒŒì¼ ì¶”ê°€ë¨, %dê°œ 지웠" +"ìŒ, %dê°œ 재활용; 쓰기시간: %ld.%03d s, ë™ê¸°í™”시간: %ld.%03d s, 전체시간: %ld." +"%03d s; ë™ê¸°í™” íŒŒì¼ ê°œìˆ˜: %d, 최장시간: %ld.%03d s, í‰ê· ì‹œê°„: %ld.%03d s; 실" +"제작업량: %d kB, 예ìƒí•œìž‘업량: %d kB; lsn=%X/%X, redo lsn=%X/%X" -#: access/transam/xlog.c:6547 access/transam/xlog.c:6557 +#: access/transam/xlog.c:6751 #, c-format msgid "" -"If you are restoring from a backup, touch \"%s/recovery.signal\" and add " -"required recovery options.\n" -"If you are not restoring from a backup, try removing the file \"%s/" -"backup_label\".\n" -"Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if " -"restoring from a backup." +"checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d " +"removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; " +"sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, " +"estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "" +"채í¬í¬ì¸íЏ 작업완료: %dê°œ(%.1f%%) ë²„í¼ ì”€; %dê°œ WAL íŒŒì¼ ì¶”ê°€ë¨, %dê°œ 지웠" +"ìŒ, %dê°œ 재활용; 쓰기시간: %ld.%03d s, ë™ê¸°í™”시간: %ld.%03d s, 전체시간: %ld." +"%03d s; ë™ê¸°í™” íŒŒì¼ ê°œìˆ˜: %d, 최장시간: %ld.%03d s, í‰ê· ì‹œê°„: %ld.%03d s; 실" +"제작업량: %d kB, 예ìƒí•œìž‘업량: %d kB; lsn=%X/%X, redo lsn=%X/%X" -#: access/transam/xlog.c:6556 +#: access/transam/xlog.c:7233 #, c-format -msgid "could not locate required checkpoint record" -msgstr "ìš”ì²­ëœ ì²´í¬í¬ì¸íЏ ë ˆì½”ë“œì˜ ìœ„ì¹˜ë¥¼ 바르게 ìž¡ì„ ìˆ˜ ì—†ìŒ" +msgid "" +"concurrent write-ahead log activity while database system is shutting down" +msgstr "ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì´ ì¤‘ì§€ë˜ëŠ” ë™ì•ˆ ë™ì‹œ 트랜잭션 로그가 활성화 ë˜ì—ˆìŒ" -#: access/transam/xlog.c:6585 commands/tablespace.c:654 +#: access/transam/xlog.c:7818 #, c-format -msgid "could not create symbolic link \"%s\": %m" -msgstr "\"%s\" 심벌릭 ë§í¬ë¥¼ 만들 수 ì—†ìŒ: %m" +msgid "recovery restart point at %X/%X" +msgstr "%X/%Xì—서 복구 작업 시작함" -#: access/transam/xlog.c:6617 access/transam/xlog.c:6623 +#: access/transam/xlog.c:7820 #, c-format -msgid "ignoring file \"%s\" because no file \"%s\" exists" -msgstr "\"%s\" íŒŒì¼ ë¬´ì‹œí•¨, \"%s\" íŒŒì¼ ì—†ìŒ" +msgid "Last completed transaction was at log time %s." +msgstr "마지막 ì™„ë£Œëœ íŠ¸ëžœìž­ì…˜ ê¸°ë¡ ì‹œê°„ì€ %s 입니다." -#: access/transam/xlog.c:6619 access/transam/xlog.c:11828 +#: access/transam/xlog.c:8082 +#, c-format +msgid "restore point \"%s\" created at %X/%X" +msgstr "\"%s\" ì´ë¦„ì˜ ë³µêµ¬ 위치는 %X/%Xì— ë§Œë“¤ì—ˆìŒ" + +#: access/transam/xlog.c:8289 +#, c-format +msgid "online backup was canceled, recovery cannot continue" +msgstr "온ë¼ì¸ ë°±ì–´ì´ ì·¨ì†Œë˜ì—ˆìŒ, 복구를 ê³„ì† í•  수 ì—†ìŒ" + +#: access/transam/xlog.c:8347 +#, c-format +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" +msgstr "셧다운 ì²´í¬í¬ì¸íЏ ë ˆì½”ë“œì— ìž˜ëª»ëœ íƒ€ìž„ë¼ì¸ ID ê°’: %u (기대값: %u)" + +#: access/transam/xlog.c:8405 +#, c-format +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "온ë¼ì¸ ì²´í¬í¬ì¸íЏ ë ˆì½”ë“œì— ìž˜ëª»ëœ íƒ€ìž„ë¼ì¸ ID ê°’: %u (기대값: %u)" + +#: access/transam/xlog.c:8434 +#, c-format +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" +msgstr "복구ë ë ˆì½”ë“œì— ìž˜ëª»ëœ íƒ€ìž„ë¼ì¸ ID ê°’: %u (기대값: %u)" + +#: access/transam/xlog.c:8705 +#, c-format +msgid "could not fsync write-through file \"%s\": %m" +msgstr "\"%s\" write-through 파ì¼ì„ fsyncí•  수 ì—†ìŒ: %m" + +#: access/transam/xlog.c:8710 +#, c-format +msgid "could not fdatasync file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ fdatasync 실패: %m" + +#: access/transam/xlog.c:8797 access/transam/xlog.c:9133 +#, c-format +msgid "WAL level not sufficient for making an online backup" +msgstr "온ë¼ì¸ 백업 ìž‘ì—…ì„ í•˜ê¸° 위한 WAL ìˆ˜ì¤€ì´ ì¶©ë¶„ì¹˜ 않습니다." + +#: access/transam/xlog.c:8798 access/transam/xlogfuncs.c:248 +#, c-format +msgid "" +"\"wal_level\" must be set to \"replica\" or \"logical\" at server start." +msgstr "" +"\"wal_level\" ê°’ì„ \"replica\" ë˜ëŠ” \"logical\"로 지정하고 서버를 실행하십시" +"오." + +#: access/transam/xlog.c:8803 +#, c-format +msgid "backup label too long (max %d bytes)" +msgstr "백업 ë¼ë²¨ ì´ë¦„ì´ ë„ˆë¬´ 긺(최대 %d ë°”ì´íЏ)" + +#: access/transam/xlog.c:8924 +#, c-format +msgid "" +"WAL generated with \"full_page_writes=off\" was replayed since last " +"restartpoint" +msgstr "" +"마지막 재시작 위치부터 재반ì˜ëœ WAL ë‚´ìš©ì´ \"full_page_writes=off\" 설정으로 " +"만들어진 내용입니다." + +#: access/transam/xlog.c:8926 access/transam/xlog.c:9222 +#, c-format +msgid "" +"This means that the backup being taken on the standby is corrupt and should " +"not be used. Enable \"full_page_writes\" and run CHECKPOINT on the primary, " +"and then try an online backup again." +msgstr "" +"ì´ëŸ° 경우는 대기 서버용으로 쓸 ë°±ì—…ì´ ì†ìƒë˜ì–´ 사용할 수 없습니다. " +"\"full_page_writes\" ì„¤ì •ì„ í™œì„±í™” 하고, 주 서버ì—서 CHECKPOINT ëª…ë ¹ì„ ì‹¤í–‰í•˜" +"ê³ , 온ë¼ì¸ ë°±ì—…ì„ ë‹¤ì‹œ 해서 사용하세요." + +#: access/transam/xlog.c:9006 backup/basebackup.c:1417 utils/adt/misc.c:354 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "\"%s\" 심볼릭 ë§í¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" + +#: access/transam/xlog.c:9013 backup/basebackup.c:1422 utils/adt/misc.c:359 +#, c-format +msgid "symbolic link \"%s\" target is too long" +msgstr "\"%s\" 심볼릭 ë§í¬ì˜ 대ìƒì´ 너무 긺" + +#: access/transam/xlog.c:9134 +#, c-format +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "" +"wal_level ê°’ì„ \"replica\" ë˜ëŠ” \"logical\"로 지정하고 서버를 실행하십시오." + +#: access/transam/xlog.c:9172 backup/basebackup.c:1281 +#, c-format +msgid "the standby was promoted during online backup" +msgstr "대기 서버가 온ë¼ì¸ 백업 중 주 서버로 전환ë˜ì—ˆìŠµë‹ˆë‹¤" + +#: access/transam/xlog.c:9173 backup/basebackup.c:1282 +#, c-format +msgid "" +"This means that the backup being taken is corrupt and should not be used. " +"Try taking another online backup." +msgstr "" +"ì´ëŸ° 경우, 해당 백업 ìžë£Œê°€ ì†ìƒë˜ì—ˆì„ ê°€ëŠ¥ì„±ì´ ìžˆìŠµë‹ˆë‹¤. 다른 ë°±ì—…ë³¸ì„ ì´ìš©" +"하세요." + +#: access/transam/xlog.c:9220 +#, c-format +msgid "" +"WAL generated with \"full_page_writes=off\" was replayed during online backup" +msgstr "" +"온ë¼ì¸ 백업 ë„중 \"full_page_writes=off\" 설정으로 만들어진 WAL ë‚´ìš©ì´ ìž¬ë°˜ì˜" +"ë˜ì—ˆìŠµë‹ˆë‹¤." + +#: access/transam/xlog.c:9336 +#, c-format +msgid "base backup done, waiting for required WAL segments to be archived" +msgstr "" +"ë² ì´ìФ ë°±ì—…ì´ ë났습니다. 필요한 WAL ì¡°ê° íŒŒì¼ì´ ì•„ì¹´ì´ë¸Œ ë˜ê¸¸ 기다리고 있습" +"니다." + +#: access/transam/xlog.c:9350 +#, c-format +msgid "" +"still waiting for all required WAL segments to be archived (%d seconds " +"elapsed)" +msgstr "" +"필요한 WAL ì¡°ê° íŒŒì¼ ì•„ì¹´ì´ë¹™ì´ 완료ë˜ê¸°ë¥¼ ê³„ì† ê¸°ë‹¤ë¦¬ê³  ìžˆìŒ (%dì´ˆ 경과)" + +#: access/transam/xlog.c:9352 +#, c-format +msgid "" +"Check that your \"archive_command\" is executing properly. You can safely " +"cancel this backup, but the database backup will not be usable without all " +"the WAL segments." +msgstr "" +"\"archive_command\" ì„¤ì •ì„ ì‚´íŽ´ë³´ì„¸ìš”. ì´ ë°±ì—… ìž‘ì—…ì€ ì•ˆì „í•˜ê²Œ 취소 í•  수 있" +"지만, ë°ì´í„°ë² ì´ìФ ë°±ì—…ì€ ëª¨ë“  WAL ì¡°ê° ì—†ì´ëŠ” ì‚¬ìš©ë  ìˆ˜ 없습니다." + +#: access/transam/xlog.c:9359 +#, c-format +msgid "all required WAL segments have been archived" +msgstr "모든 필요한 WAL ì¡°ê°ë“¤ì´ ì•„ì¹´ì´ë¸Œ ë˜ì—ˆìŠµë‹ˆë‹¤." + +#: access/transam/xlog.c:9363 +#, c-format +msgid "" +"WAL archiving is not enabled; you must ensure that all required WAL segments " +"are copied through other means to complete the backup" +msgstr "" +"WAL ì•„ì¹´ì´ë¸Œ ê¸°ëŠ¥ì´ ë¹„í™œì„±í™” ë˜ì–´ 있습니다; ì´ ê²½ìš°ëŠ” 백업 ë’¤ ë³µêµ¬ì— í•„ìš”í•œ " +"모든 WAL ì¡°ê° íŒŒì¼ë“¤ì„ ì§ì ‘ 찾아서 따로 보관해 ë‘어야 바르게 복구 í•  수 있습" +"니다." + +#: access/transam/xlog.c:9402 +#, c-format +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "" +"pg_backup_stop ìž‘ì—…ì´ í˜¸ì¶œë˜ê¸° ì „ì— ë°±ì—”ë“œê°€ 종료ë˜ì–´ ë°±ì—…ì„ ì¤‘ì§€í•©ë‹ˆë‹¤." + +#: access/transam/xlogarchive.c:213 +#, c-format +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "\"%s\" ì•„ì¹´ì´ë¸Œ 파ì¼ì˜ í¬ê¸°ê°€ ì´ìƒí•©ë‹ˆë‹¤: 현재값 %lld, 기대값 %lld" + +#: access/transam/xlogarchive.c:222 +#, c-format +msgid "restored log file \"%s\" from archive" +msgstr "ì•„ì¹´ì´ë¸Œì—서 \"%s\" 로그파ì¼ì„ 복구했ìŒ" + +#: access/transam/xlogarchive.c:236 +#, c-format +msgid "\"restore_command\" returned a zero exit status, but stat() failed." +msgstr "\"restore_command\" ìž‘ì—…ì´ 0ì„ ë°˜í™˜í–ˆì§€ë§Œ, stat() 작업 실패." + +#: access/transam/xlogarchive.c:268 +#, c-format +msgid "could not restore file \"%s\" from archive: %s" +msgstr "ì•„ì¹´ì´ë¸Œì—서 \"%s\" íŒŒì¼ ë³µì› ì‹¤íŒ¨: %s" + +#. translator: First %s represents a postgresql.conf parameter name like +#. "recovery_end_command", the 2nd is the value of that parameter, the +#. third an already translated error message. +#: access/transam/xlogarchive.c:346 +#, c-format +msgid "%s \"%s\": %s" +msgstr "%s \"%s\": %s" + +#: access/transam/xlogarchive.c:456 access/transam/xlogarchive.c:536 +#, c-format +msgid "could not create archive status file \"%s\": %m" +msgstr "\"%s\" archive status 파ì¼ì„ 만들 수 없습니다: %m" + +#: access/transam/xlogarchive.c:464 access/transam/xlogarchive.c:544 +#, c-format +msgid "could not write archive status file \"%s\": %m" +msgstr "\"%s\" archive status 파ì¼ì— 쓸 수 없습니다: %m" + +#: access/transam/xlogfuncs.c:69 backup/basebackup.c:997 +#, c-format +msgid "a backup is already in progress in this session" +msgstr "ì´ë¯¸ ì´ ì„¸ì…˜ì—서 백업 ìž‘ì—…ì´ ì§„í–‰ 중입니다" + +#: access/transam/xlogfuncs.c:140 +#, c-format +msgid "backup is not in progress" +msgstr "현재 백업 ìž‘ì—…ì„ í•˜ì§€ 않고 있습니다" + +#: access/transam/xlogfuncs.c:141 +#, c-format +msgid "Did you call pg_backup_start()?" +msgstr "pg_backup_start() 함수를 호출했나요?" + +#: access/transam/xlogfuncs.c:184 access/transam/xlogfuncs.c:242 +#: access/transam/xlogfuncs.c:281 access/transam/xlogfuncs.c:302 +#: access/transam/xlogfuncs.c:323 +#, c-format +msgid "WAL control functions cannot be executed during recovery." +msgstr "WAL 제어 함수는 복구 작업 중ì—는 실행 ë  ìˆ˜ ì—†ìŒ" + +#: access/transam/xlogfuncs.c:209 access/transam/xlogfuncs.c:389 +#: access/transam/xlogfuncs.c:447 +#, c-format +msgid "%s cannot be executed during recovery." +msgstr "복구 작업 중ì—는 %s ëª…ë ¹ì„ ì‹¤í–‰í•  수 없습니다." + +#: access/transam/xlogfuncs.c:215 +#, c-format +msgid "" +"pg_log_standby_snapshot() can only be used if \"wal_level\" >= \"replica\"" +msgstr "" +"pg_log_standby_snapshot() 함수는 \"wal_level\" >= \"replica\" ìƒíƒœì—서 사용" +"ë  ìˆ˜ 있습니다." + +#: access/transam/xlogfuncs.c:247 +#, c-format +msgid "WAL level not sufficient for creating a restore point" +msgstr "WAL ìˆ˜ì¤€ì´ ë³µì› ìœ„ì¹˜ë¥¼ 만들 수 없는 수준입니다" + +#: access/transam/xlogfuncs.c:255 +#, c-format +msgid "value too long for restore point (maximum %d characters)" +msgstr "ë³µì› ìœ„ì¹˜ ì´ë¦„ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤. (최대값, %d 글ìž)" + +#: access/transam/xlogfuncs.c:486 +#, c-format +msgid "invalid WAL file name \"%s\"" +msgstr "ìž˜ëª»ëœ WAL íŒŒì¼ ì´ë¦„: \"%s\"" + +#: access/transam/xlogfuncs.c:522 access/transam/xlogfuncs.c:552 +#: access/transam/xlogfuncs.c:576 access/transam/xlogfuncs.c:599 +#: access/transam/xlogfuncs.c:679 +#, c-format +msgid "recovery is not in progress" +msgstr "현재 복구 작업 ìƒíƒœê°€ 아닙니다" + +#: access/transam/xlogfuncs.c:523 access/transam/xlogfuncs.c:553 +#: access/transam/xlogfuncs.c:577 access/transam/xlogfuncs.c:600 +#: access/transam/xlogfuncs.c:680 +#, c-format +msgid "Recovery control functions can only be executed during recovery." +msgstr "복구 제어 함수는 복구 ìž‘ì—…ì¼ ë•Œë§Œ 실행할 수 있습니다." + +#: access/transam/xlogfuncs.c:528 access/transam/xlogfuncs.c:558 +#, c-format +msgid "standby promotion is ongoing" +msgstr "대기 서버가 ìš´ì˜ ì„œë²„ë¡œ 전환 중입니다." + +#: access/transam/xlogfuncs.c:529 access/transam/xlogfuncs.c:559 +#, c-format +msgid "%s cannot be executed after promotion is triggered." +msgstr "%s 함수는 ìš´ì˜ ì „í™˜ 중ì—는 ì‹¤í–‰ë  ìˆ˜ ì—†ìŒ." + +#: access/transam/xlogfuncs.c:685 +#, c-format +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "\"wait_seconds\" ê°’ì€ ìŒìˆ˜ë‚˜ 0ì„ ì‚¬ìš©í•  수 ì—†ìŒ" + +#: access/transam/xlogfuncs.c:707 storage/ipc/signalfuncs.c:265 +#, c-format +msgid "failed to send signal to postmaster: %m" +msgstr "postmaster로 ì‹œê·¸ë„ ë³´ë‚´ê¸° 실패: %m" + +#: access/transam/xlogfuncs.c:739 libpq/be-secure.c:237 libpq/be-secure.c:346 +#, c-format +msgid "terminating connection due to unexpected postmaster exit" +msgstr "postmasterì˜ ì˜ˆìƒì¹˜ 못한 종료로 ì—°ê²°ì„ ì¢…ë£Œí•©ë‹ˆë‹¤" + +#: access/transam/xlogfuncs.c:740 +#, c-format +msgid "while waiting on promotion" +msgstr "주 서버로 전환하는 ê²ƒì„ ê¸°ë‹¤ë¦¬ëŠ” 중" + +#: access/transam/xlogfuncs.c:744 +#, c-format +msgid "server did not promote within %d second" +msgid_plural "server did not promote within %d seconds" +msgstr[0] "%d ì´ˆ ì´ë‚´ì— ìš´ì˜ ì „í™˜ì„ í•˜ì§€ 못했습니다." + +#: access/transam/xlogprefetcher.c:1088 +#, c-format +msgid "" +"\"recovery_prefetch\" is not supported on platforms that lack " +"posix_fadvise()." +msgstr "" +"ì´ OS는 posix_fadvise() 함수를 ì§€ì›í•˜ì§€ 않아, \"recovery_prefetch\" ì„¤ì •ì„ ì§€" +"ì›í•˜ì§€ 않습니다." + +#: access/transam/xlogreader.c:619 +#, c-format +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 오프셋: 위치 %X/%X, 기대값 %u, 실재값 %u" + +#: access/transam/xlogreader.c:628 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "%X/%Xì—서 contrecord를 필요로 함" + +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 +#, c-format +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 길ì´: 위치 %X/%X, 기대값 %u, 실재값 %u" + +#: access/transam/xlogreader.c:758 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "%X/%X ìœ„ì¹˜ì— contrecord 플래그가 ì—†ìŒ" + +#: access/transam/xlogreader.c:771 +#, c-format +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "ìž˜ëª»ëœ contrecord ê¸¸ì´ %u (기대값: %lld), 위치 %X/%X" + +#: access/transam/xlogreader.c:1142 +#, c-format +msgid "invalid resource manager ID %u at %X/%X" +msgstr "ìž˜ëª»ëœ ìžì› 관리 ID %u, 위치: %X/%X" + +#: access/transam/xlogreader.c:1155 access/transam/xlogreader.c:1171 +#, c-format +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "ë ˆì½”ë“œì˜ ìž˜ëª»ëœ í”„ë¦¬ë§í¬ %X/%X, 해당 레코드 %X/%X" + +#: access/transam/xlogreader.c:1209 +#, c-format +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "ìž˜ëª»ëœ ìžì›ê´€ë¦¬ìž ë°ì´í„° ì²´í¬ì„¬, 위치: %X/%X 레코드" + +#: access/transam/xlogreader.c:1243 +#, c-format +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "%04X ë§¤ì§ ë²ˆí˜¸ê°€ 잘못ë¨, WAL ì¡°ê° íŒŒì¼ %s, LSN %X/%X, offset %u" + +#: access/transam/xlogreader.c:1258 access/transam/xlogreader.c:1300 +#, c-format +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "ìž˜ëª»ëœ ì •ë³´ 비트 %04X, WAL ì¡°ê° íŒŒì¼ %s, LSN %X/%X, offset %u" + +#: access/transam/xlogreader.c:1274 +#, c-format +msgid "" +"WAL file is from different database system: WAL file database system " +"identifier is %llu, pg_control database system identifier is %llu" +msgstr "" +"WAL 파ì¼ì´ 다른 ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤. WAL 파ì¼ì˜ 시스템 ì‹ë³„ìžëŠ” %llu, " +"pg_control ì˜ ì‹ë³„ìžëŠ” %llu" + +#: access/transam/xlogreader.c:1282 +#, c-format +msgid "" +"WAL file is from different database system: incorrect segment size in page " +"header" +msgstr "" +"WAL 파ì¼ì´ 다른 ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤: 페ì´ì§€ í—¤ë”ì— ì§€ì •ëœ ê°’ì´ ìž˜" +"ëª»ëœ ì¡°ê° í¬ê¸°ìž„" + +#: access/transam/xlogreader.c:1288 +#, c-format +msgid "" +"WAL file is from different database system: incorrect XLOG_BLCKSZ in page " +"header" +msgstr "" +"WAL 파ì¼ì´ 다른 ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤: 페ì´ì§€ í—¤ë”ì˜ XLOG_BLCKSZ ê°’" +"ì´ ë°”ë¥´ì§€ 않ìŒ" + +#: access/transam/xlogreader.c:1320 +#, c-format +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "ìž˜ëª»ëœ íŽ˜ì´ì§€ 주소 %X/%X, WAL ì¡°ê° íŒŒì¼ %s, LSN %X/%X, offset %u" + +#: access/transam/xlogreader.c:1346 +#, c-format +msgid "" +"out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, " +"offset %u" +msgstr "" +"타임ë¼ì¸ 범위 벗어남 %u (ì´ì „ 번호 %u), WAL ì¡°ê° íŒŒì¼ %s, LSN %X/%X, offset " +"%u" + +#: access/transam/xlogreader.c:1749 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "%u block_id는 범위를 벗어남, 위치 %X/%X" + +#: access/transam/xlogreader.c:1773 +#, c-format +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATA 지정했지만, %X/%X ì— ìžë£Œê°€ ì—†ìŒ" + +#: access/transam/xlogreader.c:1780 +#, c-format +msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" +msgstr "BKPBLOCK_HAS_DATA 지정 않았지만, %u 길ì´ì˜ ìžë£Œê°€ 있ìŒ, 위치 %X/%X" + +#: access/transam/xlogreader.c:1816 +#, c-format +msgid "" +"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " +"%X/%X" +msgstr "" +"BKPIMAGE_HAS_HOLE ì„¤ì •ì´ ë˜ì–´ 있지만, 옵셋: %u, 길ì´: %u, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´: " +"%u, 대ìƒ: %X/%X" + +#: access/transam/xlogreader.c:1832 +#, c-format +msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" +msgstr "" +"BKPIMAGE_HAS_HOLE ì„¤ì •ì´ ì•ˆë˜ì–´ 있지만, 옵셋: %u, 길ì´: %u, 대ìƒ: %X/%X" + +#: access/transam/xlogreader.c:1846 +#, c-format +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "" +"BKPIMAGE_COMPRESSED ì„¤ì •ì´ ë˜ì–´ 있지만, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´: %u, 대ìƒ: %X/%X" + +#: access/transam/xlogreader.c:1861 +#, c-format +msgid "" +"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " +"length is %u at %X/%X" +msgstr "" +"BKPIMAGE_HAS_HOLE, BKPIMAGE_COMPRESSED 지정 안ë˜ì–´ 있으나, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´" +"는 %u, 대ìƒ: %X/%X" + +#: access/transam/xlogreader.c:1877 +#, c-format +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_REL ì„¤ì •ì´ ë˜ì–´ 있지만, %X/%X ì— ì´ì „ 릴레ì´ì…˜ ì—†ìŒ" + +#: access/transam/xlogreader.c:1889 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "ìž˜ëª»ëœ block_id %u, 위치 %X/%X" + +#: access/transam/xlogreader.c:1956 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 길ì´, 위치 %X/%X" + +#: access/transam/xlogreader.c:1982 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "WAL 레코드ì—서 %d IDì˜ ë°±ì—… 블ë¡ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" + +#: access/transam/xlogreader.c:2066 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "%X/%X ìœ„ì¹˜ì— ì´ë¯¸ì§€ë¥¼ ë³µì›í•  수 ì—†ìŒ %d 블ë¡ì´ 잘못 지정ë¨" + +#: access/transam/xlogreader.c:2073 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "%X/%X ìœ„ì¹˜ì— ì´ë¯¸ì§€ë¥¼ ë³µì›í•  수 ì—†ìŒ, %d 블ë¡ì˜ ìƒíƒœê°€ ì´ìƒí•¨" + +#: access/transam/xlogreader.c:2100 access/transam/xlogreader.c:2117 +#, c-format +msgid "" +"could not restore image at %X/%X compressed with %s not supported by build, " +"block %d" +msgstr "%X/%X ìœ„ì¹˜ì— ì••ì¶•ëœ ì´ë¯¸ì§€ ë³µì› ì‹¤íŒ¨, %s ì§€ì› í•˜ì§€ 않ìŒ, 해당 블ë¡: %d" + +#: access/transam/xlogreader.c:2126 +#, c-format +msgid "" +"could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "알 수 없는 방법으로 ì´ë¯¸ì§€ ì••ì¶• ë³µì› ì‹¤íŒ¨: 위치 %X/%X, ë¸”ë¡ %d" + +#: access/transam/xlogreader.c:2134 +#, c-format +msgid "could not decompress image at %X/%X, block %d" +msgstr "ì´ë¯¸ì§€ ì••ì¶• 풀기 실패, 위치 %X/%X, ë¸”ë¡ %d" + +#: access/transam/xlogrecovery.c:617 +#, c-format +msgid "" +"starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on " +"timeline ID %u" +msgstr "백업 복구 시작: 리ë‘LSN=%X/%X, ì²´í¬í¬ì¸íЏLSN=%X/%X, 타임ë¼ì¸ID=%u" + +#: access/transam/xlogrecovery.c:649 +#, c-format +msgid "" +"could not find redo location %X/%X referenced by checkpoint record at %X/%X" +msgstr "%X/%X ìœ„ì¹˜ì˜ redo lsnì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: 참조하는 ì²´í¬í¬ì¸íЏ 레코드=%X/%X" + +#: access/transam/xlogrecovery.c:651 access/transam/xlogrecovery.c:662 +#, c-format +msgid "" +"If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/" +"standby.signal\" and add required recovery options.\n" +"If you are not restoring from a backup, try removing the file \"%s/" +"backup_label\".\n" +"Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if " +"restoring from a backup." +msgstr "" +"ë°±ì—…ì„ ë³µì›í•˜ë ¤ë©´, \"%s/recovery.signal\" ë˜ëŠ” \"%s/standby.signal\" 파ì¼ì„ " +"만들고, 복구 관련 ì˜µì…˜ì„ ì§€ì •í•˜ì„¸ìš”.\n" +"백업 ë³µì›ì„ 하는게 아니ë¼ë©´, \"%s/backup_label\" 파ì¼ì„ 지우고 사용할 수 있" +"습니다.\n" +"주ì˜: 백업 ë³µì› ìž‘ì—…ì„ í•˜ëŠ”ë°, \"%s/backup_label\" 파ì¼ì„ 지운다면, í´ëŸ¬ìŠ¤í„°" +"ê°€ ì†ìƒ ë  ìˆ˜ 있습니다." + +#: access/transam/xlogrecovery.c:660 +#, c-format +msgid "could not locate required checkpoint record at %X/%X" +msgstr "ìš”ì²­ëœ ì²´í¬í¬ì¸íЏ ë ˆì½”ë“œì˜ ìœ„ì¹˜(%X/%X)를 ìž¡ì„ ìˆ˜ ì—†ìŒ" + +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:664 +#, c-format +msgid "could not create symbolic link \"%s\": %m" +msgstr "\"%s\" 심벌릭 ë§í¬ë¥¼ 만들 수 ì—†ìŒ: %m" + +#: access/transam/xlogrecovery.c:723 access/transam/xlogrecovery.c:729 +#, c-format +msgid "ignoring file \"%s\" because no file \"%s\" exists" +msgstr "\"%s\" íŒŒì¼ ë¬´ì‹œí•¨, \"%s\" íŒŒì¼ ì—†ìŒ" + +#: access/transam/xlogrecovery.c:725 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿¨ìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:6625 +#: access/transam/xlogrecovery.c:731 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" -#: access/transam/xlog.c:6676 +#: access/transam/xlogrecovery.c:770 +#, c-format +msgid "restarting backup recovery with redo LSN %X/%X" +msgstr "\"%X/%X\" redo LSNì—서 백업 복구 ìž‘ì—…ì„ ë‹¤ì‹œ 시작합니다" + +#: access/transam/xlogrecovery.c:795 +#, c-format +msgid "could not locate a valid checkpoint record at %X/%X" +msgstr "%X/%Xì—서 바른 ì²´í¬í¬ì¸íЏ 레코드를 ìž¡ì„ ìˆ˜ ì—†ìŒ" + +#: access/transam/xlogrecovery.c:806 +#, c-format +msgid "entering standby mode" +msgstr "대기 모드로 전환합니다" + +#: access/transam/xlogrecovery.c:809 +#, c-format +msgid "starting point-in-time recovery to XID %u" +msgstr "%u XID까지 ì‹œì  ê¸°ë°˜ 복구 ìž‘ì—…ì„ ì‹œìž‘í•©ë‹ˆë‹¤" + +#: access/transam/xlogrecovery.c:813 +#, c-format +msgid "starting point-in-time recovery to %s" +msgstr "%s 까지 ì‹œì  ë³µêµ¬ ìž‘ì—…ì„ ì‹œìž‘í•©ë‹ˆë‹¤" + +#: access/transam/xlogrecovery.c:817 +#, c-format +msgid "starting point-in-time recovery to \"%s\"" +msgstr "\"%s\" 복구 ëŒ€ìƒ ì´ë¦„까지 ì‹œì  ë³µêµ¬ ìž‘ì—…ì„ ì‹œìž‘í•©ë‹ˆë‹¤" + +#: access/transam/xlogrecovery.c:821 +#, c-format +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "\"%X/%X\" 위치(LSN)까지 ì‹œì  ë³µêµ¬ ìž‘ì—…ì„ ì‹œìž‘í•©ë‹ˆë‹¤" + +#: access/transam/xlogrecovery.c:825 +#, c-format +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "ë™ê¸°í™” í•  수 있는 마지막 ì§€ì ê¹Œì§€ ì‹œì  ë³µêµ¬ ìž‘ì—…ì„ ì‹œìž‘í•©ë‹ˆë‹¤" + +#: access/transam/xlogrecovery.c:828 #, c-format -msgid "could not locate a valid checkpoint record" -msgstr "ì²´í¬í¬ì¸íЏ ë ˆì½”ë“œì˜ ìœ„ì¹˜ë¥¼ 바르게 ìž¡ì„ ìˆ˜ ì—†ìŒ" +msgid "starting archive recovery" +msgstr "ì•„ì¹´ì´ë¸Œ 복구 ìž‘ì—…ì„ ì‹œìž‘í•©ë‹ˆë‹¤" -#: access/transam/xlog.c:6714 +#: access/transam/xlogrecovery.c:849 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "요청한 %u 타임ë¼ì¸ì€ 서버 타임ë¼ì¸ì˜ 하위가 아님" -#: access/transam/xlog.c:6716 +#: access/transam/xlogrecovery.c:851 #, c-format msgid "" "Latest checkpoint is at %X/%X on timeline %u, but in the history of the " @@ -2778,7 +3712,7 @@ msgstr "" "마지막 ì²´í¬í¬ì¸íЏ 위치는 %X/%X (%u 타임ë¼ì¸)입니다. 하지만, ìš”ì²­ë°›ì€ íƒ€ìž„ë¼" "ì¸ ë‚´ì—­íŒŒì¼ì—는 ê·¸ 타임ë¼ì¸ %X/%X 위치ì—서 분기ë˜ì—ˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:6732 +#: access/transam/xlogrecovery.c:865 #, c-format msgid "" "requested timeline %u does not contain minimum recovery point %X/%X on " @@ -2786,22 +3720,22 @@ msgid "" msgstr "" "요청한 %u 타임ë¼ì¸ì€ %X/%X 최소 복구 위치가 없습니다, 기존 타임ë¼ì¸: %u" -#: access/transam/xlog.c:6763 +#: access/transam/xlogrecovery.c:893 #, c-format msgid "invalid next transaction ID" msgstr "ìž˜ëª»ëœ ë‹¤ìŒ íŠ¸ëžœìž­ì…˜ ID" -#: access/transam/xlog.c:6857 +#: access/transam/xlogrecovery.c:898 #, c-format msgid "invalid redo in checkpoint record" msgstr "ì²´í¬í¬ì¸íЏ 레코드 ì•ˆì— ìž˜ëª»ëœ redo ì •ë³´ê°€ 있ìŒ" -#: access/transam/xlog.c:6868 +#: access/transam/xlogrecovery.c:909 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "ìš´ì˜ ì¤‘ì§€ ì²´í¬í¬ì¸íЏì—서 ìž˜ëª»ëœ ìž¬ì‹¤í–‰ ì •ë³´ 발견" -#: access/transam/xlog.c:6902 +#: access/transam/xlogrecovery.c:938 #, c-format msgid "" "database system was not properly shut down; automatic recovery in progress" @@ -2809,18 +3743,18 @@ msgstr "" "ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì´ ì •ìƒì ìœ¼ë¡œ 종료ë˜ì§€ 못했습니다, ìžë™ 복구 ìž‘ì—…ì„ ì§„í–‰í•©" "니다" -#: access/transam/xlog.c:6906 +#: access/transam/xlogrecovery.c:942 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "" "%u 타임ë¼ì¸ìœ¼ë¡œ ë¹„ì •ìƒ ì¤‘ì§€ì— ëŒ€í•œ ë³µêµ¬ìž‘ì—…ì„ ì‹œìž‘í•¨, 기존 타임ë¼ì¸: %u" -#: access/transam/xlog.c:6953 +#: access/transam/xlogrecovery.c:985 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_label íŒŒì¼ ì•ˆì— ì»¨íŠ¸ë¡¤ 파ì¼ê³¼ ì¼ê´€ì„±ì´ ë§žì§€ 않는 ìžë£Œê°€ 있ìŒ" -#: access/transam/xlog.c:6954 +#: access/transam/xlogrecovery.c:986 #, c-format msgid "" "This means that the backup is corrupted and you will have to use another " @@ -2829,172 +3763,146 @@ msgstr "" "ì´ ë¬¸ì œëŠ” 백업 ìžë£Œ ìžì²´ê°€ ì†ìƒ ë˜ì—ˆìŒì„ ë§í•©ë‹ˆë‹¤. 다른 백업본으로 복구 작업" "ì„ ì§„í–‰í•´ì•¼ 합니다." -#: access/transam/xlog.c:7045 -#, c-format -msgid "initializing for hot standby" -msgstr "ì½ê¸° ì „ìš© ë³´ì¡° 서버로 초기화 중입니다." - -#: access/transam/xlog.c:7178 -#, c-format -msgid "redo starts at %X/%X" -msgstr "%X/%Xì—서 redo 작업 시작ë¨" - -#: access/transam/xlog.c:7402 -#, c-format -msgid "requested recovery stop point is before consistent recovery point" -msgstr "요청한 복구 중지 ì§€ì ì´ ì¼ì¹˜í•˜ëŠ” 복구 ì§€ì  ì•žì— ìžˆìŒ" - -#: access/transam/xlog.c:7440 -#, c-format -msgid "redo done at %X/%X" -msgstr "%X/%Xì—서 redo 작업 완료" - -#: access/transam/xlog.c:7445 -#, c-format -msgid "last completed transaction was at log time %s" -msgstr "마지막 ì™„ë£Œëœ íŠ¸ëžœìž­ì…˜ ê¸°ë¡ ì‹œê°„: %s" - -#: access/transam/xlog.c:7454 +#: access/transam/xlogrecovery.c:1040 #, c-format -msgid "redo is not required" -msgstr "재반ì˜í•´ì•¼ í•  íŠ¸ëžœìž­ì…˜ì´ ì—†ìŒ" +msgid "using recovery command file \"%s\" is not supported" +msgstr "\"%s\" 복구 명령 파ì¼ì„ 사용하는 ê²ƒì„ ì§€ì›í•˜ì§€ 않습니다" -#: access/transam/xlog.c:7466 +#: access/transam/xlogrecovery.c:1105 #, c-format -msgid "recovery ended before configured recovery target was reached" -msgstr "" +msgid "standby mode is not supported by single-user servers" +msgstr "ë‹¨ì¼ ì‚¬ìš©ìž ì„œë²„ë¥¼ 대ìƒìœ¼ë¡œ 대기 모드를 사용할 수 없습니다." -#: access/transam/xlog.c:7545 access/transam/xlog.c:7549 +#: access/transam/xlogrecovery.c:1122 #, c-format -msgid "WAL ends before end of online backup" -msgstr "온ë¼ì¸ 백업 작업 ëë‚˜ê¸°ì „ì— WAL 작업 종료ë¨" +msgid "specified neither \"primary_conninfo\" nor \"restore_command\"" +msgstr "\"primary_conninfo\" 설정ë„, \"restore_command\" ì„¤ì •ë„ ì—†ìŒ" -#: access/transam/xlog.c:7546 +#: access/transam/xlogrecovery.c:1123 #, c-format msgid "" -"All WAL generated while online backup was taken must be available at " -"recovery." +"The database server will regularly poll the pg_wal subdirectory to check for " +"files placed there." msgstr "" -"온ë¼ì¸ 백업 중 만들어진 WAL ì¡°ê° íŒŒì¼ì€ 복구 작업ì—서 반드시 ëª¨ë‘ ìžˆì–´ì•¼ 합니" -"다." +"ë°ì´í„°ë² ì´ìФ 서버는 ì¼ë°˜ì ìœ¼ë¡œ 주 서버ì—서 ë°œìƒí•œ 트랜잭션 로그를 ë°˜ì˜í•˜ê¸° 위" +"í•´ pg_wal 하위 디렉터리를 조사할 것입니다." -#: access/transam/xlog.c:7550 +#: access/transam/xlogrecovery.c:1131 #, c-format -msgid "" -"Online backup started with pg_start_backup() must be ended with " -"pg_stop_backup(), and all WAL up to that point must be available at recovery." +msgid "must specify \"restore_command\" when standby mode is not enabled" msgstr "" -"pg_start_backup() 함수를 호출해서 시작한 온ë¼ì¸ ë°±ì—…ì€ pg_stop_backup() 함수" -"로 종료ë˜ì–´ì•¼ 하며, ê·¸ ì‚¬ì´ ë§Œë“¤ì–´ì§„ WAL ì¡°ê° íŒŒì¼ì€ 복구 작업ì—서 ëª¨ë‘ í•„ìš”" -"합니다." - -#: access/transam/xlog.c:7553 -#, c-format -msgid "WAL ends before consistent recovery point" -msgstr "WALì´ ì¼ì¹˜í•˜ëŠ” 복구 ì§€ì  ì•žì—서 종료ë¨" +"대기 모드를 활성화 하지 않았다면(standby_mode = off), \"restore_command\" 설" +"ì •ì€ ë°˜ë“œì‹œ 있어야 함" -#: access/transam/xlog.c:7588 +#: access/transam/xlogrecovery.c:1169 #, c-format -msgid "selected new timeline ID: %u" -msgstr "지정한 새 타임ë¼ì¸ ID: %u" +msgid "recovery target timeline %u does not exist" +msgstr "%u 복구 ëŒ€ìƒ íƒ€ìž„ë¼ì¸ì´ ì—†ìŒ" -#: access/transam/xlog.c:8036 +#: access/transam/xlogrecovery.c:1252 access/transam/xlogrecovery.c:1259 +#: access/transam/xlogrecovery.c:1318 access/transam/xlogrecovery.c:1406 +#: access/transam/xlogrecovery.c:1415 access/transam/xlogrecovery.c:1435 #, c-format -msgid "consistent recovery state reached at %X/%X" -msgstr "%X/%X 위치ì—서 복구 ì¼ê´€ì„±ì„ 맞춤" +msgid "invalid data in file \"%s\"" +msgstr "\"%s\" 파ì¼ì— 유효하지 ì•Šì€ ìžë£Œê°€ 있습니다" -#: access/transam/xlog.c:8246 +#: access/transam/xlogrecovery.c:1319 #, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "컨트롤 파ì¼ì—서 ìž˜ëª»ëœ primary checkpoint ë§í¬ 발견" +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "타임ë¼ì¸ IDê°€ %u 값으로 ë¶„ì„했지만, ê¸°ëŒ€ê°’ì€ %u ìž„" -#: access/transam/xlog.c:8250 +#: access/transam/xlogrecovery.c:1330 #, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "백업 ë¼ë²¨ 파ì¼ì—서 ìž˜ëª»ëœ ì²´í¬í¬ì¸íЏ ë§í¬ 발견" +msgid "this is an incremental backup, not a data directory" +msgstr "ì´ê²ƒì€ ì¦ë¶„ 백업 디렉터리로 ë°ì´í„° 디렉터리가 아님" -#: access/transam/xlog.c:8268 +#: access/transam/xlogrecovery.c:1331 #, c-format -msgid "invalid primary checkpoint record" -msgstr "ìž˜ëª»ëœ primary checkpoint 레코드" +msgid "Use pg_combinebackup to reconstruct a valid data directory." +msgstr "" +"바른 ë°ì´í„° 디렉터리로 재구축하려면 pg_combinebackup ëª…ë ¹ì„ ì´ìš©í•˜ì„¸ìš”." -#: access/transam/xlog.c:8272 +#: access/transam/xlogrecovery.c:1717 #, c-format -msgid "invalid checkpoint record" -msgstr "ìž˜ëª»ëœ checkpoint 레코드" +msgid "unexpected record type found at redo point %X/%X" +msgstr "%X/%X redo ìœ„ì¹˜ì— ìž˜ëª»ëœ ë ˆí¬ë“œ 형태가 발견ë¨" -#: access/transam/xlog.c:8283 +#: access/transam/xlogrecovery.c:1740 #, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "primary checkpoint 레코드ì—서 ìž˜ëª»ëœ ìžì› ê´€ë¦¬ìž ID 발견" +msgid "redo starts at %X/%X" +msgstr "%X/%Xì—서 redo 작업 시작ë¨" -#: access/transam/xlog.c:8287 +#: access/transam/xlogrecovery.c:1753 #, c-format -msgid "invalid resource manager ID in checkpoint record" -msgstr "checkpoint 레코드ì—서 ìž˜ëª»ëœ ìžì› ê´€ë¦¬ìž ID 발견" +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "redo ì§„í–‰ 중, 예ìƒì‹œê°„: %ld.%02d s, 현재 LSN: %X/%X" -#: access/transam/xlog.c:8300 +#: access/transam/xlogrecovery.c:1843 #, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "primary checkpoint 레코드ì—서 ìž˜ëª»ëœ xl_info 발견" +msgid "requested recovery stop point is before consistent recovery point" +msgstr "요청한 복구 중지 ì§€ì ì´ ì¼ì¹˜í•˜ëŠ” 복구 ì§€ì  ì•žì— ìžˆìŒ" -#: access/transam/xlog.c:8304 +#: access/transam/xlogrecovery.c:1875 #, c-format -msgid "invalid xl_info in checkpoint record" -msgstr "checkpoint 레코드ì—서 ìž˜ëª»ëœ xl_info 발견" +msgid "redo done at %X/%X system usage: %s" +msgstr "%X/%Xì—서 redo 작업 완료, 시스템 사용량: %s" -#: access/transam/xlog.c:8315 +#: access/transam/xlogrecovery.c:1881 #, c-format -msgid "invalid length of primary checkpoint record" -msgstr "primary checkpoint 레코드 길ì´ê°€ 잘못ë˜ì—ˆìŒ" +msgid "last completed transaction was at log time %s" +msgstr "마지막 ì™„ë£Œëœ íŠ¸ëžœìž­ì…˜ ê¸°ë¡ ì‹œê°„: %s" -#: access/transam/xlog.c:8319 +#: access/transam/xlogrecovery.c:1890 #, c-format -msgid "invalid length of checkpoint record" -msgstr "checkpoint 레코드 길ì´ê°€ 잘못ë˜ì—ˆìŒ" +msgid "redo is not required" +msgstr "재반ì˜í•´ì•¼ í•  íŠ¸ëžœìž­ì…˜ì´ ì—†ìŒ" -#: access/transam/xlog.c:8499 +#: access/transam/xlogrecovery.c:1901 #, c-format -msgid "shutting down" -msgstr "서비스를 멈추고 있습니다" +msgid "recovery ended before configured recovery target was reached" +msgstr "지정한 recovery target ë„달 ì „ì— ë³µêµ¬ ë남" -#: access/transam/xlog.c:8819 +#: access/transam/xlogrecovery.c:2095 #, c-format -msgid "checkpoint skipped because system is idle" -msgstr "ì‹œìŠ¤í…œì´ ë†€ê³  있어 ì²´í¬í¬ì¸íЏ 작업 건너뜀" +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "%X/%Xì— ë¹ ì§„ contrecord를 건너뜀, %sì— ë®ì–´ì”€" -#: access/transam/xlog.c:9019 +#: access/transam/xlogrecovery.c:2162 #, c-format -msgid "" -"concurrent write-ahead log activity while database system is shutting down" -msgstr "ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì´ ì¤‘ì§€ë˜ëŠ” ë™ì•ˆ ë™ì‹œ 트랜잭션 로그가 활성화 ë˜ì—ˆìŒ" +msgid "unexpected directory entry \"%s\" found in %s" +msgstr "ìž˜ëª»ëœ ë””ë ‰í„°ë¦¬ 엔트리 \"%s\", 위치: %s" -#: access/transam/xlog.c:9276 +#: access/transam/xlogrecovery.c:2164 #, c-format -msgid "skipping restartpoint, recovery has already ended" -msgstr "다시 시작 ì§€ì ì„ 건너뜀, 복구가 ì´ë¯¸ 종료ë¨" +msgid "All directory entries in pg_tblspc/ should be symbolic links." +msgstr "pg_tblspc/ 안 모든 디렉터리 엔트리는 심볼릭 ë§í¬ì—¬ì•¼ 함" -#: access/transam/xlog.c:9299 +#: access/transam/xlogrecovery.c:2165 #, c-format -msgid "skipping restartpoint, already performed at %X/%X" -msgstr "다시 시작 ì§€ì ì„ 건너뜀, %X/%Xì—서 ì´ë¯¸ 수행ë¨" +msgid "" +"Remove those directories, or set \"allow_in_place_tablespaces\" to ON " +"transiently to let recovery complete." +msgstr "" +"ê·¸ 디렉터리를 지우든가, \"allow_in_place_tablespaces\" ì„¤ì •ì„ ON으로 바꿔 ìž„" +"시로 복구 ìž‘ì—…ì„ ì™„ë£Œí•˜ë“ ê°€ 하세요." -#: access/transam/xlog.c:9467 +#: access/transam/xlogrecovery.c:2217 #, c-format -msgid "recovery restart point at %X/%X" -msgstr "%X/%Xì—서 복구 작업 시작함" +msgid "completed backup recovery with redo LSN %X/%X and end LSN %X/%X" +msgstr "redo LSN %X/%X 부터 end LSN %X/%X 까지 백업 복구 완료" -#: access/transam/xlog.c:9469 +#: access/transam/xlogrecovery.c:2247 #, c-format -msgid "Last completed transaction was at log time %s." -msgstr "마지막 ì™„ë£Œëœ íŠ¸ëžœìž­ì…˜ ê¸°ë¡ ì‹œê°„ì€ %s 입니다." +msgid "consistent recovery state reached at %X/%X" +msgstr "%X/%X 위치ì—서 복구 ì¼ê´€ì„±ì„ 맞춤" -#: access/transam/xlog.c:9711 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2285 #, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "\"%s\" ì´ë¦„ì˜ ë³µêµ¬ 위치는 %X/%Xì— ë§Œë“¤ì—ˆìŒ" +msgid "WAL redo at %X/%X for %s" +msgstr "WAL redo 위치: %X/%X, 대ìƒ: %s" -#: access/transam/xlog.c:9856 +#: access/transam/xlogrecovery.c:2383 #, c-format msgid "" "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint " @@ -3002,12 +3910,12 @@ msgid "" msgstr "" "ì²´í¬í¬ì¸íЏ ë ˆì½”ë“œì— ì˜ˆê¸°ì¹˜ ì•Šì€ ì´ì „ 타임ë¼ì¸ID %u(현재 타임ë¼ì¸ID: %u)" -#: access/transam/xlog.c:9865 +#: access/transam/xlogrecovery.c:2392 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "ì²´í¬í¬ì¸íЏ ë ˆì½”ë“œì— ì˜ˆê¸°ì¹˜ ì•Šì€ íƒ€ìž„ë¼ì¸ ID %uì´(ê°€) 있ìŒ(%u ë’¤)" -#: access/transam/xlog.c:9881 +#: access/transam/xlogrecovery.c:2408 #, c-format msgid "" "unexpected timeline ID %u in checkpoint record, before reaching minimum " @@ -3016,839 +3924,856 @@ msgstr "" "ì²´í¬í¬ì¸íЏ ë‚´ì—­ ì•ˆì— %u 타임ë¼ì¸ IDê°€ 기대한 것과 다릅니다. ë°œìƒ ìœ„ì¹˜: %X/%X " "(타임ë¼ì¸: %u) 최소 복구 위치 ì´ì „" -#: access/transam/xlog.c:9957 +#: access/transam/xlogrecovery.c:2592 access/transam/xlogrecovery.c:2868 #, c-format -msgid "online backup was canceled, recovery cannot continue" -msgstr "온ë¼ì¸ ë°±ì–´ì´ ì·¨ì†Œë˜ì—ˆìŒ, 복구를 ê³„ì† í•  수 ì—†ìŒ" +msgid "recovery stopping after reaching consistency" +msgstr "ì¼ê´€ì„±ì„ 다 맞추어 복구 ìž‘ì—…ì„ ì¤‘ì§€í•©ë‹ˆë‹¤." + +#: access/transam/xlogrecovery.c:2613 +#, c-format +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "복구 중지 위치(LSN): \"%X/%X\" ì´ì „" -#: access/transam/xlog.c:10013 access/transam/xlog.c:10069 -#: access/transam/xlog.c:10092 +#: access/transam/xlogrecovery.c:2703 #, c-format -msgid "unexpected timeline ID %u (should be %u) in checkpoint record" -msgstr "ì²´í¬í¬ì¸íЏ ë ˆì½”ë“œì— ì˜ˆê¸°ì¹˜ ì•Šì€ íƒ€ìž„ë¼ì¸ ID %uì´(ê°€) 있ìŒ(%uì´ì–´ì•¼ 함)" +msgid "recovery stopping before commit of transaction %u, time %s" +msgstr "%u 트랜잭션 커밋 ì „ 복구 중지함, 시간 %s" -#: access/transam/xlog.c:10418 +#: access/transam/xlogrecovery.c:2710 #, c-format -msgid "could not fsync write-through file \"%s\": %m" -msgstr "\"%s\" write-through 파ì¼ì„ fsyncí•  수 ì—†ìŒ: %m" +msgid "recovery stopping before abort of transaction %u, time %s" +msgstr "%u 트랜잭션 중단 ì „ 복구 중지함, 시간 %s" + +#: access/transam/xlogrecovery.c:2763 +#, c-format +msgid "recovery stopping at restore point \"%s\", time %s" +msgstr "복구 중지함, 복구 위치 \"%s\", 시간 %s" + +#: access/transam/xlogrecovery.c:2781 +#, c-format +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "복구 중지 위치(LSN): \"%X/%X\" ì´í›„" + +#: access/transam/xlogrecovery.c:2848 +#, c-format +msgid "recovery stopping after commit of transaction %u, time %s" +msgstr "%u 트랜잭션 커밋 후 복구 중지함, 시간 %s" + +#: access/transam/xlogrecovery.c:2856 +#, c-format +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "%u 트랜잭션 중단 후 복구 중지함, 시간 %s" + +#: access/transam/xlogrecovery.c:2937 +#, c-format +msgid "pausing at the end of recovery" +msgstr "복구 ëì— ê¸°ë‹¤ë¦¬ëŠ” 중" + +#: access/transam/xlogrecovery.c:2938 +#, c-format +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "ìš´ì˜ ì„œë²„ë¡œ 바꾸려면, pg_wal_replay_resume() 함수를 호출하세요." -#: access/transam/xlog.c:10424 +#: access/transam/xlogrecovery.c:2941 access/transam/xlogrecovery.c:4678 #, c-format -msgid "could not fdatasync file \"%s\": %m" -msgstr "\"%s\" íŒŒì¼ fdatasync 실패: %m" +msgid "recovery has paused" +msgstr "복구 ìž‘ì—…ì´ ì¼ì‹œ 중지 ë¨" -#: access/transam/xlog.c:10523 access/transam/xlog.c:11061 -#: access/transam/xlogfuncs.c:275 access/transam/xlogfuncs.c:302 -#: access/transam/xlogfuncs.c:341 access/transam/xlogfuncs.c:362 -#: access/transam/xlogfuncs.c:383 +#: access/transam/xlogrecovery.c:2942 #, c-format -msgid "WAL control functions cannot be executed during recovery." -msgstr "WAL 제어 함수는 복구 작업 중ì—는 실행 ë  ìˆ˜ ì—†ìŒ" +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "ê³„ì† ì§„í–‰í•˜ë ¤ë©´, pg_wal_replay_resume() 함수를 호출하세요." -#: access/transam/xlog.c:10532 access/transam/xlog.c:11070 +#: access/transam/xlogrecovery.c:3205 #, c-format -msgid "WAL level not sufficient for making an online backup" -msgstr "온ë¼ì¸ 백업 ìž‘ì—…ì„ í•˜ê¸° 위한 WAL ìˆ˜ì¤€ì´ ì¶©ë¶„ì¹˜ 않습니다." +msgid "unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u" +msgstr "예ìƒì¹˜ 못한 타임ë¼ì¸ ID %u, WAL ì¡°ê° íŒŒì¼: %s, LSN %X/%X, offset %u" -#: access/transam/xlog.c:10533 access/transam/xlog.c:11071 -#: access/transam/xlogfuncs.c:308 +#: access/transam/xlogrecovery.c:3413 #, c-format -msgid "wal_level must be set to \"replica\" or \"logical\" at server start." -msgstr "" -"wal_level ê°’ì„ \"replica\" ë˜ëŠ” \"logical\"로 지정하고 서버를 실행하십시오." +msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: %m" +msgstr "%s WAL ì¡°ê°ì—서 ì½ê¸° 실패, LSN %X/%X, offset %u: %m" -#: access/transam/xlog.c:10538 +#: access/transam/xlogrecovery.c:3420 #, c-format -msgid "backup label too long (max %d bytes)" -msgstr "백업 ë¼ë²¨ ì´ë¦„ì´ ë„ˆë¬´ 긺(최대 %d ë°”ì´íЏ)" +msgid "" +"could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu" +msgstr "%s WAL ì¡°ê°ì—서 ì½ê¸° 실패, LSN %X/%X, offset %u: read %d / %zu" -#: access/transam/xlog.c:10575 access/transam/xlog.c:10860 -#: access/transam/xlog.c:10898 +#: access/transam/xlogrecovery.c:4060 #, c-format -msgid "a backup is already in progress" -msgstr "ì´ë¯¸ 백업 ìž‘ì—…ì´ ì§„í–‰ 중입니다" +msgid "invalid checkpoint location" +msgstr "ìž˜ëª»ëœ checkpoint 위치" -#: access/transam/xlog.c:10576 +#: access/transam/xlogrecovery.c:4070 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "pg_stop_backup() 함수를 실행하고 나서 다시 시ë„하세요." +msgid "invalid checkpoint record" +msgstr "ìž˜ëª»ëœ checkpoint 레코드" -#: access/transam/xlog.c:10672 +#: access/transam/xlogrecovery.c:4076 #, c-format -msgid "" -"WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "" -"마지막 재시작 위치부터 재반ì˜ëœ WAL ë‚´ìš©ì´ full_page_writes=off 설정으로 만들" -"ì–´ì§„ 내용입니다." +msgid "invalid resource manager ID in checkpoint record" +msgstr "checkpoint 레코드ì—서 ìž˜ëª»ëœ ìžì› ê´€ë¦¬ìž ID 발견" -#: access/transam/xlog.c:10674 access/transam/xlog.c:11266 +#: access/transam/xlogrecovery.c:4084 #, c-format -msgid "" -"This means that the backup being taken on the standby is corrupt and should " -"not be used. Enable full_page_writes and run CHECKPOINT on the master, and " -"then try an online backup again." -msgstr "" -"ì´ ê²½ìš° 대기 ì„œë²„ì˜ ìžë£Œê°€ ì†ì‹¤ë˜ì—ˆì„ ê°€ëŠ¥ì„±ì´ ìžˆìŠµë‹ˆë‹¤. full_page_writes 설" -"ì •ì„ í™œì„±í™” 하고, 주 서버ì—서 CHECKPOINT ëª…ë ¹ì„ ì‹¤í–‰í•˜ê³ , 온ë¼ì¸ ë°±ì—…ì„ ë‹¤ì‹œ " -"해서 사용하세요." +msgid "invalid xl_info in checkpoint record" +msgstr "checkpoint 레코드ì—서 ìž˜ëª»ëœ xl_info 발견" -#: access/transam/xlog.c:10757 replication/basebackup.c:1423 -#: utils/adt/misc.c:342 +#: access/transam/xlogrecovery.c:4090 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "\"%s\" 심볼릭 ë§í¬ì˜ 대ìƒì´ 너무 긺" +msgid "invalid length of checkpoint record" +msgstr "checkpoint 레코드 길ì´ê°€ 잘못ë˜ì—ˆìŒ" -#: access/transam/xlog.c:10810 commands/tablespace.c:402 -#: commands/tablespace.c:566 replication/basebackup.c:1438 utils/adt/misc.c:350 +#: access/transam/xlogrecovery.c:4144 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "í…Œì´ë¸”스페ì´ìФ ê¸°ëŠ¥ì€ ì´ í”Œëž«í¼ì—서는 ì§€ì›í•˜ì§€ 않습니다." +msgid "new timeline %u is not a child of database system timeline %u" +msgstr "요청한 %u 타임ë¼ì¸ì€ %u ë°ì´í„°ë² ì´ìФ 시스템 타임ë¼ì¸ì˜ 하위가 아님" -#: access/transam/xlog.c:10861 access/transam/xlog.c:10899 +#: access/transam/xlogrecovery.c:4158 #, c-format msgid "" -"If you're sure there is no backup in progress, remove file \"%s\" and try " -"again." +"new timeline %u forked off current database system timeline %u before " +"current recovery point %X/%X" msgstr "" -"실재로는 백업 ìž‘ì—…ì„ ì•ˆí•˜ê³  있다고 확신한다면, \"%s\" 파ì¼ì„ 삭제하고 다시 시" -"ë„í•´ 보십시오." +"복구 위치까지 복구하기 ì „ì— ìƒˆ 타임ë¼ì¸ %u번으로 분기ë¨, 기존 ë°ì´í„°ë² ì´ìФ 타" +"ìž„ë¼ì¸: %u, 기대한 복구 위치 %X/%X" -#: access/transam/xlog.c:11086 +#: access/transam/xlogrecovery.c:4177 #, c-format -msgid "exclusive backup not in progress" -msgstr "exclusive 백업 ìž‘ì—…ì„ í•˜ì§€ 않고 있습니다" +msgid "new target timeline is %u" +msgstr "새 ëŒ€ìƒ íƒ€ìž„ë¼ì¸: %u" -#: access/transam/xlog.c:11113 +#: access/transam/xlogrecovery.c:4380 #, c-format -msgid "a backup is not in progress" -msgstr "현재 백업 ìž‘ì—…ì„ í•˜ì§€ 않고 있습니다" +msgid "WAL receiver process shutdown requested" +msgstr "WAL receiver 프로세스가 중지 ìš”ì²­ì„ ë°›ì•˜ìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:11199 access/transam/xlog.c:11212 -#: access/transam/xlog.c:11601 access/transam/xlog.c:11607 -#: access/transam/xlog.c:11655 access/transam/xlog.c:11728 -#: access/transam/xlogfuncs.c:692 +#: access/transam/xlogrecovery.c:4440 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "\"%s\" 파ì¼ì— 유효하지 ì•Šì€ ìžë£Œê°€ 있습니다" +msgid "received promote request" +msgstr "ìš´ì˜ ì „í™˜ 신호를 받았습니다." -#: access/transam/xlog.c:11216 replication/basebackup.c:1271 +#: access/transam/xlogrecovery.c:4669 #, c-format -msgid "the standby was promoted during online backup" -msgstr "대기 서버가 온ë¼ì¸ 백업 중 주 서버로 전환ë˜ì—ˆìŠµë‹ˆë‹¤" +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "불충분한 서버 설정으로 hot standby 서버를 ìš´ì˜í•  수 ì—†ìŒ" -#: access/transam/xlog.c:11217 replication/basebackup.c:1272 +#: access/transam/xlogrecovery.c:4670 access/transam/xlogrecovery.c:4697 +#: access/transam/xlogrecovery.c:4727 #, c-format msgid "" -"This means that the backup being taken is corrupt and should not be used. " -"Try taking another online backup." +"%s = %d is a lower setting than on the primary server, where its value was " +"%d." msgstr "" -"ì´ëŸ° 경우, 해당 백업 ìžë£Œê°€ ì†ìƒë˜ì—ˆì„ ê°€ëŠ¥ì„±ì´ ìžˆìŠµë‹ˆë‹¤. 다른 ë°±ì—…ë³¸ì„ ì´ìš©" -"하세요." +"ì´ ì„œë²„ì˜ í˜„ìž¬ %s = %d ì„¤ì •ì€ ì£¼ ì„œë²„ì˜ ì„¤ì •ê°’(%d)보다 낮게 설정 ë˜ì–´ 있기 때" +"문입니다." -#: access/transam/xlog.c:11264 +#: access/transam/xlogrecovery.c:4679 #, c-format -msgid "" -"WAL generated with full_page_writes=off was replayed during online backup" -msgstr "" -"온ë¼ì¸ 백업 ë„중 full_page_writes=off 설정으로 만들어진 WAL ë‚´ìš©ì´ ìž¬ë°˜ì˜ë˜ì—ˆ" -"습니다." +msgid "If recovery is unpaused, the server will shut down." +msgstr "복구 후 멈춰 ìžˆì„ ìˆ˜ 없으면 서버는 ì¢…ë£Œë  ê²ƒìž…ë‹ˆë‹¤." -#: access/transam/xlog.c:11384 +#: access/transam/xlogrecovery.c:4680 #, c-format -msgid "base backup done, waiting for required WAL segments to be archived" -msgstr "" -"ë² ì´ìФ ë°±ì—…ì´ ë났습니다. 필요한 WAL ì¡°ê° íŒŒì¼ì´ ì•„ì¹´ì´ë¸Œ ë˜ê¸¸ 기다리고 있습" -"니다." +msgid "" +"You can then restart the server after making the necessary configuration " +"changes." +msgstr "환경 ì„¤ì •ì„ ë°”ê¾¸ì–´ 서버를 다시 시작할 수 있습니다." -#: access/transam/xlog.c:11396 +#: access/transam/xlogrecovery.c:4691 #, c-format -msgid "" -"still waiting for all required WAL segments to be archived (%d seconds " -"elapsed)" -msgstr "" -"필요한 WAL ì¡°ê° íŒŒì¼ ì•„ì¹´ì´ë¹™ì´ 완료ë˜ê¸°ë¥¼ ê³„ì† ê¸°ë‹¤ë¦¬ê³  ìžˆìŒ (%dì´ˆ 경과)" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "ìš´ì˜ ì„œë²„ë¡œ 전환할 수 없습니다. ì„¤ì •ì´ ë¶ˆì¶©ë¶„í•©ë‹ˆë‹¤." -#: access/transam/xlog.c:11398 +#: access/transam/xlogrecovery.c:4701 #, c-format -msgid "" -"Check that your archive_command is executing properly. You can safely " -"cancel this backup, but the database backup will not be usable without all " -"the WAL segments." -msgstr "" -"archive_command ì„¤ì •ì„ ì‚´íŽ´ë³´ì„¸ìš”. ì´ ë°±ì—… ìž‘ì—…ì€ ì•ˆì „í•˜ê²Œ 취소 í•  수 있지" -"ë§Œ, ë°ì´í„°ë² ì´ìФ ë°±ì—…ì€ ëª¨ë“  WAL ì¡°ê° ì—†ì´ëŠ” ì‚¬ìš©ë  ìˆ˜ 없습니다." +msgid "Restart the server after making the necessary configuration changes." +msgstr "필요한 ì„¤ì •ì„ ë°”ê¾¸ì–´ 서버를 다시 시작하세요." -#: access/transam/xlog.c:11405 +#: access/transam/xlogrecovery.c:4725 #, c-format -msgid "all required WAL segments have been archived" -msgstr "모든 필요한 WAL ì¡°ê°ë“¤ì´ ì•„ì¹´ì´ë¸Œ ë˜ì—ˆìŠµë‹ˆë‹¤." +msgid "recovery aborted because of insufficient parameter settings" +msgstr "복구 ìž‘ì—…ì´ ë¶ˆì¶©ë¶„í•œ 설정으로 중지 ë˜ì—ˆìŠµë‹ˆë‹¤." -#: access/transam/xlog.c:11409 +#: access/transam/xlogrecovery.c:4731 #, c-format msgid "" -"WAL archiving is not enabled; you must ensure that all required WAL segments " -"are copied through other means to complete the backup" -msgstr "" -"WAL ì•„ì¹´ì´ë¸Œ ê¸°ëŠ¥ì´ ë¹„í™œì„±í™” ë˜ì–´ 있습니다; ì´ ê²½ìš°ëŠ” 백업 ë’¤ ë³µêµ¬ì— í•„ìš”í•œ " -"모든 WAL ì¡°ê° íŒŒì¼ë“¤ì„ ì§ì ‘ 찾아서 따로 보관해 ë‘어야 바르게 복구 í•  수 있습" -"니다." +"You can restart the server after making the necessary configuration changes." +msgstr "필요한 ì„¤ì •ì„ ë°”ê¾¸ì–´ 서버를 다시 시작할 수 있습니다." + +#: access/transam/xlogrecovery.c:4773 +#, c-format +msgid "multiple recovery targets specified" +msgstr "복구 대ìƒì„ 다중 지정했ìŒ" -#: access/transam/xlog.c:11462 +#: access/transam/xlogrecovery.c:4774 #, c-format -msgid "aborting backup due to backend exiting before pg_stop_backup was called" +msgid "" +"At most one of \"recovery_target\", \"recovery_target_lsn\", " +"\"recovery_target_name\", \"recovery_target_time\", \"recovery_target_xid\" " +"may be set." msgstr "" -"pg_stop_backup ìž‘ì—…ì´ í˜¸ì¶œë˜ê¸° ì „ì— ë°±ì—”ë“œê°€ 종료ë˜ì–´ ë°±ì—…ì„ ì¤‘ì§€í•©ë‹ˆë‹¤." +"\"recovery_target\", \"recovery_target_lsn\", \"recovery_target_name\", " +"\"recovery_target_time\", \"recovery_target_xid\" ì´ë“¤ 중 하나는 지정해야합니" +"다." -#: access/transam/xlog.c:11638 +#: access/transam/xlogrecovery.c:4785 #, c-format -msgid "backup time %s in file \"%s\"" -msgstr "백업 시간: %s, ì €ìž¥ëœ íŒŒì¼: \"%s\"" +msgid "The only allowed value is \"immediate\"." +msgstr "ì´ ê°’ìœ¼ë¡œëŠ” \"immediate\" ë§Œ 허용합니다." -#: access/transam/xlog.c:11643 +#: access/transam/xlogrecovery.c:4937 utils/adt/timestamp.c:202 +#: utils/adt/timestamp.c:455 #, c-format -msgid "backup label %s in file \"%s\"" -msgstr "백업 ë¼ë²¨: %s, ì €ìž¥ëœ íŒŒì¼: \"%s\"" +msgid "timestamp out of range: \"%s\"" +msgstr "타임스탬프 ê°’ì´ ë²”ìœ„ë¥¼ 벗어났ìŒ: \"%s\"" -#: access/transam/xlog.c:11656 +#: access/transam/xlogrecovery.c:4982 #, c-format -msgid "Timeline ID parsed is %u, but expected %u." -msgstr "타임ë¼ì¸ IDê°€ %u 값으로 ë¶„ì„했지만, ê¸°ëŒ€ê°’ì€ %u ìž„" +msgid "\"recovery_target_timeline\" is not a valid number." +msgstr "\"recovery_target_timeline\" 값으로 ìž˜ëª»ëœ ìˆ«ìžìž…니다." -#: access/transam/xlog.c:11660 +#: access/transam/xlogutils.c:1032 #, c-format -msgid "backup timeline %u in file \"%s\"" -msgstr "백업 타임ë¼ì¸: %u, ì €ìž¥ëœ íŒŒì¼: \"%s\"" +msgid "could not read from WAL segment %s, offset %d: %m" +msgstr "%s WAL ì¡°ê°ì—서 ì½ê¸° 실패, offset %d: %m" -#. translator: %s is a WAL record description -#: access/transam/xlog.c:11768 +#: access/transam/xlogutils.c:1039 #, c-format -msgid "WAL redo at %X/%X for %s" -msgstr "WAL redo 위치: %X/%X, 대ìƒ: %s" +msgid "could not read from WAL segment %s, offset %d: read %d of %d" +msgstr "%s WAL ì¡°ê°ì—서 ì½ê¸° 실패, 위치: %d, %d ì½ìŒ(ì „ì²´: %d)" -#: access/transam/xlog.c:11817 +#: archive/shell_archive.c:98 #, c-format -msgid "online backup mode was not canceled" -msgstr "온ë¼ì¸ 백업 모드가 취소ë˜ì§€ 않았ìŒ" +msgid "archive command failed with exit code %d" +msgstr "ì•„ì¹´ì´ë¸Œ 명령 실패, 종료 코드: %d" -#: access/transam/xlog.c:11818 +#: archive/shell_archive.c:100 archive/shell_archive.c:110 +#: archive/shell_archive.c:116 archive/shell_archive.c:125 #, c-format -msgid "File \"%s\" could not be renamed to \"%s\": %m." -msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m." +msgid "The failed archive command was: %s" +msgstr "실패한 ì•„ì¹´ì´ë¸Œ 명령: %s" -#: access/transam/xlog.c:11827 access/transam/xlog.c:11839 -#: access/transam/xlog.c:11849 +#: archive/shell_archive.c:107 #, c-format -msgid "online backup mode canceled" -msgstr "온ë¼ì¸ 백업 모드가 취소ë¨" +msgid "archive command was terminated by exception 0x%X" +msgstr "0x%X 예외로 ì¸í•´ ì•„ì¹´ì´ë¸Œ ëª…ë ¹ì´ ì¢…ë£Œë¨" -#: access/transam/xlog.c:11840 +#: archive/shell_archive.c:109 postmaster/postmaster.c:3093 #, c-format msgid "" -"Files \"%s\" and \"%s\" were renamed to \"%s\" and \"%s\", respectively." -msgstr "" -"예ìƒí•œ 것처럼, \"%s\", \"%s\" 파ì¼ì„ \"%s\", \"%s\" ì´ë¦„으로 바꿨습니다." +"See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "16진수 ê°’ì— ëŒ€í•œ ì„¤ëª…ì€ C í¬í•¨ íŒŒì¼ \"ntstatus.h\"를 참조하십시오." -#: access/transam/xlog.c:11850 +#: archive/shell_archive.c:114 #, c-format -msgid "" -"File \"%s\" was renamed to \"%s\", but file \"%s\" could not be renamed to " -"\"%s\": %m." -msgstr "" -"\"%s\" 파ì¼ì€ \"%s\" ì´ë¦„으로 바꿨지만, \"%s\" 파ì¼ì€ \"%s\" ì´ë¦„으로 바꾸지 " -"못했습니다: %m." +msgid "archive command was terminated by signal %d: %s" +msgstr "%d번 시그ë„로 ì¸í•´ ì•„ì¹´ì´ë¸Œ ëª…ë ¹ì´ ì¢…ë£Œë¨: %s" -#: access/transam/xlog.c:11983 access/transam/xlogutils.c:971 +#: archive/shell_archive.c:123 #, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "%s 로그 ì¡°ê°ì—서 ì½ê¸° 실패, 위치: %u: %m" +msgid "archive command exited with unrecognized status %d" +msgstr "ì•„ì¹´ì´ë¸Œ ëª…ë ¹ì´ ì¸ì‹í•  수 없는 %d ìƒíƒœë¡œ 종료ë¨" -#: access/transam/xlog.c:11989 access/transam/xlogutils.c:978 +#: backup/backup_manifest.c:254 #, c-format -msgid "could not read from log segment %s, offset %u: read %d of %zu" -msgstr "%s 로그 ì¡°ê°ì—서 ì½ê¸° 실패, 위치: %u, %d / %zu ì½ìŒ" +msgid "expected end timeline %u but found timeline %u" +msgstr "%u 타임ë¼ì¸ì´ ëì´ì–´ì•¼í•˜ëŠ”ë°, %u 타임ë¼ì¸ìž„" -#: access/transam/xlog.c:12518 +#: backup/backup_manifest.c:278 #, c-format -msgid "WAL receiver process shutdown requested" -msgstr "WAL receiver 프로세스가 중지 ìš”ì²­ì„ ë°›ì•˜ìŠµë‹ˆë‹¤." +msgid "expected start timeline %u but found timeline %u" +msgstr "시작 타임ë¼ì¸ì´ %u 여야하는ë°, %u 타임ë¼ì¸ìž„" -#: access/transam/xlog.c:12624 +#: backup/backup_manifest.c:305 #, c-format -msgid "received promote request" -msgstr "ìš´ì˜ ì „í™˜ 신호를 받았습니다." +msgid "start timeline %u not found in history of timeline %u" +msgstr "%u 시작 타임ë¼ì¸ì´ %u 타임ë¼ì¸ ë‚´ì—­ì•ˆì— ì—†ìŒ" -#: access/transam/xlog.c:12637 +#: backup/backup_manifest.c:356 #, c-format -msgid "promote trigger file found: %s" -msgstr "마스터 전환 트리거 파ì¼ì´ 있ìŒ: %s" +msgid "could not rewind temporary file" +msgstr "임시 파ì¼ì„ ë˜ê°ì„ 수 ì—†ìŒ" -#: access/transam/xlog.c:12646 +#: backup/basebackup.c:479 #, c-format -msgid "could not stat promote trigger file \"%s\": %m" -msgstr "\"%s\" 마스터 전환 트리거 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m" +msgid "could not find any WAL files" +msgstr "ì–´ë–¤ WAL 파ì¼ë„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: access/transam/xlogarchive.c:205 +#: backup/basebackup.c:494 backup/basebackup.c:509 backup/basebackup.c:518 #, c-format -msgid "archive file \"%s\" has wrong size: %lu instead of %lu" -msgstr "\"%s\" ê¸°ë¡ íŒŒì¼ì˜ í¬ê¸°ê°€ ì´ìƒí•©ë‹ˆë‹¤: 현재값 %lu, ì›ëž˜ê°’ %lu" +msgid "could not find WAL file \"%s\"" +msgstr "\"%s\" WAL íŒŒì¼ ì°¾ê¸° 실패" -#: access/transam/xlogarchive.c:214 +#: backup/basebackup.c:560 backup/basebackup.c:585 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "ì•„ì¹´ì´ë¸Œì—서 \"%s\" 로그파ì¼ì„ 복구했ìŒ" +msgid "unexpected WAL file size \"%s\"" +msgstr "\"%s\" WAL 파ì¼ì˜ í¬ê¸°ê°€ 알맞지 않ìŒ" -#: access/transam/xlogarchive.c:259 +#: backup/basebackup.c:656 #, c-format -msgid "could not restore file \"%s\" from archive: %s" -msgstr "ì•„ì¹´ì´ë¸Œì—서 \"%s\" íŒŒì¼ ë³µì› ì‹¤íŒ¨: %s" +msgid "%lld total checksum verification failure" +msgid_plural "%lld total checksum verification failures" +msgstr[0] "%lld ì „ì²´ ì²´í¬ì„¬ 검사 실패" -#. translator: First %s represents a postgresql.conf parameter name like -#. "recovery_end_command", the 2nd is the value of that parameter, the -#. third an already translated error message. -#: access/transam/xlogarchive.c:368 +#: backup/basebackup.c:663 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s \"%s\": %s" +msgid "checksum verification failure during base backup" +msgstr "ë² ì´ìФ 백업 중 ì²´í¬ì„¬ 검사 실패" -#: access/transam/xlogarchive.c:478 access/transam/xlogarchive.c:542 +#: backup/basebackup.c:733 backup/basebackup.c:742 backup/basebackup.c:753 +#: backup/basebackup.c:770 backup/basebackup.c:779 backup/basebackup.c:788 +#: backup/basebackup.c:803 backup/basebackup.c:820 backup/basebackup.c:829 +#: backup/basebackup.c:841 backup/basebackup.c:865 backup/basebackup.c:879 +#: backup/basebackup.c:890 backup/basebackup.c:901 backup/basebackup.c:914 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "\"%s\" archive status 파ì¼ì„ 만들 수 없습니다: %m" +msgid "duplicate option \"%s\"" +msgstr "\"%s\" ì˜µì…˜ì„ ë‘ ë²ˆ 지정했습니다" -#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:550 +#: backup/basebackup.c:761 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "\"%s\" archive status 파ì¼ì— 쓸 수 없습니다: %m" +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "알 수 없는 ì²´í¬í¬ì¸íЏ 종류: \"%s\"" -#: access/transam/xlogfuncs.c:74 +#: backup/basebackup.c:793 #, c-format -msgid "a backup is already in progress in this session" -msgstr "ì´ë¯¸ ì´ ì„¸ì…˜ì—서 백업 ìž‘ì—…ì´ ì§„í–‰ 중입니다" +msgid "incremental backups cannot be taken unless WAL summarization is enabled" +msgstr "ì¦ë¶„ ë°±ì—…ì€ summarize_wal=on ìƒíƒœì—서만 가능함" -#: access/transam/xlogfuncs.c:132 access/transam/xlogfuncs.c:213 +#: backup/basebackup.c:809 #, c-format -msgid "non-exclusive backup in progress" -msgstr "non-exclusive 백업 ì§„í–‰ 중입니다" +msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "" +"%d ê°’ì€ \"%s\" 매개 ë³€ìˆ˜ì˜ ê°’ìœ¼ë¡œ 타당한 범위(%d .. %d)를 벗어났습니다." -#: access/transam/xlogfuncs.c:133 access/transam/xlogfuncs.c:214 +#: backup/basebackup.c:854 #, c-format -msgid "Did you mean to use pg_stop_backup('f')?" -msgstr "pg_stop_backup('f') 형태로 함수를 호출했나요?" +msgid "unrecognized manifest option: \"%s\"" +msgstr "ì¸ì‹í•  수 없는 메니페스트 옵션 \"%s\"" -#: access/transam/xlogfuncs.c:185 commands/event_trigger.c:1332 -#: commands/event_trigger.c:1890 commands/extension.c:1944 -#: commands/extension.c:2052 commands/extension.c:2337 commands/prepare.c:712 -#: executor/execExpr.c:2203 executor/execSRF.c:728 executor/functions.c:1046 -#: foreign/foreign.c:520 libpq/hba.c:2666 replication/logical/launcher.c:1086 -#: replication/logical/logicalfuncs.c:157 replication/logical/origin.c:1486 -#: replication/slotfuncs.c:252 replication/walsender.c:3265 -#: storage/ipc/shmem.c:550 utils/adt/datetime.c:4765 utils/adt/genfile.c:505 -#: utils/adt/genfile.c:588 utils/adt/jsonfuncs.c:1792 -#: utils/adt/jsonfuncs.c:1904 utils/adt/jsonfuncs.c:2092 -#: utils/adt/jsonfuncs.c:2201 utils/adt/jsonfuncs.c:3663 utils/adt/misc.c:215 -#: utils/adt/pgstatfuncs.c:476 utils/adt/pgstatfuncs.c:584 -#: utils/adt/pgstatfuncs.c:1719 utils/fmgr/funcapi.c:72 utils/misc/guc.c:9648 -#: utils/mmgr/portalmem.c:1136 +#: backup/basebackup.c:905 #, c-format -msgid "set-valued function called in context that cannot accept a set" -msgstr "" -"set-values 함수(í…Œì´ë¸” 리턴 함수)ê°€ set ì •ì˜ ì—†ì´ ì‚¬ìš©ë˜ì—ˆìŠµë‹ˆë‹¤ (í…Œì´ë¸”ê³¼ í•´" -"당 ì—´ alias 지정하세요)" +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "알 수 없는 ì••ì¶• 알고리즘: \"%s\"" -#: access/transam/xlogfuncs.c:189 commands/event_trigger.c:1336 -#: commands/event_trigger.c:1894 commands/extension.c:1948 -#: commands/extension.c:2056 commands/extension.c:2341 commands/prepare.c:716 -#: foreign/foreign.c:525 libpq/hba.c:2670 replication/logical/launcher.c:1090 -#: replication/logical/logicalfuncs.c:161 replication/logical/origin.c:1490 -#: replication/slotfuncs.c:256 replication/walsender.c:3269 -#: storage/ipc/shmem.c:554 utils/adt/datetime.c:4769 utils/adt/genfile.c:509 -#: utils/adt/genfile.c:592 utils/adt/misc.c:219 utils/adt/pgstatfuncs.c:480 -#: utils/adt/pgstatfuncs.c:588 utils/adt/pgstatfuncs.c:1723 -#: utils/misc/guc.c:9652 utils/misc/pg_config.c:43 utils/mmgr/portalmem.c:1140 +#: backup/basebackup.c:921 #, c-format -msgid "materialize mode required, but it is not allowed in this context" -msgstr "materialize 모드가 필요합니다만, ì´ êµ¬ë¬¸ì—서는 허용ë˜ì§€ 않습니다" +msgid "unrecognized base backup option: \"%s\"" +msgstr "ì¸ì‹í•  수 없는 ë² ì´ìФ 백업 옵션: \"%s\"" -#: access/transam/xlogfuncs.c:230 +#: backup/basebackup.c:932 #, c-format -msgid "non-exclusive backup is not in progress" -msgstr "non-exclusive 백업 ìƒíƒœê°€ 아닙니다" +msgid "manifest checksums require a backup manifest" +msgstr "매니페스트 ì²´í¬ì„¬ì€ í•˜ë‚˜ì˜ ë°±ì—… 메니페스트를 필요로 함" -#: access/transam/xlogfuncs.c:231 +#: backup/basebackup.c:941 #, c-format -msgid "Did you mean to use pg_stop_backup('t')?" -msgstr "pg_stop_backup('t') 형태로 함수를 호출했나요?" +msgid "target detail cannot be used without target" +msgstr "타켓 지정 ì—†ì´ íƒ€ì¼“ 세부정보를 지정할 수 ì—†ìŒ" -#: access/transam/xlogfuncs.c:307 +#: backup/basebackup.c:950 backup/basebackup_target.c:218 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "WAL ìˆ˜ì¤€ì´ ë³µì› ìœ„ì¹˜ë¥¼ 만들 수 없는 수준입니다" +msgid "target \"%s\" does not accept a target detail" +msgstr "\"%s\" íƒ€ì¼“ì€ íƒ€ì¼“ 세부정보를 지정할 수 ì—†ìŒ" -#: access/transam/xlogfuncs.c:315 +#: backup/basebackup.c:961 #, c-format -msgid "value too long for restore point (maximum %d characters)" -msgstr "ë³µì› ìœ„ì¹˜ ì´ë¦„ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤. (최대값, %d 글ìž)" +msgid "compression detail cannot be specified unless compression is enabled" +msgstr "ì••ì¶•ì„ ì‚¬ìš©í•˜ì§€ 않으면 ì••ì¶• 세부 정보를 지정할 수 ì—†ìŒ" -#: access/transam/xlogfuncs.c:453 access/transam/xlogfuncs.c:510 +#: backup/basebackup.c:974 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "복구 작업 중ì—는 %s ëª…ë ¹ì„ ì‹¤í–‰í•  수 없습니다." +msgid "invalid compression specification: %s" +msgstr "ìž˜ëª»ëœ ì••ì¶• 명세: %s" -#: access/transam/xlogfuncs.c:531 access/transam/xlogfuncs.c:558 -#: access/transam/xlogfuncs.c:582 access/transam/xlogfuncs.c:722 +#: backup/basebackup.c:1024 #, c-format -msgid "recovery is not in progress" -msgstr "현재 복구 작업 ìƒíƒœê°€ 아닙니다" +msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" +msgstr "ì¦ë¶ BASE_BACKUP 수행 ì „ì— UPLOAD_MANIFEST 있어야 함" -#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:559 -#: access/transam/xlogfuncs.c:583 access/transam/xlogfuncs.c:723 +#: backup/basebackup.c:1157 backup/basebackup.c:1358 #, c-format -msgid "Recovery control functions can only be executed during recovery." -msgstr "복구 제어 함수는 복구 ìž‘ì—…ì¼ ë•Œë§Œ 실행할 수 있습니다." +msgid "could not stat file or directory \"%s\": %m" +msgstr "íŒŒì¼ ë˜ëŠ” 디렉터리 \"%s\"ì˜ ìƒíƒœë¥¼ 확ì¸í•  수 ì—†ìŒ: %m" -#: access/transam/xlogfuncs.c:537 access/transam/xlogfuncs.c:564 +#: backup/basebackup.c:1544 #, c-format -msgid "standby promotion is ongoing" -msgstr "대기 서버가 ìš´ì˜ ì„œë²„ë¡œ 전환 중입니다." +msgid "skipping special file \"%s\"" +msgstr "\"%s\" 특수 파ì¼ì„ 건너뜀" -#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:565 +#: backup/basebackup.c:1751 #, c-format -msgid "%s cannot be executed after promotion is triggered." -msgstr "%s 함수는 ìš´ì˜ ì „í™˜ 중ì—는 ì‹¤í–‰ë  ìˆ˜ ì—†ìŒ." +msgid "" +"could not verify checksum in file \"%s\", block %u: read buffer size %d and " +"page size %d differ" +msgstr "" +"\"%s\" 파ì¼(%u 블ë¡)ì—서 ì²´í¬ì„¬ 검사 실패: ì½ê¸° 버í¼(%d)와 페ì´ì§€ í¬ê¸°(%d)ê°€ " +"서로 다름" -#: access/transam/xlogfuncs.c:728 +#: backup/basebackup.c:1813 #, c-format -msgid "\"wait_seconds\" must not be negative or zero" -msgstr "\"wait_seconds\" ê°’ì€ ìŒìˆ˜ë‚˜ 0ì„ ì‚¬ìš©í•  수 ì—†ìŒ" +msgid "file \"%s\" has a total of %d checksum verification failure" +msgid_plural "file \"%s\" has a total of %d checksum verification failures" +msgstr[0] "\"%s\" 파ì¼ì—서 ì „ì²´ %d ê±´ ì²´í¬ì„¬ 검사 실패" -#: access/transam/xlogfuncs.c:748 storage/ipc/signalfuncs.c:164 +#: backup/basebackup.c:1917 #, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "postmaster로 ì‹œê·¸ë„ ë³´ë‚´ê¸° 실패: %m" +msgid "" +"checksum verification failed in file \"%s\", block %u: calculated %X but " +"expected %X" +msgstr "" +"\"%s\" íŒŒì¼ ì²´í¬ì„¬ 검사 실패(해당 블럭 %u): ê³„ì‚°ëœ ì²´í¬ì„¬ %X (기대값 %X)" -#: access/transam/xlogfuncs.c:784 +#: backup/basebackup.c:1924 #, c-format -msgid "server did not promote within %d seconds" -msgstr "%d ì´ˆ ì´ë‚´ì— ìš´ì˜ ì „í™˜ì„ í•˜ì§€ 못했습니다." +msgid "" +"further checksum verification failures in file \"%s\" will not be reported" +msgstr "" +"계ì†í•´ì„œ ë°œìƒí•˜ëŠ” \"%s\"ì—ì„œì˜ ì²´í¬ì„¬ 검사 실패는 ë” ì´ìƒ 보고하지 ì•Šì„ ê²ƒìž…" +"니다." -#: access/transam/xlogreader.c:349 +#: backup/basebackup.c:2048 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 위치: %X/%X" +msgid "file name too long for tar format: \"%s\"" +msgstr "tar 파ì¼ë¡œ 묶기ì—는 íŒŒì¼ ì´ë¦„ì´ ë„ˆë¬´ 긺: \"%s\"" -#: access/transam/xlogreader.c:357 +#: backup/basebackup.c:2053 #, c-format -msgid "contrecord is requested by %X/%X" -msgstr "%X/%Xì—서 contrecord를 필요로 함" +msgid "" +"symbolic link target too long for tar format: file name \"%s\", target \"%s\"" +msgstr "" +"tar í¬ë©§ì„ 사용하기ì—는 심볼릭 ë§í¬ì˜ ëŒ€ìƒ ê²½ë¡œê°€ 너무 ê¹ë‹ˆë‹¤: íŒŒì¼ ì´ë¦„ " +"\"%s\", ëŒ€ìƒ \"%s\"" -#: access/transam/xlogreader.c:398 access/transam/xlogreader.c:695 +#: backup/basebackup.c:2127 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 길ì´: %X/%X, 기대값 %u, 실재값 %u" +msgid "could not read file \"%s\": read %zd of %zu" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %zd ì½ìŒ, ì „ì²´ %zu" -#: access/transam/xlogreader.c:422 +#: backup/basebackup_gzip.c:67 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "너무 긴 길ì´(%u)ì˜ ë ˆì½”ë“œê°€ %X/%Xì— ìžˆìŒ" +msgid "gzip compression is not supported by this build" +msgstr "gzip ì••ì¶• ê¸°ëŠ¥ì„ ëº€ 채로 서버가 만들어졌습니다." -#: access/transam/xlogreader.c:454 +#: backup/basebackup_gzip.c:143 #, c-format -msgid "there is no contrecord flag at %X/%X" -msgstr "%X/%X ìœ„ì¹˜ì— contrecord 플래그가 ì—†ìŒ" +msgid "could not initialize compression library" +msgstr "ì••ì¶• ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 초기화할 수 ì—†ìŒ" -#: access/transam/xlogreader.c:467 +#: backup/basebackup_incremental.c:294 #, c-format -msgid "invalid contrecord length %u at %X/%X" -msgstr "ìž˜ëª»ëœ contrecord ê¸¸ì´ %u, 위치 %X/%X" +msgid "manifest contains no required WAL ranges" +msgstr "ë§¤ë‹ˆíŽ˜ìŠ¤íŠ¸ì— í•„ìš”í•œ WAL 범위가 ì—†ìŒ" -#: access/transam/xlogreader.c:703 +#: backup/basebackup_incremental.c:349 #, c-format -msgid "invalid resource manager ID %u at %X/%X" -msgstr "ìž˜ëª»ëœ ìžì› 관리 ID %u, 위치: %X/%X" +msgid "timeline %u found in manifest, but not in this server's history" +msgstr "ë§¤ë‹ˆíŽ˜ìŠ¤íŠ¸ì— ìžˆëŠ” 타임ë¼ì¸ %uë²ˆì´ ì´ ì„œë²„ 백업 ì´ë ¥ 파ì¼ì—는 ì—†ìŒ" -#: access/transam/xlogreader.c:717 access/transam/xlogreader.c:734 +#: backup/basebackup_incremental.c:414 #, c-format -msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "ë ˆì½”ë“œì˜ ìž˜ëª»ëœ í”„ë¦¬ë§í¬ %X/%X, 해당 레코드 %X/%X" +msgid "" +"manifest requires WAL from initial timeline %u starting at %X/%X, but that " +"timeline begins at %X/%X" +msgstr "" +"매니페스트ì—는 시작 타임ë¼ì¸ì´ %u번으로 %X/%Xì— ìžˆë‹¤ê³  해서 ê·¸ WAL 파ì¼ì´ 필요한ë°, " +"ê·¸ 타임ë¼ì¸ì€ %X/%Xì— ìžˆìŒ" -#: access/transam/xlogreader.c:771 +#: backup/basebackup_incremental.c:424 #, c-format -msgid "incorrect resource manager data checksum in record at %X/%X" -msgstr "ìž˜ëª»ëœ ìžì›ê´€ë¦¬ìž ë°ì´í„° ì²´í¬ì„¬, 위치: %X/%X 레코드" +msgid "" +"manifest requires WAL from continuation timeline %u starting at %X/%X, but " +"that timeline begins at %X/%X" +msgstr "" +"매니페스트ì—는 ì—°ê²° 타임ë¼ì¸ì´ %u번으로 %X/%Xì— ìžˆë‹¤ê³  해서 ê·¸ WAL 파ì¼ì´ 필요한ë°, " +"ê·¸ 타임ë¼ì¸ì€ %X/%Xì— ìžˆìŒ" -#: access/transam/xlogreader.c:808 +#: backup/basebackup_incremental.c:435 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "%04X ë§¤ì§ ë²ˆí˜¸ê°€ 잘못ë¨, 로그 íŒŒì¼ %s, 위치 %u" +msgid "" +"manifest requires WAL from final timeline %u ending at %X/%X, but this " +"backup starts at %X/%X" +msgstr "" +"매니페스트ì—는 최종 타임ë¼ì¸ì´ %u번으로 %X/%Xì— ìžˆë‹¤ê³  해서 ê·¸ WAL 파ì¼ì´ 필요한ë°, " +"ì´ ë°±ì—…ì€ %X/%Xì—서 시작ë¨" -#: access/transam/xlogreader.c:822 access/transam/xlogreader.c:863 +#: backup/basebackup_incremental.c:439 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "ìž˜ëª»ëœ ì •ë³´ 비트 %04X, 로그 íŒŒì¼ %s, 위치 %u" +msgid "" +"This can happen for incremental backups on a standby if there was little " +"activity since the previous backup." +msgstr "" +"ì´ í˜„ìƒì€ ì´ì „ 백업 ì´í›„ DB ì‚¬ìš©ì´ ê±°ì˜ ì—†ì—ˆëŠ”ë°, 대기 서버ì—서 ì¦ë¶„ ë°±ì—…ì„ " +"받는 경우 ë°œìƒí•©ë‹ˆë‹¤." -#: access/transam/xlogreader.c:837 +#: backup/basebackup_incremental.c:446 #, c-format msgid "" -"WAL file is from different database system: WAL file database system " -"identifier is %llu, pg_control database system identifier is %llu" +"manifest requires WAL from non-final timeline %u ending at %X/%X, but this " +"server switched timelines at %X/%X" msgstr "" -"WAL 파ì¼ì´ 다른 ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤. WAL 파ì¼ì˜ 시스템 ì‹ë³„ìžëŠ” %llu, pg_control " -"ì˜ ì‹ë³„ìžëŠ” %llu" +"매니페스트ì—는 %u 타임ë¼ì¸ì„ ë내는 ê²ƒì´ %X/%Xì— ìžˆì–´ ê·¸ WAL 파ì¼ì´ 필요한ë°, " +"서버는 %X/%Xì—서 타임ë¼ì¸ì´ 바뀌었ìŒ" -#: access/transam/xlogreader.c:845 +#: backup/basebackup_incremental.c:527 #, c-format msgid "" -"WAL file is from different database system: incorrect segment size in page " -"header" +"WAL summaries are required on timeline %u from %X/%X to %X/%X, but no " +"summaries for that timeline and LSN range exist" msgstr "" -"WAL 파ì¼ì´ 다른 ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤: 페ì´ì§€ í—¤ë”ì— ì§€ì •ëœ ê°’ì´ ìž˜" -"ëª»ëœ ì¡°ê° í¬ê¸°ìž„" +"WAL 요약 ì •ë³´ì—서는 %u번 타임ë¼ì¸ì€ %X/%Xì—서 %X/%X까지ì¸ë°, " +"ì´ íƒ€ìž„ë¼ì¸ê³¼ ë²”ìœ„ì— ëŒ€í•œ ìš”ì•½ì„ ëª» ì°¾ìŒ" -#: access/transam/xlogreader.c:851 +#: backup/basebackup_incremental.c:534 #, c-format msgid "" -"WAL file is from different database system: incorrect XLOG_BLCKSZ in page " -"header" +"WAL summaries are required on timeline %u from %X/%X to %X/%X, but the " +"summaries for that timeline and LSN range are incomplete" msgstr "" -"WAL 파ì¼ì´ 다른 ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤: 페ì´ì§€ í—¤ë”ì˜ XLOG_BLCKSZ ê°’" -"ì´ ë°”ë¥´ì§€ 않ìŒ" +"WAL 요약 ì •ë³´ì—서는 %u번 타임ë¼ì¸ì€ %X/%Xì—서 %X/%X까지ì¸ë°, " +"ì´ íƒ€ìž„ë¼ì¸ê³¼ ë²”ìœ„ì— ëŒ€í•œ ìš”ì•½ì´ ë¶ˆì™„ì „í•¨" -#: access/transam/xlogreader.c:882 +#: backup/basebackup_incremental.c:538 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "ìž˜ëª»ëœ íŽ˜ì´ì§€ 주소 %X/%X, 로그 íŒŒì¼ %s, 위치 %u" +msgid "The first unsummarized LSN in this range is %X/%X." +msgstr "ì´ ë²”ìœ„ ì•ˆì˜ ì²«ë²ˆì§¸ 요약푼 LSNì€ %X/%X입니다." -#: access/transam/xlogreader.c:907 +#: backup/basebackup_incremental.c:938 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "타임ë¼ì¸ 범위 벗어남 %u (ì´ì „ 번호 %u), 로그 íŒŒì¼ %s, 위치 %u" +msgid "backup manifest version 1 does not support incremental backup" +msgstr "백업 매니페ì´ìФ ë²„ì „ì´ 1ì¸ë°, ì´ê²ƒì€ ì¦ë¶„ ë°±ì—…ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: access/transam/xlogreader.c:1247 +#: backup/basebackup_incremental.c:956 #, c-format -msgid "out-of-order block_id %u at %X/%X" -msgstr "%u block_id는 범위를 벗어남, 위치 %X/%X" +msgid "" +"system identifier in backup manifest is %llu, but database system identifier " +"is %llu" +msgstr "" +"백업 매니페스트ì—는 시스템 ì‹ë³„ìž ë²ˆí˜¸ê°€ %lluì¸ë°, ë°ì´í„°ë² ì´ìФ 시스템 ì‹ë³„ìžëŠ” " +"%lluìž„" -#: access/transam/xlogreader.c:1270 +#: backup/basebackup_lz4.c:67 #, c-format -msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" -msgstr "BKPBLOCK_HAS_DATA 지정했지만, %X/%X ì— ìžë£Œê°€ ì—†ìŒ" +msgid "lz4 compression is not supported by this build" +msgstr "lz4 ê¸°ëŠ¥ì„ ëº€ 채로 서버가 만들어졌습니다." -#: access/transam/xlogreader.c:1277 +#: backup/basebackup_server.c:73 #, c-format -msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" -msgstr "BKPBLOCK_HAS_DATA 지정 않았지만, %u 길ì´ì˜ ìžë£Œê°€ 있ìŒ, 위치 %X/%X" +msgid "permission denied to create backup stored on server" +msgstr "ì„œë²„ì— ë°±ì—…ë³¸ì„ ë§Œë“¤ê¸° 위한 권한 ì—†ìŒ" -#: access/transam/xlogreader.c:1313 +#: backup/basebackup_server.c:74 #, c-format msgid "" -"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " -"%X/%X" -msgstr "" -"BKPIMAGE_HAS_HOLE ì„¤ì •ì´ ë˜ì–´ 있지만, 옵셋: %u, 길ì´: %u, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´: " -"%u, 대ìƒ: %X/%X" +"Only roles with privileges of the \"%s\" role may create a backup stored on " +"the server." +msgstr "ì„œë²„ì— ë°±ì—… 결과를 파ì¼ë¡œ 저장하려면, \"%s\" 롤 구성ì›ì´ì–´ì•¼ 합니다." -#: access/transam/xlogreader.c:1329 +#: backup/basebackup_server.c:89 #, c-format -msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" -msgstr "" -"BKPIMAGE_HAS_HOLE ì„¤ì •ì´ ì•ˆë˜ì–´ 있지만, 옵셋: %u, 길ì´: %u, 대ìƒ: %X/%X" +msgid "relative path not allowed for backup stored on server" +msgstr "ë°±ì—…ì„ ì„œë²„ì— ì €ìž¥í•  경로 ì´ë¦„으로 ìƒëŒ€ê²½ë¡œëŠ” 사용할 수 없습니다" -#: access/transam/xlogreader.c:1344 +#: backup/basebackup_server.c:102 commands/dbcommands.c:477 +#: commands/tablespace.c:157 commands/tablespace.c:173 +#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:1986 +#: storage/file/copydir.c:47 #, c-format -msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" -msgstr "" -"BKPIMAGE_IS_COMPRESSED ì„¤ì •ì´ ë˜ì–´ 있지만, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´: %u, 대ìƒ: %X/%X" +msgid "could not create directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m" + +#: backup/basebackup_server.c:115 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "\"%s\" 디렉터리가 비어있지 않습니다." + +#: backup/basebackup_server.c:123 utils/init/postinit.c:1178 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m" + +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 +#: backup/basebackup_server.c:268 backup/basebackup_server.c:275 +#: backup/walsummary.c:312 storage/smgr/md.c:502 storage/smgr/md.c:509 +#: storage/smgr/md.c:591 storage/smgr/md.c:613 storage/smgr/md.c:999 +#, c-format +msgid "Check free disk space." +msgstr "ë””ìŠ¤í¬ ì—¬ìœ  ê³µê°„ì„ í™•ì¸í•´ 주십시오." + +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 +#: backup/walsummary.c:309 +#, c-format +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %d ë°”ì´íŠ¸ë§Œ ì¼ìŒ(ì „ì²´: %d), 해당 블ë¡: %u" -#: access/transam/xlogreader.c:1359 +#: backup/basebackup_target.c:146 #, c-format -msgid "" -"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image " -"length is %u at %X/%X" -msgstr "" -"BKPIMAGE_HAS_HOLE, BKPIMAGE_IS_COMPRESSED 지정 안ë˜ì–´ 있으나, ë¸”ë¡ ì´ë¯¸ì§€ 길" -"ì´ëŠ” %u, 대ìƒ: %X/%X" +msgid "unrecognized target: \"%s\"" +msgstr "알 수 없는 타겟: \"%s\"" -#: access/transam/xlogreader.c:1375 +#: backup/basebackup_target.c:237 #, c-format -msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" -msgstr "BKPBLOCK_SAME_REL ì„¤ì •ì´ ë˜ì–´ 있지만, %X/%X ì— ì´ì „ 릴레ì´ì…˜ ì—†ìŒ" +msgid "target \"%s\" requires a target detail" +msgstr "\"%s\" íƒ€ê²Ÿì€ íƒ€ê²Ÿ 세부 ì„¤ì •ì´ í•„ìš”í•©ë‹ˆë‹¤." -#: access/transam/xlogreader.c:1387 +#: backup/basebackup_zstd.c:66 #, c-format -msgid "invalid block_id %u at %X/%X" -msgstr "ìž˜ëª»ëœ block_id %u, 위치 %X/%X" +msgid "zstd compression is not supported by this build" +msgstr "zstd ì••ì¶• ê¸°ëŠ¥ì„ ëº€ 채로 서버가 만들어졌습니다." -#: access/transam/xlogreader.c:1476 +#: backup/basebackup_zstd.c:117 #, c-format -msgid "record with invalid length at %X/%X" -msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 길ì´, 위치 %X/%X" +msgid "could not set compression worker count to %d: %s" +msgstr "ì••ì¶• ìž‘ì—…ìž ìˆ˜ë¥¼ %d 값으로 지정할 수 ì—†ìŒ: %s" -#: access/transam/xlogreader.c:1565 +#: backup/basebackup_zstd.c:129 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "ìž˜ëª»ëœ ì••ì¶• ì´ë¯¸ì§€, 위치 %X/%X, ë¸”ë¡ %d" +msgid "could not enable long-distance mode: %s" +msgstr "long-distance 모드를 활성화 í•  수 ì—†ìŒ: %s" -#: bootstrap/bootstrap.c:271 +#: backup/walsummaryfuncs.c:95 #, c-format -msgid "-X requires a power of two value between 1 MB and 1 GB" -msgstr "-X ê°’ì€ 1 MB ~ 1 GB ì‚¬ì´ 2^n ê°’ì´ì–´ì•¼ 함" +msgid "invalid timeline %lld" +msgstr "ìž˜ëª»ëœ íƒ€ìž„ë¼ì¸ 번호 %lld" -#: bootstrap/bootstrap.c:288 postmaster/postmaster.c:842 tcop/postgres.c:3705 +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:623 tcop/postgres.c:3946 #, c-format msgid "--%s requires a value" -msgstr "--%s ì˜µì…˜ì€ í•´ë‹¹ ê°’ì„ ì§€ì •í•´ì•¼í•©ë‹ˆë‹¤" +msgstr "--%s ì˜µì…˜ì€ í•´ë‹¹ ê°’ì„ ì§€ì •í•´ì•¼ 합니다" -#: bootstrap/bootstrap.c:293 postmaster/postmaster.c:847 tcop/postgres.c:3710 +#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:628 tcop/postgres.c:3951 #, c-format msgid "-c %s requires a value" -msgstr "-c %s ì˜µì…˜ì€ í•´ë‹¹ ê°’ì„ ì§€ì •í•´ì•¼í•©ë‹ˆë‹¤" +msgstr "-c %s ì˜µì…˜ì€ í•´ë‹¹ ê°’ì„ ì§€ì •í•´ì•¼ 합니다" -#: bootstrap/bootstrap.c:304 postmaster/postmaster.c:859 -#: postmaster/postmaster.c:872 +#: bootstrap/bootstrap.c:282 postmaster/postmaster.c:746 +#: postmaster/postmaster.c:759 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "ìžì œí•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보십시오.\n" -#: bootstrap/bootstrap.c:313 +#: bootstrap/bootstrap.c:291 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s: ìž˜ëª»ëœ ëª…ë ¹í–‰ ì¸ìž\n" -#: catalog/aclchk.c:181 +#: catalog/aclchk.c:211 #, c-format msgid "grant options can only be granted to roles" msgstr "grant ì˜µì…˜ë“¤ì€ ë¡¤ì—서만 ì§€ì •ë  ìˆ˜ 있습니다" -#: catalog/aclchk.c:300 +#: catalog/aclchk.c:333 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "\"%s\" 칼럼(해당 릴레ì´ì…˜: \"%s\")ì— ëŒ€í•œ ê¶Œí•œì´ ë¶€ì—¬ë˜ì§€ 않았ìŒ" -#: catalog/aclchk.c:305 +#: catalog/aclchk.c:338 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "\"%s\"ì— ëŒ€í•œ ê¶Œí•œì´ ë¶€ì—¬ë˜ì§€ 않았ìŒ" -#: catalog/aclchk.c:313 +#: catalog/aclchk.c:346 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "\"%s\" 칼럼(해당 릴레ì´ì…˜: \"%s\")ì— ëŒ€í•œ ì¼ë¶€ ê¶Œí•œì´ ë¶€ì—¬ë˜ì§€ 않았ìŒ" -#: catalog/aclchk.c:318 +#: catalog/aclchk.c:351 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "\"%s\"ì— ëŒ€í•œ ì¼ë¶€ ê¶Œí•œì´ ë¶€ì—¬ë˜ì§€ 않았ìŒ" -#: catalog/aclchk.c:329 +#: catalog/aclchk.c:362 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "\"%s\" 칼럼(해당 릴레ì´ì…˜: \"%s\")ì— ëŒ€í•œ ê¶Œí•œì„ ì·¨ì†Œí•  수 ì—†ìŒ" -#: catalog/aclchk.c:334 +#: catalog/aclchk.c:367 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "\"%s\"ì— ëŒ€í•œ ê¶Œí•œì„ ì·¨ì†Œí•  수 ì—†ìŒ" -#: catalog/aclchk.c:342 +#: catalog/aclchk.c:375 #, c-format msgid "" "not all privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "\"%s\" 칼럼(해당 릴레ì´ì…˜: \"%s\")ì˜ ì¼ë¶€ ê¶Œí•œì„ ë°•íƒˆí•  수 ì—†ìŒ" -#: catalog/aclchk.c:347 +#: catalog/aclchk.c:380 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "\"%s\"ì— ëŒ€í•œ ì¼ë¶€ ê¶Œí•œì„ ì·¨ì†Œí•  수 ì—†ìŒ" -#: catalog/aclchk.c:430 catalog/aclchk.c:973 +#: catalog/aclchk.c:412 +#, c-format +msgid "grantor must be current user" +msgstr "권한 수여ìžëŠ” 현재 사용ìžì—¬ì•¼í•©ë‹ˆë‹¤" + +#: catalog/aclchk.c:480 catalog/aclchk.c:1055 #, c-format msgid "invalid privilege type %s for relation" msgstr "릴레ì´ì…˜ì˜ %s ê¶Œí•œì€ ìž˜ëª»ëœ ì¢…ë¥˜ìž„" -#: catalog/aclchk.c:434 catalog/aclchk.c:977 +#: catalog/aclchk.c:484 catalog/aclchk.c:1059 #, c-format msgid "invalid privilege type %s for sequence" msgstr "ì‹œí€€ìŠ¤ì˜ %s ê¶Œí•œì€ ìž˜ëª»ëœ ì¢…ë¥˜ìž„" -#: catalog/aclchk.c:438 +#: catalog/aclchk.c:488 #, c-format msgid "invalid privilege type %s for database" msgstr "%s ê¶Œí•œì€ ë°ì´í„°ë² ì´ìФì—는 사용할 수 ì—†ì€ ê¶Œí•œ 형태임" -#: catalog/aclchk.c:442 +#: catalog/aclchk.c:492 #, c-format msgid "invalid privilege type %s for domain" msgstr "%s ê¶Œí•œì€ ë„ë©”ì¸ì—서 유효하지 않ìŒ" -#: catalog/aclchk.c:446 catalog/aclchk.c:981 +#: catalog/aclchk.c:496 catalog/aclchk.c:1063 #, c-format msgid "invalid privilege type %s for function" msgstr "%s ê¶Œí•œì€ í•¨ìˆ˜ì—서 사용할 수 ì—†ì€ ê¶Œí•œ 형태임" -#: catalog/aclchk.c:450 +#: catalog/aclchk.c:500 #, c-format msgid "invalid privilege type %s for language" msgstr "%s ê¶Œí•œì€ í”„ë¡œì‹œì£¼ì–¼ 언어ì—서 사용할 수 ì—†ì€ ê¶Œí•œ 형태임" -#: catalog/aclchk.c:454 +#: catalog/aclchk.c:504 #, c-format msgid "invalid privilege type %s for large object" msgstr "%s ê¶Œí•œì€ ëŒ€í˜• 개체ì—서 사용할 수 ì—†ì€ ê¶Œí•œ 형태임" -#: catalog/aclchk.c:458 catalog/aclchk.c:997 +#: catalog/aclchk.c:508 catalog/aclchk.c:1079 #, c-format msgid "invalid privilege type %s for schema" msgstr "%s ê¶Œí•œì€ ìŠ¤í‚¤ë§ˆ(schema)ì—서 사용할 수 ì—†ì€ ê¶Œí•œ 형태임" -#: catalog/aclchk.c:462 catalog/aclchk.c:985 +#: catalog/aclchk.c:512 catalog/aclchk.c:1067 #, c-format msgid "invalid privilege type %s for procedure" msgstr "프로시져용 %s 권한 종류가 잘못ë¨" -#: catalog/aclchk.c:466 catalog/aclchk.c:989 +#: catalog/aclchk.c:516 catalog/aclchk.c:1071 #, c-format msgid "invalid privilege type %s for routine" msgstr "루틴용 %s 권한 종류가 잘못ë¨" -#: catalog/aclchk.c:470 +#: catalog/aclchk.c:520 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "%s ê¶Œí•œì€ í…Œì´ë¸”스페ì´ìФì—서 사용할 수 ì—†ì€ ê¶Œí•œ 형태임" -#: catalog/aclchk.c:474 catalog/aclchk.c:993 +#: catalog/aclchk.c:524 catalog/aclchk.c:1075 #, c-format msgid "invalid privilege type %s for type" msgstr "%s ê¶Œí•œì€ ìžë£Œí˜•ì—서 사용할 수 ì—†ì€ ê¶Œí•œ 형태임" -#: catalog/aclchk.c:478 +#: catalog/aclchk.c:528 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "%s 권한 형ì‹ì€ 외부 ë°ì´í„° 래í¼ì— 유효하지 않ìŒ" -#: catalog/aclchk.c:482 +#: catalog/aclchk.c:532 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "%s 권한 형ì‹ì€ 외부 ì„œë²„ì— ìœ íš¨í•˜ì§€ 않ìŒ" -#: catalog/aclchk.c:521 +#: catalog/aclchk.c:536 +#, c-format +msgid "invalid privilege type %s for parameter" +msgstr "ìž˜ëª»ëœ í™˜ê²½ 설정 매개 변수용 권한 형태: %s" + +#: catalog/aclchk.c:575 #, c-format msgid "column privileges are only valid for relations" msgstr "칼럼 ê¶Œí•œì€ ë¦´ë ˆì´ì…˜ì—서만 유효함" -#: catalog/aclchk.c:681 catalog/aclchk.c:4100 catalog/aclchk.c:4882 -#: catalog/objectaddress.c:965 catalog/pg_largeobject.c:116 -#: storage/large_object/inv_api.c:285 +#: catalog/aclchk.c:738 catalog/aclchk.c:3629 catalog/objectaddress.c:1054 +#: catalog/pg_largeobject.c:113 storage/large_object/inv_api.c:285 #, c-format msgid "large object %u does not exist" msgstr "%u large object ì—†ìŒ" -#: catalog/aclchk.c:910 catalog/aclchk.c:919 commands/collationcmds.c:118 -#: commands/copy.c:1134 commands/copy.c:1154 commands/copy.c:1163 -#: commands/copy.c:1172 commands/copy.c:1181 commands/copy.c:1190 -#: commands/copy.c:1199 commands/copy.c:1208 commands/copy.c:1226 -#: commands/copy.c:1242 commands/copy.c:1262 commands/copy.c:1279 -#: commands/dbcommands.c:157 commands/dbcommands.c:166 -#: commands/dbcommands.c:175 commands/dbcommands.c:184 -#: commands/dbcommands.c:193 commands/dbcommands.c:202 -#: commands/dbcommands.c:211 commands/dbcommands.c:220 -#: commands/dbcommands.c:229 commands/dbcommands.c:238 -#: commands/dbcommands.c:260 commands/dbcommands.c:1502 -#: commands/dbcommands.c:1511 commands/dbcommands.c:1520 -#: commands/dbcommands.c:1529 commands/extension.c:1735 -#: commands/extension.c:1745 commands/extension.c:1755 -#: commands/extension.c:3055 commands/foreigncmds.c:539 -#: commands/foreigncmds.c:548 commands/functioncmds.c:570 -#: commands/functioncmds.c:736 commands/functioncmds.c:745 -#: commands/functioncmds.c:754 commands/functioncmds.c:763 -#: commands/functioncmds.c:2014 commands/functioncmds.c:2022 -#: commands/publicationcmds.c:90 commands/publicationcmds.c:133 -#: commands/sequence.c:1267 commands/sequence.c:1277 commands/sequence.c:1287 -#: commands/sequence.c:1297 commands/sequence.c:1307 commands/sequence.c:1317 -#: commands/sequence.c:1327 commands/sequence.c:1337 commands/sequence.c:1347 -#: commands/subscriptioncmds.c:104 commands/subscriptioncmds.c:114 -#: commands/subscriptioncmds.c:124 commands/subscriptioncmds.c:134 -#: commands/subscriptioncmds.c:148 commands/subscriptioncmds.c:159 -#: commands/subscriptioncmds.c:173 commands/tablecmds.c:7102 -#: commands/typecmds.c:322 commands/typecmds.c:1355 commands/typecmds.c:1364 -#: commands/typecmds.c:1372 commands/typecmds.c:1380 commands/typecmds.c:1388 -#: commands/user.c:133 commands/user.c:147 commands/user.c:156 -#: commands/user.c:165 commands/user.c:174 commands/user.c:183 -#: commands/user.c:192 commands/user.c:201 commands/user.c:210 -#: commands/user.c:219 commands/user.c:228 commands/user.c:237 -#: commands/user.c:246 commands/user.c:582 commands/user.c:590 -#: commands/user.c:598 commands/user.c:606 commands/user.c:614 -#: commands/user.c:622 commands/user.c:630 commands/user.c:638 -#: commands/user.c:647 commands/user.c:655 commands/user.c:663 -#: parser/parse_utilcmd.c:387 replication/pgoutput/pgoutput.c:141 -#: replication/pgoutput/pgoutput.c:162 replication/walsender.c:886 -#: replication/walsender.c:897 replication/walsender.c:907 -#, c-format -msgid "conflicting or redundant options" -msgstr "ìƒì¶©í•˜ê±°ë‚˜ ì¤‘ë³µëœ ì˜µì…˜ë“¤" - -#: catalog/aclchk.c:1030 +#: catalog/aclchk.c:1112 #, c-format msgid "default privileges cannot be set for columns" msgstr "default privileges ì„¤ì •ì€ ì¹¼ëŸ¼ 대ìƒìœ¼ë¡œ í•  수 ì—†ìŒ" -#: catalog/aclchk.c:1190 +#: catalog/aclchk.c:1148 +#, c-format +msgid "permission denied to change default privileges" +msgstr "default privileges 변경 권한 ì—†ìŒ" + +#: catalog/aclchk.c:1266 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "GRANT/REVOKE ON SCHEMAS êµ¬ë¬¸ì„ ì“¸ 때는 IN SCHEMA êµ¬ë¬¸ì„ ì“¸ 수 ì—†ìŒ" -#: catalog/aclchk.c:1558 catalog/catalog.c:506 catalog/objectaddress.c:1427 -#: commands/analyze.c:389 commands/copy.c:5080 commands/sequence.c:1702 -#: commands/tablecmds.c:6578 commands/tablecmds.c:6721 -#: commands/tablecmds.c:6771 commands/tablecmds.c:6845 -#: commands/tablecmds.c:6915 commands/tablecmds.c:7027 -#: commands/tablecmds.c:7121 commands/tablecmds.c:7180 -#: commands/tablecmds.c:7253 commands/tablecmds.c:7282 -#: commands/tablecmds.c:7437 commands/tablecmds.c:7519 -#: commands/tablecmds.c:7612 commands/tablecmds.c:7767 -#: commands/tablecmds.c:10972 commands/tablecmds.c:11154 -#: commands/tablecmds.c:11314 commands/tablecmds.c:12397 commands/trigger.c:876 -#: parser/analyze.c:2339 parser/parse_relation.c:713 parser/parse_target.c:1036 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3289 -#: parser/parse_utilcmd.c:3324 parser/parse_utilcmd.c:3366 utils/adt/acl.c:2870 -#: utils/adt/ruleutils.c:2535 +#: catalog/aclchk.c:1617 catalog/catalog.c:659 catalog/objectaddress.c:1523 +#: catalog/pg_publication.c:528 commands/analyze.c:380 commands/copy.c:951 +#: commands/sequence.c:1655 commands/tablecmds.c:7541 commands/tablecmds.c:7695 +#: commands/tablecmds.c:7745 commands/tablecmds.c:7819 +#: commands/tablecmds.c:7889 commands/tablecmds.c:8019 +#: commands/tablecmds.c:8148 commands/tablecmds.c:8242 +#: commands/tablecmds.c:8343 commands/tablecmds.c:8470 +#: commands/tablecmds.c:8500 commands/tablecmds.c:8642 +#: commands/tablecmds.c:8735 commands/tablecmds.c:8869 +#: commands/tablecmds.c:8981 commands/tablecmds.c:12797 +#: commands/tablecmds.c:12989 commands/tablecmds.c:13150 +#: commands/tablecmds.c:14339 commands/tablecmds.c:16966 commands/trigger.c:942 +#: parser/analyze.c:2530 parser/parse_relation.c:737 parser/parse_target.c:1067 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3409 +#: parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2923 +#: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "\"%s\" ì¹¼ëŸ¼ì€ \"%s\" 릴레ì´ì…˜(relation)ì— ì—†ìŒ" -#: catalog/aclchk.c:1821 catalog/objectaddress.c:1267 commands/sequence.c:1140 -#: commands/tablecmds.c:236 commands/tablecmds.c:15706 utils/adt/acl.c:2060 -#: utils/adt/acl.c:2090 utils/adt/acl.c:2122 utils/adt/acl.c:2154 -#: utils/adt/acl.c:2182 utils/adt/acl.c:2212 +#: catalog/aclchk.c:1862 +#, c-format +msgid "\"%s\" is an index" +msgstr "\"%s\" 개체는 ì¸ë±ìŠ¤ìž„" + +#: catalog/aclchk.c:1869 commands/tablecmds.c:14496 commands/tablecmds.c:17882 +#, c-format +msgid "\"%s\" is a composite type" +msgstr "\"%s\" 개체는 복합 ìžë£Œí˜•입니다" + +#: catalog/aclchk.c:1877 catalog/objectaddress.c:1363 commands/tablecmds.c:263 +#: commands/tablecmds.c:17846 utils/adt/acl.c:2107 utils/adt/acl.c:2137 +#: utils/adt/acl.c:2170 utils/adt/acl.c:2206 utils/adt/acl.c:2237 +#: utils/adt/acl.c:2268 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\" 시퀀스가 아님" -#: catalog/aclchk.c:1859 +#: catalog/aclchk.c:1915 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "\"%s\" 시퀀스는 USAGE, SELECT ë° UPDATE 권한만 ì§€ì›í•¨" -#: catalog/aclchk.c:1876 +#: catalog/aclchk.c:1932 #, c-format msgid "invalid privilege type %s for table" msgstr "%s ê¶Œí•œì€ í…Œì´ë¸”ì—서 사용할 수 ì—†ì€ ê¶Œí•œ 형태임" -#: catalog/aclchk.c:2042 +#: catalog/aclchk.c:2097 #, c-format msgid "invalid privilege type %s for column" msgstr "%s 권한 형ì‹ì€ 칼럼ì—서 유효하지 않ìŒ" -#: catalog/aclchk.c:2055 +#: catalog/aclchk.c:2110 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "\"%s\" 시퀀스는 SELECT ì—´ 권한만 ì§€ì›í•¨" -#: catalog/aclchk.c:2637 +#: catalog/aclchk.c:2301 #, c-format msgid "language \"%s\" is not trusted" msgstr "\"%s\" 프로시주얼 언어는 안전하지 못합니다" -#: catalog/aclchk.c:2639 +#: catalog/aclchk.c:2303 #, c-format msgid "" "GRANT and REVOKE are not allowed on untrusted languages, because only " @@ -3857,526 +4782,478 @@ msgstr "" "안전하지 ì•Šì€ í”„ë¡œì‹œì ¸ ì–¸ì–´ì— ëŒ€í•´ì„œëŠ” GRANT ë˜ëŠ” REVOKE ìž‘ì—…ì„ í—ˆìš©í•˜ì§€ 않습" "니다, 안전하지 ì•Šì€ í”„ë¡œì‹œì ¸ 언어는 슈í¼ìœ ì €ë§Œ 사용할 수 있기 때문입니다." -#: catalog/aclchk.c:3153 +#: catalog/aclchk.c:2454 #, c-format msgid "cannot set privileges of array types" msgstr "배열형 ìžë£Œí˜•ì— ê¶Œí•œ ì„¤ì •ì„ í•  수 ì—†ìŒ" -#: catalog/aclchk.c:3154 +#: catalog/aclchk.c:2455 #, c-format msgid "Set the privileges of the element type instead." msgstr "ê·¸ ë°°ì—´ ìš”ì†Œì— í•´ë‹¹í•˜ëŠ” ìžë£Œí˜•ì— ëŒ€í•´ì„œ ì ‘ê·¼ 권한 ì„¤ì •ì„ í•˜ì„¸ìš”." -#: catalog/aclchk.c:3161 catalog/objectaddress.c:1561 +#: catalog/aclchk.c:2459 +#, c-format +msgid "cannot set privileges of multirange types" +msgstr "다중 범위 ìžë£Œí˜•ì— ê¶Œí•œ ì„¤ì •ì„ í•  수 ì—†ìŒ" + +#: catalog/aclchk.c:2460 +#, c-format +msgid "Set the privileges of the range type instead." +msgstr "해당하는 범위 ìžë£Œí˜•ì— ëŒ€í•´ì„œ ì ‘ê·¼ 권한 ì„¤ì •ì„ í•˜ì„¸ìš”." + +#: catalog/aclchk.c:2467 catalog/objectaddress.c:1629 #, c-format msgid "\"%s\" is not a domain" msgstr "\"%s\" ì´ë¦„ì˜ ê°œì²´ëŠ” ë„ë©”ì¸ì´ 아닙니다" -#: catalog/aclchk.c:3281 +#: catalog/aclchk.c:2653 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "알 수 없는 권한 타입 \"%s\"" -#: catalog/aclchk.c:3342 +#: catalog/aclchk.c:2720 #, c-format msgid "permission denied for aggregate %s" msgstr "%s ì§‘ê³„í•¨ìˆ˜ì— ëŒ€í•œ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3345 +#: catalog/aclchk.c:2723 #, c-format msgid "permission denied for collation %s" msgstr "%s 정렬정ì˜(collation) ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3348 +#: catalog/aclchk.c:2726 #, c-format msgid "permission denied for column %s" msgstr "%s ì¹¼ëŸ¼ì— ëŒ€í•œ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3351 +#: catalog/aclchk.c:2729 #, c-format msgid "permission denied for conversion %s" msgstr "%s 문ìžì½”드변환규칙(conversion) ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3354 +#: catalog/aclchk.c:2732 #, c-format msgid "permission denied for database %s" msgstr "%s ë°ì´í„°ë² ì´ìФ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3357 +#: catalog/aclchk.c:2735 #, c-format msgid "permission denied for domain %s" msgstr "%s ë„ë©”ì¸ì— 대한 ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3360 +#: catalog/aclchk.c:2738 #, c-format msgid "permission denied for event trigger %s" msgstr "%s ì´ë²¤íЏ 트리거 ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3363 +#: catalog/aclchk.c:2741 #, c-format msgid "permission denied for extension %s" msgstr "%s 확장 모듈 ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3366 +#: catalog/aclchk.c:2744 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "%s 외부 ë°ì´í„° ëž˜í¼ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3369 +#: catalog/aclchk.c:2747 #, c-format msgid "permission denied for foreign server %s" msgstr "%s 외부 서버 ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3372 +#: catalog/aclchk.c:2750 #, c-format msgid "permission denied for foreign table %s" msgstr "%s 외부 í…Œì´ë¸” ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3375 +#: catalog/aclchk.c:2753 #, c-format msgid "permission denied for function %s" msgstr "%s 함수 ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3378 +#: catalog/aclchk.c:2756 #, c-format msgid "permission denied for index %s" msgstr "%s ì¸ë±ìФ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3381 +#: catalog/aclchk.c:2759 #, c-format msgid "permission denied for language %s" msgstr "%s 프로시주얼 언어 ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3384 +#: catalog/aclchk.c:2762 #, c-format msgid "permission denied for large object %s" msgstr "%s 대형 개체 ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3387 +#: catalog/aclchk.c:2765 #, c-format msgid "permission denied for materialized view %s" msgstr "%s êµ¬ì²´í™”ëœ ë·°ì— ëŒ€í•œ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3390 +#: catalog/aclchk.c:2768 #, c-format msgid "permission denied for operator class %s" msgstr "%s ì—°ì‚°ìž í´ëž˜ìФ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3393 +#: catalog/aclchk.c:2771 #, c-format msgid "permission denied for operator %s" msgstr "%s ì—°ì‚°ìž ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3396 +#: catalog/aclchk.c:2774 #, c-format msgid "permission denied for operator family %s" msgstr "%s ì—°ì‚°ìž íŒ¨ë°€ë¦¬ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3399 +#: catalog/aclchk.c:2777 +#, c-format +msgid "permission denied for parameter %s" +msgstr "%s 환경 설정 매개 변수 ì ‘ê·¼ 권한 ì—†ìŒ" + +#: catalog/aclchk.c:2780 #, c-format msgid "permission denied for policy %s" msgstr "%s ì •ì±…ì— ëŒ€í•œ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3402 +#: catalog/aclchk.c:2783 #, c-format msgid "permission denied for procedure %s" msgstr "%s í”„ë¡œì‹œì ¸ì— ëŒ€í•œ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3405 +#: catalog/aclchk.c:2786 #, c-format msgid "permission denied for publication %s" msgstr "%s 발행 ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3408 +#: catalog/aclchk.c:2789 #, c-format msgid "permission denied for routine %s" msgstr "%s ë£¨í‹´ì— ëŒ€í•œ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3411 +#: catalog/aclchk.c:2792 #, c-format msgid "permission denied for schema %s" msgstr "%s 스키마(schema) ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3414 commands/sequence.c:610 commands/sequence.c:844 -#: commands/sequence.c:886 commands/sequence.c:927 commands/sequence.c:1800 -#: commands/sequence.c:1864 +#: catalog/aclchk.c:2795 commands/sequence.c:654 commands/sequence.c:880 +#: commands/sequence.c:922 commands/sequence.c:963 commands/sequence.c:1753 +#: commands/sequence.c:1799 #, c-format msgid "permission denied for sequence %s" msgstr "%s 시퀀스 ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3417 +#: catalog/aclchk.c:2798 #, c-format msgid "permission denied for statistics object %s" msgstr "%s 개체 통계정보 ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3420 +#: catalog/aclchk.c:2801 #, c-format msgid "permission denied for subscription %s" msgstr "%s êµ¬ë… ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3423 +#: catalog/aclchk.c:2804 #, c-format msgid "permission denied for table %s" msgstr "%s í…Œì´ë¸”ì— ëŒ€í•œ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3426 +#: catalog/aclchk.c:2807 #, c-format msgid "permission denied for tablespace %s" msgstr "%s í…Œì´ë¸”스페ì´ìФ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3429 +#: catalog/aclchk.c:2810 #, c-format msgid "permission denied for text search configuration %s" msgstr "%s 전문 검색 구성 ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3432 +#: catalog/aclchk.c:2813 #, c-format msgid "permission denied for text search dictionary %s" msgstr "%s 전문 검색 사전 ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3435 +#: catalog/aclchk.c:2816 #, c-format msgid "permission denied for type %s" msgstr "%s ìžë£Œí˜• ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3438 +#: catalog/aclchk.c:2819 #, c-format msgid "permission denied for view %s" msgstr "%s ë·°ì— ëŒ€í•œ ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3473 +#: catalog/aclchk.c:2855 #, c-format msgid "must be owner of aggregate %s" msgstr "%s ì§‘ê³„í•¨ìˆ˜ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3476 +#: catalog/aclchk.c:2858 #, c-format msgid "must be owner of collation %s" msgstr "%s 정렬정ì˜(collation)ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3479 +#: catalog/aclchk.c:2861 #, c-format msgid "must be owner of conversion %s" msgstr "%s 문ìžì½”드변환규칙(conversion)ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3482 +#: catalog/aclchk.c:2864 #, c-format msgid "must be owner of database %s" msgstr "%s ë°ì´í„°ë² ì´ìŠ¤ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3485 +#: catalog/aclchk.c:2867 #, c-format msgid "must be owner of domain %s" msgstr "%s ë„ë©”ì¸ì˜ 소유주여야만 합니다" -#: catalog/aclchk.c:3488 +#: catalog/aclchk.c:2870 #, c-format msgid "must be owner of event trigger %s" msgstr "%s ì´ë²¤íЏ íŠ¸ë¦¬ê±°ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3491 +#: catalog/aclchk.c:2873 #, c-format msgid "must be owner of extension %s" msgstr "%s 확장 ëª¨ë“ˆì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3494 +#: catalog/aclchk.c:2876 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "%s 외부 ë°ì´í„° 래í¼ì˜ 소유주여야 함" -#: catalog/aclchk.c:3497 +#: catalog/aclchk.c:2879 #, c-format msgid "must be owner of foreign server %s" msgstr "%s 외부 ì„œë²„ì˜ ì†Œìœ ì£¼ì—¬ì•¼ 함" -#: catalog/aclchk.c:3500 +#: catalog/aclchk.c:2882 #, c-format msgid "must be owner of foreign table %s" msgstr "%s 외부 í…Œì´ë¸”ì˜ ì†Œìœ ì£¼ì—¬ì•¼ 함" -#: catalog/aclchk.c:3503 +#: catalog/aclchk.c:2885 #, c-format msgid "must be owner of function %s" msgstr "%s í•¨ìˆ˜ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3506 +#: catalog/aclchk.c:2888 #, c-format msgid "must be owner of index %s" msgstr "%s ì¸ë±ìŠ¤ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3509 +#: catalog/aclchk.c:2891 #, c-format msgid "must be owner of language %s" msgstr "%s 프로시주얼 ì–¸ì–´ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3512 +#: catalog/aclchk.c:2894 #, c-format msgid "must be owner of large object %s" msgstr "%s 대형 ê°œì²´ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3515 +#: catalog/aclchk.c:2897 #, c-format msgid "must be owner of materialized view %s" msgstr "%s êµ¬ì²´í™”ëœ ë·°ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3518 +#: catalog/aclchk.c:2900 #, c-format msgid "must be owner of operator class %s" msgstr "%s ì—°ì‚°ìž í´ëž˜ìŠ¤ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3521 +#: catalog/aclchk.c:2903 #, c-format msgid "must be owner of operator %s" msgstr "%s ì—°ì‚°ìžì˜ 소유주여야만 합니다" -#: catalog/aclchk.c:3524 +#: catalog/aclchk.c:2906 #, c-format msgid "must be owner of operator family %s" msgstr "%s ì—°ì‚°ìž íŒ¨ë°€ë¦¬ì˜ ì†Œìœ ì£¼ì—¬ì•¼ 함" -#: catalog/aclchk.c:3527 +#: catalog/aclchk.c:2909 #, c-format msgid "must be owner of procedure %s" msgstr "%s í”„ë¡œì‹œì ¸ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3530 +#: catalog/aclchk.c:2912 #, c-format msgid "must be owner of publication %s" msgstr "%s ë°œí–‰ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3533 +#: catalog/aclchk.c:2915 #, c-format msgid "must be owner of routine %s" msgstr "%s ë£¨í‹´ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3536 +#: catalog/aclchk.c:2918 #, c-format msgid "must be owner of sequence %s" msgstr "%s ì‹œí€€ìŠ¤ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3539 +#: catalog/aclchk.c:2921 #, c-format msgid "must be owner of subscription %s" msgstr "%s 구ë…ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3542 +#: catalog/aclchk.c:2924 #, c-format msgid "must be owner of table %s" msgstr "%s í…Œì´ë¸”ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3545 +#: catalog/aclchk.c:2927 #, c-format msgid "must be owner of type %s" msgstr "%s ìžë£Œí˜•ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3548 +#: catalog/aclchk.c:2930 #, c-format msgid "must be owner of view %s" msgstr "%s ë·°ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3551 +#: catalog/aclchk.c:2933 #, c-format msgid "must be owner of schema %s" msgstr "%s 스키마(schema)ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3554 +#: catalog/aclchk.c:2936 #, c-format msgid "must be owner of statistics object %s" msgstr "%s 통계정보 ê°œì²´ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3557 +#: catalog/aclchk.c:2939 #, c-format msgid "must be owner of tablespace %s" msgstr "%s í…Œì´ë¸”스페ì´ìŠ¤ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3560 +#: catalog/aclchk.c:2942 #, c-format msgid "must be owner of text search configuration %s" msgstr "%s 전문 검색 êµ¬ì„±ì˜ ì†Œìœ ì£¼ì—¬ì•¼ 함" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:2945 #, c-format msgid "must be owner of text search dictionary %s" msgstr "%s 전문 검색 ì‚¬ì „ì˜ ì†Œìœ ì£¼ì—¬ì•¼ 함" -#: catalog/aclchk.c:3577 +#: catalog/aclchk.c:2959 #, c-format msgid "must be owner of relation %s" msgstr "%s 릴레ì´ì…˜(relation)ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/aclchk.c:3621 +#: catalog/aclchk.c:3005 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "\"%s\" 칼럼(해당 릴레ì´ì…˜: \"%s\") ì ‘ê·¼ 권한 ì—†ìŒ" -#: catalog/aclchk.c:3742 catalog/aclchk.c:3750 +#: catalog/aclchk.c:3162 catalog/aclchk.c:4170 catalog/aclchk.c:4201 +#, c-format +msgid "%s with OID %u does not exist" +msgstr "%s (해당 OID %u) ì—†ìŒ" + +#: catalog/aclchk.c:3245 catalog/aclchk.c:3264 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "%d번째 ì†ì„±(해당 릴레ì´ì…˜ OID: %u)ì´ ì—†ìŒ" -#: catalog/aclchk.c:3823 catalog/aclchk.c:4733 +#: catalog/aclchk.c:3302 catalog/aclchk.c:3365 catalog/aclchk.c:4004 #, c-format msgid "relation with OID %u does not exist" msgstr "OID %u 릴레ì´ì…˜(relation) ì—†ìŒ" -#: catalog/aclchk.c:3913 catalog/aclchk.c:5151 -#, c-format -msgid "database with OID %u does not exist" -msgstr "OID %u ë°ì´í„°ë² ì´ìФ ì—†ìŒ" - -#: catalog/aclchk.c:3967 catalog/aclchk.c:4811 tcop/fastpath.c:221 -#: utils/fmgr/fmgr.c:2055 -#, c-format -msgid "function with OID %u does not exist" -msgstr "OID %u 함수 ì—†ìŒ" - -#: catalog/aclchk.c:4021 catalog/aclchk.c:4837 +#: catalog/aclchk.c:3550 #, c-format -msgid "language with OID %u does not exist" -msgstr "OID %u 언어 ì—†ìŒ" +msgid "parameter ACL with OID %u does not exist" +msgstr "OID %u 환경 설정 매개 변수 ACLì´ ì—†ìŒ" -#: catalog/aclchk.c:4185 catalog/aclchk.c:4909 +#: catalog/aclchk.c:3723 commands/collationcmds.c:853 +#: commands/publicationcmds.c:1739 #, c-format msgid "schema with OID %u does not exist" msgstr "OID %u 스키마 ì—†ìŒ" -#: catalog/aclchk.c:4239 catalog/aclchk.c:4936 utils/adt/genfile.c:686 -#, c-format -msgid "tablespace with OID %u does not exist" -msgstr "OID %u í…Œì´ë¸”스페ì´ìФ ì—†ìŒ" - -#: catalog/aclchk.c:4298 catalog/aclchk.c:5070 commands/foreigncmds.c:325 -#, c-format -msgid "foreign-data wrapper with OID %u does not exist" -msgstr "OIDê°€ %uì¸ ì™¸ë¶€ ë°ì´í„° 래í¼ê°€ ì—†ìŒ" - -#: catalog/aclchk.c:4360 catalog/aclchk.c:5097 commands/foreigncmds.c:462 -#, c-format -msgid "foreign server with OID %u does not exist" -msgstr "OIDê°€ %uì¸ ì™¸ë¶€ 서버가 ì—†ìŒ" - -#: catalog/aclchk.c:4420 catalog/aclchk.c:4759 utils/cache/typcache.c:378 -#: utils/cache/typcache.c:432 +#: catalog/aclchk.c:3797 catalog/aclchk.c:3824 catalog/aclchk.c:3853 +#: utils/cache/typcache.c:392 utils/cache/typcache.c:447 #, c-format msgid "type with OID %u does not exist" msgstr "OID %u ìžë£Œí˜• ì—†ìŒ" -#: catalog/aclchk.c:4785 -#, c-format -msgid "operator with OID %u does not exist" -msgstr "OID %u ì—°ì‚°ìž ì—†ìŒ" - -#: catalog/aclchk.c:4962 -#, c-format -msgid "operator class with OID %u does not exist" -msgstr "OID %u ì—°ì‚°ìž í´ëž˜ìФ ì—†ìŒ" - -#: catalog/aclchk.c:4989 -#, c-format -msgid "operator family with OID %u does not exist" -msgstr "OIDê°€ %uì¸ ì—°ì‚°ìž íŒ¨ë°€ë¦¬ê°€ ì—†ìŒ" - -#: catalog/aclchk.c:5016 -#, c-format -msgid "text search dictionary with OID %u does not exist" -msgstr "OIDê°€ %uì¸ ì „ë¬¸ 검색 ì‚¬ì „ì´ ì—†ìŒ" - -#: catalog/aclchk.c:5043 -#, c-format -msgid "text search configuration with OID %u does not exist" -msgstr "OIDê°€ %uì¸ í…스트 검색 êµ¬ì„±ì´ ì—†ìŒ" - -#: catalog/aclchk.c:5124 commands/event_trigger.c:475 -#, c-format -msgid "event trigger with OID %u does not exist" -msgstr "OID %u ì´ë²¤íЏ 트리거가 ì—†ìŒ" - -#: catalog/aclchk.c:5177 commands/collationcmds.c:367 -#, c-format -msgid "collation with OID %u does not exist" -msgstr "OID %u 정렬정ì˜(collation) ì—†ìŒ" - -#: catalog/aclchk.c:5203 -#, c-format -msgid "conversion with OID %u does not exist" -msgstr "OID %u ì¸ì½”딩 변환규칙(conversion) ì—†ìŒ" - -#: catalog/aclchk.c:5244 -#, c-format -msgid "extension with OID %u does not exist" -msgstr "OID %u 확장 ëª¨ë“ˆì´ ì—†ìŒ" - -#: catalog/aclchk.c:5271 commands/publicationcmds.c:794 +#: catalog/catalog.c:477 #, c-format -msgid "publication with OID %u does not exist" -msgstr "OID %u 발행 ì—†ìŒ" +msgid "still searching for an unused OID in relation \"%s\"" +msgstr "\"%s\" 릴레ì´ì…˜ì—서 사용ë˜ì§€ 않는 OID를 여전히 찾는 중" -#: catalog/aclchk.c:5297 commands/subscriptioncmds.c:1112 +#: catalog/catalog.c:479 #, c-format -msgid "subscription with OID %u does not exist" -msgstr "OID %u êµ¬ë… ì—†ìŒ" +msgid "" +"OID candidates have been checked %llu time, but no unused OID has been found " +"yet." +msgid_plural "" +"OID candidates have been checked %llu times, but no unused OID has been " +"found yet." +msgstr[0] "" +"OID 후보를 뽑기 위해 %llu 번 시ë„했지만, ì•„ì§ ì‚¬ìš©ë˜ì§€ 않는 OID를 찾지 못함" -#: catalog/aclchk.c:5323 +#: catalog/catalog.c:504 #, c-format -msgid "statistics object with OID %u does not exist" -msgstr "OID %u 통계정보 개체 ì—†ìŒ" +msgid "new OID has been assigned in relation \"%s\" after %llu retry" +msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" +msgstr[0] "\"%s\" 릴레ì´ì…˜ì˜ 새 OID를 %llu ì‹œë„ ëì— ë°°ì •í•¨" -#: catalog/catalog.c:485 +#: catalog/catalog.c:637 catalog/catalog.c:704 #, c-format -msgid "must be superuser to call pg_nextoid()" -msgstr "pg_nextoid() 함수를 호출 하려면 슈í¼ìœ ì ¸ì—¬ì•¼í•¨" +msgid "must be superuser to call %s()" +msgstr "%s() í˜¸ì¶œì€ ìŠˆí¼ìœ ì €ë§Œ í•  수 있ìŒ" -#: catalog/catalog.c:493 +#: catalog/catalog.c:646 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() 함수는 시스템 카탈로그 ëŒ€ìƒ ì „ìš©ìž„" -#: catalog/catalog.c:498 parser/parse_utilcmd.c:2191 +#: catalog/catalog.c:651 parser/parse_utilcmd.c:2270 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "\"%s\" ì¸ë±ìŠ¤ê°€ \"%s\" í…Œì´ë¸”ìš©ì´ ì•„ë‹˜" -#: catalog/catalog.c:515 +#: catalog/catalog.c:668 #, c-format msgid "column \"%s\" is not of type oid" msgstr "\"%s\" ì¹¼ëŸ¼ì€ oid ìžë£Œí˜•ì´ ì•„ë‹˜" -#: catalog/catalog.c:522 +#: catalog/catalog.c:675 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” \"%s\" 칼럼용 ì¸ë±ìŠ¤ê°€ 아님" -#: catalog/dependency.c:823 catalog/dependency.c:1061 +#: catalog/dependency.c:497 catalog/pg_shdepend.c:703 +#, c-format +msgid "cannot drop %s because it is required by the database system" +msgstr "%s 개체는 ë°ì´í„°ë² ì´ìФ 시스템ì—서 필요하기 ë•Œë¬¸ì— ì‚­ì œ ë  ìˆ˜ ì—†ìŒ" + +#: catalog/dependency.c:789 catalog/dependency.c:1016 #, c-format msgid "cannot drop %s because %s requires it" msgstr "%s 삭제할 수 ì—†ìŒ, %sì—서 필요로함" -#: catalog/dependency.c:825 catalog/dependency.c:1063 +#: catalog/dependency.c:791 catalog/dependency.c:1018 #, c-format msgid "You can drop %s instead." msgstr "대신ì—, drop %s ëª…ë ¹ì„ ì‚¬ìš©í•  수 있ìŒ." -#: catalog/dependency.c:933 catalog/pg_shdepend.c:640 -#, c-format -msgid "cannot drop %s because it is required by the database system" -msgstr "%s 개체는 ë°ì´í„°ë² ì´ìФ 시스템ì—서 필요하기 ë•Œë¬¸ì— ì‚­ì œ ë  ìˆ˜ ì—†ìŒ" - -#: catalog/dependency.c:1129 -#, c-format -msgid "drop auto-cascades to %s" -msgstr "%s 개체가 ìžë™ìœ¼ë¡œ ë©ë‹¬ì•„ ì‚­ì œë¨" - -#: catalog/dependency.c:1141 catalog/dependency.c:1150 +#: catalog/dependency.c:1097 catalog/dependency.c:1106 #, c-format msgid "%s depends on %s" msgstr "%s ì˜ì¡´ëŒ€ìƒ: %s" -#: catalog/dependency.c:1162 catalog/dependency.c:1171 +#: catalog/dependency.c:1121 catalog/dependency.c:1130 #, c-format msgid "drop cascades to %s" msgstr "%s 개체가 ë©ë‹¬ì•„ ì‚­ì œë¨" -#: catalog/dependency.c:1179 catalog/pg_shdepend.c:769 +#: catalog/dependency.c:1138 catalog/pg_shdepend.c:868 #, c-format msgid "" "\n" @@ -4388,93 +5265,98 @@ msgstr[0] "" "\n" "%d ê°œì˜ ê¸°íƒ€ ê°œì²´ë“¤ë„ í•¨ê»˜ 처리함 (목ë¡ì€ 서버 ë¡œê·¸ì— ê¸°ë¡ë¨)" -#: catalog/dependency.c:1191 +#: catalog/dependency.c:1150 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "기타 다른 ê°œì²´ë“¤ì´ ì´ ê°œì²´ì— ì˜ì¡´í•˜ê³  있어, %s 삭제할 수 ì—†ìŒ" -#: catalog/dependency.c:1193 catalog/dependency.c:1194 -#: catalog/dependency.c:1200 catalog/dependency.c:1201 -#: catalog/dependency.c:1212 catalog/dependency.c:1213 -#: commands/tablecmds.c:1249 commands/tablecmds.c:13016 commands/user.c:1093 -#: commands/view.c:495 libpq/auth.c:334 replication/syncrep.c:1032 -#: storage/lmgr/deadlock.c:1154 storage/lmgr/proc.c:1350 utils/adt/acl.c:5329 -#: utils/adt/jsonfuncs.c:614 utils/adt/jsonfuncs.c:620 utils/misc/guc.c:6771 -#: utils/misc/guc.c:6807 utils/misc/guc.c:6877 utils/misc/guc.c:10947 -#: utils/misc/guc.c:10981 utils/misc/guc.c:11015 utils/misc/guc.c:11049 -#: utils/misc/guc.c:11084 +#: catalog/dependency.c:1153 catalog/dependency.c:1160 +#: catalog/dependency.c:1171 commands/tablecmds.c:1459 +#: commands/tablecmds.c:15088 commands/tablespace.c:460 commands/user.c:1302 +#: commands/vacuum.c:211 commands/view.c:441 executor/execExprInterp.c:4655 +#: executor/execExprInterp.c:4663 libpq/auth.c:324 +#: replication/logical/applyparallelworker.c:1041 replication/syncrep.c:1011 +#: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1432 utils/misc/guc.c:3169 +#: utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6825 +#: utils/misc/guc.c:6859 utils/misc/guc.c:6893 utils/misc/guc.c:6936 +#: utils/misc/guc.c:6978 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1195 catalog/dependency.c:1202 +#: catalog/dependency.c:1154 catalog/dependency.c:1161 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "" "ì´ ê°œì²´ì™€ ê´€ê³„ëœ ëª¨ë“  ê°œì²´ë“¤ì„ í•¨ê»˜ 삭제하려면 DROP ... CASCADE ëª…ë ¹ì„ ì‚¬ìš©í•˜" "십시오" -#: catalog/dependency.c:1199 +#: catalog/dependency.c:1158 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "다른 개체가 ì›í•˜ëŠ” 개체를 사용하고 있으므로 해당 개체를 삭제할 수 ì—†ìŒ" -#. translator: %d always has a value larger than 1 -#: catalog/dependency.c:1208 +#: catalog/dependency.c:1166 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" msgstr[0] "%dê°œì˜ ë‹¤ë¥¸ ê°œì²´ì— ëŒ€í•œ 관련 항목 ì‚­ì œ" -#: catalog/dependency.c:1875 +#: catalog/dependency.c:1850 #, c-format msgid "constant of the type %s cannot be used here" msgstr "%s ìžë£Œí˜•ì€ ì—¬ê¸°ì„œ 사용할 수 ì—†ìŒ" -#: catalog/heap.c:330 +#: catalog/dependency.c:2375 parser/parse_relation.c:3407 +#: parser/parse_relation.c:3417 +#, c-format +msgid "column %d of relation \"%s\" does not exist" +msgstr "%d번째 ì¹¼ëŸ¼ì´ ì—†ìŠµë‹ˆë‹¤. 해당 릴레ì´ì…˜: \"%s\"" + +#: catalog/heap.c:325 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "\"%s.%s\" 만들 ê¶Œí•œì´ ì—†ìŒ" -#: catalog/heap.c:332 +#: catalog/heap.c:327 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "시스템 카탈로그 ë³€ê²½ì€ í˜„ìž¬ 허용하지 않습니다." -#: catalog/heap.c:500 commands/tablecmds.c:2145 commands/tablecmds.c:2745 -#: commands/tablecmds.c:6175 +#: catalog/heap.c:467 commands/tablecmds.c:2495 commands/tablecmds.c:2917 +#: commands/tablecmds.c:7163 #, c-format msgid "tables can have at most %d columns" msgstr "한 í…Œì´ë¸”ì— ì§€ì •í•  수 있는 최대 ì—´ 수는 %d입니다" -#: catalog/heap.c:518 commands/tablecmds.c:6468 +#: catalog/heap.c:485 commands/tablecmds.c:7432 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "\"%s\" ì—´ ì´ë¦„ì€ ì‹œìŠ¤í…œ ì—´ ì´ë¦„ê³¼ ì¶©ëŒí•©ë‹ˆë‹¤" -#: catalog/heap.c:534 +#: catalog/heap.c:501 #, c-format msgid "column name \"%s\" specified more than once" msgstr "\"%s\" 칼럼 ì´ë¦„ì´ ì—¬ëŸ¬ 번 지정ë¨" #. translator: first %s is an integer not a name -#: catalog/heap.c:609 +#: catalog/heap.c:579 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "\"%s\" 파티션 키 ì¹¼ëŸ¼ì€ %s ì˜ì‚¬ ìžë£Œí˜•(pseudo-type)ì„ ì‚¬ìš©í•©ë‹ˆë‹¤" -#: catalog/heap.c:614 +#: catalog/heap.c:584 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "\"%s\" ì¹¼ëŸ¼ì€ %s ì˜ì‚¬ ìžë£Œí˜•(pseudo-type)ì„ ì‚¬ìš©í•©ë‹ˆë‹¤" -#: catalog/heap.c:645 +#: catalog/heap.c:615 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "%s 복합 ìžë£Œí˜•ì€ ìžê¸° ìžì‹ ì˜ 구성ì›ìœ¼ë¡œ 만들 수 ì—†ìŒ" #. translator: first %s is an integer not a name -#: catalog/heap.c:700 +#: catalog/heap.c:670 #, c-format msgid "" "no collation was derived for partition key column %s with collatable type %s" @@ -4482,25 +5364,27 @@ msgstr "" "\"%s\" 파티션 키 ì¹¼ëŸ¼ì— ì‚¬ìš©í•˜ëŠ” %s ìžë£Œí˜•ì—서 사용할 ì •ë ¬ê·œì¹™ì„ ê²°ì •í•  수없" "습니다." -#: catalog/heap.c:706 commands/createas.c:203 commands/createas.c:486 +#: catalog/heap.c:676 commands/createas.c:198 commands/createas.c:505 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "" "\"%s\" ì¹¼ëŸ¼ì— ì‚¬ìš©í•˜ëŠ” %s ìžë£Œí˜•ì—서 사용할 ì •ë ¬ê·œì¹™ì„ ê²°ì •í•  수 없습니다." -#: catalog/heap.c:1155 catalog/index.c:865 commands/tablecmds.c:3520 +#: catalog/heap.c:1161 catalog/index.c:899 commands/createas.c:401 +#: commands/tablecmds.c:4171 #, c-format msgid "relation \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ë¦´ë ˆì´ì…˜(relation)ì´ ì´ë¯¸ 있습니다" -#: catalog/heap.c:1171 catalog/pg_type.c:428 catalog/pg_type.c:775 -#: commands/typecmds.c:238 commands/typecmds.c:250 commands/typecmds.c:719 -#: commands/typecmds.c:1125 commands/typecmds.c:1337 commands/typecmds.c:2124 +#: catalog/heap.c:1177 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: catalog/pg_type.c:977 commands/typecmds.c:253 commands/typecmds.c:265 +#: commands/typecmds.c:758 commands/typecmds.c:1179 commands/typecmds.c:1405 +#: commands/typecmds.c:1585 commands/typecmds.c:2556 #, c-format msgid "type \"%s\" already exists" msgstr "\"%s\" ìžë£Œí˜•ì´ ì´ë¯¸ 있습니다" -#: catalog/heap.c:1172 +#: catalog/heap.c:1178 #, c-format msgid "" "A relation has an associated type of the same name, so you must use a name " @@ -4509,92 +5393,119 @@ msgstr "" "í•˜ë‚˜ì˜ ë¦´ë ˆì´ì…˜ì€ ê·¸ ì´ë¦„ê³¼ ê°™ì€ ìžë£Œí˜•ê³¼ 관계합니다. 그래서, ì´ë¯¸ ê°™ì€ ì´ë¦„" "ì˜ ìžë£Œí˜•ì´ ìžˆë‹¤ë©´ 해당 릴레ì´ì…˜ì„ 만들 수 없습니다. 다른 ì´ë¦„ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: catalog/heap.c:1201 +#: catalog/heap.c:1218 +#, c-format +msgid "toast relfilenumber value not set when in binary upgrade mode" +msgstr "ì´ì§„ 업그레ì´ë“œ 작업 때, toast relfilenumber ê°’ì´ ì§€ì •ë˜ì§€ 않았습니다" + +#: catalog/heap.c:1229 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "ì´ì§„ 업그레ì´ë“œ 작업 때, pg_class ìžë£Œ OID ê°’ì´ ì§€ì •ë˜ì§€ 않았습니다" -#: catalog/heap.c:2400 +#: catalog/heap.c:1239 +#, c-format +msgid "relfilenumber value not set when in binary upgrade mode" +msgstr "ì´ì§„ 업그레ì´ë“œ 작업 때, relfilenumber ê°’ì´ ì§€ì •ë˜ì§€ 않았습니다" + +#: catalog/heap.c:2130 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "\"%s\" 파티션 í…Œì´ë¸”ì—는 NO INHERIT ì¡°ê±´ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: catalog/heap.c:2670 +#: catalog/heap.c:2402 #, c-format msgid "check constraint \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ì²´í¬ ì œì•½ ì¡°ê±´ì´ ì´ë¯¸ 있습니다" -#: catalog/heap.c:2840 catalog/index.c:879 catalog/pg_constraint.c:668 -#: commands/tablecmds.c:8117 +#: catalog/heap.c:2574 catalog/index.c:913 catalog/pg_constraint.c:724 +#: commands/tablecmds.c:9356 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "" "\"%s\" 제약 ì¡°ê±´ì´ ì´ë¯¸ \"%s\" 릴레ì´ì…˜(relation)ì—서 사용ë˜ê³  있습니다" -#: catalog/heap.c:2847 +#: catalog/heap.c:2581 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "" "\"%s\" 제약 ì¡°ê±´ì´ ë¹„ìƒì† 제약 ì¡°ê±´ê³¼ ì¶©ëŒí•©ë‹ˆë‹¤, 해당 릴레ì´ì…˜: \"%s\"" -#: catalog/heap.c:2858 +#: catalog/heap.c:2592 #, c-format msgid "" "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "\"%s\" 제약 ì¡°ê±´ì´ ìƒì† 제약 ì¡°ê±´ê³¼ ì¶©ëŒí•©ë‹ˆë‹¤, 해당 릴레ì´ì…˜: \"%s\"" -#: catalog/heap.c:2868 +#: catalog/heap.c:2602 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "" "\"%s\" 제약 ì¡°ê±´ì´ NOT VALID 제약 ì¡°ê±´ê³¼ ì¶©ëŒí•©ë‹ˆë‹¤, 해당 릴레ì´ì…˜: \"%s\"" -#: catalog/heap.c:2873 +#: catalog/heap.c:2607 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "\"%s\" 제약 ì¡°ê±´ì„ ìƒì†ëœ ì •ì˜ì™€ 병합하는 중" -#: catalog/heap.c:2975 +#: catalog/heap.c:2633 catalog/pg_constraint.c:853 commands/tablecmds.c:3074 +#: commands/tablecmds.c:3377 commands/tablecmds.c:7089 +#: commands/tablecmds.c:15907 commands/tablecmds.c:16038 +#, c-format +msgid "too many inheritance parents" +msgstr "너무 ë§Žì€ ìƒì† 부모" + +#: catalog/heap.c:2717 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "\"%s\" ê³„ì‚°ëœ ì¹¼ëŸ¼ì€ ì¹¼ëŸ¼ ìƒì„± 표현ì‹ì—서는 ì‚¬ìš©ë  ìˆ˜ ì—†ìŒ" -#: catalog/heap.c:2977 +#: catalog/heap.c:2719 #, c-format msgid "A generated column cannot reference another generated column." msgstr "ê³„ì‚°ëœ ì¹¼ëŸ¼ì€ ë‹¤ë¥¸ ê³„ì‚°ëœ ì¹¼ëŸ¼ì„ ì°¸ì¡°í•  수 ì—†ìŒ" -#: catalog/heap.c:3029 +#: catalog/heap.c:2725 +#, c-format +msgid "cannot use whole-row variable in column generation expression" +msgstr "미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ ìƒì„± 표현ì‹ì— row ì „ì²´ 변수는 사용할 수 ì—†ìŒ" + +#: catalog/heap.c:2726 +#, c-format +msgid "This would cause the generated column to depend on its own value." +msgstr "ì´ ì˜¤ë¥˜ëŠ” 미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ ìžì²´ë¥¼ ê·¸ 칼럼 값으로 지정할 때 ë°œìƒí•©ë‹ˆë‹¤." + +#: catalog/heap.c:2781 #, c-format msgid "generation expression is not immutable" -msgstr "ìƒì„± 표현ì‹ì€ ë¶ˆë³€í˜•ì¼ ìˆ˜ ì—†ìŒ" +msgstr "미리 계산ë˜ëŠ” ìƒì„± í‘œí˜„ì‹ ê²°ê³¼ê°€ immutableì´ ì•„ë‹˜" -#: catalog/heap.c:3057 rewrite/rewriteHandler.c:1192 +#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1288 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "" "\"%s\" ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ì€ %s ì¸ë°, default 표현ì‹ì—서는 %s ìžë£Œí˜•ì„ ì‚¬ìš©í–ˆìŠµë‹ˆë‹¤" -#: catalog/heap.c:3062 commands/prepare.c:367 parser/parse_node.c:412 -#: parser/parse_target.c:589 parser/parse_target.c:869 -#: parser/parse_target.c:879 rewrite/rewriteHandler.c:1197 +#: catalog/heap.c:2814 commands/prepare.c:331 parser/analyze.c:2758 +#: parser/parse_target.c:592 parser/parse_target.c:882 +#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1293 #, c-format msgid "You will need to rewrite or cast the expression." -msgstr "다시 ì •ì˜í•˜ê±°ë‚˜ 형변화ìžë¥¼ 사용해보십시오" +msgstr "다시 ì •ì˜í•˜ê±°ë‚˜ 형변환ìžë¥¼ 사용해보십시오" -#: catalog/heap.c:3109 +#: catalog/heap.c:2861 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "\"%s\" í…Œì´ë¸”ë§Œì´ ì²´í¬ ì œì•½ ì¡°ê±´ì—서 ì°¸ì¡°ë  ìˆ˜ 있습니다" -#: catalog/heap.c:3366 +#: catalog/heap.c:3167 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "ON COMMIT ë° ì™¸ëž˜ 키 ì¡°í•©ì´ ì§€ì›ë˜ì§€ 않ìŒ" -#: catalog/heap.c:3367 +#: catalog/heap.c:3168 #, c-format msgid "" "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT " @@ -4602,486 +5513,493 @@ msgid "" msgstr "" "\"%s\" í…Œì´ë¸”ì—서 \"%s\" í…Œì´ë¸”ì„ ì°¸ì¡°í•˜ëŠ”ë° ON COMMIT ì„¤ì •ì´ ê°™ì§€ 않습니다." -#: catalog/heap.c:3372 +#: catalog/heap.c:3173 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "" "_^_ í…Œì´ë¸” ë‚´ìš©ì„ ëª¨ë‘ ì‚­ì œí•  수 ì—†ìŒ, 참조키(foreign key) 제약 ì¡°ê±´ 안ì—서" -#: catalog/heap.c:3373 +#: catalog/heap.c:3174 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "\"%s\" í…Œì´ë¸”ì€ \"%s\" 개체를 참조합니다." -#: catalog/heap.c:3375 +#: catalog/heap.c:3176 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "" "\"%s\" í…Œì´ë¸”ë„ í•¨ê»˜ ìžë£Œë¥¼ 지우거나, TRUNCATE ... CASCADE êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: catalog/index.c:219 parser/parse_utilcmd.c:2097 +#: catalog/index.c:219 parser/parse_utilcmd.c:2176 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "\"%s\" í…Œì´ë¸”ì—는 ì´ë¯¸ 기본키가 있습니다" -#: catalog/index.c:237 +#: catalog/index.c:233 +#, c-format +msgid "primary keys cannot use NULLS NOT DISTINCT indexes" +msgstr "기본키(primary key)는 NULLS NOT DISTINCT ì¸ë±ìŠ¤ë¥¼ 사용할 수 ì—†ìŒ" + +#: catalog/index.c:250 #, c-format msgid "primary keys cannot be expressions" -msgstr "기본기(primary key)를 표현할 수 ì—†ìŒ" +msgstr "기본키(primary key)를 표현할 수 ì—†ìŒ" -#: catalog/index.c:254 +#: catalog/index.c:267 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "\"%s\" 파티션 키 ì¹¼ëŸ¼ì— NOT NULL ì†ì„±ì„ 지정해야 함" -#: catalog/index.c:764 catalog/index.c:1843 +#: catalog/index.c:798 catalog/index.c:1915 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "시스템 카탈로그 í…Œì´ë¸”ì—는 ì‚¬ìš©ìž ì •ì˜ ì¸ë±ìŠ¤ë¥¼ 지정할 수 없습니다" -#: catalog/index.c:804 +#: catalog/index.c:838 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "\"%s\" ì—°ì‚°ìž í´ëž˜ìŠ¤ìš©ìœ¼ë¡œ ìžë™ ê²°ì • 가능한 ì •ë ¬ ê·œì¹™ì€ ì§€ì›í•˜ì§€ 않ìŒ" -#: catalog/index.c:819 +#: catalog/index.c:853 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "시스템 카탈로그 í…Œì´ë¸”ì€ ìž ê¸ˆ 없는 ì¸ë±ìФ 만들기는 ì§€ì›í•˜ì§€ 않습니다" -#: catalog/index.c:828 catalog/index.c:1281 +#: catalog/index.c:862 catalog/index.c:1331 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "exclusion 제약 ì¡°ê±´ìš© 잠금 없는 ì¸ë±ìФ 만들기는 ì§€ì›í•˜ì§€ 않습니다" -#: catalog/index.c:837 +#: catalog/index.c:871 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "" "공유ë˜ëŠ” ì¸ë±ìŠ¤ë“¤ì€ initdb 명령으로 ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ë¥¼ 만든 다ìŒì—는 ë§Œ" "들 수 없습니다" -#: catalog/index.c:857 commands/createas.c:252 commands/sequence.c:154 -#: parser/parse_utilcmd.c:210 +#: catalog/index.c:891 commands/createas.c:416 commands/sequence.c:159 +#: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "\"%s\" ì´ë¦„ì˜ ë¦´ë ˆì´ì…˜(relation)ì´ ì´ë¯¸ 있습니다, 건너뜀" -#: catalog/index.c:907 +#: catalog/index.c:941 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "ì´ì§„ 업그레ì´ë“œ 작업 때, pg_class ì¸ë±ìФ OID ê°’ì´ ì§€ì •ë˜ì§€ 않았습니다" -#: catalog/index.c:2128 -#, c-format -msgid "DROP INDEX CONCURRENTLY must be first action in transaction" -msgstr "DROP INDEX CONCURRENTLY ëª…ë ¹ì€ íŠ¸ëžœìž­ì…˜ ë‚´ 가장 처ìŒì— 있어야 합니다" - -#: catalog/index.c:2859 +#: catalog/index.c:951 utils/cache/relcache.c:3791 #, c-format -msgid "building index \"%s\" on table \"%s\" serially" -msgstr "\"%s\" ì¸ë±ìŠ¤ë¥¼ \"%s\" í…Œì´ë¸”ì— ì´ì–´ 만드는 중" +msgid "index relfilenumber value not set when in binary upgrade mode" +msgstr "ì´ì§„ 업그레ì´ë“œ 작업 때, ì¸ë±ìФ relfilenumber ê°’ì´ ì§€ì •ë˜ì§€ 않았습니다" -#: catalog/index.c:2864 +#: catalog/index.c:2214 #, c-format -msgid "" -"building index \"%s\" on table \"%s\" with request for %d parallel worker" -msgid_plural "" -"building index \"%s\" on table \"%s\" with request for %d parallel workers" -msgstr[0] "\"%s\" ì¸ë±ìŠ¤ë¥¼ \"%s\" í…Œì´ë¸”ì—서 만드는 중, 병렬 작업ìžìˆ˜: %d" +msgid "DROP INDEX CONCURRENTLY must be first action in transaction" +msgstr "DROP INDEX CONCURRENTLY ëª…ë ¹ì€ íŠ¸ëžœìž­ì…˜ ë‚´ 가장 처ìŒì— 있어야 합니다" -#: catalog/index.c:3492 +#: catalog/index.c:3668 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "임시 í…Œì´ë¸”ì˜ ì¸ë±ìФ 재ìƒì„± ìž‘ì—…ì€ ë‹¤ë¥¸ 세션ì—서 í•  수 ì—†ìŒ" -#: catalog/index.c:3503 +#: catalog/index.c:3679 commands/indexcmds.c:3626 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "TOAST í…Œì´ë¸”ì— ë”¸ë¦° ìž˜ëª»ëœ ì¸ë±ìŠ¤ì— ëŒ€í•´ ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ í•  수 ì—†ìŒ" -#: catalog/index.c:3625 +#: catalog/index.c:3695 commands/indexcmds.c:3504 commands/indexcmds.c:3650 +#: commands/tablecmds.c:3581 #, c-format -msgid "index \"%s\" was reindexed" -msgstr "\"%s\" ì¸ë±ìŠ¤ê°€ 다시 만들어졌ìŒ" +msgid "cannot move system relation \"%s\"" +msgstr "\"%s\" 시스템 릴레ì´ì…˜ìž…니다. ì´ë™í•  수 없습니다" -#: catalog/index.c:3701 commands/indexcmds.c:3023 +#: catalog/index.c:3832 #, c-format -msgid "REINDEX of partitioned tables is not yet implemented, skipping \"%s\"" -msgstr "íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì˜ REINDEX ìž‘ì—…ì€ ì•„ì§ êµ¬í˜„ë˜ì§€ 않았ìŒ, \"%s\" 건너뜀" +msgid "index \"%s\" was reindexed" +msgstr "\"%s\" ì¸ë±ìŠ¤ê°€ 다시 만들어졌ìŒ" -#: catalog/index.c:3756 +#: catalog/index.c:3998 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "" -"TOAST í…Œì´ë¸”ì— ì§€ì •ëœ ìœ íš¨í•˜ì§€ ì•Šì€ \"%s.%s\" ì¸ë±ìŠ¤ëŠ” ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ í•  수 ì—†ìŒ, 건너뜀" +"TOAST í…Œì´ë¸”ì— ì§€ì •ëœ ìœ íš¨í•˜ì§€ ì•Šì€ \"%s.%s\" ì¸ë±ìŠ¤ëŠ” ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ í•  수 ì—†" +"ìŒ, 건너뜀" -#: catalog/namespace.c:257 catalog/namespace.c:461 catalog/namespace.c:553 -#: commands/trigger.c:5043 +#: catalog/namespace.c:462 catalog/namespace.c:666 catalog/namespace.c:758 +#: commands/trigger.c:5731 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "서로 다른 ë°ì´í„°ë² ì´ìŠ¤ê°„ì˜ ì°¸ì¡°ëŠ” 구현ë˜ì–´ìžˆì§€ 않습니다: \"%s.%s.%s\"" -#: catalog/namespace.c:314 +#: catalog/namespace.c:519 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "임시 í…Œì´ë¸”ì€ ìŠ¤í‚¤ë§ˆ ì´ë¦„ì„ ì§€ì •í•  수 ì—†ìŒ" -#: catalog/namespace.c:395 +#: catalog/namespace.c:600 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" msgstr "\"%s.%s\" 릴레ì´ì…˜ì˜ 잠금 정보를 구할 수 ì—†ìŒ" -#: catalog/namespace.c:400 commands/lockcmds.c:142 commands/lockcmds.c:227 +#: catalog/namespace.c:605 commands/lockcmds.c:143 commands/lockcmds.c:223 #, c-format msgid "could not obtain lock on relation \"%s\"" msgstr "\"%s\" 릴레ì´ì…˜ì˜ 잠금 정보를 구할 수 ì—†ìŒ" -#: catalog/namespace.c:428 parser/parse_relation.c:1357 +#: catalog/namespace.c:633 parser/parse_relation.c:1430 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "\"%s.%s\" ì´ë¦„ì˜ ë¦´ë ˆì´ì…˜(relation)ì´ ì—†ìŠµë‹ˆë‹¤" -#: catalog/namespace.c:433 parser/parse_relation.c:1370 -#: parser/parse_relation.c:1378 +#: catalog/namespace.c:638 parser/parse_relation.c:1443 +#: parser/parse_relation.c:1451 utils/adt/regproc.c:913 #, c-format msgid "relation \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ë¦´ë ˆì´ì…˜(relation)ì´ ì—†ìŠµë‹ˆë‹¤" -#: catalog/namespace.c:499 catalog/namespace.c:3030 commands/extension.c:1519 -#: commands/extension.c:1525 +#: catalog/namespace.c:704 catalog/namespace.c:3522 commands/extension.c:1607 +#: commands/extension.c:1613 #, c-format msgid "no schema has been selected to create in" msgstr "ì„ íƒëœ 스키마 ì—†ìŒ, 대ìƒ:" -#: catalog/namespace.c:651 catalog/namespace.c:664 +#: catalog/namespace.c:856 catalog/namespace.c:869 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ 스키마 안ì—는 릴레ì´ì…˜ì„ 만들 수 ì—†ìŒ" -#: catalog/namespace.c:655 +#: catalog/namespace.c:860 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "임시 스키마가 아닌 ìŠ¤í‚¤ë§ˆì— ìž„ì‹œ 릴레ì´ì…˜ì„ 만들 수 ì—†ìŒ" -#: catalog/namespace.c:670 +#: catalog/namespace.c:875 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "임시 스키마 안ì—는 임시 릴레ì´ì…˜ë§Œ 만들 수 있ìŒ" -#: catalog/namespace.c:2222 +#: catalog/namespace.c:2619 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "\"%s\" 통계정보 개체가 ì—†ìŒ" -#: catalog/namespace.c:2345 +#: catalog/namespace.c:2761 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "\"%s\" 전문 검색 파서가 ì—†ìŒ" -#: catalog/namespace.c:2471 +#: catalog/namespace.c:2906 utils/adt/regproc.c:1459 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "\"%s\" 전문 검색 ì‚¬ì „ì´ ì—†ìŒ" -#: catalog/namespace.c:2598 +#: catalog/namespace.c:3052 #, c-format msgid "text search template \"%s\" does not exist" msgstr "\"%s\" 전문 검색 í…œí”Œë¦¿ì´ ì—†ìŒ" -#: catalog/namespace.c:2724 commands/tsearchcmds.c:1194 -#: utils/cache/ts_cache.c:617 +#: catalog/namespace.c:3197 commands/tsearchcmds.c:1168 +#: utils/adt/regproc.c:1349 utils/cache/ts_cache.c:635 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "\"%s\" 전문 검색 êµ¬ì„±ì´ ì—†ìŒ" -#: catalog/namespace.c:2837 parser/parse_expr.c:872 parser/parse_target.c:1228 +#: catalog/namespace.c:3329 parser/parse_expr.c:868 parser/parse_target.c:1259 #, c-format msgid "cross-database references are not implemented: %s" msgstr "서로 다른 ë°ì´í„°ë² ì´ìŠ¤ê°„ì˜ ì°¸ì¡°ëŠ” 구현ë˜ì–´ìžˆì§€ 않습니다: %s" -#: catalog/namespace.c:2843 parser/parse_expr.c:879 parser/parse_target.c:1235 -#: gram.y:14981 gram.y:16435 +#: catalog/namespace.c:3335 parser/parse_expr.c:875 parser/parse_target.c:1266 +#: gram.y:19181 gram.y:19221 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "ì ë‹¹í•˜ì§€ ì•Šì€ qualified ì´ë¦„ 입니다 (너무 ë§Žì€ ì ì´ 있네요): %s" -#: catalog/namespace.c:2973 +#: catalog/namespace.c:3465 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "임시 스키마로(ì—서) 개체를 ì´ë™í•  수 없습니다" -#: catalog/namespace.c:2979 +#: catalog/namespace.c:3471 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "TOAST 스키마로(ì—서) 개체를 ì´ë™í•  수 없습니다" -#: catalog/namespace.c:3052 commands/schemacmds.c:256 commands/schemacmds.c:336 -#: commands/tablecmds.c:1194 +#: catalog/namespace.c:3544 commands/schemacmds.c:264 commands/schemacmds.c:344 +#: commands/tablecmds.c:1404 utils/adt/regproc.c:1688 #, c-format msgid "schema \"%s\" does not exist" msgstr "\"%s\" 스키마(schema) ì—†ìŒ" -#: catalog/namespace.c:3083 +#: catalog/namespace.c:3575 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "" "ì ë‹¹í•˜ì§€ ì•Šì€ ë¦´ë ˆì´ì…˜(relation) ì´ë¦„ 입니다 (너무 ë§Žì€ ì ì´ 있네요): %s" -#: catalog/namespace.c:3646 +#: catalog/namespace.c:4016 utils/adt/regproc.c:1056 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "\"%s\" 정렬정ì˜(collation)ê°€ \"%s\" ì¸ì½”딩ì—서는 쓸 수 ì—†ìŒ" -#: catalog/namespace.c:3701 +#: catalog/namespace.c:4071 #, c-format msgid "conversion \"%s\" does not exist" msgstr "\"%s\" 문ìžì½”드변환규칙(conversion) ì—†ìŒ" -#: catalog/namespace.c:3965 +#: catalog/namespace.c:4412 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "\"%s\" ë°ì´í„°ë² ì´ìФì—서 임시 파ì¼ì„ 만들 ê¶Œí•œì´ ì—†ìŒ" -#: catalog/namespace.c:3981 +#: catalog/namespace.c:4428 #, c-format msgid "cannot create temporary tables during recovery" msgstr "복구 작업 중ì—는 임시 í…Œì´ë¸”ì„ ë§Œë“¤ 수 ì—†ìŒ" -#: catalog/namespace.c:3987 +#: catalog/namespace.c:4434 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "병렬 작업 ì¤‘ì— ìž„ì‹œ í…Œì´ë¸”ì„ ë§Œë“¤ 수 ì—†ìŒ" -#: catalog/namespace.c:4286 commands/tablespace.c:1205 commands/variable.c:64 -#: utils/misc/guc.c:11116 utils/misc/guc.c:11194 -#, c-format -msgid "List syntax is invalid." -msgstr "ëª©ë¡ ë¬¸ë²•ì´ í‹€ë ¸ìŠµë‹ˆë‹¤." - -#: catalog/objectaddress.c:1275 catalog/pg_publication.c:57 -#: commands/policy.c:95 commands/policy.c:375 commands/policy.c:465 -#: commands/tablecmds.c:230 commands/tablecmds.c:272 commands/tablecmds.c:1989 -#: commands/tablecmds.c:5626 commands/tablecmds.c:11089 +#: catalog/objectaddress.c:1371 commands/policy.c:93 commands/policy.c:373 +#: commands/tablecmds.c:257 commands/tablecmds.c:299 commands/tablecmds.c:2327 +#: commands/tablecmds.c:12925 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" 개체는 í…Œì´ë¸”ì´ ì•„ë‹˜" -#: catalog/objectaddress.c:1282 commands/tablecmds.c:242 -#: commands/tablecmds.c:5656 commands/tablecmds.c:15711 commands/view.c:119 +#: catalog/objectaddress.c:1378 commands/tablecmds.c:269 +#: commands/tablecmds.c:17851 commands/view.c:114 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" 개체는 ë·°ê°€ 아님" -#: catalog/objectaddress.c:1289 commands/matview.c:175 commands/tablecmds.c:248 -#: commands/tablecmds.c:15716 +#: catalog/objectaddress.c:1385 commands/matview.c:199 commands/tablecmds.c:275 +#: commands/tablecmds.c:17856 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" 개체는 êµ¬ì²´í™”ëœ ë·°(materialized view)ê°€ 아닙니다" -#: catalog/objectaddress.c:1296 commands/tablecmds.c:266 -#: commands/tablecmds.c:5659 commands/tablecmds.c:15721 +#: catalog/objectaddress.c:1392 commands/tablecmds.c:293 +#: commands/tablecmds.c:17861 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" 개체는 외부 í…Œì´ë¸”ì´ ì•„ë‹˜" -#: catalog/objectaddress.c:1337 +#: catalog/objectaddress.c:1433 #, c-format msgid "must specify relation and object name" msgstr "릴레ì´ì…˜ê³¼ 개체 ì´ë¦„ì„ ì§€ì •í•´ì•¼ 합니다" -#: catalog/objectaddress.c:1413 catalog/objectaddress.c:1466 +#: catalog/objectaddress.c:1509 catalog/objectaddress.c:1562 #, c-format msgid "column name must be qualified" msgstr "칼럼 ì´ë¦„으로 ì ë‹¹í•˜ì§€ 않습니다" -#: catalog/objectaddress.c:1513 +#: catalog/objectaddress.c:1581 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "\"%s\" 칼럼(해당 릴레ì´ì…˜: \"%s\")ì˜ ê¸°ë³¸ê°’ì„ ì§€ì •í•˜ì§€ 않았ìŒ" -#: catalog/objectaddress.c:1550 commands/functioncmds.c:133 -#: commands/tablecmds.c:258 commands/typecmds.c:263 commands/typecmds.c:3275 -#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:845 -#: utils/adt/acl.c:4436 +#: catalog/objectaddress.c:1618 commands/functioncmds.c:132 +#: commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3843 +#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 +#: utils/adt/acl.c:4560 #, c-format msgid "type \"%s\" does not exist" msgstr "\"%s\" ìžë£Œí˜• ì—†ìŒ" -#: catalog/objectaddress.c:1669 +#: catalog/objectaddress.c:1737 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "%d (%s, %s) ì—°ì‚°ìž(ëŒ€ìƒ %s) ì—†ìŒ" -#: catalog/objectaddress.c:1700 +#: catalog/objectaddress.c:1768 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "%d (%s, %s) 함수(ëŒ€ìƒ %s) ì—†ìŒ" -#: catalog/objectaddress.c:1751 catalog/objectaddress.c:1777 +#: catalog/objectaddress.c:1819 catalog/objectaddress.c:1845 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "\"%s\" 사용ìžì— 대한 ì‚¬ìš©ìž ë§µí•‘ ì •ë³´(ëŒ€ìƒ ì„œë²„: \"%s\")ê°€ ì—†ìŒ" -#: catalog/objectaddress.c:1766 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:1012 commands/foreigncmds.c:1395 -#: foreign/foreign.c:723 +#: catalog/objectaddress.c:1834 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:713 #, c-format msgid "server \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ì„œë²„ê°€ ì—†ìŒ" -#: catalog/objectaddress.c:1833 +#: catalog/objectaddress.c:1901 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "\"%s\" 발행 릴레ì´ì…˜ì€ \"%s\" ë°œí–‰ì— ì—†ìŠµë‹ˆë‹¤." -#: catalog/objectaddress.c:1895 +#: catalog/objectaddress.c:1948 +#, c-format +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "\"%s\" 발행 스키마는 \"%s\" ë°œí–‰ì— ì—†ìŠµë‹ˆë‹¤." + +#: catalog/objectaddress.c:2006 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "알 수 없는 기본 ACL 개체 타입 \"%c\"" -#: catalog/objectaddress.c:1896 +#: catalog/objectaddress.c:2007 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "유효한 개체 형태는 \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." -#: catalog/objectaddress.c:1947 +#: catalog/objectaddress.c:2058 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "\"%s\" 사용ìžìš© 기본 ACL ì—†ìŒ. (해당 스키마: \"%s\", 해당 개체: %s)" -#: catalog/objectaddress.c:1952 +#: catalog/objectaddress.c:2063 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "\"%s\" 사용ìžìš© 기본 ACL ì—†ìŒ. (해당 개체: %s)" -#: catalog/objectaddress.c:1979 catalog/objectaddress.c:2037 -#: catalog/objectaddress.c:2094 +#: catalog/objectaddress.c:2089 catalog/objectaddress.c:2146 +#: catalog/objectaddress.c:2201 #, c-format msgid "name or argument lists may not contain nulls" msgstr "ì´ë¦„ì´ë‚˜ ì¸ìž 목ë¡ì—는 nullì´ í¬í•¨ë˜ì§€ 않아야 함" -#: catalog/objectaddress.c:2013 +#: catalog/objectaddress.c:2123 #, c-format msgid "unsupported object type \"%s\"" msgstr "\"%s\" 형 ì§€ì›í•˜ì§€ 않ìŒ" -#: catalog/objectaddress.c:2033 catalog/objectaddress.c:2051 -#: catalog/objectaddress.c:2192 +#: catalog/objectaddress.c:2142 catalog/objectaddress.c:2159 +#: catalog/objectaddress.c:2224 catalog/objectaddress.c:2308 #, c-format msgid "name list length must be exactly %d" msgstr "ì´ë¦„ ëª©ë¡ ê¸¸ì´ëŠ” %d ì´ì–´ì•¼ 합니다." -#: catalog/objectaddress.c:2055 +#: catalog/objectaddress.c:2163 #, c-format msgid "large object OID may not be null" msgstr "대형 개체 OID는 null ê°’ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: catalog/objectaddress.c:2064 catalog/objectaddress.c:2127 -#: catalog/objectaddress.c:2134 +#: catalog/objectaddress.c:2172 catalog/objectaddress.c:2242 +#: catalog/objectaddress.c:2249 #, c-format msgid "name list length must be at least %d" msgstr "ì´ë¦„ ëª©ë¡ ê¸¸ì´ëŠ” ì ì–´ë„ %d ê°œ ì´ìƒì´ì–´ì•¼ 함" -#: catalog/objectaddress.c:2120 catalog/objectaddress.c:2141 +#: catalog/objectaddress.c:2235 catalog/objectaddress.c:2256 #, c-format msgid "argument list length must be exactly %d" msgstr "ì¸ìž 목ë¡ì€ %d 개여야 함" -#: catalog/objectaddress.c:2393 libpq/be-fsstubs.c:321 +#: catalog/objectaddress.c:2470 libpq/be-fsstubs.c:329 #, c-format msgid "must be owner of large object %u" msgstr "%u 대경 ê°œì²´ì˜ ì†Œìœ ì£¼ì—¬ì•¼ë§Œ 합니다" -#: catalog/objectaddress.c:2408 commands/functioncmds.c:1445 +#: catalog/objectaddress.c:2485 commands/functioncmds.c:1560 #, c-format msgid "must be owner of type %s or type %s" -msgstr "%s, %s ìžë£Œí˜•ì˜ ì†Œìœ ì£¼ì—¬ì•¼í•©ë‹ˆë‹¤" +msgstr "%s, %s ìžë£Œí˜•ì˜ ì†Œìœ ì£¼ì—¬ì•¼ 합니다" -#: catalog/objectaddress.c:2458 catalog/objectaddress.c:2475 +#: catalog/objectaddress.c:2512 catalog/objectaddress.c:2521 +#: catalog/objectaddress.c:2527 #, c-format -msgid "must be superuser" -msgstr "슈í¼ìœ ì ¸ì—¬ì•¼í•¨" +msgid "permission denied" +msgstr "권한 ì—†ìŒ" + +#: catalog/objectaddress.c:2513 catalog/objectaddress.c:2522 +#, c-format +msgid "The current user must have the %s attribute." +msgstr "현재 사용ìžëŠ” %s ì†ì„±ì´ 있어야합니다." -#: catalog/objectaddress.c:2465 +#: catalog/objectaddress.c:2528 #, c-format -msgid "must have CREATEROLE privilege" -msgstr "CREATEROLE ê¶Œí•œì´ ìžˆì–´ì•¼ 함" +msgid "The current user must have the %s option on role \"%s\"." +msgstr "현재 사용ìžëŠ” %s ì˜µì…˜ì„ ì§€ì •í•´ì•¼í•¨, 해당 롤: \"%s\"" -#: catalog/objectaddress.c:2544 +#: catalog/objectaddress.c:2542 +#, c-format +msgid "must be superuser" +msgstr "슈í¼ìœ ì ¸ì—¬ì•¼í•¨" + +#: catalog/objectaddress.c:2611 #, c-format msgid "unrecognized object type \"%s\"" msgstr "알 수 없는 개체 형태 \"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2772 +#: catalog/objectaddress.c:2928 #, c-format msgid "column %s of %s" msgstr " %s 칼럼(%s ì˜)" -#: catalog/objectaddress.c:2782 +#: catalog/objectaddress.c:2943 #, c-format msgid "function %s" msgstr "%s 함수" -#: catalog/objectaddress.c:2787 +#: catalog/objectaddress.c:2956 #, c-format msgid "type %s" msgstr "%s ìžë£Œí˜•" -#: catalog/objectaddress.c:2817 +#: catalog/objectaddress.c:2993 #, c-format msgid "cast from %s to %s" msgstr "%s ìžë£Œí˜•ì„ %s ìžë£Œí˜•으로 바꾸는 작업" -#: catalog/objectaddress.c:2845 +#: catalog/objectaddress.c:3026 #, c-format msgid "collation %s" msgstr "collation %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2871 +#: catalog/objectaddress.c:3057 #, c-format msgid "constraint %s on %s" msgstr "%s 제약 ì¡°ê±´(해당 개체: %s)" -#: catalog/objectaddress.c:2877 +#: catalog/objectaddress.c:3063 #, c-format msgid "constraint %s" msgstr "%s 제약 ì¡°ê±´" -#: catalog/objectaddress.c:2904 +#: catalog/objectaddress.c:3095 #, c-format msgid "conversion %s" msgstr "%s 문ìžì½”드변환규칙" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:2943 +#: catalog/objectaddress.c:3117 #, c-format msgid "default value for %s" msgstr "%s ìš© 기본값" -#: catalog/objectaddress.c:2952 +#: catalog/objectaddress.c:3128 #, c-format msgid "language %s" msgstr "프로시주얼 언어 %s" -#: catalog/objectaddress.c:2957 +#: catalog/objectaddress.c:3136 #, c-format msgid "large object %u" msgstr "%u 대형 개체" -#: catalog/objectaddress.c:2962 +#: catalog/objectaddress.c:3149 #, c-format msgid "operator %s" msgstr "%s ì—°ì‚°ìž" -#: catalog/objectaddress.c:2994 +#: catalog/objectaddress.c:3186 #, c-format msgid "operator class %s for access method %s" msgstr "%s ì—°ì‚°ìž í´ëž˜ìФ, %s ì¸ë±ìФ 액세스 방법" -#: catalog/objectaddress.c:3017 +#: catalog/objectaddress.c:3214 #, c-format msgid "access method %s" msgstr "%s ì ‘ê·¼ 방법" @@ -5090,7 +6008,7 @@ msgstr "%s ì ‘ê·¼ 방법" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3059 +#: catalog/objectaddress.c:3269 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "%d (%s, %s) ì—°ì‚°ìž (ì—°ì‚°ìž íŒ¨ë°€ë¦¬: %s): %s" @@ -5099,257 +6017,274 @@ msgstr "%d (%s, %s) ì—°ì‚°ìž (ì—°ì‚°ìž íŒ¨ë°€ë¦¬: %s): %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3109 +#: catalog/objectaddress.c:3334 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "%d (%s, %s) 함수 (ì—°ì‚°ìž íŒ¨ë°€ë¦¬: %s): %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3153 +#: catalog/objectaddress.c:3388 #, c-format msgid "rule %s on %s" msgstr "%s 룰(rule), 해당 í…Œì´ë¸”: %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3191 +#: catalog/objectaddress.c:3434 #, c-format msgid "trigger %s on %s" msgstr "%s 트리거, 해당 í…Œì´ë¸”: %s" -#: catalog/objectaddress.c:3207 +#: catalog/objectaddress.c:3454 #, c-format msgid "schema %s" msgstr "%s 스키마" -#: catalog/objectaddress.c:3230 +#: catalog/objectaddress.c:3482 #, c-format msgid "statistics object %s" msgstr "%s 통계정보 개체" -#: catalog/objectaddress.c:3257 +#: catalog/objectaddress.c:3513 #, c-format msgid "text search parser %s" msgstr "%s 전문 검색 파서" -#: catalog/objectaddress.c:3283 +#: catalog/objectaddress.c:3544 #, c-format msgid "text search dictionary %s" msgstr "%s 전문 검색 사전" -#: catalog/objectaddress.c:3309 +#: catalog/objectaddress.c:3575 #, c-format msgid "text search template %s" msgstr "%s 전문 검색 템플릿" -#: catalog/objectaddress.c:3335 +#: catalog/objectaddress.c:3606 #, c-format msgid "text search configuration %s" msgstr "%s 전문 검색 구성" -#: catalog/objectaddress.c:3344 +#: catalog/objectaddress.c:3619 #, c-format msgid "role %s" msgstr "%s 롤" -#: catalog/objectaddress.c:3357 +#: catalog/objectaddress.c:3656 catalog/objectaddress.c:5505 +#, c-format +msgid "membership of role %s in role %s" +msgstr "%s 롤 구성ì›(해당 롤: %s)" + +#: catalog/objectaddress.c:3677 #, c-format msgid "database %s" msgstr "%s ë°ì´í„°ë² ì´ìФ" -#: catalog/objectaddress.c:3369 +#: catalog/objectaddress.c:3693 #, c-format msgid "tablespace %s" msgstr "%s í…Œì´ë¸”스페ì´ìФ" -#: catalog/objectaddress.c:3378 +#: catalog/objectaddress.c:3704 #, c-format msgid "foreign-data wrapper %s" msgstr "%s 외부 ë°ì´í„° 래í¼" -#: catalog/objectaddress.c:3387 +#: catalog/objectaddress.c:3714 #, c-format msgid "server %s" msgstr "%s 서버" -#: catalog/objectaddress.c:3415 +#: catalog/objectaddress.c:3747 #, c-format msgid "user mapping for %s on server %s" msgstr "%sì— ëŒ€í•œ ì‚¬ìš©ìž ë§¤í•‘, 해당 서버: %s" -#: catalog/objectaddress.c:3460 +#: catalog/objectaddress.c:3799 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "" "%s 롤(해당 스키마: %s)ì´ ìƒˆ í…Œì´ë¸”ì„ ë§Œë“¤ 때 기본ì ìœ¼ë¡œ 지정할 ì ‘ê·¼ 권한" -#: catalog/objectaddress.c:3464 +#: catalog/objectaddress.c:3803 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "%s ë¡¤ì´ ìƒˆ í…Œì´ë¸”ì„ ë§Œë“¤ 때 기본ì ìœ¼ë¡œ 지정할 ì ‘ê·¼ 권한" -#: catalog/objectaddress.c:3470 +#: catalog/objectaddress.c:3809 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "" "%s 롤(해당 스키마: %s)ì´ ìƒˆ 시퀀스를 만들 때 기본ì ìœ¼ë¡œ 지정할 ì ‘ê·¼ 권한" -#: catalog/objectaddress.c:3474 +#: catalog/objectaddress.c:3813 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "%s ë¡¤ì´ ìƒˆ 시퀀스를 만들 때 기본ì ìœ¼ë¡œ 지정할 ì ‘ê·¼ 권한" -#: catalog/objectaddress.c:3480 +#: catalog/objectaddress.c:3819 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "%s 롤(해당 스키마: %s)ì´ ìƒˆ 함수를 만들 때 기본ì ìœ¼ë¡œ 지정할 ì ‘ê·¼ 권한" -#: catalog/objectaddress.c:3484 +#: catalog/objectaddress.c:3823 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "%s ë¡¤ì´ ìƒˆ 함수를 만들 때 기본ì ìœ¼ë¡œ 지정할 ì ‘ê·¼ 권한" -#: catalog/objectaddress.c:3490 +#: catalog/objectaddress.c:3829 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "" "%s 롤(해당 스키마: %s)ì´ ìƒˆ ìžë£Œí˜•ì„ ë§Œë“¤ 때 기본ì ìœ¼ë¡œ 지정할 ì ‘ê·¼ 권한" -#: catalog/objectaddress.c:3494 +#: catalog/objectaddress.c:3833 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "%s ë¡¤ì´ ìƒˆ ìžë£Œí˜•ì„ ë§Œë“¤ 때 기본ì ìœ¼ë¡œ 지정할 ì ‘ê·¼ 권한" -#: catalog/objectaddress.c:3500 +#: catalog/objectaddress.c:3839 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "%s ë¡¤ì´ ìƒˆ 시퀀스를 만들 때 기본ì ìœ¼ë¡œ 지정할 ì ‘ê·¼ 권한" -#: catalog/objectaddress.c:3507 +#: catalog/objectaddress.c:3846 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "%s 롤(해당 스키마: %s)ì˜ ê¸°ë³¸ ì ‘ê·¼ 권한" -#: catalog/objectaddress.c:3511 +#: catalog/objectaddress.c:3850 #, c-format msgid "default privileges belonging to role %s" msgstr "%s ë¡¤ì˜ ê¸°ë³¸ ì ‘ê·¼ 권한" -#: catalog/objectaddress.c:3529 +#: catalog/objectaddress.c:3872 #, c-format msgid "extension %s" msgstr "%s 확장 모듈" -#: catalog/objectaddress.c:3542 +#: catalog/objectaddress.c:3889 #, c-format msgid "event trigger %s" msgstr "%s ì´ë²¤íЏ 트리거" +#: catalog/objectaddress.c:3913 +#, c-format +msgid "parameter %s" +msgstr "매개 변수 %s" + #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3578 +#: catalog/objectaddress.c:3956 #, c-format msgid "policy %s on %s" msgstr "%s ì •ì±…(%s ì˜)" -#: catalog/objectaddress.c:3588 +#: catalog/objectaddress.c:3970 #, c-format msgid "publication %s" msgstr "%s 발행" +#: catalog/objectaddress.c:3983 +#, c-format +msgid "publication of schema %s in publication %s" +msgstr "%s 스키마 발행 (해당 발행ì´ë¦„: %s)" + #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:3614 +#: catalog/objectaddress.c:4014 #, c-format msgid "publication of %s in publication %s" msgstr "%s 발행 (해당 발행ì´ë¦„: %s)" -#: catalog/objectaddress.c:3623 +#: catalog/objectaddress.c:4027 #, c-format msgid "subscription %s" msgstr "%s 구ë…" -#: catalog/objectaddress.c:3642 +#: catalog/objectaddress.c:4048 #, c-format msgid "transform for %s language %s" msgstr "%s 형 변환ìž, 대ìƒì–¸ì–´: %s" -#: catalog/objectaddress.c:3705 +#: catalog/objectaddress.c:4117 #, c-format msgid "table %s" msgstr "%s í…Œì´ë¸”" -#: catalog/objectaddress.c:3710 +#: catalog/objectaddress.c:4122 #, c-format msgid "index %s" msgstr "%s ì¸ë±ìФ" -#: catalog/objectaddress.c:3714 +#: catalog/objectaddress.c:4126 #, c-format msgid "sequence %s" msgstr "%s 시퀀스" -#: catalog/objectaddress.c:3718 +#: catalog/objectaddress.c:4130 #, c-format msgid "toast table %s" msgstr "%s 토스트 í…Œì´ë¸”" -#: catalog/objectaddress.c:3722 +#: catalog/objectaddress.c:4134 #, c-format msgid "view %s" msgstr "%s ë·°" -#: catalog/objectaddress.c:3726 +#: catalog/objectaddress.c:4138 #, c-format msgid "materialized view %s" msgstr "%s êµ¬ì²´í™”ëœ ë·°" -#: catalog/objectaddress.c:3730 +#: catalog/objectaddress.c:4142 #, c-format msgid "composite type %s" msgstr "%s 복합 ìžë£Œí˜•" -#: catalog/objectaddress.c:3734 +#: catalog/objectaddress.c:4146 #, c-format msgid "foreign table %s" msgstr "%s 외부 í…Œì´ë¸”" -#: catalog/objectaddress.c:3739 +#: catalog/objectaddress.c:4151 #, c-format msgid "relation %s" msgstr "%s 릴레ì´ì…˜" -#: catalog/objectaddress.c:3776 +#: catalog/objectaddress.c:4192 #, c-format msgid "operator family %s for access method %s" msgstr "%s ì—°ì‚°ìž íŽ˜ë°€ë¦¬, ì ‘ê·¼ 방법: %s" -#: catalog/pg_aggregate.c:128 +#: catalog/pg_aggregate.c:129 #, c-format msgid "aggregates cannot have more than %d argument" msgid_plural "aggregates cannot have more than %d arguments" msgstr[0] "집계 함수ì—는 %dê°œ ì´ìƒì˜ ì¸ìžë¥¼ 사용할 수 ì—†ìŒ" -#: catalog/pg_aggregate.c:143 catalog/pg_aggregate.c:157 +#: catalog/pg_aggregate.c:144 catalog/pg_aggregate.c:158 #, c-format msgid "cannot determine transition data type" msgstr "처리할(변환할) ìžë£Œí˜•ì„ ê²°ì •í•  수 ì—†ìŒ" -#: catalog/pg_aggregate.c:172 +#: catalog/pg_aggregate.c:173 #, c-format msgid "a variadic ordered-set aggregate must use VARIADIC type ANY" msgstr "variadic 순서있는 세트 집계함수는 VARIADIC ANY í˜•ì„ ì‚¬ìš©í•´ì•¼ 합니다" -#: catalog/pg_aggregate.c:198 +#: catalog/pg_aggregate.c:199 #, c-format msgid "" "a hypothetical-set aggregate must have direct arguments matching its " "aggregated arguments" msgstr "" +"ê°€ìƒ ì§‘í•© 집계 함수(hypothetical-set aggregate)ì˜ ì¸ìžëŠ” 그것과 대ì‘하는 실함" +"ìˆ˜ì˜ ì¸ìžì™€ ì¼ì¹˜í•´ì•¼í•©ë‹ˆë‹¤." -#: catalog/pg_aggregate.c:245 catalog/pg_aggregate.c:289 +#: catalog/pg_aggregate.c:246 catalog/pg_aggregate.c:290 #, c-format msgid "return type of transition function %s is not %s" msgstr "%s ì´ë¦„ì˜ transition í•¨ìˆ˜ì˜ ë¦¬í„´ ìžë£Œí˜•ì´ %s í˜•ì´ ì•„ë‹™ë‹ˆë‹¤" -#: catalog/pg_aggregate.c:265 catalog/pg_aggregate.c:308 +#: catalog/pg_aggregate.c:266 catalog/pg_aggregate.c:309 #, c-format msgid "" "must not omit initial value when transition function is strict and " @@ -5358,314 +6293,443 @@ msgstr "" "변환 함수가 엄격하고 변환 형ì‹ì´ ìž…ë ¥ 형ì‹ê³¼ 호환ë˜ì§€ 않는 경우 ì´ˆê¸°ê°’ì„ ìƒëžµ" "하면 안ë¨" -#: catalog/pg_aggregate.c:334 +#: catalog/pg_aggregate.c:335 #, c-format msgid "return type of inverse transition function %s is not %s" msgstr "%s inverse transition í•¨ìˆ˜ì˜ ë°˜í™˜ ìžë£Œí˜•ì´ %s í˜•ì´ ì•„ë‹™ë‹ˆë‹¤." -#: catalog/pg_aggregate.c:351 executor/nodeWindowAgg.c:2852 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2991 #, c-format msgid "" "strictness of aggregate's forward and inverse transition functions must match" -msgstr "" +msgstr "집계 í•¨ìˆ˜ì˜ ì •ë°©í–¥ ë° ì—­ë°©í–¥ 전환 í•¨ìˆ˜ì˜ ì—„ê²©ì„±ì´ ì¼ì¹˜í•´ì•¼ 합니다." -#: catalog/pg_aggregate.c:395 catalog/pg_aggregate.c:553 +#: catalog/pg_aggregate.c:396 catalog/pg_aggregate.c:554 #, c-format msgid "final function with extra arguments must not be declared STRICT" msgstr "부가 ì¸ìžë¥¼ 쓰는 마침 함수는 STRICT ì˜µì…˜ì´ ì—†ì–´ì•¼ 함" -#: catalog/pg_aggregate.c:426 +#: catalog/pg_aggregate.c:427 #, c-format msgid "return type of combine function %s is not %s" msgstr "%s combine í•¨ìˆ˜ì˜ ë°˜í™˜ ìžë£Œí˜•ì´ %s í˜•ì´ ì•„ë‹™ë‹ˆë‹¤" -#: catalog/pg_aggregate.c:438 executor/nodeAgg.c:4177 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3902 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "" "%s ìžë£Œí˜•ì„ ì „ë‹¬ 값으로 사용하는 ì¡°í•© 함수는 STRICT ì†ì„±ì„ 가져야 합니다" -#: catalog/pg_aggregate.c:457 +#: catalog/pg_aggregate.c:458 #, c-format msgid "return type of serialization function %s is not %s" msgstr "%s serialization í•¨ìˆ˜ì˜ ë°˜í™˜ ìžë£Œí˜•ì´ %s í˜•ì´ ì•„ë‹™ë‹ˆë‹¤." -#: catalog/pg_aggregate.c:478 +#: catalog/pg_aggregate.c:479 #, c-format msgid "return type of deserialization function %s is not %s" msgstr "%s deserialization í•¨ìˆ˜ì˜ ë°˜í™˜ ìžë£Œí˜•ì´ %s í˜•ì´ ì•„ë‹™ë‹ˆë‹¤" -#: catalog/pg_aggregate.c:497 catalog/pg_proc.c:186 catalog/pg_proc.c:220 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:189 catalog/pg_proc.c:223 #, c-format msgid "cannot determine result data type" msgstr "ê²°ê³¼ ìžë£Œí˜•ì„ ê²°ì •í•  수 ì—†ìŒ" -#: catalog/pg_aggregate.c:512 catalog/pg_proc.c:199 catalog/pg_proc.c:228 +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:202 catalog/pg_proc.c:231 #, c-format msgid "unsafe use of pseudo-type \"internal\"" msgstr "\"internal\" ì˜ì‚¬-ìžë£Œí˜•ì˜ ì‚¬ìš©ì´ ì•ˆì „í•˜ì§€ 않습니다" -#: catalog/pg_aggregate.c:566 +#: catalog/pg_aggregate.c:567 #, c-format msgid "" "moving-aggregate implementation returns type %s, but plain implementation " "returns type %s" msgstr "" +"움ì§ì´ëŠ” ì§‘ê³„í•¨ìˆ˜ì˜ êµ¬í˜„ëœ ë°˜í™˜ ìžë£Œí˜•ì€ %s 형ì´ì§€ë§Œ, ì¼ë°˜ í•¨ìˆ˜ì˜ êµ¬í˜„ëœ ìžë£Œ" +"í˜•ì€ %s 형입니다." -#: catalog/pg_aggregate.c:577 +#: catalog/pg_aggregate.c:578 #, c-format msgid "sort operator can only be specified for single-argument aggregates" msgstr "ì •ë ¬ ì—°ì‚°ìžëŠ” ë‹¨ì¼ ì¸ìž 집계ì—ë§Œ 지정할 수 있ìŒ" -#: catalog/pg_aggregate.c:704 catalog/pg_proc.c:374 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:384 #, c-format msgid "cannot change routine kind" msgstr "루틴 종류를 바꿀 수 ì—†ìŒ" -#: catalog/pg_aggregate.c:706 +#: catalog/pg_aggregate.c:708 #, c-format msgid "\"%s\" is an ordinary aggregate function." msgstr "\"%s\" 개체는 ordinary 집계 함수입니다" -#: catalog/pg_aggregate.c:708 +#: catalog/pg_aggregate.c:710 #, c-format msgid "\"%s\" is an ordered-set aggregate." msgstr "\"%s\" 개체는 ì •ë ¬ëœ ì§‘í•© 집계 함수입니다" -#: catalog/pg_aggregate.c:710 +#: catalog/pg_aggregate.c:712 #, c-format msgid "\"%s\" is a hypothetical-set aggregate." -msgstr "" +msgstr "\"%s\" 함수는 ê°€ìƒ ì§‘í•© 집계 함수입니다." -#: catalog/pg_aggregate.c:715 +#: catalog/pg_aggregate.c:717 #, c-format msgid "cannot change number of direct arguments of an aggregate function" msgstr "집계 í•¨ìˆ˜ì˜ direct ì¸ìž 번호는 바꿀 수 ì—†ìŒ" -#: catalog/pg_aggregate.c:870 commands/functioncmds.c:667 -#: commands/typecmds.c:1658 commands/typecmds.c:1704 commands/typecmds.c:1756 -#: commands/typecmds.c:1793 commands/typecmds.c:1827 commands/typecmds.c:1861 -#: commands/typecmds.c:1895 commands/typecmds.c:1972 commands/typecmds.c:2014 -#: parser/parse_func.c:414 parser/parse_func.c:443 parser/parse_func.c:468 -#: parser/parse_func.c:482 parser/parse_func.c:602 parser/parse_func.c:622 -#: parser/parse_func.c:2129 parser/parse_func.c:2320 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:686 +#: commands/typecmds.c:1985 commands/typecmds.c:2031 commands/typecmds.c:2083 +#: commands/typecmds.c:2120 commands/typecmds.c:2154 commands/typecmds.c:2188 +#: commands/typecmds.c:2222 commands/typecmds.c:2251 commands/typecmds.c:2338 +#: commands/typecmds.c:2380 parser/parse_func.c:417 parser/parse_func.c:448 +#: parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 +#: parser/parse_func.c:631 parser/parse_func.c:2172 parser/parse_func.c:2445 #, c-format msgid "function %s does not exist" msgstr "%s ì´ë¦„ì˜ í•¨ìˆ˜ê°€ ì—†ìŒ" -#: catalog/pg_aggregate.c:876 +#: catalog/pg_aggregate.c:864 #, c-format msgid "function %s returns a set" msgstr "%s 함수는 한 setì„ ë¦¬í„´í•¨" -#: catalog/pg_aggregate.c:891 +#: catalog/pg_aggregate.c:879 #, c-format msgid "function %s must accept VARIADIC ANY to be used in this aggregate" msgstr "%s 함수가 ì´ ì§‘ê³„ìž‘ì—…ì— ì‚¬ìš©ë˜ë ¤ë©´ VARIADIC ANY í˜•ì„ ìˆ˜ìš©í•´ì•¼ 합니다." -#: catalog/pg_aggregate.c:915 +#: catalog/pg_aggregate.c:903 #, c-format msgid "function %s requires run-time type coercion" msgstr "%s 함수는 run-time type coercionì„ í•„ìš”ë¡œ 함" -#: catalog/pg_cast.c:67 +#: catalog/pg_cast.c:75 #, c-format msgid "cast from type %s to type %s already exists" msgstr "%s 형ì—서 %s 형으로 변환하는 형변환 규칙(cast)ì´ ì´ë¯¸ 있습니다" -#: catalog/pg_collation.c:93 catalog/pg_collation.c:140 +#: catalog/pg_class.c:29 +#, c-format +msgid "This operation is not supported for tables." +msgstr "ì´ ìž‘ì—…ì€ í…Œì´ë¸” 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." + +#: catalog/pg_class.c:31 +#, c-format +msgid "This operation is not supported for indexes." +msgstr "ì´ ìž‘ì—…ì€ ì¸ë±ìФ 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." + +#: catalog/pg_class.c:33 +#, c-format +msgid "This operation is not supported for sequences." +msgstr "ì´ ìž‘ì—…ì€ ì‹œí€€ìŠ¤ 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." + +#: catalog/pg_class.c:35 +#, c-format +msgid "This operation is not supported for TOAST tables." +msgstr "ì´ ìž‘ì—…ì€ TOAST í…Œì´ë¸” 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." + +#: catalog/pg_class.c:37 +#, c-format +msgid "This operation is not supported for views." +msgstr "ì´ ìž‘ì—…ì€ ë·° 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." + +#: catalog/pg_class.c:39 +#, c-format +msgid "This operation is not supported for materialized views." +msgstr "ì´ ìž‘ì—…ì€ êµ¬ì²´í™”ëœ ë·° 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." + +#: catalog/pg_class.c:41 +#, c-format +msgid "This operation is not supported for composite types." +msgstr "ì´ ìž‘ì—…ì€ ë³µí•© ìžë£Œí˜• 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." + +#: catalog/pg_class.c:43 +#, c-format +msgid "This operation is not supported for foreign tables." +msgstr "ì´ ìž‘ì—…ì€ ì™¸ë¶€ í…Œì´ë¸” 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." + +#: catalog/pg_class.c:45 +#, c-format +msgid "This operation is not supported for partitioned tables." +msgstr "ì´ ìž‘ì—…ì€ íŒŒí‹°ì…˜ ëœ í…Œì´ë¸” 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." + +#: catalog/pg_class.c:47 +#, c-format +msgid "This operation is not supported for partitioned indexes." +msgstr "ì´ ìž‘ì—…ì€ íŒŒí‹°ì…˜ ëœ ì¸ë±ìФ 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." + +#: catalog/pg_collation.c:101 catalog/pg_collation.c:159 #, c-format msgid "collation \"%s\" already exists, skipping" msgstr "\"%s\" ì´ë¦„ì˜ ì •ë ¬ê·œì¹™ì´ ì´ë¯¸ 있습니다, 건너뜀" -#: catalog/pg_collation.c:95 +#: catalog/pg_collation.c:103 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" msgstr "\"%s\" ì •ë ¬ê·œì¹™ì´ \"%s\" ì¸ì½”ë”©ì— ì´ë¯¸ 지정ë˜ì–´ 있습니다, 건너뜀" -#: catalog/pg_collation.c:103 catalog/pg_collation.c:147 +#: catalog/pg_collation.c:111 catalog/pg_collation.c:166 #, c-format msgid "collation \"%s\" already exists" msgstr "\"%s\" ì •ë ¬ê·œì¹™ì´ ì´ë¯¸ 있습니다" -#: catalog/pg_collation.c:105 +#: catalog/pg_collation.c:113 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "\"%s\" ì •ë ¬ê·œì¹™ì´ \"%s\" ì¸ì½”ë”©ì— ì´ë¯¸ 지정ë˜ì–´ 있습니다" -#: catalog/pg_constraint.c:676 +#: catalog/pg_constraint.c:732 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "\"%s\" 제약 ì¡°ê±´ì´ %s ë„ë©”ì¸ì— ì´ë¯¸ 지정ë˜ì–´ 있습니다" -#: catalog/pg_constraint.c:874 catalog/pg_constraint.c:967 +#: catalog/pg_constraint.c:932 catalog/pg_constraint.c:1025 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "\"%s\" 제약 ì¡°ê±´ì€ \"%s\" í…Œì´ë¸”ì— ì—†ìŒ" -#: catalog/pg_constraint.c:1056 +#: catalog/pg_constraint.c:1125 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "\"%s\" 제약 ì¡°ê±´ì€ %s ë„ë©”ì¸ì— ì—†ìŒ" -#: catalog/pg_conversion.c:67 +#: catalog/pg_conversion.c:64 #, c-format msgid "conversion \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ë³€í™˜ê·œì¹™(conversion)ì´ ì´ë¯¸ 있ìŒ" -#: catalog/pg_conversion.c:80 +#: catalog/pg_conversion.c:77 #, c-format msgid "default conversion for %s to %s already exists" msgstr "%s 코드ì—서 %s 코드로 변환하는 기본 변환규칙(conversion)ì€ ì´ë¯¸ 있ìŒ" -#: catalog/pg_depend.c:162 commands/extension.c:3324 +#: catalog/pg_depend.c:224 commands/extension.c:3397 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s 개체는 \"%s\" í™•ìž¥ëª¨ë“ˆì— ì´ë¯¸ 구성ì›ìž…니다" -#: catalog/pg_depend.c:538 +#: catalog/pg_depend.c:231 catalog/pg_depend.c:282 commands/extension.c:3437 +#, c-format +msgid "%s is not a member of extension \"%s\"" +msgstr "\"%s\" 개체는 \"%s\" 확장 ëª¨ë“ˆì˜ êµ¬ì„± 요소가 아닙니다" + +#: catalog/pg_depend.c:234 +#, c-format +msgid "An extension is not allowed to replace an object that it does not own." +msgstr "확장 ëª¨ë“ˆì´ ìžê¸° 소유 ê°ì²´ê°€ 아닌 ê°ì²´ë¥¼ ë®ì–´ 쓸 수는 없습니다." + +#: catalog/pg_depend.c:285 +#, c-format +msgid "" +"An extension may only use CREATE ... IF NOT EXISTS to skip object creation " +"if the conflicting object is one that it already owns." +msgstr "" +"ì´ë¯¸ 있는 ê°ì²´ì™€ ì¶©ëŒì„ 피하기 위해 ì´ë¯¸ 있는 ê°ì²´ ìƒì„±ì„ 건너뛰려면, 확장 모" +"듈ì—서 CREATE ... IF NOT EXISTS êµ¬ë¬¸ì„ ì‚¬ìš©í•´ì•¼í•©ë‹ˆë‹¤." + +#: catalog/pg_depend.c:648 #, c-format msgid "cannot remove dependency on %s because it is a system object" -msgstr "%s ì˜ì¡´ê°œì²´ë“¤ì€ 시스템 개체ì´ê¸° ë•Œë¬¸ì— ì‚­ì œ ë  ìˆ˜ 없습니다" +msgstr "%s ê°ì²´ê°€ 시스템 ê°ì²´ì´ê¸° ë•Œë¬¸ì— ì˜ì¡´ì„±ì„ 없앨 수 없습니다." -#: catalog/pg_enum.c:127 catalog/pg_enum.c:230 catalog/pg_enum.c:525 +#: catalog/pg_enum.c:175 catalog/pg_enum.c:314 catalog/pg_enum.c:624 #, c-format msgid "invalid enum label \"%s\"" msgstr "\"%s\" 열거형 ë¼ë²¨ì´ 잘못ë¨" -#: catalog/pg_enum.c:128 catalog/pg_enum.c:231 catalog/pg_enum.c:526 +#: catalog/pg_enum.c:176 catalog/pg_enum.c:315 catalog/pg_enum.c:625 #, c-format -msgid "Labels must be %d characters or less." -msgstr "ë¼ë²¨ì€ %dìž ì´í•˜ì—¬ì•¼ 합니다." +msgid "Labels must be %d bytes or less." +msgstr "ë¼ë²¨ì€ %d ë°”ì´íЏ ì´í•˜ì—¬ì•¼ 합니다." -#: catalog/pg_enum.c:259 +#: catalog/pg_enum.c:343 #, c-format msgid "enum label \"%s\" already exists, skipping" msgstr "\"%s\" ì´ë¦„ì˜ ì—´ê±°í˜• ë¼ë²¨ì´ ì´ë¯¸ 있ìŒ, 건너뜀" -#: catalog/pg_enum.c:266 catalog/pg_enum.c:569 +#: catalog/pg_enum.c:350 catalog/pg_enum.c:668 #, c-format msgid "enum label \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ì—´ê±°í˜• ë¼ë²¨ì´ ì´ë¯¸ 있ìŒ" -#: catalog/pg_enum.c:321 catalog/pg_enum.c:564 +#: catalog/pg_enum.c:405 catalog/pg_enum.c:663 #, c-format msgid "\"%s\" is not an existing enum label" msgstr "\"%s\" 열거형 ë¼ë²¨ì´ ì—†ìŒ" -#: catalog/pg_enum.c:379 +#: catalog/pg_enum.c:463 #, c-format msgid "pg_enum OID value not set when in binary upgrade mode" msgstr "ì´ì§„ 업그레ì´ë“œ 작업 때 pg_enum OID ê°’ì´ ì§€ì •ë˜ì§€ 않았습니다" -#: catalog/pg_enum.c:389 +#: catalog/pg_enum.c:473 #, c-format msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" msgstr "" "ALTER TYPE ADD BEFORE/AFTER êµ¬ë¬¸ì€ ì´ì§„ 업그레ì´ë“œ 작업ì—서 호환하지 않습니다" -#: catalog/pg_namespace.c:64 commands/schemacmds.c:265 +#: catalog/pg_inherits.c:592 +#, c-format +msgid "cannot detach partition \"%s\"" +msgstr "\"%s\" 하위 파티션 í…Œì´ë¸”ì„ ë—„ 수 ì—†ìŒ" + +#: catalog/pg_inherits.c:594 +#, c-format +msgid "" +"The partition is being detached concurrently or has an unfinished detach." +msgstr "" +"ì´ íŒŒí‹°ì…˜ì€ ì´ë¯¸ concurrently ì˜µì…˜ì„ ì‚¬ìš©í•´ì„œ 떼기 ìž‘ì—…ì„ í–ˆê±°ë‚˜, ì•„ì§ ë–¼ê¸°" +"ê°€ 안 ë났습니다." + +#: catalog/pg_inherits.c:595 commands/tablecmds.c:4800 +#: commands/tablecmds.c:16153 +#, c-format +msgid "" +"Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending " +"detach operation." +msgstr "" +"보류 ì¤‘ì¸ ë–¼ê¸°ë¥¼ 마치려면, ALTER TABLE ... DETACH PARTITION ... FINALIZE 명령" +"ì„ ì‚¬ìš©í•˜ì„¸ìš”." + +#: catalog/pg_inherits.c:599 +#, c-format +msgid "cannot complete detaching partition \"%s\"" +msgstr "\"%s\" 파티션 떼기를 ë낼 수 없습니다" + +#: catalog/pg_inherits.c:601 +#, c-format +msgid "There's no pending concurrent detach." +msgstr "현재 보류 ì¤‘ì¸ ë–¼ê¸° ìž‘ì—…ì´ ì—†ìŠµë‹ˆë‹¤." + +#: catalog/pg_namespace.c:64 commands/schemacmds.c:273 #, c-format msgid "schema \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ìŠ¤í‚¤ë§ˆ(schema)ê°€ ì´ë¯¸ 있ìŒ" -#: catalog/pg_operator.c:219 catalog/pg_operator.c:361 +#: catalog/pg_operator.c:213 catalog/pg_operator.c:355 #, c-format msgid "\"%s\" is not a valid operator name" msgstr "\"%s\" 타당한 ì—°ì‚°ìž ì´ë¦„ì´ ì•„ë‹˜" -#: catalog/pg_operator.c:370 +#: catalog/pg_operator.c:379 +#, c-format +msgid "operator %s already exists" +msgstr "%s ì—°ì‚°ìžê°€ ì´ë¯¸ 있ìŒ" + +#: catalog/pg_operator.c:445 commands/operatorcmds.c:600 +#, c-format +msgid "operator cannot be its own negator" +msgstr "ì—°ì‚°ìžëŠ” ìžì‹ ì˜ negator ì—°ì‚°ìžê°€ ë  ìˆ˜ ì—†ìŒ" + +#: catalog/pg_operator.c:572 #, c-format msgid "only binary operators can have commutators" -msgstr "_^_ ë°”ì´ë„ˆë¦¬ ì—°ì‚°ìžë§Œì´ commutator를 가질 수 있ìŒ" +msgstr "ë°”ì´ë„ˆë¦¬ ì—°ì‚°ìžë§Œì´ commutator를 가질 수 있ìŒ" -#: catalog/pg_operator.c:374 commands/operatorcmds.c:495 +#: catalog/pg_operator.c:576 #, c-format msgid "only binary operators can have join selectivity" -msgstr "_^_ ë°”ì´ë„ˆë¦¬ ì—°ì‚°ìžë§Œì´ join selectivity를 가질 수 있ìŒ" +msgstr "ë°”ì´ë„ˆë¦¬ ì—°ì‚°ìžë§Œì´ join selectivity를 가질 수 있ìŒ" -#: catalog/pg_operator.c:378 +#: catalog/pg_operator.c:580 #, c-format msgid "only binary operators can merge join" -msgstr "_^_ ë°”ì´ë„ˆë¦¬ ì—°ì‚°ìžë§Œì´ merge joiní•  수 있ìŒ" +msgstr "ë°”ì´ë„ˆë¦¬ ì—°ì‚°ìžë§Œì´ merge joiní•  수 있ìŒ" -#: catalog/pg_operator.c:382 +#: catalog/pg_operator.c:584 #, c-format msgid "only binary operators can hash" -msgstr "_^_ ë°”ì´ë„ˆë¦¬ ì—°ì‚°ìžë§Œì´ 해시할 수 있ìŒ" +msgstr "ë°”ì´ë„ˆë¦¬ ì—°ì‚°ìžë§Œì´ 해시할 수 있ìŒ" -#: catalog/pg_operator.c:393 +#: catalog/pg_operator.c:593 #, c-format msgid "only boolean operators can have negators" -msgstr "부울 ì—°ì‚°ìžë§Œ 부정어를 í¬í•¨í•  수 있ìŒ" +msgstr "불리언 ì—°ì‚°ìžë§Œ 부정어를 í¬í•¨í•  수 있ìŒ" -#: catalog/pg_operator.c:397 commands/operatorcmds.c:503 +#: catalog/pg_operator.c:597 #, c-format msgid "only boolean operators can have restriction selectivity" -msgstr "부울 ì—°ì‚°ìžë§Œ 제한 ì„ íƒì„ í¬í•¨í•  수 있ìŒ" +msgstr "불리언 ì—°ì‚°ìžë§Œ 제한 ì„ íƒì„ í¬í•¨í•  수 있ìŒ" -#: catalog/pg_operator.c:401 commands/operatorcmds.c:507 +#: catalog/pg_operator.c:601 #, c-format msgid "only boolean operators can have join selectivity" -msgstr "부울 ì—°ì‚°ìžë§Œ ì¡°ì¸ ì„ íƒì„ í¬í•¨í•  수 있ìŒ" +msgstr "불리언 ì—°ì‚°ìžë§Œ ì¡°ì¸ ì„ íƒì„ í¬í•¨í•  수 있ìŒ" -#: catalog/pg_operator.c:405 +#: catalog/pg_operator.c:605 #, c-format msgid "only boolean operators can merge join" -msgstr "부울 ì—°ì‚°ìžë§Œ 머지 ì¡°ì¸ì„ 지정할 수 있ìŒ" +msgstr "불리언 ì—°ì‚°ìžë§Œ 머지 ì¡°ì¸ì„ 지정할 수 있ìŒ" -#: catalog/pg_operator.c:409 +#: catalog/pg_operator.c:609 #, c-format msgid "only boolean operators can hash" -msgstr "부울 ì—°ì‚°ìžë§Œ 해시를 지정할 수 있ìŒ" +msgstr "불리언 ì—°ì‚°ìžë§Œ 해시를 지정할 수 있ìŒ" -#: catalog/pg_operator.c:421 +#: catalog/pg_operator.c:739 #, c-format -msgid "operator %s already exists" -msgstr "%s ì—°ì‚°ìžê°€ ì´ë¯¸ 있ìŒ" +msgid "commutator operator %s is already the commutator of operator %s" +msgstr "%s commutator ì—°ì‚°ìžëŠ” ì´ë¯¸ %s ì—°ì‚°ìžì˜ commutatorìž„" + +#: catalog/pg_operator.c:744 +#, c-format +msgid "commutator operator %s is already the commutator of operator %u" +msgstr "%s commutator ì—°ì‚°ìžëŠ” ì´ë¯¸ %u ì—°ì‚°ìžì˜ commutatorìž„" + +#: catalog/pg_operator.c:807 +#, c-format +msgid "negator operator %s is already the negator of operator %s" +msgstr "%s negator ì—°ì‚°ìžëŠ” ì´ë¯¸ %s ì—°ì‚°ìžì˜ negatorìž„" + +#: catalog/pg_operator.c:812 +#, c-format +msgid "negator operator %s is already the negator of operator %u" +msgstr "%s negator ì—°ì‚°ìžëŠ” ì´ë¯¸ %u ì—°ì‚°ìžì˜ negatorìž„" -#: catalog/pg_operator.c:621 +#: catalog/pg_parameter_acl.c:50 #, c-format -msgid "operator cannot be its own negator or sort operator" -msgstr "ì—°ì‚°ìžëŠ” ìžì‹ ì˜ negator나 sort ì—°ì‚°ìžê°€ ë  ìˆ˜ 없습니다" +msgid "parameter ACL \"%s\" does not exist" +msgstr "\"%s\" 매개 변수 ACLì´ ì—†ìŒ" -#: catalog/pg_proc.c:127 parser/parse_func.c:2191 +#: catalog/pg_proc.c:130 parser/parse_func.c:2234 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" msgstr[0] "함수는 %dê°œ ì´ìƒì˜ ì¸ìžë¥¼ 사용할 수 ì—†ìŒ" -#: catalog/pg_proc.c:364 +#: catalog/pg_proc.c:374 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "ì´ë¯¸ ê°™ì€ ì¸ìž ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ëŠ” \"%s\" 함수가 있습니다" -#: catalog/pg_proc.c:376 +#: catalog/pg_proc.c:386 #, c-format msgid "\"%s\" is an aggregate function." msgstr "\"%s\" 개체는 집계 함수입니다" -#: catalog/pg_proc.c:378 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is a function." msgstr "\"%s\" 개체는 함수입니다." -#: catalog/pg_proc.c:380 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a procedure." msgstr "\"%s\" 개체는 프로시져입니다." -#: catalog/pg_proc.c:382 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a window function." msgstr "\"%s\" 개체는 윈ë„ìš° 함수입니다." -#: catalog/pg_proc.c:402 +#: catalog/pg_proc.c:412 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "프로시져는 출력 매개 변수를 사용하ë„ë¡ ë³€ê²½ í•  수 ì—†ìŒ" -#: catalog/pg_proc.c:403 catalog/pg_proc.c:433 +#: catalog/pg_proc.c:413 catalog/pg_proc.c:443 #, c-format msgid "cannot change return type of existing function" msgstr "ì´ë¯¸ 있는 í•¨ìˆ˜ì˜ ë¦¬í„´ ìžë£Œí˜•ì€ ë°”ê¿€ 수 없습니다" @@ -5674,89 +6738,115 @@ msgstr "ì´ë¯¸ 있는 í•¨ìˆ˜ì˜ ë¦¬í„´ ìžë£Œí˜•ì€ ë°”ê¿€ 수 없습니다" #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: catalog/pg_proc.c:409 catalog/pg_proc.c:436 catalog/pg_proc.c:481 -#: catalog/pg_proc.c:507 catalog/pg_proc.c:533 +#: catalog/pg_proc.c:419 catalog/pg_proc.c:446 catalog/pg_proc.c:491 +#: catalog/pg_proc.c:517 catalog/pg_proc.c:541 #, c-format msgid "Use %s %s first." msgstr "먼저 %s %s ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: catalog/pg_proc.c:434 +#: catalog/pg_proc.c:444 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "OUT 매개 ë³€ìˆ˜ì— ì •ì˜ëœ í–‰ 형ì‹ì´ 다릅니다." -#: catalog/pg_proc.c:478 +#: catalog/pg_proc.c:488 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "\"%s\" ìž…ë ¥ 매개 변수 ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ" -#: catalog/pg_proc.c:505 +#: catalog/pg_proc.c:515 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "기존 함수ì—서 매개 변수 기본 ê°’ì„ ì œê±°í•  수 ì—†ìŒ" -#: catalog/pg_proc.c:531 +#: catalog/pg_proc.c:539 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "기존 매개 변수 기본 ê°’ì˜ ë°ì´í„° 형ì‹ì„ 바꿀 수 ì—†ìŒ" -#: catalog/pg_proc.c:748 +#: catalog/pg_proc.c:750 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "\"%s\" ì´ë¦„ì˜ ë‚´ìž¥ 함수가 ì—†ìŒ" -#: catalog/pg_proc.c:846 +#: catalog/pg_proc.c:843 #, c-format msgid "SQL functions cannot return type %s" msgstr "SQL 함수는 %s ìžë£Œí˜•ì„ ë¦¬í„´í•  수 ì—†ìŒ" -#: catalog/pg_proc.c:861 +#: catalog/pg_proc.c:858 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "SQL í•¨ìˆ˜ì˜ ì¸ìžë¡œ %s ìžë£Œí˜•ì€ ì‚¬ìš©ë  ìˆ˜ 없습니다" -#: catalog/pg_proc.c:954 executor/functions.c:1446 +#: catalog/pg_proc.c:986 executor/functions.c:1468 #, c-format msgid "SQL function \"%s\"" msgstr "\"%s\" SQL 함수" -#: catalog/pg_publication.c:59 +#: catalog/pg_publication.c:66 catalog/pg_publication.c:74 +#: catalog/pg_publication.c:82 catalog/pg_publication.c:88 +#, c-format +msgid "cannot add relation \"%s\" to publication" +msgstr "\"%s\" 릴레ì´ì…˜ì„ ë°œí–‰ì— ì¶”ê°€í•  수 ì—†ìŒ" + +#: catalog/pg_publication.c:76 +#, c-format +msgid "This operation is not supported for system tables." +msgstr "ì´ ìž‘ì—…ì€ ì‹œìŠ¤í…œ í…Œì´ë¸” 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." + +#: catalog/pg_publication.c:84 #, c-format -msgid "Only tables can be added to publications." -msgstr "í…Œì´ë¸” 개체만 ë°œí–‰ì— ì¶”ê°€í•  수 있습니다." +msgid "This operation is not supported for temporary tables." +msgstr "ì´ ìž‘ì—…ì€ ìž„ì‹œ í…Œì´ë¸” 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." -#: catalog/pg_publication.c:65 +#: catalog/pg_publication.c:90 #, c-format -msgid "\"%s\" is a system table" -msgstr "\"%s\" 개체는 시스템 í…Œì´ë¸”입니다." +msgid "This operation is not supported for unlogged tables." +msgstr "ì´ ìž‘ì—…ì€ ì–¸ë¡œê·¸ë“œ í…Œì´ë¸” 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." -#: catalog/pg_publication.c:67 +#: catalog/pg_publication.c:104 catalog/pg_publication.c:112 #, c-format -msgid "System tables cannot be added to publications." -msgstr "시스템 í…Œì´ë¸”ì€ ë°œí–‰ì— ì¶”ê°€í•  수 없습니다." +msgid "cannot add schema \"%s\" to publication" +msgstr "\"%s\" 스키마를 ë°œí–‰ì— ì¶”ê°€í•  수 ì—†ìŒ" -#: catalog/pg_publication.c:73 +#: catalog/pg_publication.c:106 #, c-format -msgid "table \"%s\" cannot be replicated" -msgstr "\"%s\" í…Œì´ë¸”ì€ ë³µì œë  ìˆ˜ ì—†ìŒ" +msgid "This operation is not supported for system schemas." +msgstr "ì´ ìž‘ì—…ì€ ì‹œìŠ¤í…œ 스키마 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." -#: catalog/pg_publication.c:75 +#: catalog/pg_publication.c:114 #, c-format -msgid "Temporary and unlogged relations cannot be replicated." -msgstr "임시 í…Œì´ë¸”, unlogged í…Œì´ë¸”ì€ ë³µì œë  ìˆ˜ ì—†ìŒ" +msgid "Temporary schemas cannot be replicated." +msgstr "임시 스키마는 복제할 수 없습니다." -#: catalog/pg_publication.c:174 +#: catalog/pg_publication.c:392 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "\"%s\" 릴레ì´ì…˜ì€ ì´ë¯¸ \"%s\" ë°œí–‰ì— í¬í•¨ë˜ì–´ 있습니다" -#: catalog/pg_publication.c:470 commands/publicationcmds.c:451 -#: commands/publicationcmds.c:762 +#: catalog/pg_publication.c:534 #, c-format -msgid "publication \"%s\" does not exist" -msgstr "\"%s\" ì´ë¦„ì˜ ë°œí–‰ì€ ì—†ìŠµë‹ˆë‹¤" +msgid "cannot use system column \"%s\" in publication column list" +msgstr "\"%s\" ì¹¼ëŸ¼ì€ ì‹œìŠ¤í…œ 칼럼입니다. 발행 칼럼 목ë¡ì— í¬í•¨ë  수 없습니다." + +#: catalog/pg_publication.c:540 +#, c-format +msgid "cannot use generated column \"%s\" in publication column list" +msgstr "" +"\"%s\" ì¹¼ëŸ¼ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ìœ¼ë¡œ 발행 칼럼 목ë¡ì— í¬í•¨ë  수 없습니다." -#: catalog/pg_shdepend.c:776 +#: catalog/pg_publication.c:546 +#, c-format +msgid "duplicate column \"%s\" in publication column list" +msgstr "\"%s\" ì¹¼ëŸ¼ì´ ë°œí–‰ 칼럼 목ë¡ì— 중복 ë˜ì—ˆìŠµë‹ˆë‹¤." + +#: catalog/pg_publication.c:636 +#, c-format +msgid "schema \"%s\" is already member of publication \"%s\"" +msgstr "\"%s\" 스키마는 ì´ë¯¸ \"%s\" ë°œí–‰ì— í¬í•¨ë˜ì–´ 있습니다" + +#: catalog/pg_shdepend.c:875 #, c-format msgid "" "\n" @@ -5765,45 +6855,57 @@ msgid_plural "" "\n" "and objects in %d other databases (see server log for list)" msgstr[0] "" +"\n" +", %dê°œì˜ ë‹¤ë¥¸ ë°ì´í„°í…Œì´ìФ ì†Œì† ê°ì²´ë“¤ (목ë¡ì€ 서버 로그 참조)" -#: catalog/pg_shdepend.c:1082 +#: catalog/pg_shdepend.c:1222 #, c-format msgid "role %u was concurrently dropped" msgstr "%u ë¡¤ì´ ë™ì‹œì— ì‚­ì œë˜ì—ˆìŒ" -#: catalog/pg_shdepend.c:1101 +#: catalog/pg_shdepend.c:1234 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "%u í…Œì´ë¸”스페ì´ìŠ¤ëŠ” 현재 ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤" -#: catalog/pg_shdepend.c:1116 +#: catalog/pg_shdepend.c:1248 #, c-format msgid "database %u was concurrently dropped" msgstr "%u ë°ì´í„°ë² ì´ìŠ¤ëŠ” 현재 ì‚­ì œë˜ì—ˆìŠµë‹ˆë‹¤" -#: catalog/pg_shdepend.c:1161 +#: catalog/pg_shdepend.c:1299 #, c-format msgid "owner of %s" msgstr "%s ê°œì²´ì˜ ì†Œìœ ì£¼" -#: catalog/pg_shdepend.c:1163 +#: catalog/pg_shdepend.c:1301 #, c-format msgid "privileges for %s" -msgstr "\"%s\"ì— ëŒ€í•œ 권한" +msgstr "%sì— ëŒ€í•œ 권한" + +#: catalog/pg_shdepend.c:1303 +#, c-format +msgid "initial privileges for %s" +msgstr "%sì— ëŒ€í•œ 초기 권한" -#: catalog/pg_shdepend.c:1165 +#: catalog/pg_shdepend.c:1305 #, c-format msgid "target of %s" msgstr "%s 개체 대ìƒ" +#: catalog/pg_shdepend.c:1307 +#, c-format +msgid "tablespace for %s" +msgstr "%s ìš© í…Œì´ë¸”스페ì´ìФ" + #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1173 +#: catalog/pg_shdepend.c:1315 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" msgstr[0] "%d 개체(ë°ì´í„°ë² ì´ìФ: %s)" -#: catalog/pg_shdepend.c:1284 +#: catalog/pg_shdepend.c:1379 #, c-format msgid "" "cannot drop objects owned by %s because they are required by the database " @@ -5812,7 +6914,7 @@ msgstr "" "%s ì†Œìœ ì£¼ì˜ ê°œì²´ 삭제는 ê·¸ ë°ì´í„°ë² ì´ìФ 시스템ì—서 필요하기 ë•Œë¬¸ì— ì‚­ì œ ë  " "수 ì—†ìŒ" -#: catalog/pg_shdepend.c:1431 +#: catalog/pg_shdepend.c:1560 #, c-format msgid "" "cannot reassign ownership of objects owned by %s because they are required " @@ -5821,221 +6923,261 @@ msgstr "" "%s ì†Œìœ ì£¼ì˜ ê°œì²´ 삭제는 ê·¸ ë°ì´í„°ë² ì´ìФ 시스템ì—서 필요하기 ë•Œë¬¸ì— ì‚­ì œ ë  " "수 ì—†ìŒ" -#: catalog/pg_subscription.c:171 commands/subscriptioncmds.c:644 -#: commands/subscriptioncmds.c:858 commands/subscriptioncmds.c:1080 +#: catalog/pg_subscription.c:438 #, c-format -msgid "subscription \"%s\" does not exist" -msgstr "\"%s\" ì´ë¦„ì˜ êµ¬ë…ì€ ì—†ìŠµë‹ˆë‹¤." +msgid "could not drop relation mapping for subscription \"%s\"" +msgstr "\"%s\" 구ë…ìš© 릴레ì´ì…˜ 맵핑 ì‚­ì œ 실패" + +#: catalog/pg_subscription.c:440 +#, c-format +msgid "" +"Table synchronization for relation \"%s\" is in progress and is in state " +"\"%c\"." +msgstr "\"%s\" 릴레ì´ì…˜ì˜ ë™ê¸°í™” ìž‘ì—…ì€ í˜„ìž¬ 진행중ì´ê³ , ìƒíƒœê°€ \"%c\" ìž„." + +#. translator: first %s is a SQL ALTER command and second %s is a +#. SQL DROP command +#. +#: catalog/pg_subscription.c:447 +#, c-format +msgid "" +"Use %s to enable subscription if not already enabled or use %s to drop the " +"subscription." +msgstr "" +"ì•„ì§ í™œì„±í™”ë˜ì§€ ì•Šì€ êµ¬ë…ì„ í™œì„±í™” 하기위해 %s ëª…ë ¹ì„ ì´ìš©í•˜ê±°ë‚˜, 해당 구ë…" +"ì„ ì§€ìš°ë ¤ë©´ %s ëª…ë ¹ì„ ì´ìš©í•˜ì„¸ìš”." -#: catalog/pg_type.c:131 catalog/pg_type.c:468 +#: catalog/pg_type.c:133 catalog/pg_type.c:474 #, c-format msgid "pg_type OID value not set when in binary upgrade mode" msgstr "ì´ì§„ 업그레ì´ë“œ 작업 때 pg_type OID ê°’ì´ ì§€ì •ë˜ì§€ 않았습니다" -#: catalog/pg_type.c:249 +#: catalog/pg_type.c:253 #, c-format msgid "invalid type internal size %d" msgstr "ìž˜ëª»ëœ ìžë£Œí˜•ì˜ ë‚´ë¶€ í¬ê¸° %d" -#: catalog/pg_type.c:265 catalog/pg_type.c:273 catalog/pg_type.c:281 -#: catalog/pg_type.c:290 +#: catalog/pg_type.c:269 catalog/pg_type.c:277 catalog/pg_type.c:285 +#: catalog/pg_type.c:294 #, c-format msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" msgstr "\"%c\" ì •ë ¬ì€ í¬ê¸°ê°€ %dì¸ ì „ë‹¬ ê°’ 형ì‹ì— 유효하지 않ìŒ" -#: catalog/pg_type.c:297 +#: catalog/pg_type.c:301 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "ë‚´ë¶€ í¬ê¸° %dì€(는) 전달 ê°’ 형ì‹ì— 유효하지 않ìŒ" -#: catalog/pg_type.c:307 catalog/pg_type.c:313 +#: catalog/pg_type.c:311 catalog/pg_type.c:317 #, c-format msgid "alignment \"%c\" is invalid for variable-length type" msgstr "\"%c\" ì •ë ¬ì€ ê°€ë³€ ê¸¸ì´ í˜•ì‹ì— 유효하지 않ìŒ" -#: catalog/pg_type.c:321 commands/typecmds.c:3727 +#: catalog/pg_type.c:325 commands/typecmds.c:4363 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "_^_ ê³ ì •í¬ê¸° ìžë£Œí˜•ì€ PLAIN ì €ìž¥ë°©ë²•ì„ ê°€ì ¸ì•¼ë§Œ 합니다" -#: catalog/pg_type.c:839 +#: catalog/pg_type.c:978 #, c-format -msgid "could not form array type name for type \"%s\"" -msgstr "\"%s\" 형ì‹ì˜ ë°°ì—´ í˜•ì‹ ì´ë¦„ì„ ìƒì„±í•  수 ì—†ìŒ" +msgid "Failed while creating a multirange type for type \"%s\"." +msgstr "\"%s\" ìžë£Œí˜•ìš© 다중 범위 ìžë£Œí˜•를 만들기 실패." -#: catalog/storage.c:449 storage/buffer/bufmgr.c:933 +#: catalog/pg_type.c:979 #, c-format -msgid "invalid page in block %u of relation %s" -msgstr "%u 블ë¡(해당 릴레ì´ì…˜: %s)ì— ìž˜ëª»ëœ íŽ˜ì´ì§€ê°€ 있ìŒ" +msgid "" +"You can manually specify a multirange type name using the " +"\"multirange_type_name\" attribute." +msgstr "" +"\"multirange_type_name\" ì†ì„±ì„ 사용해서 ì´ ë‹¤ì¤‘ 범위 ìžë£Œí˜• ì´ë¦„ì„ ì§ì ‘ 지정" +"하세요." -#: catalog/toasting.c:106 commands/indexcmds.c:639 commands/tablecmds.c:5638 -#: commands/tablecmds.c:15576 +#: catalog/storage.c:533 storage/buffer/bufmgr.c:1540 #, c-format -msgid "\"%s\" is not a table or materialized view" -msgstr "\"%s\" 개체는 í…Œì´ë¸”ë„ êµ¬ì²´í™”ëœ ë·°ë„ ì•„ë‹™ë‹ˆë‹¤" +msgid "invalid page in block %u of relation %s" +msgstr "%u 블ë¡(해당 릴레ì´ì…˜: %s)ì— ìž˜ëª»ëœ íŽ˜ì´ì§€ê°€ 있ìŒ" -#: commands/aggregatecmds.c:171 +#: commands/aggregatecmds.c:167 #, c-format msgid "only ordered-set aggregates can be hypothetical" -msgstr "순서 있는 세트 집계함수만 가설ì ì¼ 수 있습니다" +msgstr "순서 있는 ì§‘í•© 집계함수만 ê°€ìƒ ì§‘í•© 집계 함수로 쓸 수 있습니다." -#: commands/aggregatecmds.c:196 +#: commands/aggregatecmds.c:192 #, c-format msgid "aggregate attribute \"%s\" not recognized" msgstr "\"%s\" ì†ì„±ì„ aggregateì—서 알 수 ì—†ìŒ" -#: commands/aggregatecmds.c:206 +#: commands/aggregatecmds.c:202 #, c-format msgid "aggregate stype must be specified" -msgstr "aggregate stype ê°’ì„ ì§€ì •í•˜ì…”ì•¼í•©ë‹ˆë‹¤" +msgstr "aggregate stype ê°’ì„ ì§€ì •í•˜ì…”ì•¼ 합니다" -#: commands/aggregatecmds.c:210 +#: commands/aggregatecmds.c:206 #, c-format msgid "aggregate sfunc must be specified" -msgstr "aggregate sfunc ê°’ì„ ì§€ì •í•˜ì…”ì•¼í•©ë‹ˆë‹¤" +msgstr "aggregate sfunc ê°’ì„ ì§€ì •í•˜ì…”ì•¼ 합니다" -#: commands/aggregatecmds.c:222 +#: commands/aggregatecmds.c:218 #, c-format msgid "aggregate msfunc must be specified when mstype is specified" msgstr "mstype ì˜µì…˜ì„ ì‚¬ìš©í•˜ë©´ msfunc ì˜µì…˜ë„ í•¨ê»˜ 지정 해야 함" -#: commands/aggregatecmds.c:226 +#: commands/aggregatecmds.c:222 #, c-format msgid "aggregate minvfunc must be specified when mstype is specified" msgstr "mstype ì˜µì…˜ì„ ì‚¬ìš©í•˜ë©´ minvfunc ì˜µì…˜ë„ í•¨ê»˜ 지정 해야 함" -#: commands/aggregatecmds.c:233 +#: commands/aggregatecmds.c:229 #, c-format msgid "aggregate msfunc must not be specified without mstype" msgstr "msfunc ì˜µì…˜ì€ mstype 옵션과 함께 사용해야 함" -#: commands/aggregatecmds.c:237 +#: commands/aggregatecmds.c:233 #, c-format msgid "aggregate minvfunc must not be specified without mstype" msgstr "minvfunc ì˜µì…˜ì€ mstype 옵션과 함께 사용해야 함" -#: commands/aggregatecmds.c:241 +#: commands/aggregatecmds.c:237 #, c-format msgid "aggregate mfinalfunc must not be specified without mstype" msgstr "mfinalfunc ì˜µì…˜ì€ mstype 옵션과 함께 사용해야 함" -#: commands/aggregatecmds.c:245 +#: commands/aggregatecmds.c:241 #, c-format msgid "aggregate msspace must not be specified without mstype" msgstr "msspace ì˜µì…˜ì€ mstype 옵션과 함께 사용해야 함" -#: commands/aggregatecmds.c:249 +#: commands/aggregatecmds.c:245 #, c-format msgid "aggregate minitcond must not be specified without mstype" msgstr "minitcond ì˜µì…˜ì€ mstype 옵션과 함께 사용해야 함" -#: commands/aggregatecmds.c:278 +#: commands/aggregatecmds.c:274 #, c-format msgid "aggregate input type must be specified" msgstr "aggregate ìž…ë ¥ ìžë£Œí˜•ì„ ì§€ì •í•´ì•¼ 합니다" -#: commands/aggregatecmds.c:308 +#: commands/aggregatecmds.c:304 #, c-format msgid "basetype is redundant with aggregate input type specification" msgstr "집계 ìž…ë ¥ í˜•ì‹ ì§€ì •ì—서 basetypeì´ ì¤‘ë³µë¨" -#: commands/aggregatecmds.c:349 commands/aggregatecmds.c:390 +#: commands/aggregatecmds.c:347 commands/aggregatecmds.c:388 #, c-format msgid "aggregate transition data type cannot be %s" -msgstr "%s ìžë£Œí˜•ì€ aggregate transition ìžë£Œí˜•으로 사용할 수 없습니다" +msgstr "%s ìžë£Œí˜•ì€ STYPE ìžë£Œí˜•으로 사용할 수 없습니다" -#: commands/aggregatecmds.c:361 +#: commands/aggregatecmds.c:359 #, c-format msgid "" "serialization functions may be specified only when the aggregate transition " "data type is %s" -msgstr "" +msgstr "SERIALFUNC 함수는 STYPE ìžë£Œí˜•ì´ %s 형ì¼ë•Œë§Œ 지정할 수 있습니다." -#: commands/aggregatecmds.c:371 +#: commands/aggregatecmds.c:369 #, c-format msgid "" "must specify both or neither of serialization and deserialization functions" msgstr "" +"SERIALFUNC, DESERIALFUNC 함수를 ëª¨ë‘ ì§€ì •í•˜ê±°ë‚˜ ëª¨ë‘ ì§€ì •í•˜ì§€ 않거나 하세요." -#: commands/aggregatecmds.c:436 commands/functioncmds.c:615 +#: commands/aggregatecmds.c:434 commands/functioncmds.c:634 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "\"parallel\" 옵션 ê°’ì€ SAFE, RESTRICTED, UNSAFE ë§Œ 지정할 수 있ìŒ" -#: commands/aggregatecmds.c:492 +#: commands/aggregatecmds.c:490 #, c-format msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" msgstr "\"%s\" ì¸ìžê°’ì€ READ_ONLY, SHAREABLE, READ_WRITE ì…‹ 중 하나여야 함" -#: commands/alter.c:84 commands/event_trigger.c:174 +#: commands/alter.c:83 commands/event_trigger.c:191 #, c-format msgid "event trigger \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ì´ë²¤íЏ 트리거가 ì´ë¯¸ 있ìŒ" -#: commands/alter.c:87 commands/foreigncmds.c:597 +#: commands/alter.c:86 commands/foreigncmds.c:593 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ì™¸ë¶€ ìžë£Œ 래í¼ê°€ ì´ë¯¸ 있ìŒ" -#: commands/alter.c:90 commands/foreigncmds.c:903 +#: commands/alter.c:89 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ì„œë²„ê°€ ì´ë¯¸ 있ìŒ" -#: commands/alter.c:93 commands/proclang.c:132 +#: commands/alter.c:92 commands/proclang.c:131 #, c-format msgid "language \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ í”„ë¡œì‹œì£¼ì–¼ 언어가 ì´ë¯¸ 있습니다" -#: commands/alter.c:96 commands/publicationcmds.c:183 +#: commands/alter.c:95 commands/publicationcmds.c:764 #, c-format msgid "publication \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ë°œí–‰ì´ ì´ë¯¸ 있습니다" -#: commands/alter.c:99 commands/subscriptioncmds.c:371 +#: commands/alter.c:98 commands/subscriptioncmds.c:669 #, c-format msgid "subscription \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ êµ¬ë…ì´ ì´ë¯¸ 있습니다" -#: commands/alter.c:122 +#: commands/alter.c:121 #, c-format msgid "conversion \"%s\" already exists in schema \"%s\"" msgstr "\"%s\" ì´ë¦„ì˜ ë³€í™˜ê·œì¹™(conversin)ì´ \"%s\" ìŠ¤í‚¤ë§ˆì— ì´ë¯¸ 있습니다" -#: commands/alter.c:126 +#: commands/alter.c:125 #, c-format msgid "statistics object \"%s\" already exists in schema \"%s\"" msgstr "\"%s\" ì´ë¦„ì˜ í†µê³„ì •ë³´ 개체는 \"%s\" ìŠ¤í‚¤ë§ˆì— ì´ë¯¸ 있습니다" -#: commands/alter.c:130 +#: commands/alter.c:129 #, c-format msgid "text search parser \"%s\" already exists in schema \"%s\"" msgstr "\"%s\" 전문 검색 파서가 \"%s\" 스키마 ì•ˆì— ì´ë¯¸ 있ìŒ" -#: commands/alter.c:134 +#: commands/alter.c:133 #, c-format msgid "text search dictionary \"%s\" already exists in schema \"%s\"" msgstr "\"%s\" 전문 검색 ì‚¬ì „ì´ \"%s\" 스키마 ì•ˆì— ì´ë¯¸ 있ìŒ" -#: commands/alter.c:138 +#: commands/alter.c:137 #, c-format msgid "text search template \"%s\" already exists in schema \"%s\"" msgstr "\"%s\" 전문 검색 í…œí”Œë¦¿ì´ \"%s\" 스키마 ì•ˆì— ì´ë¯¸ 있ìŒ" -#: commands/alter.c:142 +#: commands/alter.c:141 #, c-format msgid "text search configuration \"%s\" already exists in schema \"%s\"" msgstr "\"%s\" 전문 검색 êµ¬ì„±ì´ \"%s\" 스키마 ì•ˆì— ì´ë¯¸ 있ìŒ" -#: commands/alter.c:215 +#: commands/alter.c:214 #, c-format msgid "must be superuser to rename %s" msgstr "%s ì´ë¦„ 변경 ìž‘ì—…ì€ ìŠˆí¼ìœ ì €ë§Œ í•  수 있ìŒ" -#: commands/alter.c:744 +#: commands/alter.c:256 commands/subscriptioncmds.c:648 +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1212 +#: commands/subscriptioncmds.c:1918 +#, c-format +msgid "password_required=false is superuser-only" +msgstr "password_required=false 는 슈í¼ìœ ì € 전용임" + +#: commands/alter.c:257 commands/subscriptioncmds.c:649 +#: commands/subscriptioncmds.c:1130 commands/subscriptioncmds.c:1213 +#: commands/subscriptioncmds.c:1919 +#, c-format +msgid "" +"Subscriptions with the password_required option set to false may only be " +"created or modified by the superuser." +msgstr "" +"êµ¬ë… ì˜µì…˜ìœ¼ë¡œ password_required ì˜µì…˜ê°’ì„ false 지정하거나 변경하는 ê²ƒì€ ìŠˆí¼" +"유저만 í•  수 있습니다." + +#: commands/alter.c:735 #, c-format msgid "must be superuser to set schema of %s" -msgstr "%sì˜ ìŠ¤í‚¤ë§ˆ ì§€ì •ì€ ìŠˆí¼ìœ ì ¸ì—¬ì•¼í•©ë‹ˆë‹¤" +msgstr "%sì˜ ìŠ¤í‚¤ë§ˆ ì§€ì •ì€ ìŠˆí¼ìœ ì ¸ì—¬ì•¼ 합니다" #: commands/amcmds.c:60 #, c-format @@ -6052,61 +7194,56 @@ msgstr "슈í¼ìœ ì €ë§Œ ì ‘ê·¼ ë°©ë²•ì„ ë§Œë“¤ 수 있습니다." msgid "access method \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ì¸ë±ìФ ì ‘ê·¼ ë°©ë²•ì´ ì´ë¯¸ 있습니다." -#: commands/amcmds.c:130 -#, c-format -msgid "must be superuser to drop access methods" -msgstr "ì ‘ê·¼ ë°©ë²•ì€ ìŠˆí¼ìœ ì €ë§Œ 삭제할 수 있습니다." - -#: commands/amcmds.c:181 commands/indexcmds.c:188 commands/indexcmds.c:790 -#: commands/opclasscmds.c:373 commands/opclasscmds.c:793 +#: commands/amcmds.c:154 commands/indexcmds.c:224 commands/indexcmds.c:850 +#: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" msgstr "\"%s\" ì¸ë±ìФ ì ‘ê·¼ ë°©ë²•ì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/amcmds.c:270 +#: commands/amcmds.c:243 #, c-format msgid "handler function is not specified" msgstr "핸들러 함수 ë¶€ë¶„ì´ ë¹ ì¡ŒìŠµë‹ˆë‹¤" -#: commands/amcmds.c:291 commands/event_trigger.c:183 -#: commands/foreigncmds.c:489 commands/proclang.c:79 commands/trigger.c:687 -#: parser/parse_clause.c:941 +#: commands/amcmds.c:264 commands/event_trigger.c:200 +#: commands/foreigncmds.c:489 commands/proclang.c:78 commands/trigger.c:702 +#: parser/parse_clause.c:943 #, c-format msgid "function %s must return type %s" msgstr "%s 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 함" -#: commands/analyze.c:226 +#: commands/analyze.c:217 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "\"%s\" 건너뜀 --- 외부 í…Œì´ë¸”ì€ ë¶„ì„í•  수 ì—†ìŒ" -#: commands/analyze.c:243 +#: commands/analyze.c:234 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "" "\"%s\" 건너뜀 --- í…Œì´ë¸”ì´ ì•„ë‹ˆê±°ë‚˜, 특수 시스템 í…Œì´ë¸”ë“¤ì€ ë¶„ì„í•  수 ì—†ìŒ" -#: commands/analyze.c:329 +#: commands/analyze.c:314 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "\"%s.%s\" ìƒì† 관계 ë¶„ì„중" -#: commands/analyze.c:334 +#: commands/analyze.c:319 #, c-format msgid "analyzing \"%s.%s\"" msgstr "\"%s.%s\" ìžë£Œ 통계 수집 중" -#: commands/analyze.c:394 +#: commands/analyze.c:385 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "\"%s\" ì¹¼ëŸ¼ì´ \"%s\" 릴레ì´ì…˜ì—서 ë‘ ë²ˆ ì´ìƒ 사용ë˜ì—ˆìŒ" -#: commands/analyze.c:700 +#: commands/analyze.c:785 #, c-format -msgid "automatic analyze of table \"%s.%s.%s\" system usage: %s" -msgstr "\"%s.%s.%s\" í…Œì´ë¸”ì˜ ì‹œìŠ¤í…œ 사용 ìžë™ ë¶„ì„: %s" +msgid "automatic analyze of table \"%s.%s.%s\"\n" +msgstr "\"%s.%s.%s\" í…Œì´ë¸” ìžë™ ë¶„ì„\n" -#: commands/analyze.c:1169 +#: commands/analyze.c:1300 #, c-format msgid "" "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead " @@ -6115,7 +7252,7 @@ msgstr "" "\"%s\": íƒìƒ‰í•œ 페ì´ì§€: %d, 전체페ì´ì§€: %u, 실ìžë£Œ: %.0fê°œ, 쓰레기ìžë£Œ: %.0f" "ê°œ; 표본 추출 ìžë£Œ: %dê°œ, 예ìƒí•œ ì´ ìžë£Œ: %.0fê°œ" -#: commands/analyze.c:1249 +#: commands/analyze.c:1384 #, c-format msgid "" "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree " @@ -6124,7 +7261,7 @@ msgstr "" "\"%s.%s\" ìƒì† ë‚˜ë¬´ì˜ í†µê³„ 수집 건너뜀 --- ì´ ìƒì† 나무ì—는 하위 í…Œì´ë¸”ì´ ì—†" "ìŒ" -#: commands/analyze.c:1347 +#: commands/analyze.c:1482 #, c-format msgid "" "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree " @@ -6133,46 +7270,46 @@ msgstr "" "\"%s.%s\" ìƒì† ë‚˜ë¬´ì˜ í†µê³„ 수집 건너뜀 --- ì´ ìƒì† 나무ì—는 통계 수집할 하위 " "í…Œì´ë¸”ì´ ì—†ìŒ" -#: commands/async.c:634 +#: commands/async.c:612 #, c-format msgid "channel name cannot be empty" msgstr "ì±„ë„ ì´ë¦„ì€ ë¹„ì›Œë‘˜ 수 ì—†ìŒ" -#: commands/async.c:640 +#: commands/async.c:618 #, c-format msgid "channel name too long" msgstr "ì±„ë„ ì´ë¦„ì´ ë„ˆë¬´ 긺" # # nonun 부분 begin -#: commands/async.c:645 +#: commands/async.c:623 #, c-format msgid "payload string too long" msgstr "payload 문ìžì—´ì´ 너무 긺" -#: commands/async.c:864 +#: commands/async.c:842 #, c-format msgid "" "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" msgstr "" "LISTEN, UNLISTEN ë˜ëŠ” NOTIFY 옵션으로 ì‹¤í–‰ëœ íŠ¸ëžœìž­ì…˜ì„ PREPAREí•  수 ì—†ìŒ" -#: commands/async.c:970 +#: commands/async.c:946 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "NOTIFY íì— ë„ˆë¬´ ë§Žì€ ì•Œë¦¼ì´ ìžˆìŠµë‹ˆë‹¤" -#: commands/async.c:1636 +#: commands/async.c:1553 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "NOTIFY í 사용률: %.0f%%" -#: commands/async.c:1638 +#: commands/async.c:1555 #, c-format msgid "" "The server process with PID %d is among those with the oldest transactions." msgstr "%d PID 서버 프로세스가 가장 ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ì„ ì‚¬ìš©í•˜ê³  있습니다." -#: commands/async.c:1641 +#: commands/async.c:1558 #, c-format msgid "" "The NOTIFY queue cannot be emptied until that process ends its current " @@ -6180,42 +7317,42 @@ msgid "" msgstr "" "ì´ í”„ë¡œì„¸ìŠ¤ì˜ í˜„ìž¬ íŠ¸ëžœìž­ì…˜ì„ ì¢…ë£Œí•˜ì§€ 않으면, NOTIFY í를 비울 수 없습니다" -#: commands/cluster.c:125 commands/cluster.c:362 +#: commands/cluster.c:128 #, c-format -msgid "cannot cluster temporary tables of other sessions" -msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸”ì€ cluster ìž‘ì—…ì„ í•  수 없습니다" +msgid "unrecognized CLUSTER option \"%s\"" +msgstr "알 수 없는 CLUSTER 옵션 \"%s\"" -#: commands/cluster.c:133 +#: commands/cluster.c:159 commands/cluster.c:433 #, c-format -msgid "cannot cluster a partitioned table" -msgstr "파티션 ëœ í…Œì´ë¸”ì€ í´ëŸ¬ìŠ¤í„° ìž‘ì—…ì„ í•  수 ì—†ìŒ" +msgid "cannot cluster temporary tables of other sessions" +msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸”ì€ cluster ìž‘ì—…ì„ í•  수 없습니다" -#: commands/cluster.c:151 +#: commands/cluster.c:177 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "\"%s\" í…Œì´ë¸”ì„ ìœ„í•œ previously clustered ì¸ë±ìŠ¤ê°€ ì—†ìŒ" -#: commands/cluster.c:165 commands/tablecmds.c:12853 commands/tablecmds.c:14659 +#: commands/cluster.c:191 commands/tablecmds.c:14797 commands/tablecmds.c:16729 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” \"%s\" í…Œì´ë¸”ì— ì—†ìŒ" -#: commands/cluster.c:351 +#: commands/cluster.c:422 #, c-format msgid "cannot cluster a shared catalog" msgstr "ê³µìœ ëœ ì¹´íƒˆë¡œê·¸ëŠ” í´ëŸ¬ìŠ¤í„° ìž‘ì—…ì„ í•  수 ì—†ìŒ" -#: commands/cluster.c:366 +#: commands/cluster.c:437 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸”ì€ vacuum ìž‘ì—…ì„ í•  수 ì—†ìŒ" -#: commands/cluster.c:432 commands/tablecmds.c:14669 +#: commands/cluster.c:513 commands/tablecmds.c:16739 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" 개체는 \"%s\" í…Œì´ë¸”ì„ ìœ„í•œ ì¸ë±ìŠ¤ê°€ 아님" -#: commands/cluster.c:440 +#: commands/cluster.c:521 #, c-format msgid "" "cannot cluster on index \"%s\" because access method does not support " @@ -6223,41 +7360,46 @@ msgid "" msgstr "" "\"%s\" ì¸ë±ìŠ¤ëŠ” ìžë£Œ 액세스 ë°©ë²•ì´ cluster ìž‘ì—…ì„ í•  수 없는 방법입니다." -#: commands/cluster.c:452 +#: commands/cluster.c:533 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "" "\"%s\" ì¸ë±ìŠ¤ê°€ 부분ì¸ë±ìФ(partial index)ë¼ì„œ cluster ìž‘ì—…ì„ í•  수 없습니다" -#: commands/cluster.c:466 +#: commands/cluster.c:547 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "ìž˜ëª»ëœ \"%s\" ì¸ë±ìŠ¤ì— ëŒ€í•´ í´ëŸ¬ìŠ¤í„°ë§í•  수 ì—†ìŒ" -#: commands/cluster.c:490 +#: commands/cluster.c:571 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "íŒŒí‹°ì…˜ëœ í…Œì´ë¸” 대ìƒìœ¼ë¡œ ì¸ë±ìФ í´ëŸ¬ìŠ¤í„° 표시를 í•  수 ì—†ìŒ" -#: commands/cluster.c:863 +#: commands/cluster.c:956 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr " \"%s.%s\" í´ëŸ¬ìŠ¤í„°ë§ ì¤‘ (사용 ì¸ë±ìФ: \"%s\")" -#: commands/cluster.c:869 +#: commands/cluster.c:962 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "순차 íƒìƒ‰ê³¼ ì •ë ¬ì„ ì´ìš©í•´ì„œ \"%s.%s\" 개체 í´ëŸ¬ìŠ¤í„°ë§ ì¤‘" -#: commands/cluster.c:900 +#: commands/cluster.c:967 +#, c-format +msgid "vacuuming \"%s.%s\"" +msgstr "\"%s.%s\" 청소 중" + +#: commands/cluster.c:994 #, c-format msgid "" -"\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" +"\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" msgstr "" -"\"%s\": 삭제가능한 %.0fê°œ, 삭제불가능한 %.0fê°œì˜ í–‰ ë²„ì „ì„ %u 페ì´ì§€ì—서 발견" -"í–ˆìŒ." +"\"%s.%s\": 삭제가능한 %.0fê°œ, 삭제불가능한 %.0fê°œì˜ í–‰ ë²„ì „ì„ %u 페ì´ì§€ì—서 " +"발견했ìŒ." -#: commands/cluster.c:904 +#: commands/cluster.c:999 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -6266,524 +7408,451 @@ msgstr "" "%.0f ê°œì˜ ì‚¬ìš©í•˜ì§€ 않는 로우 ë²„ì „ì„ ì•„ì§ ì§€ìš°ì§€ 못했ìŒ.\n" "%s." -#: commands/collationcmds.c:105 +#: commands/cluster.c:1744 +#, c-format +msgid "permission denied to cluster \"%s\", skipping it" +msgstr "\"%s\" í´ëŸ¬ìŠ¤í„° 권한 ì—†ìŒ, 건너뜀" + +#: commands/collationcmds.c:110 #, c-format msgid "collation attribute \"%s\" not recognized" msgstr "\"%s\" ì—°ì‚°ìž ì†ì„±ì„ 처리할 수 ì—†ìŒ" -#: commands/collationcmds.c:148 +#: commands/collationcmds.c:123 commands/collationcmds.c:129 +#: commands/define.c:388 commands/tablecmds.c:8129 +#: replication/pgoutput/pgoutput.c:314 replication/pgoutput/pgoutput.c:337 +#: replication/pgoutput/pgoutput.c:351 replication/pgoutput/pgoutput.c:361 +#: replication/pgoutput/pgoutput.c:371 replication/pgoutput/pgoutput.c:381 +#: replication/pgoutput/pgoutput.c:393 replication/walsender.c:1146 +#: replication/walsender.c:1168 replication/walsender.c:1178 +#: replication/walsender.c:1187 replication/walsender.c:1426 +#, c-format +msgid "conflicting or redundant options" +msgstr "ìƒì¶©í•˜ê±°ë‚˜ ì¤‘ë³µëœ ì˜µì…˜ë“¤" + +#: commands/collationcmds.c:124 +#, c-format +msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." +msgstr "LOCALE ê°’ì€ LC_COLLATE ë˜ëŠ” LC_CTYPE ê°’ê³¼ 함께 지정할 수 ì—†ìŒ" + +#: commands/collationcmds.c:130 +#, c-format +msgid "FROM cannot be specified together with any other options." +msgstr "FROM êµ¬ë¬¸ì€ ë‹¤ë¥¸ 옵션들과 함께 ì‚¬ìš©ë  ìˆ˜ 없습니다." + +#: commands/collationcmds.c:189 #, c-format msgid "collation \"default\" cannot be copied" msgstr "\"default\" ì •ë ¬ê·œì¹™ì€ ë³µì‚¬ë  ìˆ˜ ì—†ìŒ" -#: commands/collationcmds.c:181 +#: commands/collationcmds.c:225 #, c-format msgid "unrecognized collation provider: %s" msgstr "알 수 없는 정렬규칙 ì œê³µìž ì´ë¦„: %s" -#: commands/collationcmds.c:190 +#: commands/collationcmds.c:253 commands/collationcmds.c:264 +#: commands/collationcmds.c:270 commands/collationcmds.c:278 #, c-format -msgid "parameter \"lc_collate\" must be specified" -msgstr "\"lc_collate\" ì˜µì…˜ì„ ì§€ì •í•´ì•¼ 함" +msgid "parameter \"%s\" must be specified" +msgstr "\"%s\" 매개 변수를 지정해야 함" -#: commands/collationcmds.c:195 +#: commands/collationcmds.c:293 commands/dbcommands.c:1134 #, c-format -msgid "parameter \"lc_ctype\" must be specified" -msgstr "\"lc_ctype\" ì˜µì…˜ì„ ì§€ì •í•´ì•¼ 함" +msgid "using standard form \"%s\" for ICU locale \"%s\"" +msgstr "\"%s\"ì—서 í‘œì¤€ì„ ì‚¬ìš©í•¨(해당 ICU 로케ì¼: \"%s\")" -#: commands/collationcmds.c:205 +#: commands/collationcmds.c:312 #, c-format msgid "nondeterministic collations not supported with this provider" -msgstr "" +msgstr "ì´ ì œê³µìžëŠ” DETERMINISTIC = false ì˜µì…˜ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: commands/collationcmds.c:317 commands/dbcommands.c:1087 +#, c-format +msgid "ICU rules cannot be specified unless locale provider is ICU" +msgstr "ICU ê·œì¹™ì€ ë¡œì¼€ì¼ ì œê³µìžë¡œ ICU로 ì§€ì •í–ˆì„ ë•Œë§Œ 사용할 수 있습니다." -#: commands/collationcmds.c:265 +#: commands/collationcmds.c:340 +#, c-format +msgid "current database's encoding is not supported with this provider" +msgstr "ì´ ì œê³µìžëŠ” 현재 ë°ì´í„°ë² ì´ìФ ì¸ì½”ë”©ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: commands/collationcmds.c:409 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "\"%s\" 정렬규칙(ëŒ€ìƒ ì¸ì½”딩: \"%s\")ì´ \"%s\" 스키마 ì•ˆì— ì´ë¯¸ 있ìŒ" -#: commands/collationcmds.c:276 +#: commands/collationcmds.c:420 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "\"%s\" ì •ë ¬ê·œì¹™ì´ \"%s\" ìŠ¤í‚¤ë§ˆì— ì´ë¯¸ 있습니다" -#: commands/collationcmds.c:324 +#: commands/collationcmds.c:445 +#, c-format +msgid "cannot refresh version of default collation" +msgstr "기본 ë¬¸ìž ì •ë ¬ì˜ ë²„ì „ì„ ê°±ì‹ í•  수 ì—†ìŒ" + +#. translator: %s is an SQL command +#. translator: %s is an SQL ALTER command +#: commands/collationcmds.c:447 commands/subscriptioncmds.c:1376 +#: commands/tablecmds.c:7905 commands/tablecmds.c:7915 +#: commands/tablecmds.c:7917 commands/tablecmds.c:14499 +#: commands/tablecmds.c:17884 commands/tablecmds.c:17905 +#: commands/typecmds.c:3787 commands/typecmds.c:3872 commands/typecmds.c:4226 +#, c-format +msgid "Use %s instead." +msgstr "ëŒ€ì‹ ì— %s ëª…ë ¹ì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤." + +#: commands/collationcmds.c:480 commands/dbcommands.c:2566 #, c-format msgid "changing version from %s to %s" msgstr "%sì—서 %s 버전으로 바꿉니다" -#: commands/collationcmds.c:339 +#: commands/collationcmds.c:495 commands/dbcommands.c:2579 #, c-format msgid "version has not changed" msgstr "ë²„ì „ì´ ë°”ë€Œì§€ 않았습니다" -#: commands/collationcmds.c:470 +#: commands/collationcmds.c:528 commands/dbcommands.c:2749 #, c-format -msgid "could not convert locale name \"%s\" to language tag: %s" -msgstr "\"%s\" ë¡œì¼€ì¼ ì´ë¦„ì„ ì–¸ì–´ 태그로 변환할 수 ì—†ìŒ: %s" +msgid "database with OID %u does not exist" +msgstr "OID %u ë°ì´í„°ë² ì´ìФ ì—†ìŒ" -#: commands/collationcmds.c:531 +#: commands/collationcmds.c:554 #, c-format -msgid "must be superuser to import system collations" -msgstr "시스템 ì •ë ¬ê·œì¹™ì„ ê°€ì ¸ì˜¤ë ¤ë©´ 슈í¼ìœ ì €ì—¬ì•¼í•¨" +msgid "collation with OID %u does not exist" +msgstr "OID %u 정렬정ì˜(collation) ì—†ìŒ" -#: commands/collationcmds.c:554 commands/copy.c:1894 commands/copy.c:3480 -#: libpq/be-secure-common.c:81 +#: commands/collationcmds.c:848 #, c-format -msgid "could not execute command \"%s\": %m" -msgstr "\"%s\" ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ: %m" +msgid "must be superuser to import system collations" +msgstr "시스템 ì •ë ¬ê·œì¹™ì„ ê°€ì ¸ì˜¤ë ¤ë©´ 슈í¼ìœ ì €ì—¬ì•¼í•¨" -#: commands/collationcmds.c:685 +#: commands/collationcmds.c:968 commands/collationcmds.c:1053 #, c-format msgid "no usable system locales were found" msgstr "사용할 수 있는 시스템 로케ì¼ì´ ì—†ìŒ" -#: commands/comment.c:61 commands/dbcommands.c:841 commands/dbcommands.c:1037 -#: commands/dbcommands.c:1150 commands/dbcommands.c:1340 -#: commands/dbcommands.c:1588 commands/dbcommands.c:1702 -#: commands/dbcommands.c:2142 utils/init/postinit.c:888 -#: utils/init/postinit.c:993 utils/init/postinit.c:1010 +#: commands/comment.c:61 commands/dbcommands.c:1665 commands/dbcommands.c:1883 +#: commands/dbcommands.c:1995 commands/dbcommands.c:2193 +#: commands/dbcommands.c:2433 commands/dbcommands.c:2526 +#: commands/dbcommands.c:2650 commands/dbcommands.c:3161 +#: utils/init/postinit.c:1034 utils/init/postinit.c:1098 +#: utils/init/postinit.c:1171 #, c-format msgid "database \"%s\" does not exist" msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ ì—†ìŒ" -#: commands/comment.c:101 commands/seclabel.c:117 parser/parse_utilcmd.c:957 +#: commands/comment.c:101 #, c-format -msgid "" -"\"%s\" is not a table, view, materialized view, composite type, or foreign " -"table" -msgstr "" -"\"%s\" 개체는 í…Œì´ë¸”ë„, ë·°ë„, êµ¬ì²´í™”ëœ ë·°ë„, 복합 ìžë£Œí˜•ë„, 외부 í…Œì´ë¸”ë„ ì•„" -"닙니다." +msgid "cannot set comment on relation \"%s\"" +msgstr "\"%s\" 릴레ì´ì…˜ì— 주ì„ì„ ë‹¬ 수 ì—†ìŒ" -#: commands/constraint.c:63 utils/adt/ri_triggers.c:1923 +#: commands/constraint.c:61 utils/adt/ri_triggers.c:2019 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "\"%s\" 함수가 트리거 관리ìžì—서 호출ë˜ì§€ 않았ìŒ" -#: commands/constraint.c:70 utils/adt/ri_triggers.c:1932 +#: commands/constraint.c:68 utils/adt/ri_triggers.c:2028 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "AFTER ROWì—서 \"%s\" 함수를 실행해야 함" -#: commands/constraint.c:84 +#: commands/constraint.c:82 #, c-format msgid "function \"%s\" must be fired for INSERT or UPDATE" msgstr "INSERT ë˜ëŠ” UPDATEì— ëŒ€í•´ \"%s\" 함수를 실행해야 함" -#: commands/conversioncmds.c:66 +#: commands/conversioncmds.c:62 #, c-format msgid "source encoding \"%s\" does not exist" msgstr "\"%s\" ì›ë³¸ ì¸ì½”딩 ì—†ìŒ" -#: commands/conversioncmds.c:73 +#: commands/conversioncmds.c:69 #, c-format msgid "destination encoding \"%s\" does not exist" msgstr "\"%s\" ëŒ€ìƒ ì¸ì½”딩 ì—†ìŒ" -#: commands/conversioncmds.c:86 +#: commands/conversioncmds.c:82 #, c-format msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" msgstr "\"SQL_ASCII\" ì¸ì½”딩 ë³€í™˜ì€ ì§€ì›í•˜ì§€ 않습니다." -#: commands/conversioncmds.c:99 +#: commands/conversioncmds.c:95 #, c-format msgid "encoding conversion function %s must return type %s" msgstr "%s ì¸ì½”딩 변환 함수는 %s í˜•ì„ ë°˜í™˜í•´ì•¼ 함" -#: commands/copy.c:426 commands/copy.c:460 +#: commands/conversioncmds.c:125 #, c-format -msgid "COPY BINARY is not supported to stdout or from stdin" -msgstr "COPY BINARY ëª…ë ¹ì€ stdout, stdin ìž…ì¶œë ¥ì„ ì§€ì›í•˜ì§€ 않습니다" +msgid "" +"encoding conversion function %s returned incorrect result for empty input" +msgstr "빈 입력으로 %s ì¸ì½”딩 변환 함수가 ìž˜ëª»ëœ ê²°ê³¼ë¥¼ 반환했ìŒ" -#: commands/copy.c:560 +#: commands/copy.c:84 #, c-format -msgid "could not write to COPY program: %m" -msgstr "COPY 프로그램으로 파ì¼ì„ 쓸 수 없습니다: %m" +msgid "permission denied to COPY to or from an external program" +msgstr "외부 í”„ë¡œê·¸ëž¨ì„ ì´ìš©í•œ COPY to/from 작업 권한 ì—†ìŒ" -#: commands/copy.c:565 +#: commands/copy.c:85 #, c-format -msgid "could not write to COPY file: %m" -msgstr "COPY 파ì¼ë¡œë¡œ 파ì¼ì„ 쓸 수 없습니다: %m" +msgid "" +"Only roles with privileges of the \"%s\" role may COPY to or from an " +"external program." +msgstr "외부 í”„ë¡œê·¸ëž¨ì„ ì´ìš©í•˜ëŠ” COPY ìž‘ì—…ì€ \"%s\" 롤 소ì†ì›ë§Œ 허용합니다." -#: commands/copy.c:578 +#: commands/copy.c:87 commands/copy.c:98 commands/copy.c:107 #, c-format -msgid "connection lost during COPY to stdout" -msgstr "COPY 명령ì—서 stdout으로 ìžë£Œë¥¼ 내보내는 ë™ì•ˆ ì—°ê²°ì´ ëŠê²¼ìŠµë‹ˆë‹¤" +msgid "" +"Anyone can COPY to stdout or from stdin. psql's \\copy command also works " +"for anyone." +msgstr "ì¼ë°˜ 사용ìžì¸ë°, ì´ ìž‘ì—…ì´ í•„ìš”í•˜ë©´, psqlì˜ \\copy ëª…ë ¹ì„ ì´ìš©í•˜ì„¸ìš”" -#: commands/copy.c:622 +#: commands/copy.c:95 #, c-format -msgid "could not read from COPY file: %m" -msgstr "COPY ëª…ë ¹ì— ì‚¬ìš©í•  파ì¼ì„ ì½ì„ 수 없습니다: %m" +msgid "permission denied to COPY from a file" +msgstr "íŒŒì¼ ë‚´ìš© 가져오는 COPY 작업 권한 ì—†ìŒ" -#: commands/copy.c:640 commands/copy.c:661 commands/copy.c:665 -#: tcop/postgres.c:344 tcop/postgres.c:380 tcop/postgres.c:407 +#: commands/copy.c:96 #, c-format -msgid "unexpected EOF on client connection with an open transaction" -msgstr "열린 트랜잭션과 함께 í´ë¼ì´ì–¸íЏ ì—°ê²°ì—서 예ìƒì¹˜ ì•Šì€ EOF 발견ë¨" +msgid "Only roles with privileges of the \"%s\" role may COPY from a file." +msgstr "" +"파ì¼ì„ ì½ì–´ COPY 명령으로 ìžë£Œë¥¼ 저장하려면, \"%s\" 롤 소ì†ì›ì´ì–´ì•¼ 합니다." -#: commands/copy.c:678 +#: commands/copy.c:104 #, c-format -msgid "COPY from stdin failed: %s" -msgstr "COPY 명령ì—서 stdin으로 ìžë£Œ 가져오기 실패: %s" +msgid "permission denied to COPY to a file" +msgstr "파ì¼ë¡œ 저장하는 COPY 작업 권한 ì—†ìŒ" -#: commands/copy.c:694 +#: commands/copy.c:105 #, c-format -msgid "unexpected message type 0x%02X during COPY from stdin" -msgstr "" -"COPY 명령으로 stdin으로 ìžë£Œë¥¼ 가져오는 ë™ì•ˆ 예ìƒì¹˜ ì•Šì€ ë©”ì‹œì§€ 타입 0x%02X " -"발견ë¨" +msgid "Only roles with privileges of the \"%s\" role may COPY to a file." +msgstr "COPY 명령 결과를 파ì¼ë¡œ 저장하려면, \"%s\" 롤 소ì†ì›ì´ì–´ì•¼ 합니다." -#: commands/copy.c:861 +#: commands/copy.c:193 #, c-format -msgid "" -"must be superuser or a member of the pg_execute_server_program role to COPY " -"to or from an external program" -msgstr "" -"외부 í”„ë¡œê·¸ëž¨ì„ ì´ìš©í•˜ëŠ” COPY ìž‘ì—…ì€ ìŠˆí¼ìœ ì €ì™€ pg_execute_server_program 롤 " -"소ì†ì›ë§Œ 허용합니다." +msgid "COPY FROM not supported with row-level security" +msgstr "로우 단위 보안 기능으로 COPY FROM ëª…ë ¹ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: commands/copy.c:862 commands/copy.c:871 commands/copy.c:878 +#: commands/copy.c:194 #, c-format -msgid "" -"Anyone can COPY to stdout or from stdin. psql's \\copy command also works " -"for anyone." -msgstr "ì¼ë°˜ 사용ìžì¸ë°, ì´ ìž‘ì—…ì´ í•„ìš”í•˜ë©´, psqlì˜ \\copy ëª…ë ¹ì„ ì´ìš©í•˜ì„¸ìš”" +msgid "Use INSERT statements instead." +msgstr "ëŒ€ì‹ ì— INSERT êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤." -#: commands/copy.c:870 +#: commands/copy.c:375 #, c-format -msgid "" -"must be superuser or a member of the pg_read_server_files role to COPY from " -"a file" -msgstr "" -"파ì¼ì„ ì½ì–´ COPY 명령으로 ìžë£Œë¥¼ 저장하려면, 슈í¼ìœ ì €ì´ê±°ë‚˜ " -"pg_read_server_files 롤 구성ì›ì´ì–´ì•¼ 합니다." +msgid "cannot use \"%s\" with HEADER in COPY TO" +msgstr "COPY TO 명령ì—서는 HEADER 값으로 \"%s\" ê°’ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: commands/copy.c:877 +#: commands/copy.c:384 #, c-format -msgid "" -"must be superuser or a member of the pg_write_server_files role to COPY to a " -"file" -msgstr "" -"COPY 명령 결과를 파ì¼ë¡œ 저장하려면, 슈í¼ìœ ì €ì´ê±°ë‚˜ pg_write_server_files 롤 " -"구성ì›ì´ì–´ì•¼ 합니다." +msgid "%s requires a Boolean value or \"match\"" +msgstr "%s ê°’ì€ ë¶ˆë¦¬ì–¸ ê°’ ë˜ëŠ” \"match\" ì´ì–´ì•¼ 합니다." -#: commands/copy.c:963 +#. translator: first %s is the name of a COPY option, e.g. ON_ERROR, +#. second %s is a COPY with direction, e.g. COPY TO +#: commands/copy.c:402 commands/copy.c:782 commands/copy.c:798 +#: commands/copy.c:815 commands/copy.c:841 commands/copy.c:851 #, c-format -msgid "COPY FROM not supported with row-level security" -msgstr "로우 단위 보안 기능으로 COPY FROM ëª…ë ¹ì„ ì‚¬ìš©í•  수 ì—†ìŒ" +msgid "COPY %s cannot be used with %s" +msgstr "COPY %s ì˜µì…˜ì€ %s 옵션과 함께 쓸 수 ì—†ìŒ" -#: commands/copy.c:964 +#. translator: first %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:416 commands/copy.c:441 #, c-format -msgid "Use INSERT statements instead." -msgstr "ëŒ€ì‹ ì— INSERT êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤." +msgid "COPY %s \"%s\" not recognized" +msgstr "COPY %s \"%s\" êµ¬ë¬¸ì€ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/copy.c:1146 +#: commands/copy.c:502 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "\"%s\" COPY ì–‘ì‹ì€ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/copy.c:1217 commands/copy.c:1233 commands/copy.c:1248 -#: commands/copy.c:1270 +#: commands/copy.c:560 commands/copy.c:575 commands/copy.c:590 +#: commands/copy.c:609 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "\"%s\" ì˜µì…˜ì— ëŒ€í•œ ì¸ìžëŠ” 칼럼 ì´ë¦„ 목ë¡ì´ì–´ì•¼ 합니다." -#: commands/copy.c:1285 +#: commands/copy.c:621 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "\"%s\" ì˜µì…˜ì— ëŒ€í•œ ì¸ìžëŠ” ì¸ì½”딩 ì´ë¦„ì´ì–´ì•¼ 합니다." -#: commands/copy.c:1292 commands/dbcommands.c:253 commands/dbcommands.c:1536 +#: commands/copy.c:642 commands/dbcommands.c:866 commands/dbcommands.c:2381 #, c-format msgid "option \"%s\" not recognized" msgstr "\"%s\" ì˜µì…˜ì€ íƒ€ë‹¹í•˜ì§€ 않습니다." -#: commands/copy.c:1304 +#. translator: %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:655 commands/copy.c:660 commands/copy.c:665 +#: commands/copy.c:740 #, c-format -msgid "cannot specify DELIMITER in BINARY mode" -msgstr "BINARY 모드ì—서는 DELIMITER ê°’ì„ ì§€ì •í•  수 ì—†ìŒ" +msgid "cannot specify %s in BINARY mode" +msgstr "BINARY 모드ì—서는 %s ê°’ì„ ì§€ì •í•  수 ì—†ìŒ" -#: commands/copy.c:1309 +#: commands/copy.c:670 #, c-format -msgid "cannot specify NULL in BINARY mode" -msgstr "BINARY 모드ì—서는 NULL ê°’ì„ ì§€ì •í•  수 ì—†ìŒ" +msgid "only ON_ERROR STOP is allowed in BINARY mode" +msgstr "BINARY 모드ì—서는 ON_ERROR STOPë§Œ 허용함" -#: commands/copy.c:1331 +#: commands/copy.c:692 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "COPY 구분ìžëŠ” 1ë°”ì´íŠ¸ì˜ ë‹¨ì¼ ë¬¸ìžì—¬ì•¼ 함" -#: commands/copy.c:1338 +#: commands/copy.c:699 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "COPY 명령ì—서 사용할 칼럼 구분ìžë¡œ 줄바꿈 문ìžë“¤ì„ 사용할 수 없습니다" -#: commands/copy.c:1344 +#: commands/copy.c:705 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "COPY null 표현ì—서 줄바꿈 ë˜ëŠ” ìºë¦¬ì§€ ë¦¬í„´ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: commands/copy.c:1361 +#: commands/copy.c:715 #, c-format -msgid "COPY delimiter cannot be \"%s\"" -msgstr "COPY 구분ìžëŠ” \"%s\"ì¼ ìˆ˜ ì—†ìŒ" +msgid "COPY default representation cannot use newline or carriage return" +msgstr "COPY 기본 ë™ìž‘ì—서는 줄바꿈 ë˜ëŠ” ìºë¦¬ì§€ ë¦¬í„´ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: commands/copy.c:1367 +#: commands/copy.c:733 #, c-format -msgid "COPY HEADER available only in CSV mode" -msgstr "COPY HEADER는 CSV 모드ì—서만 사용할 수 있ìŒ" +msgid "COPY delimiter cannot be \"%s\"" +msgstr "COPY 구분ìžëŠ” \"%s\"ì¼ ìˆ˜ ì—†ìŒ" -#: commands/copy.c:1373 +#. translator: %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:747 commands/copy.c:764 commands/copy.c:776 +#: commands/copy.c:791 commands/copy.c:807 #, c-format -msgid "COPY quote available only in CSV mode" -msgstr "COPY 따옴표는 CSV 모드ì—서만 사용할 수 있ìŒ" +msgid "COPY %s requires CSV mode" +msgstr "%s COPY 명령 ì˜µì…˜ì€ CSV 모드가 필요함" -#: commands/copy.c:1378 +#: commands/copy.c:752 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "COPY 따옴표는 1ë°”ì´íŠ¸ì˜ ë‹¨ì¼ ë¬¸ìžì—¬ì•¼ 함" -#: commands/copy.c:1383 +#: commands/copy.c:757 #, c-format msgid "COPY delimiter and quote must be different" msgstr "COPY êµ¬ë¶„ìž ë° ë”°ì˜´í‘œëŠ” 서로 달ë¼ì•¼ 함" -#: commands/copy.c:1389 -#, c-format -msgid "COPY escape available only in CSV mode" -msgstr "COPY ì´ìŠ¤ì¼€ì´í”„는 CSV 모드ì—서만 사용할 수 있ìŒ" - -#: commands/copy.c:1394 +#: commands/copy.c:769 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "COPY ì´ìŠ¤ì¼€ì´í”„는 1ë°”ì´íŠ¸ì˜ ë‹¨ì¼ ë¬¸ìžì—¬ì•¼ 함" -#: commands/copy.c:1400 -#, c-format -msgid "COPY force quote available only in CSV mode" -msgstr "COPY force quote는 CSV 모드ì—서만 사용할 수 있ìŒ" - -#: commands/copy.c:1404 -#, c-format -msgid "COPY force quote only available using COPY TO" -msgstr "COPY force quote는 COPY TOì—서만 사용할 수 있ìŒ" - -#: commands/copy.c:1410 -#, c-format -msgid "COPY force not null available only in CSV mode" -msgstr "COPY force not nullì€ CSV 모드ì—서만 사용할 수 있ìŒ" - -#: commands/copy.c:1414 -#, c-format -msgid "COPY force not null only available using COPY FROM" -msgstr "COPY force not nullì€ COPY FROMì—서만 사용할 수 있ìŒ" - -#: commands/copy.c:1420 -#, c-format -msgid "COPY force null available only in CSV mode" -msgstr "COPY force nullì€ CSV 모드ì—서만 사용할 수 있ìŒ" - -#: commands/copy.c:1425 -#, c-format -msgid "COPY force null only available using COPY FROM" -msgstr "COPY force nullì€ COPY FROMì—서만 사용할 수 있ìŒ" - -#: commands/copy.c:1431 -#, c-format -msgid "COPY delimiter must not appear in the NULL specification" -msgstr "COPY 구분ìžëŠ” NULL ì§€ì •ì— í‘œì‹œë˜ì§€ 않아야 함" - -#: commands/copy.c:1438 -#, c-format -msgid "CSV quote character must not appear in the NULL specification" -msgstr "CSV 따옴표는 NULL ì§€ì •ì— í‘œì‹œë˜ì§€ 않아야 함" - -#: commands/copy.c:1524 -#, c-format -msgid "DO INSTEAD NOTHING rules are not supported for COPY" -msgstr "DO INSTEAD NOTHING 룰(rule)ì€ COPY 구문ì—서 ì§€ì›í•˜ì§€ 않습니다." - -#: commands/copy.c:1538 -#, c-format -msgid "conditional DO INSTEAD rules are not supported for COPY" -msgstr "ì„ íƒì  DO INSTEAD ë£°ì€ COPY 구문ì—서 ì§€ì›í•˜ì§€ 않ìŒ" - -#: commands/copy.c:1542 -#, c-format -msgid "DO ALSO rules are not supported for the COPY" -msgstr "DO ALSO 룰(rule)ì€ COPY 구문ì—서 ì§€ì›í•˜ì§€ 않습니다." - -#: commands/copy.c:1547 -#, c-format -msgid "multi-statement DO INSTEAD rules are not supported for COPY" -msgstr "다중 구문 DO INSTEAD ë£°ì€ COPY 구문ì—서 ì§€ì›í•˜ì§€ 않ìŒ" - -#: commands/copy.c:1557 -#, c-format -msgid "COPY (SELECT INTO) is not supported" -msgstr "COPY (SELECT INTO) ì§€ì›í•˜ì§€ 않ìŒ" - -#: commands/copy.c:1574 -#, c-format -msgid "COPY query must have a RETURNING clause" -msgstr "COPY 쿼리는 RETURNING ì ˆì´ ìžˆì–´ì•¼ 합니다" - -#: commands/copy.c:1603 -#, c-format -msgid "relation referenced by COPY statement has changed" -msgstr "COPY ë¬¸ì— ì˜í•´ ì°¸ì¡°ëœ ë¦´ë ˆì´ì…˜ì´ 변경 ë˜ì—ˆìŒ" - -#: commands/copy.c:1662 -#, c-format -msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" -msgstr "\"%s\" FORCE_QUOTE ì¹¼ëŸ¼ì€ COPYì—서 참조ë˜ì§€ 않ìŒ" - -#: commands/copy.c:1685 -#, c-format -msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" -msgstr "\"%s\" FORCE_NOT_NULL ì¹¼ëŸ¼ì€ COPYì—서 참조ë˜ì§€ 않ìŒ" - -#: commands/copy.c:1708 -#, c-format -msgid "FORCE_NULL column \"%s\" not referenced by COPY" -msgstr "\"%s\" FORCE_NULL ì¹¼ëŸ¼ì€ COPYì—서 참조ë˜ì§€ 않ìŒ" - -#: commands/copy.c:1774 libpq/be-secure-common.c:105 -#, c-format -msgid "could not close pipe to external command: %m" -msgstr "외부 명령으로 파ì´í”„를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" - -#: commands/copy.c:1789 -#, c-format -msgid "program \"%s\" failed" -msgstr "\"%s\" 프로그램 실패" - -#: commands/copy.c:1840 -#, c-format -msgid "cannot copy from view \"%s\"" -msgstr "\"%s\" ì´ë¦„ì˜ ê°œì²´ëŠ” ë·°(view)입니다. ìžë£Œë¥¼ 내보낼 수 없습니다" - -#: commands/copy.c:1842 commands/copy.c:1848 commands/copy.c:1854 -#: commands/copy.c:1865 -#, c-format -msgid "Try the COPY (SELECT ...) TO variant." -msgstr "COPY (SELECT ...) TO ë³€í˜•ì„ ì‹œë„하십시오." - -#: commands/copy.c:1846 -#, c-format -msgid "cannot copy from materialized view \"%s\"" -msgstr "\"%s\" ì´ë¦„ì˜ ê°œì²´ëŠ” êµ¬ì²´í™”ëœ ë·°ìž…ë‹ˆë‹¤. ìžë£Œë¥¼ 내보낼 수 없습니다" - -#: commands/copy.c:1852 +#. translator: %s is the name of a COPY option, e.g. NULL +#: commands/copy.c:823 commands/copy.c:859 #, c-format -msgid "cannot copy from foreign table \"%s\"" -msgstr "\"%s\" ì´ë¦„ì˜ ê°œì²´ëŠ” 외부 í…Œì´ë¸”입니다. ìžë£Œë¥¼ 내보낼 수 없습니다" +msgid "COPY delimiter character must not appear in the %s specification" +msgstr "COPY 구분ìžëŠ” %s ì •ì˜ì— 없어야 함" -#: commands/copy.c:1858 +#. translator: %s is the name of a COPY option, e.g. NULL +#: commands/copy.c:832 commands/copy.c:868 #, c-format -msgid "cannot copy from sequence \"%s\"" -msgstr "\"%s\" ì´ë¦„ì˜ ê°œì²´ëŠ” 시퀀스입니다. ìžë£Œë¥¼ 내보낼 수 없습니다" +msgid "CSV quote character must not appear in the %s specification" +msgstr "CSV ì¸ìš© 문ìžëŠ” %s ì •ì˜ì— 없어야 함" -#: commands/copy.c:1863 +#: commands/copy.c:877 #, c-format -msgid "cannot copy from partitioned table \"%s\"" -msgstr "\"%s\" 파티션 ëœ í…Œì´ë¸”ì—서 복사할 수 ì—†ìŒ" +msgid "NULL specification and DEFAULT specification cannot be the same" +msgstr "NULL 지정과 DEFAULT ì§€ì •ì´ ê°™ì„ ìˆ˜ëŠ” ì—†ìŒ" -#: commands/copy.c:1869 +#: commands/copy.c:939 #, c-format -msgid "cannot copy from non-table relation \"%s\"" -msgstr "" -"\"%s\" 개체는 í…Œì´ë¸”ì´ ì•„ë‹Œ 릴레ì´ì…˜(relation)ì´ê¸°ì— ìžë£Œë¥¼ 내보낼 수 없습니" -"다" +msgid "column \"%s\" is a generated column" +msgstr "\"%s\" ì¹¼ëŸ¼ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ìž„" -#: commands/copy.c:1909 +#: commands/copy.c:941 #, c-format -msgid "relative path not allowed for COPY to file" -msgstr "COPY ëª…ë ¹ì— ì‚¬ìš©í•  íŒŒì¼ ì´ë¦„으로 ìƒëŒ€ê²½ë¡œëŠ” 사용할 수 없습니다" +msgid "Generated columns cannot be used in COPY." +msgstr "미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì€ COPY 작업 대ìƒì´ 아님" -#: commands/copy.c:1928 +#: commands/copy.c:956 commands/indexcmds.c:1890 commands/statscmds.c:239 +#: commands/tablecmds.c:2526 commands/tablecmds.c:2997 +#: commands/tablecmds.c:3808 parser/parse_relation.c:3692 +#: parser/parse_relation.c:3702 parser/parse_relation.c:3720 +#: parser/parse_relation.c:3727 parser/parse_relation.c:3741 +#: utils/adt/tsvector_op.c:2853 #, c-format -msgid "could not open file \"%s\" for writing: %m" -msgstr "\"%s\" íŒŒì¼ ì—´ê¸° 실패: %m" +msgid "column \"%s\" does not exist" +msgstr "\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼ì€ ì—†ìŠµë‹ˆë‹¤" -#: commands/copy.c:1931 +#: commands/copy.c:963 commands/tablecmds.c:2552 commands/trigger.c:951 +#: parser/parse_target.c:1083 parser/parse_target.c:1094 #, c-format -msgid "" -"COPY TO instructs the PostgreSQL server process to write a file. You may " -"want a client-side facility such as psql's \\copy." -msgstr "" -"COPY TO ëª…ë ¹ì€ PostgreSQL 서버 프로세스가 작업하기 때문ì—, ì„œë²„ì— ê·¸ 결과가 " -"저장ëœë‹¤. í´ë¼ì´ì–¸íЏ 쪽ì—서 ê·¸ 결과를 저장하려면, psql \\copy 명령으로 처리" -"í•  수 있다." +msgid "column \"%s\" specified more than once" +msgstr "\"%s\" ì¹¼ëŸ¼ì„ í•˜ë‚˜ ì´ìƒ 지정했ìŒ" -#: commands/copy.c:1944 commands/copy.c:3511 +#: commands/copyfrom.c:118 #, c-format -msgid "\"%s\" is a directory" -msgstr "\"%s\" 디렉터리임" +msgid "COPY %s" +msgstr "COPY %s" -#: commands/copy.c:2246 +#: commands/copyfrom.c:126 #, c-format -msgid "COPY %s, line %s, column %s" -msgstr "%s 복사, %s번째 줄, %s ì—´" +msgid "COPY %s, line %llu, column %s" +msgstr "COPY %s, %llu번째 줄, %s ì—´" -#: commands/copy.c:2250 commands/copy.c:2297 +#: commands/copyfrom.c:131 commands/copyfrom.c:177 #, c-format -msgid "COPY %s, line %s" -msgstr "%s 복사, %s번째 줄" +msgid "COPY %s, line %llu" +msgstr "COPY %s, %llu번째 줄" -#: commands/copy.c:2261 +#: commands/copyfrom.c:143 #, c-format -msgid "COPY %s, line %s, column %s: \"%s\"" -msgstr "%s 복사, %s번째 줄, %s ì—´: \"%s\"" +msgid "COPY %s, line %llu, column %s: \"%s\"" +msgstr "COPY %s, %llu번째 줄, %s ì—´: \"%s\"" -#: commands/copy.c:2269 +#: commands/copyfrom.c:153 #, c-format -msgid "COPY %s, line %s, column %s: null input" -msgstr "COPY %s, %sí–‰, %s ì—´: null ìž…ë ¥" +msgid "COPY %s, line %llu, column %s: null input" +msgstr "COPY %s, %lluí–‰, %s ì—´: null ìž…ë ¥" -#: commands/copy.c:2291 +#: commands/copyfrom.c:170 #, c-format -msgid "COPY %s, line %s: \"%s\"" -msgstr "%s 복사, %s번째 줄: \"%s\"" +msgid "COPY %s, line %llu: \"%s\"" +msgstr "COPY %s, %llu번째 줄: \"%s\"" -#: commands/copy.c:2692 +#: commands/copyfrom.c:673 #, c-format msgid "cannot copy to view \"%s\"" msgstr "\"%s\" 뷰로 복사할 수 ì—†ìŒ" -#: commands/copy.c:2694 +#: commands/copyfrom.c:675 #, c-format msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." msgstr "뷰를 통해 ìžë£Œë¥¼ 입력하려면, INSTEAD OF INSERT 트리거를 사용하세요" -#: commands/copy.c:2698 +#: commands/copyfrom.c:679 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "\"%s\" êµ¬ì²´í™”ëœ ë·°(view)ì— ë³µì‚¬í•  수 ì—†ìŒ" -#: commands/copy.c:2703 +#: commands/copyfrom.c:684 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "\"%s\" ì‹œí€€ìŠ¤ì— ë³µì‚¬í•  수 ì—†ìŒ" -#: commands/copy.c:2708 +#: commands/copyfrom.c:689 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "\"%s\" 개체는 í…Œì´ë¸”ì´ ì•„ë‹Œ 릴레ì´ì…˜(relation)ì´ê¸°ì— 복사할 수 ì—†ìŒ" -#: commands/copy.c:2748 +#: commands/copyfrom.c:729 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "파티션 ëœ í…Œì´ë¸”ì—는 COPY FREEZE 수행할 수 ì—†ìŒ" -#: commands/copy.c:2763 +#: commands/copyfrom.c:744 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "" "먼저 시작한 다른 íŠ¸ëžœìž­ì…˜ì´ ì•„ì§ í™œì„± ìƒíƒœì—¬ì„œ COPY FREEZE ìž‘ì—…ì€ ì§„í–‰í•  수 " "ì—†ìŒ" -#: commands/copy.c:2769 +#: commands/copyfrom.c:750 #, c-format msgid "" "cannot perform COPY FREEZE because the table was not created or truncated in " @@ -6792,7 +7861,27 @@ msgstr "" "현재 하위 트랜잭션ì—서 만들어지거나 비워진 í…Œì´ë¸”ì´ ì•„ë‹ˆê¸° ë•Œë¬¸ì— COPY " "FREEZE ìž‘ì—…ì„ í•  수 ì—†ìŒ" -#: commands/copy.c:3498 +#: commands/copyfrom.c:1313 +#, c-format +msgid "%llu row was skipped due to data type incompatibility" +msgid_plural "%llu rows were skipped due to data type incompatibility" +msgstr[0] "%lluê°œì˜ ë¡œìš°ê°€ ìžë£Œí˜•ì´ í˜¸í™˜ë˜ì§€ 않아 건너뜀" + +#. translator: first %s is the name of a COPY option, e.g. FORCE_NOT_NULL +#. translator: %s is the name of a COPY option, e.g. FORCE_NOT_NULL +#: commands/copyfrom.c:1448 commands/copyfrom.c:1491 commands/copyto.c:601 +#, c-format +msgid "%s column \"%s\" not referenced by COPY" +msgstr "%s 옵션(해당 칼럼: \"%s\")ì€ COPYì—서 참조ë˜ì§€ 않ìŒ" + +#: commands/copyfrom.c:1544 utils/mb/mbutils.c:385 +#, c-format +msgid "" +"default conversion function for encoding \"%s\" to \"%s\" does not exist" +msgstr "" +"\"%s\" ì¸ì½”ë”©ì„ \"%s\" ì¸ì½”딩으로 변환할 기본 변환규칙(conversion)ì´ ì—†ìŒ" + +#: commands/copyfrom.c:1742 #, c-format msgid "" "COPY FROM instructs the PostgreSQL server process to read a file. You may " @@ -6802,152 +7891,323 @@ msgstr "" "언트 ìª½ì— ìžˆëŠ” 파ì¼ì„ ì½ì–´ 처리 하려면, psqlì˜ \\copy 내장 명령어를 사용하세" "ìš”." -#: commands/copy.c:3526 +#: commands/copyfrom.c:1755 commands/copyto.c:706 +#, c-format +msgid "\"%s\" is a directory" +msgstr "\"%s\" 디렉터리임" + +#: commands/copyfrom.c:1823 commands/copyto.c:299 libpq/be-secure-common.c:83 +#, c-format +msgid "could not close pipe to external command: %m" +msgstr "외부 명령으로 파ì´í”„를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: commands/copyfrom.c:1838 commands/copyto.c:304 +#, c-format +msgid "program \"%s\" failed" +msgstr "\"%s\" 프로그램 실패" + +#: commands/copyfromparse.c:200 #, c-format msgid "COPY file signature not recognized" msgstr "COPY íŒŒì¼ signature ì¸ì‹ë˜ì§€ 않았ìŒ" -#: commands/copy.c:3531 +#: commands/copyfromparse.c:205 #, c-format msgid "invalid COPY file header (missing flags)" msgstr "COPY 명령ì—서 ìž˜ëª»ëœ íŒŒì¼ í—¤ë”를 사용함(플래그 빠졌ìŒ)" -#: commands/copy.c:3535 +#: commands/copyfromparse.c:209 +#, c-format +msgid "invalid COPY file header (WITH OIDS)" +msgstr "COPY íŒŒì¼ í•´ë” ìž˜ëª»ë¨ (WITH OIDS)" + +#: commands/copyfromparse.c:214 +#, c-format +msgid "unrecognized critical flags in COPY file header" +msgstr "COPY íŒŒì¼ í—¤ë”ì•ˆì— critical flags ê°’ë“¤ì„ ì¸ì‹í•  수 ì—†ìŒ" + +#: commands/copyfromparse.c:220 +#, c-format +msgid "invalid COPY file header (missing length)" +msgstr "COPY íŒŒì¼ í—¤ë”ì— length ê°’ì´ ë¹ ì¡ŒìŒ" + +#: commands/copyfromparse.c:227 +#, c-format +msgid "invalid COPY file header (wrong length)" +msgstr "COPY íŒŒì¼ í—¤ë”ì— length ê°’ì´ ìž˜ëª»ë˜ì—ˆìŒ" + +#: commands/copyfromparse.c:256 +#, c-format +msgid "could not read from COPY file: %m" +msgstr "COPY ëª…ë ¹ì— ì‚¬ìš©í•  파ì¼ì„ ì½ì„ 수 없습니다: %m" + +#: commands/copyfromparse.c:278 commands/copyfromparse.c:303 +#: replication/walsender.c:756 replication/walsender.c:782 tcop/postgres.c:381 +#, c-format +msgid "unexpected EOF on client connection with an open transaction" +msgstr "열린 트랜잭션과 함께 í´ë¼ì´ì–¸íЏ ì—°ê²°ì—서 예ìƒì¹˜ ì•Šì€ EOF 발견ë¨" + +#: commands/copyfromparse.c:294 replication/walsender.c:772 +#, c-format +msgid "unexpected message type 0x%02X during COPY from stdin" +msgstr "" +"COPY 명령으로 stdin으로 ìžë£Œë¥¼ 가져오는 ë™ì•ˆ 예ìƒì¹˜ ì•Šì€ ë©”ì‹œì§€ 타입 0x%02X " +"발견ë¨" + +#: commands/copyfromparse.c:317 replication/walsender.c:803 #, c-format -msgid "invalid COPY file header (WITH OIDS)" -msgstr "COPY íŒŒì¼ í•´ë” ìž˜ëª»ë¨ (WITH OIDS)" +msgid "COPY from stdin failed: %s" +msgstr "COPY 명령ì—서 stdin으로 ìžë£Œ 가져오기 실패: %s" -#: commands/copy.c:3540 +#: commands/copyfromparse.c:785 #, c-format -msgid "unrecognized critical flags in COPY file header" -msgstr "COPY íŒŒì¼ í—¤ë”ì•ˆì— critical flags ê°’ë“¤ì„ ì¸ì‹í•  수 ì—†ìŒ" +msgid "wrong number of fields in header line: got %d, expected %d" +msgstr "í—¤ë” ì¤„ì— í•„ë“œ 수가 잘못ë¨: %dê°œ 확ì¸, 기대값: %dê°œ" -#: commands/copy.c:3546 +#: commands/copyfromparse.c:801 #, c-format -msgid "invalid COPY file header (missing length)" -msgstr "COPY íŒŒì¼ í—¤ë”ì— length ê°’ì´ ë¹ ì¡ŒìŒ" +msgid "" +"column name mismatch in header line field %d: got null value (\"%s\"), " +"expected \"%s\"" +msgstr "" +"í—¤ë” %d 번째 í•„ë“œì˜ ì¹¼ëŸ¼ ì´ë¦„ì´ ì¼ì¹˜í•˜ì§€ 않ìŒ: null ê°’ 발견(\"%s\"), 기대값" +"=\"%s\"" -#: commands/copy.c:3553 +#: commands/copyfromparse.c:808 #, c-format -msgid "invalid COPY file header (wrong length)" -msgstr "COPY íŒŒì¼ í—¤ë”ì— length ê°’ì´ ìž˜ëª»ë˜ì—ˆìŒ" +msgid "" +"column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "" +"í—¤ë” ì¤„ %d 번째 í•„ë“œì˜ ì¹¼ëŸ¼ ì´ë¦„ì´ ì¼ì¹˜í•˜ì§€ 않ìŒ: 해당ì´ë¦„=\"%s\", 기대값" +"=\"%s\"" -#: commands/copy.c:3672 commands/copy.c:4337 commands/copy.c:4567 +#: commands/copyfromparse.c:892 commands/copyfromparse.c:1554 +#: commands/copyfromparse.c:1810 #, c-format msgid "extra data after last expected column" msgstr "마지막 ì¹¼ëŸ¼ì„ ì´ˆê³¼í•´ì„œ ë˜ ë‹¤ë¥¸ ë°ì´í„°ê°€ 있ìŒ" -#: commands/copy.c:3686 +#: commands/copyfromparse.c:906 #, c-format msgid "missing data for column \"%s\"" msgstr "\"%s\" ì¹¼ëŸ¼ì˜ ìžë£Œê°€ 빠졌ìŒ" -#: commands/copy.c:3769 +#: commands/copyfromparse.c:990 +#, c-format +msgid "" +"skipping row due to data type incompatibility at line %llu for column " +"\"%s\": \"%s\"" +msgstr "" +"%llu 줄ì—서 ìžë£Œí˜•ì´ í˜¸í™˜ë˜ì§€ 않아, 로우를 건너 뜀(해당 칼럼: \"%s\"): \"%s\"" + +#: commands/copyfromparse.c:998 +#, c-format +msgid "" +"skipping row due to data type incompatibility at line %llu for column " +"\"%s\": null input" +msgstr "" +"%llu 줄ì—서 ìžë£Œí˜•ì´ í˜¸í™˜ë˜ì§€ 않아, 로우를 건너 뜀(해당 칼럼: \"%s\"): null ìž…ë ¥" + +#: commands/copyfromparse.c:1044 #, c-format msgid "received copy data after EOF marker" msgstr "EOF 표시 ë’¤ì—ë„ ë³µì‚¬ ë°ì´í„°ë¥¼ 받았ìŒ" -#: commands/copy.c:3776 +#: commands/copyfromparse.c:1051 #, c-format msgid "row field count is %d, expected %d" msgstr "í–‰(row) 필드 갯수가 %d ìž„, 예ìƒê°’ì€ %d" -#: commands/copy.c:4096 commands/copy.c:4113 +#: commands/copyfromparse.c:1336 commands/copyfromparse.c:1353 #, c-format msgid "literal carriage return found in data" msgstr "ë°ì´í„°ì— carriage return ê°’ì´ ìž˜ëª»ë˜ì—ˆìŒ" -#: commands/copy.c:4097 commands/copy.c:4114 +#: commands/copyfromparse.c:1337 commands/copyfromparse.c:1354 #, c-format msgid "unquoted carriage return found in data" msgstr "ë°ì´í„°ì— carriage return ê°’ 표기가 잘못 ë˜ì—ˆìŒ" -#: commands/copy.c:4099 commands/copy.c:4116 +#: commands/copyfromparse.c:1339 commands/copyfromparse.c:1356 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "carriage return값으로 \"\\r\" 문ìžë¥¼ 사용하세요" -#: commands/copy.c:4100 commands/copy.c:4117 +#: commands/copyfromparse.c:1340 commands/copyfromparse.c:1357 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "" "carriage return 문ìžë¥¼ 그대로 ì ìš©í•˜ë ¤ë©´, quoted CSV 필드를 사용하세요." -#: commands/copy.c:4129 +#: commands/copyfromparse.c:1369 #, c-format msgid "literal newline found in data" msgstr "ë°ì´í„°ì— newline ê°’ì´ ìž˜ëª»ë˜ì—ˆìŒ" -#: commands/copy.c:4130 +#: commands/copyfromparse.c:1370 #, c-format msgid "unquoted newline found in data" msgstr "ë°ì´í„°ì— newline ê°’ì´ ìž˜ëª» ë˜ì—ˆìŒ" -#: commands/copy.c:4132 +#: commands/copyfromparse.c:1372 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "newline 값으로 \"\\n\" 문ìžë¥¼ 사용하세요" -#: commands/copy.c:4133 +#: commands/copyfromparse.c:1373 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "newline 문ìžë¥¼ 그대로 ì ìš©í•˜ë ¤ë©´, quoted CSV 필드를 사용하세요." -#: commands/copy.c:4179 commands/copy.c:4215 +#: commands/copyfromparse.c:1419 commands/copyfromparse.c:1455 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "end-of-copy 마í¬ëŠ” ì´ì „ newline 모양가 틀립니다" -#: commands/copy.c:4188 commands/copy.c:4204 +#: commands/copyfromparse.c:1428 commands/copyfromparse.c:1444 #, c-format msgid "end-of-copy marker corrupt" msgstr "end-of-copy 마í¬ê°€ 잘못ë˜ì—ˆìŒ" -#: commands/copy.c:4651 +#: commands/copyfromparse.c:1746 commands/copyfromparse.c:1961 +#, c-format +msgid "unexpected default marker in COPY data" +msgstr "COPY ìžë£Œ ì•ˆì— ì˜ˆìƒì¹˜ ì•Šì€ ê¸°ë³¸ 마커" + +#: commands/copyfromparse.c:1747 commands/copyfromparse.c:1962 +#, c-format +msgid "Column \"%s\" has no default value." +msgstr "\"%s\" ì¹¼ëŸ¼ì€ DEFAULT ê°’ì´ ì—†ìŒ." + +#: commands/copyfromparse.c:1894 #, c-format msgid "unterminated CSV quoted field" msgstr "종료ë˜ì§€ ì•Šì€ CSV 따옴표 필드" -#: commands/copy.c:4728 commands/copy.c:4747 +#: commands/copyfromparse.c:1996 commands/copyfromparse.c:2015 #, c-format msgid "unexpected EOF in COPY data" msgstr "복사 ìžë£Œ ì•ˆì— ì˜ˆìƒì¹˜ ì•Šì€ EOF 발견" -#: commands/copy.c:4737 +#: commands/copyfromparse.c:2005 #, c-format msgid "invalid field size" msgstr "ìž˜ëª»ëœ í•„ë“œ í¬ê¸°" -#: commands/copy.c:4760 +#: commands/copyfromparse.c:2028 #, c-format msgid "incorrect binary data format" msgstr "ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ ìžë£Œ í¬ë§·" -#: commands/copy.c:5068 +#: commands/copyto.c:229 #, c-format -msgid "column \"%s\" is a generated column" -msgstr "\"%s\" ì¹¼ëŸ¼ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ìž„" +msgid "could not write to COPY program: %m" +msgstr "COPY 프로그램으로 파ì¼ì„ 쓸 수 없습니다: %m" -#: commands/copy.c:5070 +#: commands/copyto.c:234 #, c-format -msgid "Generated columns cannot be used in COPY." -msgstr "미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì€ COPY 작업 대ìƒì´ 아님" +msgid "could not write to COPY file: %m" +msgstr "COPY 파ì¼ë¡œë¡œ 파ì¼ì„ 쓸 수 없습니다: %m" -#: commands/copy.c:5085 commands/indexcmds.c:1699 commands/statscmds.c:217 -#: commands/tablecmds.c:2176 commands/tablecmds.c:2795 -#: commands/tablecmds.c:3182 parser/parse_relation.c:3507 -#: parser/parse_relation.c:3527 utils/adt/tsvector_op.c:2668 +#: commands/copyto.c:379 #, c-format -msgid "column \"%s\" does not exist" -msgstr "\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼ì€ ì—†ìŠµë‹ˆë‹¤" +msgid "cannot copy from view \"%s\"" +msgstr "\"%s\" ì´ë¦„ì˜ ê°œì²´ëŠ” ë·°(view)입니다. ìžë£Œë¥¼ 내보낼 수 없습니다" -#: commands/copy.c:5092 commands/tablecmds.c:2202 commands/trigger.c:885 -#: parser/parse_target.c:1052 parser/parse_target.c:1063 +#: commands/copyto.c:381 commands/copyto.c:387 commands/copyto.c:393 +#: commands/copyto.c:404 #, c-format -msgid "column \"%s\" specified more than once" -msgstr "\"%s\" ì¹¼ëŸ¼ì„ í•˜ë‚˜ ì´ìƒ 지정했ìŒ" +msgid "Try the COPY (SELECT ...) TO variant." +msgstr "COPY (SELECT ...) TO ë³€í˜•ì„ ì‹œë„하십시오." + +#: commands/copyto.c:385 +#, c-format +msgid "cannot copy from materialized view \"%s\"" +msgstr "\"%s\" ì´ë¦„ì˜ ê°œì²´ëŠ” êµ¬ì²´í™”ëœ ë·°ìž…ë‹ˆë‹¤. ìžë£Œë¥¼ 내보낼 수 없습니다" + +#: commands/copyto.c:391 +#, c-format +msgid "cannot copy from foreign table \"%s\"" +msgstr "\"%s\" ì´ë¦„ì˜ ê°œì²´ëŠ” 외부 í…Œì´ë¸”입니다. ìžë£Œë¥¼ 내보낼 수 없습니다" + +#: commands/copyto.c:397 +#, c-format +msgid "cannot copy from sequence \"%s\"" +msgstr "\"%s\" ì´ë¦„ì˜ ê°œì²´ëŠ” 시퀀스입니다. ìžë£Œë¥¼ 내보낼 수 없습니다" + +#: commands/copyto.c:402 +#, c-format +msgid "cannot copy from partitioned table \"%s\"" +msgstr "\"%s\" 파티션 ëœ í…Œì´ë¸”ì—서 복사할 수 ì—†ìŒ" + +#: commands/copyto.c:408 +#, c-format +msgid "cannot copy from non-table relation \"%s\"" +msgstr "" +"\"%s\" 개체는 í…Œì´ë¸”ì´ ì•„ë‹Œ 릴레ì´ì…˜(relation)ì´ê¸°ì— ìžë£Œë¥¼ 내보낼 수 없습니" +"다" + +#: commands/copyto.c:460 +#, c-format +msgid "DO INSTEAD NOTHING rules are not supported for COPY" +msgstr "DO INSTEAD NOTHING 룰(rule)ì€ COPY 구문ì—서 ì§€ì›í•˜ì§€ 않습니다." + +#: commands/copyto.c:474 +#, c-format +msgid "conditional DO INSTEAD rules are not supported for COPY" +msgstr "ì„ íƒì  DO INSTEAD ë£°ì€ COPY 구문ì—서 ì§€ì›í•˜ì§€ 않ìŒ" + +#: commands/copyto.c:478 +#, c-format +msgid "DO ALSO rules are not supported for COPY" +msgstr "DO ALSO ë£°ì€ COPY 구문ì—서 ì§€ì›í•˜ì§€ 않ìŒ" + +#: commands/copyto.c:483 +#, c-format +msgid "multi-statement DO INSTEAD rules are not supported for COPY" +msgstr "다중 구문 DO INSTEAD ë£°ì€ COPY 구문ì—서 ì§€ì›í•˜ì§€ 않ìŒ" + +#: commands/copyto.c:493 +#, c-format +msgid "COPY (SELECT INTO) is not supported" +msgstr "COPY (SELECT INTO) ì§€ì›í•˜ì§€ 않ìŒ" + +#: commands/copyto.c:499 +#, c-format +msgid "COPY query must not be a utility command" +msgstr "COPY 쿼리는 DDL, DCL ëª…ë ¹ì´ ì•„ë‹ˆì—¬ì•¼ 함" + +#: commands/copyto.c:515 +#, c-format +msgid "COPY query must have a RETURNING clause" +msgstr "COPY 쿼리는 RETURNING ì ˆì´ ìžˆì–´ì•¼ 함" + +#: commands/copyto.c:544 +#, c-format +msgid "relation referenced by COPY statement has changed" +msgstr "COPY ë¬¸ì— ì˜í•´ ì°¸ì¡°ëœ ë¦´ë ˆì´ì…˜ì´ 변경 ë˜ì—ˆìŒ" + +#: commands/copyto.c:671 +#, c-format +msgid "relative path not allowed for COPY to file" +msgstr "COPY ëª…ë ¹ì— ì‚¬ìš©í•  íŒŒì¼ ì´ë¦„으로 ìƒëŒ€ê²½ë¡œëŠ” 사용할 수 ì—†ìŒ" + +#: commands/copyto.c:690 +#, c-format +msgid "could not open file \"%s\" for writing: %m" +msgstr "\"%s\" íŒŒì¼ ì—´ê¸° 실패: %m" + +#: commands/copyto.c:693 +#, c-format +msgid "" +"COPY TO instructs the PostgreSQL server process to write a file. You may " +"want a client-side facility such as psql's \\copy." +msgstr "" +"COPY TO ëª…ë ¹ì€ PostgreSQL 서버 프로세스가 작업하기 때문ì—, ì„œë²„ì— ê·¸ 결과가 " +"저장ëœë‹¤. í´ë¼ì´ì–¸íЏ 쪽ì—서 ê·¸ 결과를 저장하려면, psql \\copy 명령으로 처리" +"í•  수 있다." -#: commands/createas.c:215 commands/createas.c:497 +#: commands/createas.c:210 commands/createas.c:516 #, c-format msgid "too many column names were specified" msgstr "너무 ë§Žì€ ì¹¼ëŸ¼ ì´ë¦„ì„ ì§€ì •í–ˆìŠµë‹ˆë‹¤." @@ -6957,70 +8217,132 @@ msgstr "너무 ë§Žì€ ì¹¼ëŸ¼ ì´ë¦„ì„ ì§€ì •í–ˆìŠµë‹ˆë‹¤." msgid "policies not yet implemented for this command" msgstr "ì´ ëª…ë ¹ì„ ìœ„í•œ ì •ì±…ì€ ì•„ì§ êµ¬í˜„ë˜ì–´ 있지 않습니다" -#: commands/dbcommands.c:246 +#: commands/dbcommands.c:829 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION 예약어는 ì´ì œ ë”ì´ìƒ ì§€ì›í•˜ì§€ 않습니다" -#: commands/dbcommands.c:247 +#: commands/dbcommands.c:830 #, c-format msgid "Consider using tablespaces instead." msgstr "ëŒ€ì‹ ì— í…Œì´ë¸”스페ì´ìŠ¤ë¥¼ ì´ìš©í•˜ì„¸ìš”." -#: commands/dbcommands.c:261 +#: commands/dbcommands.c:855 #, c-format -msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." -msgstr "LOCALE ê°’ì€ LC_COLLATE ë˜ëŠ” LC_CTYPE ê°’ê³¼ 함께 지정할 수 ì—†ìŒ" +msgid "OIDs less than %u are reserved for system objects" +msgstr "시스템 ê°ì²´ìš©ìœ¼ë¡œ 사용할 미리 ì˜ˆì•½ëœ ìµœëŒ€ %u OID 보다 ìž‘ì„ ìˆ˜ëŠ” ì—†ìŒ" -#: commands/dbcommands.c:279 utils/adt/ascii.c:145 +#: commands/dbcommands.c:886 utils/adt/ascii.c:146 #, c-format msgid "%d is not a valid encoding code" msgstr "%d ê°’ì€ ìž˜ëª»ëœ ì¸ì½”딩 코드임" -#: commands/dbcommands.c:290 utils/adt/ascii.c:127 +#: commands/dbcommands.c:897 utils/adt/ascii.c:128 #, c-format msgid "%s is not a valid encoding name" msgstr "%s ì´ë¦„ì€ ìž˜ëª»ëœ ì¸ì½”딩 ì´ë¦„ìž„" -#: commands/dbcommands.c:314 commands/dbcommands.c:1569 commands/user.c:275 -#: commands/user.c:691 +#: commands/dbcommands.c:931 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "알 수 없는 ë¡œì¼€ì¼ ì œê³µìž ì´ë¦„: %s" + +#: commands/dbcommands.c:944 commands/dbcommands.c:2414 commands/user.c:299 +#: commands/user.c:739 #, c-format msgid "invalid connection limit: %d" msgstr "ìž˜ëª»ëœ ì—°ê²° 제한: %d" -#: commands/dbcommands.c:333 +#: commands/dbcommands.c:965 #, c-format msgid "permission denied to create database" msgstr "ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만들 ê¶Œí•œì´ ì—†ìŒ" -#: commands/dbcommands.c:356 +#: commands/dbcommands.c:989 #, c-format msgid "template database \"%s\" does not exist" msgstr "\"%s\" 템플릿 ë°ì´í„°ë² ì´ìФ ì—†ìŒ" -#: commands/dbcommands.c:368 +#: commands/dbcommands.c:999 +#, c-format +msgid "cannot use invalid database \"%s\" as template" +msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ ìž˜ëª»ëœ ê²ƒìœ¼ë¡œ 템플릿으로 사용할 수 ì—†ìŒ" + +#: commands/dbcommands.c:1000 commands/dbcommands.c:2444 +#: utils/init/postinit.c:1113 +#, c-format +msgid "Use DROP DATABASE to drop invalid databases." +msgstr "" +"바르지 ì•Šì€ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 삭제하려면, DROP DATABASE ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." + +#: commands/dbcommands.c:1011 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 복사할 ê¶Œí•œì´ ì—†ìŒ" -#: commands/dbcommands.c:384 +#: commands/dbcommands.c:1028 +#, c-format +msgid "invalid create database strategy \"%s\"" +msgstr "ìž˜ëª»ëœ ë°ì´í„°ë² ì´ìФ 만들기 ì „ëžµ: \"%s\"" + +#: commands/dbcommands.c:1029 +#, c-format +msgid "Valid strategies are \"wal_log\" and \"file_copy\"." +msgstr "사용할 수 있는 ì „ëžµê°’ì€ \"wal_log\" ë˜ëŠ” \"file_copy\"" + +#: commands/dbcommands.c:1050 #, c-format msgid "invalid server encoding %d" msgstr "ìž˜ëª»ëœ ì„œë²„ ì¸ì½”딩 %d" -#: commands/dbcommands.c:390 commands/dbcommands.c:395 +#: commands/dbcommands.c:1056 +#, c-format +msgid "invalid LC_COLLATE locale name: \"%s\"" +msgstr "LC_COLLATE ë¡œì¼€ì¼ ì´ë¦„ì´ ìž˜ëª»ë¨: \"%s\"" + +#: commands/dbcommands.c:1057 commands/dbcommands.c:1063 +#, c-format +msgid "If the locale name is specific to ICU, use ICU_LOCALE." +msgstr "ICU ë¡œì¼€ì¼ ì´ë¦„ì„ ì‚¬ìš©í•˜ë ¤ë©´, ICU_LOCALEì„ ì‚¬ìš©í•˜ì„¸ìš”." + +#: commands/dbcommands.c:1062 +#, c-format +msgid "invalid LC_CTYPE locale name: \"%s\"" +msgstr "LC_CTYPE ë¡œì¼€ì¼ ì´ë¦„ì´ ìž˜ëª»ë¨: \"%s\"" + +#: commands/dbcommands.c:1074 +#, c-format +msgid "BUILTIN_LOCALE cannot be specified unless locale provider is builtin" +msgstr "BUILTIN_LOCALE ì˜µì…˜ì€ ë¡œì¼€ì¼ ì œê³µìž ì¤‘ì— ë¹ŒíŠ¸ì¸ì´ 있어야 쓸 수 있ìŒ" + +#: commands/dbcommands.c:1082 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "ICU 로케ì¼ì€ ICU ë¡œì¼€ì¼ ì œê³µìžë¥¼ 지정해야만 쓸 수 있습니다." + +#: commands/dbcommands.c:1100 +#, c-format +msgid "LOCALE or BUILTIN_LOCALE must be specified" +msgstr "LOCALE ë˜ëŠ” BUILTIN_LOCALEì„ ì§€ì •í•´ì•¼ 합니다." + +#: commands/dbcommands.c:1109 +#, c-format +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "\"%s\" ì¸ì½”ë”©ì€ ICU 제공ìžì—서 ì§€ì›í•˜ì§€ 않ìŒ" + +#: commands/dbcommands.c:1119 #, c-format -msgid "invalid locale name: \"%s\"" -msgstr "\"%s\" ë¡œì¼€ì¼ ì´ë¦„ì´ ìž˜ëª»ë¨" +msgid "LOCALE or ICU_LOCALE must be specified" +msgstr "LOCALE ë˜ëŠ” ICU_LOCALEì„ ì§€ì •í•´ì•¼ 합니다." -#: commands/dbcommands.c:415 +#: commands/dbcommands.c:1163 #, c-format msgid "" "new encoding (%s) is incompatible with the encoding of the template database " "(%s)" msgstr "새 ì¸ì½”딩(%s)ì´ í…œí”Œë¦¿ ë°ì´í„°ë² ì´ìŠ¤ì˜ ì¸ì½”딩(%s)ê³¼ 호환ë˜ì§€ 않ìŒ" -#: commands/dbcommands.c:418 +#: commands/dbcommands.c:1166 #, c-format msgid "" "Use the same encoding as in the template database, or use template0 as " @@ -7029,7 +8351,7 @@ msgstr "" "템플릿 ë°ì´í„°ë² ì´ìŠ¤ì™€ ë™ì¼í•œ ì¸ì½”ë”©ì„ ì‚¬ìš©í•˜ê±°ë‚˜ template0ì„ í…œí”Œë¦¿ìœ¼ë¡œ 사용" "하십시오." -#: commands/dbcommands.c:423 +#: commands/dbcommands.c:1171 #, c-format msgid "" "new collation (%s) is incompatible with the collation of the template " @@ -7038,7 +8360,7 @@ msgstr "" "새 ë°ì´í„° ì •ë ¬ 규칙 (%s)ì´ í…œí”Œë¦¿ ë°ì´í„°ë² ì´ìŠ¤ì˜ ë°ì´í„° ì •ë ¬ 규칙(%s)ê³¼ 호환" "ë˜ì§€ 않ìŒ" -#: commands/dbcommands.c:425 +#: commands/dbcommands.c:1173 #, c-format msgid "" "Use the same collation as in the template database, or use template0 as " @@ -7047,14 +8369,14 @@ msgstr "" "템플릿 ë°ì´í„°ë² ì´ìŠ¤ì™€ ë™ì¼í•œ ë°ì´í„° ì •ë ¬ ê·œì¹™ì„ ì‚¬ìš©í•˜ê±°ë‚˜ template0ì„ í…œí”Œë¦¿" "으로 사용하십시오." -#: commands/dbcommands.c:430 +#: commands/dbcommands.c:1178 #, c-format msgid "" "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database " "(%s)" msgstr "새 LC_CTYPE (%s)ì´ í…œí”Œë¦¿ ë°ì´í„°ë² ì´ìŠ¤ì˜ LC_CTYPE (%s)ê³¼ 호환ë˜ì§€ 않ìŒ" -#: commands/dbcommands.c:432 +#: commands/dbcommands.c:1180 #, c-format msgid "" "Use the same LC_CTYPE as in the template database, or use template0 as " @@ -7063,17 +8385,103 @@ msgstr "" "템플릿 ë°ì´í„°ë² ì´ìŠ¤ì™€ ë™ì¼í•œ LC_CTYPEì„ ì‚¬ìš©í•˜ê±°ë‚˜ template0ì„ í…œí”Œë¦¿ìœ¼ë¡œ 사" "용하십시오." -#: commands/dbcommands.c:454 commands/dbcommands.c:1196 +#: commands/dbcommands.c:1185 +#, c-format +msgid "" +"new locale provider (%s) does not match locale provider of the template " +"database (%s)" +msgstr "" +"새 ë¡œì¼€ì¼ ì œê³µìž(%s)는 템플릿 ë°ì´í„°ë² ì´ìŠ¤ì˜ ë¡œì¼€ì¼ ì œê³µìž(%s)와 같지 않ìŒ" + +#: commands/dbcommands.c:1187 +#, c-format +msgid "" +"Use the same locale provider as in the template database, or use template0 " +"as template." +msgstr "" +"템플릿 ë°ì´í„°ë² ì´ìŠ¤ì™€ ë™ì¼í•œ ë¡œì¼€ì¼ ì œê³µìžë¥¼ 사용하거나 template0ì„ í…œí”Œë¦¿ìœ¼" +"로 사용하십시오." + +#: commands/dbcommands.c:1199 +#, c-format +msgid "" +"new ICU locale (%s) is incompatible with the ICU locale of the template " +"database (%s)" +msgstr "" +"새 ICU 로케ì¼(%s)ì´ í…œí”Œë¦¿ ë°ì´í„°ë² ì´ìŠ¤ì˜ ICU 로케ì¼(%s)ê³¼ 호환ë˜ì§€ 않ìŒ" + +#: commands/dbcommands.c:1201 +#, c-format +msgid "" +"Use the same ICU locale as in the template database, or use template0 as " +"template." +msgstr "" +"템플릿 ë°ì´í„°ë² ì´ìŠ¤ì™€ ë™ì¼í•œ ICU 로케ì¼ì„ 사용하거나 template0ì„ í…œí”Œë¦¿ìœ¼ë¡œ " +"사용하십시오." + +#: commands/dbcommands.c:1212 +#, c-format +msgid "" +"new ICU collation rules (%s) are incompatible with the ICU collation rules " +"of the template database (%s)" +msgstr "" +"새 ICU 문ìžì—´ ì •ë ¬ 규칙 (%s)ì´ í…œí”Œë¦¿ ë°ì´í„°ë² ì´ìŠ¤ì˜ ICU 문ìžì—´ ì •ë ¬ 규칙(%s)" +"ê³¼ 호환ë˜ì§€ 않ìŒ" + +#: commands/dbcommands.c:1214 +#, c-format +msgid "" +"Use the same ICU collation rules as in the template database, or use " +"template0 as template." +msgstr "" +"템플릿 ë°ì´í„°ë² ì´ìŠ¤ì™€ ë™ì¼í•œ ICU 문ìžì—´ ì •ë ¬ ê·œì¹™ì„ ì‚¬ìš©í•˜ê±°ë‚˜ template0ì„ í…œ" +"플릿으로 사용하십시오." + +#: commands/dbcommands.c:1243 +#, c-format +msgid "" +"template database \"%s\" has a collation version, but no actual collation " +"version could be determined" +msgstr "" +"\"%s\" 템플릿 ë°ì´í„°ë² ì´ìФì—는 ë¬¸ìž ì •ë ¬ 규칙 ë²„ì „ì´ ìžˆëŠ”ë°, ê·¸ 실제 ë²„ì „ì„ " +"알 수 ì—†ìŒ" + +#: commands/dbcommands.c:1248 +#, c-format +msgid "template database \"%s\" has a collation version mismatch" +msgstr "\"%s\" 템플릿 ë°ì´í„°ë² ì´ìŠ¤ì˜ ë¬¸ìž ì •ë ¬ 규칙 ë²„ì „ì´ ë°”ë¥´ì§€ 않ìŒ" + +#: commands/dbcommands.c:1250 +#, c-format +msgid "" +"The template database was created using collation version %s, but the " +"operating system provides version %s." +msgstr "" +"템플릿 ë°ì´í„°ë² ì´ìŠ¤ëŠ” ë¬¸ìž ì •ë ¬ 규칙 ë²„ì „ì´ %s ì´ê³ , ìš´ì˜ì²´ì œëŠ” %s ë²„ì „ì„ ì§€" +"ì›í•©ë‹ˆë‹¤." + +#: commands/dbcommands.c:1253 +#, c-format +msgid "" +"Rebuild all objects in the template database that use the default collation " +"and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL " +"with the right library version." +msgstr "" +"템플릿 ë°ì´í„°ë² ì´ìФ ë‚´ 모든 ê°ì²´ë¥¼ 기본 ë¬¸ìž ì •ë ¬ ê·œì¹™ì„ ì‚¬ìš©í•˜ë„ë¡ ë‹¤ì‹œ 만들" +"ê³ , ALTER DATABASE %s REFRESH COLLATION VERSION ëª…ë ¹ì„ ì‹¤í–‰í•˜ê±°ë‚˜, 바른 버전" +"ì˜ ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 사용해서 PostgreSQL ì—”ì§„ì„ ë‹¤ì‹œ 만드십시오." + +#: commands/dbcommands.c:1298 commands/dbcommands.c:2041 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "pg_globalì„ ê¸°ë³¸ í…Œì´ë¸”스페ì´ìŠ¤ë¡œ 사용할 수 ì—†ìŒ" -#: commands/dbcommands.c:480 +#: commands/dbcommands.c:1324 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "새 \"%s\" í…Œì´ë¸”스페ì´ìŠ¤ë¥¼ 지정할 수 없습니다." -#: commands/dbcommands.c:482 +#: commands/dbcommands.c:1326 #, c-format msgid "" "There is a conflict because database \"%s\" already has some tables in this " @@ -7082,96 +8490,107 @@ msgstr "" "\"%s\" ë°ì´í„°ë² ì´ìФ ì†Œì† ëª‡ëª‡ í…Œì´ë¸”ë“¤ì´ ì´ í…Œì´ë¸”스페ì´ìŠ¤ì•ˆì— ìžˆì–´ì„œ ì¶©ëŒì´ " "ì¼ì–´ë‚©ë‹ˆë‹¤." -#: commands/dbcommands.c:512 commands/dbcommands.c:1066 +#: commands/dbcommands.c:1356 commands/dbcommands.c:1912 #, c-format msgid "database \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ë°ì´í„°ë² ì´ìŠ¤ëŠ” ì´ë¯¸ 있ìŒ" -#: commands/dbcommands.c:526 +#: commands/dbcommands.c:1370 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "\"%s\" ì›ë³¸ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 다른 사용ìžê°€ 액세스하기 시작했습니다" -#: commands/dbcommands.c:769 commands/dbcommands.c:784 +#: commands/dbcommands.c:1392 +#, c-format +msgid "database OID %u is already in use by database \"%s\"" +msgstr "%u OID ë°ì´í„°ë² ì´ìŠ¤ëŠ” ì´ë¯¸ \"%s\" ë°ì´í„°ë² ì´ìŠ¤ê°€ ì“°ê³  있ìŒ" + +#: commands/dbcommands.c:1398 +#, c-format +msgid "data directory with the specified OID %u already exists" +msgstr "%u OIDì— í•´ë‹¹í•˜ëŠ” ë°ì´í„° 디렉터리가 ì´ë¯¸ 있습니다." + +#: commands/dbcommands.c:1571 commands/dbcommands.c:1586 +#: utils/adt/pg_locale.c:2588 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "\"%s\" ì¸ì½”ë”©ì€ \"%s\" 로케ì¼ê³¼ ì¼ì¹˜í•˜ì§€ 않ìŒ" -#: commands/dbcommands.c:772 +#: commands/dbcommands.c:1574 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "ì„ íƒí•œ LC_CTYPE 설정ì—는 \"%s\" ì¸ì½”ë”©ì´ í•„ìš”í•©ë‹ˆë‹¤." -#: commands/dbcommands.c:787 +#: commands/dbcommands.c:1589 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "ì„ íƒí•œ LC_COLLATE 설정ì—는 \"%s\" ì¸ì½”ë”©ì´ í•„ìš”í•©ë‹ˆë‹¤." -#: commands/dbcommands.c:848 +#: commands/dbcommands.c:1672 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ ì—†ìŒ, 건너 뜀" -#: commands/dbcommands.c:872 +#: commands/dbcommands.c:1696 #, c-format msgid "cannot drop a template database" msgstr "템플릿 ë°ì´í„°ë² ì´ìŠ¤ëŠ” 삭제할 수 없습니다" -#: commands/dbcommands.c:878 +#: commands/dbcommands.c:1702 #, c-format msgid "cannot drop the currently open database" msgstr "현재 ì—´ë ¤ 있는 ë°ì´í„°ë² ì´ìŠ¤ëŠ” 삭제할 수 없습니다" -#: commands/dbcommands.c:891 +#: commands/dbcommands.c:1715 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ëŠ” 논리 복제 ìŠ¬ë¡¯ì´ í™œì„±í™” ë˜ì–´ 있습니다" -#: commands/dbcommands.c:893 +#: commands/dbcommands.c:1717 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." msgstr[0] "%d ê°œì˜ í™œì„± ìŠ¬ë¡¯ì´ ìžˆìŠµë‹ˆë‹¤." -#: commands/dbcommands.c:907 +#: commands/dbcommands.c:1731 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ê°€ 논리 복제 구ë…으로 사용ë˜ì—ˆìŒ" -#: commands/dbcommands.c:909 +#: commands/dbcommands.c:1733 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." msgstr[0] "%d ê°œì˜ êµ¬ë…ì´ ìžˆìŠµë‹ˆë‹¤." -#: commands/dbcommands.c:930 commands/dbcommands.c:1088 -#: commands/dbcommands.c:1218 +#: commands/dbcommands.c:1754 commands/dbcommands.c:1934 +#: commands/dbcommands.c:2063 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 다른 사용ìžê°€ 액세스하기 시작했습니다" -#: commands/dbcommands.c:1048 +#: commands/dbcommands.c:1894 #, c-format msgid "permission denied to rename database" msgstr "ë°ì´í„°ë² ì´ìФ ì´ë¦„ì„ ë°”ê¿€ ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/dbcommands.c:1077 +#: commands/dbcommands.c:1923 #, c-format msgid "current database cannot be renamed" msgstr "현재 ë°ì´í„°ë² ì´ìŠ¤ì˜ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ" -#: commands/dbcommands.c:1174 +#: commands/dbcommands.c:2019 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "현재 ì—´ë ¤ 있는 ë°ì´í„°ë² ì´ìŠ¤ì˜ í…Œì´ë¸”스페ì´ìŠ¤ë¥¼ 바꿀 수 ì—†ìŒ" -#: commands/dbcommands.c:1277 +#: commands/dbcommands.c:2125 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "" "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ì˜ ì¼ë¶€ 릴레ì´ì…˜ë“¤ì´ \"%s\" í…Œì´ë¸”스페ì´ìŠ¤ì— ì´ë¯¸ 있ìŒ" -#: commands/dbcommands.c:1279 +#: commands/dbcommands.c:2127 #, c-format msgid "" "You must move them back to the database's default tablespace before using " @@ -7180,35 +8599,39 @@ msgstr "" "ì´ ëª…ë ¹ì„ ì‚¬ìš©í•˜ê¸° ì „ì— ë°ì´í„°ë² ì´ìŠ¤ì˜ ê¸°ë³¸ í…Œì´ë¸”스페ì´ìŠ¤ë¡œ 다시 ì´ë™í•´ì•¼ í•©" "니다." -#: commands/dbcommands.c:1404 commands/dbcommands.c:1980 -#: commands/dbcommands.c:2203 commands/dbcommands.c:2261 -#: commands/tablespace.c:619 +#: commands/dbcommands.c:2256 commands/dbcommands.c:2999 +#: commands/dbcommands.c:3299 commands/dbcommands.c:3412 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "" "불필요한 ì¼ë¶€ 파ì¼ì´ ì´ì „ ë°ì´í„°ë² ì´ìФ 디렉터리 \"%s\"ì— ë‚¨ì•„ ìžˆì„ ìˆ˜ 있ìŒ" -#: commands/dbcommands.c:1460 +#: commands/dbcommands.c:2317 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "알 수 없는 DROP DATABASE 옵션: \"%s\"" -#: commands/dbcommands.c:1550 +#: commands/dbcommands.c:2395 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "\"%s\" ì˜µì…˜ì€ ë‹¤ë¥¸ 옵션들과 함께 사용할 수 없습니다." -#: commands/dbcommands.c:1606 +#: commands/dbcommands.c:2443 +#, c-format +msgid "cannot alter invalid database \"%s\"" +msgstr "ìž˜ëª»ëœ \"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— ëŒ€í•´ 변경 ìž‘ì—…ì„ í•  수 ì—†ìŒ" + +#: commands/dbcommands.c:2460 #, c-format msgid "cannot disallow connections for current database" msgstr "현재 ë°ì´í„°ë² ì´ìФ ì—°ê²°ì„ í—ˆìš©í•˜ì§€ 않습니다." -#: commands/dbcommands.c:1742 +#: commands/dbcommands.c:2690 #, c-format msgid "permission denied to change owner of database" msgstr "ë°ì´í„°ë² ì´ìФ 소유주를 바꿀 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/dbcommands.c:2086 +#: commands/dbcommands.c:3105 #, c-format msgid "" "There are %d other session(s) and %d prepared transaction(s) using the " @@ -7216,438 +8639,501 @@ msgid "" msgstr "" "ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 사용하는 %dê°œì˜ ë‹¤ë¥¸ 세션과 %dê°œì˜ ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì´ ìžˆìŠµë‹ˆë‹¤." -#: commands/dbcommands.c:2089 +#: commands/dbcommands.c:3108 #, c-format msgid "There is %d other session using the database." msgid_plural "There are %d other sessions using the database." msgstr[0] "ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 사용하는 %dê°œì˜ ë‹¤ë¥¸ ì„¸ì…˜ì´ ìžˆìŠµë‹ˆë‹¤." -#: commands/dbcommands.c:2094 storage/ipc/procarray.c:3016 +#: commands/dbcommands.c:3113 storage/ipc/procarray.c:3859 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." msgstr[0] "ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 사용하는 %dê°œì˜ ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì´ ìžˆìŠµë‹ˆë‹¤." -#: commands/define.c:54 commands/define.c:228 commands/define.c:260 -#: commands/define.c:288 commands/define.c:334 +#: commands/dbcommands.c:3255 +#, c-format +msgid "missing directory \"%s\"" +msgstr "\"%s\" 디렉터리가 빠졌ìŒ" + +#: commands/dbcommands.c:3313 commands/tablespace.c:184 +#: commands/tablespace.c:633 +#, c-format +msgid "could not stat directory \"%s\": %m" +msgstr "\"%s\" 디렉터리 ìƒíƒœë¥¼ 파악할 수 ì—†ìŒ: %m" + +#: commands/define.c:53 commands/define.c:257 commands/define.c:289 +#: commands/define.c:317 commands/define.c:363 #, c-format msgid "%s requires a parameter" msgstr "%s 매개 변수를 필요로 함" -#: commands/define.c:90 commands/define.c:101 commands/define.c:195 -#: commands/define.c:213 +#: commands/define.c:86 commands/define.c:97 commands/define.c:191 +#: commands/define.c:209 commands/define.c:224 commands/define.c:242 #, c-format msgid "%s requires a numeric value" msgstr "%s 숫ìžê°’ì„ í•„ìš”ë¡œ 함" -#: commands/define.c:157 +#: commands/define.c:153 #, c-format msgid "%s requires a Boolean value" -msgstr "%s ê°’ì€ boolean ê°’ì´ì–´ì•¼í•©ë‹ˆë‹¤." +msgstr "%s ê°’ì€ ë¶ˆë¦¬ì–¸ ê°’ì´ì–´ì•¼ 합니다." -#: commands/define.c:171 commands/define.c:180 commands/define.c:297 +#: commands/define.c:167 commands/define.c:176 commands/define.c:326 #, c-format msgid "%s requires an integer value" msgstr "%s í•˜ë‚˜ì˜ ì •ìˆ˜ê°’ì´ í•„ìš”í•¨" -#: commands/define.c:242 +#: commands/define.c:271 #, c-format msgid "argument of %s must be a name" msgstr "%sì˜ ì¸ìžëŠ” ì´ë¦„ì´ì–´ì•¼ 합니다" -#: commands/define.c:272 +#: commands/define.c:301 #, c-format msgid "argument of %s must be a type name" -msgstr "%sì˜ ì¸ìžëŠ” ìžë£Œí˜• ì´ë¦„ì´ì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "%sì˜ ì¸ìžëŠ” ìžë£Œí˜• ì´ë¦„ì´ì–´ì•¼ 합니다" -#: commands/define.c:318 +#: commands/define.c:347 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "%sì˜ ìž˜ëª»ëœ ì¸ìž: \"%s\"" -#: commands/dropcmds.c:100 commands/functioncmds.c:1274 -#: utils/adt/ruleutils.c:2633 +#: commands/dropcmds.c:96 commands/functioncmds.c:1382 +#: utils/adt/ruleutils.c:2910 #, c-format msgid "\"%s\" is an aggregate function" msgstr "\"%s\" 함수는 집계 함수입니다" -#: commands/dropcmds.c:102 +#: commands/dropcmds.c:98 #, c-format msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "집계 함수는 DROP AGGREGATE 명령으로 삭제할 수 있습니다" -#: commands/dropcmds.c:158 commands/sequence.c:447 commands/tablecmds.c:3266 -#: commands/tablecmds.c:3424 commands/tablecmds.c:3469 -#: commands/tablecmds.c:15038 tcop/utility.c:1309 +#: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:3892 +#: commands/tablecmds.c:4050 commands/tablecmds.c:4102 +#: commands/tablecmds.c:17161 tcop/utility.c:1325 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "\"%s\" 릴레ì´ì…˜ ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1199 +#: commands/dropcmds.c:183 commands/dropcmds.c:282 commands/tablecmds.c:1409 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "\"%s\" 스키마(schema) ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:259 +#: commands/dropcmds.c:223 commands/dropcmds.c:262 commands/tablecmds.c:286 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "\"%s\" ìžë£Œí˜• ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:257 +#: commands/dropcmds.c:252 #, c-format msgid "access method \"%s\" does not exist, skipping" msgstr "\"%s\" ì¸ë±ìФ ì ‘ê·¼ 방법 ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:275 +#: commands/dropcmds.c:270 #, c-format msgid "collation \"%s\" does not exist, skipping" msgstr "\"%s\" 정렬규칙 ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:282 +#: commands/dropcmds.c:277 #, c-format msgid "conversion \"%s\" does not exist, skipping" msgstr "\"%s\" 문ìžì½”드변환규칙(conversion) ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:293 commands/statscmds.c:479 +#: commands/dropcmds.c:288 commands/statscmds.c:664 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "\"%s\" 통계정보 개체 ì—†ìŒ, 무시함" -#: commands/dropcmds.c:300 +#: commands/dropcmds.c:295 #, c-format msgid "text search parser \"%s\" does not exist, skipping" msgstr "\"%s\" 전문 검색 파서가 ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:307 +#: commands/dropcmds.c:302 #, c-format msgid "text search dictionary \"%s\" does not exist, skipping" msgstr "\"%s\" 전문 검색 ì‚¬ì „ì´ ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:314 +#: commands/dropcmds.c:309 #, c-format msgid "text search template \"%s\" does not exist, skipping" msgstr "\"%s\" 전문 검색 í…œí”Œë¦¿ì´ ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:321 +#: commands/dropcmds.c:316 #, c-format msgid "text search configuration \"%s\" does not exist, skipping" msgstr "\"%s\" 전문 검색 êµ¬ì„±ì´ ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:326 +#: commands/dropcmds.c:321 #, c-format msgid "extension \"%s\" does not exist, skipping" msgstr "\"%s\" 확장 모듈 ì—†ìŒ, 건너 뜀" -#: commands/dropcmds.c:336 +#: commands/dropcmds.c:331 #, c-format msgid "function %s(%s) does not exist, skipping" msgstr "%s(%s) 함수가 ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:349 +#: commands/dropcmds.c:344 #, c-format msgid "procedure %s(%s) does not exist, skipping" msgstr "%s(%s) 프로시져 ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:362 +#: commands/dropcmds.c:357 #, c-format msgid "routine %s(%s) does not exist, skipping" msgstr "%s(%s) 루틴 ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:375 +#: commands/dropcmds.c:370 #, c-format msgid "aggregate %s(%s) does not exist, skipping" msgstr "%s(%s) 집계 함수 ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:388 +#: commands/dropcmds.c:383 #, c-format msgid "operator %s does not exist, skipping" msgstr "%s ì—°ì‚°ìžê°€ ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:394 +#: commands/dropcmds.c:389 #, c-format msgid "language \"%s\" does not exist, skipping" msgstr "\"%s\" 프로시주얼 언어 ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:403 +#: commands/dropcmds.c:398 #, c-format msgid "cast from type %s to type %s does not exist, skipping" msgstr "%s 형ì—서 %s 형으로 바꾸는 형변환 규칙(cast)ì´ ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:412 +#: commands/dropcmds.c:407 #, c-format msgid "transform for type %s language \"%s\" does not exist, skipping" msgstr "%s í˜•ë³€í™˜ìž (사용언어 \"%s\") ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:420 +#: commands/dropcmds.c:415 #, c-format msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" msgstr " \"%s\" 트리거가 \"%s\" 릴레ì´ì…˜ì— ì§€ì •ëœ ê²ƒì´ ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:429 +#: commands/dropcmds.c:424 #, c-format msgid "policy \"%s\" for relation \"%s\" does not exist, skipping" msgstr " \"%s\" ì •ì±…ì´ \"%s\" 릴레ì´ì…˜ì— ì§€ì •ëœ ê²ƒì´ ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:436 +#: commands/dropcmds.c:431 #, c-format msgid "event trigger \"%s\" does not exist, skipping" msgstr "\"%s\" ì´ë²¤íЏ 트리거 ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:442 +#: commands/dropcmds.c:437 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist, skipping" msgstr " \"%s\" 룰(rule)ì´ \"%s\" 릴레ì´ì…˜ì— ì§€ì •ëœ ê²ƒì´ ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:449 +#: commands/dropcmds.c:444 #, c-format msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "\"%s\" 외부 ìžë£Œ 래í¼ê°€ ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1399 +#: commands/dropcmds.c:448 commands/foreigncmds.c:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "\"%s\" 서버가 ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:462 +#: commands/dropcmds.c:457 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\", skipping" msgstr "" "\"%s\" ì—°ì‚°ìž í´ëž˜ìŠ¤ëŠ” \"%s\" ì¸ë±ìФ ì ‘ê·¼ 방법ì—서 사용할 수 ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:474 +#: commands/dropcmds.c:469 #, c-format msgid "" "operator family \"%s\" does not exist for access method \"%s\", skipping" msgstr "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(\"%s\" ì ‘ê·¼ 방법)ê°€ ì—†ìŒ, 건너뜀" -#: commands/dropcmds.c:481 +#: commands/dropcmds.c:476 #, c-format msgid "publication \"%s\" does not exist, skipping" msgstr "\"%s\" 발행 ì—†ìŒ, 건너뜀" -#: commands/event_trigger.c:125 +#: commands/event_trigger.c:137 #, c-format msgid "permission denied to create event trigger \"%s\"" msgstr "\"%s\" ì´ë²¤íЏ 트리거를 만들 ê¶Œí•œì´ ì—†ìŒ" -#: commands/event_trigger.c:127 +#: commands/event_trigger.c:139 #, c-format msgid "Must be superuser to create an event trigger." msgstr "슈í¼ìœ ì €ë§Œ ì´ë²¤íЏ 트리거를 만들 수 있습니다." -#: commands/event_trigger.c:136 +#: commands/event_trigger.c:149 #, c-format msgid "unrecognized event name \"%s\"" msgstr "알 수 없는 ì´ë²¤íЏ ì´ë¦„: \"%s\"" -#: commands/event_trigger.c:153 +#: commands/event_trigger.c:166 #, c-format msgid "unrecognized filter variable \"%s\"" msgstr "알 수 없는 í•„í„° 변수: \"%s\"" -#: commands/event_trigger.c:207 +#: commands/event_trigger.c:181 +#, c-format +msgid "tag filtering is not supported for login event triggers" +msgstr "태그 í•„í„°ë§ì€ ë¡œê·¸ì¸ ì´ë²¤íЏ 트리거용으로 쓸 수 ì—†ìŒ" + +#: commands/event_trigger.c:224 #, c-format msgid "filter value \"%s\" not recognized for filter variable \"%s\"" msgstr "\"%s\" í•„í„°ê°’ì€ \"%s\" í•„í„° 변수으로 쓸 수 ì—†ìŒ" #. translator: %s represents an SQL statement name -#: commands/event_trigger.c:213 commands/event_trigger.c:235 +#: commands/event_trigger.c:230 commands/event_trigger.c:252 #, c-format msgid "event triggers are not supported for %s" msgstr "%s ìš© ì´ë²¤íЏ 트리거는 ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/event_trigger.c:248 +#: commands/event_trigger.c:265 #, c-format msgid "filter variable \"%s\" specified more than once" msgstr "\"%s\" í•„í„° 변수가 한 번 ì´ìƒ 사용ë˜ì—ˆìŠµë‹ˆë‹¤." -#: commands/event_trigger.c:399 commands/event_trigger.c:443 -#: commands/event_trigger.c:537 +#: commands/event_trigger.c:438 commands/event_trigger.c:490 +#: commands/event_trigger.c:584 #, c-format msgid "event trigger \"%s\" does not exist" msgstr "\"%s\" ì´ë²¤íЏ 트리거 ì—†ìŒ" -#: commands/event_trigger.c:505 +#: commands/event_trigger.c:522 +#, c-format +msgid "event trigger with OID %u does not exist" +msgstr "OID %u ì´ë²¤íЏ 트리거가 ì—†ìŒ" + +#: commands/event_trigger.c:552 #, c-format msgid "permission denied to change owner of event trigger \"%s\"" msgstr "\"%s\" ì´ë²¤íЏ 트리거 소유주를 변경할 ê¶Œí•œì´ ì—†ìŒ" -#: commands/event_trigger.c:507 +#: commands/event_trigger.c:554 #, c-format msgid "The owner of an event trigger must be a superuser." msgstr "ì´ë²¤íЏ 트리거 소유주는 슈í¼ìœ ì €ì—¬ì•¼ 합니다." -#: commands/event_trigger.c:1325 +#: commands/event_trigger.c:1409 #, c-format msgid "%s can only be called in a sql_drop event trigger function" msgstr "%s 개체는 sql_drop ì´ë²¤íЏ 트리거 함수 안ì—서만 호출 ë˜ì–´ì•¼ 합니다." -#: commands/event_trigger.c:1445 commands/event_trigger.c:1466 +#: commands/event_trigger.c:1502 commands/event_trigger.c:1523 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" msgstr "" "%s 개체는 table_rewrite ì´ë²¤íЏ 트리거 함수 안ì—서만 호출 ë˜ì–´ì•¼ 합니다." -#: commands/event_trigger.c:1883 +#: commands/event_trigger.c:1936 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s 개체는 ì´ë²¤íЏ 트리거 함수 안ì—서만 호출 ë˜ì–´ì•¼ 합니다." -#: commands/explain.c:213 +#: commands/explain.c:241 commands/explain.c:266 #, c-format msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" msgstr "\"%s\" EXPLAIN 옵션ì—서 쓸 수 없는 ê°’: \"%s\"" -#: commands/explain.c:220 +#: commands/explain.c:273 #, c-format msgid "unrecognized EXPLAIN option \"%s\"" msgstr "ìž˜ëª»ëœ EXPLAIN 옵션: \"%s\"" -#: commands/explain.c:228 +#: commands/explain.c:282 #, c-format msgid "EXPLAIN option WAL requires ANALYZE" msgstr "WAL ì˜µì…˜ì€ EXPLAIN ANALYZEì—서만 쓸 수 있습니다." -#: commands/explain.c:237 +#: commands/explain.c:291 #, c-format msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "TIMING ì˜µì…˜ì€ EXPLAIN ANALYZEì—서만 쓸 수 있습니다." -#: commands/extension.c:173 commands/extension.c:3013 +#: commands/explain.c:297 +#, c-format +msgid "EXPLAIN option SERIALIZE requires ANALYZE" +msgstr "SERIALIZE ì˜µì…˜ì€ EXPLAIN ANALYZEì—서만 쓸 수 있습니다." + +#: commands/explain.c:303 +#, c-format +msgid "EXPLAIN options ANALYZE and GENERIC_PLAN cannot be used together" +msgstr "" +"EXPLAIN 옵션으로 ANALYZE 옵션과 GENERIC_PLAN ì˜µì…˜ì„ í•¨ê»˜ 사용할 수 없습니다." + +#: commands/extension.c:178 commands/extension.c:3031 #, c-format msgid "extension \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ í™•ìž¥ ëª¨ë“ˆì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/extension.c:272 commands/extension.c:281 commands/extension.c:293 -#: commands/extension.c:303 +#: commands/extension.c:277 commands/extension.c:286 commands/extension.c:298 +#: commands/extension.c:308 #, c-format msgid "invalid extension name: \"%s\"" msgstr "ìž˜ëª»ëœ í™•ìž¥ 모듈 ì´ë¦„: \"%s\"" -#: commands/extension.c:273 +#: commands/extension.c:278 #, c-format msgid "Extension names must not be empty." msgstr "확장 모듈 ì´ë¦„ì„ ì§€ì •í•˜ì„¸ìš”." -#: commands/extension.c:282 +#: commands/extension.c:287 #, c-format msgid "Extension names must not contain \"--\"." msgstr "확장 모듈 ì´ë¦„ì— \"--\" 문ìžê°€ í¬í•¨ë  수 없습니다." -#: commands/extension.c:294 +#: commands/extension.c:299 #, c-format msgid "Extension names must not begin or end with \"-\"." msgstr "확장 모듈 ì´ë¦„ì˜ ì‹œìž‘ê³¼ ëì—는 \"-\" 문ìžë¥¼ 사용할 수 없습니다." -#: commands/extension.c:304 +#: commands/extension.c:309 #, c-format msgid "Extension names must not contain directory separator characters." msgstr "확장 모듈 ì´ë¦„ì—는 디렉터리 구분 문ìžë¥¼ 사용할 수 없습니다." -#: commands/extension.c:319 commands/extension.c:328 commands/extension.c:337 -#: commands/extension.c:347 +#: commands/extension.c:324 commands/extension.c:333 commands/extension.c:342 +#: commands/extension.c:352 #, c-format msgid "invalid extension version name: \"%s\"" msgstr "ìž˜ëª»ëœ í™•ìž¥ 모듈 버전 ì´ë¦„: \"%s\"" -#: commands/extension.c:320 +#: commands/extension.c:325 #, c-format msgid "Version names must not be empty." msgstr "버전 ì´ë¦„ì€ ë¹„ì–´ìžˆìœ¼ë©´ 안ë©ë‹ˆë‹¤" -#: commands/extension.c:329 +#: commands/extension.c:334 #, c-format msgid "Version names must not contain \"--\"." msgstr "버전 ì´ë¦„ì— \"--\" 문ìžê°€ í¬í•¨ë  수 없습니다." -#: commands/extension.c:338 +#: commands/extension.c:343 #, c-format msgid "Version names must not begin or end with \"-\"." msgstr "버전 ì´ë¦„ì˜ ì•ž ë’¤ì— \"-\" 문ìžë¥¼ 쓸 수 없습니다." -#: commands/extension.c:348 +#: commands/extension.c:353 #, c-format msgid "Version names must not contain directory separator characters." msgstr "버전 ì´ë¦„ì—는 디렉터리 분리 문ìžë¥¼ 쓸 수 없습니다." -#: commands/extension.c:498 +#: commands/extension.c:507 +#, c-format +msgid "extension \"%s\" is not available" +msgstr "\"%s\" ì´ë¦„ì˜ í™•ìž¥ ëª¨ë“ˆì„ ì‚¬ìš©í•  수 없습니다" + +#: commands/extension.c:508 +#, c-format +msgid "Could not open extension control file \"%s\": %m." +msgstr "\"%s\" 확장 모듈 제어 íŒŒì¼ ì—´ê¸° 실패: %m." + +#: commands/extension.c:510 +#, c-format +msgid "" +"The extension must first be installed on the system where PostgreSQL is " +"running." +msgstr "해당 확장 ëª¨ë“ˆì€ PostgreSQL 시작 ì „ì— ë¨¼ì € 설치 ë˜ì–´ 있어야합니다." + +#: commands/extension.c:514 #, c-format msgid "could not open extension control file \"%s\": %m" msgstr "\"%s\" 확장 모듈 제어 íŒŒì¼ ì—´ê¸° 실패: %m" -#: commands/extension.c:520 commands/extension.c:530 +#: commands/extension.c:537 commands/extension.c:547 #, c-format msgid "parameter \"%s\" cannot be set in a secondary extension control file" msgstr "\"%s\" 매개 변수는 ì´ì°¨ 확장 모듈 제어 파ì¼ì—서는 사용할 수 없습니다." -#: commands/extension.c:552 commands/extension.c:560 commands/extension.c:568 -#: utils/misc/guc.c:6749 +#: commands/extension.c:569 commands/extension.c:577 commands/extension.c:585 +#: utils/misc/guc.c:3147 #, c-format msgid "parameter \"%s\" requires a Boolean value" -msgstr "\"%s\" 매개 ë³€ìˆ˜ì˜ ê°’ì€ boolean ê°’ì´ì–´ì•¼í•©ë‹ˆë‹¤." +msgstr "\"%s\" 매개 ë³€ìˆ˜ì˜ ê°’ì€ ë¶ˆë¦¬ì–¸ ê°’ì´ì–´ì•¼ 합니다." -#: commands/extension.c:577 +#: commands/extension.c:594 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" ì´ë¦„ì€ ìž˜ëª»ëœ ì¸ì½”딩 ì´ë¦„ìž„" -#: commands/extension.c:591 +#: commands/extension.c:608 commands/extension.c:623 #, c-format msgid "parameter \"%s\" must be a list of extension names" msgstr "\"%s\" 매개 변수는 확장 모듈 ì´ë¦„ 목ë¡ì´ì–´ì•¼ 함" -#: commands/extension.c:598 +#: commands/extension.c:630 #, c-format msgid "unrecognized parameter \"%s\" in file \"%s\"" msgstr "알 수 없는 \"%s\" 매개 변수가 \"%s\" íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤." -#: commands/extension.c:607 +#: commands/extension.c:639 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "" "\"relocatable\" ê°’ì´ true ì¸ ê²½ìš° \"schema\" 매개 변수는 사용할 수 없습니다." -#: commands/extension.c:785 +#: commands/extension.c:817 #, c-format msgid "" "transaction control statements are not allowed within an extension script" msgstr "확장 모듈 스í¬ë¦½íЏ 안ì—서는 트랜잭션 제어 êµ¬ë¬¸ì€ ì‚¬ìš©í•  수 없습니다." -#: commands/extension.c:861 +#: commands/extension.c:897 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "\"%s\" 확장 ëª¨ë“ˆì„ ë§Œë“¤ ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/extension.c:864 +#: commands/extension.c:900 #, c-format msgid "" "Must have CREATE privilege on current database to create this extension." msgstr "" -"ì´ í™•ìž¥ ëª¨ë“ˆì„ ì„¤ì¹˜í•˜ë ¤ë©´ 현재 ë°ì´í„°ë² ì´ìŠ¤ì— ëŒ€í•´ì„œ CREATE ê¶Œí•œì´ ìžˆì–´ì•¼í•©ë‹ˆë‹¤." +"ì´ í™•ìž¥ ëª¨ë“ˆì„ ì„¤ì¹˜í•˜ë ¤ë©´ 현재 ë°ì´í„°ë² ì´ìŠ¤ì— ëŒ€í•´ì„œ CREATE ê¶Œí•œì´ ìžˆì–´ì•¼ í•©" +"니다." -#: commands/extension.c:865 +#: commands/extension.c:901 #, c-format msgid "Must be superuser to create this extension." msgstr "확장 ëª¨ë“ˆì€ ìŠˆí¼ìœ ì €ë§Œ 만들 수 있습니다." -#: commands/extension.c:869 +#: commands/extension.c:905 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "\"%s\" 확장 ëª¨ë“ˆì„ ì—…ë°ì´íŠ¸í•  ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤." -#: commands/extension.c:872 +#: commands/extension.c:908 #, c-format msgid "" "Must have CREATE privilege on current database to update this extension." msgstr "" -"ì´ í™•ìž¥ ëª¨ë“ˆì„ ì—…ë°ì´íЏ 하려면 현재 ë°ì´í„°ë² ì´ìŠ¤ì— ëŒ€í•´ì„œ CREATE ê¶Œí•œì´ ìžˆì–´ì•¼í•©ë‹ˆë‹¤." +"ì´ í™•ìž¥ ëª¨ë“ˆì„ ì—…ë°ì´íЏ 하려면 현재 ë°ì´í„°ë² ì´ìŠ¤ì— ëŒ€í•´ì„œ CREATE ê¶Œí•œì´ ìžˆì–´" +"야 합니다." -#: commands/extension.c:873 +#: commands/extension.c:909 #, c-format msgid "Must be superuser to update this extension." msgstr "슈í¼ìœ ì €ë§Œ 해당 ëª¨ë“ˆì„ ì—…ë°ì´íЏ í•  수 있습니다." -#: commands/extension.c:1200 +#: commands/extension.c:1042 +#, c-format +msgid "invalid character in extension owner: must not contain any of \"%s\"" +msgstr "해당 모듈 소유주 ì´ë¦„ì— ìž˜ëª»ëœ ë¬¸ìž: \"%s\" 문ìžëŠ” 허용하지 않ìŒ" + +#: commands/extension.c:1066 commands/extension.c:1093 +#, c-format +msgid "" +"invalid character in extension \"%s\" schema: must not contain any of \"%s\"" +msgstr "" +"확장 모듈 \"%s\" 스키마 ì´ë¦„ì— ìž˜ëª»ëœ ë¬¸ìž: \"%s\" 문ìžëŠ” 허용하지 않ìŒ" + +#: commands/extension.c:1288 #, c-format msgid "" "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" @@ -7655,111 +9141,129 @@ msgstr "" "\"%s\" 확장 ëª¨ë“ˆì„ \"%s\" 버전ì—서 \"%s\" 버전으로 ì—…ë°ì´íŠ¸í•  ë°©ë²•ì´ ì—†ìŠµë‹ˆ" "다." -#: commands/extension.c:1408 commands/extension.c:3074 +#: commands/extension.c:1496 commands/extension.c:3089 #, c-format msgid "version to install must be specified" msgstr "설치할 ë²„ì „ì„ ì§€ì •í•´ì•¼ 합니다." -#: commands/extension.c:1445 +#: commands/extension.c:1533 #, c-format msgid "" -"extension \"%s\" has no installation script nor update path for version \"%s" -"\"" +"extension \"%s\" has no installation script nor update path for version " +"\"%s\"" msgstr "" "\"%s\" 확장 모듈ì—는 \"%s\" 버전용 설치나 ì—…ë°ì´íЏ 스í¬ë¦½íŠ¸ê°€ 없습니다." -#: commands/extension.c:1479 +#: commands/extension.c:1567 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "\"%s\" 확장 ëª¨ë“ˆì€ \"%s\" 스키마 ì•ˆì— ì„¤ì¹˜ë˜ì–´ì•¼ 합니다." -#: commands/extension.c:1639 +#: commands/extension.c:1727 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "\"%s\" 확장 모듈과 \"%s\" 확장 ëª¨ë“ˆì´ ì„œë¡œ ì˜ì¡´ 관계입니다" -#: commands/extension.c:1644 +#: commands/extension.c:1732 #, c-format msgid "installing required extension \"%s\"" msgstr "\"%s\" 확장 ëª¨ë“ˆì´ í•„ìš”í•´ì„œ 실치 하는 중" -#: commands/extension.c:1667 +#: commands/extension.c:1755 #, c-format msgid "required extension \"%s\" is not installed" msgstr "\"%s\" 확장 ëª¨ë“ˆì´ í•„ìš”í•œë°, 설치ë˜ì–´ 있지 않습니다." -#: commands/extension.c:1670 +#: commands/extension.c:1758 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "" "필요한 ëª¨ë“ˆì„ í•¨ê»˜ 설치하려면, CREATE EXTENSION ... CASCADE êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ì„¸" "ìš”." -#: commands/extension.c:1705 +#: commands/extension.c:1793 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "\"%s\" 확장 ëª¨ë“ˆì´ ì´ë¯¸ 있ìŒ, 건너뜀" -#: commands/extension.c:1712 +#: commands/extension.c:1800 #, c-format msgid "extension \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ í™•ìž¥ ëª¨ë“ˆì´ ì´ë¯¸ 있습니다" -#: commands/extension.c:1723 +#: commands/extension.c:1811 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "ì¤‘ì²©ëœ CREATE EXTENSION êµ¬ë¬¸ì€ ì§€ì›í•˜ì§€ 않습니다." -#: commands/extension.c:1896 +#: commands/extension.c:1975 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "%s ì˜ì¡´ê°œì²´ë“¤ì€ 시스템 개체ì´ê¸° ë•Œë¬¸ì— ì‚­ì œ ë  ìˆ˜ 없습니다" -#: commands/extension.c:2457 +#: commands/extension.c:2450 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "" "%s 함수는 CREATE EXTENSION 명령ì—서 ë‚´ë¶€ì ìœ¼ë¡œ 사용하는 SQL 스í¬ë¦½íЏ ë‚´ì—서" "ë§Œ 사용할 수 있습니다." -#: commands/extension.c:2469 +#: commands/extension.c:2462 #, c-format msgid "OID %u does not refer to a table" msgstr "%u OID ìžë£Œê°€ í…Œì´ë¸”ì— ì—†ìŠµë‹ˆë‹¤" -#: commands/extension.c:2474 +#: commands/extension.c:2467 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "\"%s\" í…Œì´ë¸”ì€ ë§Œë“¤ë ¤ê³  하는 확장 ëª¨ë“ˆì˜ êµ¬ì„± 요소가 아닙니다." -#: commands/extension.c:2828 +#: commands/extension.c:2813 #, c-format msgid "" "cannot move extension \"%s\" into schema \"%s\" because the extension " "contains the schema" msgstr "\"%s\" 확장 ëª¨ë“ˆì´ \"%s\" ìŠ¤í‚¤ë§ˆì— ì´ë¯¸ 있어 옮길 수 없습니다." -#: commands/extension.c:2869 commands/extension.c:2932 +#: commands/extension.c:2854 commands/extension.c:2948 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "\"%s\" 확장 ëª¨ë“ˆì€ SET SCHEMA êµ¬ë¬¸ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/extension.c:2934 +#: commands/extension.c:2911 +#, c-format +msgid "" +"cannot SET SCHEMA of extension \"%s\" because other extensions prevent it" +msgstr "" +"다른 확장 ëª¨ë“ˆì´ í•´ë‹¹ 스키마를 ì„ ì í•˜ê³  있어, \"%s\" 확장 ëª¨ë“ˆì€ SET SCHEMA " +"ìž‘ì—…ì„ í•  수 ì—†ìŒ." + +#: commands/extension.c:2913 +#, c-format +msgid "Extension \"%s\" requests no relocation of extension \"%s\"." +msgstr "\"%s\" 확장 ëª¨ë“ˆì€ \"%s\" í™•ìž¥ëª¨ë“ˆì˜ ìœ„ì¹˜ ë³€ê²½ì„ ê¸ˆì§€í•©ë‹ˆë‹¤." + +#: commands/extension.c:2950 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "%s 개체가 확장 모듈 ìŠ¤í‚¤ë§ˆì¸ \"%s\" ì•ˆì— ì—†ìŒ" -#: commands/extension.c:2993 +#: commands/extension.c:3011 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "ì¤‘ì²©ëœ ALTER EXTENSION êµ¬ë¬¸ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/extension.c:3085 +#: commands/extension.c:3100 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "\"%s\" ë²„ì „ì˜ \"%s\" 확장 ëª¨ë“ˆì´ ì´ë¯¸ 설치 ë˜ì–´ 있ìŒ" -#: commands/extension.c:3336 +#: commands/extension.c:3311 +#, c-format +msgid "cannot add an object of this type to an extension" +msgstr "해당 확장 ëª¨ë“ˆì— ì´ëŸ° í˜•íƒœì˜ ê°ì²´ëŠ” 추가 í•  수 ì—†ìŒ" + +#: commands/extension.c:3409 #, c-format msgid "" "cannot add schema \"%s\" to extension \"%s\" because the schema contains the " @@ -7768,12 +9272,12 @@ msgstr "" "\"%s\" ìŠ¤í‚¤ë§ˆì— \"%s\" 확장 ëª¨ë“ˆì„ ì¶”ê°€í•  수 ì—†ìŒ, ì´ë¯¸ 해당 스키마 ì•ˆì— í¬" "함ë˜ì–´ 있ìŒ" -#: commands/extension.c:3364 +#: commands/extension.c:3491 commands/typecmds.c:4042 utils/fmgr/funcapi.c:725 #, c-format -msgid "%s is not a member of extension \"%s\"" -msgstr "\"%s\" 개체는 \"%s\" 확장 ëª¨ë“ˆì˜ êµ¬ì„± 요소가 아닙니다" +msgid "could not find multirange type for data type %s" +msgstr "%s ìžë£Œí˜•ìš© multirange í˜•ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: commands/extension.c:3430 +#: commands/extension.c:3532 #, c-format msgid "file \"%s\" is too large" msgstr "\"%s\" 파ì¼ì´ 너무 í½ë‹ˆë‹¤." @@ -7803,32 +9307,42 @@ msgstr "슈í¼ìœ ì €ë§Œ 외부 ìžë£Œ 래í¼ì˜ 소유주를 바꿀 수 있습 msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "외부 ìžë£Œ 래í¼ì˜ 소유주는 슈í¼ìœ ì €ì—¬ì•¼ 합니다." -#: commands/foreigncmds.c:291 commands/foreigncmds.c:711 foreign/foreign.c:701 +#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:691 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "\"%s\" 외부 ìžë£Œ 래í¼ê°€ ì—†ìŒ" -#: commands/foreigncmds.c:584 +#: commands/foreigncmds.c:325 +#, c-format +msgid "foreign-data wrapper with OID %u does not exist" +msgstr "OIDê°€ %uì¸ ì™¸ë¶€ ë°ì´í„° 래í¼ê°€ ì—†ìŒ" + +#: commands/foreigncmds.c:462 +#, c-format +msgid "foreign server with OID %u does not exist" +msgstr "OIDê°€ %uì¸ ì™¸ë¶€ 서버가 ì—†ìŒ" + +#: commands/foreigncmds.c:580 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "\"%s\" 외부 ìžë£Œ 래í¼ë¥¼ 만들 ê¶Œí•œì´ ì—†ìŒ" -#: commands/foreigncmds.c:586 +#: commands/foreigncmds.c:582 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "슈í¼ìœ ì €ë§Œ 외부 ìžë£Œ 래í¼ë¥¼ 만들 수 있습니다." -#: commands/foreigncmds.c:701 +#: commands/foreigncmds.c:697 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "\"%s\" 외부 ìžë£Œ 래í¼ë¥¼ 변경할 ê¶Œí•œì´ ì—†ìŒ" -#: commands/foreigncmds.c:703 +#: commands/foreigncmds.c:699 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." -msgstr "슈í¼ìœ ì €ë§Œ 외부 ìžë£Œ 래í¼ë¥¼ 변경할 수 있습니다." +msgstr "슈í¼ìœ ì €ë§Œ 외부 ìžë£Œ 래í¼ë¥¼ 바꿀 수 있습니다." -#: commands/foreigncmds.c:734 +#: commands/foreigncmds.c:730 #, c-format msgid "" "changing the foreign-data wrapper handler can change behavior of existing " @@ -7837,7 +9351,7 @@ msgstr "" "외부 ìžë£Œ ëž©í¼ í•¸ë“¤ëŸ¬ë¥¼ 바꾸면, ê·¸ê²ƒì„ ì‚¬ìš©í•˜ëŠ” 외부 í…Œì´ë¸”ì˜ ë‚´ìš©ì´ ë°”ë€” 수 " "있습니다." -#: commands/foreigncmds.c:749 +#: commands/foreigncmds.c:745 #, c-format msgid "" "changing the foreign-data wrapper validator can cause the options for " @@ -7846,42 +9360,42 @@ msgstr "" "외부 ìžë£Œ ëž˜í¼ ìœ íš¨ì„± 검사기를 바꾸면 ì¢…ì† ê°œì²´ì— ëŒ€í•œ ì˜µì…˜ì´ ìœ íš¨í•˜ì§€ ì•Šì„ " "수 있ìŒ" -#: commands/foreigncmds.c:895 +#: commands/foreigncmds.c:876 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "\"%s\" ì´ë¦„ì˜ ì™¸ë¶€ 서버가 ì´ë¯¸ 있ìŒ, 건너뜀" -#: commands/foreigncmds.c:1183 +#: commands/foreigncmds.c:1144 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "\"%s\" ì‚¬ìš©ìž ë§¤í•‘ì´ \"%s\" 서버용으로 ì´ë¯¸ 있ìŒ, 건너뜀" -#: commands/foreigncmds.c:1193 +#: commands/foreigncmds.c:1154 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "\"%s\" ì‚¬ìš©ìž ë§¤í•‘ì´ \"%s\" 서버용으로 ì´ë¯¸ 있ìŒ" -#: commands/foreigncmds.c:1293 commands/foreigncmds.c:1413 +#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "\"%s\" ì‚¬ìš©ìž ë§¤í•‘ì´ \"%s\" 서버용으로 ì—†ìŒ" -#: commands/foreigncmds.c:1418 +#: commands/foreigncmds.c:1379 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "\"%s\" ì‚¬ìš©ìž ë§¤í•‘ì´ \"%s\" 서버용으로 ì—†ìŒ, 건너뜀" -#: commands/foreigncmds.c:1569 foreign/foreign.c:389 +#: commands/foreigncmds.c:1507 foreign/foreign.c:404 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "\"%s\" 외부 ìžë£Œ 래í¼ìš© 핸들러가 ì—†ìŒ" -#: commands/foreigncmds.c:1575 +#: commands/foreigncmds.c:1513 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "\"%s\" 외부 ìžë£Œ 래í¼ëŠ” IMPORT FOREIGN SCHEMA êµ¬ë¬¸ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/foreigncmds.c:1678 +#: commands/foreigncmds.c:1615 #, c-format msgid "importing foreign table \"%s\"" msgstr "\"%s\" 외부 í…Œì´ë¸” 가져 오는 중" @@ -7896,197 +9410,219 @@ msgstr "SQL 함수는 shell type %s 리턴할 수 ì—†ìŒ" msgid "return type %s is only a shell" msgstr "_^_ %s 리턴 ìžë£Œí˜•ì€ í•˜ë‚˜ì˜ shellë§Œ 있습니다" -#: commands/functioncmds.c:139 parser/parse_type.c:354 +#: commands/functioncmds.c:138 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "\"%s\" ì…¸ 형ì‹ì— 대해 í˜•ì‹ í•œì •ìžë¥¼ 지정할 수 ì—†ìŒ" -#: commands/functioncmds.c:145 +#: commands/functioncmds.c:144 #, c-format msgid "type \"%s\" is not yet defined" msgstr "\"%s\" ìžë£Œí˜•ì´ ì•„ì§ ì •ì˜ë˜ì§€ 않았ìŒ" -#: commands/functioncmds.c:146 +#: commands/functioncmds.c:145 #, c-format msgid "Creating a shell type definition." msgstr "ì…¸ 타입 ì •ì˜ë¥¼ 만들고 있습니다" -#: commands/functioncmds.c:238 +#: commands/functioncmds.c:244 #, c-format msgid "SQL function cannot accept shell type %s" msgstr "SQL 함수는 ì…¸ 타입 %s 수용할 수 ì—†ìŒ" -#: commands/functioncmds.c:244 +#: commands/functioncmds.c:250 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "집계 함수는 ì…¸ 타입 %s 수용할 수 ì—†ìŒ" -#: commands/functioncmds.c:249 +#: commands/functioncmds.c:255 #, c-format msgid "argument type %s is only a shell" msgstr "%s ì¸ìž ìžë£Œí˜•ì€ ë‹¨ì§€ 셸입니다" -#: commands/functioncmds.c:259 +#: commands/functioncmds.c:265 #, c-format msgid "type %s does not exist" msgstr "%s ìžë£Œí˜• ì—†ìŒ" -#: commands/functioncmds.c:273 +#: commands/functioncmds.c:279 #, c-format msgid "aggregates cannot accept set arguments" msgstr "집계 함수는 세트 ì¸ìžë¥¼ ìž…ë ¥ ì¸ìžë¡œ 쓸 수 ì—†ìŒ" -#: commands/functioncmds.c:277 +#: commands/functioncmds.c:283 #, c-format msgid "procedures cannot accept set arguments" msgstr "프로시져ì—서는 ì§‘í•© ì¸ìžë¥¼ ìž…ë ¥ ì¸ìžë¡œ 쓸 수 ì—†ìŒ" -#: commands/functioncmds.c:281 +#: commands/functioncmds.c:287 #, c-format msgid "functions cannot accept set arguments" msgstr "함수는 세트 ì¸ìžë¥¼ 쓸 수 ì—†ìŒ" -#: commands/functioncmds.c:289 -#, c-format -msgid "procedures cannot have OUT arguments" -msgstr "프로시저는 OUT ì¸ìžë¥¼ 쓸 수 ì—†ìŒ" - -#: commands/functioncmds.c:290 -#, c-format -msgid "INOUT arguments are permitted." -msgstr "INOUT ì¸ìžê°€ 허용ë¨" - -#: commands/functioncmds.c:300 +#: commands/functioncmds.c:297 #, c-format msgid "VARIADIC parameter must be the last input parameter" msgstr "VARIADIC 매개 변수는 마지막 ìž…ë ¥ 매개 변수여야 함" -#: commands/functioncmds.c:331 +#: commands/functioncmds.c:317 +#, c-format +msgid "VARIADIC parameter must be the last parameter" +msgstr "VARIADIC 매개 변수는 마지막 매개 변수여야 함" + +#: commands/functioncmds.c:342 #, c-format msgid "VARIADIC parameter must be an array" msgstr "VARIADIC 매개 변수는 ë°°ì—´ì´ì–´ì•¼ 함" -#: commands/functioncmds.c:371 +#: commands/functioncmds.c:387 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "\"%s\" 매개 변수가 여러 번 사용 ë¨" -#: commands/functioncmds.c:386 +#: commands/functioncmds.c:405 #, c-format msgid "only input parameters can have default values" msgstr "ìž…ë ¥ 매개 변수ì—서만 ê¸°ë³¸ê°’ì„ ì‚¬ìš©í•  수 있ìŒ" -#: commands/functioncmds.c:401 +#: commands/functioncmds.c:420 #, c-format msgid "cannot use table references in parameter default value" msgstr "ìž…ë ¥ 매개 변수 초기값으로 í…Œì´ë¸” ì°¸ì¡°í˜•ì€ ì‚¬ìš©í•  수 ì—†ìŒ" -#: commands/functioncmds.c:425 +#: commands/functioncmds.c:444 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "" "기본 ê°’ì´ ìžˆëŠ” ìž…ë ¥ 매개 변수 ë’¤ì— ì˜¤ëŠ” ìž…ë ¥ 매개 변수ì—ë„ ê¸°ë³¸ ê°’ì´ ìžˆì–´ì•¼ " "함" -#: commands/functioncmds.c:577 commands/functioncmds.c:768 +#: commands/functioncmds.c:454 +#, c-format +msgid "procedure OUT parameters cannot appear after one with a default value" +msgstr "프로시지 OUT 매개 변수는 ê¸°ë³¸ê°’ì´ ìžˆëŠ” 매개 변수 ë’¤ì— ì§€ì •í•˜ë©´ 안ë¨" + +#: commands/functioncmds.c:596 commands/functioncmds.c:775 #, c-format msgid "invalid attribute in procedure definition" msgstr "프로시져 ì •ì˜ì— ìž˜ëª»ëœ ì†ì„±ì´ 있ìŒ" -#: commands/functioncmds.c:673 +#: commands/functioncmds.c:692 #, c-format msgid "support function %s must return type %s" msgstr "%s support 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 함" -#: commands/functioncmds.c:684 +#: commands/functioncmds.c:703 #, c-format msgid "must be superuser to specify a support function" -msgstr "support 함수를 지정하려면 슈í¼ìœ ì ¸ì—¬ì•¼í•©ë‹ˆë‹¤" +msgstr "support 함수를 지정하려면 슈í¼ìœ ì ¸ì—¬ì•¼ 합니다" + +#: commands/functioncmds.c:824 commands/functioncmds.c:1427 +#, c-format +msgid "COST must be positive" +msgstr "COST는 양수여야 함" + +#: commands/functioncmds.c:832 commands/functioncmds.c:1435 +#, c-format +msgid "ROWS must be positive" +msgstr "ROWS는 양수여야 함" -#: commands/functioncmds.c:800 +#: commands/functioncmds.c:861 #, c-format msgid "no function body specified" msgstr "함수 본문(body) ë¶€ë¶„ì´ ë¹ ì¡ŒìŠµë‹ˆë‹¤" -#: commands/functioncmds.c:810 +#: commands/functioncmds.c:866 #, c-format -msgid "no language specified" -msgstr "처리할 프로시주얼 언어를 지정하지 않았습니다" +msgid "duplicate function body specified" +msgstr "함수 본문(body) ë¶€ë¶„ì„ ì¤‘ë³µ 지정했습니다" -#: commands/functioncmds.c:835 commands/functioncmds.c:1319 +#: commands/functioncmds.c:871 #, c-format -msgid "COST must be positive" -msgstr "COST는 양수여야 함" +msgid "inline SQL function body only valid for language SQL" +msgstr "í•¨ìˆ˜ì˜ language ê°’ì´ SQLì¼ ë•Œë§Œ ì¸ë¼ì¸ SQL 함수 ë³¸ë¬¸ì„ ì“¸ 수 있ìŒ" -#: commands/functioncmds.c:843 commands/functioncmds.c:1327 +#: commands/functioncmds.c:913 #, c-format -msgid "ROWS must be positive" -msgstr "ROWS는 양수여야 함" +msgid "" +"SQL function with unquoted function body cannot have polymorphic arguments" +msgstr "" +"따옴표 없는 함수 ë³¸ë¬¸ì„ ì‚¬ìš©í•˜ëŠ” SQL 함수는 다형 ìžë£Œí˜• ì¸ìžë¥¼ 쓸 수 ì—†ìŒ" + +#: commands/functioncmds.c:939 commands/functioncmds.c:958 +#, c-format +msgid "%s is not yet supported in unquoted SQL function body" +msgstr "%s êµ¬ë¬¸ì€ ë”°ì˜´í‘œ 없는 SQL 함수 본문 안ì—서 ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/functioncmds.c:897 +#: commands/functioncmds.c:986 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "\"%s\" 언어ì—는 í•˜ë‚˜ì˜ AS 항목만 필요함" -#: commands/functioncmds.c:995 commands/functioncmds.c:2048 -#: commands/proclang.c:259 +#: commands/functioncmds.c:1091 +#, c-format +msgid "no language specified" +msgstr "처리할 프로시주얼 언어를 지정하지 않았습니다" + +#: commands/functioncmds.c:1099 commands/functioncmds.c:2117 +#: commands/proclang.c:235 #, c-format msgid "language \"%s\" does not exist" msgstr "\"%s\" 프로시주얼 언어 ì—†ìŒ" -#: commands/functioncmds.c:997 commands/functioncmds.c:2050 +#: commands/functioncmds.c:1101 commands/functioncmds.c:2119 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "" "ë°ì´í„°ë² ì´ìФ ë‚´ì—서 프로시주얼 언어를 사용하려면 먼저 CREATE EXTENSION 명령으" "로 사용할 언어를 등ë¡í•˜ì„¸ìš”." -#: commands/functioncmds.c:1032 commands/functioncmds.c:1311 +#: commands/functioncmds.c:1134 commands/functioncmds.c:1419 #, c-format msgid "only superuser can define a leakproof function" msgstr "슈í¼ìœ ì €ë§Œ leakproof 함수를 만들 수 있습니다" -#: commands/functioncmds.c:1081 +#: commands/functioncmds.c:1185 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "OUT 매개 변수로 ì¸í•´ 함수 ê²°ê³¼ 형ì‹ì€ %sì´ì–´ì•¼ 함" -#: commands/functioncmds.c:1094 +#: commands/functioncmds.c:1198 #, c-format msgid "function result type must be specified" msgstr "í•¨ìˆ˜ì˜ ë¦¬í„´ ìžë£Œí˜•ì„ ì§€ì •í•´ì•¼ 합니다" -#: commands/functioncmds.c:1146 commands/functioncmds.c:1331 +#: commands/functioncmds.c:1251 commands/functioncmds.c:1439 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "함수ì—서 세트를 반환하지 않는 경우 ROWS를 ì ìš©í•  수 ì—†ìŒ" -#: commands/functioncmds.c:1431 +#: commands/functioncmds.c:1546 #, c-format msgid "source data type %s is a pseudo-type" msgstr "%s ì›ë³¸ ìžë£Œí˜•ì´ ì˜ì‚¬ìžë£Œí˜•(pseudo-type) 입니다" -#: commands/functioncmds.c:1437 +#: commands/functioncmds.c:1552 #, c-format msgid "target data type %s is a pseudo-type" msgstr "%s ëŒ€ìƒ ìžë£Œí˜•ì´ ì˜ì‚¬ìžë£Œí˜•(pseudo-type) 입니다" -#: commands/functioncmds.c:1461 +#: commands/functioncmds.c:1576 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "ì›ë³¸ ìžë£Œí˜•ì´ ë„ë©”ì¸ì´ì–´ì„œ ìžë£Œí˜• ë³€í™˜ì„ ë¬´ì‹œí•©ë‹ˆë‹¤." -#: commands/functioncmds.c:1466 +#: commands/functioncmds.c:1581 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "ëŒ€ìƒ ìžë£Œí˜•ì´ ë„ë©”ì¸ì´ì–´ì„œ ìžë£Œí˜• ë³€í™˜ì„ ë¬´ì‹œí•©ë‹ˆë‹¤." -#: commands/functioncmds.c:1491 +#: commands/functioncmds.c:1606 #, c-format msgid "cast function must take one to three arguments" msgstr "형변환 함수는 1-3ê°œì˜ ì¸ìžë§Œ 지정할 수 있습니다" -#: commands/functioncmds.c:1495 +#: commands/functioncmds.c:1612 #, c-format msgid "" "argument of cast function must match or be binary-coercible from source data " @@ -8095,17 +9631,17 @@ msgstr "" "형변환 í•¨ìˆ˜ì˜ ì¸ìžë¡œ 쓸 ìžë£Œí˜•ì€ ì›ë³¸ ìžë£Œí˜•ê³¼ ì¼ì¹˜í•˜ê±°ë‚˜ ë°”ì´ë„ˆë¦¬ ì°¨ì›ìœ¼ë¡œ " "ê°™ì€ ìžë£Œí˜•ì´ì–´ì•¼ 함" -#: commands/functioncmds.c:1499 +#: commands/functioncmds.c:1616 #, c-format msgid "second argument of cast function must be type %s" -msgstr "형변화 í•¨ìˆ˜ì˜ ë‘번째 ì¸ìž ìžë£Œí˜•ì€ ë°˜ë“œì‹œ %s 형ì´ì—¬ì•¼í•©ë‹ˆë‹¤" +msgstr "형변화 í•¨ìˆ˜ì˜ ë‘번째 ì¸ìž ìžë£Œí˜•ì€ ë°˜ë“œì‹œ %s 형ì´ì—¬ì•¼ 합니다" -#: commands/functioncmds.c:1504 +#: commands/functioncmds.c:1621 #, c-format msgid "third argument of cast function must be type %s" -msgstr "형변화 í•¨ìˆ˜ì˜ ì„¸ë²ˆì§¸ ì¸ìž ìžë£Œí˜•ì€ ë°˜ë“œì‹œ %s 형ì´ì—¬ì•¼í•©ë‹ˆë‹¤" +msgstr "형변화 í•¨ìˆ˜ì˜ ì„¸ë²ˆì§¸ ì¸ìž ìžë£Œí˜•ì€ ë°˜ë“œì‹œ %s 형ì´ì—¬ì•¼ 합니다" -#: commands/functioncmds.c:1509 +#: commands/functioncmds.c:1628 #, c-format msgid "" "return data type of cast function must match or be binary-coercible to " @@ -8114,318 +9650,323 @@ msgstr "" "형변환 í•¨ìˆ˜ì˜ ë°˜í™˜ ìžë£Œí˜•ì€ ëŒ€ìƒ ìžë£Œí˜•ê³¼ ì¼ì¹˜í•˜ê±°ë‚˜ ë°”ì´ë„ˆë¦¬ ì°¨ì›ìœ¼ë¡œ ê°™ì€ " "ìžë£Œí˜•ì´ì–´ì•¼ 함" -#: commands/functioncmds.c:1520 +#: commands/functioncmds.c:1639 #, c-format msgid "cast function must not be volatile" -msgstr "형변환 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "형변환 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼ 합니다" -#: commands/functioncmds.c:1525 +#: commands/functioncmds.c:1644 #, c-format msgid "cast function must be a normal function" msgstr "형변환 함수는 ì¼ë°˜ 함수여야 합니다" -#: commands/functioncmds.c:1529 +#: commands/functioncmds.c:1648 #, c-format msgid "cast function must not return a set" msgstr "형변환 함수는 세트(set)를 리턴할 수 없습니다" -#: commands/functioncmds.c:1555 +#: commands/functioncmds.c:1674 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "CREATE CAST ... WITHOUT FUNCTION ëª…ë ¹ì€ ìŠˆí¼ìœ ì €ë§Œ 실행할 수 있습니다" -#: commands/functioncmds.c:1570 +#: commands/functioncmds.c:1689 #, c-format msgid "source and target data types are not physically compatible" msgstr "ì›ë³¸ ìžë£Œí˜•ê³¼ ëŒ€ìƒ ìžë£Œí˜•ì´ ì„œë¡œ 논리ì ì¸ í˜¸í™˜ì„±ì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/functioncmds.c:1585 +#: commands/functioncmds.c:1709 #, c-format msgid "composite data types are not binary-compatible" msgstr "복합 ìžë£Œí˜•ì€ ë°”ì´ë„ˆë¦¬ì™€ 호환ë˜ì§€ 않ìŒ" -#: commands/functioncmds.c:1591 -#, c-format -msgid "enum data types are not binary-compatible" -msgstr "ì—´ê±° ìžë£Œí˜•ì€ ë°”ì´ë„ˆë¦¬ì™€ 호환ë˜ì§€ 않ìŒ" - -#: commands/functioncmds.c:1597 +#: commands/functioncmds.c:1715 #, c-format msgid "array data types are not binary-compatible" msgstr "ë°°ì—´ ìžë£Œí˜•ì€ ë°”ì´ë„ˆë¦¬ì™€ 호환ë˜ì§€ 않ìŒ" -#: commands/functioncmds.c:1614 +#: commands/functioncmds.c:1723 +#, c-format +msgid "range data types are not binary-compatible" +msgstr "범위 ìžë£Œí˜•ì€ ë°”ì´ë„ˆë¦¬ì™€ 호환ë˜ì§€ 않ìŒ" + +#: commands/functioncmds.c:1729 +#, c-format +msgid "enum data types are not binary-compatible" +msgstr "ì—´ê±° ìžë£Œí˜•ì€ ë°”ì´ë„ˆë¦¬ì™€ 호환ë˜ì§€ 않ìŒ" + +#: commands/functioncmds.c:1746 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "ë„ë©”ì¸ ìžë£Œí˜•ì€ ë°”ì´ë„ˆë¦¬ì™€ 호환ë˜ì§€ 않ìŒ" -#: commands/functioncmds.c:1624 +#: commands/functioncmds.c:1756 #, c-format msgid "source data type and target data type are the same" msgstr "ì›ë³¸ ìžë£Œí˜•ê³¼ ëŒ€ìƒ ìžë£Œí˜•ì˜ í˜•íƒœê°€ 같습니다" -#: commands/functioncmds.c:1682 +#: commands/functioncmds.c:1789 #, c-format msgid "transform function must not be volatile" -msgstr "형변환 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "형변환 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼ 합니다" -#: commands/functioncmds.c:1686 +#: commands/functioncmds.c:1793 #, c-format msgid "transform function must be a normal function" -msgstr "형변환 함수는 ì¼ë°˜ 함수여야합니다." +msgstr "형변환 함수는 ì¼ë°˜ 함수여야 합니다." -#: commands/functioncmds.c:1690 +#: commands/functioncmds.c:1797 #, c-format msgid "transform function must not return a set" msgstr "형변환 함수는 세트(set)를 리턴할 수 없습니다" -#: commands/functioncmds.c:1694 +#: commands/functioncmds.c:1801 #, c-format msgid "transform function must take one argument" msgstr "형변환 함수는 1ê°œì˜ ì¸ìžë§Œ 지정할 수 있습니다" -#: commands/functioncmds.c:1698 +#: commands/functioncmds.c:1805 #, c-format msgid "first argument of transform function must be type %s" -msgstr "형변화 í•¨ìˆ˜ì˜ ì²«ë²ˆì§¸ ì¸ìž ìžë£Œí˜•ì€ ë°˜ë“œì‹œ %s 형ì´ì—¬ì•¼í•©ë‹ˆë‹¤" +msgstr "형변화 í•¨ìˆ˜ì˜ ì²«ë²ˆì§¸ ì¸ìž ìžë£Œí˜•ì€ ë°˜ë“œì‹œ %s 형ì´ì—¬ì•¼ 합니다" -#: commands/functioncmds.c:1736 +#: commands/functioncmds.c:1844 #, c-format msgid "data type %s is a pseudo-type" msgstr "%s ìžë£Œí˜•ì€ ì˜ì‚¬ìžë£Œí˜•(pseudo-type) 입니다" -#: commands/functioncmds.c:1742 +#: commands/functioncmds.c:1850 #, c-format msgid "data type %s is a domain" msgstr "%s ìžë£Œí˜•ì€ ë„ë©”ì¸ìž…니다" -#: commands/functioncmds.c:1782 +#: commands/functioncmds.c:1890 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "FROM SQL í•¨ìˆ˜ì˜ ë°˜í™˜ ìžë£Œí˜•ì€ %s 형ì´ì–´ì•¼ 함" -#: commands/functioncmds.c:1808 +#: commands/functioncmds.c:1916 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "TO SQL í•¨ìˆ˜ì˜ ë°˜í™˜ ìžë£Œí˜•ì€ ë³€í™˜ ìžë£Œí˜•ì´ì–´ì•¼ 함" -#: commands/functioncmds.c:1837 +#: commands/functioncmds.c:1943 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "%s ìžë£Œí˜•(ëŒ€ìƒ ì–¸ì–´: \"%s\")ì„ ìœ„í•œ 형변환 ê·œì¹™ì€ ì´ë¯¸ 있습니다." -#: commands/functioncmds.c:1929 +#: commands/functioncmds.c:2029 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "%s ìžë£Œí˜•(ëŒ€ìƒ ì–¸ì–´: \"%s\")ì„ ìœ„í•œ 형변환 ê·œì¹™ì€ ì—†ìŠµë‹ˆë‹¤." -#: commands/functioncmds.c:1980 +#: commands/functioncmds.c:2053 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "%s 함수는 ì´ë¯¸ \"%s\" ìŠ¤í‚¤ë§ˆì•ˆì— ìžˆìŠµë‹ˆë‹¤" -#: commands/functioncmds.c:2035 +#: commands/functioncmds.c:2104 #, c-format msgid "no inline code specified" msgstr "내장 코드가 빠졌습니다" -#: commands/functioncmds.c:2081 +#: commands/functioncmds.c:2150 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "\"%s\" 프로시주얼 언어는 내장 코드 실행 ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않습니다" -#: commands/functioncmds.c:2193 +#: commands/functioncmds.c:2245 #, c-format msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" msgstr[0] "í”„ë¡œì‹œì ¸ì— %dê°œì˜ ì¸ìž ì´ìƒì„ 전달할 수 ì—†ìŒ" -#: commands/indexcmds.c:590 +#: commands/indexcmds.c:656 #, c-format msgid "must specify at least one column" msgstr "ì ì–´ë„ 하나 ì´ìƒì˜ ì¹¼ëŸ¼ì„ ì§€ì •í•´ 주십시오" -#: commands/indexcmds.c:594 +#: commands/indexcmds.c:660 #, c-format msgid "cannot use more than %d columns in an index" msgstr "í•˜ë‚˜ì˜ ì¸ë±ìФì—서는 %d개보다 ë§Žì€ ì¹¼ëŸ¼ì„ ì‚¬ìš©í•  수 없습니다" -#: commands/indexcmds.c:633 +#: commands/indexcmds.c:703 #, c-format -msgid "cannot create index on foreign table \"%s\"" -msgstr "\"%s\" 외부 í…Œì´ë¸” 대ìƒìœ¼ë¡œ ì¸ë±ìŠ¤ë¥¼ 만들 수 ì—†ìŒ" +msgid "cannot create index on relation \"%s\"" +msgstr "\"%s\" 릴레ì´ì…˜ 대ìƒìœ¼ë¡œ ì¸ë±ìŠ¤ë¥¼ 만들 수 ì—†ìŒ" -#: commands/indexcmds.c:664 +#: commands/indexcmds.c:729 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "\"%s\" íŒŒí‹°ì…˜ëœ í…Œì´ë¸” 대ìƒìœ¼ë¡œ ë™ì‹œì— ì¸ë±ìŠ¤ë¥¼ 만들 수 ì—†ìŒ" -#: commands/indexcmds.c:669 -#, c-format -msgid "cannot create exclusion constraints on partitioned table \"%s\"" -msgstr "\"%s\" íŒŒí‹°ì…˜ëœ í…Œì´ë¸” 대ìƒìœ¼ë¡œ 제외 ì œì•½ì¡°ê±´ì„ ë§Œë“¤ 수 ì—†ìŒ" - -#: commands/indexcmds.c:679 +#: commands/indexcmds.c:739 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸”ì— ì¸ë±ìŠ¤ë¥¼ 만들 수는 없습니다" -#: commands/indexcmds.c:717 commands/tablecmds.c:704 commands/tablespace.c:1173 +#: commands/indexcmds.c:777 commands/tablecmds.c:818 commands/tablespace.c:1178 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "파티션 í…Œì´ë¸”ìš© 기본 í…Œì´ë¸”스페ì´ìŠ¤ë¥¼ 지정할 수 없습니다." -#: commands/indexcmds.c:749 commands/tablecmds.c:739 commands/tablecmds.c:13162 -#: commands/tablecmds.c:13276 +#: commands/indexcmds.c:809 commands/tablecmds.c:849 commands/tablecmds.c:3588 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "공유 관계만 pg_global í…Œì´ë¸”스페ì´ìŠ¤ì— ë°°ì¹˜í•  수 있ìŒ" -#: commands/indexcmds.c:782 +#: commands/indexcmds.c:842 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "사용하지 않는 \"rtree\" ë°©ë²•ì„ \"gist\" 액세스 방법으로 대체하는 중" -#: commands/indexcmds.c:803 +#: commands/indexcmds.c:863 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "\"%s\" ì¸ë±ìФ ì ‘ê·¼ ë°©ë²•ì€ ê³ ìœ  ì¸ë±ìŠ¤ë¥¼ ì§€ì›í•˜ì§€ 않습니다" -#: commands/indexcmds.c:808 +#: commands/indexcmds.c:868 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "\"%s\" ì¸ë±ìФ ì ‘ê·¼ ë°©ë²•ì€ í¬í•¨ëœ ì¹¼ëŸ¼ì„ ì§€ì›í•˜ì§€ 않습니다" -#: commands/indexcmds.c:813 +#: commands/indexcmds.c:873 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "\"%s\" ì¸ë±ìФ ì ‘ê·¼ ë°©ë²•ì€ ë‹¤ì¤‘ ì—´ ì¸ë±ìŠ¤ë¥¼ ì§€ì›í•˜ì§€ 않습니다" -#: commands/indexcmds.c:818 +#: commands/indexcmds.c:878 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "\"%s\" ì¸ë±ìФ ì ‘ê·¼ ë°©ë²•ì€ ì œì™¸ 제약 ì¡°ê±´ì„ ì§€ì›í•˜ì§€ 않습니다" -#: commands/indexcmds.c:941 +#: commands/indexcmds.c:1007 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "\"%s\" ì ‘ê·¼ ë°©ë²•ì„ ì‚¬ìš©í•˜ëŠ” ì¸ë±ìŠ¤ì™€ 파티션 키가 ì¼ì¹˜í•˜ì§€ 않습니다" -#: commands/indexcmds.c:951 +#: commands/indexcmds.c:1017 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "파티션 키 ì •ì˜ì—는 %s ì œì•½ì¡°ê±´ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/indexcmds.c:953 +#: commands/indexcmds.c:1019 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "%s ì œì•½ì¡°ê±´ì€ íŒŒí‹°ì…˜ 키 í¬í•¨ 표현ì‹ì— 사용할 수 없습니다" -#: commands/indexcmds.c:992 +#: commands/indexcmds.c:1069 +#, c-format +msgid "" +"cannot match partition key to index on column \"%s\" using non-equal " +"operator \"%s\"" +msgstr "" +"\"%s\" 컬럼ì—서 같지 ì•ŠìŒ ì—°ì‚°ìž(\"%s\")를 ì‚¬ìš©í•˜ëŠ”ë° ì´ê²ƒì„ 파티션 키와 매치" +"í•  수 ì—†ìŒ" + +#: commands/indexcmds.c:1085 #, c-format msgid "" "unique constraint on partitioned table must include all partitioning columns" msgstr "하위 í…Œì´ë¸” ìš© ìœ ë‹ˆí¬ ì œì•½ì¡°ê±´ì—는 모든 파티션 ì¹¼ëŸ¼ì´ í¬í•¨ë˜ì–´ì•¼ 함" -#: commands/indexcmds.c:993 +#: commands/indexcmds.c:1086 #, c-format msgid "" "%s constraint on table \"%s\" lacks column \"%s\" which is part of the " "partition key." msgstr "" +"%s 제약조건(해당 í…Œì´ë¸”: \"%s\")ì— ê¸°ë³¸í‚¤ì˜ í•œ ë¶€ë¶„ì¸ \"%s\" ì¹¼ëŸ¼ì´ ë¹ ì ¸ìžˆìŠµ" +"니다." -#: commands/indexcmds.c:1012 commands/indexcmds.c:1031 +#: commands/indexcmds.c:1105 commands/indexcmds.c:1124 #, c-format msgid "index creation on system columns is not supported" msgstr "시스템 카탈로그 í…Œì´ë¸”ì— ëŒ€í•œ ì¸ë±ìФ 만들기는 ì§€ì›í•˜ì§€ 않습니다" -#: commands/indexcmds.c:1056 -#, c-format -msgid "%s %s will create implicit index \"%s\" for table \"%s\"" -msgstr "%s %s 명령으로 \"%s\" ì¸ë±ìŠ¤ë¥¼ \"%s\" í…Œì´ë¸”ì— ìžë™ìœ¼ë¡œ 만들었ìŒ" - -#: commands/indexcmds.c:1197 tcop/utility.c:1495 +#: commands/indexcmds.c:1354 tcop/utility.c:1515 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "\"%s\" íŒŒí‹°ì…˜ëœ í…Œì´ë¸” 대ìƒìœ¼ë¡œ ìœ ë‹ˆí¬ ì¸ë±ìŠ¤ë¥¼ 만들 수 ì—†ìŒ" -#: commands/indexcmds.c:1199 tcop/utility.c:1497 +#: commands/indexcmds.c:1356 tcop/utility.c:1517 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "\"%s\" í…Œì´ë¸”ì€ í•˜ìœ„ í…Œì´ë¸”로 외부 í…Œì´ë¸”ì„ ì‚¬ìš©í•¨." -#: commands/indexcmds.c:1628 +#: commands/indexcmds.c:1806 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "" -"ì¸ë±ìФ 술어(predicate)ì—서 사용하는 함수는 IMMUTABLE íŠ¹ì„±ì´ ìžˆì–´ì•¼í•©ë‹ˆë‹¤" +"ì¸ë±ìФ 술어(predicate)ì—서 사용하는 함수는 IMMUTABLE íŠ¹ì„±ì´ ìžˆì–´ì•¼ 합니다" -#: commands/indexcmds.c:1694 parser/parse_utilcmd.c:2440 -#: parser/parse_utilcmd.c:2575 +#: commands/indexcmds.c:1885 parser/parse_utilcmd.c:2519 +#: parser/parse_utilcmd.c:2654 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "키ì—서 지정한 \"%s\" ì¹¼ëŸ¼ì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/indexcmds.c:1718 parser/parse_utilcmd.c:1776 +#: commands/indexcmds.c:1909 parser/parse_utilcmd.c:1807 #, c-format msgid "expressions are not supported in included columns" msgstr "í¬í•¨ëœ ì¹¼ëŸ¼ì— ì“°ì¸ í‘œí˜„ì‹ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/indexcmds.c:1759 +#: commands/indexcmds.c:1950 #, c-format msgid "functions in index expression must be marked IMMUTABLE" -msgstr "ì¸ë±ìФ ì‹(expression)ì— ì‚¬ìš©í•˜ëŠ” 함수는 IMMUTABLE íŠ¹ì„±ì´ ìžˆì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "ì¸ë±ìФ ì‹(expression)ì— ì‚¬ìš©í•˜ëŠ” 함수는 IMMUTABLE íŠ¹ì„±ì´ ìžˆì–´ì•¼ 합니다" -#: commands/indexcmds.c:1774 +#: commands/indexcmds.c:1965 #, c-format msgid "including column does not support a collation" msgstr "í¬í•¨ëœ ì¹¼ëŸ¼ì€ ë¬¸ìžì •ë ¬ê·œì¹™ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/indexcmds.c:1778 +#: commands/indexcmds.c:1969 #, c-format msgid "including column does not support an operator class" msgstr "í¬í•¨ëœ ì¹¼ëŸ¼ì€ ì—°ì‚°ìž í´ëž˜ìŠ¤ë¥¼ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/indexcmds.c:1782 +#: commands/indexcmds.c:1973 #, c-format msgid "including column does not support ASC/DESC options" msgstr "í¬í•¨ëœ ì¹¼ëŸ¼ì€ ASC/DESC ì˜µì…˜ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/indexcmds.c:1786 +#: commands/indexcmds.c:1977 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "í¬í•¨ëœ ì¹¼ëŸ¼ì€ NULLS FIRST/LAST ì˜µì…˜ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/indexcmds.c:1813 +#: commands/indexcmds.c:2020 #, c-format msgid "could not determine which collation to use for index expression" msgstr "해당 ì¸ë±ìФì—서 사용할 정렬규칙(collation)ì„ ê²°ì •í•  수 없습니다." -#: commands/indexcmds.c:1821 commands/tablecmds.c:16042 commands/typecmds.c:771 -#: parser/parse_expr.c:2850 parser/parse_type.c:566 parser/parse_utilcmd.c:3649 -#: parser/parse_utilcmd.c:4210 utils/adt/misc.c:503 +#: commands/indexcmds.c:2028 commands/tablecmds.c:18185 commands/typecmds.c:811 +#: parser/parse_expr.c:2785 parser/parse_type.c:568 parser/parse_utilcmd.c:3771 +#: utils/adt/misc.c:630 #, c-format msgid "collations are not supported by type %s" msgstr "%s ìžë£Œí˜•ì€ collation ì§€ì› ì•ˆí•¨" -#: commands/indexcmds.c:1859 +#: commands/indexcmds.c:2095 #, c-format msgid "operator %s is not commutative" msgstr "%s ì—°ì‚°ìžëŠ” êµí™˜ë²•ì¹™ì´ ì„±ë¦½í•˜ì§€ 않습니다" -#: commands/indexcmds.c:1861 +#: commands/indexcmds.c:2097 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "" "exclude 제약조건용 ì¸ë±ìŠ¤ë¥¼ 만들 때는 êµí™˜ë²•ì¹™ì´ ì„±ë¦½í•˜ëŠ” ì—°ì‚°ìžë§Œ 사용할 수 " "있습니다." -#: commands/indexcmds.c:1887 +#: commands/indexcmds.c:2123 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "%s ì—°ì‚°ìžëŠ” \"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬ 구성ì›ì´ 아닙니다." -#: commands/indexcmds.c:1890 +#: commands/indexcmds.c:2126 #, c-format msgid "" "The exclusion operator must be related to the index operator class for the " @@ -8433,90 +9974,114 @@ msgid "" msgstr "" "제외 ì—°ì‚°ìžëŠ” 해당 제약 ì¡°ê±´ìš© ì¸ë±ìФ ì—°ì‚°ìž í´ëž˜ìŠ¤ì˜ ì†Œì†ì´ì–´ì•¼ 합니다." -#: commands/indexcmds.c:1925 +#: commands/indexcmds.c:2161 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "\"%s\" ì ‘ê·¼ ë°©ë²•ì€ ASC/DESC ì˜µì…˜ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/indexcmds.c:1930 +#: commands/indexcmds.c:2166 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "\"%s\" ì ‘ê·¼ ë°©ë²•ì€ NULLS FIRST/LAST ì˜µì…˜ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/indexcmds.c:1976 commands/tablecmds.c:16067 -#: commands/tablecmds.c:16073 commands/typecmds.c:1945 +#: commands/indexcmds.c:2210 commands/tablecmds.c:18210 +#: commands/tablecmds.c:18216 commands/typecmds.c:2311 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "" "%s ìžë£Œí˜•ì€ \"%s\" ì¸ë±ìФ 액세스 ë°©ë²•ì„ ìœ„í•œ 기본 ì—°ì‚°ìž í´ëž˜ìФ(operator " "class)ê°€ 없습니다. " -#: commands/indexcmds.c:1978 +#: commands/indexcmds.c:2212 #, c-format msgid "" "You must specify an operator class for the index or define a default " "operator class for the data type." msgstr "" "ì´ ì¸ë±ìŠ¤ë¥¼ 위한 ì—°ì‚°ìž í´ëž˜ìŠ¤ë¥¼ 지정하거나 먼저 ì´ ìžë£Œí˜•ì„ ìœ„í•œ 기본 ì—°ì‚°" -"ìž í´ëž˜ìŠ¤ë¥¼ ì •ì˜í•´ ë‘어야합니다" +"ìž í´ëž˜ìŠ¤ë¥¼ ì •ì˜í•´ ë‘어야 합니다" -#: commands/indexcmds.c:2007 commands/indexcmds.c:2015 -#: commands/opclasscmds.c:208 +#: commands/indexcmds.c:2241 commands/indexcmds.c:2249 +#: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "" "\"%s\" ì—°ì‚°ìž í´ëž˜ìŠ¤ëŠ” \"%s\" ì¸ë±ìФ 액세스 방법ì—서 사용할 수 없습니다" -#: commands/indexcmds.c:2029 commands/typecmds.c:1933 +#: commands/indexcmds.c:2263 commands/typecmds.c:2299 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "\"%s\" ì—°ì‚°ìž í´ëž˜ìŠ¤ëŠ” %s ìžë£Œí˜•ì„ ì‚¬ìš©í•  수 없습니다" -#: commands/indexcmds.c:2119 +#: commands/indexcmds.c:2353 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "%s ìžë£Œí˜•ì„ ìœ„í•œ 기본 ì—°ì‚°ìž í´ëž˜ìŠ¤ê°€ 여러개 있습니다" -#: commands/indexcmds.c:2568 +#: commands/indexcmds.c:2681 +#, c-format +msgid "unrecognized REINDEX option \"%s\"" +msgstr "알 수 없는 REINDEX 옵션: \"%s\"" + +#: commands/indexcmds.c:2913 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "\"%s\" í…Œì´ë¸”ì—는 잠금 없는 ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ í•  ëŒ€ìƒ ì¸ë±ìŠ¤ê°€ ì—†ìŒ" -#: commands/indexcmds.c:2579 +#: commands/indexcmds.c:2927 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "\"%s\" í…Œì´ë¸”ì—는 ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ í•  ì¸ë±ìŠ¤ê°€ 없습니다" -#: commands/indexcmds.c:2618 commands/indexcmds.c:2899 -#: commands/indexcmds.c:2992 +#: commands/indexcmds.c:2974 commands/indexcmds.c:3485 +#: commands/indexcmds.c:3615 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "시스템 카탈로그 í…Œì´ë¸” 대ìƒìœ¼ë¡œ 잠금 없는 ì¸ë±ìŠ¤ë¥¼ 만들 수 ì—†ìŒ" -#: commands/indexcmds.c:2641 +#: commands/indexcmds.c:2998 #, c-format msgid "can only reindex the currently open database" msgstr "열려있는 현재 ë°ì´í„°ë² ì´ìФì—서만 reindex ëª…ë ¹ì„ ì‚¬ìš©í•  수 있습니다" -#: commands/indexcmds.c:2732 +#: commands/indexcmds.c:3090 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "" "시스템 카탈로그 í…Œì´ë¸” 대ìƒìœ¼ë¡œ 잠금 없는 ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ í•  수 ì—†ìŒ, ëª¨ë‘ ê±´ë„ˆ" "뜀" -#: commands/indexcmds.c:2784 commands/indexcmds.c:3503 +#: commands/indexcmds.c:3123 +#, c-format +msgid "cannot move system relations, skipping all" +msgstr "시스템 릴레ì´ì…˜ì€ ì´ë™í•  수 없습니다, ëª¨ë‘ ê±´ë„ˆëœ€" + +#: commands/indexcmds.c:3169 +#, c-format +msgid "while reindexing partitioned table \"%s.%s\"" +msgstr "\"%s.%s\" íŒŒí‹°ì…˜ëœ í…Œì´ë¸” 대ìƒìœ¼ë¡œ ì¸ë±ìФ 다시 만드는 중" + +#: commands/indexcmds.c:3172 +#, c-format +msgid "while reindexing partitioned index \"%s.%s\"" +msgstr "\"%s.%s\" íŒŒí‹°ì…˜ëœ ì¸ë±ìŠ¤ë¥¼ 다시 만드는 중" + +#: commands/indexcmds.c:3365 commands/indexcmds.c:4241 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "\"%s.%s\" í…Œì´ë¸”ì˜ ì¸ë±ìŠ¤ë“¤ì„ ë‹¤ì‹œ 만들었습니다." -#: commands/indexcmds.c:2914 commands/indexcmds.c:2960 +#: commands/indexcmds.c:3517 commands/indexcmds.c:3570 #, c-format -msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" -msgstr "" -"유효하지 ì•Šì€ \"%s.%s\" ì¸ë±ìŠ¤ëŠ” 잠금 없는 ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ í•  수 ì—†ìŒ, 건너뜀" +msgid "skipping reindex of invalid index \"%s.%s\"" +msgstr "\"%s.%s\" ì¸ë±ìŠ¤ê°€ ì •ìƒì ì´ì§€ 않아 ì¸ë±ìФ 다시 만들기를 건너뜀" + +#: commands/indexcmds.c:3520 commands/indexcmds.c:3573 +#, c-format +msgid "Use DROP INDEX or REINDEX INDEX." +msgstr "DROP INDEX ë˜ëŠ” REINDEX INDEX ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: commands/indexcmds.c:2920 +#: commands/indexcmds.c:3524 #, c-format msgid "" "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" @@ -8524,58 +10089,49 @@ msgstr "" "\"%s.%s\" exclusion ì œì•½ì¡°ê±´ì„ ëŒ€ìƒìœ¼ë¡œ 잠금 없는 ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ í•  수 ì—†ìŒ, " "건너뜀" -#: commands/indexcmds.c:3002 -#, c-format -msgid "cannot reindex invalid index on TOAST table concurrently" -msgstr "" -"TOAST í…Œì´ë¸”ì— ì§€ì •ëœ ìœ íš¨í•˜ì§€ ì•Šì€ ì¸ë±ìŠ¤ëŠ” 잠금 없는 ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ í•  수 ì—†ìŒ" - -#: commands/indexcmds.c:3030 +#: commands/indexcmds.c:3680 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "해당 ê°œì²´ì— ëŒ€í•´ì„œëŠ” 잠금 없는 ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ í•  수 ì—†ìŒ" -#: commands/indexcmds.c:3485 commands/indexcmds.c:3496 +#: commands/indexcmds.c:3698 #, c-format -msgid "index \"%s.%s\" was reindexed" -msgstr "\"%s.%s\" ì¸ë±ìŠ¤ê°€ 다시 만들어졌ìŒ" +msgid "cannot move non-shared relation to tablespace \"%s\"" +msgstr "비공유 릴레ì´ì…˜ì€ \"%s\" í…Œì´ë¸”스페ì´ìŠ¤ë¡œ ì´ë™í•  수 없습니다" -#: commands/indexcmds.c:3528 +#: commands/indexcmds.c:4222 commands/indexcmds.c:4234 #, c-format -msgid "REINDEX is not yet implemented for partitioned indexes" -msgstr "파티션 ëœ ì¸ë±ìŠ¤ìš© REINDEX ëª…ë ¹ì€ ì•„ì§ êµ¬í˜„ë˜ì–´ 있지 않ìŒ" +msgid "index \"%s.%s\" was reindexed" +msgstr "\"%s.%s\" ì¸ë±ìŠ¤ê°€ 다시 만들어졌ìŒ" -#: commands/lockcmds.c:91 commands/tablecmds.c:5629 commands/trigger.c:295 -#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:928 +#: commands/indexcmds.c:4224 commands/indexcmds.c:4243 #, c-format -msgid "\"%s\" is not a table or view" -msgstr "\"%s\" 개체는 í…Œì´ë¸”ë„ ë·°ë„ ì•„ë‹™ë‹ˆë‹¤" +msgid "%s." +msgstr "%s." -#: commands/lockcmds.c:213 rewrite/rewriteHandler.c:1977 -#: rewrite/rewriteHandler.c:3782 +#: commands/lockcmds.c:91 #, c-format -msgid "infinite recursion detected in rules for relation \"%s\"" -msgstr "" -"\"%s\" 릴레ì´ì…˜(relation)ì—서 ì§€ì •ëœ ë£°ì—서 ìž˜ëª»ëœ ìž¬ê·€í˜¸ì¶œì´ ë°œê²¬ë˜ì—ˆìŠµë‹ˆë‹¤" +msgid "cannot lock relation \"%s\"" +msgstr "\"%s\" 릴레ì´ì…˜ 잠그기 실패" -#: commands/matview.c:182 +#: commands/matview.c:206 #, c-format msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "" "êµ¬ì²´í™”ëœ ë·°ì˜ ìžë£Œê°€ 정리ë˜ê³  ìžˆì„ ë•ŒëŠ” CONCURRENTLY ì˜µì…˜ì„ ì‚¬ìš©í•  수 없습니" "다." -#: commands/matview.c:188 +#: commands/matview.c:212 gram.y:18918 #, c-format -msgid "CONCURRENTLY and WITH NO DATA options cannot be used together" -msgstr "CONCURRENTLY 옵션과, WITH NO DATA ì˜µì…˜ì„ í•¨ê»˜ 사용할 수 없습니다." +msgid "%s and %s options cannot be used together" +msgstr "%s 옵션과, %s ì˜µì…˜ì„ í•¨ê»˜ 사용할 수 없습니다." -#: commands/matview.c:244 +#: commands/matview.c:269 #, c-format msgid "cannot refresh materialized view \"%s\" concurrently" msgstr "\"%s\" êµ¬ì²´í™”ëœ ë·°ë¥¼ ë™ì‹œì— 재갱신 í•  수 없습니다." -#: commands/matview.c:247 +#: commands/matview.c:272 #, c-format msgid "" "Create a unique index with no WHERE clause on one or more columns of the " @@ -8584,7 +10140,7 @@ msgstr "" "êµ¬ì²´í™”ëœ ë·°ì˜ í•˜ë‚˜ ë˜ëŠ” 하나 ì´ìƒì˜ ì¹¼ëŸ¼ì— ëŒ€í•œ WHERE ì ˆ 없는 고유 ì¸ë±ìŠ¤ë¥¼ " "만드세요." -#: commands/matview.c:641 +#: commands/matview.c:666 #, c-format msgid "" "new data for materialized view \"%s\" contains duplicate rows without any " @@ -8593,642 +10149,833 @@ msgstr "" "\"%s\" êµ¬ì²´í™”ëœ ë·°ì˜ ìƒˆ ìžë£Œì— 아무런 null 칼럼 ì—†ì´ ì¤‘ë³µëœ ë¡œìš°ë¥¼ í¬í•¨í•˜ê³  " "있습니다" -#: commands/matview.c:643 +#: commands/matview.c:668 #, c-format msgid "Row: %s" msgstr "로우: %s" -#: commands/opclasscmds.c:127 +#: commands/opclasscmds.c:124 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\"" msgstr "\"%s\" ì—°ì‚°ìž ì—†ìŒ, 해당 ì ‘ê·¼ 방법: \"%s\"" -#: commands/opclasscmds.c:269 +#: commands/opclasscmds.c:267 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists" msgstr "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬ê°€ ì´ë¯¸ 있ìŒ, 해당 ì ‘ê·¼ 방법: \"%s\"" -#: commands/opclasscmds.c:414 +#: commands/opclasscmds.c:416 #, c-format msgid "must be superuser to create an operator class" msgstr "ì—°ì‚°ìž í´ëž˜ìŠ¤ëŠ” 슈í¼ìœ ì €ë§Œ 만들 수 있습니다" -#: commands/opclasscmds.c:487 commands/opclasscmds.c:869 -#: commands/opclasscmds.c:993 +#: commands/opclasscmds.c:493 commands/opclasscmds.c:910 +#: commands/opclasscmds.c:1056 #, c-format msgid "invalid operator number %d, must be between 1 and %d" msgstr "ìž˜ëª»ëœ ì—°ì‚°ìž ë²ˆí˜¸: %d, 타당한 번호는 1부터 %d까지 입니다" -#: commands/opclasscmds.c:531 commands/opclasscmds.c:913 -#: commands/opclasscmds.c:1008 +#: commands/opclasscmds.c:538 commands/opclasscmds.c:960 +#: commands/opclasscmds.c:1072 #, c-format msgid "invalid function number %d, must be between 1 and %d" msgstr "ìž˜ëª»ëœ í•¨ìˆ˜ 번호: %d, 타당한 번호는 1부터 %d까지 입니다" -#: commands/opclasscmds.c:559 +#: commands/opclasscmds.c:567 #, c-format msgid "storage type specified more than once" msgstr "저장 ë°©ë²•ì´ ì¤‘ë³µë˜ì—ˆìŠµë‹ˆë‹¤" -#: commands/opclasscmds.c:586 +#: commands/opclasscmds.c:594 #, c-format msgid "" "storage type cannot be different from data type for access method \"%s\"" msgstr "스토리지 ìžë£Œí˜•ì€ \"%s\" ì ‘ê·¼ ë°©ë²•ì˜ ìžë£Œí˜•ê³¼ 같아야 합니다." -#: commands/opclasscmds.c:602 +#: commands/opclasscmds.c:610 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists" msgstr "\"%s\" ì—°ì‚°ìž í´ëž˜ìФì—는 ì´ë¯¸ \"%s\" 액세스 ë°©ë²•ì´ ì‚¬ìš©ë˜ê³  있습니다" -#: commands/opclasscmds.c:630 +#: commands/opclasscmds.c:638 #, c-format msgid "could not make operator class \"%s\" be default for type %s" msgstr "\"%s\" ì—°ì‚°ìž í´ëž˜ìŠ¤ë¥¼ %s ìžë£Œí˜•ì˜ ê¸°ë³¸ê°’ìœ¼ë¡œ 지정할 수 없습니다" -#: commands/opclasscmds.c:633 +#: commands/opclasscmds.c:641 #, c-format msgid "Operator class \"%s\" already is the default." msgstr "\"%s\" ì—°ì‚°ìž í´ëž˜ìŠ¤ëŠ” ì´ë¯¸ 기본 ì—°ì‚°ìž í´ëž˜ìŠ¤ìž…ë‹ˆë‹¤" -#: commands/opclasscmds.c:761 +#: commands/opclasscmds.c:801 #, c-format msgid "must be superuser to create an operator family" msgstr "슈í¼ìœ ì €ë§Œ ì—°ì‚°ìž íŒ¨ë°€ë¦¬ë¥¼ 만들 수 있ìŒ" -#: commands/opclasscmds.c:821 +#: commands/opclasscmds.c:861 #, c-format msgid "must be superuser to alter an operator family" -msgstr "슈í¼ìœ ì €ë§Œ ì—°ì‚°ìž íŒ¨ë°€ë¦¬ë¥¼ 변경할 수 있ìŒ" +msgstr "슈í¼ìœ ì €ë§Œ ì—°ì‚°ìž íŒ¨ë°€ë¦¬ë¥¼ 바꿀 수 있ìŒ" -#: commands/opclasscmds.c:878 +#: commands/opclasscmds.c:919 #, c-format msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" msgstr "ì—°ì‚°ìž ì¸ìž 형ì‹ì´ ALTER OPERATOR FAMILYì— ì§€ì •ë˜ì–´ 있어야 함" -#: commands/opclasscmds.c:941 +#: commands/opclasscmds.c:994 #, c-format msgid "STORAGE cannot be specified in ALTER OPERATOR FAMILY" msgstr "ALTER OPERATOR FAMILYì—서 STORAGE를 지정할 수 ì—†ìŒ" -#: commands/opclasscmds.c:1063 +#: commands/opclasscmds.c:1128 #, c-format msgid "one or two argument types must be specified" msgstr "í•œë‘ ê°œì˜ ì¸ìž 형ì‹ì„ 지정해야 함" -#: commands/opclasscmds.c:1089 +#: commands/opclasscmds.c:1154 #, c-format msgid "index operators must be binary" msgstr "ì¸ë±ìФ ì—°ì‚°ìžëŠ” ë°”ì´ë„ˆë¦¬ì—¬ì•¼ 함" -#: commands/opclasscmds.c:1108 +#: commands/opclasscmds.c:1173 #, c-format msgid "access method \"%s\" does not support ordering operators" msgstr "\"%s\" ì ‘ê·¼ ë°©ë²•ì€ ì •ë ¬ ìž‘ì—…ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/opclasscmds.c:1119 +#: commands/opclasscmds.c:1184 #, c-format msgid "index search operators must return boolean" -msgstr "ì¸ë±ìФ 검색 ì—°ì‚°ìžëŠ” ë¶€ìš¸í˜•ì„ ë°˜í™˜í•´ì•¼ 함" +msgstr "ì¸ë±ìФ 검색 ì—°ì‚°ìžëŠ” ë¶ˆë¦¬ì–¸í˜•ì„ ë°˜í™˜í•´ì•¼ 함" -#: commands/opclasscmds.c:1159 +#: commands/opclasscmds.c:1224 #, c-format msgid "" "associated data types for operator class options parsing functions must " "match opclass input type" msgstr "" +"ì—°ì‚°ìž í´ëž˜ìФ 옵션 ë¶„ì„ í•¨ìˆ˜ì—서 쓰는 관련 ìžë£Œí˜•ì€ opclass ìž…ë ¥ ìžë£Œí˜•ê³¼ ê°™" +"아야 합니다." -#: commands/opclasscmds.c:1166 +#: commands/opclasscmds.c:1231 #, c-format msgid "" "left and right associated data types for operator class options parsing " "functions must match" msgstr "" +"ì—°ì‚°ìž í´ëž˜ìФ 옵션 ë¶„ì„ í•¨ìˆ˜ì—서 쓰는 왼쪽, 오른쪽 관련 ìžë£Œí˜•ì€ ê°™ì€ ìžë£Œí˜•" +"ì´ì–´ì•¼ 합니다." -#: commands/opclasscmds.c:1174 +#: commands/opclasscmds.c:1239 #, c-format msgid "invalid operator class options parsing function" msgstr "ìž˜ëª»ëœ ì—°ì‚°ìž í´ëž˜ìФ 옵션 구문 ë¶„ì„ í•¨ìˆ˜" -#: commands/opclasscmds.c:1175 +#: commands/opclasscmds.c:1240 #, c-format msgid "Valid signature of operator class options parsing function is %s." msgstr "바른 ì—°ì‚°ìž í´ëž˜ìФ 옵션 구문 ë¶„ì„ í•¨ìˆ˜ëŠ” %s." -#: commands/opclasscmds.c:1194 +#: commands/opclasscmds.c:1259 #, c-format msgid "btree comparison functions must have two arguments" msgstr "btree ë¹„êµ í•¨ìˆ˜ëŠ” ë‘ ê°œì˜ ì¸ìžê°€ 있어야 함" -#: commands/opclasscmds.c:1198 +#: commands/opclasscmds.c:1263 #, c-format msgid "btree comparison functions must return integer" msgstr "btree ë¹„êµ í•¨ìˆ˜ëŠ” 반드시 integer ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 함" -#: commands/opclasscmds.c:1215 +#: commands/opclasscmds.c:1280 #, c-format msgid "btree sort support functions must accept type \"internal\"" msgstr "" "btree ì •ë ¬ ì§€ì› í•¨ìˆ˜ëŠ” 반드시 \"internal\" ìžë£Œí˜• ìž…ë ¥ ì¸ìžë¡œ 사용해야함" -#: commands/opclasscmds.c:1219 +#: commands/opclasscmds.c:1284 #, c-format msgid "btree sort support functions must return void" msgstr "btree ì •ë ¬ ì§€ì› í•¨ìˆ˜ëŠ” 반드시 void ê°’ì„ ë°˜í™˜í•´ì•¼ 함" -#: commands/opclasscmds.c:1230 +#: commands/opclasscmds.c:1295 #, c-format msgid "btree in_range functions must have five arguments" msgstr "btree in_range 함수는 ë‹¤ì„¯ê°œì˜ ì¸ìžê°€ 필요합니다" -#: commands/opclasscmds.c:1234 +#: commands/opclasscmds.c:1299 #, c-format msgid "btree in_range functions must return boolean" -msgstr "btree in_range 함수는 boolean ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼í•©ë‹ˆë‹¤" +msgstr "btree in_range 함수는 불리언 ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 합니다" -#: commands/opclasscmds.c:1250 +#: commands/opclasscmds.c:1315 #, c-format msgid "btree equal image functions must have one argument" msgstr "btree equal image 함수는 한 ê°œì˜ ì¸ìžê°€ 필요합니다" -#: commands/opclasscmds.c:1254 +#: commands/opclasscmds.c:1319 #, c-format msgid "btree equal image functions must return boolean" -msgstr "btree equal image 함수는 boolean ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼í•©ë‹ˆë‹¤" +msgstr "btree equal image 함수는 불리언 ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 합니다" -#: commands/opclasscmds.c:1267 +#: commands/opclasscmds.c:1332 #, c-format msgid "btree equal image functions must not be cross-type" msgstr "btree equal image 함수는 êµì°¨í˜•(cross-type)ì´ ì•„ë‹ˆì—¬ì•¼ 합니다" -#: commands/opclasscmds.c:1277 +#: commands/opclasscmds.c:1342 #, c-format msgid "hash function 1 must have one argument" msgstr "해시 함수는 1ê°œì˜ ì¸ìžë§Œ 지정할 수 있습니다" -#: commands/opclasscmds.c:1281 +#: commands/opclasscmds.c:1346 #, c-format msgid "hash function 1 must return integer" msgstr "해시 프로시저는 정수를 반환해야 함" -#: commands/opclasscmds.c:1288 +#: commands/opclasscmds.c:1353 #, c-format msgid "hash function 2 must have two arguments" msgstr "해시 함수 2는 2ê°œì˜ ì¸ìžë§Œ 지정할 수 있습니다" -#: commands/opclasscmds.c:1292 +#: commands/opclasscmds.c:1357 #, c-format msgid "hash function 2 must return bigint" msgstr "해시 함수 2는 bigintí˜•ì„ ë°˜í™˜í•´ì•¼ 함" -#: commands/opclasscmds.c:1317 +#: commands/opclasscmds.c:1382 #, c-format msgid "associated data types must be specified for index support function" msgstr "ì¸ë±ìФ ì§€ì› í•¨ìˆ˜ì— ëŒ€í•´ 관련 ë°ì´í„° 형ì‹ì„ 지정해야 함" -#: commands/opclasscmds.c:1342 +#: commands/opclasscmds.c:1407 #, c-format msgid "function number %d for (%s,%s) appears more than once" msgstr "함수 번호 %dì´(ê°€) (%s,%s)ì— ëŒ€í•´ 여러 번 표시ë¨" -#: commands/opclasscmds.c:1349 +#: commands/opclasscmds.c:1414 #, c-format msgid "operator number %d for (%s,%s) appears more than once" msgstr "ì—°ì‚°ìž ë²ˆí˜¸ %dì´(ê°€) (%s,%s)ì— ëŒ€í•´ 여러 번 표시ë¨" -#: commands/opclasscmds.c:1398 +#: commands/opclasscmds.c:1460 #, c-format msgid "operator %d(%s,%s) already exists in operator family \"%s\"" msgstr "%d(%s,%s) ì—°ì‚°ìžê°€ \"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬ì— ì´ë¯¸ 있ìŒ" -#: commands/opclasscmds.c:1515 +#: commands/opclasscmds.c:1589 #, c-format msgid "function %d(%s,%s) already exists in operator family \"%s\"" msgstr "%d(%s,%s) 함수가 \"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬ì— ì´ë¯¸ 있ìŒ" -#: commands/opclasscmds.c:1606 +#: commands/opclasscmds.c:1744 #, c-format msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" msgstr "%d(%s,%s) ì—°ì‚°ìžê°€ \"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬ì— ì—†ìŒ" -#: commands/opclasscmds.c:1646 +#: commands/opclasscmds.c:1784 #, c-format msgid "function %d(%s,%s) does not exist in operator family \"%s\"" msgstr "%d(%s,%s) 함수가 \"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬ì— ì—†ìŒ" -#: commands/opclasscmds.c:1776 +#: commands/opclasscmds.c:1815 #, c-format msgid "" -"operator class \"%s\" for access method \"%s\" already exists in schema \"%s" -"\"" +"operator class \"%s\" for access method \"%s\" already exists in schema " +"\"%s\"" msgstr "" "\"%s\" ì—°ì‚°ìž í´ëž˜ìФ(\"%s\" 액세스 ë°©ë²•ì„ ì‚¬ìš©í•˜ëŠ”)는 ì´ë¯¸ \"%s\" 스키마 안" "ì— ìžˆìŠµë‹ˆë‹¤" -#: commands/opclasscmds.c:1799 +#: commands/opclasscmds.c:1838 #, c-format msgid "" -"operator family \"%s\" for access method \"%s\" already exists in schema \"%s" -"\"" +"operator family \"%s\" for access method \"%s\" already exists in schema " +"\"%s\"" msgstr "\"%s\" ì—°ì‚°ìž íŒ¨ë°€ë¦¬(ì ‘ê·¼ 방법: \"%s\")ê°€ \"%s\" ìŠ¤í‚¤ë§ˆì— ì´ë¯¸ 있ìŒ" -#: commands/operatorcmds.c:111 commands/operatorcmds.c:119 +#: commands/operatorcmds.c:113 commands/operatorcmds.c:121 #, c-format msgid "SETOF type not allowed for operator argument" msgstr "SETOF 형ì‹ì€ ì—°ì‚°ìž ì¸ìžì— 허용ë˜ì§€ 않ìŒ" -#: commands/operatorcmds.c:152 commands/operatorcmds.c:467 +#: commands/operatorcmds.c:154 commands/operatorcmds.c:554 #, c-format msgid "operator attribute \"%s\" not recognized" msgstr "\"%s\" ì—°ì‚°ìž ì†ì„±ì„ 처리할 수 ì—†ìŒ" -#: commands/operatorcmds.c:163 +#: commands/operatorcmds.c:165 #, c-format msgid "operator function must be specified" msgstr "ìžë£Œí˜• 함수를 지정하십시오" -#: commands/operatorcmds.c:174 +#: commands/operatorcmds.c:183 +#, c-format +msgid "operator argument types must be specified" +msgstr "ì—°ì‚°ìž ì¸ìž 형ì‹ì„ 지정해야 함" + +#: commands/operatorcmds.c:187 +#, c-format +msgid "operator right argument type must be specified" +msgstr "ì—°ì‚°ìž ì˜¤ë¥¸ìª½ ì¸ìž 형ì‹ì„ 지정해야 함" + +#: commands/operatorcmds.c:188 #, c-format -msgid "at least one of leftarg or rightarg must be specified" -msgstr "왼쪽 ì´ë‚˜ 오른쪽 중 ì ì–´ë„ í•˜ë‚˜ì˜ ì¸ìžëŠ” 지정해야 합니다" +msgid "Postfix operators are not supported." +msgstr "postfix ì—°ì‚°ìžëŠ” ì§€ì›í•˜ì§€ 않습니다" -#: commands/operatorcmds.c:278 +#: commands/operatorcmds.c:292 #, c-format msgid "restriction estimator function %s must return type %s" msgstr "%s 제한 ì˜ˆìƒ í•¨ìˆ˜ëŠ” %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 함" -#: commands/operatorcmds.c:321 +#: commands/operatorcmds.c:335 #, c-format msgid "join estimator function %s has multiple matches" msgstr "%s ì¡°ì¸ ì˜ˆìƒ í•¨ìˆ˜ê°€ 여러개 있습니다" -#: commands/operatorcmds.c:336 +#: commands/operatorcmds.c:350 #, c-format msgid "join estimator function %s must return type %s" msgstr "%s ì¡°ì¸ ì˜ˆìƒ í•¨ìˆ˜ëŠ” %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 함" -#: commands/operatorcmds.c:461 +#: commands/operatorcmds.c:388 parser/parse_oper.c:119 parser/parse_oper.c:637 +#: utils/adt/regproc.c:509 utils/adt/regproc.c:683 +#, c-format +msgid "operator does not exist: %s" +msgstr "ì—°ì‚°ìž ì—†ìŒ: %s" + +#: commands/operatorcmds.c:396 parser/parse_oper.c:702 parser/parse_oper.c:815 +#, c-format +msgid "operator is only a shell: %s" +msgstr "ì—°ì‚°ìžëŠ” ì…¸ì¼ ë¿ìž„: %s" + +#: commands/operatorcmds.c:548 #, c-format msgid "operator attribute \"%s\" cannot be changed" msgstr "\"%s\" ì—°ì‚°ìž ì†ì„± 바꿀 수 ì—†ìŒ" -#: commands/policy.c:88 commands/policy.c:381 commands/policy.c:471 -#: commands/tablecmds.c:1512 commands/tablecmds.c:1994 -#: commands/tablecmds.c:3076 commands/tablecmds.c:5608 -#: commands/tablecmds.c:8395 commands/tablecmds.c:15632 -#: commands/tablecmds.c:15667 commands/trigger.c:301 commands/trigger.c:1206 -#: commands/trigger.c:1315 rewrite/rewriteDefine.c:277 -#: rewrite/rewriteDefine.c:933 rewrite/rewriteRemove.c:80 +#: commands/operatorcmds.c:615 commands/operatorcmds.c:622 +#: commands/operatorcmds.c:628 commands/operatorcmds.c:634 +#, c-format +msgid "operator attribute \"%s\" cannot be changed if it has already been set" +msgstr "ì´ë¯¸ 설정 ë˜ì–´ \"%s\" ì—°ì‚°ìž ì†ì„± 바꿀 수 ì—†ìŒ" + +#: commands/policy.c:86 commands/policy.c:379 commands/statscmds.c:146 +#: commands/tablecmds.c:1740 commands/tablecmds.c:2340 +#: commands/tablecmds.c:3702 commands/tablecmds.c:6605 +#: commands/tablecmds.c:9637 commands/tablecmds.c:17772 +#: commands/tablecmds.c:17807 commands/trigger.c:316 commands/trigger.c:1332 +#: commands/trigger.c:1442 rewrite/rewriteDefine.c:268 +#: rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "액세스 권한 ì—†ìŒ: \"%s\" 시스템 카탈로그임" -#: commands/policy.c:171 +#: commands/policy.c:169 #, c-format msgid "ignoring specified roles other than PUBLIC" msgstr "PUBLIC 아닌 지정한 모든 롤 무시함" -#: commands/policy.c:172 +#: commands/policy.c:170 #, c-format msgid "All roles are members of the PUBLIC role." msgstr "모든 ë¡¤ì´ PUBLIC ë¡¤ì˜ ì†Œì†ìž…니다." -#: commands/policy.c:495 -#, c-format -msgid "role \"%s\" could not be removed from policy \"%s\" on \"%s\"" -msgstr "\"%s\" ë¡¤ì„ \"%s\" ì •ì±… (ëŒ€ìƒ ë¦´ë ˆì´ì…˜: \"%s\")ì—서 ì‚­ì œë  ìˆ˜ ì—†ìŒ" - -#: commands/policy.c:704 +#: commands/policy.c:603 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "WITH CHECK ì˜µì…˜ì€ SELECT나 DELETE ìž‘ì—…ì— ì ìš© ë  ìˆ˜ ì—†ìŒ" -#: commands/policy.c:713 commands/policy.c:1018 +#: commands/policy.c:612 commands/policy.c:915 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "INSERT êµ¬ë¬¸ì— ëŒ€í•´ì„œë§Œ WITH CHECK ì˜µì…˜ì„ í—ˆìš©í•©ë‹ˆë‹¤" -#: commands/policy.c:788 commands/policy.c:1241 +#: commands/policy.c:686 commands/policy.c:1138 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "\"%s\" ì •ì±…ì´ \"%s\" í…Œì´ë¸”ì— ì´ë¯¸ 지정ë˜ì–´ìžˆìŠµë‹ˆë‹¤" -#: commands/policy.c:990 commands/policy.c:1269 commands/policy.c:1340 +#: commands/policy.c:887 commands/policy.c:1166 commands/policy.c:1237 #, c-format msgid "policy \"%s\" for table \"%s\" does not exist" msgstr "\"%s\" ì •ì±…ì´ \"%s\" í…Œì´ë¸”ì— ì—†ìŒ" -#: commands/policy.c:1008 +#: commands/policy.c:905 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "USING 구문만 SELECT, DELETE ìž‘ì—…ì— ì“¸ 수 있ìŒ" -#: commands/portalcmds.c:59 commands/portalcmds.c:182 commands/portalcmds.c:233 +#: commands/portalcmds.c:60 commands/portalcmds.c:181 commands/portalcmds.c:232 #, c-format msgid "invalid cursor name: must not be empty" msgstr "ìž˜ëª»ëœ ì»¤ì„œ ì´ë¦„: 비어있으면 안ë©ë‹ˆë‹¤" -#: commands/portalcmds.c:190 commands/portalcmds.c:243 -#: executor/execCurrent.c:70 utils/adt/xml.c:2594 utils/adt/xml.c:2764 +#: commands/portalcmds.c:72 +#, c-format +msgid "cannot create a cursor WITH HOLD within security-restricted operation" +msgstr "" +"엄격한 보안 제한 작업 ë‚´ì—서 WITH HOLD ì˜µì…˜ì„ ì‚¬ìš©í•˜ëŠ” 커서는 만들 수 ì—†ìŒ" + +#: commands/portalcmds.c:189 commands/portalcmds.c:242 +#: executor/execCurrent.c:70 utils/adt/xml.c:2936 utils/adt/xml.c:3106 #, c-format msgid "cursor \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ì»¤ì„œê°€ ì—†ìŒ" -#: commands/prepare.c:76 +#: commands/prepare.c:72 #, c-format msgid "invalid statement name: must not be empty" msgstr "ìž˜ëª»ëœ ëª…ë ¹ë¬¸ ì´ë¦„: 비어있으면 안ë©ë‹ˆë‹¤" -#: commands/prepare.c:134 parser/parse_param.c:304 tcop/postgres.c:1498 -#, c-format -msgid "could not determine data type of parameter $%d" -msgstr "$%d 매개 ë³€ìˆ˜ì˜ ìžë£Œí˜•ì„ ì•Œìˆ˜ê°€ 없습니다." - -#: commands/prepare.c:152 -#, c-format -msgid "utility statements cannot be prepared" -msgstr "utility ëª…ë ¹ë¬¸ë“¤ì€ ë¯¸ë¦¬ 준비할 수 없습니다" - -#: commands/prepare.c:256 commands/prepare.c:261 +#: commands/prepare.c:227 commands/prepare.c:232 #, c-format msgid "prepared statement is not a SELECT" msgstr "ì¤€ë¹„ëœ ëª…ë ¹ë¬¸ì´ SELECT êµ¬ë¬¸ì´ ì•„ë‹™ë‹ˆë‹¤." -#: commands/prepare.c:328 +#: commands/prepare.c:292 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "prepared statement \"%s\"ì— ë§¤ê°œ 변수 수가 틀렸습니다" -#: commands/prepare.c:330 +#: commands/prepare.c:294 #, c-format msgid "Expected %d parameters but got %d." msgstr "%d ê°œì˜ ë§¤ê°œ 변수가 요구ë˜ëŠ”ë° %d ê°œë§Œì´ ì¡´ìž¬í•©ë‹ˆë‹¤" -#: commands/prepare.c:363 +#: commands/prepare.c:327 #, c-format msgid "parameter $%d of type %s cannot be coerced to the expected type %s" msgstr "??? parameter $%d of type %s 는 expected type %s 로 강요할 수 없다" -#: commands/prepare.c:449 +#: commands/prepare.c:411 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ì¤€ë¹„ëœ ëª…ë ¹ë¬¸(prepared statement)ì´ ì´ë¯¸ 있습니다" -#: commands/prepare.c:488 +#: commands/prepare.c:450 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ì¤€ë¹„ëœ ëª…ë ¹ë¬¸(prepared statement) ì—†ìŒ" -#: commands/proclang.c:67 +#: commands/proclang.c:66 #, c-format msgid "must be superuser to create custom procedural language" msgstr "슈í¼ìœ ì €ë§Œ ì‚¬ìš©ìž ì§€ì • 프로시저 언어를 만들 수 있ìŒ" -#: commands/publicationcmds.c:107 +#: commands/publicationcmds.c:124 postmaster/postmaster.c:1108 +#: postmaster/postmaster.c:1210 utils/init/miscinit.c:1865 #, c-format -msgid "invalid list syntax for \"publish\" option" -msgstr "\"publish\" ì˜µì…˜ì˜ ëª©ë¡ ë¬¸ë²•ì´ ìž˜ëª»ë¨" +msgid "invalid list syntax in parameter \"%s\"" +msgstr "\"%s\" 매개 변수 êµ¬ë¬¸ì´ ìž˜ëª» ë˜ì—ˆìŠµë‹ˆë‹¤" -#: commands/publicationcmds.c:125 +#: commands/publicationcmds.c:143 #, c-format -msgid "unrecognized \"publish\" value: \"%s\"" -msgstr "알 수 없는 \"publish\" ê°’: \"%s\"" +msgid "unrecognized value for publication option \"%s\": \"%s\"" +msgstr "발행용 \"%s\" 옵션ì—서 쓸 수 없는 ê°’: \"%s\"" -#: commands/publicationcmds.c:140 +#: commands/publicationcmds.c:157 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "ì¸ì‹í•  수 없는 발행 매개 변수: \"%s\"" -#: commands/publicationcmds.c:172 +#: commands/publicationcmds.c:198 +#, c-format +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "CURRENT_SCHEMA ìš© 실제 스키마 ì—†ìŒ" + +#: commands/publicationcmds.c:495 +msgid "System columns are not allowed." +msgstr "시스템 ì¹¼ëŸ¼ì€ í—ˆìš©í•˜ì§€ 않ìŒ." + +#: commands/publicationcmds.c:502 commands/publicationcmds.c:507 +#: commands/publicationcmds.c:524 +msgid "User-defined operators are not allowed." +msgstr "ì‚¬ìš©ìž ì •ì˜ ì—°ì‚°ìžëŠ” 허용하지 않ìŒ." + +#: commands/publicationcmds.c:548 +msgid "" +"Only columns, constants, built-in operators, built-in data types, built-in " +"collations, and immutable built-in functions are allowed." +msgstr "" +"칼럼, ìƒìˆ˜, 내장 ì—°ì‚°ìž, 내장 ìžë£Œí˜•, 내장 ë¬¸ìž ì •ë ¬ 규칙, 불변형 내장 함수" +"ë§Œ 허용합니다." + +#: commands/publicationcmds.c:560 +msgid "User-defined types are not allowed." +msgstr "ì‚¬ìš©ìž ì •ì˜ ìžë£Œí˜•ì€ í—ˆìš©í•˜ì§€ 않ìŒ." + +#: commands/publicationcmds.c:563 +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "ì‚¬ìš©ìž ì •ì˜ë‚˜ 내장 함수가 mutable ì¸ ê²½ìš° 허용하지 않ìŒ." + +#: commands/publicationcmds.c:566 +msgid "User-defined collations are not allowed." +msgstr "ì‚¬ìš©ìž ì •ì˜ ë¬¸ìž ì •ë ¬ ê·œì¹™ì€ í—ˆìš©í•˜ì§€ 않ìŒ." + +#: commands/publicationcmds.c:576 +#, c-format +msgid "invalid publication WHERE expression" +msgstr "ìž˜ëª»ëœ êµ¬ë… WHERE ì ˆ 구문" + +#: commands/publicationcmds.c:629 +#, c-format +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "\"%s\" 릴레ì´ì…˜ìš© êµ¬ë… WHERE ì ˆì€ ì‚¬ìš©í•  수 ì—†ìŒ" + +#: commands/publicationcmds.c:631 +#, c-format +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "%s ê°’ì´ false ì¼ë•Œ, 파티션 ëœ í…Œì´ë¸”ì—서는 WHERE ì ˆì„ ì‚¬ìš©í•  수 ì—†ìŒ." + +#: commands/publicationcmds.c:702 commands/publicationcmds.c:716 +#, c-format +msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" +msgstr "\"%s.%s\" 릴레ì´ì…˜ìš© 칼럼 목ë¡ì„ 사용할 수 ì—†ìŒ(해당 구ë…: \"%s\")" + +#: commands/publicationcmds.c:705 +#, c-format +msgid "" +"Column lists cannot be specified in publications containing FOR TABLES IN " +"SCHEMA elements." +msgstr "" +"FOR TABLES IN SCHEMA êµ¬ë¬¸ì„ ì´ìš©í•´ì„œ 구ë…ì„ ë§Œë“¤ 때는 칼럼 목ë¡ì„ 지정할 수 " +"없습니다." + +#: commands/publicationcmds.c:719 +#, c-format +msgid "" +"Column lists cannot be specified for partitioned tables when %s is false." +msgstr "" +"%s ê°’ì´ false ì¼ë•Œ, 파티션 ìƒìœ„ í…Œì´ë¸”ì„ ìœ„í•œ 칼럼 목ë¡ì€ 지정할 수 없습니다." + +#: commands/publicationcmds.c:754 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "FOR ALL TABLES ì˜µì…˜ì˜ ë°œí–‰ì„ ë§Œë“œë ¤ë©´ 슈í¼ìœ ì €ì—¬ì•¼ë§Œ 합니다" -#: commands/publicationcmds.c:248 +#: commands/publicationcmds.c:825 +#, c-format +msgid "must be superuser to create FOR TABLES IN SCHEMA publication" +msgstr "FOR TABLES IN SCHEMA êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ëŠ” 구ë…ì€ ìŠˆí¼ ìœ ì €ë§Œ 쓸 수 있ìŒ" + +#: commands/publicationcmds.c:861 +#, c-format +msgid "\"wal_level\" is insufficient to publish logical changes" +msgstr "\"wal_level\" ìˆ˜ì¤€ì´ ë…¼ë¦¬ 변경 사항 ë°œí–‰ì„ í•˜ê¸°ì—는 부족합니다" + +#: commands/publicationcmds.c:862 +#, c-format +msgid "Set \"wal_level\" to \"logical\" before creating subscriptions." +msgstr "\"wal_level\" ê°’ì„ \"logical\"로 바꾸고 구ë…ì„ ë§Œë“¤ì„¸ìš”" + +#: commands/publicationcmds.c:958 commands/publicationcmds.c:966 +#, c-format +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "\"%s\" 매개 변수 값으로 false를 지정할 수 ì—†ìŒ, 해당 구ë…: \"%s\"" + +#: commands/publicationcmds.c:961 +#, c-format +msgid "" +"The publication contains a WHERE clause for partitioned table \"%s\", which " +"is not allowed when \"%s\" is false." +msgstr "" +"ì´ êµ¬ë…ì€ \"%s\" 파티션 ìƒìœ„í…Œì´ë¸” ëŒ€ìƒ WHERE ì ˆì„ í¬í•¨í•˜ê³  있습니다. \"%s\" " +"ê°’ì´ false 때는 ì´ ì¡°ê±´ì„ í—ˆìš©í•˜ì§€ 않습니다." + +#: commands/publicationcmds.c:969 +#, c-format +msgid "" +"The publication contains a column list for partitioned table \"%s\", which " +"is not allowed when \"%s\" is false." +msgstr "" +"ì´ êµ¬ë…ì€ \"%s\" 파티션 ìƒìœ„í…Œì´ë¸” ëŒ€ìƒ ì¹¼ëŸ¼ 목ë¡ì„ í¬í•¨í•˜ê³  있습니다. " +"\"%s\" ê°’ì´ false 때는 ì´ëŸ° ì‚¬ìš©ì„ í—ˆìš©í•˜ì§€ 않습니다." + +#: commands/publicationcmds.c:1292 +#, c-format +msgid "cannot add schema to publication \"%s\"" +msgstr "\"%s\" 구ë…ì— ìŠ¤í‚¤ë§ˆëŠ” 추가 í•  수 ì—†ìŒ" + +#: commands/publicationcmds.c:1294 #, c-format -msgid "wal_level is insufficient to publish logical changes" -msgstr "wal_level ìˆ˜ì¤€ì´ ë…¼ë¦¬ 변경 사항 ë°œí–‰ì„ í•˜ê¸°ì—는 부족합니다" +msgid "" +"Schemas cannot be added if any tables that specify a column list are already " +"part of the publication." +msgstr "" +"ì´ë¯¸ 해당 ë°œí–‰ì— í•œ 부분으로 ì–´ë–¤ í…Œì´ë¸”ì˜ ì¹¼ëŸ¼ 목ë¡ì„ 사용하고 있다면, ê·¸ í…Œ" +"ì´ë¸”ì´ ìžˆëŠ” ê·¸ 스키마는 스키마 단위로 ë°œí–‰ì— ì¶”ê°€ í•  수 없습니다." -#: commands/publicationcmds.c:249 +#: commands/publicationcmds.c:1342 #, c-format -msgid "Set wal_level to logical before creating subscriptions." -msgstr "wal_level ê°’ì„ logical로 바꾸고 구ë…ì„ ë§Œë“¤ì„¸ìš”" +msgid "must be superuser to add or set schemas" +msgstr "스키마 ì§€ì •ì€ ìŠˆí¼ìœ ì ¸ì—¬ì•¼ 합니다" -#: commands/publicationcmds.c:369 +#: commands/publicationcmds.c:1351 commands/publicationcmds.c:1359 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "\"%s\" ë°œí–‰ì€ FOR ALL TABLES 옵션으로 ì •ì˜ë˜ì–´ 있습니다." -#: commands/publicationcmds.c:371 +#: commands/publicationcmds.c:1353 +#, c-format +msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "FOR ALL TABLES ë°œí–‰ì— ìŠ¤í‚¤ë§ˆë¥¼ 추가하거나 뺄 수 없습니다." + +#: commands/publicationcmds.c:1361 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "" "FOR ALL TABLES ë°œí–‰ì— ìƒˆ í…Œì´ë¸”ì„ ì¶”ê°€í•˜ê±°ë‚˜ 한 í…Œì´ë¸”ì„ ëº„ 수 없습니다." -#: commands/publicationcmds.c:683 +#: commands/publicationcmds.c:1385 commands/publicationcmds.c:1424 +#: commands/publicationcmds.c:1961 utils/cache/lsyscache.c:3634 +#, c-format +msgid "publication \"%s\" does not exist" +msgstr "\"%s\" ì´ë¦„ì˜ ë°œí–‰ì€ ì—†ìŠµë‹ˆë‹¤" + +#: commands/publicationcmds.c:1587 commands/publicationcmds.c:1650 +#, c-format +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "\"%s\" í…Œì´ë¸” ìš© WHERE ì ˆì´ ì¶©ëŒë‚˜ê±°ë‚˜, 중복ë˜ì—ˆìŒ" + +#: commands/publicationcmds.c:1594 commands/publicationcmds.c:1662 +#, c-format +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "\"%s\" í…Œì´ë¸” ìš© 칼럼 목ë¡ì´ ì¶©ëŒë‚˜ê±°ë‚˜, 중복ë˜ì—ˆìŒ" + +#: commands/publicationcmds.c:1796 +#, c-format +msgid "column list must not be specified in ALTER PUBLICATION ... DROP" +msgstr "ALTER PUBLICATION ... DROP 구문ì—서는 칼럼 목ë¡ì„ 지정하지 ë§ì•„야함" + +#: commands/publicationcmds.c:1808 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "\"%s\" 릴레ì´ì…˜ì€ 해당 ë°œí–‰ì— í¬í•¨ë˜ì–´ 있지 않습니다" -#: commands/publicationcmds.c:726 +#: commands/publicationcmds.c:1815 +#, c-format +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "발행ì—서 í…Œì´ë¸”ì„ ëº„ 때, WHERE ì ˆì€ ì‚¬ìš©í•  수 없습니다." + +#: commands/publicationcmds.c:1875 +#, c-format +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "\"%s\" ìŠ¤í‚¤ë§ˆì˜ í…Œì´ë¸”ë“¤ì€ í•´ë‹¹ ë°œí–‰ì— í¬í•¨ë˜ì–´ 있지 않습니다" + +#: commands/publicationcmds.c:1918 commands/publicationcmds.c:1925 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "\"%s\" ë°œí–‰ì˜ ì†Œìœ ì£¼ë¥¼ 바꿀 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/publicationcmds.c:728 +#: commands/publicationcmds.c:1920 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "FOR ALL TABLES 옵션용 ë°œí–‰ì˜ ì†Œìœ ì£¼ëŠ” 슈í¼ìœ ì €ì—¬ì•¼ë§Œ 합니다" -#: commands/schemacmds.c:105 commands/schemacmds.c:281 +#: commands/publicationcmds.c:1927 +#, c-format +msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." +msgstr "FOR ALL TABLES IN SCHEMA 구ë…ì˜ ì†Œìœ ì£¼ëŠ” 슈í¼ìœ ì €ì—¬ì•¼ë§Œ 합니다" + +#: commands/publicationcmds.c:1993 +#, c-format +msgid "publication with OID %u does not exist" +msgstr "OID %u 발행 ì—†ìŒ" + +#: commands/schemacmds.c:109 commands/schemacmds.c:289 #, c-format msgid "unacceptable schema name \"%s\"" msgstr "\"%s\" 스키마 ì´ë¦„ì´ ì ë‹¹í•˜ì§€ 못합니다" -#: commands/schemacmds.c:106 commands/schemacmds.c:282 +#: commands/schemacmds.c:110 commands/schemacmds.c:290 #, c-format msgid "The prefix \"pg_\" is reserved for system schemas." msgstr "" "\"pg_\" 문ìžë¡œ 시작하는 스키마는 시스템ì—서 사용하는 ì˜ˆì•½ëœ ìŠ¤í‚¤ë§ˆìž…ë‹ˆë‹¤." -#: commands/schemacmds.c:120 +#: commands/schemacmds.c:134 #, c-format msgid "schema \"%s\" already exists, skipping" msgstr "\"%s\" ì´ë¦„ì˜ ìŠ¤í‚¤ë§ˆ(schema)ê°€ ì´ë¯¸ 있ìŒ, 건너뜀" -#: commands/seclabel.c:60 +#: commands/seclabel.c:131 #, c-format msgid "no security label providers have been loaded" msgstr "ë¡œë“œëœ ë³´ì•ˆ ë¼ë²¨ 제공ìžê°€ ì—†ìŒ" -#: commands/seclabel.c:64 +#: commands/seclabel.c:135 #, c-format msgid "" "must specify provider when multiple security label providers have been loaded" msgstr "다중 보안 ë ˆì´ë¸” 제공ìžê°€ 로드 ë  ë•Œ 제공ìžë¥¼ 지정해야 합니다." -#: commands/seclabel.c:82 +#: commands/seclabel.c:153 #, c-format msgid "security label provider \"%s\" is not loaded" msgstr "\"%s\" ì´ë¦„ì˜ ë³´ì•ˆ ë¼ë²¨ 제공ìžê°€ 로드ë˜ì–´ 있지 않ìŒ" -#: commands/sequence.c:140 +#: commands/seclabel.c:160 +#, c-format +msgid "security labels are not supported for this type of object" +msgstr "ì´ ê°ì²´ 형태는 보안 ë¼ë²¨ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: commands/seclabel.c:193 #, c-format -msgid "unlogged sequences are not supported" -msgstr "로그를 남기지 않는 시퀀스는 ì§€ì›í•˜ì§€ 않ìŒ" +msgid "cannot set security label on relation \"%s\"" +msgstr "\"%s\" 릴레ì´ì…˜ì— 보안 ë¼ë²¨ì„ 지정할 수 ì—†ìŒ" -#: commands/sequence.c:709 +#: commands/sequence.c:748 #, c-format -msgid "nextval: reached maximum value of sequence \"%s\" (%s)" -msgstr "nextval: \"%s\" ì‹œí€€ìŠ¤ì˜ ìµœëŒ€ê°’(%s)ì´ ë˜ì—ˆìŠµë‹ˆë‹¤" +msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" +msgstr "nextval: \"%s\" ì‹œí€€ìŠ¤ì˜ ìµœëŒ€ê°’(%lld)ì´ ë˜ì—ˆìŠµë‹ˆë‹¤" -#: commands/sequence.c:732 +#: commands/sequence.c:767 #, c-format -msgid "nextval: reached minimum value of sequence \"%s\" (%s)" -msgstr "nextval: \"%s\" ì‹œí€€ìŠ¤ì˜ ìµœì†Œê°’(%s)ì´ ë˜ì—ˆìŠµë‹ˆë‹¤" +msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" +msgstr "nextval: \"%s\" ì‹œí€€ìŠ¤ì˜ ìµœì†Œê°’(%lld)ì´ ë˜ì—ˆìŠµë‹ˆë‹¤" -#: commands/sequence.c:850 +#: commands/sequence.c:886 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "\"%s\" ì‹œí€€ìŠ¤ì˜ currval ê°’ì´ í˜„ìž¬ ì„¸ì…˜ì— ì§€ì •ë˜ì–´ 있지 않습니다" -#: commands/sequence.c:869 commands/sequence.c:875 +#: commands/sequence.c:905 commands/sequence.c:911 #, c-format msgid "lastval is not yet defined in this session" msgstr "ì´ ì„¸ì…˜ì—는 lastval ê°’ì´ ì•„ì§ê¹Œì§€ 지정ë˜ì§€ 않았습니다" -#: commands/sequence.c:963 +#: commands/sequence.c:991 #, c-format -msgid "setval: value %s is out of bounds for sequence \"%s\" (%s..%s)" -msgstr "setval: %s ê°’ì€ \"%s\" ì‹œí€€ìŠ¤ì˜ ë²”ìœ„(%s..%s)를 벗어났습니다" +msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" +msgstr "setval: %lld ê°’ì€ \"%s\" ì‹œí€€ìŠ¤ì˜ ë²”ìœ„(%lld..%lld)를 벗어났습니다" -#: commands/sequence.c:1360 +#: commands/sequence.c:1357 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "ìž˜ëª»ëœ SEQUENCE NAME 시퀀스 옵션" -#: commands/sequence.c:1386 +#: commands/sequence.c:1383 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "ì‹ë³„ ì¹¼ëŸ¼ì— ì“¸ ìžë£Œí˜•ì€ smallint, integer, bigint ìžë£Œí˜•ë§Œ 쓸 수 있ìŒ" -#: commands/sequence.c:1387 +#: commands/sequence.c:1384 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "ì‹œí€€ìŠ¤ì— ì“¸ ìžë£Œí˜•ì€ smallint, integer, bigint ìžë£Œí˜•ë§Œ 쓸 수 있ìŒ" -#: commands/sequence.c:1421 +#: commands/sequence.c:1418 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT ê°’ì€ 0(zero)ì´ ë  ìˆ˜ 없습니다" -#: commands/sequence.c:1474 +#: commands/sequence.c:1466 #, c-format -msgid "MAXVALUE (%s) is out of range for sequence data type %s" -msgstr "MAXVALUE (%s) ê°’ì´ í—ˆìš© 범위 ë°–ìž„, 해당 시퀀스 ìžë£Œí˜•: %s" +msgid "MAXVALUE (%lld) is out of range for sequence data type %s" +msgstr "MAXVALUE (%lld) ê°’ì´ í—ˆìš© 범위 ë°–ìž„, 해당 시퀀스 ìžë£Œí˜•: %s" -#: commands/sequence.c:1511 +#: commands/sequence.c:1498 #, c-format -msgid "MINVALUE (%s) is out of range for sequence data type %s" -msgstr "MAXVALUE (%s) ê°’ì´ í—ˆìš© 범위 ë°–ìž„, 해당 시퀀스 ìžë£Œí˜•: %s" +msgid "MINVALUE (%lld) is out of range for sequence data type %s" +msgstr "MAXVALUE (%lld) ê°’ì´ í—ˆìš© 범위 ë°–ìž„, 해당 시퀀스 ìžë£Œí˜•: %s" -#: commands/sequence.c:1525 +#: commands/sequence.c:1506 #, c-format -msgid "MINVALUE (%s) must be less than MAXVALUE (%s)" -msgstr "MINVALUE (%s) ê°’ì€ MAXVALUE (%s) 값보다 작아야합니다" +msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" +msgstr "MINVALUE (%lld) ê°’ì€ MAXVALUE (%lld) 값보다 작아야 합니다" -#: commands/sequence.c:1552 +#: commands/sequence.c:1527 #, c-format -msgid "START value (%s) cannot be less than MINVALUE (%s)" -msgstr "START ê°’(%s)ì€ MINVALUE(%s)보다 ìž‘ì„ ìˆ˜ ì—†ìŒ" +msgid "START value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "START ê°’(%lld)ì€ MINVALUE(%lld)보다 ìž‘ì„ ìˆ˜ ì—†ìŒ" -#: commands/sequence.c:1564 +#: commands/sequence.c:1533 #, c-format -msgid "START value (%s) cannot be greater than MAXVALUE (%s)" -msgstr "START ê°’(%s)ì€ MAXVALUE(%s)보다 í´ ìˆ˜ ì—†ìŒ" +msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "START ê°’(%lld)ì€ MAXVALUE(%lld)보다 í´ ìˆ˜ ì—†ìŒ" -#: commands/sequence.c:1594 +#: commands/sequence.c:1557 #, c-format -msgid "RESTART value (%s) cannot be less than MINVALUE (%s)" -msgstr "RESTART ê°’(%s)ì€ MINVALUE(%s)보다 ìž‘ì„ ìˆ˜ ì—†ìŒ" +msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "RESTART ê°’(%lld)ì€ MINVALUE(%lld)보다 ìž‘ì„ ìˆ˜ ì—†ìŒ" -#: commands/sequence.c:1606 +#: commands/sequence.c:1563 #, c-format -msgid "RESTART value (%s) cannot be greater than MAXVALUE (%s)" -msgstr "RESTART ê°’(%s)ì€ MAXVALUE(%s)보다 í´ ìˆ˜ ì—†ìŒ" +msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "RESTART ê°’(%lld)ì€ MAXVALUE(%lld)보다 í´ ìˆ˜ ì—†ìŒ" -#: commands/sequence.c:1621 +#: commands/sequence.c:1574 #, c-format -msgid "CACHE (%s) must be greater than zero" -msgstr "CACHE (%s) ê°’ì€ 0(zero)보다 커야합니다" +msgid "CACHE (%lld) must be greater than zero" +msgstr "CACHE (%lld) ê°’ì€ 0(zero)보다 커야 합니다" -#: commands/sequence.c:1658 +#: commands/sequence.c:1610 #, c-format msgid "invalid OWNED BY option" msgstr "ìž˜ëª»ëœ OWNED BY 옵션" -#: commands/sequence.c:1659 +#: commands/sequence.c:1611 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "OWNED BY í…Œì´ë¸”.ì—´ ë˜ëŠ” OWNED BY NONEì„ ì§€ì •í•˜ì‹­ì‹œì˜¤." -#: commands/sequence.c:1684 +#: commands/sequence.c:1636 #, c-format -msgid "referenced relation \"%s\" is not a table or foreign table" -msgstr "참조ë˜ëŠ” \"%s\" 릴레ì´ì…˜ì€ í…Œì´ë¸” ë˜ëŠ” 외부 í…Œì´ë¸”ì´ ì•„ë‹™ë‹ˆë‹¤" +msgid "sequence cannot be owned by relation \"%s\"" +msgstr "\"%s\" 릴레ì´ì…˜ì˜ ì†Œì† ì‹œí€€ìŠ¤ê°€ ë  ìˆ˜ ì—†ìŒ" -#: commands/sequence.c:1691 +#: commands/sequence.c:1644 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "시퀀스 ë° ì´ ì‹œí€€ìŠ¤ê°€ ì—°ê²°ëœ í…Œì´ë¸”ì˜ ì†Œìœ ì£¼ê°€ 같아야 함" -#: commands/sequence.c:1695 +#: commands/sequence.c:1648 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "시퀀스 ë° ì´ ì‹œí€€ìŠ¤ê°€ ì—°ê²°ëœ í…Œì´ë¸”ì´ ê°™ì€ ìŠ¤í‚¤ë§ˆì— ìžˆì–´ì•¼ 함" -#: commands/sequence.c:1717 +#: commands/sequence.c:1670 #, c-format msgid "cannot change ownership of identity sequence" msgstr "ì‹ë³„ ì‹œí€€ìŠ¤ì˜ ì†Œìœ ì£¼ëŠ” 바꿀 수 ì—†ìŒ" -#: commands/sequence.c:1718 commands/tablecmds.c:12544 -#: commands/tablecmds.c:15058 +#: commands/sequence.c:1671 commands/tablecmds.c:14486 +#: commands/tablecmds.c:17181 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "\"%s\" 시퀀스는 \"%s\" í…Œì´ë¸”ì— ì¢…ì†ë˜ì–´ 있습니다." -#: commands/statscmds.c:104 commands/statscmds.c:113 +#: commands/statscmds.c:106 commands/statscmds.c:115 tcop/utility.c:1883 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "CREATE STATISTICS 명령ì—서는 í•˜ë‚˜ì˜ ë¦´ë ˆì´ì…˜ë§Œ 사용할 수 있ìŒ" -#: commands/statscmds.c:131 +#: commands/statscmds.c:133 #, c-format -msgid "relation \"%s\" is not a table, foreign table, or materialized view" -msgstr "\"%s\" 개체는 í…Œì´ë¸”ë„, 외부 í…Œì´ë¸”ë„, êµ¬ì²´í™”ëœ ë·°ë„ ì•„ë‹™ë‹ˆë‹¤" +msgid "cannot define statistics for relation \"%s\"" +msgstr "\"%s\" 릴레ì´ì…˜ìš© 통계정보를 ì •ì˜í•  수 ì—†ìŒ" -#: commands/statscmds.c:174 +#: commands/statscmds.c:187 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "\"%s\" ì´ë¦„ì˜ í†µê³„ì •ë³´ 개체가 ì´ë¯¸ 있습니다, 건너뜀" -#: commands/statscmds.c:182 +#: commands/statscmds.c:195 #, c-format msgid "statistics object \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ í†µê³„ì •ë³´ 개체가 ì´ë¯¸ 있ìŒ" -#: commands/statscmds.c:204 commands/statscmds.c:210 +#: commands/statscmds.c:206 #, c-format -msgid "only simple column references are allowed in CREATE STATISTICS" -msgstr "CREATE STATISTICS 명령ì—서는 단순 칼럼 참조만 허용합니다." +msgid "cannot have more than %d columns in statistics" +msgstr "통계정보 개체ì—서는 %d개보다 ë§Žì€ ì¹¼ëŸ¼ì„ ì‚¬ìš©í•  수 없습니다" -#: commands/statscmds.c:225 +#: commands/statscmds.c:247 commands/statscmds.c:270 commands/statscmds.c:304 #, c-format msgid "statistics creation on system columns is not supported" msgstr "시스템 ì¹¼ëŸ¼ì— ëŒ€í•œ 통계정보 개체 만들기는 ì§€ì›í•˜ì§€ 않습니다" -#: commands/statscmds.c:232 +#: commands/statscmds.c:254 commands/statscmds.c:277 #, c-format msgid "" "column \"%s\" cannot be used in statistics because its type %s has no " @@ -9237,110 +10984,157 @@ msgstr "" "\"%s\" ì¹¼ëŸ¼ì€ ì‚¬ìš©ìž í†µê³„ì •ë³´ ìˆ˜ì§‘ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤. %s ìžë£Œí˜•ì€ ê¸°ë³¸ btree ì—°" "ì‚°ìž í´ëž˜ìŠ¤ë¥¼ ì •ì˜í•˜ì§€ 않았습니다" -#: commands/statscmds.c:239 +#: commands/statscmds.c:321 #, c-format -msgid "cannot have more than %d columns in statistics" -msgstr "통계정보 개체ì—서는 %d개보다 ë§Žì€ ì¹¼ëŸ¼ì„ ì‚¬ìš©í•  수 없습니다" +msgid "" +"expression cannot be used in multivariate statistics because its type %s has " +"no default btree operator class" +msgstr "" +"%s ìžë£Œí˜•ì—는 기본 btree ì—°ì‚°ìž í´ëž˜ìŠ¤ê°€ 없어서, 표현ì‹ì€ 다변ì ì¸ 통계 ì •ë³´" +"ì—서 ì‚¬ìš©ë  ìˆ˜ ì—†ìŒ" + +#: commands/statscmds.c:342 +#, c-format +msgid "" +"when building statistics on a single expression, statistics kinds may not be " +"specified" +msgstr "" +"ë‹¨ì¼ í‘œí˜„ì‹ìœ¼ë¡œ 통계 정보를 만들 때, 통계 ì •ë³´ 종류는 지정할 수 없습니다." + +#: commands/statscmds.c:371 +#, c-format +msgid "unrecognized statistics kind \"%s\"" +msgstr "알 수 없는 통계정보 종류 \"%s\"" -#: commands/statscmds.c:254 +#: commands/statscmds.c:400 #, c-format msgid "extended statistics require at least 2 columns" msgstr "í™•ìž¥ëœ í†µê³„ì •ë³´ëŠ” ë‘ ê°œ ì´ìƒì˜ ì¹¼ëŸ¼ì´ í•„ìš”í•©ë‹ˆë‹¤." -#: commands/statscmds.c:272 +#: commands/statscmds.c:418 #, c-format msgid "duplicate column name in statistics definition" msgstr "통계정보 ì •ì˜ì—서 사용하는 ì¹¼ëŸ¼ì´ ì¤‘ë³µë˜ì—ˆìŠµë‹ˆë‹¤" -#: commands/statscmds.c:306 +#: commands/statscmds.c:453 #, c-format -msgid "unrecognized statistics kind \"%s\"" -msgstr "알 수 없는 통계정보 종류 \"%s\"" +msgid "duplicate expression in statistics definition" +msgstr "통계정보 ì •ì˜ì—서 표현ì‹ì´ 중복ë˜ì—ˆìŠµë‹ˆë‹¤" -#: commands/statscmds.c:444 commands/tablecmds.c:7416 +#: commands/statscmds.c:628 commands/tablecmds.c:8620 #, c-format msgid "statistics target %d is too low" msgstr "ëŒ€ìƒ í†µê³„ê°’(%d)ì´ ë„ˆë¬´ 낮습니다" -#: commands/statscmds.c:452 commands/tablecmds.c:7424 +#: commands/statscmds.c:636 commands/tablecmds.c:8628 #, c-format msgid "lowering statistics target to %d" msgstr "%d 값으로 ëŒ€ìƒ í†µê³„ê°’ì„ ë‚®ì¶¥ë‹ˆë‹¤" -#: commands/statscmds.c:475 +#: commands/statscmds.c:660 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "\"%s.%s\" 통계정보 개체 ì—†ìŒ, 무시함" -#: commands/subscriptioncmds.c:181 +#: commands/subscriptioncmds.c:275 commands/subscriptioncmds.c:372 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "알 수 없는 êµ¬ë… ë§¤ê°œ 변수: \"%s\"" +#: commands/subscriptioncmds.c:340 replication/pgoutput/pgoutput.c:404 +#, c-format +msgid "unrecognized origin value: \"%s\"" +msgstr "알 수 없는 오리진 ê°’: \"%s\"" + +#: commands/subscriptioncmds.c:363 +#, c-format +msgid "invalid WAL location (LSN): %s" +msgstr "ìž˜ëª»ëœ WAL 위치 (LSN): %s" + #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:195 commands/subscriptioncmds.c:201 -#: commands/subscriptioncmds.c:207 commands/subscriptioncmds.c:226 -#: commands/subscriptioncmds.c:232 +#: commands/subscriptioncmds.c:387 commands/subscriptioncmds.c:394 +#: commands/subscriptioncmds.c:401 commands/subscriptioncmds.c:423 +#: commands/subscriptioncmds.c:439 #, c-format msgid "%s and %s are mutually exclusive options" msgstr "%s 옵션과 %s ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:239 commands/subscriptioncmds.c:245 +#: commands/subscriptioncmds.c:429 commands/subscriptioncmds.c:445 #, c-format msgid "subscription with %s must also set %s" msgstr "%s 구ë…하려면, %s ì„¤ì •ì´ í•„ìš”í•¨" -#: commands/subscriptioncmds.c:287 +#: commands/subscriptioncmds.c:506 #, c-format -msgid "publication name \"%s\" used more than once" -msgstr "\"%s\" 발행 ì´ë¦„ì´ ì—¬ëŸ¬ 번 사용 ë¨" +msgid "could not receive list of publications from the publisher: %s" +msgstr "발행ìžì—게서 발행 목ë¡ì„ ë°›ì„ ìˆ˜ ì—†ìŒ: %s" + +#: commands/subscriptioncmds.c:538 +#, c-format +msgid "publication %s does not exist on the publisher" +msgid_plural "publications %s do not exist on the publisher" +msgstr[0] "해당 발행ìžì—게는 \"%s\" ì´ë¦„ì˜ ë°œí–‰ì€ ì—†ìŠµë‹ˆë‹¤" + +#: commands/subscriptioncmds.c:626 +#, c-format +msgid "permission denied to create subscription" +msgstr "구ë…ì„ ë§Œë“¤ê¸° 위한 권한 ì—†ìŒ" -#: commands/subscriptioncmds.c:351 +#: commands/subscriptioncmds.c:627 #, c-format -msgid "must be superuser to create subscriptions" -msgstr "êµ¬ë… ë§Œë“¤ê¸°ëŠ” 슈í¼ìœ ì ¸ ê¶Œí•œì´ í•„ìš”í•©ë‹ˆë‹¤" +msgid "Only roles with privileges of the \"%s\" role may create subscriptions." +msgstr "\"%s\" ë¡¤ì´ ë¶€ì—¬ëœ ì‚¬ìš©ìžë§Œ 구ë…ì„ ë§Œë“¤ 수 있습니다." -#: commands/subscriptioncmds.c:442 commands/subscriptioncmds.c:530 -#: replication/logical/tablesync.c:857 replication/logical/worker.c:2096 +#: commands/subscriptioncmds.c:758 commands/subscriptioncmds.c:891 +#: commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1345 +#: replication/logical/worker.c:4503 #, c-format msgid "could not connect to the publisher: %s" msgstr "발행 ì„œë²„ì— ì—°ê²° í•  수 ì—†ìŒ: %s" -#: commands/subscriptioncmds.c:484 +#: commands/subscriptioncmds.c:829 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì´ ì—†ìŠµë‹ˆë‹¤" -#. translator: %s is an SQL ALTER statement -#: commands/subscriptioncmds.c:497 +#: commands/subscriptioncmds.c:841 #, c-format -msgid "" -"tables were not subscribed, you will have to run %s to subscribe the tables" -msgstr "" -"구ë…하고 있는 í…Œì´ë¸”ì´ ì—†ìŠµë‹ˆë‹¤, %s 명령으로 í…Œì´ë¸”ì„ êµ¬ë…í•  수 있습니다" +msgid "subscription was created, but is not connected" +msgstr "구ë…ì„ ë§Œë“¤ì—ˆì§€ë§Œ, 발행 서버로 ì ‘ì†ì€ 안했습니다." -#: commands/subscriptioncmds.c:586 +#: commands/subscriptioncmds.c:842 #, c-format -msgid "table \"%s.%s\" added to subscription \"%s\"" -msgstr "\"%s.%s\" í…Œì´ë¸”ì„ \"%s\" 구ë…ì— ì¶”ê°€í–ˆìŠµë‹ˆë‹¤" +msgid "" +"To initiate replication, you must manually create the replication slot, " +"enable the subscription, and refresh the subscription." +msgstr "" +"복제 초기화 ìž‘ì—…ì€ ë¨¼ì € 수ë™ìœ¼ë¡œ 복제 ìŠ¬ë¡¯ì„ ë§Œë“¤ê³ , 구ë…ì„ í™œì„±í™”í•˜ê³ , 해당 " +"구ë…ì„ ìƒˆë¡œê³ ì¹¨ 하는 순서로 진행합니다." -#: commands/subscriptioncmds.c:610 +#: commands/subscriptioncmds.c:1109 commands/subscriptioncmds.c:1590 +#: commands/subscriptioncmds.c:1973 utils/cache/lsyscache.c:3684 #, c-format -msgid "table \"%s.%s\" removed from subscription \"%s\"" -msgstr "\"%s.%s\" í…Œì´ë¸”ì„ \"%s\" 구ë…ì—서 삭제했습니다" +msgid "subscription \"%s\" does not exist" +msgstr "\"%s\" ì´ë¦„ì˜ êµ¬ë…ì€ ì—†ìŠµë‹ˆë‹¤." -#: commands/subscriptioncmds.c:682 +#: commands/subscriptioncmds.c:1166 commands/subscriptioncmds.c:1245 #, c-format msgid "cannot set %s for enabled subscription" msgstr "êµ¬ë… í™œì„±í™”ë¥¼ 위해서는 %s ì„¤ì •ì€ í•  수 ì—†ìŒ" -#: commands/subscriptioncmds.c:717 +#: commands/subscriptioncmds.c:1233 +#, c-format +msgid "" +"cannot set option \"%s\" for a subscription that does not have a slot name" +msgstr "슬롯 ì´ë¦„ ì—†ì´ëŠ” 구ë…ì— \"%s\" ì˜µì…˜ì„ ì§€ì •í•  수 ì—†ìŒ" + +#: commands/subscriptioncmds.c:1279 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "슬롯 ì´ë¦„ ì—†ì´ëŠ” 구ë…ì„ í™œì„±í™” í•  수 ì—†ìŒ" -#: commands/subscriptioncmds.c:763 +#: commands/subscriptioncmds.c:1323 commands/subscriptioncmds.c:1374 #, c-format msgid "" "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" @@ -9348,14 +11142,42 @@ msgstr "" "비활성화 ìƒíƒœì¸ 구ë…ì— ëŒ€í•´ì„œëŠ” ALTER SUBSCRIPTION 명령으로 갱신할 수 없습니" "다" -#: commands/subscriptioncmds.c:764 +#: commands/subscriptioncmds.c:1324 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "" -"ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false) ëª…ë ¹ì„ " -"사용하세요." +"ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false) ëª…ë ¹ì„ ì‚¬ìš©" +"하세요." + +#: commands/subscriptioncmds.c:1333 commands/subscriptioncmds.c:1388 +#, c-format +msgid "" +"ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase " +"is enabled" +msgstr "" +"two_phase ê°’ì´ trueì¸ ìƒíƒœì—서는 ALTER SUBSCRIPTION 명령ì—서 refresh나 " +"copy_data ì˜µì…˜ì„ ì‚¬ìš©í•  수 없습니다." + +#: commands/subscriptioncmds.c:1334 +#, c-format +msgid "" +"Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with " +"copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "" +"ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH ë‹¤ìŒ refresh = false ë˜ëŠ” " +"copy_data = false êµ¬ë¬¸ì„ ì¶”ê°€í•˜ê±°ë‚˜ DROP/CREATE SUBSCRIPTION ìž‘ì—…ì„ í•˜ì„¸ìš”." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1390 +#, c-format +msgid "" +"Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE " +"SUBSCRIPTION." +msgstr "" +"%s 명령ì—서 refresh = false ë˜ëŠ” copy_data = false ì˜µì…˜ì„ ì¶”ê°€í•˜ê±°ë‚˜, DROP/" +"CREATE SUBSCRIPTION ìž‘ì—…ì„ í•˜ì„¸ìš”." -#: commands/subscriptioncmds.c:782 +#: commands/subscriptioncmds.c:1412 #, c-format msgid "" "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" @@ -9363,212 +11185,298 @@ msgstr "" "비활성화 ìƒíƒœì¸ 구ë…ì— ëŒ€í•´ì„œëŠ” ALTER SUBSCRIPTION ... REFRESH ëª…ë ¹ì„ í—ˆìš©í•˜" "ì§€ 않습니다." -#: commands/subscriptioncmds.c:862 +#: commands/subscriptioncmds.c:1437 +#, c-format +msgid "" +"ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase " +"is enabled" +msgstr "" +"two_phase ê°’ì´ trueì¸ ìƒíƒœì—서는 ALTER SUBSCRIPTION 명령ì—서 copy_data 옵션" +"ì„ ì‚¬ìš©í•  수 없습니다." + +#: commands/subscriptioncmds.c:1438 +#, c-format +msgid "" +"Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/" +"CREATE SUBSCRIPTION." +msgstr "" +"ALTER SUBSCRIPTION ... REFRESH ë‹¤ìŒ copy_data = false êµ¬ë¬¸ì„ ì¶”ê°€í•˜ê±°ë‚˜ DROP/" +"CREATE SUBSCRIPTION ìž‘ì—…ì„ í•˜ì„¸ìš”." + +#: commands/subscriptioncmds.c:1473 +#, c-format +msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" +msgstr "" +"WAL 위치 (LSN %X/%X)를 건너뛰려면, ê·¸ ê°’ì´ ì›ë³¸ LSN %X/%X 보다 커야합니다" + +#: commands/subscriptioncmds.c:1594 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "\"%s\" êµ¬ë… ì—†ìŒ, 건너뜀" -#: commands/subscriptioncmds.c:987 +#: commands/subscriptioncmds.c:1863 +#, c-format +msgid "dropped replication slot \"%s\" on publisher" +msgstr "발행ì—서 \"%s\" 복제 ìŠ¬ë¡¯ì„ ì‚­ì œí–ˆìŒ" + +#: commands/subscriptioncmds.c:1872 commands/subscriptioncmds.c:1880 +#, c-format +msgid "could not drop replication slot \"%s\" on publisher: %s" +msgstr "발행용 \"%s\" 복제 ìŠ¬ë¡¯ì„ ì‚­ì œ í•  수 ì—†ìŒ: %s" + +#: commands/subscriptioncmds.c:2005 +#, c-format +msgid "subscription with OID %u does not exist" +msgstr "OID %u êµ¬ë… ì—†ìŒ" + +#: commands/subscriptioncmds.c:2076 commands/subscriptioncmds.c:2201 +#, c-format +msgid "could not receive list of replicated tables from the publisher: %s" +msgstr "해당 발행ìžë¡œë¶€í„° 복제 í…Œì´ë¸” 목ë¡ì„ 구할 수 ì—†ìŒ: %s" + +#: commands/subscriptioncmds.c:2112 #, c-format msgid "" -"could not connect to publisher when attempting to drop the replication slot " -"\"%s\"" -msgstr "\"%s\" 복제 ìŠ¬ë¡¯ì„ ì‚­ì œí•˜ëŠ” 중ì—는 발행 서버로 ì ‘ì†í•  수 ì—†ìŒ" +"subscription \"%s\" requested copy_data with origin = NONE but might copy " +"data that had a different origin" +msgstr "" +"\"%s\" 구ë…ì´ copy_data 옵션과 origin = NONE ì„¤ì •ì„ ìš”êµ¬í–ˆì§€ë§Œ, copy ìžë£Œê°€ " +"다른 오리진 것입니다." + +#: commands/subscriptioncmds.c:2114 +#, c-format +msgid "" +"The subscription being created subscribes to a publication (%s) that " +"contains tables that are written to by other subscriptions." +msgid_plural "" +"The subscription being created subscribes to publications (%s) that contain " +"tables that are written to by other subscriptions." +msgstr[0] "" +"만들어질 구ë…ì€ ë‹¤ë¥¸ 구ë…ì— ì˜í•´ 쓰여진 í…Œì´ë¸”ì´ í¬í•¨ëœ 발행(%s)ì„ êµ¬ë…합니다." + +#: commands/subscriptioncmds.c:2117 +#, c-format +msgid "" +"Verify that initial data copied from the publisher tables did not come from " +"other origins." +msgstr "" +"ë³µì‚¬ëœ ì´ˆê¸° ìžë£Œê°€ 해당 ë°œí–‰ì˜ ë‹¤ë¥¸ 오리진ì—서 복사ë˜ì—ˆëŠ”ì§€ 확ì¸í•˜ì„¸ìš”." + +#: commands/subscriptioncmds.c:2223 replication/logical/tablesync.c:906 +#: replication/pgoutput/pgoutput.c:1143 +#, c-format +msgid "" +"cannot use different column lists for table \"%s.%s\" in different " +"publications" +msgstr "" +"서로 다른 발행ì—서 \"%s.%s\" í…Œì´ë¸”ì— ëŒ€í•œ 서로 다른 칼럼 목ë¡ì„ 사용할 수 ì—†" +"ìŒ." -#: commands/subscriptioncmds.c:989 commands/subscriptioncmds.c:1004 -#: replication/logical/tablesync.c:906 replication/logical/tablesync.c:928 +#: commands/subscriptioncmds.c:2273 #, c-format -msgid "The error was: %s" -msgstr "해당 오류: %s" +msgid "" +"could not connect to publisher when attempting to drop replication slot " +"\"%s\": %s" +msgstr "\"%s\" 복제 ìŠ¬ë¡¯ì„ ì‚­ì œí•˜ëŠ” 중ì—는 발행 서버로 ì ‘ì†í•  수 ì—†ìŒ: %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:991 +#: commands/subscriptioncmds.c:2276 #, c-format -msgid "Use %s to disassociate the subscription from the slot." -msgstr "구ë…ê³¼ ìŠ¬ë¡¯ì„ ë¶„ë¦¬í•  때는 %s ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." +msgid "" +"Use %s to disable the subscription, and then use %s to disassociate it from " +"the slot." +msgstr "" +"구ë…ì„ ì¤‘ì§€í•˜ë ¤ë©´ %s ëª…ë ¹ì„ í•œ ë’¤, 슬롯 관계를 ëŠê¸° 위해 %s ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸" +"ìš”." -#: commands/subscriptioncmds.c:1002 +#: commands/subscriptioncmds.c:2307 #, c-format -msgid "could not drop the replication slot \"%s\" on publisher" -msgstr "발행용 \"%s\" 복제 ìŠ¬ë¡¯ì„ ì‚­ì œ í•  수 ì—†ìŒ" +msgid "publication name \"%s\" used more than once" +msgstr "\"%s\" 발행 ì´ë¦„ì´ ì—¬ëŸ¬ 번 사용 ë¨" -#: commands/subscriptioncmds.c:1007 +#: commands/subscriptioncmds.c:2351 #, c-format -msgid "dropped replication slot \"%s\" on publisher" -msgstr "발행ì—서 \"%s\" 복제 ìŠ¬ë¡¯ì„ ì‚­ì œí–ˆìŒ" +msgid "publication \"%s\" is already in subscription \"%s\"" +msgstr "\"%s\" ì´ë¦„ì˜ ë°œí–‰ì´ \"%s\" êµ¬ë… ì•ˆì— ì´ë¯¸ 있습니다" -#: commands/subscriptioncmds.c:1044 +#: commands/subscriptioncmds.c:2365 #, c-format -msgid "permission denied to change owner of subscription \"%s\"" -msgstr "\"%s\" êµ¬ë… ì†Œìœ ì£¼ë¥¼ 변경할 ê¶Œí•œì´ ì—†ìŒ" +msgid "publication \"%s\" is not in subscription \"%s\"" +msgstr "\"%s\" ë°œí–‰ì´ \"%s\" êµ¬ë… ì•ˆì— ì—†ìŠµë‹ˆë‹¤" -#: commands/subscriptioncmds.c:1046 +#: commands/subscriptioncmds.c:2376 #, c-format -msgid "The owner of a subscription must be a superuser." -msgstr "êµ¬ë… ì†Œìœ ì£¼ëŠ” 슈í¼ìœ ì €ì—¬ì•¼ 합니다." +msgid "cannot drop all the publications from a subscription" +msgstr "한 구ë…ì•ˆì— ìžˆëŠ” 모든 ë°œí–‰ì€ ì§€ìš¸ 수 ì—†ìŒ" -#: commands/subscriptioncmds.c:1161 +#: commands/subscriptioncmds.c:2433 #, c-format -msgid "could not receive list of replicated tables from the publisher: %s" -msgstr "구ë…ì—서 복제 í…Œì´ë¸” 목ë¡ì„ 구할 수 ì—†ìŒ: %s" +msgid "%s requires a Boolean value or \"parallel\"" +msgstr "%s ê°’ì€ ë¶ˆë¦¬ì–¸ ê°’ ë˜ëŠ” \"parallel\" ì´ì–´ì•¼ 합니다." -#: commands/tablecmds.c:228 commands/tablecmds.c:270 +#: commands/tablecmds.c:255 commands/tablecmds.c:297 #, c-format msgid "table \"%s\" does not exist" msgstr "\"%s\" í…Œì´ë¸” ì—†ìŒ" -#: commands/tablecmds.c:229 commands/tablecmds.c:271 +#: commands/tablecmds.c:256 commands/tablecmds.c:298 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "\"%s\" í…Œì´ë¸” ì—†ìŒ, 무시함" -#: commands/tablecmds.c:231 commands/tablecmds.c:273 +#: commands/tablecmds.c:258 commands/tablecmds.c:300 msgid "Use DROP TABLE to remove a table." msgstr "í…Œì´ë¸”ì„ ì‚­ì œí•˜ë ¤ë©´, DROP TABLE ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: commands/tablecmds.c:234 +#: commands/tablecmds.c:261 #, c-format msgid "sequence \"%s\" does not exist" msgstr "\"%s\" 시퀀스 ì—†ìŒ" -#: commands/tablecmds.c:235 +#: commands/tablecmds.c:262 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "\"%s\" 시퀀스 ì—†ìŒ, 무시함" -#: commands/tablecmds.c:237 +#: commands/tablecmds.c:264 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "시퀀스를 삭제하려면 DROP SEQUENCE ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: commands/tablecmds.c:240 +#: commands/tablecmds.c:267 #, c-format msgid "view \"%s\" does not exist" msgstr "\"%s\" ë·°(view) ì—†ìŒ" -#: commands/tablecmds.c:241 +#: commands/tablecmds.c:268 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "\"%s\" ë·°(view) ì—†ìŒ, 무시함" -#: commands/tablecmds.c:243 +#: commands/tablecmds.c:270 msgid "Use DROP VIEW to remove a view." msgstr "뷰를 삭제하려면, DROP VIEW ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: commands/tablecmds.c:246 +#: commands/tablecmds.c:273 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ êµ¬ì²´í™”ëœ ë·°ê°€ ì—†ìŒ" -#: commands/tablecmds.c:247 +#: commands/tablecmds.c:274 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "\"%s\" êµ¬ì²´í™”ëœ ë·° ì—†ìŒ, 건너뜀" -#: commands/tablecmds.c:249 +#: commands/tablecmds.c:276 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "êµ¬ì²´í™”ëœ ë·°ë¥¼ 삭제하려면, DROP MATERIALIZED VIEW ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: commands/tablecmds.c:252 commands/tablecmds.c:276 commands/tablecmds.c:17231 -#: parser/parse_utilcmd.c:2172 +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19783 +#: parser/parse_utilcmd.c:2251 #, c-format msgid "index \"%s\" does not exist" msgstr "\"%s\" ì¸ë±ìФ ì—†ìŒ" -#: commands/tablecmds.c:253 commands/tablecmds.c:277 +#: commands/tablecmds.c:280 commands/tablecmds.c:304 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "\"%s\" ì¸ë±ìФ ì—†ìŒ, 무시함" -#: commands/tablecmds.c:255 commands/tablecmds.c:279 +#: commands/tablecmds.c:282 commands/tablecmds.c:306 msgid "Use DROP INDEX to remove an index." msgstr "ì¸ë±ìŠ¤ë¥¼ 삭제하려면, DROP INDEX ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:287 #, c-format msgid "\"%s\" is not a type" msgstr "\"%s\" 개체는 ìžë£Œí˜•ì´ ì•„ë‹˜" -#: commands/tablecmds.c:261 +#: commands/tablecmds.c:288 msgid "Use DROP TYPE to remove a type." msgstr "ìžë£Œí˜•ì„ ì‚­ì œí•˜ë ¤ë©´ DROP TYPE ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: commands/tablecmds.c:264 commands/tablecmds.c:12383 -#: commands/tablecmds.c:14838 +#: commands/tablecmds.c:291 commands/tablecmds.c:14325 +#: commands/tablecmds.c:16886 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "\"%s\" 외부 í…Œì´ë¸” ì—†ìŒ" -#: commands/tablecmds.c:265 +#: commands/tablecmds.c:292 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "\"%s\" 외부 í…Œì´ë¸” ì—†ìŒ, 건너뜀" -#: commands/tablecmds.c:267 +#: commands/tablecmds.c:294 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "외부 í…Œì´ë¸”ì„ ì‚­ì œí•˜ë ¤ë©´, DROP FOREIGN TABLE ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: commands/tablecmds.c:620 +#: commands/tablecmds.c:734 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT ì˜µì…˜ì€ ìž„ì‹œ í…Œì´ë¸”ì—서만 ì‚¬ìš©ë  ìˆ˜ 있습니다" -#: commands/tablecmds.c:651 +#: commands/tablecmds.c:765 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "보안 제한 작업 ë‚´ì—서 임시 í…Œì´ë¸”ì„ ë§Œë“¤ 수 ì—†ìŒ" -#: commands/tablecmds.c:687 commands/tablecmds.c:13742 +#: commands/tablecmds.c:801 commands/tablecmds.c:15745 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "\"%s\" í…Œì´ë¸”ì´ ì—¬ëŸ¬ 번 ìƒì†ë¨" -#: commands/tablecmds.c:868 -#, c-format -msgid "" -"specifying a table access method is not supported on a partitioned table" -msgstr "í…Œì´ë¸” ì ‘ê·¼ ë°©ë²•ì€ íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì—서는 사용할 수 ì—†ìŒ" - -#: commands/tablecmds.c:964 +#: commands/tablecmds.c:1067 #, c-format msgid "\"%s\" is not partitioned" msgstr "\"%s\" 파티션 ëœ í…Œì´ë¸” 아님" -#: commands/tablecmds.c:1058 +#: commands/tablecmds.c:1161 #, c-format msgid "cannot partition using more than %d columns" msgstr "%d개보다 ë§Žì€ ì¹¼ëŸ¼ì„ ì´ìš©í•´ì„œ 파티션할 수 ì—†ìŒ" -#: commands/tablecmds.c:1114 +#: commands/tablecmds.c:1217 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "\"%s\" íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì˜ ì™¸ë¶€ íŒŒí‹°ì…˜ì„ ë§Œë“¤ 수 ì—†ìŒ" -#: commands/tablecmds.c:1116 +#: commands/tablecmds.c:1219 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "\"%s\" í…Œì´ë¸”ì€ ìœ ë‹ˆí¬ ì¸ë±ìŠ¤ë¥¼ í¬í•¨ 하고 있ìŒ." -#: commands/tablecmds.c:1279 +#: commands/tablecmds.c:1338 commands/tablecmds.c:13341 +#, c-format +msgid "too many array dimensions" +msgstr "너무 ë§Žì€ ë°°ì—´ 차수" + +#: commands/tablecmds.c:1343 parser/parse_clause.c:774 +#: parser/parse_relation.c:1912 +#, c-format +msgid "column \"%s\" cannot be declared SETOF" +msgstr "\"%s\" ì¹¼ëŸ¼ì€ SETOF를 지정할 수 없습니다" + +#: commands/tablecmds.c:1489 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY ëª…ë ¹ì€ í•˜ë‚˜ì˜ ì¸ë±ìŠ¤ë§Œ 지울 수 있습니다" -#: commands/tablecmds.c:1283 +#: commands/tablecmds.c:1493 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY 명령ì—서는 CASCADE ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: commands/tablecmds.c:1384 +#: commands/tablecmds.c:1597 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" -msgstr "\"%s\" íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì˜ ì¸ë±ìŠ¤ì— ëŒ€í•´ì„œëŠ” CONCURRENTLY ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ" +msgstr "" +"\"%s\" íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì˜ ì¸ë±ìŠ¤ì— ëŒ€í•´ì„œëŠ” CONCURRENTLY ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: commands/tablecmds.c:1654 +#: commands/tablecmds.c:1885 #, c-format msgid "cannot truncate only a partitioned table" msgstr "파티션 ëœ í…Œì´ë¸”ë§Œ truncate í•  수 ì—†ìŒ" -#: commands/tablecmds.c:1655 +#: commands/tablecmds.c:1886 #, c-format msgid "" "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions " @@ -9577,33 +11485,38 @@ msgstr "" "ONLY ì˜µì…˜ì„ ë¹¼ê³  사용하거나, 하위 파티션 í…Œì´ë¸”ì„ ëŒ€ìƒìœ¼ë¡œ ì§ì ‘ TRUNCATE " "ONLY ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: commands/tablecmds.c:1724 +#: commands/tablecmds.c:1959 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "\"%s\" ê°œì²´ì˜ ìžë£Œë„ 함께 ì‚­ì œë¨" -#: commands/tablecmds.c:2031 +#: commands/tablecmds.c:2320 +#, c-format +msgid "cannot truncate foreign table \"%s\"" +msgstr "\"%s\" 외부 í…Œì´ë¸”ì— ìžë£Œë¥¼ 비울 수 ì—†ìŒ" + +#: commands/tablecmds.c:2377 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸” ìžë£ŒëŠ” 비울(truncate) 수 없습니다" -#: commands/tablecmds.c:2259 commands/tablecmds.c:13639 +#: commands/tablecmds.c:2606 commands/tablecmds.c:15642 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "\"%s\" 파티션 ëœ í…Œì´ë¸”로부터 ìƒì†í•  수 없습니다" -#: commands/tablecmds.c:2264 +#: commands/tablecmds.c:2611 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "\"%s\" 파티션 í…Œì´ë¸”입니다, 그래서 ìƒì† 대ìƒì´ ë  ìˆ˜ 없습니다" -#: commands/tablecmds.c:2272 parser/parse_utilcmd.c:2402 -#: parser/parse_utilcmd.c:2544 +#: commands/tablecmds.c:2619 parser/parse_utilcmd.c:2481 +#: parser/parse_utilcmd.c:2623 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "ìƒì†í•  \"%s\" 릴레ì´ì…˜(relation)ì€ í…Œì´ë¸”ë„, 외부 í…Œì´ë¸”ë„ ì•„ë‹™ë‹ˆë‹¤" -#: commands/tablecmds.c:2284 +#: commands/tablecmds.c:2631 #, c-format msgid "" "cannot create a temporary relation as partition of permanent relation \"%s\"" @@ -9611,250 +11524,271 @@ msgstr "" "\"%s\" í…Œì´ë¸”ì€ ì¼ë°˜ í…Œì´ë¸”입니다. 임시 í…Œì´ë¸”ì„ ì´ê²ƒì˜ 파티션 í…Œì´ë¸”로 만들 " "수 없습니다" -#: commands/tablecmds.c:2293 commands/tablecmds.c:13618 +#: commands/tablecmds.c:2640 commands/tablecmds.c:15621 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "\"%s\" 임시 í…Œì´ë¸”입니다, 그래서 ìƒì† 대ìƒì´ ë  ìˆ˜ 없습니다" -#: commands/tablecmds.c:2303 commands/tablecmds.c:13626 +#: commands/tablecmds.c:2650 commands/tablecmds.c:15629 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸”입니다, 그래서 ìƒì† 대ìƒì´ ë  ìˆ˜ 없습니다" -#: commands/tablecmds.c:2357 +#: commands/tablecmds.c:2791 commands/tablecmds.c:2845 +#: commands/tablecmds.c:13024 parser/parse_utilcmd.c:1265 +#: parser/parse_utilcmd.c:1308 parser/parse_utilcmd.c:1735 +#: parser/parse_utilcmd.c:1843 #, c-format -msgid "merging multiple inherited definitions of column \"%s\"" -msgstr "\"%s\" ì¹¼ëŸ¼ì´ ì¤‘ë³µë˜ì–´ ìƒì†ë©ë‹ˆë‹¤." +msgid "cannot convert whole-row table reference" +msgstr "ì „ì²´ 로우 í…Œì´ë¸” 참조형으로 변환할 수 ì—†ìŒ" -#: commands/tablecmds.c:2365 +#: commands/tablecmds.c:2792 parser/parse_utilcmd.c:1266 #, c-format -msgid "inherited column \"%s\" has a type conflict" -msgstr "ìƒìœ„ í…Œì´ë¸”ì—서 지정한 \"%s\" ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ë“¤ì´ ì¼ì¹˜í•˜ì§€ 않습니다" +msgid "" +"Generation expression for column \"%s\" contains a whole-row reference to " +"table \"%s\"." +msgstr "" +"\"%s\" 칼럼용 미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ ìƒì„±ì‹ì— \"%s\" í…Œì´ë¸” ì „ì²´ 로우 참조가 있습니" +"다" -#: commands/tablecmds.c:2367 commands/tablecmds.c:2390 -#: commands/tablecmds.c:2639 commands/tablecmds.c:2669 -#: parser/parse_coerce.c:1935 parser/parse_coerce.c:1955 -#: parser/parse_coerce.c:1975 parser/parse_coerce.c:2030 -#: parser/parse_coerce.c:2107 parser/parse_coerce.c:2141 -#: parser/parse_param.c:218 +#: commands/tablecmds.c:2846 parser/parse_utilcmd.c:1309 #, c-format -msgid "%s versus %s" -msgstr "%s 형과 %s 형" +msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "\"%s\" ì œì•½ì¡°ê±´ì— \"%s\" í…Œì´ë¸” ì „ì²´ 로우 참조가 있습니다" -#: commands/tablecmds.c:2376 +#: commands/tablecmds.c:2956 commands/tablecmds.c:3227 #, c-format -msgid "inherited column \"%s\" has a collation conflict" -msgstr "ìƒì† ë°›ì€ \"%s\" ì¹¼ëŸ¼ì˜ ì •ë ¬ê·œì¹™ì—서 ì¶©ëŒí•©ë‹ˆë‹¤." +msgid "column \"%s\" inherits from generated column but specifies default" +msgstr "ìƒì† ë°›ì€ \"%s\" ì¹¼ëŸ¼ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ì¸ë°, ê¸°ë³¸ê°’ì´ ì„¤ì •ë˜ì–´ 있ìŒ" -#: commands/tablecmds.c:2378 commands/tablecmds.c:2651 -#: commands/tablecmds.c:6106 +#: commands/tablecmds.c:2961 commands/tablecmds.c:3232 #, c-format -msgid "\"%s\" versus \"%s\"" -msgstr "\"%s\" 형과 \"%s\" 형" +msgid "column \"%s\" inherits from generated column but specifies identity" +msgstr "" +"ìƒì† ë°›ì€ \"%s\" ì¹¼ëŸ¼ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ì¸ë°, ì¼ë ¨ë²ˆí˜¸ ì‹ë³„ ì˜µì…˜ì´ ìžˆìŒ" -#: commands/tablecmds.c:2388 +#: commands/tablecmds.c:2969 commands/tablecmds.c:3240 #, c-format -msgid "inherited column \"%s\" has a storage parameter conflict" -msgstr "ìƒì† ë°›ì€ \"%s\" ì¹¼ëŸ¼ì˜ ìŠ¤í† ë¦¬ì§€ 설정값ì—서 ì¶©ëŒí•©ë‹ˆë‹¤" +msgid "child column \"%s\" specifies generation expression" +msgstr "" +"\"%s\" ì¹¼ëŸ¼ì€ ìƒì† ë°›ì€ ì¹¼ëŸ¼ìž„. 미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì˜ ìƒì„±ì‹ì„ 사용할 수 ì—†ìŒ" -#: commands/tablecmds.c:2404 +#: commands/tablecmds.c:2971 commands/tablecmds.c:3242 #, c-format -msgid "inherited column \"%s\" has a generation conflict" +msgid "A child table column cannot be generated unless its parent column is." msgstr "" +"하위 í…Œì´ë¸”ì˜ ê³„ì‚°ëœ ì¹¼ëŸ¼ì€ ìƒìœ„ í…Œì´ë¸”ì—서 ì´ë¯¸ ê³„ì‚°ëœ ì¹¼ëŸ¼ì´ì–´ì•¼ 합니다." -#: commands/tablecmds.c:2490 commands/tablecmds.c:2545 -#: commands/tablecmds.c:11188 parser/parse_utilcmd.c:1252 -#: parser/parse_utilcmd.c:1295 parser/parse_utilcmd.c:1703 -#: parser/parse_utilcmd.c:1812 +#: commands/tablecmds.c:3017 #, c-format -msgid "cannot convert whole-row table reference" -msgstr "ì „ì²´ 로우 í…Œì´ë¸” 참조형으로 변환할 수 ì—†ìŒ" +msgid "column \"%s\" inherits conflicting generation expressions" +msgstr "ìƒì† 받는 \"%s\" ì¹¼ëŸ¼ì— ì§€ì •ëœ ë¯¸ë¦¬ ê³„ì‚°ëœ ìƒì„±ì‹ì´ ì¶©ëŒí•©ë‹ˆë‹¤" -#: commands/tablecmds.c:2491 parser/parse_utilcmd.c:1253 +#: commands/tablecmds.c:3019 #, c-format -msgid "" -"Generation expression for column \"%s\" contains a whole-row reference to " -"table \"%s\"." -msgstr "\"%s\" 칼럼용 미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ ìƒì„±ì‹ì— \"%s\" í…Œì´ë¸” ì „ì²´ 로우 참조가 있습니다" +msgid "To resolve the conflict, specify a generation expression explicitly." +msgstr "ì´ ì¶©ëŒì„ 피하려면, 명시ì ìœ¼ë¡œ 미리 ê³„ì‚°ëœ ìƒì„±ì‹ì„ 지정하십시오." -#: commands/tablecmds.c:2546 parser/parse_utilcmd.c:1296 +#: commands/tablecmds.c:3023 #, c-format -msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." -msgstr "\"%s\" ì œì•½ì¡°ê±´ì— \"%s\" í…Œì´ë¸” ì „ì²´ 로우 참조가 있습니다" +msgid "column \"%s\" inherits conflicting default values" +msgstr "ìƒì† 받는 \"%s\" ì¹¼ëŸ¼ì˜ default ê°’ì´ ì¶©ëŒí•¨" + +#: commands/tablecmds.c:3025 +#, c-format +msgid "To resolve the conflict, specify a default explicitly." +msgstr "ì´ ì¶©ëŒì„ 피하려면, default ê°’ì„ ë°”ë¥´ê²Œ 지정하십시오." + +#: commands/tablecmds.c:3080 +#, c-format +msgid "" +"check constraint name \"%s\" appears multiple times but with different " +"expressions" +msgstr "" +"\"%s\" ì²´í¬ ì œì•½ ì¡°ê±´ ì´ë¦„ì´ ì—¬ëŸ¬ 번 나타나지만, ê°ê° 다른 ì‹ìœ¼ë¡œ ë˜ì–´ìžˆìŒ" -#: commands/tablecmds.c:2625 +#: commands/tablecmds.c:3131 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "\"%s\" ì¹¼ëŸ¼ì„ ìƒì†ëœ ì •ì˜ì™€ 병합하는 중" -#: commands/tablecmds.c:2629 +#: commands/tablecmds.c:3135 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "\"%s\" ì¹¼ëŸ¼ì„ ìƒì†ëœ ì •ì˜ì™€ ì´ë™, 병합하는 중" -#: commands/tablecmds.c:2630 +#: commands/tablecmds.c:3136 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "ì‚¬ìš©ìž ì§€ì • ì¹¼ëŸ¼ì´ ìƒì†ëœ ì¹¼ëŸ¼ì˜ ìœ„ì¹˜ë¡œ ì´ë™ë˜ì—ˆìŠµë‹ˆë‹¤" -#: commands/tablecmds.c:2637 +#: commands/tablecmds.c:3148 #, c-format msgid "column \"%s\" has a type conflict" msgstr "\"%s\" ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ì´ ì¶©ëŒí•©ë‹ˆë‹¤" -#: commands/tablecmds.c:2649 +#: commands/tablecmds.c:3150 commands/tablecmds.c:3184 +#: commands/tablecmds.c:3200 commands/tablecmds.c:3307 +#: commands/tablecmds.c:3340 commands/tablecmds.c:3356 +#: parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 +#: parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 +#: parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 +#: parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 +#: parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 +#: parser/parse_param.c:223 +#, c-format +msgid "%s versus %s" +msgstr "%s 형과 %s 형" + +#: commands/tablecmds.c:3162 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "\"%s\" ì¹¼ëŸ¼ì˜ ì •ë ¬ê·œì¹™ì´ ì¶©ëŒí•©ë‹ˆë‹¤" -#: commands/tablecmds.c:2667 +#: commands/tablecmds.c:3164 commands/tablecmds.c:3326 +#: commands/tablecmds.c:7080 #, c-format -msgid "column \"%s\" has a storage parameter conflict" -msgstr "\"%s\" ì¹¼ëŸ¼ì˜ ìŠ¤í† ë¦¬ì§€ ì„¤ì •ê°’ì´ ì¶©ëŒí•©ë‹ˆë‹¤" +msgid "\"%s\" versus \"%s\"" +msgstr "\"%s\" 형과 \"%s\" 형" -#: commands/tablecmds.c:2695 +#: commands/tablecmds.c:3182 #, c-format -msgid "child column \"%s\" specifies generation expression" -msgstr "" -"\"%s\" ì¹¼ëŸ¼ì€ ìƒì† ë°›ì€ ì¹¼ëŸ¼ìž„. 미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì˜ ìƒì„±ì‹ì„ 사용할 수 ì—†ìŒ" +msgid "column \"%s\" has a storage parameter conflict" +msgstr "\"%s\" ì¹¼ëŸ¼ì˜ ìŠ¤í† ë¦¬ì§€ ì„¤ì •ê°’ì´ ì¶©ëŒí•©ë‹ˆë‹¤" -#: commands/tablecmds.c:2697 +#: commands/tablecmds.c:3198 commands/tablecmds.c:3354 #, c-format -msgid "" -"Omit the generation expression in the definition of the child table column " -"to inherit the generation expression from the parent table." -msgstr "" +msgid "column \"%s\" has a compression method conflict" +msgstr "\"%s\" ì¹¼ëŸ¼ì˜ ì••ì¶• ë°©ë²•ì´ ì¶©ëŒí•©ë‹ˆë‹¤" -#: commands/tablecmds.c:2701 +#: commands/tablecmds.c:3293 #, c-format -msgid "column \"%s\" inherits from generated column but specifies default" -msgstr "ìƒì† ë°›ì€ \"%s\" ì¹¼ëŸ¼ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ì¸ë°, ê¸°ë³¸ê°’ì´ ì„¤ì •ë˜ì–´ 있ìŒ" +msgid "merging multiple inherited definitions of column \"%s\"" +msgstr "\"%s\" ì¹¼ëŸ¼ì´ ì¤‘ë³µë˜ì–´ ìƒì†ë©ë‹ˆë‹¤." -#: commands/tablecmds.c:2706 +#: commands/tablecmds.c:3305 #, c-format -msgid "column \"%s\" inherits from generated column but specifies identity" -msgstr "ìƒì† ë°›ì€ \"%s\" ì¹¼ëŸ¼ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ì¸ë°, ì¼ë ¨ë²ˆí˜¸ ì‹ë³„ ì˜µì…˜ì´ ìžˆìŒ" +msgid "inherited column \"%s\" has a type conflict" +msgstr "ìƒìœ„ í…Œì´ë¸”ì—서 지정한 \"%s\" ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ë“¤ì´ ì¼ì¹˜í•˜ì§€ 않습니다" -#: commands/tablecmds.c:2815 +#: commands/tablecmds.c:3324 #, c-format -msgid "column \"%s\" inherits conflicting generation expressions" -msgstr "" -"ìƒì† 받는 \"%s\" ì¹¼ëŸ¼ì— ì§€ì •ëœ ë¯¸ë¦¬ ê³„ì‚°ëœ ìƒì„±ì‹ì´ ì¶©ëŒí•¨" -"다" +msgid "inherited column \"%s\" has a collation conflict" +msgstr "ìƒì† ë°›ì€ \"%s\" ì¹¼ëŸ¼ì˜ ì •ë ¬ê·œì¹™ì—서 ì¶©ëŒí•©ë‹ˆë‹¤." -#: commands/tablecmds.c:2820 +#: commands/tablecmds.c:3338 #, c-format -msgid "column \"%s\" inherits conflicting default values" -msgstr "ìƒì† 받는 \"%s\" ì¹¼ëŸ¼ì˜ default ê°’ì´ ì¶©ëŒí•¨" +msgid "inherited column \"%s\" has a storage parameter conflict" +msgstr "ìƒì† ë°›ì€ \"%s\" ì¹¼ëŸ¼ì˜ ìŠ¤í† ë¦¬ì§€ 설정값ì—서 ì¶©ëŒí•©ë‹ˆë‹¤" -#: commands/tablecmds.c:2822 +#: commands/tablecmds.c:3366 #, c-format -msgid "To resolve the conflict, specify a default explicitly." -msgstr "ì´ ì¶©ëŒì„ 피하려면, default ê°’ì„ ë°”ë¥´ê²Œ 지정하십시오." +msgid "inherited column \"%s\" has a generation conflict" +msgstr "ìƒì†ëœ \"%s\" ì¹¼ëŸ¼ì— ëŒ€í•œ ìƒì„± ì¶©ëŒ ë°œìƒ" -#: commands/tablecmds.c:2868 +#: commands/tablecmds.c:3597 #, c-format -msgid "" -"check constraint name \"%s\" appears multiple times but with different " -"expressions" -msgstr "" -"\"%s\" ì²´í¬ ì œì•½ ì¡°ê±´ ì´ë¦„ì´ ì—¬ëŸ¬ 번 나타나지만, ê°ê° 다른 ì‹ìœ¼ë¡œ ë˜ì–´ìžˆìŒ" +msgid "cannot move temporary tables of other sessions" +msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸”ë“¤ì€ ì´ë™í•  수 없습니다" -#: commands/tablecmds.c:3045 +#: commands/tablecmds.c:3670 #, c-format msgid "cannot rename column of typed table" msgstr "칼럼 ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ" -#: commands/tablecmds.c:3064 +#: commands/tablecmds.c:3689 #, c-format -msgid "" -"\"%s\" is not a table, view, materialized view, composite type, index, or " -"foreign table" -msgstr "" -"\"%s\" 개체는 í…Œì´ë¸”ë„, ë·°ë„, êµ¬ì²´í™”ëœ ë·°ë„, 복합 ìžë£Œí˜•ë„, ì¸ë±ìФë„, 외부 í…Œ" -"ì´ë¸”ë„ ì•„ë‹™ë‹ˆë‹¤." +msgid "cannot rename columns of relation \"%s\"" +msgstr "\"%s\" 릴레ì´ì…˜ì˜ 칼럼 ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ" -#: commands/tablecmds.c:3158 +#: commands/tablecmds.c:3784 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "하위 í…Œì´ë¸”ì—ì„œë„ ìƒì†ëœ \"%s\" ì¹¼ëŸ¼ì˜ ì´ë¦„ì„ ë°”ê¾¸ì–´ì•¼ 함" -#: commands/tablecmds.c:3190 +#: commands/tablecmds.c:3816 #, c-format msgid "cannot rename system column \"%s\"" msgstr "\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼ì€ ì‹œìŠ¤í…œ 칼럼입니다, ì´ë¦„ì„ ë°”ê¿€ 수 없습니다" -#: commands/tablecmds.c:3205 +#: commands/tablecmds.c:3831 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼ì€ ìƒì† ë°›ì€ ì¹¼ëŸ¼ìž…ë‹ˆë‹¤, ì´ë¦„ì„ ë°”ê¿€ 수 없습니다" -#: commands/tablecmds.c:3357 +#: commands/tablecmds.c:3983 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "" "하위 í…Œì´ë¸”ì—ì„œë„ ìƒì†ëœ \"%s\" ì œì•½ì¡°ê±´ì€ í•˜ìœ„ í…Œì´ë¸”ì—ì„œë„ ì´ë¦„ì´ ë°”ë€Œì–´ì•¼ " "함" -#: commands/tablecmds.c:3364 +#: commands/tablecmds.c:3990 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "\"%s\" ìƒì†ëœ ì œì•½ì¡°ê±´ì€ ì´ë¦„ì„ ë°”ê¿€ 수 없습니다" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3597 +#: commands/tablecmds.c:4290 #, c-format msgid "" "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "ì´ ì„¸ì…˜ì˜ í™œì„± 쿼리ì—서 사용 중ì´ë¯€ë¡œ %s \"%s\" ìž‘ì—…ì„ í•  수 ì—†ìŒ" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:3606 +#: commands/tablecmds.c:4299 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "보류 ì¤‘ì¸ íŠ¸ë¦¬ê±° ì´ë²¤íŠ¸ê°€ 있으므로 %s \"%s\" ìž‘ì—…ì„ í•  수 ì—†ìŒ" -#: commands/tablecmds.c:4237 commands/tablecmds.c:4252 +#: commands/tablecmds.c:4325 +#, c-format +msgid "cannot alter temporary tables of other sessions" +msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸”ì— ëŒ€í•´ì„œëŠ” alter ìž‘ì—…ì„ í•  수 ì—†ìŒ" + +#: commands/tablecmds.c:4798 +#, c-format +msgid "cannot alter partition \"%s\" with an incomplete detach" +msgstr "" +"\"%s\" 파티션 í…Œì´ë¸”ì€ ë¶ˆì™„ì „í•œ detach ìƒíƒœì´ê¸°ì— alter ìž‘ì—…ì„ í•  수 ì—†ìŒ" + +#: commands/tablecmds.c:5002 commands/tablecmds.c:5017 #, c-format msgid "cannot change persistence setting twice" msgstr "로그 사용/미사용 ì˜µì…˜ì„ ì¤‘ë³µ 해서 지정했ìŒ" -#: commands/tablecmds.c:4969 +#: commands/tablecmds.c:5038 +#, c-format +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "다중 SET ACCESS METHOD êµ¬ë¬¸ì€ ì‚¬ìš©í•  수 ì—†ìŒ" + +#: commands/tablecmds.c:5768 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "\"%s\" 시스템 릴레ì´ì…˜ì„ 다시 쓰기(rewrite) í•  수 ì—†ìŒ" -#: commands/tablecmds.c:4975 +#: commands/tablecmds.c:5774 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "카탈로그 í…Œì´ë¸”로 사용ë˜ì–´ \"%s\" í…Œì´ë¸”ì„ rewrite 못함" -#: commands/tablecmds.c:4985 +#: commands/tablecmds.c:5786 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸”ì„ ë‹¤ì‹œ 쓰기(rewrite) í•  수 ì—†ìŒ" -#: commands/tablecmds.c:5274 -#, c-format -msgid "rewriting table \"%s\"" -msgstr "\"%s\" íŒŒì¼ ë‹¤ì‹œ 쓰는 중" - -#: commands/tablecmds.c:5278 -#, c-format -msgid "verifying table \"%s\"" -msgstr "\"%s\" íŒŒì¼ ê²€ì‚¬ 중" - -#: commands/tablecmds.c:5443 +#: commands/tablecmds.c:6281 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "\"%s\" ì—´(해당 릴레ì´ì…˜ \"%s\")ì˜ ìžë£Œ ê°€ìš´ë° null ê°’ì´ ìžˆìŠµë‹ˆë‹¤" -#: commands/tablecmds.c:5460 +#: commands/tablecmds.c:6298 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" -msgstr "\"%s\" ì²´í¬ ì œì•½ ì¡°ê±´(해당 릴레ì´ì…˜ \"%s\")ì„ ìœ„ë°˜í•˜ëŠ” 몇몇 ìžë£Œê°€ 있습니다" +msgstr "" +"\"%s\" ì²´í¬ ì œì•½ ì¡°ê±´(해당 릴레ì´ì…˜ \"%s\")ì„ ìœ„ë°˜í•˜ëŠ” 몇몇 ìžë£Œê°€ 있습니다" -#: commands/tablecmds.c:5479 partitioning/partbounds.c:3235 +#: commands/tablecmds.c:6317 partitioning/partbounds.c:3387 #, c-format msgid "" "updated partition constraint for default partition \"%s\" would be violated " @@ -9862,311 +11796,295 @@ msgid "" msgstr "" "몇몇 ìžë£Œê°€ \"%s\" 기본 파티션용ì—서 ë³€ê²½ëœ íŒŒí‹°ì…˜ ì œì•½ì¡°ê±´ì„ ìœ„ë°°í•œ 것 ê°™ìŒ" -#: commands/tablecmds.c:5485 +#: commands/tablecmds.c:6323 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "\"%s\" 릴레ì´ì…˜ì˜ 파티션 제약 ì¡°ê±´ì„ ìœ„ë°˜í•˜ëŠ” 몇몇 ìžë£Œê°€ 있습니다" -#: commands/tablecmds.c:5632 commands/trigger.c:1200 commands/trigger.c:1306 -#, c-format -msgid "\"%s\" is not a table, view, or foreign table" -msgstr "\"%s\" 개체는 í…Œì´ë¸”, ë·°, 외부 í…Œì´ë¸” ê·¸ ì–´ëŠ ê²ƒë„ ì•„ë‹™ë‹ˆë‹¤" - -#: commands/tablecmds.c:5635 -#, c-format -msgid "\"%s\" is not a table, view, materialized view, or index" -msgstr "\"%s\" 개체는 í…Œì´ë¸”, ë·°, êµ¬ì²´í™”ëœ ë·°, ì¸ë±ìФ ê·¸ ì–´ëŠ ê²ƒë„ ì•„ë‹™ë‹ˆë‹¤" - -#: commands/tablecmds.c:5641 -#, c-format -msgid "\"%s\" is not a table, materialized view, or index" -msgstr "\"%s\" 개체는 í…Œì´ë¸”, êµ¬ì²´í™”ëœ ë·°, ì¸ë±ìФ ê·¸ ì–´ëŠ ê²ƒë„ ì•„ë‹™ë‹ˆë‹¤" - -#: commands/tablecmds.c:5644 -#, c-format -msgid "\"%s\" is not a table, materialized view, or foreign table" -msgstr "\"%s\" 개체는 í…Œì´ë¸”, êµ¬ì²´í™”ëœ ë·°, 외부 í…Œì´ë¸” ê·¸ ì–´ëŠ ê²ƒë„ ì•„ë‹™ë‹ˆë‹¤." - -#: commands/tablecmds.c:5647 -#, c-format -msgid "\"%s\" is not a table or foreign table" -msgstr "\"%s\" 개체는 í…Œì´ë¸”ë„ ì™¸ë¶€ í…Œì´ë¸”ë„ ì•„ë‹™ë‹ˆë‹¤" - -#: commands/tablecmds.c:5650 -#, c-format -msgid "\"%s\" is not a table, composite type, or foreign table" -msgstr "\"%s\" 개체는 í…Œì´ë¸”, 복합 ìžë£Œí˜•, 외부 í…Œì´ë¸” ê·¸ ì–´ëŠ ê²ƒë„ ì•„ë‹™ë‹ˆë‹¤." - -#: commands/tablecmds.c:5653 -#, c-format -msgid "\"%s\" is not a table, materialized view, index, or foreign table" -msgstr "" -"\"%s\" 개체는 í…Œì´ë¸”, êµ¬ì²´í™”ëœ ë·°, ì¸ë±ìФ, 외부 í…Œì´ë¸” ê·¸ ì–´ëŠ ê²ƒë„ ì•„ë‹™ë‹ˆë‹¤." - -#: commands/tablecmds.c:5663 +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6588 #, c-format -msgid "\"%s\" is of the wrong type" -msgstr "\"%s\" 개체는 ìž˜ëª»ëœ ê°œì²´í˜•ìž…ë‹ˆë‹¤." +msgid "ALTER action %s cannot be performed on relation \"%s\"" +msgstr "%s ALTER ìž‘ì—…ì€ \"%s\" 릴레ì´ì…˜ 대ìƒìœ¼ë¡œ 수행할 수 ì—†ìŒ" -#: commands/tablecmds.c:5866 commands/tablecmds.c:5873 +#: commands/tablecmds.c:6843 commands/tablecmds.c:6850 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" -msgstr "\"%s\" ìžë£Œí˜• 변경할 수 ì—†ìŒ(\"%s.%s\" 칼럼ì—서 해당 형ì‹ì„ 사용함)" +msgstr "\"%s\" ìžë£Œí˜• 바꿀 수 ì—†ìŒ(\"%s.%s\" 칼럼ì—서 해당 형ì‹ì„ 사용함)" -#: commands/tablecmds.c:5880 +#: commands/tablecmds.c:6857 #, c-format msgid "" "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "" -"\"%s\" 외부 í…Œì´ë¸”ì„ ë³€ê²½í•  수 ì—†ìŒ(\"%s.%s\" 칼럼ì—서 해당 로우 í˜•ì„ ì‚¬ìš©í•¨)" +"\"%s\" 외부 í…Œì´ë¸”ì„ ë°”ê¿€ 수 ì—†ìŒ(\"%s.%s\" 칼럼ì—서 해당 로우 í˜•ì„ ì‚¬ìš©í•¨)" -#: commands/tablecmds.c:5887 +#: commands/tablecmds.c:6864 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "" -"\"%s\" í…Œì´ë¸”ì„ ë³€ê²½í•  수 ì—†ìŒ(\"%s.%s\" 칼럼ì—서 해당 로우 형ì‹ì„ 사용함)" +"\"%s\" í…Œì´ë¸”ì„ ë°”ê¿€ 수 ì—†ìŒ(\"%s.%s\" 칼럼ì—서 해당 로우 형ì‹ì„ 사용함)" -#: commands/tablecmds.c:5943 +#: commands/tablecmds.c:6920 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "" -"\"%s\" ìžë£Œí˜•ì„ ë³€ê²½í•  수 ì—†ìŒ, ì´ ìžë£Œí˜•ì€ typed í…Œì´ë¸”ì˜ ìžë£Œí˜•ì´ê¸° 때문" +"\"%s\" ìžë£Œí˜•ì„ ë°”ê¿€ 수 ì—†ìŒ, ì´ ìžë£Œí˜•ì€ typed í…Œì´ë¸”ì˜ ìžë£Œí˜•ì´ê¸° 때문" -#: commands/tablecmds.c:5945 +#: commands/tablecmds.c:6922 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "" "ì´ ê°œì²´ì™€ ê´€ê³„ëœ ëª¨ë“  ê°œì²´ë“¤ì„ í•¨ê»˜ 변경하려면 ALTER ... CASCADE ëª…ë ¹ì„ ì‚¬ìš©" "하십시오" -#: commands/tablecmds.c:5991 +#: commands/tablecmds.c:6968 #, c-format msgid "type %s is not a composite type" msgstr "%s ìžë£Œí˜•ì€ ë³µí•© ìžë£Œí˜•ì´ ì•„ë‹™ë‹ˆë‹¤" -#: commands/tablecmds.c:6018 +#: commands/tablecmds.c:6995 #, c-format msgid "cannot add column to typed table" msgstr "typed í…Œì´ë¸”ì—는 ì¹¼ëŸ¼ì„ ì¶”ê°€ í•  수 ì—†ìŒ" -#: commands/tablecmds.c:6069 +#: commands/tablecmds.c:7043 #, c-format msgid "cannot add column to a partition" msgstr "파티션 í…Œì´ë¸”ì—는 ì¹¼ëŸ¼ì„ ì¶”ê°€ í•  수 없습니다" -#: commands/tablecmds.c:6098 commands/tablecmds.c:13869 +#: commands/tablecmds.c:7072 commands/tablecmds.c:15860 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "" "\"%s\" ìƒì†ëœ í…Œì´ë¸”ì˜ \"%s\" ì—´ ìžë£Œí˜•ì´ ìƒìœ„ í…Œì´ë¸”ì˜ ìžë£Œí˜•ê³¼ 틀립니다" -#: commands/tablecmds.c:6104 commands/tablecmds.c:13876 +#: commands/tablecmds.c:7078 commands/tablecmds.c:15866 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "" "\"%s\" ìƒì†ëœ í…Œì´ë¸”ì˜ \"%s\" 칼럼 ì •ë ¬ê·œì¹™ì´ ìƒìœ„ í…Œì´ë¸”ì˜ ì •ë ¬ê·œì¹™ê³¼ 틀립니" "다" -#: commands/tablecmds.c:6118 +#: commands/tablecmds.c:7096 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "\"%s\" ì—´(\"%s\" 하위)ì˜ ì •ì˜ë¥¼ 병합하는 중" -#: commands/tablecmds.c:6161 +#: commands/tablecmds.c:7149 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "하위 í…Œì´ë¸”ì— ìž¬ê·€ì ìœ¼ë¡œ ì‹ë³„ ì¹¼ëŸ¼ì„ ì¶”ê°€í•  수는 ì—†ìŒ" -#: commands/tablecmds.c:6398 +#: commands/tablecmds.c:7362 #, c-format msgid "column must be added to child tables too" msgstr "하위 í…Œì´ë¸”ì—ë„ ì¹¼ëŸ¼ì„ ì¶”ê°€í•´ì•¼ 함" -#: commands/tablecmds.c:6476 +#: commands/tablecmds.c:7440 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼ì´ \"%s\" 릴레ì´ì…˜ì— ì´ë¯¸ 있습니다, 건너뜀" -#: commands/tablecmds.c:6483 +#: commands/tablecmds.c:7447 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼ì€ \"%s\" 릴레ì´ì…˜ì— ì´ë¯¸ 있습니다" -#: commands/tablecmds.c:6549 commands/tablecmds.c:10826 +#: commands/tablecmds.c:7513 commands/tablecmds.c:12652 #, c-format msgid "" "cannot remove constraint from only the partitioned table when partitions " "exist" msgstr "하위 í…Œì´ë¸”ì´ ìžˆëŠ” 경우, ìƒìœ„ í…Œì´ë¸”ì˜ ì œì•½ì¡°ê±´ë§Œ 지울 수는 ì—†ìŒ" -#: commands/tablecmds.c:6550 commands/tablecmds.c:6854 -#: commands/tablecmds.c:7834 commands/tablecmds.c:10827 +#: commands/tablecmds.c:7514 commands/tablecmds.c:7828 +#: commands/tablecmds.c:8006 commands/tablecmds.c:8113 +#: commands/tablecmds.c:8230 commands/tablecmds.c:9049 +#: commands/tablecmds.c:12653 #, c-format msgid "Do not specify the ONLY keyword." msgstr "ONLY ì˜µì…˜ì„ ë¹¼ê³  사용하세요." -#: commands/tablecmds.c:6587 commands/tablecmds.c:6780 -#: commands/tablecmds.c:6922 commands/tablecmds.c:7036 -#: commands/tablecmds.c:7130 commands/tablecmds.c:7189 -#: commands/tablecmds.c:7291 commands/tablecmds.c:7457 -#: commands/tablecmds.c:7527 commands/tablecmds.c:7620 -#: commands/tablecmds.c:10981 commands/tablecmds.c:12406 +#: commands/tablecmds.c:7550 commands/tablecmds.c:7754 +#: commands/tablecmds.c:7896 commands/tablecmds.c:8028 +#: commands/tablecmds.c:8157 commands/tablecmds.c:8251 +#: commands/tablecmds.c:8352 commands/tablecmds.c:8509 +#: commands/tablecmds.c:8662 commands/tablecmds.c:8743 +#: commands/tablecmds.c:8877 commands/tablecmds.c:12806 +#: commands/tablecmds.c:14348 commands/tablecmds.c:16975 #, c-format msgid "cannot alter system column \"%s\"" -msgstr "\"%s\" ì¹¼ëŸ¼ì€ ì‹œìŠ¤í…œ 칼럼입니다. 그래서 ë³€ê²½ë  ìˆ˜ 없습니다" +msgstr "\"%s\" ì¹¼ëŸ¼ì€ ì‹œìŠ¤í…œ 칼럼입니다. 그래서 바꿀 수 없습니다" -#: commands/tablecmds.c:6593 commands/tablecmds.c:6928 +#: commands/tablecmds.c:7556 commands/tablecmds.c:7902 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "\"%s\" 칼럼(해당 í…Œì´ë¸”: \"%s\")ì€ ì‹ë³„ 칼럼입니다." -#: commands/tablecmds.c:6629 +#: commands/tablecmds.c:7597 #, c-format msgid "column \"%s\" is in a primary key" msgstr "\"%s\" ì¹¼ëŸ¼ì€ ê¸°ë³¸í‚¤ 칼럼입니다" -#: commands/tablecmds.c:6651 +#: commands/tablecmds.c:7602 +#, c-format +msgid "column \"%s\" is in index used as replica identity" +msgstr "\"%s\" 칼럼 ëŒ€ìƒ ì¸ë±ìŠ¤ëŠ” 복제 ì‹ë³„ìžë¡œ 사용 ë¨" + +#: commands/tablecmds.c:7625 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "파티션 í…Œì´ë¸”ì—서 \"%s\" ì¹¼ëŸ¼ì€ NOT NULL ì†ì„±ìœ¼ë¡œ ë˜ì–´ 있습니다" -#: commands/tablecmds.c:6851 commands/tablecmds.c:8293 +#: commands/tablecmds.c:7825 commands/tablecmds.c:9533 #, c-format msgid "constraint must be added to child tables too" msgstr "하위 í…Œì´ë¸”ì—ë„ ì œì•½ ì¡°ê±´ì„ ì¶”ê°€í•´ì•¼ 함" -#: commands/tablecmds.c:6852 +#: commands/tablecmds.c:7826 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "\"%s\" 칼럼(해당 릴레ì´ì…˜: \"%s\")ì€ ì´ë¯¸ NOT NULL ì†ì„±ì´ 없습니다." -#: commands/tablecmds.c:6887 -#, c-format -msgid "" -"existing constraints on column \"%s.%s\" are sufficient to prove that it " -"does not contain nulls" -msgstr "" - -#: commands/tablecmds.c:6930 -#, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." -msgstr "" -"대신ì—, ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." - -#: commands/tablecmds.c:6935 +#: commands/tablecmds.c:7911 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "\"%s\" 칼럼(해당 í…Œì´ë¸”: \"%s\")ì€ ê³„ì‚°ëœ ì¹¼ëŸ¼ìž…ë‹ˆë‹¤." -#: commands/tablecmds.c:6938 +#: commands/tablecmds.c:8005 #, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." -msgstr "" -"대신ì—, ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." +msgid "cannot add identity to a column of only the partitioned table" +msgstr "ìƒìœ„ 파티션 í…Œì´ë¸” 단ë…으로 ì‹ë³„ìž ì†ì„±ì˜ ì¹¼ëŸ¼ì„ ì§€ì •í•  수 ì—†ìŒ" + +#: commands/tablecmds.c:8011 +#, c-format +msgid "cannot add identity to a column of a partition" +msgstr "한 하위 í…Œì´ë¸”ì— ì‹ë³„ìž ì†ì„±ì˜ ì¹¼ëŸ¼ì„ ì§€ì •í•  수는 ì—†ìŒ" -#: commands/tablecmds.c:7047 +#: commands/tablecmds.c:8039 #, c-format msgid "" "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity " "can be added" msgstr "" -"ì‹ë³„ìž ì˜µì…˜ì„ ì‚¬ìš©í•˜ë ¤ë©´, \"%s\" 칼럼(해당 릴레ì´ì…˜: \"%s\")ì— NOT NULL " -"ì˜µì…˜ì´ ìžˆì–´ì•¼ 합니다." +"ì‹ë³„ìž ì˜µì…˜ì„ ì‚¬ìš©í•˜ë ¤ë©´, \"%s\" 칼럼(해당 릴레ì´ì…˜: \"%s\")ì— NOT NULL 옵션" +"ì´ ìžˆì–´ì•¼ 합니다." -#: commands/tablecmds.c:7053 +#: commands/tablecmds.c:8045 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼(해당 릴레ì´ì…˜: \"%s\")ì€ ì´ë¯¸ ì‹ë³„ 칼럼입니다" -#: commands/tablecmds.c:7059 +#: commands/tablecmds.c:8051 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼(해당 릴레ì´ì…˜: \"%s\")ì€ ì´ë¯¸ default 입니다" -#: commands/tablecmds.c:7136 commands/tablecmds.c:7197 +#: commands/tablecmds.c:8112 +#, c-format +msgid "cannot change identity column of only the partitioned table" +msgstr "ìƒìœ„ 파티션 í…Œì´ë¸”ë§Œ 대ìƒìœ¼ë¡œ ì‹ë³„ìž ì†ì„± ì¹¼ëŸ¼ì„ ë°”ê¿€ 수는 ì—†ìŒ" + +#: commands/tablecmds.c:8118 +#, c-format +msgid "cannot change identity column of a partition" +msgstr "한 하위 파티션 í…Œì´ë¸”ë§Œ 대ìƒìœ¼ë¡œ ì‹ë³„ìž ì†ì„± ì¹¼ëŸ¼ì„ ë°”ê¿€ 수는 ì—†ìŒ" + +#: commands/tablecmds.c:8163 commands/tablecmds.c:8259 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼(해당 릴레ì´ì…˜: \"%s\")ì€ ì‹ë³„ ì¹¼ëŸ¼ì´ ì•„ë‹™ë‹ˆë‹¤" -#: commands/tablecmds.c:7202 +#: commands/tablecmds.c:8229 +#, c-format +msgid "cannot drop identity from a column of only the partitioned table" +msgstr "ìƒìœ„ 파티션 í…Œì´ë¸”ë§Œ 대ìƒìœ¼ë¡œ ì‹ë³„ìž ì†ì„± ì¹¼ëŸ¼ì„ ì‚­ì œí•  수는 ì—†ìŒ" + +#: commands/tablecmds.c:8235 +#, c-format +msgid "cannot drop identity from a column of a partition" +msgstr "한 하위 파티션 í…Œì´ë¸”ë§Œ 대ìƒìœ¼ë¡œ ì‹ë³„ìž ì†ì„± ì¹¼ëŸ¼ì„ ì‚­ì œí•  수는 ì—†ìŒ" + +#: commands/tablecmds.c:8264 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼(해당 릴레ì´ì…˜: \"%s\")ì€ ì‹ë³„ ì¹¼ëŸ¼ì´ ì•„ë‹˜, 건너뜀" -#: commands/tablecmds.c:7261 +#: commands/tablecmds.c:8358 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not a generated column" +msgstr "\"%s\" 칼럼(해당 í…Œì´ë¸”: \"%s\")ì€ ê³„ì‚°ëœ ì¹¼ëŸ¼ì´ ì•„ë‹˜" + +#: commands/tablecmds.c:8456 +#, c-format +msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" +msgstr "ALTER TABLE / DROP EXPRESSION ìž‘ì—…ì€ í•˜ìœ„ í…Œì´ë¸”ì—ë„ ì ìš©ë˜ì–´ì•¼í•¨" + +#: commands/tablecmds.c:8478 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "ìƒì† ë°›ì€ ì¹¼ëŸ¼ì—서는 미리 ê³„ì‚°ëœ í‘œí˜„ì‹ì„ 못 없앰" -#: commands/tablecmds.c:7299 +#: commands/tablecmds.c:8517 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "\"%s\" 칼럼(해당 릴레ì´ì…˜: \"%s\")ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ì´ ì•„ë‹˜" -#: commands/tablecmds.c:7304 +#: commands/tablecmds.c:8522 #, c-format msgid "" "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "\"%s\" 칼럼(해당 릴레ì´ì…˜: \"%s\")ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ì´ ì•„ë‹˜, 건너뜀" -#: commands/tablecmds.c:7404 +#: commands/tablecmds.c:8600 #, c-format msgid "cannot refer to non-index column by number" -msgstr "" +msgstr "숫ìžë¡œ ì¸ë±ìФ 사용하지 않는 ì¹¼ëŸ¼ì„ ì°¸ì¡°í•  수 ì—†ìŒ" -#: commands/tablecmds.c:7447 +#: commands/tablecmds.c:8652 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "%d번째 ì¹¼ëŸ¼ì´ ì—†ìŠµë‹ˆë‹¤. 해당 릴레ì´ì…˜: \"%s\"" -#: commands/tablecmds.c:7466 +#: commands/tablecmds.c:8671 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "" "\"%s\" í¬í•¨ëœ 칼럼 (해당 ì¸ë±ìФ: \"%s\") 관련 통계정보를 수정할 수 ì—†ìŒ" -#: commands/tablecmds.c:7471 +#: commands/tablecmds.c:8676 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "" "\"%s\" ë¹„í‘œí˜„ì‹ ì¹¼ëŸ¼ (해당 ì¸ë±ìФ: \"%s\") 관련 통계정보를 수정할 수 ì—†ìŒ" -#: commands/tablecmds.c:7473 +#: commands/tablecmds.c:8678 #, c-format msgid "Alter statistics on table column instead." msgstr "ëŒ€ì‹ ì— í…Œì´ë¸” 칼럼 대ìƒìœ¼ë¡œ 통계정보를 수정하세요." -#: commands/tablecmds.c:7600 -#, c-format -msgid "invalid storage type \"%s\"" -msgstr "ìž˜ëª»ëœ STORAGE ê°’: \"%s\"" - -#: commands/tablecmds.c:7632 -#, c-format -msgid "column data type %s can only have storage PLAIN" -msgstr "%s ìžë£Œí˜•ì˜ columnì˜ STORAGE ê°’ì€ ë°˜ë“œì‹œ PLAIN ì´ì–´ì•¼í•©ë‹ˆë‹¤" - -#: commands/tablecmds.c:7714 +#: commands/tablecmds.c:8924 #, c-format msgid "cannot drop column from typed table" msgstr "typed í…Œì´ë¸”ì—서 ì¹¼ëŸ¼ì„ ì‚­ì œí•  수 ì—†ìŒ" -#: commands/tablecmds.c:7773 +#: commands/tablecmds.c:8987 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "\"%s\" ì¹¼ëŸ¼ì€ \"%s\" 릴레ì´ì…˜ì— ì—†ìŒ, 건너뜀" -#: commands/tablecmds.c:7786 +#: commands/tablecmds.c:9000 #, c-format msgid "cannot drop system column \"%s\"" msgstr "\"%s\" ì¹¼ëŸ¼ì€ ì‹œìŠ¤í…œ 칼럼입니다, ì‚­ì œë  ìˆ˜ 없습니다" -#: commands/tablecmds.c:7796 +#: commands/tablecmds.c:9010 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "\"%s\" ì¹¼ëŸ¼ì€ ìƒì†ë°›ì€ 칼럼입니다, ì‚­ì œë  ìˆ˜ 없습니다" -#: commands/tablecmds.c:7809 +#: commands/tablecmds.c:9023 #, c-format msgid "" "cannot drop column \"%s\" because it is part of the partition key of " @@ -10174,14 +12092,14 @@ msgid "" msgstr "" "\"%s\" ì¹¼ëŸ¼ì€ \"%s\" 릴레ì´ì…˜ì˜ 파티션 키로 사용ë˜ê³  있어 ì‚­ì œ ë  ìˆ˜ ì—†ìŒ" -#: commands/tablecmds.c:7833 +#: commands/tablecmds.c:9048 #, c-format msgid "" "cannot drop column from only the partitioned table when partitions exist" msgstr "" "파티션 í…Œì´ë¸”ì´ ìžˆëŠ” íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì—서 ê·¸ í…Œì´ë¸”ë§Œ ì¹¼ëŸ¼ì„ ì‚­ì œ í•  수 ì—†ìŒ" -#: commands/tablecmds.c:8014 +#: commands/tablecmds.c:9253 #, c-format msgid "" "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned " @@ -10190,7 +12108,7 @@ msgstr "" "ALTER TABLE / ADD CONSTRAINT USING INDEX ìž‘ì—…ì€ íŒŒí‹°ì…˜ ëœ í…Œì´ë¸” 대ìƒìœ¼ë¡œëŠ” " "ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/tablecmds.c:8039 +#: commands/tablecmds.c:9278 #, c-format msgid "" "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" @@ -10198,14 +12116,16 @@ msgstr "" "ALTER TABLE / ADD CONSTRAINT USING INDEX ìž‘ì—…ì€ \"%s\" ì¸ë±ìŠ¤ë¥¼ \"%s\" ì´ë¦„으" "로 바꿀 것입니다." -#: commands/tablecmds.c:8373 +#: commands/tablecmds.c:9615 #, c-format msgid "" "cannot use ONLY for foreign key on partitioned table \"%s\" referencing " "relation \"%s\"" msgstr "" +"\"%s\" 파티션 ìƒìœ„ í…Œì´ë¸”ì˜ ì°¸ì¡°í‚¤ì—는 ONLY ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ. ì´ í…Œì´ë¸”" +"ì€ \"%s\" 릴레ì´ì…˜ì„ 참조 함" -#: commands/tablecmds.c:8379 +#: commands/tablecmds.c:9621 #, c-format msgid "" "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing " @@ -10214,22 +12134,22 @@ msgstr "" "\"%s\" íŒŒíƒ€ì…˜ëœ í…Œì´ë¸”ì— NOT VALID 참조키를 추가할 수 ì—†ìŒ (참조 하는 í…Œì´" "블: \"%s\")" -#: commands/tablecmds.c:8382 +#: commands/tablecmds.c:9624 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "ì´ ê¸°ëŠ¥ì€ íŒŒí‹°ì…˜ ëœ í…Œì´ë¸” 대ìƒìœ¼ë¡œëŠ” ì•„ì§ ì§€ì›í•˜ì§€ 않습니다." -#: commands/tablecmds.c:8389 commands/tablecmds.c:8794 +#: commands/tablecmds.c:9631 commands/tablecmds.c:10092 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "ì°¸ì¡°ëœ \"%s\" 릴레ì´ì…˜ì€ í…Œì´ë¸”ì´ ì•„ë‹™ë‹ˆë‹¤" -#: commands/tablecmds.c:8412 +#: commands/tablecmds.c:9654 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "ì˜êµ¬ 저장용 í…Œì´ë¸”ì˜ ì œì•½ ì¡°ê±´ì€ ì˜êµ¬ 저장용 í…Œì´ë¸”ì„ ì°¸ì¡° 합니다." -#: commands/tablecmds.c:8419 +#: commands/tablecmds.c:9661 #, c-format msgid "" "constraints on unlogged tables may reference only permanent or unlogged " @@ -10238,132 +12158,176 @@ msgstr "" "unlogged í…Œì´ë¸”ì˜ ì œì•½ ì¡°ê±´ì€ ì˜êµ¬ 저장용 í…Œì´ë¸” ë˜ëŠ” unlogged í…Œì´ë¸”ì„ ì°¸ì¡°" "합니다." -#: commands/tablecmds.c:8425 +#: commands/tablecmds.c:9667 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "임시 í…Œì´ë¸”ì˜ ì œì•½ ì¡°ê±´ì€ ìž„ì‹œ í…Œì´ë¸”ì— ëŒ€í•´ì„œë§Œ 참조할 것입니다." -#: commands/tablecmds.c:8429 +#: commands/tablecmds.c:9671 #, c-format msgid "" "constraints on temporary tables must involve temporary tables of this session" msgstr "" "임시 í…Œì´ë¸”ì˜ ì œì•½ ì¡°ê±´ì€ ì´ ì„¸ì…˜ìš© 임시 í…Œì´ë¸”ì— ëŒ€í•´ì„œë§Œ ì ìš© ë©ë‹ˆë‹¤." -#: commands/tablecmds.c:8495 commands/tablecmds.c:8501 +#: commands/tablecmds.c:9735 commands/tablecmds.c:9741 #, c-format msgid "" "invalid %s action for foreign key constraint containing generated column" msgstr "ê³„ì‚°ëœ ì¹¼ëŸ¼ì„ í¬í•¨í•˜ëŠ” 참조키 제약조건용 %s ì•¡ì…˜ì€ ìž˜ëª» ë˜ì—ˆìŒ" -#: commands/tablecmds.c:8517 +#: commands/tablecmds.c:9757 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "참조키(foreign key) disagree를 위한 참조하는, ë˜ëŠ” 참조ë˜ëŠ” ì—´ 수" -#: commands/tablecmds.c:8624 +#: commands/tablecmds.c:9864 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "\"%s\" 참조키(foreign key) 제약 ì¡°ê±´ì€ êµ¬í˜„ë˜ì–´ì§ˆ 수 없습니다" -#: commands/tablecmds.c:8626 +#: commands/tablecmds.c:9866 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "" "\"%s\" ì—´ê³¼ \"%s\" ì—´ ì¸ë±ìŠ¤ëŠ” 함께 사용할 수 없는 ìžë£Œí˜•입니다: %s and %s." -#: commands/tablecmds.c:8989 commands/tablecmds.c:9382 -#: parser/parse_utilcmd.c:764 parser/parse_utilcmd.c:893 +#: commands/tablecmds.c:10035 +#, c-format +msgid "" +"column \"%s\" referenced in ON DELETE SET action must be part of foreign key" +msgstr "" +"ON DELETE SET ë™ìž‘ì„ ì§€ì •í•˜ë ¤ëŠ” \"%s\" ì¹¼ëŸ¼ì€ ì°¸ì¡°í‚¤ì˜ í•œ 부분ì´ì–´ì•¼ 합니다." + +#: commands/tablecmds.c:10392 commands/tablecmds.c:10832 +#: parser/parse_utilcmd.c:822 parser/parse_utilcmd.c:945 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "참조키 제약 ì¡°ê±´ì€ ì™¸ë¶€ í…Œì´ë¸”ì—서는 사용할 수 ì—†ìŒ" -#: commands/tablecmds.c:9748 commands/tablecmds.c:9911 -#: commands/tablecmds.c:10783 commands/tablecmds.c:10858 +#: commands/tablecmds.c:10815 +#, c-format +msgid "" +"cannot attach table \"%s\" as a partition because it is referenced by " +"foreign key \"%s\"" +msgstr "" +"\"%s\" í…Œì´ë¸”ì€ í•˜ìœ„ í…Œì´ë¸”로 추가 ë  ìˆ˜ ì—†ìŒ, ì´ í…Œì´ë¸”ì€ \"%s\" ì°¸ì¡°í‚¤ì˜ ëŒ€" +"ìƒì´ê¸° 때문" + +#: commands/tablecmds.c:11416 commands/tablecmds.c:11697 +#: commands/tablecmds.c:12609 commands/tablecmds.c:12683 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "\"%s\" 제약 ì¡°ê±´ì´ \"%s\" 릴레ì´ì…˜ì— 없습니다." -#: commands/tablecmds.c:9755 +#: commands/tablecmds.c:11423 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "\"%s\" 제약 ì¡°ê±´(해당 í…Œì´ë¸”: \"%s\")ì€ ì°¸ì¡°í‚¤ ì œì•½ì¡°ê±´ì´ ì•„ë‹™ë‹ˆë‹¤." -#: commands/tablecmds.c:9919 +#: commands/tablecmds.c:11461 +#, c-format +msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgstr "\"%s\" 제약 ì¡°ê±´(해당 í…Œì´ë¸”: \"%s\")ì„ ë°”ê¿€ 수 ì—†ìŒ" + +#: commands/tablecmds.c:11464 +#, c-format +msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." +msgstr "" +"\"%s\" 제약 ì¡°ê±´ì€ \"%s\" 제약 ì¡°ê±´ì—서 파ìƒë˜ì—ˆìŒ, 해당 릴레ì´ì…˜: \"%s\"" + +#: commands/tablecmds.c:11466 +#, c-format +msgid "You may alter the constraint it derives from instead." +msgstr "대신ì—, ì› ì œì•½ ì¡°ê±´ì„ ë³€ê²½ 하세요." + +#: commands/tablecmds.c:11705 #, c-format msgid "" "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "" "\"%s\" 제약 ì¡°ê±´(해당 í…Œì´ë¸”: \"%s\")ì€ ì°¸ì¡°í‚¤ë„ ì²´í¬ ì œì•½ ì¡°ê±´ë„ ì•„ë‹™ë‹ˆë‹¤." -#: commands/tablecmds.c:9997 +#: commands/tablecmds.c:11782 #, c-format msgid "constraint must be validated on child tables too" msgstr "하위 í…Œì´ë¸”ì—ë„ ì œì•½ ì¡°ê±´ì´ ìœ íš¨í•´ì•¼ 함" -#: commands/tablecmds.c:10081 +#: commands/tablecmds.c:11869 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "참조키(foreign key) 제약 ì¡°ê±´ì—서 참조하는 \"%s\" ì¹¼ëŸ¼ì´ ì—†ìŒ" -#: commands/tablecmds.c:10086 +#: commands/tablecmds.c:11875 +#, c-format +msgid "system columns cannot be used in foreign keys" +msgstr "시스템 ì¹¼ëŸ¼ì€ ì°¸ì¡°í‚¤ë¡œ ì‚¬ìš©ë  ìˆ˜ ì—†ìŒ" + +#: commands/tablecmds.c:11879 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "참조키(foreign key)ì—서 %d 키 개수보다 ë§Žì´ ê°€ì§ˆ 수 ì—†ìŒ" -#: commands/tablecmds.c:10151 +#: commands/tablecmds.c:11944 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "참조ë˜ëŠ” \"%s\" í…Œì´ë¸”ì˜ ì§€ì—° 가능한 기본키를 사용할 수 ì—†ìŒ" -#: commands/tablecmds.c:10168 +#: commands/tablecmds.c:11961 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "참조ë˜ëŠ” \"%s\" í…Œì´ë¸”ì—는 기본키(primary key)ê°€ 없습니다" -#: commands/tablecmds.c:10233 +#: commands/tablecmds.c:12029 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "ì°¸ì¡°í‚¤ì˜ ì°¸ì¡° 칼럼 목ë¡ì— ì¹¼ëŸ¼ì´ ì¤‘ë³µë˜ë©´ 안ë©ë‹ˆë‹¤" -#: commands/tablecmds.c:10327 +#: commands/tablecmds.c:12121 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "참조ë˜ëŠ” \"%s\" í…Œì´ë¸”ì˜ ì§€ì—° 가능한 ìœ ë‹ˆí¬ ì œì•½ ì¡°ê±´ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: commands/tablecmds.c:10332 +#: commands/tablecmds.c:12126 #, c-format msgid "" "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "" "참조ë˜ëŠ” \"%s\" í…Œì´ë¸”ì„ ìœ„í•œ 주워진 키와 ì¼ì¹˜í•˜ëŠ” 고유 제약 ì¡°ê±´ì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/tablecmds.c:10420 -#, c-format -msgid "validating foreign key constraint \"%s\"" -msgstr "\"%s\" 참조키 제약 ì¡°ê±´ 검사 중" - -#: commands/tablecmds.c:10739 +#: commands/tablecmds.c:12565 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "ìƒì†ëœ \"%s\" 제약 ì¡°ê±´(해당 í…Œì´ë¸”: \"%s\")ì„ ì‚­ì œí•  수 ì—†ìŒ" -#: commands/tablecmds.c:10789 +#: commands/tablecmds.c:12615 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "\"%s\" 제약 ì¡°ê±´(해당 í…Œì´ë¸”: \"%s\")ì´ ì—†ìŒ, 건너뜀" -#: commands/tablecmds.c:10965 +#: commands/tablecmds.c:12790 #, c-format msgid "cannot alter column type of typed table" -msgstr "typed í…Œì´ë¸”ì˜ ì¹¼ëŸ¼ ìžë£Œí˜•ì€ ë³€ê²½í•  수 ì—†ìŒ" +msgstr "typed í…Œì´ë¸”ì˜ ì¹¼ëŸ¼ ìžë£Œí˜•ì€ ë°”ê¿€ 수 ì—†ìŒ" + +#: commands/tablecmds.c:12816 +#, c-format +msgid "cannot specify USING when altering type of generated column" +msgstr "미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ì„ ë°”ê¿€ 때는 USING êµ¬ë¬¸ì„ ì§€ì •í•  수 ì—†ìŒ" + +#: commands/tablecmds.c:12817 commands/tablecmds.c:18028 +#: commands/tablecmds.c:18118 commands/trigger.c:656 +#: rewrite/rewriteHandler.c:941 rewrite/rewriteHandler.c:976 +#, c-format +msgid "Column \"%s\" is a generated column." +msgstr "\"%s\" ì¹¼ëŸ¼ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ìž…ë‹ˆë‹¤." -#: commands/tablecmds.c:10992 +#: commands/tablecmds.c:12827 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼ì€ ìƒì† ë°›ì€ ì¹¼ëŸ¼ìž…ë‹ˆë‹¤, ì´ë¦„ì„ ë°”ê¿€ 수 없습니다" -#: commands/tablecmds.c:11001 +#: commands/tablecmds.c:12836 #, c-format msgid "" "cannot alter column \"%s\" because it is part of the partition key of " @@ -10372,7 +12336,7 @@ msgstr "" "\"%s\" ì¹¼ëŸ¼ì€ \"%s\" í…Œì´ë¸”ì˜ íŒŒí‹°ì…˜ 키 ê°€ìš´ë° í•˜ë‚˜ì´ê¸° 때문ì—, alter 작업" "ì„ í•  수 ì—†ìŒ" -#: commands/tablecmds.c:11051 +#: commands/tablecmds.c:12886 #, c-format msgid "" "result of USING clause for column \"%s\" cannot be cast automatically to " @@ -10380,203 +12344,197 @@ msgid "" msgstr "" "\"%s\" 칼럼ì—서 ì“°ì¸ USING ì ˆì˜ ê²°ê³¼ê°€ %s ìžë£Œí˜•으로 ìžë™ í˜•ë³€í™˜ì„ í•  수 ì—†ìŒ" -#: commands/tablecmds.c:11054 +#: commands/tablecmds.c:12889 #, c-format msgid "You might need to add an explicit cast." msgstr "ëª…ì‹œì  í˜•ë³€í™˜ì„ í•´ì•¼í•  것 같습니다." -#: commands/tablecmds.c:11058 +#: commands/tablecmds.c:12893 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "\"%s\" ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ì„ %s 형으로 형변환할 수 ì—†ìŒ" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:11061 +#: commands/tablecmds.c:12897 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "\"USING %s::%s\" êµ¬ë¬¸ì„ ì¶”ê°€í•´ì•¼ í•  것 같습니다." -#: commands/tablecmds.c:11161 +#: commands/tablecmds.c:12996 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "" "\"%s\" ì¹¼ëŸ¼ì€ \"%s\" í…Œì´ë¸”ì˜ ìƒì†ëœ 칼럼ì´ê¸°ì— alter ìž‘ì—…ì„ í•  수 ì—†ìŒ" -#: commands/tablecmds.c:11189 +#: commands/tablecmds.c:13025 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USING 표현ì‹ì—서 ì „ì²´ 로우 í…Œì´ë¸” 참조를 í¬í•¨í•˜ê³  있습니다." -#: commands/tablecmds.c:11200 +#: commands/tablecmds.c:13036 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "하위 í…Œì´ë¸”ì—ì„œë„ ìƒì†ëœ \"%s\" ì¹¼ëŸ¼ì˜ í˜•ì‹ì„ 바꾸어야 함" -#: commands/tablecmds.c:11325 +#: commands/tablecmds.c:13161 #, c-format msgid "cannot alter type of column \"%s\" twice" -msgstr "\"%s\" ì¹¼ëŸ¼ì€ ì‹œìŠ¤í…œ 칼럼입니다. 그래서 ë³€ê²½ë  ìˆ˜ 없습니다" +msgstr "\"%s\" ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ì„ ì¤‘ë³µí•´ì„œ 바꿀 수는 ì—†ìŒ" -#: commands/tablecmds.c:11363 +#: commands/tablecmds.c:13199 #, c-format msgid "" "generation expression for column \"%s\" cannot be cast automatically to type " "%s" msgstr "\"%s\" ì¹¼ëŸ¼ì˜ ìƒì„± êµ¬ë¬¸ì€ %s 형으로 ìžë™ 형변환할 수 ì—†ìŒ" -#: commands/tablecmds.c:11368 +#: commands/tablecmds.c:13204 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "\"%s\" ì¹¼ëŸ¼ì˜ ê¸°ë³¸ ê°’ì„ %s 형으로 형변환할 수 ì—†ìŒ" -#: commands/tablecmds.c:11446 +#: commands/tablecmds.c:13508 #, c-format -msgid "cannot alter type of a column used by a generated column" -msgstr "미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ì„ ë°”ê¿€ 수 ì—†ìŒ" +msgid "cannot alter type of a column used by a function or procedure" +msgstr "함수나 프로시져ì—서 사용하는 ì¹¼ëŸ¼ì˜ ìžë£Œí˜• ë³€ê²½ì€ í•  수 ì—†ìŒ" -#: commands/tablecmds.c:11447 +#: commands/tablecmds.c:13509 commands/tablecmds.c:13524 +#: commands/tablecmds.c:13544 commands/tablecmds.c:13563 +#: commands/tablecmds.c:13622 #, c-format -msgid "Column \"%s\" is used by generated column \"%s\"." -msgstr "\"%s\" ì¹¼ëŸ¼ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ì¸ \"%s\"ì—서 사용ë˜ê³  있ìŒ." +msgid "%s depends on column \"%s\"" +msgstr "%s ì˜ì¡´ëŒ€ìƒ ì—´: \"%s\"" -#: commands/tablecmds.c:11468 +#: commands/tablecmds.c:13523 #, c-format msgid "cannot alter type of a column used by a view or rule" -msgstr "ë·° ë˜ëŠ” 규칙ì—서 사용하는 ì¹¼ëŸ¼ì˜ í˜•ì‹ì„ 변경할 수 ì—†ìŒ" +msgstr "ë·° ë˜ëŠ” 규칙ì—서 사용하는 ì¹¼ëŸ¼ì˜ í˜•ì‹ì„ 바꿀 수 ì—†ìŒ" -#: commands/tablecmds.c:11469 commands/tablecmds.c:11488 -#: commands/tablecmds.c:11506 -#, c-format -msgid "%s depends on column \"%s\"" -msgstr "%s ì˜ì¡´ëŒ€ìƒ ì—´: \"%s\"" - -#: commands/tablecmds.c:11487 +#: commands/tablecmds.c:13543 #, c-format msgid "cannot alter type of a column used in a trigger definition" -msgstr "트리거 ì •ì˜ì—서 사용하는 ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ì„ ë³€ê²½í•  수 ì—†ìŒ" +msgstr "트리거 ì •ì˜ì—서 사용하는 ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ì„ ë°”ê¿€ 수 ì—†ìŒ" -#: commands/tablecmds.c:11505 +#: commands/tablecmds.c:13562 #, c-format msgid "cannot alter type of a column used in a policy definition" -msgstr "ì •ì±… ì •ì˜ì—서 사용하는 ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ì„ ë³€ê²½í•  수 ì—†ìŒ" +msgstr "ì •ì±… ì •ì˜ì—서 사용하는 ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ì„ ë°”ê¿€ 수 ì—†ìŒ" + +#: commands/tablecmds.c:13593 +#, c-format +msgid "cannot alter type of a column used by a generated column" +msgstr "미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ì„ ë°”ê¿€ 수 ì—†ìŒ" -#: commands/tablecmds.c:12514 commands/tablecmds.c:12526 +#: commands/tablecmds.c:13594 +#, c-format +msgid "Column \"%s\" is used by generated column \"%s\"." +msgstr "\"%s\" ì¹¼ëŸ¼ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ì¸ \"%s\"ì—서 사용ë˜ê³  있ìŒ." + +#: commands/tablecmds.c:13621 +#, c-format +msgid "cannot alter type of a column used by a publication WHERE clause" +msgstr "WHEREì ˆì´ ìžˆëŠ” 발행ì—서 사용ë˜ëŠ” ì¹¼ëŸ¼ì€ ìžë£Œí˜•ì„ ë°”ê¿€ 수 ì—†ìŒ" + +#: commands/tablecmds.c:14456 commands/tablecmds.c:14468 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "\"%s\" ì¸ë±ìŠ¤ì˜ ì†Œìœ ì£¼ë¥¼ 바꿀 수 ì—†ìŒ" -#: commands/tablecmds.c:12516 commands/tablecmds.c:12528 +#: commands/tablecmds.c:14458 commands/tablecmds.c:14470 #, c-format -msgid "Change the ownership of the index's table, instead." +msgid "Change the ownership of the index's table instead." msgstr "ëŒ€ì‹ ì— ê·¸ ì¸ë±ìŠ¤ì˜ í•´ë‹¹ í…Œì´ë¸” 소유ìžì„ 변경하세요." -#: commands/tablecmds.c:12542 +#: commands/tablecmds.c:14484 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "\"%s\" ì‹œí€€ìŠ¤ì˜ ì†Œìœ ì£¼ë¥¼ 바꿀 수 ì—†ìŒ" -#: commands/tablecmds.c:12556 commands/tablecmds.c:15743 -#, c-format -msgid "Use ALTER TYPE instead." -msgstr "대신 ALTER TYPEì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤." - -#: commands/tablecmds.c:12565 +#: commands/tablecmds.c:14509 #, c-format -msgid "\"%s\" is not a table, view, sequence, or foreign table" -msgstr "\"%s\" 개체는 í…Œì´ë¸”, ë·°, 시퀀스, 외부 í…Œì´ë¸” ê·¸ ì–´ëŠ ê²ƒë„ ì•„ë‹™ë‹ˆë‹¤" +msgid "cannot change owner of relation \"%s\"" +msgstr "\"%s\" 릴레ì´ì…˜ì˜ 소유주를 바꿀 수 ì—†ìŒ" -#: commands/tablecmds.c:12905 +#: commands/tablecmds.c:14976 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "SET TABLESPACE êµ¬ë¬¸ì´ ì¤‘ë³µ 사용ë˜ì—ˆìŠµë‹ˆë‹¤" -#: commands/tablecmds.c:12982 +#: commands/tablecmds.c:15053 #, c-format -msgid "\"%s\" is not a table, view, materialized view, index, or TOAST table" -msgstr "" -"\"%s\" 개체는 í…Œì´ë¸”, ë·°, êµ¬ì²´í™”ëœ ë·°, ì¸ë±ìФ, TOAST í…Œì´ë¸” ê·¸ ì–´ëŠ ê²ƒë„ ì•„ë‹™" -"니다." +msgid "cannot set options for relation \"%s\"" +msgstr "\"%s\" 릴레ì´ì…˜ìš© ì˜µì…˜ì„ ì§€ì •í•  수 ì—†ìŒ" -#: commands/tablecmds.c:13015 commands/view.c:494 +#: commands/tablecmds.c:15087 commands/view.c:440 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "" "WITH CHECK OPTION ì˜µì…˜ì€ ìžë™ 갱신 가능한 ë·°ì— ëŒ€í•´ì„œë§Œ 사용할 수 있습니다" -#: commands/tablecmds.c:13155 -#, c-format -msgid "cannot move system relation \"%s\"" -msgstr "\"%s\" 시스템 릴레ì´ì…˜ìž…니다. ì´ë™í•  수 없습니다" - -#: commands/tablecmds.c:13171 -#, c-format -msgid "cannot move temporary tables of other sessions" -msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸”ë“¤ì€ ì´ë™í•  수 없습니다" - -#: commands/tablecmds.c:13341 +#: commands/tablecmds.c:15338 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "í…Œì´ë¸”스페ì´ìŠ¤ì— í…Œì´ë¸”ê³¼ ì¸ë±ìŠ¤ì™€ êµ¬ì²´í™”ëœ ë·°ë§Œ 있습니다." -#: commands/tablecmds.c:13353 +#: commands/tablecmds.c:15350 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "" "해당 개체를 pg_global í…Œì´ë¸”스페ì´ìŠ¤ë¡œ 옮기거나 ê·¸ 반대로 작업할 수 ì—†ìŒ" -#: commands/tablecmds.c:13445 +#: commands/tablecmds.c:15442 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "\"%s.%s\" 릴레ì´ì…˜ì„ 잠글 수 없어 중지 중입니다" -#: commands/tablecmds.c:13461 +#: commands/tablecmds.c:15458 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "ê²€ìƒ‰ì¡°ê±´ì— ì¼ì¹˜í•˜ëŠ” 릴레ì´ì…˜ì´ \"%s\" í…Œì´ë¸”스페ì´ìŠ¤ì— ì—†ìŒ" -#: commands/tablecmds.c:13577 +#: commands/tablecmds.c:15580 #, c-format msgid "cannot change inheritance of typed table" -msgstr "typed í…Œì´ë¸”ì˜ ìƒì† 정보는 변경할 수 ì—†ìŒ" +msgstr "typed í…Œì´ë¸”ì˜ ìƒì† 정보는 바꿀 수 ì—†ìŒ" -#: commands/tablecmds.c:13582 commands/tablecmds.c:14078 +#: commands/tablecmds.c:15585 commands/tablecmds.c:16085 #, c-format msgid "cannot change inheritance of a partition" msgstr "파티션 í…Œì´ë¸”ì˜ ìƒì† 정보는 바꿀 수 ì—†ìŒ" -#: commands/tablecmds.c:13587 +#: commands/tablecmds.c:15590 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì˜ ìƒì† 정보는 바꿀 수 ì—†ìŒ" -#: commands/tablecmds.c:13633 +#: commands/tablecmds.c:15636 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸”ì„ ìƒì†í•  수 ì—†ìŒ" -#: commands/tablecmds.c:13646 +#: commands/tablecmds.c:15649 #, c-format msgid "cannot inherit from a partition" msgstr "파티션 í…Œì´ë¸”ì—서 ìƒì† í•  수 ì—†ìŒ" -#: commands/tablecmds.c:13668 commands/tablecmds.c:16383 +#: commands/tablecmds.c:15671 commands/tablecmds.c:18529 #, c-format msgid "circular inheritance not allowed" msgstr "순환 ë˜ëŠ” ìƒì†ì€ 허용하지 않습니다" -#: commands/tablecmds.c:13669 commands/tablecmds.c:16384 +#: commands/tablecmds.c:15672 commands/tablecmds.c:18530 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" 개체는 ì´ë¯¸ \"%s\" 개체로부터 ìƒì†ë°›ì€ ìƒíƒœìž…니다." -#: commands/tablecmds.c:13682 +#: commands/tablecmds.c:15685 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "" "\"%s\" 트리거(해당 í…Œì´ë¸” \"%s\")ì€ í•˜ìœ„í…Œì´ë¸” ìƒì†ê³¼ 관련ë˜ì–´ 보호ë˜ê³  있습" "니다." -#: commands/tablecmds.c:13684 +#: commands/tablecmds.c:15687 #, c-format msgid "" "ROW triggers with transition tables are not supported in inheritance " @@ -10584,108 +12542,119 @@ msgid "" msgstr "" "transition í…Œì´ë¸”ì˜ ROW íŠ¸ë¦¬ê±°ë“¤ì€ ê³„ì¸µì  ìƒì† í…Œì´ë¸”ì—서는 ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/tablecmds.c:13887 +#: commands/tablecmds.c:15876 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" -msgstr "ìžì‹ í…Œì´ë¸”ì˜ \"%s\" ì¹¼ëŸ¼ì€ NOT NULL ì†ì„±ì´ 있어야합니다" +msgstr "ìžì‹ í…Œì´ë¸”ì˜ \"%s\" ì¹¼ëŸ¼ì€ NOT NULL ì†ì„±ì´ 있어야 합니다" + +#: commands/tablecmds.c:15885 +#, c-format +msgid "column \"%s\" in child table must be a generated column" +msgstr "ìžì‹ í…Œì´ë¸”ì˜ \"%s\" ì¹¼ëŸ¼ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ì´ì–´ì•¼ 함" + +#: commands/tablecmds.c:15889 +#, c-format +msgid "column \"%s\" in child table must not be a generated column" +msgstr "ìžì‹ í…Œì´ë¸”ì˜ \"%s\" ì¹¼ëŸ¼ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ì´ ì•„ë‹ˆì—¬ì•¼ 합니다." -#: commands/tablecmds.c:13914 +#: commands/tablecmds.c:15927 #, c-format msgid "child table is missing column \"%s\"" msgstr "ìžì‹ í…Œì´ë¸”ì—는 \"%s\" ì¹¼ëŸ¼ì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/tablecmds.c:14002 +#: commands/tablecmds.c:16008 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "\"%s\" 하위 í…Œì´ë¸”ì— \"%s\" ì²´í¬ ì œì•½ ì¡°ê±´ì— ëŒ€í•œ 다른 ì •ì˜ê°€ 있ìŒ" -#: commands/tablecmds.c:14010 +#: commands/tablecmds.c:16015 #, c-format msgid "" -"constraint \"%s\" conflicts with non-inherited constraint on child table \"%s" -"\"" +"constraint \"%s\" conflicts with non-inherited constraint on child table " +"\"%s\"" msgstr "" "\"%s\" 제약 ì¡°ê±´ì´ \"%s\" 하위 í…Œì´ë¸”ì— ìžˆëŠ” 비 ìƒì† 제약 ì¡°ê±´ê³¼ ì¶©ëŒí•©ë‹ˆë‹¤" -#: commands/tablecmds.c:14021 +#: commands/tablecmds.c:16025 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "" "\"%s\" 제약 ì¡°ê±´ì´ \"%s\" 하위 í…Œì´ë¸”ì— ìžˆëŠ” NOT VALID 제약 ì¡°ê±´ê³¼ ì¶©ëŒí•©ë‹ˆë‹¤" -#: commands/tablecmds.c:14056 +#: commands/tablecmds.c:16063 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "ìžì‹ í…Œì´ë¸”ì— \"%s\" 제약 ì¡°ê±´ì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/tablecmds.c:14145 +#: commands/tablecmds.c:16149 +#, c-format +msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" +msgstr "" +"\"%s\" 하위 파티션과 \"%s.%s\" ìƒìœ„ 파티션 í…Œì´ë¸”ê³¼ 분리 ìž‘ì—…ì„ ì´ë¯¸ ì§„í–‰, ì§€" +"ì—° ë˜ê³  있습니다." + +#: commands/tablecmds.c:16178 commands/tablecmds.c:16224 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "\"%s\" 릴레ì´ì…˜ì€ \"%s\" 릴레ì´ì…˜ì˜ íŒŒí‹°ì…˜ì´ ì•„ë‹™ë‹ˆë‹¤" -#: commands/tablecmds.c:14151 +#: commands/tablecmds.c:16230 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "\"%s\" 릴레ì´ì…˜ì€ \"%s\" 릴레ì´ì…˜ì˜ 부모가 아닙니다" -#: commands/tablecmds.c:14379 +#: commands/tablecmds.c:16457 #, c-format msgid "typed tables cannot inherit" msgstr "typed í…Œì´ë¸”ì€ ìƒì†í•  수 ì—†ìŒ" -#: commands/tablecmds.c:14409 +#: commands/tablecmds.c:16487 #, c-format msgid "table is missing column \"%s\"" msgstr "í…Œì´ë¸”ì—는 \"%s\" ì¹¼ëŸ¼ì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/tablecmds.c:14420 +#: commands/tablecmds.c:16498 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "\"%s\" ì¹¼ëŸ¼ì€ \"%s\" ìžë£Œí˜•입니다." -#: commands/tablecmds.c:14429 +#: commands/tablecmds.c:16507 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "\"%s\" í…Œì´ë¸”ì˜ \"%s\" 칼럼 ìžë£Œí˜• 틀립니다" -#: commands/tablecmds.c:14443 +#: commands/tablecmds.c:16521 #, c-format msgid "table has extra column \"%s\"" msgstr "\"%s\" ì¹¼ëŸ¼ì€ í™•ìž¥í˜•ìž…ë‹ˆë‹¤" -#: commands/tablecmds.c:14495 +#: commands/tablecmds.c:16573 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" í…Œì´ë¸”ì€ typed í…Œì´ë¸”ì´ ì•„ë‹™ë‹ˆë‹¤" -#: commands/tablecmds.c:14677 +#: commands/tablecmds.c:16747 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” ìœ ë‹ˆí¬ ì¸ë±ìŠ¤ê°€ 아니여서, 복제 ì‹ë³„ìžë¡œ 사용할 수 ì—†ìŒ" -#: commands/tablecmds.c:14683 +#: commands/tablecmds.c:16753 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "\"%s\" non-immediate ì¸ë±ìŠ¤ëŠ” 복제 ì‹ë³„ìžë¡œ 사용할 수 ì—†ìŒ" -#: commands/tablecmds.c:14689 +#: commands/tablecmds.c:16759 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” expression ì¸ë±ìŠ¤ì—¬ì„œ, 복제 ì‹ë³„ìžë¡œ 사용할 수 ì—†ìŒ" -#: commands/tablecmds.c:14695 +#: commands/tablecmds.c:16765 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "\"%s\" ì¸ë±ìŠ¤ê°€ 부분ì¸ë±ìŠ¤ì—¬ì„œ, 복제 ì‹ë³„ìžë¡œ 사용할 수 ì—†ìŒ" -#: commands/tablecmds.c:14701 -#, c-format -msgid "cannot use invalid index \"%s\" as replica identity" -msgstr "" -"\"%s\" ì¸ë±ìŠ¤ëŠ” 사용할 수 없는 ì¸ë±ìŠ¤ì—¬ì„œ, 복제 ì‹ë³„ìžë¡œ 사용할 수 ì—†ìŒ" - -#: commands/tablecmds.c:14718 +#: commands/tablecmds.c:16782 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column %d is a " @@ -10693,7 +12662,7 @@ msgid "" msgstr "" "\"%s\" ì¸ë±ìŠ¤ëŠ” 복제 ì‹ë³„ìžë¡œ 사용할 수 ì—†ìŒ, %d 번째 ì¹¼ëŸ¼ì´ ì‹œìŠ¤í…œ 칼럼임" -#: commands/tablecmds.c:14725 +#: commands/tablecmds.c:16789 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column \"%s\" is " @@ -10702,23 +12671,23 @@ msgstr "" "\"%s\" ì¸ë±ìŠ¤ëŠ” 복제 ì‹ë³„ìžë¡œ 사용할 수 ì—†ìŒ, \"%s\" ì¹¼ëŸ¼ì´ null ê°’ 사용가능 " "ì†ì„±ìž„" -#: commands/tablecmds.c:14918 +#: commands/tablecmds.c:17041 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "\"%s\" í…Œì´ë¸”ì€ ìž„ì‹œ í…Œì´ë¸”ì´ê¸°ì—, 통계 정보를 변경 í•  수 ì—†ìŒ" -#: commands/tablecmds.c:14942 +#: commands/tablecmds.c:17065 #, c-format msgid "" "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "\"%s\" í…Œì´ë¸”ì€ ë°œìƒì— 사용하고 있어, unlogged ì†ì„±ìœ¼ë¡œ 바꿀 수 ì—†ìŒ" -#: commands/tablecmds.c:14944 +#: commands/tablecmds.c:17067 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "unlogged 릴레ì´ì…˜ 복제할 수 없습니다." -#: commands/tablecmds.c:14989 +#: commands/tablecmds.c:17112 #, c-format msgid "" "could not change table \"%s\" to logged because it references unlogged table " @@ -10727,7 +12696,7 @@ msgstr "" "\"%s\" í…Œì´ë¸”ì´ \"%s\" unlogged í…Œì´ë¸”ì„ ì°¸ì¡°í•˜ê³  있어 logged ì†ì„±ìœ¼ë¡œ 바꿀 " "수 ì—†ìŒ" -#: commands/tablecmds.c:14999 +#: commands/tablecmds.c:17122 #, c-format msgid "" "could not change table \"%s\" to unlogged because it references logged table " @@ -10736,591 +12705,646 @@ msgstr "" "\"%s\" í…Œì´ë¸”ì´ \"%s\" logged í…Œì´ë¸”ì„ ì°¸ì¡°í•˜ê³  있어 unlogged ì†ì„±ìœ¼ë¡œ 바꿀 " "수 ì—†ìŒ" -#: commands/tablecmds.c:15057 +#: commands/tablecmds.c:17180 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "ì†Œìœ ëœ ì‹œí€€ìŠ¤ë¥¼ 다른 스키마로 ì´ë™í•  수 ì—†ìŒ" -#: commands/tablecmds.c:15163 +#: commands/tablecmds.c:17288 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "\"%s\" 릴레ì´ì…˜ì´ \"%s\" ìŠ¤í‚¤ë§ˆì— ì´ë¯¸ 있습니다" -#: commands/tablecmds.c:15726 +#: commands/tablecmds.c:17713 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "\"%s\" 개체는 í…Œì´ë¸”ë„ êµ¬ì²´í™”ëœ ë·°ë„ ì•„ë‹™ë‹ˆë‹¤" + +#: commands/tablecmds.c:17866 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" 개체는 복합 ìžë£Œí˜•입니다" -#: commands/tablecmds.c:15758 +#: commands/tablecmds.c:17896 #, c-format -msgid "" -"\"%s\" is not a table, view, materialized view, sequence, or foreign table" -msgstr "" -"\"%s\" 개체는 í…Œì´ë¸”, ë·°, êµ¬ì²´í™”ëœ ë·°, 시퀀스, 외부 í…Œì´ë¸” ê·¸ ì–´ëŠ ê²ƒë„ ì•„ë‹™" -"니다" +msgid "cannot change schema of index \"%s\"" +msgstr "\"%s\" ì¸ë±ìŠ¤ì˜ ìŠ¤í‚¤ë§ˆë¥¼ 바꿀 수 ì—†ìŒ" + +#: commands/tablecmds.c:17898 commands/tablecmds.c:17912 +#, c-format +msgid "Change the schema of the table instead." +msgstr "ëŒ€ì‹ ì— ê·¸ ì¸ë±ìŠ¤ì˜ í•´ë‹¹ í…Œì´ë¸” 스키마를 변경하세요." -#: commands/tablecmds.c:15793 +#: commands/tablecmds.c:17902 #, c-format -msgid "unrecognized partitioning strategy \"%s\"" -msgstr "알 수 없는 파티션 규칙 \"%s\"" +msgid "cannot change schema of composite type \"%s\"" +msgstr "\"%s\" 복합 ìžë£Œí˜•ì˜ ìŠ¤í‚¤ë§ˆë¥¼ 바꿀 수 ì—†ìŒ" + +#: commands/tablecmds.c:17910 +#, c-format +msgid "cannot change schema of TOAST table \"%s\"" +msgstr "\"%s\" TOAST í…Œì´ë¸”ì˜ ìŠ¤í‚¤ë§ˆë¥¼ 바꿀 수 ì—†ìŒ" -#: commands/tablecmds.c:15801 +#: commands/tablecmds.c:17942 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "둘 ì´ìƒì˜ ì¹¼ëŸ¼ì„ ì‚¬ìš©í•  \"list\" íŒŒí‹°ì…˜ì€ ì‚¬ìš©í•  수 없습니다" -#: commands/tablecmds.c:15867 +#: commands/tablecmds.c:18008 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "\"%s\" ì¹¼ëŸ¼ì´ íŒŒí‹°ì…˜ 키로 사용ë˜ê³  있지 않습니다" -#: commands/tablecmds.c:15875 +#: commands/tablecmds.c:18016 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "\"%s\" ì¹¼ëŸ¼ì€ ì‹œìŠ¤í…œ 칼럼입니다. 그래서 파티션 키로 ì‚¬ìš©ë  ìˆ˜ 없습니다" -#: commands/tablecmds.c:15886 commands/tablecmds.c:16000 +#: commands/tablecmds.c:18027 commands/tablecmds.c:18117 #, c-format msgid "cannot use generated column in partition key" msgstr "미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì€ íŒŒí‹°ì…˜ 키로 사용할 수 ì—†ìŒ" -#: commands/tablecmds.c:15887 commands/tablecmds.c:16001 commands/trigger.c:641 -#: rewrite/rewriteHandler.c:829 rewrite/rewriteHandler.c:846 +#: commands/tablecmds.c:18100 #, c-format -msgid "Column \"%s\" is a generated column." -msgstr "\"%s\" ì¹¼ëŸ¼ì€ ë¯¸ë¦¬ ê³„ì‚°ëœ ì¹¼ëŸ¼ìž…ë‹ˆë‹¤." +msgid "partition key expressions cannot contain system column references" +msgstr "파티션 키 표현ì‹ì—서는 시스템 칼럼 참조를 í¬í•¨í•  수 없습니다" -#: commands/tablecmds.c:15963 +#: commands/tablecmds.c:18147 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" -msgstr "파티션 키로 사용할 함수는 IMMUTABLE íŠ¹ì„±ì´ ìžˆì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "파티션 키로 사용할 함수는 IMMUTABLE íŠ¹ì„±ì´ ìžˆì–´ì•¼ 합니다" -#: commands/tablecmds.c:15983 -#, c-format -msgid "partition key expressions cannot contain system column references" -msgstr "파티션 키 표현ì‹ì—서는 시스템 칼럼 참조를 í¬í•¨í•  수 없습니다" - -#: commands/tablecmds.c:16013 +#: commands/tablecmds.c:18156 #, c-format msgid "cannot use constant expression as partition key" msgstr "파티션 키로 ìƒìˆ˜ëŠ” 쓸 수 없습니다" -#: commands/tablecmds.c:16034 +#: commands/tablecmds.c:18177 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "파티션 표현ì‹ì— 쓸 ë¬¸ìž ì •ë ¬ ê·œì¹™ì„ ê²°ì •í•  수 없습니다" -#: commands/tablecmds.c:16069 +#: commands/tablecmds.c:18212 #, c-format msgid "" "You must specify a hash operator class or define a default hash operator " "class for the data type." msgstr "" "해당 ìžë£Œí˜•ì„ ìœ„í•œ 해시 ì—°ì‚°ìž í´ëž˜ìŠ¤ë¥¼ 지정하거나 기본 해시 ì—°ì‚°ìž í´ëž˜ìŠ¤ë¥¼ " -"ì •ì˜í•´ ë‘어야합니다" +"ì •ì˜í•´ ë‘어야 합니다" -#: commands/tablecmds.c:16075 +#: commands/tablecmds.c:18218 #, c-format msgid "" "You must specify a btree operator class or define a default btree operator " "class for the data type." msgstr "" "해당 ìžë£Œí˜•ì„ ìœ„í•œ btree ì—°ì‚°ìž í´ëž˜ìŠ¤ë¥¼ 지정하거나 기본 btree ì—°ì‚°ìž í´ëž˜ìФ" -"를 ì •ì˜í•´ ë‘어야합니다" - -#: commands/tablecmds.c:16220 -#, c-format -msgid "" -"partition constraint for table \"%s\" is implied by existing constraints" -msgstr "" +"를 ì •ì˜í•´ ë‘어야 합니다" -#: commands/tablecmds.c:16224 partitioning/partbounds.c:3129 -#: partitioning/partbounds.c:3180 -#, c-format -msgid "" -"updated partition constraint for default partition \"%s\" is implied by " -"existing constraints" -msgstr "" - -#: commands/tablecmds.c:16323 +#: commands/tablecmds.c:18469 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" ì´ë¦„ì˜ íŒŒí‹°ì…˜ í…Œì´ë¸”ì´ ì´ë¯¸ 있습니다" -#: commands/tablecmds.c:16329 +#: commands/tablecmds.c:18475 #, c-format msgid "cannot attach a typed table as partition" msgstr "파티션 í…Œì´ë¸”로 typed í…Œì´ë¸”ì„ ì¶”ê°€í•  수 ì—†ìŒ" -#: commands/tablecmds.c:16345 +#: commands/tablecmds.c:18491 #, c-format msgid "cannot attach inheritance child as partition" msgstr "파티션 í…Œì´ë¸”로 ìƒì†ì„ ì´ìš©í•œ 하위 í…Œì´ë¸”ì„ ì¶”ê°€í•  수 ì—†ìŒ" -#: commands/tablecmds.c:16359 +#: commands/tablecmds.c:18505 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "파티션 í…Œì´ë¸”로 ìƒì†ìš© ìƒìœ„ í…Œì´ë¸”ì„ ì¶”ê°€í•  수 ì—†ìŒ" -#: commands/tablecmds.c:16393 +#: commands/tablecmds.c:18539 #, c-format msgid "" "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "" "\"%s\" í…Œì´ë¸”ì€ ì¼ë°˜ í…Œì´ë¸”입니다, 임시 파티션 í…Œì´ë¸”ì„ ì¶”ê°€í•  수 없습니다" -#: commands/tablecmds.c:16401 +#: commands/tablecmds.c:18547 #, c-format msgid "" "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "" "\"%s\" í…Œì´ë¸”ì€ ìž„ì‹œ í…Œì´ë¸”입니다, ì¼ë°˜ 파티션 í…Œì´ë¸”ì„ ì¶”ê°€í•  수 없습니다" -#: commands/tablecmds.c:16409 +#: commands/tablecmds.c:18555 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸”ì„ íŒŒí‹°ì…˜ í…Œì´ë¸”로 추가할 수 없습니다" -#: commands/tablecmds.c:16416 +#: commands/tablecmds.c:18562 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸”ì„ íŒŒí‹°ì…˜ í…Œì´ë¸”로 추가할 수 없습니다" -#: commands/tablecmds.c:16436 +#: commands/tablecmds.c:18582 +#, c-format +msgid "table \"%s\" being attached contains an identity column \"%s\"" +msgstr "" +"\"%s\" í…Œì´ë¸”ì˜ \"%s\" ì¹¼ëŸ¼ì— ì‹ë³„ìž ì†ì„±ì´ ìžˆëŠ”ë° í•˜ìœ„ í…Œì´ë¸”ì´ ë˜ë ¤ê³  합니" +"다." + +#: commands/tablecmds.c:18584 +#, c-format +msgid "The new partition may not contain an identity column." +msgstr "" +"새로 만들어지는 하위 í…Œì´ë¸”ì—는 해당 ì¹¼ëŸ¼ì— ì‹ë³„ìž ì†ì„±ì´ ì—†ì„ ìˆ˜ 있습니다." + +#: commands/tablecmds.c:18592 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "\"%s\" í…Œì´ë¸”ì˜ \"%s\" ì¹¼ëŸ¼ì´ ìƒìœ„ í…Œì´ë¸”ì¸ \"%s\"ì— ì—†ìŒ" -#: commands/tablecmds.c:16439 +#: commands/tablecmds.c:18595 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "새 파티션 í…Œì´ë¸”ì€ ìƒìœ„ í…Œì´ë¸”ì˜ ì¹¼ëŸ¼ê³¼ ë™ì¼í•´ì•¼ 합니다." -#: commands/tablecmds.c:16451 +#: commands/tablecmds.c:18607 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "" "\"%s\" 트리거가 \"%s\" í…Œì´ë¸”ì— ìžˆì–´ 파티션 í…Œì´ë¸”로 í¬í•¨ ë  ìˆ˜ 없습니다" -#: commands/tablecmds.c:16453 commands/trigger.c:447 +#: commands/tablecmds.c:18609 #, c-format -msgid "ROW triggers with transition tables are not supported on partitions" +msgid "ROW triggers with transition tables are not supported on partitions." msgstr "" -"ROW íŠ¸ë¦¬ê±°ë“¤ì´ ìžˆëŠ” í…Œì´ë¸”ì„ íŒŒí‹°ì…˜ í…Œì´ë¸”로 í¬í•¨í•˜ëŠ” ê¸°ëŠ¥ì€ ì§€ì›í•˜ì§€ 않습니" -"다" +"transition í…Œì´ë¸”ì˜ ROW íŠ¸ë¦¬ê±°ë“¤ì€ íŒŒí‹°ì…˜ 하위 í…Œì´ë¸”ì—서는 쓸 수 없습니다." -#: commands/tablecmds.c:16616 +#: commands/tablecmds.c:18785 #, c-format msgid "" "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "\"%s\" 외부 í…Œì´ë¸”ì„ íŒŒí‹°ì…˜ëœ \"%s\" í…Œì´ë¸”ì˜ ë¶€ë¶„ìœ¼ë¡œ 추가 í•  수 ì—†ìŒ" -#: commands/tablecmds.c:16619 +#: commands/tablecmds.c:18788 +#, c-format +msgid "Partitioned table \"%s\" contains unique indexes." +msgstr "\"%s\" 파티션 ìƒìœ„ í…Œì´ë¸”ì— ìœ ë‹ˆí¬ ì¸ë±ìŠ¤ê°€ 있습니다." + +#: commands/tablecmds.c:19110 #, c-format -msgid "Table \"%s\" contains unique indexes." -msgstr "\"%s\" í…Œì´ë¸”ì— ìœ ë‹ˆí¬ ì¸ë±ìŠ¤ê°€ 있습니다." +msgid "cannot detach partitions concurrently when a default partition exists" +msgstr "기본 하위 íŒŒí‹°ì…˜ì´ ìžˆì„ ë•ŒëŠ” 하위 파티션 í…Œì´ë¸” 분리 ìž‘ì—…ì„ í•  수 ì—†ìŒ" -#: commands/tablecmds.c:17265 commands/tablecmds.c:17285 -#: commands/tablecmds.c:17305 commands/tablecmds.c:17324 -#: commands/tablecmds.c:17366 +#: commands/tablecmds.c:19219 +#, c-format +msgid "partitioned table \"%s\" was removed concurrently" +msgstr "\"%s\" 파티션 ìƒìœ„ í…Œì´ë¸”ì´ ì˜¨ë¼ì¸ 모드로 ì‚­ì œ ë˜ì—ˆìŒ" + +#: commands/tablecmds.c:19225 +#, c-format +msgid "partition \"%s\" was removed concurrently" +msgstr "\"%s\" 파티션 하위 í…Œì´ë¸”ì´ ì˜¨ë¼ì¸ 모드로 ì‚­ì œ ë˜ì—ˆìŒ" + +#: commands/tablecmds.c:19817 commands/tablecmds.c:19837 +#: commands/tablecmds.c:19858 commands/tablecmds.c:19877 +#: commands/tablecmds.c:19919 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "\"%s\" ì¸ë±ìŠ¤ë¥¼ \"%s\" ì¸ë±ìŠ¤ì˜ íŒŒí‹°ì…˜ìœ¼ë¡œ 추가할 수 ì—†ìŒ" -#: commands/tablecmds.c:17268 +#: commands/tablecmds.c:19820 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” ì´ë¯¸ 다른 ì¸ë±ìŠ¤ì— ì¶”ê°€ë˜ì–´ 있ìŒ." -#: commands/tablecmds.c:17288 +#: commands/tablecmds.c:19840 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” \"%s\" í…Œì´ë¸”ì˜ í•˜ìœ„ 파티션 ëŒ€ìƒ ì¸ë±ìŠ¤ê°€ 아닙니다." -#: commands/tablecmds.c:17308 +#: commands/tablecmds.c:19861 #, c-format msgid "The index definitions do not match." msgstr "ì¸ë±ìФ ì •ì˜ê°€ ì¼ì¹˜í•˜ì§€ 않습니다." -#: commands/tablecmds.c:17327 +#: commands/tablecmds.c:19880 #, c-format msgid "" "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint " "exists for index \"%s\"." msgstr "" +"\"%s\" ì¸ë±ìŠ¤ëŠ” \"%s\" í…Œì´ë¸”ì˜ ì œì•½ì¡°ê±´ê³¼ ì—°ê²°ë˜ì–´ 있는ë°, \"%s\" ì¸ë±ìŠ¤ë¥¼ " +"위한 ì œì•½ì¡°ê±´ì´ ì—†ìŠµë‹ˆë‹¤." -#: commands/tablecmds.c:17369 +#: commands/tablecmds.c:19922 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "\"%s\" 파티션 용으로 다른 ì¸ë±ìŠ¤ê°€ 추가ë˜ì–´ 있습니다." -#: commands/tablespace.c:162 commands/tablespace.c:179 -#: commands/tablespace.c:190 commands/tablespace.c:198 -#: commands/tablespace.c:638 replication/slot.c:1373 storage/file/copydir.c:47 +#: commands/tablecmds.c:20158 #, c-format -msgid "could not create directory \"%s\": %m" -msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m" +msgid "column data type %s does not support compression" +msgstr "%s í˜•ì˜ ì¹¼ëŸ¼ ìžë£Œí˜•ì€ ì••ì¶•ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: commands/tablespace.c:209 +#: commands/tablecmds.c:20165 #, c-format -msgid "could not stat directory \"%s\": %m" -msgstr "\"%s\" 디렉터리 ìƒíƒœë¥¼ 파악할 수 ì—†ìŒ: %m" +msgid "invalid compression method \"%s\"" +msgstr "ìž˜ëª»ëœ ì••ì¶• 방법: \"%s\"" + +#: commands/tablecmds.c:20191 +#, c-format +msgid "invalid storage type \"%s\"" +msgstr "ìž˜ëª»ëœ STORAGE ê°’: \"%s\"" + +#: commands/tablecmds.c:20201 +#, c-format +msgid "column data type %s can only have storage PLAIN" +msgstr "%s ìžë£Œí˜•ì˜ columnì˜ STORAGE ê°’ì€ ë°˜ë“œì‹œ PLAIN ì´ì–´ì•¼ 합니다" -#: commands/tablespace.c:218 +#: commands/tablespace.c:193 commands/tablespace.c:644 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "\"%s\" 파ì¼ì´ 존재하지만 디렉터리가 아닙니다" -#: commands/tablespace.c:249 +#: commands/tablespace.c:224 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "\"%s\" í…Œì´ë¸”스페ì´ìŠ¤ë¥¼ 만들 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/tablespace.c:251 +#: commands/tablespace.c:226 #, c-format msgid "Must be superuser to create a tablespace." msgstr "í…Œì´ë¸”스페ì´ìŠ¤ëŠ” 슈í¼ìœ ì €ë§Œ 만들 수 있습니다." -#: commands/tablespace.c:267 +#: commands/tablespace.c:242 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "í…Œì´ë¸”스페ì´ìФ 위치ì—는 ìž‘ì€ ë”°ì˜´í‘œë¥¼ 사용할 수 ì—†ìŒ" -#: commands/tablespace.c:277 +#: commands/tablespace.c:255 #, c-format msgid "tablespace location must be an absolute path" -msgstr "í…Œì´ë¸”스페ì´ìФ 경로는 절대경로여야합니다" +msgstr "í…Œì´ë¸”스페ì´ìФ 경로는 절대경로여야 합니다" -#: commands/tablespace.c:289 +#: commands/tablespace.c:267 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "í…Œì´ë¸”스페ì´ìФ 경로가 너무 ê¹ë‹ˆë‹¤: \"%s\"" -#: commands/tablespace.c:296 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "í…Œì´ë¸”스페ì´ìФ 경로는 ë°ì´í„° 디렉터리 ì•ˆì— ìžˆìœ¼ë©´ 안ë©ë‹ˆë‹¤" -#: commands/tablespace.c:305 commands/tablespace.c:965 +#: commands/tablespace.c:283 commands/tablespace.c:970 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "\"%s\" í…Œì´ë¸”스페ì´ìФ ì´ë¦„ì€ ì ë‹¹ì¹˜ 않습니다" -#: commands/tablespace.c:307 commands/tablespace.c:966 +#: commands/tablespace.c:285 commands/tablespace.c:971 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "\"pg_\" 문ìžë¡œ 시작하는 í…Œì´ë¸”스페ì´ìŠ¤ëŠ” 시스템 í…Œì´ë¸”스페ì´ìŠ¤ìž…ë‹ˆë‹¤." -#: commands/tablespace.c:326 commands/tablespace.c:987 +#: commands/tablespace.c:304 commands/tablespace.c:992 #, c-format msgid "tablespace \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ í…Œì´ë¸”스페ì´ìŠ¤ëŠ” ì´ë¯¸ 있ìŒ" -#: commands/tablespace.c:442 commands/tablespace.c:948 -#: commands/tablespace.c:1037 commands/tablespace.c:1106 -#: commands/tablespace.c:1252 commands/tablespace.c:1455 +#: commands/tablespace.c:320 +#, c-format +msgid "pg_tablespace OID value not set when in binary upgrade mode" +msgstr "ì´ì§„ 업그레ì´ë“œ 작업 때 pg_tablespace OID ê°’ì´ ì§€ì •ë˜ì§€ 않ìŒ" + +#: commands/tablespace.c:425 commands/tablespace.c:953 +#: commands/tablespace.c:1042 commands/tablespace.c:1111 +#: commands/tablespace.c:1257 commands/tablespace.c:1460 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "\"%s\" í…Œì´ë¸”스페ì´ìФ ì—†ìŒ" -#: commands/tablespace.c:448 +#: commands/tablespace.c:431 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "\"%s\" í…Œì´ë¸”스페ì´ìФ ì—†ìŒ, 건너 뜀" -#: commands/tablespace.c:525 +#: commands/tablespace.c:457 +#, c-format +msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" +msgstr "몇 ê°ì²´ë“¤ì´ ì˜ì¡´ê´€ê³„를 가져 \"%s\" í…Œì´ë¸”스페ì´ìŠ¤ë¥¼ 삭제할 수 ì—†ìŒ" + +#: commands/tablespace.c:524 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "\"%s\" í…Œì´ë¸”스페ì´ìŠ¤ëŠ” 비어있지 않ìŒ" -#: commands/tablespace.c:597 +#: commands/tablespace.c:611 #, c-format msgid "directory \"%s\" does not exist" msgstr "\"%s\" 디렉터리 ì—†ìŒ" -#: commands/tablespace.c:598 +#: commands/tablespace.c:612 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "ì´ ì„œë²„ë¥¼ 재시작하기 ì „ì— ì´ í…Œì´ë¸”스페ì´ìФ ìš© 디렉터리를 만드세요." -#: commands/tablespace.c:603 +#: commands/tablespace.c:617 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "\"%s\" 디렉터리 액세스 ê¶Œí•œì„ ì§€ì •í•  수 ì—†ìŒ: %m" -#: commands/tablespace.c:633 +#: commands/tablespace.c:649 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "\"%s\" 디렉터리는 ì´ë¯¸ í…Œì´ë¸”스페ì´ìŠ¤ë¡œ 사용 중임" -#: commands/tablespace.c:757 commands/tablespace.c:770 -#: commands/tablespace.c:806 commands/tablespace.c:898 storage/file/fd.c:3108 -#: storage/file/fd.c:3448 -#, c-format -msgid "could not remove directory \"%s\": %m" -msgstr "\"%s\" 디렉터리를 삭제할 수 ì—†ìŒ: %m" - -#: commands/tablespace.c:819 commands/tablespace.c:907 +#: commands/tablespace.c:827 commands/tablespace.c:913 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "\"%s\" 심벌릭 ë§í¬ë¥¼ 삭제할 수 ì—†ìŒ: %m" -#: commands/tablespace.c:829 commands/tablespace.c:916 +#: commands/tablespace.c:836 commands/tablespace.c:921 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "\"%s\" 디렉터리ë„, 심볼릭 ë§í¬ë„ 아님" -#: commands/tablespace.c:1111 +#: commands/tablespace.c:1116 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "\"%s\" í…Œì´ë¸”스페ì´ìФ ì—†ìŒ" -#: commands/tablespace.c:1554 +#: commands/tablespace.c:1562 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "%u OID í…Œì´ë¸”스페ì´ìŠ¤ìš© 디렉터리는 ì‚­ì œë  ìˆ˜ ì—†ìŒ" -#: commands/tablespace.c:1556 +#: commands/tablespace.c:1564 #, c-format msgid "You can remove the directories manually if necessary." msgstr "필요하다면 OS 작업으로 ê·¸ 디레터리를 삭제하세요" -#: commands/trigger.c:204 commands/trigger.c:215 +#: commands/trigger.c:225 commands/trigger.c:236 #, c-format msgid "\"%s\" is a table" -msgstr "\"%s\" 개체는 í…Œì´ë¸”입니다." +msgstr "\"%s\" 개체는 í…Œì´ë¸”ìž„" -#: commands/trigger.c:206 commands/trigger.c:217 +#: commands/trigger.c:227 commands/trigger.c:238 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "í…Œì´ë¸”ì— INSTEAD OF 트리거는 설정할 수 ì—†ìŒ" -#: commands/trigger.c:238 +#: commands/trigger.c:259 #, c-format msgid "\"%s\" is a partitioned table" -msgstr "\"%s\" 개체는 íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ìž„" +msgstr "\"%s\" 개체는 파티션 ìƒìœ„ í…Œì´ë¸”ìž„" -#: commands/trigger.c:240 +#: commands/trigger.c:261 #, c-format -msgid "Triggers on partitioned tables cannot have transition tables." -msgstr "íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì— ì§€ì •ëœ íŠ¸ë¦¬ê±°ëŠ” 전달 í…Œì´ë¸”ì„ ê°€ì§ˆ 수 ì—†ìŒ." +msgid "" +"ROW triggers with transition tables are not supported on partitioned tables." +msgstr "" +"transition í…Œì´ë¸”ì˜ ROW íŠ¸ë¦¬ê±°ë“¤ì€ íŒŒí‹°ì…˜ ìƒìœ„ í…Œì´ë¸”ì—서 ì§€ì›í•˜ì§€ 않ìŒ." -#: commands/trigger.c:252 commands/trigger.c:259 commands/trigger.c:429 +#: commands/trigger.c:273 commands/trigger.c:280 commands/trigger.c:444 #, c-format msgid "\"%s\" is a view" -msgstr "\"%s\" 개체는 뷰입니다." +msgstr "\"%s\" 개체는 ë·°ìž„" -#: commands/trigger.c:254 +#: commands/trigger.c:275 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "ë·°ì— ë¡œìš° 단위 BEFORE, AFTER 트리거는 설정할 수 ì—†ìŒ" -#: commands/trigger.c:261 +#: commands/trigger.c:282 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "ë·°ì— TRUNCATE 트리거는 설정할 수 ì—†ìŒ" -#: commands/trigger.c:269 commands/trigger.c:276 commands/trigger.c:288 -#: commands/trigger.c:422 +#: commands/trigger.c:290 commands/trigger.c:302 commands/trigger.c:437 #, c-format msgid "\"%s\" is a foreign table" -msgstr "\"%s\" 개체는 외부 í…Œì´ë¸”입니다." +msgstr "\"%s\" 개체는 외부 í…Œì´ë¸”ìž„" -#: commands/trigger.c:271 +#: commands/trigger.c:292 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "외부테ì´ë¸”ì— INSTEAD OF 트리거는 설정할 수 ì—†ìŒ" -#: commands/trigger.c:278 -#, c-format -msgid "Foreign tables cannot have TRUNCATE triggers." -msgstr "외부 í…Œì´ë¸”ì—는 TRUNCATE 트리거를 사용할 수 ì—†ìŒ" - -#: commands/trigger.c:290 +#: commands/trigger.c:304 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "외부 í…Œì´ë¸”ì— ì œì•½ ì¡°ê±´ 트리거는 설정할 수 ì—†ìŒ" -#: commands/trigger.c:365 +#: commands/trigger.c:309 commands/trigger.c:1325 commands/trigger.c:1432 +#, c-format +msgid "relation \"%s\" cannot have triggers" +msgstr "\"%s\" 릴레ì´ì…˜ì—는 트리거를 지정할 수 ì—†ìŒ" + +#: commands/trigger.c:380 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "TRUNCATE FOR EACH ROW 트리거는 ì§€ì›ë˜ì§€ 않ìŒ" -#: commands/trigger.c:373 +#: commands/trigger.c:388 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "INSTEAD OF 트리거는 FOR EACH ROW 옵션으로 설정해야 함" -#: commands/trigger.c:377 +#: commands/trigger.c:392 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "INSTEAD OF 트리거는 WHEN ì¡°ê±´ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: commands/trigger.c:381 +#: commands/trigger.c:396 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "INSTEAD OF 트리거는 칼럼 목ë¡ì„ 사용할 수 ì—†ìŒ" -#: commands/trigger.c:410 +#: commands/trigger.c:425 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" -msgstr "" +msgstr "REFERENCING ì ˆì— ROW 변수 ì´ë¦„ ë¶™ì´ê¸°ë¥¼ ì§€ì›í•˜ì§€ 않습니다." -#: commands/trigger.c:411 +#: commands/trigger.c:426 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." -msgstr "" +msgstr "ì´ë¦„ 기반 전환 í…Œì´ë¸”ì€ OLD TABLE ë˜ëŠ” NEW TABLE ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: commands/trigger.c:424 +#: commands/trigger.c:439 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "외부 í…Œì´ë¸”ì˜ íŠ¸ë¦¬ê±°ë“¤ì€ ì „í™˜ í…Œì´ë¸”ì„ ê°€ì§ˆ 수 ì—†ìŒ." -#: commands/trigger.c:431 +#: commands/trigger.c:446 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "ë·°ì— ì •ì˜í•œ íŠ¸ë¦¬ê±°ë“¤ì€ ì „í™˜ í…Œì´ë¸”ì„ ê°€ì§ˆ 수 ì—†ìŒ." -#: commands/trigger.c:451 +#: commands/trigger.c:462 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitions" +msgstr "" +"ROW íŠ¸ë¦¬ê±°ë“¤ì´ ìžˆëŠ” í…Œì´ë¸”ì„ íŒŒí‹°ì…˜ í…Œì´ë¸”로 í¬í•¨í•˜ëŠ” ê¸°ëŠ¥ì€ ì§€ì›í•˜ì§€ 않습니" +"다" + +#: commands/trigger.c:466 #, c-format msgid "" "ROW triggers with transition tables are not supported on inheritance children" -msgstr "" +msgstr "전환 í…Œì´ë¸”ìš© ROW 트리거는 하위 ìƒì† í…Œì´ë¸”ì—서는 지정할 수 없습니다." -#: commands/trigger.c:457 +#: commands/trigger.c:472 #, c-format msgid "transition table name can only be specified for an AFTER trigger" -msgstr "" +msgstr "전환 í…Œì´ë¸” ì´ë¦„ì€ AFTER 트리거ì—서만 사용할 수 있습니다." -#: commands/trigger.c:462 +#: commands/trigger.c:477 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "전환 í…Œì´ë¸”ì—서 TRUNCATE 트리거는 ì§€ì›í•˜ì§€ 않습니다" -#: commands/trigger.c:479 +#: commands/trigger.c:494 #, c-format msgid "" "transition tables cannot be specified for triggers with more than one event" msgstr "전환 í…Œì´ë¸”ì€ í•˜ë‚˜ ì´ìƒì˜ ì´ë²¤íŠ¸ì— ëŒ€í•œ 트리거를 지정할 수 없습니다" -#: commands/trigger.c:490 +#: commands/trigger.c:505 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "전환 í…Œì´ë¸”ì€ ì¹¼ëŸ¼ 목ë¡ë“¤ì— 대한 트리거를 지정할 수 없습니다" -#: commands/trigger.c:507 +#: commands/trigger.c:522 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" -msgstr "" +msgstr "NEW TABLE ì˜µì…˜ì€ INSERT ë˜ëŠ” UPDATE 트리거ì—서만 사용할 수 있습니다." -#: commands/trigger.c:512 +#: commands/trigger.c:527 #, c-format msgid "NEW TABLE cannot be specified multiple times" -msgstr "" +msgstr "NEW TABLE ì˜µì…˜ì€ ì¤‘ë³µí•´ì„œ 사용할 수 ì—†ìŒ" -#: commands/trigger.c:522 +#: commands/trigger.c:537 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" -msgstr "" +msgstr "OLD TABLE ì˜µì…˜ì€ DELETE ë˜ëŠ” UPDATE 트리거ì—서만 사용할 수 있습니다." -#: commands/trigger.c:527 +#: commands/trigger.c:542 #, c-format msgid "OLD TABLE cannot be specified multiple times" -msgstr "" +msgstr "OLD TABLE ì˜µì…˜ì€ ì¤‘ë³µí•´ì„œ 사용할 수 ì—†ìŒ" -#: commands/trigger.c:537 +#: commands/trigger.c:552 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" -msgstr "" +msgstr "OLD TABLE ê³¼ NEW TABLE ë’¤ì— ì˜¤ëŠ” ì´ë¦„ì´ ê°™ì„ ìˆ˜ëŠ” 없습니다." -#: commands/trigger.c:601 commands/trigger.c:614 +#: commands/trigger.c:616 commands/trigger.c:629 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "íŠ¸ë¦¬ê±°ì˜ WHEN ì¡°ê±´ì—는 칼럼 ê°’ì„ ì°¸ì¡°í•  수는 ì—†ìŒ" -#: commands/trigger.c:606 +#: commands/trigger.c:621 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "INSERT 트리거ì—ì„œì˜ WHEN ì¡°ê±´ì—는 OLD ê°’ì„ ì°¸ì¡°í•  수 ì—†ìŒ" -#: commands/trigger.c:619 +#: commands/trigger.c:634 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "DELETE 트리거ì—ì„œì˜ WHEN ì¡°ê±´ì—는 NEW ê°’ì„ ì°¸ì¡°í•  수 ì—†ìŒ" -#: commands/trigger.c:624 +#: commands/trigger.c:639 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "WHEN ì¡°ê±´ì ˆì´ ìžˆëŠ” BEFORE 트리거는 NEW 시스템 ì¹¼ëŸ¼ì„ ì°¸ì¡°í•  수 ì—†ìŒ" -#: commands/trigger.c:632 commands/trigger.c:640 +#: commands/trigger.c:647 commands/trigger.c:655 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "" "WHEN ì¡°ê±´ì ˆì´ ìžˆëŠ” BEFORE 트리거는 NEW 미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì„ ì°¸ì¡°í•  수 ì—†ìŒ" -#: commands/trigger.c:633 +#: commands/trigger.c:648 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "" +"로우 ì „ì²´ 참조가 사용ë˜ì—ˆê³ , ê·¸ í…Œì´ë¸”ì—는 미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì´ ìžˆìŠµë‹ˆë‹¤." -#: commands/trigger.c:780 commands/trigger.c:1385 +#: commands/trigger.c:763 commands/trigger.c:1607 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ íŠ¸ë¦¬ê±°ê°€ \"%s\" í…Œì´ë¸”ì— ì´ë¯¸ 있습니다" -#: commands/trigger.c:1271 commands/trigger.c:1432 commands/trigger.c:1568 +#: commands/trigger.c:776 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" +msgstr "\"%s\" 트리거가 \"%s\" í…Œì´ë¸”ì— ë‚´ìž¥ ë˜ëŠ” 하위 트리거로 있ìŒ" + +#: commands/trigger.c:795 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" +msgstr " \"%s\" 트리거가 \"%s\" 릴레ì´ì…˜ì— 제약 ì¡°ê±´ 트리거로 있ìŒ" + +#: commands/trigger.c:1397 commands/trigger.c:1550 commands/trigger.c:1831 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "\"%s\" 트리거는 \"%s\" í…Œì´ë¸”ì— ì—†ìŒ" -#: commands/trigger.c:1515 +#: commands/trigger.c:1522 +#, c-format +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "\"%s\" 트리거(해당 í…Œì´ë¸”: \"%s\") ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ" + +#: commands/trigger.c:1524 +#, c-format +msgid "Rename the trigger on the partitioned table \"%s\" instead." +msgstr "ëŒ€ì‹ ì— ìƒìœ„ 파티션 í…Œì´ë¸”ì¸ \"%s\" í…Œì´ë¸”ì˜ íŠ¸ë¦¬ê±° ì´ë¦„ì„ ë°”ê¾¸ì„¸ìš”." + +#: commands/trigger.c:1624 +#, c-format +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "\"%s\" 트리거(해당 í…Œì´ë¸”: \"%s\") ì´ë¦„ì„ ë°”ê¿¨ìŒ" + +#: commands/trigger.c:1770 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "액세스 권한 ì—†ìŒ: \"%s\" 개체는 시스템 트리거임" -#: commands/trigger.c:2116 +#: commands/trigger.c:2379 #, c-format msgid "trigger function %u returned null value" msgstr "%u 트리거 함수가 null ê°’ì„ ë¦¬í„´í–ˆìŠµë‹ˆë‹¤" -#: commands/trigger.c:2176 commands/trigger.c:2390 commands/trigger.c:2625 -#: commands/trigger.c:2933 +#: commands/trigger.c:2439 commands/trigger.c:2657 commands/trigger.c:2910 +#: commands/trigger.c:3263 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "BEFORE STATEMENT 트리거는 ë¦¬í„´ê°’ì´ ìžˆìœ¼ë©´ 안ë©ë‹ˆë‹¤" -#: commands/trigger.c:2250 +#: commands/trigger.c:2515 #, c-format msgid "" "moving row to another partition during a BEFORE FOR EACH ROW trigger is not " "supported" msgstr "" +"BEFORE FOR EACH ROW 트리거가 실행 ì¤‘ì¼ ë•Œ 다른 파티션으로 로우는 옮기는 ê²ƒì€ " +"ì§€ì› í•˜ì§€ 않습니다." -#: commands/trigger.c:2251 commands/trigger.c:2755 +#: commands/trigger.c:2516 #, c-format msgid "" "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "" +"\"%s\" 트리거가 실행ë˜ê¸° ì „ì—, ê·¸ 로우는 \"%s.%s\" íŒŒí‹°ì…˜ì— ìžˆì—ˆìŠµë‹ˆë‹¤." -#: commands/trigger.c:2754 -#, c-format -msgid "" -"moving row to another partition during a BEFORE trigger is not supported" -msgstr "" - -#: commands/trigger.c:2996 executor/nodeModifyTable.c:1380 -#: executor/nodeModifyTable.c:1449 -#, c-format -msgid "" -"tuple to be updated was already modified by an operation triggered by the " -"current command" -msgstr "" -"현재 명령으로 ì‹¤í–‰ëœ íŠ¸ë¦¬ê±° 작업으로 변경해야할 ìžë£Œê°€ ì´ë¯¸ 바뀌었습니다." - -#: commands/trigger.c:2997 executor/nodeModifyTable.c:840 -#: executor/nodeModifyTable.c:914 executor/nodeModifyTable.c:1381 -#: executor/nodeModifyTable.c:1450 +#: commands/trigger.c:3341 executor/nodeModifyTable.c:1541 +#: executor/nodeModifyTable.c:1615 executor/nodeModifyTable.c:2377 +#: executor/nodeModifyTable.c:2468 executor/nodeModifyTable.c:3132 +#: executor/nodeModifyTable.c:3302 #, c-format msgid "" "Consider using an AFTER trigger instead of a BEFORE trigger to propagate " @@ -11329,334 +13353,360 @@ msgstr "" "다른 로우를 변경하는 ì¼ì„ BEFORE 트리거 ëŒ€ì‹ ì— AFTER 트리거 ì‚¬ìš©ì„ ê³ ë ¤í•´ ë³´" "십시오" -#: commands/trigger.c:3026 executor/nodeLockRows.c:225 -#: executor/nodeLockRows.c:234 executor/nodeModifyTable.c:220 -#: executor/nodeModifyTable.c:856 executor/nodeModifyTable.c:1397 -#: executor/nodeModifyTable.c:1613 +#: commands/trigger.c:3382 executor/nodeLockRows.c:228 +#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:314 +#: executor/nodeModifyTable.c:1557 executor/nodeModifyTable.c:2394 +#: executor/nodeModifyTable.c:2618 #, c-format msgid "could not serialize access due to concurrent update" msgstr "ë™ì‹œ ì—…ë°ì´íЏ ë•Œë¬¸ì— ìˆœì°¨ì  ì•¡ì„¸ìŠ¤ê°€ 불가능합니다" -#: commands/trigger.c:3034 executor/nodeModifyTable.c:946 -#: executor/nodeModifyTable.c:1467 executor/nodeModifyTable.c:1637 +#: commands/trigger.c:3390 executor/nodeModifyTable.c:1647 +#: executor/nodeModifyTable.c:2485 executor/nodeModifyTable.c:2642 +#: executor/nodeModifyTable.c:3150 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "ë™ì‹œ ì‚­ì œ 작업 ë•Œë¬¸ì— ìˆœì°¨ì  ì•¡ì„¸ìŠ¤ê°€ 불가능합니다" -#: commands/trigger.c:5094 +#: commands/trigger.c:4601 +#, c-format +msgid "cannot fire deferred trigger within security-restricted operation" +msgstr "보안 제한 작업 ë‚´ì—서는 지연 ì†ì„± 트리거를 실행할 수 ì—†ìŒ" + +#: commands/trigger.c:5782 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "\"%s\" 제약 ì¡°ê±´ì€ DEFERRABLE ì†ì„±ìœ¼ë¡œ 만들어지지 않았습니다" -#: commands/trigger.c:5117 +#: commands/trigger.c:5805 #, c-format msgid "constraint \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ì œì•½ ì¡°ê±´ì´ ì—†ìŒ" -#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:683 +#: commands/tsearchcmds.c:124 commands/tsearchcmds.c:641 #, c-format msgid "function %s should return type %s" msgstr "%s 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 함" -#: commands/tsearchcmds.c:195 +#: commands/tsearchcmds.c:200 #, c-format msgid "must be superuser to create text search parsers" msgstr "슈í¼ìœ ì €ë§Œ 전문 검색 파서를 만들 수 있ìŒ" -#: commands/tsearchcmds.c:248 +#: commands/tsearchcmds.c:253 #, c-format msgid "text search parser parameter \"%s\" not recognized" msgstr "\"%s\" 전문 검색 파서 매개 변수를 ì¸ì‹í•  수 ì—†ìŒ" -#: commands/tsearchcmds.c:258 +#: commands/tsearchcmds.c:263 #, c-format msgid "text search parser start method is required" msgstr "í…스트 검색 파서 start 메서드가 필요함" -#: commands/tsearchcmds.c:263 +#: commands/tsearchcmds.c:268 #, c-format msgid "text search parser gettoken method is required" msgstr "í…스트 검색 파서 gettoken 메서드가 필요함" -#: commands/tsearchcmds.c:268 +#: commands/tsearchcmds.c:273 #, c-format msgid "text search parser end method is required" msgstr "í…스트 검색 파서 end 메서드가 필요함" -#: commands/tsearchcmds.c:273 +#: commands/tsearchcmds.c:278 #, c-format msgid "text search parser lextypes method is required" msgstr "í…스트 검색 파서 lextypes 메서드가 필요함" -#: commands/tsearchcmds.c:390 +#: commands/tsearchcmds.c:372 #, c-format msgid "text search template \"%s\" does not accept options" msgstr "\"%s\" 전문 검색 í…œí”Œë¦¿ì´ ì˜µì…˜ì„ ìˆ˜ë½í•˜ì§€ 않ìŒ" -#: commands/tsearchcmds.c:464 +#: commands/tsearchcmds.c:446 #, c-format msgid "text search template is required" msgstr "전문 검색 í…œí”Œë¦¿ì´ í•„ìš”í•¨" -#: commands/tsearchcmds.c:750 +#: commands/tsearchcmds.c:707 #, c-format msgid "must be superuser to create text search templates" msgstr "슈í¼ìœ ì €ë§Œ 전문 검색 í…œí”Œë¦¿ì„ ë§Œë“¤ 수 있ìŒ" -#: commands/tsearchcmds.c:792 +#: commands/tsearchcmds.c:749 #, c-format msgid "text search template parameter \"%s\" not recognized" msgstr "\"%s\" 전문 검색 템플릿 매개 변수를 ì¸ì‹í•  수 ì—†ìŒ" -#: commands/tsearchcmds.c:802 +#: commands/tsearchcmds.c:759 #, c-format msgid "text search template lexize method is required" msgstr "전문 검색 템플릿 lexize 메서드가 필요함" -#: commands/tsearchcmds.c:1006 +#: commands/tsearchcmds.c:939 #, c-format msgid "text search configuration parameter \"%s\" not recognized" msgstr "\"%s\" 전문 검색 구성 매개 변수를 ì¸ì‹í•  수 ì—†ìŒ" -#: commands/tsearchcmds.c:1013 +#: commands/tsearchcmds.c:946 #, c-format msgid "cannot specify both PARSER and COPY options" msgstr "PARSER 옵션과 COPY ì˜µì…˜ì„ ëª¨ë‘ ì§€ì •í•  수 ì—†ìŒ" -#: commands/tsearchcmds.c:1049 +#: commands/tsearchcmds.c:982 #, c-format msgid "text search parser is required" msgstr "전문 검색 파서가 필요함" -#: commands/tsearchcmds.c:1273 +#: commands/tsearchcmds.c:1277 #, c-format msgid "token type \"%s\" does not exist" msgstr "\"%s\" í† í° í˜•ì‹ì´ ì—†ìŒ" -#: commands/tsearchcmds.c:1500 +#: commands/tsearchcmds.c:1540 #, c-format msgid "mapping for token type \"%s\" does not exist" msgstr "\"%s\" í† í° í˜•ì‹ì— 대한 ë§¤í•‘ì´ ì—†ìŒ" -#: commands/tsearchcmds.c:1506 +#: commands/tsearchcmds.c:1546 #, c-format msgid "mapping for token type \"%s\" does not exist, skipping" msgstr "\"%s\" í† í° í˜•ì‹ì— 대한 ë§¤í•‘ì´ ì—†ìŒ, 건너뜀" -#: commands/tsearchcmds.c:1669 commands/tsearchcmds.c:1784 +#: commands/tsearchcmds.c:1707 commands/tsearchcmds.c:1822 #, c-format msgid "invalid parameter list format: \"%s\"" msgstr "ìž˜ëª»ëœ ë§¤ê°œ 변수 ëª©ë¡ í˜•ì‹: \"%s\"" -#: commands/typecmds.c:206 +#: commands/typecmds.c:221 #, c-format msgid "must be superuser to create a base type" msgstr "슈í¼ìœ ì €ë§Œ 기본 형ì‹ì„ 만들 수 있ìŒ" -#: commands/typecmds.c:264 +#: commands/typecmds.c:279 #, c-format msgid "" "Create the type as a shell type, then create its I/O functions, then do a " "full CREATE TYPE." msgstr "" +"쉘 타입으로 ê·¸ ìžë£Œí˜•ì„ ë§Œë“¤ê³ , ê·¸ê²ƒì„ ì“°ê¸° 위한 I/O 함수를 만들고, ë으로 " +"CREATE TYPE ëª…ë ¹ì„ ì‚¬ìš©í•´ì„œ ìžë£Œí˜•ì„ ë§Œë“œì„¸ìš”." -#: commands/typecmds.c:314 commands/typecmds.c:1394 commands/typecmds.c:3832 +#: commands/typecmds.c:331 commands/typecmds.c:1460 commands/typecmds.c:4480 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "ìž˜ëª»ëœ \"%s\" ì†ì„±ì˜ ìžë£Œí˜•" -#: commands/typecmds.c:370 +#: commands/typecmds.c:386 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "\"%s\" í˜•ì‹ ë²”ì£¼ê°€ 잘못ë¨: 단순 ASCII여야 함" -#: commands/typecmds.c:389 +#: commands/typecmds.c:405 #, c-format msgid "array element type cannot be %s" msgstr "ë°°ì—´ ìš”ì†Œì˜ ìžë£Œí˜•으로 %s ìžë£Œí˜•ì„ ì‚¬ìš©í•  수 없습니다" -#: commands/typecmds.c:421 +#: commands/typecmds.c:437 #, c-format msgid "alignment \"%s\" not recognized" msgstr "ìž˜ëª»ëœ ALIGNMENT ê°’: \"%s\"" -#: commands/typecmds.c:438 commands/typecmds.c:3718 +#: commands/typecmds.c:454 commands/typecmds.c:4354 #, c-format msgid "storage \"%s\" not recognized" msgstr "ìž˜ëª»ëœ STORAGE ê°’: \"%s\"" -#: commands/typecmds.c:449 +#: commands/typecmds.c:465 #, c-format msgid "type input function must be specified" msgstr "ìžë£Œí˜• ìž…ë ¥ 함수를 지정하십시오" -#: commands/typecmds.c:453 +#: commands/typecmds.c:469 #, c-format msgid "type output function must be specified" msgstr "ìžë£Œí˜• 출력 함수를 지정하십시오" -#: commands/typecmds.c:458 +#: commands/typecmds.c:474 #, c-format msgid "" "type modifier output function is useless without a type modifier input " "function" msgstr "í˜•ì‹ í•œì •ìž ìž…ë ¥ 함수가 없으면 í˜•ì‹ í•œì •ìž ì¶œë ¥ 함수는 ì˜ë¯¸ê°€ ì—†ìŒ" -#: commands/typecmds.c:745 +#: commands/typecmds.c:516 +#, c-format +msgid "element type cannot be specified without a subscripting function" +msgstr "" +"요소 ìžë£Œí˜•ì€ í•˜ìœ„ìš”ì†Œ 지정 함수(subscripting function) ì—†ì´ ì •ì˜í•  수 ì—†ìŒ" + +#: commands/typecmds.c:785 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "\"%s\" ìžë£Œí˜•ì€ ë„ë©”ì¸ì˜ 기반 ìžë£Œí˜•ì´ ì•„ë‹™ë‹ˆë‹¤" -#: commands/typecmds.c:837 +#: commands/typecmds.c:883 #, c-format msgid "multiple default expressions" msgstr "default í‘œí˜„ì‹ ì—¬ëŸ¬ê°œ 있ìŒ" -#: commands/typecmds.c:900 commands/typecmds.c:909 +#: commands/typecmds.c:946 commands/typecmds.c:955 #, c-format msgid "conflicting NULL/NOT NULL constraints" msgstr "NULL/NOT NULL ì¡°ê±´ì´ í•¨ê»˜ 있ìŒ" -#: commands/typecmds.c:925 +#: commands/typecmds.c:971 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "ë„ë©”ì¸ìš© ì²´í¬ ì œì•½ ì¡°ê±´ì—는 NO INHERIT ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: commands/typecmds.c:934 commands/typecmds.c:2536 +#: commands/typecmds.c:980 commands/typecmds.c:2940 #, c-format msgid "unique constraints not possible for domains" msgstr "고유 제약 ì¡°ê±´ì€ ë„ë©”ì¸ ì •ì˜ì— 사용할 수 ì—†ìŒ" -#: commands/typecmds.c:940 commands/typecmds.c:2542 +#: commands/typecmds.c:986 commands/typecmds.c:2946 #, c-format msgid "primary key constraints not possible for domains" msgstr "기본키 제약 ì¡°ê±´ì„ ë„ë©”ì¸ ì •ì˜ì— 사용할 수 ì—†ìŒ" -#: commands/typecmds.c:946 commands/typecmds.c:2548 +#: commands/typecmds.c:992 commands/typecmds.c:2952 #, c-format msgid "exclusion constraints not possible for domains" msgstr "exclusion 제약 ì¡°ê±´ì€ ë„ë©”ì¸ì—는 사용할 수 ì—†ìŒ" -#: commands/typecmds.c:952 commands/typecmds.c:2554 +#: commands/typecmds.c:998 commands/typecmds.c:2958 #, c-format msgid "foreign key constraints not possible for domains" msgstr "참조키(foreign key) 제약 ì¡°ê±´ì€ ë„ë©”ì¸(domain) ì •ì˜ì— 사용할 수 ì—†ìŒ" -#: commands/typecmds.c:961 commands/typecmds.c:2563 +#: commands/typecmds.c:1007 commands/typecmds.c:2967 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "ë„ë©”ì¸ì— 대해 제약 ì¡°ê±´ ì§€ì—°ì„ ì§€ì •í•  수 ì—†ìŒ" -#: commands/typecmds.c:1271 utils/cache/typcache.c:2430 +#: commands/typecmds.c:1327 utils/cache/typcache.c:2570 #, c-format msgid "%s is not an enum" msgstr "%s 개체는 ë‚˜ì—´í˜•ì´ ì•„ë‹˜" -#: commands/typecmds.c:1402 +#: commands/typecmds.c:1468 #, c-format msgid "type attribute \"subtype\" is required" msgstr "\"subtype\" ì†ì„±ì´ 필요함" -#: commands/typecmds.c:1407 +#: commands/typecmds.c:1473 #, c-format msgid "range subtype cannot be %s" msgstr "range subtypeì€ %s 아니여야 함" -#: commands/typecmds.c:1426 +#: commands/typecmds.c:1492 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "" "range í˜•ì— ì •ë ¬ ê·œì¹™ì„ ì§€ì •í–ˆì§€ë§Œ, ì†Œì† ìžë£Œí˜•ì´ ê·¸ ì •ë ¬ ê·œì¹™ì„ ì§€ì›í•˜ì§€ 않습" "니다" -#: commands/typecmds.c:1436 +#: commands/typecmds.c:1502 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "미리 만들어진 쉘 타입 없는 canonical 함수를 지정할 수 ì—†ìŒ" -#: commands/typecmds.c:1437 +#: commands/typecmds.c:1503 #, c-format msgid "" "Create the type as a shell type, then create its canonicalization function, " "then do a full CREATE TYPE." msgstr "" +"먼저 쉘 타입 ìžë£Œí˜•ì„ ë§Œë“¤ê³ , canonical 함수를 만든 ë‹¤ìŒ CREATE TYPE 명령으" +"로 해당 ìžë£Œí˜•ì„ ë§Œë“œì„¸ìš”." -#: commands/typecmds.c:1648 +#: commands/typecmds.c:1975 #, c-format msgid "type input function %s has multiple matches" msgstr "ìžë£Œí˜• %s ìž…ë ¥ 함수가 여러 ê°œ 있습니다" -#: commands/typecmds.c:1666 +#: commands/typecmds.c:1993 #, c-format msgid "type input function %s must return type %s" -msgstr "ìžë£Œí˜• %s ìž…ë ¥ í•¨ìˆ˜ì˜ %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼í•©ë‹ˆë‹¤" +msgstr "ìžë£Œí˜• %s ìž…ë ¥ í•¨ìˆ˜ì˜ %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 합니다" -#: commands/typecmds.c:1682 +#: commands/typecmds.c:2009 #, c-format msgid "type input function %s should not be volatile" -msgstr "%s ìžë£Œí˜• ìž…ë ¥ 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "%s ìžë£Œí˜• ìž…ë ¥ 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼ 합니다" -#: commands/typecmds.c:1710 +#: commands/typecmds.c:2037 #, c-format msgid "type output function %s must return type %s" -msgstr "%s ìžë£Œí˜• 출력 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼í•©ë‹ˆë‹¤" +msgstr "%s ìžë£Œí˜• 출력 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 합니다" -#: commands/typecmds.c:1717 +#: commands/typecmds.c:2044 #, c-format msgid "type output function %s should not be volatile" -msgstr "%s ìžë£Œí˜• 출력 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "%s ìžë£Œí˜• 출력 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼ 합니다" -#: commands/typecmds.c:1746 +#: commands/typecmds.c:2073 #, c-format msgid "type receive function %s has multiple matches" msgstr "%s ìžë£Œí˜• receive 함수가 여러 ê°œ 있습니다" -#: commands/typecmds.c:1764 +#: commands/typecmds.c:2091 #, c-format msgid "type receive function %s must return type %s" -msgstr "%s ìžë£Œí˜• receive 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼í•©ë‹ˆë‹¤" +msgstr "%s ìžë£Œí˜• receive 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 합니다" -#: commands/typecmds.c:1771 +#: commands/typecmds.c:2098 #, c-format msgid "type receive function %s should not be volatile" -msgstr "%s ìžë£Œí˜• 수신 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "%s ìžë£Œí˜• 수신 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼ 합니다" -#: commands/typecmds.c:1799 +#: commands/typecmds.c:2126 #, c-format msgid "type send function %s must return type %s" -msgstr "%s ìžë£Œí˜• 전송 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼í•©ë‹ˆë‹¤" +msgstr "%s ìžë£Œí˜• 전송 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 합니다" -#: commands/typecmds.c:1806 +#: commands/typecmds.c:2133 #, c-format msgid "type send function %s should not be volatile" -msgstr "%s ìžë£Œí˜• 송신 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "%s ìžë£Œí˜• 송신 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼ 합니다" -#: commands/typecmds.c:1833 +#: commands/typecmds.c:2160 #, c-format msgid "typmod_in function %s must return type %s" msgstr "%s typmod_in 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 함" -#: commands/typecmds.c:1840 +#: commands/typecmds.c:2167 #, c-format msgid "type modifier input function %s should not be volatile" -msgstr "%s ìžë£Œí˜• 형변환 ìž…ë ¥ 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "%s ìžë£Œí˜• 형변환 ìž…ë ¥ 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼ 합니다" -#: commands/typecmds.c:1867 +#: commands/typecmds.c:2194 #, c-format msgid "typmod_out function %s must return type %s" msgstr "%s typmod_out 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 함" -#: commands/typecmds.c:1874 +#: commands/typecmds.c:2201 #, c-format msgid "type modifier output function %s should not be volatile" -msgstr "%s ìžë£Œí˜• 형변환 출력 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "%s ìžë£Œí˜• 형변환 출력 함수는 volatile íŠ¹ì„±ì´ ì—†ì–´ì•¼ 합니다" -#: commands/typecmds.c:1901 +#: commands/typecmds.c:2228 #, c-format msgid "type analyze function %s must return type %s" msgstr "%s ìžë£Œí˜• ë¶„ì„ í•¨ìˆ˜ëŠ” %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 함" -#: commands/typecmds.c:1947 +#: commands/typecmds.c:2257 +#, c-format +msgid "type subscripting function %s must return type %s" +msgstr "%s subscripting í•¨ìˆ˜ì˜ ë°˜í™˜ê°’ ìžë£Œí˜•ì€ %s 형ì´ì–´ì•¼ 함" + +#: commands/typecmds.c:2267 +#, c-format +msgid "user-defined types cannot use subscripting function %s" +msgstr "ì‚¬ìš©ìž ì •ì˜ ìžë£Œí˜•ì€ %s subscripting 함수ì—서 쓸 수 ì—†ìŒ" + +#: commands/typecmds.c:2313 #, c-format msgid "" "You must specify an operator class for the range type or define a default " @@ -11665,52 +13715,64 @@ msgstr "" "subtypeì„ ìœ„í•œ 기본 ì—°ì‚°ìž í´ëž˜ìŠ¤ë‚˜ range ìžë£Œí˜•ì„ ìœ„í•œ í•˜ë‚˜ì˜ ì—°ì‚°ìž í´ëž˜ìФ" "를 지정해야 합니다" -#: commands/typecmds.c:1978 +#: commands/typecmds.c:2344 #, c-format msgid "range canonical function %s must return range type" -msgstr "%s 범위 기준 함수는 range ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼í•©ë‹ˆë‹¤" +msgstr "%s 범위 기준 함수는 range ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 합니다" -#: commands/typecmds.c:1984 +#: commands/typecmds.c:2350 #, c-format msgid "range canonical function %s must be immutable" msgstr "%s 범위 기준 함수는 immutable ì†ì„±ì´ì–´ì•¼ 합니다" -#: commands/typecmds.c:2020 +#: commands/typecmds.c:2386 #, c-format msgid "range subtype diff function %s must return type %s" -msgstr "%s 범위 하위 ìžë£Œ ë¹„êµ í•¨ìˆ˜ëŠ” %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼í•©ë‹ˆë‹¤" +msgstr "%s 범위 하위 ìžë£Œ ë¹„êµ í•¨ìˆ˜ëŠ” %s ìžë£Œí˜•ì„ ë°˜í™˜í•´ì•¼ 합니다" -#: commands/typecmds.c:2027 +#: commands/typecmds.c:2393 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "%s 범위 하위 ìžë£Œ ë¹„êµ í•¨ìˆ˜ëŠ” immutable ì†ì„±ì´ì–´ì•¼ 합니다" -#: commands/typecmds.c:2054 +#: commands/typecmds.c:2420 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "ì´ì§„ 업그레ì´ë“œ 작업 때 pg_type ë°°ì—´ OID ê°’ì´ ì§€ì •ë˜ì§€ 않았습니다" -#: commands/typecmds.c:2352 +#: commands/typecmds.c:2453 #, c-format -msgid "column \"%s\" of table \"%s\" contains null values" -msgstr "\"%s\" ì—´(해당 í…Œì´ë¸” \"%s\")ì˜ ìžë£Œ ê°€ìš´ë° null ê°’ì´ ìžˆìŠµë‹ˆë‹¤" +msgid "pg_type multirange OID value not set when in binary upgrade mode" +msgstr "" +"ì´ì§„ 업그레ì´ë“œ 작업 때 pg_type multirange OID ê°’ì´ ì§€ì •ë˜ì§€ 않았습니다" + +#: commands/typecmds.c:2486 +#, c-format +msgid "pg_type multirange array OID value not set when in binary upgrade mode" +msgstr "" +"ì´ì§„ 업그레ì´ë“œ 작업 때 pg_type multirange ë°°ì—´ OID ê°’ì´ ì§€ì •ë˜ì§€ 않았습니다" -#: commands/typecmds.c:2465 commands/typecmds.c:2667 +#: commands/typecmds.c:2868 commands/typecmds.c:3093 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "\"%s\" 제약 ì¡°ê±´ \"%s\" ë„ë©”ì¸ì— í¬í•¨ë˜ì–´ 있지 않습니다." -#: commands/typecmds.c:2469 +#: commands/typecmds.c:2872 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "\"%s\" 제약 ì¡°ê±´ \"%s\" ë„ë©”ì¸ì— í¬í•¨ë˜ì–´ 있지 않ìŒ, 건너뜀" -#: commands/typecmds.c:2674 +#: commands/typecmds.c:3100 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "\"%s\" 제약 ì¡°ê±´(해당 ë„ë©”ì¸: \"%s\")ì€ check ì œì•½ì¡°ê±´ì´ ì•„ë‹˜" -#: commands/typecmds.c:2780 +#: commands/typecmds.c:3180 +#, c-format +msgid "column \"%s\" of table \"%s\" contains null values" +msgstr "\"%s\" ì—´(해당 í…Œì´ë¸” \"%s\")ì˜ ìžë£Œ ê°€ìš´ë° null ê°’ì´ ìžˆìŠµë‹ˆë‹¤" + +#: commands/typecmds.c:3269 #, c-format msgid "" "column \"%s\" of table \"%s\" contains values that violate the new constraint" @@ -11718,346 +13780,531 @@ msgstr "" "\"%s\" ì—´(해당 í…Œì´ë¸” \"%s\")ì˜ ìžë£Œ 중ì—, 새 제약 ì¡°ê±´ì„ ìœ„ë°˜í•˜ëŠ” ìžë£Œê°€ 있" "습니다" -#: commands/typecmds.c:3009 commands/typecmds.c:3207 commands/typecmds.c:3289 -#: commands/typecmds.c:3476 +#: commands/typecmds.c:3498 commands/typecmds.c:3772 commands/typecmds.c:3857 +#: commands/typecmds.c:4073 #, c-format msgid "%s is not a domain" msgstr "\"%s\" ì´ë¦„ì˜ ê°œì²´ëŠ” ë„ë©”ì¸ì´ 아닙니다" -#: commands/typecmds.c:3041 +#: commands/typecmds.c:3532 commands/typecmds.c:3686 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "\"%s\" 제약 ì¡°ê±´ì´ \"%s\" ë„ë©”ì¸ì— ì´ë¯¸ 지정ë˜ì–´ 있습니다" -#: commands/typecmds.c:3092 +#: commands/typecmds.c:3583 #, c-format msgid "cannot use table references in domain check constraint" msgstr "ë„ë©”ì¸ ìš© ì²´í¬ ì œì•½ ì¡°ê±´ì—서는 í…Œì´ë¸” 참조를 사용할 수 없습니다" -#: commands/typecmds.c:3219 commands/typecmds.c:3301 commands/typecmds.c:3593 +#: commands/typecmds.c:3784 commands/typecmds.c:3869 commands/typecmds.c:4223 #, c-format msgid "%s is a table's row type" msgstr "%s ìžë£Œí˜•ì€ í…Œì´ë¸”ì˜ í–‰ ìžë£Œí˜•(row type)입니다" -#: commands/typecmds.c:3221 commands/typecmds.c:3303 commands/typecmds.c:3595 -#, c-format -msgid "Use ALTER TABLE instead." -msgstr "대신 ALTER TABLEì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤." - -#: commands/typecmds.c:3228 commands/typecmds.c:3310 commands/typecmds.c:3508 +#: commands/typecmds.c:3794 commands/typecmds.c:3879 commands/typecmds.c:4121 #, c-format msgid "cannot alter array type %s" -msgstr "%s ë°°ì—´ 형ì‹ì„ 변경할 수 ì—†ìŒ" +msgstr "%s ë°°ì—´ ìžë£Œí˜•ì„ ë°”ê¿€ 수 ì—†ìŒ" -#: commands/typecmds.c:3230 commands/typecmds.c:3312 commands/typecmds.c:3510 +#: commands/typecmds.c:3796 commands/typecmds.c:3881 commands/typecmds.c:4123 #, c-format msgid "You can alter type %s, which will alter the array type as well." -msgstr "%s 형ì‹ì„ 변경할 수 있으며, ì´ë ‡ê²Œ 하면 ë°°ì—´ 형ì‹ë„ 변경ë©ë‹ˆë‹¤." +msgstr "" +"%s ìžë£Œí˜•ì„ ë°”ê¿€ 수 있으며, ì´ë ‡ê²Œ 하면 해당 ìžë£Œí˜• ë°°ì—´ì˜ ìžë£Œí˜•ë„ ë³€ê²½ë©ë‹ˆ" +"다." + +#: commands/typecmds.c:3892 +#, c-format +msgid "cannot alter multirange type %s" +msgstr "%s 다중 범위 ìžë£Œí˜•ì€ ë°”ê¿€ 수 ì—†ìŒ" + +#: commands/typecmds.c:3895 +#, c-format +msgid "You can alter type %s, which will alter the multirange type as well." +msgstr "%s ìžë£Œí˜•ì„ ë°”ê¿€ 수 있으며, ì´ë ‡ê²Œ 하면 다중 범위 ìžë£Œí˜•ë„ ë³€ê²½ë©ë‹ˆë‹¤." -#: commands/typecmds.c:3578 +#: commands/typecmds.c:4202 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "%s ìžë£Œí˜•ì´ ì´ë¯¸ \"%s\" 스키마 ì•ˆì— ìžˆìŠµë‹ˆë‹¤" -#: commands/typecmds.c:3746 +#: commands/typecmds.c:4382 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "저장 ì˜µì…˜ì„ PLAIN으로 바꿀 수 ì—†ìŒ" -#: commands/typecmds.c:3827 +#: commands/typecmds.c:4475 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "\"%s\" ìžë£Œí˜• ì†ì„± 바꿀 수 ì—†ìŒ" -#: commands/typecmds.c:3845 +#: commands/typecmds.c:4493 #, c-format msgid "must be superuser to alter a type" msgstr "슈í¼ìœ ì €ë§Œ ìžë£Œí˜• ì†ì„±ì„ 바꿀 수 있ìŒ" -#: commands/typecmds.c:3866 commands/typecmds.c:3876 +#: commands/typecmds.c:4514 commands/typecmds.c:4523 #, c-format msgid "%s is not a base type" msgstr "\"%s\" 개체는 기본 ìžë£Œí˜•ì´ ì•„ë‹˜" -#: commands/user.c:140 +#: commands/user.c:200 #, c-format msgid "SYSID can no longer be specified" msgstr "SYSID는 ë” ì´ìƒ 지정할 수 ì—†ìŒ" -#: commands/user.c:294 +#: commands/user.c:318 commands/user.c:324 commands/user.c:330 +#: commands/user.c:336 commands/user.c:342 #, c-format -msgid "must be superuser to create superusers" -msgstr "새 슈í¼ìœ ì €ë¥¼ 만드려면 슈í¼ìœ ì ¸ì—¬ì•¼ë§Œ 합니다" - -#: commands/user.c:301 -#, c-format -msgid "must be superuser to create replication users" -msgstr "새 복제작업용 사용ìžë¥¼ 만드려면 슈í¼ìœ ì €ì—¬ì•¼ë§Œ 합니다" +msgid "permission denied to create role" +msgstr "롤 만들 권한 ì—†ìŒ" -#: commands/user.c:308 commands/user.c:734 +#: commands/user.c:319 #, c-format -msgid "must be superuser to change bypassrls attribute" -msgstr "슈í¼ìœ ì €ë§Œ bypassrls ì†ì„±ì„ 바꿀 수 있ìŒ" +msgid "Only roles with the %s attribute may create roles." +msgstr "%s ì†ì„±ì„ 가지고 있는 ë¡¤ë§Œì´ ë¡¤ì„ ë§Œë“¤ 수 있습니다." -#: commands/user.c:315 +#: commands/user.c:325 commands/user.c:331 commands/user.c:337 +#: commands/user.c:343 #, c-format -msgid "permission denied to create role" -msgstr "롤 만들 권한 ì—†ìŒ" +msgid "" +"Only roles with the %s attribute may create roles with the %s attribute." +msgstr "%s ì†ì„±ì„ 가지고 있는 롤만 %s ì†ì„±ì„ 가진 ë¡¤ì„ ë§Œë“¤ 수 있습니다." -#: commands/user.c:325 commands/user.c:1224 commands/user.c:1231 -#: utils/adt/acl.c:5327 utils/adt/acl.c:5333 gram.y:15146 gram.y:15184 +#: commands/user.c:354 commands/user.c:1386 commands/user.c:1393 +#: utils/adt/acl.c:5574 utils/adt/acl.c:5580 gram.y:17310 gram.y:17356 #, c-format msgid "role name \"%s\" is reserved" msgstr "\"%s\" 롤 ì´ë¦„ì€ ë‚´ë¶€ì ìœ¼ë¡œ 사용ë˜ê³  있습니다" -#: commands/user.c:327 commands/user.c:1226 commands/user.c:1233 +#: commands/user.c:356 commands/user.c:1388 commands/user.c:1395 #, c-format msgid "Role names starting with \"pg_\" are reserved." msgstr "\"pg_\"로 시작하는 롤 ì´ë¦„ì€ ì‚¬ìš©í•  수 없습니다." -#: commands/user.c:348 commands/user.c:1248 +#: commands/user.c:377 commands/user.c:1410 #, c-format msgid "role \"%s\" already exists" msgstr "\"%s\" 롤 ì´ë¦„ì´ ì´ë¯¸ 있습니다" -#: commands/user.c:414 commands/user.c:843 +#: commands/user.c:439 commands/user.c:924 #, c-format msgid "empty string is not a valid password, clearing password" msgstr "비밀번호로 빈 문ìžì—´ì„ 사용할 수 없습니다. 비밀번호를 없앱니다" -#: commands/user.c:443 +#: commands/user.c:468 #, c-format msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "ì´ì§„ 업그레ì´ë“œ 작업 때 pg_authid OID ê°’ì´ ì§€ì •ë˜ì§€ 않았습니다" -#: commands/user.c:720 commands/user.c:944 commands/user.c:1485 -#: commands/user.c:1627 +#: commands/user.c:652 commands/user.c:1010 +msgid "Cannot alter reserved roles." +msgstr "ì˜ˆì•½ëœ ë¡¤ì€ ìˆ˜ì •í•  수 없습니다." + +#: commands/user.c:759 commands/user.c:765 commands/user.c:781 +#: commands/user.c:789 commands/user.c:803 commands/user.c:809 +#: commands/user.c:815 commands/user.c:824 commands/user.c:869 +#: commands/user.c:1032 commands/user.c:1043 #, c-format -msgid "must be superuser to alter superusers" -msgstr "슈í¼ìœ ì €ì˜ ì†ì„±ì„ 변경하련 슈í¼ìœ ì ¸ì—¬ì•¼ë§Œ 합니다" +msgid "permission denied to alter role" +msgstr "롤 변경 권한 ì—†ìŒ" -#: commands/user.c:727 +#: commands/user.c:760 commands/user.c:1033 #, c-format -msgid "must be superuser to alter replication users" -msgstr "복제작업용 사용ìžì˜ ì†ì„±ì„ 변경하련 슈í¼ìœ ì ¸ì—¬ì•¼ë§Œ 합니다" +msgid "Only roles with the %s attribute may alter roles with the %s attribute." +msgstr "%s ì†ì„±ì´ 있는 롤만 %s ì†ì„±ì„ 가진 ë¡¤ì„ ë°”ê¿€ 수 있습니다." -#: commands/user.c:750 commands/user.c:951 +#: commands/user.c:766 commands/user.c:804 commands/user.c:810 +#: commands/user.c:816 #, c-format -msgid "permission denied" -msgstr "권한 ì—†ìŒ" +msgid "Only roles with the %s attribute may change the %s attribute." +msgstr "%s ì†ì„±ì´ 있는 롤만 %s ì†ì„±ì„ 바꿀 수 있습니다." + +#: commands/user.c:782 commands/user.c:1044 +#, c-format +msgid "" +"Only roles with the %s attribute and the %s option on role \"%s\" may alter " +"this role." +msgstr "" +"%s ì†ì„±ê³¼ %s ì˜µì…˜ì„ ì§€ì •í•œ 롤(해당 롤: \"%s\")ë§Œ ì´ ë¡¤ì„ ìˆ˜ì •í•  수 있습니다." + +#: commands/user.c:790 +#, c-format +msgid "" +"To change another role's password, the current user must have the %s " +"attribute and the %s option on the role." +msgstr "" +"다른 ë¡¤ì˜ ë¹„ë°€ë²ˆí˜¸ë¥¼ 바꾸려면, 현재 사용ìžëŠ” %s ì†ì„±ê³¼ %s ì˜µì…˜ì´ ì§€ì •ëœ ë¡¤ì´" +"어야 합니다." + +#: commands/user.c:825 +#, c-format +msgid "Only roles with the %s option on role \"%s\" may add or drop members." +msgstr "%s 옵션 (해당 롤: \"%s\")ì´ ìžˆëŠ” 롤만 구성ì›ì„ 추가할 수 있습니다." + +#: commands/user.c:870 +#, c-format +msgid "The bootstrap superuser must have the %s attribute." +msgstr "부트스트랩 슈í¼ìœ ì €ëŠ” %s ì†ì„±ì„ 가지고 있어야 합니다." + +#: commands/user.c:1075 +#, c-format +msgid "permission denied to alter setting" +msgstr "설정 변경 권한 ì—†ìŒ" -#: commands/user.c:981 +#: commands/user.c:1076 #, c-format -msgid "must be superuser to alter settings globally" -msgstr "슈í¼ìœ ì €ë§Œ ì „ì—­ 환경 ì„¤ì •ì„ ë°”ê¿€ 수 있습니다." +msgid "Only roles with the %s attribute may alter settings globally." +msgstr "%s ì†ì„±ì´ ë¶€ì—¬ëœ ë¡¤ë§Œ ì „ì—­ 환경 ì„¤ì •ì„ ë°”ê¿€ 수 있습니다." -#: commands/user.c:1003 +#: commands/user.c:1100 commands/user.c:1171 commands/user.c:1177 #, c-format msgid "permission denied to drop role" msgstr "ë¡¤ì„ ì‚­ì œí•  ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤" -#: commands/user.c:1028 +#: commands/user.c:1101 +#, c-format +msgid "" +"Only roles with the %s attribute and the %s option on the target roles may " +"drop roles." +msgstr "" +"작업 ë¡¤ì€ %s ì†ì„±ì´ 있어야하고, 삭제할 ëŒ€ìƒ ë¡¤ì„ %s ì˜µì…˜ì´ ìžˆëŠ” 경우만 ë¡¤ì„ " +"ì‚­ì œ í•  수 있ìŒ" + +#: commands/user.c:1125 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "DROP ROLE 명령으로 삭제할 수 없는 특별한 롤입니다" -#: commands/user.c:1038 commands/user.c:1195 commands/variable.c:770 -#: commands/variable.c:844 utils/adt/acl.c:5184 utils/adt/acl.c:5231 -#: utils/adt/acl.c:5259 utils/adt/acl.c:5277 utils/init/miscinit.c:675 +#: commands/user.c:1135 commands/user.c:1357 commands/variable.c:851 +#: commands/variable.c:854 commands/variable.c:971 commands/variable.c:974 +#: utils/adt/acl.c:365 utils/adt/acl.c:385 utils/adt/acl.c:5429 +#: utils/adt/acl.c:5477 utils/adt/acl.c:5505 utils/adt/acl.c:5524 +#: utils/adt/regproc.c:1571 utils/init/miscinit.c:799 #, c-format msgid "role \"%s\" does not exist" msgstr "\"%s\" 롤(role) ì—†ìŒ" -#: commands/user.c:1043 +#: commands/user.c:1140 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "\"%s\" 룰(rule) ì—†ìŒ, 건너 뜀" -#: commands/user.c:1056 commands/user.c:1060 +#: commands/user.c:1153 commands/user.c:1157 #, c-format msgid "current user cannot be dropped" msgstr "현재 사용ìžëŠ” ì‚­ì œ ë  ìˆ˜ 없습니다" -#: commands/user.c:1064 +#: commands/user.c:1161 #, c-format msgid "session user cannot be dropped" msgstr "세션 사용ìžëŠ” ì‚­ì œ ë  ìˆ˜ 없습니다" -#: commands/user.c:1074 +#: commands/user.c:1172 +#, c-format +msgid "Only roles with the %s attribute may drop roles with the %s attribute." +msgstr "%s ì†ì„±ì´ 있는 롤만 %s ì†ì„±ì„ 가진 ë¡¤ì„ ì§€ìš¸ 수 있습니다." + +#: commands/user.c:1178 #, c-format -msgid "must be superuser to drop superusers" -msgstr "superuser를 사용ìžë¥¼ 삭제하려면 superuser여야만 합니다" +msgid "" +"Only roles with the %s attribute and the %s option on role \"%s\" may drop " +"this role." +msgstr "" +"%s ì†ì„±ê³¼ %s ì˜µì…˜ì„ ì§€ì •í•œ 롤(해당 롤: \"%s\")ë§Œ ì´ ë¡¤ì„ ì§€ìš¸ 수 있습니다." -#: commands/user.c:1090 +#: commands/user.c:1299 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "기타 다른 ê°œì²´ë“¤ì´ ì´ ë¡¤ì— ì˜ì¡´í•˜ê³  있어, \"%s\" ë¡¤ì„ ì‚­ì œí•  수 ì—†ìŒ" -#: commands/user.c:1211 +#: commands/user.c:1373 #, c-format msgid "session user cannot be renamed" msgstr "세션 사용ìžì˜ ì´ë¦„ì€ ë°”ê¿€ 수 없습니다" -#: commands/user.c:1215 +#: commands/user.c:1377 #, c-format msgid "current user cannot be renamed" msgstr "현재 사용ìžì˜ ì´ë¦„ì€ ë°”ê¿€ 수 없습니다" -#: commands/user.c:1258 -#, c-format -msgid "must be superuser to rename superusers" -msgstr "superuserì˜ ì´ë¦„ì„ ë°”ê¾¸ë ¤ë©´ superuser여야 합니다" - -#: commands/user.c:1265 +#: commands/user.c:1421 commands/user.c:1431 #, c-format msgid "permission denied to rename role" msgstr "롤 ì´ë¦„ 바꾸기 권한 ì—†ìŒ" -#: commands/user.c:1286 +#: commands/user.c:1422 +#, c-format +msgid "" +"Only roles with the %s attribute may rename roles with the %s attribute." +msgstr "%s ì†ì„±ì„ 가지고 있는 롤만 %s ì†ì„±ì„ 가진 롤 ì´ë¦„ì„ ë°”ê¿€ 수 있습니다." + +#: commands/user.c:1432 +#, c-format +msgid "" +"Only roles with the %s attribute and the %s option on role \"%s\" may rename " +"this role." +msgstr "" +"%s ì†ì„±ê³¼ %s ì˜µì…˜ì„ ê°€ì§„ 롤(해당 롤: \"%s\")ë§Œ ì´ ë¡¤ ì´ë¦„ì„ ë°”ê¿€ 수 있습니다." + +#: commands/user.c:1454 #, c-format msgid "MD5 password cleared because of role rename" msgstr "롤 ì´ë¦„ì´ ë³€ê²½ ë˜ì–´ MD5 암호를 지웠습니다" -#: commands/user.c:1346 +#: commands/user.c:1518 gram.y:1294 +#, c-format +msgid "unrecognized role option \"%s\"" +msgstr "ì¸ì‹í•  수 없는 롤 옵션 \"%s\"" + +#: commands/user.c:1523 +#, c-format +msgid "unrecognized value for role option \"%s\": \"%s\"" +msgstr "\"%s\" 롤 옵션ì—서 쓸 수 없는 ê°’: \"%s\"" + +#: commands/user.c:1556 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "GRANT/REVOKE ROLEì— ì—´ ì´ë¦„ì„ í¬í•¨í•  수 ì—†ìŒ" -#: commands/user.c:1384 +#: commands/user.c:1596 #, c-format msgid "permission denied to drop objects" msgstr "개체를 삭제할 ê¶Œí•œì´ ì—†ìŒ" -#: commands/user.c:1411 commands/user.c:1420 +#: commands/user.c:1597 +#, c-format +msgid "Only roles with privileges of role \"%s\" may drop objects owned by it." +msgstr "\"%s\" ë¡¤ì˜ ê¶Œí•œì„ ê°€ì§„ 롤만 해당 ê°ì²´ë¥¼ 삭제할 수 있습니다." + +#: commands/user.c:1625 commands/user.c:1636 #, c-format msgid "permission denied to reassign objects" msgstr "개체 ê¶Œí•œì„ ìž¬ 지정할 ê¶Œí•œì´ ì—†ìŒ" -#: commands/user.c:1493 commands/user.c:1635 +#: commands/user.c:1626 +#, c-format +msgid "" +"Only roles with privileges of role \"%s\" may reassign objects owned by it." +msgstr "\"%s\" ë¡¤ì˜ ê¶Œí•œì„ ê°€ì§„ 롤만 해당 ê°ì²´ì˜ 소유주를 바꿀 수 있습니다." + +#: commands/user.c:1637 #, c-format -msgid "must have admin option on role \"%s\"" -msgstr "\"%s\" ì—­í• ì— admin ì˜µì…˜ì´ ìžˆì–´ì•¼ 함" +msgid "Only roles with privileges of role \"%s\" may reassign objects to it." +msgstr "\"%s\" ë¡¤ì˜ ê¶Œí•œì„ ê°€ì§„ 롤만 해당 ê°ì²´ë¥¼ 다시 지정 í•  수 있습니다." -#: commands/user.c:1510 +#: commands/user.c:1733 #, c-format -msgid "must be superuser to set grantor" -msgstr "grantor(?)를 지정하려면 슈í¼ìœ ì ¸ì—¬ì•¼í•©ë‹ˆë‹¤" +msgid "role \"%s\" cannot be a member of any role" +msgstr "\"%s\" ë¡¤ì€ ë‹¤ë¥¸ ë¡¤ì˜ ë§´ë²„ê°€ ë  ìˆ˜ ì—†ìŒ" -#: commands/user.c:1535 +#: commands/user.c:1746 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "\"%s\" ë¡¤ì€ \"%s\" ë¡¤ì˜ êµ¬ì„±ì›ìž…니다" -#: commands/user.c:1550 +#: commands/user.c:1786 commands/user.c:1812 +#, c-format +msgid "%s option cannot be granted back to your own grantor" +msgstr "%s ì˜µì…˜ì€ ì´ ë¡¤ì— ê¶Œí•œ 부여한 롤ì—게 다시 ë¶€ì—¬ë  ìˆ˜ 없습니다." + +#: commands/user.c:1889 +#, c-format +msgid "" +"role \"%s\" has already been granted membership in role \"%s\" by role \"%s\"" +msgstr "\"%s\" ë¡¤ì€ \"%s\"ë¡¤ì˜ êµ¬ì„±ì›ìž…니다, 해당 작업 롤: \"%s\"" + +#: commands/user.c:2024 +#, c-format +msgid "" +"role \"%s\" has not been granted membership in role \"%s\" by role \"%s\"" +msgstr "\"%s\" ë¡¤ì€ \"%s\"ë¡¤ì˜ êµ¬ì„±ì›ì´ 아닙니다, 해당 작업 롤: \"%s\"" + +#: commands/user.c:2124 +#, c-format +msgid "role \"%s\" cannot have explicit members" +msgstr "\"%s\" ë¡¤ì€ ëª…ì‹œì  ë§´ë²„ë¥¼ 가질 수 ì—†ìŒ" + +#: commands/user.c:2135 commands/user.c:2158 +#, c-format +msgid "permission denied to grant role \"%s\"" +msgstr "\"%s\" 롤 ê¶Œí•œì„ ì§€ì •í•  수 ì—†ìŒ" + +#: commands/user.c:2137 +#, c-format +msgid "Only roles with the %s attribute may grant roles with the %s attribute." +msgstr "%s ì†ì„±ì´ 있는 롤만 %s ì†ì„± ê¶Œí•œì„ ë¶€ì—¬í•  수 있ìŒ." + +#: commands/user.c:2142 commands/user.c:2165 +#, c-format +msgid "permission denied to revoke role \"%s\"" +msgstr "\"%s\" 롤 권한 회수할 수 ì—†ìŒ" + +#: commands/user.c:2144 +#, c-format +msgid "" +"Only roles with the %s attribute may revoke roles with the %s attribute." +msgstr "%s ì†ì„±ì´ 있는 ë¡¤ë§Œì´ %s ì†ì„± ê¶Œí•œì„ íšŒìˆ˜í•  수 있ìŒ." + +#: commands/user.c:2160 +#, c-format +msgid "Only roles with the %s option on role \"%s\" may grant this role." +msgstr "%s ì˜µì…˜ì„ ë¡¤(해당 롤: \"%s\")ë§Œì´ ì´ ë¡¤ ê¶Œí•œì„ ë¶€ì—¬í•  수 있ìŒ." + +#: commands/user.c:2167 +#, c-format +msgid "Only roles with the %s option on role \"%s\" may revoke this role." +msgstr "%s ì˜µì…˜ì„ ë¡¤(해당 롤: \"%s\")ë§Œì´ ì´ ë¡¤ ê¶Œí•œì„ íšŒìˆ˜í•  수 있ìŒ." + +#: commands/user.c:2247 commands/user.c:2256 +#, c-format +msgid "permission denied to grant privileges as role \"%s\"" +msgstr "\"%s\" 롤 ê¶Œí•œì„ ë¶€ì—¬í•  수 ì—†ìŒ" + +#: commands/user.c:2249 +#, c-format +msgid "" +"Only roles with privileges of role \"%s\" may grant privileges as this role." +msgstr "\"%s\" 롤 ê¶Œí•œì´ ìžˆëŠ” ë¡¤ë§Œì´ ì´ ë¡¤ ê¶Œí•œì„ ë¶€ì—¬í•  수 있ìŒ." + +#: commands/user.c:2258 +#, c-format +msgid "The grantor must have the %s option on role \"%s\"." +msgstr "권한 부여ìžëŠ” %s 옵션(해당 롤: \"%s\")ì´ ìžˆì–´ì•¼ 함" + +#: commands/user.c:2266 +#, c-format +msgid "permission denied to revoke privileges granted by role \"%s\"" +msgstr "\"%s\" ë¡¤ì´ ë¶€ì—¬í•œ ê¶Œí•œì„ íšŒìˆ˜ í•  수 있는 권한 ì—†ìŒ" + +#: commands/user.c:2268 +#, c-format +msgid "" +"Only roles with privileges of role \"%s\" may revoke privileges granted by " +"this role." +msgstr "" +"\"%s\" 롤 ê¶Œí•œì´ ìžˆëŠ” ë¡¤ë§Œì´ ì´ ë¡¤ì— ì˜í•´ 부여한 ê¶Œí•œì„ íšŒìˆ˜í•  수 있ìŒ." + +#: commands/user.c:2491 utils/adt/acl.c:1324 +#, c-format +msgid "dependent privileges exist" +msgstr "ì˜ì¡´ì ì¸ ê¶Œí•œì´ ì¡´ìž¬í•©ë‹ˆë‹¤" + +#: commands/user.c:2492 utils/adt/acl.c:1325 +#, c-format +msgid "Use CASCADE to revoke them too." +msgstr "ê·¸ê²ƒë“¤ì„ ì·¨ì†Œí•˜ë ¤ë©´ \"CASCADE\"를 사용하세요." + +#: commands/vacuum.c:134 #, c-format -msgid "role \"%s\" is already a member of role \"%s\"" -msgstr "role \"%s\" is already a member of role \"%s\"" +msgid "\"vacuum_buffer_usage_limit\" must be 0 or between %d kB and %d kB" +msgstr "" +"\"vacuum_buffer_usage_limit\" ê°’ì€ 0 ì´ê±°ë‚˜ %d kBì—서 %d kB 사ì´ê°’ì´ì—¬ì•¼ 함" -#: commands/user.c:1657 +#: commands/vacuum.c:209 #, c-format -msgid "role \"%s\" is not a member of role \"%s\"" -msgstr "\"%s\" ë¡¤ì€ \"%s\"ë¡¤ì˜ êµ¬ì„±ì›ì´ 아닙니다" +msgid "BUFFER_USAGE_LIMIT option must be 0 or between %d kB and %d kB" +msgstr "BUFFER_USAGE_LIMIT 옵션 ê°’ì€ 0 ì´ê±°ë‚˜ %d kBì—서 %d kB 사ì´ê°’ì´ì—¬ì•¼ 함" -#: commands/vacuum.c:129 +#: commands/vacuum.c:219 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "알 수 없는 ANALYZE 옵션: \"%s\"" -#: commands/vacuum.c:151 +#: commands/vacuum.c:259 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "병렬 ì˜µì…˜ì€ 0부터 %d까지 ê°’ë§Œ 사용할 수 있ìŒ" -#: commands/vacuum.c:163 +#: commands/vacuum.c:271 #, c-format -msgid "parallel vacuum degree must be between 0 and %d" -msgstr "병렬 청소 작업수는 0부터 %d까지 ê°’ë§Œ 사용할 수 있ìŒ" +msgid "parallel workers for vacuum must be between 0 and %d" +msgstr "청소용 병렬 작업ìžìˆ˜ëŠ” 0부터 %d까지 ê°’ë§Œ 사용할 수 있ìŒ" -#: commands/vacuum.c:180 +#: commands/vacuum.c:292 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "알 수 없는 VACUUM 옵션 \"%s\"" -#: commands/vacuum.c:203 +#: commands/vacuum.c:318 #, c-format msgid "VACUUM FULL cannot be performed in parallel" -msgstr "" +msgstr "VACUUM FULL ìž‘ì—…ì€ ë³‘ë ¬ë¡œ 처리할 수 ì—†ìŒ" -#: commands/vacuum.c:219 +#: commands/vacuum.c:329 #, c-format -msgid "ANALYZE option must be specified when a column list is provided" -msgstr "ANALYZE ì˜µì…˜ì€ ì¹¼ëŸ¼ 목ë¡ì´ ì œê³µë  ë•Œ 사용할 수 있습니다" +msgid "BUFFER_USAGE_LIMIT cannot be specified for VACUUM FULL" +msgstr "VACUUM FULL 작업ì—서는 BUFFER_USAGE_LIMIT ì„¤ì •ì„ ì§€ì •í•  수 ì—†ìŒ" -#: commands/vacuum.c:309 +#: commands/vacuum.c:343 #, c-format -msgid "%s cannot be executed from VACUUM or ANALYZE" -msgstr "%s ëª…ë ¹ì€ VACUUM, ANALYZE 명령ì—서 실행 ë  ìˆ˜ ì—†ìŒ" +msgid "ANALYZE option must be specified when a column list is provided" +msgstr "ANALYZE ì˜µì…˜ì€ ì¹¼ëŸ¼ 목ë¡ì´ ì œê³µë  ë•Œ 사용할 수 있습니다" -#: commands/vacuum.c:319 +#: commands/vacuum.c:355 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "" "VACUUM 명령ì—서 DISABLE_PAGE_SKIPPING 옵션과 FULL ì˜µì…˜ì„ í•¨ê»˜ 사용할 수 없습" "니다." -#: commands/vacuum.c:560 +#: commands/vacuum.c:362 #, c-format -msgid "skipping \"%s\" --- only superuser can vacuum it" -msgstr "\"%s\" 건너뜀 --- 슈í¼ìœ ì €ë§Œ 청소할 수 있ìŒ" +msgid "PROCESS_TOAST required with VACUUM FULL" +msgstr "VACUUM FULL ìž‘ì—…ì€ PROCESS_TOAST ì˜µì…˜ì´ í¬í•¨ë˜ì–´ì•¼ 함" -#: commands/vacuum.c:564 +#: commands/vacuum.c:371 #, c-format -msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" -msgstr "\"%s\" 건너뜀 --- 슈í¼ìœ ì € ë˜ëŠ” ë°ì´í„°ë² ì´ìФ 소유주만 청소할 수 있ìŒ" +msgid "ONLY_DATABASE_STATS cannot be specified with a list of tables" +msgstr "ONLY_DATABASE_STATS ì˜µì…˜ì€ ì—¬ëŸ¬ í…Œì´ë¸” ëª©ë¡ ëŒ€ìƒìœ¼ë¡œëŠ” 사용할 수 ì—†ìŒ" -#: commands/vacuum.c:568 +#: commands/vacuum.c:380 #, c-format -msgid "skipping \"%s\" --- only table or database owner can vacuum it" -msgstr "\"%s\" 건너뜀 --- ì´ í…Œì´ë¸”ì´ë‚˜ ë°ì´í„°ë² ì´ìŠ¤ì˜ ì†Œìœ ì£¼ë§Œ 청소할 수 있ìŒ" +msgid "ONLY_DATABASE_STATS cannot be specified with other VACUUM options" +msgstr "" +"ONLY_DATABASE_STATS ì˜µì…˜ì€ ë‹¤ë¥¸ VACUUM 옵션들과 함께 사용할 수 없습니다." -#: commands/vacuum.c:583 +#: commands/vacuum.c:515 #, c-format -msgid "skipping \"%s\" --- only superuser can analyze it" -msgstr "\"%s\" ë¶„ì„ ê±´ë„ˆëœ€ --- 슈í¼ìœ ì €ë§Œ ë¶„ì„í•  수 있ìŒ" +msgid "%s cannot be executed from VACUUM or ANALYZE" +msgstr "%s ëª…ë ¹ì€ VACUUM, ANALYZE 명령ì—서 실행 ë  ìˆ˜ ì—†ìŒ" -#: commands/vacuum.c:587 +#: commands/vacuum.c:730 #, c-format -msgid "skipping \"%s\" --- only superuser or database owner can analyze it" -msgstr "" -"\"%s\" ë¶„ì„ ê±´ë„ˆëœ€ --- 슈í¼ìœ ì € ë˜ëŠ” ë°ì´í„°ë² ì´ìФ 소유주만 ë¶„ì„í•  수 있ìŒ" +msgid "permission denied to vacuum \"%s\", skipping it" +msgstr "\"%s\" 청소할 ì ‘ê·¼ 권한 ì—†ìŒ, 건너 뜀" -#: commands/vacuum.c:591 +#: commands/vacuum.c:743 #, c-format -msgid "skipping \"%s\" --- only table or database owner can analyze it" -msgstr "\"%s\" 건너뜀 --- í…Œì´ë¸”ì´ë‚˜ ë°ì´í„°ë² ì´ìФ ì†Œìœ ì£¼ë§Œì´ ë¶„ì„í•  수 있ìŒ" +msgid "permission denied to analyze \"%s\", skipping it" +msgstr "\"%s\" 통계정보 수집할 권한 ì—†ìŒ, 건너 뜀" -#: commands/vacuum.c:670 commands/vacuum.c:766 +#: commands/vacuum.c:821 commands/vacuum.c:918 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "\"%s\" 개체 vacuum 건너뜀 --- 사용 가능한 ìž ê¸ˆì´ ì—†ìŒ" -#: commands/vacuum.c:675 +#: commands/vacuum.c:826 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "\"%s\" 개체 vacuum 건너뜀 --- 해당 릴레ì´ì…˜ ì—†ìŒ" -#: commands/vacuum.c:691 commands/vacuum.c:771 +#: commands/vacuum.c:842 commands/vacuum.c:923 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "\"%s\" ë¶„ì„ ê±´ë„ˆëœ€ --- 잠글 수 ì—†ìŒ" -#: commands/vacuum.c:696 +#: commands/vacuum.c:847 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "\"%s\" ë¶„ì„ ê±´ë„ˆëœ€ --- 릴레ì´ì…˜ì–´ ì—†ìŒ" -# # search5 부분 -#: commands/vacuum.c:994 +#: commands/vacuum.c:1139 #, c-format -msgid "oldest xmin is far in the past" -msgstr "가장 ì˜¤ëž˜ëœ xminì´ ë„ˆë¬´ 옛날 것입니다." +msgid "cutoff for removing and freezing tuples is far in the past" +msgstr "íŠœí”Œì„ ì§€ìš°ê³ , 얼려버려기 위한 시작ì ì´ 너무 옛날 시ì ìž…니다." -#: commands/vacuum.c:995 +#: commands/vacuum.c:1140 commands/vacuum.c:1145 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -12070,188 +14317,263 @@ msgstr "" "합니다." # # search5 부분 -#: commands/vacuum.c:1036 +#: commands/vacuum.c:1144 #, c-format -msgid "oldest multixact is far in the past" -msgstr "가장 ì˜¤ëž˜ëœ multixact ê°’ì´ ë„ˆë¬´ 옛날 것입니다." +msgid "cutoff for freezing multixacts is far in the past" +msgstr "ì˜êµ¬ ë³´ê´€ 처리할 multixact ê°’ì´ ë„ˆë¬´ 옛날 것입니다." -#: commands/vacuum.c:1037 -#, c-format -msgid "" -"Close open transactions with multixacts soon to avoid wraparound problems." -msgstr "" -"멀티 트랜잭션 ID 겹침 사고를 막기 위해 빨리 열린 멀티 íŠ¸ëžœìž­ì…˜ë“¤ì„ ë‹«ìœ¼ì‹­ì‹œ" -"오." - -#: commands/vacuum.c:1623 +#: commands/vacuum.c:1900 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "" "몇몇 ë°ì´í„°ë² ì´ìŠ¤ê°€ 20ì–µ ì´ìƒì˜ íŠ¸ëžœìž­ì…˜ì„ ì²˜ë¦¬í–ˆìŒì—ë„ ë¶ˆêµ¬í•˜ê³  청소가ë˜ì§€ " "않았습니다" -#: commands/vacuum.c:1624 +#: commands/vacuum.c:1901 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "ì´ë¯¸ 트래잭션 ID 겹침 현ìƒìœ¼ë¡œ ìžë£Œ ì†ì‹¤ì´ ë°œìƒí–ˆì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." -#: commands/vacuum.c:1784 +#: commands/vacuum.c:2080 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "" "\"%s\" 건너뜀 --- í…Œì´ë¸”ì´ ì•„ë‹Œ 것 ë˜ëŠ” 특별 시스템 í…Œì´ë¸” ë“±ì€ ì²­ì†Œí•  수 ì—†" "ìŒ" -#: commands/variable.c:165 utils/misc/guc.c:11156 utils/misc/guc.c:11218 +#: commands/vacuum.c:2512 #, c-format -msgid "Unrecognized key word: \"%s\"." -msgstr "알 수 없는 키워드: \"%s\"" +msgid "scanned index \"%s\" to remove %lld row versions" +msgstr "\"%s\" ì¸ë±ìŠ¤ë¥¼ 스캔해서 %lldê°œì˜ í–‰ ë²„ì „ì„ ì§€ì› ìŒ" + +#: commands/vacuum.c:2531 +#, c-format +msgid "index \"%s\" now contains %.0f row versions in %u pages" +msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” %.0f í–‰ ë²„ì „ì„ %u 페ì´ì§€ì—서 í¬í•¨í•˜ê³  있습니다." + +#: commands/vacuum.c:2535 +#, c-format +msgid "" +"%.0f index row versions were removed.\n" +"%u index pages were newly deleted.\n" +"%u index pages are currently deleted, of which %u are currently reusable." +msgstr "" +"%.0fê°œì˜ ì¸ë±ìФ í–‰ ë²„ì „ì„ ì‚­ì œí–ˆìŠµë‹ˆë‹¤.\n" +"%uê°œ ì¸ë±ìФ 페ì´ì§€ë¥¼ 새롭게 삭제했습니다.\n" +"%uê°œ ì¸ë±ìФ 페ì´ì§€ë¥¼ 현재 삭제해서, %uê°œ 페ì´ì§€ë¥¼ 다시 사용합니다." + +#: commands/vacuumparallel.c:707 +#, c-format +msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" +msgid_plural "" +"launched %d parallel vacuum workers for index vacuuming (planned: %d)" +msgstr[0] "ì¸ë±ìФ 청소를 위해 %d ê°œì˜ ë³‘ë ¬ 청소 작업ìžê°€ ì‹¤í–‰ë¨ (예ìƒê°’: %d)" + +#: commands/vacuumparallel.c:713 +#, c-format +msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" +msgid_plural "" +"launched %d parallel vacuum workers for index cleanup (planned: %d)" +msgstr[0] "" +"ì¸ë±ìФ cleanupì„ ìœ„í•´ %d ê°œì˜ ë³‘ë ¬ 청소 작업ìžê°€ ì‹¤í–‰ë¨ (예ìƒê°’: %d)" -#: commands/variable.c:177 +#: commands/variable.c:185 #, c-format msgid "Conflicting \"datestyle\" specifications." msgstr "\"datestyle\" ì§€ì •ì´ ì¶©ëŒí•¨" -#: commands/variable.c:299 +#: commands/variable.c:307 #, c-format msgid "Cannot specify months in time zone interval." msgstr "타임 ì¡´ ê°„ê²©ì— ë‹¬ì„ ì§€ì •í•  수 ì—†ìŒ" -#: commands/variable.c:305 +#: commands/variable.c:313 #, c-format msgid "Cannot specify days in time zone interval." msgstr "타임 ì¡´ ê°„ê²©ì— ì¼ì„ 지정할 수 ì—†ìŒ" -#: commands/variable.c:343 commands/variable.c:425 +#: commands/variable.c:351 commands/variable.c:433 #, c-format msgid "time zone \"%s\" appears to use leap seconds" msgstr "\"%s\" time zone ì—서 leap second를 사용합니다" -#: commands/variable.c:345 commands/variable.c:427 +#: commands/variable.c:353 commands/variable.c:435 #, c-format msgid "PostgreSQL does not support leap seconds." msgstr "PostgreSQLì—서는 leap second를 ì§€ì›í•˜ì§€ 않습니다" -#: commands/variable.c:354 +#: commands/variable.c:362 #, c-format msgid "UTC timezone offset is out of range." msgstr "UTC 타입존 오프세트 범위가 벗어남." -#: commands/variable.c:494 +#: commands/variable.c:552 #, c-format msgid "cannot set transaction read-write mode inside a read-only transaction" msgstr "ì½ê¸° ì „ìš© 트랜잭션 ë‚´ì—서 íŠ¸ëžœìž­ì…˜ì„ ì½ê¸°/쓰기 모드로 설정할 수 ì—†ìŒ" -#: commands/variable.c:501 +#: commands/variable.c:559 #, c-format msgid "transaction read-write mode must be set before any query" msgstr "ì½ê¸°/쓰기 모드 íŠ¸ëžœìž­ì…˜ì€ ëª¨ë“  쿼리 ì•žì— ì§€ì •í•´ì•¼ 합니다." -#: commands/variable.c:508 +#: commands/variable.c:566 #, c-format msgid "cannot set transaction read-write mode during recovery" msgstr "복구 작업 중ì—는 íŠ¸ëžœìž­ì…˜ì„ ì½ê¸°/쓰기 모드로 설정할 수 ì—†ìŒ" -#: commands/variable.c:534 +#: commands/variable.c:592 #, c-format msgid "SET TRANSACTION ISOLATION LEVEL must be called before any query" msgstr "쿼리보다 먼저 SET TRANSACTION ISOLATION LEVELì„ í˜¸ì¶œí•´ì•¼ 함" -#: commands/variable.c:541 +#: commands/variable.c:599 #, c-format msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" msgstr "하위 트랜잭션ì—서 SET TRANSACTION ISOLATION LEVELì„ í˜¸ì¶œí•˜ì§€ 않아야 함" -#: commands/variable.c:548 storage/lmgr/predicate.c:1623 +#: commands/variable.c:606 storage/lmgr/predicate.c:1685 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "ì½ê¸° ì „ìš© ë³´ì¡° 서버 ìƒíƒœì—서는 serializable 모드를 사용할 수 ì—†ìŒ" -#: commands/variable.c:549 +#: commands/variable.c:607 #, c-format msgid "You can use REPEATABLE READ instead." msgstr "대신ì—, REPEATABLE READ ëª…ë ¹ì„ ì‚¬ìš©í•  수 있ìŒ." -#: commands/variable.c:567 +#: commands/variable.c:625 #, c-format msgid "" "SET TRANSACTION [NOT] DEFERRABLE cannot be called within a subtransaction" msgstr "" "하위 트랜잭션ì—서 SET TRANSACTION [NOT] DEFERRABLE êµ¬ë¬¸ì€ ì‚¬ìš©í•  수 ì—†ìŒ" -#: commands/variable.c:573 +#: commands/variable.c:631 #, c-format msgid "SET TRANSACTION [NOT] DEFERRABLE must be called before any query" msgstr "모든 쿼리보다 먼저 SET TRANSACTION [NOT] DEFERRABLE êµ¬ë¬¸ì„ ì‚¬ìš©í•´ì•¼ 함" -#: commands/variable.c:655 +#: commands/variable.c:713 #, c-format msgid "Conversion between %s and %s is not supported." msgstr "%s ì¸ì½”딩과 %s ì¸ì½”딩 사ì´ì˜ ë³€í™˜ì€ ì§€ì›í•˜ì§€ 않습니다" -#: commands/variable.c:662 +#: commands/variable.c:720 #, c-format msgid "Cannot change \"client_encoding\" now." msgstr "\"client_encoding\" ê°’ì„ ì§€ê¸ˆì€ ë°”ê¿€ 수 ì—†ìŒ" -#: commands/variable.c:723 +#: commands/variable.c:781 +#, c-format +msgid "cannot change \"client_encoding\" during a parallel operation" +msgstr "병렬 작업 중ì—는 \"client_encoding\" ì„¤ì •ì„ í•  수 ì—†ìŒ" + +#: commands/variable.c:876 +#, c-format +msgid "permission will be denied to set session authorization \"%s\"" +msgstr "set session authorization \"%s\" 작업 권한 ê±°ë¶€ë  ê²ƒìž„" + +#: commands/variable.c:881 #, c-format -msgid "cannot change client_encoding during a parallel operation" -msgstr "병렬 작업 중ì—는 client_encoding ì„¤ì •ì„ í•  수 ì—†ìŒ" +msgid "permission denied to set session authorization \"%s\"" +msgstr "set session authorization \"%s\" 작업 권한 ì—†ìŒ" -#: commands/variable.c:863 +#: commands/variable.c:991 +#, c-format +msgid "permission will be denied to set role \"%s\"" +msgstr "set role \"%s\" 작업 권한 ê±°ë¶€ë  ê²ƒìž„" + +#: commands/variable.c:996 #, c-format msgid "permission denied to set role \"%s\"" -msgstr "\"%s\" 롤 ê¶Œí•œì„ ì§€ì •í•  수 ì—†ìŒ" +msgstr "set role \"%s\" 작업 권한 ì—†ìŒ" + +#: commands/variable.c:1200 +#, c-format +msgid "Bonjour is not supported by this build" +msgstr "Bonjour ê¸°ëŠ¥ì„ ëº€ 채로 서버가 만들어졌습니다." + +#: commands/variable.c:1228 +#, c-format +msgid "" +"\"effective_io_concurrency\" must be set to 0 on platforms that lack " +"posix_fadvise()." +msgstr "" +"posix_fadvise() í•¨ìˆ˜ì— ë¬¸ì œê°€ 있는 플랫í¼ì—서는 \"effective_io_concurrency\" " +"ì„¤ì •ê°’ì´ 0 ì´ì–´ì•¼ 합니다." + +#: commands/variable.c:1241 +#, c-format +msgid "" +"\"maintenance_io_concurrency\" must be set to 0 on platforms that lack " +"posix_fadvise()." +msgstr "" +"posix_fadvise() í•¨ìˆ˜ì— ë¬¸ì œê°€ 있는 플랫í¼ì—서는 " +"\"maintenance_io_concurrency\" ì„¤ì •ê°’ì´ 0 ì´ì–´ì•¼ 합니다." + +#: commands/variable.c:1254 +#, c-format +msgid "SSL is not supported by this build" +msgstr "SSL ì ‘ì† ê¸°ëŠ¥ì„ ëº€ 채로 서버가 만들어졌습니다." -#: commands/view.c:84 +#: commands/view.c:79 #, c-format msgid "could not determine which collation to use for view column \"%s\"" msgstr "\"%s\" 칼럼 ìžë£Œ 처리를 위한 ì •ë ¬ ê·œì¹™ì„ ê²°ì •í•  수 ì—†ìŒ" -#: commands/view.c:265 commands/view.c:276 +#: commands/view.c:274 commands/view.c:285 #, c-format msgid "cannot drop columns from view" msgstr "ë·°ì—서 ì¹¼ëŸ¼ì„ ì‚­ì œí•  수 ì—†ìŒ" -#: commands/view.c:281 +#: commands/view.c:290 #, c-format msgid "cannot change name of view column \"%s\" to \"%s\"" msgstr "ë·°ì—서 \"%s\" 칼럼 ì´ë¦„ì„ \"%s\"(으)로 바꿀 수 ì—†ìŒ" -#: commands/view.c:284 +#: commands/view.c:293 #, c-format msgid "" "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." msgstr "" +"ëŒ€ì‹ ì— ALTER VIEW ... RENAME COLUMN ... êµ¬ë¬¸ì„ ì´ìš©í•´ì„œ ë·° 칼럼 ì´ë¦„ì„ ë°”ê¾¸" +"세요." -#: commands/view.c:290 +#: commands/view.c:304 #, c-format msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "ë·°ì—서 \"%s\" 칼럼 ìžë£Œí˜•ì„ì„ %sì—서 %s(으)로 바꿀 수 ì—†ìŒ" -#: commands/view.c:441 +#: commands/view.c:318 +#, c-format +msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" +msgstr "" +"ë·°ì—서 \"%s\" 칼럼 ìžë£Œí˜•ì˜ ë¬¸ìž ì •ë ¬ ê·œì¹™ì„ \"%s\"ì—서 \"%s\"(으)로 바꿀 수 " +"ì—†ìŒ" + +#: commands/view.c:387 #, c-format msgid "views must not contain SELECT INTO" msgstr "ë·°ì—는 SELECT INTO êµ¬ë¬¸ì„ í¬í•¨í•  수 ì—†ìŒ" -#: commands/view.c:453 +#: commands/view.c:399 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "뷰로 ì‚¬ìš©ë  ì¿¼ë¦¬ì˜ WITH ì ˆì—는 ìžë£Œ 변경 êµ¬ë¬¸ì´ ìžˆìœ¼ë©´ 안ë©ë‹ˆë‹¤." -#: commands/view.c:523 +#: commands/view.c:469 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "CREATE VIEW 는 columns 보다는 ì¢€ë” ë§Žì€ ì—´ ì´ë¦„ì„ ëª…ì‹œí•´ì•¼ 한다" -#: commands/view.c:531 +#: commands/view.c:477 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "" "뷰는 저장 ê³µê°„ì„ ì‚¬ìš©í•˜ì§€ 않기 ë•Œë¬¸ì— unlogged ì†ì„±ì„ 지정할 수 없습니다." -#: commands/view.c:545 +#: commands/view.c:491 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "\"%s\" 뷰는 임시ì ì¸ 뷰로 만들어집니다" @@ -12289,76 +14611,121 @@ msgstr "\"%s\" 커서가 ë¡œìš°ì— ë†“ì—¬ 있지 않ìŒ" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "\"%s\" 커서는 \"%s\" í…Œì´ë¸”ì˜ ë‹¨ìˆœ ì—…ë°ì´íЏ 가능한 ìŠ¤ìº”ì´ ì•„ë‹˜" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2404 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2555 #, c-format msgid "" "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "" "%d번째 매개 ë³€ìˆ˜ì˜ ìžë£Œí˜•(%s)ì´ ë¯¸ë¦¬ ì¤€ë¹„ëœ ì‹¤í–‰ê³„íšì˜ ìžë£Œí˜•(%s)ê³¼ 다릅니다" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2416 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2567 #, c-format msgid "no value found for parameter %d" msgstr "%d번째 매개 변수 ê°’ì´ ì—†ìŠµë‹ˆë‹¤" -#: executor/execExpr.c:859 parser/parse_agg.c:816 +#: executor/execExpr.c:642 executor/execExpr.c:649 executor/execExpr.c:655 +#: executor/execExprInterp.c:4852 executor/execExprInterp.c:4869 +#: executor/execExprInterp.c:4968 executor/nodeModifyTable.c:203 +#: executor/nodeModifyTable.c:214 executor/nodeModifyTable.c:231 +#: executor/nodeModifyTable.c:239 +#, c-format +msgid "table row type and query-specified row type do not match" +msgstr "í…Œì´ë¸” í–‰ 형ì‹ê³¼ 쿼리 지정 í–‰ 형ì‹ì´ ì¼ì¹˜í•˜ì§€ 않ìŒ" + +#: executor/execExpr.c:643 executor/nodeModifyTable.c:204 +#, c-format +msgid "Query has too many columns." +msgstr "ì¿¼ë¦¬ì— ì¹¼ëŸ¼ì´ ë„ˆë¬´ 많습니다." + +#: executor/execExpr.c:650 executor/nodeModifyTable.c:232 +#, c-format +msgid "Query provides a value for a dropped column at ordinal position %d." +msgstr "쿼리ì—서 서수 위치 %dì— ìžˆëŠ” ì‚­ì œëœ ì¹¼ëŸ¼ì˜ ê°’ì„ ì œê³µí•©ë‹ˆë‹¤." + +#: executor/execExpr.c:656 executor/execExprInterp.c:4870 +#: executor/nodeModifyTable.c:215 +#, c-format +msgid "Table has type %s at ordinal position %d, but query expects %s." +msgstr "" +"í…Œì´ë¸”ì—는 %s 형ì‹ì´ 있는ë°(서수 위치 %d) 쿼리ì—는 %sì´(ê°€) 필요합니다." + +#: executor/execExpr.c:1104 parser/parse_agg.c:838 #, c-format msgid "window function calls cannot be nested" msgstr "윈ë„ìš° 함수 í˜¸ì¶œì„ ì¤‘ì²©í•  수 ì—†ìŒ" -#: executor/execExpr.c:1318 +#: executor/execExpr.c:1649 #, c-format msgid "target type is not an array" msgstr "ëŒ€ìƒ ìžë£Œí˜•ì´ ë°°ì—´ì´ ì•„ë‹™ë‹ˆë‹¤." -#: executor/execExpr.c:1651 +#: executor/execExpr.c:1989 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "ROW() ì¹¼ëŸ¼ì€ %s ìžë£Œí˜•ì„ ê°€ì§‘ë‹ˆë‹¤. %s ìžë£Œí˜• 대신ì—" -#: executor/execExpr.c:2176 executor/execSRF.c:708 parser/parse_func.c:135 -#: parser/parse_func.c:646 parser/parse_func.c:1020 +#: executor/execExpr.c:2653 executor/execSRF.c:718 parser/parse_func.c:138 +#: parser/parse_func.c:655 parser/parse_func.c:1033 #, c-format msgid "cannot pass more than %d argument to a function" msgid_plural "cannot pass more than %d arguments to a function" msgstr[0] "í•¨ìˆ˜ì— ìµœëŒ€ %dê°œì˜ ì¸ìžë¥¼ 전달할 수 있ìŒ" -#: executor/execExpr.c:2587 executor/execExpr.c:2593 -#: executor/execExprInterp.c:2730 utils/adt/arrayfuncs.c:262 -#: utils/adt/arrayfuncs.c:560 utils/adt/arrayfuncs.c:1302 -#: utils/adt/arrayfuncs.c:3348 utils/adt/arrayfuncs.c:5308 -#: utils/adt/arrayfuncs.c:5821 +#: executor/execExpr.c:2680 executor/execSRF.c:738 executor/functions.c:1068 +#: utils/adt/jsonfuncs.c:4054 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 #, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "지정한 ë°°ì—´ í¬ê¸°(%d)ê°€ 최대치(%d)를 초과했습니다" +msgid "set-valued function called in context that cannot accept a set" +msgstr "" +"set-values 함수(í…Œì´ë¸” 리턴 함수)ê°€ set ì •ì˜ ì—†ì´ ì‚¬ìš©ë˜ì—ˆìŠµë‹ˆë‹¤ (í…Œì´ë¸”ê³¼ í•´" +"당 ì—´ alias 지정하세요)" + +#: executor/execExpr.c:3086 parser/parse_node.c:272 parser/parse_node.c:322 +#, c-format +msgid "cannot subscript type %s because it does not support subscripting" +msgstr "" +"ì´ ìžë£Œí˜•ì€ subscript í˜•ì„ ì§€ì›í•˜ì§€ 않기 때문ì—, %s subscript ìžë£Œí˜•ì„ ì‚¬ìš©" +"í•  수 ì—†ìŒ" + +#: executor/execExpr.c:3214 executor/execExpr.c:3236 +#, c-format +msgid "type %s does not support subscripted assignment" +msgstr "%s ìžë£Œí˜•ì€ subscript ì§€ì •ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: executor/execExprInterp.c:1894 +#: executor/execExprInterp.c:2019 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "%d 번째 ì†ì„±(ëŒ€ìƒ ìžë£Œí˜• %s)ì´ ì‚­ì œë˜ì—ˆìŒ" -#: executor/execExprInterp.c:1900 +#: executor/execExprInterp.c:2025 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "%d 번째 ì†ì„±(ëŒ€ìƒ ìžë£Œí˜• %s)ì˜ ìžë£Œí˜•ì´ ìž˜ëª»ë˜ì—ˆìŒ" -#: executor/execExprInterp.c:1902 executor/execExprInterp.c:3002 -#: executor/execExprInterp.c:3049 +#: executor/execExprInterp.c:2027 executor/execExprInterp.c:3226 +#: executor/execExprInterp.c:3272 #, c-format msgid "Table has type %s, but query expects %s." msgstr "í…Œì´ë¸”ì—는 %s ìžë£Œí˜•ì´ì§€ë§Œ, 쿼리ì—서는 %s ìžë£Œí˜•입니다." -#: executor/execExprInterp.c:2494 +#: executor/execExprInterp.c:2107 utils/adt/expandedrecord.c:99 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1752 +#: utils/cache/typcache.c:1911 utils/cache/typcache.c:2058 +#: utils/fmgr/funcapi.c:569 +#, c-format +msgid "type %s is not composite" +msgstr "%s ìžë£Œí˜•ì€ ë³µí•© ìžë£Œí˜•ì´ ì•„ë‹™ë‹ˆë‹¤" + +#: executor/execExprInterp.c:2710 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF êµ¬ë¬¸ì€ ì´ í…Œì´ë¸” 형 대ìƒìœ¼ë¡œ ì§€ì›í•˜ì§€ 않습니다." -#: executor/execExprInterp.c:2708 +#: executor/execExprInterp.c:2923 #, c-format msgid "cannot merge incompatible arrays" msgstr "ë°°ì—´ 형태가 서로 틀려 병합할 수 없습니다" -#: executor/execExprInterp.c:2709 +#: executor/execExprInterp.c:2924 #, c-format msgid "" "Array with element type %s cannot be included in ARRAY construct with " @@ -12367,59 +14734,79 @@ msgstr "" "%s ìžë£Œí˜•ì˜ ìš”ì†Œë¡œ êµ¬ì„±ëœ ë°°ì—´ì€ %s ìžë£Œí˜•ì˜ ìš”ì†Œë¡œ êµ¬ì„±ëœ ARRAY êµ¬ë¬¸ì— í¬í•¨" "ë  ìˆ˜ 없습니다." -#: executor/execExprInterp.c:2750 executor/execExprInterp.c:2780 +#: executor/execExprInterp.c:2945 utils/adt/arrayfuncs.c:1305 +#: utils/adt/arrayfuncs.c:3503 utils/adt/arrayfuncs.c:5593 +#: utils/adt/arrayfuncs.c:6110 utils/adt/arraysubs.c:150 +#: utils/adt/arraysubs.c:488 +#, c-format +msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +msgstr "지정한 ë°°ì—´ í¬ê¸°(%d)ê°€ 최대치(%d)를 초과했습니다" + +#: executor/execExprInterp.c:2965 executor/execExprInterp.c:3000 #, c-format msgid "" "multidimensional arrays must have array expressions with matching dimensions" msgstr "ë‹¤ì°¨ì› ë°°ì—´ì—는 ì¼ì¹˜í•˜ëŠ” ì°¨ì›ì´ í¬í•¨ëœ ë°°ì—´ ì‹ì´ 있어야 함" -#: executor/execExprInterp.c:3001 executor/execExprInterp.c:3048 +#: executor/execExprInterp.c:2977 utils/adt/array_expanded.c:274 +#: utils/adt/arrayfuncs.c:335 utils/adt/arrayfuncs.c:494 +#: utils/adt/arrayfuncs.c:727 utils/adt/arrayfuncs.c:1533 +#: utils/adt/arrayfuncs.c:2341 utils/adt/arrayfuncs.c:2356 +#: utils/adt/arrayfuncs.c:2618 utils/adt/arrayfuncs.c:2634 +#: utils/adt/arrayfuncs.c:2895 utils/adt/arrayfuncs.c:2949 +#: utils/adt/arrayfuncs.c:2964 utils/adt/arrayfuncs.c:3305 +#: utils/adt/arrayfuncs.c:3533 utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:6202 utils/adt/arrayfuncs.c:6546 +#: utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 +#: utils/adt/arrayutils.c:99 #, c-format -msgid "attribute %d has wrong type" -msgstr "%d ì†ì„±ì˜ 형ì‹ì´ 잘못ë¨" +msgid "array size exceeds the maximum allowed (%d)" +msgstr "ë°°ì—´ í¬ê¸°ê°€ 최대치 (%d)를 초과했습니다" -#: executor/execExprInterp.c:3158 +#: executor/execExprInterp.c:3225 executor/execExprInterp.c:3271 #, c-format -msgid "array subscript in assignment must not be null" -msgstr "ë°°ì—´ 하위 스í¬ë¦½íŠ¸ë¡œ 지정하는 값으로 null ê°’ì„ ì‚¬ìš©í•  수 없습니다" +msgid "attribute %d has wrong type" +msgstr "%d ì†ì„±ì˜ 형ì‹ì´ 잘못ë¨" -#: executor/execExprInterp.c:3588 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3857 utils/adt/domains.c:158 #, c-format msgid "domain %s does not allow null values" msgstr "%s ë„ë©”ì¸ì—서는 null ê°’ì„ í—ˆìš©í•˜ì§€ 않습니다" -#: executor/execExprInterp.c:3603 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3872 utils/adt/domains.c:196 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "%s ë„ë©”ì¸ìš© ê°’ì´ \"%s\" ì²´í¬ ì œì•½ ì¡°ê±´ì„ ìœ„ë°˜í–ˆìŠµë‹ˆë‹¤" -#: executor/execExprInterp.c:3973 executor/execExprInterp.c:3990 -#: executor/execExprInterp.c:4091 executor/nodeModifyTable.c:109 -#: executor/nodeModifyTable.c:120 executor/nodeModifyTable.c:137 -#: executor/nodeModifyTable.c:145 +#: executor/execExprInterp.c:4447 #, c-format -msgid "table row type and query-specified row type do not match" -msgstr "í…Œì´ë¸” í–‰ 형ì‹ê³¼ 쿼리 지정 í–‰ 형ì‹ì´ ì¼ì¹˜í•˜ì§€ 않ìŒ" +msgid "no SQL/JSON item found for specified path of column \"%s\"" +msgstr "\"%s\" ì¹¼ëŸ¼ì— ì§€ì •í•œ 패스ì—서는 SQL/JSON ì•„ì´í…œì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: executor/execExprInterp.c:3974 +#: executor/execExprInterp.c:4452 +#, c-format +msgid "no SQL/JSON item found for specified path" +msgstr "지정한 패스ì—서는 SQL/JSON ì•„ì´í…œì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" + +#. translator: first %s is a SQL/JSON clause (e.g. ON ERROR) +#: executor/execExprInterp.c:4652 executor/execExprInterp.c:4660 +#, c-format +msgid "could not coerce %s expression (%s) to the RETURNING type" +msgstr "%s í‘œí˜„ì‹ (%s)ì€ RETURNING 형ì‹ìœ¼ë¡œ 바꿀 수 ì—†ìŒ" + +#: executor/execExprInterp.c:4853 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." msgstr[0] "" "í…Œì´ë¸” í–‰ì—는 %dê°œ ì†ì„±ì´ í¬í•¨ë˜ì–´ ìžˆëŠ”ë° ì¿¼ë¦¬ì—는 %d개가 필요합니다." -#: executor/execExprInterp.c:3991 executor/nodeModifyTable.c:121 -#, c-format -msgid "Table has type %s at ordinal position %d, but query expects %s." -msgstr "" -"í…Œì´ë¸”ì—는 %s 형ì‹ì´ 있는ë°(서수 위치 %d) 쿼리ì—는 %sì´(ê°€) 필요합니다." - -#: executor/execExprInterp.c:4092 executor/execSRF.c:967 +#: executor/execExprInterp.c:4969 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "서수 위치 %dì˜ ì‚­ì œëœ ì†ì„±ì—서 실제 스토리지 불ì¼ì¹˜ê°€ ë°œìƒí•©ë‹ˆë‹¤." -#: executor/execIndexing.c:550 +#: executor/execIndexing.c:593 #, c-format msgid "" "ON CONFLICT does not support deferrable unique constraints/exclusion " @@ -12428,204 +14815,176 @@ msgstr "" "지연 가능한 고유 제약조건ì´ë‚˜ 제외 제약 ì¡°ê±´ì€ ON CONFLICT íŒë³„ìžë¡œ 사용할 " "수 없습니다." -#: executor/execIndexing.c:821 +#: executor/execIndexing.c:870 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "\"%s\" exclusion 제약 ì¡°ê±´ì„ ë§Œë“¤ 수 ì—†ìŒ" -#: executor/execIndexing.c:824 +#: executor/execIndexing.c:873 #, c-format msgid "Key %s conflicts with key %s." msgstr "%s 키와 %s ê°€ ì¶©ëŒí•¨" -#: executor/execIndexing.c:826 +#: executor/execIndexing.c:875 #, c-format msgid "Key conflicts exist." msgstr "키 ì¶©ëŒ ë°œìƒ" -#: executor/execIndexing.c:832 +#: executor/execIndexing.c:881 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "\"%s\" exclusion 제약 ì¡°ê±´ì— ë”°ë¼ í‚¤ ê°’ ì¶©ëŒì´ ë°œìƒí–ˆìŠµë‹ˆë‹¤." -#: executor/execIndexing.c:835 +#: executor/execIndexing.c:884 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "%s 키가 ì´ë¯¸ 있는 %s 키와 ì¶©ëŒí•©ë‹ˆë‹¤." -#: executor/execIndexing.c:837 +#: executor/execIndexing.c:886 #, c-format msgid "Key conflicts with existing key." msgstr "키가 기존 키와 ì¶©ëŒí•¨" -#: executor/execMain.c:1091 +#: executor/execMain.c:1039 #, c-format msgid "cannot change sequence \"%s\"" msgstr "\"%s\" 시퀀스를 바꿀 수 ì—†ìŒ" -#: executor/execMain.c:1097 +#: executor/execMain.c:1045 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "\"%s\" TOAST 릴레ì´ì…˜ì„ 바꿀 수 ì—†ìŒ" -#: executor/execMain.c:1115 rewrite/rewriteHandler.c:2934 -#: rewrite/rewriteHandler.c:3708 -#, c-format -msgid "cannot insert into view \"%s\"" -msgstr "\"%s\" ë·°ì— ìžë£Œë¥¼ 입력할 수 없습니다" - -#: executor/execMain.c:1117 rewrite/rewriteHandler.c:2937 -#: rewrite/rewriteHandler.c:3711 -#, c-format -msgid "" -"To enable inserting into the view, provide an INSTEAD OF INSERT trigger or " -"an unconditional ON INSERT DO INSTEAD rule." -msgstr "" -"뷰를 통해 ìžë£Œë¥¼ 입력하려면, INSTEAD OF INSERT 트리거나 ON INSERT DO INSTEAD " -"ë£°ì„ ì‚¬ìš©í•˜ì„¸ìš”" - -#: executor/execMain.c:1123 rewrite/rewriteHandler.c:2942 -#: rewrite/rewriteHandler.c:3716 -#, c-format -msgid "cannot update view \"%s\"" -msgstr "\"%s\" 뷰로는 ìžë£Œë¥¼ 갱신할 수 없습니다" - -#: executor/execMain.c:1125 rewrite/rewriteHandler.c:2945 -#: rewrite/rewriteHandler.c:3719 -#, c-format -msgid "" -"To enable updating the view, provide an INSTEAD OF UPDATE trigger or an " -"unconditional ON UPDATE DO INSTEAD rule." -msgstr "" -"ë·° ìžë£Œ 갱신 ê¸°ëŠ¥ì€ INSTEAD OF UPDATE 트리거를 사용하거나, ON UPDATE DO " -"INSTEAD ì†ì„±ìœ¼ë¡œ ë£°ì„ ë§Œë“¤ì–´ì„œ 사용해 보세요." - -#: executor/execMain.c:1131 rewrite/rewriteHandler.c:2950 -#: rewrite/rewriteHandler.c:3724 -#, c-format -msgid "cannot delete from view \"%s\"" -msgstr "\"%s\" 뷰로는 ìžë£Œë¥¼ 삭제할 수 없습니다" - -#: executor/execMain.c:1133 rewrite/rewriteHandler.c:2953 -#: rewrite/rewriteHandler.c:3727 -#, c-format -msgid "" -"To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an " -"unconditional ON DELETE DO INSTEAD rule." -msgstr "" -"ë·° ìžë£Œ ì‚­ì œ ê¸°ëŠ¥ì€ INSTEAD OF DELETE 트리거를 사용하거나, ON DELETE DO " -"INSTEAD ì†ì„±ìœ¼ë¡œ ë£°ì„ ë§Œë“¤ì–´ì„œ 사용해 보세요." - -#: executor/execMain.c:1144 +#: executor/execMain.c:1064 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "\"%s\" êµ¬ì²´í™”ëœ ë·°ë¥¼ 바꿀 수 ì—†ìŒ" -#: executor/execMain.c:1156 +#: executor/execMain.c:1076 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "\"%s\" 외부 í…Œì´ë¸”ì— ìžë£Œë¥¼ 입력할 수 ì—†ìŒ" -#: executor/execMain.c:1162 +#: executor/execMain.c:1082 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "\"%s\" 외부 í…Œì´ë¸”ì€ ìžë£Œ ìž…ë ¥ì„ í—ˆìš©í•˜ì§€ 않ìŒ" -#: executor/execMain.c:1169 +#: executor/execMain.c:1089 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "\"%s\" 외부 í…Œì´ë¸”ì— ìžë£Œë¥¼ 변경 í•  수 ì—†ìŒ" -#: executor/execMain.c:1175 +#: executor/execMain.c:1095 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "\"%s\" 외부 í…Œì´ë¸”ì€ ìžë£Œ ë³€ê²½ì„ í—ˆìš©í•˜ì§€ 않ìŒ" -#: executor/execMain.c:1182 +#: executor/execMain.c:1102 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "\"%s\" 외부 í…Œì´ë¸”ì— ìžë£Œë¥¼ ì‚­ì œ í•  수 ì—†ìŒ" -#: executor/execMain.c:1188 +#: executor/execMain.c:1108 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "\"%s\" 외부 í…Œì´ë¸”ì€ ìžë£Œ 삭제를 허용하지 않ìŒ" -#: executor/execMain.c:1199 +#: executor/execMain.c:1119 #, c-format msgid "cannot change relation \"%s\"" msgstr "\"%s\" 릴레ì´ì…˜ì„ 바꿀 수 ì—†ìŒ" -#: executor/execMain.c:1226 +#: executor/execMain.c:1146 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "\"%s\" 시퀀스ì—서 로우를 잠글 수 ì—†ìŒ" -#: executor/execMain.c:1233 +#: executor/execMain.c:1153 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "\"%s\" TOAST 릴레ì´ì…˜ì—서 로우를 잠글 수 ì—†ìŒ" -#: executor/execMain.c:1240 +#: executor/execMain.c:1160 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "\"%s\" ë·°ì—서 로우를 잠글 수 ì—†ìŒ" -#: executor/execMain.c:1248 +#: executor/execMain.c:1168 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "\"%s\" êµ¬ì²´í™”ëœ ë·°ì—서 로우를 잠글 수 ì—†ìŒ" -#: executor/execMain.c:1257 executor/execMain.c:2627 -#: executor/nodeLockRows.c:132 +#: executor/execMain.c:1177 executor/execMain.c:2687 +#: executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "\"%s\" 외부 í…Œì´ë¸”ì—서 로우를 잠글 수 ì—†ìŒ" -#: executor/execMain.c:1263 +#: executor/execMain.c:1183 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "\"%s\" 릴레ì´ì…˜ì—서 로우를 잠글 수 ì—†ìŒ" -#: executor/execMain.c:1879 +#: executor/execMain.c:1901 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "새 ìžë£Œê°€ \"%s\" 릴레ì´ì…˜ì˜ 파티션 제약 ì¡°ê±´ì„ ìœ„ë°˜í–ˆìŠµë‹ˆë‹¤" -#: executor/execMain.c:1881 executor/execMain.c:1964 executor/execMain.c:2012 -#: executor/execMain.c:2120 +#: executor/execMain.c:1903 executor/execMain.c:1987 executor/execMain.c:2038 +#: executor/execMain.c:2148 #, c-format msgid "Failing row contains %s." msgstr "실패한 ìžë£Œ: %s" -#: executor/execMain.c:1961 +#: executor/execMain.c:1984 #, c-format msgid "" "null value in column \"%s\" of relation \"%s\" violates not-null constraint" -msgstr "\"%s\" 칼럼(해당 릴레ì´ì…˜ \"%s\")ì˜ null ê°’ì´ not null ì œì•½ì¡°ê±´ì„ ìœ„ë°˜í–ˆìŠµë‹ˆë‹¤." +msgstr "" +"\"%s\" 칼럼(해당 릴레ì´ì…˜ \"%s\")ì˜ null ê°’ì´ not null ì œì•½ì¡°ê±´ì„ ìœ„ë°˜í–ˆìŠµë‹ˆ" +"다." -#: executor/execMain.c:2010 +#: executor/execMain.c:2036 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "새 ìžë£Œê°€ \"%s\" 릴레ì´ì…˜ì˜ \"%s\" ì²´í¬ ì œì•½ ì¡°ê±´ì„ ìœ„ë°˜í–ˆìŠµë‹ˆë‹¤" -#: executor/execMain.c:2118 +#: executor/execMain.c:2146 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "새 ìžë£Œê°€ \"%s\" ë·°ì˜ ì²´í¬ ì œì•½ ì¡°ê±´ì„ ìœ„ë°˜í–ˆìŠµë‹ˆë‹¤" -#: executor/execMain.c:2128 +#: executor/execMain.c:2156 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "" "새 ìžë£Œê°€ \"%s\" 로우 단위 보안 ì •ì±…ì„ ìœ„ë°˜í–ˆìŠµë‹ˆë‹¤, 해당 í…Œì´ë¸”: \"%s\"" -#: executor/execMain.c:2133 +#: executor/execMain.c:2161 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "새 ìžë£Œê°€ \"%s\" í…Œì´ë¸”ì˜ ë¡œìš° 단위 보안 ì •ì±…ì„ ìœ„ë°˜í–ˆìŠµë‹ˆë‹¤." -#: executor/execMain.c:2140 +#: executor/execMain.c:2169 +#, c-format +msgid "" +"target row violates row-level security policy \"%s\" (USING expression) for " +"table \"%s\"" +msgstr "" +"ëŒ€ìƒ ë¡œìš°ê°€ \"%s\" 로우 단위 보안 ì •ì±…(USING ì ˆ 사용)ì„ ìœ„ë°˜í–ˆìŠµë‹ˆë‹¤, 해당 í…Œ" +"ì´ë¸”: \"%s\"" + +#: executor/execMain.c:2174 +#, c-format +msgid "" +"target row violates row-level security policy (USING expression) for table " +"\"%s\"" +msgstr "" +"ëŒ€ìƒ ë¡œìš°ê°€ \"%s\" í…Œì´ë¸”ì˜ ë¡œìš° 단위 보안 ì •ì±…(USING ì ˆ 사용)ì„ ìœ„ë°˜í–ˆìŠµë‹ˆ" +"다." + +#: executor/execMain.c:2181 #, c-format msgid "" "new row violates row-level security policy \"%s\" (USING expression) for " @@ -12634,25 +14993,25 @@ msgstr "" "새 ìžë£Œê°€ \"%s\" 로우 단위 보안 ì •ì±…(USING ì ˆ 사용)ì„ ìœ„ë°˜í–ˆìŠµë‹ˆë‹¤, 해당 í…Œì´" "블: \"%s\"" -#: executor/execMain.c:2145 +#: executor/execMain.c:2186 #, c-format msgid "" -"new row violates row-level security policy (USING expression) for table \"%s" -"\"" +"new row violates row-level security policy (USING expression) for table " +"\"%s\"" msgstr "" "새 ìžë£Œê°€ \"%s\" í…Œì´ë¸”ì˜ ë¡œìš° 단위 보안 ì •ì±…(USING ì ˆ 사용)ì„ ìœ„ë°˜í–ˆìŠµë‹ˆë‹¤." -#: executor/execPartition.c:341 +#: executor/execPartition.c:327 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "해당 로우를 위한 \"%s\" 릴레ì´ì…˜ìš© íŒŒí‹°ì…˜ì´ ì—†ìŒ" -#: executor/execPartition.c:344 +#: executor/execPartition.c:330 #, c-format msgid "Partition key of the failing row contains %s." msgstr "실패한 ë¡œìš°ì˜ íŒŒí‹°ì…˜ 키 ê°’: %s" -#: executor/execReplication.c:196 executor/execReplication.c:373 +#: executor/execReplication.c:272 executor/execReplication.c:456 #, c-format msgid "" "tuple to be locked was already moved to another partition due to concurrent " @@ -12660,26 +15019,50 @@ msgid "" msgstr "" "다른 ì—…ë°ì´íЏ 작업으로 ìž êµ´ íŠœí”Œì´ ì´ë¯¸ 다른 파티션으로 ì´ë™ë˜ì—ˆìŒ, 재시ë„함" -#: executor/execReplication.c:200 executor/execReplication.c:377 +#: executor/execReplication.c:276 executor/execReplication.c:460 #, c-format msgid "concurrent update, retrying" msgstr "ë™ì‹œ ì—…ë°ì´íЏ, 다시 ì‹œë„ ì¤‘" -#: executor/execReplication.c:206 executor/execReplication.c:383 +#: executor/execReplication.c:282 executor/execReplication.c:466 #, c-format msgid "concurrent delete, retrying" msgstr "ë™ì‹œ ì‚­ì œ, 다시 ì‹œë„ ì¤‘" -#: executor/execReplication.c:269 parser/parse_oper.c:228 -#: utils/adt/array_userfuncs.c:719 utils/adt/array_userfuncs.c:858 -#: utils/adt/arrayfuncs.c:3626 utils/adt/arrayfuncs.c:4146 -#: utils/adt/arrayfuncs.c:6132 utils/adt/rowtypes.c:1182 +#: executor/execReplication.c:352 parser/parse_cte.c:302 +#: parser/parse_oper.c:221 utils/adt/array_userfuncs.c:1334 +#: utils/adt/array_userfuncs.c:1477 utils/adt/arrayfuncs.c:3852 +#: utils/adt/arrayfuncs.c:4407 utils/adt/arrayfuncs.c:6426 +#: utils/adt/rowtypes.c:1220 #, c-format msgid "could not identify an equality operator for type %s" msgstr "" "%s ìžë£Œí˜•ì—서 사용할 ë™ë“± ì—°ì‚°ìž(equality operator)를 ì°¾ì„ ìˆ˜ 없습니다." -#: executor/execReplication.c:586 +#: executor/execReplication.c:687 executor/execReplication.c:693 +#, c-format +msgid "cannot update table \"%s\"" +msgstr "\"%s\" í…Œì´ë¸”ì— ìžë£Œë¥¼ 변경 í•  수 ì—†ìŒ" + +#: executor/execReplication.c:689 executor/execReplication.c:701 +#, c-format +msgid "" +"Column used in the publication WHERE expression is not part of the replica " +"identity." +msgstr "ë°œí–‰ì˜ WHERE ì ˆì—서 사용한 ì¹¼ëŸ¼ì´ ë³µì œ ì‹ë³„ìžì˜ 한 ë¶€ë¶„ì´ ì•„ë‹™ë‹ˆë‹¤." + +#: executor/execReplication.c:695 executor/execReplication.c:707 +#, c-format +msgid "" +"Column list used by the publication does not cover the replica identity." +msgstr "발행ì—서 사용ë˜ëŠ” 칼럼 목ë¡ì´ 복제 ì‹ë³„ìžë¥¼ ëª¨ë‘ í¬í•¨í•˜ì§€ 못했습니다." + +#: executor/execReplication.c:699 executor/execReplication.c:705 +#, c-format +msgid "cannot delete from table \"%s\"" +msgstr "\"%s\" í…Œì´ë¸”ì— ìžë£Œë¥¼ ì‚­ì œ í•  수 ì—†ìŒ" + +#: executor/execReplication.c:725 #, c-format msgid "" "cannot update table \"%s\" because it does not have a replica identity and " @@ -12688,56 +15071,52 @@ msgstr "" "\"%s\" í…Œì´ë¸” ì—…ë°ì´íЏ 실패, ì´ í…Œì´ë¸”ì—는 복제용 ì‹ë³„ìžë¥¼ 지정하지 않았거" "나, updates 옵션 ì—†ì´ ë°œí–‰í–ˆìŠµë‹ˆë‹¤" -#: executor/execReplication.c:588 +#: executor/execReplication.c:727 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "" "ì—…ë°ì´íŠ¸ë¥¼ 하려면, ALTER TABLE 명령어ì—서 REPLICA IDENTITY ì˜µì…˜ì„ ì‚¬ìš©í•˜ì„¸ìš”" -#: executor/execReplication.c:592 +#: executor/execReplication.c:731 #, c-format msgid "" "cannot delete from table \"%s\" because it does not have a replica identity " "and publishes deletes" msgstr "\"%s\" í…Œì´ë¸” ìžë£Œ ì‚­ì œ 실패, 복제 ì‹ë³„ìžì™€ deletes ë°œí–‰ì„ ì•ˆí•¨" -#: executor/execReplication.c:594 +#: executor/execReplication.c:733 #, c-format msgid "" "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "ì‚­ì œ 하려면, ALTER TABLE 명령어ì—서 REPLICA IDENTITY ì˜µì…˜ì„ ì‚¬ìš©í•˜ì„¸ìš”" -#: executor/execReplication.c:613 executor/execReplication.c:621 +#: executor/execReplication.c:749 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "\"%s.%s\" 릴레ì´ì…˜ì€ 논리 복제 대ìƒì´ ë  ìˆ˜ ì—†ìŒ" -#: executor/execReplication.c:615 -#, c-format -msgid "\"%s.%s\" is a foreign table." -msgstr "\"%s.%s\" 개체는 외부 í…Œì´ë¸”입니다." - -#: executor/execReplication.c:623 -#, c-format -msgid "\"%s.%s\" is not a table." -msgstr "\"%s.%s\" 개체는 í…Œì´ë¸”ì´ ì•„ë‹™ë‹ˆë‹¤." - #: executor/execSRF.c:315 #, c-format msgid "rows returned by function are not all of the same row type" msgstr "함수 호출로 반환ë˜ëŠ” 로우가 ê°™ì€ ë¡œìš°í˜•ì˜ ì „ë¶€ê°€ 아닙니다" -#: executor/execSRF.c:363 executor/execSRF.c:657 +#: executor/execSRF.c:365 +#, c-format +msgid "table-function protocol for value-per-call mode was not followed" +msgstr "" +"value-per-call 모드를 위한 í…Œì´ë¸” 함수 í”„ë¡œí† ì½œì´ ë’¤ì´ì–´ 오지 않았습니다" + +#: executor/execSRF.c:373 executor/execSRF.c:667 #, c-format msgid "table-function protocol for materialize mode was not followed" msgstr "materialize 모드를 위한 í…Œì´ë¸” 함수 í”„ë¡œí† ì½œì´ ë’¤ì´ì–´ 오지 않았습니다" -#: executor/execSRF.c:370 executor/execSRF.c:675 +#: executor/execSRF.c:380 executor/execSRF.c:685 #, c-format msgid "unrecognized table-function returnMode: %d" msgstr "알 수 없는 í…Œì´ë¸”-함수 리턴모드: %d" -#: executor/execSRF.c:884 +#: executor/execSRF.c:894 #, c-format msgid "" "function returning setof record called in context that cannot accept type " @@ -12745,237 +15124,280 @@ msgid "" msgstr "" "setof 레코드 반환 함수가 type 레코드를 허용하지 않는 컨í…스트ì—서 호출ë¨" -#: executor/execSRF.c:940 executor/execSRF.c:956 executor/execSRF.c:966 +#: executor/execSRF.c:950 executor/execSRF.c:966 executor/execSRF.c:976 #, c-format msgid "function return row and query-specified return row do not match" msgstr "함수 반환 행과 쿼리 지정 반환 í–‰ì´ ì¼ì¹˜í•˜ì§€ 않ìŒ" -#: executor/execSRF.c:941 +#: executor/execSRF.c:951 #, c-format msgid "Returned row contains %d attribute, but query expects %d." msgid_plural "Returned row contains %d attributes, but query expects %d." msgstr[0] "" "ë°˜í™˜ëœ í–‰ì—는 %dê°œ ì†ì„±ì´ í¬í•¨ë˜ì–´ ìžˆëŠ”ë° ì¿¼ë¦¬ì—는 %d개가 필요합니다." -#: executor/execSRF.c:957 +#: executor/execSRF.c:967 #, c-format msgid "Returned type %s at ordinal position %d, but query expects %s." msgstr "ë°˜í™˜ëœ í˜•ì‹ì€ %sì¸ë°(서수 위치 %d) 쿼리ì—는 %sì´(ê°€) 필요합니다." -#: executor/execUtils.c:750 +#: executor/execTuples.c:147 executor/execTuples.c:368 +#: executor/execTuples.c:563 executor/execTuples.c:772 +#, c-format +msgid "cannot retrieve a system column in this context" +msgstr "ì´ ì»¨í…스트ì—는 시스템 ì¹¼ëŸ¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" + +#: executor/execTuples.c:163 executor/execTuples.c:580 +#, c-format +msgid "don't have transaction information for this type of tuple" +msgstr "íŠœí”Œì˜ ì´ëŸ° í˜•íƒœì— ëŒ€í•œ 트랜잭션 ì •ë³´ê°€ ì—†ìŒ" + +#: executor/execTuples.c:390 executor/execTuples.c:794 +#, c-format +msgid "don't have a storage tuple in this context" +msgstr "ì´ ì»¨í…스트ì—는 a storage tuple ì„ ê°€ì§ˆ 수 ì—†ìŒ." + +#: executor/execUtils.c:713 #, c-format msgid "materialized view \"%s\" has not been populated" msgstr "\"%s\" êµ¬ì²´í™”ëœ ë·°ê°€ ì•„ì§ êµ¬ì²´í™”ë˜ì§€ 못했습니다." -#: executor/execUtils.c:752 +#: executor/execUtils.c:715 #, c-format msgid "Use the REFRESH MATERIALIZED VIEW command." msgstr "REFRESH MATERIALIZED VIEW ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: executor/functions.c:231 +#: executor/functions.c:217 #, c-format msgid "could not determine actual type of argument declared %s" msgstr "%s ì¸ìžì˜ ìžë£Œí˜•으로 지정한 ìžë£Œí˜•ì˜ ê¸°ë³¸ ìžë£Œí˜•ì„ ì°¾ì„ ìˆ˜ 없습니다" -#: executor/functions.c:528 +#: executor/functions.c:513 #, c-format -msgid "cannot COPY to/from client in a SQL function" -msgstr "SQL 함수ì—서 í´ë¼ì´ì–¸íЏ ëŒ€ìƒ COPY ìž‘ì—…ì„ í•  수 ì—†ìŒ" +msgid "cannot COPY to/from client in an SQL function" +msgstr "SQL 함수ì—서 í´ë¼ì´ì–¸íЏ ëŒ€ìƒ COPY to/from ìž‘ì—…ì„ í•  수 ì—†ìŒ" #. translator: %s is a SQL statement name -#: executor/functions.c:534 +#: executor/functions.c:519 #, c-format -msgid "%s is not allowed in a SQL function" -msgstr "SQL 함수ì—서 %s ì§€ì›ë˜ì§€ 않ìŒ" +msgid "%s is not allowed in an SQL function" +msgstr "SQL 함수ì—서는 %s êµ¬ë¬¸ì„ í—ˆìš©í•˜ì§€ 않ìŒ" #. translator: %s is a SQL statement name -#: executor/functions.c:542 executor/spi.c:1471 executor/spi.c:2257 +#: executor/functions.c:527 executor/spi.c:1744 executor/spi.c:2657 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s êµ¬ë¬¸ì€ ë¹„íœ˜ë°œì„± 함수(non-volatile function)ì—서 허용하지 않습니다" -#: executor/functions.c:1430 +#: executor/functions.c:1452 #, c-format msgid "SQL function \"%s\" statement %d" msgstr "SQL 함수 \"%s\"ì˜ ë¬¸ %d" -#: executor/functions.c:1456 +#: executor/functions.c:1478 #, c-format msgid "SQL function \"%s\" during startup" msgstr "시작 중 SQL 함수 \"%s\"" -#: executor/functions.c:1549 +#: executor/functions.c:1563 #, c-format msgid "" "calling procedures with output arguments is not supported in SQL functions" msgstr "출력 ì¸ìžë¥¼ í¬í•¨í•œ 프로시져 í˜¸ì¶œì€ SQL 함수ì—서 ì§€ì›í•˜ì§€ 않습니다." -#: executor/functions.c:1671 executor/functions.c:1708 -#: executor/functions.c:1722 executor/functions.c:1812 -#: executor/functions.c:1845 executor/functions.c:1859 +#: executor/functions.c:1698 executor/functions.c:1736 +#: executor/functions.c:1750 executor/functions.c:1845 +#: executor/functions.c:1878 executor/functions.c:1892 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "리턴 ìžë£Œí˜•ì´ í•¨ìˆ˜ ì •ì˜ì—서 지정한 %s 리턴 ìžë£Œí˜•ê³¼ 틀립니다" -#: executor/functions.c:1673 +#: executor/functions.c:1700 #, c-format msgid "" -"Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." +"Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE " +"RETURNING." msgstr "" -"함수 ë‚´ìš©ì˜ ë§¨ 마지막 êµ¬ë¬¸ì€ SELECT ë˜ëŠ” INSERT/UPDATE/DELETE RETURNINGì´ì–´" -"야 합니다." +"함수 ë‚´ìš©ì˜ ë§¨ 마지막 êµ¬ë¬¸ì€ SELECT ë˜ëŠ” INSERT/UPDATE/DELETE/MERGE RETURNING" +"ì´ì–´ì•¼ 합니다." -#: executor/functions.c:1710 +#: executor/functions.c:1738 #, c-format msgid "Final statement must return exactly one column." msgstr "맨 마지막 êµ¬ë¬¸ì€ ì •í™•ížˆ í•˜ë‚˜ì˜ ì¹¼ëŸ¼ë§Œ 반환해야 합니다." -#: executor/functions.c:1724 +#: executor/functions.c:1752 #, c-format msgid "Actual return type is %s." msgstr "실재 반환 ìžë£Œí˜•ì€ %s" -#: executor/functions.c:1814 +#: executor/functions.c:1847 #, c-format msgid "Final statement returns too many columns." msgstr "맨 마지막 êµ¬ë¬¸ì´ ë„ˆë¬´ ë§Žì€ ì¹¼ëŸ¼ì„ ë°˜í™˜í•©ë‹ˆë‹¤." -#: executor/functions.c:1847 +#: executor/functions.c:1880 #, c-format msgid "Final statement returns %s instead of %s at column %d." msgstr "" "맨 마지막 êµ¬ë¬¸ì´ %s(기대ë˜ëŠ” ìžë£Œí˜•: %s) ìžë£Œí˜•ì„ %d 번째 칼럼ì—서 반환합니" "다." -#: executor/functions.c:1861 +#: executor/functions.c:1894 #, c-format msgid "Final statement returns too few columns." msgstr "맨 마지막 êµ¬ë¬¸ì´ ë„ˆë¬´ ì ì€ ì¹¼ëŸ¼ì„ ë°˜í™˜í•©ë‹ˆë‹¤." -#: executor/functions.c:1889 +#: executor/functions.c:1922 #, c-format msgid "return type %s is not supported for SQL functions" msgstr "반환 ìžë£Œí˜•ì¸ %s ìžë£Œí˜•ì€ SQL 함수ì—서 ì§€ì›ë˜ì§€ 않ìŒ" -#: executor/nodeAgg.c:3075 executor/nodeAgg.c:3084 executor/nodeAgg.c:3096 +#: executor/nodeAgg.c:3936 executor/nodeWindowAgg.c:2975 #, c-format -msgid "unexpected EOF for tape %d: requested %zu bytes, read %zu bytes" -msgstr "" +msgid "aggregate %u needs to have compatible input type and transition type" +msgstr "%u OID ì§‘ê³„í•¨ìˆ˜ì— í˜¸í™˜ 가능한 ìž…ë ¥ 형ì‹ê³¼ 변환 형ì‹ì´ 있어야 함" -#: executor/nodeAgg.c:4026 parser/parse_agg.c:655 parser/parse_agg.c:685 +#: executor/nodeAgg.c:3966 parser/parse_agg.c:680 parser/parse_agg.c:708 #, c-format msgid "aggregate function calls cannot be nested" msgstr "집계 함수는 중첩ë˜ì–´ 호출 í•  수 ì—†ìŒ" -#: executor/nodeAgg.c:4234 executor/nodeWindowAgg.c:2836 -#, c-format -msgid "aggregate %u needs to have compatible input type and transition type" -msgstr "%u OID ì§‘ê³„í•¨ìˆ˜ì— í˜¸í™˜ 가능한 ìž…ë ¥ 형ì‹ê³¼ 변환 형ì‹ì´ 있어야 함" - -#: executor/nodeCustom.c:145 executor/nodeCustom.c:156 +#: executor/nodeCustom.c:144 executor/nodeCustom.c:155 #, c-format msgid "custom scan \"%s\" does not support MarkPos" msgstr "\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼ íƒìƒ‰ì€ MarkPos ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: executor/nodeHashjoin.c:1046 executor/nodeHashjoin.c:1076 +#: executor/nodeHashjoin.c:1131 executor/nodeHashjoin.c:1161 #, c-format msgid "could not rewind hash-join temporary file" msgstr "해시-ì¡°ì¸ ìž„ì‹œ 파ì¼ì„ ë˜ê°ì„ 수 ì—†ìŒ" -#: executor/nodeHashjoin.c:1272 executor/nodeHashjoin.c:1283 -#, c-format -msgid "" -"could not read from hash-join temporary file: read only %zu of %zu bytes" -msgstr "해시-ì¡°ì¸ ìž„ì‹œ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %zu / %zu ë°”ì´íŠ¸ë§Œ ì½ìŒ" - -#: executor/nodeIndexonlyscan.c:242 +#: executor/nodeIndexonlyscan.c:239 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "lossy distance í•¨ìˆ˜ë“¤ì€ ì¸ë±ìФ ë‹¨ë… íƒìƒ‰ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: executor/nodeLimit.c:374 +#: executor/nodeLimit.c:373 #, c-format msgid "OFFSET must not be negative" msgstr "OFFSETì€ ìŒìˆ˜ê°€ 아니어야 함" -#: executor/nodeLimit.c:400 +#: executor/nodeLimit.c:399 #, c-format msgid "LIMIT must not be negative" msgstr "LIMIT는 ìŒìˆ˜ê°€ 아니어야 함" -#: executor/nodeMergejoin.c:1570 +#: executor/nodeMergejoin.c:1579 #, c-format msgid "RIGHT JOIN is only supported with merge-joinable join conditions" msgstr "RIGHT JOINì€ ë³‘í•©-ì¡°ì¸ ê°€ëŠ¥ ì¡°ì¸ ì¡°ê±´ì—서만 ì§€ì›ë¨" -#: executor/nodeMergejoin.c:1588 +#: executor/nodeMergejoin.c:1597 #, c-format msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOINì€ ë³‘í•©-ì¡°ì¸ ê°€ëŠ¥ ì¡°ì¸ ì¡°ê±´ì—서만 ì§€ì›ë¨" -#: executor/nodeModifyTable.c:110 -#, c-format -msgid "Query has too many columns." -msgstr "ì¿¼ë¦¬ì— ì¹¼ëŸ¼ì´ ë„ˆë¬´ 많습니다." - -#: executor/nodeModifyTable.c:138 -#, c-format -msgid "Query provides a value for a dropped column at ordinal position %d." -msgstr "쿼리ì—서 서수 위치 %dì— ìžˆëŠ” ì‚­ì œëœ ì¹¼ëŸ¼ì˜ ê°’ì„ ì œê³µí•©ë‹ˆë‹¤." - -#: executor/nodeModifyTable.c:146 +#: executor/nodeModifyTable.c:240 #, c-format msgid "Query has too few columns." msgstr "ì¿¼ë¦¬ì— ì¹¼ëŸ¼ì´ ë„ˆë¬´ ì ìŠµë‹ˆë‹¤." -#: executor/nodeModifyTable.c:839 executor/nodeModifyTable.c:913 +#: executor/nodeModifyTable.c:1540 executor/nodeModifyTable.c:1614 #, c-format msgid "" "tuple to be deleted was already modified by an operation triggered by the " "current command" msgstr "현재 명령으로 ì‹¤í–‰ëœ íŠ¸ë¦¬ê±° 작업으로 지울 ìžë£Œê°€ ì´ë¯¸ 바뀌었습니다." -#: executor/nodeModifyTable.c:1220 +#: executor/nodeModifyTable.c:1769 #, c-format msgid "invalid ON UPDATE specification" msgstr "ìž˜ëª»ëœ ON UPDATE 옵션" -#: executor/nodeModifyTable.c:1221 +#: executor/nodeModifyTable.c:1770 #, c-format msgid "" "The result tuple would appear in a different partition than the original " "tuple." +msgstr "ê²°ê³¼ íŠœí”Œì´ ì›ëž˜ íŠœí”Œì´ ì•„ë‹Œ 다른 파티션ì—서 나타날 것입니다." + +#: executor/nodeModifyTable.c:2226 +#, c-format +msgid "" +"cannot move tuple across partitions when a non-root ancestor of the source " +"partition is directly referenced in a foreign key" msgstr "" +"참조키가 바로 해당 하위 파티션 í…Œì´ë¸”ì„ ì°¸ì¡°í•˜ëŠ” 경우 파티션 ê°„ ìžë£Œ ì´ë™ì€ " +"í•  수 없습니다." -#: executor/nodeModifyTable.c:1592 +#: executor/nodeModifyTable.c:2227 #, c-format -msgid "ON CONFLICT DO UPDATE command cannot affect row a second time" +msgid "" +"A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "" +"참조키가 \"%s\" 하위 파티션 í…Œì´ë¸”ì„ ëŒ€ìƒìœ¼ë¡œ 합니다. ìƒìœ„ 파티션 í…Œì´ë¸”ì€ " +"\"%s\" í…Œì´ë¸”입니다." + +#: executor/nodeModifyTable.c:2230 +#, c-format +msgid "Consider defining the foreign key on table \"%s\"." +msgstr "\"%s\" í…Œì´ë¸”ì— ì°¸ì¡°í‚¤ ì •ì˜ë¥¼ 고려하세요." + +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2596 executor/nodeModifyTable.c:3138 +#: executor/nodeModifyTable.c:3308 +#, c-format +msgid "%s command cannot affect row a second time" +msgstr "%s ëª…ë ¹ì€ ë‘번째 작업ì—는 아무런 ì˜í–¥ì„ 주 않ìŒ" -#: executor/nodeModifyTable.c:1593 +#: executor/nodeModifyTable.c:2598 #, c-format msgid "" "Ensure that no rows proposed for insertion within the same command have " "duplicate constrained values." msgstr "" +"ë™ì¼í•œ 명령 ë‚´ì—서 삽입하ë„ë¡ ì œì•ˆëœ í–‰ì— ì¤‘ë³µëœ ì œí•œ ê°’ì´ ì—†ëŠ”ì§€ 확ì¸í•˜ì‹­ì‹œ" +"오." + +#: executor/nodeModifyTable.c:3131 executor/nodeModifyTable.c:3301 +#, c-format +msgid "" +"tuple to be updated or deleted was already modified by an operation " +"triggered by the current command" +msgstr "" +"현재 명령으로 ì‹¤í–‰ëœ íŠ¸ë¦¬ê±° 작업으로 변경하거나 지울 ìžë£Œê°€ ì´ë¯¸ 바뀌었습니" +"다." + +#: executor/nodeModifyTable.c:3140 executor/nodeModifyTable.c:3310 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "둘 ì´ìƒì˜ 소스 í–‰ì´ í•˜ë‚˜ì˜ ëŒ€ìƒ í–‰ê³¼ ì¼ì¹˜í•˜ì§€ 않는지 확ì¸í•˜ì‹­ì‹œì˜¤." + +#: executor/nodeModifyTable.c:3209 +#, c-format +msgid "" +"tuple to be merged was already moved to another partition due to concurrent " +"update" +msgstr "í•©ë³‘ë  íŠœí”Œì´ ë™ì‹œ ì—…ë°ì´íŠ¸ë¡œ ì´ë¯¸ 다른 파티션으로 옮겨졌ìŒ" -#: executor/nodeSamplescan.c:259 +#: executor/nodeSamplescan.c:244 #, c-format msgid "TABLESAMPLE parameter cannot be null" msgstr "TABLESAMPLE ì ˆì—는 반드시 부가 ì˜µì…˜ê°’ë“¤ì´ ìžˆì–´ì•¼ 합니다" -#: executor/nodeSamplescan.c:271 +#: executor/nodeSamplescan.c:256 #, c-format msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "TABLESAMPLE REPEATABLE ì ˆì€ ë” ì´ìƒì˜ 부가 ì˜µì…˜ì„ ì“°ë©´ 안ë©ë‹ˆë‹¤." -#: executor/nodeSubplan.c:346 executor/nodeSubplan.c:385 -#: executor/nodeSubplan.c:1151 +#: executor/nodeSubplan.c:325 executor/nodeSubplan.c:351 +#: executor/nodeSubplan.c:405 executor/nodeSubplan.c:1174 #, c-format msgid "more than one row returned by a subquery used as an expression" msgstr "표현ì‹ì— ì‚¬ìš©ëœ ì„œë¸Œì¿¼ë¦¬ 결과가 하나 ì´ìƒì˜ í–‰ì„ ë¦¬í„´í–ˆìŠµë‹ˆë‹¤" -#: executor/nodeTableFuncscan.c:375 +#: executor/nodeTableFuncscan.c:370 #, c-format msgid "namespace URI must not be null" msgstr "네임스페ì´ìФ URI ê°’ì€ null ì¼ ìˆ˜ 없습니다." @@ -12985,103 +15407,124 @@ msgstr "네임스페ì´ìФ URI ê°’ì€ null ì¼ ìˆ˜ 없습니다." msgid "row filter expression must not be null" msgstr "로우 í•„í„° 표현ì‹ì€ nullê°’ì´ ì•„ë‹ˆì—¬ì•¼ 함" -#: executor/nodeTableFuncscan.c:415 +#: executor/nodeTableFuncscan.c:416 #, c-format msgid "column filter expression must not be null" msgstr "칼럼 í•„í„° 표현ì‹ì€ nullê°’ì´ ì•„ë‹ˆì—¬ì•¼ 함" -#: executor/nodeTableFuncscan.c:416 +#: executor/nodeTableFuncscan.c:417 #, c-format msgid "Filter for column \"%s\" is null." msgstr "\"%s\" 칼럼용 í•„í„°ê°€ null입니다." -#: executor/nodeTableFuncscan.c:506 +#: executor/nodeTableFuncscan.c:507 #, c-format msgid "null is not allowed in column \"%s\"" msgstr "\"%s\" ì¹¼ëŸ¼ì€ null ê°’ì„ í—ˆìš©í•˜ì§€ 않습니다" -#: executor/nodeWindowAgg.c:355 +#: executor/nodeWindowAgg.c:356 #, c-format msgid "moving-aggregate transition function must not return null" msgstr "moving-aggregate transition 함수는 null ê°’ì„ ë°˜í™˜í•˜ë©´ 안ë©ë‹ˆë‹¤." -#: executor/nodeWindowAgg.c:2058 +#: executor/nodeWindowAgg.c:2083 #, c-format msgid "frame starting offset must not be null" msgstr "프래임 시작 위치값으로 null ê°’ì„ ì‚¬ìš©í•  수 없습니다." -#: executor/nodeWindowAgg.c:2071 +#: executor/nodeWindowAgg.c:2096 #, c-format msgid "frame starting offset must not be negative" msgstr "프래임 시작 위치으로 ìŒìˆ˜ ê°’ì„ ì‚¬ìš©í•  수 없습니다." -#: executor/nodeWindowAgg.c:2083 +#: executor/nodeWindowAgg.c:2108 #, c-format msgid "frame ending offset must not be null" msgstr "프래임 ë 위치값으로 null ê°’ì„ ì‚¬ìš©í•  수 없습니다." -#: executor/nodeWindowAgg.c:2096 +#: executor/nodeWindowAgg.c:2121 #, c-format msgid "frame ending offset must not be negative" msgstr "프래임 ë 위치값으로 ìŒìˆ˜ ê°’ì„ ì‚¬ìš©í•  수 없습니다." -#: executor/nodeWindowAgg.c:2752 +#: executor/nodeWindowAgg.c:2891 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "%s 집계 함수는 윈ë„ìš° 함수로 ì‚¬ìš©ë  ìˆ˜ 없습니다" -#: executor/spi.c:228 executor/spi.c:297 +#: executor/spi.c:241 executor/spi.c:341 #, c-format msgid "invalid transaction termination" msgstr "ìž˜ëª»ëœ íŠ¸ëžœìž­ì…˜ 마침" -#: executor/spi.c:242 +#: executor/spi.c:256 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "í•˜ìœ„íŠ¸ëžœìž­ì…˜ì´ í™œì„±í™” ëœ ìƒíƒœì—서는 커밋 í•  수 ì—†ìŒ" -#: executor/spi.c:303 +#: executor/spi.c:347 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "í•˜ìœ„íŠ¸ëžœìž­ì…˜ì´ í™œì„±í™” ëœ ìƒíƒœì—서는 롤백 í•  수 ì—†ìŒ" -#: executor/spi.c:372 +#: executor/spi.c:471 #, c-format msgid "transaction left non-empty SPI stack" msgstr "íŠ¸ëžœìž­ì…˜ì´ ë¹„ì–´ìžˆì§€ ì•Šì€ SPI 스íƒì„ 남겼습니다" -#: executor/spi.c:373 executor/spi.c:435 +#: executor/spi.c:472 executor/spi.c:532 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "\"SPI_finish\" í˜¸ì¶œì´ ë¹ ì¡ŒëŠ”ì§€ 확ì¸í•˜ì„¸ìš”" -#: executor/spi.c:434 +#: executor/spi.c:531 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "하위 íŠ¸ëžœìž­ì…˜ì´ ë¹„ì–´ìžˆì§€ ì•Šì€ SPI 스íƒì„ 남겼습니다" -#: executor/spi.c:1335 +#: executor/spi.c:1602 #, c-format msgid "cannot open multi-query plan as cursor" msgstr "멀티 쿼리를 커서로 ì—´ 수는 없습니다" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1340 +#: executor/spi.c:1612 #, c-format msgid "cannot open %s query as cursor" msgstr "%s 쿼리로 커서를 ì—´ 수 ì—†ìŒ." -#: executor/spi.c:1445 +#: executor/spi.c:1718 #, c-format msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE는 ì§€ì›ë˜ì§€ 않ìŒ" -#: executor/spi.c:1446 parser/analyze.c:2508 +#: executor/spi.c:1719 parser/analyze.c:2928 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "스í¬ë¡¤ 가능 커서는 READ ONLY여야 합니다." -#: executor/spi.c:2560 +#: executor/spi.c:2496 +#, c-format +msgid "empty query does not return tuples" +msgstr "빈 쿼리는 íŠœí”Œì„ ë°˜í™˜í•˜ì§€ 않습니다." + +#. translator: %s is name of a SQL command, eg INSERT +#: executor/spi.c:2570 +#, c-format +msgid "%s query does not return tuples" +msgstr "%s 쿼리는 ì§‘í•©ì„ ë°˜í™˜í•  수 없습니다." + +#: executor/spi.c:2987 +#, c-format +msgid "SQL expression \"%s\"" +msgstr "SQL 표현ì‹: \"%s\"" + +#: executor/spi.c:2992 +#, c-format +msgid "PL/pgSQL assignment \"%s\"" +msgstr "PL/pgSQL 지정: \"%s\"" + +#: executor/spi.c:2995 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL 구문: \"%s\"" @@ -13091,270 +15534,297 @@ msgstr "SQL 구문: \"%s\"" msgid "could not send tuple to shared-memory queue" msgstr "공유 메모리 í로 íŠœí”Œì„ ë³´ë‚¼ 수 ì—†ìŒ" -#: foreign/foreign.c:220 +#: foreign/foreign.c:225 #, c-format -msgid "user mapping not found for \"%s\"" -msgstr "\"%s\"ì— ëŒ€í•œ ì‚¬ìš©ìž ë§¤í•‘ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" +msgid "user mapping not found for user \"%s\", server \"%s\"" +msgstr "\"%s\"ì— ëŒ€í•œ ì‚¬ìš©ìž ë§¤í•‘ì„ \"%s\" 서버ì—서 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: foreign/foreign.c:672 +#: foreign/foreign.c:336 optimizer/plan/createplan.c:7153 +#: optimizer/util/plancat.c:540 #, c-format -msgid "invalid option \"%s\"" -msgstr "\"%s\" ì˜µì…˜ì´ ìž˜ëª»ë¨" +msgid "access to non-system foreign table is restricted" +msgstr "non-system 외부 í…Œì´ë¸”ì„ ì ‘ê·¼í•˜ëŠ” ê²ƒì€ ì œí•œë˜ì—ˆìŒ" -#: foreign/foreign.c:673 +#: foreign/foreign.c:660 #, c-format -msgid "Valid options in this context are: %s" -msgstr "ì´ ì»¨í…스트ì—서 유효한 옵션: %s" +msgid "invalid option \"%s\"" +msgstr "\"%s\" ì˜µì…˜ì´ ìž˜ëª»ë¨" -#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:417 -#: utils/fmgr/dfmgr.c:465 +#: foreign/foreign.c:662 #, c-format -msgid "could not access file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì— 액세스할 수 ì—†ìŒ: %m" +msgid "Perhaps you meant the option \"%s\"." +msgstr "아마 \"%s\" ì˜µì…˜ì„ ëœ»í•˜ëŠ” 것 같습니다." -#: jit/llvm/llvmjit.c:595 +#: foreign/foreign.c:664 #, c-format -msgid "time to inline: %.3fs, opt: %.3fs, emit: %.3fs" -msgstr "" +msgid "There are no valid options in this context." +msgstr "ì´ ì»¨í…스트ì—서 유효한 ì˜µì…˜ì´ ì—†ìŒ." -#: lib/dshash.c:247 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 -#: utils/mmgr/dsa.c:805 +#: lib/dshash.c:254 utils/mmgr/dsa.c:708 utils/mmgr/dsa.c:730 +#: utils/mmgr/dsa.c:811 #, c-format msgid "Failed on DSA request of size %zu." msgstr "í¬ê¸°ê°€ %zuì¸ DSA 요청ì—서 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." -#: libpq/auth-scram.c:248 +#: libpq/auth-sasl.c:97 +#, c-format +msgid "expected SASL response, got message type %d" +msgstr "SASL ì‘ë‹µì´ í•„ìš”í•œë° ë©”ì‹œì§€ í˜•ì‹ %dì„(를) ë°›ìŒ" + +#: libpq/auth-scram.c:263 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "í´ë¼ì´ì–¸íŠ¸ê°€ ìž˜ëª»ëœ SASL ì¸ì¦ ë©”ì¹´ë‹ˆì¦˜ì„ ì„ íƒí–ˆìŒ" -#: libpq/auth-scram.c:269 libpq/auth-scram.c:509 libpq/auth-scram.c:520 +#: libpq/auth-scram.c:287 libpq/auth-scram.c:536 libpq/auth-scram.c:547 #, c-format msgid "invalid SCRAM secret for user \"%s\"" msgstr "\"%s\" 사용ìžì— 대한 ìž˜ëª»ëœ SCRAM secret" -#: libpq/auth-scram.c:280 +#: libpq/auth-scram.c:298 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "\"%s\" 사용ìžìš© 바른 SCRAM secretì´ ì—†ìŠµë‹ˆë‹¤." -#: libpq/auth-scram.c:358 libpq/auth-scram.c:363 libpq/auth-scram.c:693 -#: libpq/auth-scram.c:701 libpq/auth-scram.c:806 libpq/auth-scram.c:819 -#: libpq/auth-scram.c:829 libpq/auth-scram.c:937 libpq/auth-scram.c:944 -#: libpq/auth-scram.c:959 libpq/auth-scram.c:974 libpq/auth-scram.c:988 -#: libpq/auth-scram.c:1006 libpq/auth-scram.c:1021 libpq/auth-scram.c:1321 -#: libpq/auth-scram.c:1329 +#: libpq/auth-scram.c:378 libpq/auth-scram.c:383 libpq/auth-scram.c:737 +#: libpq/auth-scram.c:745 libpq/auth-scram.c:850 libpq/auth-scram.c:863 +#: libpq/auth-scram.c:873 libpq/auth-scram.c:981 libpq/auth-scram.c:988 +#: libpq/auth-scram.c:1003 libpq/auth-scram.c:1018 libpq/auth-scram.c:1032 +#: libpq/auth-scram.c:1050 libpq/auth-scram.c:1065 libpq/auth-scram.c:1379 +#: libpq/auth-scram.c:1387 #, c-format msgid "malformed SCRAM message" msgstr "SCRAM 메시지가 형ì‹ì— ë§žì§€ 않습니다" -#: libpq/auth-scram.c:359 +#: libpq/auth-scram.c:379 #, c-format msgid "The message is empty." msgstr "메시지가 비었습니다." -#: libpq/auth-scram.c:364 +#: libpq/auth-scram.c:384 #, c-format msgid "Message length does not match input length." msgstr "메시지 길ì´ê°€ ìž…ë ¥ 길ì´ì™€ 같지 않습니다." -#: libpq/auth-scram.c:396 +#: libpq/auth-scram.c:416 #, c-format msgid "invalid SCRAM response" msgstr "ìž˜ëª»ëœ SCRAM ì‘답" -#: libpq/auth-scram.c:397 +#: libpq/auth-scram.c:417 #, c-format msgid "Nonce does not match." msgstr "í† í° ë¶ˆì¼ì¹˜" -#: libpq/auth-scram.c:471 +#: libpq/auth-scram.c:493 #, c-format msgid "could not generate random salt" msgstr "무작위 솔트 ìƒì„± 실패" -#: libpq/auth-scram.c:694 +#: libpq/auth-scram.c:738 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "\"%c\" ì†ì„±ì´ì–´ì•¼ 하는ë°, \"%s\" ìž„." -#: libpq/auth-scram.c:702 libpq/auth-scram.c:830 +#: libpq/auth-scram.c:746 libpq/auth-scram.c:874 #, c-format msgid "Expected character \"=\" for attribute \"%c\"." -msgstr "\"%c\" ì†ì„±ì—는 \"=\" 문ìžê°€ 와야합니다." +msgstr "\"%c\" ì†ì„±ì—는 \"=\" 문ìžê°€ 와야 합니다." -#: libpq/auth-scram.c:807 +#: libpq/auth-scram.c:851 #, c-format msgid "Attribute expected, but found end of string." msgstr "ì†ì„±ê°’ì´ ì™€ì•¼í•˜ëŠ”ë°, 문ìžì—´ ëì´ ë°œê²¬ë˜ì—ˆìŒ." -#: libpq/auth-scram.c:820 +#: libpq/auth-scram.c:864 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "ì†ì„±ê°’ì´ ì™€ì•¼í•˜ëŠ”ë°, \"%s\" ìž˜ëª»ëœ ë¬¸ìžê°€ 발견ë˜ì—ˆìŒ." -#: libpq/auth-scram.c:938 libpq/auth-scram.c:960 +#: libpq/auth-scram.c:982 libpq/auth-scram.c:1004 #, c-format msgid "" "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not " "include channel binding data." msgstr "" +"해당 í´ë¼ì´ì–¸íŠ¸ê°€ SCRAM-SHA-256-PLUS ê·œì•½ì„ ì„ íƒí–ˆëŠ”ë°, SCRAM ë©”ì‹œì§€ì— ì±„ë„ " +"ë°”ì¸ë”© ë°ì´í„°ê°€ 없습니다." -#: libpq/auth-scram.c:945 libpq/auth-scram.c:975 +#: libpq/auth-scram.c:989 libpq/auth-scram.c:1019 #, c-format msgid "Comma expected, but found character \"%s\"." msgstr "쉼표가 와야하는ë°, \"%s\" 문ìžê°€ 발견ë˜ì—ˆìŒ." -#: libpq/auth-scram.c:966 +#: libpq/auth-scram.c:1010 #, c-format msgid "SCRAM channel binding negotiation error" -msgstr "" +msgstr "SCRAM ì±„ë„ ë°”ì¸ë”© í˜‘ìƒ ì˜¤ë¥˜" -#: libpq/auth-scram.c:967 +#: libpq/auth-scram.c:1011 #, c-format msgid "" "The client supports SCRAM channel binding but thinks the server does not. " "However, this server does support channel binding." msgstr "" +"해당 í´ë¼ì´ì–¸íŠ¸ëŠ” SCRAM ì±„ë„ ë°”ì¸ë”©ì„ ì§€ì›í•˜ì§€ë§Œ, 서버는 그렇지 ì•Šì€ ê²ƒ 같습" +"니다. 그런ë°, ì´ ì„œë²„ëŠ” ì±„ë„ ë°”ì¸ë”©ì„ ì§€ì›í•©ë‹ˆë‹¤." -#: libpq/auth-scram.c:989 +#: libpq/auth-scram.c:1033 #, c-format msgid "" "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM " "message includes channel binding data." msgstr "" +"해당 í´ë¼ì´ì–¸íŠ¸ê°€ ì±„ë„ ë°”ì¸ë”©ì„ 하지 않는 SCRAM-SHA-256 ê·œì•½ì„ ì„ íƒí–ˆëŠ”ë°, " +"SCRAM ë©”ì‹œì§€ì— ì±„ë„ ë°”ì¸ë”© ë°ì´í„°ê°€ 있습니다." -#: libpq/auth-scram.c:1000 +#: libpq/auth-scram.c:1044 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "ì§€ì›í•˜ì§€ 않는 SCRAM ì±„ë„ ë°”ì¸ë“œ 종류 \"%s\"" -#: libpq/auth-scram.c:1007 +#: libpq/auth-scram.c:1051 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "예ìƒì¹˜ 못한 ì±„ë„ ë°”ì¸ë”© 플래그 \"%s\"." -#: libpq/auth-scram.c:1017 +#: libpq/auth-scram.c:1061 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "" +"í´ë¼ì´ì–¸íŠ¸ëŠ” authorization identity를 사용하지만, ì´ê²ƒì„ ì§€ì›í•˜ì§€ 않습니다." -#: libpq/auth-scram.c:1022 +#: libpq/auth-scram.c:1066 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." -msgstr "" +msgstr "client-first-message ì•ˆì— \"%s\" ì†ì„±ì´ 잘못ë¨" -#: libpq/auth-scram.c:1038 +#: libpq/auth-scram.c:1082 #, c-format msgid "client requires an unsupported SCRAM extension" -msgstr "" +msgstr "í´ë¼ì´ì–¸íŠ¸ê°€ ì§€ì›í•˜ì§€ 않는 SCRAM í™•ìž¥ì„ ìš”êµ¬í•©ë‹ˆë‹¤." -#: libpq/auth-scram.c:1052 +#: libpq/auth-scram.c:1096 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "SCRAM 토í°ì— ì¸ì‡„í•  수 없는 문ìžê°€ 있ìŒ" -#: libpq/auth-scram.c:1169 +#: libpq/auth-scram.c:1227 #, c-format msgid "could not generate random nonce" msgstr "무작위 토í°ì„ 만들 수 ì—†ìŒ" -#: libpq/auth-scram.c:1179 +#: libpq/auth-scram.c:1237 #, c-format msgid "could not encode random nonce" msgstr "ìž„ì˜ nonce를 ì¸ì½”드할 수 ì—†ìŒ" -#: libpq/auth-scram.c:1285 +#: libpq/auth-scram.c:1343 #, c-format msgid "SCRAM channel binding check failed" -msgstr "" +msgstr "SCRAM ì±„ë„ ë°”ì¸ë”© 검사 실패" -#: libpq/auth-scram.c:1303 +#: libpq/auth-scram.c:1361 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" -msgstr "" +msgstr "client-final-message ì•ˆì— ì˜ˆìƒì¹˜ 못한 SCRAM ì±„ë„ ë°”ì¸ë”© ì†ì„±ì´ 있ìŒ" -#: libpq/auth-scram.c:1322 +#: libpq/auth-scram.c:1380 #, c-format msgid "Malformed proof in client-final-message." -msgstr "" +msgstr "client-final-message ì•ˆì— ìž˜ëª»ëœ ì¦ëª…" -#: libpq/auth-scram.c:1330 +#: libpq/auth-scram.c:1388 #, c-format msgid "Garbage found at the end of client-final-message." -msgstr "" +msgstr "client-final-message ëì— ì¶”ê°€ë¡œ 쓸모 없는 ê°’ì´ ìžˆìŒ" -#: libpq/auth.c:280 +#: libpq/auth.c:269 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "ì‚¬ìš©ìž \"%s\"ì˜ ì¸ì¦ì„ 실패했습니다: 호스트 ê±°ë¶€ë¨" -#: libpq/auth.c:283 +#: libpq/auth.c:272 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "ì‚¬ìš©ìž \"%s\"ì˜ \"trust\" ì¸ì¦ì„ 실패했습니다." -#: libpq/auth.c:286 +#: libpq/auth.c:275 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "ì‚¬ìš©ìž \"%s\"ì˜ Ident ì¸ì¦ì„ 실패했습니다." -#: libpq/auth.c:289 +#: libpq/auth.c:278 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "ì‚¬ìš©ìž \"%s\"ì˜ peer ì¸ì¦ì„ 실패했습니다." -#: libpq/auth.c:294 +#: libpq/auth.c:283 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "ì‚¬ìš©ìž \"%s\"ì˜ password ì¸ì¦ì„ 실패했습니다" -#: libpq/auth.c:299 +#: libpq/auth.c:288 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "\"%s\" 사용ìžì— 대한 GSSAPI ì¸ì¦ì„ 실패했습니다." -#: libpq/auth.c:302 +#: libpq/auth.c:291 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "\"%s\" 사용ìžì— 대한 SSPI ì¸ì¦ì„ 실패했습니다." -#: libpq/auth.c:305 +#: libpq/auth.c:294 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "ì‚¬ìš©ìž \"%s\"ì˜ PAM ì¸ì¦ì„ 실패했습니다." -#: libpq/auth.c:308 +#: libpq/auth.c:297 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "\"%s\" 사용ìžì— 대한 BSD ì¸ì¦ì„ 실패했습니다." -#: libpq/auth.c:311 +#: libpq/auth.c:300 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "\"%s\" 사용ìžì˜ LDAP ì¸ì¦ì„ 실패했습니다." -#: libpq/auth.c:314 +#: libpq/auth.c:303 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "ì‚¬ìš©ìž \"%s\"ì˜ ì¸ì¦ì„œ ì¸ì¦ì„ 실패했습니다" -#: libpq/auth.c:317 +#: libpq/auth.c:306 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "ì‚¬ìš©ìž \"%s\"ì˜ RADIUS ì¸ì¦ì„ 실패했습니다." -#: libpq/auth.c:320 +#: libpq/auth.c:309 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "ì‚¬ìš©ìž \"%s\"ì˜ ì¸ì¦ì„ 실패했습니다: ìž˜ëª»ëœ ì¸ì¦ 방법" -#: libpq/auth.c:324 +#: libpq/auth.c:313 #, c-format -msgid "Connection matched pg_hba.conf line %d: \"%s\"" -msgstr "pg_hba.conf 파ì¼ì˜ %d번째 ì¤„ì— ì§€ì •í•œ ì¸ì¦ ì„¤ì •ì´ ì‚¬ìš©ë¨: \"%s\"" +msgid "Connection matched file \"%s\" line %d: \"%s\"" +msgstr "\"%s\" 파ì¼ì˜ %d번째 ì¤„ì— ì§€ì •í•œ ì¸ì¦ ì„¤ì •ì´ ì‚¬ìš©ë¨: \"%s\"" -#: libpq/auth.c:371 +#: libpq/auth.c:357 +#, c-format +msgid "authentication identifier set more than once" +msgstr "ì¸ì¦ ì‹ë³„ìžê°€ 여러 번 사용 ë¨" + +#: libpq/auth.c:358 +#, c-format +msgid "previous identifier: \"%s\"; new identifier: \"%s\"" +msgstr "ì´ì „ ì‹ë³„ìž: \"%s\"; 새 ì‹ë³„ìž: \"%s\"" + +#: libpq/auth.c:368 +#, c-format +msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" +msgstr "ì—°ê²° ì¸ì¦ë¨: ì‹ë³„ìž=\"%s\" ì¸ì¦ë°©ë²•=%s (%s:%d)" + +#: libpq/auth.c:408 #, c-format msgid "" "client certificates can only be checked if a root certificate store is " @@ -13362,19 +15832,25 @@ msgid "" msgstr "" "루트 ì¸ì¦ì„œ 저장소가 사용 가능한 경우ì—ë§Œ í´ë¼ì´ì–¸íЏ ì¸ì¦ì„œë¥¼ 검사할 수 있ìŒ" -#: libpq/auth.c:382 +#: libpq/auth.c:419 #, c-format msgid "connection requires a valid client certificate" msgstr "ì—°ê²°ì— ìœ íš¨í•œ í´ë¼ì´ì–¸íЏ ì¸ì¦ì„œê°€ 필요함" -#: libpq/auth.c:392 -#, c-format -msgid "" -"GSSAPI encryption can only be used with gss, trust, or reject authentication " -"methods" -msgstr "" +#: libpq/auth.c:450 libpq/auth.c:496 +msgid "GSS encryption" +msgstr "GSS 암호화" + +#: libpq/auth.c:453 libpq/auth.c:499 +msgid "SSL encryption" +msgstr "SSL 암호화" -#: libpq/auth.c:426 +#: libpq/auth.c:455 libpq/auth.c:501 +msgid "no encryption" +msgstr "암호화 안함" + +#. translator: last %s describes encryption state +#: libpq/auth.c:461 #, c-format msgid "" "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" @@ -13382,345 +15858,289 @@ msgstr "" "호스트 \"%s\", ì‚¬ìš©ìž \"%s\", %s ì—°ê²°ì´ ë³µì œìš© 연결로는 pg_hba.conf íŒŒì¼ ì„¤ì •" "ì— ë”°ë¼ ê±°ë¶€ë©ë‹ˆë‹¤" -#: libpq/auth.c:428 libpq/auth.c:444 libpq/auth.c:502 libpq/auth.c:520 -msgid "SSL off" -msgstr "SSL 중지" - -#: libpq/auth.c:428 libpq/auth.c:444 libpq/auth.c:502 libpq/auth.c:520 -msgid "SSL on" -msgstr "SSL ë™ìž‘" - -#: libpq/auth.c:432 -#, c-format -msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\"" -msgstr "" -"호스트 \"%s\", ì‚¬ìš©ìž \"%s\" ì—°ê²°ì´ ë³µì œìš© 연결로는 pg_hba.conf íŒŒì¼ ì„¤ì •ì— " -"ë”°ë¼ ê±°ë¶€ë©ë‹ˆë‹¤" - -#: libpq/auth.c:441 +#. translator: last %s describes encryption state +#: libpq/auth.c:468 #, c-format msgid "" -"pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s" -"\", %s" +"pg_hba.conf rejects connection for host \"%s\", user \"%s\", database " +"\"%s\", %s" msgstr "" "호스트 \"%s\", ì‚¬ìš©ìž \"%s\", ë°ì´í„°ë² ì´ìФ \"%s\", %s ì—°ê²°ì´ pg_hba.conf 파" "ì¼ ì„¤ì •ì— ë”°ë¼ ê±°ë¶€ë©ë‹ˆë‹¤" -#: libpq/auth.c:448 -#, c-format -msgid "" -"pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\"" -msgstr "" -"호스트 \"%s\", ì‚¬ìš©ìž \"%s\", ë°ì´í„°ë² ì´ìФ \"%s\" ì—°ê²°ì´ pg_hba.conf íŒŒì¼ ì„¤" -"ì •ì— ë”°ë¼ ê±°ë¶€ë©ë‹ˆë‹¤" - -#: libpq/auth.c:477 +#: libpq/auth.c:506 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "" "í´ë¼ì´ì–¸íЏ IP 주소가 \"%s\" ì´ë¦„으로 확ì¸ë¨, 호스트 ì´ë¦„ í™•ì¸ ê¸°ëŠ¥ìœ¼ë¡œ ë§žìŒ" -#: libpq/auth.c:480 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "" "í´ë¼ì´ì–¸íЏ IP 주소가 \"%s\" ì´ë¦„으로 확ì¸ë¨, 호스트 ì´ë¦„ í™•ì¸ ê¸°ëŠ¥ 사용안함" -#: libpq/auth.c:483 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "" "í´ë¼ì´ì–¸íЏ IP 주소가 \"%s\" ì´ë¦„으로 확ì¸ë¨, 호스트 ì´ë¦„ í™•ì¸ ê¸°ëŠ¥ìœ¼ë¡œ 틀림" -#: libpq/auth.c:486 +#: libpq/auth.c:515 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "\"%s\" í´ë¼ì´ì–¸íЏ 호스트 ì´ë¦„ì„ %s IP 주소로 전환할 수 ì—†ìŒ." -#: libpq/auth.c:491 +#: libpq/auth.c:520 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "í´ë¼ì´ì–¸íЏ IP 주소를 파악할 수 ì—†ìŒ: ëŒ€ìƒ í˜¸ìŠ¤íŠ¸ ì´ë¦„: %s" -#: libpq/auth.c:500 +#. translator: last %s describes encryption state +#: libpq/auth.c:528 #, c-format msgid "" -"no pg_hba.conf entry for replication connection from host \"%s\", user \"%s" -"\", %s" +"no pg_hba.conf entry for replication connection from host \"%s\", user " +"\"%s\", %s" msgstr "" "호스트 \"%s\", ì‚¬ìš©ìž \"%s\", %s ì—°ê²°ì´ ë³µì œìš© 연결로 pg_hba.conf 파ì¼ì— 설정" "ë˜ì–´ 있지 않습니다" -#: libpq/auth.c:507 -#, c-format -msgid "" -"no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\"" -msgstr "" -"호스트 \"%s\", ì‚¬ìš©ìž \"%s\" ì—°ê²°ì´ ë³µì œìš© 연결로 pg_hba.conf 파ì¼ì— 설정ë˜" -"ì–´ 있지 않습니다" - -#: libpq/auth.c:517 +#. translator: last %s describes encryption state +#: libpq/auth.c:536 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "" "호스트 \"%s\", ì‚¬ìš©ìž \"%s\", ë°ì´í„°ë² ì´ìФ \"%s\", %s ì—°ê²°ì— ëŒ€í•œ ì„¤ì •ì´ " "pg_hba.conf 파ì¼ì— 없습니다." -#: libpq/auth.c:525 +#: libpq/auth.c:656 #, c-format -msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\"" -msgstr "" -"호스트 \"%s\", ì‚¬ìš©ìž \"%s\", ë°ì´í„°ë² ì´ìФ \"%s\" ì—°ê²°ì— ëŒ€í•œ ì„¤ì •ì´ pg_hba." -"conf 파ì¼ì— 없습니다." +msgid "connection authenticated: user=\"%s\" method=%s (%s:%d)" +msgstr "ì—°ê²° ì¸ì¦ë¨: 사용ìž=\"%s\" ì¸ì¦ë°©ë²•=%s (%s:%d)" -#: libpq/auth.c:688 +#: libpq/auth.c:725 #, c-format msgid "expected password response, got message type %d" msgstr "메시지 타입 %d를 얻는 예ìƒëœ 암호 ì‘답" -#: libpq/auth.c:716 +#: libpq/auth.c:746 #, c-format msgid "invalid password packet size" msgstr "유효하지 ì•Šì€ ì•”í˜¸ 패킷 사ì´ì¦ˆ" -#: libpq/auth.c:734 +#: libpq/auth.c:764 #, c-format msgid "empty password returned by client" msgstr "비어있는 암호는 í´ë¼ì´ì–¸íŠ¸ì— ì˜í•´ ëŒë ¤ë³´ëƒˆìŠµë‹ˆë‹¤" -#: libpq/auth.c:854 libpq/hba.c:1340 -#, c-format -msgid "" -"MD5 authentication is not supported when \"db_user_namespace\" is enabled" -msgstr "\"db_user_namespace\"ê°€ 사용 가능한 경우 MD5 ì¸ì¦ì€ ì§€ì›ë˜ì§€ 않ìŒ" - -#: libpq/auth.c:860 +#: libpq/auth.c:892 #, c-format msgid "could not generate random MD5 salt" msgstr "무작위 MD5 솔트 ìƒì„± 실패" -#: libpq/auth.c:906 -#, c-format -msgid "SASL authentication is not supported in protocol version 2" -msgstr "프로토콜 버전 2ì—서는 SASL ì¸ì¦ì„ ì§€ì›ë˜ì§€ 않ìŒ" - -#: libpq/auth.c:939 -#, c-format -msgid "expected SASL response, got message type %d" -msgstr "SASL ì‘ë‹µì´ í•„ìš”í•œë° ë©”ì‹œì§€ í˜•ì‹ %dì„(를) ë°›ìŒ" - -#: libpq/auth.c:1068 +#: libpq/auth.c:943 libpq/be-secure-gssapi.c:540 #, c-format -msgid "GSSAPI is not supported in protocol version 2" -msgstr "프로토콜 버전 2ì—서는 GSSAPIê°€ ì§€ì›ë˜ì§€ 않ìŒ" +msgid "could not set environment: %m" +msgstr "환경변수를 지정할 수 ì—†ìŒ: %m" -#: libpq/auth.c:1128 +#: libpq/auth.c:982 #, c-format msgid "expected GSS response, got message type %d" msgstr "GSS ì‘ë‹µì´ í•„ìš”í•œë° ë©”ì‹œì§€ í˜•ì‹ %dì„(를) ë°›ìŒ" -#: libpq/auth.c:1189 +#: libpq/auth.c:1048 msgid "accepting GSS security context failed" msgstr "GSS 보안 컨í…스트를 수ë½í•˜ì§€ 못함" -#: libpq/auth.c:1228 +#: libpq/auth.c:1089 msgid "retrieving GSS user name failed" msgstr "GSS ì‚¬ìš©ìž ì´ë¦„ì„ ê²€ìƒ‰í•˜ì§€ 못함" -#: libpq/auth.c:1359 -#, c-format -msgid "SSPI is not supported in protocol version 2" -msgstr "프로토콜 버전 2ì—서는 SSPIê°€ ì§€ì›ë˜ì§€ 않ìŒ" - -#: libpq/auth.c:1374 +#: libpq/auth.c:1235 msgid "could not acquire SSPI credentials" msgstr "SSPI ìžê²© ì¦ëª…ì„ ê°€ì ¸ì˜¬ 수 ì—†ìŒ" -#: libpq/auth.c:1399 +#: libpq/auth.c:1260 #, c-format msgid "expected SSPI response, got message type %d" msgstr "SSPI ì‘ë‹µì´ í•„ìš”í•œë° ë©”ì‹œì§€ í˜•ì‹ %dì„(를) ë°›ìŒ" -#: libpq/auth.c:1477 +#: libpq/auth.c:1338 msgid "could not accept SSPI security context" msgstr "SSPI 보안 컨í…스트를 수ë½í•  수 ì—†ìŒ" -#: libpq/auth.c:1539 +#: libpq/auth.c:1379 msgid "could not get token from SSPI security context" msgstr "SSPI 보안 컨í…스트ì—서 토í°ì„ 가져올 수 ì—†ìŒ" -#: libpq/auth.c:1658 libpq/auth.c:1677 +#: libpq/auth.c:1515 libpq/auth.c:1534 #, c-format msgid "could not translate name" msgstr "ì´ë¦„ì„ ë³€í™˜í•  수 ì—†ìŒ" -#: libpq/auth.c:1690 +#: libpq/auth.c:1547 #, c-format msgid "realm name too long" msgstr "realm ì´ë¦„ì´ ë„ˆë¬´ 긺" -#: libpq/auth.c:1705 +#: libpq/auth.c:1562 #, c-format msgid "translated account name too long" msgstr "ë³€í™˜ëœ ì ‘ì†ìž ì´ë¦„ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤" -#: libpq/auth.c:1886 +#: libpq/auth.c:1741 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "Ident ì—°ê²°ì— ì†Œì¼“ì„ ìƒì„±í•  수 없습니다: %m" -#: libpq/auth.c:1901 +#: libpq/auth.c:1756 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "로컬 주소 \"%s\"ì— ë°”ì¸ë“œí•  수 없습니다: %m" -#: libpq/auth.c:1913 +#: libpq/auth.c:1768 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "주소 \"%s\", í¬íЏ %sì˜ Ident 서버ì—게 ì—°ê²°í•  수 없습니다: %m" -#: libpq/auth.c:1935 +#: libpq/auth.c:1790 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "주소 \"%s\", í¬íЏ %sì˜ Ident 서버ì—게 질ì˜ë¥¼ 보낼 수 없습니다: %m" -#: libpq/auth.c:1952 +#: libpq/auth.c:1807 #, c-format msgid "" "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "주소 \"%s\", í¬íЏ %sì˜ Ident 서버로부터 ì‘ë‹µì„ ë°›ì§€ 못했습니다: %m" -#: libpq/auth.c:1962 +#: libpq/auth.c:1817 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "Ident 서버로부터 ìž˜ëª»ëœ í˜•íƒœì˜ ì‘답를 보냈습니다: \"%s\"" -#: libpq/auth.c:2009 +#: libpq/auth.c:1870 #, c-format msgid "peer authentication is not supported on this platform" msgstr "ì´ í”Œëž«í¼ì—서는 peer ì¸ì¦ì´ ì§€ì›ë˜ì§€ 않ìŒ" -#: libpq/auth.c:2013 +#: libpq/auth.c:1874 #, c-format msgid "could not get peer credentials: %m" msgstr "신뢰성 피어를 ì–»ì„ ìˆ˜ 없습니다: %m" -#: libpq/auth.c:2025 +#: libpq/auth.c:1886 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "UID %ld 해당하는 사용ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" -#: libpq/auth.c:2124 +#: libpq/auth.c:1988 #, c-format msgid "error from underlying PAM layer: %s" msgstr "잠재ì ì¸ PAM ë ˆì´ì–´ì—ì„œì˜ ì—러: %s" -#: libpq/auth.c:2194 +#: libpq/auth.c:1999 +#, c-format +msgid "unsupported PAM conversation %d/\"%s\"" +msgstr "ì§€ì›í•˜ì§€ 않는 PAM conversation %d/\"%s\"" + +#: libpq/auth.c:2056 #, c-format msgid "could not create PAM authenticator: %s" msgstr "PAM ì¸ì¦ìžë¥¼ ìƒì„±í•  수 없습니다: %s" -#: libpq/auth.c:2205 +#: libpq/auth.c:2067 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) 실패: %s" -#: libpq/auth.c:2237 +#: libpq/auth.c:2099 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) 실패: %s" -#: libpq/auth.c:2249 +#: libpq/auth.c:2111 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) 실패: %s" -#: libpq/auth.c:2262 +#: libpq/auth.c:2124 #, c-format msgid "pam_authenticate failed: %s" msgstr "PAM ì¸ì¦ 실패: %s" -#: libpq/auth.c:2275 +#: libpq/auth.c:2137 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt 실패: %s" -#: libpq/auth.c:2286 +#: libpq/auth.c:2148 #, c-format msgid "could not release PAM authenticator: %s" msgstr "PAM ì¸ì¦ìžë¥¼ 릴리즈할 수 없습니다: %s" -#: libpq/auth.c:2362 +#: libpq/auth.c:2228 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "LDAP 초기화 실패: 오류번호 %d" -#: libpq/auth.c:2399 +#: libpq/auth.c:2265 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "ldapbasednì—서 ë„ë©”ì¸ ì´ë¦„ì„ ë½‘ì„ ìˆ˜ ì—†ìŒ" -#: libpq/auth.c:2407 +#: libpq/auth.c:2273 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "\"%s\"ìš© LDAP ì¸ì¦ 작업ì—서 DNS SRV 레코드를 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: libpq/auth.c:2409 +#: libpq/auth.c:2275 #, c-format msgid "Set an LDAP server name explicitly." msgstr "명시ì ìœ¼ë¡œ LDAP 서버 ì´ë¦„ì„ ì§€ì •í•˜ì„¸ìš”." -#: libpq/auth.c:2461 +#: libpq/auth.c:2327 #, c-format msgid "could not initialize LDAP: %s" msgstr "LDAP 초기화 실패: %s" -#: libpq/auth.c:2471 +#: libpq/auth.c:2337 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldap ì¸ì¦ìœ¼ë¡œ 사용할 수 없는 LDAP ë¼ì´ë¸ŒëŸ¬ë¦¬" -#: libpq/auth.c:2479 +#: libpq/auth.c:2345 #, c-format msgid "could not initialize LDAP: %m" msgstr "LDAP 초기화 실패: %m" -#: libpq/auth.c:2489 +#: libpq/auth.c:2355 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "LDAP 프로토콜 ë²„ì „ì„ ì§€ì •í•  수 ì—†ìŒ: %s" -#: libpq/auth.c:2529 -#, c-format -msgid "could not load function _ldap_start_tls_sA in wldap32.dll" -msgstr "could not load function _ldap_start_tls_sA in wldap32.dll" - -#: libpq/auth.c:2530 -#, c-format -msgid "LDAP over SSL is not supported on this platform." -msgstr "ì´ í”Œëž«í¼ì—서는 SSLì„ ì´ìš©í•œ LDAP ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않ìŒ." - -#: libpq/auth.c:2546 +#: libpq/auth.c:2371 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "LDAP TLS ì„¸ì…˜ì„ ì‹œìž‘í•  수 ì—†ìŒ: %s" -#: libpq/auth.c:2617 +#: libpq/auth.c:2448 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP ì„œë²„ë„ ldapbasednë„ ì§€ì •í•˜ì§€ 않았ìŒ" -#: libpq/auth.c:2624 +#: libpq/auth.c:2455 #, c-format msgid "LDAP server not specified" msgstr "LDAP 서버가 지정ë˜ì§€ 않ìŒ" -#: libpq/auth.c:2686 +#: libpq/auth.c:2517 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "LDAP ì¸ì¦ì„ 위한 ì‚¬ìš©ìž ì´ë¦„ì— ì‚¬ìš©í•  수 없는 문ìžê°€ 있습니다" -#: libpq/auth.c:2703 +#: libpq/auth.c:2534 #, c-format msgid "" "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": " @@ -13729,55 +16149,50 @@ msgstr "" "\"%s\" ldapbinddn (해당 서버: \"%s\") ì„¤ì •ì— ëŒ€í•œ LDAP ë°”ì¸ë“œ 초기화를 í•  수 " "ì—†ìŒ: %s" -#: libpq/auth.c:2732 +#: libpq/auth.c:2564 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "\"%s\" 필터로 LDAP 검색 실패함, ëŒ€ìƒ ì„œë²„: \"%s\": %s" -#: libpq/auth.c:2746 +#: libpq/auth.c:2580 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "\"%s\" LDAP 사용ìžê°€ ì—†ìŒ" -#: libpq/auth.c:2747 +#: libpq/auth.c:2581 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "\"%s\" 필터로 \"%s\" 서버ì—서 LDAP ê²€ìƒ‰ì„ í–ˆìœ¼ë‚˜, 해당 ìžë£Œê°€ ì—†ìŒ" -#: libpq/auth.c:2751 +#: libpq/auth.c:2585 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "\"%s\" LDAP 사용ìžê°€ 유ì¼í•˜ì§€ 않습니다" -#: libpq/auth.c:2752 +#: libpq/auth.c:2586 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "" "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." msgstr[0] "\"%s\" 필터로 \"%s\" 서버ì—서 LDAP 검색 ê²°ê³¼ %d í•­ëª©ì„ ë°˜í™˜í•¨" -#: libpq/auth.c:2772 +#: libpq/auth.c:2606 #, c-format msgid "" "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "\"%s\" 첫번째 항목 조회용 dn ê°’ì„ \"%s\" 서버ì—서 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" -#: libpq/auth.c:2793 -#, c-format -msgid "could not unbind after searching for user \"%s\" on server \"%s\"" -msgstr "\"%s\" ì‚¬ìš©ìž ê²€ìƒ‰ 후 unbind ìž‘ì—…ì„ \"%s\" 서버ì—서 í•  수 ì—†ìŒ" - -#: libpq/auth.c:2824 +#: libpq/auth.c:2633 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "\"%s\" 사용ìžì˜ \"%s\" LDAP 서버 ë¡œê·¸ì¸ ì‹¤íŒ¨: %s" -#: libpq/auth.c:2853 +#: libpq/auth.c:2665 #, c-format msgid "LDAP diagnostics: %s" msgstr "LDAP 진단: %s" -#: libpq/auth.c:2880 +#: libpq/auth.c:2703 #, c-format msgid "" "certificate authentication failed for user \"%s\": client certificate " @@ -13786,209 +16201,212 @@ msgstr "" "\"%s\" 사용ìžì— 대한 ì¸ì¦ì„œ ë¡œê·¸ì¸ ì‹¤íŒ¨: í´ë¼ì´ì–¸íЏ ì¸ì¦ì„œì— ì‚¬ìš©ìž ì´ë¦„ì´ ì—†" "ìŒ" -#: libpq/auth.c:2897 +#: libpq/auth.c:2724 +#, c-format +msgid "" +"certificate authentication failed for user \"%s\": unable to retrieve " +"subject DN" +msgstr "ì‚¬ìš©ìž \"%s\"ì˜ ì¸ì¦ì„œ ì¸ì¦ì„ 실패했습니다: DN 주체가 ì—†ìŒ" + +#: libpq/auth.c:2747 +#, c-format +msgid "" +"certificate validation (clientcert=verify-full) failed for user \"%s\": DN " +"mismatch" +msgstr "" +"\"%s\" 사용ìžë¥¼ 위한 ì¸ì¦ì„œ 유효성 검사(clientcert=verify-full)를 실패 함: " +"DN 같지 않ìŒ" + +#: libpq/auth.c:2752 #, c-format msgid "" "certificate validation (clientcert=verify-full) failed for user \"%s\": CN " "mismatch" msgstr "\"%s\" 사용ìžë¥¼ 위한 ì¸ì¦ì„œ 유효성 검사를 실패 함: CN 같지 않ìŒ" -#: libpq/auth.c:2998 +#: libpq/auth.c:2854 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS 서버가 지정ë˜ì§€ 않ìŒ" -#: libpq/auth.c:3005 +#: libpq/auth.c:2861 #, c-format msgid "RADIUS secret not specified" msgstr "RADIUS 비밀키가 지정ë˜ì§€ 않ìŒ" -#: libpq/auth.c:3019 +#: libpq/auth.c:2875 #, c-format msgid "" "RADIUS authentication does not support passwords longer than %d characters" msgstr "RADIUS ì¸ì¦ì€ %d ê¸€ìž ë³´ë‹¤ í° ë¹„ë°€ë²ˆí˜¸ ì¸ì¦ì„ ì§€ì›í•˜ì§€ 않습니다" -#: libpq/auth.c:3124 libpq/hba.c:1954 +#: libpq/auth.c:2977 libpq/hba.c:2352 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "\"%s\" RADIUS 서버 ì´ë¦„ì„ ì£¼ì†Œë¡œ 바꿀 수 ì—†ìŒ: %s" -#: libpq/auth.c:3138 +#: libpq/auth.c:2991 #, c-format msgid "could not generate random encryption vector" msgstr "무작위 암호화 벡터를 만들 수 ì—†ìŒ" -#: libpq/auth.c:3172 +#: libpq/auth.c:3028 #, c-format -msgid "could not perform MD5 encryption of password" -msgstr "ë¹„ë°€ë²ˆí˜¸ì˜ MD5 암호를 만들 수 ì—†ìŒ" +msgid "could not perform MD5 encryption of password: %s" +msgstr "ë¹„ë°€ë²ˆí˜¸ì˜ MD5 암호를 만들 수 ì—†ìŒ: %s" # translator: %s is IPv4, IPv6, or Unix -#: libpq/auth.c:3198 +#: libpq/auth.c:3055 #, c-format msgid "could not create RADIUS socket: %m" msgstr "RADIUS ì†Œì¼“ì„ ìƒì„±í•  수 없습니다: %m" # translator: %s is IPv4, IPv6, or Unix -#: libpq/auth.c:3220 +#: libpq/auth.c:3071 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "RADIUS ì†Œì¼“ì— ë°”ì¸ë“œí•  수 없습니다: %m" -#: libpq/auth.c:3230 +#: libpq/auth.c:3081 #, c-format msgid "could not send RADIUS packet: %m" msgstr "RADIUS íŒ¨í‚·ì„ ë³´ë‚¼ 수 ì—†ìŒ: %m" -#: libpq/auth.c:3263 libpq/auth.c:3289 +#: libpq/auth.c:3115 libpq/auth.c:3141 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "%s ì—서 RADIUS ì‘답 대기 시간 초과" # translator: %s is IPv4, IPv6, or Unix -#: libpq/auth.c:3282 +#: libpq/auth.c:3134 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "RADIUS 소켓 ìƒíƒœë¥¼ 확ì¸í•  수 ì—†ìŒ: %m" -#: libpq/auth.c:3312 +#: libpq/auth.c:3164 #, c-format msgid "could not read RADIUS response: %m" msgstr "RADIUS ì‘ë‹µì„ ì½ì„ 수 ì—†ìŒ: %m" -#: libpq/auth.c:3325 libpq/auth.c:3329 +#: libpq/auth.c:3172 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "%sì—서 RADIUS ì‘ë‹µì´ ë°”ë¥´ì§€ ì•Šì€ í¬íŠ¸ë¡œë¶€í„° 보내졌ìŒ: %d" -#: libpq/auth.c:3338 +#: libpq/auth.c:3180 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "%sì—서 RADIUS ì‘ë‹µì´ ë„ˆë¬´ ì§§ìŒ: %d" -#: libpq/auth.c:3345 +#: libpq/auth.c:3187 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "%sì—서 RADIUS ì‘답 길ì´ê°€ ì´ìƒí•¨: %d (실재 길ì´: %d)" -#: libpq/auth.c:3353 +#: libpq/auth.c:3195 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "%sì—서 RADIUS ì‘ë‹µì´ ìš”ì²­ê³¼ 다름: %d (기대값: %d)" -#: libpq/auth.c:3378 +#: libpq/auth.c:3220 #, c-format -msgid "could not perform MD5 encryption of received packet" -msgstr "ë°›ì€ íŒ¨í‚·ì„ ëŒ€ìƒìœ¼ë¡œ MD5 암호화 작업할 수 ì—†ìŒ" +msgid "could not perform MD5 encryption of received packet: %s" +msgstr "ë°›ì€ íŒ¨í‚·ì„ ëŒ€ìƒìœ¼ë¡œ MD5 암호화 작업할 수 ì—†ìŒ: %s" -#: libpq/auth.c:3387 +#: libpq/auth.c:3230 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "%sì—서 RADIUS ì‘ë‹µì˜ MD5 ê°’ì´ ì´ìƒí•¨" -#: libpq/auth.c:3405 +#: libpq/auth.c:3248 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "%sì—서 RADIUS ì‘ë‹µì´ ë°”ë¥´ì§€ ì•Šì€ ê°’ìž„ (%d), ëŒ€ìƒ ì‚¬ìš©ìž: \"%s\"" -#: libpq/be-fsstubs.c:119 libpq/be-fsstubs.c:150 libpq/be-fsstubs.c:178 -#: libpq/be-fsstubs.c:204 libpq/be-fsstubs.c:229 libpq/be-fsstubs.c:277 -#: libpq/be-fsstubs.c:300 libpq/be-fsstubs.c:553 +#: libpq/be-fsstubs.c:133 libpq/be-fsstubs.c:162 libpq/be-fsstubs.c:190 +#: libpq/be-fsstubs.c:216 libpq/be-fsstubs.c:241 libpq/be-fsstubs.c:283 +#: libpq/be-fsstubs.c:306 libpq/be-fsstubs.c:560 #, c-format msgid "invalid large-object descriptor: %d" msgstr "유효하지 ì•Šì€ ëŒ€í˜• 개체 설명: %d" -#: libpq/be-fsstubs.c:161 +#: libpq/be-fsstubs.c:173 #, c-format msgid "large object descriptor %d was not opened for reading" msgstr "%d번 대형 개체 기술ìžê°€ ì½ê¸° 모드로 열려있지 않습니다" -#: libpq/be-fsstubs.c:185 libpq/be-fsstubs.c:560 +#: libpq/be-fsstubs.c:197 libpq/be-fsstubs.c:567 #, c-format msgid "large object descriptor %d was not opened for writing" msgstr "%d번 대형 개체 기술ìžê°€ 쓰기 모드로 열려있지 않습니다" -#: libpq/be-fsstubs.c:212 +#: libpq/be-fsstubs.c:224 #, c-format msgid "lo_lseek result out of range for large-object descriptor %d" msgstr "%d번 대형 개체 기술ìžì— 대한 lo_lseek ë°˜í™˜ê°’ì´ ë²”ìœ„ë¥¼ 벗어남" -#: libpq/be-fsstubs.c:285 +#: libpq/be-fsstubs.c:291 #, c-format msgid "lo_tell result out of range for large-object descriptor %d" msgstr "%d번 대형 개체 기술ìžì— 대한 lo_tell ë°˜í™˜ê°’ì´ ë²”ìœ„ë¥¼ 벗어남" -#: libpq/be-fsstubs.c:432 +#: libpq/be-fsstubs.c:439 #, c-format msgid "could not open server file \"%s\": %m" msgstr "서버 íŒŒì¼ \"%s\"ì„ ì—´ 수 없습니다: %m" -#: libpq/be-fsstubs.c:454 +#: libpq/be-fsstubs.c:462 #, c-format msgid "could not read server file \"%s\": %m" msgstr "서버 íŒŒì¼ \"%s\"ì„ ì½ì„ 수 없습니다: %m" -#: libpq/be-fsstubs.c:514 +#: libpq/be-fsstubs.c:521 #, c-format msgid "could not create server file \"%s\": %m" msgstr "서버 íŒŒì¼ \"%s\"ì˜ ìƒì„±ì„ í•  수 없습니다: %m" -#: libpq/be-fsstubs.c:526 +#: libpq/be-fsstubs.c:533 #, c-format msgid "could not write server file \"%s\": %m" msgstr "서버 íŒŒì¼ \"%s\"ì— ì“¸ 수 없습니다: %m" -#: libpq/be-fsstubs.c:760 +#: libpq/be-fsstubs.c:774 #, c-format msgid "large object read request is too large" msgstr "대형 개체 ì½ê¸° ìš”ì²­ì´ ë„ˆë¬´ í½ë‹ˆë‹¤" -#: libpq/be-fsstubs.c:802 utils/adt/genfile.c:265 utils/adt/genfile.c:304 -#: utils/adt/genfile.c:340 +#: libpq/be-fsstubs.c:816 utils/adt/genfile.c:248 utils/adt/genfile.c:269 #, c-format msgid "requested length cannot be negative" msgstr "요청한 길ì´ëŠ” ìŒìˆ˜ì¼ 수 ì—†ìŒ" -#: libpq/be-fsstubs.c:855 storage/large_object/inv_api.c:297 -#: storage/large_object/inv_api.c:309 storage/large_object/inv_api.c:513 -#: storage/large_object/inv_api.c:624 storage/large_object/inv_api.c:814 -#, c-format -msgid "permission denied for large object %u" -msgstr "%u 대형 ê°œì²´ì— ëŒ€í•œ ì ‘ê·¼ 권한 ì—†ìŒ" - -#: libpq/be-secure-common.c:93 -#, c-format -msgid "could not read from command \"%s\": %m" -msgstr "\"%s\" 명령ì—서 ì½ì„ 수 ì—†ìŒ: %m" - -#: libpq/be-secure-common.c:113 +#: libpq/be-secure-common.c:94 #, c-format msgid "command \"%s\" failed" msgstr "\"%s\" 명령 실패" -#: libpq/be-secure-common.c:141 +#: libpq/be-secure-common.c:123 #, c-format msgid "could not access private key file \"%s\": %m" msgstr "비밀키 \"%s\"ì— ì•¡ì„¸ìŠ¤í•  수 없습니다: %m" -#: libpq/be-secure-common.c:150 +#: libpq/be-secure-common.c:133 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "\"%s\" ê°œì¸ í‚¤ 파ì¼ì€ ì¼ë°˜ 파ì¼ì´ 아님" -#: libpq/be-secure-common.c:165 +#: libpq/be-secure-common.c:159 #, c-format msgid "private key file \"%s\" must be owned by the database user or root" msgstr "" "\"%s\" ê°œì¸ í‚¤ 파ì¼ì˜ 소유주는 ë°ì´í„°ë² ì´ìФ 사용ìžì´ê±°ë‚˜ root 여야 합니다." -#: libpq/be-secure-common.c:188 +#: libpq/be-secure-common.c:169 #, c-format msgid "private key file \"%s\" has group or world access" msgstr "\"%s\" ê°œì¸ í‚¤ 파ì¼ì— 그룹 ë˜ëŠ” ìµëª… 액세스 ê¶Œí•œì´ ìžˆìŒ" -#: libpq/be-secure-common.c:190 +#: libpq/be-secure-common.c:171 #, c-format msgid "" "File must have permissions u=rw (0600) or less if owned by the database " @@ -13998,58 +16416,58 @@ msgstr "" "(0600) ë˜ëŠ” ë” ìž‘ê²Œ 설정하고, rootê°€ 소유주ë¼ë©´ u=rw,g=r (0640) 권한으로 지정" "하세요" -#: libpq/be-secure-gssapi.c:195 +#: libpq/be-secure-gssapi.c:201 msgid "GSSAPI wrap error" -msgstr "" +msgstr "GSSAPI ê°ì‹¸ê¸° 오류" -#: libpq/be-secure-gssapi.c:199 +#: libpq/be-secure-gssapi.c:208 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" -msgstr "" +msgstr "GSSAPI 출력 메시지는 ê¸°ë°€ì„±ì„ ìœ ì§€í•˜ë©´ 안ë©ë‹ˆë‹¤." -#: libpq/be-secure-gssapi.c:203 libpq/be-secure-gssapi.c:574 +#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" -msgstr "" +msgstr "서버가 너무 í° GSSAPI íŒ¨í‚·ì„ ë³´ë‚´ë ¤ê³  합니다(%zu > %zu)." -#: libpq/be-secure-gssapi.c:330 +#: libpq/be-secure-gssapi.c:351 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" -msgstr "" +msgstr "í´ë¼ì´ì–¸íŠ¸ê°€ 너무 í° GSSAPI íŒ¨í‚·ì„ ë³´ëƒˆìŠµë‹ˆë‹¤(%zu > %zu)." -#: libpq/be-secure-gssapi.c:364 +#: libpq/be-secure-gssapi.c:389 msgid "GSSAPI unwrap error" -msgstr "" +msgstr "GSSAPI 벗기기 오류" -#: libpq/be-secure-gssapi.c:369 +#: libpq/be-secure-gssapi.c:396 #, c-format msgid "incoming GSSAPI message did not use confidentiality" -msgstr "" +msgstr "GSSAPI ìž…ë ¥ 메시지는 ê¸°ë°€ì„±ì„ ìœ ì§€í•˜ë©´ 안ë©ë‹ˆë‹¤." -#: libpq/be-secure-gssapi.c:525 +#: libpq/be-secure-gssapi.c:575 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %d)" -msgstr "" +msgstr "í´ë¼ì´ì–¸íŠ¸ê°€ 너무 í° GSSAPI íŒ¨í‚·ì„ ë³´ëƒˆìŠµë‹ˆë‹¤(%zu > %d)" -#: libpq/be-secure-gssapi.c:547 +#: libpq/be-secure-gssapi.c:600 msgid "could not accept GSSAPI security context" msgstr "GSSAPI 보안 ë‚´ìš©ì„ ë°›ì•„ë“œë¦´ 수 ì—†ìŒ" -#: libpq/be-secure-gssapi.c:637 +#: libpq/be-secure-gssapi.c:701 msgid "GSSAPI size check error" msgstr "GSSAPI í¬ê¸° 검사 오류" -#: libpq/be-secure-openssl.c:112 +#: libpq/be-secure-openssl.c:131 #, c-format msgid "could not create SSL context: %s" msgstr "SSL 컨í…스트 정보를 ìƒì„±í•  수 없습니다: %s" -#: libpq/be-secure-openssl.c:138 +#: libpq/be-secure-openssl.c:157 #, c-format msgid "could not load server certificate file \"%s\": %s" msgstr "서버 ì¸ì¦ì„œ íŒŒì¼ \"%s\"ì„ ë¶ˆëŸ¬ë“¤ì¼ ìˆ˜ 없습니다: %s" -#: libpq/be-secure-openssl.c:158 +#: libpq/be-secure-openssl.c:177 #, c-format msgid "" "private key file \"%s\" cannot be reloaded because it requires a passphrase" @@ -14057,431 +16475,463 @@ msgstr "" "\"%s\" ê°œì¸ í‚¤ 파ì¼ì€ 비밀번호를 입력해야 해서 ìžë™ìœ¼ë¡œ 다시 불러올 수 없습니" "다." -#: libpq/be-secure-openssl.c:163 +#: libpq/be-secure-openssl.c:182 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "비밀키 íŒŒì¼ \"%s\"ì„ ë¶ˆëŸ¬ë“¤ì¼ ìˆ˜ 없습니다: %s" -#: libpq/be-secure-openssl.c:172 +#: libpq/be-secure-openssl.c:191 #, c-format msgid "check of private key failed: %s" msgstr "ë¹„ë°€í‚¤ì˜ í™•ì¸ ì‹¤íŒ¨: %s" -#: libpq/be-secure-openssl.c:184 libpq/be-secure-openssl.c:206 +#. translator: first %s is a GUC option name, second %s is its value +#: libpq/be-secure-openssl.c:204 libpq/be-secure-openssl.c:227 #, c-format msgid "\"%s\" setting \"%s\" not supported by this build" msgstr "\"%s\" ì˜ \"%s\" 설정 ê¸°ëŠ¥ì„ ë¹¼ê³  빌드 ë˜ì—ˆìŒ" -#: libpq/be-secure-openssl.c:194 +#: libpq/be-secure-openssl.c:214 #, c-format msgid "could not set minimum SSL protocol version" msgstr "최소 SSL 프로토콜 ë²„ì „ì„ ì„¤ì •í•  수 ì—†ìŒ" -#: libpq/be-secure-openssl.c:216 +#: libpq/be-secure-openssl.c:237 #, c-format msgid "could not set maximum SSL protocol version" msgstr "최대 SSL 프로토콜 ë²„ì „ì„ ì„¤ì •í•  수 ì—†ìŒ" -#: libpq/be-secure-openssl.c:232 +#: libpq/be-secure-openssl.c:253 #, c-format msgid "could not set SSL protocol version range" msgstr "SSL 프로토콜 버전 범위를 지정할 수 ì—†ìŒ" -#: libpq/be-secure-openssl.c:233 +#: libpq/be-secure-openssl.c:254 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "\"%s\" ê°’ì€ \"%s\" 보다 ë†’ì„ ìˆ˜ ì—†ìŒ" -#: libpq/be-secure-openssl.c:257 +#: libpq/be-secure-openssl.c:307 #, c-format msgid "could not set the cipher list (no valid ciphers available)" msgstr "cipher 목ë¡ì„ 설정할 수 ì—†ìŒ (유요한 cipherê°€ ì—†ìŒ)" -#: libpq/be-secure-openssl.c:275 +#: libpq/be-secure-openssl.c:327 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "root ì¸ì¦ì„œ íŒŒì¼ \"%s\"ì„ ë¶ˆëŸ¬ë“¤ì¼ ìˆ˜ 없습니다: %s" -#: libpq/be-secure-openssl.c:302 +#: libpq/be-secure-openssl.c:376 #, c-format msgid "could not load SSL certificate revocation list file \"%s\": %s" msgstr "\"%s\" SSL ì¸ì¦ì„œ 회수 ëª©ë¡ íŒŒì¼ì„ ë¶ˆëŸ¬ë“¤ì¼ ìˆ˜ 없습니다: %s" -#: libpq/be-secure-openssl.c:378 +#: libpq/be-secure-openssl.c:384 +#, c-format +msgid "could not load SSL certificate revocation list directory \"%s\": %s" +msgstr "\"%s\" SSL ì¸ì¦ì„œ 회수 ëª©ë¡ ë””ë ‰í„°ë¦¬ë¥¼ ë¶ˆëŸ¬ë“¤ì¼ ìˆ˜ 없습니다: %s" + +#: libpq/be-secure-openssl.c:392 +#, c-format +msgid "" +"could not load SSL certificate revocation list file \"%s\" or directory " +"\"%s\": %s" +msgstr "" +"\"%s\" SSL ì¸ì¦ì„œ 회수 ëª©ë¡ íŒŒì¼ì´ë‚˜ \"%s\" 디렉터리를 ë¶ˆëŸ¬ë“¤ì¼ ìˆ˜ 없습니다: " +"%s" + +#: libpq/be-secure-openssl.c:450 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "SSLì—°ê²°ì„ ì´ˆê¸°í™”í•  수 없습니다: SSL 컨í…스트를 설정 못함" -#: libpq/be-secure-openssl.c:386 +#: libpq/be-secure-openssl.c:464 #, c-format msgid "could not initialize SSL connection: %s" msgstr "SSLì—°ê²°ì„ ì´ˆê¸°í™”í•  수 없습니다: %s" -#: libpq/be-secure-openssl.c:394 +#: libpq/be-secure-openssl.c:472 #, c-format msgid "could not set SSL socket: %s" msgstr "SSL ì†Œì¼“ì„ ì§€ì •í•  수 없습니다: %s" -#: libpq/be-secure-openssl.c:449 +#: libpq/be-secure-openssl.c:528 #, c-format msgid "could not accept SSL connection: %m" msgstr "SSL ì—°ê²°ì„ ë°›ì•„ë“œë¦´ 수 없습니다: %m" -#: libpq/be-secure-openssl.c:453 libpq/be-secure-openssl.c:506 +#: libpq/be-secure-openssl.c:532 libpq/be-secure-openssl.c:589 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "SSL ì—°ê²°ì„ ë°›ì•„ë“œë¦´ 수 없습니다: EOF ê°ì§€ë¨" -#: libpq/be-secure-openssl.c:492 +#: libpq/be-secure-openssl.c:573 #, c-format msgid "could not accept SSL connection: %s" msgstr "SSL ì—°ê²°ì„ ë°›ì•„ë“œë¦´ 수 없습니다: %s" -#: libpq/be-secure-openssl.c:495 +#: libpq/be-secure-openssl.c:577 #, c-format msgid "" "This may indicate that the client does not support any SSL protocol version " "between %s and %s." msgstr "" +"ì´ëŸ° 경우는 í´ë¼ì´ì–¸íŠ¸ê°€ %s부터 %s까지 SSL 프로토콜 ë²„ì „ì„ ì§€ì›í•˜ì§€ 않는 경우" +"ì— ë°œìƒí•˜ê¸°ë„ 합니다." -#: libpq/be-secure-openssl.c:511 libpq/be-secure-openssl.c:642 -#: libpq/be-secure-openssl.c:706 +#: libpq/be-secure-openssl.c:594 libpq/be-secure-openssl.c:809 +#: libpq/be-secure-openssl.c:879 #, c-format msgid "unrecognized SSL error code: %d" msgstr "ì¸ì‹ë˜ì§€ ì•Šì€ SSL ì—러 코드 %d" -#: libpq/be-secure-openssl.c:553 +#: libpq/be-secure-openssl.c:622 +#, c-format +msgid "received SSL connection request with unexpected ALPN protocol" +msgstr "ìˆ˜ì‹ ëœ SSL ì—°ê²°ì€ ì˜ˆìƒì¹˜ ì•Šì€ ALPN í”„ë¡œí† ì½œì„ ìš”êµ¬í•¨" + +#: libpq/be-secure-openssl.c:666 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "SSL ì¸ì¦ì„œì˜ ì¼ë°˜ ì´ë¦„ì— í¬í•¨ëœ nullì´ ìžˆìŒ" -#: libpq/be-secure-openssl.c:631 libpq/be-secure-openssl.c:690 +#: libpq/be-secure-openssl.c:712 +#, c-format +msgid "SSL certificate's distinguished name contains embedded null" +msgstr "SSL ì¸ì¦ì„œì˜ ì‹ë³„ìž ì´ë¦„ì— í¬í•¨ëœ nullì´ ìžˆìŒ" + +#: libpq/be-secure-openssl.c:798 libpq/be-secure-openssl.c:863 #, c-format msgid "SSL error: %s" msgstr "SSL ì—러: %s" -#: libpq/be-secure-openssl.c:871 +#: libpq/be-secure-openssl.c:1038 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "\"%s\" DH 매개 변수 파ì¼ì„ ì—´ 수 없습니다: %m" -#: libpq/be-secure-openssl.c:883 +#: libpq/be-secure-openssl.c:1050 #, c-format msgid "could not load DH parameters file: %s" msgstr "DH 매개 변수 파ì¼ì„ ë¶ˆëŸ¬ë“¤ì¼ ìˆ˜ 없습니다: %s" -#: libpq/be-secure-openssl.c:893 +#: libpq/be-secure-openssl.c:1060 #, c-format msgid "invalid DH parameters: %s" msgstr "ìž˜ëª»ëœ DH 매개 변수: %s" -#: libpq/be-secure-openssl.c:901 +#: libpq/be-secure-openssl.c:1069 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "ìž˜ëª»ëœ DH 매개 변수값: p는 prime 아님" -#: libpq/be-secure-openssl.c:909 +#: libpq/be-secure-openssl.c:1078 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" +msgstr "ìž˜ëª»ëœ DH 매개 변수값: 타당한 ìƒì„±ìžë„ 아니고, 안전한 primeë„ ì•„ë‹˜" + +#: libpq/be-secure-openssl.c:1214 +#, c-format +msgid "Client certificate verification failed at depth %d: %s." +msgstr "%d 번째 깊ì´ì—서 í´ë¼ì´ì–¸íЏ ì¸ì¦ì„œ 유효성 검사 실패: %s." + +#: libpq/be-secure-openssl.c:1251 +#, c-format +msgid "" +"Failed certificate data (unverified): subject \"%s\", serial number %s, " +"issuer \"%s\"." msgstr "" +"ë°ì´í„° ì¸ì¦ 실패 (ê²€ì¦ ì•ˆë¨): subject \"%s\", serial number %s, issuer " +"\"%s\"." + +#: libpq/be-secure-openssl.c:1252 +msgid "unknown" +msgstr "알수없ìŒ" -#: libpq/be-secure-openssl.c:1065 +#: libpq/be-secure-openssl.c:1389 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: DH 매개 변수 불러오기 실패" -#: libpq/be-secure-openssl.c:1073 +#: libpq/be-secure-openssl.c:1397 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: DH 매개 변수 설정 실패: %s" -#: libpq/be-secure-openssl.c:1100 +#: libpq/be-secure-openssl.c:1424 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: 알 수 없는 curve ì´ë¦„: %s" -#: libpq/be-secure-openssl.c:1109 +#: libpq/be-secure-openssl.c:1433 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: 키 ìƒì„± 실패" -#: libpq/be-secure-openssl.c:1137 +#: libpq/be-secure-openssl.c:1461 msgid "no SSL error reported" msgstr "SSL 오류 ì—†ìŒ" -#: libpq/be-secure-openssl.c:1141 +#: libpq/be-secure-openssl.c:1479 #, c-format msgid "SSL error code %lu" msgstr "SSL 오류 번호 %lu" -#: libpq/be-secure.c:122 +#: libpq/be-secure-openssl.c:1636 #, c-format -msgid "SSL connection from \"%s\"" -msgstr "\"%s\" ë¡œë¶€í„°ì˜ SSL ì—°ê²°" +msgid "could not create BIO" +msgstr "BIO 만들기 실패" -#: libpq/be-secure.c:207 libpq/be-secure.c:303 +#: libpq/be-secure-openssl.c:1646 #, c-format -msgid "terminating connection due to unexpected postmaster exit" -msgstr "postmasterì˜ ì˜ˆìƒì¹˜ 못한 종료로 ì—°ê²°ì„ ì¢…ë£Œí•©ë‹ˆë‹¤" +msgid "could not get NID for ASN1_OBJECT object" +msgstr "ASN1_OBJECT ê°ì²´ìš© NID 구할 수 ì—†ìŒ" -#: libpq/crypt.c:49 +#: libpq/be-secure-openssl.c:1654 +#, c-format +msgid "could not convert NID %d to an ASN1_OBJECT structure" +msgstr "ASN1_OBJECT 구조체ì—서 %d NID를 변환할 수 ì—†ìŒ" + +#: libpq/crypt.c:48 #, c-format msgid "Role \"%s\" does not exist." msgstr "\"%s\" 롤 ì—†ìŒ" -#: libpq/crypt.c:59 +#: libpq/crypt.c:58 #, c-format msgid "User \"%s\" has no password assigned." msgstr "\"%s\" ì‚¬ìš©ìž ë¹„ë°€ë²ˆí˜¸ê°€ ì•„ì§ í• ë‹¹ë˜ì§€ 않ìŒ" -#: libpq/crypt.c:77 +#: libpq/crypt.c:76 #, c-format msgid "User \"%s\" has an expired password." msgstr "\"%s\" ì‚¬ìš©ìž ë¹„ë°€ë²ˆí˜¸ê°€ 기한 만료ë˜ì—ˆìŠµë‹ˆë‹¤." -#: libpq/crypt.c:179 +#: libpq/crypt.c:182 #, c-format msgid "User \"%s\" has a password that cannot be used with MD5 authentication." -msgstr "" +msgstr "\"%s\" 사용ìžì˜ 비밀번호는 MD5 ì¸ì¦ìš©ì´ 아닙니다." -#: libpq/crypt.c:203 libpq/crypt.c:244 libpq/crypt.c:268 +#: libpq/crypt.c:203 libpq/crypt.c:245 libpq/crypt.c:265 #, c-format msgid "Password does not match for user \"%s\"." msgstr "\"%s\" 사용ìžì˜ 비밀번호가 틀립니다." -#: libpq/crypt.c:287 +#: libpq/crypt.c:284 #, c-format msgid "Password of user \"%s\" is in unrecognized format." -msgstr "" +msgstr "\"%s\" 사용ìžì˜ 비밀번호 암호화 ê¸°ë²•ì„ ì•Œ 수 없습니다." + +#: libpq/hba.c:327 +#, c-format +msgid "invalid regular expression \"%s\": %s" +msgstr "\"%s\" ì •ê·œì‹ì´ 잘못ë¨: %s" -#: libpq/hba.c:235 +#: libpq/hba.c:329 libpq/hba.c:661 libpq/hba.c:1245 libpq/hba.c:1265 +#: libpq/hba.c:1288 libpq/hba.c:1301 libpq/hba.c:1354 libpq/hba.c:1382 +#: libpq/hba.c:1390 libpq/hba.c:1402 libpq/hba.c:1423 libpq/hba.c:1436 +#: libpq/hba.c:1461 libpq/hba.c:1488 libpq/hba.c:1500 libpq/hba.c:1559 +#: libpq/hba.c:1579 libpq/hba.c:1593 libpq/hba.c:1613 libpq/hba.c:1624 +#: libpq/hba.c:1639 libpq/hba.c:1658 libpq/hba.c:1674 libpq/hba.c:1686 +#: libpq/hba.c:1752 libpq/hba.c:1765 libpq/hba.c:1787 libpq/hba.c:1799 +#: libpq/hba.c:1817 libpq/hba.c:1867 libpq/hba.c:1911 libpq/hba.c:1922 +#: libpq/hba.c:1938 libpq/hba.c:1955 libpq/hba.c:1966 libpq/hba.c:1985 +#: libpq/hba.c:2001 libpq/hba.c:2017 libpq/hba.c:2076 libpq/hba.c:2093 +#: libpq/hba.c:2106 libpq/hba.c:2118 libpq/hba.c:2137 libpq/hba.c:2223 +#: libpq/hba.c:2241 libpq/hba.c:2335 libpq/hba.c:2354 libpq/hba.c:2383 +#: libpq/hba.c:2396 libpq/hba.c:2419 libpq/hba.c:2441 libpq/hba.c:2455 +#: tsearch/ts_locale.c:241 #, c-format -msgid "authentication file token too long, skipping: \"%s\"" -msgstr "ì¸ì¦ 파ì¼ì˜ 토í°ì´ 너무 길어서 건너ëœë‹ˆë‹¤: \"%s\"" +msgid "line %d of configuration file \"%s\"" +msgstr "%d번째 줄(\"%s\" 환경 설정 파ì¼)" -#: libpq/hba.c:407 +#: libpq/hba.c:457 #, c-format -msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" -msgstr "2ì°¨ ì¸ì¦íŒŒì¼ \"%s\"으로 \"@%s\"를 ì—´ 수 없다: %m" +msgid "skipping missing authentication file \"%s\"" +msgstr "\"%s\" ì¸ì¦ 설정파ì¼ì´ 없으나 건너뜀" -#: libpq/hba.c:509 +#: libpq/hba.c:609 #, c-format -msgid "authentication file line too long" -msgstr "ì¸ì¦ íŒŒì¼ ì¤„ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤" +msgid "could not open file \"%s\": maximum nesting depth exceeded" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 없습니다: 최대 디렉터리 깊ì´ë¥¼ 초과했ìŒ" -#: libpq/hba.c:510 libpq/hba.c:867 libpq/hba.c:887 libpq/hba.c:925 -#: libpq/hba.c:975 libpq/hba.c:989 libpq/hba.c:1013 libpq/hba.c:1022 -#: libpq/hba.c:1035 libpq/hba.c:1056 libpq/hba.c:1069 libpq/hba.c:1089 -#: libpq/hba.c:1111 libpq/hba.c:1123 libpq/hba.c:1179 libpq/hba.c:1199 -#: libpq/hba.c:1213 libpq/hba.c:1232 libpq/hba.c:1243 libpq/hba.c:1258 -#: libpq/hba.c:1276 libpq/hba.c:1292 libpq/hba.c:1304 libpq/hba.c:1341 -#: libpq/hba.c:1382 libpq/hba.c:1395 libpq/hba.c:1417 libpq/hba.c:1430 -#: libpq/hba.c:1442 libpq/hba.c:1460 libpq/hba.c:1510 libpq/hba.c:1554 -#: libpq/hba.c:1565 libpq/hba.c:1581 libpq/hba.c:1598 libpq/hba.c:1608 -#: libpq/hba.c:1666 libpq/hba.c:1704 libpq/hba.c:1726 libpq/hba.c:1738 -#: libpq/hba.c:1825 libpq/hba.c:1843 libpq/hba.c:1937 libpq/hba.c:1956 -#: libpq/hba.c:1985 libpq/hba.c:1998 libpq/hba.c:2021 libpq/hba.c:2043 -#: libpq/hba.c:2057 tsearch/ts_locale.c:217 +#: libpq/hba.c:1216 #, c-format -msgid "line %d of configuration file \"%s\"" -msgstr "%d번째 줄(\"%s\" 환경 설정 파ì¼)" +msgid "error enumerating network interfaces: %m" +msgstr "ë„¤íŠ¸ì›Œí¬ ì¸í„°íŽ˜ì´ìФ ì´ë®¬ë ˆì´íЏ 하기 실패: %m" #. translator: the second %s is a list of auth methods -#: libpq/hba.c:865 +#: libpq/hba.c:1243 #, c-format msgid "" "authentication option \"%s\" is only valid for authentication methods %s" msgstr "\"%s\" ì¸ì¦ ì˜µì…˜ì€ %s ì¸ì¦ 방법ì—ë§Œ 유효함" -#: libpq/hba.c:885 +#: libpq/hba.c:1263 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "\"%s\" ì¸ì¦ ë°©ë²•ì˜ ê²½ìš° \"%s\" ì¸ìžë¥¼ 설정해야 함" -#: libpq/hba.c:913 +#: libpq/hba.c:1287 #, c-format -msgid "missing entry in file \"%s\" at end of line %d" -msgstr "\"%s\" 파ì¼ì˜ %d번째 ì¤„ì˜ ë ë¼ì¸ì— ë¹ ì§„ 엔트리가 있습니다 " +msgid "missing entry at end of line" +msgstr "ì¤„ì˜ ë ë¼ì¸ì— ë¹ ì§„ 엔트리가 있ìŒ" -#: libpq/hba.c:924 +#: libpq/hba.c:1300 #, c-format msgid "multiple values in ident field" msgstr "ident ìžë¦¬ì— 여러 ê°’ì´ ìžˆìŒ" -#: libpq/hba.c:973 +#: libpq/hba.c:1352 #, c-format msgid "multiple values specified for connection type" msgstr "ì—°ê²° í˜•ì‹ ìžë¦¬ì— 여러 ê°’ì´ ìžˆìŒ" -#: libpq/hba.c:974 +#: libpq/hba.c:1353 #, c-format msgid "Specify exactly one connection type per line." msgstr "한 ì¤„ì— í•˜ë‚˜ì˜ ì—°ê²° 형태만 지정해야 합니다" -#: libpq/hba.c:988 -#, c-format -msgid "local connections are not supported by this build" -msgstr "로컬 ì ‘ì† ê¸°ëŠ¥ì„ ëº€ 채로 서버가 만들어졌습니다." - -#: libpq/hba.c:1011 +#: libpq/hba.c:1380 #, c-format msgid "hostssl record cannot match because SSL is disabled" -msgstr "" +msgstr "SSL ê¸°ëŠ¥ì´ êº¼ì ¸ìžˆì–´ hostssl ì„¤ì •ì„ ì‚¬ìš©í•  수 없습니다" -#: libpq/hba.c:1012 +#: libpq/hba.c:1381 #, c-format -msgid "Set ssl = on in postgresql.conf." -msgstr "postgresql.conf 파ì¼ì— ssl = on ì„¤ì •ì„ í•˜ì„¸ìš”." +msgid "Set \"ssl = on\" in postgresql.conf." +msgstr "postgresql.conf 파ì¼ì— \"ssl = on\" ì„¤ì •ì„ í•˜ì„¸ìš”." -#: libpq/hba.c:1020 +#: libpq/hba.c:1389 #, c-format msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "" "ì´ ì„œë²„ëŠ” ssl ì ‘ì† ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않아 hostssl ì¸ì¦ì„ ì§€ì›í•˜ì§€ 않습니다." -#: libpq/hba.c:1021 -#, c-format -msgid "Compile with --with-openssl to use SSL connections." -msgstr "" -"SSL ì—°ê²°ì„ ì‚¬ìš©í•˜ê¸° 위해 --enable-ssl ì˜µì…˜ì„ ì‚¬ìš©í•´ì„œ 서버를 다시 ì»´íŒŒì¼ í•˜ì„¸" -"ìš”" - -#: libpq/hba.c:1033 +#: libpq/hba.c:1401 #, c-format msgid "" "hostgssenc record cannot match because GSSAPI is not supported by this build" msgstr "" "ì´ ì„œë²„ëŠ” GSSAPI ì ‘ì† ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않아 hostgssenc 레코드가 ì ë‹¹í•˜ì§€ 않ìŒ" -#: libpq/hba.c:1034 -#, c-format -msgid "Compile with --with-gssapi to use GSSAPI connections." -msgstr "" -"GSSAPI ì—°ê²°ì„ ì‚¬ìš©í•˜ê¸° 위해 --with-gssapi ì˜µì…˜ì„ ì‚¬ìš©í•´ì„œ 서버를 다시 ì»´íŒŒì¼ " -"하세요" - -#: libpq/hba.c:1054 +#: libpq/hba.c:1421 #, c-format msgid "invalid connection type \"%s\"" msgstr "\"%s\" ê°’ì€ ìž˜ëª»ëœ ì—°ê²° 형ì‹ìž…니다" -#: libpq/hba.c:1068 +#: libpq/hba.c:1435 #, c-format msgid "end-of-line before database specification" msgstr "ë°ì´í„°ë² ì´ìФ 지정 ì „ì— ì¤„ ëì— ë„달함" -#: libpq/hba.c:1088 +#: libpq/hba.c:1460 #, c-format msgid "end-of-line before role specification" msgstr "롤 지정 ì „ì— ì¤„ ëì— ë„달함" -#: libpq/hba.c:1110 +#: libpq/hba.c:1487 #, c-format msgid "end-of-line before IP address specification" msgstr "IP 주소 지정 ì „ì— ì¤„ ëì— ë„달함" -#: libpq/hba.c:1121 +#: libpq/hba.c:1498 #, c-format msgid "multiple values specified for host address" msgstr "호스트 주소 ë¶€ë¶„ì— ì—¬ëŸ¬ ê°’ì´ ì§€ì •ë¨" -#: libpq/hba.c:1122 +#: libpq/hba.c:1499 #, c-format msgid "Specify one address range per line." msgstr "한 ì¤„ì— í•˜ë‚˜ì˜ ì£¼ì†Œ 범위가 있어야 합니다." -#: libpq/hba.c:1177 +#: libpq/hba.c:1557 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "\"%s\" 형태는 ìž˜ëª»ëœ IP 주소 형태입니다: %s" -#: libpq/hba.c:1197 +#: libpq/hba.c:1577 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "호스트 ì´ë¦„ê³¼ CIDR 마스í¬ëŠ” 함께 쓸 수 없습니다: \"%s\"" -#: libpq/hba.c:1211 +#: libpq/hba.c:1591 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "\"%s\" ì£¼ì†Œì— ìž˜ëª»ëœ CIDR 마스í¬ê°€ 있ìŒ" -#: libpq/hba.c:1230 +#: libpq/hba.c:1611 #, c-format msgid "end-of-line before netmask specification" msgstr "ë„·ë§ˆìŠ¤í¬ ì§€ì • ì „ì— ì¤„ ëì— ë„달함" -#: libpq/hba.c:1231 +#: libpq/hba.c:1612 #, c-format msgid "" "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "주소 범위는 CIDR í‘œê¸°ë²•ì„ ì“°ê±°ë‚˜ ë„·ë§ˆìŠ¤í¬ í‘œê¸°ë²•ì„ ì“°ì„¸ìš”" -#: libpq/hba.c:1242 +#: libpq/hba.c:1623 #, c-format msgid "multiple values specified for netmask" msgstr "ë„·ë§ˆìŠ¤í¬ ë¶€ë¶„ì— ì—¬ëŸ¬ ê°’ì´ ì§€ì •ë¨" -#: libpq/hba.c:1256 +#: libpq/hba.c:1637 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "ìž˜ëª»ëœ IP 마스í¬, \"%s\": %s" -#: libpq/hba.c:1275 +#: libpq/hba.c:1657 #, c-format msgid "IP address and mask do not match" msgstr "IP 주소와 마스í¬ê°€ ë§žì§€ 않습니다" -#: libpq/hba.c:1291 +#: libpq/hba.c:1673 #, c-format msgid "end-of-line before authentication method" msgstr "ì¸ì¦ 방법 ì „ì— ì¤„ ëì— ë„달함" -#: libpq/hba.c:1302 +#: libpq/hba.c:1684 #, c-format msgid "multiple values specified for authentication type" msgstr "ì¸ì¦ 방법 ë¶€ë¶„ì— ì—¬ëŸ¬ ê°’ì´ ì§€ì •ë¨" -#: libpq/hba.c:1303 +#: libpq/hba.c:1685 #, c-format msgid "Specify exactly one authentication type per line." msgstr "í•˜ë‚˜ì˜ ì¸ì¦ ë°©ë²•ì— ëŒ€í•´ì„œ 한 줄씩 지정해야 합니다" -#: libpq/hba.c:1380 +#: libpq/hba.c:1750 #, c-format msgid "invalid authentication method \"%s\"" msgstr "\"%s\" ì¸ì¦ ë°©ë²•ì´ ìž˜ëª»ë¨" -#: libpq/hba.c:1393 +#: libpq/hba.c:1763 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "\"%s\" ì¸ì¦ ë°©ë²•ì´ ìž˜ëª»ë¨: ì´ ì„œë²„ì—서 ì§€ì›ë˜ì§€ 않ìŒ" -#: libpq/hba.c:1416 +#: libpq/hba.c:1786 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "gssapi ì¸ì¦ì€ 로컬 소켓ì—서 ì§€ì›ë˜ì§€ 않ìŒ" -#: libpq/hba.c:1429 -#, c-format -msgid "GSSAPI encryption only supports gss, trust, or reject authentication" -msgstr "" - -#: libpq/hba.c:1441 +#: libpq/hba.c:1798 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "peer ì¸ì¦ì€ 로컬 소켓ì—서만 ì§€ì›í•¨" -#: libpq/hba.c:1459 +#: libpq/hba.c:1816 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "cert ì¸ì¦ì€ hostssl ì—°ê²°ì—서만 ì§€ì›ë¨" -#: libpq/hba.c:1509 +#: libpq/hba.c:1866 #, c-format msgid "authentication option not in name=value format: %s" msgstr "ì¸ì¦ ì˜µì…˜ì´ ì´ë¦„=ê°’ 형태가 아님: %s" -#: libpq/hba.c:1553 +#: libpq/hba.c:1910 #, c-format msgid "" "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, " @@ -14490,239 +16940,249 @@ msgstr "" "ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, " "ldapsearchfilter, ldapurl ì˜µì…˜ì€ ldapprefix 옵션과 함께 사용할 수 ì—†ìŒ" -#: libpq/hba.c:1564 +#: libpq/hba.c:1921 #, c-format msgid "" -"authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix" -"\", or \"ldapsuffix\" to be set" +"authentication method \"ldap\" requires argument \"ldapbasedn\", " +"\"ldapprefix\", or \"ldapsuffix\" to be set" msgstr "" "\"ldap\" ì¸ì¦ ë°©ë²•ì˜ ê²½ìš° \"ldapbasedn\", \"ldapprefix\", \"ldapsuffix\"옵션" "ì´ ìžˆì–´ì•¼ 함" -#: libpq/hba.c:1580 +#: libpq/hba.c:1937 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "ldapsearchattribute ì˜µì…˜ì€ ldapsearchfilter 옵션과 함께 사용할 수 ì—†ìŒ" -#: libpq/hba.c:1597 +#: libpq/hba.c:1954 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "RADIUS 서버 목ë¡ì€ 비어 ìžˆì„ ìˆ˜ ì—†ìŒ" -#: libpq/hba.c:1607 +#: libpq/hba.c:1965 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "RADIUS 비밀키 목ë¡ì€ 비어 ìžˆì„ ìˆ˜ ì—†ìŒ" -#: libpq/hba.c:1660 +#: libpq/hba.c:1982 +#, c-format +msgid "" +"the number of RADIUS secrets (%d) must be 1 or the same as the number of " +"RADIUS servers (%d)" +msgstr "" +"RADIUS 비밀번호 개수(%d)는 하나ì´ê±°ë‚˜, RADIUS 서버 개수(%d)와 같아야 함" + +#: libpq/hba.c:1998 +#, c-format +msgid "" +"the number of RADIUS ports (%d) must be 1 or the same as the number of " +"RADIUS servers (%d)" +msgstr "RADIUS í¬íЏ 개수(%d)는 하나ì´ê±°ë‚˜, RADIUS 서버 개수(%d)와 같아야 함" + +#: libpq/hba.c:2014 #, c-format -msgid "the number of %s (%d) must be 1 or the same as the number of %s (%d)" -msgstr "서버 목ë¡ê³¼ 키 목ë¡ì´ 안 ë§žìŒ: %s (%d) / %s (%d)" +msgid "" +"the number of RADIUS identifiers (%d) must be 1 or the same as the number of " +"RADIUS servers (%d)" +msgstr "RADIUS 계정 개수(%d)는 하나ì´ê±°ë‚˜, RADIUS 서버 개수(%d)와 같아야 함" -#: libpq/hba.c:1694 +#: libpq/hba.c:2066 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi ë° cert" -#: libpq/hba.c:1703 +#: libpq/hba.c:2075 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert는 \"hostssl\" í–‰ì— ëŒ€í•´ì„œë§Œ 구성할 수 있ìŒ" -#: libpq/hba.c:1725 +#: libpq/hba.c:2092 #, c-format msgid "" -"clientcert cannot be set to \"no-verify\" when using \"cert\" authentication" +"clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "" -"\"cert\" ì¸ì¦ì„ 사용하는 경우 clientcert를 \"no-verify\"로 설정할 수 ì—†ìŒ" +"\"cert\" ì¸ì¦ì„ 사용하는 경우 clientcert ê°’ì€ \"verify-full\" ë§Œ 허용함" -#: libpq/hba.c:1737 +#: libpq/hba.c:2105 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "ìž˜ëª»ëœ clientcert ê°’: \"%s\"" -#: libpq/hba.c:1771 +#: libpq/hba.c:2117 +#, c-format +msgid "clientname can only be configured for \"hostssl\" rows" +msgstr "clientname ì„¤ì •ì€ \"hostssl\" 줄ì—ë§Œ 지정할 수 있ìŒ" + +#: libpq/hba.c:2136 +#, c-format +msgid "invalid value for clientname: \"%s\"" +msgstr "ìž˜ëª»ëœ clientname ê°’: \"%s\"" + +#: libpq/hba.c:2169 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "\"%s\" LDAP URLì„ ë¶„ì„í•  수 ì—†ìŒ: %s" -#: libpq/hba.c:1782 +#: libpq/hba.c:2180 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "ì§€ì›í•˜ì§€ 않는 LDAP URL 스킴: %s" -#: libpq/hba.c:1806 +#: libpq/hba.c:2204 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "ì´ í”Œëž«í¼ì—서는 LDAP URL ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않ìŒ." -#: libpq/hba.c:1824 +#: libpq/hba.c:2222 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "ìž˜ëª»ëœ ldapscheme ê°’: \"%s\"" -#: libpq/hba.c:1842 +#: libpq/hba.c:2240 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "LDAP í¬íЏ 번호가 잘못ë¨: \"%s\"" -#: libpq/hba.c:1888 libpq/hba.c:1895 +#: libpq/hba.c:2286 libpq/hba.c:2293 msgid "gssapi and sspi" msgstr "gssapi ë° sspi" -#: libpq/hba.c:1904 libpq/hba.c:1913 +#: libpq/hba.c:2302 libpq/hba.c:2311 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1935 +#: libpq/hba.c:2333 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "RADIUS 서버 ëª©ë¡ ë¶„ì„ ì‹¤íŒ¨: \"%s\"" -#: libpq/hba.c:1983 +#: libpq/hba.c:2381 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "RADIUS 서버 í¬íЏ ëª©ë¡ ë¶„ì„ ì‹¤íŒ¨: \"%s\"" -#: libpq/hba.c:1997 +#: libpq/hba.c:2395 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "RADIUS í¬íЏ 번호가 잘못ë¨: \"%s\"" # translator: %s is IPv4, IPv6, or Unix -#: libpq/hba.c:2019 +#: libpq/hba.c:2417 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "RADIUS 서버 비밀키 ëª©ë¡ ë¶„ì„ ì‹¤íŒ¨: \"%s\"" -#: libpq/hba.c:2041 +#: libpq/hba.c:2439 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "RADIUS 서버 ì‹ë³„ìž ëª©ë¡ ë¶„ì„ ì‹¤íŒ¨: \"%s\"" -#: libpq/hba.c:2055 +#: libpq/hba.c:2453 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "알 수 없는 ì¸ì¦ 옵션 ì´ë¦„: \"%s\"" -#: libpq/hba.c:2199 libpq/hba.c:2613 guc-file.l:631 -#, c-format -msgid "could not open configuration file \"%s\": %m" -msgstr "\"%s\" 설정 íŒŒì¼ ì„ ì—´ìˆ˜ 없습니다: %m" - -#: libpq/hba.c:2250 +#: libpq/hba.c:2645 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "\"%s\" 설정 파ì¼ì— 구성 í•­ëª©ì´ ì—†ìŒ" -#: libpq/hba.c:2768 -#, c-format -msgid "invalid regular expression \"%s\": %s" -msgstr "\"%s\" ì •ê·œì‹ì´ 잘못ë¨: %s" - -#: libpq/hba.c:2828 +#: libpq/hba.c:2798 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "\"%s\"ì— ëŒ€í•œ ì •ê·œì‹ ì¼ì¹˜ 실패: %s" -#: libpq/hba.c:2847 +#: libpq/hba.c:2822 #, c-format msgid "" "regular expression \"%s\" has no subexpressions as requested by " "backreference in \"%s\"" msgstr "\"%s\" ì •ê·œì‹ì—는 \"%s\"ì˜ backreferenceì—서 ìš”ì²­ëœ í•˜ìœ„ ì‹ì´ ì—†ìŒ" -#: libpq/hba.c:2943 +#: libpq/hba.c:2925 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "ì œê³µëœ ì‚¬ìš©ìž ì´ë¦„(%s) ë° ì¸ì¦ëœ ì‚¬ìš©ìž ì´ë¦„(%s)ì´ ì¼ì¹˜í•˜ì§€ 않ìŒ" -#: libpq/hba.c:2963 +#: libpq/hba.c:2945 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "" "\"%s\" 사용ìžë§µ 파ì¼ì— \"%s\" 사용ìžë¥¼ \"%s\" 사용ìžë¡œ ì¸ì¦í•  ì„¤ì •ì´ ì—†ìŒ" -#: libpq/hba.c:2996 +#: libpq/pqcomm.c:211 libpq/pqcomm.c:219 libpq/pqcomm.c:250 libpq/pqcomm.c:259 +#: libpq/pqcomm.c:1648 libpq/pqcomm.c:1693 libpq/pqcomm.c:1733 +#: libpq/pqcomm.c:1777 libpq/pqcomm.c:1816 libpq/pqcomm.c:1855 +#: libpq/pqcomm.c:1891 libpq/pqcomm.c:1930 #, c-format -msgid "could not open usermap file \"%s\": %m" -msgstr "\"%s\" 사용ìžë§µ 파ì¼ì„ ì—´ 수 없습니다: %m" +msgid "%s(%s) failed: %m" +msgstr "%s(%s) 실패: %m" -#: libpq/pqcomm.c:218 +#: libpq/pqcomm.c:296 #, c-format msgid "could not set socket to nonblocking mode: %m" msgstr "ì†Œì¼“ì„ nonblocking 모드로 지정할 수 ì—†ìŒ: %m" -#: libpq/pqcomm.c:372 +#: libpq/pqcomm.c:456 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "\"%s\" 유닉스 ë„ë©”ì¸ ì†Œì¼“ 경로가 너무 ê¹ë‹ˆë‹¤ (최대 %d ë°”ì´íЏ)" -#: libpq/pqcomm.c:393 +#: libpq/pqcomm.c:476 #, c-format msgid "could not translate host name \"%s\", service \"%s\" to address: %s" msgstr "호스트 ì´ë¦„ \"%s\", 서비스 \"%s\"를 변환할 수 없습니다. 주소 : %s" -#: libpq/pqcomm.c:397 +#: libpq/pqcomm.c:480 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "서비스 \"%s\"를 변환할 수 없습니다. 주소 : %s" -#: libpq/pqcomm.c:424 +#: libpq/pqcomm.c:502 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "최대 ì ‘ì†ìž 수 MAXLISTEN (%d) 초과로 ë” ì´ìƒ ì ‘ì†ì´ 불가능합니다" -#: libpq/pqcomm.c:433 +#: libpq/pqcomm.c:511 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:437 +#: libpq/pqcomm.c:514 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:442 +#: libpq/pqcomm.c:517 msgid "Unix" msgstr "유닉스" -#: libpq/pqcomm.c:447 +#: libpq/pqcomm.c:521 #, c-format msgid "unrecognized address family %d" msgstr "%d는 ì¸ì‹ë˜ì§€ 않는 가족 주소입니다" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:473 +#: libpq/pqcomm.c:545 #, c-format msgid "could not create %s socket for address \"%s\": %m" msgstr "%s 소켓 만들기 실패, ëŒ€ìƒ ì£¼ì†Œ: \"%s\": %m" -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:499 -#, c-format -msgid "setsockopt(SO_REUSEADDR) failed for %s address \"%s\": %m" -msgstr "%s setsockopt(SO_REUSEADDR) 실패, ëŒ€ìƒ ì£¼ì†Œ: \"%s\": %m" - -#. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:516 +#. translator: third %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:574 libpq/pqcomm.c:592 #, c-format -msgid "setsockopt(IPV6_V6ONLY) failed for %s address \"%s\": %m" -msgstr "%s setsockopt(IPV6_V6ONLY) 실패, ëŒ€ìƒ ì£¼ì†Œ: \"%s\": %m" +msgid "%s(%s) failed for %s address \"%s\": %m" +msgstr "%s(%s) 실패, ì—°ê²° 종류: %s, ëŒ€ìƒ ì£¼ì†Œ: \"%s\": %m" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:536 +#: libpq/pqcomm.c:615 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "%s ë°”ì¸ë“œ 실패, ëŒ€ìƒ ì£¼ì†Œ: \"%s\": %m" -#: libpq/pqcomm.c:539 +#: libpq/pqcomm.c:619 #, c-format -msgid "" -"Is another postmaster already running on port %d? If not, remove socket file " -"\"%s\" and retry." -msgstr "" -"다른 postmaster ê°€ í¬íЏ %dì—서 ì´ë¯¸ 실행중ì¸ê²ƒ 같습니다? 그렇지 않다면 소켓 " -"íŒŒì¼ \"%s\"ì„ ì œê±°í•˜ê³  다시 시ë„해보십시오" +msgid "Is another postmaster already running on port %d?" +msgstr "다른 postmaster ê°€ í¬íЏ %dì—서 ì´ë¯¸ 실행중ì¸ê²ƒ 같습니다?" -#: libpq/pqcomm.c:542 +#: libpq/pqcomm.c:621 #, c-format msgid "" "Is another postmaster already running on port %d? If not, wait a few seconds " @@ -14732,107 +17192,123 @@ msgstr "" "를 기다렸다가 다시 시ë„해보십시오." #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:575 +#: libpq/pqcomm.c:650 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "%s 리슨 실패, ëŒ€ìƒ ì£¼ì†Œ: \"%s\": %m" # translator: %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:584 +#: libpq/pqcomm.c:658 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "\"%s\" 유닉스 ë„ë©”ì¸ ì†Œì¼“ìœ¼ë¡œ ì ‘ì†ì„ 허용합니다" #. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:590 +#: libpq/pqcomm.c:663 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "%s, 주소: \"%s\", í¬íЏ %d 번으로 ì ‘ì†ì„ 허용합니다" -#: libpq/pqcomm.c:673 +#: libpq/pqcomm.c:753 #, c-format msgid "group \"%s\" does not exist" msgstr "\"%s\" 그룹 ì—†ìŒ" -#: libpq/pqcomm.c:683 +#: libpq/pqcomm.c:763 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "íŒŒì¼ \"%s\" ì˜ ê·¸ë£¹ì„ ì„¸íŒ…í•  수 없습니다: %m" -#: libpq/pqcomm.c:694 +#: libpq/pqcomm.c:774 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "íŒŒì¼ \"%s\" ì˜ í¼ë¯¸ì…˜ì„ 세팅할 수 없습니다: %m" -#: libpq/pqcomm.c:724 +#: libpq/pqcomm.c:803 #, c-format msgid "could not accept new connection: %m" msgstr "새로운 ì—°ê²°ì„ ìƒì„±í•  수 없습니다: %m" -#: libpq/pqcomm.c:914 +#: libpq/pqcomm.c:885 #, c-format msgid "there is no client connection" msgstr "í´ë¼ì´ì–¸íЏ ì—°ê²°ì´ ì—†ìŒ" -#: libpq/pqcomm.c:965 libpq/pqcomm.c:1061 +#: libpq/pqcomm.c:941 libpq/pqcomm.c:1042 #, c-format msgid "could not receive data from client: %m" msgstr "í´ë¼ì´ì–¸íЏì—게 ë°ì´í„°ë¥¼ ë°›ì„ ìˆ˜ 없습니다: %m" -#: libpq/pqcomm.c:1206 tcop/postgres.c:4142 +#: libpq/pqcomm.c:1149 tcop/postgres.c:4533 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "프로토콜 ë™ê¸°í™” 작업 실패로 ì—°ê²°ì„ ì¢…ë£Œí•©ë‹ˆë‹¤" -#: libpq/pqcomm.c:1272 +#: libpq/pqcomm.c:1215 #, c-format msgid "unexpected EOF within message length word" msgstr "예ìƒì¹˜ 못한 EOFê°€ ë©”ì‹œì§€ì˜ ê¸¸ì´ ì›Œë“œì•ˆì—서 ë°œìƒí–ˆìŠµë‹ˆë‹¤." -#: libpq/pqcomm.c:1283 +#: libpq/pqcomm.c:1225 #, c-format msgid "invalid message length" msgstr "ë©”ì‹œì§€ì˜ ê¸¸ì´ê°€ 유효하지 않습니다" -#: libpq/pqcomm.c:1305 libpq/pqcomm.c:1318 +#: libpq/pqcomm.c:1247 libpq/pqcomm.c:1260 #, c-format msgid "incomplete message from client" msgstr "í´ë¼ì´ì–¸íŠ¸ìœ¼ë¡œë¶€í„°ì˜ ì™„ì „í•˜ì§€ 못한 메시지입니다" -#: libpq/pqcomm.c:1451 +#: libpq/pqcomm.c:1401 #, c-format msgid "could not send data to client: %m" msgstr "í´ë¼ì´ì–¸íЏì—게 ë°ì´í„°ë¥¼ 보낼 수 없습니다: %m" -#: libpq/pqformat.c:406 +#: libpq/pqcomm.c:1616 +#, c-format +msgid "%s(%s) failed: error code %d" +msgstr "%s(%s) 실패: 오류 코드 %d" + +#: libpq/pqcomm.c:1705 +#, c-format +msgid "setting the keepalive idle time is not supported" +msgstr "keepalive idle time 지정하는 ê²ƒì€ ì§€ì›í•˜ì§€ 않ìŒ" + +#: libpq/pqcomm.c:1789 libpq/pqcomm.c:1864 libpq/pqcomm.c:1939 +#, c-format +msgid "%s(%s) not supported" +msgstr "%s(%s) ì§€ì›í•˜ì§€ 않ìŒ" + +#: libpq/pqformat.c:404 #, c-format msgid "no data left in message" msgstr "ë©”ì‹œì§€ì— ì•„ë¬´ëŸ° ë°ì´í„°ê°€ 없습니다" -#: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 -#: utils/adt/arrayfuncs.c:1471 utils/adt/rowtypes.c:567 +#: libpq/pqformat.c:515 libpq/pqformat.c:533 libpq/pqformat.c:554 +#: utils/adt/array_userfuncs.c:797 utils/adt/arrayfuncs.c:1481 +#: utils/adt/rowtypes.c:613 #, c-format msgid "insufficient data left in message" msgstr "부족한 ë°ì´í„°ëŠ” 메시지 ì•ˆì— ë„£ì–´ì ¸ 있습니다" -#: libpq/pqformat.c:597 libpq/pqformat.c:626 +#: libpq/pqformat.c:595 libpq/pqformat.c:624 #, c-format msgid "invalid string in message" msgstr "ë©”ì‹œì§€ì•ˆì— ìœ íš¨í•˜ì§€ ì•Šì€ ë¬¸ìžì—´ì´ 있습니다" -#: libpq/pqformat.c:642 +#: libpq/pqformat.c:640 #, c-format msgid "invalid message format" msgstr "메시지 í¬ë§·ì´ 유효하지 않습니다." # # search5 ë # # advance 부분 -#: main/main.c:246 +#: main/main.c:236 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: WSAStartup 작업 실패: %d\n" -#: main/main.c:310 +#: main/main.c:324 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -14841,7 +17317,7 @@ msgstr "" "%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL 서버입니다.\n" "\n" -#: main/main.c:311 +#: main/main.c:325 #, c-format msgid "" "Usage:\n" @@ -14852,115 +17328,107 @@ msgstr "" " %s [옵션]...\n" "\n" -#: main/main.c:312 +#: main/main.c:326 #, c-format msgid "Options:\n" msgstr "옵션들:\n" -#: main/main.c:313 +#: main/main.c:327 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS 공유 ë²„í¼ ê°œìˆ˜\n" -#: main/main.c:314 +#: main/main.c:328 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NAME=VALUE 실시간 매개 변수 지정\n" -#: main/main.c:315 +#: main/main.c:329 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C NAME 실시간 매개 변수 ê°’ì„ ë³´ì—¬ì£¼ê³  마침\n" -#: main/main.c:316 +#: main/main.c:330 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 디버깅 수준\n" -#: main/main.c:317 +#: main/main.c:331 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D DATADIR ë°ì´í„° 디렉터리\n" -#: main/main.c:318 +#: main/main.c:332 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e ë‚ ì§œ ìž…ë ¥ ì–‘ì‹ì´ 유럽형(DMY)ì„ ì‚¬ìš©í•¨\n" -#: main/main.c:319 +#: main/main.c:333 #, c-format msgid " -F turn fsync off\n" msgstr " -F fsync 기능 ë”\n" -#: main/main.c:320 +#: main/main.c:334 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h HOSTNAME 서버로 사용할 호스트 ì´ë¦„ ë˜ëŠ” IP\n" -#: main/main.c:321 +#: main/main.c:335 #, c-format -msgid " -i enable TCP/IP connections\n" -msgstr " -i TCP/IP ì—°ê²° 사용함\n" +msgid " -i enable TCP/IP connections (deprecated)\n" +msgstr " -i TCP/IP ì—°ê²° 사용함 (옛 버전 호환용)\n" -#: main/main.c:322 +#: main/main.c:336 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k DIRECTORY 유닉스 ë„ë©”ì¸ ì†Œì¼“ 위치\n" -#: main/main.c:324 +#: main/main.c:338 #, c-format msgid " -l enable SSL connections\n" msgstr " -l SSL ì—°ê²° 기능 사용함\n" -#: main/main.c:326 +#: main/main.c:340 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N MAX-CONNECT 최대 ë™ì‹œ ì—°ê²° 개수\n" -#: main/main.c:327 -#, c-format -msgid "" -" -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" -msgstr "" -" -o OPTIONS 개별 서버 프로세스를 \"OPTIONS\" 옵션으로 실행 (옛기" -"능)\n" - -#: main/main.c:328 +#: main/main.c:341 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT 서버 í¬íЏ 번호\n" -#: main/main.c:329 +#: main/main.c:342 #, c-format msgid " -s show statistics after each query\n" msgstr " -s ê° ì¿¼ë¦¬ ë’¤ì— í†µê³„ì •ë³´ë¥¼ 보여줌\n" -#: main/main.c:330 +#: main/main.c:343 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S WORK-MEM ì •ë ¬ìž‘ì—…ì— ì‚¬ìš©í•  메모리 í¬ê¸°(kb 단위)를 지정\n" -#: main/main.c:331 +#: main/main.c:344 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 ì •ë³´ 보여주고 마침\n" -#: main/main.c:332 +#: main/main.c:345 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAME=VALUE 실시간 매개 변수 지정\n" -#: main/main.c:333 +#: main/main.c:346 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config 서버 환경 ì„¤ì •ê°’ì— ëŒ€í•œ ì„¤ëª…ì„ ë³´ì—¬ì£¼ê³  마침\n" -#: main/main.c:334 +#: main/main.c:347 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: main/main.c:336 +#: main/main.c:349 #, c-format msgid "" "\n" @@ -14969,48 +17437,41 @@ msgstr "" "\n" "ê°œë°œìž ì˜µì…˜ë“¤:\n" -#: main/main.c:337 -#, c-format -msgid " -f s|i|n|m|h forbid use of some plan types\n" -msgstr " -f s|i|n|m|h 쿼리최ì í™”ê¸°ì˜ ê¸°ëŠ¥ì„ ì œí•œ 함\n" - -#: main/main.c:338 +#: main/main.c:350 #, c-format -msgid "" -" -n do not reinitialize shared memory after abnormal exit\n" -msgstr "" -" -n 비정ìƒì  종료 ë’¤ì— ê³µìœ  메모리를 초기화 하지 않ìŒ\n" +msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" +msgstr " -f s|i|o|b|t|n|m|h 쿼리최ì í™”ê¸°ì˜ ê¸°ëŠ¥ì„ ì œí•œ 함\n" -#: main/main.c:339 +#: main/main.c:351 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O 시스템 í…Œì´ë¸”ì˜ êµ¬ì¡°ë¥¼ 바꿀 수 있ë„ë¡ í•¨\n" -#: main/main.c:340 +#: main/main.c:352 #, c-format msgid " -P disable system indexes\n" msgstr " -P 시스템 ì¸ë±ìŠ¤ë“¤ì„ ì‚¬ìš©í•˜ì§€ 않ìŒ\n" -#: main/main.c:341 +#: main/main.c:353 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex ê° ì¿¼ë¦¬ ë‹¤ìŒ ìž‘ì—…ì‹œê°„ì„ ë³´ì—¬ì¤Œ\n" -#: main/main.c:342 +#: main/main.c:354 #, c-format msgid "" -" -T send SIGSTOP to all backend processes if one dies\n" +" -T send SIGABRT to all backend processes if one dies\n" msgstr "" " -T í•˜ë‚˜ì˜ í•˜ìœ„ 서버 프로세스가 비정ìƒìœ¼ë¡œ 마치며 모든\n" -" 다른 서버 프로세스ì—게 SIGSTOP 신호를 보냄\n" +" 다른 백엔드 프로세스ì—게 SIGABRT 신호를 보냄\n" -#: main/main.c:343 +#: main/main.c:355 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr "" " -W NUM 디버그 ìž‘ì—…ì„ ìœ„í•´ 지정한 숫ìžì˜ ì´ˆë§Œí¼ ê¸°ë‹¤ë¦°ë‹¤\n" -#: main/main.c:345 +#: main/main.c:357 #, c-format msgid "" "\n" @@ -15019,28 +17480,28 @@ msgstr "" "\n" "단ì¼ì‚¬ìš©ìž 모드ì—서 사용할 수 있는 옵션들:\n" -#: main/main.c:346 +#: main/main.c:358 #, c-format msgid "" " --single selects single-user mode (must be first argument)\n" msgstr " --single ë‹¨ì¼ ì‚¬ìš©ìž ëª¨ë“œ ì„ íƒ (ì¸ìžì˜ 첫번째로 와야함)\n" -#: main/main.c:347 +#: main/main.c:359 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME ë°ì´í„°ë² ì´ìФ ì´ë¦„ (초기값: 사용ìžì´ë¦„)\n" -#: main/main.c:348 +#: main/main.c:360 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 디버깅 수준\n" -#: main/main.c:349 +#: main/main.c:361 #, c-format msgid " -E echo statement before execution\n" msgstr " -E 실행하기 ì „ì— ìž‘ì—…ëª…ë ¹ì„ ì¶œë ¥í•¨\n" -#: main/main.c:350 +#: main/main.c:362 #, c-format msgid "" " -j do not use newline as interactive query delimiter\n" @@ -15048,14 +17509,14 @@ msgstr "" " -j 대화형 ì¿¼ë¦¬ì˜ ëª…ë ¹ 실행 구분 문ìžë¡œ 줄바꿈문ìžë¥¼ ì“°ì§€ 않" "ìŒ\n" -#: main/main.c:351 main/main.c:356 +#: main/main.c:363 main/main.c:369 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr "" " -r FILENAME stdout, stderr 쪽으로 보내는 ë‚´ìš©ì„ FILENAME 파ì¼ë¡œ 저장" "함\n" -#: main/main.c:353 +#: main/main.c:365 #, c-format msgid "" "\n" @@ -15064,25 +17525,25 @@ msgstr "" "\n" "부트스트랩 모드ì—서 사용할 수 있는 옵션들:\n" -#: main/main.c:354 +#: main/main.c:366 #, c-format msgid "" " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot 부트스트랩 모드로 실행 (첫번째 ì¸ìžë¡œ 와야함)\n" -#: main/main.c:355 +#: main/main.c:367 +#, c-format +msgid " --check selects check mode (must be first argument)\n" +msgstr " --check ì²´í¬ ëª¨ë“œ ì„ íƒ (첫번째 ì¸ìžë¡œ 와야함)\n" + +#: main/main.c:368 #, c-format msgid "" " DBNAME database name (mandatory argument in bootstrapping " "mode)\n" msgstr " DBNAME ë°ì´í„°ë² ì´ìФ ì´ë¦„ (부트스트랩 모드ì—서 필수)\n" -#: main/main.c:357 -#, c-format -msgid " -x NUM internal use\n" -msgstr " -x NUM ë‚´ë¶€ì ì¸ 옵션\n" - -#: main/main.c:359 +#: main/main.c:371 #, c-format msgid "" "\n" @@ -15099,12 +17560,12 @@ msgstr "" "\n" "ë¬¸ì œì  ë³´ê³  주소: <%s>\n" -#: main/main.c:363 +#: main/main.c:375 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페ì´ì§€: <%s>\n" -#: main/main.c:374 +#: main/main.c:386 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -15117,12 +17578,12 @@ msgstr "" "반드시 ì¼ë°˜ ì‚¬ìš©ìž ID(시스템 ê´€ë¦¬ìž ê¶Œí•œì´ ì—†ëŠ” ID)로 서버를 실행하십시오.\n" "Server를 어떻게 안전하게 기ë™í•˜ëŠ”ê°€ 하는 ê²ƒì€ ë¬¸ì„œë¥¼ 참조하시기 ë°”ëžë‹ˆë‹¤.\n" -#: main/main.c:391 +#: main/main.c:403 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: real ë˜ëŠ” effective user ID ë“¤ì€ ë°˜ë“œì‹œ ì¼ì¹˜ë˜ì–´ì•¼ 한다.\n" -#: main/main.c:398 +#: main/main.c:410 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -15146,25 +17607,30 @@ msgstr "\"%s\" ì´ë¦„ì˜ í™•ìž¥ê°€ëŠ¥í•œ 노드 í˜•ì´ ì´ë¯¸ 있습니다" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "\"%s\" ExtensibleNodeMethodsê°€ 등ë¡ë˜ì–´ 있지 않ìŒ" -#: nodes/nodeFuncs.c:122 nodes/nodeFuncs.c:153 parser/parse_coerce.c:2208 -#: parser/parse_coerce.c:2317 parser/parse_coerce.c:2352 -#: parser/parse_expr.c:2207 parser/parse_func.c:701 parser/parse_oper.c:967 -#: utils/fmgr/funcapi.c:528 +#: nodes/makefuncs.c:152 statistics/extended_stats.c:2310 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "\"%s\" 릴레ì´ì…˜ì— 해당하는 복합 ìžë£Œí˜•ì´ ì—†ìŒ" + +#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2567 +#: parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 +#: parser/parse_expr.c:2112 parser/parse_func.c:710 parser/parse_oper.c:869 +#: utils/fmgr/funcapi.c:669 #, c-format msgid "could not find array type for data type %s" msgstr "ìžë£Œí˜• %s ì— ëŒ€í•´ì„œëŠ” ë°°ì—´ ìžë£Œí˜•ì„ ì‚¬ìš©í•  수 없습니다" -#: nodes/params.c:359 +#: nodes/params.c:417 #, c-format msgid "portal \"%s\" with parameters: %s" -msgstr "" +msgstr "\"%s\" í¬íƒˆì˜ 매개 변수: %s" -#: nodes/params.c:362 +#: nodes/params.c:420 #, c-format msgid "unnamed portal with parameters: %s" -msgstr "" +msgstr "ì´ë¦„ 없는 í¬íƒˆì˜ 매개 변수: %s" -#: optimizer/path/joinrels.c:855 +#: optimizer/path/joinrels.c:972 #, c-format msgid "" "FULL JOIN is only supported with merge-joinable or hash-joinable join " @@ -15173,8 +17639,14 @@ msgstr "" "FULL JOIN êµ¬ë¬¸ì€ ë¨¸ì§€ ì¡°ì¸ì´ë‚˜, 해시 ì¡°ì¸ì´ 가능한 ìƒí™©ì—서만 사용할 수 있습" "니다" +#: optimizer/plan/createplan.c:7175 parser/parse_merge.c:203 +#: rewrite/rewriteHandler.c:1702 +#, c-format +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "\"%s\" 릴레ì´ì…˜ì—서 MERGE ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ" + #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1193 +#: optimizer/plan/initsplan.c:1407 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "" @@ -15182,97 +17654,92 @@ msgstr "" "다" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1922 parser/analyze.c:1639 parser/analyze.c:1855 -#: parser/analyze.c:2715 +#: optimizer/plan/planner.c:1380 parser/analyze.c:1771 parser/analyze.c:2029 +#: parser/analyze.c:3247 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s êµ¬ë¬¸ì€ UNION/INTERSECT/EXCEPT 예약어들과 함께 사용할 수 없습니다." -#: optimizer/plan/planner.c:2509 optimizer/plan/planner.c:4162 +#: optimizer/plan/planner.c:2121 optimizer/plan/planner.c:4108 #, c-format msgid "could not implement GROUP BY" msgstr "GROUP BY를 구현할 수 ì—†ìŒ" -#: optimizer/plan/planner.c:2510 optimizer/plan/planner.c:4163 -#: optimizer/plan/planner.c:4890 optimizer/prep/prepunion.c:1045 +#: optimizer/plan/planner.c:2122 optimizer/plan/planner.c:4109 +#: optimizer/plan/planner.c:4790 optimizer/prep/prepunion.c:1320 #, c-format msgid "" "Some of the datatypes only support hashing, while others only support " "sorting." msgstr "해싱만 ì§€ì›í•˜ëŠ” ìžë£Œí˜•ë„ ìžˆê³ , 정렬만 ì§€ì›í•˜ëŠ” ìžë£Œí˜•ë„ ìžˆìŠµë‹ˆë‹¤." -#: optimizer/plan/planner.c:4889 +#: optimizer/plan/planner.c:4789 #, c-format msgid "could not implement DISTINCT" msgstr "DISTINCT를 구현할 수 ì—†ìŒ" -#: optimizer/plan/planner.c:5737 +#: optimizer/plan/planner.c:6134 #, c-format msgid "could not implement window PARTITION BY" msgstr "ì°½ PARTITION BY를 구현할 수 ì—†ìŒ" -#: optimizer/plan/planner.c:5738 +#: optimizer/plan/planner.c:6135 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "ì°½ ë¶„í•  ì¹¼ëŸ¼ì€ ì •ë ¬ 가능한 ë°ì´í„° 형ì‹ì´ì–´ì•¼ 합니다." -#: optimizer/plan/planner.c:5742 +#: optimizer/plan/planner.c:6139 #, c-format msgid "could not implement window ORDER BY" msgstr "ì°½ ORDER BY를 구현할 수 ì—†ìŒ" -#: optimizer/plan/planner.c:5743 +#: optimizer/plan/planner.c:6140 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "ì°½ 순서 지정 ì¹¼ëŸ¼ì€ ì •ë ¬ 가능한 ë°ì´í„° 형ì‹ì´ì–´ì•¼ 합니다." -#: optimizer/plan/setrefs.c:451 -#, c-format -msgid "too many range table entries" -msgstr "너무 ë§Žì€ í…Œì´ë¸”ì´ ì‚¬ìš©ë˜ì—ˆìŠµë‹ˆë‹¤" - -#: optimizer/prep/prepunion.c:508 +#: optimizer/prep/prepunion.c:467 #, c-format msgid "could not implement recursive UNION" msgstr "재귀 UNIONì„ êµ¬í˜„í•  수 ì—†ìŒ" -#: optimizer/prep/prepunion.c:509 +#: optimizer/prep/prepunion.c:468 #, c-format msgid "All column datatypes must be hashable." msgstr "모든 ì—´ ë°ì´í„° 형ì‹ì€ 해시 가능해야 합니다." #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1044 +#: optimizer/prep/prepunion.c:1319 #, c-format msgid "could not implement %s" msgstr "%s êµ¬ë¬¸ì€ êµ¬í˜„í•  수 ì—†ìŒ" -#: optimizer/util/clauses.c:4746 +#: optimizer/util/clauses.c:4963 #, c-format msgid "SQL function \"%s\" during inlining" -msgstr "" +msgstr "\"%s\" SQL 함수를 ì¸ë¼ì¸ìœ¼ë¡œ 바꾸는 중" -#: optimizer/util/plancat.c:132 +#: optimizer/util/plancat.c:153 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "복구 작업 중ì—는 임시 í…Œì´ë¸”ì´ë‚˜, 언로그드 í…Œì´ë¸”ì„ ì ‘ê·¼í•  수 ì—†ìŒ" -#: optimizer/util/plancat.c:662 +#: optimizer/util/plancat.c:768 #, c-format msgid "whole row unique index inference specifications are not supported" -msgstr "" +msgstr "ì „ì²´ 로우 ìœ ë‹ˆí¬ ì¸ë±ìФ ì¸í„°íŽ˜ì´ìФ ê·œì•½ì€ ì§€ì›í•˜ì§€ 않습니다." -#: optimizer/util/plancat.c:679 +#: optimizer/util/plancat.c:785 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "ON CONFLICT 처리를 위해 ê´€ë ¨ëœ ì¸ë±ìŠ¤ê°€ 없습니다" -#: optimizer/util/plancat.c:729 +#: optimizer/util/plancat.c:835 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "제외 제약 ì¡°ê±´ì´ ìžˆì–´ ON CONFLICT DO UPDATE ìž‘ì—…ì€ í•  수 없습니다" -#: optimizer/util/plancat.c:834 +#: optimizer/util/plancat.c:945 #, c-format msgid "" "there is no unique or exclusion constraint matching the ON CONFLICT " @@ -15280,63 +17747,65 @@ msgid "" msgstr "" "ON CONFLICT ì ˆì„ ì‚¬ìš©í•˜ëŠ” 경우, unique 나 exclude 제약 ì¡°ê±´ì´ ìžˆì–´ì•¼ 함" -#: parser/analyze.c:705 parser/analyze.c:1401 +#: parser/analyze.c:824 parser/analyze.c:1550 #, c-format msgid "VALUES lists must all be the same length" msgstr "VALUES 목ë¡ì€ ëª¨ë‘ ê°™ì€ ê¸¸ì´ì—¬ì•¼ 함" -#: parser/analyze.c:904 +#: parser/analyze.c:1027 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT êµ¬ë¬¸ì— target columns 보다 ë” ë§Žì€ í‘œí˜„ì‹ì´ 존재하고 있다" -#: parser/analyze.c:922 +#: parser/analyze.c:1045 #, c-format msgid "INSERT has more target columns than expressions" msgstr "" "INSERT êµ¬ë¬¸ì— target columns 보다 ë” ë§Žì€ í‘œí˜„ì‹(expressions)ì´ ì¡´ìž¬í•˜ê³  있다" -#: parser/analyze.c:926 +#: parser/analyze.c:1049 #, c-format msgid "" "The insertion source is a row expression containing the same number of " "columns expected by the INSERT. Did you accidentally use extra parentheses?" msgstr "" +"삽입 소스는 INSERT 작업ì—서 기대하는 칼럼 수와 ê°™ì€ ë¡œìš° 표현ì‹ìž…니다. 실수" +"로 괄호를 추가한 ê²ƒì€ ì•„ë‹Œì§€ 확ì¸í•˜ì„¸ìš”." -#: parser/analyze.c:1210 parser/analyze.c:1612 +#: parser/analyze.c:1357 parser/analyze.c:1744 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO êµ¬ë¬¸ì€ ì—¬ê¸°ì„œëŠ” 사용할 수 ì—†ìŒ" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1542 parser/analyze.c:2894 +#: parser/analyze.c:1673 parser/analyze.c:3479 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s êµ¬ë¬¸ì€ VALUES ì— ì ìš©í•  수 ì—†ìŒ" -#: parser/analyze.c:1777 +#: parser/analyze.c:1911 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "UNION/INTERSECT/EXCEPT ORDER BY ì ˆì´ ìž˜ëª»ë¨" -#: parser/analyze.c:1778 +#: parser/analyze.c:1912 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "ê²°ê³¼ ì—´ ì´ë¦„ë§Œ 사용할 수 있고 ì‹ ë˜ëŠ” 함수는 사용할 수 없습니다." -#: parser/analyze.c:1779 +#: parser/analyze.c:1913 #, c-format msgid "" "Add the expression/function to every SELECT, or move the UNION into a FROM " "clause." msgstr "모든 SELECTì— ì‹/함수를 추가하거나 UNIONì„ FROM 절로 ì´ë™í•˜ì‹­ì‹œì˜¤." -#: parser/analyze.c:1845 +#: parser/analyze.c:2019 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO 는 UNION/INTERSECT/EXCEPT ì˜ ì²«ë²ˆì§¸ SELECT ì—ë§Œ 허용ëœë‹¤" -#: parser/analyze.c:1917 +#: parser/analyze.c:2091 #, c-format msgid "" "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of " @@ -15345,22 +17814,39 @@ msgstr "" "UNION/INTERSECT/EXCEPT 멤버 문ì—서 ê°™ì€ ì¿¼ë¦¬ ìˆ˜ì¤€ì˜ ë‹¤ë¥¸ 관계를 참조할 수 ì—†" "ìŒ" -#: parser/analyze.c:2004 +#: parser/analyze.c:2178 #, c-format msgid "each %s query must have the same number of columns" msgstr "ê°ê°ì˜ %s query 는 ê°™ì€ ìˆ˜ì˜ columns 를 가져야 한다." -#: parser/analyze.c:2426 +#: parser/analyze.c:2535 +#, c-format +msgid "SET target columns cannot be qualified with the relation name." +msgstr "SET ëŒ€ìƒ ì¹¼ëŸ¼ë“¤ì€ í•´ë‹¹ 릴레ì´ì…˜ ì´ë¦„으로 한정할 수 없습니다." + +#: parser/analyze.c:2589 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING ì ˆì—는 ì ì–´ë„ 하나 ì´ìƒì˜ ì¹¼ëŸ¼ì´ ìžˆì–´ì•¼ 합니다" -#: parser/analyze.c:2467 +#: parser/analyze.c:2692 +#, c-format +msgid "assignment source returned %d column" +msgid_plural "assignment source returned %d columns" +msgstr[0] "ì§€ì •ëœ ì†ŒìŠ¤ê°€ %dê°œì˜ ì¹¼ëŸ¼ì„ ë°˜í™˜í–ˆìŒ" + +#: parser/analyze.c:2753 +#, c-format +msgid "variable \"%s\" is of type %s but expression is of type %s" +msgstr "변수 \"%s\" 는 %s ìžë£Œí˜•ì¸ë° 표현ì‹ì€ %s ìžë£Œí˜•입니다." + +#. translator: %s is a SQL keyword +#: parser/analyze.c:2878 parser/analyze.c:2886 #, c-format -msgid "cannot specify both SCROLL and NO SCROLL" -msgstr "SCROLL ê³¼ NO SCROLL 둘다를 명시할 수 없다" +msgid "cannot specify both %s and %s" +msgstr "%s, %s 둘다를 명시할 수 없다" -#: parser/analyze.c:2486 +#: parser/analyze.c:2906 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "" @@ -15368,426 +17854,451 @@ msgstr "" "다" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2494 +#: parser/analyze.c:2914 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s êµ¬ë¬¸ì€ ì§€ì›ë˜ì§€ 않ìŒ" -#: parser/analyze.c:2497 +#: parser/analyze.c:2917 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "보류 가능 커서는 READ ONLY여야 합니다." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2505 +#: parser/analyze.c:2925 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s êµ¬ë¬¸ì€ ì§€ì›ë˜ì§€ 않ìŒ" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2516 +#: parser/analyze.c:2936 #, c-format -msgid "DECLARE INSENSITIVE CURSOR ... %s is not supported" -msgstr "DECLARE INSENSITIVE CURSOR ... %s êµ¬ë¬¸ì€ ì§€ì›ë˜ì§€ 않ìŒ" +msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" +msgstr "DECLARE INSENSITIVE CURSOR ... %s êµ¬ë¬¸ì´ ìž˜ëª»ë¨" -#: parser/analyze.c:2519 +#: parser/analyze.c:2939 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "민ê°í•˜ì§€ ì•Šì€ ì»¤ì„œëŠ” READ ONLY여야 합니다." -#: parser/analyze.c:2585 +#: parser/analyze.c:3033 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "" "êµ¬ì²´í™”ëœ ë·° ì •ì˜ì— 사용한 WITH ì ˆ 안ì—는 ìžë£Œ 변경 êµ¬ë¬¸ì´ ì—†ì–´ì•¼ 합니다" -#: parser/analyze.c:2595 +#: parser/analyze.c:3043 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "êµ¬ì²´í™”ëœ ë·°ëŠ” 임시 í…Œì´ë¸”ì´ë‚˜ 뷰를 사용할 수 없습니다" -#: parser/analyze.c:2605 +#: parser/analyze.c:3053 #, c-format msgid "materialized views may not be defined using bound parameters" -msgstr "" +msgstr "구체화딘 뷰는 바운드 매개 변수를 ì´ìš©í•´ì„œ ì •ì˜í•  수 없습니다" -#: parser/analyze.c:2617 +#: parser/analyze.c:3065 #, c-format msgid "materialized views cannot be unlogged" msgstr "êµ¬ì²´í™”ëœ ë·°ëŠ” UNLOGGED ì˜µì…˜ì„ ì‚¬ìš©í•  수 없습니다." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2722 +#: parser/analyze.c:3254 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s ì ˆì€ DISTINCT 절과 함께 사용할 수 없습니다" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2729 +#: parser/analyze.c:3261 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s ì ˆì€ GROUP BY 절과 함께 사용할 수 없습니다" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2736 +#: parser/analyze.c:3268 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s ì ˆì€ HAVING 절과 함께 사용할 수 없습니다" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2743 +#: parser/analyze.c:3275 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s ì ˆì€ ì§‘ê³„ 함수와 함께 사용할 수 없습니다" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2750 +#: parser/analyze.c:3282 #, c-format msgid "%s is not allowed with window functions" msgstr "%s ì ˆì€ ìœˆë„ìš° 함수와 함께 사용할 수 없습니다" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2757 +#: parser/analyze.c:3289 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "%s ì ˆì€ ëŒ€ìƒ ëª©ë¡ì—서 세트 반환 함수와 함께 사용할 수 없습니다." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2836 +#: parser/analyze.c:3388 #, c-format msgid "%s must specify unqualified relation names" msgstr "%s ì ˆì—는 unqualified 릴레ì´ì…˜ ì´ë¦„ì„ ì§€ì •í•´ì•¼ 합니다." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2867 +#: parser/analyze.c:3452 #, c-format msgid "%s cannot be applied to a join" msgstr "%s ì ˆì€ ì¡°ì¸ì„ ì ìš©í•  수 없습니다." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2876 +#: parser/analyze.c:3461 #, c-format msgid "%s cannot be applied to a function" msgstr "%s ì ˆì€ í•¨ìˆ˜ì— ì ìš©í•  수 없습니다." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2885 +#: parser/analyze.c:3470 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s ì ˆì€ í…Œì´ë¸” í•¨ìˆ˜ì— ì ìš©í•  수 없습니다." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2903 +#: parser/analyze.c:3488 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s ì ˆì€ WITH ì¿¼ë¦¬ì— ì ìš©í•  수 ì—†ìŒ" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2912 +#: parser/analyze.c:3497 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s ì ˆì€ named tuplestoreì— ì ìš©í•  수 ì—†ìŒ" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2932 +#: parser/analyze.c:3517 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "\"%s\" 릴레ì´ì…˜ (ëŒ€ìƒ êµ¬ë¬¸: %s) ì´ FROM ì ˆ ë‚´ì— ì—†ìŠµë‹ˆë‹¤" -#: parser/parse_agg.c:220 parser/parse_oper.c:222 +#: parser/parse_agg.c:210 parser/parse_oper.c:215 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "%s ìžë£Œí˜•ì—서 사용할 순서 정하는 ì—°ì‚°ìžë¥¼ ì°¾ì„ ìˆ˜ 없습니다." -#: parser/parse_agg.c:222 +#: parser/parse_agg.c:212 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "" "DISTINCT와 함께 작업하는 집계 ìž‘ì—…ì€ ê·¸ ìž…ë ¥ ìžë£Œê°€ ì •ë ¬ë  ìˆ˜ 있어야 합니다" -#: parser/parse_agg.c:257 +#: parser/parse_agg.c:270 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "GROUPING ì¸ìžë¡œëŠ” 32ê°œ ì´ë‚´ë¡œ 지정해야 합니다" -#: parser/parse_agg.c:360 +#: parser/parse_agg.c:373 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "JOIN 조건문ì—서는 집계 함수가 허용ë˜ì§€ 않습니다" -#: parser/parse_agg.c:362 +#: parser/parse_agg.c:375 msgid "grouping operations are not allowed in JOIN conditions" msgstr "JOIN 조건문ì—서는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_agg.c:374 +#: parser/parse_agg.c:385 msgid "" "aggregate functions are not allowed in FROM clause of their own query level" msgstr "집계 함수는 ìžì‹ ì˜ 쿼리 ìˆ˜ì¤€ì˜ FROM ì ˆì—서는 사용할 수 없습니다." -#: parser/parse_agg.c:376 +#: parser/parse_agg.c:387 msgid "" "grouping operations are not allowed in FROM clause of their own query level" -msgstr "" +msgstr "ìžì²´ 쿼리 ìˆ˜ì¤€ì˜ FROM ì ˆì—는 그룹핑 ìž‘ì—…ì„ í—ˆìš©í•˜ì§€ 않습니다." -#: parser/parse_agg.c:381 +#: parser/parse_agg.c:392 msgid "aggregate functions are not allowed in functions in FROM" msgstr "FROM ì ˆ ë‚´ì˜ í•¨ìˆ˜ í‘œí˜„ì‹ ë‚´ì—서는 집계 함수를 사용할 수 없습니다" -#: parser/parse_agg.c:383 +#: parser/parse_agg.c:394 msgid "grouping operations are not allowed in functions in FROM" msgstr "FROM ì ˆ ë‚´ì˜ í•¨ìˆ˜ í‘œí˜„ì‹ ë‚´ì—서는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_agg.c:391 +#: parser/parse_agg.c:402 msgid "aggregate functions are not allowed in policy expressions" msgstr "ì •ì±… 표현ì‹ì—서는 집계 함수 ì‚¬ìš©ì„ í—ˆìš©í•˜ì§€ 않습니다" -#: parser/parse_agg.c:393 +#: parser/parse_agg.c:404 msgid "grouping operations are not allowed in policy expressions" msgstr "ì •ì±… 표현ì‹ì—서는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_agg.c:410 +#: parser/parse_agg.c:421 msgid "aggregate functions are not allowed in window RANGE" msgstr "윈ë„ìš° RANGE 안ì—서는 집계 함수를 사용할 수 없습니다" -#: parser/parse_agg.c:412 +#: parser/parse_agg.c:423 msgid "grouping operations are not allowed in window RANGE" msgstr "윈ë„ìš° RANGE 안ì—서는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_agg.c:417 +#: parser/parse_agg.c:428 msgid "aggregate functions are not allowed in window ROWS" msgstr "윈ë„ìš° ROWS 안ì—서는 집계 함수를 사용할 수 없습니다" -#: parser/parse_agg.c:419 +#: parser/parse_agg.c:430 msgid "grouping operations are not allowed in window ROWS" msgstr "윈ë„ìš° ROWS 안ì—서는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_agg.c:424 +#: parser/parse_agg.c:435 msgid "aggregate functions are not allowed in window GROUPS" msgstr "윈ë„ìš° GROUPS 안ì—서는 집계 함수를 사용할 수 없습니다" -#: parser/parse_agg.c:426 +#: parser/parse_agg.c:437 msgid "grouping operations are not allowed in window GROUPS" msgstr "윈ë„ìš° GROUPS 안ì—서는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_agg.c:460 +#: parser/parse_agg.c:450 +msgid "aggregate functions are not allowed in MERGE WHEN conditions" +msgstr "MERGE WHEN ì¡°ê±´ì ˆì— ì§‘ê³„ 함수가 허용ë˜ì§€ 않습니다" + +#: parser/parse_agg.c:452 +msgid "grouping operations are not allowed in MERGE WHEN conditions" +msgstr "MERGE WHEN ì¡°ê±´ì ˆì— ê·¸ë£¹í•‘ ìž‘ì—…ì´ í—ˆìš©ë˜ì§€ 않습니다" + +#: parser/parse_agg.c:479 msgid "aggregate functions are not allowed in check constraints" msgstr "ì²´í¬ ì œì•½ ì¡°ê±´ì—서는 집계 함수를 사용할 수 없습니다" -#: parser/parse_agg.c:462 +#: parser/parse_agg.c:481 msgid "grouping operations are not allowed in check constraints" msgstr "ì²´í¬ ì œì•½ ì¡°ê±´ì—서는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_agg.c:469 +#: parser/parse_agg.c:488 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "DEFAULT 표현ì‹ì—서는 집계 함수를 사용할 수 없습니다" -#: parser/parse_agg.c:471 +#: parser/parse_agg.c:490 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "DEFAULT 표현ì‹ì—서는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_agg.c:476 +#: parser/parse_agg.c:495 msgid "aggregate functions are not allowed in index expressions" msgstr "ì¸ë±ìФ 표현ì‹ì—서는 집계 함수를 사용할 수 없습니다" -#: parser/parse_agg.c:478 +#: parser/parse_agg.c:497 msgid "grouping operations are not allowed in index expressions" msgstr "ì¸ë±ìФ 표현ì‹ì—서는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_agg.c:483 +#: parser/parse_agg.c:502 msgid "aggregate functions are not allowed in index predicates" msgstr "집계 함수는 함수 기반 ì¸ë±ìŠ¤ì˜ í•¨ìˆ˜ë¡œ 사용할 수 없습니다" -#: parser/parse_agg.c:485 +#: parser/parse_agg.c:504 msgid "grouping operations are not allowed in index predicates" msgstr "그룹핑 ìž‘ì—…ì€ í•¨ìˆ˜ 기반 ì¸ë±ìŠ¤ì˜ í•¨ìˆ˜ë¡œ 사용할 수 없습니다" -#: parser/parse_agg.c:490 +#: parser/parse_agg.c:509 +msgid "aggregate functions are not allowed in statistics expressions" +msgstr "ì •ì±… 표현ì‹ì—서는 집계 함수 ì‚¬ìš©ì„ í—ˆìš©í•˜ì§€ 않습니다" + +#: parser/parse_agg.c:511 +msgid "grouping operations are not allowed in statistics expressions" +msgstr "통계 ì •ë³´ 표현ì‹ì—서는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" + +#: parser/parse_agg.c:516 msgid "aggregate functions are not allowed in transform expressions" msgstr "transform ì‹(expression)ì— ì§‘ê³„ 함수를 사용할 수 없습니다" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:518 msgid "grouping operations are not allowed in transform expressions" msgstr "transform ì‹(expression)ì— ê·¸ë£¹í•‘ 작업를 사용할 수 없습니다" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:523 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "EXECUTE 매개 변수로 집계 함수를 사용할 수 없습니다" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:525 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "EXECUTE 매개 변수로 그룹핑 ìž‘ì—…ì„ ì‚¬ìš©í•  수 없습니다" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:530 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "íŠ¸ë¦¬ê±°ì˜ WHEN ì¡°ê±´ì ˆì— ì§‘ê³„ 함수가 허용ë˜ì§€ 않습니다" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:532 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "íŠ¸ë¦¬ê±°ì˜ WHEN ì¡°ê±´ì ˆì— ê·¸ë£¹í•‘ ìž‘ì—…ì´ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:537 msgid "aggregate functions are not allowed in partition bound" msgstr "파티션 범위 표현ì‹ì—는 집계 함수가 허용ë˜ì§€ 않습니다" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:539 msgid "grouping operations are not allowed in partition bound" msgstr "파티션 범위 표현ì‹ì—는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:544 msgid "aggregate functions are not allowed in partition key expressions" msgstr "파티션 키 표현ì‹ì—서는 집계 함수가 허용ë˜ì§€ 않습니다" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:546 msgid "grouping operations are not allowed in partition key expressions" msgstr "파티션 키 표현ì‹ì—서는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_agg.c:526 +#: parser/parse_agg.c:552 msgid "aggregate functions are not allowed in column generation expressions" msgstr "미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ 표현ì‹ì—서는 집계 함수 ì‚¬ìš©ì„ í—ˆìš©í•˜ì§€ 않습니다" -#: parser/parse_agg.c:528 +#: parser/parse_agg.c:554 msgid "grouping operations are not allowed in column generation expressions" msgstr "미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ 표현ì‹ì—서는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_agg.c:534 +#: parser/parse_agg.c:560 msgid "aggregate functions are not allowed in CALL arguments" msgstr "CALL 매개 변수로 집계 함수를 사용할 수 없습니다" -#: parser/parse_agg.c:536 +#: parser/parse_agg.c:562 msgid "grouping operations are not allowed in CALL arguments" msgstr "CALL 매개 변수로 그룹핑 ì—°ì‚°ì„ ì‚¬ìš©í•  수 없습니다" -#: parser/parse_agg.c:542 +#: parser/parse_agg.c:568 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "COPY FROM WHERE 조건문ì—서는 집계 함수가 허용ë˜ì§€ 않습니다" -#: parser/parse_agg.c:544 +#: parser/parse_agg.c:570 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "COPY FROM WHERE 조건문ì—서는 그룹핑 ì—°ì‚°ì´ í—ˆìš©ë˜ì§€ 않습니다" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:567 parser/parse_clause.c:1828 +#: parser/parse_agg.c:597 parser/parse_clause.c:1962 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "집계 함수는 %s ì ˆì—서 사용할 수 없습니다." #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:570 +#: parser/parse_agg.c:600 #, c-format msgid "grouping operations are not allowed in %s" msgstr "그룹핑 ìž‘ì—…ì€ %s ì ˆì—서 사용할 수 없습니다." -#: parser/parse_agg.c:678 +#: parser/parse_agg.c:701 #, c-format msgid "" "outer-level aggregate cannot contain a lower-level variable in its direct " "arguments" msgstr "" +"출력 수준 집계는 ê·¸ ì§ì ‘ì ì¸ ì¸ìž ì•ˆì— ì €ìˆ˜ì¤€ 변수를 í¬í•¨í•  수 없습니다." -#: parser/parse_agg.c:757 +#: parser/parse_agg.c:779 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "집계 함수 í˜¸ì¶œì€ ì§‘í•© 반환 함수 í˜¸ì¶œì„ í¬í•¨í•  수 ì—†ìŒ" -#: parser/parse_agg.c:758 parser/parse_expr.c:1845 parser/parse_expr.c:2332 -#: parser/parse_func.c:872 +#: parser/parse_agg.c:780 parser/parse_expr.c:1762 parser/parse_expr.c:2245 +#: parser/parse_func.c:885 #, c-format msgid "" "You might be able to move the set-returning function into a LATERAL FROM " "item." msgstr "ì§‘í•© 반환 함수를 LATERAL FROM 쪽으로 옮겨서 구현할 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." -#: parser/parse_agg.c:763 +#: parser/parse_agg.c:785 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "집계 함수 í˜¸ì¶œì€ ìœˆë„ìš° 함수 í˜¸ì¶œì„ í¬í•¨í•  수 ì—†ìŒ" -#: parser/parse_agg.c:842 +#: parser/parse_agg.c:864 msgid "window functions are not allowed in JOIN conditions" msgstr "윈ë„ìš° 함수는 JOIN ì¡°ê±´ì— ì‚¬ìš©í•  수 ì—†ìŒ" -#: parser/parse_agg.c:849 +#: parser/parse_agg.c:871 msgid "window functions are not allowed in functions in FROM" msgstr "윈ë„ìš° 함수는 FROM ì ˆì— ìžˆëŠ” 함수로 사용할 수 ì—†ìŒ" -#: parser/parse_agg.c:855 +#: parser/parse_agg.c:877 msgid "window functions are not allowed in policy expressions" msgstr "윈ë„ìš° 함수는 ì •ì±… ì‹ì— 사용할 수 ì—†ìŒ" -#: parser/parse_agg.c:868 +#: parser/parse_agg.c:890 msgid "window functions are not allowed in window definitions" msgstr "윈ë„ìš° 함수는 윈ë„ìš° 함수 ì •ì˜ì— 사용할 수 ì—†ìŒ" -#: parser/parse_agg.c:900 +#: parser/parse_agg.c:901 +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "윈ë„ìš° 함수는 MERGE WHEN ì¡°ê±´ì ˆì—서 사용할 수 ì—†ìŒ" + +#: parser/parse_agg.c:926 msgid "window functions are not allowed in check constraints" msgstr "윈ë„ìš° 함수는 check ì œì•½ì¡°ê±´ì— ì‚¬ìš©í•  수 ì—†ìŒ" -#: parser/parse_agg.c:904 +#: parser/parse_agg.c:930 msgid "window functions are not allowed in DEFAULT expressions" msgstr "윈ë„ìš° 함수는 DEFAULT ì‹ì—서 사용할 수 ì—†ìŒ" -#: parser/parse_agg.c:907 +#: parser/parse_agg.c:933 msgid "window functions are not allowed in index expressions" msgstr "윈ë„ìš° 함수는 ì¸ë±ìФ ì‹ì—서 사용할 수 ì—†ìŒ" -#: parser/parse_agg.c:910 +#: parser/parse_agg.c:936 +msgid "window functions are not allowed in statistics expressions" +msgstr "윈ë„ìš° 함수는 통계 ì •ë³´ì‹ì— 사용할 수 ì—†ìŒ" + +#: parser/parse_agg.c:939 msgid "window functions are not allowed in index predicates" msgstr "윈ë„ìš° 함수는 함수 기반 ì¸ë±ìФì—서 사용할 수 ì—†ìŒ" -#: parser/parse_agg.c:913 +#: parser/parse_agg.c:942 msgid "window functions are not allowed in transform expressions" msgstr "윈ë„ìš° 함수는 transform ì‹ì—서 사용할 수 ì—†ìŒ" -#: parser/parse_agg.c:916 +#: parser/parse_agg.c:945 msgid "window functions are not allowed in EXECUTE parameters" msgstr "윈ë„ìš° 함수는 EXECUTE 매개 변수 설정 값으로 사용할 수 ì—†ìŒ" -#: parser/parse_agg.c:919 +#: parser/parse_agg.c:948 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "윈ë„ìš° 함수는 íŠ¸ë¦¬ê±°ì˜ WHEN ì¡°ê±´ì ˆì—서 사용할 수 ì—†ìŒ" -#: parser/parse_agg.c:922 +#: parser/parse_agg.c:951 msgid "window functions are not allowed in partition bound" msgstr "윈ë„ìš° 함수는 파티션 범위 표현ì‹ì—서 사용할 수 ì—†ìŒ" -#: parser/parse_agg.c:925 +#: parser/parse_agg.c:954 msgid "window functions are not allowed in partition key expressions" msgstr "윈ë„ìš° 함수는 파티션 키 표현ì‹ì—서 사용할 수 ì—†ìŒ" -#: parser/parse_agg.c:928 +#: parser/parse_agg.c:957 msgid "window functions are not allowed in CALL arguments" msgstr "윈ë„ìš° 함수는 CALL 매개 변수 설정 값으로 사용할 수 ì—†ìŒ" -#: parser/parse_agg.c:931 +#: parser/parse_agg.c:960 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "윈ë„ìš° 함수는 COPY FROM WHERE ì¡°ê±´ì— ì‚¬ìš©í•  수 ì—†ìŒ" -#: parser/parse_agg.c:934 +#: parser/parse_agg.c:963 msgid "window functions are not allowed in column generation expressions" msgstr "윈ë„ìš° 함수는 미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ ìƒì„± 표현ì‹ì— 사용할 수 ì—†ìŒ" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:954 parser/parse_clause.c:1837 +#: parser/parse_agg.c:986 parser/parse_clause.c:1971 #, c-format msgid "window functions are not allowed in %s" msgstr "%s 안ì—서는 윈ë„ìš° 함수를 사용할 수 ì—†ìŒ" -#: parser/parse_agg.c:988 parser/parse_clause.c:2671 +#: parser/parse_agg.c:1020 parser/parse_clause.c:2804 #, c-format msgid "window \"%s\" does not exist" msgstr "\"%s\" 윈ë„ìš° 함수가 ì—†ìŒ" -#: parser/parse_agg.c:1072 +#: parser/parse_agg.c:1108 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "너무 ë§Žì€ ê·¸ë£¹í•‘ 세트가 있습니다 (최대값 4096)" -#: parser/parse_agg.c:1212 +#: parser/parse_agg.c:1248 #, c-format msgid "" "aggregate functions are not allowed in a recursive query's recursive term" msgstr "집계 함수는 재귀 ì¿¼ë¦¬ì˜ ìž¬ê·€ ì¡°ê±´ì— ì‚¬ìš©í•  수 ì—†ìŒ" -#: parser/parse_agg.c:1405 +#: parser/parse_agg.c:1441 #, c-format msgid "" "column \"%s.%s\" must appear in the GROUP BY clause or be used in an " @@ -15796,216 +18307,214 @@ msgstr "" "column \"%s.%s\" 는 반드시 GROUP BY ì ˆë‚´ì— ìžˆì–´ì•¼ 하ë˜ì§€ ë˜ëŠ” 집계 함수 ë‚´ì—" "서 사용ë˜ì–´ì ¸ì•¼ 한다" -#: parser/parse_agg.c:1408 +#: parser/parse_agg.c:1444 #, c-format msgid "" "Direct arguments of an ordered-set aggregate must use only grouped columns." -msgstr "" +msgstr "순서있는 ì§‘í•© 집계 í•¨ìˆ˜ì˜ ì§ì ‘ ì¸ìžëŠ” ê·¸ë£¹í™”ëœ ì¹¼ëŸ¼ë§Œ 사용해야합니다." -#: parser/parse_agg.c:1413 +#: parser/parse_agg.c:1449 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "" "subquery ê°€ outer query ì—서 그룹화 ë˜ì§€ ì•Šì€ ì—´ì¸ \"%s.%s\"를 사용합니다" -#: parser/parse_agg.c:1577 +#: parser/parse_agg.c:1613 #, c-format msgid "" "arguments to GROUPING must be grouping expressions of the associated query " "level" -msgstr "" +msgstr "GROUPINGì˜ ì¸ìžëŠ” ê·¸ 관련 쿼리 ìˆ˜ì¤€ì˜ ê·¸ë£¹í•‘ 표현ì‹ì´ì–´ì•¼ 합니다." -#: parser/parse_clause.c:191 +#: parser/parse_clause.c:193 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "\"%s\" 릴레ì´ì…˜ì€ ìžë£Œ 변경 êµ¬ë¬¸ì˜ ëŒ€ìƒì´ ë  ìˆ˜ ì—†ìŒ" -#: parser/parse_clause.c:571 parser/parse_clause.c:599 parser/parse_func.c:2424 +#: parser/parse_clause.c:569 parser/parse_clause.c:597 parser/parse_func.c:2553 #, c-format msgid "set-returning functions must appear at top level of FROM" -msgstr "" +msgstr "ì§‘í•© 변환 함수는 FROM ì ˆì˜ ìµœìƒìœ„ 수준ì—서만 사용할 수 있습니다." -#: parser/parse_clause.c:611 +#: parser/parse_clause.c:609 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "다중 칼럼 ì •ì˜ ëª©ë¡ì€ ê°™ì€ í•¨ìˆ˜ìš©ìœ¼ë¡œ 허용하지 않ìŒ" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:642 #, c-format msgid "" "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "" +"여러 함수를 사용하는 ROWS FROM() 구문ì—는 칼럼 ì •ì˜ ëª©ë¡ì„ 지정하면 안ë©ë‹ˆë‹¤." -#: parser/parse_clause.c:645 +#: parser/parse_clause.c:643 #, c-format msgid "" "Put a separate column definition list for each function inside ROWS FROM()." -msgstr "" +msgstr "ROWS FROM() 안 ê° í•¨ìˆ˜ìš© 칼럼 ì •ì˜ ëª©ë¡ì„ 구분해 주세요." -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:649 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "" +"여러 ì¸ìžë¥¼ 사용하는 UNNEST()ì—서는 칼럼 ì •ì˜ ëª©ë¡ì„ 사용할 수 없습니다." -#: parser/parse_clause.c:652 +#: parser/parse_clause.c:650 #, c-format msgid "" "Use separate UNNEST() calls inside ROWS FROM(), and attach a column " "definition list to each one." msgstr "" +"ROWS FROM() ì•ˆì— UNNEST() í˜¸ì¶œì„ ë¶„ë¦¬í•˜ê³ , ê°ê° 칼럼 ì •ì˜ ëª©ë¡ì„ 추가하세요." -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:657 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY êµ¬ë¬¸ì€ ì¹¼ëŸ¼ ì •ì˜ ëª©ë¡ê³¼ 함께 쓸 수 없습니다." -#: parser/parse_clause.c:660 +#: parser/parse_clause.c:658 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "ROWS FROM() ì•ˆì— ì¹¼ëŸ¼ ì •ì˜ ëª©ë¡ì„ 넣으세요." -#: parser/parse_clause.c:760 +#: parser/parse_clause.c:762 parser/parse_jsontable.c:295 #, c-format msgid "only one FOR ORDINALITY column is allowed" -msgstr "" +msgstr "í•˜ë‚˜ì˜ FOR ORDINALITY 칼럼만 허용합니다." -#: parser/parse_clause.c:821 +#: parser/parse_clause.c:823 #, c-format msgid "column name \"%s\" is not unique" msgstr "\"%s\" ì¹¼ëŸ¼ì€ ìœ ì¼ì„±ì„ 가지지 못합니다(not unique)" -#: parser/parse_clause.c:863 +#: parser/parse_clause.c:865 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "\"%s\" 네임스페ì´ìŠ¤ëŠ” 유ì¼ì„±ì„ 가지지 못합니다(not unique)" -#: parser/parse_clause.c:873 +#: parser/parse_clause.c:875 #, c-format msgid "only one default namespace is allowed" msgstr "기본 네임스페ì´ìŠ¤ëŠ” 하나만 허용합니다" -#: parser/parse_clause.c:933 +#: parser/parse_clause.c:935 #, c-format msgid "tablesample method %s does not exist" msgstr "\"%s\" í…Œì´ë¸” ìƒ˜í”Œë§ ë°©ë²•ì´ ì—†ìŠµë‹ˆë‹¤" -#: parser/parse_clause.c:955 +#: parser/parse_clause.c:957 #, c-format msgid "tablesample method %s requires %d argument, not %d" msgid_plural "tablesample method %s requires %d arguments, not %d" msgstr[0] "\"%s\" í…Œì´ë¸” ìƒ˜í”Œë§ ë°©ë²• %dê°œ ì¸ìžë¥¼ 지정해야함, (현재 %dê°œ)" -#: parser/parse_clause.c:989 +#: parser/parse_clause.c:991 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "\"%s\" í…Œì´ë¸” ìƒ˜í”Œë§ ë°©ë²•ì€ REPEATABLE ì˜µì…˜ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: parser/parse_clause.c:1135 +#: parser/parse_clause.c:1144 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "TABLESAMPLE ì ˆì€ í…Œì´ë¸”ê³¼ êµ¬ì²´í™”ëœ ë·°ì—서만 사용할 수 있습니다" -#: parser/parse_clause.c:1318 +#: parser/parse_clause.c:1331 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "USING ì ˆ ë‚´ì— ì—´ ì´ë¦„ \"%s\" ê°€ 한번 ì´ìƒ 사용ë˜ì—ˆìŠµë‹ˆë‹¤" -#: parser/parse_clause.c:1333 +#: parser/parse_clause.c:1346 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "left table ë‚´ì— common column ì´ë¦„ \"%s\" ê°€ 한번 ì´ìƒ 사용ë˜ì—ˆë‹¤" -#: parser/parse_clause.c:1342 +#: parser/parse_clause.c:1355 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "USING ì¡°ê±´ì ˆì—서 지정한 \"%s\" ì¹¼ëŸ¼ì´ ì™¼ìª½ í…Œì´ë¸”ì— ì—†ìŒ" -#: parser/parse_clause.c:1357 +#: parser/parse_clause.c:1370 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "common column name \"%s\"ê°€ right table ì— í•œë²ˆ ì´ìƒ 사용ë˜ì—ˆë‹¤" -#: parser/parse_clause.c:1366 +#: parser/parse_clause.c:1379 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "USING ì¡°ê±´ì ˆì—서 지정한 \"%s\" ì¹¼ëŸ¼ì´ ì˜¤ë¥¸ìª½ í…Œì´ë¸”ì— ì—†ìŒ" -#: parser/parse_clause.c:1447 -#, c-format -msgid "column alias list for \"%s\" has too many entries" -msgstr " \"%s\" 를 위한 ì—´ alias list ì— ë„ˆë¬´ ë§Žì€ entry ê°€ í¬í•¨ë˜ì–´ 있다" - -#: parser/parse_clause.c:1773 +#: parser/parse_clause.c:1907 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" -msgstr "" +msgstr "FETCH FIRST ... WITH TIES ì ˆ ì•ˆì— ë¡œìš°ê°€ null ì´ë©´ 안ë©ë‹ˆë‹¤." #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1798 +#: parser/parse_clause.c:1932 #, c-format msgid "argument of %s must not contain variables" msgstr "%s ì˜ ì¸ìžë¡œ 변수를 í¬í•¨í•  수 없습니다." #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1963 +#: parser/parse_clause.c:2097 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "%s \"%s\" ê°€ 명확하지 ì•Šì€ í‘œí˜„ìž…ë‹ˆë‹¤." #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1992 +#: parser/parse_clause.c:2125 #, c-format msgid "non-integer constant in %s" msgstr "정수가 아닌 ìƒìˆ˜ê°€ %s ì— í¬í•¨ë˜ì–´ 있습니다" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2014 +#: parser/parse_clause.c:2147 #, c-format msgid "%s position %d is not in select list" msgstr "%s position %d ê°€ select list ì— í¬í•¨ë˜ì–´ 있지 않습니다" -#: parser/parse_clause.c:2453 +#: parser/parse_clause.c:2586 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE ì¸ìžë¡œëŠ” 12ê°œ ì´í•˜ì˜ ì¸ìžë§Œ 허용합니다" -#: parser/parse_clause.c:2659 +#: parser/parse_clause.c:2792 #, c-format msgid "window \"%s\" is already defined" msgstr "\"%s\" ì´ë¦„ì˜ ìœˆë„ìš° 함수가 ì´ë¯¸ ì •ì˜ë¨" -#: parser/parse_clause.c:2720 +#: parser/parse_clause.c:2853 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "\"%s\" ì°½ì˜ PARTITION BY ì ˆì„ ìž¬ì •ì˜í•  수 ì—†ìŒ" -#: parser/parse_clause.c:2732 +#: parser/parse_clause.c:2865 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "\"%s\" ì°½ì˜ ORDER BY ì ˆì„ ìž¬ì •ì˜í•  수 ì—†ìŒ" -#: parser/parse_clause.c:2762 parser/parse_clause.c:2768 +#: parser/parse_clause.c:2895 parser/parse_clause.c:2901 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "프래임 ì ˆì´ ìžˆì–´, \"%s\" 윈ë„우를 복사할 수 ì—†ìŒ." -#: parser/parse_clause.c:2770 +#: parser/parse_clause.c:2903 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "OVER ì ˆì— ê´„í˜¸ê°€ 빠졌ìŒ" -#: parser/parse_clause.c:2790 +#: parser/parse_clause.c:2923 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" -msgstr "" +msgstr "PRECEDING/FOLLOWING 옵셋용 RANGE는 í•˜ë‚˜ì˜ ORDER BY ì¹¼ëŸ¼ì´ í•„ìš”í•©ë‹ˆë‹¤." -#: parser/parse_clause.c:2813 +#: parser/parse_clause.c:2946 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "GROUPS 모드는 ORDER BY êµ¬ë¬¸ì´ í•„ìš”í•¨" -#: parser/parse_clause.c:2883 +#: parser/parse_clause.c:3016 #, c-format msgid "" "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument " @@ -16014,317 +18523,358 @@ msgstr "" "DISTINCT, ORDER BY 표현ì‹ì„ 집계 함수와 쓸 때는, 반드시 select list ì— ë‚˜íƒ€ë‚˜" "야만 합니다" -#: parser/parse_clause.c:2884 +#: parser/parse_clause.c:3017 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "" "SELECT DISTINCT, ORDER BY 표현ì‹ì„ 위해서 반드시 select list ì— ë‚˜íƒ€ë‚˜ì•¼ë§Œ í•©" "니다" -#: parser/parse_clause.c:2916 +#: parser/parse_clause.c:3049 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "DISTINCT 예약어로 집계를 í•  경우 ì ì–´ë„ í•˜ë‚˜ì˜ ì¸ìžëŠ” 있어야 함" -#: parser/parse_clause.c:2917 +#: parser/parse_clause.c:3050 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT êµ¬ë¬¸ì€ ì ì–´ë„ 한 ê°œ ì´ìƒì˜ ì¹¼ëŸ¼ì´ ìžˆì–´ì•¼ 합니다" -#: parser/parse_clause.c:2983 parser/parse_clause.c:3015 +#: parser/parse_clause.c:3116 parser/parse_clause.c:3148 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "" "SELECT DISTINCT ON 표현ì‹ì€ 반드시 초기 ORDER BY 표현ì‹ê³¼ ì¼ì¹˜í•˜ì—¬ì•¼ 한다" -#: parser/parse_clause.c:3093 +#: parser/parse_clause.c:3226 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC 예약어는 ON CONFLICT 절과 함께 사용할 수 없습니다." -#: parser/parse_clause.c:3099 +#: parser/parse_clause.c:3232 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST ì ˆì€ ON CONFLICT 절과 함께 사용할 수 없습니다." -#: parser/parse_clause.c:3178 +#: parser/parse_clause.c:3311 #, c-format msgid "" "ON CONFLICT DO UPDATE requires inference specification or constraint name" -msgstr "" +msgstr "ON CONFLICT DO UPDATE 구문ì—는 추론 명세나 제약조건 ì´ë¦„ì´ í•„ìš”í•©ë‹ˆë‹¤." -#: parser/parse_clause.c:3179 +#: parser/parse_clause.c:3312 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "사용예, ON CONFLICT (칼럼ì´ë¦„)." -#: parser/parse_clause.c:3190 +#: parser/parse_clause.c:3323 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT ì ˆì€ ì‹œìŠ¤í…œ 카탈로그 í…Œì´ë¸”ì—서는 사용할 수 없습니다" -#: parser/parse_clause.c:3198 +#: parser/parse_clause.c:3331 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "" "\"%s\" í…Œì´ë¸”ì—는 ON CONFLICT ê¸°ëŠ¥ì„ ì‚¬ìš©í•  수 없습니다. ì´ í…Œì´ë¸”ì€ ì¹´íƒˆë¡œ" "ê·¸ í…Œì´ë¸”로 사용ë©ë‹ˆë‹¤." -#: parser/parse_clause.c:3341 +#: parser/parse_clause.c:3462 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "%s ì—°ì‚°ìžëŠ” 유효한 순서 지정 ì—°ì‚°ìžê°€ 아님" -#: parser/parse_clause.c:3343 +#: parser/parse_clause.c:3464 #, c-format msgid "" "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "" "순서 지정 ì—°ì‚°ìžëŠ” btree ì—°ì‚°ìž íŒ¨ë°€ë¦¬ì˜ \"<\" or \">\" 멤버여야 합니다." -#: parser/parse_clause.c:3654 +#: parser/parse_clause.c:3775 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "" +"PRECEDING/FOLLOWING 옵셋과 함께 쓰는 RANGE êµ¬ë¬¸ì€ ì¹¼ëŸ¼ì˜ %s ìžë¡œí˜•ì„ ì§€ì›í•˜" +"ì§€ 않습니다." -#: parser/parse_clause.c:3660 +#: parser/parse_clause.c:3781 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s " "and offset type %s" msgstr "" +"PRECEDING/FOLLOWING 옵셋과 함께 쓰는 RANGE êµ¬ë¬¸ì€ %s ìžë£Œí˜• 칼럼과 %s 옵셋 형" +"ì‹ì„ ì§€ì›í•˜ì§€ 않습니다." -#: parser/parse_clause.c:3663 +#: parser/parse_clause.c:3784 #, c-format msgid "Cast the offset value to an appropriate type." -msgstr "" +msgstr "옵셋 ê°’ì„ ì ë‹¹í•œ ìžë£Œí˜•으로 변환하세요." -#: parser/parse_clause.c:3668 +#: parser/parse_clause.c:3789 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for " "column type %s and offset type %s" msgstr "" +"PRECEDING/FOLLOWING 옵셋과 함께 쓰는 RANGE êµ¬ë¬¸ì´ %s ìžë£Œí˜• 칼럼과 %s 옵셋 형" +"ì‹ ê³„ì‚°ì—서 여러 가지로 í•´ì„ë  ìˆ˜ 있습니다." -#: parser/parse_clause.c:3671 +#: parser/parse_clause.c:3792 #, c-format msgid "Cast the offset value to the exact intended type." -msgstr "" +msgstr "옵셋 ê°’ì„ ë¶„ëª…í•œ ìžë£Œí˜•으로 형변환 하세요." -#: parser/parse_coerce.c:1024 parser/parse_coerce.c:1062 -#: parser/parse_coerce.c:1080 parser/parse_coerce.c:1095 -#: parser/parse_expr.c:2241 parser/parse_expr.c:2819 parser/parse_target.c:967 +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 +#: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 +#: parser/parse_expr.c:2146 parser/parse_expr.c:2754 parser/parse_expr.c:3405 +#: parser/parse_expr.c:3634 parser/parse_target.c:998 #, c-format msgid "cannot cast type %s to %s" msgstr "%s ìžë£Œí˜•ì„ %s ìžë£Œí˜•으로 형변환할 수 없습니다." -#: parser/parse_coerce.c:1065 +#: parser/parse_coerce.c:1091 #, c-format msgid "Input has too few columns." msgstr "ìž…ë ¥ì— ë„ˆë¬´ ì ì€ ì¹¼ëŸ¼ì„ ì§€ì •í–ˆìŠµë‹ˆë‹¤." -#: parser/parse_coerce.c:1083 +#: parser/parse_coerce.c:1109 #, c-format msgid "Cannot cast type %s to %s in column %d." msgstr "%s ìžë£Œí˜•ì„ %s ìžë£Œí˜•으로 형변환할 수 없습니다 해당 ì—´ %d." -#: parser/parse_coerce.c:1098 +#: parser/parse_coerce.c:1124 #, c-format msgid "Input has too many columns." msgstr "ìž…ë ¥ì— ë„ˆë¬´ ë§Žì€ ì¹¼ëŸ¼ì„ ì§€ì •í–ˆìŠµë‹ˆë‹¤." #. translator: first %s is name of a SQL construct, eg WHERE #. translator: first %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1153 parser/parse_coerce.c:1201 +#: parser/parse_coerce.c:1179 parser/parse_coerce.c:1227 #, c-format msgid "argument of %s must be type %s, not type %s" msgstr "%sì˜ ì¸ìžëŠ” %s ìžë£Œí˜•ì´ì–´ì•¼ 함(%s ìžë£Œí˜•ì´ ì•„ë‹˜)" #. translator: %s is name of a SQL construct, eg WHERE #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1164 parser/parse_coerce.c:1213 +#: parser/parse_coerce.c:1190 parser/parse_coerce.c:1239 #, c-format msgid "argument of %s must not return a set" msgstr "%s ì˜ ì¸ìžëŠ” set(ì§‘í•©) ì„ return할수 없습니다." #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1353 +#: parser/parse_coerce.c:1383 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "%s ìžë£Œí˜• %s 와 %s 는 서로 매치ë˜ì§€ 않습니다" -#: parser/parse_coerce.c:1465 +#: parser/parse_coerce.c:1499 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "ì¸ìž ìžë£Œí˜•으로 %s 와 %s 는 서로 매치ë˜ì§€ 않습니다" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1517 +#: parser/parse_coerce.c:1551 #, c-format msgid "%s could not convert type %s to %s" msgstr "%s 는 ìžë£Œí˜• %s ìžë£Œí˜•ì—서 %s ìžë£Œí˜•으로 ë³€í™˜ë  ìˆ˜ 없습니다." -#: parser/parse_coerce.c:1934 -#, c-format -msgid "arguments declared \"anyelement\" are not all alike" -msgstr "\"anyelement\" 로 ì„ ì–¸ëœ ì¸ìžë“¤ì´ ëª¨ë‘ ê°™ì§€ 않습니다" - -#: parser/parse_coerce.c:1954 -#, c-format -msgid "arguments declared \"anyarray\" are not all alike" -msgstr "\"anyarray\" 로 ì„ ì–¸ëœ ì¸ìžë“¤ì´ ëª¨ë‘ ê°™ì§€ 않습니다." - -#: parser/parse_coerce.c:1974 +#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 +#: parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 +#: parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 #, c-format -msgid "arguments declared \"anyrange\" are not all alike" -msgstr "\"anyarray\" 로 ì„ ì–¸ëœ ì¸ìžë“¤ì´ ëª¨ë‘ ê°™ì§€ 않습니다." +msgid "arguments declared \"%s\" are not all alike" +msgstr "\"%s\" 로 ì„ ì–¸ëœ ì¸ìžë“¤ì´ ëª¨ë‘ ê°™ì§€ 않습니다." -#: parser/parse_coerce.c:2008 parser/parse_coerce.c:2088 -#: utils/fmgr/funcapi.c:487 +#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 +#: utils/fmgr/funcapi.c:600 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "%s ì´ë¦„으로 ì„ ì–¸ëœ ì¸ìžê°€ arrayê°€ 아니고, %s ìžë£Œí˜•입니다" -#: parser/parse_coerce.c:2029 -#, c-format -msgid "arguments declared \"anycompatiblerange\" are not all alike" -msgstr "\"anycompatiblerange\" 로 ì„ ì–¸ëœ ì¸ìžë“¤ì´ ëª¨ë‘ ê°™ì§€ 않습니다." - -#: parser/parse_coerce.c:2041 parser/parse_coerce.c:2122 -#: utils/fmgr/funcapi.c:501 +#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 +#: utils/fmgr/funcapi.c:614 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "%s 로 ì„ ì–¸ëœ ì¸ìžê°€ range ìžë£Œí˜•ì´ ì•„ë‹ˆê³ , %s ìžë£Œí˜•입니다" -#: parser/parse_coerce.c:2079 +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 +#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 +#, c-format +msgid "argument declared %s is not a multirange type but type %s" +msgstr "%s 로 ì„ ì–¸ëœ ì¸ìžê°€ multirange ìžë£Œí˜•ì´ ì•„ë‹ˆê³ , %s ìžë£Œí˜•입니다" + +#: parser/parse_coerce.c:2353 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "\"anyarray\" ì¸ìžì˜ ê° ìš”ì†Œ ìžë£Œí˜•ì„ í™•ì¸í•  수 ì—†ìŒ" -#: parser/parse_coerce.c:2105 parser/parse_coerce.c:2139 +#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 +#: parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "" "%s ì´ë¦„으로 ì„ ì–¸ëœ ì¸ìžê°€ %s 형으로 ì„ ì–¸ëœ ì¸ìžë“¤ê³¼ ì¼ê´€ì„±ì´ 없습니다질 않습" "니다" -#: parser/parse_coerce.c:2163 +#: parser/parse_coerce.c:2474 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "ìž…ë ¥ì— %s í˜•ì´ ìžˆì–´ 다변 형ì‹ì„ 확ì¸í•  수 ì—†ìŒ" -#: parser/parse_coerce.c:2177 +#: parser/parse_coerce.c:2488 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "anynonarrayì— ì¼ì¹˜ëœ 형ì‹ì´ ë°°ì—´ 형ì‹ìž„: %s" -#: parser/parse_coerce.c:2187 +#: parser/parse_coerce.c:2498 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "anyenumì— ì¼ì¹˜ëœ 형ì‹ì´ ì—´ê±° 형ì‹ì´ 아님: %s" -#: parser/parse_coerce.c:2218 parser/parse_coerce.c:2267 -#: parser/parse_coerce.c:2329 parser/parse_coerce.c:2365 +#: parser/parse_coerce.c:2559 +#, c-format +msgid "arguments of anycompatible family cannot be cast to a common type" +msgstr "anycompatible 계열 ì¸ìžëŠ” ì¼ë°˜ ìžë£Œí˜•으로 변환할 수 없습니다." + +#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 +#: parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 +#: parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "%s 다형 ìžë£Œí˜•ì„ ê²°ì •í•  수 ì—†ìŒ, ìž…ë ¥ ìžë£Œí˜•ì´ %s ìž„" -#: parser/parse_coerce.c:2228 +#: parser/parse_coerce.c:2587 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "" -"%s ìžë£Œí˜•ì´ anycompatiblerangeì¸ë°, 해당 %s anycompatible ìžë£Œí˜•ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" +"%s ìžë£Œí˜•ì´ anycompatiblerangeì¸ë°, 해당 %s anycompatible ìžë£Œí˜•ì„ ì°¾ì„ ìˆ˜ ì—†" +"ìŒ" + +#: parser/parse_coerce.c:2608 +#, c-format +msgid "anycompatiblemultirange type %s does not match anycompatible type %s" +msgstr "" +"%s ìžë£Œí˜•ì´ anycompatiblemultirange 형ì¸ë°, 해당 %s anycompatible ìžë£Œí˜•ì„ ì°¾" +"ì„ ìˆ˜ ì—†ìŒ" -#: parser/parse_coerce.c:2242 +#: parser/parse_coerce.c:2622 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "ì¼ì¹˜í•œ anycompatiblenonarray ìžë£Œí˜•ì´ ë°°ì—´ ìžë£Œí˜•ìž„: %s" -#: parser/parse_coerce.c:2433 +#: parser/parse_coerce.c:2857 +#, c-format +msgid "" +"A result of type %s requires at least one input of type anyrange or " +"anymultirange." +msgstr "" +"%s 형 반환 ìžë£Œí˜•ì€ anyrange 형ì´ë‚˜, anymultirange 형 중 하나를 ìž…ë ¥ ìžë£Œí˜•으" +"로 필요합니다." + +#: parser/parse_coerce.c:2874 #, c-format -msgid "A result of type %s requires at least one input of type %s." -msgstr "%s ìžë£Œí˜•ì˜ ê²°ê³¼ê°€ ì ì–´ë„ í•˜ë‚˜ì˜ %s ìž…ë ¥ ìžë£Œí˜•ì„ í•„ìš”ë¡œ 합니다." +msgid "" +"A result of type %s requires at least one input of type anycompatiblerange " +"or anycompatiblemultirange." +msgstr "" +"%s 형 반환 ìžë£Œí˜•ì€ anycompatiblerange 형ì´ë‚˜, anycompatiblemultirange 형 중 " +"하나를 ìž…ë ¥ ìžë£Œí˜•으로 필요합니다." -#: parser/parse_coerce.c:2445 +#: parser/parse_coerce.c:2886 #, c-format msgid "" "A result of type %s requires at least one input of type anyelement, " -"anyarray, anynonarray, anyenum, or anyrange." +"anyarray, anynonarray, anyenum, anyrange, or anymultirange." msgstr "" +"%s 형 반환 ìžë£Œí˜•ì€ anyarray, anynonarray, anyenum, anyrange, ë˜ëŠ” " +"anymultirange 형 중 하나를 ìž…ë ¥ ìžë£Œí˜•으로 필요합니다." -#: parser/parse_coerce.c:2457 +#: parser/parse_coerce.c:2898 #, c-format msgid "" "A result of type %s requires at least one input of type anycompatible, " -"anycompatiblearray, anycompatiblenonarray, or anycompatiblerange." +"anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or " +"anycompatiblemultirange." msgstr "" +"%s ìžë£Œí˜•ì˜ ê²°ê³¼ëŠ” ìž…ë ¥ ìžë£Œí˜•으로 anycompatible, anycompatiblearray, " +"anycompatiblenonarray, anycompatiblerange, anycompatiblemultirange ìžë£Œí˜• 중 " +"하나 ì´ìƒì´ 필요로 합니다." -#: parser/parse_coerce.c:2487 +#: parser/parse_coerce.c:2928 msgid "A result of type internal requires at least one input of type internal." msgstr "" +"internal í˜•ì˜ ê²°ê³¼ëŠ” ì ì–´ë„ 하나 ì´ìƒì˜ internal í˜•ì˜ ìž…ë ¥ ìžë£Œí˜•ì´ í•„ìš”í•©ë‹ˆ" +"다." #: parser/parse_collate.c:228 parser/parse_collate.c:475 -#: parser/parse_collate.c:981 +#: parser/parse_collate.c:1005 #, c-format msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" msgstr "" "암묵ì ìœ¼ë¡œ ì„ íƒëœ \"%s\" ì •ë ¬ 규칙와 \"%s\" ì •ë ¬ ê·œì¹™ì´ ë§¤ì¹­ë˜ì§€ 않습니다" #: parser/parse_collate.c:231 parser/parse_collate.c:478 -#: parser/parse_collate.c:984 +#: parser/parse_collate.c:1008 #, c-format msgid "" "You can choose the collation by applying the COLLATE clause to one or both " "expressions." msgstr "한 쪽 ë˜ëŠ” 서로 COLLATE ì ˆì„ ì´ìš©í•´ ì •ë ¬ ê·œì¹™ì„ ì§€ì •í•˜ì„¸ìš”" -#: parser/parse_collate.c:831 +#: parser/parse_collate.c:855 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "" "명시ì ìœ¼ë¡œ 지정한 \"%s\" 정렬규칙와 \"%s\" ì •ë ¬ê·œì¹™ì´ ë§¤ì¹­ë˜ì§€ 않습니다" -#: parser/parse_cte.c:42 +#: parser/parse_cte.c:46 #, c-format msgid "" "recursive reference to query \"%s\" must not appear within its non-recursive " "term" msgstr "\"%s\" ì¿¼ë¦¬ì— ëŒ€í•œ 재귀 참조가 비재귀 구문 안ì—는 없어야 함" -#: parser/parse_cte.c:44 +#: parser/parse_cte.c:48 #, c-format msgid "recursive reference to query \"%s\" must not appear within a subquery" msgstr "\"%s\" ì¿¼ë¦¬ì— ëŒ€í•œ 재귀 참조가 하위 쿼리 ë‚´ì— í‘œì‹œë˜ì§€ 않아야 함" -#: parser/parse_cte.c:46 +#: parser/parse_cte.c:50 #, c-format msgid "" "recursive reference to query \"%s\" must not appear within an outer join" msgstr "\"%s\" ì¿¼ë¦¬ì— ëŒ€í•œ 재귀 참조가 outer join 구문 ì•ˆì— ì—†ì–´ì•¼ 함" -#: parser/parse_cte.c:48 +#: parser/parse_cte.c:52 #, c-format msgid "recursive reference to query \"%s\" must not appear within INTERSECT" msgstr "\"%s\" ì¿¼ë¦¬ì— ëŒ€í•œ 재귀 참조가 INTERSECT ë‚´ì— í‘œì‹œë˜ì§€ 않아야 함" -#: parser/parse_cte.c:50 +#: parser/parse_cte.c:54 #, c-format msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "\"%s\" ì¿¼ë¦¬ì— ëŒ€í•œ 재귀 참조가 EXCEPT ë‚´ì— í‘œì‹œë˜ì§€ 않아야 함" -#: parser/parse_cte.c:132 +#: parser/parse_cte.c:136 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "\"%s\" WITH 쿼리 ì´ë¦„ì´ ì—¬ëŸ¬ 번 지정ë¨" -#: parser/parse_cte.c:264 +#: parser/parse_cte.c:308 +#, c-format +msgid "could not identify an inequality operator for type %s" +msgstr "%s ìžë£Œí˜•ìš© ë¶€ë“±ì‹ ì—°ì‚°ìžë¥¼ 알 수 ì—†ìŒ" + +#: parser/parse_cte.c:335 #, c-format msgid "" "WITH clause containing a data-modifying statement must be at the top level" msgstr "ìžë£Œë¥¼ 변경하는 êµ¬ë¬¸ì´ ìžˆëŠ” WITH ì ˆì€ ìµœìƒìœ„ ìˆ˜ì¤€ì— ìžˆì–´ì•¼ 합니다" -#: parser/parse_cte.c:313 +#: parser/parse_cte.c:384 #, c-format msgid "" "recursive query \"%s\" column %d has type %s in non-recursive term but type " @@ -16333,12 +18883,12 @@ msgstr "" "\"%s\" 재귀 ì¿¼ë¦¬ì˜ %d 번째 ì¹¼ëŸ¼ì€ ë¹„ìž¬ê·€ ì¡°ê±´ì— %s ìžë£Œí˜•ì„ í¬í•¨í•˜ëŠ”ë° ì „ì²´ì " "으로는 %s ìžë£Œí˜•ìž„" -#: parser/parse_cte.c:319 +#: parser/parse_cte.c:390 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "비재귀 ì¡°ê±´ì˜ ì¶œë ¥ì„ ì˜¬ë°”ë¥¸ 형ì‹ìœ¼ë¡œ 형변환하십시오." -#: parser/parse_cte.c:324 +#: parser/parse_cte.c:395 #, c-format msgid "" "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term " @@ -16347,401 +18897,692 @@ msgstr "" "\"%s\" 재귀 ì¿¼ë¦¬ì˜ %d 번째 ì¹¼ëŸ¼ì€ ë¹„ìž¬ê·€ ì¡°ê±´ì— %s ìžë£Œí˜•ì„ í¬í•¨í•˜ëŠ”ë° ì „ì²´ì " "으로는 %s ìžë£Œí˜•ìž„" -#: parser/parse_cte.c:328 +#: parser/parse_cte.c:399 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "" +"비 재귀형 ìš”ì†Œë“¤ì˜ ë¬¸ìž ì •ë ¬ ê·œì¹™ì„ ì§€ì •í•  때는 COLLATE ì ˆì„ ì¶”ê°€í•˜ì„¸ìš”." + +#: parser/parse_cte.c:420 +#, c-format +msgid "WITH query is not recursive" +msgstr "WITH 쿼리가 재귀 쿼리 형ì‹ì´ 아님" + +#: parser/parse_cte.c:451 +#, c-format +msgid "" +"with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" +msgstr "" +"SEARCH ë˜ëŠ” CYCLE ì ˆì„ ì‚¬ìš©í•  때는 UNION 왼쪽 êµ¬ë¬¸ì€ SELECT 여야 합니다." + +#: parser/parse_cte.c:456 +#, c-format +msgid "" +"with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" +msgstr "" +"SEARCH ë˜ëŠ” CYCLE ì ˆì„ ì‚¬ìš©í•  때는 UNION 오른쪽 êµ¬ë¬¸ì€ SELECT 여야 합니다." + +#: parser/parse_cte.c:471 +#, c-format +msgid "search column \"%s\" not in WITH query column list" +msgstr "\"%s\" searchìš© ì¹¼ëŸ¼ì´ WITH 쿼리 칼럼 목ë¡ì— ì—†ìŒ" + +#: parser/parse_cte.c:478 +#, c-format +msgid "search column \"%s\" specified more than once" +msgstr "\"%s\" searchìš© ì¹¼ëŸ¼ì„ í•˜ë‚˜ ì´ìƒ 지정했ìŒ" + +#: parser/parse_cte.c:487 +#, c-format +msgid "" +"search sequence column name \"%s\" already used in WITH query column list" +msgstr "" +"\"%s\" ì´ë¦„ì˜ search sequence 칼럼 ì´ë¦„ì€ WITH 쿼리 칼럼 ëª©ë¡ ì•ˆì—서 ì´ë¯¸ 사" +"ìš©ë˜ê³  있습니다." + +#: parser/parse_cte.c:504 +#, c-format +msgid "cycle column \"%s\" not in WITH query column list" +msgstr "\"%s\" cycleìš© ì¹¼ëŸ¼ì´ WITH 쿼리 칼럼 목ë¡ì— 없습니다" + +#: parser/parse_cte.c:511 +#, c-format +msgid "cycle column \"%s\" specified more than once" +msgstr "\"%s\" cycleìš© ì¹¼ëŸ¼ì„ í•˜ë‚˜ ì´ìƒ 지정했ìŒ" + +#: parser/parse_cte.c:520 +#, c-format +msgid "cycle mark column name \"%s\" already used in WITH query column list" +msgstr "" +"\"%s\" cycle mark 칼럼 ì´ë¦„ì´ WITH 쿼리 칼럼 ëª©ë¡ ì•ˆì—서 ì´ë¯¸ 사용ë˜ê³  있습니" +"다." + +#: parser/parse_cte.c:527 +#, c-format +msgid "cycle path column name \"%s\" already used in WITH query column list" +msgstr "" +"\"%s\" cycle path 칼럼 ì´ë¦„ì´ WITH 쿼리 칼럼 ëª©ë¡ ì•ˆì—서 ì´ë¯¸ 사용ë˜ê³  있습니" +"다." + +#: parser/parse_cte.c:535 +#, c-format +msgid "cycle mark column name and cycle path column name are the same" +msgstr "cycle mark 칼럼 ì´ë¦„ê³¼ cycle path 칼럼 ì´ë¦„ì´ ê°™ìŠµë‹ˆë‹¤." + +#: parser/parse_cte.c:545 +#, c-format +msgid "search sequence column name and cycle mark column name are the same" +msgstr "search sequence 칼럼 ì´ë¦„ê³¼ cycle mark 칼럼 ì´ë¦„ì´ ê°™ìŠµë‹ˆë‹¤." + +#: parser/parse_cte.c:552 +#, c-format +msgid "search sequence column name and cycle path column name are the same" +msgstr "search sequence 칼럼 ì´ë¦„ê³¼ cycle path 칼럼 ì´ë¦„ì´ ê°™ìŠµë‹ˆë‹¤." -#: parser/parse_cte.c:418 +#: parser/parse_cte.c:636 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "" "\"%s\" WITH 쿼리ì—는 %dê°œì˜ ì¹¼ëŸ¼ì„ ì‚¬ìš©í•  수 ìžˆëŠ”ë° %dê°œì˜ ì¹¼ëŸ¼ì´ ì§€ì •ë¨" -#: parser/parse_cte.c:598 +#: parser/parse_cte.c:816 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "WITH 항목 ê°„ì˜ ìƒí˜¸ 재귀가 구현ë˜ì§€ 않ìŒ" -#: parser/parse_cte.c:650 +#: parser/parse_cte.c:868 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "\"%s\" 재귀 ì¿¼ë¦¬ì— ìžë£Œ 변경 êµ¬ë¬¸ì´ í¬í•¨ë  수 없습니다." -#: parser/parse_cte.c:658 +#: parser/parse_cte.c:876 #, c-format msgid "" "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] " "recursive-term" msgstr "\"%s\" 재귀 ì¿¼ë¦¬ì— ë¹„ìž¬ê·€ ì¡°ê±´ í˜•íƒœì˜ UNION [ALL] 재귀 ì¡°ê±´ì´ ì—†ìŒ" -#: parser/parse_cte.c:702 +#: parser/parse_cte.c:911 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "재귀 ì¿¼ë¦¬ì˜ ORDER BYê°€ 구현ë˜ì§€ 않ìŒ" -#: parser/parse_cte.c:708 +#: parser/parse_cte.c:917 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "재귀 ì¿¼ë¦¬ì˜ OFFSETì´ êµ¬í˜„ë˜ì§€ 않ìŒ" -#: parser/parse_cte.c:714 +#: parser/parse_cte.c:923 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "재귀 ì¿¼ë¦¬ì˜ LIMITê°€ 구현ë˜ì§€ 않ìŒ" -#: parser/parse_cte.c:720 +#: parser/parse_cte.c:929 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "재귀 ì¿¼ë¦¬ì˜ FOR UPDATE/SHAREê°€ 구현ë˜ì§€ 않ìŒ" -#: parser/parse_cte.c:777 +#: parser/parse_cte.c:1008 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "\"%s\" ì¿¼ë¦¬ì— ëŒ€í•œ 재귀 참조가 여러 번 표시ë˜ì§€ 않아야 함" -#: parser/parse_expr.c:349 +#: parser/parse_expr.c:313 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "ì´ ì˜ì—­ì—서는 DEFAULT를 사용할 수 없습니다" -#: parser/parse_expr.c:402 parser/parse_relation.c:3506 -#: parser/parse_relation.c:3526 +#: parser/parse_expr.c:406 parser/parse_relation.c:3691 +#: parser/parse_relation.c:3701 parser/parse_relation.c:3719 +#: parser/parse_relation.c:3726 parser/parse_relation.c:3740 #, c-format msgid "column %s.%s does not exist" msgstr "%s.%s 칼럼 ì—†ìŒ" -#: parser/parse_expr.c:414 +#: parser/parse_expr.c:418 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "\"%s\" ì¹¼ëŸ¼ì€ %s ìžë£Œí˜•ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: parser/parse_expr.c:420 +#: parser/parse_expr.c:424 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "레코드 ë°ì´í„° 형ì‹ì—서 \"%s\" ì¹¼ëŸ¼ì„ ì‹ë³„í•  수 ì—†ìŒ" -#: parser/parse_expr.c:426 +#: parser/parse_expr.c:430 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "" ".%s í‘œí˜„ì´ %s ìžë£Œí˜• 사용ë˜ì—ˆëŠ”ë°, ì´ëŠ” 복소수형 (complex type)ì´ ì•„ë‹™ë‹ˆë‹¤" -#: parser/parse_expr.c:457 parser/parse_target.c:729 +#: parser/parse_expr.c:461 parser/parse_target.c:732 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "\"*\"를 통한 칼럼 í™•ìž¥ì€ ì—¬ê¸°ì„œ ì§€ì›ë˜ì§€ 않ìŒ" -#: parser/parse_expr.c:578 +#: parser/parse_expr.c:584 msgid "cannot use column reference in DEFAULT expression" msgstr "DEFAULT 표현ì‹ì—서는 ì—´ reference를 사용할 수 ì—†ìŒ" -#: parser/parse_expr.c:581 +#: parser/parse_expr.c:587 msgid "cannot use column reference in partition bound expression" msgstr "파티션 범위 표현ì‹ì—서 칼럼 참조를 사용할 수 ì—†ìŒ" -#: parser/parse_expr.c:850 parser/parse_relation.c:799 -#: parser/parse_relation.c:881 parser/parse_target.c:1207 +#: parser/parse_expr.c:846 parser/parse_relation.c:833 +#: parser/parse_relation.c:915 parser/parse_target.c:1238 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "칼럼 참조 \"%s\" ê°€ 모호합니다." -#: parser/parse_expr.c:906 parser/parse_param.c:110 parser/parse_param.c:142 -#: parser/parse_param.c:199 parser/parse_param.c:298 +#: parser/parse_expr.c:902 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_param.c:204 parser/parse_param.c:303 #, c-format msgid "there is no parameter $%d" msgstr "$%d 매개 변수가 없습니다" -#: parser/parse_expr.c:1149 +#. translator: %s is name of a SQL construct, eg NULLIF +#: parser/parse_expr.c:1103 parser/parse_expr.c:3065 #, c-format -msgid "NULLIF requires = operator to yield boolean" -msgstr "NULIF ì ˆì€ boolean ê°’ì„ ì–»ê¸° 위해서 = ì—°ì‚°ìžë¥¼ 필요로 합니다" +msgid "%s requires = operator to yield boolean" +msgstr "%s ì ˆì€ ë¶ˆë¦¬ì–¸ ê°’ì„ ì–»ê¸° 위해서 = ì—°ì‚°ìžë¥¼ 필요로 합니다" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1155 parser/parse_expr.c:3135 +#: parser/parse_expr.c:1109 parser/parse_expr.c:3072 #, c-format msgid "%s must not return a set" msgstr "%sì—서는 ì§‘í•©ì„ ë°˜í™˜í•  수 없습니다." -#: parser/parse_expr.c:1603 parser/parse_expr.c:1635 +#: parser/parse_expr.c:1395 +#, c-format +msgid "" +"MERGE_ACTION() can only be used in the RETURNING list of a MERGE command" +msgstr "" +"MERGE_ACTION()ì€ MERGE ëª…ë ¹ì˜ RETURNING ëª©ë¡ ì•ˆì—서만 ì‚¬ìš©ë  ìˆ˜ 있ìŒ" + +#: parser/parse_expr.c:1519 parser/parse_expr.c:1551 #, c-format msgid "number of columns does not match number of values" msgstr "ì¹¼ëŸ¼ì˜ ê°œìˆ˜ì™€, valuesì˜ ê°œìˆ˜ê°€ 틀립니다" -#: parser/parse_expr.c:1649 +#: parser/parse_expr.c:1565 #, c-format msgid "" "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() " "expression" msgstr "" +"다중 칼럼 UPDATE 요소를 위한 소스는 서브셀렉트나 ROW() 표현ì‹ì´ì–´ì•¼ 합니다." #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1843 parser/parse_expr.c:2330 parser/parse_func.c:2540 +#: parser/parse_expr.c:1760 parser/parse_expr.c:2243 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "%s 안ì—서는 ì§‘í•© 반환 함수를 사용할 수 ì—†ìŒ" -#: parser/parse_expr.c:1904 +#: parser/parse_expr.c:1824 msgid "cannot use subquery in check constraint" msgstr "ì²´í¬ ì œì•½ ì¡°ê±´ì—서는 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1908 +#: parser/parse_expr.c:1828 msgid "cannot use subquery in DEFAULT expression" msgstr "DEFAULT ì‹ì—서는 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1911 +#: parser/parse_expr.c:1831 msgid "cannot use subquery in index expression" msgstr "ì¸ë±ìФ ì‹(expression)ì— ì„œë¸Œì¿¼ë¦¬ë¥¼ 사용할 수 없습니다" -#: parser/parse_expr.c:1914 +#: parser/parse_expr.c:1834 msgid "cannot use subquery in index predicate" msgstr "ì¸ë±ìФ 술어(predicate)ì— ì„œë¸Œì¿¼ë¦¬ë¥¼ 사용할 수 없습니다" -#: parser/parse_expr.c:1917 +#: parser/parse_expr.c:1837 +msgid "cannot use subquery in statistics expression" +msgstr "통계 ì •ë³´ 표현ì‹ì— 서브쿼리를 사용할 수 없습니다" + +#: parser/parse_expr.c:1840 msgid "cannot use subquery in transform expression" msgstr "transform ì‹(expression)ì— ì„œë¸Œì¿¼ë¦¬ë¥¼ 사용할 수 없습니다" -#: parser/parse_expr.c:1920 +#: parser/parse_expr.c:1843 msgid "cannot use subquery in EXECUTE parameter" msgstr "EXECUTE 매개 변수로 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1923 +#: parser/parse_expr.c:1846 msgid "cannot use subquery in trigger WHEN condition" msgstr "트리거 WHEN ì¡°ê±´ì ˆì—서는 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1926 +#: parser/parse_expr.c:1849 msgid "cannot use subquery in partition bound" msgstr "파티션 범위 표현ì‹ì— 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1929 +#: parser/parse_expr.c:1852 msgid "cannot use subquery in partition key expression" msgstr "파티션 키 표현ì‹ì— 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1932 +#: parser/parse_expr.c:1855 msgid "cannot use subquery in CALL argument" msgstr "CALL 매개 변수로 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1935 +#: parser/parse_expr.c:1858 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "COPY FROM WHERE ì¡°ê±´ì ˆì—서는 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1938 +#: parser/parse_expr.c:1861 msgid "cannot use subquery in column generation expression" msgstr "미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ ìƒì„± 표현ì‹ì— 서브쿼리를 사용할 수 없습니다" -#: parser/parse_expr.c:1991 +#: parser/parse_expr.c:1914 parser/parse_expr.c:3764 #, c-format msgid "subquery must return only one column" msgstr "subquery는 오로지 í•œê°œì˜ ì—´ë§Œì„ ëŒë ¤ 주어야 합니다." -#: parser/parse_expr.c:2075 +#: parser/parse_expr.c:1985 #, c-format msgid "subquery has too many columns" msgstr "subquery ì—ê°€ 너무 ë§Žì€ ì¹¼ëŸ¼ì„ ê°€ì§‘ë‹ˆë‹¤" -#: parser/parse_expr.c:2080 +#: parser/parse_expr.c:1990 #, c-format msgid "subquery has too few columns" msgstr "subquery ì— ëª…ì‹œëœ ì—´ 수가 너무 ì ë‹¤" -#: parser/parse_expr.c:2181 +#: parser/parse_expr.c:2086 #, c-format msgid "cannot determine type of empty array" msgstr "빈 ë°°ì—´ì˜ ìžë£Œí˜•ì„ í™•ì¸í•  수 ì—†ìŒ" -#: parser/parse_expr.c:2182 +#: parser/parse_expr.c:2087 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "ì›í•˜ëŠ” 형ì‹ìœ¼ë¡œ 명시ì ìœ¼ë¡œ 형변환하십시오(예: ARRAY[]::integer[])." -#: parser/parse_expr.c:2196 +#: parser/parse_expr.c:2101 #, c-format msgid "could not find element type for data type %s" msgstr "%s ìžë£Œí˜•ì˜ ìš”ì†Œ ìžë£Œí˜•ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: parser/parse_expr.c:2481 +#: parser/parse_expr.c:2184 +#, c-format +msgid "ROW expressions can have at most %d entries" +msgstr "ROW 표현ì‹ì€ 최대 %d ê°œì˜ í•­ëª©ì„ ì§€ì •í•  수 있습니다" + +#: parser/parse_expr.c:2389 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "ì´ë¦„ì´ ì§€ì •ë˜ì§€ ì•Šì€ XML ì†ì„± ê°’ì€ ì—´ 참조여야 함" -#: parser/parse_expr.c:2482 +#: parser/parse_expr.c:2390 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "ì´ë¦„ì´ ì§€ì •ë˜ì§€ ì•Šì€ XML 요소 ê°’ì€ ì—´ 참조여야 함" -#: parser/parse_expr.c:2497 +#: parser/parse_expr.c:2405 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "\"%s\" XML ì†ì„± ì´ë¦„ì´ ì—¬ëŸ¬ 번 표시ë¨" -#: parser/parse_expr.c:2604 +#: parser/parse_expr.c:2513 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "XMLSERIALIZE 결과를 %s 형으로 바꿀 수 ì—†ìŒ" -#: parser/parse_expr.c:2892 parser/parse_expr.c:3088 +#: parser/parse_expr.c:2827 parser/parse_expr.c:3023 #, c-format msgid "unequal number of entries in row expressions" msgstr "í–‰ 표현ì‹ì—서 항목 수가 ì¼ì¹˜í•˜ì§€ 않습니다" -#: parser/parse_expr.c:2902 +#: parser/parse_expr.c:2837 #, c-format msgid "cannot compare rows of zero length" msgstr "길ì´ê°€ ì˜(0)ì¸ í–‰ë“¤ì€ ë¹„êµí•  수 없습니다" -#: parser/parse_expr.c:2927 +#: parser/parse_expr.c:2862 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "" -"í–‰ ë¹„êµ ì—°ì‚°ìžëŠ” booleaní˜•ì„ ë¦¬í„´í•´ì•¼í•©ë‹ˆë‹¤. %s ìžë£Œí˜•ì„ ì‚¬ìš©í•  수 없습니다" +"í–‰ ë¹„êµ ì—°ì‚°ìžëŠ” ë¶ˆë¦¬ì–¸í˜•ì„ ë¦¬í„´í•´ì•¼ 합니다. %s ìžë£Œí˜•ì„ ì‚¬ìš©í•  수 없습니다" -#: parser/parse_expr.c:2934 +#: parser/parse_expr.c:2869 #, c-format msgid "row comparison operator must not return a set" msgstr "í–‰ ë¹„êµ ì—°ì‚°ìžëŠ” setì„ ë¦¬í„´í•  수 없습니다" -#: parser/parse_expr.c:2993 parser/parse_expr.c:3034 +#: parser/parse_expr.c:2928 parser/parse_expr.c:2969 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "%s í–‰ ë¹„êµ ì—°ì‚°ìžì˜ êµ¬ë¬¸ì„ ë¶„ì„í•  수 없습니다" -#: parser/parse_expr.c:2995 +#: parser/parse_expr.c:2930 #, c-format msgid "" "Row comparison operators must be associated with btree operator families." msgstr "로우 ë¹„êµ ì—°ì‚°ìžë¥¼ btree ì—°ì‚°ìž íŒ¨ë°€ë¦¬ì™€ 연결해야 함" -#: parser/parse_expr.c:3036 +#: parser/parse_expr.c:2971 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "여러 가지 등ì‹ë“¤ì´ 성립할 수 있는 ê°€ëŠ¥ì„±ì´ ìžˆìŠµë‹ˆë‹¤" -#: parser/parse_expr.c:3129 +#: parser/parse_expr.c:3306 +#, c-format +msgid "JSON ENCODING clause is only allowed for bytea input type" +msgstr "JSON ENCODING ì ˆì€ ìž…ë ¥ ìžë£Œí˜•ì´ bytea ì¼ë•Œë§Œ 허용합니다." + +#: parser/parse_expr.c:3370 +#, c-format +msgid "cannot use non-string types with implicit FORMAT JSON clause" +msgstr "" +"FORMAT JSON 절과 ê´€ë ¨ëœ ìžë£Œí˜•ì´ ë¬¸ìžì—´ì´ 아닌 ìžë£Œí˜•ì¸ ê²½ìš°ëŠ” 사용할 수 없습" +"니다." + +#: parser/parse_expr.c:3371 +#, c-format +msgid "cannot use non-string types with explicit FORMAT JSON clause" +msgstr "" +"FORMAT JSON 절과 ê´€ë ¨ëœ ìžë£Œí˜•ì´ ë¬¸ìžì—´ì´ 아닌 ìžë£Œí˜•ì¸ ê²½ìš°ëŠ” 사용할 수 없습" +"니다." + +#: parser/parse_expr.c:3460 +#, c-format +msgid "cannot use JSON format with non-string output types" +msgstr "비 문ìžì—´ 출력 형으로 JSON í¬ë©§ì„ 사용할 수 ì—†ìŒ" + +#: parser/parse_expr.c:3473 +#, c-format +msgid "cannot set JSON encoding for non-bytea output types" +msgstr "ì´ì§„ ìžë£Œí˜•ì´ ì•„ë‹Œ 출력 ìžë£Œí˜•ì„ ìœ„í•œ JSON ì¸ì½”ë”©ì„ ì§€ì •í•  수 ì—†ìŒ" + +#: parser/parse_expr.c:3478 +#, c-format +msgid "unsupported JSON encoding" +msgstr "ì§€ì›í•˜ì§€ 않는 JSON ì¸ì½”딩" + +#: parser/parse_expr.c:3479 +#, c-format +msgid "Only UTF8 JSON encoding is supported." +msgstr "UTF8 JSON ì¸ì½”딩만 ì§€ì›í•©ë‹ˆë‹¤." + +#: parser/parse_expr.c:3516 +#, c-format +msgid "returning SETOF types is not supported in SQL/JSON functions" +msgstr "SQL/JSON í•¨ìˆ˜ë“¤ì€ SETOF 반환 ìžë£Œí˜•ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: parser/parse_expr.c:3521 +#, c-format +msgid "returning pseudo-types is not supported in SQL/JSON functions" +msgstr "SQL/JSON í•¨ìˆ˜ë“¤ì€ ë°˜í™˜ ìžë£Œí˜•으로 ì˜ì‚¬ ìžë£Œí˜•ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: parser/parse_expr.c:3849 parser/parse_func.c:866 +#, c-format +msgid "aggregate ORDER BY is not implemented for window functions" +msgstr "윈ë„ìš° í•¨ìˆ˜ì— ëŒ€í•´ 집계용 ORDER BYê°€ 구현ë˜ì§€ 않ìŒ" + +#: parser/parse_expr.c:4072 +#, c-format +msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" +msgstr "" +"ì´ì§„ ìžë£Œí˜•ì´ ì•„ë‹Œ ìž…ë ¥ ìžë£Œí˜•ì„ ìœ„í•œ JSON FORMAT ENCODING êµ¬ë¬¸ì„ ì‚¬ìš©í•  수 " +"ì—†ìŒ" + +#: parser/parse_expr.c:4092 +#, c-format +msgid "cannot use type %s in IS JSON predicate" +msgstr "IS JSON 술어(predicate)ì— %s ìžë£Œí˜•ì„ ì‚¬ìš©í•  수 ì—†ìŒ" + +#: parser/parse_expr.c:4118 parser/parse_expr.c:4239 +#, c-format +msgid "cannot use type %s in RETURNING clause of %s" +msgstr "%s ìžë£Œí˜•ì€ %s RETURNING ì ˆì—서 사용할 수 ì—†ìŒ" + +#: parser/parse_expr.c:4120 +#, c-format +msgid "Try returning json or jsonb." +msgstr "json ë˜ëŠ” jsonb í˜•ì„ ë°˜í™˜í•˜ì„¸ìš”." + +#: parser/parse_expr.c:4168 +#, c-format +msgid "cannot use non-string types with WITH UNIQUE KEYS clause" +msgstr "문ìžì—´ì´ 아닌 ìžë£Œí˜•ì€ WITH UNIQUE KEYS 절과 함께 사용할 수 ì—†ìŒ" + +#: parser/parse_expr.c:4242 +#, c-format +msgid "Try returning a string type or bytea." +msgstr "문ìžì—´ì´ë‚˜ bytea ìžë£Œí˜•ì„ ë°˜í™˜í•˜ë„ë¡ í•˜ì„¸ìš”." + +#: parser/parse_expr.c:4307 +#, c-format +msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" +msgstr "%s()ì˜ RETURNING 절안ì—는 FORMAT JSON ì˜µì…˜ì„ ì§€ì •í•  수 ì—†ìŒ" + +#: parser/parse_expr.c:4320 +#, c-format +msgid "" +"SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" +msgstr "WITH WRAPPER ì˜µì…˜ì„ ì‚¬ìš©í•  때는 SQL/JSON QUOTES ì˜µì…˜ì„ ì§€ì •í•˜ë©´ 안ë¨" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4334 parser/parse_expr.c:4363 parser/parse_expr.c:4394 +#: parser/parse_expr.c:4420 parser/parse_expr.c:4446 +#: parser/parse_jsontable.c:94 +#, c-format +msgid "invalid %s behavior" +msgstr "%s ì ˆì€ ë°”ë¥´ì§€ 않ìŒ" + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4337 parser/parse_expr.c:4366 +#, c-format +msgid "" +"Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is " +"allowed in %s for %s." +msgstr "" +"%s 옵션(대ìƒ: %s)ì—는 ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, ë˜ëŠ” " +"DEFAULT 표현ì‹ë§Œ 쓸 수 있ìŒ" + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4344 parser/parse_expr.c:4373 parser/parse_expr.c:4402 +#: parser/parse_expr.c:4430 parser/parse_expr.c:4456 +#, c-format +msgid "invalid %s behavior for column \"%s\"" +msgstr "%s ì ˆì€ \"%s\" 칼럼 대ìƒìœ¼ë¡œëŠ” 사용할 수 ì—†ìŒ" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4347 parser/parse_expr.c:4376 +#, c-format +msgid "" +"Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is " +"allowed in %s for formatted columns." +msgstr "" +"í¬ë©§ëœ 칼럼용 %s 옵션ì—는 ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, ë˜ëŠ” " +"DEFAULT 표현ì‹ë§Œ 쓸 수 있ìŒ" + +#: parser/parse_expr.c:4395 +#, c-format +msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s." +msgstr "%s 옵션 값으로는 ERROR, TRUE, FALSE, ë˜ëŠ” UNKNOWN ë§Œ 쓸 수 있ìŒ: 대ìƒ=%s" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4405 +#, c-format +msgid "" +"Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns." +msgstr "EXISTS 칼럼용 %s 옵션ì—는 ERROR, TRUE, FALSE, ë˜ëŠ” UNKNOWN ë§Œ 쓸 수 있ìŒ." + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4423 parser/parse_expr.c:4449 +#, c-format +msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s." +msgstr "%s 옵션 값으로는 ERROR, NULL, ë˜ëŠ” DEFAULT ë§Œ 쓸 수 있ìŒ: 대ìƒ=%s" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4433 parser/parse_expr.c:4459 +#, c-format +msgid "" +"Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns." +msgstr "ìŠ¤ì¹¼ë¼ ì¹¼ëŸ¼ìš© %s 옵션ì—는 ERROR, NULL, ë˜ëŠ” DEFAULT ë§Œ 쓸 수 있ìŒ." + + +#: parser/parse_expr.c:4489 +#, c-format +msgid "JSON path expression must be of type %s, not of type %s" +msgstr "JSON 패스 표현ì‹ì€ %s ìžë£Œí˜•ì´ì–´ì•¼ 함(%s ìžë£Œí˜•ì´ ì•„ë‹˜)" + +#: parser/parse_expr.c:4707 #, c-format -msgid "IS DISTINCT FROM requires = operator to yield boolean" +msgid "" +"can only specify a constant, non-aggregate function, or operator expression " +"for DEFAULT" msgstr "" -"IS DISTINCT FROM ì ˆì—서 boolean ê°’ì„ ì–»ê¸° 위해서 = ì—°ì‚°ìžë¥¼ 필요로 합니다" +"DEFAULT로는 ìƒìˆ˜, 비집계 함수, ë˜ëŠ” ì—°ì‚°ìž í‘œí˜„ì‹ë§Œ 쓸 수 있ìŒ" -#: parser/parse_expr.c:3448 parser/parse_expr.c:3466 +#: parser/parse_expr.c:4712 #, c-format -msgid "operator precedence change: %s is now lower precedence than %s" -msgstr "ì—°ì‚°ìž ìš°ì„ ìˆœìœ„ 변경ë¨: %s ì—°ì‚°ìž ìš°ì„ ìˆœìœ„ê°€ %s 연산보다 낮습니다" +msgid "DEFAULT expression must not contain column references" +msgstr "DEFAULT 표현ì‹ì—서는 칼럼 참조를 í¬í•¨í•  수 없습니다" -#: parser/parse_func.c:191 +#: parser/parse_expr.c:4717 +#, c-format +msgid "DEFAULT expression must not return a set" +msgstr "DEFAULT 표현ì‹ì—서는 ì§‘í•©ì„ ë°˜í™˜í•  수 없습니다." + +#: parser/parse_expr.c:4793 parser/parse_expr.c:4802 +#, c-format +msgid "cannot cast behavior expression of type %s to %s" +msgstr "%s ìžë£Œí˜•ì„ %s ìžë£Œí˜•으로 형변환할 수 없습니다." + +#: parser/parse_expr.c:4796 +#, c-format +msgid "You will need to explicitly cast the expression to type %s." +msgstr "%s형으로 변환하는 형변환ìžë¥¼ 사용해보십시오" + +#: parser/parse_func.c:194 #, c-format msgid "argument name \"%s\" used more than once" msgstr "\"%s\" ì´ë¦„ì˜ ë§¤ê°œ 변수가 여러 번 사용 ë¨" -#: parser/parse_func.c:202 +#: parser/parse_func.c:205 #, c-format msgid "positional argument cannot follow named argument" -msgstr "" +msgstr "위치 기반 ì¸ìž ë’¤ì— ì´ë¦„ 기반 ì¸ìžë¥¼ 쓸 수 없습니다." -#: parser/parse_func.c:284 parser/parse_func.c:2243 +#: parser/parse_func.c:287 parser/parse_func.c:2368 #, c-format msgid "%s is not a procedure" msgstr "%s 개체는 프로시져가 아님" -#: parser/parse_func.c:288 +#: parser/parse_func.c:291 #, c-format msgid "To call a function, use SELECT." -msgstr "" +msgstr "함수를 호출하려면, SELECT êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: parser/parse_func.c:294 +#: parser/parse_func.c:297 #, c-format msgid "%s is a procedure" msgstr "%s 개체는 프로시져임" -#: parser/parse_func.c:298 +#: parser/parse_func.c:301 #, c-format msgid "To call a procedure, use CALL." -msgstr "" +msgstr "프로시져를 호출하려면, CALL êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: parser/parse_func.c:312 +#: parser/parse_func.c:315 #, c-format msgid "%s(*) specified, but %s is not an aggregate function" msgstr "%s(*) ê°€ 명시ë˜ì–´ 있는ë°, ì´ %s 함수는 집계 함수가 아닙니다." -#: parser/parse_func.c:319 +#: parser/parse_func.c:322 #, c-format msgid "DISTINCT specified, but %s is not an aggregate function" msgstr "DISTINCT ê°€ 명시ë˜ì–´ 있는ë°, 그러나 ì´ %s 함수는 집계 함수가 아닙니다" -#: parser/parse_func.c:325 +#: parser/parse_func.c:328 #, c-format msgid "WITHIN GROUP specified, but %s is not an aggregate function" msgstr "WITHIN GROUP ì ˆì´ ëª…ì‹œë˜ì–´ 있는ë°, ì´ %s 함수는 집계 함수가 아닙니다" -#: parser/parse_func.c:331 +#: parser/parse_func.c:334 #, c-format msgid "ORDER BY specified, but %s is not an aggregate function" msgstr "ORDER BY ì ˆì´ ëª…ì‹œë˜ì–´ 있는ë°, ì´ %s 함수는 집계 함수가 아닙니다." -#: parser/parse_func.c:337 +#: parser/parse_func.c:340 #, c-format msgid "FILTER specified, but %s is not an aggregate function" msgstr "FILTER ì ˆì´ ëª…ì‹œë˜ì–´ 있는ë°, ì´ %s 함수는 집계 함수가 아닙니다" -#: parser/parse_func.c:343 +#: parser/parse_func.c:346 #, c-format msgid "" "OVER specified, but %s is not a window function nor an aggregate function" msgstr "OVER ì ˆì´ ì§€ì •ë˜ì—ˆëŠ”ë° %s 함수는 윈ë„ìš° 함수 ë˜ëŠ” 집계 함수가 아님" -#: parser/parse_func.c:381 +#: parser/parse_func.c:384 #, c-format msgid "WITHIN GROUP is required for ordered-set aggregate %s" msgstr "순서가 있는 ì§‘ê³„í•¨ìˆ˜ì¸ %s ë•Œë¬¸ì— WITHIN GROUP ì ˆì´ í•„ìš”í•©ë‹ˆë‹¤" -#: parser/parse_func.c:387 +#: parser/parse_func.c:390 #, c-format msgid "OVER is not supported for ordered-set aggregate %s" msgstr "OVER ì ˆì—서 ì •ë ¬ëœ ì„¸íŠ¸ 집계 %s 함수를 ì§€ì›í•˜ì§€ 않ìŒ" -#: parser/parse_func.c:418 parser/parse_func.c:447 +#: parser/parse_func.c:421 parser/parse_func.c:452 #, c-format msgid "" +"There is an ordered-set aggregate %s, but it requires %d direct argument, " +"not %d." +msgid_plural "" "There is an ordered-set aggregate %s, but it requires %d direct arguments, " "not %d." -msgstr "" +msgstr[0] "" +"%s 순서 있는 ì§‘í•© 집계 함수는 %d ê°œì˜ ì§ì ‘ ì¸ìžë¥¼ 필요로 하는ë°, %d개를 ì“°ê³  " +"있습니다." -#: parser/parse_func.c:472 +#: parser/parse_func.c:479 #, c-format msgid "" "To use the hypothetical-set aggregate %s, the number of hypothetical direct " "arguments (here %d) must match the number of ordering columns (here %d)." msgstr "" +"%s ê°€ìƒ ì§‘í•© 집계 함수를 사용하려면, ì§ì ‘ ì¸ìžìˆ˜(%dê°œ)와 정렬용 칼럼 수(%dê°œ)" +"ê°€ 같아야 합니다." -#: parser/parse_func.c:486 +#: parser/parse_func.c:493 #, c-format msgid "" "There is an ordered-set aggregate %s, but it requires at least %d direct " +"argument." +msgid_plural "" +"There is an ordered-set aggregate %s, but it requires at least %d direct " "arguments." -msgstr "" +msgstr[0] "" +"%s 순서 있는 ì§‘í•© 집계 함수는 ì ì–´ë„ %d ê°œì˜ ì§ì ‘ ì¸ìžê°€ 필요합니다." -#: parser/parse_func.c:505 +#: parser/parse_func.c:514 #, c-format msgid "%s is not an ordered-set aggregate, so it cannot have WITHIN GROUP" msgstr "" "%s 함수는 순사가 있는 세트 집계함수가 아니여서 WITHIN GROUP ì ˆì„ ì‚¬ìš©í•  수 ì—†" "습니다" -#: parser/parse_func.c:518 +#: parser/parse_func.c:527 #, c-format msgid "window function %s requires an OVER clause" msgstr "%s 윈ë„ìš° 함수 호출ì—는 OVER ì ˆì´ í•„ìš”í•¨" -#: parser/parse_func.c:525 +#: parser/parse_func.c:534 #, c-format msgid "window function %s cannot have WITHIN GROUP" msgstr "%s 윈ë„ìš° 함수는 WITHIN GROUP ì ˆì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: parser/parse_func.c:554 +#: parser/parse_func.c:563 #, c-format msgid "procedure %s is not unique" msgstr "%s 프로시져는 유ì¼ì„±ì„ 가지지 못합니다(not unique)" -#: parser/parse_func.c:557 +#: parser/parse_func.c:566 #, c-format msgid "" "Could not choose a best candidate procedure. You might need to add explicit " @@ -16750,12 +19591,12 @@ msgstr "" "가장 ì ë‹¹í•œ 프로시져를 ì„ íƒí•  수 없습니다. ëª…ì‹œì  í˜•ë³€í™˜ìžë¥¼ 추가해야 í•  수" "ë„ ìžˆìŠµë‹ˆë‹¤." -#: parser/parse_func.c:563 +#: parser/parse_func.c:572 #, c-format msgid "function %s is not unique" msgstr "함수 %s 는 유ì¼ì„±ì„ 가지지 못합니다(not unique)" -#: parser/parse_func.c:566 +#: parser/parse_func.c:575 #, c-format msgid "" "Could not choose a best candidate function. You might need to add explicit " @@ -16764,7 +19605,7 @@ msgstr "" "ì œì¼ ì ë‹¹í•œ 함수를 ì„ íƒí•  수 없습니다. ëª…ì‹œì  í˜•ë³€í™˜ìžë¥¼ 추가해야 í•  ìˆ˜ë„ ìžˆ" "습니다." -#: parser/parse_func.c:605 +#: parser/parse_func.c:614 #, c-format msgid "" "No aggregate function matches the given name and argument types. Perhaps you " @@ -16775,12 +19616,12 @@ msgstr "" "른 ìœ„ì¹˜ì— ì“°ì§€ ì•Šì€ ê²ƒ 같습니다. ORDER BY ì ˆì€ ëª¨ë“  집계용 ì¸ìžë“¤ 맨 ë’¤ì— ìžˆ" "어야 합니다." -#: parser/parse_func.c:613 parser/parse_func.c:2286 +#: parser/parse_func.c:622 parser/parse_func.c:2411 #, c-format msgid "procedure %s does not exist" msgstr "\"%s\" 프로시져 ì—†ìŒ" -#: parser/parse_func.c:616 +#: parser/parse_func.c:625 #, c-format msgid "" "No procedure matches the given name and argument types. You might need to " @@ -16789,7 +19630,7 @@ msgstr "" "ì§€ì •ëœ ì´ë¦„ ë° ì¸ìž 형ì‹ê³¼ ì¼ì¹˜í•˜ëŠ” 프로시져가 없습니다. ëª…ì‹œì  í˜•ë³€í™˜ìžë¥¼ ì¶”" "가해야 í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." -#: parser/parse_func.c:625 +#: parser/parse_func.c:634 #, c-format msgid "" "No function matches the given name and argument types. You might need to add " @@ -16798,238 +19639,258 @@ msgstr "" "ì§€ì •ëœ ì´ë¦„ ë° ì¸ìž ìžë£Œí˜•ê³¼ ì¼ì¹˜í•˜ëŠ” 함수가 없습니다. ëª…ì‹œì  í˜•ë³€í™˜ìžë¥¼ 추가" "해야 í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." -#: parser/parse_func.c:727 +#: parser/parse_func.c:736 #, c-format msgid "VARIADIC argument must be an array" msgstr "VARIADIC 매개 변수는 ë°°ì—´ì´ì–´ì•¼ 함" -#: parser/parse_func.c:779 parser/parse_func.c:843 +#: parser/parse_func.c:791 parser/parse_func.c:856 #, c-format msgid "%s(*) must be used to call a parameterless aggregate function" msgstr "%s(*) 사용할 때는 ì´ í•¨ìˆ˜ê°€ 매개 변수 없는 집계 함수여야 합니다" -#: parser/parse_func.c:786 +#: parser/parse_func.c:798 #, c-format msgid "aggregates cannot return sets" msgstr "집계 함수는 세트를 반환할 수 ì—†ìŒ" -#: parser/parse_func.c:801 +#: parser/parse_func.c:813 #, c-format msgid "aggregates cannot use named arguments" msgstr "집계 함수는 ì¸ìž ì´ë¦„ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: parser/parse_func.c:833 +#: parser/parse_func.c:846 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "윈ë„ìš° í•¨ìˆ˜ì— ëŒ€í•´ DISTINCTê°€ 구현ë˜ì§€ 않ìŒ" -#: parser/parse_func.c:853 -#, c-format -msgid "aggregate ORDER BY is not implemented for window functions" -msgstr "윈ë„ìš° í•¨ìˆ˜ì— ëŒ€í•´ 집계용 ORDER BYê°€ 구현ë˜ì§€ 않ìŒ" - -#: parser/parse_func.c:862 +#: parser/parse_func.c:875 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "비집계 윈ë„ìš° í•¨ìˆ˜ì— ëŒ€í•´ FILTERê°€ 구현ë˜ì§€ 않ìŒ" -#: parser/parse_func.c:871 +#: parser/parse_func.c:884 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "윈ë„ìš° 함수 í˜¸ì¶œì— ì§‘í•© 반환 함수 í˜¸ì¶œì„ í¬í•¨í•  수 ì—†ìŒ" -#: parser/parse_func.c:879 +#: parser/parse_func.c:892 #, c-format msgid "window functions cannot return sets" msgstr "윈ë„ìš° 함수는 세트를 반환할 수 ì—†ìŒ" -#: parser/parse_func.c:2124 parser/parse_func.c:2315 +#: parser/parse_func.c:2167 parser/parse_func.c:2440 #, c-format msgid "could not find a function named \"%s\"" msgstr "\"%s\" 함수를 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: parser/parse_func.c:2138 parser/parse_func.c:2333 +#: parser/parse_func.c:2181 parser/parse_func.c:2458 #, c-format msgid "function name \"%s\" is not unique" msgstr "\"%s\" 함수 ì´ë¦„ì€ ìœ ì¼ì„±ì„ 가지지 못합니다(not unique)" -#: parser/parse_func.c:2140 parser/parse_func.c:2335 +#: parser/parse_func.c:2183 parser/parse_func.c:2461 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "ìž…ë ¥ ì¸ìžë¥¼ 다르게 해서 ì´ ëª¨í˜¸í•¨ì„ í”¼í•˜ì„¸ìš”." -#: parser/parse_func.c:2184 +#: parser/parse_func.c:2227 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" msgstr[0] "프로시져는 %dê°œ ì´ìƒì˜ ì¸ìžë¥¼ 사용할 수 ì—†ìŒ" -#: parser/parse_func.c:2233 +#: parser/parse_func.c:2358 #, c-format msgid "%s is not a function" msgstr "%s ì´ë¦„ì˜ ê°œì²´ëŠ” 함수가 아닙니다" -#: parser/parse_func.c:2253 +#: parser/parse_func.c:2378 #, c-format msgid "function %s is not an aggregate" msgstr "%s 함수는 집계 함수가 아닙니다" -#: parser/parse_func.c:2281 +#: parser/parse_func.c:2406 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "\"%s\" ì´ë¦„ì˜ í”„ë¡œì‹œì ¸ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: parser/parse_func.c:2295 +#: parser/parse_func.c:2420 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "\"%s\" ì´ë¦„ì˜ ì§‘ê³„ 함수를 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: parser/parse_func.c:2300 +#: parser/parse_func.c:2425 #, c-format msgid "aggregate %s(*) does not exist" msgstr "%s(*) 집계 함수 ì—†ìŒ" -#: parser/parse_func.c:2305 +#: parser/parse_func.c:2430 #, c-format msgid "aggregate %s does not exist" msgstr "%s 집계 함수 ì—†ìŒ" -#: parser/parse_func.c:2340 +#: parser/parse_func.c:2466 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "\"%s\" 프로시져는 유ì¼ì„±ì„ 가지지 못합니다(not unique)" -#: parser/parse_func.c:2342 +#: parser/parse_func.c:2469 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "해당 í”„ë¡œì‹œì ¸ì˜ ìž…ë ¥ ì¸ìžë¥¼ 다르게 해서 ì´ ëª¨í˜¸í•¨ì„ í”¼í•˜ì„¸ìš”." -#: parser/parse_func.c:2347 +#: parser/parse_func.c:2474 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "\"%s\" 집계 함수가 유ì¼ì„±ì„ 가지지 못합니다(not unique)" -#: parser/parse_func.c:2349 +#: parser/parse_func.c:2477 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "해당 집계 í•¨ìˆ˜ì˜ ìž…ë ¥ ì¸ìžë¥¼ 다르게 해서 ì´ ëª¨í˜¸í•¨ì„ í”¼í•˜ì„¸ìš”." -#: parser/parse_func.c:2354 +#: parser/parse_func.c:2482 #, c-format msgid "routine name \"%s\" is not unique" msgstr "\"%s\" 루틴 ì´ë¦„ì€ ìœ ì¼ì„±ì„ 가지지 못합니다(not unique)" -#: parser/parse_func.c:2356 +#: parser/parse_func.c:2485 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "해당 ë£¨í‹´ì˜ ìž…ë ¥ ì¸ìžë¥¼ 다르게 해서 ì´ ëª¨í˜¸í•¨ì„ í”¼í•˜ì„¸ìš”." -#: parser/parse_func.c:2411 +#: parser/parse_func.c:2540 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "ì§‘í•© 반환 함수는 JOIN ì¡°ê±´ì— ì‚¬ìš©í•  수 ì—†ìŒ" -#: parser/parse_func.c:2432 +#: parser/parse_func.c:2561 msgid "set-returning functions are not allowed in policy expressions" msgstr "ì§‘í•© 반환 함수는 ì •ì±… ì‹ì— 사용할 수 ì—†ìŒ" -#: parser/parse_func.c:2448 +#: parser/parse_func.c:2577 msgid "set-returning functions are not allowed in window definitions" msgstr "ì§‘í•© 반환 함수는 윈ë„ìš° 함수 ì •ì˜ì— 사용할 수 ì—†ìŒ" -#: parser/parse_func.c:2486 +#: parser/parse_func.c:2615 +msgid "set-returning functions are not allowed in MERGE WHEN conditions" +msgstr "ì§‘í•© 반환 함수는 MERGE WHEN ì¡°ê±´ì ˆì—서 사용할 수 ì—†ìŒ" + +#: parser/parse_func.c:2619 msgid "set-returning functions are not allowed in check constraints" msgstr "ì§‘í•© 반환 함수는 check ì œì•½ì¡°ê±´ì— ì‚¬ìš©í•  수 ì—†ìŒ" -#: parser/parse_func.c:2490 +#: parser/parse_func.c:2623 msgid "set-returning functions are not allowed in DEFAULT expressions" msgstr "ì§‘í•© 반환 함수는 DEFAULT ì‹ì—서 사용할 수 ì—†ìŒ" -#: parser/parse_func.c:2493 +#: parser/parse_func.c:2626 msgid "set-returning functions are not allowed in index expressions" msgstr "ì§‘í•© 반환 함수는 ì¸ë±ìФ ì‹ì—서 사용할 수 ì—†ìŒ" -#: parser/parse_func.c:2496 +#: parser/parse_func.c:2629 msgid "set-returning functions are not allowed in index predicates" msgstr "ì§‘í•© 반환 함수는 함수 기반 ì¸ë±ìФì—서 사용할 수 ì—†ìŒ" -#: parser/parse_func.c:2499 +#: parser/parse_func.c:2632 +msgid "set-returning functions are not allowed in statistics expressions" +msgstr "ì§‘í•© 반환 함수는 통계 ì •ë³´ ì‹ì— 사용할 수 ì—†ìŒ" + +#: parser/parse_func.c:2635 msgid "set-returning functions are not allowed in transform expressions" msgstr "ì§‘í•© 반환 함수는 transform ì‹ì—서 사용할 수 ì—†ìŒ" -#: parser/parse_func.c:2502 +#: parser/parse_func.c:2638 msgid "set-returning functions are not allowed in EXECUTE parameters" msgstr "ì§‘í•© 반환 함수는 EXECUTE 매개 변수 설정 값으로 사용할 수 ì—†ìŒ" -#: parser/parse_func.c:2505 +#: parser/parse_func.c:2641 msgid "set-returning functions are not allowed in trigger WHEN conditions" msgstr "ì§‘í•© 반환 함수는 íŠ¸ë¦¬ê±°ì˜ WHEN ì¡°ê±´ì ˆì—서 사용할 수 ì—†ìŒ" -#: parser/parse_func.c:2508 +#: parser/parse_func.c:2644 msgid "set-returning functions are not allowed in partition bound" msgstr "ì§‘í•© 반환 함수는 파티션 범위 ì‹ì—서 사용할 수 ì—†ìŒ" -#: parser/parse_func.c:2511 +#: parser/parse_func.c:2647 msgid "set-returning functions are not allowed in partition key expressions" msgstr "ì§‘í•© 반환 함수는 ì¸ë±ìФ ì‹ì—서 사용할 수 ì—†ìŒ" -#: parser/parse_func.c:2514 +#: parser/parse_func.c:2650 msgid "set-returning functions are not allowed in CALL arguments" msgstr "ì§‘í•© 반환 함수는 CALL ëª…ë ¹ì˜ ì¸ìžë¡œ 사용할 수 ì—†ìŒ" -#: parser/parse_func.c:2517 +#: parser/parse_func.c:2653 msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" msgstr "ì§‘í•© 반환 함수는 COPY FROM WHERE ì¡°ê±´ì ˆì— ì‚¬ìš©í•  수 ì—†ìŒ" -#: parser/parse_func.c:2520 +#: parser/parse_func.c:2656 msgid "" "set-returning functions are not allowed in column generation expressions" msgstr "ì§‘í•© 반환 함수는 미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì˜ ìƒì„±ì‹ì— 사용할 수 ì—†ìŒ" -#: parser/parse_node.c:86 +#: parser/parse_jsontable.c:95 #, c-format -msgid "target lists can have at most %d entries" -msgstr "ëŒ€ìƒ ëª©ë¡ì€ 최대 %d ê°œì˜ í•­ëª©ì„ ì§€ì •í•  수 있습니다" +msgid "" +"Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause." +msgstr "" +"EMPTY [ ARRAY ] ë˜ëŠ” ERROR는 최ìƒìœ„ 수준 ON ERROR ì ˆì—서만 쓸 수 있ìŒ" + +#: parser/parse_jsontable.c:189 parser/parse_jsontable.c:203 +#, c-format +msgid "duplicate JSON_TABLE column or path name: %s" +msgstr "JSON_TABLE 칼럼ì´ë‚˜ 패스 ì´ë¦„ì´ ì¤‘ë³µë¨: %s" + +#: parser/parse_merge.c:129 +#, c-format +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "MERGE 명령ì—서는 WITH RECURSIVE êµ¬ë¬¸ì„ ì§€ì›í•˜ì§€ 않습니다." -#: parser/parse_node.c:235 +#: parser/parse_merge.c:176 #, c-format -msgid "cannot subscript type %s because it is not an array" +msgid "unreachable WHEN clause specified after unconditional WHEN clause" msgstr "" -"ìžë£Œí˜• %s 는 ë°°ì—´ì´ ì•„ë‹ˆê¸° ë•Œë¬¸ì— ë°°ì—´ 하위 스í¬ë¦½íŠ¸ë¥¼ 기술할 수 없습니다." +"WHEN ì¡°ê±´ì ˆ íŒë‹¨ì„ 하지 못하는 ìƒí™©ì—서 ê·¸ ë’¤ì— ì˜¤ëŠ” ì¡°ê±´ 검사는 í•  수 없습니" +"다." -#: parser/parse_node.c:340 parser/parse_node.c:377 +#: parser/parse_merge.c:222 #, c-format -msgid "array subscript must have type integer" -msgstr "ë°°ì—´ 하위 스í¬ë¦½íŠ¸ëŠ” 반드시 정수형ì´ì–´ì•¼ 합니다." +msgid "name \"%s\" specified more than once" +msgstr "\"%s\" ì´ë¦„ì´ í•œë²ˆ ì´ìƒ 명시ë˜ì–´ 있습니다." -#: parser/parse_node.c:408 +#: parser/parse_merge.c:224 #, c-format -msgid "array assignment requires type %s but expression is of type %s" -msgstr "ë°°ì—´í• ë‹¹ì€ ìžë£Œí˜• %s ê°€ 필요하지만, 현재 표현ì‹ì´ %s ìžë£Œí˜•입니다" +msgid "The name is used both as MERGE target table and data source." +msgstr "ì´ ì´ë¦„ì´ MERGE 타켓 í…Œì´ë¸”ê³¼ ë°ì´í„° 소스 ë‘ ê³³ ëª¨ë‘ ì‚¬ìš©ë˜ì—ˆìŠµë‹ˆë‹¤." -#: parser/parse_oper.c:125 parser/parse_oper.c:724 utils/adt/regproc.c:521 -#: utils/adt/regproc.c:705 +#: parser/parse_node.c:82 #, c-format -msgid "operator does not exist: %s" -msgstr "ì—°ì‚°ìž ì—†ìŒ: %s" +msgid "target lists can have at most %d entries" +msgstr "ëŒ€ìƒ ëª©ë¡ì€ 최대 %d ê°œì˜ í•­ëª©ì„ ì§€ì •í•  수 있습니다" + +#: parser/parse_oper.c:114 parser/parse_oper.c:678 +#, c-format +msgid "postfix operators are not supported" +msgstr "postfix ì—°ì‚°ìžëŠ” ì§€ì›í•˜ì§€ 않습니다" -#: parser/parse_oper.c:224 +#: parser/parse_oper.c:217 #, c-format msgid "Use an explicit ordering operator or modify the query." msgstr "" "명시ì ìœ¼ë¡œ 순차연산ìž(ordering operator) 를 사용하ë˜ì§€, ë˜ëŠ” query 를 수정하" "ë„ë¡ í•˜ì„¸ìš”." -#: parser/parse_oper.c:480 +#: parser/parse_oper.c:473 #, c-format msgid "operator requires run-time type coercion: %s" msgstr "ì´ ì—°ì‚°ìžëŠ” ì‹¤í–‰ì‹œì— í˜• ê°•ì œì „í™”ì´ í•„ìš”í•©ë‹ˆë‹¤: %s" -#: parser/parse_oper.c:716 +#: parser/parse_oper.c:629 #, c-format msgid "operator is not unique: %s" msgstr "ì—°ì‚°ìžê°€ 고유하지 않습니다: %s" -#: parser/parse_oper.c:718 +#: parser/parse_oper.c:631 #, c-format msgid "" "Could not choose a best candidate operator. You might need to add explicit " @@ -17038,7 +19899,7 @@ msgstr "" "가장 ì ë‹¹í•œ ì—°ì‚°ìžë¥¼ ì„ íƒí•  수 없습니다. ëª…ì‹œì  í˜•ë³€í™˜ìžë¥¼ 추가해야 í•  ìˆ˜ë„ " "있습니다." -#: parser/parse_oper.c:727 +#: parser/parse_oper.c:640 #, c-format msgid "" "No operator matches the given name and argument type. You might need to add " @@ -17047,7 +19908,7 @@ msgstr "" "ì§€ì •ëœ ì´ë¦„ ë° ì¸ìž 형ì‹ê³¼ ì¼ì¹˜í•˜ëŠ” ì—°ì‚°ìžê°€ 없습니다. ëª…ì‹œì  í˜•ë³€í™˜ìžë¥¼ 추가" "해야 í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." -#: parser/parse_oper.c:729 +#: parser/parse_oper.c:642 #, c-format msgid "" "No operator matches the given name and argument types. You might need to add " @@ -17056,52 +19917,53 @@ msgstr "" "ì§€ì •ëœ ì´ë¦„ ë° ì¸ìž 형ì‹ê³¼ ì¼ì¹˜í•˜ëŠ” ì—°ì‚°ìžê°€ 없습니다. ëª…ì‹œì  í˜•ë³€í™˜ìžë¥¼ 추가" "해야 í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." -#: parser/parse_oper.c:790 parser/parse_oper.c:912 -#, c-format -msgid "operator is only a shell: %s" -msgstr "ì—°ì‚°ìžëŠ” ì…¸ì¼ ë¿ìž„: %s" - -#: parser/parse_oper.c:900 +#: parser/parse_oper.c:803 #, c-format msgid "op ANY/ALL (array) requires array on right side" msgstr "op ANY/ALL (array) 는 ìš°ì¸¡ì— ë°°ì—´ì´ ìžˆì–´ì•¼ 합니다." -#: parser/parse_oper.c:942 +#: parser/parse_oper.c:844 #, c-format msgid "op ANY/ALL (array) requires operator to yield boolean" -msgstr "op ANY/ALL (array) 는 boolean ì„ ì–»ê¸° 위한 ì—°ì‚°ìžê°€ 필요합니다." +msgstr "op ANY/ALL (array) 는 ë¶ˆë¦¬ì–¸ì„ ì–»ê¸° 위한 ì—°ì‚°ìžê°€ 필요합니다." -#: parser/parse_oper.c:947 +#: parser/parse_oper.c:849 #, c-format msgid "op ANY/ALL (array) requires operator not to return a set" msgstr "op ANY/ALL (array) 는 set ì„ return 하지 않는 ì—°ì‚°ìžê°€ 요구 ë©ë‹ˆë‹¤." -#: parser/parse_param.c:216 +#: parser/parse_param.c:221 #, c-format msgid "inconsistent types deduced for parameter $%d" msgstr "inconsistent types deduced for parameter $%d" -#: parser/parse_relation.c:201 +#: parser/parse_param.c:309 tcop/postgres.c:744 +#, c-format +msgid "could not determine data type of parameter $%d" +msgstr "$%d 매개 ë³€ìˆ˜ì˜ ìžë£Œí˜•ì„ ì•Œìˆ˜ê°€ 없습니다." + +#: parser/parse_relation.c:221 #, c-format msgid "table reference \"%s\" is ambiguous" msgstr "í…Œì´ë¸” 참조 \"%s\" ê°€ 명확하지 않습니다 (ambiguous)." -#: parser/parse_relation.c:245 +#: parser/parse_relation.c:265 #, c-format msgid "table reference %u is ambiguous" msgstr "í…Œì´ë¸” 참조 %u ê°€ 명확하지 않습니다 (ambiguous)." -#: parser/parse_relation.c:444 +#: parser/parse_relation.c:465 #, c-format msgid "table name \"%s\" specified more than once" msgstr "í…Œì´ë¸” ì´ë¦„ \"%s\" ê°€ 한번 ì´ìƒ 명시ë˜ì–´ 있습니다." -#: parser/parse_relation.c:473 parser/parse_relation.c:3446 +#: parser/parse_relation.c:494 parser/parse_relation.c:3633 +#: parser/parse_relation.c:3642 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "\"%s\" í…Œì´ë¸”ì„ ì‚¬ìš©í•˜ëŠ” FROM ì ˆì— ëŒ€í•œ 참조가 잘못 ë˜ì—ˆìŠµë‹ˆë‹¤." -#: parser/parse_relation.c:477 parser/parse_relation.c:3451 +#: parser/parse_relation.c:498 parser/parse_relation.c:3644 #, c-format msgid "" "There is an entry for table \"%s\", but it cannot be referenced from this " @@ -17109,37 +19971,42 @@ msgid "" msgstr "" "\"%s\" í…Œì´ë¸”ì— ëŒ€í•œ í•­ëª©ì´ ìžˆì§€ë§Œ ì´ ì¿¼ë¦¬ 부분ì—서 참조할 수 없습니다." -#: parser/parse_relation.c:479 +#: parser/parse_relation.c:500 #, c-format msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." -msgstr "" +msgstr "LATERAL ì˜µì…˜ì„ ì‚¬ìš©í•  때는 ê·¸ ì¡°ì¸ í˜•íƒœê°€ INNER ë˜ëŠ” LEFT여야 합니다." -#: parser/parse_relation.c:690 +#: parser/parse_relation.c:703 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "제약 ì¡°ê±´ì—서 참조하는 \"%s\" 시스템 ì¹¼ëŸ¼ì´ ì—†ìŒ" -#: parser/parse_relation.c:699 +#: parser/parse_relation.c:712 #, c-format msgid "cannot use system column \"%s\" in column generation expression" msgstr "" "\"%s\" ì¹¼ëŸ¼ì€ ì‹œìŠ¤í…œ 칼럼임. 미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì˜ ìƒì„±ì‹ì— 사용할 수 ì—†ìŒ" -#: parser/parse_relation.c:1170 parser/parse_relation.c:1620 -#: parser/parse_relation.c:2262 +#: parser/parse_relation.c:723 +#, c-format +msgid "cannot use system column \"%s\" in MERGE WHEN condition" +msgstr "\"%s\" ì¹¼ëŸ¼ì€ ì‹œìŠ¤í…œ 칼럼입니다. MERGE WHEN ì¡°ê±´ì ˆì—서 ì‚¬ìš©ë  ìˆ˜ ì—†ìŒ" + +#: parser/parse_relation.c:1236 parser/parse_relation.c:1691 +#: parser/parse_relation.c:2384 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "" "í…Œì´ë¸” \"%s\" ì—는 %d ê°œì˜ ì¹¼ëŸ¼ì´ ìžˆëŠ”ë°, %d ê°œì˜ ì¹¼ëŸ¼ë§Œ 명시ë˜ì—ˆìŠµë‹ˆë‹¤." -#: parser/parse_relation.c:1372 +#: parser/parse_relation.c:1445 #, c-format msgid "" "There is a WITH item named \"%s\", but it cannot be referenced from this " "part of the query." msgstr "\"%s\"(ì´)ë¼ëŠ” WITH í•­ëª©ì´ ìžˆì§€ë§Œ ì´ ì¿¼ë¦¬ 부분ì—서 참조할 수 없습니다." -#: parser/parse_relation.c:1374 +#: parser/parse_relation.c:1447 #, c-format msgid "" "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." @@ -17147,65 +20014,106 @@ msgstr "" "WITH RECURSIVE를 사용하거나 WITH í•­ëª©ì˜ ìˆœì„œë¥¼ 변경하여 ì •ë°©í–¥ 참조를 제거하" "십시오." -#: parser/parse_relation.c:1747 +#: parser/parse_relation.c:1833 +#, c-format +msgid "" +"a column definition list is redundant for a function with OUT parameters" +msgstr "칼럼 ì •ì˜ ëª©ë¡ì´ OUT 매개 변수를 사용하는 함수ì—서 중복ë˜ì—ˆìŒ" + +#: parser/parse_relation.c:1839 +#, c-format +msgid "" +"a column definition list is redundant for a function returning a named " +"composite type" +msgstr "칼럼 ì •ì˜ ëª©ë¡ì´ ì´ë¦„ 기반 복합 ìžë£Œí˜•ì„ ë°˜í™˜í•˜ëŠ” 함수ì—서 중복ë˜ì—ˆìŒ" + +#: parser/parse_relation.c:1846 #, c-format msgid "" "a column definition list is only allowed for functions returning \"record\"" msgstr "" -"ì—´ ì •ì˜ ë¦¬ìŠ¤íŠ¸ (column definition list) 는 오로지 \"record\" 를 리턴하는 함" -"수 ë‚´ì—서만 허용ë©ë‹ˆë‹¤." +"칼럼 ì •ì˜ ëª©ë¡ëŠ” 오로지 \"record\" 를 리턴하는 함수 ë‚´ì—서만 허용ë©ë‹ˆë‹¤." -#: parser/parse_relation.c:1756 +#: parser/parse_relation.c:1857 #, c-format msgid "a column definition list is required for functions returning \"record\"" -msgstr "" -"ì—´ ì •ì˜ ë¦¬ìŠ¤íŠ¸(column definition list)는 \"record\" 를 리턴하는 함수를 í•„ìš”" -"로 합니다" +msgstr "칼럼 ì •ì˜ ëª©ë¡ì€ \"record\" 를 리턴하는 함수를 필요로 합니다" + +#: parser/parse_relation.c:1894 +#, c-format +msgid "column definition lists can have at most %d entries" +msgstr "칼럼 ì •ì˜ ëª©ë¡ì€ 최대 %d ê°œì˜ í•­ëª©ì„ ì§€ì •í•  수 있습니다" -#: parser/parse_relation.c:1845 +#: parser/parse_relation.c:1954 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "" "FROM ì ˆ ë‚´ì˜ í•¨ìˆ˜ \"%s\" ì— ì§€ì›ë˜ì§€ 않는 return ìžë£Œí˜• %s ì´ ìžˆìŠµë‹ˆë‹¤." -#: parser/parse_relation.c:2054 +#: parser/parse_relation.c:1981 parser/parse_relation.c:2066 +#, c-format +msgid "functions in FROM can return at most %d columns" +msgstr "FROM ì ˆì— ì“°ëŠ” 함수는 최대 %dê°œì˜ ì¹¼ëŸ¼ì„ ë°˜í™˜í•˜ëŠ” 것ì´ì—¬ì•¼ 함" + +#: parser/parse_relation.c:2096 +#, c-format +msgid "%s function has %d columns available but %d columns specified" +msgstr "%s 함수는 %d ê°œì˜ ì¹¼ëŸ¼ì„ ë°˜í™˜í•˜ëŠ”ë°, %d ê°œì˜ ì¹¼ëŸ¼ë§Œ 명시ë˜ì—ˆìŠµë‹ˆë‹¤." + +#: parser/parse_relation.c:2177 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "" "VALUES ë’¤ì— ì˜¤ëŠ” \"%s\" 구문ì—는 %dê°œì˜ ì¹¼ëŸ¼ì´ ìžˆëŠ”ë°, 지정한 ì¹¼ëŸ¼ì€ %dê°œ ìž…" "니다" -#: parser/parse_relation.c:2125 +#: parser/parse_relation.c:2242 #, c-format msgid "joins can have at most %d columns" msgstr "ì¡°ì¸ì—는 최대 %dê°œì˜ ì¹¼ëŸ¼ì„ í¬í•¨í•  수 있ìŒ" -#: parser/parse_relation.c:2235 +#: parser/parse_relation.c:2267 #, c-format -msgid "WITH query \"%s\" does not have a RETURNING clause" +msgid "" +"join expression \"%s\" has %d columns available but %d columns specified" msgstr "" +"\"%s\" ì¡°ì¸ì‹ì—는 %d ê°œì˜ ì¹¼ëŸ¼ì´ ìžˆëŠ”ë°, %d ê°œì˜ ì¹¼ëŸ¼ë§Œ 명시ë˜ì—ˆìŠµë‹ˆë‹¤." -#: parser/parse_relation.c:3221 parser/parse_relation.c:3231 +#: parser/parse_relation.c:2357 #, c-format -msgid "column %d of relation \"%s\" does not exist" -msgstr "%d번째 ì¹¼ëŸ¼ì´ ì—†ìŠµë‹ˆë‹¤. 해당 릴레ì´ì…˜: \"%s\"" +msgid "WITH query \"%s\" does not have a RETURNING clause" +msgstr "\"%s\" WITH ì¿¼ë¦¬ì— RETURNING ì ˆì´ ì—†ìŠµë‹ˆë‹¤." -#: parser/parse_relation.c:3449 +#: parser/parse_relation.c:3635 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "ì•„ \"%s\" alias를 참조해야 í•  것 같습니다." -#: parser/parse_relation.c:3457 +#: parser/parse_relation.c:3647 +#, c-format +msgid "To reference that table, you must mark this subquery with LATERAL." +msgstr "ê·¸ í…Œì´ë¸”ì„ ì°¸ì¡°í•˜ë ¤ë©´, ì„œë¸Œì¿¼ë¦¬ì— LATERAL 예약어를 사용하세요." + +#: parser/parse_relation.c:3653 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "í…Œì´ë¸” \"%s\"ì— FROM ì ˆì´ ë¹ ì ¸ 있습니다." -#: parser/parse_relation.c:3509 +#: parser/parse_relation.c:3693 +#, c-format +msgid "" +"There are columns named \"%s\", but they are in tables that cannot be " +"referenced from this part of the query." +msgstr "" +"\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼ì´ í…Œì´ë¸”ì— ìžˆì§€ë§Œ, ì´ ì¿¼ë¦¬ì˜ ì´ ë¶€ë¶„ì—서는 ì°¸ì¡°ë  ìˆ˜ 없습" +"니다." + +#: parser/parse_relation.c:3695 #, c-format -msgid "Perhaps you meant to reference the column \"%s.%s\"." -msgstr "아마 \"%s.%s\" ì¹¼ëŸ¼ì„ ì°¸ì¡°í•˜ëŠ” 것 같습니다." +msgid "Try using a table-qualified name." +msgstr "í…Œì´ë¸”ì„ ì§€ì •í•  수 있는 ì´ë¦„ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: parser/parse_relation.c:3511 +#: parser/parse_relation.c:3703 #, c-format msgid "" "There is a column named \"%s\" in table \"%s\", but it cannot be referenced " @@ -17214,33 +20122,48 @@ msgstr "" "\"%s\" ì´ë¦„ì˜ ì¹¼ëŸ¼ì´ \"%s\" í…Œì´ë¸”ì— ìžˆì§€ë§Œ, ì´ ì¿¼ë¦¬ì˜ ì´ ë¶€ë¶„ì—서는 ì°¸ì¡°ë  " "수 없습니다." -#: parser/parse_relation.c:3528 +#: parser/parse_relation.c:3706 +#, c-format +msgid "To reference that column, you must mark this subquery with LATERAL." +msgstr "해당 ì¹¼ëŸ¼ì„ ì°¸ì¡°í•˜ë ¤ë©´, LATERAL ì˜µì…˜ì´ ìžˆëŠ” 서브쿼리를 사용하세요." + +#: parser/parse_relation.c:3708 +#, c-format +msgid "To reference that column, you must use a table-qualified name." +msgstr "해당 ì¹¼ëŸ¼ì„ ì°¸ì¡°í•˜ë ¤ë©´, í…Œì´ë¸” 지정 ì´ë¦„ì„ ì‚¬ìš©í•˜ì„¸ìš”." + +#: parser/parse_relation.c:3728 +#, c-format +msgid "Perhaps you meant to reference the column \"%s.%s\"." +msgstr "아마 \"%s.%s\" ì¹¼ëŸ¼ì„ ì°¸ì¡°í•˜ëŠ” 것 같습니다." + +#: parser/parse_relation.c:3742 #, c-format msgid "" "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "아마 \"%s.%s\" 칼럼ì´ë‚˜ \"%s.%s\" ì¹¼ëŸ¼ì„ ì°¸ì¡°í•˜ëŠ” 것 같습니다." -#: parser/parse_target.c:478 parser/parse_target.c:792 +#: parser/parse_target.c:480 parser/parse_target.c:795 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "시스템 ì—´ \"%s\"ì— í• ë‹¹í•  수 없습니다." -#: parser/parse_target.c:506 +#: parser/parse_target.c:508 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "ë°°ì—´ 요소를 DEFAULT 로 설정할 수 없습니다." -#: parser/parse_target.c:511 +#: parser/parse_target.c:513 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "하위필드를 DEFAULT로 설정할 수 없습니다." -#: parser/parse_target.c:584 +#: parser/parse_target.c:587 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "ì—´ \"%s\"ì€(는) %s ìžë£Œí˜•ì¸ë° 표현ì‹ì€ %s ìžë£Œí˜•입니다." -#: parser/parse_target.c:776 +#: parser/parse_target.c:779 #, c-format msgid "" "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a " @@ -17249,7 +20172,7 @@ msgstr "" "\"%s\" 필드 (ëŒ€ìƒ ì—´ \"%s\")를 지정할 수 ì—†ìŒ, %s ìžë£Œí˜•ì€ ë³µí•©ìžë£Œí˜•ì´ ì•„ë‹ˆ" "기 때문" -#: parser/parse_target.c:785 +#: parser/parse_target.c:788 #, c-format msgid "" "cannot assign to field \"%s\" of column \"%s\" because there is no such " @@ -17258,19 +20181,20 @@ msgstr "" "\"%s\" 필드 (ëŒ€ìƒ ì—´ \"%s\")를 지정할 수 ì—†ìŒ, %s ìžë£Œí˜•ì—서 그런 ì¹¼ëŸ¼ì„ ì°¾" "ì„ ìˆ˜ ì—†ìŒ" -#: parser/parse_target.c:864 +#: parser/parse_target.c:877 #, c-format msgid "" -"array assignment to \"%s\" requires type %s but expression is of type %s" +"subscripted assignment to \"%s\" requires type %s but expression is of type " +"%s" msgstr "" -"\"%s\" ì—´ì— ì‚¬ìš©ëœ ìžë£Œí˜•ì€ %s ê°€ 필요하지만, 현재 표현ì‹ì´ %s ìžë£Œí˜•입니다" +"\"%s\" subscript ìžë£Œí˜•ì€ %s í˜•ì´ í•„ìš”í•˜ì§€ë§Œ, 현재 표현ì‹ì€ %s ìžë£Œí˜•입니다" -#: parser/parse_target.c:874 +#: parser/parse_target.c:887 #, c-format msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "하위필드 \"%s\" 는 %s ìžë£Œí˜•ì¸ë° 표현ì‹ì€ %s ìžë£Œí˜•입니다." -#: parser/parse_target.c:1295 +#: parser/parse_target.c:1327 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "í…Œì´ë¸”ì´ ëª…ì‹œë˜ì§€ ì•Šì€ SELECT * êµ¬ë¬¸ì€ ìœ íš¨í•˜ì§€ 않습니다." @@ -17292,8 +20216,8 @@ msgstr "" msgid "type reference %s converted to %s" msgstr "ype reference %s ê°€ %s 로 변환ë˜ì—ˆìŠµë‹ˆë‹¤." -#: parser/parse_type.c:278 parser/parse_type.c:857 utils/cache/typcache.c:383 -#: utils/cache/typcache.c:437 +#: parser/parse_type.c:278 parser/parse_type.c:813 utils/cache/typcache.c:397 +#: utils/cache/typcache.c:452 #, c-format msgid "type \"%s\" is only a shell" msgstr "ìžë£Œí˜• \"%s\" 는 오로지 shell ì—ë§Œ 있습니다. " @@ -17303,203 +20227,203 @@ msgstr "ìžë£Œí˜• \"%s\" 는 오로지 shell ì—ë§Œ 있습니다. " msgid "type modifier is not allowed for type \"%s\"" msgstr "\"%s\" 형ì‹ì—는 í˜•ì‹ í•œì •ìžë¥¼ 사용할 수 ì—†ìŒ" -#: parser/parse_type.c:405 +#: parser/parse_type.c:409 #, c-format msgid "type modifiers must be simple constants or identifiers" msgstr "ìžë£Œí˜• 한정ìžëŠ” 단순 ìƒìˆ˜ ë˜ëŠ” ì‹ë³„ìžì—¬ì•¼ 함" -#: parser/parse_type.c:721 parser/parse_type.c:820 +#: parser/parse_type.c:723 parser/parse_type.c:773 #, c-format msgid "invalid type name \"%s\"" msgstr "\"%s\" ìžë£Œí˜• ì´ë¦„ì€ ìœ íš¨í•˜ì§€ ì•Šì€ ìžë£Œí˜•입니다." -#: parser/parse_utilcmd.c:264 +#: parser/parse_utilcmd.c:263 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "ìƒì† 하위 í…Œì´ë¸”로 íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì„ ë§Œë“¤ 수 ì—†ìŒ" -#: parser/parse_utilcmd.c:428 +#: parser/parse_utilcmd.c:475 #, c-format -msgid "%s will create implicit sequence \"%s\" for serial column \"%s.%s\"" -msgstr "" -"%s 명령으로 \"%s\" 시퀀스가 ìžë™ìœ¼ë¡œ ë§Œë“¤ì–´ì§ (\"%s.%s\" serial ì—´ 때문)" +msgid "cannot set logged status of a temporary sequence" +msgstr "임시 ì‹œí€€ìŠ¤ì˜ ê¸°ë¡ëœ ìƒíƒœë¥¼ 지정할 수 ì—†ìŒ" -#: parser/parse_utilcmd.c:559 +#: parser/parse_utilcmd.c:611 #, c-format msgid "array of serial is not implemented" msgstr "serial ë°°ì—´ì´ êµ¬í˜„ë˜ì§€ 않ìŒ" -#: parser/parse_utilcmd.c:637 parser/parse_utilcmd.c:649 +#: parser/parse_utilcmd.c:690 parser/parse_utilcmd.c:702 +#: parser/parse_utilcmd.c:761 #, c-format msgid "" "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "NULL/NOT NULL ì„ ì–¸ì´ ì„œë¡œ ì¶©ëŒí•©ë‹ˆë‹¤ : column \"%s\" of table \"%s\"" -#: parser/parse_utilcmd.c:661 +#: parser/parse_utilcmd.c:714 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "\"%s\" 칼럼(\"%s\" í…Œì´ë¸”)ì— ëŒ€í•´ 여러 ê°œì˜ ê¸°ë³¸ ê°’ì´ ì§€ì •ë¨" -#: parser/parse_utilcmd.c:678 +#: parser/parse_utilcmd.c:731 #, c-format msgid "identity columns are not supported on typed tables" msgstr "" "ì‹ë³„ ì¹¼ëŸ¼ì€ íƒ€ìž…ë“œ í…Œì´ë¸”(typed table - ìžë£Œí˜•ìœ¼ë¡œì¨ í…Œì´ë¸”)ì—서는 쓸 수 ì—†ìŒ" -#: parser/parse_utilcmd.c:682 +#: parser/parse_utilcmd.c:735 #, c-format msgid "identity columns are not supported on partitions" msgstr "ì‹ë³„ ì¹¼ëŸ¼ì€ íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì—서는 사용할 수 ì—†ìŒ" -#: parser/parse_utilcmd.c:691 +#: parser/parse_utilcmd.c:744 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "\"%s\" 칼럼(\"%s\" í…Œì´ë¸”)ì— ëŒ€í•´ 여러 ê°œì˜ ì‹ë³„ìž ì§€ì •ì´ ì‚¬ìš©ë˜ì—ˆìŒ" -#: parser/parse_utilcmd.c:711 +#: parser/parse_utilcmd.c:774 #, c-format msgid "generated columns are not supported on typed tables" msgstr "" "미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì€ íƒ€ìž…ë“œ í…Œì´ë¸”(typed table - ìžë£Œí˜•ìœ¼ë¡œì¨ í…Œì´ë¸”)ì—서는 쓸 " "수 ì—†ìŒ" -#: parser/parse_utilcmd.c:715 -#, c-format -msgid "generated columns are not supported on partitions" -msgstr "미리 ê³„ì‚°ëœ ì¹¼ëŸ¼ì€ íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì—서는 사용할 수 ì—†ìŒ" - -#: parser/parse_utilcmd.c:720 +#: parser/parse_utilcmd.c:778 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "\"%s\" 칼럼(\"%s\" í…Œì´ë¸”)ì— ëŒ€í•´ 여러 ê°œì˜ ìƒì„±ì‹ì´ 지정ë¨" -#: parser/parse_utilcmd.c:738 parser/parse_utilcmd.c:853 +#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:911 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "기본키 제약 ì¡°ê±´ì„ ì™¸ë¶€ í…Œì´ë¸”ì—서는 사용할 수 ì—†ìŒ" -#: parser/parse_utilcmd.c:747 parser/parse_utilcmd.c:863 +#: parser/parse_utilcmd.c:805 parser/parse_utilcmd.c:921 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "ìœ ë‹ˆí¬ ì œì•½ ì¡°ê±´ì€ ì™¸ë¶€ í…Œì´ë¸”ì—서는 사용할 수 ì—†ìŒ" -#: parser/parse_utilcmd.c:792 +#: parser/parse_utilcmd.c:850 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "\"%s\" 칼럼(\"%s\" í…Œì´ë¸”)ì— ëŒ€í•´ default와 ì‹ë³„ìž ì •ì˜ê°€ 함께 있ìŒ" -#: parser/parse_utilcmd.c:800 +#: parser/parse_utilcmd.c:858 #, c-format msgid "" "both default and generation expression specified for column \"%s\" of table " "\"%s\"" -msgstr "\"%s\" 칼럼(해당 í…Œì´ë¸” \"%s\")ì— ëŒ€í•´ default ì •ì˜ì™€ 미리 ê³„ì‚°ëœ í‘œí˜„ì‹ì´ 함께 있ìŒ" +msgstr "" +"\"%s\" 칼럼(해당 í…Œì´ë¸” \"%s\")ì— ëŒ€í•´ default ì •ì˜ì™€ 미리 ê³„ì‚°ëœ í‘œí˜„ì‹ì´ 함" +"께 있ìŒ" -#: parser/parse_utilcmd.c:808 +#: parser/parse_utilcmd.c:866 #, c-format msgid "" "both identity and generation expression specified for column \"%s\" of table " "\"%s\"" -msgstr "\"%s\" 칼럼(해당 í…Œì´ë¸” \"%s\")ì— ëŒ€í•´ identity ì •ì˜ì™€ 미리 ê³„ì‚°ëœ í‘œí˜„ì‹ì´ 함께 있ìŒ" +msgstr "" +"\"%s\" 칼럼(해당 í…Œì´ë¸” \"%s\")ì— ëŒ€í•´ identity ì •ì˜ì™€ 미리 ê³„ì‚°ëœ í‘œí˜„ì‹ì´ " +"함께 있ìŒ" -#: parser/parse_utilcmd.c:873 +#: parser/parse_utilcmd.c:931 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "제외 제약 ì¡°ê±´ì€ ì™¸ë¶€ í…Œì´ë¸”ì—서는 사용할 수 ì—†ìŒ" -#: parser/parse_utilcmd.c:879 -#, c-format -msgid "exclusion constraints are not supported on partitioned tables" -msgstr "제외 제약 ì¡°ê±´ì€ íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì—서는 사용할 수 ì—†ìŒ" - -#: parser/parse_utilcmd.c:944 +#: parser/parse_utilcmd.c:996 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "외부 í…Œì´ë¸”ì„ ë§Œë“¤ 때는 LIKE ì˜µì…˜ì„ ì“¸ 수 ì—†ìŒ" -#: parser/parse_utilcmd.c:1704 parser/parse_utilcmd.c:1813 +#: parser/parse_utilcmd.c:1009 +#, c-format +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "\"%s\" 릴레ì´ì…˜ì€ LIKE ì ˆì—서 바르지 않ìŒ" + +#: parser/parse_utilcmd.c:1736 parser/parse_utilcmd.c:1844 #, c-format msgid "Index \"%s\" contains a whole-row table reference." -msgstr "" +msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” ì „ì²´ 로우 í…Œì´ë¸” 참조를 í¬í•¨í•˜ê³  있습니다." -#: parser/parse_utilcmd.c:2163 +#: parser/parse_utilcmd.c:2242 #, c-format msgid "cannot use an existing index in CREATE TABLE" -msgstr "" +msgstr "CREATE TABLE 명령ì—서 ì´ë¯¸ 있는 ì¸ë±ìŠ¤ëŠ” 사용할 수 없습니다." -#: parser/parse_utilcmd.c:2183 +#: parser/parse_utilcmd.c:2262 #, c-format msgid "index \"%s\" is already associated with a constraint" -msgstr "" - -#: parser/parse_utilcmd.c:2198 -#, c-format -msgid "index \"%s\" is not valid" -msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” 사용가능 ìƒíƒœê°€ 아님" +msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” ì´ë¯¸ 한 제약 ì¡°ê±´ì—서 사용 중입니다." -#: parser/parse_utilcmd.c:2204 +#: parser/parse_utilcmd.c:2283 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\" 개체는 ìœ ë‹ˆí¬ ì¸ë±ìŠ¤ê°€ 아닙니다" -#: parser/parse_utilcmd.c:2205 parser/parse_utilcmd.c:2212 -#: parser/parse_utilcmd.c:2219 parser/parse_utilcmd.c:2296 +#: parser/parse_utilcmd.c:2284 parser/parse_utilcmd.c:2291 +#: parser/parse_utilcmd.c:2298 parser/parse_utilcmd.c:2375 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." -msgstr "" +msgstr "ì´ ì¸ë±ìŠ¤ë¥¼ ì´ìš©í•˜ëŠ” 기본키나 ìœ ë‹ˆí¬ ì œì•½ì¡°ê±´ì€ ë§Œë“¤ 수 없습니다." -#: parser/parse_utilcmd.c:2211 +#: parser/parse_utilcmd.c:2290 #, c-format msgid "index \"%s\" contains expressions" msgstr "\"%s\" ì¸ë±ìŠ¤ì— í‘œí˜„ì‹ì´ í¬í•¨ë˜ì–´ 있ìŒ" -#: parser/parse_utilcmd.c:2218 +#: parser/parse_utilcmd.c:2297 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\" 개체는 부분 ì¸ë±ìŠ¤ìž„" -#: parser/parse_utilcmd.c:2230 +#: parser/parse_utilcmd.c:2309 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\" 개체는 지연가능한 ì¸ë±ìŠ¤ìž„" -#: parser/parse_utilcmd.c:2231 +#: parser/parse_utilcmd.c:2310 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "" +"지연 가능한 ì¸ë±ìŠ¤ë¥¼ 사용해서 지연 불가능한 제약 ì¡°ê±´ì€ ë§Œë“¤ 수 없습니다." -#: parser/parse_utilcmd.c:2295 +#: parser/parse_utilcmd.c:2374 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "\"%s\" ì¸ë±ìФ %d 번째 ì¹¼ëŸ¼ì˜ ê¸°ë³¸ ì •ë ¬ ë°©ë²•ì´ ì—†ìŒ" -#: parser/parse_utilcmd.c:2452 +#: parser/parse_utilcmd.c:2531 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "기본키 제약 ì¡°ê±´ì—서 \"%s\" ì¹¼ëŸ¼ì´ ë‘ ë²ˆ 지정ë˜ì—ˆìŠµë‹ˆë‹¤" -#: parser/parse_utilcmd.c:2458 +#: parser/parse_utilcmd.c:2537 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "고유 제약 ì¡°ê±´ì—서 \"%s\" ì¹¼ëŸ¼ì´ ë‘ ë²ˆ 지정ë˜ì—ˆìŠµë‹ˆë‹¤" -#: parser/parse_utilcmd.c:2811 +#: parser/parse_utilcmd.c:2871 #, c-format msgid "" "index expressions and predicates can refer only to the table being indexed" msgstr "ì¸ë±ìФ ì‹ ë° ìˆ ì–´ëŠ” ì¸ë±ì‹±ë˜ëŠ” í…Œì´ë¸”ë§Œ 참조할 수 있ìŒ" -#: parser/parse_utilcmd.c:2857 +#: parser/parse_utilcmd.c:2943 +#, c-format +msgid "statistics expressions can refer only to the table being referenced" +msgstr "통계 ì •ë³´ ì‹ì€ 참조ë˜ëŠ” í…Œì´ë¸”ë§Œ 대ìƒì´ì–´ì•¼ 함" + +#: parser/parse_utilcmd.c:2986 #, c-format msgid "rules on materialized views are not supported" msgstr "êµ¬ì²´í™”ëœ ë·°ì—ì„œì˜ ë£°ì€ ì§€ì›í•˜ì§€ 않ìŒ" -#: parser/parse_utilcmd.c:2920 +#: parser/parse_utilcmd.c:3046 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "룰ì—서 지정한 WHERE ì¡°ê±´ì— ë‹¤ë¥¸ 릴레ì´ì…˜ì— 대한 참조를 í¬í•¨í•  수 ì—†ìŒ" -#: parser/parse_utilcmd.c:2994 +#: parser/parse_utilcmd.c:3118 #, c-format msgid "" "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE " @@ -17508,232 +20432,238 @@ msgstr "" "룰ì—서 지정한 WHERE ì¡°ê±´ì´ ìžˆëŠ” 규칙ì—는 SELECT, INSERT, UPDATE ë˜ëŠ” DELETE " "작업만 í¬í•¨í•  수 있ìŒ" -#: parser/parse_utilcmd.c:3012 parser/parse_utilcmd.c:3113 -#: rewrite/rewriteHandler.c:502 rewrite/rewriteManip.c:1018 +#: parser/parse_utilcmd.c:3136 parser/parse_utilcmd.c:3237 +#: rewrite/rewriteHandler.c:544 rewrite/rewriteManip.c:1095 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "conditional UNION/INTERSECT/EXCEPT êµ¬ë¬¸ì€ êµ¬í˜„ë˜ì–´ 있지 않다" -#: parser/parse_utilcmd.c:3030 +#: parser/parse_utilcmd.c:3154 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON SELECT ë£°ì€ OLD를 사용할 수 ì—†ìŒ" -#: parser/parse_utilcmd.c:3034 +#: parser/parse_utilcmd.c:3158 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON SELECT ë£°ì€ NEW를 사용할 수 ì—†ìŒ" -#: parser/parse_utilcmd.c:3043 +#: parser/parse_utilcmd.c:3167 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON INSERT ë£°ì€ OLD를 사용할 수 ì—†ìŒ" -#: parser/parse_utilcmd.c:3049 +#: parser/parse_utilcmd.c:3173 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON DELETE ë£°ì€ NEW를 사용할 수 ì—†ìŒ" -#: parser/parse_utilcmd.c:3077 +#: parser/parse_utilcmd.c:3201 #, c-format msgid "cannot refer to OLD within WITH query" -msgstr "" +msgstr "WITH 쿼리 안ì—서 OLD 예약어를 참조할 수 없습니다." -#: parser/parse_utilcmd.c:3084 +#: parser/parse_utilcmd.c:3208 #, c-format msgid "cannot refer to NEW within WITH query" -msgstr "" +msgstr "WITH 쿼리 안ì—서 NEW 예약어를 참조할 수 없습니다." -#: parser/parse_utilcmd.c:3542 +#: parser/parse_utilcmd.c:3664 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "DEFERABLE ì ˆì´ ìž˜ëª» 놓여져 있습니다" -#: parser/parse_utilcmd.c:3547 parser/parse_utilcmd.c:3562 +#: parser/parse_utilcmd.c:3669 parser/parse_utilcmd.c:3684 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "여러 ê°œì˜ DEFERRABLE/NOT DEFERRABLEì ˆì€ ì‚¬ìš©í•  수 없습니다" -#: parser/parse_utilcmd.c:3557 +#: parser/parse_utilcmd.c:3679 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "NOT DEFERABLE ì ˆì´ ìž˜ëª» 놓여 있습니다" -#: parser/parse_utilcmd.c:3570 parser/parse_utilcmd.c:3596 gram.y:5593 +#: parser/parse_utilcmd.c:3692 parser/parse_utilcmd.c:3718 gram.y:6114 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "INITIALLY DEFERRED 로 ì„ ì–¸ëœ ì¡°ê±´ë¬¸ì€ ë°˜ë“œì‹œ DEFERABLE 여야만 한다" -#: parser/parse_utilcmd.c:3578 +#: parser/parse_utilcmd.c:3700 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "INITIALLY DEFERRED ì ˆì´ ìž˜ëª» 놓여 있습니다" -#: parser/parse_utilcmd.c:3583 parser/parse_utilcmd.c:3609 +#: parser/parse_utilcmd.c:3705 parser/parse_utilcmd.c:3731 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "여러 ê°œì˜ INITIALLY IMMEDIATE/DEFERRED ì ˆì€ í—ˆìš©ë˜ì§€ 않습니다" -#: parser/parse_utilcmd.c:3604 +#: parser/parse_utilcmd.c:3726 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "INITIALLY IMMEDIATE ì ˆì´ ìž˜ëª» 놓여 있습니다" -#: parser/parse_utilcmd.c:3795 +#: parser/parse_utilcmd.c:3919 #, c-format msgid "" "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATE êµ¬ë¬¸ì— ëª…ì‹œëœ schema (%s) ê°€ ìƒì„±ëœ (%s) ì˜ ê²ƒê³¼ 다릅니다" -#: parser/parse_utilcmd.c:3830 +#: parser/parse_utilcmd.c:3954 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\" 개체는 íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì´ ì•„ë‹˜" -#: parser/parse_utilcmd.c:3837 +#: parser/parse_utilcmd.c:3961 #, c-format msgid "table \"%s\" is not partitioned" msgstr "\"%s\" í…Œì´ë¸”ì€ íŒŒí‹°ì…˜ë˜ì–´ 있지 않ìŒ" -#: parser/parse_utilcmd.c:3844 +#: parser/parse_utilcmd.c:3968 #, c-format msgid "index \"%s\" is not partitioned" msgstr "\"%s\" ì¸ë±ìŠ¤ëŠ” 파티션 ëœ ì¸ë±ìŠ¤ê°€ 아님" -#: parser/parse_utilcmd.c:3884 +#: parser/parse_utilcmd.c:4008 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "해시 íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì€ ê¸°ë³¸ íŒŒí‹°ì…˜ì„ ê°€ì§ˆ 수 ì—†ìŒ" -#: parser/parse_utilcmd.c:3901 +#: parser/parse_utilcmd.c:4025 #, c-format msgid "invalid bound specification for a hash partition" msgstr "해시 파티션용 범위 명세가 잘못ë¨" -#: parser/parse_utilcmd.c:3907 partitioning/partbounds.c:4691 +#: parser/parse_utilcmd.c:4031 partitioning/partbounds.c:4802 #, c-format -msgid "modulus for hash partition must be a positive integer" -msgstr "" +msgid "modulus for hash partition must be an integer value greater than zero" +msgstr "해시 파티션용 ëª¨ë“ˆì€ ì˜(0)보다 í° ì •ìˆ˜ ê°’ì´ì–´ì•¼ 함" -#: parser/parse_utilcmd.c:3914 partitioning/partbounds.c:4699 +#: parser/parse_utilcmd.c:4038 partitioning/partbounds.c:4810 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "해시 파티션용 나머지 처리기는 modulus 보다 작아야 함" -#: parser/parse_utilcmd.c:3927 +#: parser/parse_utilcmd.c:4051 #, c-format msgid "invalid bound specification for a list partition" msgstr "list íŒŒí‹°ì…˜ì„ ìœ„í•œ 범위 ì„¤ì •ì´ ìž˜ëª»ë¨" -#: parser/parse_utilcmd.c:3980 +#: parser/parse_utilcmd.c:4104 #, c-format msgid "invalid bound specification for a range partition" msgstr "range íŒŒí‹°ì…˜ì„ ìœ„í•œ 범위 ì„¤ì •ì´ ìž˜ëª»ë¨" -#: parser/parse_utilcmd.c:3986 +#: parser/parse_utilcmd.c:4110 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROMì—는 파티션 칼럼 당 ë”± í•˜ë‚˜ì˜ ê°’ë§Œ 지정해야 함" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:4114 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TOì—는 파티션 칼럼 당 ë”± í•˜ë‚˜ì˜ ê°’ë§Œ 지정해야 함" -#: parser/parse_utilcmd.c:4104 +#: parser/parse_utilcmd.c:4228 #, c-format msgid "cannot specify NULL in range bound" msgstr "range 범위ì—는 NULL ê°’ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: parser/parse_utilcmd.c:4153 +#: parser/parse_utilcmd.c:4277 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" -msgstr "" +msgstr "MAXVALUE ë’¤ì— ì˜¤ëŠ” 모든 범위는 MAXVALUE 여야합니다." -#: parser/parse_utilcmd.c:4160 +#: parser/parse_utilcmd.c:4284 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" -msgstr "" - -#: parser/parse_utilcmd.c:4202 -#, c-format -msgid "" -"could not determine which collation to use for partition bound expression" -msgstr "파티션 범위 표현ì‹ì— 쓸 ë¬¸ìž ì •ë ¬ ê·œì¹™ì„ ê²°ì •í•  수 없습니다" - -#: parser/parse_utilcmd.c:4219 -#, c-format -msgid "" -"collation of partition bound value for column \"%s\" does not match " -"partition key collation \"%s\"" -msgstr "" -"\"%s\" ì¹¼ëŸ¼ì˜ íŒŒí‹°ì…˜ 범위값 ì •ë ¬ 규칙과 파티션 키 ì •ë ¬ 규칙(\"%s\")ì´ ë‹¤ë¦„" +msgstr "MINVALUE ë’¤ì— ì˜¤ëŠ” 모든 범위는 MINVALUE 여야합니다." -#: parser/parse_utilcmd.c:4236 +#: parser/parse_utilcmd.c:4327 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "ì§€ì •ëœ ê°’ì€ %s 형으로 형변환 í•  수 ì—†ìŒ, 해당 칼럼: \"%s\"" -#: parser/parser.c:228 +#: parser/parser.c:273 msgid "UESCAPE must be followed by a simple string literal" -msgstr "" +msgstr "UESCAPE 표현ì‹ì€ ì•žì— í•œê¸€ìžë§Œ 있어야합니다." -#: parser/parser.c:233 +#: parser/parser.c:278 msgid "invalid Unicode escape character" msgstr "ìž˜ëª»ëœ ìœ ë‹ˆì½”ë“œ ì´ìŠ¤ì¼€ì´í”„ 문ìž" -#: parser/parser.c:302 scan.l:1329 +#: parser/parser.c:347 scan.l:1393 #, c-format msgid "invalid Unicode escape value" msgstr "ìž˜ëª»ëœ ìœ ë‹ˆì½”ë“œ ì´ìŠ¤ì¼€ì´í”„ ê°’" -#: parser/parser.c:449 scan.l:677 +#: parser/parser.c:494 utils/adt/varlena.c:6640 scan.l:716 #, c-format msgid "invalid Unicode escape" msgstr "ìž˜ëª»ëœ ìœ ë‹ˆì½”ë“œ ì´ìŠ¤ì¼€ì´í”„ ê°’" -#: parser/parser.c:450 +#: parser/parser.c:495 #, c-format msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "유니코드 ì´ìŠ¤ì¼€ì´í”„는 \\XXXX ë˜ëŠ” \\+XXXXXX 형태여야 합니다." -#: parser/parser.c:478 scan.l:638 scan.l:654 scan.l:670 +#: parser/parser.c:523 utils/adt/varlena.c:6665 scan.l:677 scan.l:693 +#: scan.l:709 #, c-format msgid "invalid Unicode surrogate pair" msgstr "ìž˜ëª»ëœ ìœ ë‹ˆì½”ë“œ 대리 ìŒ" -#: parser/scansup.c:203 +#: parser/scansup.c:101 #, c-format -msgid "identifier \"%s\" will be truncated to \"%s\"" -msgstr "\"%s\" ì‹ë³„ìžëŠ” \"%s\"(으)로 잘림" +msgid "identifier \"%s\" will be truncated to \"%.*s\"" +msgstr "\"%s\" ì‹ë³„ìžëŠ” \"%.*s\"(으)로 잘림" -#: partitioning/partbounds.c:2831 +#: partitioning/partbounds.c:2920 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "\"%s\" íŒŒí‹°ì…˜ì´ \"%s\" 기본 파티션과 겹칩니다." -#: partitioning/partbounds.c:2890 +#: partitioning/partbounds.c:2972 partitioning/partbounds.c:2991 +#: partitioning/partbounds.c:3013 #, c-format msgid "" "every hash partition modulus must be a factor of the next larger modulus" +msgstr "모든 해시 파티션 êµ¬ë¶„ê°’ì€ ìµœëŒ€ê°’ë³´ë‹¤ 작아야합니다." + +#: partitioning/partbounds.c:2973 partitioning/partbounds.c:3014 +#, c-format +msgid "" +"The new modulus %d is not a factor of %d, the modulus of existing partition " +"\"%s\"." msgstr "" +"새 해시 파티션 구분값(나머지값) %d ê°’ì€ %dì˜ ì¸ìˆ˜ê°€ 아닙니다. ì´ë¯¸ 있는 " +"\"%s\" 하위 íŒŒí‹°ì…˜ì€ ì´ ê°’ì„ êµ¬ë¶„ê°’ìœ¼ë¡œ 사용합니다." -#: partitioning/partbounds.c:2986 +#: partitioning/partbounds.c:2992 #, c-format -msgid "empty range bound specified for partition \"%s\"" +msgid "" +"The new modulus %d is not divisible by %d, the modulus of existing partition " +"\"%s\"." msgstr "" +"새 해시 구분값 %d ê°’ì€ %d 값으로 나눌 수 없습니다. ì´ë¯¸ 있는 \"%s\" 하위 파티" +"ì…˜ì€ ì´ ê°’ì„ ë‚˜ëˆ„ê¸° 값으로 사용합니다." + +#: partitioning/partbounds.c:3127 +#, c-format +msgid "empty range bound specified for partition \"%s\"" +msgstr "\"%s\" 파티션용 범위 ì§€ì •ì´ ë¹„ì–´ìžˆìŠµë‹ˆë‹¤." -#: partitioning/partbounds.c:2988 +#: partitioning/partbounds.c:3129 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "하한값(%s)ì€ ìƒí•œê°’(%s)ê³¼ 같거나 커야 합니다" -#: partitioning/partbounds.c:3085 +#: partitioning/partbounds.c:3237 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "\"%s\" íŒŒí‹°ì…˜ì´ \"%s\" 파티션과 겹칩니다." -#: partitioning/partbounds.c:3202 +#: partitioning/partbounds.c:3354 #, c-format msgid "" "skipped scanning foreign table \"%s\" which is a partition of default " @@ -17742,47 +20672,57 @@ msgstr "" "\"%s\" 외부 í…Œì´ë¸” íƒìƒ‰ì€ ìƒëžµí•¨, ì´ í…Œì´ë¸”ì€ \"%s\" 기본 파티션 í…Œì´ë¸”ì˜ íŒŒ" "í‹°ì…˜ì´ê¸° 때문" -#: partitioning/partbounds.c:4695 +#: partitioning/partbounds.c:4806 #, c-format -msgid "remainder for hash partition must be a non-negative integer" -msgstr "" +msgid "" +"remainder for hash partition must be an integer value greater than or equal " +"to zero" +msgstr "해시 파티션용 나머지 êµ¬ë¶„ê°’ì€ 0보다 í¬ê±°ë‚˜ ê°™ì€ ì •ìˆ˜ê°’ì´ì–´ì•¼ 함" -#: partitioning/partbounds.c:4722 +#: partitioning/partbounds.c:4830 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\" 개체는 해시 íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì´ ì•„ë‹˜" -#: partitioning/partbounds.c:4733 partitioning/partbounds.c:4850 +#: partitioning/partbounds.c:4841 partitioning/partbounds.c:4958 #, c-format msgid "" "number of partitioning columns (%d) does not match number of partition keys " "provided (%d)" msgstr "파티션 칼럼 수: %d, ì œê³µëœ íŒŒí‹°ì…˜ 키 수: %d 서로 다름" -#: partitioning/partbounds.c:4755 partitioning/partbounds.c:4787 +#: partitioning/partbounds.c:4863 +#, c-format +msgid "" +"column %d of the partition key has type %s, but supplied value is of type %s" +msgstr "파티션 í‚¤ì˜ %d 번째 칼럼 ìžë£Œí˜•ì€ %s 형ì´ì§€ë§Œ, %s í˜•ì˜ ê°’ì´ ì§€ì •ë˜ì—ˆìŒ" + +#: partitioning/partbounds.c:4895 #, c-format msgid "" "column %d of the partition key has type \"%s\", but supplied value is of " "type \"%s\"" msgstr "" +"파티션 키로 사용하는 %d 번째 ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ì€ \"%s\" 형ì´ì§€ë§Œ, 지정한 ê°’ì€ " +"\"%s\" ìžë£Œí˜•ì„ ì‚¬ìš©í–ˆìŠµë‹ˆë‹¤." -#: port/pg_sema.c:209 port/pg_shmem.c:640 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:640 +#: port/pg_sema.c:209 port/pg_shmem.c:717 port/posix_sema.c:209 +#: port/sysv_sema.c:329 port/sysv_shmem.c:717 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "\"%s\" ë°ì´í„° 디렉터리 ìƒíƒœë¥¼ 파악할 수 ì—†ìŒ: %m" -#: port/pg_shmem.c:216 port/sysv_shmem.c:216 +#: port/pg_shmem.c:224 port/sysv_shmem.c:224 #, c-format msgid "could not create shared memory segment: %m" msgstr "공유 메모리 세그먼트를 만들 수 ì—†ìŒ: %m" -#: port/pg_shmem.c:217 port/sysv_shmem.c:217 +#: port/pg_shmem.c:225 port/sysv_shmem.c:225 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "shmget(키=%lu, í¬ê¸°=%zu, 0%o) 시스템 콜 실패" -#: port/pg_shmem.c:221 port/sysv_shmem.c:221 +#: port/pg_shmem.c:229 port/sysv_shmem.c:229 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory " @@ -17795,7 +20735,7 @@ msgstr "" "값보다 í¬ê±°ë‚˜, SHMMIN 값보다 ì ì€ 경우 ë°œìƒí•©ë‹ˆë‹¤.\n" "공유 메모리 ì„¤ì •ì— ëŒ€í•œ 보다 ìžì„¸í•œ ë‚´ìš©ì€ PostgreSQL 문서를 참조하십시오." -#: port/pg_shmem.c:228 port/sysv_shmem.c:228 +#: port/pg_shmem.c:236 port/sysv_shmem.c:236 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory " @@ -17808,7 +20748,7 @@ msgstr "" "í° ê²½ìš° ë°œìƒí•©ë‹ˆë‹¤. ì»¤ë„ í™˜ê²½ ë³€ìˆ˜ì¸ SHMALL ê°’ì„ ì¢€ ë” í¬ê²Œ 설정하세요.\n" "공유 메모리 ì„¤ì •ì— ëŒ€í•œ 보다 ìžì„¸í•œ ë‚´ìš©ì€ PostgreSQL 문서를 참조하십시오." -#: port/pg_shmem.c:234 port/sysv_shmem.c:234 +#: port/pg_shmem.c:242 port/sysv_shmem.c:242 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs " @@ -17824,51 +20764,63 @@ msgstr "" "확보하세요.\n" "공유 메모리 ì„¤ì •ì— ëŒ€í•œ 보다 ìžì„¸í•œ ë‚´ìš©ì€ PostgreSQL 문서를 참조하십시오." -#: port/pg_shmem.c:578 port/sysv_shmem.c:578 +#: port/pg_shmem.c:584 port/sysv_shmem.c:584 port/win32_shmem.c:646 +#, c-format +msgid "\"huge_page_size\" must be 0 on this platform." +msgstr "\"huge_page_size\" ê°’ì€ ì´ í”Œëž«í¼ì—서는 0ì´ì–´ì•¼ 합니다." + +#: port/pg_shmem.c:655 port/sysv_shmem.c:655 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "가용 공유 메모리 확보 실패: %m" -#: port/pg_shmem.c:580 port/sysv_shmem.c:580 +#: port/pg_shmem.c:657 port/sysv_shmem.c:657 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory " "segment exceeded available memory, swap space, or huge pages. To reduce the " "request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, " -"perhaps by reducing shared_buffers or max_connections." +"perhaps by reducing \"shared_buffers\" or \"max_connections\"." msgstr "" "ì´ ì˜¤ë¥˜ëŠ” ì¼ë°˜ì ìœ¼ë¡œ PostgreSQLì—서 사용할 공유 메모리를 확보하지 못 í–ˆì„ ë•Œ " "ë°œìƒí•©ë‹ˆë‹¤(물리 메모리, 스왑, huge page). 현재 요구 í¬ê¸°(%zu ë°”ì´íЏ)를 좀 줄" -"ì—¬ 보십시오. 줄ì´ëŠ” 방법ì€, shared_buffers ê°’ì„ ì¤„ì´ê±°ë‚˜ max_connections ê°’" +"ì—¬ 보십시오. 줄ì´ëŠ” 방법ì€, \"shared_buffers\"나 \"max_connections\" ê°’" "ì„ ì¤„ì—¬ 보십시오." -#: port/pg_shmem.c:648 port/sysv_shmem.c:648 +#: port/pg_shmem.c:725 port/sysv_shmem.c:725 #, c-format msgid "huge pages not supported on this platform" msgstr "huge page ê¸°ëŠ¥ì€ ì´ í”Œëž«í¼ì—서 ì§€ì›ë˜ì§€ 않ìŒ" -#: port/pg_shmem.c:709 port/sysv_shmem.c:709 utils/init/miscinit.c:1137 +#: port/pg_shmem.c:732 port/sysv_shmem.c:732 +#, c-format +msgid "" +"huge pages not supported with the current \"shared_memory_type\" setting" +msgstr "현재 \"shared_memory_type\" ì„¤ì •ì€ huge page ì‚¬ìš©ì„ ì§€ì›í•˜ì§€ 않습니다." + +#: port/pg_shmem.c:798 port/sysv_shmem.c:798 utils/init/miscinit.c:1401 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "미리 í™•ë³´ëœ ê³µìœ  메모리 ì˜ì—­ (%lu 키, %lu ID)ì´ ì—¬ì „ížˆ 사용중입니다" -#: port/pg_shmem.c:712 port/sysv_shmem.c:712 utils/init/miscinit.c:1139 +#: port/pg_shmem.c:801 port/sysv_shmem.c:801 utils/init/miscinit.c:1403 #, c-format msgid "" "Terminate any old server processes associated with data directory \"%s\"." msgstr "" +"\"%s\" ë°ì´í„° 디렉터리를 사용하는 옛 서버 í”„ë¡œì„¸ìŠ¤ë“¤ì„ ëª¨ë‘ ì¤‘ì§€ì‹œí‚¤ì„¸ìš”." -#: port/sysv_sema.c:124 +#: port/sysv_sema.c:126 #, c-format msgid "could not create semaphores: %m" msgstr "세마í¬ì–´ë¥¼ 만들 수 ì—†ìŒ: %m" -#: port/sysv_sema.c:125 +#: port/sysv_sema.c:127 #, c-format msgid "Failed system call was semget(%lu, %d, 0%o)." msgstr "semget(%lu, %d, 0%o) í˜¸ì¶œì— ì˜í•œ 시스템 콜 실패" -#: port/sysv_sema.c:129 +#: port/sysv_sema.c:131 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs " @@ -17876,7 +20828,7 @@ msgid "" "(SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be " "exceeded. You need to raise the respective kernel parameter. " "Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its " -"max_connections parameter.\n" +"\"max_connections\" parameter.\n" "The PostgreSQL documentation contains more information about configuring " "your system for PostgreSQL." msgstr "" @@ -17885,11 +20837,11 @@ msgstr "" "ì´ ì˜¤ë¥˜ëŠ” 시스템ì—서 지정한 최소 세마í¬ì–´ 수(SEMMNI)ê°€ 너무 í¬ê±°ë‚˜, 최대 세마" "í¬ì–´ 수(SEMMNS)ê°€ 너무 ì ì–´ì„œ 서버를 실행할 수 ì—†ì„ ë•Œ ë°œìƒí•©ë‹ˆë‹¤. ì´ì— ë”°" "ë¼, ì •ìƒì ìœ¼ë¡œ 서버가 실행ë˜ë ¤ë©´, 시스템 ê°’ë“¤ì„ ì¡°ì •í•  필요가 있습니다. 아니" -"ë©´, 다른 방법으로, PostgreSQLì˜ í™˜ê²½ 설정ì—서 max_connections ê°’ì„ ì¤„ì—¬ì„œ 세" +"ë©´, 다른 방법으로, PostgreSQLì˜ í™˜ê²½ 설정ì—서 \"max_connections\" ê°’ì„ ì¤„ì—¬ì„œ 세" "마í¬ì–´ 사용 수를 줄여보십시오.\n" "보다 ìžì„¸í•œ ë‚´ìš©ì€ PostgreSQL ê´€ë¦¬ìž ë©”ë‰´ì–¼ì„ ì°¸ì¡° 하십시오." -#: port/sysv_sema.c:159 +#: port/sysv_sema.c:161 #, c-format msgid "" "You possibly need to raise your kernel's SEMVMX value to be at least %d. " @@ -17898,38 +20850,40 @@ msgstr "" "커ë„ì˜ SEMVMX ê°’ì„ ì ì–´ë„ %d ì •ë„로 늘려야할 필요가 있는 것 같습니다. ìžì„¸" "한 ê²ƒì€ PostgreSQL 문서를 참조하세요." -#: port/win32/crashdump.c:121 +#: port/win32/crashdump.c:119 #, c-format msgid "could not load dbghelp.dll, cannot write crash dump\n" -msgstr "" +msgstr "dbghelp.dll 파ì¼ì„ 로드할 수 없어, ë¹„ì •ìƒ ì¢…ë£Œ 정보를 기ë¡í•  수 ì—†ìŒ\n" -#: port/win32/crashdump.c:129 +#: port/win32/crashdump.c:127 #, c-format msgid "" "could not load required functions in dbghelp.dll, cannot write crash dump\n" msgstr "" +"dbghelp.dll íŒŒì¼ ì•ˆì— ìžˆëŠ” 필요한 함수를 로드할 수 없어, ë¹„ì •ìƒ ì¢…ë£Œ 정보를 " +"기ë¡í•  수 ì—†ìŒ\n" -#: port/win32/crashdump.c:160 +#: port/win32/crashdump.c:158 #, c-format msgid "could not open crash dump file \"%s\" for writing: error code %lu\n" msgstr "\"%s\" 장애 ë¤í”„ 파ì¼ì„ 쓰기 위해 ì—´ 수 ì—†ìŒ: 오류 번호 %lu\n" -#: port/win32/crashdump.c:167 +#: port/win32/crashdump.c:165 #, c-format msgid "wrote crash dump to file \"%s\"\n" msgstr "\"%s\" 장애 ë¤í”„ 파ì¼ì„ 만들었습니다.\n" -#: port/win32/crashdump.c:169 +#: port/win32/crashdump.c:167 #, c-format msgid "could not write crash dump to file \"%s\": error code %lu\n" msgstr "\"%s\" 장애 ë¤í”„ 파ì¼ì„ 쓰기 실패: 오류 번호 %lu\n" -#: port/win32/signal.c:196 +#: port/win32/signal.c:240 #, c-format msgid "could not create signal listener pipe for PID %d: error code %lu" msgstr "%d pid를 위한 ì‹œê·¸ë„ ë¦¬ìŠ¨ë„ˆ 파ì´í”„를 만들 수 ì—†ìŒ: 오류 번호 %lu" -#: port/win32/signal.c:251 +#: port/win32/signal.c:295 #, c-format msgid "could not create signal listener pipe: error code %lu; retrying\n" msgstr "신호 수신기 파ì´í”„를 만들 수 ì—†ìŒ: 오류 번호 %lu, 다시 시작 중\n" @@ -17954,177 +20908,162 @@ msgstr "세마í¬ì–´ ìž ê¸ˆì„ í•´ì œí•  수 ì—†ìŒ: 오류 번호 %lu" msgid "could not try-lock semaphore: error code %lu" msgstr "세마í¬ì–´ 잠금 ì‹œë„ ì‹¤íŒ¨: 오류 번호 %lu" -#: port/win32_shmem.c:144 port/win32_shmem.c:152 port/win32_shmem.c:164 -#: port/win32_shmem.c:179 +#: port/win32_shmem.c:146 port/win32_shmem.c:161 port/win32_shmem.c:173 +#: port/win32_shmem.c:189 #, c-format -msgid "could not enable Lock Pages in Memory user right: error code %lu" -msgstr "메모리 ì‚¬ìš©ìž ê¶Œë¦¬ì—서 페ì´ì§€ 잠금 활성화 못함: 오류 번호 %lu" +msgid "could not enable user right \"%s\": error code %lu" +msgstr "\"%s\" ì‚¬ìš©ìž ê¶Œí•œì„ í™œì„±í™” í•  수 ì—†ìŒ: 오류 코드 %lu" + +#. translator: This is a term from Windows and should be translated to +#. match the Windows localization. +#. +#: port/win32_shmem.c:152 port/win32_shmem.c:161 port/win32_shmem.c:173 +#: port/win32_shmem.c:184 port/win32_shmem.c:186 port/win32_shmem.c:189 +msgid "Lock pages in memory" +msgstr "Lock pages in memory" -#: port/win32_shmem.c:145 port/win32_shmem.c:153 port/win32_shmem.c:165 -#: port/win32_shmem.c:180 +#: port/win32_shmem.c:154 port/win32_shmem.c:162 port/win32_shmem.c:174 +#: port/win32_shmem.c:190 #, c-format msgid "Failed system call was %s." -msgstr "실패한 시스템 호출 %s" +msgstr "실패한 시스템 호출: %s" -#: port/win32_shmem.c:175 +#: port/win32_shmem.c:184 #, c-format -msgid "could not enable Lock Pages in Memory user right" -msgstr "메모리 ì‚¬ìš©ìž ê¶Œë¦¬ì—서 페ì´ì§€ 잠금 활성화 못함" +msgid "could not enable user right \"%s\"" +msgstr "\"%s\" ì‚¬ìš©ìž ê¶Œí•œì„ í™œì„±í™” í•  수 ì—†ìŒ" -#: port/win32_shmem.c:176 +#: port/win32_shmem.c:185 #, c-format msgid "" -"Assign Lock Pages in Memory user right to the Windows user account which " -"runs PostgreSQL." -msgstr "" +"Assign user right \"%s\" to the Windows user account which runs PostgreSQL." +msgstr "PostgreSQLì„ ì‹¤í–‰í•  윈ë„우즈 ì‚¬ìš©ìž ê³„ì •ì— \"%s\" ê¶Œí•œì„ ë¶€ì—¬í•˜ì„¸ìš”." -#: port/win32_shmem.c:233 +#: port/win32_shmem.c:244 #, c-format msgid "the processor does not support large pages" msgstr "프로세스가 í° íŽ˜ì´ì§€ë¥¼ ì§€ì›í•˜ì§€ 않ìŒ" -#: port/win32_shmem.c:235 port/win32_shmem.c:240 -#, c-format -msgid "disabling huge pages" -msgstr "í° íŽ˜ì´ì§€ 비활성화" - -#: port/win32_shmem.c:302 port/win32_shmem.c:338 port/win32_shmem.c:356 +#: port/win32_shmem.c:313 port/win32_shmem.c:349 port/win32_shmem.c:374 #, c-format msgid "could not create shared memory segment: error code %lu" msgstr "공유 메모리 세그먼트를 만들 수 ì—†ìŒ: 오류 번호 %lu" -#: port/win32_shmem.c:303 +#: port/win32_shmem.c:314 #, c-format msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." msgstr "실패한 시스템 í˜¸ì¶œì€ CreateFileMapping(í¬ê¸°=%zu, ì´ë¦„=%s)입니다." -#: port/win32_shmem.c:328 +#: port/win32_shmem.c:339 #, c-format msgid "pre-existing shared memory block is still in use" msgstr "기존 공유 메모리 블ë¡ì´ 여전히 사용ë˜ê³  있ìŒ" -#: port/win32_shmem.c:329 +#: port/win32_shmem.c:340 #, c-format msgid "" "Check if there are any old server processes still running, and terminate " "them." msgstr "실행 ì¤‘ì¸ ì´ì „ 서버 프로세스가 있는지 확ì¸í•˜ê³  종료하십시오." -#: port/win32_shmem.c:339 +#: port/win32_shmem.c:350 #, c-format msgid "Failed system call was DuplicateHandle." msgstr "실패한 시스템 í˜¸ì¶œì€ DuplicateHandle입니다." -#: port/win32_shmem.c:357 +#: port/win32_shmem.c:375 #, c-format msgid "Failed system call was MapViewOfFileEx." msgstr "실패한 시스템 í˜¸ì¶œì€ MapViewOfFileEx입니다." -#: postmaster/autovacuum.c:406 -#, c-format -msgid "could not fork autovacuum launcher process: %m" -msgstr "autovacuum 실행기 프로세스를 실행할 수 ì—†ìŒ: %m" - -#: postmaster/autovacuum.c:442 -#, c-format -msgid "autovacuum launcher started" -msgstr "autovacuum 실행기가 시작ë¨" - -#: postmaster/autovacuum.c:839 -#, c-format -msgid "autovacuum launcher shutting down" -msgstr "autovacuum 실행기를 종료하는 중" - -#: postmaster/autovacuum.c:1477 -#, c-format -msgid "could not fork autovacuum worker process: %m" -msgstr "autovacuum ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ë¥¼ 실행할 수 ì—†ìŒ: %m" - -#: postmaster/autovacuum.c:1686 +#: postmaster/autovacuum.c:686 #, c-format -msgid "autovacuum: processing database \"%s\"" -msgstr "autovacuum: \"%s\" ë°ì´í„°ë² ì´ìФ 처리 중" +msgid "autovacuum worker took too long to start; canceled" +msgstr "autovacuum 작업ìžê°€ 너무 ì˜¤ëž˜ì „ì— ì‹œìž‘ë˜ì–´ 중지ë¨" -#: postmaster/autovacuum.c:2256 +#: postmaster/autovacuum.c:2203 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "" "autovacuum: ë” ì´ìƒ 사용하지 않는 \"%s.%s.%s\" 임시 í…Œì´ë¸”ì„ ì‚­ì œí•˜ëŠ” 중" -#: postmaster/autovacuum.c:2485 +#: postmaster/autovacuum.c:2439 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "\"%s.%s.%s\" í…Œì´ë¸” 대ìƒìœ¼ë¡œ ìžë™ vacuum 작업 함" -#: postmaster/autovacuum.c:2488 +#: postmaster/autovacuum.c:2442 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "\"%s.%s.%s\" í…Œì´ë¸” ìžë™ ë¶„ì„" -#: postmaster/autovacuum.c:2681 +#: postmaster/autovacuum.c:2636 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "\"%s.%s.%s\" 릴레ì´ì…˜ 작업 항목 작업 중" -#: postmaster/autovacuum.c:3285 +#: postmaster/autovacuum.c:3254 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "서버 설정 ì •ë³´ê°€ 잘못ë˜ì–´ ìžë™ 청소 ìž‘ì—…ì´ ì‹¤í–‰ë˜ì§€ 못했습니다." -#: postmaster/autovacuum.c:3286 +#: postmaster/autovacuum.c:3255 #, c-format msgid "Enable the \"track_counts\" option." msgstr "\"track_counts\" ì˜µì…˜ì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤." -#: postmaster/bgworker.c:394 postmaster/bgworker.c:841 -#, c-format -msgid "registering background worker \"%s\"" -msgstr "" - -#: postmaster/bgworker.c:426 +#: postmaster/bgworker.c:260 #, c-format -msgid "unregistering background worker \"%s\"" +msgid "" +"inconsistent background worker state (max_worker_processes=%d, " +"total_slots=%d)" msgstr "" +"백그ë¼ìš´ë“œ 작업ìžì˜ ì •í•©ì„±ì´ ë§žì§€ ì•ŠìŒ (max_worker_processes=%d, " +"total_slots=%d)" -#: postmaster/bgworker.c:591 +#: postmaster/bgworker.c:651 #, c-format msgid "" -"background worker \"%s\": must attach to shared memory in order to request a " -"database connection" +"background worker \"%s\": background workers without shared memory access " +"are not supported" msgstr "" +"\"%s\" 백그ë¼ìš´ë“œ 작업ìž: 공유 메모리 ì ‘ê·¼ 않는 백그ë¼ìš´ë“œ 작업ìžë¥¼ ì§€ì›í•˜ì§€ " +"않ìŒ" -#: postmaster/bgworker.c:600 +#: postmaster/bgworker.c:662 #, c-format msgid "" "background worker \"%s\": cannot request database access if starting at " "postmaster start" msgstr "" +"\"%s\" 백그ë¼ìš´ë“œ 작업ìž: postmaster 시작 ì¤‘ì¸ ìƒíƒœë¼ë©´, ë°ì´í„°ë² ì´ìФ ì ‘ê·¼ì„ " +"요청할 수 ì—†ìŒ" -#: postmaster/bgworker.c:614 +#: postmaster/bgworker.c:676 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "\"%s\" 백그ë¼ìš´ë“œ 작업ìž: ìž˜ëª»ëœ ìž¬ì‹¤í–‰ 간격" -#: postmaster/bgworker.c:629 +#: postmaster/bgworker.c:691 #, c-format msgid "" "background worker \"%s\": parallel workers may not be configured for restart" msgstr "\"%s\" 백그ë¼ìš´ë“œ 작업ìž: ì´ ë³‘ë ¬ 작업ìžëŠ” 재실행 ì„¤ì •ì´ ì—†ìŒ" -#: postmaster/bgworker.c:653 +#: postmaster/bgworker.c:715 tcop/postgres.c:3312 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "ê´€ë¦¬ìž ëª…ë ¹ì— ì˜í•´ \"%s\" 백그ë¼ìš´ë“œ 작업ìžë¥¼ 종료합니다." -#: postmaster/bgworker.c:849 +#: postmaster/bgworker.c:888 #, c-format msgid "" -"background worker \"%s\": must be registered in shared_preload_libraries" +"background worker \"%s\": must be registered in \"shared_preload_libraries\"" msgstr "" -"\"%s\" 백그ë¼ìš´ë“œ 작업ìž: 먼저 shared_preload_libraries 설정값으로 등ë¡ë˜ì–´" +"\"%s\" 백그ë¼ìš´ë“œ 작업ìž: 먼저 \"shared_preload_libraries\" 설정값으로 등ë¡ë˜ì–´" "야 합니다." -#: postmaster/bgworker.c:861 +#: postmaster/bgworker.c:911 #, c-format msgid "" "background worker \"%s\": only dynamic background workers can request " @@ -18132,1029 +21071,726 @@ msgid "" msgstr "" "\"%s\" 백그ë¼ìš´ë“œ 작업ìž: ë™ì  백그ë¼ìš´ë“œ 작업ìžë§Œ ì•Œë¦¼ì„ ìš”ì²­í•  수 있ìŒ" -#: postmaster/bgworker.c:876 +#: postmaster/bgworker.c:926 #, c-format msgid "too many background workers" msgstr "백그ë¼ìš´ë“œ 작업ìžê°€ 너무 ë§ŽìŒ" -#: postmaster/bgworker.c:877 +#: postmaster/bgworker.c:927 #, c-format msgid "Up to %d background worker can be registered with the current settings." msgid_plural "" "Up to %d background workers can be registered with the current settings." msgstr[0] "현재 설정으로는 %dê°œì˜ ë°±ê·¸ë¼ìš´ë“œ 작업ìžë¥¼ 사용할 수 있습니다." -#: postmaster/bgworker.c:881 +#: postmaster/bgworker.c:931 postmaster/checkpointer.c:445 #, c-format -msgid "" -"Consider increasing the configuration parameter \"max_worker_processes\"." -msgstr "\"max_worker_processes\" 환경 매개 변수 ê°’ì„ ì¢€ ëŠë ¤ë³´ì‹­ì‹œì˜¤." +msgid "Consider increasing the configuration parameter \"%s\"." +msgstr "\"%s\" 환경 매개 변수 ê°’ì„ ì¢€ 늘려보십시오." -#: postmaster/checkpointer.c:418 +#: postmaster/checkpointer.c:441 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" msgstr[0] "ì²´í¬í¬ì¸íŠ¸ê°€ 너무 ìžì£¼ ë°œìƒí•¨ (%dì´ˆ 간격)" -#: postmaster/checkpointer.c:422 -#, c-format -msgid "Consider increasing the configuration parameter \"max_wal_size\"." -msgstr "\"max_wal_size\" 환경 매개 변수 ê°’ì„ ì¢€ ëŠë ¤ë³´ì‹­ì‹œì˜¤." - -#: postmaster/checkpointer.c:1032 +#: postmaster/checkpointer.c:1067 #, c-format msgid "checkpoint request failed" msgstr "ì²´í¬í¬ì¸íЏ 요청 실패" -#: postmaster/checkpointer.c:1033 +#: postmaster/checkpointer.c:1068 #, c-format msgid "Consult recent messages in the server log for details." msgstr "ë” ìžì„¸í•œ ê²ƒì€ ì„œë²„ 로그 파ì¼ì„ 살펴보십시오." -#: postmaster/checkpointer.c:1217 -#, c-format -msgid "compacted fsync request queue from %d entries to %d entries" -msgstr "" - -#: postmaster/pgarch.c:155 -#, c-format -msgid "could not fork archiver: %m" -msgstr "archiver 할당(fork) 실패: %m" - -#: postmaster/pgarch.c:425 -#, c-format -msgid "archive_mode enabled, yet archive_command is not set" -msgstr "archive_modeê°€ 사용 설정ë˜ì—ˆëŠ”ë° archive_commandê°€ 설정ë˜ì§€ 않ìŒ" - -#: postmaster/pgarch.c:447 +#: postmaster/launch_backend.c:381 #, c-format -msgid "removed orphan archive status file \"%s\"" -msgstr "í•„ìš” 없는 \"%s\" ì•„ì¹´ì´ë¸Œ ìƒíƒœ 파ì¼ì´ ì‚­ì œë¨" +msgid "could not execute server process \"%s\": %m" +msgstr "\"%s\" 서버 프로세스를 실행할 수 ì—†ìŒ: %m" -#: postmaster/pgarch.c:457 +#: postmaster/launch_backend.c:434 #, c-format -msgid "" -"removal of orphan archive status file \"%s\" failed too many times, will try " -"again later" -msgstr "" -"í•„ìš” 없는 \"%s\" ì•„ì¹´ì´ë¸Œ ìƒíƒœ íŒŒì¼ ì‚­ì œ ìž‘ì—…ì´ ê³„ì† ì‹¤íŒ¨í•˜ê³  있습니다. 다ìŒ" -"ì— ë˜ ì‹œë„í•  것입니다." +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "백엔드 매개 변수 맵핑 파ì¼ì„ 만들 수 ì—†ìŒ: 오류 코드 %lu" -#: postmaster/pgarch.c:493 +#: postmaster/launch_backend.c:442 #, c-format -msgid "" -"archiving write-ahead log file \"%s\" failed too many times, will try again " -"later" -msgstr "" -"\"%s\" 트랜잭션 로그 íŒŒì¼ ì•„ì¹´ì´ë¸Œ ìž‘ì—…ì´ ê³„ì† ì‹¤íŒ¨í•˜ê³  있습니다. 다ìŒì— ë˜ " -"시ë„í•  것입니다." +msgid "could not map backend parameter memory: error code %lu" +msgstr "백엔드 매개 변수 메모리를 맵핑할 수 ì—†ìŒ: 오류 코드 %lu" -#: postmaster/pgarch.c:594 +#: postmaster/launch_backend.c:459 #, c-format -msgid "archive command failed with exit code %d" -msgstr "ì•„ì¹´ì´ë¸Œ 명령 실패, 종료 코드: %d" +msgid "subprocess command line too long" +msgstr "서브프로세스 ëª…ë ¹í–‰ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤." -#: postmaster/pgarch.c:596 postmaster/pgarch.c:606 postmaster/pgarch.c:612 -#: postmaster/pgarch.c:621 +#: postmaster/launch_backend.c:477 #, c-format -msgid "The failed archive command was: %s" -msgstr "실패한 ì•„ì¹´ì´ë¸Œ 명령: %s" +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "CreateProcess() 호출 실패: %m (오류 코드 %lu)" -#: postmaster/pgarch.c:603 +#: postmaster/launch_backend.c:504 #, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "0x%X 예외로 ì¸í•´ ì•„ì¹´ì´ë¸Œ ëª…ë ¹ì´ ì¢…ë£Œë¨" +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "백엔드 매개 변수 파ì¼ì˜ view를 unmapí•  수 ì—†ìŒ: 오류 코드 %lu" -#: postmaster/pgarch.c:605 postmaster/postmaster.c:3742 +#: postmaster/launch_backend.c:508 #, c-format -msgid "" -"See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "16진수 ê°’ì— ëŒ€í•œ ì„¤ëª…ì€ C í¬í•¨ íŒŒì¼ \"ntstatus.h\"를 참조하십시오." +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "백엔드 매개 변수 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: 오류 코드 %lun" -#: postmaster/pgarch.c:610 +#: postmaster/launch_backend.c:530 #, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "%d번 시그ë„로 ì¸í•´ ì•„ì¹´ì´ë¸Œ ëª…ë ¹ì´ ì¢…ë£Œë¨: %s" +msgid "giving up after too many tries to reserve shared memory" +msgstr "공유 메모리 확보 ìž‘ì—…ì„ ì—¬ëŸ¬ 번 시ë„했으나 실패 함" -#: postmaster/pgarch.c:619 +#: postmaster/launch_backend.c:531 #, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "ì•„ì¹´ì´ë¸Œ ëª…ë ¹ì´ ì¸ì‹í•  수 없는 %d ìƒíƒœë¡œ 종료ë¨" +msgid "This might be caused by ASLR or antivirus software." +msgstr "ì´ í˜„ìƒì€ ASLR ë˜ëŠ” ë°”ì´ëŸ¬ìФ 검사 소프트웨어 ë•Œë¬¸ì¼ ìˆ˜ 있습니다." -#: postmaster/pgstat.c:419 +#: postmaster/launch_backend.c:834 #, c-format -msgid "could not resolve \"localhost\": %s" -msgstr "\"localhost\" ì´ë¦„ì˜ í˜¸ìŠ¤íŠ¸ IP를 구할 수 없습니다: %s" +msgid "could not duplicate socket %d for use in backend: error code %d" +msgstr "백엔드ì—서 사용하기 위해 %d ì†Œì¼“ì„ ë³µì‚¬í•  수 ì—†ìŒ: 오류 코드 %d" -#: postmaster/pgstat.c:442 +#: postmaster/launch_backend.c:866 #, c-format -msgid "trying another address for the statistics collector" -msgstr "통계 수집기ì—서 사용할 다른 주소를 찾습니다" +msgid "could not create inherited socket: error code %d\n" +msgstr "ìƒì†ëœ ì†Œì¼“ì„ ë§Œë“¤ 수 ì—†ìŒ: 오류 코드 %d\n" -#: postmaster/pgstat.c:451 +#: postmaster/launch_backend.c:895 #, c-format -msgid "could not create socket for statistics collector: %m" -msgstr "통계 수집기ì—서 사용할 ì†Œì¼“ì„ ë§Œë“¤ 수 없습니다: %m" +msgid "could not open backend variables file \"%s\": %m\n" +msgstr "\"%s\" 백엔드 변수 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m\n" -#: postmaster/pgstat.c:463 +#: postmaster/launch_backend.c:901 #, c-format -msgid "could not bind socket for statistics collector: %m" -msgstr "통계 수집기ì—서 사용할 소켓과 bindí•  수 없습니다: %m" +msgid "could not read from backend variables file \"%s\": %m\n" +msgstr "\"%s\" 백엔드 변수 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m\n" -#: postmaster/pgstat.c:474 +#: postmaster/launch_backend.c:912 #, c-format -msgid "could not get address of socket for statistics collector: %m" -msgstr "통계 수집기ì—서 사용할 ì†Œì¼“ì˜ ì£¼ì†Œë¥¼ 구할 수 없습니다: %m" +msgid "could not read startup data from backend variables file \"%s\": %m\n" +msgstr "\"%s\" 백엔드 변수 파ì¼ì—서 시작 ë°ì´í„°ë¥¼ ì½ì„ 수 ì—†ìŒ: %m\n" -#: postmaster/pgstat.c:490 +#: postmaster/launch_backend.c:924 #, c-format -msgid "could not connect socket for statistics collector: %m" -msgstr "통계 수집기ì—서 사용할 ì†Œì¼“ì— ì—°ê²°í•  수 없습니다: %m" +msgid "could not remove file \"%s\": %m\n" +msgstr "\"%s\" 파ì¼ì„ 삭제할 수 ì—†ìŒ: %m\n" -#: postmaster/pgstat.c:511 +#: postmaster/launch_backend.c:940 #, c-format -msgid "could not send test message on socket for statistics collector: %m" -msgstr "통계 수집기ì—서 사용할 소켓으로 테스트 메시지를 보낼 수 없습니다: %m" +msgid "could not map view of backend variables: error code %lu\n" +msgstr "백엔드 변수 파ì¼ì˜ view를 mapí•  수 ì—†ìŒ: 오류 코드 %lu\n" -#: postmaster/pgstat.c:537 +#: postmaster/launch_backend.c:959 #, c-format -msgid "select() failed in statistics collector: %m" -msgstr "통계 수집기ì—서 select() 작업 오류: %m" +msgid "could not unmap view of backend variables: error code %lu\n" +msgstr "백엔드 변수 파ì¼ì˜ view를 unmapí•  수 ì—†ìŒ: 오류 코드 %lu\n" -#: postmaster/pgstat.c:552 +#: postmaster/launch_backend.c:966 #, c-format -msgid "test message did not get through on socket for statistics collector" -msgstr "통계 수집기ì—서 사용할 소켓으로 테스트 메시지를 처리할 수 없습니다" +msgid "could not close handle to backend parameter variables: error code %lu\n" +msgstr "백엔드 변수 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: 오류 코드 %lu\n" -#: postmaster/pgstat.c:567 +#: postmaster/pgarch.c:428 #, c-format -msgid "could not receive test message on socket for statistics collector: %m" -msgstr "통계 수집기ì—서 사용할 소켓으로 테스트 메시지를 ë°›ì„ ìˆ˜ 없습니다: %m" +msgid "\"archive_mode\" enabled, yet archiving is not configured" +msgstr "\"archive_mode\"ê°€ 활성화 ë˜ì—ˆì§€ë§Œ ì•„ì¹´ì´ë¸Œ 관련 세부 ì„¤ì •ì´ ë˜ì–´ìžˆì§€ 않ìŒ" -#: postmaster/pgstat.c:577 +#: postmaster/pgarch.c:452 #, c-format -msgid "incorrect test message transmission on socket for statistics collector" -msgstr "통계 수집기ì—서 사용할 소켓으로 ìž˜ëª»ëœ í…ŒìŠ¤íŠ¸ 메시지가 전달 ë˜ì—ˆìŠµë‹ˆë‹¤" +msgid "removed orphan archive status file \"%s\"" +msgstr "í•„ìš” 없는 \"%s\" ì•„ì¹´ì´ë¸Œ ìƒíƒœ 파ì¼ì´ ì‚­ì œë¨" -#: postmaster/pgstat.c:600 +#: postmaster/pgarch.c:462 #, c-format -msgid "could not set statistics collector socket to nonblocking mode: %m" +msgid "" +"removal of orphan archive status file \"%s\" failed too many times, will try " +"again later" msgstr "" -"통계 수집기ì—서 사용하는 소켓 모드를 nonblocking 모드로 지정할 수 없습니다: " -"%m" - -#: postmaster/pgstat.c:642 -#, c-format -msgid "disabling statistics collector for lack of working socket" -msgstr "현재 작업 ì†Œì¼“ì˜ ì›í• í•œ ì†Œí†µì„ ìœ„í•´ 통계 수집기 ê¸°ëŠ¥ì„ ì¤‘ì§€í•©ë‹ˆë‹¤" - -#: postmaster/pgstat.c:789 -#, c-format -msgid "could not fork statistics collector: %m" -msgstr "통계 수집기를 forkí•  수 없습니다: %m" - -#: postmaster/pgstat.c:1376 -#, c-format -msgid "unrecognized reset target: \"%s\"" -msgstr "알 수 없는 리셋 타겟: \"%s\"" - -#: postmaster/pgstat.c:1377 -#, c-format -msgid "Target must be \"archiver\" or \"bgwriter\"." -msgstr "사용 가능한 íƒ€ê²Ÿì€ \"archiver\" ë˜ëŠ” \"bgwriter\"" - -#: postmaster/pgstat.c:4561 -#, c-format -msgid "could not read statistics message: %m" -msgstr "통계 메시지를 ì½ì„ 수 ì—†ìŒ: %m" - -#: postmaster/pgstat.c:4883 postmaster/pgstat.c:5046 -#, c-format -msgid "could not open temporary statistics file \"%s\": %m" -msgstr "\"%s\" 임시 통계 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" - -#: postmaster/pgstat.c:4956 postmaster/pgstat.c:5091 -#, c-format -msgid "could not write temporary statistics file \"%s\": %m" -msgstr "\"%s\" 임시 통계 파ì¼ì— 쓰기 실패: %m" - -#: postmaster/pgstat.c:4965 postmaster/pgstat.c:5100 -#, c-format -msgid "could not close temporary statistics file \"%s\": %m" -msgstr "\"%s\" 임시 통계 파ì¼ì„ ë‹«ì„ ìˆ˜ 없습니다: %m" +"í•„ìš” 없는 \"%s\" ì•„ì¹´ì´ë¸Œ ìƒíƒœ íŒŒì¼ ì‚­ì œ ìž‘ì—…ì´ ê³„ì† ì‹¤íŒ¨í•˜ê³  있습니다. 다ìŒ" +"ì— ë˜ ì‹œë„í•  것입니다." -#: postmaster/pgstat.c:4973 postmaster/pgstat.c:5108 +#: postmaster/pgarch.c:498 #, c-format -msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" -msgstr "\"%s\" 임시 통계 íŒŒì¼ ì´ë¦„ì„ \"%s\" (으)로 바꿀 수 없습니다: %m" +msgid "" +"archiving write-ahead log file \"%s\" failed too many times, will try again " +"later" +msgstr "" +"\"%s\" 트랜잭션 로그 íŒŒì¼ ì•„ì¹´ì´ë¸Œ ìž‘ì—…ì´ ê³„ì† ì‹¤íŒ¨í•˜ê³  있습니다. 다ìŒì— ë˜ " +"시ë„í•  것입니다." -#: postmaster/pgstat.c:5205 postmaster/pgstat.c:5422 postmaster/pgstat.c:5576 +#: postmaster/pgarch.c:879 postmaster/pgarch.c:918 #, c-format -msgid "could not open statistics file \"%s\": %m" -msgstr "\"%s\" 통계 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" +msgid "both \"archive_command\" and \"archive_library\" set" +msgstr "\"archive_command\", \"archive_library\" ë‘ ì„¤ì • ëª¨ë‘ ê°’ì„ ì§€ì •í–ˆìŠµë‹ˆë‹¤." -#: postmaster/pgstat.c:5217 postmaster/pgstat.c:5227 postmaster/pgstat.c:5248 -#: postmaster/pgstat.c:5259 postmaster/pgstat.c:5281 postmaster/pgstat.c:5296 -#: postmaster/pgstat.c:5359 postmaster/pgstat.c:5434 postmaster/pgstat.c:5454 -#: postmaster/pgstat.c:5472 postmaster/pgstat.c:5488 postmaster/pgstat.c:5506 -#: postmaster/pgstat.c:5522 postmaster/pgstat.c:5588 postmaster/pgstat.c:5600 -#: postmaster/pgstat.c:5612 postmaster/pgstat.c:5623 postmaster/pgstat.c:5648 -#: postmaster/pgstat.c:5670 +#: postmaster/pgarch.c:880 postmaster/pgarch.c:919 #, c-format -msgid "corrupted statistics file \"%s\"" -msgstr "\"%s\" 통계 파ì¼ì´ ì†ìƒë˜ì—ˆìŒ" +msgid "Only one of \"archive_command\", \"archive_library\" may be set." +msgstr "\"archive_command\", \"archive_library\" 둘 중 하나만 지정하세요." -#: postmaster/pgstat.c:5799 +#: postmaster/pgarch.c:897 #, c-format msgid "" -"using stale statistics instead of current ones because stats collector is " -"not responding" +"restarting archiver process because value of \"archive_library\" was changed" msgstr "" -"현재 통계 수집기가 ë°˜ì‘하지 않아 부정확한 통계정보가 사용ë˜ê³  있습니다." +"\"archive_library\" ì„¤ì •ê°’ì´ ë°”ë€Œì–´ì„œ archiver 프로세스를 다시 시작 합니다." + +#: postmaster/pgarch.c:934 +#, c-format +msgid "archive modules have to define the symbol %s" +msgstr "ì•„ì¹´ì´ë¸Œ ëª¨ë“ˆì€ %s ì‹¬ë³¼ì„ ì •ì˜í•´ì•¼í•©ë‹ˆë‹¤." -#: postmaster/pgstat.c:6129 +#: postmaster/pgarch.c:940 #, c-format -msgid "database hash table corrupted during cleanup --- abort" -msgstr "정리하는 ë™ì•ˆ ë°ì´í„°ë² ì´ìФ 해시 í…Œì´ë¸”ì´ ì†ìƒ ë˜ì—ˆìŠµë‹ˆë‹¤ --- 중지함" +msgid "archive modules must register an archive callback" +msgstr "ì•„ì¹´ì´ë¸Œ ëª¨ë“ˆì€ ì•„ì¹´ì´ë¸Œ 콜백 함수를 등ë¡í•´ì•¼í•©ë‹ˆë‹¤." -#: postmaster/postmaster.c:733 +#: postmaster/postmaster.c:661 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: -f ì˜µì…˜ì˜ ìž˜ëª»ëœ ì¸ìž: \"%s\"\n" -#: postmaster/postmaster.c:819 +#: postmaster/postmaster.c:734 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: -t ì˜µì…˜ì˜ ìž˜ëª»ëœ ì¸ìž: \"%s\"\n" -#: postmaster/postmaster.c:870 +#: postmaster/postmaster.c:757 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: ìž˜ëª»ëœ ì¸ìž: \"%s\"\n" -#: postmaster/postmaster.c:912 +#: postmaster/postmaster.c:825 #, c-format msgid "" -"%s: superuser_reserved_connections (%d) must be less than max_connections " -"(%d)\n" +"%s: \"superuser_reserved_connections\" (%d) plus \"reserved_connections\" " +"(%d) must be less than \"max_connections\" (%d)\n" msgstr "" -"%s: superuser_reserved_connections (%d) ê°’ì€ max_connections(%d) 값보다 작아" -"야함\n" +"%s: \"superuser_reserved_connections\" (%d) ê°’ + \"reserved_connections\" (%d) ê°’ì€ " +"\"max_connections\" (%d) 값보다 작아야함\n" -#: postmaster/postmaster.c:919 +#: postmaster/postmaster.c:833 #, c-format -msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" -msgstr "wal_level ê°’ì´ \"minimal\"ì¼ ë•ŒëŠ” ì•„ì¹´ì´ë¸Œ ìž‘ì—…ì„ í•  수 없습니다." +msgid "WAL archival cannot be enabled when \"wal_level\" is \"minimal\"" +msgstr "\"wal_level\" ê°’ì´ \"minimal\"ì¼ ë•ŒëŠ” ì•„ì¹´ì´ë¸Œ ìž‘ì—…ì„ í•  수 없습니다." -#: postmaster/postmaster.c:922 +#: postmaster/postmaster.c:836 #, c-format msgid "" -"WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or " -"\"logical\"" +"WAL streaming (\"max_wal_senders\" > 0) requires \"wal_level\" to be " +"\"replica\" or \"logical\"" msgstr "" -"WAL ìŠ¤íŠ¸ë¦¬ë° ìž‘ì—…(max_wal_senders > 0 ì¸ê²½ìš°)ì€ wal_level ê°’ì´ \"replica\" ë˜" +"WAL ìŠ¤íŠ¸ë¦¬ë° ìž‘ì—…(\"max_wal_senders\" > 0 ì¸ê²½ìš°)ì€ \"wal_level\" ê°’ì´ \"replica\" ë˜" "는 \"logical\" ì´ì–´ì•¼ 합니다." -#: postmaster/postmaster.c:930 +#: postmaster/postmaster.c:839 +#, c-format +msgid "WAL cannot be summarized when \"wal_level\" is \"minimal\"" +msgstr "\"wal_level\" ê°’ì´ \"minimal\"ì¼ ë•ŒëŠ” ì•„ì¹´ì´ë¸Œ ìž‘ì—…ì„ í•  수 없습니다." + +#: postmaster/postmaster.c:847 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: ìž˜ëª»ëœ datetoken í…Œì´ë¸”들, 복구하십시오.\n" -#: postmaster/postmaster.c:1047 +#: postmaster/postmaster.c:1004 #, c-format msgid "could not create I/O completion port for child queue" msgstr "하위 ëŒ€ê¸°ì—´ì— ëŒ€í•´ I/O 완료 í¬íŠ¸ë¥¼ 만들 수 ì—†ìŒ" -#: postmaster/postmaster.c:1113 +#: postmaster/postmaster.c:1069 #, c-format msgid "ending log output to stderr" msgstr "stderr 쪽 로그 ì¶œë ¥ì„ ì¤‘ì§€í•©ë‹ˆë‹¤." -#: postmaster/postmaster.c:1114 +#: postmaster/postmaster.c:1070 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "ìžì„¸í•œ 로그는 \"%s\" 쪽으로 기ë¡ë©ë‹ˆë‹¤." -#: postmaster/postmaster.c:1125 +#: postmaster/postmaster.c:1081 #, c-format msgid "starting %s" -msgstr "" - -#: postmaster/postmaster.c:1154 postmaster/postmaster.c:1252 -#: utils/init/miscinit.c:1597 -#, c-format -msgid "invalid list syntax in parameter \"%s\"" -msgstr "\"%s\" 매개 변수 êµ¬ë¬¸ì´ ìž˜ëª» ë˜ì—ˆìŠµë‹ˆë‹¤" +msgstr "%s 서버를 시작합니다." -#: postmaster/postmaster.c:1185 +#: postmaster/postmaster.c:1143 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "\"%s\" ì‘당 ì†Œì¼“ì„ ë§Œë“¤ 수 없습니다" -#: postmaster/postmaster.c:1191 +#: postmaster/postmaster.c:1149 #, c-format msgid "could not create any TCP/IP sockets" msgstr "TCP/IP ì†Œì¼“ì„ ë§Œë“¤ 수 없습니다." -#: postmaster/postmaster.c:1274 +#: postmaster/postmaster.c:1181 +#, c-format +msgid "DNSServiceRegister() failed: error code %ld" +msgstr "DNSServiceRegister() 실패: 오류 코드 %ld" + +#: postmaster/postmaster.c:1234 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "\"%s\" ë””ë ‰í„°ë¦¬ì— ìœ ë‹‰ìŠ¤ ë„ë©”ì¸ ì†Œì¼“ì„ ë§Œë“¤ 수 없습니다" -#: postmaster/postmaster.c:1280 +#: postmaster/postmaster.c:1240 #, c-format msgid "could not create any Unix-domain sockets" msgstr "유닉스 ë„ë©”ì¸ ì†Œì¼“ì„ ë§Œë“¤ 수 없습니다" -#: postmaster/postmaster.c:1292 +#: postmaster/postmaster.c:1251 #, c-format msgid "no socket created for listening" msgstr "서버 ì ‘ì† ëŒ€ê¸° ìž‘ì—…ì„ ìœ„í•œ ì†Œì¼“ì„ ë§Œë“¤ 수 ì—†ìŒ" -#: postmaster/postmaster.c:1323 -#, c-format -msgid "%s: could not change permissions of external PID file \"%s\": %s\n" -msgstr "%s: \"%s\" 외부 PID 파ì¼ì˜ ì ‘ê·¼ ê¶Œí•œì„ ë°”ê¿€ 수 ì—†ìŒ: %s\n" - -#: postmaster/postmaster.c:1327 -#, c-format -msgid "%s: could not write external PID file \"%s\": %s\n" -msgstr "%s: 외부 pid íŒŒì¼ \"%s\" 를 쓸 수 ì—†ìŒ: %s\n" - -#: postmaster/postmaster.c:1360 utils/init/postinit.c:215 -#, c-format -msgid "could not load pg_hba.conf" -msgstr "pg_hba.conf를 로드할 수 ì—†ìŒ" - -#: postmaster/postmaster.c:1386 -#, c-format -msgid "postmaster became multithreaded during startup" -msgstr "" - -#: postmaster/postmaster.c:1387 -#, c-format -msgid "Set the LC_ALL environment variable to a valid locale." -msgstr "LC_ALL 환경 설정값으로 ì•Œë§žì€ ë¡œì¼€ì¼ ì´ë¦„ì„ ì§€ì •í•˜ì„¸ìš”." - -#: postmaster/postmaster.c:1488 -#, c-format -msgid "%s: could not locate matching postgres executable" -msgstr "%s: 실행가능한 postgres í”„ë¡œê·¸ëž¨ì„ ì°¾ì„ ìˆ˜ 없습니다" - -#: postmaster/postmaster.c:1511 utils/misc/tzparser.c:340 -#, c-format -msgid "" -"This may indicate an incomplete PostgreSQL installation, or that the file " -"\"%s\" has been moved away from its proper location." -msgstr "" -"ì´ ë¬¸ì œëŠ” PostgreSQL 설치가 불완전하게 ë˜ì—ˆê±°ë‚˜, \"%s\" 파ì¼ì´ 올바른 ìœ„ì¹˜ì— " -"있지 않아서 ë°œìƒí–ˆìŠµë‹ˆë‹¤." - -#: postmaster/postmaster.c:1538 -#, c-format -msgid "" -"%s: could not find the database system\n" -"Expected to find it in the directory \"%s\",\n" -"but could not open file \"%s\": %s\n" -msgstr "" -"%s: ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì„ ì°¾ì„ ìˆ˜ 없습니다\n" -"\"%s\" 디렉터리 ì•ˆì— í•´ë‹¹ ìžë£Œê°€ 있기를 기대했는ë°,\n" -"\"%s\" 파ì¼ì„ ì—´ 수가 없었습니다: %s\n" - -#: postmaster/postmaster.c:1715 -#, c-format -msgid "select() failed in postmaster: %m" -msgstr "postmasterì—서 select() ìž‘ë™ ì‹¤íŒ¨: %m" - -#: postmaster/postmaster.c:1870 -#, c-format -msgid "" -"performing immediate shutdown because data directory lock file is invalid" -msgstr "" - -#: postmaster/postmaster.c:1973 postmaster/postmaster.c:2004 -#, c-format -msgid "incomplete startup packet" -msgstr "ì•„ì§ ì™„ë£Œë˜ì§€ ì•Šì€ ì‹œìž‘ 패킷" - -#: postmaster/postmaster.c:1985 -#, c-format -msgid "invalid length of startup packet" -msgstr "시작 íŒ¨í‚·ì˜ ê¸¸ì´ê°€ 잘못 ë˜ì—ˆìŠµë‹ˆë‹¤" - -#: postmaster/postmaster.c:2043 -#, c-format -msgid "failed to send SSL negotiation response: %m" -msgstr "SSL ì—°ê²° ìž‘ì—…ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤: %m" - -#: postmaster/postmaster.c:2074 +#: postmaster/postmaster.c:1282 #, c-format -msgid "failed to send GSSAPI negotiation response: %m" -msgstr "GSSAPI í˜‘ìƒ ì‘ë‹µì„ ë³´ë‚´ì§€ 못했습니다: %m" +msgid "%s: could not change permissions of external PID file \"%s\": %m\n" +msgstr "%s: \"%s\" 외부 PID 파ì¼ì˜ ì ‘ê·¼ ê¶Œí•œì„ ë°”ê¿€ 수 ì—†ìŒ: %m\n" -#: postmaster/postmaster.c:2104 +#: postmaster/postmaster.c:1286 #, c-format -msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" -msgstr "" -"ì§€ì›í•˜ì§€ 않는 frontend 프로토콜 %u.%u: 서버ì—서 ì§€ì›í•˜ëŠ” 프로토콜 %u.0 .. %u." -"%u" +msgid "%s: could not write external PID file \"%s\": %m\n" +msgstr "%s: 외부 pid íŒŒì¼ \"%s\" 를 쓸 수 ì—†ìŒ: %m\n" -#: postmaster/postmaster.c:2168 utils/misc/guc.c:6769 utils/misc/guc.c:6805 -#: utils/misc/guc.c:6875 utils/misc/guc.c:8198 utils/misc/guc.c:11044 -#: utils/misc/guc.c:11078 +#. translator: %s is a configuration file +#: postmaster/postmaster.c:1314 utils/init/postinit.c:221 #, c-format -msgid "invalid value for parameter \"%s\": \"%s\"" -msgstr "ìž˜ëª»ëœ \"%s\" 매개 ë³€ìˆ˜ì˜ ê°’: \"%s\"" +msgid "could not load %s" +msgstr "%s 파ì¼ì„ 로드 í•  수 ì—†ìŒ" -#: postmaster/postmaster.c:2171 +#: postmaster/postmaster.c:1340 #, c-format -msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." -msgstr "" +msgid "postmaster became multithreaded during startup" +msgstr "í¬ìŠ¤íŠ¸ë§ˆìŠ¤í„°ê°€ 시작하면서 멀티쓰레드 í™˜ê²½ì´ ë˜ì—ˆìŠµë‹ˆë‹¤." -#: postmaster/postmaster.c:2216 +#: postmaster/postmaster.c:1341 #, c-format -msgid "invalid startup packet layout: expected terminator as last byte" -msgstr "ìž˜ëª»ëœ ì‹œìž‘ 패킷 ë ˆì´ì•„웃: 마지막 ë°”ì´íŠ¸ë¡œ 종결문ìžê°€ 발견ë˜ì—ˆìŒ" +msgid "Set the LC_ALL environment variable to a valid locale." +msgstr "LC_ALL 환경 설정값으로 ì•Œë§žì€ ë¡œì¼€ì¼ ì´ë¦„ì„ ì§€ì •í•˜ì„¸ìš”." -#: postmaster/postmaster.c:2254 +#: postmaster/postmaster.c:1440 #, c-format -msgid "no PostgreSQL user name specified in startup packet" -msgstr "시작 패킷ì—서 지정한 사용ìžëŠ” PostgreSQL ì‚¬ìš©ìž ì´ë¦„ì´ ì•„ë‹™ë‹ˆë‹¤" +msgid "%s: could not locate my own executable path" +msgstr "%s: 실행 가능 경로를 확정할 수 ì—†ìŒ" -#: postmaster/postmaster.c:2318 +#: postmaster/postmaster.c:1447 #, c-format -msgid "the database system is starting up" -msgstr "ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì´ ìƒˆë¡œ ê°€ë™ ì¤‘ìž…ë‹ˆë‹¤." +msgid "%s: could not locate matching postgres executable" +msgstr "%s: 실행가능한 postgres í”„ë¡œê·¸ëž¨ì„ ì°¾ì„ ìˆ˜ 없습니다" -#: postmaster/postmaster.c:2323 +#: postmaster/postmaster.c:1470 utils/misc/tzparser.c:341 #, c-format -msgid "the database system is shutting down" -msgstr "ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì´ ì¤‘ì§€ 중입니다" +msgid "" +"This may indicate an incomplete PostgreSQL installation, or that the file " +"\"%s\" has been moved away from its proper location." +msgstr "" +"ì´ ë¬¸ì œëŠ” PostgreSQL 설치가 불완전하게 ë˜ì—ˆê±°ë‚˜, \"%s\" 파ì¼ì´ 올바른 ìœ„ì¹˜ì— " +"있지 않아서 ë°œìƒí–ˆìŠµë‹ˆë‹¤." -#: postmaster/postmaster.c:2328 +#: postmaster/postmaster.c:1497 #, c-format -msgid "the database system is in recovery mode" -msgstr "ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì´ ìžë™ 복구 작업 중입니다." +msgid "" +"%s: could not find the database system\n" +"Expected to find it in the directory \"%s\",\n" +"but could not open file \"%s\": %m\n" +msgstr "" +"%s: ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì„ ì°¾ì„ ìˆ˜ 없습니다\n" +"\"%s\" 디렉터리 ì•ˆì— í•´ë‹¹ ìžë£Œê°€ 있기를 기대했는ë°,\n" +"\"%s\" 파ì¼ì„ ì—´ 수가 없었습니다: %m\n" -#: postmaster/postmaster.c:2333 storage/ipc/procarray.c:293 -#: storage/ipc/sinvaladt.c:297 storage/lmgr/proc.c:362 +#. translator: %s is SIGKILL or SIGABRT +#: postmaster/postmaster.c:1787 #, c-format -msgid "sorry, too many clients already" -msgstr "최대 ë™ì‹œ ì ‘ì†ìž 수를 초과했습니다." +msgid "issuing %s to recalcitrant children" +msgstr "하위 프로세스 정리를 위해 %s 신호 보냄" + +#: postmaster/postmaster.c:1809 +#, c-format +msgid "" +"performing immediate shutdown because data directory lock file is invalid" +msgstr "ë°ì´í„° 디렉터리 잠금 파ì¼ì´ 잘못ë˜ì–´ 즉시 종료 ìž‘ì—…ì„ ì§„í–‰í•©ë‹ˆë‹¤." -#: postmaster/postmaster.c:2423 +#: postmaster/postmaster.c:1872 #, c-format msgid "wrong key in cancel request for process %d" msgstr "프로세스 %dì— ëŒ€í•œ 취소 ìš”ì²­ì— ìž˜ëª»ëœ í‚¤ê°€ 있ìŒ" -#: postmaster/postmaster.c:2435 +#: postmaster/postmaster.c:1884 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "취소 ìš”ì²­ì˜ PID %dê³¼(와) ì¼ì¹˜í•˜ëŠ” 프로세스가 ì—†ìŒ" -#: postmaster/postmaster.c:2706 +#: postmaster/postmaster.c:2104 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "SIGHUP 신호를 받아서, 환경설정파ì¼ì„ 다시 ì½ê³  있습니다." #. translator: %s is a configuration file -#: postmaster/postmaster.c:2732 postmaster/postmaster.c:2736 +#: postmaster/postmaster.c:2132 postmaster/postmaster.c:2136 #, c-format msgid "%s was not reloaded" msgstr "%s 파ì¼ì„ 다시 불러오지 않았ìŒ" -#: postmaster/postmaster.c:2746 +#: postmaster/postmaster.c:2146 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL ì„¤ì •ì´ ë‹¤ì‹œ 로드ë˜ì§€ 않았ìŒ" -#: postmaster/postmaster.c:2802 +#: postmaster/postmaster.c:2232 #, c-format msgid "received smart shutdown request" msgstr "smart 중지 ìš”ì²­ì„ ë°›ì•˜ìŠµë‹ˆë‹¤." -#: postmaster/postmaster.c:2848 +#: postmaster/postmaster.c:2273 #, c-format msgid "received fast shutdown request" msgstr "fast 중지 ìš”ì²­ì„ ë°›ì•˜ìŠµë‹ˆë‹¤." -#: postmaster/postmaster.c:2866 +#: postmaster/postmaster.c:2291 #, c-format msgid "aborting any active transactions" msgstr "모든 활성화 ë˜ì–´ìžˆëŠ” íŠ¸ëžœìž­ì…˜ì„ ì¤‘ì§€í•˜ê³  있습니다." -#: postmaster/postmaster.c:2890 +#: postmaster/postmaster.c:2315 #, c-format msgid "received immediate shutdown request" msgstr "immediate 중지 ìš”ì²­ì„ ë°›ì•˜ìŠµë‹ˆë‹¤." -#: postmaster/postmaster.c:2965 +#: postmaster/postmaster.c:2387 #, c-format msgid "shutdown at recovery target" msgstr "복구 타겟ì—서 중지함" -#: postmaster/postmaster.c:2983 postmaster/postmaster.c:3019 +#: postmaster/postmaster.c:2405 postmaster/postmaster.c:2441 msgid "startup process" msgstr "시작 프로세스" -#: postmaster/postmaster.c:2986 +#: postmaster/postmaster.c:2408 #, c-format msgid "aborting startup due to startup process failure" msgstr "시작 프로세스 실패 ë•Œë¬¸ì— ì„œë²„ ì‹œìž‘ì´ ì¤‘ì§€ ë˜ì—ˆìŠµë‹ˆë‹¤" -#: postmaster/postmaster.c:3061 +#: postmaster/postmaster.c:2483 #, c-format msgid "database system is ready to accept connections" msgstr "ì´ì œ ë°ì´í„°ë² ì´ìФ 서버로 ì ‘ì†í•  수 있습니다" -#: postmaster/postmaster.c:3082 +#: postmaster/postmaster.c:2504 msgid "background writer process" msgstr "백그ë¼ìš´ë“œ writer 프로세스" -#: postmaster/postmaster.c:3136 +#: postmaster/postmaster.c:2551 msgid "checkpointer process" msgstr "ì²´í¬í¬ì¸íЏ 프로세스" -#: postmaster/postmaster.c:3152 +#: postmaster/postmaster.c:2567 msgid "WAL writer process" msgstr "WAL 쓰기 프로세스" -#: postmaster/postmaster.c:3167 +#: postmaster/postmaster.c:2582 msgid "WAL receiver process" msgstr "WAL 수신 프로세스" -#: postmaster/postmaster.c:3182 +#: postmaster/postmaster.c:2596 +msgid "WAL summarizer process" +msgstr "WAL 요약 프로세스" + +#: postmaster/postmaster.c:2611 msgid "autovacuum launcher process" msgstr "autovacuum 실행기 프로세스" -#: postmaster/postmaster.c:3197 +#: postmaster/postmaster.c:2629 msgid "archiver process" msgstr "archiver 프로세스" -#: postmaster/postmaster.c:3213 -msgid "statistics collector process" -msgstr "통계 수집기 프로세스" - -#: postmaster/postmaster.c:3227 +#: postmaster/postmaster.c:2642 msgid "system logger process" msgstr "시스템 로그 프로세스" -#: postmaster/postmaster.c:3291 +#: postmaster/postmaster.c:2659 +msgid "slot sync worker process" +msgstr "슬롯 ë™ê¸°í™” 작업 프로세스" + +#: postmaster/postmaster.c:2715 #, c-format msgid "background worker \"%s\"" msgstr "백그ë¼ìš´ë“œ ìž‘ì—…ìž \"%s\"" -#: postmaster/postmaster.c:3375 postmaster/postmaster.c:3395 -#: postmaster/postmaster.c:3402 postmaster/postmaster.c:3420 +#: postmaster/postmaster.c:2794 postmaster/postmaster.c:2814 +#: postmaster/postmaster.c:2821 postmaster/postmaster.c:2839 msgid "server process" msgstr "서버 프로세스" -#: postmaster/postmaster.c:3474 +#: postmaster/postmaster.c:2893 #, c-format msgid "terminating any other active server processes" msgstr "다른 활성화 ë˜ì–´ìžˆëŠ” 서버 프로세스를 마치고 있는 중입니다" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3729 +#: postmaster/postmaster.c:3080 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) í”„ë¡œê·¸ëž¨ì€ %d 코드로 마쳤습니다" -#: postmaster/postmaster.c:3731 postmaster/postmaster.c:3743 -#: postmaster/postmaster.c:3753 postmaster/postmaster.c:3764 +#: postmaster/postmaster.c:3082 postmaster/postmaster.c:3094 +#: postmaster/postmaster.c:3104 postmaster/postmaster.c:3115 #, c-format msgid "Failed process was running: %s" -msgstr "" +msgstr "프로세스 실행 실패: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3740 +#: postmaster/postmaster.c:3091 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) 프로세스가 0x%X 예외로 ì¸í•´ 종료ë¨" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3750 +#: postmaster/postmaster.c:3101 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) 프로세스가 %d번 시그ë„ì„ ë°›ì•„ 종료ë¨: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3762 +#: postmaster/postmaster.c:3113 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) 프로세스가 ì¸ì‹í•  수 없는 %d ìƒíƒœë¡œ 종료ë¨" -#: postmaster/postmaster.c:3970 +#: postmaster/postmaster.c:3329 #, c-format msgid "abnormal database system shutdown" msgstr "비정ìƒì ì¸ ë°ì´í„°ë² ì´ìФ 시스템 서비스를 중지" -#: postmaster/postmaster.c:4010 +#: postmaster/postmaster.c:3355 +#, c-format +msgid "shutting down due to startup process failure" +msgstr "시작 작업 실패로 중지합니다." + +#: postmaster/postmaster.c:3361 +#, c-format +msgid "shutting down because \"restart_after_crash\" is off" +msgstr "\"restart_after_crash\" ê°’ì´ off 로 지정ë˜ì–´ 중지합니다." + +#: postmaster/postmaster.c:3373 #, c-format msgid "all server processes terminated; reinitializing" msgstr "모든 서버 프로세스가 중지 ë˜ì—ˆìŠµë‹ˆë‹¤; 재 초기화 중" -#: postmaster/postmaster.c:4180 postmaster/postmaster.c:5599 -#: postmaster/postmaster.c:5986 +#: postmaster/postmaster.c:3572 postmaster/postmaster.c:3982 +#: postmaster/postmaster.c:4371 #, c-format msgid "could not generate random cancel key" msgstr "무작위 취소 키를 만들 수 ì—†ìŒ" -#: postmaster/postmaster.c:4234 +#: postmaster/postmaster.c:3605 #, c-format msgid "could not fork new process for connection: %m" msgstr "ì—°ê²°ì„ ìœ„í•œ 새 프로세스 할당(fork) 실패: %m" -#: postmaster/postmaster.c:4276 +#: postmaster/postmaster.c:3647 msgid "could not fork new process for connection: " msgstr "ì—°ê²°ì„ ìœ„í•œ 새 프로세스 할당(fork) 실패: " -#: postmaster/postmaster.c:4393 -#, c-format -msgid "connection received: host=%s port=%s" -msgstr "ì ‘ì† ìˆ˜ë½: host=%s port=%s" - -#: postmaster/postmaster.c:4398 -#, c-format -msgid "connection received: host=%s" -msgstr "ì ‘ì† ìˆ˜ë½: host=%s" - -#: postmaster/postmaster.c:4668 -#, c-format -msgid "could not execute server process \"%s\": %m" -msgstr "\"%s\" 서버 프로세스를 실행할 수 ì—†ìŒ: %m" - -#: postmaster/postmaster.c:4827 -#, c-format -msgid "giving up after too many tries to reserve shared memory" -msgstr "공유 메모리 확보 ìž‘ì—…ì„ ì—¬ëŸ¬ 번 시ë„했으나 실패 함" - -#: postmaster/postmaster.c:4828 -#, c-format -msgid "This might be caused by ASLR or antivirus software." -msgstr "ì´ í˜„ìƒì€ ASLR ë˜ëŠ” ë°”ì´ëŸ¬ìФ 검사 소프트웨어 ë•Œë¬¸ì¼ ìˆ˜ 있습니다." - -#: postmaster/postmaster.c:5034 -#, c-format -msgid "SSL configuration could not be loaded in child process" -msgstr "하위 프로세스ì—서 SSL 환경 ì„¤ì •ì„ ëª»í–ˆìŒ" - -#: postmaster/postmaster.c:5166 +#: postmaster/postmaster.c:3681 #, c-format msgid "Please report this to <%s>." msgstr "ì´ ë‚´ìš©ì„ <%s> 주소로 보고하십시오." -#: postmaster/postmaster.c:5259 +#: postmaster/postmaster.c:3749 #, c-format -msgid "database system is ready to accept read only connections" +msgid "database system is ready to accept read-only connections" msgstr "ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì´ ì½ê¸° 전용으로 ì—°ê²°ì„ ìˆ˜ë½í•  준비가 ë˜ì—ˆìŠµë‹ˆë‹¤." -#: postmaster/postmaster.c:5527 -#, c-format -msgid "could not fork startup process: %m" -msgstr "시작 프로세스 할당(fork) 실패: %m" - -#: postmaster/postmaster.c:5531 -#, c-format -msgid "could not fork background writer process: %m" -msgstr "백그ë¼ìš´ writer 프로세스를 할당(fork)í•  수 없습니다: %m" - -#: postmaster/postmaster.c:5535 -#, c-format -msgid "could not fork checkpointer process: %m" -msgstr "ì²´í¬í¬ì¸íЏ 프로세스를 할당(fork)í•  수 없습니다: %m" - -#: postmaster/postmaster.c:5539 -#, c-format -msgid "could not fork WAL writer process: %m" -msgstr "WAL 쓰기 프로세스를 할당(fork)í•  수 ì—†ìŒ: %m" - -#: postmaster/postmaster.c:5543 -#, c-format -msgid "could not fork WAL receiver process: %m" -msgstr "WAL 수신 프로세스를 할당(fork)í•  수 ì—†ìŒ: %m" - -#: postmaster/postmaster.c:5547 +#: postmaster/postmaster.c:3932 #, c-format -msgid "could not fork process: %m" -msgstr "프로세스 할당(fork) 실패: %m" +msgid "could not fork \"%s\" process: %m" +msgstr "\"%s\" 프로세스 할당(fork) 실패: %m" -#: postmaster/postmaster.c:5744 postmaster/postmaster.c:5767 +#: postmaster/postmaster.c:4170 postmaster/postmaster.c:4204 #, c-format msgid "database connection requirement not indicated during registration" msgstr "" +"백그ë¼ìš´ë“œ 프로세스 초기화 ì¤‘ì— ë°ì´í„°ë² ì´ìФ ì—°ê²° 요구 ì‚¬í•­ì´ ì¶©ì¡±ë˜ì§€ 않았습" +"니다." -#: postmaster/postmaster.c:5751 postmaster/postmaster.c:5774 +#: postmaster/postmaster.c:4180 postmaster/postmaster.c:4214 #, c-format msgid "invalid processing mode in background worker" msgstr "백그ë¼ìš´ë“œ 작업ìžì—서 ìž˜ëª»ëœ í”„ë¡œì„¸ì‹± 모드가 사용ë¨" -#: postmaster/postmaster.c:5847 -#, c-format -msgid "starting background worker process \"%s\"" -msgstr "\"%s\" 백그ë¼ìš´ë“œ ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ë¥¼ 시작합니다." - -#: postmaster/postmaster.c:5859 -#, c-format -msgid "could not fork worker process: %m" -msgstr "ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ë¥¼ 할당(fork)í•  수 ì—†ìŒ: %m" - -#: postmaster/postmaster.c:5972 -#, c-format -msgid "no slot available for new worker process" -msgstr "새 ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ì—서 쓸 ìŠ¬ë¡¯ì´ ì—†ìŒ" - -#: postmaster/postmaster.c:6307 -#, c-format -msgid "could not duplicate socket %d for use in backend: error code %d" -msgstr "백엔드ì—서 사용하기 위해 %d ì†Œì¼“ì„ ë³µì‚¬í•  수 ì—†ìŒ: 오류 코드 %d" - -#: postmaster/postmaster.c:6339 -#, c-format -msgid "could not create inherited socket: error code %d\n" -msgstr "ìƒì†ëœ ì†Œì¼“ì„ ë§Œë“¤ 수 ì—†ìŒ: 오류 코드 %d\n" - -#: postmaster/postmaster.c:6368 +#: postmaster/postmaster.c:4274 #, c-format -msgid "could not open backend variables file \"%s\": %s\n" -msgstr "\"%s\" 백엔드 변수 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s\n" +msgid "could not fork background worker process: %m" +msgstr "백그ë¼ìš´ë“œ ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ë¥¼ 할당(fork)í•  수 없습니다: %m" -#: postmaster/postmaster.c:6375 +#: postmaster/postmaster.c:4357 #, c-format -msgid "could not read from backend variables file \"%s\": %s\n" -msgstr "\"%s\" 백엔드 변수 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s\n" +msgid "no slot available for new background worker process" +msgstr "새 백그ë¼ìš´ë“œ ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ì—서 쓸 ìŠ¬ë¡¯ì´ ì—†ìŒ" -#: postmaster/postmaster.c:6384 -#, c-format -msgid "could not remove file \"%s\": %s\n" -msgstr "\"%s\" 파ì¼ì„ 삭제할 수 ì—†ìŒ: %s\n" - -#: postmaster/postmaster.c:6401 -#, c-format -msgid "could not map view of backend variables: error code %lu\n" -msgstr "백엔드 변수 파ì¼ì˜ view를 mapí•  수 ì—†ìŒ: 오류 코드 %lu\n" - -#: postmaster/postmaster.c:6410 -#, c-format -msgid "could not unmap view of backend variables: error code %lu\n" -msgstr "백엔드 변수 파ì¼ì˜ view를 unmapí•  수 ì—†ìŒ: 오류 코드 %lu\n" - -#: postmaster/postmaster.c:6417 -#, c-format -msgid "could not close handle to backend parameter variables: error code %lu\n" -msgstr "백엔드 변수 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: 오류 코드 %lu\n" - -#: postmaster/postmaster.c:6595 +#: postmaster/postmaster.c:4620 #, c-format msgid "could not read exit code for process\n" msgstr "í”„ë¡œì„¸ìŠ¤ì˜ ì¢…ë£Œ 코드를 ì½ì„ 수 ì—†ìŒ\n" -#: postmaster/postmaster.c:6600 +#: postmaster/postmaster.c:4662 #, c-format msgid "could not post child completion status\n" msgstr "하위 완료 ìƒíƒœë¥¼ 게시할 수 ì—†ìŒ\n" -#: postmaster/syslogger.c:474 postmaster/syslogger.c:1153 +#: postmaster/syslogger.c:529 postmaster/syslogger.c:1173 #, c-format msgid "could not read from logger pipe: %m" msgstr "로그 파ì´í”„ì—서 ì½ê¸° 실패: %m" -#: postmaster/syslogger.c:522 -#, c-format -msgid "logger shutting down" -msgstr "로그 작업 ë내는 중" - -#: postmaster/syslogger.c:571 postmaster/syslogger.c:585 +#: postmaster/syslogger.c:629 postmaster/syslogger.c:643 #, c-format msgid "could not create pipe for syslog: %m" msgstr "syslogì—서 사용할 파ì´í”„를 만들 수 없습니다: %m" -#: postmaster/syslogger.c:636 +#: postmaster/syslogger.c:712 #, c-format msgid "could not fork system logger: %m" msgstr "시스템 로거(logger)를 확보하질 못 했습니다: %m" -#: postmaster/syslogger.c:672 +#: postmaster/syslogger.c:731 #, c-format msgid "redirecting log output to logging collector process" msgstr "서버 로그를 로그 수집 프로세스로 보냅니다." -#: postmaster/syslogger.c:673 +#: postmaster/syslogger.c:732 #, c-format msgid "Future log output will appear in directory \"%s\"." msgstr "ì´ì œë¶€í„° 서버 로그는 \"%s\" ë””ë ‰í„°ë¦¬ì— ë³´ê´€ë©ë‹ˆë‹¤." -#: postmaster/syslogger.c:681 +#: postmaster/syslogger.c:740 #, c-format msgid "could not redirect stdout: %m" msgstr "í‘œì¤€ì¶œë ¥ì„ redirect 하지 못했습니다: %m" -#: postmaster/syslogger.c:686 postmaster/syslogger.c:703 +#: postmaster/syslogger.c:745 postmaster/syslogger.c:762 #, c-format msgid "could not redirect stderr: %m" msgstr "표준오류(stderr)를 redirect 하지 못했습니다: %m" -#: postmaster/syslogger.c:1108 +#: postmaster/syslogger.c:1128 #, c-format -msgid "could not write to log file: %s\n" -msgstr "ë¡œê·¸íŒŒì¼ ì“°ê¸° 실패: %s\n" +msgid "could not write to log file: %m\n" +msgstr "ë¡œê·¸íŒŒì¼ ì“°ê¸° 실패: %m\n" -#: postmaster/syslogger.c:1225 +#: postmaster/syslogger.c:1246 #, c-format msgid "could not open log file \"%s\": %m" msgstr "\"%s\" 잠금파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: postmaster/syslogger.c:1287 postmaster/syslogger.c:1337 +#: postmaster/syslogger.c:1336 #, c-format msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "" "ë¡œê·¸íŒŒì¼ ìžë™ êµì²´ ê¸°ëŠ¥ì„ ê¸ˆì§€í•©ë‹ˆë‹¤(êµì²´í•˜ë ¤ë©´ SIGHUP 시그ë„ì„ ì‚¬ìš©í•¨)" -#: regex/regc_pg_locale.c:262 -#, c-format -msgid "could not determine which collation to use for regular expression" -msgstr "ì •ê·œì‹ì„ 사용해서 사용할 정렬규칙(collation)ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" - -#: regex/regc_pg_locale.c:269 -#, c-format -msgid "nondeterministic collations are not supported for regular expressions" -msgstr "ì •ê·œì‹ì„ 사용해서 사용할 정렬규칙(collation)ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" - -#: replication/backup_manifest.c:231 -#, c-format -msgid "expected end timeline %u but found timeline %u" -msgstr "%u 타임ë¼ì¸ì´ ëì´ì–´ì•¼í•˜ëŠ”ë°, %u 타임ë¼ì¸ìž„" - -#: replication/backup_manifest.c:248 -#, c-format -msgid "expected start timeline %u but found timeline %u" -msgstr "" -"시작 타임ë¼ì¸ì´ %u 여야하는ë°, %u 타임ë¼ì¸ìž„" - -#: replication/backup_manifest.c:275 -#, c-format -msgid "start timeline %u not found in history of timeline %u" -msgstr "" -"%u 시작 타임ë¼ì¸ì´ %u 타임ë¼ì¸ ë‚´ì—­ì•ˆì— ì—†ìŒ" - -#: replication/backup_manifest.c:322 -#, c-format -msgid "could not rewind temporary file" -msgstr "임시 파ì¼ì„ ë˜ê°ì„ 수 ì—†ìŒ" - -#: replication/backup_manifest.c:349 -#, c-format -msgid "could not read from temporary file: %m" -msgstr "임시 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" - -#: replication/basebackup.c:108 -#, c-format -msgid "could not read from file \"%s\"" -msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ" - -#: replication/basebackup.c:551 -#, c-format -msgid "could not find any WAL files" -msgstr "ì–´ë–¤ WAL 파ì¼ë„ ì°¾ì„ ìˆ˜ ì—†ìŒ" - -#: replication/basebackup.c:566 replication/basebackup.c:582 -#: replication/basebackup.c:591 -#, c-format -msgid "could not find WAL file \"%s\"" -msgstr "\"%s\" WAL íŒŒì¼ ì°¾ê¸° 실패" - -#: replication/basebackup.c:634 replication/basebackup.c:665 -#, c-format -msgid "unexpected WAL file size \"%s\"" -msgstr "\"%s\" WAL 파ì¼ì˜ í¬ê¸°ê°€ 알맞지 않ìŒ" - -#: replication/basebackup.c:648 replication/basebackup.c:1752 -#, c-format -msgid "base backup could not send data, aborting backup" -msgstr "ë² ì´ìФ 백업ì—서 ìžë£Œë¥¼ 보낼 수 ì—†ìŒ. ë°±ì—…ì„ ì¤‘ì§€í•©ë‹ˆë‹¤." - -#: replication/basebackup.c:724 -#, c-format -msgid "%lld total checksum verification failure" -msgid_plural "%lld total checksum verification failures" -msgstr[0] "%lld ì „ì²´ ì²´í¬ì„¬ 검사 실패" - -#: replication/basebackup.c:731 -#, c-format -msgid "checksum verification failure during base backup" -msgstr "ë² ì´ìФ 백업 중 ì²´í¬ì„¬ 검사 실패" - -#: replication/basebackup.c:784 replication/basebackup.c:793 -#: replication/basebackup.c:802 replication/basebackup.c:811 -#: replication/basebackup.c:820 replication/basebackup.c:831 -#: replication/basebackup.c:848 replication/basebackup.c:857 -#: replication/basebackup.c:869 replication/basebackup.c:893 -#, c-format -msgid "duplicate option \"%s\"" -msgstr "\"%s\" ì˜µì…˜ì„ ë‘ ë²ˆ 지정했습니다" - -#: replication/basebackup.c:837 -#, c-format -msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "" -"%d ê°’ì€ \"%s\" 매개 ë³€ìˆ˜ì˜ ê°’ìœ¼ë¡œ 타당한 범위(%d .. %d)를 벗어났습니다." - -#: replication/basebackup.c:882 -#, c-format -msgid "unrecognized manifest option: \"%s\"" -msgstr "ì¸ì‹í•  수 없는 메니페스트 옵션 \"%s\"" - -#: replication/basebackup.c:898 +#: postmaster/walsummarizer.c:740 #, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "알 수 없는 ì²´í¬ì„¬ 알고리즘: \"%s\"" +msgid "WAL summarization is not progressing" +msgstr "WAL 요약정보 처리 ìž‘ì—…ì´ ì§„í–‰ 중ì´ì§€ 않ìŒ" -#: replication/basebackup.c:913 +#: postmaster/walsummarizer.c:741 #, c-format -msgid "manifest checksums require a backup manifest" +msgid "" +"Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/" +"%X in memory." msgstr "" +"요약정보 처리 ìž‘ì—…ì€ %X/%Xì—서 필요한ë°, 디스í¬ì˜ %X/%X, ë©”ëª¨ë¦¬ì˜ %X/%Xì—서 멈추어 있ìŒ" -#: replication/basebackup.c:1504 +#: postmaster/walsummarizer.c:755 #, c-format -msgid "skipping special file \"%s\"" -msgstr "\"%s\" 특수 파ì¼ì„ 건너뜀" +msgid "still waiting for WAL summarization through %X/%X after %ld second" +msgid_plural "" +"still waiting for WAL summarization through %X/%X after %ld seconds" +msgstr[0] "" +"%X/%Xì—서 여전히 %ldì´ˆ ë™ì•ˆ WAL 요약정보 처리 ìž‘ì—…ì´ ë©ˆì¶° 있ìŒ" -#: replication/basebackup.c:1623 +#: postmaster/walsummarizer.c:760 #, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "ìž˜ëª»ëœ ì¡°ê° ë²ˆí˜¸ %d, 해당 파ì¼: \"%s\"" +msgid "Summarization has reached %X/%X on disk and %X/%X in memory." +msgstr "요약정보 처리 ìž‘ì—…ì´ ë””ìŠ¤í¬ì˜ %X/%Xì—, ë©”ëª¨ë¦¬ì˜ %X/%Xì— ë‹¤ë‹¬ì•˜ìŒ" -#: replication/basebackup.c:1642 +#: postmaster/walsummarizer.c:1000 #, c-format -msgid "" -"could not verify checksum in file \"%s\", block %d: read buffer size %d and " -"page size %d differ" -msgstr "" +msgid "could not find a valid record after %X/%X" +msgstr "%X/%X ë’¤ì— ì˜¬ë°”ë¥¸ 레코드를 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: replication/basebackup.c:1686 replication/basebackup.c:1716 +#: postmaster/walsummarizer.c:1045 #, c-format -msgid "could not fseek in file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì—서 fseek ìž‘ì—…ì„ í•  수 ì—†ìŒ: %m" +msgid "could not read WAL from timeline %u at %X/%X: %s" +msgstr "%u번 타임ë¼ì¸ì˜ %X/%Xì—서 WAL를 ì½ì„ 수 ì—†ìŒ: %s" -#: replication/basebackup.c:1708 +#: postmaster/walsummarizer.c:1051 #, c-format -msgid "could not reread block %d of file \"%s\": %m" -msgstr "%d ë¸”ëŸ­ì„ \"%s\" 파ì¼ì—서 다시 ì½ì„ 수 ì—†ìŒ: %m" +msgid "could not read WAL from timeline %u at %X/%X" +msgstr "타임ë¼ì¸ %u, 위치 %X/%X ì—서 WAL를 ì½ì„ ì—†ìŒ" -#: replication/basebackup.c:1732 +#: regex/regc_pg_locale.c:244 #, c-format -msgid "" -"checksum verification failed in file \"%s\", block %d: calculated %X but " -"expected %X" -msgstr "" -"\"%s\" íŒŒì¼ ì²´í¬ì„¬ 검사 실패(해당 블럭 %d): ê³„ì‚°ëœ ì²´í¬ì„¬ì€ %X ê°’ì´ì§€ë§Œ, 기" -"대값 %X" +msgid "could not determine which collation to use for regular expression" +msgstr "ì •ê·œì‹ ì²˜ë¦¬ì— ì“°ì¼ ì •ë ¬ê·œì¹™(collation)ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: replication/basebackup.c:1739 +#: regex/regc_pg_locale.c:262 #, c-format -msgid "" -"further checksum verification failures in file \"%s\" will not be reported" -msgstr "" +msgid "nondeterministic collations are not supported for regular expressions" +msgstr "ì •ê·œì‹ ì²˜ë¦¬ì— ì“°ì¼ ë¹„ê²°ì • 정렬규칙(collation)ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: replication/basebackup.c:1807 +#: replication/libpqwalreceiver/libpqwalreceiver.c:267 +#: replication/libpqwalreceiver/libpqwalreceiver.c:358 #, c-format -msgid "file \"%s\" has a total of %d checksum verification failure" -msgid_plural "file \"%s\" has a total of %d checksum verification failures" -msgstr[0] "\"%s\" 파ì¼ì—서 ì „ì²´ %d ê±´ ì²´í¬ì„¬ 검사 실패" +msgid "password is required" +msgstr "비밀번호가 필요함" -#: replication/basebackup.c:1843 +#: replication/libpqwalreceiver/libpqwalreceiver.c:268 #, c-format -msgid "file name too long for tar format: \"%s\"" -msgstr "tar 파ì¼ë¡œ 묶기ì—는 íŒŒì¼ ì´ë¦„ì´ ë„ˆë¬´ 긺: \"%s\"" +msgid "Non-superuser cannot connect if the server does not request a password." +msgstr "해당 서버로 비밀번호 ì—†ì´ ì ‘ì†í•œë‹¤ë©°, ì¼ë°˜ 사용ìžëŠ” ì ‘ì†í•  수 ì—†ìŒ" -#: replication/basebackup.c:1848 +#: replication/libpqwalreceiver/libpqwalreceiver.c:269 #, c-format msgid "" -"symbolic link target too long for tar format: file name \"%s\", target \"%s\"" +"Target server's authentication method must be changed, or set " +"password_required=false in the subscription parameters." msgstr "" -"tar í¬ë©§ì„ 사용하기ì—는 심볼릭 ë§í¬ì˜ ëŒ€ìƒ ê²½ë¡œê°€ 너무 ê¹ë‹ˆë‹¤: íŒŒì¼ ì´ë¦„ \"%s" -"\", ëŒ€ìƒ \"%s\"" +"ëŒ€ìƒ ì„œë²„ì˜ ì¸ì¦ ë°©ë²•ì„ ë°”ê¾¸ê±°ë‚˜, ë˜ëŠ” êµ¬ë… ì†ì„±ìœ¼ë¡œ password_required=false " +"로 지정하세요." -#: replication/libpqwalreceiver/libpqwalreceiver.c:227 +#: replication/libpqwalreceiver/libpqwalreceiver.c:285 #, c-format msgid "could not clear search path: %s" msgstr "search path를 지울 수 ì—†ìŒ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:251 +#: replication/libpqwalreceiver/libpqwalreceiver.c:331 +#: replication/libpqwalreceiver/libpqwalreceiver.c:517 #, c-format msgid "invalid connection string syntax: %s" msgstr "ìž˜ëª»ëœ ì—°ê²° 문ìžì—´ 구문: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:275 +#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#, c-format +msgid "Non-superusers must provide a password in the connection string." +msgstr "ì¼ë°˜ 사용ìžë¡œ ì ‘ì†í•œë‹¤ë©´, ì—°ê²° 문ìžì—´ì— 비밀번호를 지정하세요." + +#: replication/libpqwalreceiver/libpqwalreceiver.c:386 #, c-format msgid "could not parse connection string: %s" msgstr "ì ‘ì† ë¬¸ìžì—´ì„ ë¶„ì„í•  수 ì—†ìŒ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:347 +#: replication/libpqwalreceiver/libpqwalreceiver.c:459 #, c-format msgid "" "could not receive database system identifier and timeline ID from the " @@ -19162,13 +21798,13 @@ msgid "" msgstr "" "주 서버ì—서 ë°ì´í„°ë² ì´ìФ 시스템 ì‹ë³„번호와 타임ë¼ì¸ 번호를 ë°›ì„ ìˆ˜ ì—†ìŒ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:358 -#: replication/libpqwalreceiver/libpqwalreceiver.c:576 +#: replication/libpqwalreceiver/libpqwalreceiver.c:476 +#: replication/libpqwalreceiver/libpqwalreceiver.c:763 #, c-format msgid "invalid response from primary server" msgstr "주 서버ì—서 ìž˜ëª»ëœ ì‘ë‹µì´ ì™”ìŒ" -#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:477 #, c-format msgid "" "Could not identify system: got %d rows and %d fields, expected %d rows and " @@ -19177,643 +21813,1095 @@ msgstr "" "ì‹œìŠ¤í…œì„ ì‹ë³„í•  수 ì—†ìŒ: 로우수 %d, 필드수 %d, 예ìƒê°’: 로우수 %d, 필드수 %d " "ì´ìƒ" -#: replication/libpqwalreceiver/libpqwalreceiver.c:432 -#: replication/libpqwalreceiver/libpqwalreceiver.c:438 -#: replication/libpqwalreceiver/libpqwalreceiver.c:463 +#: replication/libpqwalreceiver/libpqwalreceiver.c:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:613 +#: replication/libpqwalreceiver/libpqwalreceiver.c:643 #, c-format msgid "could not start WAL streaming: %s" msgstr "WAL ìŠ¤íŠ¸ë¦¬ë° ìž‘ì—…ì„ ì‹œìž‘í•  수 ì—†ìŒ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:486 +#: replication/libpqwalreceiver/libpqwalreceiver.c:667 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "주 서버로 ìŠ¤íŠ¸ë¦¬ë° ì¢…ë£Œ 메시지를 보낼 수 ì—†ìŒ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:508 +#: replication/libpqwalreceiver/libpqwalreceiver.c:690 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "ìŠ¤íŠ¸ë¦¬ë° ì¢…ë£Œ ìš”ì²­ì— ëŒ€í•œ ìž˜ëª»ëœ ì‘ë‹µì„ ë°›ìŒ" -#: replication/libpqwalreceiver/libpqwalreceiver.c:522 +#: replication/libpqwalreceiver/libpqwalreceiver.c:705 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "COPY ìŠ¤íŠ¸ë¦¬ë° ì¢…ë£Œ 중 오류 ë°œìƒ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:531 +#: replication/libpqwalreceiver/libpqwalreceiver.c:715 #, c-format msgid "error reading result of streaming command: %s" msgstr "ìŠ¤íŠ¸ë¦¬ë° ëª…ë ¹ì— ëŒ€í•œ ê²°ê³¼ 처리ì—서 오류 ë°œìƒ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:539 -#: replication/libpqwalreceiver/libpqwalreceiver.c:773 +#: replication/libpqwalreceiver/libpqwalreceiver.c:724 +#: replication/libpqwalreceiver/libpqwalreceiver.c:957 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "CommandComplete 작업 후 예ìƒì¹˜ 못한 결과를 ë°›ìŒ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:565 +#: replication/libpqwalreceiver/libpqwalreceiver.c:751 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "주 서버ì—서 타임ë¼ì¸ ë‚´ì—­ 파ì¼ì„ ë°›ì„ ìˆ˜ ì—†ìŒ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:577 +#: replication/libpqwalreceiver/libpqwalreceiver.c:764 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "2ê°œì˜ ì¹¼ëŸ¼ìœ¼ë¡œ ëœ í•˜ë‚˜ì˜ íŠœí”Œì„ ì˜ˆìƒí•˜ì§€ë§Œ, %d 튜플 (%d 칼럼)ì„ ìˆ˜ì‹ í•¨" -#: replication/libpqwalreceiver/libpqwalreceiver.c:737 -#: replication/libpqwalreceiver/libpqwalreceiver.c:788 -#: replication/libpqwalreceiver/libpqwalreceiver.c:794 +#: replication/libpqwalreceiver/libpqwalreceiver.c:920 +#: replication/libpqwalreceiver/libpqwalreceiver.c:973 +#: replication/libpqwalreceiver/libpqwalreceiver.c:980 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "WAL 스트림ì—서 ìžë£Œ 받기 실패: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:813 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1000 #, c-format msgid "could not send data to WAL stream: %s" msgstr "WAL ìŠ¤íŠ¸ë¦¼ì— ë°ì´í„°ë¥¼ 보낼 수 ì—†ìŒ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:866 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1101 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "\"%s\" 복제 ìŠ¬ë¡¯ì„ ë§Œë“¤ 수 ì—†ìŒ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:911 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1140 +#, c-format +msgid "could not alter replication slot \"%s\": %s" +msgstr "\"%s\" 복제 ìŠ¬ë¡¯ì„ ë³€ê²½í•  수 ì—†ìŒ: %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1174 #, c-format msgid "invalid query response" msgstr "ìž˜ëª»ëœ ì¿¼ë¦¬ ì‘답" -#: replication/libpqwalreceiver/libpqwalreceiver.c:912 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1175 #, c-format msgid "Expected %d fields, got %d fields." msgstr "%dê°œì˜ ì¹¼ëŸ¼ì„ ì˜ˆìƒí•˜ì§€ë§Œ, %dê°œì˜ ì¹¼ëŸ¼ì„ ìˆ˜ì‹ í•¨" -#: replication/libpqwalreceiver/libpqwalreceiver.c:981 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1245 #, c-format msgid "the query interface requires a database connection" msgstr "ì´ ì¿¼ë¦¬ ì¸í„°íŽ˜ì´ìŠ¤ëŠ” ë°ì´í„°ë² ì´ìФ ì—°ê²°ì´ í•„ìš”í•©ë‹ˆë‹¤" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1012 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1277 msgid "empty query" msgstr "빈 쿼리" -#: replication/logical/launcher.c:295 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1283 +msgid "unexpected pipeline mode" +msgstr "예기치 ì•Šì€ íŒŒì´í”„ë¼ì¸ 모드" + +#: replication/logical/applyparallelworker.c:719 +#, c-format +msgid "" +"logical replication parallel apply worker for subscription \"%s\" has " +"finished" +msgstr "\"%s\" 구ë…ì„ ìœ„í•œ 논리 복제 병렬 ë°˜ì˜ ìž‘ì—…ìžê°€ ì¼ì„ ë냄" + +#: replication/logical/applyparallelworker.c:822 +#, c-format +msgid "lost connection to the logical replication apply worker" +msgstr "논리 복제 ë°˜ì˜ ìž‘ì—…ìž ì—°ê²° ëŠê¹€" + +#: replication/logical/applyparallelworker.c:1024 +#: replication/logical/applyparallelworker.c:1026 +msgid "logical replication parallel apply worker" +msgstr "논리 복제 병렬 ë°˜ì˜ ìž‘ì—…ìž" + +#: replication/logical/applyparallelworker.c:1040 +#, c-format +msgid "logical replication parallel apply worker exited due to error" +msgstr "논리 복제 병렬 ë°˜ì˜ ìž‘ì—…ìžê°€ 오류로 종료ë˜ì—ˆìŒ" + +#: replication/logical/applyparallelworker.c:1127 +#: replication/logical/applyparallelworker.c:1300 +#, c-format +msgid "lost connection to the logical replication parallel apply worker" +msgstr "논리 복제 병렬 ë°˜ì˜ ìž‘ì—…ìž ì—°ê²° ëŠê¹€" + +#: replication/logical/applyparallelworker.c:1180 +#, c-format +msgid "could not send data to shared-memory queue" +msgstr "공유 메모리 í로 ë°ì´í„°ë¥¼ 보낼 수 ì—†ìŒ" + +#: replication/logical/applyparallelworker.c:1215 +#, c-format +msgid "" +"logical replication apply worker will serialize the remaining changes of " +"remote transaction %u to a file" +msgstr "" +"논리 복제 ë°˜ì˜ ìž‘ì—…ìžëŠ” %u ì›ê²© íŠ¸ëžœìž­ì…˜ì˜ ë‚¨ì•„ 있는 변경 ì‚¬í•­ì„ íŒŒì¼ë¡œ ì§ë ¬" +"í™” í•  것입니다." + +#: replication/logical/decode.c:177 replication/logical/logical.c:141 #, c-format -msgid "starting logical replication worker for subscription \"%s\"" -msgstr "\"%s\" 구ë…ì„ ìœ„í•´ 논리 복제 작업ìžë¥¼ 시작합니다" +msgid "" +"logical decoding on standby requires \"wal_level\" >= \"logical\" on the " +"primary" +msgstr "" +"대기 서버ì—서 ë…¼ë¦¬ì  ë””ì½”ë”©ì€ ì£¼ì„œë²„ ì„¤ì •ì´ \"wal_level\" >= \"logical\" ì´ì–´ì•¼ 함" -#: replication/logical/launcher.c:302 +#: replication/logical/launcher.c:334 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "" "max_replication_slots = 0 설정 ë•Œë¬¸ì— ë…¼ë¦¬ 복제 작업ìžë¥¼ 시작 í•  수 없습니다" -#: replication/logical/launcher.c:382 +#: replication/logical/launcher.c:427 #, c-format msgid "out of logical replication worker slots" msgstr "ë” ì´ìƒì˜ 논리 복제 작업ìžìš© ìŠ¬ë¡¯ì´ ì—†ìŠµë‹ˆë‹¤" -#: replication/logical/launcher.c:383 +#: replication/logical/launcher.c:428 replication/logical/launcher.c:514 +#: replication/slot.c:1524 storage/lmgr/lock.c:985 storage/lmgr/lock.c:1023 +#: storage/lmgr/lock.c:2836 storage/lmgr/lock.c:4221 storage/lmgr/lock.c:4286 +#: storage/lmgr/lock.c:4636 storage/lmgr/predicate.c:2469 +#: storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:3881 #, c-format -msgid "You might need to increase max_logical_replication_workers." -msgstr "max_logical_replication_workers ê°’ì„ ëŠ˜ë¦¬ì„¸ìš”." +msgid "You might need to increase \"%s\"." +msgstr "\"%s\" ì„¤ì •ê°’ì„ ëŠ˜ë¦´ 필요가 있습니다." -#: replication/logical/launcher.c:438 +#: replication/logical/launcher.c:513 #, c-format msgid "out of background worker slots" msgstr "백그ë¼ìš´ ìž‘ì—…ìž ìŠ¬ë¡¯ì´ ëª¨ìžëžë‹ˆë‹¤" -#: replication/logical/launcher.c:439 -#, c-format -msgid "You might need to increase max_worker_processes." -msgstr "max_worker_processes ê°’ì„ ëŠ˜ë¦¬ì„¸ìš”." - -#: replication/logical/launcher.c:638 +#: replication/logical/launcher.c:720 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" -msgstr "" +msgstr "%d 번 논리 복제 ìž‘ì—…ìž ìŠ¬ë¡¯ì´ ë¹„ì–´ìžˆìŠµë‹ˆë‹¤, ë¶™ì¼ ìˆ˜ 없습니다." -#: replication/logical/launcher.c:647 +#: replication/logical/launcher.c:729 #, c-format msgid "" "logical replication worker slot %d is already used by another worker, cannot " "attach" msgstr "" +"%d 번 논리 복제 ìž‘ì—…ìž ìŠ¬ë¡¯ì„ ì´ë¯¸ 다른 작업ìžê°€ ì“°ê³  있습니다. ë¶™ì¼ ìˆ˜ 없습" +"니다." -#: replication/logical/launcher.c:951 -#, c-format -msgid "logical replication launcher started" -msgstr "논리 복제 관리ìžê°€ 시작ë¨" - -#: replication/logical/logical.c:87 +#: replication/logical/logical.c:121 #, c-format -msgid "logical decoding requires wal_level >= logical" -msgstr "ë…¼ë¦¬ì  ë””ì½”ë”© ê¸°ëŠ¥ì€ wal_level ê°’ì´ logical ì´ìƒì´ì–´ì•¼ 함" +msgid "logical decoding requires \"wal_level\" >= \"logical\"" +msgstr "ë…¼ë¦¬ì  ë””ì½”ë”© ê¸°ëŠ¥ì€ \"wal_level\" ê°’ì´ \"logical\" ì´ìƒì´ì–´ì•¼ 함" -#: replication/logical/logical.c:92 +#: replication/logical/logical.c:126 #, c-format msgid "logical decoding requires a database connection" msgstr "ë…¼ë¦¬ì  ë””ì½”ë”© ê¸°ëŠ¥ì€ ë°ì´í„°ë² ì´ìФ ì—°ê²°ì´ í•„ìš”í•©ë‹ˆë‹¤" -#: replication/logical/logical.c:110 -#, c-format -msgid "logical decoding cannot be used while in recovery" -msgstr "ë…¼ë¦¬ì  ë””ì½”ë”© ê¸°ëŠ¥ì€ ë³µêµ¬ ìƒíƒœì—서는 사용할 수 ì—†ìŒ" - -#: replication/logical/logical.c:258 replication/logical/logical.c:399 +#: replication/logical/logical.c:365 replication/logical/logical.c:519 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "ë…¼ë¦¬ì  ë””ì½”ë”©ì—서는 ë¬¼ë¦¬ì  ë³µì œ ìŠ¬ë¡¯ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: replication/logical/logical.c:263 replication/logical/logical.c:404 +#: replication/logical/logical.c:370 replication/logical/logical.c:529 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "\"%s\" 복제 ìŠ¬ë¡¯ì´ ì´ ë°ì´í„°ë² ì´ìФ 만들어져있지 않ìŒ" -#: replication/logical/logical.c:270 +#: replication/logical/logical.c:377 +#, c-format +msgid "" +"cannot create logical replication slot in transaction that has performed " +"writes" +msgstr "" +"ìžë£Œ 변경 ìž‘ì—…ì´ ìžˆëŠ” 트랜잭션 안ì—서는 ë…¼ë¦¬ì  ë³µì œ ìŠ¬ë¡¯ì„ ë§Œë“¤ 수 ì—†ìŒ" + +#: replication/logical/logical.c:540 +#, c-format +msgid "cannot use replication slot \"%s\" for logical decoding" +msgstr "ë…¼ë¦¬ì  ë””ì½”ë”©ì—서는 \"%s\" ìŠ¬ë¡¯ì„ ì‚¬ìš©í•  수 ì—†ìŒ" + +#: replication/logical/logical.c:542 replication/slot.c:798 +#: replication/slot.c:829 +#, c-format +msgid "This replication slot is being synchronized from the primary server." +msgstr "ì´ ë³µì œ ìŠ¬ë¡¯ì€ í•´ë‹¹ 주 서버로부터 ë™ê¸°í™” ë˜ì—ˆìŠµë‹ˆë‹¤." + +#: replication/logical/logical.c:543 +#, c-format +msgid "Specify another replication slot." +msgstr "다른 복제 ìŠ¬ë¡¯ì„ ì§€ì •í•˜ì„¸ìš”." + +#: replication/logical/logical.c:554 replication/logical/logical.c:561 +#, c-format +msgid "can no longer get changes from replication slot \"%s\"" +msgstr "\"%s\" 복제 슬롯ì—서 변경 ì‚¬í•­ì„ ë” ì°¾ì„ ìˆ˜ ì—†ìŒ" + +#: replication/logical/logical.c:556 +#, c-format +msgid "" +"This slot has been invalidated because it exceeded the maximum reserved size." +msgstr "최대 예약 í¬ê¸°ë¥¼ 초과해서 ì´ ìŠ¬ë¡¯ì€ ì •ìƒì ì´ì§€ ì•Šì€ ê²ƒìœ¼ë¡œ 바꿨습니다." + +#: replication/logical/logical.c:563 #, c-format msgid "" -"cannot create logical replication slot in transaction that has performed " -"writes" +"This slot has been invalidated because it was conflicting with recovery." msgstr "" -"ìžë£Œ 변경 ìž‘ì—…ì´ ìžˆëŠ” 트랜잭션 안ì—서는 ë…¼ë¦¬ì  ë³µì œ ìŠ¬ë¡¯ì„ ë§Œë“¤ 수 ì—†ìŒ" +"ì´ ìŠ¬ë¡¯ì€ ë³µêµ¬ 작업으로 ì¶©ëŒì´ ì¼ì–´ë‚˜ 사용할 수 없는 것으로 처리했습니다." -#: replication/logical/logical.c:444 +#: replication/logical/logical.c:628 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "\"%s\" ì´ë¦„ì˜ ë…¼ë¦¬ì  ë³µì œ ìŠ¬ë¡¯ì„ ë§Œë“œëŠ” 중" -#: replication/logical/logical.c:446 +#: replication/logical/logical.c:630 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "" +"%X/%X ì´í›„ 트랜잭션 커밋 정보를 ìŠ¤íŠ¸ë¦¬ë° í•˜ëŠ” 중, %X/%X 위치부터 WAL ì½ëŠ” 중" -#: replication/logical/logical.c:593 +#: replication/logical/logical.c:778 #, c-format msgid "" "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "" +"슬롯: \"%s\", 출력 플러그ì¸: \"%s\", 해당 콜백함수: %s, 관련 LSN: %X/%X" -#: replication/logical/logical.c:600 +#: replication/logical/logical.c:784 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" -msgstr "" +msgstr "슬롯: \"%s\", 출력 플러그ì¸: \"%s\", 해당 콜백함수: %s" -#: replication/logical/logicalfuncs.c:104 replication/slotfuncs.c:34 +#: replication/logical/logical.c:955 replication/logical/logical.c:1000 +#: replication/logical/logical.c:1045 replication/logical/logical.c:1091 #, c-format -msgid "must be superuser or replication role to use replication slots" -msgstr "" -"복제 ìŠ¬ë¡¯ì€ superuser ë˜ëŠ” replication 롤 ì˜µì…˜ì„ í¬í•¨í•œ 사용ìžë§Œ 사용할 수 있" -"습니다." +msgid "logical replication at prepare time requires a %s callback" +msgstr "준비 ì‹œê°„ì— ë…¼ë¦¬ 복제가 %s ì½œë°±ì„ í•„ìš”ë¡œ 합니다." + +#: replication/logical/logical.c:1323 replication/logical/logical.c:1372 +#: replication/logical/logical.c:1413 replication/logical/logical.c:1499 +#: replication/logical/logical.c:1548 +#, c-format +msgid "logical streaming requires a %s callback" +msgstr "ë…¼ë¦¬ì  ìŠ¤íŠ¸ë¦¬ë°ì´ %s ì½œë°±ì„ í•„ìš”ë¡œ 합니다" + +#: replication/logical/logical.c:1458 +#, c-format +msgid "logical streaming at prepare time requires a %s callback" +msgstr "준비 ì‹œê°„ì— ë…¼ë¦¬ì  ìŠ¤íŠ¸ë¦¬ë°ì´ %s ì½œë°±ì„ í•„ìš”ë¡œ 합니다" -#: replication/logical/logicalfuncs.c:134 +#: replication/logical/logicalfuncs.c:123 #, c-format msgid "slot name must not be null" msgstr "슬롯 ì´ë¦„으로 null ê°’ì„ ì‚¬ìš©í•  수 없습니다" -#: replication/logical/logicalfuncs.c:150 +#: replication/logical/logicalfuncs.c:139 #, c-format msgid "options array must not be null" msgstr "옵션 ë°°ì—´ì€ null ê°’ì„ ì‚¬ìš©í•  수 없습니다." -#: replication/logical/logicalfuncs.c:181 +#: replication/logical/logicalfuncs.c:156 #, c-format msgid "array must be one-dimensional" -msgstr "ë°°ì—´ì€ ì¼ì°¨ì› ë°°ì—´ì´ì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "ë°°ì—´ì€ ì¼ì°¨ì› ë°°ì—´ì´ì–´ì•¼ 합니다" -#: replication/logical/logicalfuncs.c:187 +#: replication/logical/logicalfuncs.c:162 #, c-format msgid "array must not contain nulls" msgstr "ë°°ì—´ì—는 null ê°’ì„ í¬í•¨í•  수 없습니다" -#: replication/logical/logicalfuncs.c:203 utils/adt/json.c:1128 -#: utils/adt/jsonb.c:1303 +#: replication/logical/logicalfuncs.c:177 utils/adt/json.c:1420 +#: utils/adt/jsonb.c:1304 #, c-format msgid "array must have even number of elements" msgstr "ë°°ì—´ì€ ê·¸ ìš”ì†Œì˜ ê°œìˆ˜ê°€ ì§ìˆ˜ì—¬ì•¼ 함" -#: replication/logical/logicalfuncs.c:251 -#, c-format -msgid "can no longer get changes from replication slot \"%s\"" -msgstr "\"%s\" 복제 슬롯ì—서 변경 ì‚¬í•­ì„ ë” ì°¾ì„ ìˆ˜ ì—†ìŒ" - -#: replication/logical/logicalfuncs.c:253 replication/slotfuncs.c:648 -#, c-format -msgid "This slot has never previously reserved WAL, or has been invalidated." -msgstr "ì´ ìŠ¬ë¡¯ì€ í•œ ë²ˆë„ WAL를 예약한 ì ì´ 없거나, ìž˜ëª»ëœ ê²ƒìž„" - -#: replication/logical/logicalfuncs.c:265 +#: replication/logical/logicalfuncs.c:224 #, c-format msgid "" "logical decoding output plugin \"%s\" produces binary output, but function " "\"%s\" expects textual data" msgstr "" -"\"%s\" 논리 복제 출력 플러그ì¸ì€ ì´ì§„ ìžë£Œë¥¼ 출력하지만, \"%s\" 함수는 " -"í…스트 ìžë£Œë¥¼ 사용함" - -#: replication/logical/origin.c:188 -#, c-format -msgid "only superusers can query or manipulate replication origins" -msgstr "슈í¼ìœ ì €ë§Œ 복제 ì›ë³¸ì— 대한 쿼리나, 관리를 í•  수 있습니다." +"\"%s\" 논리 복제 출력 플러그ì¸ì€ ì´ì§„ ìžë£Œë¥¼ 출력하지만, \"%s\" 함수는 í…스" +"트 ìžë£Œë¥¼ 사용함" -#: replication/logical/origin.c:193 +#: replication/logical/origin.c:190 #, c-format msgid "" -"cannot query or manipulate replication origin when max_replication_slots = 0" +"cannot query or manipulate replication origin when \"max_replication_slots\" " +"is 0" msgstr "" +"\"max_replication_slots\" = 0 ìƒí™©ì—서는 복제 ì˜¤ë¦¬ì§„ì„ ì§ˆì˜í•˜ê±°ë‚˜ 관리할 수 ì—†ìŒ" -#: replication/logical/origin.c:198 +#: replication/logical/origin.c:195 #, c-format msgid "cannot manipulate replication origins during recovery" -msgstr "" +msgstr "복구 작업 중ì—는 복제 ì˜¤ë¦¬ì§„ì„ ê´€ë¦¬í•  수 ì—†ìŒ" -#: replication/logical/origin.c:233 +#: replication/logical/origin.c:240 #, c-format msgid "replication origin \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ì˜¤ë¦¬ì§„ì´ ì—†ìŠµë‹ˆë‹¤" -#: replication/logical/origin.c:324 +#: replication/logical/origin.c:331 #, c-format -msgid "could not find free replication origin OID" +msgid "could not find free replication origin ID" msgstr "비어있는 복제 오리진 OID를 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: replication/logical/origin.c:372 +#: replication/logical/origin.c:365 #, c-format -msgid "could not drop replication origin with OID %d, in use by PID %d" -msgstr "" +msgid "could not drop replication origin with ID %d, in use by PID %d" +msgstr "%d IDì˜ ë³µì œ ì˜¤ë¦¬ì§„ì€ ì‚­ì œ ë  ìˆ˜ ì—†ìŒ, %d PIDê°€ 사용중임" -#: replication/logical/origin.c:464 +#: replication/logical/origin.c:492 #, c-format -msgid "replication origin with OID %u does not exist" -msgstr "OID %u 복제 ì˜¤ë¦¬ì§„ì´ ì—†ìŒ" +msgid "replication origin with ID %d does not exist" +msgstr "%d IDì˜ ë³µì œ ì˜¤ë¦¬ì§„ì´ ì—†ìŒ" -#: replication/logical/origin.c:729 +#: replication/logical/origin.c:757 #, c-format msgid "replication checkpoint has wrong magic %u instead of %u" msgstr "복제 ì²´í¬í¬ì¸íŠ¸ì˜ ìž˜ëª»ëœ ë§¤ì§ ë²ˆí˜¸: %u, 기대값: %u" -#: replication/logical/origin.c:770 +#: replication/logical/origin.c:798 #, c-format -msgid "could not find free replication state, increase max_replication_slots" +msgid "" +"could not find free replication state, increase \"max_replication_slots\"" msgstr "" -"사용 가능한 복제 ìŠ¬ë¡¯ì´ ë¶€ì¡±í•©ë‹ˆë‹¤. max_replication_slots ê°’ì„ ëŠ˜ë¦¬ì„¸ìš”" +"사용 가능한 복제 ìŠ¬ë¡¯ì´ ë¶€ì¡±í•©ë‹ˆë‹¤. \"max_replication_slots\" ê°’ì„ ëŠ˜ë¦¬ì„¸ìš”" + +#: replication/logical/origin.c:806 +#, c-format +msgid "recovered replication state of node %d to %X/%X" +msgstr "%d 노드 %X/%X 위치로 복제 ìƒíƒœê°€ 복구ë¨" -#: replication/logical/origin.c:788 +#: replication/logical/origin.c:816 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "복제 슬롯 ì²´í¬í¬ì¸íŠ¸ì˜ ì²´í¬ì„¬ ê°’ì´ ìž˜ëª»ë¨: %u, 기대값 %u" -#: replication/logical/origin.c:916 replication/logical/origin.c:1102 +#: replication/logical/origin.c:944 replication/logical/origin.c:1143 #, c-format -msgid "replication origin with OID %d is already active for PID %d" -msgstr "" +msgid "replication origin with ID %d is already active for PID %d" +msgstr "%d IDì˜ ë³µì œ ì˜¤ë¦¬ì§„ì´ %d PID 프로세스가 사용중입니다." -#: replication/logical/origin.c:927 replication/logical/origin.c:1114 +#: replication/logical/origin.c:955 replication/logical/origin.c:1156 #, c-format msgid "" -"could not find free replication state slot for replication origin with OID %u" -msgstr "%u OID 복제 ì˜¤ë¦¬ì§„ì„ ìœ„í•œ 여유 복제 ìŠ¬ë¡¯ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" +"could not find free replication state slot for replication origin with ID %d" +msgstr "%d ID 복제 ì˜¤ë¦¬ì§„ì„ ìœ„í•œ 여유 복제 ìŠ¬ë¡¯ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: replication/logical/origin.c:929 replication/logical/origin.c:1116 -#: replication/slot.c:1762 +#: replication/logical/origin.c:957 replication/logical/origin.c:1158 +#: replication/slot.c:2384 #, c-format -msgid "Increase max_replication_slots and try again." -msgstr "max_replication_slots ê°’ì„ ëŠ˜ë¦° 후 다시 시ë„í•´ 보세요" +msgid "Increase \"max_replication_slots\" and try again." +msgstr "\"max_replication_slots\" ê°’ì„ ëŠ˜ë¦° 후 다시 시ë„í•´ 보세요" -#: replication/logical/origin.c:1073 +#: replication/logical/origin.c:1114 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "하나가 ì´ë¯¸ 설정ë˜ì–´ ë” ì´ìƒ 복제 오리진 ì„¤ì •ì„ í•  수 ì—†ìŒ" -#: replication/logical/origin.c:1153 replication/logical/origin.c:1369 -#: replication/logical/origin.c:1389 +#: replication/logical/origin.c:1199 replication/logical/origin.c:1415 +#: replication/logical/origin.c:1435 #, c-format msgid "no replication origin is configured" msgstr "복제 오리진 ì„¤ì •ì´ ì—†ìŠµë‹ˆë‹¤" -#: replication/logical/origin.c:1236 +#: replication/logical/origin.c:1285 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "\"%s\" 복제 오리진 ì´ë¦„ì€ ì‚¬ìš©í•  수 ì—†ìŒ" -#: replication/logical/origin.c:1238 +#: replication/logical/origin.c:1287 +#, c-format +msgid "" +"Origin names \"%s\", \"%s\", and names starting with \"pg_\" are reserved." +msgstr "" +"\"%s\", \"%s\", \"pg_\"로 시작하는 오리진 ì´ë¦„ì€ ë¯¸ë¦¬ ì˜ˆì•½ëœ ì´ë¦„입니다." + +#: replication/logical/relation.c:242 #, c-format -msgid "Origin names starting with \"pg_\" are reserved." -msgstr "\"pg_\"로 시작하는 오리진 ì´ë¦„ì€ ì‚¬ìš©í•  수 없습니다." +msgid "\"%s\"" +msgstr "\"%s\"" -#: replication/logical/relation.c:302 +#: replication/logical/relation.c:245 #, c-format -msgid "logical replication target relation \"%s.%s\" does not exist" -msgstr "\"%s.%s\" ì´ë¦„ì˜ ë…¼ë¦¬ 복제 ëŒ€ìƒ ë¦´ë ˆì´ì…˜ì´ 없습니다." +msgid ", \"%s\"" +msgstr ", \"%s\"" -#: replication/logical/relation.c:345 +#: replication/logical/relation.c:251 #, c-format msgid "" -"logical replication target relation \"%s.%s\" is missing some replicated " -"columns" -msgstr "" +"logical replication target relation \"%s.%s\" is missing replicated column: " +"%s" +msgid_plural "" +"logical replication target relation \"%s.%s\" is missing replicated columns: " +"%s" +msgstr[0] "\"%s.%s\" ì´ë¦„ì˜ ë…¼ë¦¬ 복제 ëŒ€ìƒ ë¦´ë ˆì´ì…˜ì— ê´€ë ¨ëœ ì¹¼ëŸ¼ì´ ë¹ ì¡ŒìŒ: %s" -#: replication/logical/relation.c:385 +#: replication/logical/relation.c:306 #, c-format msgid "" "logical replication target relation \"%s.%s\" uses system columns in REPLICA " "IDENTITY index" msgstr "" +"\"%s.%s\" 논리 복제 ëŒ€ìƒ ë¦´ë ˆì´ì…˜ì´ REPLICA IDENTITY ì¸ë±ìФì—서 시스템 칼럼" +"ì„ ì‚¬ìš©í•˜ê³  있습니다." + +#: replication/logical/relation.c:398 +#, c-format +msgid "logical replication target relation \"%s.%s\" does not exist" +msgstr "\"%s.%s\" ì´ë¦„ì˜ ë…¼ë¦¬ 복제 ëŒ€ìƒ ë¦´ë ˆì´ì…˜ì´ 없습니다." -#: replication/logical/reorderbuffer.c:2663 +#: replication/logical/reorderbuffer.c:3999 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "%u XID ë‚´ìš©ì„ ë°ì´í„° 파ì¼ì— 쓸 수 ì—†ìŒ: %m" -#: replication/logical/reorderbuffer.c:2850 -#: replication/logical/reorderbuffer.c:2875 +#: replication/logical/reorderbuffer.c:4345 +#: replication/logical/reorderbuffer.c:4370 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "reorderbuffer 처리용 파ì¼ì—서 ì½ê¸° 실패: %m" -#: replication/logical/reorderbuffer.c:2854 -#: replication/logical/reorderbuffer.c:2879 +#: replication/logical/reorderbuffer.c:4349 +#: replication/logical/reorderbuffer.c:4374 #, c-format msgid "" "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "" "reorderbuffer 처리용 파ì¼ì—서 ì½ê¸° 실패: %d ë°”ì´íЏ ì½ìŒ, 기대값 %u ë°”ì´íЏ" -#: replication/logical/reorderbuffer.c:3114 +#: replication/logical/reorderbuffer.c:4624 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "\"%s\" 파ì¼ì„ 지울 수 ì—†ìŒ, pg_replslot/%s/xid* ì‚­ì œ 작업 중: %m" -#: replication/logical/reorderbuffer.c:3606 +#: replication/logical/reorderbuffer.c:5120 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "\"%s\" 파ì¼ì—서 ì½ê¸° 실패: %d ë°”ì´íЏ ì½ìŒ, 기대값 %d ë°”ì´íЏ" -#: replication/logical/snapbuild.c:606 +#: replication/logical/slotsync.c:215 +#, c-format +msgid "" +"could not synchronize replication slot \"%s\" because remote slot precedes " +"local slot" +msgstr "ì›ê²© ìŠ¬ë¡¯ì´ ë¡œì»¬ 슬롯 보다 ìš°ì„ ì´ì–´ì„œ 복제 슬롯(\"%s\")ì„ ë™ê¸°í™” í•  수 ì—†ìŒ" + +#: replication/logical/slotsync.c:217 +#, c-format +msgid "" +"The remote slot has LSN %X/%X and catalog xmin %u, but the local slot has " +"LSN %X/%X and catalog xmin %u." +msgstr "" +"ì›ê²© 슬롯ì—는 LSN %X/%X, catalog xmin %u ì •ë³´ê°€ 있지만, " +"로컬 ìŠ¬ë¡¯ì€ LSN %X/%X, catalog xmin %u ìƒíƒœìž…니다." + +#: replication/logical/slotsync.c:459 +#, c-format +msgid "dropped replication slot \"%s\" of database with OID %u" +msgstr "\"%s\" 복제 ìŠ¬ë¡¯ì„ %u OID ë°ì´í„°ë² ì´ìФì—서 삭제했ìŒ" + +#: replication/logical/slotsync.c:579 +#, c-format +msgid "could not synchronize replication slot \"%s\"" +msgstr "\"%s\" 복제 ìŠ¬ë¡¯ì„ ë™ê¸°í™” í•  수 ì—†ìŒ" + +#: replication/logical/slotsync.c:580 +#, c-format +msgid "" +"Logical decoding could not find consistent point from local slot's LSN %X/%X." +msgstr "ë…¼ë¦¬ì  ë””ì½”ë”©ì´ ë¡œì»¬ 슬롯 %X/%Xì—서 ì¼ê´€ì„± 위치를 찾지 못함" + +#: replication/logical/slotsync.c:589 +#, c-format +msgid "newly created replication slot \"%s\" is sync-ready now" +msgstr "새롭게 만들어진 \"%s\" 복제 ìŠ¬ë¡¯ì€ ì´ì œ ë™ê¸°í™” 준비 ìƒíƒœìž„" + +#: replication/logical/slotsync.c:628 +#, c-format +msgid "" +"skipping slot synchronization because the received slot sync LSN %X/%X for " +"slot \"%s\" is ahead of the standby position %X/%X" +msgstr "" +"슬롯 ë™ê¸°í™”ê°€ 건너뜀, ìˆ˜ì‹ ëœ ìŠ¬ë¡¯ ë™ê¸°í™” LSNì€ %X/%X(해당 슬롯: \"%s\")ì¸ë° " +"ì´ëŠ” 대기 서버 ìœ„ì¹˜ì¸ %X/%X 보다 앞섭니다." + +#: replication/logical/slotsync.c:650 +#, c-format +msgid "" +"exiting from slot synchronization because same name slot \"%s\" already " +"exists on the standby" +msgstr "" +"\"%s\" ì´ë¦„ì˜ ìŠ¬ë¡¯ì´ ëŒ€ê¸° 서버ì—ë„ ì´ë¯¸ 있어, 슬롯 ë™ê¸°í™” ìž‘ì—…ì´ ì´ë¯¸ 있ìŒ" + +#: replication/logical/slotsync.c:819 +#, c-format +msgid "could not fetch failover logical slots info from the primary server: %s" +msgstr "주 서버ì—서 failover 논리 복제 ìŠ¬ë¡¯ì„ ì°¾ì§€ 못했ìŒ: %s" + +#: replication/logical/slotsync.c:965 +#, c-format +msgid "" +"could not fetch primary_slot_name \"%s\" info from the primary server: %s" +msgstr "주 서버ì—서 \"%s\" primary_slot_nameì„ ì°¾ì§€ 못했ìŒ: %s" + +#: replication/logical/slotsync.c:967 +#, c-format +msgid "Check if primary_slot_name is configured correctly." +msgstr "primary_slot_name ì„¤ì •ê°’ì„ í™•ì¸í•˜ì„¸ìš”." + +#: replication/logical/slotsync.c:987 +#, c-format +msgid "cannot synchronize replication slots from a standby server" +msgstr "대기 서버ì—서 복제 ìŠ¬ë¡¯ì„ ë™ê¸°í™” í•  수 ì—†ìŒ" + +#. translator: second %s is a GUC variable name +#: replication/logical/slotsync.c:996 +#, c-format +msgid "" +"replication slot \"%s\" specified by \"%s\" does not exist on primary server" +msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ 슬롯(\"%s\" ì„¤ì •ì— ì§€ì •ëœ)ì´ ì£¼ ì„œë²„ì— ì—†ìŒ" + +#. translator: first %s is a connection option; second %s is a GUC +#. variable name +#. +#: replication/logical/slotsync.c:1029 +#, c-format +msgid "" +"replication slot synchronization requires \"%s\" to be specified in \"%s\"" +msgstr "" +"복제 슬롯 ë™ê¸°í™”는 \"%s\" ì„¤ì •ì„ í•„ìš”ë¡œ 합니다. 해당 환경 설정 변수: \"%s\"" + +#: replication/logical/slotsync.c:1050 +#, c-format +msgid "replication slot synchronization requires \"wal_level\" >= \"logical\"" +msgstr "복제 슬롯 ë™ê¸°í™”는 \"wal_level\" >= \"logical\" ì„¤ì •ì´ í•„ìš”í•¨" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1063 replication/logical/slotsync.c:1091 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be set" +msgstr "복제 슬롯 ë™ê¸°í™”는 \"%s\" ì„¤ì •ì´ í•„ìš”í•¨" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1077 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be enabled" +msgstr "복제 슬롯 ë™ê¸°í™”는 \"%s\" ì„¤ì •ì´ í™œì„±í™” ë˜ì–´ì•¼ 함" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1129 +#, c-format +msgid "" +"replication slot synchronization worker will shut down because \"%s\" is " +"disabled" +msgstr "" +"\"%s\" ì„¤ì •ì´ ë¹„í™œì„±í™”ë˜ì–´ 복제 슬롯 ë™ê¸°í™” ìž‘ì—…ì´ ì¤‘ì§€ë  ê²ƒìž„" + +#: replication/logical/slotsync.c:1138 +#, c-format +msgid "" +"replication slot synchronization worker will restart because of a parameter " +"change" +msgstr "" +"매개 변수가 바뀌어서 복제 슬롯 ë™ê¸°í™” ìž‘ì—…ì´ ì¤‘ì§€ë  ê²ƒìž„" + +#: replication/logical/slotsync.c:1162 +#, c-format +msgid "" +"replication slot synchronization worker is shutting down on receiving SIGINT" +msgstr "" +"SIGINT 신호를 받아 복제 슬롯 ë™ê¸°í™” 작업ìžë¥¼ 종료함" + +#: replication/logical/slotsync.c:1287 +#, c-format +msgid "cannot synchronize replication slots when standby promotion is ongoing" +msgstr "대기 서버가 주 서버로 전환 중ì´ì—¬ì„œ 복제 슬롯 ë™ê¸°í™”를 í•  수 ì—†ìŒ" + +#: replication/logical/slotsync.c:1295 +#, c-format +msgid "cannot synchronize replication slots concurrently" +msgstr "복제 ìŠ¬ë¡¯ì„ ë™ì‹œì— ë™ê¸°í™” í•  수 ì—†ìŒ" + +#: replication/logical/slotsync.c:1403 +#, c-format +msgid "slot sync worker started" +msgstr "슬롯 ë™ê¸°í™” ìž‘ì—…ìž ì‹œìž‘ë¨" + +#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:900 +#: replication/walreceiver.c:307 +#, c-format +msgid "could not connect to the primary server: %s" +msgstr "주 ì„œë²„ì— ì—°ê²° í•  수 ì—†ìŒ: %s" + +#: replication/logical/snapbuild.c:653 #, c-format msgid "initial slot snapshot too large" msgstr "초기 슬롯 ìŠ¤ëƒ…ìƒ·ì´ ë„ˆë¬´ í½ë‹ˆë‹¤." -#: replication/logical/snapbuild.c:660 +#: replication/logical/snapbuild.c:707 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "" "exported logical decoding snapshot: \"%s\" with %u transaction IDs" msgstr[0] "" +"ì¶”ì¶œëœ ë…¼ë¦¬ 디코딩 스냅샷: \"%s\" 스냅샷, %uê°œ 트랜잭션 ID" -#: replication/logical/snapbuild.c:1265 replication/logical/snapbuild.c:1358 -#: replication/logical/snapbuild.c:1912 +#: replication/logical/snapbuild.c:1404 replication/logical/snapbuild.c:1501 +#: replication/logical/snapbuild.c:2017 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "ë…¼ë¦¬ì  ë””ì½”ë”© ì´ì–´ì„œ 시작할 위치: %X/%X" -#: replication/logical/snapbuild.c:1267 +#: replication/logical/snapbuild.c:1406 #, c-format msgid "There are no running transactions." msgstr "실행할 íŠ¸ëžœìž­ì…˜ì´ ì—†ìŒ" -#: replication/logical/snapbuild.c:1309 +#: replication/logical/snapbuild.c:1453 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "ë…¼ë¦¬ì  ë””ì½”ë”© 시작 위치: %X/%X" -#: replication/logical/snapbuild.c:1311 replication/logical/snapbuild.c:1335 +#: replication/logical/snapbuild.c:1455 replication/logical/snapbuild.c:1479 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." -msgstr "" +msgstr "(대략 %dê°œ) %u 보다 ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ì´ ì¢…ë£Œë˜ê¸¸ 기다리고 있습니다." -#: replication/logical/snapbuild.c:1333 +#: replication/logical/snapbuild.c:1477 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "ë…¼ë¦¬ì  ë””ì½”ë”©ì„ ì´ì–´ì„œ 시작할 위치: %X/%X" -#: replication/logical/snapbuild.c:1360 +#: replication/logical/snapbuild.c:1503 #, c-format msgid "There are no old transactions anymore." msgstr "ë”ì´ìƒ ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ì´ ì—†ìŠµë‹ˆë‹¤." -#: replication/logical/snapbuild.c:1754 +#: replication/logical/snapbuild.c:1904 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "\"%s\" snapbuild ìƒíƒœ 파ì¼ì˜ ë§¤ì§ ë²ˆí˜¸ê°€ ì´ìƒí•¨: 현재값 %u, 기대값 %u" -#: replication/logical/snapbuild.c:1760 +#: replication/logical/snapbuild.c:1910 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "\"%s\" snapbuild ìƒíƒœ 파ì¼ì˜ ë²„ì „ì´ ì´ìƒí•¨: 현재값 %u, 기대값 %u" -#: replication/logical/snapbuild.c:1859 +#: replication/logical/snapbuild.c:1951 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "" +"\"%s\" snapbuild ìƒíƒœ 파ì¼ì˜ ì²´í¬ì„¬ì´ ì¼ì¹˜í•˜ì§€ 않ìŒ: 조회값 %u, 기대값 %u" -#: replication/logical/snapbuild.c:1914 +#: replication/logical/snapbuild.c:2019 #, c-format msgid "Logical decoding will begin using saved snapshot." -msgstr "" +msgstr "ì €ìž¥ëœ ìŠ¤ëƒ…ìƒ·ì„ ì´ìš©í•´ì„œ ë…¼ë¦¬ì  ë””ì½”ë”©ì„ ì‹œìž‘í•  것입니다." -#: replication/logical/snapbuild.c:1986 +#: replication/logical/snapbuild.c:2126 #, c-format msgid "could not parse file name \"%s\"" msgstr "\"%s\" íŒŒì¼ ì´ë¦„ì„ ë¶„ì„í•  수 ì—†ìŒ" -#: replication/logical/tablesync.c:132 +#: replication/logical/tablesync.c:161 #, c-format msgid "" "logical replication table synchronization worker for subscription \"%s\", " "table \"%s\" has finished" +msgstr "\"%s\" 구ë…ìš© 논리 복제 í…Œì´ë¸” ë™ê¸°í™” 작업ìžê°€, \"%s\" í…Œì´ë¸” 완료함" + +#: replication/logical/tablesync.c:641 +#, c-format +msgid "" +"logical replication apply worker for subscription \"%s\" will restart so " +"that two_phase can be enabled" msgstr "" +"two_phase 활성화를 위해 \"%s\" 구ë…ì„ ìœ„í•´ 논리 복제 ì ìš© 작업ìžê°€ 다시 시작" +"ë©ë‹ˆë‹¤." -#: replication/logical/tablesync.c:664 +#: replication/logical/tablesync.c:827 replication/logical/tablesync.c:969 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "\"%s.%s\" í…Œì´ë¸”ìš© í…Œì´ë¸” 정보를 구할 수 없습니다, 해당 발행: %s" -#: replication/logical/tablesync.c:670 +#: replication/logical/tablesync.c:834 #, c-format msgid "table \"%s.%s\" not found on publisher" -msgstr "" +msgstr " \"%s.%s\" í…Œì´ë¸”ì´ ë°œí–‰ ì•ˆì— ì—†ìŠµë‹ˆë‹¤." + +#: replication/logical/tablesync.c:892 +#, c-format +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "\"%s.%s\" í…Œì´ë¸”ìš© 칼럼 ëª©ë¡ ì •ë³´ë¥¼ 구할 수 없습니다, 해당 발행: %s" -#: replication/logical/tablesync.c:704 +#: replication/logical/tablesync.c:1071 #, c-format -msgid "could not fetch table info for table \"%s.%s\": %s" -msgstr "\"%s.%s\" í…Œì´ë¸”ìš© í…Œì´ë¸” 정보를 구할 수 없습니다: %s" +msgid "" +"could not fetch table WHERE clause info for table \"%s.%s\" from publisher: " +"%s" +msgstr "\"%s.%s\" í…Œì´ë¸”ìš© WHERE ì ˆì„ êµ¬í•  수 없습니다, 해당 발행: %s" -#: replication/logical/tablesync.c:791 +#: replication/logical/tablesync.c:1230 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "\"%s.%s\" í…Œì´ë¸”ìš© 초기 ìžë£Œ 복사를 시작할 수 없습니다: %s" -#: replication/logical/tablesync.c:905 +#: replication/logical/tablesync.c:1429 #, c-format -msgid "table copy could not start transaction on publisher" -msgstr "발행 서버ì—서는 í…Œì´ë¸” 복사 íŠ¸ëžœìž­ì…˜ì„ ì‹œìž‘í•  수 ì—†ìŒ" +msgid "table copy could not start transaction on publisher: %s" +msgstr "발행 서버ì—서는 í…Œì´ë¸” 복사 íŠ¸ëžœìž­ì…˜ì„ ì‹œìž‘í•  수 ì—†ìŒ: %s" -#: replication/logical/tablesync.c:927 +#: replication/logical/tablesync.c:1472 #, c-format -msgid "table copy could not finish transaction on publisher" -msgstr "" +msgid "replication origin \"%s\" already exists" +msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ì˜¤ë¦¬ì§„ì´ ì´ë¯¸ 있습니다." -#: replication/logical/worker.c:313 +#: replication/logical/tablesync.c:1505 replication/logical/worker.c:2361 #, c-format msgid "" -"processing remote data for replication target relation \"%s.%s\" column \"%s" -"\", remote type %s, local type %s" +"user \"%s\" cannot replicate into relation with row-level security enabled: " +"\"%s\"" msgstr "" +"\"%s\" 사용ìžëŠ” 로우 수준 보안 활성화 ìƒíƒœì—서 릴레ì´ì…˜ìœ¼ë¡œ 복제할 수 ì—†ìŒ: " +"\"%s\"" + +#: replication/logical/tablesync.c:1518 +#, c-format +msgid "table copy could not finish transaction on publisher: %s" +msgstr "발행 서버ì—서 í…Œì´ë¸” 복사 íŠ¸ëžœìž­ì…˜ì„ ë§ˆì¹  수 ì—†ìŒ: %s" -#: replication/logical/worker.c:552 +#: replication/logical/worker.c:481 #, c-format -msgid "ORIGIN message sent out of order" +msgid "" +"logical replication parallel apply worker for subscription \"%s\" will stop" +msgstr "\"%s\" 구ë…ì„ ìœ„í•œ 논리 복제 병렬 ë°˜ì˜ ìž‘ì—…ìžê°€ 중지ë©ë‹ˆë‹¤." + +#: replication/logical/worker.c:483 +#, c-format +msgid "" +"Cannot handle streamed replication transactions using parallel apply workers " +"until all tables have been synchronized." msgstr "" +"모든 í…Œì´ë¸” ë™ê¸°í™” ë나기 전까지는 병렬 ë°˜ì˜ ìž‘ì—…ìžë¥¼ 사용하는 ìŠ¤íŠ¸ë¦¬ë° ë³µì œ " +"íŠ¸ëžœìž­ì…•ì€ ì²˜ë¦¬í•  수 없습니다." -#: replication/logical/worker.c:702 +#: replication/logical/worker.c:852 replication/logical/worker.c:967 +#, c-format +msgid "incorrect binary data format in logical replication column %d" +msgstr "%d 번째 논리 복제 칼럼 ì•ˆì— ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ ìžë£Œ í˜•ì‹ ë°œê²¬ë¨" + +#: replication/logical/worker.c:2500 #, c-format msgid "" "publisher did not send replica identity column expected by the logical " "replication target relation \"%s.%s\"" msgstr "" +"발행 서버ì—서 \"%s.%s\" 논리 복제 ëŒ€ìƒ ë¦´ë ˆì´ì…˜ì˜ 복제 ì‹ë³„ìž ì¹¼ëŸ¼ì„ ë³´ë‚´ì§€ " +"않았습니다." -#: replication/logical/worker.c:709 +#: replication/logical/worker.c:2507 #, c-format msgid "" "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY " "index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY " "FULL" msgstr "" +"\"%s.%s\" 논리 복제 ëŒ€ìƒ ë¦´ë ˆì´ì…˜ì— REPLICA IDENTITY ì¸ë±ìŠ¤ë„ ì—†ê³ , PRIMARY " +"KEY ë„ ì—†ê³ , 발행 쪽 해당 í…Œì´ë¸”ì— REPLICA IDENTITY FULL ì†ì„± ì¹¼ëŸ¼ë„ ì—†ìŠµë‹ˆ" +"다." -#: replication/logical/worker.c:1394 +#: replication/logical/worker.c:3371 #, c-format -msgid "invalid logical replication message type \"%c\"" -msgstr "ìž˜ëª»ëœ ë…¼ë¦¬ 복제 메시지 형태 \"%c\"" +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "ìž˜ëª»ëœ ë…¼ë¦¬ 복제 메시지 형태 \"??? (%d)\"" -#: replication/logical/worker.c:1537 +#: replication/logical/worker.c:3543 #, c-format msgid "data stream from publisher has ended" -msgstr "" +msgstr "발행 ì„œë²„ë¡œë¶€í„°ì˜ ë°ì´í„° ìŠ¤íŠ¸ë¦¼ì´ ë났습니다" -#: replication/logical/worker.c:1692 +#: replication/logical/worker.c:3697 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "시간 제한으로 논리 복제 작업ìžë¥¼ 중지합니다." -#: replication/logical/worker.c:1837 +#: replication/logical/worker.c:3891 #, c-format msgid "" -"logical replication apply worker for subscription \"%s\" will stop because " -"the subscription was removed" +"logical replication worker for subscription \"%s\" will stop because the " +"subscription was removed" msgstr "" +"\"%s\" 구ë…ì´ ì§€ì›Œì¡Œê¸° 때문ì—, 해당 구ë…ìš© 논리 복제 작업ìžê°€ 중지 ë  ê²ƒìž…ë‹ˆ" +"다." -#: replication/logical/worker.c:1851 +#: replication/logical/worker.c:3905 #, c-format msgid "" -"logical replication apply worker for subscription \"%s\" will stop because " -"the subscription was disabled" +"logical replication worker for subscription \"%s\" will stop because the " +"subscription was disabled" msgstr "" +"\"%s\" 구ë…ì´ ë¹„í™œì„±í™” ë˜ì—ˆê¸° 때문ì—, 해당 구ë…ìš© 논리 복제 작업ìžê°€ 중지 ë  " +"것입니다." -#: replication/logical/worker.c:1865 +#: replication/logical/worker.c:3936 #, c-format msgid "" -"logical replication apply worker for subscription \"%s\" will restart " -"because the connection information was changed" +"logical replication parallel apply worker for subscription \"%s\" will stop " +"because of a parameter change" msgstr "" +"매개 변수가 바뀌어서 \"%s\" 구ë…ì„ ìœ„í•´ 논리 복제 병렬 ë°˜ì˜ ìž‘ì—…ìžê°€ 중지 ë  " +"것입니다." -#: replication/logical/worker.c:1879 +#: replication/logical/worker.c:3940 #, c-format msgid "" -"logical replication apply worker for subscription \"%s\" will restart " -"because subscription was renamed" +"logical replication worker for subscription \"%s\" will restart because of a " +"parameter change" msgstr "" +"매개 변수가 바뀌어서 \"%s\" 구ë…ì„ ìœ„í•´ 논리 복제 작업ìžê°€ 중지 ë  ê²ƒìž…ë‹ˆë‹¤." -#: replication/logical/worker.c:1896 +#: replication/logical/worker.c:3954 #, c-format msgid "" -"logical replication apply worker for subscription \"%s\" will restart " -"because the replication slot name was changed" +"logical replication parallel apply worker for subscription \"%s\" will stop " +"because the subscription owner's superuser privileges have been revoked" msgstr "" +"êµ¬ë… ì†Œìœ ì£¼ì˜ ìŠˆí¼ìœ ì € ê¶Œí•œì´ íšŒìˆ˜ë˜ì–´ \"%s\" 구ë…ìš© 논리 복제 병렬 ë°˜ì˜ " +"작업ìžê°€ 중지 ë  ê²ƒìž„" -#: replication/logical/worker.c:1910 +#: replication/logical/worker.c:3958 #, c-format msgid "" -"logical replication apply worker for subscription \"%s\" will restart " -"because subscription's publications were changed" +"logical replication worker for subscription \"%s\" will restart because the " +"subscription owner's superuser privileges have been revoked" msgstr "" +"êµ¬ë… ì†Œìœ ì£¼ì˜ ìŠˆí¼ìœ ì € ê¶Œí•œì´ íšŒìˆ˜ë˜ì–´ \"%s\" 구ë…ìš© 논리 복제 병렬 ë°˜ì˜ " +"작업ìžê°€ 재실행 ë  ê²ƒìž„" + +#: replication/logical/worker.c:4478 +#, c-format +msgid "subscription has no replication slot set" +msgstr "구ë…ì—서 사용할 복제 슬롯 세트가 없습니다." -#: replication/logical/worker.c:2006 +#: replication/logical/worker.c:4591 #, c-format msgid "" -"logical replication apply worker for subscription %u will not start because " -"the subscription was removed during startup" +"logical replication worker for subscription %u will not start because the " +"subscription was removed during startup" msgstr "" +"해당 구ë…ì´ ì‹œìž‘í•˜ëŠ” ì‚¬ì´ ì§€ì›Œì ¸ì„œ 구ë…번호 %u 번용 논리 복제 작업ìžê°€ ìž‘ë™ë˜" +"ì§€ 못했습니다." -#: replication/logical/worker.c:2018 +#: replication/logical/worker.c:4607 #, c-format msgid "" -"logical replication apply worker for subscription \"%s\" will not start " -"because the subscription was disabled during startup" +"logical replication worker for subscription \"%s\" will not start because " +"the subscription was disabled during startup" msgstr "" +"\"%s\" 구ë…ì´ ì‹œìž‘ë˜ëŠ” ì‚¬ì´ ì§€ì›Œì ¸ì„œ 논리 복제 작업ìžê°€ ìž‘ë™ë˜ì§€ 못했습니다." -#: replication/logical/worker.c:2036 +#: replication/logical/worker.c:4631 #, c-format msgid "" "logical replication table synchronization worker for subscription \"%s\", " "table \"%s\" has started" msgstr "" +"\"%s\" 구ë…, \"%s\" í…Œì´ë¸”ì„ ìœ„í•œ 논리 복제 í…Œì´ë¸” ë™ê¸°í™” 작업ìžê°€ 시작ë˜ì—ˆìе" +"니다." -#: replication/logical/worker.c:2040 +#: replication/logical/worker.c:4636 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" +msgstr "\"%s\" 구ë…ì„ ìœ„í•œ 논리 복제 ë°˜ì˜ ìž‘ì—…ìžê°€ 시작ë˜ì—ˆìŠµë‹ˆë‹¤." + +#: replication/logical/worker.c:4758 +#, c-format +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "\"%s\" 구ë…ì´ ì˜¤ë¥˜ë¡œ 비활성화 ë˜ì—ˆìŠµë‹ˆë‹¤." + +#: replication/logical/worker.c:4806 +#, c-format +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "%X/%X LSN ì—서 트랜잭션 건너 ë›°ì–´ 논리 복제를 시작함" + +#: replication/logical/worker.c:4820 +#, c-format +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "논리 복제가 %X/%X LSN까지 íŠ¸ëžœìž­ì…˜ì„ ê±´ë„ˆë›°ì—ˆìŠµë‹ˆë‹¤." + +#: replication/logical/worker.c:4902 +#, c-format +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "\"%s\" ì´ë¦„ì˜ êµ¬ë…ì˜ LSN 건너뛰기 완료함" + +#: replication/logical/worker.c:4903 +#, c-format +msgid "" +"Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN " +"%X/%X." +msgstr "ì›ë ¥ 트랜잭션 마침 WAL 위치 %X/%X LSNì´ skip-LSN %X/%X와 같지 않ìŒ" + +#: replication/logical/worker.c:4940 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\"" msgstr "" +"\"%s\" 복제 오리진용 ì›ê²© ë°ì´í„°ë¥¼ 처리합니다. 해당 메시지 유형: \"%s\"" -#: replication/logical/worker.c:2079 +#: replication/logical/worker.c:4944 #, c-format -msgid "subscription has no replication slot set" +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\" in transaction %u" +msgstr "" +"\"%s\" 복제 오리진용 ì›ê²© ë°ì´í„°ë¥¼ 처리합니다. 해당 메시지 유형: \"%s\", í•´" +"당 트랜잭션: %u" + +#: replication/logical/worker.c:4949 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\" in transaction %u, finished at %X/%X" +msgstr "" +"\"%s\" 복제 오리진용 ì›ê²© ë°ì´í„°ë¥¼ 처리합니다. 해당 메시지 유형: \"%s\", í•´" +"당 트랜잭션: %u, 마침 위치: %X/%X" + +#: replication/logical/worker.c:4960 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\" for replication target relation \"%s.%s\" in transaction %u" +msgstr "" +"\"%s\" 복제 오리진용 ì›ê²© ë°ì´í„°ë¥¼ 처리합니다. 해당 메시지 유형: \"%s\", í•´" +"당 복제 ëŒ€ìƒ ë¦´ë ˆì´ì…˜: \"%s.%s\", 해당 트랜잭션: %u" + +#: replication/logical/worker.c:4967 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\" for replication target relation \"%s.%s\" in transaction %u, finished " +"at %X/%X" +msgstr "" +"\"%s\" 복제 오리진용 ì›ê²© ë°ì´í„°ë¥¼ 처리합니다. 해당 메시지 유형: \"%s\", í•´" +"당 복제 ëŒ€ìƒ ë¦´ë ˆì´ì…˜: \"%s.%s\", 해당 트랜잭션: %u, 마침 위치: %X/%X" + +#: replication/logical/worker.c:4978 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\" for replication target relation \"%s.%s\" column \"%s\" in " +"transaction %u" +msgstr "" +"\"%s\" 복제 오리진용 ì›ê²© ë°ì´í„°ë¥¼ 처리합니다. 해당 메시지 유형: \"%s\", í•´" +"당 복제 ëŒ€ìƒ ë¦´ë ˆì´ì…˜: \"%s.%s\", 해당 칼럼 \"%s\", 해당 트랜잭션: %u" + +#: replication/logical/worker.c:4986 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\" for replication target relation \"%s.%s\" column \"%s\" in " +"transaction %u, finished at %X/%X" msgstr "" +"\"%s\" 복제 오리진용 ì›ê²© ë°ì´í„°ë¥¼ 처리합니다. 해당 메시지 유형: \"%s\", í•´" +"당 복제 ëŒ€ìƒ ë¦´ë ˆì´ì…˜: \"%s.%s\", 해당 칼럼 \"%s\", 해당 트랜잭션: %u, 마침 " +"위치: %X/%X" -#: replication/pgoutput/pgoutput.c:147 +#: replication/pgoutput/pgoutput.c:322 #, c-format msgid "invalid proto_version" msgstr "ìž˜ëª»ëœ proto_version" -#: replication/pgoutput/pgoutput.c:152 +#: replication/pgoutput/pgoutput.c:327 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_verson \"%s\" 범위 벗어남" -#: replication/pgoutput/pgoutput.c:169 +#: replication/pgoutput/pgoutput.c:344 #, c-format msgid "invalid publication_names syntax" msgstr "ìž˜ëª»ëœ publication_names 구문" -#: replication/pgoutput/pgoutput.c:211 +#: replication/pgoutput/pgoutput.c:414 replication/pgoutput/pgoutput.c:418 +#, c-format +msgid "option \"%s\" missing" +msgstr "\"%s\" 옵션 빠졌ìŒ" + +#: replication/pgoutput/pgoutput.c:478 #, c-format -msgid "client sent proto_version=%d but we only support protocol %d or lower" +msgid "" +"client sent proto_version=%d but server only supports protocol %d or lower" +msgstr "" +"í´ë¼ì´ì–¸íŠ¸ê°€ proto_version=%d ê°’ì„ ë³´ëƒˆì§€ë§Œ, %d 버전 ë˜ëŠ” ê·¸ ì´í•˜ 버전 프로토" +"콜만 ì§€ì›í•©ë‹ˆë‹¤." + +#: replication/pgoutput/pgoutput.c:484 +#, c-format +msgid "" +"client sent proto_version=%d but server only supports protocol %d or higher" +msgstr "" +"í´ë¼ì´ì–¸íŠ¸ê°€ proto_version=%d ê°’ì„ ë³´ëƒˆì§€ë§Œ, %d 버전 ë˜ëŠ” ê·¸ ì´ìƒ 버전 프로토" +"콜만 ì§€ì›í•©ë‹ˆë‹¤." + +#: replication/pgoutput/pgoutput.c:499 +#, c-format +msgid "" +"requested proto_version=%d does not support streaming, need %d or higher" +msgstr "" +"요청한 %d 버전 proto_versionì€ ìŠ¤íŠ¸ë¦¬ë°ì„ ì§€ì›í•˜ì§€ 않습니다. %d ë˜ëŠ” ê·¸ ì´ìƒ " +"ë²„ì „ì´ í•„ìš”í•©ë‹ˆë‹¤." + +#: replication/pgoutput/pgoutput.c:505 +#, c-format +msgid "" +"requested proto_version=%d does not support parallel streaming, need %d or " +"higher" msgstr "" +"요청한 proto_version=%d ê°’ì€ ìŠ¤íŠ¸ë¦¬ë°ì„ ì§€ì›í•˜ì§€ 않습니다. %d ë˜ëŠ” ê·¸ ì´ìƒ 버" +"ì „ì´ í•„ìš”í•©ë‹ˆë‹¤." + +#: replication/pgoutput/pgoutput.c:510 +#, c-format +msgid "streaming requested, but not supported by output plugin" +msgstr "스트리ë°ì„ 요청했지만, 출력 플러그ì¸ì´ ì§€ì›í•˜ì§€ 않습니다." -#: replication/pgoutput/pgoutput.c:217 +#: replication/pgoutput/pgoutput.c:524 #, c-format -msgid "client sent proto_version=%d but we only support protocol %d or higher" +msgid "" +"requested proto_version=%d does not support two-phase commit, need %d or " +"higher" msgstr "" +"요청한 proto_version=%d ê°’ì€ 2PC를 ì§€ì›í•˜ì§€ 않습니다. %d ë˜ëŠ” ê·¸ ì´ìƒ ë²„ì „ì´ " +"필요합니다." -#: replication/pgoutput/pgoutput.c:223 +#: replication/pgoutput/pgoutput.c:529 #, c-format -msgid "publication_names parameter missing" -msgstr "publication_names 매개 변수가 빠졌ìŒ" +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "2PC를 요청했지만, 출력 플러그ì¸ì´ ì§€ì›í•˜ì§€ 않습니다." -#: replication/slot.c:183 +#: replication/slot.c:260 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "\"%s\" 복제 슬롯 ì´ë¦„ì´ ë„ˆë¬´ ì§§ìŒ" -#: replication/slot.c:192 +#: replication/slot.c:269 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "\"%s\" 복제 슬롯 ì´ë¦„ì´ ë„ˆë¬´ 긺" -#: replication/slot.c:205 +#: replication/slot.c:282 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "\"%s\" 복제 슬롯 ì´ë¦„ì— ì‚¬ìš©í•  수 없는 문ìžê°€ 있ìŒ" -#: replication/slot.c:207 +#: replication/slot.c:284 #, c-format msgid "" "Replication slot names may only contain lower case letters, numbers, and the " @@ -19822,161 +22910,314 @@ msgstr "" "복제 슬롯 ì´ë¦„으로 사용할 수 있는 문ìžëŠ” ì˜ë¬¸ 소문ìž, 숫ìž, 밑줄(_) 문ìžìž…니" "다." -#: replication/slot.c:254 +#: replication/slot.c:333 +#, c-format +msgid "cannot enable failover for a replication slot created on the standby" +msgstr "대기 서버ì—서 만들어진 복제 슬롯ì—는 failover ì„¤ì •ì„ í™œì„±í™” í•  수 ì—†ìŒ" + +#: replication/slot.c:345 replication/slot.c:849 +#, c-format +msgid "cannot enable failover for a temporary replication slot" +msgstr "임시 복제 슬롯ì—는 failover ì„¤ì •ì„ í™œì„±í™” í•  수 ì—†ìŒ" + +#: replication/slot.c:370 #, c-format msgid "replication slot \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì´ ì´ë¯¸ 있습니다." -#: replication/slot.c:264 +#: replication/slot.c:380 #, c-format msgid "all replication slots are in use" msgstr "모든 복제 ìŠ¬ë¡¯ì´ ì‚¬ìš© 중입니다." -#: replication/slot.c:265 +#: replication/slot.c:381 #, c-format -msgid "Free one or increase max_replication_slots." -msgstr "하나를 비우든지, max_replication_slots ì„¤ì •ê°’ì„ ëŠ˜ë¦¬ì„¸ìš”." +msgid "Free one or increase \"max_replication_slots\"." +msgstr "하나를 비우든지, \"max_replication_slots\" ì„¤ì •ê°’ì„ ëŠ˜ë¦¬ì„¸ìš”." -#: replication/slot.c:407 replication/slotfuncs.c:760 +#: replication/slot.c:560 replication/slot.c:2450 replication/slotfuncs.c:661 +#: utils/activity/pgstat_replslot.c:56 utils/adt/genfile.c:728 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì´ ì—†ìŠµë‹ˆë‹¤" -#: replication/slot.c:445 replication/slot.c:1006 +#: replication/slot.c:606 replication/slot.c:1337 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ %d PID 프로세스가 사용중입니다." -#: replication/slot.c:683 replication/slot.c:1314 replication/slot.c:1697 +#: replication/slot.c:638 +#, c-format +msgid "acquired logical replication slot \"%s\"" +msgstr "\"%s\" 논리 복제 ìŠ¬ë¡¯ì„ íšë“함" + +#: replication/slot.c:640 +#, c-format +msgid "acquired physical replication slot \"%s\"" +msgstr "\"%s\" 물리 복제 ìŠ¬ë¡¯ì„ íšë“함" + +#: replication/slot.c:729 +#, c-format +msgid "released logical replication slot \"%s\"" +msgstr "\"%s\" 논리 복제 ìŠ¬ë¡¯ì„ ë°˜í™˜í•¨" + +#: replication/slot.c:731 +#, c-format +msgid "released physical replication slot \"%s\"" +msgstr "\"%s\" 물리 복제 ìŠ¬ë¡¯ì„ ë°˜í™˜í•¨" + +#: replication/slot.c:797 +#, c-format +msgid "cannot drop replication slot \"%s\"" +msgstr "\"%s\" 복제 ìŠ¬ë¡¯ì„ ì‚­ì œí•  수 ì—†ìŒ" + +#: replication/slot.c:816 +#, c-format +msgid "cannot use %s with a physical replication slot" +msgstr "물리 복제 슬롯과 함께 %s 사용할 수 ì—†ìŒ" + +#: replication/slot.c:828 +#, c-format +msgid "cannot alter replication slot \"%s\"" +msgstr "\"%s\" 복제 ìŠ¬ë¡¯ì„ ë³€ê²½ í•  수 ì—†ìŒ" + +#: replication/slot.c:838 +#, c-format +msgid "cannot enable failover for a replication slot on the standby" +msgstr "대기 ì„œë²„ì˜ ë³µì œ 슬롯ì—는 failover ì„¤ì •ì„ í™œì„±í™” í•  수 ì—†ìŒ" + +#: replication/slot.c:969 replication/slot.c:1927 replication/slot.c:2311 #, c-format msgid "could not remove directory \"%s\"" msgstr "\"%s\" 디렉터리를 삭제할 수 ì—†ìŒ" -#: replication/slot.c:1041 +#: replication/slot.c:1372 #, c-format -msgid "replication slots can only be used if max_replication_slots > 0" -msgstr "복제 ìŠ¬ë¡¯ì€ max_replication_slots > 0 ìƒíƒœì—서 ì‚¬ìš©ë  ìˆ˜ 있습니다." +msgid "replication slots can only be used if \"max_replication_slots\" > 0" +msgstr "복제 ìŠ¬ë¡¯ì€ \"max_replication_slots\" > 0 ìƒíƒœì—서만 사용할 수 있ìŒ" -#: replication/slot.c:1046 +#: replication/slot.c:1377 #, c-format -msgid "replication slots can only be used if wal_level >= replica" -msgstr "복제 ìŠ¬ë¡¯ì€ wal_level >= replica ìƒíƒœì—서 ì‚¬ìš©ë  ìˆ˜ 있습니다." +msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" +msgstr "복제 ìŠ¬ë¡¯ì€ \"wal_level\" >= \"replica\" ìƒíƒœì—서만 사용할 수 있ìŒ" -#: replication/slot.c:1202 +#: replication/slot.c:1389 #, c-format -msgid "" -"terminating process %d because replication slot \"%s\" is too far behind" -msgstr "%d번 프로세스를 중지합니다. \"%s\" 복제 ìŠ¬ë¡¯ì´ ë„ˆë¬´ 옛날 것입니다." +msgid "permission denied to use replication slots" +msgstr "복제 ìŠ¬ë¡¯ì„ ì‚¬ìš©í•  권한 ì—†ìŒ" + +#: replication/slot.c:1390 +#, c-format +msgid "Only roles with the %s attribute may use replication slots." +msgstr "복제 ìŠ¬ë¡¯ì€ %s ì†ì„±ì„ 가진 롤만 사용할 수 있습니다." + +#: replication/slot.c:1498 +#, c-format +msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu byte." +msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." +msgstr[0] "" +"해당 슬롯 restart_lsn %X/%X ê°’ì€ %llu ë°”ì´íŠ¸ë¡œ ê·¸ í¬ê¸°ë¥¼ 초과했습니다." -#: replication/slot.c:1221 +#: replication/slot.c:1506 #, c-format +msgid "The slot conflicted with xid horizon %u." +msgstr "해당 ìŠ¬ë¡¯ì´ xid horizon %u 값으로 ì¶©ëŒí•©ë‹ˆë‹¤." + +#: replication/slot.c:1511 msgid "" -"invalidating slot \"%s\" because its restart_lsn %X/%X exceeds " -"max_slot_wal_keep_size" +"Logical decoding on standby requires \"wal_level\" >= \"logical\" on the " +"primary server." msgstr "" -"\"%s\" ìŠ¬ë¡¯ì´ ë°”ë¥´ì§€ 않ìŒ. %X/%X restart_lsn ê°’ì´ " -"max_slot_wal_keep_size ê°’ì„ ì´ˆê³¼í–ˆìŒ" +"대기 ì„œë²„ì˜ ë…¼ë¦¬ì  ë””ì½”ë”© ê¸°ëŠ¥ì€ ì£¼ì„œë²„ì˜ \"wal_level\" >= \"logical\" ì„¤ì •ì´ í•„ìš”í•©" +"니다." + +#: replication/slot.c:1519 +#, c-format +msgid "terminating process %d to release replication slot \"%s\"" +msgstr "%d번 프로세스를 중지합니다. \"%s\" 복제 ìŠ¬ë¡¯ì´ ì‚­ì œë  ê²ƒìž…ë‹ˆë‹¤." + +#: replication/slot.c:1521 +#, c-format +msgid "invalidating obsolete replication slot \"%s\"" +msgstr "\"%s\" 복제 ìŠ¬ë¡¯ì´ ì‚¬ìš©ë˜ì§€ 않아 ì‚­ì œë  ê²ƒìž…ë‹ˆë‹¤." -#: replication/slot.c:1635 +#: replication/slot.c:2249 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "\"%s\" 복제 슬롯 파ì¼ì˜ ë§¤ì§ ë²ˆí˜¸ê°€ ì´ìƒí•©ë‹ˆë‹¤: 현재값 %u, 기대값 %u" -#: replication/slot.c:1642 +#: replication/slot.c:2256 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "\"%s\" 복제 슬롯 파ì¼ì€ ì§€ì›í•˜ì§€ 않는 %u 버전 파ì¼ìž…니다" -#: replication/slot.c:1649 +#: replication/slot.c:2263 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "\"%s\" 복제 슬롯 파ì¼ì´ %u 길ì´ë¡œ ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤." -#: replication/slot.c:1685 +#: replication/slot.c:2299 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "\"%s\" 복제 슬롯 파ì¼ì˜ ì²´í¬ì„¬ ê°’ì´ ì´ìƒí•©ë‹ˆë‹¤: 현재값 %u, 기대값 %u" -#: replication/slot.c:1719 +#: replication/slot.c:2333 #, c-format -msgid "logical replication slot \"%s\" exists, but wal_level < logical" -msgstr "\"%s\" 논리 복제 ìŠ¬ë¡¯ì´ ìžˆì§€ë§Œ, wal_level < logical" +msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" +msgstr "\"%s\" 논리 복제 ìŠ¬ë¡¯ì´ ìžˆì§€ë§Œ, \"wal_level\" < \"logical\" 설정임" -#: replication/slot.c:1721 +#: replication/slot.c:2335 #, c-format -msgid "Change wal_level to be logical or higher." -msgstr "" +msgid "Change \"wal_level\" to be \"logical\" or higher." +msgstr "\"wal_level\" ê°’ì„ \"logical\" ë˜ëŠ” ê·¸ ì´ìƒìœ¼ë¡œ 지정하세요." -#: replication/slot.c:1725 +#: replication/slot.c:2339 #, c-format -msgid "physical replication slot \"%s\" exists, but wal_level < replica" -msgstr "\"%s\" 물리 복제 ìŠ¬ë¡¯ì´ ìžˆì§€ë§Œ, wal_level < replica " +msgid "" +"physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" +msgstr "\"%s\" 물리 복제 ìŠ¬ë¡¯ì´ ìžˆì§€ë§Œ, \"wal_level\" < \"replica\" 설정임" -#: replication/slot.c:1727 +#: replication/slot.c:2341 #, c-format -msgid "Change wal_level to be replica or higher." -msgstr "" +msgid "Change \"wal_level\" to be \"replica\" or higher." +msgstr "\"wal_level\" ê°’ì„ \"replica\" ë˜ëŠ” ê·¸ ì´ìƒìœ¼ë¡œ 지정하세요." -#: replication/slot.c:1761 +#: replication/slot.c:2383 #, c-format msgid "too many replication slots active before shutdown" msgstr "서버 중지 ì „ì— ë„ˆë¬´ ë§Žì€ ë³µì œ ìŠ¬ë¡¯ì´ í™œì„±í™” ìƒíƒœìž…니다" -#: replication/slotfuncs.c:624 +#: replication/slot.c:2458 +#, c-format +msgid "\"%s\" is not a physical replication slot" +msgstr "\"%s\" ìŠ¬ë¡¯ì€ ë¬¼ë¦¬ 복제 ìŠ¬ë¡¯ì´ ì•„ë‹˜" + +#: replication/slot.c:2635 +#, c-format +msgid "replication slot \"%s\" specified in parameter \"%s\" does not exist" +msgstr "\"%s\" 복제 슬롯ì—는 \"%s\" 매개 변수 ì„¤ì •ì´ ì—†ìŒ" + +#: replication/slot.c:2637 replication/slot.c:2671 replication/slot.c:2686 +#, c-format +msgid "" +"Logical replication is waiting on the standby associated with replication " +"slot \"%s\"." +msgstr "논리 복제가 \"%s\" 복제 슬롯과 ì—°ê²°ëœ ëŒ€ê¸° 서버ì—서 대기 중" + +#: replication/slot.c:2639 +#, c-format +msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." +msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ ë§Œë“¤ë“ ê°€, \"%s\" ì„¤ì •ì„ ë°”ê¾¸ì„¸ìš”." + +#: replication/slot.c:2649 +#, c-format +msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" +msgstr "\"%s\" 논리 복제 ìŠ¬ë¡¯ì„ \"%s\" ì„¤ì •ì— ì§€ì •í•  수 ì—†ìŒ" + +#: replication/slot.c:2651 +#, c-format +msgid "" +"Logical replication is waiting for correction on replication slot \"%s\"." +msgstr "논리 복제가 \"%s\" 복제 슬롯 ìˆ˜ì •ì„ ê¸°ë‹¤ë¦¬ê³  있습니다." + +#: replication/slot.c:2653 +#, c-format +msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." +msgstr "\"%s\" 논리 복제 ìŠ¬ë¡¯ì„ \"%s\" 설정ì—서 빼세요." + +#: replication/slot.c:2669 +#, c-format +msgid "" +"physical replication slot \"%s\" specified in parameter \"%s\" has been " +"invalidated" +msgstr "\"%s\" 물리 복제 ìŠ¬ë¡¯ì´ \"%s\" 설정ì—서 invalid ìƒíƒœê°€ ë˜ì—ˆìŒ" + +#: replication/slot.c:2673 +#, c-format +msgid "" +"Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." +msgstr "\"%s\" 복제 ìŠ¬ë¡¯ì„ ì‚­ì œí•˜ê³  다시 만들거나, \"%s\" ì„¤ì •ì„ ë°”ê¾¸ì„¸ìš”." + +#: replication/slot.c:2684 +#, c-format +msgid "" +"replication slot \"%s\" specified in parameter \"%s\" does not have " +"active_pid" +msgstr "\"%s\" 복제 슬롯(\"%s\" ì„¤ì •ì— ì§€ì •ëœ)ì— ëŒ€ì‘하는 active_pidê°€ ì—†ìŒ" + +#: replication/slot.c:2688 +#, c-format +msgid "" +"Start the standby associated with the replication slot \"%s\", or amend " +"parameter \"%s\"." +msgstr "\"%s\" 복제 슬롯과 ê´€ê³„ëœ ëŒ€ê¸° 서버를 시작하거나, \"%s\" ì„¤ì •ì„ ë°”ê¾¸ì„¸ìš”." + +#: replication/slotfuncs.c:526 #, c-format msgid "invalid target WAL LSN" msgstr "ìž˜ëª»ëœ ëŒ€ìƒ WAL LSN" -#: replication/slotfuncs.c:646 +#: replication/slotfuncs.c:548 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì€ ì‚¬ìš©í•  수 ì—†ìŒ" -#: replication/slotfuncs.c:664 +#: replication/slotfuncs.c:550 +#, c-format +msgid "" +"This slot has never previously reserved WAL, or it has been invalidated." +msgstr "ì´ ìŠ¬ë¡¯ì€ í•œ ë²ˆë„ WAL를 예약한 ì ì´ 없거나, ìž˜ëª»ëœ ê²ƒìž„" + +#: replication/slotfuncs.c:566 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" -msgstr "" +msgstr "복제 슬롯 위치를 %X/%X 로 바꿀 수 없습니다. ìµœì†Œê°’ì€ %X/%X" -#: replication/slotfuncs.c:772 +#: replication/slotfuncs.c:673 #, c-format msgid "" "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "물리 복제 슬롯(\"%s\")ì„ ë…¼ë¦¬ 복제 슬롯으로 복사할 수 ì—†ìŒ" -#: replication/slotfuncs.c:774 +#: replication/slotfuncs.c:675 #, c-format msgid "" "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "논리 복제 슬롯(\"%s\")ì„ ë¬¼ë¦¬ 복제 슬롯으로 복사할 수 ì—†ìŒ" -#: replication/slotfuncs.c:781 +#: replication/slotfuncs.c:682 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "WALì„ í™•ë³´í•˜ì§€ ì•Šì€ ë³µì œ ìŠ¬ë¡¯ì€ ë³µì‚¬í•  수 ì—†ìŒ" -#: replication/slotfuncs.c:857 +#: replication/slotfuncs.c:768 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "\"%s\" 복제 ìŠ¬ë¡¯ì„ ë³µì‚¬í•  수 ì—†ìŒ" -#: replication/slotfuncs.c:859 +#: replication/slotfuncs.c:770 #, c-format msgid "" "The source replication slot was modified incompatibly during the copy " "operation." -msgstr "" +msgstr "복사 작업 중 ì›ë³¸ 복제 ìŠ¬ë¡¯ì´ ë¹„ì •ìƒì ìœ¼ë¡œ 변경ë˜ì—ˆìŠµë‹ˆë‹¤." -#: replication/slotfuncs.c:865 +#: replication/slotfuncs.c:776 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "논리 복제가 ë나지 ì•Šì€ \"%s\" ìŠ¬ë¡¯ì€ ë³µì‚¬í•  수 ì—†ìŒ" -#: replication/slotfuncs.c:867 +#: replication/slotfuncs.c:778 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." -msgstr "" +msgstr "ì›ë³¸ 복제 ìŠ¬ë¡¯ì˜ confirmed_flush_lsn ê°’ì´ íƒ€ë‹¹í•  때 다시 시ë„하세요." + +#: replication/slotfuncs.c:877 +#, c-format +msgid "replication slots can only be synchronized to a standby server" +msgstr "복제 ìŠ¬ë¡¯ì€ ëŒ€ê¸° 서버ì—ë§Œ ë™ê¸°í™” ë  ìˆ˜ 있ìŒ" -#: replication/syncrep.c:257 +#: replication/syncrep.c:261 #, c-format msgid "" "canceling the wait for synchronous replication and terminating connection " @@ -19984,7 +23225,7 @@ msgid "" msgstr "" "ê´€ë¦¬ìž ëª…ë ¹ì— ì˜í•´ ë™ê¸°ì‹ ë³µì œì˜ ëŒ€ê¸° 작업과 ì ‘ì† ëŠê¸° ìž‘ì—…ì„ ì·¨ì†Œí•©ë‹ˆë‹¤." -#: replication/syncrep.c:258 replication/syncrep.c:275 +#: replication/syncrep.c:262 replication/syncrep.c:279 #, c-format msgid "" "The transaction has already committed locally, but might not have been " @@ -19993,209 +23234,204 @@ msgstr "" "주 서버ì—서는 ì´ íŠ¸ëžœìž­ì…˜ì´ ì»¤ë°‹ë˜ì—ˆì§€ë§Œ, 복제용 대기 서버ì—서는 ì•„ì§ ì»¤ë°‹ ë˜" "ì§€ ì•Šì•˜ì„ ê°€ëŠ¥ì„±ì´ ìžˆìŠµë‹ˆë‹¤." -#: replication/syncrep.c:274 +#: replication/syncrep.c:278 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "ì‚¬ìš©ìž ìš”ì²­ì— ì˜í•´ ë™ê¸°ì‹ 복제 ìž‘ì—…ì„ ì·¨ì†Œí•©ë‹ˆë‹¤." -#: replication/syncrep.c:416 +#: replication/syncrep.c:485 #, c-format -msgid "standby \"%s\" now has synchronous standby priority %u" -msgstr "\"%s\" 대기 ì„œë²„ì˜ ë™ê¸°ì‹ 복제 우선순위가 %u 입니다" +msgid "standby \"%s\" is now a synchronous standby with priority %d" +msgstr "\"%s\" 대기 ì„œë²„ì˜ ë™ê¸°ì‹ 복제 우선순위가 %d 순위로 변경ë˜ì—ˆìŒ" -#: replication/syncrep.c:483 -#, c-format -msgid "standby \"%s\" is now a synchronous standby with priority %u" -msgstr "\"%s\" 대기 ì„œë²„ì˜ ë™ê¸°ì‹ 복제 우선순위가 %u 로 변경ë˜ì—ˆìŠµë‹ˆë‹¤." - -#: replication/syncrep.c:487 +#: replication/syncrep.c:489 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "\"%s\" 대기 서버가 ë™ê¸°ì‹ 대기 서버 후보가 ë˜ì—ˆìŠµë‹ˆë‹¤" -#: replication/syncrep.c:1034 +#: replication/syncrep.c:1013 #, c-format -msgid "synchronous_standby_names parser failed" -msgstr "synchronous_standby_names ê°’ì„ ë¶„ì„í•  수 ì—†ìŒ" +msgid "\"synchronous_standby_names\" parser failed" +msgstr "\"synchronous_standby_names\" ê°’ì„ ë¶„ì„í•  수 ì—†ìŒ" -#: replication/syncrep.c:1040 +#: replication/syncrep.c:1019 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "ë™ê¸°ì‹ 대기 서버 수 (%d)는 0보다 커야 합니다." -#: replication/walreceiver.c:171 +#: replication/walreceiver.c:176 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "ê´€ë¦¬ìž ëª…ë ¹ìœ¼ë¡œ ì¸í•´ WAL 수신기를 종료합니다." -#: replication/walreceiver.c:297 -#, c-format -msgid "could not connect to the primary server: %s" -msgstr "주 ì„œë²„ì— ì—°ê²° í•  수 ì—†ìŒ: %s" - -#: replication/walreceiver.c:343 +#: replication/walreceiver.c:354 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "ë°ì´í„°ë² ì´ìФ 시스템 ì‹ë³„번호가 주 서버와 대기 서버가 서로 다름" -#: replication/walreceiver.c:344 +#: replication/walreceiver.c:355 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "주 서버: %s, 대기 서버: %s." -#: replication/walreceiver.c:354 +#: replication/walreceiver.c:366 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "" "주 ì„œë²„ì˜ ì œì¼ ìµœì‹ ì˜ íƒ€ìž„ë¼ì¸ì€ %u ì¸ë°, 복구 타임ë¼ì¸ %u 보다 옛것입니다" -#: replication/walreceiver.c:408 +#: replication/walreceiver.c:419 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "주 ì„œë²„ì˜ WAL ìŠ¤íŠ¸ë¦¬ë° ì‹œìž‘ 위치: %X/%X (타임ë¼ì¸ %u)" -#: replication/walreceiver.c:413 +#: replication/walreceiver.c:423 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "WAL ìŠ¤íŠ¸ë¦¬ë° ìž¬ì‹œìž‘ 위치: %X/%X (타임ë¼ì¸ %u)" -#: replication/walreceiver.c:442 +#: replication/walreceiver.c:458 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "WAL ìŠ¤íŠ¸ë¦¬ë° ê³„ì†í•  수 ì—†ìŒ, 복구가 ì´ë¯¸ 종료ë¨" -#: replication/walreceiver.c:479 +#: replication/walreceiver.c:502 #, c-format msgid "replication terminated by primary server" msgstr "주 ì„œë²„ì— ì˜í•´ì„œ 복제가 ë남" -#: replication/walreceiver.c:480 +#: replication/walreceiver.c:503 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "타임ë¼ì¸ %u, 위치 %X/%X ì—서 WAL ëì— ë„달함" -#: replication/walreceiver.c:568 +#: replication/walreceiver.c:593 #, c-format msgid "terminating walreceiver due to timeout" msgstr "시간 제한으로 wal 수신기를 중지합니다." -#: replication/walreceiver.c:606 +#: replication/walreceiver.c:625 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "주 서버ì—는 요청 ë°›ì€ %u 타임ë¼ì¸ì˜ WALê°€ ë” ì´ìƒ 없습니다." -#: replication/walreceiver.c:622 replication/walreceiver.c:938 +#: replication/walreceiver.c:641 replication/walreceiver.c:1071 #, c-format -msgid "could not close log segment %s: %m" -msgstr "%s 로그 ì¡°ê° íŒŒì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" +msgid "could not close WAL segment %s: %m" +msgstr "%s WAL ì¡°ê° íŒŒì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: replication/walreceiver.c:742 +#: replication/walreceiver.c:760 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "주 서버ì—서 %u 타임ë¼ì¸ìš© 타임ë¼ì¸ ë‚´ì—­ 파ì¼ì„ 가져옵니다." -#: replication/walreceiver.c:985 +#: replication/walreceiver.c:959 #, c-format -msgid "could not write to log segment %s at offset %u, length %lu: %m" -msgstr "%s 로그 ì¡°ê° íŒŒì¼ ì“°ê¸° 실패: 위치 %u, ê¸¸ì´ %lu: %m" +msgid "could not write to WAL segment %s at offset %d, length %lu: %m" +msgstr "%s WAL ì¡°ê° íŒŒì¼ ì“°ê¸° 실패: 위치 %d, ê¸¸ì´ %lu: %m" -#: replication/walsender.c:523 storage/smgr/md.c:1291 +#: replication/walsender.c:531 +#, c-format +msgid "cannot use %s with a logical replication slot" +msgstr "논리 복제 슬롯으로 %s 사용할 수 ì—†ìŒ" + +#: replication/walsender.c:635 storage/smgr/md.c:1735 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "\"%s\" 파ì¼ì˜ ëì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: %m" -#: replication/walsender.c:527 +#: replication/walsender.c:639 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "\"%s\" 파ì¼ì—서 시작 위치를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %m" -#: replication/walsender.c:578 -#, c-format -msgid "IDENTIFY_SYSTEM has not been run before START_REPLICATION" -msgstr "" - -#: replication/walsender.c:607 +#: replication/walsender.c:853 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "ë¬¼ë¦¬ì  ë³µì œì—서 ë…¼ë¦¬ì  ë³µì œ ìŠ¬ë¡¯ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: replication/walsender.c:676 +#: replication/walsender.c:919 #, c-format msgid "" "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "ìš”ì²­ëœ %X/%X 시작 위치(타임ë¼ì¸ %u)ê°€ ì´ ì„œë²„ ë‚´ì—­ì— ì—†ìŠµë‹ˆë‹¤." -#: replication/walsender.c:680 +#: replication/walsender.c:922 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "ì´ ì„œë²„ì˜ ì‹œìž‘ 위치: 타임ë¼ì¸ %u, 위치 %X/%X" -#: replication/walsender.c:725 +#: replication/walsender.c:966 #, c-format msgid "" "requested starting point %X/%X is ahead of the WAL flush position of this " "server %X/%X" -msgstr "" +msgstr "%X/%X 위치는 ì„œë²„ì˜ %X/%X 보다 ë¯¸ëž˜ì˜ ê²ƒìž…ë‹ˆë‹¤." + +#: replication/walsender.c:1160 +#, c-format +msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" +msgstr "\"%s\" CREATE_REPLICATION_SLOT 옵션ì—서 쓸 수 없는 ê°’: \"%s\"" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:976 +#: replication/walsender.c:1266 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s ëª…ë ¹ì€ íŠ¸ëžœìž­ì…˜ 블럭안ì—서 실행할 수 ì—†ìŒ" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:986 +#: replication/walsender.c:1276 #, c-format msgid "%s must be called inside a transaction" msgstr "%s ëª…ë ¹ì€ íŠ¸ëžœìž­ì…˜ 블럭안ì—서 실행할 수 있ìŒ" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:992 +#: replication/walsender.c:1282 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s êµ¬ë¬¸ì€ ê²©ë¦¬ ìˆ˜ì¤€ì´ REPEATABLE READ ì¼ë•Œë§Œ 사용할 수 있습니다." #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:998 +#: replication/walsender.c:1287 +#, c-format +msgid "%s must be called in a read-only transaction" +msgstr "%s ëª…ë ¹ì€ ì½ê¸° ì „ìš© 트랜잭션 블럭안ì—서만 실행할 수 있ìŒ" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1293 #, c-format msgid "%s must be called before any query" msgstr "ì–´ë–¤ 쿼리보다 먼저 %s ëª…ë ¹ì„ í˜¸ì¶œí•´ì•¼ 함" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1004 +#: replication/walsender.c:1299 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s ëª…ë ¹ì€ ì„œë¸ŒíŠ¸ëžœìž­ì…˜ 블럭안ì—서 실행할 수 ì—†ìŒ" -#: replication/walsender.c:1148 -#, c-format -msgid "cannot read from logical replication slot \"%s\"" -msgstr "\"%s\" 논리 복제 슬롯ì—서 ì½ê¸° 실패" - -#: replication/walsender.c:1150 -#, c-format -msgid "" -"This slot has been invalidated because it exceeded the maximum reserved size." -msgstr "" - -#: replication/walsender.c:1160 +#: replication/walsender.c:1472 #, c-format msgid "terminating walsender process after promotion" msgstr "ìš´ì˜ì „환 ë’¤ wal 송신기 프로세스를 중지합니다." -#: replication/walsender.c:1534 +#: replication/walsender.c:2000 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" -msgstr "" +msgstr "WAL 송신기가 중지 ì¤‘ì¼ ë•ŒëŠ” 새 ëª…ë ¹ì„ ì‹¤í–‰í•  수 없습니다." + +#: replication/walsender.c:2035 +#, c-format +msgid "cannot execute SQL commands in WAL sender for physical replication" +msgstr "ë¬¼ë¦¬ì  ë³µì œë¥¼ 위한 WAL 송신기ì—서 SQL ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ" -#: replication/walsender.c:1567 +#: replication/walsender.c:2068 #, c-format msgid "received replication command: %s" msgstr "ìˆ˜ì‹ ëœ ë³µì œ 명령: %s" -#: replication/walsender.c:1583 tcop/fastpath.c:279 tcop/postgres.c:1103 -#: tcop/postgres.c:1455 tcop/postgres.c:1716 tcop/postgres.c:2174 -#: tcop/postgres.c:2535 tcop/postgres.c:2614 +#: replication/walsender.c:2076 tcop/fastpath.c:209 tcop/postgres.c:1142 +#: tcop/postgres.c:1500 tcop/postgres.c:1752 tcop/postgres.c:2234 +#: tcop/postgres.c:2672 tcop/postgres.c:2749 #, c-format msgid "" "current transaction is aborted, commands ignored until end of transaction " @@ -20204,619 +23440,729 @@ msgstr "" "현재 íŠ¸ëžœìž­ì…˜ì€ ì¤‘ì§€ë˜ì–´ 있습니다. ì´ íŠ¸ëžœìž­ì…˜ì„ ì¢…ë£Œí•˜ê¸° 전까지는 모든 명령" "ì´ ë¬´ì‹œë  ê²ƒìž…ë‹ˆë‹¤" -#: replication/walsender.c:1669 -#, c-format -msgid "cannot execute SQL commands in WAL sender for physical replication" -msgstr "ë¬¼ë¦¬ì  ë³µì œë¥¼ 위한 WAL 송신기ì—서 SQL ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ" - -#: replication/walsender.c:1714 replication/walsender.c:1730 +#: replication/walsender.c:2233 replication/walsender.c:2268 #, c-format msgid "unexpected EOF on standby connection" msgstr "대기 서버 ì—°ê²°ì—서 예ìƒì¹˜ 못한 EOF 발견함" -#: replication/walsender.c:1744 -#, c-format -msgid "unexpected standby message type \"%c\", after receiving CopyDone" -msgstr "" - -#: replication/walsender.c:1782 +#: replication/walsender.c:2256 #, c-format msgid "invalid standby message type \"%c\"" msgstr "ìž˜ëª»ëœ ëŒ€ê¸° 서버 메시지 형태 \"%c\"" -#: replication/walsender.c:1823 +#: replication/walsender.c:2345 #, c-format msgid "unexpected message type \"%c\"" msgstr "예ìƒì¹˜ 못한 메시지 형태: \"%c\"" -#: replication/walsender.c:2241 +#: replication/walsender.c:2759 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "복제 시간 제한으로 wal 송신기 프로세스를 종료합니다." -#: replication/walsender.c:2318 -#, c-format -msgid "\"%s\" has now caught up with upstream server" -msgstr "\"%s\" 프로세스가 로그 전달 ë°›ì„ ì„œë²„ì™€ ì ‘ì†í–ˆìŒ" - -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:989 +#: rewrite/rewriteDefine.c:104 rewrite/rewriteDefine.c:835 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "\"%s\" ì´ë¦„ì˜ ë£°(rule)ì´ \"%s\" í…Œì´ë¸”ì— ì´ë¯¸ 지정ë˜ì–´ìžˆìŠµë‹ˆë‹¤" -#: rewrite/rewriteDefine.c:301 +#: rewrite/rewriteDefine.c:261 rewrite/rewriteDefine.c:773 +#, c-format +msgid "relation \"%s\" cannot have rules" +msgstr "\"%s\" 릴레ì´ì…˜ì€ ë£°ì„ ì§€ì •í•  수 ì—†ìŒ" + +#: rewrite/rewriteDefine.c:292 #, c-format msgid "rule actions on OLD are not implemented" msgstr "OLDì— ëŒ€í•œ 실행 룰(rule)ì€ ì•„ì§ êµ¬í˜„ë˜ì§€ 않았습니다" -#: rewrite/rewriteDefine.c:302 +#: rewrite/rewriteDefine.c:293 #, c-format msgid "Use views or triggers instead." msgstr "ëŒ€ì‹ ì— ë·°ë‚˜ 트리거를 사용하십시오." -#: rewrite/rewriteDefine.c:306 +#: rewrite/rewriteDefine.c:297 #, c-format msgid "rule actions on NEW are not implemented" msgstr "NEWì— ëŒ€í•œ 실행 룰(rule)ì€ ì•„ì§ êµ¬í˜„ë˜ì§€ 않았습니다" -#: rewrite/rewriteDefine.c:307 +#: rewrite/rewriteDefine.c:298 #, c-format msgid "Use triggers instead." msgstr "ëŒ€ì‹ ì— íŠ¸ë¦¬ê±°ë¥¼ 사용하십시오." -#: rewrite/rewriteDefine.c:320 +#: rewrite/rewriteDefine.c:312 +#, c-format +msgid "relation \"%s\" cannot have ON SELECT rules" +msgstr "\"%s\" 릴레ì´ì…˜ì€ ON SELECT ë£°ì„ ì§€ì •í•  수 ì—†ìŒ" + +#: rewrite/rewriteDefine.c:322 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "SELECT ì—서 INSTEAD NOTHING 룰(rule)ì€ êµ¬í˜„ë˜ì§€ 않았습니다" -#: rewrite/rewriteDefine.c:321 +#: rewrite/rewriteDefine.c:323 #, c-format msgid "Use views instead." msgstr "ëŒ€ì‹ ì— ë·°ë¥¼ 사용하십시오." -#: rewrite/rewriteDefine.c:329 +#: rewrite/rewriteDefine.c:331 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "SELECTì— ëŒ€í•œ 다중 실행 룰(rule)ì€ êµ¬í˜„ë˜ì§€ 않았습니다" -#: rewrite/rewriteDefine.c:339 +#: rewrite/rewriteDefine.c:341 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "" "SELECTì— ëŒ€í•œ 룰(rule)ì€ ê·¸ ì§€ì •ì— INSTEAD SELECT ì‹¤í–‰ê·œì¹™ì„ ì§€ì •í•´ì•¼ë§Œí•©ë‹ˆë‹¤" -#: rewrite/rewriteDefine.c:347 +#: rewrite/rewriteDefine.c:349 #, c-format msgid "rules on SELECT must not contain data-modifying statements in WITH" -msgstr "" +msgstr "SELECT 룰ì—는 WITH ì ˆ ì•ˆì— ìžë£Œ 변경 êµ¬ë¬¸ì„ í¬í•¨í•  수 없습니다." -#: rewrite/rewriteDefine.c:355 +#: rewrite/rewriteDefine.c:357 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "" "ì´ë²¤íЏ ìžê²©(event qualifications)ì€ SELECT 룰(rule)ì—서 구현ë˜ì§€ 않았습니다" -#: rewrite/rewriteDefine.c:382 +#: rewrite/rewriteDefine.c:384 #, c-format msgid "\"%s\" is already a view" msgstr "\"%s\" ì´ë¦„ì˜ ë·°ê°€ ì´ë¯¸ 있습니다" -#: rewrite/rewriteDefine.c:406 +#: rewrite/rewriteDefine.c:408 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "\"%s\" 위한 ë·° 룰(view rule)ì˜ ì´ë¦„ì€ \"%s\" 여야만합니다" -#: rewrite/rewriteDefine.c:434 -#, c-format -msgid "cannot convert partitioned table \"%s\" to a view" -msgstr "\"%s\" íŒŒí‹°ì…˜ëœ í…Œì´ë¸”ì€ ë·°ë¡œ 변환할 수 없습니다" - -#: rewrite/rewriteDefine.c:440 -#, c-format -msgid "cannot convert partition \"%s\" to a view" -msgstr "\"%s\" 파티션 í…Œì´ë¸”ì€ ë·°ë¡œ 변환할 수 없습니다" - -#: rewrite/rewriteDefine.c:449 -#, c-format -msgid "could not convert table \"%s\" to a view because it is not empty" -msgstr "\"%s\" í…Œì´ë¸”ì— ìžë£Œê°€ 있기 때문ì—, í…Œì´ë¸”ì„ ë·°ë¡œ 변환할 수 없습니다" - -#: rewrite/rewriteDefine.c:458 -#, c-format -msgid "could not convert table \"%s\" to a view because it has triggers" -msgstr "\"%s\" í…Œì´ë¸”ì— íŠ¸ë¦¬ê±°ê°€ í¬í•¨ë˜ì–´ 있어 뷰로 변환할 수 없습니다" - -#: rewrite/rewriteDefine.c:460 -#, c-format -msgid "" -"In particular, the table cannot be involved in any foreign key relationships." -msgstr "특히 í…Œì´ë¸”ì€ ì°¸ì¡°í‚¤ ê´€ê³„ì— ê´€ë ¨ë  ìˆ˜ 없습니다." - -#: rewrite/rewriteDefine.c:465 -#, c-format -msgid "could not convert table \"%s\" to a view because it has indexes" -msgstr "\"%s\" í…Œì´ë¸”ì— ì¸ë±ìŠ¤ê°€ í¬í•¨ë˜ì–´ 있어 뷰로 변환할 수 없습니다" - -#: rewrite/rewriteDefine.c:471 -#, c-format -msgid "could not convert table \"%s\" to a view because it has child tables" -msgstr "\"%s\" í…Œì´ë¸”ì„ ìƒì† 받는 í…Œì´ë¸”ì´ ìžˆì–´ 뷰로 변활할 수 없습니다" - -#: rewrite/rewriteDefine.c:477 -#, c-format -msgid "" -"could not convert table \"%s\" to a view because it has row security enabled" -msgstr "" -"로우단위 보안 ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ê³  있어 \"%s\" í…Œì´ë¸”ì„ ë·°ë¡œ 변환할 수 없습니다" - -#: rewrite/rewriteDefine.c:483 -#, c-format -msgid "" -"could not convert table \"%s\" to a view because it has row security policies" -msgstr "로우단위 보안 ì„¤ì •ì´ ë˜ì–´ 있어 \"%s\" í…Œì´ë¸”ì„ ë·°ë¡œ 변환할 수 없습니다" - -#: rewrite/rewriteDefine.c:510 +#: rewrite/rewriteDefine.c:435 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "í•˜ë‚˜ì˜ ruleì—서 ì—¬ëŸ¬ê°œì˜ RETURNING 목ë¡ì„ 지정할 수 없습니다" -#: rewrite/rewriteDefine.c:515 +#: rewrite/rewriteDefine.c:440 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "RETURNING 목ë¡ì€ conditional ruleì—서는 ì§€ì›í•˜ì§€ 않습니다" -#: rewrite/rewriteDefine.c:519 +#: rewrite/rewriteDefine.c:444 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "RETURNING 목ë¡ì€ non-INSTEAD ruleì—서는 ì§€ì›í•˜ì§€ 않습니다" -#: rewrite/rewriteDefine.c:683 +#: rewrite/rewriteDefine.c:458 +#, c-format +msgid "non-view rule for \"%s\" must not be named \"%s\"" +msgstr "\"%s\" 위한 ë·°ê°€ 아닌 룰 ì´ë¦„ì€ \"%s\" 아니여야 합니다." + +#: rewrite/rewriteDefine.c:532 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "SELECT 룰(rule)ì˜ ëŒ€ìƒ ëª©ë¡ì´ 너무 ë§Žì€ ì—”íŠ¸ë¦¬ë¥¼ 가지고 있습니다" -#: rewrite/rewriteDefine.c:684 +#: rewrite/rewriteDefine.c:533 #, c-format msgid "RETURNING list has too many entries" msgstr "RETURNING 목ë¡ì´ 너무 ë§Žì€ í•­ëª©ë¥¼ 가지고 있습니다" -#: rewrite/rewriteDefine.c:711 +#: rewrite/rewriteDefine.c:560 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "ë·°ì—서 ì‚­ì œëœ ì¹¼ëŸ¼ì„ í¬í•¨í•˜ê³  있는 릴레ì´ì…˜ì„ 변환할 수 없습니다" -#: rewrite/rewriteDefine.c:712 +#: rewrite/rewriteDefine.c:561 #, c-format msgid "" "cannot create a RETURNING list for a relation containing dropped columns" msgstr "" "릴레ì´ì…˜ì— ì‚­ì œëœ ì¹¼ëŸ¼ì„ í¬í•¨í•˜ê³  있는 RETURNING 목ë¡ì„ 만들 수 없습니다." -#: rewrite/rewriteDefine.c:718 +#: rewrite/rewriteDefine.c:567 #, c-format msgid "" "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "SELECT 룰(rule)ì˜ ëŒ€ìƒ ì—”íŠ¸ë¦¬ 번호가(%d)ê°€ \"%s\" 칼럼 ì´ë¦„ê³¼ 틀립니다" -#: rewrite/rewriteDefine.c:720 +#: rewrite/rewriteDefine.c:569 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "SELECT ëŒ€ìƒ ì—”íŠ¸ë¦¬ ì´ë¦„ì€ \"%s\" 입니다." -#: rewrite/rewriteDefine.c:729 +#: rewrite/rewriteDefine.c:578 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "SELECT 룰(rule)ì˜ ëŒ€ìƒ ì—”íŠ¸ë¦¬ 번호(%d)ê°€ \"%s\" 칼럼 ìžë£Œí˜•ê³¼ 틀립니다" -#: rewrite/rewriteDefine.c:731 +#: rewrite/rewriteDefine.c:580 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "RETURNING 목ë¡ì˜ %d번째 í•­ëª©ì˜ ìžë£Œí˜•ì´ \"%s\" 칼럼 ìžë£Œí˜•ê³¼ 틀립니다" -#: rewrite/rewriteDefine.c:734 rewrite/rewriteDefine.c:758 +#: rewrite/rewriteDefine.c:583 rewrite/rewriteDefine.c:607 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "SELECT ëŒ€ìƒ ì—”íŠ¸ë¦¬ ìžë£Œí˜•ì€ %s 형ì´ì§€ë§Œ, 칼럼 ìžë£Œí˜•ì€ %s 형입니다." -#: rewrite/rewriteDefine.c:737 rewrite/rewriteDefine.c:762 +#: rewrite/rewriteDefine.c:586 rewrite/rewriteDefine.c:611 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "RETURNING 목ë¡ì€ %s ìžë£Œí˜•ì´ì§€ë§Œ, 칼럼 ìžë£Œí˜•ì€ %s 형입니다." -#: rewrite/rewriteDefine.c:753 +#: rewrite/rewriteDefine.c:602 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "SELECT 룰(rule)ì˜ ëŒ€ìƒ ì—”íŠ¸ë¦¬ 번호(%d)ê°€ \"%s\" 칼럼 í¬ê¸°ì™€ 틀립니다" -#: rewrite/rewriteDefine.c:755 +#: rewrite/rewriteDefine.c:604 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "RETURNING 목ë¡ì˜ %d번째 í•­ëª©ì˜ í¬ê¸°ê°€ \"%s\" 칼럼 í¬ê¸°ì™€ 틀립니다" -#: rewrite/rewriteDefine.c:772 +#: rewrite/rewriteDefine.c:621 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "SELECT 룰(rule)ì˜ ëŒ€ìƒ ëª©ë¡ì´ 너무 ì ì€ 엔트리를 가지고 있습니다" -#: rewrite/rewriteDefine.c:773 +#: rewrite/rewriteDefine.c:622 #, c-format msgid "RETURNING list has too few entries" msgstr "RETURNING 목ë¡ì— 너무 ì ì€ í•­ëª©ì´ ìžˆìŠµë‹ˆë‹¤" -#: rewrite/rewriteDefine.c:866 rewrite/rewriteDefine.c:980 -#: rewrite/rewriteSupport.c:109 +#: rewrite/rewriteDefine.c:711 rewrite/rewriteDefine.c:826 +#: rewrite/rewriteSupport.c:108 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr " \"%s\" 룰(rule)ì´ \"%s\" 관계(relation)ì— ì§€ì •ëœ ê²ƒì´ ì—†ìŒ" -#: rewrite/rewriteDefine.c:999 +#: rewrite/rewriteDefine.c:845 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "ON SELECT ë£°ì˜ ì´ë¦„ 바꾸기는 허용하지 않습니다" -#: rewrite/rewriteHandler.c:545 +#: rewrite/rewriteHandler.c:588 #, c-format msgid "" "WITH query name \"%s\" appears in both a rule action and the query being " "rewritten" +msgstr "\"%s\" ì´ë¦„ì˜ WITH 쿼리가 룰 ë™ìž‘ê³¼ 쿼리 재작성 ë‘ ê³³ 모ë‘ì— ë³´ìž…ë‹ˆë‹¤." + +#: rewrite/rewriteHandler.c:615 +#, c-format +msgid "" +"INSERT ... SELECT rule actions are not supported for queries having data-" +"modifying statements in WITH" msgstr "" +"INSERT...SELECT 룰 ì•¡ì…˜ì—는 WITH ì ˆ ì•ˆì— ìžë£Œ 변경 êµ¬ë¬¸ì„ ì§€ì›í•˜ì§€ 않습니다." -#: rewrite/rewriteHandler.c:605 +#: rewrite/rewriteHandler.c:668 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "multiple ruleì— RETURNING 목ë¡ì„ 지정할 수 없습니다" -#: rewrite/rewriteHandler.c:816 rewrite/rewriteHandler.c:828 +#: rewrite/rewriteHandler.c:900 rewrite/rewriteHandler.c:939 #, c-format -msgid "cannot insert into column \"%s\"" -msgstr "\"%s\" ì¹¼ëŸ¼ì— ìžë£Œë¥¼ 입력할 수 없습니다" +msgid "cannot insert a non-DEFAULT value into column \"%s\"" +msgstr "\"%s\" ì¹¼ëŸ¼ì— non-DEFAULT ê°’ì„ ìž…ë ¥í•  수 없습니다" -#: rewrite/rewriteHandler.c:817 rewrite/rewriteHandler.c:839 +#: rewrite/rewriteHandler.c:902 rewrite/rewriteHandler.c:968 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." -msgstr "" +msgstr "\"%s\" ì¹¼ëŸ¼ì€ GENERATED ALWAYS ì†ì„±ì˜ ì‹ë³„ìž ì¹¼ëŸ¼ìž…ë‹ˆë‹¤." -#: rewrite/rewriteHandler.c:819 +#: rewrite/rewriteHandler.c:904 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." -msgstr "" +msgstr "ì´ ì†ì„±ì„ 무시하려면, OVERRIDING SYSTEM VALUE ì˜µì…˜ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: rewrite/rewriteHandler.c:838 rewrite/rewriteHandler.c:845 +#: rewrite/rewriteHandler.c:966 rewrite/rewriteHandler.c:974 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "\"%s\" ì¹¼ëŸ¼ì€ DEFAULT 로만 ì—…ë°ì´íЏ 가능합니다" -#: rewrite/rewriteHandler.c:1014 rewrite/rewriteHandler.c:1032 +#: rewrite/rewriteHandler.c:1121 rewrite/rewriteHandler.c:1139 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "ê°™ì€ \"%s\" ì—´ì— ì§€ì •ê°’(assignment)ì´ ì¤‘ë³µë˜ì—ˆìŠµë‹ˆë‹¤" -#: rewrite/rewriteHandler.c:2062 +#: rewrite/rewriteHandler.c:1704 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE ëª…ë ¹ì€ ë£°ì„ ì‚¬ìš©í•˜ëŠ” 릴레ì´ì…˜ì—서 사용할 수 없습니다." + +#: rewrite/rewriteHandler.c:1744 rewrite/rewriteHandler.c:3284 +#, c-format +msgid "access to non-system view \"%s\" is restricted" +msgstr "\"%s\"는 non-system 뷰로 ì ‘ê·¼ì´ ì œí•œë¨" + +#: rewrite/rewriteHandler.c:2144 rewrite/rewriteHandler.c:4276 +#, c-format +msgid "infinite recursion detected in rules for relation \"%s\"" +msgstr "" +"\"%s\" 릴레ì´ì…˜(relation)ì—서 ì§€ì •ëœ ë£°ì—서 ìž˜ëª»ëœ ìž¬ê·€í˜¸ì¶œì´ ë°œê²¬ë˜ì—ˆìŠµë‹ˆë‹¤" + +#: rewrite/rewriteHandler.c:2249 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "\"%s\" 릴레ì´ì…˜ì˜ ì •ì±…ì—서 무한 재귀 í˜¸ì¶œì´ ë°œê²¬ ë¨" -#: rewrite/rewriteHandler.c:2382 +#: rewrite/rewriteHandler.c:2611 msgid "Junk view columns are not updatable." msgstr "ì •í¬ ë·° ì¹¼ëŸ¼ì€ ì—…ë°ì´íŠ¸í•  수 없습니다." -#: rewrite/rewriteHandler.c:2387 +#: rewrite/rewriteHandler.c:2616 msgid "" "View columns that are not columns of their base relation are not updatable." msgstr "" +"ë·°ì˜ ë°”íƒ•ì´ ë˜ëŠ” 릴레ì´ì…˜ì˜ ì¹¼ëŸ¼ì´ ì•„ë‹Œ ë·° ì¹¼ëŸ¼ì€ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." -#: rewrite/rewriteHandler.c:2390 +#: rewrite/rewriteHandler.c:2619 msgid "View columns that refer to system columns are not updatable." -msgstr "" +msgstr "시스템 ì¹¼ëŸ¼ì´ ì›ë³¸ì¸ ë·° ì¹¼ëŸ¼ì€ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." -#: rewrite/rewriteHandler.c:2393 +#: rewrite/rewriteHandler.c:2622 msgid "View columns that return whole-row references are not updatable." -msgstr "" +msgstr "로우 전체를 참조하는 ë·° ì¹¼ëŸ¼ì€ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." -#: rewrite/rewriteHandler.c:2454 +#: rewrite/rewriteHandler.c:2683 msgid "Views containing DISTINCT are not automatically updatable." -msgstr "" +msgstr "DISTINCT ì¡°ê±´ì´ ìžˆëŠ” 뷰는 ìžë™ìœ¼ë¡œ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." -#: rewrite/rewriteHandler.c:2457 +#: rewrite/rewriteHandler.c:2686 msgid "Views containing GROUP BY are not automatically updatable." -msgstr "" +msgstr "GROUP BY ì ˆì´ ìžˆëŠ” 뷰는 ìžë™ìœ¼ë¡œ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." -#: rewrite/rewriteHandler.c:2460 +#: rewrite/rewriteHandler.c:2689 msgid "Views containing HAVING are not automatically updatable." -msgstr "" +msgstr "HAVING ì ˆì´ ìžˆëŠ” 뷰는 ìžë™ìœ¼ë¡œ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." -#: rewrite/rewriteHandler.c:2463 +#: rewrite/rewriteHandler.c:2692 msgid "" "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "" +"UNION, INTERSECT, EXCEPT를 í¬í•¨í•˜ëŠ” 뷰는 ìžë™ìœ¼ë¡œ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." -#: rewrite/rewriteHandler.c:2466 +#: rewrite/rewriteHandler.c:2695 msgid "Views containing WITH are not automatically updatable." -msgstr "" +msgstr "WITH ì ˆì„ í¬í•¨í•˜ëŠ” 뷰는 ìžë™ìœ¼ë¡œ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." -#: rewrite/rewriteHandler.c:2469 +#: rewrite/rewriteHandler.c:2698 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "" +"LIMIT ë˜ëŠ” OFFSET êµ¬ë¬¸ì„ í¬í•¨í•˜ëŠ” 뷰는 ìžë™ìœ¼ë¡œ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." -#: rewrite/rewriteHandler.c:2481 +#: rewrite/rewriteHandler.c:2710 msgid "Views that return aggregate functions are not automatically updatable." -msgstr "" +msgstr "집계 함수를 반환하는 뷰는 ìžë™ìœ¼ë¡œ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." -#: rewrite/rewriteHandler.c:2484 +#: rewrite/rewriteHandler.c:2713 msgid "Views that return window functions are not automatically updatable." -msgstr "" +msgstr "윈ë„ìš° 함수를 반환하는 뷰는 ìžë™ìœ¼ë¡œ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." -#: rewrite/rewriteHandler.c:2487 +#: rewrite/rewriteHandler.c:2716 msgid "" "Views that return set-returning functions are not automatically updatable." -msgstr "" +msgstr "ì§‘í•© 반환 함수를 반환하는 뷰는 ìžë™ìœ¼ë¡œ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." -#: rewrite/rewriteHandler.c:2494 rewrite/rewriteHandler.c:2498 -#: rewrite/rewriteHandler.c:2506 +#: rewrite/rewriteHandler.c:2723 rewrite/rewriteHandler.c:2727 +#: rewrite/rewriteHandler.c:2735 msgid "" "Views that do not select from a single table or view are not automatically " "updatable." msgstr "" +"ë‹¨ì¼ í…Œì´ë¸” ë˜ëŠ” ë‹¨ì¼ ë·°ë¥¼ SELECT 하지 않는 뷰는 ìžë™ìœ¼ë¡œ ì—…ë°ì´íЏ ë  ìˆ˜ 없습" +"니다." -#: rewrite/rewriteHandler.c:2509 +#: rewrite/rewriteHandler.c:2738 msgid "Views containing TABLESAMPLE are not automatically updatable." -msgstr "" +msgstr "TABLESAMPLE êµ¬ë¬¸ì„ í¬í•¨í•˜ëŠ” 뷰는 ìžë™ìœ¼ë¡œ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." -#: rewrite/rewriteHandler.c:2533 +#: rewrite/rewriteHandler.c:2762 msgid "Views that have no updatable columns are not automatically updatable." +msgstr "ì—…ë°ì´íЏ 가능한 ì¹¼ëŸ¼ì´ ì—†ëŠ” 뷰는 ìžë™ìœ¼ë¡œ ì—…ë°ì´íЏ ë  ìˆ˜ 없습니다." + +#: rewrite/rewriteHandler.c:3143 rewrite/rewriteHandler.c:3178 +#, c-format +msgid "cannot insert into view \"%s\"" +msgstr "\"%s\" ë·°ì— ìžë£Œë¥¼ 입력할 수 없습니다" + +#: rewrite/rewriteHandler.c:3146 +#, c-format +msgid "" +"To enable inserting into the view, provide an INSTEAD OF INSERT trigger or " +"an unconditional ON INSERT DO INSTEAD rule." +msgstr "" +"뷰를 통해 ìžë£Œë¥¼ 입력하려면, INSTEAD OF INSERT 트리거나 ON INSERT DO INSTEAD " +"ë£°ì„ ì‚¬ìš©í•˜ì„¸ìš”" + +#: rewrite/rewriteHandler.c:3151 rewrite/rewriteHandler.c:3187 +#, c-format +msgid "cannot update view \"%s\"" +msgstr "\"%s\" 뷰로는 ìžë£Œë¥¼ 갱신할 수 없습니다" + +#: rewrite/rewriteHandler.c:3154 +#, c-format +msgid "" +"To enable updating the view, provide an INSTEAD OF UPDATE trigger or an " +"unconditional ON UPDATE DO INSTEAD rule." +msgstr "" +"ë·° ìžë£Œ 갱신 ê¸°ëŠ¥ì€ INSTEAD OF UPDATE 트리거를 사용하거나, ON UPDATE DO " +"INSTEAD ì†ì„±ìœ¼ë¡œ ë£°ì„ ë§Œë“¤ì–´ì„œ 사용해 보세요." + +#: rewrite/rewriteHandler.c:3159 rewrite/rewriteHandler.c:3196 +#, c-format +msgid "cannot delete from view \"%s\"" +msgstr "\"%s\" 뷰로는 ìžë£Œë¥¼ 삭제할 수 없습니다" + +#: rewrite/rewriteHandler.c:3162 +#, c-format +msgid "" +"To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an " +"unconditional ON DELETE DO INSTEAD rule." msgstr "" +"ë·° ìžë£Œ ì‚­ì œ ê¸°ëŠ¥ì€ INSTEAD OF DELETE 트리거를 사용하거나, ON DELETE DO " +"INSTEAD ì†ì„±ìœ¼ë¡œ ë£°ì„ ë§Œë“¤ì–´ì„œ 사용해 보세요." + +#: rewrite/rewriteHandler.c:3181 +#, c-format +msgid "" +"To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT " +"trigger." +msgstr "뷰를 통해 ìžë£Œë¥¼ 입력하려면, MERGE나 INSTEAD OF INSERT 트리거를 사용하세요" + +#: rewrite/rewriteHandler.c:3190 +#, c-format +msgid "" +"To enable updating the view using MERGE, provide an INSTEAD OF UPDATE " +"trigger." +msgstr "뷰를 통해 ìžë£Œë¥¼ 변경하려면, MERGE나 INSTEAD OF INSERT 트리거를 사용하세요" + +#: rewrite/rewriteHandler.c:3199 +#, c-format +msgid "" +"To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE " +"trigger." +msgstr "뷰를 통해 ìžë£Œë¥¼ 삭제하려면, MERGE나 INSTEAD OF INSERT 트리거를 사용하세요" -#: rewrite/rewriteHandler.c:3010 +#: rewrite/rewriteHandler.c:3374 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "\"%s\" 칼럼 (해당 ë·°: \"%s\")ì— ìžë£Œë¥¼ 입력할 수 없습니다" -#: rewrite/rewriteHandler.c:3018 +#: rewrite/rewriteHandler.c:3382 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "\"%s\" 칼럼 (해당 ë·°: \"%s\")ì— ìžë£Œë¥¼ 갱신할 수 없습니다" -#: rewrite/rewriteHandler.c:3496 +#: rewrite/rewriteHandler.c:3390 +#, c-format +msgid "cannot merge into column \"%s\" of view \"%s\"" +msgstr "\"%s\" 칼럼 (해당 ë·°: \"%s\")ì— ë³‘í•©í•  수 ì—†ìŒ" + +#: rewrite/rewriteHandler.c:3418 +#, c-format +msgid "cannot merge into view \"%s\"" +msgstr "\"%s\" ë·°ì— ë³‘í•©í•  수 ì—†ìŒ" + +#: rewrite/rewriteHandler.c:3420 +#, c-format +msgid "" +"MERGE is not supported for views with INSTEAD OF triggers for some actions " +"but not all." +msgstr "" +"MERGE ëª…ë ¹ì€ ëª‡ëª‡ actionìš© INSTEAD OF 트리거가 있는 뷰를 ì§€ì›í•˜ì§€ 않ìŒ" + +#: rewrite/rewriteHandler.c:3421 +#, c-format +msgid "" +"To enable merging into the view, either provide a full set of INSTEAD OF " +"triggers or drop the existing INSTEAD OF triggers." +msgstr "" +"ë·°ì— ë³‘í•©ì„ í™œì„±í™”í•˜ë ¤ë©´ INSTEAD OF íŠ¸ë¦¬ê±°ì˜ ì „ì²´ 세트를 제공하거나 " +"기존 INSTEAD OF 트리거를 삭제하세요" + +#: rewrite/rewriteHandler.c:3934 +#, c-format +msgid "" +"DO INSTEAD NOTIFY rules are not supported for data-modifying statements in " +"WITH" +msgstr "DO INSTEAD NOTIFY 룰ì—서는 WITH ì ˆ ì•ˆì— ìžë£Œ 변경 êµ¬ë¬¸ì´ ì—†ì–´ì•¼ 합니다" + +#: rewrite/rewriteHandler.c:3945 #, c-format msgid "" "DO INSTEAD NOTHING rules are not supported for data-modifying statements in " "WITH" msgstr "" +"DO INSTEAD NOTHING 룰ì—서는 WITH ì ˆ ì•ˆì— ìžë£Œ 변경 êµ¬ë¬¸ì´ ì—†ì–´ì•¼ 합니다" -#: rewrite/rewriteHandler.c:3510 +#: rewrite/rewriteHandler.c:3959 #, c-format msgid "" "conditional DO INSTEAD rules are not supported for data-modifying statements " "in WITH" -msgstr "" +msgstr "ì„ íƒì  DO INSTEAD 룰ì—서는 WITH ì ˆ ì•ˆì— ìžë£Œ 변경 êµ¬ë¬¸ì´ ì—†ì–´ì•¼ 합니다" -#: rewrite/rewriteHandler.c:3514 +#: rewrite/rewriteHandler.c:3963 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" -msgstr "" +msgstr "DO ALSO 룰ì—서는 WITH ì ˆ ì•ˆì— ìžë£Œ 변경 êµ¬ë¬¸ì´ ì—†ì–´ì•¼ 합니다" -#: rewrite/rewriteHandler.c:3519 +#: rewrite/rewriteHandler.c:3968 #, c-format msgid "" "multi-statement DO INSTEAD rules are not supported for data-modifying " "statements in WITH" msgstr "" +"여러 구문으로 êµ¬ì„±ëœ DO INSTEAD 룰ì—서는 WITH ì ˆ ì•ˆì— ìžë£Œ 변경 êµ¬ë¬¸ì´ ì—†ì–´" +"야 합니다" -#: rewrite/rewriteHandler.c:3710 rewrite/rewriteHandler.c:3718 -#: rewrite/rewriteHandler.c:3726 -#, c-format +#: rewrite/rewriteHandler.c:4228 msgid "" "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "" "ì„ íƒì  DO INSTEAD ë£°ì„ í¬í•¨í•œ 뷰는 ìžë™ ì—…ë°ì´íЏ ê¸°ëŠ¥ì„ ì‚¬ìš©í•  수 없습니다." -#: rewrite/rewriteHandler.c:3819 +#: rewrite/rewriteHandler.c:4325 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "\"%s\" 릴레ì´ì…˜ì—서 INSERT RETURNING ê´€ë ¨ì„ êµ¬ì„±í•  수 ì—†ìŒ" -#: rewrite/rewriteHandler.c:3821 +#: rewrite/rewriteHandler.c:4327 #, c-format msgid "" "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "" -"RETURNING ì ˆì—서는 무조건 ON INSERT DO INSTEAD ì†ì„±ìœ¼ë¡œ ruleì´ ì‚¬ìš©ë˜ì–´ì•¼í•©ë‹ˆ" -"다." +"RETURNING ì ˆì—서는 무조건 ON INSERT DO INSTEAD ì†ì„±ìœ¼ë¡œ ruleì´ ì‚¬ìš©ë˜ì–´ì•¼ í•©" +"니다." -#: rewrite/rewriteHandler.c:3826 +#: rewrite/rewriteHandler.c:4332 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "\"%s\" 릴레ì´ì…˜ì—서 UPDATE RETURNING ê´€ë ¨ì„ êµ¬ì„±í•  수 없습니다." -#: rewrite/rewriteHandler.c:3828 +#: rewrite/rewriteHandler.c:4334 #, c-format msgid "" "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "" -"RETURNING ì ˆì—서는 무조건 ON UPDATE DO INSTEAD ì†ì„±ìœ¼ë¡œ ruleì´ ì‚¬ìš©ë˜ì–´ì•¼í•©ë‹ˆ" -"다." +"RETURNING ì ˆì—서는 무조건 ON UPDATE DO INSTEAD ì†ì„±ìœ¼ë¡œ ruleì´ ì‚¬ìš©ë˜ì–´ì•¼ í•©" +"니다." -#: rewrite/rewriteHandler.c:3833 +#: rewrite/rewriteHandler.c:4339 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "\"%s\" 릴레ì´ì…˜ì—서 DELETE RETURNING ê´€ë ¨ì„ êµ¬ì„±í•  수 없습니다." -#: rewrite/rewriteHandler.c:3835 +#: rewrite/rewriteHandler.c:4341 #, c-format msgid "" "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "" -"TURNING ì ˆì—서는 무조건 ON DELETE DO INSTEAD ì†ì„±ìœ¼ë¡œ ruleì´ ì‚¬ìš©ë˜ì–´ì•¼í•©ë‹ˆë‹¤" +"TURNING ì ˆì—서는 무조건 ON DELETE DO INSTEAD ì†ì„±ìœ¼ë¡œ ruleì´ ì‚¬ìš©ë˜ì–´ì•¼ 합니" +"다" -#: rewrite/rewriteHandler.c:3853 +#: rewrite/rewriteHandler.c:4359 #, c-format msgid "" "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or " "UPDATE rules" msgstr "" +"INSERT ë˜ëŠ” UPDATE ë£°ì´ ì§€ì •ëœ í…Œì´ë¸”ì„ ëŒ€ìƒìœ¼ë¡œ INSERT ... ON CONFLICT 구문" +"ì€ ì‚¬ìš©í•  수 없습니다." -#: rewrite/rewriteHandler.c:3910 +#: rewrite/rewriteHandler.c:4416 #, c-format msgid "" "WITH cannot be used in a query that is rewritten by rules into multiple " "queries" msgstr "" +"WITH ì ˆì€ ë‹¤ì¤‘ 쿼리 ìž‘ì—…ì„ í•˜ëŠ” 룰로 재작성ë˜ëŠ” 쿼리 안ì—서는 사용할 수 없습" +"니다." -#: rewrite/rewriteManip.c:1006 +#: rewrite/rewriteManip.c:1083 #, c-format msgid "conditional utility statements are not implemented" msgstr "" "ì¡°ê±´ 유틸리티 명령 구문(conditional utility statement)ì€ êµ¬í˜„ë˜ì–´ìžˆì§€ 않습니" "다" -#: rewrite/rewriteManip.c:1172 +#: rewrite/rewriteManip.c:1430 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "ë·°ì— ëŒ€í•œ WHERE CURRENT OF êµ¬ë¬¸ì´ êµ¬í˜„ë˜ì§€ 않ìŒ" -#: rewrite/rewriteManip.c:1507 +#: rewrite/rewriteManip.c:1765 #, c-format msgid "" "NEW variables in ON UPDATE rules cannot reference columns that are part of a " "multiple assignment in the subject UPDATE command" msgstr "" +"ON UPDATE 룰ì—서 쓰는 NEW 변수는 주 UPDATE êµ¬ë¬¸ì•ˆì— ë‹¤ì¤‘ìœ¼ë¡œ ì§€ì •ëœ ì¹¼ëŸ¼ 가운" +"ë° í•œ ë¶€ë¶„ì¸ ì¹¼ëŸ¼ì„ ì°¸ì¡°í•  수 없습니다." + +#: rewrite/rewriteSearchCycle.c:410 +#, c-format +msgid "" +"with a SEARCH or CYCLE clause, the recursive reference to WITH query \"%s\" " +"must be at the top level of its right-hand SELECT" +msgstr "" +"재귀 í˜¸ì¶œì„ ì´ìš©í•˜ëŠ” \"%s\" WITH 쿼리를 SEARCH ë˜ëŠ” CYCLE 절과 함께 쓸 때는 " +"오른편 SELECT는 최ìƒìœ„ 수준ì´ì–´ì•¼ 합니다." -#: snowball/dict_snowball.c:199 +#: snowball/dict_snowball.c:215 #, c-format msgid "no Snowball stemmer available for language \"%s\" and encoding \"%s\"" msgstr "\"%s\" 언어 ë° \"%s\" ì¸ì½”ë”©ì— ì‚¬ìš© 가능한 Snowball stemmerê°€ ì—†ìŒ" -#: snowball/dict_snowball.c:222 tsearch/dict_ispell.c:74 +#: snowball/dict_snowball.c:238 tsearch/dict_ispell.c:74 #: tsearch/dict_simple.c:49 #, c-format msgid "multiple StopWords parameters" msgstr "StopWords 매개 변수가 여러 ê°œ 있ìŒ" -#: snowball/dict_snowball.c:231 +#: snowball/dict_snowball.c:247 #, c-format msgid "multiple Language parameters" msgstr "여러 ê°œì˜ ì–¸ì–´ 매개 변수가 있ìŒ" -#: snowball/dict_snowball.c:238 +#: snowball/dict_snowball.c:254 #, c-format msgid "unrecognized Snowball parameter: \"%s\"" msgstr "ì¸ì‹í•  수 없는 Snowball 매개 변수: \"%s\"" -#: snowball/dict_snowball.c:246 +#: snowball/dict_snowball.c:262 #, c-format msgid "missing Language parameter" msgstr "Language 매개 변수가 누ë½ë¨" -#: statistics/dependencies.c:667 statistics/dependencies.c:720 -#: statistics/mcv.c:1477 statistics/mcv.c:1508 statistics/mvdistinct.c:348 -#: statistics/mvdistinct.c:401 utils/adt/pseudotypes.c:42 -#: utils/adt/pseudotypes.c:76 -#, c-format -msgid "cannot accept a value of type %s" -msgstr "%s 형ì‹ì˜ ê°’ì€ ì‚¬ìš©í•  수 ì—†ìŒ" - -#: statistics/extended_stats.c:145 +#: statistics/extended_stats.c:176 #, c-format msgid "" "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "\"%s.%s\" 통계정보 개체를 계산 í•  수 ì—†ìŒ: ëŒ€ìƒ ë¦´ë ˆì´ì…˜: \"%s.%s\"" -#: statistics/mcv.c:1365 utils/adt/jsonfuncs.c:1800 +#: statistics/mcv.c:1368 #, c-format msgid "" "function returning record called in context that cannot accept type record" msgstr "반환 ìžë£Œí˜•ì´ recordì¸ë° 함수가 ê·¸ ìžë£Œí˜•으로 반환하지 않ìŒ" -#: storage/buffer/bufmgr.c:588 storage/buffer/bufmgr.c:669 +#: storage/buffer/bufmgr.c:649 storage/buffer/bufmgr.c:805 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "다른 ì„¸ì…˜ì˜ ìž„ì‹œ í…Œì´ë¸”ì— ì•¡ì„¸ìŠ¤í•  수 ì—†ìŒ" -#: storage/buffer/bufmgr.c:825 +#: storage/buffer/bufmgr.c:1532 +#, c-format +msgid "invalid page in block %u of relation %s; zeroing out page" +msgstr "" +"%u 블ë¡(해당 릴레ì´ì…˜: %s)ì— ìž˜ëª»ëœ íŽ˜ì´ì§€ í—¤ë”ê°€ 있ìŒ, 페ì´ì§€ë¥¼ 삭제하는 중" + +#: storage/buffer/bufmgr.c:2277 storage/buffer/localbuf.c:361 +#, c-format +msgid "cannot extend relation %s beyond %u blocks" +msgstr "%s 릴레ì´ì…˜ì€ %uê°œ 블ë¡ì„ 초과하여 확장할 수 ì—†ìŒ" + +#: storage/buffer/bufmgr.c:2348 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "%u 블ë¡(해당 릴레ì´ì…˜: %s)ì— EOF 범위를 넘는 예기치 ì•Šì€ ë°ì´í„°ê°€ 있ìŒ" -#: storage/buffer/bufmgr.c:827 +#: storage/buffer/bufmgr.c:2350 #, c-format msgid "" "This has been seen to occur with buggy kernels; consider updating your " "system." msgstr "ì´ ë¬¸ì œëŠ” 커ë„ì˜ ë¬¸ì œë¡œ 알려졌습니다. ì‹œìŠ¤í…œì„ ì—…ë°ì´íŠ¸í•˜ì‹­ì‹œì˜¤." -#: storage/buffer/bufmgr.c:925 -#, c-format -msgid "invalid page in block %u of relation %s; zeroing out page" -msgstr "" -"%u 블ë¡(해당 릴레ì´ì…˜: %s)ì— ìž˜ëª»ëœ íŽ˜ì´ì§€ í—¤ë”ê°€ 있ìŒ, 페ì´ì§€ë¥¼ 삭제하는 중" - -#: storage/buffer/bufmgr.c:4211 +#: storage/buffer/bufmgr.c:5653 #, c-format msgid "could not write block %u of %s" msgstr "%u/%s 블ë¡ì„ 쓸 수 ì—†ìŒ" -#: storage/buffer/bufmgr.c:4213 +#: storage/buffer/bufmgr.c:5655 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "여러 번 실패 --- 쓰기 오류가 ì˜êµ¬ì ì¼ 수 있습니다." -#: storage/buffer/bufmgr.c:4234 storage/buffer/bufmgr.c:4253 +#: storage/buffer/bufmgr.c:5677 storage/buffer/bufmgr.c:5697 #, c-format msgid "writing block %u of relation %s" msgstr "%u 블ë¡(해당 릴레ì´ì…˜: %s)ì„ ì“°ëŠ” 중" -#: storage/buffer/bufmgr.c:4556 -#, c-format -msgid "snapshot too old" -msgstr "" - -#: storage/buffer/localbuf.c:205 +#: storage/buffer/localbuf.c:220 #, c-format msgid "no empty local buffer available" msgstr "비어 있는 로컬 버í¼ê°€ 없습니다" -#: storage/buffer/localbuf.c:433 +#: storage/buffer/localbuf.c:597 #, c-format msgid "cannot access temporary tables during a parallel operation" msgstr "병렬 작업 ì¤‘ì— ìž„ì‹œ í…Œì´ë¸”ì— ì•¡ì„¸ìŠ¤í•  수 ì—†ìŒ" -#: storage/file/buffile.c:319 +#: storage/buffer/localbuf.c:712 +#, c-format +msgid "" +"\"temp_buffers\" cannot be changed after any temporary tables have been " +"accessed in the session." +msgstr "" +"해당 세션ì—서 ì–´ë–¤ 임시 í…Œì´ë¸”ë„ ì‚¬ìš©í•˜ê³  있지 않아야 \"temp_buffers\" 설정" +"ì„ ë°”ê¿€ 수 있습니다." + +#: storage/file/buffile.c:338 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "\"%s\" 임시 파ì¼ì„ ì—´ 수 ì—†ìŒ, 버í¼íŒŒì¼: \"%s\": %m" -#: storage/file/buffile.c:795 +#: storage/file/buffile.c:632 +#, c-format +msgid "could not read from file set \"%s\": read only %zu of %zu bytes" +msgstr "\"%s\" íŒŒì¼ ì„¸íŠ¸ë¥¼ ì½ì„ 수 ì—†ìŒ: %zu ë°”ì´íŠ¸ë§Œ ì½ìŒ (ì „ì²´: %zu)" + +#: storage/file/buffile.c:634 +#, c-format +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "임시 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %zu ë°”ì´íŠ¸ë§Œ ì½ìŒ (ì „ì²´: %zu)" + +#: storage/file/buffile.c:774 storage/file/buffile.c:877 #, c-format msgid "" "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" msgstr "\"%s\" 임시 파ì¼ì˜ í¬ê¸°ë¥¼ 알 수 ì—†ìŒ, 버í¼íŒŒì¼: \"%s\": %m" -#: storage/file/fd.c:508 storage/file/fd.c:580 storage/file/fd.c:616 +#: storage/file/buffile.c:956 +#, c-format +msgid "could not delete fileset \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ì„¸íŠ¸ë¥¼ 지울 수 ì—†ìŒ: %m" + +#: storage/file/buffile.c:974 storage/smgr/md.c:336 storage/smgr/md.c:1194 +#, c-format +msgid "could not truncate file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 비울 수 ì—†ìŒ: %m" + +#: storage/file/fd.c:583 storage/file/fd.c:655 storage/file/fd.c:691 #, c-format msgid "could not flush dirty data: %m" msgstr "dirty ìžë£Œë¥¼ flush í•  수 ì—†ìŒ: %m" -#: storage/file/fd.c:538 +#: storage/file/fd.c:613 #, c-format msgid "could not determine dirty data size: %m" msgstr "dirty ìžë£Œ í¬ê¸°ë¥¼ 확ì¸í•  수 ì—†ìŒ: %m" -#: storage/file/fd.c:590 +#: storage/file/fd.c:665 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "ìžë£Œ flush 작업 ë„중 munmap() 호출 실패: %m" -#: storage/file/fd.c:798 -#, c-format -msgid "could not link file \"%s\" to \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ë§í¬í•  수 ì—†ìŒ: %m" - -#: storage/file/fd.c:881 +#: storage/file/fd.c:983 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit 실패: %m" -#: storage/file/fd.c:971 +#: storage/file/fd.c:1073 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "" @@ -20824,196 +24170,308 @@ msgstr "" "그램ì—서 너무 ë§Žì€ íŒŒì¼ì„ ì—´ì–´ ë‘ê³  있습니다. 다른 í”„ë¡œê·¸ëž¨ë“¤ì„ ì¢€ ë‹«ê³  다시 " "시ë„í•´ 보십시오" -#: storage/file/fd.c:972 +#: storage/file/fd.c:1074 #, c-format -msgid "System allows %d, we need at least %d." +msgid "System allows %d, server needs at least %d." msgstr "시스템 허용치 %d, 서버 최소 허용치 %d." -#: storage/file/fd.c:1023 storage/file/fd.c:2357 storage/file/fd.c:2467 -#: storage/file/fd.c:2618 +#: storage/file/fd.c:1162 storage/file/fd.c:2618 storage/file/fd.c:2727 +#: storage/file/fd.c:2878 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "" "ì—´ë ¤ 있는 파ì¼ì´ 너무 많습니다: %m; 다른 í”„ë¡œê·¸ëž¨ë“¤ì„ ì¢€ ë‹«ê³  다시 시ë„í•´ ë³´" "십시오" -#: storage/file/fd.c:1397 +#: storage/file/fd.c:1536 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "임시 파ì¼: 경로 \"%s\", í¬ê¸° %lu" -#: storage/file/fd.c:1528 +#: storage/file/fd.c:1675 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "\"%s\" 임시 디렉터리를 만들 수 ì—†ìŒ: %m" -#: storage/file/fd.c:1535 +#: storage/file/fd.c:1682 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "\"%s\" 임시 하위 디렉터리를 만들 수 ì—†ìŒ: %m" -#: storage/file/fd.c:1728 +#: storage/file/fd.c:1879 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "\"%s\" 임시 파ì¼ì„ 만들 수 없습니다: %m" -#: storage/file/fd.c:1763 +#: storage/file/fd.c:1915 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "\"%s\" 임시 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: storage/file/fd.c:1804 +#: storage/file/fd.c:1956 +#, c-format +msgid "could not unlink temporary file \"%s\": %m" +msgstr "\"%s\" 임시 파ì¼ì„ 지울 수 ì—†ìŒ: %m" + +#: storage/file/fd.c:2044 +#, c-format +msgid "could not delete file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 지울 수 ì—†ìŒ: %m" + +#: storage/file/fd.c:2234 +#, c-format +msgid "temporary file size exceeds temp_file_limit (%dkB)" +msgstr "임시 íŒŒì¼ í¬ê¸°ê°€ temp_file_limit (%dkB)를 초과했습니다" + +#: storage/file/fd.c:2594 storage/file/fd.c:2653 +#, c-format +msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" +msgstr "maxAllocatedDescs (%d) 초과ë¨, \"%s\" íŒŒì¼ ì—´ê¸° ì‹œë„ ì¤‘ì—." + +#: storage/file/fd.c:2698 +#, c-format +msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" +msgstr "maxAllocatedDescs (%d) 초과ë¨, \"%s\" ëª…ë ¹ì„ ì‹œë„ ì¤‘ì—." + +#: storage/file/fd.c:2854 +#, c-format +msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" +msgstr "maxAllocatedDescs (%d) 초과ë¨, \"%s\" 디렉터리 열기 ì‹œë„ ì¤‘ì—." + +#: storage/file/fd.c:3384 +#, c-format +msgid "unexpected file found in temporary-files directory: \"%s\"" +msgstr "임시 디렉터리ì—서 예ìƒì¹˜ 못한 íŒŒì¼ ë°œê²¬: \"%s\"" + +#: storage/file/fd.c:3502 +#, c-format +msgid "" +"syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" +msgstr "ë°ì´í„° 디렉터리 ë™ê¸°í™”(syncfs), 소요 시간: %ld.%02d s, 현재 경로: %s" + +#: storage/file/fd.c:3729 +#, c-format +msgid "" +"syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: " +"%s" +msgstr "" +"ë°ì´í„° 디렉터리 ë™ê¸°í™”(pre-fsync), 소요 시간: %ld.%02d s, 현재 경로: %s" + +#: storage/file/fd.c:3761 +#, c-format +msgid "" +"syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "ë°ì´í„° 디렉터리 ë™ê¸°í™”(fsync), 소요 시간: %ld.%02d s, 현재 경로: %s" + +#: storage/file/fd.c:3950 +#, c-format +msgid "\"debug_io_direct\" is not supported on this platform." +msgstr "\"debug_io_direct\" ì„¤ì •ì€ ì´ í”Œëž«í¼ì—서 ì§€ì›ë˜ì§€ 않ìŒ" + +#: storage/file/fd.c:3964 #, c-format -msgid "could not unlink temporary file \"%s\": %m" -msgstr "\"%s\" 임시 파ì¼ì„ 지울 수 ì—†ìŒ: %m" +msgid "Invalid list syntax in parameter \"%s\"" +msgstr "\"%s\" 매개 ë³€ìˆ˜ì˜ ê°’ìœ¼ë¡œ ëª©ë¡ ë¬¸ë²•ì´ ìž˜ëª»ë¨" -#: storage/file/fd.c:2068 +#: storage/file/fd.c:3984 #, c-format -msgid "temporary file size exceeds temp_file_limit (%dkB)" -msgstr "임시 íŒŒì¼ í¬ê¸°ê°€ temp_file_limit (%dkB)를 초과했습니다" +msgid "Invalid option \"%s\"" +msgstr "\"%s\" ì˜µì…˜ì´ ìž˜ëª»ë¨" -#: storage/file/fd.c:2333 storage/file/fd.c:2392 +#: storage/file/fd.c:3997 #, c-format -msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" +msgid "" +"\"debug_io_direct\" is not supported for WAL because XLOG_BLCKSZ is too small" msgstr "" +"XLOG_BLCKSZ ê°’ì´ ë„ˆë¬´ ìž‘ì€ WALì„ ì‚¬ìš©í•˜ê³  있어 \"debug_io_direct\" ê¸°ëŠ¥ì„ ì§€ì›í•˜" +"ì§€ 않습니다." -#: storage/file/fd.c:2437 +#: storage/file/fd.c:4004 #, c-format -msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" -msgstr "" +msgid "" +"\"debug_io_direct\" is not supported for data because BLCKSZ is too small" +msgstr "BLCKSZ ê°’ì´ ë„ˆë¬´ 작아 \"debug_io_direct\" ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않습니다." -#: storage/file/fd.c:2594 +#: storage/file/reinit.c:145 #, c-format -msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" +msgid "" +"resetting unlogged relations (init), elapsed time: %ld.%02d s, current path: " +"%s" msgstr "" +"로그 안남기는 릴레ì´ì…˜ 재설정 (init), 소요 시간: %ld.%02d s, 현재 경로: %s" -#: storage/file/fd.c:3122 +#: storage/file/reinit.c:148 #, c-format -msgid "unexpected file found in temporary-files directory: \"%s\"" -msgstr "임시 디렉터리ì—서 예ìƒì¹˜ 못한 íŒŒì¼ ë°œê²¬: \"%s\"" +msgid "" +"resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current " +"path: %s" +msgstr "" +"로그 안남기는 릴레ì´ì…˜ 재설정 (cleanup), 소요 시간: %ld.%02d s, 현재 경로: %s" -#: storage/file/sharedfileset.c:111 +#: storage/file/sharedfileset.c:73 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "SharedFileSet 확보 실패, ì´ë¯¸ ì‚­ì œë˜ì—ˆìŒ" -#: storage/ipc/dsm.c:338 +#: storage/ipc/dsm.c:379 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "ë™ì  공유 메모리 제어 ì¡°ê°ì´ ì†ìƒë˜ì—ˆìŒ" -#: storage/ipc/dsm.c:399 +#: storage/ipc/dsm.c:444 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "ë™ì  공유 메모리 제어 ì¡°ê°ì´ 타당하지 않ìŒ" -#: storage/ipc/dsm.c:494 +#: storage/ipc/dsm.c:626 #, c-format msgid "too many dynamic shared memory segments" msgstr "너무 ë§Žì€ ë™ì  공유 메모리 ì¡°ê°ì´ 있ìŒ" -#: storage/ipc/dsm_impl.c:230 storage/ipc/dsm_impl.c:526 -#: storage/ipc/dsm_impl.c:630 storage/ipc/dsm_impl.c:801 +#: storage/ipc/dsm_impl.c:231 storage/ipc/dsm_impl.c:537 +#: storage/ipc/dsm_impl.c:641 storage/ipc/dsm_impl.c:812 #, c-format msgid "could not unmap shared memory segment \"%s\": %m" msgstr "\"%s\" 공유 메모리 ì¡°ê°ì„ unmap í•  수 ì—†ìŒ: %m" -#: storage/ipc/dsm_impl.c:240 storage/ipc/dsm_impl.c:536 -#: storage/ipc/dsm_impl.c:640 storage/ipc/dsm_impl.c:811 +#: storage/ipc/dsm_impl.c:241 storage/ipc/dsm_impl.c:547 +#: storage/ipc/dsm_impl.c:651 storage/ipc/dsm_impl.c:822 #, c-format msgid "could not remove shared memory segment \"%s\": %m" msgstr "\"%s\" 공유 메모리 ì¡°ê°ì„ 삭제할 수 ì—†ìŒ: %m" -#: storage/ipc/dsm_impl.c:264 storage/ipc/dsm_impl.c:711 -#: storage/ipc/dsm_impl.c:825 +#: storage/ipc/dsm_impl.c:265 storage/ipc/dsm_impl.c:722 +#: storage/ipc/dsm_impl.c:836 #, c-format msgid "could not open shared memory segment \"%s\": %m" msgstr "\"%s\" 공유 메모리 ì¡°ê°ì„ ì—´ 수 ì—†ìŒ: %m" -#: storage/ipc/dsm_impl.c:289 storage/ipc/dsm_impl.c:552 -#: storage/ipc/dsm_impl.c:756 storage/ipc/dsm_impl.c:849 +#: storage/ipc/dsm_impl.c:290 storage/ipc/dsm_impl.c:563 +#: storage/ipc/dsm_impl.c:767 storage/ipc/dsm_impl.c:860 #, c-format msgid "could not stat shared memory segment \"%s\": %m" msgstr "\"%s\" 공유 메모리 ì¡°ê° íŒŒì¼ì˜ ìƒíƒœë¥¼ 알 수 ì—†ìŒ: %m" -#: storage/ipc/dsm_impl.c:316 storage/ipc/dsm_impl.c:900 +#: storage/ipc/dsm_impl.c:309 storage/ipc/dsm_impl.c:911 #, c-format msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" msgstr "\"%s\" 공유 메모리 ì¡°ê° íŒŒì¼ì„ %zu ë°”ì´íŠ¸ë¡œ í¬ê¸° ì¡°ì ˆ í•  수 ì—†ìŒ: %m" -#: storage/ipc/dsm_impl.c:338 storage/ipc/dsm_impl.c:573 -#: storage/ipc/dsm_impl.c:732 storage/ipc/dsm_impl.c:922 +#: storage/ipc/dsm_impl.c:331 storage/ipc/dsm_impl.c:584 +#: storage/ipc/dsm_impl.c:743 storage/ipc/dsm_impl.c:933 #, c-format msgid "could not map shared memory segment \"%s\": %m" msgstr "\"%s\" 공유 메모리 ì¡°ê°ì„ map í•  수 ì—†ìŒ: %m" -#: storage/ipc/dsm_impl.c:508 +#: storage/ipc/dsm_impl.c:519 #, c-format msgid "could not get shared memory segment: %m" msgstr "공유 메모리 ì¡°ê°ì„ 가져올 수 ì—†ìŒ: %m" -#: storage/ipc/dsm_impl.c:696 +#: storage/ipc/dsm_impl.c:707 #, c-format msgid "could not create shared memory segment \"%s\": %m" msgstr "\"%s\" 공유 메모리 ì¡°ê°ì„ 만들 수 ì—†ìŒ: %m" -#: storage/ipc/dsm_impl.c:933 +#: storage/ipc/dsm_impl.c:944 #, c-format msgid "could not close shared memory segment \"%s\": %m" msgstr "\"%s\" 공유 메모리 ì¡°ê°ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: storage/ipc/dsm_impl.c:972 storage/ipc/dsm_impl.c:1020 +#: storage/ipc/dsm_impl.c:984 storage/ipc/dsm_impl.c:1033 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "\"%s\" ìš© 헨들러를 ì´ì¤‘í™” í•  수 ì—†ìŒ: %m" -#. translator: %s is a syscall name, such as "poll()" -#: storage/ipc/latch.c:940 storage/ipc/latch.c:1094 storage/ipc/latch.c:1307 -#: storage/ipc/latch.c:1457 storage/ipc/latch.c:1570 +#: storage/ipc/dsm_registry.c:142 +#, c-format +msgid "DSM segment name cannot be empty" +msgstr "DSM ì¡°ê° ì´ë¦„ì€ ë¹„ì›Œë‘˜ 수 ì—†ìŒ" + +#: storage/ipc/dsm_registry.c:146 +#, c-format +msgid "DSM segment name too long" +msgstr "DSM ì¡°ê° ì´ë¦„ì´ ë„ˆë¬´ 긺" + +#: storage/ipc/dsm_registry.c:150 +#, c-format +msgid "DSM segment size must be nonzero" +msgstr "DSM ì¡°ê° í¬ê¸°ëŠ” 0ì´ ì•„ë‹ˆì—¬ì•¼ 함" + +#: storage/ipc/dsm_registry.c:176 #, c-format -msgid "%s failed: %m" -msgstr "%s 실패: %m" +msgid "requested DSM segment size does not match size of existing segment" +msgstr "ìš”ì²­ëœ DSM ì¡°ê° í¬ê¸°ëŠ” 기존 ì¡°ê° í¬ê¸°ì™€ ë§žì§€ 않ìŒ" -#: storage/ipc/procarray.c:3014 +#: storage/ipc/procarray.c:488 storage/lmgr/proc.c:357 +#: tcop/backend_startup.c:304 +#, c-format +msgid "sorry, too many clients already" +msgstr "최대 ë™ì‹œ ì ‘ì†ìž 수를 초과했습니다." + +#: storage/ipc/procarray.c:3857 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ê°€ 미리 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì—서 사용중임" -#: storage/ipc/procarray.c:3046 storage/ipc/signalfuncs.c:142 +#: storage/ipc/procarray.c:3893 storage/ipc/procarray.c:3901 +#: storage/ipc/signalfuncs.c:235 storage/ipc/signalfuncs.c:242 #, c-format -msgid "must be a superuser to terminate superuser process" -msgstr "슈í¼ìœ ì €ì˜ ì„¸ì…˜ì„ ì •ë¦¬í•˜ë ¤ë©´ 슈í¼ìœ ì €ì—¬ì•¼ 합니다." +msgid "permission denied to terminate process" +msgstr "프로세스 종료 권한 ì—†ìŒ" -#: storage/ipc/procarray.c:3053 storage/ipc/signalfuncs.c:147 +#: storage/ipc/procarray.c:3894 storage/ipc/signalfuncs.c:236 #, c-format msgid "" -"must be a member of the role whose process is being terminated or member of " -"pg_signal_backend" +"Only roles with the %s attribute may terminate processes of roles with the " +"%s attribute." msgstr "" -"ì„¸ì…˜ì„ ì¢…ë£Œí•˜ë ¤ë©´ ì ‘ì†ìžì˜ ì†Œì† ë§´ë²„ì´ê±°ë‚˜ pg_signal_backend ì†Œì† ë§´ë²„ì—¬ì•¼ í•©" -"니다" +"%s ì†ì„±ì´ 있는 ë¡¤ë§Œì´ %s ì†ì„±ì„ 가진 ë¡¤ì´ ì‹¤í–‰í•œ 쿼리를 중지 í•  수 있습니다." + +#: storage/ipc/procarray.c:3902 storage/ipc/signalfuncs.c:243 +#, c-format +msgid "" +"Only roles with privileges of the role whose process is being terminated or " +"with privileges of the \"%s\" role may terminate this process." +msgstr "\"%s\" 롤 ê¶Œí•œì´ ìžˆëŠ” 롤만 프로세스를 종료할 수 있습니다." -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 -#: storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4175 -#: storage/lmgr/lock.c:4240 storage/lmgr/lock.c:4532 -#: storage/lmgr/predicate.c:2401 storage/lmgr/predicate.c:2416 -#: storage/lmgr/predicate.c:3898 storage/lmgr/predicate.c:5009 -#: utils/hash/dynahash.c:1067 +#: storage/ipc/procsignal.c:416 +#, c-format +msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" +msgstr "" +"%d PID 백엔드 프로세스가 ProcSignalBarrier ìž‘ì—…ì„ ìˆ˜ë½í•˜ê¸°ë¥¼ 기다리고 있ìŒ" + +#: storage/ipc/shm_mq.c:383 +#, c-format +msgid "cannot send a message of size %zu via shared memory queue" +msgstr "공유 메모리 í를 통해 %zu í¬ê¸°ì˜ 메시지를 보낼 수 ì—†ìŒ" + +#: storage/ipc/shm_mq.c:718 +#, c-format +msgid "invalid message size %zu in shared memory queue" +msgstr "ë™ì  공유 메모리 íì— ë©”ì‹œì§€ 길ì´(%zu)ê°€ 잘못ë¨" + +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:984 +#: storage/lmgr/lock.c:1022 storage/lmgr/lock.c:2835 storage/lmgr/lock.c:4220 +#: storage/lmgr/lock.c:4285 storage/lmgr/lock.c:4635 +#: storage/lmgr/predicate.c:2468 storage/lmgr/predicate.c:2483 +#: storage/lmgr/predicate.c:3880 storage/lmgr/predicate.c:4927 +#: utils/hash/dynahash.c:1095 #, c-format msgid "out of shared memory" msgstr "공유 메모리 부족" -#: storage/ipc/shmem.c:170 storage/ipc/shmem.c:266 +#: storage/ipc/shmem.c:161 storage/ipc/shmem.c:257 #, c-format msgid "out of shared memory (%zu bytes requested)" msgstr "공유 메모리가 부족함 (%zu ë°”ì´íŠ¸ê°€ 필요함)" -#: storage/ipc/shmem.c:441 +#: storage/ipc/shmem.c:436 #, c-format msgid "could not create ShmemIndex entry for data structure \"%s\"" msgstr "\"%s\" ìžë£Œ 구조체용 ShmemIndex í•­ëª©ì„ ë§Œë“¤ 수 ì—†ìŒ" -#: storage/ipc/shmem.c:456 +#: storage/ipc/shmem.c:451 #, c-format msgid "" "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, " @@ -21021,332 +24479,382 @@ msgid "" msgstr "" "\"%s\" ìžë£Œ 구조체용 ShmemIndex 항목 í¬ê¸°ê°€ 잘못ë¨: 기대값 %zu, 현재값 %zu" -#: storage/ipc/shmem.c:475 +#: storage/ipc/shmem.c:470 #, c-format msgid "" "not enough shared memory for data structure \"%s\" (%zu bytes requested)" msgstr "\"%s\" ìžë£Œ 구조체용 공유 메모리가 부족함 (%zu ë°”ì´íŠ¸ê°€ 필요함)" -#: storage/ipc/shmem.c:507 storage/ipc/shmem.c:526 +#: storage/ipc/shmem.c:502 storage/ipc/shmem.c:521 #, c-format msgid "requested shared memory size overflows size_t" msgstr "지정한 공유 메모리 사ì´ì¦ˆê°€ size_t í¬ê¸°ë¥¼ 초과했습니다" -#: storage/ipc/signalfuncs.c:67 +#: storage/ipc/signalfuncs.c:72 #, c-format -msgid "PID %d is not a PostgreSQL server process" -msgstr "PID %d í”„ë¡œê·¸ëž¨ì€ PostgreSQL 서버 프로세스가 아닙니다" +msgid "PID %d is not a PostgreSQL backend process" +msgstr "PID %d í”„ë¡œê·¸ëž¨ì€ PostgreSQL 백엔드 프로세스가 아닙니다" -#: storage/ipc/signalfuncs.c:98 storage/lmgr/proc.c:1366 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1453 +#: utils/adt/mcxtfuncs.c:182 #, c-format msgid "could not send signal to process %d: %m" msgstr "%d 프로세스로 시스템신호(signal)를 보낼 수 없습니다: %m" -#: storage/ipc/signalfuncs.c:118 +#: storage/ipc/signalfuncs.c:129 storage/ipc/signalfuncs.c:136 #, c-format -msgid "must be a superuser to cancel superuser query" -msgstr "슈í¼ìœ ì €ì˜ 쿼리를 중지하려면 슈í¼ìœ ì €ì—¬ì•¼ 합니다." +msgid "permission denied to cancel query" +msgstr "쿼리 중지 권한 ì—†ìŒ" -#: storage/ipc/signalfuncs.c:123 +#: storage/ipc/signalfuncs.c:130 #, c-format msgid "" -"must be a member of the role whose query is being canceled or member of " -"pg_signal_backend" +"Only roles with the %s attribute may cancel queries of roles with the %s " +"attribute." msgstr "" -"쿼리 작업 취소하려면 작업ìžì˜ ì†Œì† ë§´ë²„ì´ê±°ë‚˜ pg_signal_backend ì†Œì† ë§´ë²„ì—¬" -"야 합니다" +"%s ì†ì„±ì´ 있는 ë¡¤ë§Œì´ %s ì†ì„±ì´ 있는 ë¡¤ì´ ì‹¤í–‰í•œ 쿼리를 중지 í•  수 있습니다." -#: storage/ipc/signalfuncs.c:183 +#: storage/ipc/signalfuncs.c:137 #, c-format -msgid "must be superuser to rotate log files with adminpack 1.0" -msgstr "" -"adminpack 1.0 확장 ëª¨ë“ˆì„ ì‚¬ìš©í•˜ë©´ 로그 전환하려면 슈í¼ìœ ì €ì—¬ì•¼ 합니다." +msgid "" +"Only roles with privileges of the role whose query is being canceled or with " +"privileges of the \"%s\" role may cancel this query." +msgstr "쿼리 실행 중지 ìž‘ì—…ì€ \"%s\" 롤 ê¶Œí•œì´ ë¶€ì—¬ëœ ë¡¤ë§Œ í•  수 있습니다." -#. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:185 utils/adt/genfile.c:253 +#: storage/ipc/signalfuncs.c:179 +#, c-format +msgid "could not check the existence of the backend with PID %d: %m" +msgstr "%d PID 백엔드 í”„ë¡œì„¸ìŠ¤ì˜ ì¡´ìž¬ë¥¼ 확ì¸í•  수 ì—†ìŒ: %m" + +#: storage/ipc/signalfuncs.c:197 +#, c-format +msgid "backend with PID %d did not terminate within %lld millisecond" +msgid_plural "backend with PID %d did not terminate within %lld milliseconds" +msgstr[0] "%d PID 백엔드 프로세스를 %lld ms ë‚´ì— ì¢…ë£Œí•˜ì§€ 못했ìŒ" + +#: storage/ipc/signalfuncs.c:228 #, c-format -msgid "Consider using %s, which is part of core, instead." -msgstr "ëŒ€ì‹ ì— %s 내장 함수를 사용할 ê²ƒì„ ê¶Œê³ í•©ë‹ˆë‹¤." +msgid "\"timeout\" must not be negative" +msgstr "\"timeout\" ê°’ì€ ìŒìˆ˜ê°€ 아니어야 함" -#: storage/ipc/signalfuncs.c:191 storage/ipc/signalfuncs.c:211 +#: storage/ipc/signalfuncs.c:285 #, c-format msgid "rotation not possible because log collection not active" msgstr "로그 ìˆ˜ì§‘ì´ í™œì„± ìƒíƒœê°€ 아니므로 회전할 수 ì—†ìŒ" -#: storage/ipc/standby.c:580 tcop/postgres.c:3177 +#: storage/ipc/standby.c:329 +#, c-format +msgid "recovery still waiting after %ld.%03d ms: %s" +msgstr "%ld.%03d ms 기다린 ë’¤ì—ë„ ì—¬ì „ížˆ 복구 중: %s" + +#: storage/ipc/standby.c:338 +#, c-format +msgid "recovery finished waiting after %ld.%03d ms: %s" +msgstr "%ld.%03d ms 기다려서 복구 완료: %s" + +#: storage/ipc/standby.c:920 tcop/postgres.c:3196 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "복구 작업 중 ì¶©ëŒì´ ë°œìƒí•´ ìž‘ì—…ì„ ì¤‘ì§€í•©ë‹ˆë‹¤." -#: storage/ipc/standby.c:581 tcop/postgres.c:2469 +#: storage/ipc/standby.c:921 tcop/postgres.c:2557 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "복구 작업 중 ì‚¬ìš©ìž íŠ¸ëžœìž­ì…˜ì´ ë²„í¼ ë°ë“œë½ì„ 만들었습니다." -#: storage/large_object/inv_api.c:191 +#: storage/ipc/standby.c:1486 +msgid "unknown reason" +msgstr "알 수 없는 ì´ìœ " + +#: storage/ipc/standby.c:1491 +msgid "recovery conflict on buffer pin" +msgstr "ë²„í¼ í•€ì—서 복구 ì¶©ëŒ" + +#: storage/ipc/standby.c:1494 +msgid "recovery conflict on lock" +msgstr "잠금ì—서 복구 ì¶©ëŒ" + +#: storage/ipc/standby.c:1497 +msgid "recovery conflict on tablespace" +msgstr "í…Œì´ë¸”스페ì´ìФì—서 복구 ì¶©ëŒ" + +#: storage/ipc/standby.c:1500 +msgid "recovery conflict on snapshot" +msgstr "스냅샷ì—서 복구 ì¶©ëŒ" + +#: storage/ipc/standby.c:1503 +msgid "recovery conflict on replication slot" +msgstr "복제 슬롯ì—서 복구 ì¶©ëŒ" + +#: storage/ipc/standby.c:1506 +msgid "recovery conflict on buffer deadlock" +msgstr "ë²„í¼ ë°ë“œë½ì—서 복구 ì¶©ëŒ" + +#: storage/ipc/standby.c:1509 +msgid "recovery conflict on database" +msgstr "ë°ì´í„°ë² ì´ìФì—서 복구 ì¶©ëŒ" + +#: storage/large_object/inv_api.c:190 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "" +"OID %u (해당 페ì´ì§€ %d) 를 위한 pg_largeobject í•­ëª©ì˜ %d í¬ê¸°ì˜ ë°ì´í„° 필드" +"ê°€ 잘못ë˜ì—ˆìŒ" #: storage/large_object/inv_api.c:272 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "대형 개체를 열기 위한 플래그가 잘못 ë¨: %d" -#: storage/large_object/inv_api.c:462 +#: storage/large_object/inv_api.c:297 storage/large_object/inv_api.c:309 +#: storage/large_object/inv_api.c:506 storage/large_object/inv_api.c:617 +#: storage/large_object/inv_api.c:807 +#, c-format +msgid "permission denied for large object %u" +msgstr "%u 대형 ê°œì²´ì— ëŒ€í•œ ì ‘ê·¼ 권한 ì—†ìŒ" + +#: storage/large_object/inv_api.c:455 #, c-format msgid "invalid whence setting: %d" -msgstr "" +msgstr "ìž˜ëª»ëœ ì´ë™ 위치: %d" -#: storage/large_object/inv_api.c:634 +#: storage/large_object/inv_api.c:627 #, c-format msgid "invalid large object write request size: %d" msgstr "유효하지 ì•Šì€ ëŒ€í˜• ê°œì²´ì˜ ì“°ê¸° ìš”ì²­ëœ í¬ê¸°: %d" -#: storage/lmgr/deadlock.c:1124 +#: storage/lmgr/deadlock.c:1104 #, c-format msgid "Process %d waits for %s on %s; blocked by process %d." msgstr "" "%d 프로세스가 %s ìƒíƒœë¡œ 지연ë˜ê³  있ìŒ(해당 작업: %s); %d í”„ë¡œì„¸ìŠ¤ì— ì˜í•´ 블ë¡" "킹ë˜ì—ˆìŒ" -#: storage/lmgr/deadlock.c:1143 +#: storage/lmgr/deadlock.c:1123 #, c-format msgid "Process %d: %s" msgstr "프로세스 %d: %s" -#: storage/lmgr/deadlock.c:1152 +#: storage/lmgr/deadlock.c:1132 #, c-format msgid "deadlock detected" msgstr "deadlock ë°œìƒí–ˆìŒ" -#: storage/lmgr/deadlock.c:1155 +#: storage/lmgr/deadlock.c:1135 #, c-format msgid "See server log for query details." msgstr "쿼리 ìƒì„¸ 정보는 서버 로그를 참조하십시오." -#: storage/lmgr/lmgr.c:830 +#: storage/lmgr/lmgr.c:848 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "%u,%u 튜플(해당 릴레ì´ì…˜ \"%s\")ì„ ê°±ì‹ í•˜ëŠ” ì¤‘ì— ë°œìƒ" -#: storage/lmgr/lmgr.c:833 +#: storage/lmgr/lmgr.c:851 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "%u,%u 튜플(해당 릴레ì´ì…˜ \"%s\")ì„ ì‚­ì œí•˜ëŠ” ì¤‘ì— ë°œìƒ" -#: storage/lmgr/lmgr.c:836 +#: storage/lmgr/lmgr.c:854 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "%u,%u íŠœí”Œì„ \"%s\" 릴레ì´ì…˜ì—서 잠그는 ì¤‘ì— ë°œìƒ" -#: storage/lmgr/lmgr.c:839 +#: storage/lmgr/lmgr.c:857 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "%u,%u ì—…ë°ì´íŠ¸ëœ ë²„ì „ 튜플(해당 릴레ì´ì…˜ \"%s\")ì„ ìž ê·¸ëŠ” ì¤‘ì— ë°œìƒ" -#: storage/lmgr/lmgr.c:842 +#: storage/lmgr/lmgr.c:860 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "%u,%u 튜플 ì¸ë±ìФ(해당 릴레ì´ì…˜ \"%s\")를 삽입하는 ì¤‘ì— ë°œìƒ" -#: storage/lmgr/lmgr.c:845 +#: storage/lmgr/lmgr.c:863 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "%u,%u 튜플(해당 릴레ì´ì…˜: \"%s\")ì˜ ê³ ìœ ì„±ì„ ê²€ì‚¬í•˜ëŠ” ì¤‘ì— ë°œìƒ" -#: storage/lmgr/lmgr.c:848 +#: storage/lmgr/lmgr.c:866 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "%u,%u ê°±ì‹ ëœ íŠœí”Œ(해당 릴레ì´ì…˜: \"%s\")ì„ ìž¬í™•ì¸í•˜ëŠ” ì¤‘ì— ë°œìƒ" -#: storage/lmgr/lmgr.c:851 +#: storage/lmgr/lmgr.c:869 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "" "%u,%u 튜플(해당 릴레ì´ì…˜: \"%s\")ì˜ ì œì™¸ 제약 ì¡°ê±´ì„ ê²€ì‚¬í•˜ëŠ” ì¤‘ì— ë°œìƒ" -#: storage/lmgr/lmgr.c:1106 +#: storage/lmgr/lmgr.c:1239 #, c-format msgid "relation %u of database %u" msgstr "릴레ì´ì…˜ %u, ë°ì´í„°ë² ì´ìФ %u" -#: storage/lmgr/lmgr.c:1112 +#: storage/lmgr/lmgr.c:1245 #, c-format msgid "extension of relation %u of database %u" msgstr "%u 관계(%u ë°ì´í„°ë² ì´ìФ) 확장" -#: storage/lmgr/lmgr.c:1118 +#: storage/lmgr/lmgr.c:1251 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "ë°ì´í„°ë² ì´ìФ %uì˜ pg_database.datfrozenxid" -#: storage/lmgr/lmgr.c:1123 +#: storage/lmgr/lmgr.c:1256 #, c-format msgid "page %u of relation %u of database %u" msgstr "페ì´ì§€ %u, 릴레ì´ì…˜ %u, ë°ì´í„°ë² ì´ìФ %u" -#: storage/lmgr/lmgr.c:1130 +#: storage/lmgr/lmgr.c:1263 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "튜플 (%u,%u), 릴레ì´ì…˜ %u, ë°ì´í„°ë² ì´ìФ %u" -#: storage/lmgr/lmgr.c:1138 +#: storage/lmgr/lmgr.c:1271 #, c-format msgid "transaction %u" msgstr "트랜잭션 %u" -#: storage/lmgr/lmgr.c:1143 +#: storage/lmgr/lmgr.c:1276 #, c-format msgid "virtual transaction %d/%u" msgstr "ê°€ìƒ íŠ¸ëžœìž­ì…˜ %d/%u" -#: storage/lmgr/lmgr.c:1149 +#: storage/lmgr/lmgr.c:1282 #, c-format msgid "speculative token %u of transaction %u" msgstr "%u 위험한 토í°, ëŒ€ìƒ íŠ¸ëžœìž­ì…˜ %u" -#: storage/lmgr/lmgr.c:1155 +#: storage/lmgr/lmgr.c:1288 #, c-format msgid "object %u of class %u of database %u" msgstr "개체 %u, í´ëž˜ìФ %u, ë°ì´í„°ë² ì´ìФ %u" -#: storage/lmgr/lmgr.c:1163 +#: storage/lmgr/lmgr.c:1296 #, c-format msgid "user lock [%u,%u,%u]" msgstr "user lock [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1170 +#: storage/lmgr/lmgr.c:1303 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "advisory lock [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1178 +#: storage/lmgr/lmgr.c:1311 +#, c-format +msgid "remote transaction %u of subscription %u of database %u" +msgstr "ì›ê²© 트랜잭션: %u, 해당 구ë…: %u, 해당 ë°ì´í„°ë² ì´ìФ %u" + +#: storage/lmgr/lmgr.c:1318 #, c-format msgid "unrecognized locktag type %d" msgstr "알 수 없는 locktag 형태 %d" -#: storage/lmgr/lock.c:803 +#: storage/lmgr/lock.c:812 #, c-format msgid "" "cannot acquire lock mode %s on database objects while recovery is in progress" -msgstr "" +msgstr "복구 작업 중 ë°ì´í„°ë² ì´ìФ ê°ì²´ ëŒ€ìƒ %s 잠금 ìƒíƒœ ì·¨ë“ ì‹¤íŒ¨" -#: storage/lmgr/lock.c:805 +#: storage/lmgr/lock.c:814 #, c-format msgid "" "Only RowExclusiveLock or less can be acquired on database objects during " "recovery." msgstr "" +"복구 중ì—는 해당 ê°ì²´ë¥¼ RowExclusiveLock ë˜ëŠ” ê·¸ 보다 ë‚®ì€ ìˆ˜ì¤€ì˜ ìž ê¸ˆë§Œ í•  " +"수 있습니다." -#: storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 storage/lmgr/lock.c:2846 -#: storage/lmgr/lock.c:4176 storage/lmgr/lock.c:4241 storage/lmgr/lock.c:4533 -#, c-format -msgid "You might need to increase max_locks_per_transaction." -msgstr "max_locks_per_transactionì„ ëŠ˜ë ¤ì•¼ í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." - -#: storage/lmgr/lock.c:3292 storage/lmgr/lock.c:3408 +#: storage/lmgr/lock.c:3284 storage/lmgr/lock.c:3352 storage/lmgr/lock.c:3468 #, c-format msgid "" "cannot PREPARE while holding both session-level and transaction-level locks " "on the same object" msgstr "" +"세션 수준과 트랜잭션 수준, ì´ ë‘ ìˆ˜ì¤€ì˜ ìž ê¸ˆì„ ê°™ì€ ê°ì²´ 대ìƒìœ¼ë¡œ í•  경우 " +"PREPARE ìž‘ì—…ì€ í•  수 없습니다." -#: storage/lmgr/predicate.c:700 +#: storage/lmgr/predicate.c:653 #, c-format msgid "not enough elements in RWConflictPool to record a read/write conflict" -msgstr "" +msgstr "ì½ê¸°/쓰기 ì¶©ëŒì„ 기ë¡í•˜ê¸° 위한 RWConflictPool ì•ˆì— ì¶©ë¶„í•œ 요소가 ì—†ìŒ" -#: storage/lmgr/predicate.c:701 storage/lmgr/predicate.c:729 +#: storage/lmgr/predicate.c:654 storage/lmgr/predicate.c:679 #, c-format msgid "" "You might need to run fewer transactions at a time or increase " -"max_connections." -msgstr "" +"\"max_connections\"." +msgstr "ë™ì‹œ ë°œìƒí•˜ëŠ” 트랜잭션 수를 줄ì´ë“ ê°€, \"max_connections\" ê°’ì„ ëŠ˜ë¦¬ì„¸ìš”." -#: storage/lmgr/predicate.c:728 +#: storage/lmgr/predicate.c:678 #, c-format msgid "" "not enough elements in RWConflictPool to record a potential read/write " "conflict" msgstr "" +"필수ì ì¸ ì½ê¸°/쓰기 ì¶©ëŒì„ 기ë¡í•˜ê¸° 위한 RWConflictPool ì•ˆì— ì¶©ë¶„í•œ 요소가 ì—†" +"ìŒ" -#: storage/lmgr/predicate.c:1535 -#, c-format -msgid "deferrable snapshot was unsafe; trying a new one" -msgstr "" - -#: storage/lmgr/predicate.c:1624 +#: storage/lmgr/predicate.c:1686 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "" +"\"default_transaction_isolation\" ì„¤ì •ê°’ì´ \"serializable\"로 지정ë˜ì—ˆìŠµë‹ˆë‹¤." -#: storage/lmgr/predicate.c:1625 +#: storage/lmgr/predicate.c:1687 #, c-format msgid "" "You can use \"SET default_transaction_isolation = 'repeatable read'\" to " "change the default." msgstr "" +"ì´ ê¸°ë³¸ê°’ì€ \"SET default_transaction_isolation = 'repeatable read'\" 명령으" +"로 바꿀 수 있습니다." -#: storage/lmgr/predicate.c:1676 +#: storage/lmgr/predicate.c:1738 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "" +"스냅샷 가져오기 íŠ¸ëžœìž­ì…˜ì€ READ ONLY DEFERRABLE ì†ì„±ì´ 아니여야 합니다." -#: storage/lmgr/predicate.c:1755 utils/time/snapmgr.c:623 -#: utils/time/snapmgr.c:629 +#: storage/lmgr/predicate.c:1817 utils/time/snapmgr.c:535 +#: utils/time/snapmgr.c:541 #, c-format msgid "could not import the requested snapshot" -msgstr "" +msgstr "요청한 스냅샷 가지오기 실패" -#: storage/lmgr/predicate.c:1756 utils/time/snapmgr.c:630 +#: storage/lmgr/predicate.c:1818 utils/time/snapmgr.c:542 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "%d PID 소스 프로세스는 ë”ì´ìƒ 실행 중ì´ì§€ 않습니다." -#: storage/lmgr/predicate.c:2402 storage/lmgr/predicate.c:2417 -#: storage/lmgr/predicate.c:3899 -#, c-format -msgid "You might need to increase max_pred_locks_per_transaction." -msgstr "max_pred_locks_per_transaction ê°’ì„ ëŠ˜ë ¤ì•¼ í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." - -#: storage/lmgr/predicate.c:4030 storage/lmgr/predicate.c:4066 -#: storage/lmgr/predicate.c:4099 storage/lmgr/predicate.c:4107 -#: storage/lmgr/predicate.c:4146 storage/lmgr/predicate.c:4388 -#: storage/lmgr/predicate.c:4725 storage/lmgr/predicate.c:4737 -#: storage/lmgr/predicate.c:4780 storage/lmgr/predicate.c:4818 +#: storage/lmgr/predicate.c:3991 storage/lmgr/predicate.c:4027 +#: storage/lmgr/predicate.c:4060 storage/lmgr/predicate.c:4068 +#: storage/lmgr/predicate.c:4107 storage/lmgr/predicate.c:4337 +#: storage/lmgr/predicate.c:4656 storage/lmgr/predicate.c:4668 +#: storage/lmgr/predicate.c:4715 storage/lmgr/predicate.c:4751 #, c-format msgid "" "could not serialize access due to read/write dependencies among transactions" msgstr "트랜잭션간 ì½ê¸°/쓰기 ì˜ì¡´ì„± ë•Œë¬¸ì— serialize ì ‘ê·¼ì„ í•  수 ì—†ìŒ" -#: storage/lmgr/predicate.c:4032 storage/lmgr/predicate.c:4068 -#: storage/lmgr/predicate.c:4101 storage/lmgr/predicate.c:4109 -#: storage/lmgr/predicate.c:4148 storage/lmgr/predicate.c:4390 -#: storage/lmgr/predicate.c:4727 storage/lmgr/predicate.c:4739 -#: storage/lmgr/predicate.c:4782 storage/lmgr/predicate.c:4820 +#: storage/lmgr/predicate.c:3993 storage/lmgr/predicate.c:4029 +#: storage/lmgr/predicate.c:4062 storage/lmgr/predicate.c:4070 +#: storage/lmgr/predicate.c:4109 storage/lmgr/predicate.c:4339 +#: storage/lmgr/predicate.c:4658 storage/lmgr/predicate.c:4670 +#: storage/lmgr/predicate.c:4717 storage/lmgr/predicate.c:4753 #, c-format msgid "The transaction might succeed if retried." msgstr "재시ë„하면 ê·¸ íŠ¸ëžœìž­ì…˜ì´ ì„±ê³µí•  것입니다." -#: storage/lmgr/proc.c:358 +#: storage/lmgr/proc.c:353 #, c-format msgid "" -"number of requested standby connections exceeds max_wal_senders (currently " -"%d)" -msgstr "대기 서버 ì—°ê²° 수가 max_wal_senders 설정값(현재 %d)ì„ ì´ˆê³¼í–ˆìŠµë‹ˆë‹¤" - -#: storage/lmgr/proc.c:1337 -#, c-format -msgid "Process %d waits for %s on %s." -msgstr "%d 프로세스가 대기중, 잠금종류: %s, ë‚´ìš©: %s" - -#: storage/lmgr/proc.c:1348 -#, c-format -msgid "sending cancel to blocking autovacuum PID %d" -msgstr "%d PID autovacuum 블럭킹하기 위해 취소 신호를 보냅니다" +"number of requested standby connections exceeds \"max_wal_senders\" " +"(currently %d)" +msgstr "대기 서버 ì—°ê²° 수가 \"max_wal_senders\" 설정값(현재 %d)ì„ ì´ˆê³¼í–ˆìŠµë‹ˆë‹¤" -#: storage/lmgr/proc.c:1468 +#: storage/lmgr/proc.c:1546 #, c-format msgid "" "process %d avoided deadlock for %s on %s by rearranging queue order after " @@ -21355,220 +24863,343 @@ msgstr "" "%d PID 프로세스는 %s(%s)ì— ëŒ€í•´ êµì°© ìƒíƒœê°€ ë°œìƒí•˜ì§€ 않ë„ë¡ %ld.%03dms í›„ì— " "대기열 순서를 다시 조정함" -#: storage/lmgr/proc.c:1483 +#: storage/lmgr/proc.c:1561 #, c-format msgid "" "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "%d PID 프로세스ì—서 %s(%s) 대기중 %ld.%03dms í›„ì— êµì°© ìƒíƒœë¥¼ ê°ì§€í•¨" -#: storage/lmgr/proc.c:1492 +#: storage/lmgr/proc.c:1570 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "%d PID 프로세스ì—서 여전히 %s(%s) ìž‘ì—…ì„ ê¸°ë‹¤ë¦¬ê³  있ìŒ(%ld.%03dms 후)" -#: storage/lmgr/proc.c:1499 +#: storage/lmgr/proc.c:1577 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "%d PID 프로세스가 %s(%s) ìž‘ì—…ì„ ìœ„í•´ 잠금 ì·¨ë“함(%ld.%03dms 후)" -#: storage/lmgr/proc.c:1515 +#: storage/lmgr/proc.c:1594 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "프로세스 %dì—서 %s(%s)ì„(를) ì·¨ë“하지 못함(%ld.%03dms 후)" -#: storage/page/bufpage.c:145 +#: storage/page/bufpage.c:152 #, c-format msgid "page verification failed, calculated checksum %u but expected %u" msgstr "페ì´ì§€ 검사 실패, ê³„ì‚°ëœ ì²´í¬ì„¬ì€ %u, ê¸°ëŒ€ê°’ì€ %u" -#: storage/page/bufpage.c:209 storage/page/bufpage.c:503 -#: storage/page/bufpage.c:740 storage/page/bufpage.c:873 -#: storage/page/bufpage.c:969 storage/page/bufpage.c:1081 +#: storage/page/bufpage.c:217 storage/page/bufpage.c:730 +#: storage/page/bufpage.c:1073 storage/page/bufpage.c:1208 +#: storage/page/bufpage.c:1314 storage/page/bufpage.c:1426 #, c-format msgid "corrupted page pointers: lower = %u, upper = %u, special = %u" msgstr "ì†ìƒëœ 페ì´ì§€ 위치: 하위값 = %u, ìƒìœ„ê°’ = %u, 특수값 = %u" -#: storage/page/bufpage.c:525 +#: storage/page/bufpage.c:759 #, c-format msgid "corrupted line pointer: %u" msgstr "ì†ìƒëœ 줄 위치: %u" -#: storage/page/bufpage.c:552 storage/page/bufpage.c:924 +#: storage/page/bufpage.c:789 storage/page/bufpage.c:1266 #, c-format msgid "corrupted item lengths: total %u, available space %u" msgstr "ì†ìƒëœ ì•„ì´í…œ 길ì´: ì „ì²´ %u, 사용가능한 공간 %u" -#: storage/page/bufpage.c:759 storage/page/bufpage.c:897 -#: storage/page/bufpage.c:985 storage/page/bufpage.c:1097 +#: storage/page/bufpage.c:1092 storage/page/bufpage.c:1233 +#: storage/page/bufpage.c:1330 storage/page/bufpage.c:1442 #, c-format msgid "corrupted line pointer: offset = %u, size = %u" msgstr "ì†ìƒëœ 줄 위치: 오프셋 = %u, í¬ê¸° = %u" -#: storage/smgr/md.c:333 storage/smgr/md.c:836 -#, c-format -msgid "could not truncate file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ 비울 수 ì—†ìŒ: %m" - -#: storage/smgr/md.c:407 +#: storage/smgr/md.c:485 storage/smgr/md.c:547 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "\"%s\" 파ì¼ì„ %uê°œ 블ë¡ì„ 초과하여 확장할 수 ì—†ìŒ" -#: storage/smgr/md.c:422 +#: storage/smgr/md.c:500 storage/smgr/md.c:611 #, c-format msgid "could not extend file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ 확장할 수 ì—†ìŒ: %m" -#: storage/smgr/md.c:424 storage/smgr/md.c:431 storage/smgr/md.c:719 -#, c-format -msgid "Check free disk space." -msgstr "ë””ìŠ¤í¬ ì—¬ìœ  ê³µê°„ì„ í™•ì¸í•´ 주십시오." - -#: storage/smgr/md.c:428 +#: storage/smgr/md.c:506 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "\"%s\" 파ì¼ì„ 확장할 수 ì—†ìŒ: %d/%dë°”ì´íŠ¸ë§Œ %u 블ë¡ì— ì¼ìŒ" -#: storage/smgr/md.c:640 +#: storage/smgr/md.c:589 #, c-format -msgid "could not read block %u in file \"%s\": %m" -msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì—서 ì½ì„ 수 ì—†ìŒ: %m" +msgid "could not extend file \"%s\" with FileFallocate(): %m" +msgstr "FileFallocate() 함수로 \"%s\" 파ì¼ì„ 확장할 수 ì—†ìŒ: %m" -#: storage/smgr/md.c:656 +#: storage/smgr/md.c:869 #, c-format -msgid "could not read block %u in file \"%s\": read only %d of %d bytes" -msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì—서 ì½ì„ 수 ì—†ìŒ: %d / %d ë°”ì´íŠ¸ë§Œ ì½ìŒ" +msgid "could not read blocks %u..%u in file \"%s\": %m" +msgstr "%u..%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì—서 ì½ì„ 수 ì—†ìŒ: %m" -#: storage/smgr/md.c:710 +#: storage/smgr/md.c:895 #, c-format -msgid "could not write block %u in file \"%s\": %m" -msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì— 쓸 수 ì—†ìŒ: %m" +msgid "could not read blocks %u..%u in file \"%s\": read only %zu of %zu bytes" +msgstr "%u..%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì—서 ì½ì„ 수 ì—†ìŒ: %zu / %zu ë°”ì´íŠ¸ë§Œ ì½ìŒ" -#: storage/smgr/md.c:715 +#: storage/smgr/md.c:995 #, c-format -msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" -msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì— 쓸 수 ì—†ìŒ: %d / %d ë°”ì´íŠ¸ë§Œ 씀" +msgid "could not write blocks %u..%u in file \"%s\": %m" +msgstr "%u..%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì— 쓸 수 ì—†ìŒ: %m" -#: storage/smgr/md.c:807 +#: storage/smgr/md.c:1165 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "\"%s\" 파ì¼ì„ %u 블럭으로 비울 수 ì—†ìŒ: 현재 %u 블럭 ë¿ ìž„" -#: storage/smgr/md.c:862 +#: storage/smgr/md.c:1220 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "\"%s\" 파ì¼ì„ %u 블럭으로 정리할 수 ì—†ìŒ: %m" -#: storage/smgr/md.c:957 -#, c-format -msgid "could not forward fsync request because request queue is full" -msgstr "요청 íê°€ ê°€ë“ì°¨ forward fsync ìš”ì²­ì„ ì²˜ë¦¬í•  수 ì—†ìŒ" - -#: storage/smgr/md.c:1256 +#: storage/smgr/md.c:1700 #, c-format msgid "" "could not open file \"%s\" (target block %u): previous segment is only %u " "blocks" msgstr "\"%s\" 파ì¼ì„ 열기 실패(ëŒ€ìƒ ë¸”ë¡: %u): ì´ì „ ì¡°ê°ì€ %u 블럭 ë¿ìž„" -#: storage/smgr/md.c:1270 +#: storage/smgr/md.c:1714 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "\"%s\" 파ì¼ì„ 열기 실패(ëŒ€ìƒ ë¸”ë¡: %u): %m" -#: storage/sync/sync.c:401 +#: tcop/backend_startup.c:85 #, c-format -msgid "could not fsync file \"%s\" but retrying: %m" -msgstr "\"%s\" íŒŒì¼ fsync 실패, 재시ë„함: %m" +msgid "SSL configuration could not be loaded in child process" +msgstr "하위 프로세스ì—서 SSL 환경 ì„¤ì •ì„ ëª»í–ˆìŒ" -#: tcop/fastpath.c:109 tcop/fastpath.c:461 tcop/fastpath.c:591 +#: tcop/backend_startup.c:208 #, c-format -msgid "invalid argument size %d in function call message" -msgstr "함수 호출 메시지 ì•ˆì— ìžˆëŠ” ìž˜ëª»ëœ %d ì¸ìž í¬ê¸°" +msgid "connection received: host=%s port=%s" +msgstr "ì ‘ì† ìˆ˜ë½: host=%s port=%s" + +#: tcop/backend_startup.c:213 +#, c-format +msgid "connection received: host=%s" +msgstr "ì ‘ì† ìˆ˜ë½: host=%s" + +#: tcop/backend_startup.c:277 +#, c-format +msgid "the database system is starting up" +msgstr "ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì´ ìƒˆë¡œ ê°€ë™ ì¤‘ìž…ë‹ˆë‹¤." + +#: tcop/backend_startup.c:283 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "해당 ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì€ ì•„ì§ ì ‘ì†ì„ 허용하지 않습니다." + +#: tcop/backend_startup.c:284 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "ì¼ê´€ì„± 복구 ìž‘ì—…ì„ ì•„ì§ ëë‚´ì§€ 못했습니다." + +#: tcop/backend_startup.c:288 +#, c-format +msgid "the database system is not accepting connections" +msgstr "해당 ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì€ ì ‘ì†ì„ 허용하지 않습니다." + +#: tcop/backend_startup.c:289 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "Hot standby 모드가 비활성화 ë˜ì—ˆìŠµë‹ˆë‹¤." + +#: tcop/backend_startup.c:294 +#, c-format +msgid "the database system is shutting down" +msgstr "ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì´ ì¤‘ì§€ 중입니다" + +#: tcop/backend_startup.c:299 +#, c-format +msgid "the database system is in recovery mode" +msgstr "ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì´ ìžë™ 복구 작업 중입니다." -#: tcop/fastpath.c:307 +#: tcop/backend_startup.c:414 +#, c-format +msgid "" +"received direct SSL connection request without ALPN protocol negotiation " +"extension" +msgstr "" +"ìˆ˜ì‹ ëœ ì§ì ‘ SSL ì—°ê²°ì€ ALPN 프로토콜 채결 확장 ì—†ì´ ìš”ì²­ë˜ì—ˆìŒ" + +#: tcop/backend_startup.c:420 +#, c-format +msgid "direct SSL connection accepted" +msgstr "ì§ì ‘ SSL ì—°ê²° 수ë½ë¨" + +#: tcop/backend_startup.c:430 +#, c-format +msgid "direct SSL connection rejected" +msgstr "ì§ì ‘ SSL ì—°ê²° ê±°ì ˆë¨" + +#: tcop/backend_startup.c:489 tcop/backend_startup.c:517 +#, c-format +msgid "incomplete startup packet" +msgstr "ì•„ì§ ì™„ë£Œë˜ì§€ ì•Šì€ ì‹œìž‘ 패킷" + +#: tcop/backend_startup.c:501 tcop/backend_startup.c:538 +#, c-format +msgid "invalid length of startup packet" +msgstr "시작 íŒ¨í‚·ì˜ ê¸¸ì´ê°€ 잘못 ë˜ì—ˆìŠµë‹ˆë‹¤" + +#: tcop/backend_startup.c:573 +#, c-format +msgid "SSLRequest accepted" +msgstr "SSLRequest 수ë½ë¨" + +#: tcop/backend_startup.c:576 +#, c-format +msgid "SSLRequest rejected" +msgstr "SSLRequest ê±°ì ˆë¨" + +#: tcop/backend_startup.c:585 +#, c-format +msgid "failed to send SSL negotiation response: %m" +msgstr "SSL ì—°ê²° ìž‘ì—…ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤: %m" + +#: tcop/backend_startup.c:603 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "SSL 요청 ë’¤ì— ì•”í˜¸í™” ë˜ì§€ ì•Šì€ ë°ì´í„°ë¥¼ 받았ìŒ" + +#: tcop/backend_startup.c:604 tcop/backend_startup.c:658 +#, c-format +msgid "" +"This could be either a client-software bug or evidence of an attempted man-" +"in-the-middle attack." +msgstr "" +"ì´ í˜„ìƒì€ í´ë¼ì´ì–¸íЏ 소프트웨어 버그ì´ê±°ë‚˜, ì¤‘ê°„ìž ê³µê²©ìœ¼ë¡œ ë°œìƒí–ˆì„ 것입니" +"다." + +#: tcop/backend_startup.c:627 +#, c-format +msgid "GSSENCRequest accepted" +msgstr "GSSENCRequest 수ë½ë¨" + +#: tcop/backend_startup.c:630 +#, c-format +msgid "GSSENCRequest rejected" +msgstr "GSSENCRequest ê±°ì ˆë¨" + +#: tcop/backend_startup.c:639 +#, c-format +msgid "failed to send GSSAPI negotiation response: %m" +msgstr "GSSAPI í˜‘ìƒ ì‘ë‹µì„ ë³´ë‚´ì§€ 못했습니다: %m" + +#: tcop/backend_startup.c:657 +#, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "GSSAPI 암호화 요청 ë’¤ì— ì•”í˜¸í™” ë˜ì§€ ì•Šì€ ë°ì´í„°ë¥¼ 받았습니다." + +#: tcop/backend_startup.c:681 +#, c-format +msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" +msgstr "" +"ì§€ì›í•˜ì§€ 않는 frontend 프로토콜 %u.%u: 서버ì—서 ì§€ì›í•˜ëŠ” 프로토콜 %u.0 .. %u." +"%u" + +#: tcop/backend_startup.c:744 +#, c-format +msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." +msgstr "사용할 수 있는 ê°’: \"false\", 0, \"true\", 1, \"database\"." + +#: tcop/backend_startup.c:785 +#, c-format +msgid "invalid startup packet layout: expected terminator as last byte" +msgstr "ìž˜ëª»ëœ ì‹œìž‘ 패킷 ë ˆì´ì•„웃: 마지막 ë°”ì´íŠ¸ë¡œ 종결문ìžê°€ 발견ë˜ì—ˆìŒ" + +#: tcop/backend_startup.c:802 +#, c-format +msgid "no PostgreSQL user name specified in startup packet" +msgstr "시작 패킷ì—서 지정한 사용ìžëŠ” PostgreSQL ì‚¬ìš©ìž ì´ë¦„ì´ ì•„ë‹™ë‹ˆë‹¤" + +#: tcop/fastpath.c:142 utils/fmgr/fmgr.c:2161 +#, c-format +msgid "function with OID %u does not exist" +msgstr "OID %u 함수 ì—†ìŒ" + +#: tcop/fastpath.c:149 +#, c-format +msgid "cannot call function \"%s\" via fastpath interface" +msgstr "fastpath ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ ì´ìš©í•œ \"%s\" 함수 호출 실패" + +#: tcop/fastpath.c:234 #, c-format msgid "fastpath function call: \"%s\" (OID %u)" msgstr "fastpath 함수 호출: \"%s\" (OID %u)" -#: tcop/fastpath.c:389 tcop/postgres.c:1323 tcop/postgres.c:1581 -#: tcop/postgres.c:2013 tcop/postgres.c:2250 +#: tcop/fastpath.c:313 tcop/postgres.c:1369 tcop/postgres.c:1605 +#: tcop/postgres.c:2071 tcop/postgres.c:2333 #, c-format msgid "duration: %s ms" msgstr "실행시간: %s ms" -#: tcop/fastpath.c:393 +#: tcop/fastpath.c:317 #, c-format msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" msgstr "작업시간: %s ms fastpath 함수 호출: \"%s\" (OID %u)" -#: tcop/fastpath.c:429 tcop/fastpath.c:556 +#: tcop/fastpath.c:353 #, c-format msgid "function call message contains %d arguments but function requires %d" msgstr "함수 호출 메시지는 %d ì¸ìžë¥¼ 사용하지만, 함수는 %d ì¸ìžê°€ 필요합니다" -#: tcop/fastpath.c:437 +#: tcop/fastpath.c:361 #, c-format msgid "function call message contains %d argument formats but %d arguments" msgstr "함수 호출 메시지는 %d ì¸ìžë¥¼ 사용하지만, 함수는 %d ì¸ìžê°€ 필요합니다" -#: tcop/fastpath.c:524 tcop/fastpath.c:607 +#: tcop/fastpath.c:385 #, c-format -msgid "incorrect binary data format in function argument %d" -msgstr "함수 ì¸ìž %d ì•ˆì— ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ ìžë£Œ í˜•ì‹ ë°œê²¬ë¨" +msgid "invalid argument size %d in function call message" +msgstr "함수 호출 메시지 ì•ˆì— ìžˆëŠ” ìž˜ëª»ëœ %d ì¸ìž í¬ê¸°" -#: tcop/postgres.c:355 tcop/postgres.c:391 tcop/postgres.c:418 +#: tcop/fastpath.c:448 #, c-format -msgid "unexpected EOF on client connection" -msgstr "í´ë¼ì´ì–¸íЏ ì—°ê²°ì—서 예ìƒì¹˜ ì•Šì€ EOF 발견ë¨" +msgid "incorrect binary data format in function argument %d" +msgstr "함수 ì¸ìž %d ì•ˆì— ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ ìžë£Œ í˜•ì‹ ë°œê²¬ë¨" -#: tcop/postgres.c:441 tcop/postgres.c:453 tcop/postgres.c:464 -#: tcop/postgres.c:476 tcop/postgres.c:4539 +#: tcop/postgres.c:467 tcop/postgres.c:5012 #, c-format msgid "invalid frontend message type %d" msgstr "ìž˜ëª»ëœ frontend 메시지 형태 %d" -#: tcop/postgres.c:1042 +#: tcop/postgres.c:1076 #, c-format msgid "statement: %s" msgstr "명령 구문: %s" -#: tcop/postgres.c:1328 +#: tcop/postgres.c:1374 #, c-format msgid "duration: %s ms statement: %s" msgstr "실행시간: %s ms 명령 구문: %s" -#: tcop/postgres.c:1377 -#, c-format -msgid "parse %s: %s" -msgstr "구문 %s: %s" - -#: tcop/postgres.c:1434 +#: tcop/postgres.c:1480 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "ì¤€ë¹„ëœ ëª…ë ¹ 구문ì—는 다중 ëª…ë ¹ì„ ì‚½ìž…í•  수 없습니다" -#: tcop/postgres.c:1586 +#: tcop/postgres.c:1610 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "실행시간: %s ms %s 구문분ì„: %s" -#: tcop/postgres.c:1633 -#, c-format -msgid "bind %s to %s" -msgstr "ë°”ì¸ë“œ: %s -> %s" - -#: tcop/postgres.c:1652 tcop/postgres.c:2516 +#: tcop/postgres.c:1677 tcop/postgres.c:2653 #, c-format msgid "unnamed prepared statement does not exist" msgstr "ì´ë¦„없는 ì¤€ë¹„ëœ ëª…ë ¹ 구문(unnamed prepared statement) ì—†ìŒ" -#: tcop/postgres.c:1693 +#: tcop/postgres.c:1729 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "ë°”ì¸ë“œ 메시지는 %d 매개 변수 형태지만, %d 매개 변수여야함" -#: tcop/postgres.c:1699 +#: tcop/postgres.c:1735 #, c-format msgid "" "bind message supplies %d parameters, but prepared statement \"%s\" requires " @@ -21577,85 +25208,115 @@ msgstr "" "ë°”ì¸ë“œ 메시지는 %dê°œì˜ ë§¤ê°œ 변수를 ì§€ì›í•˜ì§€ë§Œ, \"%s\" ì¤€ë¹„ëœ ëª…ë ¹ 구문" "(prepared statement)ì—서는%d ê°œì˜ ë§¤ê°œ 변수가 필요합니다" -#: tcop/postgres.c:1897 +#: tcop/postgres.c:1949 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "ë°”ì¸ë“œ 매개 변수 %d ì•ˆì— ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ ìžë£Œ 형태가 있ìŒ" -#: tcop/postgres.c:2018 +#: tcop/postgres.c:2076 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "실행시간: %s ms %s%s%s ì ‘ì†: %s" -#: tcop/postgres.c:2068 tcop/postgres.c:2600 +#: tcop/postgres.c:2131 tcop/postgres.c:2735 #, c-format msgid "portal \"%s\" does not exist" msgstr "\"%s\" portal ì—†ìŒ" -#: tcop/postgres.c:2153 +#: tcop/postgres.c:2213 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2155 tcop/postgres.c:2258 +#: tcop/postgres.c:2215 tcop/postgres.c:2341 msgid "execute fetch from" msgstr "ìžë£Œë½‘기" -#: tcop/postgres.c:2156 tcop/postgres.c:2259 +#: tcop/postgres.c:2216 tcop/postgres.c:2342 msgid "execute" msgstr "쿼리실행" -#: tcop/postgres.c:2255 +#: tcop/postgres.c:2338 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "수행시간: %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2401 +#: tcop/postgres.c:2486 #, c-format msgid "prepare: %s" msgstr "prepare: %s" -#: tcop/postgres.c:2426 +#: tcop/postgres.c:2511 #, c-format -msgid "parameters: %s" +msgid "Parameters: %s" msgstr "매개 변수: %s" -#: tcop/postgres.c:2441 +#: tcop/postgres.c:2526 #, c-format -msgid "abort reason: recovery conflict" +msgid "Abort reason: recovery conflict" msgstr "중지 ì´ìœ : 복구 ì¶©ëŒ" -#: tcop/postgres.c:2457 +#: tcop/postgres.c:2542 #, c-format msgid "User was holding shared buffer pin for too long." -msgstr "" +msgstr "사용ìžê°€ 너무 오랫ë™ì•ˆ 공유 ë²„í¼ í•€ì„ ë¶™ìž¡ê³  있습니다." -#: tcop/postgres.c:2460 +#: tcop/postgres.c:2545 #, c-format msgid "User was holding a relation lock for too long." -msgstr "" +msgstr "사용ìžê°€ 너무 오랫ë™ì•ˆ 릴레ì´ì…˜ ìž ê¸ˆì„ í•˜ê³  있습니다." -#: tcop/postgres.c:2463 +#: tcop/postgres.c:2548 #, c-format msgid "User was or might have been using tablespace that must be dropped." -msgstr "" +msgstr "삭제할 í…Œì´ë¸”스페ì´ìŠ¤ë¥¼ 사용ìžê°€ 사용했거나, 사용하고 있습니다." -#: tcop/postgres.c:2466 +#: tcop/postgres.c:2551 #, c-format msgid "User query might have needed to see row versions that must be removed." -msgstr "" +msgstr "ì‚¬ìš©ìž ì¿¼ë¦¬ê°€ 삭제해야할 로우 버전를 ë³¼ 필요가 있는 것 같습니다." + +#: tcop/postgres.c:2554 +#, c-format +msgid "User was using a logical replication slot that must be invalidated." +msgstr "사용ìžê°€ ìž˜ëª»ëœ ë…¼ë¦¬ 복제 ìŠ¬ë¡¯ì„ ì‚¬ìš©í–ˆìŠµë‹ˆë‹¤." -#: tcop/postgres.c:2472 +#: tcop/postgres.c:2560 #, c-format msgid "User was connected to a database that must be dropped." -msgstr "ì‚­ì œ ë˜ì–´ì ¸ì•¼í•  ë°ì´í„°ë² ì´ìФ ì‚¬ìš©ìž ì ‘ì†í•´ 있습니다." +msgstr "ì‚­ì œ ë˜ì–´ì ¸ì•¼í•  ë°ì´í„°ë² ì´ìŠ¤ì— ì‚¬ìš©ìžê°€ ì ‘ì†í•´ 있습니다." + +#: tcop/postgres.c:2599 +#, c-format +msgid "portal \"%s\" parameter $%d = %s" +msgstr "\"%s\" í¬íƒˆ $%d 매개 변수 = %s" + +#: tcop/postgres.c:2602 +#, c-format +msgid "portal \"%s\" parameter $%d" +msgstr "\"%s\" í¬íƒˆ $%d 매개 변수" + +#: tcop/postgres.c:2608 +#, c-format +msgid "unnamed portal parameter $%d = %s" +msgstr "ì´ë¦„없는 í¬íƒˆ $%d 매개 변수 = %s" + +#: tcop/postgres.c:2611 +#, c-format +msgid "unnamed portal parameter $%d" +msgstr "ì´ë¦„없는 í¬íƒˆ $%d 매개 변수" + +#: tcop/postgres.c:2955 +#, c-format +msgid "terminating connection because of unexpected SIGQUIT signal" +msgstr "예ìƒì¹˜ 못한 SIGQUIT 신호로 ì—°ê²°ì„ ë냅니다" -#: tcop/postgres.c:2796 +#: tcop/postgres.c:2961 #, c-format msgid "terminating connection because of crash of another server process" msgstr "다른 서버 프로세스가 ì†ìƒì„ ìž…ì–´ 현재 ì—°ê²°ì„ ì¤‘ì§€í•©ë‹ˆë‹¤" -#: tcop/postgres.c:2797 +#: tcop/postgres.c:2962 #, c-format msgid "" "The postmaster has commanded this server process to roll back the current " @@ -21666,19 +25327,24 @@ msgstr "" "ì™€ì˜ ì—°ê²°ì„ ëŠìœ¼ë¼ëŠ” ëª…ë ¹ì„ ë³´ëƒˆìŠµë‹ˆë‹¤. 왜ëƒí•˜ë©´, 다른 서버 프로세스가 비정ìƒ" "ì ìœ¼ë¡œ 중지ë˜ì–´ 공유 메모리가 ì†ìƒë˜ì—ˆì„ ê°€ëŠ¥ì„±ì´ ìžˆê¸° 때문입니다" -#: tcop/postgres.c:2801 tcop/postgres.c:3107 +#: tcop/postgres.c:2966 tcop/postgres.c:3219 #, c-format msgid "" "In a moment you should be able to reconnect to the database and repeat your " "command." msgstr "잠시 ë’¤ì— ë‹¤ì‹œ ì—°ê²° 해서 ìž‘ì—…ì„ ê³„ì† í•˜ì‹­ì‹œì˜¤" -#: tcop/postgres.c:2883 +#: tcop/postgres.c:2973 +#, c-format +msgid "terminating connection due to immediate shutdown command" +msgstr "immediate 종료 명령으로 ì—°ê²°ì„ ë냅니다" + +#: tcop/postgres.c:3051 #, c-format msgid "floating-point exception" msgstr "ë¶€ë™ì†Œìˆ˜ì  예외발ìƒ" -#: tcop/postgres.c:2884 +#: tcop/postgres.c:3052 #, c-format msgid "" "An invalid floating-point operation was signaled. This probably means an out-" @@ -21687,72 +25353,77 @@ msgstr "" "ìž˜ëª»ëœ ë¶€ë™ì†Œìˆ˜ì  ìž‘ì—…ì´ ê°ì§€ ë˜ì—ˆìŠµë‹ˆë‹¤. ì´ê²ƒì€ ì•„ë§ˆë„ ê²°ê³¼ê°’ 범위초과나 0으" "로 나누는 작업과 ê°™ì€ ìž˜ëª»ëœ ì—°ì‚° ë•Œë¬¸ì— ë°œìƒí•œ 것 같습니다" -#: tcop/postgres.c:3037 +#: tcop/postgres.c:3217 +#, c-format +msgid "terminating connection due to conflict with recovery" +msgstr "복구 작업 중 ì¶©ëŒë¡œ ì—°ê²°ì„ ë냅니다" + +#: tcop/postgres.c:3289 #, c-format msgid "canceling authentication due to timeout" msgstr "시간 초과로 ì¸ì¦ ìž‘ì—…ì„ ì·¨ì†Œí•©ë‹ˆë‹¤." -#: tcop/postgres.c:3041 +#: tcop/postgres.c:3293 #, c-format msgid "terminating autovacuum process due to administrator command" -msgstr "ê´€ë¦¬ìž ëª…ë ¹ìœ¼ë¡œ ì¸í•´ ìžë™ 청소 프로세스를 종료하는 중" +msgstr "ê´€ë¦¬ìž ëª…ë ¹ìœ¼ë¡œ ì¸í•´ ìžë™ 청소 프로세스를 ë냅니다" -#: tcop/postgres.c:3045 +#: tcop/postgres.c:3297 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "ê´€ë¦¬ìž ìš”ì²­ì— ì˜í•´ì„œ 논리 복제 작업ìžë¥¼ ë냅니다" -#: tcop/postgres.c:3049 -#, c-format -msgid "logical replication launcher shutting down" -msgstr "논리 복제 관리ìžë¥¼ 중지하고 있습니다" - -#: tcop/postgres.c:3062 tcop/postgres.c:3072 tcop/postgres.c:3105 -#, c-format -msgid "terminating connection due to conflict with recovery" -msgstr "복구 작업 중 ì¶©ëŒë¡œ ì—°ê²°ì„ ì¢…ë£Œí•©ë‹ˆë‹¤." - -#: tcop/postgres.c:3078 +#: tcop/postgres.c:3317 #, c-format msgid "terminating connection due to administrator command" msgstr "ê´€ë¦¬ìž ìš”ì²­ì— ì˜í•´ì„œ ì—°ê²°ì„ ë냅니다" -#: tcop/postgres.c:3088 +#: tcop/postgres.c:3348 #, c-format msgid "connection to client lost" msgstr "서버로부터 ì—°ê²°ì´ ëŠì–´ì¡ŒìŠµë‹ˆë‹¤." -#: tcop/postgres.c:3154 +#: tcop/postgres.c:3400 #, c-format msgid "canceling statement due to lock timeout" msgstr "잠금 대기 시간 초과로 ìž‘ì—…ì„ ì·¨ì†Œí•©ë‹ˆë‹¤." -#: tcop/postgres.c:3161 +#: tcop/postgres.c:3407 #, c-format msgid "canceling statement due to statement timeout" msgstr "명령실행시간 초과로 ìž‘ì—…ì„ ì·¨ì†Œí•©ë‹ˆë‹¤." -#: tcop/postgres.c:3168 +#: tcop/postgres.c:3414 #, c-format msgid "canceling autovacuum task" msgstr "ìžë™ 청소 ìž‘ì—…ì„ ì·¨ì†Œí•˜ëŠ” 중" -#: tcop/postgres.c:3191 +#: tcop/postgres.c:3427 #, c-format msgid "canceling statement due to user request" msgstr "ì‚¬ìš©ìž ìš”ì²­ì— ì˜í•´ ìž‘ì—…ì„ ì·¨ì†Œí•©ë‹ˆë‹¤." -#: tcop/postgres.c:3201 +#: tcop/postgres.c:3448 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "idle-in-transaction 시간 초과로 ì—°ê²°ì„ ë냅니다" -#: tcop/postgres.c:3318 +#: tcop/postgres.c:3461 +#, c-format +msgid "terminating connection due to transaction timeout" +msgstr "트랜잭션 시간(transaction_timeout) 초과로 ì—°ê²°ì„ ë냅니다" + +#: tcop/postgres.c:3474 +#, c-format +msgid "terminating connection due to idle-session timeout" +msgstr "idle-session 시간 초과로 ì—°ê²°ì„ ë냅니다" + +#: tcop/postgres.c:3564 #, c-format msgid "stack depth limit exceeded" msgstr "ìŠ¤íƒ ê¹Šì´ë¥¼ 초과했습니다" -#: tcop/postgres.c:3319 +#: tcop/postgres.c:3565 #, c-format msgid "" "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), " @@ -21761,114 +25432,145 @@ msgstr "" "먼저 OSì—서 ì§€ì›í•˜ëŠ” ìŠ¤íƒ depth ìµœëŒ€ê°’ì„ í™•ì¸í•œ ë’¤, 허용범위 안ì—서 " "\"max_stack_depth\" (현재값: %dkB) 매개 변수 ê°’ì˜ ì„¤ì •ì¹˜ë¥¼ ì¦ê°€ì‹œí‚¤ì„¸ìš”." -#: tcop/postgres.c:3382 +#: tcop/postgres.c:3612 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "\"max_stack_depth\" ê°’ì€ %ldkB를 초과할 수 없습니다" -#: tcop/postgres.c:3384 +#: tcop/postgres.c:3614 #, c-format msgid "" "Increase the platform's stack depth limit via \"ulimit -s\" or local " "equivalent." msgstr "OSì˜ \"ulimit -s\" 명령과 ê°™ì€ ê²ƒìœ¼ë¡œ ìŠ¤íƒ ê¹Šì´ë¥¼ 늘려주십시오." -#: tcop/postgres.c:3744 +#: tcop/postgres.c:3637 +#, c-format +msgid "\"client_connection_check_interval\" must be set to 0 on this platform." +msgstr "ì´ í”Œëž«í¼ì—서는 \"client_connection_check_interval\" ê°’ì€ 0 ì´ì–´ì•¼ 합니다." + +#: tcop/postgres.c:3658 +#, c-format +msgid "Cannot enable parameter when \"log_statement_stats\" is true." +msgstr "\"log_statement_stats\" ê°’ì´ true ì¼ ë•ŒëŠ” ì´ ê°’ì„ í™œì„±í™”í•  수 없습니다" + +#: tcop/postgres.c:3673 +#, c-format +msgid "" +"Cannot enable \"log_statement_stats\" when \"log_parser_stats\", " +"\"log_planner_stats\", or \"log_executor_stats\" is true." +msgstr "" +"\"log_parser_stats\", \"log_planner_stats\", \"log_executor_stats\" 설정값들 " +"중 하나가 true ì¼ ë•ŒëŠ” \"log_statement_stats\" ì„¤ì •ì„ í™œì„±í™”í•  수 없습니다" + +#: tcop/postgres.c:4098 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "서버 í”„ë¡œì„¸ìŠ¤ì˜ ëª…ë ¹í–‰ ì¸ìžê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤: %s" -#: tcop/postgres.c:3745 tcop/postgres.c:3751 +#: tcop/postgres.c:4099 tcop/postgres.c:4105 #, c-format msgid "Try \"%s --help\" for more information." msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." -#: tcop/postgres.c:3749 +#: tcop/postgres.c:4103 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: ìž˜ëª»ëœ ëª…ë ¹í–‰ ì¸ìž: %s" -#: tcop/postgres.c:3811 +#: tcop/postgres.c:4156 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: ë°ì´í„°ë² ì´ìŠ¤ì™€ 사용ìžë¥¼ 지정하지 않았습니다" -#: tcop/postgres.c:4447 +#: tcop/postgres.c:4909 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "ìž˜ëª»ëœ CLOSE 메시지 서브타입 %d" -#: tcop/postgres.c:4482 +#: tcop/postgres.c:4946 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "ìž˜ëª»ëœ DESCRIBE 메시지 서브타입 %d" -#: tcop/postgres.c:4560 +#: tcop/postgres.c:5033 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "복제 ì—°ê²°ì—서는 fastpath 함수 í˜¸ì¶œì„ ì§€ì›í•˜ì§€ 않습니다" -#: tcop/postgres.c:4564 +#: tcop/postgres.c:5037 #, c-format msgid "extended query protocol not supported in a replication connection" -msgstr "" +msgstr "복제 ì—°ê²°ì—서는 í™•ìž¥ëœ ì¿¼ë¦¬ í”„ë¡œí† ì½œì„ ì§€ì›í•˜ì§€ 않습니다" -#: tcop/postgres.c:4741 +#: tcop/postgres.c:5217 #, c-format msgid "" -"disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s" -"%s" +"disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s " +"host=%s%s%s" msgstr "" -"연결종료: 세션 시간: %d:%02d:%02d.%03d 사용ìž=%s ë°ì´í„°ë² ì´ìФ=%s 호스트=%s%s" -"%s" +"연결종료: 세션 시간: %d:%02d:%02d.%03d 사용ìž=%s ë°ì´í„°ë² ì´ìФ=%s 호스트" +"=%s%s%s" -#: tcop/pquery.c:629 +#: tcop/pquery.c:641 #, c-format msgid "bind message has %d result formats but query has %d columns" msgstr "" "ë°”ì¸ë“œ 메시지는 %d ê²°ê³¼ í¬ë©§ì„ 가지고 있고, 쿼리는 %d ì¹¼ëŸ¼ì„ ê°€ì§€ê³  있습니다" -#: tcop/pquery.c:932 +#: tcop/pquery.c:942 tcop/pquery.c:1696 #, c-format msgid "cursor can only scan forward" msgstr "ì´ ì»¤ì„œëŠ” 앞으로 ì´ë™ 전용입니다" -#: tcop/pquery.c:933 +#: tcop/pquery.c:943 tcop/pquery.c:1697 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "" "뒤로 ì´ë™ 가능한 커서를 만드려면 SCROLL ì˜µì…˜ì„ ì¶”ê°€í•´ì„œ 커서를 만드세요." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:413 +#: tcop/utility.c:410 #, c-format msgid "cannot execute %s in a read-only transaction" msgstr "ì½ê¸° ì „ìš© 트랜잭션ì—서는 %s ëª…ë ¹ì„ ì‹¤í–‰í•  수 없습니다." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:431 +#: tcop/utility.c:428 #, c-format msgid "cannot execute %s during a parallel operation" msgstr "병렬 처리 작업ì—서는 %s ëª…ë ¹ì„ ì‹¤í–‰í•  수 없습니다." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:450 +#: tcop/utility.c:447 #, c-format msgid "cannot execute %s during recovery" msgstr "복구 작업 중ì—는 %s ëª…ë ¹ì„ ì‹¤í–‰í•  수 없습니다." #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:468 +#: tcop/utility.c:465 +#, c-format +msgid "cannot execute %s within security-restricted operation" +msgstr "보안 제한 작업 ë‚´ì—서 %sì„(를) 실행할 수 ì—†ìŒ" + +#. translator: %s is name of a SQL command, eg LISTEN +#: tcop/utility.c:821 +#, c-format +msgid "cannot execute %s within a background process" +msgstr "백그ë¼ìš´ë“œ 프로세스ì—서는 %s ëª…ë ¹ì„ ì‹¤í–‰í•  수 없습니다." + +#. translator: %s is name of a SQL command, eg CHECKPOINT +#: tcop/utility.c:947 #, c-format -msgid "cannot execute %s within security-restricted operation" -msgstr "보안 제한 작업 ë‚´ì—서 %sì„(를) 실행할 수 ì—†ìŒ" +msgid "permission denied to execute %s command" +msgstr "%s 명령 실행 권한 ì—†ìŒ" -#: tcop/utility.c:912 +#: tcop/utility.c:949 #, c-format -msgid "must be superuser to do CHECKPOINT" -msgstr "CHECKPOINT ëª…ë ¹ì€ ìŠˆí¼ìœ ì €ë§Œ 사용할 수 있습니다" +msgid "Only roles with privileges of the \"%s\" role may execute this command." +msgstr "ì´ ëª…ë ¹ ì‹¤í–‰ì€ \"%s\" 롤 ê¶Œí•œì´ ìžˆëŠ” 롤만 í•  수 있습니다." -#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:620 +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:616 #, c-format msgid "multiple DictFile parameters" msgstr "DictFile 매개 변수가 여러 ê°œ 있ìŒ" @@ -21888,7 +25590,7 @@ msgstr "ì¸ì‹í•  수 없는 Ispell 매개 변수: \"%s\"" msgid "missing AffFile parameter" msgstr "AffFile 매개 변수가 누ë½ë¨" -#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:644 +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:640 #, c-format msgid "missing DictFile parameter" msgstr "DictFile 매개 변수가 누ë½ë¨" @@ -21938,152 +25640,152 @@ msgstr "예기치 ì•Šì€ ì¤„ ë ë˜ëŠ” 어휘소" msgid "unexpected end of line" msgstr "예기치 ì•Šì€ ì¤„ ë" -#: tsearch/dict_thesaurus.c:297 +#: tsearch/dict_thesaurus.c:292 #, c-format msgid "too many lexemes in thesaurus entry" msgstr "기준어 í•­ëª©ì— ë„ˆë¬´ ë§Žì€ ì–´íœ˜ì†Œê°€ 있ìŒ" -#: tsearch/dict_thesaurus.c:421 +#: tsearch/dict_thesaurus.c:416 #, c-format msgid "" "thesaurus sample word \"%s\" isn't recognized by subdictionary (rule %d)" msgstr "\"%s\" 기준 단어는 하위 사전ì—서 ì¸ì‹í•  수 ì—†ìŒ(규칙 %d)" -#: tsearch/dict_thesaurus.c:427 +#: tsearch/dict_thesaurus.c:422 #, c-format msgid "thesaurus sample word \"%s\" is a stop word (rule %d)" msgstr "\"%s\" ë™ì˜ì–´ 사전 샘플 단어는 중지 단어임(규칙 %d)" -#: tsearch/dict_thesaurus.c:430 +#: tsearch/dict_thesaurus.c:425 #, c-format msgid "Use \"?\" to represent a stop word within a sample phrase." msgstr "샘플 구 ë‚´ì—서 중지 단어를 나타내려면 \"?\"를 사용하십시오." -#: tsearch/dict_thesaurus.c:572 +#: tsearch/dict_thesaurus.c:567 #, c-format msgid "thesaurus substitute word \"%s\" is a stop word (rule %d)" msgstr "\"%s\" ë™ì˜ì–´ 사전 대체 단어는 중지 단어임(규칙 %d)" -#: tsearch/dict_thesaurus.c:579 +#: tsearch/dict_thesaurus.c:574 #, c-format msgid "" "thesaurus substitute word \"%s\" isn't recognized by subdictionary (rule %d)" msgstr "\"%s\" ë™ì˜ì–´ 사전 대체 단어는 하위 사전ì—서 ì¸ì‹í•  수 ì—†ìŒ(규칙 %d)" -#: tsearch/dict_thesaurus.c:591 +#: tsearch/dict_thesaurus.c:586 #, c-format msgid "thesaurus substitute phrase is empty (rule %d)" msgstr "ë™ì˜ì–´ 사전 대체 구가 비어 있ìŒ(규칙 %d)" -#: tsearch/dict_thesaurus.c:629 +#: tsearch/dict_thesaurus.c:625 #, c-format msgid "multiple Dictionary parameters" msgstr "Dictionary 매개 변수가 여러 ê°œ 있ìŒ" -#: tsearch/dict_thesaurus.c:636 +#: tsearch/dict_thesaurus.c:632 #, c-format msgid "unrecognized Thesaurus parameter: \"%s\"" msgstr "ì¸ì‹í•  수 없는 Thesaurus 매개 변수: \"%s\"" -#: tsearch/dict_thesaurus.c:648 +#: tsearch/dict_thesaurus.c:644 #, c-format msgid "missing Dictionary parameter" msgstr "Dictionary 매개 변수가 누ë½ë¨" -#: tsearch/spell.c:380 tsearch/spell.c:397 tsearch/spell.c:406 -#: tsearch/spell.c:1036 +#: tsearch/spell.c:381 tsearch/spell.c:398 tsearch/spell.c:407 +#: tsearch/spell.c:1043 #, c-format msgid "invalid affix flag \"%s\"" msgstr "ìž˜ëª»ëœ affix 플래그: \"%s\"" -#: tsearch/spell.c:384 tsearch/spell.c:1040 +#: tsearch/spell.c:385 tsearch/spell.c:1047 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "affix 플래그 범위 초과: \"%s\"" -#: tsearch/spell.c:414 +#: tsearch/spell.c:415 #, c-format msgid "invalid character in affix flag \"%s\"" msgstr "affix í”Œëž˜ê·¸ì— ì´ìƒí•œ 문ìžê°€ 있ìŒ: \"%s\"" -#: tsearch/spell.c:434 +#: tsearch/spell.c:435 #, c-format msgid "invalid affix flag \"%s\" with \"long\" flag value" -msgstr "" +msgstr "\"long\" 플래그 ê°’ì„ í¬í•¨í•˜ëŠ” ìž˜ëª»ëœ affix 플래그: \"%s\"" -#: tsearch/spell.c:524 +#: tsearch/spell.c:525 #, c-format msgid "could not open dictionary file \"%s\": %m" msgstr "\"%s\" 사전 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: tsearch/spell.c:742 utils/adt/regexp.c:208 +#: tsearch/spell.c:749 utils/adt/regexp.c:223 jsonpath_gram.y:629 #, c-format msgid "invalid regular expression: %s" msgstr "ìž˜ëª»ëœ ì •ê·œì‹: %s" -#: tsearch/spell.c:956 tsearch/spell.c:973 tsearch/spell.c:990 -#: tsearch/spell.c:1007 tsearch/spell.c:1072 gram.y:15993 gram.y:16010 +#: tsearch/spell.c:963 tsearch/spell.c:980 tsearch/spell.c:997 +#: tsearch/spell.c:1014 tsearch/spell.c:1079 gram.y:18735 gram.y:18752 #, c-format msgid "syntax error" msgstr "구문 오류" -#: tsearch/spell.c:1163 tsearch/spell.c:1175 tsearch/spell.c:1734 -#: tsearch/spell.c:1739 tsearch/spell.c:1744 +#: tsearch/spell.c:1170 tsearch/spell.c:1182 tsearch/spell.c:1742 +#: tsearch/spell.c:1747 tsearch/spell.c:1752 #, c-format msgid "invalid affix alias \"%s\"" msgstr "ìž˜ëª»ëœ affix 별칭: \"%s\"" -#: tsearch/spell.c:1216 tsearch/spell.c:1287 tsearch/spell.c:1436 +#: tsearch/spell.c:1223 tsearch/spell.c:1294 tsearch/spell.c:1443 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "\"%s\" affix 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: tsearch/spell.c:1270 +#: tsearch/spell.c:1277 #, c-format msgid "" "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag " "values" msgstr "Ispell ì‚¬ì „ì€ \"default\", \"long\", \"num\" 플래그 ê°’ë§Œ ì§€ì›í•¨" -#: tsearch/spell.c:1314 +#: tsearch/spell.c:1321 #, c-format msgid "invalid number of flag vector aliases" msgstr "ìž˜ëª»ëœ í”Œëž˜ê·¸ 백터 별칭 개수" -#: tsearch/spell.c:1337 +#: tsearch/spell.c:1344 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "alias 수가 지정한 %d 개수를 초과함" -#: tsearch/spell.c:1552 +#: tsearch/spell.c:1559 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "affix 파ì¼ì— 옛방ì‹ê³¼ ìƒˆë°©ì‹ ëª…ë ¹ì´ í•¨ê»˜ 있습니다" -#: tsearch/to_tsany.c:185 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1121 +#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:277 utils/adt/tsvector_op.c:1126 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "" "문ìžì—´ì´ 너무 길어서 tsvectorì— ì‚¬ìš©í•  수 ì—†ìŒ(%dë°”ì´íЏ, 최대 %dë°”ì´íЏ)" -#: tsearch/ts_locale.c:212 +#: tsearch/ts_locale.c:236 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "%d번째 줄(해당 파ì¼: \"%s\"): \"%s\"" -#: tsearch/ts_locale.c:329 +#: tsearch/ts_locale.c:315 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "wchar_tì—서 서버 ì¸ì½”딩으로 변환하지 못함: %m" -#: tsearch/ts_parse.c:386 tsearch/ts_parse.c:393 tsearch/ts_parse.c:562 -#: tsearch/ts_parse.c:569 +#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 +#: tsearch/ts_parse.c:580 #, c-format msgid "word is too long to be indexed" msgstr "단어가 너무 길어서 ì¸ë±ì‹±í•  수 ì—†ìŒ" -#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:563 -#: tsearch/ts_parse.c:570 +#: tsearch/ts_parse.c:388 tsearch/ts_parse.c:395 tsearch/ts_parse.c:574 +#: tsearch/ts_parse.c:581 #, c-format msgid "Words longer than %d characters are ignored." msgstr "%dìžë³´ë‹¤ 긴 단어는 무시ë©ë‹ˆë‹¤." @@ -22098,1554 +25800,1655 @@ msgstr "\"%s\" 전문 검색 구성 íŒŒì¼ ì´ë¦„ì´ ìž˜ëª»ë¨" msgid "could not open stop-word file \"%s\": %m" msgstr "\"%s\" 중지 단어 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: tsearch/wparser.c:313 tsearch/wparser.c:401 tsearch/wparser.c:478 +#: tsearch/wparser.c:306 tsearch/wparser.c:394 tsearch/wparser.c:471 #, c-format msgid "text search parser does not support headline creation" msgstr "전문 검색 ë¶„ì„기ì—서 헤드ë¼ì¸ ìž‘ì„±ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: tsearch/wparser_def.c:2585 +#: tsearch/wparser_def.c:2664 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "ì¸ì‹í•  수 없는 headline 매개 변수: \"%s\"" -#: tsearch/wparser_def.c:2604 +#: tsearch/wparser_def.c:2674 #, c-format msgid "MinWords should be less than MaxWords" msgstr "MinWords는 MaxWords보다 작아야 함" -#: tsearch/wparser_def.c:2608 +#: tsearch/wparser_def.c:2678 #, c-format msgid "MinWords should be positive" msgstr "MinWords는 양수여야 함" -#: tsearch/wparser_def.c:2612 +#: tsearch/wparser_def.c:2682 #, c-format msgid "ShortWord should be >= 0" msgstr "ShortWord는 0보다 í¬ê±°ë‚˜ 같아야 함" -#: tsearch/wparser_def.c:2616 +#: tsearch/wparser_def.c:2686 #, c-format msgid "MaxFragments should be >= 0" msgstr "MaxFragments는 0보다 í¬ê±°ë‚˜ 같아야 함" +#: utils/activity/pgstat.c:435 +#, c-format +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "\"%s\" 매개 변수 통계 파ì¼ì„ 지울 수 ì—†ìŒ: %m" + +#: utils/activity/pgstat.c:1255 +#, c-format +msgid "invalid statistics kind: \"%s\"" +msgstr "ìž˜ëª»ëœ í†µê³„ì •ë³´ 종류: \"%s\"" + +#: utils/activity/pgstat.c:1335 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "\"%s\" 임시 통계 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: utils/activity/pgstat.c:1455 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "\"%s\" 임시 통계 파ì¼ì— 쓰기 실패: %m" + +#: utils/activity/pgstat.c:1464 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "\"%s\" 임시 통계 파ì¼ì„ ë‹«ì„ ìˆ˜ 없습니다: %m" + +#: utils/activity/pgstat.c:1472 +#, c-format +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 임시 통계 íŒŒì¼ ì´ë¦„ì„ \"%s\" (으)로 바꿀 수 없습니다: %m" + +#: utils/activity/pgstat.c:1521 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "\"%s\" 통계 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: utils/activity/pgstat.c:1683 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "\"%s\" 통계 파ì¼ì´ ì†ìƒë˜ì—ˆìŒ" + +#: utils/activity/pgstat_function.c:118 +#, c-format +msgid "function call to dropped function" +msgstr "ì‚­ì œë  í•¨ìˆ˜ë¥¼ 호출함" + +#: utils/activity/pgstat_xact.c:362 +#, c-format +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "%s ì¢…ë¥˜ì˜ ê¸°ì¡´ 통계 정보를 초기화합니다, db=%u, oid=%u" + +#: utils/activity/wait_event.c:207 utils/activity/wait_event.c:232 +#, c-format +msgid "wait event \"%s\" already exists in type \"%s\"" +msgstr "\"%s\" 대기 ì´ë²¤íŠ¸ëŠ” ì´ë¯¸ \"%s\" ìžë£Œí˜• ì•ˆì— ìžˆìŒ" + +#: utils/activity/wait_event.c:246 +#, c-format +msgid "too many custom wait events" +msgstr "너무 ë§Žì€ ì‚¬ìš©ìž ëŒ€ê¸° ì´ë²¤íЏ" + # # nonun 부분 begin -#: utils/adt/acl.c:172 utils/adt/name.c:93 +#: utils/adt/acl.c:183 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "ì‹ë³„ìž(identifier)ê°€ 너무 ê¹ë‹ˆë‹¤." -#: utils/adt/acl.c:173 utils/adt/name.c:94 +#: utils/adt/acl.c:184 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "ì‹ë³„ìž(Identifier)는 %d ê¸€ìž ì´ìƒì¼ 수 없습니다." -#: utils/adt/acl.c:256 +#: utils/adt/acl.c:272 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "알 수 없는 ì•Šì€ í‚¤ì›Œë“œ: \"%s\"" -#: utils/adt/acl.c:257 +#: utils/adt/acl.c:273 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "ACL 키워드는 \"group\" ë˜ëŠ” \"user\" ì¤‘ì— í•˜ë‚˜ì—¬ì•¼ 합니다." -#: utils/adt/acl.c:262 +#: utils/adt/acl.c:281 #, c-format msgid "missing name" msgstr "ì´ë¦„ì´ ë¹ ì¡ŒìŠµë‹ˆë‹¤." -#: utils/adt/acl.c:263 +#: utils/adt/acl.c:282 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "ì´ë¦„ì€ \"group\" ë˜ëŠ” \"user\" 키워드 ë’¤ì— ìžˆì–´ì•¼ 합니다." -#: utils/adt/acl.c:269 +#: utils/adt/acl.c:288 #, c-format msgid "missing \"=\" sign" msgstr "\"=\" 기호가 빠졌습니다." -#: utils/adt/acl.c:322 +#: utils/adt/acl.c:350 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "ìž˜ëª»ëœ ì¡°ê±´: \"%s\" ì¤‘ì— í•œ 가지여야 합니다." -#: utils/adt/acl.c:344 +#: utils/adt/acl.c:380 #, c-format msgid "a name must follow the \"/\" sign" msgstr "ì´ë¦„ì€ \"/\"기호 ë’¤ì— ìžˆì–´ì•¼ 합니다." -#: utils/adt/acl.c:352 +#: utils/adt/acl.c:392 #, c-format msgid "defaulting grantor to user ID %u" msgstr "%u ì‚¬ìš©ìž IDì—서 기본 권한ìžë¡œ 할당하고 있습니다" -#: utils/adt/acl.c:538 +#: utils/adt/acl.c:578 #, c-format msgid "ACL array contains wrong data type" msgstr "ACL ë°°ì—´ì— ìž˜ëª»ëœ ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³  있습니다" -#: utils/adt/acl.c:542 +#: utils/adt/acl.c:582 #, c-format msgid "ACL arrays must be one-dimensional" -msgstr "ACL ë°°ì—´ì€ ì¼ì°¨ì› ë°°ì—´ì´ì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "ACL ë°°ì—´ì€ ì¼ì°¨ì› ë°°ì—´ì´ì–´ì•¼ 합니다" -#: utils/adt/acl.c:546 +#: utils/adt/acl.c:586 #, c-format msgid "ACL arrays must not contain null values" msgstr "ACL ë°°ì—´ì—는 null ê°’ì„ í¬í•¨í•  수 없습니다" -#: utils/adt/acl.c:570 +#: utils/adt/acl.c:615 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "ACL 설정 ì •ë³´ ëì— ëì— ì“¸ëª¨ 없는 ë‚´ìš©ë“¤ì´ ë” í¬í•¨ë˜ì–´ìžˆìŠµë‹ˆë‹¤" -#: utils/adt/acl.c:1205 +#: utils/adt/acl.c:1263 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "부여 ì˜µì…˜ì„ í•´ë‹¹ 부여ìžì—게 다시 부여할 수 ì—†ìŒ" -#: utils/adt/acl.c:1266 -#, c-format -msgid "dependent privileges exist" -msgstr "???ì˜ì¡´(ì ì¸) ê¶Œí•œì´ ì¡´ìž¬í•©ë‹ˆë‹¤" - -#: utils/adt/acl.c:1267 -#, c-format -msgid "Use CASCADE to revoke them too." -msgstr "ê·¸ê²ƒë“¤ì„ ì·¨ì†Œí•˜ë ¤ë©´ \"CASCADE\"를 사용하세요." - -#: utils/adt/acl.c:1521 +#: utils/adt/acl.c:1579 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert ë”ì´ìƒ ì§€ì›í•˜ì§€ 않ìŒ" -#: utils/adt/acl.c:1531 +#: utils/adt/acl.c:1589 #, c-format msgid "aclremove is no longer supported" msgstr "aclremovie ë”ì´ìƒ ì§€ì›í•˜ì§€ 않ìŒ" -#: utils/adt/acl.c:1617 utils/adt/acl.c:1671 +#: utils/adt/acl.c:1709 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "알 수 없는 권한 타입: \"%s\"" -#: utils/adt/acl.c:3471 utils/adt/regproc.c:103 utils/adt/regproc.c:278 +#: utils/adt/acl.c:3550 utils/adt/regproc.c:100 utils/adt/regproc.c:265 #, c-format msgid "function \"%s\" does not exist" msgstr "\"%s\" 함수가 없습니다." -#: utils/adt/acl.c:4943 -#, c-format -msgid "must be member of role \"%s\"" -msgstr "\"%s\" ë¡¤ì˜ êµ¬ì„±ì›ì´ì–´ì•¼ 함" - -#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:933 -#: utils/adt/arrayfuncs.c:1533 utils/adt/arrayfuncs.c:3236 -#: utils/adt/arrayfuncs.c:3376 utils/adt/arrayfuncs.c:5911 -#: utils/adt/arrayfuncs.c:6252 utils/adt/arrayutils.c:93 -#: utils/adt/arrayutils.c:102 utils/adt/arrayutils.c:109 +#: utils/adt/acl.c:5196 #, c-format -msgid "array size exceeds the maximum allowed (%d)" -msgstr "ë°°ì—´ í¬ê¸°ê°€ 최대치 (%d)를 초과했습니다" +msgid "must be able to SET ROLE \"%s\"" +msgstr "SET ROLE \"%s\" ìž‘ì—…ì´ ìžˆì–´ì•¼ 함" -#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:466 -#: utils/adt/array_userfuncs.c:546 utils/adt/json.c:645 utils/adt/json.c:740 -#: utils/adt/json.c:778 utils/adt/jsonb.c:1115 utils/adt/jsonb.c:1144 -#: utils/adt/jsonb.c:1538 utils/adt/jsonb.c:1702 utils/adt/jsonb.c:1712 +#: utils/adt/array_userfuncs.c:102 utils/adt/array_userfuncs.c:489 +#: utils/adt/array_userfuncs.c:866 utils/adt/json.c:602 utils/adt/json.c:740 +#: utils/adt/json.c:790 utils/adt/jsonb.c:1025 utils/adt/jsonb.c:1098 +#: utils/adt/jsonb.c:1530 utils/adt/jsonb.c:1718 utils/adt/jsonb.c:1728 #, c-format msgid "could not determine input data type" msgstr "ìž…ë ¥ ìžë£Œí˜•ì„ ê²°ì •í•  수 ì—†ìŒ" -#: utils/adt/array_userfuncs.c:85 +#: utils/adt/array_userfuncs.c:107 #, c-format msgid "input data type is not an array" msgstr "ìž…ë ¥ ìžë£Œí˜•ì´ ë°°ì—´ì´ ì•„ë‹™ë‹ˆë‹¤." -#: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 -#: utils/adt/arrayfuncs.c:1336 utils/adt/float.c:1243 utils/adt/float.c:1317 -#: utils/adt/float.c:3960 utils/adt/float.c:3974 utils/adt/int.c:759 -#: utils/adt/int.c:781 utils/adt/int.c:795 utils/adt/int.c:809 -#: utils/adt/int.c:840 utils/adt/int.c:861 utils/adt/int.c:978 -#: utils/adt/int.c:992 utils/adt/int.c:1006 utils/adt/int.c:1039 -#: utils/adt/int.c:1053 utils/adt/int.c:1067 utils/adt/int.c:1098 -#: utils/adt/int.c:1180 utils/adt/int.c:1244 utils/adt/int.c:1312 -#: utils/adt/int.c:1318 utils/adt/int8.c:1292 utils/adt/numeric.c:1559 -#: utils/adt/numeric.c:3435 utils/adt/varbit.c:1188 utils/adt/varbit.c:1576 -#: utils/adt/varlena.c:1087 utils/adt/varlena.c:3377 +#: utils/adt/array_userfuncs.c:151 utils/adt/array_userfuncs.c:203 +#: utils/adt/float.c:1222 utils/adt/float.c:1296 utils/adt/float.c:4022 +#: utils/adt/float.c:4060 utils/adt/int.c:778 utils/adt/int.c:800 +#: utils/adt/int.c:814 utils/adt/int.c:828 utils/adt/int.c:859 +#: utils/adt/int.c:880 utils/adt/int.c:997 utils/adt/int.c:1011 +#: utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 +#: utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 +#: utils/adt/int.c:1263 utils/adt/int.c:1331 utils/adt/int.c:1337 +#: utils/adt/int8.c:1256 utils/adt/numeric.c:1917 utils/adt/numeric.c:4454 +#: utils/adt/rangetypes.c:1488 utils/adt/rangetypes.c:1501 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1135 +#: utils/adt/varlena.c:3137 #, c-format msgid "integer out of range" msgstr "정수 범위를 벗어남" -#: utils/adt/array_userfuncs.c:136 utils/adt/array_userfuncs.c:191 +#: utils/adt/array_userfuncs.c:158 utils/adt/array_userfuncs.c:213 #, c-format msgid "argument must be empty or one-dimensional array" msgstr "ì¸ìžëŠ” 비어있거나 1ì°¨ì› ë°°ì—´ì´ì–´ì•¼ 합니다." -#: utils/adt/array_userfuncs.c:273 utils/adt/array_userfuncs.c:312 -#: utils/adt/array_userfuncs.c:349 utils/adt/array_userfuncs.c:378 -#: utils/adt/array_userfuncs.c:406 +#: utils/adt/array_userfuncs.c:295 utils/adt/array_userfuncs.c:334 +#: utils/adt/array_userfuncs.c:371 utils/adt/array_userfuncs.c:400 +#: utils/adt/array_userfuncs.c:428 #, c-format msgid "cannot concatenate incompatible arrays" msgstr "ì—°ê²°í•  수 없는 배열들 입니다." -#: utils/adt/array_userfuncs.c:274 +#: utils/adt/array_userfuncs.c:296 #, c-format msgid "" "Arrays with element types %s and %s are not compatible for concatenation." msgstr "%s ìžë£Œí˜•ì˜ ë°°ì—´ê³¼ %s ìžë£Œí˜•ì˜ ë°°ì—´ì€ ì—°ê²°í•  수 없습니다." -#: utils/adt/array_userfuncs.c:313 +#: utils/adt/array_userfuncs.c:335 #, c-format msgid "Arrays of %d and %d dimensions are not compatible for concatenation." msgstr "%dì°¨ì›(ë°°ì—´ 깊ì´) ë°°ì—´ê³¼ %dì°¨ì› ë°°ì—´ì€ ì—°ê²°í•  수 없습니다." -#: utils/adt/array_userfuncs.c:350 +#: utils/adt/array_userfuncs.c:372 #, c-format msgid "" "Arrays with differing element dimensions are not compatible for " "concatenation." msgstr "ì°¨ì›(ë°°ì—´ 깊ì´)ì´ ë‹¤ë¥¸ ë°°ì—´ë“¤ì„ ì„œë¡œ í•©ì¹  수 없습니다" -#: utils/adt/array_userfuncs.c:379 utils/adt/array_userfuncs.c:407 +#: utils/adt/array_userfuncs.c:401 utils/adt/array_userfuncs.c:429 #, c-format msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "ì°¨ì›(ë°°ì—´ 깊ì´)ì´ ë‹¤ë¥¸ ë°°ì—´ë“¤ì„ ì„œë¡œ í•©ì¹  수 없습니다" -#: utils/adt/array_userfuncs.c:662 utils/adt/array_userfuncs.c:814 +#: utils/adt/array_userfuncs.c:975 utils/adt/array_userfuncs.c:983 +#: utils/adt/arrayfuncs.c:5616 utils/adt/arrayfuncs.c:5622 +#, c-format +msgid "cannot accumulate arrays of different dimensionality" +msgstr "ë°°ì—´ 차수가 서로 틀린 ë°°ì—´ì€ ëˆ„ì í•  수 ì—†ìŒ" + +#: utils/adt/array_userfuncs.c:1272 utils/adt/array_userfuncs.c:1426 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "ë‹¤ì°¨ì› ë°°ì—´ì—서 요소 검색 ê¸°ëŠ¥ì€ ì§€ì›í•˜ì§€ 않ìŒ" -#: utils/adt/array_userfuncs.c:686 +#: utils/adt/array_userfuncs.c:1301 #, c-format msgid "initial position must not be null" msgstr "초기 ìœ„ì¹˜ê°’ì€ nullê°’ì´ ì•„ë‹ˆì—¬ì•¼ 함" -#: utils/adt/arrayfuncs.c:270 utils/adt/arrayfuncs.c:284 -#: utils/adt/arrayfuncs.c:295 utils/adt/arrayfuncs.c:317 -#: utils/adt/arrayfuncs.c:332 utils/adt/arrayfuncs.c:346 -#: utils/adt/arrayfuncs.c:352 utils/adt/arrayfuncs.c:359 -#: utils/adt/arrayfuncs.c:490 utils/adt/arrayfuncs.c:506 -#: utils/adt/arrayfuncs.c:517 utils/adt/arrayfuncs.c:532 -#: utils/adt/arrayfuncs.c:553 utils/adt/arrayfuncs.c:583 -#: utils/adt/arrayfuncs.c:590 utils/adt/arrayfuncs.c:598 -#: utils/adt/arrayfuncs.c:632 utils/adt/arrayfuncs.c:655 -#: utils/adt/arrayfuncs.c:675 utils/adt/arrayfuncs.c:787 -#: utils/adt/arrayfuncs.c:796 utils/adt/arrayfuncs.c:826 -#: utils/adt/arrayfuncs.c:841 utils/adt/arrayfuncs.c:894 +#: utils/adt/array_userfuncs.c:1674 +#, c-format +msgid "sample size must be between 0 and %d" +msgstr "샘플 í¬ê¸°ëŠ” 0ì—서 %d 사ì´ì—¬ì•¼ 함" + +#: utils/adt/arrayfuncs.c:264 utils/adt/arrayfuncs.c:273 +#: utils/adt/arrayfuncs.c:284 utils/adt/arrayfuncs.c:307 +#: utils/adt/arrayfuncs.c:440 utils/adt/arrayfuncs.c:454 +#: utils/adt/arrayfuncs.c:466 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:668 utils/adt/arrayfuncs.c:703 +#: utils/adt/arrayfuncs.c:718 utils/adt/arrayfuncs.c:777 +#: utils/adt/arrayfuncs.c:782 utils/adt/arrayfuncs.c:870 +#: utils/adt/arrayfuncs.c:897 utils/adt/arrayfuncs.c:904 +#: utils/adt/arrayfuncs.c:941 #, c-format msgid "malformed array literal: \"%s\"" msgstr "비정ìƒì ì¸ ë°°ì—´ 문ìž: \"%s\"" -#: utils/adt/arrayfuncs.c:271 +#: utils/adt/arrayfuncs.c:265 #, c-format -msgid "\"[\" must introduce explicitly-specified array dimensions." -msgstr "ë°°ì—´ ì°¨ì› ì •ì˜ëŠ” \"[\" 문ìžë¡œ 시작해야 합니다." +msgid "Array value must start with \"{\" or dimension information." +msgstr "ë°°ì—´ê°’ì€ \"{\" ë˜ëŠ” ë°°ì—´ ê¹Šì´ ì •ë³´ë¡œ 시작ë˜ì–´ì•¼ 합니다" + +#: utils/adt/arrayfuncs.c:274 utils/adt/arrayfuncs.c:467 +#, c-format +msgid "Missing \"%s\" after array dimensions." +msgstr "ë°°ì—´ ì°¨ì›(ë°°ì—´ 깊ì´) 표현ì—서 \"%s\" 문ìžê°€ 빠졌습니다." #: utils/adt/arrayfuncs.c:285 #, c-format -msgid "Missing array dimension value." -msgstr "ë°°ì—´ ì°¨ì›(ë°°ì—´ 깊ì´) ê°’ì´ ë¹ ì¡ŒìŠµë‹ˆë‹¤." +msgid "Array contents must start with \"{\"." +msgstr "ë°°ì—´í˜•ì€ \"{\" 문ìžë¡œ 시작해야 합니다." -#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:333 +#: utils/adt/arrayfuncs.c:308 utils/adt/multirangetypes.c:292 #, c-format -msgid "Missing \"%s\" after array dimensions." -msgstr "ë°°ì—´ ì°¨ì›(ë°°ì—´ 깊ì´) 표현ì—서 \"%s\" 문ìžê°€ 빠졌습니다." +msgid "Junk after closing right brace." +msgstr "오른쪽 닫기 괄호 ë’¤ì— ì •í¬" -#: utils/adt/arrayfuncs.c:305 utils/adt/arrayfuncs.c:2884 -#: utils/adt/arrayfuncs.c:2916 utils/adt/arrayfuncs.c:2931 +#: utils/adt/arrayfuncs.c:431 utils/adt/arrayfuncs.c:643 #, c-format -msgid "upper bound cannot be less than lower bound" -msgstr "ìƒí•œê°’ì€ í•˜í•œê°’ë³´ë‹¤ ìž‘ì„ ìˆ˜ 없습니다" +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "ë°°ì—´ ì°¨ì›ì´ 최대치(%d)를 초과했ìŒ" -#: utils/adt/arrayfuncs.c:318 +#: utils/adt/arrayfuncs.c:441 #, c-format -msgid "Array value must start with \"{\" or dimension information." -msgstr "ë°°ì—´ê°’ì€ \"{\" ë˜ëŠ” ë°°ì—´ ê¹Šì´ ì •ë³´ë¡œ 시작ë˜ì–´ì•¼ 합니다" +msgid "\"[\" must introduce explicitly-specified array dimensions." +msgstr "ë°°ì—´ ì°¨ì› ì •ì˜ëŠ” \"[\" 문ìžë¡œ 시작해야 합니다." -#: utils/adt/arrayfuncs.c:347 +#: utils/adt/arrayfuncs.c:455 #, c-format -msgid "Array contents must start with \"{\"." -msgstr "ë°°ì—´í˜•ì€ \"{\" 문ìžë¡œ 시작해야 합니다." +msgid "Missing array dimension value." +msgstr "ë°°ì—´ ì°¨ì›(ë°°ì—´ 깊ì´) ê°’ì´ ë¹ ì¡ŒìŠµë‹ˆë‹¤." -#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 +#: utils/adt/arrayfuncs.c:481 utils/adt/arrayfuncs.c:2940 +#: utils/adt/arrayfuncs.c:2985 utils/adt/arrayfuncs.c:3000 #, c-format -msgid "Specified array dimensions do not match array contents." -msgstr "지정한 ë°°ì—´ ì°¨ì›ì— 해당하는 ë°°ì—´ì´ ì—†ìŠµë‹ˆë‹¤." +msgid "upper bound cannot be less than lower bound" +msgstr "ìƒí•œê°’ì€ í•˜í•œê°’ë³´ë‹¤ ìž‘ì„ ìˆ˜ 없습니다" -#: utils/adt/arrayfuncs.c:491 utils/adt/arrayfuncs.c:518 -#: utils/adt/rangetypes.c:2181 utils/adt/rangetypes.c:2189 -#: utils/adt/rowtypes.c:210 utils/adt/rowtypes.c:218 +#: utils/adt/arrayfuncs.c:487 #, c-format -msgid "Unexpected end of input." -msgstr "ìž…ë ¥ì˜ ì˜ˆìƒì¹˜ 못한 종료." +msgid "array upper bound is too large: %d" +msgstr "ë°°ì—´ upper boundê°€ 너무 í½ë‹ˆë‹¤: %d" -#: utils/adt/arrayfuncs.c:507 utils/adt/arrayfuncs.c:554 -#: utils/adt/arrayfuncs.c:584 utils/adt/arrayfuncs.c:633 +#: utils/adt/arrayfuncs.c:538 +#, c-format +msgid "array bound is out of integer range" +msgstr "ë°°ì—´ boundê°€ 정수 범위를 초과했ìŒ" + +#: utils/adt/arrayfuncs.c:637 utils/adt/arrayfuncs.c:669 +#: utils/adt/arrayfuncs.c:704 utils/adt/arrayfuncs.c:898 #, c-format msgid "Unexpected \"%c\" character." msgstr "예기치 ì•Šì€ \"%c\" 문ìž" -#: utils/adt/arrayfuncs.c:533 utils/adt/arrayfuncs.c:656 +#: utils/adt/arrayfuncs.c:719 #, c-format msgid "Unexpected array element." msgstr "예기치 ì•Šì€ ë°°ì—´ 요소" -#: utils/adt/arrayfuncs.c:591 +#: utils/adt/arrayfuncs.c:778 #, c-format -msgid "Unmatched \"%c\" character." -msgstr "ì§ì´ 안 맞는 \"%c\" 문ìž" +msgid "Specified array dimensions do not match array contents." +msgstr "지정한 ë°°ì—´ ì°¨ì›ì— 해당하는 ë°°ì—´ì´ ì—†ìŠµë‹ˆë‹¤." -#: utils/adt/arrayfuncs.c:599 utils/adt/jsonfuncs.c:2452 +#: utils/adt/arrayfuncs.c:783 utils/adt/jsonfuncs.c:2598 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "ë‹¤ì°¨ì› ë°°ì—´ì—는 ì¼ì¹˜í•˜ëŠ” ì°¨ì›ì´ í¬í•¨ëœ ë°°ì—´ ì‹ì´ 있어야 함" -#: utils/adt/arrayfuncs.c:676 +#: utils/adt/arrayfuncs.c:871 utils/adt/arrayfuncs.c:905 #, c-format -msgid "Junk after closing right brace." -msgstr "오른쪽 닫기 괄호 ë’¤ì— ì •í¬" +msgid "Incorrectly quoted array element." +msgstr "바르지 ì•Šì€ ë”°ì˜´í‘œ ë°°ì—´ 요소입니다." + +#: utils/adt/arrayfuncs.c:942 utils/adt/multirangetypes.c:165 +#: utils/adt/rangetypes.c:2464 utils/adt/rangetypes.c:2472 +#: utils/adt/rowtypes.c:218 utils/adt/rowtypes.c:229 +#, c-format +msgid "Unexpected end of input." +msgstr "ìž…ë ¥ì˜ ì˜ˆìƒì¹˜ 못한 종료." -#: utils/adt/arrayfuncs.c:1298 utils/adt/arrayfuncs.c:3344 -#: utils/adt/arrayfuncs.c:5817 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 +#: utils/adt/arrayfuncs.c:6106 #, c-format msgid "invalid number of dimensions: %d" msgstr "ìž˜ëª»ëœ ë°°ì—´ ì°¨ì›(ë°°ì—´ 깊ì´): %d" -#: utils/adt/arrayfuncs.c:1309 +#: utils/adt/arrayfuncs.c:1312 #, c-format msgid "invalid array flags" msgstr "ìž˜ëª»ëœ ë°°ì—´ 플래그" -#: utils/adt/arrayfuncs.c:1317 +#: utils/adt/arrayfuncs.c:1334 #, c-format -msgid "wrong element type" -msgstr "ìž˜ëª»ëœ ìš”ì†Œ 타입" +msgid "binary data has array element type %u (%s) instead of expected %u (%s)" +msgstr "ì´ì§„ ìžë£Œì— 있는 ë°°ì—´ 요소 ìžë£Œí˜•ì´ %u (%s) 입니다. 기대값: %u (%s)" -#: utils/adt/arrayfuncs.c:1367 utils/adt/rangetypes.c:335 -#: utils/cache/lsyscache.c:2835 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:450 +#: utils/adt/rangetypes.c:351 utils/cache/lsyscache.c:2958 #, c-format msgid "no binary input function available for type %s" msgstr "%s ìžë£Œí˜•ì—서 사용할 ë°”ì´ë„ˆë¦¬ ìž…ë ¥ 함수가 없습니다." -#: utils/adt/arrayfuncs.c:1507 +#: utils/adt/arrayfuncs.c:1509 #, c-format msgid "improper binary format in array element %d" msgstr "%d 번째 ë°°ì—´ ìš”ì†Œì˜ í¬ë§·ì´ ë¶€ì ì ˆí•©ë‹ˆë‹¤." -#: utils/adt/arrayfuncs.c:1588 utils/adt/rangetypes.c:340 -#: utils/cache/lsyscache.c:2868 +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 +#: utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:2991 #, c-format msgid "no binary output function available for type %s" msgstr "%s ìžë£Œí˜•ì—서 사용할 ë°”ì´ë„ˆë¦¬ 출력 함수가 없습니다." -#: utils/adt/arrayfuncs.c:2066 +#: utils/adt/arrayfuncs.c:2067 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "특정 í¬ê¸°ë¡œ ë°°ì—´ì„ ì ˆë‹¨í•˜ëŠ” ê¸°ëŠ¥ì€ êµ¬í˜„ë˜ì§€ 않습니다." -#: utils/adt/arrayfuncs.c:2244 utils/adt/arrayfuncs.c:2266 -#: utils/adt/arrayfuncs.c:2315 utils/adt/arrayfuncs.c:2551 -#: utils/adt/arrayfuncs.c:2862 utils/adt/arrayfuncs.c:5803 -#: utils/adt/arrayfuncs.c:5829 utils/adt/arrayfuncs.c:5840 -#: utils/adt/json.c:1141 utils/adt/json.c:1216 utils/adt/jsonb.c:1316 -#: utils/adt/jsonb.c:1402 utils/adt/jsonfuncs.c:4340 utils/adt/jsonfuncs.c:4490 -#: utils/adt/jsonfuncs.c:4602 utils/adt/jsonfuncs.c:4648 +#: utils/adt/arrayfuncs.c:2245 utils/adt/arrayfuncs.c:2267 +#: utils/adt/arrayfuncs.c:2316 utils/adt/arrayfuncs.c:2570 +#: utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6092 +#: utils/adt/arrayfuncs.c:6118 utils/adt/arrayfuncs.c:6129 +#: utils/adt/json.c:1433 utils/adt/json.c:1505 utils/adt/jsonb.c:1317 +#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4710 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4974 utils/adt/jsonfuncs.c:5022 #, c-format msgid "wrong number of array subscripts" msgstr "ìž˜ëª»ëœ ë°°ì—´ 하위 스í¬ë¦½íЏ(1,2...ì°¨ì› ë°°ì—´ 표시 문제)" -#: utils/adt/arrayfuncs.c:2249 utils/adt/arrayfuncs.c:2357 -#: utils/adt/arrayfuncs.c:2615 utils/adt/arrayfuncs.c:2921 +#: utils/adt/arrayfuncs.c:2250 utils/adt/arrayfuncs.c:2374 +#: utils/adt/arrayfuncs.c:2653 utils/adt/arrayfuncs.c:2990 #, c-format msgid "array subscript out of range" msgstr "ë°°ì—´ 하위 스í¬ë¦½íЏ 범위를 초과했습니다" -#: utils/adt/arrayfuncs.c:2254 +#: utils/adt/arrayfuncs.c:2255 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "ê³ ì • ê¸¸ì´ ë°°ì—´ì˜ ìš”ì†Œì— null ê°’ì„ ì§€ì •í•  수 ì—†ìŒ" -#: utils/adt/arrayfuncs.c:2809 +#: utils/adt/arrayfuncs.c:2855 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "ê³ ì •ëœ í¬ê¸°ì˜ ë°°ì—´ì˜ ì¡°ê°ì„ ì—…ë°ì´íЏ 하는 ê¸°ëŠ¥ì€ êµ¬í˜„ë˜ì§€ 않았습니다." -#: utils/adt/arrayfuncs.c:2840 +#: utils/adt/arrayfuncs.c:2886 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "ë°°ì—´ 나누기 서브스í¬ë¦½íŠ¸ëŠ” 반드시 둘다 ë²”ìœ„ì•ˆì— ìžˆì–´ì•¼ 합니다" -#: utils/adt/arrayfuncs.c:2841 +#: utils/adt/arrayfuncs.c:2887 #, c-format msgid "" "When assigning to a slice of an empty array value, slice boundaries must be " "fully specified." -msgstr "" +msgstr "빈 ë°°ì—´ 대ìƒìœ¼ë¡œ ìžë¥´ê¸°ë¥¼ í•  때는 ìžë¥´ê¸° 범위가 전체여야 합니다." -#: utils/adt/arrayfuncs.c:2852 utils/adt/arrayfuncs.c:2947 +#: utils/adt/arrayfuncs.c:2905 utils/adt/arrayfuncs.c:3017 #, c-format msgid "source array too small" msgstr "ì›ë³¸ ë°°ì—´ì´ ë„ˆë¬´ 작습니다." -#: utils/adt/arrayfuncs.c:3500 +#: utils/adt/arrayfuncs.c:3657 #, c-format msgid "null array element not allowed in this context" msgstr "ì´ êµ¬ë¬¸ì—서는 ë°°ì—´ì˜ null 요소를 허용하지 않습니다" -#: utils/adt/arrayfuncs.c:3602 utils/adt/arrayfuncs.c:3773 -#: utils/adt/arrayfuncs.c:4129 +#: utils/adt/arrayfuncs.c:3828 utils/adt/arrayfuncs.c:3999 +#: utils/adt/arrayfuncs.c:4390 #, c-format msgid "cannot compare arrays of different element types" msgstr "ë°°ì—´ 요소 ìžë£Œí˜•ì´ ì„œë¡œ 틀린 ë°°ì—´ì€ ë¹„êµí•  수 없습니다." -#: utils/adt/arrayfuncs.c:3951 utils/adt/rangetypes.c:1254 -#: utils/adt/rangetypes.c:1318 +#: utils/adt/arrayfuncs.c:4177 utils/adt/multirangetypes.c:2805 +#: utils/adt/multirangetypes.c:2877 utils/adt/rangetypes.c:1361 +#: utils/adt/rangetypes.c:1425 utils/adt/rowtypes.c:1875 #, c-format msgid "could not identify a hash function for type %s" msgstr "%s ìžë£Œí˜•ì—서 사용할 해시 함수를 ì°¾ì„ ìˆ˜ 없습니다." -#: utils/adt/arrayfuncs.c:4044 +#: utils/adt/arrayfuncs.c:4305 utils/adt/rowtypes.c:1996 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "%s ìžë£Œí˜•ì—서 사용할 í™•ìž¥ëœ í•´ì‹œ 함수를 ì°¾ì„ ìˆ˜ 없습니다." -#: utils/adt/arrayfuncs.c:5221 +#: utils/adt/arrayfuncs.c:5506 #, c-format msgid "data type %s is not an array type" msgstr "%s ìžë£Œí˜•ì€ ë°°ì—´ì´ ì•„ë‹™ë‹ˆë‹¤." -#: utils/adt/arrayfuncs.c:5276 +#: utils/adt/arrayfuncs.c:5561 #, c-format msgid "cannot accumulate null arrays" msgstr "null ë°°ì—´ì„ ëˆ„ì í•  수 ì—†ìŒ" -#: utils/adt/arrayfuncs.c:5304 +#: utils/adt/arrayfuncs.c:5589 #, c-format msgid "cannot accumulate empty arrays" msgstr "빈 ë°°ì—´ì„ ëˆ„ì í•  수 ì—†ìŒ" -#: utils/adt/arrayfuncs.c:5331 utils/adt/arrayfuncs.c:5337 -#, c-format -msgid "cannot accumulate arrays of different dimensionality" -msgstr "ë°°ì—´ 차수가 서로 틀린 ë°°ì—´ì€ ëˆ„ì í•  수 ì—†ìŒ" - -#: utils/adt/arrayfuncs.c:5701 utils/adt/arrayfuncs.c:5741 +#: utils/adt/arrayfuncs.c:5990 utils/adt/arrayfuncs.c:6030 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "ì°¨ì› ë°°ì—´ ë˜ëŠ” 하한 ë°°ì—´ì€ NULLì¼ ìˆ˜ ì—†ìŒ" -#: utils/adt/arrayfuncs.c:5804 utils/adt/arrayfuncs.c:5830 +#: utils/adt/arrayfuncs.c:6093 utils/adt/arrayfuncs.c:6119 #, c-format msgid "Dimension array must be one dimensional." msgstr "ì°¨ì› ë°°ì—´ì€ ì¼ì°¨ì› ë°°ì—´ì´ì–´ì•¼ 합니다." -#: utils/adt/arrayfuncs.c:5809 utils/adt/arrayfuncs.c:5835 +#: utils/adt/arrayfuncs.c:6098 utils/adt/arrayfuncs.c:6124 #, c-format msgid "dimension values cannot be null" msgstr "ì°¨ì› ê°’ì€ nullì¼ ìˆ˜ ì—†ìŒ" -#: utils/adt/arrayfuncs.c:5841 +#: utils/adt/arrayfuncs.c:6130 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "하한 ë°°ì—´ì˜ í¬ê¸°ê°€ ì°¨ì› ë°°ì—´ê³¼ 다릅니다." -#: utils/adt/arrayfuncs.c:6117 +#: utils/adt/arrayfuncs.c:6411 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "ë‹¤ì°¨ì› ë°°ì—´ì—서 요소 ì‚­ì œê¸°ëŠ¥ì€ ì§€ì›ë˜ì§€ 않ìŒ" -#: utils/adt/arrayfuncs.c:6394 +#: utils/adt/arrayfuncs.c:6688 #, c-format msgid "thresholds must be one-dimensional array" msgstr "threshold ê°’ì€ 1ì°¨ì› ë°°ì—´ì´ì–´ì•¼ 합니다." -#: utils/adt/arrayfuncs.c:6399 +#: utils/adt/arrayfuncs.c:6693 #, c-format msgid "thresholds array must not contain NULLs" msgstr "threshold ë°°ì—´ì—는 nullì´ í¬í•¨ë˜ì§€ 않아야 함" -#: utils/adt/arrayutils.c:209 +#: utils/adt/arrayfuncs.c:6926 +#, c-format +msgid "number of elements to trim must be between 0 and %d" +msgstr "요소 ìžë¦„ 수는 0부터 %d까지입니다" + +#: utils/adt/arraysubs.c:93 utils/adt/arraysubs.c:130 +#, c-format +msgid "array subscript must have type integer" +msgstr "ë°°ì—´ 요소 번호는 정수형ì´ì–´ì•¼ 합니다." + +#: utils/adt/arraysubs.c:198 utils/adt/arraysubs.c:217 +#, c-format +msgid "array subscript in assignment must not be null" +msgstr "ë°°ì—´ 요소 지정하는 번호값으로 null ê°’ì„ ì‚¬ìš©í•  수 없습니다" + +#: utils/adt/arrayutils.c:140 +#, c-format +msgid "array lower bound is too large: %d" +msgstr "ë°°ì—´ lower boundê°€ 너무 í½ë‹ˆë‹¤: %d" + +#: utils/adt/arrayutils.c:242 #, c-format msgid "typmod array must be type cstring[]" msgstr "typmod ë°°ì—´ì€ cstring[] 형ì‹ì´ì–´ì•¼ 함" -#: utils/adt/arrayutils.c:214 +#: utils/adt/arrayutils.c:247 #, c-format msgid "typmod array must be one-dimensional" msgstr "typmod ë°°ì—´ì€ ì¼ì°¨ì› ë°°ì—´ì´ì–´ì•¼ 함" -#: utils/adt/arrayutils.c:219 +#: utils/adt/arrayutils.c:252 #, c-format msgid "typmod array must not contain nulls" msgstr "typmod ë°°ì—´ì—는 nullì´ í¬í•¨ë˜ì§€ 않아야 함" -#: utils/adt/ascii.c:76 +#: utils/adt/ascii.c:77 #, c-format msgid "encoding conversion from %s to ASCII not supported" msgstr "%s ì¸ì½”ë”©ì„ ASCII ì¸ì½”ë”©ìœ¼ë¡œì˜ ë³€í™˜ì€ ì§€ì›í•˜ì§€ 않습니다." #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:3757 -#: utils/adt/float.c:187 utils/adt/float.c:271 utils/adt/float.c:295 -#: utils/adt/float.c:412 utils/adt/float.c:497 utils/adt/float.c:525 -#: utils/adt/geo_ops.c:220 utils/adt/geo_ops.c:230 utils/adt/geo_ops.c:242 -#: utils/adt/geo_ops.c:274 utils/adt/geo_ops.c:316 utils/adt/geo_ops.c:326 -#: utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1378 utils/adt/geo_ops.c:1413 -#: utils/adt/geo_ops.c:1421 utils/adt/geo_ops.c:3476 utils/adt/geo_ops.c:4645 -#: utils/adt/geo_ops.c:4660 utils/adt/geo_ops.c:4667 utils/adt/int8.c:126 -#: utils/adt/jsonpath.c:182 utils/adt/mac.c:94 utils/adt/mac8.c:93 -#: utils/adt/mac8.c:166 utils/adt/mac8.c:184 utils/adt/mac8.c:202 -#: utils/adt/mac8.c:221 utils/adt/network.c:100 utils/adt/numeric.c:601 -#: utils/adt/numeric.c:628 utils/adt/numeric.c:6001 utils/adt/numeric.c:6025 -#: utils/adt/numeric.c:6049 utils/adt/numeric.c:6882 utils/adt/numeric.c:6908 -#: utils/adt/numutils.c:116 utils/adt/numutils.c:126 utils/adt/numutils.c:170 -#: utils/adt/numutils.c:246 utils/adt/numutils.c:322 utils/adt/oid.c:44 -#: utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 -#: utils/adt/pg_lsn.c:73 utils/adt/tid.c:74 utils/adt/tid.c:82 -#: utils/adt/tid.c:90 utils/adt/timestamp.c:494 utils/adt/uuid.c:136 -#: utils/adt/xid8funcs.c:346 +#: utils/adt/bool.c:149 utils/adt/cash.c:354 utils/adt/datetime.c:4142 +#: utils/adt/float.c:200 utils/adt/float.c:287 utils/adt/float.c:301 +#: utils/adt/float.c:406 utils/adt/float.c:489 utils/adt/float.c:503 +#: utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 +#: utils/adt/geo_ops.c:1417 utils/adt/geo_ops.c:1454 utils/adt/geo_ops.c:1462 +#: utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 +#: utils/adt/geo_ops.c:4672 utils/adt/int.c:174 utils/adt/int.c:186 +#: utils/adt/jsonpath.c:185 utils/adt/mac.c:94 utils/adt/mac8.c:226 +#: utils/adt/network.c:99 utils/adt/numeric.c:803 utils/adt/numeric.c:7221 +#: utils/adt/numeric.c:7424 utils/adt/numeric.c:8371 utils/adt/numutils.c:356 +#: utils/adt/numutils.c:618 utils/adt/numutils.c:880 utils/adt/numutils.c:919 +#: utils/adt/numutils.c:941 utils/adt/numutils.c:1005 utils/adt/numutils.c:1027 +#: utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 +#: utils/adt/tid.c:94 utils/adt/tid.c:103 utils/adt/timestamp.c:510 +#: utils/adt/uuid.c:140 utils/adt/xid8funcs.c:360 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "%s ìžë£Œí˜• 대한 ìž˜ëª»ëœ ìž…ë ¥: \"%s\"" -#: utils/adt/cash.c:215 utils/adt/cash.c:240 utils/adt/cash.c:250 -#: utils/adt/cash.c:290 utils/adt/int8.c:118 utils/adt/numutils.c:140 -#: utils/adt/numutils.c:147 utils/adt/numutils.c:240 utils/adt/numutils.c:316 -#: utils/adt/oid.c:70 utils/adt/oid.c:109 +#: utils/adt/cash.c:98 utils/adt/cash.c:111 utils/adt/cash.c:124 +#: utils/adt/cash.c:137 utils/adt/cash.c:150 #, c-format -msgid "value \"%s\" is out of range for type %s" -msgstr "입력한 \"%s\" ê°’ì€ %s ìžë£Œí˜• 범위를 초과했습니다" +msgid "money out of range" +msgstr "money ìžë£Œí˜• ê°’ 범위를 벗어남" -#: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 -#: utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 -#: utils/adt/float.c:104 utils/adt/int.c:824 utils/adt/int.c:940 -#: utils/adt/int.c:1020 utils/adt/int.c:1082 utils/adt/int.c:1120 -#: utils/adt/int.c:1148 utils/adt/int8.c:593 utils/adt/int8.c:651 -#: utils/adt/int8.c:978 utils/adt/int8.c:1058 utils/adt/int8.c:1120 -#: utils/adt/int8.c:1200 utils/adt/numeric.c:7446 utils/adt/numeric.c:7736 -#: utils/adt/numeric.c:9318 utils/adt/timestamp.c:3264 +#: utils/adt/cash.c:161 utils/adt/cash.c:723 utils/adt/float.c:99 +#: utils/adt/int.c:843 utils/adt/int.c:959 utils/adt/int.c:1039 +#: utils/adt/int.c:1101 utils/adt/int.c:1139 utils/adt/int.c:1167 +#: utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:942 +#: utils/adt/int8.c:1022 utils/adt/int8.c:1084 utils/adt/int8.c:1164 +#: utils/adt/numeric.c:3191 utils/adt/numeric.c:3214 utils/adt/numeric.c:3299 +#: utils/adt/numeric.c:3317 utils/adt/numeric.c:3413 utils/adt/numeric.c:8920 +#: utils/adt/numeric.c:9233 utils/adt/numeric.c:9581 utils/adt/numeric.c:9697 +#: utils/adt/numeric.c:11208 utils/adt/timestamp.c:3713 #, c-format msgid "division by zero" msgstr "0으로는 나눌수 없습니다." -#: utils/adt/char.c:169 +#: utils/adt/cash.c:292 utils/adt/cash.c:317 utils/adt/cash.c:327 +#: utils/adt/cash.c:367 utils/adt/int.c:180 utils/adt/numutils.c:350 +#: utils/adt/numutils.c:612 utils/adt/numutils.c:874 utils/adt/numutils.c:925 +#: utils/adt/numutils.c:964 utils/adt/numutils.c:1011 +#, c-format +msgid "value \"%s\" is out of range for type %s" +msgstr "입력한 \"%s\" ê°’ì€ %s ìžë£Œí˜• 범위를 초과했습니다" + +#: utils/adt/char.c:197 #, c-format msgid "\"char\" out of range" msgstr "\"char\" 범위를 벗어났습니다." -#: utils/adt/date.c:61 utils/adt/timestamp.c:95 utils/adt/varbit.c:104 +#: utils/adt/cryptohashfuncs.c:48 utils/adt/cryptohashfuncs.c:70 +#, c-format +msgid "could not compute %s hash: %s" +msgstr "%s 해시 계산 실패: %s" + +#: utils/adt/date.c:64 utils/adt/timestamp.c:116 utils/adt/varbit.c:105 #: utils/adt/varchar.c:48 #, c-format msgid "invalid type modifier" msgstr "ìž˜ëª»ëœ ìžë£Œí˜• 한정ìž" -#: utils/adt/date.c:73 +#: utils/adt/date.c:76 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "TIME(%d)%s ì •ë°€ë„로 ìŒìˆ˜ë¥¼ 사용할 수 없습니다" -#: utils/adt/date.c:79 +#: utils/adt/date.c:82 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%s ì •ë°€ë„는 최대값(%d)으로 줄였습니다" -#: utils/adt/date.c:158 utils/adt/date.c:166 utils/adt/formatting.c:4210 -#: utils/adt/formatting.c:4219 utils/adt/formatting.c:4325 -#: utils/adt/formatting.c:4335 +#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4424 +#: utils/adt/formatting.c:4433 utils/adt/formatting.c:4538 +#: utils/adt/formatting.c:4548 #, c-format msgid "date out of range: \"%s\"" msgstr "ë‚ ì§œ 범위가 벗어났ìŒ: \"%s\"" -#: utils/adt/date.c:213 utils/adt/date.c:525 utils/adt/date.c:549 -#: utils/adt/xml.c:2210 +#: utils/adt/date.c:222 utils/adt/date.c:520 utils/adt/date.c:544 +#: utils/adt/rangetypes.c:1584 utils/adt/rangetypes.c:1599 utils/adt/xml.c:2552 #, c-format msgid "date out of range" msgstr "날짜가 범위를 벗어남" -#: utils/adt/date.c:259 utils/adt/timestamp.c:574 +#: utils/adt/date.c:268 utils/adt/timestamp.c:598 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "ë‚ ì§œ í•„ë“œì˜ ê°’ì´ ë²”ìœ„ë¥¼ 벗어남: %d-%02d-%02d" -#: utils/adt/date.c:266 utils/adt/date.c:275 utils/adt/timestamp.c:580 +#: utils/adt/date.c:275 utils/adt/date.c:284 utils/adt/timestamp.c:604 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "ë‚ ì§œ 범위가 벗어났ìŒ: %d-%02d-%02d" -#: utils/adt/date.c:313 utils/adt/date.c:336 utils/adt/date.c:362 -#: utils/adt/date.c:1170 utils/adt/date.c:1216 utils/adt/date.c:1772 -#: utils/adt/date.c:1803 utils/adt/date.c:1832 utils/adt/date.c:2664 -#: utils/adt/datetime.c:1655 utils/adt/formatting.c:4067 -#: utils/adt/formatting.c:4099 utils/adt/formatting.c:4179 -#: utils/adt/formatting.c:4301 utils/adt/json.c:418 utils/adt/json.c:457 -#: utils/adt/timestamp.c:222 utils/adt/timestamp.c:254 -#: utils/adt/timestamp.c:692 utils/adt/timestamp.c:701 -#: utils/adt/timestamp.c:779 utils/adt/timestamp.c:812 -#: utils/adt/timestamp.c:2843 utils/adt/timestamp.c:2864 -#: utils/adt/timestamp.c:2877 utils/adt/timestamp.c:2886 -#: utils/adt/timestamp.c:2894 utils/adt/timestamp.c:2949 -#: utils/adt/timestamp.c:2972 utils/adt/timestamp.c:2985 -#: utils/adt/timestamp.c:2996 utils/adt/timestamp.c:3004 -#: utils/adt/timestamp.c:3664 utils/adt/timestamp.c:3789 -#: utils/adt/timestamp.c:3830 utils/adt/timestamp.c:3920 -#: utils/adt/timestamp.c:3964 utils/adt/timestamp.c:4067 -#: utils/adt/timestamp.c:4552 utils/adt/timestamp.c:4748 -#: utils/adt/timestamp.c:5075 utils/adt/timestamp.c:5089 -#: utils/adt/timestamp.c:5094 utils/adt/timestamp.c:5108 -#: utils/adt/timestamp.c:5141 utils/adt/timestamp.c:5218 -#: utils/adt/timestamp.c:5259 utils/adt/timestamp.c:5263 -#: utils/adt/timestamp.c:5332 utils/adt/timestamp.c:5336 -#: utils/adt/timestamp.c:5350 utils/adt/timestamp.c:5384 utils/adt/xml.c:2232 -#: utils/adt/xml.c:2239 utils/adt/xml.c:2259 utils/adt/xml.c:2266 -#, c-format -msgid "timestamp out of range" -msgstr "타임스탬프 범위를 벗어남" - -#: utils/adt/date.c:500 +#: utils/adt/date.c:495 #, c-format msgid "cannot subtract infinite dates" msgstr "무한 날짜를 뺄 수 ì—†ìŒ" -#: utils/adt/date.c:589 utils/adt/date.c:646 utils/adt/date.c:680 -#: utils/adt/date.c:2701 utils/adt/date.c:2711 +#: utils/adt/date.c:593 utils/adt/date.c:656 utils/adt/date.c:692 +#: utils/adt/date.c:2906 utils/adt/date.c:2916 #, c-format msgid "date out of range for timestamp" msgstr "날짜가 타임스탬프 범위를 벗어남" -#: utils/adt/date.c:1389 utils/adt/date.c:2159 utils/adt/formatting.c:4387 +#: utils/adt/date.c:1122 utils/adt/date.c:1205 utils/adt/date.c:1221 +#: utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4726 +#: utils/adt/timestamp.c:4941 utils/adt/timestamp.c:5089 +#: utils/adt/timestamp.c:5342 utils/adt/timestamp.c:5543 +#: utils/adt/timestamp.c:5590 utils/adt/timestamp.c:5814 +#: utils/adt/timestamp.c:5861 utils/adt/timestamp.c:5941 +#: utils/adt/timestamp.c:6070 +#, c-format +msgid "unit \"%s\" not supported for type %s" +msgstr "\"%s\" 단위는 %s ìžë£Œí˜•ì˜ ê°’ 단위로 ì§€ì›í•˜ì§€ 않ìŒ" + +#: utils/adt/date.c:1230 utils/adt/date.c:2231 utils/adt/date.c:3031 +#: utils/adt/timestamp.c:4740 utils/adt/timestamp.c:4958 +#: utils/adt/timestamp.c:5103 utils/adt/timestamp.c:5302 +#: utils/adt/timestamp.c:5599 utils/adt/timestamp.c:5870 +#: utils/adt/timestamp.c:5911 utils/adt/timestamp.c:6131 +#, c-format +msgid "unit \"%s\" not recognized for type %s" +msgstr "\"%s\" 는 %s ìžë£Œí˜•ì˜ ë‹¨ìœ„ë¡œ ì¸ì‹ë  수 ì—†ìŒ" + +#: utils/adt/date.c:1314 utils/adt/date.c:1360 utils/adt/date.c:1919 +#: utils/adt/date.c:1950 utils/adt/date.c:1979 utils/adt/date.c:2869 +#: utils/adt/date.c:3101 utils/adt/datetime.c:422 utils/adt/datetime.c:1807 +#: utils/adt/formatting.c:4269 utils/adt/formatting.c:4305 +#: utils/adt/formatting.c:4392 utils/adt/formatting.c:4514 utils/adt/json.c:366 +#: utils/adt/json.c:405 utils/adt/timestamp.c:248 utils/adt/timestamp.c:280 +#: utils/adt/timestamp.c:716 utils/adt/timestamp.c:725 +#: utils/adt/timestamp.c:803 utils/adt/timestamp.c:836 +#: utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3075 +#: utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3097 +#: utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3129 +#: utils/adt/timestamp.c:3140 utils/adt/timestamp.c:3146 +#: utils/adt/timestamp.c:3152 utils/adt/timestamp.c:3157 +#: utils/adt/timestamp.c:3210 utils/adt/timestamp.c:3219 +#: utils/adt/timestamp.c:3240 utils/adt/timestamp.c:3245 +#: utils/adt/timestamp.c:3266 utils/adt/timestamp.c:3279 +#: utils/adt/timestamp.c:3293 utils/adt/timestamp.c:3301 +#: utils/adt/timestamp.c:3307 utils/adt/timestamp.c:3312 +#: utils/adt/timestamp.c:4380 utils/adt/timestamp.c:4532 +#: utils/adt/timestamp.c:4608 utils/adt/timestamp.c:4644 +#: utils/adt/timestamp.c:4734 utils/adt/timestamp.c:4813 +#: utils/adt/timestamp.c:4849 utils/adt/timestamp.c:4952 +#: utils/adt/timestamp.c:5407 utils/adt/timestamp.c:5681 +#: utils/adt/timestamp.c:6199 utils/adt/timestamp.c:6209 +#: utils/adt/timestamp.c:6214 utils/adt/timestamp.c:6220 +#: utils/adt/timestamp.c:6260 utils/adt/timestamp.c:6347 +#: utils/adt/timestamp.c:6388 utils/adt/timestamp.c:6392 +#: utils/adt/timestamp.c:6446 utils/adt/timestamp.c:6450 +#: utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2574 +#: utils/adt/xml.c:2581 utils/adt/xml.c:2601 utils/adt/xml.c:2608 +#, c-format +msgid "timestamp out of range" +msgstr "타임스탬프 범위를 벗어남" + +#: utils/adt/date.c:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4597 #, c-format msgid "time out of range" msgstr "시간 범위를 벗어남" -#: utils/adt/date.c:1441 utils/adt/timestamp.c:589 +#: utils/adt/date.c:1588 utils/adt/timestamp.c:613 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "시간 í•„ë“œì˜ ê°’ì´ ë²”ìœ„ë¥¼ 벗어남: %d:%02d:%02g" -#: utils/adt/date.c:1961 utils/adt/date.c:2463 utils/adt/float.c:1071 -#: utils/adt/float.c:1140 utils/adt/int.c:616 utils/adt/int.c:663 -#: utils/adt/int.c:698 utils/adt/int8.c:492 utils/adt/numeric.c:2197 -#: utils/adt/timestamp.c:3313 utils/adt/timestamp.c:3344 -#: utils/adt/timestamp.c:3375 +#: utils/adt/date.c:2020 #, c-format -msgid "invalid preceding or following size in window function" -msgstr "윈ë„ìš° 함수ì—서 ì•žì— ì˜¤ê±°ë‚˜ ë’¤ì— ë”°ë¼ì˜¤ëŠ” í¬ê¸°ê°€ 잘못ë¨" +msgid "cannot convert infinite interval to time" +msgstr "infinite interval ìžë£Œí˜•ì€ time ìžë£Œí˜•으로 변환할 수 ì—†ìŒ" -#: utils/adt/date.c:2046 utils/adt/date.c:2059 +#: utils/adt/date.c:2061 utils/adt/date.c:2605 #, c-format -msgid "\"time\" units \"%s\" not recognized" -msgstr "\"%s\" 는 \"time\" ìžë£Œí˜• 단위가 아닙니다." +msgid "cannot add infinite interval to time" +msgstr "infinite interval ìžë£Œí˜• + time ìžë£Œí˜• ê³„ì‚°ì€ í•  수 ì—†ìŒ" -#: utils/adt/date.c:2167 +#: utils/adt/date.c:2084 utils/adt/date.c:2632 #, c-format -msgid "time zone displacement out of range" -msgstr "타임 ì¡´ 변위가 범위를 벗어남" +msgid "cannot subtract infinite interval from time" +msgstr "infinite interval ìžë£Œí˜• - 시간 ìžë£Œí˜• ê³„ì‚°ì€ í•  수 ì—†ìŒ" -#: utils/adt/date.c:2796 utils/adt/date.c:2809 +#: utils/adt/date.c:2115 utils/adt/date.c:2667 utils/adt/float.c:1036 +#: utils/adt/float.c:1112 utils/adt/int.c:635 utils/adt/int.c:682 +#: utils/adt/int.c:717 utils/adt/int8.c:413 utils/adt/numeric.c:2595 +#: utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 +#: utils/adt/timestamp.c:3888 #, c-format -msgid "\"time with time zone\" units \"%s\" not recognized" -msgstr "\"%s\" 는 \"time with time zone\" ìžë£Œí˜•ì˜ ë‹¨ìœ„ê°€ 아닙니다." +msgid "invalid preceding or following size in window function" +msgstr "윈ë„ìš° 함수ì—서 ì•žì— ì˜¤ê±°ë‚˜ ë’¤ì— ë”°ë¼ì˜¤ëŠ” í¬ê¸°ê°€ 잘못ë¨" -#: utils/adt/date.c:2882 utils/adt/datetime.c:906 utils/adt/datetime.c:1813 -#: utils/adt/datetime.c:4601 utils/adt/timestamp.c:513 -#: utils/adt/timestamp.c:540 utils/adt/timestamp.c:4150 -#: utils/adt/timestamp.c:5100 utils/adt/timestamp.c:5342 +#: utils/adt/date.c:2360 #, c-format -msgid "time zone \"%s\" not recognized" -msgstr "\"%s\" ì´ë¦„ì˜ ì‹œê°„ëŒ€ëŠ” 없습니다." +msgid "time zone displacement out of range" +msgstr "타임 ì¡´ 변위가 범위를 벗어남" + +#: utils/adt/date.c:3132 utils/adt/timestamp.c:6242 utils/adt/timestamp.c:6479 +#, c-format +msgid "interval time zone \"%s\" must be finite" +msgstr "" +"\"%s\" 시간대 간격(interval time zone) ê°’ì€ ìœ í•œí•´ì•¼ 함" -#: utils/adt/date.c:2914 utils/adt/timestamp.c:5130 utils/adt/timestamp.c:5373 +#: utils/adt/date.c:3139 utils/adt/timestamp.c:6249 utils/adt/timestamp.c:6486 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "" "\"%s\" 시간대 간격(interval time zone) 값으로 달(month) ë˜ëŠ” ì¼(day)ì„ í¬í•¨" "í•  수 없습니다" -#: utils/adt/datetime.c:3730 utils/adt/datetime.c:3737 +#: utils/adt/datetime.c:3232 utils/adt/datetime.c:4127 +#: utils/adt/datetime.c:4133 utils/adt/timestamp.c:528 +#, c-format +msgid "time zone \"%s\" not recognized" +msgstr "\"%s\" ì´ë¦„ì˜ ì‹œê°„ëŒ€ëŠ” 없습니다." + +#: utils/adt/datetime.c:4101 utils/adt/datetime.c:4108 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "ë‚ ì§œ/시간 í•„ë“œì˜ ê°’ì´ ë²”ìœ„ë¥¼ 벗어남: \"%s\"" -#: utils/adt/datetime.c:3739 +#: utils/adt/datetime.c:4110 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "ë‚ ì§œ 표현 ë°©ì‹(\"datestyle\")ì„ ë‹¤ë¥¸ 것으로 사용하고 있는 듯 합니다." -#: utils/adt/datetime.c:3744 +#: utils/adt/datetime.c:4115 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "interval í•„ë“œì˜ ê°’ì´ ë²”ìœ„ë¥¼ 벗어남: \"%s\"" -#: utils/adt/datetime.c:3750 +#: utils/adt/datetime.c:4121 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "표준시간대 범위를 벗어남: \"%s\"" -#: utils/adt/datetime.c:4603 +#: utils/adt/datetime.c:4135 #, c-format msgid "" "This time zone name appears in the configuration file for time zone " "abbreviation \"%s\"." msgstr "" +"ì´ ì‹œê°„ëŒ€ ì´ë¦„ì€ ì‹œê°„ëŒ€ 약어 \"%s\"ì— ëŒ€í•œ 환경 설정 파ì¼ì— 나타납니다." -#: utils/adt/datum.c:89 utils/adt/datum.c:101 +#: utils/adt/datum.c:90 utils/adt/datum.c:102 #, c-format msgid "invalid Datum pointer" msgstr "ìž˜ëª»ëœ Datum í¬ì¸í„°" -#: utils/adt/dbsize.c:759 utils/adt/dbsize.c:827 +#: utils/adt/dbsize.c:764 utils/adt/dbsize.c:840 #, c-format msgid "invalid size: \"%s\"" msgstr "ìž˜ëª»ëœ í¬ê¸°: \"%s\"" -#: utils/adt/dbsize.c:828 +#: utils/adt/dbsize.c:841 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "ìž˜ëª»ëœ í¬ê¸° 단위: \"%s\"" -#: utils/adt/dbsize.c:829 +#: utils/adt/dbsize.c:842 #, c-format -msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", and \"TB\"." +msgid "" +"Valid units are \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." msgstr "" -"ì´ ë§¤ê°œ ë³€ìˆ˜ì— ìœ íš¨í•œ 단위는 \"bytes\",\"kB\", \"MB\", \"GB\", \"TB\"입니다." +"유효한 단위는 \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", \"PB\"입니다." -#: utils/adt/domains.c:92 +#: utils/adt/domains.c:95 #, c-format msgid "type %s is not a domain" msgstr "%s ìžë£Œí˜•ì€ ë„ë©”ì¸ì´ 아닙니다" -#: utils/adt/encode.c:64 utils/adt/encode.c:112 +#: utils/adt/encode.c:66 utils/adt/encode.c:114 #, c-format msgid "unrecognized encoding: \"%s\"" msgstr "알 수 없는 ì¸ì½”딩: \"%s\"" -#: utils/adt/encode.c:78 +#: utils/adt/encode.c:80 #, c-format msgid "result of encoding conversion is too large" msgstr "ì¸ì½”딩 변환 결과가 너무 ê¹ë‹ˆë‹¤" -#: utils/adt/encode.c:126 +#: utils/adt/encode.c:128 #, c-format msgid "result of decoding conversion is too large" msgstr "디코딩 변환 결과가 너무 ê¹ë‹ˆë‹¤" -#: utils/adt/encode.c:184 +#: utils/adt/encode.c:217 utils/adt/encode.c:227 #, c-format -msgid "invalid hexadecimal digit: \"%c\"" -msgstr "ìž˜ëª»ëœ 16진수: \"%c\"" +msgid "invalid hexadecimal digit: \"%.*s\"" +msgstr "ìž˜ëª»ëœ 16진수: \"%.*s\"" -#: utils/adt/encode.c:212 +#: utils/adt/encode.c:223 #, c-format msgid "invalid hexadecimal data: odd number of digits" msgstr "ìž˜ëª»ëœ 16진수 ë°ì´í„°: ë°ì´í„°ì˜ 길ì´ê°€ 홀수 입니다." -#: utils/adt/encode.c:329 +#: utils/adt/encode.c:344 #, c-format msgid "unexpected \"=\" while decoding base64 sequence" msgstr "base64 ìžë£Œë¥¼ 디코딩 하는 중 예ìƒì¹˜ 못한 \"=\" ë¬¸ìž ë°œê²¬" -#: utils/adt/encode.c:341 +#: utils/adt/encode.c:356 #, c-format -msgid "invalid symbol \"%c\" while decoding base64 sequence" -msgstr "base64 ìžë£Œë¥¼ 디코딩 하는 중 ìž˜ëª»ëœ \"%c\" 기호 발견" +msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" +msgstr "base64 ìžë£Œë¥¼ 디코딩 하는 중 ìž˜ëª»ëœ \"%.*s\" 기호 발견" -#: utils/adt/encode.c:361 +#: utils/adt/encode.c:377 #, c-format msgid "invalid base64 end sequence" msgstr "base64 마침 ì¡°í•©ì´ ìž˜ëª»ë˜ì—ˆìŒ" -#: utils/adt/encode.c:362 +#: utils/adt/encode.c:378 #, c-format msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "ìž…ë ¥ê°’ì— ì—¬ë°± ì²˜ë¦¬ê°’ì´ ë¹ ì¡Œê±°ë‚˜, ìžë£Œê°€ ì†ìƒë˜ì—ˆìŠµë‹ˆë‹¤." -#: utils/adt/encode.c:476 utils/adt/encode.c:541 utils/adt/jsonfuncs.c:619 -#: utils/adt/varlena.c:319 utils/adt/varlena.c:360 jsonpath_gram.y:528 -#: jsonpath_scan.l:519 jsonpath_scan.l:530 jsonpath_scan.l:540 -#: jsonpath_scan.l:582 +#: utils/adt/encode.c:492 utils/adt/encode.c:557 utils/adt/jsonfuncs.c:659 +#: utils/adt/varlena.c:333 utils/adt/varlena.c:374 jsonpath_gram.y:266 +#: jsonpath_gram.y:598 jsonpath_scan.l:640 jsonpath_scan.l:651 +#: jsonpath_scan.l:661 jsonpath_scan.l:712 #, c-format msgid "invalid input syntax for type %s" msgstr "%s ìžë£Œí˜•ì— ëŒ€í•œ ìž˜ëª»ëœ ìž…ë ¥ 구문" -#: utils/adt/enum.c:100 +#: utils/adt/enum.c:99 #, c-format msgid "unsafe use of new value \"%s\" of enum type %s" -msgstr "" +msgstr "\"%s\" 새 ê°’ì´ ì•ˆì „í•˜ì§€ 않게 사용ë˜ì—ˆìŠµë‹ˆë‹¤. 해당 ìžë£Œí˜•: %s" -#: utils/adt/enum.c:103 +#: utils/adt/enum.c:102 #, c-format msgid "New enum values must be committed before they can be used." -msgstr "" +msgstr "새 요소 ê°’ì€ ì‚¬ìš©ë˜ê¸° ì „ì— ë¨¼ì € 커밋ë˜ì–´ì•¼ 합니다." -#: utils/adt/enum.c:121 utils/adt/enum.c:131 utils/adt/enum.c:189 -#: utils/adt/enum.c:199 +#: utils/adt/enum.c:121 utils/adt/enum.c:131 utils/adt/enum.c:194 +#: utils/adt/enum.c:204 #, c-format msgid "invalid input value for enum %s: \"%s\"" msgstr "%s ì—´ê±°í˜•ì˜ ìž…ë ¥ ê°’ì´ ìž˜ëª»ë¨: \"%s\"" -#: utils/adt/enum.c:161 utils/adt/enum.c:227 utils/adt/enum.c:286 +#: utils/adt/enum.c:166 utils/adt/enum.c:232 utils/adt/enum.c:291 #, c-format msgid "invalid internal value for enum: %u" msgstr "ì—´ê±°í˜•ì˜ ë‚´ë¶€ ê°’ì´ ìž˜ëª»ë¨: %u" -#: utils/adt/enum.c:446 utils/adt/enum.c:475 utils/adt/enum.c:515 -#: utils/adt/enum.c:535 +#: utils/adt/enum.c:451 utils/adt/enum.c:480 utils/adt/enum.c:520 +#: utils/adt/enum.c:540 #, c-format msgid "could not determine actual enum type" msgstr "실제 ì—´ê±°í˜•ì˜ ìžë£Œí˜•ì„ í™•ì¸í•  수 ì—†ìŒ" -#: utils/adt/enum.c:454 utils/adt/enum.c:483 +#: utils/adt/enum.c:459 utils/adt/enum.c:488 #, c-format msgid "enum %s contains no values" msgstr "\"%s\" 열거형 ìžë£Œì— ê°’ì´ ì—†ìŒ" -#: utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 -#: utils/cache/typcache.c:1632 utils/cache/typcache.c:1788 -#: utils/cache/typcache.c:1918 utils/fmgr/funcapi.c:456 -#, c-format -msgid "type %s is not composite" -msgstr "%s ìžë£Œí˜•ì€ ë³µí•© ìžë£Œí˜•ì´ ì•„ë‹™ë‹ˆë‹¤" - -#: utils/adt/float.c:88 +#: utils/adt/float.c:83 #, c-format msgid "value out of range: overflow" msgstr "ê°’ì´ ë²”ìœ„ë¥¼ 벗어남: 오버플로" -#: utils/adt/float.c:96 +#: utils/adt/float.c:91 #, c-format msgid "value out of range: underflow" msgstr "ê°’ì´ ë²”ìœ„ë¥¼ 벗어남: ì–¸ë”플로" -#: utils/adt/float.c:265 +#: utils/adt/float.c:280 #, c-format msgid "\"%s\" is out of range for type real" msgstr "\"%s\"는 real ìžë£Œí˜•ì˜ ë²”ìœ„ë¥¼ 벗어납니다." -#: utils/adt/float.c:489 +#: utils/adt/float.c:482 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "\"%s\"는 double precision ìžë£Œí˜•ì˜ ë²”ìœ„ë¥¼ 벗어납니다." -#: utils/adt/float.c:1268 utils/adt/float.c:1342 utils/adt/int.c:336 -#: utils/adt/int.c:874 utils/adt/int.c:896 utils/adt/int.c:910 -#: utils/adt/int.c:924 utils/adt/int.c:956 utils/adt/int.c:1194 -#: utils/adt/int8.c:1313 utils/adt/numeric.c:3553 utils/adt/numeric.c:3562 +#: utils/adt/float.c:1247 utils/adt/float.c:1321 utils/adt/int.c:355 +#: utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 +#: utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 +#: utils/adt/int8.c:1277 utils/adt/numeric.c:4593 utils/adt/numeric.c:4598 #, c-format msgid "smallint out of range" msgstr "smallintì˜ ë²”ìœ„ë¥¼ 벗어났습니다." -#: utils/adt/float.c:1468 utils/adt/numeric.c:8329 +#: utils/adt/float.c:1447 utils/adt/numeric.c:3709 utils/adt/numeric.c:10112 #, c-format msgid "cannot take square root of a negative number" msgstr "ìŒìˆ˜ì˜ ì œê³±ê·¼ì„ êµ¬í•  수 없습니다." -#: utils/adt/float.c:1536 utils/adt/numeric.c:3239 +#: utils/adt/float.c:1515 utils/adt/numeric.c:3997 utils/adt/numeric.c:4109 #, c-format msgid "zero raised to a negative power is undefined" msgstr "0ì˜ ìŒìˆ˜ ê±°ë“­ì œê³±ì´ ì •ì˜ë˜ì–´ 있지 않ìŒ" -#: utils/adt/float.c:1540 utils/adt/numeric.c:3245 +#: utils/adt/float.c:1519 utils/adt/numeric.c:4001 utils/adt/numeric.c:11003 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "ìŒìˆ˜ì˜ 비정수 ê±°ë“­ì œê³±ì„ ê³„ì‚°í•˜ë©´ 복잡한 결과가 ìƒì„±ë¨" -#: utils/adt/float.c:1614 utils/adt/float.c:1647 utils/adt/numeric.c:8993 +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3909 +#: utils/adt/numeric.c:10783 #, c-format msgid "cannot take logarithm of zero" msgstr "0ì˜ ëŒ€ìˆ˜ë¥¼ 구할 수 없습니다." -#: utils/adt/float.c:1618 utils/adt/float.c:1651 utils/adt/numeric.c:8997 +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3847 +#: utils/adt/numeric.c:3904 utils/adt/numeric.c:10787 #, c-format msgid "cannot take logarithm of a negative number" msgstr "ìŒìˆ˜ì˜ 대수를 구할 수 없습니다." -#: utils/adt/float.c:1684 utils/adt/float.c:1715 utils/adt/float.c:1810 -#: utils/adt/float.c:1837 utils/adt/float.c:1865 utils/adt/float.c:1892 -#: utils/adt/float.c:2039 utils/adt/float.c:2076 utils/adt/float.c:2246 -#: utils/adt/float.c:2302 utils/adt/float.c:2367 utils/adt/float.c:2424 -#: utils/adt/float.c:2615 utils/adt/float.c:2639 +#: utils/adt/float.c:1765 utils/adt/float.c:1796 utils/adt/float.c:1891 +#: utils/adt/float.c:1918 utils/adt/float.c:1946 utils/adt/float.c:1973 +#: utils/adt/float.c:2120 utils/adt/float.c:2157 utils/adt/float.c:2327 +#: utils/adt/float.c:2383 utils/adt/float.c:2448 utils/adt/float.c:2505 +#: utils/adt/float.c:2696 utils/adt/float.c:2720 #, c-format msgid "input is out of range" msgstr "ìž…ë ¥ê°’ì´ ë²”ìœ„ë¥¼ 벗어났습니다." -#: utils/adt/float.c:2706 -#, c-format -msgid "setseed parameter %g is out of allowed range [-1,1]" -msgstr "" - -#: utils/adt/float.c:3938 utils/adt/numeric.c:1509 +#: utils/adt/float.c:4000 utils/adt/numeric.c:1857 #, c-format msgid "count must be greater than zero" -msgstr "카운트 ê°’ì€ 0 보다 커야합니다" +msgstr "카운트 ê°’ì€ 0 보다 커야 합니다" -#: utils/adt/float.c:3943 utils/adt/numeric.c:1516 +#: utils/adt/float.c:4005 utils/adt/numeric.c:1868 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "피연산ìž, 하한 ë° ìƒí•œì€ NaNì¼ ìˆ˜ ì—†ìŒ" -#: utils/adt/float.c:3949 +#: utils/adt/float.c:4011 utils/adt/numeric.c:1873 #, c-format msgid "lower and upper bounds must be finite" msgstr "하한 ë° ìƒí•œì€ 유한한 ê°’ì´ì–´ì•¼ 함" -#: utils/adt/float.c:3983 utils/adt/numeric.c:1529 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1887 #, c-format msgid "lower bound cannot equal upper bound" msgstr "í•˜í•œê°’ì€ ìƒí•œê°’ê³¼ ê°™ì„ ìˆ˜ 없습니다" -#: utils/adt/formatting.c:532 +#: utils/adt/formatting.c:530 #, c-format msgid "invalid format specification for an interval value" msgstr "간격 ê°’ì— ëŒ€í•œ í˜•ì‹ ì§€ì •ì´ ìž˜ëª»ë¨" -#: utils/adt/formatting.c:533 +#: utils/adt/formatting.c:531 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "ê°„ê²©ì´ íŠ¹ì • 달력 ë‚ ì§œì— ì—°ê²°ë˜ì–´ 있지 않습니다." -#: utils/adt/formatting.c:1157 +#: utils/adt/formatting.c:1161 #, c-format msgid "\"EEEE\" must be the last pattern used" -msgstr "" +msgstr "\"EEEE\"는 ì‚¬ìš©ëœ ë§ˆì§€ë§‰ 패턴ì´ì–´ì•¼ 합니다." -#: utils/adt/formatting.c:1165 +#: utils/adt/formatting.c:1169 #, c-format msgid "\"9\" must be ahead of \"PR\"" -msgstr "???\"9\"는 \"PR\" 앞ì´ì–´ì•¼ 한다." +msgstr "\"9\"는 \"PR\" ì•žì— ìžˆì–´ì•¼ 합니다." -#: utils/adt/formatting.c:1181 +#: utils/adt/formatting.c:1185 #, c-format msgid "\"0\" must be ahead of \"PR\"" -msgstr "???\"0\"ì€ \"PR\" 앞ì´ì–´ì•¼ 한다." +msgstr "\"0\"ì€ \"PR\" ì•žì— ìžˆì–´ì•¼ 합니다." -#: utils/adt/formatting.c:1208 +#: utils/adt/formatting.c:1212 #, c-format msgid "multiple decimal points" -msgstr "???ì—¬ëŸ¬ê°œì˜ ì†Œìˆ«ì " +msgstr "소숫ì ì´ 여러개 있습니다." -#: utils/adt/formatting.c:1212 utils/adt/formatting.c:1295 +#: utils/adt/formatting.c:1216 utils/adt/formatting.c:1299 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "\"V\" 와 소숫ì ì„ 함께 쓸 수 없습니다." -#: utils/adt/formatting.c:1224 +#: utils/adt/formatting.c:1228 #, c-format msgid "cannot use \"S\" twice" msgstr "\"S\"를 ë‘ ë²ˆ 사용할 수 ì—†ìŒ" -#: utils/adt/formatting.c:1228 +#: utils/adt/formatting.c:1232 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "\"S\" 와 \"PL\"/\"MI\"/\"SG\"/\"PR\" 를 함께 쓸 수 없습니다." -#: utils/adt/formatting.c:1248 +#: utils/adt/formatting.c:1252 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "\"S\" 와 \"MI\" 를 함께 쓸 수 없습니다." -#: utils/adt/formatting.c:1258 +#: utils/adt/formatting.c:1262 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "\"S\" 와 \"PL\" 를 함께 쓸 수 없습니다." -#: utils/adt/formatting.c:1268 +#: utils/adt/formatting.c:1272 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "\"S\" 와 \"SG\" 를 함께 쓸 수 없습니다." -#: utils/adt/formatting.c:1277 +#: utils/adt/formatting.c:1281 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "\"PR\" 와 \"S\"/\"PL\"/\"MI\"/\"SG\" 를 함께 쓸 수 없습니다." -#: utils/adt/formatting.c:1303 +#: utils/adt/formatting.c:1307 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "\"EEEE\"를 ë‘ ë²ˆ 사용할 수 ì—†ìŒ" -#: utils/adt/formatting.c:1309 +#: utils/adt/formatting.c:1313 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\"는 다른 í¬ë§·ê³¼ 호환하지 않습니다" -#: utils/adt/formatting.c:1310 +#: utils/adt/formatting.c:1314 #, c-format msgid "" "\"EEEE\" may only be used together with digit and decimal point patterns." -msgstr "" +msgstr "\"EEEE\"는 숫ìžì™€ ì†Œìˆ˜ì  íŒ¨í„´, ì´ ë‘ í˜•ì‹ê³¼ 함께 사용ë˜ì–´ì•¼ 합니다." -#: utils/adt/formatting.c:1394 +#: utils/adt/formatting.c:1398 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "ìž˜ëª»ëœ datetime ì–‘ì‹ êµ¬ë¶„ìž: \"%s\"" -#: utils/adt/formatting.c:1522 +#: utils/adt/formatting.c:1525 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\"는 숫ìžê°€ 아닙니다." -#: utils/adt/formatting.c:1600 +#: utils/adt/formatting.c:1603 #, c-format msgid "case conversion failed: %s" msgstr "ìž˜ëª»ëœ í˜• 변환 규칙: %s" -#: utils/adt/formatting.c:1665 utils/adt/formatting.c:1789 -#: utils/adt/formatting.c:1914 +#: utils/adt/formatting.c:1651 utils/adt/formatting.c:1799 +#: utils/adt/formatting.c:1989 #, c-format msgid "could not determine which collation to use for %s function" msgstr "%s 함수ì—서 사용할 정렬규칙(collation)ì„ ê²°ì •í•  수 ì—†ìŒ" -#: utils/adt/formatting.c:2286 +#: utils/adt/formatting.c:2410 #, c-format msgid "invalid combination of date conventions" msgstr "ë‚ ì§œ ë³€í™˜ì„ ìœ„í•œ ìž˜ëª»ëœ ì¡°í•©" -#: utils/adt/formatting.c:2287 +#: utils/adt/formatting.c:2411 #, c-format msgid "" "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "" "í˜•ì‹ í…œí”Œë¦¿ì— ê·¸ë ˆê³ ë¦¬ì˜¤ë ¥ê³¼ ISO week date ë³€í™˜ì„ í•¨ê»˜ 사용하지 마십시오." -#: utils/adt/formatting.c:2310 +#: utils/adt/formatting.c:2433 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "í˜•ì‹ ë¬¸ìžì—´ì—서 \"%s\" í•„ë“œì˜ ê°’ì´ ì¶©ëŒí•¨" -#: utils/adt/formatting.c:2313 +#: utils/adt/formatting.c:2435 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "ì´ ê°’ì€ ë™ì¼í•œ 필드 형ì‹ì˜ ì´ì „ 설정과 모순ë©ë‹ˆë‹¤." -#: utils/adt/formatting.c:2384 +#: utils/adt/formatting.c:2502 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "소스 문ìžì—´ì´ 너무 짧아서 \"%s\" í˜•ì‹ í•„ë“œì— ì‚¬ìš©í•  수 ì—†ìŒ" -#: utils/adt/formatting.c:2387 +#: utils/adt/formatting.c:2504 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "í•„ë“œì— %dìžê°€ í•„ìš”í•œë° %dìžë§Œ 남았습니다." -#: utils/adt/formatting.c:2390 utils/adt/formatting.c:2405 +#: utils/adt/formatting.c:2506 utils/adt/formatting.c:2520 #, c-format msgid "" "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "소스 문ìžì—´ì´ ê³ ì • 너비가 아닌 경우 \"FM\" 한정ìžë¥¼ 사용해 보십시오." -#: utils/adt/formatting.c:2400 utils/adt/formatting.c:2414 -#: utils/adt/formatting.c:2637 +#: utils/adt/formatting.c:2516 utils/adt/formatting.c:2529 +#: utils/adt/formatting.c:2750 utils/adt/formatting.c:3650 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "\"%s\" ê°’ì€ \"%s\"ì— ìœ íš¨í•˜ì§€ 않ìŒ" -#: utils/adt/formatting.c:2402 +#: utils/adt/formatting.c:2518 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "í•„ë“œì— %dìžê°€ í•„ìš”í•œë° %dìžë§Œ 구문 ë¶„ì„í•  수 있습니다." -#: utils/adt/formatting.c:2416 +#: utils/adt/formatting.c:2531 #, c-format msgid "Value must be an integer." msgstr "ê°’ì€ ì •ìˆ˜ì—¬ì•¼ 합니다." -#: utils/adt/formatting.c:2421 +#: utils/adt/formatting.c:2536 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "소스 문ìžì—´ì˜ \"%s\" ê°’ì´ ë²”ìœ„ë¥¼ 벗어남" -#: utils/adt/formatting.c:2423 +#: utils/adt/formatting.c:2538 #, c-format msgid "Value must be in the range %d to %d." msgstr "ê°’ì€ %dì—서 %d 사ì´ì˜ ë²”ìœ„ì— ìžˆì–´ì•¼ 합니다." -#: utils/adt/formatting.c:2639 +#: utils/adt/formatting.c:2752 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "ì§€ì •ëœ ê°’ì´ ì´ í•„ë“œì— í—ˆìš©ë˜ëŠ” ê°’ê³¼ ì¼ì¹˜í•˜ì§€ 않습니다." -#: utils/adt/formatting.c:2856 utils/adt/formatting.c:2876 -#: utils/adt/formatting.c:2896 utils/adt/formatting.c:2916 -#: utils/adt/formatting.c:2935 utils/adt/formatting.c:2954 -#: utils/adt/formatting.c:2978 utils/adt/formatting.c:2996 -#: utils/adt/formatting.c:3014 utils/adt/formatting.c:3032 -#: utils/adt/formatting.c:3049 utils/adt/formatting.c:3066 +#: utils/adt/formatting.c:2968 utils/adt/formatting.c:2988 +#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3028 +#: utils/adt/formatting.c:3047 utils/adt/formatting.c:3066 +#: utils/adt/formatting.c:3090 utils/adt/formatting.c:3108 +#: utils/adt/formatting.c:3126 utils/adt/formatting.c:3144 +#: utils/adt/formatting.c:3161 utils/adt/formatting.c:3178 #, c-format msgid "localized string format value too long" -msgstr "" +msgstr "ìžêµ­ì–´í™” 문ìžì—´ í¬ë©§ ê°’ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤" -#: utils/adt/formatting.c:3300 +#: utils/adt/formatting.c:3458 #, c-format msgid "unmatched format separator \"%c\"" -msgstr "" +msgstr "ë§žì§€ 않는 êµ¬ë¶„ìž í¬ë©§ \"%c\"" -#: utils/adt/formatting.c:3361 +#: utils/adt/formatting.c:3519 #, c-format msgid "unmatched format character \"%s\"" msgstr "ì§ì´ 안 맞는 \"%s\" 문ìž" -#: utils/adt/formatting.c:3467 utils/adt/formatting.c:3811 +#: utils/adt/formatting.c:3652 #, c-format -msgid "formatting field \"%s\" is only supported in to_char" -msgstr "\"%s\" 필드 ì–‘ì‹ì€ to_char 함수ì—서만 ì§€ì›í•©ë‹ˆë‹¤." +msgid "Time zone abbreviation is not recognized." +msgstr "시간대 약어를 알 수 없습니다." -#: utils/adt/formatting.c:3642 +#: utils/adt/formatting.c:3853 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "\"Y,YYY\"ì— ëŒ€í•œ ìž…ë ¥ 문ìžì—´ì´ 잘못ë¨" -#: utils/adt/formatting.c:3728 +#: utils/adt/formatting.c:3942 #, c-format msgid "input string is too short for datetime format" msgstr "ìž…ë ¥ 문ìžì—´ì´ datetime ì–‘ì‹ìš©ìœ¼ë¡œëŠ” 너무 짧습니다" -#: utils/adt/formatting.c:3736 +#: utils/adt/formatting.c:3950 #, c-format msgid "trailing characters remain in input string after datetime format" -msgstr "" +msgstr "ë‚ ì§œ ë° ì‹œê°„ í˜•ì‹ í›„ ìž…ë ¥ 문ìžì—´ì— ë‚¨ì€ ë¬¸ìžê°€ 있습니다." -#: utils/adt/formatting.c:4281 +#: utils/adt/formatting.c:4494 #, c-format msgid "missing time zone in input string for type timestamptz" -msgstr "" +msgstr "timestamptz ìžë£Œí˜•ì„ ìœ„í•œ ìž…ë ¥ 문ìžì—´ì— 시간대가 누ë½ë˜ì—ˆìŠµë‹ˆë‹¤." -#: utils/adt/formatting.c:4287 +#: utils/adt/formatting.c:4500 #, c-format msgid "timestamptz out of range" msgstr "timestamptz 범위를 벗어남" -#: utils/adt/formatting.c:4315 +#: utils/adt/formatting.c:4528 #, c-format msgid "datetime format is zoned but not timed" msgstr "datetime ì–‘ì‹ì´ ì§€ì—­ì‹œê°„ëŒ€ê°’ì´ ìžˆëŠ”ë°, ì‹œê°„ê°’ì´ ì•„ë‹˜" -#: utils/adt/formatting.c:4367 +#: utils/adt/formatting.c:4577 #, c-format msgid "missing time zone in input string for type timetz" -msgstr "" +msgstr "timetz ìžë£Œí˜•ì„ ìœ„í•œ ìž…ë ¥ 문ìžì—´ì— 시간대가 누ë½ë˜ì—ˆìŠµë‹ˆë‹¤." -#: utils/adt/formatting.c:4373 +#: utils/adt/formatting.c:4583 #, c-format msgid "timetz out of range" msgstr "timetz 범위를 벗어남" -#: utils/adt/formatting.c:4399 +#: utils/adt/formatting.c:4609 #, c-format msgid "datetime format is not dated and not timed" -msgstr "" +msgstr "날짜시간 형ì‹ì´ ë‚ ì§œë„ ì•„ë‹ˆê³ , ì‹œê°„ë„ ì•„ë‹™ë‹ˆë‹¤." -#: utils/adt/formatting.c:4532 +#: utils/adt/formatting.c:4786 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "시간 \"%d\"ì€(는) 12ì‹œê°„ì œì— ìœ íš¨í•˜ì§€ 않ìŒ" -#: utils/adt/formatting.c:4534 +#: utils/adt/formatting.c:4788 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "24시간제를 사용하거나 1ì—서 12 사ì´ì˜ ì‹œê°„ì„ ì§€ì •í•˜ì‹­ì‹œì˜¤." -#: utils/adt/formatting.c:4645 +#: utils/adt/formatting.c:4900 #, c-format msgid "cannot calculate day of year without year information" msgstr "ì—°ë„ ì •ë³´ ì—†ì´ ëª‡ë²ˆì§¸ ë‚ (day of year) ì¸ì§€ 계산할 수 없습니다." -#: utils/adt/formatting.c:5564 +#: utils/adt/formatting.c:5852 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" ìž…ë ¥ ì–‘ì‹ì€ ì§€ì›ë˜ì§€ 않습니다." -#: utils/adt/formatting.c:5576 +#: utils/adt/formatting.c:5864 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\" ìž…ë ¥ ì–‘ì‹ì€ ì§€ì›ë˜ì§€ 않습니다." -#: utils/adt/genfile.c:75 -#, c-format -msgid "reference to parent directory (\"..\") not allowed" -msgstr "ìƒìœ„ 디렉터리(\"..\") 참조는 허용ë˜ì§€ 않ìŒ" - -#: utils/adt/genfile.c:86 +#: utils/adt/genfile.c:84 #, c-format msgid "absolute path not allowed" msgstr "절대 경로는 허용하지 않ìŒ" -#: utils/adt/genfile.c:91 +#: utils/adt/genfile.c:89 #, c-format -msgid "path must be in or below the current directory" -msgstr "경로는 현재 디렉터리와 ê·¸ 하위 디렉터리여야 합니다." +msgid "path must be in or below the data directory" +msgstr "경로는 현재 디렉터리 안ì´ê±°ë‚˜, ë°ì´í„° 디렉터리 ì´í•˜ì—¬ì•¼í•¨" -#: utils/adt/genfile.c:116 utils/adt/oracle_compat.c:185 -#: utils/adt/oracle_compat.c:283 utils/adt/oracle_compat.c:759 -#: utils/adt/oracle_compat.c:1054 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:190 +#: utils/adt/oracle_compat.c:288 utils/adt/oracle_compat.c:839 +#: utils/adt/oracle_compat.c:1142 #, c-format msgid "requested length too large" msgstr "ìš”ì²­ëœ ê¸¸ì´ê°€ 너무 ê¹ë‹ˆë‹¤" -#: utils/adt/genfile.c:133 +#: utils/adt/genfile.c:131 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "\"%s\" 파ì¼ì—서 seek ìž‘ì—…ì„ í•  수 ì—†ìŒ: %m" -#: utils/adt/genfile.c:174 +#: utils/adt/genfile.c:171 #, c-format msgid "file length too large" msgstr "íŒŒì¼ ê¸¸ì´ê°€ 너무 ê¹ë‹ˆë‹¤" -#: utils/adt/genfile.c:251 +#: utils/adt/genfile.c:656 #, c-format -msgid "must be superuser to read files with adminpack 1.0" -msgstr "adminpack 1.0 확장 ëª¨ë“ˆì„ ì‚¬ìš©í•  때는 파ì¼ì„ ì½ìœ¼ë ¤ë©´ 슈í¼ìœ ì ¸ì—¬ì•¼í•¨" +msgid "tablespace with OID %u does not exist" +msgstr "OID %u í…Œì´ë¸”스페ì´ìФ ì—†ìŒ" -#: utils/adt/geo_ops.c:979 utils/adt/geo_ops.c:1025 +#: utils/adt/geo_ops.c:998 utils/adt/geo_ops.c:1052 #, c-format msgid "invalid line specification: A and B cannot both be zero" msgstr "ì„  ì •ì˜ê°€ 잘못ë¨: A와 B 둘다 0ì¼ ìˆ˜ëŠ” ì—†ìŒ" -#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1090 +#: utils/adt/geo_ops.c:1008 utils/adt/geo_ops.c:1124 #, c-format msgid "invalid line specification: must be two distinct points" msgstr "ì„  ì •ì˜ê°€ 잘못ëœ: ë‘ ì ì€ 서로 다른 위치여야 함" -#: utils/adt/geo_ops.c:1399 utils/adt/geo_ops.c:3486 utils/adt/geo_ops.c:4354 -#: utils/adt/geo_ops.c:5248 +#: utils/adt/geo_ops.c:1438 utils/adt/geo_ops.c:3438 utils/adt/geo_ops.c:4368 +#: utils/adt/geo_ops.c:5253 #, c-format msgid "too many points requested" msgstr "너무 ë§Žì€ ì ë“¤ì´ 요청ë˜ì—ˆìŠµë‹ˆë‹¤." -#: utils/adt/geo_ops.c:1461 +#: utils/adt/geo_ops.c:1502 #, c-format msgid "invalid number of points in external \"path\" value" msgstr "???\"path\" ì˜ ê°’ì— ìž˜ëª»ëœ ê°¯ìˆ˜ì˜ point들" -#: utils/adt/geo_ops.c:2537 -#, c-format -msgid "function \"dist_lb\" not implemented" -msgstr "\"dist_lb\" 함수는 구현ë˜ì§€ 않았습니다." - -#: utils/adt/geo_ops.c:2556 -#, c-format -msgid "function \"dist_bl\" not implemented" -msgstr "\"dist_bl\" 함수는 구현ë˜ì§€ 않았습니다." - -#: utils/adt/geo_ops.c:2975 -#, c-format -msgid "function \"close_sl\" not implemented" -msgstr "\"close_sl\" 함수는 구현ë˜ì§€ 않았습니다." - -#: utils/adt/geo_ops.c:3122 -#, c-format -msgid "function \"close_lb\" not implemented" -msgstr "\"close_lb\" 함수는 구현ë˜ì§€ 않았습니다." - -#: utils/adt/geo_ops.c:3533 +#: utils/adt/geo_ops.c:3487 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "???\"polygon\" ê°’ì— ìž˜ëª»ëœ ê°¯ìˆ˜ì˜ point들" -#: utils/adt/geo_ops.c:4069 -#, c-format -msgid "function \"poly_distance\" not implemented" -msgstr "\"poly_distance\" 함수는 구현ë˜ì§€ 않았습니다." - -#: utils/adt/geo_ops.c:4446 -#, c-format -msgid "function \"path_center\" not implemented" -msgstr "\"path_center\" 함수는 구현ë˜ì§€ 않았습니다." - #: utils/adt/geo_ops.c:4463 #, c-format msgid "open path cannot be converted to polygon" msgstr "닫히지 ì•Šì€ path 는 í´ë¦¬ê³¤ìœ¼ë¡œ 변환할 수 없습니다." -#: utils/adt/geo_ops.c:4713 +#: utils/adt/geo_ops.c:4718 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "ë¶€ì ì ˆí•œ \"circle\" ê°’ì˜ ë°˜ì§€ë¦„" -#: utils/adt/geo_ops.c:5234 +#: utils/adt/geo_ops.c:5239 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "ë°˜ì§€ë¦„ì´ 0ì¸ ì›ì€ í´ë¦¬ê³¤ìœ¼ë¡œ 변환할 수 없습니다." -#: utils/adt/geo_ops.c:5239 +#: utils/adt/geo_ops.c:5244 #, c-format msgid "must request at least 2 points" msgstr "ì ì–´ë„ 2ê°œì˜ pointë“¤ì´ í•„ìš”í•©ë‹ˆë‹¤." -#: utils/adt/int.c:164 -#, c-format -msgid "int2vector has too many elements" -msgstr "int2vector 는 너무 ë§Žì€ ìš”ì†Œë¥¼ 가지고 있습니다." - -#: utils/adt/int.c:239 +#: utils/adt/int.c:264 #, c-format msgid "invalid int2vector data" msgstr "ìž˜ëª»ëœ int2vector ìžë£Œ" -#: utils/adt/int.c:245 utils/adt/oid.c:215 utils/adt/oid.c:296 -#, c-format -msgid "oidvector has too many elements" -msgstr "oidvectorì— ë„ˆë¬´ ë§Žì€ ìš”ì†Œê°€ 있습니다" - -#: utils/adt/int.c:1510 utils/adt/int8.c:1439 utils/adt/numeric.c:1417 -#: utils/adt/timestamp.c:5435 utils/adt/timestamp.c:5515 +#: utils/adt/int.c:1529 utils/adt/int8.c:1403 utils/adt/numeric.c:1765 +#: utils/adt/timestamp.c:6546 utils/adt/timestamp.c:6632 #, c-format msgid "step size cannot equal zero" msgstr "단계 í¬ê¸°ëŠ” 0ì¼ ìˆ˜ ì—†ìŒ" -#: utils/adt/int8.c:527 utils/adt/int8.c:550 utils/adt/int8.c:564 -#: utils/adt/int8.c:578 utils/adt/int8.c:609 utils/adt/int8.c:633 -#: utils/adt/int8.c:715 utils/adt/int8.c:783 utils/adt/int8.c:789 -#: utils/adt/int8.c:815 utils/adt/int8.c:829 utils/adt/int8.c:853 -#: utils/adt/int8.c:866 utils/adt/int8.c:935 utils/adt/int8.c:949 -#: utils/adt/int8.c:963 utils/adt/int8.c:994 utils/adt/int8.c:1016 -#: utils/adt/int8.c:1030 utils/adt/int8.c:1044 utils/adt/int8.c:1077 -#: utils/adt/int8.c:1091 utils/adt/int8.c:1105 utils/adt/int8.c:1136 -#: utils/adt/int8.c:1158 utils/adt/int8.c:1172 utils/adt/int8.c:1186 -#: utils/adt/int8.c:1348 utils/adt/int8.c:1383 utils/adt/numeric.c:3508 -#: utils/adt/varbit.c:1656 +#: utils/adt/int8.c:448 utils/adt/int8.c:471 utils/adt/int8.c:485 +#: utils/adt/int8.c:499 utils/adt/int8.c:530 utils/adt/int8.c:554 +#: utils/adt/int8.c:636 utils/adt/int8.c:704 utils/adt/int8.c:710 +#: utils/adt/int8.c:736 utils/adt/int8.c:750 utils/adt/int8.c:774 +#: utils/adt/int8.c:787 utils/adt/int8.c:899 utils/adt/int8.c:913 +#: utils/adt/int8.c:927 utils/adt/int8.c:958 utils/adt/int8.c:980 +#: utils/adt/int8.c:994 utils/adt/int8.c:1008 utils/adt/int8.c:1041 +#: utils/adt/int8.c:1055 utils/adt/int8.c:1069 utils/adt/int8.c:1100 +#: utils/adt/int8.c:1122 utils/adt/int8.c:1136 utils/adt/int8.c:1150 +#: utils/adt/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4542 +#: utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 +#: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigintì˜ ë²”ìœ„ë¥¼ 벗어났습니다." -#: utils/adt/int8.c:1396 +#: utils/adt/int8.c:1360 #, c-format msgid "OID out of range" msgstr "OIDì˜ ë²”ìœ„ë¥¼ 벗어났습니다." -#: utils/adt/json.c:271 utils/adt/jsonb.c:757 +#: utils/adt/json.c:202 utils/adt/jsonb.c:664 #, c-format msgid "key value must be scalar, not array, composite, or json" msgstr "" "키 ê°’ì€ ìŠ¤ì¹¼ë¼ í˜•ì´ì–´ì•¼ 함. ë°°ì—´, 복합 ìžë£Œí˜•, json í˜•ì€ ì‚¬ìš©í•  수 ì—†ìŒ" -#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:1812 +#: utils/adt/json.c:1034 utils/adt/json.c:1044 utils/fmgr/funcapi.c:2090 #, c-format msgid "could not determine data type for argument %d" msgstr "%d번째 ì¸ìžì˜ ìžë£Œí˜•ì„ ì•Œìˆ˜ê°€ 없습니다." -#: utils/adt/json.c:926 utils/adt/jsonb.c:1728 +#: utils/adt/json.c:1067 utils/adt/json.c:1266 utils/adt/json.c:1449 +#: utils/adt/json.c:1527 utils/adt/jsonb.c:1333 utils/adt/jsonb.c:1423 #, c-format -msgid "field name must not be null" -msgstr "필드 ì´ë¦„ì´ null ì´ë©´ 안ë©ë‹ˆë‹¤" +msgid "null value not allowed for object key" +msgstr "개체 키 값으로 null ì„ í—ˆìš©í•˜ì§€ 않ìŒ" + +#: utils/adt/json.c:1117 utils/adt/json.c:1288 +#, c-format +msgid "duplicate JSON object key value: %s" +msgstr "JSON ê°ì²´ 키 ê°’ 중복: %s" -#: utils/adt/json.c:1010 utils/adt/jsonb.c:1178 +#: utils/adt/json.c:1226 utils/adt/jsonb.c:1134 #, c-format msgid "argument list must have even number of elements" msgstr "ì¸ìž 목ë¡ì€ ìš”ì†Œìˆ˜ì˜ ì§ìˆ˜ê°œì—¬ì•¼ 합니다." #. translator: %s is a SQL function name -#: utils/adt/json.c:1012 utils/adt/jsonb.c:1180 +#: utils/adt/json.c:1228 utils/adt/jsonb.c:1136 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "%s í•¨ìˆ˜ì˜ ì¸ìžë“¤ì€ ê°ê° key, value ìŒìœ¼ë¡œ 있어야 합니다." -#: utils/adt/json.c:1028 -#, c-format -msgid "argument %d cannot be null" -msgstr "%d 번째 ì¸ìžëŠ” null ì´ë©´ 안ë©ë‹ˆë‹¤" - -#: utils/adt/json.c:1029 -#, c-format -msgid "Object keys should be text." -msgstr "개체 키는 문ìžì—´ì´ì–´ì•¼ 합니다." - -#: utils/adt/json.c:1135 utils/adt/jsonb.c:1310 +#: utils/adt/json.c:1427 utils/adt/jsonb.c:1311 #, c-format msgid "array must have two columns" msgstr "ë°°ì—´ì€ ë‘ê°œì˜ ì¹¼ëŸ¼ì´ì–´ì•¼ 함" -#: utils/adt/json.c:1159 utils/adt/json.c:1243 utils/adt/jsonb.c:1334 -#: utils/adt/jsonb.c:1429 -#, c-format -msgid "null value not allowed for object key" -msgstr "개체 키 값으로 null ì„ í—ˆìš©í•˜ì§€ 않ìŒ" - -#: utils/adt/json.c:1232 utils/adt/jsonb.c:1418 +#: utils/adt/json.c:1516 utils/adt/jsonb.c:1412 #, c-format msgid "mismatched array dimensions" msgstr "ë°°ì—´ 차수가 안맞ìŒ" -#: utils/adt/jsonb.c:287 +#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1956 +#, c-format +msgid "duplicate JSON object key value" +msgstr "JSON ê°ì²´ 키 ê°’ 중복" + +#: utils/adt/jsonb.c:282 #, c-format msgid "string too long to represent as jsonb string" msgstr "jsonb 문ìžì—´ë¡œ 길ì´ë¥¼ 초과함" -#: utils/adt/jsonb.c:288 +#: utils/adt/jsonb.c:283 #, c-format msgid "" "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "êµ¬í˜„ìƒ ì œí•œìœ¼ë¡œ jsonb 문ìžì—´ì€ %d ë°”ì´íŠ¸ë¥¼ ë„˜ì„ ìˆ˜ 없습니다." -#: utils/adt/jsonb.c:1193 +#: utils/adt/jsonb.c:1153 #, c-format msgid "argument %d: key must not be null" msgstr "%d 번째 ì¸ìž: 키 ê°’ì€ nullì´ë©´ 안ë©ë‹ˆë‹¤." -#: utils/adt/jsonb.c:1781 +#: utils/adt/jsonb.c:1744 +#, c-format +msgid "field name must not be null" +msgstr "필드 ì´ë¦„ì´ null ì´ë©´ 안ë©ë‹ˆë‹¤" + +#: utils/adt/jsonb.c:1806 #, c-format msgid "object keys must be strings" msgstr "개체 키는 문ìžì—´ì´ì–´ì•¼ 합니다" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:2017 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "jsonb null ê°’ì„ %s ìžë£Œí˜•으로 형 변환 í•  수 ì—†ìŒ" -#: utils/adt/jsonb.c:1945 +#: utils/adt/jsonb.c:2018 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "jsonb 문ìžì—´ ê°’ì„ %s ìžë£Œí˜•으로 형 변환 í•  수 ì—†ìŒ" -#: utils/adt/jsonb.c:1946 +#: utils/adt/jsonb.c:2019 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "jsonb ìˆ«ìž ê°’ì„ %s ìžë£Œí˜•으로 형 변환 í•  수 ì—†ìŒ" -#: utils/adt/jsonb.c:1947 +#: utils/adt/jsonb.c:2020 #, c-format msgid "cannot cast jsonb boolean to type %s" -msgstr "jsonb 불린 ê°’ì„ %s ìžë£Œí˜•으로 형 변환 í•  수 ì—†ìŒ" +msgstr "jsonb 불리언 ê°’ì„ %s ìžë£Œí˜•으로 형 변환 í•  수 ì—†ìŒ" -#: utils/adt/jsonb.c:1948 +#: utils/adt/jsonb.c:2021 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "jsonb ë°°ì—´ ê°’ì„ %s ìžë£Œí˜•으로 형 변환 í•  수 ì—†ìŒ" -#: utils/adt/jsonb.c:1949 +#: utils/adt/jsonb.c:2022 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "jsonb object ê°’ì„ %s ìžë£Œí˜•으로 형 변환 í•  수 ì—†ìŒ" -#: utils/adt/jsonb.c:1950 +#: utils/adt/jsonb.c:2023 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "jsonb object나 ë°°ì—´ ê°’ì„ %s ìžë£Œí˜•으로 형 변환 í•  수 ì—†ìŒ" -#: utils/adt/jsonb_util.c:699 +#: utils/adt/jsonb_util.c:756 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "jsonb 개체 ìŒì˜ 개수가 최대치를 초과함 (%zu)" -#: utils/adt/jsonb_util.c:740 +#: utils/adt/jsonb_util.c:797 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "jsonb ë°°ì—´ 요소 개수가 최대치를 초과함 (%zu)" -#: utils/adt/jsonb_util.c:1614 utils/adt/jsonb_util.c:1634 +#: utils/adt/jsonb_util.c:1671 utils/adt/jsonb_util.c:1691 +#, c-format +msgid "total size of jsonb array elements exceeds the maximum of %d bytes" +msgstr "jsonb ë°°ì—´ 요소 ì´ í¬ê¸°ê°€ 최대치를 초과함 (%d ë°”ì´íЏ)" + +#: utils/adt/jsonb_util.c:1752 utils/adt/jsonb_util.c:1787 +#: utils/adt/jsonb_util.c:1807 +#, c-format +msgid "total size of jsonb object elements exceeds the maximum of %d bytes" +msgstr "jsonb 개체 ìš”ì†Œë“¤ì˜ ì´ í¬ê¸°ê°€ 최대치를 초과함 (%d ë°”ì´íЏ)" + +#: utils/adt/jsonbsubs.c:67 utils/adt/jsonbsubs.c:148 +#, c-format +msgid "jsonb subscript does not support slices" +msgstr "jsonb 서브스í¬ë¦½íŠ¸ê°€ slice를 ì§€ì›í•˜ì§€ 않ìŒ" + +#: utils/adt/jsonbsubs.c:100 utils/adt/jsonbsubs.c:114 +#, c-format +msgid "subscript type %s is not supported" +msgstr "%s ìžë£Œí˜•ì€ ì„œë¸ŒìŠ¤í¬ë¦½íŠ¸ë¥¼ ì§€ì›í•˜ì§€ 않ìŒ" + +#: utils/adt/jsonbsubs.c:101 +#, c-format +msgid "jsonb subscript must be coercible to only one type, integer or text." +msgstr "jsonb 서브스í¬ë¦½íŠ¸ë¡œëŠ” ìˆ«ìž ë˜ëŠ” 문ìžì—´ 중 하나만 쓸 수 있ìŒ" + +#: utils/adt/jsonbsubs.c:115 +#, c-format +msgid "jsonb subscript must be coercible to either integer or text." +msgstr "jsonb 서브스í¬ë¦½íŠ¸ë¡œëŠ” ìˆ«ìž ë˜ëŠ” 문ìžì—´ 중 하나만 쓸 수 있ìŒ" + +#: utils/adt/jsonbsubs.c:136 #, c-format -msgid "total size of jsonb array elements exceeds the maximum of %u bytes" -msgstr "jsonb ë°°ì—´ 요소 ì´ í¬ê¸°ê°€ 최대치를 초과함 (%u ë°”ì´íЏ)" +msgid "jsonb subscript must have text type" +msgstr "ë°°ì—´ 서브스í¬ë¦½íŠ¸ëŠ” 반드시 문ìžì—´ì´ì–´ì•¼í•©ë‹ˆë‹¤." -#: utils/adt/jsonb_util.c:1695 utils/adt/jsonb_util.c:1730 -#: utils/adt/jsonb_util.c:1750 +#: utils/adt/jsonbsubs.c:204 #, c-format -msgid "total size of jsonb object elements exceeds the maximum of %u bytes" -msgstr "jsonb 개체 ìš”ì†Œë“¤ì˜ ì´ í¬ê¸°ê°€ 최대치를 초과함 (%u ë°”ì´íЏ)" +msgid "jsonb subscript in assignment must not be null" +msgstr "jsonb 서브스í¬ë¦½íŠ¸ë¡œ null ê°’ì´ ì˜¬ 수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:551 utils/adt/jsonfuncs.c:796 -#: utils/adt/jsonfuncs.c:2330 utils/adt/jsonfuncs.c:2770 -#: utils/adt/jsonfuncs.c:3560 utils/adt/jsonfuncs.c:3891 +#: utils/adt/jsonfuncs.c:583 utils/adt/jsonfuncs.c:830 +#: utils/adt/jsonfuncs.c:2439 utils/adt/jsonfuncs.c:3015 +#: utils/adt/jsonfuncs.c:3948 utils/adt/jsonfuncs.c:4295 #, c-format msgid "cannot call %s on a scalar" msgstr "스칼ë¼í˜•ì—서는 %s 호출 í•  수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:556 utils/adt/jsonfuncs.c:783 -#: utils/adt/jsonfuncs.c:2772 utils/adt/jsonfuncs.c:3549 +#: utils/adt/jsonfuncs.c:588 utils/adt/jsonfuncs.c:815 +#: utils/adt/jsonfuncs.c:3017 utils/adt/jsonfuncs.c:3935 #, c-format msgid "cannot call %s on an array" msgstr "배열형ì—서는 %s 호출 í•  수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:613 jsonpath_scan.l:498 +#: utils/adt/jsonfuncs.c:647 jsonpath_scan.l:607 #, c-format msgid "unsupported Unicode escape sequence" msgstr "ì§€ì›í•˜ì§€ 않는 유니코드 ì´ìŠ¤ì¼€ì´í”„ ì¡°í•©" -#: utils/adt/jsonfuncs.c:692 +#: utils/adt/jsonfuncs.c:724 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "JSON ìžë£Œ, %d 번째 줄: %s%s%s" -#: utils/adt/jsonfuncs.c:1682 utils/adt/jsonfuncs.c:1717 +#: utils/adt/jsonfuncs.c:1883 utils/adt/jsonfuncs.c:1920 #, c-format msgid "cannot get array length of a scalar" msgstr "스칼ë¼í˜•ì˜ ë°°ì—´ 길ì´ë¥¼ 구할 수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:1686 utils/adt/jsonfuncs.c:1705 +#: utils/adt/jsonfuncs.c:1887 utils/adt/jsonfuncs.c:1906 #, c-format msgid "cannot get array length of a non-array" msgstr "비배열형 ìžë£Œì˜ ë°°ì—´ 길ì´ë¥¼ 구할 수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:1782 +#: utils/adt/jsonfuncs.c:1986 #, c-format msgid "cannot call %s on a non-object" msgstr "비개체형ì—서 %s 호출 í•  수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:2021 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot deconstruct an array as an object" -msgstr "" +msgstr "ë°°ì—´ì„ ê°ì²´ë¡œ í•´ì²´í•  수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:2033 +#: utils/adt/jsonfuncs.c:2188 #, c-format msgid "cannot deconstruct a scalar" msgstr "스칼ë¼í˜•으로 재구축할 수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:2079 +#: utils/adt/jsonfuncs.c:2233 #, c-format msgid "cannot extract elements from a scalar" msgstr "스칼ë¼í˜•ì—서 요소를 추출할 수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:2083 +#: utils/adt/jsonfuncs.c:2237 #, c-format msgid "cannot extract elements from an object" msgstr "개체형ì—서 요소를 추출할 수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:2317 utils/adt/jsonfuncs.c:3775 +#: utils/adt/jsonfuncs.c:2424 utils/adt/jsonfuncs.c:4173 #, c-format msgid "cannot call %s on a non-array" msgstr "비배열형ì—서 %s 호출 í•  수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:2387 utils/adt/jsonfuncs.c:2392 -#: utils/adt/jsonfuncs.c:2409 utils/adt/jsonfuncs.c:2415 +#: utils/adt/jsonfuncs.c:2515 utils/adt/jsonfuncs.c:2520 +#: utils/adt/jsonfuncs.c:2538 utils/adt/jsonfuncs.c:2544 #, c-format msgid "expected JSON array" msgstr "예기치 ì•Šì€ json ë°°ì—´" -#: utils/adt/jsonfuncs.c:2388 +#: utils/adt/jsonfuncs.c:2516 #, c-format msgid "See the value of key \"%s\"." msgstr "\"%s\" í‚¤ì˜ ê°’ì„ ì§€ì •í•˜ì„¸ìš”" -#: utils/adt/jsonfuncs.c:2410 +#: utils/adt/jsonfuncs.c:2539 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "%s ë°°ì—´ 요소, 해당 키: \"%s\" 참조" -#: utils/adt/jsonfuncs.c:2416 +#: utils/adt/jsonfuncs.c:2545 #, c-format msgid "See the array element %s." msgstr "ë°°ì—´ 요소: %s 참조" -#: utils/adt/jsonfuncs.c:2451 +#: utils/adt/jsonfuncs.c:2597 #, c-format msgid "malformed JSON array" msgstr "ìž˜ëª»ëœ json ë°°ì—´" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3278 +#: utils/adt/jsonfuncs.c:3647 #, c-format msgid "first argument of %s must be a row type" msgstr "%sì˜ ì²«ë²ˆì§¸ ì¸ìžëŠ” row 형ì´ì–´ì•¼ 합니다" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3302 +#: utils/adt/jsonfuncs.c:3671 #, c-format msgid "could not determine row type for result of %s" msgstr "%s í•¨ìˆ˜ì˜ ë°˜í™˜ 로우 ìžë£Œí˜•ì„ ì•Œìˆ˜ê°€ ì—†ìŒ" -#: utils/adt/jsonfuncs.c:3304 +#: utils/adt/jsonfuncs.c:3673 #, c-format msgid "" "Provide a non-null record argument, or call the function in the FROM clause " @@ -23654,273 +27457,397 @@ msgstr "" "non-null 레코드 ì¸ìžë¥¼ 지정하거나, 함수를 호출 í•  때 FROM ì ˆì—서 칼럼 ì •ì˜ ëª©" "ë¡ë„ 함께 지정해야 합니다." -#: utils/adt/jsonfuncs.c:3792 utils/adt/jsonfuncs.c:3873 +#: utils/adt/jsonfuncs.c:4059 utils/fmgr/funcapi.c:94 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "materialize 모드가 필요합니다만, ì´ êµ¬ë¬¸ì—서는 허용ë˜ì§€ 않습니다" + +#: utils/adt/jsonfuncs.c:4190 utils/adt/jsonfuncs.c:4274 #, c-format msgid "argument of %s must be an array of objects" msgstr "%sì˜ ì¸ìžëŠ” ê°œì²´ì˜ ë°°ì—´ì´ì–´ì•¼ 합니다" -#: utils/adt/jsonfuncs.c:3825 +#: utils/adt/jsonfuncs.c:4223 #, c-format msgid "cannot call %s on an object" msgstr "개체ì—서 %s 호출할 수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:4286 utils/adt/jsonfuncs.c:4345 -#: utils/adt/jsonfuncs.c:4425 +#: utils/adt/jsonfuncs.c:4656 utils/adt/jsonfuncs.c:4715 +#: utils/adt/jsonfuncs.c:4795 #, c-format msgid "cannot delete from scalar" msgstr "스칼ë¼í˜•ì—서 ì‚­ì œ í•  수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:4430 +#: utils/adt/jsonfuncs.c:4800 #, c-format msgid "cannot delete from object using integer index" msgstr "ì¸ë±ìФ 번호를 사용해서 개체ì—서 ì‚­ì œ í•  수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:4495 utils/adt/jsonfuncs.c:4653 +#: utils/adt/jsonfuncs.c:4868 utils/adt/jsonfuncs.c:5027 #, c-format msgid "cannot set path in scalar" msgstr "스칼ë¼í˜•ì—는 path 를 지정할 수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:4537 utils/adt/jsonfuncs.c:4579 +#: utils/adt/jsonfuncs.c:4909 utils/adt/jsonfuncs.c:4951 #, c-format msgid "" "null_value_treatment must be \"delete_key\", \"return_target\", " "\"use_json_null\", or \"raise_exception\"" msgstr "" +"null_value_treatment ê°’ì€ \"delete_key\", \"return_target\", " +"\"use_json_null\" ë˜ëŠ” \"raise_exception\" ì´ì–´ì•¼ 합니다." -#: utils/adt/jsonfuncs.c:4550 +#: utils/adt/jsonfuncs.c:4922 #, c-format msgid "JSON value must not be null" msgstr "JSON 값으로 nullì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:4551 +#: utils/adt/jsonfuncs.c:4923 #, c-format msgid "" "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "" +"null_value_treatment ì„¤ì •ê°’ì´ \"raise_exception\"으로 ë˜ì–´ 있어 예외를 ì¼ìœ¼ì¼°" +"습니다." -#: utils/adt/jsonfuncs.c:4552 +#: utils/adt/jsonfuncs.c:4924 #, c-format msgid "" "To avoid, either change the null_value_treatment argument or ensure that an " "SQL NULL is not passed." msgstr "" +"ì´ ìƒí™©ì„ 피하려면, null_value_treatment ì„¤ì •ì„ ë°”ê¾¸ë“ ì§€, SQL NULL ê°’ì„ ì‚¬ìš©" +"하지 않아야 합니다." -#: utils/adt/jsonfuncs.c:4607 +#: utils/adt/jsonfuncs.c:4979 #, c-format msgid "cannot delete path in scalar" msgstr "스칼ë¼í˜•ì—서 path를 지울 수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:4776 -#, c-format -msgid "invalid concatenation of jsonb objects" -msgstr "jsonb ê°œì²´ë“¤ì˜ ìž˜ëª»ëœ ê²°í•©" - -#: utils/adt/jsonfuncs.c:4810 +#: utils/adt/jsonfuncs.c:5193 #, c-format msgid "path element at position %d is null" msgstr "%d ìœ„ì¹˜ì˜ path 요소는 null 입니다." -#: utils/adt/jsonfuncs.c:4896 +#: utils/adt/jsonfuncs.c:5212 utils/adt/jsonfuncs.c:5243 +#: utils/adt/jsonfuncs.c:5316 #, c-format msgid "cannot replace existing key" msgstr "ì´ë¯¸ 있는 키로는 대체할 수 ì—†ìŒ" -#: utils/adt/jsonfuncs.c:4897 +#: utils/adt/jsonfuncs.c:5213 utils/adt/jsonfuncs.c:5244 +#, c-format +msgid "The path assumes key is a composite object, but it is a scalar value." +msgstr "path assumes key는 복합 ìžë£Œí˜•ì¸ë°, ìŠ¤ì¹¼ë¼ ê°’ì´ ì‚¬ìš©ë˜ê³  있습니다." + +#: utils/adt/jsonfuncs.c:5317 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "키 ê°’ì„ ë³€ê²½í•˜ë ¤ë©´, jsonb_set 함수를 사용하세요." -#: utils/adt/jsonfuncs.c:4979 +#: utils/adt/jsonfuncs.c:5421 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "%d 번째 ìœ„ì¹˜ì˜ path 요소는 정수가 아님: \"%s\"" -#: utils/adt/jsonfuncs.c:5098 +#: utils/adt/jsonfuncs.c:5438 +#, c-format +msgid "path element at position %d is out of range: %d" +msgstr "%d 번째 ìœ„ì¹˜ì˜ path 요소는 범위를 벗어남: %d" + +#: utils/adt/jsonfuncs.c:5590 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" -msgstr "" +msgstr "ìž˜ëª»ëœ í”Œëž˜ê·¸ ìžë£Œí˜•, ë°°ì—´ì´ë‚˜, ìŠ¤ì¹¼ë¼ í˜•ë§Œ 허용합니다." -#: utils/adt/jsonfuncs.c:5105 +#: utils/adt/jsonfuncs.c:5597 #, c-format msgid "flag array element is not a string" msgstr "플래그 ë°°ì—´ 요소가 문ìžì—´ì´ 아님" -#: utils/adt/jsonfuncs.c:5106 utils/adt/jsonfuncs.c:5128 +#: utils/adt/jsonfuncs.c:5598 utils/adt/jsonfuncs.c:5620 #, c-format msgid "" -"Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all" -"\"." +"Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and " +"\"all\"." msgstr "" +"사용 가능한 ê°’: \"string\", \"numeric\", \"boolean\", \"key\", \"all\"." + +#: utils/adt/jsonfuncs.c:5618 +#, c-format +msgid "wrong flag in flag array: \"%s\"" +msgstr "플래그 ë°°ì—´ ì•ˆì— ìž˜ëª»ëœ í”Œëž˜ê·¸: \"%s\"" + +#: utils/adt/jsonpath.c:389 +#, c-format +msgid "@ is not allowed in root expressions" +msgstr "@ 기호는 루트 표현ì‹ì—서는 사용할 수 ì—†ìŒ" + +#: utils/adt/jsonpath.c:395 +#, c-format +msgid "LAST is allowed only in array subscripts" +msgstr "LAST 키워드는 ë°°ì—´ 하위 스í¬ë¦½íЏ 전용임" + +#: utils/adt/jsonpath_exec.c:491 +#, c-format +msgid "single boolean result is expected" +msgstr "ë‹¨ì¼ ë¶ˆë¦¬ì–¸ ë°˜í™˜ê°’ì´ ì˜ˆìƒ ë¨" + +#: utils/adt/jsonpath_exec.c:851 +#, c-format +msgid "jsonpath wildcard array accessor can only be applied to an array" +msgstr "jsonpath wildcard array accessor는 í•˜ë‚˜ì˜ ë°°ì—´ì„ ëŒ€ìƒìœ¼ë¡œ 합니다." + +#: utils/adt/jsonpath_exec.c:874 +#, c-format +msgid "jsonpath wildcard member accessor can only be applied to an object" +msgstr "jsonpath wildcard member accessor는 í•˜ë‚˜ì˜ ê°ì²´ë¥¼ 대ìƒìœ¼ë¡œ 합니다." -#: utils/adt/jsonfuncs.c:5126 +#: utils/adt/jsonpath_exec.c:923 #, c-format -msgid "wrong flag in flag array: \"%s\"" -msgstr "" +msgid "jsonpath array subscript is out of bounds" +msgstr "jsonpath ë°°ì—´ 하위 스í¬ë¦½íЏ 범위를 초과했습니다" -#: utils/adt/jsonpath.c:362 +#: utils/adt/jsonpath_exec.c:980 #, c-format -msgid "@ is not allowed in root expressions" -msgstr "@ 기호는 루트 표현ì‹ì—서는 사용할 수 ì—†ìŒ" +msgid "jsonpath array accessor can only be applied to an array" +msgstr "jsonpath array accessor는 í•˜ë‚˜ì˜ ë°°ì—´ì„ ëŒ€ìƒìœ¼ë¡œ 합니다." -#: utils/adt/jsonpath.c:368 +#: utils/adt/jsonpath_exec.c:1044 #, c-format -msgid "LAST is allowed only in array subscripts" -msgstr "LAST 키워드는 ë°°ì—´ 하위 스í¬ë¦½íЏ 전용임" +msgid "JSON object does not contain key \"%s\"" +msgstr "JSON ê°ì²´ ì•ˆì— \"%s\" ì´ë¦„ì˜ í‚¤ê°€ 없습니다." -#: utils/adt/jsonpath_exec.c:360 +#: utils/adt/jsonpath_exec.c:1056 #, c-format -msgid "single boolean result is expected" -msgstr "ë‹¨ì¼ ë¶ˆë¦¬ì–¸ ë°˜í™˜ê°’ì´ ì˜ˆìƒ ë¨" +msgid "jsonpath member accessor can only be applied to an object" +msgstr "jsonpath member accessor는 í•˜ë‚˜ì˜ ê°ì²´ë¥¼ 대ìƒìœ¼ë¡œ 합니다." -#: utils/adt/jsonpath_exec.c:556 +#: utils/adt/jsonpath_exec.c:1114 #, c-format -msgid "\"vars\" argument is not an object" -msgstr "" +msgid "jsonpath item method .%s() can only be applied to an array" +msgstr "jsonpath .%s() item method는 í•˜ë‚˜ì˜ ë°°ì—´ì„ ëŒ€ìƒìœ¼ë¡œ 합니다." -#: utils/adt/jsonpath_exec.c:557 +#: utils/adt/jsonpath_exec.c:1167 utils/adt/jsonpath_exec.c:1193 #, c-format msgid "" -"Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +"argument \"%s\" of jsonpath item method .%s() is invalid for type double " +"precision" msgstr "" +"\"%s\" ì¸ìž(ëŒ€ìƒ jsonpath ì•„ì´í…œ 메서드: .%s())는 바르지 ì•Šì€ double precision형임" -#: utils/adt/jsonpath_exec.c:674 +#: utils/adt/jsonpath_exec.c:1172 utils/adt/jsonpath_exec.c:1198 +#: utils/adt/jsonpath_exec.c:1414 utils/adt/jsonpath_exec.c:1446 #, c-format -msgid "JSON object does not contain key \"%s\"" -msgstr "" +msgid "NaN or Infinity is not allowed for jsonpath item method .%s()" +msgstr "jsonpath item method .%s()용으로 NaN ë˜ëŠ” Infinity는 허용하지 않ìŒ" -#: utils/adt/jsonpath_exec.c:686 +#: utils/adt/jsonpath_exec.c:1211 utils/adt/jsonpath_exec.c:1313 +#: utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1593 #, c-format -msgid "jsonpath member accessor can only be applied to an object" -msgstr "" +msgid "" +"jsonpath item method .%s() can only be applied to a string or numeric value" +msgstr "jsonpath item method .%s() 대ìƒì€ 문ìžì—´ì´ë‚˜, ìˆ«ìž ê°’ë§Œ 허용합니다." -#: utils/adt/jsonpath_exec.c:715 +#: utils/adt/jsonpath_exec.c:1281 utils/adt/jsonpath_exec.c:1305 #, c-format -msgid "jsonpath wildcard array accessor can only be applied to an array" +msgid "" +"argument \"%s\" of jsonpath item method .%s() is invalid for type bigint" msgstr "" +"\"%s\" ì¸ìž(ëŒ€ìƒ jsonpath ì•„ì´í…œ 메서드: .%s())는 바르지 ì•Šì€ bigint형임" -#: utils/adt/jsonpath_exec.c:763 +#: utils/adt/jsonpath_exec.c:1357 utils/adt/jsonpath_exec.c:1377 #, c-format -msgid "jsonpath array subscript is out of bounds" -msgstr "jsonpath ë°°ì—´ 하위 스í¬ë¦½íЏ 범위를 초과했습니다" +msgid "" +"argument \"%s\" of jsonpath item method .%s() is invalid for type boolean" +msgstr "" +"\"%s\" ì¸ìž(ëŒ€ìƒ jsonpath ì•„ì´í…œ 메서드: .%s())는 바르지 ì•Šì€ boolean형임" -#: utils/adt/jsonpath_exec.c:820 +#: utils/adt/jsonpath_exec.c:1386 #, c-format -msgid "jsonpath array accessor can only be applied to an array" -msgstr "" +msgid "" +"jsonpath item method .%s() can only be applied to a boolean, string, or " +"numeric value" +msgstr "jsonpath item method .%s() 대ìƒì€ 불리언, 문ìžì—´ì´ë‚˜, ìˆ«ìž ê°’ë§Œ 허용합니다." -#: utils/adt/jsonpath_exec.c:874 +#: utils/adt/jsonpath_exec.c:1439 utils/adt/jsonpath_exec.c:1528 #, c-format -msgid "jsonpath wildcard member accessor can only be applied to an object" +msgid "" +"argument \"%s\" of jsonpath item method .%s() is invalid for type numeric" msgstr "" +"\"%s\" ì¸ìž(ëŒ€ìƒ jsonpath ì•„ì´í…œ 메서드: .%s())는 바르지 ì•Šì€ numeric형임" -#: utils/adt/jsonpath_exec.c:1004 +#: utils/adt/jsonpath_exec.c:1487 #, c-format -msgid "jsonpath item method .%s() can only be applied to an array" +msgid "" +"precision of jsonpath item method .%s() is out of range for type integer" msgstr "" +"jsonpath ì•„ì´í…œ 메서드 .%s() ì˜ precisionì´ ì •ìˆ˜ 범위를 벗어남" -#: utils/adt/jsonpath_exec.c:1059 +#: utils/adt/jsonpath_exec.c:1501 #, c-format -msgid "" -"numeric argument of jsonpath item method .%s() is out of range for type " -"double precision" +msgid "scale of jsonpath item method .%s() is out of range for type integer" msgstr "" -"jsonpath ì•„ì´í…œ 메서드 .%s() ì˜ ìˆ«ìž ì¸ìžê°€ double precision í˜•ì˜ " -"범위를 벗어남" +"jsonpath ì•„ì´í…œ 메서드 .%s() ì˜ ìŠ¤ì¼€ì¼ì´ 정수 범위를 벗어남" -#: utils/adt/jsonpath_exec.c:1080 +#: utils/adt/jsonpath_exec.c:1561 utils/adt/jsonpath_exec.c:1585 #, c-format msgid "" -"string argument of jsonpath item method .%s() is not a valid representation " -"of a double precision number" +"argument \"%s\" of jsonpath item method .%s() is invalid for type integer" msgstr "" +"\"%s\" ì¸ìž(ëŒ€ìƒ jsonpath ì•„ì´í…œ 메서드: .%s())는 바르지 ì•Šì€ integer형임" -#: utils/adt/jsonpath_exec.c:1093 +#: utils/adt/jsonpath_exec.c:1648 #, c-format msgid "" -"jsonpath item method .%s() can only be applied to a string or numeric value" -msgstr "" +"jsonpath item method .%s() can only be applied to a boolean, string, " +"numeric, or datetime value" +msgstr "jsonpath item method .%s() 대ìƒì€ 불리언, 문ìžì—´ì´ë‚˜, ìˆ«ìž ê°’ë§Œ 허용합니다." -#: utils/adt/jsonpath_exec.c:1583 +#: utils/adt/jsonpath_exec.c:2137 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" -msgstr "" +msgstr "jsonpath %s ì—°ì‚°ìžì˜ 왼쪽 ê°’ì´ ë‹¨ì¼ ìˆ«ìžê°’ì´ ì•„ë‹™ë‹ˆë‹¤." -#: utils/adt/jsonpath_exec.c:1590 +#: utils/adt/jsonpath_exec.c:2144 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" -msgstr "" +msgstr "jsonpath %s ì—°ì‚°ìžì˜ 오른쪽 ê°’ì´ ë‹¨ì¼ ìˆ«ìžê°’ì´ ì•„ë‹™ë‹ˆë‹¤." -#: utils/adt/jsonpath_exec.c:1658 +#: utils/adt/jsonpath_exec.c:2212 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" -msgstr "" +msgstr "jsonpath %s 단항 ì—°ì‚°ìš© ê°’ì´ ìˆ«ìžê°€ 아닙니다." -#: utils/adt/jsonpath_exec.c:1756 +#: utils/adt/jsonpath_exec.c:2311 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" -msgstr "" +msgstr "jsonpath .%s() 항목 메서드는 숫ìžê°’ë§Œ 대ìƒìœ¼ë¡œ 합니다." -#: utils/adt/jsonpath_exec.c:1796 +#: utils/adt/jsonpath_exec.c:2357 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" +msgstr "jsonpath .%s() 항목 메서드는 문ìžì—´ë§Œ 대ìƒìœ¼ë¡œ 합니다." + +#: utils/adt/jsonpath_exec.c:2450 +#, c-format +msgid "" +"time precision of jsonpath item method .%s() is out of range for type integer" msgstr "" +"jsonpath ì•„ì´í…œ 메서드 .%s()ì˜ time precisionì´ ì •ìˆ˜ 범위를 벗어남" -#: utils/adt/jsonpath_exec.c:1890 +#: utils/adt/jsonpath_exec.c:2484 utils/adt/jsonpath_exec.c:2490 +#: utils/adt/jsonpath_exec.c:2517 utils/adt/jsonpath_exec.c:2545 +#: utils/adt/jsonpath_exec.c:2598 utils/adt/jsonpath_exec.c:2649 +#: utils/adt/jsonpath_exec.c:2720 #, c-format -msgid "datetime format is not recognized: \"%s\"" -msgstr "알 수 없는 datetime ì–‘ì‹: \"%s\"" +msgid "%s format is not recognized: \"%s\"" +msgstr "%s í¬ë©§ì€ 알 수 ì—†ìŒ: \"%s\"" -#: utils/adt/jsonpath_exec.c:1892 +#: utils/adt/jsonpath_exec.c:2486 #, c-format msgid "Use a datetime template argument to specify the input data format." +msgstr "ìž…ë ¥ ìžë£Œ 형ì‹ì„ 지정하는 datetime 템플릿 ì¸ìžë¥¼ 사용하세요." + +#: utils/adt/jsonpath_exec.c:2679 utils/adt/jsonpath_exec.c:2760 +#, c-format +msgid "time precision of jsonpath item method .%s() is invalid" msgstr "" +"jsonpath ì•„ì´í…œ 메서드 .%s() ì˜ time precisionì´ ìž˜ëª»ë¨" +"남" -#: utils/adt/jsonpath_exec.c:1960 +#: utils/adt/jsonpath_exec.c:2840 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" -msgstr "" +msgstr "jsonpath .%s() 항목 메서드는 ê°ì²´ë§Œ 대ìƒìœ¼ë¡œ 합니다." -#: utils/adt/jsonpath_exec.c:2143 +#: utils/adt/jsonpath_exec.c:3124 +#, c-format +msgid "could not convert value of type %s to jsonpath" +msgstr "%s ìžë£Œí˜•ì˜ ê°’ì´ jsonpath 형으로 ë³€í™˜ë  ìˆ˜ ì—†ìŒ" + +#: utils/adt/jsonpath_exec.c:3158 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "\"%s\" jsonpath 변수 찾기 실패" -#: utils/adt/jsonpath_exec.c:2407 +#: utils/adt/jsonpath_exec.c:3211 +#, c-format +msgid "\"vars\" argument is not an object" +msgstr "\"vars\" ì¸ìžê°€ ê°ì²´ê°€ 아닙니다." + +#: utils/adt/jsonpath_exec.c:3212 +#, c-format +msgid "" +"Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +msgstr "jsonpath 매개 변수는 \"vars\" ê°ì²´ì˜ 키-ê°’ ìŒìœ¼ë¡œ ì¸ì½”드 ë˜ì–´ì•¼í•©ë‹ˆë‹¤." + +#: utils/adt/jsonpath_exec.c:3475 #, c-format msgid "jsonpath array subscript is not a single numeric value" -msgstr "" +msgstr "jsonpath ë°°ì—´ 첨ìžê°€ ë‹¨ì¼ ìˆ«ìžê°’ì´ ì•„ë‹™ë‹ˆë‹¤." -#: utils/adt/jsonpath_exec.c:2419 +#: utils/adt/jsonpath_exec.c:3487 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "jsonpath ë°°ì—´ 하위 스í¬ë¦½íŠ¸ê°€ 정수 범위를 초과했ìŒ" -#: utils/adt/jsonpath_exec.c:2596 +#: utils/adt/jsonpath_exec.c:3671 #, c-format msgid "cannot convert value from %s to %s without time zone usage" -msgstr "" +msgstr "지역 시간대 지정 ì—†ì´ëŠ” %sì—서 %s로 ê°’ì„ ë°”ê¿€ 수 없습니다." -#: utils/adt/jsonpath_exec.c:2598 +#: utils/adt/jsonpath_exec.c:3673 #, c-format msgid "Use *_tz() function for time zone support." +msgstr "지역 시간대를 지정하려면, *_tz() 함수를 사용하세요." + +#: utils/adt/jsonpath_exec.c:3981 +#, c-format +msgid "" +"JSON path expression for column \"%s\" should return single item without " +"wrapper" +msgstr "" +"\"%s\" ì¹¼ëŸ¼ì˜ JSON 패스 표현ì‹ì€ wrapper ì—†ì´ ë‹¨ì¼ ì•„ì´í…œì„ 반환해야 함" + +#: utils/adt/jsonpath_exec.c:3983 utils/adt/jsonpath_exec.c:3988 +#, c-format +msgid "Use the WITH WRAPPER clause to wrap SQL/JSON items into an array." +msgstr "SQL/JSON ì•„ì´í…œì„ 배열로 만들려면, WITH WRAPPER ì ˆì„ ì‚¬ìš©í•˜ì„¸ìš”." + +#: utils/adt/jsonpath_exec.c:3987 +#, c-format +msgid "" +"JSON path expression in JSON_QUERY should return single item without wrapper" msgstr "" +"JSON_QUERY 안 JSON 패스 표현ì‹ì€ wrapper ì—†ì´ ë‹¨ì¼ ì•„ì´í…œì„ 반환해야 함" -#: utils/adt/levenshtein.c:133 +#: utils/adt/jsonpath_exec.c:4045 utils/adt/jsonpath_exec.c:4069 +#, c-format +msgid "JSON path expression for column \"%s\" should return single scalar item" +msgstr "\"%s\" ì¹¼ëŸ¼ì„ ìœ„í•œ JSON 패스 표현ì‹ì€ ë‹¨ì¼ ìŠ¤ì¹¼ë¼ ì•„ì´í…œì„ 반환해야 함" + +#: utils/adt/jsonpath_exec.c:4050 utils/adt/jsonpath_exec.c:4074 +#, c-format +msgid "JSON path expression in JSON_VALUE should return single scalar item" +msgstr "JSON_VALUE 안 JSON 패스 표현ì‹ì€ ë‹¨ì¼ ìŠ¤ì¹¼ë¼ ì•„ì´í…œì„ 반환해야 함" + +#: utils/adt/levenshtein.c:132 #, c-format msgid "levenshtein argument exceeds maximum length of %d characters" msgstr "levenshtein ì¸ìžê°’으로 ê·¸ 길ì´ê°€ %d 문ìžì˜ 최대 길ì´ë¥¼ 초과했ìŒ" -#: utils/adt/like.c:160 +#: utils/adt/like.c:159 #, c-format msgid "nondeterministic collations are not supported for LIKE" msgstr "LIKE ì—°ì‚°ì—서 사용할 비결정 정렬규칙(collation)ì€ ì§€ì›í•˜ì§€ 않ìŒ" -#: utils/adt/like.c:193 utils/adt/like_support.c:1002 +#: utils/adt/like.c:188 utils/adt/like_support.c:1023 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "ILIKE ì—°ì‚°ì—서 사용할 정렬규칙(collation)ì„ ê²°ì •í•  수 ì—†ìŒ" -#: utils/adt/like.c:201 +#: utils/adt/like.c:200 #, c-format msgid "nondeterministic collations are not supported for ILIKE" msgstr "ILIKE ì—°ì‚°ì—서 사용할 비결정 정렬규칙(collation)ì€ ì§€ì›í•˜ì§€ 않ìŒ" @@ -23930,22 +27857,22 @@ msgstr "ILIKE ì—°ì‚°ì—서 사용할 비결정 정렬규칙(collation)ì€ ì§€ì› msgid "LIKE pattern must not end with escape character" msgstr "LIKE íŒ¨í„´ì€ ì´ìŠ¤ì¼€ì´í”„ 문ìžë¡œ ë나지 않아야 함" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:700 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:800 #, c-format msgid "invalid escape string" msgstr "ìž˜ëª»ëœ ì´ìŠ¤ì¼€ì´í”„ 문ìžì—´" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:701 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:801 #, c-format msgid "Escape string must be empty or one character." msgstr "ì´ìŠ¤ì¼€ì´í”„ 문ìžì—´ì€ 비어있거나 í•œê°œì˜ ë¬¸ìžì—¬ì•¼ 합니다." -#: utils/adt/like_support.c:987 +#: utils/adt/like_support.c:1013 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "bytea 형ì‹ì—서는 대/소문ìžë¥¼ 구분하지 않는 ì¼ì¹˜ê°€ ì§€ì›ë˜ì§€ 않ìŒ" -#: utils/adt/like_support.c:1089 +#: utils/adt/like_support.c:1114 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "bytea 형ì‹ì—서는 ì •ê·œì‹ ì¼ì¹˜ê°€ ì§€ì›ë˜ì§€ 않ìŒ" @@ -23955,233 +27882,318 @@ msgstr "bytea 형ì‹ì—서는 ì •ê·œì‹ ì¼ì¹˜ê°€ ì§€ì›ë˜ì§€ 않ìŒ" msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "\"macaddr\"ì— ëŒ€í•œ ìž˜ëª»ëœ ì˜¥í…Ÿ(octet) ê°’: \"%s\"" -#: utils/adt/mac8.c:563 +#: utils/adt/mac8.c:555 #, c-format msgid "macaddr8 data out of range to convert to macaddr" -msgstr "" +msgstr "macaddr8 ìžë£Œê°€ macaddr 형으로 변환하기ì—는 ê·¸ 범위가 너무 넓습니다." -#: utils/adt/mac8.c:564 +#: utils/adt/mac8.c:556 #, c-format msgid "" "Only addresses that have FF and FE as values in the 4th and 5th bytes from " "the left, for example xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted " "from macaddr8 to macaddr." msgstr "" +"macaddr8ì—서 macaddr 형으로 변환 í•  수 있는 ê°’ì€ ì™¼ìª½ì—서 4번째, 5번째 ë°”ì´íЏ" +"ê°€ FF와 FE ê°’(예: xx:xx:xx:ff:fe:xx:xx:xx)ì¸ ê²½ìš°ì¼ ë•Œë§Œìž…ë‹ˆë‹¤." + +#: utils/adt/mcxtfuncs.c:173 +#, c-format +msgid "PID %d is not a PostgreSQL server process" +msgstr "PID %d í”„ë¡œê·¸ëž¨ì€ PostgreSQL 서버 프로세스가 아닙니다" -#: utils/adt/misc.c:240 +#: utils/adt/misc.c:237 #, c-format msgid "global tablespace never has databases" msgstr "ì „ì—­ í…Œì´ë¸”스페ì´ìŠ¤ëŠ” ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ê²°ì½” í¬í•¨í•˜ì§€ 않습니다." -#: utils/adt/misc.c:262 +#: utils/adt/misc.c:259 #, c-format msgid "%u is not a tablespace OID" msgstr "%u í…Œì´ë¸”스페ì´ìФ OIDê°€ 아님" -#: utils/adt/misc.c:448 +#: utils/adt/misc.c:454 msgid "unreserved" msgstr "예약ë˜ì§€ 않ìŒ" -#: utils/adt/misc.c:452 +#: utils/adt/misc.c:458 msgid "unreserved (cannot be function or type name)" msgstr "예약ë˜ì§€ 않ìŒ(함수, ìžë£Œí˜• ì´ë¦„ì¼ ìˆ˜ ì—†ìŒ)" -#: utils/adt/misc.c:456 +#: utils/adt/misc.c:462 msgid "reserved (can be function or type name)" msgstr "예약ë¨(함수, ìžë£Œí˜• ì´ë¦„ì¼ ìˆ˜ 있ìŒ)" -#: utils/adt/misc.c:460 +#: utils/adt/misc.c:466 msgid "reserved" msgstr "예약ë¨" -#: utils/adt/misc.c:634 utils/adt/misc.c:648 utils/adt/misc.c:687 -#: utils/adt/misc.c:693 utils/adt/misc.c:699 utils/adt/misc.c:722 +#: utils/adt/misc.c:477 +msgid "can be bare label" +msgstr "ë² ì–´ ë¼ë²¨ 가능" + +#: utils/adt/misc.c:482 +msgid "requires AS" +msgstr "AS 필요함" + +#: utils/adt/misc.c:897 utils/adt/misc.c:911 utils/adt/misc.c:950 +#: utils/adt/misc.c:956 utils/adt/misc.c:962 utils/adt/misc.c:985 #, c-format msgid "string is not a valid identifier: \"%s\"" msgstr "문ìžì—´ì´ 타당한 ì‹ë³„ìžê°€ 아님: \"%s\"" -#: utils/adt/misc.c:636 +#: utils/adt/misc.c:899 #, c-format msgid "String has unclosed double quotes." msgstr "문ìžì—´ 표기ì—서 í°ë”°ì˜´í‘œ ì§ì´ 안맞습니다." -#: utils/adt/misc.c:650 +#: utils/adt/misc.c:913 #, c-format msgid "Quoted identifier must not be empty." msgstr "ì¸ìš©ë¶€í˜¸ 있는 ì‹ë³„ìž: 비어있으면 안ë©ë‹ˆë‹¤" -#: utils/adt/misc.c:689 +#: utils/adt/misc.c:952 #, c-format msgid "No valid identifier before \".\"." msgstr "\".\" ì „ì— íƒ€ë‹¹í•œ ì‹ë³„ìžê°€ ì—†ìŒ" -#: utils/adt/misc.c:695 +#: utils/adt/misc.c:958 #, c-format msgid "No valid identifier after \".\"." msgstr "\".\" ë’¤ì— íƒ€ë‹¹í•œ ì‹ë³„ìž ì—†ìŒ" -#: utils/adt/misc.c:753 +#: utils/adt/misc.c:1018 #, c-format msgid "log format \"%s\" is not supported" msgstr "\"%s\" ì–‘ì‹ì˜ 로그는 ì§€ì›í•˜ì§€ 않습니다" -#: utils/adt/misc.c:754 +#: utils/adt/misc.c:1019 #, c-format -msgid "The supported log formats are \"stderr\" and \"csvlog\"." -msgstr "" +msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." +msgstr "사용할 수 있는 로그 ì–‘ì‹ì€ \"stderr\", \"csvlog\", \"jsonlog\" 입니다." + +#: utils/adt/multirangetypes.c:150 utils/adt/multirangetypes.c:163 +#: utils/adt/multirangetypes.c:192 utils/adt/multirangetypes.c:266 +#: utils/adt/multirangetypes.c:290 +#, c-format +msgid "malformed multirange literal: \"%s\"" +msgstr "비정ìƒì ì¸ multirange 문ìžì—´: \"%s\"" + +#: utils/adt/multirangetypes.c:152 +#, c-format +msgid "Missing left brace." +msgstr "왼쪽 중괄호가 필요합니다." + +#: utils/adt/multirangetypes.c:194 +#, c-format +msgid "Expected range start." +msgstr "범위 시작값 ì—†ìŒ" + +#: utils/adt/multirangetypes.c:268 +#, c-format +msgid "Expected comma or end of multirange." +msgstr "multirange 구분ìž(,) ë˜ëŠ” ëì´ ì—†ìŠµë‹ˆë‹¤." + +#: utils/adt/multirangetypes.c:981 +#, c-format +msgid "multiranges cannot be constructed from multidimensional arrays" +msgstr "다중 ì°¨ì› ë°°ì—´ì€ ë‹¤ì¤‘ 범위 ìžë£Œí˜•으로 구성할 수 없습니다." + +#: utils/adt/multirangetypes.c:1007 +#, c-format +msgid "multirange values cannot contain null members" +msgstr "multirangeì˜ í•œ 범위로 null ê°’ì´ ì˜¬ 수 ì—†ìŒ" -#: utils/adt/network.c:111 +#: utils/adt/network.c:110 #, c-format msgid "invalid cidr value: \"%s\"" msgstr "cidr ìžë£Œí˜•ì— ëŒ€í•œ ìž˜ëª»ëœ ìž…ë ¥: \"%s\"" -#: utils/adt/network.c:112 utils/adt/network.c:242 +#: utils/adt/network.c:111 utils/adt/network.c:241 #, c-format msgid "Value has bits set to right of mask." msgstr "ë§ˆìŠ¤í¬ ì˜¤ë¥¸ìª½ì— ì„¤ì •ëœ ë¹„íŠ¸ê°€ ê°’ì— í¬í•¨ë˜ì–´ 있습니다." -#: utils/adt/network.c:153 utils/adt/network.c:1199 utils/adt/network.c:1224 -#: utils/adt/network.c:1249 +#: utils/adt/network.c:152 utils/adt/network.c:1184 utils/adt/network.c:1209 +#: utils/adt/network.c:1234 #, c-format msgid "could not format inet value: %m" msgstr "inet ê°’ì˜ í˜•ì‹ì„ 지정할 수 ì—†ìŒ: %m" #. translator: %s is inet or cidr -#: utils/adt/network.c:210 +#: utils/adt/network.c:209 #, c-format msgid "invalid address family in external \"%s\" value" msgstr "잘못 ëœ ì£¼ì†Œêµ° \"%s\"" #. translator: %s is inet or cidr -#: utils/adt/network.c:217 +#: utils/adt/network.c:216 #, c-format msgid "invalid bits in external \"%s\" value" msgstr "\"%s\" ê°’ì— ìž˜ëª»ëœ ë¹„íŠ¸ê°€ 있ìŒ" #. translator: %s is inet or cidr -#: utils/adt/network.c:226 +#: utils/adt/network.c:225 #, c-format msgid "invalid length in external \"%s\" value" msgstr "외부 \"%s\" ê°’ì˜ ê¸¸ì´ê°€ 잘못 ë˜ì—ˆìŒ" -#: utils/adt/network.c:241 +#: utils/adt/network.c:240 #, c-format msgid "invalid external \"cidr\" value" msgstr "외부 \"cidr\" ê°’ì´ ìž˜ëª»ë¨" -#: utils/adt/network.c:337 utils/adt/network.c:360 +#: utils/adt/network.c:336 utils/adt/network.c:359 #, c-format msgid "invalid mask length: %d" msgstr "ìž˜ëª»ëœ ë§ˆìŠ¤í¬ ê¸¸ì´: %d" -#: utils/adt/network.c:1267 +#: utils/adt/network.c:1252 #, c-format msgid "could not format cidr value: %m" msgstr "cidr ê°’ì„ ì²˜ë¦¬í•  수 ì—†ìŒ: %m" -#: utils/adt/network.c:1500 +#: utils/adt/network.c:1485 #, c-format msgid "cannot merge addresses from different families" msgstr "서로 다른 페밀리ì—서는 주소를 병합할 수 ì—†ìŒ" -#: utils/adt/network.c:1916 +#: utils/adt/network.c:1893 #, c-format msgid "cannot AND inet values of different sizes" msgstr "서로 í¬ê¸°ê°€ 틀린 inet ê°’ë“¤ì€ AND ì—°ì‚°ì„ í•  수 없습니다." -#: utils/adt/network.c:1948 +#: utils/adt/network.c:1925 #, c-format msgid "cannot OR inet values of different sizes" msgstr "서로 í¬ê¸°ê°€ 틀린 inet ê°’ë“¤ì€ OR ì—°ì‚°ì„ í•  수 없습니다." -#: utils/adt/network.c:2009 utils/adt/network.c:2085 +#: utils/adt/network.c:1986 utils/adt/network.c:2062 #, c-format msgid "result is out of range" msgstr "결과가 범위를 벗어났습니다." -#: utils/adt/network.c:2050 +#: utils/adt/network.c:2027 #, c-format msgid "cannot subtract inet values of different sizes" msgstr "inet ê°’ì—서 서로 í¬ê¸°ê°€ 틀리게 부분 추출(subtract)í•  수 ì—†ìŒ" -#: utils/adt/numeric.c:827 +#: utils/adt/numeric.c:793 utils/adt/numeric.c:3659 utils/adt/numeric.c:7216 +#: utils/adt/numeric.c:7419 utils/adt/numeric.c:7891 utils/adt/numeric.c:10586 +#: utils/adt/numeric.c:11061 utils/adt/numeric.c:11155 +#: utils/adt/numeric.c:11290 +#, c-format +msgid "value overflows numeric format" +msgstr "ê°’ì´ ìˆ˜ì¹˜ 형ì‹ì— 넘처남" + +#: utils/adt/numeric.c:1106 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "외부 \"numeric\" ê°’ì˜ ë¶€í˜¸ê°€ 잘못ë¨" -#: utils/adt/numeric.c:833 +#: utils/adt/numeric.c:1112 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "외부 \"numeric\" ê°’ì˜ ìž˜ëª»ëœ ìŠ¤ì¼€ì¼" -#: utils/adt/numeric.c:842 +#: utils/adt/numeric.c:1121 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "외부 \"numeric\" ê°’ì˜ ìˆ«ìžê°€ 잘못ë¨" -#: utils/adt/numeric.c:1040 utils/adt/numeric.c:1054 +#: utils/adt/numeric.c:1336 utils/adt/numeric.c:1350 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "NUMERIC ì •ë°€ë„ %d ê°’ì€ ë²”ìœ„(1 .. %d)를 벗어났습니다." -#: utils/adt/numeric.c:1045 +#: utils/adt/numeric.c:1341 #, c-format -msgid "NUMERIC scale %d must be between 0 and precision %d" -msgstr "NUMERIC ìŠ¤ì¼€ì¼ %d ê°’ì€ ì •ë°€ë„ ë²”ìœ„(0 .. %d)를 벗어났습니다." +msgid "NUMERIC scale %d must be between %d and %d" +msgstr "NUMERIC ìŠ¤ì¼€ì¼ %d ê°’ì€ %d부터 %d까지 입니다." -#: utils/adt/numeric.c:1063 +#: utils/adt/numeric.c:1359 #, c-format msgid "invalid NUMERIC type modifier" msgstr "ìž˜ëª»ëœ NUMERIC í˜•ì‹ í•œì •ìž" -#: utils/adt/numeric.c:1395 +#: utils/adt/numeric.c:1725 #, c-format msgid "start value cannot be NaN" msgstr "ì‹œìž‘ê°’ì€ NaN ì¼ ìˆ˜ ì—†ìŒ" -#: utils/adt/numeric.c:1400 +#: utils/adt/numeric.c:1729 +#, c-format +msgid "start value cannot be infinity" +msgstr "시작 ê°’ì€ ë¬´í•œì¼ ìˆ˜ ì—†ìŒ" + +#: utils/adt/numeric.c:1736 #, c-format msgid "stop value cannot be NaN" msgstr "ì¢…ë£Œê°’ì€ NaN ì¼ ìˆ˜ ì—†ìŒ" -#: utils/adt/numeric.c:1410 +#: utils/adt/numeric.c:1740 +#, c-format +msgid "stop value cannot be infinity" +msgstr "ì¢…ë£Œê°’ì€ ë¬´í•œì¼ ìˆ˜ ì—†ìŒ" + +#: utils/adt/numeric.c:1753 #, c-format msgid "step size cannot be NaN" msgstr "단계 í¬ê¸°ëŠ” NaN ì¼ ìˆ˜ ì—†ìŒ" -#: utils/adt/numeric.c:2958 utils/adt/numeric.c:6064 utils/adt/numeric.c:6522 -#: utils/adt/numeric.c:8802 utils/adt/numeric.c:9240 utils/adt/numeric.c:9354 -#: utils/adt/numeric.c:9427 +#: utils/adt/numeric.c:1757 #, c-format -msgid "value overflows numeric format" -msgstr "ê°’ì´ ìˆ˜ì¹˜ 형ì‹ì— 넘처남" +msgid "step size cannot be infinity" +msgstr "단계 í¬ê¸°ëŠ” ë¬´í•œì¼ ìˆ˜ ì—†ìŒ" + +#: utils/adt/numeric.c:3649 +#, c-format +msgid "factorial of a negative number is undefined" +msgstr "ìŒìˆ˜ ê±°ë“­ì œê³±ì´ ì •ì˜ë˜ì–´ 있지 않ìŒ" + +#: utils/adt/numeric.c:4256 +#, c-format +msgid "lower bound cannot be NaN" +msgstr "lower bound는 NaN ì¼ ìˆ˜ ì—†ìŒ" + +#: utils/adt/numeric.c:4260 +#, c-format +msgid "lower bound cannot be infinity" +msgstr "lower bound는 ë¬´í•œì¼ ìˆ˜ ì—†ìŒ" -#: utils/adt/numeric.c:3417 +#: utils/adt/numeric.c:4267 #, c-format -msgid "cannot convert NaN to integer" -msgstr "NaN ê°’ì„ ì •ìˆ˜í˜•ìœ¼ë¡œ 변환할 수 없습니다" +msgid "upper bound cannot be NaN" +msgstr "upper bound는 NaN ì¼ ìˆ˜ ì—†ìŒ" -#: utils/adt/numeric.c:3500 +#: utils/adt/numeric.c:4271 #, c-format -msgid "cannot convert NaN to bigint" -msgstr "NaN ê°’ì„ bigint형으로 변환할 수 없습니다" +msgid "upper bound cannot be infinity" +msgstr "upper bound는 ë¬´í•œì¼ ìˆ˜ ì—†ìŒ" -#: utils/adt/numeric.c:3545 +#: utils/adt/numeric.c:4432 utils/adt/numeric.c:4520 utils/adt/numeric.c:4580 +#: utils/adt/numeric.c:4776 #, c-format -msgid "cannot convert NaN to smallint" -msgstr "NaN ê°’ì„ smallint형으로 변환할 수 없습니다" +msgid "cannot convert NaN to %s" +msgstr "NaN ê°’ì„ %s 형으로 변환할 수 없습니다" -#: utils/adt/numeric.c:3582 utils/adt/numeric.c:3653 +#: utils/adt/numeric.c:4436 utils/adt/numeric.c:4524 utils/adt/numeric.c:4584 +#: utils/adt/numeric.c:4780 #, c-format -msgid "cannot convert infinity to numeric" -msgstr "무한(infinity)ì€ ìˆ«ìžë¡œ 변환할 수 ì—†ìŒ" +msgid "cannot convert infinity to %s" +msgstr "ë¬´í•œì€ %s 형으로 변환할 수 ì—†ìŒ" -#: utils/adt/numeric.c:6606 +#: utils/adt/numeric.c:4789 +#, c-format +msgid "pg_lsn out of range" +msgstr "pg_lsn ê°’ì˜ ë²”ìœ„ë¥¼ 벗어났습니다." + +#: utils/adt/numeric.c:7981 utils/adt/numeric.c:8032 #, c-format msgid "numeric field overflow" msgstr "수치 필드 오버플로우" -#: utils/adt/numeric.c:6607 +#: utils/adt/numeric.c:7982 #, c-format msgid "" "A field with precision %d, scale %d must round to an absolute value less " @@ -24190,60 +28202,82 @@ msgstr "" "ì „ì²´ ìžë¦¿ìˆ˜ %d, 소수 ìžë¦¿ìˆ˜ %dì˜ í•„ë“œëŠ” %s%d보다 ìž‘ì€ ì ˆëŒ€ 값으로 반올림해야 " "합니다." -#: utils/adt/numutils.c:154 +#: utils/adt/numeric.c:8033 +#, c-format +msgid "A field with precision %d, scale %d cannot hold an infinite value." +msgstr "ì „ì²´ ìžë¦¿ìˆ˜ %d, 소수 ìžë¦¿ìˆ˜ %dì˜ í•„ë“œëŠ” 무한 ê°’ì„ ì²˜ë¦¬í•  수 ì—†ìŒ." + +#: utils/adt/numeric.c:11359 utils/adt/pseudorandomfuncs.c:135 +#: utils/adt/pseudorandomfuncs.c:159 #, c-format -msgid "value \"%s\" is out of range for 8-bit integer" -msgstr "ê°’ \"%s\"ì€(는) 8비트 ì •ìˆ˜ì˜ ë²”ìœ„ë¥¼ 벗어남" +msgid "lower bound must be less than or equal to upper bound" +msgstr "lower bound는 upper bound보다 작거나 같아야 함" -#: utils/adt/oid.c:290 +#: utils/adt/oid.c:217 #, c-format msgid "invalid oidvector data" msgstr "ìž˜ëª»ëœ oidvector ìžë£Œ" -#: utils/adt/oracle_compat.c:896 +#: utils/adt/oracle_compat.c:976 #, c-format msgid "requested character too large" msgstr "ìš”ì²­ëœ ë¬¸ìžê°€ 너무 í¼" -#: utils/adt/oracle_compat.c:946 utils/adt/oracle_compat.c:1008 +#: utils/adt/oracle_compat.c:1020 #, c-format -msgid "requested character too large for encoding: %d" -msgstr "요청한 문ìžê°€ 너무 커서 ì¸ì½”딩할 수 ì—†ìŒ: %d" +msgid "character number must be positive" +msgstr "ë¬¸ìž ë²ˆí˜¸ëŠ” 양수여야 함" -#: utils/adt/oracle_compat.c:987 -#, c-format -msgid "requested character not valid for encoding: %d" -msgstr "요청한 문ìžê°€ ì¸ì½”딩용으로 타당치 않ìŒ: %d" - -#: utils/adt/oracle_compat.c:1001 +#: utils/adt/oracle_compat.c:1024 #, c-format msgid "null character not permitted" msgstr "null 문ìžëŠ” 허용ë˜ì§€ 않ìŒ" -#: utils/adt/orderedsetaggs.c:442 utils/adt/orderedsetaggs.c:546 -#: utils/adt/orderedsetaggs.c:684 +#: utils/adt/oracle_compat.c:1042 utils/adt/oracle_compat.c:1095 +#, c-format +msgid "requested character too large for encoding: %u" +msgstr "요청한 문ìžê°€ 너무 커서 ì¸ì½”딩할 수 ì—†ìŒ: %u" + +#: utils/adt/oracle_compat.c:1083 +#, c-format +msgid "requested character not valid for encoding: %u" +msgstr "요청한 문ìžê°€ ì¸ì½”딩용으로 타당치 않ìŒ: %u" + +#: utils/adt/orderedsetaggs.c:446 utils/adt/orderedsetaggs.c:551 +#: utils/adt/orderedsetaggs.c:691 #, c-format msgid "percentile value %g is not between 0 and 1" msgstr "%g í¼ì„¼íЏ ê°’ì´ 0ê³¼ 1사ì´ê°€ 아닙니다." -#: utils/adt/pg_locale.c:1262 +#: utils/adt/pg_locale.c:326 utils/adt/pg_locale.c:358 +#, c-format +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "\"%s\" ë¡œì¼€ì¼ ì´ë¦„ì— ì‚¬ìš©í•  수 없는 문ìž(non-ASCII)ê°€ 있ìŒ" + +#: utils/adt/pg_locale.c:1507 #, c-format -msgid "Apply system library package updates." -msgstr "OS ë¼ì´ë¸ŒëŸ¬ë¦¬ 패키지를 ì—…ë°ì´íЏ 하세요." +msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" +msgstr "\"%s\" 로케ì¼(해당 규칙 \"%s\")ìš© ë¬¸ìž ì •ë ¬ 규칙 열기 실패: %s" + +#: utils/adt/pg_locale.c:1518 utils/adt/pg_locale.c:2992 +#: utils/adt/pg_locale.c:3065 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU ì§€ì› ê¸°ëŠ¥ì„ ëº€ 채로 서버가 만들어졌습니다." -#: utils/adt/pg_locale.c:1477 +#: utils/adt/pg_locale.c:1546 #, c-format msgid "could not create locale \"%s\": %m" msgstr "\"%s\" 로케ì¼ì„ 만들 수 ì—†ìŒ: %m" -#: utils/adt/pg_locale.c:1480 +#: utils/adt/pg_locale.c:1549 #, c-format msgid "" -"The operating system could not find any locale data for the locale name \"%s" -"\"." +"The operating system could not find any locale data for the locale name " +"\"%s\"." msgstr "ìš´ì˜ì²´ì œì—서 \"%s\" ë¡œì¼€ì¼ ì´ë¦„ì— ëŒ€í•œ ë¡œì¼€ì¼ íŒŒì¼ì„ ì°¾ì„ ìˆ˜ 없습니다." -#: utils/adt/pg_locale.c:1582 +#: utils/adt/pg_locale.c:1670 #, c-format msgid "" "collations with different collate and ctype values are not supported on this " @@ -24252,307 +28286,397 @@ msgstr "" "ì´ í”Œëž«í¼ì—서는 서로 다른 정렬규칙(collation)ê³¼ 문ìžì§‘í•©(ctype)ì„ í•¨ê»˜ 쓸 수 " "없습니다." -#: utils/adt/pg_locale.c:1591 +#: utils/adt/pg_locale.c:1717 #, c-format -msgid "collation provider LIBC is not supported on this platform" -msgstr "ì´ í”Œëž«í¼ì—서는 LIBC ë¬¸ìž ì •ë ¬ ì œê³µìž ê¸°ëŠ¥(ICU)ì„ ì§€ì›í•˜ì§€ 않ìŒ." +msgid "collation \"%s\" has no actual version, but a version was recorded" +msgstr "\"%s\" ë¬¸ìž ì •ë ¬ ê·œì¹™ì€ ë²„ì „ì´ ì—†ëŠ”ë° ë²„ì „ì„ ì§€ì •í–ˆìŒ" -#: utils/adt/pg_locale.c:1603 +#: utils/adt/pg_locale.c:1723 +#, c-format +msgid "collation \"%s\" has version mismatch" +msgstr "\"%s\" ë¬¸ìž ì •ë ¬ ê·œì¹™ì€ ë²„ì „ì´ ë§žì§€ 않ìŒ" + +#: utils/adt/pg_locale.c:1725 #, c-format msgid "" -"collations with different collate and ctype values are not supported by ICU" +"The collation in the database was created using version %s, but the " +"operating system provides version %s." msgstr "" -"ICU ì§€ì› ê¸°ëŠ¥ì—서는 서로 다른 정렬규칙(collation)ê³¼ 문ìžì§‘í•©(ctype)ì„ í•¨ê»˜ " -"쓸 수 없습니다." +"ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만들때 %s 버전으로 ë¬¸ìž ì •ë ¬ ê·œì¹™ì„ ë§Œë“¤ì—ˆëŠ”ë°, 현재 OS는 %s " +"ë²„ì „ì„ ì œê³µí•˜ê³  있습니다." -#: utils/adt/pg_locale.c:1609 utils/adt/pg_locale.c:1696 -#: utils/adt/pg_locale.c:1969 +#: utils/adt/pg_locale.c:1728 #, c-format -msgid "could not open collator for locale \"%s\": %s" -msgstr "\"%s\" 로케ì¼ìš© ë¬¸ìž ì •ë ¬ 규칙 열기 실패: %s" +msgid "" +"Rebuild all objects affected by this collation and run ALTER COLLATION %s " +"REFRESH VERSION, or build PostgreSQL with the right library version." +msgstr "" +"해당 ì •ë ¬ 규칙과 ì—°ê´€ëœ ëª¨ë“  ê°ì²´ë¥¼ 다시 만들고, ALTER COLLATION %s REFRESH " +"VERSION ëª…ë ¹ì„ ì‹¤í–‰í•˜ê±°ë‚˜, 바른 ë¼ì´ë¸ŒëŸ¬ë¦¬ ë²„ì „ì„ ì§€ì •í•´ì„œ, PostgreSQLì„ ë¹Œë“œ" +"하세요." -#: utils/adt/pg_locale.c:1623 +#: utils/adt/pg_locale.c:1772 utils/adt/pg_locale.c:2556 +#: utils/adt/pg_locale.c:2581 #, c-format -msgid "ICU is not supported in this build" -msgstr "ICU ì§€ì› ê¸°ëŠ¥ì„ ëº€ 채로 서버가 만들어졌습니다." +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "내장 제공ìžìš© ë¡œì¼€ì¼ ì´ë¦„ì´ ìž˜ëª»ë¨: \"%s\"" -#: utils/adt/pg_locale.c:1624 +#: utils/adt/pg_locale.c:1814 #, c-format -msgid "You need to rebuild PostgreSQL using --with-icu." -msgstr "--with-icu ì˜µì…˜ì„ ì‚¬ìš©í•˜ì—¬ PostgreSQLì„ ë‹¤ì‹œ 빌드해야 합니다." +msgid "could not load locale \"%s\"" +msgstr "\"%s\" 로케ì¼ì„ 불러올 수 ì—†ìŒ" -#: utils/adt/pg_locale.c:1644 +#: utils/adt/pg_locale.c:1839 #, c-format -msgid "collation \"%s\" has no actual version, but a version was specified" -msgstr "\"%s\" ì •ë ¬ê·œì¹™ì€ ë¶„ëª…í•œ ë²„ì „ì´ ì—†ëŠ”ë° ë²„ì „ì„ ì§€ì •í–ˆìŒ" +msgid "could not get collation version for locale \"%s\": error code %lu" +msgstr "\"%s\" 로케ì¼ìš© ì •ë ¬ 변환 ê·œì¹™ì„ êµ¬í•  수 ì—†ìŒ: 오류 코드 %lu" -#: utils/adt/pg_locale.c:1651 +#: utils/adt/pg_locale.c:1895 utils/adt/pg_locale.c:1908 #, c-format -msgid "collation \"%s\" has version mismatch" -msgstr "\"%s\" ì •ë ¬ê·œì¹™ì€ ë²„ì „ì´ ë§žì§€ 않ìŒ" +msgid "could not convert string to UTF-16: error code %lu" +msgstr "UTF-16 ì¸ì½”딩으로 문ìžì—´ì„ 변환할 수 ì—†ìŒ: 오류번호 %lu" -#: utils/adt/pg_locale.c:1653 +#: utils/adt/pg_locale.c:1920 #, c-format -msgid "" -"The collation in the database was created using version %s, but the " -"operating system provides version %s." -msgstr "" +msgid "could not compare Unicode strings: %m" +msgstr "유니코드 문ìžì—´ ë¹„êµ ì‹¤íŒ¨: %m" -#: utils/adt/pg_locale.c:1656 +#: utils/adt/pg_locale.c:2094 #, c-format -msgid "" -"Rebuild all objects affected by this collation and run ALTER COLLATION %s " -"REFRESH VERSION, or build PostgreSQL with the right library version." -msgstr "" +msgid "collation failed: %s" +msgstr "문ìžì—´ ì •ë ¬: %s" -#: utils/adt/pg_locale.c:1747 +#: utils/adt/pg_locale.c:2313 utils/adt/pg_locale.c:2345 #, c-format -msgid "could not get collation version for locale \"%s\": error code %lu" -msgstr "\"%s\" 로케ì¼ìš© ì •ë ¬ 변환 ê·œì¹™ì„ êµ¬í•  수 ì—†ìŒ: 오류 코드 %lu" +msgid "sort key generation failed: %s" +msgstr "ì •ë ¬ 키 ìƒì„± 실패: %s" + +#: utils/adt/pg_locale.c:2635 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "\"%s\" 로케ì¼ì—서 언어를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" + +#: utils/adt/pg_locale.c:2656 utils/adt/pg_locale.c:2672 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "\"%s\" 로케ì¼ìš© ë¬¸ìž ì •ë ¬ 규칙 열기 실패: %s" -#: utils/adt/pg_locale.c:1784 +#: utils/adt/pg_locale.c:2697 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "\"%s\" ì¸ì½”ë”©ì€ ICU ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: utils/adt/pg_locale.c:1791 +#: utils/adt/pg_locale.c:2704 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "\"%s\" ì¸ì½”딩용 ICU 변환기 열기 실패: %s" -#: utils/adt/pg_locale.c:1822 utils/adt/pg_locale.c:1831 -#: utils/adt/pg_locale.c:1860 utils/adt/pg_locale.c:1870 +#: utils/adt/pg_locale.c:2722 utils/adt/pg_locale.c:2741 +#: utils/adt/pg_locale.c:2797 utils/adt/pg_locale.c:2808 #, c-format msgid "%s failed: %s" msgstr "%s 실패: %s" -#: utils/adt/pg_locale.c:2142 +#: utils/adt/pg_locale.c:2983 +#, c-format +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "\"%s\" ë¡œì¼€ì¼ ì´ë¦„ì„ ì–¸ì–´ 태그로 변환할 수 ì—†ìŒ: %s" + +#: utils/adt/pg_locale.c:3024 +#, c-format +msgid "could not get language from ICU locale \"%s\": %s" +msgstr "\"%s\" ICU 로케ì¼ì—서 언어 찾기 실패: %s" + +#: utils/adt/pg_locale.c:3026 utils/adt/pg_locale.c:3055 +#, c-format +msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." +msgstr "ICU ë¡œì¼€ì¼ ê²€ì‚¬ë¥¼ 하지 않으려면, \"%s\" ê°’ì„ \"%s\"로 지정하세요." + +#: utils/adt/pg_locale.c:3053 +#, c-format +msgid "ICU locale \"%s\" has unknown language \"%s\"" +msgstr "\"%s\" ICU 로케ì¼ì€ 알 수 없는 \"%s\" 언어를 사용합니다." + +#: utils/adt/pg_locale.c:3204 #, c-format msgid "invalid multibyte character for locale" msgstr "로케ì¼ì„ 위한 ìž˜ëª»ëœ ë©€í‹°ë°”ì´íЏ 문ìž" -#: utils/adt/pg_locale.c:2143 +#: utils/adt/pg_locale.c:3205 #, c-format msgid "" "The server's LC_CTYPE locale is probably incompatible with the database " "encoding." msgstr "ì„œë²„ì˜ LC_CTYPE 로케ì¼ì€ ì´ ë°ì´í„°ë² ì´ìФ ì¸ì½”딩과 호환ë˜ì§€ 않습니다." -#: utils/adt/pg_upgrade_support.c:29 +#: utils/adt/pg_lsn.c:262 +#, c-format +msgid "cannot add NaN to pg_lsn" +msgstr "NaN ê°’ì„ pg_lsn 형으로 변환할 수 없습니다" + +#: utils/adt/pg_lsn.c:296 +#, c-format +msgid "cannot subtract NaN from pg_lsn" +msgstr "pg_lsn ì—서는 NaN í˜•ì„ ë¹¼ë‚¼ 수 없습니다" + +#: utils/adt/pg_upgrade_support.c:39 #, c-format msgid "function can only be called when server is in binary upgrade mode" msgstr "함수는 서버가 ì´ì§„ 업그레ì´ë“œ ìƒíƒœì—서만 호출 ë  ìˆ˜ 있습니다" -#: utils/adt/pgstatfuncs.c:500 +#: utils/adt/pgstatfuncs.c:252 #, c-format msgid "invalid command name: \"%s\"" msgstr "ìž˜ëª»ëœ ëª…ë ¹ì–´ ì´ë¦„: \"%s\"" -#: utils/adt/pseudotypes.c:57 utils/adt/pseudotypes.c:91 +#: utils/adt/pgstatfuncs.c:1739 +#, c-format +msgid "unrecognized reset target: \"%s\"" +msgstr "알 수 없는 리셋 타겟: \"%s\"" + +#: utils/adt/pgstatfuncs.c:1740 +#, c-format +msgid "" +"Target must be \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", " +"\"recovery_prefetch\", \"slru\", or \"wal\"." +msgstr "" +"사용 가능한 íƒ€ê²Ÿì€ \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", " +"\"recovery_prefetch\", \"slru\", \"wal\" 입니다." + +#: utils/adt/pgstatfuncs.c:1822 +#, c-format +msgid "invalid subscription OID %u" +msgstr "ìž˜ëª»ëœ êµ¬ë… OID %u" + +#: utils/adt/pseudorandomfuncs.c:69 +#, c-format +msgid "setseed parameter %g is out of allowed range [-1,1]" +msgstr "%g setseed 매개 변수가 [-1,1] 범위를 벗어났습니다." + +#: utils/adt/pseudotypes.c:55 utils/adt/pseudotypes.c:89 #, c-format msgid "cannot display a value of type %s" msgstr "%s ìžë£Œí˜•ì˜ ê°’ì€ í‘œì‹œí•  수 ì—†ìŒ" -#: utils/adt/pseudotypes.c:283 +#: utils/adt/pseudotypes.c:307 #, c-format msgid "cannot accept a value of a shell type" msgstr "ì…¸ 형태 ê°’ì€ ì‚¬ìš©í•  수 ì—†ìŒ" -#: utils/adt/pseudotypes.c:293 +#: utils/adt/pseudotypes.c:317 #, c-format msgid "cannot display a value of a shell type" msgstr "shell 형ì‹ì˜ ê°’ì€ í‘œì‹œí•  수 ì—†ìŒ" -#: utils/adt/rangetypes.c:406 +#: utils/adt/rangetypes.c:422 #, c-format msgid "range constructor flags argument must not be null" msgstr "range ìžë£Œí˜• êµ¬ì„±ìž í”Œëž˜ê·¸ ì¸ìžë¡œ nullì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: utils/adt/rangetypes.c:993 +#: utils/adt/rangetypes.c:1021 #, c-format msgid "result of range difference would not be contiguous" -msgstr "" +msgstr "범위 ì°¨ì´ ê²°ê³¼ê°€ ì—°ì†ì ì´ì§€ 않습니다." -#: utils/adt/rangetypes.c:1054 +#: utils/adt/rangetypes.c:1082 #, c-format msgid "result of range union would not be contiguous" -msgstr "" +msgstr "범위 ê²°í•© 결과가 ì—°ì†ì ì´ì§€ 않습니다." -#: utils/adt/rangetypes.c:1600 +#: utils/adt/rangetypes.c:1757 #, c-format msgid "range lower bound must be less than or equal to range upper bound" msgstr "range ìžë£Œí˜•ì˜ í•˜í•œê°’ì€ ìƒí•œê°’ê³¼ 같거나 작아야 합니다" -#: utils/adt/rangetypes.c:1983 utils/adt/rangetypes.c:1996 -#: utils/adt/rangetypes.c:2010 +#: utils/adt/rangetypes.c:2256 utils/adt/rangetypes.c:2269 +#: utils/adt/rangetypes.c:2283 #, c-format msgid "invalid range bound flags" msgstr "ìž˜ëª»ëœ range 구성 플래그" -#: utils/adt/rangetypes.c:1984 utils/adt/rangetypes.c:1997 -#: utils/adt/rangetypes.c:2011 +#: utils/adt/rangetypes.c:2257 utils/adt/rangetypes.c:2270 +#: utils/adt/rangetypes.c:2284 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "유효한 ê°’ì€ \"[]\", \"[)\", \"(]\", \"()\"." -#: utils/adt/rangetypes.c:2076 utils/adt/rangetypes.c:2093 -#: utils/adt/rangetypes.c:2106 utils/adt/rangetypes.c:2124 -#: utils/adt/rangetypes.c:2135 utils/adt/rangetypes.c:2179 -#: utils/adt/rangetypes.c:2187 +#: utils/adt/rangetypes.c:2352 utils/adt/rangetypes.c:2369 +#: utils/adt/rangetypes.c:2384 utils/adt/rangetypes.c:2404 +#: utils/adt/rangetypes.c:2415 utils/adt/rangetypes.c:2462 +#: utils/adt/rangetypes.c:2470 #, c-format msgid "malformed range literal: \"%s\"" msgstr "비정ìƒì ì¸ range 문ìž: \"%s\"" -#: utils/adt/rangetypes.c:2078 +#: utils/adt/rangetypes.c:2354 #, c-format msgid "Junk after \"empty\" key word." msgstr " \"empty\" 키워드 ë’¤ì— ì •í¬ê°€ 있ìŒ" -#: utils/adt/rangetypes.c:2095 +#: utils/adt/rangetypes.c:2371 #, c-format msgid "Missing left parenthesis or bracket." msgstr "왼쪽 괄호가 빠졌ìŒ" -#: utils/adt/rangetypes.c:2108 +#: utils/adt/rangetypes.c:2386 #, c-format msgid "Missing comma after lower bound." msgstr "하한값 ë’¤ì— ì‰¼í‘œê°€ 빠졌ìŒ" -#: utils/adt/rangetypes.c:2126 +#: utils/adt/rangetypes.c:2406 #, c-format msgid "Too many commas." msgstr "ì¹¼ëŸ¼ì´ ë„ˆë¬´ 많습니다." -#: utils/adt/rangetypes.c:2137 +#: utils/adt/rangetypes.c:2417 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "오른쪽 괄호 다ìŒì— ì •í¬ê°€ 있ìŒ" -#: utils/adt/regexp.c:289 utils/adt/regexp.c:1543 utils/adt/varlena.c:4493 +#: utils/adt/regexp.c:304 utils/adt/regexp.c:1996 utils/adt/varlena.c:4273 #, c-format msgid "regular expression failed: %s" msgstr "ìž˜ëª»ëœ ì •ê·œì‹: %s" -#: utils/adt/regexp.c:426 +#: utils/adt/regexp.c:445 utils/adt/regexp.c:680 +#, c-format +msgid "invalid regular expression option: \"%.*s\"" +msgstr "ìž˜ëª»ëœ ì •ê·œì‹ ì˜µì…˜: \"%.*s\"" + +#: utils/adt/regexp.c:682 #, c-format -msgid "invalid regular expression option: \"%c\"" -msgstr "ìž˜ëª»ëœ ì •ê·œì‹ ì˜µì…˜: \"%c\"" +msgid "" +"If you meant to use regexp_replace() with a start parameter, cast the fourth " +"argument to integer explicitly." +msgstr "" +"시작 위치를 지정하려는 regexp_replace() 함수 ì‚¬ìš©ì¸ ê²½ìš°, 네번째 ì¸ìžëŠ” 정수" +"í˜•ì„ ì§€ì •í•´ì•¼í•©ë‹ˆë‹¤." + +#: utils/adt/regexp.c:716 utils/adt/regexp.c:725 utils/adt/regexp.c:1082 +#: utils/adt/regexp.c:1146 utils/adt/regexp.c:1155 utils/adt/regexp.c:1164 +#: utils/adt/regexp.c:1173 utils/adt/regexp.c:1853 utils/adt/regexp.c:1862 +#: utils/adt/regexp.c:1871 utils/misc/guc.c:6820 utils/misc/guc.c:6854 +#, c-format +msgid "invalid value for parameter \"%s\": %d" +msgstr "ìž˜ëª»ëœ \"%s\" 매개 ë³€ìˆ˜ì˜ ê°’: %d" -#: utils/adt/regexp.c:836 +#: utils/adt/regexp.c:936 #, c-format msgid "" "SQL regular expression may not contain more than two escape-double-quote " "separators" msgstr "" +"SQL ì •ê·œ 표현ì‹ì—서는 ë‘ ê°œ ì´ìƒì˜ ì´ìŠ¤ì¼€ì´í”„ í° ë”°ì˜´í‘œ 구분ìžë¥¼ 쓸 수 ì—†ìŒ" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:981 utils/adt/regexp.c:1363 utils/adt/regexp.c:1418 +#: utils/adt/regexp.c:1093 utils/adt/regexp.c:1184 utils/adt/regexp.c:1271 +#: utils/adt/regexp.c:1310 utils/adt/regexp.c:1698 utils/adt/regexp.c:1753 +#: utils/adt/regexp.c:1882 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s 함수는 \"global\" ì˜µì…˜ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: utils/adt/regexp.c:983 +#: utils/adt/regexp.c:1312 #, c-format msgid "Use the regexp_matches function instead." msgstr "ëŒ€ì‹ ì— regexp_matches 함수를 사용하세요." -#: utils/adt/regexp.c:1165 +#: utils/adt/regexp.c:1500 #, c-format msgid "too many regular expression matches" msgstr "너무 ë§ŽìŒ ì •ê·œì‹ ë§¤ì¹˜" -#: utils/adt/regproc.c:107 +#: utils/adt/regproc.c:104 #, c-format msgid "more than one function named \"%s\"" msgstr "\"%s\"(ì´)ë¼ëŠ” 함수가 ë‘ ê°œ ì´ìƒ 있ìŒ" -#: utils/adt/regproc.c:525 +#: utils/adt/regproc.c:513 #, c-format msgid "more than one operator named %s" msgstr "%s(ì´)ë¼ëŠ” ì—°ì‚°ìžê°€ ë‘ ê°œ ì´ìƒ 있ìŒ" -#: utils/adt/regproc.c:692 utils/adt/regproc.c:733 gram.y:8223 +#: utils/adt/regproc.c:670 gram.y:8992 #, c-format msgid "missing argument" msgstr "ì¸ìžê°€ 빠졌ìŒ" -#: utils/adt/regproc.c:693 utils/adt/regproc.c:734 gram.y:8224 +#: utils/adt/regproc.c:671 gram.y:8993 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "단항 ì—°ì‚°ìžì—서 ì¸ìž ì—†ìŒì„ 표시할 때는 NONE ì¸ìžë¥¼ 사용하세요." -#: utils/adt/regproc.c:697 utils/adt/regproc.c:738 utils/adt/regproc.c:2018 -#: utils/adt/ruleutils.c:9297 utils/adt/ruleutils.c:9466 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10509 +#: utils/adt/ruleutils.c:10722 #, c-format msgid "too many arguments" msgstr "ì¸ìžê°€ 너무 많습니다" -#: utils/adt/regproc.c:698 utils/adt/regproc.c:739 +#: utils/adt/regproc.c:676 #, c-format msgid "Provide two argument types for operator." msgstr "ì—°ì‚°ìžë¥¼ 위해서는 ë‘ê°œì˜ ì¸ìž ìžë£Œí˜•ì„ ì§€ì •í•˜ì‹­ì‹œì˜¤." -#: utils/adt/regproc.c:1602 utils/adt/regproc.c:1626 utils/adt/regproc.c:1727 -#: utils/adt/regproc.c:1751 utils/adt/regproc.c:1853 utils/adt/regproc.c:1858 -#: utils/adt/varlena.c:3642 utils/adt/varlena.c:3647 +#: utils/adt/regproc.c:1564 utils/adt/regproc.c:1681 utils/adt/regproc.c:1810 +#: utils/adt/regproc.c:1815 utils/adt/varlena.c:3413 utils/adt/varlena.c:3418 #, c-format msgid "invalid name syntax" msgstr "ìž˜ëª»ëœ ì´ë¦„ 구문" -#: utils/adt/regproc.c:1916 +#: utils/adt/regproc.c:1924 #, c-format msgid "expected a left parenthesis" msgstr "왼쪽 괄호가 필요합니다." -#: utils/adt/regproc.c:1932 +#: utils/adt/regproc.c:1942 #, c-format msgid "expected a right parenthesis" msgstr "오른쪽 괄호가 필요합니다." -#: utils/adt/regproc.c:1951 +#: utils/adt/regproc.c:1961 #, c-format msgid "expected a type name" msgstr "ìžë£Œí˜• ì´ë¦„ì„ ì§€ì •í•˜ì‹­ì‹œì˜¤" -#: utils/adt/regproc.c:1983 +#: utils/adt/regproc.c:1993 #, c-format msgid "improper type name" msgstr "ë¶€ì ì ˆí•œ í˜•ì‹ ì´ë¦„" -#: utils/adt/ri_triggers.c:296 utils/adt/ri_triggers.c:1537 -#: utils/adt/ri_triggers.c:2470 +#: utils/adt/ri_triggers.c:303 utils/adt/ri_triggers.c:1616 +#: utils/adt/ri_triggers.c:2601 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "" "\"%s\" í…Œì´ë¸”ì—서 ìžë£Œ 추가, 갱신 ìž‘ì—…ì´ \"%s\" 참조키(foreign key) 제약 ì¡°ê±´" "ì„ ìœ„ë°°í–ˆìŠµë‹ˆë‹¤" -#: utils/adt/ri_triggers.c:299 utils/adt/ri_triggers.c:1540 +#: utils/adt/ri_triggers.c:306 utils/adt/ri_triggers.c:1619 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MATCH FULLì— null 키 ê°’ê³¼ nonnull 키 ê°’ì„ í•¨ê»˜ 사용할 수 없습니다." -#: utils/adt/ri_triggers.c:1940 +#: utils/adt/ri_triggers.c:2036 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "INSERTì— ëŒ€í•´ \"%s\" 함수를 실행해야 함" -#: utils/adt/ri_triggers.c:1946 +#: utils/adt/ri_triggers.c:2042 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "UPDATEì— ëŒ€í•´ \"%s\" 함수를 실행해야 함" -#: utils/adt/ri_triggers.c:1952 +#: utils/adt/ri_triggers.c:2048 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "DELETEì— ëŒ€í•´ \"%s\" 함수를 실행해야 함" -#: utils/adt/ri_triggers.c:1975 +#: utils/adt/ri_triggers.c:2071 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "\"%s\" 트리거(해당 í…Œì´ë¸”: \"%s\")ì— ëŒ€í•œ pg_constraint í•­ëª©ì´ ì—†ìŒ" -#: utils/adt/ri_triggers.c:1977 +#: utils/adt/ri_triggers.c:2073 #, c-format msgid "" "Remove this referential integrity trigger and its mates, then do ALTER TABLE " @@ -24561,12 +28685,12 @@ msgstr "" "해당 트리거 관련 개체를 제거한 후 ALTER TABLE ADD CONSTRAINT 명령으로 추가하" "세요" -#: utils/adt/ri_triggers.c:2007 gram.y:3818 +#: utils/adt/ri_triggers.c:2103 gram.y:4340 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "MATCH PARTIAL ê¸°ëŠ¥ì€ ì•„ì§ êµ¬í˜„ 안ë˜ì—ˆìŠµë‹ˆë‹¤" -#: utils/adt/ri_triggers.c:2295 +#: utils/adt/ri_triggers.c:2426 #, c-format msgid "" "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave " @@ -24575,32 +28699,32 @@ msgstr "" "\"%s\"ì— ëŒ€í•œ 참조 무결성 쿼리(제약조건: \"%s\", 해당 릴레ì´ì…˜: \"%s\")를 실" "행하면 예기치 ì•Šì€ ê²°ê³¼ê°€ ë°œìƒí•¨" -#: utils/adt/ri_triggers.c:2299 +#: utils/adt/ri_triggers.c:2430 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "ì´ ë¬¸ì œëŠ” 주로 ë£°ì´ ìž¬ìž‘ì„± ë˜ì—ˆì„ 때 ë°œìƒí•©ë‹ˆë‹¤." -#: utils/adt/ri_triggers.c:2460 +#: utils/adt/ri_triggers.c:2591 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "\"%s\" 파티션 지우기는 \"%s\" 참조키 ì œì•½ì¡°ê±´ì„ ìœ„ë°˜í•¨" -#: utils/adt/ri_triggers.c:2463 utils/adt/ri_triggers.c:2488 +#: utils/adt/ri_triggers.c:2594 utils/adt/ri_triggers.c:2619 #, c-format msgid "Key (%s)=(%s) is still referenced from table \"%s\"." msgstr "(%s)=(%s) 키가 \"%s\" í…Œì´ë¸”ì—서 여전히 참조ë©ë‹ˆë‹¤." -#: utils/adt/ri_triggers.c:2474 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "(%s)=(%s) 키가 \"%s\" í…Œì´ë¸”ì— ì—†ìŠµë‹ˆë‹¤." -#: utils/adt/ri_triggers.c:2477 +#: utils/adt/ri_triggers.c:2608 #, c-format msgid "Key is not present in table \"%s\"." msgstr "\"%s\" í…Œì´ë¸”ì— í‚¤ê°€ 없습니다." -#: utils/adt/ri_triggers.c:2483 +#: utils/adt/ri_triggers.c:2614 #, c-format msgid "" "update or delete on table \"%s\" violates foreign key constraint \"%s\" on " @@ -24609,266 +28733,265 @@ msgstr "" "\"%s\" í…Œì´ë¸”ì˜ ìžë£Œ 갱신, ì‚­ì œ ìž‘ì—…ì´ \"%s\" 참조키(foreign key) 제약 ì¡°ê±´ " "- \"%s\" í…Œì´ë¸” - ì„ ìœ„ë°˜í–ˆìŠµë‹ˆë‹¤" -#: utils/adt/ri_triggers.c:2491 +#: utils/adt/ri_triggers.c:2622 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "\"%s\" í…Œì´ë¸”ì—서 키가 여전히 참조ë©ë‹ˆë‹¤." -#: utils/adt/rowtypes.c:104 utils/adt/rowtypes.c:482 +#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:509 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "ìµëª… 복합 형ì‹ì˜ ìž…ë ¥ì´ êµ¬í˜„ë˜ì–´ 있지 않ìŒ" -#: utils/adt/rowtypes.c:156 utils/adt/rowtypes.c:185 utils/adt/rowtypes.c:208 -#: utils/adt/rowtypes.c:216 utils/adt/rowtypes.c:268 utils/adt/rowtypes.c:276 +#: utils/adt/rowtypes.c:158 utils/adt/rowtypes.c:190 utils/adt/rowtypes.c:216 +#: utils/adt/rowtypes.c:227 utils/adt/rowtypes.c:285 utils/adt/rowtypes.c:296 #, c-format msgid "malformed record literal: \"%s\"" msgstr "비정ìƒì ì¸ 레코드 문ìž: \"%s\"" -#: utils/adt/rowtypes.c:157 +#: utils/adt/rowtypes.c:159 #, c-format msgid "Missing left parenthesis." msgstr "왼쪽 괄호가 필요합니다." -#: utils/adt/rowtypes.c:186 +#: utils/adt/rowtypes.c:191 #, c-format msgid "Too few columns." msgstr "ì¹¼ëŸ¼ì´ ë„ˆë¬´ ì ìŠµë‹ˆë‹¤." -#: utils/adt/rowtypes.c:269 +#: utils/adt/rowtypes.c:286 #, c-format msgid "Too many columns." msgstr "ì¹¼ëŸ¼ì´ ë„ˆë¬´ 많습니다." -#: utils/adt/rowtypes.c:277 +#: utils/adt/rowtypes.c:297 #, c-format msgid "Junk after right parenthesis." msgstr "오른쪽 괄호가 필요합니다." -#: utils/adt/rowtypes.c:531 +#: utils/adt/rowtypes.c:558 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "ì—´ 수(%d)ê°€ 최대값(%d)ì„ ì´ˆê³¼í–ˆìŠµë‹ˆë‹¤" -#: utils/adt/rowtypes.c:559 +#: utils/adt/rowtypes.c:599 #, c-format -msgid "wrong data type: %u, expected %u" -msgstr "ìž˜ëª»ëœ ìžë£Œí˜•: %u, 예ìƒë˜ëŠ” ìžë£Œí˜• %u" +msgid "" +"binary data has type %u (%s) instead of expected %u (%s) in record column %d" +msgstr "ë°”ì´ë„ˆë¦¬ ìžë£Œí˜•ì´ %u (%s) ìž„. 기대 ìžë£Œí˜•: %u (%s), 해당 칼럼: %d" -#: utils/adt/rowtypes.c:620 +#: utils/adt/rowtypes.c:660 #, c-format msgid "improper binary format in record column %d" msgstr "%d 번째 레코드 ì—´ì—서 ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ í¬ë§·ì´ 있습니다" -#: utils/adt/rowtypes.c:911 utils/adt/rowtypes.c:1157 utils/adt/rowtypes.c:1415 -#: utils/adt/rowtypes.c:1661 +#: utils/adt/rowtypes.c:949 utils/adt/rowtypes.c:1195 utils/adt/rowtypes.c:1453 +#: utils/adt/rowtypes.c:1699 #, c-format msgid "cannot compare dissimilar column types %s and %s at record column %d" msgstr "서로 다른 ì—´ í˜•ì‹ %sê³¼(와) %s(레코드 ì—´ %d)ì„(를) 비êµí•  수 ì—†ìŒ" -#: utils/adt/rowtypes.c:1002 utils/adt/rowtypes.c:1227 -#: utils/adt/rowtypes.c:1512 utils/adt/rowtypes.c:1697 +#: utils/adt/rowtypes.c:1040 utils/adt/rowtypes.c:1265 +#: utils/adt/rowtypes.c:1550 utils/adt/rowtypes.c:1735 #, c-format msgid "cannot compare record types with different numbers of columns" msgstr "칼럼 수가 서로 다른 레코드 ìžë£Œí˜•ì„ ë¹„êµí•  수 ì—†ìŒ" -#: utils/adt/ruleutils.c:4821 +#: utils/adt/ruleutils.c:2694 +#, c-format +msgid "input is a query, not an expression" +msgstr "ìž…ë ¥ê°’ì´ expressionì´ ì•„ë‹ˆë¼, query ìž„" + +#: utils/adt/ruleutils.c:2706 +#, c-format +msgid "expression contains variables of more than one relation" +msgstr "expressionì´ í•˜ë‚˜ ì´ìƒì˜ 릴레ì´ì…˜ 변수를 í¬í•¨í•˜ê³  있ìŒ" + +#: utils/adt/ruleutils.c:2713 +#, c-format +msgid "expression contains variables" +msgstr "expressionì´ ë³€ìˆ˜ë“¤ì„ í¬í•¨í•˜ê³  있ìŒ" + +#: utils/adt/ruleutils.c:5246 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "\"%s\" ë£°ì€ %d ì´ë²¤íЏ 형태를 ì§€ì›í•˜ì§€ 않습니다" -#: utils/adt/timestamp.c:107 +#: utils/adt/timestamp.c:128 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "TIMESTAMP(%d)%s ì •ë°€ë„로 ìŒìˆ˜ë¥¼ 사용할 수 없습니다" -#: utils/adt/timestamp.c:113 +#: utils/adt/timestamp.c:134 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "TIMESTAMP(%d)%s ì •ë°€ë„는 최대값(%d)으로 줄였습니다" -#: utils/adt/timestamp.c:176 utils/adt/timestamp.c:434 utils/misc/guc.c:11901 -#, c-format -msgid "timestamp out of range: \"%s\"" -msgstr "타임스탬프 ê°’ì´ ë²”ìœ„ë¥¼ 벗어났ìŒ: \"%s\"" - -#: utils/adt/timestamp.c:372 +#: utils/adt/timestamp.c:394 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "타임스탬프(%d) ì •ë°€ë„는 %dì—서 %d 사ì´ì—¬ì•¼ 함" -#: utils/adt/timestamp.c:496 +#: utils/adt/timestamp.c:512 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "숫ìží˜• 타임 ì¡´ 형ì‹ì€ 처ìŒì— \"-\" ë˜ëŠ” \"+\" 문ìžê°€ 있어야 합니다." -#: utils/adt/timestamp.c:509 +#: utils/adt/timestamp.c:524 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "\"%s\" 숫ìží˜• 타임 ì¡´ 범위 벗어남" -#: utils/adt/timestamp.c:601 utils/adt/timestamp.c:611 -#: utils/adt/timestamp.c:619 +#: utils/adt/timestamp.c:625 utils/adt/timestamp.c:635 +#: utils/adt/timestamp.c:643 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "타임스탬프 ê°’ì´ ë²”ìœ„ë¥¼ 벗어났ìŒ: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:720 +#: utils/adt/timestamp.c:744 #, c-format msgid "timestamp cannot be NaN" msgstr "타임스탬프 값으로 NaN ê°’ì„ ì§€ì •í•  수 ì—†ìŒ" -#: utils/adt/timestamp.c:738 utils/adt/timestamp.c:750 +#: utils/adt/timestamp.c:762 utils/adt/timestamp.c:774 #, c-format msgid "timestamp out of range: \"%g\"" msgstr "타임스탬프 ê°’ì´ ë²”ìœ„ë¥¼ 벗어났ìŒ: \"%g\"" -#: utils/adt/timestamp.c:935 utils/adt/timestamp.c:1509 -#: utils/adt/timestamp.c:1944 utils/adt/timestamp.c:3042 -#: utils/adt/timestamp.c:3047 utils/adt/timestamp.c:3052 -#: utils/adt/timestamp.c:3102 utils/adt/timestamp.c:3109 -#: utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3136 -#: utils/adt/timestamp.c:3143 utils/adt/timestamp.c:3150 -#: utils/adt/timestamp.c:3180 utils/adt/timestamp.c:3188 -#: utils/adt/timestamp.c:3232 utils/adt/timestamp.c:3659 -#: utils/adt/timestamp.c:3784 utils/adt/timestamp.c:4244 +#: utils/adt/timestamp.c:957 utils/adt/timestamp.c:1516 +#: utils/adt/timestamp.c:1526 utils/adt/timestamp.c:1587 +#: utils/adt/timestamp.c:2807 utils/adt/timestamp.c:2816 +#: utils/adt/timestamp.c:2831 utils/adt/timestamp.c:2905 +#: utils/adt/timestamp.c:2922 utils/adt/timestamp.c:2979 +#: utils/adt/timestamp.c:3022 utils/adt/timestamp.c:3400 +#: utils/adt/timestamp.c:3458 utils/adt/timestamp.c:3481 +#: utils/adt/timestamp.c:3490 utils/adt/timestamp.c:3514 +#: utils/adt/timestamp.c:3537 utils/adt/timestamp.c:3546 +#: utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3782 +#: utils/adt/timestamp.c:4189 utils/adt/timestamp.c:4226 +#: utils/adt/timestamp.c:4274 utils/adt/timestamp.c:4283 +#: utils/adt/timestamp.c:4375 utils/adt/timestamp.c:4422 +#: utils/adt/timestamp.c:4431 utils/adt/timestamp.c:4527 +#: utils/adt/timestamp.c:4580 utils/adt/timestamp.c:4590 +#: utils/adt/timestamp.c:4785 utils/adt/timestamp.c:4795 +#: utils/adt/timestamp.c:5097 #, c-format msgid "interval out of range" msgstr "ê°„ê²©ì´ ë²”ìœ„ë¥¼ 벗어남" -#: utils/adt/timestamp.c:1062 utils/adt/timestamp.c:1095 +#: utils/adt/timestamp.c:1094 utils/adt/timestamp.c:1127 #, c-format msgid "invalid INTERVAL type modifier" msgstr "ìž˜ëª»ëœ INTERVAL í˜•ì‹ í•œì •ìž" -#: utils/adt/timestamp.c:1078 +#: utils/adt/timestamp.c:1110 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d) ì •ë°€ë„로 ìŒìˆ˜ê°’ì´ ì˜¬ 수 없습니다" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1116 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d) ì •ë°€ë„는 허용 최대치(%d)로 ê°ì†Œ ë˜ì—ˆìŠµë‹ˆë‹¤" -#: utils/adt/timestamp.c:1466 +#: utils/adt/timestamp.c:1506 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "간격(%d) ì •ë°€ë„는 %dì—서 %d 사ì´ì—¬ì•¼ 함" -#: utils/adt/timestamp.c:2643 -#, c-format -msgid "cannot subtract infinite timestamps" -msgstr "타임스탬프 ë¬´í•œê°’ì„ ì¶”ì¶œ í•  수 ì—†ìŒ" - -#: utils/adt/timestamp.c:3912 utils/adt/timestamp.c:4505 -#: utils/adt/timestamp.c:4667 utils/adt/timestamp.c:4688 -#, c-format -msgid "timestamp units \"%s\" not supported" -msgstr "\"%s\" timestamp ìœ ë‹›ì€ ì§€ì›í•˜ì§€ 않습니다" - -#: utils/adt/timestamp.c:3926 utils/adt/timestamp.c:4459 -#: utils/adt/timestamp.c:4698 +#: utils/adt/timestamp.c:4564 utils/adt/timestamp.c:4769 #, c-format -msgid "timestamp units \"%s\" not recognized" -msgstr "\"%s\" timestamp ìœ ë‹›ì„ ì²˜ë¦¬í•˜ì§€ 못했습니다" +msgid "origin out of range" +msgstr "ì˜¤ë¦¬ì§„ì˜ ë²”ìœ„ë¥¼ 벗어났습니다." -#: utils/adt/timestamp.c:4056 utils/adt/timestamp.c:4500 -#: utils/adt/timestamp.c:4863 utils/adt/timestamp.c:4885 +#: utils/adt/timestamp.c:4569 utils/adt/timestamp.c:4774 #, c-format -msgid "timestamp with time zone units \"%s\" not supported" -msgstr "\"%s\" 시간대 ìœ ë‹›ì´ ìžˆëŠ” timestamp ìžë£Œí˜•ì€ ì§€ì›í•˜ì§€ 않습니다" +msgid "timestamps cannot be binned into infinite intervals" +msgstr "timestampê°’ì€ ë¬´í•œ interval 형으로 ë°”ì¸ë“œí•  수 ì—†ìŒ" -#: utils/adt/timestamp.c:4073 utils/adt/timestamp.c:4454 -#: utils/adt/timestamp.c:4894 +#: utils/adt/timestamp.c:4574 utils/adt/timestamp.c:4779 #, c-format -msgid "timestamp with time zone units \"%s\" not recognized" -msgstr "\"%s\" 시간대 ìœ ë‹›ì´ ìžˆëŠ” timestamp ê°’ì„ ì²˜ë¦¬í•˜ì§€ 못했습니다" +msgid "timestamps cannot be binned into intervals containing months or years" +msgstr "timestampê°’ì€ ì›”ì´ë‚˜ ë…„ì„ í¬í•¨í•˜ëŠ” interval 형으로 ë°”ì¸ë“œí•  수 ì—†ìŒ" -#: utils/adt/timestamp.c:4231 +#: utils/adt/timestamp.c:4585 utils/adt/timestamp.c:4790 #, c-format -msgid "" -"interval units \"%s\" not supported because months usually have fractional " -"weeks" -msgstr "" +msgid "stride must be greater than zero" +msgstr "stride ê°’ì€ 0 보다 커야 합니다" -#: utils/adt/timestamp.c:4237 utils/adt/timestamp.c:4988 +#: utils/adt/timestamp.c:5091 #, c-format -msgid "interval units \"%s\" not supported" -msgstr "\"%s\" 유닛 간격(interval units)ì€ ì§€ì›í•˜ì§€ 않습니다" +msgid "Months usually have fractional weeks." +msgstr "달ì—는 보통 ë¶„ìˆ˜í˜•íƒœì˜ ì£¼ê°„ì´ ìžˆìŠµë‹ˆë‹¤." -#: utils/adt/timestamp.c:4253 utils/adt/timestamp.c:5011 +#: utils/adt/timestamp.c:6551 utils/adt/timestamp.c:6637 #, c-format -msgid "interval units \"%s\" not recognized" -msgstr "\"%s\" 유닛 간격(interval units)ì„ ì²˜ë¦¬í•˜ì§€ 못했습니다" +msgid "step size cannot be infinite" +msgstr "단계 í¬ê¸°ëŠ” ë¬´í•œì¼ ìˆ˜ ì—†ìŒ" -#: utils/adt/trigfuncs.c:42 +#: utils/adt/trigfuncs.c:41 #, c-format msgid "suppress_redundant_updates_trigger: must be called as trigger" msgstr "suppress_redundant_updates_trigger: 트리거로 호출ë˜ì–´ì•¼ 함" -#: utils/adt/trigfuncs.c:48 +#: utils/adt/trigfuncs.c:47 #, c-format msgid "suppress_redundant_updates_trigger: must be called on update" msgstr "suppress_redundant_updates_trigger: ì—…ë°ì´íЏ 시 호출ë˜ì–´ì•¼ 함" -#: utils/adt/trigfuncs.c:54 +#: utils/adt/trigfuncs.c:53 #, c-format msgid "suppress_redundant_updates_trigger: must be called before update" msgstr "suppress_redundant_updates_trigger: ì—…ë°ì´íЏ ì „ì— í˜¸ì¶œë˜ì–´ì•¼ 함" -#: utils/adt/trigfuncs.c:60 +#: utils/adt/trigfuncs.c:59 #, c-format msgid "suppress_redundant_updates_trigger: must be called for each row" msgstr "suppress_redundant_updates_trigger: ê° í–‰ì— ëŒ€í•´ 호출ë˜ì–´ì•¼ 함" -#: utils/adt/tsgistidx.c:92 -#, c-format -msgid "gtsvector_in not implemented" -msgstr "gtsvector_inì´ êµ¬í˜„ë˜ì–´ 있지 않ìŒ" - -#: utils/adt/tsquery.c:200 +#: utils/adt/tsquery.c:210 utils/adt/tsquery_op.c:125 #, c-format -msgid "distance in phrase operator should not be greater than %d" +msgid "" +"distance in phrase operator must be an integer value between zero and %d " +"inclusive" msgstr "ë¶„ì„ ìž‘ì—…ì—서 사용한 ê±°ë¦¬ê°’ì€ %d 보다 í´ ìˆ˜ 없습니다" -#: utils/adt/tsquery.c:310 utils/adt/tsquery.c:725 -#: utils/adt/tsvector_parser.c:133 -#, c-format -msgid "syntax error in tsquery: \"%s\"" -msgstr "tsqueryì— êµ¬ë¬¸ 오류가 있ìŒ: \"%s\"" - -#: utils/adt/tsquery.c:334 +#: utils/adt/tsquery.c:344 #, c-format msgid "no operand in tsquery: \"%s\"" msgstr "tsqueryì— í”¼ì—°ì‚°ìžê°€ ì—†ìŒ: \"%s\"" -#: utils/adt/tsquery.c:568 +#: utils/adt/tsquery.c:554 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "tsqueryì˜ ê°’ì´ ë„ˆë¬´ í¼: \"%s\"" -#: utils/adt/tsquery.c:573 +#: utils/adt/tsquery.c:559 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "tsqueryì˜ í”¼ì—°ì‚°ìžê°€ 너무 긺: \"%s\"" -#: utils/adt/tsquery.c:601 +#: utils/adt/tsquery.c:587 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "tsqueryì˜ ë‹¨ì–´ê°€ 너무 긺: \"%s\"" -#: utils/adt/tsquery.c:870 +#: utils/adt/tsquery.c:713 utils/adt/tsvector_parser.c:147 +#, c-format +msgid "syntax error in tsquery: \"%s\"" +msgstr "tsqueryì— êµ¬ë¬¸ 오류가 있ìŒ: \"%s\"" + +#: utils/adt/tsquery.c:879 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" msgstr "í…스트 검색 ì¿¼ë¦¬ì— ì–´íœ˜ì†Œê°€ í¬í•¨ë˜ì–´ 있지 않ìŒ: \"%s\"" -#: utils/adt/tsquery.c:881 utils/adt/tsquery_util.c:375 +#: utils/adt/tsquery.c:890 utils/adt/tsquery_util.c:376 #, c-format msgid "tsquery is too large" msgstr "tsquery 길ì´ê°€ 너무 ê¹ë‹ˆë‹¤" -#: utils/adt/tsquery_cleanup.c:407 +#: utils/adt/tsquery_cleanup.c:409 #, c-format msgid "" "text-search query contains only stop words or doesn't contain lexemes, " @@ -24877,11 +29000,6 @@ msgstr "" "í…스트 검색 ì¿¼ë¦¬ì— ì¤‘ì§€ 단어만 í¬í•¨ë˜ì–´ 있거나 어휘소가 í¬í•¨ë˜ì–´ 있지 않ìŒ, " "무시ë¨" -#: utils/adt/tsquery_op.c:124 -#, c-format -msgid "distance in phrase operator should be non-negative and less than %d" -msgstr "ë¶„ì„ ìž‘ì—…ì—서 사용한 ê±°ë¦¬ê°’ì€ %d 보다 작고 양수값만 사용할 수 있습니다" - #: utils/adt/tsquery_rewrite.c:321 #, c-format msgid "ts_rewrite query must return two tsquery columns" @@ -24902,365 +29020,364 @@ msgstr "가중치 ë°°ì—´ì´ ë„ˆë¬´ ì§§ìŒ" msgid "array of weight must not contain nulls" msgstr "가중치 ë°°ì—´ì—는 nullì´ í¬í•¨ë˜ì§€ 않아야 함" -#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:872 +#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:871 #, c-format msgid "weight out of range" msgstr "가중치가 범위를 벗어남" -#: utils/adt/tsvector.c:215 +#: utils/adt/tsvector.c:216 #, c-format msgid "word is too long (%ld bytes, max %ld bytes)" msgstr "단어가 너무 긺(%ldë°”ì´íЏ, 최대 %ldë°”ì´íЏ)" -#: utils/adt/tsvector.c:222 +#: utils/adt/tsvector.c:223 #, c-format msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "" "문ìžì—´ì´ 너무 길어서 tsvectorì— ì‚¬ìš©í•  수 ì—†ìŒ(%ldë°”ì´íЏ, 최대 %ldë°”ì´íЏ)" -#: utils/adt/tsvector_op.c:328 utils/adt/tsvector_op.c:608 -#: utils/adt/tsvector_op.c:770 +#: utils/adt/tsvector_op.c:771 #, c-format msgid "lexeme array may not contain nulls" msgstr "어휘소 ë°°ì—´ì—는 nullì´ í¬í•¨ë˜ì§€ 않아야 함" -#: utils/adt/tsvector_op.c:840 +#: utils/adt/tsvector_op.c:776 +#, c-format +msgid "lexeme array may not contain empty strings" +msgstr "어휘소 ë°°ì—´ì—는 빈문ìžì—´ì´ í¬í•¨ë˜ì§€ 않아야 함" + +#: utils/adt/tsvector_op.c:845 #, c-format msgid "weight array may not contain nulls" msgstr "가중치 ë°°ì—´ì—는 nullì´ í¬í•¨ë˜ì§€ 않아야 함" -#: utils/adt/tsvector_op.c:864 +#: utils/adt/tsvector_op.c:869 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "알 수 없는 가중치: \"%c\"" -#: utils/adt/tsvector_op.c:2414 +#: utils/adt/tsvector_op.c:2599 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "ts_stat 쿼리는 í•˜ë‚˜ì˜ tsvector ì¹¼ëŸ¼ì„ ë°˜í™˜í•´ì•¼ 함" -#: utils/adt/tsvector_op.c:2603 +#: utils/adt/tsvector_op.c:2788 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "\"%s\" tsvector ì¹¼ëŸ¼ì´ ì—†ìŒ" -#: utils/adt/tsvector_op.c:2610 +#: utils/adt/tsvector_op.c:2795 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "\"%s\" ì¹¼ëŸ¼ì€ tsvector 형ì‹ì´ 아님" -#: utils/adt/tsvector_op.c:2622 +#: utils/adt/tsvector_op.c:2807 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "\"%s\" 구성 ì¹¼ëŸ¼ì´ ì—†ìŒ" -#: utils/adt/tsvector_op.c:2628 +#: utils/adt/tsvector_op.c:2813 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "\"%s\" ì¹¼ëŸ¼ì€ regconfig í˜•ì´ ì•„ë‹˜" -#: utils/adt/tsvector_op.c:2635 +#: utils/adt/tsvector_op.c:2820 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "\"%s\" 구성 ì¹¼ëŸ¼ì€ nullì´ ì•„ë‹ˆì–´ì•¼ 함" -#: utils/adt/tsvector_op.c:2648 +#: utils/adt/tsvector_op.c:2833 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "\"%s\" í…스트 검색 구성 ì´ë¦„ì´ ìŠ¤í‚¤ë§ˆë¡œ 한정ë˜ì–´ì•¼ 함" -#: utils/adt/tsvector_op.c:2673 +#: utils/adt/tsvector_op.c:2858 #, c-format msgid "column \"%s\" is not of a character type" msgstr "\"%s\" ì¹¼ëŸ¼ì€ ë¬¸ìží˜•ì´ ì•„ë‹˜" -#: utils/adt/tsvector_parser.c:134 +#: utils/adt/tsvector_parser.c:148 #, c-format msgid "syntax error in tsvector: \"%s\"" msgstr "tsvectorì— êµ¬ë¬¸ 오류가 있ìŒ: \"%s\"" -#: utils/adt/tsvector_parser.c:200 +#: utils/adt/tsvector_parser.c:221 #, c-format msgid "there is no escaped character: \"%s\"" msgstr "ì´ìŠ¤ì¼€ì´í”„ 문ìžê°€ ì—†ìŒ: \"%s\"" -#: utils/adt/tsvector_parser.c:318 +#: utils/adt/tsvector_parser.c:339 #, c-format msgid "wrong position info in tsvector: \"%s\"" msgstr "tsvectorì— ìž˜ëª»ëœ ìœ„ì¹˜ ì •ë³´ê°€ 있ìŒ: \"%s\"" -#: utils/adt/uuid.c:428 +#: utils/adt/uuid.c:418 #, c-format msgid "could not generate random values" msgstr "무작위 ê°’ ìƒì„± 실패" -#: utils/adt/varbit.c:109 utils/adt/varchar.c:53 +#: utils/adt/varbit.c:110 utils/adt/varchar.c:53 #, c-format msgid "length for type %s must be at least 1" -msgstr "%s ìžë£Œí˜•ì˜ ê¸¸ì´ëŠ” 최소 1 ì´ìƒì´ì–´ì•¼í•©ë‹ˆë‹¤" +msgstr "%s ìžë£Œí˜•ì˜ ê¸¸ì´ëŠ” 최소 1 ì´ìƒì´ì–´ì•¼ 합니다" -#: utils/adt/varbit.c:114 utils/adt/varchar.c:57 +#: utils/adt/varbit.c:115 utils/adt/varchar.c:57 #, c-format msgid "length for type %s cannot exceed %d" -msgstr "%s ìžë£Œí˜•ì˜ ê¸¸ì´ëŠ” 최대 %d ì´í•˜ì—¬ì•¼í•©ë‹ˆë‹¤" +msgstr "%s ìžë£Œí˜•ì˜ ê¸¸ì´ëŠ” 최대 %d ì´í•˜ì—¬ì•¼ 합니다" -#: utils/adt/varbit.c:197 utils/adt/varbit.c:498 utils/adt/varbit.c:993 +#: utils/adt/varbit.c:198 utils/adt/varbit.c:499 utils/adt/varbit.c:994 #, c-format msgid "bit string length exceeds the maximum allowed (%d)" msgstr "비트 문ìžì—´ 길ì´ê°€ 최대치 (%d)를 초과했습니다" -#: utils/adt/varbit.c:211 utils/adt/varbit.c:355 utils/adt/varbit.c:405 +#: utils/adt/varbit.c:212 utils/adt/varbit.c:356 utils/adt/varbit.c:406 #, c-format msgid "bit string length %d does not match type bit(%d)" msgstr "" "길ì´ê°€ %dì¸ ë¹„íŠ¸ 문ìžì—´ ìžë£ŒëŠ” bit(%d) ìžë£Œí˜•ì˜ ê¸¸ì´ì™€ ì¼ì¹˜í•˜ì§€ 않습니다" -#: utils/adt/varbit.c:233 utils/adt/varbit.c:534 +#: utils/adt/varbit.c:234 utils/adt/varbit.c:535 #, c-format -msgid "\"%c\" is not a valid binary digit" -msgstr "\"%c\" 문ìžëŠ” 2진수 문ìžê°€ 아닙니다" +msgid "\"%.*s\" is not a valid binary digit" +msgstr "\"%.*s\" 문ìžëŠ” 2진수 문ìžê°€ 아닙니다" -#: utils/adt/varbit.c:258 utils/adt/varbit.c:559 +#: utils/adt/varbit.c:259 utils/adt/varbit.c:560 #, c-format -msgid "\"%c\" is not a valid hexadecimal digit" -msgstr "\"%c\" 문ìžëŠ” 16진수 문ìžê°€ 아닙니다" +msgid "\"%.*s\" is not a valid hexadecimal digit" +msgstr "\"%.*s\" 문ìžëŠ” 16진수 문ìžê°€ 아닙니다" -#: utils/adt/varbit.c:346 utils/adt/varbit.c:651 +#: utils/adt/varbit.c:347 utils/adt/varbit.c:652 #, c-format msgid "invalid length in external bit string" msgstr "외부 비트 문ìžì—´ì˜ 길ì´ê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤" -#: utils/adt/varbit.c:512 utils/adt/varbit.c:660 utils/adt/varbit.c:756 +#: utils/adt/varbit.c:513 utils/adt/varbit.c:661 utils/adt/varbit.c:757 #, c-format msgid "bit string too long for type bit varying(%d)" msgstr "비트 문ìžì—´ì´ 너무 ê¹ë‹ˆë‹¤(해당 ìžë£Œí˜• bit varying(%d))" -#: utils/adt/varbit.c:1086 utils/adt/varbit.c:1184 utils/adt/varlena.c:875 -#: utils/adt/varlena.c:939 utils/adt/varlena.c:1083 utils/adt/varlena.c:3306 -#: utils/adt/varlena.c:3373 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:911 +#: utils/adt/varlena.c:974 utils/adt/varlena.c:1131 utils/adt/varlena.c:3055 +#: utils/adt/varlena.c:3133 #, c-format msgid "negative substring length not allowed" msgstr "substringì—서 ìŒìˆ˜ 길ì´ëŠ” 허용하지 않ìŒ" -#: utils/adt/varbit.c:1241 +#: utils/adt/varbit.c:1261 #, c-format msgid "cannot AND bit strings of different sizes" msgstr "서로 í¬ê¸°ê°€ 틀린 비트 문ìžì—´ë¡œ AND ì—°ì‚°ì„ í•  수 없습니다." -#: utils/adt/varbit.c:1282 +#: utils/adt/varbit.c:1302 #, c-format msgid "cannot OR bit strings of different sizes" msgstr "서로 í¬ê¸°ê°€ 틀린 비트 문ìžì—´ë¡œ OR ì—°ì‚°ì„ í•  수 없습니다." -#: utils/adt/varbit.c:1322 +#: utils/adt/varbit.c:1342 #, c-format msgid "cannot XOR bit strings of different sizes" msgstr "서로 í¬ê¸°ê°€ 틀린 비트 문ìžì—´ì€ XOR ì—°ì‚°ì„ í•  수 없습니다." -#: utils/adt/varbit.c:1804 utils/adt/varbit.c:1862 +#: utils/adt/varbit.c:1824 utils/adt/varbit.c:1882 #, c-format msgid "bit index %d out of valid range (0..%d)" msgstr "비트 %d ì¸ë±ìŠ¤ì˜ ë²”ìœ„ë¥¼ 벗어남 (0..%d)" -#: utils/adt/varbit.c:1813 utils/adt/varlena.c:3566 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3337 #, c-format msgid "new bit must be 0 or 1" -msgstr "새 ë¹„íŠ¸ê°’ì€ 0 ë˜ëŠ” 1 ì´ì–´ì•¼í•©ë‹ˆë‹¤" - -#: utils/adt/varchar.c:157 utils/adt/varchar.c:310 -#, c-format -msgid "value too long for type character(%d)" -msgstr "character(%d) ìžë£Œí˜•ì— ë„ˆë¬´ 긴 ìžë£Œë¥¼ 담으려고 합니다." - -#: utils/adt/varchar.c:472 utils/adt/varchar.c:634 -#, c-format -msgid "value too long for type character varying(%d)" -msgstr "character varying(%d) ìžë£Œí˜•ì— ë„ˆë¬´ 긴 ìžë£Œë¥¼ 담으려고 합니다." - -#: utils/adt/varchar.c:732 utils/adt/varlena.c:1475 -#, c-format -msgid "could not determine which collation to use for string comparison" -msgstr "문ìžì—´ ë¹„êµ ìž‘ì—…ì— ì‚¬ìš©í•  정렬규칙(collation)ì„ ê²°ì •í•  수 ì—†ìŒ" - -#: utils/adt/varlena.c:1182 utils/adt/varlena.c:1915 -#, c-format -msgid "nondeterministic collations are not supported for substring searches" -msgstr "문ìžì—´ 검색 ìž‘ì—…ì— ì‚¬ìš©í•  비결정 정렬규칙(collation)ì„ ì§€ì›í•˜ì§€ 않ìŒ" +msgstr "새 ë¹„íŠ¸ê°’ì€ 0 ë˜ëŠ” 1 ì´ì–´ì•¼ 합니다" -#: utils/adt/varlena.c:1574 utils/adt/varlena.c:1587 +#: utils/adt/varchar.c:161 utils/adt/varchar.c:312 #, c-format -msgid "could not convert string to UTF-16: error code %lu" -msgstr "UTF-16 ì¸ì½”딩으로 문ìžì—´ì„ 변환할 수 ì—†ìŒ: 오류번호 %lu" +msgid "value too long for type character(%d)" +msgstr "character(%d) ìžë£Œí˜•ì— ë„ˆë¬´ 긴 ìžë£Œë¥¼ 담으려고 합니다." -#: utils/adt/varlena.c:1602 +#: utils/adt/varchar.c:475 utils/adt/varchar.c:639 #, c-format -msgid "could not compare Unicode strings: %m" -msgstr "유니코드 문ìžì—´ ë¹„êµ ì‹¤íŒ¨: %m" +msgid "value too long for type character varying(%d)" +msgstr "character varying(%d) ìžë£Œí˜•ì— ë„ˆë¬´ 긴 ìžë£Œë¥¼ 담으려고 합니다." -#: utils/adt/varlena.c:1653 utils/adt/varlena.c:2367 +#: utils/adt/varchar.c:737 utils/adt/varlena.c:1520 #, c-format -msgid "collation failed: %s" -msgstr "문ìžì—´ ì •ë ¬: %s" +msgid "could not determine which collation to use for string comparison" +msgstr "문ìžì—´ ë¹„êµ ìž‘ì—…ì— ì‚¬ìš©í•  정렬규칙(collation)ì„ ê²°ì •í•  수 ì—†ìŒ" -#: utils/adt/varlena.c:2575 +#: utils/adt/varlena.c:1230 utils/adt/varlena.c:1809 #, c-format -msgid "sort key generation failed: %s" -msgstr "ì •ë ¬ 키 ìƒì„± 실패: %s" +msgid "nondeterministic collations are not supported for substring searches" +msgstr "문ìžì—´ 검색 ìž‘ì—…ì— ì‚¬ìš©í•  비결정 정렬규칙(collation)ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: utils/adt/varlena.c:3450 utils/adt/varlena.c:3517 +#: utils/adt/varlena.c:3221 utils/adt/varlena.c:3288 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "%d ì¸ë±ìŠ¤ì˜ ë²”ìœ„ë¥¼ 벗어남, 0..%d" -#: utils/adt/varlena.c:3481 utils/adt/varlena.c:3553 +#: utils/adt/varlena.c:3252 utils/adt/varlena.c:3324 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "%lld ì¸ë±ìŠ¤ì˜ ë²”ìœ„ë¥¼ 벗어남, 0..%lld" -#: utils/adt/varlena.c:4590 +#: utils/adt/varlena.c:4385 #, c-format -msgid "field position must be greater than zero" -msgstr "필드 위치 ê°’ì€ 0 보다 커야합니다" +msgid "field position must not be zero" +msgstr "필드 위치 ê°’ì€ 0 ì´ ì•„ë‹ˆì—¬ì•¼ 함" -#: utils/adt/varlena.c:5456 +#: utils/adt/varlena.c:5630 #, c-format msgid "unterminated format() type specifier" msgstr "마무리 ì•ˆëœ format() 형 ì‹ë³„ìž" -#: utils/adt/varlena.c:5457 utils/adt/varlena.c:5591 utils/adt/varlena.c:5712 +#: utils/adt/varlena.c:5631 utils/adt/varlena.c:5765 utils/adt/varlena.c:5886 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "í•˜ë‚˜ì˜ \"%%\" 문ìžë¥¼ 표시하려면, \"%%%%\" 형태로 사용하세요" -#: utils/adt/varlena.c:5589 utils/adt/varlena.c:5710 +#: utils/adt/varlena.c:5763 utils/adt/varlena.c:5884 #, c-format -msgid "unrecognized format() type specifier \"%c\"" -msgstr "ì¸ì‹í•  수 없는 format() 형 ì‹ë³„ìž \"%c\"" +msgid "unrecognized format() type specifier \"%.*s\"" +msgstr "ì¸ì‹í•  수 없는 format() 형 ì‹ë³„ìž \"%.*s\"" -#: utils/adt/varlena.c:5602 utils/adt/varlena.c:5659 +#: utils/adt/varlena.c:5776 utils/adt/varlena.c:5833 #, c-format msgid "too few arguments for format()" msgstr "format() ìž‘ì—…ì„ ìœ„í•œ ì¸ìžê°€ 너무 ì ìŒ" -#: utils/adt/varlena.c:5755 utils/adt/varlena.c:5937 +#: utils/adt/varlena.c:5929 utils/adt/varlena.c:6111 #, c-format msgid "number is out of range" msgstr "수치 범위를 벗어남" -#: utils/adt/varlena.c:5818 utils/adt/varlena.c:5846 +#: utils/adt/varlena.c:5992 utils/adt/varlena.c:6020 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "" "format 함수ì—서 사용할 수 있는 ì¸ìž 위치 번호는 0ì´ ì•„ë‹ˆë¼, 1부터 시작합니다" -#: utils/adt/varlena.c:5839 +#: utils/adt/varlena.c:6013 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "ë„“ì´ ì¸ìž ìœ„ì¹˜ê°’ì€ \"$\" 문ìžë¡œ ë나야 합니다" -#: utils/adt/varlena.c:5884 +#: utils/adt/varlena.c:6058 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "null ê°’ì€ SQL ì‹ë³„ìžë¡œ í¬ë©§ë  수 ì—†ìŒ" -#: utils/adt/varlena.c:6010 +#: utils/adt/varlena.c:6266 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "" +"유니코드 normalization ìž‘ì—…ì€ ì„œë²„ ì¸ì½”ë”©ì´ UTF8 ì¼ë•Œë§Œ í•  수 있습니다." -#: utils/adt/varlena.c:6023 +#: utils/adt/varlena.c:6279 #, c-format msgid "invalid normalization form: %s" msgstr "ìž˜ëª»ëœ normalization 형ì‹: %s" -#: utils/adt/windowfuncs.c:243 +#: utils/adt/varlena.c:6324 +#, c-format +msgid "Unicode categorization can only be performed if server encoding is UTF8" +msgstr "" +"유니코드 분류 ìž‘ì—…ì€ ì„œë²„ ì¸ì½”ë”©ì´ UTF8 ì¼ë•Œë§Œ í•  수 있습니다." + +#: utils/adt/varlena.c:6541 utils/adt/varlena.c:6576 utils/adt/varlena.c:6611 +#, c-format +msgid "invalid Unicode code point: %04X" +msgstr "ìž˜ëª»ëœ ìœ ë‹ˆì½”ë“œ 코드 í¬ì¸íЏ: %04X" + +#: utils/adt/varlena.c:6641 +#, c-format +msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." +msgstr "" +"유니코드 ì´ìŠ¤ì¼€ì´í”„는 \\XXXX, \\+XXXXXX, \\uXXXX, ë˜ëŠ” \\UXXXXXXXX 형태여야 " +"합니다." + +#: utils/adt/windowfuncs.c:443 #, c-format msgid "argument of ntile must be greater than zero" msgstr "ntileì˜ ì¸ìžëŠ” 0보다 커야 함" -#: utils/adt/windowfuncs.c:465 +#: utils/adt/windowfuncs.c:707 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "nth_valueì˜ ì¸ìžëŠ” 0보다 커야 함" -#: utils/adt/xid8funcs.c:116 +#: utils/adt/xid8funcs.c:124 #, c-format -msgid "transaction ID %s is in the future" -msgstr "%s 트랜잭션 ID는 ë¯¸ëž˜ì˜ ê²ƒìž…ë‹ˆë‹¤" +msgid "transaction ID %llu is in the future" +msgstr "%llu 트랜잭션 ID는 ë¯¸ëž˜ì˜ ê²ƒìž…ë‹ˆë‹¤" -#: utils/adt/xid8funcs.c:547 +#: utils/adt/xid8funcs.c:553 #, c-format msgid "invalid external pg_snapshot data" msgstr "외부 pg_snapshot ìžë£Œê°€ 잘못ë¨" -#: utils/adt/xml.c:222 +#: utils/adt/xml.c:238 #, c-format msgid "unsupported XML feature" msgstr "ì§€ì›ë˜ì§€ 않는 XML 기능" -#: utils/adt/xml.c:223 +#: utils/adt/xml.c:239 #, c-format msgid "This functionality requires the server to be built with libxml support." msgstr "ì´ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë ¤ë©´ libxml ì§€ì›ìœ¼ë¡œ 서버를 빌드해야 합니다." -#: utils/adt/xml.c:224 -#, c-format -msgid "You need to rebuild PostgreSQL using --with-libxml." -msgstr "--with-libxmlì„ ì‚¬ìš©í•˜ì—¬ PostgreSQLì„ ë‹¤ì‹œ 빌드해야 합니다." - -#: utils/adt/xml.c:243 utils/mb/mbutils.c:570 +#: utils/adt/xml.c:258 utils/mb/mbutils.c:627 #, c-format msgid "invalid encoding name \"%s\"" msgstr "\"%s\" ì¸ì½”딩 ì´ë¦„ì´ ìž˜ëª»ë¨" -#: utils/adt/xml.c:486 utils/adt/xml.c:491 +#: utils/adt/xml.c:506 utils/adt/xml.c:511 #, c-format msgid "invalid XML comment" msgstr "ìž˜ëª»ëœ XML 주ì„" -#: utils/adt/xml.c:620 +#: utils/adt/xml.c:697 #, c-format msgid "not an XML document" msgstr "XML 문서가 아님" -#: utils/adt/xml.c:779 utils/adt/xml.c:802 +#: utils/adt/xml.c:1008 utils/adt/xml.c:1031 #, c-format msgid "invalid XML processing instruction" msgstr "ìž˜ëª»ëœ XML 처리 명령" -#: utils/adt/xml.c:780 +#: utils/adt/xml.c:1009 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "XML 처리 명령 ëŒ€ìƒ ì´ë¦„ì€ \"%s\"ì¼ ìˆ˜ 없습니다." -#: utils/adt/xml.c:803 +#: utils/adt/xml.c:1032 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML 처리 명령ì—는 \"?>\"를 í¬í•¨í•  수 없습니다." -#: utils/adt/xml.c:882 +#: utils/adt/xml.c:1111 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidateê°€ 구현ë˜ì–´ 있지 않ìŒ" -#: utils/adt/xml.c:961 +#: utils/adt/xml.c:1167 #, c-format msgid "could not initialize XML library" msgstr "XML ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 초기화할 수 ì—†ìŒ" -#: utils/adt/xml.c:962 +#: utils/adt/xml.c:1168 #, c-format msgid "" -"libxml2 has incompatible char type: sizeof(char)=%u, sizeof(xmlChar)=%u." +"libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." msgstr "" -"libxml2ì— í˜¸í™˜ë˜ì§€ 않는 ë¬¸ìž ìžë£Œí˜• 있ìŒ: sizeof(char)=%u, sizeof(xmlChar)=%u" +"libxml2ì— í˜¸í™˜ë˜ì§€ 않는 ë¬¸ìž ìžë£Œí˜• 있ìŒ: sizeof(char)=%zu, " +"sizeof(xmlChar)=%zu" -#: utils/adt/xml.c:1048 +#: utils/adt/xml.c:1254 #, c-format msgid "could not set up XML error handler" msgstr "XML 오류 핸들러를 설정할 수 ì—†ìŒ" -#: utils/adt/xml.c:1049 +#: utils/adt/xml.c:1255 #, c-format msgid "" "This probably indicates that the version of libxml2 being used is not " @@ -25269,121 +29386,126 @@ msgstr "" "ì´ ë¬¸ì œëŠ” PostgreSQL 서버를 만들 때 사용한 libxml2 í—¤ë” íŒŒì¼ì´ í˜¸í™˜ì„±ì´ ì—†ëŠ” " "것 같습니다." -#: utils/adt/xml.c:1936 +#: utils/adt/xml.c:2281 msgid "Invalid character value." msgstr "ìž˜ëª»ëœ ë¬¸ìž ê°’ìž…ë‹ˆë‹¤." -#: utils/adt/xml.c:1939 +#: utils/adt/xml.c:2284 msgid "Space required." msgstr "ê³µê°„ì´ í•„ìš”í•©ë‹ˆë‹¤." -#: utils/adt/xml.c:1942 +#: utils/adt/xml.c:2287 msgid "standalone accepts only 'yes' or 'no'." msgstr "ë…립 ì‹¤í–‰í˜•ì€ 'yes' ë˜ëŠ” 'no'ë§Œ 허용합니다." -#: utils/adt/xml.c:1945 +#: utils/adt/xml.c:2290 msgid "Malformed declaration: missing version." msgstr "ì„ ì–¸ 형ì‹ì´ 잘못ë¨: ë²„ì „ì´ ëˆ„ë½ë˜ì—ˆìŠµë‹ˆë‹¤." -#: utils/adt/xml.c:1948 +#: utils/adt/xml.c:2293 msgid "Missing encoding in text declaration." msgstr "í…스트 ì„ ì–¸ì—서 ì¸ì½”ë”©ì´ ëˆ„ë½ë˜ì—ˆìŠµë‹ˆë‹¤." -#: utils/adt/xml.c:1951 +#: utils/adt/xml.c:2296 msgid "Parsing XML declaration: '?>' expected." msgstr "XML ì„ ì–¸ 구문 ë¶„ì„ ì¤‘: '?>'ê°€ 필요합니다." -#: utils/adt/xml.c:1954 +#: utils/adt/xml.c:2299 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "ì¸ì‹í•  수 없는 libxml 오류 코드: %d." -#: utils/adt/xml.c:2211 +#: utils/adt/xml.c:2553 #, c-format msgid "XML does not support infinite date values." msgstr "XMLì€ ë¬´í•œ ë‚ ì§œ ê°’ì„ ì§€ì›í•˜ì§€ 않습니다." -#: utils/adt/xml.c:2233 utils/adt/xml.c:2260 +#: utils/adt/xml.c:2575 utils/adt/xml.c:2602 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XMLì€ ë¬´í•œ 타임스탬프 ê°’ì„ ì§€ì›í•˜ì§€ 않습니다." -#: utils/adt/xml.c:2676 +#: utils/adt/xml.c:3018 #, c-format msgid "invalid query" msgstr "ìž˜ëª»ëœ ì¿¼ë¦¬" -#: utils/adt/xml.c:4016 +#: utils/adt/xml.c:3110 +#, c-format +msgid "portal \"%s\" does not return tuples" +msgstr "\"%s\" í¬í„¸ì€ ì§‘í•©ì„ ë°˜í™˜í•  수 없습니다." + +#: utils/adt/xml.c:4362 #, c-format msgid "invalid array for XML namespace mapping" msgstr "XML 네임스페ì´ìФ ë§¤í•‘ì— ì‚¬ìš©í•  ë°°ì—´ì´ ìž˜ëª»ë¨" -#: utils/adt/xml.c:4017 +#: utils/adt/xml.c:4363 #, c-format msgid "" "The array must be two-dimensional with length of the second axis equal to 2." msgstr "" "ì´ ë°°ì—´ì€ key, value로 êµ¬ì„±ëœ ë°°ì—´ì„ ìš”ì†Œë¡œ 하는 2ì°¨ì› ë°°ì—´ì´ì–´ì•¼ 합니다." -#: utils/adt/xml.c:4041 +#: utils/adt/xml.c:4387 #, c-format msgid "empty XPath expression" msgstr "XPath ì‹ì´ 비어 있ìŒ" -#: utils/adt/xml.c:4093 +#: utils/adt/xml.c:4439 #, c-format msgid "neither namespace name nor URI may be null" msgstr "네임스페ì´ìФ ì´ë¦„ ë° URI는 nullì¼ ìˆ˜ ì—†ìŒ" -#: utils/adt/xml.c:4100 +#: utils/adt/xml.c:4446 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "" "ì´ë¦„ \"%s\" ë° URI \"%s\"ì„(를) 사용하여 XML 네임스페ì´ìŠ¤ë¥¼ 등ë¡í•  수 ì—†ìŒ" -#: utils/adt/xml.c:4451 +#: utils/adt/xml.c:4795 #, c-format msgid "DEFAULT namespace is not supported" msgstr "DEFAULT 네임스페ì´ìŠ¤ëŠ” ì§€ì›í•˜ì§€ 않습니다." -#: utils/adt/xml.c:4480 +#: utils/adt/xml.c:4824 #, c-format msgid "row path filter must not be empty string" msgstr "로우 경로 필터는 비어있으면 안ë©ë‹ˆë‹¤" -#: utils/adt/xml.c:4511 +#: utils/adt/xml.c:4858 #, c-format msgid "column path filter must not be empty string" msgstr "칼럼 경로 필터는 비어있으면 안ë©ë‹ˆë‹¤" -#: utils/adt/xml.c:4661 +#: utils/adt/xml.c:5005 #, c-format msgid "more than one value returned by column XPath expression" msgstr "칼럼 XPath 표현ì‹ì— ì‚¬ìš©ëœ ê²°ê³¼ê°€ 하나 ì´ìƒì˜ ê°’ì„ ì‚¬ìš©í•©ë‹ˆë‹¤" -#: utils/cache/lsyscache.c:1015 +#: utils/cache/lsyscache.c:1017 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "%s 형ì—서 %s 형으로 바꾸는 형변환 규칙(cast)ê°€ ì—†ìŒ" # # nonun 부분 end -#: utils/cache/lsyscache.c:2764 utils/cache/lsyscache.c:2797 -#: utils/cache/lsyscache.c:2830 utils/cache/lsyscache.c:2863 +#: utils/cache/lsyscache.c:2887 utils/cache/lsyscache.c:2920 +#: utils/cache/lsyscache.c:2953 utils/cache/lsyscache.c:2986 #, c-format msgid "type %s is only a shell" msgstr "%s 형ì‹ì€ ì…¸ì¼ ë¿ìž„" -#: utils/cache/lsyscache.c:2769 +#: utils/cache/lsyscache.c:2892 #, c-format msgid "no input function available for type %s" msgstr "%s ìžë£Œí˜•ì„ ìœ„í•œ ìž…ë ¥ 함수가 없습니다" -#: utils/cache/lsyscache.c:2802 +#: utils/cache/lsyscache.c:2925 #, c-format msgid "no output function available for type %s" msgstr "%s ìžë£Œí˜•ì„ ìœ„í•œ 출력 함수가 없습니다" -#: utils/cache/partcache.c:215 +#: utils/cache/partcache.c:216 #, c-format msgid "" "operator class \"%s\" of access method %s is missing support function %d for " @@ -25392,152 +29514,166 @@ msgstr "" "\"%s\" ì—°ì‚°ìž í´ëž˜ìФ(ì ‘ê·¼ 방법: %s)ì—는 %d ê°œì˜ ì§€ì› ì§€ì› í•¨ìˆ˜(해당 ìžë£Œí˜• " "%s)ê°€ 빠졌습니다" -#: utils/cache/plancache.c:718 +#: utils/cache/plancache.c:747 #, c-format msgid "cached plan must not change result type" msgstr "ìºì‹œëœ 계íšì—서 ê²°ê³¼ 형ì‹ì„ 바꾸지 않아야 함" -#: utils/cache/relcache.c:6078 +#: utils/cache/relcache.c:3801 +#, c-format +msgid "heap relfilenumber value not set when in binary upgrade mode" +msgstr "ì´ì§„ 업그레ì´ë“œ 작업 때, íž™ relfilenumber ê°’ì´ ì§€ì •ë˜ì§€ 않았습니다" + +#: utils/cache/relcache.c:3809 +#, c-format +msgid "unexpected request for new relfilenumber in binary upgrade mode" +msgstr "ë°”ì´ë„ˆë¦¬ 업그레ì´ë“œ 모드 ì¤‘ì— ìƒˆ relfilenumber ê°’ ìš”ì²­ì´ ì‹¤íŒ¨" + +#: utils/cache/relcache.c:6539 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "\"%s\" 릴레ì´ì…˜-ìºì‹œ 초기화 파ì¼ì„ 만들 수 ì—†ìŒ: %m" -#: utils/cache/relcache.c:6080 +#: utils/cache/relcache.c:6541 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "어쨌든 계ì†í•˜ëŠ”ë°, 뭔가 잘못 ëœ ê²ƒì´ ìžˆìŠµë‹ˆë‹¤." -#: utils/cache/relcache.c:6402 +#: utils/cache/relcache.c:6871 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "\"%s\" ìºì‰¬ 파ì¼ì„ 삭제할 수 ì—†ìŒ: %m" -#: utils/cache/relmapper.c:531 +#: utils/cache/relmapper.c:596 #, c-format msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "릴레ì´ì…˜ ë§µí•‘ì„ ë³€ê²½í•˜ëŠ” íŠ¸ëžœìž­ì…œì„ PREPAREí•  수 ì—†ìŒ" -#: utils/cache/relmapper.c:761 +#: utils/cache/relmapper.c:852 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "\"%s\" 릴레ì´ì…˜ 맵핑 파ì¼ì— ìž˜ëª»ëœ ë°ì´í„°ê°€ 있습니다" -#: utils/cache/relmapper.c:771 +#: utils/cache/relmapper.c:862 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "\"%s\" 릴레ì´ì…˜ 맵핑 파ì¼ì— ìž˜ëª»ëœ checksum ê°’ì´ ìžˆìŒ" -#: utils/cache/typcache.c:1692 utils/fmgr/funcapi.c:461 +#: utils/cache/typcache.c:1812 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "레코드 형ì‹ì´ 등ë¡ë˜ì§€ 않았ìŒ" #: utils/error/assert.c:37 #, c-format -msgid "TRAP: ExceptionalCondition: bad arguments\n" -msgstr "TRAP: ExceptionalCondition: ìž˜ëª»ëœ ì¸ìž\n" +msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" +msgstr "TRAP: ExceptionalCondition: %d PID ì•ˆì— ìž˜ëª»ëœ ì¸ìž\n" #: utils/error/assert.c:40 #, c-format -msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d)\n" -msgstr "TRAP: %s(\"%s\", 파ì¼: \"%s\", 줄: %d)\n" +msgid "TRAP: failed Assert(\"%s\"), File: \"%s\", Line: %d, PID: %d\n" +msgstr "TRAP: Assert 실패(\"%s\"), 파ì¼: \"%s\", 줄: %d, PID: %d\n" -#: utils/error/elog.c:322 +#: utils/error/elog.c:415 #, c-format msgid "error occurred before error message processing is available\n" msgstr "오류 메시지 처리가 활성화 ë˜ê¸° ì „ì— ì˜¤ë¥˜ê°€ ë°œìƒí–ˆìŠµë‹ˆë‹¤\n" -#: utils/error/elog.c:1868 +#: utils/error/elog.c:2134 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "stderr 로 사용하기 위해 \"%s\" íŒŒì¼ ë‹¤ì‹œ 열기 실패: %m" -#: utils/error/elog.c:1881 +#: utils/error/elog.c:2147 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" -msgstr "표준출력(stdout)으로 사용하기 위해 \"%s\" 파ì¼ì„ 여는 ë„중 실패: %m" +msgstr "표준출력(stdout)으로 사용하기 위해 \"%s\" íŒŒì¼ ë‹¤ì‹œ 열기 실패: %m" + +#: utils/error/elog.c:2183 +#, c-format +msgid "Invalid character" +msgstr "ìž˜ëª»ëœ ë¬¸ìž" -#: utils/error/elog.c:2373 utils/error/elog.c:2407 utils/error/elog.c:2423 +#: utils/error/elog.c:2889 utils/error/elog.c:2916 utils/error/elog.c:2932 msgid "[unknown]" msgstr "[알수없ìŒ]" -#: utils/error/elog.c:2893 utils/error/elog.c:3203 utils/error/elog.c:3311 +#: utils/error/elog.c:3202 utils/error/elog.c:3526 utils/error/elog.c:3633 msgid "missing error text" msgstr "오류 ë‚´ìš©ì„ ëºë‹ˆë‹¤" -#: utils/error/elog.c:2896 utils/error/elog.c:2899 utils/error/elog.c:3314 -#: utils/error/elog.c:3317 +#: utils/error/elog.c:3205 utils/error/elog.c:3208 #, c-format msgid " at character %d" msgstr " %d 번째 ë¬¸ìž ë¶€ê·¼" -#: utils/error/elog.c:2909 utils/error/elog.c:2916 +#: utils/error/elog.c:3218 utils/error/elog.c:3225 msgid "DETAIL: " msgstr "ìƒì„¸ì •ë³´: " -#: utils/error/elog.c:2923 +#: utils/error/elog.c:3232 msgid "HINT: " msgstr "힌트: " -#: utils/error/elog.c:2930 +#: utils/error/elog.c:3239 msgid "QUERY: " msgstr "쿼리:" -#: utils/error/elog.c:2937 +#: utils/error/elog.c:3246 msgid "CONTEXT: " msgstr "ë‚´ìš©: " -#: utils/error/elog.c:2947 +#: utils/error/elog.c:3256 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "위치: %s, %s:%d\n" -#: utils/error/elog.c:2954 +#: utils/error/elog.c:3263 #, c-format msgid "LOCATION: %s:%d\n" msgstr "위치: %s:%d\n" -#: utils/error/elog.c:2961 +#: utils/error/elog.c:3270 msgid "BACKTRACE: " -msgstr "" +msgstr "ì—­ì¶”ì : " -#: utils/error/elog.c:2975 +#: utils/error/elog.c:3282 msgid "STATEMENT: " msgstr "명령 구문: " -#: utils/error/elog.c:3364 +#: utils/error/elog.c:3678 msgid "DEBUG" msgstr "디버그" -#: utils/error/elog.c:3368 +#: utils/error/elog.c:3682 msgid "LOG" msgstr "로그" -#: utils/error/elog.c:3371 +#: utils/error/elog.c:3685 msgid "INFO" msgstr "ì •ë³´" -#: utils/error/elog.c:3374 +#: utils/error/elog.c:3688 msgid "NOTICE" msgstr "알림" -#: utils/error/elog.c:3377 +#: utils/error/elog.c:3692 msgid "WARNING" msgstr "경고" -#: utils/error/elog.c:3380 +#: utils/error/elog.c:3695 msgid "ERROR" msgstr "오류" -#: utils/error/elog.c:3383 +#: utils/error/elog.c:3698 msgid "FATAL" msgstr "치명ì ì˜¤ë¥˜" -#: utils/error/elog.c:3386 +#: utils/error/elog.c:3701 msgid "PANIC" msgstr "ì†ìƒ" -#: utils/fmgr/dfmgr.c:130 +#: utils/fmgr/dfmgr.c:128 #, c-format msgid "could not find function \"%s\" in file \"%s\"" msgstr "\"%s\" 함수를 \"%s\" 파ì¼ì—서 ì°¾ì„ ìˆ˜ ì—†ìŒ" @@ -25567,244 +29703,261 @@ msgstr "\"%s\" ë¼ì´ë¸ŒëŸ¬ë¦¬ëŠ” 사용할 수 없습니다: ë²„ì „ì´ í‹€ë¦¼" msgid "Server is version %d, library is version %s." msgstr "서버 버전 = %d, ë¼ì´ë¸ŒëŸ¬ë¦¬ 버전 %s." -#: utils/fmgr/dfmgr.c:346 +#: utils/fmgr/dfmgr.c:341 +#, c-format +msgid "incompatible library \"%s\": ABI mismatch" +msgstr "\"%s\" ë¼ì´ë¸ŒëŸ¬ë¦¬ëŠ” 호환ë˜ì§€ 않ìŒ: ABI 틀림" + +#: utils/fmgr/dfmgr.c:343 +#, c-format +msgid "Server has ABI \"%s\", library has \"%s\"." +msgstr "서버 ABI는 \"%s\", ë¼ì´ë¸ŒëŸ¬ë¦¬ ABI는 \"%s\"." + +#: utils/fmgr/dfmgr.c:361 #, c-format msgid "Server has FUNC_MAX_ARGS = %d, library has %d." msgstr "ì„œë²„ì˜ ê²½ìš° FUNC_MAX_ARGS = %dì¸ë° ë¼ì´ë¸ŒëŸ¬ë¦¬ì— %dì´(ê°€) 있습니다." -#: utils/fmgr/dfmgr.c:355 +#: utils/fmgr/dfmgr.c:370 #, c-format msgid "Server has INDEX_MAX_KEYS = %d, library has %d." msgstr "ì„œë²„ì˜ ê²½ìš° INDEX_MAX_KEYS = %dì¸ë° ë¼ì´ë¸ŒëŸ¬ë¦¬ì— %dì´(ê°€) 있습니다." -#: utils/fmgr/dfmgr.c:364 +#: utils/fmgr/dfmgr.c:379 #, c-format msgid "Server has NAMEDATALEN = %d, library has %d." msgstr "ì„œë²„ì˜ ê²½ìš° NAMEDATALEN = %dì¸ë° ë¼ì´ë¸ŒëŸ¬ë¦¬ì— %dì´(ê°€) 있습니다." -#: utils/fmgr/dfmgr.c:373 +#: utils/fmgr/dfmgr.c:388 #, c-format msgid "Server has FLOAT8PASSBYVAL = %s, library has %s." msgstr "ì„œë²„ì˜ ê²½ìš° FLOAT8PASSBYVAL = %sì¸ë° ë¼ì´ë¸ŒëŸ¬ë¦¬ì— %sì´(ê°€) 있습니다." -#: utils/fmgr/dfmgr.c:380 +#: utils/fmgr/dfmgr.c:395 msgid "Magic block has unexpected length or padding difference." msgstr "ë§¤ì§ ë¸”ë¡ì— 예기치 ì•Šì€ ê¸¸ì´ ë˜ëŠ” 여백 ì°¨ì´ê°€ 있습니다." -#: utils/fmgr/dfmgr.c:383 +#: utils/fmgr/dfmgr.c:398 #, c-format msgid "incompatible library \"%s\": magic block mismatch" msgstr "\"%s\" ë¼ì´ë¸ŒëŸ¬ë¦¬ëŠ” 사용할 수 없습니다: magic black 틀림" -#: utils/fmgr/dfmgr.c:547 +#: utils/fmgr/dfmgr.c:475 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "\"%s\" ë¼ì´ë¸ŒëŸ¬ë¦¬ ì‚¬ìš©ì´ ê¸ˆì§€ë˜ì–´ìžˆìŠµë‹ˆë‹¤" -#: utils/fmgr/dfmgr.c:573 +#: utils/fmgr/dfmgr.c:501 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "ë™ì  ë¼ì´ë¸ŒëŸ¬ë¦¬ 경로ì—서 ìž˜ëª»ëœ ë§¤í¬ë¡œ ì´ë¦„: %s" -#: utils/fmgr/dfmgr.c:613 +#: utils/fmgr/dfmgr.c:541 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "\"dynamic_library_path\" 매개 변수 값으로 길ì´ê°€ 0ì¸ ê°’ì„ ì‚¬ìš©í–ˆìŒ" -#: utils/fmgr/dfmgr.c:632 +#: utils/fmgr/dfmgr.c:560 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "\"dynamic_library_path\" 매개 변수 값으로 절대 경로를 사용할 수 ì—†ìŒ" -#: utils/fmgr/fmgr.c:238 +#: utils/fmgr/fmgr.c:236 #, c-format msgid "internal function \"%s\" is not in internal lookup table" msgstr "\"%s\" ë‚´ë¶€ 함수를 ë‚´ë¶€ 검색 í…Œì´ë¸”ì—서 ì°¾ì„ ìˆ˜ 없습니다" -#: utils/fmgr/fmgr.c:487 +#: utils/fmgr/fmgr.c:470 #, c-format msgid "could not find function information for function \"%s\"" msgstr "\"%s\" í•¨ìˆ˜ì˜ í•¨ìˆ˜ 정보를 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: utils/fmgr/fmgr.c:489 +#: utils/fmgr/fmgr.c:472 #, c-format msgid "" "SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname)." -msgstr "" +msgstr "SQL 호출 가능한 함수는 PG_FUNCTION_INFO_V1(함수명) ì •ì˜ë¥¼ 해야함" -#: utils/fmgr/fmgr.c:507 +#: utils/fmgr/fmgr.c:490 #, c-format msgid "unrecognized API version %d reported by info function \"%s\"" -msgstr "_^_ %d 알수 없는 API ë²„ì „ì´ \"%s\" í•¨ìˆ˜ì— ì˜í•´ì„œ ë³´ê³ ë˜ì—ˆìŒ" +msgstr "%d 알수 없는 API ë²„ì „ì´ \"%s\" í•¨ìˆ˜ì— ì˜í•´ì„œ ë³´ê³ ë˜ì—ˆìŒ" -#: utils/fmgr/fmgr.c:2003 +#: utils/fmgr/fmgr.c:2109 #, c-format msgid "operator class options info is absent in function call context" -msgstr "" +msgstr "ì—°ì‚°ìž í´ëž˜ìФ 옵션 ì •ë³´ê°€ 함수 호출 컨í…스트ì—서 빠졌ìŒ" -#: utils/fmgr/fmgr.c:2070 +#: utils/fmgr/fmgr.c:2176 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "" "%u OID 언어 유효성 검사 함수가 %u OID 프로시져 언어용으로 호출ë˜ì—ˆìŒ, ì›ëž˜ ì–¸" "어는 %u" -#: utils/fmgr/funcapi.c:384 +#: utils/fmgr/funcapi.c:496 #, c-format msgid "" "could not determine actual result type for function \"%s\" declared to " "return type %s" msgstr "\"%s\" í•¨ìˆ˜ì˜ ì‹¤ìž¬ 리턴 ìžë£Œí˜•ì„ ì•Œ 수 ì—†ìŒ, ì •ì˜ëœ 리턴 ìžë£Œí˜•: %s" -#: utils/fmgr/funcapi.c:1651 utils/fmgr/funcapi.c:1683 +#: utils/fmgr/funcapi.c:642 +#, c-format +msgid "argument declared %s does not contain a range type but type %s" +msgstr "%s 로 ì„ ì–¸ëœ ì¸ìžê°€ range ìžë£Œí˜•ì´ ì•„ë‹ˆê³ , %s ìžë£Œí˜•입니다" + +#: utils/fmgr/funcapi.c:1929 utils/fmgr/funcapi.c:1961 #, c-format msgid "number of aliases does not match number of columns" msgstr "alias 수가 ì—´ 수와 틀립니다" -#: utils/fmgr/funcapi.c:1677 +#: utils/fmgr/funcapi.c:1955 #, c-format msgid "no column alias was provided" msgstr "ì—´ ë³„ì¹­ì´ ì œê³µë˜ì§€ 않았ìŒ" -#: utils/fmgr/funcapi.c:1701 +#: utils/fmgr/funcapi.c:1979 #, c-format msgid "could not determine row description for function returning record" msgstr "레코드를 리턴하는 함수를 위한 í–‰(row) 구성 정보를 구할 수 ì—†ìŒ" -#: utils/init/miscinit.c:285 +#: utils/init/miscinit.c:353 #, c-format msgid "data directory \"%s\" does not exist" msgstr "\"%s\" ë°ì´í„° 디렉터리 ì—†ìŒ" -#: utils/init/miscinit.c:290 +#: utils/init/miscinit.c:358 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "\"%s\" 디렉터리 ì½ê¸° 권한 ì—†ìŒ: %m" -#: utils/init/miscinit.c:298 +#: utils/init/miscinit.c:366 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "지정한 \"%s\" ë°ì´í„° 디렉터리는 디렉터리가 아님" -#: utils/init/miscinit.c:314 +#: utils/init/miscinit.c:382 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "\"%s\" ë°ì´í„° 디렉터리 소유주가 잘못 ë˜ì—ˆìŠµë‹ˆë‹¤." -#: utils/init/miscinit.c:316 +#: utils/init/miscinit.c:384 #, c-format msgid "The server must be started by the user that owns the data directory." -msgstr "서버는 지정한 ë°ì´í„° ë””ë ‰í„°ë¦¬ì˜ ì†Œìœ ì£¼ 권한으로 시작ë˜ì–´ì•¼í•©ë‹ˆë‹¤." +msgstr "서버는 지정한 ë°ì´í„° ë””ë ‰í„°ë¦¬ì˜ ì†Œìœ ì£¼ 권한으로 시작ë˜ì–´ì•¼ 합니다." -#: utils/init/miscinit.c:334 +#: utils/init/miscinit.c:402 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "\"%s\" ë°ì´í„° 디렉터리 ì ‘ê·¼ ê¶Œí•œì— ë¬¸ì œê°€ 있습니다." -#: utils/init/miscinit.c:336 +#: utils/init/miscinit.c:404 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "액세스 ê¶Œí•œì€ u=rwx (0700) ë˜ëŠ” u=rwx,o=rx (0750) ê°’ì´ì–´ì•¼ 합니다." -#: utils/init/miscinit.c:615 utils/misc/guc.c:7139 +#: utils/init/miscinit.c:462 +#, c-format +msgid "could not change directory to \"%s\": %m" +msgstr "\"%s\" ì´ë¦„ì˜ ë””ë ‰í„°ë¦¬ë¡œ ì´ë™í•  수 없습니다: %m" + +#: utils/init/miscinit.c:720 utils/misc/guc.c:3650 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "보안 제한 작업 ë‚´ì—서 \"%s\" 매개 변수를 설정할 수 ì—†ìŒ" -#: utils/init/miscinit.c:683 +#: utils/init/miscinit.c:807 #, c-format msgid "role with OID %u does not exist" msgstr "%u OID ë¡¤ì´ ì—†ìŒ" -#: utils/init/miscinit.c:713 +#: utils/init/miscinit.c:853 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "\"%s\" ë¡¤ì€ ì ‘ì†ì„ 허용하지 않ìŒ" -#: utils/init/miscinit.c:731 +#: utils/init/miscinit.c:874 #, c-format msgid "too many connections for role \"%s\"" msgstr "\"%s\" ë¡¤ì˜ ìµœëŒ€ ë™ì‹œ ì ‘ì†ìˆ˜ë¥¼ 초과했습니다" -#: utils/init/miscinit.c:791 -#, c-format -msgid "permission denied to set session authorization" -msgstr "세션 ì¸ì¦ì„ 지정하기 위한 ê¶Œí•œì´ ì—†ìŒ" - -#: utils/init/miscinit.c:874 +#: utils/init/miscinit.c:1045 #, c-format msgid "invalid role OID: %u" msgstr "ìž˜ëª»ëœ ë¡¤ OID: %u" -#: utils/init/miscinit.c:928 +#: utils/init/miscinit.c:1192 #, c-format msgid "database system is shut down" msgstr "ë°ì´í„°ë² ì´ìФ 시스템 서비스를 중지했습니다" -#: utils/init/miscinit.c:1015 +#: utils/init/miscinit.c:1279 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "\"%s\" 잠금 파ì¼ì„ 만들 수 ì—†ìŒ: %m" -#: utils/init/miscinit.c:1029 +#: utils/init/miscinit.c:1293 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "\"%s\" 잠금파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: utils/init/miscinit.c:1036 +#: utils/init/miscinit.c:1300 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "\"%s\" 잠금 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: utils/init/miscinit.c:1045 +#: utils/init/miscinit.c:1309 #, c-format msgid "lock file \"%s\" is empty" msgstr "\"%s\" 잠금 파ì¼ì´ 비었ìŒ" -#: utils/init/miscinit.c:1046 +#: utils/init/miscinit.c:1310 #, c-format msgid "" "Either another server is starting, or the lock file is the remnant of a " "previous server startup crash." msgstr "" +"다른 서버가 실행 중ì´ê±°ë‚˜, ì´ì „ 서버 시작 ìž‘ì—…ì„ ì‹¤íŒ¨ 해서 잠금 파ì¼ì´ 남아 " +"있는 경우입니다." -#: utils/init/miscinit.c:1090 +#: utils/init/miscinit.c:1354 #, c-format msgid "lock file \"%s\" already exists" msgstr "\"%s\" 잠금 파ì¼ì´ ì´ë¯¸ 있ìŒ" -#: utils/init/miscinit.c:1094 +#: utils/init/miscinit.c:1358 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "" "다른 postgres 프로그램(PID %d)ì´ \"%s\" ë°ì´í„° 디렉터리를 사용해서 실행중입니" "까?" -#: utils/init/miscinit.c:1096 +#: utils/init/miscinit.c:1360 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "" "다른 postmaster 프로그램(PID %d)ì´ \"%s\" ë°ì´í„° 디렉터리를 사용해서 실행중입" "니까?" -#: utils/init/miscinit.c:1099 +#: utils/init/miscinit.c:1363 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "" "다른 postgres 프로그램(PID %d)ì´ \"%s\" 소켓 파ì¼ì„ 사용해서 실행중입니까?" -#: utils/init/miscinit.c:1101 +#: utils/init/miscinit.c:1365 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "" "다른 postmaster 프로그램(PID %d)ì´ \"%s\" 소켓 파ì¼ì„ 사용해서 실행중입니까?" -#: utils/init/miscinit.c:1152 +#: utils/init/miscinit.c:1416 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "\"%s\" 옛 잠금 파ì¼ì„ 삭제할 수 ì—†ìŒ: %m" -#: utils/init/miscinit.c:1154 +#: utils/init/miscinit.c:1418 #, c-format msgid "" "The file seems accidentally left over, but it could not be removed. Please " @@ -25814,48 +29967,48 @@ msgstr "" "ì…¸ ëª…ë ¹ì„ ì´ìš©í•´ì„œ 파ì¼ì„ ì‚­ì œ 하고 다시 시ë„í•´ 보십시오. - ë‚´ìš© ì°¸ 거시기 하" "네" -#: utils/init/miscinit.c:1191 utils/init/miscinit.c:1205 -#: utils/init/miscinit.c:1216 +#: utils/init/miscinit.c:1455 utils/init/miscinit.c:1469 +#: utils/init/miscinit.c:1480 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "\"%s\" 잠금 파ì¼ì— 쓸 수 ì—†ìŒ: %m" -#: utils/init/miscinit.c:1327 utils/init/miscinit.c:1469 utils/misc/guc.c:10038 +#: utils/init/miscinit.c:1591 utils/init/miscinit.c:1733 utils/misc/guc.c:5765 #, c-format msgid "could not read from file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: utils/init/miscinit.c:1457 +#: utils/init/miscinit.c:1721 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m; 어째든 ê³„ì† ì§„í–‰í•¨" -#: utils/init/miscinit.c:1482 +#: utils/init/miscinit.c:1746 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "\"%s\" 잠금 파ì¼ì— 있는 PID ê°’ì´ ì´ìƒí•©ë‹ˆë‹¤: 현재값 %ld, ì›ëž˜ê°’ %ld" -#: utils/init/miscinit.c:1521 utils/init/miscinit.c:1537 +#: utils/init/miscinit.c:1785 utils/init/miscinit.c:1801 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\" ê°’ì€ ë°”ë¥¸ ë°ì´í„°ë””렉터리가 아닙니다" -#: utils/init/miscinit.c:1523 +#: utils/init/miscinit.c:1787 #, c-format msgid "File \"%s\" is missing." msgstr "\"%s\" 파ì¼ì´ 없습니다." -#: utils/init/miscinit.c:1539 +#: utils/init/miscinit.c:1803 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "\"%s\" 파ì¼ì— ìž˜ëª»ëœ ìžë£Œê°€ 기ë¡ë˜ì–´ 있습니다." -#: utils/init/miscinit.c:1541 +#: utils/init/miscinit.c:1805 #, c-format msgid "You might need to initdb." msgstr "initdb ëª…ë ¹ì„ ì‹¤í–‰í•´ 새 í´ëŸ¬ìŠ¤í„°ë¥¼ 만들어야 í•  ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." -#: utils/init/miscinit.c:1549 +#: utils/init/miscinit.c:1813 #, c-format msgid "" "The data directory was initialized by PostgreSQL version %s, which is not " @@ -25864,606 +30017,911 @@ msgstr "" "ì´ ë°ì´í„° 디렉터리는 PostgreSQL %s 버전으로 초기화 ë˜ì–´ìžˆëŠ”ë°, ì´ ì„œë²„ì˜ %s " "ë²„ì „ì€ ì´ ë²„ì „ê³¼ í˜¸í™˜ì„±ì´ ì—†ìŠµë‹ˆë‹¤." -#: utils/init/miscinit.c:1616 +#: utils/init/postinit.c:259 +#, c-format +msgid "replication connection authorized: user=%s" +msgstr "복제 ì—°ê²° ì¸ì¦: user=%s" + +#: utils/init/postinit.c:262 +#, c-format +msgid "connection authorized: user=%s" +msgstr "ì—°ê²° ì¸ì¦: user=%s" + +#: utils/init/postinit.c:265 +#, c-format +msgid " database=%s" +msgstr " database=%s" + +#: utils/init/postinit.c:268 +#, c-format +msgid " application_name=%s" +msgstr " application_name=%s" + +#: utils/init/postinit.c:273 #, c-format -msgid "loaded library \"%s\"" -msgstr "\"%s\" ë¼ì´ë¸ŒëŸ¬ë¦¬ 로드 완료" +msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" +msgstr " SSL 활성화 (protocol=%s, cipher=%s, bits=%d)" -#: utils/init/postinit.c:255 +#: utils/init/postinit.c:285 #, c-format msgid "" -"replication connection authorized: user=%s application_name=%s SSL enabled " -"(protocol=%s, cipher=%s, bits=%d, compression=%s)" +" GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s, principal=%s)" msgstr "" -"복제 ì—°ê²° ì¸ì¦: 사용ìž=%s application_name=%s SSL 활성화 (프로토콜=%s, 알고리" -"즘=%s, 비트=%d, ì••ì¶•=%s)" +" GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s, principal=%s)" -#: utils/init/postinit.c:261 utils/init/postinit.c:267 -#: utils/init/postinit.c:289 utils/init/postinit.c:295 -msgid "off" -msgstr "off" +#: utils/init/postinit.c:286 utils/init/postinit.c:287 +#: utils/init/postinit.c:288 utils/init/postinit.c:293 +#: utils/init/postinit.c:294 utils/init/postinit.c:295 +msgid "no" +msgstr "no" -#: utils/init/postinit.c:261 utils/init/postinit.c:267 -#: utils/init/postinit.c:289 utils/init/postinit.c:295 -msgid "on" -msgstr "on" +#: utils/init/postinit.c:286 utils/init/postinit.c:287 +#: utils/init/postinit.c:288 utils/init/postinit.c:293 +#: utils/init/postinit.c:294 utils/init/postinit.c:295 +msgid "yes" +msgstr "yes" -#: utils/init/postinit.c:262 +#: utils/init/postinit.c:292 +#, c-format +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)" +msgstr " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)" + +#: utils/init/postinit.c:333 +#, c-format +msgid "database \"%s\" has disappeared from pg_database" +msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ëŠ” pg_database í•­ëª©ì— ì—†ìŠµë‹ˆë‹¤" + +#: utils/init/postinit.c:335 +#, c-format +msgid "Database OID %u now seems to belong to \"%s\"." +msgstr "ë°ì´í„°ë² ì´ìФ OID %uì´(ê°€) 현재 \"%s\"ì— ì†í•´ 있는 것 같습니다." + +#: utils/init/postinit.c:355 +#, c-format +msgid "database \"%s\" is not currently accepting connections" +msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ëŠ” 현재 ì ‘ì†ì„ 허용하지 않습니다" + +#: utils/init/postinit.c:368 +#, c-format +msgid "permission denied for database \"%s\"" +msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ 액세스 권한 ì—†ìŒ" + +#: utils/init/postinit.c:369 +#, c-format +msgid "User does not have CONNECT privilege." +msgstr "사용ìžì—게 CONNECT ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤." + +#: utils/init/postinit.c:389 +#, c-format +msgid "too many connections for database \"%s\"" +msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ 최대 ì ‘ì†ìˆ˜ë¥¼ 초과했습니다" + +#: utils/init/postinit.c:413 utils/init/postinit.c:420 +#, c-format +msgid "database locale is incompatible with operating system" +msgstr "ë°ì´í„°ë² ì´ìФ 로케ì¼ì´ ìš´ì˜ ì²´ì œì™€ 호환ë˜ì§€ 않ìŒ" + +#: utils/init/postinit.c:414 #, c-format msgid "" -"replication connection authorized: user=%s SSL enabled (protocol=%s, cipher=" -"%s, bits=%d, compression=%s)" +"The database was initialized with LC_COLLATE \"%s\", which is not " +"recognized by setlocale()." msgstr "" -"복제 ì—°ê²° ì¸ì¦: 사용ìž=%s SSL 활성화 (프로토콜=%s, 알고리즘=%s, 비트=%d, ì••ì¶•" -"=%s)" +"ë°ì´í„°ë² ì´ìŠ¤ê°€ setlocale()ì—서 ì¸ì‹í•  수 없는 LC_COLLATE \"%s\"(으)로 초기화" +"ë˜ì—ˆìŠµë‹ˆë‹¤." -#: utils/init/postinit.c:272 +#: utils/init/postinit.c:416 utils/init/postinit.c:423 #, c-format -msgid "replication connection authorized: user=%s application_name=%s" -msgstr "복제 ì—°ê²° ì¸ì¦: 사용ìž=%s application_name=%s" +msgid "" +"Recreate the database with another locale or install the missing locale." +msgstr "" +"다른 로케ì¼ë¡œ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 다시 만들거나 누ë½ëœ 로케ì¼ì„ 설치하십시오." -#: utils/init/postinit.c:275 +#: utils/init/postinit.c:421 #, c-format -msgid "replication connection authorized: user=%s" -msgstr "복제 ì—°ê²° ì¸ì¦: 사용ìž=%s" +msgid "" +"The database was initialized with LC_CTYPE \"%s\", which is not recognized " +"by setlocale()." +msgstr "" +"setlocale()ì—서 ì¸ì‹í•  수 없는 \"%s\" LC_CTYPE 값으로 ë°ì´í„°ë² ì´ìŠ¤ê°€ 초기화ë˜" +"었습니다." + +#: utils/init/postinit.c:493 +#, c-format +msgid "database \"%s\" has a collation version mismatch" +msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ì˜ ë¬¸ìž ì •ë ¬ ê·œì¹™ì€ ë²„ì „ì´ ë§žì§€ 않ìŒ" -#: utils/init/postinit.c:284 +#: utils/init/postinit.c:495 #, c-format msgid "" -"connection authorized: user=%s database=%s application_name=%s SSL enabled " -"(protocol=%s, cipher=%s, bits=%d, compression=%s)" +"The database was created using collation version %s, but the operating " +"system provides version %s." msgstr "" -"ì—°ê²° ì¸ì¦: 사용ìž=%s ë°ì´í„°ë² ì´ìФ=%s application_name=%s SSL 활성화 (프로토콜" -"=%s, 알고리즘=%s, 비트=%d, ì••ì¶•=%s)" +"ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만들때 %s 버전으로 ë¬¸ìž ì •ë ¬ ê·œì¹™ì„ ë§Œë“¤ì—ˆëŠ”ë°, 현재 OS는 %s " +"ë²„ì „ì„ ì œê³µí•˜ê³  있습니다." -#: utils/init/postinit.c:290 +#: utils/init/postinit.c:498 #, c-format msgid "" -"connection authorized: user=%s database=%s SSL enabled (protocol=%s, cipher=" -"%s, bits=%d, compression=%s)" +"Rebuild all objects in this database that use the default collation and run " +"ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the " +"right library version." msgstr "" -"ì—°ê²° ì¸ì¦: 사용ìž=%s ë°ì´í„°ë² ì´ìФ=%s SSL 활성화 (프로토콜=%s, 알고리즘=%s, 비" -"트=%d, ì••ì¶•=%s)" +"해당 ì •ë ¬ 규칙과 ì—°ê´€ëœ ëª¨ë“  ê°ì²´ë¥¼ 다시 만들고, ALTER COLLATION %s REFRESH " +"VERSION ëª…ë ¹ì„ ì‹¤í–‰í•˜ê±°ë‚˜, 바른 ë¼ì´ë¸ŒëŸ¬ë¦¬ ë²„ì „ì„ ì§€ì •í•´ì„œ, PostgreSQLì„ ë¹Œë“œ" +"하세요." -#: utils/init/postinit.c:300 +#: utils/init/postinit.c:904 #, c-format -msgid "connection authorized: user=%s database=%s application_name=%s" -msgstr "ì—°ê²° ì¸ì¦: 사용ìž=%s ë°ì´í„°ë² ì´ìФ=%s application_name=%s" +msgid "no roles are defined in this database system" +msgstr "ì´ ë°ì´í„°ë² ì´ìФì—는 어떠한 롤 ì •ì˜ë„ 없습니다" -#: utils/init/postinit.c:302 +#: utils/init/postinit.c:905 #, c-format -msgid "connection authorized: user=%s database=%s" -msgstr "ì—°ê²° ì¸ì¦: 사용ìž=%s ë°ì´í„°ë² ì´ìФ=%s" +msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." +msgstr "ë‹¤ìŒ ëª…ë ¹ì„ ë¨¼ì € 실행하십시오: CREATE USER \"%s\" SUPERUSER;." -#: utils/init/postinit.c:334 +#: utils/init/postinit.c:942 #, c-format -msgid "database \"%s\" has disappeared from pg_database" -msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ëŠ” pg_database í•­ëª©ì— ì—†ìŠµë‹ˆë‹¤" +msgid "must be superuser to connect in binary upgrade mode" +msgstr "슈í¼ìœ ì €ë§Œ ë°”ì´ë„ˆë¦¬ 업그레ì´ë“œ 모드 ì¤‘ì— ì—°ê²° í•  수 있ìŒ" -#: utils/init/postinit.c:336 +#: utils/init/postinit.c:962 #, c-format -msgid "Database OID %u now seems to belong to \"%s\"." -msgstr "ë°ì´í„°ë² ì´ìФ OID %uì´(ê°€) 현재 \"%s\"ì— ì†í•´ 있는 것 같습니다." +msgid "remaining connection slots are reserved for roles with the %s attribute" +msgstr "ë‚¨ì€ ì—°ê²° ìŠ¬ë¡¯ì€ %s ì†ì„±ì„ 가진 롤용으로 남겨 놓았ìŒ" + +#: utils/init/postinit.c:968 +#, c-format +msgid "" +"remaining connection slots are reserved for roles with privileges of the " +"\"%s\" role" +msgstr "ë‚¨ì€ ì—°ê²° ìŠ¬ë¡¯ì€ \"%s\" 롤 ê¶Œí•œì´ ìžˆëŠ” 롤용으로 남겨 놓았ìŒ" + +#: utils/init/postinit.c:980 +#, c-format +msgid "permission denied to start WAL sender" +msgstr "WAL 송신기 시작할 권한 ì—†ìŒ" + +#: utils/init/postinit.c:981 +#, c-format +msgid "Only roles with the %s attribute may start a WAL sender process." +msgstr "WAL 송시기 ì‹œìž‘ì€ %s ì†ì„±ì´ 있는 롤만 í•  수 있습니다." + +#: utils/init/postinit.c:1099 +#, c-format +msgid "It seems to have just been dropped or renamed." +msgstr "ì‚­ì œë˜ì—ˆê±°ë‚˜ ì´ë¦„ì´ ë°”ë€ ê²ƒ 같습니다." + +#: utils/init/postinit.c:1103 +#, c-format +msgid "database %u does not exist" +msgstr "%u ë°ì´í„°ë² ì´ìŠ¤ê°€ ì—†ìŒ" + +#: utils/init/postinit.c:1112 +#, c-format +msgid "cannot connect to invalid database \"%s\"" +msgstr "ìž˜ëª»ëœ \"%s\" ë°ì´í„°ë² ì´ìŠ¤ë¡œ ì ‘ì†í•  수 ì—†ìŒ" + +#: utils/init/postinit.c:1173 +#, c-format +msgid "The database subdirectory \"%s\" is missing." +msgstr "ë°ì´í„°ë² ì´ìФ ë””ë ‰í„°ë¦¬ì— \"%s\" 하위 디렉터리가 없습니다" + +#: utils/init/usercontext.c:43 +#, c-format +msgid "role \"%s\" cannot SET ROLE to \"%s\"" +msgstr "\"%s\" ë¡¤ì€ \"%s\" 롤로 SET ROLE 작업 í•  수 ì—†ìŒ" + +#: utils/mb/conv.c:522 utils/mb/conv.c:733 +#, c-format +msgid "invalid encoding number: %d" +msgstr "ìž˜ëª»ëœ ì¸ì½”딩 번호: %d" + +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:129 +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:165 +#, c-format +msgid "unexpected encoding ID %d for ISO 8859 character sets" +msgstr "%dì€(는) ISO 8859 ë¬¸ìž ì§‘í•©ì— ëŒ€í•œ 예기치 ì•Šì€ ì¸ì½”딩 IDìž„" + +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:110 +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:146 +#, c-format +msgid "unexpected encoding ID %d for WIN character sets" +msgstr "%dì€(는) WIN ë¬¸ìž ì§‘í•©ì— ëŒ€í•œ 예기치 ì•Šì€ ì¸ì½”딩 IDìž„" + +#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:900 +#, c-format +msgid "conversion between %s and %s is not supported" +msgstr "%s ì¸ì½”딩과 %s ì¸ì½”딩 사ì´ì˜ ë³€í™˜ì€ ì§€ì›í•˜ì§€ 않습니다" + +#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 +#: utils/mb/mbutils.c:842 +#, c-format +msgid "String of %d bytes is too long for encoding conversion." +msgstr "%dë°”ì´íŠ¸ì˜ ë¬¸ìžì—´ì€ 너무 길어서 ì¸ì½”딩 ê·œì¹™ì— ë§žì§€ 않습니다." + +#: utils/mb/mbutils.c:568 +#, c-format +msgid "invalid source encoding name \"%s\"" +msgstr "\"%s\" ì›ë³¸ ì¸ì½”딩 ì´ë¦„ì´ íƒ€ë‹¹ì¹˜ 못함" + +#: utils/mb/mbutils.c:573 +#, c-format +msgid "invalid destination encoding name \"%s\"" +msgstr "\"%s\" ëŒ€ìƒ ì¸ì½”딩 ì´ë¦„ì´ íƒ€ë‹¹ì¹˜ 못함" + +#: utils/mb/mbutils.c:713 +#, c-format +msgid "invalid byte value for encoding \"%s\": 0x%02x" +msgstr "\"%s\" ì¸ì½”딩ì—서 사용할 수 없는 ë°”ì´íЏ: 0x%02x" + +#: utils/mb/mbutils.c:877 +#, c-format +msgid "invalid Unicode code point" +msgstr "ìž˜ëª»ëœ ìœ ë‹ˆì½”ë“œ 코드 í¬ì¸íЏ" + +#: utils/mb/mbutils.c:1201 +#, c-format +msgid "bind_textdomain_codeset failed" +msgstr "bind_textdomain_codeset 실패" + +#: utils/mb/mbutils.c:1718 +#, c-format +msgid "invalid byte sequence for encoding \"%s\": %s" +msgstr "\"%s\" ì¸ì½”딩ì—서 사용할 수 없는 문ìžê°€ 있ìŒ: %s" + +#: utils/mb/mbutils.c:1751 +#, c-format +msgid "" +"character with byte sequence %s in encoding \"%s\" has no equivalent in " +"encoding \"%s\"" +msgstr "" +"%s ë°”ì´íŠ¸ë¡œ ì¡°í•©ëœ ë¬¸ìž(ì¸ì½”딩: \"%s\")와 대ì‘ë˜ëŠ” ë¬¸ìž ì½”ë“œê°€ \"%s\" ì¸ì½”딩" +"ì—는 없습니다" + +#: utils/misc/conffiles.c:88 +#, c-format +msgid "empty configuration directory name: \"%s\"" +msgstr "비어 있는 환경 설정 디렉터리 ì´ë¦„: \"%s\"" + +#: utils/misc/conffiles.c:100 +#, c-format +msgid "could not open configuration directory \"%s\": %m" +msgstr "\"%s\" 환경 설정 디렉터리를 ì—´ 수 없습니다: %m" + +#: utils/misc/guc.c:122 +msgid "" +"Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." +msgstr "" +"ì´ ë§¤ê°œ ë³€ìˆ˜ì— ìœ íš¨í•œ 단위는 \"B\", \"kB\", \"MB\",\"GB\", \"TB\" 입니다." + +#: utils/misc/guc.c:159 +msgid "" +"Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", " +"and \"d\"." +msgstr "" +"ì´ ë§¤ê°œ ë³€ìˆ˜ì— ìœ íš¨í•œ 단위는 \"us\", \"ms\", \"s\", \"min\", \"h\", \"d\" ìž…" +"니다." + +#: utils/misc/guc.c:430 +#, c-format +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "알 수 없는 환경 매개 변수 ì´ë¦„ \"%s\", 해당 파ì¼: \"%s\", 줄번호: %d" + +#: utils/misc/guc.c:470 utils/misc/guc.c:3504 utils/misc/guc.c:3748 +#: utils/misc/guc.c:3846 utils/misc/guc.c:3944 utils/misc/guc.c:4071 +#: utils/misc/guc.c:4212 +#, c-format +msgid "parameter \"%s\" cannot be changed without restarting the server" +msgstr "\"%s\" 매개 변수는 서버 재실행 ì—†ì´ ì§€ê¸ˆ 변경 ë  ìˆ˜ ì—†ìŒ" + +#: utils/misc/guc.c:506 +#, c-format +msgid "parameter \"%s\" removed from configuration file, reset to default" +msgstr "환경설정 파ì¼ì— \"%s\" 매개 변수가 빠졌ìŒ, ì´ˆê¸°ê°’ì„ ì‚¬ìš©í•¨" + +#: utils/misc/guc.c:571 +#, c-format +msgid "parameter \"%s\" changed to \"%s\"" +msgstr "\"%s\" 매개 변수 ê°’ì„ \"%s\"(으)로 바꿨ìŒ" + +#: utils/misc/guc.c:613 +#, c-format +msgid "configuration file \"%s\" contains errors" +msgstr "\"%s\" 환경 설정파ì¼ì— 오류가 있ìŒ" + +#: utils/misc/guc.c:618 +#, c-format +msgid "" +"configuration file \"%s\" contains errors; unaffected changes were applied" +msgstr "\"%s\" 환경 설정 파ì¼ì— 오류가 있어 새로 ë³€ê²½ë  ì„¤ì •ì´ ì—†ìŠµë‹ˆë‹¤" + +#: utils/misc/guc.c:623 +#, c-format +msgid "configuration file \"%s\" contains errors; no changes were applied" +msgstr "\"%s\" 환경 설정 파ì¼ì— 오류가 있어 아무 ì„¤ì •ë„ ë°˜ì˜ë˜ì§€ 않았습니다." + +#: utils/misc/guc.c:1139 utils/misc/guc.c:1155 +#, c-format +msgid "invalid configuration parameter name \"%s\"" +msgstr "알 수 없는 환경 매개 변수 ì´ë¦„ \"%s\"" + +#: utils/misc/guc.c:1141 +#, c-format +msgid "" +"Custom parameter names must be two or more simple identifiers separated by " +"dots." +msgstr "" +"ì‚¬ìš©ìž ì •ì˜ í™˜ê²½ 설정 변수 ì´ë¦„ì€ ë‘ ê¸€ìž ì´ìƒì˜ ì‹ë³„ìž ì´ë¦„ê³¼ ì (.)ì„ êµ¬ë¶„ìž" +"로 하는 ì´ë¦„ì´ì–´ì•¼ 합니다." + +#: utils/misc/guc.c:1157 +#, c-format +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\" ì´ë¦„ì€ ì˜ˆì•½ëœ ì ‘ë‘사입니다." -#: utils/init/postinit.c:356 +#: utils/misc/guc.c:1170 utils/misc/guc.c:1280 #, c-format -msgid "database \"%s\" is not currently accepting connections" -msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ëŠ” 현재 ì ‘ì†ì„ 허용하지 않습니다" +msgid "unrecognized configuration parameter \"%s\"" +msgstr "알 수 없는 환경 매개 변수 ì´ë¦„: \"%s\"" -#: utils/init/postinit.c:369 +#: utils/misc/guc.c:1802 #, c-format -msgid "permission denied for database \"%s\"" -msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ 액세스 권한 ì—†ìŒ" +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: \"%s\" ë””ë ‰í„°ë¦¬ì— ì•¡ì„¸ìŠ¤í•  수 ì—†ìŒ: %m\n" -#: utils/init/postinit.c:370 +#: utils/misc/guc.c:1806 #, c-format -msgid "User does not have CONNECT privilege." -msgstr "사용ìžì—게 CONNECT ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤." +msgid "" +"Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" +msgstr "" +"initdb 명령ì´ë‚˜, pg_basebackup 명령으로 PostgreSQL ë°ì´í„° 디렉터리를 초기화 " +"하세요.\n" -#: utils/init/postinit.c:387 +#: utils/misc/guc.c:1830 #, c-format -msgid "too many connections for database \"%s\"" -msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ 최대 ì ‘ì†ìˆ˜ë¥¼ 초과했습니다" +msgid "" +"%s does not know where to find the server configuration file.\n" +"You must specify the --config-file or -D invocation option or set the PGDATA " +"environment variable.\n" +msgstr "" +"%s í”„ë¡œê·¸ëž¨ì€ ë°ì´í„°ë² ì´ìФ 시스템 환경 설정 파ì¼ì„ 찾지 못했습니다.\n" +"ì§ì ‘ --config-file ë˜ëŠ” -D ì˜µì…˜ì„ ì´ìš©í•´ì„œ ë°ì´í„° 디렉터리를 지정하든지,\n" +"PGDATA ì´ë¦„ì˜ í™˜ê²½ 변수를 만들고 ê·¸ 값으로 해당 디렉터리를 지정한 ë’¤,\n" +"ì´ í”„ë¡œê·¸ëž¨ì„ ë‹¤ì‹œ 실행해 보십시오.\n" -#: utils/init/postinit.c:409 utils/init/postinit.c:416 +#: utils/misc/guc.c:1853 #, c-format -msgid "database locale is incompatible with operating system" -msgstr "ë°ì´í„°ë² ì´ìФ 로케ì¼ì´ ìš´ì˜ ì²´ì œì™€ 호환ë˜ì§€ 않ìŒ" +msgid "%s: could not access the server configuration file \"%s\": %m\n" +msgstr "%s: \"%s\" 환경 설정 파ì¼ì„ 접근할 수 없습니다: %m\n" -#: utils/init/postinit.c:410 +#: utils/misc/guc.c:1881 #, c-format msgid "" -"The database was initialized with LC_COLLATE \"%s\", which is not " -"recognized by setlocale()." +"%s does not know where to find the database system data.\n" +"This can be specified as \"data_directory\" in \"%s\", or by the -D " +"invocation option, or by the PGDATA environment variable.\n" msgstr "" -"ë°ì´í„°ë² ì´ìŠ¤ê°€ setlocale()ì—서 ì¸ì‹í•  수 없는 LC_COLLATE \"%s\"(으)로 초기화" -"ë˜ì—ˆìŠµë‹ˆë‹¤." +"%s í”„ë¡œê·¸ëž¨ì€ ë°ì´í„°ë² ì´ìФ 시스템 ë°ì´í„° 디렉터리를 찾지 못했습니다.\n" +"\"%s\" 파ì¼ì—서 \"data_directory\" ê°’ì„ ì§€ì •í•˜ë“ ì§€,\n" +"ì§ì ‘ -D ì˜µì…˜ì„ ì´ìš©í•´ì„œ ë°ì´í„° 디렉터리를 지정하든지,\n" +"PGDATA ì´ë¦„ì˜ í™˜ê²½ 변수를 만들고 ê·¸ 값으로 해당 디렉터리를 지정한 ë’¤,\n" +"ì´ í”„ë¡œê·¸ëž¨ì„ ë‹¤ì‹œ 실행해 보십시오.\n" -#: utils/init/postinit.c:412 utils/init/postinit.c:419 +#: utils/misc/guc.c:1933 #, c-format msgid "" -"Recreate the database with another locale or install the missing locale." +"%s does not know where to find the \"hba\" configuration file.\n" +"This can be specified as \"hba_file\" in \"%s\", or by the -D invocation " +"option, or by the PGDATA environment variable.\n" msgstr "" -"다른 로케ì¼ë¡œ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 다시 만들거나 누ë½ëœ 로케ì¼ì„ 설치하십시오." +"%s í”„ë¡œê·¸ëž¨ì€ \"hba\" 환경설정파ì¼ì„ 찾지 못했습니다.\n" +"\"%s\" 파ì¼ì—서 \"hba_file\" ê°’ì„ ì§€ì •í•˜ë“ ì§€,\n" +"ì§ì ‘ -D ì˜µì…˜ì„ ì´ìš©í•´ì„œ ë°ì´í„° 디렉터리를 지정하든지,\n" +"PGDATA ì´ë¦„ì˜ í™˜ê²½ 변수를 만들고 ê·¸ 값으로 해당 디렉터리를 지정한 ë’¤,\n" +"ì´ í”„ë¡œê·¸ëž¨ì„ ë‹¤ì‹œ 실행해 보십시오.\n" -#: utils/init/postinit.c:417 +#: utils/misc/guc.c:1964 #, c-format msgid "" -"The database was initialized with LC_CTYPE \"%s\", which is not recognized " -"by setlocale()." +"%s does not know where to find the \"ident\" configuration file.\n" +"This can be specified as \"ident_file\" in \"%s\", or by the -D invocation " +"option, or by the PGDATA environment variable.\n" msgstr "" -"setlocale()ì—서 ì¸ì‹í•  수 없는 \"%s\" LC_CTYPE 값으로 ë°ì´í„°ë² ì´ìŠ¤ê°€ 초기화ë˜" -"었습니다." +"%s í”„ë¡œê·¸ëž¨ì€ \"ident\" 환경설정파ì¼ì„ 찾지 못했습니다.\n" +"\"%s\" 파ì¼ì—서 \"ident_file\" ê°’ì„ ì§€ì •í•˜ë“ ì§€,\n" +"ì§ì ‘ -D ì˜µì…˜ì„ ì´ìš©í•´ì„œ ë°ì´í„° 디렉터리를 지정하든지,\n" +"PGDATA ì´ë¦„ì˜ í™˜ê²½ 변수를 만들고 ê·¸ 값으로 해당 디렉터리를 지정한 ë’¤,\n" +"ì´ í”„ë¡œê·¸ëž¨ì„ ë‹¤ì‹œ 실행해 보십시오.\n" -#: utils/init/postinit.c:762 -#, c-format -msgid "no roles are defined in this database system" -msgstr "ì´ ë°ì´í„°ë² ì´ìФì—는 어떠한 롤 ì •ì˜ë„ 없습니다" +#: utils/misc/guc.c:2943 +msgid "Value exceeds integer range." +msgstr "ê°’ì´ ì •ìˆ˜ 범위를 초과합니다." -#: utils/init/postinit.c:763 +#: utils/misc/guc.c:3185 #, c-format -msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." -msgstr "ë‹¤ìŒ ëª…ë ¹ì„ ë¨¼ì € 실행하십시오: CREATE USER \"%s\" SUPERUSER;." +msgid "" +"%d%s%s is outside the valid range for parameter \"%s\" (%d%s%s .. %d%s%s)" +msgstr "%d%s%s ê°’ì€ \"%s\" 매개 ë³€ìˆ˜ì˜ ê°’ìœ¼ë¡œ 타당한 범위(%d%s%s .. %d%s%s)를 벗어남" -#: utils/init/postinit.c:799 +#: utils/misc/guc.c:3226 #, c-format -msgid "new replication connections are not allowed during database shutdown" -msgstr "ë°ì´í„°ë² ì´ìФ 중지 중ì—는 새로운 복제 ì—°ê²°ì„ í•  수 없습니다." +msgid "" +"%g%s%s is outside the valid range for parameter \"%s\" (%g%s%s .. %g%s%s)" +msgstr "%g%s%s ê°’ì€ \"%s\" 매개 ë³€ìˆ˜ì˜ ê°’ìœ¼ë¡œ 타당한 범위(%g%s%s .. %g%s%s)를 벗어남" -#: utils/init/postinit.c:803 +#: utils/misc/guc.c:3465 #, c-format -msgid "must be superuser to connect during database shutdown" -msgstr "슈í¼ìœ ì €ë§Œ ë°ì´í„°ë² ì´ìФ 종료 ì¤‘ì— ì—°ê²°í•  수 있ìŒ" +msgid "parameter \"%s\" cannot be set during a parallel operation" +msgstr "병렬 작업 중ì—는 \"%s\" ì„¤ì •ì„ í•  수 ì—†ìŒ" -#: utils/init/postinit.c:813 +#: utils/misc/guc.c:3481 utils/misc/guc.c:4696 #, c-format -msgid "must be superuser to connect in binary upgrade mode" -msgstr "슈í¼ìœ ì €ë§Œ ë°”ì´ë„ˆë¦¬ 업그레ì´ë“œ 모드 ì¤‘ì— ì—°ê²° í•  수 있ìŒ" +msgid "parameter \"%s\" cannot be changed" +msgstr "\"%s\" 매개 변수는 바꿀 수 ì—†ìŒ" -#: utils/init/postinit.c:826 +#: utils/misc/guc.c:3514 #, c-format -msgid "" -"remaining connection slots are reserved for non-replication superuser " -"connections" -msgstr "ë‚¨ì€ ì—°ê²° ìŠ¬ë¡¯ì€ non-replication 슈í¼ìœ ì € 연결용으로 남겨 놓았ìŒ" +msgid "parameter \"%s\" cannot be changed now" +msgstr "\"%s\" 매개 변수는 지금 바꿀 수 ì—†ìŒ" -#: utils/init/postinit.c:836 +#: utils/misc/guc.c:3541 utils/misc/guc.c:3603 utils/misc/guc.c:4671 +#: utils/misc/guc.c:6756 #, c-format -msgid "must be superuser or replication role to start walsender" -msgstr "" -"superuser ë˜ëŠ” replication ê¶Œí•œì„ ê°€ì§„ 롤만 walsender 프로세스를 시작할 수 있" -"ìŒ" +msgid "permission denied to set parameter \"%s\"" +msgstr "\"%s\" 매개 변수를 지정할 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤." -#: utils/init/postinit.c:905 +#: utils/misc/guc.c:3583 #, c-format -msgid "database %u does not exist" -msgstr "%u ë°ì´í„°ë² ì´ìŠ¤ê°€ ì—†ìŒ" +msgid "parameter \"%s\" cannot be set after connection start" +msgstr "\"%s\" 매개 ë³€ìˆ˜ê°’ì€ ì—°ê²° 시작한 ë’¤ì—는 바꿀 수 없습니다" -#: utils/init/postinit.c:994 +#: utils/misc/guc.c:3642 #, c-format -msgid "It seems to have just been dropped or renamed." -msgstr "ì‚­ì œë˜ì—ˆê±°ë‚˜ ì´ë¦„ì´ ë°”ë€ ê²ƒ 같습니다." +msgid "cannot set parameter \"%s\" within security-definer function" +msgstr "보안 ì •ì˜ìž 함수 ë‚´ì—서 \"%s\" 매개 변수를 설정할 수 ì—†ìŒ" -#: utils/init/postinit.c:1012 +#: utils/misc/guc.c:3663 #, c-format -msgid "The database subdirectory \"%s\" is missing." -msgstr "ë°ì´í„°ë² ì´ìФ ë””ë ‰í„°ë¦¬ì— \"%s\" 하위 디렉터리가 없습니다" +msgid "parameter \"%s\" cannot be reset" +msgstr "\"%s\" 매개 변수는 리셋할 수 ì—†ìŒ" -#: utils/init/postinit.c:1017 +#: utils/misc/guc.c:3670 #, c-format -msgid "could not access directory \"%s\": %m" -msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m" +msgid "parameter \"%s\" cannot be set locally in functions" +msgstr "\"%s\" 매개 ë³€ìˆ˜ê°’ì€ í•¨ìˆ˜ 안ì—서 지역ì ìœ¼ë¡œ 지정할 수 없습니다" -#: utils/mb/conv.c:443 utils/mb/conv.c:635 +#: utils/misc/guc.c:4370 utils/misc/guc.c:4418 utils/misc/guc.c:5450 #, c-format -msgid "invalid encoding number: %d" -msgstr "ìž˜ëª»ëœ ì¸ì½”딩 번호: %d" +msgid "permission denied to examine \"%s\"" +msgstr "\"%s\" 검사 권한 ì—†ìŒ" -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:122 -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:154 +#: utils/misc/guc.c:4371 utils/misc/guc.c:4419 utils/misc/guc.c:5451 #, c-format -msgid "unexpected encoding ID %d for ISO 8859 character sets" -msgstr "%dì€(는) ISO 8859 ë¬¸ìž ì§‘í•©ì— ëŒ€í•œ 예기치 ì•Šì€ ì¸ì½”딩 IDìž„" +msgid "" +"Only roles with privileges of the \"%s\" role may examine this parameter." +msgstr "ì´ ë§¤ê°œ ë³€ìˆ˜ì˜ ê²€ì‚¬ëŠ” \"%s\" 롤 ê¶Œí•œì´ ìžˆëŠ” 롤만 í•  수 있습니다." -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:103 -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:135 +#: utils/misc/guc.c:4629 #, c-format -msgid "unexpected encoding ID %d for WIN character sets" -msgstr "%dì€(는) WIN ë¬¸ìž ì§‘í•©ì— ëŒ€í•œ 예기치 ì•Šì€ ì¸ì½”딩 IDìž„" +msgid "ALTER SYSTEM is not allowed in this environment" +msgstr "ALTER SYSTEM ëª…ë ¹ì€ ì´ í™˜ê²½ì—서는 허용하지 않ìŒ" -#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:842 +#: utils/misc/guc.c:4661 #, c-format -msgid "conversion between %s and %s is not supported" -msgstr "%s ì¸ì½”딩과 %s ì¸ì½”딩 사ì´ì˜ ë³€í™˜ì€ ì§€ì›í•˜ì§€ 않습니다" +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "ALTER SYSTEM RESET ALL 실행 권한 ì—†ìŒ" -#: utils/mb/mbutils.c:385 +#: utils/misc/guc.c:4740 #, c-format -msgid "" -"default conversion function for encoding \"%s\" to \"%s\" does not exist" +msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "" -"\"%s\" ì¸ì½”ë”©ì„ \"%s\" ì¸ì½”딩으로 변환할 기본 변환규칙(conversion)ì´ ì—†ìŒ" +"ALTER SYSTEM 명령으로 지정하는 매개 변수 ê°’ì—는 줄바꿈 문ìžê°€ 없어야 합니다" -#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:429 utils/mb/mbutils.c:758 -#: utils/mb/mbutils.c:784 +#: utils/misc/guc.c:4785 #, c-format -msgid "String of %d bytes is too long for encoding conversion." -msgstr "%dë°”ì´íŠ¸ì˜ ë¬¸ìžì—´ì€ 너무 길어서 ì¸ì½”딩 ê·œì¹™ì— ë§žì§€ 않습니다." +msgid "could not parse contents of file \"%s\"" +msgstr "\"%s\" 파ì¼ì˜ ë‚´ìš©ì„ ë¶„ì„í•  수 ì—†ìŒ" -#: utils/mb/mbutils.c:511 +#: utils/misc/guc.c:4967 #, c-format -msgid "invalid source encoding name \"%s\"" -msgstr "\"%s\" ì›ë³¸ ì¸ì½”딩 ì´ë¦„ì´ íƒ€ë‹¹ì¹˜ 못함" +msgid "attempt to redefine parameter \"%s\"" +msgstr "\"%s\" 매개 변수를 다시 ì •ì˜í•˜ë ¤ê³  함" -#: utils/mb/mbutils.c:516 +#: utils/misc/guc.c:5306 #, c-format -msgid "invalid destination encoding name \"%s\"" -msgstr "\"%s\" ëŒ€ìƒ ì¸ì½”딩 ì´ë¦„ì´ íƒ€ë‹¹ì¹˜ 못함" +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "알 수 없는 환경 매개 변수 ì´ë¦„ \"%s\", ì´ ì„¤ì •ì€ ì§€ì›ë‹ˆë‹¤." -#: utils/mb/mbutils.c:656 +#: utils/misc/guc.c:5308 #, c-format -msgid "invalid byte value for encoding \"%s\": 0x%02x" -msgstr "\"%s\" ì¸ì½”딩ì—서 사용할 수 없는 ë°”ì´íЏ: 0x%02x" +msgid "\"%s\" is now a reserved prefix." +msgstr "\"%s\" ì´ë¦„ì€ í˜„ìž¬ ì˜ˆì•½ëœ ì ‘ë‘사입니다." -#: utils/mb/mbutils.c:819 +#: utils/misc/guc.c:6179 #, c-format -msgid "invalid Unicode code point" -msgstr "ìž˜ëª»ëœ ìœ ë‹ˆì½”ë“œ 코드 í¬ì¸íЏ" +msgid "while setting parameter \"%s\" to \"%s\"" +msgstr "\"%s\" 매개 변수 ê°’ì„ \"%s\" (으)로 바꾸는 중" -#: utils/mb/mbutils.c:1087 +#: utils/misc/guc.c:6348 #, c-format -msgid "bind_textdomain_codeset failed" -msgstr "bind_textdomain_codeset 실패" +msgid "parameter \"%s\" could not be set" +msgstr "\"%s\" 매개 변수는 설정할 수 ì—†ìŒ" -#: utils/mb/mbutils.c:1595 +#: utils/misc/guc.c:6438 #, c-format -msgid "invalid byte sequence for encoding \"%s\": %s" -msgstr "\"%s\" ì¸ì½”딩ì—서 사용할 수 없는 문ìžê°€ 있ìŒ: %s" +msgid "could not parse setting for parameter \"%s\"" +msgstr "지정한 \"%s\" 매개 ë³€ìˆ˜ê°’ì˜ êµ¬ë¬¸ë¶„ì„ì„ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤." -#: utils/mb/mbutils.c:1628 +#: utils/misc/guc.c:6888 #, c-format -msgid "" -"character with byte sequence %s in encoding \"%s\" has no equivalent in " -"encoding \"%s\"" -msgstr "" -"%s ë°”ì´íŠ¸ë¡œ ì¡°í•©ëœ ë¬¸ìž(ì¸ì½”딩: \"%s\")와 대ì‘ë˜ëŠ” ë¬¸ìž ì½”ë“œê°€ \"%s\" ì¸ì½”딩" -"ì—는 없습니다" +msgid "invalid value for parameter \"%s\": %g" +msgstr "ìž˜ëª»ëœ \"%s\" 매개 ë³€ìˆ˜ì˜ ê°’: %g" + +#: utils/misc/guc_funcs.c:54 +#, c-format +msgid "cannot set parameters during a parallel operation" +msgstr "병렬 작업 중ì—는 매개 변수를 설정할 수 ì—†ìŒ" -#: utils/misc/guc.c:679 +#: utils/misc/guc_funcs.c:130 +#, c-format +msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" +msgstr "SET LOCAL TRANSACTION SNAPSHOT ëª…ë ¹ì€ ì•„ì§ êµ¬í˜„ ë˜ì§€ 않았습니다" + +#: utils/misc/guc_funcs.c:218 +#, c-format +msgid "SET %s takes only one argument" +msgstr "SET %s ëª…ë ¹ì€ í•˜ë‚˜ì˜ ê°’ë§Œ 지정해야 합니다" + +#: utils/misc/guc_funcs.c:342 +#, c-format +msgid "SET requires parameter name" +msgstr "SET ëª…ë ¹ì€ ë§¤ê°œ 변수 ì´ë¦„ì´ í•„ìš”í•©ë‹ˆë‹¤" + +#: utils/misc/guc_tables.c:676 msgid "Ungrouped" msgstr "소ì†ê·¸ë£¹ì—†ìŒ" -#: utils/misc/guc.c:681 +#: utils/misc/guc_tables.c:677 msgid "File Locations" msgstr "íŒŒì¼ ìœ„ì¹˜" -#: utils/misc/guc.c:683 -msgid "Connections and Authentication" -msgstr "ì—°ê²°ê³¼ ì¸ì¦" - -#: utils/misc/guc.c:685 +#: utils/misc/guc_tables.c:678 msgid "Connections and Authentication / Connection Settings" -msgstr "ì—°ê²°ê³¼ ì¸ì¦ / ì—°ê²° 설정값" +msgstr "ì—°ê²°ê³¼ ì¸ì¦ / ì—°ê²° 설정" -#: utils/misc/guc.c:687 +#: utils/misc/guc_tables.c:679 +msgid "Connections and Authentication / TCP Settings" +msgstr "ì—°ê²°ê³¼ ì¸ì¦ / TCP 설정" + +#: utils/misc/guc_tables.c:680 msgid "Connections and Authentication / Authentication" msgstr "ì—°ê²°ê³¼ ì¸ì¦ / ì¸ì¦" -#: utils/misc/guc.c:689 +#: utils/misc/guc_tables.c:681 msgid "Connections and Authentication / SSL" msgstr "ì—°ê²°ê³¼ ì¸ì¦ / SSL" -#: utils/misc/guc.c:691 -msgid "Resource Usage" -msgstr "ìžì› 사용량" - -#: utils/misc/guc.c:693 +#: utils/misc/guc_tables.c:682 msgid "Resource Usage / Memory" msgstr "ìžì› 사용량 / 메모리" -#: utils/misc/guc.c:695 +#: utils/misc/guc_tables.c:683 msgid "Resource Usage / Disk" msgstr "ìžì› 사용량 / 디스í¬" -#: utils/misc/guc.c:697 +#: utils/misc/guc_tables.c:684 msgid "Resource Usage / Kernel Resources" msgstr "ìžì› 사용량 / ì»¤ë„ ìžì›" -#: utils/misc/guc.c:699 +#: utils/misc/guc_tables.c:685 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "ìžì› 사용량 / 비용기반 청소 지연" -#: utils/misc/guc.c:701 +#: utils/misc/guc_tables.c:686 msgid "Resource Usage / Background Writer" msgstr "ìžì› 사용량 / 백그ë¼ìš´ë“œ 쓰기" -#: utils/misc/guc.c:703 +#: utils/misc/guc_tables.c:687 msgid "Resource Usage / Asynchronous Behavior" msgstr "ìžì› 사용량 / 비ë™ê¸° 기능" -#: utils/misc/guc.c:705 -msgid "Write-Ahead Log" -msgstr "Write-Ahead 로그" - -#: utils/misc/guc.c:707 +#: utils/misc/guc_tables.c:688 msgid "Write-Ahead Log / Settings" msgstr "Write-Ahead 로그 / 설정값" -#: utils/misc/guc.c:709 +#: utils/misc/guc_tables.c:689 msgid "Write-Ahead Log / Checkpoints" msgstr "Write-Ahead 로그 / ì²´í¬í¬ì¸íЏ" -#: utils/misc/guc.c:711 +#: utils/misc/guc_tables.c:690 msgid "Write-Ahead Log / Archiving" msgstr "Write-Ahead 로그 / ì•„ì¹´ì´ë¸Œ" -#: utils/misc/guc.c:713 +#: utils/misc/guc_tables.c:691 +msgid "Write-Ahead Log / Recovery" +msgstr "Write-Ahead 로그 / 복구" + +#: utils/misc/guc_tables.c:692 msgid "Write-Ahead Log / Archive Recovery" msgstr "Write-Ahead 로그 / ì•„ì¹´ì´ë¸Œ 복구" -#: utils/misc/guc.c:715 +#: utils/misc/guc_tables.c:693 msgid "Write-Ahead Log / Recovery Target" msgstr "Write-Ahead 로그 / 복구 대ìƒ" -#: utils/misc/guc.c:717 -msgid "Replication" -msgstr "복제" +#: utils/misc/guc_tables.c:694 +msgid "Write-Ahead Log / Summarization" +msgstr "Write-Ahead 로그 / 요약" -#: utils/misc/guc.c:719 +#: utils/misc/guc_tables.c:695 msgid "Replication / Sending Servers" msgstr "복제 / 보내기 서버" -#: utils/misc/guc.c:721 -msgid "Replication / Master Server" +#: utils/misc/guc_tables.c:696 +msgid "Replication / Primary Server" msgstr "복제 / 주 서버" -#: utils/misc/guc.c:723 +#: utils/misc/guc_tables.c:697 msgid "Replication / Standby Servers" msgstr "복제 / 대기 서버" -#: utils/misc/guc.c:725 +#: utils/misc/guc_tables.c:698 msgid "Replication / Subscribers" msgstr "복제 / 구ë…" -#: utils/misc/guc.c:727 -msgid "Query Tuning" -msgstr "쿼리 튜ë‹" - -#: utils/misc/guc.c:729 +#: utils/misc/guc_tables.c:699 msgid "Query Tuning / Planner Method Configuration" msgstr "쿼리 íŠœë‹ / 실행계íšê¸° 메서드 설정" -#: utils/misc/guc.c:731 +#: utils/misc/guc_tables.c:700 msgid "Query Tuning / Planner Cost Constants" msgstr "쿼리 íŠœë‹ / 실행계íšê¸° 비용 ìƒìˆ˜" -#: utils/misc/guc.c:733 +#: utils/misc/guc_tables.c:701 msgid "Query Tuning / Genetic Query Optimizer" msgstr "쿼리 íŠœë‹ / ì¼ë°˜ì ì¸ 쿼리 최ì í™”기" -#: utils/misc/guc.c:735 +#: utils/misc/guc_tables.c:702 msgid "Query Tuning / Other Planner Options" msgstr "쿼리 íŠœë‹ / 기타 실행계íšê¸° 옵션들" -#: utils/misc/guc.c:737 -msgid "Reporting and Logging" -msgstr "보고와 로그" - -#: utils/misc/guc.c:739 +#: utils/misc/guc_tables.c:703 msgid "Reporting and Logging / Where to Log" msgstr "보고와 로그 / 로그 위치" -#: utils/misc/guc.c:741 +#: utils/misc/guc_tables.c:704 msgid "Reporting and Logging / When to Log" msgstr "보고와 로그 / 로그 시ì " -#: utils/misc/guc.c:743 +#: utils/misc/guc_tables.c:705 msgid "Reporting and Logging / What to Log" msgstr "보고와 로그 / 로그 ë‚´ìš©" -#: utils/misc/guc.c:745 -msgid "Process Title" -msgstr "프로세스 제목" +#: utils/misc/guc_tables.c:706 +msgid "Reporting and Logging / Process Title" +msgstr "보고와 로그 / 프로세스 타ì´í‹€" -#: utils/misc/guc.c:747 -msgid "Statistics" -msgstr "통계" - -#: utils/misc/guc.c:749 +#: utils/misc/guc_tables.c:707 msgid "Statistics / Monitoring" msgstr "통계 / 모니터ë§" -#: utils/misc/guc.c:751 -msgid "Statistics / Query and Index Statistics Collector" -msgstr "통계 / 쿼리 ë° ì¸ë±ìФ 사용 통계 수집기" +#: utils/misc/guc_tables.c:708 +msgid "Statistics / Cumulative Query and Index Statistics" +msgstr "통계 / 쿼리 ë° ì¸ë±ìФ ëˆ„ì  í†µê³„" -#: utils/misc/guc.c:753 +#: utils/misc/guc_tables.c:709 msgid "Autovacuum" msgstr "Autovacuum" -#: utils/misc/guc.c:755 -msgid "Client Connection Defaults" -msgstr "í´ë¼ì´ì–¸íЏ ì—°ê²° 초기값" - -#: utils/misc/guc.c:757 +#: utils/misc/guc_tables.c:710 msgid "Client Connection Defaults / Statement Behavior" msgstr "í´ë¼ì´ì–¸íЏ ì—°ê²° 초기값 / 구문 특성" -#: utils/misc/guc.c:759 +#: utils/misc/guc_tables.c:711 msgid "Client Connection Defaults / Locale and Formatting" msgstr "í´ë¼ì´ì–¸íЏ ì—°ê²° 초기값 / 로케ì¼ê³¼ 출력양ì‹" -#: utils/misc/guc.c:761 +#: utils/misc/guc_tables.c:712 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "í´ë¼ì´ì–¸íЏ ì—°ê²° 초기값 / 공유 ë¼ì´ë¸ŒëŸ¬ë¦¬ 미리 로딩" -#: utils/misc/guc.c:763 +#: utils/misc/guc_tables.c:713 msgid "Client Connection Defaults / Other Defaults" msgstr "í´ë¼ì´ì–¸íЏ ì—°ê²° 초기값 / 기타 초기값" -#: utils/misc/guc.c:765 +#: utils/misc/guc_tables.c:714 msgid "Lock Management" msgstr "잠금 관리" -#: utils/misc/guc.c:767 -msgid "Version and Platform Compatibility" -msgstr "버전과 í”Œëž«í¼ í˜¸í™˜ì„±" - -#: utils/misc/guc.c:769 +#: utils/misc/guc_tables.c:715 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "버전과 í”Œëž«í¼ í˜¸í™˜ì„± / ì´ì „ PostgreSQL 버전" -#: utils/misc/guc.c:771 +#: utils/misc/guc_tables.c:716 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "버전과 í”Œëž«í¼ í˜¸í™˜ì„± / 다른 플랫í¼ê³¼ í´ë¼ì´ì–¸íЏ" -#: utils/misc/guc.c:773 +#: utils/misc/guc_tables.c:717 msgid "Error Handling" msgstr "오류 처리" -#: utils/misc/guc.c:775 +#: utils/misc/guc_tables.c:718 msgid "Preset Options" msgstr "프리셋 옵션들" -#: utils/misc/guc.c:777 +#: utils/misc/guc_tables.c:719 msgid "Customized Options" msgstr "ì‚¬ìš©ìž ì •ì˜ ì˜µì…˜ë“¤" -#: utils/misc/guc.c:779 +#: utils/misc/guc_tables.c:720 msgid "Developer Options" msgstr "ê°œë°œìž ì˜µì…˜ë“¤" -#: utils/misc/guc.c:837 -msgid "" -"Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." -msgstr "" -"ì´ ë§¤ê°œ ë³€ìˆ˜ì— ìœ íš¨í•œ 단위는 \"B\", \"kB\", \"MB\",\"GB\", \"TB\" 입니다." - -#: utils/misc/guc.c:874 -msgid "" -"Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", " -"and \"d\"." -msgstr "" -"ì´ ë§¤ê°œ ë³€ìˆ˜ì— ìœ íš¨í•œ 단위는 \"us\", \"ms\", \"s\", \"min\", \"h\", \"d\" ìž…" -"니다." - -#: utils/misc/guc.c:936 +#: utils/misc/guc_tables.c:775 msgid "Enables the planner's use of sequential-scan plans." msgstr "실행계íšìžê°€ 순차ì -스캔(sequential-sca) 계íšì„ 사용함" -#: utils/misc/guc.c:946 +#: utils/misc/guc_tables.c:785 msgid "Enables the planner's use of index-scan plans." msgstr "실행계íšìžê°€ ì¸ë±ìФ-스캔 계íšì„ 사용함." -#: utils/misc/guc.c:956 +#: utils/misc/guc_tables.c:795 msgid "Enables the planner's use of index-only-scan plans." msgstr "실행계íšìžê°€ ì¸ë±ìФ-ì „ìš©-íƒìƒ‰ 계íšì„ 사용함." -#: utils/misc/guc.c:966 +#: utils/misc/guc_tables.c:805 msgid "Enables the planner's use of bitmap-scan plans." msgstr "실행계íšê¸°ê°€ bitmap-scan 계íšì„ 사용하ë„ë¡ í•¨" -#: utils/misc/guc.c:976 +#: utils/misc/guc_tables.c:815 msgid "Enables the planner's use of TID scan plans." msgstr "실행계íšìžê°€ TID 스캔 계íšì„ 사용함" -#: utils/misc/guc.c:986 +#: utils/misc/guc_tables.c:825 msgid "Enables the planner's use of explicit sort steps." msgstr "실행계íšìžê°€ 명시 ì •ë ¬ 단계(explicit sort step)를 사용함" -#: utils/misc/guc.c:996 +#: utils/misc/guc_tables.c:835 msgid "Enables the planner's use of incremental sort steps." msgstr "실행계íšìžê°€ ì¦ë¶„ ì •ë ¬ 단계(incremental sort step)를 사용함" -#: utils/misc/guc.c:1005 +#: utils/misc/guc_tables.c:845 msgid "Enables the planner's use of hashed aggregation plans." msgstr "실행계íšìžê°€ í•´ì‹œëœ ì§‘ê³„ 계íšì„ 사용함" -#: utils/misc/guc.c:1015 +#: utils/misc/guc_tables.c:855 msgid "Enables the planner's use of materialization." msgstr "실행계íšìžê°€ materialization 계íšì„ 사용함" -#: utils/misc/guc.c:1025 +#: utils/misc/guc_tables.c:865 +msgid "Enables the planner's use of memoization." +msgstr "실행계íšìžê°€ memoization 계íšì„ 사용함" + +#: utils/misc/guc_tables.c:875 msgid "Enables the planner's use of nested-loop join plans." msgstr "실행계íšìžê°€ 근접순환 ì¡°ì¸(nested-loop join) 계íšì„ 사용함" -#: utils/misc/guc.c:1035 +#: utils/misc/guc_tables.c:885 msgid "Enables the planner's use of merge join plans." msgstr "실행계íšìžê°€ 병합 ì¡°ì¸(merge join) 계íšì„ 사용함" -#: utils/misc/guc.c:1045 +#: utils/misc/guc_tables.c:895 msgid "Enables the planner's use of hash join plans." msgstr "실행계íšìžê°€ 해시 ì¡°ì¸(hash join) 계íšì„ 사용함" -#: utils/misc/guc.c:1055 +#: utils/misc/guc_tables.c:905 msgid "Enables the planner's use of gather merge plans." msgstr "실행계íšìžê°€ 병합 수집(gather merge) 계íšì„ 사용함" -#: utils/misc/guc.c:1065 +#: utils/misc/guc_tables.c:915 msgid "Enables partitionwise join." -msgstr "" +msgstr "partitionwise join 활성화" -#: utils/misc/guc.c:1075 +#: utils/misc/guc_tables.c:925 msgid "Enables partitionwise aggregation and grouping." -msgstr "" +msgstr "partitionwise 집계 ë° ê·¸ë£¹í•‘ 활성화" -#: utils/misc/guc.c:1085 +#: utils/misc/guc_tables.c:935 msgid "Enables the planner's use of parallel append plans." msgstr "실행계íšìžê°€ 병렬 추가 계íšì„ 사용함" -#: utils/misc/guc.c:1095 +#: utils/misc/guc_tables.c:945 msgid "Enables the planner's use of parallel hash plans." msgstr "실행계íšìžê°€ 병렬 해시 계íšì„ 사용함" -#: utils/misc/guc.c:1105 -msgid "Enables plan-time and run-time partition pruning." -msgstr "" +#: utils/misc/guc_tables.c:955 +msgid "Enables plan-time and execution-time partition pruning." +msgstr "파티션 í”„ë£¨ë‹ ê³„íšìˆ˜ë¦½ ë° ì‹¤í–‰ 시간 활성화" -#: utils/misc/guc.c:1106 +#: utils/misc/guc_tables.c:956 msgid "" "Allows the query planner and executor to compare partition bounds to " "conditions in the query to determine which partitions must be scanned." msgstr "" +"쿼리 실행 계íšê¸°ì™€ 실행기가 조회해야할 íŒŒí‹°ì…˜ë“¤ì´ ì–´ë–¤ 것들ì¸ì§€ 쿼리ì—서 범위" +"를 íŒë‹¨í•˜ëŠ” ê²ƒì„ í—ˆìš©í•¨" + +#: utils/misc/guc_tables.c:967 +msgid "" +"Enables the planner's ability to produce plans that provide presorted input " +"for ORDER BY / DISTINCT aggregate functions." +msgstr "" +"ORDER BY / DISTINCT 집계 함수 처리를 위해 미리 ì •ë ¬ëœ ìž…ë ¥ì„ ì œê³µí•˜ëŠ” 계íšì„ " +"ìƒì„±í•˜ëŠ” 실행 계íšê¸° ê¸°ëŠ¥ì„ í™œì„±í™”í•¨" -#: utils/misc/guc.c:1117 +#: utils/misc/guc_tables.c:970 +msgid "" +"Allows the query planner to build plans that provide presorted input for " +"aggregate functions with an ORDER BY / DISTINCT clause. When disabled, " +"implicit sorts are always performed during execution." +msgstr "" +"쿼리 실행 계íšê¸°ê°€ ORDER BY / DISTINCT ì ˆì„ ì‚¬ìš©í•˜ì—¬ 집계 함수를 쓸 때 미리 " +"ì •ë ¬ëœ ìž…ë ¥ì„ ì œê³µí•˜ëŠ” 계íšì„ 작성할 수 있습니다. 비활성화하면 쿼리 실행 중" +"ì— ì•”ë¬µì ì¸ ì •ë ¬ì„ í•­ìƒ í•©ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:982 +msgid "Enables the planner's use of async append plans." +msgstr "실행계íšìžê°€ 비ë™ê¸° 추가 계íšì„ 사용함" + +#: utils/misc/guc_tables.c:992 +msgid "Enables reordering of GROUP BY keys." +msgstr "GROUP BY í‚¤ë“¤ì˜ ìž¬ì •ë ¬ 활성화" + +#: utils/misc/guc_tables.c:1002 msgid "Enables genetic query optimization." msgstr "ìœ ì „ì  ì¿¼ë¦¬ 최ì í™”(GEQO)를 사용함" -#: utils/misc/guc.c:1118 +#: utils/misc/guc_tables.c:1003 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "ì´ ì•Œê³ ë¦¬ì¦˜ì€ ì‹¤í–‰ê³„íšê¸°ì˜ ê³¼ë„한 작업 ë¹„ìš©ì„ ë‚®ì¶¥ë‹ˆë‹¤" -#: utils/misc/guc.c:1129 +#: utils/misc/guc_tables.c:1017 msgid "Shows whether the current user is a superuser." msgstr "현재 사용ìžê°€ 슈í¼ìœ ì €ì¸ì§€ ë³´ì—¬ì¤ë‹ˆë‹¤." -#: utils/misc/guc.c:1139 +#: utils/misc/guc_tables.c:1032 +msgid "Allows running the ALTER SYSTEM command." +msgstr "ALTER SYSTEM 명령 실행 허용" + +#: utils/misc/guc_tables.c:1033 +msgid "" +"Can be set to off for environments where global configuration changes should " +"be made using a different method." +msgstr "다른 방법으로 ì „ì—­ 환경설정 ê°’ì„ ê´€ë¦¬í•˜ëŠ” 환경ì—서는 off로 설정할 수 있습니다." + +#: utils/misc/guc_tables.c:1043 msgid "Enables advertising the server via Bonjour." msgstr "Bonjour 서버 사용" -#: utils/misc/guc.c:1148 +#: utils/misc/guc_tables.c:1052 msgid "Collects transaction commit time." msgstr "트랜잭션 커밋 ì‹œê°„ì„ ìˆ˜ì§‘í•¨" -#: utils/misc/guc.c:1157 +#: utils/misc/guc_tables.c:1061 msgid "Enables SSL connections." msgstr "SSL ì—°ê²°ì„ ê°€ëŠ¥í•˜ê²Œ 함." -#: utils/misc/guc.c:1166 -msgid "Also use ssl_passphrase_command during server reload." +#: utils/misc/guc_tables.c:1070 +msgid "" +"Controls whether \"ssl_passphrase_command\" is called during server reload." msgstr "" +"서버 reload 작업 중 \"ssl_passphrase_command\" 로 지정한 ëª…ë ¹ì„ ì‹¤í–‰ í•  것ì¸ì§€ë¥¼ " +"제어함." -#: utils/misc/guc.c:1175 +#: utils/misc/guc_tables.c:1079 msgid "Give priority to server ciphersuite order." msgstr "SSL ì¸ì¦ 알고리즘 ìš°ì„  순위를 정함" -#: utils/misc/guc.c:1184 +#: utils/misc/guc_tables.c:1088 msgid "Forces synchronization of updates to disk." msgstr "강제로 ë³€ê²½ëœ ë²„í¼ ìžë£Œë¥¼ 디스í¬ì™€ ë™ê¸°í™” 시킴." -#: utils/misc/guc.c:1185 +#: utils/misc/guc_tables.c:1089 msgid "" "The server will use the fsync() system call in several places to make sure " -"that updates are physically written to disk. This insures that a database " +"that updates are physically written to disk. This ensures that a database " "cluster will recover to a consistent state after an operating system or " "hardware crash." msgstr "" @@ -26472,11 +30930,11 @@ msgstr "" "ìŠ¤í…œì˜ ë¹„ì •ìƒì ì¸ ë™ìž‘ì´ë‚˜, 하드웨어ì—서 오류가 ë°œìƒë˜ì—ˆì„ 경우ì—ë„ ìžë£Œë¥¼ 안" "전하게 지킬 수 있ë„ë¡ ë„와줄 것입니다." -#: utils/misc/guc.c:1196 +#: utils/misc/guc_tables.c:1100 msgid "Continues processing after a checksum failure." msgstr "ì²´í¬ì„¬ 실패 후 처리 ê³„ì† í•¨" -#: utils/misc/guc.c:1197 +#: utils/misc/guc_tables.c:1101 msgid "" "Detection of a checksum failure normally causes PostgreSQL to report an " "error, aborting the current transaction. Setting ignore_checksum_failure to " @@ -26491,50 +30949,51 @@ msgstr "" "니다. ì´ ì„¤ì •ì€ ë°ì´í„° í´ëŸ¬ìŠ¤í„°ì—서 ì²´í¬ì„¬ ê¸°ëŠ¥ì´ í™œì„±í™” ë˜ì–´ 있는 경우ì—ë§Œ " "ì˜í–¥ì„ 받습니다." -#: utils/misc/guc.c:1211 +#: utils/misc/guc_tables.c:1115 msgid "Continues processing past damaged page headers." msgstr "ì†ìƒëœ ìžë£Œ í—¤ë” ë°œê²¬ì‹œ 작업 ì§„í–‰ 여부 ì„ íƒ" -#: utils/misc/guc.c:1212 +#: utils/misc/guc_tables.c:1116 msgid "" "Detection of a damaged page header normally causes PostgreSQL to report an " -"error, aborting the current transaction. Setting zero_damaged_pages to true " -"causes the system to instead report a warning, zero out the damaged page, " -"and continue processing. This behavior will destroy data, namely all the " -"rows on the damaged page." +"error, aborting the current transaction. Setting \"zero_damaged_pages\" to " +"true causes the system to instead report a warning, zero out the damaged " +"page, and continue processing. This behavior will destroy data, namely all " +"the rows on the damaged page." msgstr "" "ì¼ë°˜ì ìœ¼ë¡œ ì†ìƒëœ 페ì´ì§€ í—¤ë”를 발견하게 ë˜ë©´, PostgreSQLì—서는 오류를 ë°œìƒí•˜" -"ê³ , 현재 íŠ¸ëžœìž­ì…˜ì„ ì¤‘ì§€í•©ë‹ˆë‹¤. zero_damaged_pages ê°’ì„ true로 지정하면, ì´ëŸ° ì†ìƒëœ 페ì´ì§€" -"를 발견하면, 경고 메시지를 보여주고, ê·¸ 페ì´ì§€ì˜ í¬ê¸°ë¥¼ 0으로 만들고 ìž‘ì—…ì„ " -"ê³„ì† ì§„í–‰í•©ë‹ˆë‹¤. ì´ ê¸°ëŠ¥ì„ ì‚¬ìš©í•œë‹¤ í•¨ì€ ì†ìƒëœ ìžë£Œë¥¼ 없애겠다는 ê²ƒì„ ì˜ë¯¸í•©" -"니다. ì´ê²ƒì€ ê³§ 저장ë˜ì–´ìžˆëŠ” ìžë£Œê°€ ì‚­ì œ ë  ìˆ˜ë„ ìžˆìŒì„ ì˜ë¯¸í•˜ê¸°ë„ 합니다." +"ê³ , 현재 íŠ¸ëžœìž­ì…˜ì„ ì¤‘ì§€í•©ë‹ˆë‹¤. \"zero_damaged_pages\" ê°’ì„ true로 지정하면, ì´" +"런 ì†ìƒëœ 페ì´ì§€ë¥¼ 발견하면, 경고 메시지를 보여주고, ê·¸ 페ì´ì§€ì˜ í¬ê¸°ë¥¼ 0으" +"로 만들고 ìž‘ì—…ì„ ê³„ì† ì§„í–‰í•©ë‹ˆë‹¤. ì´ ê¸°ëŠ¥ì„ ì‚¬ìš©í•œë‹¤ í•¨ì€ ì†ìƒëœ ìžë£Œë¥¼ 없애" +"겠다는 ê²ƒì„ ì˜ë¯¸í•©ë‹ˆë‹¤. ì´ê²ƒì€ ê³§ 저장ë˜ì–´ìžˆëŠ” ìžë£Œê°€ ì‚­ì œ ë  ìˆ˜ë„ ìžˆìŒì„ ì˜" +"ë¯¸í•˜ê¸°ë„ í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1225 +#: utils/misc/guc_tables.c:1129 msgid "Continues recovery after an invalid pages failure." msgstr "ìž˜ëª»ëœ íŽ˜ì´ì§€ 실패 후 복구 ê³„ì† í•¨" -#: utils/misc/guc.c:1226 +#: utils/misc/guc_tables.c:1130 msgid "" "Detection of WAL records having references to invalid pages during recovery " "causes PostgreSQL to raise a PANIC-level error, aborting the recovery. " -"Setting ignore_invalid_pages to true causes the system to ignore invalid " +"Setting \"ignore_invalid_pages\" to true causes the system to ignore invalid " "page references in WAL records (but still report a warning), and continue " "recovery. This behavior may cause crashes, data loss, propagate or hide " "corruption, or other serious problems. Only has an effect during recovery or " "in standby mode." msgstr "" -"PostgreSQLì€ WAL 기반 복구 작업ì—서 해당 페ì´ì§€ê°€ 잘못ë˜ì–´ 있으면, " -"PANIC 오류를 ë‚´ê³  복구 ìž‘ì—…ì„ ì¤‘ì§€í•˜ê³  멈춥니다. ignore_invalid_pages ê°’ì„ " -" true로 지정하면, ì´ëŸ° ì†ìƒëœ 페ì´ì§€ê°€ ìžˆì„ ë•Œ, 경고 메시지를 보여주고, " -"복구 작업 ê³„ì† ì§„í–‰í•©ë‹ˆë‹¤. ì´ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë©´ 서버 ë¹„ì •ìƒ ì¢…ë£Œë‚˜ ìžë£Œ ì†ì‹¤ " -"ìˆ¨ì€ ì†ìƒ, 기타 심ê°í•œ 문제가 ì¼ì–´ ë‚  수 있습니다. ì´ ì„¤ì •ì€ ë³µêµ¬ 작업 때나 " -"대기 모드 ìƒíƒœì—서만 ìž‘ë™í•©ë‹ˆë‹¤." +"PostgreSQLì€ WAL 기반 복구 작업ì—서 해당 페ì´ì§€ê°€ 잘못ë˜ì–´ 있으면, PANIC 오류" +"를 ë‚´ê³  복구 ìž‘ì—…ì„ ì¤‘ì§€í•˜ê³  멈춥니다. \"ignore_invalid_pages\" ê°’ì„ true로 ì§€" +"정하면, ì´ëŸ° ì†ìƒëœ 페ì´ì§€ê°€ ìžˆì„ ë•Œ, 경고 메시지를 보여주고, 복구 작업 ê³„ì† " +"진행합니다. ì´ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë©´ 서버 ë¹„ì •ìƒ ì¢…ë£Œë‚˜ ìžë£Œ ì†ì‹¤ ìˆ¨ì€ ì†ìƒ, 기타 " +"심ê°í•œ 문제가 ì¼ì–´ ë‚  수 있습니다. ì´ ì„¤ì •ì€ ë³µêµ¬ 작업 때나 대기 모드 ìƒíƒœì—" +"서만 ìž‘ë™í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1244 +#: utils/misc/guc_tables.c:1148 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "ì²´í¬í¬ì¸íЏ 후 ì²˜ìŒ ìˆ˜ì •í•  때 ì „ì²´ 페ì´ì§€ë¥¼ WALì— ì”니다." -#: utils/misc/guc.c:1245 +#: utils/misc/guc_tables.c:1149 msgid "" "A page write in process during an operating system crash might be only " "partially written to disk. During recovery, the row changes stored in WAL " @@ -26546,101 +31005,114 @@ msgstr "" "ì—†ì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. ì´ ì˜µì…˜ì€ ì•ˆì „í•˜ê²Œ 복구가 가능하ë„ë¡ ì²´í¬í¬ì¸íЏ 후 ì²˜ìŒ " "수정한 페ì´ì§€ëŠ” ê·¸ 페ì´ì§€ 전체를 WALì— ì”니다." -#: utils/misc/guc.c:1258 +#: utils/misc/guc_tables.c:1162 msgid "" "Writes full pages to WAL when first modified after a checkpoint, even for a " -"non-critical modifications." +"non-critical modification." msgstr "" -"ì²´í¬í¬ì¸íЏ 작업 후 ìžë£Œ 페ì´ì§€ì— 첫 ë³€ê²½ì´ ìžˆëŠ” 경우, WALì— ë³€ê²½ëœ ë‚´ìš©ë§Œ 기" -"ë¡í•˜ëŠ” ê²ƒì´ ì•„ë‹ˆë¼, 해당 페ì´ì§€ 전체를 기ë¡í•©ë‹ˆë‹¤." +"ì²´í¬í¬ì¸íЏ 작업 후 ìžë£Œ 페ì´ì§€ì— 첫 ë³€ê²½ì´ ìžˆëŠ” 경우, 치명ì ì¸ ë³€ê²½ì´ ì•„ë‹ì§€" +"ë¼ë„ 해당 페ì´ì§€ 전체를 기ë¡í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1268 -msgid "Compresses full-page writes written in WAL file." -msgstr "WAL 파ì¼ì— 기ë¡ë˜ëŠ” ì „ì²´ 페ì´ì§€ë¥¼ 압축함" - -#: utils/misc/guc.c:1278 +#: utils/misc/guc_tables.c:1172 msgid "Writes zeroes to new WAL files before first use." -msgstr "" +msgstr "ì²˜ìŒ ì‚¬ìš© ë˜ê¸° ì „ì— WAL 파ì¼ì„ 0으로 채ì›ë‹ˆë‹¤." -#: utils/misc/guc.c:1288 +#: utils/misc/guc_tables.c:1182 msgid "Recycles WAL files by renaming them." -msgstr "" +msgstr "íŒŒì¼ ì´ë¦„ 변경으로 WAL 파ì¼ì„ 재사용합니다." -#: utils/misc/guc.c:1298 +#: utils/misc/guc_tables.c:1192 msgid "Logs each checkpoint." msgstr "ì²´í¬í¬ì¸íЏ 관련 정보를 기ë¡í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1307 +#: utils/misc/guc_tables.c:1201 msgid "Logs each successful connection." msgstr "ì—°ê²° 성공한 정보들 모ë‘를 기ë¡í•¨" -#: utils/misc/guc.c:1316 +#: utils/misc/guc_tables.c:1210 +msgid "Logs details of pre-authentication connection handshake." +msgstr "ì—°ê²° 맺기를 위한 사전 ì¸ì¦ìž‘ì—… 관련 ì„¸ë¶€ì‚¬í•­ì„ ê¸°ë¡í•©ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:1220 msgid "Logs end of a session, including duration." msgstr "ê¸°ê°„ì„ í¬í•¨í•˜ì—¬ ì„¸ì…˜ì˜ ëì„ ê¸°ë¡í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1325 +#: utils/misc/guc_tables.c:1229 msgid "Logs each replication command." msgstr "복제 관련 작업 ë‚´ì—­ì„ ê¸°ë¡í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1334 +#: utils/misc/guc_tables.c:1238 msgid "Shows whether the running server has assertion checks enabled." msgstr "서버가 assertion 검사 ê¸°ëŠ¥ì´ í™œì„±í™” ë˜ì–´ 실행ë˜ëŠ”ì§€ ë³´ì—¬ 줌" -#: utils/misc/guc.c:1349 +#: utils/misc/guc_tables.c:1249 msgid "Terminate session on any error." msgstr "ì–´ë–¤ 오류가 ìƒê¸°ë©´ ì„¸ì…˜ì„ ì¢…ë£Œí•¨" -#: utils/misc/guc.c:1358 +#: utils/misc/guc_tables.c:1258 msgid "Reinitialize server after backend crash." msgstr "백엔드가 ë¹„ì •ìƒ ì¢…ë£Œë˜ë©´ 서버를 재초기화함" -#: utils/misc/guc.c:1368 +#: utils/misc/guc_tables.c:1267 +msgid "Remove temporary files after backend crash." +msgstr "백엔드 ë¹„ì •ìƒ ì¢…ë£Œ ë’¤ì—는 임시 파ì¼ì„ ì§€ì›ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:1277 +msgid "Send SIGABRT not SIGQUIT to child processes after backend crash." +msgstr "" +"백엔드 ë¹„ì •ìƒ ì¢…ë£Œ ë  ë•Œ 하위 프로세스ì—게 SIGQUIT ëŒ€ì‹ ì— SIGABRT 신호를 보냄" + +#: utils/misc/guc_tables.c:1287 +msgid "Send SIGABRT not SIGKILL to stuck child processes." +msgstr "멈춘 하위 프로세스ì—게 SIGKILL ëŒ€ì‹ ì— SIGABRT 신호를 보냄" + +#: utils/misc/guc_tables.c:1298 msgid "Logs the duration of each completed SQL statement." msgstr "SQL 명령 êµ¬ë¬¸ì˜ ì‹¤í–‰ì™„ë£Œ ì‹œê°„ì„ ê¸°ë¡í•¨" -#: utils/misc/guc.c:1377 +#: utils/misc/guc_tables.c:1307 msgid "Logs each query's parse tree." msgstr "ê° ì¿¼ë¦¬ì˜ êµ¬ë¬¸ ë¶„ì„ íŠ¸ë¦¬ë¥¼ 기ë¡í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1386 +#: utils/misc/guc_tables.c:1316 msgid "Logs each query's rewritten parse tree." msgstr "ê° ì¿¼ë¦¬ì˜ ìž¬ìž‘ì„±ëœ êµ¬ë¬¸ ë¶„ì„ íŠ¸ë¦¬ë¥¼ 기ë¡í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1395 +#: utils/misc/guc_tables.c:1325 msgid "Logs each query's execution plan." msgstr "ê° ì¿¼ë¦¬ì˜ ì‹¤í–‰ 계íšì„ 기ë¡í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1404 +#: utils/misc/guc_tables.c:1334 msgid "Indents parse and plan tree displays." msgstr "구문과 실행계íšì„ ë³´ì—¬ 줄때, 들여쓰기를 함." -#: utils/misc/guc.c:1413 +#: utils/misc/guc_tables.c:1343 msgid "Writes parser performance statistics to the server log." msgstr "êµ¬ë¬¸ë¶„ì„ ì„±ëŠ¥ 통계를 서버 ë¡œê·¸ì— ê¸°ë¡í•¨." -#: utils/misc/guc.c:1422 +#: utils/misc/guc_tables.c:1352 msgid "Writes planner performance statistics to the server log." msgstr "실행계íšìž 성능 통계를 서버 ë¡œê·¸ì— ê¸°ë¡í•¨." -#: utils/misc/guc.c:1431 +#: utils/misc/guc_tables.c:1361 msgid "Writes executor performance statistics to the server log." msgstr "ì‹¤í–‰ìž ì„±ëŠ¥ 통계를 서버 ë¡œê·¸ì— ê¸°ë¡í•¨." -#: utils/misc/guc.c:1440 +#: utils/misc/guc_tables.c:1370 msgid "Writes cumulative performance statistics to the server log." msgstr "ëˆ„ì  ì„±ëŠ¥ 통계를 서버 ë¡œê·¸ì— ê¸°ë¡í•¨." -#: utils/misc/guc.c:1450 +#: utils/misc/guc_tables.c:1380 msgid "" "Logs system resource usage statistics (memory and CPU) on various B-tree " "operations." msgstr "다양한 B트리 ìž‘ì—…ì— ìžì›(메모리, CPU) 사용 통계를 기ë¡ì— 남기" -#: utils/misc/guc.c:1462 +#: utils/misc/guc_tables.c:1392 msgid "Collects information about executing commands." msgstr "명령 ì‹¤í–‰ì— ëŒ€í•œ 정보를 수집함" -#: utils/misc/guc.c:1463 +#: utils/misc/guc_tables.c:1393 msgid "" "Enables the collection of information on the currently executing command of " "each session, along with the time at which that command began execution." @@ -26648,59 +31120,67 @@ msgstr "" "ê° ì„¸ì…˜ì—서 사용하고 있는 현재 실행 ì¤‘ì¸ ëª…ë ¹ì˜ ìˆ˜í–‰ 시간, 명령 ë‚´ìš©ë“±ì— ëŒ€" "한 정보를 수집하ë„ë¡ í•¨" -#: utils/misc/guc.c:1473 +#: utils/misc/guc_tables.c:1403 msgid "Collects statistics on database activity." msgstr "ë°ì´í„°ë² ì´ìФ 활ë™ì— 대한 통계를 수집합니다." -#: utils/misc/guc.c:1482 +#: utils/misc/guc_tables.c:1412 msgid "Collects timing statistics for database I/O activity." msgstr "ë°ì´í„°ë² ì´ìФ I/O 활ë™ì— 대한 통계를 수집합니다." -#: utils/misc/guc.c:1492 +#: utils/misc/guc_tables.c:1421 +msgid "Collects timing statistics for WAL I/O activity." +msgstr "WAL I/O 활ë™ì— 작업 시간 통계를 수집합니다." + +#: utils/misc/guc_tables.c:1431 msgid "Updates the process title to show the active SQL command." msgstr "활성 SQL ëª…ë ¹ì„ í‘œì‹œí•˜ë„ë¡ í”„ë¡œì„¸ìŠ¤ ì œëª©ì„ ì—…ë°ì´íŠ¸í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1493 +#: utils/misc/guc_tables.c:1432 msgid "" "Enables updating of the process title every time a new SQL command is " "received by the server." msgstr "" "서버가 새 SQL ëª…ë ¹ì„ ë°›ì„ ë•Œë§ˆë‹¤ 프로세스 ì œëª©ì´ ì—…ë°ì´íŠ¸ë  ìˆ˜ 있ë„ë¡ í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1506 +#: utils/misc/guc_tables.c:1441 msgid "Starts the autovacuum subprocess." msgstr "ìžë™ 청소 하위 프로세스를 실행함" -#: utils/misc/guc.c:1516 +#: utils/misc/guc_tables.c:1451 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "LISTEN, NOTIFY 명령 ì‚¬ìš©ì„ ìœ„í•œ 디버깅 ì¶œë ¥ì„ ë§Œë“¦." -#: utils/misc/guc.c:1528 +#: utils/misc/guc_tables.c:1463 msgid "Emits information about lock usage." msgstr "잠금 사용 정보를 로그로 남김" -#: utils/misc/guc.c:1538 +#: utils/misc/guc_tables.c:1473 msgid "Emits information about user lock usage." msgstr "ì‚¬ìš©ìž ìž ê¸ˆ 사용 정보를 로그로 남김" -#: utils/misc/guc.c:1548 +#: utils/misc/guc_tables.c:1483 msgid "Emits information about lightweight lock usage." msgstr "가벼운 잠금 사용 정보를 로그로 남김" -#: utils/misc/guc.c:1558 +#: utils/misc/guc_tables.c:1493 msgid "" "Dumps information about all current locks when a deadlock timeout occurs." msgstr "êµì°© 잠금 시간 제한 ìƒí™©ì´ ë°œìƒí•˜ë©´ ê·¸ ë•Œì˜ ëª¨ë“  잠금 정보를 보여줌" -#: utils/misc/guc.c:1570 +#: utils/misc/guc_tables.c:1505 msgid "Logs long lock waits." msgstr "긴 잠금 대기를 기ë¡í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1580 +#: utils/misc/guc_tables.c:1514 +msgid "Logs standby recovery conflict waits." +msgstr "대기 서버 복구 ì¶©ëŒì— 따른 대기 정보를 ë¡œê·¸ì— ë‚¨ê¹ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:1523 msgid "Logs the host name in the connection logs." msgstr "ì—°ê²° 기ë¡ì—서 호스트 ì´ë¦„ì„ ê¸°ë¡í•¨." -#: utils/misc/guc.c:1581 +#: utils/misc/guc_tables.c:1524 msgid "" "By default, connection logs only show the IP address of the connecting host. " "If you want them to show the host name you can turn this on, but depending " @@ -26711,38 +31191,34 @@ msgstr "" "true로 바꾼다면, ì´ IPì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì„ êµ¬í•´ì„œ ì´ ì´ë¦„ì„ ì‚¬ìš©í•©ë‹ˆë‹¤ ì´ê²ƒì˜ 성" "ëŠ¥ì€ OSì˜ IPì—서 ì´ë¦„구하기 성능과 관계ë©ë‹ˆë‹¤." -#: utils/misc/guc.c:1592 +#: utils/misc/guc_tables.c:1535 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." -msgstr "\"표현=NULL\" ì‹ì„ \"표현 IS NULL\"로 취급함." +msgstr "\"표현ì‹=NULL\" ì‹ì„ \"í‘œí˜„ì‹ IS NULL\"로 취급함." -#: utils/misc/guc.c:1593 +#: utils/misc/guc_tables.c:1536 msgid "" "When turned on, expressions of the form expr = NULL (or NULL = expr) are " "treated as expr IS NULL, that is, they return true if expr evaluates to the " "null value, and false otherwise. The correct behavior of expr = NULL is to " "always return null (unknown)." msgstr "" -"표현 = NULL ì˜ ë°”ë¥¸ 처리는 í•­ìƒ null ê°’ì„ ë¦¬í„´í•´ì•¼í•˜ì§€ë§Œ, 편ì˜ì„±ì„ 위해서 " -"expr = NULL êµ¬ë¬¸ì„ expr IS NULL 구문으로 바꾸어서 처리하ë„ë¡ í•¨ì´ë ‡ê²Œí•˜ë©´, " -"윗 êµ¬ë¬¸ì€ true 를 리턴함" +"í‘œí˜„ì‹ = NULL ì˜ ë°”ë¥¸ 처리는 í•­ìƒ null ê°’ì„ ë¦¬í„´í•´ì•¼í•˜ì§€ë§Œ, 편ì˜ì„±ì„ 위해서 " +"í‘œí˜„ì‹ = NULL êµ¬ë¬¸ì„ í‘œí˜„ì‹ IS NULL 구문으로 바꾸어서 처리하ë„ë¡ í•´ì„œ ê³„ì‚°ì— " +"ë”°ë¼ true, false를 반환합니다." -#: utils/misc/guc.c:1605 -msgid "Enables per-database user names." -msgstr "per-database ì‚¬ìš©ìž ì´ë¦„ 활성화." - -#: utils/misc/guc.c:1614 +#: utils/misc/guc_tables.c:1548 msgid "Sets the default read-only status of new transactions." msgstr "새로운 íŠ¸ëžœìž­ì…˜ì˜ ìƒíƒœë¥¼ 초기값으로 ì½ê¸°ì „용으로 설정합니다." -#: utils/misc/guc.c:1623 +#: utils/misc/guc_tables.c:1558 msgid "Sets the current transaction's read-only status." msgstr "현재 íŠ¸ëžœìž­ì…•ì˜ ì½ê¸° ì „ìš© ìƒíƒœë¥¼ 지정합니다." -#: utils/misc/guc.c:1633 +#: utils/misc/guc_tables.c:1568 msgid "Sets the default deferrable status of new transactions." msgstr "새 íŠ¸ëžœìž­ì…˜ì˜ ê¸°ë³¸ 지연 가능한 ìƒíƒœë¥¼ 지정" -#: utils/misc/guc.c:1642 +#: utils/misc/guc_tables.c:1577 msgid "" "Whether to defer a read-only serializable transaction until it can be " "executed with no possible serialization failures." @@ -26750,24 +31226,25 @@ msgstr "" "ì½ê¸° ì „ìš© ì§ë ¬í™” 가능한 íŠ¸ëžœìž­ì…˜ì´ ì§ë ¬ 처리ì—서 오류가 ì—†ì„ ë•Œê¹Œì§€ ê·¸ 트랜잭" "ì…˜ì„ ì§€ì—°í•  것ì´ì§€ 결정함" -#: utils/misc/guc.c:1652 +#: utils/misc/guc_tables.c:1587 msgid "Enable row security." msgstr "로우 단위 보안 ê¸°ëŠ¥ì„ í™œì„±í™”" -#: utils/misc/guc.c:1653 +#: utils/misc/guc_tables.c:1588 msgid "When enabled, row security will be applied to all users." msgstr "ì´ ê°’ì´ í™œì„±í™” ë˜ë©´ 로우 단위 보안 ê¸°ëŠ¥ì´ ëª¨ë“  ì‚¬ìš©ìž ëŒ€ìƒìœ¼ë¡œ ì ìš©ë¨" -#: utils/misc/guc.c:1661 -msgid "Check function bodies during CREATE FUNCTION." +#: utils/misc/guc_tables.c:1596 +msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "" -"CREATE FUNCTION 명령으로 함수를 만들 때, 함수 본문 ë¶€ë¶„ì˜ êµ¬ë¬¸ì„ ê²€ì‚¬í•©ë‹ˆë‹¤." +"CREATE FUNCTION, CREATE PROCEDURE ëª…ë ¹ì„ ì‹¤í–‰í•  때 본문 ë¶€ë¶„ì˜ êµ¬ë¬¸ì„ ê²€ì‚¬í•©" +"니다." -#: utils/misc/guc.c:1670 +#: utils/misc/guc_tables.c:1605 msgid "Enable input of NULL elements in arrays." msgstr "ë°°ì—´ì— NULL 요소가 ìž…ë ¥ë  ìˆ˜ 있ë„ë¡ í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1671 +#: utils/misc/guc_tables.c:1606 msgid "" "When turned on, unquoted NULL in an array input value means a null value; " "otherwise it is taken literally." @@ -26775,42 +31252,42 @@ msgstr "" "ì´ ê°’ì´ onì´ë©´ ë°°ì—´ ìž…ë ¥ ê°’ì— ë”°ì˜´í‘œ ì—†ì´ ìž…ë ¥ëœ NULLì´ null ê°’ì„ ì˜ë¯¸í•˜ê³ , " "그렇지 않으면 ë¬¸ìž ê·¸ëŒ€ë¡œ 처리ë©ë‹ˆë‹¤." -#: utils/misc/guc.c:1687 +#: utils/misc/guc_tables.c:1622 msgid "WITH OIDS is no longer supported; this can only be false." -msgstr "" +msgstr "WITH OIDS êµ¬ë¬¸ì€ ë” ì´ìƒ ì§€ì›í•˜ì§€ 않ìŒ; ì´ ê°’ì€ falseë§Œ 허용합니다." -#: utils/misc/guc.c:1697 +#: utils/misc/guc_tables.c:1632 msgid "" "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "" "로그 ê¸°ë¡ í•˜ìœ„ 프로세스를 시작하여 stderr 출력 ë°/ë˜ëŠ” csvlog를 로그 파ì¼ì— " "ì”니다." -#: utils/misc/guc.c:1706 +#: utils/misc/guc_tables.c:1641 msgid "Truncate existing log files of same name during log rotation." msgstr "로그 회전 중 ë™ì¼í•œ ì´ë¦„ì˜ ê¸°ì¡´ 로그 파ì¼ì„ ìžë¦…니다." -#: utils/misc/guc.c:1717 +#: utils/misc/guc_tables.c:1652 msgid "Emit information about resource usage in sorting." msgstr "ì •ë ¬ 시 리소스 사용 정보를 내보냅니다." -#: utils/misc/guc.c:1731 +#: utils/misc/guc_tables.c:1666 msgid "Generate debugging output for synchronized scanning." msgstr "ë™ê¸°í™”ëœ ìŠ¤ìº”ì„ ìœ„í•´ 디버깅 ì¶œë ¥ì„ ìƒì„±í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1746 +#: utils/misc/guc_tables.c:1681 msgid "Enable bounded sorting using heap sort." msgstr "íž™ ì •ë ¬ì„ í†µí•´ ì œí•œì  ì •ë ¬ì„ ì‚¬ìš©í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1759 +#: utils/misc/guc_tables.c:1694 msgid "Emit WAL-related debugging output." msgstr "WAL 관련 디버깅 ì¶œë ¥ì„ ë‚´ë³´ëƒ…ë‹ˆë‹¤." -#: utils/misc/guc.c:1771 -msgid "Datetimes are integer based." -msgstr "datetime í˜•ì„ ì •ìˆ˜í˜•ìœ¼ë¡œ 사용함" +#: utils/misc/guc_tables.c:1706 +msgid "Shows whether datetimes are integer based." +msgstr "date, time ê°’ì„ ì •ìˆ˜ 기반으로 할지를 ë³´ì—¬ì¤ë‹ˆë‹¤." -#: utils/misc/guc.c:1782 +#: utils/misc/guc_tables.c:1717 msgid "" "Sets whether Kerberos and GSSAPI user names should be treated as case-" "insensitive." @@ -26818,42 +31295,54 @@ msgstr "" "Kerberos ë° GSSAPI ì‚¬ìš©ìž ì´ë¦„ì—서 대/소문ìžë¥¼ 구분하지 않ì„ì§€ 여부를 설정합" "니다." -#: utils/misc/guc.c:1792 +#: utils/misc/guc_tables.c:1727 +msgid "Sets whether GSSAPI delegation should be accepted from the client." +msgstr "í´ë¼ì´ì–¸íЏì—서 GSSAPI ìœ„ìž„ì„ ìˆ˜ë½í• ì§€ 여부를 설정합니다." + +#: utils/misc/guc_tables.c:1737 msgid "Warn about backslash escapes in ordinary string literals." msgstr "ì¼ë°˜ 문ìžì—´ ë¦¬í„°ëŸ´ì˜ ë°±ìŠ¬ëž˜ì‹œ ì´ìŠ¤ì¼€ì´í”„ì— ëŒ€í•´ 경고합니다." -#: utils/misc/guc.c:1802 +#: utils/misc/guc_tables.c:1747 msgid "Causes '...' strings to treat backslashes literally." msgstr "'...' 문ìžì—´ì—서 백슬래시가 리터럴로 처리ë˜ë„ë¡ í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1813 +#: utils/misc/guc_tables.c:1758 msgid "Enable synchronized sequential scans." msgstr "ë™ê¸°í™”ëœ ìˆœì°¨ì  ìŠ¤ìº”ì„ ì‚¬ìš©í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1823 +#: utils/misc/guc_tables.c:1768 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "복구 대ìƒì—서 íŠ¸ëžœìž­ì…˜ì„ í¬í•¨í• ì§€ 제외할지 ì„ íƒí•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1833 +#: utils/misc/guc_tables.c:1778 +msgid "Starts the WAL summarizer process to enable incremental backup." +msgstr "ì¦ë¶„ ë°±ì—…ì„ í—ˆìš©í•˜ê¸° 위해 WAL 요약 프로세스를 시작합니다." + +#: utils/misc/guc_tables.c:1788 msgid "Allows connections and queries during recovery." msgstr "복구 중ì—ì„œë„ ì ‘ì†ê³¼ 쿼리 ì‚¬ìš©ì„ í—ˆìš©í•¨" -#: utils/misc/guc.c:1843 +#: utils/misc/guc_tables.c:1798 msgid "" "Allows feedback from a hot standby to the primary that will avoid query " "conflicts." msgstr "" "ì½ê¸° ì „ìš© ë³´ì¡° 서버가 보내는 쿼리 ì¶©ëŒì„ 피하기 위한 í”¼ë“œë°±ì„ ì£¼ 서버가 ë°›ìŒ" -#: utils/misc/guc.c:1853 +#: utils/misc/guc_tables.c:1808 +msgid "Shows whether hot standby is currently active." +msgstr "hot standby ê°€ 활성화 ë˜ì—ˆëŠ”ì§€ 보여줌" + +#: utils/misc/guc_tables.c:1819 msgid "Allows modifications of the structure of system tables." msgstr "시스템 í…Œì´ë¸”ì˜ êµ¬ì¡°ë¥¼ 수정할 수 있ë„ë¡ í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:1864 +#: utils/misc/guc_tables.c:1830 msgid "Disables reading from system indexes." msgstr "시스템 ì¸ë±ìФ ì½ê¸°ë¥¼ 금지함" -#: utils/misc/guc.c:1865 +#: utils/misc/guc_tables.c:1831 msgid "" "It does not prevent updating the indexes, so it is safe to use. The worst " "consequence is slowness." @@ -26861,12 +31350,16 @@ msgstr "" "ì´ ì„¤ì •ì´ í™œì„±í™” ë˜ì–´ë„ ê·¸ ì¸ë±ìŠ¤ëŠ” 갱신ë˜ì–´ 사용하는ë°ëŠ” 안전합니다. 하지" "ë§Œ 서버가 ì „ì²´ì ìœ¼ë¡œ 늦어질 수 있습니다." -#: utils/misc/guc.c:1876 +#: utils/misc/guc_tables.c:1842 +msgid "Allows tablespaces directly inside pg_tblspc, for testing." +msgstr "í…Œì´ë¸”스페ì´ìŠ¤ë¥¼ pg_tblspc ì•ˆì— ë°”ë¡œ 만듦, 테스팅용" + +#: utils/misc/guc_tables.c:1853 msgid "" "Enables backward compatibility mode for privilege checks on large objects." msgstr "대형 ê°œì²´ì— ëŒ€í•œ ì ‘ê·¼ 권한 검사를 위한 하위 í˜¸í™˜ì„±ì´ ìžˆê²Œ 함" -#: utils/misc/guc.c:1877 +#: utils/misc/guc_tables.c:1854 msgid "" "Skips privilege checks when reading or modifying large objects, for " "compatibility with PostgreSQL releases prior to 9.0." @@ -26874,89 +31367,99 @@ msgstr "" "PostgreSQL 9.0 ì´ì „ ë²„ì „ì˜ í˜¸í™˜ì„±ì„ ìœ„í•´ 대형 ê°œì²´ì— ëŒ€í•œ ì½ê¸°, 변경 시 ì ‘ê·¼ " "권한 검사를 안 하ë„ë¡ ì„¤ì •í•¨" -#: utils/misc/guc.c:1887 -msgid "" -"Emit a warning for constructs that changed meaning since PostgreSQL 9.4." -msgstr "PostgreSQL 9.4 버전까지 사용ë˜ì—ˆë˜ ìš°ì„  순위가 ì ìš©ë˜ë©´ 경고를 보여줌" - -#: utils/misc/guc.c:1897 +#: utils/misc/guc_tables.c:1864 msgid "When generating SQL fragments, quote all identifiers." msgstr "SQL êµ¬ë¬¸ì„ ë§Œë“¤ 때, 모든 ì‹ë³„ìžëŠ” 따옴표를 사용함" -#: utils/misc/guc.c:1907 +#: utils/misc/guc_tables.c:1874 msgid "Shows whether data checksums are turned on for this cluster." -msgstr "" +msgstr "ì´ í´ëŸ¬ìŠ¤í„°ì—서 ìžë£Œ ì²´í¬ì„¬ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ëŠ”ì§€ 보여줌" -#: utils/misc/guc.c:1918 +#: utils/misc/guc_tables.c:1885 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "syslog 사용시 메시지 ì¤‘ë³µì„ ë°©ì§€í•˜ê¸° 위해 ì¼ë ¨ 번호를 매ê¹ë‹ˆë‹¤." -#: utils/misc/guc.c:1928 +#: utils/misc/guc_tables.c:1895 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "syslog 사용시 메시지를 한 ì¤„ì— 1024 ë°”ì´íŠ¸ë§Œ ì“°ë„ë¡ ë‚˜ëˆ•ë‹ˆë‹¤" -#: utils/misc/guc.c:1938 +#: utils/misc/guc_tables.c:1905 msgid "Controls whether Gather and Gather Merge also run subplans." -msgstr "" +msgstr "Gather와 Gather Merge ìž‘ì—…ì„ ì„œë¸Œí”Œëžœì—ì„œë„ í• ì§€ë¥¼ 제어함." -#: utils/misc/guc.c:1939 -msgid "Should gather nodes also run subplans, or just gather tuples?" -msgstr "" +#: utils/misc/guc_tables.c:1906 +msgid "Should gather nodes also run subplans or just gather tuples?" +msgstr "서브플랜ì—서 gather 노드를 실행할지, 단지 튜플만 모ì„ì§€ 지정" -#: utils/misc/guc.c:1949 +#: utils/misc/guc_tables.c:1916 msgid "Allow JIT compilation." -msgstr "" +msgstr "JIT ì§œê¹ê¸° 허용" -#: utils/misc/guc.c:1960 -msgid "Register JIT compiled function with debugger." -msgstr "" +#: utils/misc/guc_tables.c:1927 +msgid "Register JIT-compiled functions with debugger." +msgstr "디버거용 JIT 컴파ì¼ëœ 함수 등ë¡" -#: utils/misc/guc.c:1977 +#: utils/misc/guc_tables.c:1944 msgid "Write out LLVM bitcode to facilitate JIT debugging." -msgstr "" +msgstr "LLVM bitcode ì¶œë ¥ì— JIT 디버깅 ì •ë³´ 함께 기ë¡" -#: utils/misc/guc.c:1988 +#: utils/misc/guc_tables.c:1955 msgid "Allow JIT compilation of expressions." -msgstr "" +msgstr "표현ì‹ì˜ JIT ì§œê¹ê¸° 허용" -#: utils/misc/guc.c:1999 -msgid "Register JIT compiled function with perf profiler." -msgstr "" +#: utils/misc/guc_tables.c:1966 +msgid "Register JIT-compiled functions with perf profiler." +msgstr "perf 프로파ì¼ëŸ¬ìš© JIT 컴파ì¼ëœ 함수 등ë¡" -#: utils/misc/guc.c:2016 +#: utils/misc/guc_tables.c:1983 msgid "Allow JIT compilation of tuple deforming." -msgstr "" +msgstr "튜플 deformì— JIT ì§œê¹ê¸° 허용" -#: utils/misc/guc.c:2027 +#: utils/misc/guc_tables.c:1994 msgid "Whether to continue running after a failure to sync data files." -msgstr "" +msgstr "ë°ì´í„° íŒŒì¼ ë™ê¸°í™” 작업 실패 ë’¤ì—ë„ ì‹¤í–‰ì„ ê³„ì†í• ì§€ ì„ íƒí•¨" -#: utils/misc/guc.c:2036 +#: utils/misc/guc_tables.c:2003 msgid "" "Sets whether a WAL receiver should create a temporary replication slot if no " "permanent slot is configured." msgstr "" +"WAL 수신기가 ì˜êµ¬ 슬롯 ì„¤ì •ì´ ë˜ì–´ 있지 ì•Šì„ ë•Œ, 임시 복제 ìŠ¬ë¡¯ì„ ë§Œë“¤ì§€ 지정" + +#: utils/misc/guc_tables.c:2012 +msgid "Enables event triggers." +msgstr "ì´ë²¤íЏ 트리거 활성화합니다." -#: utils/misc/guc.c:2054 +#: utils/misc/guc_tables.c:2013 +msgid "When enabled, event triggers will fire for all applicable statements." +msgstr "활성화 ë˜ë©´, 구현 가능한 모든 êµ¬ë¬¸ì— ëŒ€í•´ì„œ ì´ë²¤íЏ 트리거가 실행ë©ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:2022 msgid "" -"Forces a switch to the next WAL file if a new file has not been started " -"within N seconds." +"Enables a physical standby to synchronize logical failover replication slots " +"from the primary server." msgstr "" -"새 파ì¼ì´ Nì´ˆ ë‚´ì— ì‹œìž‘ë˜ì§€ ì•Šì€ ê²½ìš° 강제로 ë‹¤ìŒ WAL 파ì¼ë¡œ 전환합니다." +"물리 복제 대기 서버가 주 서버로부터 논리 failover 복제 슬롯 ë™ê¸°í™” 하ë„ë¡ í•©ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:2040 +msgid "" +"Sets the amount of time to wait before forcing a switch to the next WAL file." +msgstr "ë‹¤ìŒ WAL 파ì¼ë¡œ ê°•ì œ 전환하기 ì „ì— ëŒ€ê¸°í•  시간 지정" -#: utils/misc/guc.c:2065 -msgid "Waits N seconds on connection startup after authentication." -msgstr "ì—°ê²° 작업ì—서 ì¸ì¦ì´ ë난 ë’¤ Nì´ˆ 기다림" +#: utils/misc/guc_tables.c:2051 +msgid "" +"Sets the amount of time to wait after authentication on connection startup." +msgstr "ì—°ê²° 작업시 ì¸ì¦ì´ ë난 ë’¤ 대기 시간 지정" -#: utils/misc/guc.c:2066 utils/misc/guc.c:2624 +#: utils/misc/guc_tables.c:2053 utils/misc/guc_tables.c:2780 msgid "This allows attaching a debugger to the process." msgstr "ì´ë ‡ê²Œ 하면 디버거를 í”„ë¡œì„¸ìŠ¤ì— ì—°ê²°í•  수 있습니다." -#: utils/misc/guc.c:2075 +#: utils/misc/guc_tables.c:2062 msgid "Sets the default statistics target." msgstr "기본 통계 대ìƒì„ 지정합니다." -#: utils/misc/guc.c:2076 +#: utils/misc/guc_tables.c:2063 msgid "" "This applies to table columns that have not had a column-specific target set " "via ALTER TABLE SET STATISTICS." @@ -26964,12 +31467,12 @@ msgstr "" "특정 ì¹¼ëŸ¼ì„ ì§€ì •í•˜ì§€ 않고 ALTER TABLE SET STATISTICS ëª…ë ¹ì„ ì‚¬ìš©í–ˆì„ ë•Œ, 통" "계 대ìƒì´ ë  ì¹¼ëŸ¼ì„ ì§€ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:2085 +#: utils/misc/guc_tables.c:2072 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "" "ì´ í¬ê¸°ë¥¼ 초과할 경우 하위 쿼리가 축소ë˜ì§€ 않는 FROM ëª©ë¡ í¬ê¸°ë¥¼ 설정합니다." -#: utils/misc/guc.c:2087 +#: utils/misc/guc_tables.c:2074 msgid "" "The planner will merge subqueries into upper queries if the resulting FROM " "list would have no more than this many items." @@ -26977,12 +31480,12 @@ msgstr "" "ê²°ê³¼ FROM 목ë¡ì— í¬í•¨ëœ í•­ëª©ì´ ì´ ê°œìˆ˜ë¥¼ 넘지 않는 경우 ê³„íš ê´€ë¦¬ìžê°€ 하" "위 쿼리를 ìƒìœ„ ì¿¼ë¦¬ì— ë³‘í•©í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:2098 +#: utils/misc/guc_tables.c:2085 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "" "ì´ í¬ê¸°ë¥¼ 초과할 경우 JOIN êµ¬ë¬¸ì´ ê²°í•©ë˜ì§€ 않는 FROM ëª©ë¡ í¬ê¸°ë¥¼ 설정합니다." -#: utils/misc/guc.c:2100 +#: utils/misc/guc_tables.c:2087 msgid "" "The planner will flatten explicit JOIN constructs into lists of FROM items " "whenever a list of no more than this many items would result." @@ -26990,32 +31493,32 @@ msgstr "" "ê²°ê³¼ 목ë¡ì— í¬í•¨ëœ í•­ëª©ì´ ì´ ê°œìˆ˜ë¥¼ 넘지 ì•Šì„ ë•Œë§ˆë‹¤ ê³„íš ê´€ë¦¬ìžê°€ 명시" "ì  JOIN êµ¬ë¬¸ì„ FROM 항목 목ë¡ì— 결합합니다." -#: utils/misc/guc.c:2111 +#: utils/misc/guc_tables.c:2098 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "" "ì´ ìž„ê³„ê°’ì„ ì´ˆê³¼í•  경우 GEQOê°€ 사용ë˜ëŠ” FROM í•­ëª©ì˜ ìž„ê³„ê°’ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:2121 +#: utils/misc/guc_tables.c:2108 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: 다른 GEQO 매개 ë³€ìˆ˜ì˜ ê¸°ë³¸ ê°’ì„ ì„¤ì •í•˜ëŠ” ë° ì‚¬ìš©ë©ë‹ˆë‹¤." -#: utils/misc/guc.c:2131 +#: utils/misc/guc_tables.c:2118 msgid "GEQO: number of individuals in the population." msgstr "GEQO: ëª¨ì§‘ë‹¨ì˜ ê°œì¸ ìˆ˜ìž…ë‹ˆë‹¤." -#: utils/misc/guc.c:2132 utils/misc/guc.c:2142 +#: utils/misc/guc_tables.c:2119 utils/misc/guc_tables.c:2129 msgid "Zero selects a suitable default value." msgstr "0ì„ ì§€ì •í•˜ë©´ ì ì ˆí•œ 기본 ê°’ì´ ì„ íƒë©ë‹ˆë‹¤." -#: utils/misc/guc.c:2141 +#: utils/misc/guc_tables.c:2128 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: ì•Œê³ ë¦¬ì¦˜ì˜ ë°˜ë³µ 수입니다." -#: utils/misc/guc.c:2153 +#: utils/misc/guc_tables.c:2140 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "êµì°© ìƒíƒœë¥¼ 확ì¸í•˜ê¸° ì „ì— ìž ê¸ˆì„ ê¸°ë‹¤ë¦´ ì‹œê°„ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:2164 +#: utils/misc/guc_tables.c:2151 msgid "" "Sets the maximum delay before canceling queries when a hot standby server is " "processing archived WAL data." @@ -27023,54 +31526,131 @@ msgstr "" "ì½ê¸° ì „ìš© ë³´ì¡° 서버가 ì•„ì¹´ì´ë¸Œëœ WAL ìžë£Œë¥¼ 처리할 때, ì§€ì—°ë  ìˆ˜ 있는 최대 시" "ê°„" -#: utils/misc/guc.c:2175 +#: utils/misc/guc_tables.c:2162 msgid "" "Sets the maximum delay before canceling queries when a hot standby server is " "processing streamed WAL data." msgstr "" "ì½ê¸° ì „ìš© ë³´ì¡° 서버가 스트림 WAL ìžë£Œë¥¼ 처리할 때, ì§€ì—°ë  ìˆ˜ 있는 최대 시간" -#: utils/misc/guc.c:2186 +#: utils/misc/guc_tables.c:2173 msgid "Sets the minimum delay for applying changes during recovery." -msgstr "" +msgstr "변경 사항 ë°˜ì˜ì„ 위한 최소 지연 시간 지정" -#: utils/misc/guc.c:2197 +#: utils/misc/guc_tables.c:2184 msgid "" "Sets the maximum interval between WAL receiver status reports to the sending " "server." msgstr "WAL 정보를 보내는 서버ì—게 WAL 수신기 ìƒíƒœë¥¼ 보고하는 최대 간격" -#: utils/misc/guc.c:2208 +#: utils/misc/guc_tables.c:2195 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "" "WAL 정보를 보내는 서버로부터 보낸 ìžë£Œë¥¼ 받기위해 기다릴 수 있는 최대 허용 시" "ê°„ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:2219 +#: utils/misc/guc_tables.c:2206 msgid "Sets the maximum number of concurrent connections." msgstr "최대 ë™ì‹œ ì ‘ì†ìˆ˜ë¥¼ 지정합니다." -#: utils/misc/guc.c:2230 +#: utils/misc/guc_tables.c:2217 msgid "Sets the number of connection slots reserved for superusers." msgstr "superuser ë™ì‹œ ì ‘ì†ìˆ˜ë¥¼ 지정합니다." -#: utils/misc/guc.c:2244 -msgid "Sets the number of shared memory buffers used by the server." -msgstr "서버ì—서 사용할 공유 ë©”ëª¨ë¦¬ì˜ ê°œìˆ˜ë¥¼ 지정함" +#: utils/misc/guc_tables.c:2227 +msgid "" +"Sets the number of connection slots reserved for roles with privileges of " +"pg_use_reserved_connections." +msgstr "" +"pg_use_reserved_connections ê¶Œí•œì´ ìžˆëŠ” ë¡¤ì˜ ì˜ˆì•½ëœ ì—°ê²° 슬롯 수를 설정합니" +"다." + +#: utils/misc/guc_tables.c:2238 +msgid "Amount of dynamic shared memory reserved at startup." +msgstr "시작시 확보할 ë™ì  공유 메모리 í¬ê¸°" + +#: utils/misc/guc_tables.c:2253 +msgid "Sets the number of shared memory buffers used by the server." +msgstr "서버ì—서 사용할 공유 메모리 ë²„í¼ ê°œìˆ˜ë¥¼ 지정함" + +#: utils/misc/guc_tables.c:2264 +msgid "Sets the buffer pool size for VACUUM, ANALYZE, and autovacuum." +msgstr "VACUUM, ANALYZE, autovacuum 작업용 ë²„í¼ í’€ í¬ê¸°ë¥¼ 설정합니다." + +#: utils/misc/guc_tables.c:2275 +msgid "" +"Shows the size of the server's main shared memory area (rounded up to the " +"nearest MB)." +msgstr "ì„œë²„ì˜ ë©”ì¸ ê³µìœ  메모리 ì˜ì—­ í¬ê¸°ë¥¼ 보여줌(MB 단위로 근사값처리함)" + +#: utils/misc/guc_tables.c:2286 +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "ë©”ì¸ ê³µìœ  메모리 ì˜ì—­ìš© huge 페ì´ì§€ 개수를 보여줌" + +#: utils/misc/guc_tables.c:2287 +msgid "-1 indicates that the value could not be determined." +msgstr "-1 ì€ ì‚¬ìš©í•˜ì§€ 않ìŒì„ 뜻함" + +#: utils/misc/guc_tables.c:2297 +msgid "" +"Sets the size of the dedicated buffer pool used for the commit timestamp " +"cache." +msgstr "커밋 시간 ìºì‹œìš© ë²„í¼ í’€ í¬ê¸° 지정" + +#: utils/misc/guc_tables.c:2298 utils/misc/guc_tables.c:2353 +#: utils/misc/guc_tables.c:2364 +msgid "" +"Specify 0 to have this value determined as a fraction of shared_buffers." +msgstr "ì´ ê°’ì„ shared_buffersì˜ ì¼ë¶€ë¡œ 하려면 0ì„ ì§€ì •í•©ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:2308 +msgid "" +"Sets the size of the dedicated buffer pool used for the MultiXact member " +"cache." +msgstr "MultiXact 번호 ìºì‹œìš© ë²„í¼ í’€ í¬ê¸° 지정" + +#: utils/misc/guc_tables.c:2319 +msgid "" +"Sets the size of the dedicated buffer pool used for the MultiXact offset " +"cache." +msgstr "MultiXact offset ìºì‹œìš© ë²„í¼ í’€ í¬ê¸° 지정" + +#: utils/misc/guc_tables.c:2330 +msgid "" +"Sets the size of the dedicated buffer pool used for the LISTEN/NOTIFY " +"message cache." +msgstr "LISTEN/NOTIFY 메시지 ìºì‹œìš© ë²„í¼ í’€ í¬ê¸° 지정" + +#: utils/misc/guc_tables.c:2341 +msgid "" +"Sets the size of the dedicated buffer pool used for the serializable " +"transaction cache." +msgstr "ì§ë ¬í™” 가능한 트랜잭션 ìºì‹œìš© ë²„í¼ í’€ í¬ê¸° 지정" + +#: utils/misc/guc_tables.c:2352 +msgid "" +"Sets the size of the dedicated buffer pool used for the subtransaction cache." +msgstr "하위트랜잭션 ìºì‹œë¥¼ 위한 ë²„í¼ í’€ í¬ê¸°ë¥¼ 지정합니다." + +#: utils/misc/guc_tables.c:2363 +msgid "" +"Sets the size of the dedicated buffer pool used for the transaction status " +"cache." +msgstr "트랜잭션 ìƒíƒœ ìºì‹œë¥¼ 위한 ë²„í¼ í’€ í¬ê¸°ë¥¼ 지정합니다." -#: utils/misc/guc.c:2255 +#: utils/misc/guc_tables.c:2374 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "ê° ì„¸ì…˜ì—서 사용하는 임시 버í¼ì˜ 최대 개수를 지정" -#: utils/misc/guc.c:2266 +#: utils/misc/guc_tables.c:2385 msgid "Sets the TCP port the server listens on." msgstr "TCP í¬íЏ 번호를 지정함." -#: utils/misc/guc.c:2276 +#: utils/misc/guc_tables.c:2395 msgid "Sets the access permissions of the Unix-domain socket." msgstr "유닉스 ë„ë©”ì¸ ì†Œì¼“ 파ì¼ì˜ 액세스 ê¶Œí•œì„ ì§€ì •í•¨" -#: utils/misc/guc.c:2277 +#: utils/misc/guc_tables.c:2396 msgid "" "Unix-domain sockets use the usual Unix file system permission set. The " "parameter value is expected to be a numeric mode specification in the form " @@ -27081,11 +31661,11 @@ msgstr "" "수 ê°’ì€ chmod ë° umask 시스템 호출ì—서 수ë½ë˜ëŠ” í˜•íƒœì˜ ìˆ«ìž ëª¨ë“œ 지정ì´ì–´ì•¼ " "합니다. (ì¼ë°˜ì ì¸ 8진수 형ì‹ì„ 사용하려면 숫ìžê°€ 0으로 시작해야 합니다.)" -#: utils/misc/guc.c:2291 +#: utils/misc/guc_tables.c:2410 msgid "Sets the file permissions for log files." msgstr "로그 파ì¼ì˜ íŒŒì¼ ì ‘ê·¼ ê¶Œí•œì„ ì§€ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:2292 +#: utils/misc/guc_tables.c:2411 msgid "" "The parameter value is expected to be a numeric mode specification in the " "form accepted by the chmod and umask system calls. (To use the customary " @@ -27095,11 +31675,11 @@ msgstr "" "ì´ì–´ì•¼ 합니다. (ì¼ë°˜ì ì¸ 8진수 형ì‹ì„ 사용하려면 숫ìžê°€ 0으로 시작해야 합니" "다.)" -#: utils/misc/guc.c:2306 -msgid "Mode of the data directory." -msgstr "ë°ì´í„° ë””ë ‰í„°ë¦¬ì˜ ëª¨ë“œ" +#: utils/misc/guc_tables.c:2425 +msgid "Shows the mode of the data directory." +msgstr "ë°ì´í„° ë””ë ‰í„°ë¦¬ì˜ ëª¨ë“œê°’ì„ ë³´ì—¬ì¤Œ" -#: utils/misc/guc.c:2307 +#: utils/misc/guc_tables.c:2426 msgid "" "The parameter value is a numeric mode specification in the form accepted by " "the chmod and umask system calls. (To use the customary octal format the " @@ -27109,11 +31689,11 @@ msgstr "" "ì´ì–´ì•¼ 합니다. (ì¼ë°˜ì ì¸ 8진수 형ì‹ì„ 사용하려면 숫ìžê°€ 0으로 시작해야 합니" "다.)" -#: utils/misc/guc.c:2320 +#: utils/misc/guc_tables.c:2439 msgid "Sets the maximum memory to be used for query workspaces." msgstr "쿼리 ìž‘ì—…ê³µê°„ì„ ìœ„í•´ ì‚¬ìš©ë  ë©”ëª¨ë¦¬ì˜ ìµœëŒ€ê°’ì„ ì§€ì •í•¨." -#: utils/misc/guc.c:2321 +#: utils/misc/guc_tables.c:2440 msgid "" "This much memory can be used by each internal sort operation and hash table " "before switching to temporary disk files." @@ -27121,268 +31701,322 @@ msgstr "" "임시 ë””ìŠ¤í¬ íŒŒì¼ë¡œ 전환하기 ì „ì— ê° ë‚´ë¶€ ì •ë ¬ 작업과 해시 í…Œì´ë¸”ì—서 ì´ í¬ê¸°" "ì˜ ë©”ëª¨ë¦¬ë¥¼ 사용할 수 있습니다." -#: utils/misc/guc.c:2333 +#: utils/misc/guc_tables.c:2457 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "관리 ìž‘ì—…ì„ ìœ„í•´ ì‚¬ìš©ë  ë©”ëª¨ë¦¬ì˜ ìµœëŒ€ê°’ì„ ì§€ì •í•¨." -#: utils/misc/guc.c:2334 +#: utils/misc/guc_tables.c:2458 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "ê´€ë¦¬ìž‘ì—…ì€ VACUUM, CREATE INDEX ê°™ì€ ìž‘ì—…ì„ ëœ»í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:2344 +#: utils/misc/guc_tables.c:2468 msgid "Sets the maximum memory to be used for logical decoding." msgstr "논리 디코딩 ìž‘ì—…ì„ ìœ„í•´ ì‚¬ìš©ë  ë©”ëª¨ë¦¬ì˜ ìµœëŒ€ê°’ì„ ì§€ì •í•¨." -#: utils/misc/guc.c:2345 +#: utils/misc/guc_tables.c:2469 msgid "" "This much memory can be used by each internal reorder buffer before spilling " "to disk." -msgstr "" -"ì´ ë©”ëª¨ë¦¬ëŠ” ë””ìŠ¤í¬ ê¸°ë¡ ì „ì— ê° ë‚´ë¶€ 재정렬 버í¼ë¡œ ì‚¬ìš©ë  ìˆ˜ 있습니다." +msgstr "ì´ ë©”ëª¨ë¦¬ëŠ” ë””ìŠ¤í¬ ê¸°ë¡ ì „ì— ê° ë‚´ë¶€ 재정렬 버í¼ë¡œ ì‚¬ìš©ë  ìˆ˜ 있습니다." -#: utils/misc/guc.c:2361 +#: utils/misc/guc_tables.c:2485 msgid "Sets the maximum stack depth, in kilobytes." msgstr "스íƒê¹Šì´(KB 단위) ìµœëŒ€ê°’ì„ ì§€ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:2372 +#: utils/misc/guc_tables.c:2496 msgid "Limits the total size of all temporary files used by each process." msgstr "ê° í”„ë¡œì„¸ìŠ¤ì—서 사용하는 모든 임시 파ì¼ì˜ ì´ í¬ê¸° 제한" -#: utils/misc/guc.c:2373 +#: utils/misc/guc_tables.c:2497 msgid "-1 means no limit." msgstr "-1ì€ ì œí•œ ì—†ìŒ" -#: utils/misc/guc.c:2383 +#: utils/misc/guc_tables.c:2507 msgid "Vacuum cost for a page found in the buffer cache." msgstr "ë²„í¼ ìºì‹œì— 있는 페ì´ì§€ì˜ 청소 비용입니다." -#: utils/misc/guc.c:2393 +#: utils/misc/guc_tables.c:2517 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "ë²„í¼ ìºì‹œì— 없는 페ì´ì§€ì˜ 청소 비용입니다." -#: utils/misc/guc.c:2403 +#: utils/misc/guc_tables.c:2527 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "청소로 페ì´ì§€ 변경 시 부과ë˜ëŠ” 비용입니다." -#: utils/misc/guc.c:2413 +#: utils/misc/guc_tables.c:2537 msgid "Vacuum cost amount available before napping." msgstr "청소가 중지ë˜ëŠ” 청소 비용 합계입니다." -#: utils/misc/guc.c:2423 +#: utils/misc/guc_tables.c:2547 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "ìžë™ ì²­ì†Œì— ëŒ€í•œ 청소가 중지ë˜ëŠ” 청소 비용 합계입니다." -#: utils/misc/guc.c:2433 +#: utils/misc/guc_tables.c:2557 msgid "" "Sets the maximum number of simultaneously open files for each server process." msgstr "ê°ê°ì˜ 서버 프로세스ì—서 ë™ì‹œì— 열릴 수 있는 최대 íŒŒì¼ ê°¯ìˆ˜ë¥¼ 지정함." -#: utils/misc/guc.c:2446 +#: utils/misc/guc_tables.c:2570 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "ë™ì‹œì— ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ 최대 개수 지정" -#: utils/misc/guc.c:2457 +#: utils/misc/guc_tables.c:2581 msgid "Sets the minimum OID of tables for tracking locks." msgstr "잠금 ì¶”ì ì„ 위한 í…Œì´ë¸”ì˜ ìµœì†Œ OID 지정" -#: utils/misc/guc.c:2458 +#: utils/misc/guc_tables.c:2582 msgid "Is used to avoid output on system tables." -msgstr "" +msgstr "시스템 í…Œì´ë¸” 출력 방지용" -#: utils/misc/guc.c:2467 +#: utils/misc/guc_tables.c:2591 msgid "Sets the OID of the table with unconditionally lock tracing." -msgstr "" +msgstr "무조건 잠금 ì¶”ì ìš© í…Œì´ë¸” OID 지정" -#: utils/misc/guc.c:2479 +#: utils/misc/guc_tables.c:2603 msgid "Sets the maximum allowed duration of any statement." msgstr "모든 ì¿¼ë¦¬ë¬¸ì— ì ìš©ë˜ëŠ” 허용ë˜ëŠ” 최대 수행시간" -#: utils/misc/guc.c:2480 utils/misc/guc.c:2491 utils/misc/guc.c:2502 +#: utils/misc/guc_tables.c:2604 utils/misc/guc_tables.c:2615 +#: utils/misc/guc_tables.c:2626 utils/misc/guc_tables.c:2637 +#: utils/misc/guc_tables.c:2648 msgid "A value of 0 turns off the timeout." msgstr "ì´ ê°’ì´ 0ì´ë©´ ì´ëŸ° ì œí•œì´ ì—†ìŒ." -#: utils/misc/guc.c:2490 +#: utils/misc/guc_tables.c:2614 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "모든 ìž ê¸ˆì— ì ìš©ë˜ëŠ” 기다리는 최대 대기 시간" -#: utils/misc/guc.c:2501 -msgid "Sets the maximum allowed duration of any idling transaction." -msgstr "idle-in-transaction ìƒíƒœë¡œ ìžˆì„ ìˆ˜ 있는 최대 시간" +#: utils/misc/guc_tables.c:2625 +msgid "" +"Sets the maximum allowed idle time between queries, when in a transaction." +msgstr "idle-in-transaction ìƒíƒœë¡œ ìžˆì„ ìˆ˜ 있는 최대 시간 지정" + +#: utils/misc/guc_tables.c:2636 +msgid "" +"Sets the maximum allowed duration of any transaction within a session (not a " +"prepared transaction)." +msgstr "한 세션ì—서 최대 유지할 수 있는 트랜잭션(미리 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ 아님) " +"ì‹œê°„ì„ ì§€ì •í•©ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:2647 +msgid "" +"Sets the maximum allowed idle time between queries, when not in a " +"transaction." +msgstr "idle ìƒíƒœë¡œ ìžˆì„ ìˆ˜ 있는 최대 시간 지정" -#: utils/misc/guc.c:2512 +#: utils/misc/guc_tables.c:2658 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "VACUUMì—서 í…Œì´ë¸” í–‰ì„ ë™ê²°í•  ë•Œê¹Œì§€ì˜ ìµœì†Œ 기간입니다." -#: utils/misc/guc.c:2522 +#: utils/misc/guc_tables.c:2668 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "" "VACUUMì—서 íŠœí”Œì„ ë™ê²°í•˜ê¸° 위해 ì „ì²´ í…Œì´ë¸”ì„ ìŠ¤ìº”í•  ë•Œê¹Œì§€ì˜ ê¸°ê°„ìž…ë‹ˆë‹¤." -#: utils/misc/guc.c:2532 +#: utils/misc/guc_tables.c:2678 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "VACUUMì—서 í…Œì´ë¸” MultiXactId ë™ê²°í•  ë•Œê¹Œì§€ì˜ ìµœì†Œ 기간입니다." -#: utils/misc/guc.c:2542 +#: utils/misc/guc_tables.c:2688 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "" "VACUUMì—서 íŠœí”Œì„ ë™ê²°í•˜ê¸° 위해 ì „ì²´ í…Œì´ë¸”ì„ ìŠ¤ìº”í•  ë•Œê¹Œì§€ì˜ ë©€í‹°íŠ¸ëžœìž­ì…˜ 기" "간입니다." -#: utils/misc/guc.c:2552 +#: utils/misc/guc_tables.c:2698 msgid "" -"Number of transactions by which VACUUM and HOT cleanup should be deferred, " -"if any." +"Age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "" +"VACUUM 작업ì—서 트랜잭션ID 겹침 방지를 피하기 위한 freeze ìž‘ì—…ì„ í•˜ëŠ” í…Œì´ë¸” " +"나ì´" -#: utils/misc/guc.c:2565 +#: utils/misc/guc_tables.c:2707 +msgid "" +"Multixact age at which VACUUM should trigger failsafe to avoid a wraparound " +"outage." +msgstr "" +"VACUUM 작업ì—서 트랜잭션ID 겹침 방지를 피하기 위한 freeze ìž‘ì—…ì„ í•˜ëŠ” 멀티트" +"랜잭션 나ì´" + +#: utils/misc/guc_tables.c:2720 msgid "Sets the maximum number of locks per transaction." msgstr "í•˜ë‚˜ì˜ íŠ¸ëžœìž­ì…˜ì—서 사용할 수 있는 최대 잠금 횟수를 지정함." -#: utils/misc/guc.c:2566 +#: utils/misc/guc_tables.c:2721 msgid "" "The shared lock table is sized on the assumption that at most " -"max_locks_per_transaction * max_connections distinct objects will need to be " -"locked at any one time." +"\"max_locks_per_transaction\" objects per server process or prepared " +"transaction will need to be locked at any one time." msgstr "" "공유 잠금 í…Œì´ë¸”ì€ í•œ ë²ˆì— ìž ê¶ˆì•¼ í•  고유 개체 수가 " -"max_locks_per_transaction * max_connections를 넘지 않는다는 가정 í•˜ì— í¬ê¸°ê°€ " -"지정ë©ë‹ˆë‹¤." +"\"max_locks_per_transaction\" * (\"max_connections\" ë˜ëŠ” 미리 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ 수)를 " +"넘지 않는다는 가정 í•˜ì— í¬ê¸°ê°€ 지정ë©ë‹ˆë‹¤." -#: utils/misc/guc.c:2577 +#: utils/misc/guc_tables.c:2732 msgid "Sets the maximum number of predicate locks per transaction." msgstr "í•˜ë‚˜ì˜ íŠ¸ëžœìž­ì…˜ì—서 사용할 수 있는 최대 잠금 횟수를 지정함." -#: utils/misc/guc.c:2578 +#: utils/misc/guc_tables.c:2733 msgid "" "The shared predicate lock table is sized on the assumption that at most " -"max_pred_locks_per_transaction * max_connections distinct objects will need " -"to be locked at any one time." +"\"max_pred_locks_per_transaction\" objects per server process or prepared " +"transaction will need to be locked at any one time." msgstr "" "공유 predicate 잠금 í…Œì´ë¸”ì€ í•œ ë²ˆì— ìž ê¶ˆì•¼ í•  고유 개체 수가 " -"max_pred_locks_per_transaction * max_connections를 넘지 않는다는 가정 í•˜ì— í¬" -"기가 지정ë©ë‹ˆë‹¤." +"\"max_pred_locks_per_transaction\" * (\"max_connections\" ë˜ëŠ” 미리 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ " +"수)를 넘지 않는다는 가정 í•˜ì— í¬ê¸°ê°€ 지정ë©ë‹ˆë‹¤." -#: utils/misc/guc.c:2589 +#: utils/misc/guc_tables.c:2744 msgid "" "Sets the maximum number of predicate-locked pages and tuples per relation." -msgstr "í•˜ë‚˜ì˜ íŠ¸ëžœìž­ì…˜ì—서 사용할 수 있는 페ì´ì§€ì™€ íŠœí”Œì˜ ìµœëŒ€ìˆ˜ 지정함." +msgstr "릴레ì´ì…˜ 당 최대 predicate-lock 페ì´ì§€ì™€ 튜플 수 지정" -#: utils/misc/guc.c:2590 +#: utils/misc/guc_tables.c:2745 msgid "" "If more than this total of pages and tuples in the same relation are locked " "by a connection, those locks are replaced by a relation-level lock." msgstr "" +"한 ì—°ê²°ì—서 ê°™ì€ ë¦´ë ˆì´ì…˜ 대ìƒìœ¼ë¡œ ì´ ê°’ë³´ë‹¤ í° íŽ˜ì´ì§€ì™€ íŠœí”Œì„ ìž ê·¼ë‹¤ë©´, ê·¸ " +"ìž ê¸ˆì€ ë¦´ë ˆì´ì…˜ 수준 잠금으로 변경 ëœë‹¤." -#: utils/misc/guc.c:2600 +#: utils/misc/guc_tables.c:2755 msgid "Sets the maximum number of predicate-locked tuples per page." -msgstr "페ì´ì§€ë‹¹ 잠금 튜플 최대 수 지정." +msgstr "페ì´ì§€ë‹¹ predicate-lock 튜플 최대 수 지정." -#: utils/misc/guc.c:2601 +#: utils/misc/guc_tables.c:2756 msgid "" "If more than this number of tuples on the same page are locked by a " "connection, those locks are replaced by a page-level lock." msgstr "" +"한 ì—°ê²°ì—서 ê°™ì€ íŽ˜ì´ì§€ 대ìƒìœ¼ë¡œ ì´ ê°’ë³´ë‹¤ íŠœí”Œì„ ìž ê·¼ë‹¤ë©´, ê·¸ ìž ê¸ˆì€ íŽ˜ì´ì§€ " +"수준 잠금으로 변경 ëœë‹¤." -#: utils/misc/guc.c:2611 +#: utils/misc/guc_tables.c:2766 msgid "Sets the maximum allowed time to complete client authentication." msgstr "í´ë¼ì´ì–¸íЏ ì¸ì¦ì„ 완료할 수 있는 최대 허용 ì‹œê°„ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:2623 -msgid "Waits N seconds on connection startup before authentication." -msgstr "ì¸ì¦ ì „ì— ì—°ê²°ì´ ì‹œìž‘ë˜ë„ë¡ Nì´ˆ ë™ì•ˆ 기다립니다." +#: utils/misc/guc_tables.c:2778 +msgid "" +"Sets the amount of time to wait before authentication on connection startup." +msgstr "ì—°ê²° í•  때 ì¸ì¦ ì „ 기다리는 시간 지정" + +#: utils/misc/guc_tables.c:2790 +msgid "Sets the maximum number of allocated pages for NOTIFY / LISTEN queue." +msgstr "NOTIFY / LISTEN íìš© í• ë‹¹ëœ íŽ˜ì´ì§€ 최대치 지정" + +#: utils/misc/guc_tables.c:2800 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "복구ì—서 WAL 미리 ì½ì„ ë²„í¼ í¬ê¸°" + +#: utils/misc/guc_tables.c:2801 +msgid "" +"Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "" +"ì°¸ì¡°ëœ ë°ì´í„° 블ë¡ì„ 미리 가져오기 위해 WALì—서 미리 ì½ì„ 수 있는 최대 거리." -#: utils/misc/guc.c:2634 +#: utils/misc/guc_tables.c:2811 msgid "Sets the size of WAL files held for standby servers." msgstr "대기 서버를 위해 보관하고 ìžˆì„ WAL íŒŒì¼ í¬ê¸°ë¥¼ 지정" -#: utils/misc/guc.c:2645 +#: utils/misc/guc_tables.c:2822 msgid "Sets the minimum size to shrink the WAL to." msgstr "WAL 최소 í¬ê¸°" -#: utils/misc/guc.c:2657 +#: utils/misc/guc_tables.c:2834 msgid "Sets the WAL size that triggers a checkpoint." msgstr "ì²´í¬í¬ì¸íЏ ìž‘ì—…ì„ í•  WAL í¬ê¸° 지정" -#: utils/misc/guc.c:2669 +#: utils/misc/guc_tables.c:2846 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "ìžë™ WAL ì²´í¬í¬ì¸íЏ 사ì´ì˜ 최대 ê°„ê²©ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:2680 +#: utils/misc/guc_tables.c:2857 msgid "" -"Enables warnings if checkpoint segments are filled more frequently than this." -msgstr "지정 시간 ì•ˆì— ì²´í¬í¬ì¸íЏ ì¡°ê°ì´ ëª¨ë‘ ì±„ì›Œì§€ë©´ 경고를 냄" +"Sets the maximum time before warning if checkpoints triggered by WAL volume " +"happen too frequently." +msgstr "" +"WAL ê¸°ë¡ ë•Œë¬¸ì— ìžì£¼ ë°œìƒí•˜ëŠ” ì²´í¬í¬ì¸íЏ 경고를 ë³´ì´ì§€ 않는 최대 시간 지정" -#: utils/misc/guc.c:2682 +#: utils/misc/guc_tables.c:2859 msgid "" "Write a message to the server log if checkpoints caused by the filling of " -"checkpoint segment files happens more frequently than this number of " -"seconds. Zero turns off the warning." +"WAL segment files happen more frequently than this amount of time. Zero " +"turns off the warning." msgstr "" "ì²´í¬í¬ì¸íЏ ìž‘ì—…ì´ ì§€ê¸ˆ 지정한 시간(ì´ˆ)보다 ìžì£¼ ì²´í¬í¬ì¸íЏ 세그먼트 파ì¼ì— ë‚´" "ìš©ì´ ê½‰ 차는 사태가 ë°œìƒí•˜ë©´ 경고 메시지를 서버 ë¡œê·¸ì— ë‚¨ê¹ë‹ˆë‹¤. ì´ ê°’ì„ 0으" -"로 지정하면 ì´ ê¸°ëŠ¥ ì—†ìŒ" +"로 지정하면 경고 남기지 않ìŒ" -#: utils/misc/guc.c:2694 utils/misc/guc.c:2910 utils/misc/guc.c:2957 +#: utils/misc/guc_tables.c:2872 utils/misc/guc_tables.c:3090 +#: utils/misc/guc_tables.c:3144 msgid "" "Number of pages after which previously performed writes are flushed to disk." -msgstr "" +msgstr "쓰기 작업 ë’¤ ë””ìŠ¤í¬ ë™ê¸°í™”를 수행할 페ì´ì§€ 수" -#: utils/misc/guc.c:2705 +#: utils/misc/guc_tables.c:2883 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "" "WAL ê¸°ëŠ¥ì„ ìœ„í•´ 공유 메모리ì—서 사용할 ë””ìŠ¤í¬ íŽ˜ì´ì§€ ë²„í¼ ê°œìˆ˜ë¥¼ 지정함." -#: utils/misc/guc.c:2716 +#: utils/misc/guc_tables.c:2884 +msgid "" +"Specify -1 to have this value determined as a fraction of shared_buffers." +msgstr "shared_buffers ì¼ë¶€ë¡œ 지정하려면 -1" + +#: utils/misc/guc_tables.c:2894 msgid "Time between WAL flushes performed in the WAL writer." msgstr "WAL 기ë¡ìžê°€ 지정 시간 ë§Œí¼ ì‰¬ê³  쓰기 ìž‘ì—…ì„ ë°˜ë³µí•¨" -#: utils/misc/guc.c:2727 +#: utils/misc/guc_tables.c:2905 msgid "Amount of WAL written out by WAL writer that triggers a flush." -msgstr "" +msgstr "WAL 쓰기 프로세스가 ì´ ì–‘ë§Œí¼ ì“°ê³  flush 합니다." -#: utils/misc/guc.c:2738 -msgid "Size of new file to fsync instead of writing WAL." -msgstr "" +#: utils/misc/guc_tables.c:2916 +msgid "Minimum size of new file to fsync instead of writing WAL." +msgstr "WAL 쓰기 대신해서 fsyncí•  새 파ì¼ì˜ 최소 í¬ê¸°" -#: utils/misc/guc.c:2749 +#: utils/misc/guc_tables.c:2927 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "ë™ì‹œì— ìž‘ë™í•  WAL 송신 프로세스 최대 수 지정" -#: utils/misc/guc.c:2760 +#: utils/misc/guc_tables.c:2938 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "ë™ì‹œì— 사용할 수 있는 복제 슬롯 최대 수 지정" -#: utils/misc/guc.c:2770 +#: utils/misc/guc_tables.c:2948 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "복제 ìŠ¬ë¡¯ì„ ìœ„í•´ 보관할 최대 WAL í¬ê¸° 지정" -#: utils/misc/guc.c:2771 +#: utils/misc/guc_tables.c:2949 msgid "" "Replication slots will be marked as failed, and segments released for " "deletion or recycling, if this much space is occupied by WAL on disk." msgstr "" +"디스í¬ì—서 WALì´ ì´ ì •ë„ì˜ ê³µê°„ì„ ì°¨ì§€í•˜ë©´ 복제 ìŠ¬ë¡¯ì€ ì‹¤íŒ¨ë¡œ 표시ë˜ê³ , " +"WAL ì¡°ê° íŒŒì¼ë“¤ì€ ì‚­ì œ ë˜ëŠ” 재활용 ë©ë‹ˆë‹¤." -#: utils/misc/guc.c:2783 +#: utils/misc/guc_tables.c:2961 msgid "Sets the maximum time to wait for WAL replication." msgstr "WAL 복제를 위해 기다릴 최대 시간 설정" -#: utils/misc/guc.c:2794 +#: utils/misc/guc_tables.c:2972 msgid "" "Sets the delay in microseconds between transaction commit and flushing WAL " "to disk." msgstr "" "트랜잭션과 트랜잭션 ë¡œê·¸ì˜ ì ìš© 사ì´ì˜ ê°„ê²©ì„ microsecond 단위로 지정함" -#: utils/misc/guc.c:2806 +#: utils/misc/guc_tables.c:2984 msgid "" -"Sets the minimum concurrent open transactions before performing commit_delay." -msgstr "commit_delay 처리하기 ì „ì— ìžˆëŠ” 최소 ë™ì‹œ ì—´ë ¤ 있는 트랜잭션 개수." +"Sets the minimum number of concurrent open transactions required before " +"performing \"commit_delay\"." +msgstr "\"commit_delay\" 처리하기 ì „ì— ìžˆëŠ” 최소 ë™ì‹œ ì—´ë ¤ 있는 트랜잭션 개수." -#: utils/misc/guc.c:2817 +#: utils/misc/guc_tables.c:2995 msgid "Sets the number of digits displayed for floating-point values." msgstr "ë¶€ë™ì†Œìˆ˜í˜• ê°’ì„ í‘œê¸°í•  때 " -#: utils/misc/guc.c:2818 +#: utils/misc/guc_tables.c:2996 msgid "" "This affects real, double precision, and geometric data types. A zero or " "negative parameter value is added to the standard number of digits (FLT_DIG " @@ -27390,33 +32024,31 @@ msgid "" "output mode." msgstr "" "ì´ ê°’ì€ real, duoble ë¶€ë™ ì†Œìˆ«ì ê³¼ 지리정보 ìžë£Œí˜•ì— ì˜í–¥ì„ ë¼ì¹©ë‹ˆë‹¤. ì´ ê°’" -"ì€ ì •ìˆ˜ì—¬ì•¼í•©ë‹ˆë‹¤(FLT_DIG or DBL_DIG as appropriate - 무슨 ë§ì¸ì§€). ìŒìˆ˜ë©´ " +"ì€ ì •ìˆ˜ì—¬ì•¼ 합니다(FLT_DIG or DBL_DIG as appropriate - 무슨 ë§ì¸ì§€). ìŒìˆ˜ë©´ " "ê·¸ ë§Œí¼ ì†Œìˆ«ì  ìžë¦¬ë¥¼ ë” ë§Žì´ ìƒëžµí•´ì„œ 정확ë„를 떨어뜨립니다." -#: utils/misc/guc.c:2830 +#: utils/misc/guc_tables.c:3008 msgid "" "Sets the minimum execution time above which a sample of statements will be " "logged. Sampling is determined by log_statement_sample_rate." msgstr "" -"" +"log_statement_sample_rate 설정으로 수집할 로그 가운ë°, 기ë¡í•  최소 쿼리 수행 " +"시간" -#: utils/misc/guc.c:2833 +#: utils/misc/guc_tables.c:3011 msgid "Zero logs a sample of all queries. -1 turns this feature off." -msgstr "" -"0ì„ ì§€ì •í•˜ë©´ 모든 쿼리를 로깅하고, -1ì„ ì§€ì •í•˜ë©´ ì´ ê¸°ëŠ¥ì´ í•´ì œë©ë‹ˆë‹¤." +msgstr "0ì„ ì§€ì •í•˜ë©´ 모든 쿼리를 로깅하고, -1ì„ ì§€ì •í•˜ë©´ ì´ ê¸°ëŠ¥ì´ í•´ì œë©ë‹ˆë‹¤." -#: utils/misc/guc.c:2843 +#: utils/misc/guc_tables.c:3021 msgid "" "Sets the minimum execution time above which all statements will be logged." -msgstr "" -"모든 실행 ì¿¼ë¦¬ë¬¸ì„ ë¡œê·¸ë¡œ 남길 최소 실행 ì‹œê°„ì„ ì„¤ì •í•©ë‹ˆë‹¤." +msgstr "모든 실행 ì¿¼ë¦¬ë¬¸ì„ ë¡œê·¸ë¡œ 남길 최소 실행 ì‹œê°„ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:2845 +#: utils/misc/guc_tables.c:3023 msgid "Zero prints all queries. -1 turns this feature off." -msgstr "" -"0ì„ ì§€ì •í•˜ë©´ 모든 쿼리를 로깅하고, -1ì„ ì§€ì •í•˜ë©´ ì´ ê¸°ëŠ¥ì´ í•´ì œë©ë‹ˆë‹¤." +msgstr "0ì„ ì§€ì •í•˜ë©´ 모든 쿼리를 로깅하고, -1ì„ ì§€ì •í•˜ë©´ ì´ ê¸°ëŠ¥ì´ í•´ì œë©ë‹ˆë‹¤." -#: utils/misc/guc.c:2855 +#: utils/misc/guc_tables.c:3033 msgid "" "Sets the minimum execution time above which autovacuum actions will be " "logged." @@ -27424,208 +32056,208 @@ msgstr "" "ì´ ì‹œê°„ì„ ì´ˆê³¼í•  경우 ìžë™ 청소 작업 로그를 남길 최소 실행 ì‹œê°„ì„ ì„¤ì •í•©ë‹ˆ" "다." -#: utils/misc/guc.c:2857 +#: utils/misc/guc_tables.c:3035 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "" -"0ì„ ì§€ì •í•˜ë©´ 모든 ìž‘ì—…ì„ ë¡œê¹…í•˜ê³ , -1ì„ ì§€ì •í•˜ë©´ ìžë™ 청소관련 로그를 남기지 않ìŒ" +"0ì„ ì§€ì •í•˜ë©´ 모든 ìž‘ì—…ì„ ë¡œê¹…í•˜ê³ , -1ì„ ì§€ì •í•˜ë©´ ìžë™ 청소관련 로그를 남기지 " +"않ìŒ" -#: utils/misc/guc.c:2867 +#: utils/misc/guc_tables.c:3045 msgid "" -"When logging statements, limit logged parameter values to first N bytes." -msgstr "" +"Sets the maximum length in bytes of data logged for bind parameter values " +"when logging statements." +msgstr "쿼리문 로그 ì €ìž¥ì— ì“¸ 매개변수 ê°’ì˜ ìµœëŒ€ ê¸¸ì´ ë°”ì´íЏ" -#: utils/misc/guc.c:2868 utils/misc/guc.c:2879 +#: utils/misc/guc_tables.c:3047 utils/misc/guc_tables.c:3059 msgid "-1 to print values in full." -msgstr "" +msgstr "-1ì€ ê¸¸ì´ ì œí•œ ì—†ì´ ì „ì²´" -#: utils/misc/guc.c:2878 +#: utils/misc/guc_tables.c:3057 msgid "" -"When reporting an error, limit logged parameter values to first N bytes." -msgstr "" +"Sets the maximum length in bytes of data logged for bind parameter values " +"when logging statements, on error." +msgstr "쿼리 오류 시 쿼리문 로그 ì €ìž¥ì— ì“¸ 매개변수 ê°’ì˜ ìµœëŒ€ ê¸¸ì´ ë°”ì´íЏ" -#: utils/misc/guc.c:2889 +#: utils/misc/guc_tables.c:3069 msgid "Background writer sleep time between rounds." msgstr "백그ë¼ìš´ë“œ 기ë¡ìžì˜ ìž ìžëŠ” 시간" -#: utils/misc/guc.c:2900 +#: utils/misc/guc_tables.c:3080 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "ë¼ìš´ë“œë‹¹ 플러시할 백그ë¼ìš´ë“œ 작성기 최대 LRU 페ì´ì§€ 수입니다." -#: utils/misc/guc.c:2923 +#: utils/misc/guc_tables.c:3103 msgid "" "Number of simultaneous requests that can be handled efficiently by the disk " "subsystem." -msgstr "" -"ë””ìŠ¤í¬ í•˜ìœ„ 시스템ì—서 효율ì ìœ¼ë¡œ 처리할 수 있는 ë™ì‹œ 요청 수입니다." - -#: utils/misc/guc.c:2924 -msgid "" -"For RAID arrays, this should be approximately the number of drive spindles " -"in the array." -msgstr "RAID ë°°ì—´ì˜ ê²½ìš° ì´ ê°’ì€ ëŒ€ëžµ ë°°ì—´ì˜ ë“œë¼ì´ë¸Œ 스핀들 수입니다." +msgstr "ë””ìŠ¤í¬ í•˜ìœ„ 시스템ì—서 효율ì ìœ¼ë¡œ 처리할 수 있는 ë™ì‹œ 요청 수입니다." -#: utils/misc/guc.c:2941 +#: utils/misc/guc_tables.c:3117 msgid "" -"A variant of effective_io_concurrency that is used for maintenance work." +"A variant of \"effective_io_concurrency\" that is used for maintenance work." msgstr "" +"유지보수 ìž‘ì—…ì— ì‚¬ìš©ë˜ëŠ” \"effective_io_concurrency\"ì˜ ë³€í˜•ìž…ë‹ˆë‹¤." -#: utils/misc/guc.c:2970 +#: utils/misc/guc_tables.c:3132 +msgid "Limit on the size of data reads and writes." +msgstr "ë°ì´í„° ì½ê¸° 쓰기 í¬ê¸°ì˜ ì œí•œì„ ê²ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:3157 msgid "Maximum number of concurrent worker processes." msgstr "ë™ì‹œ ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ì˜ ìµœëŒ€ 수" -#: utils/misc/guc.c:2982 +#: utils/misc/guc_tables.c:3169 msgid "Maximum number of logical replication worker processes." msgstr "논리 복제 ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ì˜ ìµœëŒ€ 수" -#: utils/misc/guc.c:2994 +#: utils/misc/guc_tables.c:3181 msgid "Maximum number of table synchronization workers per subscription." msgstr "구ë…ì„ ìœ„í•œ í…Œì´ë¸” ë™ê¸°í™” 작업ìžì˜ 최대 수" -#: utils/misc/guc.c:3004 -msgid "Automatic log file rotation will occur after N minutes." -msgstr "Në¶„ í›„ì— ìžë™ 로그 íŒŒì¼ íšŒì „ì´ ë°œìƒí•©ë‹ˆë‹¤." +#: utils/misc/guc_tables.c:3193 +msgid "Maximum number of parallel apply workers per subscription." +msgstr "구ë…ì„ ìœ„í•œ í…Œì´ë¸” 병렬 ë™ê¸°í™” 작업ìžì˜ 최대 수" + +#: utils/misc/guc_tables.c:3203 +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "ê°•ì œ 로그 íŒŒì¼ ë°”ê¾¸ê¸° ì „ 대기 시간 지정" -#: utils/misc/guc.c:3015 -msgid "Automatic log file rotation will occur after N kilobytes." -msgstr "N킬로바ì´íЏ í›„ì— ìžë™ 로그 íŒŒì¼ íšŒì „ì´ ë°œìƒí•©ë‹ˆë‹¤." +#: utils/misc/guc_tables.c:3215 +msgid "Sets the maximum size a log file can reach before being rotated." +msgstr "로그 íŒŒì¼ ë°”ê¾¸ê¸° ì „ 최대 로그 íŒŒì¼ í¬ê¸° 지정" -#: utils/misc/guc.c:3026 +#: utils/misc/guc_tables.c:3227 msgid "Shows the maximum number of function arguments." msgstr "함수 ì¸ìžì˜ 최대 갯수를 ë³´ì—¬ì¤ë‹ˆë‹¤" -#: utils/misc/guc.c:3037 +#: utils/misc/guc_tables.c:3238 msgid "Shows the maximum number of index keys." msgstr "ì¸ë±ìФ í‚¤ì˜ ìµœëŒ€ê°œìˆ˜ë¥¼ ë³´ì—¬ì¤ë‹ˆë‹¤." -#: utils/misc/guc.c:3048 +#: utils/misc/guc_tables.c:3249 msgid "Shows the maximum identifier length." msgstr "최대 ì‹ë³„ìž ê¸¸ì´ë¥¼ 표시합니다." -#: utils/misc/guc.c:3059 +#: utils/misc/guc_tables.c:3260 msgid "Shows the size of a disk block." msgstr "ë””ìŠ¤í¬ ë¸”ë¡ì˜ í¬ê¸°ë¥¼ 표시합니다." -#: utils/misc/guc.c:3070 +#: utils/misc/guc_tables.c:3271 msgid "Shows the number of pages per disk file." msgstr "ë””ìŠ¤í¬ íŒŒì¼ë‹¹ 페ì´ì§€ 수를 표시합니다." -#: utils/misc/guc.c:3081 +#: utils/misc/guc_tables.c:3282 msgid "Shows the block size in the write ahead log." msgstr "미리 쓰기 ë¡œê·¸ì˜ ë¸”ë¡ í¬ê¸°ë¥¼ 표시합니다." -#: utils/misc/guc.c:3092 +#: utils/misc/guc_tables.c:3293 msgid "" "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "" +"실패한 ì‹œë„ í›„ WAL ê²€ìƒ‰ì„ ë‹¤ì‹œ 시ë„하기 ì „ì— ê¸°ë‹¤ë¦¬ëŠ” ì‹œê°„ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:3104 +#: utils/misc/guc_tables.c:3305 msgid "Shows the size of write ahead log segments." msgstr "미리 쓰기 로그 세그먼트당 페ì´ì§€ í¬ê¸°ë¥¼ 표시합니다." -#: utils/misc/guc.c:3117 +#: utils/misc/guc_tables.c:3318 +msgid "Time for which WAL summary files should be kept." +msgstr "WAL 요약 파ì¼ì„ 보관해야 하는 시간입니다." + +#: utils/misc/guc_tables.c:3331 msgid "Time to sleep between autovacuum runs." msgstr "ìžë™ 청소 실행 사ì´ì˜ 절전 모드 시간입니다." -#: utils/misc/guc.c:3127 +#: utils/misc/guc_tables.c:3341 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "청소 ì „ì˜ ìµœì†Œ 튜플 ì—…ë°ì´íЏ ë˜ëŠ” ì‚­ì œ 수입니다." -#: utils/misc/guc.c:3136 +#: utils/misc/guc_tables.c:3350 msgid "" "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert " "vacuums." msgstr "청소를 위한 최소 튜플 삽입 수입니다. -1ì€ insert는 vacuumì—서 제외" -#: utils/misc/guc.c:3145 +#: utils/misc/guc_tables.c:3359 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "통계 ì •ë³´ ìˆ˜ì§‘ì„ ìœ„í•œ 최소 튜플 삽입, ì—…ë°ì´íЏ ë˜ëŠ” ì‚­ì œ 수입니다." -#: utils/misc/guc.c:3155 +#: utils/misc/guc_tables.c:3369 msgid "" "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "" "트랜잭션 ID 겹침 방지를 위해 í…Œì´ë¸”ì— ëŒ€í•´ autovacuum ìž‘ì—…ì„ ìˆ˜í–‰í•  í…Œì´ë¸” 나" "ì´ë¥¼ 지정합니다." -#: utils/misc/guc.c:3166 +#: utils/misc/guc_tables.c:3381 msgid "" "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "" "멀티 트랜잭션 ID 겹침 방지를 위해 í…Œì´ë¸”ì— ëŒ€í•´ autovacuum ìž‘ì—…ì„ ìˆ˜í–‰í•  트랜" "ìž­ì…˜ 나ì´ë¥¼ 지정합니다." -#: utils/misc/guc.c:3176 +#: utils/misc/guc_tables.c:3391 msgid "" "Sets the maximum number of simultaneously running autovacuum worker " "processes." msgstr "ë™ì‹œì— 작업할 수 있는 autovacuum ìž‘ì—…ìž ìµœëŒ€ 수 지정" -#: utils/misc/guc.c:3186 +#: utils/misc/guc_tables.c:3401 msgid "" "Sets the maximum number of parallel processes per maintenance operation." msgstr "유지보수 작업ì—서 사용할 병렬 프로세스 최대 수를 지정" -#: utils/misc/guc.c:3196 +#: utils/misc/guc_tables.c:3411 msgid "Sets the maximum number of parallel processes per executor node." msgstr "실행 노드당 최대 병렬 처리 수 지정" -#: utils/misc/guc.c:3207 +#: utils/misc/guc_tables.c:3422 msgid "" "Sets the maximum number of parallel workers that can be active at one time." msgstr "í•œë²ˆì— ìž‘ì—…í•  수 있는 병렬 ìž‘ì—…ìž ìµœëŒ€ 수 지정" -#: utils/misc/guc.c:3218 +#: utils/misc/guc_tables.c:3433 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "ê° autovacuum ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ê°€ 사용할 메모리 최대치" -#: utils/misc/guc.c:3229 -msgid "" -"Time before a snapshot is too old to read pages changed after the snapshot " -"was taken." -msgstr "" - -#: utils/misc/guc.c:3230 -msgid "A value of -1 disables this feature." -msgstr "ì´ ê°’ì´ -1 ì´ë©´ ì´ ê¸°ëŠ¥ 사용 안함" - -#: utils/misc/guc.c:3240 +#: utils/misc/guc_tables.c:3444 msgid "Time between issuing TCP keepalives." msgstr "TCP ì—°ê²° 유지 실행 간격입니다." -#: utils/misc/guc.c:3241 utils/misc/guc.c:3252 utils/misc/guc.c:3376 +#: utils/misc/guc_tables.c:3445 utils/misc/guc_tables.c:3456 +#: utils/misc/guc_tables.c:3580 msgid "A value of 0 uses the system default." msgstr "ì´ ê°’ì´ 0ì´ë©´ 시스템 기본 ê°’" -#: utils/misc/guc.c:3251 +#: utils/misc/guc_tables.c:3455 msgid "Time between TCP keepalive retransmits." msgstr "TCP keepalive 시간 설정" -#: utils/misc/guc.c:3262 +#: utils/misc/guc_tables.c:3466 msgid "SSL renegotiation is no longer supported; this can only be 0." -msgstr "" +msgstr "SSL 재협ìƒì€ ë” ì´ìƒ ì§€ì›ë˜ì§€ 않습니다. ì´ ê°’ì€ 0ë§Œ 가능합니다." -#: utils/misc/guc.c:3273 +#: utils/misc/guc_tables.c:3477 msgid "Maximum number of TCP keepalive retransmits." msgstr "TCP keepalive í™•ì¸ ìµœëŒ€ 횟수" -#: utils/misc/guc.c:3274 +#: utils/misc/guc_tables.c:3478 msgid "" -"This controls the number of consecutive keepalive retransmits that can be " -"lost before a connection is considered dead. A value of 0 uses the system " -"default." +"Number of consecutive keepalive retransmits that can be lost before a " +"connection is considered dead. A value of 0 uses the system default." msgstr "" -"ì´ ê°’ì€ ì—°ê²°ì´ ì¤‘ë‹¨ëœ ê²ƒìœ¼ë¡œ 간주ë˜ê¸° ì „ì— ì†ì‹¤ë  수 있는 ì—°ì† ì—°ê²° 유" -"ì§€ 재전송 수를 제어합니다. ê°’ 0ì„ ì§€ì •í•˜ë©´ 시스템 기본 ê°’ì´ ì‚¬ìš©ë©ë‹ˆë‹¤." +"ì—°ê²°ì´ ì¤‘ë‹¨ëœ ê²ƒìœ¼ë¡œ 간주ë˜ê¸° ì „ì— ì—°ê²° 유지 ìš”ì²­ì„ ìœ„í•œ ì—°ì†ì ì¸ keepalive " +"패킷 전송 수. 0ì„ ì§€ì •í•˜ë©´ 시스템 기본 ê°’ì´ ì‚¬ìš©ë©ë‹ˆë‹¤." -#: utils/misc/guc.c:3285 +#: utils/misc/guc_tables.c:3489 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "정확한 GIN 기준 ê²€ìƒ‰ì— í—ˆìš©ë˜ëŠ” 최대 ê²°ê³¼ 수를 설정합니다." -#: utils/misc/guc.c:3296 +#: utils/misc/guc_tables.c:3500 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "ë””ìŠ¤í¬ ìºì‹œ ì´ í¬ê¸°ì— 대한 ê³„íš ê´€ë¦¬ìžì˜ ê°€ì •ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:3297 +#: utils/misc/guc_tables.c:3501 msgid "" "That is, the total size of the caches (kernel cache and shared buffers) used " "for PostgreSQL data files. This is measured in disk pages, which are " @@ -27634,59 +32266,89 @@ msgstr "" "즉, PostgreSQLì—서 사용하는 ì´ ìºì‹œ í¬ê¸°ìž…니다(ì»¤ë„ ìºì‹œì™€ 공유 ë²„í¼ ëª¨ë‘ í¬" "함). ì´ ê°’ì€ ë””ìŠ¤í¬ íŽ˜ì´ì§€ 단위로 측정ë˜ë©°, ì¼ë°˜ì ìœ¼ë¡œ ê°ê° 8kB입니다." -#: utils/misc/guc.c:3308 +#: utils/misc/guc_tables.c:3512 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "병렬 조회를 위한 최소 í…Œì´ë¸” ìžë£ŒëŸ‰ 지정" -#: utils/misc/guc.c:3309 +#: utils/misc/guc_tables.c:3513 msgid "" "If the planner estimates that it will read a number of table pages too small " "to reach this limit, a parallel scan will not be considered." msgstr "" +"실행계íšê¸°ê°€ ì´ í•œê³„ì— ë„달하기ì—는 너무 ìž‘ì€ ìˆ˜ì˜ í…Œì´ë¸” 페ì´ì§€ë¥¼ ì½ì„ 것으로 " +"추정하는 경우 병렬 ìŠ¤ìº”ì€ ê³ ë ¤í•˜ì§€ 않습니다." -#: utils/misc/guc.c:3319 +#: utils/misc/guc_tables.c:3523 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "병렬 조회를 위한 최소 ì¸ë±ìФ ìžë£ŒëŸ‰ 지정" -#: utils/misc/guc.c:3320 +#: utils/misc/guc_tables.c:3524 msgid "" "If the planner estimates that it will read a number of index pages too small " "to reach this limit, a parallel scan will not be considered." msgstr "" +"실행계íšê¸°ê°€ ì´ í•œê³„ì— ë„달하기ì—는 너무 ìž‘ì€ ìˆ˜ì˜ ì¸ë±ìФ 페ì´ì§€ë¥¼ ì½ì„ 것으로 " +"추정하는 경우 병렬 ìŠ¤ìº”ì€ ê³ ë ¤í•˜ì§€ 않습니다." -#: utils/misc/guc.c:3331 +#: utils/misc/guc_tables.c:3535 msgid "Shows the server version as an integer." msgstr "서버 ë²„ì „ì„ ì •ìˆ˜í˜•ìœ¼ë¡œ ë³´ì—¬ì¤ë‹ˆë‹¤" -#: utils/misc/guc.c:3342 +#: utils/misc/guc_tables.c:3546 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "ì´ í‚¬ë¡œë°”ì´íЏ 수보다 í° ìž„ì‹œ 파ì¼ì˜ ì‚¬ìš©ì„ ê¸°ë¡í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:3343 +#: utils/misc/guc_tables.c:3547 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "" "0ì„ ì§€ì •í•˜ë©´ 모든 파ì¼ì´ 기ë¡ë©ë‹ˆë‹¤. 기본 ê°’ì€ -1로, ì´ ê¸°ëŠ¥ì´ í•´ì œë©ë‹ˆë‹¤." -#: utils/misc/guc.c:3353 +#: utils/misc/guc_tables.c:3557 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "pg_stat_activity.queryì— ì˜ˆì•½ë˜ëŠ” í¬ê¸°(ë°”ì´íЏ)를 설정합니다." -#: utils/misc/guc.c:3364 +#: utils/misc/guc_tables.c:3568 msgid "Sets the maximum size of the pending list for GIN index." msgstr "GIN ì¸ë±ìŠ¤ë¥¼ 위한 팬딩(pending) 목ë¡ì˜ 최대 í¬ê¸° 지정" -#: utils/misc/guc.c:3375 +#: utils/misc/guc_tables.c:3579 msgid "TCP user timeout." -msgstr "" +msgstr "TCP ì‚¬ìš©ìž ì œí•œì‹œê°„." + +#: utils/misc/guc_tables.c:3590 +msgid "The size of huge page that should be requested." +msgstr "요청ë˜ëŠ” huge page í¬ê¸°" + +#: utils/misc/guc_tables.c:3601 +msgid "Aggressively flush system caches for debugging purposes." +msgstr "디버킹 처리를 위해 ì ê·¹ì ìœ¼ë¡œ 시스템 ìºì‹œë¥¼ 비ì›ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:3624 +msgid "" +"Sets the time interval between checks for disconnection while running " +"queries." +msgstr "쿼리 실행 ì¤‘ì— ì—°ê²°ì„ ëŠì„ì§€ 검사하는 ê°„ê²©ì„ ì§€ì •í•©ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:3635 +msgid "Time between progress updates for long-running startup operations." +msgstr "ì—°ê²° ìž‘ì—…ì´ ì˜¤ëž˜ ì§„í–‰ë˜ëŠ” 경우 ì§„í–‰ ìƒíƒœ 갱신 주기" + +#: utils/misc/guc_tables.c:3637 +msgid "0 turns this feature off." +msgstr "0ì„ ì§€ì •í•˜ë©´ ì´ ê¸°ëŠ¥ì´ í•´ì œë©ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:3647 +msgid "Sets the iteration count for SCRAM secret generation." +msgstr "SCRAM 비밀번호 ìƒì„±ìš© ì´í„°ë ˆì´ì…˜ 수를 지정합니다." -#: utils/misc/guc.c:3395 +#: utils/misc/guc_tables.c:3667 msgid "" "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "" "순차ì ìœ¼ë¡œ 접근하는 ë””ìŠ¤í¬ íŽ˜ì´ì§€ì— 대한 ê³„íš ê´€ë¦¬ìžì˜ ì˜ˆìƒ ë¹„ìš©ì„ ì„¤ì •í•©ë‹ˆ" "다." -#: utils/misc/guc.c:3406 +#: utils/misc/guc_tables.c:3678 msgid "" "Sets the planner's estimate of the cost of a nonsequentially fetched disk " "page." @@ -27694,11 +32356,11 @@ msgstr "" "비순차ì ìœ¼ë¡œ 접근하는 ë””ìŠ¤í¬ íŽ˜ì´ì§€ì— 대한 ê³„íš ê´€ë¦¬ìžì˜ ì˜ˆìƒ ë¹„ìš©ì„ ì„¤ì •í•©ë‹ˆ" "다." -#: utils/misc/guc.c:3417 +#: utils/misc/guc_tables.c:3689 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "ê° íŠœí”Œ(í–‰)ì— ëŒ€í•œ ê³„íš ê´€ë¦¬ìžì˜ ì˜ˆìƒ ì²˜ë¦¬ ë¹„ìš©ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:3428 +#: utils/misc/guc_tables.c:3700 msgid "" "Sets the planner's estimate of the cost of processing each index entry " "during an index scan." @@ -27706,7 +32368,7 @@ msgstr "" "실행 계íšê¸°ì˜ 비용 ê³„ì‚°ì— ì‚¬ìš©ë  ì¸ë±ìФ 스캔으로 ê° ì¸ë±ìФ í•­ëª©ì„ ì²˜ë¦¬í•˜ëŠ” 예" "ìƒ ì²˜ë¦¬ ë¹„ìš©ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:3439 +#: utils/misc/guc_tables.c:3711 msgid "" "Sets the planner's estimate of the cost of processing each operator or " "function call." @@ -27714,77 +32376,87 @@ msgstr "" "실행 계íšê¸°ì˜ 비용 ê³„ì‚°ì— ì‚¬ìš©ë  í•¨ìˆ˜ 호출ì´ë‚˜ ì—°ì‚°ìž ì—°ì‚° 처리하는 ì˜ˆìƒ ì²˜" "리 ë¹„ìš©ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:3450 +#: utils/misc/guc_tables.c:3722 msgid "" "Sets the planner's estimate of the cost of passing each tuple (row) from " -"worker to master backend." -msgstr "ê° íŠœí”Œ(í–‰)ì— ëŒ€í•œ ê³„íš ê´€ë¦¬ìžì˜ ì˜ˆìƒ ì²˜ë¦¬ ë¹„ìš©ì„ ì„¤ì •í•©ë‹ˆë‹¤." +"worker to leader backend." +msgstr "" +"ê° íŠœí”Œ(í–‰)ì„ ìž‘ì—…ìžì—서 ë¦¬ë” ë°±ì—”ë“œë¡œ 보내는 ì˜ˆìƒ ë¹„ìš©ì„ ì‹¤í–‰ê³„íšê¸°ì— 설정합" +"니다." -#: utils/misc/guc.c:3461 +#: utils/misc/guc_tables.c:3733 msgid "" "Sets the planner's estimate of the cost of starting up worker processes for " "parallel query." msgstr "" +"병렬 쿼리를 위해 ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ ì‹œìž‘í•˜ëŠ”ë° ë“œëŠ” ì˜ˆìƒ ë¹„ìš©ì„ ì‹¤í–‰ê³„íšê¸°ì— 설" +"정합니다." -#: utils/misc/guc.c:3473 +#: utils/misc/guc_tables.c:3745 msgid "Perform JIT compilation if query is more expensive." -msgstr "" +msgstr "쿼리 수행 ì˜ˆìƒ ë¹„ìš©ì´ ì´ ê°’ë³´ë‹¤ í¬ë©´, JIT ì§œê¹ê¸°ë¥¼ 수행" -#: utils/misc/guc.c:3474 +#: utils/misc/guc_tables.c:3746 msgid "-1 disables JIT compilation." -msgstr "" +msgstr "-1 = JIT ì§œê¹ê¸° 안함" -#: utils/misc/guc.c:3484 -msgid "Optimize JITed functions if query is more expensive." -msgstr "" +#: utils/misc/guc_tables.c:3756 +msgid "Optimize JIT-compiled functions if query is more expensive." +msgstr "쿼리 수행 ì˜ˆìƒ ë¹„ìš©ì´ ì´ ê°’ë³´ë‹¤ í¬ë©´, JIT-컴파ì¼ëœ 함수 최ì í™” 함" -#: utils/misc/guc.c:3485 +#: utils/misc/guc_tables.c:3757 msgid "-1 disables optimization." -msgstr "-1 최ì í™” 비활성화" +msgstr "-1 = 최ì í™” 비활성화" -#: utils/misc/guc.c:3495 +#: utils/misc/guc_tables.c:3767 msgid "Perform JIT inlining if query is more expensive." -msgstr "" +msgstr "쿼리 수행 ì˜ˆìƒ ë¹„ìš©ì´ ì´ ê°’ë³´ë‹¤ í¬ë©´, JIT ì¸ë¼ì¸ 작업 수행" -#: utils/misc/guc.c:3496 +#: utils/misc/guc_tables.c:3768 msgid "-1 disables inlining." -msgstr "" +msgstr "-1 = ì¸ë¼ì¸ 기능 ë”" -#: utils/misc/guc.c:3506 +#: utils/misc/guc_tables.c:3778 msgid "" "Sets the planner's estimate of the fraction of a cursor's rows that will be " "retrieved." msgstr "ê²€ìƒ‰ë  ì»¤ì„œ í–‰ì— ëŒ€í•œ ê³„íš ê´€ë¦¬ìžì˜ ì˜ˆìƒ ë¶„ìˆ˜ ê°’ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:3518 +#: utils/misc/guc_tables.c:3790 +msgid "" +"Sets the planner's estimate of the average size of a recursive query's " +"working table." +msgstr "재귀 호출 쿼리 ëŒ€ìƒ í…Œì´ë¸”ì˜ í‰ê·  í¬ê¸°ë¥¼ 실행 계íšê¸°ì— 설정 함" + +#: utils/misc/guc_tables.c:3802 msgid "GEQO: selective pressure within the population." msgstr "GEQO: 모집단 ë‚´ì˜ ì„ íƒ ì••ë ¥ìž…ë‹ˆë‹¤." -#: utils/misc/guc.c:3529 +#: utils/misc/guc_tables.c:3813 msgid "GEQO: seed for random path selection." msgstr "GEQO: 무작위 경로 ì„ íƒì„ 위한 씨드" -#: utils/misc/guc.c:3540 -msgid "Multiple of work_mem to use for hash tables." -msgstr "" +#: utils/misc/guc_tables.c:3824 +msgid "Multiple of \"work_mem\" to use for hash tables." +msgstr "í…Œì´ë¸” 해시 작업ì—서 쓸 \"work_mem\" ê°’ì˜ ë°°ìœ¨" -#: utils/misc/guc.c:3551 +#: utils/misc/guc_tables.c:3835 msgid "Multiple of the average buffer usage to free per round." msgstr "ë¼ìš´ë“œë‹¹ 해제할 í‰ê·  ë²„í¼ ì‚¬ìš©ì˜ ë°°ìˆ˜ìž…ë‹ˆë‹¤." -#: utils/misc/guc.c:3561 +#: utils/misc/guc_tables.c:3845 msgid "Sets the seed for random-number generation." msgstr "난수 ìƒì„± ì†ë„를 설정합니다." -#: utils/misc/guc.c:3572 +#: utils/misc/guc_tables.c:3856 msgid "Vacuum cost delay in milliseconds." msgstr "청소 비용 지연(밀리초)입니다." -#: utils/misc/guc.c:3583 +#: utils/misc/guc_tables.c:3867 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "ìžë™ ì²­ì†Œì— ëŒ€í•œ 청소 비용 지연(밀리초)입니다." -#: utils/misc/guc.c:3594 +#: utils/misc/guc_tables.c:3878 msgid "" "Number of tuple updates or deletes prior to vacuum as a fraction of " "reltuples." @@ -27792,11 +32464,11 @@ msgstr "" "vacuum ìž‘ì—…ì„ ì§„í–‰í•  update, delete ìž‘ì—…ëŸ‰ì„ ì „ì²´ ìžë£Œì— 대한 분수값으로 지정" "합니다." -#: utils/misc/guc.c:3604 +#: utils/misc/guc_tables.c:3888 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." -msgstr "" +msgstr "vacuumì„ ìœ„í•œ ì „ì²´ 튜플 대비 insert íŠœí”Œì˜ ë¹„ìœ¨" -#: utils/misc/guc.c:3614 +#: utils/misc/guc_tables.c:3898 msgid "" "Number of tuple inserts, updates, or deletes prior to analyze as a fraction " "of reltuples." @@ -27804,808 +32476,618 @@ msgstr "" "통계 수집 ìž‘ì—…ì„ ì§„í–‰í•  insert, update, delete ìž‘ì—…ëŸ‰ì„ ì „ì²´ ìžë£Œì— 대한 분수" "값으로 지정합니다." -#: utils/misc/guc.c:3624 +#: utils/misc/guc_tables.c:3908 msgid "" "Time spent flushing dirty buffers during checkpoint, as fraction of " "checkpoint interval." -msgstr "" -"ì²´í¬í¬ì¸íЏ 반복 주기 ì•ˆì— ìž‘ì—…ì„ ì™„ë£Œí•  분수값(1=100%)" +msgstr "ì²´í¬í¬ì¸íЏ 반복 주기 ì•ˆì— ìž‘ì—…ì„ ì™„ë£Œí•  분수값(1=100%)" -#: utils/misc/guc.c:3634 +#: utils/misc/guc_tables.c:3918 msgid "" -"Number of tuple inserts prior to index cleanup as a fraction of reltuples." -msgstr "" - -#: utils/misc/guc.c:3644 -msgid "Fraction of statements exceeding log_min_duration_sample to be logged." -msgstr "" +"Fraction of statements exceeding \"log_min_duration_sample\" to be logged." +msgstr "\"log_min_duration_sample\" ë¡œê·¸ì˜ ë¹„ìœ¨" -#: utils/misc/guc.c:3645 +#: utils/misc/guc_tables.c:3919 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." -msgstr "" +msgstr "0.0 (로그 안남김)ì—서 1.0(ëª¨ë‘ ë‚¨ê¹€) ê°’ì„ ì§€ì •í•  수 있ìŒ" -#: utils/misc/guc.c:3654 -msgid "Set the fraction of transactions to log for new transactions." -msgstr "새 íŠ¸ëžœìž­ì…˜ì— ëŒ€í•´ì„œ ë¡œê·¸ì— ë‚¨ê¸¸ 트랜잭션 ë¹„ìœ¨ì„ ì„¤ì •í•©ë‹ˆë‹¤." +#: utils/misc/guc_tables.c:3928 +msgid "Sets the fraction of transactions from which to log all statements." +msgstr "모든 êµ¬ë¬¸ì„ ë¡œê·¸ë¡œ 남기려고 í•  때, ê·¸ 남길 비율" -#: utils/misc/guc.c:3655 +#: utils/misc/guc_tables.c:3929 msgid "" -"Logs all statements from a fraction of transactions. Use a value between 0.0 " -"(never log) and 1.0 (log all statements for all transactions)." -msgstr "" +"Use a value between 0.0 (never log) and 1.0 (log all statements for all " +"transactions)." +msgstr "0.0(ëª¨ë‘ ì•ˆ 남김) 부터 1.0 (ëª¨ë‘ ë‚¨ê¹€)까지 지정할 수 있습니다." -#: utils/misc/guc.c:3675 +#: utils/misc/guc_tables.c:3948 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "WAL 파ì¼ì„ ì•„ì¹´ì´ë¹™í•˜ê¸° 위해 í˜¸ì¶œë  ì…¸ ëª…ë ¹ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:3685 +#: utils/misc/guc_tables.c:3949 +msgid "This is used only if \"archive_library\" is not set." +msgstr "ì´ ì„¤ì •ì€ \"archive_library\" ì„¤ì •ì´ ì•ˆë˜ì–´ ìžˆì„ ë•Œë§Œ ìž‘ë™í•©ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:3958 +msgid "Sets the library that will be called to archive a WAL file." +msgstr "WAL 파ì¼ì„ ì•„ì¹´ì´ë¹™í•˜ê¸° 위해 í˜¸ì¶œë  ì…¸ ëª…ë ¹ì„ ì„¤ì •í•©ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:3959 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "\"archive_command\" ì„¤ì •ê°’ì€ ë¹ˆ 문ìžì—´ì´ì–´ì•¼ 합니다." + +#: utils/misc/guc_tables.c:3968 msgid "" "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "ì•„ì¹´ì´ë¸Œëœ WAL 파ì¼ì„ 재 ë°˜ì˜í•  쉘 명령어를 설정합니다." -#: utils/misc/guc.c:3695 +#: utils/misc/guc_tables.c:3978 msgid "Sets the shell command that will be executed at every restart point." msgstr "매 복구 ìž‘ì—…ì´ ë난 ë‹¤ìŒ ì‹¤í–‰í•  쉘 명령어를 설정합니다." -#: utils/misc/guc.c:3705 +#: utils/misc/guc_tables.c:3988 msgid "" "Sets the shell command that will be executed once at the end of recovery." msgstr "복구 작업 ëì— í•œ 번 ì‹¤í–‰ë  ì‰˜ 명령어를 설정합니다." -#: utils/misc/guc.c:3715 +#: utils/misc/guc_tables.c:3998 msgid "Specifies the timeline to recover into." msgstr "복구할 타임ë¼ì¸ì„ 지정합니다." -#: utils/misc/guc.c:3725 +#: utils/misc/guc_tables.c:4008 msgid "" "Set to \"immediate\" to end recovery as soon as a consistent state is " "reached." -msgstr "" +msgstr "복구를 ë내는 ì§€ì ì„ 가장 최근으로 하려면, \"immediate\"로 지정하세요." -#: utils/misc/guc.c:3734 +#: utils/misc/guc_tables.c:4017 msgid "Sets the transaction ID up to which recovery will proceed." -msgstr "" +msgstr "복구를 ë낼 마지막 트랜잭션 ID 지정" -#: utils/misc/guc.c:3743 +#: utils/misc/guc_tables.c:4026 msgid "Sets the time stamp up to which recovery will proceed." -msgstr "" +msgstr "복구를 ë낼 마지막 시간 지정" -#: utils/misc/guc.c:3752 +#: utils/misc/guc_tables.c:4035 msgid "Sets the named restore point up to which recovery will proceed." -msgstr "" +msgstr "복구를 ë낼 복구 ì§€ì  ì´ë¦„ 지정" -#: utils/misc/guc.c:3761 +#: utils/misc/guc_tables.c:4044 msgid "" "Sets the LSN of the write-ahead log location up to which recovery will " "proceed." -msgstr "" +msgstr "복구용 미리 쓰기 ë¡œê·¸ì˜ ë³µêµ¬ ì§€ì  LSN 지정" -#: utils/misc/guc.c:3771 -msgid "Specifies a file name whose presence ends recovery in the standby." -msgstr "" - -#: utils/misc/guc.c:3781 +#: utils/misc/guc_tables.c:4054 msgid "Sets the connection string to be used to connect to the sending server." -msgstr "" +msgstr "트랜잭션 로그를 보내는 서버로 ì ‘ì†í•˜ê¸° 위한 ì ‘ì† ë¬¸ìžì—´ 지정" -#: utils/misc/guc.c:3792 +#: utils/misc/guc_tables.c:4065 msgid "Sets the name of the replication slot to use on the sending server." msgstr "복제 슬롯 ì´ë¦„ì„ ì§€ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:3802 +#: utils/misc/guc_tables.c:4075 msgid "Sets the client's character set encoding." msgstr "í´ë¼ì´ì–¸íЏ ë¬¸ìž ì„¸íŠ¸ ì¸ì½”ë”©ì„ ì§€ì •í•¨" -#: utils/misc/guc.c:3813 +#: utils/misc/guc_tables.c:4086 msgid "Controls information prefixed to each log line." msgstr "ê° ë¡œê·¸ 줄 ì•žì— ì¶”ê°€í•  정보를 제어합니다." -#: utils/misc/guc.c:3814 +#: utils/misc/guc_tables.c:4087 msgid "If blank, no prefix is used." msgstr "비워 ë‘ë©´ ì ‘ë‘사가 사용ë˜ì§€ 않습니다." -#: utils/misc/guc.c:3823 +#: utils/misc/guc_tables.c:4096 msgid "Sets the time zone to use in log messages." msgstr "로그 ë©”ì‹œì§€ì— ì‚¬ìš©í•  표준 시간대를 설정합니다." -#: utils/misc/guc.c:3833 +#: utils/misc/guc_tables.c:4106 msgid "Sets the display format for date and time values." msgstr "날짜와 시간 ê°’ì„ ë‚˜íƒ€ë‚´ëŠ” ëª¨ì–‘ì„ ì§€ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:3834 +#: utils/misc/guc_tables.c:4107 msgid "Also controls interpretation of ambiguous date inputs." msgstr "ë˜í•œ 모호한 ë‚ ì§œ ìž…ë ¥ì˜ í•´ì„ì„ ì œì–´í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:3845 +#: utils/misc/guc_tables.c:4118 msgid "Sets the default table access method for new tables." msgstr "새 í…Œì´ë¸”ì—서 사용할 기본 í…Œì´ë¸” ì ‘ê·¼ ë°©ë²•ì„ ì§€ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:3856 +#: utils/misc/guc_tables.c:4129 msgid "Sets the default tablespace to create tables and indexes in." msgstr "í…Œì´ë¸” ë° ì¸ë±ìŠ¤ë¥¼ 만들 기본 í…Œì´ë¸”스페ì´ìŠ¤ë¥¼ 설정합니다." -#: utils/misc/guc.c:3857 +#: utils/misc/guc_tables.c:4130 msgid "An empty string selects the database's default tablespace." msgstr "빈 문ìžì—´ì„ 지정하면 ë°ì´í„°ë² ì´ìŠ¤ì˜ ê¸°ë³¸ í…Œì´ë¸”스페ì´ìŠ¤ê°€ ì„ íƒë©ë‹ˆë‹¤." -#: utils/misc/guc.c:3867 +#: utils/misc/guc_tables.c:4140 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "임시 í…Œì´ë¸” ë° ì •ë ¬ 파ì¼ì— 사용할 í…Œì´ë¸”스페ì´ìŠ¤ë¥¼ 설정합니다." -#: utils/misc/guc.c:3878 +#: utils/misc/guc_tables.c:4151 +msgid "" +"Sets whether a CREATEROLE user automatically grants the role to themselves, " +"and with which options." +msgstr "CREATEROLE ê¶Œí•œì´ ìžˆëŠ” 사용ìžê°€ ìžë™ìœ¼ë¡œ 스스로ì—게 부여할 옵션 지정" + +#: utils/misc/guc_tables.c:4163 msgid "Sets the path for dynamically loadable modules." msgstr "ë™ì ìœ¼ë¡œ 불러올 수 있는 ëª¨ë“ˆë“¤ì´ ìžˆëŠ” 경로를 지정함." -#: utils/misc/guc.c:3879 +#: utils/misc/guc_tables.c:4164 msgid "" "If a dynamically loadable module needs to be opened and the specified name " "does not have a directory component (i.e., the name does not contain a " "slash), the system will search this path for the specified file." msgstr "" -"ë™ì ìœ¼ë¡œ 로드 가능한 ëª¨ë“ˆì„ ì—´ì–´ì•¼ í•˜ëŠ”ë° ì§€ì •í•œ ì´ë¦„ì— ë””ë ‰í„°ë¦¬ 구성 ìš”" -"소가 없는 경우(즉, ì´ë¦„ì— ìŠ¬ëž˜ì‹œê°€ ì—†ìŒ) ì‹œìŠ¤í…œì€ ì´ ê²½ë¡œì—서 지정한 파ì¼ì„ " -"검색합니다." +"ë™ì ìœ¼ë¡œ 로드 가능한 ëª¨ë“ˆì„ ì—´ì–´ì•¼ í•˜ëŠ”ë° í•´ë‹¹ 모듈 ì´ë¦„ì— ë””ë ‰í„°ë¦¬ 구성 요소" +"ê°€ 없는 경우(즉, ì´ë¦„ì— ìŠ¬ëž˜ì‹œ 기호가 없는 경우) ì‹œìŠ¤í…œì€ ì´ ê²½ë¡œì—서 지정한 " +"파ì¼ì„ 검색합니다." -#: utils/misc/guc.c:3892 +#: utils/misc/guc_tables.c:4177 msgid "Sets the location of the Kerberos server key file." msgstr "Kerberos 서버 키 파ì¼ì˜ 위치를 지정함." -#: utils/misc/guc.c:3903 +#: utils/misc/guc_tables.c:4188 msgid "Sets the Bonjour service name." msgstr "Bonjour 서비스 ì´ë¦„ì„ ì§€ì •" -#: utils/misc/guc.c:3915 -msgid "Shows the collation order locale." -msgstr "ë°ì´í„° ì •ë ¬ 순서 로케ì¼ì„ 표시합니다." - -#: utils/misc/guc.c:3926 -msgid "Shows the character classification and case conversion locale." -msgstr "ë¬¸ìž ë¶„ë¥˜ ë° ëŒ€/ì†Œë¬¸ìž ë³€í™˜ 로케ì¼ì„ 표시합니다." - -#: utils/misc/guc.c:3937 +#: utils/misc/guc_tables.c:4198 msgid "Sets the language in which messages are displayed." msgstr "보여질 메시지로 사용할 언어 지정." -#: utils/misc/guc.c:3947 +#: utils/misc/guc_tables.c:4208 msgid "Sets the locale for formatting monetary amounts." msgstr "통화금액 표현 ì–‘ì‹ìœ¼ë¡œ 사용할 ë¡œì¼€ì¼ ì§€ì •." -#: utils/misc/guc.c:3957 +#: utils/misc/guc_tables.c:4218 msgid "Sets the locale for formatting numbers." msgstr "ìˆ«ìž í‘œí˜„ ì–‘ì‹ìœ¼ë¡œ 사용할 ë¡œì¼€ì¼ ì§€ì •." -#: utils/misc/guc.c:3967 +#: utils/misc/guc_tables.c:4228 msgid "Sets the locale for formatting date and time values." msgstr "날짜와 시간 ê°’ì„ í‘œí˜„í•  ì–‘ì‹ìœ¼ë¡œ 사용할 ë¡œì¼€ì¼ ì§€ì •." -#: utils/misc/guc.c:3977 +#: utils/misc/guc_tables.c:4238 msgid "Lists shared libraries to preload into each backend." msgstr "ê°ê°ì˜ ë°±ì—”ë“œì— ë¯¸ë¦¬ 불러올 공유 ë¼ì´ë¸ŒëŸ¬ë¦¬ë“¤ì„ 지정합니다" -#: utils/misc/guc.c:3988 +#: utils/misc/guc_tables.c:4249 msgid "Lists shared libraries to preload into server." msgstr "ì„œë²„ì— ë¯¸ë¦¬ 불러올 공유 ë¼ì´ë¸ŒëŸ¬ë¦¬ë“¤ì„ 지정합니다" -#: utils/misc/guc.c:3999 +#: utils/misc/guc_tables.c:4260 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "" "ê°ê°ì˜ ë°±ì—”ë“œì— ë¯¸ë¦¬ 불러올 접근제한 없는 공유 ë¼ì´ë¸ŒëŸ¬ë¦¬ë“¤ì„ 지정합니다" -#: utils/misc/guc.c:4010 +#: utils/misc/guc_tables.c:4271 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "스키마로 한정ë˜ì§€ ì•Šì€ ì´ë¦„ì˜ ìŠ¤í‚¤ë§ˆ 검색 순서를 설정합니다." -#: utils/misc/guc.c:4022 -msgid "Sets the server (database) character set encoding." -msgstr "서버 ë¬¸ìž ì½”ë“œ 세트 ì¸ì½”딩 지정." +#: utils/misc/guc_tables.c:4283 +msgid "Shows the server (database) character set encoding." +msgstr "서버 (ë°ì´í„°ë² ì´ìФ) ë¬¸ìž ì„¸íŠ¸ ì¸ì½”딩 보여줌" -#: utils/misc/guc.c:4034 +#: utils/misc/guc_tables.c:4295 msgid "Shows the server version." msgstr "서버 버전 ë³´ìž„." -#: utils/misc/guc.c:4046 +#: utils/misc/guc_tables.c:4307 msgid "Sets the current role." msgstr "현재 ë¡¤ì„ ì§€ì •" -#: utils/misc/guc.c:4058 +#: utils/misc/guc_tables.c:4319 msgid "Sets the session user name." msgstr "세션 ì‚¬ìš©ìž ì´ë¦„ 지정." -#: utils/misc/guc.c:4069 +#: utils/misc/guc_tables.c:4330 msgid "Sets the destination for server log output." msgstr "서버 로그 ì¶œë ¥ì„ ìœ„í•œ 대ìƒì„ 지정합니다." -#: utils/misc/guc.c:4070 +#: utils/misc/guc_tables.c:4331 msgid "" -"Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and " -"\"eventlog\", depending on the platform." +"Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", " +"\"jsonlog\", and \"eventlog\", depending on the platform." msgstr "" -"유효한 ê°’ì€ í”Œëž«í¼ì— ë”°ë¼ \"stderr\", \"syslog\", \"csvlog\" ë° \"eventlog" -"\"ì˜ ì¡°í•©ìž…ë‹ˆë‹¤." +"유효한 ê°’ì€ í”Œëž«í¼ì— ë”°ë¼ \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\" ë° " +"\"eventlog\"ì˜ ì¡°í•©ìž…ë‹ˆë‹¤." -#: utils/misc/guc.c:4081 +#: utils/misc/guc_tables.c:4342 msgid "Sets the destination directory for log files." msgstr "로그 파ì¼ì˜ ëŒ€ìƒ ë””ë ‰í„°ë¦¬ë¥¼ 설정합니다." -#: utils/misc/guc.c:4082 +#: utils/misc/guc_tables.c:4343 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "ë°ì´í„° ë””ë ‰í„°ë¦¬ì˜ ìƒëŒ€ 경로 ë˜ëŠ” 절대 경로로 지정할 수 있습니다." -#: utils/misc/guc.c:4092 +#: utils/misc/guc_tables.c:4353 msgid "Sets the file name pattern for log files." msgstr "로그 파ì¼ì˜ íŒŒì¼ ì´ë¦„ íŒ¨í„´ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:4103 +#: utils/misc/guc_tables.c:4364 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "syslogì—서 구분할 PostgreSQL ë©”ì‹œì§€ì— ì‚¬ìš©ë  í”„ë¡œê·¸ëž¨ ì´ë¦„ì„ ì§€ì •." -#: utils/misc/guc.c:4114 +#: utils/misc/guc_tables.c:4375 msgid "" "Sets the application name used to identify PostgreSQL messages in the event " "log." msgstr "" "ì´ë²¤íЏ 로그ì—서 PostgreSQL 메시지 ì‹ë³„ìžë¡œ 사용할 ì‘용프로그램 ì´ë¦„ 지정" -#: utils/misc/guc.c:4125 +#: utils/misc/guc_tables.c:4386 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "시간대(time zone)를 지정함." -#: utils/misc/guc.c:4135 +#: utils/misc/guc_tables.c:4396 msgid "Selects a file of time zone abbreviations." msgstr "표준 시간대 약어 파ì¼ì„ ì„ íƒí•©ë‹ˆë‹¤." -#: utils/misc/guc.c:4145 +#: utils/misc/guc_tables.c:4406 msgid "Sets the owning group of the Unix-domain socket." msgstr "유닉스 ë„ë©”ì¸ ì†Œì¼“ì˜ ì†Œìœ ì£¼ë¥¼ 지정" -#: utils/misc/guc.c:4146 +#: utils/misc/guc_tables.c:4407 msgid "" "The owning user of the socket is always the user that starts the server." msgstr "소켓 소유ìžëŠ” í•­ìƒ ì„œë²„ë¥¼ 시작하는 사용ìžìž…니다." -#: utils/misc/guc.c:4156 +#: utils/misc/guc_tables.c:4417 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "유닉스 ë„ë©”ì¸ ì†Œì¼“ì„ ë§Œë“¤ 디렉터리를 지정합니다." -#: utils/misc/guc.c:4171 +#: utils/misc/guc_tables.c:4428 msgid "Sets the host name or IP address(es) to listen to." msgstr "서비스할 호스트ì´ë¦„ì´ë‚˜, IP를 지정함." -#: utils/misc/guc.c:4186 +#: utils/misc/guc_tables.c:4443 msgid "Sets the server's data directory." msgstr "ì„œë²„ì˜ ë°ì´í„° 디렉터리 위치를 지정합니다." -#: utils/misc/guc.c:4197 +#: utils/misc/guc_tables.c:4454 msgid "Sets the server's main configuration file." msgstr "ì„œë²„ì˜ ê¸°ë³¸ 환경설정 íŒŒì¼ ê²½ë¡œë¥¼ 지정합니다." -#: utils/misc/guc.c:4208 +#: utils/misc/guc_tables.c:4465 msgid "Sets the server's \"hba\" configuration file." msgstr "ì„œë²„ì˜ \"hba\" 구성 파ì¼ì„ 설정합니다." -#: utils/misc/guc.c:4219 +#: utils/misc/guc_tables.c:4476 msgid "Sets the server's \"ident\" configuration file." msgstr "ì„œë²„ì˜ \"ident\" 구성 파ì¼ì„ 설정합니다." -#: utils/misc/guc.c:4230 +#: utils/misc/guc_tables.c:4487 msgid "Writes the postmaster PID to the specified file." msgstr "postmaster PIDê°€ 기ë¡ëœ 파ì¼ì˜ 경로를 지정합니다." -#: utils/misc/guc.c:4241 -msgid "Name of the SSL library." -msgstr "" +#: utils/misc/guc_tables.c:4498 +msgid "Shows the name of the SSL library." +msgstr "SSL ë¼ì´ë¸ŒëŸ¬ë¦¬ ì´ë¦„ì„ ë³´ì—¬ì¤Œ" -#: utils/misc/guc.c:4256 +#: utils/misc/guc_tables.c:4513 msgid "Location of the SSL server certificate file." msgstr "서버 ì¸ì¦ì„œ íŒŒì¼ ìœ„ì¹˜ë¥¼ 지정함" -#: utils/misc/guc.c:4266 +#: utils/misc/guc_tables.c:4523 msgid "Location of the SSL server private key file." msgstr "SSL 서버 ê°œì¸ í‚¤ 파ì¼ì˜ 위치를 지정함." -#: utils/misc/guc.c:4276 +#: utils/misc/guc_tables.c:4533 msgid "Location of the SSL certificate authority file." -msgstr "" +msgstr "SSL ì¸ì¦ authority íŒŒì¼ ìœ„ì¹˜" -#: utils/misc/guc.c:4286 +#: utils/misc/guc_tables.c:4543 msgid "Location of the SSL certificate revocation list file." msgstr "SSL ì¸ì¦ì„œ 파기 ëª©ë¡ íŒŒì¼ì˜ 위치" -#: utils/misc/guc.c:4296 -msgid "Writes temporary statistics files to the specified directory." -msgstr "지정한 ë””ë ‰í„°ë¦¬ì— ìž„ì‹œ 통계 파ì¼ì„ ì”니다." +#: utils/misc/guc_tables.c:4553 +msgid "Location of the SSL certificate revocation list directory." +msgstr "SSL ì¸ì¦ì„œ 파기 ëª©ë¡ ë””ë ‰í„°ë¦¬ 위치" -#: utils/misc/guc.c:4307 +#: utils/misc/guc_tables.c:4563 msgid "" "Number of synchronous standbys and list of names of potential synchronous " "ones." -msgstr "" +msgstr "ë™ê¸°ì‹ 복제용 대기 서버 수와 ìš´ì˜ ì„œë²„ 전환 대ìƒì´ ë˜ëŠ” 서버 ì´ë¦„ 목ë¡" -#: utils/misc/guc.c:4318 +#: utils/misc/guc_tables.c:4574 msgid "Sets default text search configuration." msgstr "기본 í…스트 검색 êµ¬ì„±ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:4328 +#: utils/misc/guc_tables.c:4584 msgid "Sets the list of allowed SSL ciphers." msgstr "허용ë˜ëŠ” SSL 암호 목ë¡ì„ 설정합니다." -#: utils/misc/guc.c:4343 +#: utils/misc/guc_tables.c:4599 msgid "Sets the curve to use for ECDH." msgstr "ECDHì— ì‚¬ìš©í•  curve 설정" -#: utils/misc/guc.c:4358 +#: utils/misc/guc_tables.c:4614 msgid "Location of the SSL DH parameters file." msgstr "SSL DH 매개 변수 파ì¼ì˜ 위치." -#: utils/misc/guc.c:4369 +#: utils/misc/guc_tables.c:4625 msgid "Command to obtain passphrases for SSL." -msgstr "" +msgstr "SSL 비밀번호 ìž…ë ¥ì„ ìœ„í•œ 명령" -#: utils/misc/guc.c:4380 +#: utils/misc/guc_tables.c:4636 msgid "Sets the application name to be reported in statistics and logs." -msgstr "" +msgstr "통계정보와 ë¡œê·¸ì— í¬í•¨ë  ì‘용프로그램 ì´ë¦„ 지정" -#: utils/misc/guc.c:4391 +#: utils/misc/guc_tables.c:4647 msgid "Sets the name of the cluster, which is included in the process title." -msgstr "" +msgstr "프로세스 타ì´í‹€ì— í¬í•¨ë  í´ëŸ¬ìŠ¤í„° ì´ë¦„ 지정" -#: utils/misc/guc.c:4402 +#: utils/misc/guc_tables.c:4658 msgid "" "Sets the WAL resource managers for which WAL consistency checks are done." -msgstr "" +msgstr "WAL ë™ì‹œì„± 검사 완료용 WAL ìžì› ê´€ë¦¬ìž ì§€ì •" -#: utils/misc/guc.c:4403 +#: utils/misc/guc_tables.c:4659 msgid "" "Full-page images will be logged for all data blocks and cross-checked " "against the results of WAL replay." msgstr "" +"풀페ì´ì§€ ì´ë¯¸ì§€ê°€ 모든 ë°ì´í„° 블ë¡ì„ 위해 기ë¡ë  것ì´ë©° WAL ìž¬ë°˜ì˜ ê²°ê³¼ë¥¼ ì´" +"중 ê²€ì¦ì„ 합니다." -#: utils/misc/guc.c:4413 +#: utils/misc/guc_tables.c:4669 msgid "JIT provider to use." msgstr "사용할 JIT 제공ìž" -#: utils/misc/guc.c:4424 +#: utils/misc/guc_tables.c:4680 msgid "Log backtrace for errors in these functions." msgstr "ì´ í•¨ìˆ˜ë“¤ ì•ˆì— ì˜¤ë¥˜ ì¶”ì ìš© 로그를 남김" -#: utils/misc/guc.c:4444 +#: utils/misc/guc_tables.c:4691 +msgid "Use direct I/O for file access." +msgstr "íŒŒì¼ ì ‘ê·¼ì„ ìœ„í•´ ì§ì ‘ I/O를 사용합니다." + +#: utils/misc/guc_tables.c:4702 +msgid "" +"Lists streaming replication standby server replication slot names that " +"logical WAL sender processes will wait for." +msgstr "" +"논리 WAL 송신 프로세스가 기다릴 ìŠ¤íŠ¸ë¦¬ë° ë³µì œ 대기 서버 복제 슬롯 ì´ë¦„ 목ë¡" + +#: utils/misc/guc_tables.c:4704 +msgid "" +"Logical WAL sender processes will send decoded changes to output plugins " +"only after the specified replication slots have confirmed receiving WAL." +msgstr "" +"논리 WAL 송신 프로세스는 ì§€ì •ëœ ë³µì œ ìŠ¬ë¡¯ì´ WAL ìˆ˜ì‹ ì„ í™•ì¸í•œ 후ì—ë§Œ " +"ë””ì½”ë”©ëœ ë³€ê²½ ì‚¬í•­ì„ ì¶œë ¥ 플러그ì¸ìœ¼ë¡œ 전송합니다." + +#: utils/misc/guc_tables.c:4716 +msgid "Prohibits access to non-system relations of specified kinds." +msgstr "ì§€ì •ëœ ì¢…ë¥˜ì˜ non-system 릴레ì´ì…˜ì— 대한 ì ‘ê·¼ì„ ê¸ˆì§€í•©ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:4736 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "문ìžì—´ì—서 \"\\'\" ë¬¸ìž ì‚¬ìš©ì„ í—ˆìš©í•  것ì¸ì§€ë¥¼ 정하세요" -#: utils/misc/guc.c:4454 +#: utils/misc/guc_tables.c:4746 msgid "Sets the output format for bytea." msgstr "bytea ê°’ì˜ í‘œì‹œ 형ì‹ì„ 설정합니다." -#: utils/misc/guc.c:4464 +#: utils/misc/guc_tables.c:4756 msgid "Sets the message levels that are sent to the client." msgstr "í´ë¼ì´ì–¸íЏ ì¸¡ì— ë³´ì—¬ì§ˆ 메시지 ìˆ˜ì¤€ì„ ì§€ì •í•¨." -#: utils/misc/guc.c:4465 utils/misc/guc.c:4530 utils/misc/guc.c:4541 -#: utils/misc/guc.c:4617 +#: utils/misc/guc_tables.c:4757 utils/misc/guc_tables.c:4853 +#: utils/misc/guc_tables.c:4864 msgid "" "Each level includes all the levels that follow it. The later the level, the " "fewer messages are sent." msgstr "" -"ê° ìˆ˜ì¤€ì—는 ì´ ìˆ˜ì¤€ ë’¤ì— ìžˆëŠ” 모든 ìˆ˜ì¤€ì´ í¬í•¨ë©ë‹ˆë‹¤. ìˆ˜ì¤€ì´ ë’¤ì— ìžˆì„수" -"ë¡ ì „ì†¡ë˜ëŠ” 메시지 수가 ì ìŠµë‹ˆë‹¤." +"ê° ìˆ˜ì¤€ì€ ì´ ìˆ˜ì¤€ ë’¤ì— ìžˆëŠ” 모든 ìˆ˜ì¤€ì´ í¬í•¨ë©ë‹ˆë‹¤. ìˆ˜ì¤€ì´ ë’¤ì— ìžˆì„ìˆ˜ë¡ ì „ì†¡" +"ë˜ëŠ” 메시지 수가 ì ìŠµë‹ˆë‹¤." -#: utils/misc/guc.c:4475 +#: utils/misc/guc_tables.c:4767 +msgid "Enables in-core computation of query identifiers." +msgstr "query_id를 ë‚´ë¶€ì ìœ¼ë¡œ 사용함" + +#: utils/misc/guc_tables.c:4777 msgid "Enables the planner to use constraints to optimize queries." msgstr "실행계íšê¸°ê°€ 쿼리 최ì í™” 작업ì—서 제약 ì¡°ê±´ì„ ì‚¬ìš©í•˜ë„ë¡ í•¨" -#: utils/misc/guc.c:4476 +#: utils/misc/guc_tables.c:4778 msgid "" "Table scans will be skipped if their constraints guarantee that no rows " "match the query." msgstr "" -"제약 ì¡°ê±´ì— ì˜í•´ 쿼리와 ì¼ì¹˜í•˜ëŠ” í–‰ì´ ì—†ëŠ” 경우 í…Œì´ë¸” ìŠ¤ìº”ì„ ê±´ë„ˆëœë‹ˆ" -"다." - -#: utils/misc/guc.c:4487 -msgid "Sets the transaction isolation level of each new transaction." -msgstr "ê° ìƒˆ íŠ¸ëžœìž­ì…˜ì˜ íŠ¸ëžœìž­ì…˜ 격리 ìˆ˜ì¤€ì„ ì„¤ì •í•©ë‹ˆë‹¤." - -#: utils/misc/guc.c:4497 -msgid "Sets the current transaction's isolation level." -msgstr "현재 트랜잭션 ë…립성 수준(isolation level)ì„ ì§€ì •í•¨." - -#: utils/misc/guc.c:4508 -msgid "Sets the display format for interval values." -msgstr "간격 ê°’ì˜ í‘œì‹œ 형ì‹ì„ 설정합니다." - -#: utils/misc/guc.c:4519 -msgid "Sets the verbosity of logged messages." -msgstr "기ë¡ë˜ëŠ” ë©”ì‹œì§€ì˜ ìƒì„¸ ì •ë„를 지정합니다." - -#: utils/misc/guc.c:4529 -msgid "Sets the message levels that are logged." -msgstr "서버 ë¡œê·¸ì— ê¸°ë¡ë  메시지 ìˆ˜ì¤€ì„ ì§€ì •í•¨." - -#: utils/misc/guc.c:4540 -msgid "" -"Causes all statements generating error at or above this level to be logged." -msgstr "" -"오류가 있는 모든 쿼리문ì´ë‚˜ 지정한 로그 레벨 ì´ìƒì˜ ì¿¼ë¦¬ë¬¸ì„ ë¡œê·¸ë¡œ 남김" - -#: utils/misc/guc.c:4551 -msgid "Sets the type of statements logged." -msgstr "ì„œë²„ë¡œê·¸ì— ê¸°ë¡ë  구문 종류를 지정합니다." - -#: utils/misc/guc.c:4561 -msgid "Sets the syslog \"facility\" to be used when syslog enabled." -msgstr "syslog ê¸°ëŠ¥ì„ ì‚¬ìš©í•  때, 사용할 syslog \"facility\" ê°’ì„ ì§€ì •." - -#: utils/misc/guc.c:4576 -msgid "Sets the session's behavior for triggers and rewrite rules." -msgstr "트리거 ë° ë‹¤ì‹œ 쓰기 ê·œì¹™ì— ëŒ€í•œ ì„¸ì…˜ì˜ ë™ìž‘ì„ ì„¤ì •í•©ë‹ˆë‹¤." - -#: utils/misc/guc.c:4586 -msgid "Sets the current transaction's synchronization level." -msgstr "현재 트랜잭션 격리 수준(isolation level)ì„ ì§€ì •í•¨." - -#: utils/misc/guc.c:4596 -msgid "Allows archiving of WAL files using archive_command." -msgstr "archive_command를 사용하여 WAL 파ì¼ì„ 따로 보관하ë„ë¡ ì„¤ì •í•©ë‹ˆë‹¤." - -#: utils/misc/guc.c:4606 -msgid "Sets the action to perform upon reaching the recovery target." -msgstr "" - -#: utils/misc/guc.c:4616 -msgid "Enables logging of recovery-related debugging information." -msgstr "복구 작업과 ê´€ë ¨ëœ ë””ë²„ê¹… 정보를 기ë¡í•˜ë„ë¡ í•©ë‹ˆë‹¤." - -#: utils/misc/guc.c:4632 -msgid "Collects function-level statistics on database activity." -msgstr "ë°ì´í„°ë² ì´ìФ 활ë™ì— 대한 함수 수준 통계를 수집합니다." - -#: utils/misc/guc.c:4642 -msgid "Set the level of information written to the WAL." -msgstr "WALì— ì €ìž¥í•  ë‚´ìš© ìˆ˜ì¤€ì„ ì§€ì •í•©ë‹ˆë‹¤." - -#: utils/misc/guc.c:4652 -msgid "Selects the dynamic shared memory implementation used." -msgstr "사용할 ë™ì  공유 메모리 관리방ì‹ì„ ì„ íƒí•©ë‹ˆë‹¤." - -#: utils/misc/guc.c:4662 -msgid "" -"Selects the shared memory implementation used for the main shared memory " -"region." -msgstr "사용할 ë™ì  공유 메모리 관리방ì‹ì„ ì„ íƒí•©ë‹ˆë‹¤." - -#: utils/misc/guc.c:4672 -msgid "Selects the method used for forcing WAL updates to disk." -msgstr "디스í¬ì— 대한 ê°•ì œ WAL ì—…ë°ì´íŠ¸ì— ì‚¬ìš©ë˜ëŠ” ë°©ë²•ì„ ì„ íƒí•©ë‹ˆë‹¤." - -#: utils/misc/guc.c:4682 -msgid "Sets how binary values are to be encoded in XML." -msgstr "XMLì—서 ë°”ì´ë„ˆë¦¬ ê°’ì´ ì¸ì½”딩ë˜ëŠ” ë°©ì‹ì„ 설정합니다." - -#: utils/misc/guc.c:4692 -msgid "" -"Sets whether XML data in implicit parsing and serialization operations is to " -"be considered as documents or content fragments." -msgstr "" -"ì•”ì‹œì  êµ¬ë¬¸ ë¶„ì„ ë° ì§ë ¬í™” ìž‘ì—…ì˜ XML ë°ì´í„°ë¥¼ 문서 ë˜ëŠ” ë‚´ìš© ì¡°ê°ìœ¼ë¡œ 간주할" -"ì§€ 여부를 설정합니다." - -#: utils/misc/guc.c:4703 -msgid "Use of huge pages on Linux or Windows." -msgstr "리눅스 ë˜ëŠ” Windows huge 페ì´ì§€ 사용 여부" - -#: utils/misc/guc.c:4713 -msgid "Forces use of parallel query facilities." -msgstr "병렬 쿼리 ê¸°ëŠ¥ì„ í™œì„±í™”" - -#: utils/misc/guc.c:4714 -msgid "" -"If possible, run query using a parallel worker and with parallel " -"restrictions." -msgstr "" - -#: utils/misc/guc.c:4724 -msgid "Chooses the algorithm for encrypting passwords." -msgstr "" - -#: utils/misc/guc.c:4734 -msgid "Controls the planner's selection of custom or generic plan." -msgstr "" - -#: utils/misc/guc.c:4735 -msgid "" -"Prepared statements can have custom and generic plans, and the planner will " -"attempt to choose which is better. This can be set to override the default " -"behavior." -msgstr "" - -#: utils/misc/guc.c:4747 -msgid "Sets the minimum SSL/TLS protocol version to use." -msgstr "사용할 최소 SSL/TLS 프로토콜 ë²„ì „ì„ ì§€ì •í•©ë‹ˆë‹¤." - -#: utils/misc/guc.c:4759 -msgid "Sets the maximum SSL/TLS protocol version to use." -msgstr "사용할 최대 SSL/TLS 프로토콜 ë²„ì „ì„ ì§€ì •í•©ë‹ˆë‹¤." - -#: utils/misc/guc.c:5562 -#, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: \"%s\" ë””ë ‰í„°ë¦¬ì— ì•¡ì„¸ìŠ¤í•  수 ì—†ìŒ: %s\n" - -#: utils/misc/guc.c:5567 -#, c-format -msgid "" -"Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" -msgstr "" -"initdb 명령ì´ë‚˜, pg_basebackup 명령으로 PostgreSQL ë°ì´í„° 디렉터리를 초기화 " -"하세요.\n" - -#: utils/misc/guc.c:5587 -#, c-format -msgid "" -"%s does not know where to find the server configuration file.\n" -"You must specify the --config-file or -D invocation option or set the PGDATA " -"environment variable.\n" -msgstr "" -"%s í”„ë¡œê·¸ëž¨ì€ ë°ì´í„°ë² ì´ìФ 시스템 환경 설정 파ì¼ì„ 찾지 못했습니다.\n" -"ì§ì ‘ --config-file ë˜ëŠ” -D ì˜µì…˜ì„ ì´ìš©í•´ì„œ ë°ì´í„° 디렉터리를 지정하든지,\n" -"PGDATA ì´ë¦„ì˜ í™˜ê²½ 변수를 만들고 ê·¸ 값으로 해당 디렉터리를 지정한 ë’¤,\n" -"ì´ í”„ë¡œê·¸ëž¨ì„ ë‹¤ì‹œ 실행해 보십시오.\n" - -#: utils/misc/guc.c:5606 -#, c-format -msgid "%s: could not access the server configuration file \"%s\": %s\n" -msgstr "%s: \"%s\" 환경 설정 파ì¼ì„ 접근할 수 없습니다: %s\n" - -#: utils/misc/guc.c:5632 -#, c-format -msgid "" -"%s does not know where to find the database system data.\n" -"This can be specified as \"data_directory\" in \"%s\", or by the -D " -"invocation option, or by the PGDATA environment variable.\n" -msgstr "" -"%s í”„ë¡œê·¸ëž¨ì€ ë°ì´í„°ë² ì´ìФ 시스템 ë°ì´í„° 디렉터리를 찾지 못했습니다.\n" -"\"%s\" 파ì¼ì—서 \"data_directory\" ê°’ì„ ì§€ì •í•˜ë“ ì§€,\n" -"ì§ì ‘ -D ì˜µì…˜ì„ ì´ìš©í•´ì„œ ë°ì´í„° 디렉터리를 지정하든지,\n" -"PGDATA ì´ë¦„ì˜ í™˜ê²½ 변수를 만들고 ê·¸ 값으로 해당 디렉터리를 지정한 ë’¤,\n" -"ì´ í”„ë¡œê·¸ëž¨ì„ ë‹¤ì‹œ 실행해 보십시오.\n" - -#: utils/misc/guc.c:5680 -#, c-format -msgid "" -"%s does not know where to find the \"hba\" configuration file.\n" -"This can be specified as \"hba_file\" in \"%s\", or by the -D invocation " -"option, or by the PGDATA environment variable.\n" -msgstr "" -"%s í”„ë¡œê·¸ëž¨ì€ \"hba\" 환경설정파ì¼ì„ 찾지 못했습니다.\n" -"\"%s\" 파ì¼ì—서 \"hba_file\" ê°’ì„ ì§€ì •í•˜ë“ ì§€,\n" -"ì§ì ‘ -D ì˜µì…˜ì„ ì´ìš©í•´ì„œ ë°ì´í„° 디렉터리를 지정하든지,\n" -"PGDATA ì´ë¦„ì˜ í™˜ê²½ 변수를 만들고 ê·¸ 값으로 해당 디렉터리를 지정한 ë’¤,\n" -"ì´ í”„ë¡œê·¸ëž¨ì„ ë‹¤ì‹œ 실행해 보십시오.\n" - -#: utils/misc/guc.c:5703 -#, c-format -msgid "" -"%s does not know where to find the \"ident\" configuration file.\n" -"This can be specified as \"ident_file\" in \"%s\", or by the -D invocation " -"option, or by the PGDATA environment variable.\n" -msgstr "" -"%s í”„ë¡œê·¸ëž¨ì€ \"ident\" 환경설정파ì¼ì„ 찾지 못했습니다.\n" -"\"%s\" 파ì¼ì—서 \"ident_file\" ê°’ì„ ì§€ì •í•˜ë“ ì§€,\n" -"ì§ì ‘ -D ì˜µì…˜ì„ ì´ìš©í•´ì„œ ë°ì´í„° 디렉터리를 지정하든지,\n" -"PGDATA ì´ë¦„ì˜ í™˜ê²½ 변수를 만들고 ê·¸ 값으로 해당 디렉터리를 지정한 ë’¤,\n" -"ì´ í”„ë¡œê·¸ëž¨ì„ ë‹¤ì‹œ 실행해 보십시오.\n" - -#: utils/misc/guc.c:6545 -msgid "Value exceeds integer range." -msgstr "ê°’ì´ ì •ìˆ˜ 범위를 초과합니다." - -#: utils/misc/guc.c:6781 -#, c-format -msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d%s%s ê°’ì€ \"%s\" 매개 ë³€ìˆ˜ì˜ ê°’ìœ¼ë¡œ 타당한 범위(%d .. %d)를 벗어남" +"제약 ì¡°ê±´ì— ì˜í•´ 쿼리와 ì¼ì¹˜í•˜ëŠ” í–‰ì´ ì—†ëŠ” 경우 í…Œì´ë¸” ìŠ¤ìº”ì„ ê±´ë„ˆëœë‹ˆë‹¤." -#: utils/misc/guc.c:6817 -#, c-format -msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" -msgstr "%g%s%s ê°’ì€ \"%s\" 매개 ë³€ìˆ˜ì˜ ê°’ìœ¼ë¡œ 타당한 범위(%g .. %g)를 벗어남" +#: utils/misc/guc_tables.c:4789 +msgid "Sets the default compression method for compressible values." +msgstr "ì••ì¶• 가능한 ê°’ì„ ì••ì¶•í•˜ê¸° 위한 기본 ì••ì¶• ë°©ë²•ì„ ì§€ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:6973 utils/misc/guc.c:8340 -#, c-format -msgid "cannot set parameters during a parallel operation" -msgstr "병렬 작업 중ì—는 매개 변수를 설정할 수 ì—†ìŒ" +#: utils/misc/guc_tables.c:4800 +msgid "Sets the transaction isolation level of each new transaction." +msgstr "ê° ìƒˆ íŠ¸ëžœìž­ì…˜ì˜ íŠ¸ëžœìž­ì…˜ 격리 ìˆ˜ì¤€ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:6980 utils/misc/guc.c:7732 utils/misc/guc.c:7785 -#: utils/misc/guc.c:7836 utils/misc/guc.c:8169 utils/misc/guc.c:8936 -#: utils/misc/guc.c:9198 utils/misc/guc.c:10864 -#, c-format -msgid "unrecognized configuration parameter \"%s\"" -msgstr "알 수 없는 환경 매개 변수 ì´ë¦„: \"%s\"" +#: utils/misc/guc_tables.c:4810 +msgid "Sets the current transaction's isolation level." +msgstr "현재 트랜잭션 ë…립성 수준(isolation level)ì„ ì§€ì •í•¨." -#: utils/misc/guc.c:6995 utils/misc/guc.c:8181 -#, c-format -msgid "parameter \"%s\" cannot be changed" -msgstr "\"%s\" 매개 변수는 ë³€ê²½ë  ìˆ˜ ì—†ìŒ" +#: utils/misc/guc_tables.c:4821 +msgid "Sets the display format for interval values." +msgstr "간격 ê°’ì˜ í‘œì‹œ 형ì‹ì„ 설정합니다." -#: utils/misc/guc.c:7018 utils/misc/guc.c:7212 utils/misc/guc.c:7302 -#: utils/misc/guc.c:7392 utils/misc/guc.c:7500 utils/misc/guc.c:7595 -#: guc-file.l:352 -#, c-format -msgid "parameter \"%s\" cannot be changed without restarting the server" -msgstr "\"%s\" 매개 변수는 서버 재실행 ì—†ì´ ì§€ê¸ˆ 변경 ë  ìˆ˜ ì—†ìŒ" +#: utils/misc/guc_tables.c:4832 +msgid "Log level for reporting invalid ICU locale strings." +msgstr "ìž˜ëª»ëœ ICU ë¡œì¼€ì¼ ì„¤ì •ì„ ë³´ê³ í•  로그 수준" -#: utils/misc/guc.c:7028 -#, c-format -msgid "parameter \"%s\" cannot be changed now" -msgstr "\"%s\" 매개 변수는 지금 변경 ë  ìˆ˜ ì—†ìŒ" +#: utils/misc/guc_tables.c:4842 +msgid "Sets the verbosity of logged messages." +msgstr "기ë¡ë˜ëŠ” ë©”ì‹œì§€ì˜ ìƒì„¸ ì •ë„를 지정합니다." -#: utils/misc/guc.c:7046 utils/misc/guc.c:7093 utils/misc/guc.c:10880 -#, c-format -msgid "permission denied to set parameter \"%s\"" -msgstr "\"%s\" 매개 변수를 지정할 ê¶Œí•œì´ ì—†ìŠµë‹ˆë‹¤." +#: utils/misc/guc_tables.c:4852 +msgid "Sets the message levels that are logged." +msgstr "서버 ë¡œê·¸ì— ê¸°ë¡ë  메시지 ìˆ˜ì¤€ì„ ì§€ì •í•¨." -#: utils/misc/guc.c:7083 -#, c-format -msgid "parameter \"%s\" cannot be set after connection start" -msgstr "\"%s\" 매개 ë³€ìˆ˜ê°’ì€ ì—°ê²° 시작한 ë’¤ì—는 변경할 수 없습니다" +#: utils/misc/guc_tables.c:4863 +msgid "" +"Causes all statements generating error at or above this level to be logged." +msgstr "" +"오류가 있는 모든 쿼리문ì´ë‚˜ 지정한 로그 레벨 ì´ìƒì˜ ì¿¼ë¦¬ë¬¸ì„ ë¡œê·¸ë¡œ 남김" -#: utils/misc/guc.c:7131 -#, c-format -msgid "cannot set parameter \"%s\" within security-definer function" -msgstr "보안 ì •ì˜ìž 함수 ë‚´ì—서 \"%s\" 매개 변수를 설정할 수 ì—†ìŒ" +#: utils/misc/guc_tables.c:4874 +msgid "Sets the type of statements logged." +msgstr "ì„œë²„ë¡œê·¸ì— ê¸°ë¡ë  구문 종류를 지정합니다." -#: utils/misc/guc.c:7740 utils/misc/guc.c:7790 utils/misc/guc.c:9205 -#, c-format -msgid "must be superuser or a member of pg_read_all_settings to examine \"%s\"" -msgstr "\"%s\" 검사를 위한 pg_read_all_settingsì˜ ë§´ë²„ëŠ” superuser여야합니다" +#: utils/misc/guc_tables.c:4884 +msgid "Sets the syslog \"facility\" to be used when syslog enabled." +msgstr "syslog ê¸°ëŠ¥ì„ ì‚¬ìš©í•  때, 사용할 syslog \"facility\" ê°’ì„ ì§€ì •." -#: utils/misc/guc.c:7881 -#, c-format -msgid "SET %s takes only one argument" -msgstr "SET %s ëª…ë ¹ì€ í•˜ë‚˜ì˜ ê°’ë§Œ 지정해야합니다" +#: utils/misc/guc_tables.c:4895 +msgid "Sets the session's behavior for triggers and rewrite rules." +msgstr "트리거 ë° ë‹¤ì‹œ 쓰기 ê·œì¹™ì— ëŒ€í•œ ì„¸ì…˜ì˜ ë™ìž‘ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:8129 -#, c-format -msgid "must be superuser to execute ALTER SYSTEM command" -msgstr "슈í¼ìœ ì €ë§Œ ALTER SYSTEM ëª…ë ¹ì„ ì‹¤í–‰í•  수 있ìŒ" +#: utils/misc/guc_tables.c:4905 +msgid "Sets the current transaction's synchronization level." +msgstr "현재 트랜잭션 격리 수준(isolation level)ì„ ì§€ì •í•¨." -#: utils/misc/guc.c:8214 -#, c-format -msgid "parameter value for ALTER SYSTEM must not contain a newline" -msgstr "" -"ALTER SYSTEM 명령으로 지정하는 매개 변수 ê°’ì—는 줄바꿈 문ìžê°€ 없어야 합니다" +#: utils/misc/guc_tables.c:4915 +msgid "Allows archiving of WAL files using \"archive_command\"." +msgstr "\"archive_command\"를 사용하여 WAL 파ì¼ì„ 따로 보관하ë„ë¡ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:8259 -#, c-format -msgid "could not parse contents of file \"%s\"" -msgstr "\"%s\" 파ì¼ì˜ ë‚´ìš©ì„ ë¶„ì„í•  수 ì—†ìŒ" +#: utils/misc/guc_tables.c:4925 +msgid "Sets the action to perform upon reaching the recovery target." +msgstr "복구 íƒ€ì¼“ì— ë„ë‹¬í–ˆì„ ë•Œ 수행할 ì•¡ì…˜ì„ ì§€ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:8416 -#, c-format -msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" -msgstr "SET LOCAL TRANSACTION SNAPSHOT ëª…ë ¹ì€ ì•„ì§ êµ¬í˜„ ë˜ì§€ 않았습니다" +#: utils/misc/guc_tables.c:4935 +msgid "Collects function-level statistics on database activity." +msgstr "ë°ì´í„°ë² ì´ìФ 활ë™ì— 대한 함수 수준 통계를 수집합니다." -#: utils/misc/guc.c:8500 -#, c-format -msgid "SET requires parameter name" -msgstr "SET ëª…ë ¹ì€ ë§¤ê°œ 변수 ì´ë¦„ì´ í•„ìš”í•©ë‹ˆë‹¤" +#: utils/misc/guc_tables.c:4946 +msgid "Sets the consistency of accesses to statistics data." +msgstr "통계 ìžë£Œ ì ‘ê·¼ì˜ ë™ì‹œì„±ì„ 지정합니다." -#: utils/misc/guc.c:8633 -#, c-format -msgid "attempt to redefine parameter \"%s\"" -msgstr "\"%s\" 매개 변수를 다시 ì •ì˜í•˜ë ¤ê³  함" +#: utils/misc/guc_tables.c:4956 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "WAL 파ì¼ì— 페ì´ì§€ 전체를 기ë¡í•  때 사용할 ì••ì¶• 방법" -#: utils/misc/guc.c:10426 -#, c-format -msgid "while setting parameter \"%s\" to \"%s\"" -msgstr "\"%s\" 매개 변수 ê°’ì„ \"%s\" (으)로 바꾸는 중" +#: utils/misc/guc_tables.c:4966 +msgid "Sets the level of information written to the WAL." +msgstr "WALì— ì €ìž¥í•  ë‚´ìš© ìˆ˜ì¤€ì„ ì§€ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:10494 -#, c-format -msgid "parameter \"%s\" could not be set" -msgstr "\"%s\" 매개 변수는 설정할 수 ì—†ìŒ" +#: utils/misc/guc_tables.c:4976 +msgid "Selects the dynamic shared memory implementation used." +msgstr "사용할 ë™ì  공유 메모리 관리방ì‹ì„ ì„ íƒí•©ë‹ˆë‹¤." -#: utils/misc/guc.c:10584 -#, c-format -msgid "could not parse setting for parameter \"%s\"" -msgstr "지정한 \"%s\" 매개 ë³€ìˆ˜ê°’ì˜ êµ¬ë¬¸ë¶„ì„ì„ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤." +#: utils/misc/guc_tables.c:4986 +msgid "" +"Selects the shared memory implementation used for the main shared memory " +"region." +msgstr "사용할 ë™ì  공유 메모리 관리방ì‹ì„ ì„ íƒí•©ë‹ˆë‹¤." -#: utils/misc/guc.c:10942 utils/misc/guc.c:10976 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "ìž˜ëª»ëœ \"%s\" 매개 ë³€ìˆ˜ì˜ ê°’: %d" +#: utils/misc/guc_tables.c:4996 +msgid "Selects the method used for forcing WAL updates to disk." +msgstr "디스í¬ì— 대한 ê°•ì œ WAL ì—…ë°ì´íŠ¸ì— ì‚¬ìš©ë˜ëŠ” ë°©ë²•ì„ ì„ íƒí•©ë‹ˆë‹¤." -#: utils/misc/guc.c:11010 -#, c-format -msgid "invalid value for parameter \"%s\": %g" -msgstr "ìž˜ëª»ëœ \"%s\" 매개 ë³€ìˆ˜ì˜ ê°’: %g" +#: utils/misc/guc_tables.c:5006 +msgid "Sets how binary values are to be encoded in XML." +msgstr "XMLì—서 ë°”ì´ë„ˆë¦¬ ê°’ì´ ì¸ì½”딩ë˜ëŠ” ë°©ì‹ì„ 설정합니다." -#: utils/misc/guc.c:11280 -#, c-format +#: utils/misc/guc_tables.c:5016 msgid "" -"\"temp_buffers\" cannot be changed after any temporary tables have been " -"accessed in the session." +"Sets whether XML data in implicit parsing and serialization operations is to " +"be considered as documents or content fragments." msgstr "" -"해당 세션ì—서 ì–´ë–¤ 임시 í…Œì´ë¸”ë„ ì‚¬ìš©í•˜ê³  있지 않아야 \"temp_buffers\" 설정" -"ì„ ë³€ê²½í•  수 있습니다." +"ì•”ì‹œì  êµ¬ë¬¸ ë¶„ì„ ë° ì§ë ¬í™” ìž‘ì—…ì˜ XML ë°ì´í„°ë¥¼ 문서 ë˜ëŠ” ë‚´ìš© ì¡°ê°ìœ¼ë¡œ 간주할" +"ì§€ 여부를 설정합니다." -#: utils/misc/guc.c:11292 -#, c-format -msgid "Bonjour is not supported by this build" -msgstr "Bonjour ê¸°ëŠ¥ì„ ëº€ 채로 서버가 만들어졌습니다." +#: utils/misc/guc_tables.c:5027 +msgid "Use of huge pages on Linux or Windows." +msgstr "리눅스 ë˜ëŠ” Windows huge 페ì´ì§€ 사용 여부" -#: utils/misc/guc.c:11305 -#, c-format -msgid "SSL is not supported by this build" -msgstr "SSL ì ‘ì† ê¸°ëŠ¥ì„ ëº€ 채로 서버가 만들어졌습니다." +#: utils/misc/guc_tables.c:5037 +msgid "Indicates the status of huge pages." +msgstr "huge page ìƒíƒœë¥¼ ë³´ê³ í• ì§€ 지정" -#: utils/misc/guc.c:11317 -#, c-format -msgid "Cannot enable parameter when \"log_statement_stats\" is true." -msgstr "\"log_statement_stats\" ê°’ì´ true ì¼ ë•ŒëŠ” ì´ ê°’ì„ í™œì„±í™”í•  수 없습니다" +#: utils/misc/guc_tables.c:5048 +msgid "Prefetch referenced blocks during recovery." +msgstr "복구 작업 ì¤‘ì— ì°¸ì¡°í•˜ëŠ” 블ë¡ì„ 미리 준비하는 방법." -#: utils/misc/guc.c:11329 -#, c-format -msgid "" -"Cannot enable \"log_statement_stats\" when \"log_parser_stats\", " -"\"log_planner_stats\", or \"log_executor_stats\" is true." -msgstr "" -"\"log_parser_stats\", \"log_planner_stats\", \"log_executor_stats\" 설정값들 " -"중 하나가 true ì¼ ë•ŒëŠ” \"log_statement_stats\" ì„¤ì •ì„ í™œì„±í™”í•  수 없습니다" +#: utils/misc/guc_tables.c:5049 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "ë”°ë¼ìž¡ì§€ 못한 ë°ì´í„°ë¥¼ WALì—서 미리 준비함" -#: utils/misc/guc.c:11559 -#, c-format +#: utils/misc/guc_tables.c:5058 +msgid "Forces the planner's use parallel query nodes." +msgstr "병렬 쿼리를 강제로 사용하ë„ë¡ ì§€ì •í•©ë‹ˆë‹¤." + +#: utils/misc/guc_tables.c:5059 msgid "" -"effective_io_concurrency must be set to 0 on platforms that lack " -"posix_fadvise()." +"This can be useful for testing the parallel query infrastructure by forcing " +"the planner to generate plans that contain nodes that perform tuple " +"communication between workers and the main process." msgstr "" +"ì´ê²ƒì€ 실행계íšê¸°ê°€ 작업ìžì™€ ë©”ì¸ í”„ë¡œì„¸ìŠ¤ ê°„ì— íŠœí”Œ í†µì‹ ì„ ìˆ˜í–‰í•˜ëŠ” " +"노드가 í¬í•¨ëœ í”Œëžœì„ ìƒì„±í•˜ë„ë¡ ê°•ì œí•˜ì—¬ 병렬 쿼리 í™˜ê²½ì„ í…ŒìŠ¤íŠ¸í•˜ëŠ” " +"ë° ìœ ìš©í•  수 있습니다." -#: utils/misc/guc.c:11572 -#, c-format +#: utils/misc/guc_tables.c:5071 +msgid "Chooses the algorithm for encrypting passwords." +msgstr "비밀번호 암호화 알고리즘 ì„ íƒ" + +#: utils/misc/guc_tables.c:5081 +msgid "Controls the planner's selection of custom or generic plan." +msgstr "실행계íšê¸°ê°€ ì‚¬ìš©ìž ì •ì˜ ê³„íšì´ë‚˜, ì¼ë°˜ì  계íšì„ ì„ íƒí•˜ëŠ” ê²ƒì„ ì¡°ì •í•¨" + +#: utils/misc/guc_tables.c:5082 msgid "" -"maintenance_io_concurrency must be set to 0 on platforms that lack " -"posix_fadvise()." +"Prepared statements can have custom and generic plans, and the planner will " +"attempt to choose which is better. This can be set to override the default " +"behavior." msgstr "" +"미리 ì¤€ë¹„ëœ êµ¬ë¬¸ì—는 ì‚¬ìš©ìž ì •ì˜ ë° ì¼ë°˜ 계íšì´ ìžˆì„ ìˆ˜ 있으며, " +"실행계íšê¸°ëŠ” ì–´ëŠ ê²ƒì´ ë” ë‚˜ì€ì§€ ì„ íƒí•˜ë ¤ê³  시ë„합니다. " +"ì´ ì„¤ì •ì€ ê¸°ë³¸ ë™ìž‘ì„ ìž¬ì •ì˜í•˜ë„ë¡ ì„¤ì •í•  수 있습니다." -#: utils/misc/guc.c:11688 -#, c-format -msgid "invalid character" -msgstr "ìž˜ëª»ëœ ë¬¸ìž" +#: utils/misc/guc_tables.c:5094 +msgid "Sets the minimum SSL/TLS protocol version to use." +msgstr "사용할 최소 SSL/TLS 프로토콜 ë²„ì „ì„ ì§€ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:11748 -#, c-format -msgid "recovery_target_timeline is not a valid number." -msgstr "recovery_target_timeline 값으로 ìž˜ëª»ëœ ìˆ«ìžìž…니다." +#: utils/misc/guc_tables.c:5106 +msgid "Sets the maximum SSL/TLS protocol version to use." +msgstr "사용할 최대 SSL/TLS 프로토콜 ë²„ì „ì„ ì§€ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:11788 -#, c-format -msgid "multiple recovery targets specified" -msgstr "복구 대ìƒì„ 다중 지정했ìŒ" +#: utils/misc/guc_tables.c:5118 +msgid "" +"Sets the method for synchronizing the data directory before crash recovery." +msgstr "" +"ì¶©ëŒ ë³µêµ¬ ì „ì— ë°ì´í„° 디렉토리를 ë™ê¸°í™”하는 ë°©ë²•ì„ ì„¤ì •í•©ë‹ˆë‹¤." -#: utils/misc/guc.c:11789 -#, c-format +#: utils/misc/guc_tables.c:5127 msgid "" -"At most one of recovery_target, recovery_target_lsn, recovery_target_name, " -"recovery_target_time, recovery_target_xid may be set." +"Forces immediate streaming or serialization of changes in large transactions." msgstr "" +"대량 트랜잭션ì—서 변경 ì‚¬í•­ì„ ê°•ì œë¡œ 즉시 스트리ë°í•˜ê±°ë‚˜ ì§ë ¬í™”합니다." -#: utils/misc/guc.c:11797 -#, c-format -msgid "The only allowed value is \"immediate\"." -msgstr "ì´ ê°’ìœ¼ë¡œëŠ” \"immediate\" ë§Œ 허용합니다." +#: utils/misc/guc_tables.c:5128 +msgid "" +"On the publisher, it allows streaming or serializing each change in logical " +"decoding. On the subscriber, it allows serialization of all changes to files " +"and notifies the parallel apply workers to read and apply them at the end of " +"the transaction." +msgstr "" +"발행 서버ì—서 논리 ë””ì½”ë”©ì˜ ê° ë³€ê²½ ì‚¬í•­ì„ ìŠ¤íŠ¸ë¦¬ë°í•˜ê±°ë‚˜ ì§ë ¬í™”í•  수 있습니다. " +"êµ¬ë… ì„œë²„ì—서 파ì¼ì— 대한 모든 변경 ì‚¬í•­ì„ ì§ë ¬í™”í•  수 있으며, " +"병렬 ë°˜ì˜ ìž‘ì—…ìžì—게 íŠ¸ëžœìž­ì…˜ì´ ëë‚  때 ì½ê³  ì ìš©í•˜ë„ë¡ ì•Œë¦½ë‹ˆë‹¤." -#: utils/misc/help_config.c:130 +#: utils/misc/help_config.c:129 #, c-format msgid "internal error: unrecognized run-time parameter type\n" msgstr "ë‚´ë¶€ 오류: 알 수 없는 실시간 서버 설정 변수\n" -#: utils/misc/pg_config.c:60 -#, c-format -msgid "" -"query-specified return tuple and function return type are not compatible" -msgstr "" - -#: utils/misc/pg_controldata.c:60 utils/misc/pg_controldata.c:138 -#: utils/misc/pg_controldata.c:241 utils/misc/pg_controldata.c:306 +#: utils/misc/pg_controldata.c:50 utils/misc/pg_controldata.c:90 +#: utils/misc/pg_controldata.c:181 utils/misc/pg_controldata.c:222 #, c-format msgid "calculated CRC checksum does not match value stored in file" msgstr "ê³„ì‚°ëœ CRC ì²´í¬ì„¬ ê°’ì´ íŒŒì¼ì— ì €ìž¥ëœ ê°’ê³¼ 다름" @@ -28613,7 +33095,7 @@ msgstr "ê³„ì‚°ëœ CRC ì²´í¬ì„¬ ê°’ì´ íŒŒì¼ì— ì €ìž¥ëœ ê°’ê³¼ 다름" #: utils/misc/pg_rusage.c:64 #, c-format msgid "CPU: user: %d.%02d s, system: %d.%02d s, elapsed: %d.%02d s" -msgstr "" +msgstr "CPU: user: %d.%02d s, system: %d.%02d s, elapsed: %d.%02d s" #: utils/misc/rls.c:127 #, c-format @@ -28629,12 +33111,12 @@ msgstr "" "í…Œì´ë¸” 소유주를 위해 ì •ì±…ì„ ë¹„í™œì„±í•˜ë ¤ë©´, ALTER TABLE NO FORCE ROW LEVEL " "SECURITY ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”" -#: utils/misc/timeout.c:395 +#: utils/misc/timeout.c:520 #, c-format msgid "cannot add more timeout reasons" msgstr "시간 초과로 ë”ì´ìƒ 추가할 수 ì—†ìŒ" -#: utils/misc/tzparser.c:60 +#: utils/misc/tzparser.c:61 #, c-format msgid "" "time zone abbreviation \"%s\" is too long (maximum %d characters) in time " @@ -28643,91 +33125,94 @@ msgstr "" "\"%s\" 타임 ì¡´ ì´ë¦„ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤(최대 %dìž) (\"%s\" 타임 ì¡´ 파ì¼ì˜ %d번째 줄" "ì— ìžˆìŒ)." -#: utils/misc/tzparser.c:72 +#: utils/misc/tzparser.c:73 #, c-format msgid "time zone offset %d is out of range in time zone file \"%s\", line %d" msgstr "" "%d 타임 ì¡´ 오프셋 ê°’ì´ ë²”ìœ„ë¥¼ 벗어났습니다(\"%s\" 타임 ì¡´ 파ì¼ì˜ %d번째 ì¤„ì— " "있ìŒ)." -#: utils/misc/tzparser.c:111 +#: utils/misc/tzparser.c:112 #, c-format msgid "missing time zone abbreviation in time zone file \"%s\", line %d" msgstr "\"%s\" time zone 파ì¼ì˜ %d번째 ì¤„ì— time zone ìƒëžµí˜•ì´ ë¹ ì¡ŒìŒ" -#: utils/misc/tzparser.c:120 +#: utils/misc/tzparser.c:121 #, c-format msgid "missing time zone offset in time zone file \"%s\", line %d" msgstr "\"%s\" time zone 파ì¼ì˜ %d번째 ì¤„ì— time zone ì˜µì…‹ì´ ë¹ ì¡ŒìŒ" -#: utils/misc/tzparser.c:132 +#: utils/misc/tzparser.c:133 #, c-format msgid "invalid number for time zone offset in time zone file \"%s\", line %d" msgstr "" "\"%s\" 표준 시간대 파ì¼ì˜ %d번째 줄ì—서 표준 시간대 오프셋 숫ìžê°€ 잘못ë¨" -#: utils/misc/tzparser.c:168 +#: utils/misc/tzparser.c:169 #, c-format msgid "invalid syntax in time zone file \"%s\", line %d" msgstr "\"%s\" time zone 파ì¼ì˜ %d번째 ì¤„ì— êµ¬ë¬¸ 오류" -#: utils/misc/tzparser.c:236 +#: utils/misc/tzparser.c:237 #, c-format msgid "time zone abbreviation \"%s\" is multiply defined" msgstr "표준 시간대 약어 \"%s\"ì€(는) 배수로 ì •ì˜ë¨" -#: utils/misc/tzparser.c:238 +#: utils/misc/tzparser.c:239 #, c-format msgid "" -"Entry in time zone file \"%s\", line %d, conflicts with entry in file \"%s" -"\", line %d." +"Entry in time zone file \"%s\", line %d, conflicts with entry in file " +"\"%s\", line %d." msgstr "" "\"%s\" 타임 ì¡´ 파ì¼ì˜ %d번째 ì¤„ì— ìžˆëŠ” í•­ëª©ì´ \"%s\" 파ì¼ì˜ %d번째 ì¤„ì— ìžˆëŠ” " "항목과 ì¶©ëŒí•©ë‹ˆë‹¤." -#: utils/misc/tzparser.c:300 +#: utils/misc/tzparser.c:301 #, c-format msgid "invalid time zone file name \"%s\"" msgstr "ìž˜ëª»ëœ time zone íŒŒì¼ ì´ë¦„: \"%s\"" -#: utils/misc/tzparser.c:313 +#: utils/misc/tzparser.c:314 #, c-format msgid "time zone file recursion limit exceeded in file \"%s\"" msgstr "\"%s\" 파ì¼ì—서 time zone íŒŒì¼ ìž¬ê·€í˜¸ì¶œ 최대치를 초과했ìŒ" -#: utils/misc/tzparser.c:352 utils/misc/tzparser.c:365 +#: utils/misc/tzparser.c:353 utils/misc/tzparser.c:366 #, c-format msgid "could not read time zone file \"%s\": %m" msgstr "\"%s\" time zone 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: utils/misc/tzparser.c:375 +#: utils/misc/tzparser.c:377 #, c-format msgid "line is too long in time zone file \"%s\", line %d" msgstr "\"%s\" 표준 시간대 파ì¼ì˜ %d번째 ì¤„ì´ ë„ˆë¬´ ê¹ë‹ˆë‹¤." -#: utils/misc/tzparser.c:398 +#: utils/misc/tzparser.c:401 #, c-format msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "\"%s\" 표준 시간대 파ì¼ì˜ %d번째 ì¤„ì— íŒŒì¼ ì´ë¦„ì´ ì—†ëŠ” @INCLUDEê°€ 있ìŒ" -#: utils/mmgr/aset.c:476 utils/mmgr/generation.c:234 utils/mmgr/slab.c:236 +#: utils/mmgr/aset.c:452 utils/mmgr/bump.c:184 utils/mmgr/generation.c:216 +#: utils/mmgr/slab.c:371 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "\"%s\" 메모리 컨í…스트를 만드는 ë™ì•ˆ 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤." -#: utils/mmgr/dsa.c:519 utils/mmgr/dsa.c:1332 +#: utils/mmgr/dsa.c:523 utils/mmgr/dsa.c:1364 #, c-format msgid "could not attach to dynamic shared area" msgstr "ë™ì  공유 메모리 ì˜ì—­ì„ 할당할 수 ì—†ìŒ" -#: utils/mmgr/mcxt.c:822 utils/mmgr/mcxt.c:858 utils/mmgr/mcxt.c:896 -#: utils/mmgr/mcxt.c:934 utils/mmgr/mcxt.c:970 utils/mmgr/mcxt.c:1001 -#: utils/mmgr/mcxt.c:1037 utils/mmgr/mcxt.c:1089 utils/mmgr/mcxt.c:1124 -#: utils/mmgr/mcxt.c:1159 +#: utils/mmgr/mcxt.c:1155 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "í¬ê¸°ê°€ %zuì¸ ìš”ì²­ì—서 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤. 해당 메모리 컨í…스트 \"%s\"" +#: utils/mmgr/mcxt.c:1299 +#, c-format +msgid "logging memory contexts of PID %d" +msgstr "%d번 PIDì˜ ë©”ëª¨ë¦¬ í˜„í™©ì„ ë¡œê¹…í•¨" + #: utils/mmgr/portalmem.c:187 #, c-format msgid "cursor \"%s\" already exists" @@ -28738,83 +33223,65 @@ msgstr "\"%s\" ì´ë¦„ì˜ ì»¤ì„œê°€ ì´ë¯¸ 있ìŒ" msgid "closing existing cursor \"%s\"" msgstr "ì´ë¯¸ 있는 \"%s\" 커서를 닫습니다" -#: utils/mmgr/portalmem.c:400 +#: utils/mmgr/portalmem.c:401 #, c-format msgid "portal \"%s\" cannot be run" msgstr "\"%s\" portal 실행할 수 ì—†ìŒ" -#: utils/mmgr/portalmem.c:478 +#: utils/mmgr/portalmem.c:479 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "\"%s\" ì„ ì ëœ í¬í„¸ì„ 삭제할 수 ì—†ìŒ" -#: utils/mmgr/portalmem.c:486 +#: utils/mmgr/portalmem.c:487 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "\"%s\" 활성 í¬í„¸ì„ 삭제할 수 ì—†ìŒ" -#: utils/mmgr/portalmem.c:731 +#: utils/mmgr/portalmem.c:738 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "WITH HOLD 옵션으로 커서를 만든 íŠ¸ëžœìž­ì…˜ì„ PREPAREí•  수 ì—†ìŒ" -#: utils/mmgr/portalmem.c:1270 +#: utils/mmgr/portalmem.c:1232 #, c-format msgid "" "cannot perform transaction commands inside a cursor loop that is not read-" "only" msgstr "" +"ì½ê¸° ì „ìš©ì´ ì•„ë‹Œ 커서 루프 ë‚´ì—서 트랜잭션 ëª…ë ¹ì„ ìˆ˜í–‰í•  수 없습니다" -#: utils/sort/logtape.c:266 utils/sort/logtape.c:289 -#, c-format -msgid "could not seek to block %ld of temporary file" -msgstr "임시 파ì¼ì˜ %ld ë¸”ëŸ­ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" - -#: utils/sort/logtape.c:295 -#, c-format -msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" -msgstr "%ld ë¸”ëŸ­ì„ ìž„ì‹œ 파ì¼ì—서 ì½ì„ 수 ì—†ìŒ: %zu / %zu ë°”ì´íŠ¸ë§Œ ì½ìŒ" - -#: utils/sort/sharedtuplestore.c:430 utils/sort/sharedtuplestore.c:439 -#: utils/sort/sharedtuplestore.c:462 utils/sort/sharedtuplestore.c:479 -#: utils/sort/sharedtuplestore.c:496 +#: utils/sort/logtape.c:266 utils/sort/logtape.c:287 #, c-format -msgid "could not read from shared tuplestore temporary file" -msgstr "tuplestore 임시 파ì¼ì„ ì½ì„ 수 ì—†ìŒ" +msgid "could not seek to block %lld of temporary file" +msgstr "임시 파ì¼ì˜ %lld ë¸”ëŸ­ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: utils/sort/sharedtuplestore.c:485 +#: utils/sort/sharedtuplestore.c:466 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "ê³µìœ ëœ tuplestore 임시 파ì¼ì—서 예ìƒì¹˜ 못한 ì²­í¬" -#: utils/sort/sharedtuplestore.c:569 +#: utils/sort/sharedtuplestore.c:548 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "공유 tuplestore 임시 파ì¼ì—서 %u 블ë¡ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: utils/sort/sharedtuplestore.c:576 -#, c-format -msgid "" -"could not read from shared tuplestore temporary file: read only %zu of %zu " -"bytes" -msgstr "공유 tuplestore 임시 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %zu / %zu ë°”ì´íŠ¸ë§Œ ì½ìŒ" - -#: utils/sort/tuplesort.c:3140 +#: utils/sort/tuplesort.c:2372 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "외부 ì •ë ¬ì„ ìœ„í•´ %d ê°œ ì´ìƒì˜ ëŸ°ì„ ë§Œë“¤ 수 ì—†ìŒ" -#: utils/sort/tuplesort.c:4221 +#: utils/sort/tuplesortvariants.c:1552 #, c-format msgid "could not create unique index \"%s\"" msgstr "\"%s\" 고유 ì¸ë±ìŠ¤ë¥¼ 만들 수 ì—†ìŒ" -#: utils/sort/tuplesort.c:4223 +#: utils/sort/tuplesortvariants.c:1554 #, c-format msgid "Key %s is duplicated." msgstr "%s 키가 중복ë¨" -#: utils/sort/tuplesort.c:4224 +#: utils/sort/tuplesortvariants.c:1555 #, c-format msgid "Duplicate keys exist." msgstr "ì¤‘ë³µëœ í‚¤ê°€ 있ìŒ" @@ -28828,39 +33295,32 @@ msgstr "ì¤‘ë³µëœ í‚¤ê°€ 있ìŒ" msgid "could not seek in tuplestore temporary file" msgstr "tuplestore 임시 파ì¼ì—서 seek ìž‘ì—…ì„ í•  수 ì—†ìŒ" -#: utils/sort/tuplestore.c:1477 utils/sort/tuplestore.c:1540 -#: utils/sort/tuplestore.c:1548 -#, c-format -msgid "" -"could not read from tuplestore temporary file: read only %zu of %zu bytes" -msgstr "tuplestore 임시 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %zu / %zu ë°”ì´íŠ¸ë§Œ ì½ìŒ" - -#: utils/time/snapmgr.c:624 +#: utils/time/snapmgr.c:536 #, c-format msgid "The source transaction is not running anymore." msgstr "소스 íŠ¸ëžœìž­ì…˜ì´ ë” ì´ìƒ 실행중ì´ì§€ 않ìŒ" -#: utils/time/snapmgr.c:1232 +#: utils/time/snapmgr.c:1136 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "서브트랜잭션ì—서 ìŠ¤ëƒ…ìƒ·ì„ ë‚´ë³´ë‚¼ 수 ì—†ìŒ" -#: utils/time/snapmgr.c:1391 utils/time/snapmgr.c:1396 -#: utils/time/snapmgr.c:1401 utils/time/snapmgr.c:1416 -#: utils/time/snapmgr.c:1421 utils/time/snapmgr.c:1426 -#: utils/time/snapmgr.c:1441 utils/time/snapmgr.c:1446 -#: utils/time/snapmgr.c:1451 utils/time/snapmgr.c:1553 -#: utils/time/snapmgr.c:1569 utils/time/snapmgr.c:1594 +#: utils/time/snapmgr.c:1296 utils/time/snapmgr.c:1301 +#: utils/time/snapmgr.c:1306 utils/time/snapmgr.c:1321 +#: utils/time/snapmgr.c:1326 utils/time/snapmgr.c:1331 +#: utils/time/snapmgr.c:1346 utils/time/snapmgr.c:1351 +#: utils/time/snapmgr.c:1356 utils/time/snapmgr.c:1470 +#: utils/time/snapmgr.c:1486 utils/time/snapmgr.c:1511 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "\"%s\" 파ì¼ì— 유효하지 ì•Šì€ ìŠ¤ëƒ…ìƒ· ìžë£Œê°€ 있습니다" -#: utils/time/snapmgr.c:1488 +#: utils/time/snapmgr.c:1393 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "쿼리보다 먼저 SET TRANSACTION SNAPSHOP ëª…ë ¹ì„ í˜¸ì¶œí•´ì•¼ 함" -#: utils/time/snapmgr.c:1497 +#: utils/time/snapmgr.c:1402 #, c-format msgid "" "a snapshot-importing transaction must have isolation level SERIALIZABLE or " @@ -28869,12 +33329,17 @@ msgstr "" "스냅샷 가져오기 íŠ¸ëžœìž­ì…˜ì€ ê·¸ 격리 ìˆ˜ì¤€ì´ SERIALIZABLE ë˜ëŠ” REPEATABLE READ " "여야 함" -#: utils/time/snapmgr.c:1506 utils/time/snapmgr.c:1515 +#: utils/time/snapmgr.c:1411 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "ìž˜ëª»ëœ ìŠ¤ëƒ…ìƒ· ì‹ë³„ìž: \"%s\"" -#: utils/time/snapmgr.c:1607 +#: utils/time/snapmgr.c:1426 +#, c-format +msgid "snapshot \"%s\" does not exist" +msgstr "\"%s\" ì´ë¦„ì˜ ìŠ¤ëƒ…ìƒ·ì´ ì—†ìŒ" + +#: utils/time/snapmgr.c:1524 #, c-format msgid "" "a serializable transaction cannot import a snapshot from a non-serializable " @@ -28883,7 +33348,7 @@ msgstr "" "ì§ë ¬í™” 가능한 íŠ¸ëžœìž­ì…˜ì€ ì§ë ¬í™” 가능하지 ì•Šì€ íŠ¸ëžœìž­ì…˜ì—서 ìŠ¤ëƒ…ìƒ·ì„ ê°€ì ¸ì˜¬ " "수 ì—†ìŒ" -#: utils/time/snapmgr.c:1611 +#: utils/time/snapmgr.c:1528 #, c-format msgid "" "a non-read-only serializable transaction cannot import a snapshot from a " @@ -28891,501 +33356,548 @@ msgid "" msgstr "" "ì½ê¸°-쓰기 ì§ë ¬í™”ëœ íŠ¸ëžœìž­ì…˜ì´ ì½ê¸° ì „ìš© íŠ¸ëžœìž­ì…˜ì˜ ìŠ¤ëƒ…ìƒ·ì„ ê°€ì ¸ì˜¬ 수 ì—†ìŒ" -#: utils/time/snapmgr.c:1626 +#: utils/time/snapmgr.c:1543 #, c-format msgid "cannot import a snapshot from a different database" msgstr "서로 다른 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 대ìƒìœ¼ë¡œëŠ” ìŠ¤ëƒ…ìƒ·ì„ ê°€ì ¸ì˜¬ 수 ì—†ìŒ" -#: gram.y:1047 +#: gram.y:1231 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD ì˜µì…˜ì€ ë”ì´ìƒ ì§€ì›í•˜ì§€ 않ìŒ" -#: gram.y:1048 +#: gram.y:1232 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." -msgstr "" +msgstr "비밀번호를 ì•”í˜¸í™”ëœ í˜•íƒœë¡œ 저장하려면 UNENCRYPTED를 빼세요." -#: gram.y:1110 -#, c-format -msgid "unrecognized role option \"%s\"" -msgstr "ì¸ì‹í•  수 없는 롤 옵션 \"%s\"" - -#: gram.y:1357 gram.y:1372 +#: gram.y:1559 gram.y:1575 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "" "CREATE SCHEMA IF NOT EXISTS 구문ì—서는 스키마 ìš”ì†Œë“¤ì„ í¬í•¨í•  수 없습니다." -#: gram.y:1518 +#: gram.y:1727 #, c-format msgid "current database cannot be changed" msgstr "현재 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 바꿀 수 ì—†ìŒ" -#: gram.y:1642 +#: gram.y:1860 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "" "지역시간대 간격(time zone interval) ê°’ì€ ì‹œ(HOUR) ë˜ëŠ” 시분(HOUR TO MINUTE) " -"ê°’ì´ì–´ì•¼í•©ë‹ˆë‹¤" +"ê°’ì´ì–´ì•¼ 합니다" -#: gram.y:2177 +#: gram.y:2487 #, c-format msgid "column number must be in range from 1 to %d" msgstr "칼럼 번호는 1 - %d 사ì´ì˜ ë²”ìœ„ì— ìžˆì–´ì•¼ 합니다." -#: gram.y:2709 +#: gram.y:3083 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "\"%s\" 시퀀스 ì˜µì…˜ì€ ì§€ì›ë˜ì§€ 않ìŒ" -#: gram.y:2738 +#: gram.y:3122 #, c-format msgid "modulus for hash partition provided more than once" msgstr "해시 파티션용 ëª¨ë“ˆì„ í•œ 번 ì´ìƒ 지정했습니다" -#: gram.y:2747 +#: gram.y:3131 #, c-format msgid "remainder for hash partition provided more than once" msgstr "해시 파티션용 나머지 처리기를 한 번 ì´ìƒ 지정했습니다" -#: gram.y:2754 +#: gram.y:3138 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "ìž˜ëª»ëœ í•´ì‹œ 파티션 범위 명세 \"%s\"" -#: gram.y:2762 +#: gram.y:3146 #, c-format msgid "modulus for hash partition must be specified" msgstr "해시 파티션용 ëª¨ë“ˆì„ ì§€ì •í•˜ì„¸ìš”" -#: gram.y:2766 +#: gram.y:3150 #, c-format msgid "remainder for hash partition must be specified" msgstr "해시 파티션용 나머지 처리기를 지정하세요" -#: gram.y:2967 gram.y:3000 +#: gram.y:3358 gram.y:3392 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "PROGRAM 옵션과 STDIN/STDOUT ì˜µì…˜ì€ í•¨ê»˜ 쓸 수 없습니다" -#: gram.y:2973 +#: gram.y:3364 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "WHERE ì ˆì€ COPY TO êµ¬ë¬¸ì„ í—ˆìš©í•˜ì§€ 않ìŒ" -#: gram.y:3305 gram.y:3312 gram.y:11647 gram.y:11655 +#: gram.y:3712 gram.y:3719 gram.y:13023 gram.y:13031 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "GLOBAL 예약어는 임시 í…Œì´ë¸” 만들기ì—서 ë” ì´ìƒ 사용하지 않습니다" -#: gram.y:3552 +#: gram.y:3995 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" -msgstr "" +msgstr "ê³„ì‚°ëœ ì¹¼ëŸ¼ì„ ì‚¬ìš©í•˜ë ¤ë©´, GENERATED ALWAYS ì˜µì…˜ì´ ìžˆì–´ì•¼ 함" + +#: gram.y:4432 +#, c-format +msgid "a column list with %s is only supported for ON DELETE actions" +msgstr "%sì˜ ì¹¼ëŸ¼ 목ë¡ì€ ON DELETE 액션용으로만 ì§€ì›í•©ë‹ˆë‹¤." -#: gram.y:4512 +#: gram.y:5151 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM êµ¬ë¬¸ì€ ì§€ì›í•˜ì§€ 않습니다." -#: gram.y:5338 +#: gram.y:5849 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "ì¸ì‹í•  수 없는 로우 단위 보안 옵션 \"%s\"" -#: gram.y:5339 +#: gram.y:5850 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." -msgstr "" +msgstr "PERMISSIVE ë˜ëŠ” RESTRICTIVE ì •ì±…ë§Œ 현재 ì§€ì›í•©ë‹ˆë‹¤." -#: gram.y:5452 +#: gram.y:5935 +#, c-format +msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" +msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER êµ¬ë¬¸ì€ ì§€ì›í•˜ì§€ 않습니다." + +#: gram.y:5972 msgid "duplicate trigger events specified" msgstr "중복 트리거 ì´ë²¤íŠ¸ê°€ 지정ë¨" -#: gram.y:5600 +#: gram.y:6121 #, c-format msgid "conflicting constraint properties" msgstr "제약조건 ì†ì„±ì´ ì¶©ëŒí•¨" -#: gram.y:5696 +#: gram.y:6220 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTION ëª…ë ¹ì€ ì•„ì§ êµ¬í˜„ ë˜ì§€ 않았습니다" -#: gram.y:6079 +#: gram.y:6537 +#, c-format +msgid "dropping an enum value is not implemented" +msgstr "구현ë˜ì§€ ì•Šì€ enum ê°’ì„ ì‚­ì œ 중" + +#: gram.y:6655 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK는 ë” ì´ìƒ 필요하지 않ìŒ" -#: gram.y:6080 +#: gram.y:6656 #, c-format msgid "Update your data type." msgstr "ìžë£Œí˜•ì„ ì—…ë°ì´íŠ¸í•˜ì‹­ì‹œì˜¤." -#: gram.y:7831 +#: gram.y:8529 #, c-format msgid "aggregates cannot have output arguments" msgstr "집계 함수는 output ì¸ìžë¥¼ 지정할 수 ì—†ìŒ" -#: gram.y:10153 gram.y:10171 +#: gram.y:11221 gram.y:11240 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTION êµ¬ë¬¸ì€ ìž¬ê·€ì ì¸ ë·°ì—서 ì§€ì›í•˜ì§€ 않습니다" -#: gram.y:11779 +#: gram.y:13162 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "LIMIT #,# êµ¬ë¬¸ì€ ì§€ì›í•˜ì§€ 않습니다." -#: gram.y:11780 +#: gram.y:13163 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "LIMIT # OFFSET # êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: gram.y:12106 gram.y:12131 -#, c-format -msgid "VALUES in FROM must have an alias" -msgstr "FROM ì•ˆì˜ VALUES는 반드시 aliasê°€ 있어야합니다" - -#: gram.y:12107 gram.y:12132 -#, c-format -msgid "For example, FROM (VALUES ...) [AS] foo." -msgstr "예, FROM (VALUES ...) [AS] foo." - -#: gram.y:12112 gram.y:12137 -#, c-format -msgid "subquery in FROM must have an alias" -msgstr "FROM ì ˆ ë‚´ì˜ subquery ì—는 반드시 alias 를 가져야만 합니다" - -#: gram.y:12113 gram.y:12138 -#, c-format -msgid "For example, FROM (SELECT ...) [AS] foo." -msgstr "예, FROM (SELECT ...) [AS] foo." - -#: gram.y:12591 +#: gram.y:14038 #, c-format msgid "only one DEFAULT value is allowed" -msgstr "" +msgstr "DEFAULT ê°’ì€ í•˜ë‚˜ë§Œ 허용함" -#: gram.y:12600 +#: gram.y:14047 #, c-format msgid "only one PATH value per column is allowed" -msgstr "" +msgstr "PATH ê°’ì€ ì¹¼ëŸ¼ë‹¹ 하나만 허용함" -#: gram.y:12609 +#: gram.y:14056 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "NULL/NOT NULL ì„ ì–¸ì´ ì„œë¡œ ì¶©ëŒí•©ë‹ˆë‹¤ : \"%s\" 칼럼" -#: gram.y:12618 +#: gram.y:14065 #, c-format msgid "unrecognized column option \"%s\"" msgstr "ì¸ì‹í•  수 없는 칼럼 옵션 \"%s\"" -#: gram.y:12872 +#: gram.y:14147 +#, c-format +msgid "only string constants are supported in JSON_TABLE path specification" +msgstr "JSON_TABLE 경로 명세ì—서는 문ìžì—´ ìƒìˆ˜ë§Œ ì§€ì›í•¨" + +#: gram.y:14469 #, c-format msgid "precision for type float must be at least 1 bit" -msgstr "실수형 ìžë£Œì˜ ì •ë°€ë„ ê°’ìœ¼ë¡œëŠ” ì ì–´ë„ 1 bit ì´ìƒì„ 지정해야합니다." +msgstr "실수형 ìžë£Œì˜ ì •ë°€ë„ ê°’ìœ¼ë¡œëŠ” ì ì–´ë„ 1 bit ì´ìƒì„ 지정해야 합니다." -#: gram.y:12881 +#: gram.y:14478 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "실수형 ìžë£Œì˜ ì •ë°€ë„ ê°’ìœ¼ë¡œ 최대 54 bit 까지입니다." -#: gram.y:13372 +#: gram.y:14995 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "OVERLAPS ì‹ì˜ ì™¼ìª½ì— ìžˆëŠ” 매개 변수 수가 잘못ë¨" -#: gram.y:13377 +#: gram.y:15000 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "OVERLAPS ì‹ì˜ ì˜¤ë¥¸ìª½ì— ìžˆëŠ” 매개 변수 수가 잘못ë¨" -#: gram.y:13552 +#: gram.y:15177 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE 술어는 ì•„ì§ êµ¬í˜„ë˜ì§€ 못했습니다" -#: gram.y:13915 +#: gram.y:15591 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "WITHIN GROUP 구문 안ì—서 ì¤‘ë³µëœ ORDER BY êµ¬ë¬¸ì€ í—ˆìš©í•˜ì§€ 않습니다" -#: gram.y:13920 +#: gram.y:15596 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCTê³¼ WITHIN GROUPì„ í•¨ê»˜ 쓸 수 없습니다" -#: gram.y:13925 +#: gram.y:15601 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADICê³¼ WITHIN GROUPì„ í•¨ê»˜ 쓸 수 없습니다" -#: gram.y:14391 gram.y:14414 +#: gram.y:16328 gram.y:16352 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "프레임 ì‹œìž‘ì€ UNBOUNDED FOLLOWINGì¼ ìˆ˜ ì—†ìŒ" -#: gram.y:14396 +#: gram.y:16333 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "ë”°ë¼ì˜¤ëŠ” ë¡œìš°ì˜ í”„ë ˆìž„ ì‹œìž‘ì€ í˜„ìž¬ ë¡œìš°ì˜ ëì¼ ìˆ˜ 없습니다" -#: gram.y:14419 +#: gram.y:16357 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "프레임 ëì€ UNBOUNDED PRECEDINGì¼ ìˆ˜ ì—†ìŒ" -#: gram.y:14425 +#: gram.y:16363 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "현재 ë¡œìš°ì˜ í”„ë ˆìž„ ì‹œìž‘ì€ ì„ í–‰í•˜ëŠ” 로우를 가질 수 없습니다" -#: gram.y:14432 +#: gram.y:16370 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "ë”°ë¼ì˜¤ëŠ” ë¡œìš°ì˜ í”„ë ˆìž„ ì‹œìž‘ì€ ì„ í–‰í•˜ëŠ” 로우를 가질 수 없습니다" -#: gram.y:15082 +#: gram.y:16919 +#, c-format +msgid "unrecognized JSON encoding: %s" +msgstr "알 수 없는 JSON ì¸ì½”딩: %s" + +#: gram.y:17243 #, c-format msgid "type modifier cannot have parameter name" msgstr "ìžë£Œí˜• 한정ìžëŠ” 매개 변수 ì´ë¦„ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: gram.y:15088 +#: gram.y:17249 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "ìžë£Œí˜• 한정ìžëŠ” ORDER BY êµ¬ë¬¸ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: gram.y:15153 gram.y:15160 +#: gram.y:17317 gram.y:17324 gram.y:17331 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s ì´ë¦„ì€ ì—¬ê¸°ì„œ 롤 ì´ë¦„으로 사용할 수 ì—†ìŒ" -#: gram.y:15841 gram.y:16030 +#: gram.y:17421 gram.y:18906 +#, c-format +msgid "WITH TIES cannot be specified without ORDER BY clause" +msgstr "WITH TIES ì ˆì€ ORDER BY 절과 함께 사용ë˜ì–´ì•¼ 함" + +#: gram.y:18597 gram.y:18772 msgid "improper use of \"*\"" msgstr "\"*\" ì‚¬ìš©ì´ ìž˜ëª»ë¨" -#: gram.y:16094 +#: gram.y:18836 #, c-format msgid "" "an ordered-set aggregate with a VARIADIC direct argument must have one " "VARIADIC aggregated argument of the same data type" msgstr "" +"VARIADIC ì§ì ‘ ì¸ìžê°€ 있는 ì •ë ¬ëœ ì§‘í•© 집계 함수는 ë™ì¼í•œ ìžë£Œí˜•ì˜ VARIADIC " +"ì§‘ê³„ëœ ì¸ìžê°€ 하나 있어야 합니다." -#: gram.y:16131 +#: gram.y:18873 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "ì¤‘ë³µëœ ORDER BY êµ¬ë¬¸ì€ í—ˆìš©í•˜ì§€ 않습니다" -#: gram.y:16142 +#: gram.y:18884 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "ì¤‘ë³µëœ OFFSET êµ¬ë¬¸ì€ í—ˆìš©í•˜ì§€ 않습니다" -#: gram.y:16151 +#: gram.y:18893 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "ì¤‘ë³µëœ LIMIT êµ¬ë¬¸ì€ í—ˆìš©í•˜ì§€ 않습니다" -#: gram.y:16160 +#: gram.y:18902 #, c-format msgid "multiple limit options not allowed" msgstr "ì¤‘ë³µëœ limit ì˜µì…˜ì€ í—ˆìš©í•˜ì§€ 않ìŒ" -#: gram.y:16164 -#, c-format -msgid "WITH TIES cannot be specified without ORDER BY clause" -msgstr "" - -#: gram.y:16172 +#: gram.y:18929 #, c-format msgid "multiple WITH clauses not allowed" msgstr "ì¤‘ë³µëœ WITH ì ˆì€ í—ˆìš©í•˜ì§€ 않ìŒ" -#: gram.y:16376 +#: gram.y:19122 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "OUT ë° INOUT ì¸ìžëŠ” TABLE í•¨ìˆ˜ì— ì‚¬ìš©í•  수 ì—†ìŒ" -#: gram.y:16472 +#: gram.y:19255 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "ì¤‘ë³µëœ COLLATE êµ¬ë¬¸ì€ í—ˆìš©í•˜ì§€ 않습니다" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16510 gram.y:16523 +#: gram.y:19293 gram.y:19306 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "%s 제약조건ì—는 DEFERRABLE ì˜µì…˜ì„ ì“¸ 수 ì—†ìŒ" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16536 +#: gram.y:19319 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "%s 제약조건ì—는 NOT VALID ì˜µì…˜ì„ ì“¸ 수 ì—†ìŒ" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:16549 +#: gram.y:19332 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s 제약조건ì—는 NO INHERIT ì˜µì…˜ì„ ì“¸ 수 ì—†ìŒ" -#: guc-file.l:315 +#: gram.y:19354 #, c-format -msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %u" -msgstr "알 수 없는 환경 매개 변수 ì´ë¦„: \"%s\", 해당 파ì¼: \"%s\", 줄번호: %u" +msgid "unrecognized partitioning strategy \"%s\"" +msgstr "알 수 없는 파티션 규칙 \"%s\"" -#: guc-file.l:388 +#: gram.y:19378 #, c-format -msgid "parameter \"%s\" removed from configuration file, reset to default" -msgstr "환경설정 파ì¼ì— \"%s\" 매개 변수가 빠졌ìŒ, ì´ˆê¸°ê°’ì„ ì‚¬ìš©í•¨" +msgid "invalid publication object list" +msgstr "ìž˜ëª»ëœ ë°œí–‰ ê°ì²´ 목ë¡" -#: guc-file.l:454 +#: gram.y:19379 #, c-format -msgid "parameter \"%s\" changed to \"%s\"" -msgstr "\"%s\" 매개 변수 ê°’ì„ \"%s\"(으)로 바꿨ìŒ" +msgid "" +"One of TABLE or TABLES IN SCHEMA must be specified before a standalone table " +"or schema name." +msgstr "" +"TABLEì´ë‚˜ TABLES IN SCHEMA 중 하나가 ë…립 í…Œì´ë¸”ì´ë‚˜ 스키마 ì´ë¦„ ì•žì— ìžˆì–´ì•¼ 합니다." -#: guc-file.l:496 +#: gram.y:19395 #, c-format -msgid "configuration file \"%s\" contains errors" -msgstr "\"%s\" 환경 설정파ì¼ì— 오류가 있ìŒ" +msgid "invalid table name" +msgstr "ìž˜ëª»ëœ í…Œì´ë¸” ì´ë¦„" -#: guc-file.l:501 +#: gram.y:19416 #, c-format -msgid "" -"configuration file \"%s\" contains errors; unaffected changes were applied" -msgstr "\"%s\" 환경 설정 파ì¼ì— 오류가 있어 새로 ë³€ê²½ë  ì„¤ì •ì´ ì—†ìŠµë‹ˆë‹¤" +msgid "WHERE clause not allowed for schema" +msgstr "WHERE ì ˆì€ ìŠ¤í‚¤ë§ˆìš©ìœ¼ë¡œ 허용하지 않ìŒ" -#: guc-file.l:506 +#: gram.y:19423 #, c-format -msgid "configuration file \"%s\" contains errors; no changes were applied" -msgstr "\"%s\" 환경 설정 파ì¼ì— 오류가 있어 아무 ì„¤ì •ë„ ë°˜ì˜ë˜ì§€ 않았습니다." +msgid "column specification not allowed for schema" +msgstr "칼럼 명세는 스키마용으로 허용하지 않ìŒ" -#: guc-file.l:578 +#: gram.y:19437 +#, c-format +msgid "invalid schema name" +msgstr "ìž˜ëª»ëœ ìŠ¤í‚¤ë§ˆ ì´ë¦„" + +#: guc-file.l:192 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "비어있는 환경 설정 íŒŒì¼ ì´ë¦„: \"%s\"" -#: guc-file.l:595 +#: guc-file.l:209 #, c-format msgid "" "could not open configuration file \"%s\": maximum nesting depth exceeded" msgstr "설정 íŒŒì¼ \"%s\"ì„ ì—´ 수 없습니다: 최대 디렉터리 깊ì´ë¥¼ 초과했ìŒ" -#: guc-file.l:615 +#: guc-file.l:229 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "\"%s\" ì•ˆì— í™˜ê²½ 설정파ì¼ì´ 서로 참조함" -#: guc-file.l:642 +#: guc-file.l:245 +#, c-format +msgid "could not open configuration file \"%s\": %m" +msgstr "\"%s\" 설정 íŒŒì¼ ì„ ì—´ìˆ˜ 없습니다: %m" + +#: guc-file.l:256 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "\"%s\" 환경 설정파ì¼ì´ 없으나 건너뜀" -#: guc-file.l:896 +#: guc-file.l:511 #, c-format msgid "syntax error in file \"%s\" line %u, near end of line" msgstr "\"%s\" íŒŒì¼ %u 줄 ë부분ì—서 구문 오류 있ìŒ" -#: guc-file.l:906 +#: guc-file.l:521 #, c-format msgid "syntax error in file \"%s\" line %u, near token \"%s\"" msgstr "\"%s\" íŒŒì¼ %u 줄ì—서 구문 오류 있ìŒ, \"%s\" í† í° ë¶€ê·¼" -#: guc-file.l:926 +#: guc-file.l:541 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "구문 오류가 너무 많습니다. \"%s\" 파ì¼ì„ 무시합니다" -#: guc-file.l:981 -#, c-format -msgid "empty configuration directory name: \"%s\"" -msgstr "비어 있는 환경 설정 디렉터리 ì´ë¦„: \"%s\"" - -#: guc-file.l:1000 +#: jsonpath_gram.y:267 #, c-format -msgid "could not open configuration directory \"%s\": %m" -msgstr "\"%s\" 환경 설정 디렉터리를 ì—´ 수 없습니다: %m" +msgid ".decimal() can only have an optional precision[,scale]." +msgstr ".decimal() 함수는 precision[,scale] ë§Œ ì„ íƒì ìœ¼ë¡œ 쓸 수 있ìŒ." -#: jsonpath_gram.y:529 +#: jsonpath_gram.y:599 #, c-format -msgid "unrecognized flag character \"%c\" in LIKE_REGEX predicate" -msgstr "LIKE_REGEX í•œì •ìž ì•ˆì—, 알 수 없는 플래그 문ìž: \"%c\"" +msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." +msgstr "LIKE_REGEX 구문ì—서 알 수 없는 플래그 문ìž: \"%.*s\"" -#: jsonpath_gram.y:583 +#: jsonpath_gram.y:677 #, c-format msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" -msgstr "" +msgstr "XQuery \"x\" 플래그 (í™•ìž¥ëœ ì •ê·œ 표현ì‹)는 구현ë˜ì§€ 않았습니다." + +#: jsonpath_scan.l:174 +msgid "invalid Unicode escape sequence" +msgstr "ìž˜ëª»ëœ ìœ ë‹ˆì½”ë“œ ì´ìŠ¤ì¼€ì´í”„ 순차연결" + +#: jsonpath_scan.l:180 +msgid "invalid hexadecimal character sequence" +msgstr "ìž˜ëª»ëœ 16진수 ë¬¸ìž ìˆœì°¨ì—°ê²°" + +#: jsonpath_scan.l:195 +msgid "unexpected end after backslash" +msgstr "백슬래시 ë’¤ 예기치 ì•Šì€ ì¤„ ë" + +#: jsonpath_scan.l:201 repl_scanner.l:211 scan.l:756 +msgid "unterminated quoted string" +msgstr "마무리 ì•ˆëœ ë”°ì˜´í‘œ ì•ˆì˜ ë¬¸ìžì—´" + +#: jsonpath_scan.l:228 +msgid "unexpected end of comment" +msgstr "ì£¼ì„ ë’¤ 예기치 ì•Šì€ ì¤„ ë" + +#: jsonpath_scan.l:319 +msgid "invalid numeric literal" +msgstr "ìž˜ëª»ëœ ìˆ«ìž ë¬¸ìžì—´" + +#: jsonpath_scan.l:325 jsonpath_scan.l:331 jsonpath_scan.l:337 scan.l:1064 +#: scan.l:1068 scan.l:1072 scan.l:1076 +msgid "trailing junk after numeric literal" +msgstr "ìˆ«ìž ë’¤ì— ì“¸ëª¨ 없는 ê°’ì´ ë” ìžˆìŒ" #. translator: %s is typically "syntax error" -#: jsonpath_scan.l:286 +#: jsonpath_scan.l:375 #, c-format msgid "%s at end of jsonpath input" msgstr "%s, jsonpath ìž…ë ¥ ë부분" #. translator: first %s is typically "syntax error" -#: jsonpath_scan.l:293 +#: jsonpath_scan.l:382 #, c-format msgid "%s at or near \"%s\" of jsonpath input" msgstr "%s, jsonpath ìž…ë ¥ \"%s\" 부근" -#: repl_gram.y:349 repl_gram.y:381 +#: jsonpath_scan.l:568 +msgid "invalid input" +msgstr "ìž˜ëª»ëœ ìž…ë ¥" + +#: jsonpath_scan.l:594 +msgid "invalid hexadecimal digit" +msgstr "ìž˜ëª»ëœ 16진수" + +#: jsonpath_scan.l:625 +#, c-format +msgid "could not convert Unicode to server encoding" +msgstr "유니코드를 서버 ì¸ì½”딩으로 바꿀 수 ì—†ìŒ" + +#: repl_gram.y:318 repl_gram.y:359 #, c-format msgid "invalid timeline %u" msgstr "ìž˜ëª»ëœ íƒ€ìž„ë¼ì¸: %u" -#: repl_scanner.l:131 +#: repl_scanner.l:154 msgid "invalid streaming start location" msgstr "ìž˜ëª»ëœ ìŠ¤íŠ¸ë¦¬ë° ì‹œìž‘ 위치" -#: repl_scanner.l:182 scan.l:717 -msgid "unterminated quoted string" -msgstr "마무리 ì•ˆëœ ë”°ì˜´í‘œ ì•ˆì˜ ë¬¸ìžì—´" - # # advance ë -#: scan.l:458 +#: scan.l:497 msgid "unterminated /* comment" msgstr "마무리 ì•ˆëœ /* 주ì„" -#: scan.l:478 +#: scan.l:517 msgid "unterminated bit string literal" msgstr "마무리 ì•ˆëœ ë¹„íŠ¸ 문ìžì—´ 문ìž" -#: scan.l:492 +#: scan.l:531 msgid "unterminated hexadecimal string literal" msgstr "마무리 ì•ˆëœ 16진수 문ìžì—´ 문ìž" -#: scan.l:542 +#: scan.l:581 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "유니코드 ì´ìŠ¤ì¼€ì´í”„와 함께 문ìžì—´ ìƒìˆ˜ë¥¼ 사용하는 ê²ƒì€ ì•ˆì „í•˜ì§€ 않ìŒ" -#: scan.l:543 +#: scan.l:582 #, c-format msgid "" "String constants with Unicode escapes cannot be used when " -"standard_conforming_strings is off." +"\"standard_conforming_strings\" is off." msgstr "" -"standard_conforming_strings = off ì¸ ê²½ìš° 문ìžì—´ ìƒìˆ˜ 표기ì—서 유니코드 ì´ìФ" +"\"standard_conforming_strings\" = off ì¸ ê²½ìš° 문ìžì—´ ìƒìˆ˜ 표기ì—서 유니코드 ì´ìФ" "ì¼€ì´í”„를 사용할 수 없습니다." -#: scan.l:604 +#: scan.l:643 msgid "unhandled previous state in xqs" -msgstr "" +msgstr "xqs ì•ˆì— ì²˜ë¦¬í•  수 없는 ì´ì „ ìƒíƒœ" -#: scan.l:678 +#: scan.l:717 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "유니코드 ì´ìŠ¤ì¼€ì´í”„는 \\uXXXX ë˜ëŠ” \\UXXXXXXXX 형태여야 합니다." -#: scan.l:689 +#: scan.l:728 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "문ìžì—´ ì•ˆì— \\' ì‚¬ìš©ì´ ì•ˆì „í•˜ì§€ 않습니다" -#: scan.l:690 +#: scan.l:729 #, c-format msgid "" "Use '' to write quotes in strings. \\' is insecure in client-only encodings." @@ -29393,62 +33905,92 @@ msgstr "" "ìž‘ì€ ë”°ì˜´í‘œëŠ” '' 형태로 사용하십시오. \\' í‘œê¸°ë²•ì€ í´ë¼ì´ì–¸íЏ ì „ìš© ì¸ì½”딩ì—" "서 안전하지 않습니다." -#: scan.l:762 +#: scan.l:801 msgid "unterminated dollar-quoted string" msgstr "마무리 ì•ˆëœ ë‹¬ëŸ¬-따옴표 ì•ˆì˜ ë¬¸ìžì—´" -#: scan.l:779 scan.l:789 +#: scan.l:818 scan.l:828 msgid "zero-length delimited identifier" msgstr "길ì´ê°€ 0ì¸ êµ¬ë¶„ ì‹ë³„ìž" -#: scan.l:800 syncrep_scanner.l:91 +#: scan.l:839 syncrep_scanner.l:101 msgid "unterminated quoted identifier" msgstr "마무리 ì•ˆëœ ë”°ì˜´í‘œ ì•ˆì˜ ì‹ë³„ìž" # # nonun 부분 begin -#: scan.l:963 +#: scan.l:1002 msgid "operator too long" msgstr "ì—°ì‚°ìžê°€ 너무 ê¹ë‹ˆë‹¤." +#: scan.l:1015 +msgid "trailing junk after parameter" +msgstr "매개 변수 ë’¤ì— ì“¸ëª¨ 없는 ê°’ì´ ë” ìžˆìŒ" + +#: scan.l:1036 +msgid "invalid hexadecimal integer" +msgstr "ìž˜ëª»ëœ 16진수" + +#: scan.l:1040 +msgid "invalid octal integer" +msgstr "ìž˜ëª»ëœ 8진수" + +#: scan.l:1044 +msgid "invalid binary integer" +msgstr "ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 숫ìž" + #. translator: %s is typically the translation of "syntax error" -#: scan.l:1171 +#: scan.l:1239 #, c-format msgid "%s at end of input" msgstr "%s, ìž…ë ¥ ë부분" #. translator: first %s is typically the translation of "syntax error" -#: scan.l:1179 +#: scan.l:1247 #, c-format msgid "%s at or near \"%s\"" msgstr "%s, \"%s\" 부근" -#: scan.l:1373 +#: scan.l:1439 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "문ìžì—´ ì•ˆì— ìžˆëŠ” \\' 문ìžëŠ” í‘œì¤€ì´ ì•„ë‹™ë‹ˆë‹¤" -#: scan.l:1374 +#: scan.l:1440 #, c-format msgid "" "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "ìž‘ì€ ë”°ì˜´í‘œëŠ” '' 형태니, ì¸ìš©ë¶€í˜¸ 표기법(E'...') 형태로 사용하십시오." -#: scan.l:1383 +#: scan.l:1449 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "문ìžì—´ ì•ˆì— ìžˆëŠ” \\\\ 문ìžëŠ” í‘œì¤€ì´ ì•„ë‹™ë‹ˆë‹¤" -#: scan.l:1384 +#: scan.l:1450 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "백슬래시 표기는 ì¸ìš©ë¶€í˜¸ 표기법으로 사용하세요, 예, E'\\\\'." -#: scan.l:1398 +#: scan.l:1464 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "문ìžì—´ ì•ˆì— ë¹„í‘œì¤€ escape 문ìžë¥¼ 사용하고 있습니다" -#: scan.l:1399 +#: scan.l:1465 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "ì¸ìš©ë¶€í˜¸ í‘œê¸°ë²•ì„ ì‚¬ìš©í•˜ì„¸ìš”, 예, E'\\r\\n'." + +#, c-format +#~ msgid "removing future two-phase state file of epoch %u for transaction %u" +#~ msgstr "" +#~ "epoch %uì˜ future two-phase ìƒíƒœì •ë³´ 파ì¼ì„ 삭제함, ëŒ€ìƒ íŠ¸ëžœìž­ì…˜: %u" + +#, c-format +#~ msgid "removing past two-phase state file of epoch %u for transaction %u" +#~ msgstr "epoch %uì˜ past two-phase ìƒíƒœì •ë³´ 파ì¼ì„ 삭제함, ëŒ€ìƒ íŠ¸ëžœìž­ì…˜: %u" + +#, c-format +#~ msgid "removing past two-phase state from memory for transaction %u" +#~ msgstr "" +#~ "%u 트랜잭션ì—서 사용하는 past two-phase ìƒíƒœì •보를 메모리ì—서 삭제함" diff --git a/src/backend/po/meson.build b/src/backend/po/meson.build index b3cb083eb2c70..ff995b5d6a5be 100644 --- a/src/backend/po/meson.build +++ b/src/backend/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('postgres-' + pg_version_major.to_string())] diff --git a/src/backend/po/pt_BR.po b/src/backend/po/pt_BR.po index 37e4a28f07a27..4e0a926f54742 100644 --- a/src/backend/po/pt_BR.po +++ b/src/backend/po/pt_BR.po @@ -1,15697 +1,23211 @@ # Brazilian Portuguese message translation file for postgres +# # Copyright (C) 2009 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Euler Taveira de Oliveira , 2003-2014. +# +# Euler Taveira , 2003-2014. +# Halley Pacheco de Oliveira , 2023-2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.4\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2014-12-09 12:26-0300\n" -"PO-Revision-Date: 2010-05-11 08:53-0300\n" -"Last-Translator: Euler Taveira de Oliveira \n" -"Language-Team: Brazilian Portuguese \n" +"Project-Id-Version: PostgreSQL 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-01-17 11:44-0300\n" +"PO-Revision-Date: 2024-06-26 11:02+0200\n" +"Last-Translator: Halley Pacheco de Oliveira \n" +"Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n>1);\n" +"X-Generator: Poedit 3.4.2\n" -#: ../common/exec.c:127 ../common/exec.c:241 ../common/exec.c:284 +#: ../common/compression.c:132 ../common/compression.c:141 +#: ../common/compression.c:150 #, c-format -msgid "could not identify current directory: %s" -msgstr "não pôde identificar diretório atual: %s" +msgid "this build does not support compression with %s" +msgstr "essa construção não oferece suporte a compressão com %s" -#: ../common/exec.c:146 +#: ../common/compression.c:205 +msgid "found empty string where a compression option was expected" +msgstr "encontrada uma cadeia de caracteres vazia onde era esperada uma opção de compressão" + +#: ../common/compression.c:244 #, c-format -msgid "invalid binary \"%s\"" -msgstr "binário \"%s\" é inválido" +msgid "unrecognized compression option: \"%s\"" +msgstr "opção de compressão não reconhecida: \"%s\"" -#: ../common/exec.c:195 +#: ../common/compression.c:283 #, c-format -msgid "could not read binary \"%s\"" -msgstr "não pôde ler o binário \"%s\"" +msgid "compression option \"%s\" requires a value" +msgstr "a opção de compressão \"%s\" requer um valor" -#: ../common/exec.c:202 +#: ../common/compression.c:292 #, c-format -msgid "could not find a \"%s\" to execute" -msgstr "não pôde encontrar o \"%s\" para executá-lo" +msgid "value for compression option \"%s\" must be an integer" +msgstr "o valor da opção de compressão \"%s\" deve ser um número inteiro" -#: ../common/exec.c:257 ../common/exec.c:293 +#: ../common/compression.c:331 #, c-format -msgid "could not change directory to \"%s\": %s" -msgstr "não pôde mudar diretório para \"%s\": %s" +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "o valor da opção de compressão \"%s\" deve ser um valor booleano" -#: ../common/exec.c:272 +#: ../common/compression.c:379 #, c-format -msgid "could not read symbolic link \"%s\"" -msgstr "não pôde ler link simbólico \"%s\"" +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "o algoritmo de compressão \"%s\" não aceita nível de compressão" -#: ../common/exec.c:523 +#: ../common/compression.c:386 #, c-format -msgid "pclose failed: %s" -msgstr "pclose falhou: %s" +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "o algoritmo de compressão \"%s\" espera um nível de compressão entre %d e %d (padrão %d)" -#: ../common/fe_memutils.c:33 ../common/fe_memutils.c:60 -#: ../common/fe_memutils.c:83 ../common/psprintf.c:181 ../port/path.c:598 -#: ../port/path.c:636 ../port/path.c:653 +#: ../common/compression.c:397 #, c-format -msgid "out of memory\n" -msgstr "sem memória\n" +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "o algoritmo de compressão \"%s\" não aceita contagem de processos trabalhadores" -#: ../common/fe_memutils.c:77 +#: ../common/compression.c:408 #, c-format -msgid "cannot duplicate null pointer (internal error)\n" -msgstr "não pode duplicar ponteiro nulo (erro interno)\n" - -#: ../common/pgfnames.c:45 -#, c-format -msgid "could not open directory \"%s\": %s\n" -msgstr "não pôde abrir diretório \"%s\": %s\n" - -#: ../common/pgfnames.c:72 -#, c-format -msgid "could not read directory \"%s\": %s\n" -msgstr "não pôde ler diretório \"%s\": %s\n" - -#: ../common/pgfnames.c:84 -#, c-format -msgid "could not close directory \"%s\": %s\n" -msgstr "não pôde fechar diretório \"%s\": %s\n" - -#: ../common/psprintf.c:179 ../port/path.c:596 ../port/path.c:634 -#: ../port/path.c:651 access/transam/xlog.c:6123 lib/stringinfo.c:258 -#: libpq/auth.c:823 libpq/auth.c:1179 libpq/auth.c:1247 libpq/auth.c:1647 -#: postmaster/bgworker.c:267 postmaster/bgworker.c:783 -#: postmaster/postmaster.c:2173 postmaster/postmaster.c:2204 -#: postmaster/postmaster.c:3740 postmaster/postmaster.c:4441 -#: postmaster/postmaster.c:4526 postmaster/postmaster.c:5218 -#: postmaster/postmaster.c:5450 storage/buffer/buf_init.c:154 -#: storage/buffer/localbuf.c:396 storage/file/fd.c:458 storage/file/fd.c:855 -#: storage/file/fd.c:973 storage/file/fd.c:1586 storage/ipc/procarray.c:909 -#: storage/ipc/procarray.c:1395 storage/ipc/procarray.c:1402 -#: storage/ipc/procarray.c:1751 storage/ipc/procarray.c:2335 -#: utils/adt/formatting.c:1519 utils/adt/formatting.c:1639 -#: utils/adt/formatting.c:1760 utils/adt/regexp.c:219 utils/adt/varlena.c:3653 -#: utils/adt/varlena.c:3674 utils/fmgr/dfmgr.c:224 utils/hash/dynahash.c:379 -#: utils/hash/dynahash.c:456 utils/hash/dynahash.c:970 utils/mb/mbutils.c:376 -#: utils/mb/mbutils.c:709 utils/misc/guc.c:3571 utils/misc/guc.c:3587 -#: utils/misc/guc.c:3600 utils/misc/tzparser.c:470 utils/mmgr/aset.c:499 -#: utils/mmgr/aset.c:678 utils/mmgr/aset.c:872 utils/mmgr/aset.c:1114 +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "o algoritmo de compressão \"%s\" não oferece suporte a modo de longa distância" + +#: ../common/config_info.c:134 ../common/config_info.c:142 +#: ../common/config_info.c:150 ../common/config_info.c:158 +#: ../common/config_info.c:166 ../common/config_info.c:174 +#: ../common/config_info.c:182 ../common/config_info.c:190 +msgid "not recorded" +msgstr "não registrado" + +#: ../common/controldata_utils.c:79 ../common/controldata_utils.c:83 +#: commands/copyfrom.c:1687 commands/extension.c:3480 utils/adt/genfile.c:123 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "não foi possível abrir o arquivo \"%s\" para leitura: %m" + +#: ../common/controldata_utils.c:94 ../common/controldata_utils.c:96 +#: access/transam/timeline.c:143 access/transam/timeline.c:362 +#: access/transam/twophase.c:1347 access/transam/xlog.c:3195 +#: access/transam/xlog.c:3998 access/transam/xlogrecovery.c:1199 +#: access/transam/xlogrecovery.c:1291 access/transam/xlogrecovery.c:1328 +#: access/transam/xlogrecovery.c:1388 backup/basebackup.c:1842 +#: commands/extension.c:3490 libpq/hba.c:769 replication/logical/origin.c:745 +#: replication/logical/origin.c:781 replication/logical/reorderbuffer.c:5050 +#: replication/logical/snapbuild.c:2031 replication/slot.c:1953 +#: replication/slot.c:1994 replication/walsender.c:643 +#: storage/file/buffile.c:470 storage/file/copydir.c:185 +#: utils/adt/genfile.c:197 utils/adt/misc.c:984 utils/cache/relmapper.c:827 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "não foi possível ler o arquivo \"%s\": %m" + +#: ../common/controldata_utils.c:102 ../common/controldata_utils.c:105 +#: access/transam/xlog.c:3200 access/transam/xlog.c:4003 +#: backup/basebackup.c:1846 replication/logical/origin.c:750 +#: replication/logical/origin.c:789 replication/logical/snapbuild.c:2036 +#: replication/slot.c:1957 replication/slot.c:1998 replication/walsender.c:648 +#: utils/cache/relmapper.c:831 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "não foi possível ler o arquivo \"%s\", lidos %d de %zu" + +#: ../common/controldata_utils.c:114 ../common/controldata_utils.c:118 +#: ../common/controldata_utils.c:263 ../common/controldata_utils.c:266 +#: access/heap/rewriteheap.c:1175 access/heap/rewriteheap.c:1280 +#: access/transam/timeline.c:392 access/transam/timeline.c:438 +#: access/transam/timeline.c:512 access/transam/twophase.c:1359 +#: access/transam/twophase.c:1771 access/transam/xlog.c:3041 +#: access/transam/xlog.c:3235 access/transam/xlog.c:3240 +#: access/transam/xlog.c:3376 access/transam/xlog.c:3968 +#: access/transam/xlog.c:4887 commands/copyfrom.c:1747 commands/copyto.c:332 +#: libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 +#: replication/logical/origin.c:683 replication/logical/origin.c:822 +#: replication/logical/reorderbuffer.c:5102 +#: replication/logical/snapbuild.c:1798 replication/logical/snapbuild.c:1922 +#: replication/slot.c:1844 replication/slot.c:2005 replication/walsender.c:658 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:782 +#: storage/file/fd.c:3700 storage/file/fd.c:3806 utils/cache/relmapper.c:839 +#: utils/cache/relmapper.c:945 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "não foi possível fechar o arquivo \"%s\": %m" + +#: ../common/controldata_utils.c:154 +msgid "byte ordering mismatch" +msgstr "ordenação de bytes não corresponde" + +#: ../common/controldata_utils.c:156 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"possível não correspondência da ordenação de bytes\n" +"A ordenação de bytes usada para armazenar o arquivo pg_control pode não \n" +"corresponder com a usada por este programa. Neste caso os resultados abaixo\n" +"seriam incorretos, e a instalação do PostgreSQL seria incompatível com o diretório de dados." + +#: ../common/controldata_utils.c:211 ../common/controldata_utils.c:216 +#: ../common/file_utils.c:228 ../common/file_utils.c:287 +#: ../common/file_utils.c:361 access/heap/rewriteheap.c:1263 +#: access/transam/timeline.c:111 access/transam/timeline.c:251 +#: access/transam/timeline.c:348 access/transam/twophase.c:1303 +#: access/transam/xlog.c:2948 access/transam/xlog.c:3111 +#: access/transam/xlog.c:3150 access/transam/xlog.c:3343 +#: access/transam/xlog.c:3988 access/transam/xlogrecovery.c:4179 +#: access/transam/xlogrecovery.c:4282 access/transam/xlogutils.c:838 +#: backup/basebackup.c:538 backup/basebackup.c:1512 libpq/hba.c:629 +#: postmaster/syslogger.c:1560 replication/logical/origin.c:735 +#: replication/logical/reorderbuffer.c:3706 +#: replication/logical/reorderbuffer.c:4257 +#: replication/logical/reorderbuffer.c:5030 +#: replication/logical/snapbuild.c:1753 replication/logical/snapbuild.c:1863 +#: replication/slot.c:1925 replication/walsender.c:616 +#: replication/walsender.c:2731 storage/file/copydir.c:151 +#: storage/file/fd.c:757 storage/file/fd.c:3457 storage/file/fd.c:3687 +#: storage/file/fd.c:3777 storage/smgr/md.c:663 utils/cache/relmapper.c:816 +#: utils/cache/relmapper.c:924 utils/error/elog.c:2082 +#: utils/init/miscinit.c:1537 utils/init/miscinit.c:1671 +#: utils/init/miscinit.c:1748 utils/misc/guc.c:4609 utils/misc/guc.c:4659 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "não foi possível abrir o arquivo \"%s\": %m" + +#: ../common/controldata_utils.c:232 ../common/controldata_utils.c:235 +#: access/transam/twophase.c:1744 access/transam/twophase.c:1753 +#: access/transam/xlog.c:8757 access/transam/xlogfuncs.c:708 +#: backup/basebackup_server.c:175 backup/basebackup_server.c:268 +#: postmaster/postmaster.c:5573 postmaster/syslogger.c:1571 +#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 +#: utils/cache/relmapper.c:936 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "não foi possível escrever no arquivo \"%s\": %m" + +#: ../common/controldata_utils.c:249 ../common/controldata_utils.c:254 +#: ../common/file_utils.c:299 ../common/file_utils.c:369 +#: access/heap/rewriteheap.c:959 access/heap/rewriteheap.c:1169 +#: access/heap/rewriteheap.c:1274 access/transam/timeline.c:432 +#: access/transam/timeline.c:506 access/transam/twophase.c:1765 +#: access/transam/xlog.c:3034 access/transam/xlog.c:3229 +#: access/transam/xlog.c:3961 access/transam/xlog.c:8147 +#: access/transam/xlog.c:8192 backup/basebackup_server.c:209 +#: replication/logical/snapbuild.c:1791 replication/slot.c:1830 +#: replication/slot.c:1935 storage/file/fd.c:774 storage/file/fd.c:3798 +#: storage/smgr/md.c:1135 storage/smgr/md.c:1180 storage/sync/sync.c:451 +#: utils/misc/guc.c:4379 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "não foi possível executar fsync no arquivo \"%s\": %m" + +#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:133 +#: ../common/cryptohash_openssl.c:332 ../common/exec.c:550 ../common/exec.c:595 +#: ../common/exec.c:687 ../common/hmac.c:309 ../common/hmac.c:325 +#: ../common/hmac_openssl.c:132 ../common/hmac_openssl.c:327 +#: ../common/md5_common.c:155 ../common/psprintf.c:143 +#: ../common/scram-common.c:269 ../common/stringinfo.c:305 ../port/path.c:751 +#: ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1412 +#: access/transam/xlogrecovery.c:589 lib/dshash.c:253 libpq/auth.c:1343 +#: libpq/auth.c:1387 libpq/auth.c:1944 libpq/be-secure-gssapi.c:524 +#: postmaster/bgworker.c:352 postmaster/bgworker.c:934 +#: postmaster/postmaster.c:2537 postmaster/postmaster.c:4130 +#: postmaster/postmaster.c:5498 postmaster/postmaster.c:5869 +#: replication/libpqwalreceiver/libpqwalreceiver.c:322 +#: replication/logical/logical.c:208 replication/walsender.c:686 +#: storage/buffer/localbuf.c:601 storage/file/fd.c:866 storage/file/fd.c:1397 +#: storage/file/fd.c:1558 storage/file/fd.c:2478 storage/ipc/procarray.c:1449 +#: storage/ipc/procarray.c:2231 storage/ipc/procarray.c:2238 +#: storage/ipc/procarray.c:2737 storage/ipc/procarray.c:3373 +#: utils/adt/formatting.c:1690 utils/adt/formatting.c:1812 +#: utils/adt/formatting.c:1935 utils/adt/pg_locale.c:473 +#: utils/adt/pg_locale.c:637 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:514 +#: utils/hash/dynahash.c:614 utils/hash/dynahash.c:1111 utils/mb/mbutils.c:402 +#: utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 utils/mb/mbutils.c:842 +#: utils/misc/guc.c:640 utils/misc/guc.c:665 utils/misc/guc.c:1053 +#: utils/misc/guc.c:4357 utils/misc/tzparser.c:476 utils/mmgr/aset.c:445 +#: utils/mmgr/dsa.c:714 utils/mmgr/dsa.c:736 utils/mmgr/dsa.c:817 +#: utils/mmgr/generation.c:205 utils/mmgr/mcxt.c:1046 utils/mmgr/mcxt.c:1082 +#: utils/mmgr/mcxt.c:1120 utils/mmgr/mcxt.c:1158 utils/mmgr/mcxt.c:1246 +#: utils/mmgr/mcxt.c:1277 utils/mmgr/mcxt.c:1313 utils/mmgr/mcxt.c:1502 +#: utils/mmgr/mcxt.c:1547 utils/mmgr/mcxt.c:1604 utils/mmgr/slab.c:366 #, c-format msgid "out of memory" msgstr "sem memória" -#: ../common/relpath.c:59 +#: ../common/cryptohash.c:266 ../common/cryptohash.c:272 +#: ../common/cryptohash_openssl.c:344 ../common/cryptohash_openssl.c:352 +#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:339 +#: ../common/hmac_openssl.c:347 +msgid "success" +msgstr "sucesso" + +#: ../common/cryptohash.c:268 ../common/cryptohash_openssl.c:346 +#: ../common/hmac_openssl.c:341 +msgid "destination buffer too small" +msgstr "buffer de destino muito pequeno" + +#: ../common/cryptohash_openssl.c:348 ../common/hmac_openssl.c:343 +msgid "OpenSSL failure" +msgstr "falha de OpenSSL" + +#: ../common/exec.c:172 #, c-format -msgid "invalid fork name" -msgstr "nome de fork é inválido" +msgid "invalid binary \"%s\": %m" +msgstr "binário inválido \"%s\": %m" -#: ../common/relpath.c:60 +#: ../common/exec.c:215 #, c-format -msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." -msgstr "Nomes válidos são \"main\", \"fsm\", \"vm\" e \"init\"." +msgid "could not read binary \"%s\": %m" +msgstr "não foi possível ler o binário \"%s\": %m" -#: ../common/rmtree.c:77 +#: ../common/exec.c:223 #, c-format -msgid "could not stat file or directory \"%s\": %s\n" -msgstr "não pôde executar stat no arquivo ou diretório \"%s\": %s\n" +msgid "could not find a \"%s\" to execute" +msgstr "não foi possível encontrar \"%s\" para executar" -#: ../common/rmtree.c:104 ../common/rmtree.c:121 +#: ../common/exec.c:250 #, c-format -msgid "could not remove file or directory \"%s\": %s\n" -msgstr "não pôde remover arquivo ou diretório \"%s\": %s\n" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "não foi possível resolver o caminho \"%s\" para a forma absoluta: %m" -#: ../common/username.c:45 +#: ../common/exec.c:412 libpq/pqcomm.c:728 storage/ipc/latch.c:1128 +#: storage/ipc/latch.c:1308 storage/ipc/latch.c:1541 storage/ipc/latch.c:1703 +#: storage/ipc/latch.c:1829 #, c-format -msgid "could not look up effective user ID %ld: %s" -msgstr "não pôde encontrar ID de usuário efetivo %ld: %s" +msgid "%s() failed: %m" +msgstr "%s() falhou: %m" -#: ../common/username.c:47 libpq/auth.c:1594 -msgid "user does not exist" -msgstr "usuário não existe" +#: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 +#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 +#: ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 +#: ../port/path.c:808 utils/misc/ps_status.c:168 utils/misc/ps_status.c:176 +#: utils/misc/ps_status.c:203 utils/misc/ps_status.c:211 +#, c-format +msgid "out of memory\n" +msgstr "sem memória\n" -#: ../common/username.c:61 +#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:153 #, c-format -msgid "user name lookup failure: %s" -msgstr "falhou ao pesquisar nome de usuário: %s" +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "não é possível duplicar ponteiro nulo (erro interno)\n" + +#: ../common/file_utils.c:87 ../common/file_utils.c:447 +#: ../common/file_utils.c:451 access/transam/twophase.c:1315 +#: access/transam/xlogarchive.c:112 access/transam/xlogarchive.c:236 +#: backup/basebackup.c:346 backup/basebackup.c:544 backup/basebackup.c:615 +#: commands/copyfrom.c:1697 commands/copyto.c:702 commands/extension.c:3469 +#: commands/tablespace.c:810 commands/tablespace.c:899 postmaster/pgarch.c:590 +#: replication/logical/snapbuild.c:1649 storage/file/fd.c:1922 +#: storage/file/fd.c:2008 storage/file/fd.c:3511 utils/adt/dbsize.c:106 +#: utils/adt/dbsize.c:258 utils/adt/dbsize.c:338 utils/adt/genfile.c:483 +#: utils/adt/genfile.c:658 utils/adt/misc.c:340 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "não foi possível executar stat no arquivo \"%s\": %m" -#: ../common/wait_error.c:47 +#: ../common/file_utils.c:162 ../common/pgfnames.c:48 ../common/rmtree.c:63 +#: commands/tablespace.c:734 commands/tablespace.c:744 +#: postmaster/postmaster.c:1564 storage/file/fd.c:2880 +#: storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:338 #, c-format -msgid "command not executable" -msgstr "comando não é executável" +msgid "could not open directory \"%s\": %m" +msgstr "não foi possível abrir diretório \"%s\": %m" -#: ../common/wait_error.c:51 +#: ../common/file_utils.c:196 ../common/pgfnames.c:69 ../common/rmtree.c:104 +#: storage/file/fd.c:2892 #, c-format -msgid "command not found" -msgstr "comando não encontrado" +msgid "could not read directory \"%s\": %m" +msgstr "não foi possível ler o diretório \"%s\": %m" -#: ../common/wait_error.c:56 +#: ../common/file_utils.c:379 access/transam/xlogarchive.c:390 +#: postmaster/pgarch.c:746 postmaster/syslogger.c:1608 +#: replication/logical/snapbuild.c:1810 replication/slot.c:723 +#: replication/slot.c:1716 replication/slot.c:1858 storage/file/fd.c:792 +#: utils/time/snapmgr.c:1284 #, c-format -msgid "child process exited with exit code %d" -msgstr "processo filho terminou com código de saída %d" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "não foi possível renomear o arquivo \"%s\" para \"%s\": %m" -#: ../common/wait_error.c:63 +#: ../common/hmac.c:323 +msgid "internal error" +msgstr "erro interno" + +#: ../common/jsonapi.c:1144 #, c-format -msgid "child process was terminated by exception 0x%X" -msgstr "processo filho foi terminado pela exceção 0x%X" +msgid "Escape sequence \"\\%s\" is invalid." +msgstr "A sequência de escape \"\\%s\" não é válida." -#: ../common/wait_error.c:73 +#: ../common/jsonapi.c:1147 #, c-format -msgid "child process was terminated by signal %s" -msgstr "processo filho foi terminado pelo sinal %s" +msgid "Character with value 0x%02x must be escaped." +msgstr "O caractere com valor 0x%02x deve ser precedido por um caractere de escape." -#: ../common/wait_error.c:77 +#: ../common/jsonapi.c:1150 #, c-format -msgid "child process was terminated by signal %d" -msgstr "processo filho foi terminado pelo sinal %d" +msgid "Expected end of input, but found \"%s\"." +msgstr "Esperado o fim da entrada, mas encontrado \"%s\"." -#: ../common/wait_error.c:82 +#: ../common/jsonapi.c:1153 #, c-format -msgid "child process exited with unrecognized status %d" -msgstr "processo filho terminou com status desconhecido %d" +msgid "Expected array element or \"]\", but found \"%s\"." +msgstr "Esperado elemento da matriz ou \"]\", mas encontrado \"%s\"." -#: ../port/chklocale.c:259 +#: ../common/jsonapi.c:1156 #, c-format -msgid "could not determine encoding for codeset \"%s\"" -msgstr "não pôde determinar codificação para conjunto de códigos \"%s\"" +msgid "Expected \",\" or \"]\", but found \"%s\"." +msgstr "Esperado \",\" ou \"]\", mas encontrado \"%s\"." -#: ../port/chklocale.c:260 ../port/chklocale.c:389 +#: ../common/jsonapi.c:1159 #, c-format -msgid "Please report this to ." -msgstr "Por favor relate isto a ." +msgid "Expected \":\", but found \"%s\"." +msgstr "Esperado \":\", mas encontrado \"%s\"." -#: ../port/chklocale.c:381 ../port/chklocale.c:387 +#: ../common/jsonapi.c:1162 #, c-format -msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" -msgstr "não pôde determinar codificação para configuração regional \"%s\": codeset é \"%s\"" +msgid "Expected JSON value, but found \"%s\"." +msgstr "Esperado valor JSON, mas encontrado \"%s\"." + +#: ../common/jsonapi.c:1165 +msgid "The input string ended unexpectedly." +msgstr "A cadeia de caracteres de entrada terminou de forma não esperada." -#: ../port/dirmod.c:216 +#: ../common/jsonapi.c:1167 #, c-format -msgid "could not set junction for \"%s\": %s" -msgstr "não pôde definir junção para \"%s\": %s" +msgid "Expected string or \"}\", but found \"%s\"." +msgstr "Esperada uma cadeia de caracteres ou \"}\", mas encontrado \"%s\"." -#: ../port/dirmod.c:219 +#: ../common/jsonapi.c:1170 #, c-format -msgid "could not set junction for \"%s\": %s\n" -msgstr "não pôde definir junção para \"%s\": %s\n" +msgid "Expected \",\" or \"}\", but found \"%s\"." +msgstr "Esperado \",\" ou \"}\", mas encontrado \"%s\"." -#: ../port/dirmod.c:291 +#: ../common/jsonapi.c:1173 #, c-format -msgid "could not get junction for \"%s\": %s" -msgstr "não pôde obter junção para \"%s\": %s" +msgid "Expected string, but found \"%s\"." +msgstr "Esperada uma cadeia de caracteres, mas encontrado \"%s\"." -#: ../port/dirmod.c:294 +#: ../common/jsonapi.c:1176 #, c-format -msgid "could not get junction for \"%s\": %s\n" -msgstr "não pôde obter junção para \"%s\": %s\n" +msgid "Token \"%s\" is invalid." +msgstr "O elemento \"%s\" não é válido." -#: ../port/open.c:112 +#: ../common/jsonapi.c:1179 jsonpath_scan.l:597 #, c-format -msgid "could not open file \"%s\": %s" -msgstr "não pôde abrir arquivo \"%s\": %s" +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 não pode ser convertido em texto." -#: ../port/open.c:113 -msgid "lock violation" -msgstr "violação de bloqueio" +#: ../common/jsonapi.c:1181 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "\"\\u\" deve ser seguido por quatro dígitos hexadecimais." -#: ../port/open.c:113 -msgid "sharing violation" -msgstr "violação de compartilhamento" +#: ../common/jsonapi.c:1184 +msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." +msgstr "Os valores de escape Unicode não podem ser usados para valores de ponto de código acima de 007F quando a codificação não é UTF8." -#: ../port/open.c:114 +#: ../common/jsonapi.c:1187 #, c-format -msgid "Continuing to retry for 30 seconds." -msgstr "Continuar tentando por 30 segundos." +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "O valor de escape Unicode não pôde ser convertido para a codificação %s do servidor." -#: ../port/open.c:115 +#: ../common/jsonapi.c:1190 jsonpath_scan.l:630 #, c-format -msgid "You might have antivirus, backup, or similar software interfering with the database system." -msgstr "Você pode ter programa de antivírus, cópia de segurança ou similares interferindo com o sistema de banco de dados." +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "Uma substituição alta Unicode não deve seguir uma substituição alta." -#: ../port/path.c:620 +#: ../common/jsonapi.c:1192 jsonpath_scan.l:641 jsonpath_scan.l:651 +#: jsonpath_scan.l:702 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "não pôde obter diretório de trabalho atual: %s\n" +msgid "Unicode low surrogate must follow a high surrogate." +msgstr "Um «low-surrogate» Unicode deve seguir um «high-surrogate»." -#: ../port/strerror.c:25 +#: ../common/logging.c:276 #, c-format -msgid "unrecognized error %d" -msgstr "erro desconhecido %d" +msgid "error: " +msgstr "erro: " -#: ../port/win32error.c:189 +#: ../common/logging.c:283 #, c-format -msgid "mapped win32 error code %lu to %d" -msgstr "código de erro win32 mapeado de %lu para %d" +msgid "warning: " +msgstr "aviso: " -#: ../port/win32error.c:201 +#: ../common/logging.c:294 #, c-format -msgid "unrecognized win32 error code: %lu" -msgstr "código de erro win32 desconhecido: %lu" +msgid "detail: " +msgstr "detalhe: " -#: access/common/heaptuple.c:679 access/common/heaptuple.c:1419 +#: ../common/logging.c:301 #, c-format -msgid "number of columns (%d) exceeds limit (%d)" -msgstr "número de colunas (%d) excede limite (%d)" +msgid "hint: " +msgstr "dica: " -#: access/common/indextuple.c:57 +#: ../common/percentrepl.c:79 ../common/percentrepl.c:85 +#: ../common/percentrepl.c:118 ../common/percentrepl.c:124 +#: postmaster/postmaster.c:2211 utils/misc/guc.c:3120 utils/misc/guc.c:3156 +#: utils/misc/guc.c:3226 utils/misc/guc.c:4556 utils/misc/guc.c:6738 +#: utils/misc/guc.c:6779 #, c-format -msgid "number of index columns (%d) exceeds limit (%d)" -msgstr "número de colunas indexadas (%d) excede limite (%d)" +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "valor inválido para o parâmetro \"%s\": \"%s\"" -#: access/common/indextuple.c:173 access/spgist/spgutils.c:605 +#: ../common/percentrepl.c:80 ../common/percentrepl.c:86 #, c-format -msgid "index row requires %zu bytes, maximum size is %zu" -msgstr "registro do índice requer %zu bytes, tamanho máximo é %zu" +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "A cadeia de caracteres termina de forma não esperada após o caractere de escape \"%%\"." -#: access/common/printtup.c:294 tcop/fastpath.c:182 tcop/fastpath.c:571 -#: tcop/postgres.c:1672 +#: ../common/percentrepl.c:119 ../common/percentrepl.c:125 #, c-format -msgid "unsupported format code: %d" -msgstr "código do formato não é suportado: %d" +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "A cadeia de caracteres contém o espaço reservado não esperado \"%%%c\"." -#: access/common/reloptions.c:396 +#: ../common/pgfnames.c:74 #, c-format -msgid "user-defined relation parameter types limit exceeded" -msgstr "limite dos tipos de parâmetro da relação definidos pelo usuário foi excedido" +msgid "could not close directory \"%s\": %m" +msgstr "não foi possível fechar o diretório \"%s\": %m" -#: access/common/reloptions.c:680 +#: ../common/relpath.c:61 #, c-format -msgid "RESET must not include values for parameters" -msgstr "RESET não deve incluir valores para parâmetros" +msgid "invalid fork name" +msgstr "o nome do fork não é válido" -#: access/common/reloptions.c:713 +#: ../common/relpath.c:62 #, c-format -msgid "unrecognized parameter namespace \"%s\"" -msgstr "namespace do parâmetro \"%s\" desconhecido" +msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." +msgstr "Nomes válidos são \"main\", \"fsm\", \"vm\" e \"init\"." -#: access/common/reloptions.c:959 parser/parse_clause.c:268 +#: ../common/restricted_token.c:60 #, c-format -msgid "unrecognized parameter \"%s\"" -msgstr "parâmetro \"%s\" desconhecido" +msgid "could not open process token: error code %lu" +msgstr "não foi possível abrir informação sobre processo: código de erro %lu" -#: access/common/reloptions.c:984 +#: ../common/restricted_token.c:74 #, c-format -msgid "parameter \"%s\" specified more than once" -msgstr "parâmetro \"%s\" foi especificado mais de uma vez" +msgid "could not allocate SIDs: error code %lu" +msgstr "não foi possível alocar SIDs: código de erro %lu" -#: access/common/reloptions.c:999 +#: ../common/restricted_token.c:94 #, c-format -msgid "invalid value for boolean option \"%s\": %s" -msgstr "valor é inválido para opção booleano \"%s\": %s" +msgid "could not create restricted token: error code %lu" +msgstr "não foi possível criar informação restrita: código de erro %lu" -#: access/common/reloptions.c:1010 +#: ../common/restricted_token.c:115 #, c-format -msgid "invalid value for integer option \"%s\": %s" -msgstr "valor é inválido para opção inteiro \"%s\": %s" +msgid "could not start process for command \"%s\": error code %lu" +msgstr "não foi possível iniciar processo para comando \"%s\": código de erro %lu" -#: access/common/reloptions.c:1015 access/common/reloptions.c:1033 +#: ../common/restricted_token.c:153 #, c-format -msgid "value %s out of bounds for option \"%s\"" -msgstr "valor %s está fora do intervalo para opção \"%s\"" +msgid "could not re-execute with restricted token: error code %lu" +msgstr "não foi possível executar novamente com informação restrita: código de erro %lu" -#: access/common/reloptions.c:1017 +#: ../common/restricted_token.c:168 #, c-format -msgid "Valid values are between \"%d\" and \"%d\"." -msgstr "Valores válidos estão entre \"%d\" e \"%d\"." +msgid "could not get exit code from subprocess: error code %lu" +msgstr "não foi possível obter código de saída de subprocesso: código de erro %lu" -#: access/common/reloptions.c:1028 +#: ../common/rmtree.c:95 access/heap/rewriteheap.c:1248 +#: access/transam/twophase.c:1704 access/transam/xlogarchive.c:120 +#: access/transam/xlogarchive.c:400 postmaster/postmaster.c:1143 +#: postmaster/syslogger.c:1537 replication/logical/origin.c:591 +#: replication/logical/reorderbuffer.c:4526 +#: replication/logical/snapbuild.c:1691 replication/logical/snapbuild.c:2125 +#: replication/slot.c:1909 storage/file/fd.c:832 storage/file/fd.c:3325 +#: storage/file/fd.c:3387 storage/file/reinit.c:262 storage/ipc/dsm.c:316 +#: storage/smgr/md.c:383 storage/smgr/md.c:442 storage/sync/sync.c:248 +#: utils/time/snapmgr.c:1608 #, c-format -msgid "invalid value for floating point option \"%s\": %s" -msgstr "valor é inválido para opção ponto flutuante \"%s\": %s" +msgid "could not remove file \"%s\": %m" +msgstr "não foi possível remover o arquivo \"%s\": %m" -#: access/common/reloptions.c:1035 +#: ../common/rmtree.c:122 commands/tablespace.c:773 commands/tablespace.c:786 +#: commands/tablespace.c:821 commands/tablespace.c:911 storage/file/fd.c:3317 +#: storage/file/fd.c:3726 #, c-format -msgid "Valid values are between \"%f\" and \"%f\"." -msgstr "Valores válidos estão entre \"%f\" e \"%f\"." +msgid "could not remove directory \"%s\": %m" +msgstr "não foi possível remover o diretório \"%s\": %m" -#: access/common/tupconvert.c:108 -#, c-format -msgid "Returned type %s does not match expected type %s in column %d." -msgstr "Tipo %s retornado não corresponde ao tipo %s esperado na coluna %d." +#: ../common/scram-common.c:282 +msgid "could not encode salt" +msgstr "não foi possível codificar o sal" -#: access/common/tupconvert.c:136 -#, c-format -msgid "Number of returned columns (%d) does not match expected column count (%d)." -msgstr "Número de colunas retornadas (%d) não corresponde a contagem de colunas esperada (%d)" +#: ../common/scram-common.c:298 +msgid "could not encode stored key" +msgstr "não foi possível codificar a chave armazenada" -#: access/common/tupconvert.c:241 -#, c-format -msgid "Attribute \"%s\" of type %s does not match corresponding attribute of type %s." -msgstr "Atributo \"%s\" do tipo %s não corresponde ao atributo do tipo %s." +#: ../common/scram-common.c:315 +msgid "could not encode server key" +msgstr "não foi possível codificar a chave do servidor" -#: access/common/tupconvert.c:253 +#: ../common/stringinfo.c:306 #, c-format -msgid "Attribute \"%s\" of type %s does not exist in type %s." -msgstr "Atributo \"%s\" do tipo %s não existe no tipo %s." +msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." +msgstr "Não é possível aumentar o buffer da cadeia de caracteres contendo %d bytes para mais %d bytes." -#: access/common/tupdesc.c:635 parser/parse_relation.c:1339 +#: ../common/stringinfo.c:310 #, c-format -msgid "column \"%s\" cannot be declared SETOF" -msgstr "coluna \"%s\" não pode ser declarada SETOF" +msgid "" +"out of memory\n" +"\n" +"Cannot enlarge string buffer containing %d bytes by %d more bytes.\n" +msgstr "" +"sem memória\n" +"\n" +"Não é possível ampliar o buffer de cadeia de caracteres contendo %d bytes em mais %d bytes\n" -#: access/gin/ginentrypage.c:108 access/gist/gist.c:1281 -#: access/nbtree/nbtinsert.c:545 access/nbtree/nbtsort.c:485 -#: access/spgist/spgdoinsert.c:1880 +#: ../common/username.c:43 #, c-format -msgid "index row size %zu exceeds maximum %zu for index \"%s\"" -msgstr "tamanho de registro do índice %zu excede o máximo %zu para índice \"%s\"" +msgid "could not look up effective user ID %ld: %s" +msgstr "não foi possível encontrar ID de usuário efetivo %ld: %s" -#: access/gin/ginscan.c:402 -#, c-format -msgid "old GIN indexes do not support whole-index scans nor searches for nulls" -msgstr "índices GIN antigos não suportam buscas em todo índice e nem buscas por nulos" +#: ../common/username.c:45 libpq/auth.c:1879 +msgid "user does not exist" +msgstr "usuário não existe" -#: access/gin/ginscan.c:403 +#: ../common/username.c:60 #, c-format -msgid "To fix this, do REINDEX INDEX \"%s\"." -msgstr "Para corrigir isto, faça REINDEX INDEX \"%s\"." +msgid "user name lookup failure: error code %lu" +msgstr "falhou ao pesquisar nome de usuário: código de erro %lu" -#: access/gist/gist.c:624 access/gist/gistvacuum.c:266 +#: ../common/wait_error.c:55 #, c-format -msgid "index \"%s\" contains an inner tuple marked as invalid" -msgstr "índice \"%s\" contém uma tupla interna marcada como inválida" +msgid "command not executable" +msgstr "comando não é executável" -#: access/gist/gist.c:626 access/gist/gistvacuum.c:268 +#: ../common/wait_error.c:59 #, c-format -msgid "This is caused by an incomplete page split at crash recovery before upgrading to PostgreSQL 9.1." -msgstr "Isso é causado por uma divisão de página incompleta durante recuperação de desastre antes da atualização para PostgreSQL 9.1." +msgid "command not found" +msgstr "comando não encontrado" -#: access/gist/gist.c:627 access/gist/gistutil.c:693 -#: access/gist/gistutil.c:704 access/gist/gistvacuum.c:269 -#: access/hash/hashutil.c:172 access/hash/hashutil.c:183 -#: access/hash/hashutil.c:195 access/hash/hashutil.c:216 -#: access/nbtree/nbtpage.c:509 access/nbtree/nbtpage.c:520 +#: ../common/wait_error.c:64 #, c-format -msgid "Please REINDEX it." -msgstr "Por favor execute REINDEX." +msgid "child process exited with exit code %d" +msgstr "processo filho terminou com código de saída %d" -#: access/gist/gistbuild.c:254 +#: ../common/wait_error.c:72 #, c-format -msgid "invalid value for \"buffering\" option" -msgstr "valor é inválido para opção \"buffering\"" +msgid "child process was terminated by exception 0x%X" +msgstr "processo filho foi terminado pela exceção 0x%X" -#: access/gist/gistbuild.c:255 +#: ../common/wait_error.c:76 #, c-format -msgid "Valid values are \"on\", \"off\", and \"auto\"." -msgstr "Valores válidos são \"on\", \"off\" e \"auto\"." +msgid "child process was terminated by signal %d: %s" +msgstr "processo filho foi terminado pelo sinal %d: %s" -#: access/gist/gistbuildbuffers.c:780 utils/sort/logtape.c:212 +#: ../common/wait_error.c:82 #, c-format -msgid "could not write block %ld of temporary file: %m" -msgstr "não pôde escrever bloco %ld do arquivo temporário: %m" +msgid "child process exited with unrecognized status %d" +msgstr "processo filho terminou com status desconhecido %d" -#: access/gist/gistsplit.c:446 +#: ../port/chklocale.c:283 #, c-format -msgid "picksplit method for column %d of index \"%s\" failed" -msgstr "método picksplit para coluna %d do índice \"%s\" falhou" +msgid "could not determine encoding for codeset \"%s\"" +msgstr "não foi possível determinar codificação para conjunto de códigos \"%s\"" -#: access/gist/gistsplit.c:448 +#: ../port/chklocale.c:404 ../port/chklocale.c:410 #, c-format -msgid "The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command." -msgstr "O índice não é ótimo. Para otimizá-lo, entre em contato com um desenvolvedor ou tente utilizar a coluna como a segunda no comando CREATE INDEX." +msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" +msgstr "não foi possível determinar codificação para configuração regional \"%s\": codeset é \"%s\"" -#: access/gist/gistutil.c:690 access/hash/hashutil.c:169 -#: access/nbtree/nbtpage.c:506 +#: ../port/dirmod.c:284 #, c-format -msgid "index \"%s\" contains unexpected zero page at block %u" -msgstr "índice \"%s\" contém página de tamanho zero inesperada no bloco %u" +msgid "could not set junction for \"%s\": %s" +msgstr "não foi possível definir junção para \"%s\": %s" -#: access/gist/gistutil.c:701 access/hash/hashutil.c:180 -#: access/hash/hashutil.c:192 access/nbtree/nbtpage.c:517 +#: ../port/dirmod.c:287 #, c-format -msgid "index \"%s\" contains corrupted page at block %u" -msgstr "índice \"%s\" contém página corrompida no bloco %u" +msgid "could not set junction for \"%s\": %s\n" +msgstr "não foi possível definir junção para \"%s\": %s\n" -#: access/hash/hashinsert.c:68 +#: ../port/dirmod.c:364 #, c-format -msgid "index row size %zu exceeds hash maximum %zu" -msgstr "tamanho de registro do índice %zu excede tamanho máximo do hash %zu" +msgid "could not get junction for \"%s\": %s" +msgstr "não foi possível obter junção para \"%s\": %s" -#: access/hash/hashinsert.c:70 access/spgist/spgdoinsert.c:1884 -#: access/spgist/spgutils.c:666 +#: ../port/dirmod.c:367 #, c-format -msgid "Values larger than a buffer page cannot be indexed." -msgstr "Valores maiores do que uma página do buffer não podem ser indexados." +msgid "could not get junction for \"%s\": %s\n" +msgstr "não foi possível obter junção para \"%s\": %s\n" -#: access/hash/hashovfl.c:546 +#: ../port/open.c:115 #, c-format -msgid "out of overflow pages in hash index \"%s\"" -msgstr "acabaram as páginas de transbordamento no índice hash \"%s\"" +msgid "could not open file \"%s\": %s" +msgstr "não foi possível abrir o arquivo \"%s\": %s" + +#: ../port/open.c:116 +msgid "lock violation" +msgstr "violação de bloqueio" -#: access/hash/hashsearch.c:153 +#: ../port/open.c:116 +msgid "sharing violation" +msgstr "violação de compartilhamento" + +#: ../port/open.c:117 #, c-format -msgid "hash indexes do not support whole-index scans" -msgstr "índices hash não suportam buscas em todo índice" +msgid "Continuing to retry for 30 seconds." +msgstr "Continuar tentando por 30 segundos." -#: access/hash/hashutil.c:208 +#: ../port/open.c:118 #, c-format -msgid "index \"%s\" is not a hash index" -msgstr "índice \"%s\" não é um índice hash" +msgid "You might have antivirus, backup, or similar software interfering with the database system." +msgstr "Você pode ter programa de antivírus, cópia de segurança ou similares interferindo com o sistema de banco de dados." -#: access/hash/hashutil.c:214 +#: ../port/path.c:775 #, c-format -msgid "index \"%s\" has wrong hash version" -msgstr "índice \"%s\" tem versão incorreta do hash" +msgid "could not get current working directory: %s\n" +msgstr "não foi possível obter o diretório de trabalho corrente: %s\n" -#: access/heap/heapam.c:1199 access/heap/heapam.c:1227 -#: access/heap/heapam.c:1259 catalog/aclchk.c:1742 +#: ../port/strerror.c:72 #, c-format -msgid "\"%s\" is an index" -msgstr "\"%s\" é um índice" +msgid "operating system error %d" +msgstr "erro do sistema operacional %d" -#: access/heap/heapam.c:1204 access/heap/heapam.c:1232 -#: access/heap/heapam.c:1264 catalog/aclchk.c:1749 commands/tablecmds.c:8495 -#: commands/tablecmds.c:11279 +#: ../port/thread.c:50 ../port/thread.c:86 #, c-format -msgid "\"%s\" is a composite type" -msgstr "\"%s\" é um tipo composto" +msgid "could not look up local user ID %d: %s" +msgstr "não foi possível procurar o ID do usuário local %d: %s" -#: access/heap/heapam.c:4223 access/heap/heapam.c:4436 -#: access/heap/heapam.c:4493 executor/execMain.c:1992 +#: ../port/thread.c:55 ../port/thread.c:91 #, c-format -msgid "could not obtain lock on row in relation \"%s\"" -msgstr "não pôde obter bloqueio no registro da relação \"%s\"" +msgid "local user with ID %d does not exist" +msgstr "o usuário local com ID %d não existe" -#: access/heap/hio.c:240 access/heap/rewriteheap.c:666 +#: ../port/win32security.c:62 #, c-format -msgid "row is too big: size %zu, maximum size %zu" -msgstr "registro é muito grande: tamanho %zu, tamanho máximo %zu" +msgid "could not get SID for Administrators group: error code %lu\n" +msgstr "não foi possível obter SID do grupo Administrators: código de erro %lu\n" -#: access/heap/rewriteheap.c:932 +#: ../port/win32security.c:72 #, c-format -msgid "could not write to file \"%s\", wrote %d of %d: %m" -msgstr "não pôde escrever no arquivo \"%s\", escreveu %d de %d: %m" +msgid "could not get SID for PowerUsers group: error code %lu\n" +msgstr "não foi possível obter SID do grupo PowerUsers: código de erro %lu\n" -#: access/heap/rewriteheap.c:973 access/heap/rewriteheap.c:1185 -#: access/heap/rewriteheap.c:1282 access/transam/timeline.c:407 -#: access/transam/timeline.c:497 access/transam/xlog.c:3185 -#: access/transam/xlog.c:3315 replication/logical/snapbuild.c:1592 -#: replication/slot.c:1042 replication/slot.c:1131 storage/file/fd.c:436 -#: storage/smgr/md.c:966 storage/smgr/md.c:1197 storage/smgr/md.c:1370 -#: utils/misc/guc.c:6599 +#: ../port/win32security.c:80 #, c-format -msgid "could not fsync file \"%s\": %m" -msgstr "não pôde executar fsync no arquivo \"%s\": %m" +msgid "could not check access token membership: error code %lu\n" +msgstr "não foi possível verificar a filiação do token de acesso: código de erro %lu\n" -#: access/heap/rewriteheap.c:1028 access/heap/rewriteheap.c:1148 -#: access/transam/timeline.c:315 access/transam/timeline.c:475 -#: access/transam/xlog.c:3141 access/transam/xlog.c:3276 -#: access/transam/xlog.c:9915 access/transam/xlog.c:10230 -#: postmaster/postmaster.c:4216 replication/slot.c:999 -#: storage/file/copydir.c:162 storage/smgr/md.c:304 utils/time/snapmgr.c:976 +#: access/brin/brin.c:216 #, c-format -msgid "could not create file \"%s\": %m" -msgstr "não pôde criar arquivo \"%s\": %m" +msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" +msgstr "a requisição de resumo de intervalo BRIN para o índice \"%s\" página %u não foi registrada" -#: access/heap/rewriteheap.c:1157 +#: access/brin/brin.c:1036 access/brin/brin.c:1143 access/gin/ginfast.c:1039 +#: access/transam/xlogfuncs.c:189 access/transam/xlogfuncs.c:214 +#: access/transam/xlogfuncs.c:247 access/transam/xlogfuncs.c:286 +#: access/transam/xlogfuncs.c:307 access/transam/xlogfuncs.c:328 +#: access/transam/xlogfuncs.c:398 access/transam/xlogfuncs.c:456 #, c-format -msgid "could not truncate file \"%s\" to %u: %m" -msgstr "não pôde truncar arquivo \"%s\" para %u: %m" +msgid "recovery is in progress" +msgstr "a recuperação está em andamento" -#: access/heap/rewriteheap.c:1164 replication/walsender.c:465 -#: storage/smgr/md.c:1782 +#: access/brin/brin.c:1037 access/brin/brin.c:1144 #, c-format -msgid "could not seek to end of file \"%s\": %m" -msgstr "não pôde posicionar no fim do arquivo \"%s\": %m" - -#: access/heap/rewriteheap.c:1175 access/transam/timeline.c:367 -#: access/transam/timeline.c:401 access/transam/timeline.c:491 -#: access/transam/xlog.c:3176 access/transam/xlog.c:3308 -#: postmaster/postmaster.c:4226 postmaster/postmaster.c:4236 -#: replication/logical/snapbuild.c:1576 replication/slot.c:1028 -#: storage/file/copydir.c:187 utils/init/miscinit.c:1057 -#: utils/init/miscinit.c:1066 utils/init/miscinit.c:1073 utils/misc/guc.c:6567 -#: utils/misc/guc.c:6592 utils/misc/guc.c:8290 utils/misc/guc.c:8304 -#: utils/time/snapmgr.c:981 utils/time/snapmgr.c:988 +msgid "BRIN control functions cannot be executed during recovery." +msgstr "As funções de controle do BRIN não podem ser executadas durante a recuperação." + +#: access/brin/brin.c:1042 access/brin/brin.c:1149 #, c-format -msgid "could not write to file \"%s\": %m" -msgstr "não pôde escrever no arquivo \"%s\": %m" +msgid "block number out of range: %lld" +msgstr "número do bloco fora do intervalo: %lld" -#: access/heap/rewriteheap.c:1258 access/transam/xlog.c:10099 -#: access/transam/xlogarchive.c:114 access/transam/xlogarchive.c:467 -#: replication/logical/reorderbuffer.c:2352 -#: replication/logical/reorderbuffer.c:2409 -#: replication/logical/snapbuild.c:1520 replication/logical/snapbuild.c:1895 -#: replication/slot.c:1105 storage/ipc/dsm.c:326 storage/smgr/md.c:404 -#: storage/smgr/md.c:453 storage/smgr/md.c:1317 +#: access/brin/brin.c:1086 access/brin/brin.c:1175 #, c-format -msgid "could not remove file \"%s\": %m" -msgstr "não pôde remover arquivo \"%s\": %m" - -#: access/heap/rewriteheap.c:1272 access/transam/timeline.c:111 -#: access/transam/timeline.c:236 access/transam/timeline.c:334 -#: access/transam/xlog.c:3117 access/transam/xlog.c:3224 -#: access/transam/xlog.c:3261 access/transam/xlog.c:3536 -#: access/transam/xlog.c:3614 replication/basebackup.c:458 -#: replication/basebackup.c:1167 replication/logical/logicalfuncs.c:152 -#: replication/logical/reorderbuffer.c:1965 -#: replication/logical/reorderbuffer.c:2172 -#: replication/logical/reorderbuffer.c:2801 -#: replication/logical/snapbuild.c:1569 replication/logical/snapbuild.c:1653 -#: replication/slot.c:1120 replication/walsender.c:458 -#: replication/walsender.c:2094 storage/file/copydir.c:155 -#: storage/file/fd.c:422 storage/smgr/md.c:586 storage/smgr/md.c:844 -#: utils/error/elog.c:1797 utils/init/miscinit.c:992 -#: utils/init/miscinit.c:1121 utils/misc/guc.c:6795 utils/misc/guc.c:6813 +msgid "\"%s\" is not a BRIN index" +msgstr "\"%s\" não é um índice BRIN" + +#: access/brin/brin.c:1102 access/brin/brin.c:1191 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "não pôde abrir arquivo \"%s\": %m" +msgid "could not open parent table of index \"%s\"" +msgstr "não foi possível abrir a tabela mãe do índice \"%s\"" -#: access/index/indexam.c:172 catalog/objectaddress.c:855 -#: commands/indexcmds.c:1725 commands/tablecmds.c:232 -#: commands/tablecmds.c:11270 +#: access/brin/brin.c:1111 access/brin/brin.c:1207 access/gin/ginfast.c:1084 +#: parser/parse_utilcmd.c:2271 #, c-format -msgid "\"%s\" is not an index" -msgstr "\"%s\" não é um índice" +msgid "index \"%s\" is not valid" +msgstr "índice \"%s\" não é válido" -#: access/nbtree/nbtinsert.c:396 +#: access/brin/brin_bloom.c:749 access/brin/brin_bloom.c:791 +#: access/brin/brin_minmax_multi.c:2985 access/brin/brin_minmax_multi.c:3122 +#: statistics/dependencies.c:663 statistics/dependencies.c:716 +#: statistics/mcv.c:1484 statistics/mcv.c:1515 statistics/mvdistinct.c:344 +#: statistics/mvdistinct.c:397 utils/adt/pseudotypes.c:43 +#: utils/adt/pseudotypes.c:77 utils/adt/tsgistidx.c:93 #, c-format -msgid "duplicate key value violates unique constraint \"%s\"" -msgstr "duplicar valor da chave viola a restrição de unicidade \"%s\"" +msgid "cannot accept a value of type %s" +msgstr "não é possível aceitar um valor do tipo %s" -#: access/nbtree/nbtinsert.c:398 +#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 +#: access/brin/brin_pageops.c:852 access/gin/ginentrypage.c:110 +#: access/gist/gist.c:1462 access/spgist/spgdoinsert.c:2002 +#: access/spgist/spgdoinsert.c:2279 #, c-format -msgid "Key %s already exists." -msgstr "Chave %s já existe." +msgid "index row size %zu exceeds maximum %zu for index \"%s\"" +msgstr "o tamanho da linha do índice %zu excede o máximo %zu para o índice \"%s\"" -#: access/nbtree/nbtinsert.c:466 +#: access/brin/brin_revmap.c:393 access/brin/brin_revmap.c:399 #, c-format -msgid "failed to re-find tuple within index \"%s\"" -msgstr "falhou ao reencontrar tupla no índice \"%s\"" +msgid "corrupted BRIN index: inconsistent range map" +msgstr "índice BRIN corrompido: mapa de intervalo inconsistente" -#: access/nbtree/nbtinsert.c:468 +#: access/brin/brin_revmap.c:593 #, c-format -msgid "This may be because of a non-immutable index expression." -msgstr "Isso pode ser por causa de uma expressão não imutável do índice." +msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" +msgstr "tipo de página não esperado 0x%04X no índice BRIN \"%s\" bloco %u" -#: access/nbtree/nbtinsert.c:548 access/nbtree/nbtsort.c:488 +#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:151 +#: access/gist/gistvalidate.c:153 access/hash/hashvalidate.c:139 +#: access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 #, c-format -msgid "" -"Values larger than 1/3 of a buffer page cannot be indexed.\n" -"Consider a function index of an MD5 hash of the value, or use full text indexing." -msgstr "" -"Valores maiores do que 1/3 da página do buffer não podem ser indexados.\n" -"Considere um índice de uma função de um hash MD5 de um valor ou utilize uma indexação de texto completa." +msgid "operator family \"%s\" of access method %s contains function %s with invalid support number %d" +msgstr "a família de operador \"%s\" do método de acesso %s contém a função %s com o número de suporte inválido %d" -#: access/nbtree/nbtpage.c:166 access/nbtree/nbtpage.c:362 -#: access/nbtree/nbtpage.c:449 parser/parse_utilcmd.c:1620 +#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:163 +#: access/gist/gistvalidate.c:165 access/hash/hashvalidate.c:118 +#: access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 #, c-format -msgid "index \"%s\" is not a btree" -msgstr "índice \"%s\" não é uma árvore B" +msgid "operator family \"%s\" of access method %s contains function %s with wrong signature for support number %d" +msgstr "a família de operador \"%s\" do método de acesso %s contém a função %s com assinatura errada para o número de suporte %d" -#: access/nbtree/nbtpage.c:172 access/nbtree/nbtpage.c:368 -#: access/nbtree/nbtpage.c:455 +#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:182 +#: access/gist/gistvalidate.c:185 access/hash/hashvalidate.c:160 +#: access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 #, c-format -msgid "version mismatch in index \"%s\": file version %d, code version %d" -msgstr "versão não corresponde no índice \"%s\": versão do arquivo %d, versão do código %d" +msgid "operator family \"%s\" of access method %s contains operator %s with invalid strategy number %d" +msgstr "a família de operador \"%s\" do método de acesso %s contém o operador %s com o número de estratégia inválido %d" -#: access/nbtree/nbtpage.c:1187 +#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:195 +#: access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 +#: access/spgist/spgvalidate.c:237 #, c-format -msgid "index \"%s\" contains a half-dead internal page" -msgstr "índice \"%s\" contém uma página interna parcialmente não vigente" +msgid "operator family \"%s\" of access method %s contains invalid ORDER BY specification for operator %s" +msgstr "a família de operador \"%s\" do método de acesso %s contém uma especificação ORDER BY inválida para o operador %s" -#: access/nbtree/nbtpage.c:1189 +#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:208 +#: access/gist/gistvalidate.c:233 access/hash/hashvalidate.c:186 +#: access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 #, c-format -msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." -msgstr "Isto pode ser causado por um VACUUM interrompido na versão 9.3 ou anterior, antes de atualizar. Por favor execute REINDEX." +msgid "operator family \"%s\" of access method %s contains operator %s with wrong signature" +msgstr "a família de operador \"%s\" do método de acesso %s contém o operador %s com assinatura errada" -#: access/spgist/spgutils.c:663 +#: access/brin/brin_validate.c:236 access/hash/hashvalidate.c:226 +#: access/nbtree/nbtvalidate.c:236 access/spgist/spgvalidate.c:280 #, c-format -msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" -msgstr "tamanho da tupla interna do SP-GiST %zu excede o máximo %zu" +msgid "operator family \"%s\" of access method %s is missing operator(s) for types %s and %s" +msgstr "a família de operador \"%s\" do método de acesso %s não possui operador(es) para os tipos %s e %s" -#: access/transam/multixact.c:990 +#: access/brin/brin_validate.c:246 #, c-format -msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"" -msgstr "banco de dados não está aceitando comandos que geram novos MultiXactIds para evitar perda de dados por reinício no banco de dados \"%s\"" +msgid "operator family \"%s\" of access method %s is missing support function(s) for types %s and %s" +msgstr "a família de operador \"%s\" do método de acesso %s não possui função(ões) de suporte para os tipos %se %s" -#: access/transam/multixact.c:992 access/transam/multixact.c:999 -#: access/transam/multixact.c:1014 access/transam/multixact.c:1023 +#: access/brin/brin_validate.c:259 access/hash/hashvalidate.c:240 +#: access/nbtree/nbtvalidate.c:260 access/spgist/spgvalidate.c:315 #, c-format -msgid "" -"Execute a database-wide VACUUM in that database.\n" -"You might also need to commit or roll back old prepared transactions." -msgstr "" -"Execute um VACUUM completo naquele banco de dados.\n" -"Você também pode precisar efetivar ou desfazer transações preparadas antigas." +msgid "operator class \"%s\" of access method %s is missing operator(s)" +msgstr "a classe de operador \"%s\" do método de acesso %s não possui operador(es)" -#: access/transam/multixact.c:997 +#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 +#: access/gist/gistvalidate.c:274 #, c-format -msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u" -msgstr "banco de dados não está aceitando comandos que geram novos MultiXactIds para evitar perda de dados por reinício no banco de dados com OID %u" +msgid "operator class \"%s\" of access method %s is missing support function %d" +msgstr "na classe de operador \"%s\" do método de acesso %s está faltando a função de suporte %d" -#: access/transam/multixact.c:1009 access/transam/multixact.c:2201 +#: access/common/attmap.c:122 #, c-format -msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" -msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" -msgstr[0] "banco de dados \"%s\" deve ser limpo antes que %u MultiXactId seja utilizado" -msgstr[1] "banco de dados \"%s\" deve ser limpo antes que %u MultiXactIds sejam utilizados" +msgid "Returned type %s does not match expected type %s in column %d." +msgstr "Tipo %s retornado não corresponde ao tipo %s esperado na coluna %d." -#: access/transam/multixact.c:1018 access/transam/multixact.c:2210 +#: access/common/attmap.c:150 #, c-format -msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" -msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" -msgstr[0] "banco de dados com OID %u deve ser limpo antes que %u MultiXactId seja utilizado" -msgstr[1] "banco de dados com OID %u deve ser limpo antes que %u MultiXactIds sejam utilizados" +msgid "Number of returned columns (%d) does not match expected column count (%d)." +msgstr "Número de colunas retornadas (%d) não corresponde a contagem de colunas esperada (%d)" -#: access/transam/multixact.c:1169 +#: access/common/attmap.c:234 access/common/attmap.c:246 #, c-format -msgid "MultiXactId %u does no longer exist -- apparent wraparound" -msgstr "MultiXactId %u não existe -- reinício aparente" +msgid "could not convert row type" +msgstr "não foi possível converter o tipo de linha" -#: access/transam/multixact.c:1177 +#: access/common/attmap.c:235 #, c-format -msgid "MultiXactId %u has not been created yet -- apparent wraparound" -msgstr "MultiXactId %u não foi criado ainda -- reinício aparente" +msgid "Attribute \"%s\" of type %s does not match corresponding attribute of type %s." +msgstr "Atributo \"%s\" do tipo %s não corresponde ao atributo do tipo %s." -#: access/transam/multixact.c:2166 +#: access/common/attmap.c:247 #, c-format -msgid "MultiXactId wrap limit is %u, limited by database with OID %u" -msgstr "limite de reinício do MultiXactId é %u, limitado pelo banco de dados com OID %u" +msgid "Attribute \"%s\" of type %s does not exist in type %s." +msgstr "Atributo \"%s\" do tipo %s não existe no tipo %s." -#: access/transam/multixact.c:2206 access/transam/multixact.c:2215 -#: access/transam/varsup.c:137 access/transam/varsup.c:144 -#: access/transam/varsup.c:374 access/transam/varsup.c:381 +#: access/common/heaptuple.c:1133 access/common/heaptuple.c:1468 #, c-format -msgid "" -"To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" -"You might also need to commit or roll back old prepared transactions." -msgstr "" -"Para evitar um desligamento do banco de dados, execute um VACUUM completo naquele banco de dados.\n" -"Você também pode precisar efetivar ou desfazer transações preparadas antigas." +msgid "number of columns (%d) exceeds limit (%d)" +msgstr "número de colunas (%d) excede limite (%d)" -#: access/transam/multixact.c:2799 +#: access/common/indextuple.c:89 #, c-format -msgid "invalid MultiXactId: %u" -msgstr "MultiXactId é inválido: %u" +msgid "number of index columns (%d) exceeds limit (%d)" +msgstr "o número de colunas do índice (%d) excede o limite (%d)" -#: access/transam/slru.c:651 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:957 #, c-format -msgid "file \"%s\" doesn't exist, reading as zeroes" -msgstr "arquivo \"%s\" não existe, lendo como zeros" +msgid "index row requires %zu bytes, maximum size is %zu" +msgstr "a linha do índice requer %zu bytes, o tamanho máximo é %zu" -#: access/transam/slru.c:881 access/transam/slru.c:887 -#: access/transam/slru.c:894 access/transam/slru.c:901 -#: access/transam/slru.c:908 access/transam/slru.c:915 +#: access/common/printtup.c:292 tcop/fastpath.c:107 tcop/fastpath.c:454 +#: tcop/postgres.c:1944 #, c-format -msgid "could not access status of transaction %u" -msgstr "não pôde acessar status da transação %u" +msgid "unsupported format code: %d" +msgstr "código do formato não é suportado: %d" -#: access/transam/slru.c:882 -#, c-format -msgid "Could not open file \"%s\": %m." -msgstr "não pôde abrir arquivo \"%s\": %m." +#: access/common/reloptions.c:521 access/common/reloptions.c:532 +msgid "Valid values are \"on\", \"off\", and \"auto\"." +msgstr "Valores válidos são \"on\", \"off\" e \"auto\"." -#: access/transam/slru.c:888 -#, c-format -msgid "Could not seek in file \"%s\" to offset %u: %m." -msgstr "não pôde posicionar no arquivo \"%s\" na posição %u: %m." +#: access/common/reloptions.c:543 +msgid "Valid values are \"local\" and \"cascaded\"." +msgstr "Valores válidos são \"local\" e \"cascaded\"." -#: access/transam/slru.c:895 +#: access/common/reloptions.c:691 #, c-format -msgid "Could not read from file \"%s\" at offset %u: %m." -msgstr "não pôde ler do arquivo \"%s\" na posição %u: %m." +msgid "user-defined relation parameter types limit exceeded" +msgstr "limite dos tipos de parâmetro da relação definidos pelo usuário foi excedido" -#: access/transam/slru.c:902 +#: access/common/reloptions.c:1233 #, c-format -msgid "Could not write to file \"%s\" at offset %u: %m." -msgstr "não pôde escrever no arquivo \"%s\" na posição %u: %m." +msgid "RESET must not include values for parameters" +msgstr "RESET não deve incluir valores para parâmetros" -#: access/transam/slru.c:909 +#: access/common/reloptions.c:1265 #, c-format -msgid "Could not fsync file \"%s\": %m." -msgstr "não pôde executar fsync no arquivo \"%s\": %m." +msgid "unrecognized parameter namespace \"%s\"" +msgstr "namespace do parâmetro \"%s\" desconhecido" -#: access/transam/slru.c:916 +#: access/common/reloptions.c:1302 commands/variable.c:1167 #, c-format -msgid "Could not close file \"%s\": %m." -msgstr "não pôde fechar arquivo \"%s\": %m." +msgid "tables declared WITH OIDS are not supported" +msgstr "tabelas declaradas COM OIDs não têm suporte" -#: access/transam/slru.c:1171 +#: access/common/reloptions.c:1470 #, c-format -msgid "could not truncate directory \"%s\": apparent wraparound" -msgstr "não pôde truncar diretório \"%s\": reinício aparente" +msgid "unrecognized parameter \"%s\"" +msgstr "parâmetro \"%s\" desconhecido" -#: access/transam/slru.c:1220 +#: access/common/reloptions.c:1582 #, c-format -msgid "removing file \"%s\"" -msgstr "removendo arquivo \"%s\"" +msgid "parameter \"%s\" specified more than once" +msgstr "parâmetro \"%s\" foi especificado mais de uma vez" -#: access/transam/timeline.c:148 access/transam/timeline.c:153 +#: access/common/reloptions.c:1598 #, c-format -msgid "syntax error in history file: %s" -msgstr "erro de sintaxe no arquivo de histórico: %s" +msgid "invalid value for boolean option \"%s\": %s" +msgstr "valor inválido para a opção booleana \"%s\": %s" -#: access/transam/timeline.c:149 +#: access/common/reloptions.c:1610 #, c-format -msgid "Expected a numeric timeline ID." -msgstr "Esperado um ID de linha do tempo numérico." +msgid "invalid value for integer option \"%s\": %s" +msgstr "valor inválido para a opção inteira \"%s\": %s" -#: access/transam/timeline.c:154 +#: access/common/reloptions.c:1616 access/common/reloptions.c:1636 #, c-format -msgid "Expected a transaction log switchpoint location." -msgstr "Esperado um local de transição do log de transação." +msgid "value %s out of bounds for option \"%s\"" +msgstr "o valor %s está fora do intervalo para a opção \"%s\"" -#: access/transam/timeline.c:158 +#: access/common/reloptions.c:1618 #, c-format -msgid "invalid data in history file: %s" -msgstr "dado é inválido no arquivo de histórico: %s" +msgid "Valid values are between \"%d\" and \"%d\"." +msgstr "Os valores válidos estão entre \"%d\" e \"%d\"." -#: access/transam/timeline.c:159 +#: access/common/reloptions.c:1630 #, c-format -msgid "Timeline IDs must be in increasing sequence." -msgstr "IDs de linha do tempo devem ser uma sequência crescente." +msgid "invalid value for floating point option \"%s\": %s" +msgstr "o valor não é válido para a opção de ponto flutuante \"%s\": %s" -#: access/transam/timeline.c:179 +#: access/common/reloptions.c:1638 #, c-format -msgid "invalid data in history file \"%s\"" -msgstr "dado é inválido no arquivo de histórico \"%s\"" +msgid "Valid values are between \"%f\" and \"%f\"." +msgstr "Os valores válidos estão entre \"%f\" e \"%f\"." -#: access/transam/timeline.c:180 +#: access/common/reloptions.c:1660 #, c-format -msgid "Timeline IDs must be less than child timeline's ID." -msgstr "IDs de linha do tempo devem ser menores do que ID de linha do tempo descendente." +msgid "invalid value for enum option \"%s\": %s" +msgstr "o valor inválido para a opção enum \"%s\": %s" -#: access/transam/timeline.c:346 access/transam/xlog.c:3289 -#: access/transam/xlog.c:10081 access/transam/xlog.c:10094 -#: access/transam/xlog.c:10462 access/transam/xlog.c:10505 -#: access/transam/xlogfuncs.c:468 access/transam/xlogfuncs.c:487 -#: replication/logical/reorderbuffer.c:2819 replication/walsender.c:483 -#: storage/file/copydir.c:176 utils/adt/genfile.c:139 +#: access/common/reloptions.c:1991 #, c-format -msgid "could not read file \"%s\": %m" -msgstr "não pôde ler arquivo \"%s\": %m" +msgid "cannot specify storage parameters for a partitioned table" +msgstr "não é possível especificar parâmetros de armazenamento para uma tabela particionada" -#: access/transam/timeline.c:412 access/transam/timeline.c:502 -#: access/transam/xlog.c:3191 access/transam/xlog.c:3320 -#: access/transam/xlogfuncs.c:493 commands/copy.c:1518 -#: storage/file/copydir.c:201 +#: access/common/reloptions.c:1992 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "não pôde fechar arquivo \"%s\": %m" +msgid "Specify storage parameters for its leaf partitions instead." +msgstr "Em vez disso, especifique parâmetros de armazenamento para suas partições folha." -#: access/transam/timeline.c:429 access/transam/timeline.c:519 +#: access/common/toast_compression.c:33 #, c-format -msgid "could not link file \"%s\" to \"%s\": %m" -msgstr "não pôde vincular arquivo \"%s\" a \"%s\": %m" +msgid "compression method lz4 not supported" +msgstr "o método de compressão lz4 não tem suporte" -#: access/transam/timeline.c:436 access/transam/timeline.c:526 -#: access/transam/xlog.c:5403 access/transam/xlog.c:6496 -#: access/transam/xlogarchive.c:458 access/transam/xlogarchive.c:475 -#: access/transam/xlogarchive.c:582 postmaster/pgarch.c:759 -#: replication/logical/snapbuild.c:1606 replication/slot.c:468 -#: replication/slot.c:942 replication/slot.c:1054 utils/misc/guc.c:6843 -#: utils/time/snapmgr.c:999 +#: access/common/toast_compression.c:34 #, c-format -msgid "could not rename file \"%s\" to \"%s\": %m" -msgstr "não pôde renomear arquivo \"%s\" para \"%s\": %m" +msgid "This functionality requires the server to be built with lz4 support." +msgstr "Essa funcionalidade requer que o servidor seja construído com suporte a lz4." -#: access/transam/timeline.c:598 +#: access/common/tupdesc.c:837 commands/tablecmds.c:6953 +#: commands/tablecmds.c:12977 #, c-format -msgid "requested timeline %u is not in this server's history" -msgstr "linha do tempo solicitada %u não está no histórico do servidor" +msgid "too many array dimensions" +msgstr "dimensões demais na matriz" -#: access/transam/twophase.c:330 +#: access/common/tupdesc.c:842 parser/parse_clause.c:772 +#: parser/parse_relation.c:1913 #, c-format -msgid "transaction identifier \"%s\" is too long" -msgstr "identificador de transação \"%s\" é muito longo" +msgid "column \"%s\" cannot be declared SETOF" +msgstr "coluna \"%s\" não pode ser declarada SETOF" -#: access/transam/twophase.c:337 +#: access/gin/ginbulk.c:44 #, c-format -msgid "prepared transactions are disabled" -msgstr "transações preparadas estão desabilitadas" +msgid "posting list is too long" +msgstr "a lista de postagens é muito longa" -#: access/transam/twophase.c:338 +#: access/gin/ginbulk.c:45 #, c-format -msgid "Set max_prepared_transactions to a nonzero value." -msgstr "Defina max_prepared_transactions para um valor diferente de zero." +msgid "Reduce maintenance_work_mem." +msgstr "Reduza manutenção_work_mem." -#: access/transam/twophase.c:357 +#: access/gin/ginfast.c:1040 #, c-format -msgid "transaction identifier \"%s\" is already in use" -msgstr "identificador de transação \"%s\" já está em uso" +msgid "GIN pending list cannot be cleaned up during recovery." +msgstr "A lista pendente do GIN não pode ser limpa durante a recuperação." -#: access/transam/twophase.c:366 +#: access/gin/ginfast.c:1047 #, c-format -msgid "maximum number of prepared transactions reached" -msgstr "número máximo de transações preparadas foi alcançado" +msgid "\"%s\" is not a GIN index" +msgstr "\"%s\" não é um índice GIN" -#: access/transam/twophase.c:367 +#: access/gin/ginfast.c:1058 #, c-format -msgid "Increase max_prepared_transactions (currently %d)." -msgstr "Aumente max_prepared_transactions (atualmente %d)." +msgid "cannot access temporary indexes of other sessions" +msgstr "não é possível acessar índices temporários de outras sessões" -#: access/transam/twophase.c:505 +#: access/gin/ginget.c:273 access/nbtree/nbtinsert.c:762 #, c-format -msgid "prepared transaction with identifier \"%s\" is busy" -msgstr "transação preparada com identificador \"%s\" está sendo utilizada" +msgid "failed to re-find tuple within index \"%s\"" +msgstr "falhou ao reencontrar tupla no índice \"%s\"" -#: access/transam/twophase.c:511 +#: access/gin/ginscan.c:431 #, c-format -msgid "permission denied to finish prepared transaction" -msgstr "permissão negada ao finalizar transação preparada" +msgid "old GIN indexes do not support whole-index scans nor searches for nulls" +msgstr "índices GIN antigos não dão suporte a varreduras de todo o índice nem a procura por nulos" -#: access/transam/twophase.c:512 +#: access/gin/ginscan.c:432 #, c-format -msgid "Must be superuser or the user that prepared the transaction." -msgstr "Deve ser super-usuário ou usuário que preparou a transação." +msgid "To fix this, do REINDEX INDEX \"%s\"." +msgstr "Para corrigir isto, faça REINDEX INDEX \"%s\"." -#: access/transam/twophase.c:523 +#: access/gin/ginutil.c:146 executor/execExpr.c:2169 +#: utils/adt/arrayfuncs.c:4045 utils/adt/arrayfuncs.c:6732 +#: utils/adt/rowtypes.c:984 #, c-format -msgid "prepared transaction belongs to another database" -msgstr "transação preparada pertence a outro banco de dados" +msgid "could not identify a comparison function for type %s" +msgstr "não foi possível identificar uma função de comparação para tipo %s" -#: access/transam/twophase.c:524 +#: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 +#: access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 #, c-format -msgid "Connect to the database where the transaction was prepared to finish it." -msgstr "Conecte-se ao banco de dados onde a transação foi preparada para terminá-la." +msgid "operator family \"%s\" of access method %s contains support function %s with different left and right input types" +msgstr "família de operador \"%s\" do método de acesso %s contém função de suporte %s com diferentes tipos de dados de entrada esquerda e direita" -#: access/transam/twophase.c:539 +#: access/gin/ginvalidate.c:260 #, c-format -msgid "prepared transaction with identifier \"%s\" does not exist" -msgstr "transação preparada com identificador \"%s\" não existe" +msgid "operator class \"%s\" of access method %s is missing support function %d or %d" +msgstr "a classe de operador \"%s\" do método de acesso %s não possui a função de suporte %d ou %d" -#: access/transam/twophase.c:1042 +#: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:350 +#: access/spgist/spgvalidate.c:387 #, c-format -msgid "two-phase state file maximum length exceeded" -msgstr "tamanho máximo do arquivo de status de efetivação em duas fases foi alcançado" +msgid "support function number %d is invalid for access method %s" +msgstr "o número da função de suporte %d não é válido para o método de acesso %s" -#: access/transam/twophase.c:1055 +#: access/gist/gist.c:759 access/gist/gistvacuum.c:426 #, c-format -msgid "could not create two-phase state file \"%s\": %m" -msgstr "não pôde criar arquivo de status de efetivação em duas fases \"%s\": %m" +msgid "index \"%s\" contains an inner tuple marked as invalid" +msgstr "índice \"%s\" contém uma tupla interna marcada como inválida" -#: access/transam/twophase.c:1069 access/transam/twophase.c:1086 -#: access/transam/twophase.c:1135 access/transam/twophase.c:1564 -#: access/transam/twophase.c:1571 +#: access/gist/gist.c:761 access/gist/gistvacuum.c:428 #, c-format -msgid "could not write two-phase state file: %m" -msgstr "não pôde escrever em arquivo de status de efetivação em duas fases: %m" +msgid "This is caused by an incomplete page split at crash recovery before upgrading to PostgreSQL 9.1." +msgstr "Isso é causado por uma divisão de página incompleta durante recuperação de desastre antes da atualização para PostgreSQL 9.1." -#: access/transam/twophase.c:1095 +#: access/gist/gist.c:762 access/gist/gistutil.c:801 access/gist/gistutil.c:812 +#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:227 +#: access/hash/hashutil.c:238 access/hash/hashutil.c:250 +#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:813 +#: access/nbtree/nbtpage.c:824 #, c-format -msgid "could not seek in two-phase state file: %m" -msgstr "não pôde posicionar no arquivo de status de efetivação em duas fases: %m" +msgid "Please REINDEX it." +msgstr "Por favor execute REINDEX." -#: access/transam/twophase.c:1141 access/transam/twophase.c:1589 +#: access/gist/gist.c:1195 #, c-format -msgid "could not close two-phase state file: %m" -msgstr "não pôde fechar arquivo de status de efetivação em duas fases: %m" +msgid "fixing incomplete split in index \"%s\", block %u" +msgstr "corrigindo divisão incompleta no índice \"%s\", bloco %u" -#: access/transam/twophase.c:1228 access/transam/twophase.c:1670 +#: access/gist/gistsplit.c:446 #, c-format -msgid "could not open two-phase state file \"%s\": %m" -msgstr "não pôde abrir arquivo de status de efetivação em duas fases \"%s\": %m" +msgid "picksplit method for column %d of index \"%s\" failed" +msgstr "método picksplit para coluna %d do índice \"%s\" falhou" -#: access/transam/twophase.c:1245 +#: access/gist/gistsplit.c:448 #, c-format -msgid "could not stat two-phase state file \"%s\": %m" -msgstr "não pôde executar stat no arquivo de status de efetivação em duas fases \"%s\": %m" +msgid "The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command." +msgstr "O índice não é ótimo. Para otimizá-lo, entre em contato com um desenvolvedor ou tente utilizar a coluna como a segunda no comando CREATE INDEX." -#: access/transam/twophase.c:1277 +#: access/gist/gistutil.c:798 access/hash/hashutil.c:224 +#: access/nbtree/nbtpage.c:810 #, c-format -msgid "could not read two-phase state file \"%s\": %m" -msgstr "não pôde ler arquivo de status de efetivação em duas fases \"%s\": %m" +msgid "index \"%s\" contains unexpected zero page at block %u" +msgstr "índice \"%s\" contém página de tamanho zero inesperada no bloco %u" -#: access/transam/twophase.c:1373 +#: access/gist/gistutil.c:809 access/hash/hashutil.c:235 +#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:821 #, c-format -msgid "two-phase state file for transaction %u is corrupt" -msgstr "arquivo de status de efetivação em duas fases para transação %u está corrompido" +msgid "index \"%s\" contains corrupted page at block %u" +msgstr "índice \"%s\" contém página corrompida no bloco %u" -#: access/transam/twophase.c:1526 +#: access/gist/gistvalidate.c:203 #, c-format -msgid "could not remove two-phase state file \"%s\": %m" -msgstr "não pôde remover arquivo de status de efetivação em duas fases \"%s\": %m" +msgid "operator family \"%s\" of access method %s contains unsupported ORDER BY specification for operator %s" +msgstr "a família de operador \"%s\" do método de acesso %s contém uma especificação ORDER BY sem suporte para o operador %s" -#: access/transam/twophase.c:1555 +#: access/gist/gistvalidate.c:214 #, c-format -msgid "could not recreate two-phase state file \"%s\": %m" -msgstr "não pôde recriar arquivo de status de efetivação em duas fases \"%s\": %m" +msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY opfamily specification for operator %s" +msgstr "a família de operador \"%s\" do método de acesso %s contém uma especificação incorreta de família de operador ORDER BY para o operador %s" -#: access/transam/twophase.c:1583 +#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:333 +#: utils/adt/varchar.c:1009 utils/adt/varchar.c:1064 #, c-format -msgid "could not fsync two-phase state file: %m" -msgstr "não pôde executar fsync no arquivo de status de efetivação em duas fases: %m" +msgid "could not determine which collation to use for string hashing" +msgstr "não foi possível determinar qual ordenação usar para o hash da cadeia de caracteres" -#: access/transam/twophase.c:1679 +#: access/hash/hashfunc.c:280 access/hash/hashfunc.c:334 catalog/heap.c:668 +#: catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 +#: commands/indexcmds.c:2015 commands/tablecmds.c:17482 commands/view.c:86 +#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1648 +#: utils/adt/formatting.c:1770 utils/adt/formatting.c:1893 utils/adt/like.c:191 +#: utils/adt/like_support.c:1025 utils/adt/varchar.c:739 +#: utils/adt/varchar.c:1010 utils/adt/varchar.c:1065 utils/adt/varlena.c:1518 #, c-format -msgid "could not fsync two-phase state file \"%s\": %m" -msgstr "não pôde executar fsync no arquivo de status de efetivação em duas fases \"%s\": %m" +msgid "Use the COLLATE clause to set the collation explicitly." +msgstr "Use a cláusula COLLATE para definir a ordenação explicitamente." -#: access/transam/twophase.c:1686 +#: access/hash/hashinsert.c:86 #, c-format -msgid "could not close two-phase state file \"%s\": %m" -msgstr "não pôde fechar arquivo de status de efetivação em duas fases \"%s\": %m" +msgid "index row size %zu exceeds hash maximum %zu" +msgstr "o tamanho da linha do índice %zu excede tamanho máximo do hash %zu" -#: access/transam/twophase.c:1751 +#: access/hash/hashinsert.c:88 access/spgist/spgdoinsert.c:2006 +#: access/spgist/spgdoinsert.c:2283 access/spgist/spgutils.c:1018 #, c-format -msgid "removing future two-phase state file \"%s\"" -msgstr "removendo arquivo futuro de status de efetivação em duas fases \"%s\"" +msgid "Values larger than a buffer page cannot be indexed." +msgstr "Valores maiores do que uma página do buffer não podem ser indexados." -#: access/transam/twophase.c:1767 access/transam/twophase.c:1778 -#: access/transam/twophase.c:1897 access/transam/twophase.c:1908 -#: access/transam/twophase.c:1981 +#: access/hash/hashovfl.c:88 #, c-format -msgid "removing corrupt two-phase state file \"%s\"" -msgstr "removendo arquivo corrompido de status de efetivação em duas fases \"%s\"" +msgid "invalid overflow block number %u" +msgstr "número do bloco de overflow inválido %u" -#: access/transam/twophase.c:1886 access/transam/twophase.c:1970 +#: access/hash/hashovfl.c:284 access/hash/hashpage.c:454 #, c-format -msgid "removing stale two-phase state file \"%s\"" -msgstr "removendo arquivo antigo de status de efetivação em duas fases \"%s\"" +msgid "out of overflow pages in hash index \"%s\"" +msgstr "acabaram as páginas de transbordamento no índice hash \"%s\"" -#: access/transam/twophase.c:1988 +#: access/hash/hashsearch.c:315 #, c-format -msgid "recovering prepared transaction %u" -msgstr "recuperação transação preparada %u" +msgid "hash indexes do not support whole-index scans" +msgstr "índices hash não dão suporte a varreduras de todo o índice" -#: access/transam/varsup.c:115 +#: access/hash/hashutil.c:263 #, c-format -msgid "database is not accepting commands to avoid wraparound data loss in database \"%s\"" -msgstr "banco de dados não está aceitando comandos para evitar perda de dados por reinício no banco de dados \"%s\"" +msgid "index \"%s\" is not a hash index" +msgstr "índice \"%s\" não é um índice hash" -#: access/transam/varsup.c:117 access/transam/varsup.c:124 +#: access/hash/hashutil.c:269 #, c-format -msgid "" -"Stop the postmaster and vacuum that database in single-user mode.\n" -"You might also need to commit or roll back old prepared transactions." -msgstr "" -"Para o postmaster e limpe aquele banco de dados em modo monousuário.\n" -"Você também pode precisar efetivar ou desfazer transações preparadas antigas." +msgid "index \"%s\" has wrong hash version" +msgstr "índice \"%s\" tem versão incorreta do hash" -#: access/transam/varsup.c:122 +#: access/hash/hashvalidate.c:198 #, c-format -msgid "database is not accepting commands to avoid wraparound data loss in database with OID %u" -msgstr "banco de dados não está aceitando comandos para evitar perda de dados por reinício no banco de dados com OID %u" +msgid "operator family \"%s\" of access method %s lacks support function for operator %s" +msgstr "a família de operador \"%s\" do método de acesso %s não possui uma função de suporte para o operador %s" -#: access/transam/varsup.c:134 access/transam/varsup.c:371 +#: access/hash/hashvalidate.c:256 access/nbtree/nbtvalidate.c:276 #, c-format -msgid "database \"%s\" must be vacuumed within %u transactions" -msgstr "banco de dados \"%s\" deve ser limpo em %u transações" +msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" +msgstr "a família de operador \"%s\" do método de acesso %s não possui operador(es) de tipo cruzado" -#: access/transam/varsup.c:141 access/transam/varsup.c:378 +#: access/heap/heapam.c:2038 #, c-format -msgid "database with OID %u must be vacuumed within %u transactions" -msgstr "banco de dados com OID %u deve ser limpo em %u transações" +msgid "cannot insert tuples in a parallel worker" +msgstr "não é possível inserir tuplas em um processo trabalhador paralelo" -#: access/transam/varsup.c:336 +#: access/heap/heapam.c:2557 #, c-format -msgid "transaction ID wrap limit is %u, limited by database with OID %u" -msgstr "limite de reinício do ID de transação é %u, limitado pelo banco de dados com OID %u" +msgid "cannot delete tuples during a parallel operation" +msgstr "não é possível excluir tuplas durante uma operação paralela" -#: access/transam/xact.c:814 +#: access/heap/heapam.c:2604 #, c-format -msgid "cannot have more than 2^32-2 commands in a transaction" -msgstr "não pode ter mais do que 2^32-2 comandos em uma transação" +msgid "attempted to delete invisible tuple" +msgstr "tentativa de excluir uma tupla invisível" -#: access/transam/xact.c:1370 +#: access/heap/heapam.c:3052 access/heap/heapam.c:5921 #, c-format -msgid "maximum number of committed subtransactions (%d) exceeded" -msgstr "número máximo de subtransações efetivadas (%d) foi alcançado" +msgid "cannot update tuples during a parallel operation" +msgstr "não é possível atualizar tuplas durante uma operação paralela" -#: access/transam/xact.c:2151 +#: access/heap/heapam.c:3180 #, c-format -msgid "cannot PREPARE a transaction that has operated on temporary tables" -msgstr "não pode executar PREPARE em uma transação que utilizou tabelas temporárias" +msgid "attempted to update invisible tuple" +msgstr "tentativa de atualizar uma tupla invisível" -#: access/transam/xact.c:2161 +#: access/heap/heapam.c:4569 access/heap/heapam.c:4607 +#: access/heap/heapam.c:4872 access/heap/heapam_handler.c:467 #, c-format -msgid "cannot PREPARE a transaction that has exported snapshots" -msgstr "não pode executar PREPARE em uma transação que tem instantâneos exportados" +msgid "could not obtain lock on row in relation \"%s\"" +msgstr "não foi possível obter bloqueio na linha da relação \"%s\"" -#. translator: %s represents an SQL statement name -#: access/transam/xact.c:3000 +#: access/heap/heapam_handler.c:412 #, c-format -msgid "%s cannot run inside a transaction block" -msgstr "%s não pode executar dentro de um bloco de transação" +msgid "tuple to be locked was already moved to another partition due to concurrent update" +msgstr "a tupla a ser bloqueada já foi movida para outra partição devido a atualização simultânea" -#. translator: %s represents an SQL statement name -#: access/transam/xact.c:3010 +#: access/heap/hio.c:536 access/heap/rewriteheap.c:659 #, c-format -msgid "%s cannot run inside a subtransaction" -msgstr "%s não pode executar dentro de uma subtransação" +msgid "row is too big: size %zu, maximum size %zu" +msgstr "a linha é muito grande: tamanho %zu, tamanho máximo %zu" -#. translator: %s represents an SQL statement name -#: access/transam/xact.c:3020 +#: access/heap/rewriteheap.c:919 #, c-format -msgid "%s cannot be executed from a function or multi-command string" -msgstr "%s não pode ser executada a partir de uma função ou cadeia de caracteres com múltiplos comandos" - -#. translator: %s represents an SQL statement name -#: access/transam/xact.c:3091 +msgid "could not write to file \"%s\", wrote %d of %d: %m" +msgstr "não foi possível escrever no arquivo \"%s\", escritos %d de %d: %m" + +#: access/heap/rewriteheap.c:1011 access/heap/rewriteheap.c:1128 +#: access/transam/timeline.c:329 access/transam/timeline.c:481 +#: access/transam/xlog.c:2973 access/transam/xlog.c:3164 +#: access/transam/xlog.c:3940 access/transam/xlog.c:8746 +#: access/transam/xlogfuncs.c:702 backup/basebackup_server.c:151 +#: backup/basebackup_server.c:244 commands/dbcommands.c:518 +#: postmaster/postmaster.c:4557 postmaster/postmaster.c:5560 +#: replication/logical/origin.c:603 replication/slot.c:1777 +#: storage/file/copydir.c:157 storage/smgr/md.c:232 utils/time/snapmgr.c:1263 #, c-format -msgid "%s can only be used in transaction blocks" -msgstr "%s só pode ser utilizado em blocos de transação" +msgid "could not create file \"%s\": %m" +msgstr "não foi possível criar o arquivo \"%s\": %m" -#: access/transam/xact.c:3274 +#: access/heap/rewriteheap.c:1138 #, c-format -msgid "there is already a transaction in progress" -msgstr "há uma transação em execução" - -#: access/transam/xact.c:3442 access/transam/xact.c:3535 +msgid "could not truncate file \"%s\" to %u: %m" +msgstr "não foi possível truncar o arquivo \"%s\" para %u: %m" + +#: access/heap/rewriteheap.c:1156 access/transam/timeline.c:384 +#: access/transam/timeline.c:424 access/transam/timeline.c:498 +#: access/transam/xlog.c:3023 access/transam/xlog.c:3220 +#: access/transam/xlog.c:3952 commands/dbcommands.c:530 +#: postmaster/postmaster.c:4567 postmaster/postmaster.c:4577 +#: replication/logical/origin.c:615 replication/logical/origin.c:657 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1767 +#: replication/slot.c:1812 storage/file/buffile.c:545 +#: storage/file/copydir.c:197 utils/init/miscinit.c:1612 +#: utils/init/miscinit.c:1623 utils/init/miscinit.c:1631 utils/misc/guc.c:4340 +#: utils/misc/guc.c:4371 utils/misc/guc.c:5507 utils/misc/guc.c:5525 +#: utils/time/snapmgr.c:1268 utils/time/snapmgr.c:1275 #, c-format -msgid "there is no transaction in progress" -msgstr "não há uma transação em execução" +msgid "could not write to file \"%s\": %m" +msgstr "não foi possível escrever no arquivo \"%s\": %m" -#: access/transam/xact.c:3631 access/transam/xact.c:3682 -#: access/transam/xact.c:3688 access/transam/xact.c:3732 -#: access/transam/xact.c:3781 access/transam/xact.c:3787 +#: access/heap/vacuumlazy.c:482 #, c-format -msgid "no such savepoint" -msgstr "ponto de salvamento inexistente" +msgid "aggressively vacuuming \"%s.%s.%s\"" +msgstr "limpeza agressiva \"%s.%s.%s\"" -#: access/transam/xact.c:4464 +#: access/heap/vacuumlazy.c:487 #, c-format -msgid "cannot have more than 2^32-1 subtransactions in a transaction" -msgstr "não pode ter mais do que 2^32-1 subtransações em uma transação" +msgid "vacuuming \"%s.%s.%s\"" +msgstr "limpeza \"%s.%s.%s\"" -#: access/transam/xlog.c:2416 +#: access/heap/vacuumlazy.c:635 #, c-format -msgid "could not seek in log file %s to offset %u: %m" -msgstr "não pôde posicionar no arquivo %s na posição %u: %m" +msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" +msgstr "terminada a limpeza de \"%s.%s.%s\": varreduras de índice: %d\n" -#: access/transam/xlog.c:2436 +#: access/heap/vacuumlazy.c:646 #, c-format -msgid "could not write to log file %s at offset %u, length %zu: %m" -msgstr "não pôde escrever no arquivo de log %s na posição %u, tamanho %zu: %m" +msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" +msgstr "limpeza agressiva automática para evitar a reutilização de identificadores de transação (wraparound) da tabela \"%s.%s.%s\": varreduras de índice: %d\n" -#: access/transam/xlog.c:2712 +#: access/heap/vacuumlazy.c:648 #, c-format -msgid "updated min recovery point to %X/%X on timeline %u" -msgstr "ponto de recuperação mínimo atualizado para %X/%X na linha do tempo %u" +msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" +msgstr "limpeza automática para evitar a reutilização de identificadores de transação (wraparound) da tabela \"%s.%s.%s\": varreduras de índice: %d\n" -#: access/transam/xlog.c:3292 +#: access/heap/vacuumlazy.c:653 #, c-format -msgid "not enough data in file \"%s\"" -msgstr "dados insuficientes no arquivo \"%s\"" +msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" +msgstr "limpeza agressiva automática da tabela \"%s.%s.%s\": varreduras de índice: %d\n" -#: access/transam/xlog.c:3411 +#: access/heap/vacuumlazy.c:655 #, c-format -msgid "could not link file \"%s\" to \"%s\" (initialization of log file): %m" -msgstr "não pôde vincular arquivo \"%s\" a \"%s\" (inicialização do arquivo de log): %m" +msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" +msgstr "limpeza automática da tabela \"%s.%s.%s\": varreduras de índice: %d\n" -#: access/transam/xlog.c:3423 +#: access/heap/vacuumlazy.c:662 #, c-format -msgid "could not rename file \"%s\" to \"%s\" (initialization of log file): %m" -msgstr "não pôde renomear arquivo \"%s\" para \"%s\" (inicialização do arquivo de log): %m" +msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" +msgstr "páginas: %u removidas, %u restantes, %u varridas (%.2f%% do total)\n" -#: access/transam/xlog.c:3451 +#: access/heap/vacuumlazy.c:669 #, c-format -msgid "could not open transaction log file \"%s\": %m" -msgstr "não pôde abrir arquivo de log de transação \"%s\": %m" +msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" +msgstr "tuplas: %lld removidas, %lld permanecem, %lld estão mortas, mas ainda não são removíveis\n" -#: access/transam/xlog.c:3640 +#: access/heap/vacuumlazy.c:675 #, c-format -msgid "could not close log file %s: %m" -msgstr "não pôde fechar arquivo de log de transação \"%s\": %m" +msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" +msgstr "tuplas perdidas: %lld mortas de %u páginas não removidas devido à contenção do bloqueio de limpeza\n" -#: access/transam/xlog.c:3699 replication/logical/logicalfuncs.c:147 -#: replication/walsender.c:2089 +#: access/heap/vacuumlazy.c:681 #, c-format -msgid "requested WAL segment %s has already been removed" -msgstr "segmento do WAL solicitado %s já foi removido" +msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" +msgstr "ponto limite removível: %u, que tinha %d XIDs antigos quando a operação terminou\n" -#: access/transam/xlog.c:3777 access/transam/xlog.c:3954 +#: access/heap/vacuumlazy.c:688 #, c-format -msgid "could not open transaction log directory \"%s\": %m" -msgstr "não pôde abrir diretório do log de transação \"%s\": %m" +msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" +msgstr "novo relfrozenxid: %u, que está %d XIDs à ​​frente do valor anterior\n" -#: access/transam/xlog.c:3825 +#: access/heap/vacuumlazy.c:696 #, c-format -msgid "recycled transaction log file \"%s\"" -msgstr "arquivo do log de transação \"%s\" foi reciclado" +msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" +msgstr "novo relminmxid: %u, que está %d MXIDs à ​​frente do valor anterior\n" -#: access/transam/xlog.c:3841 +#: access/heap/vacuumlazy.c:699 #, c-format -msgid "removing transaction log file \"%s\"" -msgstr "removendo arquivo do log de transação \"%s\"" +msgid "frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n" +msgstr "congeladas: %u páginas da tabela (%.2f%% do total) tiveram %lld tuplas congeladas\n" -#: access/transam/xlog.c:3864 -#, c-format -msgid "could not rename old transaction log file \"%s\": %m" -msgstr "não pôde renomear arquivo de log de transação antigo \"%s\": %m" +#: access/heap/vacuumlazy.c:707 +msgid "index scan not needed: " +msgstr "varredura de índice não necessária: " -#: access/transam/xlog.c:3876 -#, c-format -msgid "could not remove old transaction log file \"%s\": %m" -msgstr "não pôde remover arquivo de log de transação antigo \"%s\": %m" +#: access/heap/vacuumlazy.c:709 +msgid "index scan needed: " +msgstr "varredura de índice necessária: " -#: access/transam/xlog.c:3914 access/transam/xlog.c:3924 +#: access/heap/vacuumlazy.c:711 #, c-format -msgid "required WAL directory \"%s\" does not exist" -msgstr "diretório WAL requerido \"%s\" não existe" +msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" +msgstr "%u páginas da tabela (%.2f%% do total) tiveram %lld identificadores de itens mortos removidos\n" -#: access/transam/xlog.c:3930 -#, c-format -msgid "creating missing WAL directory \"%s\"" -msgstr "criando diretório WAL ausente \"%s\"" +#: access/heap/vacuumlazy.c:716 +msgid "index scan bypassed: " +msgstr "varredura de índice ignorada: " -#: access/transam/xlog.c:3933 +#: access/heap/vacuumlazy.c:718 +msgid "index scan bypassed by failsafe: " +msgstr "varredura de índice ignorada por failsafe: " + +#: access/heap/vacuumlazy.c:720 #, c-format -msgid "could not create missing directory \"%s\": %m" -msgstr "não pôde criar diretório ausente \"%s\": %m" +msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" +msgstr "%u páginas da tabela (%.2f%% do total) possuem %lld identificadores de itens mortos\n" -#: access/transam/xlog.c:3967 +#: access/heap/vacuumlazy.c:735 #, c-format -msgid "removing transaction log backup history file \"%s\"" -msgstr "removendo arquivo de histórico do log de transação \"%s\"" +msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" +msgstr "índice \"%s\": páginas: %u no total, %u excluídas recentemente, %u excluídas no momento, %u reutilizáveis\n" -#: access/transam/xlog.c:4159 +#: access/heap/vacuumlazy.c:747 commands/analyze.c:796 #, c-format -msgid "unexpected timeline ID %u in log segment %s, offset %u" -msgstr "ID de linha do tempo %u inesperado no arquivo de log %s, posição %u" +msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" +msgstr "tempos de E/S: leitura: %.3f ms, escrita: %.3f ms\n" -#: access/transam/xlog.c:4281 +#: access/heap/vacuumlazy.c:757 commands/analyze.c:799 #, c-format -msgid "new timeline %u is not a child of database system timeline %u" -msgstr "nova linha do tempo %u não é descendente da linha do tempo %u do sistema de banco de dados" +msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" +msgstr "taxa média de leitura: %.3f MB/s, taxa média de escrita: %.3f MB/s\n" -#: access/transam/xlog.c:4295 +#: access/heap/vacuumlazy.c:760 commands/analyze.c:801 #, c-format -msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" -msgstr "nova linha do tempo %u bifurcou da linha do tempo %u do sistema de banco de dados antes do ponto de recuperação atual %X/%X" +msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgstr "uso de buffer: %lld acertos, %lld erros, %lld sujos\n" -#: access/transam/xlog.c:4314 +#: access/heap/vacuumlazy.c:765 #, c-format -msgid "new target timeline is %u" -msgstr "nova linha do tempo é %u" +msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" +msgstr "uso do WAL: %lld registros, %lld imagens de página inteira, %llu bytes\n" -#: access/transam/xlog.c:4394 +#: access/heap/vacuumlazy.c:769 commands/analyze.c:805 #, c-format -msgid "could not create control file \"%s\": %m" -msgstr "não pôde criar arquivo de controle \"%s\": %m" +msgid "system usage: %s" +msgstr "uso do sistema: %s" -#: access/transam/xlog.c:4405 access/transam/xlog.c:4641 +#: access/heap/vacuumlazy.c:2482 #, c-format -msgid "could not write to control file: %m" -msgstr "não pôde escrever em arquivo de controle: %m" +msgid "table \"%s\": removed %lld dead item identifiers in %u pages" +msgstr "tabela \"%s\": %lld identificadores de itens mortos foram removidos em %u páginas" -#: access/transam/xlog.c:4411 access/transam/xlog.c:4647 +#: access/heap/vacuumlazy.c:2642 #, c-format -msgid "could not fsync control file: %m" -msgstr "não pôde executar fsync no arquivo de controle: %m" +msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" +msgstr "ignorando a manutenção não essencial da tabela \"%s.%s.%s\" como proteção contra falhas (failsafe) após %d varreduras de índice" -#: access/transam/xlog.c:4416 access/transam/xlog.c:4652 +#: access/heap/vacuumlazy.c:2645 #, c-format -msgid "could not close control file: %m" -msgstr "não pôde fechar arquivo de controle: %m" +msgid "The table's relfrozenxid or relminmxid is too far in the past." +msgstr "O relfrozenxid ou relminmxid da tabela está muito distante no passado." -#: access/transam/xlog.c:4434 access/transam/xlog.c:4630 +#: access/heap/vacuumlazy.c:2646 #, c-format -msgid "could not open control file \"%s\": %m" -msgstr "não pôde abrir arquivo de controle \"%s\": %m" +msgid "" +"Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" +"You might also need to consider other ways for VACUUM to keep up with the allocation of transaction IDs." +msgstr "" +"Considere aumentar o parâmetro de configuração \"maintenance_work_mem\" ou \"autovacuum_work_mem\".\n" +"Talvez você também precise considerar outras maneiras do VACUUM acompanhar a alocação de IDs de transação." -#: access/transam/xlog.c:4440 +#: access/heap/vacuumlazy.c:2891 #, c-format -msgid "could not read from control file: %m" -msgstr "não pôde ler do arquivo de controle: %m" +msgid "\"%s\": stopping truncate due to conflicting lock request" +msgstr "\"%s\": parando truncamento devido a pedido de bloqueio conflitante" -#: access/transam/xlog.c:4453 access/transam/xlog.c:4462 -#: access/transam/xlog.c:4486 access/transam/xlog.c:4493 -#: access/transam/xlog.c:4500 access/transam/xlog.c:4505 -#: access/transam/xlog.c:4512 access/transam/xlog.c:4519 -#: access/transam/xlog.c:4526 access/transam/xlog.c:4533 -#: access/transam/xlog.c:4540 access/transam/xlog.c:4547 -#: access/transam/xlog.c:4554 access/transam/xlog.c:4563 -#: access/transam/xlog.c:4570 access/transam/xlog.c:4579 -#: access/transam/xlog.c:4586 access/transam/xlog.c:4595 -#: access/transam/xlog.c:4602 utils/init/miscinit.c:1139 +#: access/heap/vacuumlazy.c:2961 #, c-format -msgid "database files are incompatible with server" -msgstr "arquivos do banco de dados são incompatíveis com o servidor" +msgid "table \"%s\": truncated %u to %u pages" +msgstr "tabela \"%s\": %u em %u páginas truncadas" -#: access/transam/xlog.c:4454 +#: access/heap/vacuumlazy.c:3023 #, c-format -msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." -msgstr "O agrupamento de banco de dados foi inicializado com PG_CONTROL_VERSION %d (0x%08x), mas o servidor foi compilado com PG_CONTROL_VERSION %d (0x%08x)." +msgid "table \"%s\": suspending truncate due to conflicting lock request" +msgstr "tabela \"%s\": suspendendo truncamento devido a solicitação de bloqueio conflitante" -#: access/transam/xlog.c:4458 +#: access/heap/vacuumlazy.c:3183 #, c-format -msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." -msgstr "Isto pode ser um problema com ordenação dos bits. Parece que você precisa executar o initdb." +msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" +msgstr "desativando a opção paralela de limpeza (vacuum) em \"%s\" --- não é possível limpar tabelas temporárias em paralelo" -#: access/transam/xlog.c:4463 +#: access/heap/vacuumlazy.c:3399 #, c-format -msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." -msgstr "O agrupamento de banco de dados foi inicializado com PG_CONTROL_VERSION %d, mas o servidor foi compilado com PG_CONTROL_VERSION %d." +msgid "while scanning block %u offset %u of relation \"%s.%s\"" +msgstr "enquanto varrendo o bloco %u deslocamento %u da relação \"%s.%s\"" -#: access/transam/xlog.c:4466 access/transam/xlog.c:4490 -#: access/transam/xlog.c:4497 access/transam/xlog.c:4502 +#: access/heap/vacuumlazy.c:3402 #, c-format -msgid "It looks like you need to initdb." -msgstr "Parece que você precisa executar o initdb." +msgid "while scanning block %u of relation \"%s.%s\"" +msgstr "enquanto varrendo o bloco %u da relação \"%s.%s\"" -#: access/transam/xlog.c:4477 +#: access/heap/vacuumlazy.c:3406 #, c-format -msgid "incorrect checksum in control file" -msgstr "soma de verificação está incorreta em arquivo de controle" +msgid "while scanning relation \"%s.%s\"" +msgstr "enquanto varrendo a relação \"%s.%s\"" -#: access/transam/xlog.c:4487 +#: access/heap/vacuumlazy.c:3414 #, c-format -msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." -msgstr "O agrupamento de banco de dados foi inicializado com CATALOG_VERSION_NO %d, mas o servidor foi compilado com CATALOG_VERSION_NO %d." +msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" +msgstr "enquanto limpando o bloco %u deslocamento %u da relação \"%s.%s\"" -#: access/transam/xlog.c:4494 +#: access/heap/vacuumlazy.c:3417 #, c-format -msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." -msgstr "O agrupamento de banco de dados foi inicializado com MAXALIGN %d, mas o servidor foi compilado com MAXALIGN %d." +msgid "while vacuuming block %u of relation \"%s.%s\"" +msgstr "enquanto limpando o bloco %u da relação \"%s.%s\"" -#: access/transam/xlog.c:4501 +#: access/heap/vacuumlazy.c:3421 #, c-format -msgid "The database cluster appears to use a different floating-point number format than the server executable." -msgstr "O agrupamento de banco de dados parece utilizar um formato de número de ponto flutuante diferente do executável do servidor." +msgid "while vacuuming relation \"%s.%s\"" +msgstr "enquanto limpando a relação \"%s.%s\"" -#: access/transam/xlog.c:4506 +#: access/heap/vacuumlazy.c:3426 commands/vacuumparallel.c:1074 #, c-format -msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." -msgstr "O agrupamento de banco de dados foi inicializado com BLCSZ %d, mas o servidor foi compilado com BLCSZ %d." +msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" +msgstr "enquanto limpando o índice \"%s\" da relação \"%s.%s\"" -#: access/transam/xlog.c:4509 access/transam/xlog.c:4516 -#: access/transam/xlog.c:4523 access/transam/xlog.c:4530 -#: access/transam/xlog.c:4537 access/transam/xlog.c:4544 -#: access/transam/xlog.c:4551 access/transam/xlog.c:4558 -#: access/transam/xlog.c:4566 access/transam/xlog.c:4573 -#: access/transam/xlog.c:4582 access/transam/xlog.c:4589 -#: access/transam/xlog.c:4598 access/transam/xlog.c:4605 +#: access/heap/vacuumlazy.c:3431 commands/vacuumparallel.c:1080 #, c-format -msgid "It looks like you need to recompile or initdb." -msgstr "Parece que você precisa recompilar ou executar o initdb." +msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" +msgstr "enquanto limpando o índice \"%s\" da relação \"%s.%s\"" -#: access/transam/xlog.c:4513 +#: access/heap/vacuumlazy.c:3437 #, c-format -msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." -msgstr "O agrupamento de banco de dados foi inicializado com RELSEG_SIZE %d, mas o servidor foi compilado com RELSEG_SIZE %d." +msgid "while truncating relation \"%s.%s\" to %u blocks" +msgstr "enquanto truncando a relação \"%s.%s\" para %u blocos" -#: access/transam/xlog.c:4520 +#: access/index/amapi.c:83 commands/amcmds.c:143 #, c-format -msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." -msgstr "O agrupamento de banco de dados foi inicializado com XLOG_BLCSZ %d, mas o servidor foi compilado com XLOG_BLCSZ %d." +msgid "access method \"%s\" is not of type %s" +msgstr "o método de acesso \"%s\" não é do tipo %s" -#: access/transam/xlog.c:4527 +#: access/index/amapi.c:99 #, c-format -msgid "The database cluster was initialized with XLOG_SEG_SIZE %d, but the server was compiled with XLOG_SEG_SIZE %d." -msgstr "O agrupamento de banco de dados foi inicializado com XLOG_SEG_SIZE %d, mas o servidor foi compilado com XLOG_SEG_SIZE %d." +msgid "index access method \"%s\" does not have a handler" +msgstr "o método de acesso do índice \"%s\" não possui um tratador" -#: access/transam/xlog.c:4534 +#: access/index/genam.c:490 #, c-format -msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." -msgstr "O agrupamento de banco de dados foi inicializado com NAMEDATALEN %d, mas o servidor foi compilado com NAMEDATALEN %d." +msgid "transaction aborted during system catalog scan" +msgstr "transação interrompida durante a varredura do catálogo do sistema" -#: access/transam/xlog.c:4541 +#: access/index/indexam.c:142 catalog/objectaddress.c:1394 +#: commands/indexcmds.c:2843 commands/tablecmds.c:272 commands/tablecmds.c:296 +#: commands/tablecmds.c:17177 commands/tablecmds.c:18955 #, c-format -msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." -msgstr "O agrupamento de banco de dados foi inicializado com INDEX_MAX_KEYS %d, mas o servidor foi compilado com INDEX_MAX_KEYS %d." +msgid "\"%s\" is not an index" +msgstr "\"%s\" não é um índice" -#: access/transam/xlog.c:4548 +#: access/index/indexam.c:979 #, c-format -msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." -msgstr "O agrupamento de banco de dados foi inicializado com TOAST_MAX_CHUNK_SIZE %d, mas o servidor foi compilado com TOAST_MAX_CHUNK_SIZE %d." +msgid "operator class %s has no options" +msgstr "a classe de operador %s não tem opções" -#: access/transam/xlog.c:4555 +#: access/nbtree/nbtinsert.c:668 #, c-format -msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." -msgstr "O agrupamento de banco de dados foi inicializado com LOBLKSIZE %d, mas o servidor foi compilado com LOBLKSIZE %d." +msgid "duplicate key value violates unique constraint \"%s\"" +msgstr "duplicar valor da chave viola a restrição de unicidade \"%s\"" -#: access/transam/xlog.c:4564 +#: access/nbtree/nbtinsert.c:670 #, c-format -msgid "The database cluster was initialized without HAVE_INT64_TIMESTAMP but the server was compiled with HAVE_INT64_TIMESTAMP." -msgstr "O agrupamento de banco de dados foi inicializado sem HAVE_INT64_TIMESTAMP mas o servidor foi compilado com HAVE_INT64_TIMESTAMP." +msgid "Key %s already exists." +msgstr "Chave %s já existe." -#: access/transam/xlog.c:4571 +#: access/nbtree/nbtinsert.c:764 #, c-format -msgid "The database cluster was initialized with HAVE_INT64_TIMESTAMP but the server was compiled without HAVE_INT64_TIMESTAMP." -msgstr "O agrupamento de banco de dados foi inicializado com HAVE_INT64_TIMESTAMP mas o servidor foi compilado sem HAVE_INT64_TIMESTAMP." +msgid "This may be because of a non-immutable index expression." +msgstr "Isso pode ser devido a uma expressão não imutável do índice." -#: access/transam/xlog.c:4580 +#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 +#: parser/parse_utilcmd.c:2317 #, c-format -msgid "The database cluster was initialized without USE_FLOAT4_BYVAL but the server was compiled with USE_FLOAT4_BYVAL." -msgstr "O agrupamento de banco de dados foi inicializado sem USE_FLOAT4_BYVAL, mas o servidor foi compilado com USE_FLOAT4_BYVAL." +msgid "index \"%s\" is not a btree" +msgstr "índice \"%s\" não é uma árvore-B" -#: access/transam/xlog.c:4587 +#: access/nbtree/nbtpage.c:164 access/nbtree/nbtpage.c:618 #, c-format -msgid "The database cluster was initialized with USE_FLOAT4_BYVAL but the server was compiled without USE_FLOAT4_BYVAL." -msgstr "O agrupamento de banco de dados foi inicializado com USE_FLOAT4_BYVAL, mas o servidor foi compilado sem USE_FLOAT4_BYVAL." +msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" +msgstr "versões sem correspondência no índice \"%s\": versão do arquivo %d, versão corrente %d, versão mínima com suporte %d" -#: access/transam/xlog.c:4596 +#: access/nbtree/nbtpage.c:1866 #, c-format -msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." -msgstr "O agrupamento de banco de dados foi inicializado sem USE_FLOAT8_BYVAL, mas o servidor foi compilado com USE_FLOAT8_BYVAL." +msgid "index \"%s\" contains a half-dead internal page" +msgstr "índice \"%s\" contém uma página interna parcialmente não vigente" -#: access/transam/xlog.c:4603 +#: access/nbtree/nbtpage.c:1868 #, c-format -msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." -msgstr "O agrupamento de banco de dados foi inicializado com USE_FLOAT8_BYVAL, mas o servidor foi compilado sem USE_FLOAT8_BYVAL." +msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." +msgstr "Isto pode ser causado por um VACUUM interrompido na versão 9.3 ou anterior, antes de atualizar. Por favor execute REINDEX." -#: access/transam/xlog.c:5004 +#: access/nbtree/nbtutils.c:2677 #, c-format -msgid "could not write bootstrap transaction log file: %m" -msgstr "não pôde escrever no arquivo inicial de log de transação: %m" +msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" +msgstr "o tamanho da linha do índice %zu excede na Ãrvore-B versão %u seu máximo %zu para o índice \"%s\"" -#: access/transam/xlog.c:5010 +#: access/nbtree/nbtutils.c:2683 #, c-format -msgid "could not fsync bootstrap transaction log file: %m" -msgstr "não pôde executar fsync no arquivo inicial de log de transação: %m" +msgid "Index row references tuple (%u,%u) in relation \"%s\"." +msgstr "A linha do índice faz referência à tupla (%u,%u) na relação \"%s\"." -#: access/transam/xlog.c:5015 +#: access/nbtree/nbtutils.c:2687 #, c-format -msgid "could not close bootstrap transaction log file: %m" -msgstr "não pôde fechar arquivo inicial de log de transação: %m" +msgid "" +"Values larger than 1/3 of a buffer page cannot be indexed.\n" +"Consider a function index of an MD5 hash of the value, or use full text indexing." +msgstr "" +"Valores maiores do que 1/3 da página do buffer não podem ser indexados.\n" +"Considere um índice no hash MD5 do valor, ou use uma indexação de texto completo." -#: access/transam/xlog.c:5086 +#: access/nbtree/nbtvalidate.c:246 #, c-format -msgid "could not open recovery command file \"%s\": %m" -msgstr "não pôde abrir arquivo de comando de recuperação \"%s\": %m" +msgid "operator family \"%s\" of access method %s is missing support function for types %s and %s" +msgstr "a família de operador \"%s\" do método de acesso %s não possui função de suporte para os tipos %se %s" -#: access/transam/xlog.c:5126 access/transam/xlog.c:5217 -#: access/transam/xlog.c:5228 commands/extension.c:527 -#: commands/extension.c:535 utils/misc/guc.c:5369 +#: access/spgist/spgutils.c:243 #, c-format -msgid "parameter \"%s\" requires a Boolean value" -msgstr "parâmetro \"%s\" requer um valor booleano" +msgid "compress method must be defined when leaf type is different from input type" +msgstr "o método compress deve ser definido quando o tipo de dados da folha é diferente do tipo de dados da entrada" -#: access/transam/xlog.c:5142 +#: access/spgist/spgutils.c:1015 #, c-format -msgid "recovery_target_timeline is not a valid number: \"%s\"" -msgstr "recovery_target_timeline não é um número válido: \"%s\"" +msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" +msgstr "tamanho da tupla interna do SP-GiST %zu excede o máximo %zu" -#: access/transam/xlog.c:5158 +#: access/spgist/spgvalidate.c:136 #, c-format -msgid "recovery_target_xid is not a valid number: \"%s\"" -msgstr "recovery_target_xid não é um número válido: \"%s\"" +msgid "SP-GiST leaf data type %s does not match declared type %s" +msgstr "O tipo de dados folha do SP-GiST %s não corresponde ao tipo declarado %s" -#: access/transam/xlog.c:5189 +#: access/spgist/spgvalidate.c:302 #, c-format -msgid "recovery_target_name is too long (maximum %d characters)" -msgstr "recovery_target_name é muito longo (no máximo %d caracteres)" +msgid "operator family \"%s\" of access method %s is missing support function %d for type %s" +msgstr "a família de operador \"%s\" do método de acesso %s não possui função de suporte %d para o tipo %s" -#: access/transam/xlog.c:5203 +#: access/table/table.c:145 optimizer/util/plancat.c:145 #, c-format -msgid "invalid value for recovery parameter \"recovery_target\"" -msgstr "valor é inválido para parâmetro de recuperação \"recovery_target\"" +msgid "cannot open relation \"%s\"" +msgstr "não é possível abrir a relação \"%s\"" -#: access/transam/xlog.c:5204 +#: access/table/tableam.c:265 #, c-format -msgid "The only allowed value is \"immediate\"." -msgstr "O único valor permitido é \"immediate\"." +msgid "tid (%u, %u) is not valid for relation \"%s\"" +msgstr "tid (%u, %u) não é válido para a relação \"%s\"" -#: access/transam/xlog.c:5263 +#: access/table/tableamapi.c:116 #, c-format -msgid "parameter \"%s\" requires a temporal value" -msgstr "parâmetro \"%s\" requer um valor temporal" +msgid "%s cannot be empty." +msgstr "%s não pode estar vazio." -#: access/transam/xlog.c:5265 catalog/dependency.c:970 -#: catalog/dependency.c:971 catalog/dependency.c:977 catalog/dependency.c:978 -#: catalog/dependency.c:989 catalog/dependency.c:990 -#: catalog/objectaddress.c:764 commands/tablecmds.c:763 -#: commands/tablecmds.c:8949 commands/user.c:988 commands/view.c:475 -#: libpq/auth.c:285 port/win32/security.c:51 storage/lmgr/deadlock.c:955 -#: storage/lmgr/proc.c:1184 utils/misc/guc.c:5401 utils/misc/guc.c:5526 -#: utils/misc/guc.c:8867 utils/misc/guc.c:8901 utils/misc/guc.c:8935 -#: utils/misc/guc.c:8969 utils/misc/guc.c:9004 +#: access/table/tableamapi.c:123 access/transam/xlogrecovery.c:4774 #, c-format -msgid "%s" -msgstr "%s" +msgid "%s is too long (maximum %d characters)." +msgstr "%s é muito longo (máximo de %d caracteres)." -#: access/transam/xlog.c:5271 +#: access/table/tableamapi.c:146 #, c-format -msgid "unrecognized recovery parameter \"%s\"" -msgstr "parâmetro de recuperação \"%s\" desconhecido" +msgid "table access method \"%s\" does not exist" +msgstr "o método de acesso à tabela \"%s\" não existe" -#: access/transam/xlog.c:5282 +#: access/table/tableamapi.c:151 #, c-format -msgid "recovery command file \"%s\" specified neither primary_conninfo nor restore_command" -msgstr "arquivo de comando de recuperação \"%s\" não especificou primary_conninfo ou restore_command" +msgid "Table access method \"%s\" does not exist." +msgstr "O método de acesso à tabela \"%s\" não existe." -#: access/transam/xlog.c:5284 +#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:152 #, c-format -msgid "The database server will regularly poll the pg_xlog subdirectory to check for files placed there." -msgstr "O servidor de banco de dados acessará regularmente o subdiretório pg_xlog para verificar por arquivos ali presentes." +msgid "sample percentage must be between 0 and 100" +msgstr "a porcentagem da amostra deve estar entre 0 e 100" -#: access/transam/xlog.c:5290 +#: access/transam/commit_ts.c:279 #, c-format -msgid "recovery command file \"%s\" must specify restore_command when standby mode is not enabled" -msgstr "arquivo do comando de recuperação \"%s\" deve especificar restore_command quando modo em espera não estiver habilitado" +msgid "cannot retrieve commit timestamp for transaction %u" +msgstr "não é possível recuperar o carimbo de data/hora da efetivação para a transação %u" -#: access/transam/xlog.c:5310 +#: access/transam/commit_ts.c:377 #, c-format -msgid "recovery target timeline %u does not exist" -msgstr "linha do tempo para recuperação %u não existe" +msgid "could not get commit timestamp data" +msgstr "não foi possível os obter dados do carimbo de data/hora da efetivação" -#: access/transam/xlog.c:5407 +#: access/transam/commit_ts.c:379 #, c-format -msgid "archive recovery complete" -msgstr "recuperação do archive está completa" +msgid "Make sure the configuration parameter \"%s\" is set on the primary server." +msgstr "Certifique-se de que o parâmetro de configuração \"%s\" esteja definido no servidor primário." -#: access/transam/xlog.c:5477 access/transam/xlog.c:5671 +#: access/transam/commit_ts.c:381 #, c-format -msgid "recovery stopping after reaching consistency" -msgstr "recuperação parada após atingir consistência" +msgid "Make sure the configuration parameter \"%s\" is set." +msgstr "Certifique-se de que o parâmetro de configuração \"%s\" esteja definido." -#: access/transam/xlog.c:5552 +#: access/transam/multixact.c:1023 #, c-format -msgid "recovery stopping before commit of transaction %u, time %s" -msgstr "recuperação parada antes da efetivação da transação %u, tempo %s" +msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"" +msgstr "banco de dados não está aceitando comandos que geram novos MultiXactIds para evitar perda de dados devido s reutilização de identificadores de transação (wraparound) no banco de dados \"%s\"" -#: access/transam/xlog.c:5559 +#: access/transam/multixact.c:1025 access/transam/multixact.c:1032 +#: access/transam/multixact.c:1056 access/transam/multixact.c:1065 #, c-format -msgid "recovery stopping before abort of transaction %u, time %s" -msgstr "recuperação parada antes interrupção da transação %u, tempo %s" +msgid "" +"Execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"Execute um VACUUM completo nesse banco de dados.\n" +"Talvez você também precise efetivar ou desfazer transações preparadas antigas, ou descartar encaixes de replicação obsoletos." -#: access/transam/xlog.c:5601 +#: access/transam/multixact.c:1030 #, c-format -msgid "recovery stopping at restore point \"%s\", time %s" -msgstr "recuperação parada no ponto de restauração \"%s\", tempo %s" +msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u" +msgstr "banco de dados não está aceitando comandos que geram novos MultiXactIds para evitar perda de dados devido a reutilização de identificadores de transação (wraparound) no banco de dados com OID %u" -#: access/transam/xlog.c:5651 +#: access/transam/multixact.c:1051 access/transam/multixact.c:2333 #, c-format -msgid "recovery stopping after commit of transaction %u, time %s" -msgstr "recuperação parada após efetivação da transação %u, tempo %s" +msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" +msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" +msgstr[0] "banco de dados \"%s\" deve ser limpo antes que %u MultiXactId seja utilizado" +msgstr[1] "banco de dados \"%s\" deve ser limpo antes que %u MultiXactIds sejam utilizados" -#: access/transam/xlog.c:5659 +#: access/transam/multixact.c:1060 access/transam/multixact.c:2342 #, c-format -msgid "recovery stopping after abort of transaction %u, time %s" -msgstr "recuperação parada após interrupção da transação %u, tempo %s" +msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" +msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" +msgstr[0] "banco de dados com OID %u deve ser limpo antes que %u MultiXactId seja utilizado" +msgstr[1] "banco de dados com OID %u deve ser limpo antes que %u MultiXactIds sejam utilizados" -#: access/transam/xlog.c:5698 +#: access/transam/multixact.c:1121 #, c-format -msgid "recovery has paused" -msgstr "recuperação está em pausa" +msgid "multixact \"members\" limit exceeded" +msgstr "limite de \"membros\" multixact excedido" -#: access/transam/xlog.c:5699 +#: access/transam/multixact.c:1122 #, c-format -msgid "Execute pg_xlog_replay_resume() to continue." -msgstr "Execute pg_xlog_replay_resume() para continuar." +msgid "This command would create a multixact with %u members, but the remaining space is only enough for %u member." +msgid_plural "This command would create a multixact with %u members, but the remaining space is only enough for %u members." +msgstr[0] "Este comando criaria um multixact com %u membros, mas o espaço restante é suficiente apenas para %u membro." +msgstr[1] "Este comando criaria um multixact com %u membros, mas o espaço restante é suficiente apenas para %u membros." -#: access/transam/xlog.c:5914 +#: access/transam/multixact.c:1127 #, c-format -msgid "hot standby is not possible because %s = %d is a lower setting than on the master server (its value was %d)" -msgstr "servidor em espera ativo não é possível porque %s = %d é uma configuração mais baixa do que no servidor principal (seu valor era %d)" +msgid "Execute a database-wide VACUUM in database with OID %u with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." +msgstr "Execute o VACUUM de todo o banco de dados com OID %u com configurações reduzidas de vacuum_multixact_freeze_min_age e vacuum_multixact_freeze_table_age." -#: access/transam/xlog.c:5936 +#: access/transam/multixact.c:1158 #, c-format -msgid "WAL was generated with wal_level=minimal, data may be missing" -msgstr "WAL foi gerado com wal_level=minimal, dados podem estar faltando" +msgid "database with OID %u must be vacuumed before %d more multixact member is used" +msgid_plural "database with OID %u must be vacuumed before %d more multixact members are used" +msgstr[0] "o banco de dados com OID %u deve ser limpo antes de %d mais membro multixact ser usado" +msgstr[1] "o banco de dados com OID %u deve ser limpo antes de %d mais membros multixact serem usados" -#: access/transam/xlog.c:5937 +#: access/transam/multixact.c:1163 #, c-format -msgid "This happens if you temporarily set wal_level=minimal without taking a new base backup." -msgstr "Isso acontece se você temporariamente definir wal_level=minimal sem realizar uma nova cópia de segurança base." +msgid "Execute a database-wide VACUUM in that database with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." +msgstr "Execute o VACUUM de todo o banco de dados nesse banco de dados com configurações reduzidas de vacuum_multixact_freeze_min_age e vacuum_multixact_freeze_table_age" -#: access/transam/xlog.c:5948 +#: access/transam/multixact.c:1302 #, c-format -msgid "hot standby is not possible because wal_level was not set to \"hot_standby\" or higher on the master server" -msgstr "servidor em espera ativo não é possível porque wal_level não foi definido como \"hot_standby\" ou superior no servidor principal" +msgid "MultiXactId %u does no longer exist -- apparent wraparound" +msgstr "MultiXactId %u não existe -- aparente reutilização de identificadores de transação (wraparound)" -#: access/transam/xlog.c:5949 +#: access/transam/multixact.c:1308 #, c-format -msgid "Either set wal_level to \"hot_standby\" on the master, or turn off hot_standby here." -msgstr "Defina wal_level para \"hot_standby\" no primário ou desabilite hot_standby aqui." +msgid "MultiXactId %u has not been created yet -- apparent wraparound" +msgstr "MultiXactId %u não foi criado ainda -- aparente reutilização de identificadores de transação (wraparound)" -#: access/transam/xlog.c:6004 +#: access/transam/multixact.c:2338 access/transam/multixact.c:2347 +#: access/transam/varsup.c:151 access/transam/varsup.c:158 +#: access/transam/varsup.c:466 access/transam/varsup.c:473 #, c-format -msgid "control file contains invalid data" -msgstr "arquivo de controle contém dados inválidos" +msgid "" +"To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"Para evitar o deligamento do banco de dados, execute um VACUUM de todo o banco de dados nesse banco de dados.\n" +"Talvez você também precise efetivar ou desfazer transações preparadas antigas, ou descartar encaixes de replicação obsoletos." -#: access/transam/xlog.c:6010 +#: access/transam/multixact.c:2622 #, c-format -msgid "database system was shut down at %s" -msgstr "sistema de banco de dados foi desligado em %s" +msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" +msgstr "as proteções contra reutilização de identificadores de transação (wraparound) de membro MultiXact estão desativadas, porque não existe no disco o MultiXact %u com ponto de verificação mais antigo" -#: access/transam/xlog.c:6015 +#: access/transam/multixact.c:2644 #, c-format -msgid "database system was shut down in recovery at %s" -msgstr "sistema de banco de dados foi desligado durante recuperação em %s" +msgid "MultiXact member wraparound protections are now enabled" +msgstr "as proteções contra reutilização de identificadores de transação (wraparound) de membro MultiXact estão ativas agora" -#: access/transam/xlog.c:6019 +#: access/transam/multixact.c:3027 #, c-format -msgid "database system shutdown was interrupted; last known up at %s" -msgstr "desligamento do sistema de banco de dados foi interrompido; última execução em %s" +msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" +msgstr "mais antigo MultiXact %u não encontrado, mais recente MultiXact %u, ignorando o truncamento" -#: access/transam/xlog.c:6023 +#: access/transam/multixact.c:3045 #, c-format -msgid "database system was interrupted while in recovery at %s" -msgstr "sistema de banco de dados foi interrompido enquanto estava sendo recuperado em %s" +msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" +msgstr "não é possível truncar até MultiXact %u, porque não existe no disco, ignorando o truncamento" -#: access/transam/xlog.c:6025 +#: access/transam/multixact.c:3359 #, c-format -msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." -msgstr "Isso provavelmente significa que algum dado foi corrompido e você terá que utilizar a última cópia de segurança para recuperação." +msgid "invalid MultiXactId: %u" +msgstr "inválido MultiXactId: %u" -#: access/transam/xlog.c:6029 +#: access/transam/parallel.c:729 access/transam/parallel.c:848 #, c-format -msgid "database system was interrupted while in recovery at log time %s" -msgstr "sistema de banco de dados foi interrompido enquanto estava sendo recuperado em %s" +msgid "parallel worker failed to initialize" +msgstr "processo trabalhador paralelo falhou ao inicializar" -#: access/transam/xlog.c:6031 +#: access/transam/parallel.c:730 access/transam/parallel.c:849 #, c-format -msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." -msgstr "Se isto ocorreu mais de uma vez algum dado pode ter sido corrompido e você pode precisar escolher um ponto de recuperação anterior ao especificado." +msgid "More details may be available in the server log." +msgstr "Mais detalhes podem estar disponíveis no registro de eventos do servidor." -#: access/transam/xlog.c:6035 +#: access/transam/parallel.c:910 #, c-format -msgid "database system was interrupted; last known up at %s" -msgstr "sistema de banco de dados foi interrompido; última execução em %s" +msgid "postmaster exited during a parallel transaction" +msgstr "postmaster encerrado durante uma transação paralela" -#: access/transam/xlog.c:6089 +#: access/transam/parallel.c:1097 #, c-format -msgid "entering standby mode" -msgstr "entrando no modo em espera" +msgid "lost connection to parallel worker" +msgstr "conexão perdida com processo trabalhador paralelo" -#: access/transam/xlog.c:6092 +#: access/transam/parallel.c:1163 access/transam/parallel.c:1165 +msgid "parallel worker" +msgstr "processo trabalhador paralelo" + +#: access/transam/parallel.c:1319 replication/logical/applyparallelworker.c:893 #, c-format -msgid "starting point-in-time recovery to XID %u" -msgstr "iniciando recuperação de ponto no tempo para XID %u" +msgid "could not map dynamic shared memory segment" +msgstr "não foi possível mapear o segmento de memória compartilhada dinâmica" -#: access/transam/xlog.c:6096 +#: access/transam/parallel.c:1324 replication/logical/applyparallelworker.c:899 #, c-format -msgid "starting point-in-time recovery to %s" -msgstr "iniciando recuperação de ponto no tempo para %s" +msgid "invalid magic number in dynamic shared memory segment" +msgstr "número mágico inválido no segmento de memória compartilhada dinâmica" -#: access/transam/xlog.c:6100 +#: access/transam/rmgr.c:84 #, c-format -msgid "starting point-in-time recovery to \"%s\"" -msgstr "iniciando recuperação de ponto no tempo para \"%s\"" +msgid "resource manager with ID %d not registered" +msgstr "o gerenciador de recursos com ID %d não está registrado" -#: access/transam/xlog.c:6104 +#: access/transam/rmgr.c:85 #, c-format -msgid "starting point-in-time recovery to earliest consistent point" -msgstr "iniciando recuperação de ponto no tempo para ponto de consistência mais antigo" +msgid "Include the extension module that implements this resource manager in shared_preload_libraries." +msgstr "Inclua o módulo de extensão que implementa este gerenciador de recursos em shared_preload_libraries." -#: access/transam/xlog.c:6107 +#: access/transam/rmgr.c:101 #, c-format -msgid "starting archive recovery" -msgstr "iniciando recuperação do arquivador" +msgid "custom resource manager name is invalid" +msgstr "o nome do gerenciador de recursos personalizado é inválido" -#: access/transam/xlog.c:6124 +#: access/transam/rmgr.c:102 #, c-format -msgid "Failed while allocating an XLog reading processor." -msgstr "Falhou ao alocar um processador de leitura do XLog." +msgid "Provide a non-empty name for the custom resource manager." +msgstr "Forneça um nome não vazio para o gerenciador de recursos personalizado." -#: access/transam/xlog.c:6149 access/transam/xlog.c:6216 +#: access/transam/rmgr.c:105 #, c-format -msgid "checkpoint record is at %X/%X" -msgstr "registro do ponto de controle está em %X/%X" +msgid "custom resource manager ID %d is out of range" +msgstr "o ID do gerenciador de recursos personalizado %d está fora do intervalo" -#: access/transam/xlog.c:6163 +#: access/transam/rmgr.c:106 #, c-format -msgid "could not find redo location referenced by checkpoint record" -msgstr "não pôde encontrar local do redo referenciado pelo registro do ponto de controle" +msgid "Provide a custom resource manager ID between %d and %d." +msgstr "Forneça um ID de gerenciador de recursos personalizado entre %d e %d." -#: access/transam/xlog.c:6164 access/transam/xlog.c:6171 +#: access/transam/rmgr.c:111 access/transam/rmgr.c:116 +#: access/transam/rmgr.c:128 #, c-format -msgid "If you are not restoring from a backup, try removing the file \"%s/backup_label\"." -msgstr "Se você não está restaurando uma cópia de segurança, tente remover o arquivo \"%s/backup_label\"." +msgid "failed to register custom resource manager \"%s\" with ID %d" +msgstr "falha ao registrar o gerenciador de recursos personalizado \"%s\" com ID %d" -#: access/transam/xlog.c:6170 +#: access/transam/rmgr.c:112 #, c-format -msgid "could not locate required checkpoint record" -msgstr "não pôde localizar registro do ponto de controle requerido" +msgid "Custom resource manager must be registered while initializing modules in shared_preload_libraries." +msgstr "O gerenciador de recursos personalizado deve ser registrado ao inicializar os módulos em shared_preload_libraries." -#: access/transam/xlog.c:6226 access/transam/xlog.c:6241 +#: access/transam/rmgr.c:117 #, c-format -msgid "could not locate a valid checkpoint record" -msgstr "não pôde localizar registro do ponto de controle válido" +msgid "Custom resource manager \"%s\" already registered with the same ID." +msgstr "Gerenciador de recursos personalizados \"%s\" já registrado com o mesmo ID." -#: access/transam/xlog.c:6235 +#: access/transam/rmgr.c:129 #, c-format -msgid "using previous checkpoint record at %X/%X" -msgstr "utilizando registro do ponto de controle anterior em %X/%X" +msgid "Existing resource manager with ID %d has the same name." +msgstr "O gerenciador de recursos existente com ID %d tem o mesmo nome." -#: access/transam/xlog.c:6265 +#: access/transam/rmgr.c:135 #, c-format -msgid "requested timeline %u is not a child of this server's history" -msgstr "linha do tempo solicitada %u não é descendente do histórico do servidor" +msgid "registered custom resource manager \"%s\" with ID %d" +msgstr "registrado o gerenciador de recursos personalizados \"%s\" com ID %d" -#: access/transam/xlog.c:6267 +#: access/transam/slru.c:714 #, c-format -msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." -msgstr "Último ponto de controle está em %X/%X na linha do tempo %u, mas no histórico da linha do tempo solicitada, o servidor bifurcou daquela linha do tempo em %X/%X." +msgid "file \"%s\" doesn't exist, reading as zeroes" +msgstr "arquivo \"%s\" não existe, lendo como zeros" -#: access/transam/xlog.c:6283 +#: access/transam/slru.c:946 access/transam/slru.c:952 +#: access/transam/slru.c:960 access/transam/slru.c:965 +#: access/transam/slru.c:972 access/transam/slru.c:977 +#: access/transam/slru.c:984 access/transam/slru.c:991 #, c-format -msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" -msgstr "linha do tempo solicitada %u não contém o ponto de recuperação mínimo %X/%X na linha do tempo %u" +msgid "could not access status of transaction %u" +msgstr "não foi possível acessar status da transação %u" -#: access/transam/xlog.c:6292 +#: access/transam/slru.c:947 #, c-format -msgid "redo record is at %X/%X; shutdown %s" -msgstr "registro de redo está em %X/%X; desligamento %s" +msgid "Could not open file \"%s\": %m." +msgstr "Não foi possível abrir o arquivo \"%s\": %m." -#: access/transam/xlog.c:6296 +#: access/transam/slru.c:953 #, c-format -msgid "next transaction ID: %u/%u; next OID: %u" -msgstr "próximo ID de transação: %u/%u; próximo OID: %u" +msgid "Could not seek in file \"%s\" to offset %d: %m." +msgstr "Não foi possível posicionar no arquivo \"%s\" na posição %d: %m." -#: access/transam/xlog.c:6300 +#: access/transam/slru.c:961 #, c-format -msgid "next MultiXactId: %u; next MultiXactOffset: %u" -msgstr "próximo MultiXactId: %u; próximo MultiXactOffset: %u" +msgid "Could not read from file \"%s\" at offset %d: %m." +msgstr "Não foi possível ler do arquivo \"%s\" na posição %d: %m." -#: access/transam/xlog.c:6303 +#: access/transam/slru.c:966 #, c-format -msgid "oldest unfrozen transaction ID: %u, in database %u" -msgstr "ID de transação descongelado mais antigo: %u, no banco de dados %u" +msgid "Could not read from file \"%s\" at offset %d: read too few bytes." +msgstr "Não foi possível ler do arquivo \"%s\" na posição %d: lidos muito poucos bytes." -#: access/transam/xlog.c:6306 +#: access/transam/slru.c:973 #, c-format -msgid "oldest MultiXactId: %u, in database %u" -msgstr "MultiXactId mais antigo: %u, no banco de dados %u" +msgid "Could not write to file \"%s\" at offset %d: %m." +msgstr "Não foi possível escrever no arquivo \"%s\" na posição %d: %m." -#: access/transam/xlog.c:6310 +#: access/transam/slru.c:978 #, c-format -msgid "invalid next transaction ID" -msgstr "próximo ID de transação é inválido" +msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." +msgstr "Não foi possível escrever no arquivo \"%s\" na posição %d: escritos muito poucos bytes." -#: access/transam/xlog.c:6380 +#: access/transam/slru.c:985 #, c-format -msgid "invalid redo in checkpoint record" -msgstr "redo é inválido no registro do ponto de controle" +msgid "Could not fsync file \"%s\": %m." +msgstr "Não foi possível executar fsync no arquivo \"%s\": %m." -#: access/transam/xlog.c:6391 +#: access/transam/slru.c:992 #, c-format -msgid "invalid redo record in shutdown checkpoint" -msgstr "registro de redo é inválido no ponto de controle de desligamento" +msgid "Could not close file \"%s\": %m." +msgstr "Não foi possível fechar o arquivo \"%s\": %m." -#: access/transam/xlog.c:6422 +#: access/transam/slru.c:1253 #, c-format -msgid "database system was not properly shut down; automatic recovery in progress" -msgstr "sistema de banco de dados não foi desligado corretamente; recuperação automática está em andamento" +msgid "could not truncate directory \"%s\": apparent wraparound" +msgstr "não foi possível truncar o diretório \"%s\": aparente reutilização de identificadores de transação (wraparound)" -#: access/transam/xlog.c:6426 +#: access/transam/timeline.c:163 access/transam/timeline.c:168 #, c-format -msgid "crash recovery starts in timeline %u and has target timeline %u" -msgstr "recuperação de queda começa na linha do tempo %u e tem como linha do tempo alvo %u" +msgid "syntax error in history file: %s" +msgstr "erro de sintaxe no arquivo de histórico: %s" -#: access/transam/xlog.c:6463 +#: access/transam/timeline.c:164 #, c-format -msgid "backup_label contains data inconsistent with control file" -msgstr "backup_label contém dados inconsistentes com arquivo de controle" +msgid "Expected a numeric timeline ID." +msgstr "Esperado um ID de linha do tempo numérico." -#: access/transam/xlog.c:6464 +#: access/transam/timeline.c:169 #, c-format -msgid "This means that the backup is corrupted and you will have to use another backup for recovery." -msgstr "Isso significa que a cópia de segurança está corrompida e você terá que utilizar outra cópia de segurança para recuperação." +msgid "Expected a write-ahead log switchpoint location." +msgstr "Esperado um local de ponto de troca (switchpoint) do WAL." -#: access/transam/xlog.c:6529 +#: access/transam/timeline.c:173 #, c-format -msgid "initializing for hot standby" -msgstr "inicialização para servidor em espera ativo" +msgid "invalid data in history file: %s" +msgstr "dado inválido no arquivo de histórico: %s" -#: access/transam/xlog.c:6661 +#: access/transam/timeline.c:174 #, c-format -msgid "redo starts at %X/%X" -msgstr "redo inicia em %X/%X" +msgid "Timeline IDs must be in increasing sequence." +msgstr "IDs de linha do tempo devem ser uma sequência crescente." -#: access/transam/xlog.c:6876 +#: access/transam/timeline.c:194 #, c-format -msgid "redo done at %X/%X" -msgstr "redo pronto em %X/%X" +msgid "invalid data in history file \"%s\"" +msgstr "dado inválido no arquivo de histórico \"%s\"" -#: access/transam/xlog.c:6881 access/transam/xlog.c:8735 +#: access/transam/timeline.c:195 #, c-format -msgid "last completed transaction was at log time %s" -msgstr "última transação efetivada foi em %s" +msgid "Timeline IDs must be less than child timeline's ID." +msgstr "IDs de linha do tempo devem ser menores do que ID de linha do tempo descendente." -#: access/transam/xlog.c:6889 +#: access/transam/timeline.c:589 #, c-format -msgid "redo is not required" -msgstr "redo não é requerido" +msgid "requested timeline %u is not in this server's history" +msgstr "linha do tempo solicitada %u não está no histórico do servidor" -#: access/transam/xlog.c:6947 +#: access/transam/twophase.c:386 #, c-format -msgid "requested recovery stop point is before consistent recovery point" -msgstr "ponto de parada de recuperação solicitado está antes do ponto de recuperação consistente" +msgid "transaction identifier \"%s\" is too long" +msgstr "identificador de transação \"%s\" é muito longo" -#: access/transam/xlog.c:6963 access/transam/xlog.c:6967 +#: access/transam/twophase.c:393 #, c-format -msgid "WAL ends before end of online backup" -msgstr "WAL terminou antes do fim da cópia de segurança online" +msgid "prepared transactions are disabled" +msgstr "transações preparadas estão desativadas" -#: access/transam/xlog.c:6964 +#: access/transam/twophase.c:394 #, c-format -msgid "All WAL generated while online backup was taken must be available at recovery." -msgstr "Todo WAL gerado enquanto a cópia de segurança online era feita deve estar disponível para recuperação." +msgid "Set max_prepared_transactions to a nonzero value." +msgstr "Defina max_prepared_transactions para um valor diferente de zero." -#: access/transam/xlog.c:6968 +#: access/transam/twophase.c:413 #, c-format -msgid "Online backup started with pg_start_backup() must be ended with pg_stop_backup(), and all WAL up to that point must be available at recovery." -msgstr "Cópia de segurança online que iniciou com pg_start_backup() deve ser terminada com pg_stop_backup(), e todo WAL até aquele ponto deve estar disponível para recuperação." +msgid "transaction identifier \"%s\" is already in use" +msgstr "identificador de transação \"%s\" já está em uso" -#: access/transam/xlog.c:6971 +#: access/transam/twophase.c:422 access/transam/twophase.c:2517 #, c-format -msgid "WAL ends before consistent recovery point" -msgstr "Log de transação termina antes de ponto de recuperação consistente" +msgid "maximum number of prepared transactions reached" +msgstr "número máximo de transações preparadas foi alcançado" -#: access/transam/xlog.c:6998 +#: access/transam/twophase.c:423 access/transam/twophase.c:2518 #, c-format -msgid "selected new timeline ID: %u" -msgstr "novo ID de linha do tempo selecionado: %u" +msgid "Increase max_prepared_transactions (currently %d)." +msgstr "Aumente max_prepared_transactions (atualmente %d)." -#: access/transam/xlog.c:7339 +#: access/transam/twophase.c:599 #, c-format -msgid "consistent recovery state reached at %X/%X" -msgstr "estado de recuperação consistente alcançado em %X/%X" +msgid "prepared transaction with identifier \"%s\" is busy" +msgstr "transação preparada com identificador \"%s\" está sendo usada" -#: access/transam/xlog.c:7536 +#: access/transam/twophase.c:605 #, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "vínculo de ponto de controle primário é inválido no arquivo de controle" +msgid "permission denied to finish prepared transaction" +msgstr "permissão negada ao finalizar transação preparada" -#: access/transam/xlog.c:7540 +#: access/transam/twophase.c:606 #, c-format -msgid "invalid secondary checkpoint link in control file" -msgstr "vínculo de ponto de controle secundário é inválido no arquivo de controle" +msgid "Must be superuser or the user that prepared the transaction." +msgstr "Deve ser superusuário ou usuário que preparou a transação." -#: access/transam/xlog.c:7544 +#: access/transam/twophase.c:617 #, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "vínculo de ponto de controle é inválido no arquivo backup_label" +msgid "prepared transaction belongs to another database" +msgstr "transação preparada pertence a outro banco de dados" -#: access/transam/xlog.c:7561 +#: access/transam/twophase.c:618 #, c-format -msgid "invalid primary checkpoint record" -msgstr "registro do ponto de controle primário é inválido" +msgid "Connect to the database where the transaction was prepared to finish it." +msgstr "Conecte-se ao banco de dados onde a transação foi preparada para terminá-la." -#: access/transam/xlog.c:7565 +#: access/transam/twophase.c:633 #, c-format -msgid "invalid secondary checkpoint record" -msgstr "registro do ponto de controle secundário é inválido" +msgid "prepared transaction with identifier \"%s\" does not exist" +msgstr "transação preparada com identificador \"%s\" não existe" -#: access/transam/xlog.c:7569 +#: access/transam/twophase.c:1168 #, c-format -msgid "invalid checkpoint record" -msgstr "registro do ponto de controle é inválido" +msgid "two-phase state file maximum length exceeded" +msgstr "tamanho máximo do arquivo de status de efetivação em duas-fases foi alcançado" -#: access/transam/xlog.c:7580 +#: access/transam/twophase.c:1323 #, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "ID do gerenciador de recursos é inválido no registro do ponto de controle primário" +msgid "incorrect size of file \"%s\": %lld byte" +msgid_plural "incorrect size of file \"%s\": %lld bytes" +msgstr[0] "tamanho incorreto do arquivo \"%s\": %lld byte" +msgstr[1] "tamanho incorreto do arquivo \"%s\": %lld bytes" -#: access/transam/xlog.c:7584 +#: access/transam/twophase.c:1332 #, c-format -msgid "invalid resource manager ID in secondary checkpoint record" -msgstr "ID do gerenciador de recursos é inválido no registro do ponto de controle secundário" +msgid "incorrect alignment of CRC offset for file \"%s\"" +msgstr "alinhamento incorreto do deslocamento CRC no arquivo \"%s\"" -#: access/transam/xlog.c:7588 +#: access/transam/twophase.c:1350 #, c-format -msgid "invalid resource manager ID in checkpoint record" -msgstr "ID do gerenciador de recursos é inválido no registro do ponto de controle" +msgid "could not read file \"%s\": read %d of %lld" +msgstr "não foi possível ler o arquivo \"%s\": lidos %d de %lld" -#: access/transam/xlog.c:7600 +#: access/transam/twophase.c:1365 #, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "xl_info é inválido no registro do ponto de controle primário" +msgid "invalid magic number stored in file \"%s\"" +msgstr "número mágico inválido armazenado no arquivo \"%s\"" -#: access/transam/xlog.c:7604 +#: access/transam/twophase.c:1371 #, c-format -msgid "invalid xl_info in secondary checkpoint record" -msgstr "xl_info é inválido no registro do ponto de controle secundário" +msgid "invalid size stored in file \"%s\"" +msgstr "tamanho inválido armazenado no arquivo \"%s\"" -#: access/transam/xlog.c:7608 +#: access/transam/twophase.c:1383 #, c-format -msgid "invalid xl_info in checkpoint record" -msgstr "xl_info é inválido no registro do ponto de contrle" +msgid "calculated CRC checksum does not match value stored in file \"%s\"" +msgstr "a soma de verificação CRC calculada não corresponde ao valor armazenado no arquivo \"%s\"" -#: access/transam/xlog.c:7620 +#: access/transam/twophase.c:1413 access/transam/xlogrecovery.c:590 +#: replication/logical/logical.c:209 replication/walsender.c:687 #, c-format -msgid "invalid length of primary checkpoint record" -msgstr "tamanho do registro do ponto de controle primário é inválido" +msgid "Failed while allocating a WAL reading processor." +msgstr "Falha ao alocar um processo de leitura do WAL." -#: access/transam/xlog.c:7624 +#: access/transam/twophase.c:1423 #, c-format -msgid "invalid length of secondary checkpoint record" -msgstr "tamanho do registro do ponto de controle secundário é inválido" +msgid "could not read two-phase state from WAL at %X/%X: %s" +msgstr "não foi possível ler o estado de duas-fases do WAL em %X/%X: %s" -#: access/transam/xlog.c:7628 +#: access/transam/twophase.c:1428 #, c-format -msgid "invalid length of checkpoint record" -msgstr "tamanho do registro do ponto de controle é inválido" +msgid "could not read two-phase state from WAL at %X/%X" +msgstr "não foi possível ler o estado de duas-fases do WAL em %X/%X" -#: access/transam/xlog.c:7788 +#: access/transam/twophase.c:1436 #, c-format -msgid "shutting down" -msgstr "desligando" +msgid "expected two-phase state data is not present in WAL at %X/%X" +msgstr "os dados esperados do estado de duas-fases não estão presentes no WAL em %X/%X" -#: access/transam/xlog.c:7811 +#: access/transam/twophase.c:1732 #, c-format -msgid "database system is shut down" -msgstr "sistema de banco de dados está desligado" +msgid "could not recreate file \"%s\": %m" +msgstr "não foi possível recriar o arquivo \"%s\": %m" -#: access/transam/xlog.c:8277 +#: access/transam/twophase.c:1859 #, c-format -msgid "concurrent transaction log activity while database system is shutting down" -msgstr "atividade concorrente no log de transação enquanto o sistema de banco de dados está sendo desligado" +msgid "%u two-phase state file was written for a long-running prepared transaction" +msgid_plural "%u two-phase state files were written for long-running prepared transactions" +msgstr[0] "%u arquivo de estado de duas-fases foi escrito para uma transação preparada de longa duração" +msgstr[1] "%u arquivos de estado de duas-fases foram escritos para transações preparadas de longa duração" -#: access/transam/xlog.c:8546 +#: access/transam/twophase.c:2093 #, c-format -msgid "skipping restartpoint, recovery has already ended" -msgstr "ignorando ponto de reinício, recuperação já terminou" +msgid "recovering prepared transaction %u from shared memory" +msgstr "recuperando a transação preparada %u da memória compartilhada" -#: access/transam/xlog.c:8569 +#: access/transam/twophase.c:2186 #, c-format -msgid "skipping restartpoint, already performed at %X/%X" -msgstr "ignorando ponto de reinício, já foi executado em %X/%X" +msgid "removing stale two-phase state file for transaction %u" +msgstr "removendo arquivo de estado de duas-fases obsoleto para a transação %u" -#: access/transam/xlog.c:8733 +#: access/transam/twophase.c:2193 #, c-format -msgid "recovery restart point at %X/%X" -msgstr "ponto de reinício de recuperação em %X/%X" +msgid "removing stale two-phase state from memory for transaction %u" +msgstr "removendo o estado de duas-fases obsoleto da memória para a transação %u" -#: access/transam/xlog.c:8878 +#: access/transam/twophase.c:2206 #, c-format -msgid "restore point \"%s\" created at %X/%X" -msgstr "ponto de restauração \"%s\" criado em %X/%X" +msgid "removing future two-phase state file for transaction %u" +msgstr "removendo o arquivo de estado de duas-fases futuro para a transação %u" -#: access/transam/xlog.c:9102 +#: access/transam/twophase.c:2213 #, c-format -msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" -msgstr "ID de linha do tempo anterior %u inesperado (ID de linha do tempo atual %u) no registro do ponto de controle" +msgid "removing future two-phase state from memory for transaction %u" +msgstr "removendo o estado de duas-fases futuro da memória para a transação %u" -#: access/transam/xlog.c:9111 +#: access/transam/twophase.c:2238 #, c-format -msgid "unexpected timeline ID %u (after %u) in checkpoint record" -msgstr "ID de linha do tempo %u inesperado (depois %u) no registro do ponto de controle" +msgid "corrupted two-phase state file for transaction %u" +msgstr "arquivo de estado de duas-fases corrompido para transação %u" -#: access/transam/xlog.c:9127 +#: access/transam/twophase.c:2243 #, c-format -msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" -msgstr "ID de linha do tempo %u inesperado no registro do ponto de controle, antes de alcançar ponto de recuperação mínimo %X/%X na linha do tempo %u" +msgid "corrupted two-phase state in memory for transaction %u" +msgstr "estado de duas-fases corrompido na memória para a transação %u" -#: access/transam/xlog.c:9195 +#: access/transam/twophase.c:2500 #, c-format -msgid "online backup was canceled, recovery cannot continue" -msgstr "cópia de segurança online foi cancelada, recuperação não pode continuar" +msgid "could not recover two-phase state file for transaction %u" +msgstr "não foi possível recuperar o arquivo de estado de duas-fases para a transação %u" -#: access/transam/xlog.c:9256 access/transam/xlog.c:9305 -#: access/transam/xlog.c:9328 +#: access/transam/twophase.c:2502 #, c-format -msgid "unexpected timeline ID %u (should be %u) in checkpoint record" -msgstr "ID de linha do tempo %u inesperado (deve ser %u) no registro do ponto de controle" +msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." +msgstr "O arquivo de estado de duas-fases foi encontrado no registro do WAL %X/%X, mas essa transação já foi restaurada do disco." -#: access/transam/xlog.c:9563 +#: access/transam/twophase.c:2510 jit/jit.c:205 utils/fmgr/dfmgr.c:209 +#: utils/fmgr/dfmgr.c:415 #, c-format -msgid "could not fsync log segment %s: %m" -msgstr "não pôde executar fsync no arquivo de log %s: %m" +msgid "could not access file \"%s\": %m" +msgstr "não foi possível acessar o arquivo \"%s\": %m" -#: access/transam/xlog.c:9587 +#: access/transam/varsup.c:129 #, c-format -msgid "could not fsync log file %s: %m" -msgstr "não pôde executar fsync no arquivo de log %s: %m" +msgid "database is not accepting commands to avoid wraparound data loss in database \"%s\"" +msgstr "banco de dados não está aceitando comandos para evitar perda de dados por reutilização de identificadores de transação (wraparound) no banco de dados \"%s\"" -#: access/transam/xlog.c:9595 +#: access/transam/varsup.c:131 access/transam/varsup.c:138 #, c-format -msgid "could not fsync write-through log file %s: %m" -msgstr "não pôde executar fsync write-through no arquivo de log %s: %m" +msgid "" +"Stop the postmaster and vacuum that database in single-user mode.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"Pare o postmaster e limpe esse banco de dados no modo de usuário único.\n" +"Talvez você também precise efetivar ou desfazer as transações preparadas antigas, ou descartar os encaixes de replicação obsoletos." -#: access/transam/xlog.c:9604 +#: access/transam/varsup.c:136 #, c-format -msgid "could not fdatasync log file %s: %m" -msgstr "não pôde executar fdatasync no arquivo de log %s: %m" +msgid "database is not accepting commands to avoid wraparound data loss in database with OID %u" +msgstr "banco de dados não está aceitando comandos para evitar perda de dados por reutilização de identificadores de transação (wraparound) no banco de dados com OID %u" -#: access/transam/xlog.c:9682 access/transam/xlog.c:10018 -#: access/transam/xlogfuncs.c:111 access/transam/xlogfuncs.c:140 -#: access/transam/xlogfuncs.c:179 access/transam/xlogfuncs.c:200 -#: access/transam/xlogfuncs.c:270 access/transam/xlogfuncs.c:326 +#: access/transam/varsup.c:148 access/transam/varsup.c:463 #, c-format -msgid "recovery is in progress" -msgstr "recuperação está em andamento" +msgid "database \"%s\" must be vacuumed within %u transactions" +msgstr "o banco de dados \"%s\" deve ser limpo em %u transações" -#: access/transam/xlog.c:9683 access/transam/xlog.c:10019 -#: access/transam/xlogfuncs.c:112 access/transam/xlogfuncs.c:141 -#: access/transam/xlogfuncs.c:180 access/transam/xlogfuncs.c:201 +#: access/transam/varsup.c:155 access/transam/varsup.c:470 #, c-format -msgid "WAL control functions cannot be executed during recovery." -msgstr "funções de controle do WAL não podem ser executadas durante recuperação." +msgid "database with OID %u must be vacuumed within %u transactions" +msgstr "o banco de dados com OID %u deve ser limpo em %u transações" -#: access/transam/xlog.c:9692 access/transam/xlog.c:10028 +#: access/transam/xact.c:1102 #, c-format -msgid "WAL level not sufficient for making an online backup" -msgstr "nível do WAL não é suficiente para fazer uma cópia de segurança online" +msgid "cannot have more than 2^32-2 commands in a transaction" +msgstr "não pode haver mais do que 2^32-2 comandos em uma transação" -#: access/transam/xlog.c:9693 access/transam/xlog.c:10029 -#: access/transam/xlogfuncs.c:147 +#: access/transam/xact.c:1643 #, c-format -msgid "wal_level must be set to \"archive\", \"hot_standby\", or \"logical\" at server start." -msgstr "wal_level deve ser definido como \"archive\", \"hot_standby\" ou \"logical\" ao iniciar o servidor." +msgid "maximum number of committed subtransactions (%d) exceeded" +msgstr "número máximo de subtransações efetivadas (%d) foi alcançado" -#: access/transam/xlog.c:9698 +#: access/transam/xact.c:2513 #, c-format -msgid "backup label too long (max %d bytes)" -msgstr "rótulo de cópia de segurança é muito longo (máximo de %d bytes)" +msgid "cannot PREPARE a transaction that has operated on temporary objects" +msgstr "não é possível usar o PREPARE em uma transação que operou em objetos temporários" -#: access/transam/xlog.c:9729 access/transam/xlog.c:9906 +#: access/transam/xact.c:2523 #, c-format -msgid "a backup is already in progress" -msgstr "uma cópia de segurança está em andamento" +msgid "cannot PREPARE a transaction that has exported snapshots" +msgstr "não é possível executar PREPARE em uma transação que tem instantâneos exportados" -#: access/transam/xlog.c:9730 +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3490 #, c-format -msgid "Run pg_stop_backup() and try again." -msgstr "Execute pg_stop_backup() e tente novamente." +msgid "%s cannot run inside a transaction block" +msgstr "%s não pode ser executado dentro de um bloco de transação" -#: access/transam/xlog.c:9824 +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3500 #, c-format -msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "WAL gerado com full_page_writes=off foi restaurado desde o último ponto de reinício" +msgid "%s cannot run inside a subtransaction" +msgstr "%s não pode executar dentro de uma subtransação" -#: access/transam/xlog.c:9826 access/transam/xlog.c:10179 +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3510 #, c-format -msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the master, and then try an online backup again." -msgstr "Isto significa que a cópia de segurança feita no servidor em espera está corrompida e não deve ser utilizada. Habilite full_page_writes e execute CHECKPOINT no servidor principal, e depois tente fazer uma cópia de segurança novamente." +msgid "%s cannot be executed within a pipeline" +msgstr "%s não pode ser executado dentro de um pipeline" -#: access/transam/xlog.c:9900 access/transam/xlog.c:10069 -#: access/transam/xlogarchive.c:106 access/transam/xlogarchive.c:265 -#: guc-file.l:884 replication/basebackup.c:464 replication/basebackup.c:521 -#: replication/logical/snapbuild.c:1478 storage/file/copydir.c:72 -#: storage/file/copydir.c:115 utils/adt/dbsize.c:68 utils/adt/dbsize.c:218 -#: utils/adt/dbsize.c:298 utils/adt/genfile.c:108 utils/adt/genfile.c:280 +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3520 #, c-format -msgid "could not stat file \"%s\": %m" -msgstr "não pôde executar stat no arquivo \"%s\": %m" +msgid "%s cannot be executed from a function" +msgstr "%s não pode ser executado a partir de uma função" -#: access/transam/xlog.c:9907 +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3591 access/transam/xact.c:3916 +#: access/transam/xact.c:3995 access/transam/xact.c:4118 +#: access/transam/xact.c:4269 access/transam/xact.c:4338 +#: access/transam/xact.c:4449 #, c-format -msgid "If you're sure there is no backup in progress, remove file \"%s\" and try again." -msgstr "Se você tem certeza que não há cópia de segurança em andamento, remova o arquivo \"%s\" e tente novamente." +msgid "%s can only be used in transaction blocks" +msgstr "%s só pode ser utilizado em blocos de transação" -#: access/transam/xlog.c:9924 access/transam/xlog.c:10242 +#: access/transam/xact.c:3802 #, c-format -msgid "could not write file \"%s\": %m" -msgstr "não pôde escrever no arquivo \"%s\": %m" +msgid "there is already a transaction in progress" +msgstr "há uma transação em execução" -#: access/transam/xlog.c:10073 +#: access/transam/xact.c:3921 access/transam/xact.c:4000 +#: access/transam/xact.c:4123 #, c-format -msgid "a backup is not in progress" -msgstr "não há uma cópia de segurança em andamento" +msgid "there is no transaction in progress" +msgstr "não há uma transação em execução" -#: access/transam/xlog.c:10112 access/transam/xlog.c:10125 -#: access/transam/xlog.c:10476 access/transam/xlog.c:10482 -#: access/transam/xlogfuncs.c:498 +#: access/transam/xact.c:4011 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "dado é inválido no arquivo \"%s\"" +msgid "cannot commit during a parallel operation" +msgstr "não é possível efetivar durante uma operação paralela" -#: access/transam/xlog.c:10129 replication/basebackup.c:951 +#: access/transam/xact.c:4134 #, c-format -msgid "the standby was promoted during online backup" -msgstr "o servidor em espera foi promovido durante a cópia de segurança online" +msgid "cannot abort during a parallel operation" +msgstr "não é possível interromper durante uma operação paralela" -#: access/transam/xlog.c:10130 replication/basebackup.c:952 +#: access/transam/xact.c:4233 #, c-format -msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." -msgstr "Isto significa que a cópia de segurança feita está corrompida e não deve ser utilizada. Tente fazer outra cópia de segurança online." +msgid "cannot define savepoints during a parallel operation" +msgstr "não é possível definir pontos de salvamento durante uma operação paralela" -#: access/transam/xlog.c:10177 +#: access/transam/xact.c:4320 #, c-format -msgid "WAL generated with full_page_writes=off was replayed during online backup" -msgstr "WAL gerado com full_page_writes=off foi restaurado durante a cópia de segurança online" +msgid "cannot release savepoints during a parallel operation" +msgstr "não é possível liberar pontos de salvamento durante uma operação paralela" -#: access/transam/xlog.c:10291 +#: access/transam/xact.c:4330 access/transam/xact.c:4381 +#: access/transam/xact.c:4441 access/transam/xact.c:4490 #, c-format -msgid "pg_stop_backup cleanup done, waiting for required WAL segments to be archived" -msgstr "pg_stop_backup concluído, esperando os segmentos do WAL requeridos serem arquivados" +msgid "savepoint \"%s\" does not exist" +msgstr "o ponto de salvamento \"%s\" não existe" -#: access/transam/xlog.c:10301 +#: access/transam/xact.c:4387 access/transam/xact.c:4496 #, c-format -msgid "pg_stop_backup still waiting for all required WAL segments to be archived (%d seconds elapsed)" -msgstr "pg_stop_backup ainda está esperando o arquivamento de todos os segmentos do WAL necessários (%d segundos passados)" +msgid "savepoint \"%s\" does not exist within current savepoint level" +msgstr "o ponto de salvamento \"%s\" não existe no nível corrente de ponto de salvamento" -#: access/transam/xlog.c:10303 +#: access/transam/xact.c:4429 #, c-format -msgid "Check that your archive_command is executing properly. pg_stop_backup can be canceled safely, but the database backup will not be usable without all the WAL segments." -msgstr "Verifique se o archive_command está sendo executado normalmente. pg_stop_backup pode ser cancelado com segurança, mas a cópia de segurança do banco de dados não será útil sem todos os segmentos do WAL." +msgid "cannot rollback to savepoints during a parallel operation" +msgstr "não é possível desfazer até pontos de salvamento durante uma operação paralela" -#: access/transam/xlog.c:10310 +#: access/transam/xact.c:4557 #, c-format -msgid "pg_stop_backup complete, all required WAL segments have been archived" -msgstr "pg_stop_backup concluído, todos os segmentos do WAL foram arquivados" +msgid "cannot start subtransactions during a parallel operation" +msgstr "não é possível iniciar subtransações durante uma operação paralela" -#: access/transam/xlog.c:10314 +#: access/transam/xact.c:4625 #, c-format -msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" -msgstr "arquivamento do WAL não está habilitado; você deve garantir que todos os segmentos do WAL necessários foram copiados por outros meios para completar a cópia de segurança" +msgid "cannot commit subtransactions during a parallel operation" +msgstr "não é possível efetivar subtransações durante uma operação paralela" -#: access/transam/xlog.c:10527 +#: access/transam/xact.c:5271 #, c-format -msgid "xlog redo %s" -msgstr "redo do xlog %s" +msgid "cannot have more than 2^32-1 subtransactions in a transaction" +msgstr "não é possível ter mais do que 2^32-1 subtransações em uma transação" -#: access/transam/xlog.c:10567 +#: access/transam/xlog.c:1468 #, c-format -msgid "online backup mode canceled" -msgstr "modo de cópia de segurança online foi cancelado" +msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" +msgstr "requisitado descarregar além do final do WAL gerado; requisitado %X/%X, posição atual %X/%X" -#: access/transam/xlog.c:10568 +#: access/transam/xlog.c:2230 #, c-format -msgid "\"%s\" was renamed to \"%s\"." -msgstr "\"%s\" foi renomeado para \"%s\"." +msgid "could not write to log file %s at offset %u, length %zu: %m" +msgstr "não foi possível escrever no arquivo de log %s na posição %u, tamanho %zu: %m" -#: access/transam/xlog.c:10575 +#: access/transam/xlog.c:3457 access/transam/xlogutils.c:833 +#: replication/walsender.c:2725 #, c-format -msgid "online backup mode was not canceled" -msgstr "modo de cópia de segurança online não foi cancelado" +msgid "requested WAL segment %s has already been removed" +msgstr "segmento do WAL solicitado %s já foi removido" -#: access/transam/xlog.c:10576 +#: access/transam/xlog.c:3741 #, c-format -msgid "Could not rename \"%s\" to \"%s\": %m." -msgstr "não pôde renomear \"%s\" para \"%s\": %m" +msgid "could not rename file \"%s\": %m" +msgstr "não foi possível renomear o arquivo \"%s\": %m" -#: access/transam/xlog.c:10696 replication/logical/logicalfuncs.c:169 -#: replication/walreceiver.c:937 replication/walsender.c:2106 +#: access/transam/xlog.c:3783 access/transam/xlog.c:3793 #, c-format -msgid "could not seek in log segment %s to offset %u: %m" -msgstr "não pôde posicionar no arquivo de log %s na posição %u: %m" +msgid "required WAL directory \"%s\" does not exist" +msgstr "diretório WAL requerido \"%s\" não existe" -#: access/transam/xlog.c:10708 +#: access/transam/xlog.c:3799 #, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "não pôde ler do arquivo de log %s, posição %u: %m" +msgid "creating missing WAL directory \"%s\"" +msgstr "criando diretório WAL ausente \"%s\"" -#: access/transam/xlog.c:11171 +#: access/transam/xlog.c:3802 commands/dbcommands.c:3172 #, c-format -msgid "received promote request" -msgstr "pedido de promoção foi recebido" +msgid "could not create missing directory \"%s\": %m" +msgstr "não foi possível criar o diretório \"%s\": %m" -#: access/transam/xlog.c:11184 +#: access/transam/xlog.c:3869 #, c-format -msgid "trigger file found: %s" -msgstr "arquivo de gatilho encontrado: %s" +msgid "could not generate secret authorization token" +msgstr "não foi possível gerar token de autorização secreto" -#: access/transam/xlog.c:11193 +#: access/transam/xlog.c:4019 access/transam/xlog.c:4028 +#: access/transam/xlog.c:4052 access/transam/xlog.c:4059 +#: access/transam/xlog.c:4066 access/transam/xlog.c:4071 +#: access/transam/xlog.c:4078 access/transam/xlog.c:4085 +#: access/transam/xlog.c:4092 access/transam/xlog.c:4099 +#: access/transam/xlog.c:4106 access/transam/xlog.c:4113 +#: access/transam/xlog.c:4122 access/transam/xlog.c:4129 +#: utils/init/miscinit.c:1769 #, c-format -msgid "could not stat trigger file \"%s\": %m" -msgstr "não pôde executar stat no arquivo de gatilho \"%s\": %m" +msgid "database files are incompatible with server" +msgstr "arquivos do banco de dados são incompatíveis com o servidor" -#: access/transam/xlogarchive.c:244 +#: access/transam/xlog.c:4020 #, c-format -msgid "archive file \"%s\" has wrong size: %lu instead of %lu" -msgstr "arquivo do arquivador \"%s\" tem tamanho incorreto: %lu ao invés de %lu" +msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." +msgstr "O agrupamento de banco de dados foi inicializado com PG_CONTROL_VERSION %d (0x%08x), mas o servidor foi compilado com PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlogarchive.c:253 +#: access/transam/xlog.c:4024 #, c-format -msgid "restored log file \"%s\" from archive" -msgstr "arquivo de log restaurado \"%s\" do arquivador" +msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." +msgstr "Isto pode ser um problema com ordenação dos bits. Parece que você precisa executar o initdb." -#: access/transam/xlogarchive.c:303 +#: access/transam/xlog.c:4029 #, c-format -msgid "could not restore file \"%s\" from archive: %s" -msgstr "não pôde restaurar arquivo \"%s\" do arquivador: %s" +msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." +msgstr "O agrupamento de banco de dados foi inicializado com PG_CONTROL_VERSION %d, mas o servidor foi compilado com PG_CONTROL_VERSION %d." -#. translator: First %s represents a recovery.conf parameter name like -#. "recovery_end_command", the 2nd is the value of that parameter, the -#. third an already translated error message. -#: access/transam/xlogarchive.c:415 +#: access/transam/xlog.c:4032 access/transam/xlog.c:4056 +#: access/transam/xlog.c:4063 access/transam/xlog.c:4068 #, c-format -msgid "%s \"%s\": %s" -msgstr "%s \"%s\": %s" +msgid "It looks like you need to initdb." +msgstr "Parece que você precisa executar o initdb." -#: access/transam/xlogarchive.c:525 access/transam/xlogarchive.c:594 +#: access/transam/xlog.c:4043 #, c-format -msgid "could not create archive status file \"%s\": %m" -msgstr "não pôde criar arquivo de status do arquivador \"%s\": %m" +msgid "incorrect checksum in control file" +msgstr "a soma de verificação não está correta no arquivo de controle" -#: access/transam/xlogarchive.c:533 access/transam/xlogarchive.c:602 +#: access/transam/xlog.c:4053 #, c-format -msgid "could not write archive status file \"%s\": %m" -msgstr "não pôde escrever no arquivo de status do arquivador \"%s\": %m" +msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." +msgstr "O agrupamento de banco de dados foi inicializado com CATALOG_VERSION_NO %d, mas o servidor foi compilado com CATALOG_VERSION_NO %d." -#: access/transam/xlogfuncs.c:60 access/transam/xlogfuncs.c:88 +#: access/transam/xlog.c:4060 #, c-format -msgid "must be superuser or replication role to run a backup" -msgstr "deve ser super-usuário ou role de replicação para fazer uma cópia de segurança" +msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." +msgstr "O agrupamento de banco de dados foi inicializado com MAXALIGN %d, mas o servidor foi compilado com MAXALIGN %d." -#: access/transam/xlogfuncs.c:106 +#: access/transam/xlog.c:4067 #, c-format -msgid "must be superuser to switch transaction log files" -msgstr "deve ser super-usuário para rotacionar arquivos do log de transação" +msgid "The database cluster appears to use a different floating-point number format than the server executable." +msgstr "O agrupamento de banco de dados parece utilizar um formato de número de ponto flutuante diferente do executável do servidor." -#: access/transam/xlogfuncs.c:135 +#: access/transam/xlog.c:4072 #, c-format -msgid "must be superuser to create a restore point" -msgstr "deve ser super-usuário para criar um ponto de restauração" +msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." +msgstr "O agrupamento de banco de dados foi inicializado com BLCSZ %d, mas o servidor foi compilado com BLCSZ %d." -#: access/transam/xlogfuncs.c:146 +#: access/transam/xlog.c:4075 access/transam/xlog.c:4082 +#: access/transam/xlog.c:4089 access/transam/xlog.c:4096 +#: access/transam/xlog.c:4103 access/transam/xlog.c:4110 +#: access/transam/xlog.c:4117 access/transam/xlog.c:4125 +#: access/transam/xlog.c:4132 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "nível do WAL não é suficiente para criar um ponto de restauração" +msgid "It looks like you need to recompile or initdb." +msgstr "Parece que você precisa recompilar ou executar o initdb." -#: access/transam/xlogfuncs.c:154 +#: access/transam/xlog.c:4079 #, c-format -msgid "value too long for restore point (maximum %d characters)" -msgstr "valor é muito longo para ponto de restauração (máximo de %d caracteres)" +msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." +msgstr "O agrupamento de banco de dados foi inicializado com RELSEG_SIZE %d, mas o servidor foi compilado com RELSEG_SIZE %d." -#: access/transam/xlogfuncs.c:271 +#: access/transam/xlog.c:4086 #, c-format -msgid "pg_xlogfile_name_offset() cannot be executed during recovery." -msgstr "pg_xlogfile_name_offset() não pode ser executado durante recuperação." +msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." +msgstr "O agrupamento de banco de dados foi inicializado com XLOG_BLCSZ %d, mas o servidor foi compilado com XLOG_BLCSZ %d." -#: access/transam/xlogfuncs.c:327 +#: access/transam/xlog.c:4093 #, c-format -msgid "pg_xlogfile_name() cannot be executed during recovery." -msgstr "pg_xlogfile_name() não pode ser executado durante recuperação." +msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." +msgstr "O agrupamento de banco de dados foi inicializado com NAMEDATALEN %d, mas o servidor foi compilado com NAMEDATALEN %d." -#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:366 +#: access/transam/xlog.c:4100 #, c-format -msgid "must be superuser to control recovery" -msgstr "deve ser super-usuário para controlar recuperação" +msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." +msgstr "O agrupamento de banco de dados foi inicializado com INDEX_MAX_KEYS %d, mas o servidor foi compilado com INDEX_MAX_KEYS %d." -#: access/transam/xlogfuncs.c:349 access/transam/xlogfuncs.c:371 -#: access/transam/xlogfuncs.c:388 +#: access/transam/xlog.c:4107 #, c-format -msgid "recovery is not in progress" -msgstr "recuperação não está em andamento" +msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." +msgstr "O agrupamento de banco de dados foi inicializado com TOAST_MAX_CHUNK_SIZE %d, mas o servidor foi compilado com TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlogfuncs.c:350 access/transam/xlogfuncs.c:372 -#: access/transam/xlogfuncs.c:389 +#: access/transam/xlog.c:4114 #, c-format -msgid "Recovery control functions can only be executed during recovery." -msgstr "Funções de controle de recuperação só podem ser executadas durante recuperação." +msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." +msgstr "O agrupamento de banco de dados foi inicializado com LOBLKSIZE %d, mas o servidor foi compilado com LOBLKSIZE %d." -#: bootstrap/bootstrap.c:273 postmaster/postmaster.c:759 tcop/postgres.c:3462 +#: access/transam/xlog.c:4123 #, c-format -msgid "--%s requires a value" -msgstr "--%s requer um valor" +msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." +msgstr "O agrupamento de banco de dados foi inicializado sem USE_FLOAT8_BYVAL, mas o servidor foi compilado com USE_FLOAT8_BYVAL." -#: bootstrap/bootstrap.c:278 postmaster/postmaster.c:764 tcop/postgres.c:3467 +#: access/transam/xlog.c:4130 #, c-format -msgid "-c %s requires a value" -msgstr "-c %s requer um valor" +msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." +msgstr "O agrupamento de banco de dados foi inicializado com USE_FLOAT8_BYVAL, mas o servidor foi compilado sem USE_FLOAT8_BYVAL." -#: bootstrap/bootstrap.c:289 postmaster/postmaster.c:776 -#: postmaster/postmaster.c:789 +#: access/transam/xlog.c:4139 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Tente \"%s --help\" para obter informações adicionais.\n" +msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" +msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" +msgstr[0] "O tamanho do segmento WAL deve ser uma potência de dois entre 1 MB e 1 GB, mas o arquivo de controle especifica %d byte" +msgstr[1] "O tamanho do segmento WAL deve ser uma potência de dois entre 1 MB e 1 GB, mas o arquivo de controle especifica %d bytes" -#: bootstrap/bootstrap.c:298 +#: access/transam/xlog.c:4151 #, c-format -msgid "%s: invalid command-line arguments\n" -msgstr "%s: argumentos de linha de comando são inválidos\n" +msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" +msgstr "\"min_wal_size\" deve ser pelo menos duas vezes \"wal_segment_size\"" -#: catalog/aclchk.c:206 +#: access/transam/xlog.c:4155 #, c-format -msgid "grant options can only be granted to roles" -msgstr "opções de concessão só podem ser concedidas a roles" +msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" +msgstr "\"max_wal_size\" deve ser pelo menos duas vezes \"wal_segment_size\"" -#: catalog/aclchk.c:329 +#: access/transam/xlog.c:4310 catalog/namespace.c:4335 +#: commands/tablespace.c:1216 commands/user.c:2536 commands/variable.c:72 +#: utils/error/elog.c:2205 #, c-format -msgid "no privileges were granted for column \"%s\" of relation \"%s\"" -msgstr "nenhum privilégio foi concedido a coluna \"%s\" da relação \"%s\"" +msgid "List syntax is invalid." +msgstr "Sintaxe de lista é inválida." -#: catalog/aclchk.c:334 +#: access/transam/xlog.c:4356 commands/user.c:2552 commands/variable.c:173 +#: utils/error/elog.c:2231 #, c-format -msgid "no privileges were granted for \"%s\"" -msgstr "nenhum privilégio foi concedido a \"%s\"" +msgid "Unrecognized key word: \"%s\"." +msgstr "Palavra chave desconhecida: \"%s\"." -#: catalog/aclchk.c:342 +#: access/transam/xlog.c:4770 #, c-format -msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" -msgstr "nem todos privilégios foram concedidos a coluna \"%s\" da relação \"%s\"" +msgid "could not write bootstrap write-ahead log file: %m" +msgstr "não foi possível escrever no arquivo de WAL de inicialização: %m" -#: catalog/aclchk.c:347 +#: access/transam/xlog.c:4778 #, c-format -msgid "not all privileges were granted for \"%s\"" -msgstr "nem todos privilégios foram concedidos a \"%s\"" +msgid "could not fsync bootstrap write-ahead log file: %m" +msgstr "não foi possível executar o fsync no arquivo de WAL de inicialização: %m" -#: catalog/aclchk.c:358 +#: access/transam/xlog.c:4784 #, c-format -msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" -msgstr "nenhum privilégio pôde ser revogado da coluna \"%s\" da relação \"%s\"" +msgid "could not close bootstrap write-ahead log file: %m" +msgstr "não foi possível fechar o arquivo de WAL de inicialização: %m" -#: catalog/aclchk.c:363 +#: access/transam/xlog.c:5001 #, c-format -msgid "no privileges could be revoked for \"%s\"" -msgstr "nenhum privilégio pôde ser revogado de \"%s\"" +msgid "WAL was generated with wal_level=minimal, cannot continue recovering" +msgstr "WAL foi gerado com wal_level=minimal, não é possível continuar a recuperação" -#: catalog/aclchk.c:371 +#: access/transam/xlog.c:5002 #, c-format -msgid "not all privileges could be revoked for column \"%s\" of relation \"%s\"" -msgstr "nem todos privilégios podem ser revogados da coluna \"%s\" da relação \"%s\"" +msgid "This happens if you temporarily set wal_level=minimal on the server." +msgstr "Isso acontece se for definido temporariamente wal_level=minimal no servidor." -#: catalog/aclchk.c:376 +#: access/transam/xlog.c:5003 #, c-format -msgid "not all privileges could be revoked for \"%s\"" -msgstr "nem todos privilégios podem ser revogados de \"%s\"" +msgid "Use a backup taken after setting wal_level to higher than minimal." +msgstr "Use uma cópia de segurança feita após definir wal_level como maior que o mínimo." -#: catalog/aclchk.c:455 catalog/aclchk.c:933 +#: access/transam/xlog.c:5067 #, c-format -msgid "invalid privilege type %s for relation" -msgstr "tipo de privilégio %s é inválido para relação" +msgid "control file contains invalid checkpoint location" +msgstr "o arquivo de controle contém localização de ponto de verificação inválida" -#: catalog/aclchk.c:459 catalog/aclchk.c:937 +#: access/transam/xlog.c:5078 #, c-format -msgid "invalid privilege type %s for sequence" -msgstr "tipo de privilégio %s é inválido para sequência" +msgid "database system was shut down at %s" +msgstr "sistema de banco de dados foi desligado em %s" -#: catalog/aclchk.c:463 +#: access/transam/xlog.c:5084 #, c-format -msgid "invalid privilege type %s for database" -msgstr "tipo de privilégio %s é inválido para banco de dados" +msgid "database system was shut down in recovery at %s" +msgstr "sistema de banco de dados foi desligado durante recuperação em %s" -#: catalog/aclchk.c:467 +#: access/transam/xlog.c:5090 #, c-format -msgid "invalid privilege type %s for domain" -msgstr "tipo de privilégio %s é inválido para domínio" +msgid "database system shutdown was interrupted; last known up at %s" +msgstr "desligamento do sistema de banco de dados foi interrompido; última execução em %s" -#: catalog/aclchk.c:471 catalog/aclchk.c:941 +#: access/transam/xlog.c:5096 #, c-format -msgid "invalid privilege type %s for function" -msgstr "tipo de privilégio %s é inválido para função" +msgid "database system was interrupted while in recovery at %s" +msgstr "sistema de banco de dados foi interrompido enquanto estava sendo recuperado em %s" -#: catalog/aclchk.c:475 +#: access/transam/xlog.c:5098 #, c-format -msgid "invalid privilege type %s for language" -msgstr "tipo de privilégio %s é inválido para linguagem" +msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." +msgstr "Isso provavelmente significa que algum dado foi corrompido e você terá que utilizar a última cópia de segurança para recuperação." -#: catalog/aclchk.c:479 +#: access/transam/xlog.c:5104 #, c-format -msgid "invalid privilege type %s for large object" -msgstr "tipo de privilégio %s é inválido para objeto grande" +msgid "database system was interrupted while in recovery at log time %s" +msgstr "sistema de banco de dados foi interrompido enquanto estava sendo recuperado em %s" -#: catalog/aclchk.c:483 +#: access/transam/xlog.c:5106 #, c-format -msgid "invalid privilege type %s for schema" -msgstr "tipo de privilégio %s é inválido para esquema" +msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." +msgstr "Se isto ocorreu mais de uma vez algum dado pode ter sido corrompido e você pode precisar escolher um ponto de recuperação anterior ao especificado." -#: catalog/aclchk.c:487 +#: access/transam/xlog.c:5112 #, c-format -msgid "invalid privilege type %s for tablespace" -msgstr "tipo de privilégio %s é inválido para tablespace" +msgid "database system was interrupted; last known up at %s" +msgstr "sistema de banco de dados foi interrompido; última execução em %s" -#: catalog/aclchk.c:491 catalog/aclchk.c:945 +#: access/transam/xlog.c:5118 #, c-format -msgid "invalid privilege type %s for type" -msgstr "tipo de privilégio %s é inválido para tipo" +msgid "control file contains invalid database cluster state" +msgstr "o arquivo de controle contém um estado de agrupamento de bancos de dados inválido" -#: catalog/aclchk.c:495 +#: access/transam/xlog.c:5502 #, c-format -msgid "invalid privilege type %s for foreign-data wrapper" -msgstr "tipo de privilégio %s é inválido para adaptador de dados externos" +msgid "WAL ends before end of online backup" +msgstr "WAL terminou antes do fim da cópia de segurança online" -#: catalog/aclchk.c:499 +#: access/transam/xlog.c:5503 #, c-format -msgid "invalid privilege type %s for foreign server" -msgstr "tipo de privilégio %s é inválido para servidor externo" +msgid "All WAL generated while online backup was taken must be available at recovery." +msgstr "Todo WAL gerado enquanto a cópia de segurança online era feita deve estar disponível para recuperação." -#: catalog/aclchk.c:538 +#: access/transam/xlog.c:5506 #, c-format -msgid "column privileges are only valid for relations" -msgstr "privilégios de coluna só são válidos para relações" +msgid "WAL ends before consistent recovery point" +msgstr "Log de transação termina antes de ponto de recuperação consistente" -#: catalog/aclchk.c:688 catalog/aclchk.c:3904 catalog/aclchk.c:4681 -#: catalog/objectaddress.c:586 catalog/pg_largeobject.c:113 -#: storage/large_object/inv_api.c:291 +#: access/transam/xlog.c:5552 #, c-format -msgid "large object %u does not exist" -msgstr "objeto grande %u não existe" +msgid "selected new timeline ID: %u" +msgstr "novo ID de linha do tempo selecionado: %u" -#: catalog/aclchk.c:875 catalog/aclchk.c:883 commands/collationcmds.c:91 -#: commands/copy.c:925 commands/copy.c:943 commands/copy.c:951 -#: commands/copy.c:959 commands/copy.c:967 commands/copy.c:975 -#: commands/copy.c:983 commands/copy.c:991 commands/copy.c:999 -#: commands/copy.c:1015 commands/copy.c:1029 commands/copy.c:1048 -#: commands/copy.c:1063 commands/dbcommands.c:148 commands/dbcommands.c:156 -#: commands/dbcommands.c:164 commands/dbcommands.c:172 -#: commands/dbcommands.c:180 commands/dbcommands.c:188 -#: commands/dbcommands.c:196 commands/dbcommands.c:1372 -#: commands/dbcommands.c:1380 commands/extension.c:1246 -#: commands/extension.c:1254 commands/extension.c:1262 -#: commands/extension.c:2670 commands/foreigncmds.c:486 -#: commands/foreigncmds.c:495 commands/functioncmds.c:522 -#: commands/functioncmds.c:614 commands/functioncmds.c:622 -#: commands/functioncmds.c:630 commands/functioncmds.c:1700 -#: commands/functioncmds.c:1708 commands/sequence.c:1146 -#: commands/sequence.c:1154 commands/sequence.c:1162 commands/sequence.c:1170 -#: commands/sequence.c:1178 commands/sequence.c:1186 commands/sequence.c:1194 -#: commands/sequence.c:1202 commands/typecmds.c:297 commands/typecmds.c:1332 -#: commands/typecmds.c:1341 commands/typecmds.c:1349 commands/typecmds.c:1357 -#: commands/typecmds.c:1365 commands/user.c:135 commands/user.c:152 -#: commands/user.c:160 commands/user.c:168 commands/user.c:176 -#: commands/user.c:184 commands/user.c:192 commands/user.c:200 -#: commands/user.c:208 commands/user.c:216 commands/user.c:224 -#: commands/user.c:232 commands/user.c:496 commands/user.c:508 -#: commands/user.c:516 commands/user.c:524 commands/user.c:532 -#: commands/user.c:540 commands/user.c:548 commands/user.c:556 -#: commands/user.c:565 commands/user.c:573 +#: access/transam/xlog.c:5585 #, c-format -msgid "conflicting or redundant options" -msgstr "opções conflitantes ou redundantes" +msgid "archive recovery complete" +msgstr "recuperação do archive está completa" -#: catalog/aclchk.c:978 +#: access/transam/xlog.c:6191 #, c-format -msgid "default privileges cannot be set for columns" -msgstr "privilégios padrão não podem ser definidos para colunas" +msgid "shutting down" +msgstr "desligando" -#: catalog/aclchk.c:1492 catalog/objectaddress.c:1042 commands/analyze.c:390 -#: commands/copy.c:4247 commands/sequence.c:1448 commands/tablecmds.c:4939 -#: commands/tablecmds.c:5034 commands/tablecmds.c:5084 -#: commands/tablecmds.c:5188 commands/tablecmds.c:5235 -#: commands/tablecmds.c:5319 commands/tablecmds.c:5407 -#: commands/tablecmds.c:7494 commands/tablecmds.c:7698 -#: commands/tablecmds.c:8090 commands/trigger.c:635 parser/analyze.c:1994 -#: parser/parse_relation.c:2358 parser/parse_relation.c:2420 -#: parser/parse_target.c:920 parser/parse_type.c:128 utils/adt/acl.c:2840 -#: utils/adt/ruleutils.c:1820 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6230 #, c-format -msgid "column \"%s\" of relation \"%s\" does not exist" -msgstr "coluna \"%s\" da relação \"%s\" não existe" +msgid "restartpoint starting:%s%s%s%s%s%s%s%s" +msgstr "" -#: catalog/aclchk.c:1757 catalog/objectaddress.c:862 commands/sequence.c:1035 -#: commands/tablecmds.c:214 commands/tablecmds.c:11244 utils/adt/acl.c:2076 -#: utils/adt/acl.c:2106 utils/adt/acl.c:2138 utils/adt/acl.c:2170 -#: utils/adt/acl.c:2198 utils/adt/acl.c:2228 +#. translator: the placeholders show checkpoint options +#: access/transam/xlog.c:6242 #, c-format -msgid "\"%s\" is not a sequence" -msgstr "\"%s\" não é uma sequência" +msgid "checkpoint starting:%s%s%s%s%s%s%s%s" +msgstr "" -#: catalog/aclchk.c:1795 +#: access/transam/xlog.c:6307 #, c-format -msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" -msgstr "sequência \"%s\" só suporta privilégios USAGE, SELECT e UPDATE" +msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" +msgstr "" -#: catalog/aclchk.c:1812 +#: access/transam/xlog.c:6330 #, c-format -msgid "invalid privilege type USAGE for table" -msgstr "tipo de privilégio USAGE é inválido para tabela" +msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" +msgstr "" -#: catalog/aclchk.c:1977 +#: access/transam/xlog.c:6768 #, c-format -msgid "invalid privilege type %s for column" -msgstr "tipo de privilégio %s é inválido para coluna" +msgid "concurrent write-ahead log activity while database system is shutting down" +msgstr "atividade de WAL simultânea enquanto o sistema de banco de dados está sendo desligado" -#: catalog/aclchk.c:1990 +#: access/transam/xlog.c:7329 #, c-format -msgid "sequence \"%s\" only supports SELECT column privileges" -msgstr "sequência \"%s\" só suporta privilégios SELECT" +msgid "recovery restart point at %X/%X" +msgstr "ponto de reinício de recuperação em %X/%X" -#: catalog/aclchk.c:2574 +#: access/transam/xlog.c:7331 #, c-format -msgid "language \"%s\" is not trusted" -msgstr "linguagem \"%s\" não é confiável" +msgid "Last completed transaction was at log time %s." +msgstr "A última transação completada ocorreu às %s (momento de registro)." -#: catalog/aclchk.c:2576 +#: access/transam/xlog.c:7579 #, c-format -msgid "Only superusers can use untrusted languages." -msgstr "Somente super-usuários podem utilizar linguagens não-confiáveis." +msgid "restore point \"%s\" created at %X/%X" +msgstr "ponto de restauração \"%s\" criado em %X/%X" -#: catalog/aclchk.c:3092 +#: access/transam/xlog.c:7786 #, c-format -msgid "cannot set privileges of array types" -msgstr "não pode definir privilégios de tipos array" +msgid "online backup was canceled, recovery cannot continue" +msgstr "cópia de segurança online foi cancelada, recuperação não pode continuar" -#: catalog/aclchk.c:3093 +#: access/transam/xlog.c:7843 #, c-format -msgid "Set the privileges of the element type instead." -msgstr "Defina os privilégios do tipo do elemento." +msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" +msgstr "ID da linha do tempo não esperado %u (devia ser %u) no registro do ponto de verificação de desligamento" -#: catalog/aclchk.c:3100 catalog/objectaddress.c:1094 commands/typecmds.c:3187 +#: access/transam/xlog.c:7901 #, c-format -msgid "\"%s\" is not a domain" -msgstr "\"%s\" não é um domínio" +msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" +msgstr "ID da linha do tempo não esperado %u (devia ser %u) no registro do ponto de verificação em-linha" -#: catalog/aclchk.c:3220 +#: access/transam/xlog.c:7930 #, c-format -msgid "unrecognized privilege type \"%s\"" -msgstr "tipo de privilégio \"%s\" desconhecido" +msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" +msgstr "ID da linha do tempo não esperado %u (devia ser %u) no registro de fim de recuperação" -#: catalog/aclchk.c:3269 +#: access/transam/xlog.c:8197 #, c-format -msgid "permission denied for column %s" -msgstr "permissão negada para coluna %s" +msgid "could not fsync write-through file \"%s\": %m" +msgstr "não foi possível sincronizar (fsync write-through) o arquivo \"%s\": %m" -#: catalog/aclchk.c:3271 +#: access/transam/xlog.c:8202 #, c-format -msgid "permission denied for relation %s" -msgstr "permissão negada para relação %s" +msgid "could not fdatasync file \"%s\": %m" +msgstr "não foi possível sincronizar (fdatasync) o arquivo \"%s\": %m" -#: catalog/aclchk.c:3273 commands/sequence.c:535 commands/sequence.c:748 -#: commands/sequence.c:790 commands/sequence.c:827 commands/sequence.c:1500 +#: access/transam/xlog.c:8287 access/transam/xlog.c:8610 #, c-format -msgid "permission denied for sequence %s" -msgstr "permissão negada para sequência %s" +msgid "WAL level not sufficient for making an online backup" +msgstr "nível do WAL não é suficiente para fazer uma cópia de segurança online" -#: catalog/aclchk.c:3275 +#: access/transam/xlog.c:8288 access/transam/xlog.c:8611 +#: access/transam/xlogfuncs.c:254 #, c-format -msgid "permission denied for database %s" -msgstr "permissão negada para banco de dados %s" +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "wal_level deve ser definido como \"replica\" ou \"logical\" na inicialização do servidor." -#: catalog/aclchk.c:3277 +#: access/transam/xlog.c:8293 #, c-format -msgid "permission denied for function %s" -msgstr "permissão negada para função %s" +msgid "backup label too long (max %d bytes)" +msgstr "rótulo de cópia de segurança é muito longo (máximo de %d bytes)" -#: catalog/aclchk.c:3279 +#: access/transam/xlog.c:8414 #, c-format -msgid "permission denied for operator %s" -msgstr "permissão negada para operador %s" +msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" +msgstr "WAL gerado com full_page_writes=off foi restaurado desde o último ponto de reinício" -#: catalog/aclchk.c:3281 +#: access/transam/xlog.c:8416 access/transam/xlog.c:8699 #, c-format -msgid "permission denied for type %s" -msgstr "permissão negada para tipo %s" +msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." +msgstr "Isso significa que a cópia de segurança feita no servidor em espera está corrompida não devendo ser usada. Ative full_page_writes e execute CHECKPOINT no servidor primário e tente a cópia de segurança online novamente." -#: catalog/aclchk.c:3283 +#: access/transam/xlog.c:8483 backup/basebackup.c:1351 utils/adt/misc.c:354 #, c-format -msgid "permission denied for language %s" -msgstr "permissão negada para linguagem %s" +msgid "could not read symbolic link \"%s\": %m" +msgstr "não foi possível ler link simbólico \"%s\": %m" -#: catalog/aclchk.c:3285 +#: access/transam/xlog.c:8490 backup/basebackup.c:1356 utils/adt/misc.c:359 #, c-format -msgid "permission denied for large object %s" -msgstr "permissão negada para objeto grande %s" +msgid "symbolic link \"%s\" target is too long" +msgstr "alvo do link simbólico \"%s\" é muito longo" -#: catalog/aclchk.c:3287 +#: access/transam/xlog.c:8649 backup/basebackup.c:1217 #, c-format -msgid "permission denied for schema %s" -msgstr "permissão negada para esquema %s" +msgid "the standby was promoted during online backup" +msgstr "o servidor em espera foi promovido durante a cópia de segurança online" -#: catalog/aclchk.c:3289 +#: access/transam/xlog.c:8650 backup/basebackup.c:1218 #, c-format -msgid "permission denied for operator class %s" -msgstr "permissão negada para classe de operadores %s" +msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." +msgstr "Isto significa que a cópia de segurança feita está corrompida, não devendo ser usada. Tente fazer outra cópia de segurança online." -#: catalog/aclchk.c:3291 +#: access/transam/xlog.c:8697 #, c-format -msgid "permission denied for operator family %s" -msgstr "permissão negada para família de operadores %s" +msgid "WAL generated with full_page_writes=off was replayed during online backup" +msgstr "WAL gerado com full_page_writes=off foi restaurado durante a cópia de segurança online" -#: catalog/aclchk.c:3293 +#: access/transam/xlog.c:8813 #, c-format -msgid "permission denied for collation %s" -msgstr "permissão negada para ordenação %s" +msgid "base backup done, waiting for required WAL segments to be archived" +msgstr "cópia de segurança base feita, aguardando o arquivamento dos segmentos do WAL necessários" -#: catalog/aclchk.c:3295 +#: access/transam/xlog.c:8827 #, c-format -msgid "permission denied for conversion %s" -msgstr "permissão negada para conversão %s" +msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" +msgstr "ainda aguardando o arquivamento de todos os segmentos do WAL necessários (%d segundos decorridos)" -#: catalog/aclchk.c:3297 +#: access/transam/xlog.c:8829 #, c-format -msgid "permission denied for tablespace %s" -msgstr "permissão negada para tablespace %s" +msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." +msgstr "Verifique se o archive_command está sendo executado corretamente. Você pode cancelar essa cópia de segurança com segurança, mas a cópia de segurança do banco de dados não poderá ser usada sem todos os segmentos do WAL." -#: catalog/aclchk.c:3299 +#: access/transam/xlog.c:8836 #, c-format -msgid "permission denied for text search dictionary %s" -msgstr "permissão negada para dicionário de busca textual %s" +msgid "all required WAL segments have been archived" +msgstr "todos os segmentos WAL necessários foram arquivados" -#: catalog/aclchk.c:3301 +#: access/transam/xlog.c:8840 #, c-format -msgid "permission denied for text search configuration %s" -msgstr "permissão negada para configuração de busca textual %s" +msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" +msgstr "arquivamento do WAL não está ativado; você deve garantir que todos os segmentos do WAL necessários foram copiados por outros meios para completar a cópia de segurança" -#: catalog/aclchk.c:3303 +#: access/transam/xlog.c:8879 #, c-format -msgid "permission denied for foreign-data wrapper %s" -msgstr "permissão negada para adaptador de dados externos %s" +msgid "aborting backup due to backend exiting before pg_backup_stop was called" +msgstr "interrompendo a cópia de segurança devido à desconexão do processo servidor antes de ser chamado pg_backup_stop" -#: catalog/aclchk.c:3305 +#: access/transam/xlogarchive.c:214 #, c-format -msgid "permission denied for foreign server %s" -msgstr "permissão negada para servidor externo %s" +msgid "archive file \"%s\" has wrong size: %lld instead of %lld" +msgstr "o arquivo do arquivamento \"%s\" tem tamanho errado: %lld em vez de %lld" -#: catalog/aclchk.c:3307 +#: access/transam/xlogarchive.c:223 #, c-format -msgid "permission denied for event trigger %s" -msgstr "permissão negada para gatilho de eventos %s" +msgid "restored log file \"%s\" from archive" +msgstr "arquivo de log restaurado \"%s\" do arquivador" -#: catalog/aclchk.c:3309 +#: access/transam/xlogarchive.c:237 #, c-format -msgid "permission denied for extension %s" -msgstr "permissão negada para extensão %s" +msgid "restore_command returned a zero exit status, but stat() failed." +msgstr "restore_command retornou um status de saída zero, mas stat() falhou." -#: catalog/aclchk.c:3315 catalog/aclchk.c:3317 +#: access/transam/xlogarchive.c:269 #, c-format -msgid "must be owner of relation %s" -msgstr "deve ser o dono da relação %s" +msgid "could not restore file \"%s\" from archive: %s" +msgstr "não foi possível restaurar o arquivo \"%s\" do arquivador: %s" -#: catalog/aclchk.c:3319 +#. translator: First %s represents a postgresql.conf parameter name like +#. "recovery_end_command", the 2nd is the value of that parameter, the +#. third an already translated error message. +#: access/transam/xlogarchive.c:347 #, c-format -msgid "must be owner of sequence %s" -msgstr "deve ser o dono da sequência %s" +msgid "%s \"%s\": %s" +msgstr "%s \"%s\": %s" -#: catalog/aclchk.c:3321 +#: access/transam/xlogarchive.c:457 access/transam/xlogarchive.c:537 #, c-format -msgid "must be owner of database %s" -msgstr "deve ser o dono do banco de dados %s" +msgid "could not create archive status file \"%s\": %m" +msgstr "não foi possível criar o arquivo de status do arquivador \"%s\": %m" -#: catalog/aclchk.c:3323 +#: access/transam/xlogarchive.c:465 access/transam/xlogarchive.c:545 #, c-format -msgid "must be owner of function %s" -msgstr "deve ser o dono da função %s" +msgid "could not write archive status file \"%s\": %m" +msgstr "não foi possível escrever no arquivo de status do arquivador \"%s\": %m" -#: catalog/aclchk.c:3325 +#: access/transam/xlogfuncs.c:75 backup/basebackup.c:973 #, c-format -msgid "must be owner of operator %s" -msgstr "deve ser o dono do operador %s" +msgid "a backup is already in progress in this session" +msgstr "uma cópia de segurança está em andamento nesta sessão" -#: catalog/aclchk.c:3327 +#: access/transam/xlogfuncs.c:146 #, c-format -msgid "must be owner of type %s" -msgstr "deve ser o dono do tipo %s" +msgid "backup is not in progress" +msgstr "a cópia de segurança não está em andamento" -#: catalog/aclchk.c:3329 +#: access/transam/xlogfuncs.c:147 #, c-format -msgid "must be owner of language %s" -msgstr "deve ser o dono da linguagem %s" +msgid "Did you call pg_backup_start()?" +msgstr "" -#: catalog/aclchk.c:3331 +#: access/transam/xlogfuncs.c:190 access/transam/xlogfuncs.c:248 +#: access/transam/xlogfuncs.c:287 access/transam/xlogfuncs.c:308 +#: access/transam/xlogfuncs.c:329 #, c-format -msgid "must be owner of large object %s" -msgstr "deve ser o dono do objeto grande %s" +msgid "WAL control functions cannot be executed during recovery." +msgstr "funções de controle do WAL não podem ser executadas durante recuperação." -#: catalog/aclchk.c:3333 +#: access/transam/xlogfuncs.c:215 access/transam/xlogfuncs.c:399 +#: access/transam/xlogfuncs.c:457 #, c-format -msgid "must be owner of schema %s" -msgstr "deve ser o dono do esquema %s" +msgid "%s cannot be executed during recovery." +msgstr "%s não pode ser executado durante a recuperação." -#: catalog/aclchk.c:3335 +#: access/transam/xlogfuncs.c:221 #, c-format -msgid "must be owner of operator class %s" -msgstr "deve ser o dono da classe de operadores %s" +msgid "pg_log_standby_snapshot() can only be used if wal_level >= replica" +msgstr "pg_log_standby_snapshot() só pode ser usado se wal_level >= réplica" -#: catalog/aclchk.c:3337 +#: access/transam/xlogfuncs.c:253 #, c-format -msgid "must be owner of operator family %s" -msgstr "deve ser o dono da família de operadores %s" +msgid "WAL level not sufficient for creating a restore point" +msgstr "nível do WAL não é suficiente para criar um ponto de restauração" -#: catalog/aclchk.c:3339 +#: access/transam/xlogfuncs.c:261 #, c-format -msgid "must be owner of collation %s" -msgstr "deve ser o dono da ordenação %s" +msgid "value too long for restore point (maximum %d characters)" +msgstr "valor é muito longo para ponto de restauração (máximo de %d caracteres)" -#: catalog/aclchk.c:3341 +#: access/transam/xlogfuncs.c:496 #, c-format -msgid "must be owner of conversion %s" -msgstr "deve ser o dono da conversão %s" +msgid "invalid WAL file name \"%s\"" +msgstr "nome do arquivo do WAL inválido \"%s\"" -#: catalog/aclchk.c:3343 +#: access/transam/xlogfuncs.c:532 access/transam/xlogfuncs.c:562 +#: access/transam/xlogfuncs.c:586 access/transam/xlogfuncs.c:609 +#: access/transam/xlogfuncs.c:689 #, c-format -msgid "must be owner of tablespace %s" -msgstr "deve ser o dono da tablespace %s" +msgid "recovery is not in progress" +msgstr "recuperação não está em andamento" -#: catalog/aclchk.c:3345 +#: access/transam/xlogfuncs.c:533 access/transam/xlogfuncs.c:563 +#: access/transam/xlogfuncs.c:587 access/transam/xlogfuncs.c:610 +#: access/transam/xlogfuncs.c:690 #, c-format -msgid "must be owner of text search dictionary %s" -msgstr "deve ser o dono do dicionário de busca textual %s" +msgid "Recovery control functions can only be executed during recovery." +msgstr "Funções de controle de recuperação só podem ser executadas durante recuperação." -#: catalog/aclchk.c:3347 +#: access/transam/xlogfuncs.c:538 access/transam/xlogfuncs.c:568 #, c-format -msgid "must be owner of text search configuration %s" -msgstr "deve ser o dono da configuração de busca textual %s" +msgid "standby promotion is ongoing" +msgstr "" -#: catalog/aclchk.c:3349 +#: access/transam/xlogfuncs.c:539 access/transam/xlogfuncs.c:569 #, c-format -msgid "must be owner of foreign-data wrapper %s" -msgstr "deve ser dono de adaptador de dados externos %s" +msgid "%s cannot be executed after promotion is triggered." +msgstr "%s não pode ser executado após a promoção ser acionada." -#: catalog/aclchk.c:3351 +#: access/transam/xlogfuncs.c:695 #, c-format -msgid "must be owner of foreign server %s" -msgstr "deve ser o dono de servidor externo %s" +msgid "\"wait_seconds\" must not be negative or zero" +msgstr "\"wait_seconds\" não deve ser negativo ou zero" -#: catalog/aclchk.c:3353 +#: access/transam/xlogfuncs.c:715 storage/ipc/signalfuncs.c:265 #, c-format -msgid "must be owner of event trigger %s" -msgstr "deve ser o dono do gatilho de eventos %s" +msgid "failed to send signal to postmaster: %m" +msgstr "falhou ao enviar sinal para postmaster: %m" -#: catalog/aclchk.c:3355 +#: access/transam/xlogfuncs.c:751 #, c-format -msgid "must be owner of extension %s" -msgstr "deve ser o dono da extensão %s" +msgid "server did not promote within %d second" +msgid_plural "server did not promote within %d seconds" +msgstr[0] "o servidor não foi promovido em %d segundo" +msgstr[1] "o servidor não foi promovido em %d segundos" -#: catalog/aclchk.c:3397 +#: access/transam/xlogprefetcher.c:1092 #, c-format -msgid "permission denied for column \"%s\" of relation \"%s\"" -msgstr "permissão negada para coluna \"%s\" da relação \"%s\"" +msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." +msgstr "" -#: catalog/aclchk.c:3437 +#: access/transam/xlogreader.c:621 #, c-format -msgid "role with OID %u does not exist" -msgstr "role com OID %u não existe" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "deslocamento de registro inválido em %X/%X: esperado pelo menos %u, obtido %u" -#: catalog/aclchk.c:3536 catalog/aclchk.c:3544 +#: access/transam/xlogreader.c:630 #, c-format -msgid "attribute %d of relation with OID %u does not exist" -msgstr "atributo %d da relação com OID %u não existe" +msgid "contrecord is requested by %X/%X" +msgstr "contrecord é solicitado por %X/%X" -#: catalog/aclchk.c:3617 catalog/aclchk.c:4532 +#: access/transam/xlogreader.c:671 access/transam/xlogreader.c:1136 #, c-format -msgid "relation with OID %u does not exist" -msgstr "relação com OID %u não existe" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "comprimento de registro inválido em %X/%X: esperado pelo menos %u, obtido %u" -#: catalog/aclchk.c:3717 catalog/aclchk.c:4950 +#: access/transam/xlogreader.c:760 #, c-format -msgid "database with OID %u does not exist" -msgstr "banco de dados com OID %u não existe" +msgid "there is no contrecord flag at %X/%X" +msgstr "não há marcação contrecord em %X/%X" -#: catalog/aclchk.c:3771 catalog/aclchk.c:4610 tcop/fastpath.c:223 +#: access/transam/xlogreader.c:773 #, c-format -msgid "function with OID %u does not exist" -msgstr "função com OID %u não existe" +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "comprimento de contrecord inválido %u (esperado %lld) em %X/%X" -#: catalog/aclchk.c:3825 catalog/aclchk.c:4636 +#: access/transam/xlogreader.c:1144 #, c-format -msgid "language with OID %u does not exist" -msgstr "linguagem com OID %u não existe" +msgid "invalid resource manager ID %u at %X/%X" +msgstr "ID do gerenciador de recursos inválido %u em %X/%X" -#: catalog/aclchk.c:3989 catalog/aclchk.c:4708 +#: access/transam/xlogreader.c:1157 access/transam/xlogreader.c:1173 #, c-format -msgid "schema with OID %u does not exist" -msgstr "esquema com OID %u não existe" +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "registro com prev-link %X/%X incorreto em %X/%X" -#: catalog/aclchk.c:4043 catalog/aclchk.c:4735 +#: access/transam/xlogreader.c:1211 #, c-format -msgid "tablespace with OID %u does not exist" -msgstr "tablespace com OID %u não existe" +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "soma de verificação do gerenciador de recursos é incorreta no registro em %X/%X" -#: catalog/aclchk.c:4101 catalog/aclchk.c:4869 commands/foreigncmds.c:302 +#: access/transam/xlogreader.c:1245 #, c-format -msgid "foreign-data wrapper with OID %u does not exist" -msgstr "adaptador de dados externos com OID %u não existe" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "número mágico inválido %04X no segmento do WAL %s, LSN %X/%X, deslocamento %u" -#: catalog/aclchk.c:4162 catalog/aclchk.c:4896 commands/foreigncmds.c:409 +#: access/transam/xlogreader.c:1260 access/transam/xlogreader.c:1302 #, c-format -msgid "foreign server with OID %u does not exist" -msgstr "servidor externo com OID %u não existe" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "bits de informação inválidos %04X no segmento do WAL %s, LSN %X/%X, deslocamento %u" -#: catalog/aclchk.c:4221 catalog/aclchk.c:4235 catalog/aclchk.c:4558 +#: access/transam/xlogreader.c:1276 #, c-format -msgid "type with OID %u does not exist" -msgstr "tipo com OID %u não existe" +msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" +msgstr "o arquivo do WAL é de um sistema de banco de dados diferente: o identificador do sistema de banco de dados do arquivo do WAL é %llu, e o identificador do sistema de banco de dados pg_control é %llu" -#: catalog/aclchk.c:4584 +#: access/transam/xlogreader.c:1284 #, c-format -msgid "operator with OID %u does not exist" -msgstr "operador com OID %u não existe" +msgid "WAL file is from different database system: incorrect segment size in page header" +msgstr "o arquivo do WAL é de um sistema de banco de dados diferente: tamanho de segmento incorreto no cabeçalho da página" -#: catalog/aclchk.c:4761 +#: access/transam/xlogreader.c:1290 #, c-format -msgid "operator class with OID %u does not exist" -msgstr "classe de operadores com OID %u não existe" +msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" +msgstr "arquivo do WAL é de um sistema de banco de dados diferente: XLOG_BLCKSZ incorreto no cabeçalho da página" -#: catalog/aclchk.c:4788 +#: access/transam/xlogreader.c:1322 #, c-format -msgid "operator family with OID %u does not exist" -msgstr "família de operadores com OID %u não existe" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "endereço de página não esperado %X/%X no segmento do WAL %s, LSN %X/%X, deslocamento %u" -#: catalog/aclchk.c:4815 +#: access/transam/xlogreader.c:1348 #, c-format -msgid "text search dictionary with OID %u does not exist" -msgstr "dicionário de busca textual com OID %u não existe" +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "ID da linha do tempo fora de sequência %u (após %u) no segmento do WAL %s, LSN %X/%X, deslocamento %u" -#: catalog/aclchk.c:4842 +#: access/transam/xlogreader.c:1754 #, c-format -msgid "text search configuration with OID %u does not exist" -msgstr "configuração de busca textual com OID %u não existe" +msgid "out-of-order block_id %u at %X/%X" +msgstr "block_id %u fora de ordem em %X/%X" -#: catalog/aclchk.c:4923 commands/event_trigger.c:509 +#: access/transam/xlogreader.c:1778 #, c-format -msgid "event trigger with OID %u does not exist" -msgstr "gatilho de eventos com OID %u não existe" +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATA definido mas nenhum dado incluído em %X/%X" -#: catalog/aclchk.c:4976 +#: access/transam/xlogreader.c:1785 #, c-format -msgid "collation with OID %u does not exist" -msgstr "ordenação com OID %u não existe" +msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" +msgstr "BKPBLOCK_HAS_DATA não foi definido mas tamanho do dado é %u em %X/%X" -#: catalog/aclchk.c:5002 +#: access/transam/xlogreader.c:1821 #, c-format -msgid "conversion with OID %u does not exist" -msgstr "conversão com OID %u não existe" +msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE definido mas posição do espaço livre %u tamanho %u tamanho da imagem do bloco %u em %X/%X" -#: catalog/aclchk.c:5043 +#: access/transam/xlogreader.c:1837 #, c-format -msgid "extension with OID %u does not exist" -msgstr "extensão com OID %u não existe" +msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE não foi definido mas posição do espaço livre %u tamanho %u em %X/%X" -#: catalog/dependency.c:626 +#: access/transam/xlogreader.c:1851 #, c-format -msgid "cannot drop %s because %s requires it" -msgstr "não pode remover %s porque %s o requer" +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSED definido, mas bloqueia o comprimento da imagem %u em %X/%X" -#: catalog/dependency.c:629 +#: access/transam/xlogreader.c:1866 #, c-format -msgid "You can drop %s instead." -msgstr "Você pode remover %s ao invés dele." +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "nem BKPIMAGE_HAS_HOLE nem BKPIMAGE_COMPRESSED definidos, mas o comprimento da imagem do bloco é %u em %X/%X" -#: catalog/dependency.c:790 catalog/pg_shdepend.c:573 +#: access/transam/xlogreader.c:1882 #, c-format -msgid "cannot drop %s because it is required by the database system" -msgstr "não pode remover %s porque ele é requerido pelo sistema de banco de dados" +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_REL definido mas não há relação anterior em %X/%X" -#: catalog/dependency.c:906 +#: access/transam/xlogreader.c:1894 #, c-format -msgid "drop auto-cascades to %s" -msgstr "removendo automaticamente %s" +msgid "invalid block_id %u at %X/%X" +msgstr "block_id %u inválido em %X/%X" -#: catalog/dependency.c:918 catalog/dependency.c:927 +#: access/transam/xlogreader.c:1961 #, c-format -msgid "%s depends on %s" -msgstr "%s depende de %s" +msgid "record with invalid length at %X/%X" +msgstr "registro com tamanho inválido em %X/%X" -#: catalog/dependency.c:939 catalog/dependency.c:948 +#: access/transam/xlogreader.c:1987 #, c-format -msgid "drop cascades to %s" -msgstr "removendo em cascata %s" +msgid "could not locate backup block with ID %d in WAL record" +msgstr "não foi possível localizar o bloco de cópia de segurança com ID %d no registro do WAL" -#: catalog/dependency.c:956 catalog/pg_shdepend.c:684 +#: access/transam/xlogreader.c:2071 #, c-format -msgid "" -"\n" -"and %d other object (see server log for list)" -msgid_plural "" -"\n" -"and %d other objects (see server log for list)" -msgstr[0] "" -"\n" -"e %d outro objeto (veja lista no log do servidor)" -msgstr[1] "" -"\n" -"e %d outros objetos (veja lista no log do servidor)" +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "" -#: catalog/dependency.c:968 +#: access/transam/xlogreader.c:2078 #, c-format -msgid "cannot drop %s because other objects depend on it" -msgstr "não pode remover %s porque outros objetos dependem dele" +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "não foi possível restaurar a imagem em %X/%X com estado não válido, bloco %d" -#: catalog/dependency.c:972 catalog/dependency.c:979 +#: access/transam/xlogreader.c:2105 access/transam/xlogreader.c:2122 #, c-format -msgid "Use DROP ... CASCADE to drop the dependent objects too." -msgstr "Utilize DROP ... CASCADE para remover os objetos dependentes também." +msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "" -#: catalog/dependency.c:976 +#: access/transam/xlogreader.c:2131 #, c-format -msgid "cannot drop desired object(s) because other objects depend on them" -msgstr "não pode remover objeto(s) desejado(s) porque outros objetos dependem dele" +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "" -#. translator: %d always has a value larger than 1 -#: catalog/dependency.c:985 +#: access/transam/xlogreader.c:2139 #, c-format -msgid "drop cascades to %d other object" -msgid_plural "drop cascades to %d other objects" -msgstr[0] "removendo em cascata %d outro objeto" -msgstr[1] "removendo em cascata outros %d objetos" +msgid "could not decompress image at %X/%X, block %d" +msgstr "não foi possível descomprimir a imagem em %X/%X, bloco %d" -#: catalog/heap.c:274 +#: access/transam/xlogrecovery.c:547 #, c-format -msgid "permission denied to create \"%s.%s\"" -msgstr "permissão negada ao criar \"%s.%s\"" +msgid "entering standby mode" +msgstr "entrando no modo em espera" -#: catalog/heap.c:276 +#: access/transam/xlogrecovery.c:550 #, c-format -msgid "System catalog modifications are currently disallowed." -msgstr "Modificações no catálogo do sistema estão atualmente desabilitadas." +msgid "starting point-in-time recovery to XID %u" +msgstr "iniciando recuperação de ponto no tempo para XID %u" -#: catalog/heap.c:411 commands/tablecmds.c:1402 commands/tablecmds.c:1844 -#: commands/tablecmds.c:4583 +#: access/transam/xlogrecovery.c:554 #, c-format -msgid "tables can have at most %d columns" -msgstr "tabelas podem ter no máximo %d colunas" +msgid "starting point-in-time recovery to %s" +msgstr "iniciando recuperação de ponto no tempo para %s" -#: catalog/heap.c:428 commands/tablecmds.c:4839 +#: access/transam/xlogrecovery.c:558 #, c-format -msgid "column name \"%s\" conflicts with a system column name" -msgstr "nome de coluna \"%s\" conflita com um nome de coluna do sistema" +msgid "starting point-in-time recovery to \"%s\"" +msgstr "iniciando recuperação de ponto no tempo para \"%s\"" -#: catalog/heap.c:444 +#: access/transam/xlogrecovery.c:562 #, c-format -msgid "column name \"%s\" specified more than once" -msgstr "nome da coluna \"%s\" especificado mais de uma vez" +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "iniciando recuperação de ponto no tempo para o local do WAL (LSN) \"%X/%X\"" -#: catalog/heap.c:494 +#: access/transam/xlogrecovery.c:566 #, c-format -msgid "column \"%s\" has type \"unknown\"" -msgstr "coluna \"%s\" tem tipo \"unknown\"" +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "iniciando recuperação de ponto no tempo para ponto de consistência mais antigo" -#: catalog/heap.c:495 +#: access/transam/xlogrecovery.c:569 #, c-format -msgid "Proceeding with relation creation anyway." -msgstr "Prosseguindo com a criação da relação mesmo assim." +msgid "starting archive recovery" +msgstr "iniciando recuperação do arquivador" -#: catalog/heap.c:508 +#: access/transam/xlogrecovery.c:653 #, c-format -msgid "column \"%s\" has pseudo-type %s" -msgstr "coluna \"%s\" tem pseudo-tipo %s" +msgid "could not find redo location referenced by checkpoint record" +msgstr "não foi possível encontrar local do redo referenciado pelo registro do ponto de controle" -#: catalog/heap.c:538 +#: access/transam/xlogrecovery.c:654 access/transam/xlogrecovery.c:664 #, c-format -msgid "composite type %s cannot be made a member of itself" -msgstr "tipo composto %s não pode se tornar membro de si próprio" +msgid "" +"If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" +"If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" +"Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." +msgstr "" -#: catalog/heap.c:580 commands/createas.c:343 +#: access/transam/xlogrecovery.c:663 #, c-format -msgid "no collation was derived for column \"%s\" with collatable type %s" -msgstr "nenhuma ordenação foi derivada para coluna \"%s\" com tipo %s ordenável" +msgid "could not locate required checkpoint record" +msgstr "não foi possível localizar registro do ponto de controle requerido" -#: catalog/heap.c:582 commands/createas.c:345 commands/indexcmds.c:1072 -#: commands/view.c:116 regex/regc_pg_locale.c:262 utils/adt/formatting.c:1510 -#: utils/adt/formatting.c:1562 utils/adt/formatting.c:1630 -#: utils/adt/formatting.c:1682 utils/adt/formatting.c:1751 -#: utils/adt/formatting.c:1815 utils/adt/like.c:212 utils/adt/selfuncs.c:5221 -#: utils/adt/varlena.c:1381 +#: access/transam/xlogrecovery.c:692 commands/tablespace.c:670 #, c-format -msgid "Use the COLLATE clause to set the collation explicitly." -msgstr "Utilize a cláusula COLLATE para definir a ordenação explicitamente." +msgid "could not create symbolic link \"%s\": %m" +msgstr "não foi possível criar link simbólico \"%s\": %m" -#: catalog/heap.c:1055 catalog/index.c:778 commands/tablecmds.c:2549 +#: access/transam/xlogrecovery.c:724 access/transam/xlogrecovery.c:730 #, c-format -msgid "relation \"%s\" already exists" -msgstr "relação \"%s\" já existe" +msgid "ignoring file \"%s\" because no file \"%s\" exists" +msgstr "ignorando o arquivo \"%s\", porque não existe nenhum arquivo \"%s\"" -#: catalog/heap.c:1071 catalog/pg_type.c:403 catalog/pg_type.c:706 -#: commands/typecmds.c:239 commands/typecmds.c:739 commands/typecmds.c:1090 -#: commands/typecmds.c:1308 commands/typecmds.c:2060 +#: access/transam/xlogrecovery.c:726 #, c-format -msgid "type \"%s\" already exists" -msgstr "tipo \"%s\" já existe" +msgid "File \"%s\" was renamed to \"%s\"." +msgstr "O arquivo \"%s\" foi renomeado para \"%s\"." -#: catalog/heap.c:1072 +#: access/transam/xlogrecovery.c:732 #, c-format -msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." -msgstr "A relação tem um tipo associado com o mesmo nome, então você deve utilizar um nome que não conflite com outro tipo existente." +msgid "Could not rename file \"%s\" to \"%s\": %m." +msgstr "Não foi possível renomear o arquivo \"%s\" para \"%s\": %m." -#: catalog/heap.c:2257 +#: access/transam/xlogrecovery.c:786 #, c-format -msgid "check constraint \"%s\" already exists" -msgstr "restrição de verificação \"%s\" já existe" +msgid "could not locate a valid checkpoint record" +msgstr "não foi possível localizar registro do ponto de controle válido" -#: catalog/heap.c:2410 catalog/pg_constraint.c:650 commands/tablecmds.c:5734 +#: access/transam/xlogrecovery.c:810 #, c-format -msgid "constraint \"%s\" for relation \"%s\" already exists" -msgstr "restrição \"%s\" para relação \"%s\" já existe" +msgid "requested timeline %u is not a child of this server's history" +msgstr "linha do tempo solicitada %u não é descendente do histórico do servidor" -#: catalog/heap.c:2420 +#: access/transam/xlogrecovery.c:812 #, c-format -msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" -msgstr "restrição \"%s\" conflita com restrição não herdada na relação \"%s\"" +msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." +msgstr "Último ponto de controle está em %X/%X na linha do tempo %u, mas no histórico da linha do tempo solicitada, o servidor bifurcou daquela linha do tempo em %X/%X." -#: catalog/heap.c:2434 +#: access/transam/xlogrecovery.c:826 #, c-format -msgid "merging constraint \"%s\" with inherited definition" -msgstr "juntando restrição \"%s\" com definição herdada" +msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" +msgstr "linha do tempo solicitada %u não contém o ponto de recuperação mínimo %X/%X na linha do tempo %u" -#: catalog/heap.c:2527 +#: access/transam/xlogrecovery.c:854 #, c-format -msgid "cannot use column references in default expression" -msgstr "não pode utilizar referência à coluna na expressão padrão" +msgid "invalid next transaction ID" +msgstr "o próximo ID de transação não é válido" -#: catalog/heap.c:2538 +#: access/transam/xlogrecovery.c:859 #, c-format -msgid "default expression must not return a set" -msgstr "expressão padrão não deve retornar um conjunto" +msgid "invalid redo in checkpoint record" +msgstr "refazer inválido no registro do ponto de verificação" -#: catalog/heap.c:2557 rewrite/rewriteHandler.c:1066 +#: access/transam/xlogrecovery.c:870 #, c-format -msgid "column \"%s\" is of type %s but default expression is of type %s" -msgstr "coluna \"%s\" é do tipo %s mas expressão padrão é do tipo %s" +msgid "invalid redo record in shutdown checkpoint" +msgstr "registro de refazer inválido no ponto de verificação de desligamento" -#: catalog/heap.c:2562 commands/prepare.c:374 parser/parse_node.c:411 -#: parser/parse_target.c:509 parser/parse_target.c:758 -#: parser/parse_target.c:768 rewrite/rewriteHandler.c:1071 +#: access/transam/xlogrecovery.c:899 #, c-format -msgid "You will need to rewrite or cast the expression." -msgstr "Você precisará reescrever ou converter a expressão." +msgid "database system was not properly shut down; automatic recovery in progress" +msgstr "sistema de banco de dados não foi desligado corretamente; recuperação automática está em andamento" -#: catalog/heap.c:2609 +#: access/transam/xlogrecovery.c:903 #, c-format -msgid "only table \"%s\" can be referenced in check constraint" -msgstr "somente a tabela \"%s\" pode ser referenciada na restrição de verificação" +msgid "crash recovery starts in timeline %u and has target timeline %u" +msgstr "recuperação de queda começa na linha do tempo %u e tem como linha do tempo alvo %u" -#: catalog/heap.c:2849 +#: access/transam/xlogrecovery.c:946 #, c-format -msgid "unsupported ON COMMIT and foreign key combination" -msgstr "combinação ON COMMIT e chave estrangeira não é suportada" +msgid "backup_label contains data inconsistent with control file" +msgstr "backup_label contém dados inconsistentes com o arquivo de controle" -#: catalog/heap.c:2850 +#: access/transam/xlogrecovery.c:947 #, c-format -msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." -msgstr "Tabela \"%s\" referencia \"%s\", mas elas não têm a mesma definição de ON COMMIT." +msgid "This means that the backup is corrupted and you will have to use another backup for recovery." +msgstr "Isso significa que a cópia de segurança está corrompida e você terá que utilizar outra cópia de segurança para recuperação." -#: catalog/heap.c:2855 +#: access/transam/xlogrecovery.c:1001 #, c-format -msgid "cannot truncate a table referenced in a foreign key constraint" -msgstr "não pode truncar uma tabela referenciada em uma restrição de chave estrangeira" +msgid "using recovery command file \"%s\" is not supported" +msgstr "o uso do arquivo de comando de recuperação \"%s\" não tem suporte" -#: catalog/heap.c:2856 +#: access/transam/xlogrecovery.c:1066 #, c-format -msgid "Table \"%s\" references \"%s\"." -msgstr "Tabela \"%s\" referencia \"%s\"." +msgid "standby mode is not supported by single-user servers" +msgstr "" -#: catalog/heap.c:2858 +#: access/transam/xlogrecovery.c:1083 #, c-format -msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." -msgstr "Trunque a tabela \"%s\" ao mesmo tempo, ou utilize TRUNCATE ... CASCADE." +msgid "specified neither primary_conninfo nor restore_command" +msgstr "não foi especificado nem primary_conninfo nem restore_command" -#: catalog/index.c:204 parser/parse_utilcmd.c:1393 parser/parse_utilcmd.c:1479 +#: access/transam/xlogrecovery.c:1084 #, c-format -msgid "multiple primary keys for table \"%s\" are not allowed" -msgstr "chaves primárias múltiplas na tabela \"%s\" não são permitidas" +msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." +msgstr "O servidor de banco de dados irá pesquisar regularmente o subdiretório pg_wal para verificar se há arquivos ali colocados." -#: catalog/index.c:222 +#: access/transam/xlogrecovery.c:1092 #, c-format -msgid "primary keys cannot be expressions" -msgstr "chaves primárias não podem ser expressões" +msgid "must specify restore_command when standby mode is not enabled" +msgstr "é necessário especificar o restore_command quando o modo em-espera não estiver ativado" -#: catalog/index.c:739 catalog/index.c:1143 +#: access/transam/xlogrecovery.c:1130 #, c-format -msgid "user-defined indexes on system catalog tables are not supported" -msgstr "índices definidos pelo usuário nas tabelas de catálogo do sistema não são suportados" +msgid "recovery target timeline %u does not exist" +msgstr "linha do tempo para recuperação %u não existe" -#: catalog/index.c:749 +#: access/transam/xlogrecovery.c:1213 access/transam/xlogrecovery.c:1220 +#: access/transam/xlogrecovery.c:1279 access/transam/xlogrecovery.c:1359 +#: access/transam/xlogrecovery.c:1383 #, c-format -msgid "concurrent index creation on system catalog tables is not supported" -msgstr "criação de índices concorrentes nas tabelas de catálogo do sistema não são suportados" +msgid "invalid data in file \"%s\"" +msgstr "dado inválido no arquivo \"%s\"" -#: catalog/index.c:767 +#: access/transam/xlogrecovery.c:1280 #, c-format -msgid "shared indexes cannot be created after initdb" -msgstr "índices compartilhados não podem ser criados depois do initdb" +msgid "Timeline ID parsed is %u, but expected %u." +msgstr "" -#: catalog/index.c:1403 +#: access/transam/xlogrecovery.c:1662 #, c-format -msgid "DROP INDEX CONCURRENTLY must be first action in transaction" -msgstr "DROP INDEX CONCURRENTLY deve ser a primeira ação na transação" +msgid "redo starts at %X/%X" +msgstr "redo inicia em %X/%X" -#: catalog/index.c:1936 +#: access/transam/xlogrecovery.c:1675 #, c-format -msgid "building index \"%s\" on table \"%s\"" -msgstr "construindo índice \"%s\" na tabela \"%s\"" +msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" +msgstr "" -#: catalog/index.c:3121 +#: access/transam/xlogrecovery.c:1767 #, c-format -msgid "cannot reindex temporary tables of other sessions" -msgstr "não pode reindexar tabelas temporárias de outras sessões" +msgid "requested recovery stop point is before consistent recovery point" +msgstr "ponto de parada de recuperação solicitado está antes do ponto de recuperação consistente" -#: catalog/namespace.c:247 catalog/namespace.c:445 catalog/namespace.c:539 -#: commands/trigger.c:4486 +#: access/transam/xlogrecovery.c:1799 #, c-format -msgid "cross-database references are not implemented: \"%s.%s.%s\"" -msgstr "referências cruzadas entre bancos de dados não estão implementadas: \"%s.%s.%s\"" +msgid "redo done at %X/%X system usage: %s" +msgstr "refazer feito em %X/%X uso do sistema: %s" -#: catalog/namespace.c:304 +#: access/transam/xlogrecovery.c:1805 #, c-format -msgid "temporary tables cannot specify a schema name" -msgstr "tabelas temporárias não podem especificar um nome de esquema" +msgid "last completed transaction was at log time %s" +msgstr "última transação efetivada foi em %s" -#: catalog/namespace.c:383 +#: access/transam/xlogrecovery.c:1814 #, c-format -msgid "could not obtain lock on relation \"%s.%s\"" -msgstr "não pôde obter bloqueio na relação \"%s.%s\"" +msgid "redo is not required" +msgstr "redo não é requerido" -#: catalog/namespace.c:388 commands/lockcmds.c:146 +#: access/transam/xlogrecovery.c:1825 #, c-format -msgid "could not obtain lock on relation \"%s\"" -msgstr "não pôde obter bloqueio na relação \"%s\"" +msgid "recovery ended before configured recovery target was reached" +msgstr "" -#: catalog/namespace.c:412 parser/parse_relation.c:964 +#: access/transam/xlogrecovery.c:2019 #, c-format -msgid "relation \"%s.%s\" does not exist" -msgstr "relação \"%s.%s\" não existe" +msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" +msgstr "" -#: catalog/namespace.c:417 parser/parse_relation.c:977 -#: parser/parse_relation.c:985 utils/adt/regproc.c:974 +#: access/transam/xlogrecovery.c:2086 #, c-format -msgid "relation \"%s\" does not exist" -msgstr "relação \"%s\" não existe" +msgid "unexpected directory entry \"%s\" found in %s" +msgstr "entrada de diretório não esperada \"%s\" encontrada em %s" -#: catalog/namespace.c:485 catalog/namespace.c:2849 commands/extension.c:1396 -#: commands/extension.c:1402 +#: access/transam/xlogrecovery.c:2088 #, c-format -msgid "no schema has been selected to create in" -msgstr "nenhum esquema foi selecionado para criá-lo(a)" +msgid "All directory entries in pg_tblspc/ should be symbolic links." +msgstr "" -#: catalog/namespace.c:637 catalog/namespace.c:650 +#: access/transam/xlogrecovery.c:2089 #, c-format -msgid "cannot create relations in temporary schemas of other sessions" -msgstr "não pode criar relações em esquemas temporárias de outras sessões" +msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." +msgstr "" -#: catalog/namespace.c:641 +#: access/transam/xlogrecovery.c:2163 #, c-format -msgid "cannot create temporary relation in non-temporary schema" -msgstr "não pode criar relação temporária em esquema que não é temporário" +msgid "consistent recovery state reached at %X/%X" +msgstr "estado de recuperação consistente alcançado em %X/%X" -#: catalog/namespace.c:656 +#. translator: %s is a WAL record description +#: access/transam/xlogrecovery.c:2201 #, c-format -msgid "only temporary relations may be created in temporary schemas" -msgstr "somente relações temporárias podem ser criadas em esquemas temporários" +msgid "WAL redo at %X/%X for %s" +msgstr "redo WAL em %X/%X para %s" -#: catalog/namespace.c:2151 +#: access/transam/xlogrecovery.c:2299 #, c-format -msgid "text search parser \"%s\" does not exist" -msgstr "analisador de busca textual \"%s\" não existe" +msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" +msgstr "ID da linha do tempo anterior não esperado %u (ID da linha do tempo corrente %u) no registro do ponto de verificação" -#: catalog/namespace.c:2277 +#: access/transam/xlogrecovery.c:2308 #, c-format -msgid "text search dictionary \"%s\" does not exist" -msgstr "dicionário de busca textual \"%s\" não existe" +msgid "unexpected timeline ID %u (after %u) in checkpoint record" +msgstr "ID da linha do tempo não esperado %u (após %u) no registro do ponto de verificação" -#: catalog/namespace.c:2404 +#: access/transam/xlogrecovery.c:2324 #, c-format -msgid "text search template \"%s\" does not exist" -msgstr "modelo de busca textual \"%s\" não existe" +msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" +msgstr "ID da linha do tempo não esperado %u no registro do ponto de verificação, antes de atingir o ponto de recuperação mínimo %X/%X na linha do tempo %u" -#: catalog/namespace.c:2530 commands/tsearchcmds.c:1168 -#: utils/cache/ts_cache.c:616 +#: access/transam/xlogrecovery.c:2508 access/transam/xlogrecovery.c:2784 #, c-format -msgid "text search configuration \"%s\" does not exist" -msgstr "configuração de busca textual \"%s\" não existe" +msgid "recovery stopping after reaching consistency" +msgstr "recuperação parada após atingir consistência" -#: catalog/namespace.c:2643 parser/parse_expr.c:788 parser/parse_target.c:1110 +#: access/transam/xlogrecovery.c:2529 #, c-format -msgid "cross-database references are not implemented: %s" -msgstr "referências cruzadas entre bancos de dados não estão implementadas: %s" +msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" +msgstr "recuperação parando antes do local do WAL (LSN) \"%X/%X\"" -#: catalog/namespace.c:2649 gram.y:12556 gram.y:13788 parser/parse_expr.c:795 -#: parser/parse_target.c:1117 +#: access/transam/xlogrecovery.c:2619 #, c-format -msgid "improper qualified name (too many dotted names): %s" -msgstr "nome qualificado é inválido (nomes com muitos pontos): %s" +msgid "recovery stopping before commit of transaction %u, time %s" +msgstr "recuperação parada antes da efetivação da transação %u, tempo %s" -#: catalog/namespace.c:2783 +#: access/transam/xlogrecovery.c:2626 #, c-format -msgid "%s is already in schema \"%s\"" -msgstr "%s já está no esquema \"%s\"" +msgid "recovery stopping before abort of transaction %u, time %s" +msgstr "recuperação parada antes interrupção da transação %u, tempo %s" -#: catalog/namespace.c:2791 +#: access/transam/xlogrecovery.c:2679 #, c-format -msgid "cannot move objects into or out of temporary schemas" -msgstr "não pode mover objetos para ou de esquemas temporários" +msgid "recovery stopping at restore point \"%s\", time %s" +msgstr "recuperação parada no ponto de restauração \"%s\", tempo %s" -#: catalog/namespace.c:2797 +#: access/transam/xlogrecovery.c:2697 #, c-format -msgid "cannot move objects into or out of TOAST schema" -msgstr "não pode mover objetos para ou de esquema TOAST" +msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" +msgstr "recuperação parando após a localização do WAL (LSN) \"%X/%X\"" -#: catalog/namespace.c:2870 commands/schemacmds.c:212 -#: commands/schemacmds.c:288 commands/tablecmds.c:708 +#: access/transam/xlogrecovery.c:2764 #, c-format -msgid "schema \"%s\" does not exist" -msgstr "esquema \"%s\" não existe" +msgid "recovery stopping after commit of transaction %u, time %s" +msgstr "recuperação parada após efetivação da transação %u, tempo %s" -#: catalog/namespace.c:2901 +#: access/transam/xlogrecovery.c:2772 #, c-format -msgid "improper relation name (too many dotted names): %s" -msgstr "nome de relação é inválido (nomes com muitos pontos): %s" +msgid "recovery stopping after abort of transaction %u, time %s" +msgstr "recuperação parada após interrupção da transação %u, tempo %s" -#: catalog/namespace.c:3342 +#: access/transam/xlogrecovery.c:2853 #, c-format -msgid "collation \"%s\" for encoding \"%s\" does not exist" -msgstr "ordenação \"%s\" para codificação \"%s\" não existe" +msgid "pausing at the end of recovery" +msgstr "pausando no final da recuperação" -#: catalog/namespace.c:3397 +#: access/transam/xlogrecovery.c:2854 #, c-format -msgid "conversion \"%s\" does not exist" -msgstr "conversão \"%s\" não existe" +msgid "Execute pg_wal_replay_resume() to promote." +msgstr "Execute pg_wal_replay_resume() para promover." -#: catalog/namespace.c:3605 +#: access/transam/xlogrecovery.c:2857 access/transam/xlogrecovery.c:4594 #, c-format -msgid "permission denied to create temporary tables in database \"%s\"" -msgstr "permissão negada ao criar tabelas temporárias no banco de dados \"%s\"" +msgid "recovery has paused" +msgstr "recuperação está em pausa" -#: catalog/namespace.c:3621 +#: access/transam/xlogrecovery.c:2858 #, c-format -msgid "cannot create temporary tables during recovery" -msgstr "não pode criar tabelas temporárias durante recuperação" +msgid "Execute pg_wal_replay_resume() to continue." +msgstr "Execute pg_wal_replay_resume() para continuar." -#: catalog/namespace.c:3865 commands/tablespace.c:1113 commands/variable.c:61 -#: replication/syncrep.c:677 utils/misc/guc.c:9034 +#: access/transam/xlogrecovery.c:3121 #, c-format -msgid "List syntax is invalid." -msgstr "Sintaxe de lista é inválida." - -#: catalog/objectaddress.c:732 -msgid "database name cannot be qualified" -msgstr "nome do banco de dados não pode ser qualificado" +msgid "unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u" +msgstr "ID da linha do tempo não esperado %u no segmento do WAL %s, LSN %X/%X, deslocamento %u" -#: catalog/objectaddress.c:735 commands/extension.c:2423 +#: access/transam/xlogrecovery.c:3329 #, c-format -msgid "extension name cannot be qualified" -msgstr "nome da extensão não pode ser qualificado" +msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: %m" +msgstr "não foi possível ler o segmento do WAL %s, LSN %X/%X, deslocamento %u: %m" -#: catalog/objectaddress.c:738 -msgid "tablespace name cannot be qualified" -msgstr "nome da tablespace não pode ser qualificado" - -#: catalog/objectaddress.c:741 -msgid "role name cannot be qualified" -msgstr "nome da role não pode ser qualificado" +#: access/transam/xlogrecovery.c:3336 +#, c-format +msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu" +msgstr "não foi possível ler do segmento do WAL %s, LSN %X/%X, deslocamento %u: leitura %d de %zu" -#: catalog/objectaddress.c:744 -msgid "schema name cannot be qualified" -msgstr "nome do esquema não pode ser qualificado" +#: access/transam/xlogrecovery.c:3976 +#, c-format +msgid "invalid checkpoint location" +msgstr "localização do ponto de verificação inválida" -#: catalog/objectaddress.c:747 -msgid "language name cannot be qualified" -msgstr "nome da linguagem não pode ser qualificado" +#: access/transam/xlogrecovery.c:3986 +#, c-format +msgid "invalid checkpoint record" +msgstr "registro do ponto de verificação inválido" -#: catalog/objectaddress.c:750 -msgid "foreign-data wrapper name cannot be qualified" -msgstr "nome do adaptador de dados externos não pode ser qualificado" +#: access/transam/xlogrecovery.c:3992 +#, c-format +msgid "invalid resource manager ID in checkpoint record" +msgstr "ID do gerenciador de recursos inválido no registro do ponto de verificação" -#: catalog/objectaddress.c:753 -msgid "server name cannot be qualified" -msgstr "nome do servidor não pode ser qualificado" +#: access/transam/xlogrecovery.c:4000 +#, c-format +msgid "invalid xl_info in checkpoint record" +msgstr "xl_info inválido no registro do ponto de verificação" -#: catalog/objectaddress.c:756 -msgid "event trigger name cannot be qualified" -msgstr "nome do gatilho de eventos não pode ser qualificado" +#: access/transam/xlogrecovery.c:4006 +#, c-format +msgid "invalid length of checkpoint record" +msgstr "comprimento inválido do registro do ponto de verificação" -#: catalog/objectaddress.c:869 commands/lockcmds.c:94 commands/tablecmds.c:208 -#: commands/tablecmds.c:1263 commands/tablecmds.c:4130 -#: commands/tablecmds.c:7601 +#: access/transam/xlogrecovery.c:4060 #, c-format -msgid "\"%s\" is not a table" -msgstr "\"%s\" não é uma tabela" +msgid "new timeline %u is not a child of database system timeline %u" +msgstr "nova linha do tempo %u não é descendente da linha do tempo %u do sistema de banco de dados" -#: catalog/objectaddress.c:876 commands/tablecmds.c:220 -#: commands/tablecmds.c:4154 commands/tablecmds.c:11249 commands/view.c:154 +#: access/transam/xlogrecovery.c:4074 #, c-format -msgid "\"%s\" is not a view" -msgstr "\"%s\" não é uma visão" +msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" +msgstr "nova linha do tempo %u bifurcou da linha do tempo %u do sistema de banco de dados antes do ponto de recuperação atual %X/%X" -#: catalog/objectaddress.c:883 commands/matview.c:171 commands/tablecmds.c:226 -#: commands/tablecmds.c:11254 +#: access/transam/xlogrecovery.c:4093 #, c-format -msgid "\"%s\" is not a materialized view" -msgstr "\"%s\" não é uma visão materializada" +msgid "new target timeline is %u" +msgstr "nova linha do tempo é %u" -#: catalog/objectaddress.c:890 commands/tablecmds.c:244 -#: commands/tablecmds.c:4157 commands/tablecmds.c:11259 +#: access/transam/xlogrecovery.c:4296 #, c-format -msgid "\"%s\" is not a foreign table" -msgstr "\"%s\" não é uma tabela externa" +msgid "WAL receiver process shutdown requested" +msgstr "solicitado o desligamento do processo receptor de WAL" -#: catalog/objectaddress.c:1028 +#: access/transam/xlogrecovery.c:4356 #, c-format -msgid "column name must be qualified" -msgstr "nome da coluna deve ser qualificado" +msgid "received promote request" +msgstr "pedido de promoção foi recebido" -#: catalog/objectaddress.c:1083 commands/functioncmds.c:126 -#: commands/tablecmds.c:236 commands/typecmds.c:3253 parser/parse_type.c:222 -#: parser/parse_type.c:251 parser/parse_type.c:795 utils/adt/acl.c:4374 -#: utils/adt/regproc.c:1165 +#: access/transam/xlogrecovery.c:4585 #, c-format -msgid "type \"%s\" does not exist" -msgstr "tipo \"%s\" não existe" +msgid "hot standby is not possible because of insufficient parameter settings" +msgstr "" -#: catalog/objectaddress.c:1240 libpq/be-fsstubs.c:352 +#: access/transam/xlogrecovery.c:4586 access/transam/xlogrecovery.c:4613 +#: access/transam/xlogrecovery.c:4643 #, c-format -msgid "must be owner of large object %u" -msgstr "deve ser dono do objeto grande %u" +msgid "%s = %d is a lower setting than on the primary server, where its value was %d." +msgstr "%s = %d é uma configuração mais baixa do que no servidor primário, onde seu valor era %d." -#: catalog/objectaddress.c:1255 commands/functioncmds.c:1328 +#: access/transam/xlogrecovery.c:4595 #, c-format -msgid "must be owner of type %s or type %s" -msgstr "deve ser dono do tipo %s ou tipo %s" +msgid "If recovery is unpaused, the server will shut down." +msgstr "" -#: catalog/objectaddress.c:1286 catalog/objectaddress.c:1302 +#: access/transam/xlogrecovery.c:4596 #, c-format -msgid "must be superuser" -msgstr "deve ser super-usuário" +msgid "You can then restart the server after making the necessary configuration changes." +msgstr "" -#: catalog/objectaddress.c:1293 +#: access/transam/xlogrecovery.c:4607 #, c-format -msgid "must have CREATEROLE privilege" -msgstr "deve ter privilégio CREATEROLE" +msgid "promotion is not possible because of insufficient parameter settings" +msgstr "a promoção não é possível devido a configurações de parâmetros insuficiente" -#: catalog/objectaddress.c:1539 +#: access/transam/xlogrecovery.c:4617 #, c-format -msgid " column %s" -msgstr "coluna %s" +msgid "Restart the server after making the necessary configuration changes." +msgstr "Reinicie o servidor após fazer as alterações necessárias na configuração." -#: catalog/objectaddress.c:1545 +#: access/transam/xlogrecovery.c:4641 #, c-format -msgid "function %s" -msgstr "função %s" +msgid "recovery aborted because of insufficient parameter settings" +msgstr "" -#: catalog/objectaddress.c:1550 +#: access/transam/xlogrecovery.c:4647 #, c-format -msgid "type %s" -msgstr "tipo %s" +msgid "You can restart the server after making the necessary configuration changes." +msgstr "" -#: catalog/objectaddress.c:1580 +#: access/transam/xlogrecovery.c:4689 #, c-format -msgid "cast from %s to %s" -msgstr "converte de %s para %s" +msgid "multiple recovery targets specified" +msgstr "especificados múltiplos alvos de recuperação" -#: catalog/objectaddress.c:1600 +#: access/transam/xlogrecovery.c:4690 #, c-format -msgid "collation %s" -msgstr "ordenação %s" +msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." +msgstr "" -#: catalog/objectaddress.c:1624 +#: access/transam/xlogrecovery.c:4701 #, c-format -msgid "constraint %s on %s" -msgstr "restrição %s em %s" +msgid "The only allowed value is \"immediate\"." +msgstr "O único valor permitido é \"immediate\"." -#: catalog/objectaddress.c:1630 +#: access/transam/xlogrecovery.c:4853 utils/adt/timestamp.c:186 +#: utils/adt/timestamp.c:439 #, c-format -msgid "constraint %s" -msgstr "restrição %s" +msgid "timestamp out of range: \"%s\"" +msgstr "timestamp fora do intervalo: \"%s\"" -#: catalog/objectaddress.c:1647 +#: access/transam/xlogrecovery.c:4898 #, c-format -msgid "conversion %s" -msgstr "conversão %s" +msgid "recovery_target_timeline is not a valid number." +msgstr "recovery_target_timeline não é um número válido." -#: catalog/objectaddress.c:1684 +#: access/transam/xlogutils.c:1039 #, c-format -msgid "default for %s" -msgstr "valor padrão para %s" +msgid "could not read from WAL segment %s, offset %d: %m" +msgstr "não foi possível ler o segmento do WAL %s, deslocamento %d: %m" -#: catalog/objectaddress.c:1701 +#: access/transam/xlogutils.c:1046 #, c-format -msgid "language %s" -msgstr "linguagem %s" +msgid "could not read from WAL segment %s, offset %d: read %d of %d" +msgstr "não foi possível ler o segmento do WAL %s, deslocamento %d: leitura %d de %d" -#: catalog/objectaddress.c:1707 +#: archive/shell_archive.c:96 #, c-format -msgid "large object %u" -msgstr "objeto grande %u" +msgid "archive command failed with exit code %d" +msgstr "comando de arquivamento falhou com código de retorno %d" -#: catalog/objectaddress.c:1712 +#: archive/shell_archive.c:98 archive/shell_archive.c:108 +#: archive/shell_archive.c:114 archive/shell_archive.c:123 #, c-format -msgid "operator %s" -msgstr "operador %s" +msgid "The failed archive command was: %s" +msgstr "O comando de arquivamento que falhou foi: %s" -#: catalog/objectaddress.c:1744 +#: archive/shell_archive.c:105 #, c-format -msgid "operator class %s for access method %s" -msgstr "classe de operadores %s para método de acesso %s" +msgid "archive command was terminated by exception 0x%X" +msgstr "comando de arquivamento foi terminado pela exceção 0x%X" -#. translator: %d is the operator strategy (a number), the -#. first two %s's are data type names, the third %s is the -#. description of the operator family, and the last %s is the -#. textual form of the operator with arguments. -#: catalog/objectaddress.c:1794 +#: archive/shell_archive.c:107 postmaster/postmaster.c:3678 #, c-format -msgid "operator %d (%s, %s) of %s: %s" -msgstr "operador %d (%s, %s) de %s: %s" +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "Veja o arquivo de cabeçalho C \"ntstatus.h\" para obter uma descrição do valor hexadecimal." -#. translator: %d is the function number, the first two %s's -#. are data type names, the third %s is the description of the -#. operator family, and the last %s is the textual form of the -#. function with arguments. -#: catalog/objectaddress.c:1844 +#: archive/shell_archive.c:112 #, c-format -msgid "function %d (%s, %s) of %s: %s" -msgstr "função %d (%s, %s) de %s: %s" +msgid "archive command was terminated by signal %d: %s" +msgstr "comando de arquivamento foi terminado pelo sinal %d: %s" -#: catalog/objectaddress.c:1884 +#: archive/shell_archive.c:121 #, c-format -msgid "rule %s on " -msgstr "regra %s em " +msgid "archive command exited with unrecognized status %d" +msgstr "comando de arquivamento terminou com status desconhecido %d" -#: catalog/objectaddress.c:1919 +#: backup/backup_manifest.c:253 #, c-format -msgid "trigger %s on " -msgstr "gatilho %s em " +msgid "expected end timeline %u but found timeline %u" +msgstr "esperada linha do tempo final %u, mas encontrada linha do tempo %u" -#: catalog/objectaddress.c:1936 +#: backup/backup_manifest.c:277 #, c-format -msgid "schema %s" -msgstr "esquema %s" +msgid "expected start timeline %u but found timeline %u" +msgstr "esperada linha do tempo de início %u, mas encontrada linha do tempo %u" -#: catalog/objectaddress.c:1949 +#: backup/backup_manifest.c:304 #, c-format -msgid "text search parser %s" -msgstr "analisador de busca textual %s" +msgid "start timeline %u not found in history of timeline %u" +msgstr "linha do tempo inicial %u não encontrada no histórico de linha do tempo %u" -#: catalog/objectaddress.c:1964 +#: backup/backup_manifest.c:355 #, c-format -msgid "text search dictionary %s" -msgstr "dicionário de busca textual %s" +msgid "could not rewind temporary file" +msgstr "não foi possível retroceder o arquivo temporário" -#: catalog/objectaddress.c:1979 +#: backup/basebackup.c:470 #, c-format -msgid "text search template %s" -msgstr "modelo de busca textual %s" +msgid "could not find any WAL files" +msgstr "não foi possível encontrar os arquivos do WAL" -#: catalog/objectaddress.c:1994 +#: backup/basebackup.c:485 backup/basebackup.c:500 backup/basebackup.c:509 #, c-format -msgid "text search configuration %s" -msgstr "configuração de busca textual %s" +msgid "could not find WAL file \"%s\"" +msgstr "não foi possível encontrar os arquivo do WAL \"%s\"" -#: catalog/objectaddress.c:2002 +#: backup/basebackup.c:551 backup/basebackup.c:576 #, c-format -msgid "role %s" -msgstr "role %s" +msgid "unexpected WAL file size \"%s\"" +msgstr "tamanho de arquivo do WAL \"%s\" não esperado" -#: catalog/objectaddress.c:2015 +#: backup/basebackup.c:646 #, c-format -msgid "database %s" -msgstr "banco de dados %s" +msgid "%lld total checksum verification failure" +msgid_plural "%lld total checksum verification failures" +msgstr[0] "%lld falha ao verificar a soma de verificação total" +msgstr[1] "%lld falhas ao verificar a soma de verificação total" -#: catalog/objectaddress.c:2027 +#: backup/basebackup.c:653 #, c-format -msgid "tablespace %s" -msgstr "tablespace %s" +msgid "checksum verification failure during base backup" +msgstr "falha na verificação da soma de verificação durante a cópia de segurança base" -#: catalog/objectaddress.c:2036 +#: backup/basebackup.c:722 backup/basebackup.c:731 backup/basebackup.c:742 +#: backup/basebackup.c:759 backup/basebackup.c:768 backup/basebackup.c:779 +#: backup/basebackup.c:796 backup/basebackup.c:805 backup/basebackup.c:817 +#: backup/basebackup.c:841 backup/basebackup.c:855 backup/basebackup.c:866 +#: backup/basebackup.c:877 backup/basebackup.c:890 #, c-format -msgid "foreign-data wrapper %s" -msgstr "adaptador de dados externos %s" +msgid "duplicate option \"%s\"" +msgstr "opção \"%s\" duplicada" -#: catalog/objectaddress.c:2045 +#: backup/basebackup.c:750 #, c-format -msgid "server %s" -msgstr "servidor %s" +msgid "unrecognized checkpoint type: \"%s\"" +msgstr "tipo de ponto de verificação não reconhecido: \"%s\"" -#: catalog/objectaddress.c:2070 +#: backup/basebackup.c:785 #, c-format -msgid "user mapping for %s" -msgstr "mapeamento de usuários para %s" +msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "%d está fora do intervalo válido para parâmetro \"%s\" (%d .. %d)" -#: catalog/objectaddress.c:2104 +#: backup/basebackup.c:830 #, c-format -msgid "default privileges on new relations belonging to role %s" -msgstr "privilégios padrão em novas relações pertencem a role %s" +msgid "unrecognized manifest option: \"%s\"" +msgstr "opção de manifesto não reconhecida: \"%s\"" -#: catalog/objectaddress.c:2109 +#: backup/basebackup.c:846 #, c-format -msgid "default privileges on new sequences belonging to role %s" -msgstr "privilégios padrão em novas sequências pertencem a role %s" +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "algoritmo de soma de verificação não reconhecido: \"%s\"" -#: catalog/objectaddress.c:2114 +#: backup/basebackup.c:881 #, c-format -msgid "default privileges on new functions belonging to role %s" -msgstr "privilégios padrão em novas funções pertencem a role %s" +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "algoritmo de cmpressão não reconhecido: \"%s\"" -#: catalog/objectaddress.c:2119 +#: backup/basebackup.c:897 #, c-format -msgid "default privileges on new types belonging to role %s" -msgstr "privilégios padrão em novos tipos pertencem a role %s" +msgid "unrecognized base backup option: \"%s\"" +msgstr "opção de cópia de segurança base não reconhecida: \"%s\"" -#: catalog/objectaddress.c:2125 +#: backup/basebackup.c:908 #, c-format -msgid "default privileges belonging to role %s" -msgstr "privilégios padrão pertencem a role %s" +msgid "manifest checksums require a backup manifest" +msgstr "" -#: catalog/objectaddress.c:2133 +#: backup/basebackup.c:917 #, c-format -msgid " in schema %s" -msgstr " no esquema %s" +msgid "target detail cannot be used without target" +msgstr "detalhes do destino não podem ser usados sem destino" -#: catalog/objectaddress.c:2150 +#: backup/basebackup.c:926 backup/basebackup_target.c:218 #, c-format -msgid "extension %s" -msgstr "extensão %s" +msgid "target \"%s\" does not accept a target detail" +msgstr "o destino \"%s\" não aceita detalhe de destino" -#: catalog/objectaddress.c:2163 +#: backup/basebackup.c:937 #, c-format -msgid "event trigger %s" -msgstr "gatilho de eventos %s" +msgid "compression detail cannot be specified unless compression is enabled" +msgstr "os detalhes da compressão não podem ser especificados a menos que a compressão esteja ativada" -#: catalog/objectaddress.c:2223 +#: backup/basebackup.c:950 #, c-format -msgid "table %s" -msgstr "tabela %s" +msgid "invalid compression specification: %s" +msgstr "especificação de compressão inválida: %s" -#: catalog/objectaddress.c:2227 +#: backup/basebackup.c:1116 backup/basebackup.c:1294 #, c-format -msgid "index %s" -msgstr "índice %s" +msgid "could not stat file or directory \"%s\": %m" +msgstr "não foi possível executar stat no arquivo ou diretório \"%s\": %m" -#: catalog/objectaddress.c:2231 +#: backup/basebackup.c:1430 #, c-format -msgid "sequence %s" -msgstr "sequência %s" +msgid "skipping special file \"%s\"" +msgstr "ignorando arquivo especial \"%s\"" -#: catalog/objectaddress.c:2235 +#: backup/basebackup.c:1542 #, c-format -msgid "toast table %s" -msgstr "tabela toast %s" +msgid "invalid segment number %d in file \"%s\"" +msgstr "número de segmento inválido %d no arquivo \"%s\"" -#: catalog/objectaddress.c:2239 +#: backup/basebackup.c:1574 #, c-format -msgid "view %s" -msgstr "visão %s" +msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" +msgstr "" -#: catalog/objectaddress.c:2243 +#: backup/basebackup.c:1658 #, c-format -msgid "materialized view %s" -msgstr "visão materializada %s" +msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" +msgstr "verificação de soma de verificação falhou no arquivo \"%s\", bloco %u: calculado %X, mas esperado %X" -#: catalog/objectaddress.c:2247 +#: backup/basebackup.c:1665 #, c-format -msgid "composite type %s" -msgstr "tipo composto %s" +msgid "further checksum verification failures in file \"%s\" will not be reported" +msgstr "" -#: catalog/objectaddress.c:2251 +#: backup/basebackup.c:1721 #, c-format -msgid "foreign table %s" -msgstr "tabela externa %s" +msgid "file \"%s\" has a total of %d checksum verification failure" +msgid_plural "file \"%s\" has a total of %d checksum verification failures" +msgstr[0] "" +msgstr[1] "" -#: catalog/objectaddress.c:2256 +#: backup/basebackup.c:1767 #, c-format -msgid "relation %s" -msgstr "relação %s" +msgid "file name too long for tar format: \"%s\"" +msgstr "nome do arquivo muito longo para o formato tar: \"%s\"" -#: catalog/objectaddress.c:2293 +#: backup/basebackup.c:1772 #, c-format -msgid "operator family %s for access method %s" -msgstr "família de operadores %s para método de acesso %s" +msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" +msgstr "" -#: catalog/pg_aggregate.c:118 +#: backup/basebackup_gzip.c:67 #, c-format -msgid "aggregates cannot have more than %d argument" -msgid_plural "aggregates cannot have more than %d arguments" -msgstr[0] "agregações não podem ter mais do que %d argumento" -msgstr[1] "agregações não podem ter mais do que %d argumentos" +msgid "gzip compression is not supported by this build" +msgstr "a compressão gzip não tem suporte por essa construção" -#: catalog/pg_aggregate.c:141 catalog/pg_aggregate.c:151 +#: backup/basebackup_gzip.c:143 #, c-format -msgid "cannot determine transition data type" -msgstr "não pode determinar tipo de dado transitório" +msgid "could not initialize compression library" +msgstr "não foi possível inicializar a biblioteca de compressão" -#: catalog/pg_aggregate.c:142 catalog/pg_aggregate.c:152 +#: backup/basebackup_lz4.c:67 #, c-format -msgid "An aggregate using a polymorphic transition type must have at least one polymorphic argument." -msgstr "Uma agregação utilizando um tipo transitório polimórfico deve ter pelo menos um argumento polimórfico." +msgid "lz4 compression is not supported by this build" +msgstr "a compressão lz4 não tem suporte por esta construção" -#: catalog/pg_aggregate.c:165 +#: backup/basebackup_server.c:75 #, c-format -msgid "a variadic ordered-set aggregate must use VARIADIC type ANY" -msgstr "uma agregação de conjunto ordenado VARIADIC deve utilizar tipo VARIADIC ANY" +msgid "permission denied to create backup stored on server" +msgstr "permissão negada para criar cópia de segurança armazenada no servidor" -#: catalog/pg_aggregate.c:191 +#: backup/basebackup_server.c:76 #, c-format -msgid "a hypothetical-set aggregate must have direct arguments matching its aggregated arguments" -msgstr "uma agregação de conjunto hipotético deve ter argumentos diretos correspondendo a seus argumentos agregados" +msgid "Only roles with privileges of the \"%s\" role may create a backup stored on the server." +msgstr "" -#: catalog/pg_aggregate.c:238 catalog/pg_aggregate.c:282 +#: backup/basebackup_server.c:91 #, c-format -msgid "return type of transition function %s is not %s" -msgstr "tipo retornado da função de transição %s não é %s" +msgid "relative path not allowed for backup stored on server" +msgstr "caminho relativo não permitido para cópia de segurança armazenada no servidor" -#: catalog/pg_aggregate.c:258 catalog/pg_aggregate.c:301 +#: backup/basebackup_server.c:104 commands/dbcommands.c:501 +#: commands/tablespace.c:163 commands/tablespace.c:179 +#: commands/tablespace.c:599 commands/tablespace.c:644 replication/slot.c:1704 +#: storage/file/copydir.c:47 #, c-format -msgid "must not omit initial value when transition function is strict and transition type is not compatible with input type" -msgstr "não deve omitir valor inicial quando a função de transição é estrita e o tipo de transição não é compatível com tipo de entrada" +msgid "could not create directory \"%s\": %m" +msgstr "não foi possível criar o diretório \"%s\": %m" -#: catalog/pg_aggregate.c:327 +#: backup/basebackup_server.c:117 #, c-format -msgid "return type of inverse transition function %s is not %s" -msgstr "tipo retornado da função de transição inversa %s não é %s" +msgid "directory \"%s\" exists but is not empty" +msgstr "diretório \"%s\" existe mas não está vazio" -#: catalog/pg_aggregate.c:344 executor/nodeWindowAgg.c:2301 +#: backup/basebackup_server.c:125 utils/init/postinit.c:1164 #, c-format -msgid "strictness of aggregate's forward and inverse transition functions must match" -msgstr "propriedade STRICT das funções de transição direta e inversa de uma agregação devem corresponder" +msgid "could not access directory \"%s\": %m" +msgstr "não foi possível acessar o diretório \"%s\": %m" -#: catalog/pg_aggregate.c:388 catalog/pg_aggregate.c:464 +#: backup/basebackup_server.c:177 backup/basebackup_server.c:184 +#: backup/basebackup_server.c:270 backup/basebackup_server.c:277 +#: storage/smgr/md.c:504 storage/smgr/md.c:511 storage/smgr/md.c:593 +#: storage/smgr/md.c:615 storage/smgr/md.c:865 #, c-format -msgid "final function with extra arguments must not be declared STRICT" -msgstr "função final com argumentos extras não deve ser declarada STRICT" +msgid "Check free disk space." +msgstr "Verifique o espaço em disco livre." -#: catalog/pg_aggregate.c:410 catalog/pg_proc.c:241 catalog/pg_proc.c:248 +#: backup/basebackup_server.c:181 backup/basebackup_server.c:274 #, c-format -msgid "cannot determine result data type" -msgstr "não pode determinar tipo de dado do resultado" +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "não foi possível escrever no arquivo \"%s\": escritos apenas %d de %d bytes no deslocamento %u" -#: catalog/pg_aggregate.c:411 +#: backup/basebackup_target.c:146 #, c-format -msgid "An aggregate returning a polymorphic type must have at least one polymorphic argument." -msgstr "Uma agregação retornando um tipo polimórfico deve ter pelo menos um argumento polimórfico." +msgid "unrecognized target: \"%s\"" +msgstr "destino não reconhecido: \"%s\"" -#: catalog/pg_aggregate.c:423 catalog/pg_proc.c:254 +#: backup/basebackup_target.c:237 #, c-format -msgid "unsafe use of pseudo-type \"internal\"" -msgstr "uso inseguro do pseudo-tipo \"internal\"" +msgid "target \"%s\" requires a target detail" +msgstr "o destino \"%s\" requer detalhe do destino" -#: catalog/pg_aggregate.c:424 catalog/pg_proc.c:255 +#: backup/basebackup_zstd.c:66 #, c-format -msgid "A function returning \"internal\" must have at least one \"internal\" argument." -msgstr "Uma função retornando \"internal\" deve ter pelo menos um argumento \"internal\"." +msgid "zstd compression is not supported by this build" +msgstr "a compressão zstd não tem suporte por esta construção" -#: catalog/pg_aggregate.c:477 +#: backup/basebackup_zstd.c:117 #, c-format -msgid "moving-aggregate implementation returns type %s, but plain implementation returns type %s" -msgstr "implementação de agregação em movimento retorna tipo %s, mas implementação simples retorna tipo %s" +msgid "could not set compression worker count to %d: %s" +msgstr "não foi possível definir a contagem de processo trabalhador de compressão para %d: %s" -#: catalog/pg_aggregate.c:488 +#: backup/basebackup_zstd.c:129 #, c-format -msgid "sort operator can only be specified for single-argument aggregates" -msgstr "operador de ordenação só pode ser especificado por agregações de argumento único" +msgid "could not enable long-distance mode: %s" +msgstr "não foi possível ativar o modo de longa distância: %s" -#: catalog/pg_aggregate.c:701 commands/typecmds.c:1657 -#: commands/typecmds.c:1708 commands/typecmds.c:1739 commands/typecmds.c:1762 -#: commands/typecmds.c:1783 commands/typecmds.c:1810 commands/typecmds.c:1837 -#: commands/typecmds.c:1914 commands/typecmds.c:1956 parser/parse_func.c:357 -#: parser/parse_func.c:386 parser/parse_func.c:411 parser/parse_func.c:425 -#: parser/parse_func.c:500 parser/parse_func.c:511 parser/parse_func.c:1907 +#: bootstrap/bootstrap.c:243 postmaster/postmaster.c:721 tcop/postgres.c:3819 #, c-format -msgid "function %s does not exist" -msgstr "função %s não existe" +msgid "--%s requires a value" +msgstr "--%s requer um valor" -#: catalog/pg_aggregate.c:707 +#: bootstrap/bootstrap.c:248 postmaster/postmaster.c:726 tcop/postgres.c:3824 #, c-format -msgid "function %s returns a set" -msgstr "função %s retorna um conjunto" +msgid "-c %s requires a value" +msgstr "-c %s requer um valor" -#: catalog/pg_aggregate.c:722 +#: bootstrap/bootstrap.c:289 #, c-format -msgid "function %s must accept VARIADIC ANY to be used in this aggregate" -msgstr "função %s deve aceitar VARIADIC ANY ser utilizado nesta agregação" +msgid "-X requires a power of two value between 1 MB and 1 GB" +msgstr "" -#: catalog/pg_aggregate.c:746 +#: bootstrap/bootstrap.c:295 postmaster/postmaster.c:844 +#: postmaster/postmaster.c:857 #, c-format -msgid "function %s requires run-time type coercion" -msgstr "função %s requer conversão de tipo em tempo de execução" +msgid "Try \"%s --help\" for more information.\n" +msgstr "Tente \"%s --help\" para obter informações adicionais.\n" -#: catalog/pg_collation.c:77 +#: bootstrap/bootstrap.c:304 #, c-format -msgid "collation \"%s\" for encoding \"%s\" already exists" -msgstr "ordenação \"%s\" para codificação \"%s\" já existe" +msgid "%s: invalid command-line arguments\n" +msgstr "%s: argumentos de linha de comando são inválidos\n" -#: catalog/pg_collation.c:91 +#: catalog/aclchk.c:201 #, c-format -msgid "collation \"%s\" already exists" -msgstr "ordenação \"%s\" já existe" +msgid "grant options can only be granted to roles" +msgstr "opções de concessão só podem ser concedidas a funções de banco de dados (roles)" -#: catalog/pg_constraint.c:659 +#: catalog/aclchk.c:323 #, c-format -msgid "constraint \"%s\" for domain %s already exists" -msgstr "restrição \"%s\" para domínio %s já existe" +msgid "no privileges were granted for column \"%s\" of relation \"%s\"" +msgstr "nenhum privilégio foi concedido a coluna \"%s\" da relação \"%s\"" -#: catalog/pg_constraint.c:811 +#: catalog/aclchk.c:328 #, c-format -msgid "table \"%s\" has multiple constraints named \"%s\"" -msgstr "tabela \"%s\" tem múltiplas restrições com nome \"%s\"" +msgid "no privileges were granted for \"%s\"" +msgstr "nenhum privilégio foi concedido a \"%s\"" -#: catalog/pg_constraint.c:823 +#: catalog/aclchk.c:336 #, c-format -msgid "constraint \"%s\" for table \"%s\" does not exist" -msgstr "restrição \"%s\" na tabela \"%s\" não existe" +msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" +msgstr "nem todos privilégios foram concedidos a coluna \"%s\" da relação \"%s\"" -#: catalog/pg_constraint.c:869 +#: catalog/aclchk.c:341 #, c-format -msgid "domain \"%s\" has multiple constraints named \"%s\"" -msgstr "domínio \"%s\" tem múltiplas restrições com nome \"%s\"" +msgid "not all privileges were granted for \"%s\"" +msgstr "nem todos privilégios foram concedidos a \"%s\"" -#: catalog/pg_constraint.c:881 +#: catalog/aclchk.c:352 #, c-format -msgid "constraint \"%s\" for domain \"%s\" does not exist" -msgstr "restrição \"%s\" para domínio \"%s\" não existe" +msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" +msgstr "nenhum privilégio pôde ser revogado da coluna \"%s\" da relação \"%s\"" -#: catalog/pg_conversion.c:67 +#: catalog/aclchk.c:357 #, c-format -msgid "conversion \"%s\" already exists" -msgstr "conversão \"%s\" já existe" +msgid "no privileges could be revoked for \"%s\"" +msgstr "nenhum privilégio pôde ser revogado de \"%s\"" -#: catalog/pg_conversion.c:80 +#: catalog/aclchk.c:365 #, c-format -msgid "default conversion for %s to %s already exists" -msgstr "conversão padrão de %s para %s já existe" +msgid "not all privileges could be revoked for column \"%s\" of relation \"%s\"" +msgstr "nem todos privilégios podem ser revogados da coluna \"%s\" da relação \"%s\"" -#: catalog/pg_depend.c:165 commands/extension.c:2926 +#: catalog/aclchk.c:370 #, c-format -msgid "%s is already a member of extension \"%s\"" -msgstr "role \"%s\" já é um membro da extensão \"%s\"" +msgid "not all privileges could be revoked for \"%s\"" +msgstr "nem todos privilégios podem ser revogados de \"%s\"" -#: catalog/pg_depend.c:324 +#: catalog/aclchk.c:402 #, c-format -msgid "cannot remove dependency on %s because it is a system object" -msgstr "não pode remover dependência em %s porque ele é um objeto do sistema" +msgid "grantor must be current user" +msgstr "o concedente deve ser o usuário corrente" -#: catalog/pg_enum.c:115 catalog/pg_enum.c:202 +#: catalog/aclchk.c:470 catalog/aclchk.c:1045 #, c-format -msgid "invalid enum label \"%s\"" -msgstr "rótulo do enum \"%s\" é inválido" +msgid "invalid privilege type %s for relation" +msgstr "o tipo de privilégio %s não é válido para relação" -#: catalog/pg_enum.c:116 catalog/pg_enum.c:203 +#: catalog/aclchk.c:474 catalog/aclchk.c:1049 #, c-format -msgid "Labels must be %d characters or less." -msgstr "Rótulos devem conter %d caracteres ou menos." +msgid "invalid privilege type %s for sequence" +msgstr "o tipo de privilégio %s não é válido para sequência" -#: catalog/pg_enum.c:231 +#: catalog/aclchk.c:478 #, c-format -msgid "enum label \"%s\" already exists, skipping" -msgstr "rótulo do enum \"%s\" já existe, ignorando" +msgid "invalid privilege type %s for database" +msgstr "o tipo de privilégio %s não é válido para banco de dados" -#: catalog/pg_enum.c:238 +#: catalog/aclchk.c:482 #, c-format -msgid "enum label \"%s\" already exists" -msgstr "rótulo do enum \"%s\" já existe" +msgid "invalid privilege type %s for domain" +msgstr "o tipo de privilégio %s não é válido para domínio" -#: catalog/pg_enum.c:293 +#: catalog/aclchk.c:486 catalog/aclchk.c:1053 #, c-format -msgid "\"%s\" is not an existing enum label" -msgstr "\"%s\" não é um rótulo do enum existente" +msgid "invalid privilege type %s for function" +msgstr "o tipo de privilégio %s não é válido para função" -#: catalog/pg_enum.c:354 +#: catalog/aclchk.c:490 #, c-format -msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" -msgstr "ALTER TYPE ADD BEFORE/AFTER é incompatível com atualização binária" +msgid "invalid privilege type %s for language" +msgstr "o tipo de privilégio %s não é válido para linguagem" -#: catalog/pg_namespace.c:61 commands/schemacmds.c:220 +#: catalog/aclchk.c:494 #, c-format -msgid "schema \"%s\" already exists" -msgstr "esquema \"%s\" já existe" +msgid "invalid privilege type %s for large object" +msgstr "o tipo de privilégio %s não é válido para objeto grande" -#: catalog/pg_operator.c:222 catalog/pg_operator.c:362 +#: catalog/aclchk.c:498 catalog/aclchk.c:1069 #, c-format -msgid "\"%s\" is not a valid operator name" -msgstr "\"%s\" não é um nome de operador válido" +msgid "invalid privilege type %s for schema" +msgstr "o tipo de privilégio %s não é válido para esquema" -#: catalog/pg_operator.c:371 +#: catalog/aclchk.c:502 catalog/aclchk.c:1057 #, c-format -msgid "only binary operators can have commutators" -msgstr "somente operadores binários podem ter comutadores" +msgid "invalid privilege type %s for procedure" +msgstr "o tipo de privilégio inválido %s para procedimento" -#: catalog/pg_operator.c:375 +#: catalog/aclchk.c:506 catalog/aclchk.c:1061 #, c-format -msgid "only binary operators can have join selectivity" -msgstr "somente operadores binários podem ter seletividade de junção" +msgid "invalid privilege type %s for routine" +msgstr "tipo de privilégio inválido %s para rotina" -#: catalog/pg_operator.c:379 +#: catalog/aclchk.c:510 #, c-format -msgid "only binary operators can merge join" -msgstr "somente operadores binários podem ser utilizados em junção por mesclagem" +msgid "invalid privilege type %s for tablespace" +msgstr "tipo de privilégio %s não é válido para espaço de tabelas" -#: catalog/pg_operator.c:383 +#: catalog/aclchk.c:514 catalog/aclchk.c:1065 #, c-format -msgid "only binary operators can hash" -msgstr "somente operadores binários podem ser utilizados no hash" +msgid "invalid privilege type %s for type" +msgstr "o tipo de privilégio %s não é válido para tipo de ddaos" -#: catalog/pg_operator.c:394 +#: catalog/aclchk.c:518 #, c-format -msgid "only boolean operators can have negators" -msgstr "somente operadores booleanos podem ter negadores" +msgid "invalid privilege type %s for foreign-data wrapper" +msgstr "o tipo de privilégio %s não é válido para empacotador de dados estrangeiros" -#: catalog/pg_operator.c:398 +#: catalog/aclchk.c:522 #, c-format -msgid "only boolean operators can have restriction selectivity" -msgstr "somente operadores booleanos podem ter seletividade de restrição" +msgid "invalid privilege type %s for foreign server" +msgstr "o tipo de privilégio %s não é válido para servidor estrangeiro" -#: catalog/pg_operator.c:402 +#: catalog/aclchk.c:526 #, c-format -msgid "only boolean operators can have join selectivity" -msgstr "somente operadores booleanos podem ter seletividade de junção" +msgid "invalid privilege type %s for parameter" +msgstr "o tipo de privilégio inválido %s para parâmetro" -#: catalog/pg_operator.c:406 +#: catalog/aclchk.c:565 #, c-format -msgid "only boolean operators can merge join" -msgstr "somente operadores booleanos podem ser utilizados em junção por mesclagem" +msgid "column privileges are only valid for relations" +msgstr "privilégios de coluna só são válidos para relações" -#: catalog/pg_operator.c:410 +#: catalog/aclchk.c:728 catalog/aclchk.c:3555 catalog/objectaddress.c:1092 +#: catalog/pg_largeobject.c:116 storage/large_object/inv_api.c:286 #, c-format -msgid "only boolean operators can hash" -msgstr "somente operadores booleanos podem ser utilizados no hash" +msgid "large object %u does not exist" +msgstr "objeto grande %u não existe" -#: catalog/pg_operator.c:422 +#: catalog/aclchk.c:1102 #, c-format -msgid "operator %s already exists" -msgstr "operador %s já existe" +msgid "default privileges cannot be set for columns" +msgstr "privilégios padrão não podem ser definidos para colunas" -#: catalog/pg_operator.c:615 +#: catalog/aclchk.c:1138 #, c-format -msgid "operator cannot be its own negator or sort operator" -msgstr "operador não pode ser seu próprio operador de negação ou de ordenação" +msgid "permission denied to change default privileges" +msgstr "permissão negada para alterar privilégios padrão" -#: catalog/pg_proc.c:129 parser/parse_func.c:1931 parser/parse_func.c:1971 +#: catalog/aclchk.c:1256 #, c-format -msgid "functions cannot have more than %d argument" -msgid_plural "functions cannot have more than %d arguments" -msgstr[0] "funções não podem ter mais do que %d argumento" -msgstr[1] "funções não podem ter mais do que %d argumentos" +msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" +msgstr "" -#: catalog/pg_proc.c:242 +#: catalog/aclchk.c:1595 catalog/catalog.c:631 catalog/objectaddress.c:1561 +#: catalog/pg_publication.c:533 commands/analyze.c:390 commands/copy.c:837 +#: commands/sequence.c:1663 commands/tablecmds.c:7339 commands/tablecmds.c:7495 +#: commands/tablecmds.c:7545 commands/tablecmds.c:7619 +#: commands/tablecmds.c:7689 commands/tablecmds.c:7805 +#: commands/tablecmds.c:7899 commands/tablecmds.c:7958 +#: commands/tablecmds.c:8047 commands/tablecmds.c:8077 +#: commands/tablecmds.c:8205 commands/tablecmds.c:8287 +#: commands/tablecmds.c:8421 commands/tablecmds.c:8529 +#: commands/tablecmds.c:12244 commands/tablecmds.c:12425 +#: commands/tablecmds.c:12586 commands/tablecmds.c:13748 +#: commands/tablecmds.c:16279 commands/trigger.c:949 parser/analyze.c:2518 +#: parser/parse_relation.c:737 parser/parse_target.c:1054 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3413 +#: parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2876 +#: utils/adt/ruleutils.c:2799 #, c-format -msgid "A function returning a polymorphic type must have at least one polymorphic argument." -msgstr "Uma função retornando um tipo polimórfico deve ter pelo menos um argumento polimórfico." +msgid "column \"%s\" of relation \"%s\" does not exist" +msgstr "coluna \"%s\" da relação \"%s\" não existe" -#: catalog/pg_proc.c:249 +#: catalog/aclchk.c:1840 #, c-format -msgid "A function returning \"anyrange\" must have at least one \"anyrange\" argument." -msgstr "Uma função retornando \"anyrange\" deve ter pelo menos um argumento \"anyrange\"." +msgid "\"%s\" is an index" +msgstr "\"%s\" é um índice" -#: catalog/pg_proc.c:267 +#: catalog/aclchk.c:1847 commands/tablecmds.c:13905 commands/tablecmds.c:17186 #, c-format -msgid "\"%s\" is already an attribute of type %s" -msgstr "\"%s\" já é um atributo do tipo %s" +msgid "\"%s\" is a composite type" +msgstr "\"%s\" é um tipo composto" -#: catalog/pg_proc.c:393 +#: catalog/aclchk.c:1855 catalog/objectaddress.c:1401 commands/sequence.c:1171 +#: commands/tablecmds.c:254 commands/tablecmds.c:17150 utils/adt/acl.c:2084 +#: utils/adt/acl.c:2114 utils/adt/acl.c:2146 utils/adt/acl.c:2178 +#: utils/adt/acl.c:2206 utils/adt/acl.c:2236 #, c-format -msgid "function \"%s\" already exists with same argument types" -msgstr "função \"%s\" já existe com os mesmos tipos de argumento" +msgid "\"%s\" is not a sequence" +msgstr "\"%s\" não é uma sequência" -#: catalog/pg_proc.c:407 catalog/pg_proc.c:430 +#: catalog/aclchk.c:1893 #, c-format -msgid "cannot change return type of existing function" -msgstr "não pode mudar o tipo de retorno da função existente" +msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" +msgstr "a sequência \"%s\" dá suporte aos privilégios USAGE, SELECT e UPDATE" -#: catalog/pg_proc.c:408 catalog/pg_proc.c:432 catalog/pg_proc.c:475 -#: catalog/pg_proc.c:499 catalog/pg_proc.c:526 +#: catalog/aclchk.c:1910 #, c-format -msgid "Use DROP FUNCTION %s first." -msgstr "Primeiro utilize DROP FUNCTION %s." +msgid "invalid privilege type %s for table" +msgstr "tipo de privilégio inválido %s para tabela" -#: catalog/pg_proc.c:431 +#: catalog/aclchk.c:2072 #, c-format -msgid "Row type defined by OUT parameters is different." -msgstr "Tipo de registro definido pelos parâmetros OUT é diferente." +msgid "invalid privilege type %s for column" +msgstr "tipo de privilégio %s não é válido para coluna" -#: catalog/pg_proc.c:473 +#: catalog/aclchk.c:2085 #, c-format -msgid "cannot change name of input parameter \"%s\"" -msgstr "não pode mudar nome de parâmetro de entrada \"%s\"" +msgid "sequence \"%s\" only supports SELECT column privileges" +msgstr "sequência \"%s\" só tem suporte para privilégios SELECT" -#: catalog/pg_proc.c:498 +#: catalog/aclchk.c:2275 #, c-format -msgid "cannot remove parameter defaults from existing function" -msgstr "não pode remover valores padrão de parâmetros da função existente" +msgid "language \"%s\" is not trusted" +msgstr "a linguagem \"%s\" não é confiável" -#: catalog/pg_proc.c:525 +#: catalog/aclchk.c:2277 #, c-format -msgid "cannot change data type of existing parameter default value" -msgstr "não pode mudar o tipo de dado do valor padrão do parâmetro existente" +msgid "GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages." +msgstr "GRANT e REVOKE não são permitidos em linguagens não confiáveis, porque somente superusuários podem usar linguagens não confiáveis." -#: catalog/pg_proc.c:538 +#: catalog/aclchk.c:2427 #, c-format -msgid "function \"%s\" is an aggregate function" -msgstr "função \"%s\" é uma função de agregação" +msgid "cannot set privileges of array types" +msgstr "não é possível definir privilégios para tipos matriz" -#: catalog/pg_proc.c:543 +#: catalog/aclchk.c:2428 #, c-format -msgid "function \"%s\" is not an aggregate function" -msgstr "função \"%s\" não é uma função de agregação" +msgid "Set the privileges of the element type instead." +msgstr "Defina os privilégios do tipo do elemento." -#: catalog/pg_proc.c:551 +#: catalog/aclchk.c:2435 catalog/objectaddress.c:1667 #, c-format -msgid "function \"%s\" is a window function" -msgstr "função \"%s\" é uma função deslizante" +msgid "\"%s\" is not a domain" +msgstr "\"%s\" não é um domínio" -#: catalog/pg_proc.c:556 +#: catalog/aclchk.c:2619 #, c-format -msgid "function \"%s\" is not a window function" -msgstr "função \"%s\" não é uma função deslizante" +msgid "unrecognized privilege type \"%s\"" +msgstr "tipo de privilégio \"%s\" desconhecido" -#: catalog/pg_proc.c:746 +#: catalog/aclchk.c:2684 #, c-format -msgid "there is no built-in function named \"%s\"" -msgstr "não há nenhuma função embutida com nome \"%s\"" +msgid "permission denied for aggregate %s" +msgstr "permissão negada para agregação %s" -#: catalog/pg_proc.c:844 +#: catalog/aclchk.c:2687 #, c-format -msgid "SQL functions cannot return type %s" -msgstr "funções SQL não podem retornar tipo %s" +msgid "permission denied for collation %s" +msgstr "permissão negada para ordenação %s" -#: catalog/pg_proc.c:859 +#: catalog/aclchk.c:2690 #, c-format -msgid "SQL functions cannot have arguments of type %s" -msgstr "funções SQL não podem ter argumentos do tipo %s" +msgid "permission denied for column %s" +msgstr "permissão negada para coluna %s" -#: catalog/pg_proc.c:945 executor/functions.c:1418 +#: catalog/aclchk.c:2693 #, c-format -msgid "SQL function \"%s\"" -msgstr "função SQL \"%s\"" +msgid "permission denied for conversion %s" +msgstr "permissão negada para conversão %s" -#: catalog/pg_shdepend.c:691 +#: catalog/aclchk.c:2696 #, c-format -msgid "" -"\n" -"and objects in %d other database (see server log for list)" -msgid_plural "" -"\n" -"and objects in %d other databases (see server log for list)" -msgstr[0] "" -"\n" -"e objetos em %d outro banco de dados (veja lista no log do servidor)" -msgstr[1] "" -"\n" -"e objetos em %d outros bancos de dados (veja lista no log do servidor)" +msgid "permission denied for database %s" +msgstr "permissão negada para banco de dados %s" -#: catalog/pg_shdepend.c:1003 +#: catalog/aclchk.c:2699 #, c-format -msgid "role %u was concurrently dropped" -msgstr "role %u foi removida simultaneamente" +msgid "permission denied for domain %s" +msgstr "permissão negada para domínio %s" -#: catalog/pg_shdepend.c:1022 +#: catalog/aclchk.c:2702 #, c-format -msgid "tablespace %u was concurrently dropped" -msgstr "tablespace %u foi removida simultaneamente" +msgid "permission denied for event trigger %s" +msgstr "permissão negada para gatilho de eventos %s" -#: catalog/pg_shdepend.c:1037 +#: catalog/aclchk.c:2705 #, c-format -msgid "database %u was concurrently dropped" -msgstr "banco de dados %u foi removido simultaneamente" +msgid "permission denied for extension %s" +msgstr "permissão negada para extensão %s" -#: catalog/pg_shdepend.c:1081 +#: catalog/aclchk.c:2708 #, c-format -msgid "owner of %s" -msgstr "dono de %s" +msgid "permission denied for foreign-data wrapper %s" +msgstr "permissão negada para o empacotador de dados estrangeiros %s" -#: catalog/pg_shdepend.c:1083 +#: catalog/aclchk.c:2711 #, c-format -msgid "privileges for %s" -msgstr "privilégios para %s" +msgid "permission denied for foreign server %s" +msgstr "permissão negada para o servidor estrangeiro %s" -#. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1091 +#: catalog/aclchk.c:2714 #, c-format -msgid "%d object in %s" -msgid_plural "%d objects in %s" -msgstr[0] "%d objeto no %s" -msgstr[1] "%d objetos no %s" +msgid "permission denied for foreign table %s" +msgstr "permissão negada para a tabela estrangeira %s" -#: catalog/pg_shdepend.c:1202 +#: catalog/aclchk.c:2717 #, c-format -msgid "cannot drop objects owned by %s because they are required by the database system" -msgstr "não pode remover objetos que pertencem a %s porque eles são requeridos pelo sistema de banco de dados" +msgid "permission denied for function %s" +msgstr "permissão negada para função %s" -#: catalog/pg_shdepend.c:1305 +#: catalog/aclchk.c:2720 #, c-format -msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" -msgstr "não pode transferir objetos que pertencem a %s porque eles são requeridos pelo sistema de banco de dados" +msgid "permission denied for index %s" +msgstr "permissão negada para o índice %s" -#: catalog/pg_type.c:244 +#: catalog/aclchk.c:2723 #, c-format -msgid "invalid type internal size %d" -msgstr "tamanho interno de tipo %d é inválido" +msgid "permission denied for language %s" +msgstr "permissão negada para linguagem %s" -#: catalog/pg_type.c:260 catalog/pg_type.c:268 catalog/pg_type.c:276 -#: catalog/pg_type.c:285 +#: catalog/aclchk.c:2726 #, c-format -msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" -msgstr "alinhamento \"%c\" é inválido para tipo passado por valor de tamanho %d" +msgid "permission denied for large object %s" +msgstr "permissão negada para objeto grande %s" -#: catalog/pg_type.c:292 +#: catalog/aclchk.c:2729 #, c-format -msgid "internal size %d is invalid for passed-by-value type" -msgstr "tamanho interno %d é inválido para tipo passado por valor" +msgid "permission denied for materialized view %s" +msgstr "permissão negada para visão materializada %s" -#: catalog/pg_type.c:301 catalog/pg_type.c:307 +#: catalog/aclchk.c:2732 #, c-format -msgid "alignment \"%c\" is invalid for variable-length type" -msgstr "alinhamento \"%c\" é inválido para tipo de tamanho variável" +msgid "permission denied for operator class %s" +msgstr "permissão negada para classe de operadores %s" -#: catalog/pg_type.c:315 +#: catalog/aclchk.c:2735 #, c-format -msgid "fixed-size types must have storage PLAIN" -msgstr "tipos de tamanho fixo devem ter armazenamento PLAIN" +msgid "permission denied for operator %s" +msgstr "permissão negada para operador %s" -#: catalog/pg_type.c:773 +#: catalog/aclchk.c:2738 #, c-format -msgid "could not form array type name for type \"%s\"" -msgstr "não pôde construir nome de tipo array para tipo \"%s\"" +msgid "permission denied for operator family %s" +msgstr "permissão negada para família de operador %s" -#: catalog/toasting.c:104 commands/indexcmds.c:380 commands/tablecmds.c:4139 -#: commands/tablecmds.c:11137 +#: catalog/aclchk.c:2741 #, c-format -msgid "\"%s\" is not a table or materialized view" -msgstr "\"%s\" não é uma tabela ou visão materializada" +msgid "permission denied for parameter %s" +msgstr "permissão negada para parâmetro %s" -#: catalog/toasting.c:157 +#: catalog/aclchk.c:2744 #, c-format -msgid "shared tables cannot be toasted after initdb" -msgstr "tabelas compartilhadas não podem ser fatiadas após o initdb" +msgid "permission denied for policy %s" +msgstr "permissão negada para política %s" -#: commands/aggregatecmds.c:148 +#: catalog/aclchk.c:2747 #, c-format -msgid "only ordered-set aggregates can be hypothetical" -msgstr "somente agregações de conjunto ordenado podem ser hipotéticas" +msgid "permission denied for procedure %s" +msgstr "permissão negada para procedimento %s" -#: commands/aggregatecmds.c:171 +#: catalog/aclchk.c:2750 #, c-format -msgid "aggregate attribute \"%s\" not recognized" -msgstr "atributo da agregação \"%s\" desconhecido" +msgid "permission denied for publication %s" +msgstr "permissão negada para publicação %s" -#: commands/aggregatecmds.c:181 +#: catalog/aclchk.c:2753 #, c-format -msgid "aggregate stype must be specified" -msgstr "agregação stype deve ser especificada" +msgid "permission denied for routine %s" +msgstr "permissão negada para rotina %s" -#: commands/aggregatecmds.c:185 +#: catalog/aclchk.c:2756 #, c-format -msgid "aggregate sfunc must be specified" -msgstr "agregação sfunc deve ser especificada" +msgid "permission denied for schema %s" +msgstr "permissão negada para esquema %s" -#: commands/aggregatecmds.c:197 +#: catalog/aclchk.c:2759 commands/sequence.c:659 commands/sequence.c:885 +#: commands/sequence.c:927 commands/sequence.c:968 commands/sequence.c:1761 +#: commands/sequence.c:1810 #, c-format -msgid "aggregate msfunc must be specified when mstype is specified" -msgstr "agregação msfunc deve ser especificada quando mstype for especificado" +msgid "permission denied for sequence %s" +msgstr "permissão negada para sequência %s" -#: commands/aggregatecmds.c:201 +#: catalog/aclchk.c:2762 #, c-format -msgid "aggregate minvfunc must be specified when mstype is specified" -msgstr "agregação minvfunc deve ser especificada quando mstype for especificado" +msgid "permission denied for statistics object %s" +msgstr "permissão negada para o objeto de estatísticas %s" -#: commands/aggregatecmds.c:208 +#: catalog/aclchk.c:2765 #, c-format -msgid "aggregate msfunc must not be specified without mstype" -msgstr "agregação msfunc não deve ser especificada sem mstype" +msgid "permission denied for subscription %s" +msgstr "permissão negada para subscrição %s" -#: commands/aggregatecmds.c:212 +#: catalog/aclchk.c:2768 #, c-format -msgid "aggregate minvfunc must not be specified without mstype" -msgstr "agregação minvfunc não deve ser especificada sem mstype" +msgid "permission denied for table %s" +msgstr "permissão negada para tabela %s" -#: commands/aggregatecmds.c:216 +#: catalog/aclchk.c:2771 #, c-format -msgid "aggregate mfinalfunc must not be specified without mstype" -msgstr "agregação mfinalfunc não deve ser especificada sem mstype" +msgid "permission denied for tablespace %s" +msgstr "permissão negada para o espaço de tabelas %s" -#: commands/aggregatecmds.c:220 +#: catalog/aclchk.c:2774 #, c-format -msgid "aggregate msspace must not be specified without mstype" -msgstr "agregação msspace não deve ser especificada sem mstype" +msgid "permission denied for text search configuration %s" +msgstr "permissão negada para configuração de procura de texto completo %s" -#: commands/aggregatecmds.c:224 +#: catalog/aclchk.c:2777 #, c-format -msgid "aggregate minitcond must not be specified without mstype" -msgstr "agregação minitcond não deve ser especificada sem mstype" +msgid "permission denied for text search dictionary %s" +msgstr "permissão negada para dicionário de procura de texto completo %s" -#: commands/aggregatecmds.c:244 +#: catalog/aclchk.c:2780 #, c-format -msgid "aggregate input type must be specified" -msgstr "tipo de entrada da agregação deve ser especificado" +msgid "permission denied for type %s" +msgstr "permissão negada para tipo %s" -#: commands/aggregatecmds.c:274 +#: catalog/aclchk.c:2783 #, c-format -msgid "basetype is redundant with aggregate input type specification" -msgstr "tipo base é redundante com especificação de tipo de entrada da agregação" +msgid "permission denied for view %s" +msgstr "permissão negada para visão %s" -#: commands/aggregatecmds.c:315 commands/aggregatecmds.c:335 +#: catalog/aclchk.c:2819 #, c-format -msgid "aggregate transition data type cannot be %s" -msgstr "tipo de dado de transição da agregação não pode ser %s" +msgid "must be owner of aggregate %s" +msgstr "é necessário ser o dono da agregação %s" -#: commands/alter.c:79 commands/event_trigger.c:194 +#: catalog/aclchk.c:2822 #, c-format -msgid "event trigger \"%s\" already exists" -msgstr "gatilho de eventos \"%s\" já existe" +msgid "must be owner of collation %s" +msgstr "é necessário ser o dono da ordenação %s" -#: commands/alter.c:82 commands/foreigncmds.c:544 +#: catalog/aclchk.c:2825 #, c-format -msgid "foreign-data wrapper \"%s\" already exists" -msgstr "adaptador de dados externos \"%s\" já existe" +msgid "must be owner of conversion %s" +msgstr "é necessário ser o dono da conversão %s" -#: commands/alter.c:85 commands/foreigncmds.c:838 +#: catalog/aclchk.c:2828 #, c-format -msgid "server \"%s\" already exists" -msgstr "servidor \"%s\" já existe" +msgid "must be owner of database %s" +msgstr "é necessário ser o dono do banco de dados %s" -#: commands/alter.c:88 commands/proclang.c:356 +#: catalog/aclchk.c:2831 #, c-format -msgid "language \"%s\" already exists" -msgstr "linguagem \"%s\" já existe" +msgid "must be owner of domain %s" +msgstr "é necessário ser o dono do domínio %s" -#: commands/alter.c:111 +#: catalog/aclchk.c:2834 #, c-format -msgid "conversion \"%s\" already exists in schema \"%s\"" -msgstr "conversão \"%s\" já existe no esquema \"%s\"" +msgid "must be owner of event trigger %s" +msgstr "é necessário ser o dono do gatilho de eventos %s" -#: commands/alter.c:115 +#: catalog/aclchk.c:2837 #, c-format -msgid "text search parser \"%s\" already exists in schema \"%s\"" -msgstr "analisador de busca textual \"%s\" já existe no esquema \"%s\"" +msgid "must be owner of extension %s" +msgstr "é necessário ser o dono da extensão %s" -#: commands/alter.c:119 +#: catalog/aclchk.c:2840 #, c-format -msgid "text search dictionary \"%s\" already exists in schema \"%s\"" -msgstr "dicionário de busca textual \"%s\" já existe no esquema \"%s\"" +msgid "must be owner of foreign-data wrapper %s" +msgstr "é necessário ser o dono de empacotador de dados estrangeiros %s" -#: commands/alter.c:123 +#: catalog/aclchk.c:2843 #, c-format -msgid "text search template \"%s\" already exists in schema \"%s\"" -msgstr "modelo de busca textual \"%s\" já existe no esquema \"%s\"" +msgid "must be owner of foreign server %s" +msgstr "é necessário ser o dono de servidor estrangeiro %s" -#: commands/alter.c:127 +#: catalog/aclchk.c:2846 #, c-format -msgid "text search configuration \"%s\" already exists in schema \"%s\"" -msgstr "configuração de busca textual \"%s\" já existe no esquema \"%s\"" +msgid "must be owner of foreign table %s" +msgstr "é necessário ser o dono da tabela estrangeira %s" -#: commands/alter.c:201 +#: catalog/aclchk.c:2849 #, c-format -msgid "must be superuser to rename %s" -msgstr "deve ser super-usuário para renomear %s" +msgid "must be owner of function %s" +msgstr "é necessário ser o dono da função %s" -#: commands/alter.c:585 +#: catalog/aclchk.c:2852 #, c-format -msgid "must be superuser to set schema of %s" -msgstr "deve ser super-usuário para definir esquema de %s" +msgid "must be owner of index %s" +msgstr "é necessário ser o dono do índice %s" -#: commands/analyze.c:157 +#: catalog/aclchk.c:2855 #, c-format -msgid "skipping analyze of \"%s\" --- lock not available" -msgstr "ignorando análise de \"%s\" --- bloqueio não está disponível" +msgid "must be owner of language %s" +msgstr "é necessário ser o dono da linguagem %s" -#: commands/analyze.c:174 +#: catalog/aclchk.c:2858 #, c-format -msgid "skipping \"%s\" --- only superuser can analyze it" -msgstr "ignorando \"%s\" --- somente super-usuário pode analisá-la(o)" +msgid "must be owner of large object %s" +msgstr "é necessário ser o dono do objeto grande %s" -#: commands/analyze.c:178 +#: catalog/aclchk.c:2861 #, c-format -msgid "skipping \"%s\" --- only superuser or database owner can analyze it" -msgstr "ignorando \"%s\" --- somente super-usuário ou dono de banco de dados pode analisá-la(o)" +msgid "must be owner of materialized view %s" +msgstr "é necessário ser o dono da visão materializada %s" -#: commands/analyze.c:182 +#: catalog/aclchk.c:2864 #, c-format -msgid "skipping \"%s\" --- only table or database owner can analyze it" -msgstr "ignorando \"%s\" --- somente dono de tabela ou de banco de dados pode analisá-la(o)" +msgid "must be owner of operator class %s" +msgstr "é necessário ser o dono da classe de operador %s" -#: commands/analyze.c:242 +#: catalog/aclchk.c:2867 #, c-format -msgid "skipping \"%s\" --- cannot analyze this foreign table" -msgstr "ignorando \"%s\" --- não pode analisar esta tabela externa" +msgid "must be owner of operator %s" +msgstr "é necessário ser o dono do operador %s" -#: commands/analyze.c:253 +#: catalog/aclchk.c:2870 #, c-format -msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" -msgstr "ignorando \"%s\" --- não pode analisar relações que não são tabelas ou tabelas especiais do sistema" +msgid "must be owner of operator family %s" +msgstr "é necessário ser o dono da família de operador %s" -#: commands/analyze.c:332 +#: catalog/aclchk.c:2873 #, c-format -msgid "analyzing \"%s.%s\" inheritance tree" -msgstr "analisando árvore da herança de \"%s.%s\"" +msgid "must be owner of procedure %s" +msgstr "é necessário ser o dono do procedimento %s" -#: commands/analyze.c:337 +#: catalog/aclchk.c:2876 #, c-format -msgid "analyzing \"%s.%s\"" -msgstr "analisando \"%s.%s\"" +msgid "must be owner of publication %s" +msgstr "é necessário ser o dono da publicação %s" -#: commands/analyze.c:657 +#: catalog/aclchk.c:2879 #, c-format -msgid "automatic analyze of table \"%s.%s.%s\" system usage: %s" -msgstr "análise automática da tabela \"%s.%s.%s\" uso do sistema: %s" +msgid "must be owner of routine %s" +msgstr "é necessário ser o dono da rotina %s" -#: commands/analyze.c:1300 +#: catalog/aclchk.c:2882 #, c-format -msgid "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead rows; %d rows in sample, %.0f estimated total rows" -msgstr "\"%s\": processados %d de %u páginas, contendo %.0f registros vigentes e %.0f registros não vigentes; %d registros amostrados, %.0f registros totais estimados" - -#: commands/analyze.c:1564 executor/execQual.c:2904 -msgid "could not convert row type" -msgstr "não pôde converter tipo registro" +msgid "must be owner of sequence %s" +msgstr "é necessário ser o dono da sequência %s" -#: commands/async.c:545 +#: catalog/aclchk.c:2885 #, c-format -msgid "channel name cannot be empty" -msgstr "nome do canal não pode ser vazio" +msgid "must be owner of subscription %s" +msgstr "é necessário ser o dono da subscrição %s" -#: commands/async.c:550 +#: catalog/aclchk.c:2888 #, c-format -msgid "channel name too long" -msgstr "nome do canal é muito longo" +msgid "must be owner of table %s" +msgstr "é necessário ser o dono da tabela %s" -#: commands/async.c:557 +#: catalog/aclchk.c:2891 #, c-format -msgid "payload string too long" -msgstr "cadeia da carga é muito longa" +msgid "must be owner of type %s" +msgstr "é necessário ser o dono do tipo de dados %s" -#: commands/async.c:742 +#: catalog/aclchk.c:2894 #, c-format -msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" -msgstr "não pode executar PREPARE em uma transação que executou LISTEN, UNLISTEN ou NOTIFY" +msgid "must be owner of view %s" +msgstr "é necessário ser o dono da visão %s" -#: commands/async.c:845 +#: catalog/aclchk.c:2897 #, c-format -msgid "too many notifications in the NOTIFY queue" -msgstr "muitas notificações na fila do NOTIFY" +msgid "must be owner of schema %s" +msgstr "é necessário ser o dono do esquema %s" -#: commands/async.c:1418 +#: catalog/aclchk.c:2900 #, c-format -msgid "NOTIFY queue is %.0f%% full" -msgstr "fila do NOTIFY está %.0f%% cheia" +msgid "must be owner of statistics object %s" +msgstr "é necessário ser o dono do objeto de estatísticas %s" -#: commands/async.c:1420 +#: catalog/aclchk.c:2903 #, c-format -msgid "The server process with PID %d is among those with the oldest transactions." -msgstr "O processo servidor com PID %d está entre aqueles com transações mais antigas." +msgid "must be owner of tablespace %s" +msgstr "é necessário ser o dono da espaço de tabelas %s" -#: commands/async.c:1423 +#: catalog/aclchk.c:2906 #, c-format -msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." -msgstr "A fila do NOTIFY não pode ser esvaziada até que o processo termine a transação atual." +msgid "must be owner of text search configuration %s" +msgstr "é necessário ser o dono da configuração de procura de texto completo %s" -#: commands/cluster.c:126 commands/cluster.c:363 +#: catalog/aclchk.c:2909 #, c-format -msgid "cannot cluster temporary tables of other sessions" -msgstr "não pode agrupar tabelas temporárias de outras sessões" +msgid "must be owner of text search dictionary %s" +msgstr "é necessário ser o dono do dicionário de procura de texto completo %s" -#: commands/cluster.c:156 +#: catalog/aclchk.c:2923 #, c-format -msgid "there is no previously clustered index for table \"%s\"" -msgstr "não há nenhum índice previamente agrupado na tabela \"%s\"" +msgid "must be owner of relation %s" +msgstr "é necessário ser o dono da relação %s" -#: commands/cluster.c:170 commands/tablecmds.c:8795 commands/tablecmds.c:10461 +#: catalog/aclchk.c:2969 #, c-format -msgid "index \"%s\" for table \"%s\" does not exist" -msgstr "índice \"%s\" na tabela \"%s\" não existe" +msgid "permission denied for column \"%s\" of relation \"%s\"" +msgstr "permissão negada para coluna \"%s\" da relação \"%s\"" -#: commands/cluster.c:352 +#: catalog/aclchk.c:3104 catalog/aclchk.c:3984 catalog/aclchk.c:4015 #, c-format -msgid "cannot cluster a shared catalog" -msgstr "não pode agrupar um catálogo compartilhado" +msgid "%s with OID %u does not exist" +msgstr "%s com OID %u não existe" -#: commands/cluster.c:367 +#: catalog/aclchk.c:3188 catalog/aclchk.c:3207 #, c-format -msgid "cannot vacuum temporary tables of other sessions" -msgstr "não pode limpar tabelas temporárias de outras sessões" +msgid "attribute %d of relation with OID %u does not exist" +msgstr "atributo %d da relação com OID %u não existe" -#: commands/cluster.c:430 commands/tablecmds.c:10471 +#: catalog/aclchk.c:3302 #, c-format -msgid "\"%s\" is not an index for table \"%s\"" -msgstr "\"%s\" não é um índice na tabela \"%s\"" +msgid "relation with OID %u does not exist" +msgstr "relação com OID %u não existe" -#: commands/cluster.c:438 +#: catalog/aclchk.c:3476 #, c-format -msgid "cannot cluster on index \"%s\" because access method does not support clustering" -msgstr "não pode agrupar índice \"%s\" porque o método de acesso não suporta agrupamento" +msgid "parameter ACL with OID %u does not exist" +msgstr "parâmetro ACL com OID %u não existe" -#: commands/cluster.c:450 +#: catalog/aclchk.c:3640 commands/collationcmds.c:813 +#: commands/publicationcmds.c:1746 #, c-format -msgid "cannot cluster on partial index \"%s\"" -msgstr "não pode agrupar índice parcial \"%s\"" +msgid "schema with OID %u does not exist" +msgstr "esquema com OID %u não existe" -#: commands/cluster.c:464 +#: catalog/aclchk.c:3705 utils/cache/typcache.c:390 utils/cache/typcache.c:445 #, c-format -msgid "cannot cluster on invalid index \"%s\"" -msgstr "não pode agrupar por índice inválido \"%s\"" +msgid "type with OID %u does not exist" +msgstr "tipo com OID %u não existe" -#: commands/cluster.c:920 +#: catalog/catalog.c:449 #, c-format -msgid "clustering \"%s.%s\" using index scan on \"%s\"" -msgstr "agrupando \"%s.%s\" utilizando busca por índice em \"%s\"" +msgid "still searching for an unused OID in relation \"%s\"" +msgstr "ainda procurando por um OID não utilizado na relação \"%s\"" -#: commands/cluster.c:926 +#: catalog/catalog.c:451 #, c-format -msgid "clustering \"%s.%s\" using sequential scan and sort" -msgstr "agrupando \"%s.%s\" utilizando busca sequencial e ordenação" +msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." +msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." +msgstr[0] "" +msgstr[1] "" -#: commands/cluster.c:931 commands/vacuumlazy.c:445 +#: catalog/catalog.c:476 #, c-format -msgid "vacuuming \"%s.%s\"" -msgstr "limpando \"%s.%s\"" +msgid "new OID has been assigned in relation \"%s\" after %llu retry" +msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" +msgstr[0] "" +msgstr[1] "" -#: commands/cluster.c:1090 +#: catalog/catalog.c:609 catalog/catalog.c:676 #, c-format -msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" -msgstr "\"%s\": encontrados %.0f versões de registros removíveis e %.0f não-removíveis em %u páginas" +msgid "must be superuser to call %s()" +msgstr "é necessário ser um superusuário para chamar %s()" -#: commands/cluster.c:1094 +#: catalog/catalog.c:618 #, c-format -msgid "" -"%.0f dead row versions cannot be removed yet.\n" -"%s." -msgstr "" -"%.0f versões de registros não vigentes não podem ser removidas ainda.\n" -"%s." +msgid "pg_nextoid() can only be used on system catalogs" +msgstr "pg_nextoid() só pode ser usado em catálogos do sistema" -#: commands/collationcmds.c:79 +#: catalog/catalog.c:623 parser/parse_utilcmd.c:2264 #, c-format -msgid "collation attribute \"%s\" not recognized" -msgstr "atributo de ordenação \"%s\" desconhecido" +msgid "index \"%s\" does not belong to table \"%s\"" +msgstr "índice \"%s\" não pertence a tabela \"%s\"" -#: commands/collationcmds.c:124 +#: catalog/catalog.c:640 #, c-format -msgid "parameter \"lc_collate\" must be specified" -msgstr "parâmetro \"lc_collate\" deve ser especificado" +msgid "column \"%s\" is not of type oid" +msgstr "a coluna \"%s\" não é do tipo oid" -#: commands/collationcmds.c:129 +#: catalog/catalog.c:647 #, c-format -msgid "parameter \"lc_ctype\" must be specified" -msgstr "parâmetro \"lc_type\" deve ser especificado" +msgid "index \"%s\" is not the index for column \"%s\"" +msgstr "o índice \"%s\" não é o índice para a coluna \"%s\"" -#: commands/collationcmds.c:163 +#: catalog/dependency.c:546 catalog/pg_shdepend.c:658 #, c-format -msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" -msgstr "ordenação \"%s\" para codificação \"%s\" já existe no esquema \"%s\"" +msgid "cannot drop %s because it is required by the database system" +msgstr "não é possível remover %s, porque este é requerido pelo sistema de banco de dados" -#: commands/collationcmds.c:174 +#: catalog/dependency.c:838 catalog/dependency.c:1065 #, c-format -msgid "collation \"%s\" already exists in schema \"%s\"" -msgstr "ordenação \"%s\" já existe no esquema \"%s\"" +msgid "cannot drop %s because %s requires it" +msgstr "não é possível remover %s, porque %s o requer" -#: commands/comment.c:62 commands/dbcommands.c:775 commands/dbcommands.c:939 -#: commands/dbcommands.c:1042 commands/dbcommands.c:1234 -#: commands/dbcommands.c:1423 commands/dbcommands.c:1518 -#: commands/dbcommands.c:1935 utils/init/postinit.c:794 -#: utils/init/postinit.c:862 utils/init/postinit.c:879 +#: catalog/dependency.c:840 catalog/dependency.c:1067 #, c-format -msgid "database \"%s\" does not exist" -msgstr "banco de dados \"%s\" não existe" +msgid "You can drop %s instead." +msgstr "Você pode remover %s ao invés dele." -#: commands/comment.c:101 commands/seclabel.c:114 parser/parse_utilcmd.c:686 +#: catalog/dependency.c:1146 catalog/dependency.c:1155 #, c-format -msgid "\"%s\" is not a table, view, materialized view, composite type, or foreign table" -msgstr "\"%s\" não é uma tabela, visão, visão materializada, tipo composto ou tabela externa" +msgid "%s depends on %s" +msgstr "%s depende de %s" -#: commands/constraint.c:60 utils/adt/ri_triggers.c:2699 +#: catalog/dependency.c:1170 catalog/dependency.c:1179 #, c-format -msgid "function \"%s\" was not called by trigger manager" -msgstr "função \"%s\" não foi chamada pelo gerenciador de gatilhos" +msgid "drop cascades to %s" +msgstr "removendo em cascata %s" -#: commands/constraint.c:67 utils/adt/ri_triggers.c:2708 +#: catalog/dependency.c:1187 catalog/pg_shdepend.c:823 #, c-format -msgid "function \"%s\" must be fired AFTER ROW" -msgstr "função \"%s\" deve ser disparada no AFTER ROW" +msgid "" +"\n" +"and %d other object (see server log for list)" +msgid_plural "" +"\n" +"and %d other objects (see server log for list)" +msgstr[0] "" +"\n" +"e %d outro objeto (veja lista no log do servidor)" +msgstr[1] "" +"\n" +"e %d outros objetos (veja lista no log do servidor)" -#: commands/constraint.c:81 +#: catalog/dependency.c:1199 #, c-format -msgid "function \"%s\" must be fired for INSERT or UPDATE" -msgstr "função \"%s\" deve ser disparada pelo INSERT ou UPDATE" - -#: commands/conversioncmds.c:67 +msgid "cannot drop %s because other objects depend on it" +msgstr "não é possível remover %s, porque outros objetos dependem dele" + +#: catalog/dependency.c:1202 catalog/dependency.c:1209 +#: catalog/dependency.c:1220 commands/tablecmds.c:1335 +#: commands/tablecmds.c:14392 commands/tablespace.c:466 commands/user.c:1309 +#: commands/vacuum.c:211 commands/view.c:446 libpq/auth.c:326 +#: replication/logical/applyparallelworker.c:1044 replication/syncrep.c:1017 +#: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1366 utils/misc/guc.c:3122 +#: utils/misc/guc.c:3158 utils/misc/guc.c:3228 utils/misc/guc.c:6632 +#: utils/misc/guc.c:6666 utils/misc/guc.c:6700 utils/misc/guc.c:6743 +#: utils/misc/guc.c:6785 #, c-format -msgid "source encoding \"%s\" does not exist" -msgstr "codificação de origem \"%s\" não existe" +msgid "%s" +msgstr "%s" -#: commands/conversioncmds.c:74 +#: catalog/dependency.c:1203 catalog/dependency.c:1210 #, c-format -msgid "destination encoding \"%s\" does not exist" -msgstr "codificação de destino \"%s\" não existe" +msgid "Use DROP ... CASCADE to drop the dependent objects too." +msgstr "Use DROP ... CASCADE para remover os objetos dependentes também." -#: commands/conversioncmds.c:88 +#: catalog/dependency.c:1207 #, c-format -msgid "encoding conversion function %s must return type \"void\"" -msgstr "função de conversão de codificação %s deve retornar tipo \"void\"" +msgid "cannot drop desired object(s) because other objects depend on them" +msgstr "não é possível remover o(s) objeto(s) desejado(s), porque outros objetos dependem dele" -#: commands/copy.c:360 commands/copy.c:372 commands/copy.c:406 -#: commands/copy.c:416 +#: catalog/dependency.c:1215 #, c-format -msgid "COPY BINARY is not supported to stdout or from stdin" -msgstr "COPY BINARY não é suportado para saída stdout ou da entrada padrão" +msgid "drop cascades to %d other object" +msgid_plural "drop cascades to %d other objects" +msgstr[0] "removendo em cascata %d outro objeto" +msgstr[1] "removendo em cascata outros %d objetos" -#: commands/copy.c:514 +#: catalog/dependency.c:1899 #, c-format -msgid "could not write to COPY program: %m" -msgstr "não pôde escrever em programa COPY: %m" +msgid "constant of the type %s cannot be used here" +msgstr "uma constante do tipo %s não pode ser usada aqui" -#: commands/copy.c:519 +#: catalog/dependency.c:2420 parser/parse_relation.c:3404 +#: parser/parse_relation.c:3414 #, c-format -msgid "could not write to COPY file: %m" -msgstr "não pôde escrever em arquivo COPY: %m" +msgid "column %d of relation \"%s\" does not exist" +msgstr "coluna %d da relação \"%s\" não existe" -#: commands/copy.c:532 +#: catalog/heap.c:324 #, c-format -msgid "connection lost during COPY to stdout" -msgstr "conexão perdida durante COPY para saída stdout" +msgid "permission denied to create \"%s.%s\"" +msgstr "permissão negada ao criar \"%s.%s\"" -#: commands/copy.c:573 +#: catalog/heap.c:326 #, c-format -msgid "could not read from COPY file: %m" -msgstr "não pôde ler de arquivo COPY: %m" +msgid "System catalog modifications are currently disallowed." +msgstr "As modificações no catálogo do sistema estão desativadas no momento." -#: commands/copy.c:589 commands/copy.c:608 commands/copy.c:612 -#: tcop/fastpath.c:293 tcop/postgres.c:342 tcop/postgres.c:378 +#: catalog/heap.c:466 commands/tablecmds.c:2374 commands/tablecmds.c:3047 +#: commands/tablecmds.c:6922 #, c-format -msgid "unexpected EOF on client connection with an open transaction" -msgstr "EOF inesperado durante conexão do cliente com uma transação aberta" +msgid "tables can have at most %d columns" +msgstr "tabelas podem ter no máximo %d colunas" -#: commands/copy.c:624 +#: catalog/heap.c:484 commands/tablecmds.c:7229 #, c-format -msgid "COPY from stdin failed: %s" -msgstr "COPY da entrada padrão falhou: %s" +msgid "column name \"%s\" conflicts with a system column name" +msgstr "nome de coluna \"%s\" conflita com um nome de coluna do sistema" -#: commands/copy.c:640 +#: catalog/heap.c:500 #, c-format -msgid "unexpected message type 0x%02X during COPY from stdin" -msgstr "tipo de mensagem inesperada 0x%02X durante COPY da entrada padrão" +msgid "column name \"%s\" specified more than once" +msgstr "nome da coluna \"%s\" especificado mais de uma vez" -#: commands/copy.c:794 +#. translator: first %s is an integer not a name +#: catalog/heap.c:575 #, c-format -msgid "must be superuser to COPY to or from an external program" -msgstr "deve ser super-usuário para utilizar COPY para ou de um programa externo" +msgid "partition key column %s has pseudo-type %s" +msgstr "a coluna de chave de partição %s tem pseudotipo %s" -#: commands/copy.c:795 commands/copy.c:801 +#: catalog/heap.c:580 #, c-format -msgid "Anyone can COPY to stdout or from stdin. psql's \\copy command also works for anyone." -msgstr "Qualquer um pode utilizar COPY para saída stdout ou da entrada padrão. comando \\copy do psql também funciona para qualquer um." +msgid "column \"%s\" has pseudo-type %s" +msgstr "coluna \"%s\" tem pseudo-tipo %s" -#: commands/copy.c:800 +#: catalog/heap.c:611 #, c-format -msgid "must be superuser to COPY to or from a file" -msgstr "deve ser super-usuário para utilizar COPY para ou de um arquivo" +msgid "composite type %s cannot be made a member of itself" +msgstr "tipo composto %s não pode se tornar membro de si próprio" -#: commands/copy.c:936 +#. translator: first %s is an integer not a name +#: catalog/heap.c:666 #, c-format -msgid "COPY format \"%s\" not recognized" -msgstr "formato COPY \"%s\" desconhecido" +msgid "no collation was derived for partition key column %s with collatable type %s" +msgstr "nenhuma ordenação foi derivada para a coluna de chave de partição %s com o tipo ordenável %s" -#: commands/copy.c:1007 commands/copy.c:1021 commands/copy.c:1035 -#: commands/copy.c:1055 +#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 #, c-format -msgid "argument to option \"%s\" must be a list of column names" -msgstr "argumento para opção \"%s\" deve ser uma lista de nomes de colunas" +msgid "no collation was derived for column \"%s\" with collatable type %s" +msgstr "nenhuma ordenação foi derivada para coluna \"%s\" com tipo %s ordenável" -#: commands/copy.c:1068 +#: catalog/heap.c:1148 catalog/index.c:887 commands/createas.c:408 +#: commands/tablecmds.c:3987 #, c-format -msgid "argument to option \"%s\" must be a valid encoding name" -msgstr "argumento para opção \"%s\" deve ser um nome de codificação válido" +msgid "relation \"%s\" already exists" +msgstr "relação \"%s\" já existe" -#: commands/copy.c:1074 +#: catalog/heap.c:1164 catalog/pg_type.c:434 catalog/pg_type.c:782 +#: catalog/pg_type.c:954 commands/typecmds.c:249 commands/typecmds.c:261 +#: commands/typecmds.c:754 commands/typecmds.c:1169 commands/typecmds.c:1395 +#: commands/typecmds.c:1575 commands/typecmds.c:2546 #, c-format -msgid "option \"%s\" not recognized" -msgstr "opção \"%s\" desconhecida" +msgid "type \"%s\" already exists" +msgstr "tipo \"%s\" já existe" -#: commands/copy.c:1085 +#: catalog/heap.c:1165 #, c-format -msgid "cannot specify DELIMITER in BINARY mode" -msgstr "não pode especificar DELIMITER no modo BINARY" +msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." +msgstr "A relação tem um tipo associado com o mesmo nome, então você deve utilizar um nome que não conflite com outro tipo existente." -#: commands/copy.c:1090 +#: catalog/heap.c:1205 #, c-format -msgid "cannot specify NULL in BINARY mode" -msgstr "não pode especificar NULL no modo BINARY" +msgid "toast relfilenumber value not set when in binary upgrade mode" +msgstr "valor toast relfilenumber não definido quando no modo de atualização binária" -#: commands/copy.c:1112 +#: catalog/heap.c:1216 #, c-format -msgid "COPY delimiter must be a single one-byte character" -msgstr "delimitador do COPY deve ter um único caracter de um byte" +msgid "pg_class heap OID value not set when in binary upgrade mode" +msgstr "OID do heap de pg_class não configurado no modo de atualização binária" -#: commands/copy.c:1119 +#: catalog/heap.c:1226 #, c-format -msgid "COPY delimiter cannot be newline or carriage return" -msgstr "delimitador do COPY não pode ser nova linha ou retorno de carro" +msgid "relfilenumber value not set when in binary upgrade mode" +msgstr "valor relfilenumber não definido quando no modo de atualização binária" -#: commands/copy.c:1125 +#: catalog/heap.c:2119 #, c-format -msgid "COPY null representation cannot use newline or carriage return" -msgstr "representação do nulo do COPY não pode ser nova linha ou retorno de carro" +msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" +msgstr "não é possível adicionar a restrição NO INHERIT à tabela particionada \"%s\"" -#: commands/copy.c:1142 +#: catalog/heap.c:2394 #, c-format -msgid "COPY delimiter cannot be \"%s\"" -msgstr "delimitador do COPY não pode ser \"%s\"" +msgid "check constraint \"%s\" already exists" +msgstr "restrição de verificação \"%s\" já existe" -#: commands/copy.c:1148 +#: catalog/heap.c:2564 catalog/index.c:901 catalog/pg_constraint.c:682 +#: commands/tablecmds.c:8904 #, c-format -msgid "COPY HEADER available only in CSV mode" -msgstr "COPY HEADER só está disponível no modo CSV" - -#: commands/copy.c:1154 -#, c-format -msgid "COPY quote available only in CSV mode" -msgstr "delimitador de dados do COPY só está disponível no modo CSV" +msgid "constraint \"%s\" for relation \"%s\" already exists" +msgstr "restrição \"%s\" para relação \"%s\" já existe" -#: commands/copy.c:1159 +#: catalog/heap.c:2571 #, c-format -msgid "COPY quote must be a single one-byte character" -msgstr "delimitador de dados do COPY deve ter um único caracter de um byte" +msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" +msgstr "restrição \"%s\" conflita com restrição não herdada na relação \"%s\"" -#: commands/copy.c:1164 +#: catalog/heap.c:2582 #, c-format -msgid "COPY delimiter and quote must be different" -msgstr "delimitador e delimitador de dados do COPY devem ser diferentes" +msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" +msgstr "a restrição \"%s\" conflita com a restrição herdada na relação \"%s\"" -#: commands/copy.c:1170 +#: catalog/heap.c:2592 #, c-format -msgid "COPY escape available only in CSV mode" -msgstr "escape do COPY só está disponível no modo CSV" +msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" +msgstr "a restrição \"%s\" conflita com a restrição NOT VALID na relação \"%s\"" -#: commands/copy.c:1175 +#: catalog/heap.c:2597 #, c-format -msgid "COPY escape must be a single one-byte character" -msgstr "escape do COPY deve ter um único caracter de um byte" +msgid "merging constraint \"%s\" with inherited definition" +msgstr "juntando restrição \"%s\" com definição herdada" -#: commands/copy.c:1181 +#: catalog/heap.c:2623 catalog/pg_constraint.c:811 commands/tablecmds.c:2672 +#: commands/tablecmds.c:3199 commands/tablecmds.c:6858 +#: commands/tablecmds.c:15214 commands/tablecmds.c:15355 #, c-format -msgid "COPY force quote available only in CSV mode" -msgstr "opção force quote do COPY somente está disponível no modo CSV" +msgid "too many inheritance parents" +msgstr "excesso de pais de herança" -#: commands/copy.c:1185 +#: catalog/heap.c:2707 #, c-format -msgid "COPY force quote only available using COPY TO" -msgstr "opção force quote do COPY somente está disponível ao utilizar COPY TO" +msgid "cannot use generated column \"%s\" in column generation expression" +msgstr "não é possível usar a coluna gerada \"%s\" na expressão de geração de coluna" -#: commands/copy.c:1191 +#: catalog/heap.c:2709 #, c-format -msgid "COPY force not null available only in CSV mode" -msgstr "opção force not null do COPY somente está disponível no modo CSV" +msgid "A generated column cannot reference another generated column." +msgstr "" -#: commands/copy.c:1195 +#: catalog/heap.c:2715 #, c-format -msgid "COPY force not null only available using COPY FROM" -msgstr "opção force not null do COPY somente está disponível ao utilizar COPY FROM" +msgid "cannot use whole-row variable in column generation expression" +msgstr "não é possível usar uma variável de linha na expressão de geração de coluna" -#: commands/copy.c:1201 +#: catalog/heap.c:2716 #, c-format -msgid "COPY force null available only in CSV mode" -msgstr "opção force null do COPY somente está disponível no modo CSV" +msgid "This would cause the generated column to depend on its own value." +msgstr "" -#: commands/copy.c:1206 +#: catalog/heap.c:2771 #, c-format -msgid "COPY force null only available using COPY FROM" -msgstr "opção force null do COPY somente está disponível ao utilizar COPY FROM" +msgid "generation expression is not immutable" +msgstr "a expressão de geração não é imutável" -#: commands/copy.c:1212 +#: catalog/heap.c:2799 rewrite/rewriteHandler.c:1297 #, c-format -msgid "COPY delimiter must not appear in the NULL specification" -msgstr "delimitador do COPY não deve aparecer em uma especificação NULL" +msgid "column \"%s\" is of type %s but default expression is of type %s" +msgstr "coluna \"%s\" é do tipo %s mas expressão padrão é do tipo %s" -#: commands/copy.c:1219 +#: catalog/heap.c:2804 commands/prepare.c:334 parser/analyze.c:2742 +#: parser/parse_target.c:593 parser/parse_target.c:874 +#: parser/parse_target.c:884 rewrite/rewriteHandler.c:1302 #, c-format -msgid "CSV quote character must not appear in the NULL specification" -msgstr "caracter delimitador de dados do CSV não deve aparecer na especificação NULL" +msgid "You will need to rewrite or cast the expression." +msgstr "Você precisará reescrever ou converter a expressão." -#: commands/copy.c:1281 +#: catalog/heap.c:2851 #, c-format -msgid "table \"%s\" does not have OIDs" -msgstr "tabela \"%s\" não tem OIDs" +msgid "only table \"%s\" can be referenced in check constraint" +msgstr "somente a tabela \"%s\" pode ser referenciada na restrição de verificação" -#: commands/copy.c:1298 +#: catalog/heap.c:3157 #, c-format -msgid "COPY (SELECT) WITH OIDS is not supported" -msgstr "COPY (SELECT) WITH OIDS não é mais suportado" +msgid "unsupported ON COMMIT and foreign key combination" +msgstr "combinação de ON COMMIT com chave estrangeira não tem suporte" -#: commands/copy.c:1324 +#: catalog/heap.c:3158 #, c-format -msgid "COPY (SELECT INTO) is not supported" -msgstr "COPY (SELECT INTO) não é suportado" +msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." +msgstr "A tabela \"%s\" referencia \"%s\", mas não têm a mesma definição de ON COMMIT." -#: commands/copy.c:1387 +#: catalog/heap.c:3163 #, c-format -msgid "FORCE QUOTE column \"%s\" not referenced by COPY" -msgstr "coluna do tipo FORCE QUOTE \"%s\" não é referenciada pelo COPY" +msgid "cannot truncate a table referenced in a foreign key constraint" +msgstr "não é possível truncar uma tabela referenciada em uma restrição de chave estrangeira" -#: commands/copy.c:1409 +#: catalog/heap.c:3164 #, c-format -msgid "FORCE NOT NULL column \"%s\" not referenced by COPY" -msgstr "coluna do tipo FORCE NOT NULL \"%s\" não é referenciada pelo COPY" +msgid "Table \"%s\" references \"%s\"." +msgstr "Tabela \"%s\" referencia \"%s\"." -#: commands/copy.c:1431 +#: catalog/heap.c:3166 #, c-format -msgid "FORCE NULL column \"%s\" not referenced by COPY" -msgstr "coluna do tipo FORCE NULL \"%s\" não é referenciada pelo COPY" +msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." +msgstr "Trunque a tabela \"%s\" ao mesmo tempo, ou use TRUNCATE ... CASCADE." -#: commands/copy.c:1495 +#: catalog/index.c:225 parser/parse_utilcmd.c:2170 #, c-format -msgid "could not close pipe to external command: %m" -msgstr "não pôde fechar pipe para comando externo: %m" +msgid "multiple primary keys for table \"%s\" are not allowed" +msgstr "não são permitidas múltiplas chaves primárias na tabela \"%s\"" -#: commands/copy.c:1498 +#: catalog/index.c:239 #, c-format -msgid "program \"%s\" failed" -msgstr "programa \"%s\" falhou" +msgid "primary keys cannot use NULLS NOT DISTINCT indexes" +msgstr "chaves primárias não podem usar índices NULLS NOT DISTINCT" -#: commands/copy.c:1547 +#: catalog/index.c:256 #, c-format -msgid "cannot copy from view \"%s\"" -msgstr "não pode copiar visão \"%s\"" +msgid "primary keys cannot be expressions" +msgstr "chaves primárias não podem ser expressões" -#: commands/copy.c:1549 commands/copy.c:1555 commands/copy.c:1561 +#: catalog/index.c:273 #, c-format -msgid "Try the COPY (SELECT ...) TO variant." -msgstr "Tente a variante COPY (SELECT ...) TO." +msgid "primary key column \"%s\" is not marked NOT NULL" +msgstr "a coluna de chave primária \"%s\" não está marcada como NOT NULL" -#: commands/copy.c:1553 +#: catalog/index.c:786 catalog/index.c:1942 #, c-format -msgid "cannot copy from materialized view \"%s\"" -msgstr "não pode copiar visão materializada \"%s\"" +msgid "user-defined indexes on system catalog tables are not supported" +msgstr "índices definidos pelo usuário nas tabelas de catálogo do sistema não são suportados" -#: commands/copy.c:1559 +#: catalog/index.c:826 #, c-format -msgid "cannot copy from foreign table \"%s\"" -msgstr "não pode copiar tabela externa \"%s\"" +msgid "nondeterministic collations are not supported for operator class \"%s\"" +msgstr "ordenações não determinísticos não têm suporte pela classe de operador \"%s\"" -#: commands/copy.c:1565 +#: catalog/index.c:841 #, c-format -msgid "cannot copy from sequence \"%s\"" -msgstr "não pode copiar sequência \"%s\"" +msgid "concurrent index creation on system catalog tables is not supported" +msgstr "criação de índices concorrentes nas tabelas de catálogo do sistema não são suportados" -#: commands/copy.c:1570 +#: catalog/index.c:850 catalog/index.c:1318 #, c-format -msgid "cannot copy from non-table relation \"%s\"" -msgstr "não pode copiar relação \"%s\" que não é uma tabela" +msgid "concurrent index creation for exclusion constraints is not supported" +msgstr "a criação concorrente de índices para restrições de exclusão não tem suporte" -#: commands/copy.c:1593 commands/copy.c:2616 +#: catalog/index.c:859 #, c-format -msgid "could not execute command \"%s\": %m" -msgstr "não pôde executar comando \"%s\": %m" +msgid "shared indexes cannot be created after initdb" +msgstr "índices compartilhados não podem ser criados depois do initdb" -#: commands/copy.c:1608 +#: catalog/index.c:879 commands/createas.c:423 commands/sequence.c:158 +#: parser/parse_utilcmd.c:209 #, c-format -msgid "relative path not allowed for COPY to file" -msgstr "caminho relativo não é permitido pelo COPY para arquivo" +msgid "relation \"%s\" already exists, skipping" +msgstr "relação \"%s\" já existe, ignorando" -#: commands/copy.c:1616 +#: catalog/index.c:929 #, c-format -msgid "could not open file \"%s\" for writing: %m" -msgstr "não pôde abrir arquivo \"%s\" para escrita: %m" +msgid "pg_class index OID value not set when in binary upgrade mode" +msgstr "OID do índice pg_class não configurado no modo de atualização binária" -#: commands/copy.c:1623 commands/copy.c:2634 +#: catalog/index.c:939 utils/cache/relcache.c:3731 #, c-format -msgid "\"%s\" is a directory" -msgstr "\"%s\" é um diretório" +msgid "index relfilenumber value not set when in binary upgrade mode" +msgstr "valor do índice relfilenumber não definido quando no modo de atualização binária" -#: commands/copy.c:1948 +#: catalog/index.c:2241 #, c-format -msgid "COPY %s, line %d, column %s" -msgstr "COPY %s, linha %d, coluna %s" +msgid "DROP INDEX CONCURRENTLY must be first action in transaction" +msgstr "DROP INDEX CONCURRENTLY deve ser a primeira ação na transação" -#: commands/copy.c:1952 commands/copy.c:1999 +#: catalog/index.c:3658 #, c-format -msgid "COPY %s, line %d" -msgstr "COPY %s, linha %d" +msgid "cannot reindex temporary tables of other sessions" +msgstr "não é possível reindexar tabelas temporárias de outras sessões" -#: commands/copy.c:1963 +#: catalog/index.c:3669 commands/indexcmds.c:3607 #, c-format -msgid "COPY %s, line %d, column %s: \"%s\"" -msgstr "COPY %s, linha %d, coluna %s: \"%s\"" +msgid "cannot reindex invalid index on TOAST table" +msgstr "não é possível reindexar índice inválido na tabela TOAST" -#: commands/copy.c:1971 +#: catalog/index.c:3685 commands/indexcmds.c:3487 commands/indexcmds.c:3631 +#: commands/tablecmds.c:3402 #, c-format -msgid "COPY %s, line %d, column %s: null input" -msgstr "COPY %s, linha %d, coluna %s: entrada nula" +msgid "cannot move system relation \"%s\"" +msgstr "não é possível mover a relação do sistema \"%s\"" -#: commands/copy.c:1993 +#: catalog/index.c:3829 #, c-format -msgid "COPY %s, line %d: \"%s\"" -msgstr "COPY %s, linha %d: \"%s\"" +msgid "index \"%s\" was reindexed" +msgstr "o índice \"%s\" foi reindexado" -#: commands/copy.c:2077 +#: catalog/index.c:3966 #, c-format -msgid "cannot copy to view \"%s\"" -msgstr "não pode copiar para visão \"%s\"" +msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" +msgstr "não é possível reindexar o índice inválido \"%s.%s\" na tabela TOAST, ignorando" -#: commands/copy.c:2082 +#: catalog/namespace.c:260 catalog/namespace.c:464 catalog/namespace.c:556 +#: commands/trigger.c:5736 #, c-format -msgid "cannot copy to materialized view \"%s\"" -msgstr "não pode copiar para visão materializada \"%s\"" +msgid "cross-database references are not implemented: \"%s.%s.%s\"" +msgstr "referências cruzadas entre bancos de dados não estão implementadas: \"%s.%s.%s\"" -#: commands/copy.c:2087 +#: catalog/namespace.c:317 #, c-format -msgid "cannot copy to foreign table \"%s\"" -msgstr "não pode copiar para tabela externa \"%s\"" +msgid "temporary tables cannot specify a schema name" +msgstr "tabelas temporárias não podem especificar um nome de esquema" -#: commands/copy.c:2092 +#: catalog/namespace.c:398 #, c-format -msgid "cannot copy to sequence \"%s\"" -msgstr "não pode copiar para sequência \"%s\"" +msgid "could not obtain lock on relation \"%s.%s\"" +msgstr "não foi possível obter bloqueio na relação \"%s.%s\"" -#: commands/copy.c:2097 +#: catalog/namespace.c:403 commands/lockcmds.c:144 commands/lockcmds.c:224 #, c-format -msgid "cannot copy to non-table relation \"%s\"" -msgstr "não pode copiar para relação \"%s\" que não é uma tabela" +msgid "could not obtain lock on relation \"%s\"" +msgstr "não foi possível obter bloqueio na relação \"%s\"" -#: commands/copy.c:2160 +#: catalog/namespace.c:431 parser/parse_relation.c:1430 #, c-format -msgid "cannot perform FREEZE because of prior transaction activity" -msgstr "não pode executar FREEZE por causa de atividade anterior na transação" +msgid "relation \"%s.%s\" does not exist" +msgstr "relação \"%s.%s\" não existe" -#: commands/copy.c:2166 +#: catalog/namespace.c:436 parser/parse_relation.c:1443 +#: parser/parse_relation.c:1451 utils/adt/regproc.c:913 #, c-format -msgid "cannot perform FREEZE because the table was not created or truncated in the current subtransaction" -msgstr "não pode executar FREEZE porque a tabela não foi criada ou truncada na subtransação atual" +msgid "relation \"%s\" does not exist" +msgstr "relação \"%s\" não existe" -#: commands/copy.c:2627 utils/adt/genfile.c:123 +#: catalog/namespace.c:502 catalog/namespace.c:3073 commands/extension.c:1611 +#: commands/extension.c:1617 #, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "não pôde abrir arquivo \"%s\" para leitura: %m" +msgid "no schema has been selected to create in" +msgstr "nenhum esquema foi selecionado para criá-lo(a)" -#: commands/copy.c:2654 +#: catalog/namespace.c:654 catalog/namespace.c:667 #, c-format -msgid "COPY file signature not recognized" -msgstr "assinatura de arquivo COPY desconhecida" +msgid "cannot create relations in temporary schemas of other sessions" +msgstr "não é possível criar relações em esquemas temporárias de outras sessões" -#: commands/copy.c:2659 +#: catalog/namespace.c:658 #, c-format -msgid "invalid COPY file header (missing flags)" -msgstr "cabeçalho de arquivo COPY é inválido (faltando marcações)" +msgid "cannot create temporary relation in non-temporary schema" +msgstr "não é possível criar relação temporária em esquema que não é temporário" -#: commands/copy.c:2665 +#: catalog/namespace.c:673 #, c-format -msgid "unrecognized critical flags in COPY file header" -msgstr "marcações críticas desconhecidas no cabeçalho do arquivo COPY" +msgid "only temporary relations may be created in temporary schemas" +msgstr "somente relações temporárias podem ser criadas em esquemas temporários" -#: commands/copy.c:2671 +#: catalog/namespace.c:2265 #, c-format -msgid "invalid COPY file header (missing length)" -msgstr "cabeçalho de arquivo COPY é inválido (faltando tamanho)" +msgid "statistics object \"%s\" does not exist" +msgstr "o objeto de estatísticas \"%s\" não existe" -#: commands/copy.c:2678 +#: catalog/namespace.c:2388 #, c-format -msgid "invalid COPY file header (wrong length)" -msgstr "cabeçalho de arquivo COPY é inválido (tamanho incorreto)" +msgid "text search parser \"%s\" does not exist" +msgstr "o analisador de procura de texto completo \"%s\" não existe" -#: commands/copy.c:2811 commands/copy.c:3518 commands/copy.c:3748 +#: catalog/namespace.c:2514 utils/adt/regproc.c:1439 #, c-format -msgid "extra data after last expected column" -msgstr "dado extra após última coluna esperada" +msgid "text search dictionary \"%s\" does not exist" +msgstr "o dicionário de procura de texto completo \"%s\" não existe" -#: commands/copy.c:2821 +#: catalog/namespace.c:2641 #, c-format -msgid "missing data for OID column" -msgstr "faltando dados da coluna OID" +msgid "text search template \"%s\" does not exist" +msgstr "o modelo de procura de texto completo \"%s\" não existe" -#: commands/copy.c:2827 +#: catalog/namespace.c:2767 commands/tsearchcmds.c:1162 +#: utils/adt/regproc.c:1329 utils/cache/ts_cache.c:635 #, c-format -msgid "null OID in COPY data" -msgstr "OID nulo em dados do COPY" +msgid "text search configuration \"%s\" does not exist" +msgstr "a configuração de procura de texto completo \"%s\" não existe" -#: commands/copy.c:2837 commands/copy.c:2960 +#: catalog/namespace.c:2880 parser/parse_expr.c:832 parser/parse_target.c:1246 #, c-format -msgid "invalid OID in COPY data" -msgstr "OID inválido em dados do COPY" +msgid "cross-database references are not implemented: %s" +msgstr "referências cruzadas entre bancos de dados não estão implementadas: %s" -#: commands/copy.c:2852 +#: catalog/namespace.c:2886 gram.y:18569 gram.y:18609 parser/parse_expr.c:839 +#: parser/parse_target.c:1253 #, c-format -msgid "missing data for column \"%s\"" -msgstr "faltando dados da coluna \"%s\"" +msgid "improper qualified name (too many dotted names): %s" +msgstr "nome qualificado impróprio (nomes com pontos demais): %s" -#: commands/copy.c:2935 +#: catalog/namespace.c:3016 #, c-format -msgid "received copy data after EOF marker" -msgstr "dados do COPY recebidos após marcador EOF" +msgid "cannot move objects into or out of temporary schemas" +msgstr "não é possível mover objetos para dentro ou fora de esquemas temporários" -#: commands/copy.c:2942 +#: catalog/namespace.c:3022 #, c-format -msgid "row field count is %d, expected %d" -msgstr "quantidade de campos do registro é %d, esperado %d" +msgid "cannot move objects into or out of TOAST schema" +msgstr "não é possível mover objetos para dentro ou para fora do esquema TOAST" -#: commands/copy.c:3282 commands/copy.c:3299 +#: catalog/namespace.c:3095 commands/schemacmds.c:264 commands/schemacmds.c:344 +#: commands/tablecmds.c:1280 utils/adt/regproc.c:1668 #, c-format -msgid "literal carriage return found in data" -msgstr "retorno de carro foi encontrado em dados" +msgid "schema \"%s\" does not exist" +msgstr "o esquema \"%s\" não existe" -#: commands/copy.c:3283 commands/copy.c:3300 +#: catalog/namespace.c:3126 #, c-format -msgid "unquoted carriage return found in data" -msgstr "retorno de carros sem aspas foi encontrado em dados" +msgid "improper relation name (too many dotted names): %s" +msgstr "o nome de relação não é válido (nomes com pontos demais): %s" -#: commands/copy.c:3285 commands/copy.c:3302 +#: catalog/namespace.c:3693 utils/adt/regproc.c:1056 #, c-format -msgid "Use \"\\r\" to represent carriage return." -msgstr "Utilize \"\\r\" para representar retorno de carro." +msgid "collation \"%s\" for encoding \"%s\" does not exist" +msgstr "a ordenação \"%s\" para a codificação \"%s\" não existe" -#: commands/copy.c:3286 commands/copy.c:3303 +#: catalog/namespace.c:3748 #, c-format -msgid "Use quoted CSV field to represent carriage return." -msgstr "Utilize campo entre aspas do CSV para representar retorno de carro." +msgid "conversion \"%s\" does not exist" +msgstr "a conversão \"%s\" não existe" -#: commands/copy.c:3315 +#: catalog/namespace.c:4012 #, c-format -msgid "literal newline found in data" -msgstr "nova linha foi encontrada em dados" +msgid "permission denied to create temporary tables in database \"%s\"" +msgstr "permissão negada ao criar tabelas temporárias no banco de dados \"%s\"" -#: commands/copy.c:3316 +#: catalog/namespace.c:4028 #, c-format -msgid "unquoted newline found in data" -msgstr "nova linha sem aspas foi encontrada em dados" +msgid "cannot create temporary tables during recovery" +msgstr "não é possível criar tabelas temporárias durante recuperação" -#: commands/copy.c:3318 +#: catalog/namespace.c:4034 #, c-format -msgid "Use \"\\n\" to represent newline." -msgstr "Utilize \"\\n\" para representar nova linha." +msgid "cannot create temporary tables during a parallel operation" +msgstr "não é possível criar tabelas temporárias durante uma operação paralela" -#: commands/copy.c:3319 +#: catalog/objectaddress.c:1409 commands/policy.c:96 commands/policy.c:376 +#: commands/tablecmds.c:248 commands/tablecmds.c:290 commands/tablecmds.c:2206 +#: commands/tablecmds.c:12361 #, c-format -msgid "Use quoted CSV field to represent newline." -msgstr "Utilize campo entre aspas do CSV para representar nova linha." +msgid "\"%s\" is not a table" +msgstr "\"%s\" não é uma tabela" -#: commands/copy.c:3365 commands/copy.c:3401 +#: catalog/objectaddress.c:1416 commands/tablecmds.c:260 +#: commands/tablecmds.c:17155 commands/view.c:119 #, c-format -msgid "end-of-copy marker does not match previous newline style" -msgstr "marcador de fim-de-cópia não corresponde com estilo de nova linha anterior" +msgid "\"%s\" is not a view" +msgstr "\"%s\" não é uma visão" -#: commands/copy.c:3374 commands/copy.c:3390 +#: catalog/objectaddress.c:1423 commands/matview.c:186 commands/tablecmds.c:266 +#: commands/tablecmds.c:17160 #, c-format -msgid "end-of-copy marker corrupt" -msgstr "marcador de fim-de-cópia corrompido" +msgid "\"%s\" is not a materialized view" +msgstr "\"%s\" não é uma visão materializada" -#: commands/copy.c:3832 +#: catalog/objectaddress.c:1430 commands/tablecmds.c:284 +#: commands/tablecmds.c:17165 #, c-format -msgid "unterminated CSV quoted field" -msgstr "campo entre aspas do CSV não foi terminado" +msgid "\"%s\" is not a foreign table" +msgstr "\"%s\" não é uma tabela estrangeira" -#: commands/copy.c:3909 commands/copy.c:3928 +#: catalog/objectaddress.c:1471 #, c-format -msgid "unexpected EOF in COPY data" -msgstr "EOF inesperado em dados do COPY" +msgid "must specify relation and object name" +msgstr "é necessário ser especificada a relação e o nome do objeto" -#: commands/copy.c:3918 +#: catalog/objectaddress.c:1547 catalog/objectaddress.c:1600 #, c-format -msgid "invalid field size" -msgstr "tamanho de campo é inválido" +msgid "column name must be qualified" +msgstr "nome da coluna deve ser qualificado" -#: commands/copy.c:3941 +#: catalog/objectaddress.c:1619 #, c-format -msgid "incorrect binary data format" -msgstr "formato de dado binário incorreto" +msgid "default value for column \"%s\" of relation \"%s\" does not exist" +msgstr "não existe valor padrão para a coluna \"%s\" da relação \"%s\"" -#: commands/copy.c:4252 commands/indexcmds.c:993 commands/tablecmds.c:1427 -#: commands/tablecmds.c:2237 parser/parse_relation.c:2889 -#: utils/adt/tsvector_op.c:1417 +#: catalog/objectaddress.c:1656 commands/functioncmds.c:137 +#: commands/tablecmds.c:276 commands/typecmds.c:274 commands/typecmds.c:3691 +#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 +#: utils/adt/acl.c:4441 #, c-format -msgid "column \"%s\" does not exist" -msgstr "coluna \"%s\" não existe" +msgid "type \"%s\" does not exist" +msgstr "tipo \"%s\" não existe" -#: commands/copy.c:4259 commands/tablecmds.c:1453 commands/trigger.c:644 -#: parser/parse_target.c:936 parser/parse_target.c:947 +#: catalog/objectaddress.c:1775 #, c-format -msgid "column \"%s\" specified more than once" -msgstr "coluna \"%s\" especificada mais de uma vez" +msgid "operator %d (%s, %s) of %s does not exist" +msgstr "operador %d (%s, %s) de %s não existe" -#: commands/createas.c:353 +#: catalog/objectaddress.c:1806 #, c-format -msgid "too many column names were specified" -msgstr "muitos nomes de coluna foram especificados" +msgid "function %d (%s, %s) of %s does not exist" +msgstr "não existe a função %d (%s, %s) de %s" -#: commands/dbcommands.c:203 +#: catalog/objectaddress.c:1857 catalog/objectaddress.c:1883 #, c-format -msgid "LOCATION is not supported anymore" -msgstr "LOCATION não é mais suportado" +msgid "user mapping for user \"%s\" on server \"%s\" does not exist" +msgstr "não existe mapeamento de usuário para o usuário \"%s\" no servidor \"%s\"" -#: commands/dbcommands.c:204 +#: catalog/objectaddress.c:1872 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:700 #, c-format -msgid "Consider using tablespaces instead." -msgstr "Considere utilizar tablespaces." +msgid "server \"%s\" does not exist" +msgstr "servidor \"%s\" não existe" -#: commands/dbcommands.c:227 utils/adt/ascii.c:144 +#: catalog/objectaddress.c:1939 #, c-format -msgid "%d is not a valid encoding code" -msgstr "%d não é um código de codificação válido" +msgid "publication relation \"%s\" in publication \"%s\" does not exist" +msgstr "não existe a relação de publicação \"%s\" na publicação \"%s\"" -#: commands/dbcommands.c:237 utils/adt/ascii.c:126 +#: catalog/objectaddress.c:1986 #, c-format -msgid "%s is not a valid encoding name" -msgstr "%s não é um nome de codificação válido" +msgid "publication schema \"%s\" in publication \"%s\" does not exist" +msgstr "não existe o esquema de publicação \"%s\" na publicação \"%s\"" -#: commands/dbcommands.c:255 commands/dbcommands.c:1404 commands/user.c:260 -#: commands/user.c:601 +#: catalog/objectaddress.c:2044 #, c-format -msgid "invalid connection limit: %d" -msgstr "limite de conexão é inválido: %d" +msgid "unrecognized default ACL object type \"%c\"" +msgstr "tipo de objeto ACL padrão não reconhecido \"%c\"" -#: commands/dbcommands.c:274 +#: catalog/objectaddress.c:2045 #, c-format -msgid "permission denied to create database" -msgstr "permissão negada ao criar banco de dados" +msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." +msgstr "Os tipos de objetos válidos são \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." -#: commands/dbcommands.c:297 +#: catalog/objectaddress.c:2096 #, c-format -msgid "template database \"%s\" does not exist" -msgstr "banco de dados modelo \"%s\" não existe" +msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" +msgstr "não existe ACL padrão para o usuário \"%s\" no esquema \"%s\" em %s" -#: commands/dbcommands.c:309 +#: catalog/objectaddress.c:2101 #, c-format -msgid "permission denied to copy database \"%s\"" -msgstr "permissão negada ao copiar banco de dados \"%s\"" +msgid "default ACL for user \"%s\" on %s does not exist" +msgstr "não existe ACL padrão para o usuário \"%s\" em %s" -#: commands/dbcommands.c:325 +#: catalog/objectaddress.c:2127 catalog/objectaddress.c:2184 +#: catalog/objectaddress.c:2239 #, c-format -msgid "invalid server encoding %d" -msgstr "codificação do servidor %d é inválida" +msgid "name or argument lists may not contain nulls" +msgstr "as listas de nomes ou argumentos não podem conter nulos" -#: commands/dbcommands.c:331 commands/dbcommands.c:336 +#: catalog/objectaddress.c:2161 #, c-format -msgid "invalid locale name: \"%s\"" -msgstr "nome de configuração regional é inválido: \"%s\"" +msgid "unsupported object type \"%s\"" +msgstr "tipo de objeto sem suporte \"%s\"" -#: commands/dbcommands.c:356 +#: catalog/objectaddress.c:2180 catalog/objectaddress.c:2197 +#: catalog/objectaddress.c:2262 catalog/objectaddress.c:2346 #, c-format -msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" -msgstr "nova codificação (%s) é imcompatível com a codificação do banco de dados modelo (%s)" +msgid "name list length must be exactly %d" +msgstr "" -#: commands/dbcommands.c:359 +#: catalog/objectaddress.c:2201 #, c-format -msgid "Use the same encoding as in the template database, or use template0 as template." -msgstr "Utilize a mesma codificação do banco de dados modelo ou utilize template0 como modelo." +msgid "large object OID may not be null" +msgstr "o OID de objeto grande não pode ser nulo" -#: commands/dbcommands.c:364 +#: catalog/objectaddress.c:2210 catalog/objectaddress.c:2280 +#: catalog/objectaddress.c:2287 #, c-format -msgid "new collation (%s) is incompatible with the collation of the template database (%s)" -msgstr "nova ordenação (%s) é incompatível com a ordenação do banco de dados modelo (%s)" +msgid "name list length must be at least %d" +msgstr "o comprimento da lista de nomes deve ser de pelo menos %d" -#: commands/dbcommands.c:366 +#: catalog/objectaddress.c:2273 catalog/objectaddress.c:2294 #, c-format -msgid "Use the same collation as in the template database, or use template0 as template." -msgstr "Utilize a mesma ordenação do banco de dados modelo ou utilize template0 como modelo." +msgid "argument list length must be exactly %d" +msgstr "o comprimento da lista de argumentos deve ser de exatamente %d" -#: commands/dbcommands.c:371 +#: catalog/objectaddress.c:2508 libpq/be-fsstubs.c:329 #, c-format -msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" -msgstr "novo LC_CTYPE (%s) é incompatível com o LC_CTYPE do banco de dados modelo (%s)" +msgid "must be owner of large object %u" +msgstr "é necessário ser o dono do objeto grande %u" -#: commands/dbcommands.c:373 +#: catalog/objectaddress.c:2523 commands/functioncmds.c:1561 #, c-format -msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." -msgstr "Utilize o mesmo LC_CTYPE do banco de dados modelo ou utilize template0 como modelo." +msgid "must be owner of type %s or type %s" +msgstr "é necessário ser o dono do tipo de dados %s, ou do tipo de dados %s" -#: commands/dbcommands.c:395 commands/dbcommands.c:1088 +#: catalog/objectaddress.c:2550 catalog/objectaddress.c:2559 +#: catalog/objectaddress.c:2565 #, c-format -msgid "pg_global cannot be used as default tablespace" -msgstr "pg_global não pode ser utilizado como tablespace padrão" +msgid "permission denied" +msgstr "permissão negada" -#: commands/dbcommands.c:421 +#: catalog/objectaddress.c:2551 catalog/objectaddress.c:2560 #, c-format -msgid "cannot assign new default tablespace \"%s\"" -msgstr "não pode atribuir nova tablespace padrão \"%s\"" +msgid "The current user must have the %s attribute." +msgstr "" -#: commands/dbcommands.c:423 +#: catalog/objectaddress.c:2566 #, c-format -msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." -msgstr "Há um conflito porque o banco de dados \"%s\" já tem algumas tabelas nesta tablespace." +msgid "The current user must have the %s option on role \"%s\"." +msgstr "O usuário corrente deve ter a opção %s na função de banco de dados (role) \"%s\"." -#: commands/dbcommands.c:443 commands/dbcommands.c:959 +#: catalog/objectaddress.c:2580 #, c-format -msgid "database \"%s\" already exists" -msgstr "banco de dados \"%s\" já existe" +msgid "must be superuser" +msgstr "é necessário ser um superusuário" -#: commands/dbcommands.c:457 +#: catalog/objectaddress.c:2649 #, c-format -msgid "source database \"%s\" is being accessed by other users" -msgstr "banco de dados fonte \"%s\" está sendo acessado por outros usuários" +msgid "unrecognized object type \"%s\"" +msgstr "tipo de objeto não reconhecido \"%s\"" -#: commands/dbcommands.c:704 commands/dbcommands.c:719 +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:2941 #, c-format -msgid "encoding \"%s\" does not match locale \"%s\"" -msgstr "codificação \"%s\" não corresponde a configuração regional \"%s\"" +msgid "column %s of %s" +msgstr "coluna %s de %s" -#: commands/dbcommands.c:707 +#: catalog/objectaddress.c:2956 #, c-format -msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." -msgstr "A definição de LC_TYPE escolhida requer codificação \"%s\"." +msgid "function %s" +msgstr "função %s" -#: commands/dbcommands.c:722 +#: catalog/objectaddress.c:2969 #, c-format -msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." -msgstr "A definição de LC_COLLATE escolhida requer codificação \"%s\"." +msgid "type %s" +msgstr "tipo %s" -#: commands/dbcommands.c:782 +#: catalog/objectaddress.c:3006 #, c-format -msgid "database \"%s\" does not exist, skipping" -msgstr "banco de dados \"%s\" não existe, ignorando" +msgid "cast from %s to %s" +msgstr "converte de %s para %s" -#: commands/dbcommands.c:806 +#: catalog/objectaddress.c:3039 #, c-format -msgid "cannot drop a template database" -msgstr "não pode remover banco de dados modelo" +msgid "collation %s" +msgstr "ordenação %s" -#: commands/dbcommands.c:812 +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:3070 #, c-format -msgid "cannot drop the currently open database" -msgstr "não pode remover banco de dados que se encontra aberto" +msgid "constraint %s on %s" +msgstr "restrição %s em %s" -#: commands/dbcommands.c:822 +#: catalog/objectaddress.c:3076 #, c-format -msgid "database \"%s\" is used by a logical replication slot" -msgstr "banco de dados \"%s\" está sendo utilizado por uma entrada de replicação lógica" +msgid "constraint %s" +msgstr "restrição %s" -#: commands/dbcommands.c:824 +#: catalog/objectaddress.c:3108 #, c-format -msgid "There is %d slot, %d of them active." -msgid_plural "There are %d slots, %d of them active." -msgstr[0] "Há %d entrada, %d delas ativas." -msgstr[1] "Há %d entradas, %d delas ativas." +msgid "conversion %s" +msgstr "conversão %s" -#: commands/dbcommands.c:838 commands/dbcommands.c:981 -#: commands/dbcommands.c:1110 +#. translator: %s is typically "column %s of table %s" +#: catalog/objectaddress.c:3130 #, c-format -msgid "database \"%s\" is being accessed by other users" -msgstr "banco de dados \"%s\" está sendo acessado por outros usuários" +msgid "default value for %s" +msgstr "valor padrão para %s" -#: commands/dbcommands.c:950 +#: catalog/objectaddress.c:3141 #, c-format -msgid "permission denied to rename database" -msgstr "permissão negada ao renomear banco de dados" +msgid "language %s" +msgstr "linguagem %s" -#: commands/dbcommands.c:970 +#: catalog/objectaddress.c:3149 #, c-format -msgid "current database cannot be renamed" -msgstr "banco de dados atual não pode ser renomeado" +msgid "large object %u" +msgstr "objeto grande %u" -#: commands/dbcommands.c:1066 +#: catalog/objectaddress.c:3162 #, c-format -msgid "cannot change the tablespace of the currently open database" -msgstr "não pode mudar a tablespace de um banco de dados que se encontra aberto" +msgid "operator %s" +msgstr "operador %s" -#: commands/dbcommands.c:1169 +#: catalog/objectaddress.c:3199 #, c-format -msgid "some relations of database \"%s\" are already in tablespace \"%s\"" -msgstr "algumas relações do banco de dados \"%s\" já estão na tablespace \"%s\"" +msgid "operator class %s for access method %s" +msgstr "classe de operadores %s para método de acesso %s" -#: commands/dbcommands.c:1171 +#: catalog/objectaddress.c:3227 #, c-format -msgid "You must move them back to the database's default tablespace before using this command." -msgstr "Você deve movê-las de volta para a tablespace padrão do banco de dados antes de utilizar este comando." +msgid "access method %s" +msgstr "método de acesso %s" -#: commands/dbcommands.c:1302 commands/dbcommands.c:1790 -#: commands/dbcommands.c:1996 commands/dbcommands.c:2044 -#: commands/tablespace.c:604 -#, c-format -msgid "some useless files may be left behind in old database directory \"%s\"" -msgstr "alguns arquivos inúteis podem ser deixados no diretório de banco de dados antigo \"%s\"" +#. translator: %d is the operator strategy (a number), the +#. first two %s's are data type names, the third %s is the +#. description of the operator family, and the last %s is the +#. textual form of the operator with arguments. +#: catalog/objectaddress.c:3276 +#, c-format +msgid "operator %d (%s, %s) of %s: %s" +msgstr "operador %d (%s, %s) de %s: %s" -#: commands/dbcommands.c:1558 +#. translator: %d is the function number, the first two %s's +#. are data type names, the third %s is the description of the +#. operator family, and the last %s is the textual form of the +#. function with arguments. +#: catalog/objectaddress.c:3333 #, c-format -msgid "permission denied to change owner of database" -msgstr "permissão negada ao mudar dono do banco de dados" +msgid "function %d (%s, %s) of %s: %s" +msgstr "função %d (%s, %s) de %s: %s" -#: commands/dbcommands.c:1879 +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:3385 #, c-format -msgid "There are %d other session(s) and %d prepared transaction(s) using the database." -msgstr "Há %d outra(s) sessão(ões) e %d transação(ões) preparada(s) utilizando o banco de dados." +msgid "rule %s on %s" +msgstr "regra %s em %s" -#: commands/dbcommands.c:1882 +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:3431 #, c-format -msgid "There is %d other session using the database." -msgid_plural "There are %d other sessions using the database." -msgstr[0] "Há %d outra sessão utilizando o banco de dados." -msgstr[1] "Há %d outras sessões utilizando o banco de dados." +msgid "trigger %s on %s" +msgstr "gatilho %s em %s" -#: commands/dbcommands.c:1887 +#: catalog/objectaddress.c:3451 #, c-format -msgid "There is %d prepared transaction using the database." -msgid_plural "There are %d prepared transactions using the database." -msgstr[0] "Há %d transação preparada utilizando o banco de dados." -msgstr[1] "Há %d transações preparadas utilizando o banco de dados." +msgid "schema %s" +msgstr "esquema %s" -#: commands/define.c:54 commands/define.c:228 commands/define.c:260 -#: commands/define.c:288 +#: catalog/objectaddress.c:3479 #, c-format -msgid "%s requires a parameter" -msgstr "%s requer um parâmetro" +msgid "statistics object %s" +msgstr "objeto de estatísticas %s" -#: commands/define.c:90 commands/define.c:101 commands/define.c:195 -#: commands/define.c:213 +#: catalog/objectaddress.c:3510 #, c-format -msgid "%s requires a numeric value" -msgstr "%s requer um valor numérico" +msgid "text search parser %s" +msgstr "analisador de procura de texto completo %s" -#: commands/define.c:157 +#: catalog/objectaddress.c:3541 #, c-format -msgid "%s requires a Boolean value" -msgstr "%s requer um valor Booleano" +msgid "text search dictionary %s" +msgstr "dicionário de procura de texto completo %s" -#: commands/define.c:171 commands/define.c:180 commands/define.c:297 +#: catalog/objectaddress.c:3572 #, c-format -msgid "%s requires an integer value" -msgstr "%s requer um valor inteiro" +msgid "text search template %s" +msgstr "modelo de procura de texto completo %s" -#: commands/define.c:242 +#: catalog/objectaddress.c:3603 #, c-format -msgid "argument of %s must be a name" -msgstr "argumento de %s deve ser um nome" +msgid "text search configuration %s" +msgstr "configuração de procura de texto completo %s" -#: commands/define.c:272 +#: catalog/objectaddress.c:3616 #, c-format -msgid "argument of %s must be a type name" -msgstr "argumento de %s deve ser um nome de um tipo" +msgid "role %s" +msgstr "role %s" -#: commands/define.c:318 +#: catalog/objectaddress.c:3653 catalog/objectaddress.c:5505 #, c-format -msgid "invalid argument for %s: \"%s\"" -msgstr "argumento é inválido para %s: \"%s\"" +msgid "membership of role %s in role %s" +msgstr "filiação da função de banco de dados (role) %s na função de banco de dados %s" -#: commands/dropcmds.c:112 commands/functioncmds.c:1110 -#: utils/adt/ruleutils.c:1936 +#: catalog/objectaddress.c:3674 #, c-format -msgid "\"%s\" is an aggregate function" -msgstr "\"%s\" é uma função de agregação" +msgid "database %s" +msgstr "banco de dados %s" -#: commands/dropcmds.c:114 +#: catalog/objectaddress.c:3690 #, c-format -msgid "Use DROP AGGREGATE to drop aggregate functions." -msgstr "Utilize DROP AGGREGATE para remover funções de agregação." +msgid "tablespace %s" +msgstr "espaço de tabelas %s" -#: commands/dropcmds.c:165 commands/sequence.c:400 commands/tablecmds.c:2318 -#: commands/tablecmds.c:2499 commands/tablecmds.c:10625 tcop/utility.c:1006 +#: catalog/objectaddress.c:3701 #, c-format -msgid "relation \"%s\" does not exist, skipping" -msgstr "relação \"%s\" não existe, ignorando" +msgid "foreign-data wrapper %s" +msgstr "empacotador de dados estrangeiros %s" -#: commands/dropcmds.c:195 commands/dropcmds.c:288 commands/tablecmds.c:713 +#: catalog/objectaddress.c:3711 #, c-format -msgid "schema \"%s\" does not exist, skipping" -msgstr "esquema \"%s\" não existe, ignorando" +msgid "server %s" +msgstr "servidor %s" -#: commands/dropcmds.c:237 commands/dropcmds.c:269 commands/tablecmds.c:237 +#: catalog/objectaddress.c:3744 #, c-format -msgid "type \"%s\" does not exist, skipping" -msgstr "tipo \"%s\" não existe, ignorando" +msgid "user mapping for %s on server %s" +msgstr "mapeamento de usuário para %s no servidor %s" -#: commands/dropcmds.c:276 +#: catalog/objectaddress.c:3796 #, c-format -msgid "collation \"%s\" does not exist, skipping" -msgstr "ordenação \"%s\" não existe, ignorando" +msgid "default privileges on new relations belonging to role %s in schema %s" +msgstr "privilégios padrão em novas relações pertencentes à função de banco de dados (role) %s no esquema %s" -#: commands/dropcmds.c:283 +#: catalog/objectaddress.c:3800 #, c-format -msgid "conversion \"%s\" does not exist, skipping" -msgstr "conversão \"%s\" não existe, ignorando" +msgid "default privileges on new relations belonging to role %s" +msgstr "privilégios padrão em novas relações pertencentes à função de banco de dados (role) %s" -#: commands/dropcmds.c:294 +#: catalog/objectaddress.c:3806 #, c-format -msgid "text search parser \"%s\" does not exist, skipping" -msgstr "analisador de busca textual \"%s\" não existe, ignorando" +msgid "default privileges on new sequences belonging to role %s in schema %s" +msgstr "privilégios padrão em novas sequências pertencentes à função de banco de dados (role) %s no esquema %s" -#: commands/dropcmds.c:301 +#: catalog/objectaddress.c:3810 #, c-format -msgid "text search dictionary \"%s\" does not exist, skipping" -msgstr "dicionário de busca textual \"%s\" não existe, ignorando" +msgid "default privileges on new sequences belonging to role %s" +msgstr "privilégios padrão em novas sequências pertencentes à função de banco de dados (role) %s" -#: commands/dropcmds.c:308 +#: catalog/objectaddress.c:3816 #, c-format -msgid "text search template \"%s\" does not exist, skipping" -msgstr "modelo de busca textual \"%s\" não existe, ignorando" +msgid "default privileges on new functions belonging to role %s in schema %s" +msgstr "privilégios padrão em novas funções pertencentes à função de banco de dados (role) %s no esquema %s" -#: commands/dropcmds.c:315 +#: catalog/objectaddress.c:3820 #, c-format -msgid "text search configuration \"%s\" does not exist, skipping" -msgstr "configuração de busca textual \"%s\" não existe, ignorando" +msgid "default privileges on new functions belonging to role %s" +msgstr "privilégios padrão em novas funções pertencem a role %s" -#: commands/dropcmds.c:320 +#: catalog/objectaddress.c:3826 #, c-format -msgid "extension \"%s\" does not exist, skipping" -msgstr "extensão \"%s\" não existe, ignorando" +msgid "default privileges on new types belonging to role %s in schema %s" +msgstr "privilégios padrão em novos tipos de dados pertencentes à função de banco de dados (role) %s no esquema %s" -#: commands/dropcmds.c:327 +#: catalog/objectaddress.c:3830 #, c-format -msgid "function %s(%s) does not exist, skipping" -msgstr "função %s(%s) não existe, ignorando" +msgid "default privileges on new types belonging to role %s" +msgstr "privilégios padrão em novos tipos de dados pertencentes à função de banco de dados (role) %s" -#: commands/dropcmds.c:336 +#: catalog/objectaddress.c:3836 #, c-format -msgid "aggregate %s(%s) does not exist, skipping" -msgstr "agregação %s(%s) não existe, ignorando" +msgid "default privileges on new schemas belonging to role %s" +msgstr "privilégios padrão em novos esquemas pertencentes à função de banco de dados (role) %s" -#: commands/dropcmds.c:345 +#: catalog/objectaddress.c:3843 #, c-format -msgid "operator %s does not exist, skipping" -msgstr "operador %s não existe, ignorando" +msgid "default privileges belonging to role %s in schema %s" +msgstr "privilégios padrão pertencentes à função de banco de dados (role) %s no esquema %s" -#: commands/dropcmds.c:350 +#: catalog/objectaddress.c:3847 #, c-format -msgid "language \"%s\" does not exist, skipping" -msgstr "linguagem \"%s\" não existe, ignorando" +msgid "default privileges belonging to role %s" +msgstr "privilégios padrão pertencentes à função de banco de dados (role) %s" -#: commands/dropcmds.c:359 +#: catalog/objectaddress.c:3869 #, c-format -msgid "cast from type %s to type %s does not exist, skipping" -msgstr "conversão do tipo %s para tipo %s não existe, ignorando" +msgid "extension %s" +msgstr "extensão %s" -#: commands/dropcmds.c:368 +#: catalog/objectaddress.c:3886 #, c-format -msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" -msgstr "gatilho \"%s\" para relação \"%s\" não existe, ignorando" +msgid "event trigger %s" +msgstr "gatilho de eventos %s" -#: commands/dropcmds.c:375 +#: catalog/objectaddress.c:3910 #, c-format -msgid "event trigger \"%s\" does not exist, skipping" -msgstr "gatilho de eventos \"%s\" não existe, ignorando" +msgid "parameter %s" +msgstr "parâmetro %s" -#: commands/dropcmds.c:381 +#. translator: second %s is, e.g., "table %s" +#: catalog/objectaddress.c:3953 #, c-format -msgid "rule \"%s\" for relation \"%s\" does not exist, skipping" -msgstr "regra \"%s\" para relação \"%s\" não existe, ignorando" +msgid "policy %s on %s" +msgstr "política %s em %s" -#: commands/dropcmds.c:388 +#: catalog/objectaddress.c:3967 #, c-format -msgid "foreign-data wrapper \"%s\" does not exist, skipping" -msgstr "adaptador de dados externos \"%s\" não existe, ignorando" +msgid "publication %s" +msgstr "publicação %s" -#: commands/dropcmds.c:392 +#: catalog/objectaddress.c:3980 #, c-format -msgid "server \"%s\" does not exist, skipping" -msgstr "servidor \"%s\" não existe, ignorando" +msgid "publication of schema %s in publication %s" +msgstr "" -#: commands/dropcmds.c:398 +#. translator: first %s is, e.g., "table %s" +#: catalog/objectaddress.c:4011 #, c-format -msgid "operator class \"%s\" does not exist for access method \"%s\", skipping" -msgstr "família de operadores \"%s\" não existe para método de acesso \"%s\", ignorando" +msgid "publication of %s in publication %s" +msgstr "publicação de %s na publicação %s" -#: commands/dropcmds.c:406 +#: catalog/objectaddress.c:4024 #, c-format -msgid "operator family \"%s\" does not exist for access method \"%s\", skipping" -msgstr "família de operadores \"%s\" não existe para método de acesso \"%s\", ignorando" +msgid "subscription %s" +msgstr "subscrição %s" -#: commands/event_trigger.c:149 +#: catalog/objectaddress.c:4045 #, c-format -msgid "permission denied to create event trigger \"%s\"" -msgstr "permissão negada ao criar gatilho de eventos \"%s\"" +msgid "transform for %s language %s" +msgstr "transformação para %s linguagem %s" -#: commands/event_trigger.c:151 +#: catalog/objectaddress.c:4116 #, c-format -msgid "Must be superuser to create an event trigger." -msgstr "Deve ser super-usuário para criar um gatilho de eventos." +msgid "table %s" +msgstr "tabela %s" -#: commands/event_trigger.c:159 +#: catalog/objectaddress.c:4121 #, c-format -msgid "unrecognized event name \"%s\"" -msgstr "nome de evento \"%s\" desconhecido" +msgid "index %s" +msgstr "índice %s" -#: commands/event_trigger.c:176 +#: catalog/objectaddress.c:4125 #, c-format -msgid "unrecognized filter variable \"%s\"" -msgstr "variável de filtro \"%s\" desconhecida" +msgid "sequence %s" +msgstr "sequência %s" -#: commands/event_trigger.c:203 +#: catalog/objectaddress.c:4129 #, c-format -msgid "function \"%s\" must return type \"event_trigger\"" -msgstr "função \"%s\" deve retornar tipo \"event_trigger\"" +msgid "toast table %s" +msgstr "tabela toast %s" -#: commands/event_trigger.c:228 +#: catalog/objectaddress.c:4133 #, c-format -msgid "filter value \"%s\" not recognized for filter variable \"%s\"" -msgstr "valor de filtro \"%s\" desconhecido para variável de filtro \"%s\"" +msgid "view %s" +msgstr "visão %s" -#. translator: %s represents an SQL statement name -#: commands/event_trigger.c:234 +#: catalog/objectaddress.c:4137 #, c-format -msgid "event triggers are not supported for %s" -msgstr "gatilhos de eventos não são suportados por %s" +msgid "materialized view %s" +msgstr "visão materializada %s" -#: commands/event_trigger.c:289 +#: catalog/objectaddress.c:4141 #, c-format -msgid "filter variable \"%s\" specified more than once" -msgstr "variável de filtro \"%s\" foi especificada mais de uma vez" +msgid "composite type %s" +msgstr "tipo composto %s" -#: commands/event_trigger.c:437 commands/event_trigger.c:480 -#: commands/event_trigger.c:571 +#: catalog/objectaddress.c:4145 #, c-format -msgid "event trigger \"%s\" does not exist" -msgstr "gatilho de eventos \"%s\" não existe" +msgid "foreign table %s" +msgstr "tabela estrangeira %s" -#: commands/event_trigger.c:539 +#: catalog/objectaddress.c:4150 #, c-format -msgid "permission denied to change owner of event trigger \"%s\"" -msgstr "permissão negada ao mudar dono de gatilho de eventos \"%s\"" +msgid "relation %s" +msgstr "relação %s" -#: commands/event_trigger.c:541 +#: catalog/objectaddress.c:4191 #, c-format -msgid "The owner of an event trigger must be a superuser." -msgstr "O dono de um gatilho de eventos deve ser um super-usuário." +msgid "operator family %s for access method %s" +msgstr "família de operador %s para método de acesso %s" -#: commands/event_trigger.c:1219 +#: catalog/pg_aggregate.c:129 #, c-format -msgid "%s can only be called in a sql_drop event trigger function" -msgstr "%s só pode ser chamada na função de gatilho do evento sql_drop" +msgid "aggregates cannot have more than %d argument" +msgid_plural "aggregates cannot have more than %d arguments" +msgstr[0] "agregações não podem ter mais do que %d argumento" +msgstr[1] "agregações não podem ter mais do que %d argumentos" -#: commands/event_trigger.c:1226 commands/extension.c:1646 -#: commands/extension.c:1755 commands/extension.c:1948 commands/prepare.c:702 -#: executor/execQual.c:1739 executor/execQual.c:1764 executor/execQual.c:2139 -#: executor/execQual.c:5315 executor/functions.c:1018 foreign/foreign.c:421 -#: replication/logical/logicalfuncs.c:310 replication/slotfuncs.c:173 -#: replication/walsender.c:2746 utils/adt/jsonfuncs.c:1386 -#: utils/adt/jsonfuncs.c:1518 utils/adt/jsonfuncs.c:1708 -#: utils/adt/jsonfuncs.c:1837 utils/adt/jsonfuncs.c:2601 -#: utils/fmgr/funcapi.c:61 utils/mmgr/portalmem.c:986 +#: catalog/pg_aggregate.c:144 catalog/pg_aggregate.c:158 #, c-format -msgid "set-valued function called in context that cannot accept a set" -msgstr "função que tem argumento do tipo conjunto foi chamada em um contexto que não pode aceitar um conjunto" +msgid "cannot determine transition data type" +msgstr "não é possível determinar o tipo de dados transitório" -#: commands/event_trigger.c:1230 commands/extension.c:1650 -#: commands/extension.c:1759 commands/extension.c:1952 commands/prepare.c:706 -#: foreign/foreign.c:426 replication/logical/logicalfuncs.c:314 -#: replication/slotfuncs.c:177 replication/walsender.c:2750 -#: utils/mmgr/portalmem.c:990 +#: catalog/pg_aggregate.c:173 #, c-format -msgid "materialize mode required, but it is not allowed in this context" -msgstr "modo de materialização é requerido, mas ele não é permitido neste contexto" +msgid "a variadic ordered-set aggregate must use VARIADIC type ANY" +msgstr "uma agregação de conjunto ordenado VARIADIC deve utilizar tipo VARIADIC ANY" -#: commands/explain.c:169 +#: catalog/pg_aggregate.c:199 #, c-format -msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" -msgstr "valor desconhecido para opção EXPLAIN \"%s\": \"%s\"" +msgid "a hypothetical-set aggregate must have direct arguments matching its aggregated arguments" +msgstr "uma agregação de conjunto hipotético deve ter argumentos diretos correspondendo a seus argumentos agregados" -#: commands/explain.c:175 +#: catalog/pg_aggregate.c:246 catalog/pg_aggregate.c:290 #, c-format -msgid "unrecognized EXPLAIN option \"%s\"" -msgstr "opção EXPLAIN desconhecida \"%s\"" +msgid "return type of transition function %s is not %s" +msgstr "tipo retornado da função de transição %s não é %s" -#: commands/explain.c:182 +#: catalog/pg_aggregate.c:266 catalog/pg_aggregate.c:309 #, c-format -msgid "EXPLAIN option BUFFERS requires ANALYZE" -msgstr "opção BUFFERS do EXPLAIN requer ANALYZE" +msgid "must not omit initial value when transition function is strict and transition type is not compatible with input type" +msgstr "não deve omitir valor inicial quando a função de transição é estrita e o tipo de transição não é compatível com tipo de entrada" -#: commands/explain.c:191 +#: catalog/pg_aggregate.c:335 #, c-format -msgid "EXPLAIN option TIMING requires ANALYZE" -msgstr "opção TIMING do EXPLAIN requer ANALYZE" +msgid "return type of inverse transition function %s is not %s" +msgstr "tipo retornado da função de transição inversa %s não é %s" -#: commands/extension.c:148 commands/extension.c:2628 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:3009 #, c-format -msgid "extension \"%s\" does not exist" -msgstr "extensão \"%s\" não existe" +msgid "strictness of aggregate's forward and inverse transition functions must match" +msgstr "propriedade STRICT das funções de transição direta e inversa de uma agregação devem corresponder" -#: commands/extension.c:247 commands/extension.c:256 commands/extension.c:268 -#: commands/extension.c:278 +#: catalog/pg_aggregate.c:396 catalog/pg_aggregate.c:554 #, c-format -msgid "invalid extension name: \"%s\"" -msgstr "nome de extensão é inválido: \"%s\"" +msgid "final function with extra arguments must not be declared STRICT" +msgstr "função final com argumentos extras não deve ser declarada STRICT" -#: commands/extension.c:248 +#: catalog/pg_aggregate.c:427 #, c-format -msgid "Extension names must not be empty." -msgstr "Nomes de extensão não devem ser vazios." +msgid "return type of combine function %s is not %s" +msgstr "o tipo retornado pela função de combinação %s não é %s" -#: commands/extension.c:257 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3903 #, c-format -msgid "Extension names must not contain \"--\"." -msgstr "Nomes de extensão não devem conter \"--\"." +msgid "combine function with transition type %s must not be declared STRICT" +msgstr "função de combinação com tipo de transição %s não deve ser declarada STRICT" -#: commands/extension.c:269 +#: catalog/pg_aggregate.c:458 #, c-format -msgid "Extension names must not begin or end with \"-\"." -msgstr "Nomes de extensão não devem começar ou terminar com \"-\"." +msgid "return type of serialization function %s is not %s" +msgstr "tipo retornado pela função de serialização %s não é %s" -#: commands/extension.c:279 +#: catalog/pg_aggregate.c:479 #, c-format -msgid "Extension names must not contain directory separator characters." -msgstr "Nomes de extensões não devem conter caracteres separadores de diretórios." +msgid "return type of deserialization function %s is not %s" +msgstr "tipo retornado pela função de desserialização %s não é %s" -#: commands/extension.c:294 commands/extension.c:303 commands/extension.c:312 -#: commands/extension.c:322 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:191 catalog/pg_proc.c:225 #, c-format -msgid "invalid extension version name: \"%s\"" -msgstr "nome de versão da extensão é inválido: \"%s\"" +msgid "cannot determine result data type" +msgstr "não é possível determinar o tipo de dados do resultado" -#: commands/extension.c:295 +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:204 catalog/pg_proc.c:233 #, c-format -msgid "Version names must not be empty." -msgstr "Nomes de versão não devem ser vazios." +msgid "unsafe use of pseudo-type \"internal\"" +msgstr "uso inseguro do pseudo-tipo \"internal\"" -#: commands/extension.c:304 +#: catalog/pg_aggregate.c:567 #, c-format -msgid "Version names must not contain \"--\"." -msgstr "Nomes de versão não devem conter \"--\"." +msgid "moving-aggregate implementation returns type %s, but plain implementation returns type %s" +msgstr "implementação de agregação em movimento retorna tipo %s, mas implementação simples retorna tipo %s" -#: commands/extension.c:313 +#: catalog/pg_aggregate.c:578 #, c-format -msgid "Version names must not begin or end with \"-\"." -msgstr "Nomes de versão não devem começar ou terminar com \"-\"." +msgid "sort operator can only be specified for single-argument aggregates" +msgstr "o operador de classificação só pode ser especificado para agregações de argumento único" -#: commands/extension.c:323 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 #, c-format -msgid "Version names must not contain directory separator characters." -msgstr "Nomes de versão não devem conter caracteres separadores de diretórios." +msgid "cannot change routine kind" +msgstr "não é possível mudar o tipo de rotina" -#: commands/extension.c:473 +#: catalog/pg_aggregate.c:708 #, c-format -msgid "could not open extension control file \"%s\": %m" -msgstr "não pôde abrir arquivo de controle da extensão \"%s\": %m" +msgid "\"%s\" is an ordinary aggregate function." +msgstr "\"%s\" é uma função de agregação comum." -#: commands/extension.c:495 commands/extension.c:505 +#: catalog/pg_aggregate.c:710 #, c-format -msgid "parameter \"%s\" cannot be set in a secondary extension control file" -msgstr "parâmetro \"%s\" não pode ser definido em um segundo arquivo de controle da extensão" +msgid "\"%s\" is an ordered-set aggregate." +msgstr "%s é uma agregação de conjunto ordenado." -#: commands/extension.c:544 +#: catalog/pg_aggregate.c:712 #, c-format -msgid "\"%s\" is not a valid encoding name" -msgstr "\"%s\" não é um nome de codificação válido" +msgid "\"%s\" is a hypothetical-set aggregate." +msgstr "" -#: commands/extension.c:558 +#: catalog/pg_aggregate.c:717 #, c-format -msgid "parameter \"%s\" must be a list of extension names" -msgstr "parâmetro \"%s\" deve ser uma lista de nomes de extensões" +msgid "cannot change number of direct arguments of an aggregate function" +msgstr "não é possível mudar o número de argumentos diretos de uma função de agregação" -#: commands/extension.c:565 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:691 +#: commands/typecmds.c:1975 commands/typecmds.c:2021 commands/typecmds.c:2073 +#: commands/typecmds.c:2110 commands/typecmds.c:2144 commands/typecmds.c:2178 +#: commands/typecmds.c:2212 commands/typecmds.c:2241 commands/typecmds.c:2328 +#: commands/typecmds.c:2370 parser/parse_func.c:417 parser/parse_func.c:448 +#: parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 +#: parser/parse_func.c:631 parser/parse_func.c:2171 parser/parse_func.c:2444 #, c-format -msgid "unrecognized parameter \"%s\" in file \"%s\"" -msgstr "parâmetro \"%s\" desconhecido em arquivo \"%s\"" +msgid "function %s does not exist" +msgstr "função %s não existe" -#: commands/extension.c:574 +#: catalog/pg_aggregate.c:864 #, c-format -msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" -msgstr "parâmetro \"schema\" não pode ser especificado quando \"relocatable\" é verdadeiro" +msgid "function %s returns a set" +msgstr "função %s retorna um conjunto" -#: commands/extension.c:722 +#: catalog/pg_aggregate.c:879 #, c-format -msgid "transaction control statements are not allowed within an extension script" -msgstr "comandos de controle de transação não são permitidos dentro do script da extensão" +msgid "function %s must accept VARIADIC ANY to be used in this aggregate" +msgstr "função %s deve aceitar VARIADIC ANY ser utilizado nesta agregação" -#: commands/extension.c:790 +#: catalog/pg_aggregate.c:903 #, c-format -msgid "permission denied to create extension \"%s\"" -msgstr "permissão negada ao criar extensão \"%s\"" +msgid "function %s requires run-time type coercion" +msgstr "função %s requer conversão de tipo em tempo de execução" -#: commands/extension.c:792 +#: catalog/pg_cast.c:75 #, c-format -msgid "Must be superuser to create this extension." -msgstr "Deve ser super-usuário para criar uma extensão." +msgid "cast from type %s to type %s already exists" +msgstr "conversão do tipo %s para tipo %s já existe" -#: commands/extension.c:796 +#: catalog/pg_class.c:29 #, c-format -msgid "permission denied to update extension \"%s\"" -msgstr "permissão negada ao atualizar extensão \"%s\"" +msgid "This operation is not supported for tables." +msgstr "Essa operação não tem suporte para tabelas." -#: commands/extension.c:798 +#: catalog/pg_class.c:31 #, c-format -msgid "Must be superuser to update this extension." -msgstr "Deve ser super-usuário para atualizar esta extensão." +msgid "This operation is not supported for indexes." +msgstr "Essa operação não tem suporte para índices." -#: commands/extension.c:1080 +#: catalog/pg_class.c:33 #, c-format -msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" -msgstr "extensão \"%s\" não possui caminho de atualização da versão \"%s\" para versão \"%s\"" +msgid "This operation is not supported for sequences." +msgstr "Essa operação não tem suporte para sequências." -#: commands/extension.c:1207 +#: catalog/pg_class.c:35 #, c-format -msgid "extension \"%s\" already exists, skipping" -msgstr "extensão \"%s\" já existe, ignorando" +msgid "This operation is not supported for TOAST tables." +msgstr "Essa operação não tem suporte para tabelas TOAST." -#: commands/extension.c:1214 +#: catalog/pg_class.c:37 #, c-format -msgid "extension \"%s\" already exists" -msgstr "extensão \"%s\" já existe" +msgid "This operation is not supported for views." +msgstr "Essa operação não tem suporte para visões." -#: commands/extension.c:1225 +#: catalog/pg_class.c:39 #, c-format -msgid "nested CREATE EXTENSION is not supported" -msgstr "CREATE EXTENSION aninhado não é suportado" +msgid "This operation is not supported for materialized views." +msgstr "Essa operação não tem suporte para visões materializadas." -#: commands/extension.c:1280 commands/extension.c:2688 +#: catalog/pg_class.c:41 #, c-format -msgid "version to install must be specified" -msgstr "versão a ser instalada deve ser especificada" +msgid "This operation is not supported for composite types." +msgstr "Essa operação não tem suporte para tipos de dados compostos." -#: commands/extension.c:1297 +#: catalog/pg_class.c:43 #, c-format -msgid "FROM version must be different from installation target version \"%s\"" -msgstr "versão do FROM deve ser diferente da versão da instalação \"%s\"" +msgid "This operation is not supported for foreign tables." +msgstr "Essa operação não tem suporte para tabelas estrangeiras." -#: commands/extension.c:1352 +#: catalog/pg_class.c:45 #, c-format -msgid "extension \"%s\" must be installed in schema \"%s\"" -msgstr "extensão \"%s\" deve ser instalada no esquema \"%s\"" +msgid "This operation is not supported for partitioned tables." +msgstr "Essa operação não tem suporte para tabelas particionadas." -#: commands/extension.c:1436 commands/extension.c:2831 +#: catalog/pg_class.c:47 #, c-format -msgid "required extension \"%s\" is not installed" -msgstr "extensão requerida \"%s\" não está instalada" +msgid "This operation is not supported for partitioned indexes." +msgstr "Essa operação não tem suporte para índices particionados." -#: commands/extension.c:1598 +#: catalog/pg_collation.c:102 catalog/pg_collation.c:160 #, c-format -msgid "cannot drop extension \"%s\" because it is being modified" -msgstr "não pode remover extensão \"%s\" porque ela está sendo modificada" +msgid "collation \"%s\" already exists, skipping" +msgstr "a ordenação \"%s\" já existe, ignorando" -#: commands/extension.c:2069 +#: catalog/pg_collation.c:104 #, c-format -msgid "pg_extension_config_dump() can only be called from an SQL script executed by CREATE EXTENSION" -msgstr "pg_extension_config_dump() só pode ser chamada de um script SQL executado por CREATE EXTENSION" +msgid "collation \"%s\" for encoding \"%s\" already exists, skipping" +msgstr "a ordenação \"%s\" para codificação \"%s\" já existe, ignorando" -#: commands/extension.c:2081 +#: catalog/pg_collation.c:112 catalog/pg_collation.c:167 #, c-format -msgid "OID %u does not refer to a table" -msgstr "OID %u não se refere a uma tabela" +msgid "collation \"%s\" already exists" +msgstr "ordenação \"%s\" já existe" -#: commands/extension.c:2086 +#: catalog/pg_collation.c:114 #, c-format -msgid "table \"%s\" is not a member of the extension being created" -msgstr "tabela \"%s\" não é um membro da extensão que está sendo criada" +msgid "collation \"%s\" for encoding \"%s\" already exists" +msgstr "ordenação \"%s\" para codificação \"%s\" já existe" -#: commands/extension.c:2450 +#: catalog/pg_constraint.c:690 #, c-format -msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" -msgstr "não pode mover extensão \"%s\" para esquema \"%s\" porque a extensão contém o esquema" +msgid "constraint \"%s\" for domain %s already exists" +msgstr "restrição \"%s\" para domínio %s já existe" -#: commands/extension.c:2490 commands/extension.c:2553 +#: catalog/pg_constraint.c:890 catalog/pg_constraint.c:983 #, c-format -msgid "extension \"%s\" does not support SET SCHEMA" -msgstr "extensão \"%s\" não suporta SET SCHEMA" +msgid "constraint \"%s\" for table \"%s\" does not exist" +msgstr "restrição \"%s\" na tabela \"%s\" não existe" -#: commands/extension.c:2555 +#: catalog/pg_constraint.c:1083 #, c-format -msgid "%s is not in the extension's schema \"%s\"" -msgstr "%s não está no esquema da extensão \"%s\"" +msgid "constraint \"%s\" for domain %s does not exist" +msgstr "não existe a restrição \"%s\" para o domínio %s" -#: commands/extension.c:2608 +#: catalog/pg_conversion.c:67 #, c-format -msgid "nested ALTER EXTENSION is not supported" -msgstr "ALTER EXTENSION aninhado não é suportado" +msgid "conversion \"%s\" already exists" +msgstr "conversão \"%s\" já existe" -#: commands/extension.c:2699 +#: catalog/pg_conversion.c:80 #, c-format -msgid "version \"%s\" of extension \"%s\" is already installed" -msgstr "versao \"%s\" da extensão \"%s\" já está instalada" +msgid "default conversion for %s to %s already exists" +msgstr "conversão padrão de %s para %s já existe" -#: commands/extension.c:2938 +#: catalog/pg_depend.c:222 commands/extension.c:3368 #, c-format -msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" -msgstr "não pode adicionar esquema \"%s\" a extensão \"%s\" porque o esquema contém a extensão" +msgid "%s is already a member of extension \"%s\"" +msgstr "role \"%s\" já é um membro da extensão \"%s\"" -#: commands/extension.c:2956 +#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3408 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s não é um membro da extensão \"%s\"" -#: commands/foreigncmds.c:138 commands/foreigncmds.c:147 +#: catalog/pg_depend.c:232 #, c-format -msgid "option \"%s\" not found" -msgstr "opção \"%s\" não foi encontrada" +msgid "An extension is not allowed to replace an object that it does not own." +msgstr "Uma extensão não pode substituir um objeto que não seja de sua propriedade." -#: commands/foreigncmds.c:157 +#: catalog/pg_depend.c:283 #, c-format -msgid "option \"%s\" provided more than once" -msgstr "opção \"%s\" especificada mais de uma vez" +msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." +msgstr "Uma extensão só pode usar CREATE ... IF NOT EXISTS para pular a criação do objeto, se o objeto conflitante já pertencer a extensão." -#: commands/foreigncmds.c:223 commands/foreigncmds.c:231 +#: catalog/pg_depend.c:646 #, c-format -msgid "permission denied to change owner of foreign-data wrapper \"%s\"" -msgstr "permissão negada ao mudar dono do adaptador de dados externos \"%s\"" +msgid "cannot remove dependency on %s because it is a system object" +msgstr "não é possível remover a dependência em %s, porque este é um objeto do sistema" -#: commands/foreigncmds.c:225 +#: catalog/pg_enum.c:137 catalog/pg_enum.c:259 catalog/pg_enum.c:554 #, c-format -msgid "Must be superuser to change owner of a foreign-data wrapper." -msgstr "Deve ser super-usuário para mudar dono de um adaptador de dados externos." +msgid "invalid enum label \"%s\"" +msgstr "o rótulo do enum \"%s\" não é válido" -#: commands/foreigncmds.c:233 +#: catalog/pg_enum.c:138 catalog/pg_enum.c:260 catalog/pg_enum.c:555 #, c-format -msgid "The owner of a foreign-data wrapper must be a superuser." -msgstr "O dono de um adaptador de dados externos deve ser um super-usuário." +msgid "Labels must be %d bytes or less." +msgstr "Os rótulos devem ter %d bytes ou menos." -#: commands/foreigncmds.c:271 commands/foreigncmds.c:655 foreign/foreign.c:600 +#: catalog/pg_enum.c:288 #, c-format -msgid "foreign-data wrapper \"%s\" does not exist" -msgstr "adaptador de dados externos \"%s\" não existe" +msgid "enum label \"%s\" already exists, skipping" +msgstr "rótulo do enum \"%s\" já existe, ignorando" -#: commands/foreigncmds.c:380 commands/foreigncmds.c:944 -#: commands/foreigncmds.c:1285 foreign/foreign.c:621 +#: catalog/pg_enum.c:295 catalog/pg_enum.c:598 #, c-format -msgid "server \"%s\" does not exist" -msgstr "servidor \"%s\" não existe" +msgid "enum label \"%s\" already exists" +msgstr "rótulo do enum \"%s\" já existe" -#: commands/foreigncmds.c:436 +#: catalog/pg_enum.c:350 catalog/pg_enum.c:593 #, c-format -msgid "function %s must return type \"fdw_handler\"" -msgstr "função %s deve retornar tipo \"fdw_handler\"" +msgid "\"%s\" is not an existing enum label" +msgstr "\"%s\" não é um rótulo do enum existente" -#: commands/foreigncmds.c:531 +#: catalog/pg_enum.c:408 #, c-format -msgid "permission denied to create foreign-data wrapper \"%s\"" -msgstr "permissão negada ao criar adaptador de dados externos \"%s\"" +msgid "pg_enum OID value not set when in binary upgrade mode" +msgstr "o valor de OID de pg_enum não está definido quando no modo de atualização binária" -#: commands/foreigncmds.c:533 +#: catalog/pg_enum.c:418 #, c-format -msgid "Must be superuser to create a foreign-data wrapper." -msgstr "Deve ser super-usuário para criar uma adaptador de dados externos." +msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" +msgstr "ALTER TYPE ADD BEFORE/AFTER é incompatível com atualização binária" -#: commands/foreigncmds.c:645 +#: catalog/pg_inherits.c:593 #, c-format -msgid "permission denied to alter foreign-data wrapper \"%s\"" -msgstr "permissão negada ao alterar adaptador de dados externos \"%s\"" +msgid "cannot detach partition \"%s\"" +msgstr "não é possível desanexar a partição \"%s\"" -#: commands/foreigncmds.c:647 +#: catalog/pg_inherits.c:595 #, c-format -msgid "Must be superuser to alter a foreign-data wrapper." -msgstr "Deve ser super-usuário para alterar um adaptador de dados externos." +msgid "The partition is being detached concurrently or has an unfinished detach." +msgstr "A partição está sendo desanexada concorrentemente, ou possui uma desanexação não terminada." -#: commands/foreigncmds.c:678 +#: catalog/pg_inherits.c:596 commands/tablecmds.c:4583 +#: commands/tablecmds.c:15470 #, c-format -msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" -msgstr "mudar o manipulador do adaptador de dados externos pode mudar o comportamento de tabelas externas existentes" +msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." +msgstr "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE para concluir a operação de desanexação pendente." -#: commands/foreigncmds.c:693 +#: catalog/pg_inherits.c:600 #, c-format -msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" -msgstr "mudar o validador do adaptador de dados externos pode tornar inválidas as opções para objetos dependentes" +msgid "cannot complete detaching partition \"%s\"" +msgstr "não é possível concluir a desanexação da partição \"%s\"" -#: commands/foreigncmds.c:1106 +#: catalog/pg_inherits.c:602 #, c-format -msgid "user mapping \"%s\" already exists for server %s" -msgstr "mapeamento de usuários \"%s\" já existe para servidor %s" +msgid "There's no pending concurrent detach." +msgstr "Não há desconexão concorrente pendente." -#: commands/foreigncmds.c:1194 commands/foreigncmds.c:1301 +#: catalog/pg_namespace.c:64 commands/schemacmds.c:273 #, c-format -msgid "user mapping \"%s\" does not exist for the server" -msgstr "mapeamento de usuários \"%s\" não existe para o servidor" +msgid "schema \"%s\" already exists" +msgstr "esquema \"%s\" já existe" -#: commands/foreigncmds.c:1288 +#: catalog/pg_operator.c:219 catalog/pg_operator.c:361 #, c-format -msgid "server does not exist, skipping" -msgstr "servidor não existe, ignorando" +msgid "\"%s\" is not a valid operator name" +msgstr "\"%s\" não é um nome de operador válido" -#: commands/foreigncmds.c:1306 +#: catalog/pg_operator.c:370 #, c-format -msgid "user mapping \"%s\" does not exist for the server, skipping" -msgstr "mapeamento de usuários \"%s\" não existe para o servidor, ignorando" +msgid "only binary operators can have commutators" +msgstr "somente operadores binários podem ter comutadores" -#: commands/functioncmds.c:98 +#: catalog/pg_operator.c:374 commands/operatorcmds.c:509 #, c-format -msgid "SQL function cannot return shell type %s" -msgstr "função SQL não pode retornar tipo indefinido %s" +msgid "only binary operators can have join selectivity" +msgstr "somente operadores binários podem ter seletividade de junção" -#: commands/functioncmds.c:103 +#: catalog/pg_operator.c:378 #, c-format -msgid "return type %s is only a shell" -msgstr "tipo retornado %s é indefinido" +msgid "only binary operators can merge join" +msgstr "somente operadores binários podem ser utilizados em junção por mesclagem" -#: commands/functioncmds.c:132 parser/parse_type.c:333 +#: catalog/pg_operator.c:382 #, c-format -msgid "type modifier cannot be specified for shell type \"%s\"" -msgstr "modificador de tipo não pode ser especificado para tipo indefinido \"%s\"" +msgid "only binary operators can hash" +msgstr "somente operadores binários podem ser utilizados no hash" -#: commands/functioncmds.c:138 +#: catalog/pg_operator.c:393 #, c-format -msgid "type \"%s\" is not yet defined" -msgstr "tipo \"%s\" ainda não foi definido" +msgid "only boolean operators can have negators" +msgstr "somente operadores booleanos podem ter negadores" -#: commands/functioncmds.c:139 +#: catalog/pg_operator.c:397 commands/operatorcmds.c:517 #, c-format -msgid "Creating a shell type definition." -msgstr "Criando uma definição de tipo indefinido." +msgid "only boolean operators can have restriction selectivity" +msgstr "somente operadores booleanos podem ter seletividade de restrição" -#: commands/functioncmds.c:236 +#: catalog/pg_operator.c:401 commands/operatorcmds.c:521 #, c-format -msgid "SQL function cannot accept shell type %s" -msgstr "função SQL não pode aceitar tipo indefinido %s" +msgid "only boolean operators can have join selectivity" +msgstr "somente operadores booleanos podem ter seletividade de junção" -#: commands/functioncmds.c:242 +#: catalog/pg_operator.c:405 #, c-format -msgid "aggregate cannot accept shell type %s" -msgstr "agregação não pode aceitar tipo indefinido %s" +msgid "only boolean operators can merge join" +msgstr "somente operadores booleanos podem ser utilizados em junção por mesclagem" -#: commands/functioncmds.c:247 +#: catalog/pg_operator.c:409 #, c-format -msgid "argument type %s is only a shell" -msgstr "tipo de argumento %s é indefinido" +msgid "only boolean operators can hash" +msgstr "somente operadores booleanos podem ser utilizados no hash" -#: commands/functioncmds.c:257 +#: catalog/pg_operator.c:421 #, c-format -msgid "type %s does not exist" -msgstr "tipo %s não existe" +msgid "operator %s already exists" +msgstr "o operador %s já existe" -#: commands/functioncmds.c:271 +#: catalog/pg_operator.c:621 #, c-format -msgid "aggregates cannot accept set arguments" -msgstr "agregações não podem aceitar conjunto de argumentos" +msgid "operator cannot be its own negator or sort operator" +msgstr "o operador não pode ser seu próprio operador de negação ou de classificação" -#: commands/functioncmds.c:275 +#: catalog/pg_parameter_acl.c:53 #, c-format -msgid "functions cannot accept set arguments" -msgstr "funções não podem aceitar conjunto de argumentos" +msgid "parameter ACL \"%s\" does not exist" +msgstr "não existe o parâmetro de ACL \"%s\"" -#: commands/functioncmds.c:285 +#: catalog/pg_parameter_acl.c:88 #, c-format -msgid "VARIADIC parameter must be the last input parameter" -msgstr "parâmetro VARIADIC deve ser o último parâmetro de entrada" +msgid "invalid parameter name \"%s\"" +msgstr "nome de parâmetro inválido \"%s\"" -#: commands/functioncmds.c:313 +#: catalog/pg_proc.c:132 parser/parse_func.c:2233 #, c-format -msgid "VARIADIC parameter must be an array" -msgstr "parâmetro VARIADIC deve ser uma matriz" +msgid "functions cannot have more than %d argument" +msgid_plural "functions cannot have more than %d arguments" +msgstr[0] "funções não podem ter mais do que %d argumento" +msgstr[1] "funções não podem ter mais do que %d argumentos" -#: commands/functioncmds.c:353 +#: catalog/pg_proc.c:376 #, c-format -msgid "parameter name \"%s\" used more than once" -msgstr "nome de parâmetro \"%s\" foi especificado mais de uma vez" +msgid "function \"%s\" already exists with same argument types" +msgstr "função \"%s\" já existe com os mesmos tipos de argumento" -#: commands/functioncmds.c:368 +#: catalog/pg_proc.c:388 #, c-format -msgid "only input parameters can have default values" -msgstr "somente parâmetros de entrada podem ter valores padrão" +msgid "\"%s\" is an aggregate function." +msgstr "\"%s\" é uma função de agregação." -#: commands/functioncmds.c:383 +#: catalog/pg_proc.c:390 #, c-format -msgid "cannot use table references in parameter default value" -msgstr "não pode utilizar referência a tabela no valor padrão do parâmetro" +msgid "\"%s\" is a function." +msgstr "\"%s\" é uma função." -#: commands/functioncmds.c:407 +#: catalog/pg_proc.c:392 #, c-format -msgid "input parameters after one with a default value must also have defaults" -msgstr "parâmetros de entrada após um parâmetro com valor padrão também devem ter valores padrão" +msgid "\"%s\" is a procedure." +msgstr "\"%s\" é um procedimento." -#: commands/functioncmds.c:657 +#: catalog/pg_proc.c:394 #, c-format -msgid "no function body specified" -msgstr "corpo da função não foi especificado" +msgid "\"%s\" is a window function." +msgstr "\"%s\" é uma função de janela." -#: commands/functioncmds.c:667 +#: catalog/pg_proc.c:414 #, c-format -msgid "no language specified" -msgstr "nenhuma linguagem foi especificada" +msgid "cannot change whether a procedure has output parameters" +msgstr "não é possível mudar se um procedimento possui parâmetros de saída" -#: commands/functioncmds.c:690 commands/functioncmds.c:1149 +#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 #, c-format -msgid "COST must be positive" -msgstr "COST deve ser positivo" +msgid "cannot change return type of existing function" +msgstr "não é possível mudar o tipo de dados retornado de função existente" -#: commands/functioncmds.c:698 commands/functioncmds.c:1157 +#. translator: first %s is DROP FUNCTION, DROP PROCEDURE, or DROP +#. AGGREGATE +#. +#. translator: first %s is DROP FUNCTION or DROP PROCEDURE +#: catalog/pg_proc.c:421 catalog/pg_proc.c:448 catalog/pg_proc.c:493 +#: catalog/pg_proc.c:519 catalog/pg_proc.c:543 #, c-format -msgid "ROWS must be positive" -msgstr "ROWS deve ser positivo" +msgid "Use %s %s first." +msgstr "Use %s %s primeiro." -#: commands/functioncmds.c:737 +#: catalog/pg_proc.c:446 #, c-format -msgid "unrecognized function attribute \"%s\" ignored" -msgstr "atributo de função desconhecido \"%s\" foi ignorado" +msgid "Row type defined by OUT parameters is different." +msgstr "O tipo de linha definido pelos parâmetros OUT é diferente." -#: commands/functioncmds.c:788 +#: catalog/pg_proc.c:490 #, c-format -msgid "only one AS item needed for language \"%s\"" -msgstr "somente um item AS é necessário para linguagem \"%s\"" +msgid "cannot change name of input parameter \"%s\"" +msgstr "não é possível mudar o nome de parâmetro de entrada \"%s\"" -#: commands/functioncmds.c:877 commands/functioncmds.c:1734 -#: commands/proclang.c:553 +#: catalog/pg_proc.c:517 #, c-format -msgid "language \"%s\" does not exist" -msgstr "linguagem \"%s\" não existe" +msgid "cannot remove parameter defaults from existing function" +msgstr "não é possível remover valores padrão de parâmetros de função existente" -#: commands/functioncmds.c:879 commands/functioncmds.c:1736 +#: catalog/pg_proc.c:541 #, c-format -msgid "Use CREATE LANGUAGE to load the language into the database." -msgstr "Utilize CREATE LANGUAGE para carregar uma linguagem no banco de dados." +msgid "cannot change data type of existing parameter default value" +msgstr "não é possível mudar o tipo de dados do valor padrão de parâmetro existente" -#: commands/functioncmds.c:914 commands/functioncmds.c:1140 +#: catalog/pg_proc.c:752 #, c-format -msgid "only superuser can define a leakproof function" -msgstr "somente super-usuário pode definir uma função com parâmetro leakproof" +msgid "there is no built-in function named \"%s\"" +msgstr "não há nenhuma função embutida com nome \"%s\"" -#: commands/functioncmds.c:940 +#: catalog/pg_proc.c:845 #, c-format -msgid "function result type must be %s because of OUT parameters" -msgstr "tipo do resultado da função deve ser %s por causa dos parâmetros OUT" +msgid "SQL functions cannot return type %s" +msgstr "funções SQL não podem retornar tipo %s" -#: commands/functioncmds.c:953 +#: catalog/pg_proc.c:860 #, c-format -msgid "function result type must be specified" -msgstr "tipo do resultado da função deve ser especificado" +msgid "SQL functions cannot have arguments of type %s" +msgstr "funções SQL não podem ter argumentos do tipo %s" -#: commands/functioncmds.c:988 commands/functioncmds.c:1161 +#: catalog/pg_proc.c:987 executor/functions.c:1466 #, c-format -msgid "ROWS is not applicable when function does not return a set" -msgstr "ROWS não é aplicável quando função não retorna um conjunto" +msgid "SQL function \"%s\"" +msgstr "função SQL \"%s\"" -#: commands/functioncmds.c:1314 +#: catalog/pg_publication.c:71 catalog/pg_publication.c:79 +#: catalog/pg_publication.c:87 catalog/pg_publication.c:93 #, c-format -msgid "source data type %s is a pseudo-type" -msgstr "tipo de dado fonte %s é um pseudo-tipo" +msgid "cannot add relation \"%s\" to publication" +msgstr "não é possível adicionar a relação \"%s\" à publicação" -#: commands/functioncmds.c:1320 +#: catalog/pg_publication.c:81 #, c-format -msgid "target data type %s is a pseudo-type" -msgstr "tipo de dado alvo %s é um pseudo-tipo" +msgid "This operation is not supported for system tables." +msgstr "Essa operação não tem suporte para tabelas do sistema." -#: commands/functioncmds.c:1344 +#: catalog/pg_publication.c:89 #, c-format -msgid "cast will be ignored because the source data type is a domain" -msgstr "conversão será ignorada porque o tipo de dado fonte é um domínio" +msgid "This operation is not supported for temporary tables." +msgstr "Essa operação não tem suporte para tabelas temporárias." -#: commands/functioncmds.c:1349 +#: catalog/pg_publication.c:95 #, c-format -msgid "cast will be ignored because the target data type is a domain" -msgstr "conversão será ignorada porque o tipo de dado alvo é um domínio" +msgid "This operation is not supported for unlogged tables." +msgstr "Essa operação não tem suporte para tabelas sem registro de transações (unlogged)" -#: commands/functioncmds.c:1376 +#: catalog/pg_publication.c:109 catalog/pg_publication.c:117 #, c-format -msgid "cast function must take one to three arguments" -msgstr "função de conversão deve ter de um a três argumentos" +msgid "cannot add schema \"%s\" to publication" +msgstr "não é possível adicionar o esquema \"%s\" à publicação" -#: commands/functioncmds.c:1380 +#: catalog/pg_publication.c:111 #, c-format -msgid "argument of cast function must match or be binary-coercible from source data type" -msgstr "argumento da função de conversão deve corresponder ou ser convertido no tipo de dado fonte" +msgid "This operation is not supported for system schemas." +msgstr "Essa operação não tem suporte para esquemas do sistema." -#: commands/functioncmds.c:1384 +#: catalog/pg_publication.c:119 #, c-format -msgid "second argument of cast function must be type integer" -msgstr "segundo argumento da função de conversão deve ter tipo integer" +msgid "Temporary schemas cannot be replicated." +msgstr "Os esquemas temporários não podem ser replicados." -#: commands/functioncmds.c:1388 +#: catalog/pg_publication.c:397 #, c-format -msgid "third argument of cast function must be type boolean" -msgstr "terceiro argumento da função de conversão deve ter tipo boolean" +msgid "relation \"%s\" is already member of publication \"%s\"" +msgstr "a relação \"%s\" já é membro da publicação \"%s\"" -#: commands/functioncmds.c:1392 +#: catalog/pg_publication.c:539 #, c-format -msgid "return data type of cast function must match or be binary-coercible to target data type" -msgstr "tipo de dado de retorno da função de conversão deve corresponder ou ser convertido no tipo de dado alvo" +msgid "cannot use system column \"%s\" in publication column list" +msgstr "não é possível usar a coluna do sistema \"%s\" na lista de colunas de publicação" -#: commands/functioncmds.c:1403 +#: catalog/pg_publication.c:545 #, c-format -msgid "cast function must not be volatile" -msgstr "função de conversão não deve ser volátil" +msgid "cannot use generated column \"%s\" in publication column list" +msgstr "não é possível usar a coluna gerada \"%s\" na lista de colunas de publicação" -#: commands/functioncmds.c:1408 +#: catalog/pg_publication.c:551 #, c-format -msgid "cast function must not be an aggregate function" -msgstr "função de conversão não deve ser uma função de agregação" +msgid "duplicate column \"%s\" in publication column list" +msgstr "coluna duplicada \"%s\" na lista de colunas de publicação" -#: commands/functioncmds.c:1412 +#: catalog/pg_publication.c:641 #, c-format -msgid "cast function must not be a window function" -msgstr "função de conversão não deve ser uma função deslizante" +msgid "schema \"%s\" is already member of publication \"%s\"" +msgstr "o esquema \"%s\" já é membro da publicação \"%s\"" -#: commands/functioncmds.c:1416 +#: catalog/pg_shdepend.c:830 #, c-format -msgid "cast function must not return a set" -msgstr "função de conversão não deve retornar um conjunto" +msgid "" +"\n" +"and objects in %d other database (see server log for list)" +msgid_plural "" +"\n" +"and objects in %d other databases (see server log for list)" +msgstr[0] "" +"\n" +"e objetos em %d outro banco de dados (veja lista no log do servidor)" +msgstr[1] "" +"\n" +"e objetos em %d outros bancos de dados (veja lista no log do servidor)" -#: commands/functioncmds.c:1442 +#: catalog/pg_shdepend.c:1177 #, c-format -msgid "must be superuser to create a cast WITHOUT FUNCTION" -msgstr "deve ser super-usuário para criar uma conversão WITHOUT FUNCTION" +msgid "role %u was concurrently dropped" +msgstr "a função de banco de dados (role) %u foi removida concorrentemente" -#: commands/functioncmds.c:1457 +#: catalog/pg_shdepend.c:1189 #, c-format -msgid "source and target data types are not physically compatible" -msgstr "tipos de dado fonte e alvo não são fisicamente compatíveis" +msgid "tablespace %u was concurrently dropped" +msgstr "o espaço de tabelas %u foi removido concorrentemente" -#: commands/functioncmds.c:1472 +#: catalog/pg_shdepend.c:1203 #, c-format -msgid "composite data types are not binary-compatible" -msgstr "tipos de dado compostos não são compatíveis no formato binário" +msgid "database %u was concurrently dropped" +msgstr "banco de dados %u foi removido concorrentemente" -#: commands/functioncmds.c:1478 +#: catalog/pg_shdepend.c:1254 #, c-format -msgid "enum data types are not binary-compatible" -msgstr "tipos de dado enum não são compatíveis no formato binário" +msgid "owner of %s" +msgstr "dono de %s" -#: commands/functioncmds.c:1484 +#: catalog/pg_shdepend.c:1256 #, c-format -msgid "array data types are not binary-compatible" -msgstr "tipos de dado matriz não são compatíveis no formato binário" +msgid "privileges for %s" +msgstr "privilégios para %s" -#: commands/functioncmds.c:1501 +#: catalog/pg_shdepend.c:1258 #, c-format -msgid "domain data types must not be marked binary-compatible" -msgstr "tipos de dado de domínio não devem ser marcados como compatíveis no formato binário" +msgid "target of %s" +msgstr "destino de %s" -#: commands/functioncmds.c:1511 +#: catalog/pg_shdepend.c:1260 #, c-format -msgid "source data type and target data type are the same" -msgstr "tipo de dado fonte e tipo de dado alvo são o mesmo" +msgid "tablespace for %s" +msgstr "espaço de tabelas para %s" -#: commands/functioncmds.c:1544 +#. translator: %s will always be "database %s" +#: catalog/pg_shdepend.c:1268 #, c-format -msgid "cast from type %s to type %s already exists" -msgstr "conversão do tipo %s para tipo %s já existe" +msgid "%d object in %s" +msgid_plural "%d objects in %s" +msgstr[0] "%d objeto no %s" +msgstr[1] "%d objetos no %s" -#: commands/functioncmds.c:1619 +#: catalog/pg_shdepend.c:1332 #, c-format -msgid "cast from type %s to type %s does not exist" -msgstr "conversão do tipo %s para tipo %s não existe" +msgid "cannot drop objects owned by %s because they are required by the database system" +msgstr "não é possível remover objetos que pertencem a %s, porque são requeridos pelo sistema de banco de dados" -#: commands/functioncmds.c:1668 +#: catalog/pg_shdepend.c:1498 #, c-format -msgid "function %s already exists in schema \"%s\"" -msgstr "função %s já existe no esquema \"%s\"" +msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" +msgstr "não é possível transferir objetos que pertencem a %s, porque estes são requeridos pelo sistema de banco de dados" -#: commands/functioncmds.c:1721 +#: catalog/pg_subscription.c:424 #, c-format -msgid "no inline code specified" -msgstr "código incorporado não foi especificado" +msgid "could not drop relation mapping for subscription \"%s\"" +msgstr "não foi possível remover o mapeamento de relacionamento para a subscrição \"%s\"" -#: commands/functioncmds.c:1766 +#: catalog/pg_subscription.c:426 #, c-format -msgid "language \"%s\" does not support inline code execution" -msgstr "linguagem \"%s\" não suporta execução de código incorporado" +msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." +msgstr "A sincronização da tabela para a relação \"%s\" está em andamento, e está no estado \"%c\"." -#: commands/indexcmds.c:159 commands/indexcmds.c:486 -#: commands/opclasscmds.c:370 commands/opclasscmds.c:790 -#: commands/opclasscmds.c:1749 +#. translator: first %s is a SQL ALTER command and second %s is a +#. SQL DROP command +#. +#: catalog/pg_subscription.c:433 #, c-format -msgid "access method \"%s\" does not exist" -msgstr "método de acesso \"%s\" não existe" +msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." +msgstr "Use %s para ativar a subscrição, se ainda não estiver ativada, ou use %s para cancelar a subscrição." -#: commands/indexcmds.c:340 +#: catalog/pg_type.c:134 catalog/pg_type.c:474 #, c-format -msgid "must specify at least one column" -msgstr "deve especificar pelo menos uma coluna" +msgid "pg_type OID value not set when in binary upgrade mode" +msgstr "o valor do OID de pg_type não está definido quando no modo de atualização binária" -#: commands/indexcmds.c:344 +#: catalog/pg_type.c:254 #, c-format -msgid "cannot use more than %d columns in an index" -msgstr "não pode utilizar mais do que %d colunas em um índice" +msgid "invalid type internal size %d" +msgstr "o tamanho interno do tipo %d não é válido" -#: commands/indexcmds.c:375 +#: catalog/pg_type.c:270 catalog/pg_type.c:278 catalog/pg_type.c:286 +#: catalog/pg_type.c:295 #, c-format -msgid "cannot create index on foreign table \"%s\"" -msgstr "não pode criar índice na tabela externa \"%s\"" +msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" +msgstr "o alinhamento \"%c\" não é válido para tipo passado por valor de tamanho %d" -#: commands/indexcmds.c:390 +#: catalog/pg_type.c:302 #, c-format -msgid "cannot create indexes on temporary tables of other sessions" -msgstr "não pode criar índices em tabelas temporárias de outras sessões" +msgid "internal size %d is invalid for passed-by-value type" +msgstr "o tamanho interno %d não é válido para o tipo passado por valor" -#: commands/indexcmds.c:445 commands/tablecmds.c:525 commands/tablecmds.c:9101 +#: catalog/pg_type.c:312 catalog/pg_type.c:318 #, c-format -msgid "only shared relations can be placed in pg_global tablespace" -msgstr "somente relações compartilhadas podem ser armazenadas na tablespace pg_global" +msgid "alignment \"%c\" is invalid for variable-length type" +msgstr "o alinhamento \"%c\" não é válido para tipo de tamanho variável" -#: commands/indexcmds.c:478 +#: catalog/pg_type.c:326 commands/typecmds.c:4146 #, c-format -msgid "substituting access method \"gist\" for obsolete method \"rtree\"" -msgstr "substituindo método de acesso \"gist\" pelo método obsoleto \"rtree\"" +msgid "fixed-size types must have storage PLAIN" +msgstr "tipos de tamanho fixo devem ter armazenamento PLAIN" -#: commands/indexcmds.c:495 +#: catalog/pg_type.c:955 #, c-format -msgid "access method \"%s\" does not support unique indexes" -msgstr "método de acesso \"%s\" não suporta índices únicos" +msgid "Failed while creating a multirange type for type \"%s\"." +msgstr "Falha ao criar um tipo de dados multi-intervalo para o tipo de dados \"%s\"." -#: commands/indexcmds.c:500 +#: catalog/pg_type.c:956 #, c-format -msgid "access method \"%s\" does not support multicolumn indexes" -msgstr "método de acesso \"%s\" não suporta índices de múltiplas colunas" +msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." +msgstr "Você pode especificar manualmente um nome de tipo de dados multi-intervalo usando o atributo \"multirange_type_name\"." -#: commands/indexcmds.c:505 +#: catalog/storage.c:505 storage/buffer/bufmgr.c:1145 #, c-format -msgid "access method \"%s\" does not support exclusion constraints" -msgstr "método de acesso \"%s\" não suporta restrições de exclusão" +msgid "invalid page in block %u of relation %s" +msgstr "página é inválida no bloco %u da relação %s" -#: commands/indexcmds.c:584 +#: commands/aggregatecmds.c:171 #, c-format -msgid "%s %s will create implicit index \"%s\" for table \"%s\"" -msgstr "%s %s criará índice implícito \"%s\" na tabela \"%s\"" +msgid "only ordered-set aggregates can be hypothetical" +msgstr "somente agregações de conjunto ordenado podem ser hipotéticas" -#: commands/indexcmds.c:922 +#: commands/aggregatecmds.c:196 #, c-format -msgid "functions in index predicate must be marked IMMUTABLE" -msgstr "funções em predicado de índice devem ser IMMUTABLE" +msgid "aggregate attribute \"%s\" not recognized" +msgstr "atributo da agregação \"%s\" desconhecido" -#: commands/indexcmds.c:988 parser/parse_utilcmd.c:1797 +#: commands/aggregatecmds.c:206 #, c-format -msgid "column \"%s\" named in key does not exist" -msgstr "coluna \"%s\" indicada na chave não existe" +msgid "aggregate stype must be specified" +msgstr "é necessário ser especificado o tipo de transição (stype) da função de agregação" -#: commands/indexcmds.c:1048 +#: commands/aggregatecmds.c:210 #, c-format -msgid "functions in index expression must be marked IMMUTABLE" -msgstr "funções em expressão de índice devem ser IMMUTABLE" +msgid "aggregate sfunc must be specified" +msgstr "é necessário ser especificada o função de transição (sfunc) da função de agregação" -#: commands/indexcmds.c:1071 +#: commands/aggregatecmds.c:222 #, c-format -msgid "could not determine which collation to use for index expression" -msgstr "não pôde determinar qual ordenação utilizar para expressão do índice" +msgid "aggregate msfunc must be specified when mstype is specified" +msgstr "é necessário ser especificada a função de transição msfunc quando mstype é especificado" -#: commands/indexcmds.c:1079 commands/typecmds.c:782 parser/parse_expr.c:2278 -#: parser/parse_type.c:546 parser/parse_utilcmd.c:2648 utils/adt/misc.c:520 +#: commands/aggregatecmds.c:226 #, c-format -msgid "collations are not supported by type %s" -msgstr "ordenações não são suportadas pelo tipo %s" +msgid "aggregate minvfunc must be specified when mstype is specified" +msgstr "é necessário ser especificada a função de transição minvfunc quando mstype é especificado" -#: commands/indexcmds.c:1117 +#: commands/aggregatecmds.c:233 #, c-format -msgid "operator %s is not commutative" -msgstr "operador %s não é comutativo" +msgid "aggregate msfunc must not be specified without mstype" +msgstr "não deve ser especificado msfunc sem mstype" -#: commands/indexcmds.c:1119 +#: commands/aggregatecmds.c:237 #, c-format -msgid "Only commutative operators can be used in exclusion constraints." -msgstr "Somente operadores comutativos pode ser utilizados em restrições de exclusão." +msgid "aggregate minvfunc must not be specified without mstype" +msgstr "não deve ser especificado minvfunc sem mstype" -#: commands/indexcmds.c:1145 +#: commands/aggregatecmds.c:241 #, c-format -msgid "operator %s is not a member of operator family \"%s\"" -msgstr "operador %s não é um membro da família de operadores \"%s\"" +msgid "aggregate mfinalfunc must not be specified without mstype" +msgstr "não deve ser especificado mfinalfunc sem mstype" -#: commands/indexcmds.c:1148 +#: commands/aggregatecmds.c:245 #, c-format -msgid "The exclusion operator must be related to the index operator class for the constraint." -msgstr "O operador de exclusão deve estar relacionado à classe de operadores do índice para a restrição." +msgid "aggregate msspace must not be specified without mstype" +msgstr "não deve ser especificado msspace sem mstype" -#: commands/indexcmds.c:1183 +#: commands/aggregatecmds.c:249 #, c-format -msgid "access method \"%s\" does not support ASC/DESC options" -msgstr "método de acesso \"%s\" não suporta opções ASC/DESC" +msgid "aggregate minitcond must not be specified without mstype" +msgstr "não deve ser especificado minitcond sem mstype" -#: commands/indexcmds.c:1188 +#: commands/aggregatecmds.c:278 #, c-format -msgid "access method \"%s\" does not support NULLS FIRST/LAST options" -msgstr "método de acesso \"%s\" não suporta opções NULLS FIRST/LAST" +msgid "aggregate input type must be specified" +msgstr "é necessário ser especificado o tipo de dados de entrada da agregação" -#: commands/indexcmds.c:1244 commands/typecmds.c:1887 +#: commands/aggregatecmds.c:308 #, c-format -msgid "data type %s has no default operator class for access method \"%s\"" -msgstr "tipo de dado %s não tem classe de operadores padrão para método de acesso \"%s\"" +msgid "basetype is redundant with aggregate input type specification" +msgstr "o tipo de dados base é redundante com a especificação do tipo de dados de entrada da agregação" -#: commands/indexcmds.c:1246 +#: commands/aggregatecmds.c:351 commands/aggregatecmds.c:392 #, c-format -msgid "You must specify an operator class for the index or define a default operator class for the data type." -msgstr "Você deve especificar uma classe de operadores para o índice ou definir uma classe de operadores padrão para o tipo de dado." +msgid "aggregate transition data type cannot be %s" +msgstr "o tipo de dados de transição da agregação não pode ser %s" -#: commands/indexcmds.c:1275 commands/indexcmds.c:1283 -#: commands/opclasscmds.c:214 +#: commands/aggregatecmds.c:363 #, c-format -msgid "operator class \"%s\" does not exist for access method \"%s\"" -msgstr "classe de operadores \"%s\" não existe para método de acesso \"%s\"" +msgid "serialization functions may be specified only when the aggregate transition data type is %s" +msgstr "as funções de serialização podem ser especificadas somente quando o tipo de dados de transição da agregação for %s" -#: commands/indexcmds.c:1296 commands/typecmds.c:1875 +#: commands/aggregatecmds.c:373 #, c-format -msgid "operator class \"%s\" does not accept data type %s" -msgstr "classe de operadores \"%s\" não aceita tipo de dado %s" +msgid "must specify both or neither of serialization and deserialization functions" +msgstr "deve especificar as duas ou nenhuma das funções de serialização e desserialização" -#: commands/indexcmds.c:1386 +#: commands/aggregatecmds.c:438 commands/functioncmds.c:639 #, c-format -msgid "there are multiple default operator classes for data type %s" -msgstr "há múltiplas classes de operadores padrão para tipo de dado %s" +msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" +msgstr "o parâmetro \"parallel\" deve ser SAFE, RESTRICTED, ou UNSAFE" -#: commands/indexcmds.c:1762 +#: commands/aggregatecmds.c:494 #, c-format -msgid "table \"%s\" has no indexes" -msgstr "tabela \"%s\" não tem índices" +msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" +msgstr "o parâmetro \"%s\" deve ser READ_ONLY, SHAREABLE, ou READ_WRITE" -#: commands/indexcmds.c:1792 +#: commands/alter.c:86 commands/event_trigger.c:174 #, c-format -msgid "can only reindex the currently open database" -msgstr "só pode reindexar o banco de dados atualmente aberto" +msgid "event trigger \"%s\" already exists" +msgstr "gatilho de eventos \"%s\" já existe" -#: commands/indexcmds.c:1881 +#: commands/alter.c:89 commands/foreigncmds.c:593 #, c-format -msgid "table \"%s.%s\" was reindexed" -msgstr "tabela \"%s.%s\" foi reindexada" +msgid "foreign-data wrapper \"%s\" already exists" +msgstr "o empacotador de dados estrangeiros \"%s\" já existe" -#: commands/matview.c:178 +#: commands/alter.c:92 commands/foreigncmds.c:884 #, c-format -msgid "CONCURRENTLY cannot be used when the materialized view is not populated" -msgstr "CONCURRENTLY não pode ser utilizado quando a visão materializada não estiver povoada" +msgid "server \"%s\" already exists" +msgstr "o servidor \"%s\" já existe" -#: commands/matview.c:184 +#: commands/alter.c:95 commands/proclang.c:133 #, c-format -msgid "CONCURRENTLY and WITH NO DATA options cannot be used together" -msgstr "opções CONCURRENTLY e WITH NO DATA não podem ser utilizadas juntas" +msgid "language \"%s\" already exists" +msgstr "linguagem \"%s\" já existe" -#: commands/matview.c:591 +#: commands/alter.c:98 commands/publicationcmds.c:771 #, c-format -msgid "new data for \"%s\" contains duplicate rows without any null columns" -msgstr "novos dados para \"%s\" contém registros duplicados sem quaisquer colunas nulas" +msgid "publication \"%s\" already exists" +msgstr "a publicação \"%s\" já existe" -#: commands/matview.c:593 +#: commands/alter.c:101 commands/subscriptioncmds.c:657 #, c-format -msgid "Row: %s" -msgstr "Registro: %s" +msgid "subscription \"%s\" already exists" +msgstr "a subscrição \"%s\" já existe" -#: commands/matview.c:681 +#: commands/alter.c:124 #, c-format -msgid "cannot refresh materialized view \"%s\" concurrently" -msgstr "não pode atualizar visão materializada \"%s\" concorrentemente" +msgid "conversion \"%s\" already exists in schema \"%s\"" +msgstr "conversão \"%s\" já existe no esquema \"%s\"" -#: commands/matview.c:683 +#: commands/alter.c:128 #, c-format -msgid "Create a unique index with no WHERE clause on one or more columns of the materialized view." -msgstr "Crie um índice único sem cláusula WHERE em uma ou mais colunas da visão materializada." +msgid "statistics object \"%s\" already exists in schema \"%s\"" +msgstr "o objeto de estatísticas \"%s\" já existe no esquema \"%s\"" -#: commands/opclasscmds.c:135 +#: commands/alter.c:132 #, c-format -msgid "operator family \"%s\" does not exist for access method \"%s\"" -msgstr "família de operadores \"%s\" não existe para método de acesso \"%s\"" +msgid "text search parser \"%s\" already exists in schema \"%s\"" +msgstr "o analisador de procura de texto completo \"%s\" já existe no esquema \"%s\"" -#: commands/opclasscmds.c:273 +#: commands/alter.c:136 #, c-format -msgid "operator family \"%s\" for access method \"%s\" already exists" -msgstr "família de operadores \"%s\" para método de acesso \"%s\" já existe" +msgid "text search dictionary \"%s\" already exists in schema \"%s\"" +msgstr "o dicionário de procura de texto completo \"%s\" já existe no esquema \"%s\"" -#: commands/opclasscmds.c:409 +#: commands/alter.c:140 #, c-format -msgid "must be superuser to create an operator class" -msgstr "deve ser super-usuário para criar uma classe de operadores" +msgid "text search template \"%s\" already exists in schema \"%s\"" +msgstr "o modelo de procura de texto completo \"%s\" já existe no esquema \"%s\"" -#: commands/opclasscmds.c:480 commands/opclasscmds.c:866 -#: commands/opclasscmds.c:996 +#: commands/alter.c:144 #, c-format -msgid "invalid operator number %d, must be between 1 and %d" -msgstr "número de operadores %d é inválido, deve ser entre 1 e %d" +msgid "text search configuration \"%s\" already exists in schema \"%s\"" +msgstr "a configuração de procura de texto completo \"%s\" já existe no esquema \"%s\"" -#: commands/opclasscmds.c:531 commands/opclasscmds.c:917 -#: commands/opclasscmds.c:1011 +#: commands/alter.c:217 #, c-format -msgid "invalid procedure number %d, must be between 1 and %d" -msgstr "número de procedimentos %d é inválido, deve ser entre 1 e %d" +msgid "must be superuser to rename %s" +msgstr "é necessário ser um superusuário para renomear %s" -#: commands/opclasscmds.c:561 +#: commands/alter.c:259 commands/subscriptioncmds.c:636 +#: commands/subscriptioncmds.c:1116 commands/subscriptioncmds.c:1198 +#: commands/subscriptioncmds.c:1837 #, c-format -msgid "storage type specified more than once" -msgstr "tipo de armazenamento especificado mais de uma vez" +msgid "password_required=false is superuser-only" +msgstr "password_required=false é apenas para superusuário" -#: commands/opclasscmds.c:588 +#: commands/alter.c:260 commands/subscriptioncmds.c:637 +#: commands/subscriptioncmds.c:1117 commands/subscriptioncmds.c:1199 +#: commands/subscriptioncmds.c:1838 #, c-format -msgid "storage type cannot be different from data type for access method \"%s\"" -msgstr "tipo de armazenamento não pode ser diferente do tipo de dado para método de acesso \"%s\"" +msgid "Subscriptions with the password_required option set to false may only be created or modified by the superuser." +msgstr "As subscrições com a opção password_required definida como falsa só podem ser criadas ou modificadas por um superusuário." -#: commands/opclasscmds.c:604 +#: commands/alter.c:775 #, c-format -msgid "operator class \"%s\" for access method \"%s\" already exists" -msgstr "classe de operadores \"%s\" para método de acesso \"%s\" já existe" +msgid "must be superuser to set schema of %s" +msgstr "é necessário ser um superusuário para configursr o esquema de %s" -#: commands/opclasscmds.c:632 +#: commands/amcmds.c:60 #, c-format -msgid "could not make operator class \"%s\" be default for type %s" -msgstr "não pôde fazer classe de operadores \"%s\" ser a padrão para tipo %s" +msgid "permission denied to create access method \"%s\"" +msgstr "permissão negada para criar o método de acesso \"%s\"" -#: commands/opclasscmds.c:635 +#: commands/amcmds.c:62 #, c-format -msgid "Operator class \"%s\" already is the default." -msgstr "Classe de operadores \"%s\" já é a padrão." +msgid "Must be superuser to create an access method." +msgstr "É necessário ser um superusuário para criar um método de acesso." -#: commands/opclasscmds.c:760 +#: commands/amcmds.c:71 #, c-format -msgid "must be superuser to create an operator family" -msgstr "deve ser super-usuário para criar uma família de operadores" +msgid "access method \"%s\" already exists" +msgstr "o método de acesso \"%s\" já existe" -#: commands/opclasscmds.c:816 +#: commands/amcmds.c:154 commands/indexcmds.c:216 commands/indexcmds.c:839 +#: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format -msgid "must be superuser to alter an operator family" -msgstr "deve ser super-usuário para alterar uma família de operadores" +msgid "access method \"%s\" does not exist" +msgstr "método de acesso \"%s\" não existe" -#: commands/opclasscmds.c:882 +#: commands/amcmds.c:243 #, c-format -msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" -msgstr "tipos dos argumentos do operador devem ser especificados em ALTER OPERATOR FAMILY" +msgid "handler function is not specified" +msgstr "a função tratadora não está especificada" -#: commands/opclasscmds.c:946 +#: commands/amcmds.c:264 commands/event_trigger.c:183 +#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:709 +#: parser/parse_clause.c:941 #, c-format -msgid "STORAGE cannot be specified in ALTER OPERATOR FAMILY" -msgstr "STORAGE não pode ser especificado em ALTER OPERATOR FAMILY" +msgid "function %s must return type %s" +msgstr "a função %s deve retornar o tipo de dados %s" -#: commands/opclasscmds.c:1062 +#: commands/analyze.c:228 #, c-format -msgid "one or two argument types must be specified" -msgstr "um ou dois tipos de argumento devem ser especificados" +msgid "skipping \"%s\" --- cannot analyze this foreign table" +msgstr "ignorando \"%s\" --- não é possível analisar essa tabela estrangeira" -#: commands/opclasscmds.c:1088 +#: commands/analyze.c:245 #, c-format -msgid "index operators must be binary" -msgstr "operadores de índice devem ser binários" +msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" +msgstr "ignorando \"%s\" --- não pode analisar relações que não são tabelas ou tabelas especiais do sistema" -#: commands/opclasscmds.c:1113 +#: commands/analyze.c:325 #, c-format -msgid "access method \"%s\" does not support ordering operators" -msgstr "método de acesso \"%s\" não suporta operadores de ordenação" +msgid "analyzing \"%s.%s\" inheritance tree" +msgstr "analisando árvore da herança de \"%s.%s\"" -#: commands/opclasscmds.c:1126 +#: commands/analyze.c:330 #, c-format -msgid "index search operators must return boolean" -msgstr "operadores de busca no índice devem retornar booleano" +msgid "analyzing \"%s.%s\"" +msgstr "analisando \"%s.%s\"" -#: commands/opclasscmds.c:1168 +#: commands/analyze.c:395 #, c-format -msgid "btree comparison procedures must have two arguments" -msgstr "procedimentos de comparação de árvore B devem ter dois argumentos" +msgid "column \"%s\" of relation \"%s\" appears more than once" +msgstr "a coluna \"%s\" da relação \"%s\" aparece mais de uma vez" -#: commands/opclasscmds.c:1172 +#: commands/analyze.c:787 #, c-format -msgid "btree comparison procedures must return integer" -msgstr "procedimentos de comparação de árvore B devem retornar inteiro" +msgid "automatic analyze of table \"%s.%s.%s\"\n" +msgstr "análise automática da tabela \"%s.%s.%s\"\n" -#: commands/opclasscmds.c:1189 +#: commands/analyze.c:1334 #, c-format -msgid "btree sort support procedures must accept type \"internal\"" -msgstr "procedimentos de suporte a ordenação de árvore B devem aceitar tipo \"internal\"" +msgid "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead rows; %d rows in sample, %.0f estimated total rows" +msgstr "\"%s\": varridas %d de %u páginas, contendo %.0f linhas ativas e %.0f linhas mortas; %d linhas na amostra, total estimado de linhas %.0f" -#: commands/opclasscmds.c:1193 +#: commands/analyze.c:1418 #, c-format -msgid "btree sort support procedures must return void" -msgstr "procedimentos de suporte a ordenação de árvore B devem retornar void" +msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" +msgstr "" -#: commands/opclasscmds.c:1205 +#: commands/analyze.c:1516 #, c-format -msgid "hash procedures must have one argument" -msgstr "procedimentos hash devem ter um argumento" +msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no analyzable child tables" +msgstr "" -#: commands/opclasscmds.c:1209 +#: commands/async.c:646 #, c-format -msgid "hash procedures must return integer" -msgstr "procedimentos hash devem retornar inteiro" +msgid "channel name cannot be empty" +msgstr "nome do canal não pode ser vazio" -#: commands/opclasscmds.c:1233 +#: commands/async.c:652 #, c-format -msgid "associated data types must be specified for index support procedure" -msgstr "tipos de dados associados devem ser especificados para procedimento de suporte ao índice" +msgid "channel name too long" +msgstr "nome do canal é muito longo" -#: commands/opclasscmds.c:1258 +#: commands/async.c:657 #, c-format -msgid "procedure number %d for (%s,%s) appears more than once" -msgstr "procedimento número %d para (%s,%s) aparece mais de uma vez" +msgid "payload string too long" +msgstr "cadeia da carga é muito longa" -#: commands/opclasscmds.c:1265 +#: commands/async.c:876 #, c-format -msgid "operator number %d for (%s,%s) appears more than once" -msgstr "operador número %d para (%s,%s) aparece mais de uma vez" +msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" +msgstr "não é possível executar PREPARE em uma transação que executou LISTEN, UNLISTEN ou NOTIFY" -#: commands/opclasscmds.c:1314 +#: commands/async.c:980 #, c-format -msgid "operator %d(%s,%s) already exists in operator family \"%s\"" -msgstr "operador %d(%s,%s) já existe na família de operadores \"%s\"" +msgid "too many notifications in the NOTIFY queue" +msgstr "muitas notificações na fila do NOTIFY" -#: commands/opclasscmds.c:1430 +#: commands/async.c:1602 #, c-format -msgid "function %d(%s,%s) already exists in operator family \"%s\"" -msgstr "função %d(%s,%s) já existe na família de operadores \"%s\"" +msgid "NOTIFY queue is %.0f%% full" +msgstr "fila do NOTIFY está %.0f%% cheia" -#: commands/opclasscmds.c:1520 +#: commands/async.c:1604 #, c-format -msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" -msgstr "operador %d(%s,%s) não existe na família de operadores \"%s\"" +msgid "The server process with PID %d is among those with the oldest transactions." +msgstr "O processo servidor com PID %d está entre aqueles com transações mais antigas." -#: commands/opclasscmds.c:1560 +#: commands/async.c:1607 #, c-format -msgid "function %d(%s,%s) does not exist in operator family \"%s\"" -msgstr "função %d(%s,%s) não existe na família de operadores \"%s\"" +msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." +msgstr "A fila do NOTIFY não pode ser esvaziada até que o processo termine a transação atual." -#: commands/opclasscmds.c:1705 +#: commands/cluster.c:130 #, c-format -msgid "operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"" -msgstr "classe de operadores \"%s\" para método de acesso \"%s\" já existe no esquema \"%s\"" +msgid "unrecognized CLUSTER option \"%s\"" +msgstr "opção de CLUSTER não reconhecida \"%s\"" -#: commands/opclasscmds.c:1728 +#: commands/cluster.c:160 commands/cluster.c:433 #, c-format -msgid "operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"" -msgstr "família de operadores \"%s\" para método de acesso \"%s\" já existe no esquema \"%s\"" +msgid "cannot cluster temporary tables of other sessions" +msgstr "não é possível agrupar tabelas temporárias de outras sessões" -#: commands/operatorcmds.c:97 +#: commands/cluster.c:178 #, c-format -msgid "=> is deprecated as an operator name" -msgstr "=> está obsoleto como um nome de operador" +msgid "there is no previously clustered index for table \"%s\"" +msgstr "não há nenhum índice previamente agrupado na tabela \"%s\"" -#: commands/operatorcmds.c:98 +#: commands/cluster.c:192 commands/tablecmds.c:14206 commands/tablecmds.c:16049 #, c-format -msgid "This name may be disallowed altogether in future versions of PostgreSQL." -msgstr "Este nome pode ser proibido completamente em versões futuras do PostgreSQL." +msgid "index \"%s\" for table \"%s\" does not exist" +msgstr "índice \"%s\" na tabela \"%s\" não existe" -#: commands/operatorcmds.c:119 commands/operatorcmds.c:127 +#: commands/cluster.c:422 #, c-format -msgid "SETOF type not allowed for operator argument" -msgstr "tipo SETOF não é permitido como argumento de operador" +msgid "cannot cluster a shared catalog" +msgstr "não é possível agrupar um catálogo compartilhado" -#: commands/operatorcmds.c:155 +#: commands/cluster.c:437 #, c-format -msgid "operator attribute \"%s\" not recognized" -msgstr "atributo de operador \"%s\" desconhecido" +msgid "cannot vacuum temporary tables of other sessions" +msgstr "não é possível limpar tabelas temporárias de outras sessões" -#: commands/operatorcmds.c:165 +#: commands/cluster.c:513 commands/tablecmds.c:16059 #, c-format -msgid "operator procedure must be specified" -msgstr "procedimento de operador deve ser especificado" +msgid "\"%s\" is not an index for table \"%s\"" +msgstr "\"%s\" não é um índice na tabela \"%s\"" -#: commands/operatorcmds.c:176 +#: commands/cluster.c:521 #, c-format -msgid "at least one of leftarg or rightarg must be specified" -msgstr "pelo menos um dos argumentos esquerdo ou direito deve ser especificado" +msgid "cannot cluster on index \"%s\" because access method does not support clustering" +msgstr "não é possível agrupar o índice \"%s\", porque o método de acesso não dá suporte a agrupamento" -#: commands/operatorcmds.c:244 +#: commands/cluster.c:533 #, c-format -msgid "restriction estimator function %s must return type \"float8\"" -msgstr "função de estimação de restrição %s deve retornar tipo \"float8\"" +msgid "cannot cluster on partial index \"%s\"" +msgstr "não é possível agrupar índice parcial \"%s\"" -#: commands/operatorcmds.c:283 +#: commands/cluster.c:547 #, c-format -msgid "join estimator function %s must return type \"float8\"" -msgstr "função de estimação de junção %s deve retornar tipo \"float8\"" +msgid "cannot cluster on invalid index \"%s\"" +msgstr "não é possível agrupar por índice inválido \"%s\"" -#: commands/portalcmds.c:61 commands/portalcmds.c:160 -#: commands/portalcmds.c:212 +#: commands/cluster.c:571 #, c-format -msgid "invalid cursor name: must not be empty" -msgstr "nome do cursor é inválido: não deve ser vazio" +msgid "cannot mark index clustered in partitioned table" +msgstr "não é possível marcar o índice como agrupado (clustered) em tabela particionada" -#: commands/portalcmds.c:168 commands/portalcmds.c:222 -#: executor/execCurrent.c:67 utils/adt/xml.c:2386 utils/adt/xml.c:2553 +#: commands/cluster.c:950 #, c-format -msgid "cursor \"%s\" does not exist" -msgstr "cursor \"%s\" não existe" +msgid "clustering \"%s.%s\" using index scan on \"%s\"" +msgstr "agrupando \"%s.%s\" usando varredura de índice em \"%s\"" -#: commands/portalcmds.c:341 tcop/pquery.c:740 tcop/pquery.c:1404 +#: commands/cluster.c:956 #, c-format -msgid "portal \"%s\" cannot be run" -msgstr "portal \"%s\" não pode ser executado" +msgid "clustering \"%s.%s\" using sequential scan and sort" +msgstr "agrupando \"%s.%s\" usando varredura sequencial e classificação" -#: commands/portalcmds.c:411 +#: commands/cluster.c:961 #, c-format -msgid "could not reposition held cursor" -msgstr "não pôde reposicionar cursor aberto" +msgid "vacuuming \"%s.%s\"" +msgstr "limpando \"%s.%s\"" -#: commands/prepare.c:71 +#: commands/cluster.c:988 #, c-format -msgid "invalid statement name: must not be empty" -msgstr "nome de comando é inválido: não deve ser vazio" +msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" +msgstr "\"%s.%s\": encontradas %.0f versões de linha removíveis, %.0f não removíveis em %u páginas" -#: commands/prepare.c:129 parser/parse_param.c:304 tcop/postgres.c:1296 +#: commands/cluster.c:993 #, c-format -msgid "could not determine data type of parameter $%d" -msgstr "não pôde determinar o tipo de dado do parâmetro $%d" +msgid "" +"%.0f dead row versions cannot be removed yet.\n" +"%s." +msgstr "" +"%.0f versões de linha morta ainda não podem ser removidas.\n" +"%s." -#: commands/prepare.c:147 +#: commands/collationcmds.c:112 #, c-format -msgid "utility statements cannot be prepared" -msgstr "comandos utilitários não podem ser preparados" +msgid "collation attribute \"%s\" not recognized" +msgstr "atributo de ordenação \"%s\" não reconhecido" -#: commands/prepare.c:257 commands/prepare.c:264 +#: commands/collationcmds.c:125 commands/collationcmds.c:131 +#: commands/define.c:389 commands/tablecmds.c:7880 +#: replication/pgoutput/pgoutput.c:309 replication/pgoutput/pgoutput.c:332 +#: replication/pgoutput/pgoutput.c:346 replication/pgoutput/pgoutput.c:356 +#: replication/pgoutput/pgoutput.c:366 replication/pgoutput/pgoutput.c:376 +#: replication/pgoutput/pgoutput.c:386 replication/walsender.c:996 +#: replication/walsender.c:1018 replication/walsender.c:1028 #, c-format -msgid "prepared statement is not a SELECT" -msgstr "comando preparado não é um SELECT" +msgid "conflicting or redundant options" +msgstr "opções conflitantes ou redundantes" -#: commands/prepare.c:332 +#: commands/collationcmds.c:126 #, c-format -msgid "wrong number of parameters for prepared statement \"%s\"" -msgstr "número incorreto de parâmetros para comando preparado \"%s\"" +msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." +msgstr "" -#: commands/prepare.c:334 +#: commands/collationcmds.c:132 #, c-format -msgid "Expected %d parameters but got %d." -msgstr "Esperado %d parâmetros mas recebeu %d." +msgid "FROM cannot be specified together with any other options." +msgstr "FROM não pode ser especificado junto com nenhuma outra opção." -#: commands/prepare.c:370 +#: commands/collationcmds.c:191 #, c-format -msgid "parameter $%d of type %s cannot be coerced to the expected type %s" -msgstr "parâmetro $%d do tipo %s não pode ser convertido para tipo esperado %s" +msgid "collation \"default\" cannot be copied" +msgstr "a ordenação \"padrão\" não pode ser copiada" -#: commands/prepare.c:465 +#: commands/collationcmds.c:225 #, c-format -msgid "prepared statement \"%s\" already exists" -msgstr "comando preparado \"%s\" já existe" +msgid "unrecognized collation provider: %s" +msgstr "provedor de ordenação não reconhecido: %s" -#: commands/prepare.c:504 +#: commands/collationcmds.c:253 commands/collationcmds.c:259 +#: commands/collationcmds.c:267 #, c-format -msgid "prepared statement \"%s\" does not exist" -msgstr "comando preparado \"%s\" não existe" +msgid "parameter \"%s\" must be specified" +msgstr "o parâmetro \"%s\" deve ser especificado" -#: commands/proclang.c:86 +#: commands/collationcmds.c:282 commands/dbcommands.c:1091 #, c-format -msgid "using pg_pltemplate information instead of CREATE LANGUAGE parameters" -msgstr "utilizando informação de pg_pltemplate ao invés dos parâmetros de CREATE LANGUAGE" +msgid "using standard form \"%s\" for ICU locale \"%s\"" +msgstr "usando a forma padrão \"%s\" para a localidade ICU \"%s\"" -#: commands/proclang.c:96 +#: commands/collationcmds.c:301 #, c-format -msgid "must be superuser to create procedural language \"%s\"" -msgstr "deve ser super-usuário para criar linguagem procedural \"%s\"" +msgid "nondeterministic collations not supported with this provider" +msgstr "as ordenações não determinísticas não têm suporte por este provedor" -#: commands/proclang.c:116 commands/proclang.c:278 +#: commands/collationcmds.c:306 commands/dbcommands.c:1110 #, c-format -msgid "function %s must return type \"language_handler\"" -msgstr "função %s deve retornar tipo \"language_handler\"" +msgid "ICU rules cannot be specified unless locale provider is ICU" +msgstr "não podem ser especificadas regras ICU, a menos que o provedor local seja ICU" -#: commands/proclang.c:242 +#: commands/collationcmds.c:325 #, c-format -msgid "unsupported language \"%s\"" -msgstr "linguagem \"%s\" não é suportada" +msgid "current database's encoding is not supported with this provider" +msgstr "a codificação do banco de dados corrente não tem suporte por este provedor" -#: commands/proclang.c:244 +#: commands/collationcmds.c:385 #, c-format -msgid "The supported languages are listed in the pg_pltemplate system catalog." -msgstr "As linguagens suportadas estão listadas no catálogo do sistema pg_pltemplate." +msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" +msgstr "ordenação \"%s\" para codificação \"%s\" já existe no esquema \"%s\"" -#: commands/proclang.c:252 +#: commands/collationcmds.c:396 #, c-format -msgid "must be superuser to create custom procedural language" -msgstr "deve ser super-usuário para criar linguagem procedural personalizada" +msgid "collation \"%s\" already exists in schema \"%s\"" +msgstr "ordenação \"%s\" já existe no esquema \"%s\"" -#: commands/proclang.c:271 +#: commands/collationcmds.c:421 #, c-format -msgid "changing return type of function %s from \"opaque\" to \"language_handler\"" -msgstr "alterando tipo de retorno da função %s de \"opaque\" para \"language_handler\"" +msgid "cannot refresh version of default collation" +msgstr "não é possível atualizar a versão de ordenação padrão" -#: commands/schemacmds.c:84 commands/schemacmds.c:236 +#. translator: %s is an SQL command +#. translator: %s is an SQL ALTER command +#: commands/collationcmds.c:423 commands/subscriptioncmds.c:1331 +#: commands/tablecmds.c:7705 commands/tablecmds.c:7715 +#: commands/tablecmds.c:13908 commands/tablecmds.c:17188 +#: commands/tablecmds.c:17209 commands/typecmds.c:3637 commands/typecmds.c:3720 +#: commands/typecmds.c:4013 #, c-format -msgid "unacceptable schema name \"%s\"" -msgstr "nome de esquema \"%s\" é inaceitável" +msgid "Use %s instead." +msgstr "Use %s em seu lugar." -#: commands/schemacmds.c:85 commands/schemacmds.c:237 +#: commands/collationcmds.c:451 commands/dbcommands.c:2488 #, c-format -msgid "The prefix \"pg_\" is reserved for system schemas." -msgstr "O prefixo \"pg_\" é reservado para esquemas do sistema." +msgid "changing version from %s to %s" +msgstr "mudando a versão de %s para %s" -#: commands/schemacmds.c:99 +#: commands/collationcmds.c:466 commands/dbcommands.c:2501 #, c-format -msgid "schema \"%s\" already exists, skipping" -msgstr "esquema \"%s\" já existe, ignorando" +msgid "version has not changed" +msgstr "a versão não mudou" -#: commands/seclabel.c:58 +#: commands/collationcmds.c:499 commands/dbcommands.c:2667 #, c-format -msgid "no security label providers have been loaded" -msgstr "nenhum fornecedor de rótulo de segurança foi carregado" +msgid "database with OID %u does not exist" +msgstr "banco de dados com OID %u não existe" -#: commands/seclabel.c:62 +#: commands/collationcmds.c:520 #, c-format -msgid "must specify provider when multiple security label providers have been loaded" -msgstr "deve especificar fornecedor quando múltiplos fornecedores de rótulo de segurança forem carregados" +msgid "collation with OID %u does not exist" +msgstr "ordenação com OID %u não existe" -#: commands/seclabel.c:80 +#: commands/collationcmds.c:808 #, c-format -msgid "security label provider \"%s\" is not loaded" -msgstr "fornecedor de rótulo de segurança \"%s\" não foi carregado" +msgid "must be superuser to import system collations" +msgstr "é necessário ser um superusuário para importar ordenações do sistema" -#: commands/sequence.c:123 +#: commands/collationcmds.c:836 commands/copyfrom.c:1671 commands/copyto.c:656 +#: libpq/be-secure-common.c:59 #, c-format -msgid "unlogged sequences are not supported" -msgstr "sequências unlogged não são suportadas" +msgid "could not execute command \"%s\": %m" +msgstr "não foi possível executar comando \"%s\": %m" -#: commands/sequence.c:618 +#: commands/collationcmds.c:928 commands/collationcmds.c:1013 #, c-format -msgid "nextval: reached maximum value of sequence \"%s\" (%s)" -msgstr "nextval: valor máximo da sequência \"%s\" foi alcançado (%s)" +msgid "no usable system locales were found" +msgstr "não foi encontrada nenhuma localidade do sistema utilizável" -#: commands/sequence.c:641 +#: commands/comment.c:61 commands/dbcommands.c:1612 commands/dbcommands.c:1824 +#: commands/dbcommands.c:1934 commands/dbcommands.c:2132 +#: commands/dbcommands.c:2370 commands/dbcommands.c:2461 +#: commands/dbcommands.c:2571 commands/dbcommands.c:3071 +#: utils/init/postinit.c:1021 utils/init/postinit.c:1085 +#: utils/init/postinit.c:1157 #, c-format -msgid "nextval: reached minimum value of sequence \"%s\" (%s)" -msgstr "nextval: valor mínimo da sequência \"%s\" foi alcançado (%s)" +msgid "database \"%s\" does not exist" +msgstr "banco de dados \"%s\" não existe" -#: commands/sequence.c:754 +#: commands/comment.c:101 #, c-format -msgid "currval of sequence \"%s\" is not yet defined in this session" -msgstr "valor atual da sequência \"%s\" ainda não foi definido nesta sessão" +msgid "cannot set comment on relation \"%s\"" +msgstr "não é possível definir comentário na relação \"%s\"" -#: commands/sequence.c:773 commands/sequence.c:779 +#: commands/constraint.c:63 utils/adt/ri_triggers.c:2028 #, c-format -msgid "lastval is not yet defined in this session" -msgstr "lastval ainda não foi definido nesta sessão" +msgid "function \"%s\" was not called by trigger manager" +msgstr "função \"%s\" não foi chamada pelo gerenciador de gatilhos" -#: commands/sequence.c:848 +#: commands/constraint.c:70 utils/adt/ri_triggers.c:2037 #, c-format -msgid "setval: value %s is out of bounds for sequence \"%s\" (%s..%s)" -msgstr "setval: valor %s está fora do intervalo da sequência \"%s\" (%s..%s)" +msgid "function \"%s\" must be fired AFTER ROW" +msgstr "função \"%s\" deve ser disparada no AFTER ROW" -#: commands/sequence.c:1224 +#: commands/constraint.c:84 #, c-format -msgid "INCREMENT must not be zero" -msgstr "INCREMENT não deve ser zero" +msgid "function \"%s\" must be fired for INSERT or UPDATE" +msgstr "função \"%s\" deve ser disparada pelo INSERT ou UPDATE" -#: commands/sequence.c:1280 +#: commands/conversioncmds.c:69 #, c-format -msgid "MINVALUE (%s) must be less than MAXVALUE (%s)" -msgstr "MINVALUE (%s) deve ser menor do que MAXVALUE (%s)" +msgid "source encoding \"%s\" does not exist" +msgstr "codificação de origem \"%s\" não existe" -#: commands/sequence.c:1305 +#: commands/conversioncmds.c:76 #, c-format -msgid "START value (%s) cannot be less than MINVALUE (%s)" -msgstr "valor de START (%s) não pode ser menor do que MINVALUE (%s)" +msgid "destination encoding \"%s\" does not exist" +msgstr "codificação de destino \"%s\" não existe" -#: commands/sequence.c:1317 +#: commands/conversioncmds.c:89 #, c-format -msgid "START value (%s) cannot be greater than MAXVALUE (%s)" -msgstr "valor de START (%s) não pode ser maior do que MAXVALUE (%s)" +msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" +msgstr "a conversão da codificação de ou para \"SQL_ASCII\" não tem suporte" -#: commands/sequence.c:1347 +#: commands/conversioncmds.c:102 #, c-format -msgid "RESTART value (%s) cannot be less than MINVALUE (%s)" -msgstr "valor de RESTART (%s) não pode ser menor do que MINVALUE (%s)" +msgid "encoding conversion function %s must return type %s" +msgstr "a função de conversão de codificação %s deve retornar o tipo de dados %s" -#: commands/sequence.c:1359 +#: commands/conversioncmds.c:132 #, c-format -msgid "RESTART value (%s) cannot be greater than MAXVALUE (%s)" -msgstr "valor de RESTART (%s) não pode ser maior do que MAXVALUE (%s)" +msgid "encoding conversion function %s returned incorrect result for empty input" +msgstr "a função de conversão de codificação %s retornou um resultado incorreto para entrada vazia" -#: commands/sequence.c:1374 +#: commands/copy.c:86 #, c-format -msgid "CACHE (%s) must be greater than zero" -msgstr "CACHE (%s) deve ser maior do que zero" +msgid "permission denied to COPY to or from an external program" +msgstr "permissão negada para COPY para ou de um programa externo" -#: commands/sequence.c:1406 +#: commands/copy.c:87 #, c-format -msgid "invalid OWNED BY option" -msgstr "opção de OWNED BY é inválida" +msgid "Only roles with privileges of the \"%s\" role may COPY to or from an external program." +msgstr "Somente funções de banco de dados (roles) com privilégios de função de banco de dados \"%s\" podem copiar para ou de um programa externo." -#: commands/sequence.c:1407 +#: commands/copy.c:89 commands/copy.c:100 commands/copy.c:109 #, c-format -msgid "Specify OWNED BY table.column or OWNED BY NONE." -msgstr "Especifique OWNED BY tabela.coluna ou OWNED BY NONE." +msgid "Anyone can COPY to stdout or from stdin. psql's \\copy command also works for anyone." +msgstr "Qualquer um pode utilizar COPY para saída stdout ou da entrada padrão. comando \\copy do psql também funciona para qualquer um." -#: commands/sequence.c:1430 +#: commands/copy.c:97 #, c-format -msgid "referenced relation \"%s\" is not a table or foreign table" -msgstr "relação referenciada \"%s\" não é uma tabela ou uma tabela externa" +msgid "permission denied to COPY from a file" +msgstr "permissão negada para executar COPY de um arquivo" -#: commands/sequence.c:1437 +#: commands/copy.c:98 #, c-format -msgid "sequence must have same owner as table it is linked to" -msgstr "sequência deve ter mesmo dono da tabela que ela está ligada" +msgid "Only roles with privileges of the \"%s\" role may COPY from a file." +msgstr "Somente as funções de banco de dados (roles) com os privilégios da função de banco de dados \"%s\" podem executar COPY de um arquivo." -#: commands/sequence.c:1441 +#: commands/copy.c:106 #, c-format -msgid "sequence must be in same schema as table it is linked to" -msgstr "sequência deve estar no mesmo esquema da tabela que ela está ligada" +msgid "permission denied to COPY to a file" +msgstr "permissão negada para executar COPY para um arquivo" -#: commands/tablecmds.c:206 +#: commands/copy.c:107 #, c-format -msgid "table \"%s\" does not exist" -msgstr "tabela \"%s\" não existe" +msgid "Only roles with privileges of the \"%s\" role may COPY to a file." +msgstr "Somente as funções de banco de dados (roles) com os privilégios da função de banco de dados \"%s\" podem executar COPY para um arquivo." -#: commands/tablecmds.c:207 +#: commands/copy.c:195 #, c-format -msgid "table \"%s\" does not exist, skipping" -msgstr "tabela \"%s\" não existe, ignorando" - -#: commands/tablecmds.c:209 -msgid "Use DROP TABLE to remove a table." -msgstr "Use DROP TABLE para remover uma tabela." +msgid "COPY FROM not supported with row-level security" +msgstr "COPY FROM não tem suporte com segurança no nível de linha" -#: commands/tablecmds.c:212 +#: commands/copy.c:196 #, c-format -msgid "sequence \"%s\" does not exist" -msgstr "sequência \"%s\" não existe" +msgid "Use INSERT statements instead." +msgstr "Use instruções INSERT em seu lugar." -#: commands/tablecmds.c:213 +#: commands/copy.c:290 #, c-format -msgid "sequence \"%s\" does not exist, skipping" -msgstr "sequência \"%s\" não existe, ignorando" +msgid "MERGE not supported in COPY" +msgstr "MERGE sem suporte em COPY" -#: commands/tablecmds.c:215 -msgid "Use DROP SEQUENCE to remove a sequence." -msgstr "Use DROP SEQUENCE para remover uma sequência." - -#: commands/tablecmds.c:218 +#: commands/copy.c:383 #, c-format -msgid "view \"%s\" does not exist" -msgstr "visão \"%s\" não existe" +msgid "cannot use \"%s\" with HEADER in COPY TO" +msgstr "não é possível usar \"%s\" com HEADER em COPY TO" -#: commands/tablecmds.c:219 +#: commands/copy.c:392 #, c-format -msgid "view \"%s\" does not exist, skipping" -msgstr "visão \"%s\" não existe, ignorando" - -#: commands/tablecmds.c:221 -msgid "Use DROP VIEW to remove a view." -msgstr "Use DROP VIEW para remover uma visão." +msgid "%s requires a Boolean value or \"match\"" +msgstr "%s requer um valor booleano ou \"match\"" -#: commands/tablecmds.c:224 +#: commands/copy.c:451 #, c-format -msgid "materialized view \"%s\" does not exist" -msgstr "visão materializada \"%s\" não existe" +msgid "COPY format \"%s\" not recognized" +msgstr "formato COPY \"%s\" desconhecido" -#: commands/tablecmds.c:225 +#: commands/copy.c:509 commands/copy.c:522 commands/copy.c:535 +#: commands/copy.c:554 #, c-format -msgid "materialized view \"%s\" does not exist, skipping" -msgstr "visão materializada \"%s\" não existe, ignorando" - -#: commands/tablecmds.c:227 -msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." -msgstr "Use DROP MATERIALIZED VIEW para remover uma visão materializada." +msgid "argument to option \"%s\" must be a list of column names" +msgstr "argumento para opção \"%s\" deve ser uma lista de nomes de colunas" -#: commands/tablecmds.c:230 parser/parse_utilcmd.c:1548 +#: commands/copy.c:566 #, c-format -msgid "index \"%s\" does not exist" -msgstr "índice \"%s\" não existe" +msgid "argument to option \"%s\" must be a valid encoding name" +msgstr "argumento para opção \"%s\" deve ser um nome de codificação válido" -#: commands/tablecmds.c:231 +#: commands/copy.c:573 commands/dbcommands.c:859 commands/dbcommands.c:2318 #, c-format -msgid "index \"%s\" does not exist, skipping" -msgstr "índice \"%s\" não existe, ignorando" - -#: commands/tablecmds.c:233 -msgid "Use DROP INDEX to remove an index." -msgstr "Use DROP INDEX para remover um índice." +msgid "option \"%s\" not recognized" +msgstr "opção \"%s\" desconhecida" -#: commands/tablecmds.c:238 +#: commands/copy.c:585 #, c-format -msgid "\"%s\" is not a type" -msgstr "\"%s\" não é um tipo" - -#: commands/tablecmds.c:239 -msgid "Use DROP TYPE to remove a type." -msgstr "use DROP TYPE para remover um tipo." +msgid "cannot specify DELIMITER in BINARY mode" +msgstr "não é possível especificar DELIMITER no modo BINARY" -#: commands/tablecmds.c:242 commands/tablecmds.c:8076 -#: commands/tablecmds.c:10557 +#: commands/copy.c:590 #, c-format -msgid "foreign table \"%s\" does not exist" -msgstr "tabela externa \"%s\" não existe" +msgid "cannot specify NULL in BINARY mode" +msgstr "não é possível especificar NULL no modo BINARY" -#: commands/tablecmds.c:243 +#: commands/copy.c:595 #, c-format -msgid "foreign table \"%s\" does not exist, skipping" -msgstr "tabela externa \"%s\" não existe, ignorando" +msgid "cannot specify DEFAULT in BINARY mode" +msgstr "não é possível especificar DEFAULT no modo BINARY" -#: commands/tablecmds.c:245 -msgid "Use DROP FOREIGN TABLE to remove a foreign table." -msgstr "Use DROP FOREIGN TABLE para remover uma tabela externa." - -#: commands/tablecmds.c:469 +#: commands/copy.c:617 #, c-format -msgid "ON COMMIT can only be used on temporary tables" -msgstr "ON COMMIT só pode ser utilizado em tabelas temporárias" +msgid "COPY delimiter must be a single one-byte character" +msgstr "o delimitador do COPY deve ter um único caractere de um byte" -#: commands/tablecmds.c:473 parser/parse_utilcmd.c:521 -#: parser/parse_utilcmd.c:532 parser/parse_utilcmd.c:549 -#: parser/parse_utilcmd.c:611 +#: commands/copy.c:624 #, c-format -msgid "constraints are not supported on foreign tables" -msgstr "restrições não são suportadas em tabelas externas" +msgid "COPY delimiter cannot be newline or carriage return" +msgstr "delimitador do COPY não pode ser nova linha ou retorno de carro" -#: commands/tablecmds.c:493 +#: commands/copy.c:630 #, c-format -msgid "cannot create temporary table within security-restricted operation" -msgstr "não pode criar tabela temporária em operação com restrição de segurança" +msgid "COPY null representation cannot use newline or carriage return" +msgstr "representação do nulo do COPY não pode ser nova linha ou retorno de carro" -#: commands/tablecmds.c:789 +#: commands/copy.c:640 #, c-format -msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" -msgstr "DROP INDEX CONCURRENTLY não suporta múltiplos objetos" +msgid "COPY default representation cannot use newline or carriage return" +msgstr "a representação de nulo no COPY não pode usar o caractere de nova linha ou de retorno do carro" -#: commands/tablecmds.c:793 +#: commands/copy.c:658 #, c-format -msgid "DROP INDEX CONCURRENTLY does not support CASCADE" -msgstr "DROP INDEX CONCURRENTLY não suporta CASCADE" +msgid "COPY delimiter cannot be \"%s\"" +msgstr "delimitador do COPY não pode ser \"%s\"" -#: commands/tablecmds.c:938 commands/tablecmds.c:1276 -#: commands/tablecmds.c:2133 commands/tablecmds.c:4112 -#: commands/tablecmds.c:5942 commands/tablecmds.c:11170 -#: commands/tablecmds.c:11205 commands/trigger.c:232 commands/trigger.c:1118 -#: commands/trigger.c:1226 rewrite/rewriteDefine.c:271 -#: rewrite/rewriteDefine.c:887 +#: commands/copy.c:664 #, c-format -msgid "permission denied: \"%s\" is a system catalog" -msgstr "permissão negada: \"%s\" é um catálogo do sistema" +msgid "cannot specify HEADER in BINARY mode" +msgstr "não é possível especificar HEADER no modo BINARY" -#: commands/tablecmds.c:1052 +#: commands/copy.c:670 #, c-format -msgid "truncate cascades to table \"%s\"" -msgstr "truncando em cascata tabela \"%s\"" +msgid "COPY quote available only in CSV mode" +msgstr "delimitador de dados do COPY só está disponível no modo CSV" -#: commands/tablecmds.c:1286 +#: commands/copy.c:675 #, c-format -msgid "cannot truncate temporary tables of other sessions" -msgstr "não pode truncar tabelas temporárias de outras sessões" +msgid "COPY quote must be a single one-byte character" +msgstr "o delimitador de dados do COPY deve ter um único caractere de um byte" -#: commands/tablecmds.c:1491 parser/parse_utilcmd.c:1760 +#: commands/copy.c:680 #, c-format -msgid "inherited relation \"%s\" is not a table" -msgstr "relação herdada \"%s\" não é uma tabela" +msgid "COPY delimiter and quote must be different" +msgstr "delimitador e delimitador de dados do COPY devem ser diferentes" -#: commands/tablecmds.c:1498 commands/tablecmds.c:9531 +#: commands/copy.c:686 #, c-format -msgid "cannot inherit from temporary relation \"%s\"" -msgstr "não pode herdar de uma tabela temporária \"%s\"" +msgid "COPY escape available only in CSV mode" +msgstr "escape do COPY só está disponível no modo CSV" -#: commands/tablecmds.c:1506 commands/tablecmds.c:9539 +#: commands/copy.c:691 #, c-format -msgid "cannot inherit from temporary relation of another session" -msgstr "não pode herdar de tabela temporária de outra sessão" +msgid "COPY escape must be a single one-byte character" +msgstr "o escape do COPY deve ter um único caractere de um byte" -#: commands/tablecmds.c:1522 commands/tablecmds.c:9573 +#: commands/copy.c:697 #, c-format -msgid "relation \"%s\" would be inherited from more than once" -msgstr "relação \"%s\" seria herdada de mais de uma vez" +msgid "COPY force quote available only in CSV mode" +msgstr "opção force quote do COPY somente está disponível no modo CSV" -#: commands/tablecmds.c:1570 +#: commands/copy.c:701 #, c-format -msgid "merging multiple inherited definitions of column \"%s\"" -msgstr "juntando múltiplas definições herdadas da coluna \"%s\"" +msgid "COPY force quote only available using COPY TO" +msgstr "opção force quote do COPY somente está disponível ao utilizar COPY TO" -#: commands/tablecmds.c:1578 +#: commands/copy.c:707 #, c-format -msgid "inherited column \"%s\" has a type conflict" -msgstr "coluna herdada \"%s\" tem um conflito de tipo" +msgid "COPY force not null available only in CSV mode" +msgstr "opção force not null do COPY somente está disponível no modo CSV" -#: commands/tablecmds.c:1580 commands/tablecmds.c:1601 -#: commands/tablecmds.c:1789 commands/tablecmds.c:1811 -#: parser/parse_coerce.c:1592 parser/parse_coerce.c:1612 -#: parser/parse_coerce.c:1632 parser/parse_coerce.c:1677 -#: parser/parse_coerce.c:1714 parser/parse_param.c:218 +#: commands/copy.c:711 #, c-format -msgid "%s versus %s" -msgstr "%s versus %s" +msgid "COPY force not null only available using COPY FROM" +msgstr "opção force not null do COPY somente está disponível ao utilizar COPY FROM" -#: commands/tablecmds.c:1587 +#: commands/copy.c:717 #, c-format -msgid "inherited column \"%s\" has a collation conflict" -msgstr "coluna herdada \"%s\" tem um conflito de ordenação" +msgid "COPY force null available only in CSV mode" +msgstr "opção force null do COPY somente está disponível no modo CSV" -#: commands/tablecmds.c:1589 commands/tablecmds.c:1799 -#: commands/tablecmds.c:4536 +#: commands/copy.c:722 #, c-format -msgid "\"%s\" versus \"%s\"" -msgstr "\"%s\" versus \"%s\"" +msgid "COPY force null only available using COPY FROM" +msgstr "opção force null do COPY somente está disponível ao utilizar COPY FROM" -#: commands/tablecmds.c:1599 +#: commands/copy.c:728 #, c-format -msgid "inherited column \"%s\" has a storage parameter conflict" -msgstr "coluna herdada \"%s\" tem um conflito de parâmetro de armazenamento" +msgid "COPY delimiter must not appear in the NULL specification" +msgstr "delimitador do COPY não deve aparecer em uma especificação NULL" -#: commands/tablecmds.c:1712 parser/parse_utilcmd.c:853 -#: parser/parse_utilcmd.c:1195 parser/parse_utilcmd.c:1271 +#: commands/copy.c:735 #, c-format -msgid "cannot convert whole-row table reference" -msgstr "não pode converter referência a todo registro da tabela" +msgid "CSV quote character must not appear in the NULL specification" +msgstr "o caractere delimitador de dados do CSV não deve aparecer na especificação de NULL" -#: commands/tablecmds.c:1713 parser/parse_utilcmd.c:854 +#: commands/copy.c:742 #, c-format -msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." -msgstr "Restrição \"%s\" contém referência a todo registro da tabela \"%s\"." +msgid "COPY DEFAULT only available using COPY FROM" +msgstr "COPY DEFAULT disponível apenas quando usado COPY FROM" -#: commands/tablecmds.c:1779 +#: commands/copy.c:748 #, c-format -msgid "merging column \"%s\" with inherited definition" -msgstr "juntando coluna \"%s\" com definição herdada" +msgid "COPY delimiter must not appear in the DEFAULT specification" +msgstr "O delimitador do COPY não deve aparecer na especificação do DEFAULT" -#: commands/tablecmds.c:1787 +#: commands/copy.c:755 #, c-format -msgid "column \"%s\" has a type conflict" -msgstr "coluna \"%s\" tem um conflito de tipo" +msgid "CSV quote character must not appear in the DEFAULT specification" +msgstr "O caractere delimitador do CSV não deve aparecer na especificação de DEFAULT" -#: commands/tablecmds.c:1797 +#: commands/copy.c:763 #, c-format -msgid "column \"%s\" has a collation conflict" -msgstr "coluna \"%s\" tem um conflito de ordenação" +msgid "NULL specification and DEFAULT specification cannot be the same" +msgstr "A especificação de NULL e a especificação de DEFAULT não podem ser a mesma" -#: commands/tablecmds.c:1809 +#: commands/copy.c:825 #, c-format -msgid "column \"%s\" has a storage parameter conflict" -msgstr "coluna \"%s\" tem um conflito de parâmetro de armazenamento" +msgid "column \"%s\" is a generated column" +msgstr "a coluna \"%s\" é uma coluna gerada" -#: commands/tablecmds.c:1861 +#: commands/copy.c:827 #, c-format -msgid "column \"%s\" inherits conflicting default values" -msgstr "coluna \"%s\" herdou valores padrão conflitantes" +msgid "Generated columns cannot be used in COPY." +msgstr "As colunas geradas não podem ser usadas no COPY." -#: commands/tablecmds.c:1863 +#: commands/copy.c:842 commands/indexcmds.c:1886 commands/statscmds.c:242 +#: commands/tablecmds.c:2405 commands/tablecmds.c:3127 +#: commands/tablecmds.c:3626 parser/parse_relation.c:3689 +#: parser/parse_relation.c:3699 parser/parse_relation.c:3717 +#: parser/parse_relation.c:3724 parser/parse_relation.c:3738 +#: utils/adt/tsvector_op.c:2855 #, c-format -msgid "To resolve the conflict, specify a default explicitly." -msgstr "Para resolver o conflito, especifique um padrão explicitamente." +msgid "column \"%s\" does not exist" +msgstr "coluna \"%s\" não existe" -#: commands/tablecmds.c:1910 +#: commands/copy.c:849 commands/tablecmds.c:2431 commands/trigger.c:958 +#: parser/parse_target.c:1070 parser/parse_target.c:1081 #, c-format -msgid "check constraint name \"%s\" appears multiple times but with different expressions" -msgstr "nome da restrição de verificação \"%s\" aparece múltiplas vezes mas com diferentes expressões" +msgid "column \"%s\" specified more than once" +msgstr "coluna \"%s\" especificada mais de uma vez" -#: commands/tablecmds.c:2104 +#: commands/copyfrom.c:122 #, c-format -msgid "cannot rename column of typed table" -msgstr "não pode renomear coluna de tabela tipada" +msgid "COPY %s" +msgstr "COPY %s" -#: commands/tablecmds.c:2121 +#: commands/copyfrom.c:130 #, c-format -msgid "\"%s\" is not a table, view, materialized view, composite type, index, or foreign table" -msgstr "\"%s\" não é uma tabela, visão, visão materializada, tipo composto, índice ou tabela externa" +msgid "COPY %s, line %llu, column %s" +msgstr "COPY %s, linha %llu, coluna %s" -#: commands/tablecmds.c:2213 +#: commands/copyfrom.c:135 commands/copyfrom.c:181 #, c-format -msgid "inherited column \"%s\" must be renamed in child tables too" -msgstr "coluna herdada \"%s\" deve ser renomeada nas tabelas descendentes também" +msgid "COPY %s, line %llu" +msgstr "COPY %s, linha %llu" -#: commands/tablecmds.c:2245 +#: commands/copyfrom.c:147 #, c-format -msgid "cannot rename system column \"%s\"" -msgstr "não pode renomear coluna do sistema \"%s\"" +msgid "COPY %s, line %llu, column %s: \"%s\"" +msgstr "COPY %s, linha %llu, coluna %s: \"%s\"" -#: commands/tablecmds.c:2260 +#: commands/copyfrom.c:157 #, c-format -msgid "cannot rename inherited column \"%s\"" -msgstr "não pode renomear coluna herdada \"%s\"" +msgid "COPY %s, line %llu, column %s: null input" +msgstr "COPY %s, linha %llu, coluna %s: entrada nula" -#: commands/tablecmds.c:2407 +#: commands/copyfrom.c:174 #, c-format -msgid "inherited constraint \"%s\" must be renamed in child tables too" -msgstr "restrição herdada \"%s\" deve ser renomeada nas tabelas descendentes também" +msgid "COPY %s, line %llu: \"%s\"" +msgstr "COPY %s, linha %llu: \"%s\"" -#: commands/tablecmds.c:2414 +#: commands/copyfrom.c:673 #, c-format -msgid "cannot rename inherited constraint \"%s\"" -msgstr "não pode renomear restrição herdada \"%s\"" +msgid "cannot copy to view \"%s\"" +msgstr "não é possível copiar para visão \"%s\"" -#. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:2628 +#: commands/copyfrom.c:675 #, c-format -msgid "cannot %s \"%s\" because it is being used by active queries in this session" -msgstr "não pode executar %s \"%s\" porque ela está sendo utilizada por consultas ativas nessa sessão" +msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." +msgstr "Para permitir a cópia para uma visão, forneça um gatilho INSTEAD OF INSERT." -#. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:2637 +#: commands/copyfrom.c:679 #, c-format -msgid "cannot %s \"%s\" because it has pending trigger events" -msgstr "não pode executar %s \"%s\" porque ela tem eventos de gatilho pendentes" +msgid "cannot copy to materialized view \"%s\"" +msgstr "não é possível copiar para visão materializada \"%s\"" -#: commands/tablecmds.c:3607 +#: commands/copyfrom.c:684 #, c-format -msgid "cannot rewrite system relation \"%s\"" -msgstr "não pode reescrever relação do sistema \"%s\"" +msgid "cannot copy to sequence \"%s\"" +msgstr "não é possível copiar para sequência \"%s\"" -#: commands/tablecmds.c:3613 +#: commands/copyfrom.c:689 #, c-format -msgid "cannot rewrite table \"%s\" used as a catalog table" -msgstr "não pôde reescrever tabela \"%s\" utilizada como tabela de catálogo" +msgid "cannot copy to non-table relation \"%s\"" +msgstr "não é possível copiar para a relação \"%s\" que não é uma tabela" -#: commands/tablecmds.c:3623 +#: commands/copyfrom.c:729 #, c-format -msgid "cannot rewrite temporary tables of other sessions" -msgstr "não pode reescrever tabelas temporárias de outras sessões" +msgid "cannot perform COPY FREEZE on a partitioned table" +msgstr "não é possível executar COPY FREEZE em uma tabela particionada" -#: commands/tablecmds.c:3854 +#: commands/copyfrom.c:744 #, c-format -msgid "rewriting table \"%s\"" -msgstr "reescrevendo tabela \"%s\"" +msgid "cannot perform COPY FREEZE because of prior transaction activity" +msgstr "não é possível executar COPY FREEZE devido a atividade de transação anterior" -#: commands/tablecmds.c:3858 +#: commands/copyfrom.c:750 #, c-format -msgid "verifying table \"%s\"" -msgstr "verificando tabela \"%s\"" +msgid "cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction" +msgstr "não é possível executar COPY FREEZE, porque a tabela não foi criada ou truncada na subtransação corrente" -#: commands/tablecmds.c:3972 +#: commands/copyfrom.c:1414 #, c-format -msgid "column \"%s\" contains null values" -msgstr "coluna \"%s\" contém valores nulos" +msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" +msgstr "coluna FORCE_NOT_NULL \"%s\" não referenciada por COPY" -#: commands/tablecmds.c:3987 commands/tablecmds.c:6985 +#: commands/copyfrom.c:1437 #, c-format -msgid "check constraint \"%s\" is violated by some row" -msgstr "restrição de verificação \"%s\" foi violada por algum registro" +msgid "FORCE_NULL column \"%s\" not referenced by COPY" +msgstr "coluna FORCE_NULL \"%s\" não referenciada por COPY" -#: commands/tablecmds.c:4133 commands/trigger.c:226 -#: rewrite/rewriteDefine.c:265 rewrite/rewriteDefine.c:882 +#: commands/copyfrom.c:1490 utils/mb/mbutils.c:386 #, c-format -msgid "\"%s\" is not a table or view" -msgstr "\"%s\" não é uma tabela ou visão" +msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" +msgstr "função padrão de conversão da codificação \"%s\" para \"%s\" não existe" -#: commands/tablecmds.c:4136 +#: commands/copyfrom.c:1690 #, c-format -msgid "\"%s\" is not a table, view, materialized view, or index" -msgstr "\"%s\" não é uma tabela, visão, visão materializada ou índice" +msgid "COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \\copy." +msgstr "COPY FROM instrui o processo servidor do PostgreSQL a ler um arquivo. Você pode querer um recurso do lado cliente, como \\copy do psql." -#: commands/tablecmds.c:4142 +#: commands/copyfrom.c:1703 commands/copyto.c:708 #, c-format -msgid "\"%s\" is not a table, materialized view, or index" -msgstr "\"%s\" não é uma tabela, visão materializada ou índice" +msgid "\"%s\" is a directory" +msgstr "\"%s\" é um diretório" -#: commands/tablecmds.c:4145 +#: commands/copyfrom.c:1771 commands/copyto.c:306 libpq/be-secure-common.c:83 #, c-format -msgid "\"%s\" is not a table or foreign table" -msgstr "\"%s\" não é uma tabela ou tabela externa" +msgid "could not close pipe to external command: %m" +msgstr "não foi possível fechar pipe para comando externo: %m" -#: commands/tablecmds.c:4148 +#: commands/copyfrom.c:1786 commands/copyto.c:311 #, c-format -msgid "\"%s\" is not a table, composite type, or foreign table" -msgstr "\"%s\" não é uma tabela, tipo composto ou tabela externa" +msgid "program \"%s\" failed" +msgstr "programa \"%s\" falhou" -#: commands/tablecmds.c:4151 +#: commands/copyfromparse.c:200 #, c-format -msgid "\"%s\" is not a table, materialized view, composite type, or foreign table" -msgstr "\"%s\" não é uma tabela, visão materializada, tipo composto ou tabela externa" +msgid "COPY file signature not recognized" +msgstr "assinatura de arquivo COPY desconhecida" -#: commands/tablecmds.c:4161 +#: commands/copyfromparse.c:205 #, c-format -msgid "\"%s\" is of the wrong type" -msgstr "\"%s\" é de um tipo incorreto" +msgid "invalid COPY file header (missing flags)" +msgstr "o cabeçalho do arquivo COPY não é válido (faltando sinalizadores)" -#: commands/tablecmds.c:4311 commands/tablecmds.c:4318 +#: commands/copyfromparse.c:209 #, c-format -msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" -msgstr "não pode alterar tipo \"%s\" porque coluna \"%s.%s\" utiliza-o" +msgid "invalid COPY file header (WITH OIDS)" +msgstr "cabeçalho de arquivo COPY inválido (COM OIDS)" -#: commands/tablecmds.c:4325 +#: commands/copyfromparse.c:214 #, c-format -msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" -msgstr "não pode alterar tabela externa \"%s\" porque coluna \"%s.%s\" utiliza seu tipo" +msgid "unrecognized critical flags in COPY file header" +msgstr "marcações críticas desconhecidas no cabeçalho do arquivo COPY" -#: commands/tablecmds.c:4332 +#: commands/copyfromparse.c:220 #, c-format -msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" -msgstr "não pode alterar tabela \"%s\" porque coluna \"%s.%s\" utiliza seu tipo" +msgid "invalid COPY file header (missing length)" +msgstr "o cabeçalho do arquivo COPY não é válido (faltando tamanho)" -#: commands/tablecmds.c:4394 +#: commands/copyfromparse.c:227 #, c-format -msgid "cannot alter type \"%s\" because it is the type of a typed table" -msgstr "não pode alterar tipo \"%s\" porque ele é um tipo de uma tabela tipada" +msgid "invalid COPY file header (wrong length)" +msgstr "o cabeçalho de arquivo COPY não é válido (tamanho incorreto)" -#: commands/tablecmds.c:4396 +#: commands/copyfromparse.c:256 #, c-format -msgid "Use ALTER ... CASCADE to alter the typed tables too." -msgstr "Utilize ALTER ... CASCADE para alterar as tabelas tipadas também." +msgid "could not read from COPY file: %m" +msgstr "não foi possível ler do arquivo de COPY: %m" -#: commands/tablecmds.c:4440 +#: commands/copyfromparse.c:278 commands/copyfromparse.c:303 +#: tcop/postgres.c:377 #, c-format -msgid "type %s is not a composite type" -msgstr "tipo %s não é um tipo composto" +msgid "unexpected EOF on client connection with an open transaction" +msgstr "EOF não esperado na conexão do cliente com uma transação aberta" -#: commands/tablecmds.c:4466 +#: commands/copyfromparse.c:294 #, c-format -msgid "cannot add column to typed table" -msgstr "não pode adicionar coluna a tabela tipada" +msgid "unexpected message type 0x%02X during COPY from stdin" +msgstr "tipo de mensagem inesperada 0x%02X durante COPY da entrada padrão" -#: commands/tablecmds.c:4528 commands/tablecmds.c:9727 +#: commands/copyfromparse.c:317 #, c-format -msgid "child table \"%s\" has different type for column \"%s\"" -msgstr "tabela descendente \"%s\" tem tipo diferente da coluna \"%s\"" +msgid "COPY from stdin failed: %s" +msgstr "COPY da entrada padrão falhou: %s" -#: commands/tablecmds.c:4534 commands/tablecmds.c:9734 +#: commands/copyfromparse.c:785 #, c-format -msgid "child table \"%s\" has different collation for column \"%s\"" -msgstr "tabela descendente \"%s\" tem ordenação diferente da coluna \"%s\"" +msgid "wrong number of fields in header line: got %d, expected %d" +msgstr "número errado de campos na linha do cabeçalho: obtido %d, esperado %d" -#: commands/tablecmds.c:4544 +#: commands/copyfromparse.c:801 #, c-format -msgid "child table \"%s\" has a conflicting \"%s\" column" -msgstr "tabela descendente \"%s\" tem uma coluna conflitante \"%s\"" +msgid "column name mismatch in header line field %d: got null value (\"%s\"), expected \"%s\"" +msgstr "" -#: commands/tablecmds.c:4556 +#: commands/copyfromparse.c:808 #, c-format -msgid "merging definition of column \"%s\" for child \"%s\"" -msgstr "juntando definição da coluna \"%s\" para tabela descendente \"%s\"" +msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" +msgstr "" -#: commands/tablecmds.c:4777 +#: commands/copyfromparse.c:892 commands/copyfromparse.c:1512 +#: commands/copyfromparse.c:1768 #, c-format -msgid "column must be added to child tables too" -msgstr "coluna deve ser adicionada as tabelas descendentes também" +msgid "extra data after last expected column" +msgstr "dado extra após última coluna esperada" -#: commands/tablecmds.c:4844 +#: commands/copyfromparse.c:906 #, c-format -msgid "column \"%s\" of relation \"%s\" already exists" -msgstr "coluna \"%s\" da relação \"%s\" já existe" +msgid "missing data for column \"%s\"" +msgstr "faltando dados da coluna \"%s\"" -#: commands/tablecmds.c:4948 commands/tablecmds.c:5043 -#: commands/tablecmds.c:5091 commands/tablecmds.c:5195 -#: commands/tablecmds.c:5242 commands/tablecmds.c:5326 -#: commands/tablecmds.c:7503 commands/tablecmds.c:8098 +#: commands/copyfromparse.c:999 #, c-format -msgid "cannot alter system column \"%s\"" -msgstr "não pode alterar coluna do sistema \"%s\"" +msgid "received copy data after EOF marker" +msgstr "dados do COPY recebidos após marcador EOF" -#: commands/tablecmds.c:4984 +#: commands/copyfromparse.c:1006 #, c-format -msgid "column \"%s\" is in a primary key" -msgstr "coluna \"%s\" está em uma chave primária" +msgid "row field count is %d, expected %d" +msgstr "a quantidade de campos da linha é %d, esperado %d" -#: commands/tablecmds.c:5142 +#: commands/copyfromparse.c:1294 commands/copyfromparse.c:1311 #, c-format -msgid "\"%s\" is not a table, materialized view, index, or foreign table" -msgstr "\"%s\" não é uma tabela, visão materializada, índice ou tabela externa" +msgid "literal carriage return found in data" +msgstr "retorno de carro foi encontrado em dados" -#: commands/tablecmds.c:5169 +#: commands/copyfromparse.c:1295 commands/copyfromparse.c:1312 #, c-format -msgid "statistics target %d is too low" -msgstr "valor da estatística %d é muito pequeno" +msgid "unquoted carriage return found in data" +msgstr "retorno de carros sem aspas foi encontrado em dados" -#: commands/tablecmds.c:5177 +#: commands/copyfromparse.c:1297 commands/copyfromparse.c:1314 #, c-format -msgid "lowering statistics target to %d" -msgstr "diminuindo valor da estatística para %d" +msgid "Use \"\\r\" to represent carriage return." +msgstr "Use \"\\r\" para representar retorno de carro." -#: commands/tablecmds.c:5307 +#: commands/copyfromparse.c:1298 commands/copyfromparse.c:1315 #, c-format -msgid "invalid storage type \"%s\"" -msgstr "tipo de armazenamento \"%s\" é inválido" +msgid "Use quoted CSV field to represent carriage return." +msgstr "Use campo entre aspas do CSV para representar retorno de carro." -#: commands/tablecmds.c:5338 +#: commands/copyfromparse.c:1327 #, c-format -msgid "column data type %s can only have storage PLAIN" -msgstr "tipo de dado da coluna %s só pode ter armazenamento PLAIN" +msgid "literal newline found in data" +msgstr "nova linha foi encontrada em dados" -#: commands/tablecmds.c:5372 +#: commands/copyfromparse.c:1328 #, c-format -msgid "cannot drop column from typed table" -msgstr "não pode apagar coluna de tabela tipada" +msgid "unquoted newline found in data" +msgstr "nova linha sem aspas foi encontrada em dados" -#: commands/tablecmds.c:5413 +#: commands/copyfromparse.c:1330 #, c-format -msgid "column \"%s\" of relation \"%s\" does not exist, skipping" -msgstr "coluna \"%s\" da relação \"%s\" não existe, ignorando" +msgid "Use \"\\n\" to represent newline." +msgstr "Use \"\\n\" para representar nova linha." -#: commands/tablecmds.c:5426 +#: commands/copyfromparse.c:1331 #, c-format -msgid "cannot drop system column \"%s\"" -msgstr "não pode remover coluna do sistema \"%s\"" +msgid "Use quoted CSV field to represent newline." +msgstr "Use campo entre aspas do CSV para representar nova linha." -#: commands/tablecmds.c:5433 +#: commands/copyfromparse.c:1377 commands/copyfromparse.c:1413 #, c-format -msgid "cannot drop inherited column \"%s\"" -msgstr "não pode remover coluna herdada \"%s\"" +msgid "end-of-copy marker does not match previous newline style" +msgstr "marcador de fim-de-cópia não corresponde com estilo de nova linha anterior" -#: commands/tablecmds.c:5663 +#: commands/copyfromparse.c:1386 commands/copyfromparse.c:1402 #, c-format -msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" -msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX renomeará índice \"%s\" para \"%s\"" +msgid "end-of-copy marker corrupt" +msgstr "marcador de fim-de-cópia corrompido" -#: commands/tablecmds.c:5866 +#: commands/copyfromparse.c:1704 commands/copyfromparse.c:1919 #, c-format -msgid "constraint must be added to child tables too" -msgstr "restrição deve ser adicionada as tabelas descendentes também" +msgid "unexpected default marker in COPY data" +msgstr "marcador padrão não esperado nos dados do COPY" -#: commands/tablecmds.c:5936 +#: commands/copyfromparse.c:1705 commands/copyfromparse.c:1920 #, c-format -msgid "referenced relation \"%s\" is not a table" -msgstr "relação referenciada \"%s\" não é uma tabela" +msgid "Column \"%s\" has no default value." +msgstr "A coluna \"%s\" não possui valor padrão." -#: commands/tablecmds.c:5959 +#: commands/copyfromparse.c:1852 #, c-format -msgid "constraints on permanent tables may reference only permanent tables" -msgstr "restrições em tabelas permanentes só podem referenciar tabelas permanentes" +msgid "unterminated CSV quoted field" +msgstr "campo entre aspas do CSV não foi terminado" -#: commands/tablecmds.c:5966 +#: commands/copyfromparse.c:1954 commands/copyfromparse.c:1973 #, c-format -msgid "constraints on unlogged tables may reference only permanent or unlogged tables" -msgstr "restrições em tabelas unlogged só podem referenciar tabelas permanentes ou unlogged" +msgid "unexpected EOF in COPY data" +msgstr "EOF não esperado em dados do COPY" -#: commands/tablecmds.c:5972 +#: commands/copyfromparse.c:1963 #, c-format -msgid "constraints on temporary tables may reference only temporary tables" -msgstr "restrições em tabelas temporárias só podem referenciar tabelas temporárias" +msgid "invalid field size" +msgstr "o tamanho de campo não é válido" -#: commands/tablecmds.c:5976 +#: commands/copyfromparse.c:1986 #, c-format -msgid "constraints on temporary tables must involve temporary tables of this session" -msgstr "restrições em tabelas temporárias devem envolver tabelas temporárias desta sessão" +msgid "incorrect binary data format" +msgstr "formato de dado binário incorreto" -#: commands/tablecmds.c:6037 +#: commands/copyto.c:236 #, c-format -msgid "number of referencing and referenced columns for foreign key disagree" -msgstr "número de colunas que referenciam e são referenciadas em um chave estrangeira não correspondem" +msgid "could not write to COPY program: %m" +msgstr "não foi possível escrever em programa COPY: %m" -#: commands/tablecmds.c:6144 +#: commands/copyto.c:241 #, c-format -msgid "foreign key constraint \"%s\" cannot be implemented" -msgstr "restrição de chave estrangeira \"%s\" não pode ser implementada" +msgid "could not write to COPY file: %m" +msgstr "não foi possível escrever em arquivo COPY: %m" -#: commands/tablecmds.c:6147 +#: commands/copyto.c:386 #, c-format -msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." -msgstr "Colunas chave \"%s\" e \"%s\" são de tipos incompatíveis: %s e %s." +msgid "cannot copy from view \"%s\"" +msgstr "não é possível copiar da visão \"%s\"" -#: commands/tablecmds.c:6347 commands/tablecmds.c:6470 -#: commands/tablecmds.c:7342 commands/tablecmds.c:7398 +#: commands/copyto.c:388 commands/copyto.c:394 commands/copyto.c:400 +#: commands/copyto.c:411 #, c-format -msgid "constraint \"%s\" of relation \"%s\" does not exist" -msgstr "restrição \"%s\" da relação \"%s\" não existe" +msgid "Try the COPY (SELECT ...) TO variant." +msgstr "Tente a variante COPY (SELECT ...) TO." -#: commands/tablecmds.c:6353 +#: commands/copyto.c:392 #, c-format -msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" -msgstr "restrição \"%s\" da relação \"%s\" não é uma restrição de chave estrangeira" +msgid "cannot copy from materialized view \"%s\"" +msgstr "não é possível copiar da visão materializada \"%s\"" -#: commands/tablecmds.c:6477 +#: commands/copyto.c:398 #, c-format -msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" -msgstr "restrição \"%s\" da relação \"%s\" não é uma restrição de chave estrangeira ou restrição de verificação" +msgid "cannot copy from foreign table \"%s\"" +msgstr "não é possível copiar da tabela estrangeira \"%s\"" -#: commands/tablecmds.c:6546 +#: commands/copyto.c:404 #, c-format -msgid "constraint must be validated on child tables too" -msgstr "restrição deve ser validada nas tabelas descendentes também" +msgid "cannot copy from sequence \"%s\"" +msgstr "não é possível copiar da sequência \"%s\"" -#: commands/tablecmds.c:6608 +#: commands/copyto.c:409 #, c-format -msgid "column \"%s\" referenced in foreign key constraint does not exist" -msgstr "coluna \"%s\" referenciada na restrição de chave estrangeira não existe" +msgid "cannot copy from partitioned table \"%s\"" +msgstr "não é possível copiar da tabela particionada \"%s\"" -#: commands/tablecmds.c:6613 +#: commands/copyto.c:415 #, c-format -msgid "cannot have more than %d keys in a foreign key" -msgstr "não pode ter mais do que %d chaves em uma chave estrangeira" +msgid "cannot copy from non-table relation \"%s\"" +msgstr "não é possível copiar da relação \"%s\" que não é uma tabela" -#: commands/tablecmds.c:6678 +#: commands/copyto.c:467 #, c-format -msgid "cannot use a deferrable primary key for referenced table \"%s\"" -msgstr "não pode utilizar uma chave primária postergável na tabela referenciada \"%s\"" +msgid "DO INSTEAD NOTHING rules are not supported for COPY" +msgstr "as regras DO INSTEAD NOTHING não têm suporte para COPY" -#: commands/tablecmds.c:6695 +#: commands/copyto.c:481 #, c-format -msgid "there is no primary key for referenced table \"%s\"" -msgstr "não há chave primária na tabela referenciada \"%s\"" +msgid "conditional DO INSTEAD rules are not supported for COPY" +msgstr "as regras DO INSTEAD condicionais não têm suporte para COPY" -#: commands/tablecmds.c:6760 +#: commands/copyto.c:485 #, c-format -msgid "foreign key referenced-columns list must not contain duplicates" -msgstr "lista de colunas referenciadas na chave estrangeira não deve conter duplicatas" +msgid "DO ALSO rules are not supported for the COPY" +msgstr "as regras DO ALSO não têm suporte para COPY" -#: commands/tablecmds.c:6854 +#: commands/copyto.c:490 #, c-format -msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" -msgstr "não pode utilizar uma restrição de unicidade postergável na tabela referenciada \"%s\"" +msgid "multi-statement DO INSTEAD rules are not supported for COPY" +msgstr "as regras DO INSTEAD de múltiplas instruções não têm suporte para COPY" -#: commands/tablecmds.c:6859 +#: commands/copyto.c:500 #, c-format -msgid "there is no unique constraint matching given keys for referenced table \"%s\"" -msgstr "não há restrição de unicidade que corresponde com as colunas informadas na tabela referenciada \"%s\"" +msgid "COPY (SELECT INTO) is not supported" +msgstr "COPY (SELECT INTO) não é suportado" -#: commands/tablecmds.c:7018 +#: commands/copyto.c:517 #, c-format -msgid "validating foreign key constraint \"%s\"" -msgstr "validando restrição de chave estrangeira \"%s\"" +msgid "COPY query must have a RETURNING clause" +msgstr "a consulta de COPY deve ter uma cláusula RETURNING" -#: commands/tablecmds.c:7314 +#: commands/copyto.c:546 #, c-format -msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" -msgstr "não pode remover restrição herdada \"%s\" da relação \"%s\"" +msgid "relation referenced by COPY statement has changed" +msgstr "a relação referenciada pela instrução COPY foi alterada" -#: commands/tablecmds.c:7348 +#: commands/copyto.c:605 #, c-format -msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" -msgstr "restrição \"%s\" da relação \"%s\" não existe, ignorando" +msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" +msgstr "coluna FORCE_QUOTE \"%s\" não referenciada por COPY" -#: commands/tablecmds.c:7487 +#: commands/copyto.c:673 #, c-format -msgid "cannot alter column type of typed table" -msgstr "não pode alterar tipo de coluna de tabela tipada" +msgid "relative path not allowed for COPY to file" +msgstr "caminho relativo não é permitido pelo COPY para arquivo" -#: commands/tablecmds.c:7510 +#: commands/copyto.c:692 #, c-format -msgid "cannot alter inherited column \"%s\"" -msgstr "não pode alterar coluna herdada \"%s\"" +msgid "could not open file \"%s\" for writing: %m" +msgstr "não foi possível abrir o arquivo \"%s\" para escrita: %m" -#: commands/tablecmds.c:7557 +#: commands/copyto.c:695 #, c-format -msgid "transform expression must not return a set" -msgstr "expressão de transformação não deve retornar um conjunto" +msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." +msgstr "COPY TO instrui o processo servidor do PostgreSQL a escrever em um arquivo. Você pode querer um recurso do lado cliente, como o \\copy do psql." -#: commands/tablecmds.c:7576 +#: commands/createas.c:215 commands/createas.c:523 #, c-format -msgid "column \"%s\" cannot be cast automatically to type %s" -msgstr "coluna \"%s\" não pode ser convertida automaticamente para tipo %s" +msgid "too many column names were specified" +msgstr "muitos nomes de coluna foram especificados" -#: commands/tablecmds.c:7578 +#: commands/createas.c:546 #, c-format -msgid "Specify a USING expression to perform the conversion." -msgstr "Especifique uma expressão USING para realizar a conversão." +msgid "policies not yet implemented for this command" +msgstr "as políticas ainda não estão implementadas para esse comando" -#: commands/tablecmds.c:7627 +#: commands/dbcommands.c:822 #, c-format -msgid "type of inherited column \"%s\" must be changed in child tables too" -msgstr "tipo de coluna herdada \"%s\" deve ser alterado nas tabelas descendentes também" +msgid "LOCATION is not supported anymore" +msgstr "LOCATION não é mais suportado" -#: commands/tablecmds.c:7708 +#: commands/dbcommands.c:823 #, c-format -msgid "cannot alter type of column \"%s\" twice" -msgstr "não pode alterar tipo de coluna \"%s\" duas vezes" +msgid "Consider using tablespaces instead." +msgstr "Considere utilizar um espaço de tabelas em vez disso." -#: commands/tablecmds.c:7744 +#: commands/dbcommands.c:848 #, c-format -msgid "default for column \"%s\" cannot be cast automatically to type %s" -msgstr "valor padrão para coluna \"%s\" não pode ser convertido automaticamente para tipo %s" +msgid "OIDs less than %u are reserved for system objects" +msgstr "OIDs menores que %u são reservados para objetos do sistema" -#: commands/tablecmds.c:7870 +#: commands/dbcommands.c:879 utils/adt/ascii.c:146 #, c-format -msgid "cannot alter type of a column used by a view or rule" -msgstr "não pode alterar tipo de uma coluna utilizada por uma visão ou regra" +msgid "%d is not a valid encoding code" +msgstr "%d não é um código de codificação válido" -#: commands/tablecmds.c:7871 commands/tablecmds.c:7890 +#: commands/dbcommands.c:890 utils/adt/ascii.c:128 #, c-format -msgid "%s depends on column \"%s\"" -msgstr "%s depende da coluna \"%s\"" +msgid "%s is not a valid encoding name" +msgstr "%s não é um nome de codificação válido" -#: commands/tablecmds.c:7889 +#: commands/dbcommands.c:919 #, c-format -msgid "cannot alter type of a column used in a trigger definition" -msgstr "não pode alterar tipo de uma coluna utilizada em uma definição de gatilho" +msgid "unrecognized locale provider: %s" +msgstr "provedor de configuração regional é desconhecido: %s" -#: commands/tablecmds.c:8465 +#: commands/dbcommands.c:932 commands/dbcommands.c:2351 commands/user.c:300 +#: commands/user.c:740 #, c-format -msgid "cannot change owner of index \"%s\"" -msgstr "não pode mudar dono do índice \"%s\"" +msgid "invalid connection limit: %d" +msgstr "o limite de conexão não é válido: %d" -#: commands/tablecmds.c:8467 +#: commands/dbcommands.c:953 #, c-format -msgid "Change the ownership of the index's table, instead." -msgstr "Ao invés disso, mude o dono da tabela do índice." +msgid "permission denied to create database" +msgstr "permissão negada ao criar banco de dados" -#: commands/tablecmds.c:8483 +#: commands/dbcommands.c:977 #, c-format -msgid "cannot change owner of sequence \"%s\"" -msgstr "não pode mudar dono da sequência \"%s\"" +msgid "template database \"%s\" does not exist" +msgstr "banco de dados modelo \"%s\" não existe" -#: commands/tablecmds.c:8485 commands/tablecmds.c:10644 +#: commands/dbcommands.c:987 #, c-format -msgid "Sequence \"%s\" is linked to table \"%s\"." -msgstr "Sequência \"%s\" está ligada a tabela \"%s\"." +msgid "cannot use invalid database \"%s\" as template" +msgstr "não é possível usar o banco de dados inválido \"%s\" como modelo" -#: commands/tablecmds.c:8497 commands/tablecmds.c:11280 +#: commands/dbcommands.c:988 commands/dbcommands.c:2380 +#: utils/init/postinit.c:1100 #, c-format -msgid "Use ALTER TYPE instead." -msgstr "Ao invés disso utilize ALTER TYPE." +msgid "Use DROP DATABASE to drop invalid databases." +msgstr "Use DROP DATABASE para remover bancos de dados inválidos." -#: commands/tablecmds.c:8506 +#: commands/dbcommands.c:999 #, c-format -msgid "\"%s\" is not a table, view, sequence, or foreign table" -msgstr "\"%s\" não é uma tabela, visão, sequência ou tabela externa" +msgid "permission denied to copy database \"%s\"" +msgstr "permissão negada ao copiar banco de dados \"%s\"" -#: commands/tablecmds.c:8842 +#: commands/dbcommands.c:1016 #, c-format -msgid "cannot have multiple SET TABLESPACE subcommands" -msgstr "não pode ter múltiplos subcomandos SET TABLESPACE" +msgid "invalid create database strategy \"%s\"" +msgstr "estratégia de criação de banco de dados inválida \"%s\"" -#: commands/tablecmds.c:8915 +#: commands/dbcommands.c:1017 #, c-format -msgid "\"%s\" is not a table, view, materialized view, index, or TOAST table" -msgstr "\"%s\" não é uma tabela, visão, visão materializada, índice ou tabela TOAST" +msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgstr "As estratégias válidas são \"wal_log\" e \"file_copy\"." -#: commands/tablecmds.c:8948 commands/view.c:474 +#: commands/dbcommands.c:1043 #, c-format -msgid "WITH CHECK OPTION is supported only on automatically updatable views" -msgstr "WITH CHECK OPTION só é suportado em visões automaticamente atualizáveis" +msgid "invalid server encoding %d" +msgstr "codificação do servidor %d é inválida" -#: commands/tablecmds.c:9094 +#: commands/dbcommands.c:1049 #, c-format -msgid "cannot move system relation \"%s\"" -msgstr "não pode mover relação do sistema \"%s\"" +msgid "invalid LC_COLLATE locale name: \"%s\"" +msgstr "nome de localidade LC_COLLATE inválido: \"%s\"" -#: commands/tablecmds.c:9110 +#: commands/dbcommands.c:1050 commands/dbcommands.c:1056 #, c-format -msgid "cannot move temporary tables of other sessions" -msgstr "não pode mover tabelas temporárias de outras sessões" +msgid "If the locale name is specific to ICU, use ICU_LOCALE." +msgstr "" -#: commands/tablecmds.c:9238 +#: commands/dbcommands.c:1055 #, c-format -msgid "only tables, indexes, and materialized views exist in tablespaces" -msgstr "somente tabelas, índices e visões materializadas existem em tablespaces" +msgid "invalid LC_CTYPE locale name: \"%s\"" +msgstr "nome de localidade LC_CTYPE inválido: \"%s\"" -#: commands/tablecmds.c:9250 +#: commands/dbcommands.c:1066 #, c-format -msgid "cannot move relations in to or out of pg_global tablespace" -msgstr "não pode mover relações para ou da tablespace pg_global" +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "a codificação \"%s\" não tem suporte pelo provedor ICU" -#: commands/tablecmds.c:9341 +#: commands/dbcommands.c:1076 #, c-format -msgid "aborting because lock on relation \"%s\".\"%s\" is not available" -msgstr "interrompendo porque bloqueio em relação \"%s\".\"%s\" não está disponível" +msgid "LOCALE or ICU_LOCALE must be specified" +msgstr "é necessário ser especificado LOCALE ou ICU_LOCALE" -#: commands/tablecmds.c:9357 +#: commands/dbcommands.c:1105 #, c-format -msgid "no matching relations in tablespace \"%s\" found" -msgstr "nenhuma relação correspondente na tablespace \"%s\" foi encontrada" +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "A localidade ICU não pode ser especificada, a menos que o provedor de localidade seja ICU" -#: commands/tablecmds.c:9418 storage/buffer/bufmgr.c:501 +#: commands/dbcommands.c:1128 #, c-format -msgid "invalid page in block %u of relation %s" -msgstr "página é inválida no bloco %u da relação %s" +msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" +msgstr "nova codificação (%s) é imcompatível com a codificação do banco de dados modelo (%s)" -#: commands/tablecmds.c:9500 +#: commands/dbcommands.c:1131 #, c-format -msgid "cannot change inheritance of typed table" -msgstr "não pode mudar herança de tabela tipada" +msgid "Use the same encoding as in the template database, or use template0 as template." +msgstr "Use a mesma codificação do banco de dados modelo ou use template0 como modelo." -#: commands/tablecmds.c:9546 +#: commands/dbcommands.c:1136 #, c-format -msgid "cannot inherit to temporary relation of another session" -msgstr "não pode herdar a tabela temporária de outra sessão" +msgid "new collation (%s) is incompatible with the collation of the template database (%s)" +msgstr "nova ordenação (%s) é incompatível com a ordenação do banco de dados modelo (%s)" -#: commands/tablecmds.c:9600 +#: commands/dbcommands.c:1138 #, c-format -msgid "circular inheritance not allowed" -msgstr "herança circular não é permitida" +msgid "Use the same collation as in the template database, or use template0 as template." +msgstr "Use a mesma ordenação do banco de dados modelo ou use template0 como modelo." -#: commands/tablecmds.c:9601 +#: commands/dbcommands.c:1143 #, c-format -msgid "\"%s\" is already a child of \"%s\"." -msgstr "\"%s\" já é um descendente de \"%s\"." +msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" +msgstr "novo LC_CTYPE (%s) é incompatível com o LC_CTYPE do banco de dados modelo (%s)" -#: commands/tablecmds.c:9609 +#: commands/dbcommands.c:1145 #, c-format -msgid "table \"%s\" without OIDs cannot inherit from table \"%s\" with OIDs" -msgstr "tabela \"%s\" sem OIDs não pode herdar de tabela \"%s\" com OIDs" +msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." +msgstr "Use o mesmo LC_CTYPE do banco de dados modelo ou use template0 como modelo." -#: commands/tablecmds.c:9745 +#: commands/dbcommands.c:1150 #, c-format -msgid "column \"%s\" in child table must be marked NOT NULL" -msgstr "coluna \"%s\" na tabela descendente deve ser definida como NOT NULL" +msgid "new locale provider (%s) does not match locale provider of the template database (%s)" +msgstr "o novo provedor de localidade (%s) não corresponde ao provedor de localidade do banco de dados modelo (%s)" -#: commands/tablecmds.c:9761 +#: commands/dbcommands.c:1152 #, c-format -msgid "child table is missing column \"%s\"" -msgstr "tabela descendente está faltando coluna \"%s\"" +msgid "Use the same locale provider as in the template database, or use template0 as template." +msgstr "Use o mesmo provedor de localidade do banco de dados modelo, ou use template0 como modelo." -#: commands/tablecmds.c:9844 +#: commands/dbcommands.c:1164 #, c-format -msgid "child table \"%s\" has different definition for check constraint \"%s\"" -msgstr "tabela descendente \"%s\" tem definição diferente para restrição de verificação \"%s\"" +msgid "new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)" +msgstr "a nova localidade ICU (%s) é incompatível com a localidade ICU do banco de dados modelo (%s)" -#: commands/tablecmds.c:9852 +#: commands/dbcommands.c:1166 #, c-format -msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" -msgstr "restrição \"%s\" conflita com restrição não herdada na tabela descendente \"%s\"" +msgid "Use the same ICU locale as in the template database, or use template0 as template." +msgstr "Use o mesmo código de localidade ICU do banco de dados modelo, ou use template0 como modelo." -#: commands/tablecmds.c:9876 +#: commands/dbcommands.c:1177 #, c-format -msgid "child table is missing constraint \"%s\"" -msgstr "tabela descendente está faltando restrição \"%s\"" +msgid "new ICU collation rules (%s) are incompatible with the ICU collation rules of the template database (%s)" +msgstr "as novas regras de ordenação ICU (%s) são incompatíveis com as regras de ordenação ICU do banco de dados modelo (%s)" -#: commands/tablecmds.c:9956 +#: commands/dbcommands.c:1179 #, c-format -msgid "relation \"%s\" is not a parent of relation \"%s\"" -msgstr "relação \"%s\" não é um ancestral da relação \"%s\"" +msgid "Use the same ICU collation rules as in the template database, or use template0 as template." +msgstr "Use as mesmas regras de ordenação ICU do banco de dados modelo, ou use template0 como modelo." -#: commands/tablecmds.c:10182 +#: commands/dbcommands.c:1202 #, c-format -msgid "typed tables cannot inherit" -msgstr "tabelas tipadas não podem herdar" +msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" +msgstr "" -#: commands/tablecmds.c:10213 +#: commands/dbcommands.c:1207 #, c-format -msgid "table is missing column \"%s\"" -msgstr "tabela está faltando coluna \"%s\"" +msgid "template database \"%s\" has a collation version mismatch" +msgstr "o banco de dados modelo \"%s\" tem uma incompatibilidade de versão de ordenação" -#: commands/tablecmds.c:10223 +#: commands/dbcommands.c:1209 #, c-format -msgid "table has column \"%s\" where type requires \"%s\"" -msgstr "tabela tem coluna \"%s\" onde tipo requer \"%s\"" +msgid "The template database was created using collation version %s, but the operating system provides version %s." +msgstr "" -#: commands/tablecmds.c:10232 +#: commands/dbcommands.c:1212 #, c-format -msgid "table \"%s\" has different type for column \"%s\"" -msgstr "tabela \"%s\" tem tipo diferente para coluna \"%s\"" +msgid "Rebuild all objects in the template database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." +msgstr "" -#: commands/tablecmds.c:10245 +#: commands/dbcommands.c:1248 commands/dbcommands.c:1980 #, c-format -msgid "table has extra column \"%s\"" -msgstr "tabela tem coluna extra \"%s\"" +msgid "pg_global cannot be used as default tablespace" +msgstr "pg_global não pode ser utilizado como espaço de tabelas padrão" -#: commands/tablecmds.c:10295 +#: commands/dbcommands.c:1274 #, c-format -msgid "\"%s\" is not a typed table" -msgstr "\"%s\" não é uma tabela tipada" +msgid "cannot assign new default tablespace \"%s\"" +msgstr "não é possível atribuir novo espaço de tabelas padrão \"%s\"" -#: commands/tablecmds.c:10478 +#: commands/dbcommands.c:1276 #, c-format -msgid "cannot use non-unique index \"%s\" as replica identity" -msgstr "não pode utilizar índice não único \"%s\" como identidade da réplica" +msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." +msgstr "Há um conflito, porque o banco de dados \"%s\" já tem algumas tabelas nesse espaço de tabelas." -#: commands/tablecmds.c:10484 +#: commands/dbcommands.c:1306 commands/dbcommands.c:1853 #, c-format -msgid "cannot use non-immediate index \"%s\" as replica identity" -msgstr "não pode utilizar índice não imediato \"%s\" como identidade da réplica" +msgid "database \"%s\" already exists" +msgstr "o banco de dados \"%s\" já existe" -#: commands/tablecmds.c:10490 +#: commands/dbcommands.c:1320 #, c-format -msgid "cannot use expression index \"%s\" as replica identity" -msgstr "não pode utilizar índice de expressão \"%s\" como identidade da réplica" +msgid "source database \"%s\" is being accessed by other users" +msgstr "banco de dados fonte \"%s\" está sendo acessado por outros usuários" -#: commands/tablecmds.c:10496 +#: commands/dbcommands.c:1342 #, c-format -msgid "cannot use partial index \"%s\" as replica identity" -msgstr "não pode utilizar índice parcial \"%s\" como identidade da réplica" +msgid "database OID %u is already in use by database \"%s\"" +msgstr "o OID do banco de dados %u já está em uso pelo banco de dados \"%s\"" -#: commands/tablecmds.c:10502 +#: commands/dbcommands.c:1348 #, c-format -msgid "cannot use invalid index \"%s\" as replica identity" -msgstr "não pode utilizar índice inválido \"%s\" como identidade da réplica" +msgid "data directory with the specified OID %u already exists" +msgstr "" -#: commands/tablecmds.c:10520 +#: commands/dbcommands.c:1520 commands/dbcommands.c:1535 #, c-format -msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" -msgstr "índice \"%s\" não pode ser utilizado como identidade da réplica porque coluna \"%s\" contém valores nulos" +msgid "encoding \"%s\" does not match locale \"%s\"" +msgstr "codificação \"%s\" não corresponde a configuração regional \"%s\"" -#: commands/tablecmds.c:10643 +#: commands/dbcommands.c:1523 #, c-format -msgid "cannot move an owned sequence into another schema" -msgstr "não pode mover uma sequência ligada para outro esquema" +msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." +msgstr "A definição de LC_TYPE escolhida requer codificação \"%s\"." -#: commands/tablecmds.c:10739 +#: commands/dbcommands.c:1538 #, c-format -msgid "relation \"%s\" already exists in schema \"%s\"" -msgstr "relação \"%s\" já existe no esquema \"%s\"" +msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." +msgstr "A definição de LC_COLLATE escolhida requer codificação \"%s\"." -#: commands/tablecmds.c:11264 +#: commands/dbcommands.c:1619 #, c-format -msgid "\"%s\" is not a composite type" -msgstr "\"%s\" não é um tipo composto" +msgid "database \"%s\" does not exist, skipping" +msgstr "banco de dados \"%s\" não existe, ignorando" -#: commands/tablecmds.c:11294 +#: commands/dbcommands.c:1643 #, c-format -msgid "\"%s\" is not a table, view, materialized view, sequence, or foreign table" -msgstr "\"%s\" não é uma tabela, visão, visão materializada, sequência ou tabela externa" +msgid "cannot drop a template database" +msgstr "não é possível remover banco de dados modelo" -#: commands/tablespace.c:160 commands/tablespace.c:177 -#: commands/tablespace.c:188 commands/tablespace.c:196 -#: commands/tablespace.c:623 replication/slot.c:930 storage/file/copydir.c:47 +#: commands/dbcommands.c:1649 #, c-format -msgid "could not create directory \"%s\": %m" -msgstr "não pôde criar diretório \"%s\": %m" +msgid "cannot drop the currently open database" +msgstr "não é possível remover banco de dados que se encontra aberto" -#: commands/tablespace.c:207 +#: commands/dbcommands.c:1662 #, c-format -msgid "could not stat directory \"%s\": %m" -msgstr "não pôde executar stat no diretório \"%s\": %m" +msgid "database \"%s\" is used by an active logical replication slot" +msgstr "o banco de dados \"%s\" é usado por um encaixe de replicação lógica ativo" -#: commands/tablespace.c:216 +#: commands/dbcommands.c:1664 #, c-format -msgid "\"%s\" exists but is not a directory" -msgstr "\"%s\" existe mas não é um diretório" +msgid "There is %d active slot." +msgid_plural "There are %d active slots." +msgstr[0] "Há %d encaixe ativo." +msgstr[1] "Há %d encaixes ativos." -#: commands/tablespace.c:247 +#: commands/dbcommands.c:1678 #, c-format -msgid "permission denied to create tablespace \"%s\"" -msgstr "permissão negada ao criar tablespace \"%s\"" +msgid "database \"%s\" is being used by logical replication subscription" +msgstr "o banco de dados \"%s\" está sendo usado por subscrição de replicação lógica" -#: commands/tablespace.c:249 +#: commands/dbcommands.c:1680 #, c-format -msgid "Must be superuser to create a tablespace." -msgstr "Deve ser super-usuário para criar uma tablespace." +msgid "There is %d subscription." +msgid_plural "There are %d subscriptions." +msgstr[0] "Há %d subscrição." +msgstr[1] "Há %d subscrições." -#: commands/tablespace.c:265 +#: commands/dbcommands.c:1701 commands/dbcommands.c:1875 +#: commands/dbcommands.c:2002 #, c-format -msgid "tablespace location cannot contain single quotes" -msgstr "local da tablespace não pode conter aspas simples" +msgid "database \"%s\" is being accessed by other users" +msgstr "banco de dados \"%s\" está sendo acessado por outros usuários" -#: commands/tablespace.c:275 +#: commands/dbcommands.c:1835 #, c-format -msgid "tablespace location must be an absolute path" -msgstr "local da tablespace deve ser um caminho absoluto" +msgid "permission denied to rename database" +msgstr "permissão negada ao renomear banco de dados" -#: commands/tablespace.c:286 +#: commands/dbcommands.c:1864 #, c-format -msgid "tablespace location \"%s\" is too long" -msgstr "local da tablespace \"%s\" é muito longo" +msgid "current database cannot be renamed" +msgstr "banco de dados atual não pode ser renomeado" -#: commands/tablespace.c:296 commands/tablespace.c:894 +#: commands/dbcommands.c:1958 #, c-format -msgid "unacceptable tablespace name \"%s\"" -msgstr "nome da tablespace \"%s\" é inaceitável" +msgid "cannot change the tablespace of the currently open database" +msgstr "não é possível mudar o espaço de tabelas de um banco de dados que se encontra aberto" -#: commands/tablespace.c:298 commands/tablespace.c:895 +#: commands/dbcommands.c:2064 #, c-format -msgid "The prefix \"pg_\" is reserved for system tablespaces." -msgstr "O prefixo \"pg_\" é reservado para tablespaces do sistema." +msgid "some relations of database \"%s\" are already in tablespace \"%s\"" +msgstr "algumas relações do banco de dados \"%s\" já estão na espaço de tabelas \"%s\"" -#: commands/tablespace.c:308 commands/tablespace.c:907 +#: commands/dbcommands.c:2066 #, c-format -msgid "tablespace \"%s\" already exists" -msgstr "tablespace \"%s\" já existe" +msgid "You must move them back to the database's default tablespace before using this command." +msgstr "Você deve movê-las de volta para a espaço de tabelas padrão do banco de dados antes de utilizar este comando." -#: commands/tablespace.c:386 commands/tablespace.c:551 -#: replication/basebackup.c:222 replication/basebackup.c:1064 -#: utils/adt/misc.c:365 +#: commands/dbcommands.c:2193 commands/dbcommands.c:2909 +#: commands/dbcommands.c:3209 commands/dbcommands.c:3322 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "tablespaces não são suportadas nesta plataforma" +msgid "some useless files may be left behind in old database directory \"%s\"" +msgstr "alguns arquivos inúteis podem ser deixados no diretório de banco de dados antigo \"%s\"" -#: commands/tablespace.c:426 commands/tablespace.c:877 -#: commands/tablespace.c:956 commands/tablespace.c:1025 -#: commands/tablespace.c:1158 commands/tablespace.c:1358 +#: commands/dbcommands.c:2254 #, c-format -msgid "tablespace \"%s\" does not exist" -msgstr "tablespace \"%s\" não existe" +msgid "unrecognized DROP DATABASE option \"%s\"" +msgstr "opção de DROP DATABASE não reconhecida \"%s\"" -#: commands/tablespace.c:432 +#: commands/dbcommands.c:2332 #, c-format -msgid "tablespace \"%s\" does not exist, skipping" -msgstr "tablespace \"%s\" não existe, ignorando" +msgid "option \"%s\" cannot be specified with other options" +msgstr "a opção \"%s\" não pode ser especificada com outras opções" -#: commands/tablespace.c:508 +#: commands/dbcommands.c:2379 #, c-format -msgid "tablespace \"%s\" is not empty" -msgstr "tablespace \"%s\" não está vazia" +msgid "cannot alter invalid database \"%s\"" +msgstr "não é possível alterar banco de dados inválido \"%s\"" -#: commands/tablespace.c:582 +#: commands/dbcommands.c:2396 #, c-format -msgid "directory \"%s\" does not exist" -msgstr "diretório \"%s\" não existe" +msgid "cannot disallow connections for current database" +msgstr "não é possível proibir conexões para o banco de dados corrente" -#: commands/tablespace.c:583 +#: commands/dbcommands.c:2611 #, c-format -msgid "Create this directory for the tablespace before restarting the server." -msgstr "Crie este diretório para a tablespace antes de reiniciar o servidor." +msgid "permission denied to change owner of database" +msgstr "permissão negada ao mudar o dono do banco de dados" -#: commands/tablespace.c:588 +#: commands/dbcommands.c:3015 #, c-format -msgid "could not set permissions on directory \"%s\": %m" -msgstr "não pôde definir permissões do diretório \"%s\": %m" +msgid "There are %d other session(s) and %d prepared transaction(s) using the database." +msgstr "Há %d outra(s) sessão(ões) e %d transação(ões) preparada(s) usando o banco de dados." -#: commands/tablespace.c:618 +#: commands/dbcommands.c:3018 #, c-format -msgid "directory \"%s\" already in use as a tablespace" -msgstr "diretório \"%s\" já está em uso como uma tablespace" +msgid "There is %d other session using the database." +msgid_plural "There are %d other sessions using the database." +msgstr[0] "Há %d outra sessão usando o banco de dados." +msgstr[1] "Há %d outras sessões usando o banco de dados." -#: commands/tablespace.c:642 commands/tablespace.c:764 -#: commands/tablespace.c:777 commands/tablespace.c:801 +#: commands/dbcommands.c:3023 storage/ipc/procarray.c:3797 #, c-format -msgid "could not remove directory \"%s\": %m" -msgstr "não pôde remover diretório \"%s\": %m" +msgid "There is %d prepared transaction using the database." +msgid_plural "There are %d prepared transactions using the database." +msgstr[0] "Há %d transação preparada usando o banco de dados." +msgstr[1] "Há %d transações preparadas usando o banco de dados." -#: commands/tablespace.c:650 commands/tablespace.c:812 +#: commands/dbcommands.c:3165 #, c-format -msgid "could not remove symbolic link \"%s\": %m" -msgstr "não pôde remover link simbólico \"%s\": %m" +msgid "missing directory \"%s\"" +msgstr "diretório ausente \"%s\"" -#: commands/tablespace.c:661 +#: commands/dbcommands.c:3223 commands/tablespace.c:190 +#: commands/tablespace.c:639 #, c-format -msgid "could not create symbolic link \"%s\": %m" -msgstr "não pôde criar link simbólico \"%s\": %m" +msgid "could not stat directory \"%s\": %m" +msgstr "não foi possível executar stat no diretório \"%s\": %m" -#: commands/tablespace.c:725 commands/tablespace.c:735 -#: postmaster/postmaster.c:1284 replication/basebackup.c:349 -#: replication/basebackup.c:667 storage/file/copydir.c:53 -#: storage/file/copydir.c:96 storage/file/fd.c:1951 storage/ipc/dsm.c:300 -#: utils/adt/genfile.c:354 utils/adt/misc.c:267 utils/misc/tzparser.c:339 +#: commands/define.c:54 commands/define.c:258 commands/define.c:290 +#: commands/define.c:318 commands/define.c:364 #, c-format -msgid "could not open directory \"%s\": %m" -msgstr "não pôde abrir diretório \"%s\": %m" +msgid "%s requires a parameter" +msgstr "%s requer um parâmetro" -#: commands/tablespace.c:1030 +#: commands/define.c:87 commands/define.c:98 commands/define.c:192 +#: commands/define.c:210 commands/define.c:225 commands/define.c:243 #, c-format -msgid "Tablespace \"%s\" does not exist." -msgstr "Tablespace \"%s\" não existe." +msgid "%s requires a numeric value" +msgstr "%s requer um valor numérico" -#: commands/tablespace.c:1457 +#: commands/define.c:154 #, c-format -msgid "directories for tablespace %u could not be removed" -msgstr "diretórios para tablespace %u não puderam ser removidos" +msgid "%s requires a Boolean value" +msgstr "%s requer um valor Booleano" -#: commands/tablespace.c:1459 +#: commands/define.c:168 commands/define.c:177 commands/define.c:327 #, c-format -msgid "You can remove the directories manually if necessary." -msgstr "Você pode remover os diretórios manualmente se necessário." +msgid "%s requires an integer value" +msgstr "%s requer um valor inteiro" -#: commands/trigger.c:175 +#: commands/define.c:272 #, c-format -msgid "\"%s\" is a table" -msgstr "\"%s\" é uma tabela" +msgid "argument of %s must be a name" +msgstr "argumento de %s deve ser um nome" -#: commands/trigger.c:177 +#: commands/define.c:302 #, c-format -msgid "Tables cannot have INSTEAD OF triggers." -msgstr "Tabelas não podem ter gatilhos INSTEAD OF." +msgid "argument of %s must be a type name" +msgstr "argumento de %s deve ser um nome de um tipo" -#: commands/trigger.c:188 commands/trigger.c:195 +#: commands/define.c:348 #, c-format -msgid "\"%s\" is a view" -msgstr "\"%s\" é uma visão" +msgid "invalid argument for %s: \"%s\"" +msgstr "o argumento não é válido para %s: \"%s\"" -#: commands/trigger.c:190 +#: commands/dropcmds.c:101 commands/functioncmds.c:1387 +#: utils/adt/ruleutils.c:2897 #, c-format -msgid "Views cannot have row-level BEFORE or AFTER triggers." -msgstr "Visões não podem ter gatilhos BEFORE ou AFTER a nível de registro." +msgid "\"%s\" is an aggregate function" +msgstr "\"%s\" é uma função de agregação" -#: commands/trigger.c:197 +#: commands/dropcmds.c:103 #, c-format -msgid "Views cannot have TRUNCATE triggers." -msgstr "Visões não podem ter gatilhos TRUNCATE." +msgid "Use DROP AGGREGATE to drop aggregate functions." +msgstr "Use DROP AGGREGATE para remover funções de agregação." -#: commands/trigger.c:205 commands/trigger.c:212 commands/trigger.c:219 +#: commands/dropcmds.c:158 commands/sequence.c:474 commands/tablecmds.c:3710 +#: commands/tablecmds.c:3868 commands/tablecmds.c:3920 +#: commands/tablecmds.c:16474 tcop/utility.c:1336 #, c-format -msgid "\"%s\" is a foreign table" -msgstr "\"%s\" é uma tabela externa" +msgid "relation \"%s\" does not exist, skipping" +msgstr "relação \"%s\" não existe, ignorando" -#: commands/trigger.c:207 +#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1285 #, c-format -msgid "Foreign tables cannot have INSTEAD OF triggers." -msgstr "Tabelas externas não podem ter gatilhos INSTEAD OF." +msgid "schema \"%s\" does not exist, skipping" +msgstr "esquema \"%s\" não existe, ignorando" -#: commands/trigger.c:214 +#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:277 #, c-format -msgid "Foreign tables cannot have TRUNCATE triggers." -msgstr "Tabelas externas não podem ter gatilhos TRUNCATE." +msgid "type \"%s\" does not exist, skipping" +msgstr "tipo \"%s\" não existe, ignorando" -#: commands/trigger.c:221 +#: commands/dropcmds.c:257 #, c-format -msgid "Foreign tables cannot have constraint triggers." -msgstr "Tabelas externas não podem ter gatilhos de restrição." +msgid "access method \"%s\" does not exist, skipping" +msgstr "o método de acesso \"%s\" não existe, ignorando" -#: commands/trigger.c:284 +#: commands/dropcmds.c:275 #, c-format -msgid "TRUNCATE FOR EACH ROW triggers are not supported" -msgstr "gatilhos TRUNCATE FOR EACH ROW não são suportados" +msgid "collation \"%s\" does not exist, skipping" +msgstr "ordenação \"%s\" não existe, ignorando" -#: commands/trigger.c:292 +#: commands/dropcmds.c:282 #, c-format -msgid "INSTEAD OF triggers must be FOR EACH ROW" -msgstr "gatilhos INSTEAD OF devem ser FOR EACH ROW" +msgid "conversion \"%s\" does not exist, skipping" +msgstr "conversão \"%s\" não existe, ignorando" -#: commands/trigger.c:296 +#: commands/dropcmds.c:293 commands/statscmds.c:654 #, c-format -msgid "INSTEAD OF triggers cannot have WHEN conditions" -msgstr "gatilhos INSTEAD OF não podem ter condições WHEN" +msgid "statistics object \"%s\" does not exist, skipping" +msgstr "o objeto de estatísticas \"%s\" não existe, ignorando" -#: commands/trigger.c:300 +#: commands/dropcmds.c:300 #, c-format -msgid "INSTEAD OF triggers cannot have column lists" -msgstr "gatilhos INSTEAD OF não podem ter listas de colunas" +msgid "text search parser \"%s\" does not exist, skipping" +msgstr "o analisador de procura de texto completo \"%s\" não existe, ignorando" -#: commands/trigger.c:359 commands/trigger.c:372 +#: commands/dropcmds.c:307 #, c-format -msgid "statement trigger's WHEN condition cannot reference column values" -msgstr "condição WHEN de gatilho de comando não pode referenciar valores de coluna" +msgid "text search dictionary \"%s\" does not exist, skipping" +msgstr "o dicionário de procura de texto completo \"%s\" não existe, ignorando" -#: commands/trigger.c:364 +#: commands/dropcmds.c:314 #, c-format -msgid "INSERT trigger's WHEN condition cannot reference OLD values" -msgstr "condição WHEN de gatilho INSERT não pode referenciar valores OLD" +msgid "text search template \"%s\" does not exist, skipping" +msgstr "o modelo de procura de texto completo \"%s\" não existe, ignorando" -#: commands/trigger.c:377 +#: commands/dropcmds.c:321 #, c-format -msgid "DELETE trigger's WHEN condition cannot reference NEW values" -msgstr "condição WHEN de gatilho DELETE não pode referenciar valores NEW" +msgid "text search configuration \"%s\" does not exist, skipping" +msgstr "a configuração de procura de texto completo \"%s\" não existe, ignorando" -#: commands/trigger.c:382 +#: commands/dropcmds.c:326 #, c-format -msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" -msgstr "condição WHEN de gatilho BEFORE não pode referenciar colunas de sistema NEW" +msgid "extension \"%s\" does not exist, skipping" +msgstr "extensão \"%s\" não existe, ignorando" -#: commands/trigger.c:427 +#: commands/dropcmds.c:336 #, c-format -msgid "changing return type of function %s from \"opaque\" to \"trigger\"" -msgstr "alterando tipo retornado pela função %s de \"opaque\" para \"trigger\"" +msgid "function %s(%s) does not exist, skipping" +msgstr "função %s(%s) não existe, ignorando" -#: commands/trigger.c:434 +#: commands/dropcmds.c:349 #, c-format -msgid "function %s must return type \"trigger\"" -msgstr "função %s deve retornar tipo \"trigger\"" +msgid "procedure %s(%s) does not exist, skipping" +msgstr "o procedimento %s(%s) não existe, ignorando" -#: commands/trigger.c:546 commands/trigger.c:1295 +#: commands/dropcmds.c:362 #, c-format -msgid "trigger \"%s\" for relation \"%s\" already exists" -msgstr "gatilho \"%s\" para relação \"%s\" já existe" - -#: commands/trigger.c:831 -msgid "Found referenced table's UPDATE trigger." -msgstr "Encontrado gatilho de UPDATE na tabela referenciada." - -#: commands/trigger.c:832 -msgid "Found referenced table's DELETE trigger." -msgstr "Encontrado gatilho de DELETE na tabela referenciada." +msgid "routine %s(%s) does not exist, skipping" +msgstr "a rotina %s(%s) não existe, ignorada" -#: commands/trigger.c:833 -msgid "Found referencing table's trigger." -msgstr "Encontrado gatilho na tabela referenciada." +#: commands/dropcmds.c:375 +#, c-format +msgid "aggregate %s(%s) does not exist, skipping" +msgstr "agregação %s(%s) não existe, ignorando" -#: commands/trigger.c:942 commands/trigger.c:958 +#: commands/dropcmds.c:388 #, c-format -msgid "ignoring incomplete trigger group for constraint \"%s\" %s" -msgstr "ignorando grupo de gatilhos incompletos para restrição \"%s\" %s" +msgid "operator %s does not exist, skipping" +msgstr "operador %s não existe, ignorando" -#: commands/trigger.c:970 +#: commands/dropcmds.c:394 #, c-format -msgid "converting trigger group into constraint \"%s\" %s" -msgstr "convertendo grupo de gatilhos na restrição \"%s\" %s" +msgid "language \"%s\" does not exist, skipping" +msgstr "linguagem \"%s\" não existe, ignorando" -#: commands/trigger.c:1112 commands/trigger.c:1217 +#: commands/dropcmds.c:403 #, c-format -msgid "\"%s\" is not a table, view, or foreign table" -msgstr "\"%s\" não é uma tabela, visão ou tabela externa" +msgid "cast from type %s to type %s does not exist, skipping" +msgstr "conversão do tipo %s para tipo %s não existe, ignorando" -#: commands/trigger.c:1183 commands/trigger.c:1343 commands/trigger.c:1459 +#: commands/dropcmds.c:412 #, c-format -msgid "trigger \"%s\" for table \"%s\" does not exist" -msgstr "gatilho \"%s\" na tabela \"%s\" não existe" +msgid "transform for type %s language \"%s\" does not exist, skipping" +msgstr "transformação para o tipo %s e linguagem \"%s\" não existe, ignorando" -#: commands/trigger.c:1424 +#: commands/dropcmds.c:420 #, c-format -msgid "permission denied: \"%s\" is a system trigger" -msgstr "permissão negada: \"%s\" é um gatilho do sistema" +msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" +msgstr "gatilho \"%s\" para relação \"%s\" não existe, ignorando" -#: commands/trigger.c:1920 +#: commands/dropcmds.c:429 #, c-format -msgid "trigger function %u returned null value" -msgstr "função de gatilho %u retornou valor nulo" +msgid "policy \"%s\" for relation \"%s\" does not exist, skipping" +msgstr "a política \"%s\" para a relação \"%s\" não existe, ignorada" -#: commands/trigger.c:1979 commands/trigger.c:2178 commands/trigger.c:2382 -#: commands/trigger.c:2664 +#: commands/dropcmds.c:436 #, c-format -msgid "BEFORE STATEMENT trigger cannot return a value" -msgstr "gatilho BEFORE STATEMENT não pode retornar um valor" +msgid "event trigger \"%s\" does not exist, skipping" +msgstr "gatilho de eventos \"%s\" não existe, ignorando" -#: commands/trigger.c:2726 executor/nodeModifyTable.c:434 -#: executor/nodeModifyTable.c:712 +#: commands/dropcmds.c:442 #, c-format -msgid "tuple to be updated was already modified by an operation triggered by the current command" -msgstr "tupla a ser atualizada já foi modificada por uma operação disparada pelo comando atual" +msgid "rule \"%s\" for relation \"%s\" does not exist, skipping" +msgstr "regra \"%s\" para relação \"%s\" não existe, ignorando" -#: commands/trigger.c:2727 executor/nodeModifyTable.c:435 -#: executor/nodeModifyTable.c:713 +#: commands/dropcmds.c:449 #, c-format -msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." -msgstr "Considere utilizar um gatilho AFTER ao invés de um gatilho BEFORE para propagar alterações para outros registros." +msgid "foreign-data wrapper \"%s\" does not exist, skipping" +msgstr "o empacotador de dados estrangeiros \"%s\" não existe, ignorando" -#: commands/trigger.c:2741 executor/execMain.c:2059 -#: executor/nodeLockRows.c:165 executor/nodeModifyTable.c:447 -#: executor/nodeModifyTable.c:725 +#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 #, c-format -msgid "could not serialize access due to concurrent update" -msgstr "não pôde serializar acesso devido a uma atualização concorrente" +msgid "server \"%s\" does not exist, skipping" +msgstr "servidor \"%s\" não existe, ignorando" -#: commands/trigger.c:4538 +#: commands/dropcmds.c:462 #, c-format -msgid "constraint \"%s\" is not deferrable" -msgstr "restrição \"%s\" não é postergável" +msgid "operator class \"%s\" does not exist for access method \"%s\", skipping" +msgstr "família de operador \"%s\" não existe para método de acesso \"%s\", ignorando" -#: commands/trigger.c:4561 +#: commands/dropcmds.c:474 #, c-format -msgid "constraint \"%s\" does not exist" -msgstr "restrição \"%s\" não existe" +msgid "operator family \"%s\" does not exist for access method \"%s\", skipping" +msgstr "família de operador \"%s\" não existe para método de acesso \"%s\", ignorando" -#: commands/tsearchcmds.c:114 commands/tsearchcmds.c:671 +#: commands/dropcmds.c:481 #, c-format -msgid "function %s should return type %s" -msgstr "função %s deve retornar tipo %s" +msgid "publication \"%s\" does not exist, skipping" +msgstr "a publicação \"%s\" não existe, ignorada" -#: commands/tsearchcmds.c:186 +#: commands/event_trigger.c:125 #, c-format -msgid "must be superuser to create text search parsers" -msgstr "deve ser super-usuário para criar analisadores de busca textual" +msgid "permission denied to create event trigger \"%s\"" +msgstr "permissão negada ao criar gatilho de eventos \"%s\"" -#: commands/tsearchcmds.c:234 +#: commands/event_trigger.c:127 #, c-format -msgid "text search parser parameter \"%s\" not recognized" -msgstr "parâmetro do analisador de busca textual \"%s\" é desconhecido" +msgid "Must be superuser to create an event trigger." +msgstr "Deve ser superusuário para criar um gatilho de eventos." -#: commands/tsearchcmds.c:244 +#: commands/event_trigger.c:136 #, c-format -msgid "text search parser start method is required" -msgstr "método start do analisador de busca textual é requerido" +msgid "unrecognized event name \"%s\"" +msgstr "nome de evento \"%s\" desconhecido" -#: commands/tsearchcmds.c:249 +#: commands/event_trigger.c:153 #, c-format -msgid "text search parser gettoken method is required" -msgstr "método gettoken do analisador de busca textual é requerido" +msgid "unrecognized filter variable \"%s\"" +msgstr "variável de filtro \"%s\" desconhecida" -#: commands/tsearchcmds.c:254 +#: commands/event_trigger.c:207 #, c-format -msgid "text search parser end method is required" -msgstr "método end do analisador de busca textual é requerido" +msgid "filter value \"%s\" not recognized for filter variable \"%s\"" +msgstr "valor de filtro \"%s\" desconhecido para variável de filtro \"%s\"" -#: commands/tsearchcmds.c:259 +#. translator: %s represents an SQL statement name +#: commands/event_trigger.c:213 commands/event_trigger.c:235 #, c-format -msgid "text search parser lextypes method is required" -msgstr "método lextypes do analisador de busca textual é requerido" +msgid "event triggers are not supported for %s" +msgstr "gatilhos de eventos não são suportados por %s" -#: commands/tsearchcmds.c:376 +#: commands/event_trigger.c:248 #, c-format -msgid "text search template \"%s\" does not accept options" -msgstr "modelo de busca textual \"%s\" não aceita opções" +msgid "filter variable \"%s\" specified more than once" +msgstr "variável de filtro \"%s\" foi especificada mais de uma vez" -#: commands/tsearchcmds.c:449 +#: commands/event_trigger.c:376 commands/event_trigger.c:420 +#: commands/event_trigger.c:514 #, c-format -msgid "text search template is required" -msgstr "modelo de busca textual é requerido" +msgid "event trigger \"%s\" does not exist" +msgstr "gatilho de eventos \"%s\" não existe" -#: commands/tsearchcmds.c:735 +#: commands/event_trigger.c:452 #, c-format -msgid "must be superuser to create text search templates" -msgstr "deve ser super-usuário para criar modelos de busca textual" +msgid "event trigger with OID %u does not exist" +msgstr "gatilho de eventos com OID %u não existe" -#: commands/tsearchcmds.c:772 +#: commands/event_trigger.c:482 #, c-format -msgid "text search template parameter \"%s\" not recognized" -msgstr "parâmetro do modelo de busca textual \"%s\" é desconhecido" +msgid "permission denied to change owner of event trigger \"%s\"" +msgstr "permissão negada ao mudar o dono de gatilho de eventos \"%s\"" -#: commands/tsearchcmds.c:782 +#: commands/event_trigger.c:484 #, c-format -msgid "text search template lexize method is required" -msgstr "método lexize do modelo de busca textual é requerido" +msgid "The owner of an event trigger must be a superuser." +msgstr "O dono de um gatilho de eventos deve ser um superusuário." -#: commands/tsearchcmds.c:988 +#: commands/event_trigger.c:1304 #, c-format -msgid "text search configuration parameter \"%s\" not recognized" -msgstr "parâmetro de configuração de busca textual \"%s\" é desconhecido" +msgid "%s can only be called in a sql_drop event trigger function" +msgstr "%s só pode ser chamada na função de gatilho do evento sql_drop" -#: commands/tsearchcmds.c:995 +#: commands/event_trigger.c:1397 commands/event_trigger.c:1418 #, c-format -msgid "cannot specify both PARSER and COPY options" -msgstr "não pode especificar ambas opções PARSER e COPY" +msgid "%s can only be called in a table_rewrite event trigger function" +msgstr "%s só pode ser chamada em uma função de gatilho de evento table_rewrite" -#: commands/tsearchcmds.c:1023 +#: commands/event_trigger.c:1831 #, c-format -msgid "text search parser is required" -msgstr "analisador de busca textual é requerido" +msgid "%s can only be called in an event trigger function" +msgstr "%s só pode ser chamada em uma função de gatilho de evento" -#: commands/tsearchcmds.c:1247 +#: commands/explain.c:220 #, c-format -msgid "token type \"%s\" does not exist" -msgstr "tipo de elemento \"%s\" não existe" +msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" +msgstr "valor desconhecido para opção EXPLAIN \"%s\": \"%s\"" -#: commands/tsearchcmds.c:1469 +#: commands/explain.c:227 #, c-format -msgid "mapping for token type \"%s\" does not exist" -msgstr "mapeamento para tipo de elemento \"%s\" não existe" +msgid "unrecognized EXPLAIN option \"%s\"" +msgstr "opção EXPLAIN desconhecida \"%s\"" -#: commands/tsearchcmds.c:1475 +#: commands/explain.c:236 #, c-format -msgid "mapping for token type \"%s\" does not exist, skipping" -msgstr "mapeamento para tipo de elemento \"%s\" não existe, ignorando" +msgid "EXPLAIN option WAL requires ANALYZE" +msgstr "a opção WAL do EXPLAIN requer ANALYZE" -#: commands/tsearchcmds.c:1628 commands/tsearchcmds.c:1739 +#: commands/explain.c:245 #, c-format -msgid "invalid parameter list format: \"%s\"" -msgstr "formato de lista de parâmetros é inválido: \"%s\"" +msgid "EXPLAIN option TIMING requires ANALYZE" +msgstr "opção TIMING do EXPLAIN requer ANALYZE" -#: commands/typecmds.c:184 +#: commands/explain.c:251 #, c-format -msgid "must be superuser to create a base type" -msgstr "deve ser super-usuário para criar um tipo base" +msgid "EXPLAIN options ANALYZE and GENERIC_PLAN cannot be used together" +msgstr "as opções do EXPLAIN ANALYZE e GENERIC_PLAN não podem ser usadas juntas" -#: commands/typecmds.c:290 commands/typecmds.c:1371 +#: commands/extension.c:177 commands/extension.c:3033 #, c-format -msgid "type attribute \"%s\" not recognized" -msgstr "atributo do tipo \"%s\" desconhecido" +msgid "extension \"%s\" does not exist" +msgstr "extensão \"%s\" não existe" -#: commands/typecmds.c:344 +#: commands/extension.c:276 commands/extension.c:285 commands/extension.c:297 +#: commands/extension.c:307 #, c-format -msgid "invalid type category \"%s\": must be simple ASCII" -msgstr "categoria de tipo \"%s\" é inválida: deve ser ASCII simples" +msgid "invalid extension name: \"%s\"" +msgstr "o nome da extensão não é válido: \"%s\"" -#: commands/typecmds.c:363 +#: commands/extension.c:277 #, c-format -msgid "array element type cannot be %s" -msgstr "tipo do elemento da matriz não pode ser %s" +msgid "Extension names must not be empty." +msgstr "Nomes de extensão não devem ser vazios." -#: commands/typecmds.c:395 +#: commands/extension.c:286 #, c-format -msgid "alignment \"%s\" not recognized" -msgstr "alinhamento \"%s\" desconhecido" +msgid "Extension names must not contain \"--\"." +msgstr "Nomes de extensão não devem conter \"--\"." -#: commands/typecmds.c:412 +#: commands/extension.c:298 #, c-format -msgid "storage \"%s\" not recognized" -msgstr "armazenamento \"%s\" desconhecido" +msgid "Extension names must not begin or end with \"-\"." +msgstr "Nomes de extensão não devem começar ou terminar com \"-\"." -#: commands/typecmds.c:423 +#: commands/extension.c:308 #, c-format -msgid "type input function must be specified" -msgstr "função de entrada do tipo deve ser especificada" +msgid "Extension names must not contain directory separator characters." +msgstr "Nomes de extensões não devem conter caracteres separadores de diretórios." -#: commands/typecmds.c:427 +#: commands/extension.c:323 commands/extension.c:332 commands/extension.c:341 +#: commands/extension.c:351 #, c-format -msgid "type output function must be specified" -msgstr "função de saída do tipo deve ser especificada" +msgid "invalid extension version name: \"%s\"" +msgstr "o nome da versão da extensão não é válido: \"%s\"" -#: commands/typecmds.c:432 +#: commands/extension.c:324 #, c-format -msgid "type modifier output function is useless without a type modifier input function" -msgstr "função de saída do modificador de tipo é inútil sem uma função de entrada do modificador de tipo" +msgid "Version names must not be empty." +msgstr "Nomes de versão não devem ser vazios." -#: commands/typecmds.c:455 +#: commands/extension.c:333 #, c-format -msgid "changing return type of function %s from \"opaque\" to %s" -msgstr "alterando tipo retornado pela função %s de \"opaque\" para %s" +msgid "Version names must not contain \"--\"." +msgstr "Nomes de versão não devem conter \"--\"." -#: commands/typecmds.c:462 +#: commands/extension.c:342 #, c-format -msgid "type input function %s must return type %s" -msgstr "função de entrada do tipo %s deve retornar tipo %s" +msgid "Version names must not begin or end with \"-\"." +msgstr "Nomes de versão não devem começar ou terminar com \"-\"." -#: commands/typecmds.c:472 +#: commands/extension.c:352 #, c-format -msgid "changing return type of function %s from \"opaque\" to \"cstring\"" -msgstr "alterando tipo retornado pela função %s de \"opaque\" para \"cstring\"" +msgid "Version names must not contain directory separator characters." +msgstr "Nomes de versão não devem conter caracteres separadores de diretórios." -#: commands/typecmds.c:479 +#: commands/extension.c:506 #, c-format -msgid "type output function %s must return type \"cstring\"" -msgstr "função de saída do tipo %s deve retornar tipo \"cstring\"" +msgid "extension \"%s\" is not available" +msgstr "a extensão \"%s\" não está disponível" -#: commands/typecmds.c:488 +#: commands/extension.c:507 #, c-format -msgid "type receive function %s must return type %s" -msgstr "função de recepção do tipo %s deve retornar tipo %s" +msgid "Could not open extension control file \"%s\": %m." +msgstr "Não foi possível abrir o arquivo de controle de extensão \"%s\": %m." -#: commands/typecmds.c:497 +#: commands/extension.c:509 #, c-format -msgid "type send function %s must return type \"bytea\"" -msgstr "função de envio do tipo %s deve retornar tipo \"bytea\"" +msgid "The extension must first be installed on the system where PostgreSQL is running." +msgstr "" -#: commands/typecmds.c:762 +#: commands/extension.c:513 #, c-format -msgid "\"%s\" is not a valid base type for a domain" -msgstr "\"%s\" não é um tipo base válido para um domínio" +msgid "could not open extension control file \"%s\": %m" +msgstr "não foi possível abrir o arquivo de controle da extensão \"%s\": %m" -#: commands/typecmds.c:848 +#: commands/extension.c:536 commands/extension.c:546 #, c-format -msgid "multiple default expressions" -msgstr "múltiplas expressões padrão" +msgid "parameter \"%s\" cannot be set in a secondary extension control file" +msgstr "parâmetro \"%s\" não pode ser definido em um segundo arquivo de controle da extensão" -#: commands/typecmds.c:910 commands/typecmds.c:919 +#: commands/extension.c:568 commands/extension.c:576 commands/extension.c:584 +#: utils/misc/guc.c:3100 #, c-format -msgid "conflicting NULL/NOT NULL constraints" -msgstr "restrições NULL/NOT NULL conflitantes" +msgid "parameter \"%s\" requires a Boolean value" +msgstr "parâmetro \"%s\" requer um valor booleano" -#: commands/typecmds.c:935 +#: commands/extension.c:593 #, c-format -msgid "check constraints for domains cannot be marked NO INHERIT" -msgstr "restrições de verificação para domínios não podem ser marcadas NO INHERIT" +msgid "\"%s\" is not a valid encoding name" +msgstr "\"%s\" não é um nome de codificação válido" -#: commands/typecmds.c:944 commands/typecmds.c:2453 +#: commands/extension.c:607 commands/extension.c:622 #, c-format -msgid "unique constraints not possible for domains" -msgstr "restrições de unicidade não são possíveis para domínios" +msgid "parameter \"%s\" must be a list of extension names" +msgstr "parâmetro \"%s\" deve ser uma lista de nomes de extensões" -#: commands/typecmds.c:950 commands/typecmds.c:2459 +#: commands/extension.c:629 #, c-format -msgid "primary key constraints not possible for domains" -msgstr "restrições de chave primária não são possíveis para domínios" +msgid "unrecognized parameter \"%s\" in file \"%s\"" +msgstr "parâmetro \"%s\" desconhecido em arquivo \"%s\"" -#: commands/typecmds.c:956 commands/typecmds.c:2465 +#: commands/extension.c:638 #, c-format -msgid "exclusion constraints not possible for domains" -msgstr "restrições de exclusão não são possíveis para domínios" +msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" +msgstr "o parâmetro \"schema\" não pode ser especificado quando \"relocatable\" é verdade" -#: commands/typecmds.c:962 commands/typecmds.c:2471 +#: commands/extension.c:816 #, c-format -msgid "foreign key constraints not possible for domains" -msgstr "restrições de chave estrangeira não são possíveis para domínios" +msgid "transaction control statements are not allowed within an extension script" +msgstr "comandos de controle de transação não são permitidos dentro do script da extensão" -#: commands/typecmds.c:971 commands/typecmds.c:2480 +#: commands/extension.c:896 #, c-format -msgid "specifying constraint deferrability not supported for domains" -msgstr "especificação de postergação de restrição não é suportada para domínios" +msgid "permission denied to create extension \"%s\"" +msgstr "permissão negada ao criar extensão \"%s\"" -#: commands/typecmds.c:1243 utils/cache/typcache.c:1071 +#: commands/extension.c:899 #, c-format -msgid "%s is not an enum" -msgstr "%s não é um enum" +msgid "Must have CREATE privilege on current database to create this extension." +msgstr "É necessário ter o privilégio CREATE no banco de dados corrente para criar essa extensão." -#: commands/typecmds.c:1379 +#: commands/extension.c:900 #, c-format -msgid "type attribute \"subtype\" is required" -msgstr "atributo do tipo \"subtype\" é requerido" +msgid "Must be superuser to create this extension." +msgstr "É necessário ser um superusuário para criar essa extensão." -#: commands/typecmds.c:1384 +#: commands/extension.c:904 #, c-format -msgid "range subtype cannot be %s" -msgstr "subtipo do range não pode ser %s" +msgid "permission denied to update extension \"%s\"" +msgstr "permissão negada ao atualizar extensão \"%s\"" -#: commands/typecmds.c:1403 +#: commands/extension.c:907 #, c-format -msgid "range collation specified but subtype does not support collation" -msgstr "ordenação de range especificado mas subtipo não suporta ordenação" +msgid "Must have CREATE privilege on current database to update this extension." +msgstr "É necessário ter o privilégio CREATE no banco de dados corrente para atualizar essa extensão." -#: commands/typecmds.c:1639 +#: commands/extension.c:908 #, c-format -msgid "changing argument type of function %s from \"opaque\" to \"cstring\"" -msgstr "alterando tipo de argumento da função %s de \"opaque\" para \"cstring\"" +msgid "Must be superuser to update this extension." +msgstr "Deve ser superusuário para atualizar esta extensão." -#: commands/typecmds.c:1690 +#: commands/extension.c:1046 #, c-format -msgid "changing argument type of function %s from \"opaque\" to %s" -msgstr "alterando tipo de argumento da função %s de \"opaque\" para %s" +msgid "invalid character in extension owner: must not contain any of \"%s\"" +msgstr "caractere inválido no dono da extensão: não deve conter qualquer \"%s\"" -#: commands/typecmds.c:1789 +#: commands/extension.c:1070 commands/extension.c:1097 #, c-format -msgid "typmod_in function %s must return type \"integer\"" -msgstr "função typmod_in %s deve retornar tipo \"integer\"" +msgid "invalid character in extension \"%s\" schema: must not contain any of \"%s\"" +msgstr "caractere inválido no esquema de extensão \"%s\": não deve conter nenhum de \"%s\"" -#: commands/typecmds.c:1816 +#: commands/extension.c:1292 #, c-format -msgid "typmod_out function %s must return type \"cstring\"" -msgstr "função typmod_out %s deve retornar tipo \"cstring\"" +msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" +msgstr "extensão \"%s\" não possui caminho de atualização da versão \"%s\" para versão \"%s\"" -#: commands/typecmds.c:1843 +#: commands/extension.c:1500 commands/extension.c:3091 #, c-format -msgid "type analyze function %s must return type \"boolean\"" -msgstr "função de análise do tipo %s deve retornar tipo \"boolean\"" +msgid "version to install must be specified" +msgstr "versão a ser instalada deve ser especificada" -#: commands/typecmds.c:1889 +#: commands/extension.c:1537 #, c-format -msgid "You must specify an operator class for the range type or define a default operator class for the subtype." -msgstr "Você deve especificar uma classe de operadores para o tipo range ou definir uma classe de operadores padrão para o subtipo." +msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" +msgstr "a extensão \"%s\" não possui script de instalação nem caminho de atualização para a versão \"%s\"" -#: commands/typecmds.c:1920 +#: commands/extension.c:1571 #, c-format -msgid "range canonical function %s must return range type" -msgstr "função canônica de range %s deve retornar tipo range" +msgid "extension \"%s\" must be installed in schema \"%s\"" +msgstr "extensão \"%s\" deve ser instalada no esquema \"%s\"" -#: commands/typecmds.c:1926 +#: commands/extension.c:1731 #, c-format -msgid "range canonical function %s must be immutable" -msgstr "função canônica de range %s deve ser imutável" +msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" +msgstr "dependência cíclica detectada entre as extensões \"%s\" e \"%s\"" -#: commands/typecmds.c:1962 +#: commands/extension.c:1736 #, c-format -msgid "range subtype diff function %s must return type double precision" -msgstr "função diff de subtipo range %s deve retornar tipo double precision" +msgid "installing required extension \"%s\"" +msgstr "instalando a extensão requerida \"%s\"" -#: commands/typecmds.c:1968 +#: commands/extension.c:1759 #, c-format -msgid "range subtype diff function %s must be immutable" -msgstr "função diff de subtipo range %s deve ser imutável" +msgid "required extension \"%s\" is not installed" +msgstr "extensão requerida \"%s\" não está instalada" -#: commands/typecmds.c:2287 +#: commands/extension.c:1762 #, c-format -msgid "column \"%s\" of table \"%s\" contains null values" -msgstr "coluna \"%s\" da tabela \"%s\" contém valores nulos" +msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." +msgstr "Use CREATE EXTENSION ... CASCADE para instalar as extensões requeridas também." -#: commands/typecmds.c:2396 commands/typecmds.c:2574 +#: commands/extension.c:1797 #, c-format -msgid "constraint \"%s\" of domain \"%s\" does not exist" -msgstr "restrição \"%s\" do domínio \"%s\" não existe" +msgid "extension \"%s\" already exists, skipping" +msgstr "extensão \"%s\" já existe, ignorando" -#: commands/typecmds.c:2400 +#: commands/extension.c:1804 #, c-format -msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" -msgstr "restrição \"%s\" do domínio \"%s\" não existe, ignorando" +msgid "extension \"%s\" already exists" +msgstr "extensão \"%s\" já existe" -#: commands/typecmds.c:2580 +#: commands/extension.c:1815 #, c-format -msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" -msgstr "restrição \"%s\" do domínio \"%s\" não é uma restrição de verificação" +msgid "nested CREATE EXTENSION is not supported" +msgstr "CREATE EXTENSION aninhado não tem suporte" -#: commands/typecmds.c:2684 +#: commands/extension.c:1979 #, c-format -msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" -msgstr "coluna \"%s\" da tabela \"%s\" contém valores que violam a nova restrição" +msgid "cannot drop extension \"%s\" because it is being modified" +msgstr "não é possível remover a extensão \"%s\", porque está sendo modificada" -#: commands/typecmds.c:2897 commands/typecmds.c:3267 commands/typecmds.c:3425 +#: commands/extension.c:2454 #, c-format -msgid "%s is not a domain" -msgstr "%s não é um domínio" +msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" +msgstr "%s só pode ser chamado a partir de um script SQL executado por CREATE EXTENSION" -#: commands/typecmds.c:2930 +#: commands/extension.c:2466 #, c-format -msgid "constraint \"%s\" for domain \"%s\" already exists" -msgstr "restrição \"%s\" para domínio \"%s\" já existe" +msgid "OID %u does not refer to a table" +msgstr "OID %u não se refere a uma tabela" -#: commands/typecmds.c:2980 +#: commands/extension.c:2471 #, c-format -msgid "cannot use table references in domain check constraint" -msgstr "não pode utilizar referências a tabela em restrição de verificação do domínio" +msgid "table \"%s\" is not a member of the extension being created" +msgstr "tabela \"%s\" não é um membro da extensão que está sendo criada" -#: commands/typecmds.c:3199 commands/typecmds.c:3279 commands/typecmds.c:3533 +#: commands/extension.c:2817 #, c-format -msgid "%s is a table's row type" -msgstr "%s é um tipo registro da tabela" +msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" +msgstr "não é possível mover a extensão \"%s\" para o esquema \"%s\", porque a extensão contém o esquema" -#: commands/typecmds.c:3201 commands/typecmds.c:3281 commands/typecmds.c:3535 +#: commands/extension.c:2858 commands/extension.c:2952 #, c-format -msgid "Use ALTER TABLE instead." -msgstr "Ao invés disso utilize ALTER TABLE." +msgid "extension \"%s\" does not support SET SCHEMA" +msgstr "a extensão \"%s\" não dá suporte a SET SCHEMA" -#: commands/typecmds.c:3208 commands/typecmds.c:3288 commands/typecmds.c:3452 +#: commands/extension.c:2915 #, c-format -msgid "cannot alter array type %s" -msgstr "não pode alterar tipo array %s" +msgid "cannot SET SCHEMA of extension \"%s\" because other extensions prevent it" +msgstr "não é possível executar SET SCHEMA para a extensão \"%s\", porque outras extensões o impedem" -#: commands/typecmds.c:3210 commands/typecmds.c:3290 commands/typecmds.c:3454 +#: commands/extension.c:2917 #, c-format -msgid "You can alter type %s, which will alter the array type as well." -msgstr "Você pode alterar tipo %s, que alterará o tipo array também." +msgid "Extension \"%s\" requests no relocation of extension \"%s\"." +msgstr "A extensão \"%s\" não requer nenhuma realocação da extensão \"%s\"." -#: commands/typecmds.c:3519 +#: commands/extension.c:2954 #, c-format -msgid "type \"%s\" already exists in schema \"%s\"" -msgstr "tipo \"%s\" já existe no esquema \"%s\"" +msgid "%s is not in the extension's schema \"%s\"" +msgstr "%s não está no esquema da extensão \"%s\"" -#: commands/user.c:145 +#: commands/extension.c:3013 #, c-format -msgid "SYSID can no longer be specified" -msgstr "SYSID não pode mais ser especificado" +msgid "nested ALTER EXTENSION is not supported" +msgstr "ALTER EXTENSION aninhado não tem suporte" -#: commands/user.c:277 +#: commands/extension.c:3102 #, c-format -msgid "must be superuser to create superusers" -msgstr "deve ser super-usuário para criar super-usuários" +msgid "version \"%s\" of extension \"%s\" is already installed" +msgstr "versao \"%s\" da extensão \"%s\" já está instalada" -#: commands/user.c:284 +#: commands/extension.c:3314 #, c-format -msgid "must be superuser to create replication users" -msgstr "deve ser super-usuário para criar usuários de replicação" +msgid "cannot add an object of this type to an extension" +msgstr "" -#: commands/user.c:291 +#: commands/extension.c:3380 #, c-format -msgid "permission denied to create role" -msgstr "permissão negada ao criar role" +msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" +msgstr "não é possível adicionar o esquema \"%s\" à extensão \"%s\", porque o esquema contém a extensão" -#: commands/user.c:298 commands/user.c:1119 +#: commands/extension.c:3474 #, c-format -msgid "role name \"%s\" is reserved" -msgstr "nome de role \"%s\" é reservado" +msgid "file \"%s\" is too large" +msgstr "o arquivo \"%s\" é muito grande" -#: commands/user.c:311 commands/user.c:1113 +#: commands/foreigncmds.c:148 commands/foreigncmds.c:157 #, c-format -msgid "role \"%s\" already exists" -msgstr "role \"%s\" já existe" +msgid "option \"%s\" not found" +msgstr "opção \"%s\" não foi encontrada" -#: commands/user.c:618 commands/user.c:827 commands/user.c:933 -#: commands/user.c:1088 commands/variable.c:797 commands/variable.c:869 -#: utils/adt/acl.c:5121 utils/init/miscinit.c:362 +#: commands/foreigncmds.c:167 #, c-format -msgid "role \"%s\" does not exist" -msgstr "role \"%s\" não existe" +msgid "option \"%s\" provided more than once" +msgstr "opção \"%s\" especificada mais de uma vez" -#: commands/user.c:631 commands/user.c:846 commands/user.c:1357 -#: commands/user.c:1503 +#: commands/foreigncmds.c:221 commands/foreigncmds.c:229 #, c-format -msgid "must be superuser to alter superusers" -msgstr "deve ser super-usuário para alterar super-usuários" +msgid "permission denied to change owner of foreign-data wrapper \"%s\"" +msgstr "permissão negada ao mudar o dono do empacotador de dados estrangeiros \"%s\"" -#: commands/user.c:638 +#: commands/foreigncmds.c:223 #, c-format -msgid "must be superuser to alter replication users" -msgstr "deve ser super-usuário para alterar usuários de replicação" +msgid "Must be superuser to change owner of a foreign-data wrapper." +msgstr "É necessário ser um superusuário para mudar o dono de um empacotador de dados estrangeiros." -#: commands/user.c:654 commands/user.c:854 +#: commands/foreigncmds.c:231 #, c-format -msgid "permission denied" -msgstr "permissão negada" +msgid "The owner of a foreign-data wrapper must be a superuser." +msgstr "O dono de um empacotador de dados estrangeiros deve ser um superusuário." -#: commands/user.c:884 +#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:678 #, c-format -msgid "must be superuser to alter settings globally" -msgstr "deve ser super-usuário para alterar definições globalmente" +msgid "foreign-data wrapper \"%s\" does not exist" +msgstr "o empacotador de dados estrangeiros \"%s\" não existe" -#: commands/user.c:906 +#: commands/foreigncmds.c:325 #, c-format -msgid "permission denied to drop role" -msgstr "permissão negada ao remover role" +msgid "foreign-data wrapper with OID %u does not exist" +msgstr "o empacotador de dados estrangeiros com OID %u não existe" -#: commands/user.c:938 +#: commands/foreigncmds.c:462 #, c-format -msgid "role \"%s\" does not exist, skipping" -msgstr "role \"%s\" não existe, ignorando" +msgid "foreign server with OID %u does not exist" +msgstr "o servidor estrangeiro com OID %u não existe" -#: commands/user.c:950 commands/user.c:954 +#: commands/foreigncmds.c:580 #, c-format -msgid "current user cannot be dropped" -msgstr "usuário atual não pode ser removido" +msgid "permission denied to create foreign-data wrapper \"%s\"" +msgstr "permissão negada para criar o empacotador de dados estrangeiros \"%s\"" -#: commands/user.c:958 +#: commands/foreigncmds.c:582 #, c-format -msgid "session user cannot be dropped" -msgstr "usuário de sessão não pode ser removido" +msgid "Must be superuser to create a foreign-data wrapper." +msgstr "É necessário ser um superusuário para criar um empacotador de dados estrangeiros." -#: commands/user.c:969 +#: commands/foreigncmds.c:697 #, c-format -msgid "must be superuser to drop superusers" -msgstr "deve ser super-usuário para remover super-usuários" +msgid "permission denied to alter foreign-data wrapper \"%s\"" +msgstr "permissão negada para alterar o empacotador de dados estrangeiros \"%s\"" -#: commands/user.c:985 +#: commands/foreigncmds.c:699 #, c-format -msgid "role \"%s\" cannot be dropped because some objects depend on it" -msgstr "role \"%s\" não pode ser removida porque alguns objetos dependem dela" +msgid "Must be superuser to alter a foreign-data wrapper." +msgstr "É necessário ser um superusuário para alterar um empacotador de dados estrangeiros." -#: commands/user.c:1103 +#: commands/foreigncmds.c:730 #, c-format -msgid "session user cannot be renamed" -msgstr "usuário de sessão não pode ser renomeado" +msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" +msgstr "mudar o tratador do empacotador de dados estrangeiros pode mudar o comportamento de tabelas estrangeiras existentes" -#: commands/user.c:1107 +#: commands/foreigncmds.c:745 #, c-format -msgid "current user cannot be renamed" -msgstr "usuário atual não pode ser renomeado" +msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" +msgstr "mudar o validador do empacotador de dados estrangeiros pode tornar inválidas as opções para objetos dependentes" -#: commands/user.c:1130 +#: commands/foreigncmds.c:876 #, c-format -msgid "must be superuser to rename superusers" -msgstr "deve ser super-usuário para renomear super-usuários" +msgid "server \"%s\" already exists, skipping" +msgstr "o servidor \"%s\" já existe, ignorando" -#: commands/user.c:1137 +#: commands/foreigncmds.c:1144 #, c-format -msgid "permission denied to rename role" -msgstr "permissão negada ao renomear role" +msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" +msgstr "o mapeamento de usuário para \"%s\" já existe para o servidor \"%s\", ignorando" -#: commands/user.c:1158 +#: commands/foreigncmds.c:1154 #, c-format -msgid "MD5 password cleared because of role rename" -msgstr "senha MD5 foi limpada porque role foi renomeada" +msgid "user mapping for \"%s\" already exists for server \"%s\"" +msgstr "o mapeamento de usuário para \"%s\" já existe para o servidor \"%s\"" -#: commands/user.c:1218 +#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 #, c-format -msgid "column names cannot be included in GRANT/REVOKE ROLE" -msgstr "nomes de coluna não podem ser incluídos em GRANT/REVOKE ROLE" +msgid "user mapping for \"%s\" does not exist for server \"%s\"" +msgstr "o mapeamento de usuário para \"%s\" não existe para o servidor \"%s\"" -#: commands/user.c:1256 +#: commands/foreigncmds.c:1379 #, c-format -msgid "permission denied to drop objects" -msgstr "permissão negada ao remover objetos" +msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" +msgstr "o mapeamento de usuário para \"%s\" não existe para o servidor \"%s\", ignorando" -#: commands/user.c:1283 commands/user.c:1292 +#: commands/foreigncmds.c:1507 foreign/foreign.c:391 #, c-format -msgid "permission denied to reassign objects" -msgstr "permissão negada ao reatribuir objetos" +msgid "foreign-data wrapper \"%s\" has no handler" +msgstr "o empacotador de dados estrangeiros \"%s\" não possui tratador" -#: commands/user.c:1365 commands/user.c:1511 +#: commands/foreigncmds.c:1513 #, c-format -msgid "must have admin option on role \"%s\"" -msgstr "deve ter opção admin na role \"%s\"" +msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" +msgstr "o empacotador de dados estrangeiros \"%s\" não oferece suporte a IMPORT FOREIGN SCHEMA" -#: commands/user.c:1382 +#: commands/foreigncmds.c:1615 #, c-format -msgid "must be superuser to set grantor" -msgstr "deve ser super-usuário para definir concedente" +msgid "importing foreign table \"%s\"" +msgstr "importando a tabela estrangeira \"%s\"" -#: commands/user.c:1407 +#: commands/functioncmds.c:109 #, c-format -msgid "role \"%s\" is a member of role \"%s\"" -msgstr "role \"%s\" é um membro da role \"%s\"" +msgid "SQL function cannot return shell type %s" +msgstr "função SQL não pode retornar tipo indefinido %s" -#: commands/user.c:1422 +#: commands/functioncmds.c:114 #, c-format -msgid "role \"%s\" is already a member of role \"%s\"" -msgstr "role \"%s\" já é um membro da role \"%s\"" +msgid "return type %s is only a shell" +msgstr "tipo retornado %s é indefinido" -#: commands/user.c:1533 +#: commands/functioncmds.c:143 parser/parse_type.c:354 #, c-format -msgid "role \"%s\" is not a member of role \"%s\"" -msgstr "role \"%s\" não é um membro da role \"%s\"" +msgid "type modifier cannot be specified for shell type \"%s\"" +msgstr "modificador de tipo não pode ser especificado para tipo indefinido \"%s\"" -#: commands/vacuum.c:468 +#: commands/functioncmds.c:149 #, c-format -msgid "oldest xmin is far in the past" -msgstr "xmin mais velho é muito antigo" +msgid "type \"%s\" is not yet defined" +msgstr "tipo \"%s\" ainda não foi definido" -#: commands/vacuum.c:469 +#: commands/functioncmds.c:150 #, c-format -msgid "Close open transactions soon to avoid wraparound problems." -msgstr "Feche transações abertas imediatamente para evitar problemas de reinício." +msgid "Creating a shell type definition." +msgstr "Criando uma definição de tipo indefinido." -#: commands/vacuum.c:501 +#: commands/functioncmds.c:249 #, c-format -msgid "oldest multixact is far in the past" -msgstr "multixact mais velho é muito antigo" +msgid "SQL function cannot accept shell type %s" +msgstr "função SQL não pode aceitar tipo indefinido %s" -#: commands/vacuum.c:502 +#: commands/functioncmds.c:255 #, c-format -msgid "Close open transactions with multixacts soon to avoid wraparound problems." -msgstr "Feche transações abertas com multixacts imediatamente para evitar problemas de reinício." +msgid "aggregate cannot accept shell type %s" +msgstr "agregação não pode aceitar tipo indefinido %s" -#: commands/vacuum.c:1064 +#: commands/functioncmds.c:260 #, c-format -msgid "some databases have not been vacuumed in over 2 billion transactions" -msgstr "alguns bancos de dados não foram limpos a mais de 2 bilhões de transações" +msgid "argument type %s is only a shell" +msgstr "tipo de argumento %s é indefinido" -#: commands/vacuum.c:1065 +#: commands/functioncmds.c:270 #, c-format -msgid "You might have already suffered transaction-wraparound data loss." -msgstr "Você já pode ter sofrido problemas de perda de dados devido a reciclagem de transações." +msgid "type %s does not exist" +msgstr "tipo %s não existe" -#: commands/vacuum.c:1182 +#: commands/functioncmds.c:284 #, c-format -msgid "skipping vacuum of \"%s\" --- lock not available" -msgstr "ignorando limpeza de \"%s\" --- bloqueio não está disponível" +msgid "aggregates cannot accept set arguments" +msgstr "agregações não podem aceitar conjunto de argumentos" -#: commands/vacuum.c:1208 +#: commands/functioncmds.c:288 #, c-format -msgid "skipping \"%s\" --- only superuser can vacuum it" -msgstr "ignorando \"%s\" --- somente super-usuário pode limpá-la(o)" +msgid "procedures cannot accept set arguments" +msgstr "procedimentos não podem aceitar argumentos de conjunto" -#: commands/vacuum.c:1212 +#: commands/functioncmds.c:292 #, c-format -msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" -msgstr "ignorando \"%s\" --- somente super-usuário ou dono de banco de dados pode limpá-la(o)" +msgid "functions cannot accept set arguments" +msgstr "funções não podem aceitar conjunto de argumentos" -#: commands/vacuum.c:1216 +#: commands/functioncmds.c:302 #, c-format -msgid "skipping \"%s\" --- only table or database owner can vacuum it" -msgstr "ignorando \"%s\" --- somente dono de tabela ou de banco de dados pode limpá-la(o)" +msgid "VARIADIC parameter must be the last input parameter" +msgstr "parâmetro VARIADIC deve ser o último parâmetro de entrada" -#: commands/vacuum.c:1234 +#: commands/functioncmds.c:322 #, c-format -msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" -msgstr "ignorando \"%s\" --- não pode limpar objetos que não são tabelas ou tabelas especiais do sistema" +msgid "VARIADIC parameter must be the last parameter" +msgstr "o parâmetro VARIADIC deve ser o último parâmetro" -#: commands/vacuumlazy.c:346 +#: commands/functioncmds.c:347 #, c-format -msgid "" -"automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" -"pages: %d removed, %d remain\n" -"tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable\n" -"buffer usage: %d hits, %d misses, %d dirtied\n" -"avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" -"system usage: %s" -msgstr "" -"limpeza automática da tabela \"%s.%s.%s\": buscas por índice: %d\n" -"páginas: %d removidas, %d remanescentes\n" -"tuplas: %.0f removidas, %.0f remanescentes, %.0f são não vigentes mas ainda não podem ser removidas\n" -"uso de buffers: %d acertos, %d faltas, %d sujos\n" -"taxa média de leitura: %.3f MB/s, taxa média de escrita: %.3f MB/s\n" -"uso do sistema: %s" +msgid "VARIADIC parameter must be an array" +msgstr "parâmetro VARIADIC deve ser uma matriz" -#: commands/vacuumlazy.c:680 +#: commands/functioncmds.c:392 #, c-format -msgid "relation \"%s\" page %u is uninitialized --- fixing" -msgstr "página %2$u da relação \"%1$s\" não foi inicializada --- consertando" +msgid "parameter name \"%s\" used more than once" +msgstr "nome de parâmetro \"%s\" foi especificado mais de uma vez" -#: commands/vacuumlazy.c:1092 +#: commands/functioncmds.c:410 #, c-format -msgid "\"%s\": removed %.0f row versions in %u pages" -msgstr "\"%s\": removidas %.0f versões de registro em %u páginas" +msgid "only input parameters can have default values" +msgstr "somente parâmetros de entrada podem ter valores padrão" -#: commands/vacuumlazy.c:1097 +#: commands/functioncmds.c:425 #, c-format -msgid "\"%s\": found %.0f removable, %.0f nonremovable row versions in %u out of %u pages" -msgstr "\"%s\": encontrados %.0f versões de registros removíveis e %.0f não-removíveis em %u de %u páginas" +msgid "cannot use table references in parameter default value" +msgstr "não é possível utilizar referência a tabela no valor padrão do parâmetro" -#: commands/vacuumlazy.c:1101 +#: commands/functioncmds.c:449 #, c-format -msgid "" -"%.0f dead row versions cannot be removed yet.\n" -"There were %.0f unused item pointers.\n" -"%u pages are entirely empty.\n" -"%s." -msgstr "" -"%.0f versões de registros não vigentes não podem ser removidas ainda.\n" -"Havia %.0f ponteiros de itens não utilizados.\n" -"%u páginas estão completamente vazias.\n" -"%s." +msgid "input parameters after one with a default value must also have defaults" +msgstr "parâmetros de entrada após um parâmetro com valor padrão também devem ter valores padrão" -#: commands/vacuumlazy.c:1172 +#: commands/functioncmds.c:459 #, c-format -msgid "\"%s\": removed %d row versions in %d pages" -msgstr "\"%s\": removidas %d versões de registro em %d páginas" +msgid "procedure OUT parameters cannot appear after one with a default value" +msgstr "os parâmetros de procedimento OUT não podem vir depois de um parâmetro com valor padrão" -#: commands/vacuumlazy.c:1175 commands/vacuumlazy.c:1342 -#: commands/vacuumlazy.c:1514 +#: commands/functioncmds.c:601 commands/functioncmds.c:780 #, c-format -msgid "%s." -msgstr "%s." +msgid "invalid attribute in procedure definition" +msgstr "atributo inválido na definição do procedimento" -#: commands/vacuumlazy.c:1339 +#: commands/functioncmds.c:697 #, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "índice \"%s\" percorrido para remover %d versões de registro" +msgid "support function %s must return type %s" +msgstr "a função de suporte %s deve retornar o tipo de dados %s" -#: commands/vacuumlazy.c:1385 +#: commands/functioncmds.c:708 #, c-format -msgid "index \"%s\" now contains %.0f row versions in %u pages" -msgstr "índice \"%s\" agora contém %.0f versões de registros em %u páginas" +msgid "must be superuser to specify a support function" +msgstr "é necessário ser um superusuário para especificar uma função de suporte" -#: commands/vacuumlazy.c:1389 +#: commands/functioncmds.c:829 commands/functioncmds.c:1432 #, c-format -msgid "" -"%.0f index row versions were removed.\n" -"%u index pages have been deleted, %u are currently reusable.\n" -"%s." -msgstr "" -"%.0f versões de registros de índices foram apagadas.\n" -"%u páginas de índice foram removidas, %u são reutilizáveis.\n" -"%s." +msgid "COST must be positive" +msgstr "COST deve ser positivo" -#: commands/vacuumlazy.c:1446 +#: commands/functioncmds.c:837 commands/functioncmds.c:1440 #, c-format -msgid "\"%s\": stopping truncate due to conflicting lock request" -msgstr "\"%s\": parando truncamento devido a pedido de bloqueio conflitante" +msgid "ROWS must be positive" +msgstr "ROWS deve ser positivo" -#: commands/vacuumlazy.c:1511 +#: commands/functioncmds.c:866 #, c-format -msgid "\"%s\": truncated %u to %u pages" -msgstr "\"%s\": truncadas %u em %u páginas" +msgid "no function body specified" +msgstr "corpo da função não foi especificado" -#: commands/vacuumlazy.c:1567 +#: commands/functioncmds.c:871 #, c-format -msgid "\"%s\": suspending truncate due to conflicting lock request" -msgstr "\"%s\": suspendendo truncamento devido a pedido de bloqueio conflitante" +msgid "duplicate function body specified" +msgstr "especificado corpo de função duplicado" -#: commands/variable.c:162 utils/misc/guc.c:9058 +#: commands/functioncmds.c:876 #, c-format -msgid "Unrecognized key word: \"%s\"." -msgstr "Palavra chave desconhecida: \"%s\"." +msgid "inline SQL function body only valid for language SQL" +msgstr "" -#: commands/variable.c:174 +#: commands/functioncmds.c:918 #, c-format -msgid "Conflicting \"datestyle\" specifications." -msgstr "Especificações conflitantes de \"datestyle\"" +msgid "SQL function with unquoted function body cannot have polymorphic arguments" +msgstr "função SQL com corpo de função não delimitado não pode ter argumento polimórfico" -#: commands/variable.c:296 +#: commands/functioncmds.c:944 commands/functioncmds.c:963 #, c-format -msgid "Cannot specify months in time zone interval." -msgstr "Não pode especificar meses em intervalo de zona horária." +msgid "%s is not yet supported in unquoted SQL function body" +msgstr "%s ainda não tem suporte no corpo da função SQL não delimitado" -#: commands/variable.c:302 +#: commands/functioncmds.c:991 #, c-format -msgid "Cannot specify days in time zone interval." -msgstr "Não pode especificar dias em intervalo de zona horária." +msgid "only one AS item needed for language \"%s\"" +msgstr "somente um item AS é necessário para linguagem \"%s\"" -#: commands/variable.c:344 commands/variable.c:426 +#: commands/functioncmds.c:1096 #, c-format -msgid "time zone \"%s\" appears to use leap seconds" -msgstr "zona horária \"%s\" parece utilizar segundos intercalados" +msgid "no language specified" +msgstr "nenhuma linguagem foi especificada" -#: commands/variable.c:346 commands/variable.c:428 +#: commands/functioncmds.c:1104 commands/functioncmds.c:2105 +#: commands/proclang.c:237 #, c-format -msgid "PostgreSQL does not support leap seconds." -msgstr "PostgreSQL não suporta segundos intercalados." +msgid "language \"%s\" does not exist" +msgstr "linguagem \"%s\" não existe" -#: commands/variable.c:355 +#: commands/functioncmds.c:1106 commands/functioncmds.c:2107 #, c-format -msgid "UTC timezone offset is out of range." -msgstr "deslocamento de zona horária UTC está fora do intervalo." +msgid "Use CREATE EXTENSION to load the language into the database." +msgstr "Use CREATE EXTENSION para carregar a linguagem no banco de dados." -#: commands/variable.c:493 +#: commands/functioncmds.c:1139 commands/functioncmds.c:1424 #, c-format -msgid "cannot set transaction read-write mode inside a read-only transaction" -msgstr "não pode definir modo leitura-escrita da transação dentro de uma transação somente leitura" +msgid "only superuser can define a leakproof function" +msgstr "somente um superusuário pode definir uma função com parâmetro leakproof" -#: commands/variable.c:500 +#: commands/functioncmds.c:1190 #, c-format -msgid "transaction read-write mode must be set before any query" -msgstr "modo leitura-escrita de transação deve ser definido antes de qualquer consulta" +msgid "function result type must be %s because of OUT parameters" +msgstr "tipo do resultado da função deve ser %s por causa dos parâmetros OUT" -#: commands/variable.c:507 +#: commands/functioncmds.c:1203 #, c-format -msgid "cannot set transaction read-write mode during recovery" -msgstr "não pode definir modo leitura-escrita de transação durante recuperação" +msgid "function result type must be specified" +msgstr "tipo do resultado da função deve ser especificado" -#: commands/variable.c:556 +#: commands/functioncmds.c:1256 commands/functioncmds.c:1444 #, c-format -msgid "SET TRANSACTION ISOLATION LEVEL must be called before any query" -msgstr "SET TRANSACTION ISOLATION LEVEL deve ser chamado antes de qualquer consulta" +msgid "ROWS is not applicable when function does not return a set" +msgstr "ROWS não é aplicável quando função não retorna um conjunto" -#: commands/variable.c:563 +#: commands/functioncmds.c:1547 #, c-format -msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" -msgstr "SET TRANSACTION ISOLATION LEVEL não deve ser chamado em uma subtransação" +msgid "source data type %s is a pseudo-type" +msgstr "tipo de dados fonte %s é um pseudo-tipo" -#: commands/variable.c:570 storage/lmgr/predicate.c:1588 +#: commands/functioncmds.c:1553 #, c-format -msgid "cannot use serializable mode in a hot standby" -msgstr "não pode utilizar modo serializável em um servidor em espera ativo" +msgid "target data type %s is a pseudo-type" +msgstr "tipo de dados de destino %s é um pseudo-tipo" -#: commands/variable.c:571 +#: commands/functioncmds.c:1577 #, c-format -msgid "You can use REPEATABLE READ instead." -msgstr "Você pode utilizar REPEATABLE READ ao invés disso." +msgid "cast will be ignored because the source data type is a domain" +msgstr "a conversão será ignorada, porque o tipo de dados fonte é um domínio" -#: commands/variable.c:619 +#: commands/functioncmds.c:1582 #, c-format -msgid "SET TRANSACTION [NOT] DEFERRABLE cannot be called within a subtransaction" -msgstr "SET TRANSACTION [NOT] DEFERRABLE não pode ser chamado em uma subtransação" +msgid "cast will be ignored because the target data type is a domain" +msgstr "a conversão será ignorada, porque o tipo de dados de destino é um domínio" -#: commands/variable.c:625 +#: commands/functioncmds.c:1607 #, c-format -msgid "SET TRANSACTION [NOT] DEFERRABLE must be called before any query" -msgstr "SET TRANSACTION [NOT] DEFERRABLE deve ser chamado antes de qualquer consulta" +msgid "cast function must take one to three arguments" +msgstr "função de conversão deve ter de um a três argumentos" -#: commands/variable.c:707 +#: commands/functioncmds.c:1613 #, c-format -msgid "Conversion between %s and %s is not supported." -msgstr "conversão entre %s e %s não é suportada." +msgid "argument of cast function must match or be binary-coercible from source data type" +msgstr "o argumento da função de conversão deve corresponder ou ser convertido no tipo de dados fonte" -#: commands/variable.c:714 +#: commands/functioncmds.c:1617 #, c-format -msgid "Cannot change \"client_encoding\" now." -msgstr "Não pode mudar \"client_encoding\" agora." +msgid "second argument of cast function must be type %s" +msgstr "o segundo argumento da função de conversão de tipo de dados deve ser do tipo %s" -#: commands/variable.c:884 +#: commands/functioncmds.c:1622 #, c-format -msgid "permission denied to set role \"%s\"" -msgstr "permissão negada ao definir role \"%s\"" +msgid "third argument of cast function must be type %s" +msgstr "o terceiro argumento da função de conversão de tipo de dados deve ser do tipo %s" -#: commands/view.c:54 +#: commands/functioncmds.c:1629 #, c-format -msgid "invalid value for \"check_option\" option" -msgstr "valor é inválido para opção \"check_option\"" +msgid "return data type of cast function must match or be binary-coercible to target data type" +msgstr "o tipo de dados retornado pela função de conversão deve corresponder ou ser convertido no tipo de dados do destino" -#: commands/view.c:55 +#: commands/functioncmds.c:1640 #, c-format -msgid "Valid values are \"local\" and \"cascaded\"." -msgstr "Valores válidos são \"local\" e \"cascaded\"." +msgid "cast function must not be volatile" +msgstr "função de conversão não deve ser volátil" -#: commands/view.c:114 +#: commands/functioncmds.c:1645 #, c-format -msgid "could not determine which collation to use for view column \"%s\"" -msgstr "não pôde determinar qual ordenação utilizar na coluna \"%s\" da visão" +msgid "cast function must be a normal function" +msgstr "a função de conversão de tipo de dados deve ser uma função normal" -#: commands/view.c:129 +#: commands/functioncmds.c:1649 #, c-format -msgid "view must have at least one column" -msgstr "visão deve ter pelo menos uma coluna" +msgid "cast function must not return a set" +msgstr "função de conversão não deve retornar um conjunto" -#: commands/view.c:260 commands/view.c:272 +#: commands/functioncmds.c:1675 #, c-format -msgid "cannot drop columns from view" -msgstr "não pode apagar colunas da visão" +msgid "must be superuser to create a cast WITHOUT FUNCTION" +msgstr "é necessário ser superusuário para criar uma conversão WITHOUT FUNCTION" -#: commands/view.c:277 +#: commands/functioncmds.c:1690 #, c-format -msgid "cannot change name of view column \"%s\" to \"%s\"" -msgstr "não pode mudar nome de coluna da visão \"%s\" para \"%s\"" +msgid "source and target data types are not physically compatible" +msgstr "tipos de dado fonte e alvo não são fisicamente compatíveis" -#: commands/view.c:285 +#: commands/functioncmds.c:1705 #, c-format -msgid "cannot change data type of view column \"%s\" from %s to %s" -msgstr "não pode mudar tipo de dado de coluna da visão \"%s\" de %s para %s" +msgid "composite data types are not binary-compatible" +msgstr "tipos de dado compostos não são compatíveis no formato binário" -#: commands/view.c:420 +#: commands/functioncmds.c:1711 #, c-format -msgid "views must not contain SELECT INTO" -msgstr "visões não devem conter SELECT INTO" +msgid "enum data types are not binary-compatible" +msgstr "tipos de dado enum não são compatíveis no formato binário" -#: commands/view.c:433 +#: commands/functioncmds.c:1717 #, c-format -msgid "views must not contain data-modifying statements in WITH" -msgstr "visões não devem conter comandos que modificam dados no WITH" +msgid "array data types are not binary-compatible" +msgstr "tipos de dado matriz não são compatíveis no formato binário" -#: commands/view.c:504 +#: commands/functioncmds.c:1734 #, c-format -msgid "CREATE VIEW specifies more column names than columns" -msgstr "CREATE VIEW especificou mais nomes de colunas do que colunas" +msgid "domain data types must not be marked binary-compatible" +msgstr "tipos de dado de domínio não devem ser marcados como compatíveis no formato binário" -#: commands/view.c:512 +#: commands/functioncmds.c:1744 #, c-format -msgid "views cannot be unlogged because they do not have storage" -msgstr "visões não podem ser unlogged porque elas não tem armazenamento" +msgid "source data type and target data type are the same" +msgstr "o tipo de dados de origem e tipo de dados de destino são o mesmo" -#: commands/view.c:526 +#: commands/functioncmds.c:1777 #, c-format -msgid "view \"%s\" will be a temporary view" -msgstr "visão \"%s\" será uma visão temporária" +msgid "transform function must not be volatile" +msgstr "a função de transformação não deve ser volátil" -#: executor/execCurrent.c:76 +#: commands/functioncmds.c:1781 #, c-format -msgid "cursor \"%s\" is not a SELECT query" -msgstr "cursor \"%s\" não é uma consulta SELECT" +msgid "transform function must be a normal function" +msgstr "a função de transformação deve ser uma função normal" -#: executor/execCurrent.c:82 +#: commands/functioncmds.c:1785 #, c-format -msgid "cursor \"%s\" is held from a previous transaction" -msgstr "cursor \"%s\" está aberto de uma transação anterior" +msgid "transform function must not return a set" +msgstr "a função de transformação não deve retornar conjunto" -#: executor/execCurrent.c:114 +#: commands/functioncmds.c:1789 #, c-format -msgid "cursor \"%s\" has multiple FOR UPDATE/SHARE references to table \"%s\"" -msgstr "cursor \"%s\" têm múltiplas referências FOR UPDATE/SHARE para tabela \"%s\"" +msgid "transform function must take one argument" +msgstr "a função de transformação deve receber um argumento" -#: executor/execCurrent.c:123 +#: commands/functioncmds.c:1793 #, c-format -msgid "cursor \"%s\" does not have a FOR UPDATE/SHARE reference to table \"%s\"" -msgstr "cursor \"%s\" não tem uma referência FOR UPDATE/SHARE para tabela \"%s\"" +msgid "first argument of transform function must be type %s" +msgstr "o primeiro argumento da função de transformação deve ser do tipo %s" -#: executor/execCurrent.c:133 executor/execCurrent.c:179 +#: commands/functioncmds.c:1832 #, c-format -msgid "cursor \"%s\" is not positioned on a row" -msgstr "cursor \"%s\" não está posicionado em um registro" +msgid "data type %s is a pseudo-type" +msgstr "o tipo de dados %s é um pseudotipo" -#: executor/execCurrent.c:166 +#: commands/functioncmds.c:1838 #, c-format -msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" -msgstr "cursor \"%s\" não é simplesmente uma busca atualizável da tabela \"%s\"" +msgid "data type %s is a domain" +msgstr "o tipo de dados %s é um domínio" -#: executor/execCurrent.c:231 executor/execQual.c:1160 +#: commands/functioncmds.c:1878 #, c-format -msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" -msgstr "tipo de parâmetro %d (%s) não corresponde aquele ao preparar o plano (%s)" +msgid "return data type of FROM SQL function must be %s" +msgstr "o tipo de dados retornado pela função FROM SQL deve ser %s" -#: executor/execCurrent.c:243 executor/execQual.c:1172 +#: commands/functioncmds.c:1904 #, c-format -msgid "no value found for parameter %d" -msgstr "nenhum valor encontrado para parâmetro %d" +msgid "return data type of TO SQL function must be the transform data type" +msgstr "o tipo de dados retornado pela função TO SQL deve ser o tipo de dados de transformação" -#: executor/execMain.c:955 +#: commands/functioncmds.c:1931 #, c-format -msgid "cannot change sequence \"%s\"" -msgstr "não pode mudar sequência \"%s\"" +msgid "transform for type %s language \"%s\" already exists" +msgstr "a transformação para o tipo %s na linguagem \"%s\" já existe" -#: executor/execMain.c:961 +#: commands/functioncmds.c:2017 #, c-format -msgid "cannot change TOAST relation \"%s\"" -msgstr "não pode mudar relação TOAST \"%s\"" +msgid "transform for type %s language \"%s\" does not exist" +msgstr "a transformação para o tipo %s na linguagem \"%s\" não existe" -#: executor/execMain.c:979 rewrite/rewriteHandler.c:2512 +#: commands/functioncmds.c:2041 #, c-format -msgid "cannot insert into view \"%s\"" -msgstr "não pode inserir na visão \"%s\"" +msgid "function %s already exists in schema \"%s\"" +msgstr "função %s já existe no esquema \"%s\"" -#: executor/execMain.c:981 rewrite/rewriteHandler.c:2515 +#: commands/functioncmds.c:2092 #, c-format -msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." -msgstr "Para habilitar a inserção em uma visão, forneça um gatilho INSTEAD OF INSERT ou uma regra incondicional ON INSERT DO INSTEAD." +msgid "no inline code specified" +msgstr "código incorporado não foi especificado" -#: executor/execMain.c:987 rewrite/rewriteHandler.c:2520 +#: commands/functioncmds.c:2138 #, c-format -msgid "cannot update view \"%s\"" -msgstr "não pode atualizar visão \"%s\"" +msgid "language \"%s\" does not support inline code execution" +msgstr "a linguagem \"%s\" não dá suporte a execução de código incorporado" -#: executor/execMain.c:989 rewrite/rewriteHandler.c:2523 +#: commands/functioncmds.c:2233 #, c-format -msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." -msgstr "Para habilitar a atualização em uma visão, forneça um gatilho INSTEAD OF UPDATE ou uma regra incondicional ON UPDATE DO INSTEAD." +msgid "cannot pass more than %d argument to a procedure" +msgid_plural "cannot pass more than %d arguments to a procedure" +msgstr[0] "não é possível passar mais de %d argumento para o procedimento" +msgstr[1] "não é possível passar mais de %d argumentos para o procedimento" -#: executor/execMain.c:995 rewrite/rewriteHandler.c:2528 +#: commands/indexcmds.c:640 #, c-format -msgid "cannot delete from view \"%s\"" -msgstr "não pode excluir da visão \"%s\"" +msgid "must specify at least one column" +msgstr "deve especificar pelo menos uma coluna" -#: executor/execMain.c:997 rewrite/rewriteHandler.c:2531 +#: commands/indexcmds.c:644 #, c-format -msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." -msgstr "Para habilitar a exclusão em uma visão, forneça um gatilho INSTEAD OF DELETE ou uma regra incondicional ON DELETE DO INSTEAD." +msgid "cannot use more than %d columns in an index" +msgstr "não é possível utilizar mais do que %d colunas em um índice" -#: executor/execMain.c:1008 +#: commands/indexcmds.c:687 #, c-format -msgid "cannot change materialized view \"%s\"" -msgstr "não pode mudar visão materializada \"%s\"" +msgid "cannot create index on relation \"%s\"" +msgstr "não é possível criar índice na relação \"%s\"" -#: executor/execMain.c:1020 +#: commands/indexcmds.c:713 #, c-format -msgid "cannot insert into foreign table \"%s\"" -msgstr "não pode inserir em tabela externa \"%s\"" +msgid "cannot create index on partitioned table \"%s\" concurrently" +msgstr "não é possível criar índice na tabela particionada \"%s\" concorrentemente" -#: executor/execMain.c:1026 +#: commands/indexcmds.c:718 #, c-format -msgid "foreign table \"%s\" does not allow inserts" -msgstr "tabela externa \"%s\" não permite inserções" +msgid "cannot create exclusion constraints on partitioned table \"%s\"" +msgstr "não é possível criar restrições de exclusão na tabela particionada \"%s\"" -#: executor/execMain.c:1033 +#: commands/indexcmds.c:728 #, c-format -msgid "cannot update foreign table \"%s\"" -msgstr "não pode atualizar tabela externa \"%s\"" +msgid "cannot create indexes on temporary tables of other sessions" +msgstr "não é possível criar índices em tabelas temporárias de outras sessões" -#: executor/execMain.c:1039 +#: commands/indexcmds.c:766 commands/tablecmds.c:784 commands/tablespace.c:1184 #, c-format -msgid "foreign table \"%s\" does not allow updates" -msgstr "tabela externa \"%s\" não permite atualizações" +msgid "cannot specify default tablespace for partitioned relations" +msgstr "não é possível especificar o espaço de tabelas padrão para relações particionadas" -#: executor/execMain.c:1046 +#: commands/indexcmds.c:798 commands/tablecmds.c:819 commands/tablecmds.c:3409 #, c-format -msgid "cannot delete from foreign table \"%s\"" -msgstr "não pode excluir da tabela externa \"%s\"" +msgid "only shared relations can be placed in pg_global tablespace" +msgstr "somente relações compartilhadas podem ser armazenadas no espaço de tabelas pg_global" -#: executor/execMain.c:1052 +#: commands/indexcmds.c:831 #, c-format -msgid "foreign table \"%s\" does not allow deletes" -msgstr "tabela externa \"%s\" não permite exclusões" +msgid "substituting access method \"gist\" for obsolete method \"rtree\"" +msgstr "substituindo método de acesso \"gist\" pelo método obsoleto \"rtree\"" -#: executor/execMain.c:1063 +#: commands/indexcmds.c:852 #, c-format -msgid "cannot change relation \"%s\"" -msgstr "não pode mudar relação \"%s\"" +msgid "access method \"%s\" does not support unique indexes" +msgstr "o método de acesso \"%s\" não dá suporte a índices únicos" -#: executor/execMain.c:1087 +#: commands/indexcmds.c:857 #, c-format -msgid "cannot lock rows in sequence \"%s\"" -msgstr "não pode bloquear registros na sequência \"%s\"" +msgid "access method \"%s\" does not support included columns" +msgstr "o método de acesso \"%s\" não dá suporte a colunas incluídas" -#: executor/execMain.c:1094 +#: commands/indexcmds.c:862 #, c-format -msgid "cannot lock rows in TOAST relation \"%s\"" -msgstr "não pode bloquear registros na relação TOAST \"%s\"" +msgid "access method \"%s\" does not support multicolumn indexes" +msgstr "o método de acesso \"%s\" não dá suporte a índices de múltiplas colunas" -#: executor/execMain.c:1101 +#: commands/indexcmds.c:867 #, c-format -msgid "cannot lock rows in view \"%s\"" -msgstr "não pode bloquear registros na visão \"%s\"" +msgid "access method \"%s\" does not support exclusion constraints" +msgstr "o método de acesso \"%s\" não dá suporte a restrições de exclusão" -#: executor/execMain.c:1109 +#: commands/indexcmds.c:994 #, c-format -msgid "cannot lock rows in materialized view \"%s\"" -msgstr "não pode bloquear registros na visão materializada \"%s\"" +msgid "cannot match partition key to an index using access method \"%s\"" +msgstr "" -#: executor/execMain.c:1116 +#: commands/indexcmds.c:1004 #, c-format -msgid "cannot lock rows in foreign table \"%s\"" -msgstr "não pode bloquear registros na tabela externa \"%s\"" +msgid "unsupported %s constraint with partition key definition" +msgstr "a restrição %s não tem suporte com definição de chave de partição" -#: executor/execMain.c:1122 +#: commands/indexcmds.c:1006 #, c-format -msgid "cannot lock rows in relation \"%s\"" -msgstr "não pôde bloquear registros na relação \"%s\"" +msgid "%s constraints cannot be used when partition keys include expressions." +msgstr "" -#: executor/execMain.c:1607 +#: commands/indexcmds.c:1048 #, c-format -msgid "null value in column \"%s\" violates not-null constraint" -msgstr "valor nulo na coluna \"%s\" viola a restrição não-nula" +msgid "unique constraint on partitioned table must include all partitioning columns" +msgstr "" -#: executor/execMain.c:1609 executor/execMain.c:1626 executor/execMain.c:1673 +#: commands/indexcmds.c:1049 #, c-format -msgid "Failing row contains %s." -msgstr "Registro que falhou contém %s." +msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." +msgstr "" -#: executor/execMain.c:1624 +#: commands/indexcmds.c:1068 commands/indexcmds.c:1087 #, c-format -msgid "new row for relation \"%s\" violates check constraint \"%s\"" -msgstr "novo registro da relação \"%s\" viola restrição de verificação \"%s\"" +msgid "index creation on system columns is not supported" +msgstr "a criação de índice em colunas do sistema não tem suporte" -#: executor/execMain.c:1671 +#: commands/indexcmds.c:1316 tcop/utility.c:1526 #, c-format -msgid "new row violates WITH CHECK OPTION for view \"%s\"" -msgstr "novo registro viola WITH CHECK OPTION para visão \"%s\"" +msgid "cannot create unique index on partitioned table \"%s\"" +msgstr "não é possível criar um índice de unicidade na tabela particionada \"%s\"" -#: executor/execQual.c:306 executor/execQual.c:334 executor/execQual.c:3157 -#: utils/adt/array_userfuncs.c:430 utils/adt/arrayfuncs.c:233 -#: utils/adt/arrayfuncs.c:531 utils/adt/arrayfuncs.c:1275 -#: utils/adt/arrayfuncs.c:2961 utils/adt/arrayfuncs.c:4986 +#: commands/indexcmds.c:1318 tcop/utility.c:1528 #, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "número de dimensões da matriz (%d) excede o máximo permitido (%d)" +msgid "Table \"%s\" contains partitions that are foreign tables." +msgstr "A tabela \"%s\" contém partições que são tabelas estrangeiras." -#: executor/execQual.c:319 executor/execQual.c:347 +#: commands/indexcmds.c:1803 #, c-format -msgid "array subscript in assignment must not be null" -msgstr "índice da matriz em atribuição não deve ser nulo" +msgid "functions in index predicate must be marked IMMUTABLE" +msgstr "funções em predicado de índice devem ser IMMUTABLE" -#: executor/execQual.c:642 executor/execQual.c:4078 +#: commands/indexcmds.c:1881 parser/parse_utilcmd.c:2513 +#: parser/parse_utilcmd.c:2648 #, c-format -msgid "attribute %d has wrong type" -msgstr "atributo %d tem tipo incorreto" +msgid "column \"%s\" named in key does not exist" +msgstr "coluna \"%s\" indicada na chave não existe" -#: executor/execQual.c:643 executor/execQual.c:4079 +#: commands/indexcmds.c:1905 parser/parse_utilcmd.c:1812 #, c-format -msgid "Table has type %s, but query expects %s." -msgstr "Tabela tem tipo %s, mas consulta espera %s." +msgid "expressions are not supported in included columns" +msgstr "expressões não têm suporte em colunas incluídas" -#: executor/execQual.c:836 executor/execQual.c:853 executor/execQual.c:1050 -#: executor/nodeModifyTable.c:85 executor/nodeModifyTable.c:95 -#: executor/nodeModifyTable.c:112 executor/nodeModifyTable.c:120 +#: commands/indexcmds.c:1946 #, c-format -msgid "table row type and query-specified row type do not match" -msgstr "tipo registro da tabela e tipo registro especificado na consulta não correspondem" +msgid "functions in index expression must be marked IMMUTABLE" +msgstr "funções em expressão de índice devem ser IMMUTABLE" -#: executor/execQual.c:837 +#: commands/indexcmds.c:1961 #, c-format -msgid "Table row contains %d attribute, but query expects %d." -msgid_plural "Table row contains %d attributes, but query expects %d." -msgstr[0] "Registro da tabela contém %d atributo, mas consulta espera %d." -msgstr[1] "Registro da tabela contém %d atributos, mas consulta espera %d." +msgid "including column does not support a collation" +msgstr "coluna incluída não dá suporte a ordenação" -#: executor/execQual.c:854 executor/nodeModifyTable.c:96 +#: commands/indexcmds.c:1965 #, c-format -msgid "Table has type %s at ordinal position %d, but query expects %s." -msgstr "Tabela tem tipo %s na posição ordinal %d, mas consulta espera %s." +msgid "including column does not support an operator class" +msgstr "coluna incluída não dá suporte a classe de operador" -#: executor/execQual.c:1051 executor/execQual.c:1647 +#: commands/indexcmds.c:1969 #, c-format -msgid "Physical storage mismatch on dropped attribute at ordinal position %d." -msgstr "Armazenamento físico não combina com atributo removido na posição ordinal %d." +msgid "including column does not support ASC/DESC options" +msgstr "coluna incluída não dá suporte às opções ASC/DESC" -#: executor/execQual.c:1326 parser/parse_func.c:114 parser/parse_func.c:535 -#: parser/parse_func.c:887 +#: commands/indexcmds.c:1973 #, c-format -msgid "cannot pass more than %d argument to a function" -msgid_plural "cannot pass more than %d arguments to a function" -msgstr[0] "não pode passar mais do que %d argumento para uma função" -msgstr[1] "não pode passar mais do que %d argumentos para uma função" +msgid "including column does not support NULLS FIRST/LAST options" +msgstr "coluna incluída não dá suporte às opções NULLS FIRST/LAST" -#: executor/execQual.c:1515 +#: commands/indexcmds.c:2014 #, c-format -msgid "functions and operators can take at most one set argument" -msgstr "funções e operadores podem receber no máximo um argumento do tipo conjunto" +msgid "could not determine which collation to use for index expression" +msgstr "não foi possível determinar qual ordenação utilizar para expressão do índice" -#: executor/execQual.c:1565 +#: commands/indexcmds.c:2022 commands/tablecmds.c:17489 commands/typecmds.c:807 +#: parser/parse_expr.c:2722 parser/parse_type.c:568 parser/parse_utilcmd.c:3774 +#: utils/adt/misc.c:586 #, c-format -msgid "function returning setof record called in context that cannot accept type record" -msgstr "função que retorna setof record foi chamada em um contexto que não pode aceitar tipo record" +msgid "collations are not supported by type %s" +msgstr "ordenações não são suportadas pelo tipo %s" -#: executor/execQual.c:1620 executor/execQual.c:1636 executor/execQual.c:1646 +#: commands/indexcmds.c:2087 #, c-format -msgid "function return row and query-specified return row do not match" -msgstr "registro de retorno da função e registro de retorno especificado na consulta não correspondem" +msgid "operator %s is not commutative" +msgstr "operador %s não é comutativo" -#: executor/execQual.c:1621 +#: commands/indexcmds.c:2089 #, c-format -msgid "Returned row contains %d attribute, but query expects %d." -msgid_plural "Returned row contains %d attributes, but query expects %d." -msgstr[0] "Registro retornado contém %d atributo, mas consulta espera %d." -msgstr[1] "Registro retornado contém %d atributos, mas consulta espera %d." +msgid "Only commutative operators can be used in exclusion constraints." +msgstr "Somente operadores comutativos pode ser utilizados em restrições de exclusão." -#: executor/execQual.c:1637 +#: commands/indexcmds.c:2115 #, c-format -msgid "Returned type %s at ordinal position %d, but query expects %s." -msgstr "Tipo retornado %s na posição ordinal %d, mas consulta espera %s." +msgid "operator %s is not a member of operator family \"%s\"" +msgstr "operador %s não é um membro da família de operador \"%s\"" -#: executor/execQual.c:1879 executor/execQual.c:2310 +#: commands/indexcmds.c:2118 #, c-format -msgid "table-function protocol for materialize mode was not followed" -msgstr "protocolo de função tabular para modo materializado não foi seguido" +msgid "The exclusion operator must be related to the index operator class for the constraint." +msgstr "O operador de exclusão deve estar relacionado à classe de operadores do índice para a restrição." -#: executor/execQual.c:1899 executor/execQual.c:2317 +#: commands/indexcmds.c:2153 #, c-format -msgid "unrecognized table-function returnMode: %d" -msgstr "modo de retorno (returnMode) da função tabular desconhecido: %d" +msgid "access method \"%s\" does not support ASC/DESC options" +msgstr "o método de acesso \"%s\" não dá suporte a opções ASC/DESC" -#: executor/execQual.c:2227 +#: commands/indexcmds.c:2158 #, c-format -msgid "function returning set of rows cannot return null value" -msgstr "função que retorna conjunto de registros não pode retornar valor nulo" +msgid "access method \"%s\" does not support NULLS FIRST/LAST options" +msgstr "o método de acesso \"%s\" não dá suporte a opções NULLS FIRST/LAST" -#: executor/execQual.c:2284 +#: commands/indexcmds.c:2204 commands/tablecmds.c:17514 +#: commands/tablecmds.c:17520 commands/typecmds.c:2301 #, c-format -msgid "rows returned by function are not all of the same row type" -msgstr "registros retornados pela função não são todos do mesmo tipo registro" +msgid "data type %s has no default operator class for access method \"%s\"" +msgstr "o tipo de dados %s não tem uma classe de operadores padrão para o método de acesso \"%s\"" -#: executor/execQual.c:2499 +#: commands/indexcmds.c:2206 #, c-format -msgid "IS DISTINCT FROM does not support set arguments" -msgstr "IS DISTINCT FROM não suporta conjunto de argumentos" +msgid "You must specify an operator class for the index or define a default operator class for the data type." +msgstr "Você deve especificar uma classe de operadores para o índice ou definir uma classe de operadores padrão para o tipo de dado." -#: executor/execQual.c:2576 +#: commands/indexcmds.c:2235 commands/indexcmds.c:2243 +#: commands/opclasscmds.c:205 #, c-format -msgid "op ANY/ALL (array) does not support set arguments" -msgstr "op ANY/ALL (array) não suporta conjunto de argumentos" +msgid "operator class \"%s\" does not exist for access method \"%s\"" +msgstr "classe de operadores \"%s\" não existe para método de acesso \"%s\"" -#: executor/execQual.c:3135 +#: commands/indexcmds.c:2257 commands/typecmds.c:2289 #, c-format -msgid "cannot merge incompatible arrays" -msgstr "não pode mesclar matrizes incompatíveis" +msgid "operator class \"%s\" does not accept data type %s" +msgstr "a classe de operadores \"%s\" não aceita o tipo de dados %s" -#: executor/execQual.c:3136 +#: commands/indexcmds.c:2347 #, c-format -msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." -msgstr "Matriz com tipo de elemento %s não pode ser incluído em uma construção ARRAY com tipo de elemento %s." +msgid "there are multiple default operator classes for data type %s" +msgstr "há múltiplas classes de operador padrão para o tipo de dados %s" -#: executor/execQual.c:3177 executor/execQual.c:3204 +#: commands/indexcmds.c:2675 #, c-format -msgid "multidimensional arrays must have array expressions with matching dimensions" -msgstr "matrizes multidimensionais devem ter expressões de matriz com dimensões correspondentes" +msgid "unrecognized REINDEX option \"%s\"" +msgstr "opção de REINDEX não reconhecida \"%s\"" -#: executor/execQual.c:3719 +#: commands/indexcmds.c:2899 #, c-format -msgid "NULLIF does not support set arguments" -msgstr "NULLIF não suporta conjunto de argumentos" +msgid "table \"%s\" has no indexes that can be reindexed concurrently" +msgstr "" -#: executor/execQual.c:3949 utils/adt/domains.c:131 +#: commands/indexcmds.c:2913 #, c-format -msgid "domain %s does not allow null values" -msgstr "domínio %s não permite valores nulos" +msgid "table \"%s\" has no indexes to reindex" +msgstr "a tabela \"%s\" não possui índices para reindexar" -#: executor/execQual.c:3979 utils/adt/domains.c:168 +#: commands/indexcmds.c:2958 commands/indexcmds.c:3468 +#: commands/indexcmds.c:3596 #, c-format -msgid "value for domain %s violates check constraint \"%s\"" -msgstr "valor para domínio %s viola restrição de verificação \"%s\"" +msgid "cannot reindex system catalogs concurrently" +msgstr "não é possível reindexar catálogos do sistema concorrentemente" -#: executor/execQual.c:4337 +#: commands/indexcmds.c:2981 #, c-format -msgid "WHERE CURRENT OF is not supported for this table type" -msgstr "WHERE CURRENT OF não é suportado para esse tipo de tabela" +msgid "can only reindex the currently open database" +msgstr "só pode reindexar o banco de dados atualmente aberto" -#: executor/execQual.c:4484 parser/parse_agg.c:434 parser/parse_agg.c:464 +#: commands/indexcmds.c:3075 #, c-format -msgid "aggregate function calls cannot be nested" -msgstr "chamadas de função de agregação não podem ser aninhadas" +msgid "cannot reindex system catalogs concurrently, skipping all" +msgstr "não é possível reindexar catálogos do sistemas concorrentemente, ignorando todos" -#: executor/execQual.c:4524 parser/parse_agg.c:565 +#: commands/indexcmds.c:3108 #, c-format -msgid "window function calls cannot be nested" -msgstr "chamadas de função deslizante não podem ser aninhadas" +msgid "cannot move system relations, skipping all" +msgstr "não é possível mover relações do sistema, ignorando todas" -#: executor/execQual.c:4736 +#: commands/indexcmds.c:3154 #, c-format -msgid "target type is not an array" -msgstr "tipo alvo não é uma matriz" +msgid "while reindexing partitioned table \"%s.%s\"" +msgstr "enquanto reindexando a tabela particionada \"%s.%s\"" -#: executor/execQual.c:4851 +#: commands/indexcmds.c:3157 #, c-format -msgid "ROW() column has type %s instead of type %s" -msgstr "coluna ROW() tem tipo %s ao invés do tipo %s" +msgid "while reindexing partitioned index \"%s.%s\"" +msgstr "enquanto reindexando o índice particionado \"%s.%s\"" -#: executor/execQual.c:4986 utils/adt/arrayfuncs.c:3424 -#: utils/adt/rowtypes.c:921 +#: commands/indexcmds.c:3348 commands/indexcmds.c:4204 #, c-format -msgid "could not identify a comparison function for type %s" -msgstr "não pôde identificar uma função de comparação para tipo %s" +msgid "table \"%s.%s\" was reindexed" +msgstr "tabela \"%s.%s\" foi reindexada" -#: executor/execUtils.c:844 +#: commands/indexcmds.c:3500 commands/indexcmds.c:3552 #, c-format -msgid "materialized view \"%s\" has not been populated" -msgstr "visão materializada \"%s\" não foi preenchida" +msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" +msgstr "não é possível reindexar o índice inválido \"%s.%s\" concorrentemente, ignorando" -#: executor/execUtils.c:846 +#: commands/indexcmds.c:3506 #, c-format -msgid "Use the REFRESH MATERIALIZED VIEW command." -msgstr "Utilize o comando REFRESH MATERIALIZED VIEW." +msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" +msgstr "não é possível reindexar o índice de restrição de exclusão \"%s.%s\" concorrentemente, ignorando" -#: executor/execUtils.c:1324 +#: commands/indexcmds.c:3661 #, c-format -msgid "could not create exclusion constraint \"%s\"" -msgstr "não pôde criar restrição de exclusão \"%s\"" +msgid "cannot reindex this type of relation concurrently" +msgstr "não é possível reindexar esse tipo de relação concorrentemente" -#: executor/execUtils.c:1326 +#: commands/indexcmds.c:3682 #, c-format -msgid "Key %s conflicts with key %s." -msgstr "Chave %s conflita com chave %s." +msgid "cannot move non-shared relation to tablespace \"%s\"" +msgstr "não é possível mover a relação não compartilhada para o espaços de tabelas \"%s\"" -#: executor/execUtils.c:1333 +#: commands/indexcmds.c:4185 commands/indexcmds.c:4197 #, c-format -msgid "conflicting key value violates exclusion constraint \"%s\"" -msgstr "conflitar valor da chave viola a restrição de exclusão \"%s\"" +msgid "index \"%s.%s\" was reindexed" +msgstr "o índice \"%s.%s\" foi reindexado" -#: executor/execUtils.c:1335 +#: commands/indexcmds.c:4187 commands/indexcmds.c:4206 #, c-format -msgid "Key %s conflicts with existing key %s." -msgstr "Chave %s conflita com chave existente %s." +msgid "%s." +msgstr "%s." -#: executor/functions.c:225 +#: commands/lockcmds.c:92 #, c-format -msgid "could not determine actual type of argument declared %s" -msgstr "não pôde determinar tipo de argumento declarado %s" +msgid "cannot lock relation \"%s\"" +msgstr "não é possível bloquear a relação \"%s\"" -#. translator: %s is a SQL statement name -#: executor/functions.c:506 +#: commands/matview.c:193 #, c-format -msgid "%s is not allowed in a SQL function" -msgstr "%s não é permitido em uma função SQL" +msgid "CONCURRENTLY cannot be used when the materialized view is not populated" +msgstr "CONCURRENTLY não pode ser utilizado quando a visão materializada não estiver povoada" -#. translator: %s is a SQL statement name -#: executor/functions.c:513 executor/spi.c:1343 executor/spi.c:2129 +#: commands/matview.c:199 gram.y:18306 #, c-format -msgid "%s is not allowed in a non-volatile function" -msgstr "%s não é permitido em uma função não-volátil" +msgid "%s and %s options cannot be used together" +msgstr "As opções %s e %s não podem ser usadas juntas" -#: executor/functions.c:638 +#: commands/matview.c:256 #, c-format -msgid "could not determine actual result type for function declared to return type %s" -msgstr "não pôde determinar tipo de resultado para função declarada que retorna tipo %s" +msgid "cannot refresh materialized view \"%s\" concurrently" +msgstr "não é possível atualizar a visão materializada \"%s\" concorrentemente" -#: executor/functions.c:1402 +#: commands/matview.c:259 #, c-format -msgid "SQL function \"%s\" statement %d" -msgstr "função SQL \"%s\" comando %d" +msgid "Create a unique index with no WHERE clause on one or more columns of the materialized view." +msgstr "Crie um índice único sem cláusula WHERE em uma ou mais colunas da visão materializada." -#: executor/functions.c:1428 +#: commands/matview.c:653 #, c-format -msgid "SQL function \"%s\" during startup" -msgstr "função SQL \"%s\" durante inicialização" +msgid "new data for materialized view \"%s\" contains duplicate rows without any null columns" +msgstr "os novos dados para a visão materializada \"%s\" contêm linhas duplicadas sem colunas nulas" -#: executor/functions.c:1587 executor/functions.c:1624 -#: executor/functions.c:1636 executor/functions.c:1749 -#: executor/functions.c:1782 executor/functions.c:1812 +#: commands/matview.c:655 #, c-format -msgid "return type mismatch in function declared to return %s" -msgstr "tipo de retorno não corresponde com o que foi declarado %s na função" +msgid "Row: %s" +msgstr "Registro: %s" -#: executor/functions.c:1589 +#: commands/opclasscmds.c:124 #, c-format -msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." -msgstr "Último comando da função deve ser um SELECT ou INSERT/UPDATE/DELETE RETURNING." +msgid "operator family \"%s\" does not exist for access method \"%s\"" +msgstr "família de operador \"%s\" não existe para método de acesso \"%s\"" -#: executor/functions.c:1626 +#: commands/opclasscmds.c:267 #, c-format -msgid "Final statement must return exactly one column." -msgstr "Último comando deve retornar exatamente uma coluna." +msgid "operator family \"%s\" for access method \"%s\" already exists" +msgstr "família de operador \"%s\" para método de acesso \"%s\" já existe" -#: executor/functions.c:1638 +#: commands/opclasscmds.c:416 #, c-format -msgid "Actual return type is %s." -msgstr "Tipo atual de retorno é %s." +msgid "must be superuser to create an operator class" +msgstr "é necessário ser superusuário para criar uma classe de operadores" -#: executor/functions.c:1751 +#: commands/opclasscmds.c:493 commands/opclasscmds.c:910 +#: commands/opclasscmds.c:1056 #, c-format -msgid "Final statement returns too many columns." -msgstr "Último comando retornou muitas colunas." +msgid "invalid operator number %d, must be between 1 and %d" +msgstr "o número de operadores %d não é válido, deve ser entre 1 e %d" -#: executor/functions.c:1784 +#: commands/opclasscmds.c:538 commands/opclasscmds.c:960 +#: commands/opclasscmds.c:1072 #, c-format -msgid "Final statement returns %s instead of %s at column %d." -msgstr "Último comando retornou %s ao invés de %s na coluna %d." +msgid "invalid function number %d, must be between 1 and %d" +msgstr "número de função inválido %d, deve estar entre 1 e %d" -#: executor/functions.c:1814 +#: commands/opclasscmds.c:567 #, c-format -msgid "Final statement returns too few columns." -msgstr "Último comando retornou poucas colunas." +msgid "storage type specified more than once" +msgstr "tipo de armazenamento especificado mais de uma vez" -#: executor/functions.c:1863 +#: commands/opclasscmds.c:594 #, c-format -msgid "return type %s is not supported for SQL functions" -msgstr "tipo de retorno %s não é suportado pelas funções SQL" +msgid "storage type cannot be different from data type for access method \"%s\"" +msgstr "o tipo de dados de armazenamento não pode ser diferente do tipo de dados para o método de acesso \"%s\"" -#: executor/nodeAgg.c:1865 executor/nodeWindowAgg.c:2285 +#: commands/opclasscmds.c:610 #, c-format -msgid "aggregate %u needs to have compatible input type and transition type" -msgstr "agregação %u precisa ter tipo de entrada e tipo transitório compatíveis" +msgid "operator class \"%s\" for access method \"%s\" already exists" +msgstr "classe de operadores \"%s\" para método de acesso \"%s\" já existe" -#: executor/nodeHashjoin.c:823 executor/nodeHashjoin.c:853 +#: commands/opclasscmds.c:638 #, c-format -msgid "could not rewind hash-join temporary file: %m" -msgstr "não pôde voltar ao início do arquivo temporário de junção por hash: %m" +msgid "could not make operator class \"%s\" be default for type %s" +msgstr "não foi possível fazer classe de operadores \"%s\" ser a padrão para tipo %s" -#: executor/nodeHashjoin.c:888 executor/nodeHashjoin.c:894 +#: commands/opclasscmds.c:641 #, c-format -msgid "could not write to hash-join temporary file: %m" -msgstr "não pôde escrever em arquivo temporário de junção por hash: %m" +msgid "Operator class \"%s\" already is the default." +msgstr "Classe de operadores \"%s\" já é a padrão." -#: executor/nodeHashjoin.c:928 executor/nodeHashjoin.c:938 +#: commands/opclasscmds.c:801 #, c-format -msgid "could not read from hash-join temporary file: %m" -msgstr "não pôde ler do arquivo temporário de junção por hash: %m" +msgid "must be superuser to create an operator family" +msgstr "é necessário ser superusuário para criar uma família de operador" -#: executor/nodeLimit.c:253 +#: commands/opclasscmds.c:861 #, c-format -msgid "OFFSET must not be negative" -msgstr "OFFSET não deve ser negativo" +msgid "must be superuser to alter an operator family" +msgstr "é necessário ser superusuário para alterar uma família de operador" -#: executor/nodeLimit.c:280 +#: commands/opclasscmds.c:919 #, c-format -msgid "LIMIT must not be negative" -msgstr "LIMIT não deve ser negativo" +msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" +msgstr "tipos dos argumentos do operador devem ser especificados em ALTER OPERATOR FAMILY" -#: executor/nodeMergejoin.c:1576 +#: commands/opclasscmds.c:994 #, c-format -msgid "RIGHT JOIN is only supported with merge-joinable join conditions" -msgstr "RIGHT JOIN só é suportado com condições de junção que podem ser utilizadas com junção por mesclagem" +msgid "STORAGE cannot be specified in ALTER OPERATOR FAMILY" +msgstr "STORAGE não pode ser especificado em ALTER OPERATOR FAMILY" -#: executor/nodeMergejoin.c:1596 +#: commands/opclasscmds.c:1128 #, c-format -msgid "FULL JOIN is only supported with merge-joinable join conditions" -msgstr "FULL JOIN só é suportado com condições de junção que podem ser utilizadas com junção por mesclagem" +msgid "one or two argument types must be specified" +msgstr "um ou dois tipos de argumento devem ser especificados" -#: executor/nodeModifyTable.c:86 +#: commands/opclasscmds.c:1154 #, c-format -msgid "Query has too many columns." -msgstr "Consulta tem muitas colunas." +msgid "index operators must be binary" +msgstr "operadores de índice devem ser binários" -#: executor/nodeModifyTable.c:113 +#: commands/opclasscmds.c:1173 #, c-format -msgid "Query provides a value for a dropped column at ordinal position %d." -msgstr "Consulta fornece um valor para uma coluna removida na posição ordinal %d." +msgid "access method \"%s\" does not support ordering operators" +msgstr "o método de acesso \"%s\" não dá suporte a operadores de ordenação" -#: executor/nodeModifyTable.c:121 +#: commands/opclasscmds.c:1184 #, c-format -msgid "Query has too few columns." -msgstr "Consulta tem poucas colunas." +msgid "index search operators must return boolean" +msgstr "operadores de busca no índice devem retornar booleano" -#: executor/nodeSubplan.c:304 executor/nodeSubplan.c:343 -#: executor/nodeSubplan.c:970 +#: commands/opclasscmds.c:1224 #, c-format -msgid "more than one row returned by a subquery used as an expression" -msgstr "mais de um registro foi retornado por uma subconsulta utilizada como uma expressão" +msgid "associated data types for operator class options parsing functions must match opclass input type" +msgstr "" -#: executor/nodeWindowAgg.c:353 +#: commands/opclasscmds.c:1231 #, c-format -msgid "moving-aggregate transition function must not return null" -msgstr "função de transição de agregação em movimento não deve retornar nulo" +msgid "left and right associated data types for operator class options parsing functions must match" +msgstr "os tipos de dados associados à esquerda e à direita para funções de análise de opções de classe de operador devem corresponder" -#: executor/nodeWindowAgg.c:1609 +#: commands/opclasscmds.c:1239 #, c-format -msgid "frame starting offset must not be null" -msgstr "deslocamento inicial de quadro não deve ser nulo" +msgid "invalid operator class options parsing function" +msgstr "função de análise de opções de classe de operador inválida" -#: executor/nodeWindowAgg.c:1622 +#: commands/opclasscmds.c:1240 #, c-format -msgid "frame starting offset must not be negative" -msgstr "deslocamento inicial de quadro não deve ser negativo" +msgid "Valid signature of operator class options parsing function is %s." +msgstr "" -#: executor/nodeWindowAgg.c:1635 +#: commands/opclasscmds.c:1259 #, c-format -msgid "frame ending offset must not be null" -msgstr "deslocamento final de quadro não deve ser nulo" +msgid "btree comparison functions must have two arguments" +msgstr "as funções de comparação de Ãrvore-B devem ter dois argumentos" -#: executor/nodeWindowAgg.c:1648 +#: commands/opclasscmds.c:1263 #, c-format -msgid "frame ending offset must not be negative" -msgstr "deslocamento final de quadro não deve ser negativo" +msgid "btree comparison functions must return integer" +msgstr "as funções de comparação de Ãrvore-B devem retornar um número inteiro" -#: executor/spi.c:213 +#: commands/opclasscmds.c:1280 #, c-format -msgid "transaction left non-empty SPI stack" -msgstr "transação não deixou pilha SPI vazia" +msgid "btree sort support functions must accept type \"internal\"" +msgstr "as funções de suporte de classificação de Ãrvore-B devem aceitar o tipo \"internal\"" -#: executor/spi.c:214 executor/spi.c:278 +#: commands/opclasscmds.c:1284 #, c-format -msgid "Check for missing \"SPI_finish\" calls." -msgstr "Verifique a ausência de chamadas \"SPI_finish\"." +msgid "btree sort support functions must return void" +msgstr "as funções de suporte de classificação de Ãrvore-B devem retornar void" -#: executor/spi.c:277 +#: commands/opclasscmds.c:1295 #, c-format -msgid "subtransaction left non-empty SPI stack" -msgstr "subtransação não deixou pilha SPI vazia" +msgid "btree in_range functions must have five arguments" +msgstr "as funções in_range de Ãrvore-B devem ter cinco argumentos" -#: executor/spi.c:1207 +#: commands/opclasscmds.c:1299 #, c-format -msgid "cannot open multi-query plan as cursor" -msgstr "não pode abrir plano de múltiplas consultas como cursor" +msgid "btree in_range functions must return boolean" +msgstr "as funções in_range de Ãrvore-B devem retornar um valor booleano" -#. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1212 +#: commands/opclasscmds.c:1315 #, c-format -msgid "cannot open %s query as cursor" -msgstr "não pode abrir consulta %s como cursor" +msgid "btree equal image functions must have one argument" +msgstr "as funções de imagem igual de Ãrvore-B devem ter um argumento" -#: executor/spi.c:1320 +#: commands/opclasscmds.c:1319 #, c-format -msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" -msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE não é suportado" +msgid "btree equal image functions must return boolean" +msgstr "as funções de imagem igual de Ãrvore-B devem retornar um valor booleano" -#: executor/spi.c:1321 parser/analyze.c:2128 +#: commands/opclasscmds.c:1332 #, c-format -msgid "Scrollable cursors must be READ ONLY." -msgstr "Cursores roláveis devem ser READ ONLY." +msgid "btree equal image functions must not be cross-type" +msgstr "as funções de imagem igual de Ãrvore-B não deve ser de tipo cruzado" -#: executor/spi.c:2419 +#: commands/opclasscmds.c:1342 #, c-format -msgid "SQL statement \"%s\"" -msgstr "comando SQL \"%s\"" +msgid "hash function 1 must have one argument" +msgstr "a função de hash 1 deve ter um argumento" -#: foreign/foreign.c:192 +#: commands/opclasscmds.c:1346 #, c-format -msgid "user mapping not found for \"%s\"" -msgstr "mapeamento de usuários não foi encontrado para \"%s\"" +msgid "hash function 1 must return integer" +msgstr "a função de hash 1 deve retornar um número inteiro" -#: foreign/foreign.c:348 +#: commands/opclasscmds.c:1353 #, c-format -msgid "foreign-data wrapper \"%s\" has no handler" -msgstr "adaptador de dados externos \"%s\" não possui manipulador" +msgid "hash function 2 must have two arguments" +msgstr "a função de hash 2 deve ter dois argumentos" -#: foreign/foreign.c:573 +#: commands/opclasscmds.c:1357 #, c-format -msgid "invalid option \"%s\"" -msgstr "opção \"%s\" é inválida" +msgid "hash function 2 must return bigint" +msgstr "a função de hash 2 deve deve retornar bigint" -#: foreign/foreign.c:574 +#: commands/opclasscmds.c:1382 #, c-format -msgid "Valid options in this context are: %s" -msgstr "Opções válidas nesse contexto são: %s" +msgid "associated data types must be specified for index support function" +msgstr "devem ser especificados tipos de dados associados para função de suporte de índice" -#: gram.y:956 +#: commands/opclasscmds.c:1407 #, c-format -msgid "unrecognized role option \"%s\"" -msgstr "opção de role desconhecida \"%s\"" +msgid "function number %d for (%s,%s) appears more than once" +msgstr "o número de função %d para (%s,%s) aparece mais de uma vez" -#: gram.y:1238 gram.y:1253 +#: commands/opclasscmds.c:1414 #, c-format -msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" -msgstr "CREATE SCHEMA IF NOT EXISTS não pode incluir elementos do esquema" +msgid "operator number %d for (%s,%s) appears more than once" +msgstr "operador número %d para (%s,%s) aparece mais de uma vez" -#: gram.y:1398 +#: commands/opclasscmds.c:1460 #, c-format -msgid "current database cannot be changed" -msgstr "banco de dados atual não pode ser mudado" +msgid "operator %d(%s,%s) already exists in operator family \"%s\"" +msgstr "operador %d(%s,%s) já existe na família de operador \"%s\"" -#: gram.y:1522 gram.y:1537 +#: commands/opclasscmds.c:1566 #, c-format -msgid "time zone interval must be HOUR or HOUR TO MINUTE" -msgstr "intervalo de zona horária deve ser HOUR ou HOUR TO MINUTE" +msgid "function %d(%s,%s) already exists in operator family \"%s\"" +msgstr "função %d(%s,%s) já existe na família de operador \"%s\"" -#: gram.y:1542 gram.y:10351 gram.y:12688 +#: commands/opclasscmds.c:1647 #, c-format -msgid "interval precision specified twice" -msgstr "precisão de interval foi especificada duas vezes" +msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" +msgstr "operador %d(%s,%s) não existe na família de operador \"%s\"" -#: gram.y:2511 gram.y:2540 +#: commands/opclasscmds.c:1687 #, c-format -msgid "STDIN/STDOUT not allowed with PROGRAM" -msgstr "STDIN/STDOUT não é permitido com PROGRAM" +msgid "function %d(%s,%s) does not exist in operator family \"%s\"" +msgstr "função %d(%s,%s) não existe na família de operador \"%s\"" -#: gram.y:2802 gram.y:2809 gram.y:9589 gram.y:9597 +#: commands/opclasscmds.c:1718 #, c-format -msgid "GLOBAL is deprecated in temporary table creation" -msgstr "GLOBAL está obsoleto na criação de tabela temporária" +msgid "operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"" +msgstr "classe de operadores \"%s\" para método de acesso \"%s\" já existe no esquema \"%s\"" -#: gram.y:3248 utils/adt/ri_triggers.c:310 utils/adt/ri_triggers.c:367 -#: utils/adt/ri_triggers.c:786 utils/adt/ri_triggers.c:1009 -#: utils/adt/ri_triggers.c:1165 utils/adt/ri_triggers.c:1346 -#: utils/adt/ri_triggers.c:1511 utils/adt/ri_triggers.c:1687 -#: utils/adt/ri_triggers.c:1867 utils/adt/ri_triggers.c:2058 -#: utils/adt/ri_triggers.c:2116 utils/adt/ri_triggers.c:2221 -#: utils/adt/ri_triggers.c:2386 +#: commands/opclasscmds.c:1741 #, c-format -msgid "MATCH PARTIAL not yet implemented" -msgstr "MATCH PARTIAL ainda não foi implementado" - -#: gram.y:4482 -msgid "duplicate trigger events specified" -msgstr "eventos de gatilho duplicados especificados" +msgid "operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"" +msgstr "família de operador \"%s\" para método de acesso \"%s\" já existe no esquema \"%s\"" -#: gram.y:4577 parser/parse_utilcmd.c:2569 parser/parse_utilcmd.c:2595 +#: commands/operatorcmds.c:113 commands/operatorcmds.c:121 #, c-format -msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" -msgstr "restrição declarada INITIALLY DEFERRED deve ser DEFERRABLE" +msgid "SETOF type not allowed for operator argument" +msgstr "tipo SETOF não é permitido como argumento de operador" -#: gram.y:4584 +#: commands/operatorcmds.c:154 commands/operatorcmds.c:481 #, c-format -msgid "conflicting constraint properties" -msgstr "propriedades de restrições conflitantes" +msgid "operator attribute \"%s\" not recognized" +msgstr "atributo de operador \"%s\" desconhecido" -#: gram.y:4716 +#: commands/operatorcmds.c:165 #, c-format -msgid "CREATE ASSERTION is not yet implemented" -msgstr "CREATE ASSERTION ainda não foi implementado" +msgid "operator function must be specified" +msgstr "é necessário ser especificada a função do operador" -#: gram.y:4732 +#: commands/operatorcmds.c:183 #, c-format -msgid "DROP ASSERTION is not yet implemented" -msgstr "DROP ASSERTION ainda não foi implementado" +msgid "operator argument types must be specified" +msgstr "devem ser especificados os tipos de argumento do operador" -#: gram.y:5078 +#: commands/operatorcmds.c:187 #, c-format -msgid "RECHECK is no longer required" -msgstr "RECHECK não é mais requerido" +msgid "operator right argument type must be specified" +msgstr "é necessário ser especificado o tipo de dados do argumento direito do operador" -#: gram.y:5079 +#: commands/operatorcmds.c:188 #, c-format -msgid "Update your data type." -msgstr "Atualize seu tipo de dado." +msgid "Postfix operators are not supported." +msgstr "Operadores Postfix não têm suporte." -#: gram.y:6540 +#: commands/operatorcmds.c:292 #, c-format -msgid "aggregates cannot have output arguments" -msgstr "agregações não podem ter argumentos de saída" +msgid "restriction estimator function %s must return type %s" +msgstr "a função estimadora de restrição %s deve retornar o tipo de dados %s" -#: gram.y:6846 utils/adt/regproc.c:738 utils/adt/regproc.c:779 +#: commands/operatorcmds.c:335 #, c-format -msgid "missing argument" -msgstr "faltando argumento" +msgid "join estimator function %s has multiple matches" +msgstr "a função estimadora de junção %s tem múltiplas correspondências" -#: gram.y:6847 utils/adt/regproc.c:739 utils/adt/regproc.c:780 +#: commands/operatorcmds.c:350 #, c-format -msgid "Use NONE to denote the missing argument of a unary operator." -msgstr "Utilize NONE para denotar argumento ausente de um operador unário." +msgid "join estimator function %s must return type %s" +msgstr "a função estimadora de junção %s deve retornar o tipo de dados %s" -#: gram.y:8236 gram.y:8254 +#: commands/operatorcmds.c:475 #, c-format -msgid "WITH CHECK OPTION not supported on recursive views" -msgstr "WITH CHECK OPTION não é suportado em visões recursivas" +msgid "operator attribute \"%s\" cannot be changed" +msgstr "o atributo do operador \"%s\" não pode ser mudado" -#: gram.y:9234 +#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 +#: commands/tablecmds.c:1616 commands/tablecmds.c:2219 +#: commands/tablecmds.c:3520 commands/tablecmds.c:6369 +#: commands/tablecmds.c:9185 commands/tablecmds.c:17076 +#: commands/tablecmds.c:17111 commands/trigger.c:323 commands/trigger.c:1339 +#: commands/trigger.c:1449 rewrite/rewriteDefine.c:275 +#: rewrite/rewriteDefine.c:786 rewrite/rewriteRemove.c:80 #, c-format -msgid "number of columns does not match number of values" -msgstr "número de colunas não corresponde ao número de valores" +msgid "permission denied: \"%s\" is a system catalog" +msgstr "permissão negada: \"%s\" é um catálogo do sistema" -#: gram.y:9693 +#: commands/policy.c:172 #, c-format -msgid "LIMIT #,# syntax is not supported" -msgstr "sintaxe LIMIT #,# não é suportada" +msgid "ignoring specified roles other than PUBLIC" +msgstr "" -#: gram.y:9694 +#: commands/policy.c:173 #, c-format -msgid "Use separate LIMIT and OFFSET clauses." -msgstr "Utilize cláusulas LIMIT e OFFSET separadas." +msgid "All roles are members of the PUBLIC role." +msgstr "" -#: gram.y:9882 gram.y:9907 +#: commands/policy.c:606 #, c-format -msgid "VALUES in FROM must have an alias" -msgstr "VALUES no FROM deve ter um aliás" +msgid "WITH CHECK cannot be applied to SELECT or DELETE" +msgstr "WITH CHECK não pode ser aplicado a SELECT ou DELETE" -#: gram.y:9883 gram.y:9908 +#: commands/policy.c:615 commands/policy.c:918 #, c-format -msgid "For example, FROM (VALUES ...) [AS] foo." -msgstr "Por exemplo, FROM (VALUES ...) [AS] foo." +msgid "only WITH CHECK expression allowed for INSERT" +msgstr "" -#: gram.y:9888 gram.y:9913 +#: commands/policy.c:689 commands/policy.c:1141 #, c-format -msgid "subquery in FROM must have an alias" -msgstr "subconsulta no FROM deve ter um aliás" +msgid "policy \"%s\" for table \"%s\" already exists" +msgstr "a política \"%s\" para a tabela \"%s\" já existe" -#: gram.y:9889 gram.y:9914 +#: commands/policy.c:890 commands/policy.c:1169 commands/policy.c:1240 #, c-format -msgid "For example, FROM (SELECT ...) [AS] foo." -msgstr "Por exemplo, FROM (SELECT ...) [AS] foo." +msgid "policy \"%s\" for table \"%s\" does not exist" +msgstr "não existe a política \"%s\" para a tabela \"%s\"" -#: gram.y:10477 +#: commands/policy.c:908 #, c-format -msgid "precision for type float must be at least 1 bit" -msgstr "precisão para tipo float deve ser pelo menos 1 bit" +msgid "only USING expression allowed for SELECT, DELETE" +msgstr "" -#: gram.y:10486 +#: commands/portalcmds.c:60 commands/portalcmds.c:181 commands/portalcmds.c:232 #, c-format -msgid "precision for type float must be less than 54 bits" -msgstr "precisão para tipo float deve ser menor do que 54 bits" +msgid "invalid cursor name: must not be empty" +msgstr "o nome do cursor não é válido: não deve ser vazio" -#: gram.y:10952 +#: commands/portalcmds.c:72 #, c-format -msgid "wrong number of parameters on left side of OVERLAPS expression" -msgstr "número incorreto de parâmetros no lado esquerdo da expressão OVERLAPS" +msgid "cannot create a cursor WITH HOLD within security-restricted operation" +msgstr "não é possível criar um cursor WITH HOLD dentro da operação com restrição de segurança" -#: gram.y:10957 +#: commands/portalcmds.c:189 commands/portalcmds.c:242 +#: executor/execCurrent.c:70 utils/adt/xml.c:2844 utils/adt/xml.c:3014 #, c-format -msgid "wrong number of parameters on right side of OVERLAPS expression" -msgstr "número incorreto de parâmetros no lado direito da expressão OVERLAPS" +msgid "cursor \"%s\" does not exist" +msgstr "cursor \"%s\" não existe" -#: gram.y:11141 +#: commands/prepare.c:75 #, c-format -msgid "UNIQUE predicate is not yet implemented" -msgstr "predicado UNIQUE ainda não foi implementado" +msgid "invalid statement name: must not be empty" +msgstr "o nome do comando não é válido: não deve estar vazio" -#: gram.y:11428 +#: commands/prepare.c:230 commands/prepare.c:235 #, c-format -msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" -msgstr "não pode utilizar múltiplas cláusulas ORDER BY com WITHIN GROUP" +msgid "prepared statement is not a SELECT" +msgstr "comando preparado não é um SELECT" -#: gram.y:11433 +#: commands/prepare.c:295 #, c-format -msgid "cannot use DISTINCT with WITHIN GROUP" -msgstr "não pode utilizar DISTINCT com WITHIN GROUP" +msgid "wrong number of parameters for prepared statement \"%s\"" +msgstr "número incorreto de parâmetros para comando preparado \"%s\"" -#: gram.y:11438 +#: commands/prepare.c:297 #, c-format -msgid "cannot use VARIADIC with WITHIN GROUP" -msgstr "não pode utilizar VARIADIC com WITHIN GROUP" +msgid "Expected %d parameters but got %d." +msgstr "Esperado %d parâmetros mas recebeu %d." -#: gram.y:11944 +#: commands/prepare.c:330 #, c-format -msgid "RANGE PRECEDING is only supported with UNBOUNDED" -msgstr "RANGE PRECEDING só é suportado com UNBOUNDED" +msgid "parameter $%d of type %s cannot be coerced to the expected type %s" +msgstr "parâmetro $%d do tipo %s não pode ser convertido para tipo esperado %s" -#: gram.y:11950 +#: commands/prepare.c:414 #, c-format -msgid "RANGE FOLLOWING is only supported with UNBOUNDED" -msgstr "RANGE FOLLOWING só é suportado com UNBOUNDED" +msgid "prepared statement \"%s\" already exists" +msgstr "comando preparado \"%s\" já existe" -#: gram.y:11977 gram.y:12000 +#: commands/prepare.c:453 #, c-format -msgid "frame start cannot be UNBOUNDED FOLLOWING" -msgstr "início de quadro não pode ser UNBOUNDED FOLLOWING" +msgid "prepared statement \"%s\" does not exist" +msgstr "comando preparado \"%s\" não existe" -#: gram.y:11982 +#: commands/proclang.c:68 #, c-format -msgid "frame starting from following row cannot end with current row" -msgstr "quadro iniciando do próximo registro não pode terminar com registro atual" +msgid "must be superuser to create custom procedural language" +msgstr "é necessário ser superusuário para criar linguagem procedural personalizada" -#: gram.y:12005 +#: commands/publicationcmds.c:131 postmaster/postmaster.c:1208 +#: postmaster/postmaster.c:1306 storage/file/fd.c:3911 +#: utils/init/miscinit.c:1822 #, c-format -msgid "frame end cannot be UNBOUNDED PRECEDING" -msgstr "fim de quadro não pode ser UNBOUNDED PRECEDING" +msgid "invalid list syntax in parameter \"%s\"" +msgstr "sintaxe de lista é inválida para parâmetro \"%s\"" -#: gram.y:12011 +#: commands/publicationcmds.c:150 #, c-format -msgid "frame starting from current row cannot have preceding rows" -msgstr "quadro iniciando do registro atual não pode ter registros anteriores" +msgid "unrecognized value for publication option \"%s\": \"%s\"" +msgstr "valor não reconhecido para opção de publicação \"%s\": \"%s\"" -#: gram.y:12018 +#: commands/publicationcmds.c:164 #, c-format -msgid "frame starting from following row cannot have preceding rows" -msgstr "quadro iniciando do próximo registro não pode ter registro anteriores" +msgid "unrecognized publication parameter: \"%s\"" +msgstr "parâmetro de publicação não reconhecido: \"%s\"" -#: gram.y:12657 +#: commands/publicationcmds.c:205 #, c-format -msgid "type modifier cannot have parameter name" -msgstr "modificador de tipo não pode ter nome de parâmetro" +msgid "no schema has been selected for CURRENT_SCHEMA" +msgstr "nenhum esquema foi selecionado para CURRENT_SCHEMA" -#: gram.y:12663 -#, c-format -msgid "type modifier cannot have ORDER BY" -msgstr "modificador de tipo não pode ter ORDER BY" +#: commands/publicationcmds.c:502 +msgid "System columns are not allowed." +msgstr "Não são permitidas colunas do sistema." -#: gram.y:13284 gram.y:13459 -msgid "improper use of \"*\"" -msgstr "uso inválido de \"*\"" +#: commands/publicationcmds.c:509 commands/publicationcmds.c:514 +#: commands/publicationcmds.c:531 +msgid "User-defined operators are not allowed." +msgstr "Não são permitidos operadores definidos pelo usuário." -#: gram.y:13422 gram.y:13439 tsearch/spell.c:518 tsearch/spell.c:535 -#: tsearch/spell.c:552 tsearch/spell.c:569 tsearch/spell.c:591 -#, c-format -msgid "syntax error" -msgstr "erro de sintaxe" +#: commands/publicationcmds.c:555 +msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." +msgstr "" -#: gram.y:13523 -#, c-format -msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" -msgstr "uma agregação de conjunto ordenado com um argumento direto VARIADIC deve ter um argumento agregado VARIADIC do mesmo tipo" +#: commands/publicationcmds.c:567 +msgid "User-defined types are not allowed." +msgstr "Não são permitidos tipos de dados definidos pelo usuário." -#: gram.y:13560 -#, c-format -msgid "multiple ORDER BY clauses not allowed" -msgstr "múltiplas cláusulas ORDER BY não são permitidas" +#: commands/publicationcmds.c:570 +msgid "User-defined or built-in mutable functions are not allowed." +msgstr "Não são permitidas funções mutáveis ​​nativas ou definidas pelo usuário." -#: gram.y:13571 -#, c-format -msgid "multiple OFFSET clauses not allowed" -msgstr "múltiplas cláusulas OFFSET não são permitidas" +#: commands/publicationcmds.c:573 +msgid "User-defined collations are not allowed." +msgstr "Não são permitidas ordenações definidas pelo usuário." -#: gram.y:13580 +#: commands/publicationcmds.c:583 #, c-format -msgid "multiple LIMIT clauses not allowed" -msgstr "múltiplas cláusulas LIMIT não são permitidas" +msgid "invalid publication WHERE expression" +msgstr "a expressão WHERE da publicação não é válida" -#: gram.y:13589 +#: commands/publicationcmds.c:636 #, c-format -msgid "multiple WITH clauses not allowed" -msgstr "múltiplas cláusulas WITH não são permitidas" +msgid "cannot use publication WHERE clause for relation \"%s\"" +msgstr "não é possível usar a cláusula WHERE da publicação para a relação \"%s\"" -#: gram.y:13729 +#: commands/publicationcmds.c:638 #, c-format -msgid "OUT and INOUT arguments aren't allowed in TABLE functions" -msgstr "argumentos OUT e INOUT não são permitidos em funções TABLE" +msgid "WHERE clause cannot be used for a partitioned table when %s is false." +msgstr "" -#: gram.y:13830 +#: commands/publicationcmds.c:709 commands/publicationcmds.c:723 #, c-format -msgid "multiple COLLATE clauses not allowed" -msgstr "múltiplas cláusulas COLLATE não são permitidas" +msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" +msgstr "não é possível usar a lista de colunas para a relação \"%s.%s\" na publicação \"%s\"" -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:13868 gram.y:13881 +#: commands/publicationcmds.c:712 #, c-format -msgid "%s constraints cannot be marked DEFERRABLE" -msgstr "restrições %s não podem ser marcadas DEFERRABLE" +msgid "Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements." +msgstr "" -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:13894 +#: commands/publicationcmds.c:726 #, c-format -msgid "%s constraints cannot be marked NOT VALID" -msgstr "restrições %s não podem ser marcadas NOT VALID" +msgid "Column lists cannot be specified for partitioned tables when %s is false." +msgstr "" -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:13907 +#: commands/publicationcmds.c:761 #, c-format -msgid "%s constraints cannot be marked NO INHERIT" -msgstr "restrições %s não podem ser marcadas NO INHERIT" +msgid "must be superuser to create FOR ALL TABLES publication" +msgstr "é necessário ser um superusuário para criar publicação FOR ALL TABLES" -#: guc-file.l:262 +#: commands/publicationcmds.c:832 #, c-format -msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %u" -msgstr "parâmetro de configuração \"%s\" desconhecido em arquivo \"%s\" linha %u" +msgid "must be superuser to create FOR TABLES IN SCHEMA publication" +msgstr "é necessário ser um superusuário para criar publicação FOR TABLES IN SCHEMA" -#: guc-file.l:298 utils/misc/guc.c:5650 utils/misc/guc.c:5833 -#: utils/misc/guc.c:5919 utils/misc/guc.c:6005 utils/misc/guc.c:6109 -#: utils/misc/guc.c:6200 +#: commands/publicationcmds.c:868 #, c-format -msgid "parameter \"%s\" cannot be changed without restarting the server" -msgstr "parâmetro \"%s\" não pode ser mudado sem reiniciar o servidor" +msgid "wal_level is insufficient to publish logical changes" +msgstr "" -#: guc-file.l:326 +#: commands/publicationcmds.c:869 #, c-format -msgid "parameter \"%s\" removed from configuration file, reset to default" -msgstr "parâmetro \"%s\" foi removido do arquivo de configuração, reiniciar para padrão" +msgid "Set wal_level to \"logical\" before creating subscriptions." +msgstr "" -#: guc-file.l:388 +#: commands/publicationcmds.c:965 commands/publicationcmds.c:973 #, c-format -msgid "parameter \"%s\" changed to \"%s\"" -msgstr "parâmetro \"%s\" mudou para \"%s\"" +msgid "cannot set parameter \"%s\" to false for publication \"%s\"" +msgstr "não é possível definir o parâmetro \"%s\" como falso para a publicação \"%s\"" -#: guc-file.l:423 +#: commands/publicationcmds.c:968 #, c-format -msgid "configuration file \"%s\" contains errors" -msgstr "arquivo de configuração \"%s\" contém erros" +msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "" -#: guc-file.l:428 +#: commands/publicationcmds.c:976 #, c-format -msgid "configuration file \"%s\" contains errors; unaffected changes were applied" -msgstr "arquivo de configuração \"%s\" contém erros; alterações não afetadas foram aplicadas" +msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." +msgstr "" -#: guc-file.l:433 +#: commands/publicationcmds.c:1299 #, c-format -msgid "configuration file \"%s\" contains errors; no changes were applied" -msgstr "arquivo de configuração \"%s\" contém erros; nenhuma alteração foi aplicada" +msgid "cannot add schema to publication \"%s\"" +msgstr "não é possível adicionar esquema à publicação \"%s\"" -#: guc-file.l:503 +#: commands/publicationcmds.c:1301 #, c-format -msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" -msgstr "não pôde abrir arquivo de configuração \"%s\": profundidade aninhada máxima excedida" +msgid "Schemas cannot be added if any tables that specify a column list are already part of the publication." +msgstr "" -#: guc-file.l:516 libpq/hba.c:1789 +#: commands/publicationcmds.c:1349 #, c-format -msgid "could not open configuration file \"%s\": %m" -msgstr "não pôde abrir arquivo de configuração \"%s\": %m" +msgid "must be superuser to add or set schemas" +msgstr "é necessário ser um superusuário para adicionar ou definir esquemas" -#: guc-file.l:523 +#: commands/publicationcmds.c:1358 commands/publicationcmds.c:1366 #, c-format -msgid "skipping missing configuration file \"%s\"" -msgstr "ignorando arquivo de configuração ausente \"%s\"" +msgid "publication \"%s\" is defined as FOR ALL TABLES" +msgstr "" -#: guc-file.l:762 +#: commands/publicationcmds.c:1360 #, c-format -msgid "syntax error in file \"%s\" line %u, near end of line" -msgstr "erro de sintaxe no arquivo \"%s\" linha %u, próximo ao fim da linha" +msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "" -#: guc-file.l:767 +#: commands/publicationcmds.c:1368 #, c-format -msgid "syntax error in file \"%s\" line %u, near token \"%s\"" -msgstr "erro de sintaxe no arquivo \"%s\" linha %u, próximo a informação \"%s\"" +msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "" -#: guc-file.l:783 +#: commands/publicationcmds.c:1392 commands/publicationcmds.c:1431 +#: commands/publicationcmds.c:1968 utils/cache/lsyscache.c:3592 #, c-format -msgid "too many syntax errors found, abandoning file \"%s\"" -msgstr "muitos erros de sintaxe encontrados, abandonando arquivo \"%s\"" +msgid "publication \"%s\" does not exist" +msgstr "a publicação \"%s\" não existe" -#: guc-file.l:828 +#: commands/publicationcmds.c:1594 commands/publicationcmds.c:1657 #, c-format -msgid "could not open configuration directory \"%s\": %m" -msgstr "não pôde abrir diretório de configuração \"%s\": %m" +msgid "conflicting or redundant WHERE clauses for table \"%s\"" +msgstr "cláusulas WHERE conflitantes ou redundantes para a tabela \"%s\"" -#: lib/stringinfo.c:259 +#: commands/publicationcmds.c:1601 commands/publicationcmds.c:1669 #, c-format -msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." -msgstr "Não pode aumentar o buffer de cadeia de caracteres contendo %d bytes para mais %d bytes." +msgid "conflicting or redundant column lists for table \"%s\"" +msgstr "listas de colunas conflitantes ou redundantes para a tabela \"%s\"" -#: libpq/auth.c:235 +#: commands/publicationcmds.c:1803 #, c-format -msgid "authentication failed for user \"%s\": host rejected" -msgstr "autenticação de usuário \"%s\" falhou: máquina rejeitada" +msgid "column list must not be specified in ALTER PUBLICATION ... DROP" +msgstr "não deve ser especificada lista de colunas em ALTER PUBLICATION ... DROP" -#: libpq/auth.c:238 +#: commands/publicationcmds.c:1815 #, c-format -msgid "\"trust\" authentication failed for user \"%s\"" -msgstr "autenticação do tipo \"trust\" falhou para usuário \"%s\"" +msgid "relation \"%s\" is not part of the publication" +msgstr "a relação \"%s\" não faz parte da publicação" -#: libpq/auth.c:241 +#: commands/publicationcmds.c:1822 #, c-format -msgid "Ident authentication failed for user \"%s\"" -msgstr "autenticação do tipo Ident falhou para usuário \"%s\"" +msgid "cannot use a WHERE clause when removing a table from a publication" +msgstr "" -#: libpq/auth.c:244 +#: commands/publicationcmds.c:1882 #, c-format -msgid "Peer authentication failed for user \"%s\"" -msgstr "autenticação do tipo peer falhou para usuário \"%s\"" +msgid "tables from schema \"%s\" are not part of the publication" +msgstr "as tabelas do esquema \"%s\" não fazem parte da publicação" -#: libpq/auth.c:248 +#: commands/publicationcmds.c:1925 commands/publicationcmds.c:1932 #, c-format -msgid "password authentication failed for user \"%s\"" -msgstr "autenticação do tipo password falhou para usuário \"%s\"" +msgid "permission denied to change owner of publication \"%s\"" +msgstr "permissão negada para mudar o dono da publicação \"%s\"" -#: libpq/auth.c:253 +#: commands/publicationcmds.c:1927 #, c-format -msgid "GSSAPI authentication failed for user \"%s\"" -msgstr "autenticação do tipo GSSAPI falhou para usuário \"%s\"" +msgid "The owner of a FOR ALL TABLES publication must be a superuser." +msgstr "O dono de uma publicação FOR ALL TABLES deve ser um superusuário." -#: libpq/auth.c:256 +#: commands/publicationcmds.c:1934 #, c-format -msgid "SSPI authentication failed for user \"%s\"" -msgstr "autenticação do tipo SSPI falhou para usuário \"%s\"" +msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." +msgstr "O dono de uma publicação FOR TABLES IN SCHEMA deve ser um superusuário." -#: libpq/auth.c:259 +#: commands/publicationcmds.c:2000 #, c-format -msgid "PAM authentication failed for user \"%s\"" -msgstr "autenticação do tipo PAM falhou para usuário \"%s\"" +msgid "publication with OID %u does not exist" +msgstr "publicação com OID %u não existe" -#: libpq/auth.c:262 +#: commands/schemacmds.c:109 commands/schemacmds.c:289 #, c-format -msgid "LDAP authentication failed for user \"%s\"" -msgstr "autenticação do tipo LDAP falhou para usuário \"%s\"" +msgid "unacceptable schema name \"%s\"" +msgstr "nome de esquema \"%s\" é inaceitável" -#: libpq/auth.c:265 +#: commands/schemacmds.c:110 commands/schemacmds.c:290 #, c-format -msgid "certificate authentication failed for user \"%s\"" -msgstr "autenticação do tipo certificate falhou para usuário \"%s\"" +msgid "The prefix \"pg_\" is reserved for system schemas." +msgstr "O prefixo \"pg_\" é reservado para esquemas do sistema." -#: libpq/auth.c:268 +#: commands/schemacmds.c:134 #, c-format -msgid "RADIUS authentication failed for user \"%s\"" -msgstr "autenticação do tipo RADIUS falhou para usuário \"%s\"" +msgid "schema \"%s\" already exists, skipping" +msgstr "esquema \"%s\" já existe, ignorando" -#: libpq/auth.c:271 +#: commands/seclabel.c:131 #, c-format -msgid "authentication failed for user \"%s\": invalid authentication method" -msgstr "autenticação falhou para usuário \"%s\": método de autenticação é inválido" +msgid "no security label providers have been loaded" +msgstr "nenhum fornecedor de rótulo de segurança foi carregado" -#: libpq/auth.c:275 +#: commands/seclabel.c:135 #, c-format -msgid "Connection matched pg_hba.conf line %d: \"%s\"" -msgstr "Conexão correspondeu a linha %d do pg_hba.conf: \"%s\"" +msgid "must specify provider when multiple security label providers have been loaded" +msgstr "deve especificar fornecedor quando múltiplos fornecedores de rótulo de segurança forem carregados" -#: libpq/auth.c:337 +#: commands/seclabel.c:153 #, c-format -msgid "connection requires a valid client certificate" -msgstr "conexão requer um certificado cliente válido" +msgid "security label provider \"%s\" is not loaded" +msgstr "fornecedor de rótulo de segurança \"%s\" não foi carregado" -#: libpq/auth.c:379 +#: commands/seclabel.c:160 #, c-format -msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" -msgstr "pg_hba.conf rejeitou conexão de replicação para máquina \"%s\", usuário \"%s\", %s" - -#: libpq/auth.c:381 libpq/auth.c:397 libpq/auth.c:455 libpq/auth.c:473 -msgid "SSL off" -msgstr "SSL desabilitado" +msgid "security labels are not supported for this type of object" +msgstr "não há suporte para rótulos de segurança para esse tipo de objeto" -#: libpq/auth.c:381 libpq/auth.c:397 libpq/auth.c:455 libpq/auth.c:473 -msgid "SSL on" -msgstr "SSL habilitado" - -#: libpq/auth.c:385 +#: commands/seclabel.c:193 #, c-format -msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\"" -msgstr "pg_hba.conf rejeitou conexão de replicação para máquina \"%s\", usuário \"%s\"" +msgid "cannot set security label on relation \"%s\"" +msgstr "não é possível definir rótulo de segurança na relação \"%s\"" -#: libpq/auth.c:394 +#: commands/sequence.c:754 #, c-format -msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" -msgstr "pg_hba.conf rejeitou conexão para máquina \"%s\", usuário \"%s\", banco de dados \"%s\", %s" +msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" +msgstr "nextval: foi atingido o valor máximo da sequência \"%s\" (%lld)" -#: libpq/auth.c:401 +#: commands/sequence.c:773 #, c-format -msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\"" -msgstr "pg_hba.conf rejeitou conexão para máquina \"%s\", usuário \"%s\", banco de dados \"%s\"" +msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" +msgstr "nextval: foi atingido o valor mínimo da sequência \"%s\" (%lld)" -#: libpq/auth.c:430 +#: commands/sequence.c:891 #, c-format -msgid "Client IP address resolved to \"%s\", forward lookup matches." -msgstr "Endereço IP do cliente resolveu para \"%s\", pesquisa direta combina." +msgid "currval of sequence \"%s\" is not yet defined in this session" +msgstr "o valor corrente (currval) da sequência \"%s\" ainda não está definido nessa sessão" -#: libpq/auth.c:433 +#: commands/sequence.c:910 commands/sequence.c:916 #, c-format -msgid "Client IP address resolved to \"%s\", forward lookup not checked." -msgstr "Endereço IP do cliente resolveu para \"%s\", pesquisa direta não foi feita." +msgid "lastval is not yet defined in this session" +msgstr "o último valor (lastval) ainda não está definido nessa sessão" -#: libpq/auth.c:436 +#: commands/sequence.c:996 #, c-format -msgid "Client IP address resolved to \"%s\", forward lookup does not match." -msgstr "Endereço IP do cliente resolveu para \"%s\", pesquisa direta não combina." +msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" +msgstr "setval: o valor %lld está fora dos limites da sequência \"%s\" (%lld..%lld)" -#: libpq/auth.c:439 +#: commands/sequence.c:1365 #, c-format -msgid "Could not translate client host name \"%s\" to IP address: %s." -msgstr "Não pôde traduzir nome da máquina do cliente \"%s\" para endereço IP: %s." +msgid "invalid sequence option SEQUENCE NAME" +msgstr "" -#: libpq/auth.c:444 +#: commands/sequence.c:1391 #, c-format -msgid "Could not resolve client IP address to a host name: %s." -msgstr "Não pôde resolver endereço IP do cliente para um nome da máquina: %s." +msgid "identity column type must be smallint, integer, or bigint" +msgstr "" -#: libpq/auth.c:453 +#: commands/sequence.c:1392 #, c-format -msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" -msgstr "nenhuma entrada no pg_hba.conf para conexão de replicação da máquina \"%s\", usuário \"%s\", %s" +msgid "sequence type must be smallint, integer, or bigint" +msgstr "" -#: libpq/auth.c:460 +#: commands/sequence.c:1426 #, c-format -msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\"" -msgstr "nenhuma entrada no pg_hba.conf para conexão de replicação da máquina \"%s\", usuário \"%s\"" +msgid "INCREMENT must not be zero" +msgstr "INCREMENT não deve ser zero" -#: libpq/auth.c:470 +#: commands/sequence.c:1474 #, c-format -msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" -msgstr "nenhuma entrada no pg_hba.conf para máquina \"%s\", usuário \"%s\", banco de dados \"%s\", %s" +msgid "MAXVALUE (%lld) is out of range for sequence data type %s" +msgstr "MAXVALUE (%lld) está fora do intervalo para o tipo de dados da sequência %s" -#: libpq/auth.c:478 +#: commands/sequence.c:1506 #, c-format -msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\"" -msgstr "nenhuma entrada no pg_hba.conf para máquina \"%s\", usuário \"%s\", banco de dados \"%s\"" +msgid "MINVALUE (%lld) is out of range for sequence data type %s" +msgstr "MINVALUE (%lld) está fora do intervalo para o tipo de dados da sequência %s" -#: libpq/auth.c:521 libpq/hba.c:1212 +#: commands/sequence.c:1514 #, c-format -msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" -msgstr "autenticação MD5 não é suportada quando \"db_user_namespace\" está habilitado" +msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" +msgstr "MINVALUE (%lld) deve ser menor que MAXVALUE (%lld)" -#: libpq/auth.c:645 +#: commands/sequence.c:1535 #, c-format -msgid "expected password response, got message type %d" -msgstr "resposta da senha esperada, recebeu tipo de mensagem %d" +msgid "START value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "o valor de START (%lld) não pode ser menor que MINVALUE (%lld)" -#: libpq/auth.c:673 +#: commands/sequence.c:1541 #, c-format -msgid "invalid password packet size" -msgstr "tamanho do pacote de senha é inválido" +msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "o valor de START (%lld) não pode ser maior que MAXVALUE (%lld)" -#: libpq/auth.c:677 +#: commands/sequence.c:1565 #, c-format -msgid "received password packet" -msgstr "pacote de senha recebido" +msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" +msgstr "o valor de RESTART (%lld) não pode ser menor que MINVALUE (%lld)" -#: libpq/auth.c:804 +#: commands/sequence.c:1571 #, c-format -msgid "GSSAPI is not supported in protocol version 2" -msgstr "GSSAPI não é suportado no protocolo versão 2" +msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" +msgstr "o valor de RESTART (%lld) não pode ser maior que MAXVALUE (%lld)" -#: libpq/auth.c:859 +#: commands/sequence.c:1582 #, c-format -msgid "expected GSS response, got message type %d" -msgstr "resposta do GSS esperada, recebeu tipo de mensagem %d" +msgid "CACHE (%lld) must be greater than zero" +msgstr "CACHE (%lld) deve ser maior que zero" -#: libpq/auth.c:918 -msgid "accepting GSS security context failed" -msgstr "aceitação do contexto de segurança do GSS falhou" +#: commands/sequence.c:1618 +#, c-format +msgid "invalid OWNED BY option" +msgstr "opção OWNED BY inválida" -#: libpq/auth.c:944 -msgid "retrieving GSS user name failed" -msgstr "recuperação do nome de usuário do GSS falhou" +#: commands/sequence.c:1619 +#, c-format +msgid "Specify OWNED BY table.column or OWNED BY NONE." +msgstr "Especifique OWNED BY tabela.coluna, ou OWNED BY NONE." -#: libpq/auth.c:1061 +#: commands/sequence.c:1644 #, c-format -msgid "SSPI is not supported in protocol version 2" -msgstr "SSPI não é suportado no protocolo versão 2" +msgid "sequence cannot be owned by relation \"%s\"" +msgstr "a sequência não pode pertencer à relação \"%s\"" -#: libpq/auth.c:1076 -msgid "could not acquire SSPI credentials" -msgstr "não pôde obter credenciais SSPI" +#: commands/sequence.c:1652 +#, c-format +msgid "sequence must have same owner as table it is linked to" +msgstr "a sequência deve ter o mesmo dono da tabela à qual está vinculada" -#: libpq/auth.c:1093 +#: commands/sequence.c:1656 #, c-format -msgid "expected SSPI response, got message type %d" -msgstr "resposta do SSPI esperada, recebeu tipo de mensagem %d" +msgid "sequence must be in same schema as table it is linked to" +msgstr "a sequência deve estar no mesmo esquema da tabela à qual está vinculada" -#: libpq/auth.c:1165 -msgid "could not accept SSPI security context" -msgstr "não pôde aceitar contexto de segurança do SSPI" +#: commands/sequence.c:1678 +#, c-format +msgid "cannot change ownership of identity sequence" +msgstr "não é possível alterar o dono da sequência de identidade" -#: libpq/auth.c:1227 -msgid "could not get token from SSPI security context" -msgstr "não pôde obter token do contexto de segurança do SSPI" +#: commands/sequence.c:1679 commands/tablecmds.c:13895 +#: commands/tablecmds.c:16494 +#, c-format +msgid "Sequence \"%s\" is linked to table \"%s\"." +msgstr "A sequência \"%s\" está vinculada à tabela \"%s\"." -#: libpq/auth.c:1470 +#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1887 #, c-format -msgid "could not create socket for Ident connection: %m" -msgstr "não pôde criar soquete para conexão com Ident: %m" +msgid "only a single relation is allowed in CREATE STATISTICS" +msgstr "" -#: libpq/auth.c:1485 +#: commands/statscmds.c:136 #, c-format -msgid "could not bind to local address \"%s\": %m" -msgstr "não pôde se ligar ao endereço local \"%s\": %m" +msgid "cannot define statistics for relation \"%s\"" +msgstr "não é possível definir estatísticas para a relação \"%s\"" -#: libpq/auth.c:1497 +#: commands/statscmds.c:190 #, c-format -msgid "could not connect to Ident server at address \"%s\", port %s: %m" -msgstr "não pôde conectar ao servidor Ident no endereço \"%s\", porta %s: %m" +msgid "statistics object \"%s\" already exists, skipping" +msgstr "o objeto de estatísticas \"%s\" já existe, ignorando" -#: libpq/auth.c:1517 +#: commands/statscmds.c:198 #, c-format -msgid "could not send query to Ident server at address \"%s\", port %s: %m" -msgstr "não pôde enviar consulta ao servidor Ident no endereço \"%s\", porta %s: %m" +msgid "statistics object \"%s\" already exists" +msgstr "o objeto de estatísticas \"%s\" já existe" -#: libpq/auth.c:1532 +#: commands/statscmds.c:209 #, c-format -msgid "could not receive response from Ident server at address \"%s\", port %s: %m" -msgstr "não pôde receber resposta do servidor Ident no endereço \"%s\", porta %s: %m" +msgid "cannot have more than %d columns in statistics" +msgstr "não é possível haver mais de %d colunas nas estatísticas" -#: libpq/auth.c:1542 +#: commands/statscmds.c:250 commands/statscmds.c:273 commands/statscmds.c:307 #, c-format -msgid "invalidly formatted response from Ident server: \"%s\"" -msgstr "resposta invalidamente formatada pelo servidor Ident: \"%s\"" +msgid "statistics creation on system columns is not supported" +msgstr "não há suporte para criação de estatísticas nas colunas do sistema" -#: libpq/auth.c:1580 +#: commands/statscmds.c:257 commands/statscmds.c:280 #, c-format -msgid "peer authentication is not supported on this platform" -msgstr "autenticação do tipo peer não é suportada nesta plataforma" +msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" +msgstr "" -#: libpq/auth.c:1584 +#: commands/statscmds.c:324 #, c-format -msgid "could not get peer credentials: %m" -msgstr "não pôde receber credenciais: %m" +msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" +msgstr "" -#: libpq/auth.c:1593 +#: commands/statscmds.c:345 #, c-format -msgid "could not to look up local user ID %ld: %s" -msgstr "não pôde encontrar ID de usuário local %ld: %s" +msgid "when building statistics on a single expression, statistics kinds may not be specified" +msgstr "" -#: libpq/auth.c:1676 libpq/auth.c:1947 libpq/auth.c:2304 +#: commands/statscmds.c:374 #, c-format -msgid "empty password returned by client" -msgstr "senha vazia retornada pelo cliente" +msgid "unrecognized statistics kind \"%s\"" +msgstr "tipo de estatísticas não reconhecido \"%s\"" -#: libpq/auth.c:1686 +#: commands/statscmds.c:403 #, c-format -msgid "error from underlying PAM layer: %s" -msgstr "erro da biblioteca PAM: %s" +msgid "extended statistics require at least 2 columns" +msgstr "as estatísticas estendidas requerem pelo menos 2 colunas" -#: libpq/auth.c:1755 +#: commands/statscmds.c:421 #, c-format -msgid "could not create PAM authenticator: %s" -msgstr "não pôde criar autenticador PAM: %s" +msgid "duplicate column name in statistics definition" +msgstr "" -#: libpq/auth.c:1766 +#: commands/statscmds.c:456 #, c-format -msgid "pam_set_item(PAM_USER) failed: %s" -msgstr "pam_set_item(PAM_USER) falhou: %s" +msgid "duplicate expression in statistics definition" +msgstr "expressão duplicada na definição das estatísticas" -#: libpq/auth.c:1777 +#: commands/statscmds.c:619 commands/tablecmds.c:8184 #, c-format -msgid "pam_set_item(PAM_CONV) failed: %s" -msgstr "pam_set_item(PAM_CONV) falhou: %s" +msgid "statistics target %d is too low" +msgstr "valor da estatística %d é muito pequeno" -#: libpq/auth.c:1788 +#: commands/statscmds.c:627 commands/tablecmds.c:8192 #, c-format -msgid "pam_authenticate failed: %s" -msgstr "pam_authenticate falhou: %s" +msgid "lowering statistics target to %d" +msgstr "diminuindo valor da estatística para %d" -#: libpq/auth.c:1799 +#: commands/statscmds.c:650 #, c-format -msgid "pam_acct_mgmt failed: %s" -msgstr "pam_acct_mgmt falhou: %s" +msgid "statistics object \"%s.%s\" does not exist, skipping" +msgstr "não existe o objeto de estatísticas \"%s.%s\", ignorando" -#: libpq/auth.c:1810 +#: commands/subscriptioncmds.c:271 commands/subscriptioncmds.c:359 #, c-format -msgid "could not release PAM authenticator: %s" -msgstr "não pôde liberar autenticador PAM: %s" +msgid "unrecognized subscription parameter: \"%s\"" +msgstr "parâmetro de subscrição não reconhecido: \"%s\"" -#: libpq/auth.c:1843 +#: commands/subscriptioncmds.c:327 replication/pgoutput/pgoutput.c:395 #, c-format -msgid "could not initialize LDAP: %m" -msgstr "não pôde inicializar LDAP: %m" +msgid "unrecognized origin value: \"%s\"" +msgstr "valor de origem não reconhecido: \"%s\"" -#: libpq/auth.c:1846 +#: commands/subscriptioncmds.c:350 #, c-format -msgid "could not initialize LDAP: error code %d" -msgstr "não pôde inicializar LDAP: código de erro %d" +msgid "invalid WAL location (LSN): %s" +msgstr "localização do WAL inválida (LSN): %s" -#: libpq/auth.c:1856 +#. translator: both %s are strings of the form "option = value" +#: commands/subscriptioncmds.c:374 commands/subscriptioncmds.c:381 +#: commands/subscriptioncmds.c:388 commands/subscriptioncmds.c:410 +#: commands/subscriptioncmds.c:426 #, c-format -msgid "could not set LDAP protocol version: %s" -msgstr "não pôde definir versão do protocolo LDAP: %s" +msgid "%s and %s are mutually exclusive options" +msgstr "" -#: libpq/auth.c:1885 +#. translator: both %s are strings of the form "option = value" +#: commands/subscriptioncmds.c:416 commands/subscriptioncmds.c:432 #, c-format -msgid "could not load wldap32.dll" -msgstr "não pôde carregar wldap32.dll" +msgid "subscription with %s must also set %s" +msgstr "subscrição com %s também deve definir %s" -#: libpq/auth.c:1893 +#: commands/subscriptioncmds.c:494 #, c-format -msgid "could not load function _ldap_start_tls_sA in wldap32.dll" -msgstr "não pôde carregar função _ldap_start_tls_sA em wldap32.dll" +msgid "could not receive list of publications from the publisher: %s" +msgstr "não foi possível receber a lista de publicações do publicador: %s" -#: libpq/auth.c:1894 +#: commands/subscriptioncmds.c:526 #, c-format -msgid "LDAP over SSL is not supported on this platform." -msgstr "LDAP sobre SSL não é suportado nesta plataforma." +msgid "publication %s does not exist on the publisher" +msgid_plural "publications %s do not exist on the publisher" +msgstr[0] "a publicação %s não existe no publicador" +msgstr[1] "as publicações %s não existem no publicador" -#: libpq/auth.c:1909 +#: commands/subscriptioncmds.c:614 #, c-format -msgid "could not start LDAP TLS session: %s" -msgstr "não pôde iniciar sessão LDAP TLS: %s" +msgid "permission denied to create subscription" +msgstr "permissão negada para criar subscrição" -#: libpq/auth.c:1931 +#: commands/subscriptioncmds.c:615 #, c-format -msgid "LDAP server not specified" -msgstr "servidor LDAP não foi especificado" +msgid "Only roles with privileges of the \"%s\" role may create subscriptions." +msgstr "" -#: libpq/auth.c:1984 +#: commands/subscriptioncmds.c:745 commands/subscriptioncmds.c:878 +#: replication/logical/tablesync.c:1327 replication/logical/worker.c:4616 #, c-format -msgid "invalid character in user name for LDAP authentication" -msgstr "caracter inválido em nome de usuário para autenticação LDAP" +msgid "could not connect to the publisher: %s" +msgstr "não foi possível conectar-se ao publicador: %s" -#: libpq/auth.c:1999 +#: commands/subscriptioncmds.c:816 #, c-format -msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" -msgstr "não pôde realizar ligação inicial LDAP para ldapbinddn \"%s\" no servidor \"%s\": %s" +msgid "created replication slot \"%s\" on publisher" +msgstr "criado o encaixe de replicação \"%s\" no publicador" -#: libpq/auth.c:2023 +#: commands/subscriptioncmds.c:828 #, c-format -msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" -msgstr "não pôde buscar no LDAP por filtro \"%s\" no servidor \"%s\": %s" +msgid "subscription was created, but is not connected" +msgstr "" -#: libpq/auth.c:2034 +#: commands/subscriptioncmds.c:829 #, c-format -msgid "LDAP user \"%s\" does not exist" -msgstr "usuário do LDAP \"%s\" não existe" +msgid "To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription." +msgstr "" -#: libpq/auth.c:2035 +#: commands/subscriptioncmds.c:1096 commands/subscriptioncmds.c:1509 +#: commands/subscriptioncmds.c:1892 utils/cache/lsyscache.c:3642 #, c-format -msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." -msgstr "busca LDAP falhou para filtro \"%s\" no servidor \"%s\": não retornou entradas." +msgid "subscription \"%s\" does not exist" +msgstr "a subscrição \"%s\" não existe" -#: libpq/auth.c:2039 +#: commands/subscriptioncmds.c:1152 #, c-format -msgid "LDAP user \"%s\" is not unique" -msgstr "usuário do LDAP \"%s\" não é único" +msgid "cannot set %s for enabled subscription" +msgstr "não é possível definir %s para subscrição ativada" -#: libpq/auth.c:2040 +#: commands/subscriptioncmds.c:1234 #, c-format -msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." -msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." -msgstr[0] "busca LDAP falhou para filtro \"%s\" no servidor \"%s\": retornou %d entrada." -msgstr[1] "busca LDAP falhou para filtro \"%s\" no servidor \"%s\": retornou %d entradas." +msgid "cannot enable subscription that does not have a slot name" +msgstr "" -#: libpq/auth.c:2058 +#: commands/subscriptioncmds.c:1278 commands/subscriptioncmds.c:1329 #, c-format -msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" -msgstr "não pôde obter dn para a primeira entrada que corresponde a \"%s\" no servidor \"%s\": %s" +msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" +msgstr "" -#: libpq/auth.c:2078 +#: commands/subscriptioncmds.c:1279 #, c-format -msgid "could not unbind after searching for user \"%s\" on server \"%s\": %s" -msgstr "não pôde desligar-se após buscar pelo usuário \"%s\" no servidor \"%s\": %s" +msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." +msgstr "" -#: libpq/auth.c:2108 +#: commands/subscriptioncmds.c:1288 commands/subscriptioncmds.c:1343 #, c-format -msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" -msgstr "autenticação LDAP falhou para usuário \"%s\" no servidor \"%s\": %s" +msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" +msgstr "" -#: libpq/auth.c:2136 +#: commands/subscriptioncmds.c:1289 #, c-format -msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" -msgstr "autenticação com certificado falhou para usuário \"%s\": certificado cliente não contém usuário" +msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "" -#: libpq/auth.c:2260 +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1345 #, c-format -msgid "RADIUS server not specified" -msgstr "servidor RADIUS não foi especificado" +msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "" -#: libpq/auth.c:2267 +#: commands/subscriptioncmds.c:1367 #, c-format -msgid "RADIUS secret not specified" -msgstr "segredo do RADIUS não foi especificado" +msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" +msgstr "" -#: libpq/auth.c:2283 libpq/hba.c:1609 +#: commands/subscriptioncmds.c:1392 #, c-format -msgid "could not translate RADIUS server name \"%s\" to address: %s" -msgstr "não pôde traduzir nome de servidor RADIUS \"%s\" para endereço: %s" +msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" +msgstr "" -#: libpq/auth.c:2311 +#: commands/subscriptioncmds.c:1393 #, c-format -msgid "RADIUS authentication does not support passwords longer than 16 characters" -msgstr "autenticação RADIUS não suporta senhas mais longas do que 16 caracteres" +msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "" -#: libpq/auth.c:2322 +#: commands/subscriptioncmds.c:1428 #, c-format -msgid "could not generate random encryption vector" -msgstr "não pôde gerar vetor de criptografia randômico" +msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" +msgstr "" -#: libpq/auth.c:2345 +#: commands/subscriptioncmds.c:1513 #, c-format -msgid "could not perform MD5 encryption of password" -msgstr "não pôde realizar criptografia MD5 da senha" +msgid "subscription \"%s\" does not exist, skipping" +msgstr "a subscrição \"%s\" não existe, ignorada" -#: libpq/auth.c:2367 +#: commands/subscriptioncmds.c:1782 #, c-format -msgid "could not create RADIUS socket: %m" -msgstr "não pôde criar soquete RADIUS: %m" +msgid "dropped replication slot \"%s\" on publisher" +msgstr "excluído o encaixe de replicação \"%s\" no publicador" -#: libpq/auth.c:2388 +#: commands/subscriptioncmds.c:1791 commands/subscriptioncmds.c:1799 #, c-format -msgid "could not bind local RADIUS socket: %m" -msgstr "não pôde se ligar ao soquete RADIUS: %m" +msgid "could not drop replication slot \"%s\" on publisher: %s" +msgstr "não foi possível excluir o encaixe de replicação \"%s\" no publicador: %s" -#: libpq/auth.c:2398 +#: commands/subscriptioncmds.c:1924 #, c-format -msgid "could not send RADIUS packet: %m" -msgstr "não pôde enviar pacote RADIUS: %m" +msgid "subscription with OID %u does not exist" +msgstr "não existe a subscrição com OID %u" -#: libpq/auth.c:2427 libpq/auth.c:2452 +#: commands/subscriptioncmds.c:1995 commands/subscriptioncmds.c:2120 #, c-format -msgid "timeout waiting for RADIUS response" -msgstr "tempo de espera esgotado para resposta do RADIUS" +msgid "could not receive list of replicated tables from the publisher: %s" +msgstr "não foi possível receber a lista de tabelas replicadas do publicador: %s" -#: libpq/auth.c:2445 +#: commands/subscriptioncmds.c:2031 #, c-format -msgid "could not check status on RADIUS socket: %m" -msgstr "não pôde verificar status no soquete do RADIUS: %m" +msgid "subscription \"%s\" requested copy_data with origin = NONE but might copy data that had a different origin" +msgstr "" -#: libpq/auth.c:2474 +#: commands/subscriptioncmds.c:2033 #, c-format -msgid "could not read RADIUS response: %m" -msgstr "não pôde ler resposta do RADIUS: %m" +msgid "The subscription being created subscribes to a publication (%s) that contains tables that are written to by other subscriptions." +msgid_plural "The subscription being created subscribes to publications (%s) that contain tables that are written to by other subscriptions." +msgstr[0] "" +msgstr[1] "" -#: libpq/auth.c:2486 libpq/auth.c:2490 +#: commands/subscriptioncmds.c:2036 #, c-format -msgid "RADIUS response was sent from incorrect port: %d" -msgstr "resposta RADIUS foi enviada de porta incorreta: %d" +msgid "Verify that initial data copied from the publisher tables did not come from other origins." +msgstr "" -#: libpq/auth.c:2499 +#: commands/subscriptioncmds.c:2142 replication/logical/tablesync.c:886 +#: replication/pgoutput/pgoutput.c:1112 #, c-format -msgid "RADIUS response too short: %d" -msgstr "resposta RADIUS muito curta: %d" +msgid "cannot use different column lists for table \"%s.%s\" in different publications" +msgstr "" -#: libpq/auth.c:2506 +#: commands/subscriptioncmds.c:2192 #, c-format -msgid "RADIUS response has corrupt length: %d (actual length %d)" -msgstr "resposta RADIUS tem tamanho corrompido: %d (tamanho atual %d)" +msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" +msgstr "" -#: libpq/auth.c:2514 +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:2195 #, c-format -msgid "RADIUS response is to a different request: %d (should be %d)" -msgstr "resposta RADIUS é para uma solicitação diferente: %d (deveria ser %d)" +msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." +msgstr "" -#: libpq/auth.c:2539 +#: commands/subscriptioncmds.c:2226 #, c-format -msgid "could not perform MD5 encryption of received packet" -msgstr "não pôde realizar criptografia MD5 do pacote recebido" +msgid "publication name \"%s\" used more than once" +msgstr "nome da publicação \"%s\" usado mais de uma vez" -#: libpq/auth.c:2548 +#: commands/subscriptioncmds.c:2270 #, c-format -msgid "RADIUS response has incorrect MD5 signature" -msgstr "resposta RADIUS tem assinatura MD5 incorreta" +msgid "publication \"%s\" is already in subscription \"%s\"" +msgstr "a publicação \"%s\" já está na subscrição \"%s\"" -#: libpq/auth.c:2565 +#: commands/subscriptioncmds.c:2284 #, c-format -msgid "RADIUS response has invalid code (%d) for user \"%s\"" -msgstr "resposta RADIUS tem código inválido (%d) para usuário \"%s\"" +msgid "publication \"%s\" is not in subscription \"%s\"" +msgstr "a publicação \"%s\" não está na subscrição \"%s\"" -#: libpq/be-fsstubs.c:134 libpq/be-fsstubs.c:165 libpq/be-fsstubs.c:199 -#: libpq/be-fsstubs.c:239 libpq/be-fsstubs.c:264 libpq/be-fsstubs.c:312 -#: libpq/be-fsstubs.c:335 libpq/be-fsstubs.c:583 +#: commands/subscriptioncmds.c:2295 #, c-format -msgid "invalid large-object descriptor: %d" -msgstr "descritor de objeto grande é inválido: %d" +msgid "cannot drop all the publications from a subscription" +msgstr "não é possível excluir todas as publicações de uma subscrição" -#: libpq/be-fsstubs.c:180 libpq/be-fsstubs.c:218 libpq/be-fsstubs.c:602 -#: libpq/be-fsstubs.c:790 +#: commands/subscriptioncmds.c:2352 #, c-format -msgid "permission denied for large object %u" -msgstr "permissão negada para objeto grande %u" +msgid "%s requires a Boolean value or \"parallel\"" +msgstr "%s requer um valor booleano ou \"parallel\"" -#: libpq/be-fsstubs.c:205 libpq/be-fsstubs.c:589 +#: commands/tablecmds.c:246 commands/tablecmds.c:288 #, c-format -msgid "large object descriptor %d was not opened for writing" -msgstr "descritor de objeto grande %d não foi aberto para escrita" +msgid "table \"%s\" does not exist" +msgstr "a tabela \"%s\" não existe" -#: libpq/be-fsstubs.c:247 +#: commands/tablecmds.c:247 commands/tablecmds.c:289 #, c-format -msgid "lo_lseek result out of range for large-object descriptor %d" -msgstr "resultado de lo_lseek está fora do intervalo para descritor de objeto grande %d" +msgid "table \"%s\" does not exist, skipping" +msgstr "tabela \"%s\" não existe, ignorando" + +#: commands/tablecmds.c:249 commands/tablecmds.c:291 +msgid "Use DROP TABLE to remove a table." +msgstr "Use DROP TABLE para remover uma tabela." -#: libpq/be-fsstubs.c:320 +#: commands/tablecmds.c:252 #, c-format -msgid "lo_tell result out of range for large-object descriptor %d" -msgstr "resultado de lo_tell está fora do intervalo para descritor de objeto grande %d" +msgid "sequence \"%s\" does not exist" +msgstr "sequência \"%s\" não existe" -#: libpq/be-fsstubs.c:457 +#: commands/tablecmds.c:253 #, c-format -msgid "must be superuser to use server-side lo_import()" -msgstr "deve ser super-usuário para utilizar lo_import() do servidor" +msgid "sequence \"%s\" does not exist, skipping" +msgstr "sequência \"%s\" não existe, ignorando" -#: libpq/be-fsstubs.c:458 +#: commands/tablecmds.c:255 +msgid "Use DROP SEQUENCE to remove a sequence." +msgstr "Use DROP SEQUENCE para remover uma sequência." + +#: commands/tablecmds.c:258 #, c-format -msgid "Anyone can use the client-side lo_import() provided by libpq." -msgstr "Qualquer um pode utilizar lo_import() do cliente fornecido pela libpq." +msgid "view \"%s\" does not exist" +msgstr "visão \"%s\" não existe" -#: libpq/be-fsstubs.c:471 +#: commands/tablecmds.c:259 #, c-format -msgid "could not open server file \"%s\": %m" -msgstr "não pôde abrir arquivo \"%s\" no servidor: %m" +msgid "view \"%s\" does not exist, skipping" +msgstr "visão \"%s\" não existe, ignorando" -#: libpq/be-fsstubs.c:493 +#: commands/tablecmds.c:261 +msgid "Use DROP VIEW to remove a view." +msgstr "Use DROP VIEW para remover uma visão." + +#: commands/tablecmds.c:264 #, c-format -msgid "could not read server file \"%s\": %m" -msgstr "não pôde ler arquivo \"%s\" no servidor: %m" +msgid "materialized view \"%s\" does not exist" +msgstr "visão materializada \"%s\" não existe" -#: libpq/be-fsstubs.c:523 +#: commands/tablecmds.c:265 #, c-format -msgid "must be superuser to use server-side lo_export()" -msgstr "deve ser super-usuário para utilizar lo_export() do servidor" +msgid "materialized view \"%s\" does not exist, skipping" +msgstr "visão materializada \"%s\" não existe, ignorando" -#: libpq/be-fsstubs.c:524 +#: commands/tablecmds.c:267 +msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." +msgstr "Use DROP MATERIALIZED VIEW para remover uma visão materializada." + +#: commands/tablecmds.c:270 commands/tablecmds.c:294 commands/tablecmds.c:18998 +#: parser/parse_utilcmd.c:2245 #, c-format -msgid "Anyone can use the client-side lo_export() provided by libpq." -msgstr "Qualquer um pode utilizar lo_export() do cliente fornecido pela libpq." +msgid "index \"%s\" does not exist" +msgstr "índice \"%s\" não existe" -#: libpq/be-fsstubs.c:549 +#: commands/tablecmds.c:271 commands/tablecmds.c:295 #, c-format -msgid "could not create server file \"%s\": %m" -msgstr "não pôde criar arquivo \"%s\" no servidor: %m" +msgid "index \"%s\" does not exist, skipping" +msgstr "índice \"%s\" não existe, ignorando" -#: libpq/be-fsstubs.c:561 +#: commands/tablecmds.c:273 commands/tablecmds.c:297 +msgid "Use DROP INDEX to remove an index." +msgstr "Use DROP INDEX para remover um índice." + +#: commands/tablecmds.c:278 #, c-format -msgid "could not write server file \"%s\": %m" -msgstr "não pôde escrever no arquivo \"%s\" no servidor: %m" +msgid "\"%s\" is not a type" +msgstr "\"%s\" não é um tipo" + +#: commands/tablecmds.c:279 +msgid "Use DROP TYPE to remove a type." +msgstr "Use DROP TYPE para remover um tipo de dados." -#: libpq/be-fsstubs.c:815 +#: commands/tablecmds.c:282 commands/tablecmds.c:13734 +#: commands/tablecmds.c:16199 #, c-format -msgid "large object read request is too large" -msgstr "requisição de leitura de objeto grande é muito grande" +msgid "foreign table \"%s\" does not exist" +msgstr "a tabela estrangeira \"%s\" não existe" -#: libpq/be-fsstubs.c:857 utils/adt/genfile.c:187 utils/adt/genfile.c:232 +#: commands/tablecmds.c:283 #, c-format -msgid "requested length cannot be negative" -msgstr "tamanho solicitado não pode ser negativo" +msgid "foreign table \"%s\" does not exist, skipping" +msgstr "a tabela estrangeira \"%s\" não existe, ignorando" + +#: commands/tablecmds.c:285 +msgid "Use DROP FOREIGN TABLE to remove a foreign table." +msgstr "Use DROP FOREIGN TABLE para remover uma tabela estrangeira." -#: libpq/be-secure.c:296 libpq/be-secure.c:418 +#: commands/tablecmds.c:700 #, c-format -msgid "SSL error: %s" -msgstr "erro de SSL: %s" +msgid "ON COMMIT can only be used on temporary tables" +msgstr "ON COMMIT só pode ser utilizado em tabelas temporárias" -#: libpq/be-secure.c:305 libpq/be-secure.c:427 libpq/be-secure.c:1046 +#: commands/tablecmds.c:731 #, c-format -msgid "unrecognized SSL error code: %d" -msgstr "código de erro SSL desconhecido: %d" +msgid "cannot create temporary table within security-restricted operation" +msgstr "não é possível criar tabela temporária em operação com restrição de segurança" -#: libpq/be-secure.c:365 +#: commands/tablecmds.c:767 commands/tablecmds.c:15044 #, c-format -msgid "SSL failure during renegotiation start" -msgstr "falha SSL durante início da renegociação" +msgid "relation \"%s\" would be inherited from more than once" +msgstr "relação \"%s\" seria herdada de mais de uma vez" -#: libpq/be-secure.c:380 +#: commands/tablecmds.c:955 #, c-format -msgid "SSL handshake failure on renegotiation, retrying" -msgstr "falha da negociação SSL inicial na renegociação, tentando novamente" +msgid "specifying a table access method is not supported on a partitioned table" +msgstr "" -#: libpq/be-secure.c:384 +#: commands/tablecmds.c:1048 #, c-format -msgid "could not complete SSL handshake on renegotiation, too many failures" -msgstr "não pôde completar negociação SSL inicial na renegociação, muitas falhas" +msgid "\"%s\" is not partitioned" +msgstr "\"%s\" não está particionado" -#: libpq/be-secure.c:453 +#: commands/tablecmds.c:1142 #, c-format -msgid "SSL failed to renegotiate connection before limit expired" -msgstr "SSL falhou ao renegociar conexão antes do limite expirar" +msgid "cannot partition using more than %d columns" +msgstr "não é possível particionar usando mais de %d colunas" -#: libpq/be-secure.c:793 +#: commands/tablecmds.c:1198 #, c-format -msgid "ECDH: unrecognized curve name: %s" -msgstr "ECDH: nome de curva desconhecido: %s" +msgid "cannot create foreign partition of partitioned table \"%s\"" +msgstr "não é possível criar partição estrangeira da tabela particionada \"%s\"" -#: libpq/be-secure.c:798 +#: commands/tablecmds.c:1200 #, c-format -msgid "ECDH: could not create key" -msgstr "ECDH: não pôde criar chave" +msgid "Table \"%s\" contains indexes that are unique." +msgstr "" -#: libpq/be-secure.c:835 +#: commands/tablecmds.c:1365 #, c-format -msgid "could not create SSL context: %s" -msgstr "não pôde criar contexto SSL: %s" +msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" +msgstr "DROP INDEX CONCURRENTLY não dá suporte a múltiplos objetos" -#: libpq/be-secure.c:851 +#: commands/tablecmds.c:1369 #, c-format -msgid "could not load server certificate file \"%s\": %s" -msgstr "não pôde carregar arquivo de certificado do servidor \"%s\": %s" +msgid "DROP INDEX CONCURRENTLY does not support CASCADE" +msgstr "DROP INDEX CONCURRENTLY não dá suporte a CASCADE" -#: libpq/be-secure.c:857 +#: commands/tablecmds.c:1473 #, c-format -msgid "could not access private key file \"%s\": %m" -msgstr "não pôde acessar arquivo da chave privada \"%s\": %m" +msgid "cannot drop partitioned index \"%s\" concurrently" +msgstr "não é possível excluir o índice particionado \"%s\" concorrentemente" -#: libpq/be-secure.c:872 +#: commands/tablecmds.c:1761 #, c-format -msgid "private key file \"%s\" has group or world access" -msgstr "arquivo da chave privada \"%s\" tem acesso para grupo ou outros" +msgid "cannot truncate only a partitioned table" +msgstr "não é possível truncar somente uma tabela particionada" -#: libpq/be-secure.c:874 +#: commands/tablecmds.c:1762 #, c-format -msgid "Permissions should be u=rw (0600) or less." -msgstr "Permissões devem ser u=rwx (0600) ou menos." +msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." +msgstr "" -#: libpq/be-secure.c:881 +#: commands/tablecmds.c:1835 #, c-format -msgid "could not load private key file \"%s\": %s" -msgstr "não pôde carregar arquivo da chave privada \"%s\": %s" +msgid "truncate cascades to table \"%s\"" +msgstr "truncando em cascata tabela \"%s\"" -#: libpq/be-secure.c:886 +#: commands/tablecmds.c:2199 #, c-format -msgid "check of private key failed: %s" -msgstr "verificação de chave privada falhou: %s" +msgid "cannot truncate foreign table \"%s\"" +msgstr "não é possível truncar a tabela estrangeira \"%s\"" -#: libpq/be-secure.c:915 +#: commands/tablecmds.c:2256 #, c-format -msgid "could not load root certificate file \"%s\": %s" -msgstr "não pôde carregar arquivo do certificado raiz \"%s\": %s" +msgid "cannot truncate temporary tables of other sessions" +msgstr "não é possível truncar tabelas temporárias de outras sessões" -#: libpq/be-secure.c:939 +#: commands/tablecmds.c:2488 commands/tablecmds.c:14941 #, c-format -msgid "SSL certificate revocation list file \"%s\" ignored" -msgstr "arquivo da lista de revogação de certificados SSL \"%s\" ignorado" +msgid "cannot inherit from partitioned table \"%s\"" +msgstr "não é possível herdar da tabela particionada \"%s\"" -#: libpq/be-secure.c:941 +#: commands/tablecmds.c:2493 #, c-format -msgid "SSL library does not support certificate revocation lists." -msgstr "biblioteca SSL instalada não suporta listas de revogação de certificados." +msgid "cannot inherit from partition \"%s\"" +msgstr "não é possível herdar da partição \"%s\"" -#: libpq/be-secure.c:946 +#: commands/tablecmds.c:2501 parser/parse_utilcmd.c:2475 +#: parser/parse_utilcmd.c:2617 #, c-format -msgid "could not load SSL certificate revocation list file \"%s\": %s" -msgstr "não pôde carregar arquivo da lista de revogação de certificados SSL \"%s\": %s" +msgid "inherited relation \"%s\" is not a table or foreign table" +msgstr "a relação herdada \"%s\" não é uma tabela ou tabela estrangeira" -#: libpq/be-secure.c:991 +#: commands/tablecmds.c:2513 #, c-format -msgid "could not initialize SSL connection: %s" -msgstr "não pôde inicializar conexão SSL: %s" +msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" +msgstr "não é possível criar uma relação temporária como partição de relação permanente \"%s\"" -#: libpq/be-secure.c:1000 +#: commands/tablecmds.c:2522 commands/tablecmds.c:14920 #, c-format -msgid "could not set SSL socket: %s" -msgstr "não pôde criar soquete SSL: %s" +msgid "cannot inherit from temporary relation \"%s\"" +msgstr "não é possível herdar de uma tabela temporária \"%s\"" -#: libpq/be-secure.c:1026 +#: commands/tablecmds.c:2532 commands/tablecmds.c:14928 #, c-format -msgid "could not accept SSL connection: %m" -msgstr "não pôde aceitar conexão SSL: %m" +msgid "cannot inherit from temporary relation of another session" +msgstr "não é possível herdar de tabela temporária de outra sessão" -#: libpq/be-secure.c:1030 libpq/be-secure.c:1041 +#: commands/tablecmds.c:2585 #, c-format -msgid "could not accept SSL connection: EOF detected" -msgstr "não pôde aceitar conexão SSL: EOF detectado" +msgid "merging multiple inherited definitions of column \"%s\"" +msgstr "juntando múltiplas definições herdadas da coluna \"%s\"" -#: libpq/be-secure.c:1035 +#: commands/tablecmds.c:2597 #, c-format -msgid "could not accept SSL connection: %s" -msgstr "não pôde aceitar conexão SSL: %s" +msgid "inherited column \"%s\" has a type conflict" +msgstr "coluna herdada \"%s\" tem um conflito de tipo" -#: libpq/be-secure.c:1091 +#: commands/tablecmds.c:2599 commands/tablecmds.c:2628 +#: commands/tablecmds.c:2647 commands/tablecmds.c:2919 +#: commands/tablecmds.c:2955 commands/tablecmds.c:2971 +#: parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 +#: parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 +#: parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 +#: parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 +#: parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 +#: parser/parse_param.c:223 #, c-format -msgid "SSL certificate's common name contains embedded null" -msgstr "nome do certificado SSL contém nulo embutido" +msgid "%s versus %s" +msgstr "%s versus %s" -#: libpq/be-secure.c:1102 +#: commands/tablecmds.c:2612 #, c-format -msgid "SSL connection from \"%s\"" -msgstr "conexão SSL de \"%s\"" +msgid "inherited column \"%s\" has a collation conflict" +msgstr "coluna herdada \"%s\" tem um conflito de ordenação" -#: libpq/be-secure.c:1153 -msgid "no SSL error reported" -msgstr "nenhum erro SSL relatado" +#: commands/tablecmds.c:2614 commands/tablecmds.c:2935 +#: commands/tablecmds.c:6849 +#, c-format +msgid "\"%s\" versus \"%s\"" +msgstr "\"%s\" versus \"%s\"" -#: libpq/be-secure.c:1157 +#: commands/tablecmds.c:2626 #, c-format -msgid "SSL error code %lu" -msgstr "código de erro SSL %lu" +msgid "inherited column \"%s\" has a storage parameter conflict" +msgstr "coluna herdada \"%s\" tem um conflito de parâmetro de armazenamento" -#: libpq/crypt.c:67 +#: commands/tablecmds.c:2645 commands/tablecmds.c:2969 #, c-format -msgid "User \"%s\" has no password assigned." -msgstr "Usuário \"%s\" não tem senha atribuída." +msgid "column \"%s\" has a compression method conflict" +msgstr "a coluna \"%s\" tem um conflito de método de compressão" -#: libpq/crypt.c:160 +#: commands/tablecmds.c:2661 #, c-format -msgid "User \"%s\" has an expired password." -msgstr "Usuário \"%s\" tem uma senha expirada." +msgid "inherited column \"%s\" has a generation conflict" +msgstr "a coluna herdada \"%s\" tem um conflito de geração" -#: libpq/hba.c:188 +#: commands/tablecmds.c:2767 commands/tablecmds.c:2822 +#: commands/tablecmds.c:12460 parser/parse_utilcmd.c:1298 +#: parser/parse_utilcmd.c:1341 parser/parse_utilcmd.c:1740 +#: parser/parse_utilcmd.c:1848 #, c-format -msgid "authentication file token too long, skipping: \"%s\"" -msgstr "informação no arquivo de autenticação é muito longa, ignorando: \"%s\"" +msgid "cannot convert whole-row table reference" +msgstr "não é possível converter referência a toda a linha da tabela" -#: libpq/hba.c:332 +#: commands/tablecmds.c:2768 parser/parse_utilcmd.c:1299 #, c-format -msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" -msgstr "não pôde abrir arquivo de autenticação secundário \"@%s\" como \"%s\": %m" +msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "A expressão de geração para a coluna \"%s\" contém uma referência de linha inteira para a tabela \"%s\"." -#: libpq/hba.c:409 +#: commands/tablecmds.c:2823 parser/parse_utilcmd.c:1342 #, c-format -msgid "authentication file line too long" -msgstr "linha do arquivo de autenticação é muito longa" +msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "Restrição \"%s\" contém referência a toda a linha da tabela \"%s\"." -#: libpq/hba.c:410 libpq/hba.c:787 libpq/hba.c:803 libpq/hba.c:833 -#: libpq/hba.c:879 libpq/hba.c:892 libpq/hba.c:914 libpq/hba.c:923 -#: libpq/hba.c:946 libpq/hba.c:958 libpq/hba.c:977 libpq/hba.c:998 -#: libpq/hba.c:1009 libpq/hba.c:1064 libpq/hba.c:1082 libpq/hba.c:1094 -#: libpq/hba.c:1111 libpq/hba.c:1121 libpq/hba.c:1135 libpq/hba.c:1151 -#: libpq/hba.c:1166 libpq/hba.c:1177 libpq/hba.c:1213 libpq/hba.c:1245 -#: libpq/hba.c:1256 libpq/hba.c:1276 libpq/hba.c:1287 libpq/hba.c:1304 -#: libpq/hba.c:1329 libpq/hba.c:1366 libpq/hba.c:1376 libpq/hba.c:1432 -#: libpq/hba.c:1444 libpq/hba.c:1457 libpq/hba.c:1540 libpq/hba.c:1611 -#: libpq/hba.c:1629 libpq/hba.c:1650 tsearch/ts_locale.c:182 +#: commands/tablecmds.c:2901 #, c-format -msgid "line %d of configuration file \"%s\"" -msgstr "linha %d do arquivo de configuração \"%s\"" +msgid "merging column \"%s\" with inherited definition" +msgstr "juntando coluna \"%s\" com definição herdada" -#. translator: the second %s is a list of auth methods -#: libpq/hba.c:785 +#: commands/tablecmds.c:2905 #, c-format -msgid "authentication option \"%s\" is only valid for authentication methods %s" -msgstr "opção de autenticação \"%s\" só é válida para métodos de autenticação %s" +msgid "moving and merging column \"%s\" with inherited definition" +msgstr "movendo e mesclando a coluna \"%s\" com a definição herdada" -#: libpq/hba.c:801 +#: commands/tablecmds.c:2906 #, c-format -msgid "authentication method \"%s\" requires argument \"%s\" to be set" -msgstr "método de autenticação \"%s\" requer que argumento \"%s\" seja definido" +msgid "User-specified column moved to the position of the inherited column." +msgstr "" -#: libpq/hba.c:822 +#: commands/tablecmds.c:2917 #, c-format -msgid "missing entry in file \"%s\" at end of line %d" -msgstr "faltando entrada no arquivo \"%s\" no fim da linha %d" +msgid "column \"%s\" has a type conflict" +msgstr "coluna \"%s\" tem um conflito de tipo" -#: libpq/hba.c:832 +#: commands/tablecmds.c:2933 #, c-format -msgid "multiple values in ident field" -msgstr "múltiplos valores em campo ident" +msgid "column \"%s\" has a collation conflict" +msgstr "coluna \"%s\" tem um conflito de ordenação" -#: libpq/hba.c:877 +#: commands/tablecmds.c:2953 #, c-format -msgid "multiple values specified for connection type" -msgstr "múltiplos valores especificados para tipo de conexão" +msgid "column \"%s\" has a storage parameter conflict" +msgstr "coluna \"%s\" tem um conflito de parâmetro de armazenamento" -#: libpq/hba.c:878 +#: commands/tablecmds.c:2999 commands/tablecmds.c:3086 #, c-format -msgid "Specify exactly one connection type per line." -msgstr "Especifique exatamente um tipo de conexão por linha." +msgid "column \"%s\" inherits from generated column but specifies default" +msgstr "a coluna \"%s\" herda da coluna gerada, mas especifica o valor padrão" -#: libpq/hba.c:891 +#: commands/tablecmds.c:3004 commands/tablecmds.c:3091 #, c-format -msgid "local connections are not supported by this build" -msgstr "conexões locais não são suportadas por essa construção" +msgid "column \"%s\" inherits from generated column but specifies identity" +msgstr "" -#: libpq/hba.c:912 +#: commands/tablecmds.c:3012 commands/tablecmds.c:3099 #, c-format -msgid "hostssl requires SSL to be turned on" -msgstr "hostssl requer que SSL esteja habilitado" +msgid "child column \"%s\" specifies generation expression" +msgstr "a coluna filha \"%s\" especifica a expressão de geração" -#: libpq/hba.c:913 +#: commands/tablecmds.c:3014 commands/tablecmds.c:3101 #, c-format -msgid "Set ssl = on in postgresql.conf." -msgstr "Defina ssl = on no postgresql.conf." +msgid "A child table column cannot be generated unless its parent column is." +msgstr "" -#: libpq/hba.c:921 +#: commands/tablecmds.c:3147 #, c-format -msgid "hostssl is not supported by this build" -msgstr "hostssl não é suportado por essa construção" +msgid "column \"%s\" inherits conflicting generation expressions" +msgstr "a coluna \"%s\" herda expressões de geração conflitantes" -#: libpq/hba.c:922 +#: commands/tablecmds.c:3149 #, c-format -msgid "Compile with --with-openssl to use SSL connections." -msgstr "Compile com --with-openssl para utilizar conexões SSL." +msgid "To resolve the conflict, specify a generation expression explicitly." +msgstr "Para resolver o conflito, especifique explicitamente uma expressão de geração." -#: libpq/hba.c:944 +#: commands/tablecmds.c:3153 #, c-format -msgid "invalid connection type \"%s\"" -msgstr "tipo de conexão \"%s\" é inválido" +msgid "column \"%s\" inherits conflicting default values" +msgstr "coluna \"%s\" herdou valores padrão conflitantes" -#: libpq/hba.c:957 +#: commands/tablecmds.c:3155 #, c-format -msgid "end-of-line before database specification" -msgstr "fim de linha antes da especificação de banco de dados" +msgid "To resolve the conflict, specify a default explicitly." +msgstr "Para resolver o conflito, especifique um padrão explicitamente." -#: libpq/hba.c:976 +#: commands/tablecmds.c:3205 #, c-format -msgid "end-of-line before role specification" -msgstr "fim de linha antes da especificação de role" +msgid "check constraint name \"%s\" appears multiple times but with different expressions" +msgstr "nome da restrição de verificação \"%s\" aparece múltiplas vezes mas com diferentes expressões" -#: libpq/hba.c:997 +#: commands/tablecmds.c:3418 #, c-format -msgid "end-of-line before IP address specification" -msgstr "fim de linha antes da especificação de endereço IP" +msgid "cannot move temporary tables of other sessions" +msgstr "não é possível mover tabelas temporárias de outras sessões" -#: libpq/hba.c:1007 +#: commands/tablecmds.c:3488 #, c-format -msgid "multiple values specified for host address" -msgstr "múltiplos valores especificados para endereço da máquina" +msgid "cannot rename column of typed table" +msgstr "não é possível renomear coluna de tabela tipada" -#: libpq/hba.c:1008 +#: commands/tablecmds.c:3507 #, c-format -msgid "Specify one address range per line." -msgstr "Especifique um intervalo de endereços por linha." +msgid "cannot rename columns of relation \"%s\"" +msgstr "não é possível renomear colunas da relação \"%s\"" -#: libpq/hba.c:1062 +#: commands/tablecmds.c:3602 #, c-format -msgid "invalid IP address \"%s\": %s" -msgstr "endereço IP \"%s\" é inválido: %s" +msgid "inherited column \"%s\" must be renamed in child tables too" +msgstr "coluna herdada \"%s\" deve ser renomeada nas tabelas descendentes também" -#: libpq/hba.c:1080 +#: commands/tablecmds.c:3634 #, c-format -msgid "specifying both host name and CIDR mask is invalid: \"%s\"" -msgstr "especificar nome da máquina e máscara CIDR é inválido: \"%s\"" +msgid "cannot rename system column \"%s\"" +msgstr "não é possível renomear coluna do sistema \"%s\"" -#: libpq/hba.c:1092 +#: commands/tablecmds.c:3649 #, c-format -msgid "invalid CIDR mask in address \"%s\"" -msgstr "máscara CIDR é inválida no endereço \"%s\"" +msgid "cannot rename inherited column \"%s\"" +msgstr "não é possível renomear coluna herdada \"%s\"" -#: libpq/hba.c:1109 +#: commands/tablecmds.c:3801 #, c-format -msgid "end-of-line before netmask specification" -msgstr "fim de linha antes da especificação de máscara de rede" +msgid "inherited constraint \"%s\" must be renamed in child tables too" +msgstr "restrição herdada \"%s\" deve ser renomeada nas tabelas descendentes também" -#: libpq/hba.c:1110 +#: commands/tablecmds.c:3808 #, c-format -msgid "Specify an address range in CIDR notation, or provide a separate netmask." -msgstr "Especifique um intervalo de endereços na notação CIDR ou forneça uma máscara de rede separadamente." +msgid "cannot rename inherited constraint \"%s\"" +msgstr "não é possível renomear restrição herdada \"%s\"" -#: libpq/hba.c:1120 +#. translator: first %s is a SQL command, eg ALTER TABLE +#: commands/tablecmds.c:4105 #, c-format -msgid "multiple values specified for netmask" -msgstr "múltiplos valores especificados para máscara de rede" +msgid "cannot %s \"%s\" because it is being used by active queries in this session" +msgstr "não é possível executar %s \"%s\", porque está sendo usada por consultas ativas nessa sessão" -#: libpq/hba.c:1133 +#. translator: first %s is a SQL command, eg ALTER TABLE +#: commands/tablecmds.c:4114 #, c-format -msgid "invalid IP mask \"%s\": %s" -msgstr "máscara de endereço IP \"%s\" é inválida: %s" +msgid "cannot %s \"%s\" because it has pending trigger events" +msgstr "não é possível executar %s \"%s\", porque tem eventos de gatilho pendentes" -#: libpq/hba.c:1150 +#: commands/tablecmds.c:4581 #, c-format -msgid "IP address and mask do not match" -msgstr "endereço IP e máscara não correspodem" +msgid "cannot alter partition \"%s\" with an incomplete detach" +msgstr "" -#: libpq/hba.c:1165 +#: commands/tablecmds.c:4774 commands/tablecmds.c:4789 #, c-format -msgid "end-of-line before authentication method" -msgstr "fim de linha antes do método de autenticação" +msgid "cannot change persistence setting twice" +msgstr "não é possível alterar a configuração de persistência duas vezes" -#: libpq/hba.c:1175 +#: commands/tablecmds.c:4810 #, c-format -msgid "multiple values specified for authentication type" -msgstr "múltiplos valores especificados para tipo de autenticação" +msgid "cannot change access method of a partitioned table" +msgstr "não é possível alterar o método de acesso de uma tabela particionada" -#: libpq/hba.c:1176 +#: commands/tablecmds.c:4816 #, c-format -msgid "Specify exactly one authentication type per line." -msgstr "Especifique exatamente um tipo de autenticação por linha." +msgid "cannot have multiple SET ACCESS METHOD subcommands" +msgstr "não é possível ter vários subcomandos SET ACCESS METHOD" -#: libpq/hba.c:1243 +#: commands/tablecmds.c:5537 #, c-format -msgid "invalid authentication method \"%s\"" -msgstr "método de autenticação \"%s\" é inválido" +msgid "cannot rewrite system relation \"%s\"" +msgstr "não é possível reescrever a relação do sistema \"%s\"" -#: libpq/hba.c:1254 +#: commands/tablecmds.c:5543 #, c-format -msgid "invalid authentication method \"%s\": not supported by this build" -msgstr "método de autenticação \"%s\" é inválido: não é suportado por essa construção" +msgid "cannot rewrite table \"%s\" used as a catalog table" +msgstr "não foi possível reescrever a tabela \"%s\" usada como tabela de catálogo" -#: libpq/hba.c:1275 +#: commands/tablecmds.c:5553 #, c-format -msgid "gssapi authentication is not supported on local sockets" -msgstr "autenticação do tipo gssapi não é suportada em soquetes locais" +msgid "cannot rewrite temporary tables of other sessions" +msgstr "não é possível reescrever tabelas temporárias de outras sessões" -#: libpq/hba.c:1286 +#: commands/tablecmds.c:6048 #, c-format -msgid "peer authentication is only supported on local sockets" -msgstr "autenticação do tipo peer só é suportada em soquetes locais" +msgid "column \"%s\" of relation \"%s\" contains null values" +msgstr "a coluna \"%s\" da relação \"%s\" contém valores nulos" -#: libpq/hba.c:1303 +#: commands/tablecmds.c:6065 #, c-format -msgid "cert authentication is only supported on hostssl connections" -msgstr "autenticação do tipo cert só é suportada em conexões hostssl" +msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" +msgstr "a restrição de verificação \"%s\" da relação \"%s\" é violada por alguma linha" -#: libpq/hba.c:1328 +#: commands/tablecmds.c:6084 partitioning/partbounds.c:3388 #, c-format -msgid "authentication option not in name=value format: %s" -msgstr "opção de autenticação não está no formato nome=valor: %s" +msgid "updated partition constraint for default partition \"%s\" would be violated by some row" +msgstr "a restrição de partição atualizada para a partição padrão \"%s\" seria violada por alguma linha" -#: libpq/hba.c:1365 +#: commands/tablecmds.c:6090 #, c-format -msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, or ldapurl together with ldapprefix" -msgstr "não pode utilizar ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute ou ldapurl junto com ldapprefix" +msgid "partition constraint of relation \"%s\" is violated by some row" +msgstr "a restrição de partição da relação \"%s\" é violada por alguma linha" -#: libpq/hba.c:1375 +#. translator: %s is a group of some SQL keywords +#: commands/tablecmds.c:6352 #, c-format -msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" -msgstr "método de autenticação \"ldap\" requer que argumento \"ldapbasedn\", \"ldapprefix\" ou \"ldapsuffix\" seja definido" - -#: libpq/hba.c:1418 -msgid "ident, peer, gssapi, sspi, and cert" -msgstr "ident, peer, gssapi, sspi e cert" +msgid "ALTER action %s cannot be performed on relation \"%s\"" +msgstr "a ação ALTER %s não pode ser executada na relação \"%s\"" -#: libpq/hba.c:1431 +#: commands/tablecmds.c:6607 commands/tablecmds.c:6614 #, c-format -msgid "clientcert can only be configured for \"hostssl\" rows" -msgstr "clientcert só pode ser configurado para registros \"hostssl\"" +msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" +msgstr "não é possível alterar o tipo de dados \"%s\", porque coluna \"%s.%s\" utiliza-o" -#: libpq/hba.c:1442 +#: commands/tablecmds.c:6621 #, c-format -msgid "client certificates can only be checked if a root certificate store is available" -msgstr "certificados cliente só podem ser verificados se um certificado raiz estiver disponível" +msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" +msgstr "não é possível alterar a tabela estrangeira \"%s\", porque a coluna \"%s.%s\" utiliza seu tipo de dados" -#: libpq/hba.c:1443 +#: commands/tablecmds.c:6628 #, c-format -msgid "Make sure the configuration parameter \"ssl_ca_file\" is set." -msgstr "Certifique-se que o parâmetro de configuração \"ssl_ca_file\" está definido." +msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" +msgstr "não é possível alterar a tabela \"%s\", porque a coluna \"%s.%s\" utiliza seu tipo" -#: libpq/hba.c:1456 +#: commands/tablecmds.c:6684 #, c-format -msgid "clientcert can not be set to 0 when using \"cert\" authentication" -msgstr "clientcert não pode ser definido como 0 ao utilizar autenticação \"cert\"" +msgid "cannot alter type \"%s\" because it is the type of a typed table" +msgstr "não é possível alterar o tipo de dados \"%s\", porque é o tipo de dados de uma tabela tipada" -#: libpq/hba.c:1483 +#: commands/tablecmds.c:6686 #, c-format -msgid "could not parse LDAP URL \"%s\": %s" -msgstr "não pôde analisar URL do LDAP \"%s\": %s" +msgid "Use ALTER ... CASCADE to alter the typed tables too." +msgstr "Use ALTER ... CASCADE para alterar as tabelas tipadas também." -#: libpq/hba.c:1491 +#: commands/tablecmds.c:6732 #, c-format -msgid "unsupported LDAP URL scheme: %s" -msgstr "esquema da URL do LDAP não é suportado: %s" +msgid "type %s is not a composite type" +msgstr "tipo %s não é um tipo composto" -#: libpq/hba.c:1507 +#: commands/tablecmds.c:6759 #, c-format -msgid "filters not supported in LDAP URLs" -msgstr "filtros não são suportados em URLs do LDAP" +msgid "cannot add column to typed table" +msgstr "não é possível adicionar coluna a tabela tipada" -#: libpq/hba.c:1515 +#: commands/tablecmds.c:6812 #, c-format -msgid "LDAP URLs not supported on this platform" -msgstr "URLs do LDAP não são suportadas nesta plataforma" +msgid "cannot add column to a partition" +msgstr "não é possível adicionar coluna a uma partição" -#: libpq/hba.c:1539 +#: commands/tablecmds.c:6841 commands/tablecmds.c:15171 #, c-format -msgid "invalid LDAP port number: \"%s\"" -msgstr "número de porta LDAP é inválido: \"%s\"" - -#: libpq/hba.c:1579 libpq/hba.c:1586 -msgid "gssapi and sspi" -msgstr "gssapi e sspi" +msgid "child table \"%s\" has different type for column \"%s\"" +msgstr "tabela descendente \"%s\" tem tipo diferente da coluna \"%s\"" -#: libpq/hba.c:1628 +#: commands/tablecmds.c:6847 commands/tablecmds.c:15178 #, c-format -msgid "invalid RADIUS port number: \"%s\"" -msgstr "número de porta RADIUS é inválido: \"%s\"" +msgid "child table \"%s\" has different collation for column \"%s\"" +msgstr "tabela descendente \"%s\" tem ordenação diferente da coluna \"%s\"" -#: libpq/hba.c:1648 +#: commands/tablecmds.c:6865 #, c-format -msgid "unrecognized authentication option name: \"%s\"" -msgstr "nome de opção de autenticação desconhecido: \"%s\"" +msgid "merging definition of column \"%s\" for child \"%s\"" +msgstr "juntando definição da coluna \"%s\" para tabela descendente \"%s\"" -#: libpq/hba.c:1839 +#: commands/tablecmds.c:6908 #, c-format -msgid "configuration file \"%s\" contains no entries" -msgstr "arquivo de configuração \"%s\" não contém entradas" +msgid "cannot recursively add identity column to table that has child tables" +msgstr "" -#: libpq/hba.c:1935 +#: commands/tablecmds.c:7159 #, c-format -msgid "invalid regular expression \"%s\": %s" -msgstr "expressão regular \"%s\" é inválida: %s" +msgid "column must be added to child tables too" +msgstr "coluna deve ser adicionada as tabelas descendentes também" -#: libpq/hba.c:1995 +#: commands/tablecmds.c:7237 #, c-format -msgid "regular expression match for \"%s\" failed: %s" -msgstr "correspondência de expressão regular \"%s\" falhou: %s" +msgid "column \"%s\" of relation \"%s\" already exists, skipping" +msgstr "a coluna \"%s\" da relação \"%s\" já existe, ignorada" -#: libpq/hba.c:2012 +#: commands/tablecmds.c:7244 #, c-format -msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" -msgstr "expressão regular \"%s\" não tem subexpressões como informado na referência anterior em \"%s\"" +msgid "column \"%s\" of relation \"%s\" already exists" +msgstr "coluna \"%s\" da relação \"%s\" já existe" -#: libpq/hba.c:2108 +#: commands/tablecmds.c:7310 commands/tablecmds.c:12098 #, c-format -msgid "provided user name (%s) and authenticated user name (%s) do not match" -msgstr "nome de usuário fornecido (%s) e nome de usuário autenticado (%s) não correspondem" +msgid "cannot remove constraint from only the partitioned table when partitions exist" +msgstr "" -#: libpq/hba.c:2128 +#: commands/tablecmds.c:7311 commands/tablecmds.c:7628 +#: commands/tablecmds.c:8597 commands/tablecmds.c:12099 #, c-format -msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" -msgstr "não há correspondência em mapa de usuários \"%s\" para usuário \"%s\" autenticado como \"%s\"" +msgid "Do not specify the ONLY keyword." +msgstr "" -#: libpq/hba.c:2163 +#: commands/tablecmds.c:7348 commands/tablecmds.c:7554 +#: commands/tablecmds.c:7696 commands/tablecmds.c:7814 +#: commands/tablecmds.c:7908 commands/tablecmds.c:7967 +#: commands/tablecmds.c:8086 commands/tablecmds.c:8225 +#: commands/tablecmds.c:8295 commands/tablecmds.c:8429 +#: commands/tablecmds.c:12253 commands/tablecmds.c:13757 +#: commands/tablecmds.c:16288 #, c-format -msgid "could not open usermap file \"%s\": %m" -msgstr "não pôde abrir arquivo com mapa de usuários \"%s\": %m" +msgid "cannot alter system column \"%s\"" +msgstr "não é possível alterar coluna do sistema \"%s\"" -#: libpq/pqcomm.c:314 +#: commands/tablecmds.c:7354 commands/tablecmds.c:7702 #, c-format -msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" -msgstr "caminho do soquete de domínio Unix \"%s\" é muito longo (máximo de %d bytes)" +msgid "column \"%s\" of relation \"%s\" is an identity column" +msgstr "a coluna \"%s\" da relação \"%s\" é uma coluna de identidade" -#: libpq/pqcomm.c:335 +#: commands/tablecmds.c:7397 #, c-format -msgid "could not translate host name \"%s\", service \"%s\" to address: %s" -msgstr "não pôde traduzir nome da máquina \"%s\", serviço \"%s\" para endereço: %s" +msgid "column \"%s\" is in a primary key" +msgstr "coluna \"%s\" está em uma chave primária" -#: libpq/pqcomm.c:339 +#: commands/tablecmds.c:7402 #, c-format -msgid "could not translate service \"%s\" to address: %s" -msgstr "não pôde traduzir serviço \"%s\" para endereço: %s" +msgid "column \"%s\" is in index used as replica identity" +msgstr "a coluna \"%s\" está no índice usado como identidade de réplica" -#: libpq/pqcomm.c:366 +#: commands/tablecmds.c:7425 #, c-format -msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" -msgstr "não pôde se ligar a todos os endereços informados: MAXLISTEN (%d) excedeu" - -#: libpq/pqcomm.c:375 -msgid "IPv4" -msgstr "IPv4" - -#: libpq/pqcomm.c:379 -msgid "IPv6" -msgstr "IPv6" - -#: libpq/pqcomm.c:384 -msgid "Unix" -msgstr "Unix" +msgid "column \"%s\" is marked NOT NULL in parent table" +msgstr "a coluna \"%s\" está marcada como NOT NULL na tabela mãe" -#: libpq/pqcomm.c:389 +#: commands/tablecmds.c:7625 commands/tablecmds.c:9081 #, c-format -msgid "unrecognized address family %d" -msgstr "família de endereços %d desconhecida" +msgid "constraint must be added to child tables too" +msgstr "restrição deve ser adicionada as tabelas descendentes também" -#. translator: %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:400 +#: commands/tablecmds.c:7626 #, c-format -msgid "could not create %s socket: %m" -msgstr "não pôde criar soquete %s: %m" +msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." +msgstr "A coluna \"%s\" da relação \"%s\" ainda não é NOT NULL." -#: libpq/pqcomm.c:425 +#: commands/tablecmds.c:7711 #, c-format -msgid "setsockopt(SO_REUSEADDR) failed: %m" -msgstr "setsockopt(SO_REUSEADDR) falhou: %m" +msgid "column \"%s\" of relation \"%s\" is a generated column" +msgstr "a coluna \"%s\" da relação \"%s\" é uma coluna gerada" -#: libpq/pqcomm.c:440 +#: commands/tablecmds.c:7825 #, c-format -msgid "setsockopt(IPV6_V6ONLY) failed: %m" -msgstr "setsockopt(IPV6_V6ONLY) falhou: %m" +msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" +msgstr "" -#. translator: %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:459 +#: commands/tablecmds.c:7831 #, c-format -msgid "could not bind %s socket: %m" -msgstr "não pôde se ligar ao soquete %s: %m" +msgid "column \"%s\" of relation \"%s\" is already an identity column" +msgstr "a coluna \"%s\" da relação \"%s\" já é uma coluna de identidade" -#: libpq/pqcomm.c:462 +#: commands/tablecmds.c:7837 #, c-format -msgid "Is another postmaster already running on port %d? If not, remove socket file \"%s\" and retry." -msgstr "Outro postmaster já está executando na porta %d? Se não, remova o arquivo de soquete \"%s\" e tente novamente." +msgid "column \"%s\" of relation \"%s\" already has a default value" +msgstr "a coluna \"%s\" da relação \"%s\" já possui um valor padrão" -#: libpq/pqcomm.c:465 +#: commands/tablecmds.c:7914 commands/tablecmds.c:7975 #, c-format -msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." -msgstr "Outro postmaster já está executando na porta %d? Se não, espere alguns segundos e tente novamente." +msgid "column \"%s\" of relation \"%s\" is not an identity column" +msgstr "a coluna \"%s\" da relação \"%s\" não é uma coluna de identidade" -#. translator: %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:498 +#: commands/tablecmds.c:7980 #, c-format -msgid "could not listen on %s socket: %m" -msgstr "não pôde escutar no soquete %s: %m" +msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" +msgstr "a coluna \"%s\" da relação \"%s\" não é uma coluna de identidade, ignorando" -#: libpq/pqcomm.c:588 +#: commands/tablecmds.c:8033 #, c-format -msgid "group \"%s\" does not exist" -msgstr "grupo \"%s\" não existe" +msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" +msgstr "ALTER TABLE / DROP EXPRESSION também deve ser aplicado a tabelas filhas" -#: libpq/pqcomm.c:598 +#: commands/tablecmds.c:8055 #, c-format -msgid "could not set group of file \"%s\": %m" -msgstr "não pôde definir grupo do arquivo \"%s\": %m" +msgid "cannot drop generation expression from inherited column" +msgstr "não é possível excluir a expressão de geração da coluna herdada" -#: libpq/pqcomm.c:609 +#: commands/tablecmds.c:8094 #, c-format -msgid "could not set permissions of file \"%s\": %m" -msgstr "não pôde definir permissões do arquivo \"%s\": %m" +msgid "column \"%s\" of relation \"%s\" is not a stored generated column" +msgstr "a coluna \"%s\" da relação \"%s\" não é uma coluna gerada armazenada" -#: libpq/pqcomm.c:639 +#: commands/tablecmds.c:8099 #, c-format -msgid "could not accept new connection: %m" -msgstr "não pôde aceitar nova conexão: %m" +msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" +msgstr "a coluna \"%s\" da relação \"%s\" não é uma coluna gerada armazenada, ignorando" -#: libpq/pqcomm.c:811 +#: commands/tablecmds.c:8172 #, c-format -msgid "could not set socket to nonblocking mode: %m" -msgstr "não pôde configurar o soquete para modo sem bloqueio: %m" +msgid "cannot refer to non-index column by number" +msgstr "" -#: libpq/pqcomm.c:817 +#: commands/tablecmds.c:8215 #, c-format -msgid "could not set socket to blocking mode: %m" -msgstr "não pôde configurar o soquete para modo bloqueado: %m" +msgid "column number %d of relation \"%s\" does not exist" +msgstr "não existe a coluna número %d da relação \"%s\"" -#: libpq/pqcomm.c:869 libpq/pqcomm.c:959 +#: commands/tablecmds.c:8234 #, c-format -msgid "could not receive data from client: %m" -msgstr "não pôde receber dados do cliente: %m" +msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" +msgstr "não é possível alterar as estatísticas na coluna incluída \"%s\" do índice \"%s\"" -#: libpq/pqcomm.c:1110 +#: commands/tablecmds.c:8239 #, c-format -msgid "unexpected EOF within message length word" -msgstr "EOF inesperado dentro da palavra de tamanho de mensagem" +msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" +msgstr "não é possível alterar as estatísticas na coluna \"%s\" do índice \"%s\", que não é uma expressão" -#: libpq/pqcomm.c:1121 +#: commands/tablecmds.c:8241 #, c-format -msgid "invalid message length" -msgstr "tamanho de mensagem é inválido" +msgid "Alter statistics on table column instead." +msgstr "Altere as estatísticas na coluna da tabela, em vez disso." -#: libpq/pqcomm.c:1143 libpq/pqcomm.c:1153 +#: commands/tablecmds.c:8476 #, c-format -msgid "incomplete message from client" -msgstr "mensagem incompleta do cliente" +msgid "cannot drop column from typed table" +msgstr "não é possível apagar coluna de tabela tipada" -#: libpq/pqcomm.c:1283 +#: commands/tablecmds.c:8535 #, c-format -msgid "could not send data to client: %m" -msgstr "não pôde enviar dados para cliente: %m" +msgid "column \"%s\" of relation \"%s\" does not exist, skipping" +msgstr "coluna \"%s\" da relação \"%s\" não existe, ignorando" -#: libpq/pqformat.c:436 +#: commands/tablecmds.c:8548 #, c-format -msgid "no data left in message" -msgstr "nenhum dado na mensagem" +msgid "cannot drop system column \"%s\"" +msgstr "não é possível remover coluna do sistema \"%s\"" -#: libpq/pqformat.c:556 libpq/pqformat.c:574 libpq/pqformat.c:595 -#: utils/adt/arrayfuncs.c:1444 utils/adt/rowtypes.c:561 +#: commands/tablecmds.c:8558 #, c-format -msgid "insufficient data left in message" -msgstr "dados insuficientes na mensagem" +msgid "cannot drop inherited column \"%s\"" +msgstr "não é possível remover coluna herdada \"%s\"" -#: libpq/pqformat.c:636 +#: commands/tablecmds.c:8571 #, c-format -msgid "invalid string in message" -msgstr "cadeia de caracteres é inválida na mensagem" +msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" +msgstr "não é possível excluir a coluna \"%s\", porque faz parte da chave de partição da relação \"%s\"" -#: libpq/pqformat.c:652 +#: commands/tablecmds.c:8596 #, c-format -msgid "invalid message format" -msgstr "formato de mensagem é inválido" +msgid "cannot drop column from only the partitioned table when partitions exist" +msgstr "não é possível excluir a coluna apenas da tabela particionada quando existem partições" -#: main/main.c:262 +#: commands/tablecmds.c:8801 #, c-format -msgid "%s: setsysinfo failed: %s\n" -msgstr "%s: setsysinfo falhou: %s\n" +msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" +msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX não tem suporte em tabelas particionadas" -#: main/main.c:284 +#: commands/tablecmds.c:8826 #, c-format -msgid "%s: WSAStartup failed: %d\n" -msgstr "%s: WSAStartup falhou: %d\n" +msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" +msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX irá renomear o índice \"%s\" para \"%s\"" -#: main/main.c:313 +#: commands/tablecmds.c:9163 #, c-format -msgid "" -"%s is the PostgreSQL server.\n" -"\n" +msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "" -"%s é o servidor PostgreSQL.\n" -"\n" -#: main/main.c:314 +#: commands/tablecmds.c:9169 #, c-format -msgid "" -"Usage:\n" -" %s [OPTION]...\n" -"\n" +msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "" -"Uso:\n" -" %s [OPÇÃO]...\n" -"\n" -#: main/main.c:315 +#: commands/tablecmds.c:9172 #, c-format -msgid "Options:\n" -msgstr "Opções:\n" +msgid "This feature is not yet supported on partitioned tables." +msgstr "Esse recurso ainda não tem suporte em tabelas particionadas." -#: main/main.c:317 +#: commands/tablecmds.c:9179 commands/tablecmds.c:9635 #, c-format -msgid " -A 1|0 enable/disable run-time assert checking\n" -msgstr " -A 1|0 habilita/desabilita verificação de asserção em tempo de execução\n" +msgid "referenced relation \"%s\" is not a table" +msgstr "relação referenciada \"%s\" não é uma tabela" -#: main/main.c:319 +#: commands/tablecmds.c:9202 #, c-format -msgid " -B NBUFFERS number of shared buffers\n" -msgstr " -B NBUFFERS número de buffers compartilhados\n" +msgid "constraints on permanent tables may reference only permanent tables" +msgstr "restrições em tabelas permanentes só podem referenciar tabelas permanentes" -#: main/main.c:320 +#: commands/tablecmds.c:9209 #, c-format -msgid " -c NAME=VALUE set run-time parameter\n" -msgstr " -c NOME=VALOR define o parâmetro em tempo de execução\n" +msgid "constraints on unlogged tables may reference only permanent or unlogged tables" +msgstr "restrições em tabelas unlogged só podem referenciar tabelas permanentes ou unlogged" -#: main/main.c:321 +#: commands/tablecmds.c:9215 #, c-format -msgid " -C NAME print value of run-time parameter, then exit\n" -msgstr " -C NOME mostra valor de parâmetro em tempo de execução e termina\n" +msgid "constraints on temporary tables may reference only temporary tables" +msgstr "restrições em tabelas temporárias só podem referenciar tabelas temporárias" -#: main/main.c:322 +#: commands/tablecmds.c:9219 #, c-format -msgid " -d 1-5 debugging level\n" -msgstr " -d 1-5 nível de depuração\n" +msgid "constraints on temporary tables must involve temporary tables of this session" +msgstr "restrições em tabelas temporárias devem envolver tabelas temporárias desta sessão" -#: main/main.c:323 +#: commands/tablecmds.c:9283 commands/tablecmds.c:9289 #, c-format -msgid " -D DATADIR database directory\n" -msgstr " -D DIRDADOS diretório do banco de dados\n" +msgid "invalid %s action for foreign key constraint containing generated column" +msgstr "ação %s inválida para restrição de chave estrangeira contendo coluna gerada" -#: main/main.c:324 +#: commands/tablecmds.c:9305 #, c-format -msgid " -e use European date input format (DMY)\n" -msgstr " -e usa formato de entrada de data europeu (DMY)\n" +msgid "number of referencing and referenced columns for foreign key disagree" +msgstr "número de colunas que referenciam e são referenciadas em um chave estrangeira não correspondem" -#: main/main.c:325 +#: commands/tablecmds.c:9412 #, c-format -msgid " -F turn fsync off\n" -msgstr " -F desabilita o fsync\n" +msgid "foreign key constraint \"%s\" cannot be implemented" +msgstr "restrição de chave estrangeira \"%s\" não pode ser implementada" -#: main/main.c:326 +#: commands/tablecmds.c:9414 #, c-format -msgid " -h HOSTNAME host name or IP address to listen on\n" -msgstr " -h MÃQUINA nome da máquina ou endereço IP para escutar\n" +msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." +msgstr "Colunas chave \"%s\" e \"%s\" são de tipos incompatíveis: %s e %s." -#: main/main.c:327 +#: commands/tablecmds.c:9571 #, c-format -msgid " -i enable TCP/IP connections\n" -msgstr " -i habilita conexões TCP/IP\n" +msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" +msgstr "" -#: main/main.c:328 +#: commands/tablecmds.c:9845 commands/tablecmds.c:10315 +#: parser/parse_utilcmd.c:791 parser/parse_utilcmd.c:920 #, c-format -msgid " -k DIRECTORY Unix-domain socket location\n" -msgstr " -k DIRETÓRIO local do soquete de domínio Unix\n" +msgid "foreign key constraints are not supported on foreign tables" +msgstr "restrições de chave estrangeira não têm suporte em tabelas estrangeiras" -#: main/main.c:330 +#: commands/tablecmds.c:10868 commands/tablecmds.c:11146 +#: commands/tablecmds.c:12055 commands/tablecmds.c:12130 #, c-format -msgid " -l enable SSL connections\n" -msgstr " -l habilita conexões SSL\n" +msgid "constraint \"%s\" of relation \"%s\" does not exist" +msgstr "restrição \"%s\" da relação \"%s\" não existe" -#: main/main.c:332 +#: commands/tablecmds.c:10875 #, c-format -msgid " -N MAX-CONNECT maximum number of allowed connections\n" -msgstr " -N MAX-CONEXÃO número máximo de conexões permitidas\n" +msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" +msgstr "a restrição \"%s\" da relação \"%s\" não é uma restrição de chave estrangeira" -#: main/main.c:333 +#: commands/tablecmds.c:10913 #, c-format -msgid " -o OPTIONS pass \"OPTIONS\" to each server process (obsolete)\n" -msgstr " -o OPÇÕES passa \"OPÇÕES\" para cada processo servidor (obsoleto)\n" +msgid "cannot alter constraint \"%s\" on relation \"%s\"" +msgstr "não é possível alterar a restrição \"%s\" na relação \"%s\"" -#: main/main.c:334 +#: commands/tablecmds.c:10916 #, c-format -msgid " -p PORT port number to listen on\n" -msgstr " -p PORTA número da porta para escutar\n" +msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." +msgstr "A restrição \"%s\" é derivada da restrição \"%s\" da relação \"%s\"." -#: main/main.c:335 +#: commands/tablecmds.c:10918 #, c-format -msgid " -s show statistics after each query\n" -msgstr " -s mostra estatísticas após cada consulta\n" +msgid "You may alter the constraint it derives from instead." +msgstr "" -#: main/main.c:336 +#: commands/tablecmds.c:11154 #, c-format -msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" -msgstr " -S MEM-ORD define a quantidade de memória para ordenações (em kB)\n" +msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" +msgstr "restrição \"%s\" da relação \"%s\" não é uma restrição de chave estrangeira ou restrição de verificação" -#: main/main.c:337 +#: commands/tablecmds.c:11231 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version mostra informação sobre a versão e termina\n" +msgid "constraint must be validated on child tables too" +msgstr "restrição deve ser validada nas tabelas descendentes também" -#: main/main.c:338 +#: commands/tablecmds.c:11318 #, c-format -msgid " --NAME=VALUE set run-time parameter\n" -msgstr " --NOME=VALOR define o parâmetro em tempo de execução\n" +msgid "column \"%s\" referenced in foreign key constraint does not exist" +msgstr "coluna \"%s\" referenciada na restrição de chave estrangeira não existe" -#: main/main.c:339 +#: commands/tablecmds.c:11324 #, c-format -msgid " --describe-config describe configuration parameters, then exit\n" -msgstr " --describe-config descreve parâmetros de configuração e termina\n" +msgid "system columns cannot be used in foreign keys" +msgstr "" -#: main/main.c:340 +#: commands/tablecmds.c:11328 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help mostra essa ajuda e termina\n" +msgid "cannot have more than %d keys in a foreign key" +msgstr "não é possível ter mais do que %d chaves em uma chave estrangeira" -#: main/main.c:342 +#: commands/tablecmds.c:11393 #, c-format -msgid "" -"\n" -"Developer options:\n" -msgstr "" -"\n" -"Opções para desenvolvedor:\n" +msgid "cannot use a deferrable primary key for referenced table \"%s\"" +msgstr "não é possível utilizar uma chave primária postergável na tabela referenciada \"%s\"" -#: main/main.c:343 +#: commands/tablecmds.c:11410 #, c-format -msgid " -f s|i|n|m|h forbid use of some plan types\n" -msgstr " -f s|i|n|m|h impede uso de alguns tipos de planos\n" +msgid "there is no primary key for referenced table \"%s\"" +msgstr "não há chave primária na tabela referenciada \"%s\"" -#: main/main.c:344 +#: commands/tablecmds.c:11474 #, c-format -msgid " -n do not reinitialize shared memory after abnormal exit\n" -msgstr " -n não reinicializa memória compartilhada depois de término anormal\n" +msgid "foreign key referenced-columns list must not contain duplicates" +msgstr "lista de colunas referenciadas na chave estrangeira não deve conter duplicatas" -#: main/main.c:345 +#: commands/tablecmds.c:11566 #, c-format -msgid " -O allow system table structure changes\n" -msgstr " -O permite mudanças na estrutura de tabelas do sistema\n" +msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" +msgstr "não é possível utilizar uma restrição de unicidade postergável na tabela referenciada \"%s\"" -#: main/main.c:346 +#: commands/tablecmds.c:11571 #, c-format -msgid " -P disable system indexes\n" -msgstr " -P desabilita índices do sistema\n" +msgid "there is no unique constraint matching given keys for referenced table \"%s\"" +msgstr "não há restrição de unicidade que corresponde com as colunas informadas na tabela referenciada \"%s\"" -#: main/main.c:347 +#: commands/tablecmds.c:12011 #, c-format -msgid " -t pa|pl|ex show timings after each query\n" -msgstr " -t pa|pl|ex mostra duração depois de cada consulta\n" +msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" +msgstr "não é possível remover restrição herdada \"%s\" da relação \"%s\"" -#: main/main.c:348 +#: commands/tablecmds.c:12061 #, c-format -msgid " -T send SIGSTOP to all backend processes if one dies\n" -msgstr " -T envia SIGSTOP para todos os servidores se um deles morrer\n" +msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" +msgstr "restrição \"%s\" da relação \"%s\" não existe, ignorando" -#: main/main.c:349 +#: commands/tablecmds.c:12237 #, c-format -msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" -msgstr " -W NUM espera NUM segundos para permitir que o depurador seja anexado\n" +msgid "cannot alter column type of typed table" +msgstr "não é possível alterar o tipo de dados de coluna de tabela tipada" -#: main/main.c:351 +#: commands/tablecmds.c:12264 #, c-format -msgid "" -"\n" -"Options for single-user mode:\n" -msgstr "" -"\n" -"Opções para modo monousuário:\n" +msgid "cannot alter inherited column \"%s\"" +msgstr "não é possível alterar coluna herdada \"%s\"" -#: main/main.c:352 +#: commands/tablecmds.c:12273 #, c-format -msgid " --single selects single-user mode (must be first argument)\n" -msgstr " --single seleciona modo monousuário (deve ser o primeiro argumento)\n" +msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" +msgstr "não é possível alterar a coluna \"%s\", porque faz parte da chave de partição da relação \"%s\"" -#: main/main.c:353 +#: commands/tablecmds.c:12323 #, c-format -msgid " DBNAME database name (defaults to user name)\n" -msgstr " NOMEBD nome do banco de dados (padrão é o nome do usuário)\n" +msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" +msgstr "o resultado da cláusula USING para a coluna \"%s\" não pode ser convertido automaticamente para o tipo de dados %s" -#: main/main.c:354 +#: commands/tablecmds.c:12326 #, c-format -msgid " -d 0-5 override debugging level\n" -msgstr " -d 0-5 muda o nível de depuração\n" +msgid "You might need to add an explicit cast." +msgstr "Talvez seja necessário adicionar uma conversão explícita." -#: main/main.c:355 +#: commands/tablecmds.c:12330 #, c-format -msgid " -E echo statement before execution\n" -msgstr " -E mostra consulta antes da execução\n" +msgid "column \"%s\" cannot be cast automatically to type %s" +msgstr "coluna \"%s\" não pode ser convertida automaticamente para tipo %s" -#: main/main.c:356 +#. translator: USING is SQL, don't translate it +#: commands/tablecmds.c:12333 #, c-format -msgid " -j do not use newline as interactive query delimiter\n" -msgstr " -j não usa nova linha como delimitador de consulta iterativa\n" +msgid "You might need to specify \"USING %s::%s\"." +msgstr "Talvez seja necessário especificar \"USING %s::%s\"." -#: main/main.c:357 main/main.c:362 +#: commands/tablecmds.c:12432 #, c-format -msgid " -r FILENAME send stdout and stderr to given file\n" -msgstr " -r ARQUIVO envia saída stdout e stderr para o arquivo designado\n" +msgid "cannot alter inherited column \"%s\" of relation \"%s\"" +msgstr "não é possível alterar a coluna herdada \"%s\" da relação \"%s\"" -#: main/main.c:359 +#: commands/tablecmds.c:12461 #, c-format -msgid "" -"\n" -"Options for bootstrapping mode:\n" -msgstr "" -"\n" -"Opções para modo de ativação:\n" +msgid "USING expression contains a whole-row table reference." +msgstr "A expressão USING contém uma referência de tabela de toda a linha." -#: main/main.c:360 +#: commands/tablecmds.c:12472 #, c-format -msgid " --boot selects bootstrapping mode (must be first argument)\n" -msgstr " --boot seleciona modo de ativação (deve ser o primeiro argumento)\n" +msgid "type of inherited column \"%s\" must be changed in child tables too" +msgstr "tipo de coluna herdada \"%s\" deve ser alterado nas tabelas descendentes também" -#: main/main.c:361 +#: commands/tablecmds.c:12597 #, c-format -msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" -msgstr " NOMEBD nome do banco de dados (argumento obrigatório no modo de ativação)\n" +msgid "cannot alter type of column \"%s\" twice" +msgstr "não é possível alterar o tipo de dados da coluna \"%s\" duas vezes" -#: main/main.c:363 +#: commands/tablecmds.c:12635 #, c-format -msgid " -x NUM internal use\n" -msgstr " -x NUM uso interno\n" +msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" +msgstr "a expressão de geração para a coluna \"%s\" não pode ser convertida automaticamente para o tipo de dados %s" -#: main/main.c:365 +#: commands/tablecmds.c:12640 #, c-format -msgid "" -"\n" -"Please read the documentation for the complete list of run-time\n" -"configuration settings and how to set them on the command line or in\n" -"the configuration file.\n" -"\n" -"Report bugs to .\n" -msgstr "" -"\n" -"Por favor leia a documentação para verificar a lista completa de parâmetros\n" -"de configuração em tempo de execução e como definí-los pela linha de comando\n" -"ou no arquivo de configuração.\n" -"\n" -"Relate erros a .\n" +msgid "default for column \"%s\" cannot be cast automatically to type %s" +msgstr "valor padrão para coluna \"%s\" não pode ser convertido automaticamente para tipo %s" -#: main/main.c:379 +#: commands/tablecmds.c:12721 #, c-format -msgid "" -"\"root\" execution of the PostgreSQL server is not permitted.\n" -"The server must be started under an unprivileged user ID to prevent\n" -"possible system security compromise. See the documentation for\n" -"more information on how to properly start the server.\n" -msgstr "" -"execução do servidor PostgreSQL pelo \"root\" não é permitida.\n" -"O servidor deve ser iniciado por um usuário sem privilégios para previnir\n" -"possíveis comprometimentos de segurança no sistema. Veja a documentação para\n" -"obter informações adicionais sobre como iniciar o servidor corretamente.\n" +msgid "cannot alter type of a column used by a view or rule" +msgstr "não é possível alterar o tipo de dados de uma coluna usada por uma visão ou regra" -#: main/main.c:396 +#: commands/tablecmds.c:12722 commands/tablecmds.c:12741 +#: commands/tablecmds.c:12759 #, c-format -msgid "%s: real and effective user IDs must match\n" -msgstr "%s: IDs do usuário real e efetivo devem corresponder\n" +msgid "%s depends on column \"%s\"" +msgstr "%s depende da coluna \"%s\"" -#: main/main.c:403 +#: commands/tablecmds.c:12740 #, c-format -msgid "" -"Execution of PostgreSQL by a user with administrative permissions is not\n" -"permitted.\n" -"The server must be started under an unprivileged user ID to prevent\n" -"possible system security compromises. See the documentation for\n" -"more information on how to properly start the server.\n" -msgstr "" -"Execução do servidor PostgreSQL por um usuário com permissões administrativas não é\n" -"permitida.\n" -"O servidor deve ser iniciado por um usuário sem privilégios para previnir\n" -"possíveis comprometimentos de segurança no sistema. Veja a documentação para\n" -"obter informações adicionais sobre como iniciar o servidor corretamente.\n" +msgid "cannot alter type of a column used in a trigger definition" +msgstr "não é possível alterar o tipo de dados de uma coluna usada em uma definição de gatilho" -#: nodes/nodeFuncs.c:115 nodes/nodeFuncs.c:141 parser/parse_coerce.c:1782 -#: parser/parse_coerce.c:1810 parser/parse_coerce.c:1886 -#: parser/parse_expr.c:1739 parser/parse_func.c:590 parser/parse_oper.c:948 +#: commands/tablecmds.c:12758 #, c-format -msgid "could not find array type for data type %s" -msgstr "não pôde encontrar tipo array para tipo de dado %s" +msgid "cannot alter type of a column used in a policy definition" +msgstr "não é possível alterar o tipo de dados de coluna usada em uma definição de política" -#: optimizer/path/joinrels.c:722 +#: commands/tablecmds.c:12789 #, c-format -msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" -msgstr "FULL JOIN só é suportado com condições de junção que podem ser utilizadas com junção por mesclagem ou junção por hash" +msgid "cannot alter type of a column used by a generated column" +msgstr "não é possível alterar o tipo de dados de uma coluna usada por uma coluna gerada" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1079 +#: commands/tablecmds.c:12790 #, c-format -msgid "%s cannot be applied to the nullable side of an outer join" -msgstr "%s não pode ser aplicado ao lado com valores nulos de um junção externa" +msgid "Column \"%s\" is used by generated column \"%s\"." +msgstr "A coluna \"%s\" é usada pela coluna gerada \"%s\"." -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1158 parser/analyze.c:1330 parser/analyze.c:1528 -#: parser/analyze.c:2287 +#: commands/tablecmds.c:13865 commands/tablecmds.c:13877 #, c-format -msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" -msgstr "%s não é permitido com UNION/INTERSECT/EXCEPT" +msgid "cannot change owner of index \"%s\"" +msgstr "não é possível mudar o dono do índice \"%s\"" -#: optimizer/plan/planner.c:2723 +#: commands/tablecmds.c:13867 commands/tablecmds.c:13879 #, c-format -msgid "could not implement GROUP BY" -msgstr "não pôde implementar GROUP BY" +msgid "Change the ownership of the index's table instead." +msgstr "Em vez disso, altere o dono da tabela do índice." -#: optimizer/plan/planner.c:2724 optimizer/plan/planner.c:2892 -#: optimizer/prep/prepunion.c:825 +#: commands/tablecmds.c:13893 #, c-format -msgid "Some of the datatypes only support hashing, while others only support sorting." -msgstr "Alguns dos tipos de dados só suportam utilização de hash, enquanto outros só suportam utilização de ordenação." +msgid "cannot change owner of sequence \"%s\"" +msgstr "não é possível mudar o dono da sequência \"%s\"" -#: optimizer/plan/planner.c:2891 +#: commands/tablecmds.c:13918 #, c-format -msgid "could not implement DISTINCT" -msgstr "não pôde implementar DISTINCT" +msgid "cannot change owner of relation \"%s\"" +msgstr "não é possível alterar o dono da relação \"%s\"" -#: optimizer/plan/planner.c:3497 +#: commands/tablecmds.c:14280 #, c-format -msgid "could not implement window PARTITION BY" -msgstr "não pôde implementar deslizante PARTITION BY" +msgid "cannot have multiple SET TABLESPACE subcommands" +msgstr "não é possível ter múltiplos subcomandos SET TABLESPACE" -#: optimizer/plan/planner.c:3498 +#: commands/tablecmds.c:14357 #, c-format -msgid "Window partitioning columns must be of sortable datatypes." -msgstr "Colunas de particionamento de deslizante devem ser de tipos de dados que suportam ordenação." +msgid "cannot set options for relation \"%s\"" +msgstr "não é possível definir opções para a relação \"%s\"" -#: optimizer/plan/planner.c:3502 +#: commands/tablecmds.c:14391 commands/view.c:445 #, c-format -msgid "could not implement window ORDER BY" -msgstr "não pôde implementar deslizante ORDER BY" +msgid "WITH CHECK OPTION is supported only on automatically updatable views" +msgstr "WITH CHECK OPTION só é suportado em visões automaticamente atualizáveis" -#: optimizer/plan/planner.c:3503 +#: commands/tablecmds.c:14641 #, c-format -msgid "Window ordering columns must be of sortable datatypes." -msgstr "Colunas de ordenação de deslizante devem ser de tipos de dados que suportam ordenação." +msgid "only tables, indexes, and materialized views exist in tablespaces" +msgstr "somente existem tabelas, índices e visões materializadas em espaços de tabelas" -#: optimizer/plan/setrefs.c:402 +#: commands/tablecmds.c:14653 #, c-format -msgid "too many range table entries" -msgstr "muitas entradas na tabela de relações" +msgid "cannot move relations in to or out of pg_global tablespace" +msgstr "não é possível mover relações de ou para o espaço de tabelas pg_global" -#: optimizer/prep/prepunion.c:419 +#: commands/tablecmds.c:14745 #, c-format -msgid "could not implement recursive UNION" -msgstr "não pôde implementar UNION recursivo" +msgid "aborting because lock on relation \"%s.%s\" is not available" +msgstr "interrompendo, porque não está disponível o bloqueio na relação \"%s.%s\"" -#: optimizer/prep/prepunion.c:420 +#: commands/tablecmds.c:14761 #, c-format -msgid "All column datatypes must be hashable." -msgstr "Todos os tipos de dados de colunas devem suportar utilização de hash." +msgid "no matching relations in tablespace \"%s\" found" +msgstr "nenhuma relação correspondente foi encontrada no espaço de tabelas \"%s\"" -#. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:824 +#: commands/tablecmds.c:14879 #, c-format -msgid "could not implement %s" -msgstr "não pôde implementar %s" +msgid "cannot change inheritance of typed table" +msgstr "não é possível mudar herança de tabela tipada" -#: optimizer/util/clauses.c:4529 +#: commands/tablecmds.c:14884 commands/tablecmds.c:15402 #, c-format -msgid "SQL function \"%s\" during inlining" -msgstr "função SQL \"%s\" durante expansão em linha" +msgid "cannot change inheritance of a partition" +msgstr "não é possível alterar a herança de uma partição" -#: optimizer/util/plancat.c:104 +#: commands/tablecmds.c:14889 #, c-format -msgid "cannot access temporary or unlogged relations during recovery" -msgstr "não pode criar tabelas temporárias ou unlogged durante recuperação" +msgid "cannot change inheritance of partitioned table" +msgstr "não é possível alterar a herança da tabela particionada" -#: parser/analyze.c:627 parser/analyze.c:1102 +#: commands/tablecmds.c:14935 #, c-format -msgid "VALUES lists must all be the same length" -msgstr "listas de VALUES devem ser todas do mesmo tamanho" +msgid "cannot inherit to temporary relation of another session" +msgstr "não é possível herdar da tabela temporária de outra sessão" -#: parser/analyze.c:794 +#: commands/tablecmds.c:14948 #, c-format -msgid "INSERT has more expressions than target columns" -msgstr "INSERT tem mais expressões do que colunas alvo" +msgid "cannot inherit from a partition" +msgstr "não é possível herdar de uma partição" -#: parser/analyze.c:812 +#: commands/tablecmds.c:14970 commands/tablecmds.c:17833 #, c-format -msgid "INSERT has more target columns than expressions" -msgstr "INSERT tem mais colunas alvo do que expressões" +msgid "circular inheritance not allowed" +msgstr "herança circular não é permitida" -#: parser/analyze.c:816 +#: commands/tablecmds.c:14971 commands/tablecmds.c:17834 #, c-format -msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" -msgstr "A fonte de inserção é uma expressão de registro contendo o mesmo número de colunas esperadas pelo INSERT. Você utilizou acidentalmente parênteses extra?" +msgid "\"%s\" is already a child of \"%s\"." +msgstr "\"%s\" já é um descendente de \"%s\"." -#: parser/analyze.c:924 parser/analyze.c:1303 +#: commands/tablecmds.c:14984 #, c-format -msgid "SELECT ... INTO is not allowed here" -msgstr "SELECT ... INTO não é permitido aqui" +msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" +msgstr "o gatilho \"%s\" impede que a tabela \"%s\" se torne filha de herança" -#: parser/analyze.c:1116 +#: commands/tablecmds.c:14986 #, c-format -msgid "DEFAULT can only appear in a VALUES list within INSERT" -msgstr "DEFAULT só pode aparecer em uma lista de VALUES com INSERT" +msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." +msgstr "" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1235 parser/analyze.c:2459 +#: commands/tablecmds.c:15189 #, c-format -msgid "%s cannot be applied to VALUES" -msgstr "%s não pode ser aplicado a VALUES" +msgid "column \"%s\" in child table must be marked NOT NULL" +msgstr "coluna \"%s\" na tabela descendente deve ser definida como NOT NULL" -#: parser/analyze.c:1456 +#: commands/tablecmds.c:15198 #, c-format -msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" -msgstr "cláusula UNION/INTERSECT/EXCEPT ORDER BY é inválida" +msgid "column \"%s\" in child table must be a generated column" +msgstr "a coluna \"%s\" na tabela filha deve ser uma coluna gerada" -#: parser/analyze.c:1457 +#: commands/tablecmds.c:15203 #, c-format -msgid "Only result column names can be used, not expressions or functions." -msgstr "Somente nomes de colunas resultantes podem ser utilizadas, e não expressões ou funções." +msgid "column \"%s\" in child table must not be a generated column" +msgstr "a coluna \"%s\" na tabela filha não deve ser uma coluna gerada" -#: parser/analyze.c:1458 +#: commands/tablecmds.c:15234 #, c-format -msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." -msgstr "Adicione a expressão/função a todos SELECTs ou mova o UNION para uma cláusula FROM." +msgid "child table is missing column \"%s\"" +msgstr "tabela descendente está faltando coluna \"%s\"" -#: parser/analyze.c:1518 +#: commands/tablecmds.c:15322 #, c-format -msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" -msgstr "INTO só é permitido no primeiro SELECT do UNION/INTERSECT/EXCEPT" +msgid "child table \"%s\" has different definition for check constraint \"%s\"" +msgstr "tabela descendente \"%s\" tem definição diferente para restrição de verificação \"%s\"" -#: parser/analyze.c:1582 +#: commands/tablecmds.c:15330 #, c-format -msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" -msgstr "comando membro do UNION/INTERSECT/EXCEPT não pode referenciar outras relações do mesmo nível da consulta" +msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" +msgstr "restrição \"%s\" conflita com restrição não herdada na tabela descendente \"%s\"" -#: parser/analyze.c:1671 +#: commands/tablecmds.c:15341 #, c-format -msgid "each %s query must have the same number of columns" -msgstr "cada consulta %s deve ter o mesmo número de colunas" +msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" +msgstr "a restrição \"%s\" conflita com a restrição NOT VALID na tabela filha \"%s\"" -#: parser/analyze.c:2051 +#: commands/tablecmds.c:15380 #, c-format -msgid "RETURNING must have at least one column" -msgstr "RETURNING deve ter pelo menos uma coluna" +msgid "child table is missing constraint \"%s\"" +msgstr "tabela descendente está faltando restrição \"%s\"" -#: parser/analyze.c:2088 +#: commands/tablecmds.c:15466 #, c-format -msgid "cannot specify both SCROLL and NO SCROLL" -msgstr "não pode especificar SCROLL e NO SCROLL" +msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" +msgstr "a partição \"%s\" já está pendente de desanexação na tabela particionada \"%s.%s\"" -#: parser/analyze.c:2106 +#: commands/tablecmds.c:15495 commands/tablecmds.c:15543 #, c-format -msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" -msgstr "DECLARE CURSOR não deve conter comandos que modificam dados no WITH" +msgid "relation \"%s\" is not a partition of relation \"%s\"" +msgstr "a relação \"%s\" não é uma partição da relação \"%s\"" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2114 +#: commands/tablecmds.c:15549 #, c-format -msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" -msgstr "DECLARE CURSOR WITH HOLD ... %s não é suportado" +msgid "relation \"%s\" is not a parent of relation \"%s\"" +msgstr "relação \"%s\" não é um ancestral da relação \"%s\"" -#: parser/analyze.c:2117 +#: commands/tablecmds.c:15777 #, c-format -msgid "Holdable cursors must be READ ONLY." -msgstr "Cursores duráveis devem ser READ ONLY." +msgid "typed tables cannot inherit" +msgstr "tabelas tipadas não podem herdar" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2125 +#: commands/tablecmds.c:15807 #, c-format -msgid "DECLARE SCROLL CURSOR ... %s is not supported" -msgstr "DECLARE SCROLL CURSOR ... %s não é suportado" +msgid "table is missing column \"%s\"" +msgstr "tabela está faltando coluna \"%s\"" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2136 +#: commands/tablecmds.c:15818 #, c-format -msgid "DECLARE INSENSITIVE CURSOR ... %s is not supported" -msgstr "DECLARE INSENSITIVE CURSOR ... %s não é suportado" +msgid "table has column \"%s\" where type requires \"%s\"" +msgstr "tabela tem coluna \"%s\" onde tipo requer \"%s\"" -#: parser/analyze.c:2139 +#: commands/tablecmds.c:15827 #, c-format -msgid "Insensitive cursors must be READ ONLY." -msgstr "Cursores insensíveis devem ser READ ONLY." +msgid "table \"%s\" has different type for column \"%s\"" +msgstr "tabela \"%s\" tem tipo diferente para coluna \"%s\"" -#: parser/analyze.c:2205 +#: commands/tablecmds.c:15841 #, c-format -msgid "materialized views must not use data-modifying statements in WITH" -msgstr "visões materializadas não devem conter comandos que modificam dados no WITH" +msgid "table has extra column \"%s\"" +msgstr "tabela tem coluna extra \"%s\"" -#: parser/analyze.c:2215 +#: commands/tablecmds.c:15893 #, c-format -msgid "materialized views must not use temporary tables or views" -msgstr "visões materializadas não devem utilizar tabelas ou visões temporárias" +msgid "\"%s\" is not a typed table" +msgstr "\"%s\" não é uma tabela tipada" -#: parser/analyze.c:2225 +#: commands/tablecmds.c:16067 #, c-format -msgid "materialized views may not be defined using bound parameters" -msgstr "visões materializadas não podem ser definidas utilizando parâmetros relacionados" +msgid "cannot use non-unique index \"%s\" as replica identity" +msgstr "não é possível utilizar o índice não único \"%s\" como identidade da réplica" -#: parser/analyze.c:2237 +#: commands/tablecmds.c:16073 #, c-format -msgid "materialized views cannot be UNLOGGED" -msgstr "visões materializadas não podem ser UNLOGGED" +msgid "cannot use non-immediate index \"%s\" as replica identity" +msgstr "não é possível utilizar o índice não imediato \"%s\" como identidade da réplica" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2294 +#: commands/tablecmds.c:16079 #, c-format -msgid "%s is not allowed with DISTINCT clause" -msgstr "%s não é permitido com cláusula DISTINCT" +msgid "cannot use expression index \"%s\" as replica identity" +msgstr "não é possível utilizar o índice de expressão \"%s\" como identidade da réplica" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2301 +#: commands/tablecmds.c:16085 #, c-format -msgid "%s is not allowed with GROUP BY clause" -msgstr "%s não é permitido com cláusula GROUP BY" +msgid "cannot use partial index \"%s\" as replica identity" +msgstr "não é possível utilizar o índice parcial \"%s\" como identidade da réplica" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2308 +#: commands/tablecmds.c:16102 #, c-format -msgid "%s is not allowed with HAVING clause" -msgstr "%s não é permitido com cláusula HAVING" +msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" +msgstr "o índice \"%s\" não pode ser usado como identidade de réplica, porque a coluna %d é uma coluna do sistema" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2315 +#: commands/tablecmds.c:16109 #, c-format -msgid "%s is not allowed with aggregate functions" +msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" +msgstr "índice \"%s\" não pode ser utilizado como identidade da réplica, porque a coluna \"%s\" contém valores nulos" + +#: commands/tablecmds.c:16354 +#, c-format +msgid "cannot change logged status of table \"%s\" because it is temporary" +msgstr "não é possível alterar o status registrado da tabela \"%s\", porque é temporário" + +#: commands/tablecmds.c:16378 +#, c-format +msgid "cannot change table \"%s\" to unlogged because it is part of a publication" +msgstr "não é possível alterar a tabela \"%s\" para não registrada, porque faz parte de uma publicação" + +#: commands/tablecmds.c:16380 +#, c-format +msgid "Unlogged relations cannot be replicated." +msgstr "Relações sem registro de transações (unlogged) não podem ser replicadas." + +#: commands/tablecmds.c:16425 +#, c-format +msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" +msgstr "não foi possível alterar a tabela \"%s\" para com registro de transações (logged), porque faz referência à tabela sem registro de transações (unlogged) \"%s\"" + +#: commands/tablecmds.c:16435 +#, c-format +msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" +msgstr "não foi possível alterar a tabela \"%s\" para sem registro de transações (unlogged), porque faz referência à tabela com registro de transações (logged) \"%s\"" + +#: commands/tablecmds.c:16493 +#, c-format +msgid "cannot move an owned sequence into another schema" +msgstr "não é possível mover uma sequência com dono para outro esquema" + +#: commands/tablecmds.c:16600 +#, c-format +msgid "relation \"%s\" already exists in schema \"%s\"" +msgstr "relação \"%s\" já existe no esquema \"%s\"" + +#: commands/tablecmds.c:17020 +#, c-format +msgid "\"%s\" is not a table or materialized view" +msgstr "\"%s\" não é uma tabela ou visão materializada" + +#: commands/tablecmds.c:17170 +#, c-format +msgid "\"%s\" is not a composite type" +msgstr "\"%s\" não é um tipo composto" + +#: commands/tablecmds.c:17200 +#, c-format +msgid "cannot change schema of index \"%s\"" +msgstr "não é possível alterar o esquema do índice \"%s\"" + +#: commands/tablecmds.c:17202 commands/tablecmds.c:17216 +#, c-format +msgid "Change the schema of the table instead." +msgstr "Em vez disso, altere o esquema da tabela." + +#: commands/tablecmds.c:17206 +#, c-format +msgid "cannot change schema of composite type \"%s\"" +msgstr "não é possível alterar o esquema do tipo de dados composto \"%s\"" + +#: commands/tablecmds.c:17214 +#, c-format +msgid "cannot change schema of TOAST table \"%s\"" +msgstr "não é possível alterar o esquema da tabela TOAST \"%s\"" + +#: commands/tablecmds.c:17246 +#, c-format +msgid "cannot use \"list\" partition strategy with more than one column" +msgstr "" + +#: commands/tablecmds.c:17312 +#, c-format +msgid "column \"%s\" named in partition key does not exist" +msgstr "não existe a coluna \"%s\" referenciada na chave de partição" + +#: commands/tablecmds.c:17320 +#, c-format +msgid "cannot use system column \"%s\" in partition key" +msgstr "não é possível usar a coluna do sistema \"%s\" na chave de partição" + +#: commands/tablecmds.c:17331 commands/tablecmds.c:17421 +#, c-format +msgid "cannot use generated column in partition key" +msgstr "não é possível usar coluna gerada na chave de partição" + +#: commands/tablecmds.c:17332 commands/tablecmds.c:17422 commands/trigger.c:663 +#: rewrite/rewriteHandler.c:936 rewrite/rewriteHandler.c:971 +#, c-format +msgid "Column \"%s\" is a generated column." +msgstr "A coluna \"%s\" é uma coluna gerada." + +#: commands/tablecmds.c:17404 +#, c-format +msgid "partition key expressions cannot contain system column references" +msgstr "" + +#: commands/tablecmds.c:17451 +#, c-format +msgid "functions in partition key expression must be marked IMMUTABLE" +msgstr "funções na expressão da chave de partição devem ser marcadas como IMMUTABLE" + +#: commands/tablecmds.c:17460 +#, c-format +msgid "cannot use constant expression as partition key" +msgstr "não é possível usar expressão constante como chave de partição" + +#: commands/tablecmds.c:17481 +#, c-format +msgid "could not determine which collation to use for partition expression" +msgstr "não foi possível determinar qual ordenação usar para a expressão de partição" + +#: commands/tablecmds.c:17516 +#, c-format +msgid "You must specify a hash operator class or define a default hash operator class for the data type." +msgstr "Você deve especificar uma classe de operador hash, ou definir uma classe de operador hash padrão para o tipo de dados." + +#: commands/tablecmds.c:17522 +#, c-format +msgid "You must specify a btree operator class or define a default btree operator class for the data type." +msgstr "Você deve especificar uma classe de operador de Ãrvore-B, ou definir uma classe de operador de Ãrvore-B padrão para o tipo de dados." + +#: commands/tablecmds.c:17773 +#, c-format +msgid "\"%s\" is already a partition" +msgstr "\"%s\" já é uma partição" + +#: commands/tablecmds.c:17779 +#, c-format +msgid "cannot attach a typed table as partition" +msgstr "não é possível anexar uma tabela tipada como partição" + +#: commands/tablecmds.c:17795 +#, c-format +msgid "cannot attach inheritance child as partition" +msgstr "" + +#: commands/tablecmds.c:17809 +#, c-format +msgid "cannot attach inheritance parent as partition" +msgstr "não é possível anexar a mãe de herança como partição" + +#: commands/tablecmds.c:17843 +#, c-format +msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" +msgstr "não é possível anexar uma relação temporária como partição da relação permanente \"%s\"" + +#: commands/tablecmds.c:17851 +#, c-format +msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" +msgstr "não é possível anexar uma relação permanente como partição da relação temporária \"%s\"" + +#: commands/tablecmds.c:17859 +#, c-format +msgid "cannot attach as partition of temporary relation of another session" +msgstr "não é possível anexar como partição de relação temporária de outra sessão" + +#: commands/tablecmds.c:17866 +#, c-format +msgid "cannot attach temporary relation of another session as partition" +msgstr "não é possível anexar relação temporária de outra sessão como partição" + +#: commands/tablecmds.c:17886 +#, c-format +msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" +msgstr "a tabela \"%s\" contém a coluna \"%s\" não encontrada na tabela mãe \"%s\"" + +#: commands/tablecmds.c:17889 +#, c-format +msgid "The new partition may contain only the columns present in parent." +msgstr "" + +#: commands/tablecmds.c:17901 +#, c-format +msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" +msgstr "o gatilho \"%s\" impede que a tabela \"%s\" se torne uma partição" + +#: commands/tablecmds.c:17903 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitions." +msgstr "Os gatilhos ROW com tabelas de transição não são têm suporte em partições." + +#: commands/tablecmds.c:18082 +#, c-format +msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" +msgstr "não é possível anexar a tabela estrangeira \"%s\" como partição da tabela particionada \"%s\"" + +#: commands/tablecmds.c:18085 +#, c-format +msgid "Partitioned table \"%s\" contains unique indexes." +msgstr "A tabela particionada \"%s\" contém índices de unicidade." + +#: commands/tablecmds.c:18402 +#, c-format +msgid "cannot detach partitions concurrently when a default partition exists" +msgstr "" + +#: commands/tablecmds.c:18511 +#, c-format +msgid "partitioned table \"%s\" was removed concurrently" +msgstr "" + +#: commands/tablecmds.c:18517 +#, c-format +msgid "partition \"%s\" was removed concurrently" +msgstr "" + +#: commands/tablecmds.c:19032 commands/tablecmds.c:19052 +#: commands/tablecmds.c:19073 commands/tablecmds.c:19092 +#: commands/tablecmds.c:19134 +#, c-format +msgid "cannot attach index \"%s\" as a partition of index \"%s\"" +msgstr "não é possível anexar o índice \"%s\" como uma partição do índice \"%s\"" + +#: commands/tablecmds.c:19035 +#, c-format +msgid "Index \"%s\" is already attached to another index." +msgstr "O índice \"%s\" já está anexado a outro índice." + +#: commands/tablecmds.c:19055 +#, c-format +msgid "Index \"%s\" is not an index on any partition of table \"%s\"." +msgstr "O índice \"%s\" não é um índice de nenhuma partição da tabela \"%s\"." + +#: commands/tablecmds.c:19076 +#, c-format +msgid "The index definitions do not match." +msgstr "As definições de índice não correspondem." + +#: commands/tablecmds.c:19095 +#, c-format +msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." +msgstr "" + +#: commands/tablecmds.c:19137 +#, c-format +msgid "Another index is already attached for partition \"%s\"." +msgstr "" + +#: commands/tablecmds.c:19373 +#, c-format +msgid "column data type %s does not support compression" +msgstr "o tipo de dados de coluna %s não tem suporte para compressão" + +#: commands/tablecmds.c:19380 +#, c-format +msgid "invalid compression method \"%s\"" +msgstr "método de compressão inválido \"%s\"" + +#: commands/tablecmds.c:19406 +#, c-format +msgid "invalid storage type \"%s\"" +msgstr "tipo de armazenamento inválido \"%s\"" + +#: commands/tablecmds.c:19416 +#, c-format +msgid "column data type %s can only have storage PLAIN" +msgstr "o tipo de dados da coluna %s só pode ter armazenamento PLAIN" + +#: commands/tablespace.c:199 commands/tablespace.c:650 +#, c-format +msgid "\"%s\" exists but is not a directory" +msgstr "\"%s\" existe mas, não é um diretório" + +#: commands/tablespace.c:230 +#, c-format +msgid "permission denied to create tablespace \"%s\"" +msgstr "permissão negada para criar o espaço de tabelas \"%s\"" + +#: commands/tablespace.c:232 +#, c-format +msgid "Must be superuser to create a tablespace." +msgstr "É necessário ser um superusuário para criar um espaço de tabelas." + +#: commands/tablespace.c:248 +#, c-format +msgid "tablespace location cannot contain single quotes" +msgstr "o local do espaço de tabelas não pode conter apóstrofos" + +#: commands/tablespace.c:261 +#, c-format +msgid "tablespace location must be an absolute path" +msgstr "o local do espaço de tabelas deve ser um caminho absoluto" + +#: commands/tablespace.c:273 +#, c-format +msgid "tablespace location \"%s\" is too long" +msgstr "o local do espaço de tabelas \"%s\" é muito longo" + +#: commands/tablespace.c:280 +#, c-format +msgid "tablespace location should not be inside the data directory" +msgstr "o local do espaço de tabelas não deve estar dentro do diretório de dados" + +#: commands/tablespace.c:289 commands/tablespace.c:976 +#, c-format +msgid "unacceptable tablespace name \"%s\"" +msgstr "nome de espaço de tabelas inaceitável \"%s\"" + +#: commands/tablespace.c:291 commands/tablespace.c:977 +#, c-format +msgid "The prefix \"pg_\" is reserved for system tablespaces." +msgstr "O prefixo “pg_†é reservado para espaços de tabelas do sistema." + +#: commands/tablespace.c:310 commands/tablespace.c:998 +#, c-format +msgid "tablespace \"%s\" already exists" +msgstr "o espaço de tabelas \"%s\" já existe" + +#: commands/tablespace.c:326 +#, c-format +msgid "pg_tablespace OID value not set when in binary upgrade mode" +msgstr "o valor do OID de pg_tablespace não está definido no modo de atualização binária" + +#: commands/tablespace.c:431 commands/tablespace.c:959 +#: commands/tablespace.c:1048 commands/tablespace.c:1117 +#: commands/tablespace.c:1263 commands/tablespace.c:1466 +#, c-format +msgid "tablespace \"%s\" does not exist" +msgstr "o espaço de tabela \"%s\" não existe" + +#: commands/tablespace.c:437 +#, c-format +msgid "tablespace \"%s\" does not exist, skipping" +msgstr "o espaço de tabelas \"%s\" não existe, ignorando" + +#: commands/tablespace.c:463 +#, c-format +msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" +msgstr "o espaço de tabelas \"%s\" não pode ser excluído, porque alguns objetos dependem dele" + +#: commands/tablespace.c:530 +#, c-format +msgid "tablespace \"%s\" is not empty" +msgstr "o espaço de tabela \"%s\" não está vazio" + +#: commands/tablespace.c:617 +#, c-format +msgid "directory \"%s\" does not exist" +msgstr "o diretório \"%s\" não existe" + +#: commands/tablespace.c:618 +#, c-format +msgid "Create this directory for the tablespace before restarting the server." +msgstr "Crie o diretório para o espaço de tabelas antes de reiniciar o servidor." + +#: commands/tablespace.c:623 +#, c-format +msgid "could not set permissions on directory \"%s\": %m" +msgstr "não foi possível definir permissões no diretório \"%s\": %m" + +#: commands/tablespace.c:655 +#, c-format +msgid "directory \"%s\" already in use as a tablespace" +msgstr "o diretório \"%s\" já está em uso como espaço de tabelas" + +#: commands/tablespace.c:833 commands/tablespace.c:919 +#, c-format +msgid "could not remove symbolic link \"%s\": %m" +msgstr "não foi possível remover o link simbólico \"%s\": %m" + +#: commands/tablespace.c:842 commands/tablespace.c:927 +#, c-format +msgid "\"%s\" is not a directory or symbolic link" +msgstr "\"%s\" não é um diretório ou link simbólico" + +#: commands/tablespace.c:1122 +#, c-format +msgid "Tablespace \"%s\" does not exist." +msgstr "O espaço de tabelas \"%s\" não existe." + +#: commands/tablespace.c:1568 +#, c-format +msgid "directories for tablespace %u could not be removed" +msgstr "diretórios para espaços de tabelas %u não puderam ser removidos" + +#: commands/tablespace.c:1570 +#, c-format +msgid "You can remove the directories manually if necessary." +msgstr "Você pode remover os diretórios manualmente, se necessário." + +#: commands/trigger.c:232 commands/trigger.c:243 +#, c-format +msgid "\"%s\" is a table" +msgstr "\"%s\" é uma tabela" + +#: commands/trigger.c:234 commands/trigger.c:245 +#, c-format +msgid "Tables cannot have INSTEAD OF triggers." +msgstr "Tabelas não podem ter gatilhos INSTEAD OF." + +#: commands/trigger.c:266 +#, c-format +msgid "\"%s\" is a partitioned table" +msgstr "\"%s\" é uma tabela particionada" + +#: commands/trigger.c:268 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitioned tables." +msgstr "Os gatilhos ROW em tabelas de transição não têm suporte em tabelas particionadas." + +#: commands/trigger.c:280 commands/trigger.c:287 commands/trigger.c:451 +#, c-format +msgid "\"%s\" is a view" +msgstr "\"%s\" é uma visão" + +#: commands/trigger.c:282 +#, c-format +msgid "Views cannot have row-level BEFORE or AFTER triggers." +msgstr "Visões não podem ter gatilhos BEFORE ou AFTER no nível de linha." + +#: commands/trigger.c:289 +#, c-format +msgid "Views cannot have TRUNCATE triggers." +msgstr "Visões não podem ter gatilhos TRUNCATE." + +#: commands/trigger.c:297 commands/trigger.c:309 commands/trigger.c:444 +#, c-format +msgid "\"%s\" is a foreign table" +msgstr "\"%s\" é uma tabela estrangeira" + +#: commands/trigger.c:299 +#, c-format +msgid "Foreign tables cannot have INSTEAD OF triggers." +msgstr "Tabelas estrangeiras não podem ter gatilhos INSTEAD OF." + +#: commands/trigger.c:311 +#, c-format +msgid "Foreign tables cannot have constraint triggers." +msgstr "Tabelas estrangeiras não podem ter gatilhos de restrição." + +#: commands/trigger.c:316 commands/trigger.c:1332 commands/trigger.c:1439 +#, c-format +msgid "relation \"%s\" cannot have triggers" +msgstr "a relação \"%s\" não pode ter gatilhos" + +#: commands/trigger.c:387 +#, c-format +msgid "TRUNCATE FOR EACH ROW triggers are not supported" +msgstr "gatilhos TRUNCATE FOR EACH ROW não são suportados" + +#: commands/trigger.c:395 +#, c-format +msgid "INSTEAD OF triggers must be FOR EACH ROW" +msgstr "gatilhos INSTEAD OF devem ser FOR EACH ROW" + +#: commands/trigger.c:399 +#, c-format +msgid "INSTEAD OF triggers cannot have WHEN conditions" +msgstr "gatilhos INSTEAD OF não podem ter condições WHEN" + +#: commands/trigger.c:403 +#, c-format +msgid "INSTEAD OF triggers cannot have column lists" +msgstr "gatilhos INSTEAD OF não podem ter listas de colunas" + +#: commands/trigger.c:432 +#, c-format +msgid "ROW variable naming in the REFERENCING clause is not supported" +msgstr "Dar nome à variável ROW na cláusula REFERENCING não tem suporte" + +#: commands/trigger.c:433 +#, c-format +msgid "Use OLD TABLE or NEW TABLE for naming transition tables." +msgstr "" + +#: commands/trigger.c:446 +#, c-format +msgid "Triggers on foreign tables cannot have transition tables." +msgstr "Gatilhos em tabelas estrangeiras não podem ter tabelas de transição." + +#: commands/trigger.c:453 +#, c-format +msgid "Triggers on views cannot have transition tables." +msgstr "Gatilhos em visões não podem ter tabelas de transição." + +#: commands/trigger.c:469 +#, c-format +msgid "ROW triggers with transition tables are not supported on partitions" +msgstr "os gatilhos ROW com tabelas de transição não são têm suporte em partições" + +#: commands/trigger.c:473 +#, c-format +msgid "ROW triggers with transition tables are not supported on inheritance children" +msgstr "" + +#: commands/trigger.c:479 +#, c-format +msgid "transition table name can only be specified for an AFTER trigger" +msgstr "o nome da tabela de transição só pode ser especificado para um gatilho AFTER" + +#: commands/trigger.c:484 +#, c-format +msgid "TRUNCATE triggers with transition tables are not supported" +msgstr "gatilhos TRUNCATE com tabelas de transição não têm suporte" + +#: commands/trigger.c:501 +#, c-format +msgid "transition tables cannot be specified for triggers with more than one event" +msgstr "" + +#: commands/trigger.c:512 +#, c-format +msgid "transition tables cannot be specified for triggers with column lists" +msgstr "" + +#: commands/trigger.c:529 +#, c-format +msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" +msgstr "" + +#: commands/trigger.c:534 +#, c-format +msgid "NEW TABLE cannot be specified multiple times" +msgstr "" + +#: commands/trigger.c:544 +#, c-format +msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" +msgstr "" + +#: commands/trigger.c:549 +#, c-format +msgid "OLD TABLE cannot be specified multiple times" +msgstr "" + +#: commands/trigger.c:559 +#, c-format +msgid "OLD TABLE name and NEW TABLE name cannot be the same" +msgstr "" + +#: commands/trigger.c:623 commands/trigger.c:636 +#, c-format +msgid "statement trigger's WHEN condition cannot reference column values" +msgstr "condição WHEN de gatilho de comando não pode referenciar valores de coluna" + +#: commands/trigger.c:628 +#, c-format +msgid "INSERT trigger's WHEN condition cannot reference OLD values" +msgstr "condição WHEN de gatilho INSERT não pode referenciar valores OLD" + +#: commands/trigger.c:641 +#, c-format +msgid "DELETE trigger's WHEN condition cannot reference NEW values" +msgstr "condição WHEN de gatilho DELETE não pode referenciar valores NEW" + +#: commands/trigger.c:646 +#, c-format +msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" +msgstr "condição WHEN de gatilho BEFORE não pode referenciar colunas de sistema NEW" + +#: commands/trigger.c:654 commands/trigger.c:662 +#, c-format +msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" +msgstr "a condição WHEN do gatilho BEFORE não pode fazer referência a colunas geradas NEW" + +#: commands/trigger.c:655 +#, c-format +msgid "A whole-row reference is used and the table contains generated columns." +msgstr "" + +#: commands/trigger.c:770 commands/trigger.c:1614 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" already exists" +msgstr "gatilho \"%s\" para relação \"%s\" já existe" + +#: commands/trigger.c:783 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" +msgstr "o gatilho \"%s\" para a relação \"%s\" é um gatilho interno ou filho" + +#: commands/trigger.c:802 +#, c-format +msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" +msgstr "o gatilho \"%s\" para a relação \"%s\" é um gatilho de restrição" + +#: commands/trigger.c:1404 commands/trigger.c:1557 commands/trigger.c:1838 +#, c-format +msgid "trigger \"%s\" for table \"%s\" does not exist" +msgstr "gatilho \"%s\" na tabela \"%s\" não existe" + +#: commands/trigger.c:1529 +#, c-format +msgid "cannot rename trigger \"%s\" on table \"%s\"" +msgstr "não é possível renomear o gatilho \"%s\" na tabela \"%s\"" + +#: commands/trigger.c:1531 +#, c-format +msgid "Rename the trigger on the partitioned table \"%s\" instead." +msgstr "Renomeie o gatilho na tabela particionada \"%s\" em vez disso." + +#: commands/trigger.c:1631 +#, c-format +msgid "renamed trigger \"%s\" on relation \"%s\"" +msgstr "renomeado o gatilho \"%s\" na relação \"%s\"" + +#: commands/trigger.c:1777 +#, c-format +msgid "permission denied: \"%s\" is a system trigger" +msgstr "permissão negada: \"%s\" é um gatilho do sistema" + +#: commands/trigger.c:2386 +#, c-format +msgid "trigger function %u returned null value" +msgstr "função de gatilho %u retornou valor nulo" + +#: commands/trigger.c:2446 commands/trigger.c:2664 commands/trigger.c:2917 +#: commands/trigger.c:3270 +#, c-format +msgid "BEFORE STATEMENT trigger cannot return a value" +msgstr "gatilho BEFORE STATEMENT não pode retornar um valor" + +#: commands/trigger.c:2522 +#, c-format +msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" +msgstr "" + +#: commands/trigger.c:2523 +#, c-format +msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." +msgstr "" + +#: commands/trigger.c:3347 executor/nodeModifyTable.c:2369 +#: executor/nodeModifyTable.c:2452 +#, c-format +msgid "tuple to be updated was already modified by an operation triggered by the current command" +msgstr "tupla a ser atualizada já foi modificada por uma operação disparada pelo comando atual" + +#: commands/trigger.c:3348 executor/nodeModifyTable.c:1535 +#: executor/nodeModifyTable.c:1609 executor/nodeModifyTable.c:2370 +#: executor/nodeModifyTable.c:2453 executor/nodeModifyTable.c:3098 +#, c-format +msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." +msgstr "Considere utilizar um gatilho AFTER ao invés de um gatilho BEFORE para propagar alterações para outras linhas." + +#: commands/trigger.c:3389 executor/nodeLockRows.c:228 +#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:308 +#: executor/nodeModifyTable.c:1551 executor/nodeModifyTable.c:2387 +#: executor/nodeModifyTable.c:2595 +#, c-format +msgid "could not serialize access due to concurrent update" +msgstr "não foi possível serializar acesso devido a uma atualização concorrente" + +#: commands/trigger.c:3397 executor/nodeModifyTable.c:1641 +#: executor/nodeModifyTable.c:2470 executor/nodeModifyTable.c:2619 +#: executor/nodeModifyTable.c:2986 +#, c-format +msgid "could not serialize access due to concurrent delete" +msgstr "não foi possível serializar o acesso devido à exclusão concorrente" + +#: commands/trigger.c:4604 +#, c-format +msgid "cannot fire deferred trigger within security-restricted operation" +msgstr "não é possível disparar o gatilho diferido dentro da operação com restrição de segurança" + +#: commands/trigger.c:5787 +#, c-format +msgid "constraint \"%s\" is not deferrable" +msgstr "restrição \"%s\" não é postergável" + +#: commands/trigger.c:5810 +#, c-format +msgid "constraint \"%s\" does not exist" +msgstr "restrição \"%s\" não existe" + +#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:635 +#, c-format +msgid "function %s should return type %s" +msgstr "função %s deve retornar tipo %s" + +#: commands/tsearchcmds.c:194 +#, c-format +msgid "must be superuser to create text search parsers" +msgstr "é necessário ser um superusuário para criar analisadores de procura de texto completo" + +#: commands/tsearchcmds.c:247 +#, c-format +msgid "text search parser parameter \"%s\" not recognized" +msgstr "o parâmetro do analisador de procura de texto completo \"%s\" não é reconhecido" + +#: commands/tsearchcmds.c:257 +#, c-format +msgid "text search parser start method is required" +msgstr "o método start do analisador de procura de texto completo é requerido" + +#: commands/tsearchcmds.c:262 +#, c-format +msgid "text search parser gettoken method is required" +msgstr "o método gettoken do analisador de procura de texto completo é requerido" + +#: commands/tsearchcmds.c:267 +#, c-format +msgid "text search parser end method is required" +msgstr "o método end do analisador de procura de texto completo é requerido" + +#: commands/tsearchcmds.c:272 +#, c-format +msgid "text search parser lextypes method is required" +msgstr "o método lextypes do analisador de procura de texto completo é requerido" + +#: commands/tsearchcmds.c:366 +#, c-format +msgid "text search template \"%s\" does not accept options" +msgstr "o modelo de procura de texto completo \"%s\" não aceita opções" + +#: commands/tsearchcmds.c:440 +#, c-format +msgid "text search template is required" +msgstr "o modelo de procura de texto completo é requerido" + +#: commands/tsearchcmds.c:701 +#, c-format +msgid "must be superuser to create text search templates" +msgstr "é necessário ser superusuário para criar modelos de procura de texto completo" + +#: commands/tsearchcmds.c:743 +#, c-format +msgid "text search template parameter \"%s\" not recognized" +msgstr "o parâmetro do modelo de procura de texto completo \"%s\" não é reconhecido" + +#: commands/tsearchcmds.c:753 +#, c-format +msgid "text search template lexize method is required" +msgstr "o método lexize do modelo de procura de texto completo é requerido" + +#: commands/tsearchcmds.c:933 +#, c-format +msgid "text search configuration parameter \"%s\" not recognized" +msgstr "o parâmetro de configuração de procura de texto completo \"%s\" não é reconhecido" + +#: commands/tsearchcmds.c:940 +#, c-format +msgid "cannot specify both PARSER and COPY options" +msgstr "não é possível especificar as duas opções PARSER e COPY" + +#: commands/tsearchcmds.c:976 +#, c-format +msgid "text search parser is required" +msgstr "o analisador de procura de texto completo é requerido" + +#: commands/tsearchcmds.c:1241 +#, c-format +msgid "token type \"%s\" does not exist" +msgstr "tipo de elemento \"%s\" não existe" + +#: commands/tsearchcmds.c:1501 +#, c-format +msgid "mapping for token type \"%s\" does not exist" +msgstr "mapeamento para tipo de elemento \"%s\" não existe" + +#: commands/tsearchcmds.c:1507 +#, c-format +msgid "mapping for token type \"%s\" does not exist, skipping" +msgstr "mapeamento para tipo de elemento \"%s\" não existe, ignorando" + +#: commands/tsearchcmds.c:1670 commands/tsearchcmds.c:1785 +#, c-format +msgid "invalid parameter list format: \"%s\"" +msgstr "o formato da lista de parâmetros não é válido: \"%s\"" + +#: commands/typecmds.c:217 +#, c-format +msgid "must be superuser to create a base type" +msgstr "é necessário ser superusuário para criar um tipo base" + +#: commands/typecmds.c:275 +#, c-format +msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." +msgstr "" + +#: commands/typecmds.c:327 commands/typecmds.c:1450 commands/typecmds.c:4263 +#, c-format +msgid "type attribute \"%s\" not recognized" +msgstr "atributo do tipo \"%s\" desconhecido" + +#: commands/typecmds.c:382 +#, c-format +msgid "invalid type category \"%s\": must be simple ASCII" +msgstr "categoria de tipo \"%s\" é inválida: deve ser ASCII simples" + +#: commands/typecmds.c:401 +#, c-format +msgid "array element type cannot be %s" +msgstr "tipo do elemento da matriz não pode ser %s" + +#: commands/typecmds.c:433 +#, c-format +msgid "alignment \"%s\" not recognized" +msgstr "alinhamento \"%s\" desconhecido" + +#: commands/typecmds.c:450 commands/typecmds.c:4137 +#, c-format +msgid "storage \"%s\" not recognized" +msgstr "armazenamento \"%s\" desconhecido" + +#: commands/typecmds.c:461 +#, c-format +msgid "type input function must be specified" +msgstr "função de entrada do tipo deve ser especificada" + +#: commands/typecmds.c:465 +#, c-format +msgid "type output function must be specified" +msgstr "função de saída do tipo deve ser especificada" + +#: commands/typecmds.c:470 +#, c-format +msgid "type modifier output function is useless without a type modifier input function" +msgstr "função de saída do modificador de tipo é inútil sem uma função de entrada do modificador de tipo" + +#: commands/typecmds.c:512 +#, c-format +msgid "element type cannot be specified without a subscripting function" +msgstr "" + +#: commands/typecmds.c:781 +#, c-format +msgid "\"%s\" is not a valid base type for a domain" +msgstr "\"%s\" não é um tipo base válido para um domínio" + +#: commands/typecmds.c:879 +#, c-format +msgid "multiple default expressions" +msgstr "múltiplas expressões padrão" + +#: commands/typecmds.c:942 commands/typecmds.c:951 +#, c-format +msgid "conflicting NULL/NOT NULL constraints" +msgstr "restrições NULL/NOT NULL conflitantes" + +#: commands/typecmds.c:967 +#, c-format +msgid "check constraints for domains cannot be marked NO INHERIT" +msgstr "restrições de verificação para domínios não podem ser marcadas NO INHERIT" + +#: commands/typecmds.c:976 commands/typecmds.c:2956 +#, c-format +msgid "unique constraints not possible for domains" +msgstr "restrições de unicidade não são possíveis para domínios" + +#: commands/typecmds.c:982 commands/typecmds.c:2962 +#, c-format +msgid "primary key constraints not possible for domains" +msgstr "restrições de chave primária não são possíveis para domínios" + +#: commands/typecmds.c:988 commands/typecmds.c:2968 +#, c-format +msgid "exclusion constraints not possible for domains" +msgstr "restrições de exclusão não são possíveis para domínios" + +#: commands/typecmds.c:994 commands/typecmds.c:2974 +#, c-format +msgid "foreign key constraints not possible for domains" +msgstr "restrições de chave estrangeira não são possíveis para domínios" + +#: commands/typecmds.c:1003 commands/typecmds.c:2983 +#, c-format +msgid "specifying constraint deferrability not supported for domains" +msgstr "especificação de postergação de restrição não tem suporte para domínios" + +#: commands/typecmds.c:1317 utils/cache/typcache.c:2567 +#, c-format +msgid "%s is not an enum" +msgstr "%s não é um enum" + +#: commands/typecmds.c:1458 +#, c-format +msgid "type attribute \"subtype\" is required" +msgstr "atributo do tipo \"subtype\" é requerido" + +#: commands/typecmds.c:1463 +#, c-format +msgid "range subtype cannot be %s" +msgstr "subtipo do range não pode ser %s" + +#: commands/typecmds.c:1482 +#, c-format +msgid "range collation specified but subtype does not support collation" +msgstr "especificado ordenação de intervalo, mas o subtipo não dá suporte a ordenação" + +#: commands/typecmds.c:1492 +#, c-format +msgid "cannot specify a canonical function without a pre-created shell type" +msgstr "não é possível especificar uma função canônica sem um tipo shell criado anteriormente" + +#: commands/typecmds.c:1493 +#, c-format +msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." +msgstr "" + +#: commands/typecmds.c:1965 +#, c-format +msgid "type input function %s has multiple matches" +msgstr "a função de entrada do tipo %s tem múltiplas correspondências" + +#: commands/typecmds.c:1983 +#, c-format +msgid "type input function %s must return type %s" +msgstr "função de entrada do tipo %s deve retornar tipo %s" + +#: commands/typecmds.c:1999 +#, c-format +msgid "type input function %s should not be volatile" +msgstr "a função de entrada do tipo %s não deve ser volátil" + +#: commands/typecmds.c:2027 +#, c-format +msgid "type output function %s must return type %s" +msgstr "a função de saída do tipo %s deve retornar o tipo %s" + +#: commands/typecmds.c:2034 +#, c-format +msgid "type output function %s should not be volatile" +msgstr "a função de saída do tipo %s não deve ser volátil" + +#: commands/typecmds.c:2063 +#, c-format +msgid "type receive function %s has multiple matches" +msgstr "a função de recebimento do tipo %s tem múltiplas correspondências" + +#: commands/typecmds.c:2081 +#, c-format +msgid "type receive function %s must return type %s" +msgstr "função de recepção do tipo %s deve retornar tipo %s" + +#: commands/typecmds.c:2088 +#, c-format +msgid "type receive function %s should not be volatile" +msgstr "a função de recebimento do tipo %s não deve ser volátil" + +#: commands/typecmds.c:2116 +#, c-format +msgid "type send function %s must return type %s" +msgstr "a função de envio do tipo %s deve retornar o tipo %s" + +#: commands/typecmds.c:2123 +#, c-format +msgid "type send function %s should not be volatile" +msgstr "a função de envio do tipo %s não deve ser volátil" + +#: commands/typecmds.c:2150 +#, c-format +msgid "typmod_in function %s must return type %s" +msgstr "a função typmod_in %s deve retornar o tipo %s" + +#: commands/typecmds.c:2157 +#, c-format +msgid "type modifier input function %s should not be volatile" +msgstr "função de entrada do modificador de tipo %s não deve ser volátil" + +#: commands/typecmds.c:2184 +#, c-format +msgid "typmod_out function %s must return type %s" +msgstr "a função typmod_out %s deve retornar o tipo %s" + +#: commands/typecmds.c:2191 +#, c-format +msgid "type modifier output function %s should not be volatile" +msgstr "função de saída do modificador de tipo %s não deve ser volátil" + +#: commands/typecmds.c:2218 +#, c-format +msgid "type analyze function %s must return type %s" +msgstr "a função de análise de tipo %s deve retornar o tipo %s" + +#: commands/typecmds.c:2247 +#, c-format +msgid "type subscripting function %s must return type %s" +msgstr "a função de índice de tipo %s deve retornar o tipo %s" + +#: commands/typecmds.c:2257 +#, c-format +msgid "user-defined types cannot use subscripting function %s" +msgstr "" + +#: commands/typecmds.c:2303 +#, c-format +msgid "You must specify an operator class for the range type or define a default operator class for the subtype." +msgstr "Você deve especificar uma classe de operadores para o tipo range ou definir uma classe de operadores padrão para o subtipo." + +#: commands/typecmds.c:2334 +#, c-format +msgid "range canonical function %s must return range type" +msgstr "função canônica de range %s deve retornar tipo range" + +#: commands/typecmds.c:2340 +#, c-format +msgid "range canonical function %s must be immutable" +msgstr "função canônica de range %s deve ser imutável" + +#: commands/typecmds.c:2376 +#, c-format +msgid "range subtype diff function %s must return type %s" +msgstr "a função de comparação de subtipo de intervalo %s deve retornar o tipo %s" + +#: commands/typecmds.c:2383 +#, c-format +msgid "range subtype diff function %s must be immutable" +msgstr "função diff de subtipo range %s deve ser imutável" + +#: commands/typecmds.c:2410 +#, c-format +msgid "pg_type array OID value not set when in binary upgrade mode" +msgstr "o valor do OID da matriz pg_type não está definido quando no modo de atualização binária" + +#: commands/typecmds.c:2443 +#, c-format +msgid "pg_type multirange OID value not set when in binary upgrade mode" +msgstr "o valor do OID do multi-intervalo pg_type não está definido quando no modo de atualização binária" + +#: commands/typecmds.c:2476 +#, c-format +msgid "pg_type multirange array OID value not set when in binary upgrade mode" +msgstr "" + +#: commands/typecmds.c:2772 +#, c-format +msgid "column \"%s\" of table \"%s\" contains null values" +msgstr "coluna \"%s\" da tabela \"%s\" contém valores nulos" + +#: commands/typecmds.c:2885 commands/typecmds.c:3086 +#, c-format +msgid "constraint \"%s\" of domain \"%s\" does not exist" +msgstr "restrição \"%s\" do domínio \"%s\" não existe" + +#: commands/typecmds.c:2889 +#, c-format +msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" +msgstr "restrição \"%s\" do domínio \"%s\" não existe, ignorando" + +#: commands/typecmds.c:3093 +#, c-format +msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" +msgstr "restrição \"%s\" do domínio \"%s\" não é uma restrição de verificação" + +#: commands/typecmds.c:3194 +#, c-format +msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" +msgstr "coluna \"%s\" da tabela \"%s\" contém valores que violam a nova restrição" + +#: commands/typecmds.c:3423 commands/typecmds.c:3622 commands/typecmds.c:3705 +#: commands/typecmds.c:3893 +#, c-format +msgid "%s is not a domain" +msgstr "%s não é um domínio" + +#: commands/typecmds.c:3455 +#, c-format +msgid "constraint \"%s\" for domain \"%s\" already exists" +msgstr "restrição \"%s\" para domínio \"%s\" já existe" + +#: commands/typecmds.c:3506 +#, c-format +msgid "cannot use table references in domain check constraint" +msgstr "não é possível utilizar referências a tabela em restrição de verificação do domínio" + +#: commands/typecmds.c:3634 commands/typecmds.c:3717 commands/typecmds.c:4010 +#, c-format +msgid "%s is a table's row type" +msgstr "%s é um tipo linha da tabela" + +#: commands/typecmds.c:3644 commands/typecmds.c:3727 commands/typecmds.c:3925 +#, c-format +msgid "cannot alter array type %s" +msgstr "não é possível alterar o tipo de dados matriz %s" + +#: commands/typecmds.c:3646 commands/typecmds.c:3729 commands/typecmds.c:3927 +#, c-format +msgid "You can alter type %s, which will alter the array type as well." +msgstr "Você pode alterar tipo %s, que alterará o tipo array também." + +#: commands/typecmds.c:3995 +#, c-format +msgid "type \"%s\" already exists in schema \"%s\"" +msgstr "tipo \"%s\" já existe no esquema \"%s\"" + +#: commands/typecmds.c:4165 +#, c-format +msgid "cannot change type's storage to PLAIN" +msgstr "não é possível alterar o armazenamento do tipo de dados para PLAIN" + +#: commands/typecmds.c:4258 +#, c-format +msgid "type attribute \"%s\" cannot be changed" +msgstr "o atributo de tipo de dados \"%s\" não pode ser alterado" + +#: commands/typecmds.c:4276 +#, c-format +msgid "must be superuser to alter a type" +msgstr "é necessário ser um superusuário para alterar um tipo de dados" + +#: commands/typecmds.c:4297 commands/typecmds.c:4306 +#, c-format +msgid "%s is not a base type" +msgstr "%s não é um tipo de dados base" + +#: commands/user.c:201 +#, c-format +msgid "SYSID can no longer be specified" +msgstr "SYSID não pode mais ser especificado" + +#: commands/user.c:319 commands/user.c:325 commands/user.c:331 +#: commands/user.c:337 commands/user.c:343 +#, c-format +msgid "permission denied to create role" +msgstr "permissão negada ao criar role" + +#: commands/user.c:320 +#, c-format +msgid "Only roles with the %s attribute may create roles." +msgstr "" + +#: commands/user.c:326 commands/user.c:332 commands/user.c:338 +#: commands/user.c:344 +#, c-format +msgid "Only roles with the %s attribute may create roles with the %s attribute." +msgstr "" + +#: commands/user.c:355 commands/user.c:1393 commands/user.c:1400 gram.y:16726 +#: gram.y:16772 utils/adt/acl.c:5401 utils/adt/acl.c:5407 +#, c-format +msgid "role name \"%s\" is reserved" +msgstr "nome de role \"%s\" é reservado" + +#: commands/user.c:357 commands/user.c:1395 commands/user.c:1402 +#, c-format +msgid "Role names starting with \"pg_\" are reserved." +msgstr "Os nomes de funções de banco de dados (roles) que começam com \"pg_\" são reservados." + +#: commands/user.c:378 commands/user.c:1417 +#, c-format +msgid "role \"%s\" already exists" +msgstr "a função de banco de dados (role) \"%s\" já existe" + +#: commands/user.c:440 commands/user.c:925 +#, c-format +msgid "empty string is not a valid password, clearing password" +msgstr "uma cadeia de caracteres vazia não é uma senha válida, limpando a senha" + +#: commands/user.c:469 +#, c-format +msgid "pg_authid OID value not set when in binary upgrade mode" +msgstr "o valor do OID de pg_authid não está definido quando no modo de atualização binária" + +#: commands/user.c:653 commands/user.c:1011 +msgid "Cannot alter reserved roles." +msgstr "Não é possível alterar funções de banco de dados (roles) reservadas." + +#: commands/user.c:760 commands/user.c:766 commands/user.c:782 +#: commands/user.c:790 commands/user.c:804 commands/user.c:810 +#: commands/user.c:816 commands/user.c:825 commands/user.c:870 +#: commands/user.c:1033 commands/user.c:1044 +#, c-format +msgid "permission denied to alter role" +msgstr "permissão negada para alterar função de banco de dados (role)" + +#: commands/user.c:761 commands/user.c:1034 +#, c-format +msgid "Only roles with the %s attribute may alter roles with the %s attribute." +msgstr "" + +#: commands/user.c:767 commands/user.c:805 commands/user.c:811 +#: commands/user.c:817 +#, c-format +msgid "Only roles with the %s attribute may change the %s attribute." +msgstr "" + +#: commands/user.c:783 commands/user.c:1045 +#, c-format +msgid "Only roles with the %s attribute and the %s option on role \"%s\" may alter this role." +msgstr "" + +#: commands/user.c:791 +#, c-format +msgid "To change another role's password, the current user must have the %s attribute and the %s option on the role." +msgstr "" + +#: commands/user.c:826 +#, c-format +msgid "Only roles with the %s option on role \"%s\" may add members." +msgstr "" + +#: commands/user.c:871 +#, c-format +msgid "The bootstrap user must have the %s attribute." +msgstr "" + +#: commands/user.c:1076 +#, c-format +msgid "permission denied to alter setting" +msgstr "permissão negada para alterar a definição" + +#: commands/user.c:1077 +#, c-format +msgid "Only roles with the %s attribute may alter settings globally." +msgstr "Somente funções de banco de dados (roles) com o atributo %s podem alterar as definições globalmente." + +#: commands/user.c:1101 commands/user.c:1173 commands/user.c:1179 +#, c-format +msgid "permission denied to drop role" +msgstr "permissão negada ao remover role" + +#: commands/user.c:1102 +#, c-format +msgid "Only roles with the %s attribute and the %s option on the target roles may drop roles." +msgstr "" + +#: commands/user.c:1127 +#, c-format +msgid "cannot use special role specifier in DROP ROLE" +msgstr "" + +#: commands/user.c:1137 commands/user.c:1364 commands/variable.c:836 +#: commands/variable.c:839 commands/variable.c:923 commands/variable.c:926 +#: utils/adt/acl.c:356 utils/adt/acl.c:376 utils/adt/acl.c:5256 +#: utils/adt/acl.c:5304 utils/adt/acl.c:5332 utils/adt/acl.c:5351 +#: utils/adt/regproc.c:1551 utils/init/miscinit.c:756 +#, c-format +msgid "role \"%s\" does not exist" +msgstr "role \"%s\" não existe" + +#: commands/user.c:1142 +#, c-format +msgid "role \"%s\" does not exist, skipping" +msgstr "role \"%s\" não existe, ignorando" + +#: commands/user.c:1155 commands/user.c:1159 +#, c-format +msgid "current user cannot be dropped" +msgstr "usuário atual não pode ser removido" + +#: commands/user.c:1163 +#, c-format +msgid "session user cannot be dropped" +msgstr "usuário de sessão não pode ser removido" + +#: commands/user.c:1174 +#, c-format +msgid "Only roles with the %s attribute may drop roles with the %s attribute." +msgstr "" + +#: commands/user.c:1180 +#, c-format +msgid "Only roles with the %s attribute and the %s option on role \"%s\" may drop this role." +msgstr "" + +#: commands/user.c:1306 +#, c-format +msgid "role \"%s\" cannot be dropped because some objects depend on it" +msgstr "role \"%s\" não pode ser removida, porque alguns objetos dependem dela" + +#: commands/user.c:1380 +#, c-format +msgid "session user cannot be renamed" +msgstr "usuário de sessão não pode ser renomeado" + +#: commands/user.c:1384 +#, c-format +msgid "current user cannot be renamed" +msgstr "usuário atual não pode ser renomeado" + +#: commands/user.c:1428 commands/user.c:1438 +#, c-format +msgid "permission denied to rename role" +msgstr "permissão negada ao renomear role" + +#: commands/user.c:1429 +#, c-format +msgid "Only roles with the %s attribute may rename roles with the %s attribute." +msgstr "" + +#: commands/user.c:1439 +#, c-format +msgid "Only roles with the %s attribute and the %s option on role \"%s\" may rename this role." +msgstr "" + +#: commands/user.c:1461 +#, c-format +msgid "MD5 password cleared because of role rename" +msgstr "a senha MD5 foi limpa, porque a função de banco de dados (role) foi renomeada" + +#: commands/user.c:1525 gram.y:1260 +#, c-format +msgid "unrecognized role option \"%s\"" +msgstr "opção de role desconhecida \"%s\"" + +#: commands/user.c:1530 +#, c-format +msgid "unrecognized value for role option \"%s\": \"%s\"" +msgstr "valor não reconhecido para opção da função de banco de dados (role) \"%s\": \"%s\"" + +#: commands/user.c:1563 +#, c-format +msgid "column names cannot be included in GRANT/REVOKE ROLE" +msgstr "nomes de coluna não podem ser incluídos em GRANT/REVOKE ROLE" + +#: commands/user.c:1603 +#, c-format +msgid "permission denied to drop objects" +msgstr "permissão negada ao remover objetos" + +#: commands/user.c:1604 +#, c-format +msgid "Only roles with privileges of role \"%s\" may drop objects owned by it." +msgstr "" + +#: commands/user.c:1632 commands/user.c:1643 +#, c-format +msgid "permission denied to reassign objects" +msgstr "permissão negada ao reatribuir objetos" + +#: commands/user.c:1633 +#, c-format +msgid "Only roles with privileges of role \"%s\" may reassign objects owned by it." +msgstr "" + +#: commands/user.c:1644 +#, c-format +msgid "Only roles with privileges of role \"%s\" may reassign objects to it." +msgstr "" + +#: commands/user.c:1740 +#, c-format +msgid "role \"%s\" cannot be a member of any role" +msgstr "a função de banco de dados (role) \"%s\" não pode ser membro de nenhuma função de banco de dados" + +#: commands/user.c:1753 +#, c-format +msgid "role \"%s\" is a member of role \"%s\"" +msgstr "role \"%s\" é um membro da role \"%s\"" + +#: commands/user.c:1793 commands/user.c:1819 +#, c-format +msgid "%s option cannot be granted back to your own grantor" +msgstr "A opção de concessão %s não pode ser concedida de volta ao seu próprio concedente" + +#: commands/user.c:1896 +#, c-format +msgid "role \"%s\" has already been granted membership in role \"%s\" by role \"%s\"" +msgstr "a função de banco de dados (role) \"%s\" já teve a participação concedida na função de banco de dados \"%s\" pela função de banco de dados \"%s\"" + +#: commands/user.c:2031 +#, c-format +msgid "role \"%s\" has not been granted membership in role \"%s\" by role \"%s\"" +msgstr "a função de banco de dados (role) \"%s\" não teve a participação concedida na função de banco de dados \"%s\" pela função de banco de dados \"%s\"" + +#: commands/user.c:2131 +#, c-format +msgid "role \"%s\" cannot have explicit members" +msgstr "a função de banco de dados (role) \"%s\" não pode ter membros explícitos" + +#: commands/user.c:2142 commands/user.c:2165 +#, c-format +msgid "permission denied to grant role \"%s\"" +msgstr "permissão negada para conceder função de banco de dados (role) \"%s\"" + +#: commands/user.c:2144 +#, c-format +msgid "Only roles with the %s attribute may grant roles with the %s attribute." +msgstr "" + +#: commands/user.c:2149 commands/user.c:2172 +#, c-format +msgid "permission denied to revoke role \"%s\"" +msgstr "permissão negada para revogar a função de banco de dados (role) \"%s\"" + +#: commands/user.c:2151 +#, c-format +msgid "Only roles with the %s attribute may revoke roles with the %s attribute." +msgstr "" + +#: commands/user.c:2167 +#, c-format +msgid "Only roles with the %s option on role \"%s\" may grant this role." +msgstr "" + +#: commands/user.c:2174 +#, c-format +msgid "Only roles with the %s option on role \"%s\" may revoke this role." +msgstr "" + +#: commands/user.c:2254 commands/user.c:2263 +#, c-format +msgid "permission denied to grant privileges as role \"%s\"" +msgstr "permissão negada para conceder privilégios como função de banco de dados (role) \"%s\"" + +#: commands/user.c:2256 +#, c-format +msgid "Only roles with privileges of role \"%s\" may grant privileges as this role." +msgstr "" + +#: commands/user.c:2265 +#, c-format +msgid "The grantor must have the %s option on role \"%s\"." +msgstr "O concedente deve ter a opção %s na função de banco de dados (role) \"%s\"." + +#: commands/user.c:2273 +#, c-format +msgid "permission denied to revoke privileges granted by role \"%s\"" +msgstr "permissão negada para revogar privilégios concedidos pela função de banco de dados (role) \"%s\"" + +#: commands/user.c:2275 +#, c-format +msgid "Only roles with privileges of role \"%s\" may revoke privileges granted by this role." +msgstr "" + +#: commands/user.c:2498 utils/adt/acl.c:1309 +#, c-format +msgid "dependent privileges exist" +msgstr "privilégios dependentes existem" + +#: commands/user.c:2499 utils/adt/acl.c:1310 +#, c-format +msgid "Use CASCADE to revoke them too." +msgstr "Use CASCADE para revogá-los também." + +#: commands/vacuum.c:137 +#, c-format +msgid "\"vacuum_buffer_usage_limit\" must be 0 or between %d kB and %d kB" +msgstr "" + +#: commands/vacuum.c:209 +#, c-format +msgid "BUFFER_USAGE_LIMIT option must be 0 or between %d kB and %d kB" +msgstr "a opção BUFFER_USAGE_LIMIT deve ser 0, ou estar entre %d kB e %d kB" + +#: commands/vacuum.c:219 +#, c-format +msgid "unrecognized ANALYZE option \"%s\"" +msgstr "opção do ANALYZE não reconhecida \"%s\"" + +#: commands/vacuum.c:259 +#, c-format +msgid "parallel option requires a value between 0 and %d" +msgstr "a opção paralela requer um valor entre 0 e %d" + +#: commands/vacuum.c:271 +#, c-format +msgid "parallel workers for vacuum must be between 0 and %d" +msgstr "o número de processos trabalhadores paralelos para \"vacuum\" devem estar entre 0 e %d" + +#: commands/vacuum.c:292 +#, c-format +msgid "unrecognized VACUUM option \"%s\"" +msgstr "opção para VACUUM não reconhecida \"%s\"" + +#: commands/vacuum.c:318 +#, c-format +msgid "VACUUM FULL cannot be performed in parallel" +msgstr "" + +#: commands/vacuum.c:329 +#, c-format +msgid "BUFFER_USAGE_LIMIT cannot be specified for VACUUM FULL" +msgstr "" + +#: commands/vacuum.c:343 +#, c-format +msgid "ANALYZE option must be specified when a column list is provided" +msgstr "a opção do ANALYZE deve ser especificada quando é fornecida a lista de colunas" + +#: commands/vacuum.c:355 +#, c-format +msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" +msgstr "" + +#: commands/vacuum.c:362 +#, c-format +msgid "PROCESS_TOAST required with VACUUM FULL" +msgstr "" + +#: commands/vacuum.c:371 +#, c-format +msgid "ONLY_DATABASE_STATS cannot be specified with a list of tables" +msgstr "" + +#: commands/vacuum.c:380 +#, c-format +msgid "ONLY_DATABASE_STATS cannot be specified with other VACUUM options" +msgstr "" + +#: commands/vacuum.c:515 +#, c-format +msgid "%s cannot be executed from VACUUM or ANALYZE" +msgstr "%s não pode ser executado a partir de VACUUM ou ANALYZE" + +#: commands/vacuum.c:733 +#, c-format +msgid "permission denied to vacuum \"%s\", skipping it" +msgstr "permissão negada para limpar (vacuum) \"%s\", ignorando" + +#: commands/vacuum.c:746 +#, c-format +msgid "permission denied to analyze \"%s\", skipping it" +msgstr "permissão negada para analisar \"%s\", ignorando" + +#: commands/vacuum.c:824 commands/vacuum.c:921 +#, c-format +msgid "skipping vacuum of \"%s\" --- lock not available" +msgstr "ignorando limpeza de \"%s\" --- bloqueio não está disponível" + +#: commands/vacuum.c:829 +#, c-format +msgid "skipping vacuum of \"%s\" --- relation no longer exists" +msgstr "pulando a limpeza (vacuum) de \"%s\" --- a relação não existe mais" + +#: commands/vacuum.c:845 commands/vacuum.c:926 +#, c-format +msgid "skipping analyze of \"%s\" --- lock not available" +msgstr "ignorando análise de \"%s\" --- bloqueio não está disponível" + +#: commands/vacuum.c:850 +#, c-format +msgid "skipping analyze of \"%s\" --- relation no longer exists" +msgstr "pulando a análise de \"%s\" --- a relação não existe mais" + +#: commands/vacuum.c:1161 +#, c-format +msgid "cutoff for removing and freezing tuples is far in the past" +msgstr "o ponto limite para remover e congelar tuplas está distante no passado" + +#: commands/vacuum.c:1162 commands/vacuum.c:1167 +#, c-format +msgid "" +"Close open transactions soon to avoid wraparound problems.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"Feche as transações abertas logo para evitar problemas de reutilização de identificadores de transação (wraparound).\n" +"Talvez você também precise efetivar ou desfazer transações preparadas antigas, ou excluir encaixes de replicação obsoletos." + +#: commands/vacuum.c:1166 +#, c-format +msgid "cutoff for freezing multixacts is far in the past" +msgstr "o ponto limite para congelar multixacts está distante no passado" + +#: commands/vacuum.c:1908 +#, c-format +msgid "some databases have not been vacuumed in over 2 billion transactions" +msgstr "alguns bancos de dados não foram limpos a mais de 2 bilhões de transações" + +#: commands/vacuum.c:1909 +#, c-format +msgid "You might have already suffered transaction-wraparound data loss." +msgstr "Você já pode ter sofrido problemas de perda de dados devido a reutilização de identificadores de transação (wraparound)." + +#: commands/vacuum.c:2078 +#, c-format +msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" +msgstr "ignorando \"%s\" --- não pode limpar objetos que não são tabelas ou tabelas especiais do sistema" + +#: commands/vacuum.c:2503 +#, c-format +msgid "scanned index \"%s\" to remove %d row versions" +msgstr "índice \"%s\" varrido para remover %d versões de linha" + +#: commands/vacuum.c:2522 +#, c-format +msgid "index \"%s\" now contains %.0f row versions in %u pages" +msgstr "o índice \"%s\" agora contém %.0f versões de linha em %u páginas" + +#: commands/vacuum.c:2526 +#, c-format +msgid "" +"%.0f index row versions were removed.\n" +"%u index pages were newly deleted.\n" +"%u index pages are currently deleted, of which %u are currently reusable." +msgstr "" +"%.0f versões de linha de índice foram removidas.\n" +"%u páginas de índice foram excluídas recentemente.\n" +"%u páginas de índice estão excluídas no momento, das quais %u são reutilizáveis no momento." + +#: commands/vacuumparallel.c:677 +#, c-format +msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" +msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" +msgstr[0] "" +msgstr[1] "" + +#: commands/vacuumparallel.c:683 +#, c-format +msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" +msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" +msgstr[0] "" +msgstr[1] "" + +#: commands/variable.c:185 +#, c-format +msgid "Conflicting \"datestyle\" specifications." +msgstr "Especificações de \"datestyle\" conflitantes." + +#: commands/variable.c:307 +#, c-format +msgid "Cannot specify months in time zone interval." +msgstr "Não é possível especificar meses em intervalo de zona horária." + +#: commands/variable.c:313 +#, c-format +msgid "Cannot specify days in time zone interval." +msgstr "Não é possível especificar dias em intervalo de zona horária." + +#: commands/variable.c:351 commands/variable.c:433 +#, c-format +msgid "time zone \"%s\" appears to use leap seconds" +msgstr "zona horária \"%s\" parece utilizar segundos intercalados" + +#: commands/variable.c:353 commands/variable.c:435 +#, c-format +msgid "PostgreSQL does not support leap seconds." +msgstr "O PostgreSQL não dá suporte a segundos intercalados." + +#: commands/variable.c:362 +#, c-format +msgid "UTC timezone offset is out of range." +msgstr "deslocamento de zona horária UTC está fora do intervalo." + +#: commands/variable.c:552 +#, c-format +msgid "cannot set transaction read-write mode inside a read-only transaction" +msgstr "não é possível definir o modo leitura-escrita da transação dentro de uma transação de leitura-apenas" + +#: commands/variable.c:559 +#, c-format +msgid "transaction read-write mode must be set before any query" +msgstr "modo leitura-escrita de transação deve ser definido antes de qualquer consulta" + +#: commands/variable.c:566 +#, c-format +msgid "cannot set transaction read-write mode during recovery" +msgstr "não é possível definir o modo leitura-escrita da transação durante recuperação" + +#: commands/variable.c:592 +#, c-format +msgid "SET TRANSACTION ISOLATION LEVEL must be called before any query" +msgstr "SET TRANSACTION ISOLATION LEVEL deve ser chamado antes de qualquer consulta" + +#: commands/variable.c:599 +#, c-format +msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" +msgstr "SET TRANSACTION ISOLATION LEVEL não deve ser chamado em uma subtransação" + +#: commands/variable.c:606 storage/lmgr/predicate.c:1629 +#, c-format +msgid "cannot use serializable mode in a hot standby" +msgstr "não é possível utilizar o modo serializável em um servidor em-espera ativo (hot standby)" + +#: commands/variable.c:607 +#, c-format +msgid "You can use REPEATABLE READ instead." +msgstr "Você pode utilizar REPEATABLE READ ao invés disso." + +#: commands/variable.c:625 +#, c-format +msgid "SET TRANSACTION [NOT] DEFERRABLE cannot be called within a subtransaction" +msgstr "SET TRANSACTION [NOT] DEFERRABLE não pode ser chamado em uma subtransação" + +#: commands/variable.c:631 +#, c-format +msgid "SET TRANSACTION [NOT] DEFERRABLE must be called before any query" +msgstr "SET TRANSACTION [NOT] DEFERRABLE deve ser chamado antes de qualquer consulta" + +#: commands/variable.c:713 +#, c-format +msgid "Conversion between %s and %s is not supported." +msgstr "A conversão entre %s e %s não tem suporte." + +#: commands/variable.c:720 +#, c-format +msgid "Cannot change \"client_encoding\" now." +msgstr "Não é possível alterar \"client_encoding\" nesse momento." + +#: commands/variable.c:781 +#, c-format +msgid "cannot change client_encoding during a parallel operation" +msgstr "não é possível alterar client_encoding durante uma operação paralela" + +#: commands/variable.c:948 +#, c-format +msgid "permission will be denied to set role \"%s\"" +msgstr "a permissão será negada para definir a função de banco de dados (role) \"%s\"" + +#: commands/variable.c:953 +#, c-format +msgid "permission denied to set role \"%s\"" +msgstr "permissão negada para definir a função de banco de dados (role) \"%s\"" + +#: commands/variable.c:1153 +#, c-format +msgid "Bonjour is not supported by this build" +msgstr "Bonjour não tem suporte por essa construção" + +#: commands/variable.c:1181 +#, c-format +msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." +msgstr "effective_io_concurrency deve ser definido como 0 em plataformas que não possuem posix_fadvise()." + +#: commands/variable.c:1194 +#, c-format +msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." +msgstr "maintenance_io_concurrency deve ser definido como 0 em plataformas que não possuem posix_fadvise()." + +#: commands/variable.c:1207 +#, c-format +msgid "SSL is not supported by this build" +msgstr "SSL não tem suporte por essa construção" + +#: commands/view.c:84 +#, c-format +msgid "could not determine which collation to use for view column \"%s\"" +msgstr "não foi possível determinar qual ordenação usar para a coluna \"%s\" da visão" + +#: commands/view.c:279 commands/view.c:290 +#, c-format +msgid "cannot drop columns from view" +msgstr "não é possível excluir colunas de visão" + +#: commands/view.c:295 +#, c-format +msgid "cannot change name of view column \"%s\" to \"%s\"" +msgstr "não é possível alterar o nome da coluna \"%s\" da visão para \"%s\"" + +#: commands/view.c:298 +#, c-format +msgid "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." +msgstr "Use ALTER VIEW ... RENAME COLUMN ... para mudar o nome da coluna da visão em vez disso." + +#: commands/view.c:309 +#, c-format +msgid "cannot change data type of view column \"%s\" from %s to %s" +msgstr "não é possível mudar o tipo de dados da coluna \"%s\" da visão de %s para %s" + +#: commands/view.c:323 +#, c-format +msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" +msgstr "não é possível mudar a ordenação da coluna \"%s\" da visão de %s para %s" + +#: commands/view.c:392 +#, c-format +msgid "views must not contain SELECT INTO" +msgstr "as visões não devem conter SELECT INTO" + +#: commands/view.c:404 +#, c-format +msgid "views must not contain data-modifying statements in WITH" +msgstr "as visões não devem conter instruções de modificação de dados no WITH" + +#: commands/view.c:474 +#, c-format +msgid "CREATE VIEW specifies more column names than columns" +msgstr "CREATE VIEW especifica mais nomes de colunas do que colunas" + +#: commands/view.c:482 +#, c-format +msgid "views cannot be unlogged because they do not have storage" +msgstr "as visões não podem ser não rastreadas (unlogged), porque não têm armazenamento" + +#: commands/view.c:496 +#, c-format +msgid "view \"%s\" will be a temporary view" +msgstr "a visão \"%s\" será uma visão temporária" + +#: executor/execCurrent.c:79 +#, c-format +msgid "cursor \"%s\" is not a SELECT query" +msgstr "o cursor \"%s\" não é uma consulta SELECT" + +#: executor/execCurrent.c:85 +#, c-format +msgid "cursor \"%s\" is held from a previous transaction" +msgstr "o cursor \"%s\" está preso em uma transação anterior" + +#: executor/execCurrent.c:118 +#, c-format +msgid "cursor \"%s\" has multiple FOR UPDATE/SHARE references to table \"%s\"" +msgstr "o cursor \"%s\" possui múltiplas referências FOR UPDATE/SHARE à tabela \"%s\"" + +#: executor/execCurrent.c:127 +#, c-format +msgid "cursor \"%s\" does not have a FOR UPDATE/SHARE reference to table \"%s\"" +msgstr "o cursor \"%s\" não possui uma referência FOR UPDATE/SHARE para a tabela \"%s\"" + +#: executor/execCurrent.c:137 executor/execCurrent.c:182 +#, c-format +msgid "cursor \"%s\" is not positioned on a row" +msgstr "o cursor \"%s\" não está posicionado em uma linha" + +#: executor/execCurrent.c:169 executor/execCurrent.c:228 +#: executor/execCurrent.c:239 +#, c-format +msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" +msgstr "o cursor \"%s\" não é uma varredura simples atualizável da tabela \"%s\"" + +#: executor/execCurrent.c:280 executor/execExprInterp.c:2498 +#, c-format +msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" +msgstr "o tipo de dados do parâmetro %d (%s) não corresponde ao da preparação do plano (%s)" + +#: executor/execCurrent.c:292 executor/execExprInterp.c:2510 +#, c-format +msgid "no value found for parameter %d" +msgstr "nenhum valor encontrado para o parâmetro %d" + +#: executor/execExpr.c:637 executor/execExpr.c:644 executor/execExpr.c:650 +#: executor/execExprInterp.c:4234 executor/execExprInterp.c:4251 +#: executor/execExprInterp.c:4350 executor/nodeModifyTable.c:197 +#: executor/nodeModifyTable.c:208 executor/nodeModifyTable.c:225 +#: executor/nodeModifyTable.c:233 +#, c-format +msgid "table row type and query-specified row type do not match" +msgstr "o tipo de dados da linha da tabela e o tipo de dados da linha especificado pela consulta não correspondem" + +#: executor/execExpr.c:638 executor/nodeModifyTable.c:198 +#, c-format +msgid "Query has too many columns." +msgstr "A consulta tem muitas colunas." + +#: executor/execExpr.c:645 executor/nodeModifyTable.c:226 +#, c-format +msgid "Query provides a value for a dropped column at ordinal position %d." +msgstr "A consulta fornece um valor para uma coluna excluída na posição ordinal %d." + +#: executor/execExpr.c:651 executor/execExprInterp.c:4252 +#: executor/nodeModifyTable.c:209 +#, c-format +msgid "Table has type %s at ordinal position %d, but query expects %s." +msgstr "A tabela tem o tipo de dados %s na posição ordinal %d, mas a consulta espera %s." + +#: executor/execExpr.c:1099 parser/parse_agg.c:838 +#, c-format +msgid "window function calls cannot be nested" +msgstr "as chamadas de função de janela não podem ser aninhadas" + +#: executor/execExpr.c:1618 +#, c-format +msgid "target type is not an array" +msgstr "o tipo de dados do destino não é uma matriz" + +#: executor/execExpr.c:1958 +#, c-format +msgid "ROW() column has type %s instead of type %s" +msgstr "A coluna ROW() tem o tipo %s em vez do tipo %s" + +#: executor/execExpr.c:2574 executor/execSRF.c:719 parser/parse_func.c:138 +#: parser/parse_func.c:655 parser/parse_func.c:1032 +#, c-format +msgid "cannot pass more than %d argument to a function" +msgid_plural "cannot pass more than %d arguments to a function" +msgstr[0] "não é possível passar mais de %d argumento para a função" +msgstr[1] "não é possível passar mais de %d argumentos para a função" + +#: executor/execExpr.c:2601 executor/execSRF.c:739 executor/functions.c:1066 +#: utils/adt/jsonfuncs.c:3780 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "a função que retorna um conjunto foi chamada em um contexto que não aceita um conjunto" + +#: executor/execExpr.c:3007 parser/parse_node.c:277 parser/parse_node.c:327 +#, c-format +msgid "cannot subscript type %s because it does not support subscripting" +msgstr "não é possível colocar índices no tipo de dados %s, porque não tem suporte para índices" + +#: executor/execExpr.c:3135 executor/execExpr.c:3157 +#, c-format +msgid "type %s does not support subscripted assignment" +msgstr "o tipo de dados %s não tem suporte para atribuição com índice" + +#: executor/execExprInterp.c:1962 +#, c-format +msgid "attribute %d of type %s has been dropped" +msgstr "o atributo %d do tipo %s foi removido" + +#: executor/execExprInterp.c:1968 +#, c-format +msgid "attribute %d of type %s has wrong type" +msgstr "o atributo %d do tipo %s tem tipo incorreto" + +#: executor/execExprInterp.c:1970 executor/execExprInterp.c:3104 +#: executor/execExprInterp.c:3150 +#, c-format +msgid "Table has type %s, but query expects %s." +msgstr "A tabela tem o tipo %s, mas a consulta espera %s." + +#: executor/execExprInterp.c:2050 utils/adt/expandedrecord.c:99 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1749 +#: utils/cache/typcache.c:1908 utils/cache/typcache.c:2055 +#: utils/fmgr/funcapi.c:561 +#, c-format +msgid "type %s is not composite" +msgstr "o tipo de dados %s não é composto" + +#: executor/execExprInterp.c:2588 +#, c-format +msgid "WHERE CURRENT OF is not supported for this table type" +msgstr "WHERE CURRENT OF não tem suporte para esse tipo de tabela" + +#: executor/execExprInterp.c:2801 +#, c-format +msgid "cannot merge incompatible arrays" +msgstr "não é possível mesclar matrizes incompatíveis" + +#: executor/execExprInterp.c:2802 +#, c-format +msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." +msgstr "Matriz com elemento do tipo %s não pode ser incluído na construção ARRAY com elemento do tipo %s." + +#: executor/execExprInterp.c:2823 utils/adt/arrayfuncs.c:266 +#: utils/adt/arrayfuncs.c:576 utils/adt/arrayfuncs.c:1330 +#: utils/adt/arrayfuncs.c:3532 utils/adt/arrayfuncs.c:5616 +#: utils/adt/arrayfuncs.c:6133 utils/adt/arraysubs.c:150 +#: utils/adt/arraysubs.c:488 +#, c-format +msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +msgstr "o número de dimensões da matriz (%d) excede o máximo permitido (%d)" + +#: executor/execExprInterp.c:2843 executor/execExprInterp.c:2878 +#, c-format +msgid "multidimensional arrays must have array expressions with matching dimensions" +msgstr "matrizes multidimensionais devem ter expressões de matriz com dimensões correspondentes" + +#: executor/execExprInterp.c:2855 utils/adt/array_expanded.c:274 +#: utils/adt/arrayfuncs.c:960 utils/adt/arrayfuncs.c:1569 +#: utils/adt/arrayfuncs.c:2377 utils/adt/arrayfuncs.c:2392 +#: utils/adt/arrayfuncs.c:2654 utils/adt/arrayfuncs.c:2670 +#: utils/adt/arrayfuncs.c:2978 utils/adt/arrayfuncs.c:2993 +#: utils/adt/arrayfuncs.c:3334 utils/adt/arrayfuncs.c:3562 +#: utils/adt/arrayfuncs.c:6225 utils/adt/arrayfuncs.c:6566 +#: utils/adt/arrayutils.c:98 utils/adt/arrayutils.c:107 +#: utils/adt/arrayutils.c:114 +#, c-format +msgid "array size exceeds the maximum allowed (%d)" +msgstr "o tamanho da matriz excede o máximo permitido (%d)" + +#: executor/execExprInterp.c:3103 executor/execExprInterp.c:3149 +#, c-format +msgid "attribute %d has wrong type" +msgstr "o atributo %d tem tipo de dados incorreto" + +#: executor/execExprInterp.c:3735 utils/adt/domains.c:155 +#, c-format +msgid "domain %s does not allow null values" +msgstr "o domínio %s não permite valores nulos" + +#: executor/execExprInterp.c:3750 utils/adt/domains.c:193 +#, c-format +msgid "value for domain %s violates check constraint \"%s\"" +msgstr "o valor para o domínio %s viola a restrição de verificação \"%s\"" + +#: executor/execExprInterp.c:4235 +#, c-format +msgid "Table row contains %d attribute, but query expects %d." +msgid_plural "Table row contains %d attributes, but query expects %d." +msgstr[0] "A linha da tabela contém %d atributo, mas a consulta espera %d." +msgstr[1] "A linha da tabela contém %d atributos, mas a consulta espera %d." + +#: executor/execExprInterp.c:4351 executor/execSRF.c:978 +#, c-format +msgid "Physical storage mismatch on dropped attribute at ordinal position %d." +msgstr "O armazenamento físico não corresponde com atributo removido na posição ordinal %d." + +#: executor/execIndexing.c:588 +#, c-format +msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" +msgstr "ON CONFLICT não oferece suporte a restrições de unicidade/restrições de exclusão diferíveis como árbitros" + +#: executor/execIndexing.c:865 +#, c-format +msgid "could not create exclusion constraint \"%s\"" +msgstr "não foi possível criar a restrição de exclusão \"%s\"" + +#: executor/execIndexing.c:868 +#, c-format +msgid "Key %s conflicts with key %s." +msgstr "A chave %s está em conflito com a chave %s." + +#: executor/execIndexing.c:870 +#, c-format +msgid "Key conflicts exist." +msgstr "Existe um conflito de chave." + +#: executor/execIndexing.c:876 +#, c-format +msgid "conflicting key value violates exclusion constraint \"%s\"" +msgstr "valor-chave conflitante viola a restrição de exclusão \"%s\"" + +#: executor/execIndexing.c:879 +#, c-format +msgid "Key %s conflicts with existing key %s." +msgstr "A chave %s está em conflito com a chave existente %s." + +#: executor/execIndexing.c:881 +#, c-format +msgid "Key conflicts with existing key." +msgstr "A chave está em conflito com uma chave existente." + +#: executor/execMain.c:1039 +#, c-format +msgid "cannot change sequence \"%s\"" +msgstr "não é possível alterar a sequência \"%s\"" + +#: executor/execMain.c:1045 +#, c-format +msgid "cannot change TOAST relation \"%s\"" +msgstr "não é possível alterar a relação TOAST \"%s\"" + +#: executor/execMain.c:1063 rewrite/rewriteHandler.c:3079 +#: rewrite/rewriteHandler.c:3966 +#, c-format +msgid "cannot insert into view \"%s\"" +msgstr "não é possível inserir na visão \"%s\"" + +#: executor/execMain.c:1065 rewrite/rewriteHandler.c:3082 +#: rewrite/rewriteHandler.c:3969 +#, c-format +msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." +msgstr "Para ativar a inserção na visão, forneça um gatilho INSTEAD OF INSERT ou uma regra incondicional ON INSERT DO INSTEAD." + +#: executor/execMain.c:1071 rewrite/rewriteHandler.c:3087 +#: rewrite/rewriteHandler.c:3974 +#, c-format +msgid "cannot update view \"%s\"" +msgstr "não é possível atualizar a visão \"%s\"" + +#: executor/execMain.c:1073 rewrite/rewriteHandler.c:3090 +#: rewrite/rewriteHandler.c:3977 +#, c-format +msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." +msgstr "Para ativar a atualização da visão, forneça um gatilho INSTEAD OF UPDATE ou uma regra incondicional ON UPDATE DO INSTEAD." + +#: executor/execMain.c:1079 rewrite/rewriteHandler.c:3095 +#: rewrite/rewriteHandler.c:3982 +#, c-format +msgid "cannot delete from view \"%s\"" +msgstr "não é possível excluir da visão \"%s\"" + +#: executor/execMain.c:1081 rewrite/rewriteHandler.c:3098 +#: rewrite/rewriteHandler.c:3985 +#, c-format +msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." +msgstr "Para ativar a exclusão em uma visão, forneça um gatilho INSTEAD OF DELETE ou uma regra incondicional ON DELETE DO INSTEAD." + +#: executor/execMain.c:1092 +#, c-format +msgid "cannot change materialized view \"%s\"" +msgstr "não é possível mudar a visão materializada \"%s\"" + +#: executor/execMain.c:1104 +#, c-format +msgid "cannot insert into foreign table \"%s\"" +msgstr "não é possível inserir na tabela estrangeira \"%s\"" + +#: executor/execMain.c:1110 +#, c-format +msgid "foreign table \"%s\" does not allow inserts" +msgstr "tabela estrangeira \"%s\" não permite inserções" + +#: executor/execMain.c:1117 +#, c-format +msgid "cannot update foreign table \"%s\"" +msgstr "não é possível atualizar a tabela estrangeira \"%s\"" + +#: executor/execMain.c:1123 +#, c-format +msgid "foreign table \"%s\" does not allow updates" +msgstr "a tabela estrangeira \"%s\" não permite atualizações" + +#: executor/execMain.c:1130 +#, c-format +msgid "cannot delete from foreign table \"%s\"" +msgstr "não é possível excluir da tabela estrangeira \"%s\"" + +#: executor/execMain.c:1136 +#, c-format +msgid "foreign table \"%s\" does not allow deletes" +msgstr "a tabela estrangeira \"%s\" não permite exclusões" + +#: executor/execMain.c:1147 +#, c-format +msgid "cannot change relation \"%s\"" +msgstr "não é possível mudar a relação \"%s\"" + +#: executor/execMain.c:1174 +#, c-format +msgid "cannot lock rows in sequence \"%s\"" +msgstr "não é possível bloquear linhas na sequência \"%s\"" + +#: executor/execMain.c:1181 +#, c-format +msgid "cannot lock rows in TOAST relation \"%s\"" +msgstr "não é possível bloquear linhas na relação TOAST \"%s\"" + +#: executor/execMain.c:1188 +#, c-format +msgid "cannot lock rows in view \"%s\"" +msgstr "não é possível bloquear linhas na visão \"%s\"" + +#: executor/execMain.c:1196 +#, c-format +msgid "cannot lock rows in materialized view \"%s\"" +msgstr "não é possível bloquear linhas na visão materializada \"%s\"" + +#: executor/execMain.c:1205 executor/execMain.c:2708 +#: executor/nodeLockRows.c:135 +#, c-format +msgid "cannot lock rows in foreign table \"%s\"" +msgstr "não é possível bloquear linhas na tabela estrangeira \"%s\"" + +#: executor/execMain.c:1211 +#, c-format +msgid "cannot lock rows in relation \"%s\"" +msgstr "não foi possível bloquear linhas na relação \"%s\"" + +#: executor/execMain.c:1922 +#, c-format +msgid "new row for relation \"%s\" violates partition constraint" +msgstr "a nova linha para a relação \"%s\" viola a restrição de partição" + +#: executor/execMain.c:1924 executor/execMain.c:2008 executor/execMain.c:2059 +#: executor/execMain.c:2169 +#, c-format +msgid "Failing row contains %s." +msgstr "Registro que falhou contém %s." + +#: executor/execMain.c:2005 +#, c-format +msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" +msgstr "o valor nulo na coluna \"%s\" da relação \"%s\" viola a restrição de não-nulo" + +#: executor/execMain.c:2057 +#, c-format +msgid "new row for relation \"%s\" violates check constraint \"%s\"" +msgstr "a nova linha da relação \"%s\" viola a restrição de verificação \"%s\"" + +#: executor/execMain.c:2167 +#, c-format +msgid "new row violates check option for view \"%s\"" +msgstr "a nova linha viola a opção de verificação para a visão \"%s\"" + +#: executor/execMain.c:2177 +#, c-format +msgid "new row violates row-level security policy \"%s\" for table \"%s\"" +msgstr "a nova linha viola a política de segurança no nível de linha \"%s\" para a tabela \"%s\"" + +#: executor/execMain.c:2182 +#, c-format +msgid "new row violates row-level security policy for table \"%s\"" +msgstr "a nova linha viola a política de segurança no nível de linha da tabela \"%s\"" + +#: executor/execMain.c:2190 +#, c-format +msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" +msgstr "a linha de destino viola a política de segurança no nível de linha \"%s\" (expressão USING) para a tabela \"%s\"" + +#: executor/execMain.c:2195 +#, c-format +msgid "target row violates row-level security policy (USING expression) for table \"%s\"" +msgstr "a linha de destino viola a política de segurança no nível de linha (expressão USING) para a tabela \"%s\"" + +#: executor/execMain.c:2202 +#, c-format +msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" +msgstr "a nova linha viola a política de segurança no nível de linha \"%s\" (expressão USING) para a tabela \"%s\"" + +#: executor/execMain.c:2207 +#, c-format +msgid "new row violates row-level security policy (USING expression) for table \"%s\"" +msgstr "a nova linha viola a política de segurança no nível de linha (expressão USING) para a tabela \"%s\"" + +#: executor/execPartition.c:330 +#, c-format +msgid "no partition of relation \"%s\" found for row" +msgstr "nenhuma partição da relação \"%s\" encontrada para a linha" + +#: executor/execPartition.c:333 +#, c-format +msgid "Partition key of the failing row contains %s." +msgstr "A chave de partição da linha com falha contém %s." + +#: executor/execReplication.c:231 executor/execReplication.c:415 +#, c-format +msgid "tuple to be locked was already moved to another partition due to concurrent update, retrying" +msgstr "a tupla a ser bloqueada já foi movida para outra partição devido à atualização concorrente, tentando novamente" + +#: executor/execReplication.c:235 executor/execReplication.c:419 +#, c-format +msgid "concurrent update, retrying" +msgstr "" + +#: executor/execReplication.c:241 executor/execReplication.c:425 +#, c-format +msgid "concurrent delete, retrying" +msgstr "" + +#: executor/execReplication.c:311 parser/parse_cte.c:308 +#: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:1348 +#: utils/adt/array_userfuncs.c:1491 utils/adt/arrayfuncs.c:3881 +#: utils/adt/arrayfuncs.c:4436 utils/adt/arrayfuncs.c:6446 +#: utils/adt/rowtypes.c:1230 +#, c-format +msgid "could not identify an equality operator for type %s" +msgstr "não foi possível identificar um operador de igualdade para tipo %s" + +#: executor/execReplication.c:642 executor/execReplication.c:648 +#, c-format +msgid "cannot update table \"%s\"" +msgstr "não é possível atualizar a tabela \"%s\"" + +#: executor/execReplication.c:644 executor/execReplication.c:656 +#, c-format +msgid "Column used in the publication WHERE expression is not part of the replica identity." +msgstr "" + +#: executor/execReplication.c:650 executor/execReplication.c:662 +#, c-format +msgid "Column list used by the publication does not cover the replica identity." +msgstr "" + +#: executor/execReplication.c:654 executor/execReplication.c:660 +#, c-format +msgid "cannot delete from table \"%s\"" +msgstr "não é possível excluir da tabela \"%s\"" + +#: executor/execReplication.c:680 +#, c-format +msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" +msgstr "não é possível atualizar a tabela \"%s\", porque não possui uma identidade de réplica e publica atualizações" + +#: executor/execReplication.c:682 +#, c-format +msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." +msgstr "" + +#: executor/execReplication.c:686 +#, c-format +msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" +msgstr "" + +#: executor/execReplication.c:688 +#, c-format +msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." +msgstr "" + +#: executor/execReplication.c:704 +#, c-format +msgid "cannot use relation \"%s.%s\" as logical replication target" +msgstr "não é possível usar a relação \"%s.%s\" como destino de replicação lógica" + +#: executor/execSRF.c:316 +#, c-format +msgid "rows returned by function are not all of the same row type" +msgstr "as linhas retornadas pela função não são todas do mesmo tipo de linha" + +#: executor/execSRF.c:366 +#, c-format +msgid "table-function protocol for value-per-call mode was not followed" +msgstr "o protocolo de função de tabela para o modo valor por chamada não foi seguido" + +#: executor/execSRF.c:374 executor/execSRF.c:668 +#, c-format +msgid "table-function protocol for materialize mode was not followed" +msgstr "protocolo de função tabular para modo materializado não foi seguido" + +#: executor/execSRF.c:381 executor/execSRF.c:686 +#, c-format +msgid "unrecognized table-function returnMode: %d" +msgstr "modo de retorno (returnMode) da função tabular desconhecido: %d" + +#: executor/execSRF.c:895 +#, c-format +msgid "function returning setof record called in context that cannot accept type record" +msgstr "função que retorna setof record foi chamada em um contexto que não pode aceitar tipo record" + +#: executor/execSRF.c:951 executor/execSRF.c:967 executor/execSRF.c:977 +#, c-format +msgid "function return row and query-specified return row do not match" +msgstr "a linha retornada pela função e a linha retornada especificada na consulta não correspondem" + +#: executor/execSRF.c:952 +#, c-format +msgid "Returned row contains %d attribute, but query expects %d." +msgid_plural "Returned row contains %d attributes, but query expects %d." +msgstr[0] "Registro retornado contém %d atributo, mas consulta espera %d." +msgstr[1] "Registro retornado contém %d atributos, mas consulta espera %d." + +#: executor/execSRF.c:968 +#, c-format +msgid "Returned type %s at ordinal position %d, but query expects %s." +msgstr "Tipo retornado %s na posição ordinal %d, mas consulta espera %s." + +#: executor/execTuples.c:146 executor/execTuples.c:353 +#: executor/execTuples.c:521 executor/execTuples.c:713 +#, c-format +msgid "cannot retrieve a system column in this context" +msgstr "não é possível recuperar uma coluna do sistema nesse contexto" + +#: executor/execUtils.c:744 +#, c-format +msgid "materialized view \"%s\" has not been populated" +msgstr "visão materializada \"%s\" não foi preenchida" + +#: executor/execUtils.c:746 +#, c-format +msgid "Use the REFRESH MATERIALIZED VIEW command." +msgstr "Use o comando REFRESH MATERIALIZED VIEW." + +#: executor/functions.c:217 +#, c-format +msgid "could not determine actual type of argument declared %s" +msgstr "não foi possível determinar tipo de argumento declarado %s" + +#: executor/functions.c:512 +#, c-format +msgid "cannot COPY to/from client in an SQL function" +msgstr "não é possível executar COPY de/para cliente em uma função SQL" + +#. translator: %s is a SQL statement name +#: executor/functions.c:518 +#, c-format +msgid "%s is not allowed in an SQL function" +msgstr "a instrução %s não é permitida em uma função SQL" + +#. translator: %s is a SQL statement name +#: executor/functions.c:526 executor/spi.c:1742 executor/spi.c:2635 +#, c-format +msgid "%s is not allowed in a non-volatile function" +msgstr "%s não é permitido em uma função não-volátil" + +#: executor/functions.c:1450 +#, c-format +msgid "SQL function \"%s\" statement %d" +msgstr "função SQL \"%s\" comando %d" + +#: executor/functions.c:1476 +#, c-format +msgid "SQL function \"%s\" during startup" +msgstr "função SQL \"%s\" durante a ativação" + +#: executor/functions.c:1561 +#, c-format +msgid "calling procedures with output arguments is not supported in SQL functions" +msgstr "chamar procedimentos com argumentos de saída não tem suporte em funções SQL" + +#: executor/functions.c:1694 executor/functions.c:1732 +#: executor/functions.c:1746 executor/functions.c:1836 +#: executor/functions.c:1869 executor/functions.c:1883 +#, c-format +msgid "return type mismatch in function declared to return %s" +msgstr "tipo de retorno não corresponde com o que foi declarado %s na função" + +#: executor/functions.c:1696 +#, c-format +msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." +msgstr "Último comando da função deve ser um SELECT ou INSERT/UPDATE/DELETE RETURNING." + +#: executor/functions.c:1734 +#, c-format +msgid "Final statement must return exactly one column." +msgstr "Último comando deve retornar exatamente uma coluna." + +#: executor/functions.c:1748 +#, c-format +msgid "Actual return type is %s." +msgstr "Tipo atual de retorno é %s." + +#: executor/functions.c:1838 +#, c-format +msgid "Final statement returns too many columns." +msgstr "Último comando retornou muitas colunas." + +#: executor/functions.c:1871 +#, c-format +msgid "Final statement returns %s instead of %s at column %d." +msgstr "Último comando retornou %s ao invés de %s na coluna %d." + +#: executor/functions.c:1885 +#, c-format +msgid "Final statement returns too few columns." +msgstr "Último comando retornou poucas colunas." + +#: executor/functions.c:1913 +#, c-format +msgid "return type %s is not supported for SQL functions" +msgstr "tipo de retorno %s não é suportado pelas funções SQL" + +#: executor/nodeAgg.c:3937 executor/nodeWindowAgg.c:2993 +#, c-format +msgid "aggregate %u needs to have compatible input type and transition type" +msgstr "agregação %u precisa ter tipo de entrada e tipo transitório compatíveis" + +#: executor/nodeAgg.c:3967 parser/parse_agg.c:680 parser/parse_agg.c:708 +#, c-format +msgid "aggregate function calls cannot be nested" +msgstr "chamadas de função de agregação não podem ser aninhadas" + +#: executor/nodeCustom.c:154 executor/nodeCustom.c:165 +#, c-format +msgid "custom scan \"%s\" does not support MarkPos" +msgstr "a varredura personalizada \"%s\" não dá suporte a MarkPos" + +#: executor/nodeHashjoin.c:1143 executor/nodeHashjoin.c:1173 +#, c-format +msgid "could not rewind hash-join temporary file" +msgstr "não foi possível retroceder o arquivo temporário de junção de hash" + +#: executor/nodeIndexonlyscan.c:238 +#, c-format +msgid "lossy distance functions are not supported in index-only scans" +msgstr "funções de distância com perda não têm suporte em varreduras somente de índice" + +#: executor/nodeLimit.c:374 +#, c-format +msgid "OFFSET must not be negative" +msgstr "OFFSET não deve ser negativo" + +#: executor/nodeLimit.c:400 +#, c-format +msgid "LIMIT must not be negative" +msgstr "LIMIT não deve ser negativo" + +#: executor/nodeMergejoin.c:1579 +#, c-format +msgid "RIGHT JOIN is only supported with merge-joinable join conditions" +msgstr "RIGHT JOIN só é suportado com condições de junção que podem ser utilizadas com junção por mesclagem" + +#: executor/nodeMergejoin.c:1597 +#, c-format +msgid "FULL JOIN is only supported with merge-joinable join conditions" +msgstr "FULL JOIN só é suportado com condições de junção que podem ser utilizadas com junção por mesclagem" + +#: executor/nodeModifyTable.c:234 +#, c-format +msgid "Query has too few columns." +msgstr "Consulta tem poucas colunas." + +#: executor/nodeModifyTable.c:1534 executor/nodeModifyTable.c:1608 +#, c-format +msgid "tuple to be deleted was already modified by an operation triggered by the current command" +msgstr "a tupla a ser excluída já foi modificada por uma operação acionada pelo comando corrente" + +#: executor/nodeModifyTable.c:1763 +#, c-format +msgid "invalid ON UPDATE specification" +msgstr "a especificação de ON UPDATE não é válida" + +#: executor/nodeModifyTable.c:1764 +#, c-format +msgid "The result tuple would appear in a different partition than the original tuple." +msgstr "" + +#: executor/nodeModifyTable.c:2223 +#, c-format +msgid "cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key" +msgstr "" + +#: executor/nodeModifyTable.c:2224 +#, c-format +msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." +msgstr "" + +#: executor/nodeModifyTable.c:2227 +#, c-format +msgid "Consider defining the foreign key on table \"%s\"." +msgstr "Considere definir a chave estrangeira na tabela \"%s\"." + +#. translator: %s is a SQL command name +#: executor/nodeModifyTable.c:2573 executor/nodeModifyTable.c:2975 +#, c-format +msgid "%s command cannot affect row a second time" +msgstr "" + +#: executor/nodeModifyTable.c:2575 +#, c-format +msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." +msgstr "" + +#: executor/nodeModifyTable.c:2977 +#, c-format +msgid "Ensure that not more than one source row matches any one target row." +msgstr "" + +#: executor/nodeModifyTable.c:3058 +#, c-format +msgid "tuple to be deleted was already moved to another partition due to concurrent update" +msgstr "a tupla a ser excluída já foi movida para outra partição devido à atualização concorrente" + +#: executor/nodeModifyTable.c:3097 +#, c-format +msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" +msgstr "a tupla a ser atualizada ou excluída já foi modificada por uma operação acionada pelo comando corrente" + +#: executor/nodeSamplescan.c:260 +#, c-format +msgid "TABLESAMPLE parameter cannot be null" +msgstr "o parâmetro TABLESAMPLE não pode ser nulo" + +#: executor/nodeSamplescan.c:272 +#, c-format +msgid "TABLESAMPLE REPEATABLE parameter cannot be null" +msgstr "" + +#: executor/nodeSubplan.c:325 executor/nodeSubplan.c:351 +#: executor/nodeSubplan.c:405 executor/nodeSubplan.c:1174 +#, c-format +msgid "more than one row returned by a subquery used as an expression" +msgstr "mais de uma linha retornada por uma subconsulta usada como expressão" + +#: executor/nodeTableFuncscan.c:375 +#, c-format +msgid "namespace URI must not be null" +msgstr "o URI do espaço de nomes não deve ser nulo" + +#: executor/nodeTableFuncscan.c:389 +#, c-format +msgid "row filter expression must not be null" +msgstr "expressão de filtro de linha não pode ser nula" + +#: executor/nodeTableFuncscan.c:415 +#, c-format +msgid "column filter expression must not be null" +msgstr "expressão de filtro de coluna não pode ser nula" + +#: executor/nodeTableFuncscan.c:416 +#, c-format +msgid "Filter for column \"%s\" is null." +msgstr "O filtro para a coluna \"%s\" é nulo." + +#: executor/nodeTableFuncscan.c:506 +#, c-format +msgid "null is not allowed in column \"%s\"" +msgstr "não é permitido nulo na coluna \"%s\"" + +#: executor/nodeWindowAgg.c:356 +#, c-format +msgid "moving-aggregate transition function must not return null" +msgstr "função de transição de agregação em movimento não deve retornar nulo" + +#: executor/nodeWindowAgg.c:2083 +#, c-format +msgid "frame starting offset must not be null" +msgstr "deslocamento inicial de quadro não deve ser nulo" + +#: executor/nodeWindowAgg.c:2096 +#, c-format +msgid "frame starting offset must not be negative" +msgstr "deslocamento inicial de quadro não deve ser negativo" + +#: executor/nodeWindowAgg.c:2108 +#, c-format +msgid "frame ending offset must not be null" +msgstr "deslocamento final de quadro não deve ser nulo" + +#: executor/nodeWindowAgg.c:2121 +#, c-format +msgid "frame ending offset must not be negative" +msgstr "deslocamento final de quadro não deve ser negativo" + +#: executor/nodeWindowAgg.c:2909 +#, c-format +msgid "aggregate function %s does not support use as a window function" +msgstr "a função de agregação %s não dá suporte a uso como função de janela" + +#: executor/spi.c:242 executor/spi.c:342 +#, c-format +msgid "invalid transaction termination" +msgstr "encerramento de transação inválido" + +#: executor/spi.c:257 +#, c-format +msgid "cannot commit while a subtransaction is active" +msgstr "não é possível efetivar enquanto uma subtransação está ativa" + +#: executor/spi.c:348 +#, c-format +msgid "cannot roll back while a subtransaction is active" +msgstr "não é possível desfazer enquanto uma subtransação está ativa" + +#: executor/spi.c:472 +#, c-format +msgid "transaction left non-empty SPI stack" +msgstr "transação não deixou pilha SPI vazia" + +#: executor/spi.c:473 executor/spi.c:533 +#, c-format +msgid "Check for missing \"SPI_finish\" calls." +msgstr "Verifique a ausência de chamadas \"SPI_finish\"." + +#: executor/spi.c:532 +#, c-format +msgid "subtransaction left non-empty SPI stack" +msgstr "subtransação não deixou pilha SPI vazia" + +#: executor/spi.c:1600 +#, c-format +msgid "cannot open multi-query plan as cursor" +msgstr "não é possível abrir plano de múltiplas consultas como cursor" + +#. translator: %s is name of a SQL command, eg INSERT +#: executor/spi.c:1610 +#, c-format +msgid "cannot open %s query as cursor" +msgstr "não é possível abrir consulta %s como cursor" + +#: executor/spi.c:1716 +#, c-format +msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" +msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE não é suportado" + +#: executor/spi.c:1717 parser/analyze.c:2912 +#, c-format +msgid "Scrollable cursors must be READ ONLY." +msgstr "Cursores roláveis devem ser READ ONLY." + +#: executor/spi.c:2474 +#, c-format +msgid "empty query does not return tuples" +msgstr "consulta vazia não retorna tuplas" + +#. translator: %s is name of a SQL command, eg INSERT +#: executor/spi.c:2548 +#, c-format +msgid "%s query does not return tuples" +msgstr "a consulta %s não retorna tuplas" + +#: executor/spi.c:2963 +#, c-format +msgid "SQL expression \"%s\"" +msgstr "expressão SQL \"%s\"" + +#: executor/spi.c:2968 +#, c-format +msgid "PL/pgSQL assignment \"%s\"" +msgstr "atribuição PL/pgSQL \"%s\"" + +#: executor/spi.c:2971 +#, c-format +msgid "SQL statement \"%s\"" +msgstr "comando SQL \"%s\"" + +#: executor/tqueue.c:74 +#, c-format +msgid "could not send tuple to shared-memory queue" +msgstr "não foi possível enviar a tupla para a fila de memória compartilhada" + +#: foreign/foreign.c:222 +#, c-format +msgid "user mapping not found for \"%s\"" +msgstr "mapeamento de usuários não foi encontrado para \"%s\"" + +#: foreign/foreign.c:647 storage/file/fd.c:3931 +#, c-format +msgid "invalid option \"%s\"" +msgstr "opção \"%s\" é inválida" + +#: foreign/foreign.c:649 +#, c-format +msgid "Perhaps you meant the option \"%s\"." +msgstr "Talvez você queira dizer a opção \"%s\"." + +#: foreign/foreign.c:651 +#, c-format +msgid "There are no valid options in this context." +msgstr "Não há opções válidas nesse contexto." + +#: gram.y:1197 +#, c-format +msgid "UNENCRYPTED PASSWORD is no longer supported" +msgstr "UNENCRYPTED PASSWORD não tem mais suporte" + +#: gram.y:1198 +#, c-format +msgid "Remove UNENCRYPTED to store the password in encrypted form instead." +msgstr "" + +#: gram.y:1525 gram.y:1541 +#, c-format +msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" +msgstr "CREATE SCHEMA IF NOT EXISTS não pode incluir elementos do esquema" + +#: gram.y:1693 +#, c-format +msgid "current database cannot be changed" +msgstr "banco de dados atual não pode ser mudado" + +#: gram.y:1826 +#, c-format +msgid "time zone interval must be HOUR or HOUR TO MINUTE" +msgstr "intervalo de zona horária deve ser HOUR ou HOUR TO MINUTE" + +#: gram.y:2443 +#, c-format +msgid "column number must be in range from 1 to %d" +msgstr "o número da coluna deve estar no intervalo de 1 a %d" + +#: gram.y:3039 +#, c-format +msgid "sequence option \"%s\" not supported here" +msgstr "a opção de sequência \"%s\" não tem suporte aqui" + +#: gram.y:3068 +#, c-format +msgid "modulus for hash partition provided more than once" +msgstr "módulo para partição hash fornecido mais de uma vez" + +#: gram.y:3077 +#, c-format +msgid "remainder for hash partition provided more than once" +msgstr "resto para a partição hash fornecido mais de uma vez" + +#: gram.y:3084 +#, c-format +msgid "unrecognized hash partition bound specification \"%s\"" +msgstr "não reconhecida a especificação de limite de partição hash \"%s\"" + +#: gram.y:3092 +#, c-format +msgid "modulus for hash partition must be specified" +msgstr "é necessário ser especificado o módulo para a partição hash" + +#: gram.y:3096 +#, c-format +msgid "remainder for hash partition must be specified" +msgstr "é necessário ser especificado o resto da partição hash" + +#: gram.y:3304 gram.y:3338 +#, c-format +msgid "STDIN/STDOUT not allowed with PROGRAM" +msgstr "STDIN/STDOUT não é permitido com PROGRAM" + +#: gram.y:3310 +#, c-format +msgid "WHERE clause not allowed with COPY TO" +msgstr "cláusula WHERE não permitida com COPY TO" + +#: gram.y:3649 gram.y:3656 gram.y:12821 gram.y:12829 +#, c-format +msgid "GLOBAL is deprecated in temporary table creation" +msgstr "GLOBAL está obsoleto na criação de tabela temporária" + +#: gram.y:3932 +#, c-format +msgid "for a generated column, GENERATED ALWAYS must be specified" +msgstr "" + +#: gram.y:4223 utils/adt/ri_triggers.c:2112 +#, c-format +msgid "MATCH PARTIAL not yet implemented" +msgstr "MATCH PARTIAL ainda não foi implementado" + +#: gram.y:4315 +#, c-format +msgid "a column list with %s is only supported for ON DELETE actions" +msgstr "lista de colunas com %s só tem suporte para ações ON DELETE" + +#: gram.y:5027 +#, c-format +msgid "CREATE EXTENSION ... FROM is no longer supported" +msgstr "CREATE EXTENSION ... FROM não tem mais suporte" + +#: gram.y:5725 +#, c-format +msgid "unrecognized row security option \"%s\"" +msgstr "opção de segurança de linha não reconhecida \"%s\"" + +#: gram.y:5726 +#, c-format +msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." +msgstr "" + +#: gram.y:5811 +#, c-format +msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" +msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER não tem suporte" + +#: gram.y:5848 +msgid "duplicate trigger events specified" +msgstr "eventos de gatilho duplicados especificados" + +#: gram.y:5990 parser/parse_utilcmd.c:3695 parser/parse_utilcmd.c:3721 +#, c-format +msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" +msgstr "restrição declarada INITIALLY DEFERRED deve ser DEFERRABLE" + +#: gram.y:5997 +#, c-format +msgid "conflicting constraint properties" +msgstr "propriedades de restrições conflitantes" + +#: gram.y:6096 +#, c-format +msgid "CREATE ASSERTION is not yet implemented" +msgstr "CREATE ASSERTION ainda não foi implementado" + +#: gram.y:6504 +#, c-format +msgid "RECHECK is no longer required" +msgstr "RECHECK não é mais requerido" + +#: gram.y:6505 +#, c-format +msgid "Update your data type." +msgstr "Atualize seu tipo de dado." + +#: gram.y:8378 +#, c-format +msgid "aggregates cannot have output arguments" +msgstr "agregações não podem ter argumentos de saída" + +#: gram.y:8841 utils/adt/regproc.c:670 +#, c-format +msgid "missing argument" +msgstr "faltando argumento" + +#: gram.y:8842 utils/adt/regproc.c:671 +#, c-format +msgid "Use NONE to denote the missing argument of a unary operator." +msgstr "Use NONE para denotar argumento ausente de um operador unário." + +#: gram.y:11054 gram.y:11073 +#, c-format +msgid "WITH CHECK OPTION not supported on recursive views" +msgstr "WITH CHECK OPTION não é suportado em visões recursivas" + +#: gram.y:12960 +#, c-format +msgid "LIMIT #,# syntax is not supported" +msgstr "sintaxe LIMIT #,# não tem suporte" + +#: gram.y:12961 +#, c-format +msgid "Use separate LIMIT and OFFSET clauses." +msgstr "Use cláusulas LIMIT e OFFSET separadas." + +#: gram.y:13821 +#, c-format +msgid "only one DEFAULT value is allowed" +msgstr "" + +#: gram.y:13830 +#, c-format +msgid "only one PATH value per column is allowed" +msgstr "" + +#: gram.y:13839 +#, c-format +msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" +msgstr "declarações NULL / NOT NULL conflitantes ou redundantes para a coluna \"%s\"" + +#: gram.y:13848 +#, c-format +msgid "unrecognized column option \"%s\"" +msgstr "opção de coluna não reconhecida \"%s\"" + +#: gram.y:14102 +#, c-format +msgid "precision for type float must be at least 1 bit" +msgstr "precisão para tipo float deve ser pelo menos 1 bit" + +#: gram.y:14111 +#, c-format +msgid "precision for type float must be less than 54 bits" +msgstr "precisão para tipo float deve ser menor do que 54 bits" + +#: gram.y:14614 +#, c-format +msgid "wrong number of parameters on left side of OVERLAPS expression" +msgstr "número incorreto de parâmetros no lado esquerdo da expressão OVERLAPS" + +#: gram.y:14619 +#, c-format +msgid "wrong number of parameters on right side of OVERLAPS expression" +msgstr "número incorreto de parâmetros no lado direito da expressão OVERLAPS" + +#: gram.y:14796 +#, c-format +msgid "UNIQUE predicate is not yet implemented" +msgstr "o predicado UNIQUE ainda não foi implementado" + +#: gram.y:15212 +#, c-format +msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" +msgstr "não é possível utilizar múltiplas cláusulas ORDER BY com WITHIN GROUP" + +#: gram.y:15217 +#, c-format +msgid "cannot use DISTINCT with WITHIN GROUP" +msgstr "não é possível utilizar DISTINCT com WITHIN GROUP" + +#: gram.y:15222 +#, c-format +msgid "cannot use VARIADIC with WITHIN GROUP" +msgstr "não é possível utilizar VARIADIC com WITHIN GROUP" + +#: gram.y:15856 gram.y:15880 +#, c-format +msgid "frame start cannot be UNBOUNDED FOLLOWING" +msgstr "início de quadro não pode ser UNBOUNDED FOLLOWING" + +#: gram.y:15861 +#, c-format +msgid "frame starting from following row cannot end with current row" +msgstr "quadro iniciando na próxima linha não pode terminar com a linha corrente" + +#: gram.y:15885 +#, c-format +msgid "frame end cannot be UNBOUNDED PRECEDING" +msgstr "fim de quadro não pode ser UNBOUNDED PRECEDING" + +#: gram.y:15891 +#, c-format +msgid "frame starting from current row cannot have preceding rows" +msgstr "o quadro iniciando da linha corrente não pode ter linhas anteriores" + +#: gram.y:15898 +#, c-format +msgid "frame starting from following row cannot have preceding rows" +msgstr "quadro iniciando na próxima linha não pode ter linhas anteriores" + +#: gram.y:16659 +#, c-format +msgid "type modifier cannot have parameter name" +msgstr "modificador de tipo não pode ter nome de parâmetro" + +#: gram.y:16665 +#, c-format +msgid "type modifier cannot have ORDER BY" +msgstr "modificador de tipo não pode ter ORDER BY" + +#: gram.y:16733 gram.y:16740 gram.y:16747 +#, c-format +msgid "%s cannot be used as a role name here" +msgstr "%s não pode ser usado como nome de função de banco de dados (role) aqui" + +#: gram.y:16837 gram.y:18294 +#, c-format +msgid "WITH TIES cannot be specified without ORDER BY clause" +msgstr "" + +#: gram.y:17973 gram.y:18160 +msgid "improper use of \"*\"" +msgstr "uso inválido de \"*\"" + +#: gram.y:18123 gram.y:18140 tsearch/spell.c:963 tsearch/spell.c:980 +#: tsearch/spell.c:997 tsearch/spell.c:1014 tsearch/spell.c:1079 +#, c-format +msgid "syntax error" +msgstr "erro de sintaxe" + +#: gram.y:18224 +#, c-format +msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" +msgstr "uma agregação de conjunto ordenado com um argumento direto VARIADIC deve ter um argumento agregado VARIADIC do mesmo tipo" + +#: gram.y:18261 +#, c-format +msgid "multiple ORDER BY clauses not allowed" +msgstr "não são permitidas múltiplas cláusulas ORDER BY" + +#: gram.y:18272 +#, c-format +msgid "multiple OFFSET clauses not allowed" +msgstr "não são permitidas múltiplas cláusulas OFFSET" + +#: gram.y:18281 +#, c-format +msgid "multiple LIMIT clauses not allowed" +msgstr "não são permitidas múltiplas cláusulas LIMIT" + +#: gram.y:18290 +#, c-format +msgid "multiple limit options not allowed" +msgstr "não são permitidas múltiplas opções de limite" + +#: gram.y:18317 +#, c-format +msgid "multiple WITH clauses not allowed" +msgstr "não são permitidas múltiplas cláusulas WITH" + +#: gram.y:18510 +#, c-format +msgid "OUT and INOUT arguments aren't allowed in TABLE functions" +msgstr "argumentos OUT e INOUT não são permitidos em funções TABLE" + +#: gram.y:18643 +#, c-format +msgid "multiple COLLATE clauses not allowed" +msgstr "não são permitidas múltiplas cláusulas COLLATE" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:18681 gram.y:18694 +#, c-format +msgid "%s constraints cannot be marked DEFERRABLE" +msgstr "restrições %s não podem ser marcadas DEFERRABLE" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:18707 +#, c-format +msgid "%s constraints cannot be marked NOT VALID" +msgstr "restrições %s não podem ser marcadas NOT VALID" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:18720 +#, c-format +msgid "%s constraints cannot be marked NO INHERIT" +msgstr "restrições %s não podem ser marcadas NO INHERIT" + +#: gram.y:18742 +#, c-format +msgid "unrecognized partitioning strategy \"%s\"" +msgstr "estratégia de particionamento não reconhecida \"%s\"" + +#: gram.y:18766 +#, c-format +msgid "invalid publication object list" +msgstr "lista de objetos de publicação inválida" + +#: gram.y:18767 +#, c-format +msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." +msgstr "" + +#: gram.y:18783 +#, c-format +msgid "invalid table name" +msgstr "nome de tabela inválido" + +#: gram.y:18804 +#, c-format +msgid "WHERE clause not allowed for schema" +msgstr "cláusula WHERE não permitida para esquema" + +#: gram.y:18811 +#, c-format +msgid "column specification not allowed for schema" +msgstr "especificação de coluna não permitida para esquema" + +#: gram.y:18825 +#, c-format +msgid "invalid schema name" +msgstr "nome de esquema inválido" + +#: guc-file.l:192 +#, c-format +msgid "empty configuration file name: \"%s\"" +msgstr "nome do arquivo de configuração vazio: \"%s\"" + +#: guc-file.l:209 +#, c-format +msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" +msgstr "não foi possível abrir o arquivo de configuração \"%s\": profundidade aninhada máxima excedida" + +#: guc-file.l:229 +#, c-format +msgid "configuration file recursion in \"%s\"" +msgstr "recursão do arquivo de configuração em \"%s\"" + +#: guc-file.l:245 +#, c-format +msgid "could not open configuration file \"%s\": %m" +msgstr "não foi possível abrir o arquivo de configuração \"%s\": %m" + +#: guc-file.l:256 +#, c-format +msgid "skipping missing configuration file \"%s\"" +msgstr "ignorando arquivo de configuração ausente \"%s\"" + +#: guc-file.l:511 +#, c-format +msgid "syntax error in file \"%s\" line %u, near end of line" +msgstr "erro de sintaxe no arquivo \"%s\" linha %u, próximo ao fim da linha" + +#: guc-file.l:521 +#, c-format +msgid "syntax error in file \"%s\" line %u, near token \"%s\"" +msgstr "erro de sintaxe no arquivo \"%s\" linha %u, próximo a informação \"%s\"" + +#: guc-file.l:541 +#, c-format +msgid "too many syntax errors found, abandoning file \"%s\"" +msgstr "muitos erros de sintaxe encontrados, abandonando arquivo \"%s\"" + +#: jsonpath_gram.y:528 jsonpath_scan.l:629 jsonpath_scan.l:640 +#: jsonpath_scan.l:650 jsonpath_scan.l:701 utils/adt/encode.c:492 +#: utils/adt/encode.c:557 utils/adt/jsonfuncs.c:648 utils/adt/varlena.c:331 +#: utils/adt/varlena.c:372 +#, c-format +msgid "invalid input syntax for type %s" +msgstr "sintaxe de entrada inválida para o tipo de dados %s" + +#: jsonpath_gram.y:529 +#, c-format +msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." +msgstr "" + +#: jsonpath_gram.y:559 tsearch/spell.c:749 utils/adt/regexp.c:224 +#, c-format +msgid "invalid regular expression: %s" +msgstr "expressão regular é inválida: %s" + +#: jsonpath_gram.y:607 +#, c-format +msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" +msgstr "" + +#: jsonpath_scan.l:174 +msgid "invalid Unicode escape sequence" +msgstr "sequência de escape Unicode inválida" + +#: jsonpath_scan.l:180 +msgid "invalid hexadecimal character sequence" +msgstr "sequência de caracteres hexadecimais inválida" + +#: jsonpath_scan.l:195 +msgid "unexpected end after backslash" +msgstr "fim após a contrabarra não esperado" + +#: jsonpath_scan.l:201 repl_scanner.l:209 scan.l:741 +msgid "unterminated quoted string" +msgstr "cadeia de caracteres entre aspas não foi terminada" + +#: jsonpath_scan.l:228 +msgid "unexpected end of comment" +msgstr "fim de comentário não esperado" + +#: jsonpath_scan.l:319 +msgid "invalid numeric literal" +msgstr "literal numérico inválido" + +#: jsonpath_scan.l:325 jsonpath_scan.l:331 jsonpath_scan.l:337 scan.l:1049 +#: scan.l:1053 scan.l:1057 scan.l:1061 scan.l:1065 scan.l:1069 scan.l:1073 +msgid "trailing junk after numeric literal" +msgstr "elemento incorreto após valor numérico" + +#. translator: %s is typically "syntax error" +#: jsonpath_scan.l:375 +#, c-format +msgid "%s at end of jsonpath input" +msgstr "%s no final da entrada jsonpath" + +#. translator: first %s is typically "syntax error" +#: jsonpath_scan.l:382 +#, c-format +msgid "%s at or near \"%s\" of jsonpath input" +msgstr "%s em ou perto de \"%s\" da entrada jsonpath" + +#: jsonpath_scan.l:557 +msgid "invalid input" +msgstr "entrada inválida" + +#: jsonpath_scan.l:583 +msgid "invalid hexadecimal digit" +msgstr "dígito hexadecimal inválido" + +#: jsonpath_scan.l:596 utils/adt/jsonfuncs.c:636 +#, c-format +msgid "unsupported Unicode escape sequence" +msgstr "sequência de escape Unicode não tem suporte" + +#: jsonpath_scan.l:614 +#, c-format +msgid "could not convert Unicode to server encoding" +msgstr "não foi possível converter Unicode para codificação de servidor" + +#: lib/dshash.c:254 utils/mmgr/dsa.c:715 utils/mmgr/dsa.c:737 +#: utils/mmgr/dsa.c:818 +#, c-format +msgid "Failed on DSA request of size %zu." +msgstr "Falha na solicitação DSA de tamanho %zu." + +#: libpq/auth-sasl.c:97 +#, c-format +msgid "expected SASL response, got message type %d" +msgstr "esperada uma resposta SASL, recebida uma mensagem do tipo %d" + +#: libpq/auth-scram.c:270 +#, c-format +msgid "client selected an invalid SASL authentication mechanism" +msgstr "o cliente selecionou um mecanismo de autenticação SASL inválido" + +#: libpq/auth-scram.c:294 libpq/auth-scram.c:543 libpq/auth-scram.c:554 +#, c-format +msgid "invalid SCRAM secret for user \"%s\"" +msgstr "segredo SCRAM inválido para o usuário \"%s\"" + +#: libpq/auth-scram.c:305 +#, c-format +msgid "User \"%s\" does not have a valid SCRAM secret." +msgstr "O usuário \"%s\" não possui um segredo SCRAM válido." + +#: libpq/auth-scram.c:385 libpq/auth-scram.c:390 libpq/auth-scram.c:744 +#: libpq/auth-scram.c:752 libpq/auth-scram.c:857 libpq/auth-scram.c:870 +#: libpq/auth-scram.c:880 libpq/auth-scram.c:988 libpq/auth-scram.c:995 +#: libpq/auth-scram.c:1010 libpq/auth-scram.c:1025 libpq/auth-scram.c:1039 +#: libpq/auth-scram.c:1057 libpq/auth-scram.c:1072 libpq/auth-scram.c:1386 +#: libpq/auth-scram.c:1394 +#, c-format +msgid "malformed SCRAM message" +msgstr "mensagem SCRAM mal formada" + +#: libpq/auth-scram.c:386 +#, c-format +msgid "The message is empty." +msgstr "A mensagem está vazia." + +#: libpq/auth-scram.c:391 +#, c-format +msgid "Message length does not match input length." +msgstr "O comprimento da mensagem não corresponde ao comprimento da entrada." + +#: libpq/auth-scram.c:423 +#, c-format +msgid "invalid SCRAM response" +msgstr "resposta SCRAM inválida" + +#: libpq/auth-scram.c:424 +#, c-format +msgid "Nonce does not match." +msgstr "Nonce não corresponde." + +#: libpq/auth-scram.c:500 +#, c-format +msgid "could not generate random salt" +msgstr "não foi possível gerar sal aleatório" + +#: libpq/auth-scram.c:745 +#, c-format +msgid "Expected attribute \"%c\" but found \"%s\"." +msgstr "Esperado um atributo \"%c\", mas encontrado \"%s\"." + +#: libpq/auth-scram.c:753 libpq/auth-scram.c:881 +#, c-format +msgid "Expected character \"=\" for attribute \"%c\"." +msgstr "Esperado o caractere \"=\" para o atributo \"%c\"." + +#: libpq/auth-scram.c:858 +#, c-format +msgid "Attribute expected, but found end of string." +msgstr "Esperado um atributo, mas encontrado o final da cadeia de caracteres." + +#: libpq/auth-scram.c:871 +#, c-format +msgid "Attribute expected, but found invalid character \"%s\"." +msgstr "" + +#: libpq/auth-scram.c:989 libpq/auth-scram.c:1011 +#, c-format +msgid "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not include channel binding data." +msgstr "" + +#: libpq/auth-scram.c:996 libpq/auth-scram.c:1026 +#, c-format +msgid "Comma expected, but found character \"%s\"." +msgstr "Esperada uma vírgula, mas foi encontrado o caractere \"%s\"." + +#: libpq/auth-scram.c:1017 +#, c-format +msgid "SCRAM channel binding negotiation error" +msgstr "" + +#: libpq/auth-scram.c:1018 +#, c-format +msgid "The client supports SCRAM channel binding but thinks the server does not. However, this server does support channel binding." +msgstr "" + +#: libpq/auth-scram.c:1040 +#, c-format +msgid "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM message includes channel binding data." +msgstr "" + +#: libpq/auth-scram.c:1051 +#, c-format +msgid "unsupported SCRAM channel-binding type \"%s\"" +msgstr "tipo de vinculação de canal SCRAM sem suporte \"%s\"" + +#: libpq/auth-scram.c:1058 +#, c-format +msgid "Unexpected channel-binding flag \"%s\"." +msgstr "Sinalizador de vinculação de canal não esperado \"%s\"." + +#: libpq/auth-scram.c:1068 +#, c-format +msgid "client uses authorization identity, but it is not supported" +msgstr "" + +#: libpq/auth-scram.c:1073 +#, c-format +msgid "Unexpected attribute \"%s\" in client-first-message." +msgstr "" + +#: libpq/auth-scram.c:1089 +#, c-format +msgid "client requires an unsupported SCRAM extension" +msgstr "o cliente requer uma extensão SCRAM para a qual não há suporte" + +#: libpq/auth-scram.c:1103 +#, c-format +msgid "non-printable characters in SCRAM nonce" +msgstr "" + +#: libpq/auth-scram.c:1234 +#, c-format +msgid "could not generate random nonce" +msgstr "não foi possível gerar «nonce» aleatório" + +#: libpq/auth-scram.c:1244 +#, c-format +msgid "could not encode random nonce" +msgstr "não foi possível codificar «nonce» aleatório" + +#: libpq/auth-scram.c:1350 +#, c-format +msgid "SCRAM channel binding check failed" +msgstr "" + +#: libpq/auth-scram.c:1368 +#, c-format +msgid "unexpected SCRAM channel-binding attribute in client-final-message" +msgstr "" + +#: libpq/auth-scram.c:1387 +#, c-format +msgid "Malformed proof in client-final-message." +msgstr "" + +#: libpq/auth-scram.c:1395 +#, c-format +msgid "Garbage found at the end of client-final-message." +msgstr "" + +#: libpq/auth.c:271 +#, c-format +msgid "authentication failed for user \"%s\": host rejected" +msgstr "autenticação de usuário \"%s\" falhou: hospedeiro rejeitado" + +#: libpq/auth.c:274 +#, c-format +msgid "\"trust\" authentication failed for user \"%s\"" +msgstr "autenticação do tipo \"trust\" falhou para o usuário \"%s\"" + +#: libpq/auth.c:277 +#, c-format +msgid "Ident authentication failed for user \"%s\"" +msgstr "autenticação do tipo Ident falhou para o usuário \"%s\"" + +#: libpq/auth.c:280 +#, c-format +msgid "Peer authentication failed for user \"%s\"" +msgstr "A autenticação do tipo peer falhou para o usuário \"%s\"" + +#: libpq/auth.c:285 +#, c-format +msgid "password authentication failed for user \"%s\"" +msgstr "autenticação do tipo senha falhou para o usuário \"%s\"" + +#: libpq/auth.c:290 +#, c-format +msgid "GSSAPI authentication failed for user \"%s\"" +msgstr "autenticação do tipo GSSAPI falhou para o usuário \"%s\"" + +#: libpq/auth.c:293 +#, c-format +msgid "SSPI authentication failed for user \"%s\"" +msgstr "autenticação do tipo SSPI falhou para o usuário \"%s\"" + +#: libpq/auth.c:296 +#, c-format +msgid "PAM authentication failed for user \"%s\"" +msgstr "autenticação do tipo PAM falhou para o usuário \"%s\"" + +#: libpq/auth.c:299 +#, c-format +msgid "BSD authentication failed for user \"%s\"" +msgstr "a autenticação BSD falhou para o usuário \"%s\"" + +#: libpq/auth.c:302 +#, c-format +msgid "LDAP authentication failed for user \"%s\"" +msgstr "autenticação do tipo LDAP falhou para o usuário \"%s\"" + +#: libpq/auth.c:305 +#, c-format +msgid "certificate authentication failed for user \"%s\"" +msgstr "autenticação do tipo certificate falhou para o usuário \"%s\"" + +#: libpq/auth.c:308 +#, c-format +msgid "RADIUS authentication failed for user \"%s\"" +msgstr "autenticação do tipo RADIUS falhou para o usuário \"%s\"" + +#: libpq/auth.c:311 +#, c-format +msgid "authentication failed for user \"%s\": invalid authentication method" +msgstr "autenticação falhou para o usuário \"%s\": o método de autenticação não é válido" + +#: libpq/auth.c:315 +#, c-format +msgid "Connection matched file \"%s\" line %d: \"%s\"" +msgstr "A conexão correspondeu ao arquivo \"%s\" linha %d: \"%s\"" + +#: libpq/auth.c:359 +#, c-format +msgid "authentication identifier set more than once" +msgstr "identificador de autenticação definido mais de uma vez" + +#: libpq/auth.c:360 +#, c-format +msgid "previous identifier: \"%s\"; new identifier: \"%s\"" +msgstr "identificador anterior: \"%s\"; novo identificador: \"%s\"" + +#: libpq/auth.c:370 +#, c-format +msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" +msgstr "" + +#: libpq/auth.c:410 +#, c-format +msgid "client certificates can only be checked if a root certificate store is available" +msgstr "certificados cliente só podem ser verificados se um certificado raiz estiver disponível" + +#: libpq/auth.c:421 +#, c-format +msgid "connection requires a valid client certificate" +msgstr "conexão requer um certificado cliente válido" + +#: libpq/auth.c:452 libpq/auth.c:498 +msgid "GSS encryption" +msgstr "encriptação GSS" + +#: libpq/auth.c:455 libpq/auth.c:501 +msgid "SSL encryption" +msgstr "encriptação SSL" + +#: libpq/auth.c:457 libpq/auth.c:503 +msgid "no encryption" +msgstr "sem encriptação" + +#. translator: last %s describes encryption state +#: libpq/auth.c:463 +#, c-format +msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" +msgstr "pg_hba.conf rejeitou conexão de replicação para o hospedeiro \"%s\", usuário \"%s\", %s" + +#. translator: last %s describes encryption state +#: libpq/auth.c:470 +#, c-format +msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" +msgstr "pg_hba.conf rejeitou conexão para o hospedeiro \"%s\", usuário \"%s\", banco de dados \"%s\", %s" + +#: libpq/auth.c:508 +#, c-format +msgid "Client IP address resolved to \"%s\", forward lookup matches." +msgstr "Endereço IP do cliente resolveu para \"%s\", pesquisa direta combina." + +#: libpq/auth.c:511 +#, c-format +msgid "Client IP address resolved to \"%s\", forward lookup not checked." +msgstr "Endereço IP do cliente resolveu para \"%s\", pesquisa direta não foi feita." + +#: libpq/auth.c:514 +#, c-format +msgid "Client IP address resolved to \"%s\", forward lookup does not match." +msgstr "Endereço IP do cliente resolveu para \"%s\", pesquisa direta não combina." + +#: libpq/auth.c:517 +#, c-format +msgid "Could not translate client host name \"%s\" to IP address: %s." +msgstr "Não foi possível traduzir o nome de hospedeiro do cliente \"%s\" para endereço IP: %s." + +#: libpq/auth.c:522 +#, c-format +msgid "Could not resolve client IP address to a host name: %s." +msgstr "Não foi possível resolver o endereço IP do cliente para um nome de hospedeiro: %s." + +#. translator: last %s describes encryption state +#: libpq/auth.c:530 +#, c-format +msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" +msgstr "nenhuma entrada em pg_hba.conf para conexão de replicação do hospedeiro \"%s\", usuário \"%s\", %s" + +#. translator: last %s describes encryption state +#: libpq/auth.c:538 +#, c-format +msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" +msgstr "nenhuma entrada em pg_hba.conf para o hospedeiro \"%s\", usuário \"%s\", banco de dados \"%s\", %s" + +#: libpq/auth.c:711 +#, c-format +msgid "expected password response, got message type %d" +msgstr "resposta da senha esperada, recebeu tipo de mensagem %d" + +#: libpq/auth.c:732 +#, c-format +msgid "invalid password packet size" +msgstr "o tamanho do pacote da senha não é válido" + +#: libpq/auth.c:750 +#, c-format +msgid "empty password returned by client" +msgstr "senha vazia retornada pelo cliente" + +#: libpq/auth.c:877 libpq/hba.c:1727 +#, c-format +msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" +msgstr "autenticação MD5 não tem suporte quando \"db_user_namespace\" está ativado" + +#: libpq/auth.c:883 +#, c-format +msgid "could not generate random MD5 salt" +msgstr "não foi possível gerar sal MD5 aleatório" + +#: libpq/auth.c:934 libpq/be-secure-gssapi.c:540 +#, c-format +msgid "could not set environment: %m" +msgstr "não foi possível definir a variável de ambiente: %m" + +#: libpq/auth.c:973 +#, c-format +msgid "expected GSS response, got message type %d" +msgstr "resposta do GSS esperada, recebeu tipo de mensagem %d" + +#: libpq/auth.c:1039 +msgid "accepting GSS security context failed" +msgstr "aceitação do contexto de segurança do GSS falhou" + +#: libpq/auth.c:1080 +msgid "retrieving GSS user name failed" +msgstr "recuperação do nome de usuário do GSS falhou" + +#: libpq/auth.c:1226 +msgid "could not acquire SSPI credentials" +msgstr "não foi possível obter credenciais SSPI" + +#: libpq/auth.c:1251 +#, c-format +msgid "expected SSPI response, got message type %d" +msgstr "resposta do SSPI esperada, recebeu tipo de mensagem %d" + +#: libpq/auth.c:1329 +msgid "could not accept SSPI security context" +msgstr "não foi possível aceitar contexto de segurança do SSPI" + +#: libpq/auth.c:1370 +msgid "could not get token from SSPI security context" +msgstr "não foi possível obter token do contexto de segurança do SSPI" + +#: libpq/auth.c:1506 libpq/auth.c:1525 +#, c-format +msgid "could not translate name" +msgstr "não foi possível traduzir o nome" + +#: libpq/auth.c:1538 +#, c-format +msgid "realm name too long" +msgstr "nome do «realm» muito longo" + +#: libpq/auth.c:1553 +#, c-format +msgid "translated account name too long" +msgstr "nome da conta traduzido muito longo" + +#: libpq/auth.c:1732 +#, c-format +msgid "could not create socket for Ident connection: %m" +msgstr "não foi possível criar soquete para conexão com Ident: %m" + +#: libpq/auth.c:1747 +#, c-format +msgid "could not bind to local address \"%s\": %m" +msgstr "não foi possível se ligar ao endereço local \"%s\": %m" + +#: libpq/auth.c:1759 +#, c-format +msgid "could not connect to Ident server at address \"%s\", port %s: %m" +msgstr "não foi possível conectar ao servidor Ident no endereço \"%s\", porta %s: %m" + +#: libpq/auth.c:1781 +#, c-format +msgid "could not send query to Ident server at address \"%s\", port %s: %m" +msgstr "não foi possível enviar consulta ao servidor Ident no endereço \"%s\", porta %s: %m" + +#: libpq/auth.c:1798 +#, c-format +msgid "could not receive response from Ident server at address \"%s\", port %s: %m" +msgstr "não foi possível receber resposta do servidor Ident no endereço \"%s\", porta %s: %m" + +#: libpq/auth.c:1808 +#, c-format +msgid "invalidly formatted response from Ident server: \"%s\"" +msgstr "resposta invalidamente formatada pelo servidor Ident: \"%s\"" + +#: libpq/auth.c:1861 +#, c-format +msgid "peer authentication is not supported on this platform" +msgstr "autenticação do tipo peer não tem suporte nesta plataforma" + +#: libpq/auth.c:1865 +#, c-format +msgid "could not get peer credentials: %m" +msgstr "não foi possível receber credenciais: %m" + +#: libpq/auth.c:1877 +#, c-format +msgid "could not look up local user ID %ld: %s" +msgstr "não foi possível procurar o ID do usuário local %ld: %s" + +#: libpq/auth.c:1979 +#, c-format +msgid "error from underlying PAM layer: %s" +msgstr "erro da biblioteca PAM: %s" + +#: libpq/auth.c:1990 +#, c-format +msgid "unsupported PAM conversation %d/\"%s\"" +msgstr "conversação PAM sem suporte %d/\"%s\"" + +#: libpq/auth.c:2047 +#, c-format +msgid "could not create PAM authenticator: %s" +msgstr "não foi possível criar autenticador PAM: %s" + +#: libpq/auth.c:2058 +#, c-format +msgid "pam_set_item(PAM_USER) failed: %s" +msgstr "pam_set_item(PAM_USER) falhou: %s" + +#: libpq/auth.c:2090 +#, c-format +msgid "pam_set_item(PAM_RHOST) failed: %s" +msgstr "pam_set_item(PAM_RHOST) falhou: %s" + +#: libpq/auth.c:2102 +#, c-format +msgid "pam_set_item(PAM_CONV) failed: %s" +msgstr "pam_set_item(PAM_CONV) falhou: %s" + +#: libpq/auth.c:2115 +#, c-format +msgid "pam_authenticate failed: %s" +msgstr "pam_authenticate falhou: %s" + +#: libpq/auth.c:2128 +#, c-format +msgid "pam_acct_mgmt failed: %s" +msgstr "pam_acct_mgmt falhou: %s" + +#: libpq/auth.c:2139 +#, c-format +msgid "could not release PAM authenticator: %s" +msgstr "não foi possível liberar o autenticador PAM: %s" + +#: libpq/auth.c:2219 +#, c-format +msgid "could not initialize LDAP: error code %d" +msgstr "não foi possível inicializar o LDAP: código de erro %d" + +#: libpq/auth.c:2256 +#, c-format +msgid "could not extract domain name from ldapbasedn" +msgstr "não foi possível extrair o nome de domínio de ldapbasedn" + +#: libpq/auth.c:2264 +#, c-format +msgid "LDAP authentication could not find DNS SRV records for \"%s\"" +msgstr "A autenticação LDAP não conseguiu encontrar registros DNS SRV para \"%s\"" + +#: libpq/auth.c:2266 +#, c-format +msgid "Set an LDAP server name explicitly." +msgstr "" + +#: libpq/auth.c:2318 +#, c-format +msgid "could not initialize LDAP: %s" +msgstr "não foi possível inicializar o LDAP: %s" + +#: libpq/auth.c:2328 +#, c-format +msgid "ldaps not supported with this LDAP library" +msgstr "ldaps sem suporte por essa biblioteca LDAP" + +#: libpq/auth.c:2336 +#, c-format +msgid "could not initialize LDAP: %m" +msgstr "não foi possível inicializar o LDAP: %m" + +#: libpq/auth.c:2346 +#, c-format +msgid "could not set LDAP protocol version: %s" +msgstr "não foi possível definir a versão do protocolo LDAP: %s" + +#: libpq/auth.c:2362 +#, c-format +msgid "could not start LDAP TLS session: %s" +msgstr "não foi possível iniciar a sessão LDAP TLS: %s" + +#: libpq/auth.c:2439 +#, c-format +msgid "LDAP server not specified, and no ldapbasedn" +msgstr "servidor LDAP não especificado e sem ldapbasedn" + +#: libpq/auth.c:2446 +#, c-format +msgid "LDAP server not specified" +msgstr "não foi especificado o servidor LDAP" + +#: libpq/auth.c:2508 +#, c-format +msgid "invalid character in user name for LDAP authentication" +msgstr "caractere inválido no nome de usuário para autenticação LDAP" + +#: libpq/auth.c:2525 +#, c-format +msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" +msgstr "não foi possível realizar ligação inicial LDAP para ldapbinddn \"%s\" no servidor \"%s\": %s" + +#: libpq/auth.c:2555 +#, c-format +msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" +msgstr "não foi possível buscar no LDAP por filtro \"%s\" no servidor \"%s\": %s" + +#: libpq/auth.c:2571 +#, c-format +msgid "LDAP user \"%s\" does not exist" +msgstr "o usuário do LDAP \"%s\" não existe" + +#: libpq/auth.c:2572 +#, c-format +msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." +msgstr "busca LDAP falhou para filtro \"%s\" no servidor \"%s\": não retornou entradas." + +#: libpq/auth.c:2576 +#, c-format +msgid "LDAP user \"%s\" is not unique" +msgstr "o usuário do LDAP \"%s\" não é único" + +#: libpq/auth.c:2577 +#, c-format +msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." +msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." +msgstr[0] "busca LDAP falhou para filtro \"%s\" no servidor \"%s\": retornou %d entrada." +msgstr[1] "busca LDAP falhou para filtro \"%s\" no servidor \"%s\": retornou %d entradas." + +#: libpq/auth.c:2597 +#, c-format +msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" +msgstr "não foi possível obter dn para a primeira entrada que corresponde a \"%s\" no servidor \"%s\": %s" + +#: libpq/auth.c:2618 +#, c-format +msgid "could not unbind after searching for user \"%s\" on server \"%s\"" +msgstr "não foi possível desvincular após procurar pelo usuário \"%s\" no servidor \"%s\"" + +#: libpq/auth.c:2649 +#, c-format +msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" +msgstr "falha na autenticação LDAP do usuário \"%s\" no servidor \"%s\": %s" + +#: libpq/auth.c:2681 +#, c-format +msgid "LDAP diagnostics: %s" +msgstr "diagnósticos LDAP: %s" + +#: libpq/auth.c:2719 +#, c-format +msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" +msgstr "autenticação com certificado falhou para o usuário \"%s\": certificado cliente não contém usuário" + +#: libpq/auth.c:2740 +#, c-format +msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" +msgstr "a autenticação por certificado falhou para o usuário \"%s\": não foi possível recuperar o nome distinto do assunto (Subject DN)" + +#: libpq/auth.c:2763 +#, c-format +msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" +msgstr "validação do certificado (clientcert=verify-full) falhou para o usuário \"%s\": não correspondência de DN" + +#: libpq/auth.c:2768 +#, c-format +msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" +msgstr "validação do certificado (clientcert=verify-full) falhou para o usuário \"%s\": não correspondência de CN" + +#: libpq/auth.c:2870 +#, c-format +msgid "RADIUS server not specified" +msgstr "não foi especificado o servidor RADIUS" + +#: libpq/auth.c:2877 +#, c-format +msgid "RADIUS secret not specified" +msgstr "não foi especificado o segredo do RADIUS" + +#: libpq/auth.c:2891 +#, c-format +msgid "RADIUS authentication does not support passwords longer than %d characters" +msgstr "a autenticação RADIUS não dá suporte a senhas com mais de %d caracteres" + +#: libpq/auth.c:2993 libpq/hba.c:2369 +#, c-format +msgid "could not translate RADIUS server name \"%s\" to address: %s" +msgstr "não foi possível traduzir nome de servidor RADIUS \"%s\" para endereço: %s" + +#: libpq/auth.c:3007 +#, c-format +msgid "could not generate random encryption vector" +msgstr "não foi possível gerar vetor de criptografia randômico" + +#: libpq/auth.c:3044 +#, c-format +msgid "could not perform MD5 encryption of password: %s" +msgstr "não foi possível realizar a encriptação MD5 da senha: %s" + +#: libpq/auth.c:3071 +#, c-format +msgid "could not create RADIUS socket: %m" +msgstr "não foi possível criar soquete RADIUS: %m" + +#: libpq/auth.c:3087 +#, c-format +msgid "could not bind local RADIUS socket: %m" +msgstr "não foi possível se ligar ao soquete RADIUS: %m" + +#: libpq/auth.c:3097 +#, c-format +msgid "could not send RADIUS packet: %m" +msgstr "não foi possível enviar pacote RADIUS: %m" + +#: libpq/auth.c:3131 libpq/auth.c:3157 +#, c-format +msgid "timeout waiting for RADIUS response from %s" +msgstr "tempo limite esgotado aguardando pela resposta RADIUS de %s" + +#: libpq/auth.c:3150 +#, c-format +msgid "could not check status on RADIUS socket: %m" +msgstr "não foi possível verificar status no soquete do RADIUS: %m" + +#: libpq/auth.c:3180 +#, c-format +msgid "could not read RADIUS response: %m" +msgstr "não foi possível ler resposta do RADIUS: %m" + +#: libpq/auth.c:3188 +#, c-format +msgid "RADIUS response from %s was sent from incorrect port: %d" +msgstr "a resposta RADIUS de %s foi enviada de porta incorreta: %d" + +#: libpq/auth.c:3196 +#, c-format +msgid "RADIUS response from %s too short: %d" +msgstr "resposta RADIUS de %s muito curta: %d" + +#: libpq/auth.c:3203 +#, c-format +msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" +msgstr "a resposta RADIUS de %s tem comprimento corrompido: %d (comprimento real %d)" + +#: libpq/auth.c:3211 +#, c-format +msgid "RADIUS response from %s is to a different request: %d (should be %d)" +msgstr "a resposta RADIUS de %s é para uma solicitação diferente: %d (deveria ser %d)" + +#: libpq/auth.c:3236 +#, c-format +msgid "could not perform MD5 encryption of received packet: %s" +msgstr "não foi possível realizar a encriptação MD5 do pacote recebido: %s" + +#: libpq/auth.c:3246 +#, c-format +msgid "RADIUS response from %s has incorrect MD5 signature" +msgstr "a resposta RADIUS de %s tem assinatura MD5 incorreta" + +#: libpq/auth.c:3264 +#, c-format +msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" +msgstr "a resposta RADIUS de %s possui código inválido (%d) para o usuário \"%s\"" + +#: libpq/be-fsstubs.c:133 libpq/be-fsstubs.c:162 libpq/be-fsstubs.c:190 +#: libpq/be-fsstubs.c:216 libpq/be-fsstubs.c:241 libpq/be-fsstubs.c:283 +#: libpq/be-fsstubs.c:306 libpq/be-fsstubs.c:560 +#, c-format +msgid "invalid large-object descriptor: %d" +msgstr "o descritor de objeto grande não é válido: %d" + +#: libpq/be-fsstubs.c:173 +#, c-format +msgid "large object descriptor %d was not opened for reading" +msgstr "descritor de objeto grande %d não foi aberto para leitura" + +#: libpq/be-fsstubs.c:197 libpq/be-fsstubs.c:567 +#, c-format +msgid "large object descriptor %d was not opened for writing" +msgstr "o descritor de objeto grande %d não foi aberto para escrita" + +#: libpq/be-fsstubs.c:224 +#, c-format +msgid "lo_lseek result out of range for large-object descriptor %d" +msgstr "resultado de lo_lseek está fora do intervalo para descritor de objeto grande %d" + +#: libpq/be-fsstubs.c:291 +#, c-format +msgid "lo_tell result out of range for large-object descriptor %d" +msgstr "resultado de lo_tell está fora do intervalo para descritor de objeto grande %d" + +#: libpq/be-fsstubs.c:439 +#, c-format +msgid "could not open server file \"%s\": %m" +msgstr "não foi possível abrir o arquivo \"%s\" no servidor: %m" + +#: libpq/be-fsstubs.c:462 +#, c-format +msgid "could not read server file \"%s\": %m" +msgstr "não foi possível ler o arquivo \"%s\" no servidor: %m" + +#: libpq/be-fsstubs.c:521 +#, c-format +msgid "could not create server file \"%s\": %m" +msgstr "não foi possível criar o arquivo \"%s\" no servidor: %m" + +#: libpq/be-fsstubs.c:533 +#, c-format +msgid "could not write server file \"%s\": %m" +msgstr "não foi possível escrever no arquivo \"%s\" no servidor: %m" + +#: libpq/be-fsstubs.c:774 +#, c-format +msgid "large object read request is too large" +msgstr "requisição de leitura de objeto grande é muito grande" + +#: libpq/be-fsstubs.c:816 utils/adt/genfile.c:262 utils/adt/genfile.c:294 +#: utils/adt/genfile.c:315 +#, c-format +msgid "requested length cannot be negative" +msgstr "tamanho solicitado não pode ser negativo" + +#: libpq/be-fsstubs.c:871 storage/large_object/inv_api.c:298 +#: storage/large_object/inv_api.c:310 storage/large_object/inv_api.c:507 +#: storage/large_object/inv_api.c:618 storage/large_object/inv_api.c:808 +#, c-format +msgid "permission denied for large object %u" +msgstr "permissão negada para objeto grande %u" + +#: libpq/be-secure-common.c:71 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "não foi possível ler do comando \"%s\": %m" + +#: libpq/be-secure-common.c:91 +#, c-format +msgid "command \"%s\" failed" +msgstr "o comando \"%s\" falhou" + +#: libpq/be-secure-common.c:119 +#, c-format +msgid "could not access private key file \"%s\": %m" +msgstr "não foi possível acessar o arquivo de chave privada \"%s\": %m" + +#: libpq/be-secure-common.c:129 +#, c-format +msgid "private key file \"%s\" is not a regular file" +msgstr "o arquivo de chave privada \"%s\" não é um arquivo regular" + +#: libpq/be-secure-common.c:155 +#, c-format +msgid "private key file \"%s\" must be owned by the database user or root" +msgstr "" + +#: libpq/be-secure-common.c:165 +#, c-format +msgid "private key file \"%s\" has group or world access" +msgstr "arquivo da chave privada \"%s\" tem acesso para grupo ou outros" + +#: libpq/be-secure-common.c:167 +#, c-format +msgid "File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root." +msgstr "O arquivo deve ter permissões u=rw (0600), ou inferior, se pertencer ao usuário do banco de dados, ou permissões u=rw,g=r (0640), ou inferior, se pertencer ao root." + +#: libpq/be-secure-gssapi.c:201 +msgid "GSSAPI wrap error" +msgstr "erro de empacotamento GSSAPI" + +#: libpq/be-secure-gssapi.c:208 +#, c-format +msgid "outgoing GSSAPI message would not use confidentiality" +msgstr "a mensagem GSSAPI de saída não usa confidencialidade" + +#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 +#, c-format +msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" +msgstr "o servidor tentou enviar um pacote GSSAPI superdimensionado (%zu >%zu)" + +#: libpq/be-secure-gssapi.c:351 +#, c-format +msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" +msgstr "pacote GSSAPI superdimensionado enviado pelo cliente (%zu > %zu)" + +#: libpq/be-secure-gssapi.c:389 +msgid "GSSAPI unwrap error" +msgstr "erro de desempacotamento GSSAPI" + +#: libpq/be-secure-gssapi.c:396 +#, c-format +msgid "incoming GSSAPI message did not use confidentiality" +msgstr "a mensagem GSSAPI recebida não usa confidencialidade" + +#: libpq/be-secure-gssapi.c:575 +#, c-format +msgid "oversize GSSAPI packet sent by the client (%zu > %d)" +msgstr "pacote GSSAPI superdimensionado enviado pelo cliente (%zu > %d)" + +#: libpq/be-secure-gssapi.c:600 +msgid "could not accept GSSAPI security context" +msgstr "não foi possível aceitar o contexto de segurança GSSAPI" + +#: libpq/be-secure-gssapi.c:701 +msgid "GSSAPI size check error" +msgstr "erro de verificação de tamanho GSSAPI" + +#: libpq/be-secure-openssl.c:125 +#, c-format +msgid "could not create SSL context: %s" +msgstr "não foi possível criar contexto SSL: %s" + +#: libpq/be-secure-openssl.c:151 +#, c-format +msgid "could not load server certificate file \"%s\": %s" +msgstr "não foi possível carregar o arquivo de certificado do servidor \"%s\": %s" + +#: libpq/be-secure-openssl.c:171 +#, c-format +msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" +msgstr "" + +#: libpq/be-secure-openssl.c:176 +#, c-format +msgid "could not load private key file \"%s\": %s" +msgstr "não foi possível carregar o arquivo da chave privada \"%s\": %s" + +#: libpq/be-secure-openssl.c:185 +#, c-format +msgid "check of private key failed: %s" +msgstr "verificação de chave privada falhou: %s" + +#. translator: first %s is a GUC option name, second %s is its value +#: libpq/be-secure-openssl.c:198 libpq/be-secure-openssl.c:221 +#, c-format +msgid "\"%s\" setting \"%s\" not supported by this build" +msgstr "configuração \"%s\" \"%s\" sem suporte por essa construção" + +#: libpq/be-secure-openssl.c:208 +#, c-format +msgid "could not set minimum SSL protocol version" +msgstr "não foi possível definir a versão mínima do protocolo SSL" + +#: libpq/be-secure-openssl.c:231 +#, c-format +msgid "could not set maximum SSL protocol version" +msgstr "não foi possível definir a versão máxima do protocolo SSL" + +#: libpq/be-secure-openssl.c:247 +#, c-format +msgid "could not set SSL protocol version range" +msgstr "não foi possível definir o intervalo de versões do protocolo SSL" + +#: libpq/be-secure-openssl.c:248 +#, c-format +msgid "\"%s\" cannot be higher than \"%s\"" +msgstr "\"%s\" não pode ser maior que \"%s\"" + +#: libpq/be-secure-openssl.c:285 +#, c-format +msgid "could not set the cipher list (no valid ciphers available)" +msgstr "" + +#: libpq/be-secure-openssl.c:305 +#, c-format +msgid "could not load root certificate file \"%s\": %s" +msgstr "não foi possível carregar o arquivo do certificado raiz \"%s\": %s" + +#: libpq/be-secure-openssl.c:354 +#, c-format +msgid "could not load SSL certificate revocation list file \"%s\": %s" +msgstr "não foi possível carregar o arquivo da lista de revogação de certificados SSL \"%s\": %s" + +#: libpq/be-secure-openssl.c:362 +#, c-format +msgid "could not load SSL certificate revocation list directory \"%s\": %s" +msgstr "não foi possível carregar o diretório da lista de revogação de certificados SSL \"%s\": %s" + +#: libpq/be-secure-openssl.c:370 +#, c-format +msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" +msgstr "não foi possível carregar o arquivo da lista de revogação de certificados SSL \"%s\", ou o diretório \"%s\": %s" + +#: libpq/be-secure-openssl.c:428 +#, c-format +msgid "could not initialize SSL connection: SSL context not set up" +msgstr "não foi possível inicializar a conexão SSL: contexto SSL não configurado" + +#: libpq/be-secure-openssl.c:439 +#, c-format +msgid "could not initialize SSL connection: %s" +msgstr "não foi possível inicializar conexão SSL: %s" + +#: libpq/be-secure-openssl.c:447 +#, c-format +msgid "could not set SSL socket: %s" +msgstr "não foi possível criar soquete SSL: %s" + +#: libpq/be-secure-openssl.c:503 +#, c-format +msgid "could not accept SSL connection: %m" +msgstr "não foi possível aceitar conexão SSL: %m" + +#: libpq/be-secure-openssl.c:507 libpq/be-secure-openssl.c:562 +#, c-format +msgid "could not accept SSL connection: EOF detected" +msgstr "não foi possível aceitar conexão SSL: EOF detectado" + +#: libpq/be-secure-openssl.c:546 +#, c-format +msgid "could not accept SSL connection: %s" +msgstr "não foi possível aceitar conexão SSL: %s" + +#: libpq/be-secure-openssl.c:550 +#, c-format +msgid "This may indicate that the client does not support any SSL protocol version between %s and %s." +msgstr "Isso pode indicar que o cliente não tem suporte para nenhuma versão do protocolo SSL entre %s e %s." + +#: libpq/be-secure-openssl.c:567 libpq/be-secure-openssl.c:756 +#: libpq/be-secure-openssl.c:826 +#, c-format +msgid "unrecognized SSL error code: %d" +msgstr "código de erro SSL desconhecido: %d" + +#: libpq/be-secure-openssl.c:613 +#, c-format +msgid "SSL certificate's common name contains embedded null" +msgstr "nome do certificado SSL contém nulo embutido" + +#: libpq/be-secure-openssl.c:659 +#, c-format +msgid "SSL certificate's distinguished name contains embedded null" +msgstr "O nome distinto do certificado SSL contém nulo incorporado" + +#: libpq/be-secure-openssl.c:745 libpq/be-secure-openssl.c:810 +#, c-format +msgid "SSL error: %s" +msgstr "erro de SSL: %s" + +#: libpq/be-secure-openssl.c:987 +#, c-format +msgid "could not open DH parameters file \"%s\": %m" +msgstr "não foi possível abrir o arquivo de parâmetros DH \"%s\": %m" + +#: libpq/be-secure-openssl.c:999 +#, c-format +msgid "could not load DH parameters file: %s" +msgstr "não foi possível carregar o arquivo de parâmetros DH: %s" + +#: libpq/be-secure-openssl.c:1009 +#, c-format +msgid "invalid DH parameters: %s" +msgstr "parâmetros DH inválidos: %s" + +#: libpq/be-secure-openssl.c:1018 +#, c-format +msgid "invalid DH parameters: p is not prime" +msgstr "parâmetros DH inválidos: p não é primo" + +#: libpq/be-secure-openssl.c:1027 +#, c-format +msgid "invalid DH parameters: neither suitable generator or safe prime" +msgstr "" + +#: libpq/be-secure-openssl.c:1163 +#, c-format +msgid "Client certificate verification failed at depth %d: %s." +msgstr "A verificação do certificado do cliente falhou na profundidade %d: %s." + +#: libpq/be-secure-openssl.c:1200 +#, c-format +msgid "Failed certificate data (unverified): subject \"%s\", serial number %s, issuer \"%s\"." +msgstr "" + +#: libpq/be-secure-openssl.c:1201 +msgid "unknown" +msgstr "desconhecido" + +#: libpq/be-secure-openssl.c:1292 +#, c-format +msgid "DH: could not load DH parameters" +msgstr "DH: não foi possível carregar os parâmetros DH" + +#: libpq/be-secure-openssl.c:1300 +#, c-format +msgid "DH: could not set DH parameters: %s" +msgstr "DH: não foi possível definir os parâmetros DH: %s" + +#: libpq/be-secure-openssl.c:1327 +#, c-format +msgid "ECDH: unrecognized curve name: %s" +msgstr "ECDH: nome de curva desconhecido: %s" + +#: libpq/be-secure-openssl.c:1336 +#, c-format +msgid "ECDH: could not create key" +msgstr "ECDH: não foi possível criar a chave" + +#: libpq/be-secure-openssl.c:1364 +msgid "no SSL error reported" +msgstr "nenhum erro SSL relatado" + +#: libpq/be-secure-openssl.c:1368 +#, c-format +msgid "SSL error code %lu" +msgstr "código de erro SSL %lu" + +#: libpq/be-secure-openssl.c:1527 +#, c-format +msgid "could not create BIO" +msgstr "não foi possível criar BIO" + +#: libpq/be-secure-openssl.c:1537 +#, c-format +msgid "could not get NID for ASN1_OBJECT object" +msgstr "" + +#: libpq/be-secure-openssl.c:1545 +#, c-format +msgid "could not convert NID %d to an ASN1_OBJECT structure" +msgstr "não foi possível converter o NID %d em uma estrutura ASN1_OBJECT" + +#: libpq/be-secure.c:207 libpq/be-secure.c:303 +#, c-format +msgid "terminating connection due to unexpected postmaster exit" +msgstr "encerrando a conexão devido à saída inesperada do postmaster" + +#: libpq/crypt.c:49 +#, c-format +msgid "Role \"%s\" does not exist." +msgstr "A função de banco de dados (role) \"%s\" não existe." + +#: libpq/crypt.c:59 +#, c-format +msgid "User \"%s\" has no password assigned." +msgstr "Usuário \"%s\" não tem senha atribuída." + +#: libpq/crypt.c:77 +#, c-format +msgid "User \"%s\" has an expired password." +msgstr "Usuário \"%s\" tem uma senha expirada." + +#: libpq/crypt.c:183 +#, c-format +msgid "User \"%s\" has a password that cannot be used with MD5 authentication." +msgstr "" + +#: libpq/crypt.c:204 libpq/crypt.c:246 libpq/crypt.c:266 +#, c-format +msgid "Password does not match for user \"%s\"." +msgstr "A senha não corresponde para o usuário \"%s\"." + +#: libpq/crypt.c:285 +#, c-format +msgid "Password of user \"%s\" is in unrecognized format." +msgstr "" + +#: libpq/hba.c:332 +#, c-format +msgid "invalid regular expression \"%s\": %s" +msgstr "expressão regular \"%s\" é inválida: %s" + +#: libpq/hba.c:334 libpq/hba.c:666 libpq/hba.c:1250 libpq/hba.c:1270 +#: libpq/hba.c:1293 libpq/hba.c:1306 libpq/hba.c:1359 libpq/hba.c:1387 +#: libpq/hba.c:1395 libpq/hba.c:1407 libpq/hba.c:1428 libpq/hba.c:1441 +#: libpq/hba.c:1466 libpq/hba.c:1493 libpq/hba.c:1505 libpq/hba.c:1564 +#: libpq/hba.c:1584 libpq/hba.c:1598 libpq/hba.c:1618 libpq/hba.c:1629 +#: libpq/hba.c:1644 libpq/hba.c:1663 libpq/hba.c:1679 libpq/hba.c:1691 +#: libpq/hba.c:1728 libpq/hba.c:1769 libpq/hba.c:1782 libpq/hba.c:1804 +#: libpq/hba.c:1816 libpq/hba.c:1834 libpq/hba.c:1884 libpq/hba.c:1928 +#: libpq/hba.c:1939 libpq/hba.c:1955 libpq/hba.c:1972 libpq/hba.c:1983 +#: libpq/hba.c:2002 libpq/hba.c:2018 libpq/hba.c:2034 libpq/hba.c:2093 +#: libpq/hba.c:2110 libpq/hba.c:2123 libpq/hba.c:2135 libpq/hba.c:2154 +#: libpq/hba.c:2240 libpq/hba.c:2258 libpq/hba.c:2352 libpq/hba.c:2371 +#: libpq/hba.c:2400 libpq/hba.c:2413 libpq/hba.c:2436 libpq/hba.c:2458 +#: libpq/hba.c:2472 tsearch/ts_locale.c:243 +#, c-format +msgid "line %d of configuration file \"%s\"" +msgstr "linha %d do arquivo de configuração \"%s\"" + +#: libpq/hba.c:462 +#, c-format +msgid "skipping missing authentication file \"%s\"" +msgstr "pulando o arquivo de autenticação ausente \"%s\"" + +#: libpq/hba.c:614 +#, c-format +msgid "could not open file \"%s\": maximum nesting depth exceeded" +msgstr "não foi possível abrir o arquivo \"%s\": profundidade máxima de aninhamento excedida" + +#: libpq/hba.c:1221 +#, c-format +msgid "error enumerating network interfaces: %m" +msgstr "" + +#. translator: the second %s is a list of auth methods +#: libpq/hba.c:1248 +#, c-format +msgid "authentication option \"%s\" is only valid for authentication methods %s" +msgstr "opção de autenticação \"%s\" só é válida para métodos de autenticação %s" + +#: libpq/hba.c:1268 +#, c-format +msgid "authentication method \"%s\" requires argument \"%s\" to be set" +msgstr "método de autenticação \"%s\" requer que argumento \"%s\" seja definido" + +#: libpq/hba.c:1292 +#, c-format +msgid "missing entry at end of line" +msgstr "faltando entrada no final da linha" + +#: libpq/hba.c:1305 +#, c-format +msgid "multiple values in ident field" +msgstr "múltiplos valores em campo ident" + +#: libpq/hba.c:1357 +#, c-format +msgid "multiple values specified for connection type" +msgstr "múltiplos valores especificados para tipo de conexão" + +#: libpq/hba.c:1358 +#, c-format +msgid "Specify exactly one connection type per line." +msgstr "Especifique exatamente um tipo de conexão por linha." + +#: libpq/hba.c:1385 +#, c-format +msgid "hostssl record cannot match because SSL is disabled" +msgstr "" + +#: libpq/hba.c:1386 +#, c-format +msgid "Set ssl = on in postgresql.conf." +msgstr "Defina ssl = on no postgresql.conf." + +#: libpq/hba.c:1394 +#, c-format +msgid "hostssl record cannot match because SSL is not supported by this build" +msgstr "o registro hostssl não pode corresponder, porque não há suporte para SSL por essa construção" + +#: libpq/hba.c:1406 +#, c-format +msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" +msgstr "o registro hostgssenc não pode corresponder, porque não há suporte para GSSAPI por essa construção" + +#: libpq/hba.c:1426 +#, c-format +msgid "invalid connection type \"%s\"" +msgstr "o tipo de conexão \"%s\" não é válido" + +#: libpq/hba.c:1440 +#, c-format +msgid "end-of-line before database specification" +msgstr "fim de linha antes da especificação de banco de dados" + +#: libpq/hba.c:1465 +#, c-format +msgid "end-of-line before role specification" +msgstr "fim de linha antes da especificação de role" + +#: libpq/hba.c:1492 +#, c-format +msgid "end-of-line before IP address specification" +msgstr "fim de linha antes da especificação de endereço IP" + +#: libpq/hba.c:1503 +#, c-format +msgid "multiple values specified for host address" +msgstr "múltiplos valores especificados para endereço do hospedeiro" + +#: libpq/hba.c:1504 +#, c-format +msgid "Specify one address range per line." +msgstr "Especifique um intervalo de endereços por linha." + +#: libpq/hba.c:1562 +#, c-format +msgid "invalid IP address \"%s\": %s" +msgstr "o endereço IP \"%s\" não é válido: %s" + +#: libpq/hba.c:1582 +#, c-format +msgid "specifying both host name and CIDR mask is invalid: \"%s\"" +msgstr "especificar o nome do hospedeiro e a máscara CIDR não é válido: \"%s\"" + +#: libpq/hba.c:1596 +#, c-format +msgid "invalid CIDR mask in address \"%s\"" +msgstr "máscara CIDR é inválida no endereço \"%s\"" + +#: libpq/hba.c:1616 +#, c-format +msgid "end-of-line before netmask specification" +msgstr "fim de linha antes da especificação de máscara de rede" + +#: libpq/hba.c:1617 +#, c-format +msgid "Specify an address range in CIDR notation, or provide a separate netmask." +msgstr "Especifique um intervalo de endereços na notação CIDR ou forneça uma máscara de rede separadamente." + +#: libpq/hba.c:1628 +#, c-format +msgid "multiple values specified for netmask" +msgstr "múltiplos valores especificados para máscara de rede" + +#: libpq/hba.c:1642 +#, c-format +msgid "invalid IP mask \"%s\": %s" +msgstr "máscara de endereço IP \"%s\" é inválida: %s" + +#: libpq/hba.c:1662 +#, c-format +msgid "IP address and mask do not match" +msgstr "endereço IP e máscara não correspodem" + +#: libpq/hba.c:1678 +#, c-format +msgid "end-of-line before authentication method" +msgstr "fim de linha antes do método de autenticação" + +#: libpq/hba.c:1689 +#, c-format +msgid "multiple values specified for authentication type" +msgstr "múltiplos valores especificados para tipo de autenticação" + +#: libpq/hba.c:1690 +#, c-format +msgid "Specify exactly one authentication type per line." +msgstr "Especifique exatamente um tipo de autenticação por linha." + +#: libpq/hba.c:1767 +#, c-format +msgid "invalid authentication method \"%s\"" +msgstr "o método de autenticação \"%s\" não é válido" + +#: libpq/hba.c:1780 +#, c-format +msgid "invalid authentication method \"%s\": not supported by this build" +msgstr "o método de autenticação \"%s\" não é válido: não tem suporte por essa construção" + +#: libpq/hba.c:1803 +#, c-format +msgid "gssapi authentication is not supported on local sockets" +msgstr "autenticação do tipo gssapi não tem suporte em soquetes locais" + +#: libpq/hba.c:1815 +#, c-format +msgid "peer authentication is only supported on local sockets" +msgstr "autenticação do tipo peer só tem suporte em soquetes locais" + +#: libpq/hba.c:1833 +#, c-format +msgid "cert authentication is only supported on hostssl connections" +msgstr "autenticação do tipo cert só tem suporte em conexões hostssl" + +#: libpq/hba.c:1883 +#, c-format +msgid "authentication option not in name=value format: %s" +msgstr "opção de autenticação não está no formato nome=valor: %s" + +#: libpq/hba.c:1927 +#, c-format +msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" +msgstr "não é possível usar ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter ou ldapurl junto com ldapprefix" + +#: libpq/hba.c:1938 +#, c-format +msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" +msgstr "método de autenticação \"ldap\" requer que argumento \"ldapbasedn\", \"ldapprefix\" ou \"ldapsuffix\" seja definido" + +#: libpq/hba.c:1954 +#, c-format +msgid "cannot use ldapsearchattribute together with ldapsearchfilter" +msgstr "não é possível usar o ldapsearchattribute junto com o ldapsearchfilter" + +#: libpq/hba.c:1971 +#, c-format +msgid "list of RADIUS servers cannot be empty" +msgstr "a lista de servidores RADIUS não pode estar vazia" + +#: libpq/hba.c:1982 +#, c-format +msgid "list of RADIUS secrets cannot be empty" +msgstr "a lista de segredos RADIUS não pode estar vazia" + +#: libpq/hba.c:1999 +#, c-format +msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "" + +#: libpq/hba.c:2015 +#, c-format +msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "" + +#: libpq/hba.c:2031 +#, c-format +msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" +msgstr "" + +#: libpq/hba.c:2083 +msgid "ident, peer, gssapi, sspi, and cert" +msgstr "ident, peer, gssapi, sspi e cert" + +#: libpq/hba.c:2092 +#, c-format +msgid "clientcert can only be configured for \"hostssl\" rows" +msgstr "clientcert só pode ser configurado para linhas \"hostssl\"" + +#: libpq/hba.c:2109 +#, c-format +msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" +msgstr "clientcert só aceita \"verify-full\" ao usar a autenticação \"cert\"" + +#: libpq/hba.c:2122 +#, c-format +msgid "invalid value for clientcert: \"%s\"" +msgstr "valor inválido para clientcert: \"%s\"" + +#: libpq/hba.c:2134 +#, c-format +msgid "clientname can only be configured for \"hostssl\" rows" +msgstr "clientname só pode ser configurado para linhas \"hostssl\"" + +#: libpq/hba.c:2153 +#, c-format +msgid "invalid value for clientname: \"%s\"" +msgstr "valor inválido para clientname: \"%s\"" + +#: libpq/hba.c:2186 +#, c-format +msgid "could not parse LDAP URL \"%s\": %s" +msgstr "não foi possível analisar URL do LDAP \"%s\": %s" + +#: libpq/hba.c:2197 +#, c-format +msgid "unsupported LDAP URL scheme: %s" +msgstr "esquema da URL do LDAP não é suportado: %s" + +#: libpq/hba.c:2221 +#, c-format +msgid "LDAP URLs not supported on this platform" +msgstr "URLs do LDAP não são suportadas nesta plataforma" + +#: libpq/hba.c:2239 +#, c-format +msgid "invalid ldapscheme value: \"%s\"" +msgstr "valor de ldapscheme inválido: \"%s\"" + +#: libpq/hba.c:2257 +#, c-format +msgid "invalid LDAP port number: \"%s\"" +msgstr "o número da porta LDAP não é válido: \"%s\"" + +#: libpq/hba.c:2303 libpq/hba.c:2310 +msgid "gssapi and sspi" +msgstr "gssapi e sspi" + +#: libpq/hba.c:2319 libpq/hba.c:2328 +msgid "sspi" +msgstr "" + +#: libpq/hba.c:2350 +#, c-format +msgid "could not parse RADIUS server list \"%s\"" +msgstr "não foi possível analisar a lista de servidores RADIUS \"%s\"" + +#: libpq/hba.c:2398 +#, c-format +msgid "could not parse RADIUS port list \"%s\"" +msgstr "não foi possível analisar a lista de portas RADIUS \"%s\"" + +#: libpq/hba.c:2412 +#, c-format +msgid "invalid RADIUS port number: \"%s\"" +msgstr "o número da porta RADIUS não é válido: \"%s\"" + +#: libpq/hba.c:2434 +#, c-format +msgid "could not parse RADIUS secret list \"%s\"" +msgstr "não foi possível analisar a lista secreta do RADIUS \"%s\"" + +#: libpq/hba.c:2456 +#, c-format +msgid "could not parse RADIUS identifiers list \"%s\"" +msgstr "não foi possível analisar a lista de identificadores RADIUS \"%s\"" + +#: libpq/hba.c:2470 +#, c-format +msgid "unrecognized authentication option name: \"%s\"" +msgstr "nome de opção de autenticação desconhecido: \"%s\"" + +#: libpq/hba.c:2662 +#, c-format +msgid "configuration file \"%s\" contains no entries" +msgstr "arquivo de configuração \"%s\" não contém entradas" + +#: libpq/hba.c:2815 +#, c-format +msgid "regular expression match for \"%s\" failed: %s" +msgstr "correspondência de expressão regular \"%s\" falhou: %s" + +#: libpq/hba.c:2839 +#, c-format +msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" +msgstr "expressão regular \"%s\" não tem subexpressões como informado na referência anterior em \"%s\"" + +#: libpq/hba.c:2942 +#, c-format +msgid "provided user name (%s) and authenticated user name (%s) do not match" +msgstr "nome de usuário fornecido (%s) e nome de usuário autenticado (%s) não correspondem" + +#: libpq/hba.c:2962 +#, c-format +msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" +msgstr "não há correspondência em mapa de usuários \"%s\" para usuário \"%s\" autenticado como \"%s\"" + +#: libpq/pqcomm.c:200 +#, c-format +msgid "could not set socket to nonblocking mode: %m" +msgstr "não foi possível configurar o soquete para modo sem bloqueio: %m" + +#: libpq/pqcomm.c:361 +#, c-format +msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" +msgstr "caminho do soquete de domínio Unix \"%s\" é muito longo (máximo de %d bytes)" + +#: libpq/pqcomm.c:381 +#, c-format +msgid "could not translate host name \"%s\", service \"%s\" to address: %s" +msgstr "não foi possível traduzir o nome do hospedeiro \"%s\", serviço \"%s\" para endereço: %s" + +#: libpq/pqcomm.c:385 +#, c-format +msgid "could not translate service \"%s\" to address: %s" +msgstr "não foi possível traduzir o serviço \"%s\" para endereço: %s" + +#: libpq/pqcomm.c:412 +#, c-format +msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" +msgstr "não foi possível se ligar a todos os endereços informados: MAXLISTEN (%d) excedeu" + +#: libpq/pqcomm.c:421 +msgid "IPv4" +msgstr "IPv4" + +#: libpq/pqcomm.c:424 +msgid "IPv6" +msgstr "IPv6" + +#: libpq/pqcomm.c:427 +msgid "Unix" +msgstr "Unix" + +#: libpq/pqcomm.c:431 +#, c-format +msgid "unrecognized address family %d" +msgstr "família de endereços %d desconhecida" + +#. translator: first %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:455 +#, c-format +msgid "could not create %s socket for address \"%s\": %m" +msgstr "não foi possível criar o soquete %s para o endereço \"%s\": %m" + +#. translator: third %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:481 libpq/pqcomm.c:499 +#, c-format +msgid "%s(%s) failed for %s address \"%s\": %m" +msgstr "%s(%s) falhou para %s endereço \"%s\": %m" + +#. translator: first %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:522 +#, c-format +msgid "could not bind %s address \"%s\": %m" +msgstr "não foi possível vincular o endereço %s \"%s\": %m" + +#: libpq/pqcomm.c:526 +#, c-format +msgid "Is another postmaster already running on port %d?" +msgstr "Outro postmaster está em execução na porta %d?" + +#: libpq/pqcomm.c:528 +#, c-format +msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." +msgstr "Outro postmaster já está executando na porta %d? Se não, espere alguns segundos e tente novamente." + +#. translator: first %s is IPv4, IPv6, or Unix +#: libpq/pqcomm.c:557 +#, c-format +msgid "could not listen on %s address \"%s\": %m" +msgstr "não foi possível escutar no endereço %s \"%s\": %m" + +#: libpq/pqcomm.c:565 +#, c-format +msgid "listening on Unix socket \"%s\"" +msgstr "escutando no soquete Unix \"%s\"" + +#. translator: first %s is IPv4 or IPv6 +#: libpq/pqcomm.c:570 +#, c-format +msgid "listening on %s address \"%s\", port %d" +msgstr "escutando no endereço %s \"%s\", porta %d" + +#: libpq/pqcomm.c:659 +#, c-format +msgid "group \"%s\" does not exist" +msgstr "grupo \"%s\" não existe" + +#: libpq/pqcomm.c:669 +#, c-format +msgid "could not set group of file \"%s\": %m" +msgstr "não foi possível definir grupo do arquivo \"%s\": %m" + +#: libpq/pqcomm.c:680 +#, c-format +msgid "could not set permissions of file \"%s\": %m" +msgstr "não foi possível definir permissões do arquivo \"%s\": %m" + +#: libpq/pqcomm.c:708 +#, c-format +msgid "could not accept new connection: %m" +msgstr "não foi possível aceitar nova conexão: %m" + +#: libpq/pqcomm.c:748 libpq/pqcomm.c:757 libpq/pqcomm.c:789 libpq/pqcomm.c:799 +#: libpq/pqcomm.c:1634 libpq/pqcomm.c:1679 libpq/pqcomm.c:1719 +#: libpq/pqcomm.c:1763 libpq/pqcomm.c:1802 libpq/pqcomm.c:1841 +#: libpq/pqcomm.c:1877 libpq/pqcomm.c:1916 +#, c-format +msgid "%s(%s) failed: %m" +msgstr "%s(%s) falhou: %m" + +#: libpq/pqcomm.c:903 +#, c-format +msgid "there is no client connection" +msgstr "não há conexão de cliente" + +#: libpq/pqcomm.c:959 libpq/pqcomm.c:1060 +#, c-format +msgid "could not receive data from client: %m" +msgstr "não foi possível receber dados do cliente: %m" + +#: libpq/pqcomm.c:1165 tcop/postgres.c:4405 +#, c-format +msgid "terminating connection because protocol synchronization was lost" +msgstr "encerrando a conexão, porque a sincronização do protocolo foi perdida" + +#: libpq/pqcomm.c:1231 +#, c-format +msgid "unexpected EOF within message length word" +msgstr "EOF inesperado dentro da palavra de tamanho de mensagem" + +#: libpq/pqcomm.c:1241 +#, c-format +msgid "invalid message length" +msgstr "o tamanho da mensagem não é válido" + +#: libpq/pqcomm.c:1263 libpq/pqcomm.c:1276 +#, c-format +msgid "incomplete message from client" +msgstr "mensagem incompleta do cliente" + +#: libpq/pqcomm.c:1387 +#, c-format +msgid "could not send data to client: %m" +msgstr "não foi possível enviar dados para cliente: %m" + +#: libpq/pqcomm.c:1602 +#, c-format +msgid "%s(%s) failed: error code %d" +msgstr "%s(%s) falhou: código de erro %d" + +#: libpq/pqcomm.c:1691 +#, c-format +msgid "setting the keepalive idle time is not supported" +msgstr "definir o tempo ocioso de manutenção de atividade (keepalive) não tem suporte" + +#: libpq/pqcomm.c:1775 libpq/pqcomm.c:1850 libpq/pqcomm.c:1925 +#, c-format +msgid "%s(%s) not supported" +msgstr "%s(%s) não tem suporte" + +#: libpq/pqformat.c:407 +#, c-format +msgid "no data left in message" +msgstr "nenhum dado na mensagem" + +#: libpq/pqformat.c:518 libpq/pqformat.c:536 libpq/pqformat.c:557 +#: utils/adt/array_userfuncs.c:799 utils/adt/arrayfuncs.c:1507 +#: utils/adt/rowtypes.c:615 +#, c-format +msgid "insufficient data left in message" +msgstr "dados insuficientes na mensagem" + +#: libpq/pqformat.c:598 libpq/pqformat.c:627 +#, c-format +msgid "invalid string in message" +msgstr "cadeia de caracteres é inválida na mensagem" + +#: libpq/pqformat.c:643 +#, c-format +msgid "invalid message format" +msgstr "o formato da mensagem não é válido" + +#: main/main.c:235 +#, c-format +msgid "%s: WSAStartup failed: %d\n" +msgstr "%s: WSAStartup falhou: %d\n" + +#: main/main.c:329 +#, c-format +msgid "" +"%s is the PostgreSQL server.\n" +"\n" +msgstr "" +"%s é o servidor PostgreSQL.\n" +"\n" + +#: main/main.c:330 +#, c-format +msgid "" +"Usage:\n" +" %s [OPTION]...\n" +"\n" +msgstr "" +"Uso:\n" +" %s [OPÇÃO]...\n" +"\n" + +#: main/main.c:331 +#, c-format +msgid "Options:\n" +msgstr "Opções:\n" + +#: main/main.c:332 +#, c-format +msgid " -B NBUFFERS number of shared buffers\n" +msgstr " -B NBUFFERS número de buffers compartilhados\n" + +#: main/main.c:333 +#, c-format +msgid " -c NAME=VALUE set run-time parameter\n" +msgstr " -c NOME=VALOR define o parâmetro em tempo de execução\n" + +#: main/main.c:334 +#, c-format +msgid " -C NAME print value of run-time parameter, then exit\n" +msgstr " -C NOME mostra valor de parâmetro em tempo de execução e termina\n" + +#: main/main.c:335 +#, c-format +msgid " -d 1-5 debugging level\n" +msgstr " -d 1-5 nível de depuração\n" + +#: main/main.c:336 +#, c-format +msgid " -D DATADIR database directory\n" +msgstr " -D DIRDADOS diretório do banco de dados\n" + +#: main/main.c:337 +#, c-format +msgid " -e use European date input format (DMY)\n" +msgstr " -e usa formato de entrada de data europeu (DMY)\n" + +#: main/main.c:338 +#, c-format +msgid " -F turn fsync off\n" +msgstr " -F desativa o fsync\n" + +#: main/main.c:339 +#, c-format +msgid " -h HOSTNAME host name or IP address to listen on\n" +msgstr " -h HOSPEDEIRO nome do hospedeiro ou endereço IP para escutar\n" + +#: main/main.c:340 +#, c-format +msgid " -i enable TCP/IP connections (deprecated)\n" +msgstr " -i ativa conexões TCP/IP (em obsolescência)\n" + +#: main/main.c:341 +#, c-format +msgid " -k DIRECTORY Unix-domain socket location\n" +msgstr " -k DIRETÓRIO local do soquete de domínio Unix\n" + +#: main/main.c:343 +#, c-format +msgid " -l enable SSL connections\n" +msgstr " -l habilita conexões SSL\n" + +#: main/main.c:345 +#, c-format +msgid " -N MAX-CONNECT maximum number of allowed connections\n" +msgstr " -N MAX-CONEXÃO número máximo de conexões permitidas\n" + +#: main/main.c:346 +#, c-format +msgid " -p PORT port number to listen on\n" +msgstr " -p PORTA número da porta para escutar\n" + +#: main/main.c:347 +#, c-format +msgid " -s show statistics after each query\n" +msgstr " -s mostra estatísticas após cada consulta\n" + +#: main/main.c:348 +#, c-format +msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" +msgstr " -S MEM-ORD define a quantidade de memória para classificações (em kB)\n" + +#: main/main.c:349 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version mostra informação sobre a versão e termina\n" + +#: main/main.c:350 +#, c-format +msgid " --NAME=VALUE set run-time parameter\n" +msgstr " --NOME=VALOR define o parâmetro em tempo de execução\n" + +#: main/main.c:351 +#, c-format +msgid " --describe-config describe configuration parameters, then exit\n" +msgstr " --describe-config descreve parâmetros de configuração e termina\n" + +#: main/main.c:352 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostra essa ajuda e termina\n" + +#: main/main.c:354 +#, c-format +msgid "" +"\n" +"Developer options:\n" +msgstr "" +"\n" +"Opções para desenvolvedor:\n" + +#: main/main.c:355 +#, c-format +msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" +msgstr " -f s|i|o|b|t|n|m|h impede o uso de alguns tipos de plano\n" + +#: main/main.c:356 +#, c-format +msgid " -O allow system table structure changes\n" +msgstr " -O permite mudanças na estrutura de tabelas do sistema\n" + +#: main/main.c:357 +#, c-format +msgid " -P disable system indexes\n" +msgstr " -P desativa índices do sistema\n" + +#: main/main.c:358 +#, c-format +msgid " -t pa|pl|ex show timings after each query\n" +msgstr " -t pa|pl|ex mostra duração depois de cada consulta\n" + +#: main/main.c:359 +#, c-format +msgid " -T send SIGABRT to all backend processes if one dies\n" +msgstr " -T envia SIGABRT para todos os processos servidores se um deles morrer\n" + +#: main/main.c:360 +#, c-format +msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" +msgstr " -W NUM espera NUM segundos para permitir que o depurador seja anexado\n" + +#: main/main.c:362 +#, c-format +msgid "" +"\n" +"Options for single-user mode:\n" +msgstr "" +"\n" +"Opções para modo monousuário:\n" + +#: main/main.c:363 +#, c-format +msgid " --single selects single-user mode (must be first argument)\n" +msgstr " --single seleciona modo monousuário (deve ser o primeiro argumento)\n" + +#: main/main.c:364 +#, c-format +msgid " DBNAME database name (defaults to user name)\n" +msgstr " NOMEBD nome do banco de dados (padrão é o nome do usuário)\n" + +#: main/main.c:365 +#, c-format +msgid " -d 0-5 override debugging level\n" +msgstr " -d 0-5 muda o nível de depuração\n" + +#: main/main.c:366 +#, c-format +msgid " -E echo statement before execution\n" +msgstr " -E mostra consulta antes da execução\n" + +#: main/main.c:367 +#, c-format +msgid " -j do not use newline as interactive query delimiter\n" +msgstr " -j não usa nova linha como delimitador de consulta iterativa\n" + +#: main/main.c:368 main/main.c:374 +#, c-format +msgid " -r FILENAME send stdout and stderr to given file\n" +msgstr " -r ARQUIVO envia saída stdout e stderr para o arquivo designado\n" + +#: main/main.c:370 +#, c-format +msgid "" +"\n" +"Options for bootstrapping mode:\n" +msgstr "" +"\n" +"Opções para modo de ativação:\n" + +#: main/main.c:371 +#, c-format +msgid " --boot selects bootstrapping mode (must be first argument)\n" +msgstr " --boot seleciona modo de ativação (deve ser o primeiro argumento)\n" + +#: main/main.c:372 +#, c-format +msgid " --check selects check mode (must be first argument)\n" +msgstr " --check seleciona o modo de verificação (deve ser o primeiro argumento)\n" + +#: main/main.c:373 +#, c-format +msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" +msgstr " NOMEBD nome do banco de dados (argumento obrigatório no modo de ativação)\n" + +#: main/main.c:376 +#, c-format +msgid "" +"\n" +"Please read the documentation for the complete list of run-time\n" +"configuration settings and how to set them on the command line or in\n" +"the configuration file.\n" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Por favor, leia a documentação para obter a lista completa de definições\n" +"de configuração de tempo de execução e como defini-las na linha de\n" +"comando ou no arquivo de configuração.\n" +"\n" +"Relate os erros para <%s>.\n" + +#: main/main.c:380 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "Página web do %s: <%s>\n" + +#: main/main.c:391 +#, c-format +msgid "" +"\"root\" execution of the PostgreSQL server is not permitted.\n" +"The server must be started under an unprivileged user ID to prevent\n" +"possible system security compromise. See the documentation for\n" +"more information on how to properly start the server.\n" +msgstr "" +"execução do servidor PostgreSQL pelo \"root\" não é permitida.\n" +"O servidor deve ser iniciado por um usuário sem privilégios para previnir\n" +"possíveis comprometimentos de segurança no sistema. Veja a documentação para\n" +"obter informações adicionais sobre como iniciar o servidor corretamente.\n" + +#: main/main.c:408 +#, c-format +msgid "%s: real and effective user IDs must match\n" +msgstr "%s: IDs do usuário real e efetivo devem corresponder\n" + +#: main/main.c:415 +#, c-format +msgid "" +"Execution of PostgreSQL by a user with administrative permissions is not\n" +"permitted.\n" +"The server must be started under an unprivileged user ID to prevent\n" +"possible system security compromises. See the documentation for\n" +"more information on how to properly start the server.\n" +msgstr "" +"Execução do servidor PostgreSQL por um usuário com permissões administrativas não é\n" +"permitida.\n" +"O servidor deve ser iniciado por um usuário sem privilégios para previnir\n" +"possíveis comprometimentos de segurança no sistema. Veja a documentação para\n" +"obter informações adicionais sobre como iniciar o servidor corretamente.\n" + +#: nodes/extensible.c:66 +#, c-format +msgid "extensible node type \"%s\" already exists" +msgstr "o tipo de nó extensível \"%s\" já existe" + +#: nodes/extensible.c:114 +#, c-format +msgid "ExtensibleNodeMethods \"%s\" was not registered" +msgstr "ExtensibleNodeMethods \"%s\" não foi registrado" + +#: nodes/makefuncs.c:153 statistics/extended_stats.c:2335 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "relação \"%s\" não tem um tipo composto" + +#: nodes/makefuncs.c:879 +#, c-format +msgid "unrecognized JSON encoding: %s" +msgstr "codificação JSON não reconhecida: %s" + +#: nodes/nodeFuncs.c:116 nodes/nodeFuncs.c:147 parser/parse_coerce.c:2567 +#: parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 +#: parser/parse_expr.c:2049 parser/parse_func.c:710 parser/parse_oper.c:883 +#: utils/fmgr/funcapi.c:661 +#, c-format +msgid "could not find array type for data type %s" +msgstr "não foi possível encontrar um tipo de dados matriz para tipo de dados %s" + +#: nodes/params.c:417 +#, c-format +msgid "portal \"%s\" with parameters: %s" +msgstr "portal \"%s\" com parâmetros: %s" + +#: nodes/params.c:420 +#, c-format +msgid "unnamed portal with parameters: %s" +msgstr "portal sem nome com parâmetros: %s" + +#: optimizer/path/joinrels.c:973 +#, c-format +msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" +msgstr "FULL JOIN só é suportado com condições de junção que podem ser utilizadas com junção por mesclagem ou junção por hash" + +#: optimizer/plan/createplan.c:7111 parser/parse_merge.c:182 +#: parser/parse_merge.c:189 +#, c-format +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "não é possível executar MERGE na relação \"%s\"" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: optimizer/plan/initsplan.c:1408 +#, c-format +msgid "%s cannot be applied to the nullable side of an outer join" +msgstr "%s não pode ser aplicado ao lado com valores nulos de um junção externa" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: optimizer/plan/planner.c:1361 parser/analyze.c:1761 parser/analyze.c:2018 +#: parser/analyze.c:3231 +#, c-format +msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" +msgstr "%s não é permitido com UNION/INTERSECT/EXCEPT" + +#: optimizer/plan/planner.c:2076 optimizer/plan/planner.c:4035 +#, c-format +msgid "could not implement GROUP BY" +msgstr "não foi possível implementar GROUP BY" + +#: optimizer/plan/planner.c:2077 optimizer/plan/planner.c:4036 +#: optimizer/plan/planner.c:4676 optimizer/prep/prepunion.c:1053 +#, c-format +msgid "Some of the datatypes only support hashing, while others only support sorting." +msgstr "Alguns dos tipos de dados só dão suporte a hash, enquanto outros só dão suporte a classificação." + +#: optimizer/plan/planner.c:4675 +#, c-format +msgid "could not implement DISTINCT" +msgstr "não foi possível implementar DISTINCT" + +#: optimizer/plan/planner.c:6014 +#, c-format +msgid "could not implement window PARTITION BY" +msgstr "não foi possível implementar a janela PARTITION BY" + +#: optimizer/plan/planner.c:6015 +#, c-format +msgid "Window partitioning columns must be of sortable datatypes." +msgstr "As colunas de particionamento de janelas devem ser de tipos de dados classificáveis." + +#: optimizer/plan/planner.c:6019 +#, c-format +msgid "could not implement window ORDER BY" +msgstr "não foi possível implementar a janela ORDER BY" + +#: optimizer/plan/planner.c:6020 +#, c-format +msgid "Window ordering columns must be of sortable datatypes." +msgstr "As colunas de ordenação de janelas devem ser de tipos de dados classificáveis." + +#: optimizer/prep/prepunion.c:516 +#, c-format +msgid "could not implement recursive UNION" +msgstr "não foi possível implementar UNION recursivo" + +#: optimizer/prep/prepunion.c:517 +#, c-format +msgid "All column datatypes must be hashable." +msgstr "Todos os tipos de dados de coluna devem permitir hash." + +#. translator: %s is UNION, INTERSECT, or EXCEPT +#: optimizer/prep/prepunion.c:1052 +#, c-format +msgid "could not implement %s" +msgstr "não foi possível implementar %s" + +#: optimizer/util/clauses.c:4929 +#, c-format +msgid "SQL function \"%s\" during inlining" +msgstr "função SQL \"%s\" durante expansão em linha" + +#: optimizer/util/plancat.c:154 +#, c-format +msgid "cannot access temporary or unlogged relations during recovery" +msgstr "não é possível criar tabelas temporárias ou sem registro de transações (unlogged) durante a recuperação" + +#: optimizer/util/plancat.c:726 +#, c-format +msgid "whole row unique index inference specifications are not supported" +msgstr "" + +#: optimizer/util/plancat.c:743 +#, c-format +msgid "constraint in ON CONFLICT clause has no associated index" +msgstr "" + +#: optimizer/util/plancat.c:793 +#, c-format +msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" +msgstr "ON CONFLICT DO UPDATE sem suporte com restrições de exclusão" + +#: optimizer/util/plancat.c:898 +#, c-format +msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" +msgstr "não há nenhuma restrição de unicidade ou de exclusão que corresponda à especificação ON CONFLICT" + +#: parser/analyze.c:826 parser/analyze.c:1540 +#, c-format +msgid "VALUES lists must all be the same length" +msgstr "listas de VALUES devem ser todas do mesmo tamanho" + +#: parser/analyze.c:1028 +#, c-format +msgid "INSERT has more expressions than target columns" +msgstr "INSERT tem mais expressões do que colunas alvo" + +#: parser/analyze.c:1046 +#, c-format +msgid "INSERT has more target columns than expressions" +msgstr "INSERT tem mais colunas alvo do que expressões" + +#: parser/analyze.c:1050 +#, c-format +msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" +msgstr "A fonte de inserção é uma expressão de linha contendo o mesmo número de colunas esperadas pelo INSERT. Você utilizou acidentalmente parênteses extra?" + +#: parser/analyze.c:1347 parser/analyze.c:1734 +#, c-format +msgid "SELECT ... INTO is not allowed here" +msgstr "SELECT ... INTO não é permitido aqui" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:1663 parser/analyze.c:3463 +#, c-format +msgid "%s cannot be applied to VALUES" +msgstr "%s não pode ser aplicado a VALUES" + +#: parser/analyze.c:1900 +#, c-format +msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" +msgstr "cláusula UNION/INTERSECT/EXCEPT ORDER BY é inválida" + +#: parser/analyze.c:1901 +#, c-format +msgid "Only result column names can be used, not expressions or functions." +msgstr "Somente nomes de colunas resultantes podem ser utilizadas, e não expressões ou funções." + +#: parser/analyze.c:1902 +#, c-format +msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." +msgstr "Adicione a expressão/função a todos SELECTs ou mova o UNION para uma cláusula FROM." + +#: parser/analyze.c:2008 +#, c-format +msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" +msgstr "INTO só é permitido no primeiro SELECT do UNION/INTERSECT/EXCEPT" + +#: parser/analyze.c:2080 +#, c-format +msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" +msgstr "comando membro do UNION/INTERSECT/EXCEPT não pode referenciar outras relações do mesmo nível da consulta" + +#: parser/analyze.c:2167 +#, c-format +msgid "each %s query must have the same number of columns" +msgstr "cada consulta %s deve ter o mesmo número de colunas" + +#: parser/analyze.c:2573 +#, c-format +msgid "RETURNING must have at least one column" +msgstr "RETURNING deve ter pelo menos uma coluna" + +#: parser/analyze.c:2676 +#, c-format +msgid "assignment source returned %d column" +msgid_plural "assignment source returned %d columns" +msgstr[0] "fonte de atribuição retornou %d coluna" +msgstr[1] "fonte de atribuição retornou %d colunas" + +#: parser/analyze.c:2737 +#, c-format +msgid "variable \"%s\" is of type %s but expression is of type %s" +msgstr "a variável \"%s\" é do tipo de dados %s, mas a expressão é do tipo de dados %s" + +#. translator: %s is a SQL keyword +#: parser/analyze.c:2862 parser/analyze.c:2870 +#, c-format +msgid "cannot specify both %s and %s" +msgstr "não é possível especificar %s e %s" + +#: parser/analyze.c:2890 +#, c-format +msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" +msgstr "DECLARE CURSOR não deve conter comandos que modificam dados no WITH" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:2898 +#, c-format +msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" +msgstr "DECLARE CURSOR WITH HOLD ... %s não é suportado" + +#: parser/analyze.c:2901 +#, c-format +msgid "Holdable cursors must be READ ONLY." +msgstr "Cursores duráveis devem ser READ ONLY." + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:2909 +#, c-format +msgid "DECLARE SCROLL CURSOR ... %s is not supported" +msgstr "DECLARE SCROLL CURSOR ... %s não é suportado" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:2920 +#, c-format +msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" +msgstr "DECLARE INSENSITIVE CURSOR ... %s não é válido" + +#: parser/analyze.c:2923 +#, c-format +msgid "Insensitive cursors must be READ ONLY." +msgstr "Cursores insensíveis devem ser READ ONLY." + +#: parser/analyze.c:3017 +#, c-format +msgid "materialized views must not use data-modifying statements in WITH" +msgstr "visões materializadas não devem conter comandos que modificam dados no WITH" + +#: parser/analyze.c:3027 +#, c-format +msgid "materialized views must not use temporary tables or views" +msgstr "visões materializadas não devem utilizar tabelas ou visões temporárias" + +#: parser/analyze.c:3037 +#, c-format +msgid "materialized views may not be defined using bound parameters" +msgstr "visões materializadas não podem ser definidas usando parâmetros relacionados" + +#: parser/analyze.c:3049 +#, c-format +msgid "materialized views cannot be unlogged" +msgstr "visualizações materializadas não podem ser sem registro de transações (unlogged)" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3238 +#, c-format +msgid "%s is not allowed with DISTINCT clause" +msgstr "%s não é permitido com cláusula DISTINCT" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3245 +#, c-format +msgid "%s is not allowed with GROUP BY clause" +msgstr "%s não é permitido com cláusula GROUP BY" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3252 +#, c-format +msgid "%s is not allowed with HAVING clause" +msgstr "%s não é permitido com cláusula HAVING" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3259 +#, c-format +msgid "%s is not allowed with aggregate functions" msgstr "%s não é permitido com funções de agregação" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2322 +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3266 +#, c-format +msgid "%s is not allowed with window functions" +msgstr "%s não é permitido com funções deslizantes" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3273 +#, c-format +msgid "%s is not allowed with set-returning functions in the target list" +msgstr "%s não é permitido em funções que retornam conjunto na lista de alvos" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3372 +#, c-format +msgid "%s must specify unqualified relation names" +msgstr "%s deve especificar nomes de relação não qualificados" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3436 +#, c-format +msgid "%s cannot be applied to a join" +msgstr "%s não pode ser aplicado em uma junção" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3445 +#, c-format +msgid "%s cannot be applied to a function" +msgstr "%s não pode ser aplicado a uma função" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3454 +#, c-format +msgid "%s cannot be applied to a table function" +msgstr "%s não pode ser aplicado a uma função de tabela" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3472 +#, c-format +msgid "%s cannot be applied to a WITH query" +msgstr "%s não pode ser aplicado em uma consulta WITH" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3481 +#, c-format +msgid "%s cannot be applied to a named tuplestore" +msgstr "%s não pode ser aplicado a um tuplestore com nome" + +#. translator: %s is a SQL row locking clause such as FOR UPDATE +#: parser/analyze.c:3501 +#, c-format +msgid "relation \"%s\" in %s clause not found in FROM clause" +msgstr "relação \"%s\" na cláusula %s não foi encontrada na cláusula FROM" + +#: parser/parse_agg.c:209 parser/parse_oper.c:227 +#, c-format +msgid "could not identify an ordering operator for type %s" +msgstr "não foi possível identificar um operador de ordenação para tipo %s" + +#: parser/parse_agg.c:211 +#, c-format +msgid "Aggregates with DISTINCT must be able to sort their inputs." +msgstr "Agregações com DISTINCT devem ser capazes de classificar suas entradas." + +#: parser/parse_agg.c:269 +#, c-format +msgid "GROUPING must have fewer than 32 arguments" +msgstr "" + +#: parser/parse_agg.c:372 +msgid "aggregate functions are not allowed in JOIN conditions" +msgstr "funções de agregação não são permitidas nas condições JOIN" + +#: parser/parse_agg.c:374 +msgid "grouping operations are not allowed in JOIN conditions" +msgstr "não são permitidas operações de agrupamento em condições JOIN" + +#: parser/parse_agg.c:386 +msgid "aggregate functions are not allowed in FROM clause of their own query level" +msgstr "funções de agregação não são permitidas na cláusula FROM de seu próprio nível de consulta" + +#: parser/parse_agg.c:388 +msgid "grouping operations are not allowed in FROM clause of their own query level" +msgstr "não são permitidas operações de agrupamento na cláusula FROM do seu próprio nível de consulta" + +#: parser/parse_agg.c:393 +msgid "aggregate functions are not allowed in functions in FROM" +msgstr "funções de agregação não são permitidas em funções no FROM" + +#: parser/parse_agg.c:395 +msgid "grouping operations are not allowed in functions in FROM" +msgstr "não são permitidas operações de agrupamento em funções no FROM" + +#: parser/parse_agg.c:403 +msgid "aggregate functions are not allowed in policy expressions" +msgstr "não são permitidas funções de agregação em expressões de política" + +#: parser/parse_agg.c:405 +msgid "grouping operations are not allowed in policy expressions" +msgstr "não são permitidas operações de agrupamento em expressões de política" + +#: parser/parse_agg.c:422 +msgid "aggregate functions are not allowed in window RANGE" +msgstr "funções de agregação não são permitidas no deslizante RANGE" + +#: parser/parse_agg.c:424 +msgid "grouping operations are not allowed in window RANGE" +msgstr "não são permitidas operações de agrupamento em RANGE de janela deslizante" + +#: parser/parse_agg.c:429 +msgid "aggregate functions are not allowed in window ROWS" +msgstr "funções de agregação não são permitidas no deslizante ROWS" + +#: parser/parse_agg.c:431 +msgid "grouping operations are not allowed in window ROWS" +msgstr "não são permitidas operações de agrupamento em ROWS de janela deslizante" + +#: parser/parse_agg.c:436 +msgid "aggregate functions are not allowed in window GROUPS" +msgstr "não são permitidas funções de agregação em GROUPS de janela deslizante" + +#: parser/parse_agg.c:438 +msgid "grouping operations are not allowed in window GROUPS" +msgstr "não são permitidas operações de agrupamento em GROUPS de janela deslizante" + +#: parser/parse_agg.c:451 +msgid "aggregate functions are not allowed in MERGE WHEN conditions" +msgstr "não são permitidas funções de agregação em condições MERGE WHEN" + +#: parser/parse_agg.c:453 +msgid "grouping operations are not allowed in MERGE WHEN conditions" +msgstr "não são permitidas operações de agrupamento em condições MERGE WHEN" + +#: parser/parse_agg.c:479 +msgid "aggregate functions are not allowed in check constraints" +msgstr "funções de agregação não são permitidas em restrições de verificação" + +#: parser/parse_agg.c:481 +msgid "grouping operations are not allowed in check constraints" +msgstr "não são permitidas operações de agrupamento em restrições de verificação" + +#: parser/parse_agg.c:488 +msgid "aggregate functions are not allowed in DEFAULT expressions" +msgstr "funções de agregação não são permitidas em expressões DEFAULT" + +#: parser/parse_agg.c:490 +msgid "grouping operations are not allowed in DEFAULT expressions" +msgstr "não são permitidas operações de agrupamento em expressões DEFAULT" + +#: parser/parse_agg.c:495 +msgid "aggregate functions are not allowed in index expressions" +msgstr "funções de agregação não são permitidas em expressões de índice" + +#: parser/parse_agg.c:497 +msgid "grouping operations are not allowed in index expressions" +msgstr "não são permitidas operações de agrupamento em expressões de índice" + +#: parser/parse_agg.c:502 +msgid "aggregate functions are not allowed in index predicates" +msgstr "funções de agregação não são permitidas em predicados de índice" + +#: parser/parse_agg.c:504 +msgid "grouping operations are not allowed in index predicates" +msgstr "não são permitidas operações de agrupamento em predicados de índice" + +#: parser/parse_agg.c:509 +msgid "aggregate functions are not allowed in statistics expressions" +msgstr "não são permitidas funções de agregação em expressões de estatísticas" + +#: parser/parse_agg.c:511 +msgid "grouping operations are not allowed in statistics expressions" +msgstr "não são permitidas operações de agrupamento em expressões de estatísticas" + +#: parser/parse_agg.c:516 +msgid "aggregate functions are not allowed in transform expressions" +msgstr "funções de agregação não são permitidas em expressões de transformação" + +#: parser/parse_agg.c:518 +msgid "grouping operations are not allowed in transform expressions" +msgstr "não são permitidas operações de agrupamento em expressões de transformação" + +#: parser/parse_agg.c:523 +msgid "aggregate functions are not allowed in EXECUTE parameters" +msgstr "funções de agregação não são permitidas em parâmetros EXECUTE" + +#: parser/parse_agg.c:525 +msgid "grouping operations are not allowed in EXECUTE parameters" +msgstr "não são permitidas operações de agrupamento em parâmetros do EXECUTE" + +#: parser/parse_agg.c:530 +msgid "aggregate functions are not allowed in trigger WHEN conditions" +msgstr "funções de agregação não são permitidas em condições WHEN de gatilho" + +#: parser/parse_agg.c:532 +msgid "grouping operations are not allowed in trigger WHEN conditions" +msgstr "não são permitidas operações de agrupamento em condições de gatilho WHEN" + +#: parser/parse_agg.c:537 +msgid "aggregate functions are not allowed in partition bound" +msgstr "não são permitidas funções de agregação no limite de partição" + +#: parser/parse_agg.c:539 +msgid "grouping operations are not allowed in partition bound" +msgstr "não são permitidas operações de agrupamento no limite de partição" + +#: parser/parse_agg.c:544 +msgid "aggregate functions are not allowed in partition key expressions" +msgstr "não são permitidas funções de agregação em expressões de chave de partição" + +#: parser/parse_agg.c:546 +msgid "grouping operations are not allowed in partition key expressions" +msgstr "não são permitidas operações de agrupamento em expressões de chave de partição" + +#: parser/parse_agg.c:552 +msgid "aggregate functions are not allowed in column generation expressions" +msgstr "não são permitidas funções de agregação em expressões de geração de coluna" + +#: parser/parse_agg.c:554 +msgid "grouping operations are not allowed in column generation expressions" +msgstr "não são permitidas operações de agrupamento em expressões de geração de colunas" + +#: parser/parse_agg.c:560 +msgid "aggregate functions are not allowed in CALL arguments" +msgstr "não são permitidas funções de agregação em argumentos do CALL" + +#: parser/parse_agg.c:562 +msgid "grouping operations are not allowed in CALL arguments" +msgstr "não são permitidas operações de agrupamento em argumentos do CALL" + +#: parser/parse_agg.c:568 +msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" +msgstr "não são permitidas funções de agregação em condições de COPY FROM WHERE" + +#: parser/parse_agg.c:570 +msgid "grouping operations are not allowed in COPY FROM WHERE conditions" +msgstr "não são permitidas operações de agrupamento em condições de COPY FROM WHERE" + +#. translator: %s is name of a SQL construct, eg GROUP BY +#: parser/parse_agg.c:597 parser/parse_clause.c:1956 +#, c-format +msgid "aggregate functions are not allowed in %s" +msgstr "funções de agregação não são permitidas em %s" + +#. translator: %s is name of a SQL construct, eg GROUP BY +#: parser/parse_agg.c:600 +#, c-format +msgid "grouping operations are not allowed in %s" +msgstr "não são permitidas operações de agrupamento em %s" + +#: parser/parse_agg.c:701 +#, c-format +msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" +msgstr "agregação de nível superior não pode conter uma variável de nível inferior nos seus argumentos diretos" + +#: parser/parse_agg.c:779 +#, c-format +msgid "aggregate function calls cannot contain set-returning function calls" +msgstr "chamadas de função de agregação não podem conter chamadas de função com retorno de conjunto" + +#: parser/parse_agg.c:780 parser/parse_expr.c:1700 parser/parse_expr.c:2182 +#: parser/parse_func.c:884 +#, c-format +msgid "You might be able to move the set-returning function into a LATERAL FROM item." +msgstr "Você pode mover a função de retorno de conjunto para um item LATERAL FROM." + +#: parser/parse_agg.c:785 +#, c-format +msgid "aggregate function calls cannot contain window function calls" +msgstr "chamadas de função de agregação não podem conter chamadas de função deslizante" + +#: parser/parse_agg.c:864 +msgid "window functions are not allowed in JOIN conditions" +msgstr "funções deslizantes não são permitidas em condições JOIN" + +#: parser/parse_agg.c:871 +msgid "window functions are not allowed in functions in FROM" +msgstr "funções deslizantes não são permitidas em funções no FROM" + +#: parser/parse_agg.c:877 +msgid "window functions are not allowed in policy expressions" +msgstr "não são permitidas funções de janela deslizante em expressões de política" + +#: parser/parse_agg.c:890 +msgid "window functions are not allowed in window definitions" +msgstr "funções deslizantes não são permitidas em definições de deslizante" + +#: parser/parse_agg.c:901 +msgid "window functions are not allowed in MERGE WHEN conditions" +msgstr "não são permitidas funções de janela deslizante em condições MERGE WHEN" + +#: parser/parse_agg.c:925 +msgid "window functions are not allowed in check constraints" +msgstr "funções deslizantes não são permitidas em restrições de verificação" + +#: parser/parse_agg.c:929 +msgid "window functions are not allowed in DEFAULT expressions" +msgstr "funções deslizantes não são permitidas em expressões DEFAULT" + +#: parser/parse_agg.c:932 +msgid "window functions are not allowed in index expressions" +msgstr "funções deslizantes não são permitidas em expressões de índice" + +#: parser/parse_agg.c:935 +msgid "window functions are not allowed in statistics expressions" +msgstr "não são permitidas funções de janela deslizante em expressões de estatísticas" + +#: parser/parse_agg.c:938 +msgid "window functions are not allowed in index predicates" +msgstr "funções deslizantes não são permitidas em predicados de índice" + +#: parser/parse_agg.c:941 +msgid "window functions are not allowed in transform expressions" +msgstr "funções deslizantes não são permitidas em expressões de transformação" + +#: parser/parse_agg.c:944 +msgid "window functions are not allowed in EXECUTE parameters" +msgstr "funções deslizantes não são permitidas em parâmetros EXECUTE" + +#: parser/parse_agg.c:947 +msgid "window functions are not allowed in trigger WHEN conditions" +msgstr "funções deslizantes não são permitidas em condições WHEN de gatilho" + +#: parser/parse_agg.c:950 +msgid "window functions are not allowed in partition bound" +msgstr "não são permitidas funções de janela deslizante em partição vinculada" + +#: parser/parse_agg.c:953 +msgid "window functions are not allowed in partition key expressions" +msgstr "não são permitidas funções de janela deslizante em expressões de chave de partição" + +#: parser/parse_agg.c:956 +msgid "window functions are not allowed in CALL arguments" +msgstr "não são permitidas funções de janela deslizante em argumentos do CALL" + +#: parser/parse_agg.c:959 +msgid "window functions are not allowed in COPY FROM WHERE conditions" +msgstr "não são permitidas funções de janela deslizante em condições de COPY FROM WHERE" + +#: parser/parse_agg.c:962 +msgid "window functions are not allowed in column generation expressions" +msgstr "não são permitidas funções de janela deslizante em expressões de geração de colunas" + +#. translator: %s is name of a SQL construct, eg GROUP BY +#: parser/parse_agg.c:985 parser/parse_clause.c:1965 +#, c-format +msgid "window functions are not allowed in %s" +msgstr "funções deslizantes não são permitidas em %s" + +#: parser/parse_agg.c:1019 parser/parse_clause.c:2798 +#, c-format +msgid "window \"%s\" does not exist" +msgstr "deslizante \"%s\" não existe" + +#: parser/parse_agg.c:1107 +#, c-format +msgid "too many grouping sets present (maximum 4096)" +msgstr "" + +#: parser/parse_agg.c:1247 +#, c-format +msgid "aggregate functions are not allowed in a recursive query's recursive term" +msgstr "funções de agregação não são permitidas em termo recursivo de uma consulta recursiva" + +#: parser/parse_agg.c:1440 +#, c-format +msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" +msgstr "coluna \"%s.%s\" deve aparecer na cláusula GROUP BY ou ser usada em uma função de agregação" + +#: parser/parse_agg.c:1443 +#, c-format +msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." +msgstr "Argumentos diretos de uma agregação de conjunto ordenado devem utilizar somente colunas agrupadas." + +#: parser/parse_agg.c:1448 +#, c-format +msgid "subquery uses ungrouped column \"%s.%s\" from outer query" +msgstr "subconsulta utiliza coluna desagrupada \"%s.%s\" na consulta externa" + +#: parser/parse_agg.c:1612 +#, c-format +msgid "arguments to GROUPING must be grouping expressions of the associated query level" +msgstr "" + +#: parser/parse_clause.c:195 +#, c-format +msgid "relation \"%s\" cannot be the target of a modifying statement" +msgstr "a relação \"%s\" não pode ser o destino de uma instrução de modificação" + +#: parser/parse_clause.c:571 parser/parse_clause.c:599 parser/parse_func.c:2552 +#, c-format +msgid "set-returning functions must appear at top level of FROM" +msgstr "as funções de retorno de conjunto devem aparecer no nível superior do FROM" + +#: parser/parse_clause.c:611 +#, c-format +msgid "multiple column definition lists are not allowed for the same function" +msgstr "listas múltiplas de definição de colunas somente são permitidas para mesma função" + +#: parser/parse_clause.c:644 +#, c-format +msgid "ROWS FROM() with multiple functions cannot have a column definition list" +msgstr "ROWS FROM() com múltiplas funções não pode ter uma lista de definição de colunas" + +#: parser/parse_clause.c:645 +#, c-format +msgid "Put a separate column definition list for each function inside ROWS FROM()." +msgstr "Coloque uma lista separada de definição de colunas para cada função dentro de ROWS FROM()." + +#: parser/parse_clause.c:651 +#, c-format +msgid "UNNEST() with multiple arguments cannot have a column definition list" +msgstr "UNNEST() com múltiplos argumentos não pode ter uma lista de definição de colunas" + +#: parser/parse_clause.c:652 +#, c-format +msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." +msgstr "Use chamadas UNNEST() separadas dentro de ROWS FROM(), e anexe uma lista de definição de colunas a cada uma." + +#: parser/parse_clause.c:659 +#, c-format +msgid "WITH ORDINALITY cannot be used with a column definition list" +msgstr "WITH ORDINALITY não pode ser usada com uma lista de definição de colunas" + +#: parser/parse_clause.c:660 +#, c-format +msgid "Put the column definition list inside ROWS FROM()." +msgstr "Coloque uma lista de definição de colunas dentro de ROWS FROM()." + +#: parser/parse_clause.c:760 +#, c-format +msgid "only one FOR ORDINALITY column is allowed" +msgstr "" + +#: parser/parse_clause.c:821 +#, c-format +msgid "column name \"%s\" is not unique" +msgstr "o nome da coluna \"%s\" não é único" + +#: parser/parse_clause.c:863 +#, c-format +msgid "namespace name \"%s\" is not unique" +msgstr "o nome do espaço de nomes \"%s\" não é único" + +#: parser/parse_clause.c:873 +#, c-format +msgid "only one default namespace is allowed" +msgstr "" + +#: parser/parse_clause.c:933 +#, c-format +msgid "tablesample method %s does not exist" +msgstr "o método tablesample %s não existe" + +#: parser/parse_clause.c:955 +#, c-format +msgid "tablesample method %s requires %d argument, not %d" +msgid_plural "tablesample method %s requires %d arguments, not %d" +msgstr[0] "o método tablesample %s requer %d argumento, e não %d" +msgstr[1] "o método tablesample %s requer %d argumentos, e não %d" + +#: parser/parse_clause.c:989 +#, c-format +msgid "tablesample method %s does not support REPEATABLE" +msgstr "O método tablesample %s não dá suporte a REPEATABLE" + +#: parser/parse_clause.c:1138 +#, c-format +msgid "TABLESAMPLE clause can only be applied to tables and materialized views" +msgstr "" + +#: parser/parse_clause.c:1325 +#, c-format +msgid "column name \"%s\" appears more than once in USING clause" +msgstr "nome da coluna \"%s\" aparece mais de uma vez na cláusula USING" + +#: parser/parse_clause.c:1340 +#, c-format +msgid "common column name \"%s\" appears more than once in left table" +msgstr "nome de coluna comum \"%s\" aparece mais de uma vez na tabela à esquerda" + +#: parser/parse_clause.c:1349 +#, c-format +msgid "column \"%s\" specified in USING clause does not exist in left table" +msgstr "coluna \"%s\" especificada na cláusula USING não existe na tabela à esquerda" + +#: parser/parse_clause.c:1364 +#, c-format +msgid "common column name \"%s\" appears more than once in right table" +msgstr "nome de coluna comum \"%s\" aparece mais de uma vez na tabela à direita" + +#: parser/parse_clause.c:1373 +#, c-format +msgid "column \"%s\" specified in USING clause does not exist in right table" +msgstr "coluna \"%s\" especificada na cláusula USING não existe na tabela à direita" + +#: parser/parse_clause.c:1901 +#, c-format +msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" +msgstr "" + +#. translator: %s is name of a SQL construct, eg LIMIT +#: parser/parse_clause.c:1926 +#, c-format +msgid "argument of %s must not contain variables" +msgstr "argumento do %s não deve conter variáveis" + +#. translator: first %s is name of a SQL construct, eg ORDER BY +#: parser/parse_clause.c:2091 +#, c-format +msgid "%s \"%s\" is ambiguous" +msgstr "%s \"%s\" é ambíguo" + +#. translator: %s is name of a SQL construct, eg ORDER BY +#: parser/parse_clause.c:2119 +#, c-format +msgid "non-integer constant in %s" +msgstr "constante não-inteira em %s" + +#. translator: %s is name of a SQL construct, eg ORDER BY +#: parser/parse_clause.c:2141 +#, c-format +msgid "%s position %d is not in select list" +msgstr "posição %2$d do %1$s não está na lista de seleção" + +#: parser/parse_clause.c:2580 +#, c-format +msgid "CUBE is limited to 12 elements" +msgstr "" + +#: parser/parse_clause.c:2786 +#, c-format +msgid "window \"%s\" is already defined" +msgstr "deslizante \"%s\" já está definido" + +#: parser/parse_clause.c:2847 +#, c-format +msgid "cannot override PARTITION BY clause of window \"%s\"" +msgstr "não é possível mudar a cláusula PARTITION BY da janela \"%s\"" + +#: parser/parse_clause.c:2859 +#, c-format +msgid "cannot override ORDER BY clause of window \"%s\"" +msgstr "não é possível mudar a cláusula ORDER BY da janela \"%s\"" + +#: parser/parse_clause.c:2889 parser/parse_clause.c:2895 +#, c-format +msgid "cannot copy window \"%s\" because it has a frame clause" +msgstr "não é possível copiar a janela \"%s\", porque tem uma cláusula frame" + +#: parser/parse_clause.c:2897 +#, c-format +msgid "Omit the parentheses in this OVER clause." +msgstr "Omita os parênteses nesta cláusula OVER." + +#: parser/parse_clause.c:2917 +#, c-format +msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" +msgstr "" + +#: parser/parse_clause.c:2940 +#, c-format +msgid "GROUPS mode requires an ORDER BY clause" +msgstr "o modo GROUPS requer uma cláusula ORDER BY" + +#: parser/parse_clause.c:3011 +#, c-format +msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" +msgstr "em uma agregação com DISTINCT, expressões ORDER BY devem aparecer na lista de argumentos" + +#: parser/parse_clause.c:3012 +#, c-format +msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" +msgstr "para SELECT DISTINCT, expressões ORDER BY devem aparecer na lista de seleção" + +#: parser/parse_clause.c:3044 +#, c-format +msgid "an aggregate with DISTINCT must have at least one argument" +msgstr "uma agregação com DISTINCT deve ter pelo menos um argumento" + +#: parser/parse_clause.c:3045 +#, c-format +msgid "SELECT DISTINCT must have at least one column" +msgstr "SELECT DISTINCT deve ter pelo menos uma coluna" + +#: parser/parse_clause.c:3111 parser/parse_clause.c:3143 +#, c-format +msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" +msgstr "expressões SELECT DISTINCT ON devem corresponder com expressões iniciais do ORDER BY" + +#: parser/parse_clause.c:3221 +#, c-format +msgid "ASC/DESC is not allowed in ON CONFLICT clause" +msgstr "não é permitido ASC/DESC na cláusula ON CONFLICT" + +#: parser/parse_clause.c:3227 +#, c-format +msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" +msgstr "não é permitido NULLS FIRST/LAST na cláusula ON CONFLICT" + +#: parser/parse_clause.c:3306 +#, c-format +msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" +msgstr "" + +#: parser/parse_clause.c:3307 +#, c-format +msgid "For example, ON CONFLICT (column_name)." +msgstr "" + +#: parser/parse_clause.c:3318 +#, c-format +msgid "ON CONFLICT is not supported with system catalog tables" +msgstr "ON CONFLICT não tem suporte com tabelas do catálogo do sistema" + +#: parser/parse_clause.c:3326 +#, c-format +msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" +msgstr "ON CONFLICT não tem suporte na tabela \"%s\" usada como tabela de catálogo" + +#: parser/parse_clause.c:3457 +#, c-format +msgid "operator %s is not a valid ordering operator" +msgstr "operador %s não é um operador de ordenação válido" + +#: parser/parse_clause.c:3459 +#, c-format +msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." +msgstr "Operadores de ordenação devem ser membros \"<\" ou \">\" das famílias de operador de árvore-B." + +#: parser/parse_clause.c:3770 +#, c-format +msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" +msgstr "" + +#: parser/parse_clause.c:3776 +#, c-format +msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" +msgstr "" + +#: parser/parse_clause.c:3779 +#, c-format +msgid "Cast the offset value to an appropriate type." +msgstr "" + +#: parser/parse_clause.c:3784 +#, c-format +msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" +msgstr "" + +#: parser/parse_clause.c:3787 +#, c-format +msgid "Cast the offset value to the exact intended type." +msgstr "" + +#: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 +#: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 +#: parser/parse_expr.c:2083 parser/parse_expr.c:2691 parser/parse_expr.c:3497 +#: parser/parse_target.c:985 +#, c-format +msgid "cannot cast type %s to %s" +msgstr "não é possível converter o tipo de dados %s para %s" + +#: parser/parse_coerce.c:1091 +#, c-format +msgid "Input has too few columns." +msgstr "Entrada tem poucas colunas." + +#: parser/parse_coerce.c:1109 +#, c-format +msgid "Cannot cast type %s to %s in column %d." +msgstr "Não é possível converter o tipo de dados %s para %s na coluna %d." + +#: parser/parse_coerce.c:1124 +#, c-format +msgid "Input has too many columns." +msgstr "Entrada tem muitas colunas." + +#. translator: first %s is name of a SQL construct, eg WHERE +#. translator: first %s is name of a SQL construct, eg LIMIT +#: parser/parse_coerce.c:1179 parser/parse_coerce.c:1227 +#, c-format +msgid "argument of %s must be type %s, not type %s" +msgstr "argumento do %s deve ser do tipo %s, e não do tipo %s" + +#. translator: %s is name of a SQL construct, eg WHERE +#. translator: %s is name of a SQL construct, eg LIMIT +#: parser/parse_coerce.c:1190 parser/parse_coerce.c:1239 +#, c-format +msgid "argument of %s must not return a set" +msgstr "argumento do %s não deve retornar um conjunto" + +#. translator: first %s is name of a SQL construct, eg CASE +#: parser/parse_coerce.c:1383 +#, c-format +msgid "%s types %s and %s cannot be matched" +msgstr "tipos no %s %s e %s não podem corresponder" + +#: parser/parse_coerce.c:1499 +#, c-format +msgid "argument types %s and %s cannot be matched" +msgstr "os tipos de dados de argumento %s e %s não podem ser correspondidos" + +#. translator: first %s is name of a SQL construct, eg CASE +#: parser/parse_coerce.c:1551 +#, c-format +msgid "%s could not convert type %s to %s" +msgstr "%s não foi possível converter %s para %s" + +#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 +#: parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 +#: parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 +#, c-format +msgid "arguments declared \"%s\" are not all alike" +msgstr "os argumentos declarados \"%s\" não são todos iguais" + +#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 +#: utils/fmgr/funcapi.c:592 +#, c-format +msgid "argument declared %s is not an array but type %s" +msgstr "o argumento declarado %s não é uma matriz, mas do tipo de dados %s" + +#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 +#: utils/fmgr/funcapi.c:606 +#, c-format +msgid "argument declared %s is not a range type but type %s" +msgstr "o argumento declarado %s não é do tipo de dados range, mas sim do tipo de dados %s" + +#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 +#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:624 utils/fmgr/funcapi.c:689 +#, c-format +msgid "argument declared %s is not a multirange type but type %s" +msgstr "o argumento declarado %s não é do tipo de dados multirange, mas sim do tipo de dados %s" + +#: parser/parse_coerce.c:2353 +#, c-format +msgid "cannot determine element type of \"anyarray\" argument" +msgstr "não é possível determinar o tipo de dados do elemento do argumento \"anyarray\"" + +#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 +#: parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 +#, c-format +msgid "argument declared %s is not consistent with argument declared %s" +msgstr "o argumento declarado %s não é consistente com o argumento declarado %s" + +#: parser/parse_coerce.c:2474 +#, c-format +msgid "could not determine polymorphic type because input has type %s" +msgstr "não foi possível determinar o tipo de dados polimórfico, porque a entrada tem o tipo de dados %s" + +#: parser/parse_coerce.c:2488 +#, c-format +msgid "type matched to anynonarray is an array type: %s" +msgstr "tipo que corresponde a anynonarray é um tipo array: %s" + +#: parser/parse_coerce.c:2498 +#, c-format +msgid "type matched to anyenum is not an enum type: %s" +msgstr "tipo que corresponde a anyenum não é um tipo enum: %s" + +#: parser/parse_coerce.c:2559 +#, c-format +msgid "arguments of anycompatible family cannot be cast to a common type" +msgstr "" + +#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 +#: parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 +#: parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 +#, c-format +msgid "could not determine polymorphic type %s because input has type %s" +msgstr "não foi possível determinar o tipo de dados polimórfico %s, porque a entrada tem o tipo de dados %s" + +#: parser/parse_coerce.c:2587 +#, c-format +msgid "anycompatiblerange type %s does not match anycompatible type %s" +msgstr "o tipo de dados anycompatiblerange %s não corresponde a nenhum tipo de dados anycompatible %s" + +#: parser/parse_coerce.c:2608 +#, c-format +msgid "anycompatiblemultirange type %s does not match anycompatible type %s" +msgstr "o tipo de dados anycompatiblemultirange %s não corresponde a nenhum tipo de dados anycompatible %s" + +#: parser/parse_coerce.c:2622 +#, c-format +msgid "type matched to anycompatiblenonarray is an array type: %s" +msgstr "o tipo correspondido com anycompatiblenonarray é um tipo de dados de matriz: %s" + +#: parser/parse_coerce.c:2857 +#, c-format +msgid "A result of type %s requires at least one input of type anyrange or anymultirange." +msgstr "" + +#: parser/parse_coerce.c:2874 +#, c-format +msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." +msgstr "" + +#: parser/parse_coerce.c:2886 +#, c-format +msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." +msgstr "" + +#: parser/parse_coerce.c:2898 +#, c-format +msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." +msgstr "" + +#: parser/parse_coerce.c:2928 +msgid "A result of type internal requires at least one input of type internal." +msgstr "" + +#: parser/parse_collate.c:228 parser/parse_collate.c:475 +#: parser/parse_collate.c:1005 +#, c-format +msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" +msgstr "imcompatibilidade de ordenação entre ordenações implícitas \"%s\" e \"%s\"" + +#: parser/parse_collate.c:231 parser/parse_collate.c:478 +#: parser/parse_collate.c:1008 +#, c-format +msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." +msgstr "Você pode escolher uma ordenação aplicando a cláusula COLLATE em uma ou nas duas expressões." + +#: parser/parse_collate.c:855 +#, c-format +msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" +msgstr "incompatibilidade de ordenação entre ordenações explícitas \"%s\" e \"%s\"" + +#: parser/parse_cte.c:46 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within its non-recursive term" +msgstr "referência recursiva para consulta \"%s\" não deve aparecer no seu termo não recursivo" + +#: parser/parse_cte.c:48 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within a subquery" +msgstr "referência recursiva para consulta \"%s\" não deve aparecer em uma subconsulta" + +#: parser/parse_cte.c:50 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within an outer join" +msgstr "referência recursiva para consulta \"%s\" não deve aparecer em uma junção externa" + +#: parser/parse_cte.c:52 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within INTERSECT" +msgstr "referência recursiva para consulta \"%s\" não deve aparecer em um INTERSECT" + +#: parser/parse_cte.c:54 +#, c-format +msgid "recursive reference to query \"%s\" must not appear within EXCEPT" +msgstr "referência recursiva para consulta \"%s\" não deve aparecer em um EXCEPT" + +#: parser/parse_cte.c:133 +#, c-format +msgid "MERGE not supported in WITH query" +msgstr "MERGE não tem suporte na consulta WITH" + +#: parser/parse_cte.c:143 +#, c-format +msgid "WITH query name \"%s\" specified more than once" +msgstr "nome da consulta WITH \"%s\" foi especificado mais de uma vez" + +#: parser/parse_cte.c:314 +#, c-format +msgid "could not identify an inequality operator for type %s" +msgstr "não foi possível identificar um operador de desigualdade para o tipo de dados %s" + +#: parser/parse_cte.c:341 +#, c-format +msgid "WITH clause containing a data-modifying statement must be at the top level" +msgstr "cláusula WITH contendo um comando que modifica dados deve estar no nível superior" + +#: parser/parse_cte.c:390 +#, c-format +msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" +msgstr "coluna %2$d da consulta recursiva \"%1$s\" tem tipo %3$s no termo não recursivo mas o tipo %4$s no restante" + +#: parser/parse_cte.c:396 +#, c-format +msgid "Cast the output of the non-recursive term to the correct type." +msgstr "Converta a saída do termo não recursivo para o tipo correto." + +#: parser/parse_cte.c:401 +#, c-format +msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" +msgstr "coluna %2$d da consulta recursiva \"%1$s\" tem ordenação %3$s no termo não recursivo mas a ordenação %4$s no restante" + +#: parser/parse_cte.c:405 +#, c-format +msgid "Use the COLLATE clause to set the collation of the non-recursive term." +msgstr "Use a cláusula COLLATE para definir a ordenação do termo não recursivo." + +#: parser/parse_cte.c:426 +#, c-format +msgid "WITH query is not recursive" +msgstr "a consulta WITH não é recursiva" + +#: parser/parse_cte.c:457 +#, c-format +msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" +msgstr "" + +#: parser/parse_cte.c:462 +#, c-format +msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" +msgstr "" + +#: parser/parse_cte.c:477 +#, c-format +msgid "search column \"%s\" not in WITH query column list" +msgstr "" + +#: parser/parse_cte.c:484 +#, c-format +msgid "search column \"%s\" specified more than once" +msgstr "coluna de procura \"%s\" especificada mais de uma vez" + +#: parser/parse_cte.c:493 +#, c-format +msgid "search sequence column name \"%s\" already used in WITH query column list" +msgstr "" + +#: parser/parse_cte.c:510 +#, c-format +msgid "cycle column \"%s\" not in WITH query column list" +msgstr "a coluna de ciclo \"%s\" não está na lista de colunas de consulta WITH" + +#: parser/parse_cte.c:517 +#, c-format +msgid "cycle column \"%s\" specified more than once" +msgstr "coluna de ciclo \"%s\" especificada mais de uma vez" + +#: parser/parse_cte.c:526 +#, c-format +msgid "cycle mark column name \"%s\" already used in WITH query column list" +msgstr "" + +#: parser/parse_cte.c:533 +#, c-format +msgid "cycle path column name \"%s\" already used in WITH query column list" +msgstr "" + +#: parser/parse_cte.c:541 +#, c-format +msgid "cycle mark column name and cycle path column name are the same" +msgstr "" + +#: parser/parse_cte.c:551 +#, c-format +msgid "search sequence column name and cycle mark column name are the same" +msgstr "" + +#: parser/parse_cte.c:558 +#, c-format +msgid "search sequence column name and cycle path column name are the same" +msgstr "" + +#: parser/parse_cte.c:642 +#, c-format +msgid "WITH query \"%s\" has %d columns available but %d columns specified" +msgstr "consulta WITH \"%s\" tem %d colunas disponíveis mas %d colunas foram especificadas" + +#: parser/parse_cte.c:822 +#, c-format +msgid "mutual recursion between WITH items is not implemented" +msgstr "recursão mútua entre itens WITH não está implementada" + +#: parser/parse_cte.c:874 +#, c-format +msgid "recursive query \"%s\" must not contain data-modifying statements" +msgstr "consulta recursiva \"%s\" não deve conter comandos que modificam dados" + +#: parser/parse_cte.c:882 +#, c-format +msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" +msgstr "consulta recursiva \"%s\" não tem a forma termo-não-recursivo UNION [ALL] termo-recursivo" + +#: parser/parse_cte.c:926 +#, c-format +msgid "ORDER BY in a recursive query is not implemented" +msgstr "ORDER BY em uma consulta recursiva não está implementado" + +#: parser/parse_cte.c:932 +#, c-format +msgid "OFFSET in a recursive query is not implemented" +msgstr "OFFSET em uma consulta recursiva não está implementado" + +#: parser/parse_cte.c:938 +#, c-format +msgid "LIMIT in a recursive query is not implemented" +msgstr "LIMIT em uma consulta recursiva não está implementado" + +#: parser/parse_cte.c:944 +#, c-format +msgid "FOR UPDATE/SHARE in a recursive query is not implemented" +msgstr "FOR UPDATE/SHARE em uma consulta recursiva não está implementado" + +#: parser/parse_cte.c:1001 +#, c-format +msgid "recursive reference to query \"%s\" must not appear more than once" +msgstr "referência recursiva para consulta \"%s\" não deve aparecer mais de uma vez" + +#: parser/parse_expr.c:294 +#, c-format +msgid "DEFAULT is not allowed in this context" +msgstr "DEFAULT não é permitido nesse contexto" + +#: parser/parse_expr.c:371 parser/parse_relation.c:3688 +#: parser/parse_relation.c:3698 parser/parse_relation.c:3716 +#: parser/parse_relation.c:3723 parser/parse_relation.c:3737 +#, c-format +msgid "column %s.%s does not exist" +msgstr "coluna %s.%s não existe" + +#: parser/parse_expr.c:383 +#, c-format +msgid "column \"%s\" not found in data type %s" +msgstr "coluna \"%s\" não encontrada no tipo de dados %s" + +#: parser/parse_expr.c:389 +#, c-format +msgid "could not identify column \"%s\" in record data type" +msgstr "não foi possível identificar a coluna \"%s\" no tipo de dados record" + +#: parser/parse_expr.c:395 +#, c-format +msgid "column notation .%s applied to type %s, which is not a composite type" +msgstr "notação de coluna .%s aplicada ao tipo %s, que não é um tipo composto" + +#: parser/parse_expr.c:426 parser/parse_target.c:733 +#, c-format +msgid "row expansion via \"*\" is not supported here" +msgstr "expansão de linha usando \"*\" não tem suporte aqui" + +#: parser/parse_expr.c:548 +msgid "cannot use column reference in DEFAULT expression" +msgstr "não é possível usar referência de coluna na expressão DEFAULT" + +#: parser/parse_expr.c:551 +msgid "cannot use column reference in partition bound expression" +msgstr "não é possível usar referência de coluna em expressão de limite de partição" + +#: parser/parse_expr.c:810 parser/parse_relation.c:833 +#: parser/parse_relation.c:915 parser/parse_target.c:1225 +#, c-format +msgid "column reference \"%s\" is ambiguous" +msgstr "referência à coluna \"%s\" é ambígua" + +#: parser/parse_expr.c:866 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_param.c:204 parser/parse_param.c:303 +#, c-format +msgid "there is no parameter $%d" +msgstr "não há parâmetro $%d" + +#: parser/parse_expr.c:1066 +#, c-format +msgid "NULLIF requires = operator to yield boolean" +msgstr "NULLIF requer que operador = retorne booleano" + +#. translator: %s is name of a SQL construct, eg NULLIF +#: parser/parse_expr.c:1072 parser/parse_expr.c:3007 +#, c-format +msgid "%s must not return a set" +msgstr "%s não deve retornar um conjunto" + +#: parser/parse_expr.c:1457 parser/parse_expr.c:1489 +#, c-format +msgid "number of columns does not match number of values" +msgstr "número de colunas não corresponde ao número de valores" + +#: parser/parse_expr.c:1503 +#, c-format +msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" +msgstr "" + +#. translator: %s is name of a SQL construct, eg GROUP BY +#: parser/parse_expr.c:1698 parser/parse_expr.c:2180 parser/parse_func.c:2677 +#, c-format +msgid "set-returning functions are not allowed in %s" +msgstr "funções de retorno de conjunto não são permitidas em %s" + +#: parser/parse_expr.c:1761 +msgid "cannot use subquery in check constraint" +msgstr "não é possível utilizar subconsulta na restrição de verificação" + +#: parser/parse_expr.c:1765 +msgid "cannot use subquery in DEFAULT expression" +msgstr "não é possível utilizar subconsulta em expressão DEFAULT" + +#: parser/parse_expr.c:1768 +msgid "cannot use subquery in index expression" +msgstr "não é possível utilizar subconsulta em expressão de índice" + +#: parser/parse_expr.c:1771 +msgid "cannot use subquery in index predicate" +msgstr "não é possível utilizar subconsulta em predicado de índice" + +#: parser/parse_expr.c:1774 +msgid "cannot use subquery in statistics expression" +msgstr "não é possível usar subconsulta na expressão de estatística" + +#: parser/parse_expr.c:1777 +msgid "cannot use subquery in transform expression" +msgstr "não é possível utilizar subconsulta em expressão de transformação" + +#: parser/parse_expr.c:1780 +msgid "cannot use subquery in EXECUTE parameter" +msgstr "não é possível utilizar subconsulta no parâmetro EXECUTE" + +#: parser/parse_expr.c:1783 +msgid "cannot use subquery in trigger WHEN condition" +msgstr "não é possível utilizar subconsulta em condição WHEN de gatilho" + +#: parser/parse_expr.c:1786 +msgid "cannot use subquery in partition bound" +msgstr "não é possível usar subconsulta no limite da partição" + +#: parser/parse_expr.c:1789 +msgid "cannot use subquery in partition key expression" +msgstr "não é possível usar subconsulta na expressão da chave de partição" + +#: parser/parse_expr.c:1792 +msgid "cannot use subquery in CALL argument" +msgstr "não é possível usar subconsulta no argumento do CALL" + +#: parser/parse_expr.c:1795 +msgid "cannot use subquery in COPY FROM WHERE condition" +msgstr "não é possível usar subconsulta na condição COPY FROM WHERE" + +#: parser/parse_expr.c:1798 +msgid "cannot use subquery in column generation expression" +msgstr "não é possível usar subconsulta na expressão de geração de coluna" + +#: parser/parse_expr.c:1851 parser/parse_expr.c:3628 +#, c-format +msgid "subquery must return only one column" +msgstr "subconsulta deve retornar somente uma coluna" + +#: parser/parse_expr.c:1922 +#, c-format +msgid "subquery has too many columns" +msgstr "subconsulta tem muitas colunas" + +#: parser/parse_expr.c:1927 +#, c-format +msgid "subquery has too few columns" +msgstr "subconsulta tem poucas colunas" + +#: parser/parse_expr.c:2023 +#, c-format +msgid "cannot determine type of empty array" +msgstr "não é possível determinar o tipo de dados de matriz vazia" + +#: parser/parse_expr.c:2024 +#, c-format +msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." +msgstr "Converta explicitamente para o tipo desejado, por exemplo ARRAY[]::integer[]." + +#: parser/parse_expr.c:2038 +#, c-format +msgid "could not find element type for data type %s" +msgstr "não foi possível encontrar tipo de dados de elemento para o tipo de dados %s" + +#: parser/parse_expr.c:2121 +#, c-format +msgid "ROW expressions can have at most %d entries" +msgstr "expressões ROW podem ter no máximo %d entradas" + +#: parser/parse_expr.c:2326 +#, c-format +msgid "unnamed XML attribute value must be a column reference" +msgstr "valor do atributo XML sem nome deve ser uma referência a coluna" + +#: parser/parse_expr.c:2327 +#, c-format +msgid "unnamed XML element value must be a column reference" +msgstr "valor do elemento XML sem nome deve ser uma referência a coluna" + +#: parser/parse_expr.c:2342 +#, c-format +msgid "XML attribute name \"%s\" appears more than once" +msgstr "nome de atributo XML \"%s\" aparece mais do que uma vez" + +#: parser/parse_expr.c:2450 +#, c-format +msgid "cannot cast XMLSERIALIZE result to %s" +msgstr "não é possível converter o resultado de XMLSERIALIZE para %s" + +#: parser/parse_expr.c:2764 parser/parse_expr.c:2960 +#, c-format +msgid "unequal number of entries in row expressions" +msgstr "número desigual de entradas em expressões de linha" + +#: parser/parse_expr.c:2774 +#, c-format +msgid "cannot compare rows of zero length" +msgstr "não é possível comparar linhas de tamanho zero" + +#: parser/parse_expr.c:2799 +#, c-format +msgid "row comparison operator must yield type boolean, not type %s" +msgstr "operador de comparação de linha deve retornar o tipo de dados boolean, e não tipo de dados %s" + +#: parser/parse_expr.c:2806 +#, c-format +msgid "row comparison operator must not return a set" +msgstr "operador de comparação de linha não deve retornar conjunto" + +#: parser/parse_expr.c:2865 parser/parse_expr.c:2906 +#, c-format +msgid "could not determine interpretation of row comparison operator %s" +msgstr "não foi possível determinar a interpretação do operador de comparação de linha %s" + +#: parser/parse_expr.c:2867 +#, c-format +msgid "Row comparison operators must be associated with btree operator families." +msgstr "Operadores de comparação de linha devem ser associados com famílias de operador de árvore-B." + +#: parser/parse_expr.c:2908 +#, c-format +msgid "There are multiple equally-plausible candidates." +msgstr "Há múltiplos candidatos igualmente plausíveis." + +#: parser/parse_expr.c:3001 +#, c-format +msgid "IS DISTINCT FROM requires = operator to yield boolean" +msgstr "IS DISTINCT FROM requer que operador = retorne booleano" + +#: parser/parse_expr.c:3239 +#, c-format +msgid "JSON ENCODING clause is only allowed for bytea input type" +msgstr "" + +#: parser/parse_expr.c:3261 +#, c-format +msgid "cannot use non-string types with implicit FORMAT JSON clause" +msgstr "" + +#: parser/parse_expr.c:3262 +#, c-format +msgid "cannot use non-string types with explicit FORMAT JSON clause" +msgstr "" + +#: parser/parse_expr.c:3335 +#, c-format +msgid "cannot use JSON format with non-string output types" +msgstr "" + +#: parser/parse_expr.c:3348 +#, c-format +msgid "cannot set JSON encoding for non-bytea output types" +msgstr "" + +#: parser/parse_expr.c:3353 +#, c-format +msgid "unsupported JSON encoding" +msgstr "codificação JSON sem suporte" + +#: parser/parse_expr.c:3354 +#, c-format +msgid "Only UTF8 JSON encoding is supported." +msgstr "" + +#: parser/parse_expr.c:3391 +#, c-format +msgid "returning SETOF types is not supported in SQL/JSON functions" +msgstr "o retorno de tipos de dados SETOF não tem suporte em funções SQL/JSON" + +#: parser/parse_expr.c:3712 parser/parse_func.c:865 +#, c-format +msgid "aggregate ORDER BY is not implemented for window functions" +msgstr "agregação ORDER BY não está implementado para funções deslizantes" + +#: parser/parse_expr.c:3934 +#, c-format +msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" +msgstr "" + +#: parser/parse_expr.c:3954 +#, c-format +msgid "cannot use type %s in IS JSON predicate" +msgstr "não é possível usar o tipo de dados %s no predicado IS JSON" + +#: parser/parse_func.c:194 +#, c-format +msgid "argument name \"%s\" used more than once" +msgstr "nome de argumento \"%s\" utilizado mais de uma vez" + +#: parser/parse_func.c:205 +#, c-format +msgid "positional argument cannot follow named argument" +msgstr "argumento posicional não pode seguir um argumento com nome" + +#: parser/parse_func.c:287 parser/parse_func.c:2367 +#, c-format +msgid "%s is not a procedure" +msgstr "%s não é um procedimento" + +#: parser/parse_func.c:291 +#, c-format +msgid "To call a function, use SELECT." +msgstr "" + +#: parser/parse_func.c:297 +#, c-format +msgid "%s is a procedure" +msgstr "%s é um procedimento" + +#: parser/parse_func.c:301 +#, c-format +msgid "To call a procedure, use CALL." +msgstr "" + +#: parser/parse_func.c:315 +#, c-format +msgid "%s(*) specified, but %s is not an aggregate function" +msgstr "%s(*) especificado, mas %s não é uma função de agregação" + +#: parser/parse_func.c:322 +#, c-format +msgid "DISTINCT specified, but %s is not an aggregate function" +msgstr "DISTINCT especificado, mas %s não é uma função de agregação" + +#: parser/parse_func.c:328 +#, c-format +msgid "WITHIN GROUP specified, but %s is not an aggregate function" +msgstr "WITHIN GROUP especificado, mas %s não é uma função de agregação" + +#: parser/parse_func.c:334 +#, c-format +msgid "ORDER BY specified, but %s is not an aggregate function" +msgstr "ORDER BY especificado, mas %s não é uma função de agregação" + +#: parser/parse_func.c:340 +#, c-format +msgid "FILTER specified, but %s is not an aggregate function" +msgstr "FILTER especificado, mas %s não é uma função de agregação" + +#: parser/parse_func.c:346 +#, c-format +msgid "OVER specified, but %s is not a window function nor an aggregate function" +msgstr "OVER especificado, mas %s não é uma função deslizante ou função de agregação" + +#: parser/parse_func.c:384 +#, c-format +msgid "WITHIN GROUP is required for ordered-set aggregate %s" +msgstr "WITHIN GROUP é requerido por agregação de conjunto ordenado %s" + +#: parser/parse_func.c:390 +#, c-format +msgid "OVER is not supported for ordered-set aggregate %s" +msgstr "OVER não é suportado por agregação de conjunto ordenado %s" + +#: parser/parse_func.c:421 parser/parse_func.c:452 #, c-format -msgid "%s is not allowed with window functions" -msgstr "%s não é permitido com funções deslizantes" +msgid "There is an ordered-set aggregate %s, but it requires %d direct argument, not %d." +msgid_plural "There is an ordered-set aggregate %s, but it requires %d direct arguments, not %d." +msgstr[0] "Existe uma agregação de conjunto ordenado %s, mas requer %d argumento direto, e não %d." +msgstr[1] "Existe uma agregação de conjunto ordenado %s, mas requer %d argumentos diretos, e não %d." -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2329 +#: parser/parse_func.c:479 #, c-format -msgid "%s is not allowed with set-returning functions in the target list" -msgstr "%s não é permitido em funções que retornam conjunto na lista de alvos" +msgid "To use the hypothetical-set aggregate %s, the number of hypothetical direct arguments (here %d) must match the number of ordering columns (here %d)." +msgstr "Para utilizar uma agregação de conjunto hipotético %s, o número de argumentos diretos hipotéticos (aqui %d) deve corresponder ao número de colunas de ordenação (aqui %d)." -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2408 +#: parser/parse_func.c:493 #, c-format -msgid "%s must specify unqualified relation names" -msgstr "%s deve especificar nomes de relação não qualificados" +msgid "There is an ordered-set aggregate %s, but it requires at least %d direct argument." +msgid_plural "There is an ordered-set aggregate %s, but it requires at least %d direct arguments." +msgstr[0] "Existe uma agregação de conjunto ordenado %s, mas requer pelo menos %d argumento direto." +msgstr[1] "Existe uma agregação de conjunto ordenado %s, mas requer pelo menos %d argumentos diretos." -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2441 +#: parser/parse_func.c:514 #, c-format -msgid "%s cannot be applied to a join" -msgstr "%s não pode ser aplicado em uma junção" +msgid "%s is not an ordered-set aggregate, so it cannot have WITHIN GROUP" +msgstr "%s não é uma agregação de conjunto ordenado, portanto, não pode ter WITHIN GROUP" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2450 +#: parser/parse_func.c:527 #, c-format -msgid "%s cannot be applied to a function" -msgstr "%s não pode ser aplicado a uma função" +msgid "window function %s requires an OVER clause" +msgstr "função deslizante %s requer uma cláusula OVER" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2468 +#: parser/parse_func.c:534 #, c-format -msgid "%s cannot be applied to a WITH query" -msgstr "%s não pode ser aplicado em uma consulta WITH" +msgid "window function %s cannot have WITHIN GROUP" +msgstr "função deslizante %s não pode ter WITHIN GROUP" -#. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2485 +#: parser/parse_func.c:563 #, c-format -msgid "relation \"%s\" in %s clause not found in FROM clause" -msgstr "relação \"%s\" na cláusula %s não foi encontrada na cláusula FROM" +msgid "procedure %s is not unique" +msgstr "o procedimento %s não é único" -#: parser/parse_agg.c:201 parser/parse_oper.c:219 +#: parser/parse_func.c:566 #, c-format -msgid "could not identify an ordering operator for type %s" -msgstr "não pôde identificar um operador de ordenação para tipo %s" +msgid "Could not choose a best candidate procedure. You might need to add explicit type casts." +msgstr "Não foi possível escolher o melhor procedimento candidato. Talvez seja necessário adicionar conversões de tipo explícitas." -#: parser/parse_agg.c:203 +#: parser/parse_func.c:572 #, c-format -msgid "Aggregates with DISTINCT must be able to sort their inputs." -msgstr "Agregações com DISTINCT devem ser capazes de ordenar suas entradas." +msgid "function %s is not unique" +msgstr "a função %s não é única" -#: parser/parse_agg.c:254 -msgid "aggregate functions are not allowed in JOIN conditions" -msgstr "funções de agregação não são permitidas nas condições JOIN" +#: parser/parse_func.c:575 +#, c-format +msgid "Could not choose a best candidate function. You might need to add explicit type casts." +msgstr "Não foi possível escolher uma função que se enquadre melhor. Você precisa adicionar conversões de tipo explícitas." -#: parser/parse_agg.c:260 -msgid "aggregate functions are not allowed in FROM clause of their own query level" -msgstr "funções de agregação não são permitidas na cláusula FROM de seu próprio nível de consulta" +#: parser/parse_func.c:614 +#, c-format +msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." +msgstr "Nenhuma função de agregação corresponde com o nome e os tipos de argumentos informados. Talvez você colocou ORDER BY no lugar errado; ORDER BY deve aparecer depois de todos os argumentos regulares da agregação." -#: parser/parse_agg.c:263 -msgid "aggregate functions are not allowed in functions in FROM" -msgstr "funções de agregação não são permitidas em funções no FROM" +#: parser/parse_func.c:622 parser/parse_func.c:2410 +#, c-format +msgid "procedure %s does not exist" +msgstr "o procedimento %s não existe" -#: parser/parse_agg.c:281 -msgid "aggregate functions are not allowed in window RANGE" -msgstr "funções de agregação não são permitidas no deslizante RANGE" +#: parser/parse_func.c:625 +#, c-format +msgid "No procedure matches the given name and argument types. You might need to add explicit type casts." +msgstr "Nenhum procedimento corresponde ao nome e aos tipos de argumento fornecidos. Talvez seja necessário adicionar conversões de tipo explícitas." -#: parser/parse_agg.c:284 -msgid "aggregate functions are not allowed in window ROWS" -msgstr "funções de agregação não são permitidas no deslizante ROWS" +#: parser/parse_func.c:634 +#, c-format +msgid "No function matches the given name and argument types. You might need to add explicit type casts." +msgstr "Nenhuma função corresponde com o nome e os tipos de argumentos informados. Você precisa adicionar conversões de tipo explícitas." -#: parser/parse_agg.c:315 -msgid "aggregate functions are not allowed in check constraints" -msgstr "funções de agregação não são permitidas em restrições de verificação" +#: parser/parse_func.c:736 +#, c-format +msgid "VARIADIC argument must be an array" +msgstr "parâmetro VARIADIC deve ser uma matriz" -#: parser/parse_agg.c:319 -msgid "aggregate functions are not allowed in DEFAULT expressions" -msgstr "funções de agregação não são permitidas em expressões DEFAULT" +#: parser/parse_func.c:791 parser/parse_func.c:855 +#, c-format +msgid "%s(*) must be used to call a parameterless aggregate function" +msgstr "%s(*) deve ser utilizado para chamar uma função de agregação sem parâmetros" -#: parser/parse_agg.c:322 -msgid "aggregate functions are not allowed in index expressions" -msgstr "funções de agregação não são permitidas em expressões de índice" +#: parser/parse_func.c:798 +#, c-format +msgid "aggregates cannot return sets" +msgstr "agregações não podem retornar conjuntos" -#: parser/parse_agg.c:325 -msgid "aggregate functions are not allowed in index predicates" -msgstr "funções de agregação não são permitidas em predicados de índice" +#: parser/parse_func.c:813 +#, c-format +msgid "aggregates cannot use named arguments" +msgstr "agregações não podem utilizar argumentos nomeados" -#: parser/parse_agg.c:328 -msgid "aggregate functions are not allowed in transform expressions" -msgstr "funções de agregação não são permitidas em expressões de transformação" +#: parser/parse_func.c:845 +#, c-format +msgid "DISTINCT is not implemented for window functions" +msgstr "DISTINCT não está implementado para funções deslizantes" -#: parser/parse_agg.c:331 -msgid "aggregate functions are not allowed in EXECUTE parameters" -msgstr "funções de agregação não são permitidas em parâmetros EXECUTE" +#: parser/parse_func.c:874 +#, c-format +msgid "FILTER is not implemented for non-aggregate window functions" +msgstr "FILTER não está implementado para funções deslizantes que não são agregações" -#: parser/parse_agg.c:334 -msgid "aggregate functions are not allowed in trigger WHEN conditions" -msgstr "funções de agregação não são permitidas em condições WHEN de gatilho" +#: parser/parse_func.c:883 +#, c-format +msgid "window function calls cannot contain set-returning function calls" +msgstr "chamadas de função de janela não podem conter chamadas de função com retorno de conjunto" -#. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:354 parser/parse_clause.c:1407 +#: parser/parse_func.c:891 #, c-format -msgid "aggregate functions are not allowed in %s" -msgstr "funções de agregação não são permitidas em %s" +msgid "window functions cannot return sets" +msgstr "funções deslizantes não podem retornar conjuntos" -#: parser/parse_agg.c:457 +#: parser/parse_func.c:2166 parser/parse_func.c:2439 #, c-format -msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" -msgstr "agregação de nível superior não pode conter uma variável de nível inferior nos seus argumentos diretos" +msgid "could not find a function named \"%s\"" +msgstr "não foi possível encontrar uma função chamada \"%s\"" -#: parser/parse_agg.c:514 +#: parser/parse_func.c:2180 parser/parse_func.c:2457 #, c-format -msgid "aggregate function calls cannot contain window function calls" -msgstr "chamadas de função de agregação não podem conter chamadas de função deslizante" +msgid "function name \"%s\" is not unique" +msgstr "o nome da função \"%s\" não é único" -#: parser/parse_agg.c:591 -msgid "window functions are not allowed in JOIN conditions" -msgstr "funções deslizantes não são permitidas em condições JOIN" +#: parser/parse_func.c:2182 parser/parse_func.c:2460 +#, c-format +msgid "Specify the argument list to select the function unambiguously." +msgstr "" -#: parser/parse_agg.c:598 -msgid "window functions are not allowed in functions in FROM" -msgstr "funções deslizantes não são permitidas em funções no FROM" +#: parser/parse_func.c:2226 +#, c-format +msgid "procedures cannot have more than %d argument" +msgid_plural "procedures cannot have more than %d arguments" +msgstr[0] "procedimentos não podem ter mais que %d argumento" +msgstr[1] "procedimentos não podem ter mais que %d argumentos" -#: parser/parse_agg.c:613 -msgid "window functions are not allowed in window definitions" -msgstr "funções deslizantes não são permitidas em definições de deslizante" +#: parser/parse_func.c:2357 +#, c-format +msgid "%s is not a function" +msgstr "%s não é uma função" -#: parser/parse_agg.c:644 -msgid "window functions are not allowed in check constraints" -msgstr "funções deslizantes não são permitidas em restrições de verificação" +#: parser/parse_func.c:2377 +#, c-format +msgid "function %s is not an aggregate" +msgstr "função %s não é uma agregação" -#: parser/parse_agg.c:648 -msgid "window functions are not allowed in DEFAULT expressions" -msgstr "funções deslizantes não são permitidas em expressões DEFAULT" +#: parser/parse_func.c:2405 +#, c-format +msgid "could not find a procedure named \"%s\"" +msgstr "não foi possível encontrar um procedimento chamado \"%s\"" -#: parser/parse_agg.c:651 -msgid "window functions are not allowed in index expressions" -msgstr "funções deslizantes não são permitidas em expressões de índice" +#: parser/parse_func.c:2419 +#, c-format +msgid "could not find an aggregate named \"%s\"" +msgstr "não foi possível encontrar uma agregação chamada \"%s\"" -#: parser/parse_agg.c:654 -msgid "window functions are not allowed in index predicates" -msgstr "funções deslizantes não são permitidas em predicados de índice" +#: parser/parse_func.c:2424 +#, c-format +msgid "aggregate %s(*) does not exist" +msgstr "agregação %s(*) não existe" -#: parser/parse_agg.c:657 -msgid "window functions are not allowed in transform expressions" -msgstr "funções deslizantes não são permitidas em expressões de transformação" +#: parser/parse_func.c:2429 +#, c-format +msgid "aggregate %s does not exist" +msgstr "agregação %s não existe" -#: parser/parse_agg.c:660 -msgid "window functions are not allowed in EXECUTE parameters" -msgstr "funções deslizantes não são permitidas em parâmetros EXECUTE" +#: parser/parse_func.c:2465 +#, c-format +msgid "procedure name \"%s\" is not unique" +msgstr "o nome do procedimento \"%s\" não é único" -#: parser/parse_agg.c:663 -msgid "window functions are not allowed in trigger WHEN conditions" -msgstr "funções deslizantes não são permitidas em condições WHEN de gatilho" +#: parser/parse_func.c:2468 +#, c-format +msgid "Specify the argument list to select the procedure unambiguously." +msgstr "" -#. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:683 parser/parse_clause.c:1416 +#: parser/parse_func.c:2473 #, c-format -msgid "window functions are not allowed in %s" -msgstr "funções deslizantes não são permitidas em %s" +msgid "aggregate name \"%s\" is not unique" +msgstr "o nome da agregação \"%s\" não é único" -#: parser/parse_agg.c:717 parser/parse_clause.c:1827 +#: parser/parse_func.c:2476 #, c-format -msgid "window \"%s\" does not exist" -msgstr "deslizante \"%s\" não existe" +msgid "Specify the argument list to select the aggregate unambiguously." +msgstr "" -#: parser/parse_agg.c:879 +#: parser/parse_func.c:2481 #, c-format -msgid "aggregate functions are not allowed in a recursive query's recursive term" -msgstr "funções de agregação não são permitidas em termo recursivo de uma consulta recursiva" +msgid "routine name \"%s\" is not unique" +msgstr "o nome da rotina \"%s\" não é único" -#: parser/parse_agg.c:1057 +#: parser/parse_func.c:2484 #, c-format -msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" -msgstr "coluna \"%s.%s\" deve aparecer na cláusula GROUP BY ou ser utilizada em uma função de agregação" +msgid "Specify the argument list to select the routine unambiguously." +msgstr "" + +#: parser/parse_func.c:2539 +msgid "set-returning functions are not allowed in JOIN conditions" +msgstr "funções de retorno de conjunto não são permitidas em condições JOIN" + +#: parser/parse_func.c:2560 +msgid "set-returning functions are not allowed in policy expressions" +msgstr "funções de retorno de conjunto não são permitidas em expressões de política" + +#: parser/parse_func.c:2576 +msgid "set-returning functions are not allowed in window definitions" +msgstr "funções de retorno de conjunto não são permitidas nas definições de janela" + +#: parser/parse_func.c:2613 +msgid "set-returning functions are not allowed in MERGE WHEN conditions" +msgstr "funções de retorno de conjunto não são permitidas em condições MERGE WHEN" + +#: parser/parse_func.c:2617 +msgid "set-returning functions are not allowed in check constraints" +msgstr "funções de retorno de conjunto não são permitidas em restrições de verificação" + +#: parser/parse_func.c:2621 +msgid "set-returning functions are not allowed in DEFAULT expressions" +msgstr "funções de retorno de conjunto não são permitidas em expressões DEFAULT" + +#: parser/parse_func.c:2624 +msgid "set-returning functions are not allowed in index expressions" +msgstr "funções de retorno de conjunto não são permitidas em expressões de índice" + +#: parser/parse_func.c:2627 +msgid "set-returning functions are not allowed in index predicates" +msgstr "funções de retorno de conjunto não são permitidas em predicados de índice" + +#: parser/parse_func.c:2630 +msgid "set-returning functions are not allowed in statistics expressions" +msgstr "funções de retorno de conjunto não são permitidas em expressões estatísticas" + +#: parser/parse_func.c:2633 +msgid "set-returning functions are not allowed in transform expressions" +msgstr "funções de retorno de conjunto não são permitidas em expressões de transformação" + +#: parser/parse_func.c:2636 +msgid "set-returning functions are not allowed in EXECUTE parameters" +msgstr "funções de retorno de conjunto não são permitidas em parâmetros do EXECUTE" + +#: parser/parse_func.c:2639 +msgid "set-returning functions are not allowed in trigger WHEN conditions" +msgstr "funções de retorno de conjunto não são permitidas em condições de gatilho WHEN" + +#: parser/parse_func.c:2642 +msgid "set-returning functions are not allowed in partition bound" +msgstr "funções de retorno de conjunto não são permitidas em limite da partição" + +#: parser/parse_func.c:2645 +msgid "set-returning functions are not allowed in partition key expressions" +msgstr "funções de retorno de conjunto não são permitidas em expressões de chave de partição" + +#: parser/parse_func.c:2648 +msgid "set-returning functions are not allowed in CALL arguments" +msgstr "funções de retorno de conjunto não são permitidas em argumentos do CALL" + +#: parser/parse_func.c:2651 +msgid "set-returning functions are not allowed in COPY FROM WHERE conditions" +msgstr "funções de retorno de conjunto não são permitidas em condições COPY FROM WHERE" + +#: parser/parse_func.c:2654 +msgid "set-returning functions are not allowed in column generation expressions" +msgstr "funções de retorno de conjunto não são permitidas em expressões de geração de coluna" -#: parser/parse_agg.c:1060 +#: parser/parse_merge.c:119 #, c-format -msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." -msgstr "Argumentos diretos de uma agregação de conjunto ordenado devem utilizar somente colunas agrupadas." +msgid "WITH RECURSIVE is not supported for MERGE statement" +msgstr "WITH RECURSIVE não tem suporte com a instrução MERGE" -#: parser/parse_agg.c:1065 +#: parser/parse_merge.c:161 #, c-format -msgid "subquery uses ungrouped column \"%s.%s\" from outer query" -msgstr "subconsulta utiliza coluna desagrupada \"%s.%s\" na consulta externa" +msgid "unreachable WHEN clause specified after unconditional WHEN clause" +msgstr "" -#: parser/parse_clause.c:636 +#: parser/parse_merge.c:191 #, c-format -msgid "multiple column definition lists are not allowed for the same function" -msgstr "listas múltiplas de definição de colunas somente são permitidas para mesma função" +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE não tem suporte para relações com regras." -#: parser/parse_clause.c:669 +#: parser/parse_merge.c:208 #, c-format -msgid "ROWS FROM() with multiple functions cannot have a column definition list" -msgstr "ROWS FROM() com múltiplas funções não pode ter uma lista de definição de colunas" +msgid "name \"%s\" specified more than once" +msgstr "nome \"%s\" especificado mais de uma vez" -#: parser/parse_clause.c:670 +#: parser/parse_merge.c:210 #, c-format -msgid "Put a separate column definition list for each function inside ROWS FROM()." -msgstr "Coloque uma lista separada de definição de colunas para cada função dentro de ROWS FROM()." +msgid "The name is used both as MERGE target table and data source." +msgstr "" -#: parser/parse_clause.c:676 +#: parser/parse_node.c:87 #, c-format -msgid "UNNEST() with multiple arguments cannot have a column definition list" -msgstr "UNNEST() com múltiplos argumentos não pode ter uma lista de definição de colunas" +msgid "target lists can have at most %d entries" +msgstr "listas de alvos podem ter no máximo %d entradas" -#: parser/parse_clause.c:677 +#: parser/parse_oper.c:123 parser/parse_oper.c:690 #, c-format -msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." -msgstr "Utilize chamadas UNNEST() separadas dentro de ROWS FROM(), e anexe uma lista de definição de colunas a cada uma." +msgid "postfix operators are not supported" +msgstr "operadores postfix não têm suporte" -#: parser/parse_clause.c:684 +#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:509 +#: utils/adt/regproc.c:683 #, c-format -msgid "WITH ORDINALITY cannot be used with a column definition list" -msgstr "WITH ORDINALITY não pode ser utilizada com uma lista de definição de colunas" +msgid "operator does not exist: %s" +msgstr "operador não existe: %s" -#: parser/parse_clause.c:685 +#: parser/parse_oper.c:229 #, c-format -msgid "Put the column definition list inside ROWS FROM()." -msgstr "Coloque uma lista de definição de colunas dentro de ROWS FROM()." +msgid "Use an explicit ordering operator or modify the query." +msgstr "Use um operador de ordenação explícito ou modifique a consulta." -#: parser/parse_clause.c:967 +#: parser/parse_oper.c:485 #, c-format -msgid "column name \"%s\" appears more than once in USING clause" -msgstr "nome da coluna \"%s\" aparece mais de uma vez na cláusula USING" +msgid "operator requires run-time type coercion: %s" +msgstr "operador requer conversão de tipo em tempo de execução: %s" -#: parser/parse_clause.c:982 +#: parser/parse_oper.c:641 #, c-format -msgid "common column name \"%s\" appears more than once in left table" -msgstr "nome de coluna comum \"%s\" aparece mais de uma vez na tabela à esquerda" +msgid "operator is not unique: %s" +msgstr "o operador não é único: %s" -#: parser/parse_clause.c:991 +#: parser/parse_oper.c:643 #, c-format -msgid "column \"%s\" specified in USING clause does not exist in left table" -msgstr "coluna \"%s\" especificada na cláusula USING não existe na tabela à esquerda" +msgid "Could not choose a best candidate operator. You might need to add explicit type casts." +msgstr "Não foi possível escolher um operador que se enquadre melhor. Você precisa adicionar conversões de tipo explícitas." -#: parser/parse_clause.c:1005 +#: parser/parse_oper.c:652 #, c-format -msgid "common column name \"%s\" appears more than once in right table" -msgstr "nome de coluna comum \"%s\" aparece mais de uma vez na tabela à direita" +msgid "No operator matches the given name and argument type. You might need to add an explicit type cast." +msgstr "Nenhum operador corresponde ao nome e tipo de dados do argumento fornecido. Talvez seja necessário adicionar uma conversão de tipo de dados explícita." -#: parser/parse_clause.c:1014 +#: parser/parse_oper.c:654 #, c-format -msgid "column \"%s\" specified in USING clause does not exist in right table" -msgstr "coluna \"%s\" especificada na cláusula USING não existe na tabela à direita" +msgid "No operator matches the given name and argument types. You might need to add explicit type casts." +msgstr "Nenhum operador corresponde ao nome e tipo de dados dos argumentos fornecidos. Talvez seja necessário adicionar uma conversão de tipo de dados explícita." -#: parser/parse_clause.c:1068 +#: parser/parse_oper.c:714 parser/parse_oper.c:828 #, c-format -msgid "column alias list for \"%s\" has too many entries" -msgstr "lista de aliases de coluna para \"%s\" tem muitas entradas" +msgid "operator is only a shell: %s" +msgstr "operador é indefinido: %s" -#. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1377 +#: parser/parse_oper.c:816 #, c-format -msgid "argument of %s must not contain variables" -msgstr "argumento do %s não deve conter variáveis" +msgid "op ANY/ALL (array) requires array on right side" +msgstr "op ANY/ALL (array) requer matriz no lado direito" -#. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1542 +#: parser/parse_oper.c:858 #, c-format -msgid "%s \"%s\" is ambiguous" -msgstr "%s \"%s\" é ambíguo" +msgid "op ANY/ALL (array) requires operator to yield boolean" +msgstr "op ANY/ALL (array) requer operador que retorna booleano" -#. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1571 +#: parser/parse_oper.c:863 #, c-format -msgid "non-integer constant in %s" -msgstr "constante não-inteira em %s" +msgid "op ANY/ALL (array) requires operator not to return a set" +msgstr "op ANY/ALL (array) requer operador que não retorne um conjunto" -#. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1593 +#: parser/parse_param.c:221 #, c-format -msgid "%s position %d is not in select list" -msgstr "posição %2$d do %1$s não está na lista de seleção" +msgid "inconsistent types deduced for parameter $%d" +msgstr "tipos inconsitentes deduzidos do parâmetro $%d" -#: parser/parse_clause.c:1815 +#: parser/parse_param.c:309 tcop/postgres.c:740 #, c-format -msgid "window \"%s\" is already defined" -msgstr "deslizante \"%s\" já está definido" +msgid "could not determine data type of parameter $%d" +msgstr "não foi possível determinar o tipo de dados do parâmetro $%d" -#: parser/parse_clause.c:1876 +#: parser/parse_relation.c:221 #, c-format -msgid "cannot override PARTITION BY clause of window \"%s\"" -msgstr "não pode substituir cláusula PARTITION BY do deslizante \"%s\"" +msgid "table reference \"%s\" is ambiguous" +msgstr "referência a tabela \"%s\" é ambígua" + +#: parser/parse_relation.c:265 +#, c-format +msgid "table reference %u is ambiguous" +msgstr "referência a tabela %u é ambígua" + +#: parser/parse_relation.c:465 +#, c-format +msgid "table name \"%s\" specified more than once" +msgstr "nome da tabela \"%s\" foi especificado mais de uma vez" + +#: parser/parse_relation.c:494 parser/parse_relation.c:3630 +#: parser/parse_relation.c:3639 +#, c-format +msgid "invalid reference to FROM-clause entry for table \"%s\"" +msgstr "referência inválida para tabela \"%s\" na cláusula FROM" + +#: parser/parse_relation.c:498 parser/parse_relation.c:3641 +#, c-format +msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." +msgstr "Há uma entrada para tabela \"%s\", mas não pode ser referenciada dessa parte da consulta." + +#: parser/parse_relation.c:500 +#, c-format +msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." +msgstr "O tipo de JOIN deve ser INNER ou LEFT para uma referência LATERAL." + +#: parser/parse_relation.c:703 +#, c-format +msgid "system column \"%s\" reference in check constraint is invalid" +msgstr "coluna do sistema \"%s\" referenciada na restrição de verificação é inválida" + +#: parser/parse_relation.c:712 +#, c-format +msgid "cannot use system column \"%s\" in column generation expression" +msgstr "não é possível usar a coluna do sistema \"%s\" na expressão de geração de coluna" + +#: parser/parse_relation.c:723 +#, c-format +msgid "cannot use system column \"%s\" in MERGE WHEN condition" +msgstr "não é possível usar a coluna do sistema \"%s\" na condição MERGE WHEN" + +#: parser/parse_relation.c:1236 parser/parse_relation.c:1691 +#: parser/parse_relation.c:2388 +#, c-format +msgid "table \"%s\" has %d columns available but %d columns specified" +msgstr "tabela \"%s\" tem %d colunas disponíveis mas %d colunas foram especificadas" -#: parser/parse_clause.c:1888 +#: parser/parse_relation.c:1445 #, c-format -msgid "cannot override ORDER BY clause of window \"%s\"" -msgstr "não pode substituir cláusula ORDER BY do deslizante \"%s\"" +msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." +msgstr "Há um item WITH chamado \"%s\", mas o mesmo não pode ser referenciado dessa parte da consulta." -#: parser/parse_clause.c:1918 parser/parse_clause.c:1924 +#: parser/parse_relation.c:1447 #, c-format -msgid "cannot copy window \"%s\" because it has a frame clause" -msgstr "não pode copiar deslizante \"%s\" porque ele tem uma cláusula frame" +msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." +msgstr "Use WITH RECURSIVE ou reordene os itens WITH para remover referências posteriores." -#: parser/parse_clause.c:1926 +#: parser/parse_relation.c:1834 #, c-format -msgid "Omit the parentheses in this OVER clause." -msgstr "Omita os parênteses nesta cláusula OVER." +msgid "a column definition list is redundant for a function with OUT parameters" +msgstr "uma lista de definição de colunas é redundante para uma função com parâmetros OUT" -#: parser/parse_clause.c:1992 +#: parser/parse_relation.c:1840 #, c-format -msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" -msgstr "em uma agregação com DISTINCT, expressões ORDER BY devem aparecer na lista de argumentos" +msgid "a column definition list is redundant for a function returning a named composite type" +msgstr "uma lista de definição de colunas é redundante para uma função que retorna um tipo de dados composto com nome" -#: parser/parse_clause.c:1993 +#: parser/parse_relation.c:1847 #, c-format -msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" -msgstr "para SELECT DISTINCT, expressões ORDER BY devem aparecer na lista de seleção" +msgid "a column definition list is only allowed for functions returning \"record\"" +msgstr "uma lista de definição de colunas somente é permitida para funções que retornam \"record\"" -#: parser/parse_clause.c:2026 +#: parser/parse_relation.c:1858 #, c-format -msgid "an aggregate with DISTINCT must have at least one argument" -msgstr "uma agregação com DISTINCT deve ter pelo menos um argumento" +msgid "a column definition list is required for functions returning \"record\"" +msgstr "uma lista de definição de colunas é requerida para funções que retornam \"record\"" -#: parser/parse_clause.c:2027 +#: parser/parse_relation.c:1895 #, c-format -msgid "SELECT DISTINCT must have at least one column" -msgstr "SELECT DISTINCT deve ter pelo menos uma coluna" +msgid "column definition lists can have at most %d entries" +msgstr "as listas de definição de colunas podem ter no máximo %d entradas" -#: parser/parse_clause.c:2093 parser/parse_clause.c:2125 +#: parser/parse_relation.c:1955 #, c-format -msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" -msgstr "expressões SELECT DISTINCT ON devem corresponder com expressões iniciais do ORDER BY" +msgid "function \"%s\" in FROM has unsupported return type %s" +msgstr "função \"%s\" no FROM tem tipo de retorno %s que não é suportado" -#: parser/parse_clause.c:2253 +#: parser/parse_relation.c:1982 parser/parse_relation.c:2068 #, c-format -msgid "operator %s is not a valid ordering operator" -msgstr "operador %s não é um operador de ordenação válido" +msgid "functions in FROM can return at most %d columns" +msgstr "as funções no FROM podem retornar no máximo %d colunas" -#: parser/parse_clause.c:2255 +#: parser/parse_relation.c:2098 #, c-format -msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." -msgstr "Operadores de ordenação devem ser membros \"<\" ou \">\" das famílias de operadores de árvore B." +msgid "%s function has %d columns available but %d columns specified" +msgstr "a função %s tem %d colunas disponíveis, mas %d colunas especificadas" -#: parser/parse_coerce.c:933 parser/parse_coerce.c:963 -#: parser/parse_coerce.c:981 parser/parse_coerce.c:996 -#: parser/parse_expr.c:1773 parser/parse_expr.c:2247 parser/parse_target.c:854 +#: parser/parse_relation.c:2180 #, c-format -msgid "cannot cast type %s to %s" -msgstr "não pode converter tipo %s para %s" +msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" +msgstr "listas de VALUES \"%s\" tem %d colunas disponíveis mas %d colunas foram especificadas" -#: parser/parse_coerce.c:966 +#: parser/parse_relation.c:2246 #, c-format -msgid "Input has too few columns." -msgstr "Entrada tem poucas colunas." +msgid "joins can have at most %d columns" +msgstr "junções podem ter no máximo %d colunas" -#: parser/parse_coerce.c:984 +#: parser/parse_relation.c:2271 #, c-format -msgid "Cannot cast type %s to %s in column %d." -msgstr "Não pode converter tipo %s para %s na coluna %d." +msgid "join expression \"%s\" has %d columns available but %d columns specified" +msgstr "a expressão de junção \"%s\" tem %d colunas disponíveis, mas %d colunas especificadas" -#: parser/parse_coerce.c:999 +#: parser/parse_relation.c:2361 #, c-format -msgid "Input has too many columns." -msgstr "Entrada tem muitas colunas." +msgid "WITH query \"%s\" does not have a RETURNING clause" +msgstr "consulta WITH \"%s\" não tem uma cláusula RETURNING" -#. translator: first %s is name of a SQL construct, eg WHERE -#: parser/parse_coerce.c:1042 +#: parser/parse_relation.c:3632 #, c-format -msgid "argument of %s must be type boolean, not type %s" -msgstr "argumento do %s deve ser do tipo boolean, e não do tipo %s" +msgid "Perhaps you meant to reference the table alias \"%s\"." +msgstr "Talvez você quisesse referenciar o aliás de tabela \"%s\"." -#. translator: %s is name of a SQL construct, eg WHERE -#. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1052 parser/parse_coerce.c:1101 +#: parser/parse_relation.c:3644 #, c-format -msgid "argument of %s must not return a set" -msgstr "argumento do %s não deve retornar um conjunto" +msgid "To reference that table, you must mark this subquery with LATERAL." +msgstr "" -#. translator: first %s is name of a SQL construct, eg LIMIT -#: parser/parse_coerce.c:1089 +#: parser/parse_relation.c:3650 #, c-format -msgid "argument of %s must be type %s, not type %s" -msgstr "argumento do %s deve ser do tipo %s, e não do tipo %s" +msgid "missing FROM-clause entry for table \"%s\"" +msgstr "faltando entrada para tabela \"%s\" na cláusula FROM" -#. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1222 +#: parser/parse_relation.c:3690 #, c-format -msgid "%s types %s and %s cannot be matched" -msgstr "tipos no %s %s e %s não podem corresponder" +msgid "There are columns named \"%s\", but they are in tables that cannot be referenced from this part of the query." +msgstr "Existem colunas chamadas \"%s\", mas estão em tabelas que não podem ser referenciadas nessa parte da consulta." -#. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1289 +#: parser/parse_relation.c:3692 #, c-format -msgid "%s could not convert type %s to %s" -msgstr "%s não pôde converter tipo %s para %s" +msgid "Try using a table-qualified name." +msgstr "" -#: parser/parse_coerce.c:1591 +#: parser/parse_relation.c:3700 #, c-format -msgid "arguments declared \"anyelement\" are not all alike" -msgstr "argumentos declarados \"anyelement\" não são de tipos compatíveis" +msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." +msgstr "Há uma coluna chamada \"%s\", na tabela \"%s\", mas não pode ser referenciada dessa parte da consulta." -#: parser/parse_coerce.c:1611 +#: parser/parse_relation.c:3703 #, c-format -msgid "arguments declared \"anyarray\" are not all alike" -msgstr "argumentos declarados \"anyarray\" não são de tipos compatíveis" +msgid "To reference that column, you must mark this subquery with LATERAL." +msgstr "" -#: parser/parse_coerce.c:1631 +#: parser/parse_relation.c:3705 #, c-format -msgid "arguments declared \"anyrange\" are not all alike" -msgstr "argumentos declarados \"anyrange\" não são de tipos compatíveis" +msgid "To reference that column, you must use a table-qualified name." +msgstr "" -#: parser/parse_coerce.c:1660 parser/parse_coerce.c:1871 -#: parser/parse_coerce.c:1905 +#: parser/parse_relation.c:3725 #, c-format -msgid "argument declared \"anyarray\" is not an array but type %s" -msgstr "argumento declarado \"anyarray\" não é uma matriz mas do tipo %s" +msgid "Perhaps you meant to reference the column \"%s.%s\"." +msgstr "Talvez você queira fazer referência à coluna \"%s.%s\"." -#: parser/parse_coerce.c:1676 +#: parser/parse_relation.c:3739 #, c-format -msgid "argument declared \"anyarray\" is not consistent with argument declared \"anyelement\"" -msgstr "argumento declarado \"anyarray\" não está consistente com argumento declarado \"anyelement\"" +msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." +msgstr "Talvez você queira fazer referência à coluna \"%s.%s\" ou à coluna \"%s.%s\"." -#: parser/parse_coerce.c:1697 parser/parse_coerce.c:1918 +#: parser/parse_target.c:481 parser/parse_target.c:796 #, c-format -msgid "argument declared \"anyrange\" is not a range type but type %s" -msgstr "argumento declarado \"anyrange\" não é um range mas do tipo %s" +msgid "cannot assign to system column \"%s\"" +msgstr "não é possível atribuir para a coluna do sistema \"%s\"" -#: parser/parse_coerce.c:1713 +#: parser/parse_target.c:509 #, c-format -msgid "argument declared \"anyrange\" is not consistent with argument declared \"anyelement\"" -msgstr "argumento declarado \"anyrange\" não está consistente com argumento declarado \"anyelement\"" +msgid "cannot set an array element to DEFAULT" +msgstr "não é possível definir um elemento de matriz como tendo o valor DEFAULT" -#: parser/parse_coerce.c:1733 +#: parser/parse_target.c:514 #, c-format -msgid "could not determine polymorphic type because input has type \"unknown\"" -msgstr "não pôde determinar tipo polimórfico porque entrada tem tipo \"unknown\"" +msgid "cannot set a subfield to DEFAULT" +msgstr "não é possível definir um subcampo como tendo o valor DEFAULT" -#: parser/parse_coerce.c:1743 +#: parser/parse_target.c:588 #, c-format -msgid "type matched to anynonarray is an array type: %s" -msgstr "tipo que corresponde a anynonarray é um tipo array: %s" +msgid "column \"%s\" is of type %s but expression is of type %s" +msgstr "coluna \"%s\" é do tipo %s mas expressão é do tipo %s" -#: parser/parse_coerce.c:1753 +#: parser/parse_target.c:780 #, c-format -msgid "type matched to anyenum is not an enum type: %s" -msgstr "tipo que corresponde a anyenum não é um tipo enum: %s" +msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" +msgstr "não é possível atribuir valor para o campo \"%s\" da coluna \"%s\", porque seu tipo de dados %s não é um tipo de dados composto" -#: parser/parse_coerce.c:1793 parser/parse_coerce.c:1823 +#: parser/parse_target.c:789 #, c-format -msgid "could not find range type for data type %s" -msgstr "não pôde encontrar tipo range para tipo de dado %s" +msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" +msgstr "não é possível atribuir valor para o campo \"%s\" da coluna \"%s\", porque não existe essa coluna no tipo de dados %s" -#: parser/parse_collate.c:228 parser/parse_collate.c:475 -#: parser/parse_collate.c:984 +#: parser/parse_target.c:869 #, c-format -msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" -msgstr "imcompatibilidade de ordenação entre ordenações implícitas \"%s\" e \"%s\"" +msgid "subscripted assignment to \"%s\" requires type %s but expression is of type %s" +msgstr "atribuição com índice para \"%s\" requer o tipo de dados %s, mas a expressão é do tipo de dados %s" -#: parser/parse_collate.c:231 parser/parse_collate.c:478 -#: parser/parse_collate.c:987 +#: parser/parse_target.c:879 #, c-format -msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." -msgstr "Você pode escolher uma ordenação aplicando a cláusula COLLATE em uma ou nas duas expressões." +msgid "subfield \"%s\" is of type %s but expression is of type %s" +msgstr "subcampo \"%s\" é do tipo %s mas expressão é do tipo %s" -#: parser/parse_collate.c:832 +#: parser/parse_target.c:1314 #, c-format -msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" -msgstr "incompatibilidade de ordenação entre ordenações explícitas \"%s\" e \"%s\"" +msgid "SELECT * with no tables specified is not valid" +msgstr "SELECT * sem tabelas especificadas não é válido" -#: parser/parse_cte.c:42 +#: parser/parse_type.c:100 #, c-format -msgid "recursive reference to query \"%s\" must not appear within its non-recursive term" -msgstr "referência recursiva para consulta \"%s\" não deve aparecer no seu termo não recursivo" +msgid "improper %%TYPE reference (too few dotted names): %s" +msgstr "referência a %%TYPE é inválida (nomes com poucos pontos): %s" -#: parser/parse_cte.c:44 +#: parser/parse_type.c:122 #, c-format -msgid "recursive reference to query \"%s\" must not appear within a subquery" -msgstr "referência recursiva para consulta \"%s\" não deve aparecer em uma subconsulta" +msgid "improper %%TYPE reference (too many dotted names): %s" +msgstr "referência a %%TYPE é inválida (nomes com muitos pontos): %s" -#: parser/parse_cte.c:46 +#: parser/parse_type.c:157 #, c-format -msgid "recursive reference to query \"%s\" must not appear within an outer join" -msgstr "referência recursiva para consulta \"%s\" não deve aparecer em uma junção externa" +msgid "type reference %s converted to %s" +msgstr "referência a tipo %s convertido para %s" -#: parser/parse_cte.c:48 +#: parser/parse_type.c:278 parser/parse_type.c:813 utils/cache/typcache.c:395 +#: utils/cache/typcache.c:450 #, c-format -msgid "recursive reference to query \"%s\" must not appear within INTERSECT" -msgstr "referência recursiva para consulta \"%s\" não deve aparecer em um INTERSECT" +msgid "type \"%s\" is only a shell" +msgstr "tipo \"%s\" é indefinido" -#: parser/parse_cte.c:50 +#: parser/parse_type.c:363 #, c-format -msgid "recursive reference to query \"%s\" must not appear within EXCEPT" -msgstr "referência recursiva para consulta \"%s\" não deve aparecer em um EXCEPT" +msgid "type modifier is not allowed for type \"%s\"" +msgstr "modificador de tipo não é permitido para tipo \"%s\"" -#: parser/parse_cte.c:132 +#: parser/parse_type.c:409 #, c-format -msgid "WITH query name \"%s\" specified more than once" -msgstr "nome da consulta WITH \"%s\" foi especificado mais de uma vez" +msgid "type modifiers must be simple constants or identifiers" +msgstr "modificadores de tipo devem ser constantes ou identificadores" -#: parser/parse_cte.c:264 +#: parser/parse_type.c:723 parser/parse_type.c:773 #, c-format -msgid "WITH clause containing a data-modifying statement must be at the top level" -msgstr "cláusula WITH contendo um comando que modifica dados deve estar no nível superior" +msgid "invalid type name \"%s\"" +msgstr "o nome do tipo de dados \"%s\" não é válido" -#: parser/parse_cte.c:313 +#: parser/parse_utilcmd.c:264 #, c-format -msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" -msgstr "coluna %2$d da consulta recursiva \"%1$s\" tem tipo %3$s no termo não recursivo mas o tipo %4$s no restante" +msgid "cannot create partitioned table as inheritance child" +msgstr "não é possível criar tabela particionada como filha de herança" -#: parser/parse_cte.c:319 +#: parser/parse_utilcmd.c:580 #, c-format -msgid "Cast the output of the non-recursive term to the correct type." -msgstr "Converta a saída do termo não recursivo para o tipo correto." +msgid "array of serial is not implemented" +msgstr "matriz de serial não está implementada" -#: parser/parse_cte.c:324 +#: parser/parse_utilcmd.c:659 parser/parse_utilcmd.c:671 +#: parser/parse_utilcmd.c:730 #, c-format -msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" -msgstr "coluna %2$d da consulta recursiva \"%1$s\" tem ordenação %3$s no termo não recursivo mas a ordenação %4$s no restante" +msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" +msgstr "declarações NULL/NOT NULL conflitantes para coluna \"%s\" da tabela \"%s\"" -#: parser/parse_cte.c:328 +#: parser/parse_utilcmd.c:683 #, c-format -msgid "Use the COLLATE clause to set the collation of the non-recursive term." -msgstr "Utilize a cláusula COLLATE para definir a ordenação do termo não recursivo." +msgid "multiple default values specified for column \"%s\" of table \"%s\"" +msgstr "valores padrão múltiplos especificados para coluna \"%s\" da tabela \"%s\"" -#: parser/parse_cte.c:419 +#: parser/parse_utilcmd.c:700 #, c-format -msgid "WITH query \"%s\" has %d columns available but %d columns specified" -msgstr "consulta WITH \"%s\" tem %d colunas disponíveis mas %d colunas foram especificadas" +msgid "identity columns are not supported on typed tables" +msgstr "colunas de identidade não têm suporte em tabelas tipada" -#: parser/parse_cte.c:599 +#: parser/parse_utilcmd.c:704 #, c-format -msgid "mutual recursion between WITH items is not implemented" -msgstr "recursão mútua entre itens WITH não está implementada" +msgid "identity columns are not supported on partitions" +msgstr "colunas de identidade não têm suporte em partições" -#: parser/parse_cte.c:651 +#: parser/parse_utilcmd.c:713 #, c-format -msgid "recursive query \"%s\" must not contain data-modifying statements" -msgstr "consulta recursiva \"%s\" não deve conter comandos que modificam dados" +msgid "multiple identity specifications for column \"%s\" of table \"%s\"" +msgstr "múltiplas especificações de identidade para a coluna \"%s\" da tabela \"%s\"" -#: parser/parse_cte.c:659 +#: parser/parse_utilcmd.c:743 #, c-format -msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" -msgstr "consulta recursiva \"%s\" não tem a forma termo-não-recursivo UNION [ALL] termo-recursivo" +msgid "generated columns are not supported on typed tables" +msgstr "colunas geradas não têm suporte em tabelas tipadas" -#: parser/parse_cte.c:703 +#: parser/parse_utilcmd.c:747 #, c-format -msgid "ORDER BY in a recursive query is not implemented" -msgstr "ORDER BY em uma consulta recursiva não está implementado" +msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" +msgstr "múltiplas cláusulas de geração especificadas para a coluna \"%s\" da tabela \"%s\"" -#: parser/parse_cte.c:709 +#: parser/parse_utilcmd.c:765 parser/parse_utilcmd.c:880 #, c-format -msgid "OFFSET in a recursive query is not implemented" -msgstr "OFFSET em uma consulta recursiva não está implementado" +msgid "primary key constraints are not supported on foreign tables" +msgstr "restrições de chave primária não têm suporte em tabelas estrangeiras" -#: parser/parse_cte.c:715 +#: parser/parse_utilcmd.c:774 parser/parse_utilcmd.c:890 #, c-format -msgid "LIMIT in a recursive query is not implemented" -msgstr "LIMIT em uma consulta recursiva não está implementado" +msgid "unique constraints are not supported on foreign tables" +msgstr "restrições de unicidade não têm suporte em tabelas estrangeiras" -#: parser/parse_cte.c:721 +#: parser/parse_utilcmd.c:819 #, c-format -msgid "FOR UPDATE/SHARE in a recursive query is not implemented" -msgstr "FOR UPDATE/SHARE em uma consulta recursiva não está implementado" +msgid "both default and identity specified for column \"%s\" of table \"%s\"" +msgstr "valor padrão e identidade especificados para a coluna \"%s\" da tabela \"%s\"" -#: parser/parse_cte.c:778 +#: parser/parse_utilcmd.c:827 #, c-format -msgid "recursive reference to query \"%s\" must not appear more than once" -msgstr "referência recursiva para consulta \"%s\" não deve aparecer mais de uma vez" +msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" +msgstr "expressão padrão e de geração especificadas para a coluna \"%s\" da tabela \"%s\"" -#: parser/parse_expr.c:389 parser/parse_relation.c:2875 +#: parser/parse_utilcmd.c:835 #, c-format -msgid "column %s.%s does not exist" -msgstr "coluna %s.%s não existe" +msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" +msgstr "expressão de identidade e de geração especificadas para a coluna \"%s\" da tabela \"%s\"" -#: parser/parse_expr.c:401 +#: parser/parse_utilcmd.c:900 #, c-format -msgid "column \"%s\" not found in data type %s" -msgstr "coluna \"%s\" não foi encontrada no tipo de dado %s" +msgid "exclusion constraints are not supported on foreign tables" +msgstr "restrições de exclusão não têm suporte em tabelas estrangeiras" -#: parser/parse_expr.c:407 +#: parser/parse_utilcmd.c:906 #, c-format -msgid "could not identify column \"%s\" in record data type" -msgstr "não pôde identificar coluna \"%s\" no tipo de dado record" +msgid "exclusion constraints are not supported on partitioned tables" +msgstr "restrições de exclusão não são suportadas em tabelas particionadas" -#: parser/parse_expr.c:413 +#: parser/parse_utilcmd.c:971 #, c-format -msgid "column notation .%s applied to type %s, which is not a composite type" -msgstr "notação de coluna .%s aplicada ao tipo %s, que não é um tipo composto" +msgid "LIKE is not supported for creating foreign tables" +msgstr "LIKE não tem suporte para criar tabelas estrangeiras" -#: parser/parse_expr.c:443 parser/parse_target.c:640 +#: parser/parse_utilcmd.c:984 #, c-format -msgid "row expansion via \"*\" is not supported here" -msgstr "expansão de registro utilizando \"*\" não é suportada aqui" +msgid "relation \"%s\" is invalid in LIKE clause" +msgstr "a relação \"%s\" é inválida na cláusula LIKE" -#: parser/parse_expr.c:766 parser/parse_relation.c:561 -#: parser/parse_relation.c:652 parser/parse_target.c:1089 +#: parser/parse_utilcmd.c:1741 parser/parse_utilcmd.c:1849 #, c-format -msgid "column reference \"%s\" is ambiguous" -msgstr "referência à coluna \"%s\" é ambígua" +msgid "Index \"%s\" contains a whole-row table reference." +msgstr "Ãndice \"%s\" contém uma referência a toda a linha da tabela." -#: parser/parse_expr.c:822 parser/parse_param.c:110 parser/parse_param.c:142 -#: parser/parse_param.c:199 parser/parse_param.c:298 +#: parser/parse_utilcmd.c:2236 #, c-format -msgid "there is no parameter $%d" -msgstr "não há parâmetro $%d" +msgid "cannot use an existing index in CREATE TABLE" +msgstr "não é possível utilizar um índice existente em CREATE TABLE" -#: parser/parse_expr.c:1034 +#: parser/parse_utilcmd.c:2256 #, c-format -msgid "NULLIF requires = operator to yield boolean" -msgstr "NULLIF requer que operador = retorne booleano" +msgid "index \"%s\" is already associated with a constraint" +msgstr "índice \"%s\" já está associado com a restrição" -#: parser/parse_expr.c:1469 -msgid "cannot use subquery in check constraint" -msgstr "não pode utilizar subconsulta na restrição de verificação" +#: parser/parse_utilcmd.c:2277 +#, c-format +msgid "\"%s\" is not a unique index" +msgstr "\"%s\" não é um índice único" -#: parser/parse_expr.c:1473 -msgid "cannot use subquery in DEFAULT expression" -msgstr "não pode utilizar subconsulta em expressão DEFAULT" +#: parser/parse_utilcmd.c:2278 parser/parse_utilcmd.c:2285 +#: parser/parse_utilcmd.c:2292 parser/parse_utilcmd.c:2369 +#, c-format +msgid "Cannot create a primary key or unique constraint using such an index." +msgstr "Não é possível criar uma chave primária ou restrição de unicidade usando esse índice." -#: parser/parse_expr.c:1476 -msgid "cannot use subquery in index expression" -msgstr "não pode utilizar subconsulta em expressão de índice" +#: parser/parse_utilcmd.c:2284 +#, c-format +msgid "index \"%s\" contains expressions" +msgstr "índice \"%s\" contém expressões" -#: parser/parse_expr.c:1479 -msgid "cannot use subquery in index predicate" -msgstr "não pode utilizar subconsulta em predicado de índice" +#: parser/parse_utilcmd.c:2291 +#, c-format +msgid "\"%s\" is a partial index" +msgstr "\"%s\" é um índice parcial" -#: parser/parse_expr.c:1482 -msgid "cannot use subquery in transform expression" -msgstr "não pode utilizar subconsulta em expressão de transformação" +#: parser/parse_utilcmd.c:2303 +#, c-format +msgid "\"%s\" is a deferrable index" +msgstr "\"%s\" não é um índice postergável" -#: parser/parse_expr.c:1485 -msgid "cannot use subquery in EXECUTE parameter" -msgstr "não pode utilizar subconsulta no parâmetro EXECUTE" +#: parser/parse_utilcmd.c:2304 +#, c-format +msgid "Cannot create a non-deferrable constraint using a deferrable index." +msgstr "Não é possível criar uma restrição de unicidade não-postergável usando um índice postergável." -#: parser/parse_expr.c:1488 -msgid "cannot use subquery in trigger WHEN condition" -msgstr "não pode utilizar subconsulta em condição WHEN de gatilho" +#: parser/parse_utilcmd.c:2368 +#, c-format +msgid "index \"%s\" column number %d does not have default sorting behavior" +msgstr "o índice \"%s\" coluna número %d não possui comportamento de classificação padrão" -#: parser/parse_expr.c:1545 +#: parser/parse_utilcmd.c:2525 #, c-format -msgid "subquery must return a column" -msgstr "subconsulta deve retornar uma coluna" +msgid "column \"%s\" appears twice in primary key constraint" +msgstr "coluna \"%s\" aparece duas vezes na restrição de chave primária" -#: parser/parse_expr.c:1552 +#: parser/parse_utilcmd.c:2531 #, c-format -msgid "subquery must return only one column" -msgstr "subconsulta deve retornar somente uma coluna" +msgid "column \"%s\" appears twice in unique constraint" +msgstr "coluna \"%s\" aparece duas vezes na restrição de unicidade" -#: parser/parse_expr.c:1612 +#: parser/parse_utilcmd.c:2878 #, c-format -msgid "subquery has too many columns" -msgstr "subconsulta tem muitas colunas" +msgid "index expressions and predicates can refer only to the table being indexed" +msgstr "expressões e predicados de índice só podem referenciar a tabela que está sendo indexada" -#: parser/parse_expr.c:1617 +#: parser/parse_utilcmd.c:2950 #, c-format -msgid "subquery has too few columns" -msgstr "subconsulta tem poucas colunas" +msgid "statistics expressions can refer only to the table being referenced" +msgstr "expressões de estatísticas podem referir-se apenas à tabela que está sendo referenciada" -#: parser/parse_expr.c:1713 +#: parser/parse_utilcmd.c:2993 #, c-format -msgid "cannot determine type of empty array" -msgstr "não pode determinar tipo de matriz vazia" +msgid "rules on materialized views are not supported" +msgstr "regras em tabelas estrangeiras não têm suporte" -#: parser/parse_expr.c:1714 +#: parser/parse_utilcmd.c:3053 #, c-format -msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." -msgstr "Converta explicitamente para o tipo desejado, por exemplo ARRAY[]::integer[]." +msgid "rule WHERE condition cannot contain references to other relations" +msgstr "condição WHERE de regra não pode conter referências a outras relações" -#: parser/parse_expr.c:1728 +#: parser/parse_utilcmd.c:3125 #, c-format -msgid "could not find element type for data type %s" -msgstr "não pôde encontrar tipo de dado de elemento para tipo de dado %s" +msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" +msgstr "regras com condições WHERE só podem ter ações SELECT, INSERT, UPDATE ou DELETE" -#: parser/parse_expr.c:1954 +#: parser/parse_utilcmd.c:3143 parser/parse_utilcmd.c:3244 +#: rewrite/rewriteHandler.c:539 rewrite/rewriteManip.c:1087 #, c-format -msgid "unnamed XML attribute value must be a column reference" -msgstr "valor do atributo XML sem nome deve ser uma referência a coluna" +msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" +msgstr "comandos condicionais UNION/INTERSECT/EXCEPT não estão implementados" -#: parser/parse_expr.c:1955 +#: parser/parse_utilcmd.c:3161 #, c-format -msgid "unnamed XML element value must be a column reference" -msgstr "valor do elemento XML sem nome deve ser uma referência a coluna" +msgid "ON SELECT rule cannot use OLD" +msgstr "regra ON SELECT não pode utilizar OLD" -#: parser/parse_expr.c:1970 +#: parser/parse_utilcmd.c:3165 #, c-format -msgid "XML attribute name \"%s\" appears more than once" -msgstr "nome de atributo XML \"%s\" aparece mais do que uma vez" +msgid "ON SELECT rule cannot use NEW" +msgstr "regra ON SELECT não pode utilizar NEW" -#: parser/parse_expr.c:2077 +#: parser/parse_utilcmd.c:3174 #, c-format -msgid "cannot cast XMLSERIALIZE result to %s" -msgstr "não pode converter resultado de XMLSERIALIZE para %s" +msgid "ON INSERT rule cannot use OLD" +msgstr "regra ON INSERT não pode utilizar OLD" -#: parser/parse_expr.c:2320 parser/parse_expr.c:2520 +#: parser/parse_utilcmd.c:3180 #, c-format -msgid "unequal number of entries in row expressions" -msgstr "número desigual de entradas em expressões de registro" +msgid "ON DELETE rule cannot use NEW" +msgstr "regra ON DELETE não pode utilizar NEW" -#: parser/parse_expr.c:2330 +#: parser/parse_utilcmd.c:3208 #, c-format -msgid "cannot compare rows of zero length" -msgstr "não pode comparar registros de tamanho zero" +msgid "cannot refer to OLD within WITH query" +msgstr "não é possível referenciar OLD em uma consulta WITH" -#: parser/parse_expr.c:2355 +#: parser/parse_utilcmd.c:3215 #, c-format -msgid "row comparison operator must yield type boolean, not type %s" -msgstr "operador de comparação de registro deve retornar tipo boolean, e não tipo %s" +msgid "cannot refer to NEW within WITH query" +msgstr "não é possível referenciar NEW em uma consulta WITH" -#: parser/parse_expr.c:2362 +#: parser/parse_utilcmd.c:3667 #, c-format -msgid "row comparison operator must not return a set" -msgstr "operador de comparação de registro não deve retornar um conjunto" +msgid "misplaced DEFERRABLE clause" +msgstr "cláusula DEFERRABLE no lugar errado" -#: parser/parse_expr.c:2421 parser/parse_expr.c:2466 +#: parser/parse_utilcmd.c:3672 parser/parse_utilcmd.c:3687 #, c-format -msgid "could not determine interpretation of row comparison operator %s" -msgstr "não pôde determinar interpretação do operador de comparação de registro %s" +msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" +msgstr "não são permitidas múltiplas cláusulas DEFERRABLE/NOT DEFERRABLE" -#: parser/parse_expr.c:2423 +#: parser/parse_utilcmd.c:3682 #, c-format -msgid "Row comparison operators must be associated with btree operator families." -msgstr "Operadores de comparação de registro devem ser associados com famílias de operadores de árvore B." +msgid "misplaced NOT DEFERRABLE clause" +msgstr "cláusula NOT DEFERRABLE no lugar errado" -#: parser/parse_expr.c:2468 +#: parser/parse_utilcmd.c:3703 #, c-format -msgid "There are multiple equally-plausible candidates." -msgstr "Há múltiplos candidatos igualmente plausíveis." +msgid "misplaced INITIALLY DEFERRED clause" +msgstr "cláusula INITIALLY DEFERRED no lugar errado" -#: parser/parse_expr.c:2560 +#: parser/parse_utilcmd.c:3708 parser/parse_utilcmd.c:3734 #, c-format -msgid "IS DISTINCT FROM requires = operator to yield boolean" -msgstr "IS DISTINCT FROM requer que operador = retorne booleano" +msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" +msgstr "não são permitidas múltiplas cláusulas INITTIALLY IMMEDIATE/DEFERRED" -#: parser/parse_func.c:173 +#: parser/parse_utilcmd.c:3729 #, c-format -msgid "argument name \"%s\" used more than once" -msgstr "nome de argumento \"%s\" utilizado mais de uma vez" +msgid "misplaced INITIALLY IMMEDIATE clause" +msgstr "cláusula INITIALLY IMMEDIATE no lugar errado" -#: parser/parse_func.c:184 +#: parser/parse_utilcmd.c:3922 #, c-format -msgid "positional argument cannot follow named argument" -msgstr "argumento posicional não pode seguir argumento nomeado" +msgid "CREATE specifies a schema (%s) different from the one being created (%s)" +msgstr "CREATE especificou um esquema (%s) diferente daquele que foi criado (%s)" -#: parser/parse_func.c:263 +#: parser/parse_utilcmd.c:3957 #, c-format -msgid "%s(*) specified, but %s is not an aggregate function" -msgstr "%s(*) especificado, mas %s não é uma função de agregação" +msgid "\"%s\" is not a partitioned table" +msgstr "\"%s\" não é uma tabela particionada" -#: parser/parse_func.c:270 +#: parser/parse_utilcmd.c:3964 #, c-format -msgid "DISTINCT specified, but %s is not an aggregate function" -msgstr "DISTINCT especificado, mas %s não é uma função de agregação" +msgid "table \"%s\" is not partitioned" +msgstr "a tabela \"%s\" não é particionada" + +#: parser/parse_utilcmd.c:3971 +#, c-format +msgid "index \"%s\" is not partitioned" +msgstr "o índice \"%s\" não é particionado" -#: parser/parse_func.c:276 +#: parser/parse_utilcmd.c:4011 #, c-format -msgid "WITHIN GROUP specified, but %s is not an aggregate function" -msgstr "WITHIN GROUP especificado, mas %s não é uma função de agregação" +msgid "a hash-partitioned table may not have a default partition" +msgstr "" -#: parser/parse_func.c:282 +#: parser/parse_utilcmd.c:4028 #, c-format -msgid "ORDER BY specified, but %s is not an aggregate function" -msgstr "ORDER BY especificado, mas %s não é uma função de agregação" +msgid "invalid bound specification for a hash partition" +msgstr "especificação de limite inválida para uma partição hash" -#: parser/parse_func.c:288 +#: parser/parse_utilcmd.c:4034 partitioning/partbounds.c:4803 #, c-format -msgid "FILTER specified, but %s is not an aggregate function" -msgstr "FILTER especificado, mas %s não é uma função de agregação" +msgid "modulus for hash partition must be an integer value greater than zero" +msgstr "o módulo para partição hash deve ser um valor inteiro maior que zero" -#: parser/parse_func.c:294 +#: parser/parse_utilcmd.c:4041 partitioning/partbounds.c:4811 #, c-format -msgid "OVER specified, but %s is not a window function nor an aggregate function" -msgstr "OVER especificado, mas %s não é uma função deslizante ou função de agregação" +msgid "remainder for hash partition must be less than modulus" +msgstr "o resto da partição hash deve ser menor que o módulo" -#: parser/parse_func.c:324 +#: parser/parse_utilcmd.c:4054 #, c-format -msgid "WITHIN GROUP is required for ordered-set aggregate %s" -msgstr "WITHIN GROUP é requerido por agregação de conjunto ordenado %s" +msgid "invalid bound specification for a list partition" +msgstr "especificação de limite inválida para uma partição de lista" -#: parser/parse_func.c:330 +#: parser/parse_utilcmd.c:4107 #, c-format -msgid "OVER is not supported for ordered-set aggregate %s" -msgstr "OVER não é suportado por agregação de conjunto ordenado %s" +msgid "invalid bound specification for a range partition" +msgstr "especificação de limite inválida para uma partição de intervalo" -#: parser/parse_func.c:361 parser/parse_func.c:390 +#: parser/parse_utilcmd.c:4113 #, c-format -msgid "There is an ordered-set aggregate %s, but it requires %d direct arguments, not %d." -msgstr "Há uma agregação de conjunto ordenado %s, mas ela requer %d argumentos diretos, e não %d." +msgid "FROM must specify exactly one value per partitioning column" +msgstr "FROM deve especificar exatamente um valor por coluna de particionamento" -#: parser/parse_func.c:415 +#: parser/parse_utilcmd.c:4117 #, c-format -msgid "To use the hypothetical-set aggregate %s, the number of hypothetical direct arguments (here %d) must match the number of ordering columns (here %d)." -msgstr "Para utilizar uma agregação de conjunto hipotético %s, o número de argumentos diretos hipotéticos (aqui %d) deve corresponder ao número de colunas de ordenação (aqui %d)." +msgid "TO must specify exactly one value per partitioning column" +msgstr "TO deve especificar exatamente um valor por coluna de particionamento" -#: parser/parse_func.c:429 +#: parser/parse_utilcmd.c:4231 #, c-format -msgid "There is an ordered-set aggregate %s, but it requires at least %d direct arguments." -msgstr "Há uma agregação de conjunto ordenado %s, mas ela requer pelo menos %d argumentos diretos." +msgid "cannot specify NULL in range bound" +msgstr "não é possível especificar NULL em limite do intervalo" -#: parser/parse_func.c:448 +#: parser/parse_utilcmd.c:4280 #, c-format -msgid "%s is not an ordered-set aggregate, so it cannot have WITHIN GROUP" -msgstr "%s não é uma agregação de conjunto ordenado, portanto, ela não pode ter WITHIN GROUP" +msgid "every bound following MAXVALUE must also be MAXVALUE" +msgstr "" -#: parser/parse_func.c:461 +#: parser/parse_utilcmd.c:4287 #, c-format -msgid "window function %s requires an OVER clause" -msgstr "função deslizante %s requer uma cláusula OVER" +msgid "every bound following MINVALUE must also be MINVALUE" +msgstr "" -#: parser/parse_func.c:468 +#: parser/parse_utilcmd.c:4330 #, c-format -msgid "window function %s cannot have WITHIN GROUP" -msgstr "função deslizante %s não pode ter WITHIN GROUP" +msgid "specified value cannot be cast to type %s for column \"%s\"" +msgstr "o valor especificado não pode ser convertido no tipo de dados %s para a coluna \"%s\"" + +#: parser/parser.c:273 +msgid "UESCAPE must be followed by a simple string literal" +msgstr "UESCAPE deve ser seguido por um literal cadeia de caracteres simples" -#: parser/parse_func.c:489 +#: parser/parser.c:278 +msgid "invalid Unicode escape character" +msgstr "o caractere de escape Unicode não é válido" + +#: parser/parser.c:347 scan.l:1390 #, c-format -msgid "function %s is not unique" -msgstr "função %s não é única" +msgid "invalid Unicode escape value" +msgstr "o valor de escape Unicode não é válido" -#: parser/parse_func.c:492 +#: parser/parser.c:494 scan.l:701 utils/adt/varlena.c:6505 #, c-format -msgid "Could not choose a best candidate function. You might need to add explicit type casts." -msgstr "Não pôde escolher uma função que se enquadra melhor. Você precisa adicionar conversões de tipo explícitas." +msgid "invalid Unicode escape" +msgstr "o escape Unicode não é válido" -#: parser/parse_func.c:503 +#: parser/parser.c:495 #, c-format -msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." -msgstr "Nenhuma função de agregação corresponde com o nome e os tipos de argumentos informados. Talvez você colocou ORDER BY no lugar errado; ORDER BY deve aparecer depois de todos os argumentos regulares da agregação." +msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." +msgstr "os escapes Unicode devem ser \\XXXX ou \\+XXXXXX." -#: parser/parse_func.c:514 +#: parser/parser.c:523 scan.l:662 scan.l:678 scan.l:694 +#: utils/adt/varlena.c:6530 #, c-format -msgid "No function matches the given name and argument types. You might need to add explicit type casts." -msgstr "Nenhuma função corresponde com o nome e os tipos de argumentos informados. Você precisa adicionar conversões de tipo explícitas." +msgid "invalid Unicode surrogate pair" +msgstr "o par substituto (surrogate) Unicode não é válido" -#: parser/parse_func.c:616 +#: parser/scansup.c:101 #, c-format -msgid "VARIADIC argument must be an array" -msgstr "parâmetro VARIADIC deve ser uma matriz" +msgid "identifier \"%s\" will be truncated to \"%.*s\"" +msgstr "o identificador \"%s\" será truncado para \"%.*s\"" -#: parser/parse_func.c:661 parser/parse_func.c:725 +#: partitioning/partbounds.c:2921 #, c-format -msgid "%s(*) must be used to call a parameterless aggregate function" -msgstr "%s(*) deve ser utilizado para chamar uma função de agregação sem parâmetros" +msgid "partition \"%s\" conflicts with existing default partition \"%s\"" +msgstr "a partição \"%s\" conflita com a partição padrão existente \"%s\"" -#: parser/parse_func.c:668 +#: partitioning/partbounds.c:2973 partitioning/partbounds.c:2992 +#: partitioning/partbounds.c:3014 #, c-format -msgid "aggregates cannot return sets" -msgstr "agregações não podem retornar conjuntos" +msgid "every hash partition modulus must be a factor of the next larger modulus" +msgstr "" -#: parser/parse_func.c:683 +#: partitioning/partbounds.c:2974 partitioning/partbounds.c:3015 #, c-format -msgid "aggregates cannot use named arguments" -msgstr "agregações não podem utilizar argumentos nomeados" +msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." +msgstr "" -#: parser/parse_func.c:715 +#: partitioning/partbounds.c:2993 #, c-format -msgid "DISTINCT is not implemented for window functions" -msgstr "DISTINCT não está implementado para funções deslizantes" +msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." +msgstr "" -#: parser/parse_func.c:735 +#: partitioning/partbounds.c:3128 #, c-format -msgid "aggregate ORDER BY is not implemented for window functions" -msgstr "agregação ORDER BY não está implementado para funções deslizantes" +msgid "empty range bound specified for partition \"%s\"" +msgstr "" -#: parser/parse_func.c:744 +#: partitioning/partbounds.c:3130 #, c-format -msgid "FILTER is not implemented for non-aggregate window functions" -msgstr "FILTER não está implementado para funções deslizantes que não são agregações" +msgid "Specified lower bound %s is greater than or equal to upper bound %s." +msgstr "o limite inferior especificado %s é maior ou igual ao limite superior %s." -#: parser/parse_func.c:750 +#: partitioning/partbounds.c:3238 #, c-format -msgid "window functions cannot return sets" -msgstr "funções deslizantes não podem retornar conjuntos" +msgid "partition \"%s\" would overlap partition \"%s\"" +msgstr "a partição \"%s\" se sobreporia à partição \"%s\"" -#: parser/parse_func.c:1994 +#: partitioning/partbounds.c:3355 #, c-format -msgid "aggregate %s(*) does not exist" -msgstr "agregação %s(*) não existe" +msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" +msgstr "saltada a varredura da tabela estrangeira \"%s\", que é uma partição da partição padrão \"%s\"" -#: parser/parse_func.c:1999 +#: partitioning/partbounds.c:4807 #, c-format -msgid "aggregate %s does not exist" -msgstr "agregação %s não existe" +msgid "remainder for hash partition must be an integer value greater than or equal to zero" +msgstr "o resto da partição hash deve ser um valor inteiro maior ou igual a zero" -#: parser/parse_func.c:2018 +#: partitioning/partbounds.c:4831 #, c-format -msgid "function %s is not an aggregate" -msgstr "função %s não é uma agregação" +msgid "\"%s\" is not a hash partitioned table" +msgstr "\"%s\" não é uma tabela particionada por hash" -#: parser/parse_node.c:84 +#: partitioning/partbounds.c:4842 partitioning/partbounds.c:4959 #, c-format -msgid "target lists can have at most %d entries" -msgstr "listas de alvos podem ter no máximo %d entradas" +msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" +msgstr "o número de colunas de particionamento (%d) não corresponde ao número de chaves de partição fornecidas (%d)" -#: parser/parse_node.c:253 +#: partitioning/partbounds.c:4864 #, c-format -msgid "cannot subscript type %s because it is not an array" -msgstr "tipo do índice de uma matriz não pode ser %s porque ele não é uma matriz" +msgid "column %d of the partition key has type %s, but supplied value is of type %s" +msgstr "a coluna %d da chave de partição tem o tipo de dados %s, mas o valor fornecido é do tipo de dados %s" -#: parser/parse_node.c:356 parser/parse_node.c:383 +#: partitioning/partbounds.c:4896 #, c-format -msgid "array subscript must have type integer" -msgstr "índice da matriz deve ser do tipo integer" +msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" +msgstr "" -#: parser/parse_node.c:407 +#: port/pg_sema.c:209 port/pg_shmem.c:708 port/posix_sema.c:209 +#: port/sysv_sema.c:323 port/sysv_shmem.c:708 #, c-format -msgid "array assignment requires type %s but expression is of type %s" -msgstr "atribuição da matriz requer tipo %s mas expressão é do tipo %s" +msgid "could not stat data directory \"%s\": %m" +msgstr "não foi possível executar stat no diretório de dados \"%s\": %m" -#: parser/parse_oper.c:124 parser/parse_oper.c:718 utils/adt/regproc.c:547 -#: utils/adt/regproc.c:567 utils/adt/regproc.c:751 +#: port/pg_shmem.c:223 port/sysv_shmem.c:223 #, c-format -msgid "operator does not exist: %s" -msgstr "operador não existe: %s" +msgid "could not create shared memory segment: %m" +msgstr "não foi possível criar segmento de memória compartilhada: %m" -#: parser/parse_oper.c:221 +#: port/pg_shmem.c:224 port/sysv_shmem.c:224 #, c-format -msgid "Use an explicit ordering operator or modify the query." -msgstr "Utilize um operador de ordenação explícito ou modifique a consulta." +msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." +msgstr "Falhou ao executar chamada de sistema shmget(key=%lu, size=%zu, 0%o)." -#: parser/parse_oper.c:225 utils/adt/arrayfuncs.c:3222 -#: utils/adt/arrayfuncs.c:3741 utils/adt/arrayfuncs.c:5294 -#: utils/adt/rowtypes.c:1159 +#: port/pg_shmem.c:228 port/sysv_shmem.c:228 #, c-format -msgid "could not identify an equality operator for type %s" -msgstr "não pôde identificar um operador de igualdade para tipo %s" +msgid "" +"This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" +"The PostgreSQL documentation contains more information about shared memory configuration." +msgstr "" +"Esse erro usualmente significa que a requisição do PostgreSQL por segmento de memória compartilhada excedeu o parâmetro SHMMAX do kernel ou possivelmente que é menor do que o parâmetro SHMMIN do kernel.\n" +"A documentação do PostgreSQL contém informações adicionais sobre configuração de memória compartilhada." -#: parser/parse_oper.c:476 +#: port/pg_shmem.c:235 port/sysv_shmem.c:235 #, c-format -msgid "operator requires run-time type coercion: %s" -msgstr "operador requer conversão de tipo em tempo de execução: %s" +msgid "" +"This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" +"The PostgreSQL documentation contains more information about shared memory configuration." +msgstr "" +"Esse erro usualmente significa que a requisição do PostgreSQL por segmento de memória compartilhada excedeu o parâmetro SHMALL do kernel. Talvez seja necessário reconfigurar o kernel com SHMALL maior.\n" +"A documentação do PostgreSQL contém informações adicionais sobre configuração de memória compartilhada." -#: parser/parse_oper.c:710 +#: port/pg_shmem.c:241 port/sysv_shmem.c:241 #, c-format -msgid "operator is not unique: %s" -msgstr "operador não é único: %s" +msgid "" +"This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" +"The PostgreSQL documentation contains more information about shared memory configuration." +msgstr "" +"Esse erro *não* significa que você está sem espaço em disco. Isso ocorre se todos os IDs de memória compartilhadas estão sendo usados, neste caso você precisa aumentar o parâmetro SHMMNI do seu kernel, ou porque o limite do sistema para memória compartilhada foi alcançado.\n" +"A documentação do PostgreSQL contém informações adicionais sobre configuração de memória compartilhada." -#: parser/parse_oper.c:712 +#: port/pg_shmem.c:583 port/sysv_shmem.c:583 port/win32_shmem.c:641 #, c-format -msgid "Could not choose a best candidate operator. You might need to add explicit type casts." -msgstr "Não pôde escolher um operador que se enquadra melhor. Você precisa adicionar conversões de tipo explícitas." +msgid "huge_page_size must be 0 on this platform." +msgstr "huge_page_size deve ser 0 nessa plataforma." -#: parser/parse_oper.c:720 +#: port/pg_shmem.c:646 port/sysv_shmem.c:646 #, c-format -msgid "No operator matches the given name and argument type(s). You might need to add explicit type casts." -msgstr "Nenhum operador corresponde com o nome e o(s) tipo(s) de argumento(s) informados. Você precisa adicionar conversões de tipo explícitas." +msgid "could not map anonymous shared memory: %m" +msgstr "não foi possível mapear memória compartilhada anônima: %m" -#: parser/parse_oper.c:779 parser/parse_oper.c:893 +#: port/pg_shmem.c:648 port/sysv_shmem.c:648 #, c-format -msgid "operator is only a shell: %s" -msgstr "operador é indefinido: %s" +msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." +msgstr "Esse erro usualmente significa que a requisição do PostgreSQL por segmento de memória compartilhada excedeu a memória, espaço de swap ou páginas grandes disponível. Para reduzir o tamanho requisitado (atualmente %zu bytes), reduza o uso de memória compartilhada pelo PostgreSQL, talvez reduzindo shared_buffers ou max_connections." -#: parser/parse_oper.c:881 +#: port/pg_shmem.c:716 port/sysv_shmem.c:716 #, c-format -msgid "op ANY/ALL (array) requires array on right side" -msgstr "op ANY/ALL (array) requer matriz no lado direito" +msgid "huge pages not supported on this platform" +msgstr "páginas grandes não são suportadas nesta plataforma" -#: parser/parse_oper.c:923 +#: port/pg_shmem.c:723 port/sysv_shmem.c:723 #, c-format -msgid "op ANY/ALL (array) requires operator to yield boolean" -msgstr "op ANY/ALL (array) requer operador que retorna booleano" +msgid "huge pages not supported with the current shared_memory_type setting" +msgstr "" -#: parser/parse_oper.c:928 +#: port/pg_shmem.c:783 port/sysv_shmem.c:783 utils/init/miscinit.c:1358 #, c-format -msgid "op ANY/ALL (array) requires operator not to return a set" -msgstr "op ANY/ALL (array) requer operador que não retorne um conjunto" +msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" +msgstr "bloco de memória compartilhada existente (chave %lu, ID %lu) ainda está em uso" -#: parser/parse_param.c:216 +#: port/pg_shmem.c:786 port/sysv_shmem.c:786 utils/init/miscinit.c:1360 #, c-format -msgid "inconsistent types deduced for parameter $%d" -msgstr "tipos inconsitentes deduzidos do parâmetro $%d" +msgid "Terminate any old server processes associated with data directory \"%s\"." +msgstr "" -#: parser/parse_relation.c:172 +#: port/sysv_sema.c:120 #, c-format -msgid "table reference \"%s\" is ambiguous" -msgstr "referência a tabela \"%s\" é ambígua" +msgid "could not create semaphores: %m" +msgstr "não foi possível criar semáforos: %m" -#: parser/parse_relation.c:216 +#: port/sysv_sema.c:121 #, c-format -msgid "table reference %u is ambiguous" -msgstr "referência a tabela %u é ambígua" +msgid "Failed system call was semget(%lu, %d, 0%o)." +msgstr "Falhou ao executar chamada de sistema semget(%lu, %d, 0%o)." -#: parser/parse_relation.c:395 +#: port/sysv_sema.c:125 #, c-format -msgid "table name \"%s\" specified more than once" -msgstr "nome da tabela \"%s\" foi especificado mais de uma vez" +msgid "" +"This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its max_connections parameter.\n" +"The PostgreSQL documentation contains more information about configuring your system for PostgreSQL." +msgstr "" +"Esse erro *não* significa que você está sem espaço no disco. Isso ocorre quando o número máximo de conjuntos de semáforos (SEMMNI) atinge o limite do sistema ou o sistema atinge o número máximo de semáforos (SEMMNS). Você precisa aumentar o parâmetro do kernel que trata disso. Alternativamente, reduza o consumo de semáforos do PostgreSQL reduzindo o parâmetro max_connections.\n" +"A documentação do PostgreSQL contém informações adicionais sobre como configurar seu sistema para PostgreSQL." -#: parser/parse_relation.c:422 parser/parse_relation.c:2839 +#: port/sysv_sema.c:155 #, c-format -msgid "invalid reference to FROM-clause entry for table \"%s\"" -msgstr "referência inválida para tabela \"%s\" na cláusula FROM" +msgid "You possibly need to raise your kernel's SEMVMX value to be at least %d. Look into the PostgreSQL documentation for details." +msgstr "Você possivelmente precisa aumentar o valor SEMVMX do kernel para pelo menos %d. Veja na documentação do PostgreSQL para obter detalhes." -#: parser/parse_relation.c:425 parser/parse_relation.c:2844 +#: port/win32/crashdump.c:119 #, c-format -msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." -msgstr "Há uma entrada para tabela \"%s\", mas ela não pode ser referenciada desta parte da consulta." +msgid "could not load dbghelp.dll, cannot write crash dump\n" +msgstr "não foi possível carregar dbghelp.dll, não pode escrever a descarga da memória\n" -#: parser/parse_relation.c:427 +#: port/win32/crashdump.c:127 #, c-format -msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." -msgstr "O tipo de JOIN deve ser INNER ou LEFT para uma referência LATERAL." +msgid "could not load required functions in dbghelp.dll, cannot write crash dump\n" +msgstr "não foi possível carregar as funções requeridas em dbghelp.dll, não pode escrever a descarga da memória\n" -#: parser/parse_relation.c:591 +#: port/win32/crashdump.c:158 #, c-format -msgid "system column \"%s\" reference in check constraint is invalid" -msgstr "coluna do sistema \"%s\" referenciada na restrição de verificação é inválida" +msgid "could not open crash dump file \"%s\" for writing: error code %lu\n" +msgstr "não foi possível abrir o arquivo de descarga de memória \"%s\" para escrita: código de erro %lu\n" -#: parser/parse_relation.c:892 parser/parse_relation.c:1169 -#: parser/parse_relation.c:1663 +#: port/win32/crashdump.c:165 #, c-format -msgid "table \"%s\" has %d columns available but %d columns specified" -msgstr "tabela \"%s\" tem %d colunas disponíveis mas %d colunas foram especificadas" +msgid "wrote crash dump to file \"%s\"\n" +msgstr "escreveu a descarga da memória para o arquivo \"%s\"\n" -#: parser/parse_relation.c:979 +#: port/win32/crashdump.c:167 #, c-format -msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." -msgstr "Há um item WITH nomeado \"%s\", mas ele não pode ser referenciado desta parte da consulta." +msgid "could not write crash dump to file \"%s\": error code %lu\n" +msgstr "não foi possível escrever a descarga da memória no arquivo \"%s\": código de erro %lu\n" -#: parser/parse_relation.c:981 +#: port/win32/signal.c:240 #, c-format -msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." -msgstr "Utilize WITH RECURSIVE ou reordene os itens WITH para remover referências posteriores." +msgid "could not create signal listener pipe for PID %d: error code %lu" +msgstr "não foi possível criar pipe que espera por sinal para PID %d: código de erro %lu" -#: parser/parse_relation.c:1287 +#: port/win32/signal.c:295 #, c-format -msgid "a column definition list is only allowed for functions returning \"record\"" -msgstr "uma lista de definição de colunas somente é permitida para funções que retornam \"record\"" +msgid "could not create signal listener pipe: error code %lu; retrying\n" +msgstr "não foi possível criar pipe que espera por sinal: código de erro %lu; tentando novamente\n" -#: parser/parse_relation.c:1296 +#: port/win32_sema.c:104 #, c-format -msgid "a column definition list is required for functions returning \"record\"" -msgstr "uma lista de definição de colunas é requerida para funções que retornam \"record\"" +msgid "could not create semaphore: error code %lu" +msgstr "não foi possível criar semáforo: código de erro %lu" -#: parser/parse_relation.c:1375 +#: port/win32_sema.c:180 #, c-format -msgid "function \"%s\" in FROM has unsupported return type %s" -msgstr "função \"%s\" no FROM tem tipo de retorno %s que não é suportado" +msgid "could not lock semaphore: error code %lu" +msgstr "não foi possível bloquear semáforo: código de erro %lu" -#: parser/parse_relation.c:1495 +#: port/win32_sema.c:200 #, c-format -msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" -msgstr "listas de VALUES \"%s\" tem %d colunas disponíveis mas %d colunas foram especificadas" +msgid "could not unlock semaphore: error code %lu" +msgstr "não foi possível desbloquear semáforo: código de erro %lu" -#: parser/parse_relation.c:1548 +#: port/win32_sema.c:230 #, c-format -msgid "joins can have at most %d columns" -msgstr "junções podem ter no máximo %d colunas" +msgid "could not try-lock semaphore: error code %lu" +msgstr "não foi possível tentar bloquear semáforo: código de erro %lu" -#: parser/parse_relation.c:1636 +#: port/win32_shmem.c:146 port/win32_shmem.c:161 port/win32_shmem.c:173 +#: port/win32_shmem.c:189 #, c-format -msgid "WITH query \"%s\" does not have a RETURNING clause" -msgstr "consulta WITH \"%s\" não tem uma cláusula RETURNING" +msgid "could not enable user right \"%s\": error code %lu" +msgstr "não foi possível ativar o direito do usuário \"%s\": código de erro %lu" + +#. translator: This is a term from Windows and should be translated to +#. match the Windows localization. +#. +#: port/win32_shmem.c:152 port/win32_shmem.c:161 port/win32_shmem.c:173 +#: port/win32_shmem.c:184 port/win32_shmem.c:186 port/win32_shmem.c:189 +msgid "Lock pages in memory" +msgstr "Bloquear páginas na memória" -#: parser/parse_relation.c:2468 parser/parse_relation.c:2623 +#: port/win32_shmem.c:154 port/win32_shmem.c:162 port/win32_shmem.c:174 +#: port/win32_shmem.c:190 #, c-format -msgid "column %d of relation \"%s\" does not exist" -msgstr "coluna %d da relação \"%s\" não existe" +msgid "Failed system call was %s." +msgstr "A chamada do sistema com falha foi %s." -#: parser/parse_relation.c:2842 +#: port/win32_shmem.c:184 #, c-format -msgid "Perhaps you meant to reference the table alias \"%s\"." -msgstr "Talvez você quisesse referenciar o aliás de tabela \"%s\"." +msgid "could not enable user right \"%s\"" +msgstr "não foi possível ativar o direito do usuário \"%s\"" -#: parser/parse_relation.c:2850 +#: port/win32_shmem.c:185 #, c-format -msgid "missing FROM-clause entry for table \"%s\"" -msgstr "faltando entrada para tabela \"%s\" na cláusula FROM" +msgid "Assign user right \"%s\" to the Windows user account which runs PostgreSQL." +msgstr "" -#: parser/parse_relation.c:2890 +#: port/win32_shmem.c:244 #, c-format -msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." -msgstr "Há uma coluna chamada \"%s\", na tabela \"%s\", mas ela não pode ser referenciada desta parte da consulta." +msgid "the processor does not support large pages" +msgstr "o processador não dá suporte a páginas grandes" -#: parser/parse_target.c:402 parser/parse_target.c:693 +#: port/win32_shmem.c:313 port/win32_shmem.c:349 port/win32_shmem.c:374 #, c-format -msgid "cannot assign to system column \"%s\"" -msgstr "não pode atribuir a coluna do sistema \"%s\"" +msgid "could not create shared memory segment: error code %lu" +msgstr "não foi possível criar segmento de memória compartilhada: código de erro %lu" -#: parser/parse_target.c:430 +#: port/win32_shmem.c:314 #, c-format -msgid "cannot set an array element to DEFAULT" -msgstr "não pode definir um elemento de matriz como sendo o valor DEFAULT" +msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." +msgstr "Falhou ao executar chamada de sistema CreateFileMapping(size=%zu, name=%s)." -#: parser/parse_target.c:435 +#: port/win32_shmem.c:339 #, c-format -msgid "cannot set a subfield to DEFAULT" -msgstr "não pode definir um subcampo como sendo o valor DEFAULT" +msgid "pre-existing shared memory block is still in use" +msgstr "bloco de memória compartilhada pré-existente ainda está em uso" -#: parser/parse_target.c:504 +#: port/win32_shmem.c:340 #, c-format -msgid "column \"%s\" is of type %s but expression is of type %s" -msgstr "coluna \"%s\" é do tipo %s mas expressão é do tipo %s" +msgid "Check if there are any old server processes still running, and terminate them." +msgstr "Verifique se ainda há processos servidor antigos sendo executados, e termine-os." -#: parser/parse_target.c:677 +#: port/win32_shmem.c:350 #, c-format -msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" -msgstr "não pode atribuir ao campo \"%s\" da coluna \"%s\" porque seu tipo %s não é um tipo composto" +msgid "Failed system call was DuplicateHandle." +msgstr "Falhou ao executar chamada de sistema DuplicateHandle." -#: parser/parse_target.c:686 +#: port/win32_shmem.c:375 #, c-format -msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" -msgstr "não pode atribuir ao campo \"%s\" da coluna \"%s\" porque não há tal coluna no tipo de dado %s" +msgid "Failed system call was MapViewOfFileEx." +msgstr "Falhou ao executar chamada de sistema MapViewOfFileEx." -#: parser/parse_target.c:753 +#: postmaster/autovacuum.c:417 #, c-format -msgid "array assignment to \"%s\" requires type %s but expression is of type %s" -msgstr "atribuição de matriz para \"%s\" requer tipo %s mas expressão é do tipo %s" +msgid "could not fork autovacuum launcher process: %m" +msgstr "não foi possível criar processo inicializador do autovacuum: %m" -#: parser/parse_target.c:763 +#: postmaster/autovacuum.c:764 #, c-format -msgid "subfield \"%s\" is of type %s but expression is of type %s" -msgstr "subcampo \"%s\" é do tipo %s mas expressão é do tipo %s" +msgid "autovacuum worker took too long to start; canceled" +msgstr "" -#: parser/parse_target.c:1179 +#: postmaster/autovacuum.c:1489 #, c-format -msgid "SELECT * with no tables specified is not valid" -msgstr "SELECT * sem tabelas especificadas não é válido" +msgid "could not fork autovacuum worker process: %m" +msgstr "não foi possível criar processo de limpeza automática: %m" -#: parser/parse_type.c:84 +#: postmaster/autovacuum.c:2334 #, c-format -msgid "improper %%TYPE reference (too few dotted names): %s" -msgstr "referência a %%TYPE é inválida (nomes com poucos pontos): %s" +msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" +msgstr "autovacuum: removendo tabela temporária órfã \"%s.%s.%s\"" -#: parser/parse_type.c:106 +#: postmaster/autovacuum.c:2570 #, c-format -msgid "improper %%TYPE reference (too many dotted names): %s" -msgstr "referência a %%TYPE é inválida (nomes com muitos pontos): %s" +msgid "automatic vacuum of table \"%s.%s.%s\"" +msgstr "limpeza automática da tabela \"%s.%s.%s\"" -#: parser/parse_type.c:141 +#: postmaster/autovacuum.c:2573 #, c-format -msgid "type reference %s converted to %s" -msgstr "referência a tipo %s convertido para %s" +msgid "automatic analyze of table \"%s.%s.%s\"" +msgstr "análise automática da tabela \"%s.%s.%s\"" -#: parser/parse_type.c:257 parser/parse_type.c:805 utils/cache/typcache.c:198 +#: postmaster/autovacuum.c:2767 #, c-format -msgid "type \"%s\" is only a shell" -msgstr "tipo \"%s\" é indefinido" +msgid "processing work entry for relation \"%s.%s.%s\"" +msgstr "processando entrada de trabalho para a relação \"%s.%s.%s\"" -#: parser/parse_type.c:342 +#: postmaster/autovacuum.c:3381 #, c-format -msgid "type modifier is not allowed for type \"%s\"" -msgstr "modificador de tipo não é permitido para tipo \"%s\"" +msgid "autovacuum not started because of misconfiguration" +msgstr "o autovacuum não foi iniciado devido a uma configuração errada" -#: parser/parse_type.c:384 +#: postmaster/autovacuum.c:3382 #, c-format -msgid "type modifiers must be simple constants or identifiers" -msgstr "modificadores de tipo devem ser constantes ou identificadores" +msgid "Enable the \"track_counts\" option." +msgstr "Habilite a opção \"track_counts\"." -#: parser/parse_type.c:695 parser/parse_type.c:819 +#: postmaster/bgworker.c:259 #, c-format -msgid "invalid type name \"%s\"" -msgstr "nome de tipo \"%s\" é inválido" +msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" +msgstr "" -#: parser/parse_utilcmd.c:177 +#: postmaster/bgworker.c:669 #, c-format -msgid "relation \"%s\" already exists, skipping" -msgstr "relação \"%s\" já existe, ignorando" +msgid "background worker \"%s\": background workers without shared memory access are not supported" +msgstr "processo trabalhador em segundo plano \"%s\": processos trabalhadores em segundo plano sem acesso à memória compartilhada não têm suporte" -#: parser/parse_utilcmd.c:342 +#: postmaster/bgworker.c:680 #, c-format -msgid "array of serial is not implemented" -msgstr "matriz de serial não está implementada" +msgid "background worker \"%s\": cannot request database access if starting at postmaster start" +msgstr "processo filho em segundo plano \"%s\": não pode solicitar acesso a banco de dados se iniciado com o postmaster" -#: parser/parse_utilcmd.c:390 +#: postmaster/bgworker.c:694 #, c-format -msgid "%s will create implicit sequence \"%s\" for serial column \"%s.%s\"" -msgstr "%s criará sequência implícita \"%s\" para coluna serial \"%s.%s\"" +msgid "background worker \"%s\": invalid restart interval" +msgstr "processo filho em segundo plano \"%s\": o intervalo de reinício não é válido" -#: parser/parse_utilcmd.c:484 parser/parse_utilcmd.c:496 +#: postmaster/bgworker.c:709 #, c-format -msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" -msgstr "declarações NULL/NOT NULL conflitantes para coluna \"%s\" da tabela \"%s\"" +msgid "background worker \"%s\": parallel workers may not be configured for restart" +msgstr "processo trabalhador em segundo plano \"%s\": processos trabalhadores paralelos não podem ser configurados para reiniciar" -#: parser/parse_utilcmd.c:508 +#: postmaster/bgworker.c:733 tcop/postgres.c:3255 #, c-format -msgid "multiple default values specified for column \"%s\" of table \"%s\"" -msgstr "valores padrão múltiplos especificados para coluna \"%s\" da tabela \"%s\"" +msgid "terminating background worker \"%s\" due to administrator command" +msgstr "terminando o processo filho em segundo plano \"%s\" devido a um comando do administrador" -#: parser/parse_utilcmd.c:675 +#: postmaster/bgworker.c:890 #, c-format -msgid "LIKE is not supported for creating foreign tables" -msgstr "LIKE não é suportado para criar tabelas externas" +msgid "background worker \"%s\": must be registered in shared_preload_libraries" +msgstr "processo filho em segundo plano \"%s\": deve ser registrado em shared_preload_libraries" -#: parser/parse_utilcmd.c:1196 parser/parse_utilcmd.c:1272 +#: postmaster/bgworker.c:902 #, c-format -msgid "Index \"%s\" contains a whole-row table reference." -msgstr "Ãndice \"%s\" contém uma referência a todo registro da tabela." +msgid "background worker \"%s\": only dynamic background workers can request notification" +msgstr "processo filho em segundo plano \"%s\": somente processos filho dinâmicos em segundo plano podem requisitar notificação" -#: parser/parse_utilcmd.c:1539 +#: postmaster/bgworker.c:917 #, c-format -msgid "cannot use an existing index in CREATE TABLE" -msgstr "não pode utilizar um índice existente em CREATE TABLE" +msgid "too many background workers" +msgstr "muitos processos filho em segundo plano" -#: parser/parse_utilcmd.c:1559 +#: postmaster/bgworker.c:918 #, c-format -msgid "index \"%s\" is already associated with a constraint" -msgstr "índice \"%s\" já está associado com a restrição" +msgid "Up to %d background worker can be registered with the current settings." +msgid_plural "Up to %d background workers can be registered with the current settings." +msgstr[0] "Até %d processo filho em segundo plano pode ser registrado com as definições atuais." +msgstr[1] "Até %d processos filho em segundo plano podem ser registrados com as definições atuais." -#: parser/parse_utilcmd.c:1567 +#: postmaster/bgworker.c:922 #, c-format -msgid "index \"%s\" does not belong to table \"%s\"" -msgstr "índice \"%s\" não pertence a tabela \"%s\"" +msgid "Consider increasing the configuration parameter \"max_worker_processes\"." +msgstr "Considere aumentar o parâmetro de configuração \"max_worker_processes\"." -#: parser/parse_utilcmd.c:1574 +#: postmaster/checkpointer.c:431 #, c-format -msgid "index \"%s\" is not valid" -msgstr "índice \"%s\" não é válido" +msgid "checkpoints are occurring too frequently (%d second apart)" +msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" +msgstr[0] "pontos de controle estão ocorrendo frequentemente (%d segundo)" +msgstr[1] "pontos de controle estão ocorrendo frequentemente (%d segundos)" -#: parser/parse_utilcmd.c:1580 +#: postmaster/checkpointer.c:435 #, c-format -msgid "\"%s\" is not a unique index" -msgstr "\"%s\" não é um índice único" +msgid "Consider increasing the configuration parameter \"max_wal_size\"." +msgstr "Considere aumentar o parâmetro de configuração \"max_wal_size\"." -#: parser/parse_utilcmd.c:1581 parser/parse_utilcmd.c:1588 -#: parser/parse_utilcmd.c:1595 parser/parse_utilcmd.c:1665 +#: postmaster/checkpointer.c:1059 #, c-format -msgid "Cannot create a primary key or unique constraint using such an index." -msgstr "Não pode criar uma chave primária ou restrição de unicidade utilizando esse índice." +msgid "checkpoint request failed" +msgstr "pedido de ponto de controle falhou" -#: parser/parse_utilcmd.c:1587 +#: postmaster/checkpointer.c:1060 #, c-format -msgid "index \"%s\" contains expressions" -msgstr "índice \"%s\" contém expressões" +msgid "Consult recent messages in the server log for details." +msgstr "Consulte mensagens recentes no log do servidor para obter detalhes." -#: parser/parse_utilcmd.c:1594 +#: postmaster/pgarch.c:416 #, c-format -msgid "\"%s\" is a partial index" -msgstr "\"%s\" é um índice parcial" +msgid "archive_mode enabled, yet archiving is not configured" +msgstr "archive_mode ativado, mas o arquivamento não está configurado" -#: parser/parse_utilcmd.c:1606 +#: postmaster/pgarch.c:438 #, c-format -msgid "\"%s\" is a deferrable index" -msgstr "\"%s\" não é um índice postergável" +msgid "removed orphan archive status file \"%s\"" +msgstr "removido o arquivo de status de arquivamento órfão \"%s\"" -#: parser/parse_utilcmd.c:1607 +#: postmaster/pgarch.c:448 #, c-format -msgid "Cannot create a non-deferrable constraint using a deferrable index." -msgstr "Não pode criar uma restrição de unicidade não-postergável utilizando um índice postergável." +msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" +msgstr "a remoção do arquivo de status de arquivamento órfão \"%s\" falhou muitas vezes, será tentado novamente mais tarde" -#: parser/parse_utilcmd.c:1664 +#: postmaster/pgarch.c:484 #, c-format -msgid "index \"%s\" does not have default sorting behavior" -msgstr "índice \"%s\" não tem comportamento de ordenação padrão" +msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" +msgstr "o arquivamento do segmento de WAL \"%s\" falhou muitas vezes, será tentado novamente mais tarde" -#: parser/parse_utilcmd.c:1809 +#: postmaster/pgarch.c:791 postmaster/pgarch.c:830 #, c-format -msgid "column \"%s\" appears twice in primary key constraint" -msgstr "coluna \"%s\" aparece duas vezes na restrição de chave primária" +msgid "both archive_command and archive_library set" +msgstr "" -#: parser/parse_utilcmd.c:1815 +#: postmaster/pgarch.c:792 postmaster/pgarch.c:831 #, c-format -msgid "column \"%s\" appears twice in unique constraint" -msgstr "coluna \"%s\" aparece duas vezes na restrição de unicidade" +msgid "Only one of archive_command, archive_library may be set." +msgstr "" -#: parser/parse_utilcmd.c:1981 +#: postmaster/pgarch.c:809 #, c-format -msgid "index expression cannot return a set" -msgstr "expressão de índice não pode retornar um conjunto" +msgid "restarting archiver process because value of \"archive_library\" was changed" +msgstr "" -#: parser/parse_utilcmd.c:1992 +#: postmaster/pgarch.c:846 #, c-format -msgid "index expressions and predicates can refer only to the table being indexed" -msgstr "expressões e predicados de índice só podem referenciar a tabela que está sendo indexada" +msgid "archive modules have to define the symbol %s" +msgstr "" -#: parser/parse_utilcmd.c:2035 +#: postmaster/pgarch.c:852 #, c-format -msgid "rules on materialized views are not supported" -msgstr "regras em tabelas externas não são suportadas" +msgid "archive modules must register an archive callback" +msgstr "" -#: parser/parse_utilcmd.c:2096 +#: postmaster/postmaster.c:759 #, c-format -msgid "rule WHERE condition cannot contain references to other relations" -msgstr "condição WHERE de regra não pode conter referências a outras relações" +msgid "%s: invalid argument for option -f: \"%s\"\n" +msgstr "%s: o argumento não é válido para a opção -f: \"%s\"\n" -#: parser/parse_utilcmd.c:2168 +#: postmaster/postmaster.c:832 #, c-format -msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" -msgstr "regras com condições WHERE só podem ter ações SELECT, INSERT, UPDATE ou DELETE" +msgid "%s: invalid argument for option -t: \"%s\"\n" +msgstr "%s: o argumento não é válido para a opção -t: \"%s\"\n" -#: parser/parse_utilcmd.c:2186 parser/parse_utilcmd.c:2285 -#: rewrite/rewriteHandler.c:469 rewrite/rewriteManip.c:968 +#: postmaster/postmaster.c:855 #, c-format -msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" -msgstr "comandos condicionais UNION/INTERSECT/EXCEPT não estão implementados" +msgid "%s: invalid argument: \"%s\"\n" +msgstr "%s: argumento inválido: \"%s\"\n" -#: parser/parse_utilcmd.c:2204 +#: postmaster/postmaster.c:923 #, c-format -msgid "ON SELECT rule cannot use OLD" -msgstr "regra ON SELECT não pode utilizar OLD" +msgid "%s: superuser_reserved_connections (%d) plus reserved_connections (%d) must be less than max_connections (%d)\n" +msgstr "%s: superuser_reserved_connections (%d) mais reserved_connections (%d) deve ser menor que max_connections (%d)\n" -#: parser/parse_utilcmd.c:2208 +#: postmaster/postmaster.c:931 #, c-format -msgid "ON SELECT rule cannot use NEW" -msgstr "regra ON SELECT não pode utilizar NEW" +msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" +msgstr "" -#: parser/parse_utilcmd.c:2217 +#: postmaster/postmaster.c:934 #, c-format -msgid "ON INSERT rule cannot use OLD" -msgstr "regra ON INSERT não pode utilizar OLD" +msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" +msgstr "O fluxo de WAL (max_wal_senders > 0) requer wal_level \"replica\" ou \"logical\"" -#: parser/parse_utilcmd.c:2223 +#: postmaster/postmaster.c:942 #, c-format -msgid "ON DELETE rule cannot use NEW" -msgstr "regra ON DELETE não pode utilizar NEW" +msgid "%s: invalid datetoken tables, please fix\n" +msgstr "%s: tabelas de palavras chave de datas são inválidas, por favor conserte\n" -#: parser/parse_utilcmd.c:2251 +#: postmaster/postmaster.c:1099 #, c-format -msgid "cannot refer to OLD within WITH query" -msgstr "não pode referenciar OLD em uma consulta WITH" +msgid "could not create I/O completion port for child queue" +msgstr "não foi possível criar porta de conclusão de I/O para fila de filhos" -#: parser/parse_utilcmd.c:2258 +#: postmaster/postmaster.c:1175 #, c-format -msgid "cannot refer to NEW within WITH query" -msgstr "não pode referenciar NEW em uma consulta WITH" +msgid "ending log output to stderr" +msgstr "terminando saída do log para stderr" -#: parser/parse_utilcmd.c:2541 +#: postmaster/postmaster.c:1176 #, c-format -msgid "misplaced DEFERRABLE clause" -msgstr "cláusula DEFERRABLE no lugar errado" +msgid "Future log output will go to log destination \"%s\"." +msgstr "Saída futura do log será enviada para \"%s\"." -#: parser/parse_utilcmd.c:2546 parser/parse_utilcmd.c:2561 +#: postmaster/postmaster.c:1187 #, c-format -msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" -msgstr "múltiplas cláusulas DEFERRABLE/NOT DEFERRABLE não são permitidas" +msgid "starting %s" +msgstr "iniciando %s" -#: parser/parse_utilcmd.c:2556 +#: postmaster/postmaster.c:1239 #, c-format -msgid "misplaced NOT DEFERRABLE clause" -msgstr "cláusula NOT DEFERRABLE no lugar errado" +msgid "could not create listen socket for \"%s\"" +msgstr "não foi possível criar soquete de escuta para \"%s\"" -#: parser/parse_utilcmd.c:2577 +#: postmaster/postmaster.c:1245 #, c-format -msgid "misplaced INITIALLY DEFERRED clause" -msgstr "cláusula INITIALLY DEFERRED no lugar errado" +msgid "could not create any TCP/IP sockets" +msgstr "não foi possível criar nenhum soquete TCP/IP" -#: parser/parse_utilcmd.c:2582 parser/parse_utilcmd.c:2608 +#: postmaster/postmaster.c:1277 #, c-format -msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" -msgstr "múltiplas cláusulas INITTIALLY IMMEDIATE/DEFERRED não são permitidas" +msgid "DNSServiceRegister() failed: error code %ld" +msgstr "DNSServiceRegister() falhou: código de erro %ld" -#: parser/parse_utilcmd.c:2603 +#: postmaster/postmaster.c:1328 #, c-format -msgid "misplaced INITIALLY IMMEDIATE clause" -msgstr "cláusula INITIALLY IMMEDIATE no lugar errado" +msgid "could not create Unix-domain socket in directory \"%s\"" +msgstr "não foi possível criar soquete de domínio Unix no diretório \"%s\"" -#: parser/parse_utilcmd.c:2794 +#: postmaster/postmaster.c:1334 #, c-format -msgid "CREATE specifies a schema (%s) different from the one being created (%s)" -msgstr "CREATE especificou um esquema (%s) diferente daquele que foi criado (%s)" +msgid "could not create any Unix-domain sockets" +msgstr "não foi possível criar nenhum soquete de domínio Unix" -#: parser/scansup.c:194 +#: postmaster/postmaster.c:1345 #, c-format -msgid "identifier \"%s\" will be truncated to \"%s\"" -msgstr "identificador \"%s\" será truncado para \"%s\"" +msgid "no socket created for listening" +msgstr "nenhum soquete criado para escutar" -#: port/pg_latch.c:336 port/unix_latch.c:336 +#: postmaster/postmaster.c:1376 #, c-format -msgid "poll() failed: %m" -msgstr "poll() falhou: %m" +msgid "%s: could not change permissions of external PID file \"%s\": %s\n" +msgstr "%s: não foi possível mudar as permissões do arquivo externo do PID \"%s\": %s\n" -#: port/pg_latch.c:423 port/unix_latch.c:423 -#: replication/libpqwalreceiver/libpqwalreceiver.c:363 +#: postmaster/postmaster.c:1380 #, c-format -msgid "select() failed: %m" -msgstr "select() falhou: %m" +msgid "%s: could not write external PID file \"%s\": %s\n" +msgstr "%s: não foi possível escrever no arquivo externo do PID \"%s\": %s\n" -#: port/pg_sema.c:113 port/sysv_sema.c:113 +#. translator: %s is a configuration file +#: postmaster/postmaster.c:1408 utils/init/postinit.c:221 #, c-format -msgid "could not create semaphores: %m" -msgstr "não pôde criar semáforos: %m" +msgid "could not load %s" +msgstr "não foi possível carregar %s" -#: port/pg_sema.c:114 port/sysv_sema.c:114 +#: postmaster/postmaster.c:1434 #, c-format -msgid "Failed system call was semget(%lu, %d, 0%o)." -msgstr "Falhou ao executar chamada de sistema semget(%lu, %d, 0%o)." +msgid "postmaster became multithreaded during startup" +msgstr "" -#: port/pg_sema.c:118 port/sysv_sema.c:118 +#: postmaster/postmaster.c:1435 #, c-format -msgid "" -"This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its max_connections parameter.\n" -"The PostgreSQL documentation contains more information about configuring your system for PostgreSQL." +msgid "Set the LC_ALL environment variable to a valid locale." msgstr "" -"Esse erro *não* significa que você está sem espaço no disco. Isso ocorre quando o número máximo de conjuntos de semáforos (SEMMNI) atinge o limite do sistema ou o sistema atinge o número máximo de semáforos (SEMMNS). Você precisa aumentar o parâmetro do kernel que trata disso. Alternativamente, reduza o consumo de semáforos do PostgreSQL reduzindo o parâmetro max_connections.\n" -"A documentação do PostgreSQL contém informações adicionais sobre como configurar seu sistema para PostgreSQL." -#: port/pg_sema.c:148 port/sysv_sema.c:148 +#: postmaster/postmaster.c:1536 #, c-format -msgid "You possibly need to raise your kernel's SEMVMX value to be at least %d. Look into the PostgreSQL documentation for details." -msgstr "Você possivelmente precisa aumentar o valor SEMVMX do kernel para pelo menos %d. Veja na documentação do PostgreSQL para obter detalhes." +msgid "%s: could not locate my own executable path" +msgstr "%s: não foi possível localizar meu próprio caminho do executável" -#: port/pg_shmem.c:141 port/sysv_shmem.c:141 +#: postmaster/postmaster.c:1543 #, c-format -msgid "could not create shared memory segment: %m" -msgstr "não pôde criar segmento de memória compartilhada: %m" +msgid "%s: could not locate matching postgres executable" +msgstr "%s: não foi possível localizar o executável do postgres correspondente" -#: port/pg_shmem.c:142 port/sysv_shmem.c:142 +#: postmaster/postmaster.c:1566 utils/misc/tzparser.c:340 #, c-format -msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." -msgstr "Falhou ao executar chamada de sistema shmget(key=%lu, size=%zu, 0%o)." +msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." +msgstr "Isto pode indicar uma instalação incompleta do PostgreSQL ou que o arquivo \"%s\" foi movido do local apropriado." -#: port/pg_shmem.c:146 port/sysv_shmem.c:146 +#: postmaster/postmaster.c:1593 #, c-format msgid "" -"This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" -"The PostgreSQL documentation contains more information about shared memory configuration." +"%s: could not find the database system\n" +"Expected to find it in the directory \"%s\",\n" +"but could not open file \"%s\": %s\n" msgstr "" -"Esse erro usualmente significa que a requisição do PostgreSQL por segmento de memória compartilhada excedeu o parâmetro SHMMAX do kernel ou possivelmente que é menor do que o parâmetro SHMMIN do kernel.\n" -"A documentação do PostgreSQL contém informações adicionais sobre configuração de memória compartilhada." +"%s: não foi possível encontrar o sistema de banco de dados\n" +"Era esperado encontrá-lo no diretório \"%s\",\n" +"mas não foi possível abrir o arquivo \"%s\": %s\n" -#: port/pg_shmem.c:153 port/sysv_shmem.c:153 +#. translator: %s is SIGKILL or SIGABRT +#: postmaster/postmaster.c:1890 #, c-format -msgid "" -"This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" -"The PostgreSQL documentation contains more information about shared memory configuration." +msgid "issuing %s to recalcitrant children" msgstr "" -"Esse erro usualmente significa que a requisição do PostgreSQL por segmento de memória compartilhada excedeu o parâmetro SHMALL do kernel. Talvez seja necessário reconfigurar o kernel com SHMALL maior.\n" -"A documentação do PostgreSQL contém informações adicionais sobre configuração de memória compartilhada." -#: port/pg_shmem.c:159 port/sysv_shmem.c:159 +#: postmaster/postmaster.c:1912 #, c-format -msgid "" -"This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" -"The PostgreSQL documentation contains more information about shared memory configuration." +msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "" -"Esse erro *não* significa que você está sem espaço em disco. Isso ocorre se todos os IDs de memória compartilhadas estão sendo usados, neste caso você precisa aumentar o parâmetro SHMMNI do seu kernel, ou porque o limite do sistema para memória compartilhada foi alcançado.\n" -"A documentação do PostgreSQL contém informações adicionais sobre configuração de memória compartilhada." - -#: port/pg_shmem.c:340 port/sysv_shmem.c:340 -#, c-format -msgid "huge TLB pages not supported on this platform" -msgstr "páginas grandes do TLB não são suportadas nesta plataforma" - -#: port/pg_shmem.c:390 port/sysv_shmem.c:390 -#, c-format -msgid "could not map anonymous shared memory: %m" -msgstr "não pôde mapear memória compartilhada anônima: %m" - -#: port/pg_shmem.c:392 port/sysv_shmem.c:392 -#, c-format -msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." -msgstr "Esse erro usualmente significa que a requisição do PostgreSQL por segmento de memória compartilhada excedeu a memória, espaço de swap ou páginas grandes disponível. Para reduzir o tamanho requisitado (atualmente %zu bytes), reduza o uso de memória compartilhada pelo PostgreSQL, talvez reduzindo shared_buffers ou max_connections." -#: port/pg_shmem.c:439 port/sysv_shmem.c:439 port/win32_shmem.c:136 +#: postmaster/postmaster.c:1987 postmaster/postmaster.c:2015 #, c-format -msgid "huge pages not supported on this platform" -msgstr "páginas grandes não são suportadas nesta plataforma" +msgid "incomplete startup packet" +msgstr "pacote de ativação incompleto" -#: port/pg_shmem.c:553 port/sysv_shmem.c:553 +#: postmaster/postmaster.c:1999 postmaster/postmaster.c:2032 #, c-format -msgid "could not stat data directory \"%s\": %m" -msgstr "não pôde executar stat no diretório de dados \"%s\": %m" +msgid "invalid length of startup packet" +msgstr "comprimento inválido do pacote de ativação" -#: port/win32/crashdump.c:108 +#: postmaster/postmaster.c:2061 #, c-format -msgid "could not load dbghelp.dll, cannot write crash dump\n" -msgstr "não pôde carregar dbghelp.dll, não pode escrever despejo de memória\n" +msgid "failed to send SSL negotiation response: %m" +msgstr "falhou ao enviar resposta de negociação SSL: %m" -#: port/win32/crashdump.c:116 +#: postmaster/postmaster.c:2079 #, c-format -msgid "could not load required functions in dbghelp.dll, cannot write crash dump\n" -msgstr "não pôde carregar funções requeridas em dbghelp.dll, não pode escrever despejo de memória\n" +msgid "received unencrypted data after SSL request" +msgstr "recebido dados não encriptados após solicitação SSL" -#: port/win32/crashdump.c:147 +#: postmaster/postmaster.c:2080 postmaster/postmaster.c:2124 #, c-format -msgid "could not open crash dump file \"%s\" for writing: error code %lu\n" -msgstr "não pôde abrir arquivo de despejo de memória \"%s\" para escrita: código de erro %lu\n" +msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." +msgstr "" -#: port/win32/crashdump.c:154 +#: postmaster/postmaster.c:2105 #, c-format -msgid "wrote crash dump to file \"%s\"\n" -msgstr "escreveu despejo de memória para arquivo \"%s\"\n" +msgid "failed to send GSSAPI negotiation response: %m" +msgstr "falha ao enviar resposta de negociação GSSAPI: %m" -#: port/win32/crashdump.c:156 +#: postmaster/postmaster.c:2123 #, c-format -msgid "could not write crash dump to file \"%s\": error code %lu\n" -msgstr "não pôde escrever despejo de memória no arquivo \"%s\": código de erro %lu\n" +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "recebido dados não encriptados após solicitação de encriptação GSSAPI" -#: port/win32/security.c:43 +#: postmaster/postmaster.c:2147 #, c-format -msgid "could not open process token: error code %lu\n" -msgstr "não pôde abrir informação sobre processo: código de erro %lu\n" +msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" +msgstr "protocolo do cliente %u.%u não é suportado: servidor suporta %u.0 a %u.%u" -#: port/win32/security.c:63 +#: postmaster/postmaster.c:2214 #, c-format -msgid "could not get SID for Administrators group: error code %lu\n" -msgstr "não pôde obter SID do grupo Administrators: código de erro %lu\n" +msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." +msgstr "Os valores válidos são: \"false\", 0, \"true\", 1, \"database\"." -#: port/win32/security.c:72 +#: postmaster/postmaster.c:2255 #, c-format -msgid "could not get SID for PowerUsers group: error code %lu\n" -msgstr "não pôde obter SID do grupo PowerUsers: código de erro %lu\n" +msgid "invalid startup packet layout: expected terminator as last byte" +msgstr "o formato do pacote de ativação não é válido: esperado terminador como último byte" -#: port/win32/signal.c:193 +#: postmaster/postmaster.c:2272 #, c-format -msgid "could not create signal listener pipe for PID %d: error code %lu" -msgstr "não pôde criar pipe que espera por sinal para PID %d: código de erro %lu" +msgid "no PostgreSQL user name specified in startup packet" +msgstr "nenhum nome de usuário PostgreSQL especificado no pacote de ativação" -#: port/win32/signal.c:273 port/win32/signal.c:305 +#: postmaster/postmaster.c:2336 #, c-format -msgid "could not create signal listener pipe: error code %lu; retrying\n" -msgstr "não pôde criar pipe que espera por sinal: código de erro %lu; tentando novamente\n" +msgid "the database system is starting up" +msgstr "o sistema de banco de dados está iniciando" -#: port/win32/signal.c:316 +#: postmaster/postmaster.c:2342 #, c-format -msgid "could not create signal dispatch thread: error code %lu\n" -msgstr "não pôde criar thread de envio de sinal: código de erro %lu\n" +msgid "the database system is not yet accepting connections" +msgstr "o sistema de banco de dados ainda não está aceitando conexões" -#: port/win32_sema.c:94 +#: postmaster/postmaster.c:2343 #, c-format -msgid "could not create semaphore: error code %lu" -msgstr "não pôde criar semáforo: código de erro %lu" +msgid "Consistent recovery state has not been yet reached." +msgstr "O estado de recuperação consistente ainda não foi alcançado." -#: port/win32_sema.c:165 +#: postmaster/postmaster.c:2347 #, c-format -msgid "could not lock semaphore: error code %lu" -msgstr "não pôde bloquear semáforo: código de erro %lu" +msgid "the database system is not accepting connections" +msgstr "o sistema de banco de dados não está aceitando conexões" -#: port/win32_sema.c:178 +#: postmaster/postmaster.c:2348 #, c-format -msgid "could not unlock semaphore: error code %lu" -msgstr "não pôde desbloquear semáforo: código de erro %lu" +msgid "Hot standby mode is disabled." +msgstr "O modo de servidor em espera ativa (Hot Standby) está desativado." -#: port/win32_sema.c:207 +#: postmaster/postmaster.c:2353 #, c-format -msgid "could not try-lock semaphore: error code %lu" -msgstr "não pôde tentar bloquear semáforo: código de erro %lu" +msgid "the database system is shutting down" +msgstr "o sistema de banco de dados está desligando" -#: port/win32_shmem.c:175 port/win32_shmem.c:210 port/win32_shmem.c:231 +#: postmaster/postmaster.c:2358 #, c-format -msgid "could not create shared memory segment: error code %lu" -msgstr "não pôde criar segmento de memória compartilhada: código de erro %lu" +msgid "the database system is in recovery mode" +msgstr "o sistema de banco de dados está em modo de recuperação" -#: port/win32_shmem.c:176 +#: postmaster/postmaster.c:2363 storage/ipc/procarray.c:491 +#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:353 #, c-format -msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." -msgstr "Falhou ao executar chamada de sistema CreateFileMapping(size=%zu, name=%s)." +msgid "sorry, too many clients already" +msgstr "desculpe, muitos clientes conectados" -#: port/win32_shmem.c:200 +#: postmaster/postmaster.c:2450 #, c-format -msgid "pre-existing shared memory block is still in use" -msgstr "bloco de memória compartilhada pré-existente ainda está em uso" +msgid "wrong key in cancel request for process %d" +msgstr "chave incorreta no pedido de cancelamento do processo %d" -#: port/win32_shmem.c:201 +#: postmaster/postmaster.c:2462 #, c-format -msgid "Check if there are any old server processes still running, and terminate them." -msgstr "Verifique se ainda há processos servidor antigos sendo executados, e termine-os." +msgid "PID %d in cancel request did not match any process" +msgstr "PID %d no pedido de cancelamento não combina com nenhum processo" -#: port/win32_shmem.c:211 +#: postmaster/postmaster.c:2729 #, c-format -msgid "Failed system call was DuplicateHandle." -msgstr "Falhou ao executar chamada de sistema DuplicateHandle." +msgid "received SIGHUP, reloading configuration files" +msgstr "SIGHUP recebido, recarregando arquivos de configuração" -#: port/win32_shmem.c:232 +#. translator: %s is a configuration file +#: postmaster/postmaster.c:2753 postmaster/postmaster.c:2757 #, c-format -msgid "Failed system call was MapViewOfFileEx." -msgstr "Falhou ao executar chamada de sistema MapViewOfFileEx." +msgid "%s was not reloaded" +msgstr "%s não foi recarregado" -#: postmaster/autovacuum.c:380 +#: postmaster/postmaster.c:2767 #, c-format -msgid "could not fork autovacuum launcher process: %m" -msgstr "não pôde criar processo inicializador do autovacuum: %m" +msgid "SSL configuration was not reloaded" +msgstr "a configuração SSL não foi recarregada" -#: postmaster/autovacuum.c:425 +#: postmaster/postmaster.c:2857 #, c-format -msgid "autovacuum launcher started" -msgstr "inicializador do autovacuum foi iniciado" +msgid "received smart shutdown request" +msgstr "pedido de desligamento inteligente foi recebido" -#: postmaster/autovacuum.c:790 +#: postmaster/postmaster.c:2898 #, c-format -msgid "autovacuum launcher shutting down" -msgstr "inicializador do autovacuum está sendo desligado" +msgid "received fast shutdown request" +msgstr "pedido de desligamento rápido foi recebido" -#: postmaster/autovacuum.c:1453 +#: postmaster/postmaster.c:2916 #, c-format -msgid "could not fork autovacuum worker process: %m" -msgstr "não pôde criar processo de limpeza automática: %m" +msgid "aborting any active transactions" +msgstr "interrompendo quaisquer transações ativas" -#: postmaster/autovacuum.c:1672 +#: postmaster/postmaster.c:2940 #, c-format -msgid "autovacuum: processing database \"%s\"" -msgstr "autovacuum: processando banco de dados \"%s\"" +msgid "received immediate shutdown request" +msgstr "pedido de desligamento imediato foi recebido" -#: postmaster/autovacuum.c:2076 +#: postmaster/postmaster.c:3016 #, c-format -msgid "autovacuum: dropping orphan temp table \"%s\".\"%s\" in database \"%s\"" -msgstr "autovacuum: removendo tabela temporária órfã \"%s\".\"%s\" no banco de dados \"%s\"" +msgid "shutdown at recovery target" +msgstr "desligamento na meta da recuperação" -#: postmaster/autovacuum.c:2088 -#, c-format -msgid "autovacuum: found orphan temp table \"%s\".\"%s\" in database \"%s\"" -msgstr "autovacuum: encontrada tabela temporária órfã \"%s\".\"%s\" no banco de dados \"%s\"" +#: postmaster/postmaster.c:3034 postmaster/postmaster.c:3070 +msgid "startup process" +msgstr "processo de ativação" -#: postmaster/autovacuum.c:2353 +#: postmaster/postmaster.c:3037 #, c-format -msgid "automatic vacuum of table \"%s.%s.%s\"" -msgstr "limpeza automática da tabela \"%s.%s.%s\"" +msgid "aborting startup due to startup process failure" +msgstr "interrompendo a ativação devido a falha no processo de ativação" -#: postmaster/autovacuum.c:2356 +#: postmaster/postmaster.c:3110 #, c-format -msgid "automatic analyze of table \"%s.%s.%s\"" -msgstr "análise automática da tabela \"%s.%s.%s\"" +msgid "database system is ready to accept connections" +msgstr "sistema de banco de dados está pronto para aceitar conexões" -#: postmaster/autovacuum.c:2889 -#, c-format -msgid "autovacuum not started because of misconfiguration" -msgstr "autovacuum não foi iniciado por causa de configuração errada" +#: postmaster/postmaster.c:3131 +msgid "background writer process" +msgstr "processo escritor em segundo plano" -#: postmaster/autovacuum.c:2890 -#, c-format -msgid "Enable the \"track_counts\" option." -msgstr "Habilite a opção \"track_counts\"." +#: postmaster/postmaster.c:3178 +msgid "checkpointer process" +msgstr "processo de ponto de controle" -#: postmaster/bgworker.c:323 postmaster/bgworker.c:732 -#, c-format -msgid "registering background worker \"%s\"" -msgstr "registrando processo filho em segundo plano \"%s\"" +#: postmaster/postmaster.c:3194 +msgid "WAL writer process" +msgstr "processo escritor do WAL" -#: postmaster/bgworker.c:352 -#, c-format -msgid "unregistering background worker \"%s\"" -msgstr "cancelar registro de processo filho em segundo plano \"%s\"" +#: postmaster/postmaster.c:3209 +msgid "WAL receiver process" +msgstr "processo receptor do WAL" -#: postmaster/bgworker.c:454 -#, c-format -msgid "background worker \"%s\": must attach to shared memory in order to request a database connection" -msgstr "processo filho em segundo plano \"%s\": deve anexar a memória compartilhada para ser capaz de solicitar uma conexão com banco de dados" +#: postmaster/postmaster.c:3224 +msgid "autovacuum launcher process" +msgstr "processo inicializador do autovacuum" -#: postmaster/bgworker.c:463 -#, c-format -msgid "background worker \"%s\": cannot request database access if starting at postmaster start" -msgstr "processo filho em segundo plano \"%s\": não pode solicitar acesso a banco de dados se iniciado com o postmaster" +#: postmaster/postmaster.c:3242 +msgid "archiver process" +msgstr "processo arquivador" -#: postmaster/bgworker.c:477 -#, c-format -msgid "background worker \"%s\": invalid restart interval" -msgstr "processo filho em segundo plano \"%s\": intervalo de reinício é inválido" +#: postmaster/postmaster.c:3255 +msgid "system logger process" +msgstr "processo de relato do sistema (system logger)" -#: postmaster/bgworker.c:522 +#: postmaster/postmaster.c:3312 #, c-format -msgid "terminating background worker \"%s\" due to administrator command" -msgstr "terminando processo filho em segundo plano \"%s\" por causa de um comando do administrador" +msgid "background worker \"%s\"" +msgstr "processo trabalhador em segundo plano \"%s\"" -#: postmaster/bgworker.c:739 -#, c-format -msgid "background worker \"%s\": must be registered in shared_preload_libraries" -msgstr "processo filho em segundo plano \"%s\": deve ser registrado em shared_preload_libraries" +#: postmaster/postmaster.c:3391 postmaster/postmaster.c:3411 +#: postmaster/postmaster.c:3418 postmaster/postmaster.c:3436 +msgid "server process" +msgstr "processo servidor" -#: postmaster/bgworker.c:751 +#: postmaster/postmaster.c:3490 #, c-format -msgid "background worker \"%s\": only dynamic background workers can request notification" -msgstr "processo filho em segundo plano \"%s\": somente processos filho dinâmicos em segundo plano podem requisitar notificação" +msgid "terminating any other active server processes" +msgstr "terminando quaisquer outros processos servidor ativos" -#: postmaster/bgworker.c:766 +#. translator: %s is a noun phrase describing a child process, such as +#. "server process" +#: postmaster/postmaster.c:3665 #, c-format -msgid "too many background workers" -msgstr "muitos processos filho em segundo plano" +msgid "%s (PID %d) exited with exit code %d" +msgstr "%s (PID %d) terminou com código de retorno %d" -#: postmaster/bgworker.c:767 +#: postmaster/postmaster.c:3667 postmaster/postmaster.c:3679 +#: postmaster/postmaster.c:3689 postmaster/postmaster.c:3700 #, c-format -msgid "Up to %d background worker can be registered with the current settings." -msgid_plural "Up to %d background workers can be registered with the current settings." -msgstr[0] "Até %d processo filho em segundo plano pode ser registrado com as definições atuais." -msgstr[1] "Até %d processos filho em segundo plano podem ser registrados com as definições atuais." +msgid "Failed process was running: %s" +msgstr "Processo que falhou estava executando: %s" -#: postmaster/bgworker.c:771 +#. translator: %s is a noun phrase describing a child process, such as +#. "server process" +#: postmaster/postmaster.c:3676 #, c-format -msgid "Consider increasing the configuration parameter \"max_worker_processes\"." -msgstr "Considere aumentar o parâmetro de configuração \"max_worker_processes\"." +msgid "%s (PID %d) was terminated by exception 0x%X" +msgstr "%s (PID %d) foi terminado pela exceção 0x%X" -#: postmaster/checkpointer.c:481 +#. translator: %s is a noun phrase describing a child process, such as +#. "server process" +#: postmaster/postmaster.c:3686 #, c-format -msgid "checkpoints are occurring too frequently (%d second apart)" -msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" -msgstr[0] "pontos de controle estão ocorrendo frequentemente (%d segundo)" -msgstr[1] "pontos de controle estão ocorrendo frequentemente (%d segundos)" +msgid "%s (PID %d) was terminated by signal %d: %s" +msgstr "%s (PID %d) foi terminado pelo sinal %d: %s" -#: postmaster/checkpointer.c:485 +#. translator: %s is a noun phrase describing a child process, such as +#. "server process" +#: postmaster/postmaster.c:3698 #, c-format -msgid "Consider increasing the configuration parameter \"checkpoint_segments\"." -msgstr "Considere aumentar o parâmetro de configuração \"checkpoint_segments\"." +msgid "%s (PID %d) exited with unrecognized status %d" +msgstr "%s (PID %d) terminou com status desconhecido %d" -#: postmaster/checkpointer.c:630 +#: postmaster/postmaster.c:3906 #, c-format -msgid "transaction log switch forced (archive_timeout=%d)" -msgstr "rotação de log de transação foi forçada (archive_timeout=%d)" +msgid "abnormal database system shutdown" +msgstr "desligamento anormal do sistema de banco de dados" -#: postmaster/checkpointer.c:1083 +#: postmaster/postmaster.c:3932 #, c-format -msgid "checkpoint request failed" -msgstr "pedido de ponto de controle falhou" +msgid "shutting down due to startup process failure" +msgstr "desligando devido a falha no processo de ativação" -#: postmaster/checkpointer.c:1084 +#: postmaster/postmaster.c:3938 #, c-format -msgid "Consult recent messages in the server log for details." -msgstr "Consulte mensagens recentes no log do servidor para obter detalhes." +msgid "shutting down because restart_after_crash is off" +msgstr "" -#: postmaster/checkpointer.c:1280 +#: postmaster/postmaster.c:3950 #, c-format -msgid "compacted fsync request queue from %d entries to %d entries" -msgstr "fila de pedidos de fsync compactada de %d entradas para %d entradas" +msgid "all server processes terminated; reinitializing" +msgstr "todos os processos servidor foram terminados; reinicializando" -#: postmaster/pgarch.c:154 +#: postmaster/postmaster.c:4144 postmaster/postmaster.c:5462 +#: postmaster/postmaster.c:5860 #, c-format -msgid "could not fork archiver: %m" -msgstr "não pôde criar processo arquivador: %m" +msgid "could not generate random cancel key" +msgstr "não foi possível gerar a chave de cancelamento aleatória" -#: postmaster/pgarch.c:481 +#: postmaster/postmaster.c:4206 #, c-format -msgid "archive_mode enabled, yet archive_command is not set" -msgstr "archive_mode habilitado, mas archive_command não está definido" +msgid "could not fork new process for connection: %m" +msgstr "não foi possível criar novo processo para conexão: %m" -#: postmaster/pgarch.c:509 -#, c-format -msgid "archiving transaction log file \"%s\" failed too many times, will try again later" -msgstr "arquivar arquivo do log de transação \"%s\" falhou muitas vezes, tentará novamente depois" +#: postmaster/postmaster.c:4248 +msgid "could not fork new process for connection: " +msgstr "não foi possível criar novo processo para conexão: " -#: postmaster/pgarch.c:612 +#: postmaster/postmaster.c:4354 #, c-format -msgid "archive command failed with exit code %d" -msgstr "comando de arquivamento falhou com código de retorno %d" +msgid "connection received: host=%s port=%s" +msgstr "conexão recebida: host=%s porta=%s" -#: postmaster/pgarch.c:614 postmaster/pgarch.c:624 postmaster/pgarch.c:631 -#: postmaster/pgarch.c:637 postmaster/pgarch.c:646 +#: postmaster/postmaster.c:4359 #, c-format -msgid "The failed archive command was: %s" -msgstr "O comando de arquivamento que falhou foi: %s" +msgid "connection received: host=%s" +msgstr "conexão recebida: host=%s" -#: postmaster/pgarch.c:621 +#: postmaster/postmaster.c:4596 #, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "comando de arquivamento foi terminado pela exceção 0x%X" +msgid "could not execute server process \"%s\": %m" +msgstr "não foi possível executar processo servidor \"%s\": %m" -#: postmaster/pgarch.c:623 postmaster/postmaster.c:3303 +#: postmaster/postmaster.c:4654 #, c-format -msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "Veja o arquivo de cabeçalho C \"ntstatus.h\" para obter uma descrição do valor hexadecimal." +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "não foi possível criar o mapeamento do arquivo de parâmetros de processo servidor: código de erro %lu" -#: postmaster/pgarch.c:628 +#: postmaster/postmaster.c:4663 #, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "comando de arquivamento foi terminado pelo sinal %d: %s" +msgid "could not map backend parameter memory: error code %lu" +msgstr "não foi possível mapear a memória do parâmetro de processo servidor: código de erro %lu" -#: postmaster/pgarch.c:635 +#: postmaster/postmaster.c:4690 #, c-format -msgid "archive command was terminated by signal %d" -msgstr "comando de arquivamento foi terminado pelo sinal %d" +msgid "subprocess command line too long" +msgstr "" -#: postmaster/pgarch.c:644 +#: postmaster/postmaster.c:4708 #, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "comando de arquivamento terminou com status desconhecido %d" +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "falha na chamada de CreateProcess(): %m (código de erro %lu)" -#: postmaster/pgarch.c:656 +#: postmaster/postmaster.c:4735 #, c-format -msgid "archived transaction log file \"%s\"" -msgstr "arquivo do log de transação \"%s\" foi arquivado" +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "não foi possível suprimir a visão do arquivo de parâmetros de processo servidor: código de erro %lu" -#: postmaster/pgarch.c:705 +#: postmaster/postmaster.c:4739 #, c-format -msgid "could not open archive status directory \"%s\": %m" -msgstr "não pôde abrir diretório de status de arquivamento \"%s\": %m" +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "não foi possível fechar o tratador do arquivo de parâmetro de processo servidor: código de erro %lu" -#: postmaster/pgstat.c:354 +#: postmaster/postmaster.c:4761 #, c-format -msgid "could not resolve \"localhost\": %s" -msgstr "não pôde resolver \"localhost\": %s" +msgid "giving up after too many tries to reserve shared memory" +msgstr "" -#: postmaster/pgstat.c:377 +#: postmaster/postmaster.c:4762 #, c-format -msgid "trying another address for the statistics collector" -msgstr "tentando outro endereço para coletor de estatísticas" +msgid "This might be caused by ASLR or antivirus software." +msgstr "" -#: postmaster/pgstat.c:386 +#: postmaster/postmaster.c:4935 #, c-format -msgid "could not create socket for statistics collector: %m" -msgstr "não pôde criar soquete para coletor de estatísticas: %m" +msgid "SSL configuration could not be loaded in child process" +msgstr "" -#: postmaster/pgstat.c:398 +#: postmaster/postmaster.c:5060 #, c-format -msgid "could not bind socket for statistics collector: %m" -msgstr "não pôde se ligar ao soquete do coletor de estatísticas: %m" +msgid "Please report this to <%s>." +msgstr "Por favor relate isso para <%s>." -#: postmaster/pgstat.c:409 +#: postmaster/postmaster.c:5128 #, c-format -msgid "could not get address of socket for statistics collector: %m" -msgstr "não pôde pegar endereço do soquete do coletor de estatísticas: %m" +msgid "database system is ready to accept read-only connections" +msgstr "o sistema de banco de dados está pronto para aceitar conexões de leitura-apenas" -#: postmaster/pgstat.c:425 +#: postmaster/postmaster.c:5386 #, c-format -msgid "could not connect socket for statistics collector: %m" -msgstr "não pôde se conectar ao soquete do coletor de estatísticas: %m" +msgid "could not fork startup process: %m" +msgstr "não foi possível bifurcar (fork) o processo de ativação: %m" -#: postmaster/pgstat.c:446 +#: postmaster/postmaster.c:5390 #, c-format -msgid "could not send test message on socket for statistics collector: %m" -msgstr "não pôde enviar mensagem de teste ao soquete do coletor de estatísticas: %m" +msgid "could not fork archiver process: %m" +msgstr "não foi possível bifurcar (fork) o processo de arquivamento: %m" -#: postmaster/pgstat.c:472 +#: postmaster/postmaster.c:5394 #, c-format -msgid "select() failed in statistics collector: %m" -msgstr "select() falhou no coletor de estatísticas: %m" +msgid "could not fork background writer process: %m" +msgstr "não foi possível criar processo escritor em segundo plano: %m" -#: postmaster/pgstat.c:487 +#: postmaster/postmaster.c:5398 #, c-format -msgid "test message did not get through on socket for statistics collector" -msgstr "mensagem teste não foi recebida pelo soquete do coletor de estatísticas" +msgid "could not fork checkpointer process: %m" +msgstr "não foi possível criar processo de ponto de controle: %m" -#: postmaster/pgstat.c:502 +#: postmaster/postmaster.c:5402 #, c-format -msgid "could not receive test message on socket for statistics collector: %m" -msgstr "não pôde receber mensagem teste no soquete do coletor de estatísticas: %m" +msgid "could not fork WAL writer process: %m" +msgstr "não foi possível criar processo escritor do WAL: %m" -#: postmaster/pgstat.c:512 +#: postmaster/postmaster.c:5406 #, c-format -msgid "incorrect test message transmission on socket for statistics collector" -msgstr "transmissão de mensagem teste incorreta no soquete do coletor de estatísticas" +msgid "could not fork WAL receiver process: %m" +msgstr "não foi possível criar processo receptor do WAL: %m" -#: postmaster/pgstat.c:535 +#: postmaster/postmaster.c:5410 #, c-format -msgid "could not set statistics collector socket to nonblocking mode: %m" -msgstr "não pôde definir soquete do coletor de estatísticas para modo sem bloqueio: %m" +msgid "could not fork process: %m" +msgstr "não foi possível criar processo: %m" -#: postmaster/pgstat.c:545 +#: postmaster/postmaster.c:5611 postmaster/postmaster.c:5638 #, c-format -msgid "disabling statistics collector for lack of working socket" -msgstr "desabilitando coletor de estatísticas por falta de um soquete que funcione" +msgid "database connection requirement not indicated during registration" +msgstr "requisito de conexão com banco de dados não foi indicado durante o registro" -#: postmaster/pgstat.c:692 +#: postmaster/postmaster.c:5622 postmaster/postmaster.c:5649 #, c-format -msgid "could not fork statistics collector: %m" -msgstr "não pôde criar processo para coletor de estatísticas: %m" +msgid "invalid processing mode in background worker" +msgstr "o modo de processamento não é válido no processo filho em segundo plano" -#: postmaster/pgstat.c:1233 postmaster/pgstat.c:1257 postmaster/pgstat.c:1290 +#: postmaster/postmaster.c:5734 #, c-format -msgid "must be superuser to reset statistics counters" -msgstr "deve ser super-usuário para reiniciar contadores de estatísticas" +msgid "could not fork worker process: %m" +msgstr "não foi possível criar processo filho em segundo plano: %m" -#: postmaster/pgstat.c:1266 +#: postmaster/postmaster.c:5846 #, c-format -msgid "unrecognized reset target: \"%s\"" -msgstr "alvo de reinício desconhecido: \"%s\"" +msgid "no slot available for new worker process" +msgstr "nenhum encaixe disponível para novo processo trabalhador" -#: postmaster/pgstat.c:1267 +#: postmaster/postmaster.c:6177 #, c-format -msgid "Target must be \"archiver\" or \"bgwriter\"." -msgstr "Alvo deve ser \"archiver\" ou \"bgwriter\"." +msgid "could not duplicate socket %d for use in backend: error code %d" +msgstr "não foi possível duplicar soquete %d para uso pelo servidor: código de erro %d" -#: postmaster/pgstat.c:3280 +#: postmaster/postmaster.c:6209 #, c-format -msgid "could not read statistics message: %m" -msgstr "não pôde ler mensagem de estatística: %m" +msgid "could not create inherited socket: error code %d\n" +msgstr "não foi possível criar soquete herdado: código de erro %d\n" -#: postmaster/pgstat.c:3613 postmaster/pgstat.c:3790 +#: postmaster/postmaster.c:6238 #, c-format -msgid "could not open temporary statistics file \"%s\": %m" -msgstr "não pôde abrir arquivo de estatísticas temporário \"%s\": %m" +msgid "could not open backend variables file \"%s\": %s\n" +msgstr "não foi possível abrir o arquivo de variáveis ​​do processo servidor \"%s\": %s\n" -#: postmaster/pgstat.c:3681 postmaster/pgstat.c:3835 +#: postmaster/postmaster.c:6245 #, c-format -msgid "could not write temporary statistics file \"%s\": %m" -msgstr "não pôde escrever no arquivo de estatísticas temporário \"%s\": %m" +msgid "could not read from backend variables file \"%s\": %s\n" +msgstr "não foi possível ler do arquivo de variáveis do servidor \"%s\": %s\n" -#: postmaster/pgstat.c:3690 postmaster/pgstat.c:3844 +#: postmaster/postmaster.c:6254 #, c-format -msgid "could not close temporary statistics file \"%s\": %m" -msgstr "não pôde fechar arquivo de estatísticas temporário \"%s\": %m" +msgid "could not remove file \"%s\": %s\n" +msgstr "não foi possível remover o arquivo \"%s\": %s\n" -#: postmaster/pgstat.c:3698 postmaster/pgstat.c:3852 +#: postmaster/postmaster.c:6271 #, c-format -msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" -msgstr "não pôde renomear arquivo de estatísticas temporário \"%s\" para \"%s\": %m" +msgid "could not map view of backend variables: error code %lu\n" +msgstr "não foi possível mapear a visão de variáveis do servidor: código de erro %lu\n" -#: postmaster/pgstat.c:3935 postmaster/pgstat.c:4120 postmaster/pgstat.c:4275 +#: postmaster/postmaster.c:6280 #, c-format -msgid "could not open statistics file \"%s\": %m" -msgstr "não pôde abrir arquivo de estatísticas \"%s\": %m" +msgid "could not unmap view of backend variables: error code %lu\n" +msgstr "não foi possível liberar a visão de variáveis do servidor: código de erro %lu\n" -#: postmaster/pgstat.c:3947 postmaster/pgstat.c:3957 postmaster/pgstat.c:3967 -#: postmaster/pgstat.c:3988 postmaster/pgstat.c:4003 postmaster/pgstat.c:4061 -#: postmaster/pgstat.c:4132 postmaster/pgstat.c:4152 postmaster/pgstat.c:4170 -#: postmaster/pgstat.c:4186 postmaster/pgstat.c:4204 postmaster/pgstat.c:4220 -#: postmaster/pgstat.c:4287 postmaster/pgstat.c:4299 postmaster/pgstat.c:4311 -#: postmaster/pgstat.c:4336 postmaster/pgstat.c:4358 +#: postmaster/postmaster.c:6287 #, c-format -msgid "corrupted statistics file \"%s\"" -msgstr "arquivo de estatísticas \"%s\" corrompido" +msgid "could not close handle to backend parameter variables: error code %lu\n" +msgstr "não foi possível fechar o tratador de variáveis do processo servidor: código de erro %lu\n" -#: postmaster/pgstat.c:4785 +#: postmaster/postmaster.c:6446 #, c-format -msgid "database hash table corrupted during cleanup --- abort" -msgstr "tabela hash do banco de dados foi corrompida durante desligamento --- interrompendo" +msgid "could not read exit code for process\n" +msgstr "não foi possível ler código de retorno para processo\n" -#: postmaster/postmaster.c:650 +#: postmaster/postmaster.c:6488 #, c-format -msgid "%s: invalid argument for option -f: \"%s\"\n" -msgstr "%s: argumento é inválido para opção -f: \"%s\"\n" +msgid "could not post child completion status\n" +msgstr "não foi possível publicar status de conclusão do processo filho\n" -#: postmaster/postmaster.c:736 +#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 #, c-format -msgid "%s: invalid argument for option -t: \"%s\"\n" -msgstr "%s: argumento é inválido para opção -t: \"%s\"\n" +msgid "could not read from logger pipe: %m" +msgstr "não foi possível ler do pipe do logger: %m" -#: postmaster/postmaster.c:787 +#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 #, c-format -msgid "%s: invalid argument: \"%s\"\n" -msgstr "%s: argumento é inválido: \"%s\"\n" +msgid "could not create pipe for syslog: %m" +msgstr "não foi possível criar pipe para syslog: %m" -#: postmaster/postmaster.c:822 +#: postmaster/syslogger.c:677 #, c-format -msgid "%s: superuser_reserved_connections must be less than max_connections\n" -msgstr "%s: superuser_reserved_connections deve ser menor do que max_connections\n" +msgid "could not fork system logger: %m" +msgstr "não foi possível criar processo system logger: %m" -#: postmaster/postmaster.c:827 +#: postmaster/syslogger.c:713 #, c-format -msgid "%s: max_wal_senders must be less than max_connections\n" -msgstr "%s: max_wal_senders deve ser menor do que max_connections\n" +msgid "redirecting log output to logging collector process" +msgstr "redirecionando saída do log para processo coletor de log" -#: postmaster/postmaster.c:832 +#: postmaster/syslogger.c:714 #, c-format -msgid "WAL archival (archive_mode=on) requires wal_level \"archive\", \"hot_standby\", or \"logical\"" -msgstr "arquivamento do WAL (archive_mode=on) requer wal_level \"archive\", \"hot_standby\" ou \"logical\"" +msgid "Future log output will appear in directory \"%s\"." +msgstr "Saída futura do log aparecerá no diretório \"%s\"." -#: postmaster/postmaster.c:835 +#: postmaster/syslogger.c:722 #, c-format -msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"archive\", \"hot_standby\", or \"logical\"" -msgstr "envio do WAL (max_wal_senders > 0) requer wal_level \"archive\", \"hot_standby\" ou \"logical\"" +msgid "could not redirect stdout: %m" +msgstr "não foi possível redirecionar saída stdout: %m" -#: postmaster/postmaster.c:843 +#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 #, c-format -msgid "%s: invalid datetoken tables, please fix\n" -msgstr "%s: tabelas de palavras chave de datas são inválidas, por favor conserte\n" +msgid "could not redirect stderr: %m" +msgstr "não foi possível redirecionar saída stderr: %m" -#: postmaster/postmaster.c:925 postmaster/postmaster.c:1023 -#: utils/init/miscinit.c:1188 +#: postmaster/syslogger.c:1177 #, c-format -msgid "invalid list syntax in parameter \"%s\"" -msgstr "sintaxe de lista é inválida para parâmetro \"%s\"" +msgid "could not write to log file: %s\n" +msgstr "não foi possível escrever no arquivo de log: %s\n" -#: postmaster/postmaster.c:956 +#: postmaster/syslogger.c:1295 #, c-format -msgid "could not create listen socket for \"%s\"" -msgstr "não pôde criar soquete de escuta para \"%s\"" +msgid "could not open log file \"%s\": %m" +msgstr "não foi possível abrir o arquivo de log \"%s\": %m" -#: postmaster/postmaster.c:962 +#: postmaster/syslogger.c:1385 #, c-format -msgid "could not create any TCP/IP sockets" -msgstr "não pôde criar nenhum soquete TCP/IP" +msgid "disabling automatic rotation (use SIGHUP to re-enable)" +msgstr "desativando a rotação automática (use SIGHUP para ativá-la novamente)" -#: postmaster/postmaster.c:1045 +#: regex/regc_pg_locale.c:242 #, c-format -msgid "could not create Unix-domain socket in directory \"%s\"" -msgstr "não pôde criar soquete de domínio Unix no diretório \"%s\"" +msgid "could not determine which collation to use for regular expression" +msgstr "não foi possível determinar qual ordenação utilizar na expressão regular" -#: postmaster/postmaster.c:1051 +#: regex/regc_pg_locale.c:265 #, c-format -msgid "could not create any Unix-domain sockets" -msgstr "não pôde criar nenhum soquete de domínio Unix" +msgid "nondeterministic collations are not supported for regular expressions" +msgstr "ordenações não-determinísticas não têm suporte para expressões regulares" -#: postmaster/postmaster.c:1063 +#: repl_gram.y:301 repl_gram.y:333 #, c-format -msgid "no socket created for listening" -msgstr "nenhum soquete criado para escutar" +msgid "invalid timeline %u" +msgstr "linha do tempo %u é inválida" -#: postmaster/postmaster.c:1103 -#, c-format -msgid "could not create I/O completion port for child queue" -msgstr "não pôde criar porta de conclusão de I/O para fila de filhos" +#: repl_scanner.l:152 +msgid "invalid streaming start location" +msgstr "local de início do fluxo é inválido" -#: postmaster/postmaster.c:1132 +#: replication/libpqwalreceiver/libpqwalreceiver.c:206 +#: replication/libpqwalreceiver/libpqwalreceiver.c:293 #, c-format -msgid "%s: could not change permissions of external PID file \"%s\": %s\n" -msgstr "%s: não pôde mudar permissões do arquivo externo do PID \"%s\": %s\n" +msgid "password is required" +msgstr "a senha é requerida" -#: postmaster/postmaster.c:1136 +#: replication/libpqwalreceiver/libpqwalreceiver.c:207 #, c-format -msgid "%s: could not write external PID file \"%s\": %s\n" -msgstr "%s: não pôde escrever em arquivo externo do PID \"%s\": %s\n" +msgid "Non-superuser cannot connect if the server does not request a password." +msgstr "" -#: postmaster/postmaster.c:1160 +#: replication/libpqwalreceiver/libpqwalreceiver.c:208 #, c-format -msgid "ending log output to stderr" -msgstr "terminando saída do log para stderr" +msgid "Target server's authentication method must be changed, or set password_required=false in the subscription parameters." +msgstr "" -#: postmaster/postmaster.c:1161 +#: replication/libpqwalreceiver/libpqwalreceiver.c:220 #, c-format -msgid "Future log output will go to log destination \"%s\"." -msgstr "Saída futura do log será enviada para \"%s\"." +msgid "could not clear search path: %s" +msgstr "não foi possível limpar o caminho de procura: %s" -#: postmaster/postmaster.c:1187 utils/init/postinit.c:199 +#: replication/libpqwalreceiver/libpqwalreceiver.c:266 #, c-format -msgid "could not load pg_hba.conf" -msgstr "não pôde carregar pg_hba.conf" +msgid "invalid connection string syntax: %s" +msgstr "sintaxe de cadeia de conexão inválida: %s" -#: postmaster/postmaster.c:1263 +#: replication/libpqwalreceiver/libpqwalreceiver.c:294 #, c-format -msgid "%s: could not locate matching postgres executable" -msgstr "%s: não pôde localizar executável do postgres correspondente" +msgid "Non-superusers must provide a password in the connection string." +msgstr "" -#: postmaster/postmaster.c:1286 utils/misc/tzparser.c:341 +#: replication/libpqwalreceiver/libpqwalreceiver.c:321 #, c-format -msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." -msgstr "Isto pode indicar uma instalação incompleta do PostgreSQL ou que o arquivo \"%s\" foi movido do local apropriado." +msgid "could not parse connection string: %s" +msgstr "não foi possível analisar a cadeia de caracteres de conexão: %s" -#: postmaster/postmaster.c:1314 +#: replication/libpqwalreceiver/libpqwalreceiver.c:394 #, c-format -msgid "data directory \"%s\" does not exist" -msgstr "diretório de dados \"%s\" não existe" +msgid "could not receive database system identifier and timeline ID from the primary server: %s" +msgstr "não foi possível receber identificador do sistema de banco de dados e o ID de linha do tempo do servidor principal: %s" -#: postmaster/postmaster.c:1319 +#: replication/libpqwalreceiver/libpqwalreceiver.c:410 +#: replication/libpqwalreceiver/libpqwalreceiver.c:653 #, c-format -msgid "could not read permissions of directory \"%s\": %m" -msgstr "não pôde ler permissões do diretório \"%s\": %m" +msgid "invalid response from primary server" +msgstr "resposta inválida do servidor principal" -#: postmaster/postmaster.c:1327 +#: replication/libpqwalreceiver/libpqwalreceiver.c:411 #, c-format -msgid "specified data directory \"%s\" is not a directory" -msgstr "diretório de dados especificado \"%s\" não é um diretório" +msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." +msgstr "Não foi possível identificar o sistema: recebido %d linhas e %d campos, esperado %d linhas e %d ou mais campos." -#: postmaster/postmaster.c:1343 +#: replication/libpqwalreceiver/libpqwalreceiver.c:496 +#: replication/libpqwalreceiver/libpqwalreceiver.c:503 +#: replication/libpqwalreceiver/libpqwalreceiver.c:533 #, c-format -msgid "data directory \"%s\" has wrong ownership" -msgstr "diretório de dados \"%s\" tem dono incorreto" +msgid "could not start WAL streaming: %s" +msgstr "não foi possível iniciar envio do WAL: %s" -#: postmaster/postmaster.c:1345 +#: replication/libpqwalreceiver/libpqwalreceiver.c:557 #, c-format -msgid "The server must be started by the user that owns the data directory." -msgstr "O servidor deve ser iniciado pelo usuário que é o dono do diretório de dados." +msgid "could not send end-of-streaming message to primary: %s" +msgstr "não foi possível enviar mensagem de fim de fluxo para servidor principal: %s" -#: postmaster/postmaster.c:1365 +#: replication/libpqwalreceiver/libpqwalreceiver.c:580 #, c-format -msgid "data directory \"%s\" has group or world access" -msgstr "diretório de dados \"%s\" tem acesso para grupo ou outros" +msgid "unexpected result set after end-of-streaming" +msgstr "conjunto de resultados não esperado após fim de fluxo" -#: postmaster/postmaster.c:1367 +#: replication/libpqwalreceiver/libpqwalreceiver.c:595 #, c-format -msgid "Permissions should be u=rwx (0700)." -msgstr "Permissões devem ser u=rwx (0700)." +msgid "error while shutting down streaming COPY: %s" +msgstr "erro ao encerrar o fluxo de COPY: %s" -#: postmaster/postmaster.c:1378 +#: replication/libpqwalreceiver/libpqwalreceiver.c:605 #, c-format -msgid "" -"%s: could not find the database system\n" -"Expected to find it in the directory \"%s\",\n" -"but could not open file \"%s\": %s\n" -msgstr "" -"%s: não pôde encontrar o sistema de banco de dados\n" -"Era esperado encontrá-lo no diretório \"%s\",\n" -"mas não pôde abrir arquivo \"%s\": %s\n" +msgid "error reading result of streaming command: %s" +msgstr "erro ao ler resultado do comando de fluxo: %s" -#: postmaster/postmaster.c:1552 +#: replication/libpqwalreceiver/libpqwalreceiver.c:614 +#: replication/libpqwalreceiver/libpqwalreceiver.c:850 #, c-format -msgid "select() failed in postmaster: %m" -msgstr "select() falhou no postmaster: %m" +msgid "unexpected result after CommandComplete: %s" +msgstr "resultado inesperado após CommandComplete: %s" -#: postmaster/postmaster.c:1747 postmaster/postmaster.c:1778 +#: replication/libpqwalreceiver/libpqwalreceiver.c:641 #, c-format -msgid "incomplete startup packet" -msgstr "pacote de inicialização incompleto" +msgid "could not receive timeline history file from the primary server: %s" +msgstr "não foi possível receber o arquivo contendo o histórico de linha do tempo do servidor principal: %s" -#: postmaster/postmaster.c:1759 +#: replication/libpqwalreceiver/libpqwalreceiver.c:654 #, c-format -msgid "invalid length of startup packet" -msgstr " tamanho do pacote de inicialização é inválido" +msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." +msgstr "Esperada 1 tupla com 2 campos, recebeu %d tuplas com %d campos." -#: postmaster/postmaster.c:1816 +#: replication/libpqwalreceiver/libpqwalreceiver.c:813 +#: replication/libpqwalreceiver/libpqwalreceiver.c:866 +#: replication/libpqwalreceiver/libpqwalreceiver.c:873 #, c-format -msgid "failed to send SSL negotiation response: %m" -msgstr "falhou ao enviar resposta de negociação SSL: %m" +msgid "could not receive data from WAL stream: %s" +msgstr "não foi possível receber dados do fluxo do WAL: %s" -#: postmaster/postmaster.c:1845 +#: replication/libpqwalreceiver/libpqwalreceiver.c:893 #, c-format -msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" -msgstr "protocolo do cliente %u.%u não é suportado: servidor suporta %u.0 a %u.%u" +msgid "could not send data to WAL stream: %s" +msgstr "não foi possível enviar dados ao fluxo do WAL: %s" -#: postmaster/postmaster.c:1908 +#: replication/libpqwalreceiver/libpqwalreceiver.c:985 #, c-format -msgid "invalid value for parameter \"replication\"" -msgstr "valor é inválido para parâmetro \"replication\"" +msgid "could not create replication slot \"%s\": %s" +msgstr "não foi possível criar o encaixe de replicação \"%s\": %s" -#: postmaster/postmaster.c:1909 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1031 #, c-format -msgid "Valid values are: false, 0, true, 1, database." -msgstr "Valores válidos são: false, 0, true, 1, database." +msgid "invalid query response" +msgstr "resposta de consulta inválida" -#: postmaster/postmaster.c:1929 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1032 #, c-format -msgid "invalid startup packet layout: expected terminator as last byte" -msgstr "formato de pacote de inicialização é inválido: terminador esperado como último byte" +msgid "Expected %d fields, got %d fields." +msgstr "Esperado %d campos, obtido %d campos." -#: postmaster/postmaster.c:1957 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1102 #, c-format -msgid "no PostgreSQL user name specified in startup packet" -msgstr "nenhum nome de usuário PostgreSQL especificado no pacote de inicialização" +msgid "the query interface requires a database connection" +msgstr "a interface de consulta requer uma conexão com o banco de dados" -#: postmaster/postmaster.c:2016 -#, c-format -msgid "the database system is starting up" -msgstr "o sistema de banco de dados está iniciando" +#: replication/libpqwalreceiver/libpqwalreceiver.c:1133 +msgid "empty query" +msgstr "consulta vazia" -#: postmaster/postmaster.c:2021 -#, c-format -msgid "the database system is shutting down" -msgstr "o sistema de banco de dados está desligando" +#: replication/libpqwalreceiver/libpqwalreceiver.c:1139 +msgid "unexpected pipeline mode" +msgstr "modo de pipeline não esperado" -#: postmaster/postmaster.c:2026 +#: replication/logical/applyparallelworker.c:719 #, c-format -msgid "the database system is in recovery mode" -msgstr "o sistema de banco de dados está em modo de recuperação" +msgid "logical replication parallel apply worker for subscription \"%s\" has finished" +msgstr "" -#: postmaster/postmaster.c:2031 storage/ipc/procarray.c:286 -#: storage/ipc/sinvaladt.c:305 storage/lmgr/proc.c:339 +#: replication/logical/applyparallelworker.c:825 #, c-format -msgid "sorry, too many clients already" -msgstr "desculpe, muitos clientes conectados" +msgid "lost connection to the logical replication apply worker" +msgstr "" -#: postmaster/postmaster.c:2093 -#, c-format -msgid "wrong key in cancel request for process %d" -msgstr "chave incorreta no pedido de cancelamento do processo %d" +#: replication/logical/applyparallelworker.c:1027 +#: replication/logical/applyparallelworker.c:1029 +msgid "logical replication parallel apply worker" +msgstr "" -#: postmaster/postmaster.c:2101 +#: replication/logical/applyparallelworker.c:1043 #, c-format -msgid "PID %d in cancel request did not match any process" -msgstr "PID %d no pedido de cancelamento não combina com nenhum processo" +msgid "logical replication parallel apply worker exited due to error" +msgstr "" -#: postmaster/postmaster.c:2321 +#: replication/logical/applyparallelworker.c:1130 +#: replication/logical/applyparallelworker.c:1303 #, c-format -msgid "received SIGHUP, reloading configuration files" -msgstr "SIGHUP recebido, recarregando arquivos de configuração" +msgid "lost connection to the logical replication parallel apply worker" +msgstr "" -#: postmaster/postmaster.c:2347 +#: replication/logical/applyparallelworker.c:1183 #, c-format -msgid "pg_hba.conf not reloaded" -msgstr "pg_hba.conf não foi recarregado" +msgid "could not send data to shared-memory queue" +msgstr "não foi possível enviar dados para a fila de memória compartilhada" -#: postmaster/postmaster.c:2351 +#: replication/logical/applyparallelworker.c:1218 #, c-format -msgid "pg_ident.conf not reloaded" -msgstr "pg_ident.conf não foi recarregado" +msgid "logical replication apply worker will serialize the remaining changes of remote transaction %u to a file" +msgstr "" -#: postmaster/postmaster.c:2392 +#: replication/logical/decode.c:180 replication/logical/logical.c:140 #, c-format -msgid "received smart shutdown request" -msgstr "pedido de desligamento inteligente foi recebido" +msgid "logical decoding on standby requires wal_level >= logical on the primary" +msgstr "a decodificação lógica em servidor em-espera requer wal_level >= logical no servidor primário" -#: postmaster/postmaster.c:2445 +#: replication/logical/launcher.c:331 #, c-format -msgid "received fast shutdown request" -msgstr "pedido de desligamento rápido foi recebido" +msgid "cannot start logical replication workers when max_replication_slots = 0" +msgstr "não é possível iniciar processos trabalhadores de replicação lógica quando max_replication_slots = 0" -#: postmaster/postmaster.c:2471 +#: replication/logical/launcher.c:424 #, c-format -msgid "aborting any active transactions" -msgstr "interrompendo quaisquer transações ativas" +msgid "out of logical replication worker slots" +msgstr "esgotados os encaixes de trabalho de replicação lógica" -#: postmaster/postmaster.c:2505 +#: replication/logical/launcher.c:425 replication/logical/launcher.c:499 +#: replication/slot.c:1297 storage/lmgr/lock.c:964 storage/lmgr/lock.c:1002 +#: storage/lmgr/lock.c:2787 storage/lmgr/lock.c:4172 storage/lmgr/lock.c:4237 +#: storage/lmgr/lock.c:4587 storage/lmgr/predicate.c:2413 +#: storage/lmgr/predicate.c:2428 storage/lmgr/predicate.c:3825 #, c-format -msgid "received immediate shutdown request" -msgstr "pedido de desligamento imediato foi recebido" +msgid "You might need to increase %s." +msgstr "Talvez seja necessário aumentar %s." -#: postmaster/postmaster.c:2569 postmaster/postmaster.c:2590 -msgid "startup process" -msgstr "processo de inicialização" - -#: postmaster/postmaster.c:2572 +#: replication/logical/launcher.c:498 #, c-format -msgid "aborting startup due to startup process failure" -msgstr "interrompendo inicialização porque o processo de inicialização falhou" +msgid "out of background worker slots" +msgstr "esgotados os encaixes de processos trabalhadores em segundo plano" -#: postmaster/postmaster.c:2630 +#: replication/logical/launcher.c:705 #, c-format -msgid "database system is ready to accept connections" -msgstr "sistema de banco de dados está pronto para aceitar conexões" - -#: postmaster/postmaster.c:2645 -msgid "background writer process" -msgstr "processo escritor em segundo plano" - -#: postmaster/postmaster.c:2699 -msgid "checkpointer process" -msgstr "processo de ponto de controle" - -#: postmaster/postmaster.c:2715 -msgid "WAL writer process" -msgstr "processo escritor do WAL" - -#: postmaster/postmaster.c:2729 -msgid "WAL receiver process" -msgstr "processo receptor do WAL" - -#: postmaster/postmaster.c:2744 -msgid "autovacuum launcher process" -msgstr "processo inicializador do autovacuum" - -#: postmaster/postmaster.c:2759 -msgid "archiver process" -msgstr "processo arquivador" - -#: postmaster/postmaster.c:2775 -msgid "statistics collector process" -msgstr "processo coletor de estatísticas" +msgid "logical replication worker slot %d is empty, cannot attach" +msgstr "" -#: postmaster/postmaster.c:2789 -msgid "system logger process" -msgstr "processo de relato do sistema (system logger)" +#: replication/logical/launcher.c:714 +#, c-format +msgid "logical replication worker slot %d is already used by another worker, cannot attach" +msgstr "" -#: postmaster/postmaster.c:2851 -msgid "worker process" -msgstr "processo filho em segundo plano" +#: replication/logical/logical.c:120 +#, c-format +msgid "logical decoding requires wal_level >= logical" +msgstr "decodificação lógica requer wal_level >= logical" -#: postmaster/postmaster.c:2937 postmaster/postmaster.c:2957 -#: postmaster/postmaster.c:2964 postmaster/postmaster.c:2982 -msgid "server process" -msgstr "processo servidor" +#: replication/logical/logical.c:125 +#, c-format +msgid "logical decoding requires a database connection" +msgstr "decodificação lógica requer uma conexão com banco de dados" -#: postmaster/postmaster.c:3036 +#: replication/logical/logical.c:363 replication/logical/logical.c:517 #, c-format -msgid "terminating any other active server processes" -msgstr "terminando quaisquer outros processos servidor ativos" +msgid "cannot use physical replication slot for logical decoding" +msgstr "não é possível utilizar entrada de replicação física para decodificação lógica" -#. translator: %s is a noun phrase describing a child process, such as -#. "server process" -#: postmaster/postmaster.c:3291 +#: replication/logical/logical.c:368 replication/logical/logical.c:522 #, c-format -msgid "%s (PID %d) exited with exit code %d" -msgstr "%s (PID %d) terminou com código de retorno %d" +msgid "replication slot \"%s\" was not created in this database" +msgstr "entrada de replicação \"%s\" não foi criada neste banco de dados" -#: postmaster/postmaster.c:3293 postmaster/postmaster.c:3304 -#: postmaster/postmaster.c:3315 postmaster/postmaster.c:3324 -#: postmaster/postmaster.c:3334 +#: replication/logical/logical.c:375 #, c-format -msgid "Failed process was running: %s" -msgstr "Processo que falhou estava executando: %s" +msgid "cannot create logical replication slot in transaction that has performed writes" +msgstr "não é possível criar entrada de replicação lógica em transação que realizou escritas" -#. translator: %s is a noun phrase describing a child process, such as -#. "server process" -#: postmaster/postmaster.c:3301 +#: replication/logical/logical.c:534 replication/logical/logical.c:541 #, c-format -msgid "%s (PID %d) was terminated by exception 0x%X" -msgstr "%s (PID %d) foi terminado pela exceção 0x%X" +msgid "can no longer get changes from replication slot \"%s\"" +msgstr "não é mais possível obter alterações do encaixe de replicação \"%s\"" -#. translator: %s is a noun phrase describing a child process, such as -#. "server process" -#: postmaster/postmaster.c:3311 +#: replication/logical/logical.c:536 #, c-format -msgid "%s (PID %d) was terminated by signal %d: %s" -msgstr "%s (PID %d) foi terminado pelo sinal %d: %s" +msgid "This slot has been invalidated because it exceeded the maximum reserved size." +msgstr "" -#. translator: %s is a noun phrase describing a child process, such as -#. "server process" -#: postmaster/postmaster.c:3322 +#: replication/logical/logical.c:543 #, c-format -msgid "%s (PID %d) was terminated by signal %d" -msgstr "%s (PID %d) foi terminado pelo sinal %d" +msgid "This slot has been invalidated because it was conflicting with recovery." +msgstr "Esse encaixe foi invalidado, porque estava em conflito com a recuperação." -#. translator: %s is a noun phrase describing a child process, such as -#. "server process" -#: postmaster/postmaster.c:3332 +#: replication/logical/logical.c:608 #, c-format -msgid "%s (PID %d) exited with unrecognized status %d" -msgstr "%s (PID %d) terminou com status desconhecido %d" +msgid "starting logical decoding for slot \"%s\"" +msgstr "iniciando decodificação lógica para entrada \"%s\"" -#: postmaster/postmaster.c:3520 +#: replication/logical/logical.c:610 #, c-format -msgid "abnormal database system shutdown" -msgstr "desligamento anormal do sistema de banco de dados" +msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." +msgstr "Fluxo de transações efetivadas após %X/%X, lendo WAL de %X/%X." -#: postmaster/postmaster.c:3559 +#: replication/logical/logical.c:758 #, c-format -msgid "all server processes terminated; reinitializing" -msgstr "todos os processos servidor foram terminados; reinicializando" +msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" +msgstr "entrada \"%s\", plugin de saída \"%s\", na função %s, LSN associado %X/%X" -#: postmaster/postmaster.c:3811 +#: replication/logical/logical.c:764 #, c-format -msgid "could not fork new process for connection: %m" -msgstr "não pôde criar novo processo para conexão: %m" +msgid "slot \"%s\", output plugin \"%s\", in the %s callback" +msgstr "entrada \"%s\", plugin de saída \"%s\", na função %s" -#: postmaster/postmaster.c:3853 -msgid "could not fork new process for connection: " -msgstr "não pôde criar novo processo para conexão: " +#: replication/logical/logical.c:935 replication/logical/logical.c:980 +#: replication/logical/logical.c:1025 replication/logical/logical.c:1071 +#, c-format +msgid "logical replication at prepare time requires a %s callback" +msgstr "" -#: postmaster/postmaster.c:3960 +#: replication/logical/logical.c:1303 replication/logical/logical.c:1352 +#: replication/logical/logical.c:1393 replication/logical/logical.c:1479 +#: replication/logical/logical.c:1528 #, c-format -msgid "connection received: host=%s port=%s" -msgstr "conexão recebida: host=%s porta=%s" +msgid "logical streaming requires a %s callback" +msgstr "o fluxo lógico requer uma função %s" -#: postmaster/postmaster.c:3965 +#: replication/logical/logical.c:1438 #, c-format -msgid "connection received: host=%s" -msgstr "conexão recebida: host=%s" +msgid "logical streaming at prepare time requires a %s callback" +msgstr "" -#: postmaster/postmaster.c:4255 +#: replication/logical/logicalfuncs.c:126 #, c-format -msgid "could not execute server process \"%s\": %m" -msgstr "não pôde executar processo servidor \"%s\": %m" +msgid "slot name must not be null" +msgstr "o nome do encaixe não deve ser nulo" -#: postmaster/postmaster.c:4804 +#: replication/logical/logicalfuncs.c:142 #, c-format -msgid "database system is ready to accept read only connections" -msgstr "sistema de banco de dados está pronto para aceitar conexões somente leitura" +msgid "options array must not be null" +msgstr "a matriz de opções não deve ser nula" -#: postmaster/postmaster.c:5117 +#: replication/logical/logicalfuncs.c:159 #, c-format -msgid "could not fork startup process: %m" -msgstr "não pôde criar processo de inicialização: %m" +msgid "array must be one-dimensional" +msgstr "matriz deve ser de uma dimensão" -#: postmaster/postmaster.c:5121 +#: replication/logical/logicalfuncs.c:165 #, c-format -msgid "could not fork background writer process: %m" -msgstr "não pôde criar processo escritor em segundo plano: %m" +msgid "array must not contain nulls" +msgstr "matriz não deve conter nulos" -#: postmaster/postmaster.c:5125 +#: replication/logical/logicalfuncs.c:180 utils/adt/json.c:1484 +#: utils/adt/jsonb.c:1403 #, c-format -msgid "could not fork checkpointer process: %m" -msgstr "não pôde criar processo de ponto de controle: %m" +msgid "array must have even number of elements" +msgstr "matriz deve ter número par de elementos" -#: postmaster/postmaster.c:5129 +#: replication/logical/logicalfuncs.c:227 #, c-format -msgid "could not fork WAL writer process: %m" -msgstr "não pôde criar processo escritor do WAL: %m" +msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" +msgstr "o plugin de saída de decodificação lógica \"%s\" produz uma saída binária, mas a função \"%s\" espera por dados de texto" -#: postmaster/postmaster.c:5133 +#: replication/logical/origin.c:190 #, c-format -msgid "could not fork WAL receiver process: %m" -msgstr "não pôde criar processo receptor do WAL: %m" +msgid "cannot query or manipulate replication origin when max_replication_slots = 0" +msgstr "não é possível consultar ou manipular a origem da replicação quando max_replication_slots = 0" -#: postmaster/postmaster.c:5137 +#: replication/logical/origin.c:195 #, c-format -msgid "could not fork process: %m" -msgstr "não pôde criar processo: %m" +msgid "cannot manipulate replication origins during recovery" +msgstr "não é possível manipular origens de replicação durante a recuperação" -#: postmaster/postmaster.c:5299 +#: replication/logical/origin.c:240 #, c-format -msgid "database connection requirement not indicated during registration" -msgstr "requisito de conexão com banco de dados não foi indicado durante o registro" +msgid "replication origin \"%s\" does not exist" +msgstr "a origem de replicação \"%s\" não existe" -#: postmaster/postmaster.c:5306 +#: replication/logical/origin.c:331 #, c-format -msgid "invalid processing mode in background worker" -msgstr "modo de processamento é inválido no processo filho em segundo plano" +msgid "could not find free replication origin ID" +msgstr "não foi possível encontrar o ID de origem de replicação livre" -#: postmaster/postmaster.c:5358 +#: replication/logical/origin.c:365 #, c-format -msgid "starting background worker process \"%s\"" -msgstr "iniciando processo filho em segundo plano \"%s\"" +msgid "could not drop replication origin with ID %d, in use by PID %d" +msgstr "" -#: postmaster/postmaster.c:5369 +#: replication/logical/origin.c:492 #, c-format -msgid "could not fork worker process: %m" -msgstr "não pôde criar processo filho em segundo plano: %m" +msgid "replication origin with ID %d does not exist" +msgstr "a origem de replicação com ID %d não existe" -#: postmaster/postmaster.c:5758 +#: replication/logical/origin.c:757 #, c-format -msgid "could not duplicate socket %d for use in backend: error code %d" -msgstr "não pôde duplicar soquete %d para uso pelo servidor: código de erro %d" +msgid "replication checkpoint has wrong magic %u instead of %u" +msgstr "o ponto de verificação da replicação tem o número mágico errado %u em vez de %u" -#: postmaster/postmaster.c:5790 +#: replication/logical/origin.c:798 #, c-format -msgid "could not create inherited socket: error code %d\n" -msgstr "não pôde criar soquete herdado: código de erro %d\n" +msgid "could not find free replication state, increase max_replication_slots" +msgstr "não foi possível encontrar um estado de replicação livre, aumente max_replication_slots" -#: postmaster/postmaster.c:5819 postmaster/postmaster.c:5826 +#: replication/logical/origin.c:806 #, c-format -msgid "could not read from backend variables file \"%s\": %s\n" -msgstr "não pôde ler do arquivo de variáveis do servidor \"%s\": %s\n" +msgid "recovered replication state of node %d to %X/%X" +msgstr "estado de replicação recuperado do nó %d para %X/%X" -#: postmaster/postmaster.c:5835 +#: replication/logical/origin.c:816 #, c-format -msgid "could not remove file \"%s\": %s\n" -msgstr "não pôde remover arquivo \"%s\": %s\n" +msgid "replication slot checkpoint has wrong checksum %u, expected %u" +msgstr "o ponto de verificação do encaixe de replicação tem soma de verificação errada %u, esperado %u" -#: postmaster/postmaster.c:5852 +#: replication/logical/origin.c:944 replication/logical/origin.c:1141 #, c-format -msgid "could not map view of backend variables: error code %lu\n" -msgstr "não pôde mapear visão de variáveis do servidor: código de erro %lu\n" +msgid "replication origin with ID %d is already active for PID %d" +msgstr "a origem de replicação com ID %d já está ativa para o PID %d" -#: postmaster/postmaster.c:5861 +#: replication/logical/origin.c:955 replication/logical/origin.c:1153 #, c-format -msgid "could not unmap view of backend variables: error code %lu\n" -msgstr "não pôde liberar visão de variáveis do servidor: código de erro %lu\n" +msgid "could not find free replication state slot for replication origin with ID %d" +msgstr "" -#: postmaster/postmaster.c:5868 +#: replication/logical/origin.c:957 replication/logical/origin.c:1155 +#: replication/slot.c:2093 #, c-format -msgid "could not close handle to backend parameter variables: error code %lu\n" -msgstr "não pôde fechar manipulador das variáveis do servidor: código de erro %lu\n" +msgid "Increase max_replication_slots and try again." +msgstr "Aumente max_replication_slots e tente novamente." -#: postmaster/postmaster.c:6027 +#: replication/logical/origin.c:1112 #, c-format -msgid "could not read exit code for process\n" -msgstr "não pôde ler código de retorno para processo\n" +msgid "cannot setup replication origin when one is already setup" +msgstr "" -#: postmaster/postmaster.c:6032 +#: replication/logical/origin.c:1196 replication/logical/origin.c:1412 +#: replication/logical/origin.c:1432 #, c-format -msgid "could not post child completion status\n" -msgstr "não pôde publicar status de conclusão do processo filho\n" +msgid "no replication origin is configured" +msgstr "" -#: postmaster/syslogger.c:463 postmaster/syslogger.c:1064 +#: replication/logical/origin.c:1282 #, c-format -msgid "could not read from logger pipe: %m" -msgstr "não pôde ler do pipe do logger: %m" +msgid "replication origin name \"%s\" is reserved" +msgstr "o nome de origem da replicação \"%s\" está reservado" -#: postmaster/syslogger.c:512 +#: replication/logical/origin.c:1284 #, c-format -msgid "logger shutting down" -msgstr "desligando logger" +msgid "Origin names \"%s\", \"%s\", and names starting with \"pg_\" are reserved." +msgstr "" -#: postmaster/syslogger.c:556 postmaster/syslogger.c:570 +#: replication/logical/relation.c:240 #, c-format -msgid "could not create pipe for syslog: %m" -msgstr "não pôde criar pipe para syslog: %m" +msgid "\"%s\"" +msgstr "" -#: postmaster/syslogger.c:606 +#: replication/logical/relation.c:243 #, c-format -msgid "could not fork system logger: %m" -msgstr "não pôde criar processo system logger: %m" +msgid ", \"%s\"" +msgstr "" -#: postmaster/syslogger.c:643 +#: replication/logical/relation.c:249 #, c-format -msgid "redirecting log output to logging collector process" -msgstr "redirecionando saída do log para processo coletor de log" +msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" +msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" +msgstr[0] "" +msgstr[1] "" -#: postmaster/syslogger.c:644 +#: replication/logical/relation.c:304 #, c-format -msgid "Future log output will appear in directory \"%s\"." -msgstr "Saída futura do log aparecerá no diretório \"%s\"." +msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" +msgstr "" -#: postmaster/syslogger.c:652 +#: replication/logical/relation.c:396 #, c-format -msgid "could not redirect stdout: %m" -msgstr "não pôde redirecionar saída stdout: %m" +msgid "logical replication target relation \"%s.%s\" does not exist" +msgstr "não existe a relação de destino da replicação lógica \"%s.%s\"" -#: postmaster/syslogger.c:657 postmaster/syslogger.c:674 +#: replication/logical/reorderbuffer.c:3936 #, c-format -msgid "could not redirect stderr: %m" -msgstr "não pôde redirecionar saída stderr: %m" +msgid "could not write to data file for XID %u: %m" +msgstr "não foi possível escrever no arquivo de dados para XID %u: %m" -#: postmaster/syslogger.c:1019 +#: replication/logical/reorderbuffer.c:4282 +#: replication/logical/reorderbuffer.c:4307 #, c-format -msgid "could not write to log file: %s\n" -msgstr "não pôde escrever em arquivo de log: %s\n" +msgid "could not read from reorderbuffer spill file: %m" +msgstr "não foi possível ler do arquivo de descarga do reorderbuffer: %m" -#: postmaster/syslogger.c:1159 +#: replication/logical/reorderbuffer.c:4286 +#: replication/logical/reorderbuffer.c:4311 #, c-format -msgid "could not open log file \"%s\": %m" -msgstr "não pôde abrir arquivo de log \"%s\": %m" +msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" +msgstr "não foi possível ler do arquivo de descarga do reorderbuffer: lidos somente %d de %u bytes" -#: postmaster/syslogger.c:1221 postmaster/syslogger.c:1265 +#: replication/logical/reorderbuffer.c:4561 #, c-format -msgid "disabling automatic rotation (use SIGHUP to re-enable)" -msgstr "desabilitando rotação automática (utilize SIGHUP para habilitá-la novamente)" +msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" +msgstr "não foi possível remover o arquivo \"%s\" durante a remoção de pg_replslot/%s/xid*: %m" -#: regex/regc_pg_locale.c:261 +#: replication/logical/reorderbuffer.c:5057 #, c-format -msgid "could not determine which collation to use for regular expression" -msgstr "não pôde determinar qual ordenação utilizar na expressão regular" +msgid "could not read from file \"%s\": read %d instead of %d bytes" +msgstr "não foi possível ler do arquivo \"%s\": lidos somente %d de %d bytes" -#: repl_gram.y:247 repl_gram.y:274 +#: replication/logical/snapbuild.c:639 #, c-format -msgid "invalid timeline %u" -msgstr "linha do tempo %u é inválida" +msgid "initial slot snapshot too large" +msgstr "" -#: repl_scanner.l:118 -msgid "invalid streaming start location" -msgstr "local de início do fluxo é inválido" +#: replication/logical/snapbuild.c:693 +#, c-format +msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" +msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" +msgstr[0] "instantâneo exportado de decodificação lógica: \"%s\" com %u ID de transação" +msgstr[1] "instantâneo exportado de decodificação lógica: \"%s\" com %u IDs de transação" -#: repl_scanner.l:169 scan.l:661 -msgid "unterminated quoted string" -msgstr "cadeia de caracteres entre aspas não foi terminada" +#: replication/logical/snapbuild.c:1388 replication/logical/snapbuild.c:1480 +#: replication/logical/snapbuild.c:1996 +#, c-format +msgid "logical decoding found consistent point at %X/%X" +msgstr "decodificação lógica encontrou ponto consistente em %X/%X" -#: repl_scanner.l:179 +#: replication/logical/snapbuild.c:1390 #, c-format -msgid "syntax error: unexpected character \"%s\"" -msgstr "erro de sintaxe: caracter inesperado \"%s\"" +msgid "There are no running transactions." +msgstr "Não há transações em execução." -#: replication/basebackup.c:184 replication/basebackup.c:1044 -#: utils/adt/misc.c:353 +#: replication/logical/snapbuild.c:1432 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "não pôde ler link simbólico \"%s\": %m" +msgid "logical decoding found initial starting point at %X/%X" +msgstr "decodificação lógica encontrou ponto de partida inicial em %X/%X" -#: replication/basebackup.c:191 replication/basebackup.c:1048 -#: utils/adt/misc.c:357 +#: replication/logical/snapbuild.c:1434 replication/logical/snapbuild.c:1458 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "alvo do link simbólico \"%s\" é muito longo" +msgid "Waiting for transactions (approximately %d) older than %u to end." +msgstr "" -#: replication/basebackup.c:284 +#: replication/logical/snapbuild.c:1456 #, c-format -msgid "could not stat control file \"%s\": %m" -msgstr "não pôde executar stat no arquivo de controle \"%s\": %m" +msgid "logical decoding found initial consistent point at %X/%X" +msgstr "a decodificação lógica encontrou um ponto consistente inicial em %X/%X" -#: replication/basebackup.c:396 +#: replication/logical/snapbuild.c:1482 #, c-format -msgid "could not find any WAL files" -msgstr "não pôde encontrar arquivos do WAL" +msgid "There are no old transactions anymore." +msgstr "Não há mais transações antigas." -#: replication/basebackup.c:409 replication/basebackup.c:423 -#: replication/basebackup.c:432 +#: replication/logical/snapbuild.c:1883 #, c-format -msgid "could not find WAL file \"%s\"" -msgstr "não pôde encontrar arquivo do WAL \"%s\"" +msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" +msgstr "arquivo de estado snapbuild \"%s\" tem número mágico errado: %u em vez de %u" -#: replication/basebackup.c:471 replication/basebackup.c:496 +#: replication/logical/snapbuild.c:1889 #, c-format -msgid "unexpected WAL file size \"%s\"" -msgstr "tamanho de arquivo do WAL \"%s\" inesperado" +msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" +msgstr "o arquivo de estado do snapbuild \"%s\" tem uma versão sem suporte: %u em vez de %u" -#: replication/basebackup.c:482 replication/basebackup.c:1186 +#: replication/logical/snapbuild.c:1930 #, c-format -msgid "base backup could not send data, aborting backup" -msgstr "cópia de segurança base não pôde enviar dados, interrompendo cópia de segurança" +msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" +msgstr "sem correspondência de soma de verificação para o arquivo de estado do snapbuild \"%s\": é %u, deveria ser %u" -#: replication/basebackup.c:569 replication/basebackup.c:578 -#: replication/basebackup.c:587 replication/basebackup.c:596 -#: replication/basebackup.c:605 replication/basebackup.c:616 +#: replication/logical/snapbuild.c:1998 #, c-format -msgid "duplicate option \"%s\"" -msgstr "opção \"%s\" duplicada" +msgid "Logical decoding will begin using saved snapshot." +msgstr "Decodificação lógica irá começar usando instantâneo salvo." -#: replication/basebackup.c:622 utils/misc/guc.c:5409 +#: replication/logical/snapbuild.c:2105 #, c-format -msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d está fora do intervalo válido para parâmetro \"%s\" (%d .. %d)" +msgid "could not parse file name \"%s\"" +msgstr "não foi possível analisar o nome do arquivo \"%s\"" -#: replication/basebackup.c:879 replication/basebackup.c:972 +#: replication/logical/tablesync.c:153 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "não pôde executar stat no arquivo ou diretório \"%s\": %m" +msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" +msgstr "" -#: replication/basebackup.c:1122 +#: replication/logical/tablesync.c:632 #, c-format -msgid "skipping special file \"%s\"" -msgstr "ignorando arquivo especial \"%s\"" +msgid "logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled" +msgstr "" -#: replication/basebackup.c:1176 +#: replication/logical/tablesync.c:807 replication/logical/tablesync.c:949 #, c-format -msgid "archive member \"%s\" too large for tar format" -msgstr "membro de archive \"%s\" muito grande para o formato tar" +msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" +msgstr "não foi possível buscar informações da tabela \"%s.%s\" do publicador: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:106 +#: replication/logical/tablesync.c:814 #, c-format -msgid "could not connect to the primary server: %s" -msgstr "não pôde conectar ao servidor principal: %s" +msgid "table \"%s.%s\" not found on publisher" +msgstr "a tabela \"%s.%s\" não foi encontrada no publicador" -#: replication/libpqwalreceiver/libpqwalreceiver.c:130 +#: replication/logical/tablesync.c:872 #, c-format -msgid "could not receive database system identifier and timeline ID from the primary server: %s" -msgstr "não pôde receber identificador do sistema de banco de dados e o ID de linha do tempo do servidor principal: %s" +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "não foi possível buscar informações da lista de colunas da tabela \"%s.%s\" do publicador: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:141 -#: replication/libpqwalreceiver/libpqwalreceiver.c:294 +#: replication/logical/tablesync.c:1051 #, c-format -msgid "invalid response from primary server" -msgstr "resposta inválida do servidor principal" +msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" +msgstr "" -#: replication/libpqwalreceiver/libpqwalreceiver.c:142 +#: replication/logical/tablesync.c:1210 #, c-format -msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." -msgstr "Não pôde identificar sistema: recebeu %d registros e %d campos, esperado %d registros e %d ou mais campos." +msgid "could not start initial contents copy for table \"%s.%s\": %s" +msgstr "não foi possível iniciar a cópia do conteúdo inicial da tabela \"%s.%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:158 +#: replication/logical/tablesync.c:1411 #, c-format -msgid "database system identifier differs between the primary and standby" -msgstr "identificador do sistema de banco de dados difere entre o servidor principal e o servidor em espera" +msgid "table copy could not start transaction on publisher: %s" +msgstr "a cópia da tabela não conseguiu iniciar a transação no publicador: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:159 +#: replication/logical/tablesync.c:1453 #, c-format -msgid "The primary's identifier is %s, the standby's identifier is %s." -msgstr "O identificador do servidor principal é %s, o identificador do servidor em espera é %s." +msgid "replication origin \"%s\" already exists" +msgstr "a origem de replicação \"%s\" já existe" -#: replication/libpqwalreceiver/libpqwalreceiver.c:201 +#: replication/logical/tablesync.c:1486 replication/logical/worker.c:2374 #, c-format -msgid "could not start WAL streaming: %s" -msgstr "não pôde iniciar envio do WAL: %s" +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "" -#: replication/libpqwalreceiver/libpqwalreceiver.c:219 +#: replication/logical/tablesync.c:1499 #, c-format -msgid "could not send end-of-streaming message to primary: %s" -msgstr "não pôde enviar mensagem de fim de fluxo para servidor principal: %s" +msgid "table copy could not finish transaction on publisher: %s" +msgstr "a cópia da tabela não conseguiu concluir a transação no publicador: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:241 +#: replication/logical/worker.c:499 #, c-format -msgid "unexpected result set after end-of-streaming" -msgstr "conjunto de resultados inesperado após fim de fluxo" +msgid "logical replication parallel apply worker for subscription \"%s\" will stop" +msgstr "" -#: replication/libpqwalreceiver/libpqwalreceiver.c:253 +#: replication/logical/worker.c:501 #, c-format -msgid "error reading result of streaming command: %s" -msgstr "erro ao ler resultado do comando de fluxo: %s" +msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." +msgstr "" -#: replication/libpqwalreceiver/libpqwalreceiver.c:260 +#: replication/logical/worker.c:863 replication/logical/worker.c:978 #, c-format -msgid "unexpected result after CommandComplete: %s" -msgstr "resultado inesperado após CommandComplete: %s" +msgid "incorrect binary data format in logical replication column %d" +msgstr "formato de dados binários incorreto na coluna de replicação lógica %d" -#: replication/libpqwalreceiver/libpqwalreceiver.c:283 +#: replication/logical/worker.c:2513 #, c-format -msgid "could not receive timeline history file from the primary server: %s" -msgstr "não pôde receber arquivo contendo histórico de linha do tempo do servidor principal: %s" +msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" +msgstr "" -#: replication/libpqwalreceiver/libpqwalreceiver.c:295 +#: replication/logical/worker.c:2520 #, c-format -msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." -msgstr "Esperada 1 tupla com 2 campos, recebeu %d tuplas com %d campos." +msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" +msgstr "" -#: replication/libpqwalreceiver/libpqwalreceiver.c:323 +#: replication/logical/worker.c:3384 #, c-format -msgid "socket not open" -msgstr "soquete não está aberto" +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "tipo de mensagem de replicação lógica inválida \"??? (%d)\"" -#: replication/libpqwalreceiver/libpqwalreceiver.c:496 -#: replication/libpqwalreceiver/libpqwalreceiver.c:519 -#: replication/libpqwalreceiver/libpqwalreceiver.c:525 +#: replication/logical/worker.c:3556 #, c-format -msgid "could not receive data from WAL stream: %s" -msgstr "não pôde receber dados do fluxo do WAL: %s" +msgid "data stream from publisher has ended" +msgstr "" -#: replication/libpqwalreceiver/libpqwalreceiver.c:544 +#: replication/logical/worker.c:3713 #, c-format -msgid "could not send data to WAL stream: %s" -msgstr "não pôde enviar dados ao fluxo do WAL: %s" +msgid "terminating logical replication worker due to timeout" +msgstr "encerrando o processo trabalhador de replicação lógica devido ao tempo limite" -#: replication/logical/logical.c:81 +#: replication/logical/worker.c:3907 #, c-format -msgid "logical decoding requires wal_level >= logical" -msgstr "decodificação lógica requer wal_level >= logical" +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" +msgstr "" -#: replication/logical/logical.c:86 +#: replication/logical/worker.c:3920 #, c-format -msgid "logical decoding requires a database connection" -msgstr "decodificação lógica requer uma conexão com banco de dados" +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" +msgstr "" -#: replication/logical/logical.c:104 +#: replication/logical/worker.c:3951 #, c-format -msgid "logical decoding cannot be used while in recovery" -msgstr "decodificação lógica não pode ser utilizada durante recuperação" +msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" +msgstr "" -#: replication/logical/logical.c:230 replication/logical/logical.c:381 +#: replication/logical/worker.c:3955 #, c-format -msgid "cannot use physical replication slot for logical decoding" -msgstr "não pode utilizar entrada de replicação física para decodificação lógica" +msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" +msgstr "" -#: replication/logical/logical.c:235 replication/logical/logical.c:386 +#: replication/logical/worker.c:4478 #, c-format -msgid "replication slot \"%s\" was not created in this database" -msgstr "entrada de replicação \"%s\" não foi criada neste banco de dados" +msgid "logical replication worker for subscription %u will not start because the subscription was removed during startup" +msgstr "" -#: replication/logical/logical.c:242 +#: replication/logical/worker.c:4493 #, c-format -msgid "cannot create logical replication slot in transaction that has performed writes" -msgstr "não pode criar entrada de replicação lógica em transação que realizou escritas" +msgid "logical replication worker for subscription \"%s\" will not start because the subscription was disabled during startup" +msgstr "" -#: replication/logical/logical.c:422 +#: replication/logical/worker.c:4510 #, c-format -msgid "starting logical decoding for slot \"%s\"" -msgstr "iniciando decodificação lógica para entrada \"%s\"" +msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" +msgstr "" -#: replication/logical/logical.c:424 +#: replication/logical/worker.c:4515 #, c-format -msgid "streaming transactions committing after %X/%X, reading WAL from %X/%X" -msgstr "enviando transações efetivadas após %X/%X, lendo WAL de %X/%X" +msgid "logical replication apply worker for subscription \"%s\" has started" +msgstr "" -#: replication/logical/logical.c:559 +#: replication/logical/worker.c:4590 #, c-format -msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" -msgstr "entrada \"%s\", plugin de saída \"%s\", na função %s, LSN associado %X/%X" +msgid "subscription has no replication slot set" +msgstr "a subscrição não tem encaixe de replicação definido" -#: replication/logical/logical.c:566 +#: replication/logical/worker.c:4757 #, c-format -msgid "slot \"%s\", output plugin \"%s\", in the %s callback" -msgstr "entrada \"%s\", plugin de saída \"%s\", na função %s" +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "a subscrição \"%s\" foi desativada devido a um erro" -#: replication/logical/logicalfuncs.c:190 replication/walsender.c:2123 +#: replication/logical/worker.c:4805 #, c-format -msgid "could not read from log segment %s, offset %u, length %lu: %m" -msgstr "não pôde ler do arquivo de log %s, posição %u, tamanho %lu: %m" +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "a replicação lógica começa a saltar a transação em LSN %X/%X" -#: replication/logical/logicalfuncs.c:209 replication/slotfuncs.c:32 +#: replication/logical/worker.c:4819 #, c-format -msgid "must be superuser or replication role to use replication slots" -msgstr "deve ser super-usuário ou role de replicação para utilizar entradas de replicação" +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "" -#: replication/logical/logicalfuncs.c:339 +#: replication/logical/worker.c:4901 #, c-format -msgid "array must be one-dimensional" -msgstr "matriz deve ser de uma dimensão" +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "skip-LSN da subscrição \"%s\" apagado" -#: replication/logical/logicalfuncs.c:345 +#: replication/logical/worker.c:4902 #, c-format -msgid "array must not contain nulls" -msgstr "matriz não deve conter nulos" +msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." +msgstr "" -#: replication/logical/logicalfuncs.c:361 utils/adt/json.c:2198 +#: replication/logical/worker.c:4928 #, c-format -msgid "array must have even number of elements" -msgstr "matriz deve ter número par de elementos" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" +msgstr "" -#: replication/logical/logicalfuncs.c:404 +#: replication/logical/worker.c:4932 #, c-format -msgid "logical decoding output plugin \"%s\" produces binary output, but \"%s\" expects textual data" -msgstr "plugin de saída de decodificação lógica \"%s\" produz saída binária, mas \"%s\" espera dados textuais" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" +msgstr "" -#: replication/logical/reorderbuffer.c:2100 +#: replication/logical/worker.c:4937 #, c-format -msgid "could not write to data file for XID %u: %m" -msgstr "não pôde escrever no arquivo de dados para XID %u: %m" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" +msgstr "" -#: replication/logical/reorderbuffer.c:2196 -#: replication/logical/reorderbuffer.c:2216 +#: replication/logical/worker.c:4948 #, c-format -msgid "could not read from reorderbuffer spill file: %m" -msgstr "não pôde ler do arquivo de despejo do reorderbuffer: %m" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u" +msgstr "" -#: replication/logical/reorderbuffer.c:2200 -#: replication/logical/reorderbuffer.c:2220 +#: replication/logical/worker.c:4955 #, c-format -msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" -msgstr "não pôde ler do arquivo de despejo do reorderbuffer: leu somente %d de %u bytes" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" +msgstr "" -#: replication/logical/reorderbuffer.c:2826 +#: replication/logical/worker.c:4966 #, c-format -msgid "could not read from file \"%s\": read %d instead of %d bytes" -msgstr "não pôde ler do arquivo \"%s\": leu somente %d de %d bytes" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u" +msgstr "" -#: replication/logical/snapbuild.c:601 +#: replication/logical/worker.c:4974 #, c-format -msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" -msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" -msgstr[0] "instantâneo exportado de decodificação lógica: \"%s\" com %u ID de transação" -msgstr[1] "instantâneo exportado de decodificação lógica: \"%s\" com %u IDs de transação" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" +msgstr "" -#: replication/logical/snapbuild.c:904 replication/logical/snapbuild.c:1269 -#: replication/logical/snapbuild.c:1800 +#: replication/pgoutput/pgoutput.c:317 #, c-format -msgid "logical decoding found consistent point at %X/%X" -msgstr "decodificação lógica encontrou ponto consistente em %X/%X" +msgid "invalid proto_version" +msgstr "proto_version inválido" -#: replication/logical/snapbuild.c:906 +#: replication/pgoutput/pgoutput.c:322 #, c-format -msgid "Transaction ID %u finished; no more running transactions." -msgstr "ID de transação %u terminou; não há mais transações em execução." +msgid "proto_version \"%s\" out of range" +msgstr "proto_version \"%s\" fora do intervalo" -#: replication/logical/snapbuild.c:1271 +#: replication/pgoutput/pgoutput.c:339 #, c-format -msgid "There are no running transactions." -msgstr "Não há transações em execução." +msgid "invalid publication_names syntax" +msgstr "sintaxe inválida de publication_names" -#: replication/logical/snapbuild.c:1333 +#: replication/pgoutput/pgoutput.c:440 #, c-format -msgid "logical decoding found initial starting point at %X/%X" -msgstr "decodificação lógica encontrou ponto de partida inicial em %X/%X" +msgid "client sent proto_version=%d but server only supports protocol %d or lower" +msgstr "" -#: replication/logical/snapbuild.c:1335 +#: replication/pgoutput/pgoutput.c:446 #, c-format -msgid "%u transaction needs to finish." -msgid_plural "%u transactions need to finish." -msgstr[0] "%u transação precisa terminar." -msgstr[1] "%u transações precisam terminar." +msgid "client sent proto_version=%d but server only supports protocol %d or higher" +msgstr "" -#: replication/logical/snapbuild.c:1674 replication/logical/snapbuild.c:1700 -#: replication/logical/snapbuild.c:1714 replication/logical/snapbuild.c:1728 +#: replication/pgoutput/pgoutput.c:452 #, c-format -msgid "could not read file \"%s\", read %d of %d: %m" -msgstr "não pôde ler arquivo \"%s\", leu %d de %d: %m" +msgid "publication_names parameter missing" +msgstr "parâmetro publication_names faltando" -#: replication/logical/snapbuild.c:1680 +#: replication/pgoutput/pgoutput.c:466 #, c-format -msgid "snapbuild state file \"%s\" has wrong magic %u instead of %u" -msgstr "arquivo de status do snapbuild \"%s\" tem número mágico incorreto %u ao invés de %u" +msgid "requested proto_version=%d does not support streaming, need %d or higher" +msgstr "o proto_version=%d solicitado não dá suporte a fluxo (streaming), precisa ser %d ou superior" -#: replication/logical/snapbuild.c:1685 +#: replication/pgoutput/pgoutput.c:472 #, c-format -msgid "snapbuild state file \"%s\" has unsupported version %u instead of %u" -msgstr "arquivo de status do snapbuild \"%s\" tem versão não suportada %u ao invés de %u" +msgid "requested proto_version=%d does not support parallel streaming, need %d or higher" +msgstr "" -#: replication/logical/snapbuild.c:1741 +#: replication/pgoutput/pgoutput.c:477 #, c-format -msgid "snapbuild state file %s: checksum mismatch, is %u, should be %u" -msgstr "arquivo de status do snapbuild %s: soma de verificação não corresponde, é %u, deveria ser %u" +msgid "streaming requested, but not supported by output plugin" +msgstr "fluxo (streaming) requisitado, mas sem suporte pelo plugin de saída" -#: replication/logical/snapbuild.c:1802 +#: replication/pgoutput/pgoutput.c:494 #, c-format -msgid "Logical decoding will begin using saved snapshot." -msgstr "Decodificação lógica irá começar utilizando instantâneo salvo." +msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" +msgstr "" -#: replication/logical/snapbuild.c:1875 +#: replication/pgoutput/pgoutput.c:499 #, c-format -msgid "could not parse file name \"%s\"" -msgstr "não pôde analisar nome de arquivo \"%s\"" +msgid "two-phase commit requested, but not supported by output plugin" +msgstr "" -#: replication/slot.c:173 +#: replication/slot.c:207 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "nome de entrada de replicação \"%s\" é muito curto" -#: replication/slot.c:182 +#: replication/slot.c:216 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "nome de entrada de replicação \"%s\" é muito longo" -#: replication/slot.c:195 +#: replication/slot.c:229 #, c-format msgid "replication slot name \"%s\" contains invalid character" -msgstr "nome de entrada de replicação \"%s\" contém caracter inválido" +msgstr "o nome de entrada de replicação \"%s\" contém caractere inválido" -#: replication/slot.c:197 +#: replication/slot.c:231 #, c-format -msgid "Replication slot names may only contain letters, numbers, and the underscore character." -msgstr "Nomes de entrada de replicação só podem conter letras, números e o caracter sublinhado." +msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." +msgstr "Os nomes dos encaixes de replicação podem conter apenas letras minúsculas, números e o caractere de sublinhado." -#: replication/slot.c:244 +#: replication/slot.c:285 #, c-format msgid "replication slot \"%s\" already exists" msgstr "entrada de replicação \"%s\" já existe" -#: replication/slot.c:254 +#: replication/slot.c:295 #, c-format msgid "all replication slots are in use" msgstr "todas as entradas de replicação já estão em uso" -#: replication/slot.c:255 +#: replication/slot.c:296 #, c-format msgid "Free one or increase max_replication_slots." msgstr "Libere uma ou aumente max_replication_slots." -#: replication/slot.c:347 +#: replication/slot.c:474 replication/slotfuncs.c:736 +#: utils/activity/pgstat_replslot.c:55 utils/adt/genfile.c:774 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "entrada de replicação \"%s\" não existe" -#: replication/slot.c:351 +#: replication/slot.c:520 replication/slot.c:1110 #, c-format -msgid "replication slot \"%s\" is already active" -msgstr "entrada de replicação \"%s\" já está ativa" +msgid "replication slot \"%s\" is active for PID %d" +msgstr "o encaixe de replicação \"%s\" está ativo para o PID %d" -#: replication/slot.c:499 replication/slot.c:873 replication/slot.c:1218 +#: replication/slot.c:756 replication/slot.c:1645 replication/slot.c:2028 #, c-format msgid "could not remove directory \"%s\"" -msgstr "não pôde remover diretório \"%s\"" +msgstr "não foi possível remover o diretório \"%s\"" -#: replication/slot.c:774 +#: replication/slot.c:1145 #, c-format msgid "replication slots can only be used if max_replication_slots > 0" msgstr "entradas de replicação só podem ser utilizadas se max_replication_slots > 0" -#: replication/slot.c:779 +#: replication/slot.c:1150 #, c-format -msgid "replication slots can only be used if wal_level >= archive" -msgstr "entradas de replicação só podem ser utilizadas se wal_level >= archive" +msgid "replication slots can only be used if wal_level >= replica" +msgstr "os encaixes de replicação só podem ser usados ​​se wal_level >= replica" -#: replication/slot.c:1150 replication/slot.c:1188 +#: replication/slot.c:1162 #, c-format -msgid "could not read file \"%s\", read %d of %u: %m" -msgstr "não pôde ler arquivo \"%s\", leu %d de %u: %m" +msgid "permission denied to use replication slots" +msgstr "permissão negada para usar encaixes de replicação" -#: replication/slot.c:1159 +#: replication/slot.c:1163 #, c-format -msgid "replication slot file \"%s\" has wrong magic %u instead of %u" -msgstr "arquivo de entrada de replicação \"%s\" tem número mágico incorreto %u ao invés de %u" +msgid "Only roles with the %s attribute may use replication slots." +msgstr "" + +#: replication/slot.c:1271 +#, c-format +msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu byte." +msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." +msgstr[0] "" +msgstr[1] "" + +#: replication/slot.c:1279 +#, c-format +msgid "The slot conflicted with xid horizon %u." +msgstr "O encaixe entrou em conflito com o horizonte xid %u." + +#: replication/slot.c:1284 +msgid "Logical decoding on standby requires wal_level >= logical on the primary server." +msgstr "A decodificação lógica no servidor em-espera requer wal_level >= logical no servidor primário." -#: replication/slot.c:1166 +#: replication/slot.c:1292 +#, c-format +msgid "terminating process %d to release replication slot \"%s\"" +msgstr "terminando o processo %d para liberar o encaixe de replicação \"%s\"" + +#: replication/slot.c:1294 +#, c-format +msgid "invalidating obsolete replication slot \"%s\"" +msgstr "invalidando o encaixe de replicação obsoleto \"%s\"" + +#: replication/slot.c:1966 +#, c-format +msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" +msgstr "o arquivo do encaixe de replicação \"%s\" tem número mágico errado: %u em vez de %u" + +#: replication/slot.c:1973 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" -msgstr "arquivo de entrada de replicação \"%s\" tem versão não suportado %u" +msgstr "o arquivo de entrada de replicação \"%s\" tem uma versão sem suporte %u" -#: replication/slot.c:1173 +#: replication/slot.c:1980 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "arquivo de entrada de replicação \"%s\" tem tamanho corrompido %u" -#: replication/slot.c:1203 +#: replication/slot.c:2016 +#, c-format +msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" +msgstr "incompatibilidade de soma de verificação para o arquivo de encaixe de replicação \"%s\": é %u, deveria ser %u" + +#: replication/slot.c:2050 #, c-format -msgid "replication slot file %s: checksum mismatch, is %u, should be %u" -msgstr "arquivo de entrada de replicação %s: soma de verificação não corresponde, é %u, deveria ser %u" +msgid "logical replication slot \"%s\" exists, but wal_level < logical" +msgstr "o encaixe de replicação lógica \"%s\" existe, mas wal_level < logical" -#: replication/slot.c:1256 +#: replication/slot.c:2052 +#, c-format +msgid "Change wal_level to be logical or higher." +msgstr "" + +#: replication/slot.c:2056 +#, c-format +msgid "physical replication slot \"%s\" exists, but wal_level < replica" +msgstr "" + +#: replication/slot.c:2058 +#, c-format +msgid "Change wal_level to be replica or higher." +msgstr "" + +#: replication/slot.c:2092 #, c-format msgid "too many replication slots active before shutdown" msgstr "muitas entradas de replicação ativas antes do desligamento" -#: replication/slot.c:1257 +#: replication/slotfuncs.c:601 #, c-format -msgid "Increase max_replication_slots and try again." -msgstr "Aumente max_replication_slots e tente novamente." +msgid "invalid target WAL LSN" +msgstr "" + +#: replication/slotfuncs.c:623 +#, c-format +msgid "replication slot \"%s\" cannot be advanced" +msgstr "o encaixe de replicação \"%s\" não pode ser avançado" + +#: replication/slotfuncs.c:625 +#, c-format +msgid "This slot has never previously reserved WAL, or it has been invalidated." +msgstr "" + +#: replication/slotfuncs.c:641 +#, c-format +msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" +msgstr "" + +#: replication/slotfuncs.c:748 +#, c-format +msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" +msgstr "não é possível copiar o encaixe de replicação física \"%s\" como um encaixe de replicação lógica" + +#: replication/slotfuncs.c:750 +#, c-format +msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" +msgstr "não é possível copiar o encaixe de replicação lógica \"%s\" como um encaixe de replicação física" + +#: replication/slotfuncs.c:757 +#, c-format +msgid "cannot copy a replication slot that doesn't reserve WAL" +msgstr "" + +#: replication/slotfuncs.c:834 +#, c-format +msgid "could not copy replication slot \"%s\"" +msgstr "não foi possível copiar o encaixe de replicação \"%s\"" + +#: replication/slotfuncs.c:836 +#, c-format +msgid "The source replication slot was modified incompatibly during the copy operation." +msgstr "" -#: replication/syncrep.c:208 +#: replication/slotfuncs.c:842 +#, c-format +msgid "cannot copy unfinished logical replication slot \"%s\"" +msgstr "não é possível copiar o encaixe de replicação lógica não terminado \"%s\"" + +#: replication/slotfuncs.c:844 +#, c-format +msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." +msgstr "" + +#: replication/syncrep.c:262 #, c-format msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" -msgstr "cancelando espera por replicação síncrona e terminando conexão por causa de um comando do administrador" +msgstr "cancelando a espera por replicação síncrona e terminando a conexão devido a um comando do administrador" -#: replication/syncrep.c:209 replication/syncrep.c:226 +#: replication/syncrep.c:263 replication/syncrep.c:280 #, c-format msgid "The transaction has already committed locally, but might not have been replicated to the standby." msgstr "A transação foi efetivada localmente, mas pode não ter sido replicado para o servidor em espera." -#: replication/syncrep.c:225 +#: replication/syncrep.c:279 +#, c-format +msgid "canceling wait for synchronous replication due to user request" +msgstr "cancelando a espera por replicação síncrona devido a um pedido do usuário" + +#: replication/syncrep.c:486 +#, c-format +msgid "standby \"%s\" is now a synchronous standby with priority %u" +msgstr "o servidor em espera \"%s\" agora é um servidor em espera síncrono com prioridade %u" + +#: replication/syncrep.c:490 +#, c-format +msgid "standby \"%s\" is now a candidate for quorum synchronous standby" +msgstr "o servidor em espera \"%s\" agora é candidato a servidor em espera síncrono para quorum" + +#: replication/syncrep.c:1019 +#, c-format +msgid "synchronous_standby_names parser failed" +msgstr "" + +#: replication/syncrep.c:1025 +#, c-format +msgid "number of synchronous standbys (%d) must be greater than zero" +msgstr "o número de servidores em espera síncronos (%d) deve ser maior que zero" + +#: replication/walreceiver.c:180 #, c-format -msgid "canceling wait for synchronous replication due to user request" -msgstr "cancelando espera por replicação síncrona por causa de um pedido do usuário" +msgid "terminating walreceiver process due to administrator command" +msgstr "terminando o processo walreceiver devido a um comando do administrador" -#: replication/syncrep.c:355 +#: replication/walreceiver.c:305 #, c-format -msgid "standby \"%s\" now has synchronous standby priority %u" -msgstr "servidor em espera \"%s\" agora tem prioridade %u como servidor em espera síncrono" +msgid "could not connect to the primary server: %s" +msgstr "não foi possível conectar ao servidor principal: %s" -#: replication/syncrep.c:457 +#: replication/walreceiver.c:352 #, c-format -msgid "standby \"%s\" is now the synchronous standby with priority %u" -msgstr "servidor em espera \"%s\" agora é um servidor em espera síncrono com prioridade %u" +msgid "database system identifier differs between the primary and standby" +msgstr "identificador do sistema de banco de dados difere entre o servidor principal e o servidor em espera" -#: replication/walreceiver.c:167 +#: replication/walreceiver.c:353 #, c-format -msgid "terminating walreceiver process due to administrator command" -msgstr "terminando processo walreceiver por causa de um comando do administrador" +msgid "The primary's identifier is %s, the standby's identifier is %s." +msgstr "O identificador do servidor principal é %s, o identificador do servidor em espera é %s." -#: replication/walreceiver.c:332 +#: replication/walreceiver.c:364 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "maior linha do tempo %u do servidor principal está atrás da linha do tempo %u da recuperação" -#: replication/walreceiver.c:367 +#: replication/walreceiver.c:417 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "iniciado fluxo de WAL do principal em %X/%X na linha do tempo %u" -#: replication/walreceiver.c:372 +#: replication/walreceiver.c:421 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "reiniciado fluxo de WAL em %X/%X na linha do tempo %u" -#: replication/walreceiver.c:406 +#: replication/walreceiver.c:457 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" -msgstr "não pode continuar envio do WAL, recuperação já terminou" +msgstr "não é possível continuar o envio do WAL, a recuperação já terminou" -#: replication/walreceiver.c:443 +#: replication/walreceiver.c:501 #, c-format msgid "replication terminated by primary server" msgstr "replicação terminada pelo servidor principal" -#: replication/walreceiver.c:444 +#: replication/walreceiver.c:502 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "Fim do WAL alcançado na linha do tempo %u em %X/%X." -#: replication/walreceiver.c:491 +#: replication/walreceiver.c:592 #, c-format msgid "terminating walreceiver due to timeout" msgstr "terminando processo walreceiver por causa do tempo de espera (timeout) da replicação" -#: replication/walreceiver.c:531 +#: replication/walreceiver.c:624 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "servidor principal não contém mais WAL na linha do tempo %u solicitada" -#: replication/walreceiver.c:546 replication/walreceiver.c:903 +#: replication/walreceiver.c:640 replication/walreceiver.c:1066 #, c-format -msgid "could not close log segment %s: %m" -msgstr "não pôde fechar arquivo de log %s: %m" +msgid "could not close WAL segment %s: %m" +msgstr "não foi possível fechar o segmento de WAL %s: %m" -#: replication/walreceiver.c:668 +#: replication/walreceiver.c:759 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "obtendo arquivo contendo histórico de linha do tempo %u do servidor principal" #: replication/walreceiver.c:954 #, c-format -msgid "could not write to log segment %s at offset %u, length %lu: %m" -msgstr "não pôde escrever no arquivo de log %s na posição %u, tamanho %lu: %m" +msgid "could not write to WAL segment %s at offset %u, length %lu: %m" +msgstr "não foi possível escrever no segmento de WAL %s no deslocamento %u, comprimento %lu: %m" + +#: replication/walsender.c:519 +#, c-format +msgid "cannot use %s with a logical replication slot" +msgstr "não é possível usar %s com um encaixe de replicação lógica" + +#: replication/walsender.c:623 storage/smgr/md.c:1529 +#, c-format +msgid "could not seek to end of file \"%s\": %m" +msgstr "não foi possível posicionar no fim do arquivo \"%s\": %m" -#: replication/walsender.c:469 +#: replication/walsender.c:627 #, c-format msgid "could not seek to beginning of file \"%s\": %m" -msgstr "não pôde posicionar no início do arquivo \"%s\": %m" +msgstr "não foi possível posicionar no início do arquivo \"%s\": %m" -#: replication/walsender.c:520 +#: replication/walsender.c:704 #, c-format msgid "cannot use a logical replication slot for physical replication" -msgstr "não pode utilizar uma entrada de replicação lógica para replicação física" +msgstr "não é possível utilizar uma entrada de replicação lógica para replicação física" -#: replication/walsender.c:583 +#: replication/walsender.c:770 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "ponto de início solicitado %X/%X na linha do tempo %u não está no histórico deste servidor" -#: replication/walsender.c:587 +#: replication/walsender.c:773 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "O histórico deste servidor bifurcou da linha do tempo %u em %X/%X." -#: replication/walsender.c:632 +#: replication/walsender.c:817 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "ponto de início solicitado %X/%X está a frente da posição de escrita do WAL neste servidor %X/%X" -#: replication/walsender.c:947 +#: replication/walsender.c:1010 +#, c-format +msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" +msgstr "valor não reconhecido para a opção CREATE_REPLICATION_SLOT \"%s\": \"%s\"" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1095 +#, c-format +msgid "%s must not be called inside a transaction" +msgstr "%s não deve ser chamado dentro de uma transação" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1105 +#, c-format +msgid "%s must be called inside a transaction" +msgstr "%s deve ser chamado dentro de uma transação" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1111 +#, c-format +msgid "%s must be called in REPEATABLE READ isolation mode transaction" +msgstr "" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1116 +#, c-format +msgid "%s must be called in a read-only transaction" +msgstr "%s deve ser chamado em uma transação de leitura-apenas" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1122 +#, c-format +msgid "%s must be called before any query" +msgstr "%s deve ser chamado antes de qualquer consulta" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1128 +#, c-format +msgid "%s must not be called in a subtransaction" +msgstr "%s não deve ser chamado em uma subtransação" + +#: replication/walsender.c:1275 #, c-format msgid "terminating walsender process after promotion" msgstr "terminando processo walsender após promoção" -#: replication/walsender.c:1362 replication/walsender.c:1412 -#: replication/walsender.c:1461 +#: replication/walsender.c:1696 #, c-format -msgid "unexpected EOF on standby connection" -msgstr "EOF inesperado na conexão do servidor em espera" +msgid "cannot execute new commands while WAL sender is in stopping mode" +msgstr "" -#: replication/walsender.c:1381 +#: replication/walsender.c:1731 #, c-format -msgid "unexpected standby message type \"%c\", after receiving CopyDone" -msgstr "tipo de mensagem do servidor em espera \"%c\" inesperado, após receber CopyDone" +msgid "cannot execute SQL commands in WAL sender for physical replication" +msgstr "não é possível executar comandos SQL no remetente de WAL para replicação física" -#: replication/walsender.c:1429 +#: replication/walsender.c:1764 +#, c-format +msgid "received replication command: %s" +msgstr "comando de replicação recebido: %s" + +#: replication/walsender.c:1772 tcop/fastpath.c:209 tcop/postgres.c:1138 +#: tcop/postgres.c:1496 tcop/postgres.c:1736 tcop/postgres.c:2210 +#: tcop/postgres.c:2648 tcop/postgres.c:2726 +#, c-format +msgid "current transaction is aborted, commands ignored until end of transaction block" +msgstr "transação atual foi interrompida, comandos ignorados até o fim do bloco de transação" + +#: replication/walsender.c:1914 replication/walsender.c:1949 +#, c-format +msgid "unexpected EOF on standby connection" +msgstr "EOF inesperado na conexão do servidor em espera" + +#: replication/walsender.c:1937 #, c-format msgid "invalid standby message type \"%c\"" msgstr "tipo de mensagem do servidor em espera \"%c\" é inválido" -#: replication/walsender.c:1483 +#: replication/walsender.c:2026 #, c-format msgid "unexpected message type \"%c\"" msgstr "tipo de mensagem \"%c\" inesperado" -#: replication/walsender.c:1770 +#: replication/walsender.c:2439 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "terminando processo walsender por causa do tempo de espera da replicação" -#: replication/walsender.c:1863 -#, c-format -msgid "standby \"%s\" has now caught up with primary" -msgstr "servidor em espera \"%s\" agora alcançou o servidor principal" - -#: replication/walsender.c:1967 -#, c-format -msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" -msgstr "número de conexões dos servidores em espera solicitadas excedeu max_wal_senders (atualmente %d)" - -#: rewrite/rewriteDefine.c:111 rewrite/rewriteDefine.c:942 +#: rewrite/rewriteDefine.c:111 rewrite/rewriteDefine.c:842 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "regra \"%s\" para relação \"%s\" já existe" -#: rewrite/rewriteDefine.c:295 +#: rewrite/rewriteDefine.c:268 rewrite/rewriteDefine.c:780 +#, c-format +msgid "relation \"%s\" cannot have rules" +msgstr "a relação \"%s\" não pode ter regras" + +#: rewrite/rewriteDefine.c:299 #, c-format msgid "rule actions on OLD are not implemented" msgstr "ações da regra em OLD não estão implementadas" -#: rewrite/rewriteDefine.c:296 +#: rewrite/rewriteDefine.c:300 #, c-format msgid "Use views or triggers instead." -msgstr "Ao invés disso utilize visões ou gatilhos." +msgstr "Ao invés disso use visões ou gatilhos." -#: rewrite/rewriteDefine.c:300 +#: rewrite/rewriteDefine.c:304 #, c-format msgid "rule actions on NEW are not implemented" msgstr "ações da regra em NEW não estão implementadas" -#: rewrite/rewriteDefine.c:301 +#: rewrite/rewriteDefine.c:305 #, c-format msgid "Use triggers instead." -msgstr "Ao invés disso utilize gatilhos." +msgstr "Ao invés disso use gatilhos." -#: rewrite/rewriteDefine.c:314 +#: rewrite/rewriteDefine.c:319 +#, c-format +msgid "relation \"%s\" cannot have ON SELECT rules" +msgstr "a relação \"%s\" não pode ter regras ON SELECT" + +#: rewrite/rewriteDefine.c:329 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "regras INSTEAD NOTHING no SELECT não estão implementadas" -#: rewrite/rewriteDefine.c:315 +#: rewrite/rewriteDefine.c:330 #, c-format msgid "Use views instead." -msgstr "Ao invés disso utilize visões." +msgstr "Ao invés disso use visões." -#: rewrite/rewriteDefine.c:323 +#: rewrite/rewriteDefine.c:338 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "ações múltiplas para regras no SELECT não estão implementadas" -#: rewrite/rewriteDefine.c:334 +#: rewrite/rewriteDefine.c:348 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "regras no SELECT devem ter ação INSTEAD SELECT" -#: rewrite/rewriteDefine.c:342 +#: rewrite/rewriteDefine.c:356 #, c-format msgid "rules on SELECT must not contain data-modifying statements in WITH" msgstr "regras no SELECT não devem conter comandos que modificam dados no WITH" -#: rewrite/rewriteDefine.c:350 +#: rewrite/rewriteDefine.c:364 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "qualificações de eventos não estão implementadas para regras no SELECT" -#: rewrite/rewriteDefine.c:377 +#: rewrite/rewriteDefine.c:391 #, c-format msgid "\"%s\" is already a view" msgstr "\"%s\" já é uma visão" -#: rewrite/rewriteDefine.c:401 +#: rewrite/rewriteDefine.c:415 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "regra para visão em \"%s\" deve ter nome \"%s\"" -#: rewrite/rewriteDefine.c:429 -#, c-format -msgid "could not convert table \"%s\" to a view because it is not empty" -msgstr "não pôde converter tabela \"%s\" em visão porque ela não está vazia" - -#: rewrite/rewriteDefine.c:437 -#, c-format -msgid "could not convert table \"%s\" to a view because it has triggers" -msgstr "não pôde converter tabela \"%s\" em visão porque ela tem gatilhos" - -#: rewrite/rewriteDefine.c:439 -#, c-format -msgid "In particular, the table cannot be involved in any foreign key relationships." -msgstr "Em particular, a tabela não pode estar envolvida em relacionamentos de chave estrangeira." - -#: rewrite/rewriteDefine.c:444 -#, c-format -msgid "could not convert table \"%s\" to a view because it has indexes" -msgstr "não pôde converter tabela \"%s\" em visão porque ela tem índices" - -#: rewrite/rewriteDefine.c:450 -#, c-format -msgid "could not convert table \"%s\" to a view because it has child tables" -msgstr "não pôde converter tabela \"%s\" em visão porque ela tem tabelas descendentes" - -#: rewrite/rewriteDefine.c:477 +#: rewrite/rewriteDefine.c:442 #, c-format msgid "cannot have multiple RETURNING lists in a rule" -msgstr "não pode ter múltiplas listas RETURNING em uma regra" +msgstr "não é possível ter múltiplas listas RETURNING em uma regra" -#: rewrite/rewriteDefine.c:482 +#: rewrite/rewriteDefine.c:447 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "listas RETURNING não são suportadas em regras condicionais" -#: rewrite/rewriteDefine.c:486 +#: rewrite/rewriteDefine.c:451 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "listas RETURNING não são suportadas em regras que não utilizam INSTEAD" -#: rewrite/rewriteDefine.c:649 +#: rewrite/rewriteDefine.c:465 +#, c-format +msgid "non-view rule for \"%s\" must not be named \"%s\"" +msgstr "a regra de não-visão para \"%s\" não deve se chamar \"%s\"" + +#: rewrite/rewriteDefine.c:539 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "lista de alvos de uma regra SELECT tem muitas entradas" -#: rewrite/rewriteDefine.c:650 +#: rewrite/rewriteDefine.c:540 #, c-format msgid "RETURNING list has too many entries" msgstr "lista RETURNING tem muitas entradas" -#: rewrite/rewriteDefine.c:666 +#: rewrite/rewriteDefine.c:567 #, c-format msgid "cannot convert relation containing dropped columns to view" -msgstr "não pode converter relação contendo colunas removidas em visão" +msgstr "não é possível converter relação contendo colunas removidas em visão" + +#: rewrite/rewriteDefine.c:568 +#, c-format +msgid "cannot create a RETURNING list for a relation containing dropped columns" +msgstr "não é possível criar uma lista RETURNING para uma relação contendo colunas excluídas" -#: rewrite/rewriteDefine.c:672 +#: rewrite/rewriteDefine.c:574 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "entrada alvo %d de uma regra SELECT tem nome de coluna diferente da coluna \"%s\"" -#: rewrite/rewriteDefine.c:674 +#: rewrite/rewriteDefine.c:576 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "entrada alvo de SELECT é chamada \"%s\"." -#: rewrite/rewriteDefine.c:683 +#: rewrite/rewriteDefine.c:585 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "entrada alvo %d de uma regra SELECT tem tipo diferente da coluna \"%s\"" -#: rewrite/rewriteDefine.c:685 +#: rewrite/rewriteDefine.c:587 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "entrada %d de uma lista RETURNING tem tipo diferente da coluna \"%s\"" -#: rewrite/rewriteDefine.c:688 rewrite/rewriteDefine.c:712 +#: rewrite/rewriteDefine.c:590 rewrite/rewriteDefine.c:614 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "entrada alvo de SELECT tem tipo %s, mas coluna tem tipo %s." -#: rewrite/rewriteDefine.c:691 rewrite/rewriteDefine.c:716 +#: rewrite/rewriteDefine.c:593 rewrite/rewriteDefine.c:618 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "entrada de lista RETURNING tem tipo %s, mas coluna tem tipo %s." -#: rewrite/rewriteDefine.c:707 +#: rewrite/rewriteDefine.c:609 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "entrada alvo %d de uma regra SELECT tem tamanho diferente da coluna \"%s\"" -#: rewrite/rewriteDefine.c:709 +#: rewrite/rewriteDefine.c:611 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "entrada %d de uma lista RETURNING tem tamanho diferente da coluna \"%s\"" -#: rewrite/rewriteDefine.c:726 +#: rewrite/rewriteDefine.c:628 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "lista de alvos de uma regra SELECT tem poucas entradas" -#: rewrite/rewriteDefine.c:727 +#: rewrite/rewriteDefine.c:629 #, c-format msgid "RETURNING list has too few entries" msgstr "lista RETURNING tem poucas entradas" -#: rewrite/rewriteDefine.c:819 rewrite/rewriteDefine.c:933 -#: rewrite/rewriteSupport.c:112 +#: rewrite/rewriteDefine.c:718 rewrite/rewriteDefine.c:833 +#: rewrite/rewriteSupport.c:109 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "regra \"%s\" para relação \"%s\" não existe" -#: rewrite/rewriteDefine.c:952 +#: rewrite/rewriteDefine.c:852 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "renomear uma regra ON SELECT não é permitido" -#: rewrite/rewriteHandler.c:512 +#: rewrite/rewriteHandler.c:583 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "nome de consulta WITH \"%s\" aparece em ação da regra e na consulta a ser reescrita" -#: rewrite/rewriteHandler.c:572 +#: rewrite/rewriteHandler.c:610 +#, c-format +msgid "INSERT ... SELECT rule actions are not supported for queries having data-modifying statements in WITH" +msgstr "ações de regra INSERT ... SELECT não têm suporte para consultas com instruções de modificação de dados em WITH" + +#: rewrite/rewriteHandler.c:663 #, c-format msgid "cannot have RETURNING lists in multiple rules" -msgstr "não pode ter listas RETURNING em múltiplas regras" +msgstr "não é possível ter listas RETURNING em múltiplas regras" + +#: rewrite/rewriteHandler.c:895 rewrite/rewriteHandler.c:934 +#, c-format +msgid "cannot insert a non-DEFAULT value into column \"%s\"" +msgstr "não é possível inserir um valor diferente de DEFAULT na coluna \"%s\"" + +#: rewrite/rewriteHandler.c:897 rewrite/rewriteHandler.c:963 +#, c-format +msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." +msgstr "" + +#: rewrite/rewriteHandler.c:899 +#, c-format +msgid "Use OVERRIDING SYSTEM VALUE to override." +msgstr "" + +#: rewrite/rewriteHandler.c:961 rewrite/rewriteHandler.c:969 +#, c-format +msgid "column \"%s\" can only be updated to DEFAULT" +msgstr "a coluna \"%s\" só pode ser atualizada para DEFAULT" -#: rewrite/rewriteHandler.c:910 rewrite/rewriteHandler.c:928 +#: rewrite/rewriteHandler.c:1116 rewrite/rewriteHandler.c:1134 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "atribuições múltiplas para mesma coluna \"%s\"" -#: rewrite/rewriteHandler.c:1698 rewrite/rewriteHandler.c:3129 +#: rewrite/rewriteHandler.c:2119 rewrite/rewriteHandler.c:4040 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "recursão infinita detectada em regras para relação \"%s\"" -#: rewrite/rewriteHandler.c:1995 +#: rewrite/rewriteHandler.c:2204 +#, c-format +msgid "infinite recursion detected in policy for relation \"%s\"" +msgstr "recursão infinita detectada na política para a relação \"%s\"" + +#: rewrite/rewriteHandler.c:2524 msgid "Junk view columns are not updatable." msgstr "Colunas indesejadas de visão não são atualizáveis." -#: rewrite/rewriteHandler.c:2000 +#: rewrite/rewriteHandler.c:2529 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Colunas de visão que não são colunas de sua relação base não são atualizáveis." -#: rewrite/rewriteHandler.c:2003 +#: rewrite/rewriteHandler.c:2532 msgid "View columns that refer to system columns are not updatable." msgstr "Colunas de visão que se referem a colunas de sistema não são atualizáveis." -#: rewrite/rewriteHandler.c:2006 +#: rewrite/rewriteHandler.c:2535 msgid "View columns that return whole-row references are not updatable." -msgstr "Colunas de visão que retornam referências a todo registro não são atualizáveis." +msgstr "Colunas de visão que retornam referências a toda a linha não são atualizáveis." -#: rewrite/rewriteHandler.c:2064 +#: rewrite/rewriteHandler.c:2596 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Visões contendo DISTINCT não são automaticamente atualizáveis." -#: rewrite/rewriteHandler.c:2067 +#: rewrite/rewriteHandler.c:2599 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Visões contendo GROUP BY não são automaticamente atualizáveis." -#: rewrite/rewriteHandler.c:2070 +#: rewrite/rewriteHandler.c:2602 msgid "Views containing HAVING are not automatically updatable." msgstr "Visões contendo HAVING não são automaticamente atualizáveis." -#: rewrite/rewriteHandler.c:2073 +#: rewrite/rewriteHandler.c:2605 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Visões contendo UNION, INTERSECT ou EXCEPT não são automaticamente atualizáveis." -#: rewrite/rewriteHandler.c:2076 +#: rewrite/rewriteHandler.c:2608 msgid "Views containing WITH are not automatically updatable." msgstr "Visões contendo WITH não são automaticamente atualizáveis." -#: rewrite/rewriteHandler.c:2079 +#: rewrite/rewriteHandler.c:2611 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Visões contendo LIMIT ou OFFSET não são automaticamente atualizáveis." -#: rewrite/rewriteHandler.c:2091 +#: rewrite/rewriteHandler.c:2623 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Visões que retornam funções de agregação não são automaticamente atualizáveis." -#: rewrite/rewriteHandler.c:2094 +#: rewrite/rewriteHandler.c:2626 msgid "Views that return window functions are not automatically updatable." msgstr "Visões que retornam funções deslizantes não são automaticamente atualizáveis." -#: rewrite/rewriteHandler.c:2097 +#: rewrite/rewriteHandler.c:2629 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Visões que retornam funções que retornam conjunto não são automaticamente atualizáveis." -#: rewrite/rewriteHandler.c:2104 rewrite/rewriteHandler.c:2108 -#: rewrite/rewriteHandler.c:2115 +#: rewrite/rewriteHandler.c:2636 rewrite/rewriteHandler.c:2640 +#: rewrite/rewriteHandler.c:2648 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "Visões que não selecionam de uma única tabela ou visão não são automaticamente atualizáveis." -#: rewrite/rewriteHandler.c:2139 +#: rewrite/rewriteHandler.c:2651 +msgid "Views containing TABLESAMPLE are not automatically updatable." +msgstr "As visões que contêm TABLESAMPLE não são atualizáveis ​​automaticamente." + +#: rewrite/rewriteHandler.c:2675 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Visões que não tem colunas atualizáveis não são automaticamente atualizáveis." -#: rewrite/rewriteHandler.c:2576 +#: rewrite/rewriteHandler.c:3155 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" -msgstr "não pode inserir na coluna \"%s\" da visão \"%s\"" +msgstr "não é possível inserir na coluna \"%s\" da visão \"%s\"" -#: rewrite/rewriteHandler.c:2584 +#: rewrite/rewriteHandler.c:3163 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" -msgstr "não pode atualizar coluna \"%s\" da visão \"%s\"" +msgstr "não é possível atualizar a coluna \"%s\" da visão \"%s\"" + +#: rewrite/rewriteHandler.c:3667 +#, c-format +msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" +msgstr "as regras DO INSTEAD NOTIFY não têmsuporte para instruções de modificação de dados em WITH" -#: rewrite/rewriteHandler.c:2952 +#: rewrite/rewriteHandler.c:3678 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "regras DO INSTEAD NOTHING não são suportadas em comandos que modificam dados no WITH" -#: rewrite/rewriteHandler.c:2966 +#: rewrite/rewriteHandler.c:3692 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "regras DO INSTEAD condicionais não são suportadas em comandos que modificam dados no WITH" -#: rewrite/rewriteHandler.c:2970 +#: rewrite/rewriteHandler.c:3696 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "regras DO ALSO não são suportadas em comandos que modificam dados no WITH" -#: rewrite/rewriteHandler.c:2975 +#: rewrite/rewriteHandler.c:3701 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "regras DO INSTEAD com múltiplos comandos não são suportadas em comandos que modificam dados no WITH" -#: rewrite/rewriteHandler.c:3166 +#: rewrite/rewriteHandler.c:3968 rewrite/rewriteHandler.c:3976 +#: rewrite/rewriteHandler.c:3984 +#, c-format +msgid "Views with conditional DO INSTEAD rules are not automatically updatable." +msgstr "As visões com regras DO INSTEAD condicionais não são atualizáveis ​​automaticamente." + +#: rewrite/rewriteHandler.c:4089 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" -msgstr "não pode executar INSERT RETURNING na relação \"%s\"" +msgstr "não é possível executar INSERT RETURNING na relação \"%s\"" -#: rewrite/rewriteHandler.c:3168 +#: rewrite/rewriteHandler.c:4091 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "Você precisa de uma regra incondicional ON INSERT DO INSTEAD com uma cláusula RETURNING." -#: rewrite/rewriteHandler.c:3173 +#: rewrite/rewriteHandler.c:4096 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" -msgstr "não pode executar UPDATE RETURNING na relação \"%s\"" +msgstr "não é possível executar UPDATE RETURNING na relação \"%s\"" -#: rewrite/rewriteHandler.c:3175 +#: rewrite/rewriteHandler.c:4098 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "Você precisa de uma regra incondicional ON UPDATE DO INSTEAD com uma cláusula RETURNING." -#: rewrite/rewriteHandler.c:3180 +#: rewrite/rewriteHandler.c:4103 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" -msgstr "não pode executar DELETE RETURNING na relação \"%s\"" +msgstr "não é possível executar DELETE RETURNING na relação \"%s\"" -#: rewrite/rewriteHandler.c:3182 +#: rewrite/rewriteHandler.c:4105 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "Você precisa de uma regra incondicional ON DELETE DO INSTEAD com uma cláusula RETURNING." -#: rewrite/rewriteHandler.c:3246 +#: rewrite/rewriteHandler.c:4123 +#, c-format +msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" +msgstr "" + +#: rewrite/rewriteHandler.c:4180 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH não pode ser utilizado em uma consulta que reescrita por regras em múltiplas consultas" -#: rewrite/rewriteManip.c:956 +#: rewrite/rewriteManip.c:1075 #, c-format msgid "conditional utility statements are not implemented" msgstr "comandos utilitários condicionais não estão implementados" -#: rewrite/rewriteManip.c:1121 +#: rewrite/rewriteManip.c:1419 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "WHERE CURRENT OF em uma visão não está implementado" -#: rewrite/rewriteSupport.c:154 -#, c-format -msgid "rule \"%s\" does not exist" -msgstr "regra \"%s\" não existe" - -#: rewrite/rewriteSupport.c:167 +#: rewrite/rewriteManip.c:1754 #, c-format -msgid "there are multiple rules named \"%s\"" -msgstr "há múltiplas regras com nome \"%s\"" +msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" +msgstr "" -#: rewrite/rewriteSupport.c:168 +#: rewrite/rewriteSearchCycle.c:410 #, c-format -msgid "Specify a relation name as well as a rule name." -msgstr "Especifique um nome de relação bem como um nome de regra." +msgid "with a SEARCH or CYCLE clause, the recursive reference to WITH query \"%s\" must be at the top level of its right-hand SELECT" +msgstr "" -#: scan.l:426 +#: scan.l:482 msgid "unterminated /* comment" msgstr "comentário /* não foi terminado" -#: scan.l:455 +#: scan.l:502 msgid "unterminated bit string literal" msgstr "cadeia de bits não foi terminada" -#: scan.l:476 +#: scan.l:516 msgid "unterminated hexadecimal string literal" msgstr "cadeia de caracteres hexadecimal não foi terminada" -#: scan.l:526 +#: scan.l:566 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "uso inseguro de cadeia de caracteres com escapes Unicode" -#: scan.l:527 +#: scan.l:567 #, c-format msgid "String constants with Unicode escapes cannot be used when standard_conforming_strings is off." msgstr "Cadeias de caracteres com escapes Unicode não podem ser utilizadas quando standard_conforming_strings está off." -#: scan.l:571 scan.l:767 -msgid "invalid Unicode escape character" -msgstr "caracter de escape Unicode é inválido" - -#: scan.l:596 scan.l:604 scan.l:612 scan.l:613 scan.l:614 scan.l:1296 -#: scan.l:1323 scan.l:1327 scan.l:1365 scan.l:1369 scan.l:1391 -msgid "invalid Unicode surrogate pair" -msgstr "par substituto (surrogate) Unicode é inválido" - -#: scan.l:618 -#, c-format -msgid "invalid Unicode escape" -msgstr "escape Unicode é inválido" +#: scan.l:628 +msgid "unhandled previous state in xqs" +msgstr "estado anterior não tratado em xqs" -#: scan.l:619 +#: scan.l:702 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "Escapes Unicode devem ser \\uXXXX ou \\UXXXXXXXX." -#: scan.l:630 +#: scan.l:713 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "uso inseguro de \\' em cadeia de caracteres" -#: scan.l:631 +#: scan.l:714 #, c-format msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." -msgstr "Utilize '' para escrever aspóstrofos em cadias de caracteres. \\' é inseguro em codificações de cliente." +msgstr "Use '' para escrever aspóstrofos em cadias de caracteres. \\' é inseguro em codificações de cliente." -#: scan.l:706 +#: scan.l:786 msgid "unterminated dollar-quoted string" msgstr "cadeia de caracteres entre dólares não foi terminada" -#: scan.l:723 scan.l:747 scan.l:762 +#: scan.l:803 scan.l:813 msgid "zero-length delimited identifier" msgstr "identificador delimitado tem tamanho zero" -#: scan.l:782 +#: scan.l:824 syncrep_scanner.l:101 msgid "unterminated quoted identifier" msgstr "identificador entre aspas não foi terminado" -#: scan.l:886 +#: scan.l:987 msgid "operator too long" msgstr "operador muito longo" +#: scan.l:1000 +msgid "trailing junk after parameter" +msgstr "elemento incorreto após parâmetro" + +#: scan.l:1021 +msgid "invalid hexadecimal integer" +msgstr "inteiro hexadecimal inválido" + +#: scan.l:1025 +msgid "invalid octal integer" +msgstr "inteiro octal inválido" + +#: scan.l:1029 +msgid "invalid binary integer" +msgstr "inteiro binário inválido" + #. translator: %s is typically the translation of "syntax error" -#: scan.l:1043 +#: scan.l:1236 #, c-format msgid "%s at end of input" msgstr "%s no fim da entrada" #. translator: first %s is typically the translation of "syntax error" -#: scan.l:1051 +#: scan.l:1244 #, c-format msgid "%s at or near \"%s\"" msgstr "%s em ou próximo a \"%s\"" -#: scan.l:1212 scan.l:1244 -msgid "Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8" -msgstr "Valores de escape Unicode não podem ser utilizados para valores de ponto de código acima de 007F quando a codificação do servidor não for UTF8" - -#: scan.l:1240 scan.l:1383 -msgid "invalid Unicode escape value" -msgstr "valor de escape Unicode é inválido" - -#: scan.l:1439 +#: scan.l:1434 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "uso de \\' fora do padrão em cadeia de caracteres" -#: scan.l:1440 +#: scan.l:1435 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." -msgstr "Utilize '' para escrever cadeias de carateres entre apóstofros, ou utilize a sintaxe de escape de cadeia de caracteres (E'...')." +msgstr "Use '' para escrever cadeias de carateres entre apóstofros, ou use a sintaxe de escape de cadeia de caracteres (E'...')." -#: scan.l:1449 +#: scan.l:1444 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "uso de \\\\ fora do padrão em cadeia de caracteres" -#: scan.l:1450 +#: scan.l:1445 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." -msgstr "Utilize a sintaxe de escape de cadeia de caracteres para barras invertidas, i.e., E'\\\\'." +msgstr "Use a sintaxe de escape de cadeia de caracteres para barras invertidas, i.e., E'\\\\'." -#: scan.l:1464 +#: scan.l:1459 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "uso de escape fora do padrão em cadeia de caracteres" -#: scan.l:1465 +#: scan.l:1460 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." -msgstr "Utilize a sintaxe de escape de cadeia de caracteres para escapes, i.e., E'\\r\\n'." +msgstr "Use a sintaxe de escape de cadeia de caracteres para escapes, i.e., E'\\r\\n'." -#: snowball/dict_snowball.c:180 +#: snowball/dict_snowball.c:215 #, c-format msgid "no Snowball stemmer available for language \"%s\" and encoding \"%s\"" msgstr "nenhum analisador Snowball disponível para idioma \"%s\" e codificação \"%s\"" -#: snowball/dict_snowball.c:203 tsearch/dict_ispell.c:73 -#: tsearch/dict_simple.c:48 +#: snowball/dict_snowball.c:238 tsearch/dict_ispell.c:74 +#: tsearch/dict_simple.c:49 #, c-format msgid "multiple StopWords parameters" msgstr "múltiplos parâmetros StopWords" -#: snowball/dict_snowball.c:212 +#: snowball/dict_snowball.c:247 #, c-format msgid "multiple Language parameters" msgstr "múltiplos parâmetros Language" -#: snowball/dict_snowball.c:219 +#: snowball/dict_snowball.c:254 #, c-format msgid "unrecognized Snowball parameter: \"%s\"" msgstr "parâmetro desconhecido do Snowball: \"%s\"" -#: snowball/dict_snowball.c:227 +#: snowball/dict_snowball.c:262 #, c-format msgid "missing Language parameter" msgstr "faltando parâmetro Language" -#: storage/buffer/bufmgr.c:139 storage/buffer/bufmgr.c:252 +#: statistics/extended_stats.c:179 +#, c-format +msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" +msgstr "" + +#: statistics/mcv.c:1372 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "função que retorna record foi chamada em um contexto que não pode aceitar tipo record" + +#: storage/buffer/bufmgr.c:612 storage/buffer/bufmgr.c:769 #, c-format msgid "cannot access temporary tables of other sessions" -msgstr "não pode acessar tabelas temporárias de outras sessões" +msgstr "não é possível acessar tabelas temporárias de outras sessões" + +#: storage/buffer/bufmgr.c:1137 +#, c-format +msgid "invalid page in block %u of relation %s; zeroing out page" +msgstr "página é inválida no bloco %u da relação %s; zerando página" + +#: storage/buffer/bufmgr.c:1931 storage/buffer/localbuf.c:359 +#, c-format +msgid "cannot extend relation %s beyond %u blocks" +msgstr "não é possível estender a relação %s além de %u blocos" -#: storage/buffer/bufmgr.c:401 +#: storage/buffer/bufmgr.c:1998 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "dado inesperado após EOF no bloco %u da relação %s" -#: storage/buffer/bufmgr.c:403 +#: storage/buffer/bufmgr.c:2000 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Isso tem ocorrido com kernels contendo bugs; considere atualizar seu sistema." -#: storage/buffer/bufmgr.c:493 -#, c-format -msgid "invalid page in block %u of relation %s; zeroing out page" -msgstr "página é inválida no bloco %u da relação %s; zerando página" - -#: storage/buffer/bufmgr.c:3178 +#: storage/buffer/bufmgr.c:5219 #, c-format msgid "could not write block %u of %s" -msgstr "não pôde escrever bloco %u de %s" +msgstr "não foi possível escrever o bloco %u de %s" -#: storage/buffer/bufmgr.c:3180 +#: storage/buffer/bufmgr.c:5221 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Falhas múltiplas --- erro de escrita pode ser permanente." -#: storage/buffer/bufmgr.c:3201 storage/buffer/bufmgr.c:3220 +#: storage/buffer/bufmgr.c:5243 storage/buffer/bufmgr.c:5263 #, c-format msgid "writing block %u of relation %s" msgstr "escrevendo bloco %u da relação %s" -#: storage/buffer/localbuf.c:189 +#: storage/buffer/bufmgr.c:5593 +#, c-format +msgid "snapshot too old" +msgstr "instantâneo muito antigo" + +#: storage/buffer/localbuf.c:219 #, c-format msgid "no empty local buffer available" msgstr "nenhum buffer local vazio está disponível" -#: storage/file/fd.c:505 +#: storage/buffer/localbuf.c:592 +#, c-format +msgid "cannot access temporary tables during a parallel operation" +msgstr "não é possível acessar tabelas temporárias durante uma operação paralela" + +#: storage/buffer/localbuf.c:699 +#, c-format +msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." +msgstr "\"temp_buffers\" não pode ser alterado após qualquer tabela temporária ter sido acessada na sessão." + +#: storage/file/buffile.c:338 +#, c-format +msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" +msgstr "não foi possível abrir o arquivo temporário \"%s\" do BufFile \"%s\": %m" + +#: storage/file/buffile.c:632 +#, c-format +msgid "could not read from file set \"%s\": read only %zu of %zu bytes" +msgstr "não foi possível ler do conjunto de arquivos \"%s\": lidos somente %zu de %zu bytes" + +#: storage/file/buffile.c:634 +#, c-format +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "não foi possível ler o arquivo temporário: lido somente %zu de %zu bytes" + +#: storage/file/buffile.c:774 storage/file/buffile.c:895 +#, c-format +msgid "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" +msgstr "não foi possível determinar o tamanho do arquivo temporário \"%s\" do BufFile \"%s\": %m" + +#: storage/file/buffile.c:974 +#, c-format +msgid "could not delete fileset \"%s\": %m" +msgstr "não foi possível excluir o conjunto de arquivos \"%s\": %m" + +#: storage/file/buffile.c:992 storage/smgr/md.c:338 storage/smgr/md.c:1041 +#, c-format +msgid "could not truncate file \"%s\": %m" +msgstr "não foi possível truncar o arquivo \"%s\": %m" + +#: storage/file/fd.c:537 storage/file/fd.c:609 storage/file/fd.c:645 +#, c-format +msgid "could not flush dirty data: %m" +msgstr "não foi possível descarregar os dados sujos: %m" + +#: storage/file/fd.c:567 +#, c-format +msgid "could not determine dirty data size: %m" +msgstr "não foi possível determinar o tamanho dos dados sujos: %m" + +#: storage/file/fd.c:619 +#, c-format +msgid "could not munmap() while flushing data: %m" +msgstr "não foi possível munmap() enquanto descarregando os dados: %m" + +#: storage/file/fd.c:937 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit falhou: %m" -#: storage/file/fd.c:595 +#: storage/file/fd.c:1027 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "descritores de arquivo disponíveis são insuficientes para iniciar o processo servidor" -#: storage/file/fd.c:596 +#: storage/file/fd.c:1028 #, c-format -msgid "System allows %d, we need at least %d." -msgstr "Sistema permite %d, nós precisamos pelo menos de %d." +msgid "System allows %d, server needs at least %d." +msgstr "O sistema permite %d, o servidor precisa de pelo menos %d." -#: storage/file/fd.c:637 storage/file/fd.c:1671 storage/file/fd.c:1764 -#: storage/file/fd.c:1912 +#: storage/file/fd.c:1116 storage/file/fd.c:2565 storage/file/fd.c:2674 +#: storage/file/fd.c:2825 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "sem descritores de arquivo: %m; libere e tente novamente" -#: storage/file/fd.c:1211 +#: storage/file/fd.c:1490 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "arquivo temporário: caminho \"%s\", tamanho %lu" -#: storage/file/fd.c:1360 +#: storage/file/fd.c:1629 +#, c-format +msgid "cannot create temporary directory \"%s\": %m" +msgstr "não é possível criar o diretório temporário \"%s\": %m" + +#: storage/file/fd.c:1636 +#, c-format +msgid "cannot create temporary subdirectory \"%s\": %m" +msgstr "não é possível criar o subdiretório temporário \"%s\": %m" + +#: storage/file/fd.c:1833 +#, c-format +msgid "could not create temporary file \"%s\": %m" +msgstr "não foi possível criar o arquivo temporário \"%s\": %m" + +#: storage/file/fd.c:1869 +#, c-format +msgid "could not open temporary file \"%s\": %m" +msgstr "não foi possível abrir o arquivo temporário \"%s\": %m" + +#: storage/file/fd.c:1910 +#, c-format +msgid "could not unlink temporary file \"%s\": %m" +msgstr "não foi possível desvincular o arquivo temporário \"%s\": %m" + +#: storage/file/fd.c:1998 +#, c-format +msgid "could not delete file \"%s\": %m" +msgstr "não foi possível excluir o arquivo \"%s\": %m" + +#: storage/file/fd.c:2185 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "tamanho do arquivo temporário excede temp_file_limit (%dkB)" -#: storage/file/fd.c:1647 storage/file/fd.c:1697 +#: storage/file/fd.c:2541 storage/file/fd.c:2600 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" -msgstr "maxAllocatedDescs excedido (%d) ao tentar abrir arquivo \"%s\"" +msgstr "maxAllocatedDescs excedido (%d) ao tentar abrir o arquivo \"%s\"" -#: storage/file/fd.c:1737 +#: storage/file/fd.c:2645 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "maxAllocatedDescs excedido (%d) ao tentar executar comando \"%s\"" -#: storage/file/fd.c:1888 +#: storage/file/fd.c:2801 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" -msgstr "maxAllocatedDescs excedido (%d) ao tentar abrir diretório \"%s\"" +msgstr "maxAllocatedDescs excedido (%d) ao tentar abrir o diretório \"%s\"" -#: storage/file/fd.c:1961 +#: storage/file/fd.c:3331 #, c-format -msgid "could not read directory \"%s\": %m" -msgstr "não pôde ler diretório \"%s\": %m" +msgid "unexpected file found in temporary-files directory: \"%s\"" +msgstr "arquivo não esperado encontrado no diretório de arquivos temporários: \"%s\"" -#: storage/ipc/dsm.c:363 +#: storage/file/fd.c:3449 #, c-format -msgid "dynamic shared memory control segment is corrupt" -msgstr "segmento de controle da memória compartilhada dinâmica está corrompido" +msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/fd.c:3463 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "não foi possível sincronizar o sistema de arquivos para o arquivo \"%s\": %m" + +#: storage/file/fd.c:3676 +#, c-format +msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/fd.c:3708 +#, c-format +msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/fd.c:3897 +#, c-format +msgid "debug_io_direct is not supported on this platform." +msgstr "debug_io_direct não tem suporte por essa plataforma." + +#: storage/file/fd.c:3944 +#, c-format +msgid "debug_io_direct is not supported for WAL because XLOG_BLCKSZ is too small" +msgstr "" + +#: storage/file/fd.c:3951 +#, c-format +msgid "debug_io_direct is not supported for data because BLCKSZ is too small" +msgstr "" + +#: storage/file/reinit.c:145 +#, c-format +msgid "resetting unlogged relations (init), elapsed time: %ld.%02d s, current path: %s" +msgstr "" + +#: storage/file/reinit.c:148 +#, c-format +msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" +msgstr "" -#: storage/ipc/dsm.c:410 +#: storage/file/sharedfileset.c:79 #, c-format -msgid "dynamic shared memory is disabled" -msgstr "memória compartilhada dinâmica está desabilitada" +msgid "could not attach to a SharedFileSet that is already destroyed" +msgstr "" -#: storage/ipc/dsm.c:411 +#: storage/ipc/dsm.c:352 #, c-format -msgid "Set dynamic_shared_memory_type to a value other than \"none\"." -msgstr "Define dynamic_shared_memory_type para um valor diferente de \"none\"." +msgid "dynamic shared memory control segment is corrupt" +msgstr "segmento de controle da memória compartilhada dinâmica está corrompido" -#: storage/ipc/dsm.c:431 +#: storage/ipc/dsm.c:417 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "segmento de controle da memória compartilhada dinâmica não é válido" -#: storage/ipc/dsm.c:501 +#: storage/ipc/dsm.c:599 #, c-format msgid "too many dynamic shared memory segments" msgstr "muitos segmentos de memória compartilhada dinâmica" -#: storage/ipc/dsm_impl.c:261 storage/ipc/dsm_impl.c:361 -#: storage/ipc/dsm_impl.c:533 storage/ipc/dsm_impl.c:648 -#: storage/ipc/dsm_impl.c:811 storage/ipc/dsm_impl.c:953 +#: storage/ipc/dsm_impl.c:231 storage/ipc/dsm_impl.c:537 +#: storage/ipc/dsm_impl.c:641 storage/ipc/dsm_impl.c:812 #, c-format msgid "could not unmap shared memory segment \"%s\": %m" -msgstr "não pôde remover mapeamento de segmento de memória compartilhada \"%s\": %m" +msgstr "não foi possível remover mapeamento de segmento de memória compartilhada \"%s\": %m" -#: storage/ipc/dsm_impl.c:271 storage/ipc/dsm_impl.c:543 -#: storage/ipc/dsm_impl.c:658 storage/ipc/dsm_impl.c:821 +#: storage/ipc/dsm_impl.c:241 storage/ipc/dsm_impl.c:547 +#: storage/ipc/dsm_impl.c:651 storage/ipc/dsm_impl.c:822 #, c-format msgid "could not remove shared memory segment \"%s\": %m" -msgstr "não pôde remover segmento de memória compartilhada \"%s\": %m" +msgstr "não foi possível remover segmento de memória compartilhada \"%s\": %m" -#: storage/ipc/dsm_impl.c:292 storage/ipc/dsm_impl.c:721 -#: storage/ipc/dsm_impl.c:835 +#: storage/ipc/dsm_impl.c:265 storage/ipc/dsm_impl.c:722 +#: storage/ipc/dsm_impl.c:836 #, c-format msgid "could not open shared memory segment \"%s\": %m" -msgstr "não pôde abrir segmento de memória compartilhada \"%s\": %m" +msgstr "não foi possível abrir segmento de memória compartilhada \"%s\": %m" -#: storage/ipc/dsm_impl.c:316 storage/ipc/dsm_impl.c:559 -#: storage/ipc/dsm_impl.c:766 storage/ipc/dsm_impl.c:859 +#: storage/ipc/dsm_impl.c:290 storage/ipc/dsm_impl.c:563 +#: storage/ipc/dsm_impl.c:767 storage/ipc/dsm_impl.c:860 #, c-format msgid "could not stat shared memory segment \"%s\": %m" -msgstr "não pôde executar stat no segmento de memória compartilhada \"%s\": %m" +msgstr "não foi possível executar stat no segmento de memória compartilhada \"%s\": %m" -#: storage/ipc/dsm_impl.c:335 storage/ipc/dsm_impl.c:878 -#: storage/ipc/dsm_impl.c:926 +#: storage/ipc/dsm_impl.c:309 storage/ipc/dsm_impl.c:911 #, c-format msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" -msgstr "não pôde redimensionar segmento de memória compartilhada \"%s\" para %zu bytes: %m" +msgstr "não foi possível redimensionar segmento de memória compartilhada \"%s\" para %zu bytes: %m" -#: storage/ipc/dsm_impl.c:385 storage/ipc/dsm_impl.c:580 -#: storage/ipc/dsm_impl.c:742 storage/ipc/dsm_impl.c:977 +#: storage/ipc/dsm_impl.c:331 storage/ipc/dsm_impl.c:584 +#: storage/ipc/dsm_impl.c:743 storage/ipc/dsm_impl.c:933 #, c-format msgid "could not map shared memory segment \"%s\": %m" -msgstr "não pôde criar mapeamento de segmento de memória compartilhada \"%s\": %m" +msgstr "não foi possível criar mapeamento de segmento de memória compartilhada \"%s\": %m" -#: storage/ipc/dsm_impl.c:515 +#: storage/ipc/dsm_impl.c:519 #, c-format msgid "could not get shared memory segment: %m" -msgstr "não pôde obter segmento de memória compartilhada: %m" +msgstr "não foi possível obter segmento de memória compartilhada: %m" + +#: storage/ipc/dsm_impl.c:707 +#, c-format +msgid "could not create shared memory segment \"%s\": %m" +msgstr "não foi possível criar segmento de memória compartilhada \"%s\": %m" + +#: storage/ipc/dsm_impl.c:944 +#, c-format +msgid "could not close shared memory segment \"%s\": %m" +msgstr "não foi possível fechar o segmento de memória compartilhada \"%s\": %m" + +#: storage/ipc/dsm_impl.c:984 storage/ipc/dsm_impl.c:1033 +#, c-format +msgid "could not duplicate handle for \"%s\": %m" +msgstr "não foi possível duplicar o tratador para \"%s\": %m" + +#: storage/ipc/procarray.c:3795 +#, c-format +msgid "database \"%s\" is being used by prepared transactions" +msgstr "o banco de dados \"%s\" está sendo usado por transações preparadas" + +#: storage/ipc/procarray.c:3827 storage/ipc/procarray.c:3836 +#: storage/ipc/signalfuncs.c:235 storage/ipc/signalfuncs.c:242 +#, c-format +msgid "permission denied to terminate process" +msgstr "permissão negada para terminar o processo" + +#: storage/ipc/procarray.c:3828 storage/ipc/signalfuncs.c:236 +#, c-format +msgid "Only roles with the %s attribute may terminate processes of roles with the %s attribute." +msgstr "" + +#: storage/ipc/procarray.c:3837 storage/ipc/signalfuncs.c:243 +#, c-format +msgid "Only roles with privileges of the role whose process is being terminated or with privileges of the \"%s\" role may terminate this process." +msgstr "" + +#: storage/ipc/procsignal.c:420 +#, c-format +msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" +msgstr "" + +#: storage/ipc/shm_mq.c:384 +#, c-format +msgid "cannot send a message of size %zu via shared memory queue" +msgstr "" + +#: storage/ipc/shm_mq.c:719 +#, c-format +msgid "invalid message size %zu in shared memory queue" +msgstr "" + +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:963 +#: storage/lmgr/lock.c:1001 storage/lmgr/lock.c:2786 storage/lmgr/lock.c:4171 +#: storage/lmgr/lock.c:4236 storage/lmgr/lock.c:4586 +#: storage/lmgr/predicate.c:2412 storage/lmgr/predicate.c:2427 +#: storage/lmgr/predicate.c:3824 storage/lmgr/predicate.c:4871 +#: utils/hash/dynahash.c:1107 +#, c-format +msgid "out of shared memory" +msgstr "sem memória compartilhada" + +#: storage/ipc/shmem.c:170 storage/ipc/shmem.c:266 +#, c-format +msgid "out of shared memory (%zu bytes requested)" +msgstr "memória compartilhada esgotada (%zu bytes solicitados)" + +#: storage/ipc/shmem.c:445 +#, c-format +msgid "could not create ShmemIndex entry for data structure \"%s\"" +msgstr "não foi possível criar entrada ShmemIndex para estrutura de dados \"%s\"" + +#: storage/ipc/shmem.c:460 +#, c-format +msgid "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, actual %zu" +msgstr "tamanho da entrada de ShmemIndex está errado para estrutura de dados \"%s\": esperado %zu, atual %zu" + +#: storage/ipc/shmem.c:479 +#, c-format +msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" +msgstr "não há memória compartilhada suficiente para estrutura de dados \"%s\" (%zu bytes solicitados)" + +#: storage/ipc/shmem.c:511 storage/ipc/shmem.c:530 +#, c-format +msgid "requested shared memory size overflows size_t" +msgstr "tamanho de memória compartilhada solicitado ultrapassa size_t" + +#: storage/ipc/signalfuncs.c:72 +#, c-format +msgid "PID %d is not a PostgreSQL backend process" +msgstr "o PID %d não é de um processo servidor do PostgreSQL" + +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1387 +#: utils/adt/mcxtfuncs.c:190 +#, c-format +msgid "could not send signal to process %d: %m" +msgstr "não foi possível enviar sinal para processo %d: %m" + +#: storage/ipc/signalfuncs.c:129 storage/ipc/signalfuncs.c:136 +#, c-format +msgid "permission denied to cancel query" +msgstr "permissão negada para cancelar a consulta" + +#: storage/ipc/signalfuncs.c:130 +#, c-format +msgid "Only roles with the %s attribute may cancel queries of roles with the %s attribute." +msgstr "" + +#: storage/ipc/signalfuncs.c:137 +#, c-format +msgid "Only roles with privileges of the role whose query is being canceled or with privileges of the \"%s\" role may cancel this query." +msgstr "" + +#: storage/ipc/signalfuncs.c:179 +#, c-format +msgid "could not check the existence of the backend with PID %d: %m" +msgstr "" -#: storage/ipc/dsm_impl.c:694 +#: storage/ipc/signalfuncs.c:197 #, c-format -msgid "could not create shared memory segment \"%s\": %m" -msgstr "não pôde criar segmento de memória compartilhada \"%s\": %m" +msgid "backend with PID %d did not terminate within %lld millisecond" +msgid_plural "backend with PID %d did not terminate within %lld milliseconds" +msgstr[0] "" +msgstr[1] "" -#: storage/ipc/dsm_impl.c:1018 +#: storage/ipc/signalfuncs.c:228 #, c-format -msgid "could not duplicate handle for \"%s\": %m" -msgstr "não pôde duplicar manipulador para \"%s\": %m" +msgid "\"timeout\" must not be negative" +msgstr "\"timeout\" não deve ser negativo" -#: storage/ipc/shm_toc.c:108 storage/ipc/shm_toc.c:189 storage/ipc/shmem.c:205 -#: storage/lmgr/lock.c:872 storage/lmgr/lock.c:906 storage/lmgr/lock.c:2601 -#: storage/lmgr/lock.c:3713 storage/lmgr/lock.c:3778 storage/lmgr/lock.c:4068 -#: storage/lmgr/predicate.c:2323 storage/lmgr/predicate.c:2338 -#: storage/lmgr/predicate.c:3731 storage/lmgr/predicate.c:4874 -#: storage/lmgr/proc.c:198 utils/hash/dynahash.c:966 +#: storage/ipc/signalfuncs.c:284 #, c-format -msgid "out of shared memory" -msgstr "sem memória compartilhada" +msgid "must be superuser to rotate log files with adminpack 1.0" +msgstr "é necessário ser um superusuário para executar a rotação de arquivos de registro de eventos (log) com adminpack 1.0" -#: storage/ipc/shmem.c:361 storage/ipc/shmem.c:412 +#. translator: %s is a SQL function name +#: storage/ipc/signalfuncs.c:286 utils/adt/genfile.c:250 #, c-format -msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" -msgstr "não há memória compartilhada suficiente para estrutura de dados \"%s\" (%zu bytes solicitados)" +msgid "Consider using %s, which is part of core, instead." +msgstr "Considere usar %s, que é parte do núcleo, em vez disso." -#: storage/ipc/shmem.c:380 +#: storage/ipc/signalfuncs.c:292 storage/ipc/signalfuncs.c:312 #, c-format -msgid "could not create ShmemIndex entry for data structure \"%s\"" -msgstr "não pôde criar entrada ShmemIndex para estrutura de dados \"%s\"" +msgid "rotation not possible because log collection not active" +msgstr "a rotação não é possível, porque a coleta de registro de eventos (log) não está ativa" -#: storage/ipc/shmem.c:395 +#: storage/ipc/standby.c:330 #, c-format -msgid "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, actual %zu" -msgstr "tamanho da entrada de ShmemIndex está errado para estrutura de dados \"%s\": esperado %zu, atual %zu" +msgid "recovery still waiting after %ld.%03d ms: %s" +msgstr "recuperação ainda aguardando após %ld.%03d ms: %s" -#: storage/ipc/shmem.c:440 storage/ipc/shmem.c:459 +#: storage/ipc/standby.c:339 #, c-format -msgid "requested shared memory size overflows size_t" -msgstr "tamanho de memória compartilhada solicitado ultrapassa size_t" +msgid "recovery finished waiting after %ld.%03d ms: %s" +msgstr "a recuperação terminou a espera após %ld.%03d ms: %s" -#: storage/ipc/standby.c:499 tcop/postgres.c:2952 +#: storage/ipc/standby.c:921 tcop/postgres.c:3384 #, c-format msgid "canceling statement due to conflict with recovery" -msgstr "cancelando comando por causa de um conflito com recuperação" +msgstr "cancelando a instrução devido a um conflito com a recuperação" -#: storage/ipc/standby.c:500 tcop/postgres.c:2216 +#: storage/ipc/standby.c:922 tcop/postgres.c:2533 #, c-format msgid "User transaction caused buffer deadlock with recovery." -msgstr "Transação do usuário causou impasse com a recuperação." +msgstr "A transação do usuário causou impasse com a recuperação." + +#: storage/ipc/standby.c:1488 +msgid "unknown reason" +msgstr "razão desconhecida" + +#: storage/ipc/standby.c:1493 +msgid "recovery conflict on buffer pin" +msgstr "" + +#: storage/ipc/standby.c:1496 +msgid "recovery conflict on lock" +msgstr "conflito de recuperação no bloqueio" + +#: storage/ipc/standby.c:1499 +msgid "recovery conflict on tablespace" +msgstr "conflito de recuperação no espaço de tabelas" + +#: storage/ipc/standby.c:1502 +msgid "recovery conflict on snapshot" +msgstr "" + +#: storage/ipc/standby.c:1505 +msgid "recovery conflict on replication slot" +msgstr "conflito de recuperação no encaixe de replicação" + +#: storage/ipc/standby.c:1508 +msgid "recovery conflict on buffer deadlock" +msgstr "" -#: storage/large_object/inv_api.c:203 +#: storage/ipc/standby.c:1511 +msgid "recovery conflict on database" +msgstr "conflito de recuperação no banco de dados" + +#: storage/large_object/inv_api.c:191 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "entrada em pg_largeobject para OID %u, página %d tem tamanho de campo inválido %d" -#: storage/large_object/inv_api.c:284 +#: storage/large_object/inv_api.c:273 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "marcadores inválidos para abrir um objeto grande: %d" -#: storage/large_object/inv_api.c:436 +#: storage/large_object/inv_api.c:456 #, c-format msgid "invalid whence setting: %d" msgstr "definição de whence é inválida: %d" -#: storage/large_object/inv_api.c:591 +#: storage/large_object/inv_api.c:628 #, c-format msgid "invalid large object write request size: %d" msgstr "tamanho requisitado para escrita de objeto grande é inválido: %d" -#: storage/lmgr/deadlock.c:925 +#: storage/lmgr/deadlock.c:1104 #, c-format msgid "Process %d waits for %s on %s; blocked by process %d." msgstr "Processo %d espera por %s em %s; bloqueado pelo processo %d." -#: storage/lmgr/deadlock.c:944 +#: storage/lmgr/deadlock.c:1123 #, c-format msgid "Process %d: %s" msgstr "Processo %d: %s" -#: storage/lmgr/deadlock.c:953 +#: storage/lmgr/deadlock.c:1132 #, c-format msgid "deadlock detected" msgstr "impasse detectado" -#: storage/lmgr/deadlock.c:956 +#: storage/lmgr/deadlock.c:1135 #, c-format msgid "See server log for query details." msgstr "Veja log do servidor para obter detalhes das consultas." -#: storage/lmgr/lmgr.c:599 +#: storage/lmgr/lmgr.c:859 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "enquanto atualizava tupla (%u,%u) na relação \"%s\"" -#: storage/lmgr/lmgr.c:602 +#: storage/lmgr/lmgr.c:862 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "enquanto removia tupla (%u,%u) na relação \"%s\"" -#: storage/lmgr/lmgr.c:605 +#: storage/lmgr/lmgr.c:865 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "enquanto bloqueava tupla (%u,%u) na relação \"%s\"" -#: storage/lmgr/lmgr.c:608 +#: storage/lmgr/lmgr.c:868 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "enquanto bloqueava versão atualizada (%u,%u) da tupla na relação \"%s\"" -#: storage/lmgr/lmgr.c:611 +#: storage/lmgr/lmgr.c:871 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "enquanto inseria tupla de índice (%u,%u) na relação \"%s\"" -#: storage/lmgr/lmgr.c:614 +#: storage/lmgr/lmgr.c:874 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "enquanto verificava unicidade da tupla (%u,%u) na relação \"%s\"" -#: storage/lmgr/lmgr.c:617 +#: storage/lmgr/lmgr.c:877 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "enquanto verificava novamente tupla atualizada (%u,%u) na relação \"%s\"" -#: storage/lmgr/lmgr.c:620 +#: storage/lmgr/lmgr.c:880 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "enquanto verificava restrição de exclusão na tupla (%u,%u) na relação \"%s\"" -#: storage/lmgr/lmgr.c:840 +#: storage/lmgr/lmgr.c:1174 #, c-format msgid "relation %u of database %u" msgstr "relação %u do banco de dados %u" -#: storage/lmgr/lmgr.c:846 +#: storage/lmgr/lmgr.c:1180 #, c-format msgid "extension of relation %u of database %u" msgstr "extensão da relação %u do banco de dados %u" -#: storage/lmgr/lmgr.c:852 +#: storage/lmgr/lmgr.c:1186 +#, c-format +msgid "pg_database.datfrozenxid of database %u" +msgstr "pg_database.datfrozenxid do banco de dados %u" + +#: storage/lmgr/lmgr.c:1191 #, c-format msgid "page %u of relation %u of database %u" msgstr "página %u da relação %u do banco de dados %u" -#: storage/lmgr/lmgr.c:859 +#: storage/lmgr/lmgr.c:1198 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "tupla (%u,%u) da relação %u do banco de dados %u" -#: storage/lmgr/lmgr.c:867 +#: storage/lmgr/lmgr.c:1206 #, c-format msgid "transaction %u" msgstr "transação %u" -#: storage/lmgr/lmgr.c:872 +#: storage/lmgr/lmgr.c:1211 #, c-format msgid "virtual transaction %d/%u" msgstr "transação virtual %d/%u" -#: storage/lmgr/lmgr.c:878 +#: storage/lmgr/lmgr.c:1217 +#, c-format +msgid "speculative token %u of transaction %u" +msgstr "token especulativo %u da transação %u" + +#: storage/lmgr/lmgr.c:1223 #, c-format msgid "object %u of class %u of database %u" msgstr "objeto %u da classe %u do banco de dados %u" -#: storage/lmgr/lmgr.c:886 +#: storage/lmgr/lmgr.c:1231 #, c-format msgid "user lock [%u,%u,%u]" msgstr "bloqueio do usuário [%u,%u,%u]" -#: storage/lmgr/lmgr.c:893 +#: storage/lmgr/lmgr.c:1238 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "bloqueio sob aviso [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:901 +#: storage/lmgr/lmgr.c:1246 +#, c-format +msgid "remote transaction %u of subscription %u of database %u" +msgstr "transação remota %u da subscrição %u do banco de dados %u" + +#: storage/lmgr/lmgr.c:1253 #, c-format msgid "unrecognized locktag type %d" msgstr "tipo de marcação de bloqueio %d desconhecido" -#: storage/lmgr/lock.c:721 +#: storage/lmgr/lock.c:791 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" -msgstr "não pode adquirir modo de bloqueio %s em objetos de banco de dados enquanto recuperação está em progresso" +msgstr "não é possível adquirir o modo de bloqueio %s em objetos de banco de dados enquanto recuperação está em progresso" -#: storage/lmgr/lock.c:723 +#: storage/lmgr/lock.c:793 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "Somente RowExclusiveLock ou menos pode ser adquirido em objetos de banco de dados durante recuperação." -#: storage/lmgr/lock.c:873 storage/lmgr/lock.c:907 storage/lmgr/lock.c:2602 -#: storage/lmgr/lock.c:3714 storage/lmgr/lock.c:3779 storage/lmgr/lock.c:4069 -#, c-format -msgid "You might need to increase max_locks_per_transaction." -msgstr "Você pode precisar aumentar max_locks_per_transaction." - -#: storage/lmgr/lock.c:3039 storage/lmgr/lock.c:3151 +#: storage/lmgr/lock.c:3235 storage/lmgr/lock.c:3303 storage/lmgr/lock.c:3419 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" -msgstr "não pode executar PREPARE enquanto se mantém bloqueios tanto a nível de sessão quanto a nível de transação no mesmo objeto" +msgstr "não é possível executar PREPARE enquanto se mantém bloqueios tanto a nível de sessão quanto a nível de transação no mesmo objeto" -#: storage/lmgr/predicate.c:674 +#: storage/lmgr/predicate.c:649 #, c-format msgid "not enough elements in RWConflictPool to record a read/write conflict" msgstr "não há elementos suficientes em RWConflictPool para registrar um conflito de leitura/escrita" -#: storage/lmgr/predicate.c:675 storage/lmgr/predicate.c:703 +#: storage/lmgr/predicate.c:650 storage/lmgr/predicate.c:675 #, c-format msgid "You might need to run fewer transactions at a time or increase max_connections." msgstr "Talvez seja necessário executar poucas transações ao mesmo tempo or aumentar max_connections." -#: storage/lmgr/predicate.c:702 +#: storage/lmgr/predicate.c:674 #, c-format msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "não há elementos suficientes em RWConflictPool para registrar um conflito potencial de leitura/escrita" -#: storage/lmgr/predicate.c:907 -#, c-format -msgid "memory for serializable conflict tracking is nearly exhausted" -msgstr "memória para rastreamento de conflitos de serialização está quase esgotada" - -#: storage/lmgr/predicate.c:908 -#, c-format -msgid "There might be an idle transaction or a forgotten prepared transaction causing this." -msgstr "Pode haver uma transação ociosa ou uma transação preparada em aberto causando isso." - -#: storage/lmgr/predicate.c:1190 storage/lmgr/predicate.c:1262 -#, c-format -msgid "not enough shared memory for elements of data structure \"%s\" (%zu bytes requested)" -msgstr "não há memória compartilhada suficiente para elementos da estrutura de dados \"%s\" (%zu bytes solicitados)" - -#: storage/lmgr/predicate.c:1550 -#, c-format -msgid "deferrable snapshot was unsafe; trying a new one" -msgstr "instantâneo postergável é inseguro; tentando um novo" - -#: storage/lmgr/predicate.c:1589 +#: storage/lmgr/predicate.c:1630 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "\"default_transaction_isolation\" está definido como \"serializable\"." -#: storage/lmgr/predicate.c:1590 +#: storage/lmgr/predicate.c:1631 #, c-format msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." msgstr "Você pode utilizar \"SET default_transaction_isolation = 'repeatable read'\" para mudar o padrão." -#: storage/lmgr/predicate.c:1629 +#: storage/lmgr/predicate.c:1682 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "uma transação que importa instantâneo não deve ser READ ONLY DEFERRABLE" -#: storage/lmgr/predicate.c:1699 utils/time/snapmgr.c:398 +#: storage/lmgr/predicate.c:1761 utils/time/snapmgr.c:570 +#: utils/time/snapmgr.c:576 #, c-format msgid "could not import the requested snapshot" -msgstr "não pôde importar o instantâneo solicitado" - -#: storage/lmgr/predicate.c:1700 utils/time/snapmgr.c:399 -#, c-format -msgid "The source transaction %u is not running anymore." -msgstr "A transação de origem %u não está em execução." +msgstr "não foi possível importar o instantâneo solicitado" -#: storage/lmgr/predicate.c:2324 storage/lmgr/predicate.c:2339 -#: storage/lmgr/predicate.c:3732 +#: storage/lmgr/predicate.c:1762 utils/time/snapmgr.c:577 #, c-format -msgid "You might need to increase max_pred_locks_per_transaction." -msgstr "Você pode precisar aumentar max_pred_locks_per_transaction." +msgid "The source process with PID %d is not running anymore." +msgstr "O processo de origem com PID %d não está mais em execução." -#: storage/lmgr/predicate.c:3886 storage/lmgr/predicate.c:3975 -#: storage/lmgr/predicate.c:3983 storage/lmgr/predicate.c:4022 -#: storage/lmgr/predicate.c:4261 storage/lmgr/predicate.c:4598 -#: storage/lmgr/predicate.c:4610 storage/lmgr/predicate.c:4652 -#: storage/lmgr/predicate.c:4690 +#: storage/lmgr/predicate.c:3935 storage/lmgr/predicate.c:3971 +#: storage/lmgr/predicate.c:4004 storage/lmgr/predicate.c:4012 +#: storage/lmgr/predicate.c:4051 storage/lmgr/predicate.c:4281 +#: storage/lmgr/predicate.c:4600 storage/lmgr/predicate.c:4612 +#: storage/lmgr/predicate.c:4659 storage/lmgr/predicate.c:4695 #, c-format msgid "could not serialize access due to read/write dependencies among transactions" -msgstr "não pôde serializar acesso devido a dependências de leitura/escrita entre transações" +msgstr "não foi possível serializar acesso devido a dependências de leitura/escrita entre transações" -#: storage/lmgr/predicate.c:3888 storage/lmgr/predicate.c:3977 -#: storage/lmgr/predicate.c:3985 storage/lmgr/predicate.c:4024 -#: storage/lmgr/predicate.c:4263 storage/lmgr/predicate.c:4600 -#: storage/lmgr/predicate.c:4612 storage/lmgr/predicate.c:4654 -#: storage/lmgr/predicate.c:4692 +#: storage/lmgr/predicate.c:3937 storage/lmgr/predicate.c:3973 +#: storage/lmgr/predicate.c:4006 storage/lmgr/predicate.c:4014 +#: storage/lmgr/predicate.c:4053 storage/lmgr/predicate.c:4283 +#: storage/lmgr/predicate.c:4602 storage/lmgr/predicate.c:4614 +#: storage/lmgr/predicate.c:4661 storage/lmgr/predicate.c:4697 #, c-format msgid "The transaction might succeed if retried." msgstr "A transação pode ter sucesso se repetida." -#: storage/lmgr/proc.c:1172 -#, c-format -msgid "Process %d waits for %s on %s." -msgstr "Processo %d espera por %s em %s." - -#: storage/lmgr/proc.c:1182 -#, c-format -msgid "sending cancel to blocking autovacuum PID %d" -msgstr "enviando cancelamento para PID de limpeza automática %d que bloqueia" - -#: storage/lmgr/proc.c:1194 utils/adt/misc.c:136 +#: storage/lmgr/proc.c:349 #, c-format -msgid "could not send signal to process %d: %m" -msgstr "não pôde enviar sinal para processo %d: %m" +msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" +msgstr "número de conexões dos servidores em espera solicitadas excedeu max_wal_senders (atualmente %d)" -#: storage/lmgr/proc.c:1293 +#: storage/lmgr/proc.c:1480 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "processo %d evitou impasse por %s em %s ao reorganizar a ordem da fila após %ld.%03d ms" -#: storage/lmgr/proc.c:1308 +#: storage/lmgr/proc.c:1495 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "processo %d detectou impasse enquanto esperava por %s em %s após %ld.%03d ms" -#: storage/lmgr/proc.c:1317 +#: storage/lmgr/proc.c:1504 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "processo %d ainda espera por %s em %s após %ld.%03d ms" -#: storage/lmgr/proc.c:1324 +#: storage/lmgr/proc.c:1511 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "processo %d obteve %s em %s após %ld.%03d ms" -#: storage/lmgr/proc.c:1340 +#: storage/lmgr/proc.c:1528 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "processo %d falhou ao obter %s em %s após %ld.%03d ms" -#: storage/page/bufpage.c:144 +#: storage/page/bufpage.c:152 #, c-format msgid "page verification failed, calculated checksum %u but expected %u" msgstr "verificação de página falhou, soma de verificação calculada %u mas esperada %u" -#: storage/page/bufpage.c:200 storage/page/bufpage.c:459 -#: storage/page/bufpage.c:691 storage/page/bufpage.c:823 +#: storage/page/bufpage.c:217 storage/page/bufpage.c:730 +#: storage/page/bufpage.c:1073 storage/page/bufpage.c:1208 +#: storage/page/bufpage.c:1314 storage/page/bufpage.c:1426 #, c-format msgid "corrupted page pointers: lower = %u, upper = %u, special = %u" msgstr "ponteiros de página corrompidos: inferior = %u, superior = %u, especial = %u" -#: storage/page/bufpage.c:503 +#: storage/page/bufpage.c:759 #, c-format -msgid "corrupted item pointer: %u" -msgstr "ponteiro de item corrompido: %u" +msgid "corrupted line pointer: %u" +msgstr "ponteiro de linha corrompido: %u" -#: storage/page/bufpage.c:514 storage/page/bufpage.c:874 +#: storage/page/bufpage.c:789 storage/page/bufpage.c:1266 #, c-format msgid "corrupted item lengths: total %u, available space %u" msgstr "tamanhos de itens corrompidos: total %u, espaço livre %u" -#: storage/page/bufpage.c:710 storage/page/bufpage.c:847 -#, c-format -msgid "corrupted item pointer: offset = %u, size = %u" -msgstr "ponteiro de item corrompido: posição = %u, tamanho = %u" - -#: storage/smgr/md.c:426 storage/smgr/md.c:897 +#: storage/page/bufpage.c:1092 storage/page/bufpage.c:1233 +#: storage/page/bufpage.c:1330 storage/page/bufpage.c:1442 #, c-format -msgid "could not truncate file \"%s\": %m" -msgstr "não pôde truncar arquivo \"%s\": %m" +msgid "corrupted line pointer: offset = %u, size = %u" +msgstr "ponteiro de linha corrompido: deslocamento = %u, tamanho = %u" -#: storage/smgr/md.c:493 +#: storage/smgr/md.c:487 storage/smgr/md.c:549 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" -msgstr "não pode estender arquivo \"%s\" além de %u blocos" - -#: storage/smgr/md.c:515 storage/smgr/md.c:676 storage/smgr/md.c:751 -#, c-format -msgid "could not seek to block %u in file \"%s\": %m" -msgstr "não pôde posicionar no bloco %u no arquivo \"%s\": %m" +msgstr "não é possível estender o arquivo \"%s\" além de %u blocos" -#: storage/smgr/md.c:523 +#: storage/smgr/md.c:502 storage/smgr/md.c:613 #, c-format msgid "could not extend file \"%s\": %m" -msgstr "não pôde estender arquivo \"%s\": %m" +msgstr "não foi possível estender o arquivo \"%s\": %m" -#: storage/smgr/md.c:525 storage/smgr/md.c:532 storage/smgr/md.c:778 +#: storage/smgr/md.c:508 #, c-format -msgid "Check free disk space." -msgstr "Verifique o espaço em disco livre." +msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" +msgstr "não foi possível estender o arquivo \"%s\": escritos somente %d de %d bytes no bloco %u" -#: storage/smgr/md.c:529 +#: storage/smgr/md.c:591 #, c-format -msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" -msgstr "não pôde estender arquivo \"%s\": escreveu somente %d de %d bytes no bloco %u" +msgid "could not extend file \"%s\" with FileFallocate(): %m" +msgstr "não foi possível estender o arquivo \"%s\" com FileFallocate(): %m" -#: storage/smgr/md.c:694 +#: storage/smgr/md.c:782 #, c-format msgid "could not read block %u in file \"%s\": %m" -msgstr "não pôde ler bloco %u no arquivo \"%s\": %m" +msgstr "não foi possível ler o bloco %u no arquivo \"%s\": %m" -#: storage/smgr/md.c:710 +#: storage/smgr/md.c:798 #, c-format msgid "could not read block %u in file \"%s\": read only %d of %d bytes" -msgstr "não pôde ler bloco %u no arquivo \"%s\": leu somente %d de %d bytes" +msgstr "não foi possível ler o bloco %u no arquivo \"%s\": lidos somente %d de %d bytes" -#: storage/smgr/md.c:769 +#: storage/smgr/md.c:856 #, c-format msgid "could not write block %u in file \"%s\": %m" -msgstr "não pôde escrever bloco %u no arquivo \"%s\": %m" +msgstr "não foi possível escrever o bloco %u no arquivo \"%s\": %m" -#: storage/smgr/md.c:774 +#: storage/smgr/md.c:861 #, c-format msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" -msgstr "não pôde escrever bloco %u no arquivo \"%s\": escreveu somente %d de %d bytes" +msgstr "não foi possível escrever o bloco %u no arquivo \"%s\": escritos somente %d de %d bytes" -#: storage/smgr/md.c:873 +#: storage/smgr/md.c:1012 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" -msgstr "não pôde truncar arquivo \"%s\" para %u blocos: há somente %u blocos agora" +msgstr "não foi possível truncar o arquivo \"%s\" para %u blocos: há somente %u blocos agora" -#: storage/smgr/md.c:922 +#: storage/smgr/md.c:1067 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" -msgstr "não pôde truncar arquivo \"%s\" para %u blocos: %m" - -#: storage/smgr/md.c:1202 -#, c-format -msgid "could not fsync file \"%s\" but retrying: %m" -msgstr "não pôde executar fsync no arquivo \"%s\" mas tentando novamente: %m" +msgstr "não foi possível truncar o arquivo \"%s\" para %u blocos: %m" -#: storage/smgr/md.c:1365 +#: storage/smgr/md.c:1494 #, c-format -msgid "could not forward fsync request because request queue is full" -msgstr "não pôde encaminhar pedido de fsync porque a fila de pedidos está cheia" +msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" +msgstr "não foi possível abrir o arquivo \"%s\" (bloco de destino %u): o segmento anterior contém apenas %u blocos" -#: storage/smgr/md.c:1760 +#: storage/smgr/md.c:1508 #, c-format msgid "could not open file \"%s\" (target block %u): %m" -msgstr "não pôde abrir arquivo \"%s\" (bloco alvo %u): %m" - -#: tcop/fastpath.c:111 tcop/fastpath.c:502 tcop/fastpath.c:632 -#, c-format -msgid "invalid argument size %d in function call message" -msgstr "tamanho de argumento %d é inválido na mensagem de chamada da função" +msgstr "não foi possível abrir o arquivo \"%s\" (bloco alvo %u): %m" -#: tcop/fastpath.c:304 tcop/postgres.c:353 tcop/postgres.c:389 +#: tcop/fastpath.c:142 utils/fmgr/fmgr.c:2132 #, c-format -msgid "unexpected EOF on client connection" -msgstr "EOF inesperado durante conexão do cliente" +msgid "function with OID %u does not exist" +msgstr "função com OID %u não existe" -#: tcop/fastpath.c:318 tcop/postgres.c:944 tcop/postgres.c:1254 -#: tcop/postgres.c:1512 tcop/postgres.c:1917 tcop/postgres.c:2284 -#: tcop/postgres.c:2359 +#: tcop/fastpath.c:149 #, c-format -msgid "current transaction is aborted, commands ignored until end of transaction block" -msgstr "transação atual foi interrompida, comandos ignorados até o fim do bloco de transação" +msgid "cannot call function \"%s\" via fastpath interface" +msgstr "" -#: tcop/fastpath.c:346 +#: tcop/fastpath.c:234 #, c-format msgid "fastpath function call: \"%s\" (OID %u)" msgstr "chamada fastpath de função: \"%s\" (OID %u)" -#: tcop/fastpath.c:428 tcop/postgres.c:1114 tcop/postgres.c:1379 -#: tcop/postgres.c:1758 tcop/postgres.c:1975 +#: tcop/fastpath.c:313 tcop/postgres.c:1365 tcop/postgres.c:1601 +#: tcop/postgres.c:2059 tcop/postgres.c:2309 #, c-format msgid "duration: %s ms" msgstr "duração: %s ms" -#: tcop/fastpath.c:432 +#: tcop/fastpath.c:317 #, c-format msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" msgstr "duração: %s ms chamada fastpath de função: \"%s\" (OID %u)" -#: tcop/fastpath.c:470 tcop/fastpath.c:597 +#: tcop/fastpath.c:353 #, c-format msgid "function call message contains %d arguments but function requires %d" msgstr "mensagem de chamada da função contém %d argumentos mas função requer %d" -#: tcop/fastpath.c:478 +#: tcop/fastpath.c:361 #, c-format msgid "function call message contains %d argument formats but %d arguments" msgstr "mensagem de chamada da função contém %d formatos de argumento mas só tem %d argumentos" -#: tcop/fastpath.c:565 tcop/fastpath.c:648 +#: tcop/fastpath.c:385 +#, c-format +msgid "invalid argument size %d in function call message" +msgstr "tamanho de argumento %d é inválido na mensagem de chamada da função" + +#: tcop/fastpath.c:448 #, c-format msgid "incorrect binary data format in function argument %d" msgstr "formato de dado binário incorreto no argumento %d da função" -#: tcop/postgres.c:417 tcop/postgres.c:429 tcop/postgres.c:440 -#: tcop/postgres.c:452 tcop/postgres.c:4254 +#: tcop/postgres.c:463 tcop/postgres.c:4882 #, c-format msgid "invalid frontend message type %d" msgstr "tipo de mensagem do cliente %d é inválido" -#: tcop/postgres.c:885 +#: tcop/postgres.c:1072 #, c-format msgid "statement: %s" msgstr "comando: %s" -#: tcop/postgres.c:1119 +#: tcop/postgres.c:1370 #, c-format msgid "duration: %s ms statement: %s" msgstr "duração: %s ms comando: %s" -#: tcop/postgres.c:1169 -#, c-format -msgid "parse %s: %s" -msgstr "análise de %s: %s" - -#: tcop/postgres.c:1227 +#: tcop/postgres.c:1476 #, c-format msgid "cannot insert multiple commands into a prepared statement" -msgstr "não pode inserir múltiplos comandos no comando preparado" +msgstr "não é possível inserir múltiplos comandos no comando preparado" -#: tcop/postgres.c:1384 +#: tcop/postgres.c:1606 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "duração: %s ms análise de %s: %s" -#: tcop/postgres.c:1429 -#, c-format -msgid "bind %s to %s" -msgstr "ligação de %s para %s" - -#: tcop/postgres.c:1448 tcop/postgres.c:2265 +#: tcop/postgres.c:1672 tcop/postgres.c:2629 #, c-format msgid "unnamed prepared statement does not exist" msgstr "comando preparado sem nome não existe" -#: tcop/postgres.c:1490 +#: tcop/postgres.c:1713 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "mensagem de ligação tem %d formatos de parâmetro mas só tem %d parâmetros" -#: tcop/postgres.c:1496 +#: tcop/postgres.c:1719 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "mensagem de ligação forneceu %d parâmetros, mas comando preparado \"%s\" requer %d" -#: tcop/postgres.c:1665 +#: tcop/postgres.c:1937 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "formato de dado binário incorreto no parâmetro de ligação %d" -#: tcop/postgres.c:1763 +#: tcop/postgres.c:2064 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "duração: %s ms ligação %s%s%s: %s" -#: tcop/postgres.c:1811 tcop/postgres.c:2345 +#: tcop/postgres.c:2118 tcop/postgres.c:2712 #, c-format msgid "portal \"%s\" does not exist" msgstr "portal \"%s\" não existe" -#: tcop/postgres.c:1896 +#: tcop/postgres.c:2189 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:1898 tcop/postgres.c:1983 +#: tcop/postgres.c:2191 tcop/postgres.c:2317 msgid "execute fetch from" msgstr "executar busca de" -#: tcop/postgres.c:1899 tcop/postgres.c:1984 +#: tcop/postgres.c:2192 tcop/postgres.c:2318 msgid "execute" msgstr "executar" -#: tcop/postgres.c:1980 +#: tcop/postgres.c:2314 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "duração: %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2106 +#: tcop/postgres.c:2462 #, c-format msgid "prepare: %s" msgstr "preparado: %s" -#: tcop/postgres.c:2169 +#: tcop/postgres.c:2487 #, c-format msgid "parameters: %s" msgstr "parâmetros: %s" -#: tcop/postgres.c:2188 +#: tcop/postgres.c:2502 #, c-format msgid "abort reason: recovery conflict" msgstr "razão da interrupção: conflito de recuperação" -#: tcop/postgres.c:2204 +#: tcop/postgres.c:2518 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "Usuário estava mantendo um buffer compartilhado na cache por muito tempo." -#: tcop/postgres.c:2207 +#: tcop/postgres.c:2521 #, c-format msgid "User was holding a relation lock for too long." msgstr "Usuário estava mantendo um travamento de relação por muito tempo." -#: tcop/postgres.c:2210 +#: tcop/postgres.c:2524 #, c-format msgid "User was or might have been using tablespace that must be dropped." -msgstr "Usuário estava ou pode estar utilizando tablespace que deve ser removida." +msgstr "O usuário estava ou pode estar usando um espaço de tabelas que deve ser excluído." -#: tcop/postgres.c:2213 +#: tcop/postgres.c:2527 #, c-format msgid "User query might have needed to see row versions that must be removed." -msgstr "Consulta do usuário pode ter precisado acessar versões de registros que devem ser removidas." +msgstr "A consulta do usuário pode ter necessitado acessar versões de linhas que devem ser removidas." + +#: tcop/postgres.c:2530 +#, c-format +msgid "User was using a logical replication slot that must be invalidated." +msgstr "O usuário estava usando um encaixe de replicação lógica que deve ser invalidado." -#: tcop/postgres.c:2219 +#: tcop/postgres.c:2536 #, c-format msgid "User was connected to a database that must be dropped." msgstr "Usuário estava conectado ao banco de dados que deve ser removido." -#: tcop/postgres.c:2548 +#: tcop/postgres.c:2575 +#, c-format +msgid "portal \"%s\" parameter $%d = %s" +msgstr "portal \"%s\" parâmetro $%d = %s" + +#: tcop/postgres.c:2578 +#, c-format +msgid "portal \"%s\" parameter $%d" +msgstr "portal \"%s\" parâmetro $%d" + +#: tcop/postgres.c:2584 +#, c-format +msgid "unnamed portal parameter $%d = %s" +msgstr "parâmetro de portal sem nome $%d = %s" + +#: tcop/postgres.c:2587 +#, c-format +msgid "unnamed portal parameter $%d" +msgstr "parâmetro de portal sem nome $%d" + +#: tcop/postgres.c:2932 +#, c-format +msgid "terminating connection because of unexpected SIGQUIT signal" +msgstr "terminando a conexão devido ao sinal SIGQUIT não esperado" + +#: tcop/postgres.c:2938 #, c-format msgid "terminating connection because of crash of another server process" -msgstr "finalizando conexão por causa de uma queda de um outro processo servidor" +msgstr "terminando a conexão devido a queda de um outro processo servidor" -#: tcop/postgres.c:2549 +#: tcop/postgres.c:2939 #, c-format msgid "The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory." msgstr "O postmaster ordenou a esse processo servidor para cancelar a transação atual e sair, porque outro processo servidor saiu anormalmente e possivelmente corrompeu memória compartilhada." -#: tcop/postgres.c:2553 tcop/postgres.c:2947 +#: tcop/postgres.c:2943 tcop/postgres.c:3310 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "Dentro de instantes você poderá conectar novamente ao banco de dados e repetir seu commando." -#: tcop/postgres.c:2666 +#: tcop/postgres.c:2950 +#, c-format +msgid "terminating connection due to immediate shutdown command" +msgstr "encerrando a conexão devido ao comando de desligamento imediato" + +#: tcop/postgres.c:3036 #, c-format msgid "floating-point exception" msgstr "exceção de ponto flutuante" -#: tcop/postgres.c:2667 +#: tcop/postgres.c:3037 #, c-format msgid "An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero." msgstr "Uma operação de ponto flutuante inválida foi sinalizada. Isto provavelmente indica um resultado fora do intervalo ou uma operação inválida, tal como divisão por zero." -#: tcop/postgres.c:2851 +#: tcop/postgres.c:3214 +#, c-format +msgid "canceling authentication due to timeout" +msgstr "cancelando autenticação por causa do tempo de espera (timeout)" + +#: tcop/postgres.c:3218 #, c-format msgid "terminating autovacuum process due to administrator command" -msgstr "terminando processo de limpeza automática por causa de um comando do administrador" +msgstr "terminando o processo de limpeza automática (autovacuum) devido a um comando do administrador" -#: tcop/postgres.c:2857 tcop/postgres.c:2867 tcop/postgres.c:2945 +#: tcop/postgres.c:3222 +#, c-format +msgid "terminating logical replication worker due to administrator command" +msgstr "terminando o processo trabalhador de replicação lógica devido a comando do administrador" + +#: tcop/postgres.c:3239 tcop/postgres.c:3249 tcop/postgres.c:3308 #, c-format msgid "terminating connection due to conflict with recovery" -msgstr "terminando conexão por causa de um conflito com recuperação" +msgstr "terminando conexão devido a um conflito com a recuperação" -#: tcop/postgres.c:2873 +#: tcop/postgres.c:3260 #, c-format msgid "terminating connection due to administrator command" -msgstr "terminando conexão por causa de um comando do administrador" +msgstr "terminando a conexão devido a um comando do administrador" -#: tcop/postgres.c:2885 +#: tcop/postgres.c:3291 #, c-format msgid "connection to client lost" msgstr "conexão com cliente foi perdida" -#: tcop/postgres.c:2900 -#, c-format -msgid "canceling authentication due to timeout" -msgstr "cancelando autenticação por causa do tempo de espera (timeout)" - -#: tcop/postgres.c:2915 +#: tcop/postgres.c:3361 #, c-format msgid "canceling statement due to lock timeout" msgstr "cancelando comando por causa do tempo de espera (timeout) do bloqueio" -#: tcop/postgres.c:2924 +#: tcop/postgres.c:3368 #, c-format msgid "canceling statement due to statement timeout" msgstr "cancelando comando por causa do tempo de espera (timeout) do comando" -#: tcop/postgres.c:2933 +#: tcop/postgres.c:3375 #, c-format msgid "canceling autovacuum task" msgstr "cancelando tarefa de limpeza automática" -#: tcop/postgres.c:2968 +#: tcop/postgres.c:3398 #, c-format msgid "canceling statement due to user request" -msgstr "cancelando comando por causa de um pedido do usuário" +msgstr "cancelando o comando devido a um pedido do usuário" + +#: tcop/postgres.c:3412 +#, c-format +msgid "terminating connection due to idle-in-transaction timeout" +msgstr "terminando a conexão devido a tempo limite de inatividade esgotado na transação" -#: tcop/postgres.c:3096 tcop/postgres.c:3118 +#: tcop/postgres.c:3423 +#, c-format +msgid "terminating connection due to idle-session timeout" +msgstr "terminando a conexão devido a tempo limite da sessão ociosa esgotado" + +#: tcop/postgres.c:3514 #, c-format msgid "stack depth limit exceeded" -msgstr "limite da profundidade da pilha foi excedido" +msgstr "o limite de profundidade da pilha foi excedido" -#: tcop/postgres.c:3097 tcop/postgres.c:3119 +#: tcop/postgres.c:3515 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "Aumente o parâmetro de configuração \"max_stack_depth\" (atualmente %dkB), após certificar-se que o limite de profundidade da pilha para a plataforma é adequado." -#: tcop/postgres.c:3135 +#: tcop/postgres.c:3562 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "\"max_stack_depth\" não deve exceder %ldkB." -#: tcop/postgres.c:3137 +#: tcop/postgres.c:3564 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." -msgstr "Aumente o limite de profundidade da pilha da plataforma utilizando \"ulimit -s\" ou equivalente." +msgstr "Aumente o limite de profundidade da pilha da plataforma usando \"ulimit -s\" ou equivalente." + +#: tcop/postgres.c:3587 +#, c-format +msgid "client_connection_check_interval must be set to 0 on this platform." +msgstr "" + +#: tcop/postgres.c:3608 +#, c-format +msgid "Cannot enable parameter when \"log_statement_stats\" is true." +msgstr "Não é possível ativar o parâmetro quando \"log_statement_stats\" for true." -#: tcop/postgres.c:3501 +#: tcop/postgres.c:3623 +#, c-format +msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." +msgstr "Não é possível ativar \"log_statement_stats\" quando \"log_parser_stats\", \"log_planner_stats\" ou \"log_executor_stats\" for true." + +#: tcop/postgres.c:3971 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "argumento de linha de comando é inválido para processo servidor: %s" -#: tcop/postgres.c:3502 tcop/postgres.c:3508 +#: tcop/postgres.c:3972 tcop/postgres.c:3978 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Tente \"%s --help\" para obter informações adicionais." -#: tcop/postgres.c:3506 +#: tcop/postgres.c:3976 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: argumento de linha de comando é inválido: %s" -#: tcop/postgres.c:3585 +#: tcop/postgres.c:4029 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: banco de dados ou nome de usuário não foi especificado" -#: tcop/postgres.c:4162 +#: tcop/postgres.c:4779 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "subtipo %d de mensagem CLOSE é inválido" -#: tcop/postgres.c:4197 +#: tcop/postgres.c:4816 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "subtipo %d de mensagem DESCRIBE é inválido" -#: tcop/postgres.c:4275 +#: tcop/postgres.c:4903 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "chamadas fastpath de funções não são suportadas em uma conexão de replicação" -#: tcop/postgres.c:4279 +#: tcop/postgres.c:4907 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "protocolo estendido de consultas não é suportado em uma conexão de replicação" -#: tcop/postgres.c:4449 +#: tcop/postgres.c:5087 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" -msgstr "desconexão: tempo da sessão: %d:%02d:%02d.%02d usuário=%s banco de dados=%s máquina=%s%s%s" +msgstr "desconexão: tempo de sessão: %d:%02d:%02d.%03d usuário=%s banco de dados=%s hospedeiro=%s%s%s" -#: tcop/pquery.c:662 +#: tcop/pquery.c:641 #, c-format msgid "bind message has %d result formats but query has %d columns" msgstr "mensagem de ligação tem %d formatos de resultados mas consulta tem %d colunas" -#: tcop/pquery.c:972 +#: tcop/pquery.c:944 tcop/pquery.c:1701 #, c-format msgid "cursor can only scan forward" -msgstr "cursor só pode buscar para frente" +msgstr "o cursor só pode varrer para frente" -#: tcop/pquery.c:973 +#: tcop/pquery.c:945 tcop/pquery.c:1702 #, c-format msgid "Declare it with SCROLL option to enable backward scan." -msgstr "Declare-o com a opção SCROLL para habilitar a busca para trás." +msgstr "Declare com a opção SCROLL para ativar a varredura para trás." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:227 +#: tcop/utility.c:417 #, c-format msgid "cannot execute %s in a read-only transaction" -msgstr "não pode executar %s em uma transação somente leitura" +msgstr "não é possível executar %s em uma transação de leitura-apenas" + +#. translator: %s is name of a SQL command, eg CREATE +#: tcop/utility.c:435 +#, c-format +msgid "cannot execute %s during a parallel operation" +msgstr "não é possível executar %s durante uma operação paralela" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:246 +#: tcop/utility.c:454 #, c-format msgid "cannot execute %s during recovery" -msgstr "não pode executar %s durante recuperação" +msgstr "não é possível executar %s durante a recuperação" #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:264 +#: tcop/utility.c:472 #, c-format msgid "cannot execute %s within security-restricted operation" -msgstr "não pode executar %s em operação com restrição de segurança" +msgstr "não é possível executar %s em operação com restrição de segurança" + +#. translator: %s is name of a SQL command, eg LISTEN +#: tcop/utility.c:828 +#, c-format +msgid "cannot execute %s within a background process" +msgstr "não é possível executar %s dentro de um processo em segundo plano" -#: tcop/utility.c:728 +#. translator: %s is name of a SQL command, eg CHECKPOINT +#: tcop/utility.c:954 #, c-format -msgid "must be superuser to do CHECKPOINT" -msgstr "deve ser super-usuário para fazer CHECKPOINT" +msgid "permission denied to execute %s command" +msgstr "permissão negada para executar o comando %s" -#: tsearch/dict_ispell.c:51 tsearch/dict_thesaurus.c:623 +#: tcop/utility.c:956 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may execute this command." +msgstr "Somente funções de banco de dados (roles) com privilégios da função de banco de dados \"%s\" podem executar esse comando." + +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:616 #, c-format msgid "multiple DictFile parameters" msgstr "múltiplos parâmetros DictFile" -#: tsearch/dict_ispell.c:62 +#: tsearch/dict_ispell.c:63 #, c-format msgid "multiple AffFile parameters" msgstr "múltiplos parâmetros AffFile" -#: tsearch/dict_ispell.c:81 +#: tsearch/dict_ispell.c:82 #, c-format msgid "unrecognized Ispell parameter: \"%s\"" msgstr "parâmetro desconhecido do Ispell: \"%s\"" -#: tsearch/dict_ispell.c:95 +#: tsearch/dict_ispell.c:96 #, c-format msgid "missing AffFile parameter" msgstr "faltando parâmetro AffFile" -#: tsearch/dict_ispell.c:101 tsearch/dict_thesaurus.c:647 +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:640 #, c-format msgid "missing DictFile parameter" msgstr "faltando parâmetro DictFile" -#: tsearch/dict_simple.c:57 +#: tsearch/dict_simple.c:58 #, c-format msgid "multiple Accept parameters" msgstr "múltiplos parâmetros Accept" -#: tsearch/dict_simple.c:65 +#: tsearch/dict_simple.c:66 #, c-format msgid "unrecognized simple dictionary parameter: \"%s\"" msgstr "parâmetro desconhecido do dicionário simples: \"%s\"" -#: tsearch/dict_synonym.c:117 +#: tsearch/dict_synonym.c:118 #, c-format msgid "unrecognized synonym parameter: \"%s\"" msgstr "parâmetro desconhecido do dicionário de sinônimos: \"%s\"" -#: tsearch/dict_synonym.c:124 +#: tsearch/dict_synonym.c:125 #, c-format msgid "missing Synonyms parameter" msgstr "faltando parâmetro Synonyms" -#: tsearch/dict_synonym.c:131 +#: tsearch/dict_synonym.c:132 #, c-format msgid "could not open synonym file \"%s\": %m" -msgstr "não pôde abrir arquivo de sinônimos \"%s\": %m" +msgstr "não foi possível abrir o arquivo de sinônimos \"%s\": %m" -#: tsearch/dict_thesaurus.c:178 +#: tsearch/dict_thesaurus.c:179 #, c-format msgid "could not open thesaurus file \"%s\": %m" -msgstr "não pôde abrir arquivo de tesauros \"%s\": %m" +msgstr "não foi possível abrir o arquivo de tesauros \"%s\": %m" -#: tsearch/dict_thesaurus.c:211 +#: tsearch/dict_thesaurus.c:212 #, c-format msgid "unexpected delimiter" msgstr "delimitador inesperado" -#: tsearch/dict_thesaurus.c:261 tsearch/dict_thesaurus.c:277 +#: tsearch/dict_thesaurus.c:262 tsearch/dict_thesaurus.c:278 #, c-format msgid "unexpected end of line or lexeme" msgstr "fim de linha ou lexema inesperado" -#: tsearch/dict_thesaurus.c:286 +#: tsearch/dict_thesaurus.c:287 #, c-format msgid "unexpected end of line" msgstr "fim de linha inesperado" -#: tsearch/dict_thesaurus.c:296 +#: tsearch/dict_thesaurus.c:292 #, c-format msgid "too many lexemes in thesaurus entry" msgstr "muitos lexemas na entrada do tesauro" -#: tsearch/dict_thesaurus.c:420 +#: tsearch/dict_thesaurus.c:416 #, c-format msgid "thesaurus sample word \"%s\" isn't recognized by subdictionary (rule %d)" msgstr "palavra amostrada do tesauro \"%s\" não é reconhecida pelo sub-dicionário (regra %d)" -#: tsearch/dict_thesaurus.c:426 +#: tsearch/dict_thesaurus.c:422 #, c-format msgid "thesaurus sample word \"%s\" is a stop word (rule %d)" msgstr "palavra amostrada do tesauro \"%s\" é uma palavra ignorada (regra %d)" -#: tsearch/dict_thesaurus.c:429 +#: tsearch/dict_thesaurus.c:425 #, c-format msgid "Use \"?\" to represent a stop word within a sample phrase." -msgstr "Utilize \"?\" para representar uma palavra ignorada dentro de uma frase amostrada." +msgstr "Use \"?\" para representar uma palavra ignorada dentro de uma frase amostrada." -#: tsearch/dict_thesaurus.c:575 +#: tsearch/dict_thesaurus.c:567 #, c-format msgid "thesaurus substitute word \"%s\" is a stop word (rule %d)" msgstr "palavra substituta do tesauro \"%s\" é uma palavra ignorada (regra %d)" -#: tsearch/dict_thesaurus.c:582 +#: tsearch/dict_thesaurus.c:574 #, c-format msgid "thesaurus substitute word \"%s\" isn't recognized by subdictionary (rule %d)" msgstr "palavra substituta do tesauro \"%s\" não é reconhecida pelo sub-dicionário (regra %d)" -#: tsearch/dict_thesaurus.c:594 +#: tsearch/dict_thesaurus.c:586 #, c-format msgid "thesaurus substitute phrase is empty (rule %d)" msgstr "frase substituta do tesauro está vazia (regra %d)" -#: tsearch/dict_thesaurus.c:632 +#: tsearch/dict_thesaurus.c:625 #, c-format msgid "multiple Dictionary parameters" msgstr "múltiplos parâmetros Dictionary" -#: tsearch/dict_thesaurus.c:639 +#: tsearch/dict_thesaurus.c:632 #, c-format msgid "unrecognized Thesaurus parameter: \"%s\"" msgstr "parâmetro desconhecido do dicionário de tesauros: \"%s\"" -#: tsearch/dict_thesaurus.c:651 +#: tsearch/dict_thesaurus.c:644 #, c-format msgid "missing Dictionary parameter" msgstr "faltando parâmetro Dictionary" -#: tsearch/spell.c:276 +#: tsearch/spell.c:381 tsearch/spell.c:398 tsearch/spell.c:407 +#: tsearch/spell.c:1043 #, c-format -msgid "could not open dictionary file \"%s\": %m" -msgstr "não pôde abrir arquivo de dicionário \"%s\": %m" +msgid "invalid affix flag \"%s\"" +msgstr "sinalizador de afixo inválido \"%s\"" -#: tsearch/spell.c:439 utils/adt/regexp.c:204 +#: tsearch/spell.c:385 tsearch/spell.c:1047 #, c-format -msgid "invalid regular expression: %s" -msgstr "expressão regular é inválida: %s" +msgid "affix flag \"%s\" is out of range" +msgstr "o sinalizador de afixo \"%s\" está fora do intervalo" + +#: tsearch/spell.c:415 +#, c-format +msgid "invalid character in affix flag \"%s\"" +msgstr "caractere inválido no sinalizador de afixo \"%s\"" + +#: tsearch/spell.c:435 +#, c-format +msgid "invalid affix flag \"%s\" with \"long\" flag value" +msgstr "" -#: tsearch/spell.c:596 +#: tsearch/spell.c:525 #, c-format -msgid "multibyte flag character is not allowed" -msgstr "caractere marcador multibyte não é permitido" +msgid "could not open dictionary file \"%s\": %m" +msgstr "não foi possível abrir o arquivo de dicionário \"%s\": %m" + +#: tsearch/spell.c:1170 tsearch/spell.c:1182 tsearch/spell.c:1742 +#: tsearch/spell.c:1747 tsearch/spell.c:1752 +#, c-format +msgid "invalid affix alias \"%s\"" +msgstr "alias de afixo inválido \"%s\"" -#: tsearch/spell.c:632 tsearch/spell.c:690 tsearch/spell.c:787 +#: tsearch/spell.c:1223 tsearch/spell.c:1294 tsearch/spell.c:1443 #, c-format msgid "could not open affix file \"%s\": %m" -msgstr "não pôde abrir arquivo de afixos \"%s\": %m" +msgstr "não foi possível abrir o arquivo de afixos \"%s\": %m" + +#: tsearch/spell.c:1277 +#, c-format +msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" +msgstr "o dicionário Ispell dá suporte apenas aos valores de sinalizador \"default\", \"long\" e \"num\"" + +#: tsearch/spell.c:1321 +#, c-format +msgid "invalid number of flag vector aliases" +msgstr "número de aliases de vetor de sinalizador inválido" -#: tsearch/spell.c:678 +#: tsearch/spell.c:1344 #, c-format -msgid "Ispell dictionary supports only default flag value" -msgstr "dicionário Ispell suporta somente valor de marcador padrão" +msgid "number of aliases exceeds specified number %d" +msgstr "o número de aliases excede o número especificado %d" -#: tsearch/spell.c:901 +#: tsearch/spell.c:1559 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "arquivo de afixos contém tanto comandos no estilo antigo quanto no estilo novo" -#: tsearch/to_tsany.c:163 utils/adt/tsvector.c:270 utils/adt/tsvector_op.c:530 +#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:278 utils/adt/tsvector_op.c:1128 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "cadeia de caracteres é muito longa para tsvector (%d bytes, máximo de %d bytes)" -#: tsearch/ts_locale.c:177 +#: tsearch/ts_locale.c:238 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "linha %d do arquivo de configuração \"%s\": \"%s\"" -#: tsearch/ts_locale.c:299 +#: tsearch/ts_locale.c:317 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "conversão do wchar_t para codificação do servidor falhou: %m" -#: tsearch/ts_parse.c:390 tsearch/ts_parse.c:397 tsearch/ts_parse.c:560 -#: tsearch/ts_parse.c:567 +#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 +#: tsearch/ts_parse.c:580 #, c-format msgid "word is too long to be indexed" -msgstr "palavra é muito longa para ser indexada" +msgstr "palavra muito longa para ser indexada" -#: tsearch/ts_parse.c:391 tsearch/ts_parse.c:398 tsearch/ts_parse.c:561 -#: tsearch/ts_parse.c:568 +#: tsearch/ts_parse.c:388 tsearch/ts_parse.c:395 tsearch/ts_parse.c:574 +#: tsearch/ts_parse.c:581 #, c-format msgid "Words longer than %d characters are ignored." msgstr "Palavras maiores do que %d caracteres são ignoradas." @@ -15699,2357 +23213,2819 @@ msgstr "Palavras maiores do que %d caracteres são ignoradas." #: tsearch/ts_utils.c:51 #, c-format msgid "invalid text search configuration file name \"%s\"" -msgstr "nome de arquivo de configuração de busca textual \"%s\" é inválido" +msgstr "nome do arquivo de configuração de procura de texto completo \"%s\" inválido" #: tsearch/ts_utils.c:83 #, c-format msgid "could not open stop-word file \"%s\": %m" -msgstr "não pôde abrir arquivo de palavras ignoradas \"%s\": %m" +msgstr "não foi possível abrir o arquivo de palavras ignoradas \"%s\": %m" -#: tsearch/wparser.c:306 +#: tsearch/wparser.c:308 tsearch/wparser.c:396 tsearch/wparser.c:473 #, c-format msgid "text search parser does not support headline creation" -msgstr "analisador de busca textual não suporta a criação de destaques" +msgstr "o analisador de procura de texto não dá suporte a criação de títulos" -#: tsearch/wparser_def.c:2555 +#: tsearch/wparser_def.c:2663 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "parâmetro de destaque desconhecido: \"%s\"" -#: tsearch/wparser_def.c:2564 +#: tsearch/wparser_def.c:2673 #, c-format msgid "MinWords should be less than MaxWords" msgstr "MinWords deve ser menor do que MaxWords" -#: tsearch/wparser_def.c:2568 +#: tsearch/wparser_def.c:2677 #, c-format msgid "MinWords should be positive" msgstr "MinWords deve ser positivo" -#: tsearch/wparser_def.c:2572 +#: tsearch/wparser_def.c:2681 #, c-format msgid "ShortWord should be >= 0" msgstr "ShortWord deve ser >= 0" -#: tsearch/wparser_def.c:2576 +#: tsearch/wparser_def.c:2685 #, c-format msgid "MaxFragments should be >= 0" msgstr "MaxFragments deve ser >= 0" -#: utils/adt/acl.c:170 utils/adt/name.c:91 +#: utils/activity/pgstat.c:438 +#, c-format +msgid "could not unlink permanent statistics file \"%s\": %m" +msgstr "não foi possível desvincular o arquivo de estatísticas permanente \"%s\": %m" + +#: utils/activity/pgstat.c:1252 +#, c-format +msgid "invalid statistics kind: \"%s\"" +msgstr "tipo de estatística inválida: \"%s\"" + +#: utils/activity/pgstat.c:1332 +#, c-format +msgid "could not open temporary statistics file \"%s\": %m" +msgstr "não foi possível abrir o arquivo de estatísticas temporário \"%s\": %m" + +#: utils/activity/pgstat.c:1444 +#, c-format +msgid "could not write temporary statistics file \"%s\": %m" +msgstr "não foi possível escrever no arquivo de estatísticas temporário \"%s\": %m" + +#: utils/activity/pgstat.c:1453 +#, c-format +msgid "could not close temporary statistics file \"%s\": %m" +msgstr "não foi possível fechar o arquivo de estatísticas temporário \"%s\": %m" + +#: utils/activity/pgstat.c:1461 +#, c-format +msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" +msgstr "não foi possível renomear o arquivo de estatísticas temporário \"%s\" para \"%s\": %m" + +#: utils/activity/pgstat.c:1510 +#, c-format +msgid "could not open statistics file \"%s\": %m" +msgstr "não foi possível abrir o arquivo de estatísticas \"%s\": %m" + +#: utils/activity/pgstat.c:1672 +#, c-format +msgid "corrupted statistics file \"%s\"" +msgstr "arquivo de estatísticas \"%s\" corrompido" + +#: utils/activity/pgstat_function.c:118 +#, c-format +msgid "function call to dropped function" +msgstr "chamada de função para função excluída" + +#: utils/activity/pgstat_xact.c:363 +#, c-format +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "" + +#: utils/adt/acl.c:177 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "identificador muito longo" -#: utils/adt/acl.c:171 utils/adt/name.c:92 +#: utils/adt/acl.c:178 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Identificador deve ter pelo menos %d caracteres." -#: utils/adt/acl.c:257 +#: utils/adt/acl.c:266 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "palavra chave desconhecida: \"%s\"" -#: utils/adt/acl.c:258 +#: utils/adt/acl.c:267 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "palavra chave ACL deve ser \"group\" ou \"user\"." -#: utils/adt/acl.c:263 +#: utils/adt/acl.c:275 #, c-format msgid "missing name" msgstr "faltando nome" -#: utils/adt/acl.c:264 +#: utils/adt/acl.c:276 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "Um nome deve seguir a palavra chave \"group\" ou \"user\"." -#: utils/adt/acl.c:270 +#: utils/adt/acl.c:282 #, c-format msgid "missing \"=\" sign" msgstr "faltando sinal \"=\"" -#: utils/adt/acl.c:323 +#: utils/adt/acl.c:341 #, c-format msgid "invalid mode character: must be one of \"%s\"" -msgstr "caracter de modo é inválido: deve ser um dos \"%s\"" +msgstr "caractere de modo é inválido: deve ser um dos \"%s\"" -#: utils/adt/acl.c:345 +#: utils/adt/acl.c:371 #, c-format msgid "a name must follow the \"/\" sign" msgstr "um nome deve seguir o sinal \"/\"" -#: utils/adt/acl.c:353 +#: utils/adt/acl.c:383 #, c-format msgid "defaulting grantor to user ID %u" -msgstr "utilizando ID de usuário %u como concedente" +msgstr "usando ID de usuário %u como concedente" -#: utils/adt/acl.c:544 +#: utils/adt/acl.c:569 #, c-format msgid "ACL array contains wrong data type" -msgstr "matriz ACL contém tipo de dado incorreto" +msgstr "a matriz ACL contém um tipo de dados incorreto" -#: utils/adt/acl.c:548 +#: utils/adt/acl.c:573 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "matrizes ACL devem ser de uma dimensão" -#: utils/adt/acl.c:552 +#: utils/adt/acl.c:577 #, c-format msgid "ACL arrays must not contain null values" msgstr "matrizes ACL não devem conter valores nulos" -#: utils/adt/acl.c:576 +#: utils/adt/acl.c:606 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "lixo extra ao final da especificação de uma ACL" -#: utils/adt/acl.c:1196 +#: utils/adt/acl.c:1248 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "opções de concessão não podem ser concedidos ao próprio concedente" -#: utils/adt/acl.c:1257 -#, c-format -msgid "dependent privileges exist" -msgstr "privilégios dependentes existem" - -#: utils/adt/acl.c:1258 -#, c-format -msgid "Use CASCADE to revoke them too." -msgstr "Utilize CASCADE para revogá-los também." - -#: utils/adt/acl.c:1537 +#: utils/adt/acl.c:1564 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert não é mais suportado" -#: utils/adt/acl.c:1547 +#: utils/adt/acl.c:1574 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove não é mais suportado" -#: utils/adt/acl.c:1633 utils/adt/acl.c:1687 +#: utils/adt/acl.c:1693 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "tipo de privilégio desconhecido: \"%s\"" -#: utils/adt/acl.c:3427 utils/adt/regproc.c:122 utils/adt/regproc.c:143 -#: utils/adt/regproc.c:318 +#: utils/adt/acl.c:3476 utils/adt/regproc.c:100 utils/adt/regproc.c:265 #, c-format msgid "function \"%s\" does not exist" msgstr "função \"%s\" não existe" -#: utils/adt/acl.c:4881 -#, c-format -msgid "must be member of role \"%s\"" -msgstr "deve ser membro da role \"%s\"" - -#: utils/adt/array_userfuncs.c:48 +#: utils/adt/acl.c:5023 #, c-format -msgid "could not determine input data types" -msgstr "não pôde determinar tipos de dado de entrada" +msgid "must be able to SET ROLE \"%s\"" +msgstr "deve poder SET ROLE \"%s\"" -#: utils/adt/array_userfuncs.c:82 +#: utils/adt/array_userfuncs.c:102 utils/adt/array_userfuncs.c:489 +#: utils/adt/array_userfuncs.c:878 utils/adt/json.c:694 utils/adt/json.c:831 +#: utils/adt/json.c:869 utils/adt/jsonb.c:1139 utils/adt/jsonb.c:1211 +#: utils/adt/jsonb.c:1629 utils/adt/jsonb.c:1817 utils/adt/jsonb.c:1827 #, c-format -msgid "neither input type is an array" -msgstr "tipo de entrada não é uma matriz" - -#: utils/adt/array_userfuncs.c:103 utils/adt/array_userfuncs.c:113 -#: utils/adt/arrayfuncs.c:1309 utils/adt/float.c:1161 utils/adt/float.c:1220 -#: utils/adt/float.c:2771 utils/adt/float.c:2787 utils/adt/int.c:623 -#: utils/adt/int.c:652 utils/adt/int.c:673 utils/adt/int.c:704 -#: utils/adt/int.c:737 utils/adt/int.c:759 utils/adt/int.c:907 -#: utils/adt/int.c:928 utils/adt/int.c:955 utils/adt/int.c:995 -#: utils/adt/int.c:1016 utils/adt/int.c:1043 utils/adt/int.c:1076 -#: utils/adt/int.c:1159 utils/adt/int8.c:1298 utils/adt/numeric.c:2304 -#: utils/adt/numeric.c:2313 utils/adt/varbit.c:1173 utils/adt/varbit.c:1565 -#: utils/adt/varlena.c:1013 utils/adt/varlena.c:2036 +msgid "could not determine input data type" +msgstr "não foi possível determinar o tipo de dados de entrada" + +#: utils/adt/array_userfuncs.c:107 +#, c-format +msgid "input data type is not an array" +msgstr "o tipo de dados de entrada não é uma matriz" + +#: utils/adt/array_userfuncs.c:151 utils/adt/array_userfuncs.c:203 +#: utils/adt/float.c:1228 utils/adt/float.c:1302 utils/adt/float.c:4117 +#: utils/adt/float.c:4155 utils/adt/int.c:778 utils/adt/int.c:800 +#: utils/adt/int.c:814 utils/adt/int.c:828 utils/adt/int.c:859 +#: utils/adt/int.c:880 utils/adt/int.c:997 utils/adt/int.c:1011 +#: utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 +#: utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 +#: utils/adt/int.c:1263 utils/adt/int.c:1331 utils/adt/int.c:1337 +#: utils/adt/int8.c:1257 utils/adt/numeric.c:1901 utils/adt/numeric.c:4388 +#: utils/adt/rangetypes.c:1481 utils/adt/rangetypes.c:1494 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1132 +#: utils/adt/varlena.c:3134 #, c-format msgid "integer out of range" msgstr "inteiro fora do intervalo" -#: utils/adt/array_userfuncs.c:121 +#: utils/adt/array_userfuncs.c:158 utils/adt/array_userfuncs.c:213 #, c-format msgid "argument must be empty or one-dimensional array" msgstr "argumento deve ser vazio ou matriz de uma dimensão" -#: utils/adt/array_userfuncs.c:224 utils/adt/array_userfuncs.c:263 -#: utils/adt/array_userfuncs.c:300 utils/adt/array_userfuncs.c:329 -#: utils/adt/array_userfuncs.c:357 +#: utils/adt/array_userfuncs.c:295 utils/adt/array_userfuncs.c:334 +#: utils/adt/array_userfuncs.c:371 utils/adt/array_userfuncs.c:400 +#: utils/adt/array_userfuncs.c:428 #, c-format msgid "cannot concatenate incompatible arrays" -msgstr "não pode concatenar matrizes incompatíveis" +msgstr "não é possível concatenar matrizes incompatíveis" -#: utils/adt/array_userfuncs.c:225 +#: utils/adt/array_userfuncs.c:296 #, c-format msgid "Arrays with element types %s and %s are not compatible for concatenation." msgstr "Matrizes com tipos de elemento %s e %s não são compatíveis para concatenação." -#: utils/adt/array_userfuncs.c:264 +#: utils/adt/array_userfuncs.c:335 #, c-format msgid "Arrays of %d and %d dimensions are not compatible for concatenation." msgstr "Matrizes de dimensões %d e %d não são compatíveis para concatenação." -#: utils/adt/array_userfuncs.c:301 +#: utils/adt/array_userfuncs.c:372 #, c-format msgid "Arrays with differing element dimensions are not compatible for concatenation." msgstr "Matrizes com dimensões de elementos diferentes não são compatíveis para concatenação." -#: utils/adt/array_userfuncs.c:330 utils/adt/array_userfuncs.c:358 +#: utils/adt/array_userfuncs.c:401 utils/adt/array_userfuncs.c:429 #, c-format msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "Matrizes com dimensões diferentes não são compatíveis para concatenação." -#: utils/adt/array_userfuncs.c:426 utils/adt/arrayfuncs.c:1271 -#: utils/adt/arrayfuncs.c:2957 utils/adt/arrayfuncs.c:4982 +#: utils/adt/array_userfuncs.c:987 utils/adt/array_userfuncs.c:995 +#: utils/adt/arrayfuncs.c:5639 utils/adt/arrayfuncs.c:5645 #, c-format -msgid "invalid number of dimensions: %d" -msgstr "número de dimensões é inválido: %d" +msgid "cannot accumulate arrays of different dimensionality" +msgstr "não é possível acumular matrizes com dimensões diferentes" -#: utils/adt/array_userfuncs.c:487 utils/adt/json.c:1694 utils/adt/json.c:1789 -#: utils/adt/json.c:1820 +#: utils/adt/array_userfuncs.c:1286 utils/adt/array_userfuncs.c:1440 #, c-format -msgid "could not determine input data type" -msgstr "não pôde determinar tipo de dado de entrada" - -#: utils/adt/arrayfuncs.c:241 utils/adt/arrayfuncs.c:255 -#: utils/adt/arrayfuncs.c:266 utils/adt/arrayfuncs.c:288 -#: utils/adt/arrayfuncs.c:303 utils/adt/arrayfuncs.c:317 -#: utils/adt/arrayfuncs.c:323 utils/adt/arrayfuncs.c:330 -#: utils/adt/arrayfuncs.c:461 utils/adt/arrayfuncs.c:477 -#: utils/adt/arrayfuncs.c:488 utils/adt/arrayfuncs.c:503 -#: utils/adt/arrayfuncs.c:524 utils/adt/arrayfuncs.c:554 -#: utils/adt/arrayfuncs.c:561 utils/adt/arrayfuncs.c:569 -#: utils/adt/arrayfuncs.c:603 utils/adt/arrayfuncs.c:626 -#: utils/adt/arrayfuncs.c:646 utils/adt/arrayfuncs.c:758 -#: utils/adt/arrayfuncs.c:767 utils/adt/arrayfuncs.c:797 -#: utils/adt/arrayfuncs.c:812 utils/adt/arrayfuncs.c:865 +msgid "searching for elements in multidimensional arrays is not supported" +msgstr "a procura de elementos em matrizes multidimensionais não tem suporte" + +#: utils/adt/array_userfuncs.c:1315 +#, c-format +msgid "initial position must not be null" +msgstr "a posição inicial não deve ser nula" + +#: utils/adt/array_userfuncs.c:1688 +#, c-format +msgid "sample size must be between 0 and %d" +msgstr "o tamanho da amostra deve estar entre 0 e %d" + +#: utils/adt/arrayfuncs.c:274 utils/adt/arrayfuncs.c:288 +#: utils/adt/arrayfuncs.c:299 utils/adt/arrayfuncs.c:321 +#: utils/adt/arrayfuncs.c:338 utils/adt/arrayfuncs.c:352 +#: utils/adt/arrayfuncs.c:360 utils/adt/arrayfuncs.c:367 +#: utils/adt/arrayfuncs.c:507 utils/adt/arrayfuncs.c:522 +#: utils/adt/arrayfuncs.c:533 utils/adt/arrayfuncs.c:548 +#: utils/adt/arrayfuncs.c:569 utils/adt/arrayfuncs.c:599 +#: utils/adt/arrayfuncs.c:606 utils/adt/arrayfuncs.c:614 +#: utils/adt/arrayfuncs.c:648 utils/adt/arrayfuncs.c:671 +#: utils/adt/arrayfuncs.c:691 utils/adt/arrayfuncs.c:808 +#: utils/adt/arrayfuncs.c:817 utils/adt/arrayfuncs.c:847 +#: utils/adt/arrayfuncs.c:862 utils/adt/arrayfuncs.c:915 #, c-format msgid "malformed array literal: \"%s\"" msgstr "matriz mal formada: \"%s\"" -#: utils/adt/arrayfuncs.c:242 +#: utils/adt/arrayfuncs.c:275 #, c-format msgid "\"[\" must introduce explicitly-specified array dimensions." msgstr "\"[\" deve introduzir dimensões da matriz especificadas explicitamente." -#: utils/adt/arrayfuncs.c:256 +#: utils/adt/arrayfuncs.c:289 #, c-format msgid "Missing array dimension value." msgstr "Faltando valor da dimensão da matriz." -#: utils/adt/arrayfuncs.c:267 utils/adt/arrayfuncs.c:304 +#: utils/adt/arrayfuncs.c:300 utils/adt/arrayfuncs.c:339 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "Faltando \"%s\" após dimensões da matriz." -#: utils/adt/arrayfuncs.c:276 utils/adt/arrayfuncs.c:2482 -#: utils/adt/arrayfuncs.c:2510 utils/adt/arrayfuncs.c:2525 +#: utils/adt/arrayfuncs.c:309 utils/adt/arrayfuncs.c:2969 +#: utils/adt/arrayfuncs.c:3014 utils/adt/arrayfuncs.c:3029 #, c-format msgid "upper bound cannot be less than lower bound" msgstr "limite superior não pode ser menor do que limite inferior" -#: utils/adt/arrayfuncs.c:289 +#: utils/adt/arrayfuncs.c:322 #, c-format msgid "Array value must start with \"{\" or dimension information." msgstr "Valor da matriz deve iniciar com \"{\" ou dimensão." -#: utils/adt/arrayfuncs.c:318 +#: utils/adt/arrayfuncs.c:353 #, c-format msgid "Array contents must start with \"{\"." msgstr "Conteúdo da matriz deve iniciar com \"{\"." -#: utils/adt/arrayfuncs.c:324 utils/adt/arrayfuncs.c:331 +#: utils/adt/arrayfuncs.c:361 utils/adt/arrayfuncs.c:368 #, c-format msgid "Specified array dimensions do not match array contents." msgstr "Dimensões da matriz especificadas não correspondem ao conteúdo da matriz." -#: utils/adt/arrayfuncs.c:462 utils/adt/arrayfuncs.c:489 -#: utils/adt/rangetypes.c:2083 utils/adt/rangetypes.c:2091 -#: utils/adt/rowtypes.c:208 utils/adt/rowtypes.c:216 +#: utils/adt/arrayfuncs.c:508 utils/adt/arrayfuncs.c:534 +#: utils/adt/multirangetypes.c:166 utils/adt/rangetypes.c:2405 +#: utils/adt/rangetypes.c:2413 utils/adt/rowtypes.c:219 +#: utils/adt/rowtypes.c:230 #, c-format msgid "Unexpected end of input." msgstr "Fim da entrada inesperado." -#: utils/adt/arrayfuncs.c:478 utils/adt/arrayfuncs.c:525 -#: utils/adt/arrayfuncs.c:555 utils/adt/arrayfuncs.c:604 +#: utils/adt/arrayfuncs.c:523 utils/adt/arrayfuncs.c:570 +#: utils/adt/arrayfuncs.c:600 utils/adt/arrayfuncs.c:649 #, c-format msgid "Unexpected \"%c\" character." msgstr "Caracter \"%c\" inesperado." -#: utils/adt/arrayfuncs.c:504 utils/adt/arrayfuncs.c:627 +#: utils/adt/arrayfuncs.c:549 utils/adt/arrayfuncs.c:672 #, c-format msgid "Unexpected array element." msgstr "Elemento da matriz inesperado." -#: utils/adt/arrayfuncs.c:562 +#: utils/adt/arrayfuncs.c:607 #, c-format msgid "Unmatched \"%c\" character." msgstr "Caracter \"%c\" inigualado." -#: utils/adt/arrayfuncs.c:570 +#: utils/adt/arrayfuncs.c:615 utils/adt/jsonfuncs.c:2553 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "Matrizes multidimensionais devem ter submatrizes com dimensões correspondentes." -#: utils/adt/arrayfuncs.c:647 +#: utils/adt/arrayfuncs.c:692 utils/adt/multirangetypes.c:293 #, c-format msgid "Junk after closing right brace." msgstr "Lixo após fechar chave direita." -#: utils/adt/arrayfuncs.c:904 utils/adt/arrayfuncs.c:1506 -#: utils/adt/arrayfuncs.c:2841 utils/adt/arrayfuncs.c:2989 -#: utils/adt/arrayfuncs.c:5082 utils/adt/arrayfuncs.c:5414 -#: utils/adt/arrayutils.c:93 utils/adt/arrayutils.c:102 -#: utils/adt/arrayutils.c:109 +#: utils/adt/arrayfuncs.c:1326 utils/adt/arrayfuncs.c:3528 +#: utils/adt/arrayfuncs.c:6129 #, c-format -msgid "array size exceeds the maximum allowed (%d)" -msgstr "tamanho da matriz excede o máximo permitido (%d)" +msgid "invalid number of dimensions: %d" +msgstr "número de dimensões é inválido: %d" -#: utils/adt/arrayfuncs.c:1282 +#: utils/adt/arrayfuncs.c:1337 #, c-format msgid "invalid array flags" msgstr "marcações de matriz são inválidas" -#: utils/adt/arrayfuncs.c:1290 +#: utils/adt/arrayfuncs.c:1359 #, c-format -msgid "wrong element type" -msgstr "tipo de elemento incorreto" +msgid "binary data has array element type %u (%s) instead of expected %u (%s)" +msgstr "" -#: utils/adt/arrayfuncs.c:1340 utils/adt/rangetypes.c:325 -#: utils/cache/lsyscache.c:2549 +#: utils/adt/arrayfuncs.c:1403 utils/adt/multirangetypes.c:451 +#: utils/adt/rangetypes.c:344 utils/cache/lsyscache.c:2916 #, c-format msgid "no binary input function available for type %s" msgstr "nenhuma função de entrada disponível para tipo %s" -#: utils/adt/arrayfuncs.c:1480 +#: utils/adt/arrayfuncs.c:1543 #, c-format msgid "improper binary format in array element %d" msgstr "formato binário é inválido no elemento %d da matriz" -#: utils/adt/arrayfuncs.c:1562 utils/adt/rangetypes.c:330 -#: utils/cache/lsyscache.c:2582 +#: utils/adt/arrayfuncs.c:1624 utils/adt/multirangetypes.c:456 +#: utils/adt/rangetypes.c:349 utils/cache/lsyscache.c:2949 #, c-format msgid "no binary output function available for type %s" msgstr "nenhuma função de saída disponível para tipo %s" -#: utils/adt/arrayfuncs.c:1949 +#: utils/adt/arrayfuncs.c:2103 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "segmentos de matrizes de tamanho fixo não está implementado" -#: utils/adt/arrayfuncs.c:2122 utils/adt/arrayfuncs.c:2144 -#: utils/adt/arrayfuncs.c:2178 utils/adt/arrayfuncs.c:2464 -#: utils/adt/arrayfuncs.c:4962 utils/adt/arrayfuncs.c:4994 -#: utils/adt/arrayfuncs.c:5011 utils/adt/json.c:2211 utils/adt/json.c:2286 +#: utils/adt/arrayfuncs.c:2281 utils/adt/arrayfuncs.c:2303 +#: utils/adt/arrayfuncs.c:2352 utils/adt/arrayfuncs.c:2606 +#: utils/adt/arrayfuncs.c:2944 utils/adt/arrayfuncs.c:6115 +#: utils/adt/arrayfuncs.c:6141 utils/adt/arrayfuncs.c:6152 +#: utils/adt/json.c:1497 utils/adt/json.c:1569 utils/adt/jsonb.c:1416 +#: utils/adt/jsonb.c:1500 utils/adt/jsonfuncs.c:4434 utils/adt/jsonfuncs.c:4587 +#: utils/adt/jsonfuncs.c:4698 utils/adt/jsonfuncs.c:4746 #, c-format msgid "wrong number of array subscripts" msgstr "número de índices da matriz incorreto" -#: utils/adt/arrayfuncs.c:2127 utils/adt/arrayfuncs.c:2220 -#: utils/adt/arrayfuncs.c:2515 +#: utils/adt/arrayfuncs.c:2286 utils/adt/arrayfuncs.c:2410 +#: utils/adt/arrayfuncs.c:2689 utils/adt/arrayfuncs.c:3019 #, c-format msgid "array subscript out of range" msgstr "índice da matriz está fora do intervalo" -#: utils/adt/arrayfuncs.c:2132 +#: utils/adt/arrayfuncs.c:2291 #, c-format msgid "cannot assign null value to an element of a fixed-length array" -msgstr "não pode atribuir valor nulo para um elemento de matriz de tamanho fixo" +msgstr "não é possível atribuir o valor nulo para um elemento de matriz de tamanho fixo" -#: utils/adt/arrayfuncs.c:2418 +#: utils/adt/arrayfuncs.c:2891 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "atualização em segmentos de matrizes de tamanho fixo não está implementada" -#: utils/adt/arrayfuncs.c:2454 utils/adt/arrayfuncs.c:2541 +#: utils/adt/arrayfuncs.c:2922 +#, c-format +msgid "array slice subscript must provide both boundaries" +msgstr "o índice da fatia da matriz deve fornecer os dois limites" + +#: utils/adt/arrayfuncs.c:2923 +#, c-format +msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." +msgstr "" + +#: utils/adt/arrayfuncs.c:2934 utils/adt/arrayfuncs.c:3046 #, c-format msgid "source array too small" msgstr "matriz de origem muito pequena" -#: utils/adt/arrayfuncs.c:3096 +#: utils/adt/arrayfuncs.c:3686 #, c-format msgid "null array element not allowed in this context" msgstr "elemento nulo da matriz não é permitido neste contexto" -#: utils/adt/arrayfuncs.c:3199 utils/adt/arrayfuncs.c:3407 -#: utils/adt/arrayfuncs.c:3724 +#: utils/adt/arrayfuncs.c:3857 utils/adt/arrayfuncs.c:4028 +#: utils/adt/arrayfuncs.c:4419 #, c-format msgid "cannot compare arrays of different element types" -msgstr "não pode comparar matrizes de tipos de elementos diferentes" +msgstr "não é possível comparar matrizes de tipos de elementos diferentes" -#: utils/adt/arrayfuncs.c:3609 utils/adt/rangetypes.c:1212 +#: utils/adt/arrayfuncs.c:4206 utils/adt/multirangetypes.c:2806 +#: utils/adt/multirangetypes.c:2878 utils/adt/rangetypes.c:1354 +#: utils/adt/rangetypes.c:1418 utils/adt/rowtypes.c:1885 #, c-format msgid "could not identify a hash function for type %s" -msgstr "não pôde identificar uma função hash para tipo %s" +msgstr "não foi possível identificar uma função hash para tipo %s" -#: utils/adt/arrayfuncs.c:4860 utils/adt/arrayfuncs.c:4900 +#: utils/adt/arrayfuncs.c:4334 utils/adt/rowtypes.c:2006 #, c-format -msgid "dimension array or low bound array cannot be null" -msgstr "matriz de dimensões ou matriz de limites inferiores não pode ser nula" +msgid "could not identify an extended hash function for type %s" +msgstr "não foi possível identificar uma função hash estendida para o tipo de dados %s" -#: utils/adt/arrayfuncs.c:4963 utils/adt/arrayfuncs.c:4995 +#: utils/adt/arrayfuncs.c:5529 #, c-format -msgid "Dimension array must be one dimensional." -msgstr "Matriz de dimensões deve ser de uma dimensão." +msgid "data type %s is not an array type" +msgstr "o tipo de dados %s não é um tipo de dados de array" + +#: utils/adt/arrayfuncs.c:5584 +#, c-format +msgid "cannot accumulate null arrays" +msgstr "não é possível acumular matrizes nulas" + +#: utils/adt/arrayfuncs.c:5612 +#, c-format +msgid "cannot accumulate empty arrays" +msgstr "não é possível acumular matrizes vazias" -#: utils/adt/arrayfuncs.c:4968 utils/adt/arrayfuncs.c:5000 +#: utils/adt/arrayfuncs.c:6013 utils/adt/arrayfuncs.c:6053 #, c-format -msgid "wrong range of array subscripts" -msgstr "intervalo incorreto de índices da matriz" +msgid "dimension array or low bound array cannot be null" +msgstr "matriz de dimensões ou matriz de limites inferiores não pode ser nula" -#: utils/adt/arrayfuncs.c:4969 utils/adt/arrayfuncs.c:5001 +#: utils/adt/arrayfuncs.c:6116 utils/adt/arrayfuncs.c:6142 #, c-format -msgid "Lower bound of dimension array must be one." -msgstr "Limite inferior da matriz de dimensões deve ser um." +msgid "Dimension array must be one dimensional." +msgstr "Matriz de dimensões deve ser de uma dimensão." -#: utils/adt/arrayfuncs.c:4974 utils/adt/arrayfuncs.c:5006 +#: utils/adt/arrayfuncs.c:6121 utils/adt/arrayfuncs.c:6147 #, c-format msgid "dimension values cannot be null" msgstr "valores de dimensão não podem ser nulos" -#: utils/adt/arrayfuncs.c:5012 +#: utils/adt/arrayfuncs.c:6153 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Matriz de limites inferiores tem tamanho diferente que a matriz de dimensões." -#: utils/adt/arrayfuncs.c:5279 +#: utils/adt/arrayfuncs.c:6431 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "remover elementos de matrizes multidimensionais não é suportado" -#: utils/adt/arrayutils.c:209 +#: utils/adt/arrayfuncs.c:6708 +#, c-format +msgid "thresholds must be one-dimensional array" +msgstr "os limites devem ser uma matriz unidimensional" + +#: utils/adt/arrayfuncs.c:6713 +#, c-format +msgid "thresholds array must not contain NULLs" +msgstr "matriz de limites não deve conter valores nulos" + +#: utils/adt/arrayfuncs.c:6946 +#, c-format +msgid "number of elements to trim must be between 0 and %d" +msgstr "o número de elementos a serem cortados deve estar entre 0 e %d" + +#: utils/adt/arraysubs.c:93 utils/adt/arraysubs.c:130 +#, c-format +msgid "array subscript must have type integer" +msgstr "índice da matriz deve ser do tipo integer" + +#: utils/adt/arraysubs.c:198 utils/adt/arraysubs.c:217 +#, c-format +msgid "array subscript in assignment must not be null" +msgstr "índice da matriz em atribuição não deve ser nulo" + +#: utils/adt/arrayutils.c:155 +#, c-format +msgid "array lower bound is too large: %d" +msgstr "" + +#: utils/adt/arrayutils.c:257 #, c-format msgid "typmod array must be type cstring[]" msgstr "matriz typmod deve ser do tipo cstring[]" -#: utils/adt/arrayutils.c:214 +#: utils/adt/arrayutils.c:262 #, c-format msgid "typmod array must be one-dimensional" msgstr "matriz typmod deve ser de uma dimensão" -#: utils/adt/arrayutils.c:219 +#: utils/adt/arrayutils.c:267 #, c-format msgid "typmod array must not contain nulls" msgstr "matriz typmod não deve conter valores nulos" -#: utils/adt/ascii.c:75 +#: utils/adt/ascii.c:77 #, c-format msgid "encoding conversion from %s to ASCII not supported" -msgstr "conversão de codificação de %s para ASCII não é suportada" - -#: utils/adt/bool.c:153 -#, c-format -msgid "invalid input syntax for type boolean: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo boolean: \"%s\"" +msgstr "conversão de codificação de %s para ASCII não tem suporte" -#: utils/adt/cash.c:246 +#. translator: first %s is inet or cidr +#: utils/adt/bool.c:153 utils/adt/cash.c:277 utils/adt/datetime.c:4017 +#: utils/adt/float.c:206 utils/adt/float.c:293 utils/adt/float.c:307 +#: utils/adt/float.c:412 utils/adt/float.c:495 utils/adt/float.c:509 +#: utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 +#: utils/adt/geo_ops.c:1417 utils/adt/geo_ops.c:1454 utils/adt/geo_ops.c:1462 +#: utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 +#: utils/adt/geo_ops.c:4672 utils/adt/int.c:174 utils/adt/int.c:186 +#: utils/adt/jsonpath.c:183 utils/adt/mac.c:94 utils/adt/mac8.c:225 +#: utils/adt/network.c:99 utils/adt/numeric.c:795 utils/adt/numeric.c:7136 +#: utils/adt/numeric.c:7339 utils/adt/numeric.c:8286 utils/adt/numutils.c:357 +#: utils/adt/numutils.c:619 utils/adt/numutils.c:881 utils/adt/numutils.c:920 +#: utils/adt/numutils.c:942 utils/adt/numutils.c:1006 utils/adt/numutils.c:1028 +#: utils/adt/pg_lsn.c:74 utils/adt/tid.c:72 utils/adt/tid.c:80 +#: utils/adt/tid.c:94 utils/adt/tid.c:103 utils/adt/timestamp.c:494 +#: utils/adt/uuid.c:135 utils/adt/xid8funcs.c:354 #, c-format -msgid "invalid input syntax for type money: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo money: \"%s\"" +msgid "invalid input syntax for type %s: \"%s\"" +msgstr "sintaxe de entrada é inválida para tipo %s: \"%s\"" -#: utils/adt/cash.c:607 utils/adt/cash.c:657 utils/adt/cash.c:708 -#: utils/adt/cash.c:757 utils/adt/cash.c:809 utils/adt/cash.c:859 -#: utils/adt/float.c:788 utils/adt/float.c:852 utils/adt/float.c:2530 -#: utils/adt/float.c:2593 utils/adt/geo_ops.c:4115 utils/adt/int.c:719 -#: utils/adt/int.c:861 utils/adt/int.c:969 utils/adt/int.c:1058 -#: utils/adt/int.c:1097 utils/adt/int.c:1125 utils/adt/int8.c:597 -#: utils/adt/int8.c:657 utils/adt/int8.c:897 utils/adt/int8.c:1005 -#: utils/adt/int8.c:1094 utils/adt/int8.c:1202 utils/adt/numeric.c:4961 -#: utils/adt/numeric.c:5244 utils/adt/timestamp.c:3357 +#: utils/adt/cash.c:215 utils/adt/cash.c:240 utils/adt/cash.c:250 +#: utils/adt/cash.c:290 utils/adt/int.c:180 utils/adt/numutils.c:351 +#: utils/adt/numutils.c:613 utils/adt/numutils.c:875 utils/adt/numutils.c:926 +#: utils/adt/numutils.c:965 utils/adt/numutils.c:1012 +#, c-format +msgid "value \"%s\" is out of range for type %s" +msgstr "o valor \"%s\" está fora do intervalo para o tipo de dados %s" + +#: utils/adt/cash.c:652 utils/adt/cash.c:702 utils/adt/cash.c:753 +#: utils/adt/cash.c:802 utils/adt/cash.c:854 utils/adt/cash.c:904 +#: utils/adt/float.c:105 utils/adt/int.c:843 utils/adt/int.c:959 +#: utils/adt/int.c:1039 utils/adt/int.c:1101 utils/adt/int.c:1139 +#: utils/adt/int.c:1167 utils/adt/int8.c:515 utils/adt/int8.c:573 +#: utils/adt/int8.c:943 utils/adt/int8.c:1023 utils/adt/int8.c:1085 +#: utils/adt/int8.c:1165 utils/adt/numeric.c:3175 utils/adt/numeric.c:3198 +#: utils/adt/numeric.c:3283 utils/adt/numeric.c:3301 utils/adt/numeric.c:3397 +#: utils/adt/numeric.c:8835 utils/adt/numeric.c:9148 utils/adt/numeric.c:9496 +#: utils/adt/numeric.c:9612 utils/adt/numeric.c:11122 +#: utils/adt/timestamp.c:3411 #, c-format msgid "division by zero" msgstr "divisão por zero" -#: utils/adt/char.c:169 +#: utils/adt/char.c:197 #, c-format msgid "\"char\" out of range" msgstr "\"char\" fora do intervalo" -#: utils/adt/date.c:68 utils/adt/timestamp.c:102 utils/adt/varbit.c:52 -#: utils/adt/varchar.c:44 +#: utils/adt/cryptohashfuncs.c:48 utils/adt/cryptohashfuncs.c:70 +#, c-format +msgid "could not compute %s hash: %s" +msgstr "não foi possível calcular o hash %s: %s" + +#: utils/adt/date.c:63 utils/adt/timestamp.c:100 utils/adt/varbit.c:105 +#: utils/adt/varchar.c:49 #, c-format msgid "invalid type modifier" msgstr "modificador de tipo é inválido" -#: utils/adt/date.c:73 +#: utils/adt/date.c:75 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "precisão do TIME(%d)%s não deve ser negativa" -#: utils/adt/date.c:79 +#: utils/adt/date.c:81 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "precisão do TIME(%d)%s reduzida ao máximo permitido, %d" -#: utils/adt/date.c:142 utils/adt/datetime.c:1208 utils/adt/datetime.c:2079 -#, c-format -msgid "date/time value \"current\" is no longer supported" -msgstr "valor de data/hora \"current\" não é mais suportado" - -#: utils/adt/date.c:167 utils/adt/formatting.c:3411 +#: utils/adt/date.c:166 utils/adt/date.c:174 utils/adt/formatting.c:4241 +#: utils/adt/formatting.c:4250 utils/adt/formatting.c:4363 +#: utils/adt/formatting.c:4373 #, c-format msgid "date out of range: \"%s\"" msgstr "date fora do intervalo: \"%s\"" -#: utils/adt/date.c:217 utils/adt/json.c:1431 utils/adt/xml.c:2024 +#: utils/adt/date.c:221 utils/adt/date.c:519 utils/adt/date.c:543 +#: utils/adt/rangetypes.c:1577 utils/adt/rangetypes.c:1592 utils/adt/xml.c:2460 #, c-format msgid "date out of range" msgstr "data fora do intervalo" -#: utils/adt/date.c:259 utils/adt/timestamp.c:600 +#: utils/adt/date.c:267 utils/adt/timestamp.c:582 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "valor do campo date está fora do intervalo: %d-%02d-%02d" -#: utils/adt/date.c:265 utils/adt/timestamp.c:606 +#: utils/adt/date.c:274 utils/adt/date.c:283 utils/adt/timestamp.c:588 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "date fora do intervalo: %d-%02d-%02d" -#: utils/adt/date.c:418 +#: utils/adt/date.c:494 #, c-format msgid "cannot subtract infinite dates" -msgstr "não pode subtrair valores date infinitos" +msgstr "não é possível subtrair valores de data infinitos" -#: utils/adt/date.c:475 utils/adt/date.c:512 +#: utils/adt/date.c:592 utils/adt/date.c:655 utils/adt/date.c:691 +#: utils/adt/date.c:2885 utils/adt/date.c:2895 #, c-format msgid "date out of range for timestamp" msgstr "date fora do intervalo para timestamp" -#: utils/adt/date.c:971 utils/adt/date.c:1017 utils/adt/date.c:1617 -#: utils/adt/date.c:1653 utils/adt/date.c:2525 utils/adt/formatting.c:3287 -#: utils/adt/formatting.c:3319 utils/adt/formatting.c:3387 -#: utils/adt/json.c:1456 utils/adt/json.c:1463 utils/adt/json.c:1483 -#: utils/adt/json.c:1490 utils/adt/nabstime.c:455 utils/adt/nabstime.c:498 -#: utils/adt/nabstime.c:528 utils/adt/nabstime.c:571 utils/adt/timestamp.c:232 -#: utils/adt/timestamp.c:275 utils/adt/timestamp.c:724 -#: utils/adt/timestamp.c:753 utils/adt/timestamp.c:792 -#: utils/adt/timestamp.c:2946 utils/adt/timestamp.c:2967 -#: utils/adt/timestamp.c:2980 utils/adt/timestamp.c:2989 -#: utils/adt/timestamp.c:3046 utils/adt/timestamp.c:3069 -#: utils/adt/timestamp.c:3082 utils/adt/timestamp.c:3093 -#: utils/adt/timestamp.c:3618 utils/adt/timestamp.c:3747 -#: utils/adt/timestamp.c:3788 utils/adt/timestamp.c:3876 -#: utils/adt/timestamp.c:3922 utils/adt/timestamp.c:4033 -#: utils/adt/timestamp.c:4357 utils/adt/timestamp.c:4496 -#: utils/adt/timestamp.c:4506 utils/adt/timestamp.c:4568 -#: utils/adt/timestamp.c:4708 utils/adt/timestamp.c:4718 -#: utils/adt/timestamp.c:4932 utils/adt/timestamp.c:4946 -#: utils/adt/timestamp.c:5025 utils/adt/timestamp.c:5032 -#: utils/adt/timestamp.c:5058 utils/adt/timestamp.c:5062 -#: utils/adt/timestamp.c:5131 utils/adt/xml.c:2046 utils/adt/xml.c:2053 -#: utils/adt/xml.c:2073 utils/adt/xml.c:2080 +#: utils/adt/date.c:1121 utils/adt/date.c:1204 utils/adt/date.c:1220 +#: utils/adt/date.c:2206 utils/adt/date.c:2990 utils/adt/timestamp.c:4124 +#: utils/adt/timestamp.c:4317 utils/adt/timestamp.c:4459 +#: utils/adt/timestamp.c:4712 utils/adt/timestamp.c:4913 +#: utils/adt/timestamp.c:4960 utils/adt/timestamp.c:5184 +#: utils/adt/timestamp.c:5231 utils/adt/timestamp.c:5361 +#, c-format +msgid "unit \"%s\" not supported for type %s" +msgstr "unidade \"%s\" sem suporte para o tipo de dados %s" + +#: utils/adt/date.c:1229 utils/adt/date.c:2222 utils/adt/date.c:3010 +#: utils/adt/timestamp.c:4138 utils/adt/timestamp.c:4334 +#: utils/adt/timestamp.c:4473 utils/adt/timestamp.c:4672 +#: utils/adt/timestamp.c:4969 utils/adt/timestamp.c:5240 +#: utils/adt/timestamp.c:5422 +#, c-format +msgid "unit \"%s\" not recognized for type %s" +msgstr "unidade \"%s\" não reconhecida para o tipo de dados %s" + +#: utils/adt/date.c:1313 utils/adt/date.c:1359 utils/adt/date.c:1918 +#: utils/adt/date.c:1949 utils/adt/date.c:1978 utils/adt/date.c:2848 +#: utils/adt/date.c:3080 utils/adt/datetime.c:424 utils/adt/datetime.c:1809 +#: utils/adt/formatting.c:4081 utils/adt/formatting.c:4117 +#: utils/adt/formatting.c:4210 utils/adt/formatting.c:4339 utils/adt/json.c:467 +#: utils/adt/json.c:506 utils/adt/timestamp.c:232 utils/adt/timestamp.c:264 +#: utils/adt/timestamp.c:700 utils/adt/timestamp.c:709 +#: utils/adt/timestamp.c:787 utils/adt/timestamp.c:820 +#: utils/adt/timestamp.c:2933 utils/adt/timestamp.c:2954 +#: utils/adt/timestamp.c:2967 utils/adt/timestamp.c:2976 +#: utils/adt/timestamp.c:2984 utils/adt/timestamp.c:3045 +#: utils/adt/timestamp.c:3068 utils/adt/timestamp.c:3081 +#: utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3100 +#: utils/adt/timestamp.c:3828 utils/adt/timestamp.c:3952 +#: utils/adt/timestamp.c:4042 utils/adt/timestamp.c:4132 +#: utils/adt/timestamp.c:4225 utils/adt/timestamp.c:4328 +#: utils/adt/timestamp.c:4777 utils/adt/timestamp.c:5051 +#: utils/adt/timestamp.c:5490 utils/adt/timestamp.c:5500 +#: utils/adt/timestamp.c:5505 utils/adt/timestamp.c:5511 +#: utils/adt/timestamp.c:5544 utils/adt/timestamp.c:5631 +#: utils/adt/timestamp.c:5672 utils/adt/timestamp.c:5676 +#: utils/adt/timestamp.c:5730 utils/adt/timestamp.c:5734 +#: utils/adt/timestamp.c:5740 utils/adt/timestamp.c:5774 utils/adt/xml.c:2482 +#: utils/adt/xml.c:2489 utils/adt/xml.c:2509 utils/adt/xml.c:2516 #, c-format msgid "timestamp out of range" msgstr "timestamp fora do intervalo" -#: utils/adt/date.c:1043 -#, c-format -msgid "cannot convert reserved abstime value to date" -msgstr "não pode converter valor de abstime reservado para date" - -#: utils/adt/date.c:1197 utils/adt/date.c:1204 utils/adt/date.c:2015 -#: utils/adt/date.c:2022 +#: utils/adt/date.c:1535 utils/adt/date.c:2343 utils/adt/formatting.c:4431 #, c-format msgid "time out of range" msgstr "time fora do intervalo" -#: utils/adt/date.c:1265 utils/adt/timestamp.c:625 +#: utils/adt/date.c:1587 utils/adt/timestamp.c:597 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "valor do campo time está fora do intervalo: %d:%02d:%02g" -#: utils/adt/date.c:1893 utils/adt/date.c:1910 +#: utils/adt/date.c:2107 utils/adt/date.c:2647 utils/adt/float.c:1042 +#: utils/adt/float.c:1118 utils/adt/int.c:635 utils/adt/int.c:682 +#: utils/adt/int.c:717 utils/adt/int8.c:414 utils/adt/numeric.c:2579 +#: utils/adt/timestamp.c:3482 utils/adt/timestamp.c:3509 +#: utils/adt/timestamp.c:3540 #, c-format -msgid "\"time\" units \"%s\" not recognized" -msgstr "unidades de \"time\" \"%s\" são desconhecidas" +msgid "invalid preceding or following size in window function" +msgstr "tamanho anterior ou seguinte inválido na função de janela deslizante" -#: utils/adt/date.c:2031 +#: utils/adt/date.c:2351 #, c-format msgid "time zone displacement out of range" msgstr "deslocamento de zona horária fora do intervalo" -#: utils/adt/date.c:2655 utils/adt/date.c:2672 -#, c-format -msgid "\"time with time zone\" units \"%s\" not recognized" -msgstr "unidades de \"time with time zone\" \"%s\" são desconhecidas" - -#: utils/adt/date.c:2745 utils/adt/datetime.c:925 utils/adt/datetime.c:1805 -#: utils/adt/datetime.c:4566 utils/adt/timestamp.c:539 -#: utils/adt/timestamp.c:566 utils/adt/timestamp.c:4958 -#: utils/adt/timestamp.c:5142 -#, c-format -msgid "time zone \"%s\" not recognized" -msgstr "zona horária \"%s\" é desconhecida" - -#: utils/adt/date.c:2785 utils/adt/timestamp.c:4983 utils/adt/timestamp.c:5168 +#: utils/adt/date.c:3111 utils/adt/timestamp.c:5533 utils/adt/timestamp.c:5763 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "interval de zona horária \"%s\" não deve especificar meses ou dias" -#: utils/adt/datetime.c:1680 +#: utils/adt/datetime.c:3223 utils/adt/datetime.c:4002 +#: utils/adt/datetime.c:4008 utils/adt/timestamp.c:512 #, c-format -msgid "time zone abbreviation \"%s\" is not used in time zone \"%s\"" -msgstr "abreviação de zona horária \"%s\" não é utilizada na zona horária \"%s\"" +msgid "time zone \"%s\" not recognized" +msgstr "zona horária \"%s\" é desconhecida" -#: utils/adt/datetime.c:3766 utils/adt/datetime.c:3773 +#: utils/adt/datetime.c:3976 utils/adt/datetime.c:3983 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "valor do campo date/time está fora do intervalo: \"%s\"" -#: utils/adt/datetime.c:3775 +#: utils/adt/datetime.c:3985 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Talvez você necessite de uma definição diferente para \"datestyle\"." -#: utils/adt/datetime.c:3780 +#: utils/adt/datetime.c:3990 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "valor do campo interval fora do intervalo: \"%s\"" -#: utils/adt/datetime.c:3786 -#, c-format -msgid "time zone displacement out of range: \"%s\"" -msgstr "deslocamento de zona horária fora do intervalo: \"%s\"" - -#. translator: first %s is inet or cidr -#: utils/adt/datetime.c:3793 utils/adt/network.c:58 +#: utils/adt/datetime.c:3996 #, c-format -msgid "invalid input syntax for type %s: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo %s: \"%s\"" +msgid "time zone displacement out of range: \"%s\"" +msgstr "deslocamento de zona horária fora do intervalo: \"%s\"" -#: utils/adt/datetime.c:4568 +#: utils/adt/datetime.c:4010 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "Este nome de zona horária aparece no arquivo de configuração para abreviação da zona horária \"%s\"." -#: utils/adt/datum.c:80 utils/adt/datum.c:92 +#: utils/adt/datum.c:91 utils/adt/datum.c:103 #, c-format msgid "invalid Datum pointer" msgstr "ponteiro Datum é inválido" -#: utils/adt/dbsize.c:108 +#: utils/adt/dbsize.c:761 utils/adt/dbsize.c:837 +#, c-format +msgid "invalid size: \"%s\"" +msgstr "tamanho inválido: \"%s\"" + +#: utils/adt/dbsize.c:838 #, c-format -msgid "could not open tablespace directory \"%s\": %m" -msgstr "não pôde abrir diretório da tablespace \"%s\": %m" +msgid "Invalid size unit: \"%s\"." +msgstr "Unidade de tamanho inválida: \"%s\"." -#: utils/adt/domains.c:83 +#: utils/adt/dbsize.c:839 +#, c-format +msgid "Valid units are \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." +msgstr "As unidades válidas são \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", e \"PB\"." + +#: utils/adt/domains.c:92 #, c-format msgid "type %s is not a domain" msgstr "tipo %s não é um domínio" -#: utils/adt/encode.c:55 utils/adt/encode.c:91 +#: utils/adt/encode.c:66 utils/adt/encode.c:114 #, c-format msgid "unrecognized encoding: \"%s\"" msgstr "codificação desconhecida: \"%s\"" -#: utils/adt/encode.c:150 +#: utils/adt/encode.c:80 +#, c-format +msgid "result of encoding conversion is too large" +msgstr "o resultado da conversão de codificação é muito grande" + +#: utils/adt/encode.c:128 #, c-format -msgid "invalid hexadecimal digit: \"%c\"" -msgstr "dígito hexadecimal é inválido: \"%c\"" +msgid "result of decoding conversion is too large" +msgstr "" + +#: utils/adt/encode.c:217 utils/adt/encode.c:227 +#, c-format +msgid "invalid hexadecimal digit: \"%.*s\"" +msgstr "dígito hexadecimal inválido: \"%.*s\"" -#: utils/adt/encode.c:178 +#: utils/adt/encode.c:223 #, c-format msgid "invalid hexadecimal data: odd number of digits" msgstr "dado hexadecimal é inválido: número de dígitos estranho" -#: utils/adt/encode.c:295 +#: utils/adt/encode.c:344 +#, c-format +msgid "unexpected \"=\" while decoding base64 sequence" +msgstr "\"=\" não esperado ao decodificar a sequência base64" + +#: utils/adt/encode.c:356 +#, c-format +msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" +msgstr "" + +#: utils/adt/encode.c:377 #, c-format -msgid "unexpected \"=\"" -msgstr "\"=\" inesperado" +msgid "invalid base64 end sequence" +msgstr "fim de sequência base64 inválido" -#: utils/adt/encode.c:307 +#: utils/adt/encode.c:378 #, c-format -msgid "invalid symbol" -msgstr "símbolo é inválido" +msgid "Input data is missing padding, is truncated, or is otherwise corrupted." +msgstr "" -#: utils/adt/encode.c:327 +#: utils/adt/enum.c:99 #, c-format -msgid "invalid end sequence" -msgstr "fim de sequência é inválido" +msgid "unsafe use of new value \"%s\" of enum type %s" +msgstr "" -#: utils/adt/encode.c:441 utils/adt/encode.c:506 utils/adt/varlena.c:255 -#: utils/adt/varlena.c:296 +#: utils/adt/enum.c:102 #, c-format -msgid "invalid input syntax for type bytea" -msgstr "sintaxe de entrada é inválida para tipo bytea" +msgid "New enum values must be committed before they can be used." +msgstr "" -#: utils/adt/enum.c:48 utils/adt/enum.c:58 utils/adt/enum.c:113 -#: utils/adt/enum.c:123 +#: utils/adt/enum.c:121 utils/adt/enum.c:131 utils/adt/enum.c:194 +#: utils/adt/enum.c:204 #, c-format msgid "invalid input value for enum %s: \"%s\"" msgstr "valor de entrada é inválido para enum %s: \"%s\"" -#: utils/adt/enum.c:85 utils/adt/enum.c:148 utils/adt/enum.c:198 +#: utils/adt/enum.c:166 utils/adt/enum.c:232 utils/adt/enum.c:291 #, c-format msgid "invalid internal value for enum: %u" msgstr "valor interno é inválido para enum: %u" -#: utils/adt/enum.c:357 utils/adt/enum.c:386 utils/adt/enum.c:426 -#: utils/adt/enum.c:446 +#: utils/adt/enum.c:451 utils/adt/enum.c:480 utils/adt/enum.c:520 +#: utils/adt/enum.c:540 #, c-format msgid "could not determine actual enum type" -msgstr "não pôde determinar tipo enum atual" +msgstr "não foi possível determinar tipo enum atual" -#: utils/adt/enum.c:365 utils/adt/enum.c:394 +#: utils/adt/enum.c:459 utils/adt/enum.c:488 #, c-format msgid "enum %s contains no values" msgstr "enum %s não contém valores" -#: utils/adt/float.c:55 +#: utils/adt/float.c:89 #, c-format msgid "value out of range: overflow" msgstr "valor fora do intervalo: estouro (overflow)" -#: utils/adt/float.c:60 +#: utils/adt/float.c:97 #, c-format msgid "value out of range: underflow" msgstr "valor fora do intervalo: estouro (underflow)" -#: utils/adt/float.c:218 utils/adt/float.c:292 utils/adt/float.c:316 -#, c-format -msgid "invalid input syntax for type real: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo real: \"%s\"" - #: utils/adt/float.c:286 #, c-format msgid "\"%s\" is out of range for type real" msgstr "\"%s\" está fora do intervalo para tipo real" -#: utils/adt/float.c:417 utils/adt/float.c:491 utils/adt/float.c:515 -#: utils/adt/numeric.c:4423 utils/adt/numeric.c:4449 -#, c-format -msgid "invalid input syntax for type double precision: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo double precision: \"%s\"" - -#: utils/adt/float.c:485 +#: utils/adt/float.c:488 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "\"%s\" está fora do intervalo para tipo double precision" -#: utils/adt/float.c:1179 utils/adt/float.c:1237 utils/adt/int.c:349 -#: utils/adt/int.c:775 utils/adt/int.c:804 utils/adt/int.c:825 -#: utils/adt/int.c:845 utils/adt/int.c:879 utils/adt/int.c:1174 -#: utils/adt/int8.c:1323 utils/adt/numeric.c:2401 utils/adt/numeric.c:2410 +#: utils/adt/float.c:1253 utils/adt/float.c:1327 utils/adt/int.c:355 +#: utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 +#: utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 +#: utils/adt/int8.c:1278 utils/adt/numeric.c:4500 utils/adt/numeric.c:4505 #, c-format msgid "smallint out of range" msgstr "smallint fora do intervalo" -#: utils/adt/float.c:1363 utils/adt/numeric.c:5637 +#: utils/adt/float.c:1453 utils/adt/numeric.c:3693 utils/adt/numeric.c:10027 #, c-format msgid "cannot take square root of a negative number" -msgstr "não pode calcular raiz quadrada de um número negativo" +msgstr "não é possível calcular a raiz quadrada de um número negativo" -#: utils/adt/float.c:1405 utils/adt/numeric.c:2221 +#: utils/adt/float.c:1521 utils/adt/numeric.c:3981 utils/adt/numeric.c:4093 #, c-format msgid "zero raised to a negative power is undefined" msgstr "zero elevado a um número negativo é indefinido" -#: utils/adt/float.c:1409 utils/adt/numeric.c:2227 +#: utils/adt/float.c:1525 utils/adt/numeric.c:3985 utils/adt/numeric.c:10918 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "um número negativo elevado a um número que não é inteiro retorna um resultado complexo" -#: utils/adt/float.c:1475 utils/adt/float.c:1505 utils/adt/numeric.c:5855 +#: utils/adt/float.c:1701 utils/adt/float.c:1734 utils/adt/numeric.c:3893 +#: utils/adt/numeric.c:10698 #, c-format msgid "cannot take logarithm of zero" -msgstr "não pode calcular logaritmo de zero" +msgstr "não é possível calcular o logaritmo de zero" -#: utils/adt/float.c:1479 utils/adt/float.c:1509 utils/adt/numeric.c:5859 +#: utils/adt/float.c:1705 utils/adt/float.c:1738 utils/adt/numeric.c:3831 +#: utils/adt/numeric.c:3888 utils/adt/numeric.c:10702 #, c-format msgid "cannot take logarithm of a negative number" -msgstr "não pode calcular logaritmo de número negativo" +msgstr "não é possível calcular logaritmo de número negativo" -#: utils/adt/float.c:1536 utils/adt/float.c:1557 utils/adt/float.c:1578 -#: utils/adt/float.c:1600 utils/adt/float.c:1621 utils/adt/float.c:1642 -#: utils/adt/float.c:1664 utils/adt/float.c:1685 +#: utils/adt/float.c:1771 utils/adt/float.c:1802 utils/adt/float.c:1897 +#: utils/adt/float.c:1924 utils/adt/float.c:1952 utils/adt/float.c:1979 +#: utils/adt/float.c:2126 utils/adt/float.c:2163 utils/adt/float.c:2333 +#: utils/adt/float.c:2389 utils/adt/float.c:2454 utils/adt/float.c:2511 +#: utils/adt/float.c:2702 utils/adt/float.c:2726 #, c-format msgid "input is out of range" -msgstr "entrada está fora do intervalo" +msgstr "a entrada está fora do intervalo" + +#: utils/adt/float.c:2867 +#, c-format +msgid "setseed parameter %g is out of allowed range [-1,1]" +msgstr "O parâmetro %g de setseed está fora do intervalo permitido [-1,1]" -#: utils/adt/float.c:2747 utils/adt/numeric.c:1274 +#: utils/adt/float.c:4095 utils/adt/numeric.c:1841 #, c-format msgid "count must be greater than zero" -msgstr "contador deve ser maior do que zero" +msgstr "o contador deve ser maior do que zero" -#: utils/adt/float.c:2752 utils/adt/numeric.c:1281 +#: utils/adt/float.c:4100 utils/adt/numeric.c:1852 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "operando, limite inferior e limite superior não podem ser NaN" -#: utils/adt/float.c:2758 +#: utils/adt/float.c:4106 utils/adt/numeric.c:1857 #, c-format msgid "lower and upper bounds must be finite" msgstr "limites inferior e superior devem ser finitos" -#: utils/adt/float.c:2796 utils/adt/numeric.c:1294 +#: utils/adt/float.c:4172 utils/adt/numeric.c:1871 #, c-format msgid "lower bound cannot equal upper bound" msgstr "limite inferior não pode ser igual a limite superior" -#: utils/adt/formatting.c:485 +#: utils/adt/formatting.c:519 #, c-format msgid "invalid format specification for an interval value" msgstr "especificação do formato é inválida para um valor interval" -#: utils/adt/formatting.c:486 +#: utils/adt/formatting.c:520 #, c-format msgid "Intervals are not tied to specific calendar dates." -msgstr "Intervalos não estão presos a datas específicas do calendário." +msgstr "Os intervalos não estão ligados a datas específicas do calendário." -#: utils/adt/formatting.c:1055 +#: utils/adt/formatting.c:1150 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\" deve ser o último padrão utilizado" -#: utils/adt/formatting.c:1063 +#: utils/adt/formatting.c:1158 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\" deve estar a frente de \"PR\"" -#: utils/adt/formatting.c:1079 +#: utils/adt/formatting.c:1174 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\" deve estar a frente de \"PR\"" -#: utils/adt/formatting.c:1106 +#: utils/adt/formatting.c:1201 #, c-format msgid "multiple decimal points" msgstr "múltiplos separadores decimais" -#: utils/adt/formatting.c:1110 utils/adt/formatting.c:1193 +#: utils/adt/formatting.c:1205 utils/adt/formatting.c:1288 #, c-format msgid "cannot use \"V\" and decimal point together" -msgstr "não pode utilizar \"V\" e separador decimal juntos" +msgstr "não é possível utilizar \"V\" e separador decimal juntos" -#: utils/adt/formatting.c:1122 +#: utils/adt/formatting.c:1217 #, c-format msgid "cannot use \"S\" twice" -msgstr "não pode utilizar \"S\" duas vezes" +msgstr "não é possível utilizar \"S\" duas vezes" -#: utils/adt/formatting.c:1126 +#: utils/adt/formatting.c:1221 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" -msgstr "não pode utilizar \"S\" e \"PL\"/\"MI\"/\"SG\"/\"PR\" juntos" +msgstr "não é possível utilizar \"S\" e \"PL\"/\"MI\"/\"SG\"/\"PR\" juntos" -#: utils/adt/formatting.c:1146 +#: utils/adt/formatting.c:1241 #, c-format msgid "cannot use \"S\" and \"MI\" together" -msgstr "não pode utilizar \"S\" e \"MI\" juntos" +msgstr "não é possível utilizar \"S\" e \"MI\" juntos" -#: utils/adt/formatting.c:1156 +#: utils/adt/formatting.c:1251 #, c-format msgid "cannot use \"S\" and \"PL\" together" -msgstr "não pode utilizar \"S\" e \"PL\" juntos" +msgstr "não é possível utilizar \"S\" e \"PL\" juntos" -#: utils/adt/formatting.c:1166 +#: utils/adt/formatting.c:1261 #, c-format msgid "cannot use \"S\" and \"SG\" together" -msgstr "não pode utilizar \"S\" e \"SG\" juntos" +msgstr "não é possível utilizar \"S\" e \"SG\" juntos" -#: utils/adt/formatting.c:1175 +#: utils/adt/formatting.c:1270 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" -msgstr "não pode utilizar \"PR\" e \"S\"/\"PL\"/\"MI\"/\"SG\" juntos" +msgstr "não é possível utilizar \"PR\" e \"S\"/\"PL\"/\"MI\"/\"SG\" juntos" -#: utils/adt/formatting.c:1201 +#: utils/adt/formatting.c:1296 #, c-format msgid "cannot use \"EEEE\" twice" -msgstr "não pode utilizar \"EEEE\" duas vezes" +msgstr "não é possível utilizar \"EEEE\" duas vezes" -#: utils/adt/formatting.c:1207 +#: utils/adt/formatting.c:1302 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\" é imcompatível com outros formatos" -#: utils/adt/formatting.c:1208 +#: utils/adt/formatting.c:1303 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "\"EEEE\" só pode ser utilizado em conjunto com padrões de dígitos e decimais." -#: utils/adt/formatting.c:1408 +#: utils/adt/formatting.c:1387 #, c-format -msgid "\"%s\" is not a number" -msgstr "\"%s\" não é um número" +msgid "invalid datetime format separator: \"%s\"" +msgstr "separador de formato de data e hora inválido: \"%s\"" -#: utils/adt/formatting.c:1509 utils/adt/formatting.c:1561 +#: utils/adt/formatting.c:1514 #, c-format -msgid "could not determine which collation to use for lower() function" -msgstr "não pôde determinar qual ordenação utilizar na função lower()" +msgid "\"%s\" is not a number" +msgstr "\"%s\" não é um número" -#: utils/adt/formatting.c:1629 utils/adt/formatting.c:1681 +#: utils/adt/formatting.c:1592 #, c-format -msgid "could not determine which collation to use for upper() function" -msgstr "não pôde determinar qual ordenação utilizar na função upper()" +msgid "case conversion failed: %s" +msgstr "a conversão de/para minúsculas/maiúsculas falhou: %s" -#: utils/adt/formatting.c:1750 utils/adt/formatting.c:1814 +#: utils/adt/formatting.c:1646 utils/adt/formatting.c:1768 +#: utils/adt/formatting.c:1891 #, c-format -msgid "could not determine which collation to use for initcap() function" -msgstr "não pôde determinar qual ordenação utilizar na função initcap()" +msgid "could not determine which collation to use for %s function" +msgstr "não foi possível determinar qual ordenação usar para a função %s" -#: utils/adt/formatting.c:2118 +#: utils/adt/formatting.c:2274 #, c-format msgid "invalid combination of date conventions" msgstr "combinação inválida de convenções do tipo date" -#: utils/adt/formatting.c:2119 +#: utils/adt/formatting.c:2275 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "Não misture convenções de data Gregoriana e ISO em um modelo de formatação." -#: utils/adt/formatting.c:2136 +#: utils/adt/formatting.c:2297 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "valores conflitantes para campo \"%s\" na cadeia de caracteres de formatação" -#: utils/adt/formatting.c:2138 +#: utils/adt/formatting.c:2299 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Este valor contradiz a configuração anterior para o mesmo tipo de campo." -#: utils/adt/formatting.c:2199 +#: utils/adt/formatting.c:2366 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "cadeia de carateres fonte é muito curta para campo de formatação \"%s\"" -#: utils/adt/formatting.c:2201 +#: utils/adt/formatting.c:2368 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Campo requer %d caracteres, mas só restam %d." -#: utils/adt/formatting.c:2204 utils/adt/formatting.c:2218 +#: utils/adt/formatting.c:2370 utils/adt/formatting.c:2384 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "Se sua cadeia de carateres fonte não tem tamanho fixo, tente utilizar o modificador \"FM\"." -#: utils/adt/formatting.c:2214 utils/adt/formatting.c:2227 -#: utils/adt/formatting.c:2357 +#: utils/adt/formatting.c:2380 utils/adt/formatting.c:2393 +#: utils/adt/formatting.c:2614 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "valor \"%s\" é inválido para \"%s\"" -#: utils/adt/formatting.c:2216 +#: utils/adt/formatting.c:2382 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Campo requer %d caracteres, mas somente %d puderam ser analisados." -#: utils/adt/formatting.c:2229 +#: utils/adt/formatting.c:2395 #, c-format msgid "Value must be an integer." msgstr "Valor deve ser um inteiro." -#: utils/adt/formatting.c:2234 +#: utils/adt/formatting.c:2400 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "valor para \"%s\" na cadeia de caracteres fonte está fora do intervalo" -#: utils/adt/formatting.c:2236 +#: utils/adt/formatting.c:2402 #, c-format msgid "Value must be in the range %d to %d." msgstr "Valor deve estar no intervalo de %d a %d." -#: utils/adt/formatting.c:2359 +#: utils/adt/formatting.c:2616 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "O valor informado não corresponde a nenhum dos valores permitidos para este campo." -#: utils/adt/formatting.c:2932 +#: utils/adt/formatting.c:2832 utils/adt/formatting.c:2852 +#: utils/adt/formatting.c:2872 utils/adt/formatting.c:2892 +#: utils/adt/formatting.c:2911 utils/adt/formatting.c:2930 +#: utils/adt/formatting.c:2954 utils/adt/formatting.c:2972 +#: utils/adt/formatting.c:2990 utils/adt/formatting.c:3008 +#: utils/adt/formatting.c:3025 utils/adt/formatting.c:3042 +#, c-format +msgid "localized string format value too long" +msgstr "cadeia de caracteres localizada muito longa" + +#: utils/adt/formatting.c:3322 +#, c-format +msgid "unmatched format separator \"%c\"" +msgstr "separador de formato \"%c\" sem correspondência" + +#: utils/adt/formatting.c:3383 +#, c-format +msgid "unmatched format character \"%s\"" +msgstr "caractere de formato \"%s\" sem correspondência" + +#: utils/adt/formatting.c:3491 #, c-format -msgid "\"TZ\"/\"tz\"/\"OF\" format patterns are not supported in to_date" -msgstr "formatos \"TZ\"/\"tz\"/\"OF\" não são suportadas em to_date" +msgid "formatting field \"%s\" is only supported in to_char" +msgstr "a formatação do campo \"%s\" só tem suporte em to_char" -#: utils/adt/formatting.c:3040 +#: utils/adt/formatting.c:3665 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "cadeia de caracteres de entrada é inválida para \"Y,YYY\"" -#: utils/adt/formatting.c:3543 +#: utils/adt/formatting.c:3754 +#, c-format +msgid "input string is too short for datetime format" +msgstr "a cadeia de caracteres de entrada é muito curta para o formato de data e hora" + +#: utils/adt/formatting.c:3762 +#, c-format +msgid "trailing characters remain in input string after datetime format" +msgstr "" + +#: utils/adt/formatting.c:4319 +#, c-format +msgid "missing time zone in input string for type timestamptz" +msgstr "" + +#: utils/adt/formatting.c:4325 +#, c-format +msgid "timestamptz out of range" +msgstr "timestamptz fora do intervalo" + +#: utils/adt/formatting.c:4353 +#, c-format +msgid "datetime format is zoned but not timed" +msgstr "" + +#: utils/adt/formatting.c:4411 +#, c-format +msgid "missing time zone in input string for type timetz" +msgstr "" + +#: utils/adt/formatting.c:4417 +#, c-format +msgid "timetz out of range" +msgstr "timetz fora do intervalo" + +#: utils/adt/formatting.c:4443 +#, c-format +msgid "datetime format is not dated and not timed" +msgstr "" + +#: utils/adt/formatting.c:4575 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "hora \"%d\" é inválida para relógio de 12 horas" -#: utils/adt/formatting.c:3545 +#: utils/adt/formatting.c:4577 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." -msgstr "Utilize um relógio de 24 horas ou informe uma hora entre 1 e 12." +msgstr "Use um relógio de 24 horas, ou informe uma hora entre 1 e 12." -#: utils/adt/formatting.c:3640 +#: utils/adt/formatting.c:4689 #, c-format msgid "cannot calculate day of year without year information" -msgstr "não pode calcular dia do ano sem a informação do ano" +msgstr "não é possível calcular o dia do ano sem a informação do ano" -#: utils/adt/formatting.c:4490 +#: utils/adt/formatting.c:5621 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" não é suportado na entrada" -#: utils/adt/formatting.c:4502 +#: utils/adt/formatting.c:5633 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\" não é suportado na entrada" -#: utils/adt/genfile.c:61 -#, c-format -msgid "reference to parent directory (\"..\") not allowed" -msgstr "referência ao diretório pai (\"..\") não é permitida" - -#: utils/adt/genfile.c:72 +#: utils/adt/genfile.c:84 #, c-format msgid "absolute path not allowed" msgstr "caminho absoluto não é permitido" -#: utils/adt/genfile.c:77 +#: utils/adt/genfile.c:89 #, c-format -msgid "path must be in or below the current directory" -msgstr "caminho deve estar no ou abaixo do diretório atual" +msgid "path must be in or below the data directory" +msgstr "o caminho deve estar dentro ou abaixo do diretório de dados" -#: utils/adt/genfile.c:118 utils/adt/oracle_compat.c:184 -#: utils/adt/oracle_compat.c:282 utils/adt/oracle_compat.c:758 -#: utils/adt/oracle_compat.c:1059 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:190 +#: utils/adt/oracle_compat.c:288 utils/adt/oracle_compat.c:839 +#: utils/adt/oracle_compat.c:1142 #, c-format msgid "requested length too large" msgstr "tamanho solicitado é muito grande" -#: utils/adt/genfile.c:130 +#: utils/adt/genfile.c:131 #, c-format msgid "could not seek in file \"%s\": %m" -msgstr "não pôde posicionar no arquivo \"%s\": %m" +msgstr "não foi possível posicionar no arquivo \"%s\": %m" + +#: utils/adt/genfile.c:171 +#, c-format +msgid "file length too large" +msgstr "comprimento do arquivo muito grande" + +#: utils/adt/genfile.c:248 +#, c-format +msgid "must be superuser to read files with adminpack 1.0" +msgstr "é necessário ser um superusuário para ler arquivos com adminpack 1.0" -#: utils/adt/genfile.c:180 utils/adt/genfile.c:204 utils/adt/genfile.c:225 -#: utils/adt/genfile.c:249 +#: utils/adt/genfile.c:702 #, c-format -msgid "must be superuser to read files" -msgstr "deve ser super-usuário para ler arquivos" +msgid "tablespace with OID %u does not exist" +msgstr "não existe o espaço de tabelas com OID %u" -#: utils/adt/genfile.c:273 +#: utils/adt/geo_ops.c:998 utils/adt/geo_ops.c:1052 #, c-format -msgid "must be superuser to get file information" -msgstr "deve ser super-usuário para obter informação sobre arquivo" +msgid "invalid line specification: A and B cannot both be zero" +msgstr "especificação de line é inválida: A e B não podem ambos ser zero" -#: utils/adt/genfile.c:337 +#: utils/adt/geo_ops.c:1008 utils/adt/geo_ops.c:1124 #, c-format -msgid "must be superuser to get directory listings" -msgstr "deve ser super-usuário para obter listagem de diretórios" +msgid "invalid line specification: must be two distinct points" +msgstr "especificação de line é inválida: deve ser dois pontos distintos" -#: utils/adt/geo_ops.c:299 utils/adt/geo_ops.c:1398 utils/adt/geo_ops.c:3460 -#: utils/adt/geo_ops.c:4236 utils/adt/geo_ops.c:5165 +#: utils/adt/geo_ops.c:1438 utils/adt/geo_ops.c:3438 utils/adt/geo_ops.c:4368 +#: utils/adt/geo_ops.c:5253 #, c-format msgid "too many points requested" msgstr "muitos pontos solicitados" -#: utils/adt/geo_ops.c:322 +#: utils/adt/geo_ops.c:1502 #, c-format -msgid "could not format \"path\" value" -msgstr "não pôde formatar valor de \"path\"" +msgid "invalid number of points in external \"path\" value" +msgstr "número de pontos é inválido no valor de \"path\" externo" -#: utils/adt/geo_ops.c:397 +#: utils/adt/geo_ops.c:3487 #, c-format -msgid "invalid input syntax for type box: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo box: \"%s\"" +msgid "invalid number of points in external \"polygon\" value" +msgstr "número de pontos é inválido no valor de \"polygon\" externo" -#: utils/adt/geo_ops.c:992 +#: utils/adt/geo_ops.c:4463 #, c-format -msgid "invalid line specification: must be two distinct points" -msgstr "especificação de line é inválida: deve ser dois pontos distintos" +msgid "open path cannot be converted to polygon" +msgstr "caminho aberto não pode ser convertido em polígono" -#: utils/adt/geo_ops.c:1001 +#: utils/adt/geo_ops.c:4718 #, c-format -msgid "invalid line specification: A and B cannot both be zero" -msgstr "especificação de line é inválida: A e B não podem ambos ser zero" +msgid "invalid radius in external \"circle\" value" +msgstr "raio é inválido no valor de \"circle\" externo" -#: utils/adt/geo_ops.c:1006 +#: utils/adt/geo_ops.c:5239 #, c-format -msgid "invalid input syntax for type line: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo line: \"%s\"" +msgid "cannot convert circle with radius zero to polygon" +msgstr "não é possível converter círculo com raio zero para polígono" -#: utils/adt/geo_ops.c:1378 utils/adt/geo_ops.c:1409 +#: utils/adt/geo_ops.c:5244 #, c-format -msgid "invalid input syntax for type path: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo path: \"%s\"" +msgid "must request at least 2 points" +msgstr "deve informar pelo menos 2 pontos" -#: utils/adt/geo_ops.c:1448 +#: utils/adt/int.c:264 #, c-format -msgid "invalid number of points in external \"path\" value" -msgstr "número de pontos é inválido no valor de \"path\" externo" +msgid "invalid int2vector data" +msgstr "dado int2vector é inválido" -#: utils/adt/geo_ops.c:1791 +#: utils/adt/int.c:1529 utils/adt/int8.c:1404 utils/adt/numeric.c:1749 +#: utils/adt/timestamp.c:5824 utils/adt/timestamp.c:5906 #, c-format -msgid "invalid input syntax for type point: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo point: \"%s\"" +msgid "step size cannot equal zero" +msgstr "tamanho do passo não pode ser zero" -#: utils/adt/geo_ops.c:2019 +#: utils/adt/int8.c:449 utils/adt/int8.c:472 utils/adt/int8.c:486 +#: utils/adt/int8.c:500 utils/adt/int8.c:531 utils/adt/int8.c:555 +#: utils/adt/int8.c:637 utils/adt/int8.c:705 utils/adt/int8.c:711 +#: utils/adt/int8.c:737 utils/adt/int8.c:751 utils/adt/int8.c:775 +#: utils/adt/int8.c:788 utils/adt/int8.c:900 utils/adt/int8.c:914 +#: utils/adt/int8.c:928 utils/adt/int8.c:959 utils/adt/int8.c:981 +#: utils/adt/int8.c:995 utils/adt/int8.c:1009 utils/adt/int8.c:1042 +#: utils/adt/int8.c:1056 utils/adt/int8.c:1070 utils/adt/int8.c:1101 +#: utils/adt/int8.c:1123 utils/adt/int8.c:1137 utils/adt/int8.c:1151 +#: utils/adt/int8.c:1313 utils/adt/int8.c:1348 utils/adt/numeric.c:4459 +#: utils/adt/rangetypes.c:1528 utils/adt/rangetypes.c:1541 +#: utils/adt/varbit.c:1676 #, c-format -msgid "invalid input syntax for type lseg: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo lseg: \"%s\"" +msgid "bigint out of range" +msgstr "bigint fora do intervalo" -#: utils/adt/geo_ops.c:2623 +#: utils/adt/int8.c:1361 #, c-format -msgid "function \"dist_lb\" not implemented" -msgstr "função \"dist_lb\" não está implementada" +msgid "OID out of range" +msgstr "OID fora do intervalo" -#: utils/adt/geo_ops.c:3035 +#: utils/adt/json.c:320 utils/adt/jsonb.c:781 #, c-format -msgid "function \"close_sl\" not implemented" -msgstr "função \"close_sl\" não está implementada" +msgid "key value must be scalar, not array, composite, or json" +msgstr "valor da chave deve ser escalar, não uma matriz, composto ou json" -#: utils/adt/geo_ops.c:3137 +#: utils/adt/json.c:1113 utils/adt/json.c:1123 utils/fmgr/funcapi.c:2082 #, c-format -msgid "function \"close_lb\" not implemented" -msgstr "função \"close_lb\" não está implementada" +msgid "could not determine data type for argument %d" +msgstr "não foi possível determinar o tipo de dados do argumento %d" -#: utils/adt/geo_ops.c:3426 +#: utils/adt/json.c:1146 utils/adt/json.c:1337 utils/adt/json.c:1513 +#: utils/adt/json.c:1591 utils/adt/jsonb.c:1432 utils/adt/jsonb.c:1522 #, c-format -msgid "cannot create bounding box for empty polygon" -msgstr "não pode criar um caixa circunscrita para um polígono vazio" +msgid "null value not allowed for object key" +msgstr "valor nulo não é permitido em chave de objeto" -#: utils/adt/geo_ops.c:3451 utils/adt/geo_ops.c:3471 +#: utils/adt/json.c:1189 utils/adt/json.c:1352 #, c-format -msgid "invalid input syntax for type polygon: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo polygon: \"%s\"" +msgid "duplicate JSON object key value: %s" +msgstr "" -#: utils/adt/geo_ops.c:3511 +#: utils/adt/json.c:1297 utils/adt/jsonb.c:1233 #, c-format -msgid "invalid number of points in external \"polygon\" value" -msgstr "número de pontos é inválido no valor de \"polygon\" externo" +msgid "argument list must have even number of elements" +msgstr "lista de argumentos deve ter número par de elementos" -#: utils/adt/geo_ops.c:4034 +#. translator: %s is a SQL function name +#: utils/adt/json.c:1299 utils/adt/jsonb.c:1235 #, c-format -msgid "function \"poly_distance\" not implemented" -msgstr "função \"poly_distance\" não está implementada" +msgid "The arguments of %s must consist of alternating keys and values." +msgstr "Os argumentos de %s devem consistir em chaves e valores alternados." -#: utils/adt/geo_ops.c:4348 +#: utils/adt/json.c:1491 utils/adt/jsonb.c:1410 #, c-format -msgid "function \"path_center\" not implemented" -msgstr "função \"path_center\" não está implementada" +msgid "array must have two columns" +msgstr "matriz deve ter duas colunas" -#: utils/adt/geo_ops.c:4365 +#: utils/adt/json.c:1580 utils/adt/jsonb.c:1511 #, c-format -msgid "open path cannot be converted to polygon" -msgstr "caminho aberto não pode ser convertido em polígono" +msgid "mismatched array dimensions" +msgstr "dimensões de matrizes não correspondem" -#: utils/adt/geo_ops.c:4542 utils/adt/geo_ops.c:4552 utils/adt/geo_ops.c:4567 -#: utils/adt/geo_ops.c:4573 +#: utils/adt/json.c:1764 utils/adt/jsonb_util.c:1958 #, c-format -msgid "invalid input syntax for type circle: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo circle: \"%s\"" +msgid "duplicate JSON object key value" +msgstr "" -#: utils/adt/geo_ops.c:4595 utils/adt/geo_ops.c:4603 +#: utils/adt/jsonb.c:294 #, c-format -msgid "could not format \"circle\" value" -msgstr "não pôde formatar valor de \"circle\"" +msgid "string too long to represent as jsonb string" +msgstr "cadeia de caracteres muito longa para representar uma cadeia de caracteres jsonb" -#: utils/adt/geo_ops.c:4630 +#: utils/adt/jsonb.c:295 #, c-format -msgid "invalid radius in external \"circle\" value" -msgstr "raio é inválido no valor de \"circle\" externo" +msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." +msgstr "Devido a uma restrição de implementação, cadeias de caracteres jsonb não podem exceder %d bytes." -#: utils/adt/geo_ops.c:5151 +#: utils/adt/jsonb.c:1252 #, c-format -msgid "cannot convert circle with radius zero to polygon" -msgstr "não pode converter círculo com raio zero para polígono" +msgid "argument %d: key must not be null" +msgstr "argumento %d: a chave não deve ser nula" -#: utils/adt/geo_ops.c:5156 +#: utils/adt/jsonb.c:1843 #, c-format -msgid "must request at least 2 points" -msgstr "deve informar pelo menos 2 pontos" +msgid "field name must not be null" +msgstr "nome do campo não deve ser nulo" -#: utils/adt/geo_ops.c:5200 +#: utils/adt/jsonb.c:1905 #, c-format -msgid "cannot convert empty polygon to circle" -msgstr "não pode converter polígono vazio para círculo" +msgid "object keys must be strings" +msgstr "chaves de objeto devem ser cadeias de caracteres" -#: utils/adt/int.c:162 +#: utils/adt/jsonb.c:2116 #, c-format -msgid "int2vector has too many elements" -msgstr "int2vector tem muitos elementos" +msgid "cannot cast jsonb null to type %s" +msgstr "não é possível converter jsonb nulo para o tipo de dados %s" -#: utils/adt/int.c:237 +#: utils/adt/jsonb.c:2117 #, c-format -msgid "invalid int2vector data" -msgstr "dado int2vector é inválido" +msgid "cannot cast jsonb string to type %s" +msgstr "não é possível converter a cadeia de caracteres jsonb para o tipo de dados %s" -#: utils/adt/int.c:243 utils/adt/oid.c:212 utils/adt/oid.c:293 +#: utils/adt/jsonb.c:2118 #, c-format -msgid "oidvector has too many elements" -msgstr "oidvector tem muitos elementos" +msgid "cannot cast jsonb numeric to type %s" +msgstr "não é possível converter o jsonb numérico para o tipo de dados %s" -#: utils/adt/int.c:1362 utils/adt/int8.c:1460 utils/adt/timestamp.c:5229 -#: utils/adt/timestamp.c:5310 +#: utils/adt/jsonb.c:2119 #, c-format -msgid "step size cannot equal zero" -msgstr "tamanho do passo não pode ser zero" +msgid "cannot cast jsonb boolean to type %s" +msgstr "não é possível converter jsonb booleano para o tipo de dados %s" -#: utils/adt/int8.c:98 utils/adt/int8.c:133 utils/adt/numutils.c:51 -#: utils/adt/numutils.c:61 utils/adt/numutils.c:103 +#: utils/adt/jsonb.c:2120 #, c-format -msgid "invalid input syntax for integer: \"%s\"" -msgstr "sintaxe de entrada é inválida para integer: \"%s\"" +msgid "cannot cast jsonb array to type %s" +msgstr "não é possível converter a matriz jsonb para o tipo de dados %s" -#: utils/adt/int8.c:114 +#: utils/adt/jsonb.c:2121 #, c-format -msgid "value \"%s\" is out of range for type bigint" -msgstr "valor \"%s\" está fora do intervalo para tipo bigint" +msgid "cannot cast jsonb object to type %s" +msgstr "não é possível converter o objeto jsonb para o tipo de dados %s" -#: utils/adt/int8.c:500 utils/adt/int8.c:529 utils/adt/int8.c:550 -#: utils/adt/int8.c:581 utils/adt/int8.c:615 utils/adt/int8.c:640 -#: utils/adt/int8.c:697 utils/adt/int8.c:714 utils/adt/int8.c:741 -#: utils/adt/int8.c:758 utils/adt/int8.c:834 utils/adt/int8.c:855 -#: utils/adt/int8.c:882 utils/adt/int8.c:915 utils/adt/int8.c:943 -#: utils/adt/int8.c:964 utils/adt/int8.c:991 utils/adt/int8.c:1031 -#: utils/adt/int8.c:1052 utils/adt/int8.c:1079 utils/adt/int8.c:1112 -#: utils/adt/int8.c:1140 utils/adt/int8.c:1161 utils/adt/int8.c:1188 -#: utils/adt/int8.c:1361 utils/adt/int8.c:1400 utils/adt/numeric.c:2356 -#: utils/adt/varbit.c:1645 +#: utils/adt/jsonb.c:2122 #, c-format -msgid "bigint out of range" -msgstr "bigint fora do intervalo" +msgid "cannot cast jsonb array or object to type %s" +msgstr "não é possível converter a matriz ou objeto jsonb para o tipo de dados %s" -#: utils/adt/int8.c:1417 +#: utils/adt/jsonb_util.c:758 #, c-format -msgid "OID out of range" -msgstr "OID fora do intervalo" +msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" +msgstr "número de pares de objeto jsonb excede o máximo permitido (%zu)" -#: utils/adt/json.c:726 utils/adt/json.c:766 utils/adt/json.c:781 -#: utils/adt/json.c:792 utils/adt/json.c:802 utils/adt/json.c:838 -#: utils/adt/json.c:850 utils/adt/json.c:881 utils/adt/json.c:899 -#: utils/adt/json.c:911 utils/adt/json.c:923 utils/adt/json.c:1062 -#: utils/adt/json.c:1076 utils/adt/json.c:1087 utils/adt/json.c:1095 -#: utils/adt/json.c:1103 utils/adt/json.c:1111 utils/adt/json.c:1119 -#: utils/adt/json.c:1127 utils/adt/json.c:1135 utils/adt/json.c:1143 -#: utils/adt/json.c:1173 +#: utils/adt/jsonb_util.c:799 #, c-format -msgid "invalid input syntax for type json" -msgstr "sintaxe de entrada é inválida para tipo json" +msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" +msgstr "número de elementos da matriz jsonb excede o máximo permitido (%zu)" -#: utils/adt/json.c:727 +#: utils/adt/jsonb_util.c:1673 utils/adt/jsonb_util.c:1693 #, c-format -msgid "Character with value 0x%02x must be escaped." -msgstr "Caracter com valor 0x%02x deve ser precedido por um caracter de escape." +msgid "total size of jsonb array elements exceeds the maximum of %d bytes" +msgstr "o tamanho total dos elementos da matriz jsonb excede o máximo de %d bytes" -#: utils/adt/json.c:767 +#: utils/adt/jsonb_util.c:1754 utils/adt/jsonb_util.c:1789 +#: utils/adt/jsonb_util.c:1809 #, c-format -msgid "\"\\u\" must be followed by four hexadecimal digits." -msgstr "\"\\u\" deve ser seguido por quatro dígitos hexadecimais." +msgid "total size of jsonb object elements exceeds the maximum of %d bytes" +msgstr "o tamanho total dos elementos do objeto jsonb excede o máximo de %d bytes" -#: utils/adt/json.c:782 +#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 #, c-format -msgid "Unicode high surrogate must not follow a high surrogate." -msgstr "Uma substituição alta Unicode não deve seguir uma substituição alta." +msgid "jsonb subscript does not support slices" +msgstr "O índice jsonb não dá suporte a fatias" -#: utils/adt/json.c:793 utils/adt/json.c:803 utils/adt/json.c:851 -#: utils/adt/json.c:912 utils/adt/json.c:924 +#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 #, c-format -msgid "Unicode low surrogate must follow a high surrogate." -msgstr "Uma substituição baixa deve seguir uma substituição alta." +msgid "subscript type %s is not supported" +msgstr "o tipo de índice %s não tem suporte" -#: utils/adt/json.c:839 +#: utils/adt/jsonbsubs.c:104 #, c-format -msgid "Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8." -msgstr "Valores de escape Unicode não podem ser utilizados para valores de ponto de código acima de 007F quando a codificação do servidor não for UTF8." +msgid "jsonb subscript must be coercible to only one type, integer or text." +msgstr "" -#: utils/adt/json.c:882 utils/adt/json.c:900 +#: utils/adt/jsonbsubs.c:118 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "Sequência de escape \"\\%s\" é inválida." +msgid "jsonb subscript must be coercible to either integer or text." +msgstr "" -#: utils/adt/json.c:1063 +#: utils/adt/jsonbsubs.c:139 #, c-format -msgid "The input string ended unexpectedly." -msgstr "A cadeia de caracteres de entrada terminou inesperadamente." +msgid "jsonb subscript must have text type" +msgstr "o índice jsonb deve ser do tipo texto" -#: utils/adt/json.c:1077 +#: utils/adt/jsonbsubs.c:207 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "Fim da entrada esperado, encontrado \"%s\"." +msgid "jsonb subscript in assignment must not be null" +msgstr "o índice jsonb numa atribuição não deve ser nulo" -#: utils/adt/json.c:1088 +#: utils/adt/jsonfuncs.c:572 utils/adt/jsonfuncs.c:821 +#: utils/adt/jsonfuncs.c:2429 utils/adt/jsonfuncs.c:2881 +#: utils/adt/jsonfuncs.c:3676 utils/adt/jsonfuncs.c:4018 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "Valor JSON esperado, encontrado \"%s\"." +msgid "cannot call %s on a scalar" +msgstr "não é possível chamar %s para um escalar" -#: utils/adt/json.c:1096 utils/adt/json.c:1144 +#: utils/adt/jsonfuncs.c:577 utils/adt/jsonfuncs.c:806 +#: utils/adt/jsonfuncs.c:2883 utils/adt/jsonfuncs.c:3663 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "Cadeia de caracteres esperada, encontrado \"%s\"." +msgid "cannot call %s on an array" +msgstr "não é possível chamar %s usando uma matriz" -#: utils/adt/json.c:1104 +#: utils/adt/jsonfuncs.c:713 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "Elemento da matriz ou \"]\" esperado, encontrado \"%s\"." +msgid "JSON data, line %d: %s%s%s" +msgstr "dado JSON, linha %d: %s%s%s" -#: utils/adt/json.c:1112 +#: utils/adt/jsonfuncs.c:1875 utils/adt/jsonfuncs.c:1912 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "\",\" ou \"]\" esperado, encontrado \"%s\"." +msgid "cannot get array length of a scalar" +msgstr "não é possível obter o tamanho da matriz de um escalar" -#: utils/adt/json.c:1120 +#: utils/adt/jsonfuncs.c:1879 utils/adt/jsonfuncs.c:1898 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "Cadeia de caracteres ou \"}\" esperado, encontrado \"%s\"." +msgid "cannot get array length of a non-array" +msgstr "não é possível obter o tamanho da matriz daquilo que não é uma matriz" -#: utils/adt/json.c:1128 +#: utils/adt/jsonfuncs.c:1978 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "\":\" esperado, encontrado \"%s\"." +msgid "cannot call %s on a non-object" +msgstr "não é possível chamar %s usando algo que não é um objeto" -#: utils/adt/json.c:1136 +#: utils/adt/jsonfuncs.c:2166 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "\",\" ou \"}\" esperado, encontrado \"%s\"." +msgid "cannot deconstruct an array as an object" +msgstr "não é possível desconstruir uma matriz como um objeto" -#: utils/adt/json.c:1174 +#: utils/adt/jsonfuncs.c:2180 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "Elemento \"%s\" é inválida." +msgid "cannot deconstruct a scalar" +msgstr "não é possível desconstruir um escalar" -#: utils/adt/json.c:1246 +#: utils/adt/jsonfuncs.c:2225 #, c-format -msgid "JSON data, line %d: %s%s%s" -msgstr "dado JSON, linha %d: %s%s%s" +msgid "cannot extract elements from a scalar" +msgstr "não é possível extrair elementos de um escalar" -#: utils/adt/json.c:1389 +#: utils/adt/jsonfuncs.c:2229 #, c-format -msgid "key value must be scalar, not array, composite, or json" -msgstr "valor da chave deve ser escalar, não uma matriz, composto ou json" +msgid "cannot extract elements from an object" +msgstr "não é possível extrair elementos de um objeto" -#: utils/adt/json.c:1432 +#: utils/adt/jsonfuncs.c:2414 utils/adt/jsonfuncs.c:3896 #, c-format -msgid "JSON does not support infinite date values." -msgstr "JSON não suporta valores infinitos de date." +msgid "cannot call %s on a non-array" +msgstr "não é possível chamar %s usando algo que não é uma matriz" -#: utils/adt/json.c:1457 utils/adt/json.c:1484 +#: utils/adt/jsonfuncs.c:2488 utils/adt/jsonfuncs.c:2493 +#: utils/adt/jsonfuncs.c:2510 utils/adt/jsonfuncs.c:2516 #, c-format -msgid "JSON does not support infinite timestamp values." -msgstr "JSON não suporta valores infinitos de timestamp." +msgid "expected JSON array" +msgstr "esperada uma matriz JSON" -#: utils/adt/json.c:1951 utils/adt/json.c:1969 utils/adt/json.c:2063 -#: utils/adt/json.c:2084 utils/adt/json.c:2143 +#: utils/adt/jsonfuncs.c:2489 #, c-format -msgid "could not determine data type for argument %d" -msgstr "não pôde determinar o tipo de dado do argumento %d" +msgid "See the value of key \"%s\"." +msgstr "Veja o valor da chave \"%s\"." -#: utils/adt/json.c:1956 +#: utils/adt/jsonfuncs.c:2511 #, c-format -msgid "field name must not be null" -msgstr "nome do campo não deve ser nulo" +msgid "See the array element %s of key \"%s\"." +msgstr "Veja o elemento da matriz %s da chave \"%s\"." -#: utils/adt/json.c:2038 +#: utils/adt/jsonfuncs.c:2517 #, c-format -msgid "argument list must have even number of elements" -msgstr "lista de argumentos deve ter número par de elementos" +msgid "See the array element %s." +msgstr "Veja o elemento da matriz %s." + +#: utils/adt/jsonfuncs.c:2552 +#, c-format +msgid "malformed JSON array" +msgstr "matriz JSON malformada" -#: utils/adt/json.c:2039 +#. translator: %s is a function name, eg json_to_record +#: utils/adt/jsonfuncs.c:3389 #, c-format -msgid "The arguments of json_build_object() must consist of alternating keys and values." -msgstr "Os argumentos do json_build_object() devem consistir de chaves e valores alternados." +msgid "first argument of %s must be a row type" +msgstr "primeiro argumento de %s deve ser um tipo row" -#: utils/adt/json.c:2069 +#. translator: %s is a function name, eg json_to_record +#: utils/adt/jsonfuncs.c:3413 #, c-format -msgid "argument %d cannot be null" -msgstr "argumento %d não pode ser nulo" +msgid "could not determine row type for result of %s" +msgstr "não foi possível determinar o tipo de linha para o resultado de %s" -#: utils/adt/json.c:2070 +#: utils/adt/jsonfuncs.c:3415 #, c-format -msgid "Object keys should be text." -msgstr "Chaves de objeto deveriam ser texto." +msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." +msgstr "Forneça um argumento de registro não nulo, ou chame a função na cláusula FROM usando uma lista de definição de coluna." -#: utils/adt/json.c:2205 +#: utils/adt/jsonfuncs.c:3785 utils/fmgr/funcapi.c:94 #, c-format -msgid "array must have two columns" -msgstr "matriz deve ter duas colunas" +msgid "materialize mode required, but it is not allowed in this context" +msgstr "modo de materialização requerido, mas não é permitido nesse contexto" -#: utils/adt/json.c:2229 utils/adt/json.c:2313 +#: utils/adt/jsonfuncs.c:3913 utils/adt/jsonfuncs.c:3997 #, c-format -msgid "null value not allowed for object key" -msgstr "valor nulo não é permitido em chave de objeto" +msgid "argument of %s must be an array of objects" +msgstr "argumento de %s deve ser uma matriz de objetos" -#: utils/adt/json.c:2302 +#: utils/adt/jsonfuncs.c:3946 #, c-format -msgid "mismatched array dimensions" -msgstr "dimensões de matrizes não correspondem" +msgid "cannot call %s on an object" +msgstr "não é possível chamar %s usando um objeto" + +#: utils/adt/jsonfuncs.c:4380 utils/adt/jsonfuncs.c:4439 +#: utils/adt/jsonfuncs.c:4519 +#, c-format +msgid "cannot delete from scalar" +msgstr "não é possível excluir de escalar" + +#: utils/adt/jsonfuncs.c:4524 +#, c-format +msgid "cannot delete from object using integer index" +msgstr "não é possível excluir de objeto usando índice inteiro" + +#: utils/adt/jsonfuncs.c:4592 utils/adt/jsonfuncs.c:4751 +#, c-format +msgid "cannot set path in scalar" +msgstr "não é possível definir o caminho de um escalar" + +#: utils/adt/jsonfuncs.c:4633 utils/adt/jsonfuncs.c:4675 +#, c-format +msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" +msgstr "" + +#: utils/adt/jsonfuncs.c:4646 +#, c-format +msgid "JSON value must not be null" +msgstr "O valor JSON não deve ser nulo" + +#: utils/adt/jsonfuncs.c:4647 +#, c-format +msgid "Exception was raised because null_value_treatment is \"raise_exception\"." +msgstr "" + +#: utils/adt/jsonfuncs.c:4648 +#, c-format +msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." +msgstr "" + +#: utils/adt/jsonfuncs.c:4703 +#, c-format +msgid "cannot delete path in scalar" +msgstr "não é possível excluir o caminho de um escalar" + +#: utils/adt/jsonfuncs.c:4917 +#, c-format +msgid "path element at position %d is null" +msgstr "" + +#: utils/adt/jsonfuncs.c:4936 utils/adt/jsonfuncs.c:4967 +#: utils/adt/jsonfuncs.c:5040 +#, c-format +msgid "cannot replace existing key" +msgstr "não é possível substituir a chave existente" + +#: utils/adt/jsonfuncs.c:4937 utils/adt/jsonfuncs.c:4968 +#, c-format +msgid "The path assumes key is a composite object, but it is a scalar value." +msgstr "" + +#: utils/adt/jsonfuncs.c:5041 +#, c-format +msgid "Try using the function jsonb_set to replace key value." +msgstr "" + +#: utils/adt/jsonfuncs.c:5145 +#, c-format +msgid "path element at position %d is not an integer: \"%s\"" +msgstr "o elemento do caminho na posição %d não é um número inteiro: \"%s\"" + +#: utils/adt/jsonfuncs.c:5162 +#, c-format +msgid "path element at position %d is out of range: %d" +msgstr "o elemento do caminho na posição %d está fora do intervalo: %d" + +#: utils/adt/jsonfuncs.c:5314 +#, c-format +msgid "wrong flag type, only arrays and scalars are allowed" +msgstr "" + +#: utils/adt/jsonfuncs.c:5321 +#, c-format +msgid "flag array element is not a string" +msgstr "o sinalizador do elemento da matriz não é uma cadeia de caracteres" + +#: utils/adt/jsonfuncs.c:5322 utils/adt/jsonfuncs.c:5344 +#, c-format +msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." +msgstr "" + +#: utils/adt/jsonfuncs.c:5342 +#, c-format +msgid "wrong flag in flag array: \"%s\"" +msgstr "" + +#: utils/adt/jsonpath.c:382 +#, c-format +msgid "@ is not allowed in root expressions" +msgstr "não é permitido @ em expressões raiz" + +#: utils/adt/jsonpath.c:388 +#, c-format +msgid "LAST is allowed only in array subscripts" +msgstr "LAST é permitido apenas em índices de matriz" + +#: utils/adt/jsonpath_exec.c:361 +#, c-format +msgid "single boolean result is expected" +msgstr "" + +#: utils/adt/jsonpath_exec.c:557 +#, c-format +msgid "\"vars\" argument is not an object" +msgstr "" + +#: utils/adt/jsonpath_exec.c:558 +#, c-format +msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +msgstr "" + +#: utils/adt/jsonpath_exec.c:675 +#, c-format +msgid "JSON object does not contain key \"%s\"" +msgstr "" + +#: utils/adt/jsonpath_exec.c:687 +#, c-format +msgid "jsonpath member accessor can only be applied to an object" +msgstr "acessador de membro jsonpath só pode ser aplicado a um objeto" + +#: utils/adt/jsonpath_exec.c:716 +#, c-format +msgid "jsonpath wildcard array accessor can only be applied to an array" +msgstr "" + +#: utils/adt/jsonpath_exec.c:764 +#, c-format +msgid "jsonpath array subscript is out of bounds" +msgstr "O índice da matriz jsonpath está fora dos limites" -#: utils/adt/jsonb.c:202 +#: utils/adt/jsonpath_exec.c:821 #, c-format -msgid "string too long to represent as jsonb string" -msgstr "cadeia de caracteres muito longa para representar uma cadeia de caracteres jsonb" +msgid "jsonpath array accessor can only be applied to an array" +msgstr "" -#: utils/adt/jsonb.c:203 +#: utils/adt/jsonpath_exec.c:873 #, c-format -msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." -msgstr "Devido a uma restrição de implementação, cadeias de caracteres jsonb não podem exceder %d bytes." +msgid "jsonpath wildcard member accessor can only be applied to an object" +msgstr "o acessador de membro curinga jsonpath só pode ser aplicado a um objeto" -#: utils/adt/jsonb_util.c:622 +#: utils/adt/jsonpath_exec.c:1007 #, c-format -msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" -msgstr "número de pares de objeto jsonb excede o máximo permitido (%zu)" +msgid "jsonpath item method .%s() can only be applied to an array" +msgstr "" -#: utils/adt/jsonb_util.c:663 +#: utils/adt/jsonpath_exec.c:1060 #, c-format -msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" -msgstr "número de elementos da matriz jsonb excede o máximo permitido (%zu)" +msgid "numeric argument of jsonpath item method .%s() is out of range for type double precision" +msgstr "o argumento numérico do método de item jsonpath .%s() está fora do intervalo para o tipo de dados de precisão dupla" -#: utils/adt/jsonb_util.c:1490 utils/adt/jsonb_util.c:1510 +#: utils/adt/jsonpath_exec.c:1081 #, c-format -msgid "total size of jsonb array elements exceeds the maximum of %u bytes" -msgstr "tamanho total de elementos da matriz jsonb excede o máximo de %u bytes" +msgid "string argument of jsonpath item method .%s() is not a valid representation of a double precision number" +msgstr "" -#: utils/adt/jsonb_util.c:1571 utils/adt/jsonb_util.c:1606 -#: utils/adt/jsonb_util.c:1626 +#: utils/adt/jsonpath_exec.c:1094 #, c-format -msgid "total size of jsonb object elements exceeds the maximum of %u bytes" -msgstr "tamanho total de elementos do objeto jsonb excede o máximo de %u bytes" +msgid "jsonpath item method .%s() can only be applied to a string or numeric value" +msgstr "" -#: utils/adt/jsonfuncs.c:263 utils/adt/jsonfuncs.c:428 -#: utils/adt/jsonfuncs.c:1968 utils/adt/jsonfuncs.c:2405 -#: utils/adt/jsonfuncs.c:2911 +#: utils/adt/jsonpath_exec.c:1584 #, c-format -msgid "cannot call %s on a scalar" -msgstr "não pode chamar %s em um escalar" +msgid "left operand of jsonpath operator %s is not a single numeric value" +msgstr "" -#: utils/adt/jsonfuncs.c:268 utils/adt/jsonfuncs.c:415 -#: utils/adt/jsonfuncs.c:2394 +#: utils/adt/jsonpath_exec.c:1591 #, c-format -msgid "cannot call %s on an array" -msgstr "não pode chamar %s utilizando uma matriz" +msgid "right operand of jsonpath operator %s is not a single numeric value" +msgstr "" -#: utils/adt/jsonfuncs.c:1276 utils/adt/jsonfuncs.c:1311 +#: utils/adt/jsonpath_exec.c:1659 #, c-format -msgid "cannot get array length of a scalar" -msgstr "não pode obter tamanho de matriz de um escalar" +msgid "operand of unary jsonpath operator %s is not a numeric value" +msgstr "" -#: utils/adt/jsonfuncs.c:1280 utils/adt/jsonfuncs.c:1299 +#: utils/adt/jsonpath_exec.c:1758 #, c-format -msgid "cannot get array length of a non-array" -msgstr "não pode obter tamanho de matriz daquilo que não é uma matriz" +msgid "jsonpath item method .%s() can only be applied to a numeric value" +msgstr "" -#: utils/adt/jsonfuncs.c:1376 +#: utils/adt/jsonpath_exec.c:1798 #, c-format -msgid "cannot call %s on a non-object" -msgstr "não pode chamar %s utilizando algo que não é um objeto" +msgid "jsonpath item method .%s() can only be applied to a string" +msgstr "" -#: utils/adt/jsonfuncs.c:1394 utils/adt/jsonfuncs.c:2081 -#: utils/adt/jsonfuncs.c:2614 +#: utils/adt/jsonpath_exec.c:1901 #, c-format -msgid "function returning record called in context that cannot accept type record" -msgstr "função que retorna record foi chamada em um contexto que não pode aceitar tipo record" +msgid "datetime format is not recognized: \"%s\"" +msgstr "formato de data e hora não reconhecido: \"%s\"" -#: utils/adt/jsonfuncs.c:1637 +#: utils/adt/jsonpath_exec.c:1903 #, c-format -msgid "cannot deconstruct an array as an object" -msgstr "não pode desconstruir uma matriz como um objeto" +msgid "Use a datetime template argument to specify the input data format." +msgstr "" -#: utils/adt/jsonfuncs.c:1649 +#: utils/adt/jsonpath_exec.c:1971 #, c-format -msgid "cannot deconstruct a scalar" -msgstr "não pode desconstruir um escalar" +msgid "jsonpath item method .%s() can only be applied to an object" +msgstr "método de item jsonpath .%s() só pode ser aplicado a um objeto" -#: utils/adt/jsonfuncs.c:1695 +#: utils/adt/jsonpath_exec.c:2153 #, c-format -msgid "cannot extract elements from a scalar" -msgstr "não pode extrair elementos de um escalar" +msgid "could not find jsonpath variable \"%s\"" +msgstr "não foi possível encontrar a variável jsonpath \"%s\"" -#: utils/adt/jsonfuncs.c:1699 +#: utils/adt/jsonpath_exec.c:2417 #, c-format -msgid "cannot extract elements from an object" -msgstr "não pode extrair elementos de um objeto" +msgid "jsonpath array subscript is not a single numeric value" +msgstr "" -#: utils/adt/jsonfuncs.c:1955 utils/adt/jsonfuncs.c:2710 +#: utils/adt/jsonpath_exec.c:2429 #, c-format -msgid "cannot call %s on a non-array" -msgstr "não pode chamar %s utilizando algo que não é uma matriz" +msgid "jsonpath array subscript is out of integer range" +msgstr "O índice da matriz jsonpath está fora do intervalo de números inteiros" -#: utils/adt/jsonfuncs.c:2042 utils/adt/jsonfuncs.c:2590 +#: utils/adt/jsonpath_exec.c:2606 #, c-format -msgid "first argument of %s must be a row type" -msgstr "primeiro argumento de %s deve ser um tipo row" +msgid "cannot convert value from %s to %s without time zone usage" +msgstr "" -#: utils/adt/jsonfuncs.c:2083 +#: utils/adt/jsonpath_exec.c:2608 #, c-format -msgid "Try calling the function in the FROM clause using a column definition list." -msgstr "Tente chamar a função na cláusula FROM utilizando uma lista de definição de colunas." +msgid "Use *_tz() function for time zone support." +msgstr "" -#: utils/adt/jsonfuncs.c:2726 utils/adt/jsonfuncs.c:2893 +#: utils/adt/levenshtein.c:132 #, c-format -msgid "argument of %s must be an array of objects" -msgstr "argumento de %s deve ser uma matriz de objetos" +msgid "levenshtein argument exceeds maximum length of %d characters" +msgstr "" -#: utils/adt/jsonfuncs.c:2750 +#: utils/adt/like.c:161 #, c-format -msgid "cannot call %s on an object" -msgstr "não pode chamar %s utilizando um objeto" +msgid "nondeterministic collations are not supported for LIKE" +msgstr "ordenações não determinísticas não têm suporte para LIKE" -#: utils/adt/like.c:211 utils/adt/selfuncs.c:5220 +#: utils/adt/like.c:190 utils/adt/like_support.c:1024 #, c-format msgid "could not determine which collation to use for ILIKE" -msgstr "não pôde determinar qual ordenação utilizar para ILIKE" +msgstr "não foi possível determinar qual ordenação utilizar para ILIKE" + +#: utils/adt/like.c:202 +#, c-format +msgid "nondeterministic collations are not supported for ILIKE" +msgstr "ordenações não determinísticas não têm suporte para ILIKE" -#: utils/adt/like_match.c:104 utils/adt/like_match.c:164 +#: utils/adt/like_match.c:108 utils/adt/like_match.c:168 #, c-format msgid "LIKE pattern must not end with escape character" -msgstr "padrão de LIKE não deve terminar com caracter escape" +msgstr "o padrão do LIKE não deve terminar com caractere de escape" -#: utils/adt/like_match.c:289 utils/adt/regexp.c:694 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:801 #, c-format msgid "invalid escape string" msgstr "cadeia de caracteres de escape é inválida" -#: utils/adt/like_match.c:290 utils/adt/regexp.c:695 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:802 #, c-format msgid "Escape string must be empty or one character." -msgstr "Cadeia de caracteres de escape deve ser vazia ou ter um caracter." - -#: utils/adt/mac.c:65 -#, c-format -msgid "invalid input syntax for type macaddr: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo macaddr: \"%s\"" - -#: utils/adt/mac.c:72 -#, c-format -msgid "invalid octet value in \"macaddr\" value: \"%s\"" -msgstr "valor de octeto é inválido no valor de \"macaddr\": \"%s\"" - -#: utils/adt/misc.c:111 -#, c-format -msgid "PID %d is not a PostgreSQL server process" -msgstr "PID %d não é um processo servidor do PostgreSQL" +msgstr "A cadeia de caracteres de escape deve ser vazia ou ter um caractere." -#: utils/adt/misc.c:154 +#: utils/adt/like_support.c:1014 #, c-format -msgid "must be superuser or have the same role to cancel queries running in other server processes" -msgstr "deve ser super-usuário ou ter a mesma role para cancelar consultas executando em outros processos servidor" +msgid "case insensitive matching not supported on type bytea" +msgstr "correspondência não sensível a maiúsculas/minúsculas não tem suporte pelo tipo bytea" -#: utils/adt/misc.c:171 +#: utils/adt/like_support.c:1115 #, c-format -msgid "must be superuser or have the same role to terminate other server processes" -msgstr "deve ser super-usuário ou ter a mesma role para terminar outros processos servidor" +msgid "regular-expression matching not supported on type bytea" +msgstr "correspondência de expressão regular não tem suporte pelo tipo bytea" -#: utils/adt/misc.c:185 +#: utils/adt/mac.c:102 #, c-format -msgid "must be superuser to signal the postmaster" -msgstr "deve ser super-usuário para sinalizar o postmaster" +msgid "invalid octet value in \"macaddr\" value: \"%s\"" +msgstr "valor de octeto é inválido no valor de \"macaddr\": \"%s\"" -#: utils/adt/misc.c:190 +#: utils/adt/mac8.c:554 #, c-format -msgid "failed to send signal to postmaster: %m" -msgstr "falhou ao enviar sinal para postmaster: %m" +msgid "macaddr8 data out of range to convert to macaddr" +msgstr "" -#: utils/adt/misc.c:207 +#: utils/adt/mac8.c:555 #, c-format -msgid "must be superuser to rotate log files" -msgstr "deve ser super-usuário para rotacionar arquivos de log" +msgid "Only addresses that have FF and FE as values in the 4th and 5th bytes from the left, for example xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted from macaddr8 to macaddr." +msgstr "" -#: utils/adt/misc.c:212 +#: utils/adt/mcxtfuncs.c:182 #, c-format -msgid "rotation not possible because log collection not active" -msgstr "rotação não é possível porque coleta de log não está ativa" +msgid "PID %d is not a PostgreSQL server process" +msgstr "PID %d não é um processo servidor do PostgreSQL" -#: utils/adt/misc.c:249 +#: utils/adt/misc.c:237 #, c-format msgid "global tablespace never has databases" -msgstr "tablespace global nunca teve bancos de dados" +msgstr "o espaço de tabelas global nunca teve bancos de dados" -#: utils/adt/misc.c:270 +#: utils/adt/misc.c:259 #, c-format msgid "%u is not a tablespace OID" -msgstr "%u não é um OID de tablespace" +msgstr "%u não é um OID de espaço de tabelas" -#: utils/adt/misc.c:465 +#: utils/adt/misc.c:454 msgid "unreserved" msgstr "sem reserva" -#: utils/adt/misc.c:469 +#: utils/adt/misc.c:458 msgid "unreserved (cannot be function or type name)" msgstr "sem reserva (não pode ser nome de função ou tipo)" -#: utils/adt/misc.c:473 +#: utils/adt/misc.c:462 msgid "reserved (can be function or type name)" msgstr "reservado (pode ser nome de função ou tipo)" -#: utils/adt/misc.c:477 +#: utils/adt/misc.c:466 msgid "reserved" msgstr "reservado" -#: utils/adt/nabstime.c:136 +#: utils/adt/misc.c:477 +msgid "can be bare label" +msgstr "pode ser um róttulo simples" + +#: utils/adt/misc.c:482 +msgid "requires AS" +msgstr "requer AS" + +#: utils/adt/misc.c:853 utils/adt/misc.c:867 utils/adt/misc.c:906 +#: utils/adt/misc.c:912 utils/adt/misc.c:918 utils/adt/misc.c:941 +#, c-format +msgid "string is not a valid identifier: \"%s\"" +msgstr "a cadeia de caracteres não é um identificador válido: \"%s\"" + +#: utils/adt/misc.c:855 +#, c-format +msgid "String has unclosed double quotes." +msgstr "A cadeia de caracteres tem aspas não fechadas." + +#: utils/adt/misc.c:869 +#, c-format +msgid "Quoted identifier must not be empty." +msgstr "Identificador delimitado não deve estar vazio." + +#: utils/adt/misc.c:908 +#, c-format +msgid "No valid identifier before \".\"." +msgstr "Nenhum identificador válido antes do \".\"." + +#: utils/adt/misc.c:914 +#, c-format +msgid "No valid identifier after \".\"." +msgstr "Nenhum identificador válido após o \".\"." + +#: utils/adt/misc.c:974 +#, c-format +msgid "log format \"%s\" is not supported" +msgstr "o formato de registro (log) \"%s\" não tem suporte" + +#: utils/adt/misc.c:975 +#, c-format +msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." +msgstr "Os formatos de registro (log) com suporte são \"stderr\", \"csvlog\", and \"jsonlog\"." + +#: utils/adt/multirangetypes.c:151 utils/adt/multirangetypes.c:164 +#: utils/adt/multirangetypes.c:193 utils/adt/multirangetypes.c:267 +#: utils/adt/multirangetypes.c:291 #, c-format -msgid "invalid time zone name: \"%s\"" -msgstr "nome de zona horária é inválido: \"%s\"" +msgid "malformed multirange literal: \"%s\"" +msgstr "literal multi-intervalo malformado: \"%s\"" -#: utils/adt/nabstime.c:481 utils/adt/nabstime.c:554 +#: utils/adt/multirangetypes.c:153 #, c-format -msgid "cannot convert abstime \"invalid\" to timestamp" -msgstr "não pode converter abstime \"invalid\" para timestamp" +msgid "Missing left brace." +msgstr "Falta a chave esquerda." -#: utils/adt/nabstime.c:781 +#: utils/adt/multirangetypes.c:195 #, c-format -msgid "invalid status in external \"tinterval\" value" -msgstr "status é inválido no valor de \"tinterval\" externo" +msgid "Expected range start." +msgstr "Esperado Início de intervalo." -#: utils/adt/nabstime.c:855 +#: utils/adt/multirangetypes.c:269 #, c-format -msgid "cannot convert reltime \"invalid\" to interval" -msgstr "não pode converter reltime \"invalid\" em interval" +msgid "Expected comma or end of multirange." +msgstr "Esperado vírgula ou fim do multi-intervalo." -#: utils/adt/nabstime.c:1550 +#: utils/adt/multirangetypes.c:982 #, c-format -msgid "invalid input syntax for type tinterval: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo tinterval: \"%s\"" +msgid "multiranges cannot be constructed from multidimensional arrays" +msgstr "" + +#: utils/adt/multirangetypes.c:1008 +#, c-format +msgid "multirange values cannot contain null members" +msgstr "valores multi-intervalo não podem conter membros nulos" -#: utils/adt/network.c:69 +#: utils/adt/network.c:110 #, c-format msgid "invalid cidr value: \"%s\"" msgstr "valor de cidr é inválido: \"%s\"" -#: utils/adt/network.c:70 utils/adt/network.c:200 +#: utils/adt/network.c:111 utils/adt/network.c:241 #, c-format msgid "Value has bits set to right of mask." msgstr "Valor tem bits definidos a direita da máscara." -#: utils/adt/network.c:111 utils/adt/network.c:580 utils/adt/network.c:605 -#: utils/adt/network.c:630 +#: utils/adt/network.c:152 utils/adt/network.c:1184 utils/adt/network.c:1209 +#: utils/adt/network.c:1234 #, c-format msgid "could not format inet value: %m" -msgstr "não pôde formatar valor de inet: %m" +msgstr "não foi possível formatar valor de inet: %m" #. translator: %s is inet or cidr -#: utils/adt/network.c:168 +#: utils/adt/network.c:209 #, c-format msgid "invalid address family in external \"%s\" value" msgstr "família de endereços é inválida no valor de \"%s\" externo" #. translator: %s is inet or cidr -#: utils/adt/network.c:175 +#: utils/adt/network.c:216 #, c-format msgid "invalid bits in external \"%s\" value" msgstr "bits são inválidos no valor de \"%s\" externo" #. translator: %s is inet or cidr -#: utils/adt/network.c:184 +#: utils/adt/network.c:225 #, c-format msgid "invalid length in external \"%s\" value" msgstr "tamanho é inválido no valor de \"%s\" externo" -#: utils/adt/network.c:199 +#: utils/adt/network.c:240 #, c-format msgid "invalid external \"cidr\" value" msgstr "valor de \"cidr\" externo é inválido" -#: utils/adt/network.c:321 utils/adt/network.c:348 +#: utils/adt/network.c:336 utils/adt/network.c:359 #, c-format msgid "invalid mask length: %d" msgstr "tamanho de máscara é inválido: %d" -#: utils/adt/network.c:648 +#: utils/adt/network.c:1252 #, c-format msgid "could not format cidr value: %m" -msgstr "não pôde formatar valor de cidr: %m" +msgstr "não foi possível formatar valor de cidr: %m" + +#: utils/adt/network.c:1485 +#, c-format +msgid "cannot merge addresses from different families" +msgstr "não é possível mesclar endereços de famílias diferentes" -#: utils/adt/network.c:1264 +#: utils/adt/network.c:1893 #, c-format msgid "cannot AND inet values of different sizes" -msgstr "não pode executar E em valores inet de tamanhos diferentes" +msgstr "não é possível executar AND em valores inet de tamanhos diferentes" -#: utils/adt/network.c:1296 +#: utils/adt/network.c:1925 #, c-format msgid "cannot OR inet values of different sizes" -msgstr "não pode executar OU em valores inet de tamanhos diferentes" +msgstr "não é possível executar OR em valores inet de tamanhos diferentes" -#: utils/adt/network.c:1357 utils/adt/network.c:1433 +#: utils/adt/network.c:1986 utils/adt/network.c:2062 #, c-format msgid "result is out of range" msgstr "resultado está fora do intervalo" -#: utils/adt/network.c:1398 +#: utils/adt/network.c:2027 #, c-format msgid "cannot subtract inet values of different sizes" -msgstr "não pode subtrair valores inet de tamanhos diferentes" - -#: utils/adt/numeric.c:485 utils/adt/numeric.c:512 utils/adt/numeric.c:3704 -#: utils/adt/numeric.c:3727 utils/adt/numeric.c:3751 utils/adt/numeric.c:3758 -#, c-format -msgid "invalid input syntax for type numeric: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo numeric: \"%s\"" +msgstr "não é possível subtrair valores inet de tamanhos diferentes" -#: utils/adt/numeric.c:702 +#: utils/adt/numeric.c:785 utils/adt/numeric.c:3643 utils/adt/numeric.c:7131 +#: utils/adt/numeric.c:7334 utils/adt/numeric.c:7806 utils/adt/numeric.c:10501 +#: utils/adt/numeric.c:10975 utils/adt/numeric.c:11069 +#: utils/adt/numeric.c:11203 #, c-format -msgid "invalid length in external \"numeric\" value" -msgstr "tamanho é inválido no valor de \"numeric\" externo" +msgid "value overflows numeric format" +msgstr "valor excede formato numeric" -#: utils/adt/numeric.c:715 +#: utils/adt/numeric.c:1098 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "sinal é inválido no valor de \"numeric\" externo" -#: utils/adt/numeric.c:721 +#: utils/adt/numeric.c:1104 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "escala é inválida no valor de \"numeric\" externo" -#: utils/adt/numeric.c:730 +#: utils/adt/numeric.c:1113 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "dígito é inválido no valor de \"numeric\" externo" -#: utils/adt/numeric.c:921 utils/adt/numeric.c:935 +#: utils/adt/numeric.c:1328 utils/adt/numeric.c:1342 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "precisão do NUMERIC %d deve ser entre 1 e %d" -#: utils/adt/numeric.c:926 +#: utils/adt/numeric.c:1333 #, c-format -msgid "NUMERIC scale %d must be between 0 and precision %d" -msgstr "escala do NUMERIC %d deve ser entre 0 e precisão %d" +msgid "NUMERIC scale %d must be between %d and %d" +msgstr "a escala NUMERIC %d deve estar entre %d e %d" -#: utils/adt/numeric.c:944 +#: utils/adt/numeric.c:1351 #, c-format msgid "invalid NUMERIC type modifier" msgstr "modificador de tipo NUMERIC é inválido" -#: utils/adt/numeric.c:1951 utils/adt/numeric.c:4201 utils/adt/numeric.c:6170 +#: utils/adt/numeric.c:1709 #, c-format -msgid "value overflows numeric format" -msgstr "valor excede formato numeric" +msgid "start value cannot be NaN" +msgstr "o valor de início não pode ser NaN" -#: utils/adt/numeric.c:2282 +#: utils/adt/numeric.c:1713 #, c-format -msgid "cannot convert NaN to integer" -msgstr "não pode converter NaN para inteiro" +msgid "start value cannot be infinity" +msgstr "o valor de início não pode ser infinito" -#: utils/adt/numeric.c:2348 +#: utils/adt/numeric.c:1720 #, c-format -msgid "cannot convert NaN to bigint" -msgstr "não pode converter NaN para bigint" +msgid "stop value cannot be NaN" +msgstr "o valor de parada não pode ser NaN" -#: utils/adt/numeric.c:2393 +#: utils/adt/numeric.c:1724 #, c-format -msgid "cannot convert NaN to smallint" -msgstr "não pode converter NaN para smallint" +msgid "stop value cannot be infinity" +msgstr "o valor de parada não pode ser infinito" -#: utils/adt/numeric.c:4271 +#: utils/adt/numeric.c:1737 #, c-format -msgid "numeric field overflow" -msgstr "estouro de campo numeric" +msgid "step size cannot be NaN" +msgstr "o tamanho do passo não pode ser NaN" -#: utils/adt/numeric.c:4272 +#: utils/adt/numeric.c:1741 #, c-format -msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." -msgstr "Um campo com precisão %d, escala %d deve arredondar para um valor absoluto menor do que %s%d." +msgid "step size cannot be infinity" +msgstr "o tamanho do passo não pode ser infinito" + +#: utils/adt/numeric.c:3633 +#, c-format +msgid "factorial of a negative number is undefined" +msgstr "o fatorial de um número negativo é indefinido" -#: utils/adt/numeric.c:5727 +#: utils/adt/numeric.c:4366 utils/adt/numeric.c:4446 utils/adt/numeric.c:4487 +#: utils/adt/numeric.c:4683 #, c-format -msgid "argument for function \"exp\" too big" -msgstr "argumento para função \"exp\" é muito grande" +msgid "cannot convert NaN to %s" +msgstr "não é possível converter NaN em %s" -#: utils/adt/numutils.c:75 +#: utils/adt/numeric.c:4370 utils/adt/numeric.c:4450 utils/adt/numeric.c:4491 +#: utils/adt/numeric.c:4687 #, c-format -msgid "value \"%s\" is out of range for type integer" -msgstr "valor \"%s\" está fora do intervalo para tipo integer" +msgid "cannot convert infinity to %s" +msgstr "não é possível converter infinito em %s" -#: utils/adt/numutils.c:81 +#: utils/adt/numeric.c:4696 #, c-format -msgid "value \"%s\" is out of range for type smallint" -msgstr "valor \"%s\" está fora do intervalo para tipo smallint" +msgid "pg_lsn out of range" +msgstr "pg_lsn fora do intervalo" -#: utils/adt/numutils.c:87 +#: utils/adt/numeric.c:7896 utils/adt/numeric.c:7947 #, c-format -msgid "value \"%s\" is out of range for 8-bit integer" -msgstr "valor \"%s\" está fora do intervalo para inteiro de 8 bits" +msgid "numeric field overflow" +msgstr "estouro de campo numeric" -#: utils/adt/oid.c:43 utils/adt/oid.c:57 utils/adt/oid.c:63 utils/adt/oid.c:84 +#: utils/adt/numeric.c:7897 #, c-format -msgid "invalid input syntax for type oid: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo oid: \"%s\"" +msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." +msgstr "Um campo com precisão %d, escala %d deve arredondar para um valor absoluto menor do que %s%d." -#: utils/adt/oid.c:69 utils/adt/oid.c:107 +#: utils/adt/numeric.c:7948 #, c-format -msgid "value \"%s\" is out of range for type oid" -msgstr "valor \"%s\" está fora do intervalo para tipo oid" +msgid "A field with precision %d, scale %d cannot hold an infinite value." +msgstr "Um campo com precisão %d, escala %d não pode conter um valor infinito." -#: utils/adt/oid.c:287 +#: utils/adt/oid.c:216 #, c-format msgid "invalid oidvector data" msgstr "dado oidvector é inválido" -#: utils/adt/oracle_compat.c:895 +#: utils/adt/oracle_compat.c:976 #, c-format msgid "requested character too large" msgstr "tamanho solicitado é muito grande" -#: utils/adt/oracle_compat.c:945 utils/adt/oracle_compat.c:1007 +#: utils/adt/oracle_compat.c:1020 #, c-format -msgid "requested character too large for encoding: %d" -msgstr "caracter solicitado é muito grande para codificação: %d" +msgid "character number must be positive" +msgstr "o número do caractere deve ser positivo" -#: utils/adt/oracle_compat.c:986 +#: utils/adt/oracle_compat.c:1024 #, c-format -msgid "requested character not valid for encoding: %d" -msgstr "caracter solicitado não é válido para codificação: %d" +msgid "null character not permitted" +msgstr "o caractere nulo não é permitido" -#: utils/adt/oracle_compat.c:1000 +#: utils/adt/oracle_compat.c:1042 utils/adt/oracle_compat.c:1095 #, c-format -msgid "null character not permitted" -msgstr "caracter nulo não é permitido" +msgid "requested character too large for encoding: %u" +msgstr "o caractere requisitado é muito grande para codificação: %u" + +#: utils/adt/oracle_compat.c:1083 +#, c-format +msgid "requested character not valid for encoding: %u" +msgstr "o caractere requisitado não é válido para codificação: %u" -#: utils/adt/orderedsetaggs.c:423 utils/adt/orderedsetaggs.c:528 -#: utils/adt/orderedsetaggs.c:667 +#: utils/adt/orderedsetaggs.c:448 utils/adt/orderedsetaggs.c:553 +#: utils/adt/orderedsetaggs.c:693 #, c-format msgid "percentile value %g is not between 0 and 1" msgstr "valor percentual %g não está entre 0 e 1" -#: utils/adt/pg_locale.c:1039 +#: utils/adt/pg_locale.c:1410 +#, c-format +msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" +msgstr "não foi possível abrir o ordenador para a localidade \"%s\" com as regras \"%s\": %s" + +#: utils/adt/pg_locale.c:1421 utils/adt/pg_locale.c:2831 +#: utils/adt/pg_locale.c:2904 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU não é suportado por essa construção" + +#: utils/adt/pg_locale.c:1450 #, c-format msgid "could not create locale \"%s\": %m" -msgstr "não pôde criar configuração regional \"%s\": %m" +msgstr "não foi possível criar configuração regional \"%s\": %m" -#: utils/adt/pg_locale.c:1042 +#: utils/adt/pg_locale.c:1453 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "O sistema operacional não encontrou nenhum dado sobre a configuração regional para nome de configuração regional \"%s\"." -#: utils/adt/pg_locale.c:1129 +#: utils/adt/pg_locale.c:1568 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "ordenações com diferentes valores de collate e ctype não são suportadas nesta plataforma" -#: utils/adt/pg_locale.c:1144 +#: utils/adt/pg_locale.c:1577 #, c-format -msgid "nondefault collations are not supported on this platform" -msgstr "ordenações não-padrão não são suportados nesta plataforma" +msgid "collation provider LIBC is not supported on this platform" +msgstr "o provedor de ordenação LIBC não é compatível com essa plataforma" -#: utils/adt/pg_locale.c:1315 +#: utils/adt/pg_locale.c:1618 #, c-format -msgid "invalid multibyte character for locale" -msgstr "caracter multibyte é inválido para configuração regional" +msgid "collation \"%s\" has no actual version, but a version was recorded" +msgstr "a ordenação \"%s\" não tem versão atual, mas uma versão foi registrada" -#: utils/adt/pg_locale.c:1316 +#: utils/adt/pg_locale.c:1624 #, c-format -msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." -msgstr "A configuração regional LC_TYPE do servidor é provavelmente incompatível com a codificação de banco de dados." +msgid "collation \"%s\" has version mismatch" +msgstr "a ordenação \"%s\" tem uma falta de correspondência de versão" -#: utils/adt/pg_lsn.c:44 utils/adt/pg_lsn.c:49 +#: utils/adt/pg_locale.c:1626 #, c-format -msgid "invalid input syntax for type pg_lsn: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo pg_lsn: \"%s\"" +msgid "The collation in the database was created using version %s, but the operating system provides version %s." +msgstr "" + +#: utils/adt/pg_locale.c:1629 +#, c-format +msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." +msgstr "" -#: utils/adt/pseudotypes.c:95 +#: utils/adt/pg_locale.c:1695 #, c-format -msgid "cannot accept a value of type any" -msgstr "não pode aceitar um valor do tipo any" +msgid "could not load locale \"%s\"" +msgstr "não foi possível carregar a localidade \"%s\"" -#: utils/adt/pseudotypes.c:108 +#: utils/adt/pg_locale.c:1720 #, c-format -msgid "cannot display a value of type any" -msgstr "não pode mostrar um valor do tipo any" +msgid "could not get collation version for locale \"%s\": error code %lu" +msgstr "não foi possível obter a versão da ordenação para a localidade \"%s\": código de erro %lu" -#: utils/adt/pseudotypes.c:122 utils/adt/pseudotypes.c:150 +#: utils/adt/pg_locale.c:1776 utils/adt/pg_locale.c:1789 #, c-format -msgid "cannot accept a value of type anyarray" -msgstr "não pode aceitar um valor do tipo anyarray" +msgid "could not convert string to UTF-16: error code %lu" +msgstr "não foi possível converter cadeia de caracteres para UTF-16: código de erro %lu" -#: utils/adt/pseudotypes.c:175 +#: utils/adt/pg_locale.c:1803 #, c-format -msgid "cannot accept a value of type anyenum" -msgstr "não pode aceitar um valor do tipo anyenum" +msgid "could not compare Unicode strings: %m" +msgstr "não foi possível comparar cadeias de caracteres Unicode: %m" -#: utils/adt/pseudotypes.c:199 +#: utils/adt/pg_locale.c:1984 #, c-format -msgid "cannot accept a value of type anyrange" -msgstr "não pode aceitar um valor do tipo anyrange" +msgid "collation failed: %s" +msgstr "falha na ordenação: %s" -#: utils/adt/pseudotypes.c:276 +#: utils/adt/pg_locale.c:2205 utils/adt/pg_locale.c:2237 #, c-format -msgid "cannot accept a value of type trigger" -msgstr "não pode aceitar um valor do tipo trigger" +msgid "sort key generation failed: %s" +msgstr "falha na geração da chave de classificação: %s" -#: utils/adt/pseudotypes.c:289 +#: utils/adt/pg_locale.c:2474 #, c-format -msgid "cannot display a value of type trigger" -msgstr "não pode mostrar um valor do tipo trigger" +msgid "could not get language from locale \"%s\": %s" +msgstr "não foi possível obter o idioma da localidade \"%s\": %s" -#: utils/adt/pseudotypes.c:303 +#: utils/adt/pg_locale.c:2495 utils/adt/pg_locale.c:2511 #, c-format -msgid "cannot accept a value of type event_trigger" -msgstr "não pode aceitar um valor do tipo event_trigger" +msgid "could not open collator for locale \"%s\": %s" +msgstr "não foi possível abrir a ordenação para a localidade \"%s\": %s" -#: utils/adt/pseudotypes.c:316 +#: utils/adt/pg_locale.c:2536 #, c-format -msgid "cannot display a value of type event_trigger" -msgstr "não pode mostrar um valor do tipo event_trigger" +msgid "encoding \"%s\" not supported by ICU" +msgstr "a codificação \"%s\" não tem suporte pelo ICU" -#: utils/adt/pseudotypes.c:330 +#: utils/adt/pg_locale.c:2543 #, c-format -msgid "cannot accept a value of type language_handler" -msgstr "não pode aceitar um valor do tipo language_handler" +msgid "could not open ICU converter for encoding \"%s\": %s" +msgstr "não foi possível abrir o conversor ICU para codificação \"%s\": %s" -#: utils/adt/pseudotypes.c:343 +#: utils/adt/pg_locale.c:2561 utils/adt/pg_locale.c:2580 +#: utils/adt/pg_locale.c:2636 utils/adt/pg_locale.c:2647 #, c-format -msgid "cannot display a value of type language_handler" -msgstr "não pode mostrar um valor do tipo language_handler" +msgid "%s failed: %s" +msgstr "%s falhou: %s" -#: utils/adt/pseudotypes.c:357 +#: utils/adt/pg_locale.c:2822 #, c-format -msgid "cannot accept a value of type fdw_handler" -msgstr "não pode aceitar um valor do tipo fdw_handler" +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "não foi possível converter o nome da localidade \"%s\" para a etiqueta de idioma: %s" -#: utils/adt/pseudotypes.c:370 +#: utils/adt/pg_locale.c:2863 #, c-format -msgid "cannot display a value of type fdw_handler" -msgstr "não pode mostrar um valor do tipo fdw_handler" +msgid "could not get language from ICU locale \"%s\": %s" +msgstr "não foi possível obter o idioma da localidade da ICU \"%s\": %s" -#: utils/adt/pseudotypes.c:384 +#: utils/adt/pg_locale.c:2865 utils/adt/pg_locale.c:2894 #, c-format -msgid "cannot accept a value of type internal" -msgstr "não pode aceitar um valor do tipo interval" +msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." +msgstr "" -#: utils/adt/pseudotypes.c:397 +#: utils/adt/pg_locale.c:2892 #, c-format -msgid "cannot display a value of type internal" -msgstr "não pode mostrar um valor do tipo interval" +msgid "ICU locale \"%s\" has unknown language \"%s\"" +msgstr "" -#: utils/adt/pseudotypes.c:411 +#: utils/adt/pg_locale.c:3073 #, c-format -msgid "cannot accept a value of type opaque" -msgstr "não pode aceitar um valor do tipo opaque" +msgid "invalid multibyte character for locale" +msgstr "caractere multibyte inválido para localidade" -#: utils/adt/pseudotypes.c:424 +#: utils/adt/pg_locale.c:3074 #, c-format -msgid "cannot display a value of type opaque" -msgstr "não pode mostrar um valor do tipo opaque" +msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." +msgstr "A configuração regional LC_TYPE do servidor é provavelmente incompatível com a codificação de banco de dados." -#: utils/adt/pseudotypes.c:438 +#: utils/adt/pg_lsn.c:263 #, c-format -msgid "cannot accept a value of type anyelement" -msgstr "não pode aceitar um valor do tipo anyelement" +msgid "cannot add NaN to pg_lsn" +msgstr "não é possível adicionar NaN a pg_lsn" -#: utils/adt/pseudotypes.c:451 +#: utils/adt/pg_lsn.c:297 #, c-format -msgid "cannot display a value of type anyelement" -msgstr "não pode mostrar um valor do tipo anyelement" +msgid "cannot subtract NaN from pg_lsn" +msgstr "não é possível subtrair NaN de pg_lsn" -#: utils/adt/pseudotypes.c:464 +#: utils/adt/pg_upgrade_support.c:29 #, c-format -msgid "cannot accept a value of type anynonarray" -msgstr "não pode aceitar um valor do tipo anynonarray" +msgid "function can only be called when server is in binary upgrade mode" +msgstr "a função só pode ser chamada quando o servidor está no modo de atualização binária" -#: utils/adt/pseudotypes.c:477 +#: utils/adt/pgstatfuncs.c:254 #, c-format -msgid "cannot display a value of type anynonarray" -msgstr "não pode mostrar um valor do tipo anynonarray" +msgid "invalid command name: \"%s\"" +msgstr "nome de comando inválido: \"%s\"" -#: utils/adt/pseudotypes.c:490 +#: utils/adt/pgstatfuncs.c:1774 #, c-format -msgid "cannot accept a value of a shell type" -msgstr "não pode aceitar um valor do tipo shell" +msgid "unrecognized reset target: \"%s\"" +msgstr "alvo de reinício desconhecido: \"%s\"" -#: utils/adt/pseudotypes.c:503 +#: utils/adt/pgstatfuncs.c:1775 #, c-format -msgid "cannot display a value of a shell type" -msgstr "não pode mostrar um valor do tipo shell" +msgid "Target must be \"archiver\", \"bgwriter\", \"io\", \"recovery_prefetch\", or \"wal\"." +msgstr "O destino deve ser \"archiver\", \"bgwriter\", \"io\", \"recovery_prefetch\", ou \"wal\"." + +#: utils/adt/pgstatfuncs.c:1857 +#, c-format +msgid "invalid subscription OID %u" +msgstr "OID de subscrição inválido %u" + +#: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 +#, c-format +msgid "cannot display a value of type %s" +msgstr "não é possível mostrar um valor do tipo de dados %s" + +#: utils/adt/pseudotypes.c:310 +#, c-format +msgid "cannot accept a value of a shell type" +msgstr "não é possível aceitar um valor do tipo shell" -#: utils/adt/pseudotypes.c:525 utils/adt/pseudotypes.c:549 +#: utils/adt/pseudotypes.c:320 #, c-format -msgid "cannot accept a value of type pg_node_tree" -msgstr "não pode aceitar um valor do tipo pg_node_tree" +msgid "cannot display a value of a shell type" +msgstr "não é possível mostrar um valor do tipo shell" -#: utils/adt/rangetypes.c:396 +#: utils/adt/rangetypes.c:415 #, c-format msgid "range constructor flags argument must not be null" msgstr "argumento de marcadores do construtor de range não deve ser NULL" -#: utils/adt/rangetypes.c:983 +#: utils/adt/rangetypes.c:1014 #, c-format msgid "result of range difference would not be contiguous" msgstr "resultado da diferença de range não seria contíguo" -#: utils/adt/rangetypes.c:1044 +#: utils/adt/rangetypes.c:1075 #, c-format msgid "result of range union would not be contiguous" msgstr "resultado da união de range não seria contíguo" -#: utils/adt/rangetypes.c:1502 +#: utils/adt/rangetypes.c:1750 #, c-format msgid "range lower bound must be less than or equal to range upper bound" msgstr "limite inferior do range deve ser menor ou igual a limite superior do range" -#: utils/adt/rangetypes.c:1885 utils/adt/rangetypes.c:1898 -#: utils/adt/rangetypes.c:1912 +#: utils/adt/rangetypes.c:2197 utils/adt/rangetypes.c:2210 +#: utils/adt/rangetypes.c:2224 #, c-format msgid "invalid range bound flags" msgstr "marcações de limite do range são inválidas" -#: utils/adt/rangetypes.c:1886 utils/adt/rangetypes.c:1899 -#: utils/adt/rangetypes.c:1913 +#: utils/adt/rangetypes.c:2198 utils/adt/rangetypes.c:2211 +#: utils/adt/rangetypes.c:2225 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "Valores válidos são \"[]\", \"[)\", \"(]\" e \"()\"." -#: utils/adt/rangetypes.c:1978 utils/adt/rangetypes.c:1995 -#: utils/adt/rangetypes.c:2008 utils/adt/rangetypes.c:2026 -#: utils/adt/rangetypes.c:2037 utils/adt/rangetypes.c:2081 -#: utils/adt/rangetypes.c:2089 +#: utils/adt/rangetypes.c:2293 utils/adt/rangetypes.c:2310 +#: utils/adt/rangetypes.c:2325 utils/adt/rangetypes.c:2345 +#: utils/adt/rangetypes.c:2356 utils/adt/rangetypes.c:2403 +#: utils/adt/rangetypes.c:2411 #, c-format msgid "malformed range literal: \"%s\"" msgstr "range mal formado: \"%s\"" -#: utils/adt/rangetypes.c:1980 +#: utils/adt/rangetypes.c:2295 #, c-format msgid "Junk after \"empty\" key word." msgstr "Lixo após palavra-chave \"empty\"." -#: utils/adt/rangetypes.c:1997 +#: utils/adt/rangetypes.c:2312 #, c-format msgid "Missing left parenthesis or bracket." msgstr "Faltando parêntese esquerdo ou colchete." -#: utils/adt/rangetypes.c:2010 +#: utils/adt/rangetypes.c:2327 #, c-format msgid "Missing comma after lower bound." msgstr "Faltando vírgula depois de limite inferior." -#: utils/adt/rangetypes.c:2028 +#: utils/adt/rangetypes.c:2347 #, c-format msgid "Too many commas." msgstr "Muitas vírgulas." -#: utils/adt/rangetypes.c:2039 +#: utils/adt/rangetypes.c:2358 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "Lixo após parêntese ou colchete direito." -#: utils/adt/regexp.c:285 utils/adt/regexp.c:1234 utils/adt/varlena.c:3042 +#: utils/adt/regexp.c:305 utils/adt/regexp.c:1997 utils/adt/varlena.c:4270 #, c-format msgid "regular expression failed: %s" msgstr "expressão regular falhou: %s" -#: utils/adt/regexp.c:422 +#: utils/adt/regexp.c:446 utils/adt/regexp.c:681 +#, c-format +msgid "invalid regular expression option: \"%.*s\"" +msgstr "opção de expressão regular inválida: \"%.*s\"" + +#: utils/adt/regexp.c:683 +#, c-format +msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." +msgstr "" + +#: utils/adt/regexp.c:717 utils/adt/regexp.c:726 utils/adt/regexp.c:1083 +#: utils/adt/regexp.c:1147 utils/adt/regexp.c:1156 utils/adt/regexp.c:1165 +#: utils/adt/regexp.c:1174 utils/adt/regexp.c:1854 utils/adt/regexp.c:1863 +#: utils/adt/regexp.c:1872 utils/misc/guc.c:6627 utils/misc/guc.c:6661 +#, c-format +msgid "invalid value for parameter \"%s\": %d" +msgstr "valor é inválido para parâmetro \"%s\": %d" + +#: utils/adt/regexp.c:937 #, c-format -msgid "invalid regexp option: \"%c\"" -msgstr "opção da expressão regular é inválida: \"%c\"" +msgid "SQL regular expression may not contain more than two escape-double-quote separators" +msgstr "" + +#. translator: %s is a SQL function name +#: utils/adt/regexp.c:1094 utils/adt/regexp.c:1185 utils/adt/regexp.c:1272 +#: utils/adt/regexp.c:1311 utils/adt/regexp.c:1699 utils/adt/regexp.c:1754 +#: utils/adt/regexp.c:1883 +#, c-format +msgid "%s does not support the \"global\" option" +msgstr "%s não dá suporte a a opção \"global\"" + +#: utils/adt/regexp.c:1313 +#, c-format +msgid "Use the regexp_matches function instead." +msgstr "" -#: utils/adt/regexp.c:894 +#: utils/adt/regexp.c:1501 #, c-format -msgid "regexp_split does not support the global option" -msgstr "regexp_split não suporta a opção global" +msgid "too many regular expression matches" +msgstr "excesso de correspondências de expressões regulares" -#: utils/adt/regproc.c:127 utils/adt/regproc.c:147 +#: utils/adt/regproc.c:104 #, c-format msgid "more than one function named \"%s\"" msgstr "mais de uma função com nome \"%s\"" -#: utils/adt/regproc.c:551 utils/adt/regproc.c:571 +#: utils/adt/regproc.c:513 #, c-format msgid "more than one operator named %s" msgstr "mais de um operador com nome %s" -#: utils/adt/regproc.c:743 utils/adt/regproc.c:784 utils/adt/regproc.c:1702 -#: utils/adt/ruleutils.c:7626 utils/adt/ruleutils.c:7749 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2009 utils/adt/ruleutils.c:10020 +#: utils/adt/ruleutils.c:10233 #, c-format msgid "too many arguments" msgstr "muitos argumentos" -#: utils/adt/regproc.c:744 utils/adt/regproc.c:785 +#: utils/adt/regproc.c:676 #, c-format msgid "Provide two argument types for operator." msgstr "Forneça dois tipos de argumento para operador." -#: utils/adt/regproc.c:1537 utils/adt/regproc.c:1542 utils/adt/varlena.c:2313 -#: utils/adt/varlena.c:2318 +#: utils/adt/regproc.c:1544 utils/adt/regproc.c:1661 utils/adt/regproc.c:1790 +#: utils/adt/regproc.c:1795 utils/adt/varlena.c:3410 utils/adt/varlena.c:3415 #, c-format msgid "invalid name syntax" msgstr "sintaxe de nome é inválida" -#: utils/adt/regproc.c:1600 +#: utils/adt/regproc.c:1904 #, c-format msgid "expected a left parenthesis" msgstr "parêntese esquerdo esperado" -#: utils/adt/regproc.c:1616 +#: utils/adt/regproc.c:1922 #, c-format msgid "expected a right parenthesis" msgstr "parêntese direito esperado" -#: utils/adt/regproc.c:1635 +#: utils/adt/regproc.c:1941 #, c-format msgid "expected a type name" msgstr "nome de tipo esperado" -#: utils/adt/regproc.c:1667 +#: utils/adt/regproc.c:1973 #, c-format msgid "improper type name" msgstr "nome de tipo inválido" -#: utils/adt/ri_triggers.c:339 utils/adt/ri_triggers.c:2474 -#: utils/adt/ri_triggers.c:3227 +#: utils/adt/ri_triggers.c:306 utils/adt/ri_triggers.c:1625 +#: utils/adt/ri_triggers.c:2610 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "inserção ou atualização em tabela \"%s\" viola restrição de chave estrangeira \"%s\"" -#: utils/adt/ri_triggers.c:342 utils/adt/ri_triggers.c:2477 +#: utils/adt/ri_triggers.c:309 utils/adt/ri_triggers.c:1628 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MATCH FULL não permite mistura de valores de chaves nulas e não-nulas." -#: utils/adt/ri_triggers.c:2716 +#: utils/adt/ri_triggers.c:2045 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "função \"%s\" deve ser disparada pelo INSERT" -#: utils/adt/ri_triggers.c:2722 +#: utils/adt/ri_triggers.c:2051 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "função \"%s\" deve ser disparada pelo UPDATE" -#: utils/adt/ri_triggers.c:2728 +#: utils/adt/ri_triggers.c:2057 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "função \"%s\" deve ser disparada pelo DELETE" -#: utils/adt/ri_triggers.c:2751 +#: utils/adt/ri_triggers.c:2080 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "nenhuma entrada em pg_constraint para gatilho \"%s\" na tabela \"%s\"" -#: utils/adt/ri_triggers.c:2753 +#: utils/adt/ri_triggers.c:2082 #, c-format msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." msgstr "Remova este gatilho de integridade referencial e seus pares, então faça ALTER TABLE ADD CONSTRAINT." -#: utils/adt/ri_triggers.c:3177 +#: utils/adt/ri_triggers.c:2435 #, c-format msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" msgstr "consulta de integridade referencial em \"%s\" da retrição \"%s\" em \"%s\" retornou resultado inesperado" -#: utils/adt/ri_triggers.c:3181 +#: utils/adt/ri_triggers.c:2439 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "Isso provavelmente foi causado por uma regra que reescreveu a consulta." -#: utils/adt/ri_triggers.c:3230 +#: utils/adt/ri_triggers.c:2600 +#, c-format +msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" +msgstr "remover a partição \"%s\" viola a restrição de chave estrangeira \"%s\"" + +#: utils/adt/ri_triggers.c:2603 utils/adt/ri_triggers.c:2628 +#, c-format +msgid "Key (%s)=(%s) is still referenced from table \"%s\"." +msgstr "Chave (%s)=(%s) ainda é referenciada pela tabela \"%s\"." + +#: utils/adt/ri_triggers.c:2614 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "Chave (%s)=(%s) não está presente na tabela \"%s\"." -#: utils/adt/ri_triggers.c:3237 +#: utils/adt/ri_triggers.c:2617 +#, c-format +msgid "Key is not present in table \"%s\"." +msgstr "A chave não está presente na tabela \"%s\"." + +#: utils/adt/ri_triggers.c:2623 #, c-format msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" msgstr "atualização ou exclusão em tabela \"%s\" viola restrição de chave estrangeira \"%s\" em \"%s\"" -#: utils/adt/ri_triggers.c:3241 +#: utils/adt/ri_triggers.c:2631 #, c-format -msgid "Key (%s)=(%s) is still referenced from table \"%s\"." -msgstr "Chave (%s)=(%s) ainda é referenciada pela tabela \"%s\"." +msgid "Key is still referenced from table \"%s\"." +msgstr "A chave ainda é referenciada pela tabela \"%s\"." -#: utils/adt/rowtypes.c:102 utils/adt/rowtypes.c:477 +#: utils/adt/rowtypes.c:106 utils/adt/rowtypes.c:510 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "entrada de tipos compostos anônimos não está implementada" -#: utils/adt/rowtypes.c:155 utils/adt/rowtypes.c:183 utils/adt/rowtypes.c:206 -#: utils/adt/rowtypes.c:214 utils/adt/rowtypes.c:266 utils/adt/rowtypes.c:274 +#: utils/adt/rowtypes.c:159 utils/adt/rowtypes.c:191 utils/adt/rowtypes.c:217 +#: utils/adt/rowtypes.c:228 utils/adt/rowtypes.c:286 utils/adt/rowtypes.c:297 #, c-format msgid "malformed record literal: \"%s\"" msgstr "matriz mal formada: \"%s\"" -#: utils/adt/rowtypes.c:156 +#: utils/adt/rowtypes.c:160 #, c-format msgid "Missing left parenthesis." msgstr "Faltando parêntese esquerdo." -#: utils/adt/rowtypes.c:184 +#: utils/adt/rowtypes.c:192 #, c-format msgid "Too few columns." msgstr "Poucas colunas." -#: utils/adt/rowtypes.c:267 +#: utils/adt/rowtypes.c:287 #, c-format msgid "Too many columns." msgstr "Muitas colunas." -#: utils/adt/rowtypes.c:275 +#: utils/adt/rowtypes.c:298 #, c-format msgid "Junk after right parenthesis." msgstr "Lixo após parêntese direito." -#: utils/adt/rowtypes.c:526 +#: utils/adt/rowtypes.c:559 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "número de colunas incorreto: %d, esperado %d" -#: utils/adt/rowtypes.c:553 +#: utils/adt/rowtypes.c:601 #, c-format -msgid "wrong data type: %u, expected %u" -msgstr "tipo de dado incorreto: %u, esperado %u" +msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" +msgstr "" -#: utils/adt/rowtypes.c:614 +#: utils/adt/rowtypes.c:668 #, c-format msgid "improper binary format in record column %d" msgstr "formato binário inválido na coluna %d do registro" -#: utils/adt/rowtypes.c:896 utils/adt/rowtypes.c:1134 -#: utils/adt/rowtypes.c:1388 utils/adt/rowtypes.c:1665 +#: utils/adt/rowtypes.c:959 utils/adt/rowtypes.c:1205 utils/adt/rowtypes.c:1463 +#: utils/adt/rowtypes.c:1709 #, c-format msgid "cannot compare dissimilar column types %s and %s at record column %d" -msgstr "não pode comparar tipos de colunas diferentes %s e %s em coluna %d de registro" +msgstr "não é possível comparar tipos de colunas diferentes %s e %s na coluna %d do registro" -#: utils/adt/rowtypes.c:985 utils/adt/rowtypes.c:1205 -#: utils/adt/rowtypes.c:1521 utils/adt/rowtypes.c:1761 +#: utils/adt/rowtypes.c:1050 utils/adt/rowtypes.c:1275 +#: utils/adt/rowtypes.c:1560 utils/adt/rowtypes.c:1745 #, c-format msgid "cannot compare record types with different numbers of columns" -msgstr "não pode comparar tipos record com quantidade diferente de colunas" +msgstr "não é possível comparar tipos record com quantidade diferente de colunas" -#: utils/adt/ruleutils.c:3999 +#: utils/adt/ruleutils.c:2694 #, c-format -msgid "rule \"%s\" has unsupported event type %d" -msgstr "regra \"%s\" tem tipo de evento %d que não é suportado" +msgid "input is a query, not an expression" +msgstr "a entrada é uma consulta, e não uma expressão" -#: utils/adt/selfuncs.c:5205 +#: utils/adt/ruleutils.c:2706 #, c-format -msgid "case insensitive matching not supported on type bytea" -msgstr "correspondência não sensível a maiúsculas/minúsculas não é suportada pelo tipo bytea" +msgid "expression contains variables of more than one relation" +msgstr "" -#: utils/adt/selfuncs.c:5308 +#: utils/adt/ruleutils.c:2713 #, c-format -msgid "regular-expression matching not supported on type bytea" -msgstr "correspondência de expressão regular não é suportada pelo tipo bytea" +msgid "expression contains variables" +msgstr "expressão contém variáveis" -#: utils/adt/tid.c:71 utils/adt/tid.c:79 utils/adt/tid.c:87 +#: utils/adt/ruleutils.c:5227 #, c-format -msgid "invalid input syntax for type tid: \"%s\"" -msgstr "sintaxe de entrada é inválida para tipo tid: \"%s\"" +msgid "rule \"%s\" has unsupported event type %d" +msgstr "regra \"%s\" tem tipo de evento %d que não é suportado" -#: utils/adt/timestamp.c:107 +#: utils/adt/timestamp.c:112 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "precisão do TIMESTAMP(%d)%s não deve ser negativa" -#: utils/adt/timestamp.c:113 +#: utils/adt/timestamp.c:118 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "precisão do TIMESTAMP(%d)%s reduzida ao máximo permitido, %d" -#: utils/adt/timestamp.c:178 utils/adt/timestamp.c:452 -#, c-format -msgid "timestamp out of range: \"%s\"" -msgstr "timestamp fora do intervalo: \"%s\"" - -#: utils/adt/timestamp.c:196 utils/adt/timestamp.c:470 -#: utils/adt/timestamp.c:925 -#, c-format -msgid "date/time value \"%s\" is no longer supported" -msgstr "valor de data/hora \"%s\" não é mais suportado" - -#: utils/adt/timestamp.c:266 -#, c-format -msgid "timestamp cannot be NaN" -msgstr "timestamp não pode ser NaN" - -#: utils/adt/timestamp.c:387 +#: utils/adt/timestamp.c:378 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "precisão do timestamp(%d) deve ser entre %d e %d" -#: utils/adt/timestamp.c:520 -#, c-format -msgid "invalid input syntax for numeric time zone: \"%s\"" -msgstr "sintaxe de entrada é inválida para zona horária numérica: \"%s\"" - -#: utils/adt/timestamp.c:522 +#: utils/adt/timestamp.c:496 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." -msgstr "Zonas horárias numéricas devem ter \"-\" ou \"+\" como primeiro caracter." +msgstr "Zonas horárias numéricas devem ter \"-\" ou \"+\" como primeiro caractere." -#: utils/adt/timestamp.c:535 +#: utils/adt/timestamp.c:508 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "zona horária númerica \"%s\" está fora do intervalo" -#: utils/adt/timestamp.c:638 utils/adt/timestamp.c:648 +#: utils/adt/timestamp.c:609 utils/adt/timestamp.c:619 +#: utils/adt/timestamp.c:627 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "timestamp fora do intervalo: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:919 utils/adt/timestamp.c:1490 -#: utils/adt/timestamp.c:1993 utils/adt/timestamp.c:3133 -#: utils/adt/timestamp.c:3138 utils/adt/timestamp.c:3143 -#: utils/adt/timestamp.c:3193 utils/adt/timestamp.c:3200 -#: utils/adt/timestamp.c:3207 utils/adt/timestamp.c:3227 -#: utils/adt/timestamp.c:3234 utils/adt/timestamp.c:3241 -#: utils/adt/timestamp.c:3270 utils/adt/timestamp.c:3277 -#: utils/adt/timestamp.c:3322 utils/adt/timestamp.c:3613 -#: utils/adt/timestamp.c:3742 utils/adt/timestamp.c:4133 +#: utils/adt/timestamp.c:728 +#, c-format +msgid "timestamp cannot be NaN" +msgstr "timestamp não pode ser NaN" + +#: utils/adt/timestamp.c:746 utils/adt/timestamp.c:758 +#, c-format +msgid "timestamp out of range: \"%g\"" +msgstr "carimbo de data/hora fora do intervalo: \"%g\"" + +#: utils/adt/timestamp.c:941 utils/adt/timestamp.c:1518 +#: utils/adt/timestamp.c:2708 utils/adt/timestamp.c:2778 +#: utils/adt/timestamp.c:2795 utils/adt/timestamp.c:2848 +#: utils/adt/timestamp.c:2887 utils/adt/timestamp.c:3184 +#: utils/adt/timestamp.c:3189 utils/adt/timestamp.c:3194 +#: utils/adt/timestamp.c:3244 utils/adt/timestamp.c:3251 +#: utils/adt/timestamp.c:3258 utils/adt/timestamp.c:3278 +#: utils/adt/timestamp.c:3285 utils/adt/timestamp.c:3292 +#: utils/adt/timestamp.c:3379 utils/adt/timestamp.c:3454 +#: utils/adt/timestamp.c:3823 utils/adt/timestamp.c:3947 +#: utils/adt/timestamp.c:4467 #, c-format msgid "interval out of range" msgstr "interval fora do intervalo" -#: utils/adt/timestamp.c:1060 utils/adt/timestamp.c:1093 +#: utils/adt/timestamp.c:1065 utils/adt/timestamp.c:1098 #, c-format msgid "invalid INTERVAL type modifier" msgstr "modificador do tipo INTERVAL é inválido" -#: utils/adt/timestamp.c:1076 +#: utils/adt/timestamp.c:1081 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "precisão de INTERVAL(%d) não deve ser negativa" -#: utils/adt/timestamp.c:1082 +#: utils/adt/timestamp.c:1087 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "precisão de INTERVAL(%d) reduzida ao máximo permitido, %d" -#: utils/adt/timestamp.c:1434 +#: utils/adt/timestamp.c:1473 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "precisão de interval(%d) deve ser entre %d e %d" -#: utils/adt/timestamp.c:2722 +#: utils/adt/timestamp.c:2703 #, c-format msgid "cannot subtract infinite timestamps" -msgstr "não pode subtrair timestamps infinitos" - -#: utils/adt/timestamp.c:3868 utils/adt/timestamp.c:4474 -#: utils/adt/timestamp.c:4514 -#, c-format -msgid "timestamp units \"%s\" not supported" -msgstr "unidades do timestamp \"%s\" não são suportadas" - -#: utils/adt/timestamp.c:3882 utils/adt/timestamp.c:4524 -#, c-format -msgid "timestamp units \"%s\" not recognized" -msgstr "unidades do timestamp \"%s\" são desconhecidas" - -#: utils/adt/timestamp.c:4022 utils/adt/timestamp.c:4685 -#: utils/adt/timestamp.c:4726 -#, c-format -msgid "timestamp with time zone units \"%s\" not supported" -msgstr "unidades de timestamp with time zone \"%s\" não são suportadas" +msgstr "não é possível subtrair carimbos de data/hora infinitos" -#: utils/adt/timestamp.c:4039 utils/adt/timestamp.c:4735 +#: utils/adt/timestamp.c:3983 utils/adt/timestamp.c:4166 #, c-format -msgid "timestamp with time zone units \"%s\" not recognized" -msgstr "unidades de timestamp with time zone \"%s\" são desconhecidas" +msgid "origin out of range" +msgstr "origem fora do intervalo" -#: utils/adt/timestamp.c:4120 +#: utils/adt/timestamp.c:3988 utils/adt/timestamp.c:4171 #, c-format -msgid "interval units \"%s\" not supported because months usually have fractional weeks" -msgstr "unidades de interval \"%s\" não são suportadas porque meses geralmente tem semanas fracionadas" - -#: utils/adt/timestamp.c:4126 utils/adt/timestamp.c:4841 -#, c-format -msgid "interval units \"%s\" not supported" -msgstr "unidades de interval \"%s\" não são suportadas" +msgid "timestamps cannot be binned into intervals containing months or years" +msgstr "" -#: utils/adt/timestamp.c:4142 utils/adt/timestamp.c:4868 +#: utils/adt/timestamp.c:3995 utils/adt/timestamp.c:4178 #, c-format -msgid "interval units \"%s\" not recognized" -msgstr "unidades de interval \"%s\" são desconhecidas" +msgid "stride must be greater than zero" +msgstr "o passo deve ser maior que zero" -#: utils/adt/timestamp.c:4951 utils/adt/timestamp.c:5135 +#: utils/adt/timestamp.c:4461 #, c-format -msgid "could not convert to time zone \"%s\"" -msgstr "não pôde converter para zona horária \"%s\"" +msgid "Months usually have fractional weeks." +msgstr "Os meses geralmente têm semanas fracionárias." #: utils/adt/trigfuncs.c:42 #, c-format @@ -18069,2856 +26045,3732 @@ msgstr "suppress_redundant_updates_trigger: deve ser chamado antes da atualizaç #: utils/adt/trigfuncs.c:60 #, c-format msgid "suppress_redundant_updates_trigger: must be called for each row" -msgstr "suppress_redundant_updates_trigger: deve ser chamado para cada registro" - -#: utils/adt/tsgistidx.c:98 -#, c-format -msgid "gtsvector_in not implemented" -msgstr "gtsvector_in não está implementado" +msgstr "suppress_redundant_updates_trigger: deve ser chamado para cada linha" -#: utils/adt/tsquery.c:154 utils/adt/tsquery.c:389 -#: utils/adt/tsvector_parser.c:133 +#: utils/adt/tsquery.c:210 utils/adt/tsquery_op.c:125 #, c-format -msgid "syntax error in tsquery: \"%s\"" -msgstr "erro de sintaxe em tsquery: \"%s\"" +msgid "distance in phrase operator must be an integer value between zero and %d inclusive" +msgstr "" -#: utils/adt/tsquery.c:175 +#: utils/adt/tsquery.c:344 #, c-format msgid "no operand in tsquery: \"%s\"" msgstr "nenhum operando em tsquery: \"%s\"" -#: utils/adt/tsquery.c:247 +#: utils/adt/tsquery.c:558 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "valor é muito grande em tsquery: \"%s\"" -#: utils/adt/tsquery.c:252 +#: utils/adt/tsquery.c:563 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "operando é muito longo em tsquery: \"%s\"" -#: utils/adt/tsquery.c:280 +#: utils/adt/tsquery.c:591 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "palavra é muito longa em tsquery: \"%s\"" -#: utils/adt/tsquery.c:509 +#: utils/adt/tsquery.c:717 utils/adt/tsvector_parser.c:147 +#, c-format +msgid "syntax error in tsquery: \"%s\"" +msgstr "erro de sintaxe em tsquery: \"%s\"" + +#: utils/adt/tsquery.c:883 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" -msgstr "consulta de busca textual não contém lexemas: \"%s\"" +msgstr "a consulta de procura de texto completo não contém lexemas: \"%s\"" -#: utils/adt/tsquery.c:520 utils/adt/tsquery_util.c:340 +#: utils/adt/tsquery.c:894 utils/adt/tsquery_util.c:376 #, c-format msgid "tsquery is too large" msgstr "tsquery é muito grande" -#: utils/adt/tsquery_cleanup.c:284 +#: utils/adt/tsquery_cleanup.c:409 #, c-format msgid "text-search query contains only stop words or doesn't contain lexemes, ignored" -msgstr "consulta de busca textual contém somente palavras ignoradas ou não contém lexemas, ignorada" +msgstr "a consulta de procura de texto completo contém somente palavras ignoradas ou não contém lexemas, ignorada" -#: utils/adt/tsquery_rewrite.c:293 +#: utils/adt/tsquery_rewrite.c:321 #, c-format msgid "ts_rewrite query must return two tsquery columns" msgstr "consulta ts_rewrite deve retornar duas colunas tsquery" -#: utils/adt/tsrank.c:403 +#: utils/adt/tsrank.c:412 #, c-format msgid "array of weight must be one-dimensional" msgstr "matriz de pesos devem ser de uma dimensão" -#: utils/adt/tsrank.c:408 +#: utils/adt/tsrank.c:417 #, c-format msgid "array of weight is too short" msgstr "matriz de pesos é muito pequena" -#: utils/adt/tsrank.c:413 +#: utils/adt/tsrank.c:422 #, c-format msgid "array of weight must not contain nulls" msgstr "matriz de pesos não deve conter valores nulos" -#: utils/adt/tsrank.c:422 utils/adt/tsrank.c:749 +#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:871 #, c-format msgid "weight out of range" msgstr "peso fora do intervalo" -#: utils/adt/tsvector.c:213 +#: utils/adt/tsvector.c:217 #, c-format msgid "word is too long (%ld bytes, max %ld bytes)" msgstr "palavra é muito longa (%ld bytes, máximo de %ld bytes)" -#: utils/adt/tsvector.c:220 +#: utils/adt/tsvector.c:224 #, c-format msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "cadeia de caracteres é muito longa para tsvector (%ld bytes, máximo de %ld bytes)" -#: utils/adt/tsvector_op.c:1173 +#: utils/adt/tsvector_op.c:773 +#, c-format +msgid "lexeme array may not contain nulls" +msgstr "matriz de lexemas não pode conter nulos" + +#: utils/adt/tsvector_op.c:778 +#, c-format +msgid "lexeme array may not contain empty strings" +msgstr "matriz de lexemas não pode conter cadeias de caracteres vazias" + +#: utils/adt/tsvector_op.c:847 +#, c-format +msgid "weight array may not contain nulls" +msgstr "matriz de pesos não pode conter nulos" + +#: utils/adt/tsvector_op.c:871 +#, c-format +msgid "unrecognized weight: \"%c\"" +msgstr "peso não reconhecido: \"%c\"" + +#: utils/adt/tsvector_op.c:2601 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "consulta ts_stat deve retornar uma coluna tsvector" -#: utils/adt/tsvector_op.c:1353 +#: utils/adt/tsvector_op.c:2790 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "coluna tsvector \"%s\" não existe" -#: utils/adt/tsvector_op.c:1359 +#: utils/adt/tsvector_op.c:2797 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "coluna \"%s\" não é do tipo tsvector" -#: utils/adt/tsvector_op.c:1371 +#: utils/adt/tsvector_op.c:2809 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "coluna de configuração \"%s\" não existe" -#: utils/adt/tsvector_op.c:1377 +#: utils/adt/tsvector_op.c:2815 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "coluna \"%s\" não é do tipo regconfig" -#: utils/adt/tsvector_op.c:1384 +#: utils/adt/tsvector_op.c:2822 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "coluna de configuração \"%s\" não deve ser nulo" -#: utils/adt/tsvector_op.c:1397 +#: utils/adt/tsvector_op.c:2835 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" -msgstr "nome da configuração de busca textual \"%s\" deve ser qualificada pelo esquema" +msgstr "o nome da configuração de procura de texto completo \"%s\" deve ser qualificada pelo esquema" -#: utils/adt/tsvector_op.c:1422 +#: utils/adt/tsvector_op.c:2860 #, c-format msgid "column \"%s\" is not of a character type" -msgstr "coluna \"%s\" não é do tipo caracter" +msgstr "a coluna \"%s\" não é do tipo caractere" -#: utils/adt/tsvector_parser.c:134 +#: utils/adt/tsvector_parser.c:148 #, c-format msgid "syntax error in tsvector: \"%s\"" msgstr "erro de sintaxe em tsvector: \"%s\"" -#: utils/adt/tsvector_parser.c:199 +#: utils/adt/tsvector_parser.c:221 #, c-format msgid "there is no escaped character: \"%s\"" -msgstr "não há caracter com escape: \"%s\"" +msgstr "não há caractere com escape: \"%s\"" -#: utils/adt/tsvector_parser.c:316 +#: utils/adt/tsvector_parser.c:339 #, c-format msgid "wrong position info in tsvector: \"%s\"" msgstr "informação incorreta sobre posição no tsvector: \"%s\"" -#: utils/adt/uuid.c:128 +#: utils/adt/uuid.c:413 #, c-format -msgid "invalid input syntax for uuid: \"%s\"" -msgstr "sintaxe de entrada é inválida para uuid: \"%s\"" +msgid "could not generate random values" +msgstr "não foi possível gerar valores aleatórios" -#: utils/adt/varbit.c:57 utils/adt/varchar.c:49 +#: utils/adt/varbit.c:110 utils/adt/varchar.c:54 #, c-format msgid "length for type %s must be at least 1" msgstr "tamanho para tipo %s deve ser pelo menos 1" -#: utils/adt/varbit.c:62 utils/adt/varchar.c:53 +#: utils/adt/varbit.c:115 utils/adt/varchar.c:58 #, c-format msgid "length for type %s cannot exceed %d" msgstr "tamanho para tipo %s não pode exceder %d" -#: utils/adt/varbit.c:163 utils/adt/varbit.c:475 utils/adt/varbit.c:973 +#: utils/adt/varbit.c:198 utils/adt/varbit.c:499 utils/adt/varbit.c:994 #, c-format msgid "bit string length exceeds the maximum allowed (%d)" msgstr "tamanho da cadeia de bits excede o máximo permitido (%d)" -#: utils/adt/varbit.c:177 utils/adt/varbit.c:320 utils/adt/varbit.c:377 +#: utils/adt/varbit.c:212 utils/adt/varbit.c:356 utils/adt/varbit.c:406 #, c-format msgid "bit string length %d does not match type bit(%d)" msgstr "tamanho da cadeia de bits %d não corresponde ao tipo bit(%d)" -#: utils/adt/varbit.c:199 utils/adt/varbit.c:511 +#: utils/adt/varbit.c:234 utils/adt/varbit.c:535 #, c-format -msgid "\"%c\" is not a valid binary digit" -msgstr "\"%c\" não é um dígito binário válido" +msgid "\"%.*s\" is not a valid binary digit" +msgstr "\"%.*s\" não é um dígito binário válido" -#: utils/adt/varbit.c:224 utils/adt/varbit.c:536 +#: utils/adt/varbit.c:259 utils/adt/varbit.c:560 #, c-format -msgid "\"%c\" is not a valid hexadecimal digit" -msgstr "\"%c\" não é um dígito hexadecimal válido" +msgid "\"%.*s\" is not a valid hexadecimal digit" +msgstr "\"%.*s\" não é um dígito hexadecimal válido" -#: utils/adt/varbit.c:311 utils/adt/varbit.c:627 +#: utils/adt/varbit.c:347 utils/adt/varbit.c:652 #, c-format msgid "invalid length in external bit string" msgstr "tamanho é inválido na cadeia de bits externa" -#: utils/adt/varbit.c:489 utils/adt/varbit.c:636 utils/adt/varbit.c:731 +#: utils/adt/varbit.c:513 utils/adt/varbit.c:661 utils/adt/varbit.c:757 #, c-format msgid "bit string too long for type bit varying(%d)" msgstr "cadeia de bits muito longa para tipo bit varying(%d)" -#: utils/adt/varbit.c:1066 utils/adt/varbit.c:1168 utils/adt/varlena.c:800 -#: utils/adt/varlena.c:864 utils/adt/varlena.c:1008 utils/adt/varlena.c:1964 -#: utils/adt/varlena.c:2031 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:908 +#: utils/adt/varlena.c:971 utils/adt/varlena.c:1128 utils/adt/varlena.c:3052 +#: utils/adt/varlena.c:3130 #, c-format msgid "negative substring length not allowed" msgstr "tamanho negativo de índice não é permitido" -#: utils/adt/varbit.c:1226 +#: utils/adt/varbit.c:1261 #, c-format msgid "cannot AND bit strings of different sizes" -msgstr "não pode executar E em cadeias de bits de tamanhos diferentes" +msgstr "não é possível executar AND em cadeias de bits de tamanhos diferentes" -#: utils/adt/varbit.c:1268 +#: utils/adt/varbit.c:1302 #, c-format msgid "cannot OR bit strings of different sizes" -msgstr "não pode executar OU em cadeias de bits de tamanhos diferentes" +msgstr "não é possível executar OR em cadeias de bits de tamanhos diferentes" -#: utils/adt/varbit.c:1315 +#: utils/adt/varbit.c:1342 #, c-format msgid "cannot XOR bit strings of different sizes" -msgstr "não pode executar XOR em cadeias de bits de tamanhos diferentes" +msgstr "não é possível executar XOR em cadeias de bits de tamanhos diferentes" -#: utils/adt/varbit.c:1793 utils/adt/varbit.c:1851 +#: utils/adt/varbit.c:1824 utils/adt/varbit.c:1882 #, c-format msgid "bit index %d out of valid range (0..%d)" msgstr "índice do bit %d fora do intervalo válido (0..%d)" -#: utils/adt/varbit.c:1802 utils/adt/varlena.c:2231 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3334 #, c-format msgid "new bit must be 0 or 1" msgstr "novo bit deve ser 0 ou 1" -#: utils/adt/varchar.c:153 utils/adt/varchar.c:306 +#: utils/adt/varchar.c:162 utils/adt/varchar.c:313 #, c-format msgid "value too long for type character(%d)" msgstr "valor é muito longo para tipo character(%d)" -#: utils/adt/varchar.c:468 utils/adt/varchar.c:622 +#: utils/adt/varchar.c:476 utils/adt/varchar.c:640 #, c-format msgid "value too long for type character varying(%d)" msgstr "valor é muito longo para tipo character varying(%d)" -#: utils/adt/varlena.c:1380 +#: utils/adt/varchar.c:738 utils/adt/varlena.c:1517 #, c-format msgid "could not determine which collation to use for string comparison" -msgstr "não pôde determinar qual ordenação utilizar para comparação de cadeia de caracteres" +msgstr "não foi possível determinar qual ordenação utilizar para comparação de cadeia de caracteres" -#: utils/adt/varlena.c:1426 utils/adt/varlena.c:1439 +#: utils/adt/varlena.c:1227 utils/adt/varlena.c:1806 #, c-format -msgid "could not convert string to UTF-16: error code %lu" -msgstr "não pôde converter cadeia de caracteres para UTF-16: código de erro %lu" - -#: utils/adt/varlena.c:1454 -#, c-format -msgid "could not compare Unicode strings: %m" -msgstr "não pôde comparar cadeias de caracteres Unicode: %m" +msgid "nondeterministic collations are not supported for substring searches" +msgstr "ordenações não determinísticas não têm suporte para pesquisas de sub-cadeia de caracteres" -#: utils/adt/varlena.c:2109 utils/adt/varlena.c:2140 utils/adt/varlena.c:2176 -#: utils/adt/varlena.c:2219 +#: utils/adt/varlena.c:3218 utils/adt/varlena.c:3285 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "índice %d fora do intervalo válido, 0..%d" -#: utils/adt/varlena.c:3138 +#: utils/adt/varlena.c:3249 utils/adt/varlena.c:3321 #, c-format -msgid "field position must be greater than zero" -msgstr "posição do campo deve ser maior que zero" +msgid "index %lld out of valid range, 0..%lld" +msgstr "índice %lld fora do intervalo válido, 0..%lld" -#: utils/adt/varlena.c:4017 +#: utils/adt/varlena.c:4382 #, c-format -msgid "unterminated format specifier" -msgstr "especificador de formato não foi terminado" +msgid "field position must not be zero" +msgstr "a posição do campo não deve ser zero" -#: utils/adt/varlena.c:4149 utils/adt/varlena.c:4269 +#: utils/adt/varlena.c:5554 #, c-format -msgid "unrecognized conversion type specifier \"%c\"" -msgstr "especificador de tipo de conversão \"%c\" desconhecido" +msgid "unterminated format() type specifier" +msgstr "especificador de tipo para format() não terminado" -#: utils/adt/varlena.c:4161 utils/adt/varlena.c:4218 +#: utils/adt/varlena.c:5555 utils/adt/varlena.c:5689 utils/adt/varlena.c:5810 #, c-format -msgid "too few arguments for format" -msgstr "poucos argumentos para formato" +msgid "For a single \"%%\" use \"%%%%\"." +msgstr "" + +#: utils/adt/varlena.c:5687 utils/adt/varlena.c:5808 +#, c-format +msgid "unrecognized format() type specifier \"%.*s\"" +msgstr "especificador de tipo para format() não reconhecido \"%.*s\"" + +#: utils/adt/varlena.c:5700 utils/adt/varlena.c:5757 +#, c-format +msgid "too few arguments for format()" +msgstr "muito poucos argumentos para format()" -#: utils/adt/varlena.c:4312 utils/adt/varlena.c:4495 +#: utils/adt/varlena.c:5853 utils/adt/varlena.c:6035 #, c-format msgid "number is out of range" msgstr "número está fora do intervalo" -#: utils/adt/varlena.c:4376 utils/adt/varlena.c:4404 +#: utils/adt/varlena.c:5916 utils/adt/varlena.c:5944 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "formato especifica argumento 0, mas argumentos são numerados a partir de 1" -#: utils/adt/varlena.c:4397 +#: utils/adt/varlena.c:5937 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "posição do argumento de largura deve terminar com \"$\"" -#: utils/adt/varlena.c:4442 +#: utils/adt/varlena.c:5982 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "valores nulos não podem ser formatados como um identificador SQL" -#: utils/adt/windowfuncs.c:243 +#: utils/adt/varlena.c:6190 +#, c-format +msgid "Unicode normalization can only be performed if server encoding is UTF8" +msgstr "" + +#: utils/adt/varlena.c:6203 +#, c-format +msgid "invalid normalization form: %s" +msgstr "forma de normalização inválida: %s" + +#: utils/adt/varlena.c:6406 utils/adt/varlena.c:6441 utils/adt/varlena.c:6476 +#, c-format +msgid "invalid Unicode code point: %04X" +msgstr "ponto de código Unicode inválido: %04X" + +#: utils/adt/varlena.c:6506 +#, c-format +msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." +msgstr "Os escapes Unicode devem ser \\XXXX, \\+XXXXXX, \\uXXXX, ou \\UXXXXXXXX." + +#: utils/adt/windowfuncs.c:442 #, c-format msgid "argument of ntile must be greater than zero" msgstr "argumento de ntile deve ser maior do que zero" -#: utils/adt/windowfuncs.c:465 +#: utils/adt/windowfuncs.c:706 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "argumento de nth_value deve ser maior do que zero" -#: utils/adt/xml.c:170 +#: utils/adt/xid8funcs.c:125 +#, c-format +msgid "transaction ID %llu is in the future" +msgstr "" + +#: utils/adt/xid8funcs.c:547 +#, c-format +msgid "invalid external pg_snapshot data" +msgstr "dados externos de pg_snapshot inválidos" + +#: utils/adt/xml.c:228 #, c-format msgid "unsupported XML feature" msgstr "funcionalidade XML não é suportado" -#: utils/adt/xml.c:171 +#: utils/adt/xml.c:229 #, c-format msgid "This functionality requires the server to be built with libxml support." msgstr "Esta funcionalidade requer que o servidor seja construído com suporte a libxml." -#: utils/adt/xml.c:172 -#, c-format -msgid "You need to rebuild PostgreSQL using --with-libxml." -msgstr "Você precisa reconstruir o PostgreSQL utilizando --with-libxml." - -#: utils/adt/xml.c:191 utils/mb/mbutils.c:523 +#: utils/adt/xml.c:248 utils/mb/mbutils.c:628 #, c-format msgid "invalid encoding name \"%s\"" msgstr "nome da codificação \"%s\" é inválido" -#: utils/adt/xml.c:434 utils/adt/xml.c:439 +#: utils/adt/xml.c:496 utils/adt/xml.c:501 #, c-format msgid "invalid XML comment" msgstr "comentário XML é inválido" -#: utils/adt/xml.c:568 +#: utils/adt/xml.c:660 #, c-format msgid "not an XML document" msgstr "não é um documento XML" -#: utils/adt/xml.c:727 utils/adt/xml.c:750 +#: utils/adt/xml.c:956 utils/adt/xml.c:979 #, c-format msgid "invalid XML processing instruction" msgstr "instrução de processamento XML é inválida" -#: utils/adt/xml.c:728 +#: utils/adt/xml.c:957 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "nome alvo da instrução de processamento XML não pode ser \"%s\"." -#: utils/adt/xml.c:751 +#: utils/adt/xml.c:980 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "instrução de processamento XML não pode conter \"?>\"." -#: utils/adt/xml.c:830 +#: utils/adt/xml.c:1059 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate não está implementado" -#: utils/adt/xml.c:909 +#: utils/adt/xml.c:1115 #, c-format msgid "could not initialize XML library" -msgstr "não pôde inicializar biblioteca XML" +msgstr "não foi possível inicializar biblioteca XML" -#: utils/adt/xml.c:910 +#: utils/adt/xml.c:1116 #, c-format -msgid "libxml2 has incompatible char type: sizeof(char)=%u, sizeof(xmlChar)=%u." -msgstr "libxml2 tem tipo char incompatível: sizeof(char)=%u, sizeof(xmlChar)=%u." +msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." +msgstr "libxml2 tem tipo char incompatível: sizeof(char)=%zu, sizeof(xmlChar)=%zu." -#: utils/adt/xml.c:996 +#: utils/adt/xml.c:1202 #, c-format msgid "could not set up XML error handler" -msgstr "não pôde configurar manipulador de erro XML" +msgstr "não foi possível configurar o tratador de erro XML" -#: utils/adt/xml.c:997 +#: utils/adt/xml.c:1203 #, c-format msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." -msgstr "Isso provavelmente indica que a versão da libxml2 que está sendo utilizada não é compatível com os arquivos de cabeçalho da libxml2 que o PostgreSQL foi construído." +msgstr "Isso provavelmente indica que a versão da libxml2 que está sendo usada não é compatível com os arquivos de cabeçalho da libxml2 que o PostgreSQL foi construído." -#: utils/adt/xml.c:1732 +#: utils/adt/xml.c:2189 msgid "Invalid character value." -msgstr "Valor de caracter é inválido." +msgstr "Valor do caractere inválido." -#: utils/adt/xml.c:1735 +#: utils/adt/xml.c:2192 msgid "Space required." msgstr "Espaço requerido." -#: utils/adt/xml.c:1738 +#: utils/adt/xml.c:2195 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone aceita somente 'yes' ou 'no'." -#: utils/adt/xml.c:1741 +#: utils/adt/xml.c:2198 msgid "Malformed declaration: missing version." msgstr "Declaração mal formada: versão ausente." -#: utils/adt/xml.c:1744 +#: utils/adt/xml.c:2201 msgid "Missing encoding in text declaration." msgstr "Faltando codificação em declaração." -#: utils/adt/xml.c:1747 +#: utils/adt/xml.c:2204 msgid "Parsing XML declaration: '?>' expected." msgstr "Analisando declaração XML: '?>' esperado." -#: utils/adt/xml.c:1750 +#: utils/adt/xml.c:2207 #, c-format msgid "Unrecognized libxml error code: %d." -msgstr "código de erro libxml desconhecido: %d." +msgstr "Código de erro libxml não reconhecido: %d." -#: utils/adt/xml.c:2025 +#: utils/adt/xml.c:2461 #, c-format msgid "XML does not support infinite date values." -msgstr "XML não suporta valores infinitos de date." +msgstr "XML não dá suporte a valores infinitos de data." -#: utils/adt/xml.c:2047 utils/adt/xml.c:2074 +#: utils/adt/xml.c:2483 utils/adt/xml.c:2510 #, c-format msgid "XML does not support infinite timestamp values." -msgstr "XML não suporta valores infinitos de timestamp." +msgstr "XML não dá suporte a valores infinitos de carimbo de data/hora." -#: utils/adt/xml.c:2465 +#: utils/adt/xml.c:2926 #, c-format msgid "invalid query" msgstr "consulta é inválida" -#: utils/adt/xml.c:3778 +#: utils/adt/xml.c:3018 +#, c-format +msgid "portal \"%s\" does not return tuples" +msgstr "o portal \"%s\" não retorna tuplas" + +#: utils/adt/xml.c:4270 #, c-format msgid "invalid array for XML namespace mapping" msgstr "matriz é inválida para mapeamento de namespace XML" -#: utils/adt/xml.c:3779 +#: utils/adt/xml.c:4271 +#, c-format +msgid "The array must be two-dimensional with length of the second axis equal to 2." +msgstr "A matriz deve ter duas dimensões com comprimento do segundo eixo igual a 2." + +#: utils/adt/xml.c:4295 +#, c-format +msgid "empty XPath expression" +msgstr "expressão XPath vazia" + +#: utils/adt/xml.c:4347 +#, c-format +msgid "neither namespace name nor URI may be null" +msgstr "namespace ou URI não podem ser nulo" + +#: utils/adt/xml.c:4354 +#, c-format +msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" +msgstr "não foi possível registrar namespace XML com nome \"%s\" e URI \"%s\"" + +#: utils/adt/xml.c:4697 +#, c-format +msgid "DEFAULT namespace is not supported" +msgstr "O espaço de nomes DEFAULT não tem suporte" + +#: utils/adt/xml.c:4726 #, c-format -msgid "The array must be two-dimensional with length of the second axis equal to 2." -msgstr "A matriz deve ter duas dimensões com comprimento do segundo eixo igual a 2." +msgid "row path filter must not be empty string" +msgstr "o filtro de caminho de linha não deve ser uma cadeia de caracteres vazia" -#: utils/adt/xml.c:3803 +#: utils/adt/xml.c:4757 #, c-format -msgid "empty XPath expression" -msgstr "expressão XPath vazia" +msgid "column path filter must not be empty string" +msgstr "o filtro de caminho de coluna não deve ser uma cadeia de caracteres vazia" -#: utils/adt/xml.c:3852 +#: utils/adt/xml.c:4901 #, c-format -msgid "neither namespace name nor URI may be null" -msgstr "namespace ou URI não podem ser nulo" +msgid "more than one value returned by column XPath expression" +msgstr "mais de um valor retornado pela expressão XPath da coluna" -#: utils/adt/xml.c:3859 +#: utils/cache/lsyscache.c:1043 #, c-format -msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" -msgstr "não pôde registrar namespace XML com nome \"%s\" e URI \"%s\"" +msgid "cast from type %s to type %s does not exist" +msgstr "conversão do tipo %s para tipo %s não existe" -#: utils/cache/lsyscache.c:2478 utils/cache/lsyscache.c:2511 -#: utils/cache/lsyscache.c:2544 utils/cache/lsyscache.c:2577 +#: utils/cache/lsyscache.c:2845 utils/cache/lsyscache.c:2878 +#: utils/cache/lsyscache.c:2911 utils/cache/lsyscache.c:2944 #, c-format msgid "type %s is only a shell" msgstr "tipo %s é indefinido" -#: utils/cache/lsyscache.c:2483 +#: utils/cache/lsyscache.c:2850 #, c-format msgid "no input function available for type %s" msgstr "nenhuma função de entrada disponível para tipo %s" -#: utils/cache/lsyscache.c:2516 +#: utils/cache/lsyscache.c:2883 #, c-format msgid "no output function available for type %s" msgstr "nenhuma função de saída disponível para tipo %s" -#: utils/cache/plancache.c:698 +#: utils/cache/partcache.c:219 +#, c-format +msgid "operator class \"%s\" of access method %s is missing support function %d for type %s" +msgstr "a classe de operador \"%s\" do método de acesso %s não possui a função de suporte %d para o tipo de dados %s" + +#: utils/cache/plancache.c:724 #, c-format msgid "cached plan must not change result type" msgstr "plano em cache não deve mudar tipo resultante" -#: utils/cache/relcache.c:4828 +#: utils/cache/relcache.c:3741 +#, c-format +msgid "heap relfilenumber value not set when in binary upgrade mode" +msgstr "o valor de relfilenumber do heap não está definido quando no modo de atualização binária" + +#: utils/cache/relcache.c:3749 +#, c-format +msgid "unexpected request for new relfilenumber in binary upgrade mode" +msgstr "requisição não esperada para novo relfilenumber no modo de atualização binária" + +#: utils/cache/relcache.c:6495 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" -msgstr "não pôde criar arquivo de inicialização de cache de relações \"%s\": %m" +msgstr "não foi possível criar o arquivo de inicialização de cache de relações \"%s\": %m" -#: utils/cache/relcache.c:4830 +#: utils/cache/relcache.c:6497 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Continuando mesmo assim, mas há algo errado." -#: utils/cache/relcache.c:5044 +#: utils/cache/relcache.c:6819 #, c-format msgid "could not remove cache file \"%s\": %m" -msgstr "não pôde remover arquivo de cache \"%s\": %m" +msgstr "não foi possível remover o arquivo de cache \"%s\": %m" -#: utils/cache/relmapper.c:506 +#: utils/cache/relmapper.c:596 #, c-format msgid "cannot PREPARE a transaction that modified relation mapping" -msgstr "não pode executar PREPARE em uma transação que modificou mapeamento de relação" - -#: utils/cache/relmapper.c:649 utils/cache/relmapper.c:749 -#, c-format -msgid "could not open relation mapping file \"%s\": %m" -msgstr "não pôde abrir arquivo de mapeamento de relação \"%s\": %m" - -#: utils/cache/relmapper.c:662 -#, c-format -msgid "could not read relation mapping file \"%s\": %m" -msgstr "não pôde ler do arquivo de mapeamento de relação \"%s\": %m" +msgstr "não é possível executar PREPARE em uma transação que modificou o mapeamento de relação" -#: utils/cache/relmapper.c:672 +#: utils/cache/relmapper.c:850 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "arquivo de mapeamento de relação \"%s\" contém dados inválidos" -#: utils/cache/relmapper.c:682 +#: utils/cache/relmapper.c:860 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "arquivo de mapeamento de relação \"%s\" contém soma de verificação incorreta" -#: utils/cache/relmapper.c:788 -#, c-format -msgid "could not write to relation mapping file \"%s\": %m" -msgstr "não pôde escrever no arquivo de mapeamento de relação \"%s\": %m" - -#: utils/cache/relmapper.c:801 -#, c-format -msgid "could not fsync relation mapping file \"%s\": %m" -msgstr "não pôde executar fsync no arquivo de mapeamento de relação \"%s\": %m" - -#: utils/cache/relmapper.c:807 -#, c-format -msgid "could not close relation mapping file \"%s\": %m" -msgstr "não pôde fechar arquivo de mapeamento de relação \"%s\": %m" - -#: utils/cache/typcache.c:704 -#, c-format -msgid "type %s is not composite" -msgstr "tipo %s não é composto" - -#: utils/cache/typcache.c:718 +#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:566 #, c-format msgid "record type has not been registered" msgstr "tipo record não foi registrado" -#: utils/error/assert.c:34 +#: utils/error/assert.c:37 #, c-format -msgid "TRAP: ExceptionalCondition: bad arguments\n" -msgstr "TRAP: ExceptionalCondition: argumentos inválidos\n" +msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" +msgstr "TRAP: ExceptionalCondition: argumentos incorretos no PID %d\n" -#: utils/error/assert.c:37 +#: utils/error/assert.c:40 #, c-format -msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d)\n" -msgstr "TRAP: %s(\"%s\", Arquivo: \"%s\", Linha: %d)\n" +msgid "TRAP: failed Assert(\"%s\"), File: \"%s\", Line: %d, PID: %d\n" +msgstr "TRAP: falhou Assert(\"%s\"), Arquivo: \"%s\", Linha: %d, PID: %d\n" -#: utils/error/elog.c:320 utils/error/elog.c:1291 +#: utils/error/elog.c:416 #, c-format -msgid "error occurred at %s:%d before error message processing is available\n" -msgstr "erro ocorreu em %s:%d antes que processador de mensagens de erro estivesse disponível\n" +msgid "error occurred before error message processing is available\n" +msgstr "ocorreu um erro antes que o processamento de mensagens de erro estivesse disponível\n" -#: utils/error/elog.c:1807 +#: utils/error/elog.c:2092 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" -msgstr "não pôde reabrir arquivo \"%s\" como saída stderr: %m" +msgstr "não foi possível reabrir o arquivo \"%s\" como saída stderr: %m" -#: utils/error/elog.c:1820 +#: utils/error/elog.c:2105 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" -msgstr "não pôde reabrir arquivo \"%s\" como saida stdout: %m" +msgstr "não foi possível reabrir o arquivo \"%s\" como saida stdout: %m" + +#: utils/error/elog.c:2141 +#, c-format +msgid "invalid character" +msgstr "caractere inválido" -#: utils/error/elog.c:2295 utils/error/elog.c:2312 utils/error/elog.c:2328 +#: utils/error/elog.c:2847 utils/error/elog.c:2874 utils/error/elog.c:2890 msgid "[unknown]" msgstr "[desconhecido]" -#: utils/error/elog.c:2766 utils/error/elog.c:3065 utils/error/elog.c:3173 +#: utils/error/elog.c:3163 utils/error/elog.c:3484 utils/error/elog.c:3591 msgid "missing error text" msgstr "faltando mensagem de erro" -#: utils/error/elog.c:2769 utils/error/elog.c:2772 utils/error/elog.c:3176 -#: utils/error/elog.c:3179 +#: utils/error/elog.c:3166 utils/error/elog.c:3169 #, c-format msgid " at character %d" -msgstr " no caracter %d" +msgstr " no caractere %d" -#: utils/error/elog.c:2782 utils/error/elog.c:2789 +#: utils/error/elog.c:3179 utils/error/elog.c:3186 msgid "DETAIL: " msgstr "DETALHE: " -#: utils/error/elog.c:2796 +#: utils/error/elog.c:3193 msgid "HINT: " msgstr "DICA: " -#: utils/error/elog.c:2803 +#: utils/error/elog.c:3200 msgid "QUERY: " msgstr "CONSULTA: " -#: utils/error/elog.c:2810 +#: utils/error/elog.c:3207 msgid "CONTEXT: " msgstr "CONTEXTO: " -#: utils/error/elog.c:2820 +#: utils/error/elog.c:3217 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "LOCAL: %s, %s:%d\n" -#: utils/error/elog.c:2827 +#: utils/error/elog.c:3224 #, c-format msgid "LOCATION: %s:%d\n" msgstr "LOCAL: %s:%d\n" -#: utils/error/elog.c:2841 +#: utils/error/elog.c:3231 +msgid "BACKTRACE: " +msgstr "" + +#: utils/error/elog.c:3243 msgid "STATEMENT: " msgstr "COMANDO: " -#. translator: This string will be truncated at 47 -#. characters expanded. -#: utils/error/elog.c:3294 -#, c-format -msgid "operating system error %d" -msgstr "erro do sistema operacional %d" - -#: utils/error/elog.c:3489 +#: utils/error/elog.c:3636 msgid "DEBUG" msgstr "DEPURAÇÃO" -#: utils/error/elog.c:3493 +#: utils/error/elog.c:3640 msgid "LOG" msgstr "LOG" -#: utils/error/elog.c:3496 +#: utils/error/elog.c:3643 msgid "INFO" msgstr "INFO" -#: utils/error/elog.c:3499 +#: utils/error/elog.c:3646 msgid "NOTICE" msgstr "NOTA" -#: utils/error/elog.c:3502 +#: utils/error/elog.c:3650 msgid "WARNING" msgstr "AVISO" -#: utils/error/elog.c:3505 +#: utils/error/elog.c:3653 msgid "ERROR" msgstr "ERRO" -#: utils/error/elog.c:3508 +#: utils/error/elog.c:3656 msgid "FATAL" msgstr "FATAL" -#: utils/error/elog.c:3511 +#: utils/error/elog.c:3659 msgid "PANIC" msgstr "PÂNICO" -#: utils/fmgr/dfmgr.c:125 +#: utils/fmgr/dfmgr.c:128 #, c-format msgid "could not find function \"%s\" in file \"%s\"" -msgstr "não pôde encontrar função \"%s\" no arquivo \"%s\"" - -#: utils/fmgr/dfmgr.c:204 utils/fmgr/dfmgr.c:413 utils/fmgr/dfmgr.c:461 -#, c-format -msgid "could not access file \"%s\": %m" -msgstr "não pôde acessar arquivo \"%s\": %m" +msgstr "não foi possível encontrar função \"%s\" no arquivo \"%s\"" -#: utils/fmgr/dfmgr.c:242 +#: utils/fmgr/dfmgr.c:247 #, c-format msgid "could not load library \"%s\": %s" -msgstr "não pôde carregar biblioteca \"%s\": %s" +msgstr "não foi possível carregar biblioteca \"%s\": %s" -#: utils/fmgr/dfmgr.c:274 +#: utils/fmgr/dfmgr.c:279 #, c-format msgid "incompatible library \"%s\": missing magic block" msgstr "biblioteca \"%s\" é incompatível: bloco mágico ausente" -#: utils/fmgr/dfmgr.c:276 +#: utils/fmgr/dfmgr.c:281 #, c-format msgid "Extension libraries are required to use the PG_MODULE_MAGIC macro." msgstr "Bibliotecas de extensões são obrigadas a utilizar o macro PG_MODULE_MAGIC." -#: utils/fmgr/dfmgr.c:312 +#: utils/fmgr/dfmgr.c:327 #, c-format msgid "incompatible library \"%s\": version mismatch" msgstr "biblioteca \"%s\" é incompatível: versão não corresponde" -#: utils/fmgr/dfmgr.c:314 +#: utils/fmgr/dfmgr.c:329 +#, c-format +msgid "Server is version %d, library is version %s." +msgstr "O servidor é da versão %d, a biblioteca é da versão %s." + +#: utils/fmgr/dfmgr.c:341 +#, c-format +msgid "incompatible library \"%s\": ABI mismatch" +msgstr "biblioteca incompatível \"%s\": ABI sem correspondência" + +#: utils/fmgr/dfmgr.c:343 #, c-format -msgid "Server is version %d.%d, library is version %d.%d." -msgstr "Servidor tem versão %d,%d, biblioteca tem versão %d.%d." +msgid "Server has ABI \"%s\", library has \"%s\"." +msgstr "O servidor tem ABI \"%s\", a biblioteca tem \"%s\"." -#: utils/fmgr/dfmgr.c:333 +#: utils/fmgr/dfmgr.c:361 #, c-format msgid "Server has FUNC_MAX_ARGS = %d, library has %d." msgstr "Servidor tem FUNC_MAX_ARGS = %d, biblioteca tem %d." -#: utils/fmgr/dfmgr.c:342 +#: utils/fmgr/dfmgr.c:370 #, c-format msgid "Server has INDEX_MAX_KEYS = %d, library has %d." msgstr "Servidor tem INDEX_MAX_KEYS = %d, biblioteca tem %d." -#: utils/fmgr/dfmgr.c:351 +#: utils/fmgr/dfmgr.c:379 #, c-format msgid "Server has NAMEDATALEN = %d, library has %d." msgstr "Servidor tem NAMEDATALEN = %d, biblioteca tem %d." -#: utils/fmgr/dfmgr.c:360 -#, c-format -msgid "Server has FLOAT4PASSBYVAL = %s, library has %s." -msgstr "Servidor tem FLOAT4PASSBYVAL = %s, biblioteca tem %s." - -#: utils/fmgr/dfmgr.c:369 +#: utils/fmgr/dfmgr.c:388 #, c-format msgid "Server has FLOAT8PASSBYVAL = %s, library has %s." msgstr "Servidor tem FLOAT8PASSBYVAL = %s, biblioteca tem %s." -#: utils/fmgr/dfmgr.c:376 +#: utils/fmgr/dfmgr.c:395 msgid "Magic block has unexpected length or padding difference." msgstr "Bloco mágico tem tamanho inesperado ou diferença no enchimento." -#: utils/fmgr/dfmgr.c:379 +#: utils/fmgr/dfmgr.c:398 #, c-format msgid "incompatible library \"%s\": magic block mismatch" msgstr "biblioteca \"%s\" é incompatível: bloco mágico não corresponde" -#: utils/fmgr/dfmgr.c:543 +#: utils/fmgr/dfmgr.c:492 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "acesso a biblioteca \"%s\" não é permitido" -#: utils/fmgr/dfmgr.c:569 +#: utils/fmgr/dfmgr.c:518 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "nome de macro é inválido no caminho de biblioteca dinâmica: %s" -#: utils/fmgr/dfmgr.c:609 +#: utils/fmgr/dfmgr.c:558 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "componente de tamanho zero no parâmetro \"dynamic_library_path\"" -#: utils/fmgr/dfmgr.c:628 +#: utils/fmgr/dfmgr.c:577 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "componente no parâmetro \"dynamic_library_path\" não é um caminho absoluto" -#: utils/fmgr/fmgr.c:272 +#: utils/fmgr/fmgr.c:236 #, c-format msgid "internal function \"%s\" is not in internal lookup table" msgstr "função interna \"%s\" não está na tabela de busca interna" -#: utils/fmgr/fmgr.c:479 +#: utils/fmgr/fmgr.c:470 +#, c-format +msgid "could not find function information for function \"%s\"" +msgstr "não foi possível encontrar informações de função para a função \"%s\"" + +#: utils/fmgr/fmgr.c:472 +#, c-format +msgid "SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname)." +msgstr "" + +#: utils/fmgr/fmgr.c:490 #, c-format msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "versão %d de API informada pela função \"%s\" é desconhecida" -#: utils/fmgr/fmgr.c:850 utils/fmgr/fmgr.c:2111 +#: utils/fmgr/fmgr.c:2080 #, c-format -msgid "function %u has too many arguments (%d, maximum is %d)" -msgstr "função %u tem muitos argumentos (%d, máximo é %d)" +msgid "operator class options info is absent in function call context" +msgstr "" -#: utils/fmgr/fmgr.c:2532 +#: utils/fmgr/fmgr.c:2147 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "função de validação de linguagem %u chamada para linguagem %u ao invés de %u" -#: utils/fmgr/funcapi.c:355 +#: utils/fmgr/funcapi.c:489 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" -msgstr "não pôde determinar tipo de resultado para função \"%s\" declarada para retornar tipo %s" +msgstr "não foi possível determinar tipo de resultado para função \"%s\" declarada para retornar tipo %s" + +#: utils/fmgr/funcapi.c:634 +#, c-format +msgid "argument declared %s does not contain a range type but type %s" +msgstr "argumento declarado %s não contém um tipo de dados de intervalo, mas o tipo %s" + +#: utils/fmgr/funcapi.c:717 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "não foi possível encontrar o tipo de dados multi-intervalo para o tipo de dados %s" -#: utils/fmgr/funcapi.c:1300 utils/fmgr/funcapi.c:1331 +#: utils/fmgr/funcapi.c:1921 utils/fmgr/funcapi.c:1953 #, c-format msgid "number of aliases does not match number of columns" msgstr "número de aliases não corresponde ao número de colunas" -#: utils/fmgr/funcapi.c:1325 +#: utils/fmgr/funcapi.c:1947 #, c-format msgid "no column alias was provided" msgstr "nenhum aliás de coluna foi fornecido" -#: utils/fmgr/funcapi.c:1349 +#: utils/fmgr/funcapi.c:1971 #, c-format msgid "could not determine row description for function returning record" -msgstr "não pôde determinar descrição de registro para função que retorna record" +msgstr "não foi possível determinar descrição da linha para a função que retorna record" + +#: utils/init/miscinit.c:346 +#, c-format +msgid "data directory \"%s\" does not exist" +msgstr "diretório de dados \"%s\" não existe" + +#: utils/init/miscinit.c:351 +#, c-format +msgid "could not read permissions of directory \"%s\": %m" +msgstr "não foi possível ler permissões do diretório \"%s\": %m" + +#: utils/init/miscinit.c:359 +#, c-format +msgid "specified data directory \"%s\" is not a directory" +msgstr "diretório de dados especificado \"%s\" não é um diretório" + +#: utils/init/miscinit.c:375 +#, c-format +msgid "data directory \"%s\" has wrong ownership" +msgstr "diretório de dados \"%s\" tem dono incorreto" + +#: utils/init/miscinit.c:377 +#, c-format +msgid "The server must be started by the user that owns the data directory." +msgstr "O servidor deve ser iniciado pelo usuário que é o dono do diretório de dados." + +#: utils/init/miscinit.c:395 +#, c-format +msgid "data directory \"%s\" has invalid permissions" +msgstr "diretório de dados \"%s\" tem permissões inválidas" -#: utils/init/miscinit.c:116 +#: utils/init/miscinit.c:397 +#, c-format +msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." +msgstr "As permissões devem ser u=rwx (0700), ou u=rwx,g=rx (0750)." + +#: utils/init/miscinit.c:455 #, c-format msgid "could not change directory to \"%s\": %m" -msgstr "não pôde mudar diretório para \"%s\": %m" +msgstr "não foi possível mudar o diretório para \"%s\": %m" -#: utils/init/miscinit.c:311 utils/misc/guc.c:5761 +#: utils/init/miscinit.c:692 utils/misc/guc.c:3557 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" -msgstr "não pode definir parâmetro \"%s\" em operação com restrição de segurança" +msgstr "não é possível definir o parâmetro \"%s\" em operação com restrição de segurança" + +#: utils/init/miscinit.c:764 +#, c-format +msgid "role with OID %u does not exist" +msgstr "role com OID %u não existe" -#: utils/init/miscinit.c:390 +#: utils/init/miscinit.c:794 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "role \"%s\" não tem permissão para entrar" -#: utils/init/miscinit.c:408 +#: utils/init/miscinit.c:812 #, c-format msgid "too many connections for role \"%s\"" msgstr "muitas conexões para role \"%s\"" -#: utils/init/miscinit.c:468 +#: utils/init/miscinit.c:919 #, c-format msgid "permission denied to set session authorization" msgstr "permissão negada ao definir autorização de sessão" -#: utils/init/miscinit.c:548 +#: utils/init/miscinit.c:1002 #, c-format msgid "invalid role OID: %u" -msgstr "OID de role é inválido: %u" +msgstr "OID de função de banco de dados (role) inválido: %u" + +#: utils/init/miscinit.c:1149 +#, c-format +msgid "database system is shut down" +msgstr "sistema de banco de dados está desligado" -#: utils/init/miscinit.c:675 +#: utils/init/miscinit.c:1236 #, c-format msgid "could not create lock file \"%s\": %m" -msgstr "não pôde criar arquivo de bloqueio \"%s\": %m" +msgstr "não foi possível criar o arquivo de bloqueio \"%s\": %m" -#: utils/init/miscinit.c:689 +#: utils/init/miscinit.c:1250 #, c-format msgid "could not open lock file \"%s\": %m" -msgstr "não pôde abrir arquivo de bloqueio \"%s\": %m" +msgstr "não foi possível abrir o arquivo de bloqueio \"%s\": %m" -#: utils/init/miscinit.c:695 +#: utils/init/miscinit.c:1257 #, c-format msgid "could not read lock file \"%s\": %m" -msgstr "não pôde ler arquivo de bloqueio \"%s\": %m" +msgstr "não foi possível ler o arquivo de bloqueio \"%s\": %m" -#: utils/init/miscinit.c:703 +#: utils/init/miscinit.c:1266 #, c-format msgid "lock file \"%s\" is empty" msgstr "arquivo de bloqueio \"%s\" está vazio" -#: utils/init/miscinit.c:704 +#: utils/init/miscinit.c:1267 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." -msgstr "Outro servidor está iniciando ou um arquivo de bloqueio é remanescente de uma queda durante a inicialização do servidor." +msgstr "Outro servidor está iniciando, ou o arquivo de bloqueio é remanescente de uma queda durante a ativação do servidor." -#: utils/init/miscinit.c:751 +#: utils/init/miscinit.c:1311 #, c-format msgid "lock file \"%s\" already exists" msgstr "arquivo de bloqueio \"%s\" já existe" -#: utils/init/miscinit.c:755 +#: utils/init/miscinit.c:1315 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "Outro postgres (PID %d) está executando sob o diretório de dados \"%s\"?" -#: utils/init/miscinit.c:757 +#: utils/init/miscinit.c:1317 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "Outro postmaster (PID %d) está executando sob o diretório de dados \"%s\"?" -#: utils/init/miscinit.c:760 +#: utils/init/miscinit.c:1320 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" -msgstr "Outro postgres (PID %d) está utilizando arquivo de soquete \"%s\"?" +msgstr "Outro postgres (PID %d) está usando arquivo de soquete \"%s\"?" -#: utils/init/miscinit.c:762 +#: utils/init/miscinit.c:1322 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" -msgstr "Outro postmaster (PID %d) está utilizando arquivo de soquete \"%s\"?" - -#: utils/init/miscinit.c:798 -#, c-format -msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" -msgstr "bloco de memória compartilhada existente (chave %lu, ID %lu) ainda está em uso" - -#: utils/init/miscinit.c:801 -#, c-format -msgid "If you're sure there are no old server processes still running, remove the shared memory block or just delete the file \"%s\"." -msgstr "Se você tem certeza que não há processos servidor antigos sendo executados, remova o bloco de memória compartilhada ou apague o arquivo \"%s\"." +msgstr "Outro postmaster (PID %d) está usando arquivo de soquete \"%s\"?" -#: utils/init/miscinit.c:817 +#: utils/init/miscinit.c:1373 #, c-format msgid "could not remove old lock file \"%s\": %m" -msgstr "não pôde remover arquivo de bloqueio antigo \"%s\": %m" +msgstr "não foi possível remover o arquivo de bloqueio antigo \"%s\": %m" -#: utils/init/miscinit.c:819 +#: utils/init/miscinit.c:1375 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." -msgstr "O arquivo parece ter sido deixado acidentalmente, mas ele não pôde ser removido. Por favor remova o arquivo manualmente e tente novamente." +msgstr "O arquivo parece ter sido deixado acidentalmente, mas não pôde ser removido. Por favor remova o arquivo manualmente e tente novamente." -#: utils/init/miscinit.c:855 utils/init/miscinit.c:866 -#: utils/init/miscinit.c:876 +#: utils/init/miscinit.c:1412 utils/init/miscinit.c:1426 +#: utils/init/miscinit.c:1437 #, c-format msgid "could not write lock file \"%s\": %m" -msgstr "não pôde escrever no arquivo de bloqueio \"%s\": %m" +msgstr "não foi possível escrever no arquivo de bloqueio \"%s\": %m" -#: utils/init/miscinit.c:1001 utils/misc/guc.c:8381 +#: utils/init/miscinit.c:1548 utils/init/miscinit.c:1690 utils/misc/guc.c:5597 #, c-format msgid "could not read from file \"%s\": %m" -msgstr "não pôde ler do arquivo \"%s\": %m" +msgstr "não foi possível ler do arquivo \"%s\": %m" -#: utils/init/miscinit.c:1115 utils/init/miscinit.c:1128 +#: utils/init/miscinit.c:1678 +#, c-format +msgid "could not open file \"%s\": %m; continuing anyway" +msgstr "não foi possível abrir o arquivo \"%s\": %m; continuando mesmo assim" + +#: utils/init/miscinit.c:1703 +#, c-format +msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" +msgstr "arquivo de bloqueio \"%s\" contém o PID errado: %ld em vez de %ld" + +#: utils/init/miscinit.c:1742 utils/init/miscinit.c:1758 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\" não é um diretório de dados válido" -#: utils/init/miscinit.c:1117 +#: utils/init/miscinit.c:1744 #, c-format msgid "File \"%s\" is missing." msgstr "Arquivo \"%s\" está ausente." -#: utils/init/miscinit.c:1130 +#: utils/init/miscinit.c:1760 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Arquivo \"%s\" não contém dados válidos." -#: utils/init/miscinit.c:1132 +#: utils/init/miscinit.c:1762 #, c-format msgid "You might need to initdb." msgstr "Você precisa executar o initdb." -#: utils/init/miscinit.c:1140 +#: utils/init/miscinit.c:1770 +#, c-format +msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." +msgstr "O diretório de dados foi inicializado pela versão %s do PostgreSQL, que não é compatível com essa versão %s." + +#: utils/init/postinit.c:259 +#, c-format +msgid "replication connection authorized: user=%s" +msgstr "conexão de replicação autorizada: usuário=%s" + +#: utils/init/postinit.c:262 +#, c-format +msgid "connection authorized: user=%s" +msgstr "conexão autorizada: usuário=%s" + +#: utils/init/postinit.c:265 +#, c-format +msgid " database=%s" +msgstr "banco de dados=%s" + +#: utils/init/postinit.c:268 +#, c-format +msgid " application_name=%s" +msgstr " application_name=%s" + +#: utils/init/postinit.c:273 +#, c-format +msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" +msgstr "SSL ativado (protocolo=%s, encriptação=%s, bits=%d)" + +#: utils/init/postinit.c:285 +#, c-format +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s, principal=%s)" +msgstr "" + +#: utils/init/postinit.c:286 utils/init/postinit.c:287 +#: utils/init/postinit.c:288 utils/init/postinit.c:293 +#: utils/init/postinit.c:294 utils/init/postinit.c:295 +msgid "no" +msgstr "não" + +#: utils/init/postinit.c:286 utils/init/postinit.c:287 +#: utils/init/postinit.c:288 utils/init/postinit.c:293 +#: utils/init/postinit.c:294 utils/init/postinit.c:295 +msgid "yes" +msgstr "sim" + +#: utils/init/postinit.c:292 +#, c-format +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)" +msgstr "" + +#: utils/init/postinit.c:333 +#, c-format +msgid "database \"%s\" has disappeared from pg_database" +msgstr "banco de dados \"%s\" desapareceu de pg_database" + +#: utils/init/postinit.c:335 +#, c-format +msgid "Database OID %u now seems to belong to \"%s\"." +msgstr "Banco de dados com OID %u parece pertencer a \"%s\"." + +#: utils/init/postinit.c:355 +#, c-format +msgid "database \"%s\" is not currently accepting connections" +msgstr "banco de dados \"%s\" não está aceitando conexões" + +#: utils/init/postinit.c:368 +#, c-format +msgid "permission denied for database \"%s\"" +msgstr "permissão negada para banco de dados \"%s\"" + +#: utils/init/postinit.c:369 +#, c-format +msgid "User does not have CONNECT privilege." +msgstr "Usuário não tem privilégio CONNECT." + +#: utils/init/postinit.c:386 +#, c-format +msgid "too many connections for database \"%s\"" +msgstr "muitas conexões para banco de dados \"%s\"" + +#: utils/init/postinit.c:410 utils/init/postinit.c:417 +#, c-format +msgid "database locale is incompatible with operating system" +msgstr "configuração regional do banco de dados é incompatível com o sistema operacional" + +#: utils/init/postinit.c:411 +#, c-format +msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." +msgstr "O banco de dados foi inicializado com LC_COLLATE \"%s\", que não é reconhecido pelo setlocale()." + +#: utils/init/postinit.c:413 utils/init/postinit.c:420 +#, c-format +msgid "Recreate the database with another locale or install the missing locale." +msgstr "Recrie o banco de dados com outra configuração regional ou instale a configuração regional ausente." + +#: utils/init/postinit.c:418 +#, c-format +msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." +msgstr "O banco de dados foi inicializado com LC_CTYPE \"%s\", que não é reconhecido pelo setlocale()." + +#: utils/init/postinit.c:475 +#, c-format +msgid "database \"%s\" has a collation version mismatch" +msgstr "o banco de dados \"%s\" possui uma não correspondência de versão de ordenação" + +#: utils/init/postinit.c:477 +#, c-format +msgid "The database was created using collation version %s, but the operating system provides version %s." +msgstr "" + +#: utils/init/postinit.c:480 +#, c-format +msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." +msgstr "" + +#: utils/init/postinit.c:891 +#, c-format +msgid "no roles are defined in this database system" +msgstr "nenhuma role está definida nesse sistema de banco de dados" + +#: utils/init/postinit.c:892 +#, c-format +msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." +msgstr "Você deve executar imediatamente CREATE USER \"%s\" SUPERUSER;." + +#: utils/init/postinit.c:928 +#, c-format +msgid "must be superuser to connect in binary upgrade mode" +msgstr "é necessário ser superusuário para se conectar no modo de atualização binária" + +#: utils/init/postinit.c:949 +#, c-format +msgid "remaining connection slots are reserved for roles with the %s attribute" +msgstr "os encaixes de conexão restantes estão reservados para funções de banco de dados (roles) com o atributo %s" + +#: utils/init/postinit.c:955 +#, c-format +msgid "remaining connection slots are reserved for roles with privileges of the \"%s\" role" +msgstr "os encaixes de conexão restantes estão reservados para funções de banco de dados (roles) com privilégios da funções de banco de dados \"%s\"" + +#: utils/init/postinit.c:967 +#, c-format +msgid "permission denied to start WAL sender" +msgstr "permissão negada para iniciar o remetente de WAL" + +#: utils/init/postinit.c:968 +#, c-format +msgid "Only roles with the %s attribute may start a WAL sender process." +msgstr "" + +#: utils/init/postinit.c:1086 +#, c-format +msgid "It seems to have just been dropped or renamed." +msgstr "Parece ter sido removido ou renomeado." + +#: utils/init/postinit.c:1090 +#, c-format +msgid "database %u does not exist" +msgstr "banco de dados %u não existe" + +#: utils/init/postinit.c:1099 +#, c-format +msgid "cannot connect to invalid database \"%s\"" +msgstr "não é possível conectar ao banco de dados inválido \"%s\"" + +#: utils/init/postinit.c:1159 +#, c-format +msgid "The database subdirectory \"%s\" is missing." +msgstr "O subdiretório do banco de dados \"%s\" está ausente." + +#: utils/init/usercontext.c:43 +#, c-format +msgid "role \"%s\" cannot SET ROLE to \"%s\"" +msgstr "a função de banco de dados (role) \"%s\" não pode executar SET ROLE para \"%s\"" + +#: utils/mb/conv.c:522 utils/mb/conv.c:733 +#, c-format +msgid "invalid encoding number: %d" +msgstr "número de codificação é inválido: %d" + +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:129 +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:165 +#, c-format +msgid "unexpected encoding ID %d for ISO 8859 character sets" +msgstr "ID de codificação não esperado %d para conjuntos de caracteres ISO 8859" + +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:110 +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:146 +#, c-format +msgid "unexpected encoding ID %d for WIN character sets" +msgstr "ID de codificação não esperado %d para conjuntos de caracteres WIN" + +#: utils/mb/mbutils.c:298 utils/mb/mbutils.c:901 +#, c-format +msgid "conversion between %s and %s is not supported" +msgstr "conversão entre %s e %s não tem suporte" + +#: utils/mb/mbutils.c:403 utils/mb/mbutils.c:431 utils/mb/mbutils.c:816 +#: utils/mb/mbutils.c:843 +#, c-format +msgid "String of %d bytes is too long for encoding conversion." +msgstr "Cadeia de caracteres de %d bytes é muito longa para conversão entre codificações." + +#: utils/mb/mbutils.c:569 +#, c-format +msgid "invalid source encoding name \"%s\"" +msgstr "nome da codificação de origem \"%s\" é inválido" + +#: utils/mb/mbutils.c:574 +#, c-format +msgid "invalid destination encoding name \"%s\"" +msgstr "nome da codificação de destino \"%s\" é inválido" + +#: utils/mb/mbutils.c:714 +#, c-format +msgid "invalid byte value for encoding \"%s\": 0x%02x" +msgstr "valor de byte é inválido para codificação \"%s\": 0x%02x" + +#: utils/mb/mbutils.c:878 +#, c-format +msgid "invalid Unicode code point" +msgstr "ponto de código Unicode inválido" + +#: utils/mb/mbutils.c:1204 +#, c-format +msgid "bind_textdomain_codeset failed" +msgstr "bind_textdomain_codeset falhou" + +#: utils/mb/mbutils.c:1725 +#, c-format +msgid "invalid byte sequence for encoding \"%s\": %s" +msgstr "sequência de bytes é inválida para codificação \"%s\": %s" + +#: utils/mb/mbutils.c:1758 +#, c-format +msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" +msgstr "caractere com sequência de bytes %s na codificação \"%s\" não tem equivalente na codificação \"%s\"" + +#: utils/misc/conffiles.c:88 +#, c-format +msgid "empty configuration directory name: \"%s\"" +msgstr "nome do diretório de configuração vazio: \"%s\"" + +#: utils/misc/conffiles.c:100 +#, c-format +msgid "could not open configuration directory \"%s\": %m" +msgstr "não foi possível abrir o diretório de configuração \"%s\": %m" + +#: utils/misc/guc.c:115 +msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." +msgstr "As unidades válidas para esse parâmetro são \"B\", \"kB\", \"MB\", \"GB\", e \"TB\"." + +#: utils/misc/guc.c:152 +msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." +msgstr "As unidades válidas para esse parâmetro são \"us\", \"ms\", \"s\", \"min\", \"h\", e \"d\"." + +#: utils/misc/guc.c:421 +#, c-format +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "parâmetro de configuração \"%s\" não reconhecido no arquivo \"%s\" linha %d" + +#: utils/misc/guc.c:461 utils/misc/guc.c:3411 utils/misc/guc.c:3655 +#: utils/misc/guc.c:3753 utils/misc/guc.c:3851 utils/misc/guc.c:3975 +#: utils/misc/guc.c:4078 #, c-format -msgid "The data directory was initialized by PostgreSQL version %ld.%ld, which is not compatible with this version %s." -msgstr "O diretório de dados foi inicializado pelo PostgreSQL versão %ld.%ld, que não é compatível com essa versão %s." +msgid "parameter \"%s\" cannot be changed without restarting the server" +msgstr "parâmetro \"%s\" não pode ser mudado sem reiniciar o servidor" -#: utils/init/miscinit.c:1211 +#: utils/misc/guc.c:497 #, c-format -msgid "loaded library \"%s\"" -msgstr "biblioteca \"%s\" foi carregada" +msgid "parameter \"%s\" removed from configuration file, reset to default" +msgstr "parâmetro \"%s\" foi removido do arquivo de configuração, reiniciar para padrão" -#: utils/init/postinit.c:237 +#: utils/misc/guc.c:562 #, c-format -msgid "replication connection authorized: user=%s SSL enabled (protocol=%s, cipher=%s, compression=%s)" -msgstr "conexão de replicação autorizada: usuário=%s SSL habilitado (protocolo=%s, cifra=%s, compressão=%s)" +msgid "parameter \"%s\" changed to \"%s\"" +msgstr "parâmetro \"%s\" mudou para \"%s\"" -#: utils/init/postinit.c:239 utils/init/postinit.c:253 -msgid "off" -msgstr "desabilitado" +#: utils/misc/guc.c:604 +#, c-format +msgid "configuration file \"%s\" contains errors" +msgstr "arquivo de configuração \"%s\" contém erros" -#: utils/init/postinit.c:239 utils/init/postinit.c:253 -msgid "on" -msgstr "habilitado" +#: utils/misc/guc.c:609 +#, c-format +msgid "configuration file \"%s\" contains errors; unaffected changes were applied" +msgstr "arquivo de configuração \"%s\" contém erros; alterações não afetadas foram aplicadas" -#: utils/init/postinit.c:243 +#: utils/misc/guc.c:614 #, c-format -msgid "replication connection authorized: user=%s" -msgstr "conexão de replicação autorizada: usuário=%s" +msgid "configuration file \"%s\" contains errors; no changes were applied" +msgstr "arquivo de configuração \"%s\" contém erros; nenhuma alteração foi aplicada" -#: utils/init/postinit.c:251 +#: utils/misc/guc.c:1211 utils/misc/guc.c:1227 #, c-format -msgid "connection authorized: user=%s database=%s SSL enabled (protocol=%s, cipher=%s, compression=%s)" -msgstr "conexão autorizada: usuário=%s banco de dados=%s SSL habilitado (protocolo=%s, cifra=%s, compressão=%s)" +msgid "invalid configuration parameter name \"%s\"" +msgstr "nome de parâmetro de configuração inválido \"%s\"" -#: utils/init/postinit.c:257 +#: utils/misc/guc.c:1213 #, c-format -msgid "connection authorized: user=%s database=%s" -msgstr "conexão autorizada: usuário=%s banco de dados=%s" +msgid "Custom parameter names must be two or more simple identifiers separated by dots." +msgstr "" -#: utils/init/postinit.c:289 +#: utils/misc/guc.c:1229 #, c-format -msgid "database \"%s\" has disappeared from pg_database" -msgstr "banco de dados \"%s\" desapareceu de pg_database" +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\" é um prefixo reservado." -#: utils/init/postinit.c:291 +#: utils/misc/guc.c:1243 #, c-format -msgid "Database OID %u now seems to belong to \"%s\"." -msgstr "Banco de dados com OID %u parece pertencer a \"%s\"." +msgid "unrecognized configuration parameter \"%s\"" +msgstr "parâmetro de configuração \"%s\" desconhecido" -#: utils/init/postinit.c:311 +#: utils/misc/guc.c:1767 #, c-format -msgid "database \"%s\" is not currently accepting connections" -msgstr "banco de dados \"%s\" não está aceitando conexões" +msgid "%s: could not access directory \"%s\": %s\n" +msgstr "%s: não foi possível acessar o diretório \"%s\": %s\n" -#: utils/init/postinit.c:324 +#: utils/misc/guc.c:1772 #, c-format -msgid "permission denied for database \"%s\"" -msgstr "permissão negada para banco de dados \"%s\"" +msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" +msgstr "Execute initdb ou pg_basebackup para inicializar o diretório de dados do PostgreSQL.\n" -#: utils/init/postinit.c:325 +#: utils/misc/guc.c:1796 #, c-format -msgid "User does not have CONNECT privilege." -msgstr "Usuário não tem privilégio CONNECT." +msgid "" +"%s does not know where to find the server configuration file.\n" +"You must specify the --config-file or -D invocation option or set the PGDATA environment variable.\n" +msgstr "" +"%s não sabe onde encontrar o arquivo de configuração do servidor.\n" +"Você deve especificar a opção --config-file ou -D ou definir uma variável de ambiente PGDATA.\n" -#: utils/init/postinit.c:342 +#: utils/misc/guc.c:1819 #, c-format -msgid "too many connections for database \"%s\"" -msgstr "muitas conexões para banco de dados \"%s\"" +msgid "%s: could not access the server configuration file \"%s\": %s\n" +msgstr "%s: não foi possível acessar o arquivo de configuração do servidor \"%s\": %s\n" -#: utils/init/postinit.c:364 utils/init/postinit.c:371 +#: utils/misc/guc.c:1847 #, c-format -msgid "database locale is incompatible with operating system" -msgstr "configuração regional do banco de dados é incompatível com o sistema operacional" +msgid "" +"%s does not know where to find the database system data.\n" +"This can be specified as \"data_directory\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "" +"%s não sabe onde encontrar os dados do sistema de banco de dados.\n" +"Isto pode ser especificado como \"data_directory\" no \"%s\", pela opção -D ou definindo uma variável de ambiente PGDATA.\n" -#: utils/init/postinit.c:365 +#: utils/misc/guc.c:1899 #, c-format -msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." -msgstr "O banco de dados foi inicializado com LC_COLLATE \"%s\", que não é reconhecido pelo setlocale()." +msgid "" +"%s does not know where to find the \"hba\" configuration file.\n" +"This can be specified as \"hba_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "" +"%s não sabe onde encontrar o arquivo de configuração \"hba\".\n" +"Isto pode ser especificado como \"hba_file\" no \"%s\", pela opção -D ou definindo uma variável de ambiente PGDATA.\n" -#: utils/init/postinit.c:367 utils/init/postinit.c:374 +#: utils/misc/guc.c:1930 #, c-format -msgid "Recreate the database with another locale or install the missing locale." -msgstr "Recrie o banco de dados com outra configuração regional ou instale a configuração regional ausente." +msgid "" +"%s does not know where to find the \"ident\" configuration file.\n" +"This can be specified as \"ident_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "" +"%s não sabe onde encontrar o arquivo de configuração \"ident\".\n" +"Isto pode ser especificado como \"ident_file\" no \"%s\", pela opção -D ou definindo uma variável de ambiente PGDATA.\n" + +#: utils/misc/guc.c:2896 +msgid "Value exceeds integer range." +msgstr "Valor excede intervalo de inteiros." -#: utils/init/postinit.c:372 +#: utils/misc/guc.c:3132 #, c-format -msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." -msgstr "O banco de dados foi inicializado com LC_CTYPE \"%s\", que não é reconhecido pelo setlocale()." +msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" +msgstr "%d%s%s está fora do intervalo válido para o parâmetro \"%s\" (%d .. %d)" -#: utils/init/postinit.c:667 +#: utils/misc/guc.c:3168 #, c-format -msgid "no roles are defined in this database system" -msgstr "nenhuma role está definida nesse sistema de banco de dados" +msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" +msgstr "%g%s%s está fora do intervalo válido para o parâmetro \"%s\" (%g .. %g)" -#: utils/init/postinit.c:668 +#: utils/misc/guc.c:3369 utils/misc/guc_funcs.c:54 #, c-format -msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." -msgstr "Você deve executar imediatamente CREATE USER \"%s\" SUPERUSER;." +msgid "cannot set parameters during a parallel operation" +msgstr "não é possível definir parâmetros durante uma operação paralela" -#: utils/init/postinit.c:704 +#: utils/misc/guc.c:3388 utils/misc/guc.c:4539 #, c-format -msgid "new replication connections are not allowed during database shutdown" -msgstr "novas conexões de replicação não são permitidas durante desligamento de banco de dados" +msgid "parameter \"%s\" cannot be changed" +msgstr "parâmetro \"%s\" não pode ser mudado" -#: utils/init/postinit.c:708 +#: utils/misc/guc.c:3421 #, c-format -msgid "must be superuser to connect during database shutdown" -msgstr "deve ser super-usuário para se conectar durante desligamento de banco de dados" +msgid "parameter \"%s\" cannot be changed now" +msgstr "parâmetro \"%s\" não pode ser mudado agora" -#: utils/init/postinit.c:718 +#: utils/misc/guc.c:3448 utils/misc/guc.c:3510 utils/misc/guc.c:4515 +#: utils/misc/guc.c:6563 #, c-format -msgid "must be superuser to connect in binary upgrade mode" -msgstr "deve ser super-usuário para se conectar no modo de atualização binária" +msgid "permission denied to set parameter \"%s\"" +msgstr "permissão negada ao definir parâmetro \"%s\"" -#: utils/init/postinit.c:732 +#: utils/misc/guc.c:3490 #, c-format -msgid "remaining connection slots are reserved for non-replication superuser connections" -msgstr "lacunas de conexão remanescentes são reservadas para conexões de super-usuário que não sejam usadas para replicação" +msgid "parameter \"%s\" cannot be set after connection start" +msgstr "parâmetro \"%s\" não pode ser definido depois que a conexão foi iniciada" -#: utils/init/postinit.c:742 +#: utils/misc/guc.c:3549 #, c-format -msgid "must be superuser or replication role to start walsender" -msgstr "deve ser super-usuário ou role de replicação para iniciar walsender" +msgid "cannot set parameter \"%s\" within security-definer function" +msgstr "não é possível definir o parâmetro \"%s\" em função definidora de segurança" -#: utils/init/postinit.c:811 +#: utils/misc/guc.c:3570 #, c-format -msgid "database %u does not exist" -msgstr "banco de dados %u não existe" +msgid "parameter \"%s\" cannot be reset" +msgstr "o parâmetro \"%s\" não pode ser redefinido" -#: utils/init/postinit.c:863 +#: utils/misc/guc.c:3577 #, c-format -msgid "It seems to have just been dropped or renamed." -msgstr "Parece ter sido removido ou renomeado." +msgid "parameter \"%s\" cannot be set locally in functions" +msgstr "o parâmetro \"%s\" não pode ser definido localmente em funções" -#: utils/init/postinit.c:881 +#: utils/misc/guc.c:4221 utils/misc/guc.c:4268 utils/misc/guc.c:5282 #, c-format -msgid "The database subdirectory \"%s\" is missing." -msgstr "O subdiretório do banco de dados \"%s\" está ausente." +msgid "permission denied to examine \"%s\"" +msgstr "permissão negada para examinar \"%s\"" -#: utils/init/postinit.c:886 +#: utils/misc/guc.c:4222 utils/misc/guc.c:4269 utils/misc/guc.c:5283 #, c-format -msgid "could not access directory \"%s\": %m" -msgstr "não pôde acessar diretório \"%s\": %m" +msgid "Only roles with privileges of the \"%s\" role may examine this parameter." +msgstr "" -#: utils/mb/conv.c:519 +#: utils/misc/guc.c:4505 #, c-format -msgid "invalid encoding number: %d" -msgstr "número de codificação é inválido: %d" +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "permissão negada para executar ALTER SYSTEM RESET ALL" -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:136 -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:163 +#: utils/misc/guc.c:4571 #, c-format -msgid "unexpected encoding ID %d for ISO 8859 character sets" -msgstr "ID de codificação %d é inesperado para conjuntos de caracteres ISO 8859" +msgid "parameter value for ALTER SYSTEM must not contain a newline" +msgstr "" -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:126 -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:153 +#: utils/misc/guc.c:4617 #, c-format -msgid "unexpected encoding ID %d for WIN character sets" -msgstr "ID de codificação %d é inesperado para conjuntos de caracteres WIN" +msgid "could not parse contents of file \"%s\"" +msgstr "não foi possível analisar o conteúdo do arquivo \"%s\"" -#: utils/mb/encnames.c:496 +#: utils/misc/guc.c:4799 #, c-format -msgid "encoding name too long" -msgstr "nome da codificação é muito longo" +msgid "attempt to redefine parameter \"%s\"" +msgstr "tentativa de redefinir parâmetro \"%s\"" -#: utils/mb/mbutils.c:307 +#: utils/misc/guc.c:5138 #, c-format -msgid "conversion between %s and %s is not supported" -msgstr "conversão entre %s e %s não é suportada" +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "nome de parâmetro de configuração inválido \"%s\", removendo-o" -#: utils/mb/mbutils.c:366 +#: utils/misc/guc.c:5140 #, c-format -msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" -msgstr "função padrão de conversão da codificação \"%s\" para \"%s\" não existe" +msgid "\"%s\" is now a reserved prefix." +msgstr "\"%s\" agora é um prefixo reservado." -#: utils/mb/mbutils.c:377 utils/mb/mbutils.c:710 +#: utils/misc/guc.c:6017 #, c-format -msgid "String of %d bytes is too long for encoding conversion." -msgstr "Cadeia de caracteres de %d bytes é muito longa para conversão entre codificações." +msgid "while setting parameter \"%s\" to \"%s\"" +msgstr "ao definir o parâmetro \"%s\" para \"%s\"" -#: utils/mb/mbutils.c:464 +#: utils/misc/guc.c:6186 #, c-format -msgid "invalid source encoding name \"%s\"" -msgstr "nome da codificação de origem \"%s\" é inválido" +msgid "parameter \"%s\" could not be set" +msgstr "não foi possível definir o parâmetro \"%s\"" -#: utils/mb/mbutils.c:469 +#: utils/misc/guc.c:6276 #, c-format -msgid "invalid destination encoding name \"%s\"" -msgstr "nome da codificação de destino \"%s\" é inválido" +msgid "could not parse setting for parameter \"%s\"" +msgstr "não foi possível analisar a configuração do parâmetro \"%s\"" -#: utils/mb/mbutils.c:609 +#: utils/misc/guc.c:6695 #, c-format -msgid "invalid byte value for encoding \"%s\": 0x%02x" -msgstr "valor de byte é inválido para codificação \"%s\": 0x%02x" +msgid "invalid value for parameter \"%s\": %g" +msgstr "valor é inválido para parâmetro \"%s\": %g" -#: utils/mb/mbutils.c:951 +#: utils/misc/guc_funcs.c:130 #, c-format -msgid "bind_textdomain_codeset failed" -msgstr "bind_textdomain_codeset falhou" +msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" +msgstr "SET LOCAL TRANSACTION SNAPSHOT não está implementado" -#: utils/mb/wchar.c:2009 +#: utils/misc/guc_funcs.c:218 #, c-format -msgid "invalid byte sequence for encoding \"%s\": %s" -msgstr "sequência de bytes é inválida para codificação \"%s\": %s" +msgid "SET %s takes only one argument" +msgstr "SET %s só tem um argumento" -#: utils/mb/wchar.c:2042 +#: utils/misc/guc_funcs.c:342 #, c-format -msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" -msgstr "caracter com sequência de bytes %s na codificação \"%s\" não tem equivalente na codificação \"%s\"" +msgid "SET requires parameter name" +msgstr "SET requer nome do parâmetro" -#: utils/misc/guc.c:552 +#: utils/misc/guc_tables.c:662 msgid "Ungrouped" msgstr "Desagrupado" -#: utils/misc/guc.c:554 +#: utils/misc/guc_tables.c:664 msgid "File Locations" msgstr "Locais de Arquivos" -#: utils/misc/guc.c:556 -msgid "Connections and Authentication" -msgstr "Conexões e Autenticação" - -#: utils/misc/guc.c:558 +#: utils/misc/guc_tables.c:666 msgid "Connections and Authentication / Connection Settings" msgstr "Conexões e Autenticação / Configurações sobre Conexão" -#: utils/misc/guc.c:560 -msgid "Connections and Authentication / Security and Authentication" -msgstr "Conexões e Autenticação / Segurança e Autenticação" +#: utils/misc/guc_tables.c:668 +msgid "Connections and Authentication / TCP Settings" +msgstr "Conexões e Autenticação / Configurações TCP" -#: utils/misc/guc.c:562 -msgid "Resource Usage" -msgstr "Uso de Recursos" +#: utils/misc/guc_tables.c:670 +msgid "Connections and Authentication / Authentication" +msgstr "Conexões e Autenticação / Autenticação" -#: utils/misc/guc.c:564 +#: utils/misc/guc_tables.c:672 +msgid "Connections and Authentication / SSL" +msgstr "Conexões e Autenticação / SSL" + +#: utils/misc/guc_tables.c:674 msgid "Resource Usage / Memory" msgstr "Uso de Recursos / Memória" -#: utils/misc/guc.c:566 +#: utils/misc/guc_tables.c:676 msgid "Resource Usage / Disk" msgstr "Uso de Recursos / Disco" -#: utils/misc/guc.c:568 +#: utils/misc/guc_tables.c:678 msgid "Resource Usage / Kernel Resources" msgstr "Uso de Recursos / Recursos do Kernel" -#: utils/misc/guc.c:570 +#: utils/misc/guc_tables.c:680 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Uso de Recursos / Atraso de Limpeza Baseado em Custo" -#: utils/misc/guc.c:572 +#: utils/misc/guc_tables.c:682 msgid "Resource Usage / Background Writer" msgstr "Uso de Recursos / Escritor de Segundo Plano" -#: utils/misc/guc.c:574 +#: utils/misc/guc_tables.c:684 msgid "Resource Usage / Asynchronous Behavior" msgstr "Uso de Recursos / Comportamento Assíncrono" -#: utils/misc/guc.c:576 -msgid "Write-Ahead Log" -msgstr "Log de Escrita Prévia" - -#: utils/misc/guc.c:578 +#: utils/misc/guc_tables.c:686 msgid "Write-Ahead Log / Settings" msgstr "Log de Escrita Prévia / Configurações" -#: utils/misc/guc.c:580 +#: utils/misc/guc_tables.c:688 msgid "Write-Ahead Log / Checkpoints" msgstr "Log de Escrita Prévia / Pontos de Controle" -#: utils/misc/guc.c:582 +#: utils/misc/guc_tables.c:690 msgid "Write-Ahead Log / Archiving" msgstr "Log de Escrita Prévia / Arquivamento" -#: utils/misc/guc.c:584 -msgid "Replication" -msgstr "Replicação" +#: utils/misc/guc_tables.c:692 +msgid "Write-Ahead Log / Recovery" +msgstr "WAL / Recuperação" + +#: utils/misc/guc_tables.c:694 +msgid "Write-Ahead Log / Archive Recovery" +msgstr "WAL / Recuperação de Arquivamento" + +#: utils/misc/guc_tables.c:696 +msgid "Write-Ahead Log / Recovery Target" +msgstr "WAL / Meta da Recuperação" -#: utils/misc/guc.c:586 +#: utils/misc/guc_tables.c:698 msgid "Replication / Sending Servers" msgstr "Replicação / Servidores de Envio" -#: utils/misc/guc.c:588 -msgid "Replication / Master Server" -msgstr "Replicação / Servidor Principal" +#: utils/misc/guc_tables.c:700 +msgid "Replication / Primary Server" +msgstr "Replicação / Servidor Primário" -#: utils/misc/guc.c:590 +#: utils/misc/guc_tables.c:702 msgid "Replication / Standby Servers" msgstr "Replicação / Servidores em Espera" -#: utils/misc/guc.c:592 -msgid "Query Tuning" -msgstr "Ajuste de Consultas" +#: utils/misc/guc_tables.c:704 +msgid "Replication / Subscribers" +msgstr "Replicação / Subscritores" -#: utils/misc/guc.c:594 +#: utils/misc/guc_tables.c:706 msgid "Query Tuning / Planner Method Configuration" msgstr "Ajuste de Consultas / Configuração dos Métodos do Planejador" -#: utils/misc/guc.c:596 +#: utils/misc/guc_tables.c:708 msgid "Query Tuning / Planner Cost Constants" msgstr "Ajuste de Consultas / Constantes de Custo do Planejador" -#: utils/misc/guc.c:598 +#: utils/misc/guc_tables.c:710 msgid "Query Tuning / Genetic Query Optimizer" msgstr "Ajuste de Consultas / Otimizador de Consultas Genéticas" -#: utils/misc/guc.c:600 +#: utils/misc/guc_tables.c:712 msgid "Query Tuning / Other Planner Options" msgstr "Ajuste de Consultas / Outras Opções do Planejador" -#: utils/misc/guc.c:602 -msgid "Reporting and Logging" -msgstr "Relatório e Registro" - -#: utils/misc/guc.c:604 +#: utils/misc/guc_tables.c:714 msgid "Reporting and Logging / Where to Log" msgstr "Relatório e Registro / Onde Registrar" -#: utils/misc/guc.c:606 +#: utils/misc/guc_tables.c:716 msgid "Reporting and Logging / When to Log" msgstr "Relatório e Registro / Quando Registrar" -#: utils/misc/guc.c:608 +#: utils/misc/guc_tables.c:718 msgid "Reporting and Logging / What to Log" msgstr "Relatório e Registro / O que Registrar" -#: utils/misc/guc.c:610 -msgid "Statistics" -msgstr "Estatísticas" +#: utils/misc/guc_tables.c:720 +msgid "Reporting and Logging / Process Title" +msgstr "Relatórios e Registros / Título do Processo" -#: utils/misc/guc.c:612 +#: utils/misc/guc_tables.c:722 msgid "Statistics / Monitoring" msgstr "Estatísticas / Monitoramento" -#: utils/misc/guc.c:614 -msgid "Statistics / Query and Index Statistics Collector" -msgstr "Estatísticas / Coletor de Estatísticas de Consultas e Ãndices" +#: utils/misc/guc_tables.c:724 +msgid "Statistics / Cumulative Query and Index Statistics" +msgstr "Estatísticas / Consulta Cumulativa e Estatísticas de Ãndice" -#: utils/misc/guc.c:616 +#: utils/misc/guc_tables.c:726 msgid "Autovacuum" msgstr "Limpeza Automática" -#: utils/misc/guc.c:618 -msgid "Client Connection Defaults" -msgstr "Valores Padrão de Conexão" - -#: utils/misc/guc.c:620 +#: utils/misc/guc_tables.c:728 msgid "Client Connection Defaults / Statement Behavior" msgstr "Valores Padrão de Conexão / Comportamento do Comando" -#: utils/misc/guc.c:622 +#: utils/misc/guc_tables.c:730 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Valores Padrão de Conexão / Configuração Regional e Formatação" -#: utils/misc/guc.c:624 +#: utils/misc/guc_tables.c:732 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Valores Padrão de Conexão / Pré-Carregamento de Biblioteca Compartilhada" -#: utils/misc/guc.c:626 +#: utils/misc/guc_tables.c:734 msgid "Client Connection Defaults / Other Defaults" msgstr "Valores Padrão de Conexão / Outros Valores" -#: utils/misc/guc.c:628 +#: utils/misc/guc_tables.c:736 msgid "Lock Management" msgstr "Gerência de Bloqueio" -#: utils/misc/guc.c:630 -msgid "Version and Platform Compatibility" -msgstr "Compatibilidade de Versão e Plataforma" - -#: utils/misc/guc.c:632 +#: utils/misc/guc_tables.c:738 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Compatibilidade de Versão e Plataforma / Versões Anteriores do PostgreSQL" -#: utils/misc/guc.c:634 +#: utils/misc/guc_tables.c:740 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Compatibilidade de Versão e Plataforma / Outras Plataformas e Clientes" -#: utils/misc/guc.c:636 +#: utils/misc/guc_tables.c:742 msgid "Error Handling" msgstr "Manipulação de Erro" -#: utils/misc/guc.c:638 +#: utils/misc/guc_tables.c:744 msgid "Preset Options" msgstr "Opções Pré-Definidas" -#: utils/misc/guc.c:640 +#: utils/misc/guc_tables.c:746 msgid "Customized Options" msgstr "Opções Customizadas" -#: utils/misc/guc.c:642 +#: utils/misc/guc_tables.c:748 msgid "Developer Options" msgstr "Opções para Desenvolvedores" -#: utils/misc/guc.c:696 +#: utils/misc/guc_tables.c:805 msgid "Enables the planner's use of sequential-scan plans." -msgstr "Habilita o uso de planos de busca sequencial pelo planejador." +msgstr "Ativa o uso de planos de varredura sequencial pelo planejador." -#: utils/misc/guc.c:705 +#: utils/misc/guc_tables.c:815 msgid "Enables the planner's use of index-scan plans." -msgstr "Habilita o uso de planos de buscas por índices pelo planejador." +msgstr "Ativa o uso de planos de varredura de índices pelo planejador." -#: utils/misc/guc.c:714 +#: utils/misc/guc_tables.c:825 msgid "Enables the planner's use of index-only-scan plans." -msgstr "Habilita o uso de planos de buscas apenas com índices pelo planejador." +msgstr "Ativa o uso de planos de varredura somente de índice pelo planejador." -#: utils/misc/guc.c:723 +#: utils/misc/guc_tables.c:835 msgid "Enables the planner's use of bitmap-scan plans." -msgstr "Habilita o uso de planos de buscas por bitmaps pelo planejador." +msgstr "Ativa o uso de planos de varredura de bitmaps pelo planejador." -#: utils/misc/guc.c:732 +#: utils/misc/guc_tables.c:845 msgid "Enables the planner's use of TID scan plans." -msgstr "Habilita o uso de planos de buscas por TID pelo planejador." +msgstr "Ativa o uso de planos de varredura de TID pelo planejador." -#: utils/misc/guc.c:741 +#: utils/misc/guc_tables.c:855 msgid "Enables the planner's use of explicit sort steps." -msgstr "Habilita o uso de passos para ordenação explícita pelo planejador." +msgstr "Ativa o uso de etapas de classificação explícitas pelo planejador." + +#: utils/misc/guc_tables.c:865 +msgid "Enables the planner's use of incremental sort steps." +msgstr "Ativa o uso de etapas de classificação incrementais pelo planejador." -#: utils/misc/guc.c:750 +#: utils/misc/guc_tables.c:875 msgid "Enables the planner's use of hashed aggregation plans." -msgstr "Habilita o uso de planos de agregação do tipo hash pelo planejador." +msgstr "Ativa o uso de planos de agregação por hash pelo planejador." -#: utils/misc/guc.c:759 +#: utils/misc/guc_tables.c:885 msgid "Enables the planner's use of materialization." -msgstr "Habilita o uso de materialização pelo planejador." +msgstr "Ativa o uso de materialização pelo planejador." -#: utils/misc/guc.c:768 +#: utils/misc/guc_tables.c:895 +msgid "Enables the planner's use of memoization." +msgstr "Ativa o uso de memorização pelo planejador." + +#: utils/misc/guc_tables.c:905 msgid "Enables the planner's use of nested-loop join plans." -msgstr "Habilita o uso de planos de junção de laço aninhado pelo planejador." +msgstr "Ativa o uso de planos de junção de laço aninhado pelo planejador." -#: utils/misc/guc.c:777 +#: utils/misc/guc_tables.c:915 msgid "Enables the planner's use of merge join plans." -msgstr "Habilita o uso de planos de junção por mesclagem pelo planejador." +msgstr "Ativa o uso de planos de junção por mesclagem pelo planejador." -#: utils/misc/guc.c:786 +#: utils/misc/guc_tables.c:925 msgid "Enables the planner's use of hash join plans." -msgstr "Habilita o uso de planos de junção por hash pelo planejador." +msgstr "Ativa o uso de planos de junção por hash pelo planejador." + +#: utils/misc/guc_tables.c:935 +msgid "Enables the planner's use of gather merge plans." +msgstr "Ativa o uso de planos GATHER MERGE pelo planejador." + +#: utils/misc/guc_tables.c:945 +msgid "Enables partitionwise join." +msgstr "Ativa o uso de junções por partição." + +#: utils/misc/guc_tables.c:955 +msgid "Enables partitionwise aggregation and grouping." +msgstr "Ativa o uso de agregação e agrupamento por partição." + +#: utils/misc/guc_tables.c:965 +msgid "Enables the planner's use of parallel append plans." +msgstr "Ativa o uso de planos Append paralelos pelo planejador." + +#: utils/misc/guc_tables.c:975 +msgid "Enables the planner's use of parallel hash plans." +msgstr "Ativa o uso de planos hash paralelos pelo planejador." -#: utils/misc/guc.c:795 +#: utils/misc/guc_tables.c:985 +msgid "Enables plan-time and execution-time partition pruning." +msgstr "" + +#: utils/misc/guc_tables.c:986 +msgid "Allows the query planner and executor to compare partition bounds to conditions in the query to determine which partitions must be scanned." +msgstr "" + +#: utils/misc/guc_tables.c:997 +msgid "Enables the planner's ability to produce plans that provide presorted input for ORDER BY / DISTINCT aggregate functions." +msgstr "" + +#: utils/misc/guc_tables.c:1000 +msgid "Allows the query planner to build plans that provide presorted input for aggregate functions with an ORDER BY / DISTINCT clause. When disabled, implicit sorts are always performed during execution." +msgstr "" + +#: utils/misc/guc_tables.c:1012 +msgid "Enables the planner's use of async append plans." +msgstr "Permite o uso de planos Append assíncronos pelo planejador." + +#: utils/misc/guc_tables.c:1022 msgid "Enables genetic query optimization." -msgstr "Habilita a otimização de consultas genéticas." +msgstr "Ativa a otimização de consultas genéticas." -#: utils/misc/guc.c:796 +#: utils/misc/guc_tables.c:1023 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Esse algoritmo tenta fazer o planejamento sem busca exaustiva." -#: utils/misc/guc.c:806 +#: utils/misc/guc_tables.c:1034 msgid "Shows whether the current user is a superuser." -msgstr "Mostra se o usuário atual é um super-usuário." +msgstr "Mostra se o usuário atual é um superusuário." -#: utils/misc/guc.c:816 +#: utils/misc/guc_tables.c:1044 msgid "Enables advertising the server via Bonjour." -msgstr "Habilita anunciar o servidor via Bonjour." +msgstr "Ativa anunciar o servidor via Bonjour." + +#: utils/misc/guc_tables.c:1053 +msgid "Collects transaction commit time." +msgstr "Coleta a hora de efetivação da transação." -#: utils/misc/guc.c:825 +#: utils/misc/guc_tables.c:1062 msgid "Enables SSL connections." -msgstr "Habilita conexões SSL." +msgstr "Ativa conexões SSL." + +#: utils/misc/guc_tables.c:1071 +msgid "Controls whether ssl_passphrase_command is called during server reload." +msgstr "" -#: utils/misc/guc.c:834 +#: utils/misc/guc_tables.c:1080 msgid "Give priority to server ciphersuite order." msgstr "Concede prioridade à ordem do conjunto de cifras do servidor." -#: utils/misc/guc.c:843 +#: utils/misc/guc_tables.c:1089 msgid "Forces synchronization of updates to disk." msgstr "Força sincronização de atualizações com o disco." -#: utils/misc/guc.c:844 -msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This insures that a database cluster will recover to a consistent state after an operating system or hardware crash." -msgstr "O servidor utilizará a chamada do sistema fsync() em vários lugares para ter certeza que as atualizações estão gravadas fisicamente no disco. Isso assegura que o agrupamento de bancos de dados recuperará ao seu estado consistente após uma queda do sistema operacional ou de hardware." +#: utils/misc/guc_tables.c:1090 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." +msgstr "O servidor utilizará a chamada do sistema fsync() em vários lugares para ter certeza que as atualizações estão escritas fisicamente no disco. Isso assegura que o agrupamento de bancos de dados recuperará ao seu estado consistente após uma queda do sistema operacional ou de hardware." -#: utils/misc/guc.c:855 +#: utils/misc/guc_tables.c:1101 msgid "Continues processing after a checksum failure." msgstr "Continua processando após falha de soma de verificação." -#: utils/misc/guc.c:856 +#: utils/misc/guc_tables.c:1102 msgid "Detection of a checksum failure normally causes PostgreSQL to report an error, aborting the current transaction. Setting ignore_checksum_failure to true causes the system to ignore the failure (but still report a warning), and continue processing. This behavior could cause crashes or other serious problems. Only has an effect if checksums are enabled." msgstr "Detecção de falha de soma de verificação normalmente faz com que o PostgreSQL produza um erro, interrompendo a transação atual. Definindo ignore_checksum_failure para true faz com que o sistema ignore a falha (mesmo assim produz um aviso), e continua processando. Esse comportamento pode causar quedas ou outros problemas sérios. Somente tem efeito se somas de verificação estiverem habilitadas." -#: utils/misc/guc.c:870 +#: utils/misc/guc_tables.c:1116 msgid "Continues processing past damaged page headers." msgstr "Continua processando cabeçalhos antigos de páginas danificadas." -#: utils/misc/guc.c:871 +#: utils/misc/guc_tables.c:1117 msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting zero_damaged_pages to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." -msgstr "Detecção de cabeçalhos de páginas danificadas normalmente faz com que o PostgreSQL produza um erro, interrompendo a transação atual. Definindo zero_damaged_page para true faz com que o sistema ao invés de produzir um aviso, escreva zero em todas as páginas danificadas e continue o processamento. Esse comportamento destrói dados, especificadamente todos os registros da página danificada." +msgstr "Detecção de cabeçalhos de páginas danificadas normalmente faz com que o PostgreSQL produza um erro, interrompendo a transação atual. Definindo zero_damaged_page para true faz com que o sistema ao invés de produzir um aviso, escreva zero em todas as páginas danificadas e continue o processamento. Esse comportamento destrói dados, especificadamente todas as linhas da página danificada." -#: utils/misc/guc.c:884 +#: utils/misc/guc_tables.c:1130 +msgid "Continues recovery after an invalid pages failure." +msgstr "Continua a recuperação após uma falha de páginas inválidas." + +#: utils/misc/guc_tables.c:1131 +msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting ignore_invalid_pages to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." +msgstr "A detecção de registros do WAL com referências a páginas inválidas durante a recuperação faz com que o PostgreSQL gere um erro no nível PANIC, interrompedo a recuperação. Definir ignore_invalid_pages como verdade faz com que o sistema ignore referências de páginas inválidas em registros do WAL (mas ainda relate uma advertência) e continue a recuperação. Esse comportamento pode causar travamentos, perda de dados, espalhar ou ocultar corrupção ou outros problemas sérios. Só tem efeito durante a recuperação ou no modo em-espera." + +#: utils/misc/guc_tables.c:1149 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "Escreve páginas completas no WAL quando modificadas após um ponto de controle." -#: utils/misc/guc.c:885 +#: utils/misc/guc_tables.c:1150 msgid "A page write in process during an operating system crash might be only partially written to disk. During recovery, the row changes stored in WAL are not enough to recover. This option writes pages when first modified after a checkpoint to WAL so full recovery is possible." msgstr "Uma escrita de página em progresso durante uma queda do sistema operacional pode ser parcialmente escrita no disco. Durante a recuperação, as mudanças de registro armazenadas no WAL não são suficientes para recuperação. Esta opção escreve páginas quando modificadas após um ponto de controle no WAL possibilitando uma recuperação completa." -#: utils/misc/guc.c:898 -msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modifications." -msgstr "Escreve páginas completas no WAL quando modificadas após um ponto de controle, mesmo para modificações que não são críticas." +#: utils/misc/guc_tables.c:1163 +msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." +msgstr "Escrever páginas inteiras no WAL quando modificado pela primeira vez após um ponto de verificação, mesmo para uma modificação não crítica." + +#: utils/misc/guc_tables.c:1173 +msgid "Writes zeroes to new WAL files before first use." +msgstr "" + +#: utils/misc/guc_tables.c:1183 +msgid "Recycles WAL files by renaming them." +msgstr "" -#: utils/misc/guc.c:908 +#: utils/misc/guc_tables.c:1193 msgid "Logs each checkpoint." msgstr "Registra cada ponto de controle." -#: utils/misc/guc.c:917 +#: utils/misc/guc_tables.c:1202 msgid "Logs each successful connection." msgstr "Registra cada conexão bem sucedida." -#: utils/misc/guc.c:926 +#: utils/misc/guc_tables.c:1211 msgid "Logs end of a session, including duration." msgstr "Registra o fim da sessão, incluindo a duração." -#: utils/misc/guc.c:935 -msgid "Turns on various assertion checks." -msgstr "Ativa várias verificações de asserção." +#: utils/misc/guc_tables.c:1220 +msgid "Logs each replication command." +msgstr "Registra cada comando de replicação." -#: utils/misc/guc.c:936 -msgid "This is a debugging aid." -msgstr "Esse é um auxílio na depuração." +#: utils/misc/guc_tables.c:1229 +msgid "Shows whether the running server has assertion checks enabled." +msgstr "Mostra se o servidor em execução tem verificações de asserção ativadas." -#: utils/misc/guc.c:950 +#: utils/misc/guc_tables.c:1240 msgid "Terminate session on any error." msgstr "Terminar sessão após qualquer erro." -#: utils/misc/guc.c:959 +#: utils/misc/guc_tables.c:1249 msgid "Reinitialize server after backend crash." msgstr "Reinicializar servidor após queda do processo servidor." -#: utils/misc/guc.c:969 +#: utils/misc/guc_tables.c:1258 +msgid "Remove temporary files after backend crash." +msgstr "Remove arquivos temporários após falha do processo servidor." + +#: utils/misc/guc_tables.c:1268 +msgid "Send SIGABRT not SIGQUIT to child processes after backend crash." +msgstr "" + +#: utils/misc/guc_tables.c:1278 +msgid "Send SIGABRT not SIGKILL to stuck child processes." +msgstr "" + +#: utils/misc/guc_tables.c:1289 msgid "Logs the duration of each completed SQL statement." msgstr "Registra a duração de cada sentença SQL completa." -#: utils/misc/guc.c:978 +#: utils/misc/guc_tables.c:1298 msgid "Logs each query's parse tree." msgstr "Registra cada árvore de análise de consulta." -#: utils/misc/guc.c:987 +#: utils/misc/guc_tables.c:1307 msgid "Logs each query's rewritten parse tree." msgstr "Registra cada árvore de análise reescrita de consulta." -#: utils/misc/guc.c:996 +#: utils/misc/guc_tables.c:1316 msgid "Logs each query's execution plan." msgstr "Registra cada plano de execução de consulta." -#: utils/misc/guc.c:1005 +#: utils/misc/guc_tables.c:1325 msgid "Indents parse and plan tree displays." msgstr "Identa exibição da árvore de análise e plano." -#: utils/misc/guc.c:1014 +#: utils/misc/guc_tables.c:1334 msgid "Writes parser performance statistics to the server log." msgstr "Escreve estatísticas de performance do analisador no log do servidor." -#: utils/misc/guc.c:1023 +#: utils/misc/guc_tables.c:1343 msgid "Writes planner performance statistics to the server log." msgstr "Escreve estatísticas de performance do planejador no log do servidor." -#: utils/misc/guc.c:1032 +#: utils/misc/guc_tables.c:1352 msgid "Writes executor performance statistics to the server log." msgstr "Escreve estatísticas de performance do executor no log do servidor." -#: utils/misc/guc.c:1041 +#: utils/misc/guc_tables.c:1361 msgid "Writes cumulative performance statistics to the server log." msgstr "Escreve estatísticas de performance acumulativas no log do servidor." -#: utils/misc/guc.c:1051 +#: utils/misc/guc_tables.c:1371 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "Registra estatísticas de uso de recursos do sistema (memória e CPU) em várias operações B-tree." -#: utils/misc/guc.c:1063 +#: utils/misc/guc_tables.c:1383 msgid "Collects information about executing commands." msgstr "Coleta informação sobre execução de comandos." -#: utils/misc/guc.c:1064 +#: utils/misc/guc_tables.c:1384 msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." -msgstr "Habilita a coleta de informação do comando em execução de cada sessão, ao mesmo tempo que o comando inicia a execução." +msgstr "Ativa a coleta de informação do comando em execução de cada sessão, ao mesmo tempo que o comando inicia a execução." -#: utils/misc/guc.c:1074 +#: utils/misc/guc_tables.c:1394 msgid "Collects statistics on database activity." msgstr "Coleta estatísticas sobre a atividade do banco de dados." -#: utils/misc/guc.c:1083 +#: utils/misc/guc_tables.c:1403 msgid "Collects timing statistics for database I/O activity." msgstr "Coleta estatísticas de tempo da atividade de I/O do banco de dados." -#: utils/misc/guc.c:1093 +#: utils/misc/guc_tables.c:1412 +msgid "Collects timing statistics for WAL I/O activity." +msgstr "Coleta estatísticas de tempo para atividade de E/S do WAL." + +#: utils/misc/guc_tables.c:1422 msgid "Updates the process title to show the active SQL command." msgstr "Atualiza o título do processo para mostrar o comando SQL ativo." -#: utils/misc/guc.c:1094 +#: utils/misc/guc_tables.c:1423 msgid "Enables updating of the process title every time a new SQL command is received by the server." -msgstr "Habilita a atualização do título do processo toda vez que um comando SQL novo é recebido pelo servidor." +msgstr "Ativa a atualização do título do processo toda vez que um comando SQL novo é recebido pelo servidor." -#: utils/misc/guc.c:1103 +#: utils/misc/guc_tables.c:1432 msgid "Starts the autovacuum subprocess." msgstr "Inicia o subprocesso de limpeza automática." -#: utils/misc/guc.c:1113 +#: utils/misc/guc_tables.c:1442 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Gera saída de depuração para LISTEN e NOTIFY." -#: utils/misc/guc.c:1125 +#: utils/misc/guc_tables.c:1454 msgid "Emits information about lock usage." msgstr "Emite informação sobre uso de bloqueio." -#: utils/misc/guc.c:1135 +#: utils/misc/guc_tables.c:1464 msgid "Emits information about user lock usage." msgstr "Emite informação sobre uso de bloqueio pelo usuário." -#: utils/misc/guc.c:1145 +#: utils/misc/guc_tables.c:1474 msgid "Emits information about lightweight lock usage." msgstr "Emite informação sobre uso de bloqueio leve." -#: utils/misc/guc.c:1155 +#: utils/misc/guc_tables.c:1484 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "Emite informação sobre todos os bloqueios atuais quando um tempo de espera de impasse ocorrer." -#: utils/misc/guc.c:1167 +#: utils/misc/guc_tables.c:1496 msgid "Logs long lock waits." msgstr "Registra esperas devido a bloqueios longos." -#: utils/misc/guc.c:1177 +#: utils/misc/guc_tables.c:1505 +msgid "Logs standby recovery conflict waits." +msgstr "Registra esperas por conflito em recuperação de servidores em-espera." + +#: utils/misc/guc_tables.c:1514 msgid "Logs the host name in the connection logs." -msgstr "Registra o nome da máquina nos logs de conexão." +msgstr "Registra o nome do hospedeiro nos logs de conexão." -#: utils/misc/guc.c:1178 +#: utils/misc/guc_tables.c:1515 msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." -msgstr "Por padrão, logs de conexão só mostram o endereço IP da máquina que conectou. Se você quer que seja mostrado o nome da máquina você pode habilitá-lo, mas dependendo da configuração de resolução do nome da máquina isso pode impor uma penalização de performance." - -#: utils/misc/guc.c:1189 -msgid "Causes subtables to be included by default in various commands." -msgstr "Causa subtabelas serem incluídas por padrão em vários comandos." - -#: utils/misc/guc.c:1198 -msgid "Encrypt passwords." -msgstr "Criptografa senhas." - -#: utils/misc/guc.c:1199 -msgid "When a password is specified in CREATE USER or ALTER USER without writing either ENCRYPTED or UNENCRYPTED, this parameter determines whether the password is to be encrypted." -msgstr "Quando a senha for especificada em CREATE USER ou ALTER USER sem escrever ENCRYPTED ou UNENCRYPTED, esse parâmetro determina se a senha será criptografada." +msgstr "Por padrão, logs de conexão só mostram o endereço IP do hospedeiro que conectou. Se você quer que seja mostrado o nome do hospedeiro você pode ativá-lo, mas dependendo da configuração de resolução de nome de hospedeiro isso pode impor uma penalização de desempenho." -#: utils/misc/guc.c:1209 +#: utils/misc/guc_tables.c:1526 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Trata \"expr=NULL\" como \"expr IS NULL\"." -#: utils/misc/guc.c:1210 +#: utils/misc/guc_tables.c:1527 msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." -msgstr "Quando está habilitado, expressões da forma expr = NULL (ou NULL = expr) são tratadas com expr IS NULL, isto é, elas retornam verdadeiro se expr é avaliada como nula, e falso caso contrário. O comportamento correto de expr = NULL é retornar sempre nulo (desconhecido)." +msgstr "Quando está ativado, expressões da forma expr = NULL (ou NULL = expr) são tratadas com expr IS NULL, isto é, retornam verdade se expr é avaliada como nula, e falso caso contrário. O comportamento correto de expr = NULL é retornar sempre nulo (desconhecido)." -#: utils/misc/guc.c:1222 +#: utils/misc/guc_tables.c:1539 msgid "Enables per-database user names." -msgstr "Habilita uso de nomes de usuário por banco de dados." +msgstr "Ativa uso de nomes de usuário por banco de dados." -#: utils/misc/guc.c:1232 -msgid "This parameter doesn't do anything." -msgstr "Esse parâmetro não faz nada." - -#: utils/misc/guc.c:1233 -msgid "It's just here so that we won't choke on SET AUTOCOMMIT TO ON from 7.3-vintage clients." -msgstr "Isso está aqui para que não seja necessário SET AUTOCOMMIT TO ON em clientes 7.3 e anteriores." - -#: utils/misc/guc.c:1242 +#: utils/misc/guc_tables.c:1548 msgid "Sets the default read-only status of new transactions." -msgstr "Define o status padrão como somente leitura para novas transações." +msgstr "Define o status padrão como de leitura-apenas para novas transações." -#: utils/misc/guc.c:1251 +#: utils/misc/guc_tables.c:1558 msgid "Sets the current transaction's read-only status." -msgstr "Define o status da transação atual como somente leitura." +msgstr "Define o status da transação atual como de leitura-apenas." -#: utils/misc/guc.c:1261 +#: utils/misc/guc_tables.c:1568 msgid "Sets the default deferrable status of new transactions." msgstr "Define o status de postergação padrão para novas transações." -#: utils/misc/guc.c:1270 +#: utils/misc/guc_tables.c:1577 msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." -msgstr "Quando está habilitado, posterga uma transação serializável somente leitura até que ela possa ser executada sem possíveis falhas de serialização." +msgstr "Se deve postergar uma transação serializável de leitura-apenas até que possa ser executada sem possíveis falhas de serialização." + +#: utils/misc/guc_tables.c:1587 +msgid "Enable row security." +msgstr "Ativa a segurança de linha." + +#: utils/misc/guc_tables.c:1588 +msgid "When enabled, row security will be applied to all users." +msgstr "Quando ativado, a segurança de linha será aplicada a todos os usuários." -#: utils/misc/guc.c:1280 -msgid "Check function bodies during CREATE FUNCTION." -msgstr "Verifica corpo da função durante CREATE FUNCTION." +#: utils/misc/guc_tables.c:1596 +msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." +msgstr "Verifica os corpos das rotinas durante CREATE FUNCTION e CREATE PROCEDURE." -#: utils/misc/guc.c:1289 +#: utils/misc/guc_tables.c:1605 msgid "Enable input of NULL elements in arrays." -msgstr "Habilita entrada de elementos NULL em matrizes." +msgstr "Ativa entrada de elementos NULL em matrizes." -#: utils/misc/guc.c:1290 +#: utils/misc/guc_tables.c:1606 msgid "When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally." -msgstr "Quando habilitado, NULL sem aspas em um valor de entrada de uma matriz significa o valor nulo; caso contrário ele é utilizado literalmente." +msgstr "Quando ativado, NULL sem aspas em um valor de entrada de uma matriz significa o valor nulo; caso contrário este é utilizado literalmente." -#: utils/misc/guc.c:1300 -msgid "Create new tables with OIDs by default." -msgstr "Cria novas tabelas com OIDs por padrão." +#: utils/misc/guc_tables.c:1622 +msgid "WITH OIDS is no longer supported; this can only be false." +msgstr "" -#: utils/misc/guc.c:1309 +#: utils/misc/guc_tables.c:1632 msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." msgstr "Inicia um subprocesso para capturar saída stderr e/ou csvlogs em arquivos de log." -#: utils/misc/guc.c:1318 +#: utils/misc/guc_tables.c:1641 msgid "Truncate existing log files of same name during log rotation." -msgstr "Trunca arquivos de log existentes com mesmo nome durante rotação de log." +msgstr "Trunca os arquivos de log existentes com mesmo nome durante rotação de log." -#: utils/misc/guc.c:1329 +#: utils/misc/guc_tables.c:1652 msgid "Emit information about resource usage in sorting." -msgstr "Produz informação sobre uso de recurso ao ordenar." +msgstr "Emite informação sobre uso de recurso ao classificar." -#: utils/misc/guc.c:1343 +#: utils/misc/guc_tables.c:1666 msgid "Generate debugging output for synchronized scanning." -msgstr "Gera saída de depuração para busca sincronizada." +msgstr "Gera saída de depuração para varredura sincronizada." -#: utils/misc/guc.c:1358 +#: utils/misc/guc_tables.c:1681 msgid "Enable bounded sorting using heap sort." -msgstr "Habilita ordenação limitada utilizando ordenção de pilha." +msgstr "Ativa a ordenação com limites usando a classificação de pilha." -#: utils/misc/guc.c:1371 +#: utils/misc/guc_tables.c:1694 msgid "Emit WAL-related debugging output." msgstr "Emite saída de depuração relacionada ao WAL." -#: utils/misc/guc.c:1383 -msgid "Datetimes are integer based." -msgstr "Datetimes são baseados em inteiros." +#: utils/misc/guc_tables.c:1706 +msgid "Shows whether datetimes are integer based." +msgstr "Mostra se os carimbos de data/hora são baseados em números inteiros." -#: utils/misc/guc.c:1398 +#: utils/misc/guc_tables.c:1717 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "Define se nomes de usuário do Kerberos e do GSSAPI devem ser tratados como não sensíveis a minúsculas/maiúsculas." -#: utils/misc/guc.c:1408 +#: utils/misc/guc_tables.c:1727 +msgid "Sets whether GSSAPI delegation should be accepted from the client." +msgstr "Define se a delegação GSSAPI deve ser aceita pelo cliente." + +#: utils/misc/guc_tables.c:1737 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Avisa sobre escapes de barra invertida em cadeias de caracteres ordinárias." -#: utils/misc/guc.c:1418 +#: utils/misc/guc_tables.c:1747 msgid "Causes '...' strings to treat backslashes literally." msgstr "Faz com que cadeias de caracteres '...' tratem barras invertidas literalmente." -#: utils/misc/guc.c:1429 +#: utils/misc/guc_tables.c:1758 msgid "Enable synchronized sequential scans." -msgstr "Habilita buscas sequenciais sincronizadas." +msgstr "Ativa varreduras sequenciais sincronizadas." -#: utils/misc/guc.c:1439 -msgid "Allows archiving of WAL files using archive_command." -msgstr "Permite arquivamento de arquivos do WAL utilizando archive_command." +#: utils/misc/guc_tables.c:1768 +msgid "Sets whether to include or exclude transaction with recovery target." +msgstr "Define se deseja incluir ou excluir transação com destino de recuperação." -#: utils/misc/guc.c:1449 +#: utils/misc/guc_tables.c:1778 msgid "Allows connections and queries during recovery." msgstr "Permite conexões e consultas durante recuperação." -#: utils/misc/guc.c:1459 +#: utils/misc/guc_tables.c:1788 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "Permite retorno do servidor em espera ativo ao servidor principal que evitará conflitos de consulta." -#: utils/misc/guc.c:1469 +#: utils/misc/guc_tables.c:1798 +msgid "Shows whether hot standby is currently active." +msgstr "" + +#: utils/misc/guc_tables.c:1809 msgid "Allows modifications of the structure of system tables." msgstr "Permite modificações da estrutura de tabelas do sistema." -#: utils/misc/guc.c:1480 +#: utils/misc/guc_tables.c:1820 msgid "Disables reading from system indexes." -msgstr "Desabilita leitura dos índices do sistema." +msgstr "Desativa a leitura dos índices do sistema." -#: utils/misc/guc.c:1481 +#: utils/misc/guc_tables.c:1821 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "Ele não impede a atualização dos índices, então é seguro utilizá-lo. A pior consequência é lentidão." -#: utils/misc/guc.c:1492 +#: utils/misc/guc_tables.c:1832 +msgid "Allows tablespaces directly inside pg_tblspc, for testing." +msgstr "" + +#: utils/misc/guc_tables.c:1843 msgid "Enables backward compatibility mode for privilege checks on large objects." -msgstr "Habilita modo de compatibilidade com versões anteriores para verificação de privilégios em objetos grandes." +msgstr "Ativa modo de compatibilidade com versões anteriores para verificação de privilégios em objetos grandes." -#: utils/misc/guc.c:1493 +#: utils/misc/guc_tables.c:1844 msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." msgstr "Não verifica privilégios ao ler ou modificar objetos grandes, para compatibilidade com versões do PostgreSQL anteriores a 9.0." -#: utils/misc/guc.c:1503 +#: utils/misc/guc_tables.c:1854 msgid "When generating SQL fragments, quote all identifiers." msgstr "Ao gerar fragmentos SQL, colocar todos identificadores entre aspas." -#: utils/misc/guc.c:1513 +#: utils/misc/guc_tables.c:1864 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Mostra se a soma de verificação de dados está habilitada para este agrupamento." -#: utils/misc/guc.c:1533 -msgid "Forces a switch to the next xlog file if a new file has not been started within N seconds." -msgstr "Força a rotação para o próximo arquivo de xlog se um novo arquivo não foi iniciado em N segundos." +#: utils/misc/guc_tables.c:1875 +msgid "Add sequence number to syslog messages to avoid duplicate suppression." +msgstr "" + +#: utils/misc/guc_tables.c:1885 +msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." +msgstr "" + +#: utils/misc/guc_tables.c:1895 +msgid "Controls whether Gather and Gather Merge also run subplans." +msgstr "" + +#: utils/misc/guc_tables.c:1896 +msgid "Should gather nodes also run subplans or just gather tuples?" +msgstr "" + +#: utils/misc/guc_tables.c:1906 +msgid "Allow JIT compilation." +msgstr "" + +#: utils/misc/guc_tables.c:1917 +msgid "Register JIT-compiled functions with debugger." +msgstr "" + +#: utils/misc/guc_tables.c:1934 +msgid "Write out LLVM bitcode to facilitate JIT debugging." +msgstr "" + +#: utils/misc/guc_tables.c:1945 +msgid "Allow JIT compilation of expressions." +msgstr "" + +#: utils/misc/guc_tables.c:1956 +msgid "Register JIT-compiled functions with perf profiler." +msgstr "" + +#: utils/misc/guc_tables.c:1973 +msgid "Allow JIT compilation of tuple deforming." +msgstr "" + +#: utils/misc/guc_tables.c:1984 +msgid "Whether to continue running after a failure to sync data files." +msgstr "" + +#: utils/misc/guc_tables.c:1993 +msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." +msgstr "" + +#: utils/misc/guc_tables.c:2011 +msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." +msgstr "" -#: utils/misc/guc.c:1544 -msgid "Waits N seconds on connection startup after authentication." -msgstr "Espera N segundos após autenticação durante inicialização da conexão." +#: utils/misc/guc_tables.c:2022 +msgid "Sets the amount of time to wait after authentication on connection startup." +msgstr "Define o tempo de espera após a autenticação na ativação da conexão." -#: utils/misc/guc.c:1545 utils/misc/guc.c:2047 +#: utils/misc/guc_tables.c:2024 utils/misc/guc_tables.c:2658 msgid "This allows attaching a debugger to the process." msgstr "Isso permite anexar um depurador ao processo." -#: utils/misc/guc.c:1554 +#: utils/misc/guc_tables.c:2033 msgid "Sets the default statistics target." msgstr "Define o alvo padrão de estatísticas." -#: utils/misc/guc.c:1555 +#: utils/misc/guc_tables.c:2034 msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." msgstr "Isso se aplica a colunas de tabelas que não têm um alvo de colunas específico definido através de ALTER TABLE SET STATISTICS." -#: utils/misc/guc.c:1564 +#: utils/misc/guc_tables.c:2043 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "Define o tamanho da lista do FROM a partir do qual as subconsultas não entrarão em colapso." -#: utils/misc/guc.c:1566 +#: utils/misc/guc_tables.c:2045 msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." msgstr "O planejador mesclará subconsultas em consultas de nível superior se a lista resultante do FROM for menor que essa quantidade de itens." -#: utils/misc/guc.c:1576 +#: utils/misc/guc_tables.c:2056 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "Define o tamanho da lista do FROM a partir do qual as construções JOIN não serão nivelados." -#: utils/misc/guc.c:1578 +#: utils/misc/guc_tables.c:2058 msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." msgstr "O planejador nivelará construções JOIN explícitas em listas de itens FROM sempre que a lista não tenha mais do que essa quantidade de itens." -#: utils/misc/guc.c:1588 +#: utils/misc/guc_tables.c:2069 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "Define o limite de itens do FROM a partir do qual o GEQO é utilizado." -#: utils/misc/guc.c:1597 +#: utils/misc/guc_tables.c:2079 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: esforço é utilizado para definir o padrão para outros parâmetros GEQO." -#: utils/misc/guc.c:1606 +#: utils/misc/guc_tables.c:2089 msgid "GEQO: number of individuals in the population." msgstr "GEQO: número de indivíduos em uma população." -#: utils/misc/guc.c:1607 utils/misc/guc.c:1616 +#: utils/misc/guc_tables.c:2090 utils/misc/guc_tables.c:2100 msgid "Zero selects a suitable default value." msgstr "Zero seleciona um valor padrão ideal." -#: utils/misc/guc.c:1615 +#: utils/misc/guc_tables.c:2099 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: número de iterações do algoritmo." -#: utils/misc/guc.c:1626 +#: utils/misc/guc_tables.c:2111 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Define o tempo para esperar um bloqueio antes de verificar um impasse." -#: utils/misc/guc.c:1637 +#: utils/misc/guc_tables.c:2122 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "Define o tempo máximo antes de cancelar consultas quando um servidor em espera ativo está processando dados do WAL arquivados." -#: utils/misc/guc.c:1648 +#: utils/misc/guc_tables.c:2133 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "Define o tempo máximo antes de cancelar consultas quando um servidor em espera ativo está processando dados do WAL enviados." -#: utils/misc/guc.c:1659 -msgid "Sets the maximum interval between WAL receiver status reports to the primary." -msgstr "Define o intervalo máximo entre relatos de status do receptor do WAL ao servidor principal." +#: utils/misc/guc_tables.c:2144 +msgid "Sets the minimum delay for applying changes during recovery." +msgstr "" + +#: utils/misc/guc_tables.c:2155 +msgid "Sets the maximum interval between WAL receiver status reports to the sending server." +msgstr "Define o intervalo máximo entre os relatórios de status do receptor de WAL para o servidor de envio." -#: utils/misc/guc.c:1670 -msgid "Sets the maximum wait time to receive data from the primary." -msgstr "Define o tempo máximo de espera para receber dados do servidor principal." +#: utils/misc/guc_tables.c:2166 +msgid "Sets the maximum wait time to receive data from the sending server." +msgstr "Define o tempo máximo de espera para receber dados do servidor emissor." -#: utils/misc/guc.c:1681 +#: utils/misc/guc_tables.c:2177 msgid "Sets the maximum number of concurrent connections." msgstr "Define o número máximo de conexões concorrentes." -#: utils/misc/guc.c:1691 +#: utils/misc/guc_tables.c:2188 msgid "Sets the number of connection slots reserved for superusers." -msgstr "Define o número de conexões reservadas para super-usuários." +msgstr "Define o número de conexões reservadas para superusuários." + +#: utils/misc/guc_tables.c:2198 +msgid "Sets the number of connection slots reserved for roles with privileges of pg_use_reserved_connections." +msgstr "Define o número de encaixes de conexão reservados para funções com privilégios de pg_use_reserved_connections." + +#: utils/misc/guc_tables.c:2209 +msgid "Amount of dynamic shared memory reserved at startup." +msgstr "Quantidade de memória compartilhada dinâmica reservada na ativação." -#: utils/misc/guc.c:1705 +#: utils/misc/guc_tables.c:2224 msgid "Sets the number of shared memory buffers used by the server." msgstr "Define o número de buffers de memória compartilhada utilizados pelo servidor." -#: utils/misc/guc.c:1716 +#: utils/misc/guc_tables.c:2235 +msgid "Sets the buffer pool size for VACUUM, ANALYZE, and autovacuum." +msgstr "" + +#: utils/misc/guc_tables.c:2246 +msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." +msgstr "" + +#: utils/misc/guc_tables.c:2257 +msgid "Shows the number of huge pages needed for the main shared memory area." +msgstr "Mostra o número de páginas enormes (huge pages) necessárias para a área principal de memória compartilhada." + +#: utils/misc/guc_tables.c:2258 +msgid "-1 indicates that the value could not be determined." +msgstr "" + +#: utils/misc/guc_tables.c:2268 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Define o número máximo de buffers temporários utilizados por cada sessão." -#: utils/misc/guc.c:1727 +#: utils/misc/guc_tables.c:2279 msgid "Sets the TCP port the server listens on." msgstr "Define a porta TCP que o servidor escutará." -#: utils/misc/guc.c:1737 +#: utils/misc/guc_tables.c:2289 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Define as permissões de acesso do soquete de domínio Unix." -#: utils/misc/guc.c:1738 +#: utils/misc/guc_tables.c:2290 msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Soquetes de domínio Unix utilizam permissões de arquivos Unix usuais. O valor do parâmetro esperado é uma especificação numérica na forma aceita pelas chamadas de sistema chmod e umask. (Para utilizar formato octal habitual, o número deve começar com um 0 (zero).)" -#: utils/misc/guc.c:1752 +#: utils/misc/guc_tables.c:2304 msgid "Sets the file permissions for log files." msgstr "Define as permissões do arquivo para arquivos de log." -#: utils/misc/guc.c:1753 +#: utils/misc/guc_tables.c:2305 msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "O valor do parâmetro esperado é uma especificação numérica na forma aceita pelas chamadas de sistema chmod e umask. (Para utilizar formato octal habitual, o número deve começar com um 0 (zero).)" -#: utils/misc/guc.c:1766 +#: utils/misc/guc_tables.c:2319 +msgid "Shows the mode of the data directory." +msgstr "Mostra o modo do diretório de dados." + +#: utils/misc/guc_tables.c:2320 +msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" +msgstr "O valor do parâmetro é uma especificação de modo numérico no formato aceito pelas chamadas de sistema chmod e umask. (Para usar o formato octal habitual, o número deve começar com 0 (zero).)" + +#: utils/misc/guc_tables.c:2333 msgid "Sets the maximum memory to be used for query workspaces." -msgstr "Define o máximo de memória utilizada para operações da consulta." +msgstr "Define o máximo de memória usada para operações da consulta." -#: utils/misc/guc.c:1767 +#: utils/misc/guc_tables.c:2334 msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." -msgstr "Esta quantidade de memória pode ser utilizada por operação de ordenação interna e tabela hash antes de alternar para arquivos temporários no disco." +msgstr "Essa quantidade de memória pode ser usada por cada operação de classificação interna e tabela hash antes de mudar para arquivos temporários do disco." -#: utils/misc/guc.c:1779 +#: utils/misc/guc_tables.c:2346 msgid "Sets the maximum memory to be used for maintenance operations." -msgstr "Define o máximo de memória utilizada para operações de manutenção." +msgstr "Define o máximo de memória usada para operações de manutenção." -#: utils/misc/guc.c:1780 +#: utils/misc/guc_tables.c:2347 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Isso inclue operações tais como VACUUM e CREATE INDEX." -#: utils/misc/guc.c:1795 +#: utils/misc/guc_tables.c:2357 +msgid "Sets the maximum memory to be used for logical decoding." +msgstr "Define a memória máxima a ser usada para decodificação lógica." + +#: utils/misc/guc_tables.c:2358 +msgid "This much memory can be used by each internal reorder buffer before spilling to disk." +msgstr "Essa quantidade de memória pode ser usada por cada buffer de reordenação interno antes de descarregá-la no disco." + +#: utils/misc/guc_tables.c:2374 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Define a profundidade máxima da pilha, em kilobytes." -#: utils/misc/guc.c:1806 -msgid "Limits the total size of all temporary files used by each session." -msgstr "Limita o tamanho total de todos os arquivos temporários utilizados por cada sessão." +#: utils/misc/guc_tables.c:2385 +msgid "Limits the total size of all temporary files used by each process." +msgstr "Limita o tamanho total de todos os arquivos temporários usados ​​por cada processo." -#: utils/misc/guc.c:1807 +#: utils/misc/guc_tables.c:2386 msgid "-1 means no limit." msgstr "-1 significa sem limite." -#: utils/misc/guc.c:1817 +#: utils/misc/guc_tables.c:2396 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Custo da limpeza por página encontrada na cache do buffer." -#: utils/misc/guc.c:1827 +#: utils/misc/guc_tables.c:2406 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Custo da limpeza por página não encontrada na cache do buffer." -#: utils/misc/guc.c:1837 +#: utils/misc/guc_tables.c:2416 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Custo da limpeza por página sujada pela limpeza." -#: utils/misc/guc.c:1847 +#: utils/misc/guc_tables.c:2426 msgid "Vacuum cost amount available before napping." msgstr "Quantidade de custo da limpeza disponível antes de adormecer." -#: utils/misc/guc.c:1857 -msgid "Vacuum cost delay in milliseconds." -msgstr "Atraso do custo da limpeza em milisegundos." - -#: utils/misc/guc.c:1868 -msgid "Vacuum cost delay in milliseconds, for autovacuum." -msgstr "Atraso do custo da limpeza em milisegundos, para autovacuum." - -#: utils/misc/guc.c:1879 +#: utils/misc/guc_tables.c:2436 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Quantidade de custo da limpeza disponível antes de adormecer, para autovacuum." -#: utils/misc/guc.c:1889 +#: utils/misc/guc_tables.c:2446 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "Define o número máximo de arquivos abertos simultaneamente por cada processo servidor." -#: utils/misc/guc.c:1902 +#: utils/misc/guc_tables.c:2459 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Define o número máximo de transações preparadas simultâneas." -#: utils/misc/guc.c:1913 +#: utils/misc/guc_tables.c:2470 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Define o OID mínimo de tabelas para rastrear bloqueios." -#: utils/misc/guc.c:1914 +#: utils/misc/guc_tables.c:2471 msgid "Is used to avoid output on system tables." msgstr "É utilizado para evitar saída em tabelas do sistema." -#: utils/misc/guc.c:1923 +#: utils/misc/guc_tables.c:2480 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Define o OID da tabela com rastreamento de bloqueio incondicional." -#: utils/misc/guc.c:1935 +#: utils/misc/guc_tables.c:2492 msgid "Sets the maximum allowed duration of any statement." msgstr "Define a duração máxima permitida de cada comando." -#: utils/misc/guc.c:1936 utils/misc/guc.c:1947 +#: utils/misc/guc_tables.c:2493 utils/misc/guc_tables.c:2504 +#: utils/misc/guc_tables.c:2515 utils/misc/guc_tables.c:2526 msgid "A value of 0 turns off the timeout." -msgstr "Um valor 0 desabilita o tempo de espera." +msgstr "O valor 0 desativa o limite de tempo de espera." -#: utils/misc/guc.c:1946 +#: utils/misc/guc_tables.c:2503 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Define a duração máxima permitida de qualquer espera por um bloqueio." -#: utils/misc/guc.c:1957 +#: utils/misc/guc_tables.c:2514 +msgid "Sets the maximum allowed idle time between queries, when in a transaction." +msgstr "Define o tempo ocioso máximo permitido entre consultas, quando em uma transação." + +#: utils/misc/guc_tables.c:2525 +msgid "Sets the maximum allowed idle time between queries, when not in a transaction." +msgstr "Define o tempo ocioso máximo permitido entre consultas, quando não estiver em uma transação." + +#: utils/misc/guc_tables.c:2536 msgid "Minimum age at which VACUUM should freeze a table row." -msgstr "Identificador mínimo no qual o VACUUM deve congelar um registro da tabela." +msgstr "Idade mínima na qual VACUUM deve congelar uma linha da tabela." -#: utils/misc/guc.c:1967 +#: utils/misc/guc_tables.c:2546 msgid "Age at which VACUUM should scan whole table to freeze tuples." -msgstr "Identificador no qual o VACUUM deve percorrer toda tabela para congelar tuplas." +msgstr "Idade em que o VACUUM deve varrer a tabela inteira para congelar as tuplas." -#: utils/misc/guc.c:1977 +#: utils/misc/guc_tables.c:2556 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." -msgstr "Identificador mínimo no qual o VACUUM deve congelar um MultiXactId em um registro da tabela." +msgstr "Idade mínima na qual VACUUM deve congelar um MultiXactId em uma linha da tabela." -#: utils/misc/guc.c:1987 +#: utils/misc/guc_tables.c:2566 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." -msgstr "Identificador Multixact no qual o VACUUM deve percorrer toda tabela para congelar tuplas." +msgstr "Idade do multixact em que VACUUM deve varrer a tabela inteira para congelar tuplas." + +#: utils/misc/guc_tables.c:2576 +msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "Idade a partir da qual o VACUUM deve acionar o sistema de segurança para evitar problema de reutilização de identificadores de transação (wraparound)." -#: utils/misc/guc.c:1997 -msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." -msgstr "Número de transações pela qual a limpeza do VACUUM e HOT deve ser adiada, se houver." +#: utils/misc/guc_tables.c:2585 +msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." +msgstr "Idade do multixact a partir da qual o VACUUM deve acionar o sistema de segurança para evitar problema de reutilização de identificadores de transação (wraparound)." -#: utils/misc/guc.c:2010 +#: utils/misc/guc_tables.c:2598 msgid "Sets the maximum number of locks per transaction." msgstr "Define o número máximo de bloqueios por transação." -#: utils/misc/guc.c:2011 -msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." -msgstr "A tabela compartilhada de bloqueios é dimensionada utilizando a suposição de que max_locks_per_transaction * max_connections objetos distintos necessitam ser bloqueados simultaneamente." +#: utils/misc/guc_tables.c:2599 +msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction objects per server process or prepared transaction will need to be locked at any one time." +msgstr "A tabela de bloqueio compartilhado é dimensionada na suposição de que no máximo max_locks_per_transaction objetos por processo do servidor ou transação preparada precisarão ser bloqueados a qualquer momento." -#: utils/misc/guc.c:2022 +#: utils/misc/guc_tables.c:2610 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Define o número máximo de bloqueios de predicado por transação." -#: utils/misc/guc.c:2023 -msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." -msgstr "A tabela compartilhada de bloqueios de predicado é dimensionada utilizando a suposição de que max_pred_locks_per_transaction * max_connections objetos distintos necessitam ser bloqueados simultaneamente." +#: utils/misc/guc_tables.c:2611 +msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction objects per server process or prepared transaction will need to be locked at any one time." +msgstr "A tabela de bloqueio de predicado compartilhado é dimensionada na suposição de que no máximo max_pred_locks_per_transaction objetos por processo do servidor ou transação preparada precisarão ser bloqueados a qualquer momento." + +#: utils/misc/guc_tables.c:2622 +msgid "Sets the maximum number of predicate-locked pages and tuples per relation." +msgstr "Define o número máximo de páginas e linhas bloqueadas por predicado por transação." + +#: utils/misc/guc_tables.c:2623 +msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." +msgstr "" + +#: utils/misc/guc_tables.c:2633 +msgid "Sets the maximum number of predicate-locked tuples per page." +msgstr "Define o número máximo de tuplas bloqueadas por predicado por página." + +#: utils/misc/guc_tables.c:2634 +msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." +msgstr "" -#: utils/misc/guc.c:2034 +#: utils/misc/guc_tables.c:2644 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Define o tempo máximo permitido para completar uma autenticação do cliente." -#: utils/misc/guc.c:2046 -msgid "Waits N seconds on connection startup before authentication." -msgstr "Espera N segundos após autenticação durante inicialização da conexão." +#: utils/misc/guc_tables.c:2656 +msgid "Sets the amount of time to wait before authentication on connection startup." +msgstr "Define o tempo de espera antes da autenticação na ativação da conexão." -#: utils/misc/guc.c:2057 -msgid "Sets the number of WAL files held for standby servers." -msgstr "Define o número de arquivos WAL mantidos para servidores em espera." +#: utils/misc/guc_tables.c:2668 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "" + +#: utils/misc/guc_tables.c:2669 +msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "" + +#: utils/misc/guc_tables.c:2679 +msgid "Sets the size of WAL files held for standby servers." +msgstr "Define o tamanho dos arquivos do WAL mantidos para servidores em-espera." -#: utils/misc/guc.c:2067 -msgid "Sets the maximum distance in log segments between automatic WAL checkpoints." -msgstr "Define a distância máxima em arquivos de log entre pontos de controle WAL automáticos." +#: utils/misc/guc_tables.c:2690 +msgid "Sets the minimum size to shrink the WAL to." +msgstr "Define o tamanho mínimo para encolher o WAL." -#: utils/misc/guc.c:2077 +#: utils/misc/guc_tables.c:2702 +msgid "Sets the WAL size that triggers a checkpoint." +msgstr "Define o tamanho do WAL que dispara um ponto de verificação." + +#: utils/misc/guc_tables.c:2714 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "Define o tempo máximo entre pontos de controle WAL automáticos." -#: utils/misc/guc.c:2088 -msgid "Enables warnings if checkpoint segments are filled more frequently than this." -msgstr "Habilita avisos caso segmentos dos pontos de controle estejam sendo preenchidos mais frequentemente do que esse." +#: utils/misc/guc_tables.c:2725 +msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." +msgstr "" + +#: utils/misc/guc_tables.c:2727 +msgid "Write a message to the server log if checkpoints caused by the filling of WAL segment files happen more frequently than this amount of time. Zero turns off the warning." +msgstr "Escreve uma mensagem no registro de eventos (log) do servidor se os pontos de verificação causados ​​pelo preenchimento de arquivos de segmento do WAL ocorrerem com mais frequência do que esse período de tempo. Zero desativa a advertência." -#: utils/misc/guc.c:2090 -msgid "Write a message to the server log if checkpoints caused by the filling of checkpoint segment files happens more frequently than this number of seconds. Zero turns off the warning." -msgstr "Escreve uma mensagem no log do servidor se pontos de controle causados pelo preenchimento de arquivos de segmento dos pontos de controle acontece mais frequentemente do que esse número de segundos. Zero desabilita esse aviso." +#: utils/misc/guc_tables.c:2740 utils/misc/guc_tables.c:2958 +#: utils/misc/guc_tables.c:2998 +msgid "Number of pages after which previously performed writes are flushed to disk." +msgstr "" -#: utils/misc/guc.c:2102 +#: utils/misc/guc_tables.c:2751 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Define o número de buffers de páginas do disco para WAL na memória compartilhada." -#: utils/misc/guc.c:2113 -msgid "WAL writer sleep time between WAL flushes." -msgstr "Tempo de adormecimento do escritor do WAL entre ciclos do WAL." +#: utils/misc/guc_tables.c:2762 +msgid "Time between WAL flushes performed in the WAL writer." +msgstr "" + +#: utils/misc/guc_tables.c:2773 +msgid "Amount of WAL written out by WAL writer that triggers a flush." +msgstr "" + +#: utils/misc/guc_tables.c:2784 +msgid "Minimum size of new file to fsync instead of writing WAL." +msgstr "" -#: utils/misc/guc.c:2125 +#: utils/misc/guc_tables.c:2795 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "Define o número máximo de processos de limpeza automática executados simultaneamente." -#: utils/misc/guc.c:2136 +#: utils/misc/guc_tables.c:2806 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Define o número máximo de entradas de replicação simultâneas." -#: utils/misc/guc.c:2146 +#: utils/misc/guc_tables.c:2816 +msgid "Sets the maximum WAL size that can be reserved by replication slots." +msgstr "Define o tamanho máximo do WAL que pode ser reservado por encaixes de replicação." + +#: utils/misc/guc_tables.c:2817 +msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." +msgstr "" + +#: utils/misc/guc_tables.c:2829 msgid "Sets the maximum time to wait for WAL replication." msgstr "Define o tempo máximo de espera pela replicação do WAL." -#: utils/misc/guc.c:2157 +#: utils/misc/guc_tables.c:2840 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "Define o atraso em microsegundos entre efetivar uma transação e escrever WAL no disco." -#: utils/misc/guc.c:2169 -msgid "Sets the minimum concurrent open transactions before performing commit_delay." -msgstr "Define o número mínimo de transações concorrentes abertas antes de esperar commit_delay." +#: utils/misc/guc_tables.c:2852 +msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." +msgstr "Define o número mínimo de transações abertas simultâneas necessárias antes de executar commit_delay." -#: utils/misc/guc.c:2180 +#: utils/misc/guc_tables.c:2863 msgid "Sets the number of digits displayed for floating-point values." msgstr "Define o número de dígitos mostrados para valores de ponto flutuante." -#: utils/misc/guc.c:2181 -msgid "This affects real, double precision, and geometric data types. The parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate)." -msgstr "Isso afeta os tipos de dado real, double precision e geometric. O valor do parâmetro é formatado segundo padrão de dígitos (FLT_DIG ou DBL_DIG conforme adequado)." +#: utils/misc/guc_tables.c:2864 +msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." +msgstr "Isso afeta os tipos de dados reais, de precisão dupla e geométricos. Um valor de parâmetro zero ou negativo é adicionado ao número padrão de dígitos (FLT_DIG ou DBL_DIG conforme apropriado). Qualquer valor maior que zero seleciona o modo de saída preciso." -#: utils/misc/guc.c:2192 -msgid "Sets the minimum execution time above which statements will be logged." -msgstr "Define o tempo mínimo de execução no qual os comandos serão registrados." +#: utils/misc/guc_tables.c:2876 +msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." +msgstr "Define o tempo mínimo de execução acima do qual uma amostra de instruções será registrada. A amostragem é determinada por log_statement_sample_rate." -#: utils/misc/guc.c:2194 +#: utils/misc/guc_tables.c:2879 +msgid "Zero logs a sample of all queries. -1 turns this feature off." +msgstr "Zero registra uma amostra de todas as consultas. -1 desativa esse recurso." + +#: utils/misc/guc_tables.c:2889 +msgid "Sets the minimum execution time above which all statements will be logged." +msgstr "Define o tempo mínimo de execução acima do qual todas as instruções serão registradas." + +#: utils/misc/guc_tables.c:2891 msgid "Zero prints all queries. -1 turns this feature off." -msgstr "Zero registra todas as consultas. -1 desabilita essa funcionalidade." +msgstr "Zero registra todas as consultas. -1 desativa essa funcionalidade." -#: utils/misc/guc.c:2204 +#: utils/misc/guc_tables.c:2901 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "Define o tempo mínimo de execução no qual as ações de limpeza automática serão registradas." -#: utils/misc/guc.c:2206 +#: utils/misc/guc_tables.c:2903 msgid "Zero prints all actions. -1 turns autovacuum logging off." -msgstr "Zero registra todas as ações. -1 desabilita essa funcionalidade." +msgstr "Zero mostra todas as ações. -1 desativa essa funcionalidade." + +#: utils/misc/guc_tables.c:2913 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." +msgstr "" + +#: utils/misc/guc_tables.c:2915 utils/misc/guc_tables.c:2927 +msgid "-1 to print values in full." +msgstr "" + +#: utils/misc/guc_tables.c:2925 +msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." +msgstr "" -#: utils/misc/guc.c:2216 +#: utils/misc/guc_tables.c:2937 msgid "Background writer sleep time between rounds." msgstr "Tempo de adormecimento do escritor em segundo plano entre ciclos." -#: utils/misc/guc.c:2227 +#: utils/misc/guc_tables.c:2948 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "Número máximo de páginas do LRU do escritor em segundo plano a serem escritas por ciclo." -#: utils/misc/guc.c:2243 +#: utils/misc/guc_tables.c:2971 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "Número de requisições simultâneas que podem ser manipuladas eficientemente pelo subsistema de disco." -#: utils/misc/guc.c:2244 -msgid "For RAID arrays, this should be approximately the number of drive spindles in the array." -msgstr "Para arranjos RAID, este deveria ser aproximadamente o número de discos em um arranjo." +#: utils/misc/guc_tables.c:2985 +msgid "A variant of effective_io_concurrency that is used for maintenance work." +msgstr "" -#: utils/misc/guc.c:2259 +#: utils/misc/guc_tables.c:3011 msgid "Maximum number of concurrent worker processes." msgstr "Define o número máximo de processos filho em segundo plano concorrentes." -#: utils/misc/guc.c:2269 -msgid "Automatic log file rotation will occur after N minutes." -msgstr "Rotação de arquivo de log automática ocorrerá após N minutos." +#: utils/misc/guc_tables.c:3023 +msgid "Maximum number of logical replication worker processes." +msgstr "Número máximo de processos trabalhadores de replicação lógica." + +#: utils/misc/guc_tables.c:3035 +msgid "Maximum number of table synchronization workers per subscription." +msgstr "Número máximo de processos trabalhadores de sincronização de tabelas por subscrição." + +#: utils/misc/guc_tables.c:3047 +msgid "Maximum number of parallel apply workers per subscription." +msgstr "Número máximo de processos trabalhadores de aplicação paralela por subscrição." + +#: utils/misc/guc_tables.c:3057 +msgid "Sets the amount of time to wait before forcing log file rotation." +msgstr "Define o tempo de espera antes de forçar a rotação do arquivo de registro de transação (log)." -#: utils/misc/guc.c:2280 -msgid "Automatic log file rotation will occur after N kilobytes." -msgstr "Rotação de arquivo de log automática ocorrerá após N kilobytes." +#: utils/misc/guc_tables.c:3069 +msgid "Sets the maximum size a log file can reach before being rotated." +msgstr "Define o tamanho máximo que um arquivo de registro de eventos (log) pode atingir antes de ser rotacionado." -#: utils/misc/guc.c:2291 +#: utils/misc/guc_tables.c:3081 msgid "Shows the maximum number of function arguments." msgstr "Mostra o número máximo de argumentos da função." -#: utils/misc/guc.c:2302 +#: utils/misc/guc_tables.c:3092 msgid "Shows the maximum number of index keys." msgstr "Mostra o número máximo de chaves do índice." -#: utils/misc/guc.c:2313 +#: utils/misc/guc_tables.c:3103 msgid "Shows the maximum identifier length." msgstr "Mostra o tamanho máximo de identificador." -#: utils/misc/guc.c:2324 +#: utils/misc/guc_tables.c:3114 msgid "Shows the size of a disk block." msgstr "Mostra o tamanho de um bloco do disco." -#: utils/misc/guc.c:2335 +#: utils/misc/guc_tables.c:3125 msgid "Shows the number of pages per disk file." msgstr "Mostra o número de páginas por arquivo do disco." -#: utils/misc/guc.c:2346 +#: utils/misc/guc_tables.c:3136 msgid "Shows the block size in the write ahead log." msgstr "Mostra o tamanho do bloco no log de transação." -#: utils/misc/guc.c:2357 -msgid "Shows the number of pages per write ahead log segment." -msgstr "Mostra o número de páginas por arquivo de log de transação." +#: utils/misc/guc_tables.c:3147 +msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." +msgstr "" + +#: utils/misc/guc_tables.c:3159 +msgid "Shows the size of write ahead log segments." +msgstr "Mostra o tamanho dos segmentos de WAL." -#: utils/misc/guc.c:2370 +#: utils/misc/guc_tables.c:3172 msgid "Time to sleep between autovacuum runs." msgstr "Tempo de adormecimento entre execuções do autovacuum." -#: utils/misc/guc.c:2380 +#: utils/misc/guc_tables.c:3182 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Número mínimo de atualizações ou exclusões de tuplas antes de limpar." -#: utils/misc/guc.c:2389 +#: utils/misc/guc_tables.c:3191 +msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." +msgstr "Número mínimo de inserções de tupla antes da limpeza (vacuum), ou -1 para desativar as limpeza de inserção." + +#: utils/misc/guc_tables.c:3200 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "Número mínimo de inserções, atualizações ou exclusões de tuplas antes de analisar." -#: utils/misc/guc.c:2399 +#: utils/misc/guc_tables.c:3210 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." -msgstr "Identificador para limpar automaticamente uma tabela para previnir reciclagem do ID de transação." +msgstr "Identificador para limpar automaticamente uma tabela para previnir a reutilização de identificadores de transação (wraparound)." -#: utils/misc/guc.c:2410 +#: utils/misc/guc_tables.c:3222 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." -msgstr "Identificador Multixact para limpar automaticamente uma tabela para previnir reciclagem do multixact." +msgstr "Identificador Multixact para limpar automaticamente uma tabela para previnir a reutilização de identificadores de transação (wraparound) do multixact." -#: utils/misc/guc.c:2420 +#: utils/misc/guc_tables.c:3232 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "Define o número máximo de processos de limpeza automática executados simultaneamente." -#: utils/misc/guc.c:2430 +#: utils/misc/guc_tables.c:3242 +msgid "Sets the maximum number of parallel processes per maintenance operation." +msgstr "Define o número máximo de processos paralelos por operação de manutenção." + +#: utils/misc/guc_tables.c:3252 +msgid "Sets the maximum number of parallel processes per executor node." +msgstr "Define o número máximo de processos paralelos por nó executor." + +#: utils/misc/guc_tables.c:3263 +msgid "Sets the maximum number of parallel workers that can be active at one time." +msgstr "Define o número máximo de processos trabalhadores paralelos que podem estar ativos ao mesmo tempo." + +#: utils/misc/guc_tables.c:3274 msgid "Sets the maximum memory to be used by each autovacuum worker process." -msgstr "Define o máximo de memória utilizada por cada processo de limpeza automática." +msgstr "Define o máximo de memória usada por cada processo de limpeza automática." + +#: utils/misc/guc_tables.c:3285 +msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." +msgstr "" -#: utils/misc/guc.c:2441 +#: utils/misc/guc_tables.c:3286 +msgid "A value of -1 disables this feature." +msgstr "O valor -1 desativa esse recurso." + +#: utils/misc/guc_tables.c:3296 msgid "Time between issuing TCP keepalives." msgstr "Tempo entre envios de mantenha-se vivo (keepalive) do TCP." -#: utils/misc/guc.c:2442 utils/misc/guc.c:2453 +#: utils/misc/guc_tables.c:3297 utils/misc/guc_tables.c:3308 +#: utils/misc/guc_tables.c:3432 msgid "A value of 0 uses the system default." msgstr "Um valor 0 utiliza o padrão do sistema." -#: utils/misc/guc.c:2452 +#: utils/misc/guc_tables.c:3307 msgid "Time between TCP keepalive retransmits." msgstr "Tempo entre retransmissões de mantenha-se vivo (keepalive) do TCP." -#: utils/misc/guc.c:2463 -msgid "Set the amount of traffic to send and receive before renegotiating the encryption keys." -msgstr "Define a quantidade de tráfego enviado e recebido antes de renegociar as chaves de criptografia." +#: utils/misc/guc_tables.c:3318 +msgid "SSL renegotiation is no longer supported; this can only be 0." +msgstr "" -#: utils/misc/guc.c:2474 +#: utils/misc/guc_tables.c:3329 msgid "Maximum number of TCP keepalive retransmits." msgstr "Número máximo de retransmissões de mantenha-se vivo (keepalive) do TCP." -#: utils/misc/guc.c:2475 -msgid "This controls the number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." -msgstr "Isso controla o número de retransmissões consecutivas de mantenha-se vivo (keepalive) que podem ser perdidas antes que uma conexão seja considerada fechada. Um valor de 0 utiliza o padrão do sistema." +#: utils/misc/guc_tables.c:3330 +msgid "Number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." +msgstr "Número de retransmissões consecutivas de manutenção de atividade (keepalive) que podem ser perdidas antes que uma conexão seja considerada inoperante. O valor zero usa o padrão do sistema." -#: utils/misc/guc.c:2486 +#: utils/misc/guc_tables.c:3341 msgid "Sets the maximum allowed result for exact search by GIN." -msgstr "Define o resultado máximo permitido por uma busca exata utilizando GIN." +msgstr "Define o resultado máximo permitido por uma busca exata usando GIN." + +#: utils/misc/guc_tables.c:3352 +msgid "Sets the planner's assumption about the total size of the data caches." +msgstr "Define a suposição do planejador sobre o tamanho total dos caches de dados." + +#: utils/misc/guc_tables.c:3353 +msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." +msgstr "Ou seja, o tamanho total dos caches (cache do kernel e buffers compartilhados) usados ​​para arquivos de dados do PostgreSQL. Isso é medido em páginas de disco, que normalmente têm 8 KB cada." -#: utils/misc/guc.c:2497 -msgid "Sets the planner's assumption about the size of the disk cache." -msgstr "Define a suposição do planejador sobre o tamanho da cache do disco." +#: utils/misc/guc_tables.c:3364 +msgid "Sets the minimum amount of table data for a parallel scan." +msgstr "Define a quantidade mínima de dados da tabela para uma varredura paralela." -#: utils/misc/guc.c:2498 -msgid "That is, the portion of the kernel's disk cache that will be used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." -msgstr "Isto é, a porção da cache do disco que será utilizada pelo arquivos de dados do PostgreSQL. Isto é medido em páginas do disco, que são normalmente 8 kB cada." +#: utils/misc/guc_tables.c:3365 +msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." +msgstr "Se o planejador estimar que lerá um número de páginas da tabela muito pequeno para atingir esse limite, a varredura paralela não será considerada." -#: utils/misc/guc.c:2511 +#: utils/misc/guc_tables.c:3375 +msgid "Sets the minimum amount of index data for a parallel scan." +msgstr "Define a quantidade mínima de dados do índice para uma varredura paralela." + +#: utils/misc/guc_tables.c:3376 +msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." +msgstr "Se o planejador estimar que lerá um número de páginas de índice muito pequeno para atingir esse limite, a varredura paralela não será considerada." + +#: utils/misc/guc_tables.c:3387 msgid "Shows the server version as an integer." msgstr "Mostra a versão do servidor como um inteiro." -#: utils/misc/guc.c:2522 +#: utils/misc/guc_tables.c:3398 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "Registra o uso de arquivos temporários maiores do que este número de kilobytes." -#: utils/misc/guc.c:2523 +#: utils/misc/guc_tables.c:3399 msgid "Zero logs all files. The default is -1 (turning this feature off)." -msgstr "Zero registra todos os arquivos. O padrão é -1 (desabilita essa funcionalidade)." +msgstr "Zero registra todos os arquivos. O padrão é -1 (funcionalidade desativada)." -#: utils/misc/guc.c:2533 +#: utils/misc/guc_tables.c:3409 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Define o tamanho reservado para pg_stat_activity.query, em bytes." -#: utils/misc/guc.c:2557 +#: utils/misc/guc_tables.c:3420 +msgid "Sets the maximum size of the pending list for GIN index." +msgstr "Define o tamanho máximo da lista pendente para o índice GIN." + +#: utils/misc/guc_tables.c:3431 +msgid "TCP user timeout." +msgstr "" + +#: utils/misc/guc_tables.c:3442 +msgid "The size of huge page that should be requested." +msgstr "" + +#: utils/misc/guc_tables.c:3453 +msgid "Aggressively flush system caches for debugging purposes." +msgstr "" + +#: utils/misc/guc_tables.c:3476 +msgid "Sets the time interval between checks for disconnection while running queries." +msgstr "" + +#: utils/misc/guc_tables.c:3487 +msgid "Time between progress updates for long-running startup operations." +msgstr "" + +#: utils/misc/guc_tables.c:3489 +msgid "0 turns this feature off." +msgstr "Zero desativa esse recurso." + +#: utils/misc/guc_tables.c:3499 +msgid "Sets the iteration count for SCRAM secret generation." +msgstr "Define a contagem de iterações para geração de segredo SCRAM." + +#: utils/misc/guc_tables.c:3519 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "Define a estimativa do planejador do custo de busca sequencial de uma página no disco." -#: utils/misc/guc.c:2567 +#: utils/misc/guc_tables.c:3530 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "Define a estimativa do planejador do custo de busca não sequencial de uma página no disco." -#: utils/misc/guc.c:2577 +#: utils/misc/guc_tables.c:3541 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "Define a estimativa do planejador do custo de processamento de cada tupla (registro)." -#: utils/misc/guc.c:2587 +#: utils/misc/guc_tables.c:3552 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." -msgstr "Define a estimativa do planejador do custo de processamento de cada índice durante uma busca indexada." +msgstr "Define a estimativa do planejador do custo de processamento de cada entrada de índice durante uma varredura de índice." -#: utils/misc/guc.c:2597 +#: utils/misc/guc_tables.c:3563 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "Define a estimativa do planejador do custo de processamento de cada operador ou chamada de função." -#: utils/misc/guc.c:2608 +#: utils/misc/guc_tables.c:3574 +msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." +msgstr "Define a estimativa do planejador do custo de passagem de cada tupla (linha) do processo trabalhador para o processo líder." + +#: utils/misc/guc_tables.c:3585 +msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." +msgstr "Define a estimativa do planejador do custo de ativação de processos trabalhador para consulta paralela." + +#: utils/misc/guc_tables.c:3597 +msgid "Perform JIT compilation if query is more expensive." +msgstr "" + +#: utils/misc/guc_tables.c:3598 +msgid "-1 disables JIT compilation." +msgstr "" + +#: utils/misc/guc_tables.c:3608 +msgid "Optimize JIT-compiled functions if query is more expensive." +msgstr "" + +#: utils/misc/guc_tables.c:3609 +msgid "-1 disables optimization." +msgstr "-1 desativa a otimização." + +#: utils/misc/guc_tables.c:3619 +msgid "Perform JIT inlining if query is more expensive." +msgstr "" + +#: utils/misc/guc_tables.c:3620 +msgid "-1 disables inlining." +msgstr "" + +#: utils/misc/guc_tables.c:3630 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." -msgstr "Define a estimativa do planejador da fração de registros do cursor que será recuperada." +msgstr "Define a estimativa do planejador da fração de linhas do cursor que será recuperada." -#: utils/misc/guc.c:2619 +#: utils/misc/guc_tables.c:3642 +msgid "Sets the planner's estimate of the average size of a recursive query's working table." +msgstr "Define a estimativa do planejador do tamanho médio da tabela de trabalho de uma consulta recursiva." + +#: utils/misc/guc_tables.c:3654 msgid "GEQO: selective pressure within the population." msgstr "GEQO: pressão seletiva na população." -#: utils/misc/guc.c:2629 +#: utils/misc/guc_tables.c:3665 msgid "GEQO: seed for random path selection." msgstr "GEQO: semente para seleção de caminhos randômicos." -#: utils/misc/guc.c:2639 +#: utils/misc/guc_tables.c:3676 +msgid "Multiple of work_mem to use for hash tables." +msgstr "" + +#: utils/misc/guc_tables.c:3687 msgid "Multiple of the average buffer usage to free per round." msgstr "Múltiplo da média de uso dos buffers a serem liberados por ciclo." -#: utils/misc/guc.c:2649 +#: utils/misc/guc_tables.c:3697 msgid "Sets the seed for random-number generation." msgstr "Define a semente para geração de números randômicos." -#: utils/misc/guc.c:2660 +#: utils/misc/guc_tables.c:3708 +msgid "Vacuum cost delay in milliseconds." +msgstr "Atraso do custo da limpeza em milisegundos." + +#: utils/misc/guc_tables.c:3719 +msgid "Vacuum cost delay in milliseconds, for autovacuum." +msgstr "Atraso do custo da limpeza em milisegundos, para autovacuum." + +#: utils/misc/guc_tables.c:3730 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "Número de atualizações ou exclusões de tuplas antes de limpar como uma fração de reltuples." -#: utils/misc/guc.c:2669 +#: utils/misc/guc_tables.c:3740 +msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." +msgstr "Número de inserções de tuplas antes da limpeza como uma fração de reltuples." + +#: utils/misc/guc_tables.c:3750 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "Número de inserções, atualizações ou exclusões de tuplas antes de analisar como uma fração de reltuples." -#: utils/misc/guc.c:2679 +#: utils/misc/guc_tables.c:3760 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "Tempo gasto escrevendo buffers sujos durante o ponto de controle, como fração do intervalo de ponto de controle." -#: utils/misc/guc.c:2698 +#: utils/misc/guc_tables.c:3770 +msgid "Fraction of statements exceeding log_min_duration_sample to be logged." +msgstr "" + +#: utils/misc/guc_tables.c:3771 +msgid "Use a value between 0.0 (never log) and 1.0 (always log)." +msgstr "" + +#: utils/misc/guc_tables.c:3780 +msgid "Sets the fraction of transactions from which to log all statements." +msgstr "Define a fração de transações a partir da qual todas as instruções serão registradas." + +#: utils/misc/guc_tables.c:3781 +msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." +msgstr "" + +#: utils/misc/guc_tables.c:3800 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "Define um comando do interpretador de comandos (shell) que será chamado para arquivar um arquivo do WAL." -#: utils/misc/guc.c:2708 +#: utils/misc/guc_tables.c:3801 +msgid "This is used only if \"archive_library\" is not set." +msgstr "" + +#: utils/misc/guc_tables.c:3810 +msgid "Sets the library that will be called to archive a WAL file." +msgstr "Define a biblioteca que será chamada para arquivar um arquivo do WAL." + +#: utils/misc/guc_tables.c:3811 +msgid "An empty string indicates that \"archive_command\" should be used." +msgstr "" + +#: utils/misc/guc_tables.c:3820 +msgid "Sets the shell command that will be called to retrieve an archived WAL file." +msgstr "Define o comando do interpretador de comandos (shell) que será executado para recuperar um arquivo do WAL arquivado." + +#: utils/misc/guc_tables.c:3830 +msgid "Sets the shell command that will be executed at every restart point." +msgstr "Define o comando do interpretador de comandos (shell) que será executado em cada ponto de reinício." + +#: utils/misc/guc_tables.c:3840 +msgid "Sets the shell command that will be executed once at the end of recovery." +msgstr "Define o comando do interpretador de comandos (shell) que será executado uma vez no final da recuperação." + +#: utils/misc/guc_tables.c:3850 +msgid "Specifies the timeline to recover into." +msgstr "" + +#: utils/misc/guc_tables.c:3860 +msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." +msgstr "" + +#: utils/misc/guc_tables.c:3869 +msgid "Sets the transaction ID up to which recovery will proceed." +msgstr "" + +#: utils/misc/guc_tables.c:3878 +msgid "Sets the time stamp up to which recovery will proceed." +msgstr "" + +#: utils/misc/guc_tables.c:3887 +msgid "Sets the named restore point up to which recovery will proceed." +msgstr "" + +#: utils/misc/guc_tables.c:3896 +msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." +msgstr "" + +#: utils/misc/guc_tables.c:3906 +msgid "Sets the connection string to be used to connect to the sending server." +msgstr "" + +#: utils/misc/guc_tables.c:3917 +msgid "Sets the name of the replication slot to use on the sending server." +msgstr "Define o nome do encaixe de replicação a ser usado no servidor emissor." + +#: utils/misc/guc_tables.c:3927 msgid "Sets the client's character set encoding." msgstr "Define a codificação do conjunto de caracteres do cliente." -#: utils/misc/guc.c:2719 +#: utils/misc/guc_tables.c:3938 msgid "Controls information prefixed to each log line." msgstr "Controla informação prefixada em cada linha do log." -#: utils/misc/guc.c:2720 +#: utils/misc/guc_tables.c:3939 msgid "If blank, no prefix is used." msgstr "Se estiver em branco, nenhum prefixo é utilizado." -#: utils/misc/guc.c:2729 +#: utils/misc/guc_tables.c:3948 msgid "Sets the time zone to use in log messages." -msgstr "Define a zona horária a ser utilizada em mensagens de log." +msgstr "Define a zona horária a ser usada em mensagens de log." -#: utils/misc/guc.c:2739 +#: utils/misc/guc_tables.c:3958 msgid "Sets the display format for date and time values." msgstr "Define o formato de exibição para valores de data e hora." -#: utils/misc/guc.c:2740 +#: utils/misc/guc_tables.c:3959 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Também controla interpretação de entrada de datas ambíguas." -#: utils/misc/guc.c:2751 +#: utils/misc/guc_tables.c:3970 +msgid "Sets the default table access method for new tables." +msgstr "Define o método de acesso à tabela padrão para as novas tabelas." + +#: utils/misc/guc_tables.c:3981 msgid "Sets the default tablespace to create tables and indexes in." -msgstr "Define a tablespace padrão para criação de tabelas e índices." +msgstr "Define o espaço de tabelas padrão para criação de tabelas e índices." -#: utils/misc/guc.c:2752 +#: utils/misc/guc_tables.c:3982 msgid "An empty string selects the database's default tablespace." -msgstr "Uma cadeia de caracteres vazia seleciona a tablespace padrão do banco de dados." +msgstr "Uma cadeia de caracteres vazia seleciona o espaço de tabelas padrão do banco de dados." -#: utils/misc/guc.c:2762 +#: utils/misc/guc_tables.c:3992 msgid "Sets the tablespace(s) to use for temporary tables and sort files." -msgstr "Define a(s) tablespace(s) a ser(em) utilizada(s) para tabelas temporárias e arquivos de ordenação." +msgstr "Define o(s) espaço(s) de tabelas a ser(em) usado(s) para tabelas temporárias e arquivos de classificação." + +#: utils/misc/guc_tables.c:4003 +msgid "Sets whether a CREATEROLE user automatically grants the role to themselves, and with which options." +msgstr "" -#: utils/misc/guc.c:2773 +#: utils/misc/guc_tables.c:4015 msgid "Sets the path for dynamically loadable modules." msgstr "Define o caminho para módulos carregáveis dinamicamente." -#: utils/misc/guc.c:2774 +#: utils/misc/guc_tables.c:4016 msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." msgstr "Se o módulo carregável dinamicamente necessita ser aberto e o nome especificado não tem um componente de diretório (i.e., o nome não contém uma barra), o sistema irá procurar o caminho para o arquivo especificado." -#: utils/misc/guc.c:2787 +#: utils/misc/guc_tables.c:4029 msgid "Sets the location of the Kerberos server key file." msgstr "Define o local do arquivo da chave do servidor Kerberos." -#: utils/misc/guc.c:2798 +#: utils/misc/guc_tables.c:4040 msgid "Sets the Bonjour service name." msgstr "Define o nome do serviço Bonjour." -#: utils/misc/guc.c:2810 -msgid "Shows the collation order locale." -msgstr "Mostra a configuração regional utilizada na ordenação." - -#: utils/misc/guc.c:2821 -msgid "Shows the character classification and case conversion locale." -msgstr "Mostra a configuração regional utilizada na classificação de caracteres e na conversão entre maiúsculas/minúsculas." - -#: utils/misc/guc.c:2832 +#: utils/misc/guc_tables.c:4050 msgid "Sets the language in which messages are displayed." msgstr "Define a língua na qual as mensagens são mostradas." -#: utils/misc/guc.c:2842 +#: utils/misc/guc_tables.c:4060 msgid "Sets the locale for formatting monetary amounts." msgstr "Define a configuração regional para formato de moeda." -#: utils/misc/guc.c:2852 +#: utils/misc/guc_tables.c:4070 msgid "Sets the locale for formatting numbers." msgstr "Define a configuração regional para formato de número." -#: utils/misc/guc.c:2862 +#: utils/misc/guc_tables.c:4080 msgid "Sets the locale for formatting date and time values." msgstr "Define a configuração regional para formato de data e hora." -#: utils/misc/guc.c:2872 +#: utils/misc/guc_tables.c:4090 msgid "Lists shared libraries to preload into each backend." msgstr "Mostra bibliotecas compartilhadas a serem carregadas em cada processo servidor." -#: utils/misc/guc.c:2883 +#: utils/misc/guc_tables.c:4101 msgid "Lists shared libraries to preload into server." msgstr "Mostra bibliotecas compartilhadas a serem carregadas no servidor." -#: utils/misc/guc.c:2894 +#: utils/misc/guc_tables.c:4112 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "Lista bibliotecas compartilhadas sem privilégio a serem carregadas em cada processo servidor." -#: utils/misc/guc.c:2905 +#: utils/misc/guc_tables.c:4123 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "Define a ordem de busca em esquemas para nomes que não especificam um esquema." -#: utils/misc/guc.c:2917 -msgid "Sets the server (database) character set encoding." -msgstr "Define a codificação do conjunto de caracteres do servidor (banco de dados)." +#: utils/misc/guc_tables.c:4135 +msgid "Shows the server (database) character set encoding." +msgstr "Mostra a codificação do conjunto de caracteres do servidor (banco de dados)." -#: utils/misc/guc.c:2929 +#: utils/misc/guc_tables.c:4147 msgid "Shows the server version." msgstr "Mostra a versão do servidor." -#: utils/misc/guc.c:2941 +#: utils/misc/guc_tables.c:4159 msgid "Sets the current role." msgstr "Define a role atual." -#: utils/misc/guc.c:2953 +#: utils/misc/guc_tables.c:4171 msgid "Sets the session user name." msgstr "Define o nome de usuário da sessão." -#: utils/misc/guc.c:2964 +#: utils/misc/guc_tables.c:4182 msgid "Sets the destination for server log output." msgstr "Define o destino da saída do log do servidor." -#: utils/misc/guc.c:2965 -msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", and \"eventlog\", depending on the platform." -msgstr "Valores válidos são combinações de \"stderr\", \"syslog\", \"csvlog\" e \"eventlog\", dependendo da plataforma." +#: utils/misc/guc_tables.c:4183 +msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." +msgstr "Os valores válidos são combinações de “stderrâ€, “syslogâ€, “csvlogâ€, “jsonlog†e “eventlogâ€, dependendo da plataforma." -#: utils/misc/guc.c:2976 +#: utils/misc/guc_tables.c:4194 msgid "Sets the destination directory for log files." msgstr "Define o diretório de destino dos arquivos de log." -#: utils/misc/guc.c:2977 +#: utils/misc/guc_tables.c:4195 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "Pode ser especificado como caminho relativo ao diretório de dados ou como caminho absoluto." -#: utils/misc/guc.c:2987 +#: utils/misc/guc_tables.c:4205 msgid "Sets the file name pattern for log files." msgstr "Define o padrão de nome de arquivo para arquivos de log." -#: utils/misc/guc.c:2998 +#: utils/misc/guc_tables.c:4216 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "Define o nome do programa utilizado para identificar mensagens do PostgreSQL no syslog." -#: utils/misc/guc.c:3009 +#: utils/misc/guc_tables.c:4227 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "Define o nome do programa utilizado para identificar mensagens do PostgreSQL no log de eventos." -#: utils/misc/guc.c:3020 +#: utils/misc/guc_tables.c:4238 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "Define a zona horária para exibição e interpretação de timestamps." -#: utils/misc/guc.c:3030 +#: utils/misc/guc_tables.c:4248 msgid "Selects a file of time zone abbreviations." msgstr "Seleciona um arquivo de abreviações de zonas horárias." -#: utils/misc/guc.c:3040 -msgid "Sets the current transaction's isolation level." -msgstr "Define o nível de isolamento da transação atual." - -#: utils/misc/guc.c:3051 +#: utils/misc/guc_tables.c:4258 msgid "Sets the owning group of the Unix-domain socket." msgstr "Define o grupo dono do soquete de domínio Unix." -#: utils/misc/guc.c:3052 +#: utils/misc/guc_tables.c:4259 msgid "The owning user of the socket is always the user that starts the server." msgstr "O usuário dono do soquete é sempre o usuário que inicia o servidor." -#: utils/misc/guc.c:3062 +#: utils/misc/guc_tables.c:4269 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Define o diretório onde o soquete de domínio Unix será criado." -#: utils/misc/guc.c:3077 +#: utils/misc/guc_tables.c:4280 msgid "Sets the host name or IP address(es) to listen to." -msgstr "Define o nome da máquina ou endereço(s) IP para escutar." +msgstr "Define o nome do hospedeiro ou endereço(s) IP para escutar." -#: utils/misc/guc.c:3092 +#: utils/misc/guc_tables.c:4295 msgid "Sets the server's data directory." msgstr "Define o diretório de dados do servidor." -#: utils/misc/guc.c:3103 +#: utils/misc/guc_tables.c:4306 msgid "Sets the server's main configuration file." msgstr "Define o arquivo de configuração principal do servidor." -#: utils/misc/guc.c:3114 +#: utils/misc/guc_tables.c:4317 msgid "Sets the server's \"hba\" configuration file." msgstr "Define o arquivo de configuração \"hba\" do servidor." -#: utils/misc/guc.c:3125 +#: utils/misc/guc_tables.c:4328 msgid "Sets the server's \"ident\" configuration file." msgstr "Define o arquivo de configuração \"ident\" do servidor." -#: utils/misc/guc.c:3136 +#: utils/misc/guc_tables.c:4339 msgid "Writes the postmaster PID to the specified file." msgstr "Escreve o PID do postmaster no arquivo especificado." -#: utils/misc/guc.c:3147 +#: utils/misc/guc_tables.c:4350 +msgid "Shows the name of the SSL library." +msgstr "" + +#: utils/misc/guc_tables.c:4365 msgid "Location of the SSL server certificate file." msgstr "Local do arquivo de certificado SSL do servidor." -#: utils/misc/guc.c:3157 +#: utils/misc/guc_tables.c:4375 msgid "Location of the SSL server private key file." msgstr "Local do arquivo da chave privada SSL do servidor." -#: utils/misc/guc.c:3167 +#: utils/misc/guc_tables.c:4385 msgid "Location of the SSL certificate authority file." msgstr "Local do arquivo de autoridade certificadora SSL." -#: utils/misc/guc.c:3177 +#: utils/misc/guc_tables.c:4395 msgid "Location of the SSL certificate revocation list file." msgstr "Local do arquivo da lista de revogação de certificados SSL." -#: utils/misc/guc.c:3187 -msgid "Writes temporary statistics files to the specified directory." -msgstr "Escreve arquivos temporários de estatísticas em um diretório especificado." +#: utils/misc/guc_tables.c:4405 +msgid "Location of the SSL certificate revocation list directory." +msgstr "Localização do diretório da lista de revogação de certificados SSL." -#: utils/misc/guc.c:3198 -msgid "List of names of potential synchronous standbys." -msgstr "Lista os nomes de possíveis servidores em espera síncronos." +#: utils/misc/guc_tables.c:4415 +msgid "Number of synchronous standbys and list of names of potential synchronous ones." +msgstr "Número de servidores em-espera síncronos, e lista de nomes de potenciais síncronos." -#: utils/misc/guc.c:3209 +#: utils/misc/guc_tables.c:4426 msgid "Sets default text search configuration." -msgstr "Define a configuração de busca textual padrão." +msgstr "Define a configuração de procura de texto completo padrão." -#: utils/misc/guc.c:3219 +#: utils/misc/guc_tables.c:4436 msgid "Sets the list of allowed SSL ciphers." msgstr "Define a lista de cifras SSL permitidas." -#: utils/misc/guc.c:3234 +#: utils/misc/guc_tables.c:4451 msgid "Sets the curve to use for ECDH." msgstr "Define a curva para utilizar em ECDH." -#: utils/misc/guc.c:3249 +#: utils/misc/guc_tables.c:4466 +msgid "Location of the SSL DH parameters file." +msgstr "Localização do arquivo de parâmetros DH para SSL." + +#: utils/misc/guc_tables.c:4477 +msgid "Command to obtain passphrases for SSL." +msgstr "" + +#: utils/misc/guc_tables.c:4488 msgid "Sets the application name to be reported in statistics and logs." msgstr "Define o nome da aplicação a ser informado em estatísticas e logs." -#: utils/misc/guc.c:3269 +#: utils/misc/guc_tables.c:4499 +msgid "Sets the name of the cluster, which is included in the process title." +msgstr "" + +#: utils/misc/guc_tables.c:4510 +msgid "Sets the WAL resource managers for which WAL consistency checks are done." +msgstr "" + +#: utils/misc/guc_tables.c:4511 +msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." +msgstr "" + +#: utils/misc/guc_tables.c:4521 +msgid "JIT provider to use." +msgstr "Provedor JIT a ser usado." + +#: utils/misc/guc_tables.c:4532 +msgid "Log backtrace for errors in these functions." +msgstr "Registro de rastreamento para erros nessas funções." + +#: utils/misc/guc_tables.c:4543 +msgid "Use direct I/O for file access." +msgstr "" + +#: utils/misc/guc_tables.c:4563 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Define se \"\\'\" é permitido em cadeias de caracteres literais." -#: utils/misc/guc.c:3279 +#: utils/misc/guc_tables.c:4573 msgid "Sets the output format for bytea." msgstr "Define o formato de saída para bytea." -#: utils/misc/guc.c:3289 +#: utils/misc/guc_tables.c:4583 msgid "Sets the message levels that are sent to the client." msgstr "Define os níveis de mensagem que são enviadas ao cliente." -#: utils/misc/guc.c:3290 utils/misc/guc.c:3343 utils/misc/guc.c:3354 -#: utils/misc/guc.c:3410 +#: utils/misc/guc_tables.c:4584 utils/misc/guc_tables.c:4680 +#: utils/misc/guc_tables.c:4691 utils/misc/guc_tables.c:4763 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr "Cada nível inclui todos os níveis que o seguem. Quanto mais superior for o nível, menos mensagens são enviadas." -#: utils/misc/guc.c:3300 +#: utils/misc/guc_tables.c:4594 +msgid "Enables in-core computation of query identifiers." +msgstr "" + +#: utils/misc/guc_tables.c:4604 msgid "Enables the planner to use constraints to optimize queries." -msgstr "Habilita o planejador a usar retrições para otimizar consultas." +msgstr "Ativa o planejador a usar retrições para otimizar consultas." -#: utils/misc/guc.c:3301 +#: utils/misc/guc_tables.c:4605 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." -msgstr "Buscas em tabelas serão ignoradas se suas restrições garantirem que nenhum registro corresponde a consulta." +msgstr "As varreduras de tabelas serão ignoradas se suas restrições garantirem que nenhuma linha corresponde à consulta." + +#: utils/misc/guc_tables.c:4616 +msgid "Sets the default compression method for compressible values." +msgstr "Define o método de compressão padrão para valores comprimíveis." -#: utils/misc/guc.c:3311 +#: utils/misc/guc_tables.c:4627 msgid "Sets the transaction isolation level of each new transaction." msgstr "Define nível de isolamento de transação de cada nova transação." -#: utils/misc/guc.c:3321 +#: utils/misc/guc_tables.c:4637 +msgid "Sets the current transaction's isolation level." +msgstr "Define o nível de isolamento da transação atual." + +#: utils/misc/guc_tables.c:4648 msgid "Sets the display format for interval values." msgstr "Define o formato de exibição para valores interval." -#: utils/misc/guc.c:3332 +#: utils/misc/guc_tables.c:4659 +msgid "Log level for reporting invalid ICU locale strings." +msgstr "" + +#: utils/misc/guc_tables.c:4669 msgid "Sets the verbosity of logged messages." msgstr "Define o detalhamento das mensagens registradas." -#: utils/misc/guc.c:3342 +#: utils/misc/guc_tables.c:4679 msgid "Sets the message levels that are logged." msgstr "Define os níveis de mensagem que serão registrados." -#: utils/misc/guc.c:3353 +#: utils/misc/guc_tables.c:4690 msgid "Causes all statements generating error at or above this level to be logged." msgstr "Registra todos os comandos que geram erro neste nível ou acima." -#: utils/misc/guc.c:3364 +#: utils/misc/guc_tables.c:4701 msgid "Sets the type of statements logged." msgstr "Define os tipos de comandos registrados." -#: utils/misc/guc.c:3374 +#: utils/misc/guc_tables.c:4711 msgid "Sets the syslog \"facility\" to be used when syslog enabled." -msgstr "Define o syslog \"facility\" a ser utilizado quando syslog estiver habilitado." +msgstr "Define o syslog \"facility\" a ser utilizado quando syslog estiver ativado." -#: utils/misc/guc.c:3389 +#: utils/misc/guc_tables.c:4722 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "Define o comportamento de sessões para gatilhos e regras de reescrita." -#: utils/misc/guc.c:3399 +#: utils/misc/guc_tables.c:4732 msgid "Sets the current transaction's synchronization level." msgstr "Define o nível de sincronização da transação atual." -#: utils/misc/guc.c:3409 +#: utils/misc/guc_tables.c:4742 +msgid "Allows archiving of WAL files using archive_command." +msgstr "Permite arquivamento de arquivos do WAL usando archive_command." + +#: utils/misc/guc_tables.c:4752 +msgid "Sets the action to perform upon reaching the recovery target." +msgstr "" + +#: utils/misc/guc_tables.c:4762 msgid "Enables logging of recovery-related debugging information." -msgstr "Habilita o registro de informação de depuração relacionada a recuperação." +msgstr "Ativa o registro de informações de depuração relacionadas à recuperação." -#: utils/misc/guc.c:3425 +#: utils/misc/guc_tables.c:4779 msgid "Collects function-level statistics on database activity." msgstr "Coleta estatísticas de funções sobre a atividade do banco de dados." -#: utils/misc/guc.c:3435 -msgid "Set the level of information written to the WAL." -msgstr "Define o nível de informação escrito no WAL." +#: utils/misc/guc_tables.c:4790 +msgid "Sets the consistency of accesses to statistics data." +msgstr "Define a consistência dos acessos aos dados estatísticos." + +#: utils/misc/guc_tables.c:4800 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "" + +#: utils/misc/guc_tables.c:4810 +msgid "Sets the level of information written to the WAL." +msgstr "Define o nível de informação escrita no WAL." -#: utils/misc/guc.c:3445 +#: utils/misc/guc_tables.c:4820 msgid "Selects the dynamic shared memory implementation used." -msgstr "Seleciona a implementação de memória compartilhada dinâmica utilizada." +msgstr "Seleciona a implementação de memória compartilhada dinâmica usada." -#: utils/misc/guc.c:3455 +#: utils/misc/guc_tables.c:4830 +msgid "Selects the shared memory implementation used for the main shared memory region." +msgstr "Seleciona a implementação de memória compartilhada usada para a região principal de memória compartilhada." + +#: utils/misc/guc_tables.c:4840 msgid "Selects the method used for forcing WAL updates to disk." msgstr "Seleciona o método utilizado para forçar atualizações do WAL no disco." -#: utils/misc/guc.c:3465 +#: utils/misc/guc_tables.c:4850 msgid "Sets how binary values are to be encoded in XML." msgstr "Define como valores binários serão codificados em XML." -#: utils/misc/guc.c:3475 +#: utils/misc/guc_tables.c:4860 msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." msgstr "Define se dados XML em operações de análise ou serialização implícita serão considerados como documentos ou como fragmentos de conteúdo." -#: utils/misc/guc.c:3486 -msgid "Use of huge pages on Linux." -msgstr "Utiliza páginas grandes no Linux." - -#: utils/misc/guc.c:4301 -#, c-format -msgid "" -"%s does not know where to find the server configuration file.\n" -"You must specify the --config-file or -D invocation option or set the PGDATA environment variable.\n" -msgstr "" -"%s não sabe onde encontrar o arquivo de configuração do servidor.\n" -"Você deve especificar a opção --config-file ou -D ou definir uma variável de ambiente PGDATA.\n" +#: utils/misc/guc_tables.c:4871 +msgid "Use of huge pages on Linux or Windows." +msgstr "Uso de páginas enormes (huge pages) no Linux ou Windows." -#: utils/misc/guc.c:4320 -#, c-format -msgid "%s cannot access the server configuration file \"%s\": %s\n" -msgstr "%s não pode acessar o arquivo de configuração do servidor \"%s\": %s\n" +#: utils/misc/guc_tables.c:4881 +msgid "Prefetch referenced blocks during recovery." +msgstr "Pré-busca blocos referenciados durante a recuperação." -#: utils/misc/guc.c:4348 -#, c-format -msgid "" -"%s does not know where to find the database system data.\n" -"This can be specified as \"data_directory\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +#: utils/misc/guc_tables.c:4882 +msgid "Look ahead in the WAL to find references to uncached data." msgstr "" -"%s não sabe onde encontrar os dados do sistema de banco de dados.\n" -"Isto pode ser especificado como \"data_directory\" no \"%s\", pela opção -D ou definindo uma variável de ambiente PGDATA.\n" -#: utils/misc/guc.c:4396 -#, c-format -msgid "" -"%s does not know where to find the \"hba\" configuration file.\n" -"This can be specified as \"hba_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" -msgstr "" -"%s não sabe onde encontrar o arquivo de configuração \"hba\".\n" -"Isto pode ser especificado como \"hba_file\" no \"%s\", pela opção -D ou definindo uma variável de ambiente PGDATA.\n" +#: utils/misc/guc_tables.c:4891 +msgid "Forces the planner's use parallel query nodes." +msgstr "Força o uso de nós de consulta paralelos pelo planejador." -#: utils/misc/guc.c:4419 -#, c-format -msgid "" -"%s does not know where to find the \"ident\" configuration file.\n" -"This can be specified as \"ident_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +#: utils/misc/guc_tables.c:4892 +msgid "This can be useful for testing the parallel query infrastructure by forcing the planner to generate plans that contain nodes that perform tuple communication between workers and the main process." msgstr "" -"%s não sabe onde encontrar o arquivo de configuração \"ident\".\n" -"Isto pode ser especificado como \"ident_file\" no \"%s\", pela opção -D ou definindo uma variável de ambiente PGDATA.\n" - -#: utils/misc/guc.c:5011 utils/misc/guc.c:5191 -msgid "Value exceeds integer range." -msgstr "Valor excede intervalo de inteiros." - -#: utils/misc/guc.c:5030 -msgid "Valid units for this parameter are \"kB\", \"MB\", \"GB\", and \"TB\"." -msgstr "Unidades válidas para este parâmetro são \"kB\", \"MB\", \"GB\" e \"TB\"." - -#: utils/misc/guc.c:5105 -msgid "Valid units for this parameter are \"ms\", \"s\", \"min\", \"h\", and \"d\"." -msgstr "Unidades válidas para este parâmetro são \"ms\", \"s\", \"min\", \"h\" e \"d\"." - -#: utils/misc/guc.c:5399 utils/misc/guc.c:5524 utils/misc/guc.c:6767 -#: utils/misc/guc.c:8964 utils/misc/guc.c:8998 -#, c-format -msgid "invalid value for parameter \"%s\": \"%s\"" -msgstr "valor é inválido para parâmetro \"%s\": \"%s\"" - -#: utils/misc/guc.c:5437 -#, c-format -msgid "parameter \"%s\" requires a numeric value" -msgstr "parâmetro \"%s\" requer um valor numérico" - -#: utils/misc/guc.c:5446 -#, c-format -msgid "%g is outside the valid range for parameter \"%s\" (%g .. %g)" -msgstr "%g está fora do intervalo válido para parâmetro \"%s\" (%g .. %g)" - -#: utils/misc/guc.c:5612 utils/misc/guc.c:6334 utils/misc/guc.c:6386 -#: utils/misc/guc.c:6749 utils/misc/guc.c:7446 utils/misc/guc.c:7605 -#: utils/misc/guc.c:8784 -#, c-format -msgid "unrecognized configuration parameter \"%s\"" -msgstr "parâmetro de configuração \"%s\" desconhecido" - -#: utils/misc/guc.c:5627 utils/misc/guc.c:6760 -#, c-format -msgid "parameter \"%s\" cannot be changed" -msgstr "parâmetro \"%s\" não pode ser mudado" - -#: utils/misc/guc.c:5660 -#, c-format -msgid "parameter \"%s\" cannot be changed now" -msgstr "parâmetro \"%s\" não pode ser mudado agora" - -#: utils/misc/guc.c:5705 -#, c-format -msgid "parameter \"%s\" cannot be set after connection start" -msgstr "parâmetro \"%s\" não pode ser definido depois que a conexão foi iniciada" - -#: utils/misc/guc.c:5715 utils/misc/guc.c:8800 -#, c-format -msgid "permission denied to set parameter \"%s\"" -msgstr "permissão negada ao definir parâmetro \"%s\"" - -#: utils/misc/guc.c:5753 -#, c-format -msgid "cannot set parameter \"%s\" within security-definer function" -msgstr "não pode definir parâmetro \"%s\" em função com privilégios do dono" - -#: utils/misc/guc.c:6342 utils/misc/guc.c:6390 utils/misc/guc.c:7609 -#, c-format -msgid "must be superuser to examine \"%s\"" -msgstr "deve ser super-usuário para examinar \"%s\"" - -#: utils/misc/guc.c:6456 -#, c-format -msgid "SET %s takes only one argument" -msgstr "SET %s só tem um argumento" -#: utils/misc/guc.c:6713 -#, c-format -msgid "must be superuser to execute ALTER SYSTEM command" -msgstr "deve ser super-usuário para executar o comando ALTER SYSTEM" - -#: utils/misc/guc.c:6946 -#, c-format -msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" -msgstr "SET LOCAL TRANSACTION SNAPSHOT não está implementado" - -#: utils/misc/guc.c:7034 -#, c-format -msgid "SET requires parameter name" -msgstr "SET requer nome do parâmetro" +#: utils/misc/guc_tables.c:4904 +msgid "Chooses the algorithm for encrypting passwords." +msgstr "Escolhe o algoritmo para encriptar senhas." -#: utils/misc/guc.c:7148 -#, c-format -msgid "attempt to redefine parameter \"%s\"" -msgstr "tentativa de redefinir parâmetro \"%s\"" +#: utils/misc/guc_tables.c:4914 +msgid "Controls the planner's selection of custom or generic plan." +msgstr "Controla a seleção do planejador de plano personalizado ou genérico." -#: utils/misc/guc.c:8504 -#, c-format -msgid "could not parse setting for parameter \"%s\"" -msgstr "não pôde analisar definição para parâmetro \"%s\"" +#: utils/misc/guc_tables.c:4915 +msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." +msgstr "" -#: utils/misc/guc.c:8862 utils/misc/guc.c:8896 -#, c-format -msgid "invalid value for parameter \"%s\": %d" -msgstr "valor é inválido para parâmetro \"%s\": %d" +#: utils/misc/guc_tables.c:4927 +msgid "Sets the minimum SSL/TLS protocol version to use." +msgstr "Define a versão mínima do protocolo SSL/TLS a ser usada." -#: utils/misc/guc.c:8930 -#, c-format -msgid "invalid value for parameter \"%s\": %g" -msgstr "valor é inválido para parâmetro \"%s\": %g" +#: utils/misc/guc_tables.c:4939 +msgid "Sets the maximum SSL/TLS protocol version to use." +msgstr "Define a versão máxima do protocolo SSL/TLS a ser usada." -#: utils/misc/guc.c:9120 -#, c-format -msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." -msgstr "\"temp_buffers\" não pode ser alterado após qualquer tabela temporária ter sido acessada na sessão." +#: utils/misc/guc_tables.c:4951 +msgid "Sets the method for synchronizing the data directory before crash recovery." +msgstr "" -#: utils/misc/guc.c:9132 -#, c-format -msgid "SET AUTOCOMMIT TO OFF is no longer supported" -msgstr "SET AUTOCOMMIT TO OFF não é mais suportado" +#: utils/misc/guc_tables.c:4960 +msgid "Forces immediate streaming or serialization of changes in large transactions." +msgstr "" -#: utils/misc/guc.c:9144 -#, c-format -msgid "assertion checking is not supported by this build" -msgstr "verificação de asserção não é suportada por essa construção" +#: utils/misc/guc_tables.c:4961 +msgid "On the publisher, it allows streaming or serializing each change in logical decoding. On the subscriber, it allows serialization of all changes to files and notifies the parallel apply workers to read and apply them at the end of the transaction." +msgstr "" -#: utils/misc/guc.c:9157 +#: utils/misc/help_config.c:129 #, c-format -msgid "Bonjour is not supported by this build" -msgstr "Bonjour não é suportado por essa construção" +msgid "internal error: unrecognized run-time parameter type\n" +msgstr "erro interno: tipo de parâmetro em tempo de execução desconhecido\n" -#: utils/misc/guc.c:9170 +#: utils/misc/pg_controldata.c:51 utils/misc/pg_controldata.c:91 +#: utils/misc/pg_controldata.c:182 utils/misc/pg_controldata.c:223 #, c-format -msgid "SSL is not supported by this build" -msgstr "SSL não é suportado por essa construção" +msgid "calculated CRC checksum does not match value stored in file" +msgstr "" -#: utils/misc/guc.c:9182 +#: utils/misc/pg_rusage.c:64 #, c-format -msgid "Cannot enable parameter when \"log_statement_stats\" is true." -msgstr "não pode habilitar parâmetro quando \"log_statement_stats\" é true." +msgid "CPU: user: %d.%02d s, system: %d.%02d s, elapsed: %d.%02d s" +msgstr "CPU: usuário: %d.%02d s, sistema: %d.%02d s, decorrido: %d.%02d s" -#: utils/misc/guc.c:9194 +#: utils/misc/rls.c:127 #, c-format -msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." -msgstr "não pode habilitar \"log_statement_stats\" quando \"log_parser_stats\", \"log_planner_stats\" ou \"log_executor_stats\" é true." +msgid "query would be affected by row-level security policy for table \"%s\"" +msgstr "a consulta seria afetada pela política de segurança no nível de linha da tabela \"%s\"" -#: utils/misc/help_config.c:131 +#: utils/misc/rls.c:129 #, c-format -msgid "internal error: unrecognized run-time parameter type\n" -msgstr "erro interno: tipo de parâmetro em tempo de execução desconhecido\n" +msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." +msgstr "Para desativar a política para o dono da tabela, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/timeout.c:422 +#: utils/misc/timeout.c:524 #, c-format msgid "cannot add more timeout reasons" -msgstr "não pode adicionar razões adicionais de espera" +msgstr "não é possível adicionar mais motivos de tempo de espera limite" -#: utils/misc/tzparser.c:61 +#: utils/misc/tzparser.c:60 #, c-format msgid "time zone abbreviation \"%s\" is too long (maximum %d characters) in time zone file \"%s\", line %d" msgstr "abreviação de zona horária \"%s\" é muito longa (máximo de %d caracteres) no arquivo de zona horária \"%s\", linha %d" -#: utils/misc/tzparser.c:73 +#: utils/misc/tzparser.c:72 #, c-format msgid "time zone offset %d is out of range in time zone file \"%s\", line %d" msgstr "deslocamento %d de zona horária está fora do intervalo no arquivo de zona horária \"%s\", linha %d" -#: utils/misc/tzparser.c:112 +#: utils/misc/tzparser.c:111 #, c-format msgid "missing time zone abbreviation in time zone file \"%s\", line %d" msgstr "faltando abreviação de zona horária no arquivo de zona horária \"%s\", linha %d" -#: utils/misc/tzparser.c:121 +#: utils/misc/tzparser.c:120 #, c-format msgid "missing time zone offset in time zone file \"%s\", line %d" msgstr "faltando deslocamento de zona horária no arquivo de zona horária \"%s\", linha %d" -#: utils/misc/tzparser.c:133 +#: utils/misc/tzparser.c:132 #, c-format msgid "invalid number for time zone offset in time zone file \"%s\", line %d" msgstr "número é inválido para deslocamento de zona horária no arquivo de zona horária \"%s\", linha %d" -#: utils/misc/tzparser.c:169 +#: utils/misc/tzparser.c:168 #, c-format msgid "invalid syntax in time zone file \"%s\", line %d" msgstr "sintaxe é inválida no arquivo de zona horária \"%s\", linha %d" -#: utils/misc/tzparser.c:237 +#: utils/misc/tzparser.c:236 #, c-format msgid "time zone abbreviation \"%s\" is multiply defined" msgstr "abreviação de zona horária \"%s\" foi definida mais de uma vez" -#: utils/misc/tzparser.c:239 +#: utils/misc/tzparser.c:238 #, c-format msgid "Entry in time zone file \"%s\", line %d, conflicts with entry in file \"%s\", line %d." msgstr "Arquivo de zona horária \"%s\", linha %d, conflita com entrada no arquivo \"%s\", linha %d." -#: utils/misc/tzparser.c:301 +#: utils/misc/tzparser.c:300 #, c-format msgid "invalid time zone file name \"%s\"" msgstr "nome de arquivo de zona horária \"%s\" é inválido" -#: utils/misc/tzparser.c:314 +#: utils/misc/tzparser.c:313 #, c-format msgid "time zone file recursion limit exceeded in file \"%s\"" msgstr "limite de recursão do arquivo de zona horária foi excedido no arquivo \"%s\"" -#: utils/misc/tzparser.c:353 utils/misc/tzparser.c:366 +#: utils/misc/tzparser.c:352 utils/misc/tzparser.c:365 #, c-format msgid "could not read time zone file \"%s\": %m" -msgstr "não pôde ler arquivo de zona horária \"%s\": %m" +msgstr "não foi possível ler o arquivo de zona horária \"%s\": %m" #: utils/misc/tzparser.c:376 #, c-format msgid "line is too long in time zone file \"%s\", line %d" msgstr "linha é muito longa no arquivo de zona horária \"%s\", linha %d" -#: utils/misc/tzparser.c:399 +#: utils/misc/tzparser.c:400 #, c-format msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "@INCLUDE sem nome de arquivo no arquivo de zona horária \"%s\", linha %d" -#: utils/mmgr/aset.c:500 +#: utils/mmgr/aset.c:446 utils/mmgr/generation.c:206 utils/mmgr/slab.c:367 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Falhou ao criar contexto de memória \"%s\"." -#: utils/mmgr/aset.c:679 utils/mmgr/aset.c:873 utils/mmgr/aset.c:1115 +#: utils/mmgr/dsa.c:532 utils/mmgr/dsa.c:1346 +#, c-format +msgid "could not attach to dynamic shared area" +msgstr "não foi possível anexar à área compartilhada dinâmica" + +#: utils/mmgr/mcxt.c:1047 utils/mmgr/mcxt.c:1083 utils/mmgr/mcxt.c:1121 +#: utils/mmgr/mcxt.c:1159 utils/mmgr/mcxt.c:1247 utils/mmgr/mcxt.c:1278 +#: utils/mmgr/mcxt.c:1314 utils/mmgr/mcxt.c:1503 utils/mmgr/mcxt.c:1548 +#: utils/mmgr/mcxt.c:1605 #, c-format -msgid "Failed on request of size %zu." -msgstr "Falhou ao requisitar o tamanho %zu." +msgid "Failed on request of size %zu in memory context \"%s\"." +msgstr "Falha na solicitação de tamanho %zu no contexto de memória \"%s\"." -#: utils/mmgr/portalmem.c:208 +#: utils/mmgr/mcxt.c:1210 +#, c-format +msgid "logging memory contexts of PID %d" +msgstr "registrando contextos de memória do PID %d" + +#: utils/mmgr/portalmem.c:188 #, c-format msgid "cursor \"%s\" already exists" msgstr "cursor \"%s\" já existe" -#: utils/mmgr/portalmem.c:212 +#: utils/mmgr/portalmem.c:192 #, c-format msgid "closing existing cursor \"%s\"" msgstr "fechando cursor existente \"%s\"" -#: utils/mmgr/portalmem.c:479 +#: utils/mmgr/portalmem.c:402 +#, c-format +msgid "portal \"%s\" cannot be run" +msgstr "portal \"%s\" não pode ser executado" + +#: utils/mmgr/portalmem.c:480 +#, c-format +msgid "cannot drop pinned portal \"%s\"" +msgstr "não é possível excluir o portal fixado \"%s\"" + +#: utils/mmgr/portalmem.c:488 #, c-format msgid "cannot drop active portal \"%s\"" -msgstr "não pode remover portal ativo \"%s\"" +msgstr "não é possível remover portal ativo \"%s\"" -#: utils/mmgr/portalmem.c:669 +#: utils/mmgr/portalmem.c:739 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" -msgstr "não pode executar PREPARE em uma transação que criou um cursor WITH HOLD" +msgstr "não é possível executar PREPARE em uma transação que criou um cursor WITH HOLD" + +#: utils/mmgr/portalmem.c:1230 +#, c-format +msgid "cannot perform transaction commands inside a cursor loop that is not read-only" +msgstr "não é possível executar comandos de transação dentro de um laço de cursor que não seja de leitura-apenas" + +#: utils/sort/logtape.c:266 utils/sort/logtape.c:287 +#, c-format +msgid "could not seek to block %ld of temporary file" +msgstr "não foi possível se posicionar no bloco %ld do arquivo temporário" + +#: utils/sort/sharedtuplestore.c:467 +#, c-format +msgid "unexpected chunk in shared tuplestore temporary file" +msgstr "pedaço inesperado no arquivo temporário tuplestore compartilhado" + +#: utils/sort/sharedtuplestore.c:549 +#, c-format +msgid "could not seek to block %u in shared tuplestore temporary file" +msgstr "não foi possível se posicionar no bloco %u no arquivo temporário tuplestore compartilhado" -#: utils/sort/logtape.c:229 +#: utils/sort/tuplesort.c:2372 #, c-format -msgid "could not read block %ld of temporary file: %m" -msgstr "não pôde ler bloco %ld do arquivo temporário: %m" +msgid "cannot have more than %d runs for an external sort" +msgstr "não é possível haver mais de %d execuções para uma classificação externa" -#: utils/sort/tuplesort.c:3255 +#: utils/sort/tuplesortvariants.c:1363 #, c-format msgid "could not create unique index \"%s\"" -msgstr "não pôde criar índice único \"%s\"" +msgstr "não foi possível criar o índice único \"%s\"" -#: utils/sort/tuplesort.c:3257 +#: utils/sort/tuplesortvariants.c:1365 #, c-format msgid "Key %s is duplicated." msgstr "Chave %s está duplicada." -#: utils/sort/tuplestore.c:506 utils/sort/tuplestore.c:516 -#: utils/sort/tuplestore.c:843 utils/sort/tuplestore.c:947 -#: utils/sort/tuplestore.c:1011 utils/sort/tuplestore.c:1028 -#: utils/sort/tuplestore.c:1230 utils/sort/tuplestore.c:1295 -#: utils/sort/tuplestore.c:1304 +#: utils/sort/tuplesortvariants.c:1366 #, c-format -msgid "could not seek in tuplestore temporary file: %m" -msgstr "não pôde posicionar no arquivo temporário de tuplestore: %m" +msgid "Duplicate keys exist." +msgstr "Existem chaves duplicadas." -#: utils/sort/tuplestore.c:1451 utils/sort/tuplestore.c:1524 -#: utils/sort/tuplestore.c:1530 +#: utils/sort/tuplestore.c:518 utils/sort/tuplestore.c:528 +#: utils/sort/tuplestore.c:869 utils/sort/tuplestore.c:973 +#: utils/sort/tuplestore.c:1037 utils/sort/tuplestore.c:1054 +#: utils/sort/tuplestore.c:1256 utils/sort/tuplestore.c:1321 +#: utils/sort/tuplestore.c:1330 #, c-format -msgid "could not read from tuplestore temporary file: %m" -msgstr "não pôde ler do arquivo temporário de tuplestore: %m" +msgid "could not seek in tuplestore temporary file" +msgstr "não foi possível se posicionar no arquivo temporário tuplestore" -#: utils/sort/tuplestore.c:1492 utils/sort/tuplestore.c:1497 -#: utils/sort/tuplestore.c:1503 +#: utils/time/snapmgr.c:571 #, c-format -msgid "could not write to tuplestore temporary file: %m" -msgstr "não pôde escrever em arquivo temporário de tuplestore: %m" +msgid "The source transaction is not running anymore." +msgstr "A transação de origem não está mais em execução." -#: utils/time/snapmgr.c:890 +#: utils/time/snapmgr.c:1166 #, c-format msgid "cannot export a snapshot from a subtransaction" -msgstr "não pode exportar um instantâneo de uma subtransação" +msgstr "não é possível exportar um instantâneo de uma subtransação" -#: utils/time/snapmgr.c:1040 utils/time/snapmgr.c:1045 -#: utils/time/snapmgr.c:1050 utils/time/snapmgr.c:1065 -#: utils/time/snapmgr.c:1070 utils/time/snapmgr.c:1075 -#: utils/time/snapmgr.c:1174 utils/time/snapmgr.c:1190 -#: utils/time/snapmgr.c:1215 +#: utils/time/snapmgr.c:1325 utils/time/snapmgr.c:1330 +#: utils/time/snapmgr.c:1335 utils/time/snapmgr.c:1350 +#: utils/time/snapmgr.c:1355 utils/time/snapmgr.c:1360 +#: utils/time/snapmgr.c:1375 utils/time/snapmgr.c:1380 +#: utils/time/snapmgr.c:1385 utils/time/snapmgr.c:1487 +#: utils/time/snapmgr.c:1503 utils/time/snapmgr.c:1528 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "dado de instantâneo é inválido no arquivo \"%s\"" -#: utils/time/snapmgr.c:1112 +#: utils/time/snapmgr.c:1422 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "SET TRANSACTION SNAPSHOT deve ser chamado antes de qualquer consulta" -#: utils/time/snapmgr.c:1121 +#: utils/time/snapmgr.c:1431 #, c-format msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" msgstr "uma transação que importa instantâneo deve ter nível de isolamento SERIALIZABLE ou REPEATABLE READ" -#: utils/time/snapmgr.c:1130 utils/time/snapmgr.c:1139 +#: utils/time/snapmgr.c:1440 utils/time/snapmgr.c:1449 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "identificador de instantâneo é inválido: \"%s\"" -#: utils/time/snapmgr.c:1228 +#: utils/time/snapmgr.c:1541 #, c-format msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" msgstr "uma transação serializável não pode importar um instantâneo de uma transação não serializável" -#: utils/time/snapmgr.c:1232 +#: utils/time/snapmgr.c:1545 #, c-format msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" -msgstr "uma transação serializável leitura-escrita não pode importar um instantâneo de uma transação somente leitura" +msgstr "uma transação serializável de leitura-escrita não pode importar um instantâneo de uma transação de leitura-apenas" -#: utils/time/snapmgr.c:1247 +#: utils/time/snapmgr.c:1560 #, c-format msgid "cannot import a snapshot from a different database" -msgstr "não pode importar um instantâneo de um banco de dados diferente" +msgstr "não é possível importar um instantâneo de um banco de dados diferente" diff --git a/src/backend/po/ru.po b/src/backend/po/ru.po index ae9c50eed73e6..089347fb7ebd6 100644 --- a/src/backend/po/ru.po +++ b/src/backend/po/ru.po @@ -4,14 +4,14 @@ # Serguei A. Mokhov , 2001-2005. # Oleg Bartunov , 2004-2005. # Dmitriy Olshevskiy , 2014. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023. -# Maxim Yablokov , 2021, 2022. +# SPDX-FileCopyrightText: 2012-2025 Alexander Lakhin +# Maxim Yablokov , 2021, 2022, 2024. msgid "" msgstr "" "Project-Id-Version: postgres (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-02-03 15:07+0300\n" -"PO-Revision-Date: 2023-01-30 07:55+0300\n" +"POT-Creation-Date: 2025-05-03 16:05+0300\n" +"PO-Revision-Date: 2025-05-03 16:34+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -21,37 +21,47 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ../common/compression.c:130 ../common/compression.c:139 -#: ../common/compression.c:148 +#: ../common/binaryheap.c:121 ../common/binaryheap.c:159 +#, c-format +msgid "out of binary heap slots" +msgstr "недоÑтаточно Ñлотов в двоичной куче" + +#: ../common/compression.c:132 ../common/compression.c:141 +#: ../common/compression.c:150 #, c-format msgid "this build does not support compression with %s" msgstr "Ñта Ñборка программы не поддерживает Ñжатие %s" -#: ../common/compression.c:203 +#: ../common/compression.c:205 msgid "found empty string where a compression option was expected" msgstr "вмеÑто ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð° пуÑÑ‚Ð°Ñ Ñтрока" -#: ../common/compression.c:237 +#: ../common/compression.c:244 #, c-format msgid "unrecognized compression option: \"%s\"" msgstr "нераÑпознанный параметр ÑжатиÑ: \"%s\"" -#: ../common/compression.c:276 +#: ../common/compression.c:283 #, c-format msgid "compression option \"%s\" requires a value" msgstr "Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" требуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ" -#: ../common/compression.c:285 +#: ../common/compression.c:292 #, c-format msgid "value for compression option \"%s\" must be an integer" msgstr "значение параметра ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" должно быть целочиÑленным" -#: ../common/compression.c:335 +#: ../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "значение параметра ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" должно быть булевÑким" + +#: ../common/compression.c:379 #, c-format msgid "compression algorithm \"%s\" does not accept a compression level" msgstr "Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ уровень ÑжатиÑ" -#: ../common/compression.c:342 +#: ../common/compression.c:386 #, c-format msgid "" "compression algorithm \"%s\" expects a compression level between %d and %d " @@ -60,11 +70,16 @@ msgstr "" "Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" ожидаетÑÑ ÑƒÑ€Ð¾Ð²ÐµÐ½ÑŒ ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¾Ñ‚ %d до %d (по " "умолчанию %d)" -#: ../common/compression.c:353 +#: ../common/compression.c:397 #, c-format msgid "compression algorithm \"%s\" does not accept a worker count" msgstr "Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ чиÑло потоков" +#: ../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "алгоритм ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" не поддерживает режим большой диÑтанции" + #: ../common/config_info.c:134 ../common/config_info.c:142 #: ../common/config_info.c:150 ../common/config_info.c:158 #: ../common/config_info.c:166 ../common/config_info.c:174 @@ -72,66 +87,66 @@ msgstr "Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ msgid "not recorded" msgstr "не запиÑано" -#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 -#: commands/copyfrom.c:1515 commands/extension.c:3383 utils/adt/genfile.c:123 +#: ../common/controldata_utils.c:93 ../common/controldata_utils.c:97 +#: commands/copyfrom.c:1739 commands/extension.c:3538 utils/adt/genfile.c:123 +#: utils/time/snapmgr.c:1430 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m" -#: ../common/controldata_utils.c:84 ../common/controldata_utils.c:86 +#: ../common/controldata_utils.c:108 ../common/controldata_utils.c:110 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1348 access/transam/xlog.c:3207 -#: access/transam/xlog.c:4022 access/transam/xlogrecovery.c:1178 -#: access/transam/xlogrecovery.c:1270 access/transam/xlogrecovery.c:1307 -#: access/transam/xlogrecovery.c:1367 backup/basebackup.c:1843 -#: commands/extension.c:3393 libpq/hba.c:505 replication/logical/origin.c:729 -#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4948 -#: replication/logical/snapbuild.c:1858 replication/logical/snapbuild.c:1900 -#: replication/logical/snapbuild.c:1927 replication/slot.c:1807 -#: replication/slot.c:1848 replication/walsender.c:658 -#: storage/file/buffile.c:463 storage/file/copydir.c:195 -#: utils/adt/genfile.c:197 utils/adt/misc.c:863 utils/cache/relmapper.c:813 +#: access/transam/twophase.c:1353 access/transam/xlog.c:3477 +#: access/transam/xlog.c:4341 access/transam/xlogrecovery.c:1238 +#: access/transam/xlogrecovery.c:1336 access/transam/xlogrecovery.c:1373 +#: access/transam/xlogrecovery.c:1440 backup/basebackup.c:2123 +#: backup/walsummary.c:283 commands/extension.c:3548 libpq/hba.c:764 +#: replication/logical/origin.c:745 replication/logical/origin.c:781 +#: replication/logical/reorderbuffer.c:5113 +#: replication/logical/snapbuild.c:2091 replication/slot.c:2236 +#: replication/slot.c:2277 replication/walsender.c:659 +#: storage/file/buffile.c:470 storage/file/copydir.c:185 +#: utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 #, c-format msgid "could not read file \"%s\": %m" msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" -#: ../common/controldata_utils.c:92 ../common/controldata_utils.c:95 -#: access/transam/xlog.c:3212 access/transam/xlog.c:4027 -#: backup/basebackup.c:1847 replication/logical/origin.c:734 -#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1863 -#: replication/logical/snapbuild.c:1905 replication/logical/snapbuild.c:1932 -#: replication/slot.c:1811 replication/slot.c:1852 replication/walsender.c:663 -#: utils/cache/relmapper.c:817 +#: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 +#: access/transam/xlog.c:3482 access/transam/xlog.c:4346 +#: replication/logical/origin.c:750 replication/logical/origin.c:789 +#: replication/logical/snapbuild.c:2096 replication/slot.c:2240 +#: replication/slot.c:2281 replication/walsender.c:664 +#: utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %zu)" -#: ../common/controldata_utils.c:104 ../common/controldata_utils.c:108 -#: ../common/controldata_utils.c:241 ../common/controldata_utils.c:244 -#: access/heap/rewriteheap.c:1178 access/heap/rewriteheap.c:1281 +#: ../common/controldata_utils.c:128 ../common/controldata_utils.c:132 +#: ../common/controldata_utils.c:277 ../common/controldata_utils.c:280 +#: access/heap/rewriteheap.c:1141 access/heap/rewriteheap.c:1246 #: access/transam/timeline.c:392 access/transam/timeline.c:438 -#: access/transam/timeline.c:516 access/transam/twophase.c:1360 -#: access/transam/twophase.c:1772 access/transam/xlog.c:3054 -#: access/transam/xlog.c:3247 access/transam/xlog.c:3252 -#: access/transam/xlog.c:3390 access/transam/xlog.c:3992 -#: access/transam/xlog.c:4738 commands/copyfrom.c:1575 commands/copyto.c:327 -#: libpq/be-fsstubs.c:455 libpq/be-fsstubs.c:525 -#: replication/logical/origin.c:667 replication/logical/origin.c:806 -#: replication/logical/reorderbuffer.c:5006 -#: replication/logical/snapbuild.c:1767 replication/logical/snapbuild.c:1940 -#: replication/slot.c:1698 replication/slot.c:1859 replication/walsender.c:673 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:745 -#: storage/file/fd.c:3643 storage/file/fd.c:3749 utils/cache/relmapper.c:828 +#: access/transam/timeline.c:512 access/transam/twophase.c:1365 +#: access/transam/twophase.c:1784 access/transam/xlog.c:3323 +#: access/transam/xlog.c:3517 access/transam/xlog.c:3522 +#: access/transam/xlog.c:3658 access/transam/xlog.c:4311 +#: access/transam/xlog.c:5246 commands/copyfrom.c:1799 commands/copyto.c:325 +#: libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 +#: replication/logical/origin.c:683 replication/logical/origin.c:822 +#: replication/logical/reorderbuffer.c:5165 +#: replication/logical/snapbuild.c:1858 replication/logical/snapbuild.c:1982 +#: replication/slot.c:2126 replication/slot.c:2288 replication/walsender.c:674 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:828 +#: storage/file/fd.c:3753 storage/file/fd.c:3859 utils/cache/relmapper.c:841 #: utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m" -#: ../common/controldata_utils.c:124 +#: ../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "неÑоответÑтвие порÑдка байт" -#: ../common/controldata_utils.c:126 +#: ../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -145,194 +160,211 @@ msgstr "" "Ñтой программой. Ð’ Ñтом Ñлучае результаты будут неверными и\n" "уÑтановленный PostgreSQL будет неÑовмеÑтим Ñ Ñтим каталогом данных." -#: ../common/controldata_utils.c:189 ../common/controldata_utils.c:194 -#: ../common/file_utils.c:232 ../common/file_utils.c:291 -#: ../common/file_utils.c:365 access/heap/rewriteheap.c:1264 -#: access/transam/timeline.c:111 access/transam/timeline.c:251 -#: access/transam/timeline.c:348 access/transam/twophase.c:1304 -#: access/transam/xlog.c:2941 access/transam/xlog.c:3123 -#: access/transam/xlog.c:3162 access/transam/xlog.c:3357 -#: access/transam/xlog.c:4012 access/transam/xlogrecovery.c:4190 -#: access/transam/xlogrecovery.c:4293 access/transam/xlogutils.c:852 -#: backup/basebackup.c:522 backup/basebackup.c:1520 postmaster/syslogger.c:1560 -#: replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3601 -#: replication/logical/reorderbuffer.c:4152 -#: replication/logical/reorderbuffer.c:4928 -#: replication/logical/snapbuild.c:1722 replication/logical/snapbuild.c:1829 -#: replication/slot.c:1779 replication/walsender.c:631 -#: replication/walsender.c:2722 storage/file/copydir.c:161 -#: storage/file/fd.c:720 storage/file/fd.c:3395 storage/file/fd.c:3630 -#: storage/file/fd.c:3720 storage/smgr/md.c:538 utils/cache/relmapper.c:792 -#: utils/cache/relmapper.c:900 utils/error/elog.c:1933 -#: utils/init/miscinit.c:1366 utils/init/miscinit.c:1500 -#: utils/init/miscinit.c:1577 utils/misc/guc.c:8991 utils/misc/guc.c:9040 +#: ../common/controldata_utils.c:225 ../common/controldata_utils.c:230 +#: ../common/file_utils.c:70 ../common/file_utils.c:347 +#: ../common/file_utils.c:406 ../common/file_utils.c:480 +#: access/heap/rewriteheap.c:1229 access/transam/timeline.c:111 +#: access/transam/timeline.c:251 access/transam/timeline.c:348 +#: access/transam/twophase.c:1309 access/transam/xlog.c:3230 +#: access/transam/xlog.c:3393 access/transam/xlog.c:3432 +#: access/transam/xlog.c:3625 access/transam/xlog.c:4331 +#: access/transam/xlogrecovery.c:4264 access/transam/xlogrecovery.c:4367 +#: access/transam/xlogutils.c:836 backup/basebackup.c:547 +#: backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:624 +#: postmaster/syslogger.c:1511 replication/logical/origin.c:735 +#: replication/logical/reorderbuffer.c:3766 +#: replication/logical/reorderbuffer.c:4320 +#: replication/logical/reorderbuffer.c:5093 +#: replication/logical/snapbuild.c:1813 replication/logical/snapbuild.c:1923 +#: replication/slot.c:2208 replication/walsender.c:632 +#: replication/walsender.c:3081 storage/file/copydir.c:151 +#: storage/file/fd.c:803 storage/file/fd.c:3510 storage/file/fd.c:3740 +#: storage/file/fd.c:3830 storage/smgr/md.c:661 utils/cache/relmapper.c:818 +#: utils/cache/relmapper.c:935 utils/error/elog.c:2124 +#: utils/init/miscinit.c:1580 utils/init/miscinit.c:1714 +#: utils/init/miscinit.c:1791 utils/misc/guc.c:4777 utils/misc/guc.c:4827 #, c-format msgid "could not open file \"%s\": %m" msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" -#: ../common/controldata_utils.c:210 ../common/controldata_utils.c:213 -#: access/transam/twophase.c:1745 access/transam/twophase.c:1754 -#: access/transam/xlog.c:8670 access/transam/xlogfuncs.c:600 +#: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 +#: access/transam/twophase.c:1757 access/transam/twophase.c:1766 +#: access/transam/xlog.c:9280 access/transam/xlogfuncs.c:698 #: backup/basebackup_server.c:173 backup/basebackup_server.c:266 -#: postmaster/postmaster.c:5638 postmaster/syslogger.c:1571 -#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 -#: utils/cache/relmapper.c:934 +#: backup/walsummary.c:304 postmaster/postmaster.c:4127 +#: postmaster/syslogger.c:1522 postmaster/syslogger.c:1535 +#: postmaster/syslogger.c:1548 utils/cache/relmapper.c:947 #, c-format msgid "could not write file \"%s\": %m" msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m" -#: ../common/controldata_utils.c:227 ../common/controldata_utils.c:232 -#: ../common/file_utils.c:303 ../common/file_utils.c:373 -#: access/heap/rewriteheap.c:960 access/heap/rewriteheap.c:1172 -#: access/heap/rewriteheap.c:1275 access/transam/timeline.c:432 -#: access/transam/timeline.c:510 access/transam/twophase.c:1766 -#: access/transam/xlog.c:3047 access/transam/xlog.c:3241 -#: access/transam/xlog.c:3985 access/transam/xlog.c:7973 -#: access/transam/xlog.c:8016 backup/basebackup_server.c:207 -#: replication/logical/snapbuild.c:1760 replication/slot.c:1684 -#: replication/slot.c:1789 storage/file/fd.c:737 storage/file/fd.c:3741 -#: storage/smgr/md.c:989 storage/smgr/md.c:1030 storage/sync/sync.c:453 -#: utils/cache/relmapper.c:949 utils/misc/guc.c:8760 +#: ../common/controldata_utils.c:263 ../common/controldata_utils.c:268 +#: ../common/file_utils.c:418 ../common/file_utils.c:488 +#: access/heap/rewriteheap.c:925 access/heap/rewriteheap.c:1135 +#: access/heap/rewriteheap.c:1240 access/transam/timeline.c:432 +#: access/transam/timeline.c:506 access/transam/twophase.c:1778 +#: access/transam/xlog.c:3316 access/transam/xlog.c:3511 +#: access/transam/xlog.c:4304 access/transam/xlog.c:8655 +#: access/transam/xlog.c:8700 backup/basebackup_server.c:207 +#: commands/dbcommands.c:514 replication/logical/snapbuild.c:1851 +#: replication/slot.c:2112 replication/slot.c:2218 storage/file/fd.c:820 +#: storage/file/fd.c:3851 storage/smgr/md.c:1331 storage/smgr/md.c:1376 +#: storage/sync/sync.c:446 utils/misc/guc.c:4530 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" -#: ../common/cryptohash.c:266 ../common/cryptohash_openssl.c:133 -#: ../common/cryptohash_openssl.c:332 ../common/exec.c:560 ../common/exec.c:605 -#: ../common/exec.c:697 ../common/hmac.c:309 ../common/hmac.c:325 -#: ../common/hmac_openssl.c:132 ../common/hmac_openssl.c:327 -#: ../common/md5_common.c:155 ../common/psprintf.c:143 -#: ../common/scram-common.c:247 ../common/stringinfo.c:305 ../port/path.c:751 -#: ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1413 -#: access/transam/xlogrecovery.c:568 lib/dshash.c:253 libpq/auth.c:1338 -#: libpq/auth.c:1406 libpq/auth.c:1964 libpq/be-secure-gssapi.c:520 -#: postmaster/bgworker.c:349 postmaster/bgworker.c:931 -#: postmaster/postmaster.c:2591 postmaster/postmaster.c:4177 -#: postmaster/postmaster.c:4849 postmaster/postmaster.c:5563 -#: postmaster/postmaster.c:5934 -#: replication/libpqwalreceiver/libpqwalreceiver.c:300 -#: replication/logical/logical.c:205 replication/walsender.c:701 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:892 storage/file/fd.c:1434 -#: storage/file/fd.c:1595 storage/file/fd.c:2409 storage/ipc/procarray.c:1448 -#: storage/ipc/procarray.c:2260 storage/ipc/procarray.c:2267 -#: storage/ipc/procarray.c:2770 storage/ipc/procarray.c:3401 -#: utils/adt/formatting.c:1732 utils/adt/formatting.c:1854 -#: utils/adt/formatting.c:1977 utils/adt/pg_locale.c:450 -#: utils/adt/pg_locale.c:614 utils/adt/regexp.c:224 utils/fmgr/dfmgr.c:229 -#: utils/hash/dynahash.c:513 utils/hash/dynahash.c:613 -#: utils/hash/dynahash.c:1116 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 -#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5192 -#: utils/misc/guc.c:5208 utils/misc/guc.c:5221 utils/misc/guc.c:8738 -#: utils/misc/tzparser.c:476 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:701 -#: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:266 -#: utils/mmgr/mcxt.c:888 utils/mmgr/mcxt.c:924 utils/mmgr/mcxt.c:962 -#: utils/mmgr/mcxt.c:1000 utils/mmgr/mcxt.c:1088 utils/mmgr/mcxt.c:1119 -#: utils/mmgr/mcxt.c:1155 utils/mmgr/mcxt.c:1207 utils/mmgr/mcxt.c:1242 -#: utils/mmgr/mcxt.c:1277 utils/mmgr/slab.c:238 +#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:158 +#: ../common/cryptohash_openssl.c:356 ../common/exec.c:562 ../common/exec.c:607 +#: ../common/exec.c:699 ../common/hmac.c:309 ../common/hmac.c:325 +#: ../common/hmac_openssl.c:160 ../common/hmac_openssl.c:357 +#: ../common/md5_common.c:156 ../common/parse_manifest.c:157 +#: ../common/parse_manifest.c:852 ../common/psprintf.c:143 +#: ../common/scram-common.c:268 ../common/stringinfo.c:314 ../port/path.c:828 +#: ../port/path.c:865 ../port/path.c:882 access/transam/twophase.c:1418 +#: access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1352 +#: libpq/auth.c:1396 libpq/auth.c:1953 libpq/be-secure-gssapi.c:524 +#: postmaster/bgworker.c:355 postmaster/bgworker.c:945 +#: postmaster/postmaster.c:3560 postmaster/postmaster.c:4021 +#: postmaster/postmaster.c:4383 postmaster/walsummarizer.c:935 +#: replication/libpqwalreceiver/libpqwalreceiver.c:387 +#: replication/logical/logical.c:210 replication/walsender.c:839 +#: storage/buffer/localbuf.c:606 storage/file/fd.c:912 storage/file/fd.c:1443 +#: storage/file/fd.c:1604 storage/file/fd.c:2531 storage/ipc/procarray.c:1465 +#: storage/ipc/procarray.c:2219 storage/ipc/procarray.c:2226 +#: storage/ipc/procarray.c:2731 storage/ipc/procarray.c:3435 +#: utils/adt/formatting.c:1725 utils/adt/formatting.c:1873 +#: utils/adt/formatting.c:2075 utils/adt/pg_locale.c:532 +#: utils/adt/pg_locale.c:696 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:517 +#: utils/hash/dynahash.c:617 utils/hash/dynahash.c:1100 utils/mb/mbutils.c:401 +#: utils/mb/mbutils.c:429 utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 +#: utils/misc/guc.c:649 utils/misc/guc.c:674 utils/misc/guc.c:1062 +#: utils/misc/guc.c:4508 utils/misc/tzparser.c:477 utils/mmgr/aset.c:451 +#: utils/mmgr/bump.c:183 utils/mmgr/dsa.c:707 utils/mmgr/dsa.c:729 +#: utils/mmgr/dsa.c:810 utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1154 +#: utils/mmgr/slab.c:370 #, c-format msgid "out of memory" msgstr "нехватка памÑти" -#: ../common/cryptohash.c:271 ../common/cryptohash.c:277 -#: ../common/cryptohash_openssl.c:344 ../common/cryptohash_openssl.c:352 -#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:339 -#: ../common/hmac_openssl.c:347 +#: ../common/cryptohash.c:266 ../common/cryptohash.c:272 +#: ../common/cryptohash_openssl.c:368 ../common/cryptohash_openssl.c:376 +#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:369 +#: ../common/hmac_openssl.c:377 msgid "success" msgstr "уÑпех" -#: ../common/cryptohash.c:273 ../common/cryptohash_openssl.c:346 -#: ../common/hmac_openssl.c:341 +#: ../common/cryptohash.c:268 ../common/cryptohash_openssl.c:370 +#: ../common/hmac_openssl.c:371 msgid "destination buffer too small" msgstr "буфер Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñлишком мал" -#: ../common/cryptohash_openssl.c:348 ../common/hmac_openssl.c:343 +#: ../common/cryptohash_openssl.c:372 ../common/hmac_openssl.c:373 msgid "OpenSSL failure" msgstr "ошибка OpenSSL" -#: ../common/exec.c:149 ../common/exec.c:266 ../common/exec.c:312 -#, c-format -msgid "could not identify current directory: %m" -msgstr "не удалоÑÑŒ определить текущий каталог: %m" - -#: ../common/exec.c:168 +#: ../common/exec.c:174 #, c-format -msgid "invalid binary \"%s\"" -msgstr "неверный иÑполнÑемый файл \"%s\"" +msgid "invalid binary \"%s\": %m" +msgstr "неверный иÑполнÑемый файл \"%s\": %m" -#: ../common/exec.c:218 +#: ../common/exec.c:217 #, c-format -msgid "could not read binary \"%s\"" -msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\": %m" -#: ../common/exec.c:226 +#: ../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "не удалоÑÑŒ найти запуÑкаемый файл \"%s\"" -#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:439 +#: ../common/exec.c:252 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "не удалоÑÑŒ преобразовать отноÑительный путь \"%s\" в абÑолютный: %m" -#: ../common/exec.c:299 access/transam/xlog.c:8319 backup/basebackup.c:1340 -#: utils/adt/misc.c:342 +#: ../common/exec.c:382 commands/collationcmds.c:876 commands/copyfrom.c:1723 +#: commands/copyto.c:654 libpq/be-secure-common.c:59 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m" +msgid "could not execute command \"%s\": %m" +msgstr "не удалоÑÑŒ выполнить команду \"%s\": %m" + +#: ../common/exec.c:394 libpq/be-secure-common.c:71 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать вывод команды \"%s\": %m" + +#: ../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "команда \"%s\" не выдала данные" -#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 -#: storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1663 -#: storage/ipc/latch.c:1789 +#: ../common/exec.c:424 libpq/pqcomm.c:192 storage/ipc/latch.c:1169 +#: storage/ipc/latch.c:1349 storage/ipc/latch.c:1589 storage/ipc/latch.c:1751 +#: storage/ipc/latch.c:1877 #, c-format msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 -#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:162 -#: ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 -#: ../port/path.c:808 utils/misc/ps_status.c:181 utils/misc/ps_status.c:189 -#: utils/misc/ps_status.c:219 utils/misc/ps_status.c:227 +#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 +#: ../common/psprintf.c:145 ../port/path.c:830 ../port/path.c:867 +#: ../port/path.c:884 utils/misc/ps_status.c:193 utils/misc/ps_status.c:201 +#: utils/misc/ps_status.c:228 utils/misc/ps_status.c:236 #, c-format msgid "out of memory\n" msgstr "нехватка памÑти\n" -#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:154 +#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" -#: ../common/file_utils.c:87 ../common/file_utils.c:451 -#: ../common/file_utils.c:455 access/transam/twophase.c:1316 -#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:230 -#: backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 -#: commands/copyfrom.c:1525 commands/copyto.c:725 commands/extension.c:3372 -#: commands/tablespace.c:826 commands/tablespace.c:917 postmaster/pgarch.c:597 -#: replication/logical/snapbuild.c:1639 storage/file/copydir.c:68 -#: storage/file/copydir.c:107 storage/file/fd.c:1951 storage/file/fd.c:2037 -#: storage/file/fd.c:3243 storage/file/fd.c:3450 utils/adt/dbsize.c:92 -#: utils/adt/dbsize.c:244 utils/adt/dbsize.c:324 utils/adt/genfile.c:413 -#: utils/adt/genfile.c:588 utils/adt/misc.c:327 guc-file.l:1061 +#: ../common/file_utils.c:76 storage/file/fd.c:3516 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../common/file_utils.c:120 ../common/file_utils.c:566 +#: ../common/file_utils.c:570 access/transam/twophase.c:1321 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 +#: backup/basebackup.c:355 backup/basebackup.c:553 backup/basebackup.c:624 +#: backup/walsummary.c:247 backup/walsummary.c:254 commands/copyfrom.c:1749 +#: commands/copyto.c:700 commands/extension.c:3527 commands/tablespace.c:804 +#: commands/tablespace.c:893 postmaster/pgarch.c:680 +#: replication/logical/snapbuild.c:1709 replication/logical/snapbuild.c:2212 +#: storage/file/fd.c:1968 storage/file/fd.c:2054 storage/file/fd.c:3564 +#: utils/adt/dbsize.c:105 utils/adt/dbsize.c:257 utils/adt/dbsize.c:337 +#: utils/adt/genfile.c:437 utils/adt/genfile.c:612 utils/adt/misc.c:340 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" -#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:749 -#: commands/tablespace.c:759 postmaster/postmaster.c:1576 -#: storage/file/fd.c:2812 storage/file/reinit.c:126 utils/adt/misc.c:235 -#: utils/misc/tzparser.c:338 +#: ../common/file_utils.c:130 ../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñта Ñборка программы не поддерживает метод Ñинхронизации \"%s\"" + +#: ../common/file_utils.c:151 ../common/file_utils.c:281 +#: ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 +#: commands/tablespace.c:738 postmaster/postmaster.c:1470 +#: storage/file/fd.c:2933 storage/file/reinit.c:126 utils/adt/misc.c:256 +#: utils/misc/tzparser.c:339 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" -#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2824 +#: ../common/file_utils.c:169 ../common/file_utils.c:315 +#: ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2945 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" -#: ../common/file_utils.c:383 access/transam/xlogarchive.c:419 -#: postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1779 -#: replication/slot.c:721 replication/slot.c:1570 replication/slot.c:1712 -#: storage/file/fd.c:755 storage/file/fd.c:853 utils/time/snapmgr.c:1282 +#: ../common/file_utils.c:498 access/transam/xlogarchive.c:389 +#: postmaster/pgarch.c:834 postmaster/syslogger.c:1559 +#: replication/logical/snapbuild.c:1870 replication/slot.c:936 +#: replication/slot.c:1998 replication/slot.c:2140 storage/file/fd.c:838 +#: utils/time/snapmgr.c:1255 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" @@ -341,75 +373,92 @@ msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\" msgid "internal error" msgstr "внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°" -#: ../common/jsonapi.c:1075 +#: ../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "" +"Инкрементальный лекÑичеÑкий анализатор не подходит Ð´Ð»Ñ Ð½Ð¸ÑходÑщего " +"рекурÑивного разбора." + +#: ../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "" +"Ð”Ð»Ñ Ð¸Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ разбора требуетÑÑ Ð¸Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ñ‹Ð¹ лекÑичеÑкий " +"анализатор." + +#: ../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "" +"Слишком Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ñть JSON, макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð°Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð°: 6400." + +#: ../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑпецпоÑледовательноÑть: \"\\%s\"." +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑпецпоÑледовательноÑть: \"\\%.*s\"." -#: ../common/jsonapi.c:1078 +#: ../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ Ñ ÐºÐ¾Ð´Ð¾Ð¼ 0x%02x необходимо Ñкранировать." -#: ../common/jsonapi.c:1081 +#: ../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "ОжидалÑÑ ÐºÐ¾Ð½ÐµÑ† текÑта, но обнаружено продолжение \"%s\"." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "ОжидалÑÑ ÐºÐ¾Ð½ÐµÑ† текÑта, но обнаружено продолжение \"%.*s\"." -#: ../common/jsonapi.c:1084 +#: ../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "ОжидалÑÑ Ñлемент маÑÑива или \"]\", но обнаружено \"%s\"." +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "ОжидалÑÑ Ñлемент маÑÑива или \"]\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:1087 +#: ../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "ОжидалаÑÑŒ \",\" или \"]\", но обнаружено \"%s\"." +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "ОжидалаÑÑŒ \",\" или \"]\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:1090 +#: ../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "ОжидалоÑÑŒ \":\", но обнаружено \"%s\"." +msgid "Expected \":\", but found \"%.*s\"." +msgstr "ОжидалоÑÑŒ \":\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:1093 +#: ../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "ОжидалоÑÑŒ значение JSON, но обнаружено \"%s\"." +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "ОжидалоÑÑŒ значение JSON, но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:1096 +#: ../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "Ðеожиданный конец входной Ñтроки." -#: ../common/jsonapi.c:1098 +#: ../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "ОжидалаÑÑŒ Ñтрока или \"}\", но обнаружено \"%s\"." +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "ОжидалаÑÑŒ Ñтрока или \"}\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "ОжидалаÑÑŒ \",\" или \"}\", но обнаружено \"%s\"." +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "ОжидалаÑÑŒ \",\" или \"}\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "ОжидалаÑÑŒ Ñтрока, но обнаружено \"%s\"." +msgid "Expected string, but found \"%.*s\"." +msgstr "ОжидалаÑÑŒ Ñтрока, но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:1107 +#: ../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "Ошибочный Ñлемент текÑта \"%s\"." +msgid "Token \"%.*s\" is invalid." +msgstr "Ошибочный Ñлемент \"%.*s\"." -#: ../common/jsonapi.c:1110 jsonpath_scan.l:495 +#: ../common/jsonapi.c:2164 jsonpath_scan.l:608 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ в текÑÑ‚." -#: ../common/jsonapi.c:1112 +#: ../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" должны Ñледовать четыре шеÑтнадцатеричные цифры." -#: ../common/jsonapi.c:1115 +#: ../common/jsonapi.c:2169 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -417,14 +466,20 @@ msgstr "" "Спецкоды Unicode Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ выше 007F можно иÑпользовать только Ñ " "кодировкой UTF8." -#: ../common/jsonapi.c:1117 jsonpath_scan.l:516 +#: ../common/jsonapi.c:2178 +#, c-format +msgid "" +"Unicode escape value could not be translated to the server's encoding %s." +msgstr "Спецкод Unicode Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ в Ñерверную кодировку %s." + +#: ../common/jsonapi.c:2185 jsonpath_scan.l:641 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "" "Старшее Ñлово Ñуррогата Unicode не может Ñледовать за другим Ñтаршим Ñловом." -#: ../common/jsonapi.c:1119 jsonpath_scan.l:527 jsonpath_scan.l:537 -#: jsonpath_scan.l:579 +#: ../common/jsonapi.c:2187 jsonpath_scan.l:652 jsonpath_scan.l:662 +#: jsonpath_scan.l:713 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Младшее Ñлово Ñуррогата Unicode должно Ñледовать за Ñтаршим Ñловом." @@ -449,6 +504,183 @@ msgstr "подробноÑти: " msgid "hint: " msgstr "подÑказка: " +#: ../common/parse_manifest.c:159 ../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "не удалоÑÑŒ подготовить контекÑÑ‚ контрольной Ñуммы манифеÑта" + +#: ../common/parse_manifest.c:203 ../common/parse_manifest.c:260 +msgid "manifest ended unexpectedly" +msgstr "неожиданный конец манифеÑта" + +#: ../common/parse_manifest.c:209 ../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "не удалоÑÑŒ изменить контекÑÑ‚ контрольной Ñуммы манифеÑта" + +#: ../common/parse_manifest.c:301 +msgid "unexpected object start" +msgstr "неожиданное начало объекта" + +#: ../common/parse_manifest.c:336 +msgid "unexpected object end" +msgstr "неожиданный конец объекта" + +#: ../common/parse_manifest.c:365 +msgid "unexpected array start" +msgstr "неожиданное начало маÑÑива" + +#: ../common/parse_manifest.c:390 +msgid "unexpected array end" +msgstr "неожиданный конец маÑÑива" + +#: ../common/parse_manifest.c:417 +msgid "expected version indicator" +msgstr "ожидалоÑÑŒ указание верÑии" + +#: ../common/parse_manifest.c:453 +msgid "unrecognized top-level field" +msgstr "нераÑпознанное поле на верхнем уровне" + +#: ../common/parse_manifest.c:472 +msgid "unexpected file field" +msgstr "неизвеÑтное поле Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°" + +#: ../common/parse_manifest.c:486 +msgid "unexpected WAL range field" +msgstr "неизвеÑтное поле в указании диапазона WAL" + +#: ../common/parse_manifest.c:492 +msgid "unexpected object field" +msgstr "неожиданное поле объекта" + +#: ../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "неожиданное ÑкалÑрное значение" + +#: ../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "верÑÐ¸Ñ Ð¼Ð°Ð½Ð¸Ñ„ÐµÑта не ÑвлÑетÑÑ Ñ†ÐµÐ»Ñ‹Ð¼ чиÑлом" + +#: ../common/parse_manifest.c:612 +msgid "unexpected manifest version" +msgstr "Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¼Ð°Ð½Ð¸Ñ„ÐµÑта" + +#: ../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "идентификатор ÑиÑтемы в манифеÑте не ÑвлÑетÑÑ Ñ†ÐµÐ»Ñ‹Ð¼ чиÑлом" + +#: ../common/parse_manifest.c:661 +msgid "missing path name" +msgstr "отÑутÑтвует указание пути" + +#: ../common/parse_manifest.c:664 +msgid "both path name and encoded path name" +msgstr "путь задан в обычном виде и в закодированном" + +#: ../common/parse_manifest.c:666 +msgid "missing size" +msgstr "отÑутÑтвует указание размера" + +#: ../common/parse_manifest.c:669 +msgid "checksum without algorithm" +msgstr "не задан алгоритм раÑчёта контрольной Ñуммы" + +#: ../common/parse_manifest.c:683 +msgid "could not decode file name" +msgstr "не удалоÑÑŒ декодировать Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°" + +#: ../common/parse_manifest.c:693 +msgid "file size is not an integer" +msgstr "размер файла не ÑвлÑетÑÑ Ñ†ÐµÐ»Ð¾Ñ‡Ð¸Ñленным" + +#: ../common/parse_manifest.c:699 backup/basebackup.c:870 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "нераÑпознанный алгоритм раÑчёта контрольных Ñумм: \"%s\"" + +#: ../common/parse_manifest.c:718 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": \"%s\"" + +#: ../common/parse_manifest.c:761 +msgid "missing timeline" +msgstr "отÑутÑтвует Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸" + +#: ../common/parse_manifest.c:763 +msgid "missing start LSN" +msgstr "отÑутÑтвует начальный LSN" + +#: ../common/parse_manifest.c:765 +msgid "missing end LSN" +msgstr "отÑутÑтвует конечный LSN" + +#: ../common/parse_manifest.c:771 +msgid "timeline is not an integer" +msgstr "Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ задана не целым чиÑлом" + +#: ../common/parse_manifest.c:774 +msgid "could not parse start LSN" +msgstr "не удалоÑÑŒ разобрать начальный LSN" + +#: ../common/parse_manifest.c:777 +msgid "could not parse end LSN" +msgstr "не удалоÑÑŒ разобрать конечный LSN" + +#: ../common/parse_manifest.c:842 +msgid "expected at least 2 lines" +msgstr "ожидалоÑÑŒ как минимум 2 Ñтроки" + +#: ../common/parse_manifest.c:845 +msgid "last line not newline-terminated" +msgstr "поÑледнÑÑ Ñтрока не оканчиваетÑÑ Ñимволом новой Ñтроки" + +#: ../common/parse_manifest.c:864 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "не удалоÑÑŒ завершить раÑчёт контрольной Ñуммы манифеÑта" + +#: ../common/parse_manifest.c:868 +#, c-format +msgid "manifest has no checksum" +msgstr "в манифеÑте нет контрольной Ñуммы" + +#: ../common/parse_manifest.c:872 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма в манифеÑте: \"%s\"" + +#: ../common/parse_manifest.c:876 +#, c-format +msgid "manifest checksum mismatch" +msgstr "ошибка контрольной Ñуммы манифеÑта" + +#: ../common/parse_manifest.c:891 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "не удалоÑÑŒ разобрать манифеÑÑ‚ копии: %s" + +#: ../common/percentrepl.c:79 ../common/percentrepl.c:85 +#: ../common/percentrepl.c:118 ../common/percentrepl.c:124 +#: tcop/backend_startup.c:741 utils/misc/guc.c:3167 utils/misc/guc.c:3208 +#: utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6931 +#: utils/misc/guc.c:6972 +#, c-format +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "неверное значение Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\": \"%s\"" + +# skip-rule: capital-letter-first +#: ../common/percentrepl.c:80 ../common/percentrepl.c:86 +#, c-format +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "Строка неожиданно закончилаÑÑŒ поÑле ÑпецÑимвола \"%%\"." + +#: ../common/percentrepl.c:119 ../common/percentrepl.c:125 +#, c-format +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "Строка Ñодержит неожиданный меÑтозаполнитель \"%%%c\"." + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -464,75 +696,76 @@ msgstr "неверное Ð¸Ð¼Ñ ÑлоÑ" msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "ДопуÑтимые имена Ñлоёв: \"main\", \"fsm\", \"vm\" и \"init\"." -#: ../common/restricted_token.c:64 libpq/auth.c:1368 libpq/auth.c:2400 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "не удалоÑÑŒ загрузить библиотеку \"%s\" (код ошибки: %lu)" - -#: ../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры (код ошибки: %lu)" - -#: ../common/restricted_token.c:82 +#: ../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "не удалоÑÑŒ открыть маркер процеÑÑа (код ошибки: %lu)" -#: ../common/restricted_token.c:97 +#: ../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "не удалоÑÑŒ подготовить Ñтруктуры SID (код ошибки: %lu)" -#: ../common/restricted_token.c:119 +#: ../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "не удалоÑÑŒ Ñоздать ограниченный маркер (код ошибки: %lu)" -#: ../common/restricted_token.c:140 +#: ../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "не удалоÑÑŒ запуÑтить процеÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ \"%s\" (код ошибки: %lu)" -#: ../common/restricted_token.c:178 +#: ../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "не удалоÑÑŒ перезапуÑтитьÑÑ Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ маркером (код ошибки: %lu)" -#: ../common/restricted_token.c:193 +#: ../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "не удалоÑÑŒ получить код выхода от подпроцеÑÑа (код ошибки: %lu)" -#: ../common/rmtree.c:79 backup/basebackup.c:1100 backup/basebackup.c:1276 +#: ../common/rmtree.c:97 access/heap/rewriteheap.c:1214 +#: access/transam/twophase.c:1717 access/transam/xlogarchive.c:119 +#: access/transam/xlogarchive.c:399 postmaster/postmaster.c:1048 +#: postmaster/syslogger.c:1488 replication/logical/origin.c:591 +#: replication/logical/reorderbuffer.c:4589 +#: replication/logical/snapbuild.c:1751 replication/logical/snapbuild.c:2185 +#: replication/slot.c:2192 storage/file/fd.c:878 storage/file/fd.c:3378 +#: storage/file/fd.c:3440 storage/file/reinit.c:261 storage/ipc/dsm.c:343 +#: storage/smgr/md.c:381 storage/smgr/md.c:440 storage/sync/sync.c:243 +#: utils/time/snapmgr.c:1591 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "не удалоÑÑŒ получить информацию о файле или каталоге \"%s\": %m" +msgid "could not remove file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñтереть файл \"%s\": %m" -#: ../common/rmtree.c:101 ../common/rmtree.c:113 +#: ../common/rmtree.c:124 commands/tablespace.c:767 commands/tablespace.c:780 +#: commands/tablespace.c:815 commands/tablespace.c:905 storage/file/fd.c:3370 +#: storage/file/fd.c:3779 #, c-format -msgid "could not remove file or directory \"%s\": %m" -msgstr "ошибка при удалении файла или каталога \"%s\": %m" +msgid "could not remove directory \"%s\": %m" +msgstr "ошибка при удалении каталога \"%s\": %m" -#: ../common/scram-common.c:260 +#: ../common/scram-common.c:281 msgid "could not encode salt" msgstr "не удалоÑÑŒ закодировать Ñоль" -#: ../common/scram-common.c:276 +#: ../common/scram-common.c:297 msgid "could not encode stored key" msgstr "не удалоÑÑŒ закодировать Ñохранённый ключ" -#: ../common/scram-common.c:293 +#: ../common/scram-common.c:314 msgid "could not encode server key" msgstr "не удалоÑÑŒ закодировать ключ Ñервера" -#: ../common/stringinfo.c:306 +#: ../common/stringinfo.c:315 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." msgstr "" "Ðе удалоÑÑŒ увеличить Ñтроковый буфер (в буфере байт: %d, требовалоÑÑŒ ещё %d)." -#: ../common/stringinfo.c:310 +#: ../common/stringinfo.c:319 #, c-format msgid "" "out of memory\n" @@ -549,7 +782,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "выÑÑнить Ñффективный идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (%ld) не удалоÑÑŒ: %s" -#: ../common/username.c:45 libpq/auth.c:1900 +#: ../common/username.c:45 libpq/auth.c:1888 msgid "user does not exist" msgstr "пользователь не ÑущеÑтвует" @@ -558,86 +791,86 @@ msgstr "пользователь не ÑущеÑтвует" msgid "user name lookup failure: error code %lu" msgstr "раÑпознать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалоÑÑŒ (код ошибки: %lu)" -#: ../common/wait_error.c:45 +#: ../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "неиÑполнÑÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°" -#: ../common/wait_error.c:49 +#: ../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "команда не найдена" -#: ../common/wait_error.c:54 +#: ../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ возврата %d" -#: ../common/wait_error.c:62 +#: ../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "дочерний процеÑÑ Ð¿Ñ€ÐµÑ€Ð²Ð°Ð½ иÑключением 0x%X" -#: ../common/wait_error.c:66 +#: ../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %d: %s" -#: ../common/wait_error.c:72 +#: ../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" -msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным ÑоÑтоÑнием %d" +msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным кодом ÑоÑтоÑÐ½Ð¸Ñ %d" -#: ../port/chklocale.c:306 +#: ../port/chklocale.c:283 #, c-format msgid "could not determine encoding for codeset \"%s\"" msgstr "не удалоÑÑŒ определить кодировку Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° Ñимволов \"%s\"" -#: ../port/chklocale.c:427 ../port/chklocale.c:433 +#: ../port/chklocale.c:404 ../port/chklocale.c:410 #, c-format msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" msgstr "" "не удалоÑÑŒ определить кодировку Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\": набор Ñимволов - \"%s\"" -#: ../port/dirmod.c:218 +#: ../port/dirmod.c:284 #, c-format msgid "could not set junction for \"%s\": %s" msgstr "не удалоÑÑŒ Ñоздать ÑвÑзь Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° \"%s\": %s" -#: ../port/dirmod.c:221 +#: ../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" msgstr "не удалоÑÑŒ Ñоздать ÑвÑзь Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° \"%s\": %s\n" -#: ../port/dirmod.c:295 +#: ../port/dirmod.c:364 #, c-format msgid "could not get junction for \"%s\": %s" msgstr "не удалоÑÑŒ получить ÑвÑзь Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° \"%s\": %s" -#: ../port/dirmod.c:298 +#: ../port/dirmod.c:367 #, c-format msgid "could not get junction for \"%s\": %s\n" msgstr "не удалоÑÑŒ получить ÑвÑзь Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° \"%s\": %s\n" -#: ../port/open.c:117 +#: ../port/open.c:115 #, c-format msgid "could not open file \"%s\": %s" msgstr "не удалоÑÑŒ открыть файл \"%s\": %s" -#: ../port/open.c:118 +#: ../port/open.c:116 msgid "lock violation" msgstr "нарушение блокировки" -#: ../port/open.c:118 +#: ../port/open.c:116 msgid "sharing violation" msgstr "нарушение ÑовмеÑтного доÑтупа" -#: ../port/open.c:119 +#: ../port/open.c:117 #, c-format msgid "Continuing to retry for 30 seconds." msgstr "Попытки будут продолжены в течение 30 Ñекунд." -#: ../port/open.c:120 +#: ../port/open.c:118 #, c-format msgid "" "You might have antivirus, backup, or similar software interfering with the " @@ -646,22 +879,22 @@ msgstr "" "Возможно, работе СУБД мешает антивируÑ, программа резервного ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ " "что-то подобное." -#: ../port/path.c:775 +#: ../port/path.c:852 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "не удалоÑÑŒ определить текущий рабочий каталог: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "не удалоÑÑŒ определить текущий рабочий каталог: %m\n" #: ../port/strerror.c:72 #, c-format msgid "operating system error %d" msgstr "ошибка ОС %d" -#: ../port/thread.c:100 ../port/thread.c:136 +#: ../port/user.c:43 ../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "найти локального Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ идентификатору (%d) не удалоÑÑŒ: %s" -#: ../port/thread.c:105 ../port/thread.c:141 +#: ../port/user.c:48 ../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "локальный пользователь Ñ ID %d не ÑущеÑтвует" @@ -683,7 +916,7 @@ msgid "could not check access token membership: error code %lu\n" msgstr "" "не удалоÑÑŒ проверить вхождение в маркере безопаÑноÑти (код ошибки: %lu)\n" -#: access/brin/brin.c:214 +#: access/brin/brin.c:405 #, c-format msgid "" "request for BRIN range summarization for index \"%s\" page %u was not " @@ -692,82 +925,72 @@ msgstr "" "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° раÑчёт Ñводки диапазона BRIN Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа \"%s\" Ñтраницы %u не был " "запиÑан" -#: access/brin/brin.c:1018 access/brin/brin.c:1119 access/gin/ginfast.c:1038 -#: access/transam/xlogfuncs.c:165 access/transam/xlogfuncs.c:192 -#: access/transam/xlogfuncs.c:231 access/transam/xlogfuncs.c:252 -#: access/transam/xlogfuncs.c:273 access/transam/xlogfuncs.c:343 -#: access/transam/xlogfuncs.c:401 +#: access/brin/brin.c:1387 access/brin/brin.c:1495 access/gin/ginfast.c:1040 +#: access/transam/xlogfuncs.c:183 access/transam/xlogfuncs.c:208 +#: access/transam/xlogfuncs.c:241 access/transam/xlogfuncs.c:280 +#: access/transam/xlogfuncs.c:301 access/transam/xlogfuncs.c:322 +#: access/transam/xlogfuncs.c:388 access/transam/xlogfuncs.c:446 #, c-format msgid "recovery is in progress" msgstr "идёт процеÑÑ Ð²Ð¾ÑÑтановлениÑ" -#: access/brin/brin.c:1019 access/brin/brin.c:1120 +#: access/brin/brin.c:1388 access/brin/brin.c:1496 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "Функции ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ BRIN Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в процеÑÑе воÑÑтановлениÑ." -#: access/brin/brin.c:1024 access/brin/brin.c:1125 +#: access/brin/brin.c:1393 access/brin/brin.c:1501 #, c-format msgid "block number out of range: %lld" msgstr "номер блока вне диапазона: %lld" -#: access/brin/brin.c:1068 access/brin/brin.c:1151 +#: access/brin/brin.c:1438 access/brin/brin.c:1527 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\" - Ñто не Ð¸Ð½Ð´ÐµÐºÑ BRIN" -#: access/brin/brin.c:1084 access/brin/brin.c:1167 +#: access/brin/brin.c:1454 access/brin/brin.c:1543 #, c-format msgid "could not open parent table of index \"%s\"" msgstr "не удалоÑÑŒ открыть родительÑкую таблицу индекÑа \"%s\"" -#: access/brin/brin_bloom.c:750 access/brin/brin_bloom.c:792 -#: access/brin/brin_minmax_multi.c:3012 access/brin/brin_minmax_multi.c:3155 -#: statistics/dependencies.c:663 statistics/dependencies.c:716 -#: statistics/mcv.c:1484 statistics/mcv.c:1515 statistics/mvdistinct.c:344 -#: statistics/mvdistinct.c:397 utils/adt/pseudotypes.c:43 -#: utils/adt/pseudotypes.c:77 utils/adt/pseudotypes.c:252 +#: access/brin/brin.c:1463 access/brin/brin.c:1559 access/gin/ginfast.c:1085 +#: parser/parse_utilcmd.c:2277 #, c-format -msgid "cannot accept a value of type %s" -msgstr "значение типа %s Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ð²ÐµÑти" +msgid "index \"%s\" is not valid" +msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" - нерабочий" -#: access/brin/brin_minmax_multi.c:2171 access/brin/brin_minmax_multi.c:2178 -#: access/brin/brin_minmax_multi.c:2185 utils/adt/timestamp.c:938 -#: utils/adt/timestamp.c:1509 utils/adt/timestamp.c:2761 -#: utils/adt/timestamp.c:2778 utils/adt/timestamp.c:2831 -#: utils/adt/timestamp.c:2870 utils/adt/timestamp.c:3115 -#: utils/adt/timestamp.c:3120 utils/adt/timestamp.c:3125 -#: utils/adt/timestamp.c:3175 utils/adt/timestamp.c:3182 -#: utils/adt/timestamp.c:3189 utils/adt/timestamp.c:3209 -#: utils/adt/timestamp.c:3216 utils/adt/timestamp.c:3223 -#: utils/adt/timestamp.c:3253 utils/adt/timestamp.c:3261 -#: utils/adt/timestamp.c:3305 utils/adt/timestamp.c:3731 -#: utils/adt/timestamp.c:3855 utils/adt/timestamp.c:4405 +#: access/brin/brin_bloom.c:785 access/brin/brin_bloom.c:827 +#: access/brin/brin_minmax_multi.c:2984 access/brin/brin_minmax_multi.c:3121 +#: statistics/dependencies.c:661 statistics/dependencies.c:714 +#: statistics/mcv.c:1480 statistics/mcv.c:1511 statistics/mvdistinct.c:343 +#: statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:40 +#: utils/adt/pseudotypes.c:74 utils/adt/tsgistidx.c:94 #, c-format -msgid "interval out of range" -msgstr "interval вне диапазона" +msgid "cannot accept a value of type %s" +msgstr "значение типа %s Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ð²ÐµÑти" -#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 -#: access/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1442 access/spgist/spgdoinsert.c:2001 +#: access/brin/brin_pageops.c:75 access/brin/brin_pageops.c:361 +#: access/brin/brin_pageops.c:851 access/gin/ginentrypage.c:109 +#: access/gist/gist.c:1470 access/spgist/spgdoinsert.c:2001 #: access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "" "размер Ñтроки индекÑа (%zu) больше предельного размера (%zu) (Ð¸Ð½Ð´ÐµÐºÑ \"%s\")" -#: access/brin/brin_revmap.c:393 access/brin/brin_revmap.c:399 +#: access/brin/brin_revmap.c:383 access/brin/brin_revmap.c:389 #, c-format msgid "corrupted BRIN index: inconsistent range map" msgstr "иÑпорченный Ð¸Ð½Ð´ÐµÐºÑ BRIN: неÑоглаÑованноÑть в карте диапазонов" -#: access/brin/brin_revmap.c:602 +#: access/brin/brin_revmap.c:583 #, c-format msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" msgstr "неожиданный тип Ñтраницы 0x%04X в BRIN-индекÑе \"%s\" (блок: %u)" -#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:151 -#: access/gist/gistvalidate.c:153 access/hash/hashvalidate.c:139 +#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:149 +#: access/gist/gistvalidate.c:152 access/hash/hashvalidate.c:139 #: access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 #, c-format msgid "" @@ -777,8 +1000,8 @@ msgstr "" "ÑемейÑтво операторов \"%s\" метода доÑтупа %s Ñодержит функцию %s Ñ " "неправильным опорным номером %d" -#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:163 -#: access/gist/gistvalidate.c:165 access/hash/hashvalidate.c:118 +#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:161 +#: access/gist/gistvalidate.c:164 access/hash/hashvalidate.c:118 #: access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 #, c-format msgid "" @@ -788,8 +1011,8 @@ msgstr "" "ÑемейÑтво операторов \"%s\" метода доÑтупа %s Ñодержит функцию %s Ñ " "неподходÑщим объÑвлением Ð´Ð»Ñ Ð¾Ð¿Ð¾Ñ€Ð½Ð¾Ð³Ð¾ номера %d" -#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:182 -#: access/gist/gistvalidate.c:185 access/hash/hashvalidate.c:160 +#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:180 +#: access/gist/gistvalidate.c:184 access/hash/hashvalidate.c:160 #: access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 #, c-format msgid "" @@ -799,7 +1022,7 @@ msgstr "" "ÑемейÑтво операторов \"%s\" метода доÑтупа %s Ñодержит оператор %s Ñ " "неправильным номером Ñтратегии %d" -#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:195 +#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:193 #: access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 #: access/spgist/spgvalidate.c:237 #, c-format @@ -810,8 +1033,8 @@ msgstr "" "ÑемейÑтво операторов \"%s\" метода доÑтупа %s Ñодержит некорректное " "определение ORDER BY Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° %s" -#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:208 -#: access/gist/gistvalidate.c:233 access/hash/hashvalidate.c:186 +#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:206 +#: access/gist/gistvalidate.c:232 access/hash/hashvalidate.c:186 #: access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 #, c-format msgid "" @@ -846,31 +1069,31 @@ msgstr "" msgid "operator class \"%s\" of access method %s is missing operator(s)" msgstr "в клаÑÑе операторов \"%s\" метода доÑтупа %s нет оператора(ов)" -#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 -#: access/gist/gistvalidate.c:274 +#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:248 +#: access/gist/gistvalidate.c:273 #, c-format msgid "" "operator class \"%s\" of access method %s is missing support function %d" msgstr "в клаÑÑе операторов \"%s\" метода доÑтупа %s нет опорной функции %d" -#: access/common/attmap.c:122 +#: access/common/attmap.c:121 #, c-format msgid "Returned type %s does not match expected type %s in column %d." msgstr "Возвращаемый тип %s не ÑоответÑтвует ожидаемому типу %s в Ñтолбце %d." -#: access/common/attmap.c:150 +#: access/common/attmap.c:149 #, c-format msgid "" "Number of returned columns (%d) does not match expected column count (%d)." msgstr "" "ЧиÑло возвращённых Ñтолбцов (%d) не ÑоответÑтвует ожидаемому чиÑлу (%d)." -#: access/common/attmap.c:229 access/common/attmap.c:241 +#: access/common/attmap.c:233 access/common/attmap.c:245 #, c-format msgid "could not convert row type" msgstr "не удалоÑÑŒ преобразовать тип Ñтроки" -#: access/common/attmap.c:230 +#: access/common/attmap.c:234 #, c-format msgid "" "Attribute \"%s\" of type %s does not match corresponding attribute of type " @@ -878,12 +1101,12 @@ msgid "" msgstr "" "Ðтрибут \"%s\" типа %s неÑовмеÑтим Ñ ÑоответÑтвующим атрибутом типа %s." -#: access/common/attmap.c:242 +#: access/common/attmap.c:246 #, c-format msgid "Attribute \"%s\" of type %s does not exist in type %s." msgstr "Ðтрибут \"%s\" типа %s не ÑущеÑтвует в типе %s." -#: access/common/heaptuple.c:1036 access/common/heaptuple.c:1371 +#: access/common/heaptuple.c:1132 access/common/heaptuple.c:1467 #, c-format msgid "number of columns (%d) exceeds limit (%d)" msgstr "чиÑло Ñтолбцов (%d) превышает предел (%d)" @@ -893,106 +1116,110 @@ msgstr "чиÑло Ñтолбцов (%d) превышает предел (%d)" msgid "number of index columns (%d) exceeds limit (%d)" msgstr "чиÑло Ñтолбцов индекÑа (%d) превышает предел (%d)" -#: access/common/indextuple.c:209 access/spgist/spgutils.c:958 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:970 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "Ñтрока индекÑа требует байт: %zu, при макÑимуме: %zu" -#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 -#: tcop/postgres.c:1921 +#: access/common/printtup.c:292 commands/explain.c:5376 tcop/fastpath.c:107 +#: tcop/fastpath.c:454 tcop/postgres.c:1956 #, c-format msgid "unsupported format code: %d" msgstr "неподдерживаемый код формата: %d" -#: access/common/reloptions.c:521 access/common/reloptions.c:532 +#: access/common/reloptions.c:519 access/common/reloptions.c:530 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "ДопуÑкаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"on\", \"off\" и \"auto\"." -#: access/common/reloptions.c:543 +#: access/common/reloptions.c:541 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "ДопуÑкаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"local\" и \"cascaded\"." -#: access/common/reloptions.c:691 +#: access/common/reloptions.c:689 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "превышен предел пользовательÑких типов релÑционных параметров" -#: access/common/reloptions.c:1234 +#: access/common/reloptions.c:1231 #, c-format msgid "RESET must not include values for parameters" msgstr "Ð’ RESET не должно передаватьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ параметров" -#: access/common/reloptions.c:1266 +#: access/common/reloptions.c:1263 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "нераÑпознанное проÑтранÑтво имён параметров \"%s\"" -#: access/common/reloptions.c:1303 utils/misc/guc.c:12986 +#: access/common/reloptions.c:1300 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "таблицы Ñо ÑвойÑтвом WITH OIDS не поддерживаютÑÑ" -#: access/common/reloptions.c:1473 +#: access/common/reloptions.c:1468 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "нераÑпознанный параметр \"%s\"" -#: access/common/reloptions.c:1585 +#: access/common/reloptions.c:1580 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "параметр \"%s\" указан неоднократно" -#: access/common/reloptions.c:1601 +#: access/common/reloptions.c:1596 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "неверное значение Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого параметра \"%s\": %s" -#: access/common/reloptions.c:1613 +#: access/common/reloptions.c:1608 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "неверное значение Ð´Ð»Ñ Ñ†ÐµÐ»Ð¾Ñ‡Ð¸Ñленного параметра \"%s\": %s" -#: access/common/reloptions.c:1619 access/common/reloptions.c:1639 +#: access/common/reloptions.c:1614 access/common/reloptions.c:1634 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "значение %s вне допуÑтимых пределов параметра \"%s\"" -#: access/common/reloptions.c:1621 +#: access/common/reloptions.c:1616 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "ДопуÑкаютÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ от \"%d\" до \"%d\"." -#: access/common/reloptions.c:1633 +#: access/common/reloptions.c:1628 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "неверное значение Ð´Ð»Ñ Ñ‡Ð¸Ñленного параметра \"%s\": %s" -#: access/common/reloptions.c:1641 +#: access/common/reloptions.c:1636 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "ДопуÑкаютÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ от \"%f\" до \"%f\"." -#: access/common/reloptions.c:1663 +#: access/common/reloptions.c:1658 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "неверное значение Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°-перечиÑÐ»ÐµÐ½Ð¸Ñ \"%s\": %s" -#: access/common/toast_compression.c:32 +#: access/common/reloptions.c:1989 +#, c-format +msgid "cannot specify storage parameters for a partitioned table" +msgstr "задать параметры Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñекционированной таблицы нельзÑ" + +#: access/common/reloptions.c:1990 +#, c-format +msgid "Specify storage parameters for its leaf partitions instead." +msgstr "Задайте параметры Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐµÑ‘ конечных Ñекций." + +#: access/common/toast_compression.c:31 #, c-format msgid "compression method lz4 not supported" msgstr "метод ÑÐ¶Ð°Ñ‚Ð¸Ñ lz4 не поддерживаетÑÑ" -#: access/common/toast_compression.c:33 +#: access/common/toast_compression.c:32 #, c-format msgid "This functionality requires the server to be built with lz4 support." msgstr "Ð”Ð»Ñ Ñтой функциональноÑти в Ñервере не хватает поддержки lz4." -#: access/common/tupdesc.c:825 parser/parse_clause.c:773 -#: parser/parse_relation.c:1857 -#, c-format -msgid "column \"%s\" cannot be declared SETOF" -msgstr "Ñтолбец \"%s\" не может быть объÑвлен как SETOF" - #: access/gin/ginbulk.c:44 #, c-format msgid "posting list is too long" @@ -1000,48 +1227,48 @@ msgstr "Ñлишком длинный ÑпиÑок указателей" #: access/gin/ginbulk.c:45 #, c-format -msgid "Reduce maintenance_work_mem." -msgstr "Уменьшите maintenance_work_mem." +msgid "Reduce \"maintenance_work_mem\"." +msgstr "Уменьшите \"maintenance_work_mem\"." -#: access/gin/ginfast.c:1039 +#: access/gin/ginfast.c:1041 #, c-format msgid "GIN pending list cannot be cleaned up during recovery." msgstr "Очередь запиÑей GIN Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить в процеÑÑе воÑÑтановлениÑ." -#: access/gin/ginfast.c:1046 +#: access/gin/ginfast.c:1048 #, c-format msgid "\"%s\" is not a GIN index" msgstr "\"%s\" - Ñто не Ð¸Ð½Ð´ÐµÐºÑ GIN" -#: access/gin/ginfast.c:1057 +#: access/gin/ginfast.c:1059 #, c-format msgid "cannot access temporary indexes of other sessions" msgstr "обращатьÑÑ Ðº временным индекÑам других ÑеанÑов нельзÑ" -#: access/gin/ginget.c:271 access/nbtree/nbtinsert.c:760 +#: access/gin/ginget.c:271 access/nbtree/nbtinsert.c:762 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "не удалоÑÑŒ повторно найти кортеж в индекÑе \"%s\"" -#: access/gin/ginscan.c:431 +#: access/gin/ginscan.c:436 #, c-format msgid "old GIN indexes do not support whole-index scans nor searches for nulls" msgstr "" "Ñтарые GIN-индекÑÑ‹ не поддерживают Ñканирование вÑего индекÑа и поиÑк NULL" -#: access/gin/ginscan.c:432 +#: access/gin/ginscan.c:437 #, c-format msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Ð”Ð»Ñ Ð¸ÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚Ðµ REINDEX INDEX \"%s\"." -#: access/gin/ginutil.c:145 executor/execExpr.c:2165 -#: utils/adt/arrayfuncs.c:3819 utils/adt/arrayfuncs.c:6488 -#: utils/adt/rowtypes.c:957 +#: access/gin/ginutil.c:147 executor/execExpr.c:2200 +#: utils/adt/arrayfuncs.c:4016 utils/adt/arrayfuncs.c:6714 +#: utils/adt/rowtypes.c:974 #, c-format msgid "could not identify a comparison function for type %s" msgstr "не удалоÑÑŒ найти функцию ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s" -#: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 +#: access/gin/ginvalidate.c:90 access/gist/gistvalidate.c:92 #: access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 #, c-format msgid "" @@ -1051,7 +1278,7 @@ msgstr "" "ÑемейÑтво операторов \"%s\" метода доÑтупа %s Ñодержит опорную функцию %s Ñ " "межтиповой региÑтрацией" -#: access/gin/ginvalidate.c:260 +#: access/gin/ginvalidate.c:258 #, c-format msgid "" "operator class \"%s\" of access method %s is missing support function %d or " @@ -1059,18 +1286,18 @@ msgid "" msgstr "" "в клаÑÑе операторов \"%s\" метода доÑтупа %s нет опорной функции %d или %d" -#: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:350 +#: access/gin/ginvalidate.c:331 access/gist/gistvalidate.c:349 #: access/spgist/spgvalidate.c:387 #, c-format msgid "support function number %d is invalid for access method %s" msgstr "номер опорной функции %d не подходит Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° доÑтупа %s" -#: access/gist/gist.c:759 access/gist/gistvacuum.c:426 +#: access/gist/gist.c:760 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" Ñодержит внутренний кортеж, отмеченный как ошибочный" -#: access/gist/gist.c:761 access/gist/gistvacuum.c:428 +#: access/gist/gist.c:762 access/gist/gistvacuum.c:428 #, c-format msgid "" "This is caused by an incomplete page split at crash recovery before " @@ -1079,16 +1306,16 @@ msgstr "" "Это вызвано неполным разделением Ñтраницы при воÑÑтановлении поÑле ÑÐ±Ð¾Ñ Ð² " "PostgreSQL до верÑии 9.1." -#: access/gist/gist.c:762 access/gist/gistutil.c:801 access/gist/gistutil.c:812 -#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:227 -#: access/hash/hashutil.c:238 access/hash/hashutil.c:250 -#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:810 -#: access/nbtree/nbtpage.c:821 +#: access/gist/gist.c:763 access/gist/gistutil.c:800 access/gist/gistutil.c:811 +#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:226 +#: access/hash/hashutil.c:237 access/hash/hashutil.c:249 +#: access/hash/hashutil.c:270 access/nbtree/nbtpage.c:813 +#: access/nbtree/nbtpage.c:824 #, c-format msgid "Please REINDEX it." msgstr "ПожалуйÑта, выполните REINDEX Ð´Ð»Ñ Ð½ÐµÐ³Ð¾." -#: access/gist/gist.c:1176 +#: access/gist/gist.c:1203 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "иÑправление неполного Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð² индекÑе \"%s\" (блок: %u)" @@ -1108,19 +1335,19 @@ msgstr "" "разработчиками или попробуйте указать Ñтот Ñтолбец в команде CREATE INDEX " "вторым." -#: access/gist/gistutil.c:798 access/hash/hashutil.c:224 -#: access/nbtree/nbtpage.c:807 +#: access/gist/gistutil.c:797 access/hash/hashutil.c:223 +#: access/nbtree/nbtpage.c:810 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "в индекÑе \"%s\" неожиданно оказалаÑÑŒ Ð½ÑƒÐ»ÐµÐ²Ð°Ñ Ñтраница в блоке %u" -#: access/gist/gistutil.c:809 access/hash/hashutil.c:235 -#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:818 +#: access/gist/gistutil.c:808 access/hash/hashutil.c:234 +#: access/hash/hashutil.c:246 access/nbtree/nbtpage.c:821 #, c-format msgid "index \"%s\" contains corrupted page at block %u" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" Ñодержит иÑпорченную Ñтраницу в блоке %u" -#: access/gist/gistvalidate.c:203 +#: access/gist/gistvalidate.c:202 #, c-format msgid "" "operator family \"%s\" of access method %s contains unsupported ORDER BY " @@ -1129,7 +1356,7 @@ msgstr "" "ÑемейÑтво операторов \"%s\" метода доÑтупа %s Ñодержит неподдерживаемое " "определение ORDER BY Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° %s" -#: access/gist/gistvalidate.c:214 +#: access/gist/gistvalidate.c:213 #, c-format msgid "" "operator family \"%s\" of access method %s contains incorrect ORDER BY " @@ -1138,32 +1365,32 @@ msgstr "" "ÑемейÑтво операторов \"%s\" метода доÑтупа %s Ñодержит некорректное " "определение ORDER BY Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° %s" -#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:335 -#: utils/adt/varchar.c:1003 utils/adt/varchar.c:1064 +#: access/hash/hashfunc.c:277 access/hash/hashfunc.c:333 +#: utils/adt/varchar.c:1008 utils/adt/varchar.c:1065 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "" "не удалоÑÑŒ определить, какое правило Ñортировки иÑпользовать Ð´Ð»Ñ Ñ…ÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ " "Ñтрок" -#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:668 -#: catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:1962 commands/tablecmds.c:17443 commands/view.c:86 -#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1690 -#: utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/like.c:190 -#: utils/adt/like_support.c:1025 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:1004 utils/adt/varchar.c:1065 utils/adt/varlena.c:1499 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 catalog/heap.c:673 +#: catalog/heap.c:679 commands/createas.c:201 commands/createas.c:508 +#: commands/indexcmds.c:2021 commands/tablecmds.c:18219 commands/view.c:81 +#: regex/regc_pg_locale.c:245 utils/adt/formatting.c:1653 +#: utils/adt/formatting.c:1801 utils/adt/formatting.c:1991 utils/adt/like.c:189 +#: utils/adt/like_support.c:1024 utils/adt/varchar.c:738 +#: utils/adt/varchar.c:1009 utils/adt/varchar.c:1066 utils/adt/varlena.c:1521 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "Задайте правило Ñортировки Ñвно в предложении COLLATE." -#: access/hash/hashinsert.c:83 +#: access/hash/hashinsert.c:84 #, c-format msgid "index row size %zu exceeds hash maximum %zu" msgstr "размер Ñтроки индекÑа (%zu) больше предельного размера хеша (%zu)" -#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 -#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1019 +#: access/hash/hashinsert.c:86 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1031 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "ЗначениÑ, не умещающиеÑÑ Ð² Ñтраницу буфера, Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ð¸Ð½Ð´ÐµÐºÑировать." @@ -1178,17 +1405,17 @@ msgstr "неверный номер блока переполнениÑ: %u" msgid "out of overflow pages in hash index \"%s\"" msgstr "в хеш-индекÑе \"%s\" не хватает Ñтраниц переполнениÑ" -#: access/hash/hashsearch.c:315 +#: access/hash/hashsearch.c:311 #, c-format msgid "hash indexes do not support whole-index scans" msgstr "хеш-индекÑÑ‹ не поддерживают Ñканирование вÑего индекÑа" -#: access/hash/hashutil.c:263 +#: access/hash/hashutil.c:262 #, c-format msgid "index \"%s\" is not a hash index" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" не ÑвлÑетÑÑ Ñ…ÐµÑˆ-индекÑом" -#: access/hash/hashutil.c:269 +#: access/hash/hashutil.c:268 #, c-format msgid "index \"%s\" has wrong hash version" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" имеет неправильную верÑию хеша" @@ -1209,38 +1436,48 @@ msgid "" msgstr "" "в ÑемейÑтве операторов \"%s\" метода доÑтупа %s нет межтипового оператора(ов)" -#: access/heap/heapam.c:2226 +#: access/heap/heapam.c:2206 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "вÑтавлÑть кортежи в параллельном иÑполнителе нельзÑ" -#: access/heap/heapam.c:2697 +#: access/heap/heapam.c:2725 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "удалÑть кортежи во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" -#: access/heap/heapam.c:2743 +#: access/heap/heapam.c:2772 #, c-format msgid "attempted to delete invisible tuple" msgstr "попытка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ кортежа" -#: access/heap/heapam.c:3183 access/heap/heapam.c:6025 +#: access/heap/heapam.c:3220 access/heap/heapam.c:6501 access/index/genam.c:818 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "изменÑть кортежи во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" -#: access/heap/heapam.c:3307 +#: access/heap/heapam.c:3397 #, c-format msgid "attempted to update invisible tuple" msgstr "попытка Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½ÐµÐ²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ кортежа" -#: access/heap/heapam.c:4669 access/heap/heapam.c:4707 -#: access/heap/heapam.c:4972 access/heap/heapam_handler.c:456 +#: access/heap/heapam.c:4908 access/heap/heapam.c:4946 +#: access/heap/heapam.c:5211 access/heap/heapam_handler.c:468 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "не удалоÑÑŒ получить блокировку Ñтроки в таблице \"%s\"" -#: access/heap/heapam_handler.c:401 +#: access/heap/heapam.c:6314 commands/trigger.c:3340 +#: executor/nodeModifyTable.c:2396 executor/nodeModifyTable.c:2487 +#, c-format +msgid "" +"tuple to be updated was already modified by an operation triggered by the " +"current command" +msgstr "" +"кортеж, который должен быть изменён, уже модифицирован в операции, вызванной " +"текущей командой" + +#: access/heap/heapam_handler.c:413 #, c-format msgid "" "tuple to be locked was already moved to another partition due to concurrent " @@ -1249,79 +1486,67 @@ msgstr "" "кортеж, подлежащий блокировке, был перемещён в другую Ñекцию в результате " "параллельного изменениÑ" -#: access/heap/hio.c:360 access/heap/rewriteheap.c:660 +#: access/heap/hio.c:535 access/heap/rewriteheap.c:640 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "размер Ñтроки (%zu) превышает предел (%zu)" -#: access/heap/rewriteheap.c:920 +#: access/heap/rewriteheap.c:885 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "не удалоÑÑŒ запиÑать в файл \"%s\" (запиÑано байт: %d из %d): %m" -#: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 -#: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:2963 access/transam/xlog.c:3176 -#: access/transam/xlog.c:3964 access/transam/xlog.c:8653 -#: access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 -#: backup/basebackup_server.c:242 commands/dbcommands.c:517 -#: postmaster/postmaster.c:4604 postmaster/postmaster.c:5625 -#: replication/logical/origin.c:587 replication/slot.c:1631 -#: storage/file/copydir.c:167 storage/smgr/md.c:222 utils/time/snapmgr.c:1261 +#: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 +#: access/transam/timeline.c:329 access/transam/timeline.c:481 +#: access/transam/xlog.c:3255 access/transam/xlog.c:3446 +#: access/transam/xlog.c:4283 access/transam/xlog.c:9269 +#: access/transam/xlogfuncs.c:692 backup/basebackup_server.c:149 +#: backup/basebackup_server.c:242 commands/dbcommands.c:494 +#: postmaster/launch_backend.c:340 postmaster/postmaster.c:4114 +#: postmaster/walsummarizer.c:1212 replication/logical/origin.c:603 +#: replication/slot.c:2059 storage/file/copydir.c:157 storage/smgr/md.c:230 +#: utils/time/snapmgr.c:1234 #, c-format msgid "could not create file \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать файл \"%s\": %m" -#: access/heap/rewriteheap.c:1141 +#: access/heap/rewriteheap.c:1104 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "не удалоÑÑŒ обрезать файл \"%s\" до нужного размера (%u): %m" -#: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 -#: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3035 access/transam/xlog.c:3232 -#: access/transam/xlog.c:3976 commands/dbcommands.c:529 -#: postmaster/postmaster.c:4614 postmaster/postmaster.c:4624 -#: replication/logical/origin.c:599 replication/logical/origin.c:641 -#: replication/logical/origin.c:660 replication/logical/snapbuild.c:1736 -#: replication/slot.c:1666 storage/file/buffile.c:537 -#: storage/file/copydir.c:207 utils/init/miscinit.c:1441 -#: utils/init/miscinit.c:1452 utils/init/miscinit.c:1460 utils/misc/guc.c:8721 -#: utils/misc/guc.c:8752 utils/misc/guc.c:10741 utils/misc/guc.c:10755 -#: utils/time/snapmgr.c:1266 utils/time/snapmgr.c:1273 +#: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 +#: access/transam/timeline.c:424 access/transam/timeline.c:498 +#: access/transam/xlog.c:3305 access/transam/xlog.c:3502 +#: access/transam/xlog.c:4295 commands/dbcommands.c:506 +#: postmaster/launch_backend.c:351 postmaster/launch_backend.c:363 +#: replication/logical/origin.c:615 replication/logical/origin.c:657 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1827 +#: replication/slot.c:2094 storage/file/buffile.c:545 +#: storage/file/copydir.c:197 utils/init/miscinit.c:1655 +#: utils/init/miscinit.c:1666 utils/init/miscinit.c:1674 utils/misc/guc.c:4491 +#: utils/misc/guc.c:4522 utils/misc/guc.c:5675 utils/misc/guc.c:5693 +#: utils/time/snapmgr.c:1239 utils/time/snapmgr.c:1246 #, c-format msgid "could not write to file \"%s\": %m" msgstr "не удалоÑÑŒ запиÑать в файл \"%s\": %m" -#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1705 -#: access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:429 -#: postmaster/postmaster.c:1157 postmaster/syslogger.c:1537 -#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4421 -#: replication/logical/snapbuild.c:1681 replication/logical/snapbuild.c:2097 -#: replication/slot.c:1763 storage/file/fd.c:795 storage/file/fd.c:3263 -#: storage/file/fd.c:3325 storage/file/reinit.c:262 storage/ipc/dsm.c:317 -#: storage/smgr/md.c:370 storage/smgr/md.c:429 storage/sync/sync.c:250 -#: utils/time/snapmgr.c:1606 -#, c-format -msgid "could not remove file \"%s\": %m" -msgstr "не удалоÑÑŒ Ñтереть файл \"%s\": %m" - -#: access/heap/vacuumlazy.c:407 +#: access/heap/vacuumlazy.c:473 #, c-format msgid "aggressively vacuuming \"%s.%s.%s\"" msgstr "агреÑÑÐ¸Ð²Ð½Ð°Ñ Ð¾Ñ‡Ð¸Ñтка \"%s.%s.%s\"" -#: access/heap/vacuumlazy.c:412 +#: access/heap/vacuumlazy.c:478 #, c-format msgid "vacuuming \"%s.%s.%s\"" msgstr "очиÑтка \"%s.%s.%s\"" -#: access/heap/vacuumlazy.c:663 +#: access/heap/vacuumlazy.c:626 #, c-format msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" msgstr "закончена очиÑтка \"%s.%s.%s\": Ñканирований индекÑа: %d\n" -#: access/heap/vacuumlazy.c:674 +#: access/heap/vacuumlazy.c:637 #, c-format msgid "" "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": " @@ -1330,7 +1555,7 @@ msgstr "" "автоматичеÑÐºÐ°Ñ Ð°Ð³Ñ€ÐµÑÑÐ¸Ð²Ð½Ð°Ñ Ð¾Ñ‡Ð¸Ñтка, Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ðµ, таблицы " "\"%s.%s.%s\": Ñканирований индекÑа: %d\n" -#: access/heap/vacuumlazy.c:676 +#: access/heap/vacuumlazy.c:639 #, c-format msgid "" "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: " @@ -1339,27 +1564,27 @@ msgstr "" "автоматичеÑÐºÐ°Ñ Ð¾Ñ‡Ð¸Ñтка, Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ðµ, таблицы \"%s.%s.%s\": " "Ñканирований индекÑа: %d\n" -#: access/heap/vacuumlazy.c:681 +#: access/heap/vacuumlazy.c:644 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "" "автоматичеÑÐºÐ°Ñ Ð°Ð³Ñ€ÐµÑÑÐ¸Ð²Ð½Ð°Ñ Ð¾Ñ‡Ð¸Ñтка таблицы \"%s.%s.%s\": Ñканирований " "индекÑа: %d\n" -#: access/heap/vacuumlazy.c:683 +#: access/heap/vacuumlazy.c:646 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "" "автоматичеÑÐºÐ°Ñ Ð¾Ñ‡Ð¸Ñтка таблицы \"%s.%s.%s\": Ñканирований индекÑа: %d\n" -#: access/heap/vacuumlazy.c:690 +#: access/heap/vacuumlazy.c:653 #, c-format msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" msgstr "" "Ñтраниц удалено: %u, оÑталоÑÑŒ: %u, проÑканировано: %u (%.2f%% от общего " "чиÑла)\n" -#: access/heap/vacuumlazy.c:697 +#: access/heap/vacuumlazy.c:660 #, c-format msgid "" "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" @@ -1367,7 +1592,7 @@ msgstr "" "верÑий Ñтрок: удалено: %lld, оÑталоÑÑŒ: %lld, «мёртвых», но ещё не подлежащих " "удалению: %lld\n" -#: access/heap/vacuumlazy.c:703 +#: access/heap/vacuumlazy.c:666 #, c-format msgid "" "tuples missed: %lld dead from %u pages not removed due to cleanup lock " @@ -1376,36 +1601,43 @@ msgstr "" "из-за конфликта блокировки очиÑтки пропущено верÑий Ñтрок: %lld, на " "Ñтраницах: %u\n" -#: access/heap/vacuumlazy.c:708 +#: access/heap/vacuumlazy.c:672 #, c-format msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" msgstr "" "XID отÑечки удалениÑ: %u, на момент Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸ он имел возраÑÑ‚: %d " "XID\n" -#: access/heap/vacuumlazy.c:714 +#: access/heap/vacuumlazy.c:679 #, c-format msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" msgstr "" "новое значение relfrozenxid: %u, оно продвинулоÑÑŒ вперёд от предыдущего " "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° %d XID\n" -#: access/heap/vacuumlazy.c:721 +#: access/heap/vacuumlazy.c:687 #, c-format msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" msgstr "" "новое значение relminmxid: %u, оно продвинулоÑÑŒ вперёд от предыдущего " "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° %d MXID\n" -#: access/heap/vacuumlazy.c:727 +#: access/heap/vacuumlazy.c:690 +#, c-format +msgid "frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n" +msgstr "" +"замораживание: на Ñтраницах таблицы (%u, %.2f%% от общего чиÑла) заморожено " +"кортежей: %lld\n" + +#: access/heap/vacuumlazy.c:698 msgid "index scan not needed: " msgstr "Ñканирование индекÑа не требуетÑÑ: " -#: access/heap/vacuumlazy.c:729 +#: access/heap/vacuumlazy.c:700 msgid "index scan needed: " msgstr "Ñканирование индекÑа требуетÑÑ: " -#: access/heap/vacuumlazy.c:731 +#: access/heap/vacuumlazy.c:702 #, c-format msgid "" "%u pages from table (%.2f%% of total) had %lld dead item identifiers " @@ -1414,22 +1646,22 @@ msgstr "" "на Ñтраницах таблицы (%u, %.2f%% от общего чиÑла) удалено мёртвых " "идентификаторов Ñлементов: %lld\n" -#: access/heap/vacuumlazy.c:736 +#: access/heap/vacuumlazy.c:707 msgid "index scan bypassed: " msgstr "Ñканирование индекÑа пропущено: " -#: access/heap/vacuumlazy.c:738 +#: access/heap/vacuumlazy.c:709 msgid "index scan bypassed by failsafe: " msgstr "Ñканирование индекÑа пропущено из-за защиты: " -#: access/heap/vacuumlazy.c:740 +#: access/heap/vacuumlazy.c:711 #, c-format msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" msgstr "" "на Ñтраницах таблицы (%u, %.2f%% от общего чиÑла) находитÑÑ Ð¼Ñ‘Ñ€Ñ‚Ð²Ñ‹Ñ… " "идентификаторов Ñлементов: %lld\n" -#: access/heap/vacuumlazy.c:755 +#: access/heap/vacuumlazy.c:726 #, c-format msgid "" "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u " @@ -1438,43 +1670,43 @@ msgstr "" "Ð¸Ð½Ð´ÐµÐºÑ \"%s\": вÑего Ñтраниц: %u, ÑÐµÐ¹Ñ‡Ð°Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¾: %u, удалено на данный " "момент: %u, Ñвободно: %u\n" -#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 +#: access/heap/vacuumlazy.c:738 commands/analyze.c:794 #, c-format msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" msgstr "Ð²Ñ€ÐµÐ¼Ñ Ð²Ð²Ð¾Ð´Ð°/вывода: чтение: %.3f мÑ, запиÑÑŒ: %.3f мÑ\n" -#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 +#: access/heap/vacuumlazy.c:748 commands/analyze.c:797 #, c-format msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" msgstr "" "ÑреднÑÑ ÑкороÑть чтениÑ: %.3f МБ/Ñ, ÑреднÑÑ ÑкороÑть запиÑи: %.3f МБ/Ñ\n" -#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 +#: access/heap/vacuumlazy.c:751 commands/analyze.c:799 #, c-format msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" msgstr "" "иÑпользование буфера: попаданий: %lld, промахов: %lld, «грÑзных» запиÑей: " "%lld\n" -#: access/heap/vacuumlazy.c:785 +#: access/heap/vacuumlazy.c:756 #, c-format msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" msgstr "" "иÑпользование WAL: запиÑей: %lld, полных образов Ñтраниц: %lld, байт: %llu\n" -#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 +#: access/heap/vacuumlazy.c:760 commands/analyze.c:803 #, c-format msgid "system usage: %s" msgstr "нагрузка ÑиÑтемы: %s" -#: access/heap/vacuumlazy.c:2463 +#: access/heap/vacuumlazy.c:2173 #, c-format msgid "table \"%s\": removed %lld dead item identifiers in %u pages" msgstr "" "таблица \"%s\": удалено мёртвых идентификаторов Ñлементов: %lld, на " "Ñтраницах: %u" -#: access/heap/vacuumlazy.c:2629 +#: access/heap/vacuumlazy.c:2327 #, c-format msgid "" "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after " @@ -1483,12 +1715,12 @@ msgstr "" "неÑущеÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ð±ÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s.%s.%s\" пропуÑкаетÑÑ Ð² " "качеÑтве меры защиты поÑле %d Ñканирований индекÑа" -#: access/heap/vacuumlazy.c:2634 +#: access/heap/vacuumlazy.c:2330 #, c-format msgid "The table's relfrozenxid or relminmxid is too far in the past." msgstr "Значение relfrozenxid или relminmxid таблицы Ñлишком далеко в прошлом." -#: access/heap/vacuumlazy.c:2635 +#: access/heap/vacuumlazy.c:2331 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or " @@ -1501,23 +1733,23 @@ msgstr "" "Также можно раÑÑмотреть другие ÑпоÑобы обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти " "VACUUM, ÑоответÑтвующей ÑкороÑти Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð¾Ð² транзакций." -#: access/heap/vacuumlazy.c:2878 +#: access/heap/vacuumlazy.c:2593 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\": оÑтановка уÑÐµÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·-за конфликтующего запроÑа блокировки" -#: access/heap/vacuumlazy.c:2948 +#: access/heap/vacuumlazy.c:2663 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "таблица \"%s\": уÑечение (было Ñтраниц: %u, Ñтало: %u)" -#: access/heap/vacuumlazy.c:3010 +#: access/heap/vacuumlazy.c:2725 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "" "таблица \"%s\": приоÑтановка уÑÐµÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·-за конфликтующего запроÑа блокировки" -#: access/heap/vacuumlazy.c:3170 +#: access/heap/vacuumlazy.c:2844 #, c-format msgid "" "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary " @@ -1526,47 +1758,47 @@ msgstr "" "отключение параллельного режима очиÑтки \"%s\" --- Ñоздавать временные " "таблицы в параллельном режиме нельзÑ" -#: access/heap/vacuumlazy.c:3383 +#: access/heap/vacuumlazy.c:3111 #, c-format msgid "while scanning block %u offset %u of relation \"%s.%s\"" msgstr "при Ñканировании блока %u (Ñмещение %u) Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3386 +#: access/heap/vacuumlazy.c:3114 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "при Ñканировании блока %u Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3390 +#: access/heap/vacuumlazy.c:3118 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "при Ñканировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3398 +#: access/heap/vacuumlazy.c:3126 #, c-format msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" msgstr "при очиÑтке блока %u (Ñмещение %u) Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3401 +#: access/heap/vacuumlazy.c:3129 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "при очиÑтке блока %u Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3405 +#: access/heap/vacuumlazy.c:3133 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "при очиÑтке Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1058 +#: access/heap/vacuumlazy.c:3138 commands/vacuumparallel.c:1112 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "при очиÑтке индекÑа \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1064 +#: access/heap/vacuumlazy.c:3143 commands/vacuumparallel.c:1118 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "при уборке индекÑа \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3421 +#: access/heap/vacuumlazy.c:3149 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "при уÑечении Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" до %u блок." @@ -1586,40 +1818,45 @@ msgstr "Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° доÑтупа индекÑа \"%s\" не задан msgid "transaction aborted during system catalog scan" msgstr "Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÑ€Ð²Ð°Ð½Ð° во Ð²Ñ€ÐµÐ¼Ñ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑиÑтемного каталога" -#: access/index/indexam.c:142 catalog/objectaddress.c:1376 -#: commands/indexcmds.c:2790 commands/tablecmds.c:271 commands/tablecmds.c:295 -#: commands/tablecmds.c:17131 commands/tablecmds.c:18910 +#: access/index/genam.c:657 access/index/indexam.c:82 +#, c-format +msgid "cannot access index \"%s\" while it is being reindexed" +msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" переÑтраиваетÑÑ, обращатьÑÑ Ðº нему нельзÑ" + +#: access/index/indexam.c:203 catalog/objectaddress.c:1356 +#: commands/indexcmds.c:2851 commands/tablecmds.c:281 commands/tablecmds.c:305 +#: commands/tablecmds.c:17914 commands/tablecmds.c:19803 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" - Ñто не индекÑ" -#: access/index/indexam.c:973 +#: access/index/indexam.c:1028 #, c-format msgid "operator class %s has no options" msgstr "у клаÑÑа операторов %s нет параметров" -#: access/nbtree/nbtinsert.c:666 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "повторÑющееÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ ключа нарушает ограничение уникальноÑти \"%s\"" -#: access/nbtree/nbtinsert.c:668 +#: access/nbtree/nbtinsert.c:670 #, c-format msgid "Key %s already exists." msgstr "Ключ \"%s\" уже ÑущеÑтвует." -#: access/nbtree/nbtinsert.c:762 +#: access/nbtree/nbtinsert.c:764 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "Возможно, Ñто вызвано переменной природой индекÑного выражениÑ." -#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 -#: parser/parse_utilcmd.c:2332 +#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 +#: parser/parse_utilcmd.c:2323 #, c-format msgid "index \"%s\" is not a btree" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" не ÑвлÑетÑÑ b-деревом" -#: access/nbtree/nbtpage.c:166 access/nbtree/nbtpage.c:615 +#: access/nbtree/nbtpage.c:164 access/nbtree/nbtpage.c:618 #, c-format msgid "" "version mismatch in index \"%s\": file version %d, current version %d, " @@ -1628,12 +1865,12 @@ msgstr "" "неÑовпадение верÑии в индекÑе \"%s\": верÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð°: %d, верÑÐ¸Ñ ÐºÐ¾Ð´Ð°: %d, " "Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑиÑ: %d" -#: access/nbtree/nbtpage.c:1874 +#: access/nbtree/nbtpage.c:1861 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" Ñодержит полумёртвую внутреннюю Ñтраницу" -#: access/nbtree/nbtpage.c:1876 +#: access/nbtree/nbtpage.c:1863 #, c-format msgid "" "This can be caused by an interrupted VACUUM in version 9.3 or older, before " @@ -1642,7 +1879,7 @@ msgstr "" "Причиной тому могло быть прерывание операции VACUUM в верÑии 9.3 или Ñтарее, " "до обновлениÑ. Этот Ð¸Ð½Ð´ÐµÐºÑ Ð½ÑƒÐ¶Ð½Ð¾ переÑтроить (REINDEX)." -#: access/nbtree/nbtutils.c:2669 +#: access/nbtree/nbtutils.c:5108 #, c-format msgid "" "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" @@ -1650,12 +1887,12 @@ msgstr "" "размер Ñтроки индекÑа (%zu) больше предельного Ð´Ð»Ñ btree верÑии %u размера " "(%zu) (Ð¸Ð½Ð´ÐµÐºÑ \"%s\")" -#: access/nbtree/nbtutils.c:2675 +#: access/nbtree/nbtutils.c:5114 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "Строка индекÑа ÑÑылаетÑÑ Ð½Ð° кортеж (%u,%u) в отношении \"%s\"." -#: access/nbtree/nbtutils.c:2679 +#: access/nbtree/nbtutils.c:5118 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1676,7 +1913,13 @@ msgstr "" "в ÑемейÑтве операторов \"%s\" метода доÑтупа %s нет опорной функции Ð´Ð»Ñ " "типов %s и %s" -#: access/spgist/spgutils.c:244 +#: access/sequence/sequence.c:75 access/table/table.c:145 +#: optimizer/util/plancat.c:144 +#, c-format +msgid "cannot open relation \"%s\"" +msgstr "открыть отношение \"%s\" нельзÑ" + +#: access/spgist/spgutils.c:245 #, c-format msgid "" "compress method must be defined when leaf type is different from input type" @@ -1684,7 +1927,7 @@ msgstr "" "метод ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть определён, когда тип лиÑтьев отличаетÑÑ Ð¾Ñ‚ входного " "типа" -#: access/spgist/spgutils.c:1016 +#: access/spgist/spgutils.c:1028 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "внутренний размер кортежа SP-GiST (%zu) превышает макÑимум (%zu)" @@ -1705,83 +1948,71 @@ msgstr "" "в ÑемейÑтве операторов \"%s\" метода доÑтупа %s нет опорной функции %d Ð´Ð»Ñ " "типа %s" -#: access/table/table.c:49 access/table/table.c:83 access/table/table.c:112 -#: access/table/table.c:145 catalog/aclchk.c:1835 -#, c-format -msgid "\"%s\" is an index" -msgstr "\"%s\" - Ñто индекÑ" - -#: access/table/table.c:54 access/table/table.c:88 access/table/table.c:117 -#: access/table/table.c:150 catalog/aclchk.c:1842 commands/tablecmds.c:13829 -#: commands/tablecmds.c:17140 -#, c-format -msgid "\"%s\" is a composite type" -msgstr "\"%s\" - Ñто ÑоÑтавной тип" - -#: access/table/tableam.c:266 +#: access/table/tableam.c:256 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "идентификатор кортежа (%u, %u) недопуÑтим Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\"" -#: access/table/tableamapi.c:115 +#: access/table/tableamapi.c:109 #, c-format -msgid "%s cannot be empty." -msgstr "Значение %s не может быть пуÑтым." +msgid "\"%s\" cannot be empty." +msgstr "Значение \"%s\" не может быть пуÑтым." # well-spelled: Ñимв -#: access/table/tableamapi.c:122 utils/misc/guc.c:12910 +#: access/table/tableamapi.c:116 access/transam/xlogrecovery.c:4859 #, c-format -msgid "%s is too long (maximum %d characters)." -msgstr "Длина %s превышает предел (%d Ñимв.)." +msgid "\"%s\" is too long (maximum %d characters)." +msgstr "Длина \"%s\" превышает предел (%d Ñимв.)." -#: access/table/tableamapi.c:145 +#: access/table/tableamapi.c:139 #, c-format msgid "table access method \"%s\" does not exist" msgstr "табличный метод доÑтупа \"%s\" не ÑущеÑтвует" -#: access/table/tableamapi.c:150 +#: access/table/tableamapi.c:144 #, c-format msgid "Table access method \"%s\" does not exist." msgstr "Табличный метод доÑтупа \"%s\" не ÑущеÑтвует." -#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:152 +#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:151 #, c-format msgid "sample percentage must be between 0 and 100" msgstr "процент выборки должен задаватьÑÑ Ñ‡Ð¸Ñлом от 0 до 100" -#: access/transam/commit_ts.c:282 +#: access/transam/commit_ts.c:287 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "не удалоÑÑŒ получить метку времени фикÑации транзакции %u" -#: access/transam/commit_ts.c:380 +#: access/transam/commit_ts.c:385 #, c-format msgid "could not get commit timestamp data" msgstr "не удалоÑÑŒ получить отметку времени фикÑации" -#: access/transam/commit_ts.c:382 +#: access/transam/commit_ts.c:387 #, c-format msgid "" "Make sure the configuration parameter \"%s\" is set on the primary server." msgstr "" "УбедитеÑÑŒ, что в конфигурации ведущего Ñервера уÑтановлен параметр \"%s\"." -#: access/transam/commit_ts.c:384 +#: access/transam/commit_ts.c:389 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "УбедитеÑÑŒ, что в конфигурации уÑтановлен параметр \"%s\"." -#: access/transam/multixact.c:1022 +#: access/transam/multixact.c:1091 #, c-format msgid "" -"database is not accepting commands that generate new MultiXactIds to avoid " +"database is not accepting commands that assign new MultiXactIds to avoid " "wraparound data loss in database \"%s\"" msgstr "" -"база данных не принимает команды, Ñоздающие новые MultiXactId, во избежание " -"потери данных из-за Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² базе данных \"%s\"" +"база данных не принимает команды, назначающие новые MultiXactId, во " +"избежание потери данных из-за Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² базе данных \"%s\"" -#: access/transam/multixact.c:1024 access/transam/multixact.c:1031 -#: access/transam/multixact.c:1055 access/transam/multixact.c:1064 +#: access/transam/multixact.c:1093 access/transam/multixact.c:1100 +#: access/transam/multixact.c:1124 access/transam/multixact.c:1133 +#: access/transam/varsup.c:158 access/transam/varsup.c:165 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" @@ -1792,16 +2023,16 @@ msgstr "" "Возможно, вам также придётÑÑ Ð·Ð°Ñ„Ð¸ÐºÑировать или откатить Ñтарые " "подготовленные транзакции и удалить неиÑпользуемые Ñлоты репликации." -#: access/transam/multixact.c:1029 +#: access/transam/multixact.c:1098 #, c-format msgid "" -"database is not accepting commands that generate new MultiXactIds to avoid " +"database is not accepting commands that assign new MultiXactIds to avoid " "wraparound data loss in database with OID %u" msgstr "" -"база данных не принимает команды, Ñоздающие новые MultiXactId, во избежание " -"потери данных из-за Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² базе данных Ñ OID %u" +"база данных не принимает команды, назначающие новые MultiXactId, во " +"избежание потери данных из-за Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² базе данных Ñ OID %u" -#: access/transam/multixact.c:1050 access/transam/multixact.c:2334 +#: access/transam/multixact.c:1119 access/transam/multixact.c:2474 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "" @@ -1816,7 +2047,7 @@ msgstr[2] "" "база данных \"%s\" должна быть очищена, прежде чем будут иÑпользованы " "оÑтавшиеÑÑ MultiXactId (%u)" -#: access/transam/multixact.c:1059 access/transam/multixact.c:2343 +#: access/transam/multixact.c:1128 access/transam/multixact.c:2483 #, c-format msgid "" "database with OID %u must be vacuumed before %u more MultiXactId is used" @@ -1832,12 +2063,12 @@ msgstr[2] "" "база данных Ñ OID %u должна быть очищена, прежде чем будут иÑпользованы " "оÑтавшиеÑÑ MultiXactId (%u)" -#: access/transam/multixact.c:1120 +#: access/transam/multixact.c:1189 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "Ñлишком много членов мультитранзакции" -#: access/transam/multixact.c:1121 +#: access/transam/multixact.c:1190 #, c-format msgid "" "This command would create a multixact with %u members, but the remaining " @@ -1855,17 +2086,17 @@ msgstr[2] "" "МультитранзакциÑ, ÑÐ¾Ð·Ð´Ð°Ð²Ð°ÐµÐ¼Ð°Ñ Ñтой командой, должна включать членов: %u, но " "оÑтавшегоÑÑ Ð¼ÐµÑта хватает только Ð´Ð»Ñ %u." -#: access/transam/multixact.c:1126 +#: access/transam/multixact.c:1195 #, c-format msgid "" "Execute a database-wide VACUUM in database with OID %u with reduced " -"vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age " -"settings." +"\"vacuum_multixact_freeze_min_age\" and " +"\"vacuum_multixact_freeze_table_age\" settings." msgstr "" "Выполните очиÑтку (VACUUM) вÑей базы данных Ñ OID %u, уменьшив Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ " -"vacuum_multixact_freeze_min_age и vacuum_multixact_freeze_table_age." +"\"vacuum_multixact_freeze_min_age\" и \"vacuum_multixact_freeze_table_age\"." -#: access/transam/multixact.c:1157 +#: access/transam/multixact.c:1226 #, c-format msgid "" "database with OID %u must be vacuumed before %d more multixact member is used" @@ -1882,41 +2113,40 @@ msgstr[2] "" "база данных Ñ OID %u должна быть очищена, пока не иÑпользованы оÑтавшиеÑÑ " "члены мультитранзакций (%d)" -#: access/transam/multixact.c:1162 +#: access/transam/multixact.c:1231 #, c-format msgid "" "Execute a database-wide VACUUM in that database with reduced " -"vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age " -"settings." +"\"vacuum_multixact_freeze_min_age\" and " +"\"vacuum_multixact_freeze_table_age\" settings." msgstr "" "Выполните очиÑтку (VACUUM) вÑей Ñтой базы данных, уменьшив Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ " -"vacuum_multixact_freeze_min_age и vacuum_multixact_freeze_table_age." +"\"vacuum_multixact_freeze_min_age\" и \"vacuum_multixact_freeze_table_age\"." -#: access/transam/multixact.c:1301 +#: access/transam/multixact.c:1371 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %u прекратил ÑущеÑтвование: видимо, произошло зацикливание" -#: access/transam/multixact.c:1307 +#: access/transam/multixact.c:1377 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %u ещё не был Ñоздан: видимо, произошло зацикливание" -#: access/transam/multixact.c:2339 access/transam/multixact.c:2348 -#: access/transam/varsup.c:151 access/transam/varsup.c:158 -#: access/transam/varsup.c:466 access/transam/varsup.c:473 +#: access/transam/multixact.c:2479 access/transam/multixact.c:2488 #, c-format msgid "" -"To avoid a database shutdown, execute a database-wide VACUUM in that " -"database.\n" +"To avoid MultiXactId assignment failures, execute a database-wide VACUUM in " +"that database.\n" "You might also need to commit or roll back old prepared transactions, or " "drop stale replication slots." msgstr "" -"Во избежание Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных выполните очиÑтку (VACUUM) вÑей базы.\n" +"Во избежание Ñбоев при назначении MultiXactId, выполните очиÑтку (VACUUM) " +"вÑей базы.\n" "Возможно, вам также придётÑÑ Ð·Ð°Ñ„Ð¸ÐºÑировать или откатить Ñтарые " "подготовленные транзакции и удалить неиÑпользуемые Ñлоты репликации." -#: access/transam/multixact.c:2622 +#: access/transam/multixact.c:2767 #, c-format msgid "" "MultiXact member wraparound protections are disabled because oldest " @@ -1925,12 +2155,12 @@ msgstr "" "Защита от Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ‡Ð»ÐµÐ½Ð¾Ð² мультитранзакций отключена, так как ÑÑ‚Ð°Ñ€ÐµÐ¹ÑˆÐ°Ñ " "Ð¾Ñ‚Ð¼ÐµÑ‡ÐµÐ½Ð½Ð°Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ %u не найдена на диÑке" -#: access/transam/multixact.c:2644 +#: access/transam/multixact.c:2789 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "Защита от Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¹ ÑÐµÐ¹Ñ‡Ð°Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°" -#: access/transam/multixact.c:3031 +#: access/transam/multixact.c:3180 #, c-format msgid "" "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" @@ -1938,7 +2168,7 @@ msgstr "" "ÑÑ‚Ð°Ñ€ÐµÐ¹ÑˆÐ°Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ %u не найдена, Ð½Ð¾Ð²ÐµÐ¹ÑˆÐ°Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ: %u, " "уÑечение пропуÑкаетÑÑ" -#: access/transam/multixact.c:3049 +#: access/transam/multixact.c:3198 #, c-format msgid "" "cannot truncate up to MultiXact %u because it does not exist on disk, " @@ -1947,167 +2177,172 @@ msgstr "" "выполнить уÑечение до мультитранзакции %u Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ð²Ð¸Ð´Ñƒ её отÑутÑÑ‚Ð²Ð¸Ñ Ð½Ð° " "диÑке, уÑечение пропуÑкаетÑÑ" -#: access/transam/multixact.c:3363 +#: access/transam/multixact.c:3517 #, c-format msgid "invalid MultiXactId: %u" msgstr "неверный MultiXactId: %u" -#: access/transam/parallel.c:718 access/transam/parallel.c:837 +#: access/transam/parallel.c:748 access/transam/parallel.c:867 #, c-format msgid "parallel worker failed to initialize" msgstr "не удалоÑÑŒ инициализировать параллельный иÑполнитель" -#: access/transam/parallel.c:719 access/transam/parallel.c:838 +#: access/transam/parallel.c:749 access/transam/parallel.c:868 #, c-format msgid "More details may be available in the server log." msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть в журнале Ñервера." -#: access/transam/parallel.c:899 +#: access/transam/parallel.c:929 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "postmaster завершилÑÑ Ð² процеÑÑе параллельной транзакции" -#: access/transam/parallel.c:1086 +#: access/transam/parallel.c:1116 #, c-format msgid "lost connection to parallel worker" msgstr "потерÑно подключение к параллельному иÑполнителю" -#: access/transam/parallel.c:1152 access/transam/parallel.c:1154 +#: access/transam/parallel.c:1172 access/transam/parallel.c:1174 msgid "parallel worker" msgstr "параллельный иÑполнитель" -#: access/transam/parallel.c:1307 +#: access/transam/parallel.c:1344 replication/logical/applyparallelworker.c:890 #, c-format msgid "could not map dynamic shared memory segment" msgstr "не удалоÑÑŒ отобразить динамичеÑкий Ñегмент разделÑемой памÑти" -#: access/transam/parallel.c:1312 +#: access/transam/parallel.c:1349 replication/logical/applyparallelworker.c:896 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "неверное магичеÑкое чиÑло в динамичеÑком Ñегменте разделÑемой памÑти" -#: access/transam/rmgr.c:84 +#: access/transam/rmgr.c:93 #, c-format msgid "resource manager with ID %d not registered" msgstr "менеджер реÑурÑов Ñ ID %d не зарегиÑтрирован" -#: access/transam/rmgr.c:85 +#: access/transam/rmgr.c:94 #, c-format msgid "" "Include the extension module that implements this resource manager in " -"shared_preload_libraries." +"\"shared_preload_libraries\"." msgstr "" -"Включите в shared_preload_libraries модуль раÑширениÑ, в котором реализован " -"данный менеджер реÑурÑов." +"Включите в \"shared_preload_libraries\" модуль раÑширениÑ, в котором " +"реализован данный менеджер реÑурÑов." -#: access/transam/rmgr.c:101 +#: access/transam/rmgr.c:110 #, c-format msgid "custom resource manager name is invalid" msgstr "неверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкого менеджера реÑурÑов" -#: access/transam/rmgr.c:102 +#: access/transam/rmgr.c:111 #, c-format msgid "Provide a non-empty name for the custom resource manager." msgstr "Задайте непуÑтое Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ€Ð° реÑурÑов." -#: access/transam/rmgr.c:105 +#: access/transam/rmgr.c:114 #, c-format msgid "custom resource manager ID %d is out of range" msgstr "идентификатор пользовательÑкого менеджера реÑурÑов %d вне диапазона" -#: access/transam/rmgr.c:106 +#: access/transam/rmgr.c:115 #, c-format msgid "Provide a custom resource manager ID between %d and %d." msgstr "Задайте идентификатор менеджера реÑурÑов от %d до %d." -#: access/transam/rmgr.c:111 access/transam/rmgr.c:116 -#: access/transam/rmgr.c:128 +#: access/transam/rmgr.c:120 access/transam/rmgr.c:125 +#: access/transam/rmgr.c:137 #, c-format msgid "failed to register custom resource manager \"%s\" with ID %d" msgstr "" "не удалоÑÑŒ зарегиÑтрировать пользовательÑкий менеджер реÑурÑов \"%s\" Ñ ID %d" -#: access/transam/rmgr.c:112 +#: access/transam/rmgr.c:121 #, c-format msgid "" "Custom resource manager must be registered while initializing modules in " -"shared_preload_libraries." +"\"shared_preload_libraries\"." msgstr "" "ПользовательÑкий менеджер реÑурÑов должен быть зарегиÑтрирован при " -"инициализации модулей в shared_preload_libraries." +"инициализации модулей в \"shared_preload_libraries\"." -#: access/transam/rmgr.c:117 +#: access/transam/rmgr.c:126 #, c-format msgid "Custom resource manager \"%s\" already registered with the same ID." msgstr "" "ПользовательÑкий менеджер реÑурÑов \"%s\" уже зарегиÑтрирован Ñ Ñ‚ÐµÐ¼ же ID." -#: access/transam/rmgr.c:129 +#: access/transam/rmgr.c:138 #, c-format msgid "Existing resource manager with ID %d has the same name." msgstr "СущеÑтвующий менеджер реÑурÑов Ñ ID %d имеет то же имÑ." -#: access/transam/rmgr.c:135 +#: access/transam/rmgr.c:144 #, c-format msgid "registered custom resource manager \"%s\" with ID %d" msgstr "зарегиÑтрирован пользовательÑкий менеджер реÑурÑов \"%s\" Ñ ID %d" -#: access/transam/slru.c:714 +#: access/transam/slru.c:361 +#, c-format +msgid "\"%s\" must be a multiple of %d" +msgstr "значение \"%s\" должно быть кратно %d" + +#: access/transam/slru.c:830 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "файл \"%s\" не ÑущеÑтвует, ÑчитаетÑÑ Ð½ÑƒÐ»ÐµÐ²Ñ‹Ð¼" -#: access/transam/slru.c:946 access/transam/slru.c:952 -#: access/transam/slru.c:960 access/transam/slru.c:965 -#: access/transam/slru.c:972 access/transam/slru.c:977 -#: access/transam/slru.c:984 access/transam/slru.c:991 +#: access/transam/slru.c:1059 access/transam/slru.c:1065 +#: access/transam/slru.c:1073 access/transam/slru.c:1078 +#: access/transam/slru.c:1085 access/transam/slru.c:1090 +#: access/transam/slru.c:1097 access/transam/slru.c:1104 #, c-format msgid "could not access status of transaction %u" msgstr "не удалоÑÑŒ получить ÑоÑтоÑние транзакции %u" -#: access/transam/slru.c:947 +#: access/transam/slru.c:1060 #, c-format msgid "Could not open file \"%s\": %m." msgstr "Ðе удалоÑÑŒ открыть файл \"%s\": %m." -#: access/transam/slru.c:953 +#: access/transam/slru.c:1066 #, c-format msgid "Could not seek in file \"%s\" to offset %d: %m." msgstr "Ðе удалоÑÑŒ перемеÑтитьÑÑ Ð² файле \"%s\" к Ñмещению %d: %m." -#: access/transam/slru.c:961 +#: access/transam/slru.c:1074 #, c-format msgid "Could not read from file \"%s\" at offset %d: %m." msgstr "Ðе удалоÑÑŒ прочитать файл \"%s\" (по Ñмещению %d): %m." -#: access/transam/slru.c:966 +#: access/transam/slru.c:1079 #, c-format msgid "Could not read from file \"%s\" at offset %d: read too few bytes." msgstr "" "Ðе удалоÑÑŒ прочитать файл \"%s\" (по Ñмещению %d): прочитаны не вÑе байты." -#: access/transam/slru.c:973 +#: access/transam/slru.c:1086 #, c-format msgid "Could not write to file \"%s\" at offset %d: %m." msgstr "Ðе удалоÑÑŒ запиÑать в файл \"%s\" (по Ñмещению %d): %m." -#: access/transam/slru.c:978 +#: access/transam/slru.c:1091 #, c-format msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." msgstr "" "Ðе удалоÑÑŒ запиÑать в файл \"%s\" (по Ñмещению %d): запиÑаны не вÑе байты." -#: access/transam/slru.c:985 +#: access/transam/slru.c:1098 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "Ðе удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m." -#: access/transam/slru.c:992 +#: access/transam/slru.c:1105 #, c-format msgid "Could not close file \"%s\": %m." msgstr "Ðе удалоÑÑŒ закрыть файл \"%s\": %m." -#: access/transam/slru.c:1253 +#: access/transam/slru.c:1431 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "не удалоÑÑŒ очиÑтить каталог \"%s\": видимо, произошло зацикливание" @@ -2148,64 +2383,65 @@ msgid "Timeline IDs must be less than child timeline's ID." msgstr "" "Идентификаторы линий времени должны быть меньше идентификатора линии-потомка." -#: access/transam/timeline.c:597 +#: access/transam/timeline.c:589 #, c-format msgid "requested timeline %u is not in this server's history" msgstr "в иÑтории Ñервера нет запрошенной линии времени %u" -#: access/transam/twophase.c:385 +#: access/transam/twophase.c:368 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "идентификатор транзакции \"%s\" Ñлишком длинный" -#: access/transam/twophase.c:392 +#: access/transam/twophase.c:375 #, c-format msgid "prepared transactions are disabled" msgstr "подготовленные транзакции отключены" -#: access/transam/twophase.c:393 +#: access/transam/twophase.c:376 #, c-format -msgid "Set max_prepared_transactions to a nonzero value." -msgstr "УÑтановите ненулевое значение параметра max_prepared_transactions." +msgid "Set \"max_prepared_transactions\" to a nonzero value." +msgstr "УÑтановите ненулевое значение параметра \"max_prepared_transactions\"." -#: access/transam/twophase.c:412 +#: access/transam/twophase.c:395 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "идентификатор транзакции \"%s\" уже иÑпользуетÑÑ" -#: access/transam/twophase.c:421 access/transam/twophase.c:2486 +#: access/transam/twophase.c:404 access/transam/twophase.c:2531 #, c-format msgid "maximum number of prepared transactions reached" msgstr "доÑтигнут предел чиÑла подготовленных транзакций" -#: access/transam/twophase.c:422 access/transam/twophase.c:2487 +#: access/transam/twophase.c:405 access/transam/twophase.c:2532 #, c-format -msgid "Increase max_prepared_transactions (currently %d)." -msgstr "Увеличьте параметр max_prepared_transactions (текущее значение %d)." +msgid "Increase \"max_prepared_transactions\" (currently %d)." +msgstr "" +"Увеличьте параметр \"max_prepared_transactions\" (текущее значение %d)." -#: access/transam/twophase.c:598 +#: access/transam/twophase.c:580 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð¾Ð¼ \"%s\" занÑта" -#: access/transam/twophase.c:604 +#: access/transam/twophase.c:586 #, c-format msgid "permission denied to finish prepared transaction" -msgstr "нет доÑтупа Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ð¾Ð¹ транзакции" +msgstr "нет прав Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ð¾Ð¹ транзакции" -#: access/transam/twophase.c:605 +#: access/transam/twophase.c:587 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "" "Это разрешено только Ñуперпользователю и пользователю, подготовившему " "транзакцию." -#: access/transam/twophase.c:616 +#: access/transam/twophase.c:598 #, c-format msgid "prepared transaction belongs to another database" msgstr "Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾ÑитÑÑ Ðº другой базе данных" -#: access/transam/twophase.c:617 +#: access/transam/twophase.c:599 #, c-format msgid "" "Connect to the database where the transaction was prepared to finish it." @@ -2214,17 +2450,17 @@ msgstr "" "подготовлена." # [SM]: TO REVIEW -#: access/transam/twophase.c:632 +#: access/transam/twophase.c:614 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "подготовленной транзакции Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð¾Ð¼ \"%s\" нет" -#: access/transam/twophase.c:1169 +#: access/transam/twophase.c:1174 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "превышен предельный размер файла ÑоÑтоÑÐ½Ð¸Ñ 2PC" -#: access/transam/twophase.c:1324 +#: access/transam/twophase.c:1329 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" @@ -2232,62 +2468,63 @@ msgstr[0] "некорректный размер файла \"%s\": %lld Б" msgstr[1] "некорректный размер файла \"%s\": %lld Б" msgstr[2] "некорректный размер файла \"%s\": %lld Б" -#: access/transam/twophase.c:1333 +#: access/transam/twophase.c:1338 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "некорректное выравнивание ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ CRC Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\"" -#: access/transam/twophase.c:1351 +#: access/transam/twophase.c:1356 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %lld)" -#: access/transam/twophase.c:1366 +#: access/transam/twophase.c:1371 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "в файле \"%s\" ÑодержитÑÑ Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñигнатура" -#: access/transam/twophase.c:1372 +#: access/transam/twophase.c:1377 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "в файле \"%s\" ÑодержитÑÑ Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¹ размер" -#: access/transam/twophase.c:1384 +#: access/transam/twophase.c:1389 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "" "вычиÑÐ»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма (CRC) не ÑоответÑтвует значению, Ñохранённому " "в файле \"%s\"" -#: access/transam/twophase.c:1414 access/transam/xlogrecovery.c:569 -#: replication/logical/logical.c:206 replication/walsender.c:702 +#: access/transam/twophase.c:1419 access/transam/xlogrecovery.c:565 +#: postmaster/walsummarizer.c:936 replication/logical/logical.c:211 +#: replication/walsender.c:840 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Ðе удалоÑÑŒ размеÑтить обработчик журнала транзакций." -#: access/transam/twophase.c:1424 +#: access/transam/twophase.c:1429 #, c-format msgid "could not read two-phase state from WAL at %X/%X: %s" msgstr "не удалоÑÑŒ прочитать ÑоÑтоÑние 2PC из WAL в позиции %X/%X: %s" -#: access/transam/twophase.c:1429 +#: access/transam/twophase.c:1434 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "не удалоÑÑŒ прочитать ÑоÑтоÑние 2PC из WAL в позиции %X/%X" -#: access/transam/twophase.c:1437 +#: access/transam/twophase.c:1442 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "" "ожидаемые данные ÑоÑтоÑÐ½Ð¸Ñ Ð´Ð²ÑƒÑ…Ñ„Ð°Ð·Ð½Ð¾Ð¹ фикÑации отÑутÑтвуют в WAL в позиции " "%X/%X" -#: access/transam/twophase.c:1733 +#: access/transam/twophase.c:1745 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "переÑоздать файл \"%s\" не удалоÑÑŒ: %m" -#: access/transam/twophase.c:1860 +#: access/transam/twophase.c:1872 #, c-format msgid "" "%u two-phase state file was written for a long-running prepared transaction" @@ -2300,201 +2537,243 @@ msgstr[1] "" msgstr[2] "" "Ð´Ð»Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… подготовленных транзакций запиÑано файлов ÑоÑтоÑÐ½Ð¸Ñ 2PC: %u" -#: access/transam/twophase.c:2094 +#: access/transam/twophase.c:2107 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "воÑÑтановление подготовленной транзакции %u из разделÑемой памÑти" -#: access/transam/twophase.c:2187 +#: access/transam/twophase.c:2200 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "удаление уÑтаревшего файла ÑоÑтоÑÐ½Ð¸Ñ 2PC Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ %u" -#: access/transam/twophase.c:2194 +#: access/transam/twophase.c:2207 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "удаление из памÑти уÑтаревшего ÑоÑтоÑÐ½Ð¸Ñ 2PC Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ %u" -#: access/transam/twophase.c:2207 +#: access/transam/twophase.c:2220 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "удаление файла будущего ÑоÑтоÑÐ½Ð¸Ñ 2PC Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ %u" -#: access/transam/twophase.c:2214 +#: access/transam/twophase.c:2227 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "удаление из памÑти будущего ÑоÑтоÑÐ½Ð¸Ñ 2PC Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ %u" -#: access/transam/twophase.c:2239 +#: access/transam/twophase.c:2252 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "иÑпорчен файл ÑоÑтоÑÐ½Ð¸Ñ 2PC Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ %u" -#: access/transam/twophase.c:2244 +#: access/transam/twophase.c:2257 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "иÑпорчено ÑоÑтоÑние 2PC в памÑти Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ %u" -#: access/transam/varsup.c:129 +#: access/transam/twophase.c:2514 +#, c-format +msgid "could not recover two-phase state file for transaction %u" +msgstr "не удалоÑÑŒ воÑÑтановить файл ÑоÑтоÑÐ½Ð¸Ñ 2PC Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ %u" + +#: access/transam/twophase.c:2516 #, c-format msgid "" -"database is not accepting commands to avoid wraparound data loss in database " -"\"%s\"" +"Two-phase state file has been found in WAL record %X/%X, but this " +"transaction has already been restored from disk." msgstr "" -"база данных не принимает команды во избежание потери данных из-за " -"Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¹ в базе данных \"%s\"" +"Ð”Ð»Ñ WAL-запиÑи %X/%X найден файл ÑоÑтоÑÐ½Ð¸Ñ Ð´Ð²ÑƒÑ…Ñ„Ð°Ð·Ð½Ð¾Ð¹ фикÑации, но Ñта " +"Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ ÑƒÐ¶Ðµ была воÑÑтановлена Ñ Ð´Ð¸Ñка." + +#: access/transam/twophase.c:2524 storage/file/fd.c:514 utils/fmgr/dfmgr.c:209 +#, c-format +msgid "could not access file \"%s\": %m" +msgstr "ошибка при обращении к файлу \"%s\": %m" -#: access/transam/varsup.c:131 access/transam/varsup.c:138 +#: access/transam/varsup.c:156 #, c-format msgid "" -"Stop the postmaster and vacuum that database in single-user mode.\n" -"You might also need to commit or roll back old prepared transactions, or " -"drop stale replication slots." +"database is not accepting commands that assign new transaction IDs to avoid " +"wraparound data loss in database \"%s\"" msgstr "" -"ОÑтановите управлÑющий процеÑÑ (postmaster) и выполните очиÑтку (VACUUM) " -"базы данных в монопольном режиме.\n" -"Возможно, вам также придётÑÑ Ð·Ð°Ñ„Ð¸ÐºÑировать или откатить Ñтарые " -"подготовленные транзакции и удалить неиÑпользуемые Ñлоты репликации." +"база данных не принимает команды, назначающие новые идентификаторы " +"транзакций, во избежание потери данных из-за Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² базе данных " +"\"%s\"" -#: access/transam/varsup.c:136 +#: access/transam/varsup.c:163 #, c-format msgid "" -"database is not accepting commands to avoid wraparound data loss in database " -"with OID %u" +"database is not accepting commands that assign new transaction IDs to avoid " +"wraparound data loss in database with OID %u" msgstr "" -"база данных не принимает команды во избежание потери данных из-за " -"Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¹ в базе данных Ñ OID %u" +"база данных не принимает команды, назначающие новые идентификаторы " +"транзакций, во избежание потери данных из-за Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² базе данных Ñ " +"OID %u" -#: access/transam/varsup.c:148 access/transam/varsup.c:463 +#: access/transam/varsup.c:175 access/transam/varsup.c:490 #, c-format msgid "database \"%s\" must be vacuumed within %u transactions" msgstr "" "база данных \"%s\" должна быть очищена (предельное чиÑло транзакций: %u)" -#: access/transam/varsup.c:155 access/transam/varsup.c:470 +#: access/transam/varsup.c:178 +#, c-format +msgid "" +"To avoid transaction ID assignment failures, execute a database-wide VACUUM " +"in that database.\n" +"You might also need to commit or roll back old prepared transactions, or " +"drop stale replication slots." +msgstr "" +"Во избежание Ñбоев при назначении идентификаторов транзакций, выполните " +"очиÑтку (VACUUM) вÑей базы.\n" +"Возможно, вам также придётÑÑ Ð·Ð°Ñ„Ð¸ÐºÑировать или откатить Ñтарые " +"подготовленные транзакции и удалить неиÑпользуемые Ñлоты репликации." + +#: access/transam/varsup.c:182 access/transam/varsup.c:497 #, c-format msgid "database with OID %u must be vacuumed within %u transactions" msgstr "" "база данных Ñ OID %u должна быть очищена (предельное чиÑло транзакций: %u)" -#: access/transam/xact.c:1098 +#: access/transam/varsup.c:185 access/transam/varsup.c:493 +#: access/transam/varsup.c:500 +#, c-format +msgid "" +"To avoid XID assignment failures, execute a database-wide VACUUM in that " +"database.\n" +"You might also need to commit or roll back old prepared transactions, or " +"drop stale replication slots." +msgstr "" +"Во избежание Ñбоев при назначении XID, выполните очиÑтку (VACUUM) вÑей " +"базы.\n" +"Возможно, вам также придётÑÑ Ð·Ð°Ñ„Ð¸ÐºÑировать или откатить Ñтарые " +"подготовленные транзакции и удалить неиÑпользуемые Ñлоты репликации." + +#: access/transam/xact.c:649 +#, c-format +msgid "cannot assign transaction IDs during a parallel operation" +msgstr "" +"идентификаторы транзакций не могут назначатьÑÑ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций" + +#: access/transam/xact.c:840 +#, c-format +msgid "cannot modify data in a parallel worker" +msgstr "модифицировать данные в параллельном иÑполнителе нельзÑ" + +#: access/transam/xact.c:1115 +#, c-format +msgid "cannot start commands during a parallel operation" +msgstr "начинать команды во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ð¾Ð¹ операции нельзÑ" + +#: access/transam/xact.c:1123 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "в одной транзакции не может быть больше 2^32-2 команд" -#: access/transam/xact.c:1644 +#: access/transam/xact.c:1664 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "превышен предел чиÑла зафикÑированных подтранзакций (%d)" -#: access/transam/xact.c:2501 +#: access/transam/xact.c:2561 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ PREPARE Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸, оперирующей Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼Ð¸ объектами" -#: access/transam/xact.c:2511 +#: access/transam/xact.c:2571 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ PREPARE Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸, Ñнимки которой ÑкÑпортированы" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3478 +#: access/transam/xact.c:3593 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s не может выполнÑтьÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ блока транзакции" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3488 +#: access/transam/xact.c:3603 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s не может выполнÑтьÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ подтранзакции" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3498 +#: access/transam/xact.c:3613 #, c-format msgid "%s cannot be executed within a pipeline" msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñть в конвейере" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3508 +#: access/transam/xact.c:3623 #, c-format msgid "%s cannot be executed from a function" msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñть внутри функции" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3579 access/transam/xact.c:3894 -#: access/transam/xact.c:3973 access/transam/xact.c:4096 -#: access/transam/xact.c:4247 access/transam/xact.c:4316 -#: access/transam/xact.c:4427 +#: access/transam/xact.c:3694 access/transam/xact.c:4019 +#: access/transam/xact.c:4098 access/transam/xact.c:4221 +#: access/transam/xact.c:4372 access/transam/xact.c:4441 +#: access/transam/xact.c:4552 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s может выполнÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ внутри блоков транзакций" -#: access/transam/xact.c:3780 +#: access/transam/xact.c:3905 #, c-format msgid "there is already a transaction in progress" msgstr "Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ ÑƒÐ¶Ðµ выполнÑетÑÑ" -#: access/transam/xact.c:3899 access/transam/xact.c:3978 -#: access/transam/xact.c:4101 +#: access/transam/xact.c:4024 access/transam/xact.c:4103 +#: access/transam/xact.c:4226 #, c-format msgid "there is no transaction in progress" msgstr "нет незавершённой транзакции" -#: access/transam/xact.c:3989 +#: access/transam/xact.c:4114 #, c-format msgid "cannot commit during a parallel operation" msgstr "фикÑировать транзакции во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" -#: access/transam/xact.c:4112 +#: access/transam/xact.c:4237 #, c-format msgid "cannot abort during a parallel operation" msgstr "прерывание во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций невозможно" -#: access/transam/xact.c:4211 +#: access/transam/xact.c:4336 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "определÑть точки ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" -#: access/transam/xact.c:4298 +#: access/transam/xact.c:4423 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "выÑвобождать точки ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" -#: access/transam/xact.c:4308 access/transam/xact.c:4359 -#: access/transam/xact.c:4419 access/transam/xact.c:4468 +#: access/transam/xact.c:4433 access/transam/xact.c:4484 +#: access/transam/xact.c:4544 access/transam/xact.c:4593 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "точка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ \"%s\" не ÑущеÑтвует" -#: access/transam/xact.c:4365 access/transam/xact.c:4474 +#: access/transam/xact.c:4490 access/transam/xact.c:4599 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "" "точка ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ \"%s\" на текущем уровне точек ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ ÑущеÑтвует" -#: access/transam/xact.c:4407 +#: access/transam/xact.c:4532 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "откатитьÑÑ Ðº точке ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" -#: access/transam/xact.c:4535 -#, c-format -msgid "cannot start subtransactions during a parallel operation" -msgstr "запуÑкать подтранзакции во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" - -#: access/transam/xact.c:4603 -#, c-format -msgid "cannot commit subtransactions during a parallel operation" -msgstr "фикÑировать подтранзакции во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" - -#: access/transam/xact.c:5250 +#: access/transam/xact.c:5376 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "в одной транзакции не может быть больше 2^32-1 подтранзакций" -#: access/transam/xlog.c:1463 +#: access/transam/xlog.c:1542 #, c-format msgid "" "request to flush past end of generated WAL; request %X/%X, current position " @@ -2503,55 +2782,78 @@ msgstr "" "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑÐ±Ñ€Ð¾Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… за концом Ñгенерированного WAL; запрошена Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %X/" "%X, Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %X/%X" -#: access/transam/xlog.c:2224 +#: access/transam/xlog.c:1769 +#, c-format +msgid "" +"cannot read past end of generated WAL: requested %X/%X, current position %X/" +"%X" +msgstr "" +"чтение за концом Ñгенерированного WAL невозможно: запрошена Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %X/%X, " +"Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %X/%X" + +#: access/transam/xlog.c:2210 access/transam/xlog.c:4501 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "" +"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 ГБ." + +#: access/transam/xlog.c:2228 #, c-format -msgid "could not write to log file %s at offset %u, length %zu: %m" -msgstr "не удалоÑÑŒ запиÑать в файл журнала %s (Ñмещение: %u, длина: %zu): %m" +msgid "\"%s\" must be set to -1 during binary upgrade mode." +msgstr "Параметр \"%s\" должен быть равен -1 в режиме двоичного обновлениÑ." -#: access/transam/xlog.c:3471 access/transam/xlogutils.c:847 -#: replication/walsender.c:2716 +#: access/transam/xlog.c:2477 +#, c-format +msgid "could not write to log file \"%s\" at offset %u, length %zu: %m" +msgstr "" +"не удалоÑÑŒ запиÑать в файл журнала \"%s\" (Ñмещение: %u, длина: %zu): %m" + +#: access/transam/xlog.c:3739 access/transam/xlogutils.c:831 +#: replication/walsender.c:3075 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "запрошенный Ñегмент WAL %s уже удалён" -#: access/transam/xlog.c:3756 +#: access/transam/xlog.c:4061 #, c-format msgid "could not rename file \"%s\": %m" msgstr "не удалоÑÑŒ переименовать файл \"%s\": %m" -#: access/transam/xlog.c:3798 access/transam/xlog.c:3808 +#: access/transam/xlog.c:4104 access/transam/xlog.c:4115 +#: access/transam/xlog.c:4136 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "требуемый каталог WAL \"%s\" не ÑущеÑтвует" -#: access/transam/xlog.c:3814 +#: access/transam/xlog.c:4121 access/transam/xlog.c:4142 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "ÑоздаётÑÑ Ð¾Ñ‚ÑутÑтвующий каталог WAL \"%s\"" -#: access/transam/xlog.c:3817 commands/dbcommands.c:3045 +#: access/transam/xlog.c:4125 access/transam/xlog.c:4145 +#: commands/dbcommands.c:3262 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать отÑутÑтвующий каталог \"%s\": %m" -#: access/transam/xlog.c:3884 +#: access/transam/xlog.c:4212 #, c-format msgid "could not generate secret authorization token" msgstr "не удалоÑÑŒ Ñгенерировать Ñлучайное чиÑло Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸" -#: access/transam/xlog.c:4043 access/transam/xlog.c:4052 -#: access/transam/xlog.c:4076 access/transam/xlog.c:4083 -#: access/transam/xlog.c:4090 access/transam/xlog.c:4095 -#: access/transam/xlog.c:4102 access/transam/xlog.c:4109 -#: access/transam/xlog.c:4116 access/transam/xlog.c:4123 -#: access/transam/xlog.c:4130 access/transam/xlog.c:4137 -#: access/transam/xlog.c:4146 access/transam/xlog.c:4153 -#: utils/init/miscinit.c:1598 +#: access/transam/xlog.c:4363 access/transam/xlog.c:4373 +#: access/transam/xlog.c:4399 access/transam/xlog.c:4407 +#: access/transam/xlog.c:4415 access/transam/xlog.c:4421 +#: access/transam/xlog.c:4429 access/transam/xlog.c:4437 +#: access/transam/xlog.c:4445 access/transam/xlog.c:4453 +#: access/transam/xlog.c:4461 access/transam/xlog.c:4469 +#: access/transam/xlog.c:4479 access/transam/xlog.c:4487 +#: utils/init/miscinit.c:1812 #, c-format msgid "database files are incompatible with server" msgstr "файлы базы данных неÑовмеÑтимы Ñ Ñервером" -#: access/transam/xlog.c:4044 +#: access/transam/xlog.c:4364 #, c-format msgid "" "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), " @@ -2560,7 +2862,7 @@ msgstr "" "КлаÑтер баз данных был инициализирован Ñ PG_CONTROL_VERSION %d (0x%08x), но " "Ñервер Ñкомпилирован Ñ PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlog.c:4048 +#: access/transam/xlog.c:4368 #, c-format msgid "" "This could be a problem of mismatched byte ordering. It looks like you need " @@ -2569,7 +2871,7 @@ msgstr "" "Возможно, проблема вызвана разным порÑдком байт. КажетÑÑ, вам надо выполнить " "initdb." -#: access/transam/xlog.c:4053 +#: access/transam/xlog.c:4374 #, c-format msgid "" "The database cluster was initialized with PG_CONTROL_VERSION %d, but the " @@ -2578,18 +2880,18 @@ msgstr "" "КлаÑтер баз данных был инициализирован Ñ PG_CONTROL_VERSION %d, но Ñервер " "Ñкомпилирован Ñ PG_CONTROL_VERSION %d." -#: access/transam/xlog.c:4056 access/transam/xlog.c:4080 -#: access/transam/xlog.c:4087 access/transam/xlog.c:4092 +#: access/transam/xlog.c:4377 access/transam/xlog.c:4403 +#: access/transam/xlog.c:4411 access/transam/xlog.c:4417 #, c-format msgid "It looks like you need to initdb." msgstr "КажетÑÑ, вам надо выполнить initdb." -#: access/transam/xlog.c:4067 +#: access/transam/xlog.c:4389 #, c-format msgid "incorrect checksum in control file" msgstr "ошибка контрольной Ñуммы в файле pg_control" -#: access/transam/xlog.c:4077 +#: access/transam/xlog.c:4400 #, c-format msgid "" "The database cluster was initialized with CATALOG_VERSION_NO %d, but the " @@ -2598,7 +2900,7 @@ msgstr "" "КлаÑтер баз данных был инициализирован Ñ CATALOG_VERSION_NO %d, но Ñервер " "Ñкомпилирован Ñ CATALOG_VERSION_NO %d." -#: access/transam/xlog.c:4084 +#: access/transam/xlog.c:4408 #, c-format msgid "" "The database cluster was initialized with MAXALIGN %d, but the server was " @@ -2607,7 +2909,7 @@ msgstr "" "КлаÑтер баз данных был инициализирован Ñ MAXALIGN %d, но Ñервер " "Ñкомпилирован Ñ MAXALIGN %d." -#: access/transam/xlog.c:4091 +#: access/transam/xlog.c:4416 #, c-format msgid "" "The database cluster appears to use a different floating-point number format " @@ -2616,7 +2918,7 @@ msgstr "" "КажетÑÑ, в клаÑтере баз данных и в программе Ñервера иÑпользуютÑÑ Ñ€Ð°Ð·Ð½Ñ‹Ðµ " "форматы чиÑел Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой." -#: access/transam/xlog.c:4096 +#: access/transam/xlog.c:4422 #, c-format msgid "" "The database cluster was initialized with BLCKSZ %d, but the server was " @@ -2625,16 +2927,16 @@ msgstr "" "КлаÑтер баз данных был инициализирован Ñ BLCKSZ %d, но Ñервер Ñкомпилирован " "Ñ BLCKSZ %d." -#: access/transam/xlog.c:4099 access/transam/xlog.c:4106 -#: access/transam/xlog.c:4113 access/transam/xlog.c:4120 -#: access/transam/xlog.c:4127 access/transam/xlog.c:4134 -#: access/transam/xlog.c:4141 access/transam/xlog.c:4149 -#: access/transam/xlog.c:4156 +#: access/transam/xlog.c:4425 access/transam/xlog.c:4433 +#: access/transam/xlog.c:4441 access/transam/xlog.c:4449 +#: access/transam/xlog.c:4457 access/transam/xlog.c:4465 +#: access/transam/xlog.c:4473 access/transam/xlog.c:4482 +#: access/transam/xlog.c:4490 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "КажетÑÑ, вам надо перекомпилировать Ñервер или выполнить initdb." -#: access/transam/xlog.c:4103 +#: access/transam/xlog.c:4430 #, c-format msgid "" "The database cluster was initialized with RELSEG_SIZE %d, but the server was " @@ -2643,7 +2945,7 @@ msgstr "" "КлаÑтер баз данных был инициализирован Ñ RELSEG_SIZE %d, но Ñервер " "Ñкомпилирован Ñ RELSEG_SIZE %d." -#: access/transam/xlog.c:4110 +#: access/transam/xlog.c:4438 #, c-format msgid "" "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was " @@ -2652,7 +2954,7 @@ msgstr "" "КлаÑтер баз данных был инициализирован Ñ XLOG_BLCKSZ %d, но Ñервер " "Ñкомпилирован Ñ XLOG_BLCKSZ %d." -#: access/transam/xlog.c:4117 +#: access/transam/xlog.c:4446 #, c-format msgid "" "The database cluster was initialized with NAMEDATALEN %d, but the server was " @@ -2661,7 +2963,7 @@ msgstr "" "КлаÑтер баз данных был инициализирован Ñ NAMEDATALEN %d, но Ñервер " "Ñкомпилирован Ñ NAMEDATALEN %d." -#: access/transam/xlog.c:4124 +#: access/transam/xlog.c:4454 #, c-format msgid "" "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server " @@ -2670,7 +2972,7 @@ msgstr "" "КлаÑтер баз данных был инициализирован Ñ INDEX_MAX_KEYS %d, но Ñервер " "Ñкомпилирован Ñ INDEX_MAX_KEYS %d." -#: access/transam/xlog.c:4131 +#: access/transam/xlog.c:4462 #, c-format msgid "" "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the " @@ -2679,7 +2981,7 @@ msgstr "" "КлаÑтер баз данных был инициализирован Ñ TOAST_MAX_CHUNK_SIZE %d, но Ñервер " "Ñкомпилирован Ñ TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlog.c:4138 +#: access/transam/xlog.c:4470 #, c-format msgid "" "The database cluster was initialized with LOBLKSIZE %d, but the server was " @@ -2688,7 +2990,7 @@ msgstr "" "КлаÑтер баз данных был инициализирован Ñ LOBLKSIZE %d, но Ñервер " "Ñкомпилирован Ñ LOBLKSIZE %d." -#: access/transam/xlog.c:4147 +#: access/transam/xlog.c:4480 #, c-format msgid "" "The database cluster was initialized without USE_FLOAT8_BYVAL but the server " @@ -2697,7 +2999,7 @@ msgstr "" "КлаÑтер баз данных был инициализирован без USE_FLOAT8_BYVAL, но Ñервер " "Ñкомпилирован Ñ USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4154 +#: access/transam/xlog.c:4488 #, c-format msgid "" "The database cluster was initialized with USE_FLOAT8_BYVAL but the server " @@ -2706,94 +3008,100 @@ msgstr "" "КлаÑтер баз данных был инициализирован Ñ USE_FLOAT8_BYVAL, но Ñервер был " "Ñкомпилирован без USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4163 +#: access/transam/xlog.c:4497 #, c-format -msgid "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the " -"control file specifies %d byte" -msgid_plural "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the " -"control file specifies %d bytes" -msgstr[0] "" -"размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 " -"ГБ, но в управлÑющем файле указано значение: %d" -msgstr[1] "" -"размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 " -"ГБ, но в управлÑющем файле указано значение: %d" -msgstr[2] "" -"размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 " -"ГБ, но в управлÑющем файле указано значение: %d" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "управлÑющий файл Ñодержит неверный размер Ñегмента WAL (%d Б)" +msgstr[1] "управлÑющий файл Ñодержит неверный размер Ñегмента WAL (%d Б)" +msgstr[2] "управлÑющий файл Ñодержит неверный размер Ñегмента WAL (%d Б)" -#: access/transam/xlog.c:4175 +#: access/transam/xlog.c:4510 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"min_wal_size\" должен быть минимум вдвое больше \"wal_segment_size\"" -#: access/transam/xlog.c:4179 +#: access/transam/xlog.c:4514 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"max_wal_size\" должен быть минимум вдвое больше \"wal_segment_size\"" -#: access/transam/xlog.c:4620 +#: access/transam/xlog.c:4662 catalog/namespace.c:4696 +#: commands/tablespace.c:1210 commands/user.c:2529 commands/variable.c:72 +#: replication/slot.c:2446 tcop/postgres.c:3715 utils/error/elog.c:2247 +#, c-format +msgid "List syntax is invalid." +msgstr "Ошибка ÑинтакÑиÑа в ÑпиÑке." + +#: access/transam/xlog.c:4708 commands/user.c:2545 commands/variable.c:173 +#: tcop/postgres.c:3731 utils/error/elog.c:2273 +#, c-format +msgid "Unrecognized key word: \"%s\"." +msgstr "нераÑпознанное ключевое Ñлово: \"%s\"." + +#: access/transam/xlog.c:5129 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "не удалоÑÑŒ запиÑать начальный файл журнала предзапиÑи: %m" -#: access/transam/xlog.c:4628 +#: access/transam/xlog.c:5137 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "не удалоÑÑŒ ÑброÑить на диÑк начальный файл журнала предзапиÑи: %m" -#: access/transam/xlog.c:4634 +#: access/transam/xlog.c:5143 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "не удалоÑÑŒ закрыть начальный файл журнала предзапиÑи: %m" -#: access/transam/xlog.c:4852 +#: access/transam/xlog.c:5368 #, c-format -msgid "WAL was generated with wal_level=minimal, cannot continue recovering" +msgid "" +"WAL was generated with \"wal_level=minimal\", cannot continue recovering" msgstr "" -"WAL был Ñоздан Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ wal_level=minimal, продолжение воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ " -"невозможно" +"WAL был Ñоздан Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ \"wal_level=minimal\", продолжение " +"воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾" -#: access/transam/xlog.c:4853 +#: access/transam/xlog.c:5369 #, c-format -msgid "This happens if you temporarily set wal_level=minimal on the server." -msgstr "Это проиÑходит, еÑли вы на Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтанавливали wal_level=minimal." +msgid "" +"This happens if you temporarily set \"wal_level=minimal\" on the server." +msgstr "Это проиÑходит, еÑли вы на Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтанавливали \"wal_level=minimal\"." -#: access/transam/xlog.c:4854 +#: access/transam/xlog.c:5370 #, c-format -msgid "Use a backup taken after setting wal_level to higher than minimal." +msgid "" +"Use a backup taken after setting \"wal_level\" to higher than \"minimal\"." msgstr "" -"ИÑпользуйте резервную копию, Ñделанную поÑле Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ wal_level на любой " -"уровень выше minimal." +"ИÑпользуйте резервную копию, Ñделанную поÑле Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ \"wal_level\" на " +"любой уровень выше \"minimal\"." -#: access/transam/xlog.c:4918 +#: access/transam/xlog.c:5435 #, c-format msgid "control file contains invalid checkpoint location" msgstr "файл pg_control Ñодержит неправильную позицию контрольной точки" -#: access/transam/xlog.c:4929 +#: access/transam/xlog.c:5446 #, c-format msgid "database system was shut down at %s" msgstr "ÑиÑтема БД была выключена: %s" -#: access/transam/xlog.c:4935 +#: access/transam/xlog.c:5452 #, c-format msgid "database system was shut down in recovery at %s" msgstr "ÑиÑтема БД была выключена в процеÑÑе воÑÑтановлениÑ: %s" -#: access/transam/xlog.c:4941 +#: access/transam/xlog.c:5458 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "выключение ÑиÑтемы БД было прервано; поÑледний момент работы: %s" -#: access/transam/xlog.c:4947 +#: access/transam/xlog.c:5464 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "работа ÑиÑтемы БД была прервана во Ð²Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑÑтановлениÑ: %s" -#: access/transam/xlog.c:4949 +#: access/transam/xlog.c:5466 #, c-format msgid "" "This probably means that some data is corrupted and you will have to use the " @@ -2802,14 +3110,14 @@ msgstr "" "Это Ñкорее вÑего означает, что некоторые данные повреждены и вам придётÑÑ " "воÑÑтановить БД из поÑледней резервной копии." -#: access/transam/xlog.c:4955 +#: access/transam/xlog.c:5472 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "" "работа ÑиÑтемы БД была прервана в процеÑÑе воÑÑтановлениÑ, Ð²Ñ€ÐµÐ¼Ñ Ð² журнале: " "%s" -#: access/transam/xlog.c:4957 +#: access/transam/xlog.c:5474 #, c-format msgid "" "If this has occurred more than once some data might be corrupted and you " @@ -2818,22 +3126,22 @@ msgstr "" "ЕÑли Ñто проиÑходит поÑтоÑнно, возможно, какие-то данные были иÑпорчены и " "Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñтоит выбрать более раннюю точку." -#: access/transam/xlog.c:4963 +#: access/transam/xlog.c:5480 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "работа ÑиÑтемы БД была прервана; поÑледний момент работы: %s" -#: access/transam/xlog.c:4969 +#: access/transam/xlog.c:5487 #, c-format msgid "control file contains invalid database cluster state" msgstr "файл pg_control Ñодержит неверный код ÑоÑтоÑÐ½Ð¸Ñ ÐºÐ»Ð°Ñтера" -#: access/transam/xlog.c:5353 +#: access/transam/xlog.c:5875 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL закончилÑÑ Ð±ÐµÐ· признака Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ" -#: access/transam/xlog.c:5354 +#: access/transam/xlog.c:5876 #, c-format msgid "" "All WAL generated while online backup was taken must be available at " @@ -2842,67 +3150,69 @@ msgstr "" "Ð’Ñе журналы WAL, Ñозданные во Ð²Ñ€ÐµÐ¼Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"на ходу\", " "должны быть в наличии Ð´Ð»Ñ Ð²Ð¾ÑÑтановлениÑ." -#: access/transam/xlog.c:5357 +#: access/transam/xlog.c:5880 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL закончилÑÑ Ð´Ð¾ ÑоглаÑованной точки воÑÑтановлениÑ" -#: access/transam/xlog.c:5405 +#: access/transam/xlog.c:5926 #, c-format msgid "selected new timeline ID: %u" msgstr "выбранный ID новой линии времени: %u" -#: access/transam/xlog.c:5438 +#: access/transam/xlog.c:5959 #, c-format msgid "archive recovery complete" msgstr "воÑÑтановление архива завершено" -#: access/transam/xlog.c:6040 +#: access/transam/xlog.c:6612 #, c-format msgid "shutting down" msgstr "выключение" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6079 +#: access/transam/xlog.c:6651 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "начата точка перезапуÑка:%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6091 +#: access/transam/xlog.c:6663 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "начата ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ°:%s%s%s%s%s%s%s%s" # well-spelled: Ñинхр -#: access/transam/xlog.c:6151 +#: access/transam/xlog.c:6728 #, c-format msgid "" "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d " "removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; " "sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, " -"estimate=%d kB" +"estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "" "точка перезапуÑка завершена: запиÑано буферов: %d (%.1f%%); добавлено файлов " "WAL %d, удалено: %d, переработано: %d; запиÑÑŒ=%ld.%03d Ñек., Ñинхр.=%ld.%03d " "Ñек., вÑего=%ld.%03d Ñек.; Ñинхронизировано_файлов=%d, ÑамаÑ_долгаÑ_Ñинхр." -"=%ld.%03d Ñек., ÑреднÑÑ=%ld.%03d Ñек.; раÑÑтоÑние=%d kB, ожидалоÑÑŒ=%d kB" +"=%ld.%03d Ñек., ÑреднÑÑ=%ld.%03d Ñек.; раÑÑтоÑние=%d kB, ожидалоÑÑŒ=%d kB; " +"lsn=%X/%X, lsn redo=%X/%X" # well-spelled: Ñинхр -#: access/transam/xlog.c:6171 +#: access/transam/xlog.c:6751 #, c-format msgid "" "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d " "removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; " "sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, " -"estimate=%d kB" +"estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" msgstr "" "ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° завершена: запиÑано буферов: %d (%.1f%%); добавлено файлов " "WAL %d, удалено: %d, переработано: %d; запиÑÑŒ=%ld.%03d Ñек., Ñинхр.=%ld.%03d " "Ñек., вÑего=%ld.%03d Ñек.; Ñинхронизировано_файлов=%d, ÑамаÑ_долгаÑ_Ñинхр." -"=%ld.%03d Ñек., ÑреднÑÑ=%ld.%03d Ñек.; раÑÑтоÑние=%d kB, ожидалоÑÑŒ=%d kB" +"=%ld.%03d Ñек., ÑреднÑÑ=%ld.%03d Ñек.; раÑÑтоÑние=%d kB, ожидалоÑÑŒ=%d kB; " +"lsn=%X/%X, lsn redo=%X/%X" -#: access/transam/xlog.c:6606 +#: access/transam/xlog.c:7233 #, c-format msgid "" "concurrent write-ahead log activity while database system is shutting down" @@ -2910,120 +3220,119 @@ msgstr "" "во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑиÑтемы баз данных отмечена активноÑть в журнале " "предзапиÑи" -#: access/transam/xlog.c:7163 +#: access/transam/xlog.c:7818 #, c-format msgid "recovery restart point at %X/%X" -msgstr "точка перезапуÑка воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñмещению %X/%X" +msgstr "точка перезапуÑка воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð² позиции %X/%X" -#: access/transam/xlog.c:7165 +#: access/transam/xlog.c:7820 #, c-format msgid "Last completed transaction was at log time %s." msgstr "ПоÑледнÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð±Ñ‹Ð»Ð° выполнена в %s." -#: access/transam/xlog.c:7412 +#: access/transam/xlog.c:8082 #, c-format msgid "restore point \"%s\" created at %X/%X" -msgstr "точка воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" Ñоздана по Ñмещению %X/%X" +msgstr "точка воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" Ñоздана в позиции %X/%X" -#: access/transam/xlog.c:7619 +#: access/transam/xlog.c:8289 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "" "резервное копирование \"на ходу\" было отменено, продолжить воÑÑтановление " "нельзÑ" -#: access/transam/xlog.c:7676 +#: access/transam/xlog.c:8347 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "" "неожиданный ID линии времени %u (должен быть %u) в запиÑи точки выключениÑ" -#: access/transam/xlog.c:7734 +#: access/transam/xlog.c:8405 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "" "неожиданный ID линии времени %u (должен быть %u) в запиÑи точки активноÑти" -#: access/transam/xlog.c:7763 +#: access/transam/xlog.c:8434 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "" "неожиданный ID линии времени %u (должен быть %u) в запиÑи конец-" "воÑÑтановлениÑ" -#: access/transam/xlog.c:8021 +#: access/transam/xlog.c:8705 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл Ñквозной запиÑи %s: %m" -#: access/transam/xlog.c:8027 +#: access/transam/xlog.c:8710 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ данные (fdatasync) файла \"%s\": %m" -#: access/transam/xlog.c:8122 access/transam/xlog.c:8489 +#: access/transam/xlog.c:8797 access/transam/xlog.c:9133 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "" "Выбранный уровень WAL недоÑтаточен Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"на ходу\"" -#: access/transam/xlog.c:8123 access/transam/xlog.c:8490 -#: access/transam/xlogfuncs.c:199 +#: access/transam/xlog.c:8798 access/transam/xlogfuncs.c:248 #, c-format -msgid "wal_level must be set to \"replica\" or \"logical\" at server start." -msgstr "УÑтановите wal_level \"replica\" или \"logical\" при запуÑке Ñервера." +msgid "" +"\"wal_level\" must be set to \"replica\" or \"logical\" at server start." +msgstr "" +"Параметр \"wal_level\" должен иметь значение \"replica\" или \"logical\" при " +"запуÑке Ñервера." -#: access/transam/xlog.c:8128 +#: access/transam/xlog.c:8803 #, c-format msgid "backup label too long (max %d bytes)" msgstr "длина метки резервной копии превышает предел (%d байт)" -#: access/transam/xlog.c:8244 +#: access/transam/xlog.c:8924 #, c-format msgid "" -"WAL generated with full_page_writes=off was replayed since last restartpoint" +"WAL generated with \"full_page_writes=off\" was replayed since last " +"restartpoint" msgstr "" -"ПоÑле поÑледней точки перезапуÑка был воÑпроизведён WAL, Ñозданный в режиме " -"full_page_writes=off." +"поÑле поÑледней точки перезапуÑка был воÑпроизведён WAL, Ñозданный в режиме " +"\"full_page_writes=off\"" -#: access/transam/xlog.c:8246 access/transam/xlog.c:8602 +#: access/transam/xlog.c:8926 access/transam/xlog.c:9222 #, c-format msgid "" "This means that the backup being taken on the standby is corrupt and should " -"not be used. Enable full_page_writes and run CHECKPOINT on the primary, and " -"then try an online backup again." +"not be used. Enable \"full_page_writes\" and run CHECKPOINT on the primary, " +"and then try an online backup again." msgstr "" -"Это означает, что Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ, ÑÐ´ÐµÐ»Ð°Ð½Ð½Ð°Ñ Ð½Ð° дежурном Ñервере, иÑпорчена " -"и иÑпользовать её не Ñледует. Включите режим full_page_writes и выполните " +"Это означает, что Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ, ÑÐ´ÐµÐ»Ð°Ð½Ð½Ð°Ñ Ð½Ð° ведомом Ñервере, иÑпорчена и " +"иÑпользовать её не Ñледует. Включите режим \"full_page_writes\" и выполните " "CHECKPOINT на ведущем Ñервере, а затем попробуйте резервное копирование \"на " "ходу\" ещё раз." -#: access/transam/xlog.c:8326 backup/basebackup.c:1345 utils/adt/misc.c:347 +#: access/transam/xlog.c:9006 backup/basebackup.c:1417 utils/adt/misc.c:354 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "целевой путь ÑимволичеÑкой ÑÑылки \"%s\" Ñлишком длинный" +msgid "could not read symbolic link \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m" -#: access/transam/xlog.c:8376 backup/basebackup.c:1360 -#: commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 +#: access/transam/xlog.c:9013 backup/basebackup.c:1422 utils/adt/misc.c:359 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "табличные проÑтранÑтва не поддерживаютÑÑ Ð½Ð° Ñтой платформе" +msgid "symbolic link \"%s\" target is too long" +msgstr "целевой путь ÑимволичеÑкой ÑÑылки \"%s\" Ñлишком длинный" -#: access/transam/xlog.c:8535 access/transam/xlog.c:8548 -#: access/transam/xlogrecovery.c:1192 access/transam/xlogrecovery.c:1199 -#: access/transam/xlogrecovery.c:1258 access/transam/xlogrecovery.c:1338 -#: access/transam/xlogrecovery.c:1362 +#: access/transam/xlog.c:9134 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "неверные данные в файле \"%s\"" +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "УÑтановите wal_level \"replica\" или \"logical\" при запуÑке Ñервера." -#: access/transam/xlog.c:8552 backup/basebackup.c:1200 +#: access/transam/xlog.c:9172 backup/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "" -"дежурный Ñервер был повышен в процеÑÑе резервного ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"на ходу\"" +"ведомый Ñервер был повышен в процеÑÑе резервного ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"на ходу\"" -#: access/transam/xlog.c:8553 backup/basebackup.c:1201 +#: access/transam/xlog.c:9173 backup/basebackup.c:1282 #, c-format msgid "" "This means that the backup being taken is corrupt and should not be used. " @@ -3032,21 +3341,21 @@ msgstr "" "Это означает, что ÑÐ¾Ð·Ð´Ð°Ð²Ð°ÐµÐ¼Ð°Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð¸Ñпорчена и иÑпользовать её не " "Ñледует. Попробуйте резервное копирование \"на ходу\" ещё раз." -#: access/transam/xlog.c:8600 +#: access/transam/xlog.c:9220 #, c-format msgid "" -"WAL generated with full_page_writes=off was replayed during online backup" +"WAL generated with \"full_page_writes=off\" was replayed during online backup" msgstr "" -"Ð’ процеÑÑе резервного ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"на ходу\" был воÑпроизведён WAL, " -"Ñозданный в режиме full_page_writes=off" +"в процеÑÑе резервного ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"на ходу\" был воÑпроизведён WAL, " +"Ñозданный в режиме \"full_page_writes=off\"" -#: access/transam/xlog.c:8725 +#: access/transam/xlog.c:9336 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "" "базовое копирование выполнено, ожидаетÑÑ Ð°Ñ€Ñ…Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð½ÑƒÐ¶Ð½Ñ‹Ñ… Ñегментов WAL" -#: access/transam/xlog.c:8739 +#: access/transam/xlog.c:9350 #, c-format msgid "" "still waiting for all required WAL segments to be archived (%d seconds " @@ -3054,23 +3363,23 @@ msgid "" msgstr "" "продолжаетÑÑ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ðµ архивации вÑех нужных Ñегментов WAL (прошло %d Ñек.)" -#: access/transam/xlog.c:8741 +#: access/transam/xlog.c:9352 #, c-format msgid "" -"Check that your archive_command is executing properly. You can safely " +"Check that your \"archive_command\" is executing properly. You can safely " "cancel this backup, but the database backup will not be usable without all " "the WAL segments." msgstr "" -"Проверьте, правильно ли работает команда archive_command. Операцию " +"Проверьте, правильно ли работает команда \"archive_command\". Операцию " "ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ отменить безопаÑно, но Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð±Ð°Ð·Ñ‹ будет " "непригодна без вÑех Ñегментов WAL." -#: access/transam/xlog.c:8748 +#: access/transam/xlog.c:9359 #, c-format msgid "all required WAL segments have been archived" msgstr "вÑе нужные Ñегменты WAL заархивированы" -#: access/transam/xlog.c:8752 +#: access/transam/xlog.c:9363 #, c-format msgid "" "WAL archiving is not enabled; you must ensure that all required WAL segments " @@ -3079,31 +3388,31 @@ msgstr "" "Ð°Ñ€Ñ…Ð¸Ð²Ð°Ñ†Ð¸Ñ WAL не наÑтроена; вы должны обеÑпечить копирование вÑех требуемых " "Ñегментов WAL другими ÑредÑтвами Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð¹ копии" -#: access/transam/xlog.c:8801 +#: access/transam/xlog.c:9402 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "" "прерывание резервного ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·-за Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¾Ð±Ñлуживающего процеÑÑа " "до вызова pg_backup_stop" -#: access/transam/xlogarchive.c:208 +#: access/transam/xlogarchive.c:213 #, c-format msgid "archive file \"%s\" has wrong size: %lld instead of %lld" msgstr "файл архива \"%s\" имеет неправильный размер: %lld вмеÑто %lld" -#: access/transam/xlogarchive.c:217 +#: access/transam/xlogarchive.c:222 #, c-format msgid "restored log file \"%s\" from archive" msgstr "файл журнала \"%s\" воÑÑтановлен из архива" -#: access/transam/xlogarchive.c:231 +#: access/transam/xlogarchive.c:236 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." +msgid "\"restore_command\" returned a zero exit status, but stat() failed." msgstr "" -"Команда restore_command возвратила нулевой код ÑоÑтоÑниÑ, но stat() выдала " -"ошибку." +"Команда \"restore_command\" возвратила нулевой код ÑоÑтоÑниÑ, но stat() " +"выдала ошибку." -#: access/transam/xlogarchive.c:263 +#: access/transam/xlogarchive.c:268 #, c-format msgid "could not restore file \"%s\" from archive: %s" msgstr "воÑÑтановить файл \"%s\" из архива не удалоÑÑŒ: %s" @@ -3111,96 +3420,120 @@ msgstr "воÑÑтановить файл \"%s\" из архива не удал #. translator: First %s represents a postgresql.conf parameter name like #. "recovery_end_command", the 2nd is the value of that parameter, the #. third an already translated error message. -#: access/transam/xlogarchive.c:376 +#: access/transam/xlogarchive.c:346 #, c-format msgid "%s \"%s\": %s" msgstr "%s \"%s\": %s" -#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:566 +#: access/transam/xlogarchive.c:456 access/transam/xlogarchive.c:536 #, c-format msgid "could not create archive status file \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать файл ÑоÑтоÑÐ½Ð¸Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð° \"%s\": %m" -#: access/transam/xlogarchive.c:494 access/transam/xlogarchive.c:574 +#: access/transam/xlogarchive.c:464 access/transam/xlogarchive.c:544 #, c-format msgid "could not write archive status file \"%s\": %m" msgstr "не удалоÑÑŒ запиÑать файл ÑоÑтоÑÐ½Ð¸Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð° \"%s\": %m" -#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 +#: access/transam/xlogfuncs.c:69 backup/basebackup.c:997 #, c-format msgid "a backup is already in progress in this session" msgstr "резервное копирование уже выполнÑетÑÑ Ð² Ñтом ÑеанÑе" -#: access/transam/xlogfuncs.c:126 +#: access/transam/xlogfuncs.c:140 #, c-format msgid "backup is not in progress" msgstr "резервное копирование не выполнÑетÑÑ" -#: access/transam/xlogfuncs.c:127 +#: access/transam/xlogfuncs.c:141 #, c-format msgid "Did you call pg_backup_start()?" msgstr "Ð’Ñ‹ вызывали pg_backup_start()?" -#: access/transam/xlogfuncs.c:166 access/transam/xlogfuncs.c:193 -#: access/transam/xlogfuncs.c:232 access/transam/xlogfuncs.c:253 -#: access/transam/xlogfuncs.c:274 +#: access/transam/xlogfuncs.c:184 access/transam/xlogfuncs.c:242 +#: access/transam/xlogfuncs.c:281 access/transam/xlogfuncs.c:302 +#: access/transam/xlogfuncs.c:323 #, c-format msgid "WAL control functions cannot be executed during recovery." msgstr "Функции ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ WAL Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в процеÑÑе воÑÑтановлениÑ." -#: access/transam/xlogfuncs.c:198 +#: access/transam/xlogfuncs.c:209 access/transam/xlogfuncs.c:389 +#: access/transam/xlogfuncs.c:447 #, c-format -msgid "WAL level not sufficient for creating a restore point" -msgstr "Выбранный уровень WAL не доÑтаточен Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ воÑÑтановлениÑ" - +msgid "%s cannot be executed during recovery." +msgstr "выполнить %s во Ð²Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ." + +#: access/transam/xlogfuncs.c:215 +#, c-format +msgid "" +"pg_log_standby_snapshot() can only be used if \"wal_level\" >= \"replica\"" +msgstr "" +"pg_log_standby_snapshot() можно иÑпользовать, только еÑли \"wal_level\" >= " +"\"replica\"" + +#: access/transam/xlogfuncs.c:247 +#, c-format +msgid "WAL level not sufficient for creating a restore point" +msgstr "Выбранный уровень WAL не доÑтаточен Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ воÑÑтановлениÑ" + # well-spelled: Ñимв -#: access/transam/xlogfuncs.c:206 +#: access/transam/xlogfuncs.c:255 #, c-format msgid "value too long for restore point (maximum %d characters)" msgstr "значение Ð´Ð»Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ²Ñ‹ÑˆÐ°ÐµÑ‚ предел (%d Ñимв.)" -#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 +#: access/transam/xlogfuncs.c:486 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "выполнить %s во Ð²Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ." +msgid "invalid WAL file name \"%s\"" +msgstr "неправильное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° WAL \"%s\"" -#: access/transam/xlogfuncs.c:424 access/transam/xlogfuncs.c:454 -#: access/transam/xlogfuncs.c:478 access/transam/xlogfuncs.c:501 -#: access/transam/xlogfuncs.c:581 +#: access/transam/xlogfuncs.c:522 access/transam/xlogfuncs.c:552 +#: access/transam/xlogfuncs.c:576 access/transam/xlogfuncs.c:599 +#: access/transam/xlogfuncs.c:679 #, c-format msgid "recovery is not in progress" msgstr "воÑÑтановление не выполнÑетÑÑ" -#: access/transam/xlogfuncs.c:425 access/transam/xlogfuncs.c:455 -#: access/transam/xlogfuncs.c:479 access/transam/xlogfuncs.c:502 -#: access/transam/xlogfuncs.c:582 +#: access/transam/xlogfuncs.c:523 access/transam/xlogfuncs.c:553 +#: access/transam/xlogfuncs.c:577 access/transam/xlogfuncs.c:600 +#: access/transam/xlogfuncs.c:680 #, c-format msgid "Recovery control functions can only be executed during recovery." msgstr "" "Функции ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¾ÑÑтановлением можно иÑпользовать только в процеÑÑе " "воÑÑтановлениÑ." -#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 +#: access/transam/xlogfuncs.c:528 access/transam/xlogfuncs.c:558 #, c-format msgid "standby promotion is ongoing" msgstr "производитÑÑ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ðµ ведомого" -#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 +#: access/transam/xlogfuncs.c:529 access/transam/xlogfuncs.c:559 #, c-format msgid "%s cannot be executed after promotion is triggered." msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñть, когда производитÑÑ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ðµ." -#: access/transam/xlogfuncs.c:587 +#: access/transam/xlogfuncs.c:685 #, c-format msgid "\"wait_seconds\" must not be negative or zero" msgstr "значение \"wait_seconds\" не должно быть отрицательным или нулевым" -#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:252 +#: access/transam/xlogfuncs.c:707 storage/ipc/signalfuncs.c:265 #, c-format msgid "failed to send signal to postmaster: %m" msgstr "отправить Ñигнал процеÑÑу postmaster не удалоÑÑŒ: %m" -#: access/transam/xlogfuncs.c:643 +#: access/transam/xlogfuncs.c:739 libpq/be-secure.c:237 libpq/be-secure.c:346 +#, c-format +msgid "terminating connection due to unexpected postmaster exit" +msgstr "закрытие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·-за неожиданного Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ процеÑÑа" + +#: access/transam/xlogfuncs.c:740 +#, c-format +msgid "while waiting on promotion" +msgstr "в процеÑÑе Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ" + +#: access/transam/xlogfuncs.c:744 #, c-format msgid "server did not promote within %d second" msgid_plural "server did not promote within %d seconds" @@ -3208,82 +3541,72 @@ msgstr[0] "повышение Ñервера не завершилоÑÑŒ за %d msgstr[1] "повышение Ñервера не завершилоÑÑŒ за %d Ñекунды" msgstr[2] "повышение Ñервера не завершилоÑÑŒ за %d Ñекунд" -#: access/transam/xlogprefetcher.c:1090 +#: access/transam/xlogprefetcher.c:1088 #, c-format msgid "" -"recovery_prefetch is not supported on platforms that lack posix_fadvise()." +"\"recovery_prefetch\" is not supported on platforms that lack " +"posix_fadvise()." msgstr "" -"recovery_prefetch не поддерживаетÑÑ Ð½Ð° платформах, где отÑутÑтвует " +"\"recovery_prefetch\" не поддерживаетÑÑ Ð½Ð° платформах, где отÑутÑтвует " "posix_fadvise()." -#: access/transam/xlogreader.c:625 +#: access/transam/xlogreader.c:619 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "неверное Ñмещение запиÑи: %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "" +"неверное Ñмещение запиÑи в позиции %X/%X: ожидалоÑÑŒ минимум %u, получено %u" -#: access/transam/xlogreader.c:633 +#: access/transam/xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" -msgstr "по Ñмещению %X/%X запрошено продолжение запиÑи" - -#: access/transam/xlogreader.c:674 access/transam/xlogreader.c:1121 -#, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° запиÑи по Ñмещению %X/%X: ожидалоÑÑŒ %u, получено %u" - -#: access/transam/xlogreader.c:703 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "не удалоÑÑŒ выделить памÑть Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи длины %u" +msgstr "в позиции %X/%X запрошено продолжение запиÑи" -#: access/transam/xlogreader.c:725 +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "длина запиÑи %u по Ñмещению %X/%X Ñлишком велика" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "" +"Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° запиÑи в позиции %X/%X: ожидалоÑÑŒ минимум %u, получено %u" -#: access/transam/xlogreader.c:774 +#: access/transam/xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "нет флага contrecord в позиции %X/%X" -#: access/transam/xlogreader.c:787 +#: access/transam/xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° contrecord: %u (ожидалаÑÑŒ %lld) в позиции %X/%X" -#: access/transam/xlogreader.c:922 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "нет запиÑи contrecord в %X/%X" - -#: access/transam/xlogreader.c:1129 +#: access/transam/xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" -msgstr "неверный ID менеджера реÑурÑов %u по Ñмещению %X/%X" +msgstr "неверный ID менеджера реÑурÑов %u в позиции %X/%X" -#: access/transam/xlogreader.c:1142 access/transam/xlogreader.c:1158 +#: access/transam/xlogreader.c:1155 access/transam/xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "запиÑÑŒ Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ ÑÑылкой назад %X/%X по Ñмещению %X/%X" +msgstr "запиÑÑŒ Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ ÑÑылкой назад %X/%X в позиции %X/%X" -#: access/transam/xlogreader.c:1194 +#: access/transam/xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" -"Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма данных менеджера реÑурÑов в запиÑи по " -"Ñмещению %X/%X" +"Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма данных менеджера реÑурÑов в запиÑи в позиции " +"%X/%X" -#: access/transam/xlogreader.c:1231 +#: access/transam/xlogreader.c:1243 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "неверное магичеÑкое чиÑло %04X в Ñегменте журнала %s, Ñмещение %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "" +"неверное магичеÑкое чиÑло %04X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u" -#: access/transam/xlogreader.c:1245 access/transam/xlogreader.c:1286 +#: access/transam/xlogreader.c:1258 access/transam/xlogreader.c:1300 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "неверные информационные биты %04X в Ñегменте журнала %s, Ñмещение %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "" +"неверные информационные биты %04X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u" -#: access/transam/xlogreader.c:1260 +#: access/transam/xlogreader.c:1274 #, c-format msgid "" "WAL file is from different database system: WAL file database system " @@ -3292,7 +3615,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: в нём указан идентификатор ÑиÑтемы БД " "%llu, а идентификатор ÑиÑтемы pg_control: %llu" -#: access/transam/xlogreader.c:1268 +#: access/transam/xlogreader.c:1282 #, c-format msgid "" "WAL file is from different database system: incorrect segment size in page " @@ -3301,7 +3624,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный размер Ñегмента в заголовке " "Ñтраницы" -#: access/transam/xlogreader.c:1274 +#: access/transam/xlogreader.c:1288 #, c-format msgid "" "WAL file is from different database system: incorrect XLOG_BLCKSZ in page " @@ -3310,35 +3633,37 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке " "Ñтраницы" -#: access/transam/xlogreader.c:1305 +#: access/transam/xlogreader.c:1320 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "неожиданный pageaddr %X/%X в Ñегменте журнала %s, Ñмещение %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "неожиданный pageaddr %X/%X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u" -#: access/transam/xlogreader.c:1330 +#: access/transam/xlogreader.c:1346 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" +msgid "" +"out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, " +"offset %u" msgstr "" -"нарушение поÑледовательноÑти ID линии времени %u (поÑле %u) в Ñегменте " -"журнала %s, Ñмещение %u" +"нарушение поÑледовательноÑти ID линии времени %u (поÑле %u) в Ñегменте WAL " +"%s, LSN %X/%X, Ñмещение %u" -#: access/transam/xlogreader.c:1735 +#: access/transam/xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порÑдку в позиции %X/%X" -#: access/transam/xlogreader.c:1759 +#: access/transam/xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA уÑтановлен, но данных в позиции %X/%X нет" -#: access/transam/xlogreader.c:1766 +#: access/transam/xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "" "BKPBLOCK_HAS_DATA не уÑтановлен, но длина данных равна %u в позиции %X/%X" -#: access/transam/xlogreader.c:1802 +#: access/transam/xlogreader.c:1816 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -3347,21 +3672,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE уÑтановлен, но Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑка заданы Ñмещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: access/transam/xlogreader.c:1818 +#: access/transam/xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "" "BKPIMAGE_HAS_HOLE не уÑтановлен, но Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑка заданы Ñмещение %u и длина " "%u в позиции %X/%X" -#: access/transam/xlogreader.c:1832 +#: access/transam/xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "" "BKPIMAGE_COMPRESSED уÑтановлен, но длина образа блока равна %u в позиции %X/" "%X" -#: access/transam/xlogreader.c:1847 +#: access/transam/xlogreader.c:1861 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " @@ -3370,41 +3695,41 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не уÑтановлены, но длина образа " "блока равна %u в позиции %X/%X" -#: access/transam/xlogreader.c:1863 +#: access/transam/xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" "BKPBLOCK_SAME_REL уÑтановлен, но предыдущее значение не задано в позиции %X/" "%X" -#: access/transam/xlogreader.c:1875 +#: access/transam/xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: access/transam/xlogreader.c:1942 +#: access/transam/xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "запиÑÑŒ Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ длиной в позиции %X/%X" -#: access/transam/xlogreader.c:1967 +#: access/transam/xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "не удалоÑÑŒ найти копию блока Ñ ID %d в запиÑи журнала WAL" -#: access/transam/xlogreader.c:2051 +#: access/transam/xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "" "не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ неверным блоком %d" -#: access/transam/xlogreader.c:2058 +#: access/transam/xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "" "не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¼ ÑоÑтоÑнием, блок %d" -#: access/transam/xlogreader.c:2085 access/transam/xlogreader.c:2102 +#: access/transam/xlogreader.c:2100 access/transam/xlogreader.c:2117 #, c-format msgid "" "could not restore image at %X/%X compressed with %s not supported by build, " @@ -3413,7 +3738,7 @@ msgstr "" "не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X, Ñжатый методом %s, который не " "поддерживаетÑÑ Ñтой Ñборкой, блок %d" -#: access/transam/xlogreader.c:2111 +#: access/transam/xlogreader.c:2126 #, c-format msgid "" "could not restore image at %X/%X compressed with unknown method, block %d" @@ -3421,105 +3746,122 @@ msgstr "" "не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X, Ñжатый неизвеÑтным методом, " "блок %d" -#: access/transam/xlogreader.c:2119 +#: access/transam/xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "не удалоÑÑŒ развернуть образ в позиции %X/%X, блок %d" -#: access/transam/xlogrecovery.c:526 -#, c-format -msgid "entering standby mode" -msgstr "переход в режим резервного Ñервера" - -#: access/transam/xlogrecovery.c:529 -#, c-format -msgid "starting point-in-time recovery to XID %u" -msgstr "начинаетÑÑ Ð²Ð¾ÑÑтановление точки во времени до XID %u" - -#: access/transam/xlogrecovery.c:533 -#, c-format -msgid "starting point-in-time recovery to %s" -msgstr "начинаетÑÑ Ð²Ð¾ÑÑтановление точки во времени до %s" - -#: access/transam/xlogrecovery.c:537 +#: access/transam/xlogrecovery.c:617 #, c-format -msgid "starting point-in-time recovery to \"%s\"" -msgstr "начинаетÑÑ Ð²Ð¾ÑÑтановление точки во времени до \"%s\"" - -#: access/transam/xlogrecovery.c:541 -#, c-format -msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgid "" +"starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on " +"timeline ID %u" msgstr "" -"начинаетÑÑ Ð²Ð¾ÑÑтановление точки во времени до позиции в WAL (LSN) \"%X/%X\"" +"начинаетÑÑ Ð²Ð¾ÑÑтановление копии Ñ LSN redo %X/%X, LSN контрольной точки %X/" +"%X, на линии времени %u" -#: access/transam/xlogrecovery.c:545 +#: access/transam/xlogrecovery.c:649 #, c-format -msgid "starting point-in-time recovery to earliest consistent point" +msgid "" +"could not find redo location %X/%X referenced by checkpoint record at %X/%X" msgstr "" -"начинаетÑÑ Ð²Ð¾ÑÑтановление точки во времени до первой точки ÑоглаÑованноÑти" - -#: access/transam/xlogrecovery.c:548 -#, c-format -msgid "starting archive recovery" -msgstr "начинаетÑÑ Ð²Ð¾ÑÑтановление архива" - -#: access/transam/xlogrecovery.c:632 -#, c-format -msgid "could not find redo location referenced by checkpoint record" -msgstr "не удалоÑÑŒ найти положение REDO, указанное запиÑью контрольной точки" +"не удалоÑÑŒ найти положение REDO %X/%X, указанное в запиÑи контрольной точки " +"в %X/%X" -#: access/transam/xlogrecovery.c:633 access/transam/xlogrecovery.c:643 +#: access/transam/xlogrecovery.c:651 access/transam/xlogrecovery.c:662 #, c-format msgid "" -"If you are restoring from a backup, touch \"%s/recovery.signal\" and add " -"required recovery options.\n" +"If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/" +"standby.signal\" and add required recovery options.\n" "If you are not restoring from a backup, try removing the file \"%s/" "backup_label\".\n" "Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if " "restoring from a backup." msgstr "" -"ЕÑли вы воÑÑтанавливаете резервную копию, Ñоздайте \"%s/recovery.signal\" и " -"задайте обÑзательные параметры воÑÑтановлениÑ.\n" +"ЕÑли вы воÑÑтанавливаете резервную копию, Ñоздайте \"%s/recovery.signal\" " +"или \"%s/standby.signal\" и задайте обÑзательные параметры воÑÑтановлениÑ.\n" "Ð’ других ÑлучаÑÑ… попытайтеÑÑŒ удалить файл \"%s/backup_label\".\n" "Будьте оÑторожны: при воÑÑтановлении резервной копии удаление \"%s/" "backup_label\" приведёт к повреждению клаÑтера." -#: access/transam/xlogrecovery.c:642 +#: access/transam/xlogrecovery.c:660 #, c-format -msgid "could not locate required checkpoint record" -msgstr "не удалоÑÑŒ Ñчитать нужную запиÑÑŒ контрольной точки" +msgid "could not locate required checkpoint record at %X/%X" +msgstr "не удалоÑÑŒ найти нужную запиÑÑŒ контрольной точки в %X/%X" -#: access/transam/xlogrecovery.c:671 commands/tablespace.c:685 +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:664 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать ÑимволичеÑкую ÑÑылку \"%s\": %m" -#: access/transam/xlogrecovery.c:703 access/transam/xlogrecovery.c:709 +#: access/transam/xlogrecovery.c:723 access/transam/xlogrecovery.c:729 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "файл \"%s\" игнорируетÑÑ Ð²Ð²Ð¸Ð´Ñƒ отÑутÑÑ‚Ð²Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\"" -#: access/transam/xlogrecovery.c:705 +#: access/transam/xlogrecovery.c:725 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "Файл \"%s\" был переименован в \"%s\"." -#: access/transam/xlogrecovery.c:711 +#: access/transam/xlogrecovery.c:731 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "Ðе удалоÑÑŒ переименовать файл \"%s\" в \"%s\" (%m)." -#: access/transam/xlogrecovery.c:765 +#: access/transam/xlogrecovery.c:770 #, c-format -msgid "could not locate a valid checkpoint record" -msgstr "не удалоÑÑŒ Ñчитать правильную запиÑÑŒ контрольной точки" +msgid "restarting backup recovery with redo LSN %X/%X" +msgstr "перезапуÑк воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¸ Ñ LSN redo %X/%X" -#: access/transam/xlogrecovery.c:789 +#: access/transam/xlogrecovery.c:795 +#, c-format +msgid "could not locate a valid checkpoint record at %X/%X" +msgstr "не удалоÑÑŒ найти корректную запиÑÑŒ контрольной точки в %X/%X" + +#: access/transam/xlogrecovery.c:806 +#, c-format +msgid "entering standby mode" +msgstr "переход в режим резервного Ñервера" + +#: access/transam/xlogrecovery.c:809 +#, c-format +msgid "starting point-in-time recovery to XID %u" +msgstr "начинаетÑÑ Ð²Ð¾ÑÑтановление точки во времени до XID %u" + +#: access/transam/xlogrecovery.c:813 +#, c-format +msgid "starting point-in-time recovery to %s" +msgstr "начинаетÑÑ Ð²Ð¾ÑÑтановление точки во времени до %s" + +#: access/transam/xlogrecovery.c:817 +#, c-format +msgid "starting point-in-time recovery to \"%s\"" +msgstr "начинаетÑÑ Ð²Ð¾ÑÑтановление точки во времени до \"%s\"" + +#: access/transam/xlogrecovery.c:821 +#, c-format +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "" +"начинаетÑÑ Ð²Ð¾ÑÑтановление точки во времени до позиции в WAL (LSN) \"%X/%X\"" + +#: access/transam/xlogrecovery.c:825 +#, c-format +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "" +"начинаетÑÑ Ð²Ð¾ÑÑтановление точки во времени до первой точки ÑоглаÑованноÑти" + +#: access/transam/xlogrecovery.c:828 +#, c-format +msgid "starting archive recovery" +msgstr "начинаетÑÑ Ð²Ð¾ÑÑтановление архива" + +#: access/transam/xlogrecovery.c:849 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "в иÑтории Ñервера нет Ð¾Ñ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð¾Ð¹ линии времени %u" -#: access/transam/xlogrecovery.c:791 +#: access/transam/xlogrecovery.c:851 #, c-format msgid "" "Latest checkpoint is at %X/%X on timeline %u, but in the history of the " @@ -3528,7 +3870,7 @@ msgstr "" "ПоÑледнÑÑ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ°: %X/%X на линии времени %u, но в иÑтории " "запрошенной линии времени Ñервер ответвилÑÑ Ñ Ñтой линии в %X/%X." -#: access/transam/xlogrecovery.c:805 +#: access/transam/xlogrecovery.c:865 #, c-format msgid "" "requested timeline %u does not contain minimum recovery point %X/%X on " @@ -3537,22 +3879,22 @@ msgstr "" "Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u не Ñодержит минимальную точку воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ %X/" "%X на линии времени %u" -#: access/transam/xlogrecovery.c:833 +#: access/transam/xlogrecovery.c:893 #, c-format msgid "invalid next transaction ID" msgstr "неверный ID Ñледующей транзакции" -#: access/transam/xlogrecovery.c:838 +#: access/transam/xlogrecovery.c:898 #, c-format msgid "invalid redo in checkpoint record" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ REDO в контрольной точке" -#: access/transam/xlogrecovery.c:849 +#: access/transam/xlogrecovery.c:909 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ REDO в контрольной точке выключениÑ" -#: access/transam/xlogrecovery.c:878 +#: access/transam/xlogrecovery.c:938 #, c-format msgid "" "database system was not properly shut down; automatic recovery in progress" @@ -3560,19 +3902,19 @@ msgstr "" "ÑиÑтема БД была оÑтановлена нештатно; производитÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкое " "воÑÑтановление" -#: access/transam/xlogrecovery.c:882 +#: access/transam/xlogrecovery.c:942 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "" "воÑÑтановление поÑле ÑÐ±Ð¾Ñ Ð½Ð°Ñ‡Ð¸Ð½Ð°ÐµÑ‚ÑÑ Ð½Ð° линии времени %u, Ñ†ÐµÐ»ÐµÐ²Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ " "времени: %u" -#: access/transam/xlogrecovery.c:925 +#: access/transam/xlogrecovery.c:985 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_label Ñодержит данные, не ÑоглаÑованные Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ pg_control" -#: access/transam/xlogrecovery.c:926 +#: access/transam/xlogrecovery.c:986 #, c-format msgid "" "This means that the backup is corrupted and you will have to use another " @@ -3581,24 +3923,24 @@ msgstr "" "Это означает, что Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð¿Ð¾Ð²Ñ€ÐµÐ¶Ð´ÐµÐ½Ð° и Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð‘Ð” " "придётÑÑ Ð¸Ñпользовать другую копию." -#: access/transam/xlogrecovery.c:980 +#: access/transam/xlogrecovery.c:1040 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "" "иÑпользование файла Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸ÐµÐ¹ воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" не поддерживаетÑÑ" -#: access/transam/xlogrecovery.c:1045 +#: access/transam/xlogrecovery.c:1105 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "" "режим резервного Ñервера не поддерживаетÑÑ Ð¾Ð´Ð½Ð¾Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑким Ñервером" -#: access/transam/xlogrecovery.c:1062 +#: access/transam/xlogrecovery.c:1122 #, c-format -msgid "specified neither primary_conninfo nor restore_command" -msgstr "не указано ни primary_conninfo, ни restore_command" +msgid "specified neither \"primary_conninfo\" nor \"restore_command\"" +msgstr "не указано ни \"primary_conninfo\", ни \"restore_command\"" -#: access/transam/xlogrecovery.c:1063 +#: access/transam/xlogrecovery.c:1123 #, c-format msgid "" "The database server will regularly poll the pg_wal subdirectory to check for " @@ -3607,99 +3949,128 @@ msgstr "" "Сервер БД будет регулÑрно опрашивать подкаталог pg_wal и проверÑть " "ÑодержащиеÑÑ Ð² нём файлы." -#: access/transam/xlogrecovery.c:1071 +#: access/transam/xlogrecovery.c:1131 #, c-format -msgid "must specify restore_command when standby mode is not enabled" +msgid "must specify \"restore_command\" when standby mode is not enabled" msgstr "" -"необходимо задать restore_command, еÑли не выбран режим резервного Ñервера" +"необходимо задать \"restore_command\", еÑли не выбран режим резервного " +"Ñервера" -#: access/transam/xlogrecovery.c:1109 +#: access/transam/xlogrecovery.c:1169 #, c-format msgid "recovery target timeline %u does not exist" msgstr "Ñ†ÐµÐ»ÐµÐ²Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ %u не ÑущеÑтвует" -#: access/transam/xlogrecovery.c:1259 +#: access/transam/xlogrecovery.c:1252 access/transam/xlogrecovery.c:1259 +#: access/transam/xlogrecovery.c:1318 access/transam/xlogrecovery.c:1406 +#: access/transam/xlogrecovery.c:1415 access/transam/xlogrecovery.c:1435 +#, c-format +msgid "invalid data in file \"%s\"" +msgstr "неверные данные в файле \"%s\"" + +#: access/transam/xlogrecovery.c:1319 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "Получен идентификатор линии времени %u, но ожидалÑÑ %u." -#: access/transam/xlogrecovery.c:1641 +#: access/transam/xlogrecovery.c:1330 +#, c-format +msgid "this is an incremental backup, not a data directory" +msgstr "Ñто каталог инкрементальной копии, не каталог данных" + +#: access/transam/xlogrecovery.c:1331 +#, c-format +msgid "Use pg_combinebackup to reconstruct a valid data directory." +msgstr "" +"РеконÑтруируйте полноценный каталог данных, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ pg_combinebackup." + +#: access/transam/xlogrecovery.c:1717 +#, c-format +msgid "unexpected record type found at redo point %X/%X" +msgstr "в точке redo %X/%X обнаружена запиÑÑŒ неожиданного типа" + +#: access/transam/xlogrecovery.c:1740 #, c-format msgid "redo starts at %X/%X" msgstr "запиÑÑŒ REDO начинаетÑÑ Ñо ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ %X/%X" -#: access/transam/xlogrecovery.c:1654 +#: access/transam/xlogrecovery.c:1753 #, c-format msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" msgstr "" "выполнÑетÑÑ Ð²Ð¾Ñпроизведение, прошло времени: %ld.%02d Ñ, текущий LSN: %X/%X" -#: access/transam/xlogrecovery.c:1746 +#: access/transam/xlogrecovery.c:1843 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "" "Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° оÑтановки воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´ÑˆÐµÑтвует ÑоглаÑованной точке " "воÑÑтановлениÑ" -#: access/transam/xlogrecovery.c:1778 +#: access/transam/xlogrecovery.c:1875 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "запиÑи REDO обработаны до ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ %X/%X, нагрузка ÑиÑтемы: %s" -#: access/transam/xlogrecovery.c:1784 +#: access/transam/xlogrecovery.c:1881 #, c-format msgid "last completed transaction was at log time %s" msgstr "поÑледнÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð±Ñ‹Ð»Ð° выполнена в %s" -#: access/transam/xlogrecovery.c:1793 +#: access/transam/xlogrecovery.c:1890 #, c-format msgid "redo is not required" msgstr "данные REDO не требуютÑÑ" -#: access/transam/xlogrecovery.c:1804 +#: access/transam/xlogrecovery.c:1901 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "воÑÑтановление окончилоÑÑŒ до доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ цели воÑÑтановлениÑ" -#: access/transam/xlogrecovery.c:1979 +#: access/transam/xlogrecovery.c:2095 #, c-format msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" msgstr "" "уÑпешно пропущена отÑутÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ contrecord в %X/%X, перезапиÑÐ°Ð½Ð½Ð°Ñ Ð² " "%s" -#: access/transam/xlogrecovery.c:2046 +#: access/transam/xlogrecovery.c:2162 #, c-format msgid "unexpected directory entry \"%s\" found in %s" msgstr "в %2$s обнаружен недопуÑтимый Ñлемент-каталог \"%1$s\"" -#: access/transam/xlogrecovery.c:2048 +#: access/transam/xlogrecovery.c:2164 #, c-format msgid "All directory entries in pg_tblspc/ should be symbolic links." msgstr "" "Ð’Ñе Ñлементы-каталоги в pg_tblspc/ должны быть ÑимволичеÑкими ÑÑылками." -#: access/transam/xlogrecovery.c:2049 +#: access/transam/xlogrecovery.c:2165 #, c-format msgid "" -"Remove those directories, or set allow_in_place_tablespaces to ON " +"Remove those directories, or set \"allow_in_place_tablespaces\" to ON " "transiently to let recovery complete." msgstr "" -"Удалите Ñти каталоги или на Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтановите в allow_in_place_tablespaces " -"значение ON, чтобы воÑÑтановление завершилоÑÑŒ." +"Удалите Ñти каталоги или на Ð²Ñ€ÐµÐ¼Ñ ÑƒÑтановите в " +"\"allow_in_place_tablespaces\" значение ON, чтобы воÑÑтановление завершилоÑÑŒ." + +#: access/transam/xlogrecovery.c:2217 +#, c-format +msgid "completed backup recovery with redo LSN %X/%X and end LSN %X/%X" +msgstr "завершено воÑÑтановление копии Ñ LSN redo %X/%X и конечным LSN %X/%X" -#: access/transam/xlogrecovery.c:2123 +#: access/transam/xlogrecovery.c:2247 #, c-format msgid "consistent recovery state reached at %X/%X" -msgstr "ÑоглаÑованное ÑоÑтоÑние воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтигнуто по Ñмещению %X/%X" +msgstr "ÑоглаÑованное ÑоÑтоÑние воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтигнуто в позиции %X/%X" #. translator: %s is a WAL record description -#: access/transam/xlogrecovery.c:2161 +#: access/transam/xlogrecovery.c:2285 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "запиÑÑŒ REDO в WAL в позиции %X/%X Ð´Ð»Ñ %s" -#: access/transam/xlogrecovery.c:2257 +#: access/transam/xlogrecovery.c:2383 #, c-format msgid "" "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint " @@ -3708,13 +4079,13 @@ msgstr "" "неожиданный ID предыдущей линии времени %u (ID текущей линии времени %u) в " "запиÑи контрольной точки" -#: access/transam/xlogrecovery.c:2266 +#: access/transam/xlogrecovery.c:2392 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "неожиданный ID линии времени %u (поÑле %u) в запиÑи контрольной точки" # skip-rule: capital-letter-first -#: access/transam/xlogrecovery.c:2282 +#: access/transam/xlogrecovery.c:2408 #, c-format msgid "" "unexpected timeline ID %u in checkpoint record, before reaching minimum " @@ -3723,145 +4094,122 @@ msgstr "" "неожиданный ID линии времени %u в запиÑи контрольной точки, до доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ " "минимальной к. Ñ‚. %X/%X на линии времени %u" -#: access/transam/xlogrecovery.c:2466 access/transam/xlogrecovery.c:2742 +#: access/transam/xlogrecovery.c:2592 access/transam/xlogrecovery.c:2868 #, c-format msgid "recovery stopping after reaching consistency" msgstr "" "воÑÑтановление оÑтанавливаетÑÑ Ð¿Ð¾Ñле доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ ÑоглаÑованного ÑоÑтоÑниÑ" -#: access/transam/xlogrecovery.c:2487 +#: access/transam/xlogrecovery.c:2613 #, c-format msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" msgstr "воÑÑтановление оÑтанавливаетÑÑ Ð¿ÐµÑ€ÐµÐ´ позицией в WAL (LSN) \"%X/%X\"" -#: access/transam/xlogrecovery.c:2577 +#: access/transam/xlogrecovery.c:2703 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "" "воÑÑтановление оÑтанавливаетÑÑ Ð¿ÐµÑ€ÐµÐ´ фикÑированием транзакции %u, Ð²Ñ€ÐµÐ¼Ñ %s" -#: access/transam/xlogrecovery.c:2584 +#: access/transam/xlogrecovery.c:2710 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "" "воÑÑтановление оÑтанавливаетÑÑ Ð¿ÐµÑ€ÐµÐ´ прерыванием транзакции %u, Ð²Ñ€ÐµÐ¼Ñ %s" -#: access/transam/xlogrecovery.c:2637 +#: access/transam/xlogrecovery.c:2763 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "воÑÑтановление оÑтанавливаетÑÑ Ð² точке воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\", Ð²Ñ€ÐµÐ¼Ñ %s" -#: access/transam/xlogrecovery.c:2655 +#: access/transam/xlogrecovery.c:2781 #, c-format msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" msgstr "воÑÑтановление оÑтанавливаетÑÑ Ð¿Ð¾Ñле позиции в WAL (LSN) \"%X/%X\"" -#: access/transam/xlogrecovery.c:2722 +#: access/transam/xlogrecovery.c:2848 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "" "воÑÑтановление оÑтанавливаетÑÑ Ð¿Ð¾Ñле фикÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ %u, Ð²Ñ€ÐµÐ¼Ñ %s" -#: access/transam/xlogrecovery.c:2730 +#: access/transam/xlogrecovery.c:2856 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "" "воÑÑтановление оÑтанавливаетÑÑ Ð¿Ð¾Ñле Ð¿Ñ€ÐµÑ€Ñ‹Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ %u, Ð²Ñ€ÐµÐ¼Ñ %s" -#: access/transam/xlogrecovery.c:2811 +#: access/transam/xlogrecovery.c:2937 #, c-format msgid "pausing at the end of recovery" msgstr "оÑтановка в конце воÑÑтановлениÑ" -#: access/transam/xlogrecovery.c:2812 +#: access/transam/xlogrecovery.c:2938 #, c-format msgid "Execute pg_wal_replay_resume() to promote." msgstr "Выполните pg_wal_replay_resume() Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ." -#: access/transam/xlogrecovery.c:2815 access/transam/xlogrecovery.c:4625 +#: access/transam/xlogrecovery.c:2941 access/transam/xlogrecovery.c:4679 #, c-format msgid "recovery has paused" msgstr "воÑÑтановление приоÑтановлено" -#: access/transam/xlogrecovery.c:2816 +#: access/transam/xlogrecovery.c:2942 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "Выполните pg_wal_replay_resume() Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ." -#: access/transam/xlogrecovery.c:3082 +#: access/transam/xlogrecovery.c:3205 #, c-format -msgid "unexpected timeline ID %u in log segment %s, offset %u" -msgstr "неожиданный ID линии времени %u в Ñегменте журнала %s, Ñмещение %u" +msgid "unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u" +msgstr "" +"неожиданный ID линии времени %u в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u" -#: access/transam/xlogrecovery.c:3287 +#: access/transam/xlogrecovery.c:3413 #, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "не удалоÑÑŒ прочитать Ñегмент журнала %s, Ñмещение %u: %m" +msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: %m" +msgstr "не удалоÑÑŒ прочитать Ñегмент WAL %s, LSN %X/%X, Ñмещение %u: %m" -#: access/transam/xlogrecovery.c:3293 +#: access/transam/xlogrecovery.c:3420 #, c-format -msgid "could not read from log segment %s, offset %u: read %d of %zu" +msgid "" +"could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu" msgstr "" -"не удалоÑÑŒ прочитать из Ñегмента журнала %s по Ñмещению %u (прочитано байт: " +"не удалоÑÑŒ прочитать Ñегмент WAL %s, LSN %X/%X, Ñмещение %u (прочитано байт: " "%d из %zu)" -#: access/transam/xlogrecovery.c:3942 -#, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÑылка на первичную контрольную точку в файле pg_control" - -#: access/transam/xlogrecovery.c:3946 -#, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÑылка на контрольную точку в файле backup_label" - -#: access/transam/xlogrecovery.c:3964 +#: access/transam/xlogrecovery.c:4061 #, c-format -msgid "invalid primary checkpoint record" -msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ первичной контрольной точки" +msgid "invalid checkpoint location" +msgstr "неверное положение контрольной точки" -#: access/transam/xlogrecovery.c:3968 +#: access/transam/xlogrecovery.c:4071 #, c-format msgid "invalid checkpoint record" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ контрольной точки" -#: access/transam/xlogrecovery.c:3979 -#, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "неверный ID менеджера реÑурÑов в запиÑи первичной контрольной точки" - -#: access/transam/xlogrecovery.c:3983 +#: access/transam/xlogrecovery.c:4077 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "неверный ID менеджера реÑурÑов в запиÑи контрольной точки" -#: access/transam/xlogrecovery.c:3996 -#, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "неверные флаги xl_info в запиÑи первичной контрольной точки" - -#: access/transam/xlogrecovery.c:4000 +#: access/transam/xlogrecovery.c:4085 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "неверные флаги xl_info в запиÑи контрольной точки" -#: access/transam/xlogrecovery.c:4011 -#, c-format -msgid "invalid length of primary checkpoint record" -msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° запиÑи первичной контрольной точки" - -#: access/transam/xlogrecovery.c:4015 +#: access/transam/xlogrecovery.c:4091 #, c-format msgid "invalid length of checkpoint record" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° запиÑи контрольной точки" -#: access/transam/xlogrecovery.c:4071 +#: access/transam/xlogrecovery.c:4145 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "" "Ð½Ð¾Ð²Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u не ÑвлÑетÑÑ Ð¾Ñ‚Ð²ÐµÑ‚Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ линии времени ÑиÑтемы БД %u" -#: access/transam/xlogrecovery.c:4085 +#: access/transam/xlogrecovery.c:4159 #, c-format msgid "" "new timeline %u forked off current database system timeline %u before " @@ -3870,40 +4218,30 @@ msgstr "" "Ð½Ð¾Ð²Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u ответвилаÑÑŒ от текущей линии времени базы данных %u " "до текущей точки воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ %X/%X" -#: access/transam/xlogrecovery.c:4104 +#: access/transam/xlogrecovery.c:4178 #, c-format msgid "new target timeline is %u" msgstr "Ð½Ð¾Ð²Ð°Ñ Ñ†ÐµÐ»ÐµÐ²Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u" -#: access/transam/xlogrecovery.c:4307 +#: access/transam/xlogrecovery.c:4381 #, c-format msgid "WAL receiver process shutdown requested" msgstr "получен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° выключение процеÑÑа приёмника WAL" -#: access/transam/xlogrecovery.c:4370 +#: access/transam/xlogrecovery.c:4441 #, c-format msgid "received promote request" msgstr "получен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ ÑтатуÑа" -#: access/transam/xlogrecovery.c:4383 -#, c-format -msgid "promote trigger file found: %s" -msgstr "найден файл триггера повышениÑ: %s" - -#: access/transam/xlogrecovery.c:4391 -#, c-format -msgid "could not stat promote trigger file \"%s\": %m" -msgstr "не удалоÑÑŒ получить информацию о файле триггера Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ \"%s\": %m" - -#: access/transam/xlogrecovery.c:4616 +#: access/transam/xlogrecovery.c:4670 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "" "режим горÑчего резерва невозможен из-за отÑутÑÑ‚Ð²Ð¸Ñ Ð´Ð¾Ñтаточных значений " "параметров" -#: access/transam/xlogrecovery.c:4617 access/transam/xlogrecovery.c:4644 -#: access/transam/xlogrecovery.c:4674 +#: access/transam/xlogrecovery.c:4671 access/transam/xlogrecovery.c:4698 +#: access/transam/xlogrecovery.c:4728 #, c-format msgid "" "%s = %d is a lower setting than on the primary server, where its value was " @@ -3911,12 +4249,12 @@ msgid "" msgstr "" "Параметр %s = %d меньше, чем на ведущем Ñервере, где его значение было %d." -#: access/transam/xlogrecovery.c:4626 +#: access/transam/xlogrecovery.c:4680 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "Ð’ Ñлучае Ð²Ð¾Ð·Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñервер отключитÑÑ." -#: access/transam/xlogrecovery.c:4627 +#: access/transam/xlogrecovery.c:4681 #, c-format msgid "" "You can then restart the server after making the necessary configuration " @@ -3925,24 +4263,24 @@ msgstr "" "Затем вы можете перезапуÑтить Ñервер поÑле внеÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ñ‹Ñ… изменений " "конфигурации." -#: access/transam/xlogrecovery.c:4638 +#: access/transam/xlogrecovery.c:4692 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "повышение невозможно из-за отÑутÑÑ‚Ð²Ð¸Ñ Ð´Ð¾Ñтаточных значений параметров" -#: access/transam/xlogrecovery.c:4648 +#: access/transam/xlogrecovery.c:4702 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "" "ПерезапуÑтите Ñервер поÑле внеÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ñ‹Ñ… изменений конфигурации." -#: access/transam/xlogrecovery.c:4672 +#: access/transam/xlogrecovery.c:4726 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "" "воÑÑтановление прервано из-за отÑутÑÑ‚Ð²Ð¸Ñ Ð´Ð¾Ñтаточных значений параметров" -#: access/transam/xlogrecovery.c:4678 +#: access/transam/xlogrecovery.c:4732 #, c-format msgid "" "You can restart the server after making the necessary configuration changes." @@ -3950,59 +4288,120 @@ msgstr "" "Ð’Ñ‹ можете перезапуÑтить Ñервер поÑле внеÑÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ñ‹Ñ… изменений " "конфигурации." -#: access/transam/xlogutils.c:1053 +#: access/transam/xlogrecovery.c:4774 +#, c-format +msgid "multiple recovery targets specified" +msgstr "указано неÑколько целей воÑÑтановлениÑ" + +#: access/transam/xlogrecovery.c:4775 +#, c-format +msgid "" +"At most one of \"recovery_target\", \"recovery_target_lsn\", " +"\"recovery_target_name\", \"recovery_target_time\", \"recovery_target_xid\" " +"may be set." +msgstr "" +"Может быть указана только одна из целей: \"recovery_target\", " +"\"recovery_target_lsn\", \"recovery_target_name\", \"recovery_target_time\", " +"\"recovery_target_xid\"." + +#: access/transam/xlogrecovery.c:4786 +#, c-format +msgid "The only allowed value is \"immediate\"." +msgstr "ЕдинÑтвенное допуÑтимое значение: \"immediate\"." + +#: access/transam/xlogrecovery.c:4938 utils/adt/timestamp.c:202 +#: utils/adt/timestamp.c:455 +#, c-format +msgid "timestamp out of range: \"%s\"" +msgstr "timestamp вне диапазона: \"%s\"" + +#: access/transam/xlogrecovery.c:4983 +#, c-format +msgid "\"recovery_target_timeline\" is not a valid number." +msgstr "Значение \"recovery_target_timeline\" не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым чиÑлом." + +#: access/transam/xlogutils.c:1032 +#, c-format +msgid "could not read from WAL segment %s, offset %d: %m" +msgstr "не удалоÑÑŒ прочитать из Ñегмента WAL %s по Ñмещению %d: %m" + +#: access/transam/xlogutils.c:1039 +#, c-format +msgid "could not read from WAL segment %s, offset %d: read %d of %d" +msgstr "" +"не удалоÑÑŒ прочитать из Ñегмента WAL %s по Ñмещению %d (прочитано байт: %d " +"из %d)" + +#: archive/shell_archive.c:98 +#, c-format +msgid "archive command failed with exit code %d" +msgstr "команда архивации завершилаÑÑŒ ошибкой Ñ ÐºÐ¾Ð´Ð¾Ð¼ %d" + +#: archive/shell_archive.c:100 archive/shell_archive.c:110 +#: archive/shell_archive.c:116 archive/shell_archive.c:125 +#, c-format +msgid "The failed archive command was: %s" +msgstr "Команда архивации Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹: %s" + +#: archive/shell_archive.c:107 #, c-format -msgid "could not read from log segment %s, offset %d: %m" -msgstr "не удалоÑÑŒ прочитать Ñегмент журнала %s, Ñмещение %d: %m" +msgid "archive command was terminated by exception 0x%X" +msgstr "команда архивации была прервана иÑключением 0x%X" -#: access/transam/xlogutils.c:1060 +#: archive/shell_archive.c:109 postmaster/postmaster.c:3095 #, c-format -msgid "could not read from log segment %s, offset %d: read %d of %d" +msgid "" +"See C include file \"ntstatus.h\" for a description of the hexadecimal value." msgstr "" -"не удалоÑÑŒ прочитать из Ñегмента журнала %s по Ñмещению %d (прочитано байт: " -"%d из %d)" +"ОпиÑание Ñтого шеÑтнадцатеричного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ñ‰Ð¸Ñ‚Ðµ во включаемом C-файле " +"\"ntstatus.h\"" -#: backup/backup_manifest.c:253 +#: archive/shell_archive.c:114 +#, c-format +msgid "archive command was terminated by signal %d: %s" +msgstr "команда архивации завершена по Ñигналу %d: %s" + +#: archive/shell_archive.c:123 +#, c-format +msgid "archive command exited with unrecognized status %d" +msgstr "команда архивации завершилаÑÑŒ Ñ Ð½ÐµÑ€Ð°Ñпознанным кодом ÑоÑтоÑÐ½Ð¸Ñ %d" + +#: backup/backup_manifest.c:254 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "ожидалÑÑ ÐºÐ¾Ð½ÐµÑ† линии времени %u, но обнаружена Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u" -#: backup/backup_manifest.c:277 +#: backup/backup_manifest.c:278 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "ожидалоÑÑŒ начало линии времени %u, но обнаружена Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u" -#: backup/backup_manifest.c:304 +#: backup/backup_manifest.c:305 #, c-format msgid "start timeline %u not found in history of timeline %u" msgstr "Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u не найдена в иÑтории линии времени %u" -#: backup/backup_manifest.c:355 +#: backup/backup_manifest.c:356 #, c-format msgid "could not rewind temporary file" msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ð²Ð¾ временном файле" -#: backup/backup_manifest.c:374 -#, c-format -msgid "could not read from temporary file: read only %zu of %zu bytes" -msgstr "не удалоÑÑŒ прочитать временный файл (прочитано байт: %zu из %zu)" - -#: backup/basebackup.c:454 +#: backup/basebackup.c:479 #, c-format msgid "could not find any WAL files" msgstr "не удалоÑÑŒ найти ни одного файла WAL" -#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 +#: backup/basebackup.c:494 backup/basebackup.c:509 backup/basebackup.c:518 #, c-format msgid "could not find WAL file \"%s\"" msgstr "не удалоÑÑŒ найти файл WAL \"%s\"" -#: backup/basebackup.c:535 backup/basebackup.c:560 +#: backup/basebackup.c:560 backup/basebackup.c:585 #, c-format msgid "unexpected WAL file size \"%s\"" msgstr "неприемлемый размер файла WAL \"%s\"" -#: backup/basebackup.c:630 +#: backup/basebackup.c:656 #, c-format msgid "%lld total checksum verification failure" msgid_plural "%lld total checksum verification failures" @@ -4010,88 +4409,95 @@ msgstr[0] "вÑего ошибок контрольных Ñумм: %lld" msgstr[1] "вÑего ошибок контрольных Ñумм: %lld" msgstr[2] "вÑего ошибок контрольных Ñумм: %lld" -#: backup/basebackup.c:637 +#: backup/basebackup.c:663 #, c-format msgid "checksum verification failure during base backup" msgstr "при базовом резервном копировании выÑвлены ошибки контрольных Ñумм" -#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 -#: backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 -#: backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 -#: backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 -#: backup/basebackup.c:861 backup/basebackup.c:874 +#: backup/basebackup.c:733 backup/basebackup.c:742 backup/basebackup.c:753 +#: backup/basebackup.c:770 backup/basebackup.c:779 backup/basebackup.c:788 +#: backup/basebackup.c:803 backup/basebackup.c:820 backup/basebackup.c:829 +#: backup/basebackup.c:841 backup/basebackup.c:865 backup/basebackup.c:879 +#: backup/basebackup.c:890 backup/basebackup.c:901 backup/basebackup.c:914 #, c-format msgid "duplicate option \"%s\"" msgstr "повторÑющийÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ \"%s\"" -#: backup/basebackup.c:734 +#: backup/basebackup.c:761 #, c-format msgid "unrecognized checkpoint type: \"%s\"" msgstr "нераÑпознанный тип контрольной точки: \"%s\"" -#: backup/basebackup.c:769 +#: backup/basebackup.c:793 +#, c-format +msgid "incremental backups cannot be taken unless WAL summarization is enabled" +msgstr "" +"Ñделать инкрементальную копию можно, только когда включено обобщение WAL" + +#: backup/basebackup.c:809 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d вне диапазона, допуÑтимого Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\" (%d .. %d)" -#: backup/basebackup.c:814 +#: backup/basebackup.c:854 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "нераÑпознанный параметр в манифеÑте: \"%s\"" -#: backup/basebackup.c:830 -#, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "нераÑпознанный алгоритм раÑчёта контрольных Ñумм: \"%s\"" - -#: backup/basebackup.c:865 +#: backup/basebackup.c:905 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "нераÑпознанный алгоритм ÑжатиÑ: \"%s\"" -#: backup/basebackup.c:881 +#: backup/basebackup.c:921 #, c-format msgid "unrecognized base backup option: \"%s\"" msgstr "нераÑпознанный параметр операции базового копированиÑ: \"%s\"" -#: backup/basebackup.c:892 +#: backup/basebackup.c:932 #, c-format msgid "manifest checksums require a backup manifest" msgstr "контрольные Ñуммы не могут раÑÑчитыватьÑÑ Ð±ÐµÐ· манифеÑта копии" # skip-rule: capital-letter-first -#: backup/basebackup.c:901 +#: backup/basebackup.c:941 #, c-format msgid "target detail cannot be used without target" msgstr "доп. информацию о получателе Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ без ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ" # skip-rule: capital-letter-first -#: backup/basebackup.c:910 backup/basebackup_target.c:218 +#: backup/basebackup.c:950 backup/basebackup_target.c:218 #, c-format msgid "target \"%s\" does not accept a target detail" msgstr "получатель \"%s\" не принимает доп. информацию" -#: backup/basebackup.c:921 +#: backup/basebackup.c:961 #, c-format msgid "compression detail cannot be specified unless compression is enabled" msgstr "параметры ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ, еÑли не включено Ñжатие" -#: backup/basebackup.c:934 +#: backup/basebackup.c:974 #, c-format msgid "invalid compression specification: %s" msgstr "неправильное указание ÑжатиÑ: %s" -#: backup/basebackup.c:1431 +#: backup/basebackup.c:1024 #, c-format -msgid "skipping special file \"%s\"" -msgstr "Ñпециальный файл \"%s\" пропуÑкаетÑÑ" +msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" +msgstr "" +"инкрементальной команде BASE_BACKUP должна предшеÑтвовать UPLOAD_MANIFEST" + +#: backup/basebackup.c:1157 backup/basebackup.c:1358 +#, c-format +msgid "could not stat file or directory \"%s\": %m" +msgstr "не удалоÑÑŒ получить информацию о файле или каталоге \"%s\": %m" -#: backup/basebackup.c:1550 +#: backup/basebackup.c:1544 #, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "неверный номер Ñегмента %d в файле \"%s\"" +msgid "skipping special file \"%s\"" +msgstr "Ñпециальный файл \"%s\" пропуÑкаетÑÑ" -#: backup/basebackup.c:1590 +#: backup/basebackup.c:1751 #, c-format msgid "" "could not verify checksum in file \"%s\", block %u: read buffer size %d and " @@ -4100,7 +4506,15 @@ msgstr "" "не удалоÑÑŒ проверить контрольную Ñумму в файле \"%s\", блоке %u: размер " "прочитанного буфера (%d) отличаетÑÑ Ð¾Ñ‚ размера Ñтраницы (%d)" -#: backup/basebackup.c:1664 +#: backup/basebackup.c:1813 +#, c-format +msgid "file \"%s\" has a total of %d checksum verification failure" +msgid_plural "file \"%s\" has a total of %d checksum verification failures" +msgstr[0] "вÑего в файле \"%s\" обнаружено ошибок контрольных Ñумм: %d" +msgstr[1] "вÑего в файле \"%s\" обнаружено ошибок контрольных Ñумм: %d" +msgstr[2] "вÑего в файле \"%s\" обнаружено ошибок контрольных Ñумм: %d" + +#: backup/basebackup.c:1917 #, c-format msgid "" "checksum verification failed in file \"%s\", block %u: calculated %X but " @@ -4109,27 +4523,19 @@ msgstr "" "ошибка контрольной Ñуммы в файле \"%s\", блоке %u: вычиÑлено значение %X, но " "ожидалоÑÑŒ %X" -#: backup/basebackup.c:1671 +#: backup/basebackup.c:1924 #, c-format msgid "" "further checksum verification failures in file \"%s\" will not be reported" msgstr "" "о дальнейших ошибках контрольных Ñумм в файле \"%s\" ÑообщатьÑÑ Ð½Ðµ будет" -#: backup/basebackup.c:1718 -#, c-format -msgid "file \"%s\" has a total of %d checksum verification failure" -msgid_plural "file \"%s\" has a total of %d checksum verification failures" -msgstr[0] "вÑего в файле \"%s\" обнаружено ошибок контрольных Ñумм: %d" -msgstr[1] "вÑего в файле \"%s\" обнаружено ошибок контрольных Ñумм: %d" -msgstr[2] "вÑего в файле \"%s\" обнаружено ошибок контрольных Ñумм: %d" - -#: backup/basebackup.c:1764 +#: backup/basebackup.c:2048 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "Ñлишком длинное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° tar: \"%s\"" -#: backup/basebackup.c:1769 +#: backup/basebackup.c:2053 #, c-format msgid "" "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" @@ -4137,6 +4543,11 @@ msgstr "" "цель ÑимволичеÑкой ÑÑылки Ñлишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° tar: Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\", " "цель \"%s\"" +#: backup/basebackup.c:2127 +#, c-format +msgid "could not read file \"%s\": read %zd of %zu" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %zd из %zu)" + #: backup/basebackup_gzip.c:67 #, c-format msgid "gzip compression is not supported by this build" @@ -4147,72 +4558,172 @@ msgstr "Ñжатие gzip не поддерживаетÑÑ Ð² данной Ñб msgid "could not initialize compression library" msgstr "не удалоÑÑŒ инициализировать библиотеку ÑжатиÑ" -#: backup/basebackup_lz4.c:67 +#: backup/basebackup_incremental.c:294 #, c-format -msgid "lz4 compression is not supported by this build" -msgstr "Ñжатие lz4 не поддерживаетÑÑ Ð² данной Ñборке" +msgid "manifest contains no required WAL ranges" +msgstr "в манифеÑте не указаны нужные диапазоны WAL" -#: backup/basebackup_server.c:75 +#: backup/basebackup_incremental.c:349 +#, c-format +msgid "timeline %u found in manifest, but not in this server's history" +msgstr "в манифеÑте найдена Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u, но её нет в иÑтории Ñервера" + +#: backup/basebackup_incremental.c:414 #, c-format msgid "" -"must be superuser or a role with privileges of the pg_write_server_files " -"role to create backup stored on server" +"manifest requires WAL from initial timeline %u starting at %X/%X, but that " +"timeline begins at %X/%X" msgstr "" -"Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¸, ÑохранÑемой на Ñтороне Ñервера, нужно быть " -"Ñуперпользователем или иметь права роли pg_write_server_files" +"манифеÑÑ‚ требует Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ WAL Ñ Ð¸Ð·Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð¾Ð¹ линии времени %u, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ " +"позиции %X/%X, но Ñта Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ начинаетÑÑ Ñ %X/%X" -#: backup/basebackup_server.c:89 +#: backup/basebackup_incremental.c:424 #, c-format -msgid "relative path not allowed for backup stored on server" +msgid "" +"manifest requires WAL from continuation timeline %u starting at %X/%X, but " +"that timeline begins at %X/%X" msgstr "" -"Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸, ÑохранÑемой на Ñтороне Ñервера, Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ отноÑительный " -"путь" +"манифеÑÑ‚ требует Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ WAL Ñ Ð¿Ð¾Ñледующей линии времени %u, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ " +"позиции %X/%X, но Ñта Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ начинаетÑÑ Ñ %X/%X" -#: backup/basebackup_server.c:102 commands/dbcommands.c:500 -#: commands/tablespace.c:163 commands/tablespace.c:179 -#: commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1558 -#: storage/file/copydir.c:47 +#: backup/basebackup_incremental.c:435 #, c-format -msgid "could not create directory \"%s\": %m" -msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m" +msgid "" +"manifest requires WAL from final timeline %u ending at %X/%X, but this " +"backup starts at %X/%X" +msgstr "" +"манифеÑÑ‚ требует Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ WAL Ñ Ð¿Ð¾Ñледней линии времени %u, завершающейÑÑ Ð² " +"%X/%X, но Ñта ÐºÐ¾Ð¿Ð¸Ñ Ð½Ð°Ñ‡Ð¸Ð½Ð°ÐµÑ‚ÑÑ Ñ %X/%X" -#: backup/basebackup_server.c:115 +#: backup/basebackup_incremental.c:439 #, c-format -msgid "directory \"%s\" exists but is not empty" -msgstr "каталог \"%s\" ÑущеÑтвует, но он не пуÑÑ‚" +msgid "" +"This can happen for incremental backups on a standby if there was little " +"activity since the previous backup." +msgstr "" +"Ð¢Ð°ÐºÐ°Ñ ÑÐ¸Ñ‚ÑƒÐ°Ñ†Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°, когда Ð¸Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ ÑоздаётÑÑ Ð½Ð° резервном " +"Ñервере при незначительной активноÑти поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰ÐµÐ¹ копии." -#: backup/basebackup_server.c:123 utils/init/postinit.c:1072 +#: backup/basebackup_incremental.c:446 #, c-format -msgid "could not access directory \"%s\": %m" -msgstr "ошибка доÑтупа к каталогу \"%s\": %m" +msgid "" +"manifest requires WAL from non-final timeline %u ending at %X/%X, but this " +"server switched timelines at %X/%X" +msgstr "" +"манифеÑÑ‚ требует Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ WAL Ñ Ð¿Ñ€Ð¾Ð¼ÐµÐ¶ÑƒÑ‚Ð¾Ñ‡Ð½Ð¾Ð¹ линии времени %u, завершающейÑÑ " +"в %X/%X, но Ñтот Ñервер переключил линии времени в %X/%X" -#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 -#: backup/basebackup_server.c:268 backup/basebackup_server.c:275 -#: storage/smgr/md.c:487 storage/smgr/md.c:494 storage/smgr/md.c:785 +#: backup/basebackup_incremental.c:527 #, c-format -msgid "Check free disk space." -msgstr "Проверьте, еÑть ли меÑто на диÑке." +msgid "" +"WAL summaries are required on timeline %u from %X/%X to %X/%X, but no " +"summaries for that timeline and LSN range exist" +msgstr "" +"требуютÑÑ Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ WAL Ð´Ð»Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени %u Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %X/%X по %X/%X, но " +"они не найдены" -#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 +#: backup/basebackup_incremental.c:534 #, c-format -msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgid "" +"WAL summaries are required on timeline %u from %X/%X to %X/%X, but the " +"summaries for that timeline and LSN range are incomplete" msgstr "" -"не удалоÑÑŒ запиÑать файл \"%s\" (запиÑано байт: %d из %d по Ñмещению %u)" +"требуютÑÑ Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ WAL Ð´Ð»Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени %u Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %X/%X по %X/%X, но " +"Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтой линии времени и Ñтого диапазона LSN неполные" -#: backup/basebackup_target.c:146 +#: backup/basebackup_incremental.c:538 #, c-format -msgid "unrecognized target: \"%s\"" -msgstr "нераÑпознанный получатель: \"%s\"" +msgid "The first unsummarized LSN in this range is %X/%X." +msgstr "Первый необобщённый LSN в Ñтом диапазоне: %X/%X." -# skip-rule: capital-letter-first -#: backup/basebackup_target.c:237 +#: backup/basebackup_incremental.c:938 #, c-format -msgid "target \"%s\" requires a target detail" -msgstr "Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ \"%s\" требуетÑÑ Ð´Ð¾Ð¿. информациÑ" +msgid "backup manifest version 1 does not support incremental backup" +msgstr "" +"Ñ Ð²ÐµÑ€Ñией 1 манифеÑта копии инкрементальное копирование не поддерживаетÑÑ" -#: backup/basebackup_zstd.c:66 +#: backup/basebackup_incremental.c:956 #, c-format -msgid "zstd compression is not supported by this build" +msgid "" +"system identifier in backup manifest is %llu, but database system identifier " +"is %llu" +msgstr "" +"в манифеÑте копии указан идентификатор ÑиÑтемы: %llu, но идентификатор " +"ÑиÑтемы базы данных: %llu" + +#: backup/basebackup_lz4.c:67 +#, c-format +msgid "lz4 compression is not supported by this build" +msgstr "Ñжатие lz4 не поддерживаетÑÑ Ð² данной Ñборке" + +#: backup/basebackup_server.c:73 +#, c-format +msgid "permission denied to create backup stored on server" +msgstr "нет прав Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¸, ÑохранÑемой на Ñервере" + +#: backup/basebackup_server.c:74 +#, c-format +msgid "" +"Only roles with privileges of the \"%s\" role may create a backup stored on " +"the server." +msgstr "" +"Создавать копии, ÑохранÑемые на Ñервере, могут только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли " +"\"%s\"." + +#: backup/basebackup_server.c:89 +#, c-format +msgid "relative path not allowed for backup stored on server" +msgstr "" +"Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ð¸, ÑохранÑемой на Ñтороне Ñервера, Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ отноÑительный " +"путь" + +#: backup/basebackup_server.c:102 commands/dbcommands.c:477 +#: commands/tablespace.c:157 commands/tablespace.c:173 +#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:1986 +#: storage/file/copydir.c:47 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m" + +#: backup/basebackup_server.c:115 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "каталог \"%s\" ÑущеÑтвует, но он не пуÑÑ‚" + +#: backup/basebackup_server.c:123 utils/init/postinit.c:1178 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "ошибка при обращении к каталогу \"%s\": %m" + +#: backup/basebackup_server.c:175 backup/basebackup_server.c:182 +#: backup/basebackup_server.c:268 backup/basebackup_server.c:275 +#: backup/walsummary.c:312 storage/smgr/md.c:502 storage/smgr/md.c:509 +#: storage/smgr/md.c:591 storage/smgr/md.c:613 storage/smgr/md.c:999 +#, c-format +msgid "Check free disk space." +msgstr "Проверьте, еÑть ли меÑто на диÑке." + +#: backup/basebackup_server.c:179 backup/basebackup_server.c:272 +#: backup/walsummary.c:309 +#, c-format +msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +msgstr "" +"не удалоÑÑŒ запиÑать файл \"%s\" (запиÑано байт: %d из %d по Ñмещению %u)" + +#: backup/basebackup_target.c:146 +#, c-format +msgid "unrecognized target: \"%s\"" +msgstr "нераÑпознанный получатель: \"%s\"" + +# skip-rule: capital-letter-first +#: backup/basebackup_target.c:237 +#, c-format +msgid "target \"%s\" requires a target detail" +msgstr "Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ \"%s\" требуетÑÑ Ð´Ð¾Ð¿. информациÑ" + +#: backup/basebackup_zstd.c:66 +#, c-format +msgid "zstd compression is not supported by this build" msgstr "Ñжатие zstd не поддерживаетÑÑ Ð² данной Ñборке" #: backup/basebackup_zstd.c:117 @@ -4220,238 +4731,256 @@ msgstr "Ñжатие zstd не поддерживаетÑÑ Ð² данной Ñб msgid "could not set compression worker count to %d: %s" msgstr "не удалоÑÑŒ уÑтановить Ð´Ð»Ñ zstd чиÑло потоков %d: %s" -#: bootstrap/bootstrap.c:263 +#: backup/basebackup_zstd.c:129 #, c-format -msgid "-X requires a power of two value between 1 MB and 1 GB" -msgstr "" -"Ð´Ð»Ñ -X требуетÑÑ Ñ‡Ð¸Ñло, равное Ñтепени двух, в интервале от 1 МБ до 1 ГБ" +msgid "could not enable long-distance mode: %s" +msgstr "не удалоÑÑŒ включить режим большой диÑтанции: %s" + +#: backup/walsummaryfuncs.c:95 +#, c-format +msgid "invalid timeline %lld" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %lld" -#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3906 +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:623 tcop/postgres.c:3946 #, c-format msgid "--%s requires a value" msgstr "Ð´Ð»Ñ --%s требуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ" -#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3911 +#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:628 tcop/postgres.c:3951 #, c-format msgid "-c %s requires a value" msgstr "Ð´Ð»Ñ -c %s требуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ" -#: bootstrap/bootstrap.c:296 postmaster/postmaster.c:863 -#: postmaster/postmaster.c:876 +#: bootstrap/bootstrap.c:282 postmaster/postmaster.c:746 +#: postmaster/postmaster.c:759 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\".\n" -#: bootstrap/bootstrap.c:305 +#: bootstrap/bootstrap.c:291 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s: неверные аргументы командной Ñтроки\n" -#: catalog/aclchk.c:185 +#: catalog/aclchk.c:211 #, c-format msgid "grant options can only be granted to roles" msgstr "право Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð² можно давать только ролÑм" -#: catalog/aclchk.c:307 +#: catalog/aclchk.c:333 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "Ð´Ð»Ñ Ñтолбца \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" не были назначены никакие права" -#: catalog/aclchk.c:312 +#: catalog/aclchk.c:338 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° \"%s\" не были назначены никакие права" -#: catalog/aclchk.c:320 +#: catalog/aclchk.c:346 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "" "Ð´Ð»Ñ Ñтолбца \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" были назначены не вÑе запрошенные права" -#: catalog/aclchk.c:325 +#: catalog/aclchk.c:351 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° \"%s\" были назначены не вÑе запрошенные права" -#: catalog/aclchk.c:336 +#: catalog/aclchk.c:362 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "Ð´Ð»Ñ Ñтолбца \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" не были отозваны никакие права" -#: catalog/aclchk.c:341 +#: catalog/aclchk.c:367 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° \"%s\" не были отозваны никакие права" -#: catalog/aclchk.c:349 +#: catalog/aclchk.c:375 #, c-format msgid "" "not all privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "Ð´Ð»Ñ Ñтолбца \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" были отозваны не вÑе права" -#: catalog/aclchk.c:354 +#: catalog/aclchk.c:380 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° \"%s\" были отозваны не вÑе права" -#: catalog/aclchk.c:386 +#: catalog/aclchk.c:412 #, c-format msgid "grantor must be current user" msgstr "праводателем должен быть текущий пользователь" -#: catalog/aclchk.c:454 catalog/aclchk.c:1029 +#: catalog/aclchk.c:480 catalog/aclchk.c:1055 #, c-format msgid "invalid privilege type %s for relation" msgstr "право %s неприменимо Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ð¹" -#: catalog/aclchk.c:458 catalog/aclchk.c:1033 +#: catalog/aclchk.c:484 catalog/aclchk.c:1059 #, c-format msgid "invalid privilege type %s for sequence" msgstr "право %s неприменимо Ð´Ð»Ñ Ð¿Ð¾ÑледовательноÑтей" -#: catalog/aclchk.c:462 +#: catalog/aclchk.c:488 #, c-format msgid "invalid privilege type %s for database" msgstr "право %s неприменимо Ð´Ð»Ñ Ð±Ð°Ð· данных" -#: catalog/aclchk.c:466 +#: catalog/aclchk.c:492 #, c-format msgid "invalid privilege type %s for domain" msgstr "право %s неприменимо Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°" -#: catalog/aclchk.c:470 catalog/aclchk.c:1037 +#: catalog/aclchk.c:496 catalog/aclchk.c:1063 #, c-format msgid "invalid privilege type %s for function" msgstr "право %s неприменимо Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¹" -#: catalog/aclchk.c:474 +#: catalog/aclchk.c:500 #, c-format msgid "invalid privilege type %s for language" msgstr "право %s неприменимо Ð´Ð»Ñ Ñзыков" -#: catalog/aclchk.c:478 +#: catalog/aclchk.c:504 #, c-format msgid "invalid privilege type %s for large object" msgstr "право %s неприменимо Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов" -#: catalog/aclchk.c:482 catalog/aclchk.c:1053 +#: catalog/aclchk.c:508 catalog/aclchk.c:1079 #, c-format msgid "invalid privilege type %s for schema" msgstr "право %s неприменимо Ð´Ð»Ñ Ñхем" -#: catalog/aclchk.c:486 catalog/aclchk.c:1041 +#: catalog/aclchk.c:512 catalog/aclchk.c:1067 #, c-format msgid "invalid privilege type %s for procedure" msgstr "право %s неприменимо Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€" -#: catalog/aclchk.c:490 catalog/aclchk.c:1045 +#: catalog/aclchk.c:516 catalog/aclchk.c:1071 #, c-format msgid "invalid privilege type %s for routine" msgstr "право %s неприменимо Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼" -#: catalog/aclchk.c:494 +#: catalog/aclchk.c:520 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "право %s неприменимо Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… проÑтранÑтв" -#: catalog/aclchk.c:498 catalog/aclchk.c:1049 +#: catalog/aclchk.c:524 catalog/aclchk.c:1075 #, c-format msgid "invalid privilege type %s for type" msgstr "право %s неприменимо Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð°" -#: catalog/aclchk.c:502 +#: catalog/aclchk.c:528 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "право %s неприменимо Ð´Ð»Ñ Ð¾Ð±Ñ‘Ñ€Ñ‚Ð¾Ðº Ñторонних данных" -#: catalog/aclchk.c:506 +#: catalog/aclchk.c:532 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "право %s неприменимо Ð´Ð»Ñ Ñторонних Ñерверов" -#: catalog/aclchk.c:510 +#: catalog/aclchk.c:536 #, c-format msgid "invalid privilege type %s for parameter" msgstr "неверный тип прав %s Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°" -#: catalog/aclchk.c:549 +#: catalog/aclchk.c:575 #, c-format msgid "column privileges are only valid for relations" msgstr "права Ð´Ð»Ñ Ñтолбцов применимы только к отношениÑм" -#: catalog/aclchk.c:712 catalog/aclchk.c:4486 catalog/aclchk.c:5333 -#: catalog/objectaddress.c:1072 catalog/pg_largeobject.c:116 -#: storage/large_object/inv_api.c:287 +#: catalog/aclchk.c:738 catalog/aclchk.c:3629 catalog/objectaddress.c:1054 +#: catalog/pg_largeobject.c:113 storage/large_object/inv_api.c:285 #, c-format msgid "large object %u does not exist" msgstr "большой объект %u не ÑущеÑтвует" -#: catalog/aclchk.c:1086 +#: catalog/aclchk.c:1112 #, c-format msgid "default privileges cannot be set for columns" msgstr "права по умолчанию Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ Ð´Ð»Ñ Ñтолбцов" -#: catalog/aclchk.c:1246 +#: catalog/aclchk.c:1148 +#, c-format +msgid "permission denied to change default privileges" +msgstr "нет полномочий Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð² доÑтупа по умолчанию" + +#: catalog/aclchk.c:1266 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "предложение IN SCHEMA Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в GRANT/REVOKE ON SCHEMAS" -#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 -#: catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:776 -#: commands/sequence.c:1663 commands/tablecmds.c:7231 commands/tablecmds.c:7387 -#: commands/tablecmds.c:7437 commands/tablecmds.c:7511 -#: commands/tablecmds.c:7581 commands/tablecmds.c:7693 -#: commands/tablecmds.c:7787 commands/tablecmds.c:7846 -#: commands/tablecmds.c:7935 commands/tablecmds.c:7965 -#: commands/tablecmds.c:8093 commands/tablecmds.c:8175 -#: commands/tablecmds.c:8331 commands/tablecmds.c:8449 -#: commands/tablecmds.c:12167 commands/tablecmds.c:12348 -#: commands/tablecmds.c:12508 commands/tablecmds.c:13672 -#: commands/tablecmds.c:16240 commands/trigger.c:958 parser/analyze.c:2468 -#: parser/parse_relation.c:725 parser/parse_target.c:1063 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3434 -#: parser/parse_utilcmd.c:3470 parser/parse_utilcmd.c:3512 utils/adt/acl.c:2869 -#: utils/adt/ruleutils.c:2810 +#: catalog/aclchk.c:1617 catalog/catalog.c:659 catalog/objectaddress.c:1523 +#: catalog/pg_publication.c:528 commands/analyze.c:380 commands/copy.c:951 +#: commands/sequence.c:1655 commands/tablecmds.c:7574 commands/tablecmds.c:7728 +#: commands/tablecmds.c:7778 commands/tablecmds.c:7852 +#: commands/tablecmds.c:7922 commands/tablecmds.c:8052 +#: commands/tablecmds.c:8181 commands/tablecmds.c:8275 +#: commands/tablecmds.c:8376 commands/tablecmds.c:8503 +#: commands/tablecmds.c:8533 commands/tablecmds.c:8675 +#: commands/tablecmds.c:8768 commands/tablecmds.c:8902 +#: commands/tablecmds.c:9014 commands/tablecmds.c:12838 +#: commands/tablecmds.c:13030 commands/tablecmds.c:13191 +#: commands/tablecmds.c:14380 commands/tablecmds.c:17007 commands/trigger.c:942 +#: parser/analyze.c:2530 parser/parse_relation.c:737 parser/parse_target.c:1067 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3409 +#: parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2923 +#: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "Ñтолбец \"%s\" в таблице \"%s\" не ÑущеÑтвует" -#: catalog/aclchk.c:1850 catalog/objectaddress.c:1383 commands/sequence.c:1172 -#: commands/tablecmds.c:253 commands/tablecmds.c:17104 utils/adt/acl.c:2077 -#: utils/adt/acl.c:2107 utils/adt/acl.c:2139 utils/adt/acl.c:2171 -#: utils/adt/acl.c:2199 utils/adt/acl.c:2229 +#: catalog/aclchk.c:1862 +#, c-format +msgid "\"%s\" is an index" +msgstr "\"%s\" - Ñто индекÑ" + +#: catalog/aclchk.c:1869 commands/tablecmds.c:14537 commands/tablecmds.c:17923 +#, c-format +msgid "\"%s\" is a composite type" +msgstr "\"%s\" - Ñто ÑоÑтавной тип" + +#: catalog/aclchk.c:1877 catalog/objectaddress.c:1363 commands/tablecmds.c:263 +#: commands/tablecmds.c:17887 utils/adt/acl.c:2107 utils/adt/acl.c:2137 +#: utils/adt/acl.c:2170 utils/adt/acl.c:2206 utils/adt/acl.c:2237 +#: utils/adt/acl.c:2268 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\" - Ñто не поÑледовательноÑть" -#: catalog/aclchk.c:1888 +#: catalog/aclchk.c:1915 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "" "Ð´Ð»Ñ Ð¿Ð¾ÑледовательноÑти \"%s\" применимы только права USAGE, SELECT и UPDATE" -#: catalog/aclchk.c:1905 +#: catalog/aclchk.c:1932 #, c-format msgid "invalid privilege type %s for table" msgstr "право %s неприменимо Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†" -#: catalog/aclchk.c:2071 +#: catalog/aclchk.c:2097 #, c-format msgid "invalid privilege type %s for column" msgstr "право %s неприменимо Ð´Ð»Ñ Ñтолбцов" -#: catalog/aclchk.c:2084 +#: catalog/aclchk.c:2110 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "Ð´Ð»Ñ Ð¿Ð¾ÑледовательноÑти \"%s\" применимо только право SELECT" # TO REVIEW -#: catalog/aclchk.c:2666 +#: catalog/aclchk.c:2301 #, c-format msgid "language \"%s\" is not trusted" msgstr "Ñзык \"%s\" не ÑвлÑетÑÑ Ð´Ð¾Ð²ÐµÑ€ÐµÐ½Ð½Ñ‹Ð¼" -#: catalog/aclchk.c:2668 +#: catalog/aclchk.c:2303 #, c-format msgid "" "GRANT and REVOKE are not allowed on untrusted languages, because only " @@ -4460,487 +4989,411 @@ msgstr "" "GRANT и REVOKE не допуÑкаютÑÑ Ð´Ð»Ñ Ð½ÐµÐ´Ð¾Ð²ÐµÑ€ÐµÐ½Ð½Ñ‹Ñ… Ñзыков, так как иÑпользовать " "такие Ñзыки могут только Ñуперпользователи." -#: catalog/aclchk.c:3182 +#: catalog/aclchk.c:2454 #, c-format msgid "cannot set privileges of array types" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð¾Ð² маÑÑивов Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ права" -#: catalog/aclchk.c:3183 +#: catalog/aclchk.c:2455 #, c-format msgid "Set the privileges of the element type instead." msgstr "ВмеÑто Ñтого уÑтановите права Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° Ñлемента." -#: catalog/aclchk.c:3190 catalog/objectaddress.c:1649 +#: catalog/aclchk.c:2459 +#, c-format +msgid "cannot set privileges of multirange types" +msgstr "Ð´Ð»Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½Ñ‹Ñ… типов Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ права" + +#: catalog/aclchk.c:2460 +#, c-format +msgid "Set the privileges of the range type instead." +msgstr "ВмеÑто Ñтого уÑтановите права Ð´Ð»Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½Ð¾Ð³Ð¾ типа." + +#: catalog/aclchk.c:2467 catalog/objectaddress.c:1629 #, c-format msgid "\"%s\" is not a domain" msgstr "\"%s\" - Ñто не домен" -#: catalog/aclchk.c:3462 +#: catalog/aclchk.c:2653 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "нераÑпознанное право: \"%s\"" -#: catalog/aclchk.c:3527 +#: catalog/aclchk.c:2720 #, c-format msgid "permission denied for aggregate %s" msgstr "нет доÑтупа к агрегату %s" -#: catalog/aclchk.c:3530 +#: catalog/aclchk.c:2723 #, c-format msgid "permission denied for collation %s" msgstr "нет доÑтупа к правилу Ñортировки %s" -#: catalog/aclchk.c:3533 +#: catalog/aclchk.c:2726 #, c-format msgid "permission denied for column %s" msgstr "нет доÑтупа к Ñтолбцу %s" -#: catalog/aclchk.c:3536 +#: catalog/aclchk.c:2729 #, c-format msgid "permission denied for conversion %s" msgstr "нет доÑтупа к преобразованию %s" -#: catalog/aclchk.c:3539 +#: catalog/aclchk.c:2732 #, c-format msgid "permission denied for database %s" msgstr "нет доÑтупа к базе данных %s" -#: catalog/aclchk.c:3542 +#: catalog/aclchk.c:2735 #, c-format msgid "permission denied for domain %s" msgstr "нет доÑтупа к домену %s" -#: catalog/aclchk.c:3545 +#: catalog/aclchk.c:2738 #, c-format msgid "permission denied for event trigger %s" msgstr "нет доÑтупа к Ñобытийному триггеру %s" -#: catalog/aclchk.c:3548 +#: catalog/aclchk.c:2741 #, c-format msgid "permission denied for extension %s" msgstr "нет доÑтупа к раÑширению %s" -#: catalog/aclchk.c:3551 +#: catalog/aclchk.c:2744 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "нет доÑтупа к обёртке Ñторонних данных %s" -#: catalog/aclchk.c:3554 +#: catalog/aclchk.c:2747 #, c-format msgid "permission denied for foreign server %s" msgstr "нет доÑтупа к Ñтороннему Ñерверу %s" -#: catalog/aclchk.c:3557 +#: catalog/aclchk.c:2750 #, c-format msgid "permission denied for foreign table %s" msgstr "нет доÑтупа к Ñторонней таблице %s" -#: catalog/aclchk.c:3560 +#: catalog/aclchk.c:2753 #, c-format msgid "permission denied for function %s" msgstr "нет доÑтупа к функции %s" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:2756 #, c-format msgid "permission denied for index %s" msgstr "нет доÑтупа к индекÑу %s" -#: catalog/aclchk.c:3566 +#: catalog/aclchk.c:2759 #, c-format msgid "permission denied for language %s" msgstr "нет доÑтупа к Ñзыку %s" -#: catalog/aclchk.c:3569 +#: catalog/aclchk.c:2762 #, c-format msgid "permission denied for large object %s" msgstr "нет доÑтупа к большому объекту %s" -#: catalog/aclchk.c:3572 +#: catalog/aclchk.c:2765 #, c-format msgid "permission denied for materialized view %s" msgstr "нет доÑтупа к материализованному предÑтавлению %s" -#: catalog/aclchk.c:3575 +#: catalog/aclchk.c:2768 #, c-format msgid "permission denied for operator class %s" msgstr "нет доÑтупа к клаÑÑу операторов %s" -#: catalog/aclchk.c:3578 +#: catalog/aclchk.c:2771 #, c-format msgid "permission denied for operator %s" msgstr "нет доÑтупа к оператору %s" -#: catalog/aclchk.c:3581 +#: catalog/aclchk.c:2774 #, c-format msgid "permission denied for operator family %s" msgstr "нет доÑтупа к ÑемейÑтву операторов %s" -#: catalog/aclchk.c:3584 +#: catalog/aclchk.c:2777 #, c-format msgid "permission denied for parameter %s" msgstr "нет доÑтупа к параметру %s" -#: catalog/aclchk.c:3587 +#: catalog/aclchk.c:2780 #, c-format msgid "permission denied for policy %s" msgstr "нет доÑтупа к политике %s" -#: catalog/aclchk.c:3590 +#: catalog/aclchk.c:2783 #, c-format msgid "permission denied for procedure %s" msgstr "нет доÑтупа к процедуре %s" -#: catalog/aclchk.c:3593 +#: catalog/aclchk.c:2786 #, c-format msgid "permission denied for publication %s" msgstr "нет доÑтупа к публикации %s" -#: catalog/aclchk.c:3596 +#: catalog/aclchk.c:2789 #, c-format msgid "permission denied for routine %s" msgstr "нет доÑтупа к подпрограмме %s" -#: catalog/aclchk.c:3599 +#: catalog/aclchk.c:2792 #, c-format msgid "permission denied for schema %s" msgstr "нет доÑтупа к Ñхеме %s" -#: catalog/aclchk.c:3602 commands/sequence.c:660 commands/sequence.c:886 -#: commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 -#: commands/sequence.c:1825 +#: catalog/aclchk.c:2795 commands/sequence.c:654 commands/sequence.c:880 +#: commands/sequence.c:922 commands/sequence.c:963 commands/sequence.c:1753 +#: commands/sequence.c:1799 #, c-format msgid "permission denied for sequence %s" msgstr "нет доÑтупа к поÑледовательноÑти %s" -#: catalog/aclchk.c:3605 +#: catalog/aclchk.c:2798 #, c-format msgid "permission denied for statistics object %s" msgstr "нет доÑтупа к объекту ÑтатиÑтики %s" -#: catalog/aclchk.c:3608 +#: catalog/aclchk.c:2801 #, c-format msgid "permission denied for subscription %s" msgstr "нет доÑтупа к подпиÑке %s" -#: catalog/aclchk.c:3611 +#: catalog/aclchk.c:2804 #, c-format msgid "permission denied for table %s" msgstr "нет доÑтупа к таблице %s" -#: catalog/aclchk.c:3614 +#: catalog/aclchk.c:2807 #, c-format msgid "permission denied for tablespace %s" msgstr "нет доÑтупа к табличному проÑтранÑтву %s" -#: catalog/aclchk.c:3617 +#: catalog/aclchk.c:2810 #, c-format msgid "permission denied for text search configuration %s" msgstr "нет доÑтупа к конфигурации текÑтового поиÑка %s" -#: catalog/aclchk.c:3620 +#: catalog/aclchk.c:2813 #, c-format msgid "permission denied for text search dictionary %s" msgstr "нет доÑтупа к Ñловарю текÑтового поиÑка %s" -#: catalog/aclchk.c:3623 +#: catalog/aclchk.c:2816 #, c-format msgid "permission denied for type %s" msgstr "нет доÑтупа к типу %s" -#: catalog/aclchk.c:3626 +#: catalog/aclchk.c:2819 #, c-format msgid "permission denied for view %s" msgstr "нет доÑтупа к предÑтавлению %s" -#: catalog/aclchk.c:3662 +#: catalog/aclchk.c:2855 #, c-format msgid "must be owner of aggregate %s" msgstr "нужно быть владельцем агрегата %s" -#: catalog/aclchk.c:3665 +#: catalog/aclchk.c:2858 #, c-format msgid "must be owner of collation %s" msgstr "нужно быть владельцем правила Ñортировки %s" -#: catalog/aclchk.c:3668 +#: catalog/aclchk.c:2861 #, c-format msgid "must be owner of conversion %s" msgstr "нужно быть владельцем Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ %s" -#: catalog/aclchk.c:3671 +#: catalog/aclchk.c:2864 #, c-format msgid "must be owner of database %s" msgstr "нужно быть владельцем базы %s" -#: catalog/aclchk.c:3674 +#: catalog/aclchk.c:2867 #, c-format msgid "must be owner of domain %s" msgstr "нужно быть владельцем домена %s" -#: catalog/aclchk.c:3677 +#: catalog/aclchk.c:2870 #, c-format msgid "must be owner of event trigger %s" msgstr "нужно быть владельцем Ñобытийного триггера %s" -#: catalog/aclchk.c:3680 +#: catalog/aclchk.c:2873 #, c-format msgid "must be owner of extension %s" msgstr "нужно быть владельцем раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ %s" -#: catalog/aclchk.c:3683 +#: catalog/aclchk.c:2876 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "нужно быть владельцем обёртки Ñторонних данных %s" -#: catalog/aclchk.c:3686 +#: catalog/aclchk.c:2879 #, c-format msgid "must be owner of foreign server %s" msgstr "нужно быть \"владельцем\" Ñтороннего Ñервера %s" -#: catalog/aclchk.c:3689 +#: catalog/aclchk.c:2882 #, c-format msgid "must be owner of foreign table %s" msgstr "нужно быть владельцем Ñторонней таблицы %s" -#: catalog/aclchk.c:3692 +#: catalog/aclchk.c:2885 #, c-format msgid "must be owner of function %s" msgstr "нужно быть владельцем функции %s" -#: catalog/aclchk.c:3695 +#: catalog/aclchk.c:2888 #, c-format msgid "must be owner of index %s" msgstr "нужно быть владельцем индекÑа %s" -#: catalog/aclchk.c:3698 +#: catalog/aclchk.c:2891 #, c-format msgid "must be owner of language %s" msgstr "нужно быть владельцем Ñзыка %s" -#: catalog/aclchk.c:3701 +#: catalog/aclchk.c:2894 #, c-format msgid "must be owner of large object %s" msgstr "нужно быть владельцем большого объекта %s" -#: catalog/aclchk.c:3704 +#: catalog/aclchk.c:2897 #, c-format msgid "must be owner of materialized view %s" msgstr "нужно быть владельцем материализованного предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ %s" -#: catalog/aclchk.c:3707 +#: catalog/aclchk.c:2900 #, c-format msgid "must be owner of operator class %s" msgstr "нужно быть владельцем клаÑÑа операторов %s" -#: catalog/aclchk.c:3710 +#: catalog/aclchk.c:2903 #, c-format msgid "must be owner of operator %s" msgstr "нужно быть владельцем оператора %s" -#: catalog/aclchk.c:3713 +#: catalog/aclchk.c:2906 #, c-format msgid "must be owner of operator family %s" msgstr "нужно быть владельцем ÑемейÑтва операторов %s" -#: catalog/aclchk.c:3716 +#: catalog/aclchk.c:2909 #, c-format msgid "must be owner of procedure %s" msgstr "нужно быть владельцем процедуры %s" -#: catalog/aclchk.c:3719 +#: catalog/aclchk.c:2912 #, c-format msgid "must be owner of publication %s" msgstr "нужно быть владельцем публикации %s" -#: catalog/aclchk.c:3722 +#: catalog/aclchk.c:2915 #, c-format msgid "must be owner of routine %s" msgstr "нужно быть владельцем подпрограммы %s" -#: catalog/aclchk.c:3725 +#: catalog/aclchk.c:2918 #, c-format msgid "must be owner of sequence %s" msgstr "нужно быть владельцем поÑледовательноÑти %s" -#: catalog/aclchk.c:3728 +#: catalog/aclchk.c:2921 #, c-format msgid "must be owner of subscription %s" msgstr "нужно быть владельцем подпиÑки %s" -#: catalog/aclchk.c:3731 +#: catalog/aclchk.c:2924 #, c-format msgid "must be owner of table %s" msgstr "нужно быть владельцем таблицы %s" -#: catalog/aclchk.c:3734 +#: catalog/aclchk.c:2927 #, c-format msgid "must be owner of type %s" msgstr "нужно быть владельцем типа %s" -#: catalog/aclchk.c:3737 +#: catalog/aclchk.c:2930 #, c-format msgid "must be owner of view %s" msgstr "нужно быть владельцем предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ %s" -#: catalog/aclchk.c:3740 +#: catalog/aclchk.c:2933 #, c-format msgid "must be owner of schema %s" msgstr "нужно быть владельцем Ñхемы %s" -#: catalog/aclchk.c:3743 +#: catalog/aclchk.c:2936 #, c-format msgid "must be owner of statistics object %s" msgstr "нужно быть владельцем объекта ÑтатиÑтики %s" -#: catalog/aclchk.c:3746 +#: catalog/aclchk.c:2939 #, c-format msgid "must be owner of tablespace %s" msgstr "нужно быть владельцем табличного проÑтранÑтва %s" -#: catalog/aclchk.c:3749 +#: catalog/aclchk.c:2942 #, c-format msgid "must be owner of text search configuration %s" msgstr "нужно быть владельцем конфигурации текÑтового поиÑка %s" -#: catalog/aclchk.c:3752 +#: catalog/aclchk.c:2945 #, c-format msgid "must be owner of text search dictionary %s" msgstr "нужно быть владельцем ÑÐ»Ð¾Ð²Ð°Ñ€Ñ Ñ‚ÐµÐºÑтового поиÑка %s" -#: catalog/aclchk.c:3766 +#: catalog/aclchk.c:2959 #, c-format msgid "must be owner of relation %s" msgstr "нужно быть владельцем Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ %s" -#: catalog/aclchk.c:3812 +#: catalog/aclchk.c:3005 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "нет доÑтупа к Ñтолбцу \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\"" -#: catalog/aclchk.c:3957 catalog/aclchk.c:3976 +#: catalog/aclchk.c:3162 catalog/aclchk.c:4170 catalog/aclchk.c:4201 +#, c-format +msgid "%s with OID %u does not exist" +msgstr "%s Ñ OID %u не ÑущеÑтвует" + +#: catalog/aclchk.c:3245 catalog/aclchk.c:3264 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "атрибут %d Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ OID %u не ÑущеÑтвует" -#: catalog/aclchk.c:4071 catalog/aclchk.c:5184 +#: catalog/aclchk.c:3302 catalog/aclchk.c:3365 catalog/aclchk.c:4004 #, c-format msgid "relation with OID %u does not exist" msgstr "отношение Ñ OID %u не ÑущеÑтвует" -#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2581 -#, c-format -msgid "database with OID %u does not exist" -msgstr "база данных Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:4299 +#: catalog/aclchk.c:3550 #, c-format msgid "parameter ACL with OID %u does not exist" msgstr "ACL параметра Ñ OID %u не ÑущеÑтвует" -#: catalog/aclchk.c:4353 catalog/aclchk.c:5262 tcop/fastpath.c:141 -#: utils/fmgr/fmgr.c:2037 -#, c-format -msgid "function with OID %u does not exist" -msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:4407 catalog/aclchk.c:5288 -#, c-format -msgid "language with OID %u does not exist" -msgstr "Ñзык Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 -#: commands/publicationcmds.c:1745 +#: catalog/aclchk.c:3723 commands/collationcmds.c:853 +#: commands/publicationcmds.c:1739 #, c-format msgid "schema with OID %u does not exist" msgstr "Ñхема Ñ OID %u не ÑущеÑтвует" -#: catalog/aclchk.c:4635 catalog/aclchk.c:5387 utils/adt/genfile.c:632 -#, c-format -msgid "tablespace with OID %u does not exist" -msgstr "табличное проÑтранÑтво Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:4694 catalog/aclchk.c:5521 commands/foreigncmds.c:325 -#, c-format -msgid "foreign-data wrapper with OID %u does not exist" -msgstr "обёртка Ñторонних данных Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:4756 catalog/aclchk.c:5548 commands/foreigncmds.c:462 -#, c-format -msgid "foreign server with OID %u does not exist" -msgstr "Ñторонний Ñервер Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:4816 catalog/aclchk.c:5210 utils/cache/typcache.c:385 -#: utils/cache/typcache.c:440 +#: catalog/aclchk.c:3797 catalog/aclchk.c:3824 catalog/aclchk.c:3853 +#: utils/cache/typcache.c:392 utils/cache/typcache.c:447 #, c-format msgid "type with OID %u does not exist" msgstr "тип Ñ OID %u не ÑущеÑтвует" -#: catalog/aclchk.c:5236 -#, c-format -msgid "operator with OID %u does not exist" -msgstr "оператор Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:5413 -#, c-format -msgid "operator class with OID %u does not exist" -msgstr "клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:5440 -#, c-format -msgid "operator family with OID %u does not exist" -msgstr "ÑемейÑтво операторов Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:5467 -#, c-format -msgid "text search dictionary with OID %u does not exist" -msgstr "Ñловарь текÑтового поиÑка Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:5494 -#, c-format -msgid "text search configuration with OID %u does not exist" -msgstr "ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:5575 commands/event_trigger.c:453 -#, c-format -msgid "event trigger with OID %u does not exist" -msgstr "Ñобытийный триггер Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:5628 commands/collationcmds.c:439 -#, c-format -msgid "collation with OID %u does not exist" -msgstr "правило Ñортировки Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:5654 -#, c-format -msgid "conversion with OID %u does not exist" -msgstr "преобразование Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:5695 -#, c-format -msgid "extension with OID %u does not exist" -msgstr "раÑширение Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:5722 commands/publicationcmds.c:1999 -#, c-format -msgid "publication with OID %u does not exist" -msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1742 -#, c-format -msgid "subscription with OID %u does not exist" -msgstr "подпиÑка Ñ OID %u не ÑущеÑтвует" - -#: catalog/aclchk.c:5774 -#, c-format -msgid "statistics object with OID %u does not exist" -msgstr "объект ÑтатиÑтики Ñ OID %u не ÑущеÑтвует" - -#: catalog/catalog.c:447 +#: catalog/catalog.c:477 #, c-format msgid "still searching for an unused OID in relation \"%s\"" msgstr "продолжаетÑÑ Ð¿Ð¾Ð¸Ñк неиÑпользованного OID в отношении \"%s\"" -#: catalog/catalog.c:449 +#: catalog/catalog.c:479 #, c-format msgid "" "OID candidates have been checked %llu time, but no unused OID has been found " @@ -4958,7 +5411,7 @@ msgstr[2] "" "Потенциальные OID были проверены %llu раз, но неиÑпользуемые OID ещё не были " "найдены." -#: catalog/catalog.c:474 +#: catalog/catalog.c:504 #, c-format msgid "new OID has been assigned in relation \"%s\" after %llu retry" msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" @@ -4966,57 +5419,57 @@ msgstr[0] "новый OID был назначен в отношении \"%s\" msgstr[1] "новый OID был назначен в отношении \"%s\" поÑле %llu попыток" msgstr[2] "новый OID был назначен в отношении \"%s\" поÑле %llu попыток" -#: catalog/catalog.c:605 catalog/catalog.c:672 +#: catalog/catalog.c:637 catalog/catalog.c:704 #, c-format msgid "must be superuser to call %s()" msgstr "вызывать %s() может только Ñуперпользователь" -#: catalog/catalog.c:614 +#: catalog/catalog.c:646 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() можно иÑпользовать только Ð´Ð»Ñ ÑиÑтемных каталогов" -#: catalog/catalog.c:619 parser/parse_utilcmd.c:2279 +#: catalog/catalog.c:651 parser/parse_utilcmd.c:2270 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" не принадлежит таблице \"%s\"" -#: catalog/catalog.c:636 +#: catalog/catalog.c:668 #, c-format msgid "column \"%s\" is not of type oid" msgstr "Ñтолбец \"%s\" имеет тип не oid" -#: catalog/catalog.c:643 +#: catalog/catalog.c:675 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" не ÑвлÑетÑÑ Ð¸Ð½Ð´ÐµÐºÑом Ñтолбца \"%s\"" -#: catalog/dependency.c:538 catalog/pg_shdepend.c:657 +#: catalog/dependency.c:497 catalog/pg_shdepend.c:703 #, c-format msgid "cannot drop %s because it is required by the database system" msgstr "удалить объект %s нельзÑ, так как он нужен ÑиÑтеме баз данных" -#: catalog/dependency.c:830 catalog/dependency.c:1057 +#: catalog/dependency.c:789 catalog/dependency.c:1016 #, c-format msgid "cannot drop %s because %s requires it" msgstr "удалить объект %s нельзÑ, так как он нужен объекту %s" -#: catalog/dependency.c:832 catalog/dependency.c:1059 +#: catalog/dependency.c:791 catalog/dependency.c:1018 #, c-format msgid "You can drop %s instead." msgstr "Однако можно удалить %s." -#: catalog/dependency.c:1138 catalog/dependency.c:1147 +#: catalog/dependency.c:1097 catalog/dependency.c:1106 #, c-format msgid "%s depends on %s" msgstr "%s завиÑит от объекта %s" -#: catalog/dependency.c:1162 catalog/dependency.c:1171 +#: catalog/dependency.c:1121 catalog/dependency.c:1130 #, c-format msgid "drop cascades to %s" msgstr "удаление раÑпроÑтранÑетÑÑ Ð½Ð° объект %s" -#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 +#: catalog/dependency.c:1138 catalog/pg_shdepend.c:868 #, c-format msgid "" "\n" @@ -5034,35 +5487,37 @@ msgstr[2] "" "\n" "и ещё %d объектов (Ñм. ÑпиÑок в протоколе Ñервера)" -#: catalog/dependency.c:1191 +#: catalog/dependency.c:1150 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "удалить объект %s нельзÑ, так как от него завиÑÑÑ‚ другие объекты" -#: catalog/dependency.c:1194 catalog/dependency.c:1201 -#: catalog/dependency.c:1212 commands/tablecmds.c:1328 -#: commands/tablecmds.c:14314 commands/tablespace.c:476 commands/user.c:1008 -#: commands/view.c:522 libpq/auth.c:329 replication/syncrep.c:1043 -#: storage/lmgr/deadlock.c:1152 storage/lmgr/proc.c:1413 utils/misc/guc.c:7402 -#: utils/misc/guc.c:7438 utils/misc/guc.c:7508 utils/misc/guc.c:11864 -#: utils/misc/guc.c:11898 utils/misc/guc.c:11932 utils/misc/guc.c:11975 -#: utils/misc/guc.c:12017 +#: catalog/dependency.c:1153 catalog/dependency.c:1160 +#: catalog/dependency.c:1171 commands/tablecmds.c:1459 +#: commands/tablecmds.c:15129 commands/tablespace.c:460 commands/user.c:1302 +#: commands/vacuum.c:211 commands/view.c:441 executor/execExprInterp.c:4655 +#: executor/execExprInterp.c:4663 libpq/auth.c:324 +#: replication/logical/applyparallelworker.c:1041 replication/syncrep.c:1078 +#: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1432 utils/misc/guc.c:3169 +#: utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6825 +#: utils/misc/guc.c:6859 utils/misc/guc.c:6893 utils/misc/guc.c:6936 +#: utils/misc/guc.c:6978 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1195 catalog/dependency.c:1202 +#: catalog/dependency.c:1154 catalog/dependency.c:1161 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Ð”Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð²Ð¸Ñимых объектов иÑпользуйте DROP ... CASCADE." -#: catalog/dependency.c:1199 +#: catalog/dependency.c:1158 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "" "удалить запрошенные объекты нельзÑ, так как от них завиÑÑÑ‚ другие объекты" -#: catalog/dependency.c:1207 +#: catalog/dependency.c:1166 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" @@ -5070,61 +5525,61 @@ msgstr[0] "удаление раÑпроÑтранÑетÑÑ Ð½Ð° ещё %d об msgstr[1] "удаление раÑпроÑтранÑетÑÑ Ð½Ð° ещё %d объекта" msgstr[2] "удаление раÑпроÑтранÑетÑÑ Ð½Ð° ещё %d объектов" -#: catalog/dependency.c:1889 +#: catalog/dependency.c:1850 #, c-format msgid "constant of the type %s cannot be used here" msgstr "конÑтанту типа %s здеÑÑŒ иÑпользовать нельзÑ" -#: catalog/dependency.c:2410 parser/parse_relation.c:3369 -#: parser/parse_relation.c:3379 +#: catalog/dependency.c:2375 parser/parse_relation.c:3407 +#: parser/parse_relation.c:3417 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "Ñтолбец %d Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" не ÑущеÑтвует" -#: catalog/heap.c:324 +#: catalog/heap.c:326 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "нет прав Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\"" -#: catalog/heap.c:326 +#: catalog/heap.c:328 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Изменение ÑиÑтемного каталога в текущем ÑоÑтоÑнии запрещено." -#: catalog/heap.c:466 commands/tablecmds.c:2348 commands/tablecmds.c:2985 -#: commands/tablecmds.c:6821 +#: catalog/heap.c:468 commands/tablecmds.c:2495 commands/tablecmds.c:2917 +#: commands/tablecmds.c:7163 #, c-format msgid "tables can have at most %d columns" msgstr "макÑимальное чиÑло Ñтолбцов в таблице: %d" -#: catalog/heap.c:484 commands/tablecmds.c:7121 +#: catalog/heap.c:486 commands/tablecmds.c:7465 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "Ð¸Ð¼Ñ Ñтолбца \"%s\" конфликтует Ñ ÑиÑтемным Ñтолбцом" -#: catalog/heap.c:500 +#: catalog/heap.c:502 #, c-format msgid "column name \"%s\" specified more than once" msgstr "Ð¸Ð¼Ñ Ñтолбца \"%s\" указано неоднократно" #. translator: first %s is an integer not a name -#: catalog/heap.c:575 +#: catalog/heap.c:580 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "Ñтолбец \"%s\" ключа Ñ€Ð°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ пÑевдотип %s" -#: catalog/heap.c:580 +#: catalog/heap.c:585 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "Ñтолбец \"%s\" имеет пÑевдотип %s" -#: catalog/heap.c:611 +#: catalog/heap.c:616 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "ÑоÑтавной тип %s не может Ñодержать ÑÐµÐ±Ñ Ð¶Ðµ" #. translator: first %s is an integer not a name -#: catalog/heap.c:666 +#: catalog/heap.c:671 #, c-format msgid "" "no collation was derived for partition key column %s with collatable type %s" @@ -5132,28 +5587,28 @@ msgstr "" "Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщего в ключ Ñ€Ð°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ñтолбца \"%s\" Ñ Ñортируемым типом %s не " "удалоÑÑŒ получить правило Ñортировки" -#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:677 commands/createas.c:198 commands/createas.c:505 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "" "Ð´Ð»Ñ Ñтолбца \"%s\" Ñ Ñортируемым типом %s не удалоÑÑŒ получить правило " "Ñортировки" -#: catalog/heap.c:1148 catalog/index.c:874 commands/createas.c:408 -#: commands/tablecmds.c:3890 +#: catalog/heap.c:1162 catalog/index.c:899 commands/createas.c:401 +#: commands/tablecmds.c:4171 #, c-format msgid "relation \"%s\" already exists" msgstr "отношение \"%s\" уже ÑущеÑтвует" -#: catalog/heap.c:1164 catalog/pg_type.c:436 catalog/pg_type.c:784 -#: catalog/pg_type.c:931 commands/typecmds.c:249 commands/typecmds.c:261 -#: commands/typecmds.c:754 commands/typecmds.c:1169 commands/typecmds.c:1395 -#: commands/typecmds.c:1575 commands/typecmds.c:2547 +#: catalog/heap.c:1178 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: catalog/pg_type.c:977 commands/typecmds.c:253 commands/typecmds.c:265 +#: commands/typecmds.c:758 commands/typecmds.c:1179 commands/typecmds.c:1405 +#: commands/typecmds.c:1585 commands/typecmds.c:2556 #, c-format msgid "type \"%s\" already exists" msgstr "тип \"%s\" уже ÑущеÑтвует" -#: catalog/heap.c:1165 +#: catalog/heap.c:1179 #, c-format msgid "" "A relation has an associated type of the same name, so you must use a name " @@ -5162,53 +5617,54 @@ msgstr "" "С отношением уже ÑвÑзан тип Ñ Ñ‚Ð°ÐºÐ¸Ð¼ же именем; выберите имÑ, не " "конфликтующее Ñ ÑущеÑтвующими типами." -#: catalog/heap.c:1205 +#: catalog/heap.c:1219 #, c-format -msgid "toast relfilenode value not set when in binary upgrade mode" -msgstr "значение relfilenode Ð´Ð»Ñ TOAST не задано в режиме двоичного обновлениÑ" +msgid "toast relfilenumber value not set when in binary upgrade mode" +msgstr "" +"значение relfilenumber Ð´Ð»Ñ TOAST не задано в режиме двоичного обновлениÑ" -#: catalog/heap.c:1216 +#: catalog/heap.c:1230 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "значение OID кучи в pg_class не задано в режиме двоичного обновлениÑ" -#: catalog/heap.c:1226 +#: catalog/heap.c:1240 #, c-format -msgid "relfilenode value not set when in binary upgrade mode" -msgstr "значение relfilenode не задано в режиме двоичного обновлениÑ" +msgid "relfilenumber value not set when in binary upgrade mode" +msgstr "значение relfilenumber не задано в режиме двоичного обновлениÑ" -#: catalog/heap.c:2127 +#: catalog/heap.c:2185 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "" "добавить ограничение NO INHERIT к Ñекционированной таблице \"%s\" нельзÑ" -#: catalog/heap.c:2401 +#: catalog/heap.c:2452 #, c-format msgid "check constraint \"%s\" already exists" msgstr "ограничение-проверка \"%s\" уже ÑущеÑтвует" -#: catalog/heap.c:2571 catalog/index.c:888 catalog/pg_constraint.c:689 -#: commands/tablecmds.c:8823 +#: catalog/heap.c:2624 catalog/index.c:913 catalog/pg_constraint.c:725 +#: commands/tablecmds.c:9389 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "ограничение \"%s\" Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" уже ÑущеÑтвует" -#: catalog/heap.c:2578 +#: catalog/heap.c:2631 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "" "ограничение \"%s\" конфликтует Ñ Ð½ÐµÐ½Ð°Ñледуемым ограничением таблицы \"%s\"" -#: catalog/heap.c:2589 +#: catalog/heap.c:2642 #, c-format msgid "" "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "" "ограничение \"%s\" конфликтует Ñ Ð½Ð°Ñледуемым ограничением таблицы \"%s\"" -#: catalog/heap.c:2599 +#: catalog/heap.c:2652 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" @@ -5216,64 +5672,71 @@ msgstr "" "ограничение \"%s\" конфликтует Ñ Ð½ÐµÐ¿Ñ€Ð¾Ð²ÐµÑ€ÐµÐ½Ð½Ñ‹Ð¼ (NOT VALID) ограничением " "таблицы \"%s\"" -#: catalog/heap.c:2604 +#: catalog/heap.c:2657 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "ÑлиÑние Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ \"%s\" Ñ ÑƒÐ½Ð°Ñледованным определением" -#: catalog/heap.c:2709 +#: catalog/heap.c:2683 catalog/pg_constraint.c:854 commands/tablecmds.c:3074 +#: commands/tablecmds.c:3377 commands/tablecmds.c:7089 +#: commands/tablecmds.c:15948 commands/tablecmds.c:16079 +#, c-format +msgid "too many inheritance parents" +msgstr "Ñлишком много родителей в иерархии наÑледованиÑ" + +#: catalog/heap.c:2767 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "" "иÑпользовать генерируемый Ñтолбец \"%s\" в выражении генерируемого Ñтолбца " "нельзÑ" -#: catalog/heap.c:2711 +#: catalog/heap.c:2769 #, c-format msgid "A generated column cannot reference another generated column." msgstr "" "Генерируемый Ñтолбец не может ÑÑылатьÑÑ Ð½Ð° другой генерируемый Ñтолбец." -#: catalog/heap.c:2717 +#: catalog/heap.c:2775 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "" "в выражении генерируемого Ñтолбца Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать переменные «вÑÑ Ñтрока»" -#: catalog/heap.c:2718 +#: catalog/heap.c:2776 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "" "Это Ñделало бы генерируемый Ñтолбец завиÑимым от ÑобÑтвенного значениÑ." -#: catalog/heap.c:2771 +#: catalog/heap.c:2831 #, c-format msgid "generation expression is not immutable" msgstr "генерирующее выражение не ÑвлÑетÑÑ Ð¿Ð¾ÑтоÑнным" -#: catalog/heap.c:2799 rewrite/rewriteHandler.c:1273 +#: catalog/heap.c:2859 rewrite/rewriteHandler.c:1276 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "Ñтолбец \"%s\" имеет тип %s, но тип Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию %s" -#: catalog/heap.c:2804 commands/prepare.c:334 parser/analyze.c:2692 -#: parser/parse_target.c:594 parser/parse_target.c:882 -#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1278 +#: catalog/heap.c:2864 commands/prepare.c:331 parser/analyze.c:2758 +#: parser/parse_target.c:592 parser/parse_target.c:882 +#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1281 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Перепишите выражение или преобразуйте его тип." -#: catalog/heap.c:2851 +#: catalog/heap.c:2911 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "в ограничении-проверке можно ÑÑылатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на таблицу \"%s\"" -#: catalog/heap.c:3149 +#: catalog/heap.c:3217 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "неподдерживаемое Ñочетание внешнего ключа Ñ ON COMMIT" -#: catalog/heap.c:3150 +#: catalog/heap.c:3218 #, c-format msgid "" "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT " @@ -5281,491 +5744,501 @@ msgid "" msgstr "" "Таблица \"%s\" ÑÑылаетÑÑ Ð½Ð° \"%s\", и Ð´Ð»Ñ Ð½Ð¸Ñ… задан разный режим ON COMMIT." -#: catalog/heap.c:3155 +#: catalog/heap.c:3223 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "опуÑтошить таблицу, на которую ÑÑылаетÑÑ Ð²Ð½ÐµÑˆÐ½Ð¸Ð¹ ключ, нельзÑ" -#: catalog/heap.c:3156 +#: catalog/heap.c:3224 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Таблица \"%s\" ÑÑылаетÑÑ Ð½Ð° \"%s\"." -#: catalog/heap.c:3158 +#: catalog/heap.c:3226 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "" "ОпуÑтошите таблицу \"%s\" параллельно или иÑпользуйте TRUNCATE ... CASCADE." -#: catalog/index.c:223 parser/parse_utilcmd.c:2184 +#: catalog/index.c:219 parser/parse_utilcmd.c:2176 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "таблица \"%s\" не может иметь неÑколько первичных ключей" -#: catalog/index.c:241 +#: catalog/index.c:233 +#, c-format +msgid "primary keys cannot use NULLS NOT DISTINCT indexes" +msgstr "Ð´Ð»Ñ Ð¿ÐµÑ€Ð²Ð¸Ñ‡Ð½Ñ‹Ñ… ключей Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать индекÑÑ‹ Ñ NULLS NOT DISTINCT" + +#: catalog/index.c:250 #, c-format msgid "primary keys cannot be expressions" msgstr "первичные ключи не могут быть выражениÑми" -#: catalog/index.c:258 +#: catalog/index.c:267 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "Ñтолбец первичного ключа \"%s\" не помечен как NOT NULL" -#: catalog/index.c:773 catalog/index.c:1932 +#: catalog/index.c:798 catalog/index.c:1915 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "" "пользовательÑкие индекÑÑ‹ в таблицах ÑиÑтемного каталога не поддерживаютÑÑ" -#: catalog/index.c:813 +#: catalog/index.c:838 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "" "недетерминированные правила Ñортировки не поддерживаютÑÑ Ð´Ð»Ñ ÐºÐ»Ð°ÑÑа " "операторов \"%s\"" -#: catalog/index.c:828 +#: catalog/index.c:853 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "" "параллельное Ñоздание индекÑа в таблицах ÑиÑтемного каталога не " "поддерживаетÑÑ" -#: catalog/index.c:837 catalog/index.c:1305 +#: catalog/index.c:862 catalog/index.c:1331 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "" "параллельное Ñоздание индекÑа Ð´Ð»Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ð¹-иÑключений не поддерживаетÑÑ" -#: catalog/index.c:846 +#: catalog/index.c:871 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать разделÑемые индекÑÑ‹ поÑле initdb" -#: catalog/index.c:866 commands/createas.c:423 commands/sequence.c:158 -#: parser/parse_utilcmd.c:211 +#: catalog/index.c:891 commands/createas.c:416 commands/sequence.c:159 +#: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "отношение \"%s\" уже ÑущеÑтвует, пропуÑкаетÑÑ" -#: catalog/index.c:916 +#: catalog/index.c:941 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "" "значение OID индекÑа в pg_class не задано в режиме двоичного обновлениÑ" -#: catalog/index.c:926 utils/cache/relcache.c:3743 +#: catalog/index.c:951 utils/cache/relcache.c:3791 #, c-format -msgid "index relfilenode value not set when in binary upgrade mode" +msgid "index relfilenumber value not set when in binary upgrade mode" msgstr "" -"значение relfilenode Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа не задано в режиме двоичного обновлениÑ" +"значение relfilenumber Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа не задано в режиме двоичного обновлениÑ" -#: catalog/index.c:2231 +#: catalog/index.c:2214 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY должен быть первым дейÑтвием в транзакции" -#: catalog/index.c:3635 +#: catalog/index.c:3668 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "переиндекÑировать временные таблицы других ÑеанÑов нельзÑ" -#: catalog/index.c:3646 commands/indexcmds.c:3543 +#: catalog/index.c:3679 commands/indexcmds.c:3626 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "переÑтроить нерабочий Ð¸Ð½Ð´ÐµÐºÑ Ð² таблице TOAST нельзÑ" -#: catalog/index.c:3662 commands/indexcmds.c:3423 commands/indexcmds.c:3567 -#: commands/tablecmds.c:3305 +#: catalog/index.c:3695 commands/indexcmds.c:3504 commands/indexcmds.c:3650 +#: commands/tablecmds.c:3581 #, c-format msgid "cannot move system relation \"%s\"" msgstr "перемеÑтить ÑиÑтемную таблицу \"%s\" нельзÑ" -#: catalog/index.c:3806 +#: catalog/index.c:3832 #, c-format msgid "index \"%s\" was reindexed" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" был переÑтроен" -#: catalog/index.c:3943 +#: catalog/index.c:3998 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "" "переÑтроить нерабочий Ð¸Ð½Ð´ÐµÐºÑ \"%s.%s\" в таблице TOAST нельзÑ, он " "пропуÑкаетÑÑ" -#: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 -#: commands/trigger.c:5718 +#: catalog/namespace.c:462 catalog/namespace.c:666 catalog/namespace.c:758 +#: commands/trigger.c:5729 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "ÑÑылки между базами не реализованы: \"%s.%s.%s\"" -#: catalog/namespace.c:316 +#: catalog/namespace.c:519 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ… таблиц Ð¸Ð¼Ñ Ñхемы не указываетÑÑ" -#: catalog/namespace.c:397 +#: catalog/namespace.c:600 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" msgstr "не удалоÑÑŒ получить блокировку таблицы \"%s.%s\"" -#: catalog/namespace.c:402 commands/lockcmds.c:144 commands/lockcmds.c:233 +#: catalog/namespace.c:605 commands/lockcmds.c:143 commands/lockcmds.c:223 #, c-format msgid "could not obtain lock on relation \"%s\"" msgstr "не удалоÑÑŒ получить блокировку таблицы \"%s\"" -#: catalog/namespace.c:430 parser/parse_relation.c:1373 +#: catalog/namespace.c:633 parser/parse_relation.c:1430 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "отношение \"%s.%s\" не ÑущеÑтвует" -#: catalog/namespace.c:435 parser/parse_relation.c:1386 -#: parser/parse_relation.c:1394 +#: catalog/namespace.c:638 parser/parse_relation.c:1443 +#: parser/parse_relation.c:1451 utils/adt/regproc.c:913 #, c-format msgid "relation \"%s\" does not exist" msgstr "отношение \"%s\" не ÑущеÑтвует" -#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1535 -#: commands/extension.c:1541 +#: catalog/namespace.c:704 catalog/namespace.c:3522 commands/extension.c:1607 +#: commands/extension.c:1613 #, c-format msgid "no schema has been selected to create in" msgstr "Ñхема Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð² не выбрана" -#: catalog/namespace.c:653 catalog/namespace.c:666 +#: catalog/namespace.c:856 catalog/namespace.c:869 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "во временных Ñхемах других ÑеанÑов Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать отношениÑ" -#: catalog/namespace.c:657 +#: catalog/namespace.c:860 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "Ñоздавать временные Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ только во временных Ñхемах" -#: catalog/namespace.c:672 +#: catalog/namespace.c:875 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "во временных Ñхемах можно Ñоздавать только временные отношениÑ" -#: catalog/namespace.c:2268 +#: catalog/namespace.c:2619 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "объект ÑтатиÑтики \"%s\" не ÑущеÑтвует" -#: catalog/namespace.c:2391 +#: catalog/namespace.c:2761 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "анализатор текÑтового поиÑка \"%s\" не ÑущеÑтвует" -#: catalog/namespace.c:2517 +#: catalog/namespace.c:2906 utils/adt/regproc.c:1459 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "Ñловарь текÑтового поиÑка \"%s\" не ÑущеÑтвует" -#: catalog/namespace.c:2644 +#: catalog/namespace.c:3052 #, c-format msgid "text search template \"%s\" does not exist" msgstr "шаблон текÑтового поиÑка \"%s\" не ÑущеÑтвует" -#: catalog/namespace.c:2770 commands/tsearchcmds.c:1121 -#: utils/cache/ts_cache.c:613 +#: catalog/namespace.c:3197 commands/tsearchcmds.c:1168 +#: utils/adt/regproc.c:1349 utils/cache/ts_cache.c:635 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка \"%s\" не ÑущеÑтвует" -#: catalog/namespace.c:2883 parser/parse_expr.c:806 parser/parse_target.c:1255 +#: catalog/namespace.c:3329 parser/parse_expr.c:868 parser/parse_target.c:1259 #, c-format msgid "cross-database references are not implemented: %s" msgstr "ÑÑылки между базами не реализованы: %s" -#: catalog/namespace.c:2889 parser/parse_expr.c:813 parser/parse_target.c:1262 -#: gram.y:18258 gram.y:18298 +#: catalog/namespace.c:3335 parser/parse_expr.c:875 parser/parse_target.c:1266 +#: gram.y:19181 gram.y:19221 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неверное полное Ð¸Ð¼Ñ (Ñлишком много компонентов): %s" -#: catalog/namespace.c:3019 +#: catalog/namespace.c:3465 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "перемещать объекты в/из внутренних Ñхем нельзÑ" -#: catalog/namespace.c:3025 +#: catalog/namespace.c:3471 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "перемещать объекты в/из Ñхем TOAST нельзÑ" -#: catalog/namespace.c:3098 commands/schemacmds.c:245 commands/schemacmds.c:325 -#: commands/tablecmds.c:1273 +#: catalog/namespace.c:3544 commands/schemacmds.c:264 commands/schemacmds.c:344 +#: commands/tablecmds.c:1404 utils/adt/regproc.c:1688 #, c-format msgid "schema \"%s\" does not exist" msgstr "Ñхема \"%s\" не ÑущеÑтвует" -#: catalog/namespace.c:3129 +#: catalog/namespace.c:3575 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "неверное Ð¸Ð¼Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ (Ñлишком много компонентов): %s" -#: catalog/namespace.c:3692 +#: catalog/namespace.c:4016 utils/adt/regproc.c:1056 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "правило Ñортировки \"%s\" Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸ \"%s\" не ÑущеÑтвует" -#: catalog/namespace.c:3747 +#: catalog/namespace.c:4071 #, c-format msgid "conversion \"%s\" does not exist" msgstr "преобразование \"%s\" не ÑущеÑтвует" -#: catalog/namespace.c:4011 +#: catalog/namespace.c:4412 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "нет прав Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ… таблиц в базе \"%s\"" -#: catalog/namespace.c:4027 +#: catalog/namespace.c:4428 #, c-format msgid "cannot create temporary tables during recovery" msgstr "Ñоздавать временные таблицы в процеÑÑе воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ" -#: catalog/namespace.c:4033 +#: catalog/namespace.c:4434 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "Ñоздавать временные таблицы во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" -#: catalog/namespace.c:4334 commands/tablespace.c:1236 commands/variable.c:64 -#: utils/misc/guc.c:12049 utils/misc/guc.c:12151 -#, c-format -msgid "List syntax is invalid." -msgstr "Ошибка ÑинтакÑиÑа в ÑпиÑке." - -#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 -#: commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 -#: commands/tablecmds.c:12284 +#: catalog/objectaddress.c:1371 commands/policy.c:93 commands/policy.c:373 +#: commands/tablecmds.c:257 commands/tablecmds.c:299 commands/tablecmds.c:2327 +#: commands/tablecmds.c:12966 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" - Ñто не таблица" -#: catalog/objectaddress.c:1398 commands/tablecmds.c:259 -#: commands/tablecmds.c:17109 commands/view.c:119 +#: catalog/objectaddress.c:1378 commands/tablecmds.c:269 +#: commands/tablecmds.c:17892 commands/view.c:114 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" - Ñто не предÑтавление" -#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:265 -#: commands/tablecmds.c:17114 +#: catalog/objectaddress.c:1385 commands/matview.c:199 commands/tablecmds.c:275 +#: commands/tablecmds.c:17897 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" - Ñто не материализованное предÑтавление" -#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 -#: commands/tablecmds.c:17119 +#: catalog/objectaddress.c:1392 commands/tablecmds.c:293 +#: commands/tablecmds.c:17902 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" - Ñто не ÑтороннÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð°" -#: catalog/objectaddress.c:1453 +#: catalog/objectaddress.c:1433 #, c-format msgid "must specify relation and object name" msgstr "необходимо указать Ð¸Ð¼Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð¸ объекта" -#: catalog/objectaddress.c:1529 catalog/objectaddress.c:1582 +#: catalog/objectaddress.c:1509 catalog/objectaddress.c:1562 #, c-format msgid "column name must be qualified" msgstr "Ð¸Ð¼Ñ Ñтолбца нужно указать в полной форме" -#: catalog/objectaddress.c:1601 +#: catalog/objectaddress.c:1581 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "" "значение по умолчанию Ð´Ð»Ñ Ñтолбца \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" не ÑущеÑтвует" -#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 -#: commands/tablecmds.c:275 commands/typecmds.c:274 commands/typecmds.c:3700 -#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:795 -#: utils/adt/acl.c:4434 +#: catalog/objectaddress.c:1618 commands/functioncmds.c:132 +#: commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3843 +#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 +#: utils/adt/acl.c:4560 #, c-format msgid "type \"%s\" does not exist" msgstr "тип \"%s\" не ÑущеÑтвует" -#: catalog/objectaddress.c:1757 +#: catalog/objectaddress.c:1737 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "оператор %d (%s, %s) из ÑемейÑтва %s не ÑущеÑтвует" -#: catalog/objectaddress.c:1788 +#: catalog/objectaddress.c:1768 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %d (%s, %s) из ÑемейÑтва %s не ÑущеÑтвует" -#: catalog/objectaddress.c:1839 catalog/objectaddress.c:1865 +#: catalog/objectaddress.c:1819 catalog/objectaddress.c:1845 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "ÑопоÑтавление Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" на Ñервере \"%s\" не ÑущеÑтвует" -#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:691 +#: catalog/objectaddress.c:1834 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:713 #, c-format msgid "server \"%s\" does not exist" msgstr "Ñервер \"%s\" не ÑущеÑтвует" -#: catalog/objectaddress.c:1921 +#: catalog/objectaddress.c:1901 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "публикуемое отношение \"%s\" в публикации \"%s\" не ÑущеÑтвует" -#: catalog/objectaddress.c:1968 +#: catalog/objectaddress.c:1948 #, c-format msgid "publication schema \"%s\" in publication \"%s\" does not exist" msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÑƒÐµÐ¼Ð°Ñ Ñхема \"%s\" в публикации \"%s\" не ÑущеÑтвует" -#: catalog/objectaddress.c:2026 +#: catalog/objectaddress.c:2006 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "нераÑпознанный тип объекта ACL по умолчанию: \"%c\"" -#: catalog/objectaddress.c:2027 +#: catalog/objectaddress.c:2007 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "ДопуÑтимые типы объектов: \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." -#: catalog/objectaddress.c:2078 +#: catalog/objectaddress.c:2058 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "" "ACL по умолчанию Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" в Ñхеме \"%s\" Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° %s не " "ÑущеÑтвует" -#: catalog/objectaddress.c:2083 +#: catalog/objectaddress.c:2063 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "" "ACL по умолчанию Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" и Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° %s не ÑущеÑтвует" -#: catalog/objectaddress.c:2110 catalog/objectaddress.c:2168 -#: catalog/objectaddress.c:2225 +#: catalog/objectaddress.c:2089 catalog/objectaddress.c:2146 +#: catalog/objectaddress.c:2201 #, c-format msgid "name or argument lists may not contain nulls" msgstr "ÑпиÑки имён и аргументов не должны Ñодержать NULL" -#: catalog/objectaddress.c:2144 +#: catalog/objectaddress.c:2123 #, c-format msgid "unsupported object type \"%s\"" msgstr "неподдерживаемый тип объекта: \"%s\"" -#: catalog/objectaddress.c:2164 catalog/objectaddress.c:2182 -#: catalog/objectaddress.c:2247 catalog/objectaddress.c:2331 +#: catalog/objectaddress.c:2142 catalog/objectaddress.c:2159 +#: catalog/objectaddress.c:2224 catalog/objectaddress.c:2308 #, c-format msgid "name list length must be exactly %d" msgstr "длина ÑпиÑка имён должна быть равна %d" -#: catalog/objectaddress.c:2186 +#: catalog/objectaddress.c:2163 #, c-format msgid "large object OID may not be null" msgstr "OID большого объекта не может быть NULL" -#: catalog/objectaddress.c:2195 catalog/objectaddress.c:2265 -#: catalog/objectaddress.c:2272 +#: catalog/objectaddress.c:2172 catalog/objectaddress.c:2242 +#: catalog/objectaddress.c:2249 #, c-format msgid "name list length must be at least %d" msgstr "длина ÑпиÑка аргументов должна быть не меньше %d" -#: catalog/objectaddress.c:2258 catalog/objectaddress.c:2279 +#: catalog/objectaddress.c:2235 catalog/objectaddress.c:2256 #, c-format msgid "argument list length must be exactly %d" msgstr "длина ÑпиÑка аргументов должна быть равна %d" -#: catalog/objectaddress.c:2533 libpq/be-fsstubs.c:318 +#: catalog/objectaddress.c:2470 libpq/be-fsstubs.c:329 #, c-format msgid "must be owner of large object %u" msgstr "нужно быть владельцем большого объекта %u" -#: catalog/objectaddress.c:2548 commands/functioncmds.c:1566 +#: catalog/objectaddress.c:2485 commands/functioncmds.c:1560 #, c-format msgid "must be owner of type %s or type %s" msgstr "Ñто разрешено только владельцу типа %s или %s" -#: catalog/objectaddress.c:2598 catalog/objectaddress.c:2616 +#: catalog/objectaddress.c:2512 catalog/objectaddress.c:2521 +#: catalog/objectaddress.c:2527 #, c-format -msgid "must be superuser" -msgstr "требуютÑÑ Ð¿Ñ€Ð°Ð²Ð° ÑуперпользователÑ" +msgid "permission denied" +msgstr "нет доÑтупа" -#: catalog/objectaddress.c:2605 +#: catalog/objectaddress.c:2513 catalog/objectaddress.c:2522 #, c-format -msgid "must have CREATEROLE privilege" -msgstr "требуетÑÑ Ð¿Ñ€Ð°Ð²Ð¾ CREATEROLE" +msgid "The current user must have the %s attribute." +msgstr "Текущий пользователь должен иметь атрибут %s." -#: catalog/objectaddress.c:2686 +#: catalog/objectaddress.c:2528 +#, c-format +msgid "The current user must have the %s option on role \"%s\"." +msgstr "Текущий пользователь должен иметь привилегию %s Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ \"%s\"." + +#: catalog/objectaddress.c:2542 +#, c-format +msgid "must be superuser" +msgstr "требуютÑÑ Ð¿Ñ€Ð°Ð²Ð° ÑуперпользователÑ" + +#: catalog/objectaddress.c:2611 #, c-format msgid "unrecognized object type \"%s\"" msgstr "нераÑпознанный тип объекта \"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2978 +#: catalog/objectaddress.c:2928 #, c-format msgid "column %s of %s" msgstr "Ñтолбец %s Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ %s" -#: catalog/objectaddress.c:2993 +#: catalog/objectaddress.c:2943 #, c-format msgid "function %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s" -#: catalog/objectaddress.c:3006 +#: catalog/objectaddress.c:2956 #, c-format msgid "type %s" msgstr "тип %s" -#: catalog/objectaddress.c:3043 +#: catalog/objectaddress.c:2993 #, c-format msgid "cast from %s to %s" msgstr "приведение %s к %s" -#: catalog/objectaddress.c:3076 +#: catalog/objectaddress.c:3026 #, c-format msgid "collation %s" msgstr "правило Ñортировки %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3107 +#: catalog/objectaddress.c:3057 #, c-format msgid "constraint %s on %s" msgstr "ограничение %s в отношении %s" -#: catalog/objectaddress.c:3113 +#: catalog/objectaddress.c:3063 #, c-format msgid "constraint %s" msgstr "ограничение %s" -#: catalog/objectaddress.c:3145 +#: catalog/objectaddress.c:3095 #, c-format msgid "conversion %s" msgstr "преобразование %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3167 +#: catalog/objectaddress.c:3117 #, c-format msgid "default value for %s" msgstr "значение по умолчанию Ð´Ð»Ñ %s" -#: catalog/objectaddress.c:3178 +#: catalog/objectaddress.c:3128 #, c-format msgid "language %s" msgstr "Ñзык %s" -#: catalog/objectaddress.c:3186 +#: catalog/objectaddress.c:3136 #, c-format msgid "large object %u" msgstr "большой объект %u" -#: catalog/objectaddress.c:3199 +#: catalog/objectaddress.c:3149 #, c-format msgid "operator %s" msgstr "оператор %s" -#: catalog/objectaddress.c:3236 +#: catalog/objectaddress.c:3186 #, c-format msgid "operator class %s for access method %s" msgstr "клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² %s Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° доÑтупа %s" -#: catalog/objectaddress.c:3264 +#: catalog/objectaddress.c:3214 #, c-format msgid "access method %s" msgstr "метод доÑтупа %s" @@ -5774,7 +6247,7 @@ msgstr "метод доÑтупа %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3313 +#: catalog/objectaddress.c:3269 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "оператор %d (%s, %s) из ÑемейÑтва \"%s\": %s" @@ -5783,236 +6256,241 @@ msgstr "оператор %d (%s, %s) из ÑемейÑтва \"%s\": %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3370 +#: catalog/objectaddress.c:3334 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %d (%s, %s) из ÑемейÑтва \"%s\": %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3422 +#: catalog/objectaddress.c:3388 #, c-format msgid "rule %s on %s" msgstr "правило %s Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3468 +#: catalog/objectaddress.c:3434 #, c-format msgid "trigger %s on %s" msgstr "триггер %s в отношении %s" -#: catalog/objectaddress.c:3488 +#: catalog/objectaddress.c:3454 #, c-format msgid "schema %s" msgstr "Ñхема %s" -#: catalog/objectaddress.c:3516 +#: catalog/objectaddress.c:3482 #, c-format msgid "statistics object %s" msgstr "объект ÑтатиÑтики %s" -#: catalog/objectaddress.c:3547 +#: catalog/objectaddress.c:3513 #, c-format msgid "text search parser %s" msgstr "анализатор текÑтового поиÑка %s" -#: catalog/objectaddress.c:3578 +#: catalog/objectaddress.c:3544 #, c-format msgid "text search dictionary %s" msgstr "Ñловарь текÑтового поиÑка %s" -#: catalog/objectaddress.c:3609 +#: catalog/objectaddress.c:3575 #, c-format msgid "text search template %s" msgstr "шаблон текÑтового поиÑка %s" -#: catalog/objectaddress.c:3640 +#: catalog/objectaddress.c:3606 #, c-format msgid "text search configuration %s" msgstr "ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка %s" -#: catalog/objectaddress.c:3653 +#: catalog/objectaddress.c:3619 #, c-format msgid "role %s" msgstr "роль %s" -#: catalog/objectaddress.c:3669 +#: catalog/objectaddress.c:3656 catalog/objectaddress.c:5505 +#, c-format +msgid "membership of role %s in role %s" +msgstr "членÑтво роли %s в роли %s" + +#: catalog/objectaddress.c:3677 #, c-format msgid "database %s" msgstr "база данных %s" -#: catalog/objectaddress.c:3685 +#: catalog/objectaddress.c:3693 #, c-format msgid "tablespace %s" msgstr "табличное проÑтранÑтво %s" -#: catalog/objectaddress.c:3696 +#: catalog/objectaddress.c:3704 #, c-format msgid "foreign-data wrapper %s" msgstr "обёртка Ñторонних данных %s" -#: catalog/objectaddress.c:3706 +#: catalog/objectaddress.c:3714 #, c-format msgid "server %s" msgstr "Ñервер %s" -#: catalog/objectaddress.c:3739 +#: catalog/objectaddress.c:3747 #, c-format msgid "user mapping for %s on server %s" msgstr "ÑопоÑтавление Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %s на Ñервере %s" -#: catalog/objectaddress.c:3791 +#: catalog/objectaddress.c:3799 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "" "права по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… отношений, принадлежащих роли %s в Ñхеме %s" -#: catalog/objectaddress.c:3795 +#: catalog/objectaddress.c:3803 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "права по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… отношений, принадлежащих роли %s" -#: catalog/objectaddress.c:3801 +#: catalog/objectaddress.c:3809 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "" "права по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… поÑледовательноÑтей, принадлежащих роли %s в " "Ñхеме %s" -#: catalog/objectaddress.c:3805 +#: catalog/objectaddress.c:3813 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "" "права по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… поÑледовательноÑтей, принадлежащих роли %s" -#: catalog/objectaddress.c:3811 +#: catalog/objectaddress.c:3819 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "права по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… функций, принадлежащих роли %s в Ñхеме %s" -#: catalog/objectaddress.c:3815 +#: catalog/objectaddress.c:3823 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "права по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… функций, принадлежащих роли %s" -#: catalog/objectaddress.c:3821 +#: catalog/objectaddress.c:3829 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "права по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… типов, принадлежащих роли %s в Ñхеме %s" -#: catalog/objectaddress.c:3825 +#: catalog/objectaddress.c:3833 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "права по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… типов, принадлежащих роли %s" -#: catalog/objectaddress.c:3831 +#: catalog/objectaddress.c:3839 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "права по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… Ñхем, принадлежащих роли %s" -#: catalog/objectaddress.c:3838 +#: catalog/objectaddress.c:3846 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "" "права по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… объектов, принадлежащих роли %s в Ñхеме %s" -#: catalog/objectaddress.c:3842 +#: catalog/objectaddress.c:3850 #, c-format msgid "default privileges belonging to role %s" msgstr "права по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… объектов, принадлежащих роли %s" -#: catalog/objectaddress.c:3864 +#: catalog/objectaddress.c:3872 #, c-format msgid "extension %s" msgstr "раÑширение %s" -#: catalog/objectaddress.c:3881 +#: catalog/objectaddress.c:3889 #, c-format msgid "event trigger %s" msgstr "Ñобытийный триггер %s" -#: catalog/objectaddress.c:3908 +#: catalog/objectaddress.c:3913 #, c-format msgid "parameter %s" msgstr "параметр %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3951 +#: catalog/objectaddress.c:3956 #, c-format msgid "policy %s on %s" msgstr "политика %s Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ %s" -#: catalog/objectaddress.c:3965 +#: catalog/objectaddress.c:3970 #, c-format msgid "publication %s" msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ %s" -#: catalog/objectaddress.c:3978 +#: catalog/objectaddress.c:3983 #, c-format msgid "publication of schema %s in publication %s" msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñхемы %s в публикации %s" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:4009 +#: catalog/objectaddress.c:4014 #, c-format msgid "publication of %s in publication %s" msgstr "публикуемое отношение %s в публикации %s" -#: catalog/objectaddress.c:4022 +#: catalog/objectaddress.c:4027 #, c-format msgid "subscription %s" msgstr "подпиÑка %s" -#: catalog/objectaddress.c:4043 +#: catalog/objectaddress.c:4048 #, c-format msgid "transform for %s language %s" msgstr "преобразование Ð´Ð»Ñ %s, Ñзыка %s" -#: catalog/objectaddress.c:4114 +#: catalog/objectaddress.c:4117 #, c-format msgid "table %s" msgstr "таблица %s" -#: catalog/objectaddress.c:4119 +#: catalog/objectaddress.c:4122 #, c-format msgid "index %s" msgstr "Ð¸Ð½Ð´ÐµÐºÑ %s" -#: catalog/objectaddress.c:4123 +#: catalog/objectaddress.c:4126 #, c-format msgid "sequence %s" msgstr "поÑледовательноÑть %s" -#: catalog/objectaddress.c:4127 +#: catalog/objectaddress.c:4130 #, c-format msgid "toast table %s" msgstr "TOAST-таблица %s" -#: catalog/objectaddress.c:4131 +#: catalog/objectaddress.c:4134 #, c-format msgid "view %s" msgstr "предÑтавление %s" -#: catalog/objectaddress.c:4135 +#: catalog/objectaddress.c:4138 #, c-format msgid "materialized view %s" msgstr "материализованное предÑтавление %s" -#: catalog/objectaddress.c:4139 +#: catalog/objectaddress.c:4142 #, c-format msgid "composite type %s" msgstr "ÑоÑтавной тип %s" -#: catalog/objectaddress.c:4143 +#: catalog/objectaddress.c:4146 #, c-format msgid "foreign table %s" msgstr "ÑтороннÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° %s" -#: catalog/objectaddress.c:4148 +#: catalog/objectaddress.c:4151 #, c-format msgid "relation %s" msgstr "отношение %s" -#: catalog/objectaddress.c:4189 +#: catalog/objectaddress.c:4192 #, c-format msgid "operator family %s for access method %s" msgstr "ÑемейÑтво операторов %s Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° доÑтупа %s" @@ -6065,7 +6543,7 @@ msgstr "" msgid "return type of inverse transition function %s is not %s" msgstr "Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° %s должна возвращать тип %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2998 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2991 #, c-format msgid "" "strictness of aggregate's forward and inverse transition functions must match" @@ -6084,7 +6562,7 @@ msgstr "" msgid "return type of combine function %s is not %s" msgstr "ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð¸Ñ€ÑƒÑŽÑ‰Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s должна возвращать тип %s" -#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3888 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3902 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "" @@ -6101,12 +6579,12 @@ msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñериализации %s должна возвраща msgid "return type of deserialization function %s is not %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð´ÐµÑериализации %s должна возвращать тип %s" -#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:191 catalog/pg_proc.c:225 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:189 catalog/pg_proc.c:223 #, c-format msgid "cannot determine result data type" msgstr "не удалоÑÑŒ определить тип результата" -#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:204 catalog/pg_proc.c:233 +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:202 catalog/pg_proc.c:231 #, c-format msgid "unsafe use of pseudo-type \"internal\"" msgstr "небезопаÑное иÑпользование пÑевдотипа \"internal\"" @@ -6127,7 +6605,7 @@ msgstr "" "оператор Ñортировки можно указать только Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ñ‹Ñ… функций Ñ Ð¾Ð´Ð½Ð¸Ð¼ " "аргументом" -#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:384 #, c-format msgid "cannot change routine kind" msgstr "тип подпрограммы изменить нельзÑ" @@ -6152,13 +6630,13 @@ msgstr "\"%s\" — Ð³Ð¸Ð¿Ð¾Ñ‚ÐµÐ·Ð¸Ñ€ÑƒÑŽÑ‰Ð°Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ† msgid "cannot change number of direct arguments of an aggregate function" msgstr "изменить чиÑло непоÑредÑтвенных аргументов агрегатной функции нельзÑ" -#: catalog/pg_aggregate.c:858 commands/functioncmds.c:695 -#: commands/typecmds.c:1976 commands/typecmds.c:2022 commands/typecmds.c:2074 -#: commands/typecmds.c:2111 commands/typecmds.c:2145 commands/typecmds.c:2179 -#: commands/typecmds.c:2213 commands/typecmds.c:2242 commands/typecmds.c:2329 -#: commands/typecmds.c:2371 parser/parse_func.c:417 parser/parse_func.c:448 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:686 +#: commands/typecmds.c:1985 commands/typecmds.c:2031 commands/typecmds.c:2083 +#: commands/typecmds.c:2120 commands/typecmds.c:2154 commands/typecmds.c:2188 +#: commands/typecmds.c:2222 commands/typecmds.c:2251 commands/typecmds.c:2338 +#: commands/typecmds.c:2380 parser/parse_func.c:417 parser/parse_func.c:448 #: parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 -#: parser/parse_func.c:631 parser/parse_func.c:2173 parser/parse_func.c:2446 +#: parser/parse_func.c:631 parser/parse_func.c:2172 parser/parse_func.c:2445 #, c-format msgid "function %s does not exist" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s не ÑущеÑтвует" @@ -6180,7 +6658,7 @@ msgstr "" msgid "function %s requires run-time type coercion" msgstr "функции %s требуетÑÑ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ типов во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ" -#: catalog/pg_cast.c:68 +#: catalog/pg_cast.c:75 #, c-format msgid "cast from type %s to type %s already exists" msgstr "приведение типа %s к типу %s уже ÑущеÑтвует" @@ -6256,48 +6734,48 @@ msgstr "правило Ñортировки \"%s\" уже ÑущеÑтвует" msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "правило Ñортировки \"%s\" Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸ \"%s\" уже ÑущеÑтвует" -#: catalog/pg_constraint.c:697 +#: catalog/pg_constraint.c:733 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "ограничение \"%s\" Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° %s уже ÑущеÑтвует" -#: catalog/pg_constraint.c:893 catalog/pg_constraint.c:986 +#: catalog/pg_constraint.c:933 catalog/pg_constraint.c:1026 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "ограничение \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\" не ÑущеÑтвует" -#: catalog/pg_constraint.c:1086 +#: catalog/pg_constraint.c:1126 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "ограничение \"%s\" Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° %s не ÑущеÑтвует" -#: catalog/pg_conversion.c:67 +#: catalog/pg_conversion.c:64 #, c-format msgid "conversion \"%s\" already exists" msgstr "преобразование \"%s\" уже ÑущеÑтвует" -#: catalog/pg_conversion.c:80 +#: catalog/pg_conversion.c:77 #, c-format msgid "default conversion for %s to %s already exists" msgstr "преобразование по умолчанию из %s в %s уже ÑущеÑтвует" -#: catalog/pg_depend.c:222 commands/extension.c:3271 +#: catalog/pg_depend.c:224 commands/extension.c:3397 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s уже отноÑитÑÑ Ðº раÑширению \"%s\"" -#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3311 +#: catalog/pg_depend.c:231 catalog/pg_depend.c:282 commands/extension.c:3437 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s не отноÑитÑÑ Ðº раÑширению \"%s\"" -#: catalog/pg_depend.c:232 +#: catalog/pg_depend.c:234 #, c-format msgid "An extension is not allowed to replace an object that it does not own." msgstr "" "РаÑширениÑм не разрешаетÑÑ Ð·Ð°Ð¼ÐµÐ½Ñть объекты, которые им не принадлежат." -#: catalog/pg_depend.c:283 +#: catalog/pg_depend.c:285 #, c-format msgid "" "An extension may only use CREATE ... IF NOT EXISTS to skip object creation " @@ -6306,55 +6784,55 @@ msgstr "" "РаÑширение может выполнÑть CREATE ... IF NOT EXISTS только Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы " "не Ñоздавать объект, когда оно уже владеет конфликтующим объектом." -#: catalog/pg_depend.c:646 +#: catalog/pg_depend.c:648 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "" "ликвидировать завиÑимоÑть от объекта %s нельзÑ, так как Ñто ÑиÑтемный объект" -#: catalog/pg_enum.c:128 catalog/pg_enum.c:230 catalog/pg_enum.c:525 +#: catalog/pg_enum.c:175 catalog/pg_enum.c:314 catalog/pg_enum.c:624 #, c-format msgid "invalid enum label \"%s\"" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° в перечиÑлении \"%s\"" -#: catalog/pg_enum.c:129 catalog/pg_enum.c:231 catalog/pg_enum.c:526 +#: catalog/pg_enum.c:176 catalog/pg_enum.c:315 catalog/pg_enum.c:625 #, c-format msgid "Labels must be %d bytes or less." msgstr "Длина метки не должна превышать %d байт." -#: catalog/pg_enum.c:259 +#: catalog/pg_enum.c:343 #, c-format msgid "enum label \"%s\" already exists, skipping" msgstr "метка перечиÑÐ»ÐµÐ½Ð¸Ñ \"%s\" уже ÑущеÑтвует, пропуÑкаетÑÑ" -#: catalog/pg_enum.c:266 catalog/pg_enum.c:569 +#: catalog/pg_enum.c:350 catalog/pg_enum.c:668 #, c-format msgid "enum label \"%s\" already exists" msgstr "метка перечиÑÐ»ÐµÐ½Ð¸Ñ \"%s\" уже ÑущеÑтвует" -#: catalog/pg_enum.c:321 catalog/pg_enum.c:564 +#: catalog/pg_enum.c:405 catalog/pg_enum.c:663 #, c-format msgid "\"%s\" is not an existing enum label" msgstr "в перечиÑлении нет метки\"%s\"" -#: catalog/pg_enum.c:379 +#: catalog/pg_enum.c:463 #, c-format msgid "pg_enum OID value not set when in binary upgrade mode" msgstr "значение OID в pg_enum не задано в режиме двоичного обновлениÑ" -#: catalog/pg_enum.c:389 +#: catalog/pg_enum.c:473 #, c-format msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" msgstr "" "конÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ ALTER TYPE ADD BEFORE/AFTER неÑовмеÑтима Ñ Ð´Ð²Ð¾Ð¸Ñ‡Ð½Ñ‹Ð¼ обновлением " "данных" -#: catalog/pg_inherits.c:593 +#: catalog/pg_inherits.c:592 #, c-format msgid "cannot detach partition \"%s\"" msgstr "отÑоединить Ñекцию \"%s\" нельзÑ" -#: catalog/pg_inherits.c:595 +#: catalog/pg_inherits.c:594 #, c-format msgid "" "The partition is being detached concurrently or has an unfinished detach." @@ -6362,8 +6840,8 @@ msgstr "" "Эта ÑÐµÐºÑ†Ð¸Ñ Ð¾Ñ‚ÑоединÑетÑÑ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ð¾ или Ð´Ð»Ñ Ð½ÐµÑ‘ не была завершена Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ " "отÑоединениÑ." -#: catalog/pg_inherits.c:596 commands/tablecmds.c:4488 -#: commands/tablecmds.c:15429 +#: catalog/pg_inherits.c:595 commands/tablecmds.c:4800 +#: commands/tablecmds.c:16194 #, c-format msgid "" "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending " @@ -6372,99 +6850,113 @@ msgstr "" "Чтобы завершить неоконченную операцию отÑоединениÑ, выполните команду ALTER " "TABLE ... DETACH PARTITION ... FINALIZE." -#: catalog/pg_inherits.c:600 +#: catalog/pg_inherits.c:599 #, c-format msgid "cannot complete detaching partition \"%s\"" msgstr "завершить отÑоединение Ñекции \"%s\" нельзÑ" -#: catalog/pg_inherits.c:602 +#: catalog/pg_inherits.c:601 #, c-format msgid "There's no pending concurrent detach." msgstr "Ðа данный момент вÑе операции отÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ñ‹." -#: catalog/pg_namespace.c:64 commands/schemacmds.c:254 +#: catalog/pg_namespace.c:64 commands/schemacmds.c:273 #, c-format msgid "schema \"%s\" already exists" msgstr "Ñхема \"%s\" уже ÑущеÑтвует" -#: catalog/pg_operator.c:219 catalog/pg_operator.c:361 +#: catalog/pg_operator.c:213 catalog/pg_operator.c:355 #, c-format msgid "\"%s\" is not a valid operator name" msgstr "Ð¸Ð¼Ñ \"%s\" недопуÑтимо Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°" -#: catalog/pg_operator.c:370 +#: catalog/pg_operator.c:379 +#, c-format +msgid "operator %s already exists" +msgstr "оператор %s уже ÑущеÑтвует" + +#: catalog/pg_operator.c:445 commands/operatorcmds.c:600 +#, c-format +msgid "operator cannot be its own negator" +msgstr "оператор не может быть обратным к Ñебе" + +#: catalog/pg_operator.c:572 #, c-format msgid "only binary operators can have commutators" msgstr "коммутативную операцию можно определить только Ð´Ð»Ñ Ð±Ð¸Ð½Ð°Ñ€Ð½Ñ‹Ñ… операторов" -#: catalog/pg_operator.c:374 commands/operatorcmds.c:507 +#: catalog/pg_operator.c:576 #, c-format msgid "only binary operators can have join selectivity" msgstr "" "функцию оценки ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ определить только Ð´Ð»Ñ Ð±Ð¸Ð½Ð°Ñ€Ð½Ñ‹Ñ… операторов" -#: catalog/pg_operator.c:378 +#: catalog/pg_operator.c:580 #, c-format msgid "only binary operators can merge join" msgstr "" "поддержку ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑлиÑнием можно обозначить только Ð´Ð»Ñ Ð±Ð¸Ð½Ð°Ñ€Ð½Ñ‹Ñ… операторов" -#: catalog/pg_operator.c:382 +#: catalog/pg_operator.c:584 #, c-format msgid "only binary operators can hash" msgstr "поддержку хеша можно обозначить только Ð´Ð»Ñ Ð±Ð¸Ð½Ð°Ñ€Ð½Ñ‹Ñ… операторов" -#: catalog/pg_operator.c:393 +#: catalog/pg_operator.c:593 #, c-format msgid "only boolean operators can have negators" msgstr "обратную операцию можно определить только Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑких операторов" -#: catalog/pg_operator.c:397 commands/operatorcmds.c:515 +#: catalog/pg_operator.c:597 #, c-format msgid "only boolean operators can have restriction selectivity" msgstr "" "функцию оценки Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ определить только Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑких операторов" -#: catalog/pg_operator.c:401 commands/operatorcmds.c:519 +#: catalog/pg_operator.c:601 #, c-format msgid "only boolean operators can have join selectivity" msgstr "" "функцию оценки ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ определить только Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑких операторов" -#: catalog/pg_operator.c:405 +#: catalog/pg_operator.c:605 #, c-format msgid "only boolean operators can merge join" msgstr "" "поддержку ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑлиÑнием можно обозначить только Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑких " "операторов" -#: catalog/pg_operator.c:409 +#: catalog/pg_operator.c:609 #, c-format msgid "only boolean operators can hash" msgstr "поддержку хеша можно обозначить только Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑких операторов" -#: catalog/pg_operator.c:421 +#: catalog/pg_operator.c:739 #, c-format -msgid "operator %s already exists" -msgstr "оператор %s уже ÑущеÑтвует" +msgid "commutator operator %s is already the commutator of operator %s" +msgstr "коммутирующий оператор %s уже ÑвлÑетÑÑ ÐºÐ¾Ð¼Ð¼ÑƒÑ‚Ð¸Ñ€ÑƒÑŽÑ‰Ð¸Ð¼ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° %s" -#: catalog/pg_operator.c:621 +#: catalog/pg_operator.c:744 #, c-format -msgid "operator cannot be its own negator or sort operator" -msgstr "" -"оператор не может быть обратным к Ñебе или ÑобÑтвенным оператором Ñортировки" +msgid "commutator operator %s is already the commutator of operator %u" +msgstr "коммутирующий оператор %s уже ÑвлÑетÑÑ ÐºÐ¾Ð¼Ð¼ÑƒÑ‚Ð¸Ñ€ÑƒÑŽÑ‰Ð¸Ð¼ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° %u" -#: catalog/pg_parameter_acl.c:52 +#: catalog/pg_operator.c:807 #, c-format -msgid "parameter ACL \"%s\" does not exist" -msgstr "ACL параметра \"%s\" не ÑущеÑтвует" +msgid "negator operator %s is already the negator of operator %s" +msgstr "обратный оператор %s уже ÑвлÑетÑÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ñ‹Ð¼ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° %s" + +#: catalog/pg_operator.c:812 +#, c-format +msgid "negator operator %s is already the negator of operator %u" +msgstr "обратный оператор %s уже ÑвлÑетÑÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ñ‹Ð¼ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° %u" -#: catalog/pg_parameter_acl.c:87 +#: catalog/pg_parameter_acl.c:50 #, c-format -msgid "invalid parameter name \"%s\"" -msgstr "неверное Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\"" +msgid "parameter ACL \"%s\" does not exist" +msgstr "ACL параметра \"%s\" не ÑущеÑтвует" -#: catalog/pg_proc.c:132 parser/parse_func.c:2235 +#: catalog/pg_proc.c:130 parser/parse_func.c:2234 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" @@ -6472,37 +6964,37 @@ msgstr[0] "функции не могут иметь больше %d аргум msgstr[1] "функции не могут иметь больше %d аргументов" msgstr[2] "функции не могут иметь больше %d аргументов" -#: catalog/pg_proc.c:376 +#: catalog/pg_proc.c:374 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ð¼Ð¸ таких типов уже ÑущеÑтвует" -#: catalog/pg_proc.c:388 +#: catalog/pg_proc.c:386 #, c-format msgid "\"%s\" is an aggregate function." msgstr "\"%s\" — Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ." -#: catalog/pg_proc.c:390 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is a function." msgstr "\"%s\" — функциÑ." -#: catalog/pg_proc.c:392 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a procedure." msgstr "\"%s\" — процедура." -#: catalog/pg_proc.c:394 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a window function." msgstr "\"%s\" — Ð¾ÐºÐ¾Ð½Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ." -#: catalog/pg_proc.c:414 +#: catalog/pg_proc.c:412 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "определить выходные параметры Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹ нельзÑ" -#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 +#: catalog/pg_proc.c:413 catalog/pg_proc.c:443 #, c-format msgid "cannot change return type of existing function" msgstr "изменить тип возврата ÑущеÑтвующей функции нельзÑ" @@ -6511,124 +7003,118 @@ msgstr "изменить тип возврата ÑущеÑтвующей фун #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: catalog/pg_proc.c:421 catalog/pg_proc.c:448 catalog/pg_proc.c:493 -#: catalog/pg_proc.c:519 catalog/pg_proc.c:545 +#: catalog/pg_proc.c:419 catalog/pg_proc.c:446 catalog/pg_proc.c:491 +#: catalog/pg_proc.c:517 catalog/pg_proc.c:541 #, c-format msgid "Use %s %s first." msgstr "Сначала выполните %s %s." -#: catalog/pg_proc.c:446 +#: catalog/pg_proc.c:444 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "Параметры OUT определÑÑŽÑ‚ другой тип Ñтроки." -#: catalog/pg_proc.c:490 +#: catalog/pg_proc.c:488 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "изменить Ð¸Ð¼Ñ Ð²Ñ…Ð¾Ð´Ð½Ð¾Ð³Ð¾ параметра \"%s\" нельзÑ" -#: catalog/pg_proc.c:517 +#: catalog/pg_proc.c:515 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "" "Ð´Ð»Ñ ÑущеÑтвующей функции Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐ±Ñ€Ð°Ñ‚ÑŒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð² по умолчанию" -#: catalog/pg_proc.c:543 +#: catalog/pg_proc.c:539 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "" "Ð´Ð»Ñ ÑущеÑтвующего Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° по умолчанию Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ тип данных" -#: catalog/pg_proc.c:757 +#: catalog/pg_proc.c:750 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "вÑтроенной функции \"%s\" нет" -#: catalog/pg_proc.c:855 +#: catalog/pg_proc.c:843 #, c-format msgid "SQL functions cannot return type %s" msgstr "SQL-функции не могут возвращать тип %s" -#: catalog/pg_proc.c:870 +#: catalog/pg_proc.c:858 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "SQL-функции не могут иметь аргументы типа %s" -#: catalog/pg_proc.c:1000 executor/functions.c:1473 +#: catalog/pg_proc.c:986 executor/functions.c:1468 #, c-format msgid "SQL function \"%s\"" msgstr "SQL-Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\"" -#: catalog/pg_publication.c:63 catalog/pg_publication.c:71 -#: catalog/pg_publication.c:79 catalog/pg_publication.c:85 +#: catalog/pg_publication.c:66 catalog/pg_publication.c:74 +#: catalog/pg_publication.c:82 catalog/pg_publication.c:88 #, c-format msgid "cannot add relation \"%s\" to publication" msgstr "добавить отношение \"%s\" в публикацию нельзÑ" -#: catalog/pg_publication.c:73 +#: catalog/pg_publication.c:76 #, c-format msgid "This operation is not supported for system tables." msgstr "Эта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ поддерживаетÑÑ Ð´Ð»Ñ ÑиÑтемных таблиц." -#: catalog/pg_publication.c:81 +#: catalog/pg_publication.c:84 #, c-format msgid "This operation is not supported for temporary tables." msgstr "Эта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ поддерживаетÑÑ Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ… таблиц." -#: catalog/pg_publication.c:87 +#: catalog/pg_publication.c:90 #, c-format msgid "This operation is not supported for unlogged tables." msgstr "Эта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ поддерживаетÑÑ Ð´Ð»Ñ Ð½ÐµÐ¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ñ… таблиц." -#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 +#: catalog/pg_publication.c:104 catalog/pg_publication.c:112 #, c-format msgid "cannot add schema \"%s\" to publication" msgstr "добавить Ñхему \"%s\" в публикацию нельзÑ" -#: catalog/pg_publication.c:103 +#: catalog/pg_publication.c:106 #, c-format msgid "This operation is not supported for system schemas." msgstr "Эта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ поддерживаетÑÑ Ð´Ð»Ñ ÑиÑтемных Ñхем." -#: catalog/pg_publication.c:111 +#: catalog/pg_publication.c:114 #, c-format msgid "Temporary schemas cannot be replicated." msgstr "Временные Ñхемы Ð½ÐµÐ»ÑŒÐ·Ñ Ñ€ÐµÐ¿Ð»Ð¸Ñ†Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ." -#: catalog/pg_publication.c:374 +#: catalog/pg_publication.c:392 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "отношение \"%s\" уже включено в публикацию \"%s\"" -#: catalog/pg_publication.c:516 +#: catalog/pg_publication.c:534 #, c-format msgid "cannot use system column \"%s\" in publication column list" msgstr "" "в ÑпиÑке публикуемых Ñтолбцов Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать ÑиÑтемный Ñтолбец \"%s\"" -#: catalog/pg_publication.c:522 +#: catalog/pg_publication.c:540 #, c-format msgid "cannot use generated column \"%s\" in publication column list" msgstr "" "в ÑпиÑке публикуемых Ñтолбцов Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать генерируемый Ñтолбец \"%s\"" -#: catalog/pg_publication.c:528 +#: catalog/pg_publication.c:546 #, c-format msgid "duplicate column \"%s\" in publication column list" msgstr "в ÑпиÑке публикуемых Ñтолбцов повторÑетÑÑ Ñтолбец \"%s\"" -#: catalog/pg_publication.c:618 +#: catalog/pg_publication.c:636 #, c-format msgid "schema \"%s\" is already member of publication \"%s\"" msgstr "Ñхема \"%s\" уже включена в публикацию \"%s\"" -#: catalog/pg_publication.c:1045 commands/publicationcmds.c:1391 -#: commands/publicationcmds.c:1430 commands/publicationcmds.c:1967 -#, c-format -msgid "publication \"%s\" does not exist" -msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\" не ÑущеÑтвует" - -#: catalog/pg_shdepend.c:829 +#: catalog/pg_shdepend.c:875 #, c-format msgid "" "\n" @@ -6646,43 +7132,48 @@ msgstr[2] "" "\n" "и объекты в %d других базах данных (Ñм. ÑпиÑок в протоколе Ñервера)" -#: catalog/pg_shdepend.c:1176 +#: catalog/pg_shdepend.c:1222 #, c-format msgid "role %u was concurrently dropped" msgstr "роль %u удалена другим процеÑÑом" -#: catalog/pg_shdepend.c:1188 +#: catalog/pg_shdepend.c:1234 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "табличное проÑтранÑтво %u удалено другим процеÑÑом" -#: catalog/pg_shdepend.c:1202 +#: catalog/pg_shdepend.c:1248 #, c-format msgid "database %u was concurrently dropped" msgstr "база данных %u удалена другим процеÑÑом" -#: catalog/pg_shdepend.c:1253 +#: catalog/pg_shdepend.c:1299 #, c-format msgid "owner of %s" msgstr "владелец объекта %s" -#: catalog/pg_shdepend.c:1255 +#: catalog/pg_shdepend.c:1301 #, c-format msgid "privileges for %s" msgstr "права доÑтупа к объекту %s" -#: catalog/pg_shdepend.c:1257 +#: catalog/pg_shdepend.c:1303 +#, c-format +msgid "initial privileges for %s" +msgstr "начальные права Ð´Ð»Ñ %s" + +#: catalog/pg_shdepend.c:1305 #, c-format msgid "target of %s" msgstr "Ñубъект политики %s" -#: catalog/pg_shdepend.c:1259 +#: catalog/pg_shdepend.c:1307 #, c-format msgid "tablespace for %s" msgstr "табличное проÑтранÑтво Ð´Ð»Ñ %s" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1267 +#: catalog/pg_shdepend.c:1315 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" @@ -6690,7 +7181,7 @@ msgstr[0] "%d объект (%s)" msgstr[1] "%d объекта (%s)" msgstr[2] "%d объектов (%s)" -#: catalog/pg_shdepend.c:1331 +#: catalog/pg_shdepend.c:1379 #, c-format msgid "" "cannot drop objects owned by %s because they are required by the database " @@ -6699,7 +7190,7 @@ msgstr "" "удалить объекты, принадлежащие роли %s, нельзÑ, так как они нужны ÑиÑтеме " "баз данных" -#: catalog/pg_shdepend.c:1477 +#: catalog/pg_shdepend.c:1560 #, c-format msgid "" "cannot reassign ownership of objects owned by %s because they are required " @@ -6708,18 +7199,12 @@ msgstr "" "изменить владельца объектов, принадлежащих роли %s, нельзÑ, так как они " "нужны ÑиÑтеме баз данных" -#: catalog/pg_subscription.c:216 commands/subscriptioncmds.c:989 -#: commands/subscriptioncmds.c:1359 commands/subscriptioncmds.c:1710 -#, c-format -msgid "subscription \"%s\" does not exist" -msgstr "подпиÑка \"%s\" не ÑущеÑтвует" - -#: catalog/pg_subscription.c:474 +#: catalog/pg_subscription.c:438 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "удалить ÑопоÑтавление отношений Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" не получилоÑÑŒ" -#: catalog/pg_subscription.c:476 +#: catalog/pg_subscription.c:440 #, c-format msgid "" "Table synchronization for relation \"%s\" is in progress and is in state " @@ -6729,7 +7214,7 @@ msgstr "ВыполнÑетÑÑ ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"% #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command #. -#: catalog/pg_subscription.c:483 +#: catalog/pg_subscription.c:447 #, c-format msgid "" "Use %s to enable subscription if not already enabled or use %s to drop the " @@ -6738,50 +7223,45 @@ msgstr "" "Выполните %s, чтобы включить подпиÑку, еÑли она ещё не включена, либо %s, " "чтобы удалить её." -#: catalog/pg_type.c:136 catalog/pg_type.c:476 +#: catalog/pg_type.c:133 catalog/pg_type.c:474 #, c-format msgid "pg_type OID value not set when in binary upgrade mode" msgstr "значение OID в pg_type не задано в режиме двоичного обновлениÑ" -#: catalog/pg_type.c:256 +#: catalog/pg_type.c:253 #, c-format msgid "invalid type internal size %d" msgstr "неверный внутренний размер типа: %d" -#: catalog/pg_type.c:272 catalog/pg_type.c:280 catalog/pg_type.c:288 -#: catalog/pg_type.c:297 +#: catalog/pg_type.c:269 catalog/pg_type.c:277 catalog/pg_type.c:285 +#: catalog/pg_type.c:294 #, c-format msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" msgstr "" "выравнивание \"%c\" не подходит Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð°, передаваемого по значению (Ñ " "размером: %d)" -#: catalog/pg_type.c:304 +#: catalog/pg_type.c:301 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "внутренний размер %d не подходит Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð°, передаваемого по значению" -#: catalog/pg_type.c:314 catalog/pg_type.c:320 +#: catalog/pg_type.c:311 catalog/pg_type.c:317 #, c-format msgid "alignment \"%c\" is invalid for variable-length type" msgstr "выравнивание \"%c\" не подходит Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° переменной длины" -#: catalog/pg_type.c:328 commands/typecmds.c:4151 +#: catalog/pg_type.c:325 commands/typecmds.c:4363 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð¾Ð² поÑтоÑнного размера применим только режим Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ PLAIN" -#: catalog/pg_type.c:827 -#, c-format -msgid "could not form array type name for type \"%s\"" -msgstr "не удалоÑÑŒ Ñформировать Ð¸Ð¼Ñ Ñ‚Ð¸Ð¿Ð° маÑÑива Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° \"%s\"" - -#: catalog/pg_type.c:932 +#: catalog/pg_type.c:978 #, c-format msgid "Failed while creating a multirange type for type \"%s\"." msgstr "Ошибка при Ñоздании мультидиапазонного типа Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° \"%s\"." -#: catalog/pg_type.c:933 +#: catalog/pg_type.c:979 #, c-format msgid "" "You can manually specify a multirange type name using the " @@ -6790,82 +7270,82 @@ msgstr "" "Ð˜Ð¼Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½Ð¾Ð³Ð¾ типа можно указать вручную, воÑпользовавшиÑÑŒ " "атрибутом \"multirange_type_name\"." -#: catalog/storage.c:505 storage/buffer/bufmgr.c:1047 +#: catalog/storage.c:533 storage/buffer/bufmgr.c:1540 #, c-format msgid "invalid page in block %u of relation %s" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтраница в блоке %u Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ %s" -#: commands/aggregatecmds.c:170 +#: commands/aggregatecmds.c:167 #, c-format msgid "only ordered-set aggregates can be hypothetical" msgstr "гипотезирующими могут быть только Ñортирующие агрегатные функции" -#: commands/aggregatecmds.c:195 +#: commands/aggregatecmds.c:192 #, c-format msgid "aggregate attribute \"%s\" not recognized" msgstr "нераÑпознанный атрибут \"%s\" в определении агрегатной функции" -#: commands/aggregatecmds.c:205 +#: commands/aggregatecmds.c:202 #, c-format msgid "aggregate stype must be specified" msgstr "в определении агрегата требуетÑÑ stype" -#: commands/aggregatecmds.c:209 +#: commands/aggregatecmds.c:206 #, c-format msgid "aggregate sfunc must be specified" msgstr "в определении агрегата требуетÑÑ sfunc" -#: commands/aggregatecmds.c:221 +#: commands/aggregatecmds.c:218 #, c-format msgid "aggregate msfunc must be specified when mstype is specified" msgstr "в определении агрегата требуетÑÑ msfunc, еÑли указан mstype" -#: commands/aggregatecmds.c:225 +#: commands/aggregatecmds.c:222 #, c-format msgid "aggregate minvfunc must be specified when mstype is specified" msgstr "в определении агрегата требуетÑÑ minvfunc, еÑли указан mstype" -#: commands/aggregatecmds.c:232 +#: commands/aggregatecmds.c:229 #, c-format msgid "aggregate msfunc must not be specified without mstype" msgstr "msfunc Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð° не должна указыватьÑÑ Ð±ÐµÐ· mstype" -#: commands/aggregatecmds.c:236 +#: commands/aggregatecmds.c:233 #, c-format msgid "aggregate minvfunc must not be specified without mstype" msgstr "minvfunc Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð° не должна указыватьÑÑ Ð±ÐµÐ· mstype" -#: commands/aggregatecmds.c:240 +#: commands/aggregatecmds.c:237 #, c-format msgid "aggregate mfinalfunc must not be specified without mstype" msgstr "mfinalfunc Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð° не должна указыватьÑÑ Ð±ÐµÐ· mstype" -#: commands/aggregatecmds.c:244 +#: commands/aggregatecmds.c:241 #, c-format msgid "aggregate msspace must not be specified without mstype" msgstr "msspace Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð° не должна указыватьÑÑ Ð±ÐµÐ· mstype" -#: commands/aggregatecmds.c:248 +#: commands/aggregatecmds.c:245 #, c-format msgid "aggregate minitcond must not be specified without mstype" msgstr "minitcond Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð° не должна указыватьÑÑ Ð±ÐµÐ· mstype" -#: commands/aggregatecmds.c:277 +#: commands/aggregatecmds.c:274 #, c-format msgid "aggregate input type must be specified" msgstr "в определении агрегата требуетÑÑ Ð²Ñ…Ð¾Ð´Ð½Ð¾Ð¹ тип" -#: commands/aggregatecmds.c:307 +#: commands/aggregatecmds.c:304 #, c-format msgid "basetype is redundant with aggregate input type specification" msgstr "в определении агрегата Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ входного типа не нужен базовый тип" -#: commands/aggregatecmds.c:350 commands/aggregatecmds.c:391 +#: commands/aggregatecmds.c:347 commands/aggregatecmds.c:388 #, c-format msgid "aggregate transition data type cannot be %s" msgstr "переходным типом агрегата не может быть %s" -#: commands/aggregatecmds.c:362 +#: commands/aggregatecmds.c:359 #, c-format msgid "" "serialization functions may be specified only when the aggregate transition " @@ -6874,91 +7354,109 @@ msgstr "" "функции Ñериализации могут задаватьÑÑ, только когда переходный тип данных " "агрегата - %s" -#: commands/aggregatecmds.c:372 +#: commands/aggregatecmds.c:369 #, c-format msgid "" "must specify both or neither of serialization and deserialization functions" msgstr "функции Ñериализации и деÑериализации должны задаватьÑÑ ÑовмеÑтно" -#: commands/aggregatecmds.c:437 commands/functioncmds.c:643 +#: commands/aggregatecmds.c:434 commands/functioncmds.c:634 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "" "параметр \"parallel\" должен иметь значение SAFE, RESTRICTED или UNSAFE" -#: commands/aggregatecmds.c:493 +#: commands/aggregatecmds.c:490 #, c-format msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" msgstr "" "параметр \"%s\" должен иметь характериÑтику READ_ONLY, SHAREABLE или " "READ_WRITE" -#: commands/alter.c:84 commands/event_trigger.c:174 +#: commands/alter.c:83 commands/event_trigger.c:191 #, c-format msgid "event trigger \"%s\" already exists" msgstr "Ñобытийный триггер \"%s\" уже ÑущеÑтвует" -#: commands/alter.c:87 commands/foreigncmds.c:593 +#: commands/alter.c:86 commands/foreigncmds.c:593 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "обёртка Ñторонних данных \"%s\" уже ÑущеÑтвует" -#: commands/alter.c:90 commands/foreigncmds.c:884 +#: commands/alter.c:89 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "Ñервер \"%s\" уже ÑущеÑтвует" -#: commands/alter.c:93 commands/proclang.c:133 +#: commands/alter.c:92 commands/proclang.c:131 #, c-format msgid "language \"%s\" already exists" msgstr "Ñзык \"%s\" уже ÑущеÑтвует" -#: commands/alter.c:96 commands/publicationcmds.c:770 +#: commands/alter.c:95 commands/publicationcmds.c:764 #, c-format msgid "publication \"%s\" already exists" msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\" уже ÑущеÑтвует" -#: commands/alter.c:99 commands/subscriptioncmds.c:567 +#: commands/alter.c:98 commands/subscriptioncmds.c:669 #, c-format msgid "subscription \"%s\" already exists" msgstr "подпиÑка \"%s\" уже ÑущеÑтвует" -#: commands/alter.c:122 +#: commands/alter.c:121 #, c-format msgid "conversion \"%s\" already exists in schema \"%s\"" msgstr "преобразование \"%s\" уже ÑущеÑтвует в Ñхеме \"%s\"" -#: commands/alter.c:126 +#: commands/alter.c:125 #, c-format msgid "statistics object \"%s\" already exists in schema \"%s\"" msgstr "объект ÑтатиÑтики \"%s\" уже ÑущеÑтвует в Ñхеме \"%s\"" -#: commands/alter.c:130 +#: commands/alter.c:129 #, c-format msgid "text search parser \"%s\" already exists in schema \"%s\"" msgstr "анализатор текÑтового поиÑка \"%s\" уже ÑущеÑтвует в Ñхеме \"%s\"" -#: commands/alter.c:134 +#: commands/alter.c:133 #, c-format msgid "text search dictionary \"%s\" already exists in schema \"%s\"" msgstr "Ñловарь текÑтового поиÑка \"%s\" уже ÑущеÑтвует в Ñхеме \"%s\"" -#: commands/alter.c:138 +#: commands/alter.c:137 #, c-format msgid "text search template \"%s\" already exists in schema \"%s\"" msgstr "шаблон текÑтового поиÑка \"%s\" уже ÑущеÑтвует в Ñхеме \"%s\"" -#: commands/alter.c:142 +#: commands/alter.c:141 #, c-format msgid "text search configuration \"%s\" already exists in schema \"%s\"" msgstr "ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка \"%s\" уже ÑущеÑтвует в Ñхеме \"%s\"" -#: commands/alter.c:215 +#: commands/alter.c:214 #, c-format msgid "must be superuser to rename %s" msgstr "переименовать \"%s\" может только Ñуперпользователь" -#: commands/alter.c:746 +#: commands/alter.c:256 commands/subscriptioncmds.c:648 +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1212 +#: commands/subscriptioncmds.c:1918 +#, c-format +msgid "password_required=false is superuser-only" +msgstr "задать password_required=false может только Ñуперпользователь" + +#: commands/alter.c:257 commands/subscriptioncmds.c:649 +#: commands/subscriptioncmds.c:1130 commands/subscriptioncmds.c:1213 +#: commands/subscriptioncmds.c:1919 +#, c-format +msgid "" +"Subscriptions with the password_required option set to false may only be " +"created or modified by the superuser." +msgstr "" +"ПодпиÑки Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ password_required option, равным false, могут " +"Ñоздавать или изменÑть только Ñуперпользователи." + +#: commands/alter.c:735 #, c-format msgid "must be superuser to set schema of %s" msgstr "Ð´Ð»Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñхемы объекта %s нужно быть Ñуперпользователем" @@ -6966,7 +7464,7 @@ msgstr "Ð´Ð»Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñхемы объекта %s нужно бы #: commands/amcmds.c:60 #, c-format msgid "permission denied to create access method \"%s\"" -msgstr "нет прав на Ñоздание метода доÑтупа \"%s\"" +msgstr "нет прав Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° доÑтупа \"%s\"" #: commands/amcmds.c:62 #, c-format @@ -6978,7 +7476,7 @@ msgstr "Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° доÑтупа нужно быть msgid "access method \"%s\" already exists" msgstr "метод доÑтупа \"%s\" уже ÑущеÑтвует" -#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:833 +#: commands/amcmds.c:154 commands/indexcmds.c:224 commands/indexcmds.c:850 #: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" @@ -6989,46 +7487,46 @@ msgstr "метод доÑтупа \"%s\" не ÑущеÑтвует" msgid "handler function is not specified" msgstr "не указана функциÑ-обработчик" -#: commands/amcmds.c:264 commands/event_trigger.c:183 -#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:713 -#: parser/parse_clause.c:942 +#: commands/amcmds.c:264 commands/event_trigger.c:200 +#: commands/foreigncmds.c:489 commands/proclang.c:78 commands/trigger.c:702 +#: parser/parse_clause.c:943 #, c-format msgid "function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s должна возвращать тип %s" -#: commands/analyze.c:228 +#: commands/analyze.c:217 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "\"%s\" пропуÑкаетÑÑ --- анализировать Ñту Ñтороннюю таблицу нельзÑ" -#: commands/analyze.c:245 +#: commands/analyze.c:234 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "" "\"%s\" пропуÑкаетÑÑ --- анализировать не таблицы или Ñпециальные ÑиÑтемные " "таблицы нельзÑ" -#: commands/analyze.c:325 +#: commands/analyze.c:314 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "анализируетÑÑ Ð´ÐµÑ€ÐµÐ²Ð¾ наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s.%s\"" -#: commands/analyze.c:330 +#: commands/analyze.c:319 #, c-format msgid "analyzing \"%s.%s\"" msgstr "анализируетÑÑ \"%s.%s\"" -#: commands/analyze.c:396 +#: commands/analyze.c:385 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" указан неоднократно" -#: commands/analyze.c:787 +#: commands/analyze.c:785 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" msgstr "автоматичеÑкий анализ таблицы \"%s.%s.%s\"\n" -#: commands/analyze.c:1334 +#: commands/analyze.c:1300 #, c-format msgid "" "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead " @@ -7038,7 +7536,7 @@ msgstr "" "%.0f, \"мёртвых\" Ñтрок: %.0f; Ñтрок в выборке: %d, примерное общее чиÑло " "Ñтрок: %.0f" -#: commands/analyze.c:1414 +#: commands/analyze.c:1384 #, c-format msgid "" "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree " @@ -7047,7 +7545,7 @@ msgstr "" "пропуÑкаетÑÑ Ð°Ð½Ð°Ð»Ð¸Ð· дерева наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s.%s\" --- Ñто дерево " "наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ Ñодержит дочерних таблиц" -#: commands/analyze.c:1512 +#: commands/analyze.c:1482 #, c-format msgid "" "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree " @@ -7056,22 +7554,22 @@ msgstr "" "пропуÑкаетÑÑ Ð°Ð½Ð°Ð»Ð¸Ð· дерева наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s.%s\" --- Ñто дерево " "наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ Ñодержит анализируемых дочерних таблиц" -#: commands/async.c:646 +#: commands/async.c:612 #, c-format msgid "channel name cannot be empty" msgstr "Ð¸Ð¼Ñ ÐºÐ°Ð½Ð°Ð»Ð° не может быть пуÑтым" -#: commands/async.c:652 +#: commands/async.c:618 #, c-format msgid "channel name too long" msgstr "Ñлишком длинное Ð¸Ð¼Ñ ÐºÐ°Ð½Ð°Ð»Ð°" -#: commands/async.c:657 +#: commands/async.c:623 #, c-format msgid "payload string too long" msgstr "Ñлишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ Ñтрока ÑообщениÑ-нагрузки" -#: commands/async.c:876 +#: commands/async.c:842 #, c-format msgid "" "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" @@ -7079,17 +7577,17 @@ msgstr "" "выполнить PREPARE Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ LISTEN, UNLISTEN или NOTIFY " "нельзÑ" -#: commands/async.c:980 +#: commands/async.c:946 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "Ñлишком много уведомлений в очереди NOTIFY" -#: commands/async.c:1602 +#: commands/async.c:1553 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "очередь NOTIFY заполнена на %.0f%%" -#: commands/async.c:1604 +#: commands/async.c:1555 #, c-format msgid "" "The server process with PID %d is among those with the oldest transactions." @@ -7097,7 +7595,7 @@ msgstr "" "Ð’ чиÑло Ñерверных процеÑÑов Ñ Ñамыми Ñтарыми транзакциÑми входит процеÑÑ Ñ " "PID %d." -#: commands/async.c:1607 +#: commands/async.c:1558 #, c-format msgid "" "The NOTIFY queue cannot be emptied until that process ends its current " @@ -7111,37 +7609,37 @@ msgstr "" msgid "unrecognized CLUSTER option \"%s\"" msgstr "нераÑпознанный параметр CLUSTER: \"%s\"" -#: commands/cluster.c:158 commands/cluster.c:431 +#: commands/cluster.c:159 commands/cluster.c:433 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "клаÑтеризовать временные таблицы других ÑеанÑов нельзÑ" -#: commands/cluster.c:176 +#: commands/cluster.c:177 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "таблица \"%s\" ранее не клаÑтеризовалаÑÑŒ по какому-либо индекÑу" -#: commands/cluster.c:190 commands/tablecmds.c:14128 commands/tablecmds.c:16008 +#: commands/cluster.c:191 commands/tablecmds.c:14838 commands/tablecmds.c:16770 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\" не ÑущеÑтвует" -#: commands/cluster.c:420 +#: commands/cluster.c:422 #, c-format msgid "cannot cluster a shared catalog" msgstr "клаÑтеризовать разделÑемый каталог нельзÑ" -#: commands/cluster.c:435 +#: commands/cluster.c:437 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "очищать временные таблицы других ÑеанÑов нельзÑ" -#: commands/cluster.c:511 commands/tablecmds.c:16018 +#: commands/cluster.c:513 commands/tablecmds.c:16780 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" не ÑвлÑетÑÑ Ð¸Ð½Ð´ÐµÐºÑом таблицы \"%s\"" -#: commands/cluster.c:519 +#: commands/cluster.c:521 #, c-format msgid "" "cannot cluster on index \"%s\" because access method does not support " @@ -7149,38 +7647,38 @@ msgid "" msgstr "" "клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ð¾ индекÑу \"%s\" невозможна, её не поддерживает метод доÑтупа" -#: commands/cluster.c:531 +#: commands/cluster.c:533 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "клаÑтеризовать по чаÑтичному индекÑу \"%s\" нельзÑ" -#: commands/cluster.c:545 +#: commands/cluster.c:547 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÐºÐ»Ð°Ñтеризовать таблицу по неверному индекÑу \"%s\"" -#: commands/cluster.c:569 +#: commands/cluster.c:571 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "пометить Ð¸Ð½Ð´ÐµÐºÑ ÐºÐ°Ðº клаÑтеризованный в Ñекционированной таблице нельзÑ" -#: commands/cluster.c:948 +#: commands/cluster.c:956 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ð¸Ñ \"%s.%s\" путём ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа \"%s\"" -#: commands/cluster.c:954 +#: commands/cluster.c:962 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "" "клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ð¸Ñ \"%s.%s\" путём поÑледовательного ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ Ñортировки" -#: commands/cluster.c:959 +#: commands/cluster.c:967 #, c-format msgid "vacuuming \"%s.%s\"" msgstr "очиÑтка \"%s.%s\"" -#: commands/cluster.c:985 +#: commands/cluster.c:994 #, c-format msgid "" "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" @@ -7188,7 +7686,7 @@ msgstr "" "\"%s.%s\": найдено удалÑемых верÑий Ñтрок: %.0f, неудалÑемых: %.0f, " "проÑмотрено Ñтраниц: %u" -#: commands/cluster.c:990 +#: commands/cluster.c:999 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -7197,117 +7695,139 @@ msgstr "" "Ð’ данный момент Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ \"мёртвых\" Ñтрок %.0f.\n" "%s." -#: commands/collationcmds.c:106 +#: commands/cluster.c:1744 +#, c-format +msgid "permission denied to cluster \"%s\", skipping it" +msgstr "нет прав Ð´Ð»Ñ ÐºÐ»Ð°Ñтеризации Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\", оно пропуÑкаетÑÑ" + +#: commands/collationcmds.c:110 #, c-format msgid "collation attribute \"%s\" not recognized" msgstr "атрибут COLLATION \"%s\" не раÑпознан" -#: commands/collationcmds.c:119 commands/collationcmds.c:125 -#: commands/define.c:389 commands/tablecmds.c:7768 -#: replication/pgoutput/pgoutput.c:311 replication/pgoutput/pgoutput.c:334 -#: replication/pgoutput/pgoutput.c:348 replication/pgoutput/pgoutput.c:358 -#: replication/pgoutput/pgoutput.c:368 replication/pgoutput/pgoutput.c:378 -#: replication/walsender.c:1001 replication/walsender.c:1023 -#: replication/walsender.c:1033 +#: commands/collationcmds.c:123 commands/collationcmds.c:129 +#: commands/define.c:388 commands/tablecmds.c:8162 +#: replication/pgoutput/pgoutput.c:314 replication/pgoutput/pgoutput.c:337 +#: replication/pgoutput/pgoutput.c:351 replication/pgoutput/pgoutput.c:361 +#: replication/pgoutput/pgoutput.c:371 replication/pgoutput/pgoutput.c:381 +#: replication/pgoutput/pgoutput.c:393 replication/walsender.c:1150 +#: replication/walsender.c:1172 replication/walsender.c:1182 +#: replication/walsender.c:1191 replication/walsender.c:1430 #, c-format msgid "conflicting or redundant options" msgstr "конфликтующие или избыточные параметры" -#: commands/collationcmds.c:120 +#: commands/collationcmds.c:124 #, c-format msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." msgstr "LOCALE Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ вмеÑте Ñ LC_COLLATE или LC_CTYPE." -#: commands/collationcmds.c:126 +#: commands/collationcmds.c:130 #, c-format msgid "FROM cannot be specified together with any other options." msgstr "FROM Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ вмеÑте Ñ ÐºÐ°ÐºÐ¸Ð¼-либо другим параметром." -#: commands/collationcmds.c:174 +#: commands/collationcmds.c:189 #, c-format msgid "collation \"default\" cannot be copied" msgstr "правило Ñортировки \"default\" Ð½ÐµÐ»ÑŒÐ·Ñ Ñкопировать" -#: commands/collationcmds.c:204 +#: commands/collationcmds.c:225 #, c-format msgid "unrecognized collation provider: %s" msgstr "нераÑпознанный провайдер правил Ñортировки: %s" -#: commands/collationcmds.c:232 -#, c-format -msgid "parameter \"lc_collate\" must be specified" -msgstr "необходимо указать параметр \"lc_collate\"" - -#: commands/collationcmds.c:237 +#: commands/collationcmds.c:253 commands/collationcmds.c:264 +#: commands/collationcmds.c:270 commands/collationcmds.c:278 #, c-format -msgid "parameter \"lc_ctype\" must be specified" -msgstr "необходимо указать параметр \"lc_ctype\"" +msgid "parameter \"%s\" must be specified" +msgstr "необходимо указать параметр \"%s\"" -#: commands/collationcmds.c:244 +#: commands/collationcmds.c:293 commands/dbcommands.c:1134 #, c-format -msgid "parameter \"locale\" must be specified" -msgstr "необходимо указать параметр \"locale\"" +msgid "using standard form \"%s\" for ICU locale \"%s\"" +msgstr "иÑпользуетÑÑ ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° \"%s\" локали ICU \"%s\"" -#: commands/collationcmds.c:256 +#: commands/collationcmds.c:312 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "" "недетерминированные правила Ñортировки не поддерживаютÑÑ Ð´Ð°Ð½Ð½Ñ‹Ð¼ провайдером" -#: commands/collationcmds.c:275 +#: commands/collationcmds.c:317 commands/dbcommands.c:1087 +#, c-format +msgid "ICU rules cannot be specified unless locale provider is ICU" +msgstr "правила ICU можно указать, только еÑли выбран провайдер локали ICU" + +#: commands/collationcmds.c:340 #, c-format msgid "current database's encoding is not supported with this provider" msgstr "кодировка текущей БД не поддерживаетÑÑ Ð´Ð°Ð½Ð½Ñ‹Ð¼ провайдером" -#: commands/collationcmds.c:334 +#: commands/collationcmds.c:409 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "" "правило Ñортировки \"%s\" Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸ \"%s\" уже ÑущеÑтвует в Ñхеме \"%s\"" -#: commands/collationcmds.c:345 +#: commands/collationcmds.c:420 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "правило Ñортировки \"%s\" уже ÑущеÑтвует в Ñхеме \"%s\"" -#: commands/collationcmds.c:395 commands/dbcommands.c:2398 +#: commands/collationcmds.c:445 +#, c-format +msgid "cannot refresh version of default collation" +msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ верÑию правила Ñортировки по умолчанию" + +#. translator: %s is an SQL command +#. translator: %s is an SQL ALTER command +#: commands/collationcmds.c:447 commands/subscriptioncmds.c:1376 +#: commands/tablecmds.c:7938 commands/tablecmds.c:7948 +#: commands/tablecmds.c:7950 commands/tablecmds.c:14540 +#: commands/tablecmds.c:17925 commands/tablecmds.c:17946 +#: commands/typecmds.c:3787 commands/typecmds.c:3872 commands/typecmds.c:4226 +#, c-format +msgid "Use %s instead." +msgstr "Выполните %s." + +#: commands/collationcmds.c:480 commands/dbcommands.c:2566 #, c-format msgid "changing version from %s to %s" msgstr "изменение верÑии Ñ %s на %s" -#: commands/collationcmds.c:410 commands/dbcommands.c:2411 +#: commands/collationcmds.c:495 commands/dbcommands.c:2579 #, c-format msgid "version has not changed" msgstr "верÑÐ¸Ñ Ð½Ðµ была изменена" -#: commands/collationcmds.c:532 +#: commands/collationcmds.c:528 commands/dbcommands.c:2749 #, c-format -msgid "could not convert locale name \"%s\" to language tag: %s" -msgstr "не удалоÑÑŒ получить из Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" метку Ñзыка: %s" +msgid "database with OID %u does not exist" +msgstr "база данных Ñ OID %u не ÑущеÑтвует" + +#: commands/collationcmds.c:554 +#, c-format +msgid "collation with OID %u does not exist" +msgstr "правило Ñортировки Ñ OID %u не ÑущеÑтвует" -#: commands/collationcmds.c:590 +#: commands/collationcmds.c:848 #, c-format msgid "must be superuser to import system collations" msgstr "" "импортировать ÑиÑтемные правила Ñортировки может только Ñуперпользователь" -#: commands/collationcmds.c:618 commands/copyfrom.c:1499 commands/copyto.c:679 -#: libpq/be-secure-common.c:81 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "не удалоÑÑŒ выполнить команду \"%s\": %m" - -#: commands/collationcmds.c:753 +#: commands/collationcmds.c:968 commands/collationcmds.c:1053 #, c-format msgid "no usable system locales were found" msgstr "пригодные ÑиÑтемные локали не найдены" -#: commands/comment.c:61 commands/dbcommands.c:1538 commands/dbcommands.c:1735 -#: commands/dbcommands.c:1848 commands/dbcommands.c:2042 -#: commands/dbcommands.c:2284 commands/dbcommands.c:2371 -#: commands/dbcommands.c:2481 commands/dbcommands.c:2980 -#: utils/init/postinit.c:943 utils/init/postinit.c:1048 -#: utils/init/postinit.c:1065 +#: commands/comment.c:61 commands/dbcommands.c:1665 commands/dbcommands.c:1883 +#: commands/dbcommands.c:1995 commands/dbcommands.c:2193 +#: commands/dbcommands.c:2433 commands/dbcommands.c:2526 +#: commands/dbcommands.c:2650 commands/dbcommands.c:3161 +#: utils/init/postinit.c:1034 utils/init/postinit.c:1098 +#: utils/init/postinit.c:1171 #, c-format msgid "database \"%s\" does not exist" msgstr "база данных \"%s\" не ÑущеÑтвует" @@ -7317,42 +7837,42 @@ msgstr "база данных \"%s\" не ÑущеÑтвует" msgid "cannot set comment on relation \"%s\"" msgstr "задать комментарий Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: commands/constraint.c:63 utils/adt/ri_triggers.c:2014 +#: commands/constraint.c:61 utils/adt/ri_triggers.c:2019 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" была вызвана не менеджером триггеров" -#: commands/constraint.c:70 utils/adt/ri_triggers.c:2023 +#: commands/constraint.c:68 utils/adt/ri_triggers.c:2028 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" должна запуÑкатьÑÑ Ð² триггере AFTER Ð´Ð»Ñ Ñтрок" -#: commands/constraint.c:84 +#: commands/constraint.c:82 #, c-format msgid "function \"%s\" must be fired for INSERT or UPDATE" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" должна запуÑкатьÑÑ Ð´Ð»Ñ INSERT или UPDATE" -#: commands/conversioncmds.c:67 +#: commands/conversioncmds.c:62 #, c-format msgid "source encoding \"%s\" does not exist" msgstr "иÑÑ…Ð¾Ð´Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° \"%s\" не ÑущеÑтвует" -#: commands/conversioncmds.c:74 +#: commands/conversioncmds.c:69 #, c-format msgid "destination encoding \"%s\" does not exist" msgstr "Ñ†ÐµÐ»ÐµÐ²Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° \"%s\" не ÑущеÑтвует" -#: commands/conversioncmds.c:87 +#: commands/conversioncmds.c:82 #, c-format msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" msgstr "преобразование кодировки из/в \"SQL_ASCII\" не поддерживаетÑÑ" -#: commands/conversioncmds.c:100 +#: commands/conversioncmds.c:95 #, c-format msgid "encoding conversion function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸ %s должна возвращать тип %s" -#: commands/conversioncmds.c:130 +#: commands/conversioncmds.c:125 #, c-format msgid "" "encoding conversion function %s returned incorrect result for empty input" @@ -7360,16 +7880,21 @@ msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸ %s возвратила некорректный результат Ð´Ð»Ñ " "пуÑтой Ñтроки" -#: commands/copy.c:86 +#: commands/copy.c:84 +#, c-format +msgid "permission denied to COPY to or from an external program" +msgstr "нет прав Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ COPY Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ¹ программой" + +#: commands/copy.c:85 #, c-format msgid "" -"must be superuser or have privileges of the pg_execute_server_program role " -"to COPY to or from an external program" +"Only roles with privileges of the \"%s\" role may COPY to or from an " +"external program." msgstr "" -"Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ COPY Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ð¼Ð¸ программами нужно быть Ñуперпользователем " -"или иметь права роли pg_execute_server_program" +"ИÑпользовать COPY Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ð¼Ð¸ программами могут только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли " +"\"%s\"." -#: commands/copy.c:87 commands/copy.c:96 commands/copy.c:103 +#: commands/copy.c:87 commands/copy.c:98 commands/copy.c:107 #, c-format msgid "" "Anyone can COPY to stdout or from stdin. psql's \\copy command also works " @@ -7380,259 +7905,256 @@ msgstr "" #: commands/copy.c:95 #, c-format -msgid "" -"must be superuser or have privileges of the pg_read_server_files role to " -"COPY from a file" +msgid "permission denied to COPY from a file" +msgstr "нет прав Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ COPY Ñ Ñ‡Ñ‚ÐµÐ½Ð¸ÐµÐ¼ файла" + +#: commands/copy.c:96 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may COPY from a file." msgstr "" -"Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ COPY Ñ Ñ‡Ñ‚ÐµÐ½Ð¸ÐµÐ¼ файла нужно быть Ñуперпользователем или иметь " -"права роли pg_read_server_files" +"ВыполнÑть COPY Ñ Ñ‡Ñ‚ÐµÐ½Ð¸ÐµÐ¼ файла могут только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли \"%s\"." -#: commands/copy.c:102 +#: commands/copy.c:104 #, c-format -msgid "" -"must be superuser or have privileges of the pg_write_server_files role to " -"COPY to a file" +msgid "permission denied to COPY to a file" +msgstr "нет прав Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ COPY Ñ Ð·Ð°Ð¿Ð¸Ñью в файл" + +#: commands/copy.c:105 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may COPY to a file." msgstr "" -"Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ COPY Ñ Ð·Ð°Ð¿Ð¸Ñью в файл нужно быть Ñуперпользователем или иметь " -"права роли pg_write_server_files" +"ВыполнÑть COPY Ñ Ð·Ð°Ð¿Ð¸Ñью в файл могут только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли \"%s\"." -#: commands/copy.c:188 +#: commands/copy.c:193 #, c-format msgid "COPY FROM not supported with row-level security" msgstr "COPY FROM не поддерживаетÑÑ Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð¾Ð¹ на уровне Ñтрок." -#: commands/copy.c:189 +#: commands/copy.c:194 #, c-format msgid "Use INSERT statements instead." msgstr "ИÑпользуйте операторы INSERT." -#: commands/copy.c:280 -#, c-format -msgid "MERGE not supported in COPY" -msgstr "MERGE не поддерживаетÑÑ Ð² COPY" - -#: commands/copy.c:373 +#: commands/copy.c:375 #, c-format msgid "cannot use \"%s\" with HEADER in COPY TO" msgstr "иÑпользовать \"%s\" Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ HEADER в COPY TO нельзÑ" -#: commands/copy.c:382 +#: commands/copy.c:384 #, c-format msgid "%s requires a Boolean value or \"match\"" msgstr "%s требует логичеÑкое значение или \"match\"" -#: commands/copy.c:441 +#. translator: first %s is the name of a COPY option, e.g. ON_ERROR, +#. second %s is a COPY with direction, e.g. COPY TO +#: commands/copy.c:402 commands/copy.c:782 commands/copy.c:798 +#: commands/copy.c:815 commands/copy.c:841 commands/copy.c:851 +#, c-format +msgid "COPY %s cannot be used with %s" +msgstr "COPY %s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñ %s" + +#. translator: first %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:416 commands/copy.c:441 +#, c-format +msgid "COPY %s \"%s\" not recognized" +msgstr "параметр COPY %s \"%s\" не раÑпознан" + +#: commands/copy.c:502 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "формат \"%s\" Ð´Ð»Ñ COPY не раÑпознан" -#: commands/copy.c:493 commands/copy.c:506 commands/copy.c:519 -#: commands/copy.c:538 +#: commands/copy.c:560 commands/copy.c:575 commands/copy.c:590 +#: commands/copy.c:609 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "аргументом параметра \"%s\" должен быть ÑпиÑок имён Ñтолбцов" -#: commands/copy.c:550 +#: commands/copy.c:621 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "аргументом параметра \"%s\" должно быть название допуÑтимой кодировки" -#: commands/copy.c:557 commands/dbcommands.c:849 commands/dbcommands.c:2232 +#: commands/copy.c:642 commands/dbcommands.c:866 commands/dbcommands.c:2381 #, c-format msgid "option \"%s\" not recognized" msgstr "параметр \"%s\" не раÑпознан" -#: commands/copy.c:569 +#. translator: %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:655 commands/copy.c:660 commands/copy.c:665 +#: commands/copy.c:740 #, c-format -msgid "cannot specify DELIMITER in BINARY mode" -msgstr "в режиме BINARY Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ DELIMITER" +msgid "cannot specify %s in BINARY mode" +msgstr "в режиме BINARY Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ %s" -#: commands/copy.c:574 +#: commands/copy.c:670 #, c-format -msgid "cannot specify NULL in BINARY mode" -msgstr "в режиме BINARY Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ NULL" +msgid "only ON_ERROR STOP is allowed in BINARY mode" +msgstr "в режиме BINARY допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ ON_ERROR STOP" -#: commands/copy.c:596 +#: commands/copy.c:692 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "разделитель Ð´Ð»Ñ COPY должен быть однобайтным Ñимволом" -#: commands/copy.c:603 +#: commands/copy.c:699 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "" "разделителем Ð´Ð»Ñ COPY не может быть Ñимвол новой Ñтроки или возврата каретки" -#: commands/copy.c:609 +#: commands/copy.c:705 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "" "предÑтавление NULL Ð´Ð»Ñ COPY не может включать Ñимвол новой Ñтроки или " "возврата каретки" -#: commands/copy.c:626 +#: commands/copy.c:715 #, c-format -msgid "COPY delimiter cannot be \"%s\"" -msgstr "\"%s\" не может быть разделителем Ð´Ð»Ñ COPY" +msgid "COPY default representation cannot use newline or carriage return" +msgstr "" +"предÑтавление DEFAULT Ð´Ð»Ñ COPY не может включать Ñимвол новой Ñтроки или " +"возврата каретки" -#: commands/copy.c:632 +#: commands/copy.c:733 #, c-format -msgid "cannot specify HEADER in BINARY mode" -msgstr "в режиме BINARY Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать HEADER" +msgid "COPY delimiter cannot be \"%s\"" +msgstr "\"%s\" не может быть разделителем Ð´Ð»Ñ COPY" -#: commands/copy.c:638 +#. translator: %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:747 commands/copy.c:764 commands/copy.c:776 +#: commands/copy.c:791 commands/copy.c:807 #, c-format -msgid "COPY quote available only in CSV mode" -msgstr "определить кавычки Ð´Ð»Ñ COPY можно только в режиме CSV" +msgid "COPY %s requires CSV mode" +msgstr "Ð´Ð»Ñ COPY %s требуетÑÑ Ñ€ÐµÐ¶Ð¸Ð¼ CSV" -#: commands/copy.c:643 +#: commands/copy.c:752 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "Ñимвол кавычек Ð´Ð»Ñ COPY должен быть однобайтным" -#: commands/copy.c:648 +#: commands/copy.c:757 #, c-format msgid "COPY delimiter and quote must be different" msgstr "Ñимвол кавычек Ð´Ð»Ñ COPY должен отличатьÑÑ Ð¾Ñ‚ разделителÑ" -#: commands/copy.c:654 -#, c-format -msgid "COPY escape available only in CSV mode" -msgstr "определить ÑпецÑимвол Ð´Ð»Ñ COPY можно только в режиме CSV" - -#: commands/copy.c:659 +#: commands/copy.c:769 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "ÑпецÑимвол Ð´Ð»Ñ COPY должен быть однобайтным" -#: commands/copy.c:665 +#. translator: %s is the name of a COPY option, e.g. NULL +#: commands/copy.c:823 commands/copy.c:859 #, c-format -msgid "COPY force quote available only in CSV mode" -msgstr "параметр force quote Ð´Ð»Ñ COPY можно иÑпользовать только в режиме CSV" +msgid "COPY delimiter character must not appear in the %s specification" +msgstr "Ñимвол Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ COPY не должен приÑутÑтвовать в указании %s" -#: commands/copy.c:669 +#. translator: %s is the name of a COPY option, e.g. NULL +#: commands/copy.c:832 commands/copy.c:868 #, c-format -msgid "COPY force quote only available using COPY TO" -msgstr "параметр force quote Ð´Ð»Ñ COPY можно иÑпользовать только Ñ COPY TO" +msgid "CSV quote character must not appear in the %s specification" +msgstr "Ñимвол кавычек в CSV не должен приÑутÑтвовать в указании %s" -#: commands/copy.c:675 +#: commands/copy.c:877 #, c-format -msgid "COPY force not null available only in CSV mode" -msgstr "" -"параметр force not null Ð´Ð»Ñ COPY можно иÑпользовать только в режиме CSV" +msgid "NULL specification and DEFAULT specification cannot be the same" +msgstr "предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ NULL и DEFAULT не могут быть одинаковыми" -#: commands/copy.c:679 +#: commands/copy.c:939 #, c-format -msgid "COPY force not null only available using COPY FROM" -msgstr "параметр force not null Ð´Ð»Ñ COPY можно иÑпользовать только Ñ COPY FROM" +msgid "column \"%s\" is a generated column" +msgstr "Ñтолбец \"%s\" — генерируемый" -#: commands/copy.c:685 -#, c-format -msgid "COPY force null available only in CSV mode" -msgstr "параметр force null Ð´Ð»Ñ COPY можно иÑпользовать только в режиме CSV" - -#: commands/copy.c:690 -#, c-format -msgid "COPY force null only available using COPY FROM" -msgstr "параметр force null Ð´Ð»Ñ COPY можно иÑпользовать только Ñ COPY FROM" - -#: commands/copy.c:696 -#, c-format -msgid "COPY delimiter must not appear in the NULL specification" -msgstr "разделитель Ð´Ð»Ñ COPY не должен приÑутÑтвовать в предÑтавлении NULL" - -#: commands/copy.c:703 -#, c-format -msgid "CSV quote character must not appear in the NULL specification" -msgstr "Ñимвол кавычек в CSV не должен приÑутÑтвовать в предÑтавлении NULL" - -#: commands/copy.c:764 -#, c-format -msgid "column \"%s\" is a generated column" -msgstr "Ñтолбец \"%s\" — генерируемый" - -#: commands/copy.c:766 +#: commands/copy.c:941 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "Генерируемые Ñтолбцы Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в COPY." -#: commands/copy.c:781 commands/indexcmds.c:1833 commands/statscmds.c:243 -#: commands/tablecmds.c:2379 commands/tablecmds.c:3035 -#: commands/tablecmds.c:3529 parser/parse_relation.c:3655 -#: parser/parse_relation.c:3675 utils/adt/tsvector_op.c:2688 +#: commands/copy.c:956 commands/indexcmds.c:1890 commands/statscmds.c:239 +#: commands/tablecmds.c:2526 commands/tablecmds.c:2997 +#: commands/tablecmds.c:3808 parser/parse_relation.c:3692 +#: parser/parse_relation.c:3702 parser/parse_relation.c:3720 +#: parser/parse_relation.c:3727 parser/parse_relation.c:3741 +#: utils/adt/tsvector_op.c:2853 #, c-format msgid "column \"%s\" does not exist" msgstr "Ñтолбец \"%s\" не ÑущеÑтвует" -#: commands/copy.c:788 commands/tablecmds.c:2405 commands/trigger.c:967 -#: parser/parse_target.c:1079 parser/parse_target.c:1090 +#: commands/copy.c:963 commands/tablecmds.c:2552 commands/trigger.c:951 +#: parser/parse_target.c:1083 parser/parse_target.c:1094 #, c-format msgid "column \"%s\" specified more than once" msgstr "Ñтолбец \"%s\" указан неоднократно" -#: commands/copyfrom.c:123 +#: commands/copyfrom.c:118 +#, c-format +msgid "COPY %s" +msgstr "COPY %s" + +#: commands/copyfrom.c:126 #, c-format msgid "COPY %s, line %llu, column %s" msgstr "COPY %s, Ñтрока %llu, Ñтолбец %s" -#: commands/copyfrom.c:128 commands/copyfrom.c:174 +#: commands/copyfrom.c:131 commands/copyfrom.c:177 #, c-format msgid "COPY %s, line %llu" msgstr "COPY %s, Ñтрока %llu" -#: commands/copyfrom.c:140 +#: commands/copyfrom.c:143 #, c-format msgid "COPY %s, line %llu, column %s: \"%s\"" msgstr "COPY %s, Ñтрока %llu, Ñтолбец %s: \"%s\"" -#: commands/copyfrom.c:150 +#: commands/copyfrom.c:153 #, c-format msgid "COPY %s, line %llu, column %s: null input" msgstr "COPY %s, Ñтрока %llu, Ñтолбец %s: значение NULL" -#: commands/copyfrom.c:167 +#: commands/copyfrom.c:170 #, c-format msgid "COPY %s, line %llu: \"%s\"" msgstr "COPY %s, Ñтрока %llu: \"%s\"" -#: commands/copyfrom.c:569 +#: commands/copyfrom.c:673 #, c-format msgid "cannot copy to view \"%s\"" msgstr "копировать в предÑтавление \"%s\" нельзÑ" -#: commands/copyfrom.c:571 +#: commands/copyfrom.c:675 #, c-format msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." msgstr "" "Чтобы предÑтавление допуÑкало копирование данных в него, уÑтановите триггер " "INSTEAD OF INSERT." -#: commands/copyfrom.c:575 +#: commands/copyfrom.c:679 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "копировать в материализованное предÑтавление \"%s\" нельзÑ" -#: commands/copyfrom.c:580 +#: commands/copyfrom.c:684 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "копировать в поÑледовательноÑть \"%s\" нельзÑ" -#: commands/copyfrom.c:585 +#: commands/copyfrom.c:689 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "копировать в отношение \"%s\", не ÑвлÑющееÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÐµÐ¹, нельзÑ" -#: commands/copyfrom.c:625 +#: commands/copyfrom.c:729 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "выполнить COPY FREEZE в Ñекционированной таблице нельзÑ" -#: commands/copyfrom.c:640 +#: commands/copyfrom.c:744 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "выполнить COPY FREEZE Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·-за предыдущей активноÑти в транзакции" -#: commands/copyfrom.c:646 +#: commands/copyfrom.c:750 #, c-format msgid "" "cannot perform COPY FREEZE because the table was not created or truncated in " @@ -7641,17 +8163,29 @@ msgstr "" "выполнить COPY FREEZE нельзÑ, так как таблица не была Ñоздана или уÑечена в " "текущей подтранзакции" -#: commands/copyfrom.c:1267 commands/copyto.c:611 +#: commands/copyfrom.c:1313 +#, c-format +msgid "%llu row was skipped due to data type incompatibility" +msgid_plural "%llu rows were skipped due to data type incompatibility" +msgstr[0] "из-за неÑовмеÑтимоÑти типов данных пропущена %llu Ñтрока" +msgstr[1] "из-за неÑовмеÑтимоÑти типов данных пропущены %llu Ñтроки" +msgstr[2] "из-за неÑовмеÑтимоÑти типов данных пропущены %llu Ñтрок" + +#. translator: first %s is the name of a COPY option, e.g. FORCE_NOT_NULL +#. translator: %s is the name of a COPY option, e.g. FORCE_NOT_NULL +#: commands/copyfrom.c:1448 commands/copyfrom.c:1491 commands/copyto.c:601 #, c-format -msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" -msgstr "Ñтолбец FORCE_NOT_NULL \"%s\" не фигурирует в COPY" +msgid "%s column \"%s\" not referenced by COPY" +msgstr "Ñтолбец %s \"%s\" не входит в ÑпиÑок Ñтолбцов COPY" -#: commands/copyfrom.c:1290 commands/copyto.c:634 +#: commands/copyfrom.c:1544 utils/mb/mbutils.c:385 #, c-format -msgid "FORCE_NULL column \"%s\" not referenced by COPY" -msgstr "Ñтолбец FORCE_NULL \"%s\" не фигурирует в COPY" +msgid "" +"default conversion function for encoding \"%s\" to \"%s\" does not exist" +msgstr "" +"Ñтандартной функции Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð· кодировки \"%s\" в \"%s\" не ÑущеÑтвует" -#: commands/copyfrom.c:1518 +#: commands/copyfrom.c:1742 #, c-format msgid "" "COPY FROM instructs the PostgreSQL server process to read a file. You may " @@ -7661,17 +8195,17 @@ msgstr "" "файла. Возможно, на Ñамом деле вам нужно клиентÑкое ÑредÑтво, например, " "\\copy в psql." -#: commands/copyfrom.c:1531 commands/copyto.c:731 +#: commands/copyfrom.c:1755 commands/copyto.c:706 #, c-format msgid "\"%s\" is a directory" msgstr "\"%s\" - Ñто каталог" -#: commands/copyfrom.c:1599 commands/copyto.c:301 libpq/be-secure-common.c:105 +#: commands/copyfrom.c:1823 commands/copyto.c:299 libpq/be-secure-common.c:83 #, c-format msgid "could not close pipe to external command: %m" msgstr "не удалоÑÑŒ закрыть канал Ñообщений Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ¹ командой: %m" -#: commands/copyfrom.c:1614 commands/copyto.c:306 +#: commands/copyfrom.c:1838 commands/copyto.c:304 #, c-format msgid "program \"%s\" failed" msgstr "Ñбой программы \"%s\"" @@ -7712,17 +8246,17 @@ msgid "could not read from COPY file: %m" msgstr "не удалоÑÑŒ прочитать файл COPY: %m" #: commands/copyfromparse.c:278 commands/copyfromparse.c:303 -#: tcop/postgres.c:358 +#: replication/walsender.c:760 replication/walsender.c:786 tcop/postgres.c:381 #, c-format msgid "unexpected EOF on client connection with an open transaction" msgstr "неожиданный обрыв ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð¼ при открытой транзакции" -#: commands/copyfromparse.c:294 +#: commands/copyfromparse.c:294 replication/walsender.c:776 #, c-format msgid "unexpected message type 0x%02X during COPY from stdin" msgstr "неожиданный тип ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ 0x%02X при вводе данных COPY из stdin" -#: commands/copyfromparse.c:317 +#: commands/copyfromparse.c:317 replication/walsender.c:807 #, c-format msgid "COPY from stdin failed: %s" msgstr "ошибка при вводе данных COPY из stdin: %s" @@ -7749,194 +8283,222 @@ msgstr "" "неÑоответÑтвие имени Ñтолбца в поле %d Ñтроки заголовка: получено \"%s\", " "ожидалоÑÑŒ \"%s\"" -#: commands/copyfromparse.c:890 commands/copyfromparse.c:1495 -#: commands/copyfromparse.c:1725 +#: commands/copyfromparse.c:892 commands/copyfromparse.c:1554 +#: commands/copyfromparse.c:1810 #, c-format msgid "extra data after last expected column" msgstr "лишние данные поÑле Ñодержимого поÑледнего Ñтолбца" -#: commands/copyfromparse.c:904 +#: commands/copyfromparse.c:906 #, c-format msgid "missing data for column \"%s\"" msgstr "нет данных Ð´Ð»Ñ Ñтолбца \"%s\"" -#: commands/copyfromparse.c:982 +#: commands/copyfromparse.c:990 +#, c-format +msgid "" +"skipping row due to data type incompatibility at line %llu for column " +"\"%s\": \"%s\"" +msgstr "" +"Ñтрока пропуÑкаетÑÑ Ð¸Ð·-за неÑовмеÑтимоÑти данных в Ñтроке %llu, Ñтолбце " +"\"%s\": \"%s\"" + +#: commands/copyfromparse.c:998 +#, c-format +msgid "" +"skipping row due to data type incompatibility at line %llu for column " +"\"%s\": null input" +msgstr "" +"Ñтрока пропуÑкаетÑÑ Ð¸Ð·-за неÑовмеÑтимоÑти данных в Ñтроке %llu, Ñтолбце " +"\"%s\": значение null" + +#: commands/copyfromparse.c:1044 #, c-format msgid "received copy data after EOF marker" msgstr "поÑле маркера конца файла продолжаютÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ COPY" -#: commands/copyfromparse.c:989 +#: commands/copyfromparse.c:1051 #, c-format msgid "row field count is %d, expected %d" msgstr "количеÑтво полей в Ñтроке: %d, ожидалоÑÑŒ: %d" -#: commands/copyfromparse.c:1277 commands/copyfromparse.c:1294 +#: commands/copyfromparse.c:1336 commands/copyfromparse.c:1353 #, c-format msgid "literal carriage return found in data" msgstr "в данных обнаружен Ñвный возврат каретки" -#: commands/copyfromparse.c:1278 commands/copyfromparse.c:1295 +#: commands/copyfromparse.c:1337 commands/copyfromparse.c:1354 #, c-format msgid "unquoted carriage return found in data" msgstr "в данных обнаружен возврат каретки не в кавычках" -#: commands/copyfromparse.c:1280 commands/copyfromparse.c:1297 +#: commands/copyfromparse.c:1339 commands/copyfromparse.c:1356 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "ПредÑтавьте возврат каретки как \"\\r\"." -#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 +#: commands/copyfromparse.c:1340 commands/copyfromparse.c:1357 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "Заключите возврат каретки в кавычки CSV." -#: commands/copyfromparse.c:1310 +#: commands/copyfromparse.c:1369 #, c-format msgid "literal newline found in data" msgstr "в данных обнаружен Ñвный Ñимвол новой Ñтроки" -#: commands/copyfromparse.c:1311 +#: commands/copyfromparse.c:1370 #, c-format msgid "unquoted newline found in data" msgstr "в данных обнаружен Ñвный Ñимвол новой Ñтроки не в кавычках" -#: commands/copyfromparse.c:1313 +#: commands/copyfromparse.c:1372 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "ПредÑтавьте Ñимвол новой Ñтроки как \"\\n\"." -#: commands/copyfromparse.c:1314 +#: commands/copyfromparse.c:1373 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "Заключите Ñимвол новой Ñтроки в кавычки CSV." -#: commands/copyfromparse.c:1360 commands/copyfromparse.c:1396 +#: commands/copyfromparse.c:1419 commands/copyfromparse.c:1455 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "маркер \"конец копии\" не ÑоответÑтвует предыдущему Ñтилю новой Ñтроки" -#: commands/copyfromparse.c:1369 commands/copyfromparse.c:1385 +#: commands/copyfromparse.c:1428 commands/copyfromparse.c:1444 #, c-format msgid "end-of-copy marker corrupt" msgstr "маркер \"конец копии\" иÑпорчен" -#: commands/copyfromparse.c:1809 +#: commands/copyfromparse.c:1746 commands/copyfromparse.c:1961 +#, c-format +msgid "unexpected default marker in COPY data" +msgstr "неожиданный маркер DEFAULT в данных COPY" + +#: commands/copyfromparse.c:1747 commands/copyfromparse.c:1962 +#, c-format +msgid "Column \"%s\" has no default value." +msgstr "Ð”Ð»Ñ Ñтолбца \"%s\" не определено значение по умолчанию." + +#: commands/copyfromparse.c:1894 #, c-format msgid "unterminated CSV quoted field" msgstr "незавершённое поле в кавычках CSV" -#: commands/copyfromparse.c:1885 commands/copyfromparse.c:1904 +#: commands/copyfromparse.c:1996 commands/copyfromparse.c:2015 #, c-format msgid "unexpected EOF in COPY data" msgstr "неожиданный конец данных COPY" -#: commands/copyfromparse.c:1894 +#: commands/copyfromparse.c:2005 #, c-format msgid "invalid field size" msgstr "неверный размер полÑ" -#: commands/copyfromparse.c:1917 +#: commands/copyfromparse.c:2028 #, c-format msgid "incorrect binary data format" msgstr "неверный двоичный формат данных" -#: commands/copyto.c:234 +#: commands/copyto.c:229 #, c-format msgid "could not write to COPY program: %m" msgstr "не удалоÑÑŒ запиÑать в канал программы COPY: %m" -#: commands/copyto.c:239 +#: commands/copyto.c:234 #, c-format msgid "could not write to COPY file: %m" msgstr "не удалоÑÑŒ запиÑать в файл COPY: %m" -#: commands/copyto.c:369 +#: commands/copyto.c:379 #, c-format msgid "cannot copy from view \"%s\"" msgstr "копировать из предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: commands/copyto.c:371 commands/copyto.c:377 commands/copyto.c:383 -#: commands/copyto.c:394 +#: commands/copyto.c:381 commands/copyto.c:387 commands/copyto.c:393 +#: commands/copyto.c:404 #, c-format msgid "Try the COPY (SELECT ...) TO variant." msgstr "Попробуйте вариацию COPY (SELECT ...) TO." -#: commands/copyto.c:375 +#: commands/copyto.c:385 #, c-format msgid "cannot copy from materialized view \"%s\"" msgstr "копировать из материализованного предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: commands/copyto.c:381 +#: commands/copyto.c:391 #, c-format msgid "cannot copy from foreign table \"%s\"" msgstr "копировать из Ñторонней таблицы \"%s\" нельзÑ" -#: commands/copyto.c:387 +#: commands/copyto.c:397 #, c-format msgid "cannot copy from sequence \"%s\"" msgstr "копировать из поÑледовательноÑти \"%s\" нельзÑ" -#: commands/copyto.c:392 +#: commands/copyto.c:402 #, c-format msgid "cannot copy from partitioned table \"%s\"" msgstr "копировать из Ñекционированной таблицы \"%s\" нельзÑ" -#: commands/copyto.c:398 +#: commands/copyto.c:408 #, c-format msgid "cannot copy from non-table relation \"%s\"" msgstr "копировать из Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\", не ÑвлÑющегоÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÐµÐ¹, нельзÑ" -#: commands/copyto.c:450 +#: commands/copyto.c:460 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for COPY" msgstr "правила DO INSTEAD NOTHING не поддерживаютÑÑ Ñ COPY" -#: commands/copyto.c:464 +#: commands/copyto.c:474 #, c-format msgid "conditional DO INSTEAD rules are not supported for COPY" msgstr "уÑловные правила DO INSTEAD не поддерживаютÑÑ Ñ COPY" -#: commands/copyto.c:468 +#: commands/copyto.c:478 #, c-format -msgid "DO ALSO rules are not supported for the COPY" +msgid "DO ALSO rules are not supported for COPY" msgstr "правила DO ALSO не поддерживаютÑÑ Ñ COPY" -#: commands/copyto.c:473 +#: commands/copyto.c:483 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for COPY" msgstr "ÑоÑтавные правила DO INSTEAD не поддерживаютÑÑ Ñ COPY" -#: commands/copyto.c:483 +#: commands/copyto.c:493 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO) не поддерживаетÑÑ" -#: commands/copyto.c:500 +#: commands/copyto.c:499 +#, c-format +msgid "COPY query must not be a utility command" +msgstr "ÑÐ»ÑƒÐ¶ÐµÐ±Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° в запроÑе COPY не допуÑкаетÑÑ" + +#: commands/copyto.c:515 #, c-format msgid "COPY query must have a RETURNING clause" msgstr "в запроÑе COPY должно быть предложение RETURNING" -#: commands/copyto.c:529 +#: commands/copyto.c:544 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "отношение, задейÑтвованное в операторе COPY, изменилоÑÑŒ" -#: commands/copyto.c:588 -#, c-format -msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" -msgstr "Ñтолбец FORCE_QUOTE \"%s\" не фигурирует в COPY" - -#: commands/copyto.c:696 +#: commands/copyto.c:671 #, c-format msgid "relative path not allowed for COPY to file" msgstr "при выполнении COPY в файл Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ отноÑительный путь" -#: commands/copyto.c:715 +#: commands/copyto.c:690 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи: %m" -#: commands/copyto.c:718 +#: commands/copyto.c:693 #, c-format msgid "" "COPY TO instructs the PostgreSQL server process to write a file. You may " @@ -7946,103 +8508,135 @@ msgstr "" "Возможно, на Ñамом деле вам нужно клиентÑкое ÑредÑтво, например, \\copy в " "psql." -#: commands/createas.c:215 commands/createas.c:523 +#: commands/createas.c:210 commands/createas.c:516 #, c-format msgid "too many column names were specified" msgstr "указано Ñлишком много имён Ñтолбцов" -#: commands/createas.c:546 +#: commands/createas.c:539 #, c-format msgid "policies not yet implemented for this command" msgstr "политики Ð´Ð»Ñ Ñтой команды ещё не реализованы" -#: commands/dbcommands.c:812 +#: commands/dbcommands.c:829 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION больше не поддерживаетÑÑ" -#: commands/dbcommands.c:813 +#: commands/dbcommands.c:830 #, c-format msgid "Consider using tablespaces instead." msgstr "РаÑÑмотрите возможноÑть иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… проÑтранÑтв." -#: commands/dbcommands.c:838 +#: commands/dbcommands.c:855 #, c-format msgid "OIDs less than %u are reserved for system objects" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ OID меньше %u зарезервированы Ð´Ð»Ñ ÑиÑтемных объектов" -#: commands/dbcommands.c:869 utils/adt/ascii.c:145 +#: commands/dbcommands.c:886 utils/adt/ascii.c:146 #, c-format msgid "%d is not a valid encoding code" msgstr "%d не ÑвлÑетÑÑ Ð²ÐµÑ€Ð½Ñ‹Ð¼ кодом кодировки" -#: commands/dbcommands.c:880 utils/adt/ascii.c:127 +#: commands/dbcommands.c:897 utils/adt/ascii.c:128 #, c-format msgid "%s is not a valid encoding name" msgstr "%s не ÑвлÑетÑÑ Ð²ÐµÑ€Ð½Ñ‹Ð¼ названием кодировки" -#: commands/dbcommands.c:907 +#: commands/dbcommands.c:931 #, c-format msgid "unrecognized locale provider: %s" msgstr "нераÑпознанный провайдер локали: %s" -#: commands/dbcommands.c:920 commands/dbcommands.c:2265 commands/user.c:237 -#: commands/user.c:611 +#: commands/dbcommands.c:944 commands/dbcommands.c:2414 commands/user.c:299 +#: commands/user.c:739 #, c-format msgid "invalid connection limit: %d" msgstr "неверный предел подключений: %d" -#: commands/dbcommands.c:941 +#: commands/dbcommands.c:965 #, c-format msgid "permission denied to create database" -msgstr "нет прав на Ñоздание базы данных" +msgstr "нет прав Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных" -#: commands/dbcommands.c:965 +#: commands/dbcommands.c:989 #, c-format msgid "template database \"%s\" does not exist" msgstr "шаблон базы данных \"%s\" не ÑущеÑтвует" -#: commands/dbcommands.c:977 +#: commands/dbcommands.c:999 +#, c-format +msgid "cannot use invalid database \"%s\" as template" +msgstr "иÑпользовать некорректную базу \"%s\" в качеÑтве шаблона нельзÑ" + +#: commands/dbcommands.c:1000 commands/dbcommands.c:2444 +#: utils/init/postinit.c:1113 +#, c-format +msgid "Use DROP DATABASE to drop invalid databases." +msgstr "Выполните DROP DATABASE Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ñ‹Ñ… баз данных." + +#: commands/dbcommands.c:1011 #, c-format msgid "permission denied to copy database \"%s\"" -msgstr "нет прав на копирование базы данных \"%s\"" +msgstr "нет прав Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных \"%s\"" -#: commands/dbcommands.c:994 +#: commands/dbcommands.c:1028 #, c-format msgid "invalid create database strategy \"%s\"" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð‘Ð” \"%s\"" -#: commands/dbcommands.c:995 +#: commands/dbcommands.c:1029 #, c-format -msgid "Valid strategies are \"wal_log\", and \"file_copy\"." +msgid "Valid strategies are \"wal_log\" and \"file_copy\"." msgstr "Возможные Ñтратегии: \"wal_log\" и \"file_copy\"." -#: commands/dbcommands.c:1014 +#: commands/dbcommands.c:1050 #, c-format msgid "invalid server encoding %d" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° Ð´Ð»Ñ Ñервера: %d" -#: commands/dbcommands.c:1020 commands/dbcommands.c:1025 +#: commands/dbcommands.c:1056 #, c-format -msgid "invalid locale name: \"%s\"" -msgstr "неверное Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸: \"%s\"" +msgid "invalid LC_COLLATE locale name: \"%s\"" +msgstr "неверное Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ LC_COLLATE: \"%s\"" -#: commands/dbcommands.c:1035 +#: commands/dbcommands.c:1057 commands/dbcommands.c:1063 #, c-format -msgid "encoding \"%s\" is not supported with ICU provider" -msgstr "кодировка \"%s\" не поддерживаетÑÑ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ð¾Ð¼ ICU" +msgid "If the locale name is specific to ICU, use ICU_LOCALE." +msgstr "ЕÑли Ñта локаль ÑвойÑтвенна ICU, иÑпользуйте ICU_LOCALE." + +#: commands/dbcommands.c:1062 +#, c-format +msgid "invalid LC_CTYPE locale name: \"%s\"" +msgstr "неверное Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ LC_CTYPE: \"%s\"" -#: commands/dbcommands.c:1045 +#: commands/dbcommands.c:1074 #, c-format -msgid "ICU locale must be specified" -msgstr "необходимо задать локаль ICU" +msgid "BUILTIN_LOCALE cannot be specified unless locale provider is builtin" +msgstr "" +"BUILTIN_LOCALE можно указать, только еÑли выбран вÑтроенный провайдер локали" -#: commands/dbcommands.c:1054 +#: commands/dbcommands.c:1082 #, c-format msgid "ICU locale cannot be specified unless locale provider is ICU" msgstr "локаль ICU можно указать, только еÑли выбран провайдер локали ICU" -#: commands/dbcommands.c:1072 +#: commands/dbcommands.c:1100 +#, c-format +msgid "LOCALE or BUILTIN_LOCALE must be specified" +msgstr "необходимо указать LOCALE или BUILTIN_LOCALE" + +#: commands/dbcommands.c:1109 +#, c-format +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "кодировка \"%s\" не поддерживаетÑÑ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ð¾Ð¼ ICU" + +#: commands/dbcommands.c:1119 +#, c-format +msgid "LOCALE or ICU_LOCALE must be specified" +msgstr "необходимо задать LOCALE или ICU_LOCALE" + +#: commands/dbcommands.c:1163 #, c-format msgid "" "new encoding (%s) is incompatible with the encoding of the template database " @@ -8050,7 +8644,7 @@ msgid "" msgstr "" "Ð½Ð¾Ð²Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° (%s) неÑовмеÑтима Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¾Ð¹ шаблона базы данных (%s)" -#: commands/dbcommands.c:1075 +#: commands/dbcommands.c:1166 #, c-format msgid "" "Use the same encoding as in the template database, or use template0 as " @@ -8059,7 +8653,7 @@ msgstr "" "ИÑпользуйте кодировку шаблона базы данных или выберите в качеÑтве шаблона " "template0." -#: commands/dbcommands.c:1080 +#: commands/dbcommands.c:1171 #, c-format msgid "" "new collation (%s) is incompatible with the collation of the template " @@ -8068,7 +8662,7 @@ msgstr "" "новое правило Ñортировки (%s) неÑовмеÑтимо Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð¾Ð¼ в шаблоне базы данных " "(%s)" -#: commands/dbcommands.c:1082 +#: commands/dbcommands.c:1173 #, c-format msgid "" "Use the same collation as in the template database, or use template0 as " @@ -8077,7 +8671,7 @@ msgstr "" "ИÑпользуйте то же правило Ñортировки, что и в шаблоне базы данных, или " "выберите в качеÑтве шаблона template0." -#: commands/dbcommands.c:1087 +#: commands/dbcommands.c:1178 #, c-format msgid "" "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database " @@ -8086,7 +8680,7 @@ msgstr "" "новый параметр LC_CTYPE (%s) неÑовмеÑтим Ñ LC_CTYPE в шаблоне базы данных " "(%s)" -#: commands/dbcommands.c:1089 +#: commands/dbcommands.c:1180 #, c-format msgid "" "Use the same LC_CTYPE as in the template database, or use template0 as " @@ -8095,7 +8689,7 @@ msgstr "" "ИÑпользуйте тот же LC_CTYPE, что и в шаблоне базы данных, или выберите в " "качеÑтве шаблона template0." -#: commands/dbcommands.c:1094 +#: commands/dbcommands.c:1185 #, c-format msgid "" "new locale provider (%s) does not match locale provider of the template " @@ -8104,7 +8698,7 @@ msgstr "" "новый провайдер локали (%s) не ÑоответÑтвует провайдеру локали в базе-" "шаблоне (%s)" -#: commands/dbcommands.c:1096 +#: commands/dbcommands.c:1187 #, c-format msgid "" "Use the same locale provider as in the template database, or use template0 " @@ -8113,14 +8707,14 @@ msgstr "" "ИÑпользуйте тот же провайдер локали, что и в базе-шаблоне, или выберите в " "качеÑтве шаблона template0." -#: commands/dbcommands.c:1105 +#: commands/dbcommands.c:1199 #, c-format msgid "" "new ICU locale (%s) is incompatible with the ICU locale of the template " "database (%s)" msgstr "Ð½Ð¾Ð²Ð°Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒ ICU (%s) неÑовмеÑтима Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÑŽ ICU в базе-шаблоне (%s)" -#: commands/dbcommands.c:1107 +#: commands/dbcommands.c:1201 #, c-format msgid "" "Use the same ICU locale as in the template database, or use template0 as " @@ -8129,7 +8723,25 @@ msgstr "" "ИÑпользуйте ту же локаль ICU, что и в базе-шаблоне, или выберите в качеÑтве " "шаблона template0." -#: commands/dbcommands.c:1130 +#: commands/dbcommands.c:1212 +#, c-format +msgid "" +"new ICU collation rules (%s) are incompatible with the ICU collation rules " +"of the template database (%s)" +msgstr "" +"новые правила Ñортировки ICU (%s) неÑовмеÑтимы Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°Ð¼Ð¸ Ñортировки в " +"шаблоне базы данных (%s)" + +#: commands/dbcommands.c:1214 +#, c-format +msgid "" +"Use the same ICU collation rules as in the template database, or use " +"template0 as template." +msgstr "" +"ИÑпользуйте те же правила Ñортировки, что и в шаблоне базы данных, или " +"выберите в качеÑтве шаблона template0." + +#: commands/dbcommands.c:1243 #, c-format msgid "" "template database \"%s\" has a collation version, but no actual collation " @@ -8138,13 +8750,13 @@ msgstr "" "в шаблоне \"%s\" имеетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° Ñортировки, но фактичеÑкую верÑию " "правила Ñортировки определить нельзÑ" -#: commands/dbcommands.c:1135 +#: commands/dbcommands.c:1248 #, c-format msgid "template database \"%s\" has a collation version mismatch" msgstr "" "в базе-шаблоне \"%s\" обнаружено неÑоответÑтвие верÑии правила Ñортировки" -#: commands/dbcommands.c:1137 +#: commands/dbcommands.c:1250 #, c-format msgid "" "The template database was created using collation version %s, but the " @@ -8153,7 +8765,7 @@ msgstr "" "База-шаблон была Ñоздана Ñ Ð²ÐµÑ€Ñией правила Ñортировки %s, но Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ " "ÑиÑтема предоÑтавлÑет верÑию %s." -#: commands/dbcommands.c:1140 +#: commands/dbcommands.c:1253 #, c-format msgid "" "Rebuild all objects in the template database that use the default collation " @@ -8164,18 +8776,18 @@ msgstr "" "Ñортировки, и выполните ALTER DATABASE %s REFRESH COLLATION VERSION, либо " "Ñоберите PostgreSQL Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð¹ верÑией библиотеки." -#: commands/dbcommands.c:1176 commands/dbcommands.c:1894 +#: commands/dbcommands.c:1298 commands/dbcommands.c:2041 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "" "pg_global Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в качеÑтве табличного проÑтранÑтва по умолчанию" -#: commands/dbcommands.c:1202 +#: commands/dbcommands.c:1324 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "не удалоÑÑŒ назначить новое табличное проÑтранÑтво по умолчанию \"%s\"" -#: commands/dbcommands.c:1204 +#: commands/dbcommands.c:1326 #, c-format msgid "" "There is a conflict because database \"%s\" already has some tables in this " @@ -8184,62 +8796,63 @@ msgstr "" "База данных \"%s\" Ñодержит таблицы, которые уже находÑÑ‚ÑÑ Ð² Ñтом табличном " "проÑтранÑтве." -#: commands/dbcommands.c:1234 commands/dbcommands.c:1764 +#: commands/dbcommands.c:1356 commands/dbcommands.c:1912 #, c-format msgid "database \"%s\" already exists" msgstr "база данных \"%s\" уже ÑущеÑтвует" -#: commands/dbcommands.c:1248 +#: commands/dbcommands.c:1370 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "иÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð±Ð°Ð·Ð° \"%s\" занÑта другими пользователÑми" -#: commands/dbcommands.c:1270 +#: commands/dbcommands.c:1392 #, c-format msgid "database OID %u is already in use by database \"%s\"" msgstr "OID базы данных %u уже иÑпользуетÑÑ Ð±Ð°Ð·Ð¾Ð¹ данных \"%s\"" -#: commands/dbcommands.c:1276 +#: commands/dbcommands.c:1398 #, c-format msgid "data directory with the specified OID %u already exists" msgstr "каталог данных Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ OID %u уже ÑущеÑтвует" -#: commands/dbcommands.c:1447 commands/dbcommands.c:1462 +#: commands/dbcommands.c:1571 commands/dbcommands.c:1586 +#: utils/adt/pg_locale.c:2588 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "кодировка \"%s\" не ÑоответÑтвует локали \"%s\"" -#: commands/dbcommands.c:1450 +#: commands/dbcommands.c:1574 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "Ð”Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ параметра LC_CTYPE требуетÑÑ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° \"%s\"." -#: commands/dbcommands.c:1465 +#: commands/dbcommands.c:1589 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "Ð”Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ параметра LC_COLLATE требуетÑÑ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° \"%s\"." -#: commands/dbcommands.c:1545 +#: commands/dbcommands.c:1672 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "база данных \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dbcommands.c:1569 +#: commands/dbcommands.c:1696 #, c-format msgid "cannot drop a template database" msgstr "удалить шаблон базы данных нельзÑ" -#: commands/dbcommands.c:1575 +#: commands/dbcommands.c:1702 #, c-format msgid "cannot drop the currently open database" msgstr "удалить базу данных, открытую в данный момент, нельзÑ" -#: commands/dbcommands.c:1588 +#: commands/dbcommands.c:1715 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "база \"%s\" иÑпользуетÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ Ñлотом логичеÑкой репликации" -#: commands/dbcommands.c:1590 +#: commands/dbcommands.c:1717 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." @@ -8247,12 +8860,12 @@ msgstr[0] "Обнаружен %d активный Ñлот." msgstr[1] "Обнаружены %d активных Ñлота." msgstr[2] "Обнаружено %d активных Ñлотов." -#: commands/dbcommands.c:1604 +#: commands/dbcommands.c:1731 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "база \"%s\" иÑпользуетÑÑ Ð² подпиÑке Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликацией" -#: commands/dbcommands.c:1606 +#: commands/dbcommands.c:1733 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." @@ -8260,36 +8873,36 @@ msgstr[0] "Обнаружена %d подпиÑка." msgstr[1] "Обнаружены %d подпиÑки." msgstr[2] "Обнаружено %d подпиÑок." -#: commands/dbcommands.c:1627 commands/dbcommands.c:1786 -#: commands/dbcommands.c:1916 +#: commands/dbcommands.c:1754 commands/dbcommands.c:1934 +#: commands/dbcommands.c:2063 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "база данных \"%s\" занÑта другими пользователÑми" -#: commands/dbcommands.c:1746 +#: commands/dbcommands.c:1894 #, c-format msgid "permission denied to rename database" -msgstr "нет прав на переименование базы данных" +msgstr "нет прав Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных" -#: commands/dbcommands.c:1775 +#: commands/dbcommands.c:1923 #, c-format msgid "current database cannot be renamed" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ñ‚ÑŒ текущую базу данных" -#: commands/dbcommands.c:1872 +#: commands/dbcommands.c:2019 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "" "изменить табличное проÑтранÑтво открытой в данный момент базы данных нельзÑ" -#: commands/dbcommands.c:1978 +#: commands/dbcommands.c:2125 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "" "некоторые Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных \"%s\" уже находÑÑ‚ÑÑ Ð² табличном " "проÑтранÑтве \"%s\"" -#: commands/dbcommands.c:1980 +#: commands/dbcommands.c:2127 #, c-format msgid "" "You must move them back to the database's default tablespace before using " @@ -8298,33 +8911,38 @@ msgstr "" "Прежде чем выполнÑть Ñту команду, вы должны вернуть их назад в табличное " "проÑтранÑтво по умолчанию Ð´Ð»Ñ Ñтой базы данных." -#: commands/dbcommands.c:2107 commands/dbcommands.c:2818 -#: commands/dbcommands.c:3082 commands/dbcommands.c:3196 +#: commands/dbcommands.c:2256 commands/dbcommands.c:2999 +#: commands/dbcommands.c:3299 commands/dbcommands.c:3412 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "в Ñтаром каталоге базы данных \"%s\" могли оÑтатьÑÑ Ð½ÐµÐ½ÑƒÐ¶Ð½Ñ‹Ðµ файлы" -#: commands/dbcommands.c:2168 +#: commands/dbcommands.c:2317 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "нераÑпознанный параметр DROP DATABASE: \"%s\"" -#: commands/dbcommands.c:2246 +#: commands/dbcommands.c:2395 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ параметрами" -#: commands/dbcommands.c:2302 +#: commands/dbcommands.c:2443 +#, c-format +msgid "cannot alter invalid database \"%s\"" +msgstr "изменить ÑвойÑтва некорректной базы \"%s\" нельзÑ" + +#: commands/dbcommands.c:2460 #, c-format msgid "cannot disallow connections for current database" msgstr "запретить Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº текущей базе данных нельзÑ" -#: commands/dbcommands.c:2521 +#: commands/dbcommands.c:2690 #, c-format msgid "permission denied to change owner of database" -msgstr "нет прав на изменение владельца базы данных" +msgstr "нет прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð° базы данных" -#: commands/dbcommands.c:2924 +#: commands/dbcommands.c:3105 #, c-format msgid "" "There are %d other session(s) and %d prepared transaction(s) using the " @@ -8333,7 +8951,7 @@ msgstr "" "С Ñтой базой данных ÑвÑзаны другие ÑеанÑÑ‹ (%d) и подготовленные транзакции " "(%d)." -#: commands/dbcommands.c:2927 +#: commands/dbcommands.c:3108 #, c-format msgid "There is %d other session using the database." msgid_plural "There are %d other sessions using the database." @@ -8341,7 +8959,7 @@ msgstr[0] "Эта база данных иÑпользуетÑÑ ÐµÑ‰Ñ‘ в %d Ñ msgstr[1] "Эта база данных иÑпользуетÑÑ ÐµÑ‰Ñ‘ в %d ÑеанÑах." msgstr[2] "Эта база данных иÑпользуетÑÑ ÐµÑ‰Ñ‘ в %d ÑеанÑах." -#: commands/dbcommands.c:2932 storage/ipc/procarray.c:3825 +#: commands/dbcommands.c:3113 storage/ipc/procarray.c:3859 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." @@ -8349,204 +8967,204 @@ msgstr[0] "С Ñтой базой данных ÑвÑзана %d подгото msgstr[1] "С Ñтой базой данных ÑвÑзаны %d подготовленные транзакции." msgstr[2] "С Ñтой базой данных ÑвÑзаны %d подготовленных транзакций." -#: commands/dbcommands.c:3038 +#: commands/dbcommands.c:3255 #, c-format msgid "missing directory \"%s\"" msgstr "отÑутÑтвует каталог \"%s\"" -#: commands/dbcommands.c:3098 commands/tablespace.c:190 -#: commands/tablespace.c:654 +#: commands/dbcommands.c:3313 commands/tablespace.c:184 +#: commands/tablespace.c:633 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "не удалоÑÑŒ получить информацию о каталоге \"%s\": %m" -#: commands/define.c:54 commands/define.c:258 commands/define.c:290 -#: commands/define.c:318 commands/define.c:364 +#: commands/define.c:53 commands/define.c:257 commands/define.c:289 +#: commands/define.c:317 commands/define.c:363 #, c-format msgid "%s requires a parameter" msgstr "%s требует параметр" -#: commands/define.c:87 commands/define.c:98 commands/define.c:192 -#: commands/define.c:210 commands/define.c:225 commands/define.c:243 +#: commands/define.c:86 commands/define.c:97 commands/define.c:191 +#: commands/define.c:209 commands/define.c:224 commands/define.c:242 #, c-format msgid "%s requires a numeric value" msgstr "%s требует чиÑловое значение" -#: commands/define.c:154 +#: commands/define.c:153 #, c-format msgid "%s requires a Boolean value" msgstr "%s требует логичеÑкое значение" -#: commands/define.c:168 commands/define.c:177 commands/define.c:327 +#: commands/define.c:167 commands/define.c:176 commands/define.c:326 #, c-format msgid "%s requires an integer value" msgstr "%s требует целое значение" -#: commands/define.c:272 +#: commands/define.c:271 #, c-format msgid "argument of %s must be a name" msgstr "аргументом %s должно быть имÑ" -#: commands/define.c:302 +#: commands/define.c:301 #, c-format msgid "argument of %s must be a type name" msgstr "аргументом %s должно быть Ð¸Ð¼Ñ Ñ‚Ð¸Ð¿Ð°" -#: commands/define.c:348 +#: commands/define.c:347 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "неверный аргумент Ð´Ð»Ñ %s: \"%s\"" -#: commands/dropcmds.c:100 commands/functioncmds.c:1394 -#: utils/adt/ruleutils.c:2908 +#: commands/dropcmds.c:96 commands/functioncmds.c:1382 +#: utils/adt/ruleutils.c:2910 #, c-format msgid "\"%s\" is an aggregate function" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" ÑвлÑетÑÑ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð¾Ð¹" -#: commands/dropcmds.c:102 +#: commands/dropcmds.c:98 #, c-format msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "ИÑпользуйте DROP AGGREGATE Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ñ‹Ñ… функций." -#: commands/dropcmds.c:158 commands/sequence.c:475 commands/tablecmds.c:3613 -#: commands/tablecmds.c:3771 commands/tablecmds.c:3823 -#: commands/tablecmds.c:16435 tcop/utility.c:1332 +#: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:3892 +#: commands/tablecmds.c:4050 commands/tablecmds.c:4102 +#: commands/tablecmds.c:17202 tcop/utility.c:1325 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "отношение \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1278 +#: commands/dropcmds.c:183 commands/dropcmds.c:282 commands/tablecmds.c:1409 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "Ñхема \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:276 +#: commands/dropcmds.c:223 commands/dropcmds.c:262 commands/tablecmds.c:286 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "тип \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:257 +#: commands/dropcmds.c:252 #, c-format msgid "access method \"%s\" does not exist, skipping" msgstr "метод доÑтупа \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:275 +#: commands/dropcmds.c:270 #, c-format msgid "collation \"%s\" does not exist, skipping" msgstr "правило Ñортировки \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:282 +#: commands/dropcmds.c:277 #, c-format msgid "conversion \"%s\" does not exist, skipping" msgstr "преобразование \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:293 commands/statscmds.c:655 +#: commands/dropcmds.c:288 commands/statscmds.c:664 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "объект ÑтатиÑтики \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:300 +#: commands/dropcmds.c:295 #, c-format msgid "text search parser \"%s\" does not exist, skipping" msgstr "анализатор текÑтового поиÑка \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:307 +#: commands/dropcmds.c:302 #, c-format msgid "text search dictionary \"%s\" does not exist, skipping" msgstr "Ñловарь текÑтового поиÑка \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:314 +#: commands/dropcmds.c:309 #, c-format msgid "text search template \"%s\" does not exist, skipping" msgstr "шаблон текÑтового поиÑка \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:321 +#: commands/dropcmds.c:316 #, c-format msgid "text search configuration \"%s\" does not exist, skipping" msgstr "ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:326 +#: commands/dropcmds.c:321 #, c-format msgid "extension \"%s\" does not exist, skipping" msgstr "раÑширение \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:336 +#: commands/dropcmds.c:331 #, c-format msgid "function %s(%s) does not exist, skipping" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s(%s) не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:349 +#: commands/dropcmds.c:344 #, c-format msgid "procedure %s(%s) does not exist, skipping" msgstr "процедура %s(%s) не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:362 +#: commands/dropcmds.c:357 #, c-format msgid "routine %s(%s) does not exist, skipping" msgstr "подпрограмма %s(%s) не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:375 +#: commands/dropcmds.c:370 #, c-format msgid "aggregate %s(%s) does not exist, skipping" msgstr "Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s(%s) не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:388 +#: commands/dropcmds.c:383 #, c-format msgid "operator %s does not exist, skipping" msgstr "оператор %s не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:394 +#: commands/dropcmds.c:389 #, c-format msgid "language \"%s\" does not exist, skipping" msgstr "Ñзык \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:403 +#: commands/dropcmds.c:398 #, c-format msgid "cast from type %s to type %s does not exist, skipping" msgstr "приведение %s к типу %s не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:412 +#: commands/dropcmds.c:407 #, c-format msgid "transform for type %s language \"%s\" does not exist, skipping" msgstr "преобразование Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s, Ñзыка \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:420 +#: commands/dropcmds.c:415 #, c-format msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" msgstr "триггер \"%s\" Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:429 +#: commands/dropcmds.c:424 #, c-format msgid "policy \"%s\" for relation \"%s\" does not exist, skipping" msgstr "политика \"%s\" Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:436 +#: commands/dropcmds.c:431 #, c-format msgid "event trigger \"%s\" does not exist, skipping" msgstr "Ñобытийный триггер \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:442 +#: commands/dropcmds.c:437 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist, skipping" msgstr "правило \"%s\" Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:449 +#: commands/dropcmds.c:444 #, c-format msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "обёртка Ñторонних данных \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 +#: commands/dropcmds.c:448 commands/foreigncmds.c:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "Ñервер \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/dropcmds.c:462 +#: commands/dropcmds.c:457 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\", skipping" msgstr "" "клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² \"%s\" не ÑущеÑтвует Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° доÑтупа \"%s\", пропуÑкаетÑÑ" -#: commands/dropcmds.c:474 +#: commands/dropcmds.c:469 #, c-format msgid "" "operator family \"%s\" does not exist for access method \"%s\", skipping" @@ -8554,167 +9172,189 @@ msgstr "" "ÑемейÑтво операторов \"%s\" не ÑущеÑтвует Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° доÑтупа \"%s\", " "пропуÑкаетÑÑ" -#: commands/dropcmds.c:481 +#: commands/dropcmds.c:476 #, c-format msgid "publication \"%s\" does not exist, skipping" msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/event_trigger.c:125 +#: commands/event_trigger.c:137 #, c-format msgid "permission denied to create event trigger \"%s\"" -msgstr "нет прав на Ñоздание Ñобытийного триггера \"%s\"" +msgstr "нет прав Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñобытийного триггера \"%s\"" -#: commands/event_trigger.c:127 +#: commands/event_trigger.c:139 #, c-format msgid "Must be superuser to create an event trigger." msgstr "Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñобытийного триггера нужно быть Ñуперпользователем." -#: commands/event_trigger.c:136 +#: commands/event_trigger.c:149 #, c-format msgid "unrecognized event name \"%s\"" msgstr "нераÑпознанное Ð¸Ð¼Ñ ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ \"%s\"" -#: commands/event_trigger.c:153 +#: commands/event_trigger.c:166 #, c-format msgid "unrecognized filter variable \"%s\"" msgstr "нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð° \"%s\"" -#: commands/event_trigger.c:207 +#: commands/event_trigger.c:181 +#, c-format +msgid "tag filtering is not supported for login event triggers" +msgstr "Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¿Ð¾ тегу Ð´Ð»Ñ Ñобытийных триггеров входа не поддерживаетÑÑ" + +#: commands/event_trigger.c:224 #, c-format msgid "filter value \"%s\" not recognized for filter variable \"%s\"" msgstr "значение фильтра \"%s\" неприемлемо Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹ фильтра \"%s\"" #. translator: %s represents an SQL statement name -#: commands/event_trigger.c:213 commands/event_trigger.c:235 +#: commands/event_trigger.c:230 commands/event_trigger.c:252 #, c-format msgid "event triggers are not supported for %s" msgstr "Ð´Ð»Ñ %s Ñобытийные триггеры не поддерживаютÑÑ" -#: commands/event_trigger.c:248 +#: commands/event_trigger.c:265 #, c-format msgid "filter variable \"%s\" specified more than once" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð° \"%s\" указана больше одного раза" -#: commands/event_trigger.c:377 commands/event_trigger.c:421 -#: commands/event_trigger.c:515 +#: commands/event_trigger.c:438 commands/event_trigger.c:490 +#: commands/event_trigger.c:584 #, c-format msgid "event trigger \"%s\" does not exist" msgstr "Ñобытийный триггер \"%s\" не ÑущеÑтвует" -#: commands/event_trigger.c:483 +#: commands/event_trigger.c:522 +#, c-format +msgid "event trigger with OID %u does not exist" +msgstr "Ñобытийный триггер Ñ OID %u не ÑущеÑтвует" + +#: commands/event_trigger.c:552 #, c-format msgid "permission denied to change owner of event trigger \"%s\"" -msgstr "нет прав на изменение владельца Ñобытийного триггера \"%s\"" +msgstr "нет прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð° Ñобытийного триггера \"%s\"" -#: commands/event_trigger.c:485 +#: commands/event_trigger.c:554 #, c-format msgid "The owner of an event trigger must be a superuser." msgstr "Владельцем Ñобытийного триггера должен быть Ñуперпользователь." -#: commands/event_trigger.c:1304 +#: commands/event_trigger.c:1409 #, c-format msgid "%s can only be called in a sql_drop event trigger function" msgstr "%s можно вызывать только в Ñобытийной триггерной функции sql_drop" -#: commands/event_trigger.c:1400 commands/event_trigger.c:1421 +#: commands/event_trigger.c:1502 commands/event_trigger.c:1523 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" msgstr "%s можно вызывать только в Ñобытийной триггерной функции table_rewrite" -#: commands/event_trigger.c:1834 +#: commands/event_trigger.c:1936 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s можно вызывать только в Ñобытийной триггерной функции" -#: commands/explain.c:218 +#: commands/explain.c:241 commands/explain.c:266 #, c-format msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" msgstr "нераÑпознанное значение параметра EXPLAIN \"%s\": \"%s\"" -#: commands/explain.c:225 +#: commands/explain.c:273 #, c-format msgid "unrecognized EXPLAIN option \"%s\"" msgstr "нераÑпознанный параметр EXPLAIN: \"%s\"" -#: commands/explain.c:233 +#: commands/explain.c:282 #, c-format msgid "EXPLAIN option WAL requires ANALYZE" msgstr "параметр WAL оператора EXPLAIN требует ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ ANALYZE" -#: commands/explain.c:242 +#: commands/explain.c:291 #, c-format msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "параметр TIMING оператора EXPLAIN требует ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ ANALYZE" -#: commands/extension.c:173 commands/extension.c:2936 +#: commands/explain.c:297 +#, c-format +msgid "EXPLAIN option SERIALIZE requires ANALYZE" +msgstr "параметр SERIALIZE оператора EXPLAIN требует ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ ANALYZE" + +#: commands/explain.c:303 +#, c-format +msgid "EXPLAIN options ANALYZE and GENERIC_PLAN cannot be used together" +msgstr "" +"параметры ANALYZE и GENERIC_PLAN оператора EXPLAIN Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать " +"одновременно" + +#: commands/extension.c:178 commands/extension.c:3031 #, c-format msgid "extension \"%s\" does not exist" msgstr "раÑширение \"%s\" не ÑущеÑтвует" -#: commands/extension.c:272 commands/extension.c:281 commands/extension.c:293 -#: commands/extension.c:303 +#: commands/extension.c:277 commands/extension.c:286 commands/extension.c:298 +#: commands/extension.c:308 #, c-format msgid "invalid extension name: \"%s\"" msgstr "неверное Ð¸Ð¼Ñ Ñ€Ð°ÑширениÑ: \"%s\"" -#: commands/extension.c:273 +#: commands/extension.c:278 #, c-format msgid "Extension names must not be empty." msgstr "Ð˜Ð¼Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ может быть пуÑтым." -#: commands/extension.c:282 +#: commands/extension.c:287 #, c-format msgid "Extension names must not contain \"--\"." msgstr "Ð˜Ð¼Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ может Ñодержать \"--\"." -#: commands/extension.c:294 +#: commands/extension.c:299 #, c-format msgid "Extension names must not begin or end with \"-\"." msgstr "Ð˜Ð¼Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ может начинатьÑÑ Ð¸Ð»Ð¸ заканчиватьÑÑ Ñимволом \"-\"." -#: commands/extension.c:304 +#: commands/extension.c:309 #, c-format msgid "Extension names must not contain directory separator characters." msgstr "Ð˜Ð¼Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ может Ñодержать разделители пути." -#: commands/extension.c:319 commands/extension.c:328 commands/extension.c:337 -#: commands/extension.c:347 +#: commands/extension.c:324 commands/extension.c:333 commands/extension.c:342 +#: commands/extension.c:352 #, c-format msgid "invalid extension version name: \"%s\"" msgstr "неверный идентификатор верÑии раÑширениÑ: \"%s\"" -#: commands/extension.c:320 +#: commands/extension.c:325 #, c-format msgid "Version names must not be empty." msgstr "Идентификатор верÑии не может быть пуÑтым." -#: commands/extension.c:329 +#: commands/extension.c:334 #, c-format msgid "Version names must not contain \"--\"." msgstr "Идентификатор верÑии не может Ñодержать \"--\"." -#: commands/extension.c:338 +#: commands/extension.c:343 #, c-format msgid "Version names must not begin or end with \"-\"." msgstr "" "Идентификатор верÑии не может начинатьÑÑ Ð¸Ð»Ð¸ заканчиватьÑÑ Ñимволом \"-\"." -#: commands/extension.c:348 +#: commands/extension.c:353 #, c-format msgid "Version names must not contain directory separator characters." msgstr "Идентификатор верÑии не может Ñодержать разделители пути." -#: commands/extension.c:502 +#: commands/extension.c:507 #, c-format msgid "extension \"%s\" is not available" msgstr "раÑширение \"%s\" отÑутÑтвует" -#: commands/extension.c:503 +#: commands/extension.c:508 #, c-format msgid "Could not open extension control file \"%s\": %m." msgstr "Ðе удалоÑÑŒ открыть управлÑющий файл раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\": %m." -#: commands/extension.c:505 +#: commands/extension.c:510 #, c-format msgid "" "The extension must first be installed on the system where PostgreSQL is " @@ -8722,84 +9362,99 @@ msgid "" msgstr "" "Сначала раÑширение нужно уÑтановить в ÑиÑтеме, где работает PostgreSQL." -#: commands/extension.c:509 +#: commands/extension.c:514 #, c-format msgid "could not open extension control file \"%s\": %m" msgstr "не удалоÑÑŒ открыть управлÑющий файл раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\": %m" -#: commands/extension.c:531 commands/extension.c:541 +#: commands/extension.c:537 commands/extension.c:547 #, c-format msgid "parameter \"%s\" cannot be set in a secondary extension control file" msgstr "" "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ в дополнительном управлÑющем файле раÑширениÑ" -#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 -#: utils/misc/guc.c:7380 +#: commands/extension.c:569 commands/extension.c:577 commands/extension.c:585 +#: utils/misc/guc.c:3147 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "параметр \"%s\" требует логичеÑкое значение" -#: commands/extension.c:588 +#: commands/extension.c:594 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" не ÑвлÑетÑÑ Ð²ÐµÑ€Ð½Ñ‹Ð¼ названием кодировки" -#: commands/extension.c:602 +#: commands/extension.c:608 commands/extension.c:623 #, c-format msgid "parameter \"%s\" must be a list of extension names" msgstr "параметр \"%s\" должен Ñодержать ÑпиÑок имён раÑширений" -#: commands/extension.c:609 +#: commands/extension.c:630 #, c-format msgid "unrecognized parameter \"%s\" in file \"%s\"" msgstr "нераÑпознанный параметр \"%s\" в файле \"%s\"" -#: commands/extension.c:618 +#: commands/extension.c:639 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "" "параметр \"schema\" не может быть указан вмеÑте Ñ \"relocatable\" = true" -#: commands/extension.c:796 +#: commands/extension.c:817 #, c-format msgid "" "transaction control statements are not allowed within an extension script" msgstr "в Ñкрипте раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ должно быть операторов ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñми" -#: commands/extension.c:873 +#: commands/extension.c:897 #, c-format msgid "permission denied to create extension \"%s\"" -msgstr "нет прав на Ñоздание раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\"" +msgstr "нет прав Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\"" -#: commands/extension.c:876 +#: commands/extension.c:900 #, c-format msgid "" "Must have CREATE privilege on current database to create this extension." msgstr "Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñтого раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½ÑƒÐ¶Ð½Ð¾ иметь право CREATE в текущей базе." -#: commands/extension.c:877 +#: commands/extension.c:901 #, c-format msgid "Must be superuser to create this extension." msgstr "Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñтого раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½ÑƒÐ¶Ð½Ð¾ быть Ñуперпользователем." -#: commands/extension.c:881 +#: commands/extension.c:905 #, c-format msgid "permission denied to update extension \"%s\"" -msgstr "нет прав на изменение раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\"" +msgstr "нет прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\"" -#: commands/extension.c:884 +#: commands/extension.c:908 #, c-format msgid "" "Must have CREATE privilege on current database to update this extension." msgstr "" "Ð”Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñтого раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½ÑƒÐ¶Ð½Ð¾ иметь право CREATE в текущей базе." -#: commands/extension.c:885 +#: commands/extension.c:909 #, c-format msgid "Must be superuser to update this extension." msgstr "Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñтого раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½ÑƒÐ¶Ð½Ð¾ быть Ñуперпользователем." -#: commands/extension.c:1216 +#: commands/extension.c:1042 +#, c-format +msgid "invalid character in extension owner: must not contain any of \"%s\"" +msgstr "" +"недопуÑтимый Ñимвол в имени владельца раÑширениÑ: Ð¸Ð¼Ñ Ð½Ðµ должно Ñодержать " +"\"%s\"" + +#: commands/extension.c:1066 commands/extension.c:1093 +#, c-format +msgid "" +"invalid character in extension \"%s\" schema: must not contain any of \"%s\"" +msgstr "" +"недопуÑтимый Ñимвол в имени Ñхемы раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\": Ð¸Ð¼Ñ Ð½Ðµ должно Ñодержать " +"\"%s\"" + +#: commands/extension.c:1288 #, c-format msgid "" "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" @@ -8807,12 +9462,12 @@ msgstr "" "Ð´Ð»Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\" не определён путь Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð²ÐµÑ€Ñии \"%s\" до верÑии " "\"%s\"" -#: commands/extension.c:1424 commands/extension.c:2994 +#: commands/extension.c:1496 commands/extension.c:3089 #, c-format msgid "version to install must be specified" msgstr "нужно указать верÑию Ð´Ð»Ñ ÑƒÑтановки" -#: commands/extension.c:1461 +#: commands/extension.c:1533 #, c-format msgid "" "extension \"%s\" has no installation script nor update path for version " @@ -8821,71 +9476,71 @@ msgstr "" "Ð´Ð»Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\" не определён путь уÑтановки или Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²ÐµÑ€Ñии " "\"%s\"" -#: commands/extension.c:1495 +#: commands/extension.c:1567 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "раÑширение \"%s\" должно уÑтанавливатьÑÑ Ð² Ñхему \"%s\"" -#: commands/extension.c:1655 +#: commands/extension.c:1727 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "выÑвлена цикличеÑÐºÐ°Ñ Ð·Ð°Ð²Ð¸ÑимоÑть между раÑширениÑми \"%s\" и \"%s\"" -#: commands/extension.c:1660 +#: commands/extension.c:1732 #, c-format msgid "installing required extension \"%s\"" msgstr "уÑтановка требуемого раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\"" -#: commands/extension.c:1683 +#: commands/extension.c:1755 #, c-format msgid "required extension \"%s\" is not installed" msgstr "требуемое раÑширение \"%s\" не уÑтановлено" -#: commands/extension.c:1686 +#: commands/extension.c:1758 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "" "Выполните CREATE EXTENSION ... CASCADE, чтобы уÑтановить также требуемые " "раÑширениÑ." -#: commands/extension.c:1721 +#: commands/extension.c:1793 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "раÑширение \"%s\" уже ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/extension.c:1728 +#: commands/extension.c:1800 #, c-format msgid "extension \"%s\" already exists" msgstr "раÑширение \"%s\" уже ÑущеÑтвует" -#: commands/extension.c:1739 +#: commands/extension.c:1811 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "вложенные операторы CREATE EXTENSION не поддерживаютÑÑ" -#: commands/extension.c:1903 +#: commands/extension.c:1975 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "удалить раÑширение \"%s\" нельзÑ, так как Ñто модифицируемый объект" -#: commands/extension.c:2380 +#: commands/extension.c:2450 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "" "%s можно вызывать только из SQL-Ñкрипта, запуÑкаемого командой CREATE " "EXTENSION" -#: commands/extension.c:2392 +#: commands/extension.c:2462 #, c-format msgid "OID %u does not refer to a table" msgstr "OID %u не отноÑитÑÑ Ðº таблице" -#: commands/extension.c:2397 +#: commands/extension.c:2467 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "таблица \"%s\" не отноÑитÑÑ Ðº Ñозданному раÑширению" -#: commands/extension.c:2751 +#: commands/extension.c:2813 #, c-format msgid "" "cannot move extension \"%s\" into schema \"%s\" because the extension " @@ -8894,32 +9549,45 @@ msgstr "" "перемеÑтить раÑширение \"%s\" в Ñхему \"%s\" нельзÑ, так как оно Ñодержит " "Ñхему" -#: commands/extension.c:2792 commands/extension.c:2855 +#: commands/extension.c:2854 commands/extension.c:2948 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "раÑширение \"%s\" не поддерживает SET SCHEMA" -#: commands/extension.c:2857 +#: commands/extension.c:2911 +#, c-format +msgid "" +"cannot SET SCHEMA of extension \"%s\" because other extensions prevent it" +msgstr "" +"выполнить SET SCHEMA Ð´Ð»Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\" нельзÑ, так как Ñтому " +"препÑÑ‚Ñтвуют другие раÑширениÑ" + +#: commands/extension.c:2913 +#, c-format +msgid "Extension \"%s\" requests no relocation of extension \"%s\"." +msgstr "РаÑширение \"%s\" не допуÑкает Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\"." + +#: commands/extension.c:2950 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "объект %s не принадлежит Ñхеме раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\"" -#: commands/extension.c:2916 +#: commands/extension.c:3011 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "вложенные операторы ALTER EXTENSION не поддерживаютÑÑ" -#: commands/extension.c:3005 +#: commands/extension.c:3100 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "верÑÐ¸Ñ \"%s\" раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \"%s\" уже уÑтановлена" -#: commands/extension.c:3217 +#: commands/extension.c:3311 #, c-format msgid "cannot add an object of this type to an extension" msgstr "добавить объект Ñтого типа к раÑширению нельзÑ" -#: commands/extension.c:3283 +#: commands/extension.c:3409 #, c-format msgid "" "cannot add schema \"%s\" to extension \"%s\" because the schema contains the " @@ -8928,7 +9596,12 @@ msgstr "" "добавить Ñхему \"%s\" к раÑширению \"%s\" нельзÑ, так как Ñхема Ñодержит " "раÑширение" -#: commands/extension.c:3377 +#: commands/extension.c:3491 commands/typecmds.c:4042 utils/fmgr/funcapi.c:725 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "тип мультидиапазона Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° данных %s не найден" + +#: commands/extension.c:3532 #, c-format msgid "file \"%s\" is too large" msgstr "файл \"%s\" Ñлишком большой" @@ -8946,7 +9619,7 @@ msgstr "параметр \"%s\" указан неоднократно" #: commands/foreigncmds.c:221 commands/foreigncmds.c:229 #, c-format msgid "permission denied to change owner of foreign-data wrapper \"%s\"" -msgstr "нет прав на изменение владельца обёртки Ñторонних данных \"%s\"" +msgstr "нет прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð° обёртки Ñторонних данных \"%s\"" #: commands/foreigncmds.c:223 #, c-format @@ -8959,15 +9632,25 @@ msgstr "" msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "Владельцем обёртки Ñторонних данных должен быть Ñуперпользователь." -#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:669 +#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:691 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "обёртка Ñторонних данных \"%s\" не ÑущеÑтвует" +#: commands/foreigncmds.c:325 +#, c-format +msgid "foreign-data wrapper with OID %u does not exist" +msgstr "обёртка Ñторонних данных Ñ OID %u не ÑущеÑтвует" + +#: commands/foreigncmds.c:462 +#, c-format +msgid "foreign server with OID %u does not exist" +msgstr "Ñторонний Ñервер Ñ OID %u не ÑущеÑтвует" + #: commands/foreigncmds.c:580 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" -msgstr "нет прав на Ñоздание обёртки Ñторонних данных \"%s\"" +msgstr "нет прав Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±Ñ‘Ñ€Ñ‚ÐºÐ¸ Ñторонних данных \"%s\"" #: commands/foreigncmds.c:582 #, c-format @@ -8977,7 +9660,7 @@ msgstr "Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±Ñ‘Ñ€Ñ‚ÐºÐ¸ Ñторонних данных #: commands/foreigncmds.c:697 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" -msgstr "нет прав на изменение обёртки Ñторонних данных \"%s\"" +msgstr "нет прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ‘Ñ€Ñ‚ÐºÐ¸ Ñторонних данных \"%s\"" #: commands/foreigncmds.c:699 #, c-format @@ -9031,7 +9714,7 @@ msgstr "" "ÑопоÑтавление Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" Ð´Ð»Ñ Ñервера \"%s\" не ÑущеÑтвует, " "пропуÑкаетÑÑ" -#: commands/foreigncmds.c:1507 foreign/foreign.c:390 +#: commands/foreigncmds.c:1507 foreign/foreign.c:404 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "обёртка Ñторонних данных \"%s\" не имеет обработчика" @@ -9046,151 +9729,151 @@ msgstr "обёртка Ñторонних данных \"%s\" не поддер msgid "importing foreign table \"%s\"" msgstr "импорт Ñторонней таблицы \"%s\"" -#: commands/functioncmds.c:109 +#: commands/functioncmds.c:104 #, c-format msgid "SQL function cannot return shell type %s" msgstr "SQL-Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ðµ может возвращать тип-пуÑтышку %s" -#: commands/functioncmds.c:114 +#: commands/functioncmds.c:109 #, c-format msgid "return type %s is only a shell" msgstr "возвращаемый тип %s - лишь пуÑтышка" -#: commands/functioncmds.c:144 parser/parse_type.c:354 +#: commands/functioncmds.c:138 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð°-пуÑтышки \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ модификатор типа" -#: commands/functioncmds.c:150 +#: commands/functioncmds.c:144 #, c-format msgid "type \"%s\" is not yet defined" msgstr "тип \"%s\" ещё не определён" -#: commands/functioncmds.c:151 +#: commands/functioncmds.c:145 #, c-format msgid "Creating a shell type definition." msgstr "Создание Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð°-пуÑтышки." -#: commands/functioncmds.c:250 +#: commands/functioncmds.c:244 #, c-format msgid "SQL function cannot accept shell type %s" msgstr "SQL-Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ðµ может принимать значение типа-пуÑтышки %s" -#: commands/functioncmds.c:256 +#: commands/functioncmds.c:250 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ðµ может принимать значение типа-пуÑтышки %s" -#: commands/functioncmds.c:261 +#: commands/functioncmds.c:255 #, c-format msgid "argument type %s is only a shell" msgstr "тип аргумента %s - лишь пуÑтышка" -#: commands/functioncmds.c:271 +#: commands/functioncmds.c:265 #, c-format msgid "type %s does not exist" msgstr "тип %s не ÑущеÑтвует" -#: commands/functioncmds.c:285 +#: commands/functioncmds.c:279 #, c-format msgid "aggregates cannot accept set arguments" msgstr "агрегатные функции не принимают в аргументах множеÑтва" -#: commands/functioncmds.c:289 +#: commands/functioncmds.c:283 #, c-format msgid "procedures cannot accept set arguments" msgstr "процедуры не принимают в аргументах множеÑтва" -#: commands/functioncmds.c:293 +#: commands/functioncmds.c:287 #, c-format msgid "functions cannot accept set arguments" msgstr "функции не принимают аргументы-множеÑтва" -#: commands/functioncmds.c:303 +#: commands/functioncmds.c:297 #, c-format msgid "VARIADIC parameter must be the last input parameter" msgstr "параметр VARIADIC должен быть поÑледним в ÑпиÑке входных параметров" -#: commands/functioncmds.c:323 +#: commands/functioncmds.c:317 #, c-format msgid "VARIADIC parameter must be the last parameter" msgstr "параметр VARIADIC должен быть поÑледним в ÑпиÑке параметров" -#: commands/functioncmds.c:348 +#: commands/functioncmds.c:342 #, c-format msgid "VARIADIC parameter must be an array" msgstr "параметр VARIADIC должен быть маÑÑивом" -#: commands/functioncmds.c:393 +#: commands/functioncmds.c:387 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\" указано неоднократно" -#: commands/functioncmds.c:411 +#: commands/functioncmds.c:405 #, c-format msgid "only input parameters can have default values" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию могут быть только у входных параметров" -#: commands/functioncmds.c:426 +#: commands/functioncmds.c:420 #, c-format msgid "cannot use table references in parameter default value" msgstr "в значениÑÑ… параметров по умолчанию Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð½Ð° таблицы" -#: commands/functioncmds.c:450 +#: commands/functioncmds.c:444 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "" "входные параметры, Ñледующие за параметром Ñо значением по умолчанию, также " "должны иметь Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию" -#: commands/functioncmds.c:460 +#: commands/functioncmds.c:454 #, c-format msgid "procedure OUT parameters cannot appear after one with a default value" msgstr "" "в объÑвлении процедуры параметры OUT не могут находитьÑÑ Ð¿Ð¾Ñле параметра Ñо " "значением по умолчанию" -#: commands/functioncmds.c:605 commands/functioncmds.c:784 +#: commands/functioncmds.c:596 commands/functioncmds.c:775 #, c-format msgid "invalid attribute in procedure definition" msgstr "некорректный атрибут в определении процедуры" -#: commands/functioncmds.c:701 +#: commands/functioncmds.c:692 #, c-format msgid "support function %s must return type %s" msgstr "вÑÐ¿Ð¾Ð¼Ð¾Ð³Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s должна возвращать тип %s" -#: commands/functioncmds.c:712 +#: commands/functioncmds.c:703 #, c-format msgid "must be superuser to specify a support function" msgstr "Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð²Ñпомогательной функции нужно быть Ñуперпользователем" -#: commands/functioncmds.c:833 commands/functioncmds.c:1439 +#: commands/functioncmds.c:824 commands/functioncmds.c:1427 #, c-format msgid "COST must be positive" msgstr "значение COST должно быть положительным" -#: commands/functioncmds.c:841 commands/functioncmds.c:1447 +#: commands/functioncmds.c:832 commands/functioncmds.c:1435 #, c-format msgid "ROWS must be positive" msgstr "значение ROWS должно быть положительным" -#: commands/functioncmds.c:870 +#: commands/functioncmds.c:861 #, c-format msgid "no function body specified" msgstr "не указано тело функции" -#: commands/functioncmds.c:875 +#: commands/functioncmds.c:866 #, c-format msgid "duplicate function body specified" msgstr "тело функции задано неоднократно" -#: commands/functioncmds.c:880 +#: commands/functioncmds.c:871 #, c-format msgid "inline SQL function body only valid for language SQL" msgstr "вÑтроенное тело функции SQL допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ñзыка SQL" -#: commands/functioncmds.c:922 +#: commands/functioncmds.c:913 #, c-format msgid "" "SQL function with unquoted function body cannot have polymorphic arguments" @@ -9198,84 +9881,84 @@ msgstr "" "у SQL-функции Ñ Ñ‚ÐµÐ»Ð¾Ð¼, задаваемым не в кавычках, не может быть полиморфных " "аргументов" -#: commands/functioncmds.c:948 commands/functioncmds.c:967 +#: commands/functioncmds.c:939 commands/functioncmds.c:958 #, c-format msgid "%s is not yet supported in unquoted SQL function body" msgstr "" "%s на данный момент не поддерживаетÑÑ Ð² теле SQL-функции, задаваемом не в " "кавычках" -#: commands/functioncmds.c:995 +#: commands/functioncmds.c:986 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "Ð´Ð»Ñ Ñзыка \"%s\" нужно только одно выражение AS" -#: commands/functioncmds.c:1100 +#: commands/functioncmds.c:1091 #, c-format msgid "no language specified" msgstr "Ñзык не указан" -#: commands/functioncmds.c:1108 commands/functioncmds.c:2109 -#: commands/proclang.c:237 +#: commands/functioncmds.c:1099 commands/functioncmds.c:2117 +#: commands/proclang.c:235 #, c-format msgid "language \"%s\" does not exist" msgstr "Ñзык \"%s\" не ÑущеÑтвует" -#: commands/functioncmds.c:1110 commands/functioncmds.c:2111 +#: commands/functioncmds.c:1101 commands/functioncmds.c:2119 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "Выполните CREATE EXTENSION, чтобы загрузить Ñзык в базу данных." -#: commands/functioncmds.c:1145 commands/functioncmds.c:1431 +#: commands/functioncmds.c:1134 commands/functioncmds.c:1419 #, c-format msgid "only superuser can define a leakproof function" msgstr "" "только Ñуперпользователь может определить функцию Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ LEAKPROOF" -#: commands/functioncmds.c:1196 +#: commands/functioncmds.c:1185 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "" "результат функции должен иметь тип %s (в ÑоответÑтвии Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸ OUT)" -#: commands/functioncmds.c:1209 +#: commands/functioncmds.c:1198 #, c-format msgid "function result type must be specified" msgstr "необходимо указать тип результата функции" -#: commands/functioncmds.c:1263 commands/functioncmds.c:1451 +#: commands/functioncmds.c:1251 commands/functioncmds.c:1439 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "указание ROWS неприменимо, когда Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ не множеÑтво" -#: commands/functioncmds.c:1552 +#: commands/functioncmds.c:1546 #, c-format msgid "source data type %s is a pseudo-type" msgstr "иÑходный тип данных %s ÑвлÑетÑÑ Ð¿Ñевдотипом" -#: commands/functioncmds.c:1558 +#: commands/functioncmds.c:1552 #, c-format msgid "target data type %s is a pseudo-type" msgstr "целевой тип данных %s ÑвлÑетÑÑ Ð¿Ñевдотипом" -#: commands/functioncmds.c:1582 +#: commands/functioncmds.c:1576 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "" "приведение будет проигнорировано, так как иÑходные данные имеют тип домен" -#: commands/functioncmds.c:1587 +#: commands/functioncmds.c:1581 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "" "приведение будет проигнорировано, так как целевые данные имеют тип домен" -#: commands/functioncmds.c:1612 +#: commands/functioncmds.c:1606 #, c-format msgid "cast function must take one to three arguments" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° принимать от одного до трёх аргументов" -#: commands/functioncmds.c:1616 +#: commands/functioncmds.c:1612 #, c-format msgid "" "argument of cast function must match or be binary-coercible from source data " @@ -9284,17 +9967,17 @@ msgstr "" "аргумент функции Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ Ñовпадать или быть двоично-ÑовмеÑтимым Ñ " "иÑходным типом данных" -#: commands/functioncmds.c:1620 +#: commands/functioncmds.c:1616 #, c-format msgid "second argument of cast function must be type %s" msgstr "второй аргумент функции Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ иметь тип %s" -#: commands/functioncmds.c:1625 +#: commands/functioncmds.c:1621 #, c-format msgid "third argument of cast function must be type %s" msgstr "третий аргумент функции Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ иметь тип %s" -#: commands/functioncmds.c:1630 +#: commands/functioncmds.c:1628 #, c-format msgid "" "return data type of cast function must match or be binary-coercible to " @@ -9303,127 +9986,132 @@ msgstr "" "тип возвращаемых данных функции Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ Ñовпадать или быть двоично-" "ÑовмеÑтимым Ñ Ñ†ÐµÐ»ÐµÐ²Ñ‹Ð¼ типом данных" -#: commands/functioncmds.c:1641 +#: commands/functioncmds.c:1639 #, c-format msgid "cast function must not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð½Ðµ может быть изменчивой (volatile)" -#: commands/functioncmds.c:1646 +#: commands/functioncmds.c:1644 #, c-format msgid "cast function must be a normal function" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть обычной функцией" -#: commands/functioncmds.c:1650 +#: commands/functioncmds.c:1648 #, c-format msgid "cast function must not return a set" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð½Ðµ может возвращать множеÑтво" -#: commands/functioncmds.c:1676 +#: commands/functioncmds.c:1674 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ WITHOUT FUNCTION нужно быть Ñуперпользователем" -#: commands/functioncmds.c:1691 +#: commands/functioncmds.c:1689 #, c-format msgid "source and target data types are not physically compatible" msgstr "иÑходный и целевой типы данных неÑовмеÑтимы физичеÑки" -#: commands/functioncmds.c:1706 +#: commands/functioncmds.c:1709 #, c-format msgid "composite data types are not binary-compatible" msgstr "ÑоÑтавные типы данных неÑовмеÑтимы на двоичном уровне" -#: commands/functioncmds.c:1712 -#, c-format -msgid "enum data types are not binary-compatible" -msgstr "типы-перечиÑÐ»ÐµÐ½Ð¸Ñ Ð½ÐµÑовмеÑтимы на двоичном уровне" - -#: commands/functioncmds.c:1718 +#: commands/functioncmds.c:1715 #, c-format msgid "array data types are not binary-compatible" msgstr "типы-маÑÑивы неÑовмеÑтимы на двоичном уровне" -#: commands/functioncmds.c:1735 +#: commands/functioncmds.c:1723 +#, c-format +msgid "range data types are not binary-compatible" +msgstr "диапазонные типы неÑовмеÑтимы на двоичном уровне" + +#: commands/functioncmds.c:1729 +#, c-format +msgid "enum data types are not binary-compatible" +msgstr "типы-перечиÑÐ»ÐµÐ½Ð¸Ñ Ð½ÐµÑовмеÑтимы на двоичном уровне" + +#: commands/functioncmds.c:1746 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "типы-домены не могут ÑчитатьÑÑ Ð´Ð²Ð¾Ð¸Ñ‡Ð½Ð¾-ÑовмеÑтимыми" -#: commands/functioncmds.c:1745 +#: commands/functioncmds.c:1756 #, c-format msgid "source data type and target data type are the same" msgstr "иÑходный тип данных Ñовпадает Ñ Ñ†ÐµÐ»ÐµÐ²Ñ‹Ð¼" -#: commands/functioncmds.c:1778 +#: commands/functioncmds.c:1789 #, c-format msgid "transform function must not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ может быть изменчивой" -#: commands/functioncmds.c:1782 +#: commands/functioncmds.c:1793 #, c-format msgid "transform function must be a normal function" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть обычной функцией" -#: commands/functioncmds.c:1786 +#: commands/functioncmds.c:1797 #, c-format msgid "transform function must not return a set" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ может возвращать множеÑтво" -#: commands/functioncmds.c:1790 +#: commands/functioncmds.c:1801 #, c-format msgid "transform function must take one argument" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° принимать один аргумент" -#: commands/functioncmds.c:1794 +#: commands/functioncmds.c:1805 #, c-format msgid "first argument of transform function must be type %s" msgstr "первый аргумент функции Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ иметь тип %s" -#: commands/functioncmds.c:1833 +#: commands/functioncmds.c:1844 #, c-format msgid "data type %s is a pseudo-type" msgstr "тип данных %s ÑвлÑетÑÑ Ð¿Ñевдотипом" -#: commands/functioncmds.c:1839 +#: commands/functioncmds.c:1850 #, c-format msgid "data type %s is a domain" msgstr "тип данных \"%s\" ÑвлÑетÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð¼" -#: commands/functioncmds.c:1879 +#: commands/functioncmds.c:1890 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "результат функции FROM SQL должен иметь тип %s" -#: commands/functioncmds.c:1905 +#: commands/functioncmds.c:1916 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "результат функции TO SQL должен иметь тип данных преобразованиÑ" -#: commands/functioncmds.c:1934 +#: commands/functioncmds.c:1943 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "преобразование Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s, Ñзыка \"%s\" уже ÑущеÑтвует" -#: commands/functioncmds.c:2021 +#: commands/functioncmds.c:2029 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "преобразование Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s, Ñзыка \"%s\" не ÑущеÑтвует" -#: commands/functioncmds.c:2045 +#: commands/functioncmds.c:2053 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s уже ÑущеÑтвует в Ñхеме \"%s\"" -#: commands/functioncmds.c:2096 +#: commands/functioncmds.c:2104 #, c-format msgid "no inline code specified" msgstr "нет внедрённого кода" -#: commands/functioncmds.c:2142 +#: commands/functioncmds.c:2150 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "Ñзык \"%s\" не поддерживает выполнение внедрённого кода" -#: commands/functioncmds.c:2237 +#: commands/functioncmds.c:2245 #, c-format msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" @@ -9431,97 +10119,100 @@ msgstr[0] "процедуре Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ больше %d ар msgstr[1] "процедуре Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ больше %d аргументов" msgstr[2] "процедуре Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ больше %d аргументов" -#: commands/indexcmds.c:634 +#: commands/indexcmds.c:656 #, c-format msgid "must specify at least one column" msgstr "нужно указать минимум один Ñтолбец" -#: commands/indexcmds.c:638 +#: commands/indexcmds.c:660 #, c-format msgid "cannot use more than %d columns in an index" msgstr "чиÑло Ñтолбцов в индекÑе не может превышать %d" -#: commands/indexcmds.c:681 +#: commands/indexcmds.c:703 #, c-format msgid "cannot create index on relation \"%s\"" msgstr "Ñоздать Ð¸Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: commands/indexcmds.c:707 +#: commands/indexcmds.c:729 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "" "Ñоздать Ð¸Ð½Ð´ÐµÐºÑ Ð² Ñекционированной таблице \"%s\" параллельным ÑпоÑобом нельзÑ" -#: commands/indexcmds.c:712 -#, c-format -msgid "cannot create exclusion constraints on partitioned table \"%s\"" -msgstr "" -"Ñоздать ограничение-иÑключение в Ñекционированной таблице \"%s\" нельзÑ" - -#: commands/indexcmds.c:722 +#: commands/indexcmds.c:739 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "Ñоздавать индекÑÑ‹ во временных таблицах других ÑеанÑов нельзÑ" -#: commands/indexcmds.c:760 commands/tablecmds.c:781 commands/tablespace.c:1204 +#: commands/indexcmds.c:777 commands/tablecmds.c:818 commands/tablespace.c:1178 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "" "Ð´Ð»Ñ Ñекционированных отношений Ð½ÐµÐ»ÑŒÐ·Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÑŒ табличное проÑтранÑтво по " "умолчанию" -#: commands/indexcmds.c:792 commands/tablecmds.c:816 commands/tablecmds.c:3312 +#: commands/indexcmds.c:809 commands/tablecmds.c:849 commands/tablecmds.c:3588 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "" "в табличное проÑтранÑтво pg_global можно помеÑтить только разделÑемые таблицы" -#: commands/indexcmds.c:825 +#: commands/indexcmds.c:842 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "уÑтаревший метод доÑтупа \"rtree\" подменÑетÑÑ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð¼ \"gist\"" -#: commands/indexcmds.c:846 +#: commands/indexcmds.c:863 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "метод доÑтупа \"%s\" не поддерживает уникальные индекÑÑ‹" -#: commands/indexcmds.c:851 +#: commands/indexcmds.c:868 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "метод доÑтупа \"%s\" не поддерживает включаемые Ñтолбцы" -#: commands/indexcmds.c:856 +#: commands/indexcmds.c:873 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "метод доÑтупа \"%s\" не поддерживает индекÑÑ‹ по многим Ñтолбцам" -#: commands/indexcmds.c:861 +#: commands/indexcmds.c:878 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "метод доÑтупа \"%s\" не поддерживает ограничениÑ-иÑключениÑ" -#: commands/indexcmds.c:986 +#: commands/indexcmds.c:1007 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "" "ÑопоÑтавить ключ ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¸Ð½Ð´ÐµÐºÑом, иÑпользующим метод доÑтупа " "\"%s\", нельзÑ" -#: commands/indexcmds.c:996 +#: commands/indexcmds.c:1017 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "" "неподдерживаемое ограничение \"%s\" Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ ключа ÑекционированиÑ" -#: commands/indexcmds.c:998 +#: commands/indexcmds.c:1019 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "" "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ %s не могут иÑпользоватьÑÑ, когда ключи ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°ÑŽÑ‚ " "выражениÑ." -#: commands/indexcmds.c:1037 +#: commands/indexcmds.c:1069 +#, c-format +msgid "" +"cannot match partition key to index on column \"%s\" using non-equal " +"operator \"%s\"" +msgstr "" +"ÑопоÑтавить ключ ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¸Ð½Ð´ÐµÐºÑом, поÑтроенному по Ñтолбцу \"%s\" " +"Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼ неравенÑтва \"%s\", нельзÑ" + +#: commands/indexcmds.c:1085 #, c-format msgid "" "unique constraint on partitioned table must include all partitioning columns" @@ -9529,7 +10220,7 @@ msgstr "" "ограничение уникальноÑти в Ñекционированной таблице должно включать вÑе " "Ñекционирующие Ñтолбцы" -#: commands/indexcmds.c:1038 +#: commands/indexcmds.c:1086 #, c-format msgid "" "%s constraint on table \"%s\" lacks column \"%s\" which is part of the " @@ -9538,92 +10229,92 @@ msgstr "" "Ð’ ограничении %s таблицы \"%s\" не хватает Ñтолбца \"%s\", входÑщего в ключ " "ÑекционированиÑ." -#: commands/indexcmds.c:1057 commands/indexcmds.c:1076 +#: commands/indexcmds.c:1105 commands/indexcmds.c:1124 #, c-format msgid "index creation on system columns is not supported" msgstr "Ñоздание индекÑа Ð´Ð»Ñ ÑиÑтемных Ñтолбцов не поддерживаетÑÑ" -#: commands/indexcmds.c:1276 tcop/utility.c:1518 +#: commands/indexcmds.c:1354 tcop/utility.c:1515 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "Ñоздать уникальный Ð¸Ð½Ð´ÐµÐºÑ Ð² Ñекционированной таблице \"%s\" нельзÑ" -#: commands/indexcmds.c:1278 tcop/utility.c:1520 +#: commands/indexcmds.c:1356 tcop/utility.c:1517 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "Таблица \"%s\" Ñодержит Ñекции, ÑвлÑющиеÑÑ Ñторонними таблицами." -#: commands/indexcmds.c:1750 +#: commands/indexcmds.c:1806 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "функции в предикате индекÑа должны быть помечены как IMMUTABLE" -#: commands/indexcmds.c:1828 parser/parse_utilcmd.c:2528 -#: parser/parse_utilcmd.c:2663 +#: commands/indexcmds.c:1885 parser/parse_utilcmd.c:2519 +#: parser/parse_utilcmd.c:2654 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "указанный в ключе Ñтолбец \"%s\" не ÑущеÑтвует" -#: commands/indexcmds.c:1852 parser/parse_utilcmd.c:1825 +#: commands/indexcmds.c:1909 parser/parse_utilcmd.c:1807 #, c-format msgid "expressions are not supported in included columns" msgstr "Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¾ включаемых Ñтолбцах не поддерживаютÑÑ" -#: commands/indexcmds.c:1893 +#: commands/indexcmds.c:1950 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "функции в индекÑном выражении должны быть помечены как IMMUTABLE" -#: commands/indexcmds.c:1908 +#: commands/indexcmds.c:1965 #, c-format msgid "including column does not support a collation" msgstr "включаемые Ñтолбцы не поддерживают правила Ñортировки" -#: commands/indexcmds.c:1912 +#: commands/indexcmds.c:1969 #, c-format msgid "including column does not support an operator class" msgstr "включаемые Ñтолбцы не поддерживают клаÑÑÑ‹ операторов" -#: commands/indexcmds.c:1916 +#: commands/indexcmds.c:1973 #, c-format msgid "including column does not support ASC/DESC options" msgstr "включаемые Ñтолбцы не поддерживают Ñортировку ASC/DESC" -#: commands/indexcmds.c:1920 +#: commands/indexcmds.c:1977 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "включаемые Ñтолбцы не поддерживают ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ NULLS FIRST/LAST" -#: commands/indexcmds.c:1961 +#: commands/indexcmds.c:2020 #, c-format msgid "could not determine which collation to use for index expression" msgstr "не удалоÑÑŒ определить правило Ñортировки Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑного выражениÑ" -#: commands/indexcmds.c:1969 commands/tablecmds.c:17450 commands/typecmds.c:807 -#: parser/parse_expr.c:2690 parser/parse_type.c:570 parser/parse_utilcmd.c:3795 -#: utils/adt/misc.c:601 +#: commands/indexcmds.c:2028 commands/tablecmds.c:18226 commands/typecmds.c:811 +#: parser/parse_expr.c:2793 parser/parse_type.c:568 parser/parse_utilcmd.c:3771 +#: utils/adt/misc.c:630 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не поддерживает Ñортировку (COLLATION)" -#: commands/indexcmds.c:2034 +#: commands/indexcmds.c:2095 #, c-format msgid "operator %s is not commutative" msgstr "оператор %s не коммутативен" -#: commands/indexcmds.c:2036 +#: commands/indexcmds.c:2097 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "" "Ð’ ограничениÑÑ…-иÑключениÑÑ… могут иÑпользоватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ коммутативные " "операторы." -#: commands/indexcmds.c:2062 +#: commands/indexcmds.c:2123 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "оператор \"%s\" не входит в ÑемейÑтво операторов \"%s\"" -#: commands/indexcmds.c:2065 +#: commands/indexcmds.c:2126 #, c-format msgid "" "The exclusion operator must be related to the index operator class for the " @@ -9632,25 +10323,25 @@ msgstr "" "Оператор иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ отноÑитьÑÑ Ðº клаÑÑу операторов " "индекÑа." -#: commands/indexcmds.c:2100 +#: commands/indexcmds.c:2161 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "метод доÑтупа \"%s\" не поддерживает Ñортировку ASC/DESC" -#: commands/indexcmds.c:2105 +#: commands/indexcmds.c:2166 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "метод доÑтупа \"%s\" не поддерживает параметр NULLS FIRST/LAST" -#: commands/indexcmds.c:2151 commands/tablecmds.c:17475 -#: commands/tablecmds.c:17481 commands/typecmds.c:2302 +#: commands/indexcmds.c:2210 commands/tablecmds.c:18251 +#: commands/tablecmds.c:18257 commands/typecmds.c:2311 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "" "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° данных %s не определён клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² по умолчанию Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° " "доÑтупа \"%s\"" -#: commands/indexcmds.c:2153 +#: commands/indexcmds.c:2212 #, c-format msgid "" "You must specify an operator class for the index or define a default " @@ -9659,86 +10350,89 @@ msgstr "" "Ð’Ñ‹ должны указать клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа или определить клаÑÑ " "операторов по умолчанию Ð´Ð»Ñ Ñтого типа данных." -#: commands/indexcmds.c:2182 commands/indexcmds.c:2190 +#: commands/indexcmds.c:2241 commands/indexcmds.c:2249 #: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² \"%s\" Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° доÑтупа \"%s\" не ÑущеÑтвует" -#: commands/indexcmds.c:2204 commands/typecmds.c:2290 +#: commands/indexcmds.c:2263 commands/typecmds.c:2299 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² \"%s\" не принимает тип данных %s" -#: commands/indexcmds.c:2294 +#: commands/indexcmds.c:2353 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "" "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° данных %s определено неÑколько клаÑÑов операторов по умолчанию" -#: commands/indexcmds.c:2622 +#: commands/indexcmds.c:2681 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "нераÑпознанный параметр REINDEX: \"%s\"" -#: commands/indexcmds.c:2846 +#: commands/indexcmds.c:2913 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "" "в таблице \"%s\" нет индекÑов, которые можно переиндекÑировать неблокирующим " "ÑпоÑобом" -#: commands/indexcmds.c:2860 +#: commands/indexcmds.c:2927 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "в таблице \"%s\" нет индекÑов Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑации" -#: commands/indexcmds.c:2900 commands/indexcmds.c:3404 -#: commands/indexcmds.c:3532 +#: commands/indexcmds.c:2974 commands/indexcmds.c:3485 +#: commands/indexcmds.c:3615 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "ПереиндекÑировать ÑиÑтемные каталоги неблокирующим ÑпоÑобом нельзÑ" -#: commands/indexcmds.c:2923 +#: commands/indexcmds.c:2998 #, c-format msgid "can only reindex the currently open database" msgstr "переиндекÑировать можно только текущую базу данных" -#: commands/indexcmds.c:3011 +#: commands/indexcmds.c:3090 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "" "вÑе ÑиÑтемные каталоги пропуÑкаютÑÑ, так как их Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать " "неблокирующим ÑпоÑобом" -#: commands/indexcmds.c:3044 +#: commands/indexcmds.c:3123 #, c-format msgid "cannot move system relations, skipping all" msgstr "перемеÑтить ÑиÑтемные Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ, вÑе они пропуÑкаютÑÑ" -#: commands/indexcmds.c:3090 +#: commands/indexcmds.c:3169 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "при переиндекÑировании Ñекционированной таблицы \"%s.%s\"" -#: commands/indexcmds.c:3093 +#: commands/indexcmds.c:3172 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "при переÑтроении Ñекционированного индекÑа \"%s.%s\"" -#: commands/indexcmds.c:3284 commands/indexcmds.c:4140 +#: commands/indexcmds.c:3365 commands/indexcmds.c:4241 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "таблица \"%s.%s\" переиндекÑирована" -#: commands/indexcmds.c:3436 commands/indexcmds.c:3488 +#: commands/indexcmds.c:3517 commands/indexcmds.c:3570 #, c-format -msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" -msgstr "" -"переÑтроить нерабочий Ð¸Ð½Ð´ÐµÐºÑ \"%s.%s\" неблокирующим ÑпоÑобом нельзÑ, он " -"пропуÑкаетÑÑ" +msgid "skipping reindex of invalid index \"%s.%s\"" +msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s.%s\" — нерабочий, переиндекÑÐ°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑкаетÑÑ" -#: commands/indexcmds.c:3442 +#: commands/indexcmds.c:3520 commands/indexcmds.c:3573 +#, c-format +msgid "Use DROP INDEX or REINDEX INDEX." +msgstr "Выполните DROP INDEX или REINDEX INDEX." + +#: commands/indexcmds.c:3524 #, c-format msgid "" "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" @@ -9746,51 +10440,51 @@ msgstr "" "переÑтроить Ð¸Ð½Ð´ÐµÐºÑ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ-иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ \"%s.%s\" неблокирующим ÑпоÑобом " "нельзÑ, он пропуÑкаетÑÑ" -#: commands/indexcmds.c:3597 +#: commands/indexcmds.c:3680 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "переиндекÑировать отношение такого типа неблокирующим ÑпоÑобом нельзÑ" -#: commands/indexcmds.c:3618 +#: commands/indexcmds.c:3698 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "" "перемеÑтить отношение, не ÑвлÑющееÑÑ Ñ€Ð°Ð·Ð´ÐµÐ»Ñемым, в табличное проÑтранÑтво " "\"%s\" нельзÑ" -#: commands/indexcmds.c:4121 commands/indexcmds.c:4133 +#: commands/indexcmds.c:4222 commands/indexcmds.c:4234 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s.%s\" был переÑтроен" -#: commands/indexcmds.c:4123 commands/indexcmds.c:4142 +#: commands/indexcmds.c:4224 commands/indexcmds.c:4243 #, c-format msgid "%s." msgstr "%s." -#: commands/lockcmds.c:92 +#: commands/lockcmds.c:91 #, c-format msgid "cannot lock relation \"%s\"" msgstr "заблокировать отношение \"%s\" нельзÑ" -#: commands/matview.c:193 +#: commands/matview.c:206 #, c-format msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "" "CONCURRENTLY Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать, когда материализованное предÑтавление не " "наполнено" -#: commands/matview.c:199 gram.y:17995 +#: commands/matview.c:212 gram.y:18918 #, c-format msgid "%s and %s options cannot be used together" msgstr "параметры %s и %s иÑключают друг друга" -#: commands/matview.c:256 +#: commands/matview.c:269 #, c-format msgid "cannot refresh materialized view \"%s\" concurrently" msgstr "обновить материализованное предÑтавление \"%s\" параллельно нельзÑ" -#: commands/matview.c:259 +#: commands/matview.c:272 #, c-format msgid "" "Create a unique index with no WHERE clause on one or more columns of the " @@ -9799,7 +10493,7 @@ msgstr "" "Создайте уникальный Ð¸Ð½Ð´ÐµÐºÑ Ð±ÐµÐ· Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких " "Ñтолбцов материализованного предÑтавлениÑ." -#: commands/matview.c:653 +#: commands/matview.c:666 #, c-format msgid "" "new data for materialized view \"%s\" contains duplicate rows without any " @@ -9808,7 +10502,7 @@ msgstr "" "новые данные Ð´Ð»Ñ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ð¾Ð³Ð¾ предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" Ñодержат " "дублирующиеÑÑ Ñтроки (без учёта Ñтолбцов Ñ NULL)" -#: commands/matview.c:655 +#: commands/matview.c:668 #, c-format msgid "Row: %s" msgstr "Строка: %s" @@ -10023,22 +10717,22 @@ msgstr "номер оператора %d Ð´Ð»Ñ (%s,%s) дублируетÑÑ" msgid "operator %d(%s,%s) already exists in operator family \"%s\"" msgstr "оператор %d(%s,%s) уже ÑущеÑтвует в ÑемейÑтве \"%s\"" -#: commands/opclasscmds.c:1566 +#: commands/opclasscmds.c:1589 #, c-format msgid "function %d(%s,%s) already exists in operator family \"%s\"" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %d(%s,%s) уже ÑущеÑтвует в ÑемейÑтве операторов \"%s\"" -#: commands/opclasscmds.c:1647 +#: commands/opclasscmds.c:1744 #, c-format msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" msgstr "оператор %d(%s,%s) не ÑущеÑтвует в ÑемейÑтве операторов \"%s\"" -#: commands/opclasscmds.c:1687 +#: commands/opclasscmds.c:1784 #, c-format msgid "function %d(%s,%s) does not exist in operator family \"%s\"" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %d(%s,%s) не ÑущеÑтвует в ÑемейÑтве операторов \"%s\"" -#: commands/opclasscmds.c:1718 +#: commands/opclasscmds.c:1815 #, c-format msgid "" "operator class \"%s\" for access method \"%s\" already exists in schema " @@ -10047,7 +10741,7 @@ msgstr "" "клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² \"%s\" Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° доÑтупа \"%s\" уже ÑущеÑтвует в Ñхеме " "\"%s\"" -#: commands/opclasscmds.c:1741 +#: commands/opclasscmds.c:1838 #, c-format msgid "" "operator family \"%s\" for access method \"%s\" already exists in schema " @@ -10056,98 +10750,115 @@ msgstr "" "ÑемейÑтво операторов \"%s\" Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° доÑтупа \"%s\" уже ÑущеÑтвует в Ñхеме " "\"%s\"" -#: commands/operatorcmds.c:111 commands/operatorcmds.c:119 +#: commands/operatorcmds.c:113 commands/operatorcmds.c:121 #, c-format msgid "SETOF type not allowed for operator argument" msgstr "аргументом оператора не может быть тип SETOF" -#: commands/operatorcmds.c:152 commands/operatorcmds.c:479 +#: commands/operatorcmds.c:154 commands/operatorcmds.c:554 #, c-format msgid "operator attribute \"%s\" not recognized" msgstr "атрибут оператора \"%s\" не раÑпознан" -#: commands/operatorcmds.c:163 +#: commands/operatorcmds.c:165 #, c-format msgid "operator function must be specified" msgstr "необходимо указать функцию оператора" -#: commands/operatorcmds.c:181 +#: commands/operatorcmds.c:183 #, c-format msgid "operator argument types must be specified" msgstr "нужно указать типы аргументов оператора" -#: commands/operatorcmds.c:185 +#: commands/operatorcmds.c:187 #, c-format msgid "operator right argument type must be specified" msgstr "нужно указать тип правого аргумента оператора" -#: commands/operatorcmds.c:186 +#: commands/operatorcmds.c:188 #, c-format msgid "Postfix operators are not supported." msgstr "ПоÑтфикÑные операторы не поддерживаютÑÑ." -#: commands/operatorcmds.c:290 +#: commands/operatorcmds.c:292 #, c-format msgid "restriction estimator function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ†ÐµÐ½ÐºÐ¸ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ %s должна возвращать тип %s" -#: commands/operatorcmds.c:333 +#: commands/operatorcmds.c:335 #, c-format msgid "join estimator function %s has multiple matches" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ†ÐµÐ½ÐºÐ¸ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ %s приÑутÑтвует в неÑкольких ÑкземплÑрах" -#: commands/operatorcmds.c:348 +#: commands/operatorcmds.c:350 #, c-format msgid "join estimator function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ†ÐµÐ½ÐºÐ¸ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ %s должна возвращать тип %s" -#: commands/operatorcmds.c:473 +#: commands/operatorcmds.c:388 parser/parse_oper.c:119 parser/parse_oper.c:637 +#: utils/adt/regproc.c:509 utils/adt/regproc.c:683 +#, c-format +msgid "operator does not exist: %s" +msgstr "оператор не ÑущеÑтвует: %s" + +#: commands/operatorcmds.c:396 parser/parse_oper.c:702 parser/parse_oper.c:815 +#, c-format +msgid "operator is only a shell: %s" +msgstr "оператор \"%s\" - лишь оболочка" + +#: commands/operatorcmds.c:548 #, c-format msgid "operator attribute \"%s\" cannot be changed" msgstr "атрибут оператора \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ" -#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 -#: commands/tablecmds.c:1609 commands/tablecmds.c:2197 -#: commands/tablecmds.c:3423 commands/tablecmds.c:6312 -#: commands/tablecmds.c:9104 commands/tablecmds.c:17030 -#: commands/tablecmds.c:17065 commands/trigger.c:327 commands/trigger.c:1382 -#: commands/trigger.c:1492 rewrite/rewriteDefine.c:278 -#: rewrite/rewriteDefine.c:957 rewrite/rewriteRemove.c:80 +#: commands/operatorcmds.c:615 commands/operatorcmds.c:622 +#: commands/operatorcmds.c:628 commands/operatorcmds.c:634 +#, c-format +msgid "operator attribute \"%s\" cannot be changed if it has already been set" +msgstr "атрибут оператора \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ, еÑли он уже уÑтановлен" + +#: commands/policy.c:86 commands/policy.c:379 commands/statscmds.c:146 +#: commands/tablecmds.c:1740 commands/tablecmds.c:2340 +#: commands/tablecmds.c:3702 commands/tablecmds.c:6605 +#: commands/tablecmds.c:9670 commands/tablecmds.c:17813 +#: commands/tablecmds.c:17848 commands/trigger.c:316 commands/trigger.c:1332 +#: commands/trigger.c:1442 rewrite/rewriteDefine.c:268 +#: rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "доÑтуп запрещён: \"%s\" - Ñто ÑиÑтемный каталог" -#: commands/policy.c:172 +#: commands/policy.c:169 #, c-format msgid "ignoring specified roles other than PUBLIC" msgstr "вÑе указанные роли, кроме PUBLIC, игнорируютÑÑ" -#: commands/policy.c:173 +#: commands/policy.c:170 #, c-format msgid "All roles are members of the PUBLIC role." msgstr "Роль PUBLIC включает в ÑÐµÐ±Ñ Ð²Ñе оÑтальные роли." -#: commands/policy.c:607 +#: commands/policy.c:603 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "WITH CHECK Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ к SELECT или DELETE" -#: commands/policy.c:616 commands/policy.c:921 +#: commands/policy.c:612 commands/policy.c:915 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "Ð´Ð»Ñ INSERT допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ выражение WITH CHECK" -#: commands/policy.c:691 commands/policy.c:1144 +#: commands/policy.c:686 commands/policy.c:1138 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "политика \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\" уже ÑущеÑтвует" -#: commands/policy.c:893 commands/policy.c:1172 commands/policy.c:1243 +#: commands/policy.c:887 commands/policy.c:1166 commands/policy.c:1237 #, c-format msgid "policy \"%s\" for table \"%s\" does not exist" msgstr "политика \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\" не ÑущеÑтвует" -#: commands/policy.c:911 +#: commands/policy.c:905 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "Ð´Ð»Ñ SELECT, DELETE допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ выражение USING" @@ -10165,86 +10876,86 @@ msgstr "" "HOLD" #: commands/portalcmds.c:189 commands/portalcmds.c:242 -#: executor/execCurrent.c:70 utils/adt/xml.c:2593 utils/adt/xml.c:2763 +#: executor/execCurrent.c:70 utils/adt/xml.c:2936 utils/adt/xml.c:3106 #, c-format msgid "cursor \"%s\" does not exist" msgstr "курÑор \"%s\" не ÑущеÑтвует" -#: commands/prepare.c:75 +#: commands/prepare.c:72 #, c-format msgid "invalid statement name: must not be empty" msgstr "неверный оператор: Ð¸Ð¼Ñ Ð½Ðµ должно быть пуÑтым" # [SM]: TO REVIEW -#: commands/prepare.c:230 commands/prepare.c:235 +#: commands/prepare.c:227 commands/prepare.c:232 #, c-format msgid "prepared statement is not a SELECT" msgstr "подготовленный оператор - не SELECT" -#: commands/prepare.c:295 +#: commands/prepare.c:292 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "неверное чиÑло параметров Ð´Ð»Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ð¾Ð³Ð¾ оператора \"%s\"" -#: commands/prepare.c:297 +#: commands/prepare.c:294 #, c-format msgid "Expected %d parameters but got %d." msgstr "ОжидалоÑÑŒ параметров: %d, получено: %d." -#: commands/prepare.c:330 +#: commands/prepare.c:327 #, c-format msgid "parameter $%d of type %s cannot be coerced to the expected type %s" msgstr "параметр $%d типа %s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð²ÐµÑти к ожидаемому типу %s" # [SM]: TO REVIEW -#: commands/prepare.c:414 +#: commands/prepare.c:411 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "подготовленный оператор \"%s\" уже ÑущеÑтвует" # [SM]: TO REVIEW -#: commands/prepare.c:453 +#: commands/prepare.c:450 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "подготовленный оператор \"%s\" не ÑущеÑтвует" -#: commands/proclang.c:68 +#: commands/proclang.c:66 #, c-format msgid "must be superuser to create custom procedural language" msgstr "" "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ процедурного Ñзыка нужно быть Ñуперпользователем" -#: commands/publicationcmds.c:130 postmaster/postmaster.c:1219 -#: postmaster/postmaster.c:1318 utils/init/miscinit.c:1651 +#: commands/publicationcmds.c:124 postmaster/postmaster.c:1108 +#: postmaster/postmaster.c:1210 utils/init/miscinit.c:1865 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "неверный формат ÑпиÑка в параметре \"%s\"" -#: commands/publicationcmds.c:149 +#: commands/publicationcmds.c:143 #, c-format msgid "unrecognized value for publication option \"%s\": \"%s\"" msgstr "нераÑпознанное значение параметра публикации \"%s\": \"%s\"" -#: commands/publicationcmds.c:163 +#: commands/publicationcmds.c:157 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "нераÑпознанный параметр репликации: \"%s\"" -#: commands/publicationcmds.c:204 +#: commands/publicationcmds.c:198 #, c-format msgid "no schema has been selected for CURRENT_SCHEMA" msgstr "Ð´Ð»Ñ CURRENT_SCHEMA требуетÑÑ, чтобы была выбрана Ñхема" -#: commands/publicationcmds.c:501 +#: commands/publicationcmds.c:495 msgid "System columns are not allowed." msgstr "СиÑтемные Ñтолбцы не допуÑкаютÑÑ." -#: commands/publicationcmds.c:508 commands/publicationcmds.c:513 -#: commands/publicationcmds.c:530 +#: commands/publicationcmds.c:502 commands/publicationcmds.c:507 +#: commands/publicationcmds.c:524 msgid "User-defined operators are not allowed." msgstr "ПользовательÑкие операторы не допуÑкаютÑÑ." -#: commands/publicationcmds.c:554 +#: commands/publicationcmds.c:548 msgid "" "Only columns, constants, built-in operators, built-in data types, built-in " "collations, and immutable built-in functions are allowed." @@ -10252,43 +10963,43 @@ msgstr "" "ДопуÑкаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñтолбцы, конÑтанты, вÑтроенные операторы, вÑтроенные типы " "данных, вÑтроенные правила Ñортировки и вÑтроенные поÑтоÑнные функции." -#: commands/publicationcmds.c:566 +#: commands/publicationcmds.c:560 msgid "User-defined types are not allowed." msgstr "ПользовательÑкие типы не допуÑкаютÑÑ." -#: commands/publicationcmds.c:569 +#: commands/publicationcmds.c:563 msgid "User-defined or built-in mutable functions are not allowed." msgstr "ПользовательÑкие или вÑтроенные непоÑтоÑнные функции не допуÑкаютÑÑ." -#: commands/publicationcmds.c:572 +#: commands/publicationcmds.c:566 msgid "User-defined collations are not allowed." msgstr "ПользовательÑкие правила Ñортировки не допуÑкаютÑÑ." -#: commands/publicationcmds.c:582 +#: commands/publicationcmds.c:576 #, c-format msgid "invalid publication WHERE expression" msgstr "неверное выражение в предложении WHERE публикации" -#: commands/publicationcmds.c:635 +#: commands/publicationcmds.c:629 #, c-format msgid "cannot use publication WHERE clause for relation \"%s\"" msgstr "" "иÑпользовать в публикации предложение WHERE Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: commands/publicationcmds.c:637 +#: commands/publicationcmds.c:631 #, c-format msgid "WHERE clause cannot be used for a partitioned table when %s is false." msgstr "" "Предложение WHERE Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ð´Ð»Ñ Ñекционированной таблицы, когда %s " "равен false." -#: commands/publicationcmds.c:708 commands/publicationcmds.c:722 +#: commands/publicationcmds.c:702 commands/publicationcmds.c:716 #, c-format msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" msgstr "" "иÑпользовать ÑпиÑок Ñтолбцов Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" в публикации \"%s\" нельзÑ" -#: commands/publicationcmds.c:711 +#: commands/publicationcmds.c:705 #, c-format msgid "" "Column lists cannot be specified in publications containing FOR TABLES IN " @@ -10297,7 +11008,7 @@ msgstr "" "СпиÑки Ñтолбцов Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ в публикациÑÑ…, Ñодержащих Ñлементы FOR " "TABLES IN SCHEMA." -#: commands/publicationcmds.c:725 +#: commands/publicationcmds.c:719 #, c-format msgid "" "Column lists cannot be specified for partitioned tables when %s is false." @@ -10305,34 +11016,34 @@ msgstr "" "СпиÑки Ñтолбцов Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ Ð´Ð»Ñ Ñекционированных таблиц, когда %s равен " "false." -#: commands/publicationcmds.c:760 +#: commands/publicationcmds.c:754 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ вÑех таблиц нужно быть Ñуперпользователем" -#: commands/publicationcmds.c:831 +#: commands/publicationcmds.c:825 #, c-format msgid "must be superuser to create FOR TABLES IN SCHEMA publication" msgstr "" "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ вида FOR ALL TABLES IN SCHEMA нужно быть " "Ñуперпользователем" -#: commands/publicationcmds.c:867 +#: commands/publicationcmds.c:861 #, c-format -msgid "wal_level is insufficient to publish logical changes" -msgstr "уровень wal_level недоÑтаточен Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ логичеÑких изменений" +msgid "\"wal_level\" is insufficient to publish logical changes" +msgstr "уровень \"wal_level\" недоÑтаточен Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ логичеÑких изменений" -#: commands/publicationcmds.c:868 +#: commands/publicationcmds.c:862 #, c-format -msgid "Set wal_level to \"logical\" before creating subscriptions." -msgstr "Задайте Ð´Ð»Ñ wal_level значение \"logical\" до ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñок." +msgid "Set \"wal_level\" to \"logical\" before creating subscriptions." +msgstr "Задайте Ð´Ð»Ñ \"wal_level\" значение \"logical\" до ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñок." -#: commands/publicationcmds.c:964 commands/publicationcmds.c:972 +#: commands/publicationcmds.c:958 commands/publicationcmds.c:966 #, c-format msgid "cannot set parameter \"%s\" to false for publication \"%s\"" msgstr "параметру \"%s\" публикации \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ñвоить false" -#: commands/publicationcmds.c:967 +#: commands/publicationcmds.c:961 #, c-format msgid "" "The publication contains a WHERE clause for partitioned table \"%s\", which " @@ -10341,7 +11052,7 @@ msgstr "" "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñодержит предложение WHERE Ð´Ð»Ñ Ñекционированной таблицы \"%s\", " "что не допуÑкаетÑÑ, когда \"%s\" равен false." -#: commands/publicationcmds.c:975 +#: commands/publicationcmds.c:969 #, c-format msgid "" "The publication contains a column list for partitioned table \"%s\", which " @@ -10350,12 +11061,12 @@ msgstr "" "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñодержит ÑпиÑок Ñтолбцов Ð´Ð»Ñ Ñекционированной таблицы \"%s\", что " "не допуÑкаетÑÑ, когда \"%s\" равен false." -#: commands/publicationcmds.c:1298 +#: commands/publicationcmds.c:1292 #, c-format msgid "cannot add schema to publication \"%s\"" msgstr "добавить Ñхему в публикацию \"%s\" нельзÑ" -#: commands/publicationcmds.c:1300 +#: commands/publicationcmds.c:1294 #, c-format msgid "" "Schemas cannot be added if any tables that specify a column list are already " @@ -10364,86 +11075,97 @@ msgstr "" "Схемы Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñть в публикацию, еÑли в неё уже добавлены таблицы, Ð´Ð»Ñ " "которых задан ÑпиÑок Ñтолбцов." -#: commands/publicationcmds.c:1348 +#: commands/publicationcmds.c:1342 #, c-format msgid "must be superuser to add or set schemas" msgstr "Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ замены Ñхем нужно быть Ñуперпользователем" -#: commands/publicationcmds.c:1357 commands/publicationcmds.c:1365 +#: commands/publicationcmds.c:1351 commands/publicationcmds.c:1359 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\" определена Ð´Ð»Ñ Ð²Ñех таблиц (FOR ALL TABLES)" -#: commands/publicationcmds.c:1359 +#: commands/publicationcmds.c:1353 #, c-format msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." msgstr "Ð’ публикации вида FOR ALL TABLES Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñть или удалÑть таблицы." -#: commands/publicationcmds.c:1367 +#: commands/publicationcmds.c:1361 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "Ð’ публикации вÑех таблиц Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñть или удалÑть таблицы." -#: commands/publicationcmds.c:1593 commands/publicationcmds.c:1656 +#: commands/publicationcmds.c:1385 commands/publicationcmds.c:1424 +#: commands/publicationcmds.c:1961 utils/cache/lsyscache.c:3634 +#, c-format +msgid "publication \"%s\" does not exist" +msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\" не ÑущеÑтвует" + +#: commands/publicationcmds.c:1587 commands/publicationcmds.c:1650 #, c-format msgid "conflicting or redundant WHERE clauses for table \"%s\"" msgstr "конфликтующие или избыточные Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\"" -#: commands/publicationcmds.c:1600 commands/publicationcmds.c:1668 +#: commands/publicationcmds.c:1594 commands/publicationcmds.c:1662 #, c-format msgid "conflicting or redundant column lists for table \"%s\"" msgstr "конфликтующие или избыточные ÑпиÑки Ñтолбцов Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\"" -#: commands/publicationcmds.c:1802 +#: commands/publicationcmds.c:1796 #, c-format msgid "column list must not be specified in ALTER PUBLICATION ... DROP" msgstr "в ALTER PUBLICATION ... DROP не должен задаватьÑÑ ÑпиÑок Ñтолбцов" -#: commands/publicationcmds.c:1814 +#: commands/publicationcmds.c:1808 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "отношение \"%s\" не включено в публикацию" -#: commands/publicationcmds.c:1821 +#: commands/publicationcmds.c:1815 #, c-format msgid "cannot use a WHERE clause when removing a table from a publication" msgstr "иÑпользовать WHERE при удалении таблицы из публикации нельзÑ" -#: commands/publicationcmds.c:1881 +#: commands/publicationcmds.c:1875 #, c-format msgid "tables from schema \"%s\" are not part of the publication" msgstr "таблицы из Ñхемы \"%s\" не ÑвлÑÑŽÑ‚ÑÑ Ñ‡Ð°Ñтью публикации" -#: commands/publicationcmds.c:1924 commands/publicationcmds.c:1931 +#: commands/publicationcmds.c:1918 commands/publicationcmds.c:1925 #, c-format msgid "permission denied to change owner of publication \"%s\"" -msgstr "нет прав на изменение владельца публикации \"%s\"" +msgstr "нет прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð° публикации \"%s\"" -#: commands/publicationcmds.c:1926 +#: commands/publicationcmds.c:1920 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "" "Владельцем публикации вÑех таблиц (FOR ALL TABLES) должен быть " "Ñуперпользователь." -#: commands/publicationcmds.c:1933 +#: commands/publicationcmds.c:1927 #, c-format msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." msgstr "" "Владельцем публикации вида FOR TABLES IN SCHEMA должен быть " "Ñуперпользователь." -#: commands/schemacmds.c:105 commands/schemacmds.c:270 +#: commands/publicationcmds.c:1993 +#, c-format +msgid "publication with OID %u does not exist" +msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ OID %u не ÑущеÑтвует" + +#: commands/schemacmds.c:109 commands/schemacmds.c:289 #, c-format msgid "unacceptable schema name \"%s\"" msgstr "неприемлемое Ð¸Ð¼Ñ Ñхемы: \"%s\"" -#: commands/schemacmds.c:106 commands/schemacmds.c:271 +#: commands/schemacmds.c:110 commands/schemacmds.c:290 #, c-format msgid "The prefix \"pg_\" is reserved for system schemas." msgstr "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ \"pg_\" зарезервирован Ð´Ð»Ñ ÑиÑтемных Ñхем." -#: commands/schemacmds.c:130 +#: commands/schemacmds.c:134 #, c-format msgid "schema \"%s\" already exists, skipping" msgstr "Ñхема \"%s\" уже ÑущеÑтвует, пропуÑкаетÑÑ" @@ -10476,170 +11198,170 @@ msgstr "метки безопаÑноÑти не поддерживаютÑÑ Ð´ msgid "cannot set security label on relation \"%s\"" msgstr "задать метку безопаÑноÑти Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: commands/sequence.c:755 +#: commands/sequence.c:748 #, c-format msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ nextval доÑтигла макÑимума Ð´Ð»Ñ Ð¿Ð¾ÑледовательноÑти \"%s\" (%lld)" -#: commands/sequence.c:774 +#: commands/sequence.c:767 #, c-format msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ nextval доÑтигла минимума Ð´Ð»Ñ Ð¿Ð¾ÑледовательноÑти \"%s\" (%lld)" -#: commands/sequence.c:892 +#: commands/sequence.c:886 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "" "текущее значение (currval) Ð´Ð»Ñ Ð¿Ð¾ÑледовательноÑти \"%s\" ещё не определено в " "Ñтом ÑеанÑе" -#: commands/sequence.c:911 commands/sequence.c:917 +#: commands/sequence.c:905 commands/sequence.c:911 #, c-format msgid "lastval is not yet defined in this session" msgstr "поÑледнее значение (lastval) ещё не определено в Ñтом ÑеанÑе" -#: commands/sequence.c:997 +#: commands/sequence.c:991 #, c-format msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" msgstr "" "функции setval передано значение %lld вне пределов поÑледовательноÑти " "\"%s\" (%lld..%lld)" -#: commands/sequence.c:1365 +#: commands/sequence.c:1357 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "неверное ÑвойÑтво поÑледовательноÑти SEQUENCE NAME" -#: commands/sequence.c:1391 +#: commands/sequence.c:1383 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "" "типом Ñтолбца идентификации может быть только smallint, integer или bigint" -#: commands/sequence.c:1392 +#: commands/sequence.c:1384 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "" "типом поÑледовательноÑти может быть только smallint, integer или bigint" -#: commands/sequence.c:1426 +#: commands/sequence.c:1418 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT не может быть нулевым" -#: commands/sequence.c:1474 +#: commands/sequence.c:1466 #, c-format msgid "MAXVALUE (%lld) is out of range for sequence data type %s" msgstr "MAXVALUE (%lld) выходит за пределы типа данных поÑледовательноÑти %s" -#: commands/sequence.c:1506 +#: commands/sequence.c:1498 #, c-format msgid "MINVALUE (%lld) is out of range for sequence data type %s" msgstr "MINVALUE (%lld) выходит за пределы типа данных поÑледовательноÑти %s" -#: commands/sequence.c:1514 +#: commands/sequence.c:1506 #, c-format msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" msgstr "MINVALUE (%lld) должно быть меньше MAXVALUE (%lld)" -#: commands/sequence.c:1535 +#: commands/sequence.c:1527 #, c-format msgid "START value (%lld) cannot be less than MINVALUE (%lld)" msgstr "значение START (%lld) не может быть меньше MINVALUE (%lld)" -#: commands/sequence.c:1541 +#: commands/sequence.c:1533 #, c-format msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" msgstr "значение START (%lld) не может быть больше MAXVALUE (%lld)" -#: commands/sequence.c:1565 +#: commands/sequence.c:1557 #, c-format msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" msgstr "значение RESTART (%lld) не может быть меньше MINVALUE (%lld)" -#: commands/sequence.c:1571 +#: commands/sequence.c:1563 #, c-format msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" msgstr "значение RESTART (%lld) не может быть больше MAXVALUE (%lld)" -#: commands/sequence.c:1582 +#: commands/sequence.c:1574 #, c-format msgid "CACHE (%lld) must be greater than zero" msgstr "значение CACHE (%lld) должно быть больше нулÑ" -#: commands/sequence.c:1618 +#: commands/sequence.c:1610 #, c-format msgid "invalid OWNED BY option" msgstr "неверное указание OWNED BY" # skip-rule: no-space-after-period -#: commands/sequence.c:1619 +#: commands/sequence.c:1611 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "Укажите OWNED BY таблица.Ñтолбец или OWNED BY NONE." -#: commands/sequence.c:1644 +#: commands/sequence.c:1636 #, c-format msgid "sequence cannot be owned by relation \"%s\"" msgstr "поÑледовательноÑть не может принадлежать отношению \"%s\"" -#: commands/sequence.c:1652 +#: commands/sequence.c:1644 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "" "поÑледовательноÑть должна иметь того же владельца, что и таблица, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ " "она ÑвÑзана" -#: commands/sequence.c:1656 +#: commands/sequence.c:1648 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "" "поÑледовательноÑть должна быть в той же Ñхеме, что и таблица, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ она " "ÑвÑзана" -#: commands/sequence.c:1678 +#: commands/sequence.c:1670 #, c-format msgid "cannot change ownership of identity sequence" msgstr "Ñменить владельца поÑледовательноÑти идентификации нельзÑ" -#: commands/sequence.c:1679 commands/tablecmds.c:13819 -#: commands/tablecmds.c:16455 +#: commands/sequence.c:1671 commands/tablecmds.c:14527 +#: commands/tablecmds.c:17222 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "ПоÑледовательноÑть \"%s\" ÑвÑзана Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÐµÐ¹ \"%s\"." -#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1876 +#: commands/statscmds.c:106 commands/statscmds.c:115 tcop/utility.c:1883 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "в CREATE STATISTICS можно указать только одно отношение" -#: commands/statscmds.c:136 +#: commands/statscmds.c:133 #, c-format msgid "cannot define statistics for relation \"%s\"" msgstr "Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ объект ÑтатиÑтики" -#: commands/statscmds.c:191 +#: commands/statscmds.c:187 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "объект ÑтатиÑтики \"%s\" уже ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/statscmds.c:199 +#: commands/statscmds.c:195 #, c-format msgid "statistics object \"%s\" already exists" msgstr "объект ÑтатиÑтики \"%s\" уже ÑущеÑтвует" -#: commands/statscmds.c:210 +#: commands/statscmds.c:206 #, c-format msgid "cannot have more than %d columns in statistics" msgstr "в ÑтатиÑтике не может быть больше %d Ñтолбцов" -#: commands/statscmds.c:251 commands/statscmds.c:274 commands/statscmds.c:308 +#: commands/statscmds.c:247 commands/statscmds.c:270 commands/statscmds.c:304 #, c-format msgid "statistics creation on system columns is not supported" msgstr "Ñоздание ÑтатиÑтики Ð´Ð»Ñ ÑиÑтемных Ñтолбцов не поддерживаетÑÑ" -#: commands/statscmds.c:258 commands/statscmds.c:281 +#: commands/statscmds.c:254 commands/statscmds.c:277 #, c-format msgid "" "column \"%s\" cannot be used in statistics because its type %s has no " @@ -10648,7 +11370,7 @@ msgstr "" "Ñтолбец \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в ÑтатиÑтике, так как Ð´Ð»Ñ ÐµÐ³Ð¾ типа %s не " "определён клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² B-дерева по умолчанию" -#: commands/statscmds.c:325 +#: commands/statscmds.c:321 #, c-format msgid "" "expression cannot be used in multivariate statistics because its type %s has " @@ -10657,7 +11379,7 @@ msgstr "" "выражение Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в многовариантной ÑтатиÑтике, так как Ð´Ð»Ñ ÐµÐ³Ð¾ " "типа %s не определён клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² btree по умолчанию" -#: commands/statscmds.c:346 +#: commands/statscmds.c:342 #, c-format msgid "" "when building statistics on a single expression, statistics kinds may not be " @@ -10666,71 +11388,76 @@ msgstr "" "при поÑтроении ÑтатиÑтики по единÑтвенному выражению указывать виды " "ÑтатиÑтики нельзÑ" -#: commands/statscmds.c:375 +#: commands/statscmds.c:371 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "нераÑпознанный вид ÑтатиÑтики \"%s\"" -#: commands/statscmds.c:404 +#: commands/statscmds.c:400 #, c-format msgid "extended statistics require at least 2 columns" msgstr "Ð´Ð»Ñ Ñ€Ð°Ñширенной ÑтатиÑтики требуютÑÑ Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼ 2 Ñтолбца" -#: commands/statscmds.c:422 +#: commands/statscmds.c:418 #, c-format msgid "duplicate column name in statistics definition" msgstr "повторÑющееÑÑ Ð¸Ð¼Ñ Ñтолбца в определении ÑтатиÑтики" -#: commands/statscmds.c:457 +#: commands/statscmds.c:453 #, c-format msgid "duplicate expression in statistics definition" msgstr "повторÑющееÑÑ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ в определении ÑтатиÑтики" -#: commands/statscmds.c:620 commands/tablecmds.c:8072 +#: commands/statscmds.c:628 commands/tablecmds.c:8653 #, c-format msgid "statistics target %d is too low" msgstr "ориентир ÑтатиÑтики Ñлишком мал (%d)" -#: commands/statscmds.c:628 commands/tablecmds.c:8080 +#: commands/statscmds.c:636 commands/tablecmds.c:8661 #, c-format msgid "lowering statistics target to %d" msgstr "ориентир ÑтатиÑтики ÑнижаетÑÑ Ð´Ð¾ %d" -#: commands/statscmds.c:651 +#: commands/statscmds.c:660 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "объект ÑтатиÑтики \"%s.%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/subscriptioncmds.c:251 commands/subscriptioncmds.c:298 +#: commands/subscriptioncmds.c:275 commands/subscriptioncmds.c:372 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "нераÑпознанный параметр подпиÑки: \"%s\"" -#: commands/subscriptioncmds.c:289 +#: commands/subscriptioncmds.c:340 replication/pgoutput/pgoutput.c:404 +#, c-format +msgid "unrecognized origin value: \"%s\"" +msgstr "нераÑпознанное значение origin: \"%s\"" + +#: commands/subscriptioncmds.c:363 #, c-format msgid "invalid WAL location (LSN): %s" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² WAL (LSN): %s" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:313 commands/subscriptioncmds.c:320 -#: commands/subscriptioncmds.c:327 commands/subscriptioncmds.c:349 -#: commands/subscriptioncmds.c:365 +#: commands/subscriptioncmds.c:387 commands/subscriptioncmds.c:394 +#: commands/subscriptioncmds.c:401 commands/subscriptioncmds.c:423 +#: commands/subscriptioncmds.c:439 #, c-format msgid "%s and %s are mutually exclusive options" msgstr "ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ %s и %s ÑвлÑÑŽÑ‚ÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð¸Ñключающими" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:355 commands/subscriptioncmds.c:371 +#: commands/subscriptioncmds.c:429 commands/subscriptioncmds.c:445 #, c-format msgid "subscription with %s must also set %s" msgstr "Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ %s необходимо также задать %s" -#: commands/subscriptioncmds.c:433 +#: commands/subscriptioncmds.c:506 #, c-format msgid "could not receive list of publications from the publisher: %s" msgstr "не удалоÑÑŒ получить ÑпиÑок публикаций Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÑƒÑŽÑ‰ÐµÐ³Ð¾ Ñервера: %s" -#: commands/subscriptioncmds.c:465 +#: commands/subscriptioncmds.c:538 #, c-format msgid "publication %s does not exist on the publisher" msgid_plural "publications %s do not exist on the publisher" @@ -10738,55 +11465,79 @@ msgstr[0] "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ %s не ÑущеÑтвует на публику msgstr[1] "публикации %s не ÑущеÑтвуют на публикующем Ñервере" msgstr[2] "публикации %s не ÑущеÑтвуют на публикующем Ñервере" -#: commands/subscriptioncmds.c:547 +#: commands/subscriptioncmds.c:626 #, c-format -msgid "must be superuser to create subscriptions" -msgstr "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñок нужно быть Ñуперпользователем" +msgid "permission denied to create subscription" +msgstr "нет прав Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки" -#: commands/subscriptioncmds.c:648 commands/subscriptioncmds.c:776 -#: replication/logical/tablesync.c:1229 replication/logical/worker.c:3738 +#: commands/subscriptioncmds.c:627 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may create subscriptions." +msgstr "Создавать подпиÑки могут только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли \"%s\"." + +#: commands/subscriptioncmds.c:758 commands/subscriptioncmds.c:891 +#: commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1345 +#: replication/logical/worker.c:4524 #, c-format msgid "could not connect to the publisher: %s" msgstr "не удалоÑÑŒ подключитьÑÑ Ðº Ñерверу публикации: %s" -#: commands/subscriptioncmds.c:717 +#: commands/subscriptioncmds.c:829 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "на Ñервере публикации Ñоздан Ñлот репликации \"%s\"" -#. translator: %s is an SQL ALTER statement -#: commands/subscriptioncmds.c:730 +#: commands/subscriptioncmds.c:841 +#, c-format +msgid "subscription was created, but is not connected" +msgstr "подпиÑка Ñоздана, но не подключена" + +#: commands/subscriptioncmds.c:842 #, c-format msgid "" -"tables were not subscribed, you will have to run %s to subscribe the tables" +"To initiate replication, you must manually create the replication slot, " +"enable the subscription, and refresh the subscription." msgstr "" -"в подпиÑке отÑутÑтвуют таблицы; потребуетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ %s, чтобы подпиÑатьÑÑ " -"на таблицы" +"Чтобы начать репликацию, вы должны вручную Ñоздать Ñлот репликации, включить " +"подпиÑку, а затем обновить её." + +#: commands/subscriptioncmds.c:1109 commands/subscriptioncmds.c:1590 +#: commands/subscriptioncmds.c:1973 utils/cache/lsyscache.c:3684 +#, c-format +msgid "subscription \"%s\" does not exist" +msgstr "подпиÑка \"%s\" не ÑущеÑтвует" -#: commands/subscriptioncmds.c:1033 +#: commands/subscriptioncmds.c:1166 commands/subscriptioncmds.c:1245 #, c-format msgid "cannot set %s for enabled subscription" msgstr "Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡Ñ‘Ð½Ð½Ð¾Ð¹ подпиÑки Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ %s" -#: commands/subscriptioncmds.c:1086 +#: commands/subscriptioncmds.c:1233 +#, c-format +msgid "" +"cannot set option \"%s\" for a subscription that does not have a slot name" +msgstr "" +"задать параметр \"%s\" Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ не задано Ð¸Ð¼Ñ Ñлота, нельзÑ" + +#: commands/subscriptioncmds.c:1279 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "включить подпиÑку, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ не задано Ð¸Ð¼Ñ Ñлота, нельзÑ" -#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1180 +#: commands/subscriptioncmds.c:1323 commands/subscriptioncmds.c:1374 #, c-format msgid "" "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "" "ALTER SUBSCRIPTION Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ñ‘Ð½Ð½Ñ‹Ñ… подпиÑок не допуÑкаетÑÑ" -#: commands/subscriptioncmds.c:1130 +#: commands/subscriptioncmds.c:1324 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "" "Выполните ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1139 commands/subscriptioncmds.c:1194 +#: commands/subscriptioncmds.c:1333 commands/subscriptioncmds.c:1388 #, c-format msgid "" "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase " @@ -10795,7 +11546,7 @@ msgstr "" "ALTER SUBSCRIPTION Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ публикации refresh в режиме copy_data не " "допуÑкаетÑÑ, когда включён параметр two_phase" -#: commands/subscriptioncmds.c:1140 +#: commands/subscriptioncmds.c:1334 #, c-format msgid "" "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with " @@ -10805,13 +11556,7 @@ msgstr "" "copy_data = false либо выполните DROP/CREATE SUBSCRIPTION." #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1182 -#, c-format -msgid "Use %s instead." -msgstr "Выполните %s." - -#. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1196 +#: commands/subscriptioncmds.c:1390 #, c-format msgid "" "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE " @@ -10820,13 +11565,13 @@ msgstr "" "Выполните %s Ñ refresh = false или Ñ copy_data = false либо выполните DROP/" "CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1218 +#: commands/subscriptioncmds.c:1412 #, c-format msgid "" "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ñ‘Ð½Ð½Ñ‹Ñ… подпиÑок не допуÑкаетÑÑ" -#: commands/subscriptioncmds.c:1243 +#: commands/subscriptioncmds.c:1437 #, c-format msgid "" "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase " @@ -10835,7 +11580,7 @@ msgstr "" "ALTER SUBSCRIPTION ... REFRESH в режиме copy_data не допуÑкаетÑÑ, когда " "включён параметр two_phase" -#: commands/subscriptioncmds.c:1244 +#: commands/subscriptioncmds.c:1438 #, c-format msgid "" "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/" @@ -10844,50 +11589,76 @@ msgstr "" "Выполните ALTER SUBSCRIPTION ... REFRESH Ñ copy_data = false либо выполните " "DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1263 -#, c-format -msgid "must be superuser to skip transaction" -msgstr "чтобы пропуÑтить транзакцию, нужно быть Ñуперпользователем" - -#: commands/subscriptioncmds.c:1283 +#: commands/subscriptioncmds.c:1473 #, c-format msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" msgstr "" "Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑка в WAL (LSN %X/%X) должна быть больше начального LSN %X/%X" -#: commands/subscriptioncmds.c:1363 +#: commands/subscriptioncmds.c:1594 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "подпиÑка \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/subscriptioncmds.c:1621 +#: commands/subscriptioncmds.c:1863 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "Ñлот репликации \"%s\" удалён на Ñервере репликации" -#: commands/subscriptioncmds.c:1630 commands/subscriptioncmds.c:1638 +#: commands/subscriptioncmds.c:1872 commands/subscriptioncmds.c:1880 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" msgstr "Ñлот репликации \"%s\" на Ñервере публикации не был удалён: %s" -#: commands/subscriptioncmds.c:1672 +#: commands/subscriptioncmds.c:2005 #, c-format -msgid "permission denied to change owner of subscription \"%s\"" -msgstr "нет прав на изменение владельца подпиÑки \"%s\"" - -#: commands/subscriptioncmds.c:1674 -#, c-format -msgid "The owner of a subscription must be a superuser." -msgstr "Владельцем подпиÑки должен быть Ñуперпользователь." +msgid "subscription with OID %u does not exist" +msgstr "подпиÑка Ñ OID %u не ÑущеÑтвует" -#: commands/subscriptioncmds.c:1788 +#: commands/subscriptioncmds.c:2079 commands/subscriptioncmds.c:2204 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "" "не удалоÑÑŒ получить ÑпиÑок реплицируемых таблиц Ñ Ñервера репликации: %s" -#: commands/subscriptioncmds.c:1810 replication/logical/tablesync.c:809 -#: replication/pgoutput/pgoutput.c:1062 +#: commands/subscriptioncmds.c:2115 +#, c-format +msgid "" +"subscription \"%s\" requested copy_data with origin = NONE but might copy " +"data that had a different origin" +msgstr "" +"Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" выбран режим copy_data Ñ origin = NONE, но в неё могут " +"попаÑть данные из другого иÑточника" + +#: commands/subscriptioncmds.c:2117 +#, c-format +msgid "" +"The subscription being created subscribes to a publication (%s) that " +"contains tables that are written to by other subscriptions." +msgid_plural "" +"The subscription being created subscribes to publications (%s) that contain " +"tables that are written to by other subscriptions." +msgstr[0] "" +"Ð¡Ð¾Ð·Ð´Ð°Ð²Ð°ÐµÐ¼Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñка ÑвÑзана Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸ÐµÐ¹ (%s), Ñодержащей таблицы, в " +"которые запиÑывают другие подпиÑки." +msgstr[1] "" +"Ð¡Ð¾Ð·Ð´Ð°Ð²Ð°ÐµÐ¼Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñка ÑвÑзана Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñми (%s), Ñодержащими таблицы, в " +"которые запиÑывают другие подпиÑки." +msgstr[2] "" +"Ð¡Ð¾Ð·Ð´Ð°Ð²Ð°ÐµÐ¼Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñка ÑвÑзана Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñми (%s), Ñодержащими таблицы, в " +"которые запиÑывают другие подпиÑки." + +#: commands/subscriptioncmds.c:2120 +#, c-format +msgid "" +"Verify that initial data copied from the publisher tables did not come from " +"other origins." +msgstr "" +"УбедитеÑÑŒ, что начальные данные, Ñкопированные из таблиц публикации, " +"поÑтупили не из других иÑточников." + +#: commands/subscriptioncmds.c:2226 replication/logical/tablesync.c:906 +#: replication/pgoutput/pgoutput.c:1143 #, c-format msgid "" "cannot use different column lists for table \"%s.%s\" in different " @@ -10896,7 +11667,7 @@ msgstr "" "иÑпользовать различные ÑпиÑки Ñтолбцов таблицы \"%s.%s\" в разных " "публикациÑÑ… нельзÑ" -#: commands/subscriptioncmds.c:1860 +#: commands/subscriptioncmds.c:2276 #, c-format msgid "" "could not connect to publisher when attempting to drop replication slot " @@ -10906,194 +11677,206 @@ msgstr "" "\"%s\": %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1863 +#: commands/subscriptioncmds.c:2279 #, c-format -msgid "Use %s to disassociate the subscription from the slot." -msgstr "Выполните %s, чтобы отвÑзать подпиÑку от Ñлота." +msgid "" +"Use %s to disable the subscription, and then use %s to disassociate it from " +"the slot." +msgstr "" +"Выполните %s, чтобы отключить подпиÑку, а затем выполните %s, чтобы отвÑзать " +"её от Ñлота." -#: commands/subscriptioncmds.c:1893 +#: commands/subscriptioncmds.c:2310 #, c-format msgid "publication name \"%s\" used more than once" msgstr "Ð¸Ð¼Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ \"%s\" иÑпользуетÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾ÐºÑ€Ð°Ñ‚Ð½Ð¾" -#: commands/subscriptioncmds.c:1937 +#: commands/subscriptioncmds.c:2354 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\" уже имеетÑÑ Ð² подпиÑке \"%s\"" -#: commands/subscriptioncmds.c:1951 +#: commands/subscriptioncmds.c:2368 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\" отÑутÑтвует в подпиÑке \"%s\"" -#: commands/subscriptioncmds.c:1962 +#: commands/subscriptioncmds.c:2379 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "удалить вÑе публикации из подпиÑки нельзÑ" -#: commands/tablecmds.c:245 commands/tablecmds.c:287 +#: commands/subscriptioncmds.c:2436 +#, c-format +msgid "%s requires a Boolean value or \"parallel\"" +msgstr "%s требует логичеÑкое значение или \"parallel\"" + +#: commands/tablecmds.c:255 commands/tablecmds.c:297 #, c-format msgid "table \"%s\" does not exist" msgstr "таблица \"%s\" не ÑущеÑтвует" -#: commands/tablecmds.c:246 commands/tablecmds.c:288 +#: commands/tablecmds.c:256 commands/tablecmds.c:298 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "таблица \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/tablecmds.c:248 commands/tablecmds.c:290 +#: commands/tablecmds.c:258 commands/tablecmds.c:300 msgid "Use DROP TABLE to remove a table." msgstr "Выполните DROP TABLE Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹." -#: commands/tablecmds.c:251 +#: commands/tablecmds.c:261 #, c-format msgid "sequence \"%s\" does not exist" msgstr "поÑледовательноÑть \"%s\" не ÑущеÑтвует" -#: commands/tablecmds.c:252 +#: commands/tablecmds.c:262 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "поÑледовательноÑть \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/tablecmds.c:254 +#: commands/tablecmds.c:264 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "Выполните DROP SEQUENCE Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑледовательноÑти." -#: commands/tablecmds.c:257 +#: commands/tablecmds.c:267 #, c-format msgid "view \"%s\" does not exist" msgstr "предÑтавление \"%s\" не ÑущеÑтвует" -#: commands/tablecmds.c:258 +#: commands/tablecmds.c:268 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "предÑтавление \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:270 msgid "Use DROP VIEW to remove a view." msgstr "Выполните DROP VIEW Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´ÑтавлениÑ." -#: commands/tablecmds.c:263 +#: commands/tablecmds.c:273 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "материализованное предÑтавление \"%s\" не ÑущеÑтвует" -#: commands/tablecmds.c:264 +#: commands/tablecmds.c:274 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "материализованное предÑтавление \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/tablecmds.c:266 +#: commands/tablecmds.c:276 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "" "Выполните DROP MATERIALIZED VIEW Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ð¾Ð³Ð¾ " "предÑтавлениÑ." -#: commands/tablecmds.c:269 commands/tablecmds.c:293 commands/tablecmds.c:18953 -#: parser/parse_utilcmd.c:2260 +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19846 +#: parser/parse_utilcmd.c:2251 #, c-format msgid "index \"%s\" does not exist" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" не ÑущеÑтвует" -#: commands/tablecmds.c:270 commands/tablecmds.c:294 +#: commands/tablecmds.c:280 commands/tablecmds.c:304 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/tablecmds.c:272 commands/tablecmds.c:296 +#: commands/tablecmds.c:282 commands/tablecmds.c:306 msgid "Use DROP INDEX to remove an index." msgstr "Выполните DROP INDEX Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа." -#: commands/tablecmds.c:277 +#: commands/tablecmds.c:287 #, c-format msgid "\"%s\" is not a type" msgstr "\"%s\" - Ñто не тип" -#: commands/tablecmds.c:278 +#: commands/tablecmds.c:288 msgid "Use DROP TYPE to remove a type." msgstr "Выполните DROP TYPE Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð°." -#: commands/tablecmds.c:281 commands/tablecmds.c:13658 -#: commands/tablecmds.c:16158 +#: commands/tablecmds.c:291 commands/tablecmds.c:14366 +#: commands/tablecmds.c:16927 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "ÑтороннÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s\" не ÑущеÑтвует" -#: commands/tablecmds.c:282 +#: commands/tablecmds.c:292 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "ÑтороннÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/tablecmds.c:284 +#: commands/tablecmds.c:294 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Выполните DROP FOREIGN TABLE Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñторонней таблицы." -#: commands/tablecmds.c:697 +#: commands/tablecmds.c:734 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT можно иÑпользовать только Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ… таблиц" -#: commands/tablecmds.c:728 +#: commands/tablecmds.c:765 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "" "в рамках операции Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñми по безопаÑноÑти Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать временную " "таблицу" -#: commands/tablecmds.c:764 commands/tablecmds.c:14965 +#: commands/tablecmds.c:801 commands/tablecmds.c:15786 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "отношение \"%s\" наÑледуетÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾ÐºÑ€Ð°Ñ‚Ð½Ð¾" -#: commands/tablecmds.c:949 -#, c-format -msgid "" -"specifying a table access method is not supported on a partitioned table" -msgstr "" -"указание табличного метода доÑтупа Ð´Ð»Ñ Ñекционированных таблиц не " -"поддерживаютÑÑ" - -#: commands/tablecmds.c:1042 +#: commands/tablecmds.c:1067 #, c-format msgid "\"%s\" is not partitioned" msgstr "отношение \"%s\" не ÑвлÑетÑÑ Ñекционированным" -#: commands/tablecmds.c:1137 +#: commands/tablecmds.c:1161 #, c-format msgid "cannot partition using more than %d columns" msgstr "чиÑло Ñтолбцов в ключе ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ может превышать %d" -#: commands/tablecmds.c:1193 +#: commands/tablecmds.c:1217 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "Ñоздать Ñтороннюю Ñекцию Ð´Ð»Ñ Ñекционированной таблицы \"%s\" нельзÑ" -#: commands/tablecmds.c:1195 +#: commands/tablecmds.c:1219 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "Таблица \"%s\" Ñодержит индекÑÑ‹, ÑвлÑющиеÑÑ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸." -#: commands/tablecmds.c:1358 +#: commands/tablecmds.c:1338 commands/tablecmds.c:13382 +#, c-format +msgid "too many array dimensions" +msgstr "Ñлишком много размерноÑтей маÑÑива" + +#: commands/tablecmds.c:1343 parser/parse_clause.c:774 +#: parser/parse_relation.c:1912 +#, c-format +msgid "column \"%s\" cannot be declared SETOF" +msgstr "Ñтолбец \"%s\" не может быть объÑвлен как SETOF" + +#: commands/tablecmds.c:1489 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY не поддерживает удаление неÑкольких объектов" -#: commands/tablecmds.c:1362 +#: commands/tablecmds.c:1493 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY не поддерживает режим CASCADE" -#: commands/tablecmds.c:1466 +#: commands/tablecmds.c:1597 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "удалить Ñекционированный Ð¸Ð½Ð´ÐµÐºÑ \"%s\" параллельным ÑпоÑобом нельзÑ" -#: commands/tablecmds.c:1754 +#: commands/tablecmds.c:1885 #, c-format msgid "cannot truncate only a partitioned table" msgstr "опуÑтошить ÑобÑтвенно Ñекционированную таблицу нельзÑ" -#: commands/tablecmds.c:1755 +#: commands/tablecmds.c:1886 #, c-format msgid "" "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions " @@ -11102,39 +11885,39 @@ msgstr "" "Ðе указывайте ключевое Ñлово ONLY или выполните TRUNCATE ONLY " "непоÑредÑтвенно Ð´Ð»Ñ Ñекций." -#: commands/tablecmds.c:1827 +#: commands/tablecmds.c:1959 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "опуÑтошение раÑпроÑтранÑетÑÑ Ð½Ð° таблицу %s" -#: commands/tablecmds.c:2177 +#: commands/tablecmds.c:2320 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "опуÑтошить Ñтороннюю таблицу \"%s\" нельзÑ" -#: commands/tablecmds.c:2234 +#: commands/tablecmds.c:2377 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "временные таблицы других ÑеанÑов Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð¿ÑƒÑтошить" -#: commands/tablecmds.c:2462 commands/tablecmds.c:14862 +#: commands/tablecmds.c:2606 commands/tablecmds.c:15683 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "наÑледование от Ñекционированной таблицы \"%s\" не допуÑкаетÑÑ" -#: commands/tablecmds.c:2467 +#: commands/tablecmds.c:2611 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "наÑледование от Ñекции \"%s\" не допуÑкаетÑÑ" -#: commands/tablecmds.c:2475 parser/parse_utilcmd.c:2490 -#: parser/parse_utilcmd.c:2632 +#: commands/tablecmds.c:2619 parser/parse_utilcmd.c:2481 +#: parser/parse_utilcmd.c:2623 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "" "наÑледуемое отношение \"%s\" не ÑвлÑетÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÐµÐ¹ или Ñторонней таблицей" -#: commands/tablecmds.c:2487 +#: commands/tablecmds.c:2631 #, c-format msgid "" "cannot create a temporary relation as partition of permanent relation \"%s\"" @@ -11142,216 +11925,219 @@ msgstr "" "Ñоздать временное отношение в качеÑтве Ñекции поÑтоÑнного Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" " "нельзÑ" -#: commands/tablecmds.c:2496 commands/tablecmds.c:14841 +#: commands/tablecmds.c:2640 commands/tablecmds.c:15662 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "временное отношение \"%s\" не может наÑледоватьÑÑ" -#: commands/tablecmds.c:2506 commands/tablecmds.c:14849 +#: commands/tablecmds.c:2650 commands/tablecmds.c:15670 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "наÑледование от временного Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³Ð¾ ÑеанÑа невозможно" -#: commands/tablecmds.c:2560 +#: commands/tablecmds.c:2791 commands/tablecmds.c:2845 +#: commands/tablecmds.c:13065 parser/parse_utilcmd.c:1265 +#: parser/parse_utilcmd.c:1308 parser/parse_utilcmd.c:1735 +#: parser/parse_utilcmd.c:1843 #, c-format -msgid "merging multiple inherited definitions of column \"%s\"" -msgstr "ÑлиÑние неÑкольких наÑледованных определений Ñтолбца \"%s\"" +msgid "cannot convert whole-row table reference" +msgstr "преобразовать ÑÑылку на тип вÑей Ñтроки таблицы нельзÑ" -#: commands/tablecmds.c:2568 +#: commands/tablecmds.c:2792 parser/parse_utilcmd.c:1266 #, c-format -msgid "inherited column \"%s\" has a type conflict" -msgstr "конфликт типов в наÑледованном Ñтолбце \"%s\"" +msgid "" +"Generation expression for column \"%s\" contains a whole-row reference to " +"table \"%s\"." +msgstr "" +"Генерирующее выражение Ñтолбца \"%s\" ÑÑылаетÑÑ Ð½Ð° тип вÑей Ñтроки в таблице " +"\"%s\"." -#: commands/tablecmds.c:2570 commands/tablecmds.c:2593 -#: commands/tablecmds.c:2610 commands/tablecmds.c:2866 -#: commands/tablecmds.c:2896 commands/tablecmds.c:2910 -#: parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 -#: parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 -#: parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 -#: parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 -#: parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 -#: parser/parse_param.c:227 +#: commands/tablecmds.c:2846 parser/parse_utilcmd.c:1309 #, c-format -msgid "%s versus %s" -msgstr "%s и %s" +msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "Ограничение \"%s\" ÑÑылаетÑÑ Ð½Ð° тип вÑей Ñтроки в таблице \"%s\"." -#: commands/tablecmds.c:2579 +#: commands/tablecmds.c:2956 commands/tablecmds.c:3227 #, c-format -msgid "inherited column \"%s\" has a collation conflict" -msgstr "конфликт правил Ñортировки в наÑледованном Ñтолбце \"%s\"" +msgid "column \"%s\" inherits from generated column but specifies default" +msgstr "" +"Ñтолбец \"%s\" наÑледуетÑÑ Ð¾Ñ‚ генерируемого Ñтолбца, но Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ задано " +"значение по умолчанию" -#: commands/tablecmds.c:2581 commands/tablecmds.c:2878 -#: commands/tablecmds.c:6752 +#: commands/tablecmds.c:2961 commands/tablecmds.c:3232 #, c-format -msgid "\"%s\" versus \"%s\"" -msgstr "\"%s\" и \"%s\"" +msgid "column \"%s\" inherits from generated column but specifies identity" +msgstr "" +"Ñтолбец \"%s\" наÑледуетÑÑ Ð¾Ñ‚ генерируемого Ñтолбца, но Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ задано " +"ÑвойÑтво идентификации" -#: commands/tablecmds.c:2591 +#: commands/tablecmds.c:2969 commands/tablecmds.c:3240 #, c-format -msgid "inherited column \"%s\" has a storage parameter conflict" -msgstr "конфликт параметров Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð² наÑледованном Ñтолбце \"%s\"" +msgid "child column \"%s\" specifies generation expression" +msgstr "Ð´Ð»Ñ Ð´Ð¾Ñ‡ÐµÑ€Ð½ÐµÐ³Ð¾ Ñтолбца \"%s\" указано генерирующее выражение" -#: commands/tablecmds.c:2608 commands/tablecmds.c:2908 +#: commands/tablecmds.c:2971 commands/tablecmds.c:3242 #, c-format -msgid "column \"%s\" has a compression method conflict" -msgstr "в Ñтолбце \"%s\" возник конфликт методов ÑжатиÑ" +msgid "A child table column cannot be generated unless its parent column is." +msgstr "" +"Дочерний Ñтолбец может быть генерируемым, только еÑли родительÑкий Ñтолбец " +"ÑвлÑетÑÑ Ñ‚Ð°ÐºÐ¾Ð²Ñ‹Ð¼." -#: commands/tablecmds.c:2623 +#: commands/tablecmds.c:3017 #, c-format -msgid "inherited column \"%s\" has a generation conflict" -msgstr "конфликт ÑвойÑтва Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² наÑледованном Ñтолбце \"%s\"" +msgid "column \"%s\" inherits conflicting generation expressions" +msgstr "Ñтолбец \"%s\" наÑледует конфликтующие генерирующие выражениÑ" -#: commands/tablecmds.c:2717 commands/tablecmds.c:2772 -#: commands/tablecmds.c:12382 parser/parse_utilcmd.c:1301 -#: parser/parse_utilcmd.c:1344 parser/parse_utilcmd.c:1753 -#: parser/parse_utilcmd.c:1861 +#: commands/tablecmds.c:3019 #, c-format -msgid "cannot convert whole-row table reference" -msgstr "преобразовать ÑÑылку на тип вÑей Ñтроки таблицы нельзÑ" +msgid "To resolve the conflict, specify a generation expression explicitly." +msgstr "Ð”Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð° укажите генерирующее выражение Ñвно." -#: commands/tablecmds.c:2718 parser/parse_utilcmd.c:1302 +#: commands/tablecmds.c:3023 #, c-format -msgid "" -"Generation expression for column \"%s\" contains a whole-row reference to " -"table \"%s\"." -msgstr "" -"Генерирующее выражение Ñтолбца \"%s\" ÑÑылаетÑÑ Ð½Ð° тип вÑей Ñтроки в таблице " -"\"%s\"." +msgid "column \"%s\" inherits conflicting default values" +msgstr "Ñтолбец \"%s\" наÑледует конфликтующие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию" -#: commands/tablecmds.c:2773 parser/parse_utilcmd.c:1345 +#: commands/tablecmds.c:3025 #, c-format -msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." -msgstr "Ограничение \"%s\" ÑÑылаетÑÑ Ð½Ð° тип вÑей Ñтроки в таблице \"%s\"." +msgid "To resolve the conflict, specify a default explicitly." +msgstr "Ð”Ð»Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð° укажите желаемое значение по умолчанию." + +#: commands/tablecmds.c:3080 +#, c-format +msgid "" +"check constraint name \"%s\" appears multiple times but with different " +"expressions" +msgstr "" +"Ð¸Ð¼Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ-проверки \"%s\" фигурирует неÑколько раз, но Ñ Ñ€Ð°Ð·Ð½Ñ‹Ð¼Ð¸ " +"выражениÑми" -#: commands/tablecmds.c:2852 +#: commands/tablecmds.c:3131 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "ÑлиÑние Ñтолбца \"%s\" Ñ Ð½Ð°Ñледованным определением" -#: commands/tablecmds.c:2856 +#: commands/tablecmds.c:3135 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "перемещение и ÑлиÑние Ñтолбца \"%s\" Ñ Ð½Ð°Ñледуемым определением" -#: commands/tablecmds.c:2857 +#: commands/tablecmds.c:3136 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "" "Определённый пользователем Ñтолбец перемещён в позицию наÑледуемого Ñтолбца." -#: commands/tablecmds.c:2864 +#: commands/tablecmds.c:3148 #, c-format msgid "column \"%s\" has a type conflict" msgstr "конфликт типов в Ñтолбце \"%s\"" -#: commands/tablecmds.c:2876 +#: commands/tablecmds.c:3150 commands/tablecmds.c:3184 +#: commands/tablecmds.c:3200 commands/tablecmds.c:3307 +#: commands/tablecmds.c:3340 commands/tablecmds.c:3356 +#: parser/parse_coerce.c:2192 parser/parse_coerce.c:2212 +#: parser/parse_coerce.c:2232 parser/parse_coerce.c:2253 +#: parser/parse_coerce.c:2308 parser/parse_coerce.c:2342 +#: parser/parse_coerce.c:2418 parser/parse_coerce.c:2449 +#: parser/parse_coerce.c:2488 parser/parse_coerce.c:2555 +#: parser/parse_param.c:223 #, c-format -msgid "column \"%s\" has a collation conflict" -msgstr "конфликт правил Ñортировки в Ñтолбце \"%s\"" +msgid "%s versus %s" +msgstr "%s и %s" -#: commands/tablecmds.c:2894 +#: commands/tablecmds.c:3162 #, c-format -msgid "column \"%s\" has a storage parameter conflict" -msgstr "конфликт параметров Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð² Ñтолбце \"%s\"" +msgid "column \"%s\" has a collation conflict" +msgstr "конфликт правил Ñортировки в Ñтолбце \"%s\"" -#: commands/tablecmds.c:2935 +#: commands/tablecmds.c:3164 commands/tablecmds.c:3326 +#: commands/tablecmds.c:7080 #, c-format -msgid "child column \"%s\" specifies generation expression" -msgstr "Ð´Ð»Ñ Ð´Ð¾Ñ‡ÐµÑ€Ð½ÐµÐ³Ð¾ Ñтолбца \"%s\" указано генерирующее выражение" +msgid "\"%s\" versus \"%s\"" +msgstr "\"%s\" и \"%s\"" -#: commands/tablecmds.c:2937 +#: commands/tablecmds.c:3182 #, c-format -msgid "" -"Omit the generation expression in the definition of the child table column " -"to inherit the generation expression from the parent table." -msgstr "" -"Уберите генерирующее выражение из Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñтолбца в дочерней таблице, " -"чтобы Ñто выражение наÑледовалоÑÑŒ из родительÑкой." +msgid "column \"%s\" has a storage parameter conflict" +msgstr "конфликт параметров Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð² Ñтолбце \"%s\"" -#: commands/tablecmds.c:2941 +#: commands/tablecmds.c:3198 commands/tablecmds.c:3354 #, c-format -msgid "column \"%s\" inherits from generated column but specifies default" -msgstr "" -"Ñтолбец \"%s\" наÑледуетÑÑ Ð¾Ñ‚ генерируемого Ñтолбца, но Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ задано " -"значение по умолчанию" +msgid "column \"%s\" has a compression method conflict" +msgstr "в Ñтолбце \"%s\" возник конфликт методов ÑжатиÑ" -#: commands/tablecmds.c:2946 +#: commands/tablecmds.c:3293 #, c-format -msgid "column \"%s\" inherits from generated column but specifies identity" -msgstr "" -"Ñтолбец \"%s\" наÑледуетÑÑ Ð¾Ñ‚ генерируемого Ñтолбца, но Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ задано " -"ÑвойÑтво идентификации" +msgid "merging multiple inherited definitions of column \"%s\"" +msgstr "ÑлиÑние неÑкольких наÑледованных определений Ñтолбца \"%s\"" -#: commands/tablecmds.c:3055 +#: commands/tablecmds.c:3305 #, c-format -msgid "column \"%s\" inherits conflicting generation expressions" -msgstr "Ñтолбец \"%s\" наÑледует конфликтующие генерирующие выражениÑ" +msgid "inherited column \"%s\" has a type conflict" +msgstr "конфликт типов в наÑледованном Ñтолбце \"%s\"" -#: commands/tablecmds.c:3060 +#: commands/tablecmds.c:3324 #, c-format -msgid "column \"%s\" inherits conflicting default values" -msgstr "Ñтолбец \"%s\" наÑледует конфликтующие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию" +msgid "inherited column \"%s\" has a collation conflict" +msgstr "конфликт правил Ñортировки в наÑледованном Ñтолбце \"%s\"" -#: commands/tablecmds.c:3062 +#: commands/tablecmds.c:3338 #, c-format -msgid "To resolve the conflict, specify a default explicitly." -msgstr "Ð”Ð»Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð° укажите желаемое значение по умолчанию." +msgid "inherited column \"%s\" has a storage parameter conflict" +msgstr "конфликт параметров Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð² наÑледованном Ñтолбце \"%s\"" -#: commands/tablecmds.c:3108 +#: commands/tablecmds.c:3366 #, c-format -msgid "" -"check constraint name \"%s\" appears multiple times but with different " -"expressions" -msgstr "" -"Ð¸Ð¼Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ-проверки \"%s\" фигурирует неÑколько раз, но Ñ Ñ€Ð°Ð·Ð½Ñ‹Ð¼Ð¸ " -"выражениÑми" +msgid "inherited column \"%s\" has a generation conflict" +msgstr "конфликт ÑвойÑтва Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² наÑледованном Ñтолбце \"%s\"" -#: commands/tablecmds.c:3321 +#: commands/tablecmds.c:3597 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "перемещать временные таблицы других ÑеанÑов нельзÑ" -#: commands/tablecmds.c:3391 +#: commands/tablecmds.c:3670 #, c-format msgid "cannot rename column of typed table" msgstr "переименовать Ñтолбец типизированной таблицы нельзÑ" -#: commands/tablecmds.c:3410 +#: commands/tablecmds.c:3689 #, c-format msgid "cannot rename columns of relation \"%s\"" msgstr "переименовывать Ñтолбцы Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: commands/tablecmds.c:3505 +#: commands/tablecmds.c:3784 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "" "наÑледованный Ñтолбец \"%s\" должен быть также переименован в дочерних " "таблицах" -#: commands/tablecmds.c:3537 +#: commands/tablecmds.c:3816 #, c-format msgid "cannot rename system column \"%s\"" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ñ‚ÑŒ ÑиÑтемный Ñтолбец \"%s\"" -#: commands/tablecmds.c:3552 +#: commands/tablecmds.c:3831 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ñ‚ÑŒ наÑледованный Ñтолбец \"%s\"" -#: commands/tablecmds.c:3704 +#: commands/tablecmds.c:3983 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "" "наÑледуемое ограничение \"%s\" должно быть также переименовано в дочерних " "таблицах" -#: commands/tablecmds.c:3711 +#: commands/tablecmds.c:3990 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ñ‚ÑŒ наÑледованное ограничение \"%s\"" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4008 +#: commands/tablecmds.c:4290 #, c-format msgid "" "cannot %s \"%s\" because it is being used by active queries in this session" @@ -11360,59 +12146,59 @@ msgstr "" "запроÑами в данном ÑеанÑе" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4017 +#: commands/tablecmds.c:4299 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ %s \"%s\", так как Ñ Ñтим объектом ÑвÑзаны отложенные " "ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð¾Ð²" -#: commands/tablecmds.c:4486 +#: commands/tablecmds.c:4325 +#, c-format +msgid "cannot alter temporary tables of other sessions" +msgstr "модифицировать временные таблицы других ÑеанÑов нельзÑ" + +#: commands/tablecmds.c:4798 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ Ñекцию \"%s\", ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ полноÑтью отÑоединена" -#: commands/tablecmds.c:4679 commands/tablecmds.c:4694 +#: commands/tablecmds.c:5002 commands/tablecmds.c:5017 #, c-format msgid "cannot change persistence setting twice" msgstr "изменить характериÑтику Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð²Ð°Ð¶Ð´Ñ‹ нельзÑ" -#: commands/tablecmds.c:4715 -#, c-format -msgid "cannot change access method of a partitioned table" -msgstr "менÑть метод доÑтупа Ð´Ð»Ñ Ñекционированной таблицы нельзÑ" - -#: commands/tablecmds.c:4721 +#: commands/tablecmds.c:5038 #, c-format msgid "cannot have multiple SET ACCESS METHOD subcommands" msgstr "множеÑтвенные подкоманды SET ACCESS METHOD не допуÑкаютÑÑ" -#: commands/tablecmds.c:5476 +#: commands/tablecmds.c:5768 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "перезапиÑать ÑиÑтемное отношение \"%s\" нельзÑ" -#: commands/tablecmds.c:5482 +#: commands/tablecmds.c:5774 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "перезапиÑать таблицу \"%s\", иÑпользуемую как таблицу каталога, нельзÑ" -#: commands/tablecmds.c:5492 +#: commands/tablecmds.c:5786 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "перезапиÑывать временные таблицы других ÑеанÑов нельзÑ" -#: commands/tablecmds.c:5986 +#: commands/tablecmds.c:6281 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" Ñодержит Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ NULL" -#: commands/tablecmds.c:6003 +#: commands/tablecmds.c:6298 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "ограничение-проверку \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нарушает Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñтрока" -#: commands/tablecmds.c:6022 partitioning/partbounds.c:3404 +#: commands/tablecmds.c:6317 partitioning/partbounds.c:3387 #, c-format msgid "" "updated partition constraint for default partition \"%s\" would be violated " @@ -11421,24 +12207,24 @@ msgstr "" "изменённое ограничение Ñекции Ð´Ð»Ñ Ñекции по умолчанию \"%s\" будет нарушено " "некоторыми Ñтроками" -#: commands/tablecmds.c:6028 +#: commands/tablecmds.c:6323 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "ограничение Ñекции Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нарушает Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñтрока" #. translator: %s is a group of some SQL keywords -#: commands/tablecmds.c:6295 +#: commands/tablecmds.c:6588 #, c-format msgid "ALTER action %s cannot be performed on relation \"%s\"" msgstr "дейÑтвие ALTER %s Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸ÐµÐ¼ \"%s\"" -#: commands/tablecmds.c:6510 commands/tablecmds.c:6517 +#: commands/tablecmds.c:6843 commands/tablecmds.c:6850 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "" "изменить тип \"%s\" нельзÑ, так как он задейÑтвован в Ñтолбце \"%s.%s\"" -#: commands/tablecmds.c:6524 +#: commands/tablecmds.c:6857 #, c-format msgid "" "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" @@ -11446,77 +12232,77 @@ msgstr "" "изменить Ñтороннюю таблицу \"%s\" нельзÑ, так как Ñтолбец \"%s.%s\" " "задейÑтвует тип её Ñтроки" -#: commands/tablecmds.c:6531 +#: commands/tablecmds.c:6864 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "" "изменить таблицу \"%s\" нельзÑ, так как Ñтолбец \"%s.%s\" задейÑтвует тип её " "Ñтроки" -#: commands/tablecmds.c:6587 +#: commands/tablecmds.c:6920 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "изменить тип \"%s\", так как Ñто тип типизированной таблицы" -#: commands/tablecmds.c:6589 +#: commands/tablecmds.c:6922 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "" "Чтобы изменить также типизированные таблицы, выполните ALTER ... CASCADE." -#: commands/tablecmds.c:6635 +#: commands/tablecmds.c:6968 #, c-format msgid "type %s is not a composite type" msgstr "тип %s не ÑвлÑетÑÑ ÑоÑтавным" -#: commands/tablecmds.c:6662 +#: commands/tablecmds.c:6995 #, c-format msgid "cannot add column to typed table" msgstr "добавить Ñтолбец в типизированную таблицу нельзÑ" -#: commands/tablecmds.c:6715 +#: commands/tablecmds.c:7043 #, c-format msgid "cannot add column to a partition" msgstr "добавить Ñтолбец в Ñекцию нельзÑ" -#: commands/tablecmds.c:6744 commands/tablecmds.c:15092 +#: commands/tablecmds.c:7072 commands/tablecmds.c:15901 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "дочернÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s\" имеет другой тип Ð´Ð»Ñ Ñтолбца \"%s\"" -#: commands/tablecmds.c:6750 commands/tablecmds.c:15099 +#: commands/tablecmds.c:7078 commands/tablecmds.c:15907 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "" "дочернÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s\" имеет другое правило Ñортировки Ð´Ð»Ñ Ñтолбца \"%s\"" -#: commands/tablecmds.c:6764 +#: commands/tablecmds.c:7096 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "объединение определений Ñтолбца \"%s\" Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ° \"%s\"" -#: commands/tablecmds.c:6807 +#: commands/tablecmds.c:7149 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "" "добавить Ñтолбец идентификации в таблицу, у которой еÑть дочерние, нельзÑ" -#: commands/tablecmds.c:7051 +#: commands/tablecmds.c:7395 #, c-format msgid "column must be added to child tables too" msgstr "Ñтолбец также должен быть добавлен к дочерним таблицам" -#: commands/tablecmds.c:7129 +#: commands/tablecmds.c:7473 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" уже ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/tablecmds.c:7136 +#: commands/tablecmds.c:7480 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" уже ÑущеÑтвует" -#: commands/tablecmds.c:7202 commands/tablecmds.c:12021 +#: commands/tablecmds.c:7546 commands/tablecmds.c:12693 #, c-format msgid "" "cannot remove constraint from only the partitioned table when partitions " @@ -11525,70 +12311,73 @@ msgstr "" "удалить ограничение только из Ñекционированной таблицы, когда ÑущеÑтвуют " "Ñекции, нельзÑ" -#: commands/tablecmds.c:7203 commands/tablecmds.c:7520 -#: commands/tablecmds.c:8517 commands/tablecmds.c:12022 +#: commands/tablecmds.c:7547 commands/tablecmds.c:7861 +#: commands/tablecmds.c:8039 commands/tablecmds.c:8146 +#: commands/tablecmds.c:8263 commands/tablecmds.c:9082 +#: commands/tablecmds.c:12694 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Ðе указывайте ключевое Ñлово ONLY." -#: commands/tablecmds.c:7240 commands/tablecmds.c:7446 -#: commands/tablecmds.c:7588 commands/tablecmds.c:7702 -#: commands/tablecmds.c:7796 commands/tablecmds.c:7855 -#: commands/tablecmds.c:7974 commands/tablecmds.c:8113 -#: commands/tablecmds.c:8183 commands/tablecmds.c:8339 -#: commands/tablecmds.c:12176 commands/tablecmds.c:13681 -#: commands/tablecmds.c:16249 +#: commands/tablecmds.c:7583 commands/tablecmds.c:7787 +#: commands/tablecmds.c:7929 commands/tablecmds.c:8061 +#: commands/tablecmds.c:8190 commands/tablecmds.c:8284 +#: commands/tablecmds.c:8385 commands/tablecmds.c:8542 +#: commands/tablecmds.c:8695 commands/tablecmds.c:8776 +#: commands/tablecmds.c:8910 commands/tablecmds.c:12847 +#: commands/tablecmds.c:14389 commands/tablecmds.c:17016 #, c-format msgid "cannot alter system column \"%s\"" msgstr "ÑиÑтемный Ñтолбец \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ" -#: commands/tablecmds.c:7246 commands/tablecmds.c:7594 +#: commands/tablecmds.c:7589 commands/tablecmds.c:7935 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" ÑвлÑетÑÑ Ñтолбцом идентификации" -#: commands/tablecmds.c:7289 +#: commands/tablecmds.c:7630 #, c-format msgid "column \"%s\" is in a primary key" msgstr "Ñтолбец \"%s\" входит в первичный ключ" -#: commands/tablecmds.c:7294 +#: commands/tablecmds.c:7635 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "Ñтолбец \"%s\" входит в индекÑ, иÑпользуемый Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ реплики" -#: commands/tablecmds.c:7317 +#: commands/tablecmds.c:7658 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "Ñтолбец \"%s\" в родительÑкой таблице помечен как NOT NULL" -#: commands/tablecmds.c:7517 commands/tablecmds.c:9000 +#: commands/tablecmds.c:7858 commands/tablecmds.c:9566 #, c-format msgid "constraint must be added to child tables too" msgstr "ограничение также должно быть добавлено к дочерним таблицам" -#: commands/tablecmds.c:7518 +#: commands/tablecmds.c:7859 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "Столбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" уже имеет ÑвойÑтво NOT NULL." -#: commands/tablecmds.c:7596 -#, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." -msgstr "ВмеÑто Ñтого выполните ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." - -#: commands/tablecmds.c:7601 +#: commands/tablecmds.c:7944 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" ÑвлÑетÑÑ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ð¼" -#: commands/tablecmds.c:7604 +#: commands/tablecmds.c:8038 #, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." +msgid "cannot add identity to a column of only the partitioned table" msgstr "" -"ВмеÑто Ñтого выполните ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION." +"Ñделать Ñтолбцом идентификации Ñтолбец одной лишь Ñекционированной таблицы " +"нельзÑ" + +#: commands/tablecmds.c:8044 +#, c-format +msgid "cannot add identity to a column of a partition" +msgstr "Ñделать Ñтолбцом идентификации Ñтолбец одной Ñекции нельзÑ" -#: commands/tablecmds.c:7713 +#: commands/tablecmds.c:8072 #, c-format msgid "" "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity " @@ -11597,46 +12386,74 @@ msgstr "" "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" должен быть объÑвлен как NOT NULL, чтобы его " "можно было Ñделать Ñтолбцом идентификации" -#: commands/tablecmds.c:7719 +#: commands/tablecmds.c:8078 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" уже ÑвлÑетÑÑ Ñтолбцом идентификации" -#: commands/tablecmds.c:7725 +#: commands/tablecmds.c:8084 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" уже имеет значение по умолчанию" -#: commands/tablecmds.c:7802 commands/tablecmds.c:7863 +#: commands/tablecmds.c:8145 +#, c-format +msgid "cannot change identity column of only the partitioned table" +msgstr "" +"изменить Ñтолбец идентификации Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ лишь Ñекционированной таблицы нельзÑ" + +#: commands/tablecmds.c:8151 +#, c-format +msgid "cannot change identity column of a partition" +msgstr "изменить Ñтолбец идентификации Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ Ñекции нельзÑ" + +#: commands/tablecmds.c:8196 commands/tablecmds.c:8292 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" не ÑвлÑетÑÑ Ñтолбцом идентификации" -#: commands/tablecmds.c:7868 +#: commands/tablecmds.c:8262 +#, c-format +msgid "cannot drop identity from a column of only the partitioned table" +msgstr "" +"лишить ÑвойÑтва идентификации Ñтолбец одной лишь Ñекционированной таблицы " +"нельзÑ" + +#: commands/tablecmds.c:8268 +#, c-format +msgid "cannot drop identity from a column of a partition" +msgstr "лишить ÑвойÑтва идентификации Ñтолбец одной Ñекции нельзÑ" + +#: commands/tablecmds.c:8297 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "" "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" не ÑвлÑетÑÑ Ñтолбцом идентификации, " "пропуÑкаетÑÑ" -#: commands/tablecmds.c:7921 +#: commands/tablecmds.c:8391 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not a generated column" +msgstr "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" не ÑвлÑетÑÑ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ð¼ Ñтолбцом" + +#: commands/tablecmds.c:8489 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "" "ALTER TABLE / DROP EXPRESSION нужно применÑть также к дочерним таблицам" -#: commands/tablecmds.c:7943 +#: commands/tablecmds.c:8511 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ генерирующее выражение из наÑледуемого Ñтолбца" -#: commands/tablecmds.c:7982 +#: commands/tablecmds.c:8550 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "" "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" не ÑвлÑетÑÑ Ñохранённым генерируемым Ñтолбцом" -#: commands/tablecmds.c:7987 +#: commands/tablecmds.c:8555 #, c-format msgid "" "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" @@ -11644,63 +12461,53 @@ msgstr "" "Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" пропуÑкаетÑÑ, так как не ÑвлÑетÑÑ " "Ñохранённым генерируемым Ñтолбцом" -#: commands/tablecmds.c:8060 +#: commands/tablecmds.c:8633 #, c-format msgid "cannot refer to non-index column by number" msgstr "по номеру можно ÑÑылатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на Ñтолбец в индекÑе" -#: commands/tablecmds.c:8103 +#: commands/tablecmds.c:8685 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "Ñтолбец Ñ Ð½Ð¾Ð¼ÐµÑ€Ð¾Ð¼ %d Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" не ÑущеÑтвует" -#: commands/tablecmds.c:8122 +#: commands/tablecmds.c:8704 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "изменить ÑтатиÑтику включённого Ñтолбца \"%s\" индекÑа \"%s\" нельзÑ" -#: commands/tablecmds.c:8127 +#: commands/tablecmds.c:8709 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "" "изменить ÑтатиÑтику Ñтолбца \"%s\" (не выражениÑ) индекÑа \"%s\" нельзÑ" -#: commands/tablecmds.c:8129 +#: commands/tablecmds.c:8711 #, c-format msgid "Alter statistics on table column instead." msgstr "ВмеÑто Ñтого измените ÑтатиÑтику Ð´Ð»Ñ Ñтолбца в таблице." -#: commands/tablecmds.c:8319 -#, c-format -msgid "invalid storage type \"%s\"" -msgstr "неверный тип хранилища \"%s\"" - -#: commands/tablecmds.c:8351 -#, c-format -msgid "column data type %s can only have storage PLAIN" -msgstr "тип данных Ñтолбца %s ÑовмеÑтим только Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰ÐµÐ¼ PLAIN" - -#: commands/tablecmds.c:8396 +#: commands/tablecmds.c:8957 #, c-format msgid "cannot drop column from typed table" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ Ñтолбец в типизированной таблице" -#: commands/tablecmds.c:8455 +#: commands/tablecmds.c:9020 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "Ñтолбец \"%s\" в таблице\"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/tablecmds.c:8468 +#: commands/tablecmds.c:9033 #, c-format msgid "cannot drop system column \"%s\"" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ ÑиÑтемный Ñтолбец \"%s\"" -#: commands/tablecmds.c:8478 +#: commands/tablecmds.c:9043 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ наÑледованный Ñтолбец \"%s\"" -#: commands/tablecmds.c:8491 +#: commands/tablecmds.c:9056 #, c-format msgid "" "cannot drop column \"%s\" because it is part of the partition key of " @@ -11709,7 +12516,7 @@ msgstr "" "удалить Ñтолбец \"%s\" нельзÑ, так как он входит в ключ Ñ€Ð°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ " "\"%s\"" -#: commands/tablecmds.c:8516 +#: commands/tablecmds.c:9081 #, c-format msgid "" "cannot drop column from only the partitioned table when partitions exist" @@ -11717,7 +12524,7 @@ msgstr "" "удалить Ñтолбец только из Ñекционированной таблицы, когда ÑущеÑтвуют Ñекции, " "нельзÑ" -#: commands/tablecmds.c:8720 +#: commands/tablecmds.c:9286 #, c-format msgid "" "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned " @@ -11726,14 +12533,14 @@ msgstr "" "ALTER TABLE / ADD CONSTRAINT USING INDEX не поддерживаетÑÑ Ñ " "Ñекционированными таблицами" -#: commands/tablecmds.c:8745 +#: commands/tablecmds.c:9311 #, c-format msgid "" "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "" "ALTER TABLE / ADD CONSTRAINT USING INDEX переименует Ð¸Ð½Ð´ÐµÐºÑ \"%s\" в \"%s\"" -#: commands/tablecmds.c:9082 +#: commands/tablecmds.c:9648 #, c-format msgid "" "cannot use ONLY for foreign key on partitioned table \"%s\" referencing " @@ -11742,7 +12549,7 @@ msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать ONLY Ð´Ð»Ñ Ñтороннего ключа в Ñекционированной таблице " "\"%s\", ÑÑылающегоÑÑ Ð½Ð° отношение \"%s\"" -#: commands/tablecmds.c:9088 +#: commands/tablecmds.c:9654 #, c-format msgid "" "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing " @@ -11751,25 +12558,25 @@ msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ Ñ Ñ…Ð°Ñ€Ð°ÐºÑ‚ÐµÑ€Ð¸Ñтикой NOT VALID Ñторонний ключ в " "Ñекционированной таблице \"%s\", ÑÑылающийÑÑ Ð½Ð° отношение \"%s\"" -#: commands/tablecmds.c:9091 +#: commands/tablecmds.c:9657 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "" "Эта функциональноÑть Ñ Ñекционированными таблицами пока не поддерживаетÑÑ." -#: commands/tablecmds.c:9098 commands/tablecmds.c:9564 +#: commands/tablecmds.c:9664 commands/tablecmds.c:10146 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "указанный объект \"%s\" не ÑвлÑетÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÐµÐ¹" -#: commands/tablecmds.c:9121 +#: commands/tablecmds.c:9687 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "" "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð² поÑтоÑнных таблицах могут ÑÑылатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на поÑтоÑнные " "таблицы" -#: commands/tablecmds.c:9128 +#: commands/tablecmds.c:9694 #, c-format msgid "" "constraints on unlogged tables may reference only permanent or unlogged " @@ -11778,13 +12585,13 @@ msgstr "" "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð² нежурналируемых таблицах могут ÑÑылатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на поÑтоÑнные " "или нежурналируемые таблицы" -#: commands/tablecmds.c:9134 +#: commands/tablecmds.c:9700 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "" "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð¾ временных таблицах могут ÑÑылатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на временные таблицы" -#: commands/tablecmds.c:9138 +#: commands/tablecmds.c:9704 #, c-format msgid "" "constraints on temporary tables must involve temporary tables of this session" @@ -11792,7 +12599,7 @@ msgstr "" "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð¾ временных таблицах должны ÑÑылатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на временные " "таблицы текущего ÑеанÑа" -#: commands/tablecmds.c:9212 commands/tablecmds.c:9218 +#: commands/tablecmds.c:9769 commands/tablecmds.c:9775 #, c-format msgid "" "invalid %s action for foreign key constraint containing generated column" @@ -11800,22 +12607,22 @@ msgstr "" "некорректное дейÑтвие %s Ð´Ð»Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ ключа, Ñодержащего " "генерируемый Ñтолбец" -#: commands/tablecmds.c:9234 +#: commands/tablecmds.c:9791 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "чиÑло Ñтолбцов в иÑточнике и назначении внешнего ключа не Ñовпадает" -#: commands/tablecmds.c:9341 +#: commands/tablecmds.c:9898 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "ограничение внешнего ключа \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ñ‚ÑŒ" -#: commands/tablecmds.c:9343 +#: commands/tablecmds.c:9900 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Столбцы ключа \"%s\" и \"%s\" имеют неÑовмеÑтимые типы: %s и %s." -#: commands/tablecmds.c:9500 +#: commands/tablecmds.c:10075 #, c-format msgid "" "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" @@ -11823,40 +12630,49 @@ msgstr "" "Ñтолбец \"%s\", фигурирующий в дейÑтвии ON DELETE SET, должен входить во " "внешний ключ" -#: commands/tablecmds.c:9773 commands/tablecmds.c:10241 -#: parser/parse_utilcmd.c:795 parser/parse_utilcmd.c:924 +#: commands/tablecmds.c:10446 commands/tablecmds.c:10873 +#: parser/parse_utilcmd.c:822 parser/parse_utilcmd.c:945 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ ключа Ð´Ð»Ñ Ñторонних таблиц не поддерживаютÑÑ" -#: commands/tablecmds.c:10793 commands/tablecmds.c:11071 -#: commands/tablecmds.c:11978 commands/tablecmds.c:12053 +#: commands/tablecmds.c:10856 +#, c-format +msgid "" +"cannot attach table \"%s\" as a partition because it is referenced by " +"foreign key \"%s\"" +msgstr "" +"приÑоединить таблицу \"%s\" в качеÑтве Ñекции нельзÑ, так как на неё " +"ÑÑылаетÑÑ Ð²Ð½ÐµÑˆÐ½Ð¸Ð¹ ключ \"%s\"" + +#: commands/tablecmds.c:11457 commands/tablecmds.c:11738 +#: commands/tablecmds.c:12650 commands/tablecmds.c:12724 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "ограничение \"%s\" в таблице \"%s\" не ÑущеÑтвует" -#: commands/tablecmds.c:10800 +#: commands/tablecmds.c:11464 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "ограничение \"%s\" в таблице \"%s\" не ÑвлÑетÑÑ Ð²Ð½ÐµÑˆÐ½Ð¸Ð¼ ключом" -#: commands/tablecmds.c:10838 +#: commands/tablecmds.c:11502 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "изменить ограничение \"%s\" таблицы \"%s\" нельзÑ" -#: commands/tablecmds.c:10841 +#: commands/tablecmds.c:11505 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "" "Ограничение \"%s\" ÑвлÑетÑÑ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð½Ñ‹Ð¼ от Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ \"%s\" таблицы \"%s\"." -#: commands/tablecmds.c:10843 +#: commands/tablecmds.c:11507 #, c-format -msgid "You may alter the constraint it derives from, instead." +msgid "You may alter the constraint it derives from instead." msgstr "ВмеÑто Ñтого вы можете изменить родительÑкое ограничение." -#: commands/tablecmds.c:11079 +#: commands/tablecmds.c:11746 #, c-format msgid "" "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" @@ -11864,46 +12680,51 @@ msgstr "" "ограничение \"%s\" в таблице \"%s\" не ÑвлÑетÑÑ Ð²Ð½ÐµÑˆÐ½Ð¸Ð¼ ключом или " "ограничением-проверкой" -#: commands/tablecmds.c:11157 +#: commands/tablecmds.c:11823 #, c-format msgid "constraint must be validated on child tables too" msgstr "ограничение также должно ÑоблюдатьÑÑ Ð² дочерних таблицах" -#: commands/tablecmds.c:11241 +#: commands/tablecmds.c:11910 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "Ñтолбец \"%s\", указанный в ограничении внешнего ключа, не ÑущеÑтвует" -#: commands/tablecmds.c:11246 +#: commands/tablecmds.c:11916 +#, c-format +msgid "system columns cannot be used in foreign keys" +msgstr "ÑиÑтемные Ñтолбцы Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать во внешних ключах" + +#: commands/tablecmds.c:11920 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "во внешнем ключе не может быть больше %d Ñтолбцов" -#: commands/tablecmds.c:11312 +#: commands/tablecmds.c:11985 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "" "иÑпользовать откладываемый первичный ключ в целевой внешней таблице \"%s\" " "нельзÑ" -#: commands/tablecmds.c:11329 +#: commands/tablecmds.c:12002 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "в целевой внешней таблице \"%s\" нет первичного ключа" -#: commands/tablecmds.c:11394 +#: commands/tablecmds.c:12070 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "в ÑпиÑке Ñтолбцов внешнего ключа не должно быть повторений" -#: commands/tablecmds.c:11488 +#: commands/tablecmds.c:12162 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "" "иÑпользовать откладываемое ограничение уникальноÑти в целевой внешней " "таблице \"%s\" нельзÑ" -#: commands/tablecmds.c:11493 +#: commands/tablecmds.c:12167 #, c-format msgid "" "there is no unique constraint matching given keys for referenced table \"%s\"" @@ -11911,27 +12732,39 @@ msgstr "" "в целевой внешней таблице \"%s\" нет Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ð¾Ñти, " "ÑоответÑтвующего данным ключам" -#: commands/tablecmds.c:11934 +#: commands/tablecmds.c:12606 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "удалить наÑледованное ограничение \"%s\" таблицы \"%s\" нельзÑ" -#: commands/tablecmds.c:11984 +#: commands/tablecmds.c:12656 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "ограничение \"%s\" в таблице \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/tablecmds.c:12160 +#: commands/tablecmds.c:12831 #, c-format msgid "cannot alter column type of typed table" msgstr "изменить тип Ñтолбца в типизированной таблице нельзÑ" -#: commands/tablecmds.c:12187 +#: commands/tablecmds.c:12857 +#, c-format +msgid "cannot specify USING when altering type of generated column" +msgstr "изменÑÑ Ñ‚Ð¸Ð¿ генерируемого Ñтолбца, Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ USING" + +#: commands/tablecmds.c:12858 commands/tablecmds.c:18069 +#: commands/tablecmds.c:18159 commands/trigger.c:656 +#: rewrite/rewriteHandler.c:941 rewrite/rewriteHandler.c:976 +#, c-format +msgid "Column \"%s\" is a generated column." +msgstr "Столбец \"%s\" ÑвлÑетÑÑ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ð¼." + +#: commands/tablecmds.c:12868 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "изменить наÑледованный Ñтолбец \"%s\" нельзÑ" -#: commands/tablecmds.c:12196 +#: commands/tablecmds.c:12877 #, c-format msgid "" "cannot alter column \"%s\" because it is part of the partition key of " @@ -11940,7 +12773,7 @@ msgstr "" "изменить Ñтолбец \"%s\" нельзÑ, так как он входит в ключ Ñ€Ð°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ " "\"%s\"" -#: commands/tablecmds.c:12246 +#: commands/tablecmds.c:12927 #, c-format msgid "" "result of USING clause for column \"%s\" cannot be cast automatically to " @@ -11948,45 +12781,45 @@ msgid "" msgstr "" "результат USING Ð´Ð»Ñ Ñтолбца \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки привеÑти к типу %s" -#: commands/tablecmds.c:12249 +#: commands/tablecmds.c:12930 #, c-format msgid "You might need to add an explicit cast." msgstr "Возможно, необходимо добавить Ñвное приведение." -#: commands/tablecmds.c:12253 +#: commands/tablecmds.c:12934 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "Ñтолбец \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки привеÑти к типу %s" # skip-rule: double-colons #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:12256 +#: commands/tablecmds.c:12938 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Возможно, необходимо указать \"USING %s::%s\"." -#: commands/tablecmds.c:12355 +#: commands/tablecmds.c:13037 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "изменить наÑледованный Ñтолбец \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: commands/tablecmds.c:12383 +#: commands/tablecmds.c:13066 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "Выражение USING ÑÑылаетÑÑ Ð½Ð° тип вÑей Ñтроки таблицы." -#: commands/tablecmds.c:12394 +#: commands/tablecmds.c:13077 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "" "тип наÑледованного Ñтолбца \"%s\" должен быть изменён и в дочерних таблицах" -#: commands/tablecmds.c:12519 +#: commands/tablecmds.c:13202 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ тип Ñтолбца \"%s\" дважды" -#: commands/tablecmds.c:12557 +#: commands/tablecmds.c:13240 #, c-format msgid "" "generation expression for column \"%s\" cannot be cast automatically to type " @@ -11995,153 +12828,160 @@ msgstr "" "генерирующее выражение Ð´Ð»Ñ Ñтолбца \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки привеÑти к " "типу %s" -#: commands/tablecmds.c:12562 +#: commands/tablecmds.c:13245 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "" "значение по умолчанию Ð´Ð»Ñ Ñтолбца \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки привеÑти к " "типу %s" -#: commands/tablecmds.c:12643 +#: commands/tablecmds.c:13549 #, c-format -msgid "cannot alter type of a column used by a view or rule" -msgstr "" -"изменить тип Ñтолбца, задейÑтвованного в предÑтавлении или правиле, нельзÑ" +msgid "cannot alter type of a column used by a function or procedure" +msgstr "изменить тип Ñтолбца, задейÑтвованного в функции или процедуре, нельзÑ" -#: commands/tablecmds.c:12644 commands/tablecmds.c:12663 -#: commands/tablecmds.c:12681 +#: commands/tablecmds.c:13550 commands/tablecmds.c:13565 +#: commands/tablecmds.c:13585 commands/tablecmds.c:13604 +#: commands/tablecmds.c:13663 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s завиÑит от Ñтолбца \"%s\"" -#: commands/tablecmds.c:12662 +#: commands/tablecmds.c:13564 +#, c-format +msgid "cannot alter type of a column used by a view or rule" +msgstr "" +"изменить тип Ñтолбца, задейÑтвованного в предÑтавлении или правиле, нельзÑ" + +#: commands/tablecmds.c:13584 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "изменить тип Ñтолбца, задейÑтвованного в определении триггера, нельзÑ" -#: commands/tablecmds.c:12680 +#: commands/tablecmds.c:13603 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "изменить тип Ñтолбца, задейÑтвованного в определении политики, нельзÑ" -#: commands/tablecmds.c:12711 +#: commands/tablecmds.c:13634 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "изменить тип Ñтолбца, задейÑтвованного в генерируемом Ñтолбце, нельзÑ" -#: commands/tablecmds.c:12712 +#: commands/tablecmds.c:13635 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Столбец \"%s\" иÑпользуетÑÑ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ð¼ Ñтолбцом \"%s\"." -#: commands/tablecmds.c:13789 commands/tablecmds.c:13801 +#: commands/tablecmds.c:13662 +#, c-format +msgid "cannot alter type of a column used by a publication WHERE clause" +msgstr "" +"изменить тип Ñтолбца, задейÑтвованного в заданном Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ предложении " +"WHERE, нельзÑ" + +#: commands/tablecmds.c:14497 commands/tablecmds.c:14509 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "Ñменить владельца индекÑа \"%s\" нельзÑ" -#: commands/tablecmds.c:13791 commands/tablecmds.c:13803 +#: commands/tablecmds.c:14499 commands/tablecmds.c:14511 #, c-format -msgid "Change the ownership of the index's table, instead." +msgid "Change the ownership of the index's table instead." msgstr "Однако возможно Ñменить владельца таблицы, Ñодержащей Ñтот индекÑ." -#: commands/tablecmds.c:13817 +#: commands/tablecmds.c:14525 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "Ñменить владельца поÑледовательноÑти \"%s\" нельзÑ" -#: commands/tablecmds.c:13831 commands/tablecmds.c:17141 -#: commands/tablecmds.c:17160 -#, c-format -msgid "Use ALTER TYPE instead." -msgstr "ИÑпользуйте ALTER TYPE." - -#: commands/tablecmds.c:13840 +#: commands/tablecmds.c:14550 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "Ñменить владельца Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: commands/tablecmds.c:14202 +#: commands/tablecmds.c:15017 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "в одной инÑтрукции не может быть неÑколько подкоманд SET TABLESPACE" -#: commands/tablecmds.c:14279 +#: commands/tablecmds.c:15094 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "задать параметры Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: commands/tablecmds.c:14313 commands/view.c:521 +#: commands/tablecmds.c:15128 commands/view.c:440 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "" "WITH CHECK OPTION поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ð±Ð½Ð¾Ð²Ð»Ñемыми предÑтавлениÑми" -#: commands/tablecmds.c:14563 +#: commands/tablecmds.c:15379 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "" "в табличных проÑтранÑтвах еÑть только таблицы, индекÑÑ‹ и материализованные " "предÑтавлениÑ" -#: commands/tablecmds.c:14575 +#: commands/tablecmds.c:15391 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "перемещать объекты в/из табличного проÑтранÑтва pg_global нельзÑ" -#: commands/tablecmds.c:14667 +#: commands/tablecmds.c:15483 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "" "обработка прерываетÑÑ Ð¸Ð·-за невозможноÑти заблокировать отношение \"%s.%s\"" -#: commands/tablecmds.c:14683 +#: commands/tablecmds.c:15499 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "в табличном проÑтранÑтве \"%s\" не найдены подходÑщие отношениÑ" -#: commands/tablecmds.c:14800 +#: commands/tablecmds.c:15621 #, c-format msgid "cannot change inheritance of typed table" msgstr "изменить наÑледование типизированной таблицы нельзÑ" -#: commands/tablecmds.c:14805 commands/tablecmds.c:15361 +#: commands/tablecmds.c:15626 commands/tablecmds.c:16126 #, c-format msgid "cannot change inheritance of a partition" msgstr "изменить наÑледование Ñекции нельзÑ" -#: commands/tablecmds.c:14810 +#: commands/tablecmds.c:15631 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "изменить наÑледование Ñекционированной таблицы нельзÑ" -#: commands/tablecmds.c:14856 +#: commands/tablecmds.c:15677 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "наÑледование Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð³Ð¾ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³Ð¾ ÑеанÑа невозможно" -#: commands/tablecmds.c:14869 +#: commands/tablecmds.c:15690 #, c-format msgid "cannot inherit from a partition" msgstr "наÑледование от Ñекции невозможно" -#: commands/tablecmds.c:14891 commands/tablecmds.c:17794 +#: commands/tablecmds.c:15712 commands/tablecmds.c:18570 #, c-format msgid "circular inheritance not allowed" msgstr "цикличеÑкое наÑледование недопуÑтимо" -#: commands/tablecmds.c:14892 commands/tablecmds.c:17795 +#: commands/tablecmds.c:15713 commands/tablecmds.c:18571 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" уже ÑвлÑетÑÑ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ¾Ð¼ \"%s\"." -#: commands/tablecmds.c:14905 +#: commands/tablecmds.c:15726 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "" "триггер \"%s\" не позволÑет таблице \"%s\" Ñтать потомком в иерархии " "наÑледованиÑ" -#: commands/tablecmds.c:14907 +#: commands/tablecmds.c:15728 #, c-format msgid "" "ROW triggers with transition tables are not supported in inheritance " @@ -12150,36 +12990,34 @@ msgstr "" "Триггеры ROW Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð½Ñ‹Ð¼Ð¸ таблицами не поддерживаютÑÑ Ð² иерархиÑÑ… " "наÑледованиÑ." -#: commands/tablecmds.c:15110 +#: commands/tablecmds.c:15917 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "Ñтолбец \"%s\" в дочерней таблице должен быть помечен как NOT NULL" -#: commands/tablecmds.c:15119 +#: commands/tablecmds.c:15926 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "Ñтолбец \"%s\" в дочерней таблице должен быть генерируемым" -#: commands/tablecmds.c:15169 +#: commands/tablecmds.c:15930 #, c-format -msgid "column \"%s\" in child table has a conflicting generation expression" -msgstr "" -"Ñтолбец \"%s\" в дочерней таблице Ñодержит конфликтующее генерирующее " -"выражение" +msgid "column \"%s\" in child table must not be a generated column" +msgstr "Ñтолбец \"%s\" в дочерней таблице должен быть не генерируемым" -#: commands/tablecmds.c:15197 +#: commands/tablecmds.c:15968 #, c-format msgid "child table is missing column \"%s\"" msgstr "в дочерней таблице не хватает Ñтолбца \"%s\"" -#: commands/tablecmds.c:15285 +#: commands/tablecmds.c:16049 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "" "дочернÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s\" Ñодержит другое определение ограничениÑ-проверки " "\"%s\"" -#: commands/tablecmds.c:15293 +#: commands/tablecmds.c:16056 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on child table " @@ -12188,7 +13026,7 @@ msgstr "" "ограничение \"%s\" конфликтует Ñ Ð½ÐµÐ½Ð°Ñледуемым ограничением дочерней таблицы " "\"%s\"" -#: commands/tablecmds.c:15304 +#: commands/tablecmds.c:16066 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" @@ -12196,82 +13034,82 @@ msgstr "" "ограничение \"%s\" конфликтует Ñ Ð½ÐµÐ¿Ñ€Ð¾Ð²ÐµÑ€ÐµÐ½Ð½Ñ‹Ð¼ (NOT VALID) ограничением " "дочерней таблицы \"%s\"" -#: commands/tablecmds.c:15339 +#: commands/tablecmds.c:16104 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "в дочерней таблице не хватает Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ \"%s\"" -#: commands/tablecmds.c:15425 +#: commands/tablecmds.c:16190 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "" "ÑÐµÐºÑ†Ð¸Ñ \"%s\" уже ожидает отÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ñекционированной таблицы \"%s.%s\"" -#: commands/tablecmds.c:15454 commands/tablecmds.c:15502 +#: commands/tablecmds.c:16219 commands/tablecmds.c:16265 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "отношение \"%s\" не ÑвлÑетÑÑ Ñекцией Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\"" -#: commands/tablecmds.c:15508 +#: commands/tablecmds.c:16271 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "отношение \"%s\" не ÑвлÑетÑÑ Ð¿Ñ€ÐµÐ´ÐºÐ¾Ð¼ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\"" -#: commands/tablecmds.c:15736 +#: commands/tablecmds.c:16498 #, c-format msgid "typed tables cannot inherit" msgstr "типизированные таблицы не могут наÑледоватьÑÑ" -#: commands/tablecmds.c:15766 +#: commands/tablecmds.c:16528 #, c-format msgid "table is missing column \"%s\"" msgstr "в таблице не хватает Ñтолбца \"%s\"" -#: commands/tablecmds.c:15777 +#: commands/tablecmds.c:16539 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "таблица Ñодержит Ñтолбец \"%s\", тогда как тип требует \"%s\"" -#: commands/tablecmds.c:15786 +#: commands/tablecmds.c:16548 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "таблица \"%s\" Ñодержит Ñтолбец \"%s\" другого типа" -#: commands/tablecmds.c:15800 +#: commands/tablecmds.c:16562 #, c-format msgid "table has extra column \"%s\"" msgstr "таблица Ñодержит лишний Ñтолбец \"%s\"" -#: commands/tablecmds.c:15852 +#: commands/tablecmds.c:16614 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" - Ñто не Ñ‚Ð¸Ð¿Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð°" -#: commands/tablecmds.c:16026 +#: commands/tablecmds.c:16788 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "" "Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ реплики Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать неуникальный Ð¸Ð½Ð´ÐµÐºÑ \"%s\"" -#: commands/tablecmds.c:16032 +#: commands/tablecmds.c:16794 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "" "Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ реплики Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать не непоÑредÑтвенный Ð¸Ð½Ð´ÐµÐºÑ " "\"%s\"" -#: commands/tablecmds.c:16038 +#: commands/tablecmds.c:16800 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "" "Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ реплики Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ð¸Ð½Ð´ÐµÐºÑ Ñ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÐ¼ \"%s\"" -#: commands/tablecmds.c:16044 +#: commands/tablecmds.c:16806 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ реплики Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать чаÑтичный Ð¸Ð½Ð´ÐµÐºÑ \"%s\"" -#: commands/tablecmds.c:16061 +#: commands/tablecmds.c:16823 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column %d is a " @@ -12280,7 +13118,7 @@ msgstr "" "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ реплики, так как Ñтолбец " "%d - ÑиÑтемный" -#: commands/tablecmds.c:16068 +#: commands/tablecmds.c:16830 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column \"%s\" is " @@ -12289,13 +13127,13 @@ msgstr "" "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ реплики, так как Ñтолбец " "\"%s\" допуÑкает NULL" -#: commands/tablecmds.c:16315 +#: commands/tablecmds.c:17082 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "" "изменить ÑоÑтоÑние Ð¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ %s нельзÑ, так как она временнаÑ" -#: commands/tablecmds.c:16339 +#: commands/tablecmds.c:17106 #, c-format msgid "" "cannot change table \"%s\" to unlogged because it is part of a publication" @@ -12303,12 +13141,12 @@ msgstr "" "таблицу \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ñделать нежурналируемой, так как она включена в " "публикацию" -#: commands/tablecmds.c:16341 +#: commands/tablecmds.c:17108 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Ðежурналируемые Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð½Ðµ поддерживают репликацию." -#: commands/tablecmds.c:16386 +#: commands/tablecmds.c:17153 #, c-format msgid "" "could not change table \"%s\" to logged because it references unlogged table " @@ -12317,7 +13155,7 @@ msgstr "" "не удалоÑÑŒ Ñделать таблицу \"%s\" журналируемой, так как она ÑÑылаетÑÑ Ð½Ð° " "нежурналируемую таблицу \"%s\"" -#: commands/tablecmds.c:16396 +#: commands/tablecmds.c:17163 #, c-format msgid "" "could not change table \"%s\" to unlogged because it references logged table " @@ -12326,102 +13164,91 @@ msgstr "" "не удалоÑÑŒ Ñделать таблицу \"%s\" нежурналируемой, так как она ÑÑылаетÑÑ Ð½Ð° " "журналируемую таблицу \"%s\"" -#: commands/tablecmds.c:16454 +#: commands/tablecmds.c:17221 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "перемеÑтить поÑледовательноÑть Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ в другую Ñхему нельзÑ" -#: commands/tablecmds.c:16561 +#: commands/tablecmds.c:17329 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "отношение \"%s\" уже ÑущеÑтвует в Ñхеме \"%s\"" -#: commands/tablecmds.c:16974 +#: commands/tablecmds.c:17754 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\" - Ñто не таблица и не материализованное предÑтавление" -#: commands/tablecmds.c:17124 +#: commands/tablecmds.c:17907 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" - Ñто не ÑоÑтавной тип" -#: commands/tablecmds.c:17152 +#: commands/tablecmds.c:17937 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "Ñменить Ñхему индекÑа \"%s\" нельзÑ" -#: commands/tablecmds.c:17154 commands/tablecmds.c:17166 +#: commands/tablecmds.c:17939 commands/tablecmds.c:17953 #, c-format msgid "Change the schema of the table instead." msgstr "Однако возможно Ñменить владельца таблицы." -#: commands/tablecmds.c:17158 +#: commands/tablecmds.c:17943 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "Ñменить Ñхему ÑоÑтавного типа \"%s\" нельзÑ" -#: commands/tablecmds.c:17164 +#: commands/tablecmds.c:17951 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "Ñменить Ñхему TOAST-таблицы \"%s\" нельзÑ" -#: commands/tablecmds.c:17201 -#, c-format -msgid "unrecognized partitioning strategy \"%s\"" -msgstr "нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\"" - -#: commands/tablecmds.c:17209 +#: commands/tablecmds.c:17983 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ ÑпиÑку не поддерживает неÑколько Ñтолбцов" -#: commands/tablecmds.c:17275 +#: commands/tablecmds.c:18049 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "Ñтолбец \"%s\", упомÑнутый в ключе ÑекционированиÑ, не ÑущеÑтвует" -#: commands/tablecmds.c:17283 +#: commands/tablecmds.c:18057 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "ÑиÑтемный Ñтолбец \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в ключе ÑекционированиÑ" -#: commands/tablecmds.c:17294 commands/tablecmds.c:17408 +#: commands/tablecmds.c:18068 commands/tablecmds.c:18158 #, c-format msgid "cannot use generated column in partition key" msgstr "генерируемый Ñтолбец Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в ключе ÑекционированиÑ" -#: commands/tablecmds.c:17295 commands/tablecmds.c:17409 commands/trigger.c:667 -#: rewrite/rewriteHandler.c:912 rewrite/rewriteHandler.c:947 +#: commands/tablecmds.c:18141 #, c-format -msgid "Column \"%s\" is a generated column." -msgstr "Столбец \"%s\" ÑвлÑетÑÑ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ð¼." +msgid "partition key expressions cannot contain system column references" +msgstr "" +"Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹ ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ могут Ñодержать ÑÑылки на ÑиÑтемный " +"Ñтолбец" -#: commands/tablecmds.c:17371 +#: commands/tablecmds.c:18188 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "" "функции в выражении ключа ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ быть помечены как IMMUTABLE" -#: commands/tablecmds.c:17391 -#, c-format -msgid "partition key expressions cannot contain system column references" -msgstr "" -"Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹ ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ могут Ñодержать ÑÑылки на ÑиÑтемный " -"Ñтолбец" - -#: commands/tablecmds.c:17421 +#: commands/tablecmds.c:18197 #, c-format msgid "cannot use constant expression as partition key" msgstr "" "в качеÑтве ключа ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать конÑтантное выражение" -#: commands/tablecmds.c:17442 +#: commands/tablecmds.c:18218 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "не удалоÑÑŒ определить правило Ñортировки Ð´Ð»Ñ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÑекционированиÑ" -#: commands/tablecmds.c:17477 +#: commands/tablecmds.c:18253 #, c-format msgid "" "You must specify a hash operator class or define a default hash operator " @@ -12430,7 +13257,7 @@ msgstr "" "Ð’Ñ‹ должны указать клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Ñ…ÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ определить клаÑÑ " "операторов Ñ…ÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ñтого типа данных." -#: commands/tablecmds.c:17483 +#: commands/tablecmds.c:18259 #, c-format msgid "" "You must specify a btree operator class or define a default btree operator " @@ -12439,27 +13266,27 @@ msgstr "" "Ð’Ñ‹ должны указать клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² B-дерева или определить клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² " "B-дерева по умолчанию Ð´Ð»Ñ Ñтого типа данных." -#: commands/tablecmds.c:17734 +#: commands/tablecmds.c:18510 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" уже ÑвлÑетÑÑ Ñекцией" -#: commands/tablecmds.c:17740 +#: commands/tablecmds.c:18516 #, c-format msgid "cannot attach a typed table as partition" msgstr "подключить типизированную таблицу в качеÑтве Ñекции нельзÑ" -#: commands/tablecmds.c:17756 +#: commands/tablecmds.c:18532 #, c-format msgid "cannot attach inheritance child as partition" msgstr "подключить потомок в иерархии наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве Ñекции нельзÑ" -#: commands/tablecmds.c:17770 +#: commands/tablecmds.c:18546 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "подключить родитель в иерархии наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве Ñекции нельзÑ" -#: commands/tablecmds.c:17804 +#: commands/tablecmds.c:18580 #, c-format msgid "" "cannot attach a temporary relation as partition of permanent relation \"%s\"" @@ -12467,7 +13294,7 @@ msgstr "" "подключить временное отношение в качеÑтве Ñекции поÑтоÑнного Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ " "\"%s\" нельзÑ" -#: commands/tablecmds.c:17812 +#: commands/tablecmds.c:18588 #, c-format msgid "" "cannot attach a permanent relation as partition of temporary relation \"%s\"" @@ -12475,92 +13302,102 @@ msgstr "" "подключить поÑтоÑнное отношение в качеÑтве Ñекции временного Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ " "\"%s\" нельзÑ" -#: commands/tablecmds.c:17820 +#: commands/tablecmds.c:18596 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "подключить Ñекцию к временному отношению в другом ÑеанÑе нельзÑ" -#: commands/tablecmds.c:17827 +#: commands/tablecmds.c:18603 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "" "подключить временное отношение из другого ÑеанÑа в качеÑтве Ñекции нельзÑ" -#: commands/tablecmds.c:17847 +#: commands/tablecmds.c:18623 +#, c-format +msgid "table \"%s\" being attached contains an identity column \"%s\"" +msgstr "приÑоединÑÐµÐ¼Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s\" Ñодержит Ñтолбец идентификации \"%s\"" + +#: commands/tablecmds.c:18625 +#, c-format +msgid "The new partition may not contain an identity column." +msgstr "ÐÐ¾Ð²Ð°Ñ ÑÐµÐºÑ†Ð¸Ñ Ð½Ðµ может Ñодержать Ñтолбец идентификации." + +#: commands/tablecmds.c:18633 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "" "таблица \"%s\" Ñодержит Ñтолбец \"%s\", отÑутÑтвующий в родителе \"%s\"" -#: commands/tablecmds.c:17850 +#: commands/tablecmds.c:18636 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "" "ÐÐ¾Ð²Ð°Ñ ÑÐµÐºÑ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ Ñодержать только Ñтолбцы, имеющиеÑÑ Ð² родительÑкой " "таблице." -#: commands/tablecmds.c:17862 +#: commands/tablecmds.c:18648 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "триггер \"%s\" не позволÑет Ñделать таблицу \"%s\" Ñекцией" -#: commands/tablecmds.c:17864 +#: commands/tablecmds.c:18650 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "Триггеры ROW Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð½Ñ‹Ð¼Ð¸ таблицами Ð´Ð»Ñ Ñекций не поддерживаютÑÑ." -#: commands/tablecmds.c:18043 +#: commands/tablecmds.c:18826 #, c-format msgid "" "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ñоединить Ñтороннюю таблицу \"%s\" в качеÑтве Ñекции таблицы \"%s\"" -#: commands/tablecmds.c:18046 +#: commands/tablecmds.c:18829 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Ð¡ÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s\" Ñодержит уникальные индекÑÑ‹." -#: commands/tablecmds.c:18357 +#: commands/tablecmds.c:19151 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "" "Ñекции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚ÑоединÑть в режиме CONCURRENTLY, когда ÑущеÑтвует ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾ " "умолчанию" -#: commands/tablecmds.c:18466 +#: commands/tablecmds.c:19260 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s\" была параллельно удалена" -#: commands/tablecmds.c:18472 +#: commands/tablecmds.c:19266 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "ÑÐµÐºÑ†Ð¸Ñ \"%s\" была параллельно удалена" -#: commands/tablecmds.c:18987 commands/tablecmds.c:19007 -#: commands/tablecmds.c:19027 commands/tablecmds.c:19046 -#: commands/tablecmds.c:19088 +#: commands/tablecmds.c:19880 commands/tablecmds.c:19900 +#: commands/tablecmds.c:19921 commands/tablecmds.c:19940 +#: commands/tablecmds.c:19982 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ñоединить Ð¸Ð½Ð´ÐµÐºÑ \"%s\" в качеÑтве Ñекции индекÑа \"%s\"" -#: commands/tablecmds.c:18990 +#: commands/tablecmds.c:19883 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Ð˜Ð½Ð´ÐµÐºÑ \"%s\" уже приÑоединён к другому индекÑу." -#: commands/tablecmds.c:19010 +#: commands/tablecmds.c:19903 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Ð˜Ð½Ð´ÐµÐºÑ \"%s\" не ÑвлÑетÑÑ Ð¸Ð½Ð´ÐµÐºÑом какой-либо Ñекции таблицы \"%s\"." -#: commands/tablecmds.c:19030 +#: commands/tablecmds.c:19924 #, c-format msgid "The index definitions do not match." msgstr "ÐžÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов не Ñовпадают." -#: commands/tablecmds.c:19049 +#: commands/tablecmds.c:19943 #, c-format msgid "" "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint " @@ -12569,169 +13406,172 @@ msgstr "" "Ð˜Ð½Ð´ÐµÐºÑ \"%s\" принадлежит ограничению в таблице \"%s\", но Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа " "\"%s\" Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½ÐµÑ‚." -#: commands/tablecmds.c:19091 +#: commands/tablecmds.c:19985 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "К Ñекции \"%s\" уже приÑоединён другой индекÑ." -#: commands/tablecmds.c:19321 +#: commands/tablecmds.c:20221 #, c-format msgid "column data type %s does not support compression" msgstr "тим данных Ñтолбца %s не поддерживает Ñжатие" -#: commands/tablecmds.c:19328 +#: commands/tablecmds.c:20228 #, c-format msgid "invalid compression method \"%s\"" msgstr "неверный метод ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\"" -#: commands/tablespace.c:199 commands/tablespace.c:665 +#: commands/tablecmds.c:20254 +#, c-format +msgid "invalid storage type \"%s\"" +msgstr "неверный тип хранилища \"%s\"" + +#: commands/tablecmds.c:20264 +#, c-format +msgid "column data type %s can only have storage PLAIN" +msgstr "тип данных Ñтолбца %s ÑовмеÑтим только Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰ÐµÐ¼ PLAIN" + +#: commands/tablespace.c:193 commands/tablespace.c:644 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "\"%s\" ÑущеÑтвует, но Ñто не каталог" -#: commands/tablespace.c:231 +#: commands/tablespace.c:224 #, c-format msgid "permission denied to create tablespace \"%s\"" -msgstr "нет прав на Ñоздание табличного проÑтранÑтва \"%s\"" +msgstr "нет прав Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтранÑтва \"%s\"" -#: commands/tablespace.c:233 +#: commands/tablespace.c:226 #, c-format msgid "Must be superuser to create a tablespace." msgstr "Ð”Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтранÑтва нужно быть Ñуперпользователем." -#: commands/tablespace.c:249 +#: commands/tablespace.c:242 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "в пути к табличному проÑтранÑтву не должно быть одинарных кавычек" -#: commands/tablespace.c:262 +#: commands/tablespace.c:255 #, c-format msgid "tablespace location must be an absolute path" msgstr "путь к табличному проÑтранÑтву должен быть абÑолютным" -#: commands/tablespace.c:274 +#: commands/tablespace.c:267 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "путь к табличному проÑтранÑтву \"%s\" Ñлишком длинный" -#: commands/tablespace.c:281 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "табличное проÑтранÑтво не должно раÑполагатьÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ каталога данных" -#: commands/tablespace.c:290 commands/tablespace.c:996 +#: commands/tablespace.c:283 commands/tablespace.c:970 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "неприемлемое Ð¸Ð¼Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтранÑтва: \"%s\"" -#: commands/tablespace.c:292 commands/tablespace.c:997 +#: commands/tablespace.c:285 commands/tablespace.c:971 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "ÐŸÑ€ÐµÑ„Ð¸ÐºÑ \"pg_\" зарезервирован Ð´Ð»Ñ ÑиÑтемных табличных проÑтранÑтв." -#: commands/tablespace.c:311 commands/tablespace.c:1018 +#: commands/tablespace.c:304 commands/tablespace.c:992 #, c-format msgid "tablespace \"%s\" already exists" msgstr "табличное проÑтранÑтво \"%s\" уже ÑущеÑтвует" -#: commands/tablespace.c:329 +#: commands/tablespace.c:320 #, c-format msgid "pg_tablespace OID value not set when in binary upgrade mode" msgstr "значение OID в pg_tablespace не задано в режиме двоичного обновлениÑ" -#: commands/tablespace.c:441 commands/tablespace.c:979 -#: commands/tablespace.c:1068 commands/tablespace.c:1137 -#: commands/tablespace.c:1283 commands/tablespace.c:1486 +#: commands/tablespace.c:425 commands/tablespace.c:953 +#: commands/tablespace.c:1042 commands/tablespace.c:1111 +#: commands/tablespace.c:1257 commands/tablespace.c:1460 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "табличное проÑтранÑтво \"%s\" не ÑущеÑтвует" -#: commands/tablespace.c:447 +#: commands/tablespace.c:431 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "табличное проÑтранÑтво \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/tablespace.c:473 +#: commands/tablespace.c:457 #, c-format msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" msgstr "" "табличное проÑтранÑтво \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ, так как еÑть завиÑÑщие от него " "объекты" -#: commands/tablespace.c:540 +#: commands/tablespace.c:524 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "табличное проÑтранÑтво \"%s\" не пуÑто" -#: commands/tablespace.c:632 +#: commands/tablespace.c:611 #, c-format msgid "directory \"%s\" does not exist" msgstr "каталог \"%s\" не ÑущеÑтвует" -#: commands/tablespace.c:633 +#: commands/tablespace.c:612 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "" "Создайте Ñтот каталог Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтранÑтва до перезапуÑка Ñервера." -#: commands/tablespace.c:638 +#: commands/tablespace.c:617 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "не удалоÑÑŒ уÑтановить права Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° \"%s\": %m" -#: commands/tablespace.c:670 +#: commands/tablespace.c:649 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "каталог \"%s\" уже иÑпользуетÑÑ ÐºÐ°Ðº табличное проÑтранÑтво" -#: commands/tablespace.c:788 commands/tablespace.c:801 -#: commands/tablespace.c:837 commands/tablespace.c:929 storage/file/fd.c:3255 -#: storage/file/fd.c:3669 -#, c-format -msgid "could not remove directory \"%s\": %m" -msgstr "ошибка при удалении каталога \"%s\": %m" - -#: commands/tablespace.c:850 commands/tablespace.c:938 +#: commands/tablespace.c:827 commands/tablespace.c:913 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "ошибка при удалении ÑимволичеÑкой ÑÑылки \"%s\": %m" -#: commands/tablespace.c:860 commands/tablespace.c:947 +#: commands/tablespace.c:836 commands/tablespace.c:921 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "\"%s\" - Ñто не каталог или ÑимволичеÑÐºÐ°Ñ ÑÑылка" -#: commands/tablespace.c:1142 +#: commands/tablespace.c:1116 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "Табличное проÑтранÑтво \"%s\" не ÑущеÑтвует." -#: commands/tablespace.c:1588 +#: commands/tablespace.c:1562 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "удалить каталоги табличного проÑтранÑтва %u не удалоÑÑŒ" -#: commands/tablespace.c:1590 +#: commands/tablespace.c:1564 #, c-format msgid "You can remove the directories manually if necessary." msgstr "При необходимоÑти вы можете удалить их вручную." -#: commands/trigger.c:229 commands/trigger.c:240 +#: commands/trigger.c:225 commands/trigger.c:236 #, c-format msgid "\"%s\" is a table" msgstr "\"%s\" - Ñто таблица" -#: commands/trigger.c:231 commands/trigger.c:242 +#: commands/trigger.c:227 commands/trigger.c:238 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "У таблиц не может быть триггеров INSTEAD OF." -#: commands/trigger.c:263 +#: commands/trigger.c:259 #, c-format msgid "\"%s\" is a partitioned table" msgstr "\"%s\" - ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð°" -#: commands/trigger.c:265 +#: commands/trigger.c:261 #, c-format msgid "" "ROW triggers with transition tables are not supported on partitioned tables." @@ -12739,94 +13579,88 @@ msgstr "" "Триггеры ROW Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð½Ñ‹Ð¼Ð¸ таблицами не поддерживаютÑÑ Ð² Ñекционированных " "таблицах." -#: commands/trigger.c:277 commands/trigger.c:284 commands/trigger.c:455 +#: commands/trigger.c:273 commands/trigger.c:280 commands/trigger.c:444 #, c-format msgid "\"%s\" is a view" msgstr "\"%s\" - Ñто предÑтавление" -#: commands/trigger.c:279 +#: commands/trigger.c:275 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "У предÑтавлений не может быть Ñтроковых триггеров BEFORE/AFTER." -#: commands/trigger.c:286 +#: commands/trigger.c:282 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "У предÑтавлений не может быть триггеров TRUNCATE." -#: commands/trigger.c:294 commands/trigger.c:301 commands/trigger.c:313 -#: commands/trigger.c:448 +#: commands/trigger.c:290 commands/trigger.c:302 commands/trigger.c:437 #, c-format msgid "\"%s\" is a foreign table" msgstr "\"%s\" - ÑтороннÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð°" -#: commands/trigger.c:296 +#: commands/trigger.c:292 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "У Ñторонних таблиц не может быть триггеров INSTEAD OF." -#: commands/trigger.c:303 -#, c-format -msgid "Foreign tables cannot have TRUNCATE triggers." -msgstr "У Ñторонних таблиц не может быть триггеров TRUNCATE." - -#: commands/trigger.c:315 +#: commands/trigger.c:304 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "У Ñторонних таблиц не может быть ограничивающих триггеров." -#: commands/trigger.c:320 commands/trigger.c:1375 commands/trigger.c:1482 +#: commands/trigger.c:309 commands/trigger.c:1325 commands/trigger.c:1432 #, c-format msgid "relation \"%s\" cannot have triggers" msgstr "в отношении \"%s\" не может быть триггеров" -#: commands/trigger.c:391 +#: commands/trigger.c:380 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "триггеры TRUNCATE FOR EACH ROW не поддерживаютÑÑ" -#: commands/trigger.c:399 +#: commands/trigger.c:388 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "триггеры INSTEAD OF должны иметь тип FOR EACH ROW" -#: commands/trigger.c:403 +#: commands/trigger.c:392 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "триггеры INSTEAD OF неÑовмеÑтимы Ñ ÑƒÑловиÑми WHEN" -#: commands/trigger.c:407 +#: commands/trigger.c:396 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð¾Ð² INSTEAD OF Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ ÑпиÑок Ñтолбцов" -#: commands/trigger.c:436 +#: commands/trigger.c:425 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "" "указание переменной типа кортеж в предложении REFERENCING не поддерживаетÑÑ" -#: commands/trigger.c:437 +#: commands/trigger.c:426 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "ИÑпользуйте OLD TABLE или NEW TABLE Ð´Ð»Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð½Ñ‹Ñ… таблиц." -#: commands/trigger.c:450 +#: commands/trigger.c:439 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Триггеры Ñторонних таблиц не могут иÑпользовать переходные таблицы." -#: commands/trigger.c:457 +#: commands/trigger.c:446 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Триггеры предÑтавлений не могут иÑпользовать переходные таблицы." -#: commands/trigger.c:473 +#: commands/trigger.c:462 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "триггеры ROW Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð½Ñ‹Ð¼Ð¸ таблицами Ð´Ð»Ñ Ñекций не поддерживаютÑÑ" -#: commands/trigger.c:477 +#: commands/trigger.c:466 #, c-format msgid "" "ROW triggers with transition tables are not supported on inheritance children" @@ -12834,17 +13668,17 @@ msgstr "" "триггеры ROW Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð½Ñ‹Ð¼Ð¸ таблицами Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ¾Ð² в иерархии наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ " "поддерживаютÑÑ" -#: commands/trigger.c:483 +#: commands/trigger.c:472 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "Ð¸Ð¼Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð½Ð¾Ð¹ таблицы можно задать только Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° AFTER" -#: commands/trigger.c:488 +#: commands/trigger.c:477 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "триггеры TRUNCATE Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð½Ñ‹Ð¼Ð¸ таблицами не поддерживаютÑÑ" -#: commands/trigger.c:505 +#: commands/trigger.c:494 #, c-format msgid "" "transition tables cannot be specified for triggers with more than one event" @@ -12852,127 +13686,127 @@ msgstr "" "переходные таблицы Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð¾Ð², назначаемых Ð´Ð»Ñ Ð½ÐµÑкольких " "Ñобытий" -#: commands/trigger.c:516 +#: commands/trigger.c:505 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "переходные таблицы Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð¾Ð² Ñо ÑпиÑками Ñтолбцов" -#: commands/trigger.c:533 +#: commands/trigger.c:522 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE можно задать только Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð¾Ð² INSERT или UPDATE" -#: commands/trigger.c:538 +#: commands/trigger.c:527 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ неÑколько раз" -#: commands/trigger.c:548 +#: commands/trigger.c:537 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE можно задать только Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð¾Ð² DELETE или UPDATE" -#: commands/trigger.c:553 +#: commands/trigger.c:542 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ неÑколько раз" -#: commands/trigger.c:563 +#: commands/trigger.c:552 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "Ð¸Ð¼Ñ OLD TABLE не должно Ñовпадать Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ NEW TABLE" -#: commands/trigger.c:627 commands/trigger.c:640 +#: commands/trigger.c:616 commands/trigger.c:629 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "" "в уÑловии WHEN Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ триггера Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð½Ð° Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ " "Ñтолбцов" -#: commands/trigger.c:632 +#: commands/trigger.c:621 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "в уÑловии WHEN Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° INSERT Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð½Ð° Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ OLD" -#: commands/trigger.c:645 +#: commands/trigger.c:634 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "в уÑловии WHEN Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° DELETE Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð½Ð° Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ NEW" -#: commands/trigger.c:650 +#: commands/trigger.c:639 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "" "в уÑловии WHEN Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° BEFORE Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð½Ð° ÑиÑтемные Ñтолбцы NEW" -#: commands/trigger.c:658 commands/trigger.c:666 +#: commands/trigger.c:647 commands/trigger.c:655 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "" "в уÑловии WHEN Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° BEFORE Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð½Ð° генерируемые Ñтолбцы " "NEW" -#: commands/trigger.c:659 +#: commands/trigger.c:648 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "" "ИÑпользуетÑÑ ÑÑылка на вÑÑŽ Ñтроку таблицы, а таблица Ñодержит генерируемые " "Ñтолбцы." -#: commands/trigger.c:774 commands/trigger.c:1657 +#: commands/trigger.c:763 commands/trigger.c:1607 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "триггер \"%s\" Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" уже ÑущеÑтвует" -#: commands/trigger.c:787 +#: commands/trigger.c:776 #, c-format msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" msgstr "триггер \"%s\" Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" ÑвлÑетÑÑ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½Ð¸Ð¼ или дочерним" -#: commands/trigger.c:806 +#: commands/trigger.c:795 #, c-format msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" msgstr "" "триггер \"%s\" Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" ÑвлÑетÑÑ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð¾Ð¼, реализующим " "ограничение" -#: commands/trigger.c:1447 commands/trigger.c:1600 commands/trigger.c:1876 +#: commands/trigger.c:1397 commands/trigger.c:1550 commands/trigger.c:1831 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "триггер \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\" не ÑущеÑтвует" -#: commands/trigger.c:1572 +#: commands/trigger.c:1522 #, c-format msgid "cannot rename trigger \"%s\" on table \"%s\"" msgstr "переименовать триггер \"%s\" в таблице \"%s\" нельзÑ" -#: commands/trigger.c:1574 +#: commands/trigger.c:1524 #, c-format msgid "Rename the trigger on the partitioned table \"%s\" instead." msgstr "Однако можно переименовать триггер в Ñекционированной таблице \"%s\"." -#: commands/trigger.c:1674 +#: commands/trigger.c:1624 #, c-format msgid "renamed trigger \"%s\" on relation \"%s\"" msgstr "триггер \"%s\" в отношении \"%s\" переименован" -#: commands/trigger.c:1816 +#: commands/trigger.c:1770 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "нет доÑтупа: \"%s\" - Ñто ÑиÑтемный триггер" -#: commands/trigger.c:2437 +#: commands/trigger.c:2379 #, c-format msgid "trigger function %u returned null value" msgstr "Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %u вернула значение NULL" -#: commands/trigger.c:2497 commands/trigger.c:2715 commands/trigger.c:2965 -#: commands/trigger.c:3298 +#: commands/trigger.c:2439 commands/trigger.c:2657 commands/trigger.c:2910 +#: commands/trigger.c:3263 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "триггер BEFORE STATEMENT не может возвращать значение" -#: commands/trigger.c:2573 +#: commands/trigger.c:2515 #, c-format msgid "" "moving row to another partition during a BEFORE FOR EACH ROW trigger is not " @@ -12980,7 +13814,7 @@ msgid "" msgstr "" "в триггере BEFORE FOR EACH ROW Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰Ð°Ñ‚ÑŒ Ñтроку в другую Ñекцию" -#: commands/trigger.c:2574 +#: commands/trigger.c:2516 #, c-format msgid "" "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." @@ -12988,19 +13822,10 @@ msgstr "" "До Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° \"%s\" Ñтрока должна была находитьÑÑ Ð² Ñекции \"%s." "%s\"." -#: commands/trigger.c:3372 executor/nodeModifyTable.c:2349 -#: executor/nodeModifyTable.c:2432 -#, c-format -msgid "" -"tuple to be updated was already modified by an operation triggered by the " -"current command" -msgstr "" -"кортеж, который должен быть изменён, уже модифицирован в операции, вызванной " -"текущей командой" - -#: commands/trigger.c:3373 executor/nodeModifyTable.c:1535 -#: executor/nodeModifyTable.c:1609 executor/nodeModifyTable.c:2350 -#: executor/nodeModifyTable.c:2433 executor/nodeModifyTable.c:3091 +#: commands/trigger.c:3341 executor/nodeModifyTable.c:1561 +#: executor/nodeModifyTable.c:1635 executor/nodeModifyTable.c:2397 +#: executor/nodeModifyTable.c:2488 executor/nodeModifyTable.c:3152 +#: executor/nodeModifyTable.c:3322 #, c-format msgid "" "Consider using an AFTER trigger instead of a BEFORE trigger to propagate " @@ -13009,140 +13834,140 @@ msgstr "" "Возможно, Ð´Ð»Ñ Ñ€Ð°ÑпроÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в другие Ñтроки Ñледует иÑпользовать " "триггер AFTER вмеÑто BEFORE." -#: commands/trigger.c:3402 executor/nodeLockRows.c:229 -#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:331 -#: executor/nodeModifyTable.c:1551 executor/nodeModifyTable.c:2367 -#: executor/nodeModifyTable.c:2577 +#: commands/trigger.c:3382 executor/nodeLockRows.c:228 +#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:334 +#: executor/nodeModifyTable.c:1577 executor/nodeModifyTable.c:2414 +#: executor/nodeModifyTable.c:2638 #, c-format msgid "could not serialize access due to concurrent update" msgstr "не удалоÑÑŒ Ñериализовать доÑтуп из-за параллельного изменениÑ" -#: commands/trigger.c:3410 executor/nodeModifyTable.c:1641 -#: executor/nodeModifyTable.c:2450 executor/nodeModifyTable.c:2601 -#: executor/nodeModifyTable.c:2957 +#: commands/trigger.c:3390 executor/nodeModifyTable.c:1667 +#: executor/nodeModifyTable.c:2505 executor/nodeModifyTable.c:2662 +#: executor/nodeModifyTable.c:3170 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "не удалоÑÑŒ Ñериализовать доÑтуп из-за параллельного удалениÑ" -#: commands/trigger.c:4586 +#: commands/trigger.c:4599 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "" "в рамках операции Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñми по безопаÑноÑти Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð·Ð²Ð°Ñ‚ÑŒ отложенный " "триггер" -#: commands/trigger.c:5769 +#: commands/trigger.c:5780 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "ограничение \"%s\" не ÑвлÑетÑÑ Ð¾Ñ‚ÐºÐ»Ð°Ð´Ñ‹Ð²Ð°ÐµÐ¼Ñ‹Ð¼" -#: commands/trigger.c:5792 +#: commands/trigger.c:5803 #, c-format msgid "constraint \"%s\" does not exist" msgstr "ограничение \"%s\" не ÑущеÑтвует" -#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:635 +#: commands/tsearchcmds.c:124 commands/tsearchcmds.c:641 #, c-format msgid "function %s should return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s должна возвращать тип %s" -#: commands/tsearchcmds.c:194 +#: commands/tsearchcmds.c:200 #, c-format msgid "must be superuser to create text search parsers" msgstr "" "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð¾Ð² текÑтового поиÑка нужно быть Ñуперпользователем" -#: commands/tsearchcmds.c:247 +#: commands/tsearchcmds.c:253 #, c-format msgid "text search parser parameter \"%s\" not recognized" msgstr "параметр анализатора текÑтового поиÑка \"%s\" не раÑпознан" -#: commands/tsearchcmds.c:257 +#: commands/tsearchcmds.c:263 #, c-format msgid "text search parser start method is required" msgstr "Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° текÑтового поиÑка требуетÑÑ Ð¼ÐµÑ‚Ð¾Ð´ start" -#: commands/tsearchcmds.c:262 +#: commands/tsearchcmds.c:268 #, c-format msgid "text search parser gettoken method is required" msgstr "Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° текÑтового поиÑка требуетÑÑ Ð¼ÐµÑ‚Ð¾Ð´ gettoken" -#: commands/tsearchcmds.c:267 +#: commands/tsearchcmds.c:273 #, c-format msgid "text search parser end method is required" msgstr "Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° текÑтового поиÑка требуетÑÑ Ð¼ÐµÑ‚Ð¾Ð´ end" -#: commands/tsearchcmds.c:272 +#: commands/tsearchcmds.c:278 #, c-format msgid "text search parser lextypes method is required" msgstr "Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° текÑтового поиÑка требуетÑÑ Ð¼ÐµÑ‚Ð¾Ð´ lextypes" -#: commands/tsearchcmds.c:366 +#: commands/tsearchcmds.c:372 #, c-format msgid "text search template \"%s\" does not accept options" msgstr "шаблон текÑтового поиÑка \"%s\" не принимает параметры" -#: commands/tsearchcmds.c:440 +#: commands/tsearchcmds.c:446 #, c-format msgid "text search template is required" msgstr "требуетÑÑ ÑˆÐ°Ð±Ð»Ð¾Ð½ текÑтового поиÑка" -#: commands/tsearchcmds.c:701 +#: commands/tsearchcmds.c:707 #, c-format msgid "must be superuser to create text search templates" msgstr "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð² текÑтового поиÑка нужно быть Ñуперпользователем" -#: commands/tsearchcmds.c:743 +#: commands/tsearchcmds.c:749 #, c-format msgid "text search template parameter \"%s\" not recognized" msgstr "параметр шаблона текÑтового поиÑка \"%s\" не раÑпознан" -#: commands/tsearchcmds.c:753 +#: commands/tsearchcmds.c:759 #, c-format msgid "text search template lexize method is required" msgstr "Ð´Ð»Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° текÑтового поиÑка требуетÑÑ Ð¼ÐµÑ‚Ð¾Ð´ lexize" -#: commands/tsearchcmds.c:933 +#: commands/tsearchcmds.c:939 #, c-format msgid "text search configuration parameter \"%s\" not recognized" msgstr "параметр конфигурации текÑтового поиÑка \"%s\" не раÑпознан" -#: commands/tsearchcmds.c:940 +#: commands/tsearchcmds.c:946 #, c-format msgid "cannot specify both PARSER and COPY options" msgstr "указать и PARSER, и COPY одновременно нельзÑ" -#: commands/tsearchcmds.c:976 +#: commands/tsearchcmds.c:982 #, c-format msgid "text search parser is required" msgstr "требуетÑÑ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€ текÑтового поиÑка" -#: commands/tsearchcmds.c:1200 +#: commands/tsearchcmds.c:1277 #, c-format msgid "token type \"%s\" does not exist" msgstr "тип фрагмента \"%s\" не ÑущеÑтвует" -#: commands/tsearchcmds.c:1427 +#: commands/tsearchcmds.c:1540 #, c-format msgid "mapping for token type \"%s\" does not exist" msgstr "ÑопоÑтавление Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° фрагмента \"%s\" не ÑущеÑтвует" -#: commands/tsearchcmds.c:1433 +#: commands/tsearchcmds.c:1546 #, c-format msgid "mapping for token type \"%s\" does not exist, skipping" msgstr "ÑопоÑтавление Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° фрагмента \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/tsearchcmds.c:1596 commands/tsearchcmds.c:1711 +#: commands/tsearchcmds.c:1707 commands/tsearchcmds.c:1822 #, c-format msgid "invalid parameter list format: \"%s\"" msgstr "неверный формат ÑпиÑка параметров: \"%s\"" -#: commands/typecmds.c:217 +#: commands/typecmds.c:221 #, c-format msgid "must be superuser to create a base type" msgstr "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ типа нужно быть Ñуперпользователем" -#: commands/typecmds.c:275 +#: commands/typecmds.c:279 #, c-format msgid "" "Create the type as a shell type, then create its I/O functions, then do a " @@ -13151,42 +13976,42 @@ msgstr "" "Создайте тип в виде оболочки, затем определите Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ функции ввода-вывода " "и в завершение выполните полноценную команду CREATE TYPE." -#: commands/typecmds.c:327 commands/typecmds.c:1450 commands/typecmds.c:4268 +#: commands/typecmds.c:331 commands/typecmds.c:1460 commands/typecmds.c:4480 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "атрибут типа \"%s\" не раÑпознан" -#: commands/typecmds.c:382 +#: commands/typecmds.c:386 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ñ‚Ð¸Ð¿Ð° \"%s\": допуÑтим только ASCII-Ñимвол" -#: commands/typecmds.c:401 +#: commands/typecmds.c:405 #, c-format msgid "array element type cannot be %s" msgstr "типом Ñлемента маÑÑива не может быть %s" -#: commands/typecmds.c:433 +#: commands/typecmds.c:437 #, c-format msgid "alignment \"%s\" not recognized" msgstr "тип Ð²Ñ‹Ñ€Ð°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ \"%s\" не раÑпознан" -#: commands/typecmds.c:450 commands/typecmds.c:4142 +#: commands/typecmds.c:454 commands/typecmds.c:4354 #, c-format msgid "storage \"%s\" not recognized" msgstr "неизвеÑÑ‚Ð½Ð°Ñ ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ \"%s\"" -#: commands/typecmds.c:461 +#: commands/typecmds.c:465 #, c-format msgid "type input function must be specified" msgstr "необходимо указать функцию ввода типа" -#: commands/typecmds.c:465 +#: commands/typecmds.c:469 #, c-format msgid "type output function must be specified" msgstr "необходимо указать функцию вывода типа" -#: commands/typecmds.c:470 +#: commands/typecmds.c:474 #, c-format msgid "" "type modifier output function is useless without a type modifier input " @@ -13195,89 +14020,89 @@ msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° модификатора типа беÑполезна без функции ввода модификатора " "типа" -#: commands/typecmds.c:512 +#: commands/typecmds.c:516 #, c-format msgid "element type cannot be specified without a subscripting function" msgstr "" "тип Ñлемента Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ без ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ° Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ индекÑу" -#: commands/typecmds.c:781 +#: commands/typecmds.c:785 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "\"%s\" - неподходÑщий базовый тип Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°" -#: commands/typecmds.c:879 +#: commands/typecmds.c:883 #, c-format msgid "multiple default expressions" msgstr "неоднократное определение Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° по умолчанию" -#: commands/typecmds.c:942 commands/typecmds.c:951 +#: commands/typecmds.c:946 commands/typecmds.c:955 #, c-format msgid "conflicting NULL/NOT NULL constraints" msgstr "конфликтующие Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ NULL/NOT NULL" -#: commands/typecmds.c:967 +#: commands/typecmds.c:971 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "" "ограничениÑ-проверки Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð² не могут иметь характериÑтики NO INHERIT" -#: commands/typecmds.c:976 commands/typecmds.c:2960 +#: commands/typecmds.c:980 commands/typecmds.c:2940 #, c-format msgid "unique constraints not possible for domains" msgstr "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ð¾Ñти невозможны Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð²" -#: commands/typecmds.c:982 commands/typecmds.c:2966 +#: commands/typecmds.c:986 commands/typecmds.c:2946 #, c-format msgid "primary key constraints not possible for domains" msgstr "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€Ð²Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ ключа невозможны Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð²" -#: commands/typecmds.c:988 commands/typecmds.c:2972 +#: commands/typecmds.c:992 commands/typecmds.c:2952 #, c-format msgid "exclusion constraints not possible for domains" msgstr "ограничениÑ-иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹ Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð²" -#: commands/typecmds.c:994 commands/typecmds.c:2978 +#: commands/typecmds.c:998 commands/typecmds.c:2958 #, c-format msgid "foreign key constraints not possible for domains" msgstr "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ñ… ключей невозможны Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð²" -#: commands/typecmds.c:1003 commands/typecmds.c:2987 +#: commands/typecmds.c:1007 commands/typecmds.c:2967 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "" "возможноÑть Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ñ… ограничений Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð² не поддерживаетÑÑ" -#: commands/typecmds.c:1317 utils/cache/typcache.c:2567 +#: commands/typecmds.c:1327 utils/cache/typcache.c:2570 #, c-format msgid "%s is not an enum" msgstr "\"%s\" не ÑвлÑетÑÑ Ð¿ÐµÑ€ÐµÑ‡Ð¸Ñлением" -#: commands/typecmds.c:1458 +#: commands/typecmds.c:1468 #, c-format msgid "type attribute \"subtype\" is required" msgstr "требуетÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚ типа \"subtype\"" -#: commands/typecmds.c:1463 +#: commands/typecmds.c:1473 #, c-format msgid "range subtype cannot be %s" msgstr "%s не может быть подтипом диапазона" -#: commands/typecmds.c:1482 +#: commands/typecmds.c:1492 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "" "указано правило Ñортировки Ð´Ð»Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð°, но подтип не поддерживает " "Ñортировку" -#: commands/typecmds.c:1492 +#: commands/typecmds.c:1502 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "" "функцию Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÐºÐ°Ð½Ð¾Ð½Ð¸Ñ‡ÐµÑкого диапазона Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ без предварительно " "Ñозданного типа-пуÑтышки" -#: commands/typecmds.c:1493 +#: commands/typecmds.c:1503 #, c-format msgid "" "Create the type as a shell type, then create its canonicalization function, " @@ -13286,96 +14111,96 @@ msgstr "" "Создайте тип в виде оболочки, затем определите Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ функции Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ðº " "каноничеÑкому виду и в завершение выполните полноценную команду CREATE TYPE." -#: commands/typecmds.c:1966 +#: commands/typecmds.c:1975 #, c-format msgid "type input function %s has multiple matches" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ð²Ð¾Ð´Ð° типа %s приÑутÑтвует в неÑкольких ÑкземплÑрах" -#: commands/typecmds.c:1984 +#: commands/typecmds.c:1993 #, c-format msgid "type input function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ð²Ð¾Ð´Ð° типа %s должна возвращать тип %s" -#: commands/typecmds.c:2000 +#: commands/typecmds.c:2009 #, c-format msgid "type input function %s should not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ð²Ð¾Ð´Ð° типа %s не должна быть изменчивой" -#: commands/typecmds.c:2028 +#: commands/typecmds.c:2037 #, c-format msgid "type output function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° типа %s должна возвращать тип %s" -#: commands/typecmds.c:2035 +#: commands/typecmds.c:2044 #, c-format msgid "type output function %s should not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° типа %s не должна быть изменчивой" -#: commands/typecmds.c:2064 +#: commands/typecmds.c:2073 #, c-format msgid "type receive function %s has multiple matches" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° %s приÑутÑтвует в неÑкольких ÑкземплÑрах" -#: commands/typecmds.c:2082 +#: commands/typecmds.c:2091 #, c-format msgid "type receive function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° %s должна возвращать тип %s" -#: commands/typecmds.c:2089 +#: commands/typecmds.c:2098 #, c-format msgid "type receive function %s should not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° %s не должна быть изменчивой" -#: commands/typecmds.c:2117 +#: commands/typecmds.c:2126 #, c-format msgid "type send function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ типа %s должна возвращать тип %s" -#: commands/typecmds.c:2124 +#: commands/typecmds.c:2133 #, c-format msgid "type send function %s should not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ типа %s не должна быть изменчивой" -#: commands/typecmds.c:2151 +#: commands/typecmds.c:2160 #, c-format msgid "typmod_in function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ TYPMOD_IN %s должна возвращать тип %s" -#: commands/typecmds.c:2158 +#: commands/typecmds.c:2167 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ð²Ð¾Ð´Ð° модификатора типа %s не должна быть изменчивой" -#: commands/typecmds.c:2185 +#: commands/typecmds.c:2194 #, c-format msgid "typmod_out function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ TYPMOD_OUT %s должна возвращать тип %s" -#: commands/typecmds.c:2192 +#: commands/typecmds.c:2201 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° модификатора типа %s не должна быть изменчивой" -#: commands/typecmds.c:2219 +#: commands/typecmds.c:2228 #, c-format msgid "type analyze function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° типа %s должна возвращать тип %s" -#: commands/typecmds.c:2248 +#: commands/typecmds.c:2257 #, c-format msgid "type subscripting function %s must return type %s" msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s, Ñ€ÐµÐ°Ð»Ð¸Ð·ÑƒÑŽÑ‰Ð°Ñ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° обращение по индекÑу, должна возвращать тип " "%s" -#: commands/typecmds.c:2258 +#: commands/typecmds.c:2267 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "" "Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑких типов Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать функцию-обработчик Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ " "по индекÑу %s" -#: commands/typecmds.c:2304 +#: commands/typecmds.c:2313 #, c-format msgid "" "You must specify an operator class for the range type or define a default " @@ -13384,464 +14209,617 @@ msgstr "" "Ð’Ñ‹ должны указать клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° диапазона или определить клаÑÑ " "операторов по умолчанию Ð´Ð»Ñ Ñтого подтипа." -#: commands/typecmds.c:2335 +#: commands/typecmds.c:2344 #, c-format msgid "range canonical function %s must return range type" msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÐºÐ°Ð½Ð¾Ð½Ð¸Ñ‡ÐµÑкого диапазона %s должна возвращать диапазон" -#: commands/typecmds.c:2341 +#: commands/typecmds.c:2350 #, c-format msgid "range canonical function %s must be immutable" msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÐºÐ°Ð½Ð¾Ð½Ð¸Ñ‡ÐµÑкого диапазона %s должна быть поÑтоÑнной " "(IMMUTABLE)" -#: commands/typecmds.c:2377 +#: commands/typecmds.c:2386 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ð¹ Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð¸Ð¿Ð° диапазона (%s) должна возвращать тип %s" -#: commands/typecmds.c:2384 +#: commands/typecmds.c:2393 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ð¹ Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð¸Ð¿Ð° диапазона (%s) должна быть поÑтоÑнной " "(IMMUTABLE)" -#: commands/typecmds.c:2411 +#: commands/typecmds.c:2420 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "значение OID маÑÑива в pg_type не задано в режиме двоичного обновлениÑ" -#: commands/typecmds.c:2444 +#: commands/typecmds.c:2453 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "" "значение OID мультидиапазона в pg_type не задано в режиме двоичного " "обновлениÑ" -#: commands/typecmds.c:2477 +#: commands/typecmds.c:2486 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "" "значение OID маÑÑива мультидиапазонов в pg_type не задано в режиме двоичного " "обновлениÑ" -#: commands/typecmds.c:2776 -#, c-format -msgid "column \"%s\" of table \"%s\" contains null values" -msgstr "Ñтолбец \"%s\" таблицы \"%s\" Ñодержит Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ NULL" - -#: commands/typecmds.c:2889 commands/typecmds.c:3091 +#: commands/typecmds.c:2868 commands/typecmds.c:3093 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "ограничение \"%s\" Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° \"%s\" не ÑущеÑтвует" -#: commands/typecmds.c:2893 +#: commands/typecmds.c:2872 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "ограничение \"%s\" Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/typecmds.c:3098 +#: commands/typecmds.c:3100 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "" "ограничение \"%s\" Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° \"%s\" не ÑвлÑетÑÑ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸ÐµÐ¼-проверкой" -#: commands/typecmds.c:3204 +#: commands/typecmds.c:3180 +#, c-format +msgid "column \"%s\" of table \"%s\" contains null values" +msgstr "Ñтолбец \"%s\" таблицы \"%s\" Ñодержит Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ NULL" + +#: commands/typecmds.c:3269 #, c-format msgid "" "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "" "Ñтолбец \"%s\" таблицы \"%s\" Ñодержит значениÑ, нарушающие новое ограничение" -#: commands/typecmds.c:3433 commands/typecmds.c:3633 commands/typecmds.c:3714 -#: commands/typecmds.c:3900 +#: commands/typecmds.c:3498 commands/typecmds.c:3772 commands/typecmds.c:3857 +#: commands/typecmds.c:4073 #, c-format msgid "%s is not a domain" msgstr "\"%s\" - Ñто не домен" -#: commands/typecmds.c:3465 +#: commands/typecmds.c:3532 commands/typecmds.c:3686 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "ограничение \"%s\" Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° \"%s\" уже ÑущеÑтвует" -#: commands/typecmds.c:3516 +#: commands/typecmds.c:3583 #, c-format msgid "cannot use table references in domain check constraint" msgstr "в ограничении-проверке Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð½Ð° таблицы" -#: commands/typecmds.c:3645 commands/typecmds.c:3726 commands/typecmds.c:4017 +#: commands/typecmds.c:3784 commands/typecmds.c:3869 commands/typecmds.c:4223 #, c-format msgid "%s is a table's row type" msgstr "%s - Ñто тип Ñтрок таблицы" -#: commands/typecmds.c:3647 commands/typecmds.c:3728 commands/typecmds.c:4019 -#, c-format -msgid "Use ALTER TABLE instead." -msgstr "Изменить его можно Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ALTER TABLE." - -#: commands/typecmds.c:3653 commands/typecmds.c:3734 commands/typecmds.c:3932 +#: commands/typecmds.c:3794 commands/typecmds.c:3879 commands/typecmds.c:4121 #, c-format msgid "cannot alter array type %s" msgstr "изменить тип маÑÑива \"%s\" нельзÑ" -#: commands/typecmds.c:3655 commands/typecmds.c:3736 commands/typecmds.c:3934 +#: commands/typecmds.c:3796 commands/typecmds.c:3881 commands/typecmds.c:4123 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "Однако можно изменить тип %s, что повлечёт изменение типа маÑÑива." -#: commands/typecmds.c:4002 +#: commands/typecmds.c:3892 +#, c-format +msgid "cannot alter multirange type %s" +msgstr "изменить мультидиапазонный тип %s нельзÑ" + +#: commands/typecmds.c:3895 +#, c-format +msgid "You can alter type %s, which will alter the multirange type as well." +msgstr "" +"Однако можно изменить тип %s, что повлечёт изменение мультидиапазонного типа." + +#: commands/typecmds.c:4202 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "тип \"%s\" уже ÑущеÑтвует в Ñхеме \"%s\"" -#: commands/typecmds.c:4170 +#: commands/typecmds.c:4382 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "Ñменить вариант Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° на PLAIN нельзÑ" -#: commands/typecmds.c:4263 +#: commands/typecmds.c:4475 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "у типа Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ атрибут \"%s\"" -#: commands/typecmds.c:4281 +#: commands/typecmds.c:4493 #, c-format msgid "must be superuser to alter a type" msgstr "Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ типа нужно быть Ñуперпользователем" -#: commands/typecmds.c:4302 commands/typecmds.c:4311 +#: commands/typecmds.c:4514 commands/typecmds.c:4523 #, c-format msgid "%s is not a base type" msgstr "%s — не базовый тип" -#: commands/user.c:138 +#: commands/user.c:200 #, c-format msgid "SYSID can no longer be specified" msgstr "SYSID уже не нужно указывать" -#: commands/user.c:256 +#: commands/user.c:318 commands/user.c:324 commands/user.c:330 +#: commands/user.c:336 commands/user.c:342 #, c-format -msgid "must be superuser to create superusers" -msgstr "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñуперпользователей нужно быть Ñуперпользователем" - -#: commands/user.c:263 -#, c-format -msgid "must be superuser to create replication users" -msgstr "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹-репликаторов нужно быть Ñуперпользователем" +msgid "permission denied to create role" +msgstr "нет прав Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ€Ð¾Ð»Ð¸" -#: commands/user.c:270 +#: commands/user.c:319 #, c-format -msgid "must be superuser to create bypassrls users" -msgstr "" -"Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ c атрибутом bypassrls нужно быть " -"Ñуперпользователем" +msgid "Only roles with the %s attribute may create roles." +msgstr "Создавать роли могут только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s." -#: commands/user.c:277 +#: commands/user.c:325 commands/user.c:331 commands/user.c:337 +#: commands/user.c:343 #, c-format -msgid "permission denied to create role" -msgstr "нет прав Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ€Ð¾Ð»Ð¸" +msgid "" +"Only roles with the %s attribute may create roles with the %s attribute." +msgstr "Создавать роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s могут только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s." -#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 -#: utils/adt/acl.c:5331 utils/adt/acl.c:5337 gram.y:16437 gram.y:16483 +#: commands/user.c:354 commands/user.c:1386 commands/user.c:1393 +#: utils/adt/acl.c:5574 utils/adt/acl.c:5580 gram.y:17310 gram.y:17356 #, c-format msgid "role name \"%s\" is reserved" msgstr "Ð¸Ð¼Ñ Ñ€Ð¾Ð»Ð¸ \"%s\" зарезервировано" -#: commands/user.c:289 commands/user.c:1141 commands/user.c:1148 +#: commands/user.c:356 commands/user.c:1388 commands/user.c:1395 #, c-format msgid "Role names starting with \"pg_\" are reserved." msgstr "Имена ролей, начинающиеÑÑ Ñ \"pg_\", зарезервированы." -#: commands/user.c:310 commands/user.c:1163 +#: commands/user.c:377 commands/user.c:1410 #, c-format msgid "role \"%s\" already exists" msgstr "роль \"%s\" уже ÑущеÑтвует" -#: commands/user.c:376 commands/user.c:754 +#: commands/user.c:439 commands/user.c:924 #, c-format msgid "empty string is not a valid password, clearing password" msgstr "пуÑÑ‚Ð°Ñ Ñтрока не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым паролем; пароль ÑбраÑываетÑÑ" -#: commands/user.c:405 +#: commands/user.c:468 #, c-format msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "значение OID в pg_authid не задано в режиме двоичного обновлениÑ" -#: commands/user.c:524 commands/user.c:838 +#: commands/user.c:652 commands/user.c:1010 msgid "Cannot alter reserved roles." msgstr "ИзменÑть зарезервированные роли нельзÑ." -# skip-rule: translate-superuser -#: commands/user.c:638 +#: commands/user.c:759 commands/user.c:765 commands/user.c:781 +#: commands/user.c:789 commands/user.c:803 commands/user.c:809 +#: commands/user.c:815 commands/user.c:824 commands/user.c:869 +#: commands/user.c:1032 commands/user.c:1043 +#, c-format +msgid "permission denied to alter role" +msgstr "нет прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð¾Ð»Ð¸" + +#: commands/user.c:760 commands/user.c:1033 +#, c-format +msgid "Only roles with the %s attribute may alter roles with the %s attribute." +msgstr "ИзменÑть роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s могут только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s." + +#: commands/user.c:766 commands/user.c:804 commands/user.c:810 +#: commands/user.c:816 +#, c-format +msgid "Only roles with the %s attribute may change the %s attribute." +msgstr "ИзменÑть атрибут %s могут только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s." + +#: commands/user.c:782 commands/user.c:1044 #, c-format msgid "" -"must be superuser to alter superuser roles or change superuser attribute" +"Only roles with the %s attribute and the %s option on role \"%s\" may alter " +"this role." msgstr "" -"Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ ролей Ñуперпользователей или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð° superuser " -"нужно быть Ñуперпользователем" +"ИзменÑть Ñту роль могут только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s и привилегией %s Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ " +"\"%s\"." -#: commands/user.c:645 +#: commands/user.c:790 #, c-format msgid "" -"must be superuser to alter replication roles or change replication attribute" +"To change another role's password, the current user must have the %s " +"attribute and the %s option on the role." msgstr "" -"Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ ролей репликации или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð° replication нужно " -"быть Ñуперпользователем" +"Чтобы Ñменить пароль другой роли, текущий пользователь должен иметь атрибут " +"%s и привилегию %s Ð´Ð»Ñ Ñтой роли." -#: commands/user.c:652 +#: commands/user.c:825 #, c-format -msgid "must be superuser to change bypassrls attribute" -msgstr "Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð° bypassrls нужно быть Ñуперпользователем" +msgid "Only roles with the %s option on role \"%s\" may add or drop members." +msgstr "" +"ДобавлÑть или удалÑть членов могут только роли Ñ Ð¿Ñ€Ð¸Ð²Ð¸Ð»ÐµÐ³Ð¸ÐµÐ¹ %s Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ " +"\"%s\"." -#: commands/user.c:661 commands/user.c:866 +#: commands/user.c:870 #, c-format -msgid "permission denied" -msgstr "нет доÑтупа" +msgid "The bootstrap superuser must have the %s attribute." +msgstr "Стартовый Ñуперпользователь должен иметь атрибут %s." -#: commands/user.c:859 commands/user.c:1400 commands/user.c:1573 +#: commands/user.c:1075 #, c-format -msgid "must be superuser to alter superusers" -msgstr "Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ Ñуперпользователей нужно быть Ñуперпользователем" +msgid "permission denied to alter setting" +msgstr "нет прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð²" -#: commands/user.c:896 +#: commands/user.c:1076 #, c-format -msgid "must be superuser to alter settings globally" -msgstr "Ð´Ð»Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð² нужно быть Ñуперпользователем" +msgid "Only roles with the %s attribute may alter settings globally." +msgstr "ИзменÑть параметры глобально могут только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s." -#: commands/user.c:918 +#: commands/user.c:1100 commands/user.c:1171 commands/user.c:1177 #, c-format msgid "permission denied to drop role" msgstr "нет прав Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ€Ð¾Ð»Ð¸" -#: commands/user.c:943 +#: commands/user.c:1101 +#, c-format +msgid "" +"Only roles with the %s attribute and the %s option on the target roles may " +"drop roles." +msgstr "" +"УдалÑть роли могут только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s и Ñ Ð¿Ñ€Ð¸Ð²Ð¸Ð»ÐµÐ³Ð¸ÐµÐ¹ %s Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ²Ñ‹Ñ… " +"ролей." + +#: commands/user.c:1125 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "иÑпользовать Ñпециальную роль в DROP ROLE нельзÑ" -#: commands/user.c:953 commands/user.c:1110 commands/variable.c:778 -#: commands/variable.c:781 commands/variable.c:865 commands/variable.c:868 -#: utils/adt/acl.c:5186 utils/adt/acl.c:5234 utils/adt/acl.c:5262 -#: utils/adt/acl.c:5281 utils/init/miscinit.c:725 +#: commands/user.c:1135 commands/user.c:1357 commands/variable.c:851 +#: commands/variable.c:854 commands/variable.c:971 commands/variable.c:974 +#: utils/adt/acl.c:365 utils/adt/acl.c:385 utils/adt/acl.c:5429 +#: utils/adt/acl.c:5477 utils/adt/acl.c:5505 utils/adt/acl.c:5524 +#: utils/adt/regproc.c:1571 utils/init/miscinit.c:799 #, c-format msgid "role \"%s\" does not exist" msgstr "роль \"%s\" не ÑущеÑтвует" -#: commands/user.c:958 +#: commands/user.c:1140 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "роль \"%s\" не ÑущеÑтвует, пропуÑкаетÑÑ" -#: commands/user.c:971 commands/user.c:975 +#: commands/user.c:1153 commands/user.c:1157 #, c-format msgid "current user cannot be dropped" msgstr "пользователь не может удалить Ñам ÑебÑ" -#: commands/user.c:979 +#: commands/user.c:1161 #, c-format msgid "session user cannot be dropped" msgstr "Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ ÑеанÑа Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ" -#: commands/user.c:989 +#: commands/user.c:1172 +#, c-format +msgid "Only roles with the %s attribute may drop roles with the %s attribute." +msgstr "Только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s могут удалÑть роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s." + +#: commands/user.c:1178 #, c-format -msgid "must be superuser to drop superusers" -msgstr "Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñуперпользователей нужно быть Ñуперпользователем" +msgid "" +"Only roles with the %s attribute and the %s option on role \"%s\" may drop " +"this role." +msgstr "" +"Эту роль могут удалить только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s и привилегией %s Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ " +"\"%s\"." -#: commands/user.c:1005 +#: commands/user.c:1299 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "роль \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ, так как еÑть завиÑÑщие от неё объекты" -#: commands/user.c:1126 +#: commands/user.c:1373 #, c-format msgid "session user cannot be renamed" msgstr "Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ ÑеанÑа Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ñ‚ÑŒ" -#: commands/user.c:1130 +#: commands/user.c:1377 #, c-format msgid "current user cannot be renamed" msgstr "пользователь не может переименовать Ñам ÑебÑ" -#: commands/user.c:1173 +#: commands/user.c:1421 commands/user.c:1431 #, c-format -msgid "must be superuser to rename superusers" -msgstr "Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ñуперпользователей нужно быть Ñуперпользователем" +msgid "permission denied to rename role" +msgstr "нет прав Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ€Ð¾Ð»Ð¸" -#: commands/user.c:1180 +#: commands/user.c:1422 #, c-format -msgid "permission denied to rename role" -msgstr "нет прав на переименование роли" +msgid "" +"Only roles with the %s attribute may rename roles with the %s attribute." +msgstr "Только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s могут переименовывать роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s." + +#: commands/user.c:1432 +#, c-format +msgid "" +"Only roles with the %s attribute and the %s option on role \"%s\" may rename " +"this role." +msgstr "" +"Переименовать Ñту роль могут только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s и привилегией %s Ð´Ð»Ñ " +"роли \"%s\"." -#: commands/user.c:1201 +#: commands/user.c:1454 #, c-format msgid "MD5 password cleared because of role rename" msgstr "в результате Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ€Ð¾Ð»Ð¸ очищен MD5-хеш паролÑ" -#: commands/user.c:1261 +#: commands/user.c:1518 gram.y:1294 #, c-format -msgid "column names cannot be included in GRANT/REVOKE ROLE" -msgstr "в GRANT/REVOKE ROLE Ð½ÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ‚ÑŒ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñтолбцов" +msgid "unrecognized role option \"%s\"" +msgstr "нераÑпознанный параметр роли \"%s\"" -#: commands/user.c:1299 +#: commands/user.c:1523 +#, c-format +msgid "unrecognized value for role option \"%s\": \"%s\"" +msgstr "нераÑпознанное значение Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° роли \"%s\": \"%s\"" + +#: commands/user.c:1556 +#, c-format +msgid "column names cannot be included in GRANT/REVOKE ROLE" +msgstr "в GRANT/REVOKE ROLE Ð½ÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ‚ÑŒ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñтолбцов" + +#: commands/user.c:1596 #, c-format msgid "permission denied to drop objects" -msgstr "нет прав на удаление объектов" +msgstr "нет прав Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð²" -#: commands/user.c:1326 commands/user.c:1335 +#: commands/user.c:1597 #, c-format -msgid "permission denied to reassign objects" -msgstr "нет прав Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð²" +msgid "Only roles with privileges of role \"%s\" may drop objects owned by it." +msgstr "" +"Только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли \"%s\" могут удалÑть принадлежащие ей объекты." -#: commands/user.c:1408 commands/user.c:1581 +#: commands/user.c:1625 commands/user.c:1636 #, c-format -msgid "must have admin option on role \"%s\"" -msgstr "требуетÑÑ Ð¿Ñ€Ð°Ð²Ð¾ admin Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ \"%s\"" +msgid "permission denied to reassign objects" +msgstr "нет прав Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð²" -#: commands/user.c:1422 +#: commands/user.c:1626 #, c-format -msgid "role \"%s\" cannot have explicit members" -msgstr "роль \"%s\" не может Ñодержать Ñвных членов" +msgid "" +"Only roles with privileges of role \"%s\" may reassign objects owned by it." +msgstr "" +"Только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли \"%s\" могут поменÑть владельца принадлежащих ей " +"объектов." -#: commands/user.c:1432 +#: commands/user.c:1637 #, c-format -msgid "must be superuser to set grantor" -msgstr "Ð´Ð»Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð° ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ нужно быть Ñуперпользователем" +msgid "Only roles with privileges of role \"%s\" may reassign objects to it." +msgstr "" +"Только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли \"%s\" могут назначать её владельцем объектов." -#: commands/user.c:1468 +#: commands/user.c:1733 #, c-format msgid "role \"%s\" cannot be a member of any role" msgstr "роль \"%s\" не может быть членом другой роли" -#: commands/user.c:1481 +#: commands/user.c:1746 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "роль \"%s\" включена в роль \"%s\"" -#: commands/user.c:1496 +#: commands/user.c:1786 commands/user.c:1812 +#, c-format +msgid "%s option cannot be granted back to your own grantor" +msgstr "привилегию %s Ð½ÐµÐ»ÑŒÐ·Ñ Ð²ÐµÑ€Ð½ÑƒÑ‚ÑŒ тому, кто назначил её вам" + +#: commands/user.c:1889 +#, c-format +msgid "" +"role \"%s\" has already been granted membership in role \"%s\" by role \"%s\"" +msgstr "роль \"%s\" уже назначена членом роли \"%s\" ролью \"%s\"" + +#: commands/user.c:2024 +#, c-format +msgid "" +"role \"%s\" has not been granted membership in role \"%s\" by role \"%s\"" +msgstr "роль \"%s\" не была назначена членом роли \"%s\" ролью \"%s\"" + +#: commands/user.c:2124 +#, c-format +msgid "role \"%s\" cannot have explicit members" +msgstr "роль \"%s\" не может Ñодержать Ñвных членов" + +#: commands/user.c:2135 commands/user.c:2158 +#, c-format +msgid "permission denied to grant role \"%s\"" +msgstr "нет прав Ð´Ð»Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‡Ð»ÐµÐ½Ñтва в роли \"%s\"" + +#: commands/user.c:2137 +#, c-format +msgid "Only roles with the %s attribute may grant roles with the %s attribute." +msgstr "" +"Только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s могут назначать членов в ролÑÑ… Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð² %s." + +#: commands/user.c:2142 commands/user.c:2165 +#, c-format +msgid "permission denied to revoke role \"%s\"" +msgstr "нет прав Ð´Ð»Ñ Ð»Ð¸ÑˆÐµÐ½Ð¸Ñ Ñ‡Ð»ÐµÐ½Ñтва в роли \"%s\"" + +#: commands/user.c:2144 +#, c-format +msgid "" +"Only roles with the %s attribute may revoke roles with the %s attribute." +msgstr "" +"Только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s могут лишать членÑтва в ролÑÑ… Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s." + +#: commands/user.c:2160 +#, c-format +msgid "Only roles with the %s option on role \"%s\" may grant this role." +msgstr "" +"Только роли Ñ Ð¿Ñ€Ð¸Ð²Ð¸Ð»ÐµÐ³Ð¸ÐµÐ¹ %s Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ \"%s\" могут назначать членов в ней." + +#: commands/user.c:2167 +#, c-format +msgid "Only roles with the %s option on role \"%s\" may revoke this role." +msgstr "" +"Только роли Ñ Ð¿Ñ€Ð¸Ð²Ð¸Ð»ÐµÐ³Ð¸ÐµÐ¹ %s Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ \"%s\" могут лишать членÑтва в ней." + +#: commands/user.c:2247 commands/user.c:2256 +#, c-format +msgid "permission denied to grant privileges as role \"%s\"" +msgstr "нет полномочий Ð´Ð»Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð² доÑтупа роли \"%s\"" + +#: commands/user.c:2249 +#, c-format +msgid "" +"Only roles with privileges of role \"%s\" may grant privileges as this role." +msgstr "" +"Только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли \"%s\" могут назначать права от имени Ñтой роли." + +#: commands/user.c:2258 +#, c-format +msgid "The grantor must have the %s option on role \"%s\"." +msgstr "Праводатель должен иметь привилегию %s Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ \"%s\"." + +#: commands/user.c:2266 +#, c-format +msgid "permission denied to revoke privileges granted by role \"%s\"" +msgstr "нет полномочий Ð´Ð»Ñ Ð¾Ñ‚Ð·Ñ‹Ð²Ð° прав доÑтупа, назначенных ролью \"%s\"" + +#: commands/user.c:2268 +#, c-format +msgid "" +"Only roles with privileges of role \"%s\" may revoke privileges granted by " +"this role." +msgstr "" +"Только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли \"%s\" могут отзывать права от имени Ñтой роли." + +#: commands/user.c:2491 utils/adt/acl.c:1324 +#, c-format +msgid "dependent privileges exist" +msgstr "ÑущеÑтвуют завиÑимые права" + +#: commands/user.c:2492 utils/adt/acl.c:1325 +#, c-format +msgid "Use CASCADE to revoke them too." +msgstr "ИÑпользуйте CASCADE, чтобы отозвать и их." + +#: commands/vacuum.c:134 #, c-format -msgid "role \"%s\" is already a member of role \"%s\"" -msgstr "роль \"%s\" уже включена в роль \"%s\"" +msgid "\"vacuum_buffer_usage_limit\" must be 0 or between %d kB and %d kB" +msgstr "" +"значение \"vacuum_buffer_usage_limit\" должно быть нулевым или лежать в " +"диапазоне от %d kB до %d kB" -#: commands/user.c:1603 +#: commands/vacuum.c:209 #, c-format -msgid "role \"%s\" is not a member of role \"%s\"" -msgstr "роль \"%s\" не включена в роль \"%s\"" +msgid "BUFFER_USAGE_LIMIT option must be 0 or between %d kB and %d kB" +msgstr "" +"параметр BUFFER_USAGE_LIMIT должен быть нулевым или лежать в диапазоне от %d " +"kB до %d kB" -#: commands/vacuum.c:139 +#: commands/vacuum.c:219 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "нераÑпознанный параметр ANALYZE: \"%s\"" -#: commands/vacuum.c:177 +#: commands/vacuum.c:259 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° parallel требуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ от 0 до %d" -#: commands/vacuum.c:189 +#: commands/vacuum.c:271 #, c-format msgid "parallel workers for vacuum must be between 0 and %d" msgstr "" "чиÑло параллельных иÑполнителей Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‡Ð¸Ñтки должно быть от 0 до %d" -#: commands/vacuum.c:206 +#: commands/vacuum.c:292 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "нераÑпознанный параметр VACUUM: \"%s\"" -#: commands/vacuum.c:229 +#: commands/vacuum.c:318 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULL Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñть в параллельном режиме" -#: commands/vacuum.c:245 +#: commands/vacuum.c:329 #, c-format -msgid "ANALYZE option must be specified when a column list is provided" -msgstr "еÑли задаётÑÑ ÑпиÑок Ñтолбцов, необходимо указать ANALYZE" +msgid "BUFFER_USAGE_LIMIT cannot be specified for VACUUM FULL" +msgstr "параметр BUFFER_USAGE_LIMIT Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ Ð´Ð»Ñ VACUUM FULL" -#: commands/vacuum.c:335 +#: commands/vacuum.c:343 #, c-format -msgid "%s cannot be executed from VACUUM or ANALYZE" -msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ в ходе VACUUM или ANALYZE" +msgid "ANALYZE option must be specified when a column list is provided" +msgstr "еÑли задаётÑÑ ÑпиÑок Ñтолбцов, необходимо указать ANALYZE" -#: commands/vacuum.c:345 +#: commands/vacuum.c:355 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "Параметр VACUUM DISABLE_PAGE_SKIPPING Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñ FULL" -#: commands/vacuum.c:352 +#: commands/vacuum.c:362 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" msgstr "VACUUM FULL работает только Ñ PROCESS_TOAST" -#: commands/vacuum.c:586 -#, c-format -msgid "skipping \"%s\" --- only superuser can vacuum it" -msgstr "" -"\"%s\" пропуÑкаетÑÑ --- только Ñуперпользователь может очиÑтить Ñту таблицу" - -#: commands/vacuum.c:590 +#: commands/vacuum.c:371 #, c-format -msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" -msgstr "" -"пропуÑкаетÑÑ \"%s\" --- только Ñуперпользователь или владелец БД может " -"очиÑтить Ñту таблицу" +msgid "ONLY_DATABASE_STATS cannot be specified with a list of tables" +msgstr "ONLY_DATABASE_STATS Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ Ñо ÑпиÑком таблиц" -#: commands/vacuum.c:594 +#: commands/vacuum.c:380 #, c-format -msgid "skipping \"%s\" --- only table or database owner can vacuum it" -msgstr "" -"\"%s\" пропуÑкаетÑÑ --- только владелец базы данных или Ñтой таблицы может " -"очиÑтить её" +msgid "ONLY_DATABASE_STATS cannot be specified with other VACUUM options" +msgstr "ONLY_DATABASE_STATS Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ параметрами VACUUM" -#: commands/vacuum.c:609 +#: commands/vacuum.c:515 #, c-format -msgid "skipping \"%s\" --- only superuser can analyze it" -msgstr "" -"\"%s\" пропуÑкаетÑÑ --- только Ñуперпользователь может анализировать Ñтот " -"объект" +msgid "%s cannot be executed from VACUUM or ANALYZE" +msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ в ходе VACUUM или ANALYZE" -#: commands/vacuum.c:613 +#: commands/vacuum.c:732 #, c-format -msgid "skipping \"%s\" --- only superuser or database owner can analyze it" -msgstr "" -"\"%s\" пропуÑкаетÑÑ --- только Ñуперпользователь или владелец БД может " -"анализировать Ñтот объект" +msgid "permission denied to vacuum \"%s\", skipping it" +msgstr "нет доÑтупа Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\", оно пропуÑкаетÑÑ" -#: commands/vacuum.c:617 +#: commands/vacuum.c:745 #, c-format -msgid "skipping \"%s\" --- only table or database owner can analyze it" -msgstr "" -"\"%s\" пропуÑкаетÑÑ --- только владелец таблицы или БД может анализировать " -"Ñтот объект" +msgid "permission denied to analyze \"%s\", skipping it" +msgstr "нет доÑтупа Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\", оно пропуÑкаетÑÑ" -#: commands/vacuum.c:696 commands/vacuum.c:792 +#: commands/vacuum.c:823 commands/vacuum.c:920 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "очиÑтка \"%s\" пропуÑкаетÑÑ --- блокировка недоÑтупна" -#: commands/vacuum.c:701 +#: commands/vacuum.c:828 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "очиÑтка \"%s\" пропуÑкаетÑÑ --- Ñто отношение более не ÑущеÑтвует" -#: commands/vacuum.c:717 commands/vacuum.c:797 +#: commands/vacuum.c:844 commands/vacuum.c:925 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "анализ \"%s\" пропуÑкаетÑÑ --- блокировка недоÑтупна" -#: commands/vacuum.c:722 +#: commands/vacuum.c:849 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "анализ \"%s\" пропуÑкаетÑÑ --- Ñто отношение более не ÑущеÑтвует" -#: commands/vacuum.c:1041 +#: commands/vacuum.c:1141 #, c-format -msgid "oldest xmin is far in the past" -msgstr "Ñамый Ñтарый xmin далеко в прошлом" +msgid "cutoff for removing and freezing tuples is far in the past" +msgstr "момент отÑечки Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸ Ð·Ð°Ð¼Ð¾Ñ€Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ñ€Ñ‚ÐµÐ¶ÐµÐ¹ далеко в прошлом" -#: commands/vacuum.c:1042 +#: commands/vacuum.c:1142 commands/vacuum.c:1147 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -13853,50 +14831,42 @@ msgstr "" "Возможно, вам также придётÑÑ Ð·Ð°Ñ„Ð¸ÐºÑировать или откатить Ñтарые " "подготовленные транзакции и удалить неиÑпользуемые Ñлоты репликации." -#: commands/vacuum.c:1085 -#, c-format -msgid "oldest multixact is far in the past" -msgstr "Ñамый Ñтарый multixact далеко в прошлом" - -#: commands/vacuum.c:1086 +#: commands/vacuum.c:1146 #, c-format -msgid "" -"Close open transactions with multixacts soon to avoid wraparound problems." -msgstr "" -"Скорее закройте открытые транзакции в мультитранзакциÑÑ…, чтобы избежать " -"проблемы зацикливаниÑ." +msgid "cutoff for freezing multixacts is far in the past" +msgstr "момент отÑечки Ð´Ð»Ñ Ð·Ð°Ð¼Ð¾Ñ€Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¹ далеко в прошлом" -#: commands/vacuum.c:1792 +#: commands/vacuum.c:1902 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "" "еÑть базы данных, которые не очищалиÑÑŒ на протÑжении более чем 2 миллиардов " "транзакций" -#: commands/vacuum.c:1793 +#: commands/vacuum.c:1903 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "" "Возможно, вы уже потерÑли данные в результате Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ ID транзакций." -#: commands/vacuum.c:1957 +#: commands/vacuum.c:2082 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "" "\"%s\" пропуÑкаетÑÑ --- очищать не таблицы или Ñпециальные ÑиÑтемные таблицы " "нельзÑ" -#: commands/vacuum.c:2328 +#: commands/vacuum.c:2514 #, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "проÑканирован Ð¸Ð½Ð´ÐµÐºÑ \"%s\", удалено верÑий Ñтрок: %d" +msgid "scanned index \"%s\" to remove %lld row versions" +msgstr "проÑканирован Ð¸Ð½Ð´ÐµÐºÑ \"%s\", удалено верÑий Ñтрок: %lld" -#: commands/vacuum.c:2347 +#: commands/vacuum.c:2533 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" теперь Ñодержит верÑий Ñтрок: %.0f, в Ñтраницах: %u" -#: commands/vacuum.c:2351 +#: commands/vacuum.c:2537 #, c-format msgid "" "%.0f index row versions were removed.\n" @@ -13908,7 +14878,7 @@ msgstr "" "Ðа данный момент удалено Ñтраниц индекÑа: %u, из них Ñвободны Ð´Ð»Ñ " "иÑпользованиÑ: %u." -#: commands/vacuumparallel.c:664 +#: commands/vacuumparallel.c:707 #, c-format msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" msgid_plural "" @@ -13923,7 +14893,7 @@ msgstr[2] "" "запущено %d параллельных процеÑÑов очиÑтки Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки индекÑа " "(планировалоÑÑŒ: %d)" -#: commands/vacuumparallel.c:670 +#: commands/vacuumparallel.c:713 #, c-format msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" msgid_plural "" @@ -13938,139 +14908,173 @@ msgstr[2] "" "запущено %d параллельных процеÑÑов очиÑтки Ð´Ð»Ñ ÑƒÐ±Ð¾Ñ€ÐºÐ¸ индекÑа " "(планировалоÑÑŒ: %d)" -#: commands/variable.c:165 utils/misc/guc.c:12099 utils/misc/guc.c:12177 -#, c-format -msgid "Unrecognized key word: \"%s\"." -msgstr "нераÑпознанное ключевое Ñлово: \"%s\"." - -#: commands/variable.c:177 +#: commands/variable.c:185 #, c-format msgid "Conflicting \"datestyle\" specifications." msgstr "Конфликтующие Ñпецификации ÑÑ‚Ð¸Ð»Ñ Ð´Ð°Ñ‚." -#: commands/variable.c:299 +#: commands/variable.c:307 #, c-format msgid "Cannot specify months in time zone interval." msgstr "Ð’ интервале, задающем чаÑовой поÑÑ, Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ меÑÑцы." -#: commands/variable.c:305 +#: commands/variable.c:313 #, c-format msgid "Cannot specify days in time zone interval." msgstr "Ð’ интервале, задающем чаÑовой поÑÑ, Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ дни." -#: commands/variable.c:343 commands/variable.c:425 +#: commands/variable.c:351 commands/variable.c:433 #, c-format msgid "time zone \"%s\" appears to use leap seconds" msgstr "чаÑовой поÑÑ \"%s\" видимо иÑпользует координационные Ñекунды" -#: commands/variable.c:345 commands/variable.c:427 +#: commands/variable.c:353 commands/variable.c:435 #, c-format msgid "PostgreSQL does not support leap seconds." msgstr "PostgreSQL не поддерживает координационные Ñекунды." -#: commands/variable.c:354 +#: commands/variable.c:362 #, c-format msgid "UTC timezone offset is out of range." msgstr "Ñмещение чаÑового поÑÑа UTC вне диапазона" -#: commands/variable.c:494 +#: commands/variable.c:552 #, c-format msgid "cannot set transaction read-write mode inside a read-only transaction" msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÑтановить режим транзакции \"чтение-запиÑÑŒ\" внутри транзакции " "\"только чтение\"" -#: commands/variable.c:501 +#: commands/variable.c:559 #, c-format msgid "transaction read-write mode must be set before any query" msgstr "" "режим транзакции \"чтение-запиÑÑŒ\" должен быть уÑтановлен до Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ " "запроÑов" -#: commands/variable.c:508 +#: commands/variable.c:566 #, c-format msgid "cannot set transaction read-write mode during recovery" msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÑтановить режим транзакции \"чтение-запиÑÑŒ\" в процеÑÑе " "воÑÑтановлениÑ" -#: commands/variable.c:534 +#: commands/variable.c:592 #, c-format msgid "SET TRANSACTION ISOLATION LEVEL must be called before any query" msgstr "команда SET TRANSACTION ISOLATION LEVEL должна выполнÑтьÑÑ Ð´Ð¾ запроÑов" -#: commands/variable.c:541 +#: commands/variable.c:599 #, c-format msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" msgstr "" "команда SET TRANSACTION ISOLATION LEVEL не должна вызыватьÑÑ Ð² подтранзакции" -#: commands/variable.c:548 storage/lmgr/predicate.c:1694 +#: commands/variable.c:606 storage/lmgr/predicate.c:1685 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "иÑпользовать Ñериализуемый режим в горÑчем резерве нельзÑ" -#: commands/variable.c:549 +#: commands/variable.c:607 #, c-format msgid "You can use REPEATABLE READ instead." msgstr "ИÑпользуйте REPEATABLE READ." -#: commands/variable.c:567 +#: commands/variable.c:625 #, c-format msgid "" "SET TRANSACTION [NOT] DEFERRABLE cannot be called within a subtransaction" msgstr "" "команда SET TRANSACTION [NOT] DEFERRABLE не может вызыватьÑÑ Ð² подтранзакции" -#: commands/variable.c:573 +#: commands/variable.c:631 #, c-format msgid "SET TRANSACTION [NOT] DEFERRABLE must be called before any query" msgstr "" "команда SET TRANSACTION [NOT] DEFERRABLE должна выполнÑтьÑÑ Ð´Ð¾ запроÑов" -#: commands/variable.c:655 +#: commands/variable.c:713 #, c-format msgid "Conversion between %s and %s is not supported." msgstr "Преобразование кодировок %s <-> %s не поддерживаетÑÑ." -#: commands/variable.c:662 +#: commands/variable.c:720 #, c-format msgid "Cannot change \"client_encoding\" now." msgstr "Изменить клиентÑкую кодировку ÑÐµÐ¹Ñ‡Ð°Ñ Ð½ÐµÐ»ÑŒÐ·Ñ." -#: commands/variable.c:723 +#: commands/variable.c:781 +#, c-format +msgid "cannot change \"client_encoding\" during a parallel operation" +msgstr "" +"изменить параметр \"client_encoding\" во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ð¾Ð¹ операции нельзÑ" + +#: commands/variable.c:876 #, c-format -msgid "cannot change client_encoding during a parallel operation" -msgstr "изменить клиентÑкую кодировку во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ð¾Ð¹ операции нельзÑ" +msgid "permission will be denied to set session authorization \"%s\"" +msgstr "в доÑтупе Ð´Ð»Ñ Ñмены объекта авторизации \"%s\" будет отказано" -#: commands/variable.c:890 +#: commands/variable.c:881 +#, c-format +msgid "permission denied to set session authorization \"%s\"" +msgstr "нет доÑтупа Ð´Ð»Ñ Ñмены объекта авторизации в ÑеанÑе \"%s\"" + +#: commands/variable.c:991 #, c-format msgid "permission will be denied to set role \"%s\"" msgstr "нет прав уÑтановить роль \"%s\"" -#: commands/variable.c:895 +#: commands/variable.c:996 #, c-format msgid "permission denied to set role \"%s\"" msgstr "нет прав уÑтановить роль \"%s\"" -#: commands/view.c:84 +#: commands/variable.c:1200 +#, c-format +msgid "Bonjour is not supported by this build" +msgstr "Bonjour не поддерживаетÑÑ Ð² данной Ñборке" + +#: commands/variable.c:1228 +#, c-format +msgid "" +"\"effective_io_concurrency\" must be set to 0 on platforms that lack " +"posix_fadvise()." +msgstr "" +"Значение \"effective_io_concurrency\" должно равнÑтьÑÑ 0 на платформах, где " +"отÑутÑтвует posix_fadvise()." + +#: commands/variable.c:1241 +#, c-format +msgid "" +"\"maintenance_io_concurrency\" must be set to 0 on platforms that lack " +"posix_fadvise()." +msgstr "" +"Значение \"maintenance_io_concurrency\" должно равнÑтьÑÑ 0 на платформах, " +"где отÑутÑтвует posix_fadvise()." + +#: commands/variable.c:1254 +#, c-format +msgid "SSL is not supported by this build" +msgstr "SSL не поддерживаетÑÑ Ð² данной Ñборке" + +#: commands/view.c:79 #, c-format msgid "could not determine which collation to use for view column \"%s\"" msgstr "" "не удалоÑÑŒ определить правило Ñортировки Ð´Ð»Ñ Ñтолбца предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\"" -#: commands/view.c:279 commands/view.c:290 +#: commands/view.c:274 commands/view.c:285 #, c-format msgid "cannot drop columns from view" msgstr "удалÑть Ñтолбцы из предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ" -#: commands/view.c:295 +#: commands/view.c:290 #, c-format msgid "cannot change name of view column \"%s\" to \"%s\"" msgstr "изменить Ð¸Ð¼Ñ Ñтолбца \"%s\" на \"%s\" в предÑтавлении нельзÑ" # skip-rule: space-before-ellipsis -#: commands/view.c:298 +#: commands/view.c:293 #, c-format msgid "" "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." @@ -14078,40 +15082,40 @@ msgstr "" "Чтобы изменить Ð¸Ð¼Ñ Ñтолбца предÑтавлениÑ, выполните ALTER VIEW ... RENAME " "COLUMN ..." -#: commands/view.c:309 +#: commands/view.c:304 #, c-format msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "изменить тип Ñтолбца предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" Ñ %s на %s нельзÑ" -#: commands/view.c:323 +#: commands/view.c:318 #, c-format msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" msgstr "" "изменить правило Ñортировки Ð´Ð»Ñ Ñтолбца предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" Ñ \"%s\" на " "\"%s\" нельзÑ" -#: commands/view.c:468 +#: commands/view.c:387 #, c-format msgid "views must not contain SELECT INTO" msgstr "предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ должны Ñодержать SELECT INTO" -#: commands/view.c:480 +#: commands/view.c:399 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ должны Ñодержать операторы, изменÑющие данные в WITH" -#: commands/view.c:550 +#: commands/view.c:469 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "в CREATE VIEW указано больше имён Ñтолбцов, чем Ñамих Ñтолбцов" -#: commands/view.c:558 +#: commands/view.c:477 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "" "предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ могут быть нежурналируемыми, так как они нигде не хранÑÑ‚ÑÑ" -#: commands/view.c:572 +#: commands/view.c:491 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "предÑтавление \"%s\" будет Ñоздано как временное" @@ -14149,7 +15153,7 @@ msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "" "Ð´Ð»Ñ ÐºÑƒÑ€Ñора \"%s\" не выполнÑетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»Ñемое Ñканирование таблицы \"%s\"" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2453 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2555 #, c-format msgid "" "type of parameter %d (%s) does not match that when preparing the plan (%s)" @@ -14157,56 +15161,56 @@ msgstr "" "тип параметра %d (%s) не ÑоответÑтвует тому, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ подготавливалÑÑ Ð¿Ð»Ð°Ð½ " "(%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2465 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2567 #, c-format msgid "no value found for parameter %d" msgstr "не найдено значение параметра %d" -#: executor/execExpr.c:632 executor/execExpr.c:639 executor/execExpr.c:645 -#: executor/execExprInterp.c:4052 executor/execExprInterp.c:4069 -#: executor/execExprInterp.c:4168 executor/nodeModifyTable.c:220 -#: executor/nodeModifyTable.c:231 executor/nodeModifyTable.c:248 -#: executor/nodeModifyTable.c:256 +#: executor/execExpr.c:642 executor/execExpr.c:649 executor/execExpr.c:655 +#: executor/execExprInterp.c:4852 executor/execExprInterp.c:4869 +#: executor/execExprInterp.c:4968 executor/nodeModifyTable.c:203 +#: executor/nodeModifyTable.c:222 executor/nodeModifyTable.c:239 +#: executor/nodeModifyTable.c:249 executor/nodeModifyTable.c:259 #, c-format msgid "table row type and query-specified row type do not match" msgstr "тип Ñтроки таблицы отличаетÑÑ Ð¾Ñ‚ типа Ñтроки-результата запроÑа" -#: executor/execExpr.c:633 executor/nodeModifyTable.c:221 +#: executor/execExpr.c:643 executor/nodeModifyTable.c:204 #, c-format msgid "Query has too many columns." msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ больше Ñтолбцов." -#: executor/execExpr.c:640 executor/nodeModifyTable.c:249 +#: executor/execExpr.c:650 executor/nodeModifyTable.c:223 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "" "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ð´Ð°Ñ‘Ñ‚ значение Ð´Ð»Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ Ñтолбца (Ñ Ð¿Ð¾Ñ€Ñдковым номером %d)." -#: executor/execExpr.c:646 executor/execExprInterp.c:4070 -#: executor/nodeModifyTable.c:232 +#: executor/execExpr.c:656 executor/execExprInterp.c:4870 +#: executor/nodeModifyTable.c:250 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "" "Ð’ таблице определён тип %s (номер Ñтолбца: %d), а в запроÑе предполагаетÑÑ " "%s." -#: executor/execExpr.c:1110 parser/parse_agg.c:827 +#: executor/execExpr.c:1104 parser/parse_agg.c:838 #, c-format msgid "window function calls cannot be nested" msgstr "вложенные вызовы оконных функций недопуÑтимы" -#: executor/execExpr.c:1614 +#: executor/execExpr.c:1649 #, c-format msgid "target type is not an array" msgstr "целевой тип не ÑвлÑетÑÑ Ð¼Ð°ÑÑивом" -#: executor/execExpr.c:1954 +#: executor/execExpr.c:1989 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "Ñтолбец ROW() имеет тип %s, а должен - %s" -#: executor/execExpr.c:2479 executor/execSRF.c:718 parser/parse_func.c:138 -#: parser/parse_func.c:655 parser/parse_func.c:1031 +#: executor/execExpr.c:2653 executor/execSRF.c:718 parser/parse_func.c:138 +#: parser/parse_func.c:655 parser/parse_func.c:1033 #, c-format msgid "cannot pass more than %d argument to a function" msgid_plural "cannot pass more than %d arguments to a function" @@ -14214,60 +15218,60 @@ msgstr[0] "функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ больше %d аргу msgstr[1] "функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ больше %d аргументов" msgstr[2] "функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ больше %d аргументов" -#: executor/execExpr.c:2506 executor/execSRF.c:738 executor/functions.c:1073 -#: utils/adt/jsonfuncs.c:3698 utils/fmgr/funcapi.c:98 utils/fmgr/funcapi.c:152 +#: executor/execExpr.c:2680 executor/execSRF.c:738 executor/functions.c:1068 +#: utils/adt/jsonfuncs.c:4054 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "функциÑ, Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтво, вызвана в контекÑте, где ему нет меÑта" -#: executor/execExpr.c:2865 parser/parse_node.c:276 parser/parse_node.c:326 +#: executor/execExpr.c:3086 parser/parse_node.c:272 parser/parse_node.c:322 #, c-format msgid "cannot subscript type %s because it does not support subscripting" msgstr "" "к Ñлементам типа %s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð±Ñ€Ð°Ñ‰Ð°Ñ‚ÑŒÑÑ Ð¿Ð¾ индекÑам, так как он Ñто не " "поддерживает" -#: executor/execExpr.c:2993 executor/execExpr.c:3015 +#: executor/execExpr.c:3214 executor/execExpr.c:3236 #, c-format msgid "type %s does not support subscripted assignment" msgstr "тип %s не поддерживает изменение Ñлемента по индекÑу" -#: executor/execExprInterp.c:1918 +#: executor/execExprInterp.c:2019 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "атрибут %d типа %s был удалён" -#: executor/execExprInterp.c:1924 +#: executor/execExprInterp.c:2025 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "атрибут %d типа %s имеет неправильный тип" -#: executor/execExprInterp.c:1926 executor/execExprInterp.c:3054 -#: executor/execExprInterp.c:3100 +#: executor/execExprInterp.c:2027 executor/execExprInterp.c:3226 +#: executor/execExprInterp.c:3272 #, c-format msgid "Table has type %s, but query expects %s." msgstr "Ð’ таблице задан тип %s, а в запроÑе ожидаетÑÑ %s." -#: executor/execExprInterp.c:2005 utils/adt/expandedrecord.c:99 -#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1749 -#: utils/cache/typcache.c:1908 utils/cache/typcache.c:2055 -#: utils/fmgr/funcapi.c:570 +#: executor/execExprInterp.c:2107 utils/adt/expandedrecord.c:99 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1752 +#: utils/cache/typcache.c:1911 utils/cache/typcache.c:2058 +#: utils/fmgr/funcapi.c:569 #, c-format msgid "type %s is not composite" msgstr "тип %s не ÑвлÑетÑÑ ÑоÑтавным" -#: executor/execExprInterp.c:2543 +#: executor/execExprInterp.c:2710 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ† такого типа не поддерживаетÑÑ" -#: executor/execExprInterp.c:2756 +#: executor/execExprInterp.c:2923 #, c-format msgid "cannot merge incompatible arrays" msgstr "не удалоÑÑŒ объединить неÑовмеÑтимые маÑÑивы" -#: executor/execExprInterp.c:2757 +#: executor/execExprInterp.c:2924 #, c-format msgid "" "Array with element type %s cannot be included in ARRAY construct with " @@ -14276,16 +15280,15 @@ msgstr "" "МаÑÑив Ñ Ñ‚Ð¸Ð¿Ð¾Ð¼ Ñлементов %s Ð½ÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ в конÑтрукцию ARRAY Ñ Ñ‚Ð¸Ð¿Ð¾Ð¼ " "Ñлементов %s." -#: executor/execExprInterp.c:2778 utils/adt/arrayfuncs.c:263 -#: utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 -#: utils/adt/arrayfuncs.c:3375 utils/adt/arrayfuncs.c:5372 -#: utils/adt/arrayfuncs.c:5889 utils/adt/arraysubs.c:150 +#: executor/execExprInterp.c:2945 utils/adt/arrayfuncs.c:1305 +#: utils/adt/arrayfuncs.c:3503 utils/adt/arrayfuncs.c:5593 +#: utils/adt/arrayfuncs.c:6112 utils/adt/arraysubs.c:150 #: utils/adt/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "чиÑло размерноÑтей маÑÑива (%d) превышает предел (%d)" -#: executor/execExprInterp.c:2798 executor/execExprInterp.c:2828 +#: executor/execExprInterp.c:2965 executor/execExprInterp.c:3000 #, c-format msgid "" "multidimensional arrays must have array expressions with matching dimensions" @@ -14293,22 +15296,53 @@ msgstr "" "Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¼ÐµÑ€Ð½Ñ‹Ñ… маÑÑивов должны задаватьÑÑ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ ÑоответÑтвующими " "размерноÑÑ‚Ñми" -#: executor/execExprInterp.c:3053 executor/execExprInterp.c:3099 +#: executor/execExprInterp.c:2977 utils/adt/array_expanded.c:274 +#: utils/adt/arrayfuncs.c:335 utils/adt/arrayfuncs.c:494 +#: utils/adt/arrayfuncs.c:727 utils/adt/arrayfuncs.c:1533 +#: utils/adt/arrayfuncs.c:2341 utils/adt/arrayfuncs.c:2356 +#: utils/adt/arrayfuncs.c:2618 utils/adt/arrayfuncs.c:2634 +#: utils/adt/arrayfuncs.c:2895 utils/adt/arrayfuncs.c:2949 +#: utils/adt/arrayfuncs.c:2964 utils/adt/arrayfuncs.c:3305 +#: utils/adt/arrayfuncs.c:3533 utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:6204 utils/adt/arrayfuncs.c:6548 +#: utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 +#: utils/adt/arrayutils.c:99 +#, c-format +msgid "array size exceeds the maximum allowed (%d)" +msgstr "размер маÑÑива превышает предел (%d)" + +#: executor/execExprInterp.c:3225 executor/execExprInterp.c:3271 #, c-format msgid "attribute %d has wrong type" msgstr "атрибут %d имеет неверный тип" -#: executor/execExprInterp.c:3681 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3857 utils/adt/domains.c:158 #, c-format msgid "domain %s does not allow null values" msgstr "домен %s не допуÑкает Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ null" -#: executor/execExprInterp.c:3696 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3872 utils/adt/domains.c:196 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "значение домена %s нарушает ограничение-проверку \"%s\"" -#: executor/execExprInterp.c:4053 +#: executor/execExprInterp.c:4447 +#, c-format +msgid "no SQL/JSON item found for specified path of column \"%s\"" +msgstr "по заданному Ð´Ð»Ñ Ñтолбца \"%s\" пути не найден Ñлемент SQL/JSON" + +#: executor/execExprInterp.c:4452 +#, c-format +msgid "no SQL/JSON item found for specified path" +msgstr "по заданному пути не найден Ñлемент SQL/JSON" + +#. translator: first %s is a SQL/JSON clause (e.g. ON ERROR) +#: executor/execExprInterp.c:4652 executor/execExprInterp.c:4660 +#, c-format +msgid "could not coerce %s expression (%s) to the RETURNING type" +msgstr "привеÑти выражение %s (%s) к типу RETURNING не удалоÑÑŒ" + +#: executor/execExprInterp.c:4853 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." @@ -14316,14 +15350,14 @@ msgstr[0] "Строка таблицы Ñодержит %d атрибут, а в msgstr[1] "Строка таблицы Ñодержит %d атрибута, а в запроÑе ожидаетÑÑ %d." msgstr[2] "Строка таблицы Ñодержит %d атрибутов, а в запроÑе ожидаетÑÑ %d." -#: executor/execExprInterp.c:4169 executor/execSRF.c:977 +#: executor/execExprInterp.c:4969 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "" "ÐеÑоответÑтвие параметров физичеÑкого Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ атрибута (под " "номером %d)." -#: executor/execIndexing.c:571 +#: executor/execIndexing.c:593 #, c-format msgid "" "ON CONFLICT does not support deferrable unique constraints/exclusion " @@ -14332,207 +15366,159 @@ msgstr "" "ON CONFLICT не поддерживает откладываемые Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ð¾Ñти/" "ограничениÑ-иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² качеÑтве определÑющего индекÑа" -#: executor/execIndexing.c:848 +#: executor/execIndexing.c:870 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "не удалоÑÑŒ Ñоздать ограничение-иÑключение \"%s\"" -#: executor/execIndexing.c:851 +#: executor/execIndexing.c:873 #, c-format msgid "Key %s conflicts with key %s." msgstr "Ключ %s конфликтует Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð¼ %s." -#: executor/execIndexing.c:853 +#: executor/execIndexing.c:875 #, c-format msgid "Key conflicts exist." msgstr "Обнаружен конфликт ключей." -#: executor/execIndexing.c:859 +#: executor/execIndexing.c:881 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "конфликтующее значение ключа нарушает ограничение-иÑключение \"%s\"" -#: executor/execIndexing.c:862 +#: executor/execIndexing.c:884 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "Ключ %s конфликтует Ñ ÑущеÑтвующим ключом %s." -#: executor/execIndexing.c:864 +#: executor/execIndexing.c:886 #, c-format msgid "Key conflicts with existing key." msgstr "Ключ конфликтует Ñ ÑƒÐ¶Ðµ ÑущеÑтвующим." -#: executor/execMain.c:1009 +#: executor/execMain.c:1039 #, c-format msgid "cannot change sequence \"%s\"" msgstr "поÑледовательноÑть \"%s\" изменить нельзÑ" -#: executor/execMain.c:1015 +#: executor/execMain.c:1045 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "TOAST-отношение \"%s\" изменить нельзÑ" -#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3069 -#: rewrite/rewriteHandler.c:3916 -#, c-format -msgid "cannot insert into view \"%s\"" -msgstr "вÑтавить данные в предÑтавление \"%s\" нельзÑ" - -#: executor/execMain.c:1035 rewrite/rewriteHandler.c:3072 -#: rewrite/rewriteHandler.c:3919 -#, c-format -msgid "" -"To enable inserting into the view, provide an INSTEAD OF INSERT trigger or " -"an unconditional ON INSERT DO INSTEAD rule." -msgstr "" -"Чтобы предÑтавление допуÑкало добавление данных, уÑтановите триггер INSTEAD " -"OF INSERT или безуÑловное правило ON INSERT DO INSTEAD." - -#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3077 -#: rewrite/rewriteHandler.c:3924 -#, c-format -msgid "cannot update view \"%s\"" -msgstr "изменить данные в предÑтавлении \"%s\" нельзÑ" - -#: executor/execMain.c:1043 rewrite/rewriteHandler.c:3080 -#: rewrite/rewriteHandler.c:3927 -#, c-format -msgid "" -"To enable updating the view, provide an INSTEAD OF UPDATE trigger or an " -"unconditional ON UPDATE DO INSTEAD rule." -msgstr "" -"Чтобы предÑтавление допуÑкало изменение данных, уÑтановите триггер INSTEAD " -"OF UPDATE или безуÑловное правило ON UPDATE DO INSTEAD." - -#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3085 -#: rewrite/rewriteHandler.c:3932 -#, c-format -msgid "cannot delete from view \"%s\"" -msgstr "удалить данные из предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" нельзÑ" - -#: executor/execMain.c:1051 rewrite/rewriteHandler.c:3088 -#: rewrite/rewriteHandler.c:3935 -#, c-format -msgid "" -"To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an " -"unconditional ON DELETE DO INSTEAD rule." -msgstr "" -"Чтобы предÑтавление допуÑкало удаление данных, уÑтановите триггер INSTEAD OF " -"DELETE или безуÑловное правило ON DELETE DO INSTEAD." - -#: executor/execMain.c:1062 +#: executor/execMain.c:1064 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "изменить материализованное предÑтавление \"%s\" нельзÑ" -#: executor/execMain.c:1074 +#: executor/execMain.c:1076 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "вÑтавлÑть данные в Ñтороннюю таблицу \"%s\" нельзÑ" -#: executor/execMain.c:1080 +#: executor/execMain.c:1082 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "ÑтороннÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s\" не допуÑкает добавлениÑ" -#: executor/execMain.c:1087 +#: executor/execMain.c:1089 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "изменÑть данные в Ñторонней таблице \"%s\"" -#: executor/execMain.c:1093 +#: executor/execMain.c:1095 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "ÑтороннÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s\" не допуÑкает изменениÑ" -#: executor/execMain.c:1100 +#: executor/execMain.c:1102 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "удалÑть данные из Ñторонней таблицы \"%s\" нельзÑ" -#: executor/execMain.c:1106 +#: executor/execMain.c:1108 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "ÑтороннÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s\" не допуÑкает удалениÑ" -#: executor/execMain.c:1117 +#: executor/execMain.c:1119 #, c-format msgid "cannot change relation \"%s\"" msgstr "отношение \"%s\" изменить нельзÑ" -#: executor/execMain.c:1144 +#: executor/execMain.c:1146 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "блокировать Ñтроки в поÑледовательноÑти \"%s\" нельзÑ" -#: executor/execMain.c:1151 +#: executor/execMain.c:1153 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "блокировать Ñтроки в TOAST-отношении \"%s\" нельзÑ" -#: executor/execMain.c:1158 +#: executor/execMain.c:1160 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "блокировать Ñтроки в предÑтавлении \"%s\" нельзÑ" -#: executor/execMain.c:1166 +#: executor/execMain.c:1168 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "блокировать Ñтроки в материализованном предÑтавлении \"%s\" нельзÑ" -#: executor/execMain.c:1175 executor/execMain.c:2653 -#: executor/nodeLockRows.c:136 +#: executor/execMain.c:1177 executor/execMain.c:2689 +#: executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "блокировать Ñтроки в Ñторонней таблице \"%s\" нельзÑ" -#: executor/execMain.c:1181 +#: executor/execMain.c:1183 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "блокировать Ñтроки в отношении \"%s\" нельзÑ" -#: executor/execMain.c:1888 +#: executor/execMain.c:1901 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "Ð½Ð¾Ð²Ð°Ñ Ñтрока в отношении \"%s\" нарушает ограничение Ñекции" -#: executor/execMain.c:1890 executor/execMain.c:1973 executor/execMain.c:2023 -#: executor/execMain.c:2132 +#: executor/execMain.c:1903 executor/execMain.c:1987 executor/execMain.c:2038 +#: executor/execMain.c:2148 #, c-format msgid "Failing row contains %s." msgstr "ÐžÑˆÐ¸Ð±Ð¾Ñ‡Ð½Ð°Ñ Ñтрока Ñодержит %s." -#: executor/execMain.c:1970 +#: executor/execMain.c:1984 #, c-format msgid "" "null value in column \"%s\" of relation \"%s\" violates not-null constraint" msgstr "" "значение NULL в Ñтолбце \"%s\" Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нарушает ограничение NOT NULL" -#: executor/execMain.c:2021 +#: executor/execMain.c:2036 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "Ð½Ð¾Ð²Ð°Ñ Ñтрока в отношении \"%s\" нарушает ограничение-проверку \"%s\"" -#: executor/execMain.c:2130 +#: executor/execMain.c:2146 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "Ð½Ð¾Ð²Ð°Ñ Ñтрока нарушает ограничение-проверку Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\"" -#: executor/execMain.c:2140 +#: executor/execMain.c:2156 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "" "Ð½Ð¾Ð²Ð°Ñ Ñтрока нарушает политику защиты на уровне Ñтрок \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ " "\"%s\"" -#: executor/execMain.c:2145 +#: executor/execMain.c:2161 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "" "Ð½Ð¾Ð²Ð°Ñ Ñтрока нарушает политику защиты на уровне Ñтрок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\"" -#: executor/execMain.c:2153 +#: executor/execMain.c:2169 #, c-format msgid "" "target row violates row-level security policy \"%s\" (USING expression) for " @@ -14541,7 +15527,7 @@ msgstr "" "Ñ†ÐµÐ»ÐµÐ²Ð°Ñ Ñтрока нарушает политику защиты на уровне Ñтрок \"%s\" (выражение " "USING) Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\"" -#: executor/execMain.c:2158 +#: executor/execMain.c:2174 #, c-format msgid "" "target row violates row-level security policy (USING expression) for table " @@ -14550,7 +15536,7 @@ msgstr "" "Ð½Ð¾Ð²Ð°Ñ Ñтрока нарушает политику защиты на уровне Ñтрок (выражение USING) Ð´Ð»Ñ " "таблицы \"%s\"" -#: executor/execMain.c:2165 +#: executor/execMain.c:2181 #, c-format msgid "" "new row violates row-level security policy \"%s\" (USING expression) for " @@ -14559,7 +15545,7 @@ msgstr "" "Ð½Ð¾Ð²Ð°Ñ Ñтрока нарушает политику защиты на уровне Ñтрок \"%s\" (выражение " "USING) Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\"" -#: executor/execMain.c:2170 +#: executor/execMain.c:2186 #, c-format msgid "" "new row violates row-level security policy (USING expression) for table " @@ -14568,17 +15554,17 @@ msgstr "" "Ð½Ð¾Ð²Ð°Ñ Ñтрока нарушает политику защиты на уровне Ñтрок (выражение USING) Ð´Ð»Ñ " "таблицы \"%s\"" -#: executor/execPartition.c:330 +#: executor/execPartition.c:327 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "Ð´Ð»Ñ Ñтроки не найдена ÑÐµÐºÑ†Ð¸Ñ Ð² отношении \"%s\"" -#: executor/execPartition.c:333 +#: executor/execPartition.c:330 #, c-format msgid "Partition key of the failing row contains %s." msgstr "Ключ ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð½ÐµÐ¿Ð¾Ð´Ñ…Ð¾Ð´Ñщей Ñтроки Ñодержит %s." -#: executor/execReplication.c:196 executor/execReplication.c:373 +#: executor/execReplication.c:272 executor/execReplication.c:456 #, c-format msgid "" "tuple to be locked was already moved to another partition due to concurrent " @@ -14587,31 +15573,31 @@ msgstr "" "кортеж, подлежащий блокировке, был перемещён в другую Ñекцию в результате " "параллельного изменениÑ; Ñледует Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ°" -#: executor/execReplication.c:200 executor/execReplication.c:377 +#: executor/execReplication.c:276 executor/execReplication.c:460 #, c-format msgid "concurrent update, retrying" msgstr "параллельное изменение; Ñледует Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ°" -#: executor/execReplication.c:206 executor/execReplication.c:383 +#: executor/execReplication.c:282 executor/execReplication.c:466 #, c-format msgid "concurrent delete, retrying" msgstr "параллельное удаление; Ñледует Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ°" -#: executor/execReplication.c:269 parser/parse_cte.c:308 -#: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:720 -#: utils/adt/array_userfuncs.c:859 utils/adt/arrayfuncs.c:3655 -#: utils/adt/arrayfuncs.c:4210 utils/adt/arrayfuncs.c:6202 -#: utils/adt/rowtypes.c:1203 +#: executor/execReplication.c:352 parser/parse_cte.c:303 +#: parser/parse_oper.c:221 utils/adt/array_userfuncs.c:1334 +#: utils/adt/array_userfuncs.c:1477 utils/adt/arrayfuncs.c:3852 +#: utils/adt/arrayfuncs.c:4407 utils/adt/arrayfuncs.c:6428 +#: utils/adt/rowtypes.c:1220 #, c-format msgid "could not identify an equality operator for type %s" msgstr "не удалоÑÑŒ найти оператор равенÑтва Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s" -#: executor/execReplication.c:599 executor/execReplication.c:605 +#: executor/execReplication.c:687 executor/execReplication.c:693 #, c-format msgid "cannot update table \"%s\"" msgstr "изменÑть данные в таблице \"%s\" нельзÑ" -#: executor/execReplication.c:601 executor/execReplication.c:613 +#: executor/execReplication.c:689 executor/execReplication.c:701 #, c-format msgid "" "Column used in the publication WHERE expression is not part of the replica " @@ -14620,7 +15606,7 @@ msgstr "" "Столбец, фигурирующий в выражении WHERE публикации, не входит в " "идентификатор реплики." -#: executor/execReplication.c:607 executor/execReplication.c:619 +#: executor/execReplication.c:695 executor/execReplication.c:707 #, c-format msgid "" "Column list used by the publication does not cover the replica identity." @@ -14628,12 +15614,12 @@ msgstr "" "СпиÑок Ñтолбцов, иÑпользуемых в публикации, не покрывает идентификатор " "реплики." -#: executor/execReplication.c:611 executor/execReplication.c:617 +#: executor/execReplication.c:699 executor/execReplication.c:705 #, c-format msgid "cannot delete from table \"%s\"" msgstr "удалÑть данные из таблицы \"%s\" нельзÑ" -#: executor/execReplication.c:637 +#: executor/execReplication.c:725 #, c-format msgid "" "cannot update table \"%s\" because it does not have a replica identity and " @@ -14642,14 +15628,14 @@ msgstr "" "изменение в таблице \"%s\" невозможно, так как в ней отÑутÑтвует " "идентификатор реплики, но она публикует изменениÑ" -#: executor/execReplication.c:639 +#: executor/execReplication.c:727 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "" "Чтобы Ñта таблица поддерживала изменение, уÑтановите REPLICA IDENTITY, " "выполнив ALTER TABLE." -#: executor/execReplication.c:643 +#: executor/execReplication.c:731 #, c-format msgid "" "cannot delete from table \"%s\" because it does not have a replica identity " @@ -14658,7 +15644,7 @@ msgstr "" "удаление из таблицы \"%s\" невозможно, так как в ней отÑутÑтвует " "идентификатор реплики, но она публикует удалениÑ" -#: executor/execReplication.c:645 +#: executor/execReplication.c:733 #, c-format msgid "" "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." @@ -14666,7 +15652,7 @@ msgstr "" "Чтобы Ñта таблица поддерживала удаление, уÑтановите REPLICA IDENTITY, " "выполнив ALTER TABLE." -#: executor/execReplication.c:661 +#: executor/execReplication.c:749 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "" @@ -14722,18 +15708,28 @@ msgstr[2] "" msgid "Returned type %s at ordinal position %d, but query expects %s." msgstr "Возвращён тип %s (номер Ñтолбца: %d), а в запроÑе предполагаетÑÑ %s." -#: executor/execTuples.c:146 executor/execTuples.c:353 -#: executor/execTuples.c:521 executor/execTuples.c:712 +#: executor/execTuples.c:147 executor/execTuples.c:368 +#: executor/execTuples.c:563 executor/execTuples.c:772 #, c-format msgid "cannot retrieve a system column in this context" msgstr "ÑиÑтемный Ñтолбец Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ в данном контекÑте" -#: executor/execUtils.c:742 +#: executor/execTuples.c:163 executor/execTuples.c:580 +#, c-format +msgid "don't have transaction information for this type of tuple" +msgstr "Ð´Ð»Ñ Ñтого типа кортежей Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ÑутÑтвует" + +#: executor/execTuples.c:390 executor/execTuples.c:794 +#, c-format +msgid "don't have a storage tuple in this context" +msgstr "в данном контекÑте хранимый кортеж отÑутÑтвует" + +#: executor/execUtils.c:713 #, c-format msgid "materialized view \"%s\" has not been populated" msgstr "материализованное предÑтавление \"%s\" не было наполнено" -#: executor/execUtils.c:744 +#: executor/execUtils.c:715 #, c-format msgid "Use the REFRESH MATERIALIZED VIEW command." msgstr "Примените команду REFRESH MATERIALIZED VIEW." @@ -14743,156 +15739,149 @@ msgstr "Примените команду REFRESH MATERIALIZED VIEW." msgid "could not determine actual type of argument declared %s" msgstr "не удалоÑÑŒ определить фактичеÑкий тип аргумента, объÑвленного как %s" -#: executor/functions.c:514 +#: executor/functions.c:513 #, c-format msgid "cannot COPY to/from client in an SQL function" msgstr "в функции SQL Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ COPY Ñ ÑƒÑ‡Ð°Ñтием клиента" #. translator: %s is a SQL statement name -#: executor/functions.c:520 +#: executor/functions.c:519 #, c-format msgid "%s is not allowed in an SQL function" msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в SQL-функции" #. translator: %s is a SQL statement name -#: executor/functions.c:528 executor/spi.c:1742 executor/spi.c:2631 +#: executor/functions.c:527 executor/spi.c:1744 executor/spi.c:2657 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в не изменчивой (volatile) функции" -#: executor/functions.c:1457 +#: executor/functions.c:1452 #, c-format msgid "SQL function \"%s\" statement %d" msgstr "SQL-Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\", оператор %d" -#: executor/functions.c:1483 +#: executor/functions.c:1478 #, c-format msgid "SQL function \"%s\" during startup" msgstr "SQL-Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" (при Ñтарте)" -#: executor/functions.c:1568 +#: executor/functions.c:1563 #, c-format msgid "" "calling procedures with output arguments is not supported in SQL functions" msgstr "" "вызов процедур Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ð¼Ð¸ аргументами в функциÑÑ… SQL не поддерживаетÑÑ" -#: executor/functions.c:1701 executor/functions.c:1739 -#: executor/functions.c:1753 executor/functions.c:1843 -#: executor/functions.c:1876 executor/functions.c:1890 +#: executor/functions.c:1698 executor/functions.c:1736 +#: executor/functions.c:1750 executor/functions.c:1845 +#: executor/functions.c:1878 executor/functions.c:1892 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "неÑовпадение типа возврата в функции (в объÑвлении указан тип %s)" -#: executor/functions.c:1703 +#: executor/functions.c:1700 #, c-format msgid "" -"Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." -msgstr "" -"ПоÑледним оператором в функции должен быть SELECT или INSERT/UPDATE/DELETE " +"Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE " "RETURNING." +msgstr "" +"ПоÑледним оператором в функции должен быть SELECT или INSERT/UPDATE/DELETE/" +"MERGE RETURNING." -#: executor/functions.c:1741 +#: executor/functions.c:1738 #, c-format msgid "Final statement must return exactly one column." msgstr "ПоÑледний оператор должен возвращать один Ñтолбец." -#: executor/functions.c:1755 +#: executor/functions.c:1752 #, c-format msgid "Actual return type is %s." msgstr "ФактичеÑкий тип возврата: %s." -#: executor/functions.c:1845 +#: executor/functions.c:1847 #, c-format msgid "Final statement returns too many columns." msgstr "ПоÑледний оператор возвращает Ñлишком много Ñтолбцов." -#: executor/functions.c:1878 +#: executor/functions.c:1880 #, c-format msgid "Final statement returns %s instead of %s at column %d." msgstr "ПоÑледний оператор возвращает %s вмеÑто %s Ð´Ð»Ñ Ñтолбца %d." -#: executor/functions.c:1892 +#: executor/functions.c:1894 #, c-format msgid "Final statement returns too few columns." msgstr "ПоÑледний оператор возвращает Ñлишком мало Ñтолбцов." -#: executor/functions.c:1920 +#: executor/functions.c:1922 #, c-format msgid "return type %s is not supported for SQL functions" msgstr "Ð´Ð»Ñ SQL-функций тип возврата %s не поддерживаетÑÑ" -#: executor/nodeAgg.c:3006 executor/nodeAgg.c:3015 executor/nodeAgg.c:3027 -#, c-format -msgid "unexpected EOF for tape %p: requested %zu bytes, read %zu bytes" -msgstr "" -"неожиданный конец файла Ð´Ð»Ñ Ð»ÐµÐ½Ñ‚Ñ‹ %p: запрашивалоÑÑŒ байт: %zu, прочитано: %zu" - -#: executor/nodeAgg.c:3922 executor/nodeWindowAgg.c:2982 +#: executor/nodeAgg.c:3936 executor/nodeWindowAgg.c:2975 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "" "Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %u должна иметь ÑовмеÑтимые входной и переходный типы" -#: executor/nodeAgg.c:3952 parser/parse_agg.c:668 parser/parse_agg.c:696 +#: executor/nodeAgg.c:3966 parser/parse_agg.c:680 parser/parse_agg.c:708 #, c-format msgid "aggregate function calls cannot be nested" msgstr "вложенные вызовы агрегатных функций недопуÑтимы" -#: executor/nodeCustom.c:145 executor/nodeCustom.c:156 +#: executor/nodeCustom.c:144 executor/nodeCustom.c:155 #, c-format msgid "custom scan \"%s\" does not support MarkPos" msgstr "неÑтандартное Ñканирование \"%s\" не поддерживает MarkPos" -#: executor/nodeHashjoin.c:1046 executor/nodeHashjoin.c:1076 +#: executor/nodeHashjoin.c:1131 executor/nodeHashjoin.c:1161 #, c-format msgid "could not rewind hash-join temporary file" msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ð²Ð¾ временном файле хеш-ÑоединениÑ" -#: executor/nodeHashjoin.c:1272 executor/nodeHashjoin.c:1283 -#, c-format -msgid "" -"could not read from hash-join temporary file: read only %zu of %zu bytes" -msgstr "" -"не удалоÑÑŒ прочитать временный файл хеш-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (прочитано байт: %zu из " -"%zu)" - -#: executor/nodeIndexonlyscan.c:240 +#: executor/nodeIndexonlyscan.c:239 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "" "функции неточного раÑÑтоÑÐ½Ð¸Ñ Ð½Ðµ поддерживаютÑÑ Ð² Ñканировании только по " "индекÑу" -#: executor/nodeLimit.c:374 +#: executor/nodeLimit.c:373 #, c-format msgid "OFFSET must not be negative" msgstr "OFFSET не может быть отрицательным" -#: executor/nodeLimit.c:400 +#: executor/nodeLimit.c:399 #, c-format msgid "LIMIT must not be negative" msgstr "LIMIT не может быть отрицательным" -#: executor/nodeMergejoin.c:1570 +#: executor/nodeMergejoin.c:1579 #, c-format msgid "RIGHT JOIN is only supported with merge-joinable join conditions" msgstr "" "RIGHT JOIN поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ ÑƒÑловиÑми, допуÑкающими Ñоединение " "ÑлиÑнием" -#: executor/nodeMergejoin.c:1588 +#: executor/nodeMergejoin.c:1597 #, c-format msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "" "FULL JOIN поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ ÑƒÑловиÑми, допуÑкающими Ñоединение ÑлиÑнием" -#: executor/nodeModifyTable.c:257 +#: executor/nodeModifyTable.c:240 +#, c-format +msgid "Query provides a value for a generated column at ordinal position %d." +msgstr "" +"Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ð´Ð°Ñ‘Ñ‚ значение Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÐµÐ¼Ð¾Ð³Ð¾ Ñтолбца (Ñ Ð¿Ð¾Ñ€Ñдковым номером %d)." + +#: executor/nodeModifyTable.c:260 #, c-format msgid "Query has too few columns." msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ меньше Ñтолбцов." -#: executor/nodeModifyTable.c:1534 executor/nodeModifyTable.c:1608 +#: executor/nodeModifyTable.c:1560 executor/nodeModifyTable.c:1634 #, c-format msgid "" "tuple to be deleted was already modified by an operation triggered by the " @@ -14901,12 +15890,12 @@ msgstr "" "кортеж, который должен быть удалён, уже модифицирован в операции, вызванной " "текущей командой" -#: executor/nodeModifyTable.c:1759 +#: executor/nodeModifyTable.c:1789 #, c-format msgid "invalid ON UPDATE specification" msgstr "неверное указание ON UPDATE" -#: executor/nodeModifyTable.c:1760 +#: executor/nodeModifyTable.c:1790 #, c-format msgid "" "The result tuple would appear in a different partition than the original " @@ -14915,7 +15904,7 @@ msgstr "" "Результирующий кортеж окажетÑÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰Ñ‘Ð½Ð½Ñ‹Ð¼ из Ñекции иÑходного кортежа в " "другую." -#: executor/nodeModifyTable.c:2207 +#: executor/nodeModifyTable.c:2246 #, c-format msgid "" "cannot move tuple across partitions when a non-root ancestor of the source " @@ -14924,25 +15913,26 @@ msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑтить кортеж между ÑекциÑми, когда внешний ключ непоÑредÑтвенно " "ÑÑылаетÑÑ Ð½Ð° предка иÑходной Ñекции, который не ÑвлÑетÑÑ ÐºÐ¾Ñ€Ð½ÐµÐ¼ иерархии" -#: executor/nodeModifyTable.c:2208 +#: executor/nodeModifyTable.c:2247 #, c-format msgid "" "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "" "Внешний ключ ÑÑылаетÑÑ Ð½Ð° предка \"%s\", а не на корневого предка \"%s\"." -#: executor/nodeModifyTable.c:2211 +#: executor/nodeModifyTable.c:2250 #, c-format msgid "Consider defining the foreign key on table \"%s\"." msgstr "Возможно, имеет ÑмыÑл перенацелить внешний ключ на таблицу \"%s\"." #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2555 executor/nodeModifyTable.c:2946 +#: executor/nodeModifyTable.c:2616 executor/nodeModifyTable.c:3158 +#: executor/nodeModifyTable.c:3328 #, c-format msgid "%s command cannot affect row a second time" msgstr "команда %s не может подейÑтвовать на Ñтроку дважды" -#: executor/nodeModifyTable.c:2557 +#: executor/nodeModifyTable.c:2618 #, c-format msgid "" "Ensure that no rows proposed for insertion within the same command have " @@ -14951,48 +15941,48 @@ msgstr "" "Проверьте, не Ñодержат ли Ñтроки, которые должна добавить команда, " "дублирующиеÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ, подпадающие под ограничениÑ." -#: executor/nodeModifyTable.c:2948 +#: executor/nodeModifyTable.c:3151 executor/nodeModifyTable.c:3321 +#, c-format +msgid "" +"tuple to be updated or deleted was already modified by an operation " +"triggered by the current command" +msgstr "" +"кортеж, который должен быть изменён или удалён, уже модифицирован в " +"операции, вызванной текущей командой" + +#: executor/nodeModifyTable.c:3160 executor/nodeModifyTable.c:3330 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "" "Проверьте, не может ли какой-либо целевой Ñтроке ÑоответÑтвовать более одной " "иÑходной Ñтроки." -#: executor/nodeModifyTable.c:3051 +#: executor/nodeModifyTable.c:3229 #, c-format msgid "" -"tuple to be deleted was already moved to another partition due to concurrent " +"tuple to be merged was already moved to another partition due to concurrent " "update" msgstr "" -"кортеж, подлежащий удалению, был перемещён в другую Ñекцию в результате " +"кортеж, подлежащий объединению, был перемещён в другую Ñекцию в результате " "параллельного изменениÑ" -#: executor/nodeModifyTable.c:3090 -#, c-format -msgid "" -"tuple to be updated or deleted was already modified by an operation " -"triggered by the current command" -msgstr "" -"кортеж, который должен быть изменён или удалён, уже модифицирован в " -"операции, вызванной текущей командой" - -#: executor/nodeSamplescan.c:260 +#: executor/nodeSamplescan.c:244 #, c-format msgid "TABLESAMPLE parameter cannot be null" msgstr "параметр TABLESAMPLE не может быть NULL" -#: executor/nodeSamplescan.c:272 +#: executor/nodeSamplescan.c:256 #, c-format msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "параметр TABLESAMPLE REPEATABLE не может быть NULL" -#: executor/nodeSubplan.c:346 executor/nodeSubplan.c:385 -#: executor/nodeSubplan.c:1159 +#: executor/nodeSubplan.c:325 executor/nodeSubplan.c:351 +#: executor/nodeSubplan.c:405 executor/nodeSubplan.c:1174 #, c-format msgid "more than one row returned by a subquery used as an expression" msgstr "Ð¿Ð¾Ð´Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð² выражении вернул больше одной Ñтроки" -#: executor/nodeTableFuncscan.c:375 +#: executor/nodeTableFuncscan.c:370 #, c-format msgid "namespace URI must not be null" msgstr "URI проÑтранÑтва имён должен быть не NULL" @@ -15002,126 +15992,126 @@ msgstr "URI проÑтранÑтва имён должен быть не NULL" msgid "row filter expression must not be null" msgstr "выражение отбора Ñтрок должно быть не NULL" -#: executor/nodeTableFuncscan.c:415 +#: executor/nodeTableFuncscan.c:416 #, c-format msgid "column filter expression must not be null" msgstr "выражение отбора Ñтолбца должно быть не NULL" -#: executor/nodeTableFuncscan.c:416 +#: executor/nodeTableFuncscan.c:417 #, c-format msgid "Filter for column \"%s\" is null." msgstr "Ð”Ð»Ñ Ñтолбца \"%s\" задано выражение NULL." -#: executor/nodeTableFuncscan.c:506 +#: executor/nodeTableFuncscan.c:507 #, c-format msgid "null is not allowed in column \"%s\"" msgstr "в Ñтолбце \"%s\" не допуÑкаетÑÑ NULL" -#: executor/nodeWindowAgg.c:355 +#: executor/nodeWindowAgg.c:356 #, c-format msgid "moving-aggregate transition function must not return null" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð° движимого агрегата не должна возвращать NULL" -#: executor/nodeWindowAgg.c:2080 +#: executor/nodeWindowAgg.c:2083 #, c-format msgid "frame starting offset must not be null" msgstr "Ñмещение начала рамки не может быть NULL" -#: executor/nodeWindowAgg.c:2093 +#: executor/nodeWindowAgg.c:2096 #, c-format msgid "frame starting offset must not be negative" msgstr "Ñмещение начала рамки не может быть отрицательным" -#: executor/nodeWindowAgg.c:2105 +#: executor/nodeWindowAgg.c:2108 #, c-format msgid "frame ending offset must not be null" msgstr "Ñмещение конца рамки не может быть NULL" -#: executor/nodeWindowAgg.c:2118 +#: executor/nodeWindowAgg.c:2121 #, c-format msgid "frame ending offset must not be negative" msgstr "Ñмещение конца рамки не может быть отрицательным" -#: executor/nodeWindowAgg.c:2898 +#: executor/nodeWindowAgg.c:2891 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "" "Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s не поддерживает иÑпользование в качеÑтве оконной " "функции" -#: executor/spi.c:242 executor/spi.c:342 +#: executor/spi.c:241 executor/spi.c:341 #, c-format msgid "invalid transaction termination" msgstr "неверное завершение транзакции" -#: executor/spi.c:257 +#: executor/spi.c:256 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "фикÑировать транзакцию при наличии активных подтранзакций нельзÑ" -#: executor/spi.c:348 +#: executor/spi.c:347 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "откатить транзакцию при наличии активных подтранзакций нельзÑ" -#: executor/spi.c:472 +#: executor/spi.c:471 #, c-format msgid "transaction left non-empty SPI stack" msgstr "поÑле транзакции оÑталÑÑ Ð½ÐµÐ¿ÑƒÑтой Ñтек SPI" -#: executor/spi.c:473 executor/spi.c:533 +#: executor/spi.c:472 executor/spi.c:532 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Проверьте наличие вызова \"SPI_finish\"." -#: executor/spi.c:532 +#: executor/spi.c:531 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "поÑле подтранзакции оÑталÑÑ Ð½ÐµÐ¿ÑƒÑтой Ñтек SPI" -#: executor/spi.c:1600 +#: executor/spi.c:1602 #, c-format msgid "cannot open multi-query plan as cursor" msgstr "не удалоÑÑŒ открыть план неÑкольких запроÑов как курÑор" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1610 +#: executor/spi.c:1612 #, c-format msgid "cannot open %s query as cursor" msgstr "не удалоÑÑŒ открыть Ð·Ð°Ð¿Ñ€Ð¾Ñ %s как курÑор" -#: executor/spi.c:1716 +#: executor/spi.c:1718 #, c-format msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE не поддерживаетÑÑ" -#: executor/spi.c:1717 parser/analyze.c:2861 +#: executor/spi.c:1719 parser/analyze.c:2928 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Прокручиваемые курÑоры должны быть READ ONLY." -#: executor/spi.c:2470 +#: executor/spi.c:2496 #, c-format msgid "empty query does not return tuples" msgstr "пуÑтой Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ возвращает кортежи" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:2544 +#: executor/spi.c:2570 #, c-format msgid "%s query does not return tuples" msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ %s не возвращает кортежи" -#: executor/spi.c:2959 +#: executor/spi.c:2987 #, c-format msgid "SQL expression \"%s\"" msgstr "SQL-выражение \"%s\"" -#: executor/spi.c:2964 +#: executor/spi.c:2992 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "приÑваивание PL/pgSQL \"%s\"" -#: executor/spi.c:2967 +#: executor/spi.c:2995 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL-оператор: \"%s\"" @@ -15131,33 +16121,34 @@ msgstr "SQL-оператор: \"%s\"" msgid "could not send tuple to shared-memory queue" msgstr "не удалоÑÑŒ передать кортеж в очередь в разделÑемой памÑти" -#: foreign/foreign.c:221 +#: foreign/foreign.c:225 +#, c-format +msgid "user mapping not found for user \"%s\", server \"%s\"" +msgstr "ÑопоÑтавление Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\", Ñервера \"%s\" не найдено" + +#: foreign/foreign.c:336 optimizer/plan/createplan.c:7153 +#: optimizer/util/plancat.c:540 #, c-format -msgid "user mapping not found for \"%s\"" -msgstr "ÑопоÑтавление Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ \"%s\" не найдено" +msgid "access to non-system foreign table is restricted" +msgstr "доÑтуп к неÑиÑтемным Ñторонним таблицам ограничен" -#: foreign/foreign.c:638 +#: foreign/foreign.c:660 #, c-format msgid "invalid option \"%s\"" msgstr "неверный параметр \"%s\"" -#: foreign/foreign.c:640 +#: foreign/foreign.c:662 #, c-format -msgid "Valid options in this context are: %s" -msgstr "Ð’ данном контекÑте допуÑтимы параметры: %s" +msgid "Perhaps you meant the option \"%s\"." +msgstr "Возможно, предполагалÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ \"%s\"." -#: foreign/foreign.c:642 +#: foreign/foreign.c:664 #, c-format msgid "There are no valid options in this context." msgstr "Ð’ данном контекÑте недопуÑтимы никакие параметры." -#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:415 -#, c-format -msgid "could not access file \"%s\": %m" -msgstr "нет доÑтупа к файлу \"%s\": %m" - -#: lib/dshash.c:254 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 -#: utils/mmgr/dsa.c:805 +#: lib/dshash.c:254 utils/mmgr/dsa.c:708 utils/mmgr/dsa.c:730 +#: utils/mmgr/dsa.c:811 #, c-format msgid "Failed on DSA request of size %zu." msgstr "Ошибка при запроÑе памÑти DSA (%zu Б)." @@ -15167,77 +16158,77 @@ msgstr "Ошибка при запроÑе памÑти DSA (%zu Б)." msgid "expected SASL response, got message type %d" msgstr "ожидалÑÑ Ð¾Ñ‚Ð²ÐµÑ‚ SASL, но получено Ñообщение %d" -#: libpq/auth-scram.c:258 +#: libpq/auth-scram.c:263 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "клиент выбрал неверный механизм аутентификации SASL" -#: libpq/auth-scram.c:279 libpq/auth-scram.c:523 libpq/auth-scram.c:534 +#: libpq/auth-scram.c:287 libpq/auth-scram.c:536 libpq/auth-scram.c:547 #, c-format msgid "invalid SCRAM secret for user \"%s\"" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ñекрета SCRAM Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\"" -#: libpq/auth-scram.c:290 +#: libpq/auth-scram.c:298 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" нет подходÑщей запиÑи Ñекрета SCRAM." -#: libpq/auth-scram.c:368 libpq/auth-scram.c:373 libpq/auth-scram.c:714 -#: libpq/auth-scram.c:722 libpq/auth-scram.c:827 libpq/auth-scram.c:840 -#: libpq/auth-scram.c:850 libpq/auth-scram.c:958 libpq/auth-scram.c:965 -#: libpq/auth-scram.c:980 libpq/auth-scram.c:995 libpq/auth-scram.c:1009 -#: libpq/auth-scram.c:1027 libpq/auth-scram.c:1042 libpq/auth-scram.c:1355 -#: libpq/auth-scram.c:1363 +#: libpq/auth-scram.c:378 libpq/auth-scram.c:383 libpq/auth-scram.c:737 +#: libpq/auth-scram.c:745 libpq/auth-scram.c:850 libpq/auth-scram.c:863 +#: libpq/auth-scram.c:873 libpq/auth-scram.c:981 libpq/auth-scram.c:988 +#: libpq/auth-scram.c:1003 libpq/auth-scram.c:1018 libpq/auth-scram.c:1032 +#: libpq/auth-scram.c:1050 libpq/auth-scram.c:1065 libpq/auth-scram.c:1379 +#: libpq/auth-scram.c:1387 #, c-format msgid "malformed SCRAM message" msgstr "неправильное Ñообщение SCRAM" -#: libpq/auth-scram.c:369 +#: libpq/auth-scram.c:379 #, c-format msgid "The message is empty." msgstr "Сообщение пуÑтое." -#: libpq/auth-scram.c:374 +#: libpq/auth-scram.c:384 #, c-format msgid "Message length does not match input length." msgstr "Длина ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ ÑоответÑтвует входной длине." -#: libpq/auth-scram.c:406 +#: libpq/auth-scram.c:416 #, c-format msgid "invalid SCRAM response" msgstr "неверный ответ SCRAM" -#: libpq/auth-scram.c:407 +#: libpq/auth-scram.c:417 #, c-format msgid "Nonce does not match." msgstr "Разовый код не Ñовпадает." -#: libpq/auth-scram.c:483 +#: libpq/auth-scram.c:493 #, c-format msgid "could not generate random salt" msgstr "не удалоÑÑŒ Ñгенерировать Ñлучайную Ñоль" -#: libpq/auth-scram.c:715 +#: libpq/auth-scram.c:738 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "ОжидалÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚ \"%c\", но обнаружено \"%s\"." -#: libpq/auth-scram.c:723 libpq/auth-scram.c:851 +#: libpq/auth-scram.c:746 libpq/auth-scram.c:874 #, c-format msgid "Expected character \"=\" for attribute \"%c\"." msgstr "ОжидалÑÑ Ñимвол \"=\" Ð´Ð»Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð° \"%c\"." -#: libpq/auth-scram.c:828 +#: libpq/auth-scram.c:851 #, c-format msgid "Attribute expected, but found end of string." msgstr "ОжидалÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚, но обнаружен конец Ñтроки." -#: libpq/auth-scram.c:841 +#: libpq/auth-scram.c:864 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "ОжидалÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚, но обнаружен неправильный Ñимвол \"%s\"." -#: libpq/auth-scram.c:959 libpq/auth-scram.c:981 +#: libpq/auth-scram.c:982 libpq/auth-scram.c:1004 #, c-format msgid "" "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not " @@ -15246,17 +16237,17 @@ msgstr "" "Клиент выбрал алгоритм SCRAM-SHA-256-PLUS, но в Ñообщении SCRAM отÑутÑтвуют " "данные ÑвÑÐ·Ñ‹Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð¾Ð²." -#: libpq/auth-scram.c:966 libpq/auth-scram.c:996 +#: libpq/auth-scram.c:989 libpq/auth-scram.c:1019 #, c-format msgid "Comma expected, but found character \"%s\"." msgstr "ОжидалаÑÑŒ запÑтаÑ, но обнаружен Ñимвол \"%s\"." -#: libpq/auth-scram.c:987 +#: libpq/auth-scram.c:1010 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "Ошибка ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑвÑÐ·Ñ‹Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð¾Ð² SCRAM" -#: libpq/auth-scram.c:988 +#: libpq/auth-scram.c:1011 #, c-format msgid "" "The client supports SCRAM channel binding but thinks the server does not. " @@ -15265,7 +16256,7 @@ msgstr "" "Клиент поддерживает ÑвÑзывание каналов SCRAM, но полагает, что оно не " "поддерживаетÑÑ Ñервером. Однако Ñервер тоже поддерживает ÑвÑзывание каналов." -#: libpq/auth-scram.c:1010 +#: libpq/auth-scram.c:1033 #, c-format msgid "" "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM " @@ -15274,155 +16265,155 @@ msgstr "" "Клиент выбрал алгоритм SCRAM-SHA-256 без ÑвÑÐ·Ñ‹Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð¾Ð², но Ñообщение " "SCRAM Ñодержит данные ÑвÑÐ·Ñ‹Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð¾Ð²." -#: libpq/auth-scram.c:1021 +#: libpq/auth-scram.c:1044 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "неподдерживаемый тип ÑвÑÐ·Ñ‹Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð¾Ð² SCRAM \"%s\"" -#: libpq/auth-scram.c:1028 +#: libpq/auth-scram.c:1051 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "Ðеожиданный флаг ÑвÑÐ·Ñ‹Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð¾Ð² \"%s\"." -#: libpq/auth-scram.c:1038 +#: libpq/auth-scram.c:1061 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "клиент передал идентификатор Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ð¸, но Ñто не поддерживаетÑÑ" -#: libpq/auth-scram.c:1043 +#: libpq/auth-scram.c:1066 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "Ðеожиданный атрибут \"%s\" в первом Ñообщении клиента." -#: libpq/auth-scram.c:1059 +#: libpq/auth-scram.c:1082 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "клиенту требуетÑÑ Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð¾Ðµ раÑширение SCRAM" -#: libpq/auth-scram.c:1073 +#: libpq/auth-scram.c:1096 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "непечатаемые Ñимволы в разовом коде SCRAM" -#: libpq/auth-scram.c:1203 +#: libpq/auth-scram.c:1227 #, c-format msgid "could not generate random nonce" msgstr "не удалоÑÑŒ Ñгенерировать разовый код" -#: libpq/auth-scram.c:1213 +#: libpq/auth-scram.c:1237 #, c-format msgid "could not encode random nonce" msgstr "не удалоÑÑŒ оформить разовый код" -#: libpq/auth-scram.c:1319 +#: libpq/auth-scram.c:1343 #, c-format msgid "SCRAM channel binding check failed" msgstr "ошибка проверки ÑвÑÐ·Ñ‹Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð¾Ð² SCRAM" -#: libpq/auth-scram.c:1337 +#: libpq/auth-scram.c:1361 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "" "неожиданный атрибут ÑвÑÐ·Ñ‹Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð¾Ð² в поÑледнем Ñообщении клиента SCRAM" -#: libpq/auth-scram.c:1356 +#: libpq/auth-scram.c:1380 #, c-format msgid "Malformed proof in client-final-message." msgstr "Ðекорректное подтверждение в поÑледнем Ñообщении клиента." -#: libpq/auth-scram.c:1364 +#: libpq/auth-scram.c:1388 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "МуÑор в конце поÑледнего ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°." -#: libpq/auth.c:275 +#: libpq/auth.c:269 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "" "пользователь \"%s\" не прошёл проверку подлинноÑти: не разрешённый компьютер" -#: libpq/auth.c:278 +#: libpq/auth.c:272 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинноÑти (\"trust\")" -#: libpq/auth.c:281 +#: libpq/auth.c:275 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинноÑти (Ident)" -#: libpq/auth.c:284 +#: libpq/auth.c:278 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинноÑти (Peer)" -#: libpq/auth.c:289 +#: libpq/auth.c:283 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинноÑти (по паролю)" -#: libpq/auth.c:294 +#: libpq/auth.c:288 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинноÑти (GSSAPI)" -#: libpq/auth.c:297 +#: libpq/auth.c:291 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинноÑти (SSPI)" -#: libpq/auth.c:300 +#: libpq/auth.c:294 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинноÑти (PAM)" -#: libpq/auth.c:303 +#: libpq/auth.c:297 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинноÑти (BSD)" -#: libpq/auth.c:306 +#: libpq/auth.c:300 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинноÑти (LDAP)" -#: libpq/auth.c:309 +#: libpq/auth.c:303 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинноÑти (по Ñертификату)" -#: libpq/auth.c:312 +#: libpq/auth.c:306 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинноÑти (RADIUS)" -#: libpq/auth.c:315 +#: libpq/auth.c:309 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "" "пользователь \"%s\" не прошёл проверку подлинноÑти: неверный метод проверки" -#: libpq/auth.c:319 +#: libpq/auth.c:313 #, c-format -msgid "Connection matched pg_hba.conf line %d: \"%s\"" -msgstr "Подключение ÑоответÑтвует Ñтроке %d в pg_hba.conf: \"%s\"" +msgid "Connection matched file \"%s\" line %d: \"%s\"" +msgstr "Подключение ÑоответÑтвует Ñтроке %2$d в \"%1$s\": \"%3$s\"" -#: libpq/auth.c:362 +#: libpq/auth.c:357 #, c-format msgid "authentication identifier set more than once" msgstr "аутентификационный идентификатор указан повторно" -#: libpq/auth.c:363 +#: libpq/auth.c:358 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "предыдущий идентификатор: \"%s\"; новый: \"%s\"" -#: libpq/auth.c:372 +#: libpq/auth.c:368 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "Ñоединение аутентифицировано: идентификатор=\"%s\" метод=%s (%s:%d)" -#: libpq/auth.c:411 +#: libpq/auth.c:408 #, c-format msgid "" "client certificates can only be checked if a root certificate store is " @@ -15431,25 +16422,25 @@ msgstr "" "Ñертификаты клиентов могут проверÑтьÑÑ, только еÑли доÑтупно хранилище " "корневых Ñертификатов" -#: libpq/auth.c:422 +#: libpq/auth.c:419 #, c-format msgid "connection requires a valid client certificate" msgstr "Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ Ð³Ð¾Ð´Ð½Ñ‹Ð¹ Ñертификат клиента" -#: libpq/auth.c:453 libpq/auth.c:499 +#: libpq/auth.c:450 libpq/auth.c:496 msgid "GSS encryption" msgstr "Шифрование GSS" -#: libpq/auth.c:456 libpq/auth.c:502 +#: libpq/auth.c:453 libpq/auth.c:499 msgid "SSL encryption" msgstr "Шифрование SSL" -#: libpq/auth.c:458 libpq/auth.c:504 +#: libpq/auth.c:455 libpq/auth.c:501 msgid "no encryption" msgstr "без шифрованиÑ" #. translator: last %s describes encryption state -#: libpq/auth.c:464 +#: libpq/auth.c:461 #, c-format msgid "" "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" @@ -15458,7 +16449,7 @@ msgstr "" "пользователь \"%s\", \"%s\"" #. translator: last %s describes encryption state -#: libpq/auth.c:471 +#: libpq/auth.c:468 #, c-format msgid "" "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database " @@ -15467,38 +16458,38 @@ msgstr "" "pg_hba.conf отвергает подключение: компьютер \"%s\", пользователь \"%s\", " "база данных \"%s\", %s" -#: libpq/auth.c:509 +#: libpq/auth.c:506 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "" "IP-Ð°Ð´Ñ€ÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð° разрешаетÑÑ Ð² \"%s\", ÑоответÑтвует прÑмому преобразованию." -#: libpq/auth.c:512 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "" "IP-Ð°Ð´Ñ€ÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð° разрешаетÑÑ Ð² \"%s\", прÑмое преобразование не проверÑлоÑÑŒ." -#: libpq/auth.c:515 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "" "IP-Ð°Ð´Ñ€ÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð° разрешаетÑÑ Ð² \"%s\", Ñто не ÑоответÑтвует прÑмому " "преобразованию." -#: libpq/auth.c:518 +#: libpq/auth.c:515 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "" "Преобразовать Ð¸Ð¼Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ñкого компьютера \"%s\" в IP-Ð°Ð´Ñ€ÐµÑ Ð½Ðµ удалоÑÑŒ: %s." -#: libpq/auth.c:523 +#: libpq/auth.c:520 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "Получить Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° из IP-адреÑа клиента не удалоÑÑŒ: %s." #. translator: last %s describes encryption state -#: libpq/auth.c:531 +#: libpq/auth.c:528 #, c-format msgid "" "no pg_hba.conf entry for replication connection from host \"%s\", user " @@ -15508,255 +16499,242 @@ msgstr "" "компьютера \"%s\" Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\", %s" #. translator: last %s describes encryption state -#: libpq/auth.c:539 +#: libpq/auth.c:536 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "" "в pg_hba.conf нет запиÑи Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° \"%s\", Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\", базы " "\"%s\", %s" -#: libpq/auth.c:712 +#: libpq/auth.c:656 +#, c-format +msgid "connection authenticated: user=\"%s\" method=%s (%s:%d)" +msgstr "Ñоединение аутентифицировано: пользователь=\"%s\" метод=%s (%s:%d)" + +#: libpq/auth.c:725 #, c-format msgid "expected password response, got message type %d" msgstr "ожидалÑÑ Ð¾Ñ‚Ð²ÐµÑ‚ Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼, но получено Ñообщение %d" -#: libpq/auth.c:733 +#: libpq/auth.c:746 #, c-format msgid "invalid password packet size" msgstr "неверный размер пакета Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼" -#: libpq/auth.c:751 +#: libpq/auth.c:764 #, c-format msgid "empty password returned by client" msgstr "клиент возвратил пуÑтой пароль" -#: libpq/auth.c:880 libpq/hba.c:1335 -#, c-format -msgid "" -"MD5 authentication is not supported when \"db_user_namespace\" is enabled" -msgstr "" -"проверка подлинноÑти MD5 не поддерживаетÑÑ, когда включён режим " -"\"db_user_namespace\"" - -#: libpq/auth.c:886 +#: libpq/auth.c:892 #, c-format msgid "could not generate random MD5 salt" msgstr "не удалоÑÑŒ Ñгенерировать Ñлучайную Ñоль Ð´Ð»Ñ MD5" -#: libpq/auth.c:935 libpq/be-secure-gssapi.c:535 +#: libpq/auth.c:943 libpq/be-secure-gssapi.c:540 #, c-format msgid "could not set environment: %m" msgstr "не удалоÑÑŒ задать переменную окружениÑ: %m" -#: libpq/auth.c:971 +#: libpq/auth.c:982 #, c-format msgid "expected GSS response, got message type %d" msgstr "ожидалÑÑ Ð¾Ñ‚Ð²ÐµÑ‚ GSS, но получено Ñообщение %d" -#: libpq/auth.c:1031 +#: libpq/auth.c:1048 msgid "accepting GSS security context failed" msgstr "принÑть контекÑÑ‚ безопаÑноÑти GSS не удалоÑÑŒ" -#: libpq/auth.c:1072 +#: libpq/auth.c:1089 msgid "retrieving GSS user name failed" msgstr "получить Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ GSS не удалоÑÑŒ" -#: libpq/auth.c:1221 +#: libpq/auth.c:1235 msgid "could not acquire SSPI credentials" msgstr "не удалоÑÑŒ получить удоÑтоверение SSPI" -#: libpq/auth.c:1246 +#: libpq/auth.c:1260 #, c-format msgid "expected SSPI response, got message type %d" msgstr "ожидалÑÑ Ð¾Ñ‚Ð²ÐµÑ‚ SSPI, но получено Ñообщение %d" -#: libpq/auth.c:1324 +#: libpq/auth.c:1338 msgid "could not accept SSPI security context" msgstr "принÑть контекÑÑ‚ безопаÑноÑти SSPI не удалоÑÑŒ" -#: libpq/auth.c:1386 +#: libpq/auth.c:1379 msgid "could not get token from SSPI security context" msgstr "не удалоÑÑŒ получить маркер из контекÑта безопаÑноÑти SSPI" -#: libpq/auth.c:1525 libpq/auth.c:1544 +#: libpq/auth.c:1515 libpq/auth.c:1534 #, c-format msgid "could not translate name" msgstr "не удалоÑÑŒ преобразовать имÑ" -#: libpq/auth.c:1557 +#: libpq/auth.c:1547 #, c-format msgid "realm name too long" msgstr "Ð¸Ð¼Ñ Ð¾Ð±Ð»Ð°Ñти Ñлишком длинное" -#: libpq/auth.c:1572 +#: libpq/auth.c:1562 #, c-format msgid "translated account name too long" msgstr "преобразованное Ð¸Ð¼Ñ ÑƒÑ‡Ñ‘Ñ‚Ð½Ð¾Ð¹ запиÑи Ñлишком длинное" -#: libpq/auth.c:1753 +#: libpq/auth.c:1741 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "не удалоÑÑŒ Ñоздать Ñокет Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу Ident: %m" -#: libpq/auth.c:1768 +#: libpq/auth.c:1756 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "не удалоÑÑŒ привÑзатьÑÑ Ðº локальному адреÑу \"%s\": %m" -#: libpq/auth.c:1780 +#: libpq/auth.c:1768 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "не удалоÑÑŒ подключитьÑÑ Ðº Ñерверу Ident по адреÑу \"%s\", порт %s: %m" -#: libpq/auth.c:1802 +#: libpq/auth.c:1790 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "" "не удалоÑÑŒ отправить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñерверу Ident по адреÑу \"%s\", порт %s: %m" -#: libpq/auth.c:1819 +#: libpq/auth.c:1807 #, c-format msgid "" "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "" "не удалоÑÑŒ получить ответ от Ñервера Ident по адреÑу \"%s\", порт %s: %m" -#: libpq/auth.c:1829 +#: libpq/auth.c:1817 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "неверно форматированный ответ от Ñервера Ident: \"%s\"" -#: libpq/auth.c:1882 +#: libpq/auth.c:1870 #, c-format msgid "peer authentication is not supported on this platform" msgstr "проверка подлинноÑти peer в Ñтой ОС не поддерживаетÑÑ" -#: libpq/auth.c:1886 +#: libpq/auth.c:1874 #, c-format msgid "could not get peer credentials: %m" msgstr "не удалоÑÑŒ получить данные Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ‡ÐµÑ€ÐµÐ· механизм peer: %m" -#: libpq/auth.c:1898 +#: libpq/auth.c:1886 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "найти локального Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ идентификатору (%ld) не удалоÑÑŒ: %s" -#: libpq/auth.c:1999 +#: libpq/auth.c:1988 #, c-format msgid "error from underlying PAM layer: %s" msgstr "ошибка в нижележащем Ñлое PAM: %s" -#: libpq/auth.c:2010 +#: libpq/auth.c:1999 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "неподдерживаемое Ñообщение ответа PAM %d/\"%s\"" -#: libpq/auth.c:2070 +#: libpq/auth.c:2056 #, c-format msgid "could not create PAM authenticator: %s" msgstr "не удалоÑÑŒ Ñоздать аутентификатор PAM: %s" -#: libpq/auth.c:2081 +#: libpq/auth.c:2067 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "ошибка в pam_set_item(PAM_USER): %s" -#: libpq/auth.c:2113 +#: libpq/auth.c:2099 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "ошибка в pam_set_item(PAM_RHOST): %s" -#: libpq/auth.c:2125 +#: libpq/auth.c:2111 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "ошибка в pam_set_item(PAM_CONV): %s" -#: libpq/auth.c:2138 +#: libpq/auth.c:2124 #, c-format msgid "pam_authenticate failed: %s" msgstr "ошибка в pam_authenticate: %s" -#: libpq/auth.c:2151 +#: libpq/auth.c:2137 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "ошибка в pam_acct_mgmt: %s" -#: libpq/auth.c:2162 +#: libpq/auth.c:2148 #, c-format msgid "could not release PAM authenticator: %s" msgstr "не удалоÑÑŒ оÑвободить аутентификатор PAM: %s" -#: libpq/auth.c:2242 +#: libpq/auth.c:2228 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "не удалоÑÑŒ инициализировать LDAP (код ошибки: %d)" -#: libpq/auth.c:2279 +#: libpq/auth.c:2265 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "не удалоÑÑŒ извлечь Ð¸Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð° из ldapbasedn" -#: libpq/auth.c:2287 +#: libpq/auth.c:2273 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ LDAP не удалоÑÑŒ найти запиÑи DNS SRV Ð´Ð»Ñ \"%s\"" -#: libpq/auth.c:2289 +#: libpq/auth.c:2275 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Задайте Ð¸Ð¼Ñ Ñервера LDAP Ñвным образом." -#: libpq/auth.c:2341 +#: libpq/auth.c:2327 #, c-format msgid "could not initialize LDAP: %s" msgstr "не удалоÑÑŒ инициализировать LDAP: %s" -#: libpq/auth.c:2351 +#: libpq/auth.c:2337 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "протокол ldaps Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ библиотекой LDAP не поддерживаетÑÑ" -#: libpq/auth.c:2359 +#: libpq/auth.c:2345 #, c-format msgid "could not initialize LDAP: %m" msgstr "не удалоÑÑŒ инициализировать LDAP: %m" -#: libpq/auth.c:2369 +#: libpq/auth.c:2355 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "не удалоÑÑŒ задать верÑию протокола LDAP: %s" -#: libpq/auth.c:2409 -#, c-format -msgid "could not load function _ldap_start_tls_sA in wldap32.dll" -msgstr "не удалоÑÑŒ найти функцию _ldap_start_tls_sA в wldap32.dll" - -#: libpq/auth.c:2410 -#, c-format -msgid "LDAP over SSL is not supported on this platform." -msgstr "LDAP через SSL не поддерживаетÑÑ Ð² Ñтой ОС." - -#: libpq/auth.c:2426 +#: libpq/auth.c:2371 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "не удалоÑÑŒ начать ÑÐµÐ°Ð½Ñ LDAP TLS: %s" -#: libpq/auth.c:2497 +#: libpq/auth.c:2448 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP-Ñервер не задан и значение ldapbasedn не определено" -#: libpq/auth.c:2504 +#: libpq/auth.c:2455 #, c-format msgid "LDAP server not specified" msgstr "LDAP-Ñервер не определён" -#: libpq/auth.c:2566 +#: libpq/auth.c:2517 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "недопуÑтимый Ñимвол в имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ подлинноÑти LDAP" -#: libpq/auth.c:2583 +#: libpq/auth.c:2534 #, c-format msgid "" "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": " @@ -15765,28 +16743,28 @@ msgstr "" "не удалоÑÑŒ выполнить начальную привÑзку LDAP Ð´Ð»Ñ ldapbinddn \"%s\" на " "Ñервере \"%s\": %s" -#: libpq/auth.c:2612 +#: libpq/auth.c:2564 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "" "не удалоÑÑŒ выполнить LDAP-поиÑк по фильтру \"%s\" на Ñервере \"%s\": %s" -#: libpq/auth.c:2626 +#: libpq/auth.c:2580 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "в LDAP нет Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\"" -#: libpq/auth.c:2627 +#: libpq/auth.c:2581 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "LDAP-поиÑк по фильтру \"%s\" на Ñервере \"%s\" не вернул результатов" -#: libpq/auth.c:2631 +#: libpq/auth.c:2585 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "пользователь LDAP \"%s\" не уникален" -#: libpq/auth.c:2632 +#: libpq/auth.c:2586 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "" @@ -15795,7 +16773,7 @@ msgstr[0] "LDAP-поиÑк по фильтру \"%s\" на Ñервере \"%s\" msgstr[1] "LDAP-поиÑк по фильтру \"%s\" на Ñервере \"%s\" вернул %d запиÑи." msgstr[2] "LDAP-поиÑк по фильтру \"%s\" на Ñервере \"%s\" вернул %d запиÑей." -#: libpq/auth.c:2652 +#: libpq/auth.c:2606 #, c-format msgid "" "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" @@ -15803,24 +16781,18 @@ msgstr "" "не удалоÑÑŒ получить dn Ð´Ð»Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ результата, ÑоответÑтвующего \"%s\" на " "Ñервере \"%s\": %s" -#: libpq/auth.c:2673 -#, c-format -msgid "could not unbind after searching for user \"%s\" on server \"%s\"" -msgstr "" -"не удалоÑÑŒ отвÑзатьÑÑ Ð¿Ð¾Ñле поиÑка Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" на Ñервере \"%s\"" - -#: libpq/auth.c:2704 +#: libpq/auth.c:2633 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "" "ошибка при региÑтрации в LDAP Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" на Ñервере \"%s\": %s" -#: libpq/auth.c:2736 +#: libpq/auth.c:2665 #, c-format msgid "LDAP diagnostics: %s" msgstr "ДиагноÑтика LDAP: %s" -#: libpq/auth.c:2774 +#: libpq/auth.c:2703 #, c-format msgid "" "certificate authentication failed for user \"%s\": client certificate " @@ -15829,7 +16801,7 @@ msgstr "" "ошибка проверки подлинноÑти Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" по Ñертификату: Ñертификат " "клиента не Ñодержит Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" -#: libpq/auth.c:2795 +#: libpq/auth.c:2724 #, c-format msgid "" "certificate authentication failed for user \"%s\": unable to retrieve " @@ -15838,7 +16810,7 @@ msgstr "" "пользователь \"%s\" не прошёл проверку подлинноÑти по Ñертификату: не " "удалоÑÑŒ получить DN Ñубъекта" -#: libpq/auth.c:2818 +#: libpq/auth.c:2747 #, c-format msgid "" "certificate validation (clientcert=verify-full) failed for user \"%s\": DN " @@ -15847,7 +16819,7 @@ msgstr "" "проверка Ñертификата (clientcert=verify-full) Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" не " "прошла: отличаетÑÑ DN" -#: libpq/auth.c:2823 +#: libpq/auth.c:2752 #, c-format msgid "" "certificate validation (clientcert=verify-full) failed for user \"%s\": CN " @@ -15856,205 +16828,192 @@ msgstr "" "проверка Ñертификата (clientcert=verify-full) Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" не " "прошла: отличаетÑÑ CN" -#: libpq/auth.c:2925 +#: libpq/auth.c:2854 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-Ñервер не определён" -#: libpq/auth.c:2932 +#: libpq/auth.c:2861 #, c-format msgid "RADIUS secret not specified" msgstr "Ñекрет RADIUS не определён" # well-spelled: Ñимв -#: libpq/auth.c:2946 +#: libpq/auth.c:2875 #, c-format msgid "" "RADIUS authentication does not support passwords longer than %d characters" msgstr "проверка подлинноÑти RADIUS не поддерживает пароли длиннее %d Ñимв." -#: libpq/auth.c:3053 libpq/hba.c:1976 +#: libpq/auth.c:2977 libpq/hba.c:2352 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "не удалоÑÑŒ преобразовать Ð¸Ð¼Ñ Ñервера RADIUS \"%s\" в адреÑ: %s" -#: libpq/auth.c:3067 +#: libpq/auth.c:2991 #, c-format msgid "could not generate random encryption vector" msgstr "не удалоÑÑŒ Ñгенерировать Ñлучайный вектор шифрованиÑ" -#: libpq/auth.c:3104 +#: libpq/auth.c:3028 #, c-format msgid "could not perform MD5 encryption of password: %s" msgstr "не удалоÑÑŒ вычиÑлить MD5-хеш паролÑ: %s" -#: libpq/auth.c:3131 +#: libpq/auth.c:3055 #, c-format msgid "could not create RADIUS socket: %m" msgstr "не удалоÑÑŒ Ñоздать Ñокет RADIUS: %m" -#: libpq/auth.c:3153 +#: libpq/auth.c:3071 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "не удалоÑÑŒ привÑзатьÑÑ Ðº локальному Ñокету RADIUS: %m" -#: libpq/auth.c:3163 +#: libpq/auth.c:3081 #, c-format msgid "could not send RADIUS packet: %m" msgstr "не удалоÑÑŒ отправить пакет RADIUS: %m" -#: libpq/auth.c:3197 libpq/auth.c:3223 +#: libpq/auth.c:3115 libpq/auth.c:3141 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "превышено Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð° RADIUS от %s" -#: libpq/auth.c:3216 +#: libpq/auth.c:3134 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "не удалоÑÑŒ проверить ÑоÑтоÑние Ñокета RADIUS: %m" -#: libpq/auth.c:3246 +#: libpq/auth.c:3164 #, c-format msgid "could not read RADIUS response: %m" msgstr "не удалоÑÑŒ прочитать ответ RADIUS: %m" -#: libpq/auth.c:3259 libpq/auth.c:3263 +#: libpq/auth.c:3172 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "ответ RADIUS от %s был отправлен Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð³Ð¾ порта: %d" -#: libpq/auth.c:3272 +#: libpq/auth.c:3180 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "Ñлишком короткий ответ RADIUS от %s: %d" -#: libpq/auth.c:3279 +#: libpq/auth.c:3187 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "в ответе RADIUS от %s иÑпорчена длина: %d (фактичеÑÐºÐ°Ñ Ð´Ð»Ð¸Ð½Ð° %d)" -#: libpq/auth.c:3287 +#: libpq/auth.c:3195 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "пришёл ответ RADIUS от %s на другой запроÑ: %d (ожидалÑÑ %d)" -#: libpq/auth.c:3312 +#: libpq/auth.c:3220 #, c-format msgid "could not perform MD5 encryption of received packet: %s" msgstr "не удалоÑÑŒ вычиÑлить MD5-хеш Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñтого пакета: %s" -#: libpq/auth.c:3322 +#: libpq/auth.c:3230 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "ответ RADIUS от %s Ñодержит неверную подпиÑÑŒ MD5" -#: libpq/auth.c:3340 +#: libpq/auth.c:3248 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "ответ RADIUS от %s Ñодержит неверный код (%d) Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\"" -#: libpq/be-fsstubs.c:128 libpq/be-fsstubs.c:157 libpq/be-fsstubs.c:185 -#: libpq/be-fsstubs.c:211 libpq/be-fsstubs.c:236 libpq/be-fsstubs.c:274 -#: libpq/be-fsstubs.c:297 libpq/be-fsstubs.c:545 +#: libpq/be-fsstubs.c:133 libpq/be-fsstubs.c:162 libpq/be-fsstubs.c:190 +#: libpq/be-fsstubs.c:216 libpq/be-fsstubs.c:241 libpq/be-fsstubs.c:283 +#: libpq/be-fsstubs.c:306 libpq/be-fsstubs.c:560 #, c-format msgid "invalid large-object descriptor: %d" msgstr "неверный деÑкриптор большого объекта: %d" -#: libpq/be-fsstubs.c:168 +#: libpq/be-fsstubs.c:173 #, c-format msgid "large object descriptor %d was not opened for reading" msgstr "деÑкриптор большого объекта %d не был открыт Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ" -#: libpq/be-fsstubs.c:192 libpq/be-fsstubs.c:552 +#: libpq/be-fsstubs.c:197 libpq/be-fsstubs.c:567 #, c-format msgid "large object descriptor %d was not opened for writing" msgstr "деÑкриптор большого объекта %d не был открыт Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи" -#: libpq/be-fsstubs.c:219 +#: libpq/be-fsstubs.c:224 #, c-format msgid "lo_lseek result out of range for large-object descriptor %d" msgstr "" "результат lo_lseek Ð´Ð»Ñ Ð´ÐµÑкриптора большого объекта %d вне допуÑтимого " "диапазона" -#: libpq/be-fsstubs.c:282 +#: libpq/be-fsstubs.c:291 #, c-format msgid "lo_tell result out of range for large-object descriptor %d" msgstr "" "результат lo_tell Ð´Ð»Ñ Ð´ÐµÑкриптора большого объекта %d вне допуÑтимого " "диапазона" -#: libpq/be-fsstubs.c:424 +#: libpq/be-fsstubs.c:439 #, c-format msgid "could not open server file \"%s\": %m" msgstr "не удалоÑÑŒ открыть файл Ñервера \"%s\": %m" -#: libpq/be-fsstubs.c:447 +#: libpq/be-fsstubs.c:462 #, c-format msgid "could not read server file \"%s\": %m" msgstr "не удалоÑÑŒ прочитать файл Ñервера \"%s\": %m" -#: libpq/be-fsstubs.c:506 +#: libpq/be-fsstubs.c:521 #, c-format msgid "could not create server file \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать файл Ñервера \"%s\": %m" -#: libpq/be-fsstubs.c:518 +#: libpq/be-fsstubs.c:533 #, c-format msgid "could not write server file \"%s\": %m" msgstr "не удалоÑÑŒ запиÑать файл Ñервера \"%s\": %m" -#: libpq/be-fsstubs.c:758 +#: libpq/be-fsstubs.c:774 #, c-format msgid "large object read request is too large" msgstr "при чтении большого объекта запрошен чрезмерный размер" -#: libpq/be-fsstubs.c:800 utils/adt/genfile.c:262 utils/adt/genfile.c:301 -#: utils/adt/genfile.c:337 +#: libpq/be-fsstubs.c:816 utils/adt/genfile.c:248 utils/adt/genfile.c:269 #, c-format msgid "requested length cannot be negative" msgstr "Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° не может быть отрицательной" -#: libpq/be-fsstubs.c:851 storage/large_object/inv_api.c:299 -#: storage/large_object/inv_api.c:311 storage/large_object/inv_api.c:508 -#: storage/large_object/inv_api.c:619 storage/large_object/inv_api.c:809 +#: libpq/be-secure-common.c:94 #, c-format -msgid "permission denied for large object %u" -msgstr "нет доÑтупа к большому объекту %u" +msgid "command \"%s\" failed" +msgstr "ошибка команды \"%s\"" -#: libpq/be-secure-common.c:93 -#, c-format -msgid "could not read from command \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать вывод команды \"%s\": %m" - -#: libpq/be-secure-common.c:113 -#, c-format -msgid "command \"%s\" failed" -msgstr "ошибка команды \"%s\"" - -#: libpq/be-secure-common.c:141 +#: libpq/be-secure-common.c:123 #, c-format msgid "could not access private key file \"%s\": %m" msgstr "не удалоÑÑŒ обратитьÑÑ Ðº файлу закрытого ключа \"%s\": %m" -#: libpq/be-secure-common.c:151 +#: libpq/be-secure-common.c:133 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "файл закрытого ключа \"%s\" - не обычный файл" -#: libpq/be-secure-common.c:177 +#: libpq/be-secure-common.c:159 #, c-format msgid "private key file \"%s\" must be owned by the database user or root" msgstr "" "файл закрытого ключа \"%s\" должен принадлежать пользователю, запуÑкающему " "Ñервер, или root" -#: libpq/be-secure-common.c:187 +#: libpq/be-secure-common.c:169 #, c-format msgid "private key file \"%s\" has group or world access" msgstr "к файлу закрытого ключа \"%s\" имеют доÑтуп вÑе или группа" -#: libpq/be-secure-common.c:189 +#: libpq/be-secure-common.c:171 #, c-format msgid "" "File must have permissions u=rw (0600) or less if owned by the database " @@ -16064,16 +17023,16 @@ msgstr "" "он принадлежит пользователю Ñервера, либо u=rw,g=r (0640) или более Ñтрогие, " "еÑли он принадлежит root." -#: libpq/be-secure-gssapi.c:204 +#: libpq/be-secure-gssapi.c:201 msgid "GSSAPI wrap error" msgstr "ошибка Ð¾Ð±Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² GSSAPI" -#: libpq/be-secure-gssapi.c:211 +#: libpq/be-secure-gssapi.c:208 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "иÑходÑщее Ñообщение GSSAPI не будет защищено" -#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:622 +#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "Ñервер попыталÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ чрезмерно большой пакет GSSAPI (%zu > %zu)" @@ -16092,95 +17051,95 @@ msgstr "ошибка Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² GSSAPI" msgid "incoming GSSAPI message did not use confidentiality" msgstr "входÑщее Ñообщение GSSAPI не защищено" -#: libpq/be-secure-gssapi.c:570 +#: libpq/be-secure-gssapi.c:575 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %d)" msgstr "клиент передал чрезмерно большой пакет GSSAPI (%zu > %d)" -#: libpq/be-secure-gssapi.c:594 +#: libpq/be-secure-gssapi.c:600 msgid "could not accept GSSAPI security context" msgstr "принÑть контекÑÑ‚ безопаÑноÑти GSSAPI не удалоÑÑŒ" -#: libpq/be-secure-gssapi.c:689 +#: libpq/be-secure-gssapi.c:701 msgid "GSSAPI size check error" msgstr "ошибка проверки размера в GSSAPI" -#: libpq/be-secure-openssl.c:122 +#: libpq/be-secure-openssl.c:131 #, c-format msgid "could not create SSL context: %s" msgstr "не удалоÑÑŒ Ñоздать контекÑÑ‚ SSL: %s" -#: libpq/be-secure-openssl.c:148 +#: libpq/be-secure-openssl.c:157 #, c-format msgid "could not load server certificate file \"%s\": %s" msgstr "не удалоÑÑŒ загрузить Ñертификат Ñервера \"%s\": %s" -#: libpq/be-secure-openssl.c:168 +#: libpq/be-secure-openssl.c:177 #, c-format msgid "" "private key file \"%s\" cannot be reloaded because it requires a passphrase" msgstr "" "файл закрытого ключа \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ, так как он защищён паролем" -#: libpq/be-secure-openssl.c:173 +#: libpq/be-secure-openssl.c:182 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "не удалоÑÑŒ загрузить файл закрытого ключа \"%s\": %s" -#: libpq/be-secure-openssl.c:182 +#: libpq/be-secure-openssl.c:191 #, c-format msgid "check of private key failed: %s" msgstr "ошибка при проверке закрытого ключа: %s" #. translator: first %s is a GUC option name, second %s is its value -#: libpq/be-secure-openssl.c:195 libpq/be-secure-openssl.c:218 +#: libpq/be-secure-openssl.c:204 libpq/be-secure-openssl.c:227 #, c-format msgid "\"%s\" setting \"%s\" not supported by this build" msgstr "Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\" значение \"%s\" не поддерживаетÑÑ Ð² данной Ñборке" -#: libpq/be-secure-openssl.c:205 +#: libpq/be-secure-openssl.c:214 #, c-format msgid "could not set minimum SSL protocol version" msgstr "не удалоÑÑŒ задать минимальную верÑию протокола SSL" -#: libpq/be-secure-openssl.c:228 +#: libpq/be-secure-openssl.c:237 #, c-format msgid "could not set maximum SSL protocol version" msgstr "не удалоÑÑŒ задать макÑимальную верÑию протокола SSL" -#: libpq/be-secure-openssl.c:244 +#: libpq/be-secure-openssl.c:253 #, c-format msgid "could not set SSL protocol version range" msgstr "не удалоÑÑŒ задать диапазон верÑий протокола SSL" -#: libpq/be-secure-openssl.c:245 +#: libpq/be-secure-openssl.c:254 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "ВерÑÐ¸Ñ \"%s\" не может быть выше \"%s\"" -#: libpq/be-secure-openssl.c:282 +#: libpq/be-secure-openssl.c:307 #, c-format msgid "could not set the cipher list (no valid ciphers available)" msgstr "не удалоÑÑŒ уÑтановить ÑпиÑок шифров (подходÑщие шифры отÑутÑтвуют)" -#: libpq/be-secure-openssl.c:302 +#: libpq/be-secure-openssl.c:327 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "не удалоÑÑŒ загрузить файл корневых Ñертификатов \"%s\": %s" -#: libpq/be-secure-openssl.c:351 +#: libpq/be-secure-openssl.c:376 #, c-format msgid "could not load SSL certificate revocation list file \"%s\": %s" msgstr "" "не удалоÑÑŒ загрузить ÑпиÑок отзыва Ñертификатов SSL из файла \"%s\": %s" -#: libpq/be-secure-openssl.c:359 +#: libpq/be-secure-openssl.c:384 #, c-format msgid "could not load SSL certificate revocation list directory \"%s\": %s" msgstr "" "не удалоÑÑŒ загрузить ÑпиÑки отзыва Ñертификатов SSL из каталога \"%s\": %s" -#: libpq/be-secure-openssl.c:367 +#: libpq/be-secure-openssl.c:392 #, c-format msgid "" "could not load SSL certificate revocation list file \"%s\" or directory " @@ -16189,38 +17148,38 @@ msgstr "" "не удалоÑÑŒ загрузить ÑпиÑки отзыва Ñертификатов SSL из файла \"%s\" или " "каталога \"%s\": %s" -#: libpq/be-secure-openssl.c:425 +#: libpq/be-secure-openssl.c:450 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "" "инициализировать SSL-подключение не удалоÑÑŒ: контекÑÑ‚ SSL не уÑтановлен" -#: libpq/be-secure-openssl.c:436 +#: libpq/be-secure-openssl.c:464 #, c-format msgid "could not initialize SSL connection: %s" msgstr "инициализировать SSL-подключение не удалоÑÑŒ: %s" -#: libpq/be-secure-openssl.c:444 +#: libpq/be-secure-openssl.c:472 #, c-format msgid "could not set SSL socket: %s" msgstr "не удалоÑÑŒ Ñоздать SSL-Ñокет: %s" -#: libpq/be-secure-openssl.c:499 +#: libpq/be-secure-openssl.c:528 #, c-format msgid "could not accept SSL connection: %m" msgstr "не удалоÑÑŒ принÑть SSL-подключение: %m" -#: libpq/be-secure-openssl.c:503 libpq/be-secure-openssl.c:556 +#: libpq/be-secure-openssl.c:532 libpq/be-secure-openssl.c:589 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "не удалоÑÑŒ принÑть SSL-подключение: обрыв данных" -#: libpq/be-secure-openssl.c:542 +#: libpq/be-secure-openssl.c:573 #, c-format msgid "could not accept SSL connection: %s" msgstr "не удалоÑÑŒ принÑть SSL-подключение: %s" -#: libpq/be-secure-openssl.c:545 +#: libpq/be-secure-openssl.c:577 #, c-format msgid "" "This may indicate that the client does not support any SSL protocol version " @@ -16229,225 +17188,240 @@ msgstr "" "Это может указывать на то, что клиент не поддерживает ни одну верÑию " "протокола SSL между %s и %s." -#: libpq/be-secure-openssl.c:561 libpq/be-secure-openssl.c:741 -#: libpq/be-secure-openssl.c:805 +#: libpq/be-secure-openssl.c:594 libpq/be-secure-openssl.c:809 +#: libpq/be-secure-openssl.c:879 #, c-format msgid "unrecognized SSL error code: %d" msgstr "нераÑпознанный код ошибки SSL: %d" -#: libpq/be-secure-openssl.c:607 +#: libpq/be-secure-openssl.c:622 +#, c-format +msgid "received SSL connection request with unexpected ALPN protocol" +msgstr "получен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° SSL-подключение Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтным протоколом ALPN" + +#: libpq/be-secure-openssl.c:666 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "Ð˜Ð¼Ñ SSL-Ñертификата включает нулевой байт" -#: libpq/be-secure-openssl.c:647 +#: libpq/be-secure-openssl.c:712 #, c-format msgid "SSL certificate's distinguished name contains embedded null" msgstr "уникальное Ð¸Ð¼Ñ (DN) в SSL-Ñертификате Ñодержит нулевой байт" -#: libpq/be-secure-openssl.c:730 libpq/be-secure-openssl.c:789 +#: libpq/be-secure-openssl.c:798 libpq/be-secure-openssl.c:863 #, c-format msgid "SSL error: %s" msgstr "ошибка SSL: %s" -#: libpq/be-secure-openssl.c:971 +#: libpq/be-secure-openssl.c:1038 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "не удалоÑÑŒ открыть файл параметров DH \"%s\": %m" -#: libpq/be-secure-openssl.c:983 +#: libpq/be-secure-openssl.c:1050 #, c-format msgid "could not load DH parameters file: %s" msgstr "не удалоÑÑŒ загрузить файл параметров DH: %s" -#: libpq/be-secure-openssl.c:993 +#: libpq/be-secure-openssl.c:1060 #, c-format msgid "invalid DH parameters: %s" msgstr "неверные параметры DH: %s" -#: libpq/be-secure-openssl.c:1002 +#: libpq/be-secure-openssl.c:1069 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "неверные параметры DH: p - не проÑтое чиÑло" -#: libpq/be-secure-openssl.c:1011 +#: libpq/be-secure-openssl.c:1078 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "" "неверные параметры DH: нет подходÑщего генератора или небезопаÑное проÑтое " "чиÑло" -#: libpq/be-secure-openssl.c:1172 +#: libpq/be-secure-openssl.c:1214 +#, c-format +msgid "Client certificate verification failed at depth %d: %s." +msgstr "Ошибка при проверке клиентÑкого Ñертификата на глубине %d: %s." + +#: libpq/be-secure-openssl.c:1251 +#, c-format +msgid "" +"Failed certificate data (unverified): subject \"%s\", serial number %s, " +"issuer \"%s\"." +msgstr "" +"Данные ошибочного Ñертификата (непроверенные): Ñубъект \"%s\", Ñерийный " +"номер %s, издатель \"%s\"." + +#: libpq/be-secure-openssl.c:1252 +msgid "unknown" +msgstr "н/д" + +#: libpq/be-secure-openssl.c:1389 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: не удалоÑÑŒ загрузить параметры DH" -#: libpq/be-secure-openssl.c:1180 +#: libpq/be-secure-openssl.c:1397 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: не удалоÑÑŒ задать параметры DH: %s" -#: libpq/be-secure-openssl.c:1207 +#: libpq/be-secure-openssl.c:1424 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: нераÑпознанное Ð¸Ð¼Ñ ÐºÑ€Ð¸Ð²Ð¾Ð¹: %s" -#: libpq/be-secure-openssl.c:1216 +#: libpq/be-secure-openssl.c:1433 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: не удалоÑÑŒ Ñоздать ключ" -#: libpq/be-secure-openssl.c:1244 +#: libpq/be-secure-openssl.c:1461 msgid "no SSL error reported" msgstr "нет ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибке SSL" -#: libpq/be-secure-openssl.c:1248 +#: libpq/be-secure-openssl.c:1479 #, c-format msgid "SSL error code %lu" msgstr "код ошибки SSL: %lu" -#: libpq/be-secure-openssl.c:1402 +#: libpq/be-secure-openssl.c:1636 #, c-format msgid "could not create BIO" msgstr "не удалоÑÑŒ Ñоздать BIO" -#: libpq/be-secure-openssl.c:1412 +#: libpq/be-secure-openssl.c:1646 #, c-format msgid "could not get NID for ASN1_OBJECT object" msgstr "не удалоÑÑŒ получить NID Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° ASN1_OBJECT" -#: libpq/be-secure-openssl.c:1420 +#: libpq/be-secure-openssl.c:1654 #, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" msgstr "не удалоÑÑŒ преобразовать NID %d в Ñтруктуру ASN1_OBJECT" -#: libpq/be-secure.c:209 libpq/be-secure.c:305 -#, c-format -msgid "terminating connection due to unexpected postmaster exit" -msgstr "закрытие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·-за неожиданного Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ процеÑÑа" - -#: libpq/crypt.c:49 +#: libpq/crypt.c:48 #, c-format msgid "Role \"%s\" does not exist." msgstr "Роль \"%s\" не ÑущеÑтвует." -#: libpq/crypt.c:59 +#: libpq/crypt.c:58 #, c-format msgid "User \"%s\" has no password assigned." msgstr "Пользователь \"%s\" не имеет паролÑ." -#: libpq/crypt.c:77 +#: libpq/crypt.c:76 #, c-format msgid "User \"%s\" has an expired password." msgstr "Срок дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" иÑтёк." -#: libpq/crypt.c:181 +#: libpq/crypt.c:182 #, c-format msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "" "Пользователь \"%s\" имеет пароль, неподходÑщий Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ по MD5." -#: libpq/crypt.c:202 libpq/crypt.c:244 libpq/crypt.c:264 +#: libpq/crypt.c:203 libpq/crypt.c:245 libpq/crypt.c:265 #, c-format msgid "Password does not match for user \"%s\"." msgstr "Пароль не подходит Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\"." -#: libpq/crypt.c:283 +#: libpq/crypt.c:284 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "Пароль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" предÑтавлен в неизвеÑтном формате." -#: libpq/hba.c:209 +#: libpq/hba.c:327 #, c-format -msgid "authentication file token too long, skipping: \"%s\"" -msgstr "" -"Ñлишком длинный Ñлемент в файле конфигурации безопаÑноÑти пропуÑкаетÑÑ: " -"\"%s\"" +msgid "invalid regular expression \"%s\": %s" +msgstr "неверное регулÑрное выражение \"%s\": %s" -#: libpq/hba.c:381 +#: libpq/hba.c:329 libpq/hba.c:661 libpq/hba.c:1245 libpq/hba.c:1265 +#: libpq/hba.c:1288 libpq/hba.c:1301 libpq/hba.c:1354 libpq/hba.c:1382 +#: libpq/hba.c:1390 libpq/hba.c:1402 libpq/hba.c:1423 libpq/hba.c:1436 +#: libpq/hba.c:1461 libpq/hba.c:1488 libpq/hba.c:1500 libpq/hba.c:1559 +#: libpq/hba.c:1579 libpq/hba.c:1593 libpq/hba.c:1613 libpq/hba.c:1624 +#: libpq/hba.c:1639 libpq/hba.c:1658 libpq/hba.c:1674 libpq/hba.c:1686 +#: libpq/hba.c:1752 libpq/hba.c:1765 libpq/hba.c:1787 libpq/hba.c:1799 +#: libpq/hba.c:1817 libpq/hba.c:1867 libpq/hba.c:1911 libpq/hba.c:1922 +#: libpq/hba.c:1938 libpq/hba.c:1955 libpq/hba.c:1966 libpq/hba.c:1985 +#: libpq/hba.c:2001 libpq/hba.c:2017 libpq/hba.c:2076 libpq/hba.c:2093 +#: libpq/hba.c:2106 libpq/hba.c:2118 libpq/hba.c:2137 libpq/hba.c:2223 +#: libpq/hba.c:2241 libpq/hba.c:2335 libpq/hba.c:2354 libpq/hba.c:2383 +#: libpq/hba.c:2396 libpq/hba.c:2419 libpq/hba.c:2441 libpq/hba.c:2455 +#: tsearch/ts_locale.c:241 #, c-format -msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" -msgstr "" -"не удалоÑÑŒ открыть дополнительный файл конфигурации безопаÑноÑти \"@%s\" как " -"\"%s\": %m" +msgid "line %d of configuration file \"%s\"" +msgstr "Ñтрока %d файла конфигурации \"%s\"" + +#: libpq/hba.c:457 +#, c-format +msgid "skipping missing authentication file \"%s\"" +msgstr "отÑутÑтвующий файл наÑтройки аутентификации \"%s\" пропуÑкаетÑÑ" + +#: libpq/hba.c:609 +#, c-format +msgid "could not open file \"%s\": maximum nesting depth exceeded" +msgstr "открыть файл \"%s\" не удалоÑÑŒ: превышен предел вложенноÑти" -#: libpq/hba.c:832 +#: libpq/hba.c:1216 #, c-format msgid "error enumerating network interfaces: %m" msgstr "ошибка при перечиÑлении Ñетевых интерфейÑов: %m" #. translator: the second %s is a list of auth methods -#: libpq/hba.c:859 +#: libpq/hba.c:1243 #, c-format msgid "" "authentication option \"%s\" is only valid for authentication methods %s" msgstr "параметр проверки подлинноÑти \"%s\" допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð² %s" -#: libpq/hba.c:861 libpq/hba.c:881 libpq/hba.c:916 libpq/hba.c:967 -#: libpq/hba.c:981 libpq/hba.c:1005 libpq/hba.c:1013 libpq/hba.c:1025 -#: libpq/hba.c:1046 libpq/hba.c:1059 libpq/hba.c:1079 libpq/hba.c:1101 -#: libpq/hba.c:1113 libpq/hba.c:1172 libpq/hba.c:1192 libpq/hba.c:1206 -#: libpq/hba.c:1226 libpq/hba.c:1237 libpq/hba.c:1252 libpq/hba.c:1271 -#: libpq/hba.c:1287 libpq/hba.c:1299 libpq/hba.c:1336 libpq/hba.c:1377 -#: libpq/hba.c:1390 libpq/hba.c:1412 libpq/hba.c:1424 libpq/hba.c:1442 -#: libpq/hba.c:1492 libpq/hba.c:1536 libpq/hba.c:1547 libpq/hba.c:1563 -#: libpq/hba.c:1580 libpq/hba.c:1591 libpq/hba.c:1610 libpq/hba.c:1626 -#: libpq/hba.c:1642 libpq/hba.c:1700 libpq/hba.c:1717 libpq/hba.c:1730 -#: libpq/hba.c:1742 libpq/hba.c:1761 libpq/hba.c:1847 libpq/hba.c:1865 -#: libpq/hba.c:1959 libpq/hba.c:1978 libpq/hba.c:2007 libpq/hba.c:2020 -#: libpq/hba.c:2043 libpq/hba.c:2065 libpq/hba.c:2079 tsearch/ts_locale.c:232 -#, c-format -msgid "line %d of configuration file \"%s\"" -msgstr "Ñтрока %d файла конфигурации \"%s\"" - -#: libpq/hba.c:879 +#: libpq/hba.c:1263 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "" "Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° проверки подлинноÑти \"%s\" требуетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ аргумент \"%s\"" -#: libpq/hba.c:903 +#: libpq/hba.c:1287 #, c-format -msgid "missing entry in file \"%s\" at end of line %d" -msgstr "отÑутÑтвует запиÑÑŒ в файле \"%s\" в конце Ñтроки %d" +msgid "missing entry at end of line" +msgstr "отÑутÑтвует запиÑÑŒ в конце Ñтроки" -#: libpq/hba.c:915 +#: libpq/hba.c:1300 #, c-format msgid "multiple values in ident field" msgstr "множеÑтвенные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² поле ident" -#: libpq/hba.c:965 +#: libpq/hba.c:1352 #, c-format msgid "multiple values specified for connection type" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¾ неÑколько значений" -#: libpq/hba.c:966 +#: libpq/hba.c:1353 #, c-format msgid "Specify exactly one connection type per line." msgstr "Определите в Ñтроке единÑтвенный тип подключениÑ." -#: libpq/hba.c:980 -#, c-format -msgid "local connections are not supported by this build" -msgstr "локальные Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ðµ поддерживаютÑÑ Ð² Ñтой Ñборке" - -#: libpq/hba.c:1003 +#: libpq/hba.c:1380 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "запиÑÑŒ Ñ hostssl недейÑтвительна, так как поддержка SSL отключена" -#: libpq/hba.c:1004 +#: libpq/hba.c:1381 #, c-format -msgid "Set ssl = on in postgresql.conf." -msgstr "УÑтановите ssl = on в postgresql.conf." +msgid "Set \"ssl = on\" in postgresql.conf." +msgstr "УÑтановите \"ssl = on\" в postgresql.conf." -#: libpq/hba.c:1012 +#: libpq/hba.c:1389 #, c-format msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "" "запиÑÑŒ Ñ hostssl недейÑтвительна, так как SSL не поддерживаетÑÑ Ð² Ñтой Ñборке" -#: libpq/hba.c:1024 +#: libpq/hba.c:1401 #, c-format msgid "" "hostgssenc record cannot match because GSSAPI is not supported by this build" @@ -16455,126 +17429,126 @@ msgstr "" "запиÑÑŒ Ñ hostgssenc недейÑтвительна, так как GSSAPI не поддерживаетÑÑ Ð² Ñтой " "Ñборке" -#: libpq/hba.c:1044 +#: libpq/hba.c:1421 #, c-format msgid "invalid connection type \"%s\"" msgstr "неверный тип Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ \"%s\"" -#: libpq/hba.c:1058 +#: libpq/hba.c:1435 #, c-format msgid "end-of-line before database specification" msgstr "конец Ñтроки перед определением базы данных" -#: libpq/hba.c:1078 +#: libpq/hba.c:1460 #, c-format msgid "end-of-line before role specification" msgstr "конец Ñтроки перед определением роли" -#: libpq/hba.c:1100 +#: libpq/hba.c:1487 #, c-format msgid "end-of-line before IP address specification" msgstr "конец Ñтроки перед определением IP-адреÑов" -#: libpq/hba.c:1111 +#: libpq/hba.c:1498 #, c-format msgid "multiple values specified for host address" msgstr "Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑа узла указано неÑколько значений" -#: libpq/hba.c:1112 +#: libpq/hba.c:1499 #, c-format msgid "Specify one address range per line." msgstr "Определите в Ñтроке один диапазон адреÑов." -#: libpq/hba.c:1170 +#: libpq/hba.c:1557 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "неверный IP-Ð°Ð´Ñ€ÐµÑ \"%s\": %s" -#: libpq/hba.c:1190 +#: libpq/hba.c:1577 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "указать одновременно и Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð°, и маÑку CIDR нельзÑ: \"%s\"" -#: libpq/hba.c:1204 +#: libpq/hba.c:1591 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¼Ð°Ñка CIDR в адреÑе \"%s\"" -#: libpq/hba.c:1224 +#: libpq/hba.c:1611 #, c-format msgid "end-of-line before netmask specification" msgstr "конец Ñтроки перед определением маÑки Ñети" -#: libpq/hba.c:1225 +#: libpq/hba.c:1612 #, c-format msgid "" "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "" "Укажите диапазон адреÑов в формате CIDR или задайте отдельную маÑку Ñети." -#: libpq/hba.c:1236 +#: libpq/hba.c:1623 #, c-format msgid "multiple values specified for netmask" msgstr "Ð´Ð»Ñ Ñетевой маÑки указано неÑколько значений" -#: libpq/hba.c:1250 +#: libpq/hba.c:1637 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¼Ð°Ñка IP \"%s\": %s" -#: libpq/hba.c:1270 +#: libpq/hba.c:1657 #, c-format msgid "IP address and mask do not match" msgstr "IP-Ð°Ð´Ñ€ÐµÑ Ð½Ðµ ÑоответÑтвует маÑке" -#: libpq/hba.c:1286 +#: libpq/hba.c:1673 #, c-format msgid "end-of-line before authentication method" msgstr "конец Ñтроки перед методом проверки подлинноÑти" -#: libpq/hba.c:1297 +#: libpq/hba.c:1684 #, c-format msgid "multiple values specified for authentication type" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° проверки подлинноÑти указано неÑколько значений" -#: libpq/hba.c:1298 +#: libpq/hba.c:1685 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Определите в Ñтроке единÑтвенный тип проверки подлинноÑти." -#: libpq/hba.c:1375 +#: libpq/hba.c:1750 #, c-format msgid "invalid authentication method \"%s\"" msgstr "неверный метод проверки подлинноÑти \"%s\"" -#: libpq/hba.c:1388 +#: libpq/hba.c:1763 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "" "неверный метод проверки подлинноÑти \"%s\": не поддерживаетÑÑ Ð² Ñтой Ñборке" -#: libpq/hba.c:1411 +#: libpq/hba.c:1786 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "проверка подлинноÑти gssapi Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… Ñокетов не поддерживаетÑÑ" -#: libpq/hba.c:1423 +#: libpq/hba.c:1798 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "проверка подлинноÑти peer поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… Ñокетов" -#: libpq/hba.c:1441 +#: libpq/hba.c:1816 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "" "проверка подлинноÑти cert поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ð¹ hostssl" -#: libpq/hba.c:1491 +#: libpq/hba.c:1866 #, c-format msgid "authentication option not in name=value format: %s" msgstr "параметр проверки подлинноÑти указан не в формате имÑ=значение: %s" -#: libpq/hba.c:1535 +#: libpq/hba.c:1910 #, c-format msgid "" "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, " @@ -16583,7 +17557,7 @@ msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать ldapbasedn, ldapbinddn, ldapbindpasswd, " "ldapsearchattribute, ldapsearchfilter или ldapurl вмеÑте Ñ ldapprefix" -#: libpq/hba.c:1546 +#: libpq/hba.c:1921 #, c-format msgid "" "authentication method \"ldap\" requires argument \"ldapbasedn\", " @@ -16592,22 +17566,22 @@ msgstr "" "Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° проверки подлинноÑти \"ldap\" требуетÑÑ ÑƒÑтановить аргументы " "\"ldapbasedn\" и \"ldapprefix\" или \"ldapsuffix\"" -#: libpq/hba.c:1562 +#: libpq/hba.c:1937 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать ldapsearchattribute вмеÑте Ñ ldapsearchfilter" -#: libpq/hba.c:1579 +#: libpq/hba.c:1954 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "ÑпиÑок Ñерверов RADIUS не может быть пуÑтым" -#: libpq/hba.c:1590 +#: libpq/hba.c:1965 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "ÑпиÑок Ñекретов RADIUS не может быть пуÑтым" -#: libpq/hba.c:1607 +#: libpq/hba.c:1982 #, c-format msgid "" "the number of RADIUS secrets (%d) must be 1 or the same as the number of " @@ -16616,7 +17590,7 @@ msgstr "" "количеÑтво Ñекретов RADIUS (%d) должно равнÑтьÑÑ 1 или количеÑтву Ñерверов " "RADIUS (%d)" -#: libpq/hba.c:1623 +#: libpq/hba.c:1998 #, c-format msgid "" "the number of RADIUS ports (%d) must be 1 or the same as the number of " @@ -16625,7 +17599,7 @@ msgstr "" "количеÑтво портов RADIUS (%d) должно равнÑтьÑÑ 1 или количеÑтву Ñерверов " "RADIUS (%d)" -#: libpq/hba.c:1639 +#: libpq/hba.c:2014 #, c-format msgid "" "the number of RADIUS identifiers (%d) must be 1 or the same as the number of " @@ -16634,16 +17608,16 @@ msgstr "" "количеÑтво идентификаторов RADIUS (%d) должно равнÑтьÑÑ 1 или количеÑтву " "Ñерверов RADIUS (%d)" -#: libpq/hba.c:1690 +#: libpq/hba.c:2066 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi и cert" -#: libpq/hba.c:1699 +#: libpq/hba.c:2075 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert можно определить только в Ñтроках \"hostssl\"" -#: libpq/hba.c:1716 +#: libpq/hba.c:2092 #, c-format msgid "" "clientcert only accepts \"verify-full\" when using \"cert\" authentication" @@ -16651,105 +17625,95 @@ msgstr "" "Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¾Ð¹ подлинноÑти \"cert\" Ð´Ð»Ñ clientcert допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ значение " "\"verify-full\"" -#: libpq/hba.c:1729 +#: libpq/hba.c:2105 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "неверное значение Ð´Ð»Ñ clientcert: \"%s\"" -#: libpq/hba.c:1741 +#: libpq/hba.c:2117 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "clientname можно определить только в Ñтроках \"hostssl\"" -#: libpq/hba.c:1760 +#: libpq/hba.c:2136 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "неверное значение Ð´Ð»Ñ clientname: \"%s\"" -#: libpq/hba.c:1793 +#: libpq/hba.c:2169 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "не удалоÑÑŒ разобрать URL-Ð°Ð´Ñ€ÐµÑ LDAP \"%s\": %s" -#: libpq/hba.c:1804 +#: libpq/hba.c:2180 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ñхема в URL-адреÑе LDAP: %s" -#: libpq/hba.c:1828 +#: libpq/hba.c:2204 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "URL-адреÑа LDAP не поддерживаютÑÑ Ð² Ñтой ОС" -#: libpq/hba.c:1846 +#: libpq/hba.c:2222 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "неверное значение ldapscheme: \"%s\"" -#: libpq/hba.c:1864 +#: libpq/hba.c:2240 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "неверный номер порта LDAP: \"%s\"" -#: libpq/hba.c:1910 libpq/hba.c:1917 +#: libpq/hba.c:2286 libpq/hba.c:2293 msgid "gssapi and sspi" msgstr "gssapi и sspi" -#: libpq/hba.c:1926 libpq/hba.c:1935 +#: libpq/hba.c:2302 libpq/hba.c:2311 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1957 +#: libpq/hba.c:2333 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "не удалоÑÑŒ разобрать ÑпиÑок Ñерверов RADIUS \"%s\"" -#: libpq/hba.c:2005 +#: libpq/hba.c:2381 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "не удалоÑÑŒ разобрать ÑпиÑок портов RADIUS \"%s\"" -#: libpq/hba.c:2019 +#: libpq/hba.c:2395 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "неверный номер порта RADIUS: \"%s\"" -#: libpq/hba.c:2041 +#: libpq/hba.c:2417 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "не удалоÑÑŒ разобрать ÑпиÑок Ñекретов RADIUS \"%s\"" -#: libpq/hba.c:2063 +#: libpq/hba.c:2439 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "не удалоÑÑŒ разобрать ÑпиÑок идентификаторов RADIUS \"%s\"" -#: libpq/hba.c:2077 +#: libpq/hba.c:2453 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "нераÑпознанное Ð¸Ð¼Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð° проверки подлинноÑти: \"%s\"" -#: libpq/hba.c:2223 utils/adt/hbafuncs.c:376 guc-file.l:631 -#, c-format -msgid "could not open configuration file \"%s\": %m" -msgstr "открыть файл конфигурации \"%s\" не удалоÑÑŒ: %m" - -#: libpq/hba.c:2274 +#: libpq/hba.c:2645 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "файл конфигурации \"%s\" не Ñодержит запиÑей" -#: libpq/hba.c:2374 -#, c-format -msgid "invalid regular expression \"%s\": %s" -msgstr "неверное регулÑрное выражение \"%s\": %s" - -#: libpq/hba.c:2437 +#: libpq/hba.c:2798 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "ошибка при поиÑке по регулÑрному выражению Ð´Ð»Ñ \"%s\": %s" -#: libpq/hba.c:2456 +#: libpq/hba.c:2822 #, c-format msgid "" "regular expression \"%s\" has no subexpressions as requested by " @@ -16758,93 +17722,96 @@ msgstr "" "в регулÑрном выражении \"%s\" нет подвыражений, требуемых Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾Ð¹ " "ÑÑылки в \"%s\"" -#: libpq/hba.c:2552 +#: libpq/hba.c:2925 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "" "указанное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (%s) не Ñовпадает Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ прошедшего проверку " "(%s)" -#: libpq/hba.c:2572 +#: libpq/hba.c:2945 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "" "нет ÑоответÑÑ‚Ð²Ð¸Ñ Ð² файле ÑопоÑтавлений \"%s\" Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\", " "прошедшего проверку как \"%s\"" -#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 +#: libpq/pqcomm.c:211 libpq/pqcomm.c:219 libpq/pqcomm.c:250 libpq/pqcomm.c:259 +#: libpq/pqcomm.c:1648 libpq/pqcomm.c:1693 libpq/pqcomm.c:1733 +#: libpq/pqcomm.c:1777 libpq/pqcomm.c:1816 libpq/pqcomm.c:1855 +#: libpq/pqcomm.c:1891 libpq/pqcomm.c:1930 #, c-format -msgid "could not open usermap file \"%s\": %m" -msgstr "не удалоÑÑŒ открыть файл ÑопоÑтавлений пользователей \"%s\": %m" +msgid "%s(%s) failed: %m" +msgstr "ошибка в %s(%s): %m" -#: libpq/pqcomm.c:204 +#: libpq/pqcomm.c:296 #, c-format msgid "could not set socket to nonblocking mode: %m" msgstr "не удалоÑÑŒ перевеÑти Ñокет в неблокирующий режим: %m" -#: libpq/pqcomm.c:362 +#: libpq/pqcomm.c:456 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "длина пути Unix-Ñокета \"%s\" превышает предел (%d байт)" -#: libpq/pqcomm.c:383 +#: libpq/pqcomm.c:476 #, c-format msgid "could not translate host name \"%s\", service \"%s\" to address: %s" msgstr "перевеÑти Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð° \"%s\", Ñлужбы \"%s\" в Ð°Ð´Ñ€ÐµÑ Ð½Ðµ удалоÑÑŒ: %s" -#: libpq/pqcomm.c:387 +#: libpq/pqcomm.c:480 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "не удалоÑÑŒ перевеÑти Ð¸Ð¼Ñ Ñлужбы \"%s\" в адреÑ: %s" -#: libpq/pqcomm.c:414 +#: libpq/pqcomm.c:502 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "" "не удалоÑÑŒ привÑзатьÑÑ ÐºÐ¾ вÑем запрошенным адреÑам: превышен предел " "MAXLISTEN (%d)" -#: libpq/pqcomm.c:423 +#: libpq/pqcomm.c:511 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:427 +#: libpq/pqcomm.c:514 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:432 +#: libpq/pqcomm.c:517 msgid "Unix" msgstr "Unix" -#: libpq/pqcomm.c:437 +#: libpq/pqcomm.c:521 #, c-format msgid "unrecognized address family %d" msgstr "нераÑпознанное ÑемейÑтво адреÑов: %d" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:463 +#: libpq/pqcomm.c:545 #, c-format msgid "could not create %s socket for address \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать Ñокет %s Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑа \"%s\": %m" #. translator: third %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:489 libpq/pqcomm.c:507 +#: libpq/pqcomm.c:574 libpq/pqcomm.c:592 #, c-format msgid "%s(%s) failed for %s address \"%s\": %m" msgstr "ошибка в %s(%s) Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑа %s \"%s\": %m" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:530 +#: libpq/pqcomm.c:615 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "не удалоÑÑŒ привÑзатьÑÑ Ðº адреÑу %s \"%s\": %m" -#: libpq/pqcomm.c:534 +#: libpq/pqcomm.c:619 #, c-format msgid "Is another postmaster already running on port %d?" msgstr "Возможно, порт %d занÑÑ‚ другим процеÑÑом postmaster?" -#: libpq/pqcomm.c:536 +#: libpq/pqcomm.c:621 #, c-format msgid "" "Is another postmaster already running on port %d? If not, wait a few seconds " @@ -16854,127 +17821,120 @@ msgstr "" "попытку через неÑколько Ñекунд." #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:569 +#: libpq/pqcomm.c:650 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "не удалоÑÑŒ привÑзатьÑÑ Ðº адреÑу %s \"%s\": %m" -#: libpq/pqcomm.c:578 +#: libpq/pqcomm.c:658 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñ‘Ð¼Ð° подключений открыт Unix-Ñокет \"%s\"" #. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:584 +#: libpq/pqcomm.c:663 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñ‘Ð¼Ð° подключений по адреÑу %s \"%s\" открыт порт %d" -#: libpq/pqcomm.c:675 +#: libpq/pqcomm.c:753 #, c-format msgid "group \"%s\" does not exist" msgstr "группа \"%s\" не ÑущеÑтвует" -#: libpq/pqcomm.c:685 +#: libpq/pqcomm.c:763 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "не удалоÑÑŒ уÑтановить группу Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": %m" -#: libpq/pqcomm.c:696 +#: libpq/pqcomm.c:774 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "не удалоÑÑŒ уÑтановить права доÑтупа Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": %m" -#: libpq/pqcomm.c:726 +#: libpq/pqcomm.c:803 #, c-format msgid "could not accept new connection: %m" msgstr "не удалоÑÑŒ принÑть новое подключение: %m" -#: libpq/pqcomm.c:766 libpq/pqcomm.c:775 libpq/pqcomm.c:807 libpq/pqcomm.c:817 -#: libpq/pqcomm.c:1642 libpq/pqcomm.c:1687 libpq/pqcomm.c:1727 -#: libpq/pqcomm.c:1771 libpq/pqcomm.c:1810 libpq/pqcomm.c:1849 -#: libpq/pqcomm.c:1885 libpq/pqcomm.c:1924 -#, c-format -msgid "%s(%s) failed: %m" -msgstr "ошибка в %s(%s): %m" - -#: libpq/pqcomm.c:921 +#: libpq/pqcomm.c:885 #, c-format msgid "there is no client connection" msgstr "нет клиентÑкого подключениÑ" -#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 +#: libpq/pqcomm.c:941 libpq/pqcomm.c:1042 #, c-format msgid "could not receive data from client: %m" msgstr "не удалоÑÑŒ получить данные от клиента: %m" -#: libpq/pqcomm.c:1173 tcop/postgres.c:4371 +#: libpq/pqcomm.c:1149 tcop/postgres.c:4533 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "закрытие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·-за потери Ñинхронизации протокола" -#: libpq/pqcomm.c:1239 +#: libpq/pqcomm.c:1215 #, c-format msgid "unexpected EOF within message length word" msgstr "неожиданный обрыв данных в Ñлове длины ÑообщениÑ" -#: libpq/pqcomm.c:1249 +#: libpq/pqcomm.c:1225 #, c-format msgid "invalid message length" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° ÑообщениÑ" -#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 +#: libpq/pqcomm.c:1247 libpq/pqcomm.c:1260 #, c-format msgid "incomplete message from client" msgstr "неполное Ñообщение от клиента" -#: libpq/pqcomm.c:1395 +#: libpq/pqcomm.c:1401 #, c-format msgid "could not send data to client: %m" msgstr "не удалоÑÑŒ поÑлать данные клиенту: %m" -#: libpq/pqcomm.c:1610 +#: libpq/pqcomm.c:1616 #, c-format msgid "%s(%s) failed: error code %d" msgstr "ошибка в %s(%s): код ошибки %d" -#: libpq/pqcomm.c:1699 +#: libpq/pqcomm.c:1705 #, c-format msgid "setting the keepalive idle time is not supported" msgstr "изменение Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ keepalives_idle не поддерживаетÑÑ" -#: libpq/pqcomm.c:1783 libpq/pqcomm.c:1858 libpq/pqcomm.c:1933 +#: libpq/pqcomm.c:1789 libpq/pqcomm.c:1864 libpq/pqcomm.c:1939 #, c-format msgid "%s(%s) not supported" msgstr "%s(%s) не поддерживаетÑÑ" -#: libpq/pqformat.c:406 +#: libpq/pqformat.c:404 #, c-format msgid "no data left in message" msgstr "в Ñообщении не оÑталоÑÑŒ данных" -#: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 -#: utils/adt/arrayfuncs.c:1482 utils/adt/rowtypes.c:588 +#: libpq/pqformat.c:515 libpq/pqformat.c:533 libpq/pqformat.c:554 +#: utils/adt/array_userfuncs.c:797 utils/adt/arrayfuncs.c:1481 +#: utils/adt/rowtypes.c:613 #, c-format msgid "insufficient data left in message" msgstr "недоÑтаточно данных оÑталоÑÑŒ в Ñообщении" -#: libpq/pqformat.c:597 libpq/pqformat.c:626 +#: libpq/pqformat.c:595 libpq/pqformat.c:624 #, c-format msgid "invalid string in message" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтрока в Ñообщении" -#: libpq/pqformat.c:642 +#: libpq/pqformat.c:640 #, c-format msgid "invalid message format" msgstr "неверный формат ÑообщениÑ" -#: main/main.c:239 +#: main/main.c:236 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: ошибка WSAStartup: %d\n" -#: main/main.c:350 +#: main/main.c:324 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -16983,7 +17943,7 @@ msgstr "" "%s - Ñервер PostgreSQL.\n" "\n" -#: main/main.c:351 +#: main/main.c:325 #, c-format msgid "" "Usage:\n" @@ -16994,109 +17954,110 @@ msgstr "" " %s [ПÐРÐМЕТР]...\n" "\n" -#: main/main.c:352 +#: main/main.c:326 #, c-format msgid "Options:\n" msgstr "Параметры:\n" -#: main/main.c:353 +#: main/main.c:327 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B ЧИСЛО_БУФ чиÑло разделÑемых буферов\n" -#: main/main.c:354 +#: main/main.c:328 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c ИМЯ=ЗÐÐЧЕÐИЕ уÑтановить параметр выполнениÑ\n" -#: main/main.c:355 +#: main/main.c:329 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C ИМЯ вывеÑти значение параметра Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸ выйти\n" -#: main/main.c:356 +#: main/main.c:330 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 уровень отладочных Ñообщений\n" -#: main/main.c:357 +#: main/main.c:331 #, c-format msgid " -D DATADIR database directory\n" -msgstr " -D КÐТÐЛОГ каталог Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸\n" +msgstr " -D КÐТ_ДÐÐÐЫХ каталог Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸\n" # well-spelled: ДМГ -#: main/main.c:358 +#: main/main.c:332 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e иÑпользовать европейÑкий формат дат (ДМГ)\n" -#: main/main.c:359 +#: main/main.c:333 #, c-format msgid " -F turn fsync off\n" msgstr " -F выключить Ñинхронизацию Ñ Ð¤Ð¡\n" -#: main/main.c:360 +#: main/main.c:334 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h ИМЯ Ð¸Ð¼Ñ Ð¸Ð»Ð¸ IP-Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñ‘Ð¼Ð° Ñетевых Ñоединений\n" -#: main/main.c:361 +#: main/main.c:335 #, c-format -msgid " -i enable TCP/IP connections\n" -msgstr " -i включить ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ TCP/IP\n" +msgid " -i enable TCP/IP connections (deprecated)\n" +msgstr "" +" -i включить ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ TCP/IP (уÑтаревший параметр)\n" -#: main/main.c:362 +#: main/main.c:336 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k КÐТÐЛОГ раÑположение Unix-Ñокетов\n" -#: main/main.c:364 +#: main/main.c:338 #, c-format msgid " -l enable SSL connections\n" msgstr " -l разрешить SSL-подключениÑ\n" # well-spelled: ПОДКЛ -#: main/main.c:366 +#: main/main.c:340 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N МÐКС_ПОДКЛ предельное чиÑло подключений\n" -#: main/main.c:367 +#: main/main.c:341 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p ПОРТ номер порта Ð´Ð»Ñ Ð¿Ñ€Ð¸Ñ‘Ð¼Ð° подключений\n" -#: main/main.c:368 +#: main/main.c:342 #, c-format msgid " -s show statistics after each query\n" msgstr " -s показывать ÑтатиÑтику поÑле каждого запроÑа\n" -#: main/main.c:369 +#: main/main.c:343 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S РÐБ_ПÐМЯТЬ задать объём памÑти Ð´Ð»Ñ Ñортировки (в КБ)\n" -#: main/main.c:370 +#: main/main.c:344 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: main/main.c:371 +#: main/main.c:345 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --ИМЯ=ЗÐÐЧЕÐИЕ уÑтановить параметр выполнениÑ\n" -#: main/main.c:372 +#: main/main.c:346 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config вывеÑти параметры конфигурации и выйти\n" -#: main/main.c:373 +#: main/main.c:347 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: main/main.c:375 +#: main/main.c:349 #, c-format msgid "" "\n" @@ -17105,49 +18066,41 @@ msgstr "" "\n" "Параметры Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð²:\n" -#: main/main.c:376 +#: main/main.c:350 #, c-format msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" msgstr " -f s|i|o|b|t|n|m|h запретить некоторые типы планов\n" -#: main/main.c:377 -#, c-format -msgid "" -" -n do not reinitialize shared memory after abnormal exit\n" -msgstr "" -" -n не переинициализировать разделÑемую памÑть поÑле\n" -" аварийного выхода\n" - -#: main/main.c:378 +#: main/main.c:351 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O разрешить изменÑть Ñтруктуру ÑиÑтемных таблиц\n" -#: main/main.c:379 +#: main/main.c:352 #, c-format msgid " -P disable system indexes\n" msgstr " -P отключить ÑиÑтемные индекÑÑ‹\n" -#: main/main.c:380 +#: main/main.c:353 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex показать Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запроÑа\n" -#: main/main.c:381 +#: main/main.c:354 #, c-format msgid "" -" -T send SIGSTOP to all backend processes if one dies\n" +" -T send SIGABRT to all backend processes if one dies\n" msgstr "" -" -T поÑылать Ñигнал SIGSTOP вÑем Ñерверным процеÑÑам\n" +" -T поÑылать Ñигнал SIGABRT вÑем Ñерверным процеÑÑам\n" " при отключении одного\n" -#: main/main.c:382 +#: main/main.c:355 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr "" " -W СЕК ждать заданное чиÑло Ñекунд Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð»Ð°Ð´Ñ‡Ð¸ÐºÐ°\n" -#: main/main.c:384 +#: main/main.c:357 #, c-format msgid "" "\n" @@ -17156,7 +18109,7 @@ msgstr "" "\n" "Параметры Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¾Ð¿Ð¾Ð»ÑŒÐ½Ð¾Ð³Ð¾ режима:\n" -#: main/main.c:385 +#: main/main.c:358 #, c-format msgid "" " --single selects single-user mode (must be first argument)\n" @@ -17164,22 +18117,22 @@ msgstr "" " --single включить монопольный режим\n" " (Ñтот аргумент должен быть первым)\n" -#: main/main.c:386 +#: main/main.c:359 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " ИМЯ_БД база данных (по умолчанию - Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ)\n" -#: main/main.c:387 +#: main/main.c:360 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 переопределить уровень отладочных Ñообщений\n" -#: main/main.c:388 +#: main/main.c:361 #, c-format msgid " -E echo statement before execution\n" msgstr " -E выводить SQL-операторы перед выполнением\n" -#: main/main.c:389 +#: main/main.c:362 #, c-format msgid "" " -j do not use newline as interactive query delimiter\n" @@ -17187,12 +18140,12 @@ msgstr "" " -j не Ñчитать конец Ñтроки разделителем интерактивных " "запроÑов\n" -#: main/main.c:390 main/main.c:396 +#: main/main.c:363 main/main.c:369 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r ИМЯ_ФÐЙЛРперенаправить STDOUT и STDERR в указанный файл\n" -#: main/main.c:392 +#: main/main.c:365 #, c-format msgid "" "\n" @@ -17201,7 +18154,7 @@ msgstr "" "\n" "Параметры Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° инициализации:\n" -#: main/main.c:393 +#: main/main.c:366 #, c-format msgid "" " --boot selects bootstrapping mode (must be first argument)\n" @@ -17209,14 +18162,14 @@ msgstr "" " --boot включить режим инициализации\n" " (Ñтот аргумент должен быть первым)\n" -#: main/main.c:394 +#: main/main.c:367 #, c-format msgid " --check selects check mode (must be first argument)\n" msgstr "" " --check включить режим проверки (Ñтот аргумент должен быть " "первым)\n" -#: main/main.c:395 +#: main/main.c:368 #, c-format msgid "" " DBNAME database name (mandatory argument in bootstrapping " @@ -17224,7 +18177,7 @@ msgid "" msgstr "" " ИМЯ_БД Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных (необходимо в режиме инициализации)\n" -#: main/main.c:398 +#: main/main.c:371 #, c-format msgid "" "\n" @@ -17241,12 +18194,12 @@ msgstr "" "\n" "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: main/main.c:402 +#: main/main.c:375 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" -#: main/main.c:413 +#: main/main.c:386 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -17259,12 +18212,12 @@ msgstr "" "должен запуÑкать обычный пользователь. Подробнее о том, как\n" "правильно запуÑкать Ñервер, вы можете узнать в документации.\n" -#: main/main.c:430 +#: main/main.c:403 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: фактичеÑкий и Ñффективный ID Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ Ñовпадать\n" -#: main/main.c:437 +#: main/main.c:410 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -17289,15 +18242,15 @@ msgstr "раÑширенный тип узла \"%s\" уже ÑущеÑтвуе msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "методы раÑширенного узла \"%s\" не зарегиÑтрированы" -#: nodes/makefuncs.c:150 statistics/extended_stats.c:2336 +#: nodes/makefuncs.c:152 nodes/makefuncs.c:178 statistics/extended_stats.c:2310 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "отношение \"%s\" не имеет ÑоÑтавного типа" -#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2567 -#: parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 -#: parser/parse_expr.c:2023 parser/parse_func.c:710 parser/parse_oper.c:883 -#: utils/fmgr/funcapi.c:670 +#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2604 +#: parser/parse_coerce.c:2742 parser/parse_coerce.c:2789 +#: parser/parse_expr.c:2120 parser/parse_func.c:710 parser/parse_oper.c:869 +#: utils/fmgr/funcapi.c:669 #, c-format msgid "could not find array type for data type %s" msgstr "тип маÑÑива Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° данных %s не найден" @@ -17312,7 +18265,7 @@ msgstr "портал \"%s\" Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸: %s" msgid "unnamed portal with parameters: %s" msgstr "неименованный портал Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸: %s" -#: optimizer/path/joinrels.c:855 +#: optimizer/path/joinrels.c:973 #, c-format msgid "" "FULL JOIN is only supported with merge-joinable or hash-joinable join " @@ -17321,32 +18274,32 @@ msgstr "" "FULL JOIN поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ ÑƒÑловиÑми, допуÑкающими Ñоединение " "ÑлиÑнием или хеш-Ñоединение" -#: optimizer/plan/createplan.c:7101 parser/parse_merge.c:182 -#: parser/parse_merge.c:189 +#: optimizer/plan/createplan.c:7175 parser/parse_merge.c:203 +#: rewrite/rewriteHandler.c:1680 #, c-format msgid "cannot execute MERGE on relation \"%s\"" -msgstr "выполнить MERGE Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ðµ \"%s\" нельзÑ" +msgstr "выполнить MERGE Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нельзÑ" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1192 +#: optimizer/plan/initsplan.c:1407 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s не может применÑтьÑÑ Ðº NULL-Ñодержащей Ñтороне внешнего ÑоединениÑ" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1344 parser/analyze.c:1714 parser/analyze.c:1970 -#: parser/analyze.c:3152 +#: optimizer/plan/planner.c:1380 parser/analyze.c:1771 parser/analyze.c:2029 +#: parser/analyze.c:3247 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s неÑовмеÑтимо Ñ UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:2051 optimizer/plan/planner.c:3707 +#: optimizer/plan/planner.c:2121 optimizer/plan/planner.c:4151 #, c-format msgid "could not implement GROUP BY" msgstr "не удалоÑÑŒ реализовать GROUP BY" -#: optimizer/plan/planner.c:2052 optimizer/plan/planner.c:3708 -#: optimizer/plan/planner.c:4351 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:2122 optimizer/plan/planner.c:4152 +#: optimizer/plan/planner.c:4833 optimizer/prep/prepunion.c:1320 #, c-format msgid "" "Some of the datatypes only support hashing, while others only support " @@ -17355,82 +18308,77 @@ msgstr "" "Одни типы данных поддерживают только хеширование, а другие - только " "Ñортировку." -#: optimizer/plan/planner.c:4350 +#: optimizer/plan/planner.c:4832 #, c-format msgid "could not implement DISTINCT" msgstr "не удалоÑÑŒ реализовать DISTINCT" -#: optimizer/plan/planner.c:5471 +#: optimizer/plan/planner.c:6177 #, c-format msgid "could not implement window PARTITION BY" msgstr "не удалоÑÑŒ реализовать PARTITION BY Ð´Ð»Ñ Ð¾ÐºÐ½Ð°" -#: optimizer/plan/planner.c:5472 +#: optimizer/plan/planner.c:6178 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Столбцы, разбивающие окна, должны иметь Ñортируемые типы данных." -#: optimizer/plan/planner.c:5476 +#: optimizer/plan/planner.c:6182 #, c-format msgid "could not implement window ORDER BY" msgstr "не удалоÑÑŒ реализовать ORDER BY Ð´Ð»Ñ Ð¾ÐºÐ½Ð°" -#: optimizer/plan/planner.c:5477 +#: optimizer/plan/planner.c:6183 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Столбцы, Ñортирующие окна, должны иметь Ñортируемые типы данных." -#: optimizer/prep/prepunion.c:509 +#: optimizer/prep/prepunion.c:467 #, c-format msgid "could not implement recursive UNION" msgstr "не удалоÑÑŒ реализовать рекурÑивный UNION" -#: optimizer/prep/prepunion.c:510 +#: optimizer/prep/prepunion.c:468 #, c-format msgid "All column datatypes must be hashable." msgstr "Ð’Ñе Ñтолбцы должны иметь хешируемые типы данных." #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1045 +#: optimizer/prep/prepunion.c:1319 #, c-format msgid "could not implement %s" msgstr "не удалоÑÑŒ реализовать %s" -#: optimizer/util/clauses.c:4777 +#: optimizer/util/clauses.c:4963 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "Ð²Ð½ÐµÐ´Ñ€Ñ‘Ð½Ð½Ð°Ñ Ð² код SQL-Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\"" -#: optimizer/util/plancat.c:142 -#, c-format -msgid "cannot open relation \"%s\"" -msgstr "открыть отношение \"%s\" нельзÑ" - -#: optimizer/util/plancat.c:151 +#: optimizer/util/plancat.c:153 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "" "обращатьÑÑ Ðº временным или нежурналируемым отношениÑм в процеÑÑе " "воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ" -#: optimizer/util/plancat.c:691 +#: optimizer/util/plancat.c:768 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "" "ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñо ÑÑылкой на вÑÑŽ Ñтроку Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° уникального индекÑа не " "поддерживаютÑÑ" -#: optimizer/util/plancat.c:708 +#: optimizer/util/plancat.c:785 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "ограничению в ON CONFLICT не ÑоответÑтвует индекÑ" -#: optimizer/util/plancat.c:758 +#: optimizer/util/plancat.c:835 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE не поддерживаетÑÑ Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñми-иÑключениÑми" -#: optimizer/util/plancat.c:863 +#: optimizer/util/plancat.c:945 #, c-format msgid "" "there is no unique or exclusion constraint matching the ON CONFLICT " @@ -17439,22 +18387,22 @@ msgstr "" "нет уникального Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ограничениÑ-иÑключениÑ, ÑоответÑтвующего " "указанию ON CONFLICT" -#: parser/analyze.c:780 parser/analyze.c:1494 +#: parser/analyze.c:824 parser/analyze.c:1550 #, c-format msgid "VALUES lists must all be the same length" msgstr "ÑпиÑки VALUES должны иметь одинаковую длину" -#: parser/analyze.c:981 +#: parser/analyze.c:1027 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT Ñодержит больше выражений, чем целевых Ñтолбцов" -#: parser/analyze.c:999 +#: parser/analyze.c:1045 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT Ñодержит больше целевых Ñтолбцов, чем выражений" -#: parser/analyze.c:1003 +#: parser/analyze.c:1049 #, c-format msgid "" "The insertion source is a row expression containing the same number of " @@ -17463,29 +18411,29 @@ msgstr "" "ИÑточником данных ÑвлÑетÑÑ Ñтрока, Ð²ÐºÐ»ÑŽÑ‡Ð°ÑŽÑ‰Ð°Ñ Ñтолько же Ñтолбцов, Ñколько " "требуетÑÑ Ð´Ð»Ñ INSERT. Ð’Ñ‹ намеренно иÑпользовали Ñкобки?" -#: parser/analyze.c:1302 parser/analyze.c:1687 +#: parser/analyze.c:1357 parser/analyze.c:1744 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO здеÑÑŒ не допуÑкаетÑÑ" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1617 parser/analyze.c:3363 +#: parser/analyze.c:1673 parser/analyze.c:3479 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть к VALUES" -#: parser/analyze.c:1853 +#: parser/analyze.c:1911 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "неверное предложение UNION/INTERSECT/EXCEPT ORDER BY" -#: parser/analyze.c:1854 +#: parser/analyze.c:1912 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "" "ДопуÑтимо иÑпользование только имён Ñтолбцов, но не выражений или функций." -#: parser/analyze.c:1855 +#: parser/analyze.c:1913 #, c-format msgid "" "Add the expression/function to every SELECT, or move the UNION into a FROM " @@ -17494,12 +18442,12 @@ msgstr "" "Добавьте выражение/функцию в каждый SELECT или перенеÑите UNION в " "предложение FROM." -#: parser/analyze.c:1960 +#: parser/analyze.c:2019 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO можно добавить только в первый SELECT в UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:2032 +#: parser/analyze.c:2091 #, c-format msgid "" "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of " @@ -17508,17 +18456,22 @@ msgstr "" "оператор, ÑоÑтавлÑющий UNION/INTERSECT/EXCEPT, не может ÑÑылатьÑÑ Ð½Ð° другие " "Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð½Ð° том же уровне запроÑа" -#: parser/analyze.c:2119 +#: parser/analyze.c:2178 #, c-format msgid "each %s query must have the same number of columns" msgstr "вÑе запроÑÑ‹ в %s должны возвращать одинаковое чиÑло Ñтолбцов" -#: parser/analyze.c:2523 +#: parser/analyze.c:2535 +#, c-format +msgid "SET target columns cannot be qualified with the relation name." +msgstr "К именам целевых Ñтолбцов в SET Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñть Ð¸Ð¼Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ." + +#: parser/analyze.c:2589 #, c-format msgid "RETURNING must have at least one column" msgstr "в RETURNING должен быть минимум один Ñтолбец" -#: parser/analyze.c:2626 +#: parser/analyze.c:2692 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" @@ -17526,356 +18479,356 @@ msgstr[0] "иÑточник приÑваиваемого Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð´ msgstr[1] "иÑточник приÑваиваемого Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð´Ð°Ð» %d Ñтолбца" msgstr[2] "иÑточник приÑваиваемого Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð´Ð°Ð» %d Ñтолбцов" -#: parser/analyze.c:2687 +#: parser/analyze.c:2753 #, c-format msgid "variable \"%s\" is of type %s but expression is of type %s" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\" имеет тип %s, а выражение - тип %s" #. translator: %s is a SQL keyword -#: parser/analyze.c:2811 parser/analyze.c:2819 +#: parser/analyze.c:2878 parser/analyze.c:2886 #, c-format msgid "cannot specify both %s and %s" msgstr "указать %s и %s одновременно нельзÑ" -#: parser/analyze.c:2839 +#: parser/analyze.c:2906 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR не может Ñодержать операторы, изменÑющие данные, в WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2847 +#: parser/analyze.c:2914 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s не поддерживаетÑÑ" -#: parser/analyze.c:2850 +#: parser/analyze.c:2917 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "СохранÑемые курÑоры должны быть READ ONLY." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2858 +#: parser/analyze.c:2925 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s не поддерживаетÑÑ" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2869 +#: parser/analyze.c:2936 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s не допуÑкаетÑÑ" -#: parser/analyze.c:2872 +#: parser/analyze.c:2939 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "ÐезавиÑимые курÑоры должны быть READ ONLY." -#: parser/analyze.c:2938 +#: parser/analyze.c:3033 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "" "в материализованных предÑтавлениÑÑ… не должны иÑпользоватьÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ‹, " "изменÑющие данные в WITH" -#: parser/analyze.c:2948 +#: parser/analyze.c:3043 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "" "в материализованных предÑтавлениÑÑ… не должны иÑпользоватьÑÑ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ðµ " "таблицы и предÑтавлениÑ" -#: parser/analyze.c:2958 +#: parser/analyze.c:3053 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "" "определÑть материализованные предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñо ÑвÑзанными параметрами нельзÑ" -#: parser/analyze.c:2970 +#: parser/analyze.c:3065 #, c-format msgid "materialized views cannot be unlogged" msgstr "материализованные предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ могут быть нежурналируемыми" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3159 +#: parser/analyze.c:3254 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s неÑовмеÑтимо Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼ DISTINCT" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3166 +#: parser/analyze.c:3261 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s неÑовмеÑтимо Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼ GROUP BY" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3173 +#: parser/analyze.c:3268 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s неÑовмеÑтимо Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼ HAVING" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3180 +#: parser/analyze.c:3275 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s неÑовмеÑтимо Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ñ‹Ð¼Ð¸ функциÑми" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3187 +#: parser/analyze.c:3282 #, c-format msgid "%s is not allowed with window functions" msgstr "%s неÑовмеÑтимо Ñ Ð¾ÐºÐ¾Ð½Ð½Ñ‹Ð¼Ð¸ функциÑми" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3194 +#: parser/analyze.c:3289 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "" "%s не допуÑкаетÑÑ Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñми, возвращающие множеÑтва, в ÑпиÑке результатов" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3286 +#: parser/analyze.c:3388 #, c-format msgid "%s must specify unqualified relation names" msgstr "Ð´Ð»Ñ %s нужно указывать неполные имена отношений" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3336 +#: parser/analyze.c:3452 #, c-format msgid "%s cannot be applied to a join" msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ к Ñоединению" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3345 +#: parser/analyze.c:3461 #, c-format msgid "%s cannot be applied to a function" msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ к функции" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3354 +#: parser/analyze.c:3470 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ к табличной функции" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3372 +#: parser/analyze.c:3488 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ к запроÑу WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3381 +#: parser/analyze.c:3497 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ к именованному хранилищу кортежей" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3401 +#: parser/analyze.c:3517 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "отношение \"%s\" в определении %s отÑутÑтвует в предложении FROM" -#: parser/parse_agg.c:220 parser/parse_oper.c:227 +#: parser/parse_agg.c:210 parser/parse_oper.c:215 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s не удалоÑÑŒ найти оператор Ñортировки" -#: parser/parse_agg.c:222 +#: parser/parse_agg.c:212 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "Ðгрегатным функциÑм Ñ DISTINCT необходимо Ñортировать входные данные." -#: parser/parse_agg.c:257 +#: parser/parse_agg.c:270 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "у GROUPING должно быть меньше 32 аргументов" -#: parser/parse_agg.c:360 +#: parser/parse_agg.c:373 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в уÑловиÑÑ… JOIN" -#: parser/parse_agg.c:362 +#: parser/parse_agg.c:375 msgid "grouping operations are not allowed in JOIN conditions" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в уÑловиÑÑ… JOIN" -#: parser/parse_agg.c:374 +#: parser/parse_agg.c:385 msgid "" "aggregate functions are not allowed in FROM clause of their own query level" msgstr "" "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в предложении FROM их ÑƒÑ€Ð¾Ð²Ð½Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа" -#: parser/parse_agg.c:376 +#: parser/parse_agg.c:387 msgid "" "grouping operations are not allowed in FROM clause of their own query level" msgstr "" "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в предложении FROM их ÑƒÑ€Ð¾Ð²Ð½Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа" -#: parser/parse_agg.c:381 +#: parser/parse_agg.c:392 msgid "aggregate functions are not allowed in functions in FROM" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в функциÑÑ… во FROM" -#: parser/parse_agg.c:383 +#: parser/parse_agg.c:394 msgid "grouping operations are not allowed in functions in FROM" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в функциÑÑ… во FROM" -#: parser/parse_agg.c:391 +#: parser/parse_agg.c:402 msgid "aggregate functions are not allowed in policy expressions" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… политик" -#: parser/parse_agg.c:393 +#: parser/parse_agg.c:404 msgid "grouping operations are not allowed in policy expressions" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… политик" -#: parser/parse_agg.c:410 +#: parser/parse_agg.c:421 msgid "aggregate functions are not allowed in window RANGE" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в указании RANGE Ð´Ð»Ñ Ð¾ÐºÐ½Ð°" -#: parser/parse_agg.c:412 +#: parser/parse_agg.c:423 msgid "grouping operations are not allowed in window RANGE" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в указании RANGE Ð´Ð»Ñ Ð¾ÐºÐ½Ð°" -#: parser/parse_agg.c:417 +#: parser/parse_agg.c:428 msgid "aggregate functions are not allowed in window ROWS" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в указании ROWS Ð´Ð»Ñ Ð¾ÐºÐ½Ð°" -#: parser/parse_agg.c:419 +#: parser/parse_agg.c:430 msgid "grouping operations are not allowed in window ROWS" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в указании ROWS Ð´Ð»Ñ Ð¾ÐºÐ½Ð°" -#: parser/parse_agg.c:424 +#: parser/parse_agg.c:435 msgid "aggregate functions are not allowed in window GROUPS" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в указании GROUPS Ð´Ð»Ñ Ð¾ÐºÐ½Ð°" -#: parser/parse_agg.c:426 +#: parser/parse_agg.c:437 msgid "grouping operations are not allowed in window GROUPS" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в указании GROUPS Ð´Ð»Ñ Ð¾ÐºÐ½Ð°" -#: parser/parse_agg.c:439 +#: parser/parse_agg.c:450 msgid "aggregate functions are not allowed in MERGE WHEN conditions" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в уÑловиÑÑ… MERGE WHEN" -#: parser/parse_agg.c:441 +#: parser/parse_agg.c:452 msgid "grouping operations are not allowed in MERGE WHEN conditions" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в уÑловиÑÑ… MERGE WHEN" -#: parser/parse_agg.c:467 +#: parser/parse_agg.c:479 msgid "aggregate functions are not allowed in check constraints" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в ограничениÑÑ…-проверках" -#: parser/parse_agg.c:469 +#: parser/parse_agg.c:481 msgid "grouping operations are not allowed in check constraints" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в ограничениÑÑ…-проверках" -#: parser/parse_agg.c:476 +#: parser/parse_agg.c:488 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… DEFAULT" -#: parser/parse_agg.c:478 +#: parser/parse_agg.c:490 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… DEFAULT" -#: parser/parse_agg.c:483 +#: parser/parse_agg.c:495 msgid "aggregate functions are not allowed in index expressions" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… индекÑов" -#: parser/parse_agg.c:485 +#: parser/parse_agg.c:497 msgid "grouping operations are not allowed in index expressions" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… индекÑов" -#: parser/parse_agg.c:490 +#: parser/parse_agg.c:502 msgid "aggregate functions are not allowed in index predicates" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в предикатах индекÑов" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:504 msgid "grouping operations are not allowed in index predicates" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в предикатах индекÑов" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:509 msgid "aggregate functions are not allowed in statistics expressions" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… ÑтатиÑтики" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:511 msgid "grouping operations are not allowed in statistics expressions" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… ÑтатиÑтики" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:516 msgid "aggregate functions are not allowed in transform expressions" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… преобразований" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:518 msgid "grouping operations are not allowed in transform expressions" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… преобразований" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:523 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в параметрах EXECUTE" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:525 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в параметрах EXECUTE" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:530 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в уÑловиÑÑ… WHEN Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð¾Ð²" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:532 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в уÑловиÑÑ… WHEN Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð¾Ð²" -#: parser/parse_agg.c:525 +#: parser/parse_agg.c:537 msgid "aggregate functions are not allowed in partition bound" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражении границы Ñекции" -#: parser/parse_agg.c:527 +#: parser/parse_agg.c:539 msgid "grouping operations are not allowed in partition bound" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражении границы Ñекции" -#: parser/parse_agg.c:532 +#: parser/parse_agg.c:544 msgid "aggregate functions are not allowed in partition key expressions" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… ключа ÑекционированиÑ" -#: parser/parse_agg.c:534 +#: parser/parse_agg.c:546 msgid "grouping operations are not allowed in partition key expressions" msgstr "" "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… ключа ÑекционированиÑ" -#: parser/parse_agg.c:540 +#: parser/parse_agg.c:552 msgid "aggregate functions are not allowed in column generation expressions" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… генерируемых Ñтолбцов" -#: parser/parse_agg.c:542 +#: parser/parse_agg.c:554 msgid "grouping operations are not allowed in column generation expressions" msgstr "" "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… генерируемых Ñтолбцов" -#: parser/parse_agg.c:548 +#: parser/parse_agg.c:560 msgid "aggregate functions are not allowed in CALL arguments" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в аргументах CALL" -#: parser/parse_agg.c:550 +#: parser/parse_agg.c:562 msgid "grouping operations are not allowed in CALL arguments" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в аргументах CALL" -#: parser/parse_agg.c:556 +#: parser/parse_agg.c:568 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в уÑловиÑÑ… COPY FROM WHERE" -#: parser/parse_agg.c:558 +#: parser/parse_agg.c:570 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в уÑловиÑÑ… COPY FROM WHERE" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:585 parser/parse_clause.c:1836 +#: parser/parse_agg.c:597 parser/parse_clause.c:1962 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "агрегатные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в конÑтрукции %s" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:588 +#: parser/parse_agg.c:600 #, c-format msgid "grouping operations are not allowed in %s" msgstr "операции группировки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в конÑтрукции %s" -#: parser/parse_agg.c:689 +#: parser/parse_agg.c:701 #, c-format msgid "" "outer-level aggregate cannot contain a lower-level variable in its direct " @@ -17884,15 +18837,15 @@ msgstr "" "Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð½Ðµ может Ñодержать в Ñвоих аргументах " "переменные нижнего уровнÑ" -#: parser/parse_agg.c:768 +#: parser/parse_agg.c:779 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "" "вызовы агрегатных функций не могут включать вызовы функций, возвращающих " "множеÑтва" -#: parser/parse_agg.c:769 parser/parse_expr.c:1674 parser/parse_expr.c:2156 -#: parser/parse_func.c:883 +#: parser/parse_agg.c:780 parser/parse_expr.c:1762 parser/parse_expr.c:2253 +#: parser/parse_func.c:885 #, c-format msgid "" "You might be able to move the set-returning function into a LATERAL FROM " @@ -17901,107 +18854,107 @@ msgstr "" "ИÑправить Ñитуацию можно, перемеÑтив функцию, возвращающую множеÑтво, в " "Ñлемент LATERAL FROM." -#: parser/parse_agg.c:774 +#: parser/parse_agg.c:785 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "вызовы агрегатных функций не могут включать вызовы оконных функции" -#: parser/parse_agg.c:853 +#: parser/parse_agg.c:864 msgid "window functions are not allowed in JOIN conditions" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в уÑловиÑÑ… JOIN" -#: parser/parse_agg.c:860 +#: parser/parse_agg.c:871 msgid "window functions are not allowed in functions in FROM" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в функциÑÑ… во FROM" -#: parser/parse_agg.c:866 +#: parser/parse_agg.c:877 msgid "window functions are not allowed in policy expressions" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… политик" -#: parser/parse_agg.c:879 +#: parser/parse_agg.c:890 msgid "window functions are not allowed in window definitions" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в определении окна" -#: parser/parse_agg.c:890 +#: parser/parse_agg.c:901 msgid "window functions are not allowed in MERGE WHEN conditions" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в уÑловиÑÑ… MERGE WHEN" -#: parser/parse_agg.c:914 +#: parser/parse_agg.c:926 msgid "window functions are not allowed in check constraints" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в ограничениÑÑ…-проверках" -#: parser/parse_agg.c:918 +#: parser/parse_agg.c:930 msgid "window functions are not allowed in DEFAULT expressions" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… DEFAULT" -#: parser/parse_agg.c:921 +#: parser/parse_agg.c:933 msgid "window functions are not allowed in index expressions" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… индекÑов" -#: parser/parse_agg.c:924 +#: parser/parse_agg.c:936 msgid "window functions are not allowed in statistics expressions" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… ÑтатиÑтики" -#: parser/parse_agg.c:927 +#: parser/parse_agg.c:939 msgid "window functions are not allowed in index predicates" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в предикатах индекÑов" -#: parser/parse_agg.c:930 +#: parser/parse_agg.c:942 msgid "window functions are not allowed in transform expressions" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… преобразований" -#: parser/parse_agg.c:933 +#: parser/parse_agg.c:945 msgid "window functions are not allowed in EXECUTE parameters" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в параметрах EXECUTE" -#: parser/parse_agg.c:936 +#: parser/parse_agg.c:948 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в уÑловиÑÑ… WHEN Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð¾Ð²" -#: parser/parse_agg.c:939 +#: parser/parse_agg.c:951 msgid "window functions are not allowed in partition bound" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражении границы Ñекции" -#: parser/parse_agg.c:942 +#: parser/parse_agg.c:954 msgid "window functions are not allowed in partition key expressions" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… ключа ÑекционированиÑ" -#: parser/parse_agg.c:945 +#: parser/parse_agg.c:957 msgid "window functions are not allowed in CALL arguments" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в аргументах CALL" -#: parser/parse_agg.c:948 +#: parser/parse_agg.c:960 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в уÑловиÑÑ… COPY FROM WHERE" -#: parser/parse_agg.c:951 +#: parser/parse_agg.c:963 msgid "window functions are not allowed in column generation expressions" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… генерируемых Ñтолбцов" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:974 parser/parse_clause.c:1845 +#: parser/parse_agg.c:986 parser/parse_clause.c:1971 #, c-format msgid "window functions are not allowed in %s" msgstr "оконные функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в конÑтрукции %s" -#: parser/parse_agg.c:1008 parser/parse_clause.c:2678 +#: parser/parse_agg.c:1020 parser/parse_clause.c:2804 #, c-format msgid "window \"%s\" does not exist" msgstr "окно \"%s\" не ÑущеÑтвует" -#: parser/parse_agg.c:1092 +#: parser/parse_agg.c:1108 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "Ñлишком много наборов Ð³Ñ€ÑƒÐ¿Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (при макÑимуме 4096)" -#: parser/parse_agg.c:1232 +#: parser/parse_agg.c:1248 #, c-format msgid "" "aggregate functions are not allowed in a recursive query's recursive term" msgstr "" "в рекурÑивной чаÑти рекурÑивного запроÑа агрегатные функции недопуÑтимы" -#: parser/parse_agg.c:1425 +#: parser/parse_agg.c:1441 #, c-format msgid "" "column \"%s.%s\" must appear in the GROUP BY clause or be used in an " @@ -18010,7 +18963,7 @@ msgstr "" "Ñтолбец \"%s.%s\" должен фигурировать в предложении GROUP BY или " "иÑпользоватьÑÑ Ð² агрегатной функции" -#: parser/parse_agg.c:1428 +#: parser/parse_agg.c:1444 #, c-format msgid "" "Direct arguments of an ordered-set aggregate must use only grouped columns." @@ -18018,13 +18971,13 @@ msgstr "" "ПрÑмые аргументы Ñортирующей агрегатной функции могут включать только " "группируемые Ñтолбцы." -#: parser/parse_agg.c:1433 +#: parser/parse_agg.c:1449 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "" "Ð¿Ð¾Ð´Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ñпользует негруппированный Ñтолбец \"%s.%s\" из внешнего запроÑа" -#: parser/parse_agg.c:1597 +#: parser/parse_agg.c:1613 #, c-format msgid "" "arguments to GROUPING must be grouping expressions of the associated query " @@ -18033,25 +18986,25 @@ msgstr "" "аргументами GROUPING должны быть Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ " "ÑоответÑтвующего ÑƒÑ€Ð¾Ð²Ð½Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа" -#: parser/parse_clause.c:192 +#: parser/parse_clause.c:193 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "отношение \"%s\" не может быть целевым в операторе, изменÑющем данные" -#: parser/parse_clause.c:572 parser/parse_clause.c:600 parser/parse_func.c:2554 +#: parser/parse_clause.c:569 parser/parse_clause.c:597 parser/parse_func.c:2553 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "" "функции, возвращающие множеÑтва, должны находитьÑÑ Ð½Ð° верхнем уровне FROM" -#: parser/parse_clause.c:612 +#: parser/parse_clause.c:609 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "" "Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ и той же функции Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ разные ÑпиÑки Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñми " "Ñтолбцов" -#: parser/parse_clause.c:645 +#: parser/parse_clause.c:642 #, c-format msgid "" "ROWS FROM() with multiple functions cannot have a column definition list" @@ -18059,7 +19012,7 @@ msgstr "" "у ROWS FROM() Ñ Ð½ÐµÑколькими функциÑми не может быть ÑпиÑка Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñми " "Ñтолбцов" -#: parser/parse_clause.c:646 +#: parser/parse_clause.c:643 #, c-format msgid "" "Put a separate column definition list for each function inside ROWS FROM()." @@ -18067,14 +19020,14 @@ msgstr "" "Добавьте отдельные ÑпиÑки Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñми Ñтолбцов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ функции в ROWS " "FROM()." -#: parser/parse_clause.c:652 +#: parser/parse_clause.c:649 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "" "у UNNEST() Ñ Ð½ÐµÑколькими аргументами не может быть ÑпиÑка Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñми " "Ñтолбцов" -#: parser/parse_clause.c:653 +#: parser/parse_clause.c:650 #, c-format msgid "" "Use separate UNNEST() calls inside ROWS FROM(), and attach a column " @@ -18083,43 +19036,43 @@ msgstr "" "Ðапишите отдельные вызовы UNNEST() внутри ROWS FROM() и добавьте ÑпиÑок " "определений Ñтолбцов к каждому." -#: parser/parse_clause.c:660 +#: parser/parse_clause.c:657 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "" "WITH ORDINALITY Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñо ÑпиÑком Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñми Ñтолбцов" -#: parser/parse_clause.c:661 +#: parser/parse_clause.c:658 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "ПомеÑтите ÑпиÑок определений Ñтолбцов внутрь ROWS FROM()." -#: parser/parse_clause.c:761 +#: parser/parse_clause.c:762 parser/parse_jsontable.c:295 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "FOR ORDINALITY допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñтолбца" -#: parser/parse_clause.c:822 +#: parser/parse_clause.c:823 #, c-format msgid "column name \"%s\" is not unique" msgstr "Ð¸Ð¼Ñ Ñтолбца \"%s\" не уникально" -#: parser/parse_clause.c:864 +#: parser/parse_clause.c:865 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "Ð¸Ð¼Ñ Ð¿Ñ€Ð¾ÑтранÑтва имён \"%s\" не уникально" -#: parser/parse_clause.c:874 +#: parser/parse_clause.c:875 #, c-format msgid "only one default namespace is allowed" msgstr "допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ одно проÑтранÑтво имён по умолчанию" -#: parser/parse_clause.c:934 +#: parser/parse_clause.c:935 #, c-format msgid "tablesample method %s does not exist" msgstr "метод %s Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ð¾Ñ€ÐºÐ¸ не ÑущеÑтвует" -#: parser/parse_clause.c:956 +#: parser/parse_clause.c:957 #, c-format msgid "tablesample method %s requires %d argument, not %d" msgid_plural "tablesample method %s requires %d arguments, not %d" @@ -18127,104 +19080,104 @@ msgstr[0] "метод %s Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ð¾Ñ€ÐºÐ¸ требует msgstr[1] "метод %s Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ð¾Ñ€ÐºÐ¸ требует аргументов: %d, получено: %d" msgstr[2] "метод %s Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ð¾Ñ€ÐºÐ¸ требует аргументов: %d, получено: %d" -#: parser/parse_clause.c:990 +#: parser/parse_clause.c:991 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "метод %s Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð±Ð¾Ñ€ÐºÐ¸ не поддерживает REPEATABLE" -#: parser/parse_clause.c:1139 +#: parser/parse_clause.c:1144 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "" "предложение TABLESAMPLE можно применÑть только к таблицам и " "материализованным предÑтавлениÑм" -#: parser/parse_clause.c:1329 +#: parser/parse_clause.c:1331 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "Ð¸Ð¼Ñ Ñтолбца \"%s\" фигурирует в предложении USING неоднократно" -#: parser/parse_clause.c:1344 +#: parser/parse_clause.c:1346 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "Ð¸Ð¼Ñ Ð¾Ð±Ñ‰ÐµÐ³Ð¾ Ñтолбца \"%s\" фигурирует в таблице Ñлева неоднократно" -#: parser/parse_clause.c:1353 +#: parser/parse_clause.c:1355 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "в таблице Ñлева нет Ñтолбца \"%s\", указанного в предложении USING" -#: parser/parse_clause.c:1368 +#: parser/parse_clause.c:1370 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "Ð¸Ð¼Ñ Ð¾Ð±Ñ‰ÐµÐ³Ð¾ Ñтолбца \"%s\" фигурирует в таблице Ñправа неоднократно" -#: parser/parse_clause.c:1377 +#: parser/parse_clause.c:1379 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "в таблице Ñправа нет Ñтолбца \"%s\", указанного в предложении USING" -#: parser/parse_clause.c:1781 +#: parser/parse_clause.c:1907 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" msgstr "" "количеÑтво Ñтрок в FETCH FIRST ... WITH TIES должно быть отличным от NULL" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1806 +#: parser/parse_clause.c:1932 #, c-format msgid "argument of %s must not contain variables" msgstr "аргумент %s не может Ñодержать переменные" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1971 +#: parser/parse_clause.c:2097 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "выражение %s \"%s\" неоднозначно" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1999 +#: parser/parse_clause.c:2125 #, c-format msgid "non-integer constant in %s" msgstr "не целочиÑÐ»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð½Ñтанта в %s" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2021 +#: parser/parse_clause.c:2147 #, c-format msgid "%s position %d is not in select list" msgstr "в ÑпиÑке выборки %s нет Ñлемента %d" -#: parser/parse_clause.c:2460 +#: parser/parse_clause.c:2586 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE имеет ограничение в 12 Ñлементов" -#: parser/parse_clause.c:2666 +#: parser/parse_clause.c:2792 #, c-format msgid "window \"%s\" is already defined" msgstr "окно \"%s\" уже определено" -#: parser/parse_clause.c:2727 +#: parser/parse_clause.c:2853 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "переопределить предложение PARTITION BY Ð´Ð»Ñ Ð¾ÐºÐ½Ð° \"%s\" нельзÑ" -#: parser/parse_clause.c:2739 +#: parser/parse_clause.c:2865 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "переопределить предложение ORDER BY Ð´Ð»Ñ Ð¾ÐºÐ½Ð° \"%s\" нельзÑ" -#: parser/parse_clause.c:2769 parser/parse_clause.c:2775 +#: parser/parse_clause.c:2895 parser/parse_clause.c:2901 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "Ñкопировать окно \"%s\", имеющее предложение рамки, нельзÑ" -#: parser/parse_clause.c:2777 +#: parser/parse_clause.c:2903 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Уберите Ñкобки в предложении OVER." -#: parser/parse_clause.c:2797 +#: parser/parse_clause.c:2923 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" @@ -18232,12 +19185,12 @@ msgstr "" "Ð´Ð»Ñ RANGE Ñо Ñмещением PRECEDING/FOLLOWING требуетÑÑ Ñ€Ð¾Ð²Ð½Ð¾ один Ñтолбец в " "ORDER BY" -#: parser/parse_clause.c:2820 +#: parser/parse_clause.c:2946 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° GROUPS требуетÑÑ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ ORDER BY" -#: parser/parse_clause.c:2891 +#: parser/parse_clause.c:3016 #, c-format msgid "" "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument " @@ -18246,68 +19199,68 @@ msgstr "" "Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð¾Ð¹ функции Ñ DISTINCT, Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ORDER BY должны быть в ÑпиÑке " "аргументов" -#: parser/parse_clause.c:2892 +#: parser/parse_clause.c:3017 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "" "в конÑтрукции SELECT DISTINCT Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ORDER BY должны быть в ÑпиÑке выборки" -#: parser/parse_clause.c:2924 +#: parser/parse_clause.c:3049 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "агрегатной функции Ñ DISTINCT нужен минимум один аргумент" -#: parser/parse_clause.c:2925 +#: parser/parse_clause.c:3050 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "в SELECT DISTINCT нужен минимум один Ñтолбец" -#: parser/parse_clause.c:2991 parser/parse_clause.c:3023 +#: parser/parse_clause.c:3116 parser/parse_clause.c:3148 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "" "Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ SELECT DISTINCT ON должны ÑоответÑтвовать начальным выражениÑм " "ORDER BY" -#: parser/parse_clause.c:3101 +#: parser/parse_clause.c:3226 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в ON CONFLICT" -#: parser/parse_clause.c:3107 +#: parser/parse_clause.c:3232 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в ON CONFLICT" -#: parser/parse_clause.c:3186 +#: parser/parse_clause.c:3311 #, c-format msgid "" "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "" "в ON CONFLICT DO UPDATE требуетÑÑ Ð½Ð°Ð²Ð¾Ð´Ñщее указание или Ð¸Ð¼Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ" -#: parser/parse_clause.c:3187 +#: parser/parse_clause.c:3312 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Ðапример: ON CONFLICT (имÑ_Ñтолбца)." -#: parser/parse_clause.c:3198 +#: parser/parse_clause.c:3323 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð°Ð¼Ð¸ ÑиÑтемного каталога не поддерживаетÑÑ" -#: parser/parse_clause.c:3206 +#: parser/parse_clause.c:3331 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "" "ON CONFLICT не поддерживаетÑÑ Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\", Ñлужащей таблицей каталога" -#: parser/parse_clause.c:3336 +#: parser/parse_clause.c:3462 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "оператор %s не годитÑÑ Ð´Ð»Ñ Ñортировки" -#: parser/parse_clause.c:3338 +#: parser/parse_clause.c:3464 #, c-format msgid "" "Ordering operators must be \"<\" or \">\" members of btree operator families." @@ -18315,14 +19268,14 @@ msgstr "" "Операторы Ñортировки должны быть членами \"<\" или \">\" ÑемейÑтв операторов " "btree." -#: parser/parse_clause.c:3649 +#: parser/parse_clause.c:3775 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "" "RANGE Ñо Ñмещением PRECEDING/FOLLOWING не поддерживаетÑÑ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° Ñтолбца %s" -#: parser/parse_clause.c:3655 +#: parser/parse_clause.c:3781 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s " @@ -18331,12 +19284,12 @@ msgstr "" "RANGE Ñо Ñмещением PRECEDING/FOLLOWING не поддерживаетÑÑ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° Ñтолбца %s " "и типа ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ %s" -#: parser/parse_clause.c:3658 +#: parser/parse_clause.c:3784 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Приведите значение ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ðº подходÑщему типу." -#: parser/parse_clause.c:3663 +#: parser/parse_clause.c:3789 #, c-format msgid "" "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for " @@ -18345,14 +19298,15 @@ msgstr "" "RANGE Ñо Ñмещением PRECEDING/FOLLOWING допуÑкает неÑколько интерпретаций Ð´Ð»Ñ " "типа Ñтолбца %s и типа ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ %s" -#: parser/parse_clause.c:3666 +#: parser/parse_clause.c:3792 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "Приведите значение ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð² точноÑти к желаемому типу." #: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 #: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 -#: parser/parse_expr.c:2057 parser/parse_expr.c:2659 parser/parse_target.c:994 +#: parser/parse_expr.c:2154 parser/parse_expr.c:2762 parser/parse_expr.c:3413 +#: parser/parse_expr.c:3642 parser/parse_target.c:998 #, c-format msgid "cannot cast type %s to %s" msgstr "привеÑти тип %s к %s нельзÑ" @@ -18387,112 +19341,112 @@ msgid "argument of %s must not return a set" msgstr "аргумент конÑтрукции %s не должен возвращать множеÑтво" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1383 +#: parser/parse_coerce.c:1420 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "в конÑтрукции %s типы %s и %s не имеют общего" -#: parser/parse_coerce.c:1499 +#: parser/parse_coerce.c:1536 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "типы аргументов %s и %s не имеют общего" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1551 +#: parser/parse_coerce.c:1588 #, c-format msgid "%s could not convert type %s to %s" msgstr "в конÑтрукции %s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ тип %s в %s" -#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 -#: parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 -#: parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 +#: parser/parse_coerce.c:2191 parser/parse_coerce.c:2211 +#: parser/parse_coerce.c:2231 parser/parse_coerce.c:2252 +#: parser/parse_coerce.c:2307 parser/parse_coerce.c:2341 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "аргументы, объÑвленные как \"%s\", должны быть однотипными" -#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 -#: utils/fmgr/funcapi.c:601 +#: parser/parse_coerce.c:2286 parser/parse_coerce.c:2399 +#: utils/fmgr/funcapi.c:600 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "аргумент, объÑвленный как \"%s\", оказалÑÑ Ð½Ðµ маÑÑивом, а типом %s" -#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 -#: utils/fmgr/funcapi.c:615 +#: parser/parse_coerce.c:2319 parser/parse_coerce.c:2469 +#: utils/fmgr/funcapi.c:614 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "аргумент, объÑвленный как \"%s\", имеет не диапазонный тип, а %s" -#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 -#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:633 utils/fmgr/funcapi.c:698 +#: parser/parse_coerce.c:2353 parser/parse_coerce.c:2433 +#: parser/parse_coerce.c:2566 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "аргумент, объÑвленный как \"%s\", имеет не мультидиапазонный тип, а %s" -#: parser/parse_coerce.c:2353 +#: parser/parse_coerce.c:2390 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "тип Ñлемента аргумента \"anyarray\" определить нельзÑ" -#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 -#: parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 +#: parser/parse_coerce.c:2416 parser/parse_coerce.c:2447 +#: parser/parse_coerce.c:2486 parser/parse_coerce.c:2552 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "аргумент, объÑвленный как \"%s\", не ÑоглаÑуетÑÑ Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð¼ %s" -#: parser/parse_coerce.c:2474 +#: parser/parse_coerce.c:2511 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "" "не удалоÑÑŒ определить полиморфный тип, так как входные аргументы имеют тип %s" -#: parser/parse_coerce.c:2488 +#: parser/parse_coerce.c:2525 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "" "в нарушение объÑÐ²Ð»ÐµÐ½Ð¸Ñ \"anynonarray\" ÑоответÑтвующий аргумент оказалÑÑ " "маÑÑивом: %s" -#: parser/parse_coerce.c:2498 +#: parser/parse_coerce.c:2535 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "" "в нарушение объÑÐ²Ð»ÐµÐ½Ð¸Ñ \"anyenum\" ÑоответÑтвующий аргумент оказалÑÑ Ð½Ðµ " "перечиÑлением: %s" -#: parser/parse_coerce.c:2559 +#: parser/parse_coerce.c:2596 #, c-format msgid "arguments of anycompatible family cannot be cast to a common type" msgstr "" "аргументы ÑемейÑтва anycompatible не могут быть приведены к общему типу" -#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 -#: parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 -#: parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 +#: parser/parse_coerce.c:2614 parser/parse_coerce.c:2635 +#: parser/parse_coerce.c:2685 parser/parse_coerce.c:2690 +#: parser/parse_coerce.c:2754 parser/parse_coerce.c:2766 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "" "не удалоÑÑŒ определить полиморфный тип %s, так как входные аргументы имеют " "тип %s" -#: parser/parse_coerce.c:2587 +#: parser/parse_coerce.c:2624 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "тип %s (anycompatiblerange) не ÑоответÑтвует типу %s (anycompatible)" -#: parser/parse_coerce.c:2608 +#: parser/parse_coerce.c:2645 #, c-format msgid "anycompatiblemultirange type %s does not match anycompatible type %s" msgstr "" "тип %s (anycompatiblemultirange) не ÑоответÑтвует типу %s (anycompatible)" -#: parser/parse_coerce.c:2622 +#: parser/parse_coerce.c:2659 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "" "в нарушение объÑÐ²Ð»ÐµÐ½Ð¸Ñ \"anycompatiblenonarray\" ÑоответÑтвующий аргумент " "оказалÑÑ Ð¼Ð°ÑÑивом: %s" -#: parser/parse_coerce.c:2857 +#: parser/parse_coerce.c:2894 #, c-format msgid "" "A result of type %s requires at least one input of type anyrange or " @@ -18501,7 +19455,7 @@ msgstr "" "Ð”Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð° типа %s требуетÑÑ Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼ один аргумент типа anyrange или " "anymultirange." -#: parser/parse_coerce.c:2874 +#: parser/parse_coerce.c:2911 #, c-format msgid "" "A result of type %s requires at least one input of type anycompatiblerange " @@ -18510,7 +19464,7 @@ msgstr "" "Ð”Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð° типа %s требуетÑÑ Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼ один аргумент типа " "anycompatiblerange или anycompatiblemultirange." -#: parser/parse_coerce.c:2886 +#: parser/parse_coerce.c:2923 #, c-format msgid "" "A result of type %s requires at least one input of type anyelement, " @@ -18519,7 +19473,7 @@ msgstr "" "Ð”Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð° типа %s требуетÑÑ Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼ один аргумент типа anyelement, " "anyarray, anynonarray, anyenum, anyrange или anymultirange." -#: parser/parse_coerce.c:2898 +#: parser/parse_coerce.c:2935 #, c-format msgid "" "A result of type %s requires at least one input of type anycompatible, " @@ -18530,7 +19484,7 @@ msgstr "" "anycompatiblearray, anycompatiblenonarray, anycompatiblerange или " "anycompatiblemultirange." -#: parser/parse_coerce.c:2928 +#: parser/parse_coerce.c:2965 msgid "A result of type internal requires at least one input of type internal." msgstr "" "Ð”Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð° типа internal требуетÑÑ Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼ один аргумент типа internal." @@ -18589,22 +19543,17 @@ msgstr "рекурÑÐ¸Ð²Ð½Ð°Ñ ÑÑылка на Ð·Ð°Ð¿Ñ€Ð¾Ñ \"%s\" не дол msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "рекурÑÐ¸Ð²Ð½Ð°Ñ ÑÑылка на Ð·Ð°Ð¿Ñ€Ð¾Ñ \"%s\" не должна фигурировать в EXCEPT" -#: parser/parse_cte.c:133 -#, c-format -msgid "MERGE not supported in WITH query" -msgstr "MERGE не поддерживаетÑÑ Ð² запроÑе WITH" - -#: parser/parse_cte.c:143 +#: parser/parse_cte.c:137 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "Ð¸Ð¼Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа WITH \"%s\" указано неоднократно" -#: parser/parse_cte.c:314 +#: parser/parse_cte.c:309 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "не удалоÑÑŒ найти оператор неравенÑтва Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s" -#: parser/parse_cte.c:341 +#: parser/parse_cte.c:336 #, c-format msgid "" "WITH clause containing a data-modifying statement must be at the top level" @@ -18612,7 +19561,7 @@ msgstr "" "предложение WITH, Ñодержащее оператор, изменÑющий данные, должно быть на " "верхнем уровне" -#: parser/parse_cte.c:390 +#: parser/parse_cte.c:385 #, c-format msgid "" "recursive query \"%s\" column %d has type %s in non-recursive term but type " @@ -18621,12 +19570,12 @@ msgstr "" "в рекурÑивном запроÑе \"%s\" Ñтолбец %d имеет тип %s в нерекурÑивной чаÑти, " "но в результате тип %s" -#: parser/parse_cte.c:396 +#: parser/parse_cte.c:391 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Приведите результат нерекурÑивной чаÑти к правильному типу." -#: parser/parse_cte.c:401 +#: parser/parse_cte.c:396 #, c-format msgid "" "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term " @@ -18635,43 +19584,43 @@ msgstr "" "в рекурÑивном запроÑе \"%s\" у Ñтолбца %d правило Ñортировки \"%s\" в не " "рекурÑивной чаÑти, но в результате правило \"%s\"" -#: parser/parse_cte.c:405 +#: parser/parse_cte.c:400 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "" "Измените правило Ñортировки в нерекурÑивной чаÑти, добавив предложение " "COLLATE." -#: parser/parse_cte.c:426 +#: parser/parse_cte.c:421 #, c-format msgid "WITH query is not recursive" msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ WITH не рекурÑивный" -#: parser/parse_cte.c:457 +#: parser/parse_cte.c:452 #, c-format msgid "" "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" msgstr "" "Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼ SEARCH или CYCLE в левой Ñтороне UNION должен быть SELECT" -#: parser/parse_cte.c:462 +#: parser/parse_cte.c:457 #, c-format msgid "" "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" msgstr "" "Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼ SEARCH или CYCLE в правой Ñтороне UNION должен быть SELECT" -#: parser/parse_cte.c:477 +#: parser/parse_cte.c:472 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "Ñтолбец поиÑка \"%s\" отÑутÑтвует в ÑпиÑке Ñтолбцов запроÑа WITH" -#: parser/parse_cte.c:484 +#: parser/parse_cte.c:479 #, c-format msgid "search column \"%s\" specified more than once" msgstr "Ñтолбец поиÑка \"%s\" указан неоднократно" -#: parser/parse_cte.c:493 +#: parser/parse_cte.c:488 #, c-format msgid "" "search sequence column name \"%s\" already used in WITH query column list" @@ -18679,64 +19628,64 @@ msgstr "" "Ð¸Ð¼Ñ Ñтолбца поÑледовательноÑти поиÑка \"%s\" уже иÑпользуетÑÑ Ð² ÑпиÑке " "Ñтолбцов запроÑа WITH" -#: parser/parse_cte.c:510 +#: parser/parse_cte.c:505 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "Ñтолбец цикла \"%s\" отÑутÑтвует в ÑпиÑке Ñтолбцов запроÑа WITH" -#: parser/parse_cte.c:517 +#: parser/parse_cte.c:512 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "Ñтолбец цикла \"%s\" указан неоднократно" -#: parser/parse_cte.c:526 +#: parser/parse_cte.c:521 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" msgstr "" "Ð¸Ð¼Ñ Ñтолбца пометки цикла \"%s\" уже иÑпользуетÑÑ Ð² ÑпиÑке Ñтолбцов запроÑа " "WITH" -#: parser/parse_cte.c:533 +#: parser/parse_cte.c:528 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" msgstr "" "Ð¸Ð¼Ñ Ñтолбца пути цикла \"%s\" уже иÑпользуетÑÑ Ð² ÑпиÑке Ñтолбцов запроÑа WITH" -#: parser/parse_cte.c:541 +#: parser/parse_cte.c:536 #, c-format msgid "cycle mark column name and cycle path column name are the same" msgstr "Ð¸Ð¼Ñ Ñтолбца пометки цикла Ñовпадает Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ñтолбца пути цикла" -#: parser/parse_cte.c:551 +#: parser/parse_cte.c:546 #, c-format msgid "search sequence column name and cycle mark column name are the same" msgstr "" "Ð¸Ð¼Ñ Ñтолбца поÑледовательноÑти поиÑка Ñовпадает Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ñтолбца пометки " "цикла" -#: parser/parse_cte.c:558 +#: parser/parse_cte.c:553 #, c-format msgid "search sequence column name and cycle path column name are the same" msgstr "" "Ð¸Ð¼Ñ Ñтолбца поÑледовательноÑти поиÑка Ñовпадает Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ñтолбца пути цикла" -#: parser/parse_cte.c:642 +#: parser/parse_cte.c:637 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ WITH \"%s\" Ñодержит Ñтолбцов: %d, но указано: %d" -#: parser/parse_cte.c:822 +#: parser/parse_cte.c:882 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "Ð²Ð·Ð°Ð¸Ð¼Ð½Ð°Ñ Ñ€ÐµÐºÑƒÑ€ÑÐ¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ñлементами WITH не реализована" -#: parser/parse_cte.c:874 +#: parser/parse_cte.c:934 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "" "рекурÑивный Ð·Ð°Ð¿Ñ€Ð¾Ñ \"%s\" не должен Ñодержать операторов, изменÑющих данные" -#: parser/parse_cte.c:882 +#: parser/parse_cte.c:942 #, c-format msgid "" "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] " @@ -18745,101 +19694,110 @@ msgstr "" "рекурÑивный Ð·Ð°Ð¿Ñ€Ð¾Ñ \"%s\" должен иметь форму {нерекурÑÐ¸Ð²Ð½Ð°Ñ Ñ‡Ð°Ñть} UNION " "[ALL] {рекурÑÐ¸Ð²Ð½Ð°Ñ Ñ‡Ð°Ñть}" -#: parser/parse_cte.c:926 +#: parser/parse_cte.c:977 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY в рекурÑивном запроÑе не поддерживаетÑÑ" -#: parser/parse_cte.c:932 +#: parser/parse_cte.c:983 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET в рекурÑивном запроÑе не поддерживаетÑÑ" -#: parser/parse_cte.c:938 +#: parser/parse_cte.c:989 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT в рекурÑивном запроÑе не поддерживаетÑÑ" -#: parser/parse_cte.c:944 +#: parser/parse_cte.c:995 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE в рекурÑивном запроÑе не поддерживаетÑÑ" -#: parser/parse_cte.c:1001 +#: parser/parse_cte.c:1074 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "рекурÑÐ¸Ð²Ð½Ð°Ñ ÑÑылка на Ð·Ð°Ð¿Ñ€Ð¾Ñ \"%s\" указана неоднократно" -#: parser/parse_expr.c:282 +#: parser/parse_expr.c:313 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT не допуÑкаетÑÑ Ð² данном контекÑте" -#: parser/parse_expr.c:335 parser/parse_relation.c:3654 -#: parser/parse_relation.c:3674 +#: parser/parse_expr.c:406 parser/parse_relation.c:3691 +#: parser/parse_relation.c:3701 parser/parse_relation.c:3719 +#: parser/parse_relation.c:3726 parser/parse_relation.c:3740 #, c-format msgid "column %s.%s does not exist" msgstr "Ñтолбец %s.%s не ÑущеÑтвует" -#: parser/parse_expr.c:347 +#: parser/parse_expr.c:418 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "Ñтолбец \"%s\" не найден в типе данных %s" -#: parser/parse_expr.c:353 +#: parser/parse_expr.c:424 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "не удалоÑÑŒ идентифицировать Ñтолбец \"%s\" в типе запиÑи" # skip-rule: space-before-period -#: parser/parse_expr.c:359 +#: parser/parse_expr.c:430 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "" "запиÑÑŒ имени Ñтолбца .%s применена к типу %s, который не ÑвлÑетÑÑ ÑоÑтавным" -#: parser/parse_expr.c:390 parser/parse_target.c:739 +#: parser/parse_expr.c:461 parser/parse_target.c:732 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "раÑширение Ñтроки через \"*\" здеÑÑŒ не поддерживаетÑÑ" -#: parser/parse_expr.c:512 +#: parser/parse_expr.c:584 msgid "cannot use column reference in DEFAULT expression" msgstr "в выражении DEFAULT (по умолчанию) Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð½Ð° Ñтолбцы" -#: parser/parse_expr.c:515 +#: parser/parse_expr.c:587 msgid "cannot use column reference in partition bound expression" msgstr "в выражении границы Ñекции Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð½Ð° Ñтолбцы" -#: parser/parse_expr.c:784 parser/parse_relation.c:818 -#: parser/parse_relation.c:900 parser/parse_target.c:1234 +#: parser/parse_expr.c:846 parser/parse_relation.c:833 +#: parser/parse_relation.c:915 parser/parse_target.c:1238 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð°Ñ ÑÑылка на Ñтолбец \"%s\"" -#: parser/parse_expr.c:840 parser/parse_param.c:110 parser/parse_param.c:142 -#: parser/parse_param.c:208 parser/parse_param.c:307 +#: parser/parse_expr.c:902 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_param.c:204 parser/parse_param.c:303 #, c-format msgid "there is no parameter $%d" msgstr "параметр $%d не ÑущеÑтвует" -#: parser/parse_expr.c:1040 +#. translator: %s is name of a SQL construct, eg NULLIF +#: parser/parse_expr.c:1103 parser/parse_expr.c:3073 #, c-format -msgid "NULLIF requires = operator to yield boolean" -msgstr "Ð´Ð»Ñ NULLIF требуетÑÑ, чтобы оператор = возвращал логичеÑкое значение" +msgid "%s requires = operator to yield boolean" +msgstr "Ð´Ð»Ñ %s требуетÑÑ, чтобы оператор = возвращал логичеÑкое значение" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1046 parser/parse_expr.c:2975 +#: parser/parse_expr.c:1109 parser/parse_expr.c:3080 #, c-format msgid "%s must not return a set" msgstr "%s не должна возвращать множеÑтво" -#: parser/parse_expr.c:1431 parser/parse_expr.c:1463 +#: parser/parse_expr.c:1395 +#, c-format +msgid "" +"MERGE_ACTION() can only be used in the RETURNING list of a MERGE command" +msgstr "" +"MERGE_ACTION() может иÑпользоватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в ÑпиÑке RETURNING команды MERGE" + +#: parser/parse_expr.c:1519 parser/parse_expr.c:1551 #, c-format msgid "number of columns does not match number of values" msgstr "чиÑло Ñтолбцов не равно чиÑлу значений" -#: parser/parse_expr.c:1477 +#: parser/parse_expr.c:1565 #, c-format msgid "" "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() " @@ -18849,163 +19807,356 @@ msgstr "" "SELECT или выражение ROW()" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1672 parser/parse_expr.c:2154 parser/parse_func.c:2679 +#: parser/parse_expr.c:1760 parser/parse_expr.c:2251 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "функции, возвращающие множеÑтва, Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в конÑтрукции %s" -#: parser/parse_expr.c:1735 +#: parser/parse_expr.c:1824 msgid "cannot use subquery in check constraint" msgstr "в ограничении-проверке Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать подзапроÑÑ‹" -#: parser/parse_expr.c:1739 +#: parser/parse_expr.c:1828 msgid "cannot use subquery in DEFAULT expression" msgstr "в выражении DEFAULT Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать подзапроÑÑ‹" -#: parser/parse_expr.c:1742 +#: parser/parse_expr.c:1831 msgid "cannot use subquery in index expression" msgstr "в индекÑном выражении Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать подзапроÑÑ‹" -#: parser/parse_expr.c:1745 +#: parser/parse_expr.c:1834 msgid "cannot use subquery in index predicate" msgstr "в предикате индекÑа Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать подзапроÑÑ‹" -#: parser/parse_expr.c:1748 +#: parser/parse_expr.c:1837 msgid "cannot use subquery in statistics expression" msgstr "в выражении ÑтатиÑтики Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать подзапроÑÑ‹" -#: parser/parse_expr.c:1751 +#: parser/parse_expr.c:1840 msgid "cannot use subquery in transform expression" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ð¿Ð¾Ð´Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð² выражении преобразованиÑ" -#: parser/parse_expr.c:1754 +#: parser/parse_expr.c:1843 msgid "cannot use subquery in EXECUTE parameter" msgstr "в качеÑтве параметра EXECUTE Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать подзапроÑ" -#: parser/parse_expr.c:1757 +#: parser/parse_expr.c:1846 msgid "cannot use subquery in trigger WHEN condition" msgstr "в уÑловии WHEN Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать подзапроÑÑ‹" -#: parser/parse_expr.c:1760 +#: parser/parse_expr.c:1849 msgid "cannot use subquery in partition bound" msgstr "в выражении границы Ñекции Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать подзапроÑÑ‹" -#: parser/parse_expr.c:1763 +#: parser/parse_expr.c:1852 msgid "cannot use subquery in partition key expression" msgstr "в выражении ключа ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать подзапроÑÑ‹" -#: parser/parse_expr.c:1766 +#: parser/parse_expr.c:1855 msgid "cannot use subquery in CALL argument" msgstr "в качеÑтве аргумента CALL Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать подзапроÑ" -#: parser/parse_expr.c:1769 +#: parser/parse_expr.c:1858 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "в уÑловии COPY FROM WHERE Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать подзапроÑÑ‹" -#: parser/parse_expr.c:1772 +#: parser/parse_expr.c:1861 msgid "cannot use subquery in column generation expression" msgstr "в выражении генерируемого Ñтолбца Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать подзапроÑÑ‹" -#: parser/parse_expr.c:1825 +#: parser/parse_expr.c:1914 parser/parse_expr.c:3772 #, c-format msgid "subquery must return only one column" msgstr "Ð¿Ð¾Ð´Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ вернуть только один Ñтолбец" -#: parser/parse_expr.c:1896 +#: parser/parse_expr.c:1985 #, c-format msgid "subquery has too many columns" msgstr "в подзапроÑе Ñлишком много Ñтолбцов" -#: parser/parse_expr.c:1901 +#: parser/parse_expr.c:1990 #, c-format msgid "subquery has too few columns" msgstr "в подзапроÑе недоÑтаточно Ñтолбцов" -#: parser/parse_expr.c:1997 +#: parser/parse_expr.c:2094 #, c-format msgid "cannot determine type of empty array" msgstr "тип пуÑтого маÑÑива определить нельзÑ" -#: parser/parse_expr.c:1998 +#: parser/parse_expr.c:2095 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "" "Приведите его к желаемому типу Ñвным образом, например ARRAY[]::integer[]." -#: parser/parse_expr.c:2012 +#: parser/parse_expr.c:2109 #, c-format msgid "could not find element type for data type %s" msgstr "не удалоÑÑŒ определить тип Ñлемента Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° данных %s" -#: parser/parse_expr.c:2095 +#: parser/parse_expr.c:2192 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "чиÑло Ñлементов в выражениÑÑ… ROW ограничено %d" -#: parser/parse_expr.c:2300 +#: parser/parse_expr.c:2397 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "вмеÑто Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ XML-атрибута без имени должен указыватьÑÑ Ñтолбец" -#: parser/parse_expr.c:2301 +#: parser/parse_expr.c:2398 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "вмеÑто Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ XML-Ñлемента без имени должен указыватьÑÑ Ñтолбец" -#: parser/parse_expr.c:2316 +#: parser/parse_expr.c:2413 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "Ð¸Ð¼Ñ XML-атрибута \"%s\" указано неоднократно" -#: parser/parse_expr.c:2423 +#: parser/parse_expr.c:2521 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "привеÑти результат XMLSERIALIZE к типу %s нельзÑ" -#: parser/parse_expr.c:2732 parser/parse_expr.c:2928 +#: parser/parse_expr.c:2835 parser/parse_expr.c:3031 #, c-format msgid "unequal number of entries in row expressions" msgstr "разное чиÑло Ñлементов в Ñтроках" -#: parser/parse_expr.c:2742 +#: parser/parse_expr.c:2845 #, c-format msgid "cannot compare rows of zero length" msgstr "Ñтроки нулевой длины Ñравнивать нельзÑ" -#: parser/parse_expr.c:2767 +#: parser/parse_expr.c:2870 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "" "оператор ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ñтрок должен выдавать результат логичеÑкого типа, а не %s" -#: parser/parse_expr.c:2774 +#: parser/parse_expr.c:2877 #, c-format msgid "row comparison operator must not return a set" msgstr "оператор ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ñтрок не должен возвращать множеÑтво" -#: parser/parse_expr.c:2833 parser/parse_expr.c:2874 +#: parser/parse_expr.c:2936 parser/parse_expr.c:2977 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "не удалоÑÑŒ выбрать интерпретацию оператора ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ñтрок %s" -#: parser/parse_expr.c:2835 +#: parser/parse_expr.c:2938 #, c-format msgid "" "Row comparison operators must be associated with btree operator families." msgstr "" "Операторы ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ñтрок должны быть ÑвÑзаны Ñ ÑемейÑтвом операторов btree." -#: parser/parse_expr.c:2876 +#: parser/parse_expr.c:2979 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "ОказалоÑÑŒ неÑколько равноценных кандидатур." -#: parser/parse_expr.c:2969 +#: parser/parse_expr.c:3314 +#, c-format +msgid "JSON ENCODING clause is only allowed for bytea input type" +msgstr "" +"предложение JSON ENCODING можно добавить только Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð½Ð¾Ð³Ð¾ типа bytea" + +#: parser/parse_expr.c:3378 +#, c-format +msgid "cannot use non-string types with implicit FORMAT JSON clause" +msgstr "" +"Ñ Ð½ÐµÑвным предложением FORMAT JSON можно иÑпользовать только Ñтроковые типы" + +#: parser/parse_expr.c:3379 +#, c-format +msgid "cannot use non-string types with explicit FORMAT JSON clause" +msgstr "" +"Ñ Ñвным предложением FORMAT JSON можно иÑпользовать только Ñтроковые типы" + +#: parser/parse_expr.c:3468 +#, c-format +msgid "cannot use JSON format with non-string output types" +msgstr "формат JSON можно иÑпользовать, только еÑли возвращаемый тип Ñтроковый" + +#: parser/parse_expr.c:3481 +#, c-format +msgid "cannot set JSON encoding for non-bytea output types" +msgstr "" +"кодировку JSON можно иÑпользовать, только еÑли возвращаемый тип — bytea" + +#: parser/parse_expr.c:3486 +#, c-format +msgid "unsupported JSON encoding" +msgstr "Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° JSON" + +#: parser/parse_expr.c:3487 +#, c-format +msgid "Only UTF8 JSON encoding is supported." +msgstr "Ð”Ð»Ñ JSON поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ кодировка UTF-8." + +#: parser/parse_expr.c:3524 +#, c-format +msgid "returning SETOF types is not supported in SQL/JSON functions" +msgstr "функции SQL/JSON не могут возвращать типы SETOF" + +#: parser/parse_expr.c:3529 +#, c-format +msgid "returning pseudo-types is not supported in SQL/JSON functions" +msgstr "функции SQL/JSON не могут возвращать пÑевдотипы" + +#: parser/parse_expr.c:3857 parser/parse_func.c:866 +#, c-format +msgid "aggregate ORDER BY is not implemented for window functions" +msgstr "агрегатное предложение ORDER BY Ð´Ð»Ñ Ð¾ÐºÐ¾Ð½Ð½Ñ‹Ñ… функций не реализовано" + +#: parser/parse_expr.c:4080 +#, c-format +msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" +msgstr "" +"предложение JSON FORMAT ENCODING можно иÑпользовать только Ñ Ñ‚Ð¸Ð¿Ð¾Ð¼ bytea" + +#: parser/parse_expr.c:4100 +#, c-format +msgid "cannot use type %s in IS JSON predicate" +msgstr "в предикате IS JSON Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать тип %s" + +#: parser/parse_expr.c:4126 parser/parse_expr.c:4247 +#, c-format +msgid "cannot use type %s in RETURNING clause of %s" +msgstr "тип %s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в предложении RETURNING функции %s" + +#: parser/parse_expr.c:4128 +#, c-format +msgid "Try returning json or jsonb." +msgstr "Попробуйте возвратить тип json или jsonb." + +#: parser/parse_expr.c:4176 +#, c-format +msgid "cannot use non-string types with WITH UNIQUE KEYS clause" +msgstr "" +"Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼ WITH UNIQUE KEYS можно иÑпользовать только Ñтроковые типы " +"данных" + +#: parser/parse_expr.c:4250 +#, c-format +msgid "Try returning a string type or bytea." +msgstr "Попробуйте возвратить Ñтроковый тип или bytea." + +#: parser/parse_expr.c:4315 #, c-format -msgid "IS DISTINCT FROM requires = operator to yield boolean" +msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" +msgstr "FORMAT JSON не может указыватьÑÑ Ð² предложении RETURNING %s()" + +#: parser/parse_expr.c:4328 +#, c-format +msgid "" +"SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" +msgstr "" +"когда иÑпользуетÑÑ WITH WRAPPER, поведение QUOTES в SQL/JSON задать нельзÑ" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4342 parser/parse_expr.c:4371 parser/parse_expr.c:4402 +#: parser/parse_expr.c:4428 parser/parse_expr.c:4454 +#: parser/parse_jsontable.c:94 +#, c-format +msgid "invalid %s behavior" +msgstr "неверное поведение %s" + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4345 parser/parse_expr.c:4374 +#, c-format +msgid "" +"Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is " +"allowed in %s for %s." +msgstr "" +"Ð’ %s Ð´Ð»Ñ %s допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT или " +"выражение DEFAULT." + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4352 parser/parse_expr.c:4381 parser/parse_expr.c:4410 +#: parser/parse_expr.c:4438 parser/parse_expr.c:4464 +#, c-format +msgid "invalid %s behavior for column \"%s\"" +msgstr "неверное поведение %s Ð´Ð»Ñ Ñтолбца \"%s\"" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4355 parser/parse_expr.c:4384 +#, c-format +msgid "" +"Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is " +"allowed in %s for formatted columns." +msgstr "" +"Ð’ %s Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ñ… Ñтолбцов допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ ERROR, NULL, EMPTY ARRAY, " +"EMPTY OBJECT или выражение DEFAULT." + +#: parser/parse_expr.c:4403 +#, c-format +msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s." +msgstr "Ð’ %s Ð´Ð»Ñ %s допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ ERROR, TRUE, FALSE или UNKNOWN." + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4413 +#, c-format +msgid "" +"Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns." +msgstr "" +"Ð’ %s Ð´Ð»Ñ Ñтолбцов в EXISTS допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ ERROR, TRUE, FALSE или UNKNOWN." + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4431 parser/parse_expr.c:4457 +#, c-format +msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s." +msgstr "Ð’ %s Ð´Ð»Ñ %s допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ ERROR, NULL или выражение DEFAULT." + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4441 parser/parse_expr.c:4467 +#, c-format +msgid "" +"Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns." +msgstr "" +"Ð’ %s Ð´Ð»Ñ ÑкалÑрных Ñтолбцов допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ ERROR, NULL или выражение " +"DEFAULT." + +#: parser/parse_expr.c:4497 +#, c-format +msgid "JSON path expression must be of type %s, not of type %s" +msgstr "выражение пути JSON должно быть типа %s, а не типа %s" + +#: parser/parse_expr.c:4715 +#, c-format +msgid "" +"can only specify a constant, non-aggregate function, or operator expression " +"for DEFAULT" msgstr "" -"Ð´Ð»Ñ IS DISTINCT FROM требуетÑÑ, чтобы оператор = возвращал логичеÑкое " -"значение" +"в DEFAULT может задаватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ конÑтанта, вызов не агрегатной функции или " +"выражение Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼" + +#: parser/parse_expr.c:4720 +#, c-format +msgid "DEFAULT expression must not contain column references" +msgstr "Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² DEFAULT не могут Ñодержать ÑÑылки на Ñтолбцы" + +#: parser/parse_expr.c:4725 +#, c-format +msgid "DEFAULT expression must not return a set" +msgstr "выражение в DEFAULT не может возвращать множеÑтво" + +#: parser/parse_expr.c:4801 parser/parse_expr.c:4810 +#, c-format +msgid "cannot cast behavior expression of type %s to %s" +msgstr "привеÑти выражение поведениÑ, имеющее тип %s, к типу %s нельзÑ" + +#: parser/parse_expr.c:4804 +#, c-format +msgid "You will need to explicitly cast the expression to type %s." +msgstr "Приведите выражение к типу %s Ñвно." #: parser/parse_func.c:194 #, c-format @@ -19017,7 +20168,7 @@ msgstr "Ð¸Ð¼Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð° \"%s\" иÑпользуетÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ðº msgid "positional argument cannot follow named argument" msgstr "нумерованный аргумент не может Ñледовать за именованным аргументом" -#: parser/parse_func.c:287 parser/parse_func.c:2369 +#: parser/parse_func.c:287 parser/parse_func.c:2368 #, c-format msgid "%s is not a procedure" msgstr "\"%s\" — не процедура" @@ -19179,7 +20330,7 @@ msgstr "" "Возможно, неверно раÑположено предложение ORDER BY - оно должно Ñледовать за " "вÑеми обычными аргументами функции." -#: parser/parse_func.c:622 parser/parse_func.c:2412 +#: parser/parse_func.c:622 parser/parse_func.c:2411 #, c-format msgid "procedure %s does not exist" msgstr "процедура %s не ÑущеÑтвует" @@ -19207,64 +20358,59 @@ msgstr "" msgid "VARIADIC argument must be an array" msgstr "параметр VARIADIC должен быть маÑÑивом" -#: parser/parse_func.c:790 parser/parse_func.c:854 +#: parser/parse_func.c:791 parser/parse_func.c:856 #, c-format msgid "%s(*) must be used to call a parameterless aggregate function" msgstr "Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÐµÐ· параметров должна вызыватьÑÑ Ñ‚Ð°Ðº: %s(*)" -#: parser/parse_func.c:797 +#: parser/parse_func.c:798 #, c-format msgid "aggregates cannot return sets" msgstr "агрегатные функции не могут возвращать множеÑтва" -#: parser/parse_func.c:812 +#: parser/parse_func.c:813 #, c-format msgid "aggregates cannot use named arguments" msgstr "у агрегатных функций не может быть именованных аргументов" -#: parser/parse_func.c:844 +#: parser/parse_func.c:846 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "предложение DISTINCT Ð´Ð»Ñ Ð¾ÐºÐ¾Ð½Ð½Ñ‹Ñ… функций не реализовано" -#: parser/parse_func.c:864 -#, c-format -msgid "aggregate ORDER BY is not implemented for window functions" -msgstr "агрегатное предложение ORDER BY Ð´Ð»Ñ Ð¾ÐºÐ¾Ð½Ð½Ñ‹Ñ… функций не реализовано" - -#: parser/parse_func.c:873 +#: parser/parse_func.c:875 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "предложение FILTER Ð´Ð»Ñ Ð½Ðµ агрегатных оконных функций не реализовано" -#: parser/parse_func.c:882 +#: parser/parse_func.c:884 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "" "вызовы оконных функций не могут включать вызовы функций, возвращающих " "множеÑтва" -#: parser/parse_func.c:890 +#: parser/parse_func.c:892 #, c-format msgid "window functions cannot return sets" msgstr "оконные функции не могут возвращать множеÑтва" -#: parser/parse_func.c:2168 parser/parse_func.c:2441 +#: parser/parse_func.c:2167 parser/parse_func.c:2440 #, c-format msgid "could not find a function named \"%s\"" msgstr "не удалоÑÑŒ найти функцию Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"%s\"" -#: parser/parse_func.c:2182 parser/parse_func.c:2459 +#: parser/parse_func.c:2181 parser/parse_func.c:2458 #, c-format msgid "function name \"%s\" is not unique" msgstr "Ð¸Ð¼Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ \"%s\" не уникально" -#: parser/parse_func.c:2184 parser/parse_func.c:2462 +#: parser/parse_func.c:2183 parser/parse_func.c:2461 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "Задайте ÑпиÑок аргументов Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ð³Ð¾ выбора функции." -#: parser/parse_func.c:2228 +#: parser/parse_func.c:2227 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" @@ -19272,75 +20418,75 @@ msgstr[0] "процедуры допуÑкают не более %d аргуме msgstr[1] "процедуры допуÑкают не более %d аргументов" msgstr[2] "процедуры допуÑкают не более %d аргументов" -#: parser/parse_func.c:2359 +#: parser/parse_func.c:2358 #, c-format msgid "%s is not a function" msgstr "%s — не функциÑ" -#: parser/parse_func.c:2379 +#: parser/parse_func.c:2378 #, c-format msgid "function %s is not an aggregate" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" не ÑвлÑетÑÑ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð¾Ð¹" -#: parser/parse_func.c:2407 +#: parser/parse_func.c:2406 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "не удалоÑÑŒ найти процедуру Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"%s\"" -#: parser/parse_func.c:2421 +#: parser/parse_func.c:2420 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "не удалоÑÑŒ найти агрегат Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"%s\"" -#: parser/parse_func.c:2426 +#: parser/parse_func.c:2425 #, c-format msgid "aggregate %s(*) does not exist" msgstr "Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s(*) не ÑущеÑтвует" -#: parser/parse_func.c:2431 +#: parser/parse_func.c:2430 #, c-format msgid "aggregate %s does not exist" msgstr "Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s не ÑущеÑтвует" -#: parser/parse_func.c:2467 +#: parser/parse_func.c:2466 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹ \"%s\" не уникально" -#: parser/parse_func.c:2470 +#: parser/parse_func.c:2469 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "Задайте ÑпиÑок аргументов Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ð³Ð¾ выбора процедуры." -#: parser/parse_func.c:2475 +#: parser/parse_func.c:2474 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "Ð¸Ð¼Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð¾Ð¹ функции \"%s\" не уникально" -#: parser/parse_func.c:2478 +#: parser/parse_func.c:2477 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "Задайте ÑпиÑок аргументов Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ð³Ð¾ выбора агрегатной функции." -#: parser/parse_func.c:2483 +#: parser/parse_func.c:2482 #, c-format msgid "routine name \"%s\" is not unique" msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð´Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ \"%s\" не уникально" -#: parser/parse_func.c:2486 +#: parser/parse_func.c:2485 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "Задайте ÑпиÑок аргументов Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ð³Ð¾ выбора подпрограммы." -#: parser/parse_func.c:2541 +#: parser/parse_func.c:2540 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "функции, возвращающие множеÑтва, Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в уÑловиÑÑ… JOIN" -#: parser/parse_func.c:2562 +#: parser/parse_func.c:2561 msgid "set-returning functions are not allowed in policy expressions" msgstr "функции, возвращающие множеÑтва, Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… политик" -#: parser/parse_func.c:2578 +#: parser/parse_func.c:2577 msgid "set-returning functions are not allowed in window definitions" msgstr "функции, возвращающие множеÑтва, Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в определении окна" @@ -19415,64 +20561,66 @@ msgstr "" "функции, возвращающие множеÑтва, Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть в выражениÑÑ… генерируемых " "Ñтолбцов" -#: parser/parse_merge.c:119 +#: parser/parse_jsontable.c:95 +#, c-format +msgid "" +"Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause." +msgstr "" +"Ðа верхнем уровне Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ON ERROR допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ EMPTY [ ARRAY ] " +"или ERROR." + +#: parser/parse_jsontable.c:189 parser/parse_jsontable.c:203 +#, c-format +msgid "duplicate JSON_TABLE column or path name: %s" +msgstr "повторÑющийÑÑ Ñтолбец или Ð¸Ð¼Ñ Ð¿ÑƒÑ‚Ð¸ в JSON_TABLE: %s" + +#: parser/parse_merge.c:129 #, c-format msgid "WITH RECURSIVE is not supported for MERGE statement" msgstr "предложение WITH RECURSIVE не поддерживаетÑÑ Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð¼ MERGE" -#: parser/parse_merge.c:161 +#: parser/parse_merge.c:176 #, c-format msgid "unreachable WHEN clause specified after unconditional WHEN clause" msgstr "" "поÑле безуÑловного Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHEN указано недоÑтижимое предложение WHEN" -#: parser/parse_merge.c:191 -#, c-format -msgid "MERGE is not supported for relations with rules." -msgstr "MERGE не поддерживаетÑÑ Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ð¹ Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°Ð¼Ð¸." - -#: parser/parse_merge.c:208 +#: parser/parse_merge.c:222 #, c-format msgid "name \"%s\" specified more than once" msgstr "Ð¸Ð¼Ñ \"%s\" указано больше одного раза" -#: parser/parse_merge.c:210 +#: parser/parse_merge.c:224 #, c-format msgid "The name is used both as MERGE target table and data source." msgstr "Это Ð¸Ð¼Ñ Ð¸ÑпользуетÑÑ Ð¸ в целевой таблице, и в иÑточнике данных MERGE." -#: parser/parse_node.c:86 +#: parser/parse_node.c:82 #, c-format msgid "target lists can have at most %d entries" msgstr "чиÑло Ñлементов в целевом ÑпиÑке ограничено %d" -#: parser/parse_oper.c:123 parser/parse_oper.c:690 +#: parser/parse_oper.c:114 parser/parse_oper.c:678 #, c-format msgid "postfix operators are not supported" msgstr "поÑтфикÑные операторы не поддерживаютÑÑ" -#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:539 -#: utils/adt/regproc.c:723 -#, c-format -msgid "operator does not exist: %s" -msgstr "оператор не ÑущеÑтвует: %s" - -#: parser/parse_oper.c:229 +#: parser/parse_oper.c:217 #, c-format msgid "Use an explicit ordering operator or modify the query." msgstr "ИÑпользуйте Ñвный оператор Ñортировки или измените запроÑ." -#: parser/parse_oper.c:485 +#: parser/parse_oper.c:473 #, c-format msgid "operator requires run-time type coercion: %s" msgstr "оператору требуетÑÑ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ типов во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ: %s" -#: parser/parse_oper.c:641 +#: parser/parse_oper.c:629 #, c-format msgid "operator is not unique: %s" msgstr "оператор не уникален: %s" -#: parser/parse_oper.c:643 +#: parser/parse_oper.c:631 #, c-format msgid "" "Could not choose a best candidate operator. You might need to add explicit " @@ -19481,7 +20629,7 @@ msgstr "" "Ðе удалоÑÑŒ выбрать лучшую кандидатуру оператора. Возможно, вам Ñледует " "добавить Ñвные Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð¾Ð²." -#: parser/parse_oper.c:652 +#: parser/parse_oper.c:640 #, c-format msgid "" "No operator matches the given name and argument type. You might need to add " @@ -19490,7 +20638,7 @@ msgstr "" "Оператор Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼ именем и типом аргумента не найден. Возможно, вам Ñледует " "добавить Ñвное приведение типа." -#: parser/parse_oper.c:654 +#: parser/parse_oper.c:642 #, c-format msgid "" "No operator matches the given name and argument types. You might need to add " @@ -19499,61 +20647,57 @@ msgstr "" "Оператор Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ именем и типами аргументов не найден. Возможно, вам " "Ñледует добавить Ñвные Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð¾Ð²." -#: parser/parse_oper.c:714 parser/parse_oper.c:828 -#, c-format -msgid "operator is only a shell: %s" -msgstr "оператор \"%s\" - лишь оболочка" - -#: parser/parse_oper.c:816 +#: parser/parse_oper.c:803 #, c-format msgid "op ANY/ALL (array) requires array on right side" msgstr "Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² ANY/ALL (Ñ Ð¼Ð°ÑÑивом) требуетÑÑ Ð¼Ð°ÑÑив Ñправа" -#: parser/parse_oper.c:858 +#: parser/parse_oper.c:844 #, c-format msgid "op ANY/ALL (array) requires operator to yield boolean" msgstr "" "Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² ANY/ALL (Ñ Ð¼Ð°ÑÑивом) требуетÑÑ, чтобы оператор = возвращал " "логичеÑкое значение" -#: parser/parse_oper.c:863 +#: parser/parse_oper.c:849 #, c-format msgid "op ANY/ALL (array) requires operator not to return a set" msgstr "" "Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² ANY/ALL (Ñ Ð¼Ð°ÑÑивом) требуетÑÑ, чтобы оператор возвращал не " "множеÑтво" -#: parser/parse_param.c:225 +#: parser/parse_param.c:221 #, c-format msgid "inconsistent types deduced for parameter $%d" msgstr "Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° $%d выведены неÑоглаÑованные типы" -#: parser/parse_param.c:313 tcop/postgres.c:709 +#: parser/parse_param.c:309 tcop/postgres.c:744 #, c-format msgid "could not determine data type of parameter $%d" msgstr "не удалоÑÑŒ определить тип данных параметра $%d" -#: parser/parse_relation.c:201 +#: parser/parse_relation.c:221 #, c-format msgid "table reference \"%s\" is ambiguous" msgstr "ÑÑылка на таблицу \"%s\" неоднозначна" -#: parser/parse_relation.c:245 +#: parser/parse_relation.c:265 #, c-format msgid "table reference %u is ambiguous" msgstr "ÑÑылка на таблицу %u неоднозначна" -#: parser/parse_relation.c:445 +#: parser/parse_relation.c:465 #, c-format msgid "table name \"%s\" specified more than once" msgstr "Ð¸Ð¼Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\" указано больше одного раза" -#: parser/parse_relation.c:474 parser/parse_relation.c:3594 +#: parser/parse_relation.c:494 parser/parse_relation.c:3633 +#: parser/parse_relation.c:3642 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "в Ñлементе Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ FROM Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÑылка на таблицу \"%s\"" -#: parser/parse_relation.c:478 parser/parse_relation.c:3599 +#: parser/parse_relation.c:498 parser/parse_relation.c:3644 #, c-format msgid "" "There is an entry for table \"%s\", but it cannot be referenced from this " @@ -19562,35 +20706,35 @@ msgstr "" "Таблица \"%s\" приÑутÑтвует в запроÑе, но ÑоÑлатьÑÑ Ð½Ð° неё из Ñтой чаÑти " "запроÑа нельзÑ." -#: parser/parse_relation.c:480 +#: parser/parse_relation.c:500 #, c-format msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." msgstr "Ð”Ð»Ñ ÑÑылки LATERAL тип JOIN должен быть INNER или LEFT." -#: parser/parse_relation.c:691 +#: parser/parse_relation.c:703 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "в ограничении-проверке указан недопуÑтимый ÑиÑтемный Ñтолбец \"%s\"" -#: parser/parse_relation.c:700 +#: parser/parse_relation.c:712 #, c-format msgid "cannot use system column \"%s\" in column generation expression" msgstr "" "ÑиÑтемный Ñтолбец \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в выражении генерируемого " "Ñтолбца" -#: parser/parse_relation.c:711 +#: parser/parse_relation.c:723 #, c-format msgid "cannot use system column \"%s\" in MERGE WHEN condition" msgstr "ÑиÑтемный Ñтолбец \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в уÑловии MERGE WHEN" -#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 -#: parser/parse_relation.c:2357 +#: parser/parse_relation.c:1236 parser/parse_relation.c:1691 +#: parser/parse_relation.c:2384 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "в таблице \"%s\" ÑодержитÑÑ Ñтолбцов: %d, но указано: %d" -#: parser/parse_relation.c:1388 +#: parser/parse_relation.c:1445 #, c-format msgid "" "There is a WITH item named \"%s\", but it cannot be referenced from this " @@ -19599,7 +20743,7 @@ msgstr "" "Ð’ WITH еÑть Ñлемент \"%s\", но на него Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð¸Ð· Ñтой чаÑти " "запроÑа." -#: parser/parse_relation.c:1390 +#: parser/parse_relation.c:1447 #, c-format msgid "" "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." @@ -19607,13 +20751,13 @@ msgstr "" "ИÑпользуйте WITH RECURSIVE или иÑключите ÑÑылки вперёд, переупорÑдочив " "Ñлементы WITH." -#: parser/parse_relation.c:1778 +#: parser/parse_relation.c:1833 #, c-format msgid "" "a column definition list is redundant for a function with OUT parameters" msgstr "ÑпиÑок определений Ñтолбцов не нужен Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸ OUT" -#: parser/parse_relation.c:1784 +#: parser/parse_relation.c:1839 #, c-format msgid "" "a column definition list is redundant for a function returning a named " @@ -19622,77 +20766,93 @@ msgstr "" "ÑпиÑок определений Ñтолбцов не нужен Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸, возвращающий именованный " "ÑоÑтавной тип" -#: parser/parse_relation.c:1791 +#: parser/parse_relation.c:1846 #, c-format msgid "" "a column definition list is only allowed for functions returning \"record\"" msgstr "" "ÑпиÑок определений Ñтолбцов может быть только у функций, возвращающих запиÑÑŒ" -#: parser/parse_relation.c:1802 +#: parser/parse_relation.c:1857 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "" "у функций, возвращающих запиÑÑŒ, должен быть ÑпиÑок определений Ñтолбцов" -#: parser/parse_relation.c:1839 +#: parser/parse_relation.c:1894 #, c-format msgid "column definition lists can have at most %d entries" msgstr "чиÑло Ñлементов в ÑпиÑках Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñтолбцов ограничено %d" -#: parser/parse_relation.c:1899 +#: parser/parse_relation.c:1954 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\", иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð²Ð¾ FROM, возвращает неподдерживаемый тип %s" -#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 +#: parser/parse_relation.c:1981 parser/parse_relation.c:2066 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "чиÑло Ñтолбцов, возвращаемых функциÑми во FROM, ограничено %d" -#: parser/parse_relation.c:2049 +#: parser/parse_relation.c:2096 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ %s выдаёт Ñтолбцов: %d, но указано: %d" -#: parser/parse_relation.c:2138 +#: parser/parse_relation.c:2177 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "в ÑпиÑках VALUES \"%s\" ÑодержитÑÑ Ñтолбцов: %d, но указано: %d" -#: parser/parse_relation.c:2210 +#: parser/parse_relation.c:2242 #, c-format msgid "joins can have at most %d columns" msgstr "чиÑло Ñтолбцов в ÑоединениÑÑ… ограничено %d" -#: parser/parse_relation.c:2235 +#: parser/parse_relation.c:2267 #, c-format msgid "" "join expression \"%s\" has %d columns available but %d columns specified" msgstr "в выражении ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ \"%s\" имеетÑÑ Ñтолбцов: %d, но указано: %d" -#: parser/parse_relation.c:2330 +#: parser/parse_relation.c:2357 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "в запроÑе \"%s\" в WITH нет Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ RETURNING" -#: parser/parse_relation.c:3597 +#: parser/parse_relation.c:3635 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Возможно, предполагалаÑÑŒ ÑÑылка на пÑевдоним таблицы \"%s\"." -#: parser/parse_relation.c:3605 +#: parser/parse_relation.c:3647 +#, c-format +msgid "To reference that table, you must mark this subquery with LATERAL." +msgstr "" +"Чтобы обратитьÑÑ Ðº Ñтой таблице, нужно добавить Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ подзапроÑа " +"пометку LATERAL." + +#: parser/parse_relation.c:3653 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "таблица \"%s\" отÑутÑтвует в предложении FROM" -#: parser/parse_relation.c:3657 +#: parser/parse_relation.c:3693 #, c-format -msgid "Perhaps you meant to reference the column \"%s.%s\"." -msgstr "Возможно, предполагалаÑÑŒ ÑÑылка на Ñтолбец \"%s.%s\"." +msgid "" +"There are columns named \"%s\", but they are in tables that cannot be " +"referenced from this part of the query." +msgstr "" +"ИмеютÑÑ Ñтолбцы Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"%s\", но они отноÑÑÑ‚ÑÑ Ðº таблицам, к которым " +"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð¸Ñ‚ÑŒÑÑ Ð¸Ð· Ñтой чаÑти запроÑа." + +#: parser/parse_relation.c:3695 +#, c-format +msgid "Try using a table-qualified name." +msgstr "Попробуйте иÑпользовать Ð¸Ð¼Ñ Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ таблицы." -#: parser/parse_relation.c:3659 +#: parser/parse_relation.c:3703 #, c-format msgid "" "There is a column named \"%s\" in table \"%s\", but it cannot be referenced " @@ -19701,34 +20861,52 @@ msgstr "" "Столбец \"%s\" еÑть в таблице \"%s\", но на него Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð¸Ð· Ñтой " "чаÑти запроÑа." -#: parser/parse_relation.c:3676 +#: parser/parse_relation.c:3706 +#, c-format +msgid "To reference that column, you must mark this subquery with LATERAL." +msgstr "" +"Чтобы обратитьÑÑ Ðº Ñтому Ñтолбцу, нужно добавить Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ подзапроÑа " +"пометку LATERAL." + +#: parser/parse_relation.c:3708 +#, c-format +msgid "To reference that column, you must use a table-qualified name." +msgstr "" +"Чтобы обратитьÑÑ Ðº Ñтому Ñтолбцу, нужно иÑпользовать Ð¸Ð¼Ñ Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ таблицы." + +#: parser/parse_relation.c:3728 +#, c-format +msgid "Perhaps you meant to reference the column \"%s.%s\"." +msgstr "Возможно, предполагалаÑÑŒ ÑÑылка на Ñтолбец \"%s.%s\"." + +#: parser/parse_relation.c:3742 #, c-format msgid "" "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "" "Возможно, предполагалаÑÑŒ ÑÑылка на Ñтолбец \"%s.%s\" или Ñтолбец \"%s.%s\"." -#: parser/parse_target.c:482 parser/parse_target.c:803 +#: parser/parse_target.c:480 parser/parse_target.c:795 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "приÑвоить значение ÑиÑтемному Ñтолбцу \"%s\" нельзÑ" -#: parser/parse_target.c:510 +#: parser/parse_target.c:508 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "Ñлементу маÑÑива Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ñвоить значение по умолчанию" -#: parser/parse_target.c:515 +#: parser/parse_target.c:513 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "вложенному полю Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ñвоить значение по умолчанию" -#: parser/parse_target.c:589 +#: parser/parse_target.c:587 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "Ñтолбец \"%s\" имеет тип %s, а выражение - %s" -#: parser/parse_target.c:787 +#: parser/parse_target.c:779 #, c-format msgid "" "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a " @@ -19737,7 +20915,7 @@ msgstr "" "приÑвоить значение полю \"%s\" Ñтолбца \"%s\" нельзÑ, так как тип %s не " "ÑвлÑетÑÑ ÑоÑтавным" -#: parser/parse_target.c:796 +#: parser/parse_target.c:788 #, c-format msgid "" "cannot assign to field \"%s\" of column \"%s\" because there is no such " @@ -19760,7 +20938,7 @@ msgstr "" msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "вложенное поле \"%s\" имеет тип %s, а выражение - %s" -#: parser/parse_target.c:1323 +#: parser/parse_target.c:1327 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * должен ÑÑылатьÑÑ Ð½Ð° таблицы" @@ -19780,8 +20958,8 @@ msgstr "неправильное указание %%TYPE (Ñлишком мно msgid "type reference %s converted to %s" msgstr "ÑÑылка на тип %s преобразована в тип %s" -#: parser/parse_type.c:278 parser/parse_type.c:807 utils/cache/typcache.c:390 -#: utils/cache/typcache.c:445 +#: parser/parse_type.c:278 parser/parse_type.c:813 utils/cache/typcache.c:397 +#: utils/cache/typcache.c:452 #, c-format msgid "type \"%s\" is only a shell" msgstr "тип \"%s\" ÑвлÑетÑÑ Ð¿ÑƒÑтышкой" @@ -19796,84 +20974,84 @@ msgstr "у типа \"%s\" не может быть модификаторов" msgid "type modifiers must be simple constants or identifiers" msgstr "модификатором типа должна быть проÑÑ‚Ð°Ñ ÐºÐ¾Ð½Ñтанта или идентификатор" -#: parser/parse_type.c:725 parser/parse_type.c:770 +#: parser/parse_type.c:723 parser/parse_type.c:773 #, c-format msgid "invalid type name \"%s\"" msgstr "неверное Ð¸Ð¼Ñ Ñ‚Ð¸Ð¿Ð° \"%s\"" -#: parser/parse_utilcmd.c:266 +#: parser/parse_utilcmd.c:263 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "Ñоздать Ñекционированную таблицу в виде потомка нельзÑ" -#: parser/parse_utilcmd.c:579 +#: parser/parse_utilcmd.c:475 +#, c-format +msgid "cannot set logged status of a temporary sequence" +msgstr "изменить ÑоÑтоÑние Ð¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹ поÑледовательноÑти нельзÑ" + +#: parser/parse_utilcmd.c:611 #, c-format msgid "array of serial is not implemented" msgstr "маÑÑивы Ñ Ñ‚Ð¸Ð¿Ð¾Ð¼ serial не реализованы" -#: parser/parse_utilcmd.c:658 parser/parse_utilcmd.c:670 -#: parser/parse_utilcmd.c:729 +#: parser/parse_utilcmd.c:690 parser/parse_utilcmd.c:702 +#: parser/parse_utilcmd.c:761 #, c-format msgid "" "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "конфликт NULL/NOT NULL в объÑвлении Ñтолбца \"%s\" таблицы \"%s\"" -#: parser/parse_utilcmd.c:682 +#: parser/parse_utilcmd.c:714 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "" "Ð´Ð»Ñ Ñтолбца \"%s\" таблицы \"%s\" указано неÑколько значений по умолчанию" -#: parser/parse_utilcmd.c:699 +#: parser/parse_utilcmd.c:731 #, c-format msgid "identity columns are not supported on typed tables" msgstr "Ñтолбцы идентификации не поддерживаютÑÑ Ñ Ñ‚Ð¸Ð¿Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ð¼Ð¸ таблицами" -#: parser/parse_utilcmd.c:703 +#: parser/parse_utilcmd.c:735 #, c-format msgid "identity columns are not supported on partitions" msgstr "Ñтолбцы идентификации не поддерживаютÑÑ Ñ ÑекциÑми" -#: parser/parse_utilcmd.c:712 +#: parser/parse_utilcmd.c:744 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "" "Ð´Ð»Ñ Ñтолбца \"%s\" таблицы \"%s\" ÑвойÑтво identity задано неоднократно" -#: parser/parse_utilcmd.c:742 +#: parser/parse_utilcmd.c:774 #, c-format msgid "generated columns are not supported on typed tables" msgstr "генерируемые Ñтолбцы не поддерживаютÑÑ Ñ Ñ‚Ð¸Ð¿Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ð¼Ð¸ таблицами" -#: parser/parse_utilcmd.c:746 -#, c-format -msgid "generated columns are not supported on partitions" -msgstr "генерируемые Ñтолбцы не поддерживаютÑÑ Ñ ÑекциÑми" - -#: parser/parse_utilcmd.c:751 +#: parser/parse_utilcmd.c:778 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "" "Ð´Ð»Ñ Ñтолбца \"%s\" таблицы \"%s\" указано неÑколько генерирующих выражений" -#: parser/parse_utilcmd.c:769 parser/parse_utilcmd.c:884 +#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:911 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€Ð²Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ ключа Ð´Ð»Ñ Ñторонних таблиц не поддерживаютÑÑ" -#: parser/parse_utilcmd.c:778 parser/parse_utilcmd.c:894 +#: parser/parse_utilcmd.c:805 parser/parse_utilcmd.c:921 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ð¾Ñти Ð´Ð»Ñ Ñторонних таблиц не поддерживаютÑÑ" -#: parser/parse_utilcmd.c:823 +#: parser/parse_utilcmd.c:850 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "" "Ð´Ð»Ñ Ñтолбца \"%s\" таблицы \"%s\" задано и значение по умолчанию, и ÑвойÑтво " "identity" -#: parser/parse_utilcmd.c:831 +#: parser/parse_utilcmd.c:858 #, c-format msgid "" "both default and generation expression specified for column \"%s\" of table " @@ -19882,7 +21060,7 @@ msgstr "" "Ð´Ð»Ñ Ñтолбца \"%s\" таблицы \"%s\" задано и значение по умолчанию, и " "генерирующее выражение" -#: parser/parse_utilcmd.c:839 +#: parser/parse_utilcmd.c:866 #, c-format msgid "" "both identity and generation expression specified for column \"%s\" of table " @@ -19891,98 +21069,88 @@ msgstr "" "Ð´Ð»Ñ Ñтолбца \"%s\" таблицы \"%s\" задано и генерирующее выражение, и " "ÑвойÑтво identity" -#: parser/parse_utilcmd.c:904 +#: parser/parse_utilcmd.c:931 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "ограничениÑ-иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñторонних таблиц не поддерживаютÑÑ" -#: parser/parse_utilcmd.c:910 -#, c-format -msgid "exclusion constraints are not supported on partitioned tables" -msgstr "ограничениÑ-иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñекционированных таблиц не поддерживаютÑÑ" - -#: parser/parse_utilcmd.c:975 +#: parser/parse_utilcmd.c:996 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE при Ñоздании Ñторонних таблиц не поддерживаетÑÑ" -#: parser/parse_utilcmd.c:988 +#: parser/parse_utilcmd.c:1009 #, c-format msgid "relation \"%s\" is invalid in LIKE clause" msgstr "отношение \"%s\" не подходит Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ LIKE" -#: parser/parse_utilcmd.c:1754 parser/parse_utilcmd.c:1862 +#: parser/parse_utilcmd.c:1736 parser/parse_utilcmd.c:1844 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "Ð˜Ð½Ð´ÐµÐºÑ \"%s\" ÑÑылаетÑÑ Ð½Ð° тип вÑей Ñтроки таблицы." -#: parser/parse_utilcmd.c:2251 +#: parser/parse_utilcmd.c:2242 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "в CREATE TABLE Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать ÑущеÑтвующий индекÑ" -#: parser/parse_utilcmd.c:2271 +#: parser/parse_utilcmd.c:2262 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" уже ÑвÑзан Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸ÐµÐ¼" -#: parser/parse_utilcmd.c:2286 -#, c-format -msgid "index \"%s\" is not valid" -msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" - нерабочий" - -#: parser/parse_utilcmd.c:2292 +#: parser/parse_utilcmd.c:2283 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\" не ÑвлÑетÑÑ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼ индекÑом" -#: parser/parse_utilcmd.c:2293 parser/parse_utilcmd.c:2300 -#: parser/parse_utilcmd.c:2307 parser/parse_utilcmd.c:2384 +#: parser/parse_utilcmd.c:2284 parser/parse_utilcmd.c:2291 +#: parser/parse_utilcmd.c:2298 parser/parse_utilcmd.c:2375 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "" "Создать первичный ключ или ограничение уникальноÑти Ð´Ð»Ñ Ñ‚Ð°ÐºÐ¾Ð³Ð¾ индекÑа " "нельзÑ." -#: parser/parse_utilcmd.c:2299 +#: parser/parse_utilcmd.c:2290 #, c-format msgid "index \"%s\" contains expressions" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" Ñодержит выражениÑ" -#: parser/parse_utilcmd.c:2306 +#: parser/parse_utilcmd.c:2297 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\" - чаÑтичный индекÑ" -#: parser/parse_utilcmd.c:2318 +#: parser/parse_utilcmd.c:2309 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\" - откладываемый индекÑ" -#: parser/parse_utilcmd.c:2319 +#: parser/parse_utilcmd.c:2310 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "" "Создать не откладываемое ограничение на базе откладываемого индекÑа нельзÑ." -#: parser/parse_utilcmd.c:2383 +#: parser/parse_utilcmd.c:2374 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "" "в индекÑе \"%s\" Ð´Ð»Ñ Ñтолбца номер %d не определено поведение Ñортировки по " "умолчанию" -#: parser/parse_utilcmd.c:2540 +#: parser/parse_utilcmd.c:2531 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "Ñтолбец \"%s\" фигурирует в первичном ключе дважды" -#: parser/parse_utilcmd.c:2546 +#: parser/parse_utilcmd.c:2537 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "Ñтолбец \"%s\" фигурирует в ограничении уникальноÑти дважды" -#: parser/parse_utilcmd.c:2893 +#: parser/parse_utilcmd.c:2871 #, c-format msgid "" "index expressions and predicates can refer only to the table being indexed" @@ -19990,22 +21158,22 @@ msgstr "" "индекÑные Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸ предикаты могут ÑÑылатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на индекÑируемую " "таблицу" -#: parser/parse_utilcmd.c:2965 +#: parser/parse_utilcmd.c:2943 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÑтатиÑтики могут ÑÑылатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на целевую таблицу" -#: parser/parse_utilcmd.c:3008 +#: parser/parse_utilcmd.c:2986 #, c-format msgid "rules on materialized views are not supported" msgstr "правила Ð´Ð»Ñ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… предÑтавлений не поддерживаютÑÑ" -#: parser/parse_utilcmd.c:3071 +#: parser/parse_utilcmd.c:3046 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "в уÑловиÑÑ… WHERE Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð½Ð° другие отношениÑ" -#: parser/parse_utilcmd.c:3144 +#: parser/parse_utilcmd.c:3118 #, c-format msgid "" "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE " @@ -20014,187 +21182,187 @@ msgstr "" "правила Ñ ÑƒÑловиÑми WHERE могут Ñодержать только дейÑÑ‚Ð²Ð¸Ñ SELECT, INSERT, " "UPDATE или DELETE" -#: parser/parse_utilcmd.c:3162 parser/parse_utilcmd.c:3263 -#: rewrite/rewriteHandler.c:513 rewrite/rewriteManip.c:1018 +#: parser/parse_utilcmd.c:3136 parser/parse_utilcmd.c:3237 +#: rewrite/rewriteHandler.c:544 rewrite/rewriteManip.c:1096 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "уÑловные операторы UNION/INTERSECT/EXCEPT не реализованы" -#: parser/parse_utilcmd.c:3180 +#: parser/parse_utilcmd.c:3154 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "в правиле ON SELECT Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать OLD" -#: parser/parse_utilcmd.c:3184 +#: parser/parse_utilcmd.c:3158 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "в правиле ON SELECT Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать NEW" -#: parser/parse_utilcmd.c:3193 +#: parser/parse_utilcmd.c:3167 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "в правиле ON INSERT Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать OLD" -#: parser/parse_utilcmd.c:3199 +#: parser/parse_utilcmd.c:3173 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "в правиле ON DELETE Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать NEW" -#: parser/parse_utilcmd.c:3227 +#: parser/parse_utilcmd.c:3201 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "в запроÑе WITH Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð½Ð° OLD" -#: parser/parse_utilcmd.c:3234 +#: parser/parse_utilcmd.c:3208 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "в запроÑе WITH Ð½ÐµÐ»ÑŒÐ·Ñ ÑÑылатьÑÑ Ð½Ð° NEW" -#: parser/parse_utilcmd.c:3688 +#: parser/parse_utilcmd.c:3664 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "предложение DEFERRABLE раÑположено неправильно" -#: parser/parse_utilcmd.c:3693 parser/parse_utilcmd.c:3708 +#: parser/parse_utilcmd.c:3669 parser/parse_utilcmd.c:3684 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "DEFERRABLE/NOT DEFERRABLE можно указать только один раз" -#: parser/parse_utilcmd.c:3703 +#: parser/parse_utilcmd.c:3679 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "предложение NOT DEFERRABLE раÑположено неправильно" -#: parser/parse_utilcmd.c:3716 parser/parse_utilcmd.c:3742 gram.y:5937 +#: parser/parse_utilcmd.c:3692 parser/parse_utilcmd.c:3718 gram.y:6114 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "" "ограничение Ñ Ñ…Ð°Ñ€Ð°ÐºÑ‚ÐµÑ€Ð¸Ñтикой INITIALLY DEFERRED должно быть объÑвлено как " "DEFERRABLE" -#: parser/parse_utilcmd.c:3724 +#: parser/parse_utilcmd.c:3700 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "предложение INITIALLY DEFERRED раÑположено неправильно" -#: parser/parse_utilcmd.c:3729 parser/parse_utilcmd.c:3755 +#: parser/parse_utilcmd.c:3705 parser/parse_utilcmd.c:3731 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "INITIALLY IMMEDIATE/DEFERRED можно указать только один раз" -#: parser/parse_utilcmd.c:3750 +#: parser/parse_utilcmd.c:3726 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "предложение INITIALLY IMMEDIATE раÑположено неправильно" -#: parser/parse_utilcmd.c:3941 +#: parser/parse_utilcmd.c:3919 #, c-format msgid "" "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "в CREATE указана Ñхема (%s), Ð¾Ñ‚Ð»Ð¸Ñ‡Ð½Ð°Ñ Ð¾Ñ‚ Ñоздаваемой (%s)" -#: parser/parse_utilcmd.c:3976 +#: parser/parse_utilcmd.c:3954 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\" — не ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð°" -#: parser/parse_utilcmd.c:3983 +#: parser/parse_utilcmd.c:3961 #, c-format msgid "table \"%s\" is not partitioned" msgstr "таблица \"%s\" не ÑвлÑетÑÑ Ñекционированной" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:3968 #, c-format msgid "index \"%s\" is not partitioned" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" не Ñекционирован" -#: parser/parse_utilcmd.c:4030 +#: parser/parse_utilcmd.c:4008 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "у Ñекционированной по хешу таблицы не может быть Ñекции по умолчанию" -#: parser/parse_utilcmd.c:4047 +#: parser/parse_utilcmd.c:4025 #, c-format msgid "invalid bound specification for a hash partition" msgstr "неправильное указание Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ…ÐµÑˆ-Ñекции" -#: parser/parse_utilcmd.c:4053 partitioning/partbounds.c:4824 +#: parser/parse_utilcmd.c:4031 partitioning/partbounds.c:4802 #, c-format msgid "modulus for hash partition must be an integer value greater than zero" msgstr "модуль Ð´Ð»Ñ Ñ…ÐµÑˆ-Ñекции должен быть положительным целым" -#: parser/parse_utilcmd.c:4060 partitioning/partbounds.c:4832 +#: parser/parse_utilcmd.c:4038 partitioning/partbounds.c:4810 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "оÑтаток Ð´Ð»Ñ Ñ…ÐµÑˆ-Ñекции должен быть меньше модулÑ" -#: parser/parse_utilcmd.c:4073 +#: parser/parse_utilcmd.c:4051 #, c-format msgid "invalid bound specification for a list partition" msgstr "неправильное указание Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñекции по ÑпиÑку" -#: parser/parse_utilcmd.c:4126 +#: parser/parse_utilcmd.c:4104 #, c-format msgid "invalid bound specification for a range partition" msgstr "неправильное указание Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñекции по диапазону" -#: parser/parse_utilcmd.c:4132 +#: parser/parse_utilcmd.c:4110 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "" "во FROM должно указыватьÑÑ Ñ€Ð¾Ð²Ð½Ð¾ одно значение Ð´Ð»Ñ Ñекционирующего Ñтолбца" -#: parser/parse_utilcmd.c:4136 +#: parser/parse_utilcmd.c:4114 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "" "в TO должно указыватьÑÑ Ñ€Ð¾Ð²Ð½Ð¾ одно значение Ð´Ð»Ñ Ñекционирующего Ñтолбца" -#: parser/parse_utilcmd.c:4250 +#: parser/parse_utilcmd.c:4228 #, c-format msgid "cannot specify NULL in range bound" msgstr "указать NULL в диапазонном ограничении нельзÑ" -#: parser/parse_utilcmd.c:4299 +#: parser/parse_utilcmd.c:4277 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "за границей MAXVALUE могут Ñледовать только границы MAXVALUE" -#: parser/parse_utilcmd.c:4306 +#: parser/parse_utilcmd.c:4284 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "за границей MINVALUE могут Ñледовать только границы MINVALUE" -#: parser/parse_utilcmd.c:4349 +#: parser/parse_utilcmd.c:4327 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "указанное значение Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð²ÐµÑти к типу %s Ñтолбца \"%s\"" -#: parser/parser.c:247 +#: parser/parser.c:273 msgid "UESCAPE must be followed by a simple string literal" msgstr "За UESCAPE должна Ñледовать проÑÑ‚Ð°Ñ ÑÑ‚Ñ€Ð¾ÐºÐ¾Ð²Ð°Ñ ÐºÐ¾Ð½Ñтанта" -#: parser/parser.c:252 +#: parser/parser.c:278 msgid "invalid Unicode escape character" msgstr "неверный Ñимвол Ñпецкода Unicode" -#: parser/parser.c:321 scan.l:1338 +#: parser/parser.c:347 scan.l:1393 #, c-format msgid "invalid Unicode escape value" msgstr "неверное значение Ñпецкода Unicode" -#: parser/parser.c:468 utils/adt/varlena.c:6529 scan.l:684 +#: parser/parser.c:494 utils/adt/varlena.c:6640 scan.l:716 #, c-format msgid "invalid Unicode escape" msgstr "неверный Ñпецкод Unicode" -#: parser/parser.c:469 +#: parser/parser.c:495 #, c-format msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Спецкоды Unicode должны иметь вид \\XXXX или \\+XXXXXX." -#: parser/parser.c:497 utils/adt/varlena.c:6554 scan.l:645 scan.l:661 -#: scan.l:677 +#: parser/parser.c:523 utils/adt/varlena.c:6665 scan.l:677 scan.l:693 +#: scan.l:709 #, c-format msgid "invalid Unicode surrogate pair" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÑƒÑ€Ñ€Ð¾Ð³Ð°Ñ‚Ð½Ð°Ñ Ð¿Ð°Ñ€Ð° Unicode" @@ -20204,20 +21372,20 @@ msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÑƒÑ€Ñ€Ð¾Ð³Ð°Ñ‚Ð½Ð°Ñ Ð¿Ð°Ñ€Ð° Unicode" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "идентификатор \"%s\" будет уÑечён до \"%.*s\"" -#: partitioning/partbounds.c:2933 +#: partitioning/partbounds.c:2920 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "ÑÐµÐºÑ†Ð¸Ñ \"%s\" конфликтует Ñ ÑущеÑтвующей Ñекцией по умолчанию \"%s\"" -#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 -#: partitioning/partbounds.c:3026 +#: partitioning/partbounds.c:2972 partitioning/partbounds.c:2991 +#: partitioning/partbounds.c:3013 #, c-format msgid "" "every hash partition modulus must be a factor of the next larger modulus" msgstr "" "модуль каждой хеш-Ñекции должен быть делителем модулей, превышающих его" -#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 +#: partitioning/partbounds.c:2973 partitioning/partbounds.c:3014 #, c-format msgid "" "The new modulus %d is not a factor of %d, the modulus of existing partition " @@ -20225,29 +21393,29 @@ msgid "" msgstr "" "Ðовый модуль %d не ÑвлÑетÑÑ Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»ÐµÐ¼ %d, Ð¼Ð¾Ð´ÑƒÐ»Ñ ÑущеÑтвующей Ñекции \"%s\"." -#: partitioning/partbounds.c:3005 +#: partitioning/partbounds.c:2992 #, c-format msgid "" "The new modulus %d is not divisible by %d, the modulus of existing partition " "\"%s\"." msgstr "Ðовый модуль %d не делитÑÑ Ð½Ð° %d, модуль ÑущеÑтвующей Ñекции \"%s\"." -#: partitioning/partbounds.c:3140 +#: partitioning/partbounds.c:3127 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "Ð´Ð»Ñ Ñекции \"%s\" заданы границы, образующие пуÑтой диапазон" -#: partitioning/partbounds.c:3142 +#: partitioning/partbounds.c:3129 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "Ð£ÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð½Ð¸Ð¶Ð½ÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° %s больше или равна верхней границе %s." -#: partitioning/partbounds.c:3254 +#: partitioning/partbounds.c:3237 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "ÑÐµÐºÑ†Ð¸Ñ \"%s\" переÑекаетÑÑ Ñ Ñекцией \"%s\"" -#: partitioning/partbounds.c:3371 +#: partitioning/partbounds.c:3354 #, c-format msgid "" "skipped scanning foreign table \"%s\" which is a partition of default " @@ -20256,19 +21424,19 @@ msgstr "" "пропущено Ñканирование Ñторонней таблицы \"%s\", ÑвлÑющейÑÑ Ñекцией Ñекции " "по умолчанию \"%s\"" -#: partitioning/partbounds.c:4828 +#: partitioning/partbounds.c:4806 #, c-format msgid "" "remainder for hash partition must be an integer value greater than or equal " "to zero" msgstr "значение оÑтатка Ð´Ð»Ñ Ñ…ÐµÑˆ-Ñекции должно быть неотрицательным целым" -#: partitioning/partbounds.c:4852 +#: partitioning/partbounds.c:4830 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\" не ÑвлÑетÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÐµÐ¹, Ñекционированной по хешу" -#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 +#: partitioning/partbounds.c:4841 partitioning/partbounds.c:4958 #, c-format msgid "" "number of partitioning columns (%d) does not match number of partition keys " @@ -20277,7 +21445,7 @@ msgstr "" "чиÑло Ñекционирующих Ñтолбцов (%d) не равно чиÑлу предÑтавленных ключей " "ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (%d)" -#: partitioning/partbounds.c:4885 +#: partitioning/partbounds.c:4863 #, c-format msgid "" "column %d of the partition key has type %s, but supplied value is of type %s" @@ -20285,7 +21453,7 @@ msgstr "" "Ñтолбец %d ключа ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ тип %s, но Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ передано значение " "типа %s" -#: partitioning/partbounds.c:4917 +#: partitioning/partbounds.c:4895 #, c-format msgid "" "column %d of the partition key has type \"%s\", but supplied value is of " @@ -20294,23 +21462,23 @@ msgstr "" "Ñтолбец %d ключа ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ тип \"%s\", но Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ передано " "значение типа \"%s\"" -#: port/pg_sema.c:209 port/pg_shmem.c:695 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:695 +#: port/pg_sema.c:209 port/pg_shmem.c:717 port/posix_sema.c:209 +#: port/sysv_sema.c:329 port/sysv_shmem.c:717 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "не удалоÑÑŒ получить информацию о каталоге данных \"%s\": %m" -#: port/pg_shmem.c:227 port/sysv_shmem.c:227 +#: port/pg_shmem.c:224 port/sysv_shmem.c:224 #, c-format msgid "could not create shared memory segment: %m" msgstr "не удалоÑÑŒ Ñоздать Ñегмент разделÑемой памÑти: %m" -#: port/pg_shmem.c:228 port/sysv_shmem.c:228 +#: port/pg_shmem.c:225 port/sysv_shmem.c:225 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "Ошибка в ÑиÑтемном вызове shmget(ключ=%lu, размер=%zu, 0%o)." -#: port/pg_shmem.c:232 port/sysv_shmem.c:232 +#: port/pg_shmem.c:229 port/sysv_shmem.c:229 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory " @@ -20324,7 +21492,7 @@ msgstr "" "ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ наÑтройке разделÑемой памÑти ÑодержитÑÑ Ð² " "документации PostgreSQL." -#: port/pg_shmem.c:239 port/sysv_shmem.c:239 +#: port/pg_shmem.c:236 port/sysv_shmem.c:236 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory " @@ -20339,7 +21507,7 @@ msgstr "" "ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ наÑтройке разделÑемой памÑти ÑодержитÑÑ Ð² " "документации PostgreSQL." -#: port/pg_shmem.c:245 port/sysv_shmem.c:245 +#: port/pg_shmem.c:242 port/sysv_shmem.c:242 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs " @@ -20356,44 +21524,51 @@ msgstr "" "ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ наÑтройке разделÑемой памÑти ÑодержитÑÑ Ð² " "документации PostgreSQL." -#: port/pg_shmem.c:633 port/sysv_shmem.c:633 +#: port/pg_shmem.c:584 port/sysv_shmem.c:584 port/win32_shmem.c:646 +#, c-format +msgid "\"huge_page_size\" must be 0 on this platform." +msgstr "Значение \"huge_page_size\" должно равнÑтьÑÑ 0 на Ñтой платформе." + +#: port/pg_shmem.c:655 port/sysv_shmem.c:655 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "не удалоÑÑŒ получить анонимную разделÑемую памÑть: %m" -#: port/pg_shmem.c:635 port/sysv_shmem.c:635 +#: port/pg_shmem.c:657 port/sysv_shmem.c:657 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory " "segment exceeded available memory, swap space, or huge pages. To reduce the " "request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, " -"perhaps by reducing shared_buffers or max_connections." +"perhaps by reducing \"shared_buffers\" or \"max_connections\"." msgstr "" "Эта ошибка обычно возникает, когда PostgreSQL запрашивает Ñегмент " "разделÑемой памÑти, Ð¿Ñ€ÐµÐ²Ñ‹ÑˆÐ°Ñ Ð¾Ð±ÑŠÑ‘Ð¼ доÑтупной физичеÑкой либо виртуальной " "памÑти или огромных Ñтраниц. Ð”Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа (текущий размер: %zu Б) " "можно Ñнизить иÑпользование разделÑемой памÑти, возможно, уменьшив " -"shared_buffers или max_connections." +"\"shared_buffers\" или \"max_connections\"." -#: port/pg_shmem.c:703 port/sysv_shmem.c:703 +#: port/pg_shmem.c:725 port/sysv_shmem.c:725 #, c-format msgid "huge pages not supported on this platform" msgstr "огромные Ñтраницы на Ñтой платформе не поддерживаютÑÑ" -#: port/pg_shmem.c:710 port/sysv_shmem.c:710 +#: port/pg_shmem.c:732 port/sysv_shmem.c:732 #, c-format -msgid "huge pages not supported with the current shared_memory_type setting" +msgid "" +"huge pages not supported with the current \"shared_memory_type\" setting" msgstr "" -"огромные Ñтраницы не поддерживаютÑÑ Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼ значением shared_memory_type" +"огромные Ñтраницы не поддерживаютÑÑ Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼ значением " +"\"shared_memory_type\"" -#: port/pg_shmem.c:770 port/sysv_shmem.c:770 utils/init/miscinit.c:1187 +#: port/pg_shmem.c:798 port/sysv_shmem.c:798 utils/init/miscinit.c:1401 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "" "ранее выделенный блок разделÑемой памÑти (ключ %lu, ID %lu) по-прежнему " "иÑпользуетÑÑ" -#: port/pg_shmem.c:773 port/sysv_shmem.c:773 utils/init/miscinit.c:1189 +#: port/pg_shmem.c:801 port/sysv_shmem.c:801 utils/init/miscinit.c:1403 #, c-format msgid "" "Terminate any old server processes associated with data directory \"%s\"." @@ -20401,17 +21576,17 @@ msgstr "" "Завершите вÑе Ñтарые Ñерверные процеÑÑÑ‹, работающие Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼ данных " "\"%s\"." -#: port/sysv_sema.c:124 +#: port/sysv_sema.c:126 #, c-format msgid "could not create semaphores: %m" msgstr "не удалоÑÑŒ Ñоздать Ñемафоры: %m" -#: port/sysv_sema.c:125 +#: port/sysv_sema.c:127 #, c-format msgid "Failed system call was semget(%lu, %d, 0%o)." msgstr "Ошибка в ÑиÑтемном вызове semget(%lu, %d, 0%o)." -#: port/sysv_sema.c:129 +#: port/sysv_sema.c:131 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs " @@ -20419,18 +21594,19 @@ msgid "" "(SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be " "exceeded. You need to raise the respective kernel parameter. " "Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its " -"max_connections parameter.\n" +"\"max_connections\" parameter.\n" "The PostgreSQL documentation contains more information about configuring " "your system for PostgreSQL." msgstr "" "Эта ошибка ÐЕ означает, что на диÑке нет меÑта. ВероÑтнее вÑего, превышен " "предел чиÑла уÑтановленных Ñемафоров (SEMMNI), либо общего чиÑла Ñемафоров " "(SEMMNS) в ÑиÑтеме. Увеличьте ÑоответÑтвующий параметр Ñдра или уменьшите " -"потребноÑть PostgreSQL в Ñемафорах, уменьшив его параметр max_connections.\n" +"потребноÑть PostgreSQL в Ñемафорах, уменьшив его параметр " +"\"max_connections\".\n" "ÐŸÐ¾Ð´Ñ€Ð¾Ð±Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ наÑтройке разделÑемой памÑти ÑодержитÑÑ Ð² " "документации PostgreSQL." -#: port/sysv_sema.c:159 +#: port/sysv_sema.c:161 #, c-format msgid "" "You possibly need to raise your kernel's SEMVMX value to be at least %d. " @@ -20467,14 +21643,14 @@ msgstr "аварийный дамп запиÑан в файл\"%s\"\n" msgid "could not write crash dump to file \"%s\": error code %lu\n" msgstr "не удалоÑÑŒ запиÑать аварийный дамп в файл \"%s\" (код ошибки: %lu)\n" -#: port/win32/signal.c:206 +#: port/win32/signal.c:240 #, c-format msgid "could not create signal listener pipe for PID %d: error code %lu" msgstr "" "не удалоÑÑŒ Ñоздать канал приёма Ñигналов Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа Ñ PID %d (код ошибки: " "%lu)" -#: port/win32/signal.c:261 +#: port/win32/signal.c:295 #, c-format msgid "could not create signal listener pipe: error code %lu; retrying\n" msgstr "" @@ -20501,8 +21677,8 @@ msgstr "не удалоÑÑŒ разблокировать Ñемафор (код msgid "could not try-lock semaphore: error code %lu" msgstr "не удалоÑÑŒ попытатьÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ Ñемафор (код ошибки: %lu)" -#: port/win32_shmem.c:144 port/win32_shmem.c:159 port/win32_shmem.c:171 -#: port/win32_shmem.c:187 +#: port/win32_shmem.c:146 port/win32_shmem.c:161 port/win32_shmem.c:173 +#: port/win32_shmem.c:189 #, c-format msgid "could not enable user right \"%s\": error code %lu" msgstr "не удалоÑÑŒ активировать право Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\": код ошибки %lu" @@ -20510,23 +21686,23 @@ msgstr "не удалоÑÑŒ активировать право пользова #. translator: This is a term from Windows and should be translated to #. match the Windows localization. #. -#: port/win32_shmem.c:150 port/win32_shmem.c:159 port/win32_shmem.c:171 -#: port/win32_shmem.c:182 port/win32_shmem.c:184 port/win32_shmem.c:187 +#: port/win32_shmem.c:152 port/win32_shmem.c:161 port/win32_shmem.c:173 +#: port/win32_shmem.c:184 port/win32_shmem.c:186 port/win32_shmem.c:189 msgid "Lock pages in memory" msgstr "Блокировка Ñтраниц в памÑти" -#: port/win32_shmem.c:152 port/win32_shmem.c:160 port/win32_shmem.c:172 -#: port/win32_shmem.c:188 +#: port/win32_shmem.c:154 port/win32_shmem.c:162 port/win32_shmem.c:174 +#: port/win32_shmem.c:190 #, c-format msgid "Failed system call was %s." msgstr "Ошибка в ÑиÑтемном вызове %s." -#: port/win32_shmem.c:182 +#: port/win32_shmem.c:184 #, c-format msgid "could not enable user right \"%s\"" msgstr "не удалоÑÑŒ активировать право Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\"" -#: port/win32_shmem.c:183 +#: port/win32_shmem.c:185 #, c-format msgid "" "Assign user right \"%s\" to the Windows user account which runs PostgreSQL." @@ -20534,27 +21710,27 @@ msgstr "" "Ðазначьте право \"%s\" учётной запиÑи пользователÑ, иÑпользуемой Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка " "PostgreSQL." -#: port/win32_shmem.c:241 +#: port/win32_shmem.c:244 #, c-format msgid "the processor does not support large pages" msgstr "процеÑÑор не поддерживает большие Ñтраницы" -#: port/win32_shmem.c:310 port/win32_shmem.c:346 port/win32_shmem.c:364 +#: port/win32_shmem.c:313 port/win32_shmem.c:349 port/win32_shmem.c:374 #, c-format msgid "could not create shared memory segment: error code %lu" msgstr "не удалоÑÑŒ Ñоздать Ñегмент разделÑемой памÑти (код ошибки: %lu)" -#: port/win32_shmem.c:311 +#: port/win32_shmem.c:314 #, c-format msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." msgstr "Ошибка в ÑиÑтемном вызове CreateFileMapping (размер=%zu, имÑ=%s)." -#: port/win32_shmem.c:336 +#: port/win32_shmem.c:339 #, c-format msgid "pre-existing shared memory block is still in use" msgstr "ранее Ñозданный блок разделÑемой памÑти вÑÑ‘ ещё иÑпользуетÑÑ" -#: port/win32_shmem.c:337 +#: port/win32_shmem.c:340 #, c-format msgid "" "Check if there are any old server processes still running, and terminate " @@ -20562,63 +21738,53 @@ msgid "" msgstr "" "ЕÑли по-прежнему работают какие-то Ñтарые Ñерверные процеÑÑÑ‹, Ñнимите их." -#: port/win32_shmem.c:347 +#: port/win32_shmem.c:350 #, c-format msgid "Failed system call was DuplicateHandle." msgstr "Ошибка в ÑиÑтемном вызове DuplicateHandle." -#: port/win32_shmem.c:365 +#: port/win32_shmem.c:375 #, c-format msgid "Failed system call was MapViewOfFileEx." msgstr "Ошибка в ÑиÑтемном вызове MapViewOfFileEx." -#: postmaster/autovacuum.c:404 -#, c-format -msgid "could not fork autovacuum launcher process: %m" -msgstr "породить процеÑÑ Ð·Ð°Ð¿ÑƒÑка автоочиÑтки не удалоÑÑŒ: %m" - -#: postmaster/autovacuum.c:752 +#: postmaster/autovacuum.c:686 #, c-format msgid "autovacuum worker took too long to start; canceled" msgstr "процеÑÑ Ð°Ð²Ñ‚Ð¾Ð¾Ñ‡Ð¸Ñтки запуÑкалÑÑ Ñлишком долго; его запуÑк отменён" -#: postmaster/autovacuum.c:1482 -#, c-format -msgid "could not fork autovacuum worker process: %m" -msgstr "не удалоÑÑŒ породить рабочий процеÑÑ Ð°Ð²Ñ‚Ð¾Ð¾Ñ‡Ð¸Ñтки: %m" - # skip-rule: capital-letter-first -#: postmaster/autovacuum.c:2265 +#: postmaster/autovacuum.c:2203 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "автоочиÑтка: удаление уÑтаревшей врем. таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2490 +#: postmaster/autovacuum.c:2439 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "автоматичеÑÐºÐ°Ñ Ð¾Ñ‡Ð¸Ñтка таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2493 +#: postmaster/autovacuum.c:2442 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "автоматичеÑкий анализ таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2686 +#: postmaster/autovacuum.c:2636 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "обработка рабочей запиÑи Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3297 +#: postmaster/autovacuum.c:3254 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "автоочиÑтка не запущена из-за неправильной конфигурации" -#: postmaster/autovacuum.c:3298 +#: postmaster/autovacuum.c:3255 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Включите параметр \"track_counts\"." -#: postmaster/bgworker.c:256 +#: postmaster/bgworker.c:260 #, c-format msgid "" "inconsistent background worker state (max_worker_processes=%d, " @@ -20627,7 +21793,7 @@ msgstr "" "неÑоглаÑованное ÑоÑтоÑние фонового рабочего процеÑÑа " "(max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:666 +#: postmaster/bgworker.c:651 #, c-format msgid "" "background worker \"%s\": background workers without shared memory access " @@ -20636,7 +21802,7 @@ msgstr "" "фоновый процеÑÑ \"%s\": фоновые процеÑÑÑ‹, не обращающиеÑÑ Ðº общей памÑти, не " "поддерживаютÑÑ" -#: postmaster/bgworker.c:677 +#: postmaster/bgworker.c:662 #, c-format msgid "" "background worker \"%s\": cannot request database access if starting at " @@ -20645,12 +21811,12 @@ msgstr "" "фоновый процеÑÑ \"%s\" не может получить доÑтуп к БД, еÑли он запущен при " "Ñтарте главного процеÑÑа" -#: postmaster/bgworker.c:691 +#: postmaster/bgworker.c:676 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "фоновый процеÑÑ \"%s\": неправильный интервал перезапуÑка" -#: postmaster/bgworker.c:706 +#: postmaster/bgworker.c:691 #, c-format msgid "" "background worker \"%s\": parallel workers may not be configured for restart" @@ -20658,19 +21824,20 @@ msgstr "" "фоновый процеÑÑ \"%s\": параллельные иÑполнители не могут быть наÑтроены Ð´Ð»Ñ " "перезапуÑка" -#: postmaster/bgworker.c:730 tcop/postgres.c:3215 +#: postmaster/bgworker.c:715 tcop/postgres.c:3312 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "завершение фонового процеÑÑа \"%s\" по команде админиÑтратора" -#: postmaster/bgworker.c:887 +#: postmaster/bgworker.c:888 #, c-format msgid "" -"background worker \"%s\": must be registered in shared_preload_libraries" +"background worker \"%s\": must be registered in \"shared_preload_libraries\"" msgstr "" -"фоновой процеÑÑ \"%s\" должен быть зарегиÑтрирован в shared_preload_libraries" +"фоновой процеÑÑ \"%s\" должен быть зарегиÑтрирован в " +"\"shared_preload_libraries\"" -#: postmaster/bgworker.c:899 +#: postmaster/bgworker.c:911 #, c-format msgid "" "background worker \"%s\": only dynamic background workers can request " @@ -20679,12 +21846,12 @@ msgstr "" "фоновый процеÑÑ \"%s\": только динамичеÑкие фоновые процеÑÑÑ‹ могут " "запрашивать уведомление" -#: postmaster/bgworker.c:914 +#: postmaster/bgworker.c:926 #, c-format msgid "too many background workers" msgstr "Ñлишком много фоновых процеÑÑов" -#: postmaster/bgworker.c:915 +#: postmaster/bgworker.c:927 #, c-format msgid "Up to %d background worker can be registered with the current settings." msgid_plural "" @@ -20696,13 +21863,12 @@ msgstr[1] "" msgstr[2] "" "МакÑимально возможное чиÑло фоновых процеÑÑов при текущих параметрах: %d." -#: postmaster/bgworker.c:919 +#: postmaster/bgworker.c:931 postmaster/checkpointer.c:445 #, c-format -msgid "" -"Consider increasing the configuration parameter \"max_worker_processes\"." -msgstr "Возможно, Ñтоит увеличить параметр \"max_worker_processes\"." +msgid "Consider increasing the configuration parameter \"%s\"." +msgstr "Возможно, Ñтоит увеличить параметр \"%s\"." -#: postmaster/checkpointer.c:432 +#: postmaster/checkpointer.c:441 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" @@ -20710,32 +21876,128 @@ msgstr[0] "контрольные точки проиÑходÑÑ‚ Ñлишком msgstr[1] "контрольные точки проиÑходÑÑ‚ Ñлишком чаÑто (через %d Ñек.)" msgstr[2] "контрольные точки проиÑходÑÑ‚ Ñлишком чаÑто (через %d Ñек.)" -#: postmaster/checkpointer.c:436 -#, c-format -msgid "Consider increasing the configuration parameter \"max_wal_size\"." -msgstr "Возможно, Ñтоит увеличить параметр \"max_wal_size\"." - -#: postmaster/checkpointer.c:1060 +#: postmaster/checkpointer.c:1067 #, c-format msgid "checkpoint request failed" msgstr "Ñбой при запроÑе контрольной точки" -#: postmaster/checkpointer.c:1061 +#: postmaster/checkpointer.c:1068 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Смотрите подробноÑти в протоколе Ñервера." -#: postmaster/pgarch.c:423 +#: postmaster/launch_backend.c:381 +#, c-format +msgid "could not execute server process \"%s\": %m" +msgstr "запуÑтить Ñерверный процеÑÑ \"%s\" не удалоÑÑŒ: %m" + +#: postmaster/launch_backend.c:434 +#, c-format +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "" +"Ñоздать отображение файла Ñерверных параметров не удалоÑÑŒ (код ошибки: %lu)" + +#: postmaster/launch_backend.c:442 +#, c-format +msgid "could not map backend parameter memory: error code %lu" +msgstr "" +"отобразить файл Ñерверных параметров в памÑть не удалоÑÑŒ (код ошибки: %lu)" + +#: postmaster/launch_backend.c:459 +#, c-format +msgid "subprocess command line too long" +msgstr "Ñлишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока подпроцеÑÑа" + +#: postmaster/launch_backend.c:477 #, c-format -msgid "archive_mode enabled, yet archiving is not configured" -msgstr "режим архивации включён, но архивирование ещё не наÑтроено" +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "ошибка в CreateProcess(): %m (код ошибки: %lu)" + +#: postmaster/launch_backend.c:504 +#, c-format +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "" +"отключить отображение файла Ñерверных параметров не удалоÑÑŒ (код ошибки: %lu)" + +#: postmaster/launch_backend.c:508 +#, c-format +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "" +"закрыть указатель файла Ñерверных параметров не удалоÑÑŒ (код ошибки: %lu)" + +#: postmaster/launch_backend.c:530 +#, c-format +msgid "giving up after too many tries to reserve shared memory" +msgstr "" +"чиÑло повторных попыток Ñ€ÐµÐ·ÐµÑ€Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ñемой памÑти доÑтигло предела" + +#: postmaster/launch_backend.c:531 +#, c-format +msgid "This might be caused by ASLR or antivirus software." +msgstr "Это может быть вызвано антивируÑным ПО или механизмом ASLR." + +#: postmaster/launch_backend.c:834 +#, c-format +msgid "could not duplicate socket %d for use in backend: error code %d" +msgstr "" +"продублировать Ñокет %d Ð´Ð»Ñ Ñерверного процеÑÑа не удалоÑÑŒ (код ошибки: %d)" + +#: postmaster/launch_backend.c:866 +#, c-format +msgid "could not create inherited socket: error code %d\n" +msgstr "Ñоздать наÑледуемый Ñокет не удалоÑÑŒ (код ошибки: %d)\n" + +#: postmaster/launch_backend.c:895 +#, c-format +msgid "could not open backend variables file \"%s\": %m\n" +msgstr "открыть файл Ñерверных переменных \"%s\" не удалоÑÑŒ: %m\n" -#: postmaster/pgarch.c:445 +#: postmaster/launch_backend.c:901 +#, c-format +msgid "could not read from backend variables file \"%s\": %m\n" +msgstr "прочитать файл Ñерверных переменных \"%s\" не удалоÑÑŒ: %m\n" + +#: postmaster/launch_backend.c:912 +#, c-format +msgid "could not read startup data from backend variables file \"%s\": %m\n" +msgstr "" +"прочитать Ñтартовые данные из файла Ñерверных переменных \"%s\" не удалоÑÑŒ: " +"%m\n" + +#: postmaster/launch_backend.c:924 +#, c-format +msgid "could not remove file \"%s\": %m\n" +msgstr "не удалоÑÑŒ Ñтереть файл \"%s\": %m\n" + +#: postmaster/launch_backend.c:940 +#, c-format +msgid "could not map view of backend variables: error code %lu\n" +msgstr "отобразить файл Ñерверных переменных не удалоÑÑŒ (код ошибки: %lu)\n" + +#: postmaster/launch_backend.c:959 +#, c-format +msgid "could not unmap view of backend variables: error code %lu\n" +msgstr "" +"отключить отображение файла Ñерверных переменных не удалоÑÑŒ (код ошибки: " +"%lu)\n" + +#: postmaster/launch_backend.c:966 +#, c-format +msgid "could not close handle to backend parameter variables: error code %lu\n" +msgstr "" +"закрыть указатель файла Ñерверных переменных не удалоÑÑŒ (код ошибки: %lu)\n" + +#: postmaster/pgarch.c:428 +#, c-format +msgid "\"archive_mode\" enabled, yet archiving is not configured" +msgstr "параметр \"archive_mode\" включён, но архивирование ещё не наÑтроено" + +#: postmaster/pgarch.c:452 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "удалён ненужный файл ÑоÑтоÑÐ½Ð¸Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð° \"%s\"" -#: postmaster/pgarch.c:455 +#: postmaster/pgarch.c:462 #, c-format msgid "" "removal of orphan archive status file \"%s\" failed too many times, will try " @@ -20744,7 +22006,7 @@ msgstr "" "удалить ненужный файл ÑоÑтоÑÐ½Ð¸Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð° \"%s\" не получилоÑÑŒ много раз " "подрÑд; ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° будет Ñделана позже" -#: postmaster/pgarch.c:491 +#: postmaster/pgarch.c:498 #, c-format msgid "" "archiving write-ahead log file \"%s\" failed too many times, will try again " @@ -20753,7 +22015,19 @@ msgstr "" "заархивировать файл журнала предзапиÑи \"%s\" не удалоÑÑŒ много раз подрÑд; " "ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° будет Ñделана позже" -#: postmaster/pgarch.c:798 +#: postmaster/pgarch.c:879 postmaster/pgarch.c:918 +#, c-format +msgid "both \"archive_command\" and \"archive_library\" set" +msgstr "\"archive_command\" и \"archive_library\" заданы одновременно" + +#: postmaster/pgarch.c:880 postmaster/pgarch.c:919 +#, c-format +msgid "Only one of \"archive_command\", \"archive_library\" may be set." +msgstr "" +"Только один из параметров \"archive_command\", \"archive_library\" может " +"иметь значение." + +#: postmaster/pgarch.c:897 #, c-format msgid "" "restarting archiver process because value of \"archive_library\" was changed" @@ -20761,145 +22035,151 @@ msgstr "" "процеÑÑ Ð°Ñ€Ñ…Ð¸Ð²Ð°Ñ‚Ð¾Ñ€Ð° перезапуÑкаетÑÑ, так как было изменено значение " "\"archive_library\"" -#: postmaster/pgarch.c:831 +#: postmaster/pgarch.c:934 #, c-format msgid "archive modules have to define the symbol %s" msgstr "в модулÑÑ… Ð°Ñ€Ñ…Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ объÑвлÑтьÑÑ Ñимвол %s" -#: postmaster/pgarch.c:837 +#: postmaster/pgarch.c:940 #, c-format msgid "archive modules must register an archive callback" msgstr "модули Ð°Ñ€Ñ…Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ региÑтрировать обработчик вызова архивации" -#: postmaster/postmaster.c:744 +#: postmaster/postmaster.c:661 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: неверный аргумент Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° -f: \"%s\"\n" -#: postmaster/postmaster.c:823 +#: postmaster/postmaster.c:734 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: неверный аргумент Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° -t: \"%s\"\n" -#: postmaster/postmaster.c:874 +#: postmaster/postmaster.c:757 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: неверный аргумент: \"%s\"\n" -#: postmaster/postmaster.c:942 +#: postmaster/postmaster.c:825 #, c-format msgid "" -"%s: superuser_reserved_connections (%d) must be less than max_connections " -"(%d)\n" +"%s: \"superuser_reserved_connections\" (%d) plus " +"\"reserved_connections\" (%d) must be less than \"max_connections\" (%d)\n" msgstr "" -"%s: значение superuser_reserved_connections (%d) должно быть меньше " -"max_connections (%d)\n" +"%s: значение \"superuser_reserved_connections\" (%d) Ð¿Ð»ÑŽÑ " +"\"reserved_connections\" (%d) должно быть меньше \"max_connections\" (%d)\n" -#: postmaster/postmaster.c:949 +#: postmaster/postmaster.c:833 #, c-format -msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" -msgstr "Ðрхивацию WAL Ð½ÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ, еÑли уÑтановлен wal_level \"minimal\"" +msgid "WAL archival cannot be enabled when \"wal_level\" is \"minimal\"" +msgstr "архивацию WAL Ð½ÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ, еÑли \"wal_level\" = \"minimal\"" -#: postmaster/postmaster.c:952 +#: postmaster/postmaster.c:836 #, c-format msgid "" -"WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or " -"\"logical\"" +"WAL streaming (\"max_wal_senders\" > 0) requires \"wal_level\" to be " +"\"replica\" or \"logical\"" msgstr "" -"Ð”Ð»Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð²Ð¾Ð¹ транÑлÑции WAL (max_wal_senders > 0) wal_level должен быть " -"\"replica\" или \"logical\"" +"Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð²Ð¾Ð¹ транÑлÑции WAL (\"max_wal_senders\" > 0) \"wal_level\" должен " +"быть \"replica\" или \"logical\"" + +#: postmaster/postmaster.c:839 +#, c-format +msgid "WAL cannot be summarized when \"wal_level\" is \"minimal\"" +msgstr "обобщение WAL Ð½ÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ, еÑли выбран \"wal_level\" \"minimal\"" -#: postmaster/postmaster.c:960 +#: postmaster/postmaster.c:847 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: ошибка в таблицах маркеров времени, требуетÑÑ Ð¸Ñправление\n" -#: postmaster/postmaster.c:1113 +#: postmaster/postmaster.c:1004 #, c-format msgid "could not create I/O completion port for child queue" msgstr "не удалоÑÑŒ Ñоздать порт Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð²Ð²Ð¾Ð´Ð°/вывода Ð´Ð»Ñ Ð¾Ñ‡ÐµÑ€ÐµÐ´Ð¸ потомков" -#: postmaster/postmaster.c:1178 +#: postmaster/postmaster.c:1069 #, c-format msgid "ending log output to stderr" msgstr "завершение вывода в stderr" -#: postmaster/postmaster.c:1179 +#: postmaster/postmaster.c:1070 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "Ð’ дальнейшем протокол будет выводитьÑÑ Ð² \"%s\"." -#: postmaster/postmaster.c:1190 +#: postmaster/postmaster.c:1081 #, c-format msgid "starting %s" msgstr "запуÑкаетÑÑ %s" -#: postmaster/postmaster.c:1250 +#: postmaster/postmaster.c:1143 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "не удалоÑÑŒ Ñоздать принимающий Ñокет Ð´Ð»Ñ \"%s\"" -#: postmaster/postmaster.c:1256 +#: postmaster/postmaster.c:1149 #, c-format msgid "could not create any TCP/IP sockets" msgstr "не удалоÑÑŒ Ñоздать Ñокеты TCP/IP" -#: postmaster/postmaster.c:1288 +#: postmaster/postmaster.c:1181 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ DNSServiceRegister() выдала ошибку Ñ ÐºÐ¾Ð´Ð¾Ð¼ %ld" -#: postmaster/postmaster.c:1340 +#: postmaster/postmaster.c:1234 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "не удалоÑÑŒ Ñоздать Unix-Ñокет в каталоге \"%s\"" -#: postmaster/postmaster.c:1346 +#: postmaster/postmaster.c:1240 #, c-format msgid "could not create any Unix-domain sockets" msgstr "ни один Unix-Ñокет Ñоздать не удалоÑÑŒ" -#: postmaster/postmaster.c:1358 +#: postmaster/postmaster.c:1251 #, c-format msgid "no socket created for listening" msgstr "отÑутÑтвуют принимающие Ñокеты" -#: postmaster/postmaster.c:1389 +#: postmaster/postmaster.c:1282 #, c-format -msgid "%s: could not change permissions of external PID file \"%s\": %s\n" -msgstr "%s: не удалоÑÑŒ поменÑть права Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ файла PID \"%s\": %s\n" +msgid "%s: could not change permissions of external PID file \"%s\": %m\n" +msgstr "%s: не удалоÑÑŒ поменÑть права Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ файла PID \"%s\": %m\n" -#: postmaster/postmaster.c:1393 +#: postmaster/postmaster.c:1286 #, c-format -msgid "%s: could not write external PID file \"%s\": %s\n" -msgstr "%s: не удалоÑÑŒ запиÑать внешний файл PID \"%s\": %s\n" +msgid "%s: could not write external PID file \"%s\": %m\n" +msgstr "%s: не удалоÑÑŒ запиÑать внешний файл PID \"%s\": %m\n" -#: postmaster/postmaster.c:1420 utils/init/postinit.c:220 +#. translator: %s is a configuration file +#: postmaster/postmaster.c:1314 utils/init/postinit.c:221 #, c-format -msgid "could not load pg_hba.conf" -msgstr "не удалоÑÑŒ загрузить pg_hba.conf" +msgid "could not load %s" +msgstr "не удалоÑÑŒ загрузить %s" -#: postmaster/postmaster.c:1446 +#: postmaster/postmaster.c:1342 #, c-format msgid "postmaster became multithreaded during startup" msgstr "процеÑÑ postmaster Ñтал многопоточным при запуÑке" -#: postmaster/postmaster.c:1447 +#: postmaster/postmaster.c:1343 postmaster/postmaster.c:3684 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "УÑтановите в переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ LC_ALL правильную локаль." -#: postmaster/postmaster.c:1548 +#: postmaster/postmaster.c:1442 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: не удалоÑÑŒ найти путь к ÑобÑтвенному иÑполнÑемому файлу" -#: postmaster/postmaster.c:1555 +#: postmaster/postmaster.c:1449 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: подходÑщий иÑполнÑемый файл postgres не найден" -#: postmaster/postmaster.c:1578 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1472 utils/misc/tzparser.c:341 #, c-format msgid "" "This may indicate an incomplete PostgreSQL installation, or that the file " @@ -20908,622 +22188,415 @@ msgstr "" "Возможно, PostgreSQL уÑтановлен не полноÑтью или файла \"%s\" нет в " "положенном меÑте." -#: postmaster/postmaster.c:1605 +#: postmaster/postmaster.c:1499 #, c-format msgid "" "%s: could not find the database system\n" "Expected to find it in the directory \"%s\",\n" -"but could not open file \"%s\": %s\n" +"but could not open file \"%s\": %m\n" msgstr "" "%s: не найдена ÑиÑтема баз данных\n" "ОжидалоÑÑŒ найти её в каталоге \"%s\",\n" -"но открыть файл \"%s\" не удалоÑÑŒ: %s\n" - -#: postmaster/postmaster.c:1782 -#, c-format -msgid "select() failed in postmaster: %m" -msgstr "Ñбой select() в postmaster'е: %m" +"но открыть файл \"%s\" не удалоÑÑŒ: %m\n" # well-spelled: неподчинÑющимÑÑ -#: postmaster/postmaster.c:1913 +#. translator: %s is SIGKILL or SIGABRT +#: postmaster/postmaster.c:1789 #, c-format -msgid "issuing SIGKILL to recalcitrant children" -msgstr "неподчинÑющимÑÑ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ°Ð¼ поÑылаетÑÑ SIGKILL" +msgid "issuing %s to recalcitrant children" +msgstr "неподчинÑющимÑÑ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ°Ð¼ поÑылаетÑÑ %s" -#: postmaster/postmaster.c:1934 +#: postmaster/postmaster.c:1811 #, c-format msgid "" "performing immediate shutdown because data directory lock file is invalid" msgstr "" "немедленное отключение из-за ошибочного файла блокировки каталога данных" -#: postmaster/postmaster.c:2037 postmaster/postmaster.c:2065 -#, c-format -msgid "incomplete startup packet" -msgstr "неполный Ñтартовый пакет" - -#: postmaster/postmaster.c:2049 postmaster/postmaster.c:2082 -#, c-format -msgid "invalid length of startup packet" -msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Ñтартового пакета" - -#: postmaster/postmaster.c:2111 -#, c-format -msgid "failed to send SSL negotiation response: %m" -msgstr "не удалоÑÑŒ отправить ответ в процеÑÑе SSL-ÑоглаÑованиÑ: %m" - -#: postmaster/postmaster.c:2129 -#, c-format -msgid "received unencrypted data after SSL request" -msgstr "поÑле запроÑа SSL получены незашифрованные данные" - -#: postmaster/postmaster.c:2130 postmaster/postmaster.c:2174 -#, c-format -msgid "" -"This could be either a client-software bug or evidence of an attempted man-" -"in-the-middle attack." -msgstr "" -"Это может ÑвидетельÑтвовать об ошибке в клиентÑком ПО или о попытке атаки " -"MITM." - -#: postmaster/postmaster.c:2155 -#, c-format -msgid "failed to send GSSAPI negotiation response: %m" -msgstr "не удалоÑÑŒ отправить ответ в процеÑÑе ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ GSSAPI: %m" - -#: postmaster/postmaster.c:2173 -#, c-format -msgid "received unencrypted data after GSSAPI encryption request" -msgstr "поÑле запроÑа ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ GSSAPI получены незашифрованные данные" - -#: postmaster/postmaster.c:2197 -#, c-format -msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" -msgstr "" -"неподдерживаемый протокол клиентÑкого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ %u.%u; Ñервер поддерживает " -"%u.0 - %u.%u" - -#: postmaster/postmaster.c:2261 utils/misc/guc.c:7400 utils/misc/guc.c:7436 -#: utils/misc/guc.c:7506 utils/misc/guc.c:8937 utils/misc/guc.c:11970 -#: utils/misc/guc.c:12011 -#, c-format -msgid "invalid value for parameter \"%s\": \"%s\"" -msgstr "неверное значение Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\": \"%s\"" - -#: postmaster/postmaster.c:2264 -#, c-format -msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." -msgstr "ДопуÑтимые значениÑ: \"false\", 0, \"true\", 1, \"database\"." - -#: postmaster/postmaster.c:2309 -#, c-format -msgid "invalid startup packet layout: expected terminator as last byte" -msgstr "" -"Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтруктура Ñтартового пакета: поÑледним байтом должен быть терминатор" - -#: postmaster/postmaster.c:2326 -#, c-format -msgid "no PostgreSQL user name specified in startup packet" -msgstr "в Ñтартовом пакете не указано Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PostgreSQL" - -#: postmaster/postmaster.c:2390 -#, c-format -msgid "the database system is starting up" -msgstr "ÑиÑтема баз данных запуÑкаетÑÑ" - -#: postmaster/postmaster.c:2396 -#, c-format -msgid "the database system is not yet accepting connections" -msgstr "ÑиÑтема БД ещё не принимает подключениÑ" - -#: postmaster/postmaster.c:2397 -#, c-format -msgid "Consistent recovery state has not been yet reached." -msgstr "СоглаÑованное ÑоÑтоÑние воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐµÑ‰Ñ‘ не доÑтигнуто." - -#: postmaster/postmaster.c:2401 -#, c-format -msgid "the database system is not accepting connections" -msgstr "ÑиÑтема БД не принимает подключениÑ" - -#: postmaster/postmaster.c:2402 -#, c-format -msgid "Hot standby mode is disabled." -msgstr "Режим горÑчего резерва отключён." - -#: postmaster/postmaster.c:2407 -#, c-format -msgid "the database system is shutting down" -msgstr "ÑиÑтема баз данных оÑтанавливаетÑÑ" - -#: postmaster/postmaster.c:2412 -#, c-format -msgid "the database system is in recovery mode" -msgstr "ÑиÑтема баз данных в режиме воÑÑтановлениÑ" - -#: postmaster/postmaster.c:2417 storage/ipc/procarray.c:490 -#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 -#, c-format -msgid "sorry, too many clients already" -msgstr "извините, уже Ñлишком много клиентов" - -#: postmaster/postmaster.c:2504 +#: postmaster/postmaster.c:1874 #, c-format msgid "wrong key in cancel request for process %d" msgstr "неправильный ключ в запроÑе на отмену процеÑÑа %d" -#: postmaster/postmaster.c:2516 +#: postmaster/postmaster.c:1886 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "процеÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ %d, полученным в запроÑе на отмену, не найден" -#: postmaster/postmaster.c:2770 +#: postmaster/postmaster.c:2106 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "получен SIGHUP, файлы конфигурации перезагружаютÑÑ" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2794 postmaster/postmaster.c:2798 +#: postmaster/postmaster.c:2134 postmaster/postmaster.c:2138 #, c-format msgid "%s was not reloaded" msgstr "%s не был перезагружен" -#: postmaster/postmaster.c:2808 +#: postmaster/postmaster.c:2148 #, c-format msgid "SSL configuration was not reloaded" msgstr "ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ SSL не была перезагружена" -#: postmaster/postmaster.c:2864 +#: postmaster/postmaster.c:2234 #, c-format msgid "received smart shutdown request" msgstr "получен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° \"вежливое\" выключение" -#: postmaster/postmaster.c:2905 +#: postmaster/postmaster.c:2275 #, c-format msgid "received fast shutdown request" msgstr "получен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° быÑтрое выключение" -#: postmaster/postmaster.c:2923 +#: postmaster/postmaster.c:2293 #, c-format msgid "aborting any active transactions" msgstr "прерывание вÑех активных транзакций" -#: postmaster/postmaster.c:2947 +#: postmaster/postmaster.c:2317 #, c-format msgid "received immediate shutdown request" msgstr "получен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° немедленное выключение" -#: postmaster/postmaster.c:3024 +#: postmaster/postmaster.c:2389 #, c-format msgid "shutdown at recovery target" msgstr "выключение при доÑтижении цели воÑÑтановлениÑ" -#: postmaster/postmaster.c:3042 postmaster/postmaster.c:3078 +#: postmaster/postmaster.c:2407 postmaster/postmaster.c:2443 msgid "startup process" msgstr "Ñтартовый процеÑÑ" -#: postmaster/postmaster.c:3045 +#: postmaster/postmaster.c:2410 #, c-format msgid "aborting startup due to startup process failure" msgstr "прерывание запуÑка из-за ошибки в Ñтартовом процеÑÑе" -#: postmaster/postmaster.c:3118 +#: postmaster/postmaster.c:2485 #, c-format msgid "database system is ready to accept connections" msgstr "ÑиÑтема БД готова принимать подключениÑ" -#: postmaster/postmaster.c:3139 +#: postmaster/postmaster.c:2506 msgid "background writer process" msgstr "процеÑÑ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð¹ запиÑи" -#: postmaster/postmaster.c:3186 +#: postmaster/postmaster.c:2553 msgid "checkpointer process" msgstr "процеÑÑ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… точек" -#: postmaster/postmaster.c:3202 +#: postmaster/postmaster.c:2569 msgid "WAL writer process" msgstr "процеÑÑ Ð·Ð°Ð¿Ð¸Ñи WAL" -#: postmaster/postmaster.c:3217 +#: postmaster/postmaster.c:2584 msgid "WAL receiver process" msgstr "процеÑÑ ÑÑ‡Ð¸Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ WAL" -#: postmaster/postmaster.c:3232 +#: postmaster/postmaster.c:2598 +msgid "WAL summarizer process" +msgstr "процеÑÑ Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ WAL" + +#: postmaster/postmaster.c:2613 msgid "autovacuum launcher process" msgstr "процеÑÑ Ð·Ð°Ð¿ÑƒÑка автоочиÑтки" -#: postmaster/postmaster.c:3250 +#: postmaster/postmaster.c:2631 msgid "archiver process" msgstr "процеÑÑ Ð°Ñ€Ñ…Ð¸Ð²Ð°Ñ†Ð¸Ð¸" -#: postmaster/postmaster.c:3263 +#: postmaster/postmaster.c:2644 msgid "system logger process" msgstr "процеÑÑ ÑиÑтемного протоколированиÑ" -#: postmaster/postmaster.c:3327 +#: postmaster/postmaster.c:2661 +msgid "slot sync worker process" +msgstr "рабочий процеÑÑ Ñинхронизации Ñлотов" + +#: postmaster/postmaster.c:2717 #, c-format msgid "background worker \"%s\"" msgstr "фоновый процеÑÑ \"%s\"" -#: postmaster/postmaster.c:3406 postmaster/postmaster.c:3426 -#: postmaster/postmaster.c:3433 postmaster/postmaster.c:3451 +#: postmaster/postmaster.c:2796 postmaster/postmaster.c:2816 +#: postmaster/postmaster.c:2823 postmaster/postmaster.c:2841 msgid "server process" msgstr "процеÑÑ Ñервера" -#: postmaster/postmaster.c:3505 +#: postmaster/postmaster.c:2895 #, c-format msgid "terminating any other active server processes" msgstr "завершение вÑех оÑтальных активных Ñерверных процеÑÑов" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3742 +#: postmaster/postmaster.c:3082 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) завершилÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ выхода %d" -#: postmaster/postmaster.c:3744 postmaster/postmaster.c:3756 -#: postmaster/postmaster.c:3766 postmaster/postmaster.c:3777 +#: postmaster/postmaster.c:3084 postmaster/postmaster.c:3096 +#: postmaster/postmaster.c:3106 postmaster/postmaster.c:3117 #, c-format msgid "Failed process was running: %s" msgstr "ЗавершившийÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñл дейÑтвие: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3753 +#: postmaster/postmaster.c:3093 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) был прерван иÑключением 0x%X" -#: postmaster/postmaster.c:3755 postmaster/shell_archive.c:134 -#, c-format -msgid "" -"See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "" -"ОпиÑание Ñтого шеÑтнадцатеричного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ñ‰Ð¸Ñ‚Ðµ во включаемом C-файле " -"\"ntstatus.h\"" - #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3763 +#: postmaster/postmaster.c:3103 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) был завершён по Ñигналу %d: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3775 +#: postmaster/postmaster.c:3115 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" -msgstr "%s (PID %d) завершилÑÑ Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтным кодом ÑоÑтоÑÐ½Ð¸Ñ %d" +msgstr "%s (PID %d) завершилÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным кодом ÑоÑтоÑÐ½Ð¸Ñ %d" -#: postmaster/postmaster.c:3975 +#: postmaster/postmaster.c:3331 #, c-format msgid "abnormal database system shutdown" msgstr "аварийное выключение ÑиÑтемы БД" -#: postmaster/postmaster.c:4001 +#: postmaster/postmaster.c:3357 #, c-format msgid "shutting down due to startup process failure" msgstr "Ñервер оÑтанавливаетÑÑ Ð¸Ð·-за ошибки в Ñтартовом процеÑÑе" -#: postmaster/postmaster.c:4007 +#: postmaster/postmaster.c:3363 #, c-format -msgid "shutting down because restart_after_crash is off" -msgstr "Ñервер оÑтанавливаетÑÑ, так как параметр restart_after_crash равен off" +msgid "shutting down because \"restart_after_crash\" is off" +msgstr "Ñервер оÑтанавливаетÑÑ, так как \"restart_after_crash\" = \"off\"" -#: postmaster/postmaster.c:4019 +#: postmaster/postmaster.c:3375 #, c-format msgid "all server processes terminated; reinitializing" msgstr "вÑе Ñерверные процеÑÑÑ‹ завершены... переинициализациÑ" -#: postmaster/postmaster.c:4191 postmaster/postmaster.c:5527 -#: postmaster/postmaster.c:5925 +#: postmaster/postmaster.c:3574 postmaster/postmaster.c:3985 +#: postmaster/postmaster.c:4374 #, c-format msgid "could not generate random cancel key" msgstr "не удалоÑÑŒ Ñгенерировать Ñлучайный ключ отмены" -#: postmaster/postmaster.c:4253 +#: postmaster/postmaster.c:3607 #, c-format msgid "could not fork new process for connection: %m" msgstr "породить новый процеÑÑ Ð´Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ удалоÑÑŒ: %m" -#: postmaster/postmaster.c:4295 +#: postmaster/postmaster.c:3649 msgid "could not fork new process for connection: " msgstr "породить новый процеÑÑ Ð´Ð»Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ удалоÑÑŒ: " -#: postmaster/postmaster.c:4401 +#: postmaster/postmaster.c:3683 #, c-format -msgid "connection received: host=%s port=%s" -msgstr "принÑто подключение: узел=%s порт=%s" +msgid "postmaster became multithreaded" +msgstr "процеÑÑ postmaster Ñтал многопоточным" -#: postmaster/postmaster.c:4406 +#: postmaster/postmaster.c:3752 #, c-format -msgid "connection received: host=%s" -msgstr "принÑто подключение: узел=%s" +msgid "database system is ready to accept read-only connections" +msgstr "ÑиÑтема БД готова принимать Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² режиме \"только чтение\"" -#: postmaster/postmaster.c:4643 +#: postmaster/postmaster.c:3935 #, c-format -msgid "could not execute server process \"%s\": %m" -msgstr "запуÑтить Ñерверный процеÑÑ \"%s\" не удалоÑÑŒ: %m" +msgid "could not fork \"%s\" process: %m" +msgstr "породить процеÑÑ \"%s\" не удалоÑÑŒ: %m" -#: postmaster/postmaster.c:4701 +#: postmaster/postmaster.c:4173 postmaster/postmaster.c:4207 #, c-format -msgid "could not create backend parameter file mapping: error code %lu" +msgid "database connection requirement not indicated during registration" msgstr "" -"Ñоздать отображение файла Ñерверных параметров не удалоÑÑŒ (код ошибки: %lu)" +"при региÑтрации фонового процеÑÑа не указывалоÑÑŒ, что ему требуетÑÑ " +"подключение к БД" -#: postmaster/postmaster.c:4710 +#: postmaster/postmaster.c:4183 postmaster/postmaster.c:4217 #, c-format -msgid "could not map backend parameter memory: error code %lu" -msgstr "" -"отобразить файл Ñерверных параметров в памÑть не удалоÑÑŒ (код ошибки: %lu)" +msgid "invalid processing mode in background worker" +msgstr "неправильный режим обработки в фоновом процеÑÑе" -#: postmaster/postmaster.c:4737 +#: postmaster/postmaster.c:4277 #, c-format -msgid "subprocess command line too long" -msgstr "Ñлишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока подпроцеÑÑа" +msgid "could not fork background worker process: %m" +msgstr "породить фоновый рабочий процеÑÑ Ð½Ðµ удалоÑÑŒ: %m" -#: postmaster/postmaster.c:4755 +#: postmaster/postmaster.c:4360 #, c-format -msgid "CreateProcess() call failed: %m (error code %lu)" -msgstr "ошибка в CreateProcess(): %m (код ошибки: %lu)" +msgid "no slot available for new background worker process" +msgstr "Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ фонового рабочего процеÑÑа нет Ñвободного Ñлота" -#: postmaster/postmaster.c:4782 +#: postmaster/postmaster.c:4623 #, c-format -msgid "could not unmap view of backend parameter file: error code %lu" -msgstr "" -"отключить отображение файла Ñерверных параметров не удалоÑÑŒ (код ошибки: %lu)" +msgid "could not read exit code for process\n" +msgstr "прочитать код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа не удалоÑÑŒ\n" -#: postmaster/postmaster.c:4786 -#, c-format -msgid "could not close handle to backend parameter file: error code %lu" -msgstr "" -"закрыть указатель файла Ñерверных параметров не удалоÑÑŒ (код ошибки: %lu)" - -#: postmaster/postmaster.c:4808 -#, c-format -msgid "giving up after too many tries to reserve shared memory" -msgstr "" -"чиÑло повторных попыток Ñ€ÐµÐ·ÐµÑ€Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ñемой памÑти доÑтигло предела" - -#: postmaster/postmaster.c:4809 -#, c-format -msgid "This might be caused by ASLR or antivirus software." -msgstr "Это может быть вызвано антивируÑным ПО или механизмом ASLR." - -#: postmaster/postmaster.c:4990 -#, c-format -msgid "SSL configuration could not be loaded in child process" -msgstr "не удалоÑÑŒ загрузить конфигурацию SSL в дочерний процеÑÑ" - -#: postmaster/postmaster.c:5115 -#, c-format -msgid "Please report this to <%s>." -msgstr "ПожалуйÑта, напишите об Ñтой ошибке по адреÑу <%s>." - -#: postmaster/postmaster.c:5187 -#, c-format -msgid "database system is ready to accept read-only connections" -msgstr "ÑиÑтема БД готова принимать Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² режиме \"только чтение\"" - -#: postmaster/postmaster.c:5451 -#, c-format -msgid "could not fork startup process: %m" -msgstr "породить Ñтартовый процеÑÑ Ð½Ðµ удалоÑÑŒ: %m" - -#: postmaster/postmaster.c:5455 -#, c-format -msgid "could not fork archiver process: %m" -msgstr "породить процеÑÑ Ð°Ñ€Ñ…Ð¸Ð²Ð°Ñ‚Ð¾Ñ€Ð° не удалоÑÑŒ: %m" - -#: postmaster/postmaster.c:5459 -#, c-format -msgid "could not fork background writer process: %m" -msgstr "породить процеÑÑ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð¹ запиÑи не удалоÑÑŒ: %m" - -#: postmaster/postmaster.c:5463 -#, c-format -msgid "could not fork checkpointer process: %m" -msgstr "породить процеÑÑ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… точек не удалоÑÑŒ: %m" - -#: postmaster/postmaster.c:5467 -#, c-format -msgid "could not fork WAL writer process: %m" -msgstr "породить процеÑÑ Ð·Ð°Ð¿Ð¸Ñи WAL не удалоÑÑŒ: %m" - -#: postmaster/postmaster.c:5471 -#, c-format -msgid "could not fork WAL receiver process: %m" -msgstr "породить процеÑÑ ÑÑ‡Ð¸Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ WAL не удалоÑÑŒ: %m" - -#: postmaster/postmaster.c:5475 -#, c-format -msgid "could not fork process: %m" -msgstr "породить процеÑÑ Ð½Ðµ удалоÑÑŒ: %m" - -#: postmaster/postmaster.c:5676 postmaster/postmaster.c:5703 -#, c-format -msgid "database connection requirement not indicated during registration" -msgstr "" -"при региÑтрации фонового процеÑÑа не указывалоÑÑŒ, что ему требуетÑÑ " -"подключение к БД" - -#: postmaster/postmaster.c:5687 postmaster/postmaster.c:5714 -#, c-format -msgid "invalid processing mode in background worker" -msgstr "неправильный режим обработки в фоновом процеÑÑе" - -#: postmaster/postmaster.c:5799 -#, c-format -msgid "could not fork worker process: %m" -msgstr "породить рабочий процеÑÑ Ð½Ðµ удалоÑÑŒ: %m" - -#: postmaster/postmaster.c:5911 -#, c-format -msgid "no slot available for new worker process" -msgstr "Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ рабочего процеÑÑа не нашлоÑÑŒ Ñвободного Ñлота" - -#: postmaster/postmaster.c:6242 -#, c-format -msgid "could not duplicate socket %d for use in backend: error code %d" -msgstr "" -"продублировать Ñокет %d Ð´Ð»Ñ Ñерверного процеÑÑа не удалоÑÑŒ (код ошибки: %d)" - -#: postmaster/postmaster.c:6274 -#, c-format -msgid "could not create inherited socket: error code %d\n" -msgstr "Ñоздать наÑледуемый Ñокет не удалоÑÑŒ (код ошибки: %d)\n" - -#: postmaster/postmaster.c:6303 -#, c-format -msgid "could not open backend variables file \"%s\": %s\n" -msgstr "открыть файл Ñерверных переменных \"%s\" не удалоÑÑŒ: %s\n" - -#: postmaster/postmaster.c:6310 -#, c-format -msgid "could not read from backend variables file \"%s\": %s\n" -msgstr "прочитать файл Ñерверных переменных \"%s\" не удалоÑÑŒ: %s\n" - -#: postmaster/postmaster.c:6319 -#, c-format -msgid "could not remove file \"%s\": %s\n" -msgstr "не удалоÑÑŒ Ñтереть файл \"%s\": %s\n" - -#: postmaster/postmaster.c:6336 -#, c-format -msgid "could not map view of backend variables: error code %lu\n" -msgstr "отобразить файл Ñерверных переменных не удалоÑÑŒ (код ошибки: %lu)\n" - -#: postmaster/postmaster.c:6345 -#, c-format -msgid "could not unmap view of backend variables: error code %lu\n" -msgstr "" -"отключить отображение файла Ñерверных переменных не удалоÑÑŒ (код ошибки: " -"%lu)\n" - -#: postmaster/postmaster.c:6352 -#, c-format -msgid "could not close handle to backend parameter variables: error code %lu\n" -msgstr "" -"закрыть указатель файла Ñерверных переменных не удалоÑÑŒ (код ошибки: %lu)\n" - -#: postmaster/postmaster.c:6526 -#, c-format -msgid "could not read exit code for process\n" -msgstr "прочитать код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа не удалоÑÑŒ\n" - -#: postmaster/postmaster.c:6531 +#: postmaster/postmaster.c:4665 #, c-format msgid "could not post child completion status\n" msgstr "отправить ÑоÑтоÑние Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ° не удалоÑÑŒ\n" -#: postmaster/shell_archive.c:123 -#, c-format -msgid "archive command failed with exit code %d" -msgstr "команда архивации завершилаÑÑŒ ошибкой Ñ ÐºÐ¾Ð´Ð¾Ð¼ %d" - -#: postmaster/shell_archive.c:125 postmaster/shell_archive.c:135 -#: postmaster/shell_archive.c:141 postmaster/shell_archive.c:150 -#, c-format -msgid "The failed archive command was: %s" -msgstr "Команда архивации Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹: %s" - -#: postmaster/shell_archive.c:132 -#, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "команда архивации была прервана иÑключением 0x%X" - -#: postmaster/shell_archive.c:139 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "команда архивации завершена по Ñигналу %d: %s" - -#: postmaster/shell_archive.c:148 -#, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "команда архивации завершилаÑÑŒ Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтным кодом ÑоÑтоÑÐ½Ð¸Ñ %d" - -#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 +#: postmaster/syslogger.c:529 postmaster/syslogger.c:1173 #, c-format msgid "could not read from logger pipe: %m" msgstr "не удалоÑÑŒ прочитать из канала протоколированиÑ: %m" -#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 +#: postmaster/syslogger.c:629 postmaster/syslogger.c:643 #, c-format msgid "could not create pipe for syslog: %m" msgstr "не удалоÑÑŒ Ñоздать канал Ð´Ð»Ñ syslog: %m" -#: postmaster/syslogger.c:677 +#: postmaster/syslogger.c:712 #, c-format msgid "could not fork system logger: %m" msgstr "не удалоÑÑŒ породить процеÑÑ ÑиÑтемного протоколированиÑ: %m" -#: postmaster/syslogger.c:713 +#: postmaster/syslogger.c:731 #, c-format msgid "redirecting log output to logging collector process" msgstr "передача вывода в протокол процеÑÑу Ñбора протоколов" -#: postmaster/syslogger.c:714 +#: postmaster/syslogger.c:732 #, c-format msgid "Future log output will appear in directory \"%s\"." msgstr "Ð’ дальнейшем протоколы будут выводитьÑÑ Ð² каталог \"%s\"." -#: postmaster/syslogger.c:722 +#: postmaster/syslogger.c:740 #, c-format msgid "could not redirect stdout: %m" msgstr "не удалоÑÑŒ перенаправить stdout: %m" -#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 +#: postmaster/syslogger.c:745 postmaster/syslogger.c:762 #, c-format msgid "could not redirect stderr: %m" msgstr "не удалоÑÑŒ перенаправить stderr: %m" -#: postmaster/syslogger.c:1177 +#: postmaster/syslogger.c:1128 #, c-format -msgid "could not write to log file: %s\n" -msgstr "не удалоÑÑŒ запиÑать в файл протокола: %s\n" +msgid "could not write to log file: %m\n" +msgstr "не удалоÑÑŒ запиÑать в файл протокола: %m\n" -#: postmaster/syslogger.c:1295 +#: postmaster/syslogger.c:1246 #, c-format msgid "could not open log file \"%s\": %m" msgstr "не удалоÑÑŒ открыть файл протокола \"%s\": %m" -#: postmaster/syslogger.c:1385 +#: postmaster/syslogger.c:1336 #, c-format msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "отключение автопрокрутки (чтобы включить, передайте SIGHUP)" -#: regex/regc_pg_locale.c:242 +#: postmaster/walsummarizer.c:740 +#, c-format +msgid "WAL summarization is not progressing" +msgstr "процеÑÑ Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ WAL не продвигаетÑÑ" + +#: postmaster/walsummarizer.c:741 +#, c-format +msgid "" +"Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/" +"%X in memory." +msgstr "" +"Обобщение должно охватить %X/%X, но оно оÑтановилоÑÑŒ на позиции %X/%X на " +"диÑке и %X/%X в памÑти." + +#: postmaster/walsummarizer.c:755 +#, c-format +msgid "still waiting for WAL summarization through %X/%X after %ld second" +msgid_plural "" +"still waiting for WAL summarization through %X/%X after %ld seconds" +msgstr[0] "ожидание Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %X/%X продолжаетÑÑ %ld Ñек." +msgstr[1] "ожидание Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %X/%X продолжаетÑÑ %ld Ñек." +msgstr[2] "ожидание Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %X/%X продолжаетÑÑ %ld Ñек." + +#: postmaster/walsummarizer.c:760 +#, c-format +msgid "Summarization has reached %X/%X on disk and %X/%X in memory." +msgstr "ПроцеÑÑ Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтиг позиции %X/%X на диÑке и %X/%X в памÑти." + +#: postmaster/walsummarizer.c:1000 +#, c-format +msgid "could not find a valid record after %X/%X" +msgstr "не удалоÑÑŒ найти корректную запиÑÑŒ поÑле %X/%X" + +#: postmaster/walsummarizer.c:1045 +#, c-format +msgid "could not read WAL from timeline %u at %X/%X: %s" +msgstr "не удалоÑÑŒ прочитать WAL Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени %u в позиции %X/%X: %s" + +#: postmaster/walsummarizer.c:1051 +#, c-format +msgid "could not read WAL from timeline %u at %X/%X" +msgstr "не удалоÑÑŒ прочитать WAL Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени %u в позиции %X/%X" + +#: regex/regc_pg_locale.c:244 #, c-format msgid "could not determine which collation to use for regular expression" msgstr "" "не удалоÑÑŒ определить, какое правило Ñортировки иÑпользовать Ð´Ð»Ñ Ñ€ÐµÐ³ÑƒÐ»Ñрного " "выражениÑ" -#: regex/regc_pg_locale.c:265 +#: regex/regc_pg_locale.c:262 #, c-format msgid "nondeterministic collations are not supported for regular expressions" msgstr "" "недетерминированные правила Ñортировки не поддерживаютÑÑ Ð´Ð»Ñ Ñ€ÐµÐ³ÑƒÐ»Ñрных " "выражений" -#: replication/libpqwalreceiver/libpqwalreceiver.c:233 +#: replication/libpqwalreceiver/libpqwalreceiver.c:267 +#: replication/libpqwalreceiver/libpqwalreceiver.c:358 +#, c-format +msgid "password is required" +msgstr "требуетÑÑ Ð¿Ð°Ñ€Ð¾Ð»ÑŒ" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:268 +#, c-format +msgid "Non-superuser cannot connect if the server does not request a password." +msgstr "" +"Только Ñуперпользователи могут подключатьÑÑ Ðº Ñерверу, не требующему пароль." + +#: replication/libpqwalreceiver/libpqwalreceiver.c:269 +#, c-format +msgid "" +"Target server's authentication method must be changed, or set " +"password_required=false in the subscription parameters." +msgstr "" +"Ðеобходимо Ñменить метод аутентификации на целевом Ñервере или задать " +"password_required=false в параметрах подпиÑки." + +#: replication/libpqwalreceiver/libpqwalreceiver.c:285 #, c-format msgid "could not clear search path: %s" msgstr "не удалоÑÑŒ очиÑтить путь поиÑка: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:273 +#: replication/libpqwalreceiver/libpqwalreceiver.c:331 +#: replication/libpqwalreceiver/libpqwalreceiver.c:517 #, c-format msgid "invalid connection string syntax: %s" msgstr "ошибочный ÑинтакÑÐ¸Ñ Ñтроки подключениÑ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:299 +#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#, c-format +msgid "Non-superusers must provide a password in the connection string." +msgstr "" +"Пользователи, не ÑвлÑющиеÑÑ ÑуперпользователÑми, должны задавать пароль в " +"Ñтроке ÑоединениÑ." + +#: replication/libpqwalreceiver/libpqwalreceiver.c:386 #, c-format msgid "could not parse connection string: %s" msgstr "не удалоÑÑŒ разобрать Ñтроку подключениÑ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:372 +#: replication/libpqwalreceiver/libpqwalreceiver.c:459 #, c-format msgid "" "could not receive database system identifier and timeline ID from the " @@ -21532,13 +22605,13 @@ msgstr "" "не удалоÑÑŒ получить идентификатор СУБД и код линии времени Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ " "Ñервера: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:384 -#: replication/libpqwalreceiver/libpqwalreceiver.c:622 +#: replication/libpqwalreceiver/libpqwalreceiver.c:476 +#: replication/libpqwalreceiver/libpqwalreceiver.c:763 #, c-format msgid "invalid response from primary server" msgstr "неверный ответ главного Ñервера" -#: replication/libpqwalreceiver/libpqwalreceiver.c:385 +#: replication/libpqwalreceiver/libpqwalreceiver.c:477 #, c-format msgid "" "Could not identify system: got %d rows and %d fields, expected %d rows and " @@ -21547,123 +22620,182 @@ msgstr "" "Ðе удалоÑÑŒ идентифицировать ÑиÑтему, получено Ñтрок: %d, полей: %d " "(ожидалоÑÑŒ: %d и %d (или более))." -#: replication/libpqwalreceiver/libpqwalreceiver.c:465 -#: replication/libpqwalreceiver/libpqwalreceiver.c:472 -#: replication/libpqwalreceiver/libpqwalreceiver.c:502 +#: replication/libpqwalreceiver/libpqwalreceiver.c:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:613 +#: replication/libpqwalreceiver/libpqwalreceiver.c:643 #, c-format msgid "could not start WAL streaming: %s" msgstr "не удалоÑÑŒ начать транÑлÑцию WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:526 +#: replication/libpqwalreceiver/libpqwalreceiver.c:667 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "не удалоÑÑŒ отправить главному Ñерверу Ñообщение о конце передачи: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:549 +#: replication/libpqwalreceiver/libpqwalreceiver.c:690 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "неожиданный набор данных поÑле конца передачи" -#: replication/libpqwalreceiver/libpqwalreceiver.c:564 +#: replication/libpqwalreceiver/libpqwalreceiver.c:705 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "ошибка при оÑтановке потоковой операции COPY: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:574 +#: replication/libpqwalreceiver/libpqwalreceiver.c:715 #, c-format msgid "error reading result of streaming command: %s" msgstr "ошибка при чтении результата команды передачи: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:583 -#: replication/libpqwalreceiver/libpqwalreceiver.c:821 +#: replication/libpqwalreceiver/libpqwalreceiver.c:724 +#: replication/libpqwalreceiver/libpqwalreceiver.c:957 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "неожиданный результат поÑле CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:610 +#: replication/libpqwalreceiver/libpqwalreceiver.c:751 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "не удалоÑÑŒ получить файл иÑтории линии времени Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ Ñервера: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:623 +#: replication/libpqwalreceiver/libpqwalreceiver.c:764 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "ОжидалÑÑ 1 кортеж Ñ 2 полÑми, однако получено кортежей: %d, полей: %d." -#: replication/libpqwalreceiver/libpqwalreceiver.c:784 -#: replication/libpqwalreceiver/libpqwalreceiver.c:837 -#: replication/libpqwalreceiver/libpqwalreceiver.c:844 +#: replication/libpqwalreceiver/libpqwalreceiver.c:920 +#: replication/libpqwalreceiver/libpqwalreceiver.c:973 +#: replication/libpqwalreceiver/libpqwalreceiver.c:980 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "не удалоÑÑŒ получить данные из потока WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:864 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1000 #, c-format msgid "could not send data to WAL stream: %s" msgstr "не удалоÑÑŒ отправить данные в поток WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:956 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1101 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "не удалоÑÑŒ Ñоздать Ñлот репликации \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1002 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1140 +#, c-format +msgid "could not alter replication slot \"%s\": %s" +msgstr "не удалоÑÑŒ изменить ÑвойÑтва Ñлота репликации \"%s\": %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1174 #, c-format msgid "invalid query response" msgstr "неверный ответ на запроÑ" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1003 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1175 #, c-format msgid "Expected %d fields, got %d fields." msgstr "ОжидалоÑÑŒ полей: %d, получено: %d." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1073 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1245 #, c-format msgid "the query interface requires a database connection" msgstr "Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñа запроÑов требуетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ к БД" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1104 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1277 msgid "empty query" msgstr "пуÑтой запроÑ" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1110 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1283 msgid "unexpected pipeline mode" msgstr "неожиданный режим канала" -#: replication/logical/launcher.c:285 +#: replication/logical/applyparallelworker.c:719 +#, c-format +msgid "" +"logical replication parallel apply worker for subscription \"%s\" has " +"finished" +msgstr "" +"параллельный применÑющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" " +"завершён" + +#: replication/logical/applyparallelworker.c:822 +#, c-format +msgid "lost connection to the logical replication apply worker" +msgstr "потерÑна ÑвÑзь Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñющим процеÑÑом логичеÑкой репликации" + +#: replication/logical/applyparallelworker.c:1024 +#: replication/logical/applyparallelworker.c:1026 +msgid "logical replication parallel apply worker" +msgstr "параллельный применÑющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации" + +#: replication/logical/applyparallelworker.c:1040 +#, c-format +msgid "logical replication parallel apply worker exited due to error" +msgstr "" +"параллельный применÑющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации завершён из-за ошибки" + +#: replication/logical/applyparallelworker.c:1127 +#: replication/logical/applyparallelworker.c:1300 +#, c-format +msgid "lost connection to the logical replication parallel apply worker" +msgstr "" +"потерÑна ÑвÑзь Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ð¼ применÑющим процеÑÑом логичеÑким репликации" + +#: replication/logical/applyparallelworker.c:1180 +#, c-format +msgid "could not send data to shared-memory queue" +msgstr "не удалоÑÑŒ передать данные в очередь в разделÑемой памÑти" + +#: replication/logical/applyparallelworker.c:1215 +#, c-format +msgid "" +"logical replication apply worker will serialize the remaining changes of " +"remote transaction %u to a file" +msgstr "" +"применÑющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации будет Ñериализовывать оÑтальное " +"Ñодержимое удалённой транзакции %u в файл" + +#: replication/logical/decode.c:177 replication/logical/logical.c:141 +#, c-format +msgid "" +"logical decoding on standby requires \"wal_level\" >= \"logical\" on the " +"primary" +msgstr "" +"Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° ведомом Ñервере требуетÑÑ \"wal_level\" >= " +"\"logical\" на ведущем" + +#: replication/logical/launcher.c:334 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð¿ÑƒÑтить процеÑÑÑ‹-обработчики логичеÑкой репликации при " "max_replication_slots = 0" -#: replication/logical/launcher.c:365 +#: replication/logical/launcher.c:427 #, c-format msgid "out of logical replication worker slots" msgstr "недоÑтаточно Ñлотов Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑов логичеÑкой репликации" -#: replication/logical/launcher.c:366 +#: replication/logical/launcher.c:428 replication/logical/launcher.c:514 +#: replication/slot.c:1524 storage/lmgr/lock.c:985 storage/lmgr/lock.c:1023 +#: storage/lmgr/lock.c:2836 storage/lmgr/lock.c:4221 storage/lmgr/lock.c:4286 +#: storage/lmgr/lock.c:4636 storage/lmgr/predicate.c:2469 +#: storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:3881 #, c-format -msgid "You might need to increase max_logical_replication_workers." -msgstr "Возможно, Ñледует увеличить параметр max_logical_replication_workers." +msgid "You might need to increase \"%s\"." +msgstr "Возможно, Ñледует увеличить параметр \"%s\"." -#: replication/logical/launcher.c:422 +#: replication/logical/launcher.c:513 #, c-format msgid "out of background worker slots" msgstr "недоÑтаточно Ñлотов Ð´Ð»Ñ Ñ„Ð¾Ð½Ð¾Ð²Ñ‹Ñ… рабочих процеÑÑов" -#: replication/logical/launcher.c:423 -#, c-format -msgid "You might need to increase max_worker_processes." -msgstr "Возможно, Ñледует увеличить параметр max_worker_processes." - -#: replication/logical/launcher.c:577 +#: replication/logical/launcher.c:720 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "" "Ñлот обработчика логичеÑкой репликации %d пуÑÑ‚, подключитьÑÑ Ðº нему нельзÑ" -#: replication/logical/launcher.c:586 +#: replication/logical/launcher.c:729 #, c-format msgid "" "logical replication worker slot %d is already used by another worker, cannot " @@ -21672,33 +22804,28 @@ msgstr "" "Ñлот обработчика логичеÑкой репликации %d уже занÑÑ‚ другим процеÑÑом, " "подключитьÑÑ Ðº нему нельзÑ" -#: replication/logical/logical.c:115 +#: replication/logical/logical.c:121 #, c-format -msgid "logical decoding requires wal_level >= logical" -msgstr "Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ wal_level >= logical" +msgid "logical decoding requires \"wal_level\" >= \"logical\"" +msgstr "Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ \"wal_level\" >= \"logical\"" -#: replication/logical/logical.c:120 +#: replication/logical/logical.c:126 #, c-format msgid "logical decoding requires a database connection" msgstr "Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ к БД" -#: replication/logical/logical.c:138 -#, c-format -msgid "logical decoding cannot be used while in recovery" -msgstr "логичеÑкое декодирование Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в процеÑÑе воÑÑтановлениÑ" - -#: replication/logical/logical.c:348 replication/logical/logical.c:502 +#: replication/logical/logical.c:365 replication/logical/logical.c:519 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "" "физичеÑкий Ñлот репликации Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого декодированиÑ" -#: replication/logical/logical.c:353 replication/logical/logical.c:507 +#: replication/logical/logical.c:370 replication/logical/logical.c:529 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "Ñлот репликации \"%s\" Ñоздан не в Ñтой базе данных" -#: replication/logical/logical.c:360 +#: replication/logical/logical.c:377 #, c-format msgid "" "cannot create logical replication slot in transaction that has performed " @@ -21706,86 +22833,111 @@ msgid "" msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздать Ñлот логичеÑкой репликации в транзакции, оÑущеÑтвлÑющей запиÑÑŒ" -#: replication/logical/logical.c:570 +#: replication/logical/logical.c:540 +#, c-format +msgid "cannot use replication slot \"%s\" for logical decoding" +msgstr "" +"Ñлот репликации \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого декодированиÑ" + +#: replication/logical/logical.c:542 replication/slot.c:798 +#: replication/slot.c:829 +#, c-format +msgid "This replication slot is being synchronized from the primary server." +msgstr "Этот Ñлот репликации ÑинхронизируетÑÑ Ñ Ð²ÐµÐ´ÑƒÑ‰ÐµÐ³Ð¾ Ñервера." + +#: replication/logical/logical.c:543 +#, c-format +msgid "Specify another replication slot." +msgstr "Укажите другой Ñлот репликации." + +#: replication/logical/logical.c:554 replication/logical/logical.c:561 +#, c-format +msgid "can no longer get changes from replication slot \"%s\"" +msgstr "из Ñлота репликации \"%s\" больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÑŒ изменениÑ" + +#: replication/logical/logical.c:556 +#, c-format +msgid "" +"This slot has been invalidated because it exceeded the maximum reserved size." +msgstr "" +"Этот Ñлот был аннулирован из-за Ð¿Ñ€ÐµÐ²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑимального зарезервированного " +"размера." + +#: replication/logical/logical.c:563 +#, c-format +msgid "" +"This slot has been invalidated because it was conflicting with recovery." +msgstr "Этот Ñлот был аннулирован из-за конфликта Ñ Ð²Ð¾ÑÑтановлением." + +#: replication/logical/logical.c:628 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "начинаетÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкое декодирование Ð´Ð»Ñ Ñлота \"%s\"" -#: replication/logical/logical.c:572 +#: replication/logical/logical.c:630 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Передача транзакций, фикÑируемых поÑле %X/%X, чтение WAL Ñ %X/%X." -#: replication/logical/logical.c:720 +#: replication/logical/logical.c:778 #, c-format msgid "" "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "" "Ñлот \"%s\", модуль вывода \"%s\", в обработчике %s, ÑвÑзанный LSN: %X/%X" -#: replication/logical/logical.c:726 +#: replication/logical/logical.c:784 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "Ñлот \"%s\", модуль вывода \"%s\", в обработчике %s" -#: replication/logical/logical.c:897 replication/logical/logical.c:942 -#: replication/logical/logical.c:987 replication/logical/logical.c:1033 +#: replication/logical/logical.c:955 replication/logical/logical.c:1000 +#: replication/logical/logical.c:1045 replication/logical/logical.c:1091 #, c-format msgid "logical replication at prepare time requires a %s callback" msgstr "Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²ÐºÐ¸ требуетÑÑ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸Ðº %s" -#: replication/logical/logical.c:1265 replication/logical/logical.c:1314 -#: replication/logical/logical.c:1355 replication/logical/logical.c:1441 -#: replication/logical/logical.c:1490 +#: replication/logical/logical.c:1323 replication/logical/logical.c:1372 +#: replication/logical/logical.c:1413 replication/logical/logical.c:1499 +#: replication/logical/logical.c:1548 #, c-format msgid "logical streaming requires a %s callback" msgstr "Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой потоковой репликации требуетÑÑ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸Ðº %s" -#: replication/logical/logical.c:1400 +#: replication/logical/logical.c:1458 #, c-format msgid "logical streaming at prepare time requires a %s callback" msgstr "" "Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой потоковой репликации во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²ÐºÐ¸ требуетÑÑ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸Ðº " "%s" -#: replication/logical/logicalfuncs.c:126 +#: replication/logical/logicalfuncs.c:123 #, c-format msgid "slot name must not be null" msgstr "Ð¸Ð¼Ñ Ñлота не может быть NULL" -#: replication/logical/logicalfuncs.c:142 +#: replication/logical/logicalfuncs.c:139 #, c-format msgid "options array must not be null" msgstr "маÑÑив параметров не может быть NULL" -#: replication/logical/logicalfuncs.c:159 +#: replication/logical/logicalfuncs.c:156 #, c-format msgid "array must be one-dimensional" msgstr "маÑÑив должен быть одномерным" -#: replication/logical/logicalfuncs.c:165 +#: replication/logical/logicalfuncs.c:162 #, c-format msgid "array must not contain nulls" msgstr "маÑÑив не должен Ñодержать Ñлементы null" -#: replication/logical/logicalfuncs.c:181 utils/adt/json.c:1128 -#: utils/adt/jsonb.c:1302 +#: replication/logical/logicalfuncs.c:177 utils/adt/json.c:1420 +#: utils/adt/jsonb.c:1304 #, c-format msgid "array must have even number of elements" msgstr "в маÑÑиве должно быть чётное чиÑло Ñлементов" -#: replication/logical/logicalfuncs.c:227 -#, c-format -msgid "can no longer get changes from replication slot \"%s\"" -msgstr "из Ñлота репликации \"%s\" больше Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÑŒ изменениÑ" - -#: replication/logical/logicalfuncs.c:229 replication/slotfuncs.c:616 -#, c-format -msgid "" -"This slot has never previously reserved WAL, or it has been invalidated." -msgstr "Ð”Ð»Ñ Ñтого Ñлота ранее не резервировалÑÑ WAL либо Ñлот был аннулирован." - -#: replication/logical/logicalfuncs.c:241 +#: replication/logical/logicalfuncs.c:224 #, c-format msgid "" "logical decoding output plugin \"%s\" produces binary output, but function " @@ -21794,72 +22946,74 @@ msgstr "" "модуль вывода логичеÑкого Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\" выдаёт двоичные данные, но " "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" ожидает текÑтовые" -#: replication/logical/origin.c:189 +#: replication/logical/origin.c:190 #, c-format msgid "" -"cannot query or manipulate replication origin when max_replication_slots = 0" +"cannot query or manipulate replication origin when \"max_replication_slots\" " +"is 0" msgstr "" "запрашивать или модифицировать иÑточники репликации при " -"max_replication_slots = 0 нельзÑ" +"\"max_replication_slots\" = 0 нельзÑ" -#: replication/logical/origin.c:194 +#: replication/logical/origin.c:195 #, c-format msgid "cannot manipulate replication origins during recovery" msgstr "модифицировать иÑточники репликации во Ð²Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ" -#: replication/logical/origin.c:228 +#: replication/logical/origin.c:240 #, c-format msgid "replication origin \"%s\" does not exist" msgstr "иÑточник репликации \"%s\" не ÑущеÑтвует" -#: replication/logical/origin.c:319 +#: replication/logical/origin.c:331 #, c-format msgid "could not find free replication origin ID" msgstr "найти Ñвободный ID Ð´Ð»Ñ Ð¸Ñточника репликации не удалоÑÑŒ" -#: replication/logical/origin.c:355 +#: replication/logical/origin.c:365 #, c-format msgid "could not drop replication origin with ID %d, in use by PID %d" msgstr "" "удалить иÑточник репликации Ñ ID %d нельзÑ, он иÑпользуетÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑом Ñ PID " "%d" -#: replication/logical/origin.c:476 +#: replication/logical/origin.c:492 #, c-format msgid "replication origin with ID %d does not exist" msgstr "иÑточник репликации Ñ ID %d не ÑущеÑтвует" -#: replication/logical/origin.c:741 +#: replication/logical/origin.c:757 #, c-format msgid "replication checkpoint has wrong magic %u instead of %u" msgstr "" "ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° репликации имеет неправильную Ñигнатуру (%u вмеÑто %u)" -#: replication/logical/origin.c:782 +#: replication/logical/origin.c:798 #, c-format -msgid "could not find free replication state, increase max_replication_slots" +msgid "" +"could not find free replication state, increase \"max_replication_slots\"" msgstr "" "не удалоÑÑŒ найти Ñвободную Ñчейку Ð´Ð»Ñ ÑоÑтоÑÐ½Ð¸Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸, увеличьте " -"max_replication_slots" +"\"max_replication_slots\"" -#: replication/logical/origin.c:790 +#: replication/logical/origin.c:806 #, c-format msgid "recovered replication state of node %d to %X/%X" msgstr "ÑоÑтоÑние репликации узла %d воÑÑтановлено до %X/%X" -#: replication/logical/origin.c:800 +#: replication/logical/origin.c:816 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "" "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма файла контрольной точки Ð´Ð»Ñ Ñлота репликации (%u " "вмеÑто %u)" -#: replication/logical/origin.c:928 replication/logical/origin.c:1117 +#: replication/logical/origin.c:944 replication/logical/origin.c:1143 #, c-format msgid "replication origin with ID %d is already active for PID %d" msgstr "иÑточник репликации Ñ ID %d уже занÑÑ‚ процеÑÑом Ñ PID %d" -#: replication/logical/origin.c:939 replication/logical/origin.c:1129 +#: replication/logical/origin.c:955 replication/logical/origin.c:1156 #, c-format msgid "" "could not find free replication state slot for replication origin with ID %d" @@ -21867,44 +23021,47 @@ msgstr "" "не удалоÑÑŒ найти Ñвободный Ñлот ÑоÑтоÑÐ½Ð¸Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ Ð´Ð»Ñ Ð¸Ñточника " "репликации Ñ ID %d" -#: replication/logical/origin.c:941 replication/logical/origin.c:1131 -#: replication/slot.c:1947 +#: replication/logical/origin.c:957 replication/logical/origin.c:1158 +#: replication/slot.c:2401 #, c-format -msgid "Increase max_replication_slots and try again." -msgstr "Увеличьте параметр max_replication_slots и повторите попытку." +msgid "Increase \"max_replication_slots\" and try again." +msgstr "Увеличьте параметр \"max_replication_slots\" и повторите попытку." -#: replication/logical/origin.c:1088 +#: replication/logical/origin.c:1114 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð½Ð°Ñтроить иÑточник репликации, когда он уже наÑтроен" -#: replication/logical/origin.c:1168 replication/logical/origin.c:1380 -#: replication/logical/origin.c:1400 +#: replication/logical/origin.c:1199 replication/logical/origin.c:1415 +#: replication/logical/origin.c:1435 #, c-format msgid "no replication origin is configured" msgstr "ни один иÑточник репликации не наÑтроен" -#: replication/logical/origin.c:1251 +#: replication/logical/origin.c:1285 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "Ð¸Ð¼Ñ Ð¸Ñточника репликации \"%s\" зарезервировано" -#: replication/logical/origin.c:1253 +#: replication/logical/origin.c:1287 #, c-format -msgid "Origin names starting with \"pg_\" are reserved." -msgstr "Имена иÑточников, начинающиеÑÑ Ñ \"pg_\", зарезервированы." +msgid "" +"Origin names \"%s\", \"%s\", and names starting with \"pg_\" are reserved." +msgstr "" +"Имена иÑточников \"%s\", \"%s\", а также имена, начинающиеÑÑ Ñ \"pg_\", " +"зарезервированы." -#: replication/logical/relation.c:234 +#: replication/logical/relation.c:242 #, c-format msgid "\"%s\"" msgstr "\"%s\"" -#: replication/logical/relation.c:237 +#: replication/logical/relation.c:245 #, c-format msgid ", \"%s\"" msgstr ", \"%s\"" -#: replication/logical/relation.c:243 +#: replication/logical/relation.c:251 #, c-format msgid "" "logical replication target relation \"%s.%s\" is missing replicated column: " @@ -21922,7 +23079,7 @@ msgstr[2] "" "в целевом отношении логичеÑкой репликации (\"%s.%s\") отÑутÑтвуют " "реплицируемые Ñтолбцы: %s" -#: replication/logical/relation.c:298 +#: replication/logical/relation.c:306 #, c-format msgid "" "logical replication target relation \"%s.%s\" uses system columns in REPLICA " @@ -21931,159 +23088,326 @@ msgstr "" "в целевом отношении логичеÑкой репликации (\"%s.%s\") в индекÑе REPLICA " "IDENTITY иÑпользуютÑÑ ÑиÑтемные Ñтолбцы" -#: replication/logical/relation.c:390 +#: replication/logical/relation.c:398 #, c-format msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "целевое отношение логичеÑкой репликации \"%s.%s\" не ÑущеÑтвует" -#: replication/logical/reorderbuffer.c:3831 +#: replication/logical/reorderbuffer.c:3999 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "не удалоÑÑŒ запиÑать в файл данных Ð´Ð»Ñ XID %u: %m" -#: replication/logical/reorderbuffer.c:4177 -#: replication/logical/reorderbuffer.c:4202 +#: replication/logical/reorderbuffer.c:4345 +#: replication/logical/reorderbuffer.c:4370 #, c-format msgid "could not read from reorderbuffer spill file: %m" -msgstr "не удалоÑÑŒ прочитать из файла подкачки буфера переÑортировки: %m" +msgstr "не удалоÑÑŒ прочитать файл подкачки буфера переÑортировки: %m" -#: replication/logical/reorderbuffer.c:4181 -#: replication/logical/reorderbuffer.c:4206 +#: replication/logical/reorderbuffer.c:4349 +#: replication/logical/reorderbuffer.c:4374 #, c-format msgid "" "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "" -"не удалоÑÑŒ прочитать из файла подкачки буфера переÑортировки (прочитано " -"байт: %d, требовалоÑÑŒ: %u)" +"не удалоÑÑŒ прочитать файл подкачки буфера переÑортировки (прочитано байт: " +"%d, требовалоÑÑŒ: %u)" -#: replication/logical/reorderbuffer.c:4456 +#: replication/logical/reorderbuffer.c:4624 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "" "ошибка при удалении файла \"%s\" в процеÑÑе ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:4955 +#: replication/logical/reorderbuffer.c:5120 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" -msgstr "" -"не удалоÑÑŒ прочитать из файла \"%s\" (прочитано байт: %d, требовалоÑÑŒ: %d)" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d, требовалоÑÑŒ: %d)" -#: replication/logical/snapbuild.c:634 +#: replication/logical/slotsync.c:215 #, c-format -msgid "initial slot snapshot too large" -msgstr "изначальный Ñнимок Ñлота Ñлишком большой" +msgid "" +"could not synchronize replication slot \"%s\" because remote slot precedes " +"local slot" +msgstr "" +"Ñинхронизировать Ñлот репликации \"%s\" не удалоÑÑŒ, так как ÑоÑтоÑние " +"удалённого Ñлота предшеÑтвует локальному" -# skip-rule: capital-letter-first -#: replication/logical/snapbuild.c:688 +#: replication/logical/slotsync.c:217 #, c-format -msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" -msgid_plural "" -"exported logical decoding snapshot: \"%s\" with %u transaction IDs" -msgstr[0] "" -"ÑкÑпортирован Ñнимок логичеÑкого декодированиÑ: \"%s\" (ид. транзакций: %u)" -msgstr[1] "" -"ÑкÑпортирован Ñнимок логичеÑкого декодированиÑ: \"%s\" (ид. транзакций: %u)" -msgstr[2] "" -"ÑкÑпортирован Ñнимок логичеÑкого декодированиÑ: \"%s\" (ид. транзакций: %u)" +msgid "" +"The remote slot has LSN %X/%X and catalog xmin %u, but the local slot has " +"LSN %X/%X and catalog xmin %u." +msgstr "" +"Ð”Ð»Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ Ñлота текущий LSN %X/%X и xmin каталога %u, тогда как Ð´Ð»Ñ " +"локального — LSN %X/%X и xmin каталога %u." -#: replication/logical/snapbuild.c:1367 replication/logical/snapbuild.c:1474 -#: replication/logical/snapbuild.c:2003 +#: replication/logical/slotsync.c:459 #, c-format -msgid "logical decoding found consistent point at %X/%X" -msgstr "процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ñтиг точки ÑоглаÑованноÑти в %X/%X" +msgid "dropped replication slot \"%s\" of database with OID %u" +msgstr "Ñлот репликации \"%s\" базы данных Ñ OID %u удалён" -#: replication/logical/snapbuild.c:1369 +#: replication/logical/slotsync.c:579 #, c-format -msgid "There are no running transactions." -msgstr "Больше активных транзакций нет." +msgid "could not synchronize replication slot \"%s\"" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñлот репликации \"%s\"" -#: replication/logical/snapbuild.c:1425 +#: replication/logical/slotsync.c:580 #, c-format -msgid "logical decoding found initial starting point at %X/%X" +msgid "" +"Logical decoding could not find consistent point from local slot's LSN %X/%X." msgstr "" -"процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð°ÑˆÑ‘Ð» начальную Ñтартовую точку в %X/%X" +"При логичеÑком декодировании не удалоÑÑŒ найти точку ÑоглаÑованноÑти от LSN " +"локального Ñлота %X/%X." -#: replication/logical/snapbuild.c:1427 replication/logical/snapbuild.c:1451 +#: replication/logical/slotsync.c:589 #, c-format -msgid "Waiting for transactions (approximately %d) older than %u to end." -msgstr "Ожидание транзакций (примерно %d), Ñтарее %u до конца." +msgid "newly created replication slot \"%s\" is sync-ready now" +msgstr "Ñозданный Ñлот репликации \"%s\" ÑÐµÐ¹Ñ‡Ð°Ñ Ð³Ð¾Ñ‚Ð¾Ð² к Ñинхронизации" -#: replication/logical/snapbuild.c:1449 +#: replication/logical/slotsync.c:628 #, c-format -msgid "logical decoding found initial consistent point at %X/%X" +msgid "" +"skipping slot synchronization because the received slot sync LSN %X/%X for " +"slot \"%s\" is ahead of the standby position %X/%X" msgstr "" -"при логичеÑком декодировании найдена Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° ÑоглаÑованноÑти в %X/%X" - -#: replication/logical/snapbuild.c:1476 -#, c-format -msgid "There are no old transactions anymore." -msgstr "Больше Ñтарых транзакций нет." +"ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñлота пропуÑкаетÑÑ, потому что Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ LSN %X/%X " +"Ð´Ð»Ñ Ñлота \"%s\" предшеÑтвует позиции %X/%X на резервном Ñервере" -#: replication/logical/snapbuild.c:1871 +#: replication/logical/slotsync.c:650 #, c-format -msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" +msgid "" +"exiting from slot synchronization because same name slot \"%s\" already " +"exists on the standby" msgstr "" -"файл ÑоÑтоÑÐ½Ð¸Ñ snapbuild \"%s\" имеет неправильную Ñигнатуру (%u вмеÑто %u)" +"ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñлота отменÑетÑÑ, потому что Ñлот Ñ Ñ‚Ð°ÐºÐ¸Ð¼ же именем \"%s\" уже " +"ÑущеÑтвует на резервном Ñервере" -#: replication/logical/snapbuild.c:1877 +#: replication/logical/slotsync.c:819 #, c-format -msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" +msgid "could not fetch failover logical slots info from the primary server: %s" msgstr "" -"файл ÑоÑтоÑÐ½Ð¸Ñ snapbuild \"%s\" имеет неправильную верÑию (%u вмеÑто %u)" +"не удалоÑÑŒ получить информацию о переноÑимых логичеÑких Ñлотах Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ " +"Ñервера: %s" -#: replication/logical/snapbuild.c:1948 +#: replication/logical/slotsync.c:965 #, c-format -msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" -msgstr "" -"в файле ÑоÑтоÑÐ½Ð¸Ñ snapbuild \"%s\" Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма (%u вмеÑто %u)" +msgid "" +"could not fetch primary_slot_name \"%s\" info from the primary server: %s" +msgstr "не удалоÑÑŒ получить информацию о Ñлоте \"%s\" Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ Ñервера: %s" -#: replication/logical/snapbuild.c:2005 +# skip-rule: nastroy1 +#: replication/logical/slotsync.c:967 #, c-format -msgid "Logical decoding will begin using saved snapshot." -msgstr "ЛогичеÑкое декодирование начнётÑÑ Ñ Ñохранённого Ñнимка." +msgid "Check if primary_slot_name is configured correctly." +msgstr "Проверьте правильноÑть наÑтройки primary_slot_name." -#: replication/logical/snapbuild.c:2077 +#: replication/logical/slotsync.c:987 #, c-format -msgid "could not parse file name \"%s\"" -msgstr "не удалоÑÑŒ разобрать Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\"" +msgid "cannot synchronize replication slots from a standby server" +msgstr "Ñинхронизировать Ñлоты репликации Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ Ñервера нельзÑ" -#: replication/logical/tablesync.c:151 +#. translator: second %s is a GUC variable name +#: replication/logical/slotsync.c:996 #, c-format msgid "" -"logical replication table synchronization worker for subscription \"%s\", " -"table \"%s\" has finished" +"replication slot \"%s\" specified by \"%s\" does not exist on primary server" msgstr "" -"процеÑÑ Ñинхронизации таблицы при логичеÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\", " -"таблицы \"%s\" закончил обработку" +"Ñлот репликации \"%s\", заданный в \"%s\", не ÑущеÑтвует на главном Ñервере" -#: replication/logical/tablesync.c:422 +#. translator: first %s is a connection option; second %s is a GUC +#. variable name +#. +#: replication/logical/slotsync.c:1029 #, c-format msgid "" -"logical replication apply worker for subscription \"%s\" will restart so " -"that two_phase can be enabled" -msgstr "" -"применÑющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" будет " -"перезапущен, чтобы можно было включить режим two_phase" +"replication slot synchronization requires \"%s\" to be specified in \"%s\"" +msgstr "Ð´Ð»Ñ Ñинхронизации Ñлотов репликации требуетÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ðµ \"%s\" в \"%s\"" -#: replication/logical/tablesync.c:731 replication/logical/tablesync.c:872 +#: replication/logical/slotsync.c:1050 #, c-format -msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" +msgid "replication slot synchronization requires \"wal_level\" >= \"logical\"" msgstr "" -"не удалоÑÑŒ получить информацию о таблице \"%s.%s\" Ñ Ñервера публикации: %s" +"Ð´Ð»Ñ Ñинхронизации Ñлотов репликации требуетÑÑ \"wal_level\" >= \"logical\"" -#: replication/logical/tablesync.c:738 +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1063 replication/logical/slotsync.c:1091 #, c-format -msgid "table \"%s.%s\" not found on publisher" -msgstr "таблица \"%s.%s\" не найдена на Ñервере публикации" +msgid "replication slot synchronization requires \"%s\" to be set" +msgstr "Ð´Ð»Ñ Ñинхронизации Ñлотов репликации требуетÑÑ ÑƒÑтановить \"%s\"" -#: replication/logical/tablesync.c:795 +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1077 #, c-format -msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" -msgstr "" +msgid "replication slot synchronization requires \"%s\" to be enabled" +msgstr "Ð´Ð»Ñ Ñинхронизации Ñлотов репликации требуетÑÑ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ \"%s\"" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1129 +#, c-format +msgid "" +"replication slot synchronization worker will shut down because \"%s\" is " +"disabled" +msgstr "" +"процеÑÑ Ñинхронизации Ñлотов репликации будет оÑтановлен, так как \"%s\" " +"отключён" + +#: replication/logical/slotsync.c:1138 +#, c-format +msgid "" +"replication slot synchronization worker will restart because of a parameter " +"change" +msgstr "" +"процеÑÑ Ñинхронизации Ñлотов репликации будет перезапущен вÑледÑтвие " +"Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð²" + +#: replication/logical/slotsync.c:1162 +#, c-format +msgid "" +"replication slot synchronization worker is shutting down on receiving SIGINT" +msgstr "" +"процеÑÑ Ñинхронизации Ñлотов репликации оÑтанавливаетÑÑ, получив Ñигнал " +"SIGINT" + +#: replication/logical/slotsync.c:1287 +#, c-format +msgid "cannot synchronize replication slots when standby promotion is ongoing" +msgstr "" +"Ñинхронизировать Ñлоты репликации, когда выполнÑетÑÑ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ðµ резервного " +"Ñервера, нельзÑ" + +#: replication/logical/slotsync.c:1295 +#, c-format +msgid "cannot synchronize replication slots concurrently" +msgstr "Ð¼Ð½Ð¾Ð³Ð¾Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð°Ñ ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñлотов репликации не поддерживаетÑÑ" + +#: replication/logical/slotsync.c:1403 +#, c-format +msgid "slot sync worker started" +msgstr "рабочий процеÑÑ Ñинхронизации Ñлотов запущен" + +#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:926 +#: replication/walreceiver.c:307 +#, c-format +msgid "could not connect to the primary server: %s" +msgstr "не удалоÑÑŒ подключитьÑÑ Ðº главному Ñерверу: %s" + +#: replication/logical/snapbuild.c:653 +#, c-format +msgid "initial slot snapshot too large" +msgstr "изначальный Ñнимок Ñлота Ñлишком большой" + +# skip-rule: capital-letter-first +#: replication/logical/snapbuild.c:707 +#, c-format +msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" +msgid_plural "" +"exported logical decoding snapshot: \"%s\" with %u transaction IDs" +msgstr[0] "" +"ÑкÑпортирован Ñнимок логичеÑкого декодированиÑ: \"%s\" (ид. транзакций: %u)" +msgstr[1] "" +"ÑкÑпортирован Ñнимок логичеÑкого декодированиÑ: \"%s\" (ид. транзакций: %u)" +msgstr[2] "" +"ÑкÑпортирован Ñнимок логичеÑкого декодированиÑ: \"%s\" (ид. транзакций: %u)" + +#: replication/logical/snapbuild.c:1443 replication/logical/snapbuild.c:1540 +#: replication/logical/snapbuild.c:2056 +#, c-format +msgid "logical decoding found consistent point at %X/%X" +msgstr "процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ñтиг точки ÑоглаÑованноÑти в %X/%X" + +#: replication/logical/snapbuild.c:1445 +#, c-format +msgid "There are no running transactions." +msgstr "Больше активных транзакций нет." + +#: replication/logical/snapbuild.c:1492 +#, c-format +msgid "logical decoding found initial starting point at %X/%X" +msgstr "" +"процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð°ÑˆÑ‘Ð» начальную Ñтартовую точку в %X/%X" + +#: replication/logical/snapbuild.c:1494 replication/logical/snapbuild.c:1518 +#, c-format +msgid "Waiting for transactions (approximately %d) older than %u to end." +msgstr "Ожидание транзакций (примерно %d), Ñтарее %u до конца." + +#: replication/logical/snapbuild.c:1516 +#, c-format +msgid "logical decoding found initial consistent point at %X/%X" +msgstr "" +"при логичеÑком декодировании найдена Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° ÑоглаÑованноÑти в %X/%X" + +#: replication/logical/snapbuild.c:1542 +#, c-format +msgid "There are no old transactions anymore." +msgstr "Больше Ñтарых транзакций нет." + +#: replication/logical/snapbuild.c:1943 +#, c-format +msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" +msgstr "" +"файл ÑоÑтоÑÐ½Ð¸Ñ snapbuild \"%s\" имеет неправильную Ñигнатуру (%u вмеÑто %u)" + +#: replication/logical/snapbuild.c:1949 +#, c-format +msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" +msgstr "" +"файл ÑоÑтоÑÐ½Ð¸Ñ snapbuild \"%s\" имеет неправильную верÑию (%u вмеÑто %u)" + +#: replication/logical/snapbuild.c:1990 +#, c-format +msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" +msgstr "" +"в файле ÑоÑтоÑÐ½Ð¸Ñ snapbuild \"%s\" Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма (%u вмеÑто %u)" + +#: replication/logical/snapbuild.c:2058 +#, c-format +msgid "Logical decoding will begin using saved snapshot." +msgstr "ЛогичеÑкое декодирование начнётÑÑ Ñ Ñохранённого Ñнимка." + +#: replication/logical/snapbuild.c:2165 +#, c-format +msgid "could not parse file name \"%s\"" +msgstr "не удалоÑÑŒ разобрать Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\"" + +#: replication/logical/tablesync.c:161 +#, c-format +msgid "" +"logical replication table synchronization worker for subscription \"%s\", " +"table \"%s\" has finished" +msgstr "" +"процеÑÑ Ñинхронизации таблицы при логичеÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\", " +"таблицы \"%s\" закончил обработку" + +#: replication/logical/tablesync.c:641 +#, c-format +msgid "" +"logical replication apply worker for subscription \"%s\" will restart so " +"that two_phase can be enabled" +msgstr "" +"применÑющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" будет " +"перезапущен, чтобы можно было включить режим two_phase" + +#: replication/logical/tablesync.c:827 replication/logical/tablesync.c:969 +#, c-format +msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" +msgstr "" +"не удалоÑÑŒ получить информацию о таблице \"%s.%s\" Ñ Ñервера публикации: %s" + +#: replication/logical/tablesync.c:834 +#, c-format +msgid "table \"%s.%s\" not found on publisher" +msgstr "таблица \"%s.%s\" не найдена на Ñервере публикации" + +#: replication/logical/tablesync.c:892 +#, c-format +msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" +msgstr "" "не удалоÑÑŒ получить информацию о ÑпиÑке Ñтолбцов таблицы \"%s.%s\" Ñ Ñервера " "публикации: %s" -#: replication/logical/tablesync.c:974 +#: replication/logical/tablesync.c:1071 #, c-format msgid "" "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: " @@ -22092,56 +23416,65 @@ msgstr "" "не удалоÑÑŒ получить информацию о предложении WHERE таблицы \"%s.%s\" Ñ " "Ñервера публикации: %s" -#: replication/logical/tablesync.c:1111 +#: replication/logical/tablesync.c:1230 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "" "не удалоÑÑŒ начать копирование начального Ñодержимого таблицы \"%s.%s\": %s" -#: replication/logical/tablesync.c:1323 replication/logical/worker.c:1635 -#, c-format -msgid "" -"user \"%s\" cannot replicate into relation with row-level security enabled: " -"\"%s\"" -msgstr "" -"пользователь \"%s\" не может реплицировать данные в отношение Ñ Ð²ÐºÐ»ÑŽÑ‡Ñ‘Ð½Ð½Ð¾Ð¹ " -"защитой на уровне Ñтрок: \"%s\"" - -#: replication/logical/tablesync.c:1338 +#: replication/logical/tablesync.c:1429 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "" "при копировании таблицы не удалоÑÑŒ начать транзакцию на Ñервере публикации: " "%s" -#: replication/logical/tablesync.c:1380 +#: replication/logical/tablesync.c:1472 #, c-format msgid "replication origin \"%s\" already exists" msgstr "иÑточник репликации \"%s\" уже ÑущеÑтвует" -#: replication/logical/tablesync.c:1393 +#: replication/logical/tablesync.c:1505 replication/logical/worker.c:2363 +#, c-format +msgid "" +"user \"%s\" cannot replicate into relation with row-level security enabled: " +"\"%s\"" +msgstr "" +"пользователь \"%s\" не может реплицировать данные в отношение Ñ Ð²ÐºÐ»ÑŽÑ‡Ñ‘Ð½Ð½Ð¾Ð¹ " +"защитой на уровне Ñтрок: \"%s\"" + +#: replication/logical/tablesync.c:1518 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "" "при копировании таблицы не удалоÑÑŒ завершить транзакцию на Ñервере " "публикации: %s" -#: replication/logical/worker.c:671 replication/logical/worker.c:786 +#: replication/logical/worker.c:483 #, c-format -msgid "incorrect binary data format in logical replication column %d" +msgid "" +"logical replication parallel apply worker for subscription \"%s\" will stop" msgstr "" -"неправильный формат двоичных данных Ð´Ð»Ñ Ñтолбца логичеÑкой репликации %d" +"параллельный применÑющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" " +"будет оÑтановлен" -#: replication/logical/worker.c:1417 replication/logical/worker.c:1432 +#: replication/logical/worker.c:485 #, c-format msgid "" -"could not read from streaming transaction's changes file \"%s\": read only " -"%zu of %zu bytes" +"Cannot handle streamed replication transactions using parallel apply workers " +"until all tables have been synchronized." msgstr "" -"не удалоÑÑŒ прочитать файл изменений потоковых транзакций \"%s\" (прочитано " -"байт: %zu из %zu)" +"Параллельные применÑющие процеÑÑÑ‹ не могут иÑпользоватьÑÑ Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ " +"транзакций репликации, передаваемых в потоке, пока вÑе таблицы не " +"Ñинхронизированы." -#: replication/logical/worker.c:1761 +#: replication/logical/worker.c:854 replication/logical/worker.c:969 +#, c-format +msgid "incorrect binary data format in logical replication column %d" +msgstr "" +"неправильный формат двоичных данных Ð´Ð»Ñ Ñтолбца логичеÑкой репликации %d" + +#: replication/logical/worker.c:2506 #, c-format msgid "" "publisher did not send replica identity column expected by the logical " @@ -22150,7 +23483,7 @@ msgstr "" "Ñервер публикации не передал Ñтолбец идентификации реплики, ожидаемый Ð´Ð»Ñ " "целевого Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации \"%s.%s\"" -#: replication/logical/worker.c:1768 +#: replication/logical/worker.c:2513 #, c-format msgid "" "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY " @@ -22161,76 +23494,100 @@ msgstr "" "IDENTITY, ни ключа PRIMARY KEY, и публикуемое отношение не имеет " "характериÑтики REPLICA IDENTITY FULL" -#: replication/logical/worker.c:2582 +#: replication/logical/worker.c:3384 #, c-format -msgid "invalid logical replication message type \"%c\"" -msgstr "неверный тип ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации \"%c\"" +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "неверный тип ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации \"??? (%d)\"" -#: replication/logical/worker.c:2746 +#: replication/logical/worker.c:3556 #, c-format msgid "data stream from publisher has ended" msgstr "поток данных Ñ Ñервера публикации закончилÑÑ" -#: replication/logical/worker.c:2897 +#: replication/logical/worker.c:3710 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "завершение обработчика логичеÑкой репликации из-за тайм-аута" -#: replication/logical/worker.c:3059 +#: replication/logical/worker.c:3904 #, c-format msgid "" -"logical replication apply worker for subscription \"%s\" will stop because " -"the subscription was removed" +"logical replication worker for subscription \"%s\" will stop because the " +"subscription was removed" msgstr "" -"применÑющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" будет " -"оÑтановлен, так как подпиÑка была удалена" +"процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" будет оÑтановлен, так как " +"подпиÑка была удалена" -#: replication/logical/worker.c:3070 +#: replication/logical/worker.c:3918 #, c-format msgid "" -"logical replication apply worker for subscription \"%s\" will stop because " -"the subscription was disabled" +"logical replication worker for subscription \"%s\" will stop because the " +"subscription was disabled" msgstr "" -"применÑющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" будет " -"оÑтановлен, так как подпиÑка была отключена" +"процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" будет оÑтановлен, так как " +"подпиÑка была отключена" -#: replication/logical/worker.c:3096 +#: replication/logical/worker.c:3949 #, c-format msgid "" -"logical replication apply worker for subscription \"%s\" will restart " +"logical replication parallel apply worker for subscription \"%s\" will stop " "because of a parameter change" msgstr "" -"применÑющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" будет " -"перезапущен вÑледÑтвие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð²" +"параллельный применÑющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" " +"будет оÑтановлен вÑледÑтвие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð²" -#: replication/logical/worker.c:3220 replication/logical/worker.c:3245 +#: replication/logical/worker.c:3953 #, c-format msgid "" -"could not read from streaming transaction's subxact file \"%s\": read only " -"%zu of %zu bytes" +"logical replication worker for subscription \"%s\" will restart because of a " +"parameter change" msgstr "" -"не удалоÑÑŒ прочитать файл потоковых подтранзакций \"%s\" (прочитано байт: " -"%zu из %zu)" +"процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" будет перезапущен " +"вÑледÑтвие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð²" -#: replication/logical/worker.c:3645 +#: replication/logical/worker.c:3967 #, c-format msgid "" -"logical replication apply worker for subscription %u will not start because " -"the subscription was removed during startup" +"logical replication parallel apply worker for subscription \"%s\" will stop " +"because the subscription owner's superuser privileges have been revoked" msgstr "" -"применÑющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки %u не будет запущен, " -"так как подпиÑка была удалена при Ñтарте" +"процеÑÑ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ логичеÑкой репликации Ð´Ð»Ñ " +"подпиÑки \"%s\" будет оÑтановлен, потому что владелец подпиÑки был лишён " +"прав ÑуперпользователÑ" -#: replication/logical/worker.c:3657 +#: replication/logical/worker.c:3971 #, c-format msgid "" -"logical replication apply worker for subscription \"%s\" will not start " -"because the subscription was disabled during startup" +"logical replication worker for subscription \"%s\" will restart because the " +"subscription owner's superuser privileges have been revoked" msgstr "" -"применÑющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" не будет " -"запущен, так как подпиÑка была отключена при Ñтарте" +"процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" будет перезапущен, потому " +"что владелец подпиÑки был лишён прав ÑуперпользователÑ" -#: replication/logical/worker.c:3675 +#: replication/logical/worker.c:4499 +#, c-format +msgid "subscription has no replication slot set" +msgstr "Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки не задан Ñлот репликации" + +#: replication/logical/worker.c:4612 +#, c-format +msgid "" +"logical replication worker for subscription %u will not start because the " +"subscription was removed during startup" +msgstr "" +"процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки %u не будет запущен, так как " +"подпиÑка была удалена при Ñтарте" + +#: replication/logical/worker.c:4628 +#, c-format +msgid "" +"logical replication worker for subscription \"%s\" will not start because " +"the subscription was disabled during startup" +msgstr "" +"процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" не будет запущен, так как " +"подпиÑка была отключена при Ñтарте" + +#: replication/logical/worker.c:4652 #, c-format msgid "" "logical replication table synchronization worker for subscription \"%s\", " @@ -22239,40 +23596,35 @@ msgstr "" "процеÑÑ Ñинхронизации таблицы при логичеÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\", " "таблицы \"%s\" запущен" -#: replication/logical/worker.c:3679 +#: replication/logical/worker.c:4657 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "" "запуÑкаетÑÑ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñющий процеÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\"" -#: replication/logical/worker.c:3720 -#, c-format -msgid "subscription has no replication slot set" -msgstr "Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки не задан Ñлот репликации" - -#: replication/logical/worker.c:3856 +#: replication/logical/worker.c:4779 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "подпиÑка \"%s\" была отключена из-за ошибки" -#: replication/logical/worker.c:3895 +#: replication/logical/worker.c:4827 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "" "обработчик логичеÑкой репликации начинает пропуÑкать транзакцию Ñ LSN %X/%X" -#: replication/logical/worker.c:3909 +#: replication/logical/worker.c:4841 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "" "обработчик логичеÑкой репликации завершил пропуÑк транзакции Ñ LSN %X/%X" -#: replication/logical/worker.c:3991 +#: replication/logical/worker.c:4923 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "значение skip-LSN Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\" очищено" -#: replication/logical/worker.c:3992 +#: replication/logical/worker.c:4924 #, c-format msgid "" "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN " @@ -22281,7 +23633,7 @@ msgstr "" "ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð¹ транзакции в WAL (LSN) %X/%X не Ñовпала Ñо " "значением skip-LSN %X/%X." -#: replication/logical/worker.c:4018 +#: replication/logical/worker.c:4950 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -22290,7 +23642,7 @@ msgstr "" "обработка внешних данных Ð´Ð»Ñ Ð¸Ñточника репликации \"%s\" в контекÑте " "ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° \"%s\"" -#: replication/logical/worker.c:4022 +#: replication/logical/worker.c:4954 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -22299,16 +23651,26 @@ msgstr "" "обработка внешних данных из иÑточника репликации \"%s\" в контекÑте " "ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° \"%s\" в транзакции %u" -#: replication/logical/worker.c:4027 +#: replication/logical/worker.c:4959 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " "\"%s\" in transaction %u, finished at %X/%X" msgstr "" "обработка внешних данных Ð´Ð»Ñ Ð¸Ñточника репликации \"%s\" в контекÑте " -"ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° \"%s\" в транзакции %u завершена в %X/%X" +"ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° \"%s\" в транзакции %u, ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %X/%X" -#: replication/logical/worker.c:4034 +#: replication/logical/worker.c:4970 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\" for replication target relation \"%s.%s\" in transaction %u" +msgstr "" +"обработка внешних данных Ð´Ð»Ñ Ð¸Ñточника репликации \"%s\" в контекÑте " +"ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° \"%s\" Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð³Ð¾ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ \"%s.%s\" в " +"транзакции %u" + +#: replication/logical/worker.c:4977 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -22317,9 +23679,20 @@ msgid "" msgstr "" "обработка внешних данных Ð´Ð»Ñ Ð¸Ñточника репликации \"%s\" в контекÑте " "ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° \"%s\" Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð³Ð¾ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ \"%s.%s\" в " -"транзакции %u завершена в %X/%X" +"транзакции %u, ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %X/%X" + +#: replication/logical/worker.c:4988 +#, c-format +msgid "" +"processing remote data for replication origin \"%s\" during message type " +"\"%s\" for replication target relation \"%s.%s\" column \"%s\" in " +"transaction %u" +msgstr "" +"обработка внешних данных Ð´Ð»Ñ Ð¸Ñточника репликации \"%s\" в контекÑте " +"ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° \"%s\" Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð³Ð¾ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ \"%s.%s\", Ñтолбца " +"\"%s\", в транзакции %u" -#: replication/logical/worker.c:4042 +#: replication/logical/worker.c:4996 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -22328,41 +23701,45 @@ msgid "" msgstr "" "обработка внешних данных Ð´Ð»Ñ Ð¸Ñточника репликации \"%s\" в контекÑте " "ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° \"%s\" Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð³Ð¾ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ \"%s.%s\", Ñтолбца " -"\"%s\", в транзакции %u завершена в %X/%X" +"\"%s\", в транзакции %u, ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %X/%X" -#: replication/pgoutput/pgoutput.c:319 +#: replication/pgoutput/pgoutput.c:322 #, c-format msgid "invalid proto_version" msgstr "неверное значение proto_version" -#: replication/pgoutput/pgoutput.c:324 +#: replication/pgoutput/pgoutput.c:327 #, c-format msgid "proto_version \"%s\" out of range" msgstr "значение proto_verson \"%s\" вне диапазона" -#: replication/pgoutput/pgoutput.c:341 +#: replication/pgoutput/pgoutput.c:344 #, c-format msgid "invalid publication_names syntax" msgstr "неверный ÑинтакÑÐ¸Ñ publication_names" -#: replication/pgoutput/pgoutput.c:425 +#: replication/pgoutput/pgoutput.c:414 replication/pgoutput/pgoutput.c:418 #, c-format -msgid "client sent proto_version=%d but we only support protocol %d or lower" -msgstr "" -"клиент передал proto_version=%d, но мы поддерживаем только протокол %d и ниже" +msgid "option \"%s\" missing" +msgstr "параметр \"%s\" отÑутÑтвует" -#: replication/pgoutput/pgoutput.c:431 +#: replication/pgoutput/pgoutput.c:478 #, c-format -msgid "client sent proto_version=%d but we only support protocol %d or higher" +msgid "" +"client sent proto_version=%d but server only supports protocol %d or lower" msgstr "" -"клиент передал proto_version=%d, но мы поддерживает только протокол %d и выше" +"клиент передал proto_version=%d, но Ñервер поддерживает только протокол %d и " +"ниже" -#: replication/pgoutput/pgoutput.c:437 +#: replication/pgoutput/pgoutput.c:484 #, c-format -msgid "publication_names parameter missing" -msgstr "отÑутÑтвует параметр publication_names" +msgid "" +"client sent proto_version=%d but server only supports protocol %d or higher" +msgstr "" +"клиент передал proto_version=%d, но Ñервер поддерживает только протокол %d и " +"выше" -#: replication/pgoutput/pgoutput.c:450 +#: replication/pgoutput/pgoutput.c:499 #, c-format msgid "" "requested proto_version=%d does not support streaming, need %d or higher" @@ -22370,12 +23747,21 @@ msgstr "" "Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ proto_version=%d не поддерживает потоковую передачу, " "требуетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ %d или выше" -#: replication/pgoutput/pgoutput.c:455 +#: replication/pgoutput/pgoutput.c:505 +#, c-format +msgid "" +"requested proto_version=%d does not support parallel streaming, need %d or " +"higher" +msgstr "" +"Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ proto_version=%d не поддерживает параллельную потоковую " +"передачу, требуетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ %d или выше" + +#: replication/pgoutput/pgoutput.c:510 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "запрошена Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð°, но она не поддерживаетÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ вывода" -#: replication/pgoutput/pgoutput.c:472 +#: replication/pgoutput/pgoutput.c:524 #, c-format msgid "" "requested proto_version=%d does not support two-phase commit, need %d or " @@ -22384,27 +23770,27 @@ msgstr "" "Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ proto_version=%d не поддерживает двухфазную фикÑацию, " "требуетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ %d или выше" -#: replication/pgoutput/pgoutput.c:477 +#: replication/pgoutput/pgoutput.c:529 #, c-format msgid "two-phase commit requested, but not supported by output plugin" msgstr "запрошена Ð´Ð²ÑƒÑ…Ñ„Ð°Ð·Ð½Ð°Ñ Ñ„Ð¸ÐºÑациÑ, но она не поддерживаетÑÑ Ð¼Ð¾Ð´ÑƒÐ»ÐµÐ¼ вывода" -#: replication/slot.c:205 +#: replication/slot.c:260 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "Ð¸Ð¼Ñ Ñлота репликации \"%s\" Ñлишком короткое" -#: replication/slot.c:214 +#: replication/slot.c:269 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "Ð¸Ð¼Ñ Ñлота репликации \"%s\" Ñлишком длинное" -#: replication/slot.c:227 +#: replication/slot.c:282 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "Ð¸Ð¼Ñ Ñлота репликации \"%s\" Ñодержит недопуÑтимый Ñимвол" -#: replication/slot.c:229 +#: replication/slot.c:284 #, c-format msgid "" "Replication slot names may only contain lower case letters, numbers, and the " @@ -22413,182 +23799,374 @@ msgstr "" "Ð˜Ð¼Ñ Ñлота репликации может Ñодержать только буквы в нижнем региÑтре, цифры и " "знак подчёркиваниÑ." -#: replication/slot.c:283 +#: replication/slot.c:333 +#, c-format +msgid "cannot enable failover for a replication slot created on the standby" +msgstr "" +"Ñлот репликации, Ñозданный на ведомом Ñервере, не может быть переноÑимым" + +#: replication/slot.c:345 replication/slot.c:849 +#, c-format +msgid "cannot enable failover for a temporary replication slot" +msgstr "временный Ñлот репликации не может быть переноÑимым" + +#: replication/slot.c:370 #, c-format msgid "replication slot \"%s\" already exists" msgstr "Ñлот репликации \"%s\" уже ÑущеÑтвует" -#: replication/slot.c:293 +#: replication/slot.c:380 #, c-format msgid "all replication slots are in use" msgstr "иÑпользуютÑÑ Ð²Ñе Ñлоты репликации" -#: replication/slot.c:294 +#: replication/slot.c:381 #, c-format -msgid "Free one or increase max_replication_slots." -msgstr "ОÑвободите ненужные или увеличьте параметр max_replication_slots." +msgid "Free one or increase \"max_replication_slots\"." +msgstr "ОÑвободите ненужный или увеличьте параметр \"max_replication_slots\"." -#: replication/slot.c:472 replication/slotfuncs.c:727 -#: utils/activity/pgstat_replslot.c:55 utils/adt/genfile.c:704 +#: replication/slot.c:560 replication/slot.c:2467 replication/slotfuncs.c:661 +#: utils/activity/pgstat_replslot.c:56 utils/adt/genfile.c:728 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "Ñлот репликации \"%s\" не ÑущеÑтвует" -#: replication/slot.c:518 replication/slot.c:1093 +#: replication/slot.c:606 replication/slot.c:1337 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "Ñлот репликации \"%s\" занÑÑ‚ процеÑÑом Ñ PID %d" -#: replication/slot.c:754 replication/slot.c:1499 replication/slot.c:1882 +#: replication/slot.c:638 +#, c-format +msgid "acquired logical replication slot \"%s\"" +msgstr "получен Ñлот логичеÑкой репликации \"%s\"" + +#: replication/slot.c:640 +#, c-format +msgid "acquired physical replication slot \"%s\"" +msgstr "получен Ñлот физичеÑкой репликации \"%s\"" + +#: replication/slot.c:729 +#, c-format +msgid "released logical replication slot \"%s\"" +msgstr "оÑвобождён Ñлот логичеÑкой репликации \"%s\"" + +#: replication/slot.c:731 +#, c-format +msgid "released physical replication slot \"%s\"" +msgstr "оÑвобождён Ñлот физичеÑкой репликации \"%s\"" + +#: replication/slot.c:797 +#, c-format +msgid "cannot drop replication slot \"%s\"" +msgstr "удалить Ñлот репликации \"%s\" нельзÑ" + +#: replication/slot.c:816 +#, c-format +msgid "cannot use %s with a physical replication slot" +msgstr "выполнить %s Ñо Ñлотом физичеÑкой репликации нельзÑ" + +#: replication/slot.c:828 +#, c-format +msgid "cannot alter replication slot \"%s\"" +msgstr "изменить Ñлот репликации \"%s\" нельзÑ" + +#: replication/slot.c:838 +#, c-format +msgid "cannot enable failover for a replication slot on the standby" +msgstr "Ñделать переноÑимым Ñлот репликации на ведомом Ñервере нельзÑ" + +#: replication/slot.c:969 replication/slot.c:1927 replication/slot.c:2311 #, c-format msgid "could not remove directory \"%s\"" msgstr "ошибка при удалении каталога \"%s\"" -#: replication/slot.c:1128 +#: replication/slot.c:1372 +#, c-format +msgid "replication slots can only be used if \"max_replication_slots\" > 0" +msgstr "" +"Ñлоты репликации можно иÑпользовать, только еÑли \"max_replication_slots\" > " +"0" + +#: replication/slot.c:1377 #, c-format -msgid "replication slots can only be used if max_replication_slots > 0" +msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" msgstr "" -"Ñлоты репликации можно иÑпользовать, только еÑли max_replication_slots > 0" +"Ñлоты репликации можно иÑпользовать, только еÑли \"wal_level\" >= \"replica\"" -#: replication/slot.c:1133 +#: replication/slot.c:1389 #, c-format -msgid "replication slots can only be used if wal_level >= replica" -msgstr "Ñлоты репликации можно иÑпользовать, только еÑли wal_level >= replica" +msgid "permission denied to use replication slots" +msgstr "нет прав Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñлотов репликации" -#: replication/slot.c:1145 +#: replication/slot.c:1390 #, c-format -msgid "must be superuser or replication role to use replication slots" +msgid "Only roles with the %s attribute may use replication slots." +msgstr "ИÑпользовать Ñлоты репликации могут только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s." + +#: replication/slot.c:1498 +#, c-format +msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu byte." +msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." +msgstr[0] "ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ restart_lsn %X/%X Ñлота превыÑила предел на %llu Б." +msgstr[1] "ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ restart_lsn %X/%X Ñлота превыÑила предел на %llu Б." +msgstr[2] "ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ restart_lsn %X/%X Ñлота превыÑила предел на %llu Б." + +#: replication/slot.c:1506 +#, c-format +msgid "The slot conflicted with xid horizon %u." +msgstr "Слот конфликтует Ñ Ð³Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð¾Ð¼ xid %u." + +#: replication/slot.c:1511 +msgid "" +"Logical decoding on standby requires \"wal_level\" >= \"logical\" on the " +"primary server." msgstr "" -"Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñлотов репликации требуетÑÑ Ñ€Ð¾Ð»ÑŒ репликации или права " -"ÑуперпользователÑ" +"Ð”Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° ведомом Ñервере требуетÑÑ \"wal_level\" >= " +"\"logical\" на ведущем." -#: replication/slot.c:1330 +#: replication/slot.c:1519 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "завершение процеÑÑа %d Ð´Ð»Ñ Ð¾ÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ñлота репликации \"%s\"" -#: replication/slot.c:1368 +#: replication/slot.c:1521 #, c-format -msgid "" -"invalidating slot \"%s\" because its restart_lsn %X/%X exceeds " -"max_slot_wal_keep_size" -msgstr "" -"Ñлот \"%s\" аннулируетÑÑ, так как его Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ restart_lsn %X/%X превышает " -"max_slot_wal_keep_size" +msgid "invalidating obsolete replication slot \"%s\"" +msgstr "аннулирование уÑтаревшего Ñлота репликации \"%s\"" -#: replication/slot.c:1820 +#: replication/slot.c:2249 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "" "файл Ñлота репликации \"%s\" имеет неправильную Ñигнатуру (%u вмеÑто %u)" -#: replication/slot.c:1827 +#: replication/slot.c:2256 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "файл ÑоÑтоÑÐ½Ð¸Ñ snapbuild \"%s\" имеет неподдерживаемую верÑию %u" -#: replication/slot.c:1834 +#: replication/slot.c:2263 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "у файла Ñлота репликации \"%s\" Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð°: %u" -#: replication/slot.c:1870 +#: replication/slot.c:2299 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "" "в файле Ñлота репликации \"%s\" Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма (%u вмеÑто %u)" -#: replication/slot.c:1904 +#: replication/slot.c:2335 #, c-format -msgid "logical replication slot \"%s\" exists, but wal_level < logical" -msgstr "ÑущеÑтвует Ñлот логичеÑкой репликации \"%s\", но wal_level < logical" +msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" +msgstr "" +"ÑущеÑтвует Ñлот логичеÑкой репликации \"%s\", но \"wal_level\" < \"logical\"" + +#: replication/slot.c:2337 +#, c-format +msgid "Change \"wal_level\" to be \"logical\" or higher." +msgstr "Смените \"wal_level\" на \"logical\" или более выÑокий уровень." + +#: replication/slot.c:2349 +#, c-format +msgid "" +"logical replication slot \"%s\" exists on the standby, but \"hot_standby\" = " +"\"off\"" +msgstr "" +"на ведомом Ñервере ÑущеÑтвует Ñлот логичеÑкой репликации \"%s\", но " +"\"hot_standby\" = \"off\"" -#: replication/slot.c:1906 +#: replication/slot.c:2351 #, c-format -msgid "Change wal_level to be logical or higher." -msgstr "Смените wal_level на logical или более выÑокий уровень." +msgid "Change \"hot_standby\" to be \"on\"." +msgstr "Смените значение \"hot_standby\" на \"on\"." -#: replication/slot.c:1910 +#: replication/slot.c:2356 #, c-format -msgid "physical replication slot \"%s\" exists, but wal_level < replica" -msgstr "ÑущеÑтвует Ñлот физичеÑкой репликации \"%s\", но wal_level < replica" +msgid "" +"physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" +msgstr "" +"ÑущеÑтвует Ñлот физичеÑкой репликации \"%s\", но \"wal_level\" < \"replica\"" -#: replication/slot.c:1912 +#: replication/slot.c:2358 #, c-format -msgid "Change wal_level to be replica or higher." -msgstr "Смените wal_level на replica или более выÑокий уровень." +msgid "Change \"wal_level\" to be \"replica\" or higher." +msgstr "Смените \"wal_level\" на \"replica\" или более выÑокий уровень." -#: replication/slot.c:1946 +#: replication/slot.c:2400 #, c-format msgid "too many replication slots active before shutdown" msgstr "перед завершением активно Ñлишком много Ñлотов репликации" -#: replication/slotfuncs.c:592 +#: replication/slot.c:2475 #, c-format -msgid "invalid target WAL LSN" -msgstr "неверный целевой LSN" +msgid "\"%s\" is not a physical replication slot" +msgstr "\"%s\" не ÑвлÑетÑÑ Ñлотом физичеÑкой репликации" -#: replication/slotfuncs.c:614 +#: replication/slot.c:2654 #, c-format -msgid "replication slot \"%s\" cannot be advanced" -msgstr "Ñлот репликации \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚ÑŒ вперёд" +msgid "replication slot \"%s\" specified in parameter \"%s\" does not exist" +msgstr "Ñлот репликации \"%s\", указанный в параметре \"%s\", не ÑущеÑтвует" -#: replication/slotfuncs.c:632 +#: replication/slot.c:2656 replication/slot.c:2690 replication/slot.c:2705 #, c-format -msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" +msgid "" +"Logical replication is waiting on the standby associated with replication " +"slot \"%s\"." msgstr "" -"продвинуть Ñлот репликации к позиции %X/%X нельзÑ, Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ: %X/%X" +"ЛогичеÑÐºÐ°Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ‚ резервного Ñервера, ÑвÑзанного Ñо Ñлотом " +"репликации \"%s\"." -#: replication/slotfuncs.c:739 +#: replication/slot.c:2658 #, c-format -msgid "" -"cannot copy physical replication slot \"%s\" as a logical replication slot" -msgstr "" -"Ñлот физичеÑкой репликации \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ñкопировать как Ñлот логичеÑкой " -"репликации" +msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." +msgstr "Создайте Ñлот репликации \"%s\" или опуÑтите параметр \"%s\"." -#: replication/slotfuncs.c:741 +#: replication/slot.c:2668 #, c-format -msgid "" -"cannot copy logical replication slot \"%s\" as a physical replication slot" +msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" msgstr "" -"Ñлот логичеÑкой репликации \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ñкопировать как Ñлот физичеÑкой " -"репликации" +"Ñлот логичеÑкой репликации \"%s\" не может быть указан в параметре \"%s\"" -#: replication/slotfuncs.c:748 +#: replication/slot.c:2670 #, c-format -msgid "cannot copy a replication slot that doesn't reserve WAL" -msgstr "Ñкопировать Ñлот репликации, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ не резервируетÑÑ WAL, нельзÑ" +msgid "" +"Logical replication is waiting for correction on replication slot \"%s\"." +msgstr "ЛогичеÑÐºÐ°Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ‚ иÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñлота репликации \"%s\"." -#: replication/slotfuncs.c:825 +#: replication/slot.c:2672 #, c-format -msgid "could not copy replication slot \"%s\"" -msgstr "не удалоÑÑŒ Ñкопировать Ñлот репликации \"%s\"" +msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." +msgstr "" +"Удалите указание Ñлота логичеÑкой репликации \"%s\" из параметра \"%s\"." -#: replication/slotfuncs.c:827 +#: replication/slot.c:2688 #, c-format msgid "" -"The source replication slot was modified incompatibly during the copy " -"operation." +"physical replication slot \"%s\" specified in parameter \"%s\" has been " +"invalidated" msgstr "" -"ИÑходный Ñлот репликации был модифицирован неÑовмеÑтимым образом во Ð²Ñ€ÐµÐ¼Ñ " -"копированиÑ." +"Ñлот физичеÑкой репликации \"%s\", указанный в параметре \"%s\", был " +"аннулирован" -#: replication/slotfuncs.c:833 +#: replication/slot.c:2692 #, c-format -msgid "cannot copy unfinished logical replication slot \"%s\"" +msgid "" +"Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." msgstr "" -"Ñкопировать Ñлот логичеÑкой репликации \"%s\" в незавершённом ÑоÑтоÑнии " -"нельзÑ" +"Удалите и переÑоздайте Ñлот репликации \"%s\" или опуÑтите параметр \"%s\"." -#: replication/slotfuncs.c:835 +#: replication/slot.c:2703 #, c-format -msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." +msgid "" +"replication slot \"%s\" specified in parameter \"%s\" does not have " +"active_pid" +msgstr "" +"у Ñлота репликации \"%s\", указанного в параметре \"%s\", нулевое значение " +"active_pid" + +#: replication/slot.c:2707 +#, c-format +msgid "" +"Start the standby associated with the replication slot \"%s\", or amend " +"parameter \"%s\"." +msgstr "" +"ЗапуÑтите резервный Ñервер, ÑвÑзанный Ñо Ñлотом репликации \"%s\", или " +"опуÑтите параметр \"%s\"." + +#: replication/slotfuncs.c:526 +#, c-format +msgid "invalid target WAL LSN" +msgstr "неверный целевой LSN" + +#: replication/slotfuncs.c:548 +#, c-format +msgid "replication slot \"%s\" cannot be advanced" +msgstr "Ñлот репликации \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚ÑŒ вперёд" + +#: replication/slotfuncs.c:550 +#, c-format +msgid "" +"This slot has never previously reserved WAL, or it has been invalidated." +msgstr "Ð”Ð»Ñ Ñтого Ñлота ранее не резервировалÑÑ WAL либо Ñлот был аннулирован." + +#: replication/slotfuncs.c:566 +#, c-format +msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" +msgstr "" +"продвинуть Ñлот репликации к позиции %X/%X нельзÑ, Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ: %X/%X" + +#: replication/slotfuncs.c:673 +#, c-format +msgid "" +"cannot copy physical replication slot \"%s\" as a logical replication slot" +msgstr "" +"Ñлот физичеÑкой репликации \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ñкопировать как Ñлот логичеÑкой " +"репликации" + +#: replication/slotfuncs.c:675 +#, c-format +msgid "" +"cannot copy logical replication slot \"%s\" as a physical replication slot" +msgstr "" +"Ñлот логичеÑкой репликации \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ñкопировать как Ñлот физичеÑкой " +"репликации" + +#: replication/slotfuncs.c:682 +#, c-format +msgid "cannot copy a replication slot that doesn't reserve WAL" +msgstr "Ñкопировать Ñлот репликации, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ не резервируетÑÑ WAL, нельзÑ" + +#: replication/slotfuncs.c:688 +#, c-format +msgid "cannot copy invalidated replication slot \"%s\"" +msgstr "Ñкопировать аннулированный Ñлот репликации \"%s\" нельзÑ" + +#: replication/slotfuncs.c:780 +#, c-format +msgid "could not copy replication slot \"%s\"" +msgstr "не удалоÑÑŒ Ñкопировать Ñлот репликации \"%s\"" + +#: replication/slotfuncs.c:782 +#, c-format +msgid "" +"The source replication slot was modified incompatibly during the copy " +"operation." +msgstr "" +"ИÑходный Ñлот репликации был модифицирован неÑовмеÑтимым образом во Ð²Ñ€ÐµÐ¼Ñ " +"копированиÑ." + +#: replication/slotfuncs.c:788 +#, c-format +msgid "cannot copy unfinished logical replication slot \"%s\"" +msgstr "" +"Ñкопировать Ñлот логичеÑкой репликации \"%s\" в незавершённом ÑоÑтоÑнии " +"нельзÑ" + +#: replication/slotfuncs.c:790 +#, c-format +msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "" "Повторите попытку, когда Ð´Ð»Ñ Ð¸Ñходного Ñлота репликации будет определена " "Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ confirmed_flush_lsn." -#: replication/syncrep.c:268 +#: replication/slotfuncs.c:802 +#, c-format +msgid "cannot copy replication slot \"%s\"" +msgstr "Ñкопировать Ñлот репликации \"%s\" нельзÑ" + +#: replication/slotfuncs.c:804 +#, c-format +msgid "The source replication slot was invalidated during the copy operation." +msgstr "ИÑходный Ñлот репликации был аннулирован во Ð²Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ." + +#: replication/slotfuncs.c:903 +#, c-format +msgid "replication slots can only be synchronized to a standby server" +msgstr "Ñлоты репликации могут ÑинхронизироватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ñ‹Ð¼ Ñервером" + +#: replication/syncrep.c:304 #, c-format msgid "" "canceling the wait for synchronous replication and terminating connection " @@ -22597,7 +24175,7 @@ msgstr "" "отмена Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ñинхронной репликации и закрытие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ команде " "админиÑтратора" -#: replication/syncrep.c:269 replication/syncrep.c:286 +#: replication/syncrep.c:305 replication/syncrep.c:322 #, c-format msgid "" "The transaction has already committed locally, but might not have been " @@ -22606,147 +24184,142 @@ msgstr "" "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ ÑƒÐ¶Ðµ была зафикÑирована локально, но, возможно, не была " "реплицирована на резервный Ñервер." -#: replication/syncrep.c:285 +#: replication/syncrep.c:321 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "отмена Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ñинхронной репликации по запроÑу пользователÑ" -#: replication/syncrep.c:494 +#: replication/syncrep.c:528 #, c-format -msgid "standby \"%s\" is now a synchronous standby with priority %u" -msgstr "резервный Ñервер \"%s\" Ñтал Ñинхронным Ñ Ð¿Ñ€Ð¸Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚Ð¾Ð¼ %u" +msgid "standby \"%s\" is now a synchronous standby with priority %d" +msgstr "резервный Ñервер \"%s\" Ñтал Ñинхронным Ñ Ð¿Ñ€Ð¸Ð¾Ñ€Ð¸Ñ‚ÐµÑ‚Ð¾Ð¼ %d" -#: replication/syncrep.c:498 +#: replication/syncrep.c:532 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "" "резервный Ñервер \"%s\" Ñтал кандидатом Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² кворум Ñинхронных " "резервных" -#: replication/syncrep.c:1045 +#: replication/syncrep.c:1080 #, c-format -msgid "synchronous_standby_names parser failed" -msgstr "ошибка при разборе synchronous_standby_names" +msgid "\"synchronous_standby_names\" parser failed" +msgstr "ошибка при разборе \"synchronous_standby_names\"" -#: replication/syncrep.c:1051 +#: replication/syncrep.c:1086 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "чиÑло Ñинхронных резервных Ñерверов (%d) должно быть больше нулÑ" -#: replication/walreceiver.c:164 +#: replication/walreceiver.c:176 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "завершение процеÑÑа ÑÑ‡Ð¸Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° по команде админиÑтратора" -#: replication/walreceiver.c:292 -#, c-format -msgid "could not connect to the primary server: %s" -msgstr "не удалоÑÑŒ подключитьÑÑ Ðº главному Ñерверу: %s" - -#: replication/walreceiver.c:339 +#: replication/walreceiver.c:354 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "идентификаторы СУБД на главном и резервном Ñерверах различаютÑÑ" -#: replication/walreceiver.c:340 +#: replication/walreceiver.c:355 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "Идентификатор на главном Ñервере: %s, на резервном: %s." -#: replication/walreceiver.c:351 +#: replication/walreceiver.c:366 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "" "поÑледнÑÑ Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u на главном Ñервере отÑтаёт от воÑÑтанавливаемой " "линии времени %u" -#: replication/walreceiver.c:404 +#: replication/walreceiver.c:419 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "" "начало передачи журнала Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ Ñервера, Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %X/%X на линии времени " "%u" -#: replication/walreceiver.c:408 +#: replication/walreceiver.c:423 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "перезапуÑк передачи журнала Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %X/%X на линии времени %u" -#: replication/walreceiver.c:437 +#: replication/walreceiver.c:458 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "продолжить передачу WAL нельзÑ, воÑÑтановление уже окончено" -#: replication/walreceiver.c:475 +#: replication/walreceiver.c:502 #, c-format msgid "replication terminated by primary server" msgstr "Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¿Ñ€ÐµÐºÑ€Ð°Ñ‰ÐµÐ½Ð° главным Ñервером" -#: replication/walreceiver.c:476 +#: replication/walreceiver.c:503 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "Ðа линии времени %u в %X/%X доÑтигнут конец журнала." -#: replication/walreceiver.c:565 +#: replication/walreceiver.c:593 #, c-format msgid "terminating walreceiver due to timeout" msgstr "завершение приёма журнала из-за тайм-аута" -#: replication/walreceiver.c:603 +#: replication/walreceiver.c:625 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "" "на главном Ñервере больше нет журналов Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð¾Ð¹ линии времени %u" -#: replication/walreceiver.c:619 replication/walreceiver.c:1045 +#: replication/walreceiver.c:641 replication/walreceiver.c:1071 #, c-format -msgid "could not close log segment %s: %m" -msgstr "не удалоÑÑŒ закрыть Ñегмент журнала %s: %m" +msgid "could not close WAL segment %s: %m" +msgstr "не удалоÑÑŒ закрыть Ñегмент WAL %s: %m" -#: replication/walreceiver.c:738 +#: replication/walreceiver.c:760 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "загрузка файла иÑтории Ð´Ð»Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени %u Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð³Ð¾ Ñервера" -#: replication/walreceiver.c:933 +#: replication/walreceiver.c:959 #, c-format -msgid "could not write to log segment %s at offset %u, length %lu: %m" -msgstr "не удалоÑÑŒ запиÑать в Ñегмент журнала %s (Ñмещение %u, длина %lu): %m" +msgid "could not write to WAL segment %s at offset %d, length %lu: %m" +msgstr "не удалоÑÑŒ запиÑать в Ñегмент WAL %s (Ñмещение %d, длина %lu): %m" -#: replication/walsender.c:521 +#: replication/walsender.c:535 #, c-format msgid "cannot use %s with a logical replication slot" msgstr "иÑпользовать %s Ñо Ñлотом логичеÑкой репликации нельзÑ" -#: replication/walsender.c:638 storage/smgr/md.c:1364 +#: replication/walsender.c:639 storage/smgr/md.c:1735 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "не удалоÑÑŒ перейти к концу файла \"%s\": %m" -#: replication/walsender.c:642 +#: replication/walsender.c:643 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "не удалоÑÑŒ перейти к началу файла \"%s\": %m" -#: replication/walsender.c:719 +#: replication/walsender.c:857 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "" "Ñлот логичеÑкой репликации Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ð´Ð»Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкой репликации" -#: replication/walsender.c:785 +#: replication/walsender.c:923 #, c-format msgid "" "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "" "в иÑтории Ñервера нет запрошенной начальной точки %X/%X на линии времени %u" -#: replication/walsender.c:788 +#: replication/walsender.c:926 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñтого Ñервера ответвилаÑÑŒ от линии времени %u в %X/%X." -#: replication/walsender.c:832 +#: replication/walsender.c:970 #, c-format msgid "" "requested starting point %X/%X is ahead of the WAL flush position of this " @@ -22755,82 +24328,75 @@ msgstr "" "Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð°Ñ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° %X/%X впереди позиции Ñброшенных данных журнала " "на Ñтом Ñервере (%X/%X)" -#: replication/walsender.c:1015 +#: replication/walsender.c:1164 #, c-format msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" msgstr "" "нераÑпознанное значение Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° CREATE_REPLICATION_SLOT \"%s\": \"%s\"" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1100 +#: replication/walsender.c:1270 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s требуетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñть не в транзакции" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1110 +#: replication/walsender.c:1280 #, c-format msgid "%s must be called inside a transaction" msgstr "%s требуетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñть внутри транзакции" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1116 +#: replication/walsender.c:1286 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s требуетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñть в транзакции ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¸Ð·Ð¾Ð»Ñции REPEATABLE READ" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1122 +#: replication/walsender.c:1291 +#, c-format +msgid "%s must be called in a read-only transaction" +msgstr "%s требуетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñть внутри транзакции только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1297 #, c-format msgid "%s must be called before any query" msgstr "%s требуетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñть до каких-либо запроÑов" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1128 +#: replication/walsender.c:1303 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s требуетÑÑ Ð²Ñ‹Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ не в подтранзакции" -#: replication/walsender.c:1271 -#, c-format -msgid "cannot read from logical replication slot \"%s\"" -msgstr "прочитать из Ñлота логичеÑкой репликации \"%s\" нельзÑ" - -#: replication/walsender.c:1273 -#, c-format -msgid "" -"This slot has been invalidated because it exceeded the maximum reserved size." -msgstr "" -"Этот Ñлот был аннулирован из-за Ð¿Ñ€ÐµÐ²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑимального зарезервированного " -"размера." - -#: replication/walsender.c:1283 +#: replication/walsender.c:1476 #, c-format msgid "terminating walsender process after promotion" msgstr "завершение процеÑÑа передачи журнала поÑле повышениÑ" -#: replication/walsender.c:1704 +#: replication/walsender.c:2015 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñть новые команды, пока процеÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ WAL находитÑÑ Ð² режиме " "оÑтановки" -#: replication/walsender.c:1739 +#: replication/walsender.c:2050 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñть команды SQL в процеÑÑе, передающем WAL Ð´Ð»Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкой " "репликации" -#: replication/walsender.c:1772 +#: replication/walsender.c:2083 #, c-format msgid "received replication command: %s" msgstr "получена команда репликации: %s" -#: replication/walsender.c:1780 tcop/fastpath.c:208 tcop/postgres.c:1114 -#: tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 -#: tcop/postgres.c:2614 tcop/postgres.c:2692 +#: replication/walsender.c:2091 tcop/fastpath.c:209 tcop/postgres.c:1142 +#: tcop/postgres.c:1500 tcop/postgres.c:1752 tcop/postgres.c:2234 +#: tcop/postgres.c:2672 tcop/postgres.c:2749 #, c-format msgid "" "current transaction is aborted, commands ignored until end of transaction " @@ -22838,210 +24404,147 @@ msgid "" msgstr "" "Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¿Ñ€ÐµÑ€Ð²Ð°Ð½Ð°, команды до конца блока транзакции игнорируютÑÑ" -#: replication/walsender.c:1922 replication/walsender.c:1957 +#: replication/walsender.c:2248 replication/walsender.c:2283 #, c-format msgid "unexpected EOF on standby connection" msgstr "неожиданный обрыв ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ñ‹Ð¼ Ñервером" -#: replication/walsender.c:1945 +#: replication/walsender.c:2271 #, c-format msgid "invalid standby message type \"%c\"" msgstr "неверный тип ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ Ñервера: \"%c\"" -#: replication/walsender.c:2034 +#: replication/walsender.c:2360 #, c-format msgid "unexpected message type \"%c\"" msgstr "неожиданный тип ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ \"%c\"" -#: replication/walsender.c:2447 +#: replication/walsender.c:2774 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "завершение процеÑÑа передачи журнала из-за тайм-аута репликации" -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1013 +#: rewrite/rewriteDefine.c:104 rewrite/rewriteDefine.c:835 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "правило \"%s\" Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" уже ÑущеÑтвует" -#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:951 +#: rewrite/rewriteDefine.c:261 rewrite/rewriteDefine.c:773 #, c-format msgid "relation \"%s\" cannot have rules" msgstr "к отношению \"%s\" не могут применÑтьÑÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°" -#: rewrite/rewriteDefine.c:302 +#: rewrite/rewriteDefine.c:292 #, c-format msgid "rule actions on OLD are not implemented" msgstr "дейÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» Ð´Ð»Ñ OLD не реализованы" -#: rewrite/rewriteDefine.c:303 +#: rewrite/rewriteDefine.c:293 #, c-format msgid "Use views or triggers instead." msgstr "ВоÑпользуйтеÑÑŒ предÑтавлениÑми или триггерами." -#: rewrite/rewriteDefine.c:307 +#: rewrite/rewriteDefine.c:297 #, c-format msgid "rule actions on NEW are not implemented" msgstr "дейÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» Ð´Ð»Ñ NEW не реализованы" -#: rewrite/rewriteDefine.c:308 +#: rewrite/rewriteDefine.c:298 #, c-format msgid "Use triggers instead." msgstr "ВоÑпользуйтеÑÑŒ триггерами." -#: rewrite/rewriteDefine.c:321 +#: rewrite/rewriteDefine.c:312 +#, c-format +msgid "relation \"%s\" cannot have ON SELECT rules" +msgstr "к отношению \"%s\" не могут применÑтьÑÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° ON SELECT" + +#: rewrite/rewriteDefine.c:322 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "правила INSTEAD NOTHING Ð´Ð»Ñ SELECT не реализованы" -#: rewrite/rewriteDefine.c:322 +#: rewrite/rewriteDefine.c:323 #, c-format msgid "Use views instead." msgstr "ВоÑпользуйтеÑÑŒ предÑтавлениÑми." -#: rewrite/rewriteDefine.c:330 +#: rewrite/rewriteDefine.c:331 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "множеÑтвенные дейÑÑ‚Ð²Ð¸Ñ Ð² правилах Ð´Ð»Ñ SELECT не поддерживаютÑÑ" -#: rewrite/rewriteDefine.c:340 +#: rewrite/rewriteDefine.c:341 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "в правилах Ð´Ð»Ñ SELECT должно быть дейÑтвие INSTEAD SELECT" -#: rewrite/rewriteDefine.c:348 +#: rewrite/rewriteDefine.c:349 #, c-format msgid "rules on SELECT must not contain data-modifying statements in WITH" msgstr "" "правила Ð´Ð»Ñ SELECT не должны Ñодержать операторы, изменÑющие данные, в WITH" -#: rewrite/rewriteDefine.c:356 +#: rewrite/rewriteDefine.c:357 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "в правилах Ð´Ð»Ñ SELECT не может быть уÑловий" -#: rewrite/rewriteDefine.c:383 +#: rewrite/rewriteDefine.c:384 #, c-format msgid "\"%s\" is already a view" msgstr "\"%s\" уже ÑвлÑетÑÑ Ð¿Ñ€ÐµÐ´Ñтавлением" -#: rewrite/rewriteDefine.c:407 +#: rewrite/rewriteDefine.c:408 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "правило предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ \"%s\" должно называтьÑÑ \"%s\"" -#: rewrite/rewriteDefine.c:436 -#, c-format -msgid "cannot convert partitioned table \"%s\" to a view" -msgstr "преобразовать Ñекционированную таблицу \"%s\" в предÑтавление нельзÑ" - -#: rewrite/rewriteDefine.c:445 -#, c-format -msgid "cannot convert partition \"%s\" to a view" -msgstr "преобразовать Ñекцию \"%s\" в предÑтавление нельзÑ" - -#: rewrite/rewriteDefine.c:454 -#, c-format -msgid "could not convert table \"%s\" to a view because it is not empty" -msgstr "" -"не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как она не " -"пуÑта1" - -#: rewrite/rewriteDefine.c:463 -#, c-format -msgid "could not convert table \"%s\" to a view because it has triggers" -msgstr "" -"не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как она " -"Ñодержит триггеры" - -#: rewrite/rewriteDefine.c:465 -#, c-format -msgid "" -"In particular, the table cannot be involved in any foreign key relationships." -msgstr "" -"Кроме того, таблица не может быть задейÑтвована в ÑÑылках по внешнему ключу." - -#: rewrite/rewriteDefine.c:470 -#, c-format -msgid "could not convert table \"%s\" to a view because it has indexes" -msgstr "" -"не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как она имеет " -"индекÑÑ‹" - -#: rewrite/rewriteDefine.c:476 -#, c-format -msgid "could not convert table \"%s\" to a view because it has child tables" -msgstr "" -"не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как она имеет " -"подчинённые таблицы" - -#: rewrite/rewriteDefine.c:482 -#, c-format -msgid "could not convert table \"%s\" to a view because it has parent tables" -msgstr "" -"не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как она имеет " -"родительÑкие таблицы" - -#: rewrite/rewriteDefine.c:488 -#, c-format -msgid "" -"could not convert table \"%s\" to a view because it has row security enabled" -msgstr "" -"не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как Ð´Ð»Ñ Ð½ÐµÑ‘ " -"включена защита на уровне Ñтрок" - -#: rewrite/rewriteDefine.c:494 -#, c-format -msgid "" -"could not convert table \"%s\" to a view because it has row security policies" -msgstr "" -"не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как к ней " -"применены политики защиты Ñтрок" - -#: rewrite/rewriteDefine.c:521 +#: rewrite/rewriteDefine.c:435 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "в правиле Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ неÑколько ÑпиÑков RETURNING" -#: rewrite/rewriteDefine.c:526 +#: rewrite/rewriteDefine.c:440 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "ÑпиÑки RETURNING в уÑловных правилах не поддерживаютÑÑ" -#: rewrite/rewriteDefine.c:530 +#: rewrite/rewriteDefine.c:444 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "ÑпиÑки RETURNING поддерживаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в правилах INSTEAD" -#: rewrite/rewriteDefine.c:544 +#: rewrite/rewriteDefine.c:458 #, c-format msgid "non-view rule for \"%s\" must not be named \"%s\"" msgstr "" "не отноÑÑщееÑÑ Ðº предÑтавлению правило Ð´Ð»Ñ \"%s\" не может называтьÑÑ \"%s\"" -#: rewrite/rewriteDefine.c:706 +#: rewrite/rewriteDefine.c:532 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "ÑпиÑок результата правила Ð´Ð»Ñ SELECT Ñодержит Ñлишком много Ñтолбцов" -#: rewrite/rewriteDefine.c:707 +#: rewrite/rewriteDefine.c:533 #, c-format msgid "RETURNING list has too many entries" msgstr "ÑпиÑок RETURNING Ñодержит Ñлишком много Ñтолбцов" -#: rewrite/rewriteDefine.c:734 +#: rewrite/rewriteDefine.c:560 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "" "преобразовать отношение, Ñодержащее удалённые Ñтолбцы, в предÑтавление нельзÑ" -#: rewrite/rewriteDefine.c:735 +#: rewrite/rewriteDefine.c:561 #, c-format msgid "" "cannot create a RETURNING list for a relation containing dropped columns" msgstr "" "Ñоздать ÑпиÑок RETURNING Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ, Ñодержащего удалённые Ñтолбцы, нельзÑ" -#: rewrite/rewriteDefine.c:741 +#: rewrite/rewriteDefine.c:567 #, c-format msgid "" "SELECT rule's target entry %d has different column name from column \"%s\"" @@ -23049,67 +24552,67 @@ msgstr "" "Ñлементу %d результата правила Ð´Ð»Ñ SELECT приÑвоено имÑ, отличное от имени " "Ñтолбца \"%s\"" -#: rewrite/rewriteDefine.c:743 +#: rewrite/rewriteDefine.c:569 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "Ð˜Ð¼Ñ Ñлемента результата SELECT: \"%s\"." -#: rewrite/rewriteDefine.c:752 +#: rewrite/rewriteDefine.c:578 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "" "Ñлемент %d результата правила Ð´Ð»Ñ SELECT имеет тип, отличный от типа Ñтолбца " "\"%s\"" -#: rewrite/rewriteDefine.c:754 +#: rewrite/rewriteDefine.c:580 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "Ñлемент %d ÑпиÑка RETURNING имеет тип, отличный от типа Ñтолбца \"%s\"" -#: rewrite/rewriteDefine.c:757 rewrite/rewriteDefine.c:781 +#: rewrite/rewriteDefine.c:583 rewrite/rewriteDefine.c:607 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "Элемент результата SELECT имеет тип %s, тогда как тип Ñтолбца - %s." -#: rewrite/rewriteDefine.c:760 rewrite/rewriteDefine.c:785 +#: rewrite/rewriteDefine.c:586 rewrite/rewriteDefine.c:611 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "Элемент ÑпиÑка RETURNING имеет тип %s, тогда как тип Ñтолбца - %s." -#: rewrite/rewriteDefine.c:776 +#: rewrite/rewriteDefine.c:602 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "" "Ñлемент %d результата правила Ð´Ð»Ñ SELECT имеет размер, отличный от Ñтолбца " "\"%s\"" -#: rewrite/rewriteDefine.c:778 +#: rewrite/rewriteDefine.c:604 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "Ñлемент %d ÑпиÑка RETURNING имеет размер, отличный от Ñтолбца \"%s\"" -#: rewrite/rewriteDefine.c:795 +#: rewrite/rewriteDefine.c:621 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "ÑпиÑок результата правила Ð´Ð»Ñ SELECT Ñодержит недоÑтаточно Ñлементов" -#: rewrite/rewriteDefine.c:796 +#: rewrite/rewriteDefine.c:622 #, c-format msgid "RETURNING list has too few entries" msgstr "ÑпиÑок RETURNING Ñодержит недоÑтаточно Ñлементов" -#: rewrite/rewriteDefine.c:889 rewrite/rewriteDefine.c:1004 -#: rewrite/rewriteSupport.c:109 +#: rewrite/rewriteDefine.c:711 rewrite/rewriteDefine.c:826 +#: rewrite/rewriteSupport.c:108 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "правило \"%s\" Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ\"%s\" не ÑущеÑтвует" -#: rewrite/rewriteDefine.c:1023 +#: rewrite/rewriteDefine.c:845 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "переименовывать правило ON SELECT нельзÑ" -#: rewrite/rewriteHandler.c:559 +#: rewrite/rewriteHandler.c:588 #, c-format msgid "" "WITH query name \"%s\" appears in both a rule action and the query being " @@ -23118,122 +24621,132 @@ msgstr "" "Ð¸Ð¼Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа WITH \"%s\" оказалоÑÑŒ и в дейÑтвии правила, и в перепиÑываемом " "запроÑе" -#: rewrite/rewriteHandler.c:586 +#: rewrite/rewriteHandler.c:615 #, c-format msgid "" -"INSERT...SELECT rule actions are not supported for queries having data-" +"INSERT ... SELECT rule actions are not supported for queries having data-" "modifying statements in WITH" msgstr "" -"правила INSERT...SELECT не поддерживаютÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°Ð¼Ð¸, " +"правила INSERT ... SELECT не поддерживаютÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°Ð¼Ð¸, " "изменÑющими данные, в WITH" -#: rewrite/rewriteHandler.c:639 +#: rewrite/rewriteHandler.c:668 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "RETURNING можно определить только Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ правила" -#: rewrite/rewriteHandler.c:871 rewrite/rewriteHandler.c:910 +#: rewrite/rewriteHandler.c:900 rewrite/rewriteHandler.c:939 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "в Ñтолбец \"%s\" можно вÑтавить только значение по умолчанию" -#: rewrite/rewriteHandler.c:873 rewrite/rewriteHandler.c:939 +#: rewrite/rewriteHandler.c:902 rewrite/rewriteHandler.c:968 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "" "Столбец \"%s\" ÑвлÑетÑÑ Ñтолбцом идентификации Ñо ÑвойÑтвом GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:875 +#: rewrite/rewriteHandler.c:904 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð¶Ð¸Ñ‚Ðµ OVERRIDING SYSTEM VALUE." -#: rewrite/rewriteHandler.c:937 rewrite/rewriteHandler.c:945 +#: rewrite/rewriteHandler.c:966 rewrite/rewriteHandler.c:974 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "Ñтолбцу \"%s\" можно приÑвоить только значение DEFAULT" -#: rewrite/rewriteHandler.c:1092 rewrite/rewriteHandler.c:1110 +#: rewrite/rewriteHandler.c:1109 rewrite/rewriteHandler.c:1127 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "многочиÑленные приÑÐ²Ð¾ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð¼Ñƒ Ñтолбцу \"%s\"" -#: rewrite/rewriteHandler.c:2112 rewrite/rewriteHandler.c:3990 +#: rewrite/rewriteHandler.c:1682 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE не поддерживаетÑÑ Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ð¹ Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°Ð¼Ð¸." + +#: rewrite/rewriteHandler.c:1722 rewrite/rewriteHandler.c:3262 +#, c-format +msgid "access to non-system view \"%s\" is restricted" +msgstr "доÑтуп к неÑиÑтемному предÑтавлению \"%s\" ограничен" + +#: rewrite/rewriteHandler.c:2122 rewrite/rewriteHandler.c:4254 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "обнаружена беÑÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐºÑƒÑ€ÑÐ¸Ñ Ð² правилах Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\"" -#: rewrite/rewriteHandler.c:2197 +#: rewrite/rewriteHandler.c:2227 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "обнаружена беÑÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐºÑƒÑ€ÑÐ¸Ñ Ð² политике Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\"" -#: rewrite/rewriteHandler.c:2517 +#: rewrite/rewriteHandler.c:2589 msgid "Junk view columns are not updatable." msgstr "Утилизируемые Ñтолбцы предÑтавлений не обновлÑÑŽÑ‚ÑÑ." -#: rewrite/rewriteHandler.c:2522 +#: rewrite/rewriteHandler.c:2594 msgid "" "View columns that are not columns of their base relation are not updatable." msgstr "" "Столбцы предÑтавлений, не ÑвлÑющиеÑÑ Ñтолбцами базовых отношений, не " "обновлÑÑŽÑ‚ÑÑ." -#: rewrite/rewriteHandler.c:2525 +#: rewrite/rewriteHandler.c:2597 msgid "View columns that refer to system columns are not updatable." msgstr "" "Столбцы предÑтавлений, ÑÑылающиеÑÑ Ð½Ð° ÑиÑтемные Ñтолбцы, не обновлÑÑŽÑ‚ÑÑ." -#: rewrite/rewriteHandler.c:2528 +#: rewrite/rewriteHandler.c:2600 msgid "View columns that return whole-row references are not updatable." msgstr "" "Столбцы предÑтавлений, возвращающие ÑÑылки на вÑÑŽ Ñтроку, не обновлÑÑŽÑ‚ÑÑ." -#: rewrite/rewriteHandler.c:2589 +#: rewrite/rewriteHandler.c:2661 msgid "Views containing DISTINCT are not automatically updatable." msgstr "ПредÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ DISTINCT не обновлÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки." -#: rewrite/rewriteHandler.c:2592 +#: rewrite/rewriteHandler.c:2664 msgid "Views containing GROUP BY are not automatically updatable." msgstr "ПредÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ GROUP BY не обновлÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки." -#: rewrite/rewriteHandler.c:2595 +#: rewrite/rewriteHandler.c:2667 msgid "Views containing HAVING are not automatically updatable." msgstr "ПредÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ HAVING не обновлÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки." -#: rewrite/rewriteHandler.c:2598 +#: rewrite/rewriteHandler.c:2670 msgid "" "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "" "ПредÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ UNION, INTERSECT или EXCEPT не обновлÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки." -#: rewrite/rewriteHandler.c:2601 +#: rewrite/rewriteHandler.c:2673 msgid "Views containing WITH are not automatically updatable." msgstr "ПредÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ WITH не обновлÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки." -#: rewrite/rewriteHandler.c:2604 +#: rewrite/rewriteHandler.c:2676 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "ПредÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ LIMIT или OFFSET не обновлÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки." -#: rewrite/rewriteHandler.c:2616 +#: rewrite/rewriteHandler.c:2688 msgid "Views that return aggregate functions are not automatically updatable." msgstr "" "ПредÑтавлениÑ, возвращающие агрегатные функции, не обновлÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки." -#: rewrite/rewriteHandler.c:2619 +#: rewrite/rewriteHandler.c:2691 msgid "Views that return window functions are not automatically updatable." msgstr "" "ПредÑтавлениÑ, возвращающие оконные функции, не обновлÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки." -#: rewrite/rewriteHandler.c:2622 +#: rewrite/rewriteHandler.c:2694 msgid "" "Views that return set-returning functions are not automatically updatable." msgstr "" "ПредÑтавлениÑ, возвращающие функции Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð¼-множеÑтвом, не обновлÑÑŽÑ‚ÑÑ " "автоматичеÑки." -#: rewrite/rewriteHandler.c:2629 rewrite/rewriteHandler.c:2633 -#: rewrite/rewriteHandler.c:2641 +#: rewrite/rewriteHandler.c:2701 rewrite/rewriteHandler.c:2705 +#: rewrite/rewriteHandler.c:2713 msgid "" "Views that do not select from a single table or view are not automatically " "updatable." @@ -23241,27 +24754,124 @@ msgstr "" "ПредÑтавлениÑ, выбирающие данные не из одной таблицы или предÑтавлениÑ, не " "обновлÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки." -#: rewrite/rewriteHandler.c:2644 +#: rewrite/rewriteHandler.c:2716 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "ПредÑтавлениÑ, Ñодержащие TABLESAMPLE, не обновлÑÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки." -#: rewrite/rewriteHandler.c:2668 +#: rewrite/rewriteHandler.c:2740 msgid "Views that have no updatable columns are not automatically updatable." msgstr "" "ПредÑтавлениÑ, не Ñодержащие обновлÑемых Ñтолбцов, не обновлÑÑŽÑ‚ÑÑ " "автоматичеÑки." -#: rewrite/rewriteHandler.c:3145 +#: rewrite/rewriteHandler.c:3121 rewrite/rewriteHandler.c:3156 +#, c-format +msgid "cannot insert into view \"%s\"" +msgstr "вÑтавить данные в предÑтавление \"%s\" нельзÑ" + +#: rewrite/rewriteHandler.c:3124 +#, c-format +msgid "" +"To enable inserting into the view, provide an INSTEAD OF INSERT trigger or " +"an unconditional ON INSERT DO INSTEAD rule." +msgstr "" +"Чтобы предÑтавление допуÑкало добавление данных, уÑтановите триггер INSTEAD " +"OF INSERT или безуÑловное правило ON INSERT DO INSTEAD." + +#: rewrite/rewriteHandler.c:3129 rewrite/rewriteHandler.c:3165 +#, c-format +msgid "cannot update view \"%s\"" +msgstr "изменить данные в предÑтавлении \"%s\" нельзÑ" + +#: rewrite/rewriteHandler.c:3132 +#, c-format +msgid "" +"To enable updating the view, provide an INSTEAD OF UPDATE trigger or an " +"unconditional ON UPDATE DO INSTEAD rule." +msgstr "" +"Чтобы предÑтавление допуÑкало изменение данных, уÑтановите триггер INSTEAD " +"OF UPDATE или безуÑловное правило ON UPDATE DO INSTEAD." + +#: rewrite/rewriteHandler.c:3137 rewrite/rewriteHandler.c:3174 +#, c-format +msgid "cannot delete from view \"%s\"" +msgstr "удалить данные из предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" нельзÑ" + +#: rewrite/rewriteHandler.c:3140 +#, c-format +msgid "" +"To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an " +"unconditional ON DELETE DO INSTEAD rule." +msgstr "" +"Чтобы предÑтавление допуÑкало удаление данных, уÑтановите триггер INSTEAD OF " +"DELETE или безуÑловное правило ON DELETE DO INSTEAD." + +#: rewrite/rewriteHandler.c:3159 +#, c-format +msgid "" +"To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT " +"trigger." +msgstr "" +"Чтобы предÑтавление допуÑкало добавление данных поÑредÑтвом MERGE, Ñоздайте " +"триггер INSTEAD OF INSERT." + +#: rewrite/rewriteHandler.c:3168 +#, c-format +msgid "" +"To enable updating the view using MERGE, provide an INSTEAD OF UPDATE " +"trigger." +msgstr "" +"Чтобы предÑтавление допуÑкало изменение данных поÑредÑтвом MERGE, Ñоздайте " +"триггер INSTEAD OF UPDATE." + +#: rewrite/rewriteHandler.c:3177 +#, c-format +msgid "" +"To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE " +"trigger." +msgstr "" +"Чтобы предÑтавление допуÑкало удаление данных поÑредÑтвом MERGE, Ñоздайте " +"триггер INSTEAD OF DELETE." + +#: rewrite/rewriteHandler.c:3352 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "вÑтавить данные в Ñтолбец \"%s\" предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: rewrite/rewriteHandler.c:3153 +#: rewrite/rewriteHandler.c:3360 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "изменить данные в Ñтолбце \"%s\" предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: rewrite/rewriteHandler.c:3644 +#: rewrite/rewriteHandler.c:3368 +#, c-format +msgid "cannot merge into column \"%s\" of view \"%s\"" +msgstr "Ñтолбец \"%s\" предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" не допуÑкает объединение данных" + +#: rewrite/rewriteHandler.c:3396 +#, c-format +msgid "cannot merge into view \"%s\"" +msgstr "предÑтавление \"%s\" не допуÑкает объединение данных" + +#: rewrite/rewriteHandler.c:3398 +#, c-format +msgid "" +"MERGE is not supported for views with INSTEAD OF triggers for some actions " +"but not all." +msgstr "" +"MERGE не поддерживаетÑÑ Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ñтавлений, имеющих триггеры INSTEAD OF Ð´Ð»Ñ " +"некоторых, но не вÑех дейÑтвий." + +#: rewrite/rewriteHandler.c:3399 +#, c-format +msgid "" +"To enable merging into the view, either provide a full set of INSTEAD OF " +"triggers or drop the existing INSTEAD OF triggers." +msgstr "" +"Чтобы предÑтавление допуÑкало объединение данных, или предоÑтавьте полный " +"набор триггеров INSTEAD OF, или удалите ÑущеÑтвующие триггеры INSTEAD OF." + +#: rewrite/rewriteHandler.c:3912 #, c-format msgid "" "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in " @@ -23270,7 +24880,7 @@ msgstr "" "правила DO INSTEAD NOTIFY не поддерживаютÑÑ Ð² операторах, изменÑющих данные, " "в WITH" -#: rewrite/rewriteHandler.c:3655 +#: rewrite/rewriteHandler.c:3923 #, c-format msgid "" "DO INSTEAD NOTHING rules are not supported for data-modifying statements in " @@ -23279,7 +24889,7 @@ msgstr "" "правила DO INSTEAD NOTHING не поддерживаютÑÑ Ð² операторах, изменÑющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3669 +#: rewrite/rewriteHandler.c:3937 #, c-format msgid "" "conditional DO INSTEAD rules are not supported for data-modifying statements " @@ -23288,13 +24898,13 @@ msgstr "" "уÑловные правила DO INSTEAD не поддерживаютÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð², изменÑющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3673 +#: rewrite/rewriteHandler.c:3941 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "" "правила DO ALSO не поддерживаютÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð², изменÑющих данные, в WITH" -#: rewrite/rewriteHandler.c:3678 +#: rewrite/rewriteHandler.c:3946 #, c-format msgid "" "multi-statement DO INSTEAD rules are not supported for data-modifying " @@ -23303,52 +24913,50 @@ msgstr "" "ÑоÑтавные правила DO INSTEAD не поддерживаютÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð², изменÑющих " "данные, в WITH" -#: rewrite/rewriteHandler.c:3918 rewrite/rewriteHandler.c:3926 -#: rewrite/rewriteHandler.c:3934 -#, c-format +#: rewrite/rewriteHandler.c:4206 msgid "" "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "" "ПредÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² Ñочетании Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°Ð¼Ð¸ DO INSTEAD Ñ ÑƒÑловиÑми не обновлÑÑŽÑ‚ÑÑ " "автоматичеÑки." -#: rewrite/rewriteHandler.c:4039 +#: rewrite/rewriteHandler.c:4303 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "выполнить INSERT RETURNING Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: rewrite/rewriteHandler.c:4041 +#: rewrite/rewriteHandler.c:4305 #, c-format msgid "" "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "" "Ðеобходимо безуÑловное правило ON INSERT DO INSTEAD Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼ RETURNING." -#: rewrite/rewriteHandler.c:4046 +#: rewrite/rewriteHandler.c:4310 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "выполнить UPDATE RETURNING Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: rewrite/rewriteHandler.c:4048 +#: rewrite/rewriteHandler.c:4312 #, c-format msgid "" "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "" "Ðеобходимо безуÑловное правило ON UPDATE DO INSTEAD Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼ RETURNING." -#: rewrite/rewriteHandler.c:4053 +#: rewrite/rewriteHandler.c:4317 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "выполнить DELETE RETURNING Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s\" нельзÑ" -#: rewrite/rewriteHandler.c:4055 +#: rewrite/rewriteHandler.c:4319 #, c-format msgid "" "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "" "Ðеобходимо безуÑловное правило ON DELETE DO INSTEAD Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼ RETURNING." -#: rewrite/rewriteHandler.c:4073 +#: rewrite/rewriteHandler.c:4337 #, c-format msgid "" "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or " @@ -23357,7 +24965,7 @@ msgstr "" "INSERT c предложением ON CONFLICT Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÐµÐ¹, Ð´Ð»Ñ " "которой заданы правила INSERT или UPDATE" -#: rewrite/rewriteHandler.c:4130 +#: rewrite/rewriteHandler.c:4394 #, c-format msgid "" "WITH cannot be used in a query that is rewritten by rules into multiple " @@ -23366,17 +24974,17 @@ msgstr "" "WITH Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в запроÑе, преобразованном правилами в неÑколько " "запроÑов" -#: rewrite/rewriteManip.c:1006 +#: rewrite/rewriteManip.c:1084 #, c-format msgid "conditional utility statements are not implemented" msgstr "уÑловные Ñлужебные операторы не реализованы" -#: rewrite/rewriteManip.c:1172 +#: rewrite/rewriteManip.c:1431 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "уÑловие WHERE CURRENT OF Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ñтавлений не реализовано" -#: rewrite/rewriteManip.c:1507 +#: rewrite/rewriteManip.c:1767 #, c-format msgid "" "NEW variables in ON UPDATE rules cannot reference columns that are part of a " @@ -23420,36 +25028,41 @@ msgstr "нераÑпознанный параметр Snowball: \"%s\"" msgid "missing Language parameter" msgstr "отÑутÑтвует параметр Language" -#: statistics/extended_stats.c:179 +#: statistics/extended_stats.c:176 #, c-format msgid "" "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "" "объект ÑтатиÑтики \"%s.%s\" не может быть вычиÑлен Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\"" -#: statistics/mcv.c:1372 +#: statistics/mcv.c:1368 #, c-format msgid "" "function returning record called in context that cannot accept type record" msgstr "" "функциÑ, Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, вызвана в контекÑте, не допуÑкающем Ñтот тип" -#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 +#: storage/buffer/bufmgr.c:649 storage/buffer/bufmgr.c:805 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "обращатьÑÑ Ðº временным таблицам других ÑеанÑов нельзÑ" -#: storage/buffer/bufmgr.c:851 +#: storage/buffer/bufmgr.c:1532 +#, c-format +msgid "invalid page in block %u of relation %s; zeroing out page" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтраница в блоке %u Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ %s; Ñтраница обнулÑетÑÑ" + +#: storage/buffer/bufmgr.c:2277 storage/buffer/localbuf.c:361 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "не удалоÑÑŒ увеличить отношение \"%s\" до блока %u" -#: storage/buffer/bufmgr.c:938 +#: storage/buffer/bufmgr.c:2348 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "неожиданные данные поÑле EOF в блоке %u Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ %s" -#: storage/buffer/bufmgr.c:940 +#: storage/buffer/bufmgr.c:2350 #, c-format msgid "" "This has been seen to occur with buggy kernels; consider updating your " @@ -23458,48 +25071,58 @@ msgstr "" "Эта ÑÐ¸Ñ‚ÑƒÐ°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ возникать из-за ошибок в Ñдре; возможно, вам Ñледует " "обновить ОС." -#: storage/buffer/bufmgr.c:1039 -#, c-format -msgid "invalid page in block %u of relation %s; zeroing out page" -msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтраница в блоке %u Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ %s; Ñтраница обнулÑетÑÑ" - -#: storage/buffer/bufmgr.c:4669 +#: storage/buffer/bufmgr.c:5654 #, c-format msgid "could not write block %u of %s" msgstr "не удалоÑÑŒ запиÑÑŒ блок %u файла %s" -#: storage/buffer/bufmgr.c:4671 +#: storage/buffer/bufmgr.c:5656 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "МножеÑтвенные Ñбои - возможно, поÑтоÑÐ½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° запиÑи." -#: storage/buffer/bufmgr.c:4692 storage/buffer/bufmgr.c:4711 +#: storage/buffer/bufmgr.c:5678 storage/buffer/bufmgr.c:5698 #, c-format msgid "writing block %u of relation %s" msgstr "запиÑÑŒ блока %u Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ %s" -#: storage/buffer/bufmgr.c:5015 -#, c-format -msgid "snapshot too old" -msgstr "Ñнимок Ñлишком Ñтар" - -#: storage/buffer/localbuf.c:205 +#: storage/buffer/localbuf.c:220 #, c-format msgid "no empty local buffer available" msgstr "нет пуÑтого локального буфера" -#: storage/buffer/localbuf.c:433 +#: storage/buffer/localbuf.c:597 #, c-format msgid "cannot access temporary tables during a parallel operation" msgstr "обращатьÑÑ Ðº временным таблицам во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" -#: storage/file/buffile.c:333 +#: storage/buffer/localbuf.c:712 +#, c-format +msgid "" +"\"temp_buffers\" cannot be changed after any temporary tables have been " +"accessed in the session." +msgstr "" +"параметр \"temp_buffers\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ поÑле Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº временным " +"таблицам в текущем ÑеанÑе." + +#: storage/file/buffile.c:338 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "" "не удалоÑÑŒ открыть временный файл \"%s\", входÑщий в BufFile \"%s\": %m" -#: storage/file/buffile.c:723 storage/file/buffile.c:844 +#: storage/file/buffile.c:632 +#, c-format +msgid "could not read from file set \"%s\": read only %zu of %zu bytes" +msgstr "" +"не удалоÑÑŒ прочитать файловый набор \"%s\" (прочитано байт: %zu из %zu)" + +#: storage/file/buffile.c:634 +#, c-format +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "не удалоÑÑŒ прочитать временный файл (прочитано байт: %zu из %zu)" + +#: storage/file/buffile.c:774 storage/file/buffile.c:877 #, c-format msgid "" "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" @@ -23507,120 +25130,115 @@ msgstr "" "не удалоÑÑŒ определить размер временного файла \"%s\", входÑщего в BufFile " "\"%s\": %m" -#: storage/file/buffile.c:923 +#: storage/file/buffile.c:956 #, c-format msgid "could not delete fileset \"%s\": %m" msgstr "ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° файлов \"%s\": %m" -#: storage/file/buffile.c:941 storage/smgr/md.c:325 storage/smgr/md.c:904 +#: storage/file/buffile.c:974 storage/smgr/md.c:336 storage/smgr/md.c:1194 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "не удалоÑÑŒ обрезать файл \"%s\": %m" -#: storage/file/fd.c:522 storage/file/fd.c:594 storage/file/fd.c:630 +#: storage/file/fd.c:583 storage/file/fd.c:655 storage/file/fd.c:691 #, c-format msgid "could not flush dirty data: %m" msgstr "не удалоÑÑŒ ÑброÑить грÑзные данные: %m" -#: storage/file/fd.c:552 +#: storage/file/fd.c:613 #, c-format msgid "could not determine dirty data size: %m" msgstr "не удалоÑÑŒ определить размер грÑзных данных: %m" -#: storage/file/fd.c:604 +#: storage/file/fd.c:665 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "ошибка в munmap() при ÑброÑе данных на диÑк: %m" -#: storage/file/fd.c:843 -#, c-format -msgid "could not link file \"%s\" to \"%s\": %m" -msgstr "Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\" не удалоÑÑŒ Ñоздать ÑÑылку \"%s\": %m" - -#: storage/file/fd.c:967 +#: storage/file/fd.c:983 #, c-format msgid "getrlimit failed: %m" msgstr "ошибка в getrlimit(): %m" -#: storage/file/fd.c:1057 +#: storage/file/fd.c:1073 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "недоÑтаточно деÑкрипторов файлов Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка Ñерверного процеÑÑа" -#: storage/file/fd.c:1058 +#: storage/file/fd.c:1074 #, c-format -msgid "System allows %d, we need at least %d." -msgstr "СиÑтема выделÑет: %d, а требуетÑÑ Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼: %d." +msgid "System allows %d, server needs at least %d." +msgstr "СиÑтема может выделить: %d, Ñерверу требуетÑÑ Ð¼Ð¸Ð½Ð¸Ð¼ÑƒÐ¼: %d." -#: storage/file/fd.c:1153 storage/file/fd.c:2496 storage/file/fd.c:2606 -#: storage/file/fd.c:2757 +#: storage/file/fd.c:1162 storage/file/fd.c:2618 storage/file/fd.c:2727 +#: storage/file/fd.c:2878 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "нехватка деÑкрипторов файлов: %m; оÑвободите их и повторите попытку" -#: storage/file/fd.c:1527 +#: storage/file/fd.c:1536 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "временный файл: путь \"%s\", размер %lu" -#: storage/file/fd.c:1658 +#: storage/file/fd.c:1675 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать временный каталог \"%s\": %m" -#: storage/file/fd.c:1665 +#: storage/file/fd.c:1682 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать временный подкаталог \"%s\": %m" -#: storage/file/fd.c:1862 +#: storage/file/fd.c:1879 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать временный файл \"%s\": %m" -#: storage/file/fd.c:1898 +#: storage/file/fd.c:1915 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "не удалоÑÑŒ открыть временный файл \"%s\": %m" -#: storage/file/fd.c:1939 +#: storage/file/fd.c:1956 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð³Ð¾ файла \"%s\": %m" -#: storage/file/fd.c:2027 +#: storage/file/fd.c:2044 #, c-format msgid "could not delete file \"%s\": %m" msgstr "ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": %m" -#: storage/file/fd.c:2207 +#: storage/file/fd.c:2234 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "размер временного файла превышает предел temp_file_limit (%d КБ)" -#: storage/file/fd.c:2472 storage/file/fd.c:2531 +#: storage/file/fd.c:2594 storage/file/fd.c:2653 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "превышен предел maxAllocatedDescs (%d) при попытке открыть файл \"%s\"" -#: storage/file/fd.c:2576 +#: storage/file/fd.c:2698 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "" "превышен предел maxAllocatedDescs (%d) при попытке выполнить команду \"%s\"" -#: storage/file/fd.c:2733 +#: storage/file/fd.c:2854 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "" "превышен предел maxAllocatedDescs (%d) при попытке открыть каталог \"%s\"" -#: storage/file/fd.c:3269 +#: storage/file/fd.c:3384 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "в каталоге временных файлов обнаружен неумеÑтный файл: \"%s\"" -#: storage/file/fd.c:3387 +#: storage/file/fd.c:3502 #, c-format msgid "" "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" @@ -23628,12 +25246,7 @@ msgstr "" "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° данных (syncfs), прошло времени: %ld.%02d Ñ, текущий " "путь: %s" -#: storage/file/fd.c:3401 -#, c-format -msgid "could not synchronize file system for file \"%s\": %m" -msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" - -#: storage/file/fd.c:3619 +#: storage/file/fd.c:3729 #, c-format msgid "" "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: " @@ -23642,7 +25255,7 @@ msgstr "" "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° данных (подготовка к fsync), прошло времени: %ld.%02d " "Ñ, текущий путь: %s" -#: storage/file/fd.c:3651 +#: storage/file/fd.c:3761 #, c-format msgid "" "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" @@ -23650,6 +25263,37 @@ msgstr "" "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° данных (fsync), прошло времени: %ld.%02d Ñ, текущий " "путь: %s" +#: storage/file/fd.c:3950 +#, c-format +msgid "\"debug_io_direct\" is not supported on this platform." +msgstr "Параметр \"debug_io_direct\" не поддерживаетÑÑ Ð² Ñтой ОС." + +#: storage/file/fd.c:3964 +#, c-format +msgid "Invalid list syntax in parameter \"%s\"" +msgstr "Ðеверный формат ÑпиÑка в параметре \"%s\"." + +#: storage/file/fd.c:3984 +#, c-format +msgid "Invalid option \"%s\"" +msgstr "Ðеверный параметр \"%s\"." + +#: storage/file/fd.c:3997 +#, c-format +msgid "" +"\"debug_io_direct\" is not supported for WAL because XLOG_BLCKSZ is too small" +msgstr "" +"режим \"debug_io_direct\" не поддерживаетÑÑ Ð´Ð»Ñ WAL из-за Ñлишком маленького " +"размера XLOG_BLCKSZ" + +#: storage/file/fd.c:4004 +#, c-format +msgid "" +"\"debug_io_direct\" is not supported for data because BLCKSZ is too small" +msgstr "" +"режим \"debug_io_direct\" не поддерживаетÑÑ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… из-за Ñлишком " +"маленького размера BLCKSZ" + #: storage/file/reinit.c:145 #, c-format msgid "" @@ -23668,140 +25312,178 @@ msgstr "" "ÑÐ±Ñ€Ð¾Ñ Ð½ÐµÐ¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€ÑƒÐµÐ¼Ñ‹Ñ… отношений (очиÑтка), прошло времени: %ld.%02d s, " "текущий путь: %s" -#: storage/file/sharedfileset.c:79 +#: storage/file/sharedfileset.c:73 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "не удалоÑÑŒ подключитьÑÑ Ðº уже уничтоженному набору SharedFileSet" -#: storage/ipc/dsm.c:353 +#: storage/ipc/dsm.c:379 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "Ñегмент ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ‡ÐµÑкой разделÑемой памÑтью иÑпорчен" -#: storage/ipc/dsm.c:418 +#: storage/ipc/dsm.c:444 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "Ñегмент ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ‡ÐµÑкой разделÑемой памÑтью не в порÑдке" -#: storage/ipc/dsm.c:600 +#: storage/ipc/dsm.c:626 #, c-format msgid "too many dynamic shared memory segments" msgstr "Ñлишком много Ñегментов динамичеÑкой разделÑемой памÑти" -#: storage/ipc/dsm_impl.c:235 storage/ipc/dsm_impl.c:544 -#: storage/ipc/dsm_impl.c:648 storage/ipc/dsm_impl.c:819 +#: storage/ipc/dsm_impl.c:231 storage/ipc/dsm_impl.c:537 +#: storage/ipc/dsm_impl.c:641 storage/ipc/dsm_impl.c:812 #, c-format msgid "could not unmap shared memory segment \"%s\": %m" msgstr "не удалоÑÑŒ оÑвободить Ñегмент разделÑемой памÑти %s: %m" -#: storage/ipc/dsm_impl.c:245 storage/ipc/dsm_impl.c:554 -#: storage/ipc/dsm_impl.c:658 storage/ipc/dsm_impl.c:829 +#: storage/ipc/dsm_impl.c:241 storage/ipc/dsm_impl.c:547 +#: storage/ipc/dsm_impl.c:651 storage/ipc/dsm_impl.c:822 #, c-format msgid "could not remove shared memory segment \"%s\": %m" msgstr "ошибка при удалении Ñегмента разделÑемой памÑти \"%s\": %m" -#: storage/ipc/dsm_impl.c:269 storage/ipc/dsm_impl.c:729 -#: storage/ipc/dsm_impl.c:843 +#: storage/ipc/dsm_impl.c:265 storage/ipc/dsm_impl.c:722 +#: storage/ipc/dsm_impl.c:836 #, c-format msgid "could not open shared memory segment \"%s\": %m" msgstr "не удалоÑÑŒ открыть Ñегмент разделÑемой памÑти \"%s\": %m" -#: storage/ipc/dsm_impl.c:294 storage/ipc/dsm_impl.c:570 -#: storage/ipc/dsm_impl.c:774 storage/ipc/dsm_impl.c:867 +#: storage/ipc/dsm_impl.c:290 storage/ipc/dsm_impl.c:563 +#: storage/ipc/dsm_impl.c:767 storage/ipc/dsm_impl.c:860 #, c-format msgid "could not stat shared memory segment \"%s\": %m" msgstr "не удалоÑÑŒ обратитьÑÑ Ðº Ñегменту разделÑемой памÑти \"%s\": %m" -#: storage/ipc/dsm_impl.c:313 storage/ipc/dsm_impl.c:918 +#: storage/ipc/dsm_impl.c:309 storage/ipc/dsm_impl.c:911 #, c-format msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" msgstr "" "не удалоÑÑŒ изменить размер Ñегмента разделÑемой памÑти \"%s\" до %zu байт: %m" -#: storage/ipc/dsm_impl.c:335 storage/ipc/dsm_impl.c:591 -#: storage/ipc/dsm_impl.c:750 storage/ipc/dsm_impl.c:940 +#: storage/ipc/dsm_impl.c:331 storage/ipc/dsm_impl.c:584 +#: storage/ipc/dsm_impl.c:743 storage/ipc/dsm_impl.c:933 #, c-format msgid "could not map shared memory segment \"%s\": %m" msgstr "не удалоÑÑŒ отобразить Ñегмент разделÑемой памÑти \"%s\": %m" -#: storage/ipc/dsm_impl.c:526 +#: storage/ipc/dsm_impl.c:519 #, c-format msgid "could not get shared memory segment: %m" msgstr "не удалоÑÑŒ получить Ñегмент разделÑемой памÑти: %m" -#: storage/ipc/dsm_impl.c:714 +#: storage/ipc/dsm_impl.c:707 #, c-format msgid "could not create shared memory segment \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать Ñегмент разделÑемой памÑти \"%s\": %m" -#: storage/ipc/dsm_impl.c:951 +#: storage/ipc/dsm_impl.c:944 #, c-format msgid "could not close shared memory segment \"%s\": %m" msgstr "не удалоÑÑŒ закрыть Ñегмент разделÑемой памÑти \"%s\": %m" -#: storage/ipc/dsm_impl.c:991 storage/ipc/dsm_impl.c:1040 +#: storage/ipc/dsm_impl.c:984 storage/ipc/dsm_impl.c:1033 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "не удалоÑÑŒ продублировать указатель Ð´Ð»Ñ \"%s\": %m" -#: storage/ipc/procarray.c:3823 +#: storage/ipc/dsm_registry.c:142 +#, c-format +msgid "DSM segment name cannot be empty" +msgstr "Ð¸Ð¼Ñ DSM-Ñегмента не может быть пуÑтым" + +#: storage/ipc/dsm_registry.c:146 +#, c-format +msgid "DSM segment name too long" +msgstr "Ð¸Ð¼Ñ DSM-Ñегмента Ñлишком длинное" + +#: storage/ipc/dsm_registry.c:150 +#, c-format +msgid "DSM segment size must be nonzero" +msgstr "размер DSM-Ñегмента должен быть ненулевым" + +#: storage/ipc/dsm_registry.c:176 +#, c-format +msgid "requested DSM segment size does not match size of existing segment" +msgstr "" +"запрошенный размер Ñегмента DSM не Ñовпадает Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð¾Ð¼ ÑущеÑтвующего " +"Ñегмента" + +#: storage/ipc/procarray.c:488 storage/lmgr/proc.c:357 +#: tcop/backend_startup.c:304 +#, c-format +msgid "sorry, too many clients already" +msgstr "извините, уже Ñлишком много клиентов" + +#: storage/ipc/procarray.c:3857 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "база \"%s\" иÑпользуетÑÑ Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ñ‹Ð¼Ð¸ транзакциÑми" -#: storage/ipc/procarray.c:3855 storage/ipc/signalfuncs.c:226 +#: storage/ipc/procarray.c:3893 storage/ipc/procarray.c:3901 +#: storage/ipc/signalfuncs.c:235 storage/ipc/signalfuncs.c:242 +#, c-format +msgid "permission denied to terminate process" +msgstr "нет прав Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа" + +#: storage/ipc/procarray.c:3894 storage/ipc/signalfuncs.c:236 #, c-format -msgid "must be a superuser to terminate superuser process" -msgstr "прерывать процеÑÑ ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ только Ñуперпользователь" +msgid "" +"Only roles with the %s attribute may terminate processes of roles with the " +"%s attribute." +msgstr "" +"Только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s могут завершать процеÑÑÑ‹, принадлежащие ролÑм Ñ " +"атрибутом %s." -#: storage/ipc/procarray.c:3862 storage/ipc/signalfuncs.c:231 +#: storage/ipc/procarray.c:3902 storage/ipc/signalfuncs.c:243 #, c-format msgid "" -"must be a member of the role whose process is being terminated or member of " -"pg_signal_backend" +"Only roles with privileges of the role whose process is being terminated or " +"with privileges of the \"%s\" role may terminate this process." msgstr "" -"необходимо быть членом роли, процеÑÑ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ прерываетÑÑ, или роли " -"pg_signal_backend" +"Только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли, которой принадлежит процеÑÑ, или Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли " +"\"%s\" могут завершить Ñтот процеÑÑ." -#: storage/ipc/procsignal.c:419 +#: storage/ipc/procsignal.c:416 #, c-format -msgid "still waiting for backend with PID %lu to accept ProcSignalBarrier" +msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" msgstr "" "продолжаетÑÑ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ðµ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñигнала ProcSignalBarrier обÑлуживающим " -"процеÑÑом Ñ PID %lu" +"процеÑÑом Ñ PID %d" -#: storage/ipc/shm_mq.c:384 +#: storage/ipc/shm_mq.c:383 #, c-format msgid "cannot send a message of size %zu via shared memory queue" msgstr "" "не удалоÑÑŒ передать Ñообщение размером %zu через очередь в разделÑемой памÑти" -#: storage/ipc/shm_mq.c:719 +#: storage/ipc/shm_mq.c:718 #, c-format msgid "invalid message size %zu in shared memory queue" msgstr "неверный размер ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ %zu в очереди в разделÑемой памÑти" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 -#: storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4259 -#: storage/lmgr/lock.c:4324 storage/lmgr/lock.c:4674 -#: storage/lmgr/predicate.c:2472 storage/lmgr/predicate.c:2487 -#: storage/lmgr/predicate.c:3969 storage/lmgr/predicate.c:5081 -#: utils/hash/dynahash.c:1112 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:984 +#: storage/lmgr/lock.c:1022 storage/lmgr/lock.c:2835 storage/lmgr/lock.c:4220 +#: storage/lmgr/lock.c:4285 storage/lmgr/lock.c:4635 +#: storage/lmgr/predicate.c:2468 storage/lmgr/predicate.c:2483 +#: storage/lmgr/predicate.c:3880 storage/lmgr/predicate.c:4927 +#: utils/hash/dynahash.c:1096 #, c-format msgid "out of shared memory" msgstr "нехватка разделÑемой памÑти" -#: storage/ipc/shmem.c:170 storage/ipc/shmem.c:266 +#: storage/ipc/shmem.c:161 storage/ipc/shmem.c:257 #, c-format msgid "out of shared memory (%zu bytes requested)" msgstr "нехватка разделÑемой памÑти (требовалоÑÑŒ байт: %zu)" -#: storage/ipc/shmem.c:445 +#: storage/ipc/shmem.c:436 #, c-format msgid "could not create ShmemIndex entry for data structure \"%s\"" msgstr "не удалоÑÑŒ Ñоздать запиÑÑŒ ShmemIndex Ð´Ð»Ñ Ñтруктуры данных \"%s\"" -#: storage/ipc/shmem.c:460 +#: storage/ipc/shmem.c:451 #, c-format msgid "" "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, " @@ -23810,7 +25492,7 @@ msgstr "" "размер запиÑи ShmemIndex не ÑоответÑтвует Ñтруктуре данных " "\"%s\" (ожидалоÑÑŒ: %zu, фактичеÑки: %zu)" -#: storage/ipc/shmem.c:479 +#: storage/ipc/shmem.c:470 #, c-format msgid "" "not enough shared memory for data structure \"%s\" (%zu bytes requested)" @@ -23818,7 +25500,7 @@ msgstr "" "недоÑтаточно разделÑемой памÑти Ð´Ð»Ñ Ñтруктуры данных \"%s\" (требовалоÑÑŒ " "байт: %zu)" -#: storage/ipc/shmem.c:511 storage/ipc/shmem.c:530 +#: storage/ipc/shmem.c:502 storage/ipc/shmem.c:521 #, c-format msgid "requested shared memory size overflows size_t" msgstr "запрошенный размер разделÑемой памÑти не умещаетÑÑ Ð² size_t" @@ -23828,33 +25510,41 @@ msgstr "запрошенный размер разделÑемой памÑти msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %d не отноÑитÑÑ Ðº обÑлуживающему процеÑÑу PostgreSQL" -#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1434 -#: utils/adt/mcxtfuncs.c:190 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1453 +#: utils/adt/mcxtfuncs.c:182 #, c-format msgid "could not send signal to process %d: %m" msgstr "отправить Ñигнал процеÑÑу %d не удалоÑÑŒ: %m" -#: storage/ipc/signalfuncs.c:124 +#: storage/ipc/signalfuncs.c:129 storage/ipc/signalfuncs.c:136 #, c-format -msgid "must be a superuser to cancel superuser query" -msgstr "Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹ запроÑа ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½ÑƒÐ¶Ð½Ð¾ быть Ñуперпользователем" +msgid "permission denied to cancel query" +msgstr "нет прав Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹ запроÑа" -#: storage/ipc/signalfuncs.c:129 +#: storage/ipc/signalfuncs.c:130 #, c-format msgid "" -"must be a member of the role whose query is being canceled or member of " -"pg_signal_backend" +"Only roles with the %s attribute may cancel queries of roles with the %s " +"attribute." msgstr "" -"необходимо быть членом роли, Ð·Ð°Ð¿Ñ€Ð¾Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ отменÑетÑÑ, или роли " -"pg_signal_backend" +"Только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s могут отменÑть запроÑÑ‹ ролей Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s." -#: storage/ipc/signalfuncs.c:170 +#: storage/ipc/signalfuncs.c:137 #, c-format -msgid "could not check the existence of the backend with PID %d: %m" +msgid "" +"Only roles with privileges of the role whose query is being canceled or with " +"privileges of the \"%s\" role may cancel this query." +msgstr "" +"Только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñет запроÑ, или Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли " +"\"%s\" могут отменить Ñтот запроÑ." + +#: storage/ipc/signalfuncs.c:179 +#, c-format +msgid "could not check the existence of the backend with PID %d: %m" msgstr "" "не удалоÑÑŒ проверить ÑущеÑтвование обÑлуживающего процеÑÑа Ñ PID %d: %m" -#: storage/ipc/signalfuncs.c:188 +#: storage/ipc/signalfuncs.c:197 #, c-format msgid "backend with PID %d did not terminate within %lld millisecond" msgid_plural "backend with PID %d did not terminate within %lld milliseconds" @@ -23862,224 +25552,227 @@ msgstr[0] "обÑлуживающий процеÑÑ Ñ PID %d не заверш msgstr[1] "обÑлуживающий процеÑÑ Ñ PID %d не завершилÑÑ Ð·Ð° %lld мÑ" msgstr[2] "обÑлуживающий процеÑÑ Ñ PID %d не завершилÑÑ Ð·Ð° %lld мÑ" -#: storage/ipc/signalfuncs.c:219 +#: storage/ipc/signalfuncs.c:228 #, c-format msgid "\"timeout\" must not be negative" msgstr "\"timeout\" не может быть отрицательным" -#: storage/ipc/signalfuncs.c:271 -#, c-format -msgid "must be superuser to rotate log files with adminpack 1.0" -msgstr "" -"прокручивать файлы протоколов, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ adminpack 1.0, может только " -"Ñуперпользователь" - -#. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:273 utils/adt/genfile.c:250 -#, c-format -msgid "Consider using %s, which is part of core, instead." -msgstr "РаÑÑмотрите возможноÑть иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ %s, включённой в Ñдро." - -#: storage/ipc/signalfuncs.c:279 storage/ipc/signalfuncs.c:299 +#: storage/ipc/signalfuncs.c:285 #, c-format msgid "rotation not possible because log collection not active" msgstr "прокрутка невозможна, так как протоколирование отключено" -#: storage/ipc/standby.c:307 +#: storage/ipc/standby.c:329 #, c-format msgid "recovery still waiting after %ld.%03d ms: %s" msgstr "процеÑÑ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ‚ ожидание поÑле %ld.%03d мÑ: %s" -#: storage/ipc/standby.c:316 +#: storage/ipc/standby.c:338 #, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "процеÑÑ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð» ожидание поÑле %ld.%03d мÑ: %s" -#: storage/ipc/standby.c:883 tcop/postgres.c:3344 +#: storage/ipc/standby.c:920 tcop/postgres.c:3196 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "" "выполнение оператора отменено из-за конфликта Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑом воÑÑтановлениÑ" -#: storage/ipc/standby.c:884 tcop/postgres.c:2499 +#: storage/ipc/standby.c:921 tcop/postgres.c:2557 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "" "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ»Ð° к взаимоблокировке Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑом " "воÑÑтановлениÑ." -#: storage/ipc/standby.c:1423 +#: storage/ipc/standby.c:1486 msgid "unknown reason" msgstr "причина неизвеÑтна" -#: storage/ipc/standby.c:1428 +#: storage/ipc/standby.c:1491 msgid "recovery conflict on buffer pin" msgstr "конфликт воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ закреплении буфера" -#: storage/ipc/standby.c:1431 +#: storage/ipc/standby.c:1494 msgid "recovery conflict on lock" msgstr "конфликт воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ получении блокировки" -#: storage/ipc/standby.c:1434 +#: storage/ipc/standby.c:1497 msgid "recovery conflict on tablespace" msgstr "конфликт воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ обращении к табличному проÑтранÑтву" -#: storage/ipc/standby.c:1437 +#: storage/ipc/standby.c:1500 msgid "recovery conflict on snapshot" msgstr "конфликт воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ получении Ñнимка" -#: storage/ipc/standby.c:1440 +#: storage/ipc/standby.c:1503 +msgid "recovery conflict on replication slot" +msgstr "конфликт воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñо Ñлотом репликации" + +#: storage/ipc/standby.c:1506 msgid "recovery conflict on buffer deadlock" msgstr "конфликт воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð·-за взаимной блокировки буфера" -#: storage/ipc/standby.c:1443 +#: storage/ipc/standby.c:1509 msgid "recovery conflict on database" msgstr "конфликт воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ обращении к базе данных" -#: storage/large_object/inv_api.c:191 +#: storage/large_object/inv_api.c:190 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "" "в запиÑи pg_largeobject Ð´Ð»Ñ OID %u, Ñтр. %d неверный размер Ð¿Ð¾Ð»Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… (%d)" -#: storage/large_object/inv_api.c:274 +#: storage/large_object/inv_api.c:272 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "неверные флаги Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð³Ð¾ объекта: %d" -#: storage/large_object/inv_api.c:457 +#: storage/large_object/inv_api.c:297 storage/large_object/inv_api.c:309 +#: storage/large_object/inv_api.c:506 storage/large_object/inv_api.c:617 +#: storage/large_object/inv_api.c:807 +#, c-format +msgid "permission denied for large object %u" +msgstr "нет доÑтупа к большому объекту %u" + +#: storage/large_object/inv_api.c:455 #, c-format msgid "invalid whence setting: %d" msgstr "неверное значение ориентира: %d" -#: storage/large_object/inv_api.c:629 +#: storage/large_object/inv_api.c:627 #, c-format msgid "invalid large object write request size: %d" msgstr "неверный размер запиÑи большого объекта: %d" -#: storage/lmgr/deadlock.c:1122 +#: storage/lmgr/deadlock.c:1104 #, c-format msgid "Process %d waits for %s on %s; blocked by process %d." msgstr "" "ПроцеÑÑ %d ожидает в режиме %s блокировку \"%s\"; заблокирован процеÑÑом %d." -#: storage/lmgr/deadlock.c:1141 +#: storage/lmgr/deadlock.c:1123 #, c-format msgid "Process %d: %s" msgstr "ПроцеÑÑ %d: %s" -#: storage/lmgr/deadlock.c:1150 +#: storage/lmgr/deadlock.c:1132 #, c-format msgid "deadlock detected" msgstr "обнаружена взаимоблокировка" -#: storage/lmgr/deadlock.c:1153 +#: storage/lmgr/deadlock.c:1135 #, c-format msgid "See server log for query details." msgstr "ПодробноÑти запроÑа Ñмотрите в протоколе Ñервера." -#: storage/lmgr/lmgr.c:859 +#: storage/lmgr/lmgr.c:848 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "при изменении кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:862 +#: storage/lmgr/lmgr.c:851 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "при удалении кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:865 +#: storage/lmgr/lmgr.c:854 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "при блокировке кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:868 +#: storage/lmgr/lmgr.c:857 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "при блокировке изменённой верÑии (%u,%u) кортежа в отношении \"%s\"" -#: storage/lmgr/lmgr.c:871 +#: storage/lmgr/lmgr.c:860 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "при добавлении кортежа индекÑа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:874 +#: storage/lmgr/lmgr.c:863 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "при проверке уникальноÑти кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:877 +#: storage/lmgr/lmgr.c:866 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "при перепроверке изменённого кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:880 +#: storage/lmgr/lmgr.c:869 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "" "при проверке ограничениÑ-иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ‚ÐµÐ¶Ð° (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:1135 +#: storage/lmgr/lmgr.c:1239 #, c-format msgid "relation %u of database %u" msgstr "отношение %u базы данных %u" -#: storage/lmgr/lmgr.c:1141 +#: storage/lmgr/lmgr.c:1245 #, c-format msgid "extension of relation %u of database %u" msgstr "раÑширение Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ %u базы данных %u" -#: storage/lmgr/lmgr.c:1147 +#: storage/lmgr/lmgr.c:1251 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid базы %u" -#: storage/lmgr/lmgr.c:1152 +#: storage/lmgr/lmgr.c:1256 #, c-format msgid "page %u of relation %u of database %u" msgstr "Ñтраница %u Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ %u базы данных %u" -#: storage/lmgr/lmgr.c:1159 +#: storage/lmgr/lmgr.c:1263 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "кортеж (%u,%u) Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ %u базы данных %u" -#: storage/lmgr/lmgr.c:1167 +#: storage/lmgr/lmgr.c:1271 #, c-format msgid "transaction %u" msgstr "Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ %u" -#: storage/lmgr/lmgr.c:1172 +#: storage/lmgr/lmgr.c:1276 #, c-format msgid "virtual transaction %d/%u" msgstr "Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ %d/%u" -#: storage/lmgr/lmgr.c:1178 +#: storage/lmgr/lmgr.c:1282 #, c-format msgid "speculative token %u of transaction %u" msgstr "ÑпекулÑтивный маркер %u транзакции %u" -#: storage/lmgr/lmgr.c:1184 +#: storage/lmgr/lmgr.c:1288 #, c-format msgid "object %u of class %u of database %u" msgstr "объект %u клаÑÑа %u базы данных %u" -#: storage/lmgr/lmgr.c:1192 +#: storage/lmgr/lmgr.c:1296 #, c-format msgid "user lock [%u,%u,%u]" msgstr "пользовательÑÐºÐ°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ° [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1199 +#: storage/lmgr/lmgr.c:1303 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "Ñ€ÐµÐºÐ¾Ð¼ÐµÐ½Ð´Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ° [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1207 +#: storage/lmgr/lmgr.c:1311 +#, c-format +msgid "remote transaction %u of subscription %u of database %u" +msgstr "ÑƒÐ´Ð°Ð»Ñ‘Ð½Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ %u подпиÑки %u в базе данных %u" + +#: storage/lmgr/lmgr.c:1318 #, c-format msgid "unrecognized locktag type %d" msgstr "нераÑпознанный тип блокировки %d" -#: storage/lmgr/lock.c:803 +#: storage/lmgr/lock.c:812 #, c-format msgid "" "cannot acquire lock mode %s on database objects while recovery is in progress" @@ -24087,7 +25780,7 @@ msgstr "" "пока выполнÑетÑÑ Ð²Ð¾ÑÑтановление, Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ блокировку объектов базы " "данных в режиме %s" -#: storage/lmgr/lock.c:805 +#: storage/lmgr/lock.c:814 #, c-format msgid "" "Only RowExclusiveLock or less can be acquired on database objects during " @@ -24096,13 +25789,7 @@ msgstr "" "Ð’ процеÑÑе воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð² базы данных может быть получена " "только блокировка RowExclusiveLock или менее ÑильнаÑ." -#: storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 storage/lmgr/lock.c:2846 -#: storage/lmgr/lock.c:4260 storage/lmgr/lock.c:4325 storage/lmgr/lock.c:4675 -#, c-format -msgid "You might need to increase max_locks_per_transaction." -msgstr "Возможно, Ñледует увеличить параметр max_locks_per_transaction." - -#: storage/lmgr/lock.c:3301 storage/lmgr/lock.c:3369 storage/lmgr/lock.c:3485 +#: storage/lmgr/lock.c:3284 storage/lmgr/lock.c:3352 storage/lmgr/lock.c:3468 #, c-format msgid "" "cannot PREPARE while holding both session-level and transaction-level locks " @@ -24111,21 +25798,21 @@ msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ PREPARE, ÑƒÐ´ÐµÑ€Ð¶Ð¸Ð²Ð°Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ на уровне ÑеанÑа и на уровне " "транзакции Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ объекта" -#: storage/lmgr/predicate.c:700 +#: storage/lmgr/predicate.c:653 #, c-format msgid "not enough elements in RWConflictPool to record a read/write conflict" msgstr "в пуле недоÑтаточно Ñлементов Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи о конфликте чтениÑ/запиÑи" -#: storage/lmgr/predicate.c:701 storage/lmgr/predicate.c:729 +#: storage/lmgr/predicate.c:654 storage/lmgr/predicate.c:679 #, c-format msgid "" "You might need to run fewer transactions at a time or increase " -"max_connections." +"\"max_connections\"." msgstr "" -"Попробуйте уменьшить чиÑло транзакций в Ñекунду или увеличить параметр " -"max_connections." +"Попробуйте уменьшить чиÑло одновременных транзакций или увеличить параметр " +"\"max_connections\"." -#: storage/lmgr/predicate.c:728 +#: storage/lmgr/predicate.c:678 #, c-format msgid "" "not enough elements in RWConflictPool to record a potential read/write " @@ -24134,13 +25821,13 @@ msgstr "" "в пуле недоÑтаточно Ñлементов Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи о потенциальном конфликте чтениÑ/" "запиÑи" -#: storage/lmgr/predicate.c:1695 +#: storage/lmgr/predicate.c:1686 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "" "Параметр \"default_transaction_isolation\" имеет значение \"serializable\"." -#: storage/lmgr/predicate.c:1696 +#: storage/lmgr/predicate.c:1687 #, c-format msgid "" "You can use \"SET default_transaction_isolation = 'repeatable read'\" to " @@ -24149,34 +25836,27 @@ msgstr "" "Чтобы изменить режим по умолчанию, выполните \"SET " "default_transaction_isolation = 'repeatable read'\"." -#: storage/lmgr/predicate.c:1747 +#: storage/lmgr/predicate.c:1738 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "транзакциÑ, Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€ÑƒÑŽÑ‰Ð°Ñ Ñнимок, не должна быть READ ONLY DEFERRABLE" -#: storage/lmgr/predicate.c:1826 utils/time/snapmgr.c:569 -#: utils/time/snapmgr.c:575 +#: storage/lmgr/predicate.c:1817 utils/time/snapmgr.c:535 +#: utils/time/snapmgr.c:541 #, c-format msgid "could not import the requested snapshot" msgstr "не удалоÑÑŒ импортировать запрошенный Ñнимок" -#: storage/lmgr/predicate.c:1827 utils/time/snapmgr.c:576 +#: storage/lmgr/predicate.c:1818 utils/time/snapmgr.c:542 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "ИÑходный процеÑÑ Ñ PID %d уже не работает." -#: storage/lmgr/predicate.c:2473 storage/lmgr/predicate.c:2488 -#: storage/lmgr/predicate.c:3970 -#, c-format -msgid "You might need to increase max_pred_locks_per_transaction." -msgstr "" -"Возможно, Ñледует увеличить значение параметра max_locks_per_transaction." - -#: storage/lmgr/predicate.c:4101 storage/lmgr/predicate.c:4137 -#: storage/lmgr/predicate.c:4170 storage/lmgr/predicate.c:4178 -#: storage/lmgr/predicate.c:4217 storage/lmgr/predicate.c:4459 -#: storage/lmgr/predicate.c:4796 storage/lmgr/predicate.c:4808 -#: storage/lmgr/predicate.c:4851 storage/lmgr/predicate.c:4889 +#: storage/lmgr/predicate.c:3991 storage/lmgr/predicate.c:4027 +#: storage/lmgr/predicate.c:4060 storage/lmgr/predicate.c:4068 +#: storage/lmgr/predicate.c:4107 storage/lmgr/predicate.c:4337 +#: storage/lmgr/predicate.c:4656 storage/lmgr/predicate.c:4668 +#: storage/lmgr/predicate.c:4715 storage/lmgr/predicate.c:4751 #, c-format msgid "" "could not serialize access due to read/write dependencies among transactions" @@ -24184,25 +25864,25 @@ msgstr "" "не удалоÑÑŒ Ñериализовать доÑтуп из-за завиÑимоÑтей чтениÑ/запиÑи между " "транзакциÑми" -#: storage/lmgr/predicate.c:4103 storage/lmgr/predicate.c:4139 -#: storage/lmgr/predicate.c:4172 storage/lmgr/predicate.c:4180 -#: storage/lmgr/predicate.c:4219 storage/lmgr/predicate.c:4461 -#: storage/lmgr/predicate.c:4798 storage/lmgr/predicate.c:4810 -#: storage/lmgr/predicate.c:4853 storage/lmgr/predicate.c:4891 +#: storage/lmgr/predicate.c:3993 storage/lmgr/predicate.c:4029 +#: storage/lmgr/predicate.c:4062 storage/lmgr/predicate.c:4070 +#: storage/lmgr/predicate.c:4109 storage/lmgr/predicate.c:4339 +#: storage/lmgr/predicate.c:4658 storage/lmgr/predicate.c:4670 +#: storage/lmgr/predicate.c:4717 storage/lmgr/predicate.c:4753 #, c-format msgid "The transaction might succeed if retried." msgstr "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ завершитьÑÑ ÑƒÑпешно при Ñледующей попытке." -#: storage/lmgr/proc.c:355 +#: storage/lmgr/proc.c:353 #, c-format msgid "" -"number of requested standby connections exceeds max_wal_senders (currently " -"%d)" +"number of requested standby connections exceeds " +"\"max_wal_senders\" (currently %d)" msgstr "" -"чиÑло запрошенных подключений резервных Ñерверов превоÑходит max_wal_senders " -"(ÑейчаÑ: %d)" +"чиÑло запрошенных подключений резервных Ñерверов превышает " +"\"max_wal_senders\" (ÑейчаÑ: %d)" -#: storage/lmgr/proc.c:1531 +#: storage/lmgr/proc.c:1546 #, c-format msgid "" "process %d avoided deadlock for %s on %s by rearranging queue order after " @@ -24211,7 +25891,7 @@ msgstr "" "процеÑÑ %d избежал взаимоблокировки, Ð¾Ð¶Ð¸Ð´Ð°Ñ Ð² режиме %s блокировку \"%s\", " "изменив порÑдок очереди через %ld.%03d мÑ" -#: storage/lmgr/proc.c:1546 +#: storage/lmgr/proc.c:1561 #, c-format msgid "" "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" @@ -24219,19 +25899,19 @@ msgstr "" "процеÑÑ %d обнаружил взаимоблокировку, Ð¾Ð¶Ð¸Ð´Ð°Ñ Ð² режиме %s блокировку \"%s\" " "в течение %ld.%03d мÑ" -#: storage/lmgr/proc.c:1555 +#: storage/lmgr/proc.c:1570 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "" "процеÑÑ %d продолжает ожидать в режиме %s блокировку \"%s\" в течение %ld." "%03d мÑ" -#: storage/lmgr/proc.c:1562 +#: storage/lmgr/proc.c:1577 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "процеÑÑ %d получил в режиме %s блокировку \"%s\" через %ld.%03d мÑ" -#: storage/lmgr/proc.c:1579 +#: storage/lmgr/proc.c:1594 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "" @@ -24267,54 +25947,55 @@ msgstr "иÑпорченный размер Ñлемента (общий раз msgid "corrupted line pointer: offset = %u, size = %u" msgstr "иÑпорченный линейный указатель: Ñмещение = %u, размер = %u" -#: storage/smgr/md.c:470 +#: storage/smgr/md.c:485 storage/smgr/md.c:547 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "не удалоÑÑŒ увеличить файл \"%s\" до блока %u" -#: storage/smgr/md.c:485 +#: storage/smgr/md.c:500 storage/smgr/md.c:611 #, c-format msgid "could not extend file \"%s\": %m" msgstr "не удалоÑÑŒ увеличить файл \"%s\": %m" -#: storage/smgr/md.c:491 +#: storage/smgr/md.c:506 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "не удалоÑÑŒ увеличить файл \"%s\" (запиÑано байт: %d из %d) в блоке %u" -#: storage/smgr/md.c:706 +#: storage/smgr/md.c:589 #, c-format -msgid "could not read block %u in file \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать блок %u в файле \"%s\": %m" +msgid "could not extend file \"%s\" with FileFallocate(): %m" +msgstr "не удалоÑÑŒ увеличить файл \"%s\" поÑредÑтвом FileFallocate(): %m" -#: storage/smgr/md.c:722 +#: storage/smgr/md.c:869 #, c-format -msgid "could not read block %u in file \"%s\": read only %d of %d bytes" -msgstr "не удалоÑÑŒ прочитать блок %u в файле \"%s\" (прочитано байт: %d из %d)" +msgid "could not read blocks %u..%u in file \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать блоки %u..%u в файле \"%s\": %m" -#: storage/smgr/md.c:776 +#: storage/smgr/md.c:895 #, c-format -msgid "could not write block %u in file \"%s\": %m" -msgstr "не удалоÑÑŒ запиÑать блок %u в файл \"%s\": %m" +msgid "could not read blocks %u..%u in file \"%s\": read only %zu of %zu bytes" +msgstr "" +"не удалоÑÑŒ прочитать блоки %u..%u в файле \"%s\" (прочитано байт: %zu из %zu)" -#: storage/smgr/md.c:781 +#: storage/smgr/md.c:995 #, c-format -msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" -msgstr "не удалоÑÑŒ запиÑать блок %u в файл \"%s\" (запиÑано байт: %d из %d)" +msgid "could not write blocks %u..%u in file \"%s\": %m" +msgstr "не удалоÑÑŒ запиÑать блоки %u..%u в файл \"%s\": %m" -#: storage/smgr/md.c:875 +#: storage/smgr/md.c:1165 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "" "не удалоÑÑŒ обрезать файл \"%s\" (Ñ‚Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ Ð´Ð»Ð¸Ð½Ð° в блоках: %u, но ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ð½ " "Ñодержит %u)" -#: storage/smgr/md.c:930 +#: storage/smgr/md.c:1220 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "не удалоÑÑŒ обрезать файл \"%s\" до нужного чиÑла блоков (%u): %m" -#: storage/smgr/md.c:1329 +#: storage/smgr/md.c:1700 #, c-format msgid "" "could not open file \"%s\" (target block %u): previous segment is only %u " @@ -24323,95 +26004,249 @@ msgstr "" "не удалоÑÑŒ открыть файл file \"%s\" (целевой блок %u): недоÑтаточно блоков в " "предыдущем Ñегменте (вÑего %u)" -#: storage/smgr/md.c:1343 +#: storage/smgr/md.c:1714 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "не удалоÑÑŒ открыть файл file \"%s\" (целевой блок %u): %m" -#: tcop/fastpath.c:148 +#: tcop/backend_startup.c:85 +#, c-format +msgid "SSL configuration could not be loaded in child process" +msgstr "не удалоÑÑŒ загрузить конфигурацию SSL в дочерний процеÑÑ" + +#: tcop/backend_startup.c:208 +#, c-format +msgid "connection received: host=%s port=%s" +msgstr "принÑто подключение: узел=%s порт=%s" + +#: tcop/backend_startup.c:213 +#, c-format +msgid "connection received: host=%s" +msgstr "принÑто подключение: узел=%s" + +#: tcop/backend_startup.c:277 +#, c-format +msgid "the database system is starting up" +msgstr "ÑиÑтема баз данных запуÑкаетÑÑ" + +#: tcop/backend_startup.c:283 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "ÑиÑтема БД ещё не принимает подключениÑ" + +#: tcop/backend_startup.c:284 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "СоглаÑованное ÑоÑтоÑние воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐµÑ‰Ñ‘ не доÑтигнуто." + +#: tcop/backend_startup.c:288 +#, c-format +msgid "the database system is not accepting connections" +msgstr "ÑиÑтема БД не принимает подключениÑ" + +#: tcop/backend_startup.c:289 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "Режим горÑчего резерва отключён." + +#: tcop/backend_startup.c:294 +#, c-format +msgid "the database system is shutting down" +msgstr "ÑиÑтема баз данных оÑтанавливаетÑÑ" + +#: tcop/backend_startup.c:299 +#, c-format +msgid "the database system is in recovery mode" +msgstr "ÑиÑтема баз данных в режиме воÑÑтановлениÑ" + +#: tcop/backend_startup.c:414 +#, c-format +msgid "" +"received direct SSL connection request without ALPN protocol negotiation " +"extension" +msgstr "получен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ñ€Ñмого SSL-ÑоединениÑ, но в нём нет раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ ALPN" + +#: tcop/backend_startup.c:420 +#, c-format +msgid "direct SSL connection accepted" +msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ñ€Ñмого SSL-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚" + +#: tcop/backend_startup.c:430 +#, c-format +msgid "direct SSL connection rejected" +msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ñ€Ñмого SSL-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð²ÐµÑ€Ð³Ð½ÑƒÑ‚" + +#: tcop/backend_startup.c:489 tcop/backend_startup.c:517 +#, c-format +msgid "incomplete startup packet" +msgstr "неполный Ñтартовый пакет" + +#: tcop/backend_startup.c:501 tcop/backend_startup.c:538 +#, c-format +msgid "invalid length of startup packet" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Ñтартового пакета" + +#: tcop/backend_startup.c:573 +#, c-format +msgid "SSLRequest accepted" +msgstr "SSLRequest принÑÑ‚" + +#: tcop/backend_startup.c:576 +#, c-format +msgid "SSLRequest rejected" +msgstr "SSLRequest отвергнут" + +#: tcop/backend_startup.c:585 +#, c-format +msgid "failed to send SSL negotiation response: %m" +msgstr "не удалоÑÑŒ отправить ответ в процеÑÑе SSL-ÑоглаÑованиÑ: %m" + +#: tcop/backend_startup.c:603 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "поÑле запроÑа SSL получены незашифрованные данные" + +#: tcop/backend_startup.c:604 tcop/backend_startup.c:658 +#, c-format +msgid "" +"This could be either a client-software bug or evidence of an attempted man-" +"in-the-middle attack." +msgstr "" +"Это может ÑвидетельÑтвовать об ошибке в клиентÑком ПО или о попытке атаки " +"MITM." + +#: tcop/backend_startup.c:627 +#, c-format +msgid "GSSENCRequest accepted" +msgstr "GSSENCRequest принÑÑ‚" + +#: tcop/backend_startup.c:630 +#, c-format +msgid "GSSENCRequest rejected" +msgstr "GSSENCRequest отвергнут" + +#: tcop/backend_startup.c:639 +#, c-format +msgid "failed to send GSSAPI negotiation response: %m" +msgstr "не удалоÑÑŒ отправить ответ в процеÑÑе ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ GSSAPI: %m" + +#: tcop/backend_startup.c:657 +#, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "поÑле запроÑа ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ GSSAPI получены незашифрованные данные" + +#: tcop/backend_startup.c:681 +#, c-format +msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" +msgstr "" +"неподдерживаемый протокол клиентÑкого Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ %u.%u; Ñервер поддерживает " +"%u.0 - %u.%u" + +#: tcop/backend_startup.c:744 +#, c-format +msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." +msgstr "ДопуÑтимые значениÑ: \"false\", 0, \"true\", 1, \"database\"." + +#: tcop/backend_startup.c:785 +#, c-format +msgid "invalid startup packet layout: expected terminator as last byte" +msgstr "" +"Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтруктура Ñтартового пакета: поÑледним байтом должен быть терминатор" + +#: tcop/backend_startup.c:802 +#, c-format +msgid "no PostgreSQL user name specified in startup packet" +msgstr "в Ñтартовом пакете не указано Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PostgreSQL" + +#: tcop/fastpath.c:142 utils/fmgr/fmgr.c:2161 +#, c-format +msgid "function with OID %u does not exist" +msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ OID %u не ÑущеÑтвует" + +#: tcop/fastpath.c:149 #, c-format msgid "cannot call function \"%s\" via fastpath interface" msgstr "вызвать функцию \"%s\" через Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ fastpath нельзÑ" -#: tcop/fastpath.c:233 +#: tcop/fastpath.c:234 #, c-format msgid "fastpath function call: \"%s\" (OID %u)" msgstr "вызов функции (через fastpath): \"%s\" (OID %u)" -#: tcop/fastpath.c:312 tcop/postgres.c:1341 tcop/postgres.c:1577 -#: tcop/postgres.c:2036 tcop/postgres.c:2280 +#: tcop/fastpath.c:313 tcop/postgres.c:1369 tcop/postgres.c:1605 +#: tcop/postgres.c:2071 tcop/postgres.c:2333 #, c-format msgid "duration: %s ms" msgstr "продолжительноÑть: %s мÑ" -#: tcop/fastpath.c:316 +#: tcop/fastpath.c:317 #, c-format msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" msgstr "" "продолжительноÑть %s мÑ, вызов функции (через fastpath): \"%s\" (OID %u)" -#: tcop/fastpath.c:352 +#: tcop/fastpath.c:353 #, c-format msgid "function call message contains %d arguments but function requires %d" msgstr "" "Ñообщение вызова функции Ñодержит неверное чиÑло аргументов (%d, а требуетÑÑ " "%d)" -#: tcop/fastpath.c:360 +#: tcop/fastpath.c:361 #, c-format msgid "function call message contains %d argument formats but %d arguments" msgstr "" "Ñообщение вызова функции Ñодержит неверное чиÑло форматов (%d, а аргументов " "%d)" -#: tcop/fastpath.c:384 +#: tcop/fastpath.c:385 #, c-format msgid "invalid argument size %d in function call message" msgstr "неверный размер аргумента (%d) в Ñообщении вызова функции" -#: tcop/fastpath.c:447 +#: tcop/fastpath.c:448 #, c-format msgid "incorrect binary data format in function argument %d" msgstr "неправильный формат двоичных данных в аргументе функции %d" -#: tcop/postgres.c:444 tcop/postgres.c:4823 +#: tcop/postgres.c:467 tcop/postgres.c:5012 #, c-format msgid "invalid frontend message type %d" msgstr "неправильный тип клиентÑкого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ %d" -#: tcop/postgres.c:1051 +#: tcop/postgres.c:1076 #, c-format msgid "statement: %s" msgstr "оператор: %s" -#: tcop/postgres.c:1346 +#: tcop/postgres.c:1374 #, c-format msgid "duration: %s ms statement: %s" msgstr "продолжительноÑть: %s мÑ, оператор: %s" -#: tcop/postgres.c:1452 +#: tcop/postgres.c:1480 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "в подготовленный оператор Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñтавить неÑколько команд" -#: tcop/postgres.c:1582 +#: tcop/postgres.c:1610 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "продолжительноÑть: %s мÑ, разбор %s: %s" # [SM]: TO REVIEW -#: tcop/postgres.c:1648 tcop/postgres.c:2595 +#: tcop/postgres.c:1677 tcop/postgres.c:2653 #, c-format msgid "unnamed prepared statement does not exist" msgstr "безымÑнный подготовленный оператор не ÑущеÑтвует" -#: tcop/postgres.c:1689 +#: tcop/postgres.c:1729 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "" "неверное чиÑло форматов параметров в Ñообщении Bind (%d, а параметров %d)" -#: tcop/postgres.c:1695 +#: tcop/postgres.c:1735 #, c-format msgid "" "bind message supplies %d parameters, but prepared statement \"%s\" requires " @@ -24420,113 +26255,120 @@ msgstr "" "в Ñообщении Bind передано неверное чиÑло параметров (%d, а подготовленный " "оператор \"%s\" требует %d)" -#: tcop/postgres.c:1914 +#: tcop/postgres.c:1949 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "неверный формат двоичных данных в параметре Bind %d" -#: tcop/postgres.c:2041 +#: tcop/postgres.c:2076 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "продолжительноÑть: %s мÑ, Ñообщение Bind %s%s%s: %s" -#: tcop/postgres.c:2091 tcop/postgres.c:2678 +#: tcop/postgres.c:2131 tcop/postgres.c:2735 #, c-format msgid "portal \"%s\" does not exist" msgstr "портал \"%s\" не ÑущеÑтвует" -#: tcop/postgres.c:2160 +#: tcop/postgres.c:2213 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2162 tcop/postgres.c:2288 +#: tcop/postgres.c:2215 tcop/postgres.c:2341 msgid "execute fetch from" msgstr "выборка из" -#: tcop/postgres.c:2163 tcop/postgres.c:2289 +#: tcop/postgres.c:2216 tcop/postgres.c:2342 msgid "execute" msgstr "выполнение" -#: tcop/postgres.c:2285 +#: tcop/postgres.c:2338 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "продолжительноÑть: %s Ð¼Ñ %s %s%s%s: %s" -#: tcop/postgres.c:2431 +#: tcop/postgres.c:2486 #, c-format msgid "prepare: %s" msgstr "подготовка: %s" -#: tcop/postgres.c:2456 +#: tcop/postgres.c:2511 #, c-format -msgid "parameters: %s" -msgstr "параметры: %s" +msgid "Parameters: %s" +msgstr "Параметры: %s" -#: tcop/postgres.c:2471 +#: tcop/postgres.c:2526 #, c-format -msgid "abort reason: recovery conflict" -msgstr "причина прерываниÑ: конфликт при воÑÑтановлении" +msgid "Abort reason: recovery conflict" +msgstr "Причина прерываниÑ: конфликт при воÑÑтановлении" -#: tcop/postgres.c:2487 +#: tcop/postgres.c:2542 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "Пользователь удерживал фикÑатор разделÑемого буфера Ñлишком долго." -#: tcop/postgres.c:2490 +#: tcop/postgres.c:2545 #, c-format msgid "User was holding a relation lock for too long." msgstr "Пользователь удерживал блокировку таблицы Ñлишком долго." -#: tcop/postgres.c:2493 +#: tcop/postgres.c:2548 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "" "Пользователь иÑпользовал табличное проÑтранÑтво, которое должно быть удалено." -#: tcop/postgres.c:2496 +#: tcop/postgres.c:2551 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "" "ЗапроÑу Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½ÑƒÐ¶Ð½Ð¾ было видеть верÑии Ñтрок, которые должны быть " "удалены." -#: tcop/postgres.c:2502 +#: tcop/postgres.c:2554 +#, c-format +msgid "User was using a logical replication slot that must be invalidated." +msgstr "" +"Пользователь иÑпользовал Ñлот логичеÑкой репликации, который должен быть " +"аннулирован." + +#: tcop/postgres.c:2560 #, c-format msgid "User was connected to a database that must be dropped." msgstr "Пользователь был подключён к базе данных, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть удалена." -#: tcop/postgres.c:2541 +#: tcop/postgres.c:2599 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "портал \"%s\", параметр $%d = %s" -#: tcop/postgres.c:2544 +#: tcop/postgres.c:2602 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "портал \"%s\", параметр $%d" -#: tcop/postgres.c:2550 +#: tcop/postgres.c:2608 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "неименованный портал, параметр $%d = %s" -#: tcop/postgres.c:2553 +#: tcop/postgres.c:2611 #, c-format msgid "unnamed portal parameter $%d" msgstr "неименованный портал, параметр $%d" -#: tcop/postgres.c:2898 +#: tcop/postgres.c:2955 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "закрытие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·-за неожиданного Ñигнала SIGQUIT" -#: tcop/postgres.c:2904 +#: tcop/postgres.c:2961 #, c-format msgid "terminating connection because of crash of another server process" msgstr "закрытие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·-за краха другого Ñерверного процеÑÑа" -#: tcop/postgres.c:2905 +#: tcop/postgres.c:2962 #, c-format msgid "" "The postmaster has commanded this server process to roll back the current " @@ -24537,7 +26379,7 @@ msgstr "" "транзакцию и завершитьÑÑ, так как другой Ñерверный процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ " "аварийно и, возможно, разрушил разделÑемую памÑть." -#: tcop/postgres.c:2909 tcop/postgres.c:3270 +#: tcop/postgres.c:2966 tcop/postgres.c:3219 #, c-format msgid "" "In a moment you should be able to reconnect to the database and repeat your " @@ -24546,18 +26388,18 @@ msgstr "" "Ð’Ñ‹ Ñможете переподключитьÑÑ Ðº базе данных и повторить вашу команду Ñию " "минуту." -#: tcop/postgres.c:2916 +#: tcop/postgres.c:2973 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "" "закрытие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð²ÑледÑтвие Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ Ð´Ð»Ñ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾Ð³Ð¾ отключениÑ" -#: tcop/postgres.c:3002 +#: tcop/postgres.c:3051 #, c-format msgid "floating-point exception" msgstr "иÑключение в операции Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой" -#: tcop/postgres.c:3003 +#: tcop/postgres.c:3052 #, c-format msgid "" "An invalid floating-point operation was signaled. This probably means an out-" @@ -24567,72 +26409,77 @@ msgstr "" "оказалÑÑ Ð²Ð½Ðµ допуÑтимых рамок или произошла ошибка вычиÑлениÑ, например, " "деление на ноль." -#: tcop/postgres.c:3174 +#: tcop/postgres.c:3217 +#, c-format +msgid "terminating connection due to conflict with recovery" +msgstr "закрытие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·-за конфликта Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑом воÑÑтановлениÑ" + +#: tcop/postgres.c:3289 #, c-format msgid "canceling authentication due to timeout" msgstr "отмена проверки подлинноÑти из-за тайм-аута" -#: tcop/postgres.c:3178 +#: tcop/postgres.c:3293 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "прекращение процеÑÑа автоочиÑтки по команде админиÑтратора" -#: tcop/postgres.c:3182 +#: tcop/postgres.c:3297 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "завершение обработчика логичеÑкой репликации по команде админиÑтратора" -#: tcop/postgres.c:3199 tcop/postgres.c:3209 tcop/postgres.c:3268 -#, c-format -msgid "terminating connection due to conflict with recovery" -msgstr "закрытие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·-за конфликта Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑом воÑÑтановлениÑ" - -#: tcop/postgres.c:3220 +#: tcop/postgres.c:3317 #, c-format msgid "terminating connection due to administrator command" msgstr "закрытие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ команде админиÑтратора" -#: tcop/postgres.c:3251 +#: tcop/postgres.c:3348 #, c-format msgid "connection to client lost" msgstr "подключение к клиенту потерÑно" -#: tcop/postgres.c:3321 +#: tcop/postgres.c:3400 #, c-format msgid "canceling statement due to lock timeout" msgstr "выполнение оператора отменено из-за тайм-аута блокировки" -#: tcop/postgres.c:3328 +#: tcop/postgres.c:3407 #, c-format msgid "canceling statement due to statement timeout" msgstr "выполнение оператора отменено из-за тайм-аута" -#: tcop/postgres.c:3335 +#: tcop/postgres.c:3414 #, c-format msgid "canceling autovacuum task" msgstr "отмена задачи автоочиÑтки" -#: tcop/postgres.c:3358 +#: tcop/postgres.c:3427 #, c-format msgid "canceling statement due to user request" msgstr "выполнение оператора отменено по запроÑу пользователÑ" -#: tcop/postgres.c:3372 +#: tcop/postgres.c:3448 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "закрытие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·-за тайм-аута проÑÑ‚Ð¾Ñ Ð² транзакции" -#: tcop/postgres.c:3383 +#: tcop/postgres.c:3461 +#, c-format +msgid "terminating connection due to transaction timeout" +msgstr "закрытие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·-за тайм-аута транзакции" + +#: tcop/postgres.c:3474 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "закрытие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð·-за тайм-аута проÑÑ‚Ð¾Ñ ÑеанÑа" -#: tcop/postgres.c:3523 +#: tcop/postgres.c:3564 #, c-format msgid "stack depth limit exceeded" msgstr "превышен предел глубины Ñтека" -#: tcop/postgres.c:3524 +#: tcop/postgres.c:3565 #, c-format msgid "" "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), " @@ -24642,12 +26489,12 @@ msgstr "" "КБ), предварительно убедившиÑÑŒ, что ОС предоÑтавлÑет доÑтаточный размер " "Ñтека." -#: tcop/postgres.c:3587 +#: tcop/postgres.c:3612 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "Значение \"max_stack_depth\" не должно превышать %ld КБ." -#: tcop/postgres.c:3589 +#: tcop/postgres.c:3614 #, c-format msgid "" "Increase the platform's stack depth limit via \"ulimit -s\" or local " @@ -24656,49 +26503,72 @@ msgstr "" "Увеличьте предел глубины Ñтека в ÑиÑтеме Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды \"ulimit -s\" или " "Ñквивалента в вашей ОС." -#: tcop/postgres.c:3945 +#: tcop/postgres.c:3637 +#, c-format +msgid "\"client_connection_check_interval\" must be set to 0 on this platform." +msgstr "" +"Значение \"client_connection_check_interval\" должно равнÑтьÑÑ 0 на Ñтой " +"платформе." + +#: tcop/postgres.c:3658 +#, c-format +msgid "Cannot enable parameter when \"log_statement_stats\" is true." +msgstr "" +"Этот параметр Ð½ÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ, когда \"log_statement_stats\" равен true." + +#: tcop/postgres.c:3673 +#, c-format +msgid "" +"Cannot enable \"log_statement_stats\" when \"log_parser_stats\", " +"\"log_planner_stats\", or \"log_executor_stats\" is true." +msgstr "" +"Параметр \"log_statement_stats\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ, когда " +"\"log_parser_stats\", \"log_planner_stats\" или \"log_executor_stats\" равны " +"true." + +#: tcop/postgres.c:4098 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "неверный аргумент командной Ñтроки Ð´Ð»Ñ Ñерверного процеÑÑа: %s" -#: tcop/postgres.c:3946 tcop/postgres.c:3952 +#: tcop/postgres.c:4099 tcop/postgres.c:4105 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." -#: tcop/postgres.c:3950 +#: tcop/postgres.c:4103 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: неверный аргумент командной Ñтроки: %s" -#: tcop/postgres.c:4003 +#: tcop/postgres.c:4156 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: не указаны ни база данных, ни пользователь" -#: tcop/postgres.c:4725 +#: tcop/postgres.c:4909 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "неверный подтип ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ CLOSE: %d" -#: tcop/postgres.c:4760 +#: tcop/postgres.c:4946 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "неверный подтип ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ DESCRIBE: %d" -#: tcop/postgres.c:4844 +#: tcop/postgres.c:5033 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "" "вызовы функций через fastpath не поддерживаютÑÑ Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸Ñ†Ð¸Ñ€ÑƒÑŽÑ‰Ð¸Ñ… Ñоединений" -#: tcop/postgres.c:4848 +#: tcop/postgres.c:5037 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "" "протокол раÑширенных запроÑов не поддерживаетÑÑ Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸Ñ†Ð¸Ñ€ÑƒÑŽÑ‰Ð¸Ñ… Ñоединений" -#: tcop/postgres.c:5025 +#: tcop/postgres.c:5217 #, c-format msgid "" "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s " @@ -24714,54 +26584,58 @@ msgstr "" "чиÑло форматов результатов в Ñообщении Bind (%d) не равно чиÑлу Ñтолбцов в " "запроÑе (%d)" -#: tcop/pquery.c:944 tcop/pquery.c:1701 +#: tcop/pquery.c:942 tcop/pquery.c:1696 #, c-format msgid "cursor can only scan forward" msgstr "курÑор может Ñканировать только вперёд" -#: tcop/pquery.c:945 tcop/pquery.c:1702 +#: tcop/pquery.c:943 tcop/pquery.c:1697 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Добавьте в его объÑвление SCROLL, чтобы он мог перемещатьÑÑ Ð½Ð°Ð·Ð°Ð´." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:417 +#: tcop/utility.c:410 #, c-format msgid "cannot execute %s in a read-only transaction" msgstr "в транзакции в режиме \"только чтение\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ %s" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:435 +#: tcop/utility.c:428 #, c-format msgid "cannot execute %s during a parallel operation" msgstr "выполнить %s во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:454 +#: tcop/utility.c:447 #, c-format msgid "cannot execute %s during recovery" msgstr "выполнить %s во Ð²Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ" #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:472 +#: tcop/utility.c:465 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "в рамках операции Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñми по безопаÑноÑти Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ %s" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:828 +#: tcop/utility.c:821 #, c-format msgid "cannot execute %s within a background process" msgstr "выполнÑть %s в фоновом процеÑÑе нельзÑ" -#: tcop/utility.c:953 +#. translator: %s is name of a SQL command, eg CHECKPOINT +#: tcop/utility.c:947 #, c-format -msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" -msgstr "" -"Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ CHECKPOINT нужно быть Ñуперпользователем или иметь права роли " -"pg_checkpoint" +msgid "permission denied to execute %s command" +msgstr "нет прав Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ %s" + +#: tcop/utility.c:949 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may execute this command." +msgstr "ВыполнÑть Ñту команду могут только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли \"%s\"." -#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:616 #, c-format msgid "multiple DictFile parameters" msgstr "повторÑющийÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ DictFile" @@ -24781,7 +26655,7 @@ msgstr "нераÑпознанный параметр ispell: \"%s\"" msgid "missing AffFile parameter" msgstr "отÑутÑтвует параметр AffFile" -#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:639 +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:640 #, c-format msgid "missing DictFile parameter" msgstr "отÑутÑтвует параметр DictFile" @@ -24870,70 +26744,70 @@ msgstr "" msgid "thesaurus substitute phrase is empty (rule %d)" msgstr "Фраза подÑтановки в тезауруÑе не определена (правило %d)" -#: tsearch/dict_thesaurus.c:624 +#: tsearch/dict_thesaurus.c:625 #, c-format msgid "multiple Dictionary parameters" msgstr "повторÑющийÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ Dictionary" -#: tsearch/dict_thesaurus.c:631 +#: tsearch/dict_thesaurus.c:632 #, c-format msgid "unrecognized Thesaurus parameter: \"%s\"" msgstr "нераÑпознанный параметр тезауруÑа: \"%s\"" -#: tsearch/dict_thesaurus.c:643 +#: tsearch/dict_thesaurus.c:644 #, c-format msgid "missing Dictionary parameter" msgstr "отÑутÑтвует параметр Dictionary" -#: tsearch/spell.c:381 tsearch/spell.c:398 tsearch/spell.c:407 -#: tsearch/spell.c:1063 +#: tsearch/spell.c:382 tsearch/spell.c:399 tsearch/spell.c:408 +#: tsearch/spell.c:1045 #, c-format msgid "invalid affix flag \"%s\"" msgstr "неверный флаг аффикÑов \"%s\"" -#: tsearch/spell.c:385 tsearch/spell.c:1067 +#: tsearch/spell.c:386 tsearch/spell.c:1049 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "флаг аффикÑа \"%s\" вне диапазона" -#: tsearch/spell.c:415 +#: tsearch/spell.c:416 #, c-format msgid "invalid character in affix flag \"%s\"" msgstr "неверный Ñимвол во флаге аффикÑа \"%s\"" -#: tsearch/spell.c:435 +#: tsearch/spell.c:436 #, c-format msgid "invalid affix flag \"%s\" with \"long\" flag value" msgstr "неверный флаг аффикÑов \"%s\" Ñо значением флага \"long\"" -#: tsearch/spell.c:525 +#: tsearch/spell.c:526 #, c-format msgid "could not open dictionary file \"%s\": %m" msgstr "не удалоÑÑŒ открыть файл ÑÐ»Ð¾Ð²Ð°Ñ€Ñ \"%s\": %m" -#: tsearch/spell.c:764 utils/adt/regexp.c:209 +#: tsearch/spell.c:750 utils/adt/regexp.c:223 jsonpath_gram.y:629 #, c-format msgid "invalid regular expression: %s" msgstr "неверное регулÑрное выражение: %s" -#: tsearch/spell.c:983 tsearch/spell.c:1000 tsearch/spell.c:1017 -#: tsearch/spell.c:1034 tsearch/spell.c:1099 gram.y:17812 gram.y:17829 +#: tsearch/spell.c:964 tsearch/spell.c:981 tsearch/spell.c:998 +#: tsearch/spell.c:1015 tsearch/spell.c:1081 gram.y:18735 gram.y:18752 #, c-format msgid "syntax error" msgstr "ошибка ÑинтакÑиÑа" -#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1762 -#: tsearch/spell.c:1767 tsearch/spell.c:1772 +#: tsearch/spell.c:1173 tsearch/spell.c:1185 tsearch/spell.c:1746 +#: tsearch/spell.c:1751 tsearch/spell.c:1756 #, c-format msgid "invalid affix alias \"%s\"" msgstr "неверное указание аффикÑа \"%s\"" -#: tsearch/spell.c:1243 tsearch/spell.c:1314 tsearch/spell.c:1463 +#: tsearch/spell.c:1226 tsearch/spell.c:1297 tsearch/spell.c:1446 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "не удалоÑÑŒ открыть файл аффикÑов \"%s\": %m" -#: tsearch/spell.c:1297 +#: tsearch/spell.c:1280 #, c-format msgid "" "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag " @@ -24942,44 +26816,44 @@ msgstr "" "Ñловарь Ispell поддерживает Ð´Ð»Ñ Ñ„Ð»Ð°Ð³Ð° только Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"default\", \"long\" " "и \"num\"" -#: tsearch/spell.c:1341 +#: tsearch/spell.c:1324 #, c-format msgid "invalid number of flag vector aliases" msgstr "неверное количеÑтво векторов флагов" -#: tsearch/spell.c:1364 +#: tsearch/spell.c:1347 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "количеÑтво пÑевдонимов превышает заданное чиÑло %d" -#: tsearch/spell.c:1579 +#: tsearch/spell.c:1562 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "файл аффикÑов Ñодержит команды и в Ñтаром, и в новом Ñтиле" -#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1127 +#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:274 utils/adt/tsvector_op.c:1126 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "Ñтрока Ñлишком длинна Ð´Ð»Ñ tsvector (%d Б, при макÑимуме %d)" -#: tsearch/ts_locale.c:227 +#: tsearch/ts_locale.c:236 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "Ñтрока %d файла конфигурации \"%s\": \"%s\"" -#: tsearch/ts_locale.c:307 +#: tsearch/ts_locale.c:315 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "преобразовать wchar_t в кодировку Ñервера не удалоÑÑŒ: %m" -#: tsearch/ts_parse.c:386 tsearch/ts_parse.c:393 tsearch/ts_parse.c:572 -#: tsearch/ts_parse.c:579 +#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 +#: tsearch/ts_parse.c:580 #, c-format msgid "word is too long to be indexed" msgstr "Ñлишком длинное Ñлово Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑации" -#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 -#: tsearch/ts_parse.c:580 +#: tsearch/ts_parse.c:388 tsearch/ts_parse.c:395 tsearch/ts_parse.c:574 +#: tsearch/ts_parse.c:581 #, c-format msgid "Words longer than %d characters are ignored." msgstr "Слова длиннее %d Ñимволов игнорируютÑÑ." @@ -24994,73 +26868,68 @@ msgstr "неверное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° конфигурации текÑто msgid "could not open stop-word file \"%s\": %m" msgstr "не удалоÑÑŒ открыть файл Ñтоп-Ñлов \"%s\": %m" -#: tsearch/wparser.c:313 tsearch/wparser.c:401 tsearch/wparser.c:478 +#: tsearch/wparser.c:306 tsearch/wparser.c:394 tsearch/wparser.c:471 #, c-format msgid "text search parser does not support headline creation" msgstr "анализатор текÑтового поиÑка не поддерживает Ñоздание выдержек" -#: tsearch/wparser_def.c:2574 +#: tsearch/wparser_def.c:2664 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "нераÑпознанный параметр функции выдержки: \"%s\"" -#: tsearch/wparser_def.c:2593 -#, c-format -msgid "MinWords should be less than MaxWords" -msgstr "Значение MinWords должно быть меньше MaxWords" - -#: tsearch/wparser_def.c:2597 +#: tsearch/wparser_def.c:2674 #, c-format -msgid "MinWords should be positive" -msgstr "Значение MinWords должно быть положительным" +msgid "%s must be less than %s" +msgstr "%s должно быть меньше %s" -#: tsearch/wparser_def.c:2601 +#: tsearch/wparser_def.c:2678 #, c-format -msgid "ShortWord should be >= 0" -msgstr "Значение ShortWord должно быть >= 0" +msgid "%s must be positive" +msgstr "%s должно быть больше нулÑ" -#: tsearch/wparser_def.c:2605 +#: tsearch/wparser_def.c:2682 tsearch/wparser_def.c:2686 #, c-format -msgid "MaxFragments should be >= 0" -msgstr "Значение MaxFragments должно быть >= 0" +msgid "%s must be >= 0" +msgstr "%s должно быть >= 0" -#: utils/activity/pgstat.c:421 +#: utils/activity/pgstat.c:435 #, c-format msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾ÑтоÑнного файла ÑтатиÑтики \"%s\": %m" -#: utils/activity/pgstat.c:1209 +#: utils/activity/pgstat.c:1254 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "неверный вид ÑтатиÑтики: \"%s\"" -#: utils/activity/pgstat.c:1289 +#: utils/activity/pgstat.c:1334 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "не удалоÑÑŒ открыть временный файл ÑтатиÑтики \"%s\": %m" -#: utils/activity/pgstat.c:1395 +#: utils/activity/pgstat.c:1454 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "не удалоÑÑŒ запиÑать во временный файл ÑтатиÑтики \"%s\": %m" -#: utils/activity/pgstat.c:1404 +#: utils/activity/pgstat.c:1463 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "не удалоÑÑŒ закрыть временный файл ÑтатиÑтики \"%s\": %m" -#: utils/activity/pgstat.c:1412 +#: utils/activity/pgstat.c:1471 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "" "не удалоÑÑŒ переименовать временный файл ÑтатиÑтики из \"%s\" в \"%s\": %m" -#: utils/activity/pgstat.c:1461 +#: utils/activity/pgstat.c:1520 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "не удалоÑÑŒ открыть файл ÑтатиÑтики \"%s\": %m" -#: utils/activity/pgstat.c:1617 +#: utils/activity/pgstat.c:1682 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "файл ÑтатиÑтики \"%s\" иÑпорчен" @@ -25070,293 +26939,307 @@ msgstr "файл ÑтатиÑтики \"%s\" иÑпорчен" msgid "function call to dropped function" msgstr "вызвана функциÑ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±Ñ‹Ð»Ð° удалена" -#: utils/activity/pgstat_xact.c:371 +#: utils/activity/pgstat_xact.c:362 #, c-format msgid "resetting existing statistics for kind %s, db=%u, oid=%u" msgstr "ÑбраÑываетÑÑ ÑущеÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ ÑтатиÑтика вида %s, db=%u, oid=%u" -#: utils/adt/acl.c:168 utils/adt/name.c:93 +#: utils/activity/wait_event.c:207 utils/activity/wait_event.c:232 +#, c-format +msgid "wait event \"%s\" already exists in type \"%s\"" +msgstr "Ñобытие Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ \"%s\" в типе \"%s\" уже ÑущеÑтвует" + +#: utils/activity/wait_event.c:246 +#, c-format +msgid "too many custom wait events" +msgstr "Ñлишком много пользовательÑких Ñобытий ожиданиÑ" + +#: utils/adt/acl.c:183 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "Ñлишком длинный идентификатор" -#: utils/adt/acl.c:169 utils/adt/name.c:94 +#: utils/adt/acl.c:184 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Идентификатор должен быть короче %d байт." -#: utils/adt/acl.c:252 +#: utils/adt/acl.c:272 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "нераÑпознанное ключевое Ñлово: \"%s\"" -#: utils/adt/acl.c:253 +#: utils/adt/acl.c:273 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "Ключевым Ñловом ACL должно быть \"group\" или \"user\"." -#: utils/adt/acl.c:258 +#: utils/adt/acl.c:281 #, c-format msgid "missing name" msgstr "отÑутÑтвует имÑ" -#: utils/adt/acl.c:259 +#: utils/adt/acl.c:282 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "За ключевыми Ñловами \"group\" или \"user\" должно Ñледовать имÑ." -#: utils/adt/acl.c:265 +#: utils/adt/acl.c:288 #, c-format msgid "missing \"=\" sign" msgstr "отÑутÑтвует знак \"=\"" -#: utils/adt/acl.c:324 +#: utils/adt/acl.c:350 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "неверный Ñимвол режима: должен быть один из \"%s\"" -#: utils/adt/acl.c:346 +#: utils/adt/acl.c:380 #, c-format msgid "a name must follow the \"/\" sign" msgstr "за знаком \"/\" должно Ñледовать имÑ" -#: utils/adt/acl.c:354 +#: utils/adt/acl.c:392 #, c-format msgid "defaulting grantor to user ID %u" msgstr "назначившим права ÑчитаетÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒ Ñ ID %u" -#: utils/adt/acl.c:540 +#: utils/adt/acl.c:578 #, c-format msgid "ACL array contains wrong data type" msgstr "МаÑÑив ACL Ñодержит неверный тип данных" -#: utils/adt/acl.c:544 +#: utils/adt/acl.c:582 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "МаÑÑивы ACL должны быть одномерными" -#: utils/adt/acl.c:548 +#: utils/adt/acl.c:586 #, c-format msgid "ACL arrays must not contain null values" msgstr "МаÑÑивы ACL не должны Ñодержать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ null" -#: utils/adt/acl.c:572 +#: utils/adt/acl.c:615 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "лишний муÑор в конце Ñпецификации ACL" -#: utils/adt/acl.c:1214 +#: utils/adt/acl.c:1263 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "привилегию Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð² Ð½ÐµÐ»ÑŒÐ·Ñ Ð²ÐµÑ€Ð½ÑƒÑ‚ÑŒ тому, кто назначил её вам" -#: utils/adt/acl.c:1275 -#, c-format -msgid "dependent privileges exist" -msgstr "ÑущеÑтвуют завиÑимые права" - -#: utils/adt/acl.c:1276 -#, c-format -msgid "Use CASCADE to revoke them too." -msgstr "ИÑпользуйте CASCADE, чтобы отозвать и их." - -#: utils/adt/acl.c:1530 +#: utils/adt/acl.c:1579 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert больше не поддерживаетÑÑ" -#: utils/adt/acl.c:1540 +#: utils/adt/acl.c:1589 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove больше не поддерживаетÑÑ" -#: utils/adt/acl.c:1630 utils/adt/acl.c:1684 +#: utils/adt/acl.c:1709 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "нераÑпознанный тип прав: \"%s\"" -#: utils/adt/acl.c:3469 utils/adt/regproc.c:101 utils/adt/regproc.c:277 +#: utils/adt/acl.c:3550 utils/adt/regproc.c:100 utils/adt/regproc.c:265 #, c-format msgid "function \"%s\" does not exist" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" не ÑущеÑтвует" -#: utils/adt/acl.c:5008 -#, c-format -msgid "must be member of role \"%s\"" -msgstr "нужно быть членом роли \"%s\"" - -#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:936 -#: utils/adt/arrayfuncs.c:1544 utils/adt/arrayfuncs.c:3263 -#: utils/adt/arrayfuncs.c:3405 utils/adt/arrayfuncs.c:5981 -#: utils/adt/arrayfuncs.c:6322 utils/adt/arrayutils.c:94 -#: utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 +#: utils/adt/acl.c:5196 #, c-format -msgid "array size exceeds the maximum allowed (%d)" -msgstr "размер маÑÑива превышает предел (%d)" +msgid "must be able to SET ROLE \"%s\"" +msgstr "нужны права Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ SET ROLE \"%s\"" -#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:467 -#: utils/adt/array_userfuncs.c:547 utils/adt/json.c:645 utils/adt/json.c:740 -#: utils/adt/json.c:778 utils/adt/jsonb.c:1114 utils/adt/jsonb.c:1143 -#: utils/adt/jsonb.c:1537 utils/adt/jsonb.c:1701 utils/adt/jsonb.c:1711 +#: utils/adt/array_userfuncs.c:102 utils/adt/array_userfuncs.c:489 +#: utils/adt/array_userfuncs.c:866 utils/adt/json.c:602 utils/adt/json.c:740 +#: utils/adt/json.c:790 utils/adt/jsonb.c:1025 utils/adt/jsonb.c:1098 +#: utils/adt/jsonb.c:1530 utils/adt/jsonb.c:1718 utils/adt/jsonb.c:1728 #, c-format msgid "could not determine input data type" msgstr "не удалоÑÑŒ определить тип входных данных" -#: utils/adt/array_userfuncs.c:85 +#: utils/adt/array_userfuncs.c:107 #, c-format msgid "input data type is not an array" msgstr "тип входных данных не ÑвлÑетÑÑ Ð¼Ð°ÑÑивом" -#: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 -#: utils/adt/float.c:1234 utils/adt/float.c:1308 utils/adt/float.c:4046 -#: utils/adt/float.c:4060 utils/adt/int.c:777 utils/adt/int.c:799 -#: utils/adt/int.c:813 utils/adt/int.c:827 utils/adt/int.c:858 -#: utils/adt/int.c:879 utils/adt/int.c:996 utils/adt/int.c:1010 -#: utils/adt/int.c:1024 utils/adt/int.c:1057 utils/adt/int.c:1071 -#: utils/adt/int.c:1085 utils/adt/int.c:1116 utils/adt/int.c:1198 -#: utils/adt/int.c:1262 utils/adt/int.c:1330 utils/adt/int.c:1336 -#: utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4293 -#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 -#: utils/adt/varlena.c:3391 +#: utils/adt/array_userfuncs.c:151 utils/adt/array_userfuncs.c:203 +#: utils/adt/float.c:1222 utils/adt/float.c:1296 utils/adt/float.c:4022 +#: utils/adt/float.c:4060 utils/adt/int.c:778 utils/adt/int.c:800 +#: utils/adt/int.c:814 utils/adt/int.c:828 utils/adt/int.c:859 +#: utils/adt/int.c:880 utils/adt/int.c:997 utils/adt/int.c:1011 +#: utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 +#: utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 +#: utils/adt/int.c:1263 utils/adt/int.c:1331 utils/adt/int.c:1337 +#: utils/adt/int8.c:1256 utils/adt/numeric.c:1917 utils/adt/numeric.c:4454 +#: utils/adt/rangetypes.c:1488 utils/adt/rangetypes.c:1501 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1135 +#: utils/adt/varlena.c:3137 #, c-format msgid "integer out of range" msgstr "целое вне диапазона" -#: utils/adt/array_userfuncs.c:136 utils/adt/array_userfuncs.c:191 +#: utils/adt/array_userfuncs.c:158 utils/adt/array_userfuncs.c:213 #, c-format msgid "argument must be empty or one-dimensional array" msgstr "аргумент должен быть одномерным маÑÑивом или пуÑтым" -#: utils/adt/array_userfuncs.c:273 utils/adt/array_userfuncs.c:312 -#: utils/adt/array_userfuncs.c:349 utils/adt/array_userfuncs.c:378 -#: utils/adt/array_userfuncs.c:406 +#: utils/adt/array_userfuncs.c:295 utils/adt/array_userfuncs.c:334 +#: utils/adt/array_userfuncs.c:371 utils/adt/array_userfuncs.c:400 +#: utils/adt/array_userfuncs.c:428 #, c-format msgid "cannot concatenate incompatible arrays" msgstr "ÑоединÑть неÑовмеÑтимые маÑÑивы нельзÑ" -#: utils/adt/array_userfuncs.c:274 +#: utils/adt/array_userfuncs.c:296 #, c-format msgid "" "Arrays with element types %s and %s are not compatible for concatenation." msgstr "МаÑÑивы Ñ Ñлементами типов %s и %s неÑовмеÑтимы Ð´Ð»Ñ ÑоединениÑ." -#: utils/adt/array_userfuncs.c:313 +#: utils/adt/array_userfuncs.c:335 #, c-format msgid "Arrays of %d and %d dimensions are not compatible for concatenation." msgstr "МаÑÑивы Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð½Ð¾ÑÑ‚Ñми %d и %d неÑовмеÑтимы Ð´Ð»Ñ ÑоединениÑ." -#: utils/adt/array_userfuncs.c:350 +#: utils/adt/array_userfuncs.c:372 #, c-format msgid "" "Arrays with differing element dimensions are not compatible for " "concatenation." msgstr "МаÑÑивы Ñ Ñ€Ð°Ð·Ð½Ñ‹Ð¼Ð¸ размерноÑÑ‚Ñми Ñлементов неÑовмеÑтимы Ð´Ð»Ñ ÑоединениÑ." -#: utils/adt/array_userfuncs.c:379 utils/adt/array_userfuncs.c:407 +#: utils/adt/array_userfuncs.c:401 utils/adt/array_userfuncs.c:429 #, c-format msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "МаÑÑивы Ñ Ñ€Ð°Ð·Ð½Ñ‹Ð¼Ð¸ размерноÑÑ‚Ñми неÑовмеÑтимы Ð´Ð»Ñ ÑоединениÑ." -#: utils/adt/array_userfuncs.c:663 utils/adt/array_userfuncs.c:815 +#: utils/adt/array_userfuncs.c:975 utils/adt/array_userfuncs.c:983 +#: utils/adt/arrayfuncs.c:5616 utils/adt/arrayfuncs.c:5622 +#, c-format +msgid "cannot accumulate arrays of different dimensionality" +msgstr "аккумулировать маÑÑивы различной размерноÑти нельзÑ" + +#: utils/adt/array_userfuncs.c:1272 utils/adt/array_userfuncs.c:1426 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "поиÑк Ñлементов в многомерных маÑÑивах не поддерживаетÑÑ" -#: utils/adt/array_userfuncs.c:687 +#: utils/adt/array_userfuncs.c:1301 #, c-format msgid "initial position must not be null" msgstr "Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð½Ðµ может быть NULL" -#: utils/adt/arrayfuncs.c:271 utils/adt/arrayfuncs.c:285 -#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:318 -#: utils/adt/arrayfuncs.c:333 utils/adt/arrayfuncs.c:347 -#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 -#: utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:509 -#: utils/adt/arrayfuncs.c:520 utils/adt/arrayfuncs.c:535 -#: utils/adt/arrayfuncs.c:556 utils/adt/arrayfuncs.c:586 -#: utils/adt/arrayfuncs.c:593 utils/adt/arrayfuncs.c:601 -#: utils/adt/arrayfuncs.c:635 utils/adt/arrayfuncs.c:658 -#: utils/adt/arrayfuncs.c:678 utils/adt/arrayfuncs.c:790 -#: utils/adt/arrayfuncs.c:799 utils/adt/arrayfuncs.c:829 -#: utils/adt/arrayfuncs.c:844 utils/adt/arrayfuncs.c:897 +#: utils/adt/array_userfuncs.c:1674 #, c-format -msgid "malformed array literal: \"%s\"" -msgstr "ошибочный литерал маÑÑива: \"%s\"" +msgid "sample size must be between 0 and %d" +msgstr "размер выборки должен задаватьÑÑ Ñ‡Ð¸Ñлом от 0 до %d" -#: utils/adt/arrayfuncs.c:272 +#: utils/adt/arrayfuncs.c:264 utils/adt/arrayfuncs.c:273 +#: utils/adt/arrayfuncs.c:284 utils/adt/arrayfuncs.c:307 +#: utils/adt/arrayfuncs.c:440 utils/adt/arrayfuncs.c:454 +#: utils/adt/arrayfuncs.c:466 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:668 utils/adt/arrayfuncs.c:703 +#: utils/adt/arrayfuncs.c:718 utils/adt/arrayfuncs.c:777 +#: utils/adt/arrayfuncs.c:782 utils/adt/arrayfuncs.c:870 +#: utils/adt/arrayfuncs.c:897 utils/adt/arrayfuncs.c:904 +#: utils/adt/arrayfuncs.c:941 #, c-format -msgid "\"[\" must introduce explicitly-specified array dimensions." -msgstr "За \"[\" должны Ñледовать Ñвно задаваемые размерноÑти маÑÑива." +msgid "malformed array literal: \"%s\"" +msgstr "ошибочный литерал маÑÑива: \"%s\"" -#: utils/adt/arrayfuncs.c:286 +#: utils/adt/arrayfuncs.c:265 #, c-format -msgid "Missing array dimension value." -msgstr "ОтÑутÑтвует значение размерноÑти маÑÑива." +msgid "Array value must start with \"{\" or dimension information." +msgstr "Значение маÑÑива должно начинатьÑÑ Ñ \"{\" или ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð½Ð¾Ñти." -#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 +#: utils/adt/arrayfuncs.c:274 utils/adt/arrayfuncs.c:467 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "ПоÑле размерноÑтей маÑÑива отÑутÑтвует \"%s\"." -#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2910 -#: utils/adt/arrayfuncs.c:2942 utils/adt/arrayfuncs.c:2957 +#: utils/adt/arrayfuncs.c:285 #, c-format -msgid "upper bound cannot be less than lower bound" -msgstr "верхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° не может быть меньше нижней" +msgid "Array contents must start with \"{\"." +msgstr "Содержимое маÑÑива должно начинатьÑÑ Ñ \"{\"." -#: utils/adt/arrayfuncs.c:319 +#: utils/adt/arrayfuncs.c:308 utils/adt/multirangetypes.c:292 #, c-format -msgid "Array value must start with \"{\" or dimension information." -msgstr "Значение маÑÑива должно начинатьÑÑ Ñ \"{\" или ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð½Ð¾Ñти." +msgid "Junk after closing right brace." +msgstr "МуÑор поÑле закрывающей фигурной Ñкобки." -#: utils/adt/arrayfuncs.c:348 +#: utils/adt/arrayfuncs.c:431 utils/adt/arrayfuncs.c:643 #, c-format -msgid "Array contents must start with \"{\"." -msgstr "Содержимое маÑÑива должно начинатьÑÑ Ñ \"{\"." +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "чиÑло размерноÑтей маÑÑива превышает предел (%d)" -#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 +#: utils/adt/arrayfuncs.c:441 #, c-format -msgid "Specified array dimensions do not match array contents." -msgstr "Указанные размерноÑти маÑÑива не ÑоответÑтвуют его Ñодержимому." +msgid "\"[\" must introduce explicitly-specified array dimensions." +msgstr "За \"[\" должны Ñледовать Ñвно задаваемые размерноÑти маÑÑива." -#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:521 -#: utils/adt/multirangetypes.c:164 utils/adt/rangetypes.c:2310 -#: utils/adt/rangetypes.c:2318 utils/adt/rowtypes.c:211 -#: utils/adt/rowtypes.c:219 +#: utils/adt/arrayfuncs.c:455 #, c-format -msgid "Unexpected end of input." -msgstr "Ðеожиданный конец ввода." +msgid "Missing array dimension value." +msgstr "ОтÑутÑтвует значение размерноÑти маÑÑива." + +#: utils/adt/arrayfuncs.c:481 utils/adt/arrayfuncs.c:2940 +#: utils/adt/arrayfuncs.c:2985 utils/adt/arrayfuncs.c:3000 +#, c-format +msgid "upper bound cannot be less than lower bound" +msgstr "верхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° не может быть меньше нижней" + +#: utils/adt/arrayfuncs.c:487 +#, c-format +msgid "array upper bound is too large: %d" +msgstr "верхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° маÑÑива Ñлишком велика: %d" + +#: utils/adt/arrayfuncs.c:538 +#, c-format +msgid "array bound is out of integer range" +msgstr "граница маÑÑива вне целочиÑленного диапазона" -#: utils/adt/arrayfuncs.c:510 utils/adt/arrayfuncs.c:557 -#: utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:637 utils/adt/arrayfuncs.c:669 +#: utils/adt/arrayfuncs.c:704 utils/adt/arrayfuncs.c:898 #, c-format msgid "Unexpected \"%c\" character." msgstr "Ðеожиданный знак \"%c\"." -#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 +#: utils/adt/arrayfuncs.c:719 #, c-format msgid "Unexpected array element." msgstr "Ðеожиданный Ñлемент маÑÑива." -#: utils/adt/arrayfuncs.c:594 +#: utils/adt/arrayfuncs.c:778 #, c-format -msgid "Unmatched \"%c\" character." -msgstr "Ðепарный знак \"%c\"." +msgid "Specified array dimensions do not match array contents." +msgstr "Указанные размерноÑти маÑÑива не ÑоответÑтвуют его Ñодержимому." -#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2489 +#: utils/adt/arrayfuncs.c:783 utils/adt/jsonfuncs.c:2598 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "" "Ð”Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¼ÐµÑ€Ð½Ñ‹Ñ… маÑÑивов должны задаватьÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ðµ маÑÑивы Ñ " "ÑоответÑтвующими размерноÑÑ‚Ñми." -#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:287 +#: utils/adt/arrayfuncs.c:871 utils/adt/arrayfuncs.c:905 #, c-format -msgid "Junk after closing right brace." -msgstr "МуÑор поÑле закрывающей фигурной Ñкобки." +msgid "Incorrectly quoted array element." +msgstr "Элемент маÑÑива заключён в кавычки некорректно." + +#: utils/adt/arrayfuncs.c:942 utils/adt/multirangetypes.c:165 +#: utils/adt/rangetypes.c:2464 utils/adt/rangetypes.c:2472 +#: utils/adt/rowtypes.c:218 utils/adt/rowtypes.c:229 +#, c-format +msgid "Unexpected end of input." +msgstr "Ðеожиданный конец ввода." -#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3371 -#: utils/adt/arrayfuncs.c:5885 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 +#: utils/adt/arrayfuncs.c:6108 #, c-format msgid "invalid number of dimensions: %d" msgstr "неверное чиÑло размерноÑтей: %d" @@ -25373,61 +27256,61 @@ msgstr "" "Ñ Ð±Ð¸Ð½Ð°Ñ€Ð½Ñ‹Ð¼Ð¸ данными ÑвÑзан тип Ñлемента маÑÑива %u (%s) вмеÑто ожидаемого %u " "(%s)" -#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:445 -#: utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2915 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:450 +#: utils/adt/rangetypes.c:351 utils/cache/lsyscache.c:2958 #, c-format msgid "no binary input function available for type %s" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s нет функции ввода двоичных данных" -#: utils/adt/arrayfuncs.c:1518 +#: utils/adt/arrayfuncs.c:1509 #, c-format msgid "improper binary format in array element %d" msgstr "неподходÑщий двоичный формат в Ñлементе маÑÑива %d" -#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:450 -#: utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2948 +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 +#: utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:2991 #, c-format msgid "no binary output function available for type %s" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s нет функции вывода двоичных данных" -#: utils/adt/arrayfuncs.c:2078 +#: utils/adt/arrayfuncs.c:2067 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "разрезание маÑÑивов поÑтоÑнной длины не поддерживаетÑÑ" -#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 -#: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2566 -#: utils/adt/arrayfuncs.c:2888 utils/adt/arrayfuncs.c:5871 -#: utils/adt/arrayfuncs.c:5897 utils/adt/arrayfuncs.c:5908 -#: utils/adt/json.c:1141 utils/adt/json.c:1215 utils/adt/jsonb.c:1315 -#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4325 utils/adt/jsonfuncs.c:4479 -#: utils/adt/jsonfuncs.c:4591 utils/adt/jsonfuncs.c:4640 +#: utils/adt/arrayfuncs.c:2245 utils/adt/arrayfuncs.c:2267 +#: utils/adt/arrayfuncs.c:2316 utils/adt/arrayfuncs.c:2570 +#: utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6094 +#: utils/adt/arrayfuncs.c:6120 utils/adt/arrayfuncs.c:6131 +#: utils/adt/json.c:1433 utils/adt/json.c:1505 utils/adt/jsonb.c:1317 +#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4710 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4974 utils/adt/jsonfuncs.c:5022 #, c-format msgid "wrong number of array subscripts" msgstr "неверное чиÑло индекÑов маÑÑива" -#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 -#: utils/adt/arrayfuncs.c:2633 utils/adt/arrayfuncs.c:2947 +#: utils/adt/arrayfuncs.c:2250 utils/adt/arrayfuncs.c:2374 +#: utils/adt/arrayfuncs.c:2653 utils/adt/arrayfuncs.c:2990 #, c-format msgid "array subscript out of range" msgstr "Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð°ÑÑива вне диапазона" -#: utils/adt/arrayfuncs.c:2266 +#: utils/adt/arrayfuncs.c:2255 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ñвоить значение null Ñлементу маÑÑива фикÑированной длины" -#: utils/adt/arrayfuncs.c:2835 +#: utils/adt/arrayfuncs.c:2855 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñрезах маÑÑивов фикÑированной длины не поддерживаютÑÑ" -#: utils/adt/arrayfuncs.c:2866 +#: utils/adt/arrayfuncs.c:2886 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "в указании Ñреза маÑÑива должны быть заданы обе границы" -#: utils/adt/arrayfuncs.c:2867 +#: utils/adt/arrayfuncs.c:2887 #, c-format msgid "" "When assigning to a slice of an empty array value, slice boundaries must be " @@ -25436,90 +27319,85 @@ msgstr "" "При приÑвоении значений Ñрезу в пуÑтом маÑÑиве, должны полноÑтью задаватьÑÑ " "обе границы." -#: utils/adt/arrayfuncs.c:2878 utils/adt/arrayfuncs.c:2974 +#: utils/adt/arrayfuncs.c:2905 utils/adt/arrayfuncs.c:3017 #, c-format msgid "source array too small" msgstr "иÑходный маÑÑив Ñлишком мал" -#: utils/adt/arrayfuncs.c:3529 +#: utils/adt/arrayfuncs.c:3657 #, c-format msgid "null array element not allowed in this context" msgstr "Ñлемент маÑÑива null недопуÑтим в данном контекÑте" -#: utils/adt/arrayfuncs.c:3631 utils/adt/arrayfuncs.c:3802 -#: utils/adt/arrayfuncs.c:4193 +#: utils/adt/arrayfuncs.c:3828 utils/adt/arrayfuncs.c:3999 +#: utils/adt/arrayfuncs.c:4390 #, c-format msgid "cannot compare arrays of different element types" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ñравнивать маÑÑивы Ñ Ñлементами разных типов" -#: utils/adt/arrayfuncs.c:3980 utils/adt/multirangetypes.c:2799 -#: utils/adt/multirangetypes.c:2871 utils/adt/rangetypes.c:1343 -#: utils/adt/rangetypes.c:1407 utils/adt/rowtypes.c:1858 +#: utils/adt/arrayfuncs.c:4177 utils/adt/multirangetypes.c:2805 +#: utils/adt/multirangetypes.c:2877 utils/adt/rangetypes.c:1361 +#: utils/adt/rangetypes.c:1425 utils/adt/rowtypes.c:1875 #, c-format msgid "could not identify a hash function for type %s" msgstr "не удалоÑÑŒ найти функцию Ñ…ÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s" -#: utils/adt/arrayfuncs.c:4108 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4305 utils/adt/rowtypes.c:1996 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "не удалоÑÑŒ найти функцию раÑширенного Ñ…ÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s" -#: utils/adt/arrayfuncs.c:5285 +#: utils/adt/arrayfuncs.c:5506 #, c-format msgid "data type %s is not an array type" msgstr "тип данных %s не ÑвлÑетÑÑ Ñ‚Ð¸Ð¿Ð¾Ð¼ маÑÑива" -#: utils/adt/arrayfuncs.c:5340 +#: utils/adt/arrayfuncs.c:5561 #, c-format msgid "cannot accumulate null arrays" msgstr "аккумулировать NULL-маÑÑивы нельзÑ" -#: utils/adt/arrayfuncs.c:5368 +#: utils/adt/arrayfuncs.c:5589 #, c-format msgid "cannot accumulate empty arrays" msgstr "аккумулировать пуÑтые маÑÑивы нельзÑ" -#: utils/adt/arrayfuncs.c:5395 utils/adt/arrayfuncs.c:5401 -#, c-format -msgid "cannot accumulate arrays of different dimensionality" -msgstr "аккумулировать маÑÑивы различной размерноÑти нельзÑ" - -#: utils/adt/arrayfuncs.c:5769 utils/adt/arrayfuncs.c:5809 +#: utils/adt/arrayfuncs.c:5992 utils/adt/arrayfuncs.c:6032 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "маÑÑив размерноÑтей или маÑÑив нижних границ не может быть null" -#: utils/adt/arrayfuncs.c:5872 utils/adt/arrayfuncs.c:5898 +#: utils/adt/arrayfuncs.c:6095 utils/adt/arrayfuncs.c:6121 #, c-format msgid "Dimension array must be one dimensional." msgstr "МаÑÑив размерноÑтей должен быть одномерным." -#: utils/adt/arrayfuncs.c:5877 utils/adt/arrayfuncs.c:5903 +#: utils/adt/arrayfuncs.c:6100 utils/adt/arrayfuncs.c:6126 #, c-format msgid "dimension values cannot be null" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð½Ð¾Ñтей не могут быть null" -#: utils/adt/arrayfuncs.c:5909 +#: utils/adt/arrayfuncs.c:6132 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "МаÑÑив нижних границ и маÑÑив размерноÑтей имеют разные размеры." -#: utils/adt/arrayfuncs.c:6187 +#: utils/adt/arrayfuncs.c:6413 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "удаление Ñлементов из многомерных маÑÑивов не поддерживаетÑÑ" -#: utils/adt/arrayfuncs.c:6464 +#: utils/adt/arrayfuncs.c:6690 #, c-format msgid "thresholds must be one-dimensional array" msgstr "границы должны задаватьÑÑ Ð¾Ð´Ð½Ð¾Ð¼ÐµÑ€Ð½Ñ‹Ð¼ маÑÑивом" -#: utils/adt/arrayfuncs.c:6469 +#: utils/adt/arrayfuncs.c:6695 #, c-format msgid "thresholds array must not contain NULLs" msgstr "маÑÑив границ не должен Ñодержать NULL" -#: utils/adt/arrayfuncs.c:6702 +#: utils/adt/arrayfuncs.c:6928 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "чиÑло удалÑемых Ñлементов должно быть от 0 до %d" @@ -25539,237 +27417,264 @@ msgstr "Ð¸Ð½Ð´ÐµÐºÑ Ñлемента маÑÑива в приÑваивании msgid "array lower bound is too large: %d" msgstr "нижнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° маÑÑива Ñлишком велика: %d" -#: utils/adt/arrayutils.c:240 +#: utils/adt/arrayutils.c:242 #, c-format msgid "typmod array must be type cstring[]" msgstr "маÑÑив typmod должен иметь тип cstring[]" -#: utils/adt/arrayutils.c:245 +#: utils/adt/arrayutils.c:247 #, c-format msgid "typmod array must be one-dimensional" msgstr "маÑÑив typmod должен быть одномерным" -#: utils/adt/arrayutils.c:250 +#: utils/adt/arrayutils.c:252 #, c-format msgid "typmod array must not contain nulls" msgstr "маÑÑив typmod не должен Ñодержать Ñлементы null" -#: utils/adt/ascii.c:76 +#: utils/adt/ascii.c:77 #, c-format msgid "encoding conversion from %s to ASCII not supported" msgstr "преобразование кодировки из %s в ASCII не поддерживаетÑÑ" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:276 utils/adt/datetime.c:4058 -#: utils/adt/float.c:188 utils/adt/float.c:272 utils/adt/float.c:284 -#: utils/adt/float.c:401 utils/adt/float.c:486 utils/adt/float.c:502 -#: utils/adt/geo_ops.c:220 utils/adt/geo_ops.c:230 utils/adt/geo_ops.c:242 -#: utils/adt/geo_ops.c:274 utils/adt/geo_ops.c:316 utils/adt/geo_ops.c:326 -#: utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1389 utils/adt/geo_ops.c:1424 -#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3392 utils/adt/geo_ops.c:4607 -#: utils/adt/geo_ops.c:4622 utils/adt/geo_ops.c:4629 utils/adt/int.c:173 -#: utils/adt/int.c:185 utils/adt/jsonpath.c:182 utils/adt/mac.c:93 -#: utils/adt/mac8.c:93 utils/adt/mac8.c:166 utils/adt/mac8.c:184 -#: utils/adt/mac8.c:202 utils/adt/mac8.c:221 utils/adt/network.c:99 -#: utils/adt/numeric.c:698 utils/adt/numeric.c:717 utils/adt/numeric.c:6882 -#: utils/adt/numeric.c:6906 utils/adt/numeric.c:6930 utils/adt/numeric.c:7932 -#: utils/adt/numutils.c:158 utils/adt/numutils.c:234 utils/adt/numutils.c:318 -#: utils/adt/oid.c:44 utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 -#: utils/adt/pg_lsn.c:74 utils/adt/tid.c:76 utils/adt/tid.c:84 -#: utils/adt/tid.c:98 utils/adt/tid.c:107 utils/adt/timestamp.c:497 -#: utils/adt/uuid.c:135 utils/adt/xid8funcs.c:346 +#: utils/adt/bool.c:149 utils/adt/cash.c:354 utils/adt/datetime.c:4142 +#: utils/adt/float.c:200 utils/adt/float.c:287 utils/adt/float.c:301 +#: utils/adt/float.c:406 utils/adt/float.c:489 utils/adt/float.c:503 +#: utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 +#: utils/adt/geo_ops.c:1417 utils/adt/geo_ops.c:1454 utils/adt/geo_ops.c:1462 +#: utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 +#: utils/adt/geo_ops.c:4672 utils/adt/int.c:174 utils/adt/int.c:186 +#: utils/adt/jsonpath.c:185 utils/adt/mac.c:94 utils/adt/mac8.c:226 +#: utils/adt/network.c:99 utils/adt/numeric.c:803 utils/adt/numeric.c:7221 +#: utils/adt/numeric.c:7424 utils/adt/numeric.c:8371 utils/adt/numutils.c:356 +#: utils/adt/numutils.c:618 utils/adt/numutils.c:880 utils/adt/numutils.c:919 +#: utils/adt/numutils.c:941 utils/adt/numutils.c:1005 utils/adt/numutils.c:1027 +#: utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 +#: utils/adt/tid.c:94 utils/adt/tid.c:103 utils/adt/timestamp.c:510 +#: utils/adt/uuid.c:140 utils/adt/xid8funcs.c:323 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "неверный ÑинтакÑÐ¸Ñ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s: \"%s\"" -#: utils/adt/cash.c:214 utils/adt/cash.c:239 utils/adt/cash.c:249 -#: utils/adt/cash.c:289 utils/adt/int.c:179 utils/adt/numutils.c:152 -#: utils/adt/numutils.c:228 utils/adt/numutils.c:312 utils/adt/oid.c:70 -#: utils/adt/oid.c:109 +#: utils/adt/cash.c:98 utils/adt/cash.c:111 utils/adt/cash.c:124 +#: utils/adt/cash.c:137 utils/adt/cash.c:150 #, c-format -msgid "value \"%s\" is out of range for type %s" -msgstr "значение \"%s\" вне диапазона Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s" +msgid "money out of range" +msgstr "денежное значение вне диапазона" -#: utils/adt/cash.c:651 utils/adt/cash.c:701 utils/adt/cash.c:752 -#: utils/adt/cash.c:801 utils/adt/cash.c:853 utils/adt/cash.c:903 -#: utils/adt/float.c:105 utils/adt/int.c:842 utils/adt/int.c:958 -#: utils/adt/int.c:1038 utils/adt/int.c:1100 utils/adt/int.c:1138 -#: utils/adt/int.c:1166 utils/adt/int8.c:515 utils/adt/int8.c:573 -#: utils/adt/int8.c:943 utils/adt/int8.c:1023 utils/adt/int8.c:1085 -#: utils/adt/int8.c:1165 utils/adt/numeric.c:3093 utils/adt/numeric.c:3116 -#: utils/adt/numeric.c:3201 utils/adt/numeric.c:3219 utils/adt/numeric.c:3315 -#: utils/adt/numeric.c:8481 utils/adt/numeric.c:8771 utils/adt/numeric.c:9096 -#: utils/adt/numeric.c:10553 utils/adt/timestamp.c:3337 +#: utils/adt/cash.c:161 utils/adt/cash.c:723 utils/adt/float.c:99 +#: utils/adt/int.c:843 utils/adt/int.c:959 utils/adt/int.c:1039 +#: utils/adt/int.c:1101 utils/adt/int.c:1139 utils/adt/int.c:1167 +#: utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:942 +#: utils/adt/int8.c:1022 utils/adt/int8.c:1084 utils/adt/int8.c:1164 +#: utils/adt/numeric.c:3191 utils/adt/numeric.c:3214 utils/adt/numeric.c:3299 +#: utils/adt/numeric.c:3317 utils/adt/numeric.c:3413 utils/adt/numeric.c:8920 +#: utils/adt/numeric.c:9233 utils/adt/numeric.c:9581 utils/adt/numeric.c:9697 +#: utils/adt/numeric.c:11208 utils/adt/timestamp.c:3713 #, c-format msgid "division by zero" msgstr "деление на ноль" -#: utils/adt/char.c:196 +#: utils/adt/cash.c:292 utils/adt/cash.c:317 utils/adt/cash.c:327 +#: utils/adt/cash.c:367 utils/adt/int.c:180 utils/adt/numutils.c:350 +#: utils/adt/numutils.c:612 utils/adt/numutils.c:874 utils/adt/numutils.c:925 +#: utils/adt/numutils.c:964 utils/adt/numutils.c:1011 +#, c-format +msgid "value \"%s\" is out of range for type %s" +msgstr "значение \"%s\" вне диапазона Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s" + +#: utils/adt/char.c:197 #, c-format msgid "\"char\" out of range" msgstr "значение \"char\" вне диапазона" -#: utils/adt/cryptohashfuncs.c:47 utils/adt/cryptohashfuncs.c:69 +#: utils/adt/cryptohashfuncs.c:48 utils/adt/cryptohashfuncs.c:70 #, c-format msgid "could not compute %s hash: %s" msgstr "не удалоÑÑŒ вычиÑлить хеш %s: %s" -#: utils/adt/date.c:63 utils/adt/timestamp.c:98 utils/adt/varbit.c:105 +#: utils/adt/date.c:64 utils/adt/timestamp.c:116 utils/adt/varbit.c:105 #: utils/adt/varchar.c:48 #, c-format msgid "invalid type modifier" msgstr "неверный модификатор типа" -#: utils/adt/date.c:75 +#: utils/adt/date.c:76 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "TIME(%d)%s: точноÑть должна быть неотрицательной" -#: utils/adt/date.c:81 +#: utils/adt/date.c:82 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%s: точноÑть уменьшена до дозволенного макÑимума: %d" -#: utils/adt/date.c:160 utils/adt/date.c:168 utils/adt/formatting.c:4299 -#: utils/adt/formatting.c:4308 utils/adt/formatting.c:4414 -#: utils/adt/formatting.c:4424 +#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4424 +#: utils/adt/formatting.c:4433 utils/adt/formatting.c:4538 +#: utils/adt/formatting.c:4548 #, c-format msgid "date out of range: \"%s\"" msgstr "дата вне диапазона: \"%s\"" -#: utils/adt/date.c:215 utils/adt/date.c:513 utils/adt/date.c:537 -#: utils/adt/xml.c:2209 +#: utils/adt/date.c:222 utils/adt/date.c:520 utils/adt/date.c:544 +#: utils/adt/rangetypes.c:1584 utils/adt/rangetypes.c:1599 utils/adt/xml.c:2552 #, c-format msgid "date out of range" msgstr "дата вне диапазона" -#: utils/adt/date.c:261 utils/adt/timestamp.c:581 +#: utils/adt/date.c:268 utils/adt/timestamp.c:598 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "значение Ð¿Ð¾Ð»Ñ Ñ‚Ð¸Ð¿Ð° date вне диапазона: %d-%02d-%02d" -#: utils/adt/date.c:268 utils/adt/date.c:277 utils/adt/timestamp.c:587 +#: utils/adt/date.c:275 utils/adt/date.c:284 utils/adt/timestamp.c:604 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "дата вне диапазона: %d-%02d-%02d" -#: utils/adt/date.c:488 +#: utils/adt/date.c:495 #, c-format msgid "cannot subtract infinite dates" msgstr "вычитать беÑконечные даты нельзÑ" -#: utils/adt/date.c:586 utils/adt/date.c:649 utils/adt/date.c:685 -#: utils/adt/date.c:2868 utils/adt/date.c:2878 +#: utils/adt/date.c:593 utils/adt/date.c:656 utils/adt/date.c:692 +#: utils/adt/date.c:2906 utils/adt/date.c:2916 #, c-format msgid "date out of range for timestamp" msgstr "дата вне диапазона Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° timestamp" -#: utils/adt/date.c:1115 utils/adt/date.c:1198 utils/adt/date.c:1214 -#: utils/adt/date.c:2195 utils/adt/date.c:2973 utils/adt/timestamp.c:4032 -#: utils/adt/timestamp.c:4225 utils/adt/timestamp.c:4397 -#: utils/adt/timestamp.c:4650 utils/adt/timestamp.c:4851 -#: utils/adt/timestamp.c:4898 utils/adt/timestamp.c:5122 -#: utils/adt/timestamp.c:5169 utils/adt/timestamp.c:5299 +#: utils/adt/date.c:1122 utils/adt/date.c:1205 utils/adt/date.c:1221 +#: utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4726 +#: utils/adt/timestamp.c:4941 utils/adt/timestamp.c:5089 +#: utils/adt/timestamp.c:5342 utils/adt/timestamp.c:5543 +#: utils/adt/timestamp.c:5590 utils/adt/timestamp.c:5814 +#: utils/adt/timestamp.c:5861 utils/adt/timestamp.c:5941 +#: utils/adt/timestamp.c:6070 #, c-format msgid "unit \"%s\" not supported for type %s" msgstr "единица \"%s\" Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s не поддерживаетÑÑ" -#: utils/adt/date.c:1223 utils/adt/date.c:2211 utils/adt/date.c:2993 -#: utils/adt/timestamp.c:4046 utils/adt/timestamp.c:4242 -#: utils/adt/timestamp.c:4411 utils/adt/timestamp.c:4610 -#: utils/adt/timestamp.c:4907 utils/adt/timestamp.c:5178 -#: utils/adt/timestamp.c:5360 +#: utils/adt/date.c:1230 utils/adt/date.c:2231 utils/adt/date.c:3031 +#: utils/adt/timestamp.c:4740 utils/adt/timestamp.c:4958 +#: utils/adt/timestamp.c:5103 utils/adt/timestamp.c:5302 +#: utils/adt/timestamp.c:5599 utils/adt/timestamp.c:5870 +#: utils/adt/timestamp.c:5911 utils/adt/timestamp.c:6131 #, c-format msgid "unit \"%s\" not recognized for type %s" msgstr "единица \"%s\" Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s не раÑпознана" -#: utils/adt/date.c:1307 utils/adt/date.c:1353 utils/adt/date.c:1907 -#: utils/adt/date.c:1938 utils/adt/date.c:1967 utils/adt/date.c:2831 -#: utils/adt/date.c:3078 utils/adt/datetime.c:420 utils/adt/datetime.c:1869 -#: utils/adt/formatting.c:4141 utils/adt/formatting.c:4177 -#: utils/adt/formatting.c:4268 utils/adt/formatting.c:4390 utils/adt/json.c:418 -#: utils/adt/json.c:457 utils/adt/timestamp.c:225 utils/adt/timestamp.c:257 -#: utils/adt/timestamp.c:699 utils/adt/timestamp.c:708 -#: utils/adt/timestamp.c:786 utils/adt/timestamp.c:819 -#: utils/adt/timestamp.c:2916 utils/adt/timestamp.c:2937 -#: utils/adt/timestamp.c:2950 utils/adt/timestamp.c:2959 -#: utils/adt/timestamp.c:2967 utils/adt/timestamp.c:3022 -#: utils/adt/timestamp.c:3045 utils/adt/timestamp.c:3058 -#: utils/adt/timestamp.c:3069 utils/adt/timestamp.c:3077 -#: utils/adt/timestamp.c:3736 utils/adt/timestamp.c:3860 -#: utils/adt/timestamp.c:3950 utils/adt/timestamp.c:4040 -#: utils/adt/timestamp.c:4133 utils/adt/timestamp.c:4236 -#: utils/adt/timestamp.c:4715 utils/adt/timestamp.c:4989 -#: utils/adt/timestamp.c:5439 utils/adt/timestamp.c:5453 -#: utils/adt/timestamp.c:5458 utils/adt/timestamp.c:5472 -#: utils/adt/timestamp.c:5505 utils/adt/timestamp.c:5592 -#: utils/adt/timestamp.c:5633 utils/adt/timestamp.c:5637 -#: utils/adt/timestamp.c:5706 utils/adt/timestamp.c:5710 -#: utils/adt/timestamp.c:5724 utils/adt/timestamp.c:5758 utils/adt/xml.c:2231 -#: utils/adt/xml.c:2238 utils/adt/xml.c:2258 utils/adt/xml.c:2265 +#: utils/adt/date.c:1314 utils/adt/date.c:1360 utils/adt/date.c:1919 +#: utils/adt/date.c:1950 utils/adt/date.c:1979 utils/adt/date.c:2869 +#: utils/adt/date.c:3101 utils/adt/datetime.c:422 utils/adt/datetime.c:1807 +#: utils/adt/formatting.c:4269 utils/adt/formatting.c:4305 +#: utils/adt/formatting.c:4392 utils/adt/formatting.c:4514 utils/adt/json.c:366 +#: utils/adt/json.c:405 utils/adt/timestamp.c:248 utils/adt/timestamp.c:280 +#: utils/adt/timestamp.c:716 utils/adt/timestamp.c:725 +#: utils/adt/timestamp.c:803 utils/adt/timestamp.c:836 +#: utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3075 +#: utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3097 +#: utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3129 +#: utils/adt/timestamp.c:3140 utils/adt/timestamp.c:3146 +#: utils/adt/timestamp.c:3152 utils/adt/timestamp.c:3157 +#: utils/adt/timestamp.c:3210 utils/adt/timestamp.c:3219 +#: utils/adt/timestamp.c:3240 utils/adt/timestamp.c:3245 +#: utils/adt/timestamp.c:3266 utils/adt/timestamp.c:3279 +#: utils/adt/timestamp.c:3293 utils/adt/timestamp.c:3301 +#: utils/adt/timestamp.c:3307 utils/adt/timestamp.c:3312 +#: utils/adt/timestamp.c:4380 utils/adt/timestamp.c:4532 +#: utils/adt/timestamp.c:4608 utils/adt/timestamp.c:4644 +#: utils/adt/timestamp.c:4734 utils/adt/timestamp.c:4813 +#: utils/adt/timestamp.c:4849 utils/adt/timestamp.c:4952 +#: utils/adt/timestamp.c:5407 utils/adt/timestamp.c:5681 +#: utils/adt/timestamp.c:6199 utils/adt/timestamp.c:6209 +#: utils/adt/timestamp.c:6214 utils/adt/timestamp.c:6220 +#: utils/adt/timestamp.c:6260 utils/adt/timestamp.c:6347 +#: utils/adt/timestamp.c:6388 utils/adt/timestamp.c:6392 +#: utils/adt/timestamp.c:6446 utils/adt/timestamp.c:6450 +#: utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2574 +#: utils/adt/xml.c:2581 utils/adt/xml.c:2601 utils/adt/xml.c:2608 #, c-format msgid "timestamp out of range" msgstr "timestamp вне диапазона" -#: utils/adt/date.c:1524 utils/adt/date.c:2326 utils/adt/formatting.c:4476 +#: utils/adt/date.c:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4597 #, c-format msgid "time out of range" msgstr "Ð²Ñ€ÐµÐ¼Ñ Ð²Ð½Ðµ диапазона" -#: utils/adt/date.c:1576 utils/adt/timestamp.c:596 +#: utils/adt/date.c:1588 utils/adt/timestamp.c:613 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "значение Ð¿Ð¾Ð»Ñ Ñ‚Ð¸Ð¿Ð° time вне диапазона: %d:%02d:%02g" -#: utils/adt/date.c:2096 utils/adt/date.c:2630 utils/adt/float.c:1048 -#: utils/adt/float.c:1124 utils/adt/int.c:634 utils/adt/int.c:681 -#: utils/adt/int.c:716 utils/adt/int8.c:414 utils/adt/numeric.c:2497 -#: utils/adt/timestamp.c:3386 utils/adt/timestamp.c:3417 -#: utils/adt/timestamp.c:3448 +#: utils/adt/date.c:2020 #, c-format -msgid "invalid preceding or following size in window function" -msgstr "неверное Ñмещение PRECEDING или FOLLOWING в оконной функции" +msgid "cannot convert infinite interval to time" +msgstr "беÑконечный интервал Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð²ÐµÑти к типу time" -#: utils/adt/date.c:2334 +#: utils/adt/date.c:2061 utils/adt/date.c:2605 #, c-format -msgid "time zone displacement out of range" -msgstr "Ñмещение чаÑового поÑÑа вне диапазона" +msgid "cannot add infinite interval to time" +msgstr "беÑконечный интервал Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ к значению time" -#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 -#: utils/adt/datetime.c:4906 utils/adt/timestamp.c:516 -#: utils/adt/timestamp.c:543 utils/adt/timestamp.c:4319 -#: utils/adt/timestamp.c:5464 utils/adt/timestamp.c:5716 +#: utils/adt/date.c:2084 utils/adt/date.c:2632 #, c-format -msgid "time zone \"%s\" not recognized" -msgstr "чаÑовой поÑÑ \"%s\" не раÑпознан" +msgid "cannot subtract infinite interval from time" +msgstr "беÑконечный интервал Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ñ‡ÐµÑть из Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ time" + +#: utils/adt/date.c:2115 utils/adt/date.c:2667 utils/adt/float.c:1036 +#: utils/adt/float.c:1112 utils/adt/int.c:635 utils/adt/int.c:682 +#: utils/adt/int.c:717 utils/adt/int8.c:413 utils/adt/numeric.c:2595 +#: utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 +#: utils/adt/timestamp.c:3888 +#, c-format +msgid "invalid preceding or following size in window function" +msgstr "неверное Ñмещение PRECEDING или FOLLOWING в оконной функции" + +#: utils/adt/date.c:2360 +#, c-format +msgid "time zone displacement out of range" +msgstr "Ñмещение чаÑового поÑÑа вне диапазона" + +#: utils/adt/date.c:3132 utils/adt/timestamp.c:6242 utils/adt/timestamp.c:6479 +#, c-format +msgid "interval time zone \"%s\" must be finite" +msgstr "задающий чаÑовой поÑÑ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð» \"%s\" должен быть конечным" -#: utils/adt/date.c:3116 utils/adt/timestamp.c:5494 utils/adt/timestamp.c:5747 +#: utils/adt/date.c:3139 utils/adt/timestamp.c:6249 utils/adt/timestamp.c:6486 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "" "интервал \"%s\", задающий чаÑовой поÑÑ, не должен Ñодержать дней или меÑÑцев" -#: utils/adt/datetime.c:4031 utils/adt/datetime.c:4038 +#: utils/adt/datetime.c:3232 utils/adt/datetime.c:4127 +#: utils/adt/datetime.c:4133 utils/adt/timestamp.c:528 +#, c-format +msgid "time zone \"%s\" not recognized" +msgstr "чаÑовой поÑÑ \"%s\" не раÑпознан" + +#: utils/adt/datetime.c:4101 utils/adt/datetime.c:4108 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "значение Ð¿Ð¾Ð»Ñ Ñ‚Ð¸Ð¿Ð° date/time вне диапазона: \"%s\"" -#: utils/adt/datetime.c:4040 +#: utils/adt/datetime.c:4110 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Возможно, вам нужно изменить наÑтройку \"datestyle\"." -#: utils/adt/datetime.c:4045 +#: utils/adt/datetime.c:4115 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "значение Ð¿Ð¾Ð»Ñ interval вне диапазона: \"%s\"" -#: utils/adt/datetime.c:4051 +#: utils/adt/datetime.c:4121 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "Ñмещение чаÑового поÑÑа вне диапазона: \"%s\"" -#: utils/adt/datetime.c:4908 +#: utils/adt/datetime.c:4135 #, c-format msgid "" "This time zone name appears in the configuration file for time zone " @@ -25783,78 +27688,79 @@ msgstr "" msgid "invalid Datum pointer" msgstr "неверный указатель Datum" -#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 +#: utils/adt/dbsize.c:764 utils/adt/dbsize.c:840 #, c-format msgid "invalid size: \"%s\"" msgstr "Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð²ÐµÐ»Ð¸Ñ‡Ð¸Ð½Ð°: \"%s\"" -#: utils/adt/dbsize.c:814 +#: utils/adt/dbsize.c:841 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð° Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð²ÐµÐ»Ð¸Ñ‡Ð¸Ð½Ñ‹: \"%s\"." -#: utils/adt/dbsize.c:815 +#: utils/adt/dbsize.c:842 #, c-format -msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." +msgid "" +"Valid units are \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." msgstr "" -"ДопуÑтимые единицы измерениÑ: \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\" и " -"\"PB\"." +"ДопуÑтимые единицы измерениÑ: \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", " +"\"TB\" и \"PB\"." -#: utils/adt/domains.c:92 +#: utils/adt/domains.c:95 #, c-format msgid "type %s is not a domain" msgstr "тип \"%s\" не ÑвлÑетÑÑ Ð´Ð¾Ð¼ÐµÐ½Ð¾Ð¼" -#: utils/adt/encode.c:65 utils/adt/encode.c:113 +#: utils/adt/encode.c:66 utils/adt/encode.c:114 #, c-format msgid "unrecognized encoding: \"%s\"" msgstr "нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ°: \"%s\"" -#: utils/adt/encode.c:79 +#: utils/adt/encode.c:80 #, c-format msgid "result of encoding conversion is too large" msgstr "результат ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñлишком объёмный" -#: utils/adt/encode.c:127 +#: utils/adt/encode.c:128 #, c-format msgid "result of decoding conversion is too large" msgstr "результат Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñлишком объёмный" -#: utils/adt/encode.c:186 +#: utils/adt/encode.c:217 utils/adt/encode.c:227 #, c-format msgid "invalid hexadecimal digit: \"%.*s\"" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑˆÐµÑÑ‚Ð½Ð°Ð´Ñ†Ð°Ñ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ Ñ†Ð¸Ñ„Ñ€Ð°: \"%.*s\"" -#: utils/adt/encode.c:216 +#: utils/adt/encode.c:223 #, c-format msgid "invalid hexadecimal data: odd number of digits" msgstr "неверные шеÑтнадцатеричные данные: нечётное чиÑло цифр" -#: utils/adt/encode.c:334 +#: utils/adt/encode.c:344 #, c-format msgid "unexpected \"=\" while decoding base64 sequence" msgstr "неожиданный знак \"=\" при декодировании base64" -#: utils/adt/encode.c:346 +#: utils/adt/encode.c:356 #, c-format msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" msgstr "при декодировании base64 обнаружен неверный Ñимвол \"%.*s\"" -#: utils/adt/encode.c:367 +#: utils/adt/encode.c:377 #, c-format msgid "invalid base64 end sequence" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð¾ÑледовательноÑть base64" -#: utils/adt/encode.c:368 +#: utils/adt/encode.c:378 #, c-format msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "" "Входные данные лишены выравниваниÑ, обрезаны или повреждены иным образом." -#: utils/adt/encode.c:482 utils/adt/encode.c:547 utils/adt/jsonfuncs.c:629 -#: utils/adt/varlena.c:335 utils/adt/varlena.c:376 jsonpath_gram.y:529 -#: jsonpath_scan.l:515 jsonpath_scan.l:526 jsonpath_scan.l:536 -#: jsonpath_scan.l:578 +#: utils/adt/encode.c:492 utils/adt/encode.c:557 utils/adt/jsonfuncs.c:659 +#: utils/adt/varlena.c:333 utils/adt/varlena.c:374 jsonpath_gram.y:266 +#: jsonpath_gram.y:598 jsonpath_scan.l:640 jsonpath_scan.l:651 +#: jsonpath_scan.l:661 jsonpath_scan.l:712 #, c-format msgid "invalid input syntax for type %s" msgstr "неверный ÑинтакÑÐ¸Ñ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s" @@ -25870,227 +27776,222 @@ msgid "New enum values must be committed before they can be used." msgstr "" "Ðовые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÑ‡Ð¸ÑÐ»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ быть зафикÑированы перед иÑпользованием." -#: utils/adt/enum.c:120 utils/adt/enum.c:130 utils/adt/enum.c:188 -#: utils/adt/enum.c:198 +#: utils/adt/enum.c:121 utils/adt/enum.c:131 utils/adt/enum.c:194 +#: utils/adt/enum.c:204 #, c-format msgid "invalid input value for enum %s: \"%s\"" msgstr "неверное значение Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ‡Ð¸ÑÐ»ÐµÐ½Ð¸Ñ %s: \"%s\"" -#: utils/adt/enum.c:160 utils/adt/enum.c:226 utils/adt/enum.c:285 +#: utils/adt/enum.c:166 utils/adt/enum.c:232 utils/adt/enum.c:291 #, c-format msgid "invalid internal value for enum: %u" msgstr "неверное внутреннее значение Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ‡Ð¸ÑлениÑ: %u" -#: utils/adt/enum.c:445 utils/adt/enum.c:474 utils/adt/enum.c:514 -#: utils/adt/enum.c:534 +#: utils/adt/enum.c:451 utils/adt/enum.c:480 utils/adt/enum.c:520 +#: utils/adt/enum.c:540 #, c-format msgid "could not determine actual enum type" msgstr "не удалоÑÑŒ определить фактичеÑкий тип перечиÑлениÑ" -#: utils/adt/enum.c:453 utils/adt/enum.c:482 +#: utils/adt/enum.c:459 utils/adt/enum.c:488 #, c-format msgid "enum %s contains no values" msgstr "перечиÑление %s не Ñодержит значений" -#: utils/adt/float.c:89 +#: utils/adt/float.c:83 #, c-format msgid "value out of range: overflow" msgstr "значение вне диапазона: переполнение" -#: utils/adt/float.c:97 +#: utils/adt/float.c:91 #, c-format msgid "value out of range: underflow" msgstr "значение вне диапазона: антипереполнение" -#: utils/adt/float.c:266 +#: utils/adt/float.c:280 #, c-format msgid "\"%s\" is out of range for type real" msgstr "\"%s\" вне диапазона Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° real" -#: utils/adt/float.c:478 +#: utils/adt/float.c:482 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "\"%s\" вне диапазона Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° double precision" -#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:354 -#: utils/adt/int.c:892 utils/adt/int.c:914 utils/adt/int.c:928 -#: utils/adt/int.c:942 utils/adt/int.c:974 utils/adt/int.c:1212 -#: utils/adt/int8.c:1278 utils/adt/numeric.c:4405 utils/adt/numeric.c:4410 +#: utils/adt/float.c:1247 utils/adt/float.c:1321 utils/adt/int.c:355 +#: utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 +#: utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 +#: utils/adt/int8.c:1277 utils/adt/numeric.c:4593 utils/adt/numeric.c:4598 #, c-format msgid "smallint out of range" msgstr "smallint вне диапазона" -#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9510 +#: utils/adt/float.c:1447 utils/adt/numeric.c:3709 utils/adt/numeric.c:10112 #, c-format msgid "cannot take square root of a negative number" msgstr "извлечь квадратный корень отрицательного чиÑла нельзÑ" -#: utils/adt/float.c:1527 utils/adt/numeric.c:3886 utils/adt/numeric.c:3998 +#: utils/adt/float.c:1515 utils/adt/numeric.c:3997 utils/adt/numeric.c:4109 #, c-format msgid "zero raised to a negative power is undefined" msgstr "ноль в отрицательной Ñтепени даёт неопределённоÑть" -#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10406 +#: utils/adt/float.c:1519 utils/adt/numeric.c:4001 utils/adt/numeric.c:11003 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "отрицательное чиÑло в дробной Ñтепени даёт комплекÑный результат" -#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 -#: utils/adt/numeric.c:10181 +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3909 +#: utils/adt/numeric.c:10783 #, c-format msgid "cannot take logarithm of zero" msgstr "вычиÑлить логарифм Ð½ÑƒÐ»Ñ Ð½ÐµÐ»ÑŒÐ·Ñ" -#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 -#: utils/adt/numeric.c:3793 utils/adt/numeric.c:10185 +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3847 +#: utils/adt/numeric.c:3904 utils/adt/numeric.c:10787 #, c-format msgid "cannot take logarithm of a negative number" msgstr "вычиÑлить логарифм отрицательного чиÑла нельзÑ" -#: utils/adt/float.c:1777 utils/adt/float.c:1808 utils/adt/float.c:1903 -#: utils/adt/float.c:1930 utils/adt/float.c:1958 utils/adt/float.c:1985 -#: utils/adt/float.c:2132 utils/adt/float.c:2169 utils/adt/float.c:2339 -#: utils/adt/float.c:2395 utils/adt/float.c:2460 utils/adt/float.c:2517 -#: utils/adt/float.c:2708 utils/adt/float.c:2732 +#: utils/adt/float.c:1765 utils/adt/float.c:1796 utils/adt/float.c:1891 +#: utils/adt/float.c:1918 utils/adt/float.c:1946 utils/adt/float.c:1973 +#: utils/adt/float.c:2120 utils/adt/float.c:2157 utils/adt/float.c:2327 +#: utils/adt/float.c:2383 utils/adt/float.c:2448 utils/adt/float.c:2505 +#: utils/adt/float.c:2696 utils/adt/float.c:2720 #, c-format msgid "input is out of range" msgstr "введённое значение вне диапазона" -#: utils/adt/float.c:2796 -#, c-format -msgid "setseed parameter %g is out of allowed range [-1,1]" -msgstr "параметр setseed %g вне допуÑтимого диапазона [-1,1]" - -#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 +#: utils/adt/float.c:4000 utils/adt/numeric.c:1857 #, c-format msgid "count must be greater than zero" msgstr "Ñчётчик должен быть больше нулÑ" -#: utils/adt/float.c:4029 utils/adt/numeric.c:1781 +#: utils/adt/float.c:4005 utils/adt/numeric.c:1868 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "операнд, нижнÑÑ Ð¸ верхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ‹ не могут быть NaN" -#: utils/adt/float.c:4035 utils/adt/numeric.c:1786 +#: utils/adt/float.c:4011 utils/adt/numeric.c:1873 #, c-format msgid "lower and upper bounds must be finite" msgstr "нижнÑÑ Ð¸ верхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ‹ должны быть конечными" -#: utils/adt/float.c:4069 utils/adt/numeric.c:1800 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1887 #, c-format msgid "lower bound cannot equal upper bound" msgstr "нижнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° не может равнÑтьÑÑ Ð²ÐµÑ€Ñ…Ð½ÐµÐ¹" -#: utils/adt/formatting.c:561 +#: utils/adt/formatting.c:530 #, c-format msgid "invalid format specification for an interval value" msgstr "Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° Ð´Ð»Ñ Ñ†ÐµÐ»Ð¾Ð³Ð¾ чиÑла" -#: utils/adt/formatting.c:562 +#: utils/adt/formatting.c:531 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Интервалы не привÑзываютÑÑ Ðº определённым календарным датам." -#: utils/adt/formatting.c:1192 +#: utils/adt/formatting.c:1161 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\" может быть только поÑледним шаблоном" -#: utils/adt/formatting.c:1200 +#: utils/adt/formatting.c:1169 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\" должна ÑтоÑть до \"PR\"" -#: utils/adt/formatting.c:1216 +#: utils/adt/formatting.c:1185 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\" должен ÑтоÑть до \"PR\"" -#: utils/adt/formatting.c:1243 +#: utils/adt/formatting.c:1212 #, c-format msgid "multiple decimal points" msgstr "многочиÑленные деÑÑтичные точки" -#: utils/adt/formatting.c:1247 utils/adt/formatting.c:1330 +#: utils/adt/formatting.c:1216 utils/adt/formatting.c:1299 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать \"V\" вмеÑте Ñ Ð´ÐµÑÑтичной точкой" -#: utils/adt/formatting.c:1259 +#: utils/adt/formatting.c:1228 #, c-format msgid "cannot use \"S\" twice" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать \"S\" дважды" -#: utils/adt/formatting.c:1263 +#: utils/adt/formatting.c:1232 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать \"S\" вмеÑте Ñ \"PL\"/\"MI\"/\"SG\"/\"PR\"" -#: utils/adt/formatting.c:1283 +#: utils/adt/formatting.c:1252 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать \"S\" вмеÑте Ñ \"MI\"" -#: utils/adt/formatting.c:1293 +#: utils/adt/formatting.c:1262 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать \"S\" вмеÑте Ñ \"PL\"" -#: utils/adt/formatting.c:1303 +#: utils/adt/formatting.c:1272 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать \"S\" вмеÑте Ñ \"SG\"" -#: utils/adt/formatting.c:1312 +#: utils/adt/formatting.c:1281 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать \"PR\" вмеÑте Ñ \"S\"/\"PL\"/\"MI\"/\"SG\"" -#: utils/adt/formatting.c:1338 +#: utils/adt/formatting.c:1307 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать \"EEEE\" дважды" -#: utils/adt/formatting.c:1344 +#: utils/adt/formatting.c:1313 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\" неÑовмеÑтим Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ форматами" -#: utils/adt/formatting.c:1345 +#: utils/adt/formatting.c:1314 #, c-format msgid "" "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "" "\"EEEE\" может иÑпользоватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°Ð¼Ð¸ цифр и деÑÑтичной точки." -#: utils/adt/formatting.c:1429 +#: utils/adt/formatting.c:1398 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "неверный разделитель в формате datetime: \"%s\"" -#: utils/adt/formatting.c:1556 +#: utils/adt/formatting.c:1525 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\" не ÑвлÑетÑÑ Ñ‡Ð¸Ñлом" -#: utils/adt/formatting.c:1634 +#: utils/adt/formatting.c:1603 #, c-format msgid "case conversion failed: %s" msgstr "преобразовать региÑтр не удалоÑÑŒ: %s" -#: utils/adt/formatting.c:1688 utils/adt/formatting.c:1810 -#: utils/adt/formatting.c:1933 +#: utils/adt/formatting.c:1651 utils/adt/formatting.c:1799 +#: utils/adt/formatting.c:1989 #, c-format msgid "could not determine which collation to use for %s function" msgstr "" "не удалоÑÑŒ определить, какое правило Ñортировки иÑпользовать Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ %s" -#: utils/adt/formatting.c:2314 +#: utils/adt/formatting.c:2410 #, c-format msgid "invalid combination of date conventions" msgstr "неверное Ñочетание Ñтилей дат" -#: utils/adt/formatting.c:2315 +#: utils/adt/formatting.c:2411 #, c-format msgid "" "Do not mix Gregorian and ISO week date conventions in a formatting template." @@ -26098,27 +27999,27 @@ msgstr "" "Ðе Ñмешивайте ГригорианÑкий Ñтиль дат (недель) Ñ ISO в одном шаблоне " "форматированиÑ." -#: utils/adt/formatting.c:2338 +#: utils/adt/formatting.c:2433 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "конфликтующие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ñ \"%s\" в Ñтроке форматированиÑ" -#: utils/adt/formatting.c:2341 +#: utils/adt/formatting.c:2435 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Это значение противоречит предыдущему значению Ð¿Ð¾Ð»Ñ Ñ‚Ð¾Ð³Ð¾ же типа." -#: utils/adt/formatting.c:2412 +#: utils/adt/formatting.c:2502 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "Ð²Ñ…Ð¾Ð´Ð½Ð°Ñ Ñтрока короче, чем требует поле Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\"" -#: utils/adt/formatting.c:2415 +#: utils/adt/formatting.c:2504 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "ТребуетÑÑ Ñимволов: %d, а оÑталоÑÑŒ только %d." -#: utils/adt/formatting.c:2418 utils/adt/formatting.c:2433 +#: utils/adt/formatting.c:2506 utils/adt/formatting.c:2520 #, c-format msgid "" "If your source string is not fixed-width, try using the \"FM\" modifier." @@ -26126,132 +28027,132 @@ msgstr "" "ЕÑли Ð²Ñ…Ð¾Ð´Ð½Ð°Ñ Ñтрока имеет переменную длину, попробуйте иÑпользовать " "модификатор \"FM\"." -#: utils/adt/formatting.c:2428 utils/adt/formatting.c:2442 -#: utils/adt/formatting.c:2665 +#: utils/adt/formatting.c:2516 utils/adt/formatting.c:2529 +#: utils/adt/formatting.c:2750 utils/adt/formatting.c:3650 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "неверное значение \"%s\" Ð´Ð»Ñ \"%s\"" -#: utils/adt/formatting.c:2430 +#: utils/adt/formatting.c:2518 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Поле должно поглотить Ñимволов: %d, но удалоÑÑŒ разобрать только %d." -#: utils/adt/formatting.c:2444 +#: utils/adt/formatting.c:2531 #, c-format msgid "Value must be an integer." msgstr "Значение должно быть целым чиÑлом." -#: utils/adt/formatting.c:2449 +#: utils/adt/formatting.c:2536 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "значение \"%s\" во входной Ñтроке вне диапазона" -#: utils/adt/formatting.c:2451 +#: utils/adt/formatting.c:2538 #, c-format msgid "Value must be in the range %d to %d." msgstr "Значение должно быть в интервале %d..%d." -#: utils/adt/formatting.c:2667 +#: utils/adt/formatting.c:2752 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "" "Данное значение не ÑоответÑтвует ни одному из допуÑтимых значений Ð´Ð»Ñ Ñтого " "полÑ." -#: utils/adt/formatting.c:2886 utils/adt/formatting.c:2906 -#: utils/adt/formatting.c:2926 utils/adt/formatting.c:2946 -#: utils/adt/formatting.c:2965 utils/adt/formatting.c:2984 -#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3026 -#: utils/adt/formatting.c:3044 utils/adt/formatting.c:3062 -#: utils/adt/formatting.c:3079 utils/adt/formatting.c:3096 +#: utils/adt/formatting.c:2968 utils/adt/formatting.c:2988 +#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3028 +#: utils/adt/formatting.c:3047 utils/adt/formatting.c:3066 +#: utils/adt/formatting.c:3090 utils/adt/formatting.c:3108 +#: utils/adt/formatting.c:3126 utils/adt/formatting.c:3144 +#: utils/adt/formatting.c:3161 utils/adt/formatting.c:3178 #, c-format msgid "localized string format value too long" msgstr "Ñлишком длинное значение формата локализованной Ñтроки" -#: utils/adt/formatting.c:3373 +#: utils/adt/formatting.c:3458 #, c-format msgid "unmatched format separator \"%c\"" msgstr "нет ÑоответÑÑ‚Ð²Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ в формате Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ \"%c\"" -#: utils/adt/formatting.c:3434 +#: utils/adt/formatting.c:3519 #, c-format msgid "unmatched format character \"%s\"" msgstr "нет ÑоответÑÑ‚Ð²Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ в формате Ñимвола \"%s\"" -#: utils/adt/formatting.c:3540 utils/adt/formatting.c:3884 +#: utils/adt/formatting.c:3652 #, c-format -msgid "formatting field \"%s\" is only supported in to_char" -msgstr "поле Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\" поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в функции to_char" +msgid "Time zone abbreviation is not recognized." +msgstr "Сокращённое название чаÑового поÑÑа не раÑпознано." -#: utils/adt/formatting.c:3715 +#: utils/adt/formatting.c:3853 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "ошибка ÑинтакÑиÑа в значении Ð´Ð»Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° \"Y,YYY\"" -#: utils/adt/formatting.c:3801 +#: utils/adt/formatting.c:3942 #, c-format msgid "input string is too short for datetime format" msgstr "Ð²Ñ…Ð¾Ð´Ð½Ð°Ñ Ñтрока короче, чем требует формат datetime" -#: utils/adt/formatting.c:3809 +#: utils/adt/formatting.c:3950 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "" "поÑле разбора формата datetime во входной Ñтроке оÑталиÑÑŒ дополнительные " "Ñимволы" -#: utils/adt/formatting.c:4370 +#: utils/adt/formatting.c:4494 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "во входной Ñтроке Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° timestamptz нет ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñового поÑÑа" -#: utils/adt/formatting.c:4376 +#: utils/adt/formatting.c:4500 #, c-format msgid "timestamptz out of range" msgstr "значение timestamptz вне диапазона" -#: utils/adt/formatting.c:4404 +#: utils/adt/formatting.c:4528 #, c-format msgid "datetime format is zoned but not timed" msgstr "в формате datetime указан чаÑовой поÑÑ, но отÑутÑтвует времÑ" -#: utils/adt/formatting.c:4456 +#: utils/adt/formatting.c:4577 #, c-format msgid "missing time zone in input string for type timetz" msgstr "во входной Ñтроке Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° timetz нет ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñового поÑÑа" -#: utils/adt/formatting.c:4462 +#: utils/adt/formatting.c:4583 #, c-format msgid "timetz out of range" msgstr "значение timetz вне диапазона" -#: utils/adt/formatting.c:4488 +#: utils/adt/formatting.c:4609 #, c-format msgid "datetime format is not dated and not timed" msgstr "в формате datetime нет ни даты, ни времени" -#: utils/adt/formatting.c:4621 +#: utils/adt/formatting.c:4786 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "Ñ‡Ð°Ñ \"%d\" не ÑоответÑтвует 12-чаÑовому формату времени" -#: utils/adt/formatting.c:4623 +#: utils/adt/formatting.c:4788 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "ИÑпользуйте 24-чаÑовой формат или передавайте чаÑÑ‹ от 1 до 12." -#: utils/adt/formatting.c:4734 +#: utils/adt/formatting.c:4900 #, c-format msgid "cannot calculate day of year without year information" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ñ€Ð°ÑÑчитать день года без информации о годе" -#: utils/adt/formatting.c:5653 +#: utils/adt/formatting.c:5852 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" не поддерживаетÑÑ Ð¿Ñ€Ð¸ вводе" -#: utils/adt/formatting.c:5665 +#: utils/adt/formatting.c:5864 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\" не поддерживаетÑÑ Ð¿Ñ€Ð¸ вводе" @@ -26263,12 +28164,12 @@ msgstr "абÑолютный путь недопуÑтим" #: utils/adt/genfile.c:89 #, c-format -msgid "path must be in or below the current directory" -msgstr "путь должен указывать в текущий или вложенный каталог" +msgid "path must be in or below the data directory" +msgstr "путь должен указывать на каталог данных или вложенный в него" -#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:189 -#: utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:836 -#: utils/adt/oracle_compat.c:1139 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:190 +#: utils/adt/oracle_compat.c:288 utils/adt/oracle_compat.c:839 +#: utils/adt/oracle_compat.c:1142 #, c-format msgid "requested length too large" msgstr "Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Ñлишком велика" @@ -26283,353 +28184,354 @@ msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ð² файле \"%s\": %m" msgid "file length too large" msgstr "длина файла Ñлишком велика" -#: utils/adt/genfile.c:248 +#: utils/adt/genfile.c:656 #, c-format -msgid "must be superuser to read files with adminpack 1.0" -msgstr "читать файлы, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ adminpack 1.0, может только Ñуперпользователь" +msgid "tablespace with OID %u does not exist" +msgstr "табличное проÑтранÑтво Ñ OID %u не ÑущеÑтвует" -#: utils/adt/geo_ops.c:979 utils/adt/geo_ops.c:1025 +#: utils/adt/geo_ops.c:998 utils/adt/geo_ops.c:1052 #, c-format msgid "invalid line specification: A and B cannot both be zero" msgstr "неверное определение линии: A и B вдвоём не могут быть нулевыми" -#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1097 +#: utils/adt/geo_ops.c:1008 utils/adt/geo_ops.c:1124 #, c-format msgid "invalid line specification: must be two distinct points" msgstr "неверное определение линии: требуютÑÑ Ð´Ð²Ðµ различных точки" -#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4330 -#: utils/adt/geo_ops.c:5210 +#: utils/adt/geo_ops.c:1438 utils/adt/geo_ops.c:3438 utils/adt/geo_ops.c:4368 +#: utils/adt/geo_ops.c:5253 #, c-format msgid "too many points requested" msgstr "запрошено Ñлишком много точек" -#: utils/adt/geo_ops.c:1472 +#: utils/adt/geo_ops.c:1502 #, c-format msgid "invalid number of points in external \"path\" value" msgstr "недопуÑтимое чиÑло точек во внешнем предÑтавлении типа \"path\"" -#: utils/adt/geo_ops.c:3449 +#: utils/adt/geo_ops.c:3487 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "недопуÑтимое чиÑло точек во внешнем предÑтавлении типа \"polygon\"" -#: utils/adt/geo_ops.c:4425 +#: utils/adt/geo_ops.c:4463 #, c-format msgid "open path cannot be converted to polygon" msgstr "открытый путь Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ во многоугольник" -#: utils/adt/geo_ops.c:4675 +#: utils/adt/geo_ops.c:4718 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "недопуÑтимый Ñ€Ð°Ð´Ð¸ÑƒÑ Ð²Ð¾ внешнем предÑтавлении типа \"circle\"" -#: utils/adt/geo_ops.c:5196 +#: utils/adt/geo_ops.c:5239 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "круг Ñ Ð½ÑƒÐ»ÐµÐ²Ñ‹Ð¼ радиуÑом Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ в многоугольник" -#: utils/adt/geo_ops.c:5201 +#: utils/adt/geo_ops.c:5244 #, c-format msgid "must request at least 2 points" msgstr "точек должно быть минимум 2" -#: utils/adt/int.c:263 +#: utils/adt/int.c:264 #, c-format msgid "invalid int2vector data" msgstr "неверные данные int2vector" -#: utils/adt/int.c:1528 utils/adt/int8.c:1404 utils/adt/numeric.c:1678 -#: utils/adt/timestamp.c:5809 utils/adt/timestamp.c:5889 +#: utils/adt/int.c:1529 utils/adt/int8.c:1403 utils/adt/numeric.c:1765 +#: utils/adt/timestamp.c:6546 utils/adt/timestamp.c:6632 #, c-format msgid "step size cannot equal zero" msgstr "размер шага не может быть нулевым" -#: utils/adt/int8.c:449 utils/adt/int8.c:472 utils/adt/int8.c:486 -#: utils/adt/int8.c:500 utils/adt/int8.c:531 utils/adt/int8.c:555 -#: utils/adt/int8.c:637 utils/adt/int8.c:705 utils/adt/int8.c:711 -#: utils/adt/int8.c:737 utils/adt/int8.c:751 utils/adt/int8.c:775 -#: utils/adt/int8.c:788 utils/adt/int8.c:900 utils/adt/int8.c:914 -#: utils/adt/int8.c:928 utils/adt/int8.c:959 utils/adt/int8.c:981 -#: utils/adt/int8.c:995 utils/adt/int8.c:1009 utils/adt/int8.c:1042 -#: utils/adt/int8.c:1056 utils/adt/int8.c:1070 utils/adt/int8.c:1101 -#: utils/adt/int8.c:1123 utils/adt/int8.c:1137 utils/adt/int8.c:1151 -#: utils/adt/int8.c:1313 utils/adt/int8.c:1348 utils/adt/numeric.c:4364 +#: utils/adt/int8.c:448 utils/adt/int8.c:471 utils/adt/int8.c:485 +#: utils/adt/int8.c:499 utils/adt/int8.c:530 utils/adt/int8.c:554 +#: utils/adt/int8.c:636 utils/adt/int8.c:704 utils/adt/int8.c:710 +#: utils/adt/int8.c:736 utils/adt/int8.c:750 utils/adt/int8.c:774 +#: utils/adt/int8.c:787 utils/adt/int8.c:899 utils/adt/int8.c:913 +#: utils/adt/int8.c:927 utils/adt/int8.c:958 utils/adt/int8.c:980 +#: utils/adt/int8.c:994 utils/adt/int8.c:1008 utils/adt/int8.c:1041 +#: utils/adt/int8.c:1055 utils/adt/int8.c:1069 utils/adt/int8.c:1100 +#: utils/adt/int8.c:1122 utils/adt/int8.c:1136 utils/adt/int8.c:1150 +#: utils/adt/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4542 +#: utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 #: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint вне диапазона" -#: utils/adt/int8.c:1361 +#: utils/adt/int8.c:1360 #, c-format msgid "OID out of range" msgstr "OID вне диапазона" -#: utils/adt/json.c:271 utils/adt/jsonb.c:757 +#: utils/adt/json.c:202 utils/adt/jsonb.c:664 #, c-format msgid "key value must be scalar, not array, composite, or json" msgstr "" "значением ключа должен быть ÑкалÑÑ€ (не маÑÑив, композитный тип или json)" -#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2104 +#: utils/adt/json.c:1034 utils/adt/json.c:1044 utils/fmgr/funcapi.c:2090 #, c-format msgid "could not determine data type for argument %d" msgstr "не удалоÑÑŒ определить тип данных аргумента %d" -#: utils/adt/json.c:926 utils/adt/jsonb.c:1727 +#: utils/adt/json.c:1067 utils/adt/json.c:1266 utils/adt/json.c:1449 +#: utils/adt/json.c:1527 utils/adt/jsonb.c:1333 utils/adt/jsonb.c:1423 #, c-format -msgid "field name must not be null" -msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»Ñ Ð½Ðµ может быть NULL" +msgid "null value not allowed for object key" +msgstr "значение null не может быть ключом объекта" + +#: utils/adt/json.c:1117 utils/adt/json.c:1288 +#, c-format +msgid "duplicate JSON object key value: %s" +msgstr "повторÑющийÑÑ ÐºÐ»ÑŽÑ‡ в объекте JSON: %s" -#: utils/adt/json.c:1010 utils/adt/jsonb.c:1177 +#: utils/adt/json.c:1226 utils/adt/jsonb.c:1134 #, c-format msgid "argument list must have even number of elements" msgstr "в ÑпиÑке аргументов должно быть чётное чиÑло Ñлементов" #. translator: %s is a SQL function name -#: utils/adt/json.c:1012 utils/adt/jsonb.c:1179 +#: utils/adt/json.c:1228 utils/adt/jsonb.c:1136 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "Ðргументы %s должны ÑоÑтоÑть из пар ключ-значение." -#: utils/adt/json.c:1028 -#, c-format -msgid "argument %d cannot be null" -msgstr "аргумент %d не может быть NULL" - -#: utils/adt/json.c:1029 -#, c-format -msgid "Object keys should be text." -msgstr "Ключи объектов должны быть текÑтовыми." - -#: utils/adt/json.c:1135 utils/adt/jsonb.c:1309 +#: utils/adt/json.c:1427 utils/adt/jsonb.c:1311 #, c-format msgid "array must have two columns" msgstr "маÑÑив должен иметь два Ñтолбца" -#: utils/adt/json.c:1159 utils/adt/json.c:1242 utils/adt/jsonb.c:1333 -#: utils/adt/jsonb.c:1428 -#, c-format -msgid "null value not allowed for object key" -msgstr "значение null не может быть ключом объекта" - -#: utils/adt/json.c:1231 utils/adt/jsonb.c:1417 +#: utils/adt/json.c:1516 utils/adt/jsonb.c:1412 #, c-format msgid "mismatched array dimensions" msgstr "неподходÑщие размерноÑти маÑÑива" -#: utils/adt/jsonb.c:287 +#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1956 +#, c-format +msgid "duplicate JSON object key value" +msgstr "повторÑющиеÑÑ ÐºÐ»ÑŽÑ‡Ð¸ в объекте JSON" + +#: utils/adt/jsonb.c:282 #, c-format msgid "string too long to represent as jsonb string" msgstr "Ñлишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ Ñтрока Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² виде Ñтроки jsonb" -#: utils/adt/jsonb.c:288 +#: utils/adt/jsonb.c:283 #, c-format msgid "" "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "" "Из-за ограничений реализации Ñтроки jsonb не могут быть длиннее %d байт." -#: utils/adt/jsonb.c:1192 +#: utils/adt/jsonb.c:1153 #, c-format msgid "argument %d: key must not be null" msgstr "аргумент %d: ключ не может быть NULL" -#: utils/adt/jsonb.c:1780 +#: utils/adt/jsonb.c:1744 +#, c-format +msgid "field name must not be null" +msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»Ñ Ð½Ðµ может быть NULL" + +#: utils/adt/jsonb.c:1806 #, c-format msgid "object keys must be strings" msgstr "ключи объектов должны быть Ñтроковыми" -#: utils/adt/jsonb.c:1943 +#: utils/adt/jsonb.c:2017 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "привеÑти значение jsonb null к типу %s нельзÑ" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:2018 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "привеÑти Ñтроку jsonb к типу %s нельзÑ" -#: utils/adt/jsonb.c:1945 +#: utils/adt/jsonb.c:2019 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "привеÑти чиÑловое значение jsonb к типу %s нельзÑ" -#: utils/adt/jsonb.c:1946 +#: utils/adt/jsonb.c:2020 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "привеÑти логичеÑкое значение jsonb к типу %s нельзÑ" -#: utils/adt/jsonb.c:1947 +#: utils/adt/jsonb.c:2021 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "привеÑти маÑÑив jsonb к типу %s нельзÑ" -#: utils/adt/jsonb.c:1948 +#: utils/adt/jsonb.c:2022 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "привеÑти объект jsonb к типу %s нельзÑ" -#: utils/adt/jsonb.c:1949 +#: utils/adt/jsonb.c:2023 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "привеÑти маÑÑив или объект jsonb к типу %s нельзÑ" -#: utils/adt/jsonb_util.c:752 +#: utils/adt/jsonb_util.c:756 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "чиÑло пар объекта jsonb превышает предел (%zu)" -#: utils/adt/jsonb_util.c:793 +#: utils/adt/jsonb_util.c:797 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "чиÑло Ñлементов маÑÑива jsonb превышает предел (%zu)" -#: utils/adt/jsonb_util.c:1667 utils/adt/jsonb_util.c:1687 +#: utils/adt/jsonb_util.c:1671 utils/adt/jsonb_util.c:1691 #, c-format -msgid "total size of jsonb array elements exceeds the maximum of %u bytes" -msgstr "общий размер Ñлементов маÑÑива jsonb превышает предел (%u байт)" +msgid "total size of jsonb array elements exceeds the maximum of %d bytes" +msgstr "общий размер Ñлементов маÑÑива jsonb превышает предел (%d байт)" -#: utils/adt/jsonb_util.c:1748 utils/adt/jsonb_util.c:1783 -#: utils/adt/jsonb_util.c:1803 +#: utils/adt/jsonb_util.c:1752 utils/adt/jsonb_util.c:1787 +#: utils/adt/jsonb_util.c:1807 #, c-format -msgid "total size of jsonb object elements exceeds the maximum of %u bytes" -msgstr "общий размер Ñлементов объекта jsonb превышает предел (%u байт)" +msgid "total size of jsonb object elements exceeds the maximum of %d bytes" +msgstr "общий размер Ñлементов объекта jsonb превышает предел (%d байт)" -#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 +#: utils/adt/jsonbsubs.c:67 utils/adt/jsonbsubs.c:148 #, c-format msgid "jsonb subscript does not support slices" msgstr "jsonb не поддерживает обращение по индекÑу к Ñрезам" -#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 +#: utils/adt/jsonbsubs.c:100 utils/adt/jsonbsubs.c:114 #, c-format msgid "subscript type %s is not supported" msgstr "Ð¸Ð½Ð´ÐµÐºÑ Ñлемента имеет неподдерживаемый тип %s" -#: utils/adt/jsonbsubs.c:104 +#: utils/adt/jsonbsubs.c:101 #, c-format msgid "jsonb subscript must be coercible to only one type, integer or text." msgstr "" "Ð˜Ð½Ð´ÐµÐºÑ Ñлемента в jsonb должен приводитьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к одному типу, integer или " "text." -#: utils/adt/jsonbsubs.c:118 +#: utils/adt/jsonbsubs.c:115 #, c-format msgid "jsonb subscript must be coercible to either integer or text." msgstr "Ð˜Ð½Ð´ÐµÐºÑ Ñлемента в jsonb должен приводитьÑÑ Ðº типу integer или text." -#: utils/adt/jsonbsubs.c:139 +#: utils/adt/jsonbsubs.c:136 #, c-format msgid "jsonb subscript must have text type" msgstr "Ð¸Ð½Ð´ÐµÐºÑ Ñлемента jsonb должен иметь текÑтовый тип" -#: utils/adt/jsonbsubs.c:207 +#: utils/adt/jsonbsubs.c:204 #, c-format msgid "jsonb subscript in assignment must not be null" msgstr "Ð¸Ð½Ð´ÐµÐºÑ Ñлемента jsonb в приÑваивании не может быть NULL" -#: utils/adt/jsonfuncs.c:561 utils/adt/jsonfuncs.c:797 -#: utils/adt/jsonfuncs.c:2367 utils/adt/jsonfuncs.c:2807 -#: utils/adt/jsonfuncs.c:3596 utils/adt/jsonfuncs.c:3929 +#: utils/adt/jsonfuncs.c:583 utils/adt/jsonfuncs.c:830 +#: utils/adt/jsonfuncs.c:2439 utils/adt/jsonfuncs.c:3015 +#: utils/adt/jsonfuncs.c:3948 utils/adt/jsonfuncs.c:4295 #, c-format msgid "cannot call %s on a scalar" msgstr "вызывать %s Ñо ÑкалÑром нельзÑ" -#: utils/adt/jsonfuncs.c:566 utils/adt/jsonfuncs.c:784 -#: utils/adt/jsonfuncs.c:2809 utils/adt/jsonfuncs.c:3585 +#: utils/adt/jsonfuncs.c:588 utils/adt/jsonfuncs.c:815 +#: utils/adt/jsonfuncs.c:3017 utils/adt/jsonfuncs.c:3935 #, c-format msgid "cannot call %s on an array" msgstr "вызывать %s Ñ Ð¼Ð°ÑÑивом нельзÑ" -#: utils/adt/jsonfuncs.c:623 jsonpath_scan.l:494 +#: utils/adt/jsonfuncs.c:647 jsonpath_scan.l:607 #, c-format msgid "unsupported Unicode escape sequence" msgstr "Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ ÑпецпоÑледовательноÑть Unicode" -#: utils/adt/jsonfuncs.c:693 +#: utils/adt/jsonfuncs.c:724 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "данные JSON, Ñтрока %d: %s%s%s" -#: utils/adt/jsonfuncs.c:1833 utils/adt/jsonfuncs.c:1868 +#: utils/adt/jsonfuncs.c:1883 utils/adt/jsonfuncs.c:1920 #, c-format msgid "cannot get array length of a scalar" msgstr "получить длину ÑкалÑра нельзÑ" -#: utils/adt/jsonfuncs.c:1837 utils/adt/jsonfuncs.c:1856 +#: utils/adt/jsonfuncs.c:1887 utils/adt/jsonfuncs.c:1906 #, c-format msgid "cannot get array length of a non-array" msgstr "получить длину маÑÑива Ð´Ð»Ñ Ð½Ðµ маÑÑива нельзÑ" -#: utils/adt/jsonfuncs.c:1930 +#: utils/adt/jsonfuncs.c:1986 #, c-format msgid "cannot call %s on a non-object" msgstr "вызывать %s Ñ Ð½Ðµ объектом нельзÑ" -#: utils/adt/jsonfuncs.c:2114 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot deconstruct an array as an object" msgstr "извлечь маÑÑив в виде объекта нельзÑ" -#: utils/adt/jsonfuncs.c:2126 +#: utils/adt/jsonfuncs.c:2188 #, c-format msgid "cannot deconstruct a scalar" msgstr "извлечь ÑкалÑÑ€ нельзÑ" -#: utils/adt/jsonfuncs.c:2169 +#: utils/adt/jsonfuncs.c:2233 #, c-format msgid "cannot extract elements from a scalar" msgstr "извлечь Ñлементы из ÑкалÑра нельзÑ" -#: utils/adt/jsonfuncs.c:2173 +#: utils/adt/jsonfuncs.c:2237 #, c-format msgid "cannot extract elements from an object" msgstr "извлечь Ñлементы из объекта нельзÑ" -#: utils/adt/jsonfuncs.c:2354 utils/adt/jsonfuncs.c:3814 +#: utils/adt/jsonfuncs.c:2424 utils/adt/jsonfuncs.c:4173 #, c-format msgid "cannot call %s on a non-array" msgstr "вызывать %s Ñ Ð½Ðµ маÑÑивом нельзÑ" -#: utils/adt/jsonfuncs.c:2424 utils/adt/jsonfuncs.c:2429 -#: utils/adt/jsonfuncs.c:2446 utils/adt/jsonfuncs.c:2452 +#: utils/adt/jsonfuncs.c:2515 utils/adt/jsonfuncs.c:2520 +#: utils/adt/jsonfuncs.c:2538 utils/adt/jsonfuncs.c:2544 #, c-format msgid "expected JSON array" msgstr "ожидалÑÑ Ð¼Ð°ÑÑив JSON" -#: utils/adt/jsonfuncs.c:2425 +#: utils/adt/jsonfuncs.c:2516 #, c-format msgid "See the value of key \"%s\"." msgstr "Проверьте значение ключа \"%s\"." -#: utils/adt/jsonfuncs.c:2447 +#: utils/adt/jsonfuncs.c:2539 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Проверьте Ñлемент маÑÑива %s ключа \"%s\"." -#: utils/adt/jsonfuncs.c:2453 +#: utils/adt/jsonfuncs.c:2545 #, c-format msgid "See the array element %s." msgstr "Проверьте Ñлемент маÑÑива %s." -#: utils/adt/jsonfuncs.c:2488 +#: utils/adt/jsonfuncs.c:2597 #, c-format msgid "malformed JSON array" msgstr "неправильный маÑÑив JSON" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3315 +#: utils/adt/jsonfuncs.c:3647 #, c-format msgid "first argument of %s must be a row type" msgstr "первым аргументом %s должен быть кортеж" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3339 +#: utils/adt/jsonfuncs.c:3671 #, c-format msgid "could not determine row type for result of %s" msgstr "не удалоÑÑŒ определить тип Ñтроки Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð° %s" -#: utils/adt/jsonfuncs.c:3341 +#: utils/adt/jsonfuncs.c:3673 #, c-format msgid "" "Provide a non-null record argument, or call the function in the FROM clause " @@ -26638,38 +28540,38 @@ msgstr "" "Передайте отличный от NULL аргумент-запиÑÑŒ или вызовите Ñту функцию в " "предложении FROM, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÑпиÑок определений Ñтолбцов." -#: utils/adt/jsonfuncs.c:3703 utils/fmgr/funcapi.c:103 +#: utils/adt/jsonfuncs.c:4059 utils/fmgr/funcapi.c:94 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "требуетÑÑ Ñ€ÐµÐ¶Ð¸Ð¼ материализации, но он недопуÑтим в Ñтом контекÑте" -#: utils/adt/jsonfuncs.c:3831 utils/adt/jsonfuncs.c:3911 +#: utils/adt/jsonfuncs.c:4190 utils/adt/jsonfuncs.c:4274 #, c-format msgid "argument of %s must be an array of objects" msgstr "аргументом %s должен быть маÑÑив объектов" -#: utils/adt/jsonfuncs.c:3864 +#: utils/adt/jsonfuncs.c:4223 #, c-format msgid "cannot call %s on an object" msgstr "вызывать %s Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼ нельзÑ" -#: utils/adt/jsonfuncs.c:4271 utils/adt/jsonfuncs.c:4330 -#: utils/adt/jsonfuncs.c:4411 +#: utils/adt/jsonfuncs.c:4656 utils/adt/jsonfuncs.c:4715 +#: utils/adt/jsonfuncs.c:4795 #, c-format msgid "cannot delete from scalar" msgstr "удаление из ÑкалÑра невозможно" -#: utils/adt/jsonfuncs.c:4416 +#: utils/adt/jsonfuncs.c:4800 #, c-format msgid "cannot delete from object using integer index" msgstr "удаление из объекта по чиÑловому индекÑу невозможно" -#: utils/adt/jsonfuncs.c:4484 utils/adt/jsonfuncs.c:4645 +#: utils/adt/jsonfuncs.c:4868 utils/adt/jsonfuncs.c:5027 #, c-format msgid "cannot set path in scalar" msgstr "задать путь в ÑкалÑре нельзÑ" -#: utils/adt/jsonfuncs.c:4526 utils/adt/jsonfuncs.c:4568 +#: utils/adt/jsonfuncs.c:4909 utils/adt/jsonfuncs.c:4951 #, c-format msgid "" "null_value_treatment must be \"delete_key\", \"return_target\", " @@ -26678,12 +28580,12 @@ msgstr "" "значением null_value_treatment должно быть \"delete_key\", " "\"return_target\", \"use_json_null\" или \"raise_exception\"" -#: utils/adt/jsonfuncs.c:4539 +#: utils/adt/jsonfuncs.c:4922 #, c-format msgid "JSON value must not be null" msgstr "значение JSON не может быть NULL" -#: utils/adt/jsonfuncs.c:4540 +#: utils/adt/jsonfuncs.c:4923 #, c-format msgid "" "Exception was raised because null_value_treatment is \"raise_exception\"." @@ -26691,7 +28593,7 @@ msgstr "" "Выдано иÑключение, так как значением null_value_treatment ÑвлÑетÑÑ " "\"raise_exception\"." -#: utils/adt/jsonfuncs.c:4541 +#: utils/adt/jsonfuncs.c:4924 #, c-format msgid "" "To avoid, either change the null_value_treatment argument or ensure that an " @@ -26700,55 +28602,55 @@ msgstr "" "Чтобы иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ðµ было, либо измените аргумент null_value_treatment, либо " "не допуÑкайте передачи SQL NULL." -#: utils/adt/jsonfuncs.c:4596 +#: utils/adt/jsonfuncs.c:4979 #, c-format msgid "cannot delete path in scalar" msgstr "удалить путь в ÑкалÑре нельзÑ" -#: utils/adt/jsonfuncs.c:4812 +#: utils/adt/jsonfuncs.c:5193 #, c-format msgid "path element at position %d is null" msgstr "Ñлемент пути в позиции %d равен NULL" -#: utils/adt/jsonfuncs.c:4831 utils/adt/jsonfuncs.c:4862 -#: utils/adt/jsonfuncs.c:4935 +#: utils/adt/jsonfuncs.c:5212 utils/adt/jsonfuncs.c:5243 +#: utils/adt/jsonfuncs.c:5316 #, c-format msgid "cannot replace existing key" msgstr "заменить ÑущеÑтвующий ключ нельзÑ" -#: utils/adt/jsonfuncs.c:4832 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:5213 utils/adt/jsonfuncs.c:5244 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." msgstr "" "Ð”Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ пути значение ключа должно быть ÑоÑтавным объектом, но оно " "оказалоÑÑŒ ÑкалÑром." -#: utils/adt/jsonfuncs.c:4936 +#: utils/adt/jsonfuncs.c:5317 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Попробуйте применить функцию jsonb_set Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡Ð°." -#: utils/adt/jsonfuncs.c:5040 +#: utils/adt/jsonfuncs.c:5421 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "Ñлемент пути в позиции %d - не целочиÑленный: \"%s\"" -#: utils/adt/jsonfuncs.c:5057 +#: utils/adt/jsonfuncs.c:5438 #, c-format msgid "path element at position %d is out of range: %d" msgstr "Ñлемент пути в позиции %d вне диапазона: %d" -#: utils/adt/jsonfuncs.c:5209 +#: utils/adt/jsonfuncs.c:5590 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "неверный тип флага, допуÑкаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ маÑÑивы и ÑкалÑры" -#: utils/adt/jsonfuncs.c:5216 +#: utils/adt/jsonfuncs.c:5597 #, c-format msgid "flag array element is not a string" msgstr "Ñлемент маÑÑива флагов не ÑвлÑетÑÑ Ñтрокой" -#: utils/adt/jsonfuncs.c:5217 utils/adt/jsonfuncs.c:5239 +#: utils/adt/jsonfuncs.c:5598 utils/adt/jsonfuncs.c:5620 #, c-format msgid "" "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and " @@ -26756,197 +28658,313 @@ msgid "" msgstr "" "ДопуÑтимые значениÑ: \"string\", \"numeric\", \"boolean\", \"key\" и \"all\"." -#: utils/adt/jsonfuncs.c:5237 +#: utils/adt/jsonfuncs.c:5618 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "неверный флаг в маÑÑиве флагов: \"%s\"" -#: utils/adt/jsonpath.c:362 +#: utils/adt/jsonpath.c:389 #, c-format msgid "@ is not allowed in root expressions" msgstr "@ не допуÑкаетÑÑ Ð² корневых выражениÑÑ…" -#: utils/adt/jsonpath.c:368 +#: utils/adt/jsonpath.c:395 #, c-format msgid "LAST is allowed only in array subscripts" msgstr "LAST принимаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в качеÑтве индекÑа маÑÑива" -#: utils/adt/jsonpath_exec.c:360 +#: utils/adt/jsonpath_exec.c:491 #, c-format msgid "single boolean result is expected" msgstr "ожидалÑÑ ÐµÐ´Ð¸Ð½Ñтвенный булевÑкий результат" -#: utils/adt/jsonpath_exec.c:556 +#: utils/adt/jsonpath_exec.c:851 #, c-format -msgid "\"vars\" argument is not an object" -msgstr "аргумент \"vars\" не ÑвлÑетÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼" +msgid "jsonpath wildcard array accessor can only be applied to an array" +msgstr "" +"выражение Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ звёздочке в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к " +"маÑÑиву" -#: utils/adt/jsonpath_exec.c:557 +#: utils/adt/jsonpath_exec.c:874 #, c-format -msgid "" -"Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +msgid "jsonpath wildcard member accessor can only be applied to an object" msgstr "" -"Параметры jsonpath должны передаватьÑÑ Ð² виде пар ключ-значение в объекте " -"\"vars\"." +"выражение Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ звёздочке в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к " +"объекту" + +#: utils/adt/jsonpath_exec.c:923 +#, c-format +msgid "jsonpath array subscript is out of bounds" +msgstr "Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð°ÑÑива в jsonpath вне диапазона" + +#: utils/adt/jsonpath_exec.c:980 +#, c-format +msgid "jsonpath array accessor can only be applied to an array" +msgstr "" +"выражение Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº маÑÑиву в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к маÑÑиву" -#: utils/adt/jsonpath_exec.c:674 +#: utils/adt/jsonpath_exec.c:1044 #, c-format msgid "JSON object does not contain key \"%s\"" msgstr "JSON-объект не Ñодержит ключ \"%s\"" -#: utils/adt/jsonpath_exec.c:686 +#: utils/adt/jsonpath_exec.c:1056 #, c-format msgid "jsonpath member accessor can only be applied to an object" msgstr "" "выражение Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº члену в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к объекту" -#: utils/adt/jsonpath_exec.c:715 +# skip-rule: space-before-period +#: utils/adt/jsonpath_exec.c:1114 #, c-format -msgid "jsonpath wildcard array accessor can only be applied to an array" +msgid "jsonpath item method .%s() can only be applied to an array" +msgstr "метод .%s() в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к маÑÑиву" + +#: utils/adt/jsonpath_exec.c:1167 utils/adt/jsonpath_exec.c:1193 +#, c-format +msgid "" +"argument \"%s\" of jsonpath item method .%s() is invalid for type double " +"precision" msgstr "" -"выражение Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ звёздочке в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к " -"маÑÑиву" +"аргумент \"%s\" метода Ñлемента jsonpath .%s() некорректен Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° double " +"precision" -#: utils/adt/jsonpath_exec.c:763 +#: utils/adt/jsonpath_exec.c:1172 utils/adt/jsonpath_exec.c:1198 +#: utils/adt/jsonpath_exec.c:1414 utils/adt/jsonpath_exec.c:1446 #, c-format -msgid "jsonpath array subscript is out of bounds" -msgstr "Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð°ÑÑива в jsonpath вне диапазона" +msgid "NaN or Infinity is not allowed for jsonpath item method .%s()" +msgstr "метод Ñлемента jsonpath .%s() не принимает Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ NaN и Infinity" -#: utils/adt/jsonpath_exec.c:820 +# skip-rule: space-before-period +#: utils/adt/jsonpath_exec.c:1211 utils/adt/jsonpath_exec.c:1313 +#: utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1593 #, c-format -msgid "jsonpath array accessor can only be applied to an array" +msgid "" +"jsonpath item method .%s() can only be applied to a string or numeric value" msgstr "" -"выражение Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº маÑÑиву в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к маÑÑиву" +"метод .%s() в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к Ñтроковому или чиÑловому " +"значению" -#: utils/adt/jsonpath_exec.c:872 +#: utils/adt/jsonpath_exec.c:1281 utils/adt/jsonpath_exec.c:1305 #, c-format -msgid "jsonpath wildcard member accessor can only be applied to an object" +msgid "" +"argument \"%s\" of jsonpath item method .%s() is invalid for type bigint" msgstr "" -"выражение Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ звёздочке в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к " -"объекту" +"аргумент \"%s\" метода Ñлемента jsonpath .%s() не подходит Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° bigint" + +#: utils/adt/jsonpath_exec.c:1357 utils/adt/jsonpath_exec.c:1377 +#, c-format +msgid "" +"argument \"%s\" of jsonpath item method .%s() is invalid for type boolean" +msgstr "" +"аргумент \"%s\" метода Ñлемента jsonpath .%s() не подходит Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° boolean" # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:1006 +#: utils/adt/jsonpath_exec.c:1386 #, c-format -msgid "jsonpath item method .%s() can only be applied to an array" -msgstr "метод .%s() в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к маÑÑиву" +msgid "" +"jsonpath item method .%s() can only be applied to a boolean, string, or " +"numeric value" +msgstr "" +"метод .%s() в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к булевÑкому, Ñтроковому или " +"чиÑловому значению" + +#: utils/adt/jsonpath_exec.c:1439 utils/adt/jsonpath_exec.c:1528 +#, c-format +msgid "" +"argument \"%s\" of jsonpath item method .%s() is invalid for type numeric" +msgstr "" +"аргумент \"%s\" метода Ñлемента jsonpath .%s() не подходит Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° numeric" -#: utils/adt/jsonpath_exec.c:1059 +#: utils/adt/jsonpath_exec.c:1487 #, c-format msgid "" -"numeric argument of jsonpath item method .%s() is out of range for type " -"double precision" +"precision of jsonpath item method .%s() is out of range for type integer" +msgstr "точноÑть в аргументе метода jsonpath .%s() вне диапазона типа integer" + +#: utils/adt/jsonpath_exec.c:1501 +#, c-format +msgid "scale of jsonpath item method .%s() is out of range for type integer" msgstr "" -"чиÑловой аргумент метода Ñлемента jsonpath .%s() вне диапазона Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° " -"double precision" +"маÑштаб в аргументе метода Ñлемента jsonpath .%s() вне диапазона типа integer" -#: utils/adt/jsonpath_exec.c:1080 +#: utils/adt/jsonpath_exec.c:1561 utils/adt/jsonpath_exec.c:1585 #, c-format msgid "" -"string argument of jsonpath item method .%s() is not a valid representation " -"of a double precision number" +"argument \"%s\" of jsonpath item method .%s() is invalid for type integer" msgstr "" -"Ñтроковый аргумент метода Ñлемента jsonpath .%s() не ÑвлÑетÑÑ Ð¿Ñ€ÐµÐ´Ñтавлением " -"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ double precision" +"аргумент \"%s\" метода Ñлемента jsonpath .%s() не подходит Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° integer" # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:1093 +#: utils/adt/jsonpath_exec.c:1648 #, c-format msgid "" -"jsonpath item method .%s() can only be applied to a string or numeric value" +"jsonpath item method .%s() can only be applied to a boolean, string, " +"numeric, or datetime value" msgstr "" -"метод .%s() в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к Ñтроковому или чиÑловому " -"значению" +"метод .%s() в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к булевÑкому, Ñтроковому, " +"чиÑловому значению или к дате/времени" -#: utils/adt/jsonpath_exec.c:1583 +#: utils/adt/jsonpath_exec.c:2137 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "" "левый операнд оператора %s в jsonpath не ÑвлÑетÑÑ Ð¾Ð´Ð½Ð¸Ð¼ чиÑловым значением" -#: utils/adt/jsonpath_exec.c:1590 +#: utils/adt/jsonpath_exec.c:2144 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "" "правый операнд оператора %s в jsonpath не ÑвлÑетÑÑ Ð¾Ð´Ð½Ð¸Ð¼ чиÑловым значением" -#: utils/adt/jsonpath_exec.c:1658 +#: utils/adt/jsonpath_exec.c:2212 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "" "операнд унарного оператора %s в jsonpath не ÑвлÑетÑÑ Ñ‡Ð¸Ñловым значением" # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:1756 +#: utils/adt/jsonpath_exec.c:2311 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "метод .%s() в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к чиÑловому значению" # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:1796 +#: utils/adt/jsonpath_exec.c:2357 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "метод .%s() в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к Ñтроке" -#: utils/adt/jsonpath_exec.c:1890 +#: utils/adt/jsonpath_exec.c:2450 +#, c-format +msgid "" +"time precision of jsonpath item method .%s() is out of range for type integer" +msgstr "" +"точноÑть времени в аргументе метода jsonpath .%s() вне диапазона типа integer" + +#: utils/adt/jsonpath_exec.c:2484 utils/adt/jsonpath_exec.c:2490 +#: utils/adt/jsonpath_exec.c:2517 utils/adt/jsonpath_exec.c:2545 +#: utils/adt/jsonpath_exec.c:2598 utils/adt/jsonpath_exec.c:2649 +#: utils/adt/jsonpath_exec.c:2720 #, c-format -msgid "datetime format is not recognized: \"%s\"" -msgstr "формат datetime не раÑпознан: \"%s\"" +msgid "%s format is not recognized: \"%s\"" +msgstr "формат %s не раÑпознан: \"%s\"" -#: utils/adt/jsonpath_exec.c:1892 +#: utils/adt/jsonpath_exec.c:2486 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "" "ВоÑпользуйтеÑÑŒ аргументом datetime Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° входных данных." +#: utils/adt/jsonpath_exec.c:2679 utils/adt/jsonpath_exec.c:2760 +#, c-format +msgid "time precision of jsonpath item method .%s() is invalid" +msgstr "точноÑть времени в аргументе метода jsonpath .%s() некорректнаÑ" + # skip-rule: space-before-period -#: utils/adt/jsonpath_exec.c:1960 +#: utils/adt/jsonpath_exec.c:2840 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "метод .%s() в jsonpath может применÑтьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к объекту" -#: utils/adt/jsonpath_exec.c:2142 +#: utils/adt/jsonpath_exec.c:3124 +#, c-format +msgid "could not convert value of type %s to jsonpath" +msgstr "преобразовать значение типа %s в jsonpath не удалоÑÑŒ" + +#: utils/adt/jsonpath_exec.c:3158 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "не удалоÑÑŒ найти в jsonpath переменную \"%s\"" -#: utils/adt/jsonpath_exec.c:2406 +#: utils/adt/jsonpath_exec.c:3211 +#, c-format +msgid "\"vars\" argument is not an object" +msgstr "аргумент \"vars\" не ÑвлÑетÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼" + +#: utils/adt/jsonpath_exec.c:3212 +#, c-format +msgid "" +"Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +msgstr "" +"Параметры jsonpath должны передаватьÑÑ Ð² виде пар ключ-значение в объекте " +"\"vars\"." + +#: utils/adt/jsonpath_exec.c:3475 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "Ð¸Ð½Ð´ÐµÐºÑ Ñлемента в jsonpath не ÑвлÑетÑÑ Ð¾Ð´Ð½Ð¸Ð¼ чиÑловым значением" -#: utils/adt/jsonpath_exec.c:2418 +#: utils/adt/jsonpath_exec.c:3487 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "Ð¸Ð½Ð´ÐµÐºÑ Ð¼Ð°ÑÑива в jsonpath вне целочиÑленного диапазона" -#: utils/adt/jsonpath_exec.c:2595 +#: utils/adt/jsonpath_exec.c:3671 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "значение %s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ в %s без Ñведений о чаÑовом поÑÑе" -#: utils/adt/jsonpath_exec.c:2597 +#: utils/adt/jsonpath_exec.c:3673 #, c-format msgid "Use *_tz() function for time zone support." msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ чаÑового поÑÑа иÑпользуйте функцию *_tz()." +#: utils/adt/jsonpath_exec.c:3981 +#, c-format +msgid "" +"JSON path expression for column \"%s\" must return single item when no " +"wrapper is requested" +msgstr "" +"выражение пути JSON Ð´Ð»Ñ Ñтолбца \"%s\" в отÑутÑтвие обёртки должно " +"возвращать одиночный Ñлемент" + +#: utils/adt/jsonpath_exec.c:3983 utils/adt/jsonpath_exec.c:3988 +#, c-format +msgid "Use the WITH WRAPPER clause to wrap SQL/JSON items into an array." +msgstr "" +"ИÑпользуйте предложение WITH WRAPPER, чтобы обернуть Ñлементы SQL/JSON в " +"маÑÑив." + +#: utils/adt/jsonpath_exec.c:3987 +#, c-format +msgid "" +"JSON path expression in JSON_QUERY must return single item when no wrapper " +"is requested" +msgstr "" +"выражение пути JSON в JSON_QUERY в отÑутÑтвие обёртки должно возвращать " +"одиночный Ñлемент" + +#: utils/adt/jsonpath_exec.c:4045 utils/adt/jsonpath_exec.c:4069 +#, c-format +msgid "JSON path expression for column \"%s\" must return single scalar item" +msgstr "" +"выражение пути JSON Ð´Ð»Ñ Ñтолбца \"%s\" должно возвращать один ÑкалÑрный " +"Ñлемент" + +#: utils/adt/jsonpath_exec.c:4050 utils/adt/jsonpath_exec.c:4074 +#, c-format +msgid "JSON path expression in JSON_VALUE must return single scalar item" +msgstr "" +"выражение пути JSON в JSON_VALUE должно возвращать один ÑкалÑрный Ñлемент" + # well-spelled: Ñимв -#: utils/adt/levenshtein.c:133 +#: utils/adt/levenshtein.c:132 #, c-format msgid "levenshtein argument exceeds maximum length of %d characters" msgstr "длина аргумента levenshtein() превышает макÑимум (%d Ñимв.)" -#: utils/adt/like.c:160 +#: utils/adt/like.c:159 #, c-format msgid "nondeterministic collations are not supported for LIKE" msgstr "недетерминированные правила Ñортировки не поддерживаютÑÑ Ð´Ð»Ñ LIKE" -#: utils/adt/like.c:189 utils/adt/like_support.c:1024 +#: utils/adt/like.c:188 utils/adt/like_support.c:1023 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "не удалоÑÑŒ определить, какой порÑдок Ñортировки иÑпользовать Ð´Ð»Ñ ILIKE" -#: utils/adt/like.c:201 +#: utils/adt/like.c:200 #, c-format msgid "nondeterministic collations are not supported for ILIKE" msgstr "недетерминированные правила Ñортировки не поддерживаютÑÑ Ð´Ð»Ñ ILIKE" @@ -26956,37 +28974,37 @@ msgstr "недетерминированные правила Ñортировк msgid "LIKE pattern must not end with escape character" msgstr "шаблон LIKE не должен заканчиватьÑÑ Ð·Ð°Ñ‰Ð¸Ñ‚Ð½Ñ‹Ð¼ Ñимволом" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:786 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:800 #, c-format msgid "invalid escape string" msgstr "неверный защитный Ñимвол" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:787 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:801 #, c-format msgid "Escape string must be empty or one character." msgstr "Защитный Ñимвол должен быть пуÑтым или ÑоÑтоÑть из одного байта." -#: utils/adt/like_support.c:1014 +#: utils/adt/like_support.c:1013 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "региÑтронезавиÑимое Ñравнение не поддерживаетÑÑ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° bytea" -#: utils/adt/like_support.c:1115 +#: utils/adt/like_support.c:1114 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "Ñравнение Ñ Ñ€ÐµÐ³ÑƒÐ»Ñрными выражениÑми не поддерживаетÑÑ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° bytea" -#: utils/adt/mac.c:101 +#: utils/adt/mac.c:102 #, c-format msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "неверный октет в значении типа macaddr: \"%s\"" -#: utils/adt/mac8.c:563 +#: utils/adt/mac8.c:555 #, c-format msgid "macaddr8 data out of range to convert to macaddr" msgstr "значение в macaddr8 не допуÑкает преобразование в macaddr" -#: utils/adt/mac8.c:564 +#: utils/adt/mac8.c:556 #, c-format msgid "" "Only addresses that have FF and FE as values in the 4th and 5th bytes from " @@ -26996,109 +29014,109 @@ msgstr "" "Преобразование из macaddr8 в macaddr возможно только Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑов, Ñодержащих " "FF и FE в 4-ом и 5-ом байтах Ñлева, например xx:xx:xx:ff:fe:xx:xx:xx." -#: utils/adt/mcxtfuncs.c:182 +#: utils/adt/mcxtfuncs.c:173 #, c-format msgid "PID %d is not a PostgreSQL server process" msgstr "PID %d не отноÑитÑÑ Ðº Ñерверному процеÑÑу PostgreSQL" -#: utils/adt/misc.c:216 +#: utils/adt/misc.c:237 #, c-format msgid "global tablespace never has databases" msgstr "в табличном проÑтранÑтве global никогда не было баз данных" -#: utils/adt/misc.c:238 +#: utils/adt/misc.c:259 #, c-format msgid "%u is not a tablespace OID" msgstr "%u - Ñто не OID табличного проÑтранÑтва" -#: utils/adt/misc.c:457 +#: utils/adt/misc.c:454 msgid "unreserved" msgstr "не зарезервировано" -#: utils/adt/misc.c:461 +#: utils/adt/misc.c:458 msgid "unreserved (cannot be function or type name)" msgstr "не зарезервировано (но не может быть именем типа или функции)" -#: utils/adt/misc.c:465 +#: utils/adt/misc.c:462 msgid "reserved (can be function or type name)" msgstr "зарезервировано (но может быть именем типа или функции)" -#: utils/adt/misc.c:469 +#: utils/adt/misc.c:466 msgid "reserved" msgstr "зарезервировано" -#: utils/adt/misc.c:480 +#: utils/adt/misc.c:477 msgid "can be bare label" msgstr "может быть открытой меткой" -#: utils/adt/misc.c:485 +#: utils/adt/misc.c:482 msgid "requires AS" msgstr "требует AS" -#: utils/adt/misc.c:732 utils/adt/misc.c:746 utils/adt/misc.c:785 -#: utils/adt/misc.c:791 utils/adt/misc.c:797 utils/adt/misc.c:820 +#: utils/adt/misc.c:897 utils/adt/misc.c:911 utils/adt/misc.c:950 +#: utils/adt/misc.c:956 utils/adt/misc.c:962 utils/adt/misc.c:985 #, c-format msgid "string is not a valid identifier: \"%s\"" msgstr "Ñтрока не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым идентификатором: \"%s\"" -#: utils/adt/misc.c:734 +#: utils/adt/misc.c:899 #, c-format msgid "String has unclosed double quotes." msgstr "Ð’ Ñтроке не закрыты кавычки." -#: utils/adt/misc.c:748 +#: utils/adt/misc.c:913 #, c-format msgid "Quoted identifier must not be empty." msgstr "Идентификатор в кавычках не может быть пуÑтым." -#: utils/adt/misc.c:787 +#: utils/adt/misc.c:952 #, c-format msgid "No valid identifier before \".\"." msgstr "Перед \".\" нет допуÑтимого идентификатора." -#: utils/adt/misc.c:793 +#: utils/adt/misc.c:958 #, c-format msgid "No valid identifier after \".\"." msgstr "ПоÑле \".\" нет допуÑтимого идентификатора." -#: utils/adt/misc.c:853 +#: utils/adt/misc.c:1018 #, c-format msgid "log format \"%s\" is not supported" msgstr "формат журнала \"%s\" не поддерживаетÑÑ" -#: utils/adt/misc.c:854 +#: utils/adt/misc.c:1019 #, c-format msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." msgstr "ПоддерживаютÑÑ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñ‹ журналов \"stderr\", \"csvlog\" и \"jsonlog\"." -#: utils/adt/multirangetypes.c:149 utils/adt/multirangetypes.c:162 -#: utils/adt/multirangetypes.c:191 utils/adt/multirangetypes.c:261 -#: utils/adt/multirangetypes.c:285 +#: utils/adt/multirangetypes.c:150 utils/adt/multirangetypes.c:163 +#: utils/adt/multirangetypes.c:192 utils/adt/multirangetypes.c:266 +#: utils/adt/multirangetypes.c:290 #, c-format msgid "malformed multirange literal: \"%s\"" msgstr "ошибочный литерал мультидиапазона: \"%s\"" -#: utils/adt/multirangetypes.c:151 +#: utils/adt/multirangetypes.c:152 #, c-format msgid "Missing left brace." msgstr "ОтÑутÑтвует Ð»ÐµÐ²Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð½Ð°Ñ Ñкобка." -#: utils/adt/multirangetypes.c:193 +#: utils/adt/multirangetypes.c:194 #, c-format msgid "Expected range start." msgstr "ОжидалоÑÑŒ начало диапазона." -#: utils/adt/multirangetypes.c:263 +#: utils/adt/multirangetypes.c:268 #, c-format msgid "Expected comma or end of multirange." msgstr "ОжидалаÑÑŒ запÑÑ‚Ð°Ñ Ð¸Ð»Ð¸ конец мультидиапазона." -#: utils/adt/multirangetypes.c:976 +#: utils/adt/multirangetypes.c:981 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "мультидиапазоны Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ из маÑÑивов мультидиапазонов" -#: utils/adt/multirangetypes.c:1002 +#: utils/adt/multirangetypes.c:1007 #, c-format msgid "multirange values cannot contain null members" msgstr "мультидиапазоны не могут Ñодержать Ñлементы NULL" @@ -27157,121 +29175,142 @@ msgstr "не удалоÑÑŒ отформатировать значение cidr msgid "cannot merge addresses from different families" msgstr "объединÑть адреÑа разных ÑемейÑтв нельзÑ" -#: utils/adt/network.c:1901 +#: utils/adt/network.c:1893 #, c-format msgid "cannot AND inet values of different sizes" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать \"И\" (AND) Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ inet разного размера" -#: utils/adt/network.c:1933 +#: utils/adt/network.c:1925 #, c-format msgid "cannot OR inet values of different sizes" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать \"ИЛИ\" (OR) Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ inet разного размера" -#: utils/adt/network.c:1994 utils/adt/network.c:2070 +#: utils/adt/network.c:1986 utils/adt/network.c:2062 #, c-format msgid "result is out of range" msgstr "результат вне диапазона" -#: utils/adt/network.c:2035 +#: utils/adt/network.c:2027 #, c-format msgid "cannot subtract inet values of different sizes" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ inet разного размера" -#: utils/adt/numeric.c:1027 +#: utils/adt/numeric.c:793 utils/adt/numeric.c:3659 utils/adt/numeric.c:7216 +#: utils/adt/numeric.c:7419 utils/adt/numeric.c:7891 utils/adt/numeric.c:10586 +#: utils/adt/numeric.c:11061 utils/adt/numeric.c:11155 +#: utils/adt/numeric.c:11290 +#, c-format +msgid "value overflows numeric format" +msgstr "значение переполнÑет формат numeric" + +#: utils/adt/numeric.c:1106 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "неверный знак во внешнем значении \"numeric\"" -#: utils/adt/numeric.c:1033 +#: utils/adt/numeric.c:1112 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "неверный порÑдок чиÑла во внешнем значении \"numeric\"" -#: utils/adt/numeric.c:1042 +#: utils/adt/numeric.c:1121 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ†Ð¸Ñ„Ñ€Ð° во внешнем значении \"numeric\"" -#: utils/adt/numeric.c:1257 utils/adt/numeric.c:1271 +#: utils/adt/numeric.c:1336 utils/adt/numeric.c:1350 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "точноÑть NUMERIC %d должна быть между 1 и %d" -#: utils/adt/numeric.c:1262 +#: utils/adt/numeric.c:1341 #, c-format msgid "NUMERIC scale %d must be between %d and %d" msgstr "порÑдок NUMERIC %d должен быть между %d и %d" -#: utils/adt/numeric.c:1280 +#: utils/adt/numeric.c:1359 #, c-format msgid "invalid NUMERIC type modifier" msgstr "неверный модификатор типа NUMERIC" -#: utils/adt/numeric.c:1638 +#: utils/adt/numeric.c:1725 #, c-format msgid "start value cannot be NaN" msgstr "начальное значение не может быть NaN" -#: utils/adt/numeric.c:1642 +#: utils/adt/numeric.c:1729 #, c-format msgid "start value cannot be infinity" msgstr "начальное значение не может быть беÑконечноÑтью" -#: utils/adt/numeric.c:1649 +#: utils/adt/numeric.c:1736 #, c-format msgid "stop value cannot be NaN" msgstr "конечное значение не может быть NaN" -#: utils/adt/numeric.c:1653 +#: utils/adt/numeric.c:1740 #, c-format msgid "stop value cannot be infinity" msgstr "конечное значение не может быть беÑконечноÑтью" -#: utils/adt/numeric.c:1666 +#: utils/adt/numeric.c:1753 #, c-format msgid "step size cannot be NaN" msgstr "размер шага не может быть NaN" -#: utils/adt/numeric.c:1670 +#: utils/adt/numeric.c:1757 #, c-format msgid "step size cannot be infinity" msgstr "размер шага не может быть беÑконечноÑтью" -#: utils/adt/numeric.c:3551 +#: utils/adt/numeric.c:3649 #, c-format msgid "factorial of a negative number is undefined" msgstr "факториал отрицательного чиÑла даёт неопределённоÑть" -#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6945 utils/adt/numeric.c:7460 -#: utils/adt/numeric.c:9984 utils/adt/numeric.c:10463 utils/adt/numeric.c:10589 -#: utils/adt/numeric.c:10662 +#: utils/adt/numeric.c:4256 #, c-format -msgid "value overflows numeric format" -msgstr "значение переполнÑет формат numeric" +msgid "lower bound cannot be NaN" +msgstr "нижнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° не может быть NaN" + +#: utils/adt/numeric.c:4260 +#, c-format +msgid "lower bound cannot be infinity" +msgstr "нижнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° не может быть беÑконечноÑтью" + +#: utils/adt/numeric.c:4267 +#, c-format +msgid "upper bound cannot be NaN" +msgstr "верхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° не может быть NaN" + +#: utils/adt/numeric.c:4271 +#, c-format +msgid "upper bound cannot be infinity" +msgstr "верхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° не может быть беÑконечноÑтью" -#: utils/adt/numeric.c:4271 utils/adt/numeric.c:4351 utils/adt/numeric.c:4392 -#: utils/adt/numeric.c:4586 +#: utils/adt/numeric.c:4432 utils/adt/numeric.c:4520 utils/adt/numeric.c:4580 +#: utils/adt/numeric.c:4776 #, c-format msgid "cannot convert NaN to %s" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ NaN в %s" -#: utils/adt/numeric.c:4275 utils/adt/numeric.c:4355 utils/adt/numeric.c:4396 -#: utils/adt/numeric.c:4590 +#: utils/adt/numeric.c:4436 utils/adt/numeric.c:4524 utils/adt/numeric.c:4584 +#: utils/adt/numeric.c:4780 #, c-format msgid "cannot convert infinity to %s" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ´Ñтавить беÑконечноÑть в %s" -#: utils/adt/numeric.c:4599 +#: utils/adt/numeric.c:4789 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn вне диапазона" -#: utils/adt/numeric.c:7547 utils/adt/numeric.c:7593 +#: utils/adt/numeric.c:7981 utils/adt/numeric.c:8032 #, c-format msgid "numeric field overflow" msgstr "переполнение Ð¿Ð¾Ð»Ñ numeric" -#: utils/adt/numeric.c:7548 +#: utils/adt/numeric.c:7982 #, c-format msgid "" "A field with precision %d, scale %d must round to an absolute value less " @@ -27280,77 +29319,84 @@ msgstr "" "Поле Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾Ñтью %d, порÑдком %d должно округлÑтьÑÑ Ð´Ð¾ абÑолютного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ " "меньше чем %s%d." -#: utils/adt/numeric.c:7594 +#: utils/adt/numeric.c:8033 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "" "Поле Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾Ñтью %d, порÑдком %d не может Ñодержать значение беÑконечноÑти." -#: utils/adt/oid.c:293 +#: utils/adt/numeric.c:11359 utils/adt/pseudorandomfuncs.c:135 +#: utils/adt/pseudorandomfuncs.c:159 +#, c-format +msgid "lower bound must be less than or equal to upper bound" +msgstr "нижнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° должна быть меньше или равна верхней" + +#: utils/adt/oid.c:217 #, c-format msgid "invalid oidvector data" msgstr "неверные данные oidvector" -#: utils/adt/oracle_compat.c:973 +#: utils/adt/oracle_compat.c:976 #, c-format msgid "requested character too large" msgstr "запрошенный Ñимвол больше допуÑтимого" -#: utils/adt/oracle_compat.c:1017 +#: utils/adt/oracle_compat.c:1020 #, c-format msgid "character number must be positive" msgstr "номер Ñимвола должен быть положительным" -#: utils/adt/oracle_compat.c:1021 +#: utils/adt/oracle_compat.c:1024 #, c-format msgid "null character not permitted" msgstr "Ñимвол не может быть null" -#: utils/adt/oracle_compat.c:1039 utils/adt/oracle_compat.c:1092 +#: utils/adt/oracle_compat.c:1042 utils/adt/oracle_compat.c:1095 #, c-format msgid "requested character too large for encoding: %u" msgstr "код запрошенного Ñимвола Ñлишком велик Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸: %u" -#: utils/adt/oracle_compat.c:1080 +#: utils/adt/oracle_compat.c:1083 #, c-format msgid "requested character not valid for encoding: %u" msgstr "запрошенный Ñимвол не подходит Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸: %u" -#: utils/adt/orderedsetaggs.c:448 utils/adt/orderedsetaggs.c:552 -#: utils/adt/orderedsetaggs.c:690 +#: utils/adt/orderedsetaggs.c:446 utils/adt/orderedsetaggs.c:551 +#: utils/adt/orderedsetaggs.c:691 #, c-format msgid "percentile value %g is not between 0 and 1" msgstr "значение Ð¿ÐµÑ€Ñ†ÐµÐ½Ñ‚Ð¸Ð»Ñ %g лежит не в диапазоне 0..1" -#: utils/adt/pg_locale.c:1228 +#: utils/adt/pg_locale.c:326 utils/adt/pg_locale.c:358 #, c-format -msgid "Apply system library package updates." -msgstr "Обновите пакет Ñ ÑиÑтемной библиотекой." +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" Ñодержит не-ASCII Ñимволы" -#: utils/adt/pg_locale.c:1452 utils/adt/pg_locale.c:1700 -#: utils/adt/pg_locale.c:1979 utils/adt/pg_locale.c:2001 +#: utils/adt/pg_locale.c:1507 #, c-format -msgid "could not open collator for locale \"%s\": %s" -msgstr "не удалоÑÑŒ открыть Ñортировщик Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\": %s" +msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" +msgstr "" +"не удалоÑÑŒ открыть Ñортировщик Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°Ð¼Ð¸ \"%s\": %s" -#: utils/adt/pg_locale.c:1465 utils/adt/pg_locale.c:2010 +#: utils/adt/pg_locale.c:1518 utils/adt/pg_locale.c:2992 +#: utils/adt/pg_locale.c:3065 #, c-format msgid "ICU is not supported in this build" msgstr "ICU не поддерживаетÑÑ Ð² данной Ñборке" -#: utils/adt/pg_locale.c:1494 +#: utils/adt/pg_locale.c:1546 #, c-format msgid "could not create locale \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать локаль \"%s\": %m" -#: utils/adt/pg_locale.c:1497 +#: utils/adt/pg_locale.c:1549 #, c-format msgid "" "The operating system could not find any locale data for the locale name " "\"%s\"." msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÑиÑтема не может найти данные локали Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"%s\"." -#: utils/adt/pg_locale.c:1605 +#: utils/adt/pg_locale.c:1670 #, c-format msgid "" "collations with different collate and ctype values are not supported on this " @@ -27359,22 +29405,17 @@ msgstr "" "правила Ñортировки Ñ Ñ€Ð°Ð·Ð½Ñ‹Ð¼Ð¸ значениÑми collate и ctype не поддерживаютÑÑ Ð½Ð° " "Ñтой платформе" -#: utils/adt/pg_locale.c:1614 -#, c-format -msgid "collation provider LIBC is not supported on this platform" -msgstr "провайдер правил Ñортировки LIBC не поддерживаетÑÑ Ð½Ð° Ñтой платформе" - -#: utils/adt/pg_locale.c:1649 +#: utils/adt/pg_locale.c:1717 #, c-format msgid "collation \"%s\" has no actual version, but a version was recorded" msgstr "Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° Ñортировки \"%s\", лишённого верÑии, была запиÑана верÑиÑ" -#: utils/adt/pg_locale.c:1655 +#: utils/adt/pg_locale.c:1723 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "неÑовпадение верÑии Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° Ñортировки \"%s\"" -#: utils/adt/pg_locale.c:1657 +#: utils/adt/pg_locale.c:1725 #, c-format msgid "" "The collation in the database was created using version %s, but the " @@ -27383,7 +29424,7 @@ msgstr "" "Правило Ñортировки в базе данных было Ñоздано Ñ Ð²ÐµÑ€Ñией %s, но Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ " "ÑиÑтема предоÑтавлÑет верÑию %s." -#: utils/adt/pg_locale.c:1660 +#: utils/adt/pg_locale.c:1728 #, c-format msgid "" "Rebuild all objects affected by this collation and run ALTER COLLATION %s " @@ -27393,40 +29434,98 @@ msgstr "" "ALTER COLLATION %s REFRESH VERSION либо Ñоберите PostgreSQL Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð¹ " "верÑией библиотеки." -#: utils/adt/pg_locale.c:1731 +#: utils/adt/pg_locale.c:1772 utils/adt/pg_locale.c:2556 +#: utils/adt/pg_locale.c:2581 +#, c-format +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "неверное Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" Ð´Ð»Ñ Ð²Ñтроенного провайдера" + +#: utils/adt/pg_locale.c:1814 #, c-format msgid "could not load locale \"%s\"" msgstr "не удалоÑÑŒ загрузить локаль \"%s\"" -#: utils/adt/pg_locale.c:1756 +#: utils/adt/pg_locale.c:1839 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "" "не удалоÑÑŒ получить верÑию правила Ñортировки Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" (код ошибки: " "%lu)" -#: utils/adt/pg_locale.c:1794 +#: utils/adt/pg_locale.c:1895 utils/adt/pg_locale.c:1908 +#, c-format +msgid "could not convert string to UTF-16: error code %lu" +msgstr "не удалоÑÑŒ преобразовать Ñтроку в UTF-16 (код ошибки: %lu)" + +#: utils/adt/pg_locale.c:1920 +#, c-format +msgid "could not compare Unicode strings: %m" +msgstr "не удалоÑÑŒ Ñравнить Ñтроки в Unicode: %m" + +#: utils/adt/pg_locale.c:2094 +#, c-format +msgid "collation failed: %s" +msgstr "ошибка в библиотеке Ñортировки: %s" + +#: utils/adt/pg_locale.c:2313 utils/adt/pg_locale.c:2345 +#, c-format +msgid "sort key generation failed: %s" +msgstr "не удалоÑÑŒ Ñгенерировать ключ Ñортировки: %s" + +#: utils/adt/pg_locale.c:2635 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "не удалоÑÑŒ определить Ñзык Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\": %s" + +#: utils/adt/pg_locale.c:2656 utils/adt/pg_locale.c:2672 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "не удалоÑÑŒ открыть Ñортировщик Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\": %s" + +#: utils/adt/pg_locale.c:2697 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "ICU не поддерживает кодировку \"%s\"" -#: utils/adt/pg_locale.c:1801 +#: utils/adt/pg_locale.c:2704 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "не удалоÑÑŒ открыть преобразователь ICU Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸ \"%s\": %s" -#: utils/adt/pg_locale.c:1832 utils/adt/pg_locale.c:1841 -#: utils/adt/pg_locale.c:1870 utils/adt/pg_locale.c:1880 +#: utils/adt/pg_locale.c:2722 utils/adt/pg_locale.c:2741 +#: utils/adt/pg_locale.c:2797 utils/adt/pg_locale.c:2808 #, c-format msgid "%s failed: %s" msgstr "ошибка %s: %s" -#: utils/adt/pg_locale.c:2179 +#: utils/adt/pg_locale.c:2983 +#, c-format +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "не удалоÑÑŒ получить из Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" метку Ñзыка: %s" + +#: utils/adt/pg_locale.c:3024 +#, c-format +msgid "could not get language from ICU locale \"%s\": %s" +msgstr "не удалоÑÑŒ определить Ñзык Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ ICU \"%s\": %s" + +#: utils/adt/pg_locale.c:3026 utils/adt/pg_locale.c:3055 +#, c-format +msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." +msgstr "" +"Чтобы отключить проверку локалей ICU, уÑтановите Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\" " +"значение \"%s\"." + +#: utils/adt/pg_locale.c:3053 +#, c-format +msgid "ICU locale \"%s\" has unknown language \"%s\"" +msgstr "Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ ICU \"%s\" получен неизвеÑтный Ñзык \"%s\"" + +#: utils/adt/pg_locale.c:3204 #, c-format msgid "invalid multibyte character for locale" msgstr "неверный многобайтный Ñимвол Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸" -#: utils/adt/pg_locale.c:2180 +#: utils/adt/pg_locale.c:3205 #, c-format msgid "" "The server's LC_CTYPE locale is probably incompatible with the database " @@ -27434,136 +29533,142 @@ msgid "" msgstr "" "Параметр локали Ñервера LC_CTYPE, возможно, неÑовмеÑтим Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¾Ð¹ БД." -#: utils/adt/pg_lsn.c:263 +#: utils/adt/pg_lsn.c:262 #, c-format msgid "cannot add NaN to pg_lsn" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ NaN к pg_lsn" -#: utils/adt/pg_lsn.c:297 +#: utils/adt/pg_lsn.c:296 #, c-format msgid "cannot subtract NaN from pg_lsn" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ñ‡ÐµÑть NaN из pg_lsn" -#: utils/adt/pg_upgrade_support.c:29 +#: utils/adt/pg_upgrade_support.c:39 #, c-format msgid "function can only be called when server is in binary upgrade mode" msgstr "" "функцию можно вызывать только когда Ñервер в режиме двоичного обновлениÑ" -#: utils/adt/pgstatfuncs.c:482 +#: utils/adt/pgstatfuncs.c:252 #, c-format msgid "invalid command name: \"%s\"" msgstr "неверное Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹: \"%s\"" -#: utils/adt/pgstatfuncs.c:2114 +#: utils/adt/pgstatfuncs.c:1739 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "запрошен ÑÐ±Ñ€Ð¾Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтного Ñчётчика: \"%s\"" -#: utils/adt/pgstatfuncs.c:2115 +#: utils/adt/pgstatfuncs.c:1740 #, c-format msgid "" -"Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." +"Target must be \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", " +"\"recovery_prefetch\", \"slru\", or \"wal\"." msgstr "" -"ДопуÑтимый Ñчётчик: \"archiver\", \"bgwriter\", \"recovery_prefetch\" или " -"\"wal\"." +"ДопуÑтимые Ñчётчики: \"archiver\", \"bgwriter\", \"io\", " +"\"recovery_prefetch\", \"slru\" и \"wal\"." -#: utils/adt/pgstatfuncs.c:2193 +#: utils/adt/pgstatfuncs.c:1822 #, c-format msgid "invalid subscription OID %u" msgstr "неверный OID подпиÑки %u" -#: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 +#: utils/adt/pseudorandomfuncs.c:69 +#, c-format +msgid "setseed parameter %g is out of allowed range [-1,1]" +msgstr "параметр setseed %g вне допуÑтимого диапазона [-1,1]" + +#: utils/adt/pseudotypes.c:55 utils/adt/pseudotypes.c:89 #, c-format msgid "cannot display a value of type %s" msgstr "значение типа %s Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð²ÐµÑти" -#: utils/adt/pseudotypes.c:321 +#: utils/adt/pseudotypes.c:307 #, c-format msgid "cannot accept a value of a shell type" msgstr "значение типа shell Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ð²ÐµÑти" -#: utils/adt/pseudotypes.c:331 +#: utils/adt/pseudotypes.c:317 #, c-format msgid "cannot display a value of a shell type" msgstr "значение типа shell Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð²ÐµÑти" -#: utils/adt/rangetypes.c:404 +#: utils/adt/rangetypes.c:422 #, c-format msgid "range constructor flags argument must not be null" msgstr "аргумент flags конÑтруктора диапазона не может быть NULL" -#: utils/adt/rangetypes.c:1003 +#: utils/adt/rangetypes.c:1021 #, c-format msgid "result of range difference would not be contiguous" msgstr "результат Ð²Ñ‹Ñ‡Ð¸Ñ‚Ð°Ð½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð² будет не непрерывным" -#: utils/adt/rangetypes.c:1064 +#: utils/adt/rangetypes.c:1082 #, c-format msgid "result of range union would not be contiguous" msgstr "результат Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð¾Ð² будет не непрерывным" -#: utils/adt/rangetypes.c:1689 +#: utils/adt/rangetypes.c:1757 #, c-format msgid "range lower bound must be less than or equal to range upper bound" msgstr "нижнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° диапазона должна быть меньше или равна верхней" -#: utils/adt/rangetypes.c:2112 utils/adt/rangetypes.c:2125 -#: utils/adt/rangetypes.c:2139 +#: utils/adt/rangetypes.c:2256 utils/adt/rangetypes.c:2269 +#: utils/adt/rangetypes.c:2283 #, c-format msgid "invalid range bound flags" msgstr "неверные флаги границ диапазона" -#: utils/adt/rangetypes.c:2113 utils/adt/rangetypes.c:2126 -#: utils/adt/rangetypes.c:2140 +#: utils/adt/rangetypes.c:2257 utils/adt/rangetypes.c:2270 +#: utils/adt/rangetypes.c:2284 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "ДопуÑтимые значениÑ: \"[]\", \"[)\", \"(]\" и \"()\"." -#: utils/adt/rangetypes.c:2205 utils/adt/rangetypes.c:2222 -#: utils/adt/rangetypes.c:2235 utils/adt/rangetypes.c:2253 -#: utils/adt/rangetypes.c:2264 utils/adt/rangetypes.c:2308 -#: utils/adt/rangetypes.c:2316 +#: utils/adt/rangetypes.c:2352 utils/adt/rangetypes.c:2369 +#: utils/adt/rangetypes.c:2384 utils/adt/rangetypes.c:2404 +#: utils/adt/rangetypes.c:2415 utils/adt/rangetypes.c:2462 +#: utils/adt/rangetypes.c:2470 #, c-format msgid "malformed range literal: \"%s\"" msgstr "ошибочный литерал диапазона: \"%s\"" -#: utils/adt/rangetypes.c:2207 +#: utils/adt/rangetypes.c:2354 #, c-format msgid "Junk after \"empty\" key word." msgstr "МуÑор поÑле ключевого Ñлова \"empty\"." -#: utils/adt/rangetypes.c:2224 +#: utils/adt/rangetypes.c:2371 #, c-format msgid "Missing left parenthesis or bracket." msgstr "ОтÑутÑтвует Ð»ÐµÐ²Ð°Ñ Ñкобка (ÐºÑ€ÑƒÐ³Ð»Ð°Ñ Ð¸Ð»Ð¸ квадратнаÑ)." -#: utils/adt/rangetypes.c:2237 +#: utils/adt/rangetypes.c:2386 #, c-format msgid "Missing comma after lower bound." msgstr "ОтÑутÑтвует запÑÑ‚Ð°Ñ Ð¿Ð¾Ñле нижней границы." -#: utils/adt/rangetypes.c:2255 +#: utils/adt/rangetypes.c:2406 #, c-format msgid "Too many commas." msgstr "Слишком много запÑтых." -#: utils/adt/rangetypes.c:2266 +#: utils/adt/rangetypes.c:2417 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "МуÑор поÑле правой Ñкобки." -#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4528 +#: utils/adt/regexp.c:304 utils/adt/regexp.c:1996 utils/adt/varlena.c:4273 #, c-format msgid "regular expression failed: %s" msgstr "ошибка в регулÑрном выражении: %s" -#: utils/adt/regexp.c:431 utils/adt/regexp.c:666 +#: utils/adt/regexp.c:445 utils/adt/regexp.c:680 #, c-format msgid "invalid regular expression option: \"%.*s\"" msgstr "неверный параметр регулÑрного выражениÑ: \"%.*s\"" -#: utils/adt/regexp.c:668 +#: utils/adt/regexp.c:682 #, c-format msgid "" "If you meant to use regexp_replace() with a start parameter, cast the fourth " @@ -27572,15 +29677,15 @@ msgstr "" "ЕÑли вы хотите вызвать regexp_replace() Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ start, Ñвно приведите " "четвёртый аргумент к целочиÑленному типу." -#: utils/adt/regexp.c:702 utils/adt/regexp.c:711 utils/adt/regexp.c:1068 -#: utils/adt/regexp.c:1132 utils/adt/regexp.c:1141 utils/adt/regexp.c:1150 -#: utils/adt/regexp.c:1159 utils/adt/regexp.c:1839 utils/adt/regexp.c:1848 -#: utils/adt/regexp.c:1857 utils/misc/guc.c:11859 utils/misc/guc.c:11893 +#: utils/adt/regexp.c:716 utils/adt/regexp.c:725 utils/adt/regexp.c:1082 +#: utils/adt/regexp.c:1146 utils/adt/regexp.c:1155 utils/adt/regexp.c:1164 +#: utils/adt/regexp.c:1173 utils/adt/regexp.c:1853 utils/adt/regexp.c:1862 +#: utils/adt/regexp.c:1871 utils/misc/guc.c:6820 utils/misc/guc.c:6854 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "неверное значение параметра \"%s\": %d" -#: utils/adt/regexp.c:922 +#: utils/adt/regexp.c:936 #, c-format msgid "" "SQL regular expression may not contain more than two escape-double-quote " @@ -27590,115 +29695,114 @@ msgstr "" "(Ñкранированных кавычек)" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:1079 utils/adt/regexp.c:1170 utils/adt/regexp.c:1257 -#: utils/adt/regexp.c:1296 utils/adt/regexp.c:1684 utils/adt/regexp.c:1739 -#: utils/adt/regexp.c:1868 +#: utils/adt/regexp.c:1093 utils/adt/regexp.c:1184 utils/adt/regexp.c:1271 +#: utils/adt/regexp.c:1310 utils/adt/regexp.c:1698 utils/adt/regexp.c:1753 +#: utils/adt/regexp.c:1882 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s не поддерживает режим \"global\"" -#: utils/adt/regexp.c:1298 +#: utils/adt/regexp.c:1312 #, c-format msgid "Use the regexp_matches function instead." msgstr "ВмеÑто неё иÑпользуйте функцию regexp_matches." -#: utils/adt/regexp.c:1486 +#: utils/adt/regexp.c:1500 #, c-format msgid "too many regular expression matches" msgstr "Ñлишком много Ñовпадений Ð´Ð»Ñ Ñ€ÐµÐ³ÑƒÐ»Ñрного выражениÑ" -#: utils/adt/regproc.c:105 +#: utils/adt/regproc.c:104 #, c-format msgid "more than one function named \"%s\"" msgstr "Ð¸Ð¼Ñ \"%s\" имеют неÑколько функций" -#: utils/adt/regproc.c:543 +#: utils/adt/regproc.c:513 #, c-format msgid "more than one operator named %s" msgstr "Ð¸Ð¼Ñ %s имеют неÑколько операторов" -#: utils/adt/regproc.c:710 utils/adt/regproc.c:751 gram.y:8771 +#: utils/adt/regproc.c:670 gram.y:8992 #, c-format msgid "missing argument" msgstr "отÑутÑтвует аргумент" -#: utils/adt/regproc.c:711 utils/adt/regproc.c:752 gram.y:8772 +#: utils/adt/regproc.c:671 gram.y:8993 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "" "Чтобы обозначить отÑутÑтвующий аргумент унарного оператора, укажите NONE." -#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 -#: utils/adt/ruleutils.c:9872 utils/adt/ruleutils.c:10041 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10516 +#: utils/adt/ruleutils.c:10729 #, c-format msgid "too many arguments" msgstr "Ñлишком много аргументов" -#: utils/adt/regproc.c:716 utils/adt/regproc.c:757 +#: utils/adt/regproc.c:676 #, c-format msgid "Provide two argument types for operator." msgstr "ПредоÑтавьте Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° два типа аргументов." -#: utils/adt/regproc.c:1639 utils/adt/regproc.c:1663 utils/adt/regproc.c:1764 -#: utils/adt/regproc.c:1788 utils/adt/regproc.c:1890 utils/adt/regproc.c:1895 -#: utils/adt/varlena.c:3667 utils/adt/varlena.c:3672 +#: utils/adt/regproc.c:1564 utils/adt/regproc.c:1681 utils/adt/regproc.c:1810 +#: utils/adt/regproc.c:1815 utils/adt/varlena.c:3413 utils/adt/varlena.c:3418 #, c-format msgid "invalid name syntax" msgstr "ошибка ÑинтакÑиÑа в имени" -#: utils/adt/regproc.c:1953 +#: utils/adt/regproc.c:1924 #, c-format msgid "expected a left parenthesis" msgstr "ожидалаÑÑŒ Ð»ÐµÐ²Ð°Ñ Ñкобка" -#: utils/adt/regproc.c:1969 +#: utils/adt/regproc.c:1942 #, c-format msgid "expected a right parenthesis" msgstr "ожидалаÑÑŒ Ð¿Ñ€Ð°Ð²Ð°Ñ Ñкобка" -#: utils/adt/regproc.c:1988 +#: utils/adt/regproc.c:1961 #, c-format msgid "expected a type name" msgstr "ожидалоÑÑŒ Ð¸Ð¼Ñ Ñ‚Ð¸Ð¿Ð°" -#: utils/adt/regproc.c:2020 +#: utils/adt/regproc.c:1993 #, c-format msgid "improper type name" msgstr "ошибочное Ð¸Ð¼Ñ Ñ‚Ð¸Ð¿Ð°" -#: utils/adt/ri_triggers.c:307 utils/adt/ri_triggers.c:1611 -#: utils/adt/ri_triggers.c:2598 +#: utils/adt/ri_triggers.c:303 utils/adt/ri_triggers.c:1616 +#: utils/adt/ri_triggers.c:2601 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "" "INSERT или UPDATE в таблице \"%s\" нарушает ограничение внешнего ключа \"%s\"" -#: utils/adt/ri_triggers.c:310 utils/adt/ri_triggers.c:1614 +#: utils/adt/ri_triggers.c:306 utils/adt/ri_triggers.c:1619 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MATCH FULL не позволÑет Ñмешивать в значении ключа null и не null." -#: utils/adt/ri_triggers.c:2031 +#: utils/adt/ri_triggers.c:2036 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" должна запуÑкатьÑÑ Ð´Ð»Ñ INSERT" -#: utils/adt/ri_triggers.c:2037 +#: utils/adt/ri_triggers.c:2042 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" должна запуÑкатьÑÑ Ð´Ð»Ñ UPDATE" -#: utils/adt/ri_triggers.c:2043 +#: utils/adt/ri_triggers.c:2048 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" должна запуÑкатьÑÑ Ð´Ð»Ñ DELETE" -#: utils/adt/ri_triggers.c:2066 +#: utils/adt/ri_triggers.c:2071 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° \"%s\" таблицы \"%s\" нет запиÑи pg_constraint" -#: utils/adt/ri_triggers.c:2068 +#: utils/adt/ri_triggers.c:2073 #, c-format msgid "" "Remove this referential integrity trigger and its mates, then do ALTER TABLE " @@ -27707,12 +29811,12 @@ msgstr "" "Удалите Ñтот триггер ÑÑылочной целоÑтноÑти и ÑвÑзанные объекты, а затем " "выполните ALTER TABLE ADD CONSTRAINT." -#: utils/adt/ri_triggers.c:2098 gram.y:4172 +#: utils/adt/ri_triggers.c:2103 gram.y:4340 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "выражение MATCH PARTIAL ещё не реализовано" -#: utils/adt/ri_triggers.c:2423 +#: utils/adt/ri_triggers.c:2426 #, c-format msgid "" "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave " @@ -27721,33 +29825,33 @@ msgstr "" "неожиданный результат запроÑа ÑÑылочной целоÑтноÑти к \"%s\" из Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ " "\"%s\" таблицы \"%s\"" -#: utils/adt/ri_triggers.c:2427 +#: utils/adt/ri_triggers.c:2430 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "Скорее вÑего Ñто вызвано правилом, перепиÑавшим запроÑ." -#: utils/adt/ri_triggers.c:2588 +#: utils/adt/ri_triggers.c:2591 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "" "при удалении Ñекции \"%s\" нарушаетÑÑ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ðµ внешнего ключа \"%s\"" -#: utils/adt/ri_triggers.c:2591 utils/adt/ri_triggers.c:2616 +#: utils/adt/ri_triggers.c:2594 utils/adt/ri_triggers.c:2619 #, c-format msgid "Key (%s)=(%s) is still referenced from table \"%s\"." msgstr "Ðа ключ (%s)=(%s) вÑÑ‘ ещё еÑть ÑÑылки в таблице \"%s\"." -#: utils/adt/ri_triggers.c:2602 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "Ключ (%s)=(%s) отÑутÑтвует в таблице \"%s\"." -#: utils/adt/ri_triggers.c:2605 +#: utils/adt/ri_triggers.c:2608 #, c-format msgid "Key is not present in table \"%s\"." msgstr "Ключ отÑутÑтвует в таблице \"%s\"." -#: utils/adt/ri_triggers.c:2611 +#: utils/adt/ri_triggers.c:2614 #, c-format msgid "" "update or delete on table \"%s\" violates foreign key constraint \"%s\" on " @@ -27756,48 +29860,48 @@ msgstr "" "UPDATE или DELETE в таблице \"%s\" нарушает ограничение внешнего ключа " "\"%s\" таблицы \"%s\"" -#: utils/adt/ri_triggers.c:2619 +#: utils/adt/ri_triggers.c:2622 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "Ðа ключ вÑÑ‘ ещё еÑть ÑÑылки в таблице \"%s\"." -#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:483 +#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:509 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "ввод анонимных ÑоÑтавных типов не реализован" -#: utils/adt/rowtypes.c:157 utils/adt/rowtypes.c:186 utils/adt/rowtypes.c:209 -#: utils/adt/rowtypes.c:217 utils/adt/rowtypes.c:269 utils/adt/rowtypes.c:277 +#: utils/adt/rowtypes.c:158 utils/adt/rowtypes.c:190 utils/adt/rowtypes.c:216 +#: utils/adt/rowtypes.c:227 utils/adt/rowtypes.c:285 utils/adt/rowtypes.c:296 #, c-format msgid "malformed record literal: \"%s\"" msgstr "ошибка в литерале запиÑи: \"%s\"" -#: utils/adt/rowtypes.c:158 +#: utils/adt/rowtypes.c:159 #, c-format msgid "Missing left parenthesis." msgstr "ОтÑутÑтвует Ð»ÐµÐ²Ð°Ñ Ñкобка." -#: utils/adt/rowtypes.c:187 +#: utils/adt/rowtypes.c:191 #, c-format msgid "Too few columns." msgstr "Слишком мало Ñтолбцов." -#: utils/adt/rowtypes.c:270 +#: utils/adt/rowtypes.c:286 #, c-format msgid "Too many columns." msgstr "Слишком много Ñтолбцов." -#: utils/adt/rowtypes.c:278 +#: utils/adt/rowtypes.c:297 #, c-format msgid "Junk after right parenthesis." msgstr "МуÑор поÑле правой Ñкобки." -#: utils/adt/rowtypes.c:532 +#: utils/adt/rowtypes.c:558 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "неверное чиÑло Ñтолбцов: %d, ожидалоÑÑŒ: %d" -#: utils/adt/rowtypes.c:574 +#: utils/adt/rowtypes.c:599 #, c-format msgid "" "binary data has type %u (%s) instead of expected %u (%s) in record column %d" @@ -27805,168 +29909,184 @@ msgstr "" "Ñ Ð±Ð¸Ð½Ð°Ñ€Ð½Ñ‹Ð¼Ð¸ данными ÑвÑзан тип %u (%s) вмеÑто ожидаемого %u (%s) в Ñтолбце " "запиÑи %d" -#: utils/adt/rowtypes.c:641 +#: utils/adt/rowtypes.c:660 #, c-format msgid "improper binary format in record column %d" msgstr "неподходÑщий двоичный формат в Ñтолбце запиÑи %d" -#: utils/adt/rowtypes.c:932 utils/adt/rowtypes.c:1178 utils/adt/rowtypes.c:1436 -#: utils/adt/rowtypes.c:1682 +#: utils/adt/rowtypes.c:949 utils/adt/rowtypes.c:1195 utils/adt/rowtypes.c:1453 +#: utils/adt/rowtypes.c:1699 #, c-format msgid "cannot compare dissimilar column types %s and %s at record column %d" msgstr "не удалоÑÑŒ Ñравнить различные типы Ñтолбцов %s и %s, Ñтолбец запиÑи %d" -#: utils/adt/rowtypes.c:1023 utils/adt/rowtypes.c:1248 -#: utils/adt/rowtypes.c:1533 utils/adt/rowtypes.c:1718 +#: utils/adt/rowtypes.c:1040 utils/adt/rowtypes.c:1265 +#: utils/adt/rowtypes.c:1550 utils/adt/rowtypes.c:1735 #, c-format msgid "cannot compare record types with different numbers of columns" msgstr "Ñравнивать типы запиÑей Ñ Ñ€Ð°Ð·Ð½Ñ‹Ð¼ чиÑлом Ñтолбцов нельзÑ" -#: utils/adt/ruleutils.c:2705 +#: utils/adt/ruleutils.c:2694 #, c-format msgid "input is a query, not an expression" msgstr "на вход поÑтупил запроÑ, а не выражение" -#: utils/adt/ruleutils.c:2717 +#: utils/adt/ruleutils.c:2706 #, c-format msgid "expression contains variables of more than one relation" msgstr "выражение Ñодержит переменные из неÑкольких отношений" -#: utils/adt/ruleutils.c:2724 +#: utils/adt/ruleutils.c:2713 #, c-format msgid "expression contains variables" msgstr "выражение Ñодержит переменные" -#: utils/adt/ruleutils.c:5247 +#: utils/adt/ruleutils.c:5246 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "правило \"%s\" имеет неподдерживаемый тип Ñобытий %d" -#: utils/adt/timestamp.c:110 +#: utils/adt/timestamp.c:128 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "TIMESTAMP(%d)%s: точноÑть должна быть неотрицательна" -#: utils/adt/timestamp.c:116 +#: utils/adt/timestamp.c:134 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "TIMESTAMP(%d)%s: точноÑть уменьшена до дозволенного макÑимума: %d" -#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12883 -#, c-format -msgid "timestamp out of range: \"%s\"" -msgstr "timestamp вне диапазона: \"%s\"" - -#: utils/adt/timestamp.c:375 +#: utils/adt/timestamp.c:394 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "точноÑть timestamp(%d) должна быть между %d и %d" -#: utils/adt/timestamp.c:499 +#: utils/adt/timestamp.c:512 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "" "ЗапиÑÑŒ чиÑлового чаÑового поÑÑа должна начинатьÑÑ Ñ Ñимвола \"-\" или \"+\"." -#: utils/adt/timestamp.c:512 +#: utils/adt/timestamp.c:524 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "чиÑловой чаÑовой поÑÑ \"%s\" вне диапазона" -#: utils/adt/timestamp.c:608 utils/adt/timestamp.c:618 -#: utils/adt/timestamp.c:626 +#: utils/adt/timestamp.c:625 utils/adt/timestamp.c:635 +#: utils/adt/timestamp.c:643 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "timestamp вне диапазона: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:727 +#: utils/adt/timestamp.c:744 #, c-format msgid "timestamp cannot be NaN" msgstr "timestamp не может быть NaN" -#: utils/adt/timestamp.c:745 utils/adt/timestamp.c:757 +#: utils/adt/timestamp.c:762 utils/adt/timestamp.c:774 #, c-format msgid "timestamp out of range: \"%g\"" msgstr "timestamp вне диапазона: \"%g\"" -#: utils/adt/timestamp.c:1062 utils/adt/timestamp.c:1095 +#: utils/adt/timestamp.c:957 utils/adt/timestamp.c:1516 +#: utils/adt/timestamp.c:1526 utils/adt/timestamp.c:1587 +#: utils/adt/timestamp.c:2807 utils/adt/timestamp.c:2816 +#: utils/adt/timestamp.c:2831 utils/adt/timestamp.c:2905 +#: utils/adt/timestamp.c:2922 utils/adt/timestamp.c:2979 +#: utils/adt/timestamp.c:3022 utils/adt/timestamp.c:3400 +#: utils/adt/timestamp.c:3458 utils/adt/timestamp.c:3481 +#: utils/adt/timestamp.c:3490 utils/adt/timestamp.c:3514 +#: utils/adt/timestamp.c:3537 utils/adt/timestamp.c:3546 +#: utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3782 +#: utils/adt/timestamp.c:4189 utils/adt/timestamp.c:4226 +#: utils/adt/timestamp.c:4274 utils/adt/timestamp.c:4283 +#: utils/adt/timestamp.c:4375 utils/adt/timestamp.c:4422 +#: utils/adt/timestamp.c:4431 utils/adt/timestamp.c:4527 +#: utils/adt/timestamp.c:4580 utils/adt/timestamp.c:4590 +#: utils/adt/timestamp.c:4785 utils/adt/timestamp.c:4795 +#: utils/adt/timestamp.c:5097 +#, c-format +msgid "interval out of range" +msgstr "interval вне диапазона" + +#: utils/adt/timestamp.c:1094 utils/adt/timestamp.c:1127 #, c-format msgid "invalid INTERVAL type modifier" msgstr "неверный модификатор типа INTERVAL" -#: utils/adt/timestamp.c:1078 +#: utils/adt/timestamp.c:1110 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d): точноÑть должна быть неотрицательна" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1116 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d): точноÑть уменьшена до макÑимально возможной: %d" -#: utils/adt/timestamp.c:1466 +#: utils/adt/timestamp.c:1506 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "точноÑть interval(%d) должна быть между %d и %d" -#: utils/adt/timestamp.c:2689 -#, c-format -msgid "cannot subtract infinite timestamps" -msgstr "вычитать беÑконечные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ timestamp нельзÑ" - -#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:4074 +#: utils/adt/timestamp.c:4564 utils/adt/timestamp.c:4769 #, c-format msgid "origin out of range" msgstr "начало вне диапазона" -#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:4079 +#: utils/adt/timestamp.c:4569 utils/adt/timestamp.c:4774 +#, c-format +msgid "timestamps cannot be binned into infinite intervals" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ timestamp Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð´Ð¾Ð³Ð½Ð°Ñ‚ÑŒ под беÑконечные интервалы" + +#: utils/adt/timestamp.c:4574 utils/adt/timestamp.c:4779 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "" "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ timestamp Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð´Ð¾Ð³Ð½Ð°Ñ‚ÑŒ под интервалы, Ñодержащие меÑÑцы или годы" -#: utils/adt/timestamp.c:3903 utils/adt/timestamp.c:4086 +#: utils/adt/timestamp.c:4585 utils/adt/timestamp.c:4790 #, c-format msgid "stride must be greater than zero" msgstr "шаг должен быть больше нулÑ" -#: utils/adt/timestamp.c:4399 +#: utils/adt/timestamp.c:5091 #, c-format msgid "Months usually have fractional weeks." msgstr "Ð’ меÑÑцах обычно дробное количеÑтво недель." -#: utils/adt/trigfuncs.c:42 +#: utils/adt/timestamp.c:6551 utils/adt/timestamp.c:6637 +#, c-format +msgid "step size cannot be infinite" +msgstr "размер шага не может быть беÑконечным" + +#: utils/adt/trigfuncs.c:41 #, c-format msgid "suppress_redundant_updates_trigger: must be called as trigger" msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ suppress_redundant_updates_trigger должна вызыватьÑÑ ÐºÐ°Ðº триггер" -#: utils/adt/trigfuncs.c:48 +#: utils/adt/trigfuncs.c:47 #, c-format msgid "suppress_redundant_updates_trigger: must be called on update" msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ suppress_redundant_updates_trigger должна вызыватьÑÑ Ð¿Ñ€Ð¸ обновлении" -#: utils/adt/trigfuncs.c:54 +#: utils/adt/trigfuncs.c:53 #, c-format msgid "suppress_redundant_updates_trigger: must be called before update" msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ suppress_redundant_updates_trigger должна вызыватьÑÑ Ð¿ÐµÑ€ÐµÐ´ " "обновлением" -#: utils/adt/trigfuncs.c:60 +#: utils/adt/trigfuncs.c:59 #, c-format msgid "suppress_redundant_updates_trigger: must be called for each row" msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ suppress_redundant_updates_trigger должна вызыватьÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ " "Ñтроки" -#: utils/adt/tsgistidx.c:92 -#, c-format -msgid "gtsvector_in not implemented" -msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ gtsvector_in не реализована" - -#: utils/adt/tsquery.c:199 utils/adt/tsquery_op.c:124 +#: utils/adt/tsquery.c:210 utils/adt/tsquery_op.c:125 #, c-format msgid "" "distance in phrase operator must be an integer value between zero and %d " @@ -27975,43 +30095,42 @@ msgstr "" "раÑÑтоÑние во фразовом операторе должно быть целым чиÑлом от 0 до %d " "включительно" -#: utils/adt/tsquery.c:306 utils/adt/tsquery.c:691 -#: utils/adt/tsvector_parser.c:133 -#, c-format -msgid "syntax error in tsquery: \"%s\"" -msgstr "ошибка ÑинтакÑиÑа в tsquery: \"%s\"" - -#: utils/adt/tsquery.c:330 +#: utils/adt/tsquery.c:344 #, c-format msgid "no operand in tsquery: \"%s\"" msgstr "нет оператора в tsquery: \"%s\"" -#: utils/adt/tsquery.c:534 +#: utils/adt/tsquery.c:554 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "Ñлишком большое значение в tsquery: \"%s\"" -#: utils/adt/tsquery.c:539 +#: utils/adt/tsquery.c:559 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "Ñлишком длинный операнд в tsquery: \"%s\"" -#: utils/adt/tsquery.c:567 +#: utils/adt/tsquery.c:587 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "Ñлишком длинное Ñлово в tsquery: \"%s\"" -#: utils/adt/tsquery.c:835 +#: utils/adt/tsquery.c:713 utils/adt/tsvector_parser.c:147 +#, c-format +msgid "syntax error in tsquery: \"%s\"" +msgstr "ошибка ÑинтакÑиÑа в tsquery: \"%s\"" + +#: utils/adt/tsquery.c:879 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾Ð¸Ñка текÑта не Ñодержит лекÑемы: \"%s\"" -#: utils/adt/tsquery.c:846 utils/adt/tsquery_util.c:375 +#: utils/adt/tsquery.c:890 utils/adt/tsquery_util.c:376 #, c-format msgid "tsquery is too large" msgstr "tsquery Ñлишком большой" -#: utils/adt/tsquery_cleanup.c:407 +#: utils/adt/tsquery_cleanup.c:409 #, c-format msgid "" "text-search query contains only stop words or doesn't contain lexemes, " @@ -28045,12 +30164,12 @@ msgstr "маÑÑив веÑов не может Ñодержать null" msgid "weight out of range" msgstr "Ð²ÐµÑ Ð²Ð½Ðµ диапазона" -#: utils/adt/tsvector.c:215 +#: utils/adt/tsvector.c:213 #, c-format msgid "word is too long (%ld bytes, max %ld bytes)" msgstr "Ñлово Ñлишком длинное (%ld Б, при макÑимуме %ld)" -#: utils/adt/tsvector.c:222 +#: utils/adt/tsvector.c:220 #, c-format msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "Ñтрока Ñлишком длинна Ð´Ð»Ñ tsvector (%ld Б, при макÑимуме %ld)" @@ -28065,73 +30184,73 @@ msgstr "маÑÑив лекÑем не может Ñодержать Ñлеме msgid "lexeme array may not contain empty strings" msgstr "маÑÑив лекÑем не должен Ñодержать пуÑтые Ñтроки" -#: utils/adt/tsvector_op.c:846 +#: utils/adt/tsvector_op.c:845 #, c-format msgid "weight array may not contain nulls" msgstr "маÑÑив веÑов не может Ñодержать Ñлементы null" -#: utils/adt/tsvector_op.c:870 +#: utils/adt/tsvector_op.c:869 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "нераÑпознанный веÑ: \"%c\"" -#: utils/adt/tsvector_op.c:2434 +#: utils/adt/tsvector_op.c:2599 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ ts_stat должен вернуть один Ñтолбец tsvector" -#: utils/adt/tsvector_op.c:2623 +#: utils/adt/tsvector_op.c:2788 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "Ñтолбец \"%s\" типа tsvector не ÑущеÑтвует" -#: utils/adt/tsvector_op.c:2630 +#: utils/adt/tsvector_op.c:2795 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "Ñтолбец \"%s\" должен иметь тип tsvector" -#: utils/adt/tsvector_op.c:2642 +#: utils/adt/tsvector_op.c:2807 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "Ñтолбец конфигурации \"%s\" не ÑущеÑтвует" -#: utils/adt/tsvector_op.c:2648 +#: utils/adt/tsvector_op.c:2813 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "Ñтолбец \"%s\" должен иметь тип regconfig" -#: utils/adt/tsvector_op.c:2655 +#: utils/adt/tsvector_op.c:2820 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "значение Ñтолбца конфигурации \"%s\" не должно быть null" -#: utils/adt/tsvector_op.c:2668 +#: utils/adt/tsvector_op.c:2833 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "Ð¸Ð¼Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ текÑтового поиÑка \"%s\" должно указыватьÑÑ Ñо Ñхемой" -#: utils/adt/tsvector_op.c:2693 +#: utils/adt/tsvector_op.c:2858 #, c-format msgid "column \"%s\" is not of a character type" msgstr "Ñтолбец \"%s\" имеет не Ñимвольный тип" -#: utils/adt/tsvector_parser.c:134 +#: utils/adt/tsvector_parser.c:148 #, c-format msgid "syntax error in tsvector: \"%s\"" msgstr "ошибка ÑинтакÑиÑа в tsvector: \"%s\"" # skip-rule: capital-letter-first -#: utils/adt/tsvector_parser.c:200 +#: utils/adt/tsvector_parser.c:221 #, c-format msgid "there is no escaped character: \"%s\"" msgstr "нет Ñпец. Ñимвола \"%s\"" -#: utils/adt/tsvector_parser.c:318 +#: utils/adt/tsvector_parser.c:339 #, c-format msgid "wrong position info in tsvector: \"%s\"" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ позиции в tsvector: \"%s\"" -#: utils/adt/uuid.c:413 +#: utils/adt/uuid.c:418 #, c-format msgid "could not generate random values" msgstr "не удалоÑÑŒ Ñгенерировать Ñлучайные значениÑ" @@ -28176,9 +30295,9 @@ msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° во внешней Ñтроке битов" msgid "bit string too long for type bit varying(%d)" msgstr "Ñтрока битов не умещаетÑÑ Ð² тип bit varying(%d)" -#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:889 -#: utils/adt/varlena.c:952 utils/adt/varlena.c:1109 utils/adt/varlena.c:3309 -#: utils/adt/varlena.c:3387 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:911 +#: utils/adt/varlena.c:974 utils/adt/varlena.c:1131 utils/adt/varlena.c:3055 +#: utils/adt/varlena.c:3133 #, c-format msgid "negative substring length not allowed" msgstr "подÑтрока должна иметь неотрицательную длину" @@ -28204,202 +30323,189 @@ msgstr "" msgid "bit index %d out of valid range (0..%d)" msgstr "Ð¸Ð½Ð´ÐµÐºÑ Ð±Ð¸Ñ‚Ð° %d вне диапазона 0..%d" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3591 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3337 #, c-format msgid "new bit must be 0 or 1" msgstr "значением бита должен быть 0 или 1" -#: utils/adt/varchar.c:157 utils/adt/varchar.c:310 +#: utils/adt/varchar.c:161 utils/adt/varchar.c:312 #, c-format msgid "value too long for type character(%d)" msgstr "значение не умещаетÑÑ Ð² тип character(%d)" -#: utils/adt/varchar.c:472 utils/adt/varchar.c:634 +#: utils/adt/varchar.c:475 utils/adt/varchar.c:639 #, c-format msgid "value too long for type character varying(%d)" msgstr "значение не умещаетÑÑ Ð² тип character varying(%d)" -#: utils/adt/varchar.c:732 utils/adt/varlena.c:1498 +#: utils/adt/varchar.c:737 utils/adt/varlena.c:1520 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "" "не удалоÑÑŒ определить, какое правило Ñортировки иÑпользовать Ð´Ð»Ñ ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ " "Ñтрок" -#: utils/adt/varlena.c:1208 utils/adt/varlena.c:1947 +#: utils/adt/varlena.c:1230 utils/adt/varlena.c:1809 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "" "недетерминированные правила Ñортировки не поддерживаютÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка подÑтрок" -#: utils/adt/varlena.c:1596 utils/adt/varlena.c:1609 -#, c-format -msgid "could not convert string to UTF-16: error code %lu" -msgstr "не удалоÑÑŒ преобразовать Ñтроку в UTF-16 (код ошибки: %lu)" - -#: utils/adt/varlena.c:1624 -#, c-format -msgid "could not compare Unicode strings: %m" -msgstr "не удалоÑÑŒ Ñравнить Ñтроки в Unicode: %m" - -#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2396 -#, c-format -msgid "collation failed: %s" -msgstr "ошибка в библиотеке Ñортировки: %s" - -#: utils/adt/varlena.c:2582 -#, c-format -msgid "sort key generation failed: %s" -msgstr "не удалоÑÑŒ Ñгенерировать ключ Ñортировки: %s" - -#: utils/adt/varlena.c:3475 utils/adt/varlena.c:3542 +#: utils/adt/varlena.c:3221 utils/adt/varlena.c:3288 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "Ð¸Ð½Ð´ÐµÐºÑ %d вне диапазона 0..%d" -#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3578 +#: utils/adt/varlena.c:3252 utils/adt/varlena.c:3324 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "Ð¸Ð½Ð´ÐµÐºÑ %lld вне диапазона 0..%lld" -#: utils/adt/varlena.c:4640 +#: utils/adt/varlena.c:4385 #, c-format msgid "field position must not be zero" msgstr "Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð¿Ð¾Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° быть отлична от 0" -#: utils/adt/varlena.c:5660 +#: utils/adt/varlena.c:5630 #, c-format msgid "unterminated format() type specifier" msgstr "незавершённый Ñпецификатор типа format()" -#: utils/adt/varlena.c:5661 utils/adt/varlena.c:5795 utils/adt/varlena.c:5916 +#: utils/adt/varlena.c:5631 utils/adt/varlena.c:5765 utils/adt/varlena.c:5886 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Ð”Ð»Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ знака \"%%\" запишите \"%%%%\"." -#: utils/adt/varlena.c:5793 utils/adt/varlena.c:5914 +#: utils/adt/varlena.c:5763 utils/adt/varlena.c:5884 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "нераÑпознанный Ñпецификатор типа format(): \"%.*s\"" -#: utils/adt/varlena.c:5806 utils/adt/varlena.c:5863 +#: utils/adt/varlena.c:5776 utils/adt/varlena.c:5833 #, c-format msgid "too few arguments for format()" msgstr "мало аргументов Ð´Ð»Ñ format()" -#: utils/adt/varlena.c:5959 utils/adt/varlena.c:6141 +#: utils/adt/varlena.c:5929 utils/adt/varlena.c:6111 #, c-format msgid "number is out of range" msgstr "чиÑло вне диапазона" -#: utils/adt/varlena.c:6022 utils/adt/varlena.c:6050 +#: utils/adt/varlena.c:5992 utils/adt/varlena.c:6020 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "формат ÑÑылаетÑÑ Ð½Ð° аргумент 0, но аргументы нумеруютÑÑ Ñ 1" -#: utils/adt/varlena.c:6043 +#: utils/adt/varlena.c:6013 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "указание аргумента ширины должно оканчиватьÑÑ \"$\"" -#: utils/adt/varlena.c:6088 +#: utils/adt/varlena.c:6058 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ null Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ´Ñтавить в виде SQL-идентификатора" -#: utils/adt/varlena.c:6214 +#: utils/adt/varlena.c:6266 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "" "нормализацию Unicode можно выполнÑть, только еÑли кодировка Ñервера — UTF8" -#: utils/adt/varlena.c:6227 +#: utils/adt/varlena.c:6279 #, c-format msgid "invalid normalization form: %s" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° нормализации: %s" -#: utils/adt/varlena.c:6430 utils/adt/varlena.c:6465 utils/adt/varlena.c:6500 +# well-spelled: категоризацию +#: utils/adt/varlena.c:6324 +#, c-format +msgid "Unicode categorization can only be performed if server encoding is UTF8" +msgstr "" +"категоризацию Unicode можно выполнÑть, только еÑли кодировка Ñервера — UTF8" + +#: utils/adt/varlena.c:6541 utils/adt/varlena.c:6576 utils/adt/varlena.c:6611 #, c-format msgid "invalid Unicode code point: %04X" msgstr "неверный код Ñимвола Unicode: %04X" -#: utils/adt/varlena.c:6530 +#: utils/adt/varlena.c:6641 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "" "Спецкоды Unicode должны иметь вид \\XXXX, \\+XXXXXX, \\uXXXX или \\UXXXXXXXX." -#: utils/adt/windowfuncs.c:306 +#: utils/adt/windowfuncs.c:443 #, c-format msgid "argument of ntile must be greater than zero" msgstr "аргумент ntile должен быть больше нулÑ" -#: utils/adt/windowfuncs.c:528 +#: utils/adt/windowfuncs.c:707 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "аргумент nth_value должен быть больше нулÑ" -#: utils/adt/xid8funcs.c:117 +#: utils/adt/xid8funcs.c:120 #, c-format msgid "transaction ID %llu is in the future" msgstr "ID транзакции %llu отноÑитÑÑ Ðº будущему" -#: utils/adt/xid8funcs.c:547 +#: utils/adt/xid8funcs.c:522 #, c-format msgid "invalid external pg_snapshot data" msgstr "неверное внешнее предÑтавление pg_snapshot" -#: utils/adt/xml.c:222 +#: utils/adt/xml.c:238 #, c-format msgid "unsupported XML feature" msgstr "XML-функции не поддерживаютÑÑ" -#: utils/adt/xml.c:223 +#: utils/adt/xml.c:239 #, c-format msgid "This functionality requires the server to be built with libxml support." msgstr "Ð”Ð»Ñ Ñтой функциональноÑти в Ñервере не хватает поддержки libxml." -#: utils/adt/xml.c:242 utils/mb/mbutils.c:627 +#: utils/adt/xml.c:258 utils/mb/mbutils.c:627 #, c-format msgid "invalid encoding name \"%s\"" msgstr "неверное Ð¸Ð¼Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸: \"%s\"" -#: utils/adt/xml.c:485 utils/adt/xml.c:490 +#: utils/adt/xml.c:506 utils/adt/xml.c:511 #, c-format msgid "invalid XML comment" msgstr "ошибка в XML-комментарии" -#: utils/adt/xml.c:619 +#: utils/adt/xml.c:697 #, c-format msgid "not an XML document" msgstr "не XML-документ" -#: utils/adt/xml.c:778 utils/adt/xml.c:801 +#: utils/adt/xml.c:1008 utils/adt/xml.c:1031 #, c-format msgid "invalid XML processing instruction" msgstr "Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ XML-инÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ (PI)" -#: utils/adt/xml.c:779 +#: utils/adt/xml.c:1009 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "назначением XML-инÑтрукции обработки (PI) не может быть \"%s\"." -#: utils/adt/xml.c:802 +#: utils/adt/xml.c:1032 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-инÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ (PI) не может Ñодержать \"?>\"." -#: utils/adt/xml.c:881 +#: utils/adt/xml.c:1111 #, c-format msgid "xmlvalidate is not implemented" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ xmlvalidate не реализована" -#: utils/adt/xml.c:960 +#: utils/adt/xml.c:1167 #, c-format msgid "could not initialize XML library" msgstr "не удалоÑÑŒ инициализировать библиотеку XML" -#: utils/adt/xml.c:961 +#: utils/adt/xml.c:1168 #, c-format msgid "" "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." @@ -28407,12 +30513,12 @@ msgstr "" "Ð’ libxml2 оказалÑÑ Ð½ÐµÑовмеÑтимый тип char: sizeof(char)=%zu, " "sizeof(xmlChar)=%zu." -#: utils/adt/xml.c:1047 +#: utils/adt/xml.c:1254 #, c-format msgid "could not set up XML error handler" msgstr "не удалоÑÑŒ уÑтановить обработчик XML-ошибок" -#: utils/adt/xml.c:1048 +#: utils/adt/xml.c:1255 #, c-format msgid "" "This probably indicates that the version of libxml2 being used is not " @@ -28421,120 +30527,125 @@ msgstr "" "Возможно, Ñто означает, что иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ libxml2 неÑовмеÑтима Ñ " "заголовочными файлами libxml2, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ был Ñобран PostgreSQL." -#: utils/adt/xml.c:1935 +#: utils/adt/xml.c:2281 msgid "Invalid character value." msgstr "Ðеверный Ñимвол." -#: utils/adt/xml.c:1938 +#: utils/adt/xml.c:2284 msgid "Space required." msgstr "ТребуетÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»." -#: utils/adt/xml.c:1941 +#: utils/adt/xml.c:2287 msgid "standalone accepts only 'yes' or 'no'." msgstr "значениÑми атрибута standalone могут быть только 'yes' и 'no'." -#: utils/adt/xml.c:1944 +#: utils/adt/xml.c:2290 msgid "Malformed declaration: missing version." msgstr "Ошибочное объÑвление: не указана верÑиÑ." -#: utils/adt/xml.c:1947 +#: utils/adt/xml.c:2293 msgid "Missing encoding in text declaration." msgstr "Ð’ объÑвлении не указана кодировка." -#: utils/adt/xml.c:1950 +#: utils/adt/xml.c:2296 msgid "Parsing XML declaration: '?>' expected." msgstr "Ошибка при разборе XML-объÑвлениÑ: ожидаетÑÑ '?>'." -#: utils/adt/xml.c:1953 +#: utils/adt/xml.c:2299 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "ÐераÑпознанный код ошибки libxml: %d." -#: utils/adt/xml.c:2210 +#: utils/adt/xml.c:2553 #, c-format msgid "XML does not support infinite date values." msgstr "XML не поддерживает беÑконечноÑть в датах." -#: utils/adt/xml.c:2232 utils/adt/xml.c:2259 +#: utils/adt/xml.c:2575 utils/adt/xml.c:2602 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML не поддерживает беÑконечноÑть в timestamp." -#: utils/adt/xml.c:2675 +#: utils/adt/xml.c:3018 #, c-format msgid "invalid query" msgstr "неверный запроÑ" -#: utils/adt/xml.c:4015 +#: utils/adt/xml.c:3110 +#, c-format +msgid "portal \"%s\" does not return tuples" +msgstr "портал \"%s\" не возвращает кортежи" + +#: utils/adt/xml.c:4362 #, c-format msgid "invalid array for XML namespace mapping" msgstr "неправильный маÑÑив Ñ ÑопоÑтавлениÑми проÑтранÑтв имён XML" -#: utils/adt/xml.c:4016 +#: utils/adt/xml.c:4363 #, c-format msgid "" "The array must be two-dimensional with length of the second axis equal to 2." msgstr "МаÑÑив должен быть двухмерным и Ñодержать 2 Ñлемента по второй оÑи." -#: utils/adt/xml.c:4040 +#: utils/adt/xml.c:4387 #, c-format msgid "empty XPath expression" msgstr "пуÑтое выражение XPath" -#: utils/adt/xml.c:4092 +#: utils/adt/xml.c:4439 #, c-format msgid "neither namespace name nor URI may be null" msgstr "ни префикÑ, ни URI проÑтранÑтва имён не может быть null" -#: utils/adt/xml.c:4099 +#: utils/adt/xml.c:4446 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "" "не удалоÑÑŒ зарегиÑтрировать проÑтранÑтво имён XML Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑом \"%s\" и URI " "\"%s\"" -#: utils/adt/xml.c:4450 +#: utils/adt/xml.c:4795 #, c-format msgid "DEFAULT namespace is not supported" msgstr "проÑтранÑтво имён DEFAULT не поддерживаетÑÑ" -#: utils/adt/xml.c:4479 +#: utils/adt/xml.c:4824 #, c-format msgid "row path filter must not be empty string" msgstr "путь отбираемых Ñтрок не должен быть пуÑтым" -#: utils/adt/xml.c:4510 +#: utils/adt/xml.c:4858 #, c-format msgid "column path filter must not be empty string" msgstr "путь отбираемого Ñтолбца не должен быть пуÑтым" -#: utils/adt/xml.c:4654 +#: utils/adt/xml.c:5005 #, c-format msgid "more than one value returned by column XPath expression" msgstr "выражение XPath, отбирающее Ñтолбец, возвратило более одного значениÑ" -#: utils/cache/lsyscache.c:1042 +#: utils/cache/lsyscache.c:1017 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "приведение типа %s к типу %s не ÑущеÑтвует" -#: utils/cache/lsyscache.c:2844 utils/cache/lsyscache.c:2877 -#: utils/cache/lsyscache.c:2910 utils/cache/lsyscache.c:2943 +#: utils/cache/lsyscache.c:2887 utils/cache/lsyscache.c:2920 +#: utils/cache/lsyscache.c:2953 utils/cache/lsyscache.c:2986 #, c-format msgid "type %s is only a shell" msgstr "тип %s ÑвлÑетÑÑ Ð¿ÑƒÑтышкой" -#: utils/cache/lsyscache.c:2849 +#: utils/cache/lsyscache.c:2892 #, c-format msgid "no input function available for type %s" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s нет функции ввода" -#: utils/cache/lsyscache.c:2882 +#: utils/cache/lsyscache.c:2925 #, c-format msgid "no output function available for type %s" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° %s нет функции вывода" -#: utils/cache/partcache.c:215 +#: utils/cache/partcache.c:216 #, c-format msgid "" "operator class \"%s\" of access method %s is missing support function %d for " @@ -28543,159 +30654,166 @@ msgstr "" "в клаÑÑе операторов \"%s\" метода доÑтупа %s нет опорной функции %d Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° " "%s" -#: utils/cache/plancache.c:720 +#: utils/cache/plancache.c:747 #, c-format msgid "cached plan must not change result type" msgstr "в кешированном плане не должен изменÑтьÑÑ Ñ‚Ð¸Ð¿ результата" -#: utils/cache/relcache.c:3753 +#: utils/cache/relcache.c:3801 #, c-format -msgid "heap relfilenode value not set when in binary upgrade mode" -msgstr "значение relfilenode Ð´Ð»Ñ ÐºÑƒÑ‡Ð¸ не задано в режиме двоичного обновлениÑ" +msgid "heap relfilenumber value not set when in binary upgrade mode" +msgstr "" +"значение relfilenumber Ð´Ð»Ñ ÐºÑƒÑ‡Ð¸ не задано в режиме двоичного обновлениÑ" -#: utils/cache/relcache.c:3761 +#: utils/cache/relcache.c:3809 #, c-format -msgid "unexpected request for new relfilenode in binary upgrade mode" +msgid "unexpected request for new relfilenumber in binary upgrade mode" msgstr "" -"неожиданный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ relfilenode в режиме двоичного обновлениÑ" +"неожиданный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ relfilenumber в режиме двоичного " +"обновлениÑ" -#: utils/cache/relcache.c:6472 +#: utils/cache/relcache.c:6539 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "Ñоздать файл инициализации Ð´Ð»Ñ ÐºÐµÑˆÐ° отношений \"%s\" не удалоÑÑŒ: %m" -#: utils/cache/relcache.c:6474 +#: utils/cache/relcache.c:6541 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Продолжаем вÑÑ‘ равно, Ñ…Ð¾Ñ‚Ñ Ñ‡Ñ‚Ð¾-то не так." -#: utils/cache/relcache.c:6796 +#: utils/cache/relcache.c:6871 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "не удалоÑÑŒ Ñтереть файл кеша \"%s\": %m" -#: utils/cache/relmapper.c:590 +#: utils/cache/relmapper.c:596 #, c-format msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "" "выполнить PREPARE Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸, изменившей ÑопоÑтавление отношений, нельзÑ" -#: utils/cache/relmapper.c:836 +#: utils/cache/relmapper.c:852 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "файл ÑопоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ð¹ \"%s\" Ñодержит неверные данные" -#: utils/cache/relmapper.c:846 +#: utils/cache/relmapper.c:862 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "ошибка контрольной Ñуммы в файле ÑопоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ð¹ \"%s\"" -#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:575 +#: utils/cache/typcache.c:1812 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "тип запиÑи не зарегиÑтрирован" -#: utils/error/assert.c:39 +#: utils/error/assert.c:37 #, c-format msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" msgstr "ЛОВУШКÐ: ИÑключительное уÑловие: неверные аргументы в PID %d\n" -#: utils/error/assert.c:42 +#: utils/error/assert.c:40 #, c-format -msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" -msgstr "ЛОВУШКÐ: %s(\"%s\", файл: \"%s\", Ñтрока: %d, PID: %d)\n" +msgid "TRAP: failed Assert(\"%s\"), File: \"%s\", Line: %d, PID: %d\n" +msgstr "ЛОВУШКÐ: нарушение Assert(\"%s\"), файл: \"%s\", Ñтрока: %d, PID: %d\n" -#: utils/error/elog.c:404 +#: utils/error/elog.c:415 #, c-format msgid "error occurred before error message processing is available\n" msgstr "произошла ошибка до готовноÑти подÑиÑтемы обработки Ñообщений\n" -#: utils/error/elog.c:1943 +#: utils/error/elog.c:2134 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "открыть файл \"%s\" как stderr не удалоÑÑŒ: %m" -#: utils/error/elog.c:1956 +#: utils/error/elog.c:2147 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "открыть файл \"%s\" как stdout не удалоÑÑŒ: %m" -#: utils/error/elog.c:2521 utils/error/elog.c:2548 utils/error/elog.c:2564 +#: utils/error/elog.c:2183 +#, c-format +msgid "Invalid character" +msgstr "ÐедопуÑтимый Ñимвол" + +#: utils/error/elog.c:2889 utils/error/elog.c:2916 utils/error/elog.c:2932 msgid "[unknown]" msgstr "[н/д]" -#: utils/error/elog.c:2837 utils/error/elog.c:3158 utils/error/elog.c:3265 +#: utils/error/elog.c:3202 utils/error/elog.c:3526 utils/error/elog.c:3633 msgid "missing error text" msgstr "отÑутÑтвует текÑÑ‚ ошибки" -#: utils/error/elog.c:2840 utils/error/elog.c:2843 +#: utils/error/elog.c:3205 utils/error/elog.c:3208 #, c-format msgid " at character %d" msgstr " (Ñимвол %d)" -#: utils/error/elog.c:2853 utils/error/elog.c:2860 +#: utils/error/elog.c:3218 utils/error/elog.c:3225 msgid "DETAIL: " msgstr "ПОДРОБÐОСТИ: " -#: utils/error/elog.c:2867 +#: utils/error/elog.c:3232 msgid "HINT: " msgstr "ПОДСКÐЗКÐ: " -#: utils/error/elog.c:2874 +#: utils/error/elog.c:3239 msgid "QUERY: " msgstr "ЗÐПРОС: " -#: utils/error/elog.c:2881 +#: utils/error/elog.c:3246 msgid "CONTEXT: " msgstr "КОÐТЕКСТ: " -#: utils/error/elog.c:2891 +#: utils/error/elog.c:3256 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "ПОЛОЖЕÐИЕ: %s, %s:%d\n" -#: utils/error/elog.c:2898 +#: utils/error/elog.c:3263 #, c-format msgid "LOCATION: %s:%d\n" msgstr "ПОЛОЖЕÐИЕ: %s:%d\n" -#: utils/error/elog.c:2905 +#: utils/error/elog.c:3270 msgid "BACKTRACE: " msgstr "СТЕК: " -#: utils/error/elog.c:2917 +#: utils/error/elog.c:3282 msgid "STATEMENT: " msgstr "ОПЕРÐТОР: " -#: utils/error/elog.c:3310 +#: utils/error/elog.c:3678 msgid "DEBUG" msgstr "ОТЛÐДКÐ" -#: utils/error/elog.c:3314 +#: utils/error/elog.c:3682 msgid "LOG" msgstr "СООБЩЕÐИЕ" -#: utils/error/elog.c:3317 +#: utils/error/elog.c:3685 msgid "INFO" msgstr "ИÐФОРМÐЦИЯ" -#: utils/error/elog.c:3320 +#: utils/error/elog.c:3688 msgid "NOTICE" msgstr "ЗÐМЕЧÐÐИЕ" -#: utils/error/elog.c:3324 +#: utils/error/elog.c:3692 msgid "WARNING" msgstr "ПРЕДУПРЕЖДЕÐИЕ" -#: utils/error/elog.c:3327 +#: utils/error/elog.c:3695 msgid "ERROR" msgstr "ОШИБКÐ" -#: utils/error/elog.c:3330 +#: utils/error/elog.c:3698 msgid "FATAL" msgstr "Ð’ÐЖÐО" -#: utils/error/elog.c:3333 +#: utils/error/elog.c:3701 msgid "PANIC" msgstr "ПÐÐИКÐ" @@ -28768,39 +30886,39 @@ msgstr "Отличительный блок имеет неверную длин msgid "incompatible library \"%s\": magic block mismatch" msgstr "неÑовмеÑÑ‚Ð¸Ð¼Ð°Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ° \"%s\": неÑоответÑтвие отличительного блока" -#: utils/fmgr/dfmgr.c:492 +#: utils/fmgr/dfmgr.c:475 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "доÑтуп к библиотеке \"%s\" не разрешён" -#: utils/fmgr/dfmgr.c:518 +#: utils/fmgr/dfmgr.c:501 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "неправильный Ð¼Ð°ÐºÑ€Ð¾Ñ Ð² пути динамичеÑкой библиотеки: %s" -#: utils/fmgr/dfmgr.c:558 +#: utils/fmgr/dfmgr.c:541 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "параметр dynamic_library_path Ñодержит компонент нулевой длины" -#: utils/fmgr/dfmgr.c:577 +#: utils/fmgr/dfmgr.c:560 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "" "параметр dynamic_library_path Ñодержит компонент, не ÑвлÑющийÑÑ Ð°Ð±Ñолютным " "путём" -#: utils/fmgr/fmgr.c:238 +#: utils/fmgr/fmgr.c:236 #, c-format msgid "internal function \"%s\" is not in internal lookup table" msgstr "внутренней функции \"%s\" нет во внутренней поиÑковой таблице" -#: utils/fmgr/fmgr.c:484 +#: utils/fmgr/fmgr.c:470 #, c-format msgid "could not find function information for function \"%s\"" msgstr "не удалоÑÑŒ найти информацию о функции \"%s\"" -#: utils/fmgr/fmgr.c:486 +#: utils/fmgr/fmgr.c:472 #, c-format msgid "" "SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname)." @@ -28808,25 +30926,25 @@ msgstr "" "ФункциÑм, вызываемым из SQL, требуетÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ðµ объÑвление " "PG_FUNCTION_INFO_V1(имÑ_функции)." -#: utils/fmgr/fmgr.c:504 +#: utils/fmgr/fmgr.c:490 #, c-format msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "" "верÑÐ¸Ñ API (%d), Ð²Ñ‹Ð´Ð°Ð½Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¾Ð¹ функцией \"%s\", не поддерживаетÑÑ" -#: utils/fmgr/fmgr.c:1985 +#: utils/fmgr/fmgr.c:2109 #, c-format msgid "operator class options info is absent in function call context" msgstr "" "Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ параметрах клаÑÑа операторов отÑутÑтвует в контекÑте вызова " "функции" -#: utils/fmgr/fmgr.c:2052 +#: utils/fmgr/fmgr.c:2176 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñзыковой проверки %u вызвана Ð´Ð»Ñ Ñзыка %u (а не %u)" -#: utils/fmgr/funcapi.c:498 +#: utils/fmgr/funcapi.c:496 #, c-format msgid "" "could not determine actual result type for function \"%s\" declared to " @@ -28835,126 +30953,121 @@ msgstr "" "не удалоÑÑŒ определить дейÑтвительный тип результата Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ \"%s\", " "объÑвленной как Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ñ‚Ð¸Ð¿ %s" -#: utils/fmgr/funcapi.c:643 +#: utils/fmgr/funcapi.c:642 #, c-format msgid "argument declared %s does not contain a range type but type %s" msgstr "" "аргумент, объÑвленный как \"%s\", Ñодержит не диапазонный тип, а тип %s" -#: utils/fmgr/funcapi.c:726 -#, c-format -msgid "could not find multirange type for data type %s" -msgstr "тип мультидиапазона Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° данных %s не найден" - -#: utils/fmgr/funcapi.c:1943 utils/fmgr/funcapi.c:1975 +#: utils/fmgr/funcapi.c:1929 utils/fmgr/funcapi.c:1961 #, c-format msgid "number of aliases does not match number of columns" msgstr "чиÑло пÑевдонимов не Ñовпадает Ñ Ñ‡Ð¸Ñлом Ñтолбцов" -#: utils/fmgr/funcapi.c:1969 +#: utils/fmgr/funcapi.c:1955 #, c-format msgid "no column alias was provided" msgstr "пÑевдоним Ñтолбца не указан" -#: utils/fmgr/funcapi.c:1993 +#: utils/fmgr/funcapi.c:1979 #, c-format msgid "could not determine row description for function returning record" msgstr "не удалоÑÑŒ определить опиÑание Ñтроки Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸, возвращающей запиÑÑŒ" -#: utils/init/miscinit.c:329 +#: utils/init/miscinit.c:353 #, c-format msgid "data directory \"%s\" does not exist" msgstr "каталог данных \"%s\" не ÑущеÑтвует" -#: utils/init/miscinit.c:334 +#: utils/init/miscinit.c:358 #, c-format msgid "could not read permissions of directory \"%s\": %m" -msgstr "не удалоÑÑŒ Ñчитать права на каталог \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать права на каталог \"%s\": %m" -#: utils/init/miscinit.c:342 +#: utils/init/miscinit.c:366 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "указанный каталог данных \"%s\" не ÑущеÑтвует" -#: utils/init/miscinit.c:358 +#: utils/init/miscinit.c:382 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "владелец каталога данных \"%s\" определён неверно" -#: utils/init/miscinit.c:360 +#: utils/init/miscinit.c:384 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "" "Сервер должен запуÑкать пользователь, ÑвлÑющийÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ каталога данных." -#: utils/init/miscinit.c:378 +#: utils/init/miscinit.c:402 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° данных \"%s\" уÑтановлены неправильные права доÑтупа" -#: utils/init/miscinit.c:380 +#: utils/init/miscinit.c:404 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "МаÑка прав должна быть u=rwx (0700) или u=rwx,g=rx (0750)." -#: utils/init/miscinit.c:665 utils/misc/guc.c:7830 +#: utils/init/miscinit.c:462 +#, c-format +msgid "could not change directory to \"%s\": %m" +msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m" + +#: utils/init/miscinit.c:720 utils/misc/guc.c:3650 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "" "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ в рамках операции Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñми по " "безопаÑноÑти" -#: utils/init/miscinit.c:733 +#: utils/init/miscinit.c:807 #, c-format msgid "role with OID %u does not exist" msgstr "роль Ñ OID %u не ÑущеÑтвует" -#: utils/init/miscinit.c:763 +#: utils/init/miscinit.c:853 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ \"%s\" вход запрещён" -#: utils/init/miscinit.c:781 +#: utils/init/miscinit.c:874 #, c-format msgid "too many connections for role \"%s\"" msgstr "Ñлишком много подключений Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ \"%s\"" -#: utils/init/miscinit.c:841 -#, c-format -msgid "permission denied to set session authorization" -msgstr "нет прав Ð´Ð»Ñ Ñмены объекта авторизации в ÑеанÑе" - -#: utils/init/miscinit.c:924 +#: utils/init/miscinit.c:1045 #, c-format msgid "invalid role OID: %u" msgstr "неверный OID роли: %u" -#: utils/init/miscinit.c:978 +#: utils/init/miscinit.c:1192 #, c-format msgid "database system is shut down" msgstr "ÑиÑтема БД выключена" -#: utils/init/miscinit.c:1065 +#: utils/init/miscinit.c:1279 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1079 +#: utils/init/miscinit.c:1293 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "не удалоÑÑŒ открыть файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1086 +#: utils/init/miscinit.c:1300 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "не удалоÑÑŒ прочитать файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1095 +#: utils/init/miscinit.c:1309 #, c-format msgid "lock file \"%s\" is empty" msgstr "файл блокировки \"%s\" пуÑÑ‚" -#: utils/init/miscinit.c:1096 +#: utils/init/miscinit.c:1310 #, c-format msgid "" "Either another server is starting, or the lock file is the remnant of a " @@ -28963,38 +31076,38 @@ msgstr "" "Либо ÑÐµÐ¹Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑкаетÑÑ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñервер, либо Ñтот файл оÑталÑÑ Ð² результате " "ÑÐ±Ð¾Ñ Ð¿Ñ€Ð¸ предыдущем запуÑке." -#: utils/init/miscinit.c:1140 +#: utils/init/miscinit.c:1354 #, c-format msgid "lock file \"%s\" already exists" msgstr "файл блокировки \"%s\" уже ÑущеÑтвует" -#: utils/init/miscinit.c:1144 +#: utils/init/miscinit.c:1358 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "Другой ÑкземплÑÑ€ postgres (PID %d) работает Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼ данных \"%s\"?" -#: utils/init/miscinit.c:1146 +#: utils/init/miscinit.c:1360 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "" "Другой ÑкземплÑÑ€ postmaster (PID %d) работает Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼ данных \"%s\"?" -#: utils/init/miscinit.c:1149 +#: utils/init/miscinit.c:1363 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Другой ÑкземплÑÑ€ postgres (PID %d) иÑпользует файл Ñокета \"%s\"?" -#: utils/init/miscinit.c:1151 +#: utils/init/miscinit.c:1365 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Другой ÑкземплÑÑ€ postmaster (PID %d) иÑпользует файл Ñокета \"%s\"?" -#: utils/init/miscinit.c:1202 +#: utils/init/miscinit.c:1416 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "не удалоÑÑŒ Ñтереть Ñтарый файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1204 +#: utils/init/miscinit.c:1418 #, c-format msgid "" "The file seems accidentally left over, but it could not be removed. Please " @@ -29003,48 +31116,48 @@ msgstr "" "КажетÑÑ, файл ÑохранилÑÑ Ð¿Ð¾ ошибке, но удалить его не получилоÑÑŒ. " "ПожалуйÑта, удалите файл вручную и повторите попытку." -#: utils/init/miscinit.c:1241 utils/init/miscinit.c:1255 -#: utils/init/miscinit.c:1266 +#: utils/init/miscinit.c:1455 utils/init/miscinit.c:1469 +#: utils/init/miscinit.c:1480 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "не удалоÑÑŒ запиÑать файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1377 utils/init/miscinit.c:1519 utils/misc/guc.c:10827 +#: utils/init/miscinit.c:1591 utils/init/miscinit.c:1733 utils/misc/guc.c:5765 #, c-format msgid "could not read from file \"%s\": %m" msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" -#: utils/init/miscinit.c:1507 +#: utils/init/miscinit.c:1721 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "не удалоÑÑŒ открыть файл \"%s\": %m; ошибка игнорируетÑÑ" -#: utils/init/miscinit.c:1532 +#: utils/init/miscinit.c:1746 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "файл блокировки \"%s\" Ñодержит неверный PID: %ld вмеÑто %ld" -#: utils/init/miscinit.c:1571 utils/init/miscinit.c:1587 +#: utils/init/miscinit.c:1785 utils/init/miscinit.c:1801 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\" не ÑвлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼ данных" -#: utils/init/miscinit.c:1573 +#: utils/init/miscinit.c:1787 #, c-format msgid "File \"%s\" is missing." msgstr "Файл \"%s\" отÑутÑтвует." -#: utils/init/miscinit.c:1589 +#: utils/init/miscinit.c:1803 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Файл \"%s\" Ñодержит неприемлемые данные." -#: utils/init/miscinit.c:1591 +#: utils/init/miscinit.c:1805 #, c-format msgid "You might need to initdb." msgstr "Возможно, вам нужно выполнить initdb." -#: utils/init/miscinit.c:1599 +#: utils/init/miscinit.c:1813 #, c-format msgid "" "The data directory was initialized by PostgreSQL version %s, which is not " @@ -29053,87 +31166,93 @@ msgstr "" "Каталог данных инициализирован Ñервером PostgreSQL верÑии %s, неÑовмеÑтимой " "Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ верÑией (%s)." -#: utils/init/postinit.c:258 +#: utils/init/postinit.c:259 #, c-format msgid "replication connection authorized: user=%s" msgstr "подключение Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ авторизовано: пользователь=%s" -#: utils/init/postinit.c:261 +#: utils/init/postinit.c:262 #, c-format msgid "connection authorized: user=%s" msgstr "подключение авторизовано: пользователь=%s" -#: utils/init/postinit.c:264 +#: utils/init/postinit.c:265 #, c-format msgid " database=%s" msgstr " база=%s" -#: utils/init/postinit.c:267 +#: utils/init/postinit.c:268 #, c-format msgid " application_name=%s" msgstr " приложение=%s" -#: utils/init/postinit.c:272 +#: utils/init/postinit.c:273 #, c-format msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" msgstr " SSL включён (протокол=%s, шифр=%s, битов=%d)" -#: utils/init/postinit.c:284 +#: utils/init/postinit.c:285 #, c-format -msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" -msgstr " GSS (аутентификациÑ=%s, шифрование=%s, принципал=%s)" +msgid "" +" GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s, principal=%s)" +msgstr "" +" GSS (аутентификациÑ=%s, шифрование=%s, делегированное_удоÑтоверение=%s, " +"принципал=%s)" -#: utils/init/postinit.c:285 utils/init/postinit.c:286 -#: utils/init/postinit.c:291 utils/init/postinit.c:292 +#: utils/init/postinit.c:286 utils/init/postinit.c:287 +#: utils/init/postinit.c:288 utils/init/postinit.c:293 +#: utils/init/postinit.c:294 utils/init/postinit.c:295 msgid "no" msgstr "нет" -#: utils/init/postinit.c:285 utils/init/postinit.c:286 -#: utils/init/postinit.c:291 utils/init/postinit.c:292 +#: utils/init/postinit.c:286 utils/init/postinit.c:287 +#: utils/init/postinit.c:288 utils/init/postinit.c:293 +#: utils/init/postinit.c:294 utils/init/postinit.c:295 msgid "yes" msgstr "да" -#: utils/init/postinit.c:290 +#: utils/init/postinit.c:292 #, c-format -msgid " GSS (authenticated=%s, encrypted=%s)" -msgstr " GSS (аутентификациÑ=%s, шифрование=%s)" +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)" +msgstr "" +" GSS (аутентификациÑ=%s, шифрование=%s, делегированное_удоÑтоверение=%s)" -#: utils/init/postinit.c:330 +#: utils/init/postinit.c:333 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "база данных \"%s\" иÑчезла из pg_database" -#: utils/init/postinit.c:332 +#: utils/init/postinit.c:335 #, c-format msgid "Database OID %u now seems to belong to \"%s\"." msgstr "Похоже, базой данных Ñ OID %u теперь владеет \"%s\"." -#: utils/init/postinit.c:352 +#: utils/init/postinit.c:355 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "база \"%s\" не принимает Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² данный момент" -#: utils/init/postinit.c:365 +#: utils/init/postinit.c:368 #, c-format msgid "permission denied for database \"%s\"" msgstr "доÑтуп к базе \"%s\" запрещён" -#: utils/init/postinit.c:366 +#: utils/init/postinit.c:369 #, c-format msgid "User does not have CONNECT privilege." msgstr "Пользователь не имеет привилегии CONNECT." -#: utils/init/postinit.c:383 +#: utils/init/postinit.c:389 #, c-format msgid "too many connections for database \"%s\"" msgstr "Ñлишком много подключений к БД \"%s\"" -#: utils/init/postinit.c:409 utils/init/postinit.c:416 +#: utils/init/postinit.c:413 utils/init/postinit.c:420 #, c-format msgid "database locale is incompatible with operating system" msgstr "локаль БД неÑовмеÑтима Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð¾Ð¹ ÑиÑтемой" -#: utils/init/postinit.c:410 +#: utils/init/postinit.c:414 #, c-format msgid "" "The database was initialized with LC_COLLATE \"%s\", which is not " @@ -29142,7 +31261,7 @@ msgstr "" "База данных была инициализирована Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ LC_COLLATE \"%s\", но ÑÐµÐ¹Ñ‡Ð°Ñ " "setlocale() не воÑпринимает его." -#: utils/init/postinit.c:412 utils/init/postinit.c:419 +#: utils/init/postinit.c:416 utils/init/postinit.c:423 #, c-format msgid "" "Recreate the database with another locale or install the missing locale." @@ -29150,7 +31269,7 @@ msgstr "" "ПереÑоздайте базу данных Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ локалью или уÑтановите поддержку нужной " "локали." -#: utils/init/postinit.c:417 +#: utils/init/postinit.c:421 #, c-format msgid "" "The database was initialized with LC_CTYPE \"%s\", which is not recognized " @@ -29159,12 +31278,12 @@ msgstr "" "База данных была инициализирована Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ LC_CTYPE \"%s\", но ÑÐµÐ¹Ñ‡Ð°Ñ " "setlocale() не воÑпринимает его." -#: utils/init/postinit.c:462 +#: utils/init/postinit.c:493 #, c-format msgid "database \"%s\" has a collation version mismatch" msgstr "неÑовпадение верÑии Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° Ñортировки в базе данных \"%s\"" -#: utils/init/postinit.c:464 +#: utils/init/postinit.c:495 #, c-format msgid "" "The database was created using collation version %s, but the operating " @@ -29173,7 +31292,7 @@ msgstr "" "База данных была Ñоздана Ñ Ð²ÐµÑ€Ñией правила Ñортировки %s, но Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ " "ÑиÑтема предоÑтавлÑет верÑию %s." -#: utils/init/postinit.c:467 +#: utils/init/postinit.c:498 #, c-format msgid "" "Rebuild all objects in this database that use the default collation and run " @@ -29184,54 +31303,74 @@ msgstr "" "Ñортировки, и выполните ALTER DATABASE %s REFRESH COLLATION VERSION, либо " "Ñоберите PostgreSQL Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð¹ верÑией библиотеки." -#: utils/init/postinit.c:835 +#: utils/init/postinit.c:904 #, c-format msgid "no roles are defined in this database system" msgstr "в Ñтой ÑиÑтеме баз данных не Ñоздано ни одной роли" -#: utils/init/postinit.c:836 +#: utils/init/postinit.c:905 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Ð’Ñ‹ должны немедленно выполнить CREATE USER \"%s\" CREATEUSER;." -#: utils/init/postinit.c:868 +#: utils/init/postinit.c:942 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "" "нужно быть Ñуперпользователем, чтобы подключитьÑÑ Ð² режиме двоичного " "обновлениÑ" -#: utils/init/postinit.c:881 +#: utils/init/postinit.c:962 #, c-format -msgid "" -"remaining connection slots are reserved for non-replication superuser " -"connections" +msgid "remaining connection slots are reserved for roles with the %s attribute" msgstr "" -"оÑтавшиеÑÑ Ñлоты подключений зарезервированы Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ð¹ " -"ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (не Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸)" +"оÑтавшиеÑÑ Ñлоты подключений зарезервированы Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ð¹ ролей Ñ " +"атрибутом %s" -#: utils/init/postinit.c:891 +#: utils/init/postinit.c:968 #, c-format -msgid "must be superuser or replication role to start walsender" +msgid "" +"remaining connection slots are reserved for roles with privileges of the " +"\"%s\" role" msgstr "" -"Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка процеÑÑа walsender требуетÑÑ Ñ€Ð¾Ð»ÑŒ репликации или права " -"ÑуперпользователÑ" +"оÑтавшиеÑÑ Ñлоты подключений зарезервированы Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ð¹ ролей Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ " +"роли \"%s\"" -#: utils/init/postinit.c:960 +#: utils/init/postinit.c:980 #, c-format -msgid "database %u does not exist" -msgstr "база данных %u не ÑущеÑтвует" +msgid "permission denied to start WAL sender" +msgstr "нет прав Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка процеÑÑа, передающего WAL" + +#: utils/init/postinit.c:981 +#, c-format +msgid "Only roles with the %s attribute may start a WAL sender process." +msgstr "Только роли Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð¾Ð¼ %s могут запуÑкать процеÑÑÑ‹, передающие WAL." -#: utils/init/postinit.c:1049 +#: utils/init/postinit.c:1099 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Похоже, она только что была удалена или переименована." -#: utils/init/postinit.c:1067 +#: utils/init/postinit.c:1103 +#, c-format +msgid "database %u does not exist" +msgstr "база данных %u не ÑущеÑтвует" + +#: utils/init/postinit.c:1112 +#, c-format +msgid "cannot connect to invalid database \"%s\"" +msgstr "подключитьÑÑ Ðº некорректной базе \"%s\" нельзÑ" + +#: utils/init/postinit.c:1173 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Подкаталог базы данных \"%s\" отÑутÑтвует." +#: utils/init/usercontext.c:43 +#, c-format +msgid "role \"%s\" cannot SET ROLE to \"%s\"" +msgstr "роль \"%s\" не может переключитьÑÑ Ð½Ð° \"%s\"" + #: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" @@ -29254,13 +31393,6 @@ msgstr "неожиданный ID кодировки %d Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð² Ñ msgid "conversion between %s and %s is not supported" msgstr "преобразование %s <-> %s не поддерживаетÑÑ" -#: utils/mb/mbutils.c:385 -#, c-format -msgid "" -"default conversion function for encoding \"%s\" to \"%s\" does not exist" -msgstr "" -"Ñтандартной функции Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð· кодировки \"%s\" в \"%s\" не ÑущеÑтвует" - #: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 #: utils/mb/mbutils.c:842 #, c-format @@ -29287,17 +31419,17 @@ msgstr "недопуÑтимое байтовое значение Ð´Ð»Ñ ÐºÐ¾Ð´ msgid "invalid Unicode code point" msgstr "неверный код Unicode" -#: utils/mb/mbutils.c:1146 +#: utils/mb/mbutils.c:1201 #, c-format msgid "bind_textdomain_codeset failed" msgstr "ошибка в bind_textdomain_codeset" -#: utils/mb/mbutils.c:1667 +#: utils/mb/mbutils.c:1718 #, c-format msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾ÑледовательноÑть байт Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¸ \"%s\": %s" -#: utils/mb/mbutils.c:1700 +#: utils/mb/mbutils.c:1751 #, c-format msgid "" "character with byte sequence %s in encoding \"%s\" has no equivalent in " @@ -29306,281 +31438,574 @@ msgstr "" "Ð´Ð»Ñ Ñимвола Ñ Ð¿Ð¾ÑледовательноÑтью байт %s из кодировки \"%s\" нет " "Ñквивалента в \"%s\"" -#: utils/misc/guc.c:776 -msgid "Ungrouped" -msgstr "Разное" - -#: utils/misc/guc.c:778 -msgid "File Locations" -msgstr "РаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²" - -#: utils/misc/guc.c:780 -msgid "Connections and Authentication / Connection Settings" -msgstr "ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ / Параметры подключений" - -#: utils/misc/guc.c:782 -msgid "Connections and Authentication / Authentication" -msgstr "ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ / ÐутентификациÑ" +#: utils/misc/conffiles.c:88 +#, c-format +msgid "empty configuration directory name: \"%s\"" +msgstr "пуÑтое Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° конфигурации: \"%s\"" -#: utils/misc/guc.c:784 -msgid "Connections and Authentication / SSL" -msgstr "ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ / SSL" +#: utils/misc/conffiles.c:100 +#, c-format +msgid "could not open configuration directory \"%s\": %m" +msgstr "открыть каталог конфигурации \"%s\" не удалоÑÑŒ: %m" -#: utils/misc/guc.c:786 -msgid "Resource Usage / Memory" -msgstr "ИÑпользование реÑурÑов / ПамÑть" +#: utils/misc/guc.c:122 +msgid "" +"Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." +msgstr "" +"ДопуÑтимые единицы Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого параметра: \"B\", \"kB\", \"MB\", " +"\"GB\" и \"TB\"." -#: utils/misc/guc.c:788 -msgid "Resource Usage / Disk" -msgstr "ИÑпользование реÑурÑов / ДиÑк" +#: utils/misc/guc.c:159 +msgid "" +"Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", " +"and \"d\"." +msgstr "" +"ДопуÑтимые единицы Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого параметра: \"us\", \"ms\", \"s\", " +"\"min\", \"h\" и \"d\"." -#: utils/misc/guc.c:790 -msgid "Resource Usage / Kernel Resources" -msgstr "ИÑпользование реÑурÑов / РеÑурÑÑ‹ Ñдра" +#: utils/misc/guc.c:430 +#, c-format +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "нераÑпознанный параметр конфигурации \"%s\" в файле \"%s\", Ñтроке %d" -#: utils/misc/guc.c:792 -msgid "Resource Usage / Cost-Based Vacuum Delay" -msgstr "ИÑпользование реÑурÑов / Задержка очиÑтки по ÑтоимоÑти" +#: utils/misc/guc.c:470 utils/misc/guc.c:3504 utils/misc/guc.c:3748 +#: utils/misc/guc.c:3846 utils/misc/guc.c:3944 utils/misc/guc.c:4071 +#: utils/misc/guc.c:4212 +#, c-format +msgid "parameter \"%s\" cannot be changed without restarting the server" +msgstr "параметр \"%s\" изменÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ при перезапуÑке Ñервера" -#: utils/misc/guc.c:794 -msgid "Resource Usage / Background Writer" -msgstr "ИÑпользование реÑурÑов / Ð¤Ð¾Ð½Ð¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ" +#: utils/misc/guc.c:506 +#, c-format +msgid "parameter \"%s\" removed from configuration file, reset to default" +msgstr "" +"параметр \"%s\" удалён из файла конфигурации, он принимает значение по " +"умолчанию" -#: utils/misc/guc.c:796 -msgid "Resource Usage / Asynchronous Behavior" -msgstr "ИÑпользование реÑурÑов / ÐÑинхронное поведение" +#: utils/misc/guc.c:571 +#, c-format +msgid "parameter \"%s\" changed to \"%s\"" +msgstr "параметр \"%s\" принÑл значение \"%s\"" -#: utils/misc/guc.c:798 -msgid "Write-Ahead Log / Settings" -msgstr "Журнал WAL / Параметры" +#: utils/misc/guc.c:613 +#, c-format +msgid "configuration file \"%s\" contains errors" +msgstr "файл конфигурации \"%s\" Ñодержит ошибки" -#: utils/misc/guc.c:800 -msgid "Write-Ahead Log / Checkpoints" -msgstr "Журнал WAL / Контрольные точки" +#: utils/misc/guc.c:618 +#, c-format +msgid "" +"configuration file \"%s\" contains errors; unaffected changes were applied" +msgstr "" +"файл конфигурации \"%s\" Ñодержит ошибки; были применены не завиÑимые " +"изменениÑ" -#: utils/misc/guc.c:802 -msgid "Write-Ahead Log / Archiving" -msgstr "Журнал WAL / ÐрхивациÑ" +#: utils/misc/guc.c:623 +#, c-format +msgid "configuration file \"%s\" contains errors; no changes were applied" +msgstr "файл конфигурации \"%s\" Ñодержит ошибки; Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ были применены" -#: utils/misc/guc.c:804 -msgid "Write-Ahead Log / Recovery" -msgstr "Журнал WAL / ВоÑÑтановление" +#: utils/misc/guc.c:1139 utils/misc/guc.c:1155 +#, c-format +msgid "invalid configuration parameter name \"%s\"" +msgstr "неверное Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° конфигурации: \"%s\"" -#: utils/misc/guc.c:806 -msgid "Write-Ahead Log / Archive Recovery" -msgstr "Журнал WAL / ВоÑÑтановление из архива" +#: utils/misc/guc.c:1141 +#, c-format +msgid "" +"Custom parameter names must be two or more simple identifiers separated by " +"dots." +msgstr "" +"Имена неÑтандартных параметров должны ÑоÑтоÑть из двух или более проÑтых " +"идентификаторов, разделённых точками." -#: utils/misc/guc.c:808 -msgid "Write-Ahead Log / Recovery Target" -msgstr "Журнал WAL / Цель воÑÑтановлениÑ" +#: utils/misc/guc.c:1157 +#, c-format +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\" — зарезервированный префикÑ." -#: utils/misc/guc.c:810 -msgid "Replication / Sending Servers" -msgstr "Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ / Передающие Ñерверы" +#: utils/misc/guc.c:1170 utils/misc/guc.c:1280 +#, c-format +msgid "unrecognized configuration parameter \"%s\"" +msgstr "нераÑпознанный параметр конфигурации: \"%s\"" -#: utils/misc/guc.c:812 -msgid "Replication / Primary Server" -msgstr "Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ / Ведущий Ñервер" +#: utils/misc/guc.c:1802 +#, c-format +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: ошибка при обращении к каталогу \"%s\": %m\n" -#: utils/misc/guc.c:814 -msgid "Replication / Standby Servers" -msgstr "Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ / Резервные Ñерверы" +#: utils/misc/guc.c:1806 +#, c-format +msgid "" +"Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" +msgstr "" +"ЗапуÑтите initdb или pg_basebackup Ð´Ð»Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ каталога данных " +"PostgreSQL.\n" -#: utils/misc/guc.c:816 -msgid "Replication / Subscribers" -msgstr "Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ / ПодпиÑчики" +#: utils/misc/guc.c:1830 +#, c-format +msgid "" +"%s does not know where to find the server configuration file.\n" +"You must specify the --config-file or -D invocation option or set the PGDATA " +"environment variable.\n" +msgstr "" +"%s не знает, где найти файл конфигурации Ñервера.\n" +"Ð’Ñ‹ должны указать его раÑположение в параметре --config-file или -D, либо " +"уÑтановить переменную Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n" -#: utils/misc/guc.c:818 -msgid "Query Tuning / Planner Method Configuration" -msgstr "ÐаÑтройка запроÑов / ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð² планировщика" +#: utils/misc/guc.c:1853 +#, c-format +msgid "%s: could not access the server configuration file \"%s\": %m\n" +msgstr "%s не может открыть файл конфигурации Ñервера \"%s\": %m\n" -#: utils/misc/guc.c:820 -msgid "Query Tuning / Planner Cost Constants" -msgstr "ÐаÑтройка запроÑов / КонÑтанты ÑтоимоÑти Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ°" +#: utils/misc/guc.c:1881 +#, c-format +msgid "" +"%s does not know where to find the database system data.\n" +"This can be specified as \"data_directory\" in \"%s\", or by the -D " +"invocation option, or by the PGDATA environment variable.\n" +msgstr "" +"%s не знает, где найти данные СУБД.\n" +"Их раÑположение можно задать как значение \"data_directory\" в файле \"%s\", " +"либо передать в параметре -D, либо уÑтановить переменную Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n" -#: utils/misc/guc.c:822 -msgid "Query Tuning / Genetic Query Optimizer" -msgstr "ÐаÑтройка запроÑов / ГенетичеÑкий оптимизатор запроÑов" +#: utils/misc/guc.c:1933 +#, c-format +msgid "" +"%s does not know where to find the \"hba\" configuration file.\n" +"This can be specified as \"hba_file\" in \"%s\", or by the -D invocation " +"option, or by the PGDATA environment variable.\n" +msgstr "" +"%s не знает, где найти файл конфигурации \"hba\".\n" +"Его раÑположение можно задать как значение \"hba_file\" в файле \"%s\", либо " +"передать в параметре -D, либо уÑтановить переменную Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n" -#: utils/misc/guc.c:824 -msgid "Query Tuning / Other Planner Options" -msgstr "ÐаÑтройка запроÑов / Другие параметры планировщика" +#: utils/misc/guc.c:1964 +#, c-format +msgid "" +"%s does not know where to find the \"ident\" configuration file.\n" +"This can be specified as \"ident_file\" in \"%s\", or by the -D invocation " +"option, or by the PGDATA environment variable.\n" +msgstr "" +"%s не знает, где найти файл конфигурации \"ident\".\n" +"Его раÑположение можно задать как значение \"ident_file\" в файле \"%s\", " +"либо передать в параметре -D, либо уÑтановить переменную Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n" -#: utils/misc/guc.c:826 -msgid "Reporting and Logging / Where to Log" -msgstr "Отчёты и протоколы / Куда запиÑывать" +#: utils/misc/guc.c:2943 +msgid "Value exceeds integer range." +msgstr "Значение выходит за рамки целых чиÑел." -#: utils/misc/guc.c:828 -msgid "Reporting and Logging / When to Log" -msgstr "Отчёты и протоколы / Когда запиÑывать" +#: utils/misc/guc.c:3185 +#, c-format +msgid "" +"%d%s%s is outside the valid range for parameter \"%s\" (%d%s%s .. %d%s%s)" +msgstr "" +"%d%s%s вне диапазона, допуÑтимого Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\" (%d%s%s .. %d%s%s)" -#: utils/misc/guc.c:830 -msgid "Reporting and Logging / What to Log" -msgstr "Отчёты и протоколы / Что запиÑывать" +#: utils/misc/guc.c:3226 +#, c-format +msgid "" +"%g%s%s is outside the valid range for parameter \"%s\" (%g%s%s .. %g%s%s)" +msgstr "" +"%g%s%s вне диапазона, допуÑтимого Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\" (%g%s%s .. %g%s%s)" -#: utils/misc/guc.c:832 -msgid "Reporting and Logging / Process Title" -msgstr "Отчёты и протоколы / Заголовок процеÑÑа" +#: utils/misc/guc.c:3465 +#, c-format +msgid "parameter \"%s\" cannot be set during a parallel operation" +msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÑтановить во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ð¾Ð¹ операции" -#: utils/misc/guc.c:834 -msgid "Statistics / Monitoring" -msgstr "СтатиÑтика / Мониторинг" +#: utils/misc/guc.c:3481 utils/misc/guc.c:4696 +#, c-format +msgid "parameter \"%s\" cannot be changed" +msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ" -#: utils/misc/guc.c:836 -msgid "Statistics / Cumulative Query and Index Statistics" -msgstr "СтатиÑтика / ÐÐ°ÐºÐ¾Ð¿Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÑтатиÑтика по запроÑам и индекÑам" +#: utils/misc/guc.c:3514 +#, c-format +msgid "parameter \"%s\" cannot be changed now" +msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ ÑейчаÑ" -#: utils/misc/guc.c:838 -msgid "Autovacuum" -msgstr "ÐвтоочиÑтка" +#: utils/misc/guc.c:3541 utils/misc/guc.c:3603 utils/misc/guc.c:4671 +#: utils/misc/guc.c:6756 +#, c-format +msgid "permission denied to set parameter \"%s\"" +msgstr "нет прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\"" -#: utils/misc/guc.c:840 -msgid "Client Connection Defaults / Statement Behavior" -msgstr "Параметры клиентÑких подключений по умолчанию / Поведение команд" +#: utils/misc/guc.c:3583 +#, c-format +msgid "parameter \"%s\" cannot be set after connection start" +msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ поÑле уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑоединениÑ" -#: utils/misc/guc.c:842 -msgid "Client Connection Defaults / Locale and Formatting" +#: utils/misc/guc.c:3642 +#, c-format +msgid "cannot set parameter \"%s\" within security-definer function" msgstr "" -"Параметры клиентÑких подключений по умолчанию / Ð¯Ð·Ñ‹ÐºÐ¾Ð²Ð°Ñ Ñреда и форматы" +"параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ в функции Ñ ÐºÐ¾Ð½Ñ‚ÐµÐºÑтом безопаÑноÑти " +"определившего" -#: utils/misc/guc.c:844 -msgid "Client Connection Defaults / Shared Library Preloading" -msgstr "" -"Параметры клиентÑких подключений по умолчанию / Предзагрузка разделÑемых " -"библиотек" +#: utils/misc/guc.c:3663 +#, c-format +msgid "parameter \"%s\" cannot be reset" +msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ ÑброÑить" -#: utils/misc/guc.c:846 -msgid "Client Connection Defaults / Other Defaults" -msgstr "Параметры клиентÑких подключений по умолчанию / Другие параметры" +#: utils/misc/guc.c:3670 +#, c-format +msgid "parameter \"%s\" cannot be set locally in functions" +msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ локально в функциÑÑ…" -#: utils/misc/guc.c:848 -msgid "Lock Management" -msgstr "Управление блокировками" +#: utils/misc/guc.c:4370 utils/misc/guc.c:4418 utils/misc/guc.c:5450 +#, c-format +msgid "permission denied to examine \"%s\"" +msgstr "нет прав Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра параметра \"%s\"" -#: utils/misc/guc.c:850 -msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" -msgstr "ВерÑÐ¸Ñ Ð¸ ÑовмеÑтимоÑть платформ / Предыдущие верÑии PostgreSQL" +#: utils/misc/guc.c:4371 utils/misc/guc.c:4419 utils/misc/guc.c:5451 +#, c-format +msgid "" +"Only roles with privileges of the \"%s\" role may examine this parameter." +msgstr "ПроÑматривать Ñтот параметр могут только роли Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ роли \"%s\"." -#: utils/misc/guc.c:852 -msgid "Version and Platform Compatibility / Other Platforms and Clients" -msgstr "ВерÑÐ¸Ñ Ð¸ ÑовмеÑтимоÑть платформ / Другие платформы и клиенты" +#: utils/misc/guc.c:4629 +#, c-format +msgid "ALTER SYSTEM is not allowed in this environment" +msgstr "команда ALTER SYSTEM запрещена в Ñтом окружении" -#: utils/misc/guc.c:854 -msgid "Error Handling" -msgstr "Обработка ошибок" +#: utils/misc/guc.c:4661 +#, c-format +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "нет прав Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ALTER SYSTEM RESET ALL" -#: utils/misc/guc.c:856 +#: utils/misc/guc.c:4740 +#, c-format +msgid "parameter value for ALTER SYSTEM must not contain a newline" +msgstr "значение параметра Ð´Ð»Ñ ALTER SYSTEM не должно быть многоÑтрочным" + +#: utils/misc/guc.c:4785 +#, c-format +msgid "could not parse contents of file \"%s\"" +msgstr "не удалоÑÑŒ разобрать Ñодержимое файла \"%s\"" + +#: utils/misc/guc.c:4967 +#, c-format +msgid "attempt to redefine parameter \"%s\"" +msgstr "попытка переопределить параметр \"%s\"" + +#: utils/misc/guc.c:5306 +#, c-format +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "неверное Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° конфигурации: \"%s\", он удалÑетÑÑ" + +#: utils/misc/guc.c:5308 +#, c-format +msgid "\"%s\" is now a reserved prefix." +msgstr "Теперь \"%s\" — зарезервированный префикÑ." + +#: utils/misc/guc.c:6179 +#, c-format +msgid "while setting parameter \"%s\" to \"%s\"" +msgstr "при назначении параметру \"%s\" Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"%s\"" + +#: utils/misc/guc.c:6348 +#, c-format +msgid "parameter \"%s\" could not be set" +msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÑтановить" + +#: utils/misc/guc.c:6438 +#, c-format +msgid "could not parse setting for parameter \"%s\"" +msgstr "не удалоÑÑŒ разобрать значение параметра \"%s\"" + +#: utils/misc/guc.c:6888 +#, c-format +msgid "invalid value for parameter \"%s\": %g" +msgstr "неверное значение параметра \"%s\": %g" + +#: utils/misc/guc_funcs.c:54 +#, c-format +msgid "cannot set parameters during a parallel operation" +msgstr "уÑтанавливать параметры во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" + +#: utils/misc/guc_funcs.c:130 +#, c-format +msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" +msgstr "SET LOCAL TRANSACTION SNAPSHOT не реализовано" + +#: utils/misc/guc_funcs.c:218 +#, c-format +msgid "SET %s takes only one argument" +msgstr "SET %s принимает только один аргумент" + +#: utils/misc/guc_funcs.c:342 +#, c-format +msgid "SET requires parameter name" +msgstr "SET требует Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°" + +#: utils/misc/guc_tables.c:676 +msgid "Ungrouped" +msgstr "Разное" + +#: utils/misc/guc_tables.c:677 +msgid "File Locations" +msgstr "РаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²" + +#: utils/misc/guc_tables.c:678 +msgid "Connections and Authentication / Connection Settings" +msgstr "ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ / Параметры подключений" + +#: utils/misc/guc_tables.c:679 +msgid "Connections and Authentication / TCP Settings" +msgstr "ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ / Параметры TCP" + +#: utils/misc/guc_tables.c:680 +msgid "Connections and Authentication / Authentication" +msgstr "ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ / ÐутентификациÑ" + +#: utils/misc/guc_tables.c:681 +msgid "Connections and Authentication / SSL" +msgstr "ÐŸÐ¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ / SSL" + +#: utils/misc/guc_tables.c:682 +msgid "Resource Usage / Memory" +msgstr "ИÑпользование реÑурÑов / ПамÑть" + +#: utils/misc/guc_tables.c:683 +msgid "Resource Usage / Disk" +msgstr "ИÑпользование реÑурÑов / ДиÑк" + +#: utils/misc/guc_tables.c:684 +msgid "Resource Usage / Kernel Resources" +msgstr "ИÑпользование реÑурÑов / РеÑурÑÑ‹ Ñдра" + +#: utils/misc/guc_tables.c:685 +msgid "Resource Usage / Cost-Based Vacuum Delay" +msgstr "ИÑпользование реÑурÑов / Задержка очиÑтки по ÑтоимоÑти" + +#: utils/misc/guc_tables.c:686 +msgid "Resource Usage / Background Writer" +msgstr "ИÑпользование реÑурÑов / Ð¤Ð¾Ð½Ð¾Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ" + +#: utils/misc/guc_tables.c:687 +msgid "Resource Usage / Asynchronous Behavior" +msgstr "ИÑпользование реÑурÑов / ÐÑинхронное поведение" + +#: utils/misc/guc_tables.c:688 +msgid "Write-Ahead Log / Settings" +msgstr "Журнал WAL / Параметры" + +#: utils/misc/guc_tables.c:689 +msgid "Write-Ahead Log / Checkpoints" +msgstr "Журнал WAL / Контрольные точки" + +#: utils/misc/guc_tables.c:690 +msgid "Write-Ahead Log / Archiving" +msgstr "Журнал WAL / ÐрхивациÑ" + +#: utils/misc/guc_tables.c:691 +msgid "Write-Ahead Log / Recovery" +msgstr "Журнал WAL / ВоÑÑтановление" + +#: utils/misc/guc_tables.c:692 +msgid "Write-Ahead Log / Archive Recovery" +msgstr "Журнал WAL / ВоÑÑтановление из архива" + +#: utils/misc/guc_tables.c:693 +msgid "Write-Ahead Log / Recovery Target" +msgstr "Журнал WAL / Цель воÑÑтановлениÑ" + +#: utils/misc/guc_tables.c:694 +msgid "Write-Ahead Log / Summarization" +msgstr "Журнал WAL / Обобщение" + +#: utils/misc/guc_tables.c:695 +msgid "Replication / Sending Servers" +msgstr "Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ / Передающие Ñерверы" + +#: utils/misc/guc_tables.c:696 +msgid "Replication / Primary Server" +msgstr "Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ / Ведущий Ñервер" + +#: utils/misc/guc_tables.c:697 +msgid "Replication / Standby Servers" +msgstr "Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ / Резервные Ñерверы" + +#: utils/misc/guc_tables.c:698 +msgid "Replication / Subscribers" +msgstr "Ð ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ / ПодпиÑчики" + +#: utils/misc/guc_tables.c:699 +msgid "Query Tuning / Planner Method Configuration" +msgstr "ÐаÑтройка запроÑов / ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð² планировщика" + +#: utils/misc/guc_tables.c:700 +msgid "Query Tuning / Planner Cost Constants" +msgstr "ÐаÑтройка запроÑов / КонÑтанты ÑтоимоÑти Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ°" + +#: utils/misc/guc_tables.c:701 +msgid "Query Tuning / Genetic Query Optimizer" +msgstr "ÐаÑтройка запроÑов / ГенетичеÑкий оптимизатор запроÑов" + +#: utils/misc/guc_tables.c:702 +msgid "Query Tuning / Other Planner Options" +msgstr "ÐаÑтройка запроÑов / Другие параметры планировщика" + +#: utils/misc/guc_tables.c:703 +msgid "Reporting and Logging / Where to Log" +msgstr "Отчёты и протоколы / Куда запиÑывать" + +#: utils/misc/guc_tables.c:704 +msgid "Reporting and Logging / When to Log" +msgstr "Отчёты и протоколы / Когда запиÑывать" + +#: utils/misc/guc_tables.c:705 +msgid "Reporting and Logging / What to Log" +msgstr "Отчёты и протоколы / Что запиÑывать" + +#: utils/misc/guc_tables.c:706 +msgid "Reporting and Logging / Process Title" +msgstr "Отчёты и протоколы / Заголовок процеÑÑа" + +#: utils/misc/guc_tables.c:707 +msgid "Statistics / Monitoring" +msgstr "СтатиÑтика / Мониторинг" + +#: utils/misc/guc_tables.c:708 +msgid "Statistics / Cumulative Query and Index Statistics" +msgstr "СтатиÑтика / ÐÐ°ÐºÐ¾Ð¿Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÑтатиÑтика по запроÑам и индекÑам" + +#: utils/misc/guc_tables.c:709 +msgid "Autovacuum" +msgstr "ÐвтоочиÑтка" + +#: utils/misc/guc_tables.c:710 +msgid "Client Connection Defaults / Statement Behavior" +msgstr "Параметры клиентÑких подключений по умолчанию / Поведение команд" + +#: utils/misc/guc_tables.c:711 +msgid "Client Connection Defaults / Locale and Formatting" +msgstr "" +"Параметры клиентÑких подключений по умолчанию / Ð¯Ð·Ñ‹ÐºÐ¾Ð²Ð°Ñ Ñреда и форматы" + +#: utils/misc/guc_tables.c:712 +msgid "Client Connection Defaults / Shared Library Preloading" +msgstr "" +"Параметры клиентÑких подключений по умолчанию / Предзагрузка разделÑемых " +"библиотек" + +#: utils/misc/guc_tables.c:713 +msgid "Client Connection Defaults / Other Defaults" +msgstr "Параметры клиентÑких подключений по умолчанию / Другие параметры" + +#: utils/misc/guc_tables.c:714 +msgid "Lock Management" +msgstr "Управление блокировками" + +#: utils/misc/guc_tables.c:715 +msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" +msgstr "ВерÑÐ¸Ñ Ð¸ ÑовмеÑтимоÑть платформ / Предыдущие верÑии PostgreSQL" + +#: utils/misc/guc_tables.c:716 +msgid "Version and Platform Compatibility / Other Platforms and Clients" +msgstr "ВерÑÐ¸Ñ Ð¸ ÑовмеÑтимоÑть платформ / Другие платформы и клиенты" + +#: utils/misc/guc_tables.c:717 +msgid "Error Handling" +msgstr "Обработка ошибок" + +#: utils/misc/guc_tables.c:718 msgid "Preset Options" msgstr "Предопределённые параметры" -#: utils/misc/guc.c:858 +#: utils/misc/guc_tables.c:719 msgid "Customized Options" msgstr "ВнеÑиÑтемные параметры" -#: utils/misc/guc.c:860 +#: utils/misc/guc_tables.c:720 msgid "Developer Options" msgstr "Параметры Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ¾Ð²" -#: utils/misc/guc.c:918 -msgid "" -"Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." -msgstr "" -"ДопуÑтимые единицы Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого параметра: \"B\", \"kB\", \"MB\", " -"\"GB\" и \"TB\"." - -#: utils/misc/guc.c:955 -msgid "" -"Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", " -"and \"d\"." -msgstr "" -"ДопуÑтимые единицы Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого параметра: \"us\", \"ms\", \"s\", " -"\"min\", \"h\" и \"d\"." - -#: utils/misc/guc.c:1017 +#: utils/misc/guc_tables.c:775 msgid "Enables the planner's use of sequential-scan plans." msgstr "" "Разрешает планировщику иÑпользовать планы поÑледовательного ÑканированиÑ." -#: utils/misc/guc.c:1027 +#: utils/misc/guc_tables.c:785 msgid "Enables the planner's use of index-scan plans." msgstr "Разрешает планировщику иÑпользовать планы ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ индекÑу." -#: utils/misc/guc.c:1037 +#: utils/misc/guc_tables.c:795 msgid "Enables the planner's use of index-only-scan plans." msgstr "Разрешает планировщику иÑпользовать планы ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ индекÑа." -#: utils/misc/guc.c:1047 +#: utils/misc/guc_tables.c:805 msgid "Enables the planner's use of bitmap-scan plans." msgstr "" "Разрешает планировщику иÑпользовать планы ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ битовой карте." -#: utils/misc/guc.c:1057 +#: utils/misc/guc_tables.c:815 msgid "Enables the planner's use of TID scan plans." msgstr "Разрешает планировщику иÑпользовать планы ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ TID." -#: utils/misc/guc.c:1067 +#: utils/misc/guc_tables.c:825 msgid "Enables the planner's use of explicit sort steps." msgstr "Разрешает планировщику иÑпользовать шаги Ñ Ñвной Ñортировкой." -#: utils/misc/guc.c:1077 +#: utils/misc/guc_tables.c:835 msgid "Enables the planner's use of incremental sort steps." msgstr "" "Разрешает планировщику иÑпользовать шаги Ñ Ð¸Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð¹ Ñортировкой." -#: utils/misc/guc.c:1087 +#: utils/misc/guc_tables.c:845 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Разрешает планировщику иÑпользовать планы Ð°Ð³Ñ€ÐµÐ³Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ хешу." -#: utils/misc/guc.c:1097 +#: utils/misc/guc_tables.c:855 msgid "Enables the planner's use of materialization." msgstr "Разрешает планировщику иÑпользовать материализацию." # well-spelled: мемоизацию -#: utils/misc/guc.c:1107 +#: utils/misc/guc_tables.c:865 msgid "Enables the planner's use of memoization." msgstr "Разрешает планировщику иÑпользовать мемоизацию." -#: utils/misc/guc.c:1117 +#: utils/misc/guc_tables.c:875 msgid "Enables the planner's use of nested-loop join plans." msgstr "" "Разрешает планировщику иÑпользовать планы ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ð¼Ð¸ циклами." -#: utils/misc/guc.c:1127 +#: utils/misc/guc_tables.c:885 msgid "Enables the planner's use of merge join plans." msgstr "Разрешает планировщику иÑпользовать планы ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑлиÑнием." -#: utils/misc/guc.c:1137 +#: utils/misc/guc_tables.c:895 msgid "Enables the planner's use of hash join plans." msgstr "Разрешает планировщику иÑпользовать планы ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ хешу." -#: utils/misc/guc.c:1147 +#: utils/misc/guc_tables.c:905 msgid "Enables the planner's use of gather merge plans." msgstr "Разрешает планировщику иÑпользовать планы Ñбора ÑлиÑнием." -#: utils/misc/guc.c:1157 +#: utils/misc/guc_tables.c:915 msgid "Enables partitionwise join." msgstr "Включает ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ ÑƒÑ‡Ñ‘Ñ‚Ð¾Ð¼ ÑекционированиÑ." -#: utils/misc/guc.c:1167 +#: utils/misc/guc_tables.c:925 msgid "Enables partitionwise aggregation and grouping." msgstr "Включает агрегирование и группировку Ñ ÑƒÑ‡Ñ‘Ñ‚Ð¾Ð¼ ÑекционированиÑ." -#: utils/misc/guc.c:1177 +#: utils/misc/guc_tables.c:935 msgid "Enables the planner's use of parallel append plans." msgstr "Разрешает планировщику иÑпользовать планы параллельного добавлениÑ." -#: utils/misc/guc.c:1187 +#: utils/misc/guc_tables.c:945 msgid "Enables the planner's use of parallel hash plans." msgstr "" "Разрешает планировщику иÑпользовать планы параллельного ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ хешу." -#: utils/misc/guc.c:1197 +#: utils/misc/guc_tables.c:955 msgid "Enables plan-time and execution-time partition pruning." msgstr "" "Включает уÑтранение Ñекций во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ " "запроÑов." -#: utils/misc/guc.c:1198 +#: utils/misc/guc_tables.c:956 msgid "" "Allows the query planner and executor to compare partition bounds to " "conditions in the query to determine which partitions must be scanned." @@ -29588,64 +32013,100 @@ msgstr "" "Разрешает планировщику и иÑполнителю запроÑов ÑопоÑтавлÑть границы Ñекций Ñ " "уÑловиÑми в запроÑе и выделÑть отдельные Ñекции Ð´Ð»Ñ ÑканированиÑ." -#: utils/misc/guc.c:1209 +#: utils/misc/guc_tables.c:967 +msgid "" +"Enables the planner's ability to produce plans that provide presorted input " +"for ORDER BY / DISTINCT aggregate functions." +msgstr "" +"Включает в планировщике возможноÑть формировать планы, подающие ранее " +"Ñортированные данные на вход агрегирующим функциÑм Ñ ORDER BY / DISTINCT." + +#: utils/misc/guc_tables.c:970 +msgid "" +"Allows the query planner to build plans that provide presorted input for " +"aggregate functions with an ORDER BY / DISTINCT clause. When disabled, " +"implicit sorts are always performed during execution." +msgstr "" +"Разрешает планировщику Ñтроить планы, в которых на вход агрегирующим " +"функциÑм Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼ ORDER BY / DISTINCT подаютÑÑ Ñ€Ð°Ð½ÐµÐµ Ñортированные " +"данные. Когда Ñтот параметр отключён, во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ñегда неÑвно " +"производитÑÑ Ñортировка." + +#: utils/misc/guc_tables.c:982 msgid "Enables the planner's use of async append plans." msgstr "Разрешает планировщику иÑпользовать планы аÑинхронного добавлениÑ." -#: utils/misc/guc.c:1219 +#: utils/misc/guc_tables.c:992 +msgid "Enables reordering of GROUP BY keys." +msgstr "Включает переупорÑдочивание ключей GROUP BY." + +#: utils/misc/guc_tables.c:1002 msgid "Enables genetic query optimization." msgstr "Включает генетичеÑкую оптимизацию запроÑов." -#: utils/misc/guc.c:1220 +#: utils/misc/guc_tables.c:1003 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Этот алгоритм пытаетÑÑ Ð¿Ð¾Ñтроить план без полного перебора." -#: utils/misc/guc.c:1231 +#: utils/misc/guc_tables.c:1017 msgid "Shows whether the current user is a superuser." msgstr "Показывает, ÑвлÑетÑÑ Ð»Ð¸ текущий пользователь Ñуперпользователем." -#: utils/misc/guc.c:1241 +#: utils/misc/guc_tables.c:1032 +msgid "Allows running the ALTER SYSTEM command." +msgstr "Разрешает выполнÑть команду ALTER SYSTEM." + +#: utils/misc/guc_tables.c:1033 +msgid "" +"Can be set to off for environments where global configuration changes should " +"be made using a different method." +msgstr "" +"Может быть выключен в окружениÑÑ…, где Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¾Ð¹ конфигурации " +"должны производитьÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ методом." + +#: utils/misc/guc_tables.c:1043 msgid "Enables advertising the server via Bonjour." msgstr "Включает объÑвление Ñервера поÑредÑтвом Bonjour." -#: utils/misc/guc.c:1250 +#: utils/misc/guc_tables.c:1052 msgid "Collects transaction commit time." msgstr "ЗапиÑывает Ð²Ñ€ÐµÐ¼Ñ Ñ„Ð¸ÐºÑации транзакций." -#: utils/misc/guc.c:1259 +#: utils/misc/guc_tables.c:1061 msgid "Enables SSL connections." msgstr "Разрешает SSL-подключениÑ." -#: utils/misc/guc.c:1268 -msgid "Controls whether ssl_passphrase_command is called during server reload." +#: utils/misc/guc_tables.c:1070 +msgid "" +"Controls whether \"ssl_passphrase_command\" is called during server reload." msgstr "" -"ОпределÑет, будет ли вызыватьÑÑ ssl_passphrase_command при перезагрузке " +"ОпределÑет, будет ли вызыватьÑÑ \"ssl_passphrase_command\" при перезагрузке " "Ñервера." -#: utils/misc/guc.c:1277 +#: utils/misc/guc_tables.c:1079 msgid "Give priority to server ciphersuite order." msgstr "Ðазначает более приоритетным набор шифров Ñервера." -#: utils/misc/guc.c:1286 +#: utils/misc/guc_tables.c:1088 msgid "Forces synchronization of updates to disk." msgstr "ÐŸÑ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ изменений на диÑк." -#: utils/misc/guc.c:1287 +#: utils/misc/guc_tables.c:1089 msgid "" "The server will use the fsync() system call in several places to make sure " -"that updates are physically written to disk. This insures that a database " +"that updates are physically written to disk. This ensures that a database " "cluster will recover to a consistent state after an operating system or " "hardware crash." msgstr "" -"Сервер будет вызывать ÑиÑтемную функцию fsync() в разных меÑтах Ð´Ð»Ñ Ð³Ð°Ñ€Ð°Ð½Ñ‚Ð¸Ð¸ " -"физичеÑкой запиÑи данных на диÑк. Это позволит привеÑти клаÑтер БД в " -"целоÑтное ÑоÑтоÑние поÑле отказа ОС или оборудованиÑ." +"Сервер будет вызывать в определённые моменты ÑиÑтемную функцию fsync(), " +"обеÑпечивающую физичеÑкую запиÑÑŒ данных на диÑк. Тем Ñамым гарантируетÑÑ, " +"что клаÑтер БД придёт в целоÑтное ÑоÑтоÑние поÑле отказа ОС или оборудованиÑ." -#: utils/misc/guc.c:1298 +#: utils/misc/guc_tables.c:1100 msgid "Continues processing after a checksum failure." msgstr "Продолжает обработку при ошибке контрольной Ñуммы." -#: utils/misc/guc.c:1299 +#: utils/misc/guc_tables.c:1101 msgid "" "Detection of a checksum failure normally causes PostgreSQL to report an " "error, aborting the current transaction. Setting ignore_checksum_failure to " @@ -29659,34 +32120,34 @@ msgstr "" "что может привеÑти к ÑбоÑм или другим Ñерьёзным проблемам. Это имеет меÑто, " "только еÑли включён контроль целоÑтноÑти Ñтраниц." -#: utils/misc/guc.c:1313 +#: utils/misc/guc_tables.c:1115 msgid "Continues processing past damaged page headers." msgstr "Продолжает обработку при повреждении заголовков Ñтраниц." -#: utils/misc/guc.c:1314 +#: utils/misc/guc_tables.c:1116 msgid "" "Detection of a damaged page header normally causes PostgreSQL to report an " -"error, aborting the current transaction. Setting zero_damaged_pages to true " -"causes the system to instead report a warning, zero out the damaged page, " -"and continue processing. This behavior will destroy data, namely all the " -"rows on the damaged page." +"error, aborting the current transaction. Setting \"zero_damaged_pages\" to " +"true causes the system to instead report a warning, zero out the damaged " +"page, and continue processing. This behavior will destroy data, namely all " +"the rows on the damaged page." msgstr "" "ÐžÐ±Ð½Ð°Ñ€ÑƒÐ¶Ð¸Ð²Ð°Ñ Ð¿Ð¾Ð²Ñ€ÐµÐ¶Ð´Ñ‘Ð½Ð½Ñ‹Ð¹ заголовок Ñтраницы, PostgreSQL обычно Ñообщает об " -"ошибке и прерывает текущую транзакцию. Ðо еÑли zero_damaged_pages равен " +"ошибке и прерывает текущую транзакцию. Ðо еÑли \"zero_damaged_pages\" равен " "true, ÑиÑтема выдаÑÑ‚ предупреждение, обнулит повреждённую Ñтраницу и " "продолжит работу. Это приведёт к потере данных, а именно Ñтрок в " "повреждённой Ñтранице." -#: utils/misc/guc.c:1327 +#: utils/misc/guc_tables.c:1129 msgid "Continues recovery after an invalid pages failure." msgstr "" "Продолжает воÑÑтановление поÑле ошибок, ÑвÑзанных Ñ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ Ñтраницами." -#: utils/misc/guc.c:1328 +#: utils/misc/guc_tables.c:1130 msgid "" "Detection of WAL records having references to invalid pages during recovery " "causes PostgreSQL to raise a PANIC-level error, aborting the recovery. " -"Setting ignore_invalid_pages to true causes the system to ignore invalid " +"Setting \"ignore_invalid_pages\" to true causes the system to ignore invalid " "page references in WAL records (but still report a warning), and continue " "recovery. This behavior may cause crashes, data loss, propagate or hide " "corruption, or other serious problems. Only has an effect during recovery or " @@ -29694,19 +32155,19 @@ msgid "" msgstr "" "ÐžÐ±Ð½Ð°Ñ€ÑƒÐ¶Ð¸Ð²Ð°Ñ Ð² запиÑÑÑ… WAL ÑÑылки на неправильные Ñтраницы во Ð²Ñ€ÐµÐ¼Ñ " "воÑÑтановлениÑ, PostgreSQL выдаёт ошибку ÑƒÑ€Ð¾Ð²Ð½Ñ ÐŸÐÐИКРи прерывает " -"воÑÑтановление. ЕÑли ignore_invalid_pages равен true, ÑиÑтема игнорирует " +"воÑÑтановление. ЕÑли \"ignore_invalid_pages\" равен true, ÑиÑтема игнорирует " "такие некорректные ÑÑылки (но вÑÑ‘ же выдаёт предупреждение) и продолжает " "воÑÑтановление. Это может привеÑти к краху Ñервера, потере данных, " "раÑпроÑтранению или Ñокрытию Ð¿Ð¾Ð²Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… и другим Ñерьёзным " "проблемам. Данный параметр дейÑтвует только при воÑÑтановлении или в режиме " "резервного Ñервера." -#: utils/misc/guc.c:1346 +#: utils/misc/guc_tables.c:1148 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "" "ЗапиÑÑŒ полных Ñтраниц в WAL при первом изменении поÑле контрольной точки." -#: utils/misc/guc.c:1347 +#: utils/misc/guc_tables.c:1149 msgid "" "A page write in process during an operating system crash might be only " "partially written to disk. During recovery, the row changes stored in WAL " @@ -29719,7 +32180,7 @@ msgstr "" "при первом изменении поÑле контрольной точки, что позволÑет полноÑтью " "воÑÑтановить данные." -#: utils/misc/guc.c:1360 +#: utils/misc/guc_tables.c:1162 msgid "" "Writes full pages to WAL when first modified after a checkpoint, even for a " "non-critical modification." @@ -29727,83 +32188,98 @@ msgstr "" "ЗапиÑÑŒ полных Ñтраниц в WAL при первом изменении поÑле контрольной точки, " "даже при некритичеÑком изменении." -#: utils/misc/guc.c:1370 +#: utils/misc/guc_tables.c:1172 msgid "Writes zeroes to new WAL files before first use." msgstr "ЗапиÑывать нули в новые файлы WAL перед первым иÑпользованием." -#: utils/misc/guc.c:1380 +#: utils/misc/guc_tables.c:1182 msgid "Recycles WAL files by renaming them." msgstr "Перерабатывать файлы WAL, Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ðµ." -#: utils/misc/guc.c:1390 +#: utils/misc/guc_tables.c:1192 msgid "Logs each checkpoint." msgstr "Протоколировать каждую контрольную точку." -#: utils/misc/guc.c:1399 +#: utils/misc/guc_tables.c:1201 msgid "Logs each successful connection." msgstr "Протоколировать уÑтанавливаемые ÑоединениÑ." -#: utils/misc/guc.c:1408 +#: utils/misc/guc_tables.c:1210 +msgid "Logs details of pre-authentication connection handshake." +msgstr "" +"Протоколировать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± уÑтановлении ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾ аутентификации." + +#: utils/misc/guc_tables.c:1220 msgid "Logs end of a session, including duration." msgstr "Протоколировать конец ÑеанÑа, Ð¾Ñ‚Ð¼ÐµÑ‡Ð°Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñть." -#: utils/misc/guc.c:1417 +#: utils/misc/guc_tables.c:1229 msgid "Logs each replication command." msgstr "Протоколировать каждую команду репликации." -#: utils/misc/guc.c:1426 +#: utils/misc/guc_tables.c:1238 msgid "Shows whether the running server has assertion checks enabled." msgstr "Показывает, включены ли проверки иÑтинноÑти на работающем Ñервере." -#: utils/misc/guc.c:1441 +#: utils/misc/guc_tables.c:1249 msgid "Terminate session on any error." msgstr "Завершать ÑеанÑÑ‹ при любой ошибке." -#: utils/misc/guc.c:1450 +#: utils/misc/guc_tables.c:1258 msgid "Reinitialize server after backend crash." msgstr "ПерезапуÑкать ÑиÑтему БД при аварии Ñерверного процеÑÑа." -#: utils/misc/guc.c:1459 +#: utils/misc/guc_tables.c:1267 msgid "Remove temporary files after backend crash." msgstr "УдалÑть временные файлы поÑле аварии обÑлуживающего процеÑÑа." -#: utils/misc/guc.c:1470 +#: utils/misc/guc_tables.c:1277 +msgid "Send SIGABRT not SIGQUIT to child processes after backend crash." +msgstr "" +"ПоÑылать дочерним процеÑÑам SIGABRT, а не SIGQUIT при Ñбое Ñерверного " +"процеÑÑа." + +#: utils/misc/guc_tables.c:1287 +msgid "Send SIGABRT not SIGKILL to stuck child processes." +msgstr "ПоÑылать SIGABRT, а не SIGKILL завиÑшим дочерним процеÑÑам." + +#: utils/misc/guc_tables.c:1298 msgid "Logs the duration of each completed SQL statement." msgstr "Протоколировать длительноÑть каждого выполненного SQL-оператора." -#: utils/misc/guc.c:1479 +#: utils/misc/guc_tables.c:1307 msgid "Logs each query's parse tree." msgstr "Протоколировать дерево разбора Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запроÑа." -#: utils/misc/guc.c:1488 +#: utils/misc/guc_tables.c:1316 msgid "Logs each query's rewritten parse tree." msgstr "Протоколировать перезапиÑанное дерево разбора Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запроÑа." -#: utils/misc/guc.c:1497 +#: utils/misc/guc_tables.c:1325 msgid "Logs each query's execution plan." msgstr "Протоколировать план Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запроÑа." -#: utils/misc/guc.c:1506 +#: utils/misc/guc_tables.c:1334 msgid "Indents parse and plan tree displays." msgstr "ОтÑтупы при отображении деревьев разбора и плана запроÑов." -#: utils/misc/guc.c:1515 +#: utils/misc/guc_tables.c:1343 msgid "Writes parser performance statistics to the server log." msgstr "ЗапиÑÑŒ ÑтатиÑтики разбора запроÑов в протокол Ñервера." -#: utils/misc/guc.c:1524 +#: utils/misc/guc_tables.c:1352 msgid "Writes planner performance statistics to the server log." msgstr "ЗапиÑÑŒ ÑтатиÑтики Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² протокол Ñервера." -#: utils/misc/guc.c:1533 +#: utils/misc/guc_tables.c:1361 msgid "Writes executor performance statistics to the server log." msgstr "ЗапиÑÑŒ ÑтатиÑтики Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов в протокол Ñервера." -#: utils/misc/guc.c:1542 +#: utils/misc/guc_tables.c:1370 msgid "Writes cumulative performance statistics to the server log." msgstr "ЗапиÑÑŒ общей ÑтатиÑтики производительноÑти в протокол Ñервера." -#: utils/misc/guc.c:1552 +#: utils/misc/guc_tables.c:1380 msgid "" "Logs system resource usage statistics (memory and CPU) on various B-tree " "operations." @@ -29811,11 +32287,11 @@ msgstr "" "ФикÑировать ÑтатиÑтику иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑиÑтемных реÑурÑов (памÑти и " "процеÑÑора) при различных операциÑÑ… Ñ b-деревом." -#: utils/misc/guc.c:1564 +#: utils/misc/guc_tables.c:1392 msgid "Collects information about executing commands." msgstr "Собирает информацию о выполнÑющихÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñ…." -#: utils/misc/guc.c:1565 +#: utils/misc/guc_tables.c:1393 msgid "" "Enables the collection of information on the currently executing command of " "each session, along with the time at which that command began execution." @@ -29823,70 +32299,70 @@ msgstr "" "Включает Ñбор информации о командах, выполнÑющихÑÑ Ð²Ð¾ вÑех ÑеанÑах, а также " "Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка команды." -#: utils/misc/guc.c:1575 +#: utils/misc/guc_tables.c:1403 msgid "Collects statistics on database activity." msgstr "Собирает ÑтатиÑтику активноÑти в БД." -#: utils/misc/guc.c:1584 +#: utils/misc/guc_tables.c:1412 msgid "Collects timing statistics for database I/O activity." msgstr "Собирает ÑтатиÑтику по времени активноÑти ввода/вывода." -#: utils/misc/guc.c:1593 +#: utils/misc/guc_tables.c:1421 msgid "Collects timing statistics for WAL I/O activity." msgstr "Собирает ÑтатиÑтику по времени активноÑти ввода/вывода WAL." -#: utils/misc/guc.c:1603 +#: utils/misc/guc_tables.c:1431 msgid "Updates the process title to show the active SQL command." msgstr "Выводит в заголовок процеÑÑа активную SQL-команду." -#: utils/misc/guc.c:1604 +#: utils/misc/guc_tables.c:1432 msgid "" "Enables updating of the process title every time a new SQL command is " "received by the server." msgstr "Отражает в заголовке процеÑÑа каждую SQL-команду, поÑтупающую Ñерверу." -#: utils/misc/guc.c:1617 +#: utils/misc/guc_tables.c:1441 msgid "Starts the autovacuum subprocess." msgstr "ЗапуÑкает подпроцеÑÑ Ð°Ð²Ñ‚Ð¾Ð¾Ñ‡Ð¸Ñтки." -#: utils/misc/guc.c:1627 +#: utils/misc/guc_tables.c:1451 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Генерирует отладочные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ LISTEN и NOTIFY." -#: utils/misc/guc.c:1639 +#: utils/misc/guc_tables.c:1463 msgid "Emits information about lock usage." msgstr "Выдавать информацию о применÑемых блокировках." -#: utils/misc/guc.c:1649 +#: utils/misc/guc_tables.c:1473 msgid "Emits information about user lock usage." msgstr "Выдавать информацию о применÑемых пользовательÑких блокировках." -#: utils/misc/guc.c:1659 +#: utils/misc/guc_tables.c:1483 msgid "Emits information about lightweight lock usage." msgstr "Выдавать информацию о применÑемых лёгких блокировках." -#: utils/misc/guc.c:1669 +#: utils/misc/guc_tables.c:1493 msgid "" "Dumps information about all current locks when a deadlock timeout occurs." msgstr "" "Выводить информацию обо вÑех текущих блокировках в Ñлучае тайм-аута при " "взаимоблокировке." -#: utils/misc/guc.c:1681 +#: utils/misc/guc_tables.c:1505 msgid "Logs long lock waits." msgstr "Протоколировать длительные Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð² блокировках." -#: utils/misc/guc.c:1690 +#: utils/misc/guc_tables.c:1514 msgid "Logs standby recovery conflict waits." msgstr "" "Протоколировать ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð¾Ð² при воÑÑтановлении на " "ведомом." -#: utils/misc/guc.c:1699 +#: utils/misc/guc_tables.c:1523 msgid "Logs the host name in the connection logs." msgstr "ЗапиÑывать Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð° в протоколы подключений." -#: utils/misc/guc.c:1700 +#: utils/misc/guc_tables.c:1524 msgid "" "By default, connection logs only show the IP address of the connecting host. " "If you want them to show the host name you can turn this on, but depending " @@ -29898,11 +32374,11 @@ msgstr "" "параметр, но учтите, что Ñто может значительно повлиÑть на " "производительноÑть." -#: utils/misc/guc.c:1711 +#: utils/misc/guc_tables.c:1535 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Обрабатывать \"expr=NULL\" как \"expr IS NULL\"." -#: utils/misc/guc.c:1712 +#: utils/misc/guc_tables.c:1536 msgid "" "When turned on, expressions of the form expr = NULL (or NULL = expr) are " "treated as expr IS NULL, that is, they return true if expr evaluates to the " @@ -29914,25 +32390,21 @@ msgstr "" "Ñовпадает Ñ NULL, и false в противном Ñлучае. По правилам expr = NULL вÑегда " "должно возвращать null (неопределённоÑть)." -#: utils/misc/guc.c:1724 -msgid "Enables per-database user names." -msgstr "Включает ÑвÑзывание имён пользователей Ñ Ð±Ð°Ð·Ð°Ð¼Ð¸ данных." - -#: utils/misc/guc.c:1733 +#: utils/misc/guc_tables.c:1548 msgid "Sets the default read-only status of new transactions." msgstr "" "УÑтанавливает режим \"только чтение\" по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… транзакций." -#: utils/misc/guc.c:1743 +#: utils/misc/guc_tables.c:1558 msgid "Sets the current transaction's read-only status." msgstr "УÑтанавливает режим \"только чтение\" Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ транзакции." -#: utils/misc/guc.c:1753 +#: utils/misc/guc_tables.c:1568 msgid "Sets the default deferrable status of new transactions." msgstr "" "УÑтанавливает режим отложенного Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… транзакций." -#: utils/misc/guc.c:1762 +#: utils/misc/guc_tables.c:1577 msgid "" "Whether to defer a read-only serializable transaction until it can be " "executed with no possible serialization failures." @@ -29940,26 +32412,26 @@ msgstr "" "ОпределÑет, откладывать ли Ñериализуемую транзакцию \"только чтение\" до " "момента, когда Ñбой Ñериализации будет иÑключён." -#: utils/misc/guc.c:1772 +#: utils/misc/guc_tables.c:1587 msgid "Enable row security." msgstr "Включает защиту на уровне Ñтрок." -#: utils/misc/guc.c:1773 +#: utils/misc/guc_tables.c:1588 msgid "When enabled, row security will be applied to all users." msgstr "" "Когда включена, защита на уровне Ñтрок раÑпроÑтранÑетÑÑ Ð½Ð° вÑех " "пользователей." -#: utils/misc/guc.c:1781 +#: utils/misc/guc_tables.c:1596 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "" "ПроверÑть тело подпрограмм в момент CREATE FUNCTION и CREATE PROCEDURE." -#: utils/misc/guc.c:1790 +#: utils/misc/guc_tables.c:1605 msgid "Enable input of NULL elements in arrays." msgstr "Разрешать ввод Ñлементов NULL в маÑÑивах." -#: utils/misc/guc.c:1791 +#: utils/misc/guc_tables.c:1606 msgid "" "When turned on, unquoted NULL in an array input value means a null value; " "otherwise it is taken literally." @@ -29967,73 +32439,83 @@ msgstr "" "Когда Ñтот параметр включён, NULL без кавычек при вводе в маÑÑив " "воÑпринимаетÑÑ ÐºÐ°Ðº значение NULL, иначе — как Ñтрока." -#: utils/misc/guc.c:1807 +#: utils/misc/guc_tables.c:1622 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "" "WITH OIDS более не поддерживаетÑÑ; единÑтвенное допуÑтимое значение — false." -#: utils/misc/guc.c:1817 +#: utils/misc/guc_tables.c:1632 msgid "" -"Start a subprocess to capture stderr output and/or csvlogs into log files." +"Start a subprocess to capture stderr, csvlog and/or jsonlog into log files." msgstr "" -"ЗапуÑкает подпроцеÑÑ Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ stderr и/или csv-файлов и запиÑи в файлы " -"протоколов." +"ЗапуÑкает подпроцеÑÑ Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ stderr, csvlog и/или jsonlog и запиÑи в " +"файлы протоколов." -#: utils/misc/guc.c:1826 +#: utils/misc/guc_tables.c:1641 msgid "Truncate existing log files of same name during log rotation." msgstr "" "Очищать уже ÑущеÑтвующий файл Ñ Ñ‚ÐµÐ¼ же именем при прокручивании протокола." -#: utils/misc/guc.c:1837 +#: utils/misc/guc_tables.c:1652 msgid "Emit information about resource usage in sorting." msgstr "Выдавать ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð± иÑпользовании реÑурÑов при Ñортировке." -#: utils/misc/guc.c:1851 +#: utils/misc/guc_tables.c:1666 msgid "Generate debugging output for synchronized scanning." msgstr "Выдавать отладочные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñинхронного ÑканированиÑ." -#: utils/misc/guc.c:1866 +#: utils/misc/guc_tables.c:1681 msgid "Enable bounded sorting using heap sort." msgstr "" "Разрешить ограниченную Ñортировку Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸ÐµÐ¼ пирамидальной Ñортировки." -#: utils/misc/guc.c:1879 +#: utils/misc/guc_tables.c:1694 msgid "Emit WAL-related debugging output." msgstr "Выдавать отладочные ÑообщениÑ, ÑвÑзанные Ñ WAL." -#: utils/misc/guc.c:1891 +#: utils/misc/guc_tables.c:1706 msgid "Shows whether datetimes are integer based." msgstr "Показывает, ÑвлÑетÑÑ Ð»Ð¸ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð°Ñ‚Ñ‹/времени целочиÑленной." -#: utils/misc/guc.c:1902 +#: utils/misc/guc_tables.c:1717 msgid "" "Sets whether Kerberos and GSSAPI user names should be treated as case-" "insensitive." msgstr "" "Включает региÑтронезавиÑимую обработку имён пользователей Kerberos и GSSAPI." -#: utils/misc/guc.c:1912 +#: utils/misc/guc_tables.c:1727 +msgid "Sets whether GSSAPI delegation should be accepted from the client." +msgstr "Разрешает принимать от клиентов делегированные учётные данные GSSAPI." + +#: utils/misc/guc_tables.c:1737 msgid "Warn about backslash escapes in ordinary string literals." msgstr "ÐŸÑ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¾ ÑпецÑимволах '\\' в обычных Ñтроках." -#: utils/misc/guc.c:1922 +#: utils/misc/guc_tables.c:1747 msgid "Causes '...' strings to treat backslashes literally." msgstr "Включает буквальную обработку Ñимволов '\\' в Ñтроках '...'." -#: utils/misc/guc.c:1933 +#: utils/misc/guc_tables.c:1758 msgid "Enable synchronized sequential scans." msgstr "Включить Ñинхронизацию поÑледовательного ÑканированиÑ." -#: utils/misc/guc.c:1943 +#: utils/misc/guc_tables.c:1768 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "ОпределÑет, включать ли транзакцию в целевую точку воÑÑтановлениÑ." -#: utils/misc/guc.c:1953 +#: utils/misc/guc_tables.c:1778 +msgid "Starts the WAL summarizer process to enable incremental backup." +msgstr "" +"ЗапуÑкает процеÑÑ Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ WAL, необходимый Ð´Ð»Ñ Ð¸Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ " +"копированиÑ." + +#: utils/misc/guc_tables.c:1788 msgid "Allows connections and queries during recovery." msgstr "" "Разрешает принимать новые Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸ запроÑÑ‹ в процеÑÑе воÑÑтановлениÑ." -#: utils/misc/guc.c:1963 +#: utils/misc/guc_tables.c:1798 msgid "" "Allows feedback from a hot standby to the primary that will avoid query " "conflicts." @@ -30041,19 +32523,19 @@ msgstr "" "Разрешает обратную ÑвÑзь Ñервера горÑчего резерва Ñ Ð¾Ñновным Ð´Ð»Ñ " "Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð¾Ð² при длительных запроÑах." -#: utils/misc/guc.c:1973 +#: utils/misc/guc_tables.c:1808 msgid "Shows whether hot standby is currently active." msgstr "Показывает, активен ли в наÑтоÑщий момент режим горÑчего резерва." -#: utils/misc/guc.c:1984 +#: utils/misc/guc_tables.c:1819 msgid "Allows modifications of the structure of system tables." msgstr "Разрешает модифицировать Ñтруктуру ÑиÑтемных таблиц." -#: utils/misc/guc.c:1995 +#: utils/misc/guc_tables.c:1830 msgid "Disables reading from system indexes." msgstr "Запрещает иÑпользование ÑиÑтемных индекÑов." -#: utils/misc/guc.c:1996 +#: utils/misc/guc_tables.c:1831 msgid "" "It does not prevent updating the indexes, so it is safe to use. The worst " "consequence is slowness." @@ -30061,20 +32543,20 @@ msgstr "" "При Ñтом индекÑÑ‹ продолжают обновлÑтьÑÑ, так что данное поведение безопаÑно. " "Худшее ÑледÑтвие - замедление." -#: utils/misc/guc.c:2007 +#: utils/misc/guc_tables.c:1842 msgid "Allows tablespaces directly inside pg_tblspc, for testing." msgstr "" "ПозволÑет размещать табличные проÑтранÑтва внутри pg_tblspc; предназначаетÑÑ " "Ð´Ð»Ñ Ñ‚ÐµÑтированиÑ." -#: utils/misc/guc.c:2018 +#: utils/misc/guc_tables.c:1853 msgid "" "Enables backward compatibility mode for privilege checks on large objects." msgstr "" "Включает режим обратной ÑовмеÑтимоÑти при проверке привилегий Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… " "объектов." -#: utils/misc/guc.c:2019 +#: utils/misc/guc_tables.c:1854 msgid "" "Skips privilege checks when reading or modifying large objects, for " "compatibility with PostgreSQL releases prior to 9.0." @@ -30082,66 +32564,66 @@ msgstr "" "ПропуÑкает проверки привилегий при чтении или изменении больших объектов " "(Ð´Ð»Ñ ÑовмеÑтимоÑти Ñ Ð²ÐµÑ€ÑиÑми PostgreSQL до 9.0)." -#: utils/misc/guc.c:2029 +#: utils/misc/guc_tables.c:1864 msgid "When generating SQL fragments, quote all identifiers." msgstr "" "Ð“ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÑ SQL-фрагменты, заключать вÑе идентификаторы в двойные кавычки." -#: utils/misc/guc.c:2039 +#: utils/misc/guc_tables.c:1874 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Показывает, включён ли в Ñтом клаÑтере контроль целоÑтноÑти данных." -#: utils/misc/guc.c:2050 +#: utils/misc/guc_tables.c:1885 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "" "ДобавлÑть поÑледовательный номер в ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ syslog во избежание Ð¿Ð¾Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ " "повторов." -#: utils/misc/guc.c:2060 +#: utils/misc/guc_tables.c:1895 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "" "Разбивать ÑообщениÑ, передаваемые в syslog, по Ñтрокам размером не больше " "1024 байт." -#: utils/misc/guc.c:2070 +#: utils/misc/guc_tables.c:1905 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "" "ОпределÑет, будут ли узлы Ñбора и Ñбора ÑлиÑнием также выполнÑть подпланы." -#: utils/misc/guc.c:2071 +#: utils/misc/guc_tables.c:1906 msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "" "Должны ли узлы Ñбора также выполнÑть подпланы или только Ñобирать кортежи?" -#: utils/misc/guc.c:2081 +#: utils/misc/guc_tables.c:1916 msgid "Allow JIT compilation." msgstr "Включить JIT-компилÑцию." -#: utils/misc/guc.c:2092 +#: utils/misc/guc_tables.c:1927 msgid "Register JIT-compiled functions with debugger." msgstr "РегиÑтрировать JIT-Ñкомпилированные функции в отладчике." -#: utils/misc/guc.c:2109 +#: utils/misc/guc_tables.c:1944 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Выводить битовый код LLVM Ð´Ð»Ñ Ð¾Ð±Ð»ÐµÐ³Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸ JIT." -#: utils/misc/guc.c:2120 +#: utils/misc/guc_tables.c:1955 msgid "Allow JIT compilation of expressions." msgstr "Включить JIT-компилÑцию выражений." -#: utils/misc/guc.c:2131 +#: utils/misc/guc_tables.c:1966 msgid "Register JIT-compiled functions with perf profiler." msgstr "РегиÑтрировать JIT-компилируемые функции в профилировщике perf." -#: utils/misc/guc.c:2148 +#: utils/misc/guc_tables.c:1983 msgid "Allow JIT compilation of tuple deforming." msgstr "Разрешить JIT-компилÑцию кода Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ñ€Ñ‚ÐµÐ¶ÐµÐ¹." -#: utils/misc/guc.c:2159 +#: utils/misc/guc_tables.c:1994 msgid "Whether to continue running after a failure to sync data files." msgstr "Продолжать работу поÑле ошибки при Ñохранении файлов данных на диÑке." -#: utils/misc/guc.c:2168 +#: utils/misc/guc_tables.c:2003 msgid "" "Sets whether a WAL receiver should create a temporary replication slot if no " "permanent slot is configured." @@ -30149,28 +32631,46 @@ msgstr "" "ОпределÑет, должен ли приёмник WAL Ñоздавать временный Ñлот репликации, еÑли " "не наÑтроен поÑтоÑнный Ñлот." -#: utils/misc/guc.c:2186 +#: utils/misc/guc_tables.c:2012 +msgid "Enables event triggers." +msgstr "Включает Ñобытийные триггеры." + +#: utils/misc/guc_tables.c:2013 +msgid "When enabled, event triggers will fire for all applicable statements." +msgstr "" +"При включении Ñобытийные триггеры будут Ñрабатывать Ð´Ð»Ñ Ð²Ñех операторов, Ð´Ð»Ñ " +"которых применимы." + +#: utils/misc/guc_tables.c:2022 +msgid "" +"Enables a physical standby to synchronize logical failover replication slots " +"from the primary server." +msgstr "" +"ПозволÑет физичеÑкой реплике Ñинхронизировать переноÑимые Ñлоты логичеÑкой " +"репликации Ñ Ð²ÐµÐ´ÑƒÑ‰ÐµÐ³Ð¾ Ñервера." + +#: utils/misc/guc_tables.c:2040 msgid "" "Sets the amount of time to wait before forcing a switch to the next WAL file." msgstr "" "Задаёт Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ¸ перед принудительным переключением на Ñледующий файл " "WAL." -#: utils/misc/guc.c:2197 +#: utils/misc/guc_tables.c:2051 msgid "" "Sets the amount of time to wait after authentication on connection startup." msgstr "" "Задаёт Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñле аутентификации при уÑтановлении ÑоединениÑ." -#: utils/misc/guc.c:2199 utils/misc/guc.c:2820 +#: utils/misc/guc_tables.c:2053 utils/misc/guc_tables.c:2780 msgid "This allows attaching a debugger to the process." msgstr "Это позволÑет подключить к процеÑÑу отладчик." -#: utils/misc/guc.c:2208 +#: utils/misc/guc_tables.c:2062 msgid "Sets the default statistics target." msgstr "УÑтанавливает ориентир ÑтатиÑтики по умолчанию." -#: utils/misc/guc.c:2209 +#: utils/misc/guc_tables.c:2063 msgid "" "This applies to table columns that have not had a column-specific target set " "via ALTER TABLE SET STATISTICS." @@ -30178,13 +32678,13 @@ msgstr "" "Это значение раÑпроÑтранÑетÑÑ Ð½Ð° Ñтолбцы таблицы, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… ориентир " "ÑтатиÑтики не задан Ñвно через ALTER TABLE SET STATISTICS." -#: utils/misc/guc.c:2218 +#: utils/misc/guc_tables.c:2072 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "" "Задаёт предел Ð´Ð»Ñ ÑпиÑка FROM, при превышении которого подзапроÑÑ‹ не " "ÑворачиваютÑÑ." -#: utils/misc/guc.c:2220 +#: utils/misc/guc_tables.c:2074 msgid "" "The planner will merge subqueries into upper queries if the resulting FROM " "list would have no more than this many items." @@ -30192,13 +32692,13 @@ msgstr "" "Планировщик объединит вложенные запроÑÑ‹ Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ð¼Ð¸, еÑли в полученном ÑпиÑке " "FROM будет не больше заданного чиÑла Ñлементов." -#: utils/misc/guc.c:2231 +#: utils/misc/guc_tables.c:2085 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "" "Задаёт предел Ð´Ð»Ñ ÑпиÑка FROM, при превышении которого конÑтрукции JOIN " "ÑохранÑÑŽÑ‚ÑÑ." -#: utils/misc/guc.c:2233 +#: utils/misc/guc_tables.c:2087 msgid "" "The planner will flatten explicit JOIN constructs into lists of FROM items " "whenever a list of no more than this many items would result." @@ -30206,34 +32706,34 @@ msgstr "" "Планировщик будет ÑноÑить Ñвные конÑтрукции JOIN в ÑпиÑки FROM, пока в " "результирующем ÑпиÑке не больше заданного чиÑла Ñлементов." -#: utils/misc/guc.c:2244 +#: utils/misc/guc_tables.c:2098 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "" "Задаёт предел Ð´Ð»Ñ ÑпиÑка FROM, при превышении которого применÑетÑÑ GEQO." -#: utils/misc/guc.c:2254 +#: utils/misc/guc_tables.c:2108 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "" "GEQO: оценка уÑилий Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ, Ð·Ð°Ð´Ð°ÑŽÑ‰Ð°Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию Ð´Ð»Ñ " "других параметров GEQO." -#: utils/misc/guc.c:2264 +#: utils/misc/guc_tables.c:2118 msgid "GEQO: number of individuals in the population." msgstr "GEQO: чиÑло оÑобей в популÑции." -#: utils/misc/guc.c:2265 utils/misc/guc.c:2275 +#: utils/misc/guc_tables.c:2119 utils/misc/guc_tables.c:2129 msgid "Zero selects a suitable default value." msgstr "При нуле выбираетÑÑ Ð¿Ð¾Ð´Ñ…Ð¾Ð´Ñщее значение по умолчанию." -#: utils/misc/guc.c:2274 +#: utils/misc/guc_tables.c:2128 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: чиÑло итераций алгоритма." -#: utils/misc/guc.c:2286 +#: utils/misc/guc_tables.c:2140 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Задаёт интервал Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð² блокировке до проверки на взаимоблокировку." -#: utils/misc/guc.c:2297 +#: utils/misc/guc_tables.c:2151 msgid "" "Sets the maximum delay before canceling queries when a hot standby server is " "processing archived WAL data." @@ -30241,7 +32741,7 @@ msgstr "" "Задаёт макÑимальную задержку до отмены запроÑа, когда Ñервер горÑчего " "резерва обрабатывает данные WAL из архива." -#: utils/misc/guc.c:2308 +#: utils/misc/guc_tables.c:2162 msgid "" "Sets the maximum delay before canceling queries when a hot standby server is " "processing streamed WAL data." @@ -30249,13 +32749,13 @@ msgstr "" "Задаёт макÑимальную задержку до отмены запроÑа, когда Ñервер горÑчего " "резерва обрабатывает данные WAL из потока." -#: utils/misc/guc.c:2319 +#: utils/misc/guc_tables.c:2173 msgid "Sets the minimum delay for applying changes during recovery." msgstr "" "Задаёт минимальную задержку Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в процеÑÑе " "воÑÑтановлениÑ." -#: utils/misc/guc.c:2330 +#: utils/misc/guc_tables.c:2184 msgid "" "Sets the maximum interval between WAL receiver status reports to the sending " "server." @@ -30263,29 +32763,41 @@ msgstr "" "Задаёт макÑимальный интервал между отчётами о ÑоÑтоÑнии приёмника WAL, " "отправлÑемыми передающему Ñерверу." -#: utils/misc/guc.c:2341 +#: utils/misc/guc_tables.c:2195 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "" "Задаёт предельное Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… от передающего Ñервера." -#: utils/misc/guc.c:2352 +#: utils/misc/guc_tables.c:2206 msgid "Sets the maximum number of concurrent connections." msgstr "Задаёт макÑимально возможное чиÑло подключений." -#: utils/misc/guc.c:2363 +#: utils/misc/guc_tables.c:2217 msgid "Sets the number of connection slots reserved for superusers." msgstr "" "ОпределÑет, Ñколько Ñлотов подключений забронировано Ð´Ð»Ñ Ñуперпользователей." -#: utils/misc/guc.c:2373 +#: utils/misc/guc_tables.c:2227 +msgid "" +"Sets the number of connection slots reserved for roles with privileges of " +"pg_use_reserved_connections." +msgstr "" +"ОпределÑет, Ñколько Ñлотов подключений забронировано Ð´Ð»Ñ Ñ€Ð¾Ð»ÐµÐ¹ Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¼ " +"pg_use_reserved_connections." + +#: utils/misc/guc_tables.c:2238 msgid "Amount of dynamic shared memory reserved at startup." msgstr "Объём динамичеÑкой разделÑемой памÑти, резервируемый при запуÑке." -#: utils/misc/guc.c:2388 +#: utils/misc/guc_tables.c:2253 msgid "Sets the number of shared memory buffers used by the server." msgstr "Задаёт количеÑтво буферов в разделÑемой памÑти, иÑпользуемых Ñервером." -#: utils/misc/guc.c:2399 +#: utils/misc/guc_tables.c:2264 +msgid "Sets the buffer pool size for VACUUM, ANALYZE, and autovacuum." +msgstr "Задаёт размер пула буферов Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¹ VACUUM, ANALYZE и автоочиÑтки." + +#: utils/misc/guc_tables.c:2275 msgid "" "Shows the size of the server's main shared memory area (rounded up to the " "nearest MB)." @@ -30293,29 +32805,90 @@ msgstr "" "Показывает объём оÑновной облаÑти общей памÑти Ñервера (округлÑетÑÑ Ð´Ð¾ " "ближайшего Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² мегабайтах)." -#: utils/misc/guc.c:2410 +#: utils/misc/guc_tables.c:2286 msgid "Shows the number of huge pages needed for the main shared memory area." msgstr "" "Показывает количеÑтво огромных Ñтраниц, необходимое Ð´Ð»Ñ Ð¾Ñновной облаÑти " "общей памÑти." -#: utils/misc/guc.c:2411 +#: utils/misc/guc_tables.c:2287 msgid "-1 indicates that the value could not be determined." msgstr "Значение -1 показывает, что определить Ñто количеÑтво не удалоÑÑŒ." -#: utils/misc/guc.c:2421 +#: utils/misc/guc_tables.c:2297 +msgid "" +"Sets the size of the dedicated buffer pool used for the commit timestamp " +"cache." +msgstr "" +"Задаёт размер выделенного пула буферов, иÑпользуемых Ð´Ð»Ñ ÐºÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ " +"фикÑации транзакций." + +#: utils/misc/guc_tables.c:2298 utils/misc/guc_tables.c:2353 +#: utils/misc/guc_tables.c:2364 +msgid "" +"Specify 0 to have this value determined as a fraction of shared_buffers." +msgstr "При значении 0 Ñто чиÑло определÑетÑÑ ÐºÐ°Ðº процент от shared_buffers." + +#: utils/misc/guc_tables.c:2308 +msgid "" +"Sets the size of the dedicated buffer pool used for the MultiXact member " +"cache." +msgstr "" +"Задаёт размер выделенного пула буферов, иÑпользуемых Ð´Ð»Ñ ÐºÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ " +"членÑтва в MultiXact." + +#: utils/misc/guc_tables.c:2319 +msgid "" +"Sets the size of the dedicated buffer pool used for the MultiXact offset " +"cache." +msgstr "" +"Задаёт размер выделенного пула буферов, иÑпользуемых Ð´Ð»Ñ ÐºÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ " +"Ñмещений MultiXact." + +#: utils/misc/guc_tables.c:2330 +msgid "" +"Sets the size of the dedicated buffer pool used for the LISTEN/NOTIFY " +"message cache." +msgstr "" +"Задаёт размер выделенного пула буферов, иÑпользуемых Ð´Ð»Ñ ÐºÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ " +"Ñообщений LISTEN/NOTIFY." + +#: utils/misc/guc_tables.c:2341 +msgid "" +"Sets the size of the dedicated buffer pool used for the serializable " +"transaction cache." +msgstr "" +"Задаёт размер выделенного пула буферов, иÑпользуемых Ð´Ð»Ñ ÐºÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ " +"Ñериализуемых транзакций." + +#: utils/misc/guc_tables.c:2352 +msgid "" +"Sets the size of the dedicated buffer pool used for the subtransaction cache." +msgstr "" +"Задаёт размер выделенного пула буферов, иÑпользуемых Ð´Ð»Ñ ÐºÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ " +"подтранзакций." + +#: utils/misc/guc_tables.c:2363 +msgid "" +"Sets the size of the dedicated buffer pool used for the transaction status " +"cache." +msgstr "" +"Задаёт размер выделенного пула буферов, иÑпользуемых Ð´Ð»Ñ ÐºÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑтатуÑа " +"транзакций." + +#: utils/misc/guc_tables.c:2374 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Задаёт предельное чиÑло временных буферов на один ÑеанÑ." -#: utils/misc/guc.c:2432 +#: utils/misc/guc_tables.c:2385 msgid "Sets the TCP port the server listens on." msgstr "Задаёт TCP-порт Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñервера." -#: utils/misc/guc.c:2442 +#: utils/misc/guc_tables.c:2395 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Задаёт права доÑтупа Ð´Ð»Ñ Unix-Ñокета." -#: utils/misc/guc.c:2443 +#: utils/misc/guc_tables.c:2396 msgid "" "Unix-domain sockets use the usual Unix file system permission set. The " "parameter value is expected to be a numeric mode specification in the form " @@ -30327,11 +32900,11 @@ msgstr "" "воÑпринимаемом ÑиÑтемными функциÑми chmod и umask. (Чтобы иÑпользовать " "привычный воÑьмеричный формат, добавьте в начало ноль (0).)" -#: utils/misc/guc.c:2457 +#: utils/misc/guc_tables.c:2410 msgid "Sets the file permissions for log files." msgstr "Задаёт права доÑтупа к файлам протоколов." -#: utils/misc/guc.c:2458 +#: utils/misc/guc_tables.c:2411 msgid "" "The parameter value is expected to be a numeric mode specification in the " "form accepted by the chmod and umask system calls. (To use the customary " @@ -30341,11 +32914,11 @@ msgstr "" "функциÑми chmod и umask. (Чтобы иÑпользовать привычный воÑьмеричный формат, " "добавьте в начало ноль (0).)" -#: utils/misc/guc.c:2472 +#: utils/misc/guc_tables.c:2425 msgid "Shows the mode of the data directory." msgstr "Показывает режим каталога данных." -#: utils/misc/guc.c:2473 +#: utils/misc/guc_tables.c:2426 msgid "" "The parameter value is a numeric mode specification in the form accepted by " "the chmod and umask system calls. (To use the customary octal format the " @@ -30355,11 +32928,11 @@ msgstr "" "функциÑми chmod и umask. (Чтобы иÑпользовать привычный воÑьмеричный формат, " "добавьте в начало ноль (0).)" -#: utils/misc/guc.c:2486 +#: utils/misc/guc_tables.c:2439 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Задаёт предельный объём памÑти Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‡Ð¸Ñ… проÑтранÑтв запроÑов." -#: utils/misc/guc.c:2487 +#: utils/misc/guc_tables.c:2440 msgid "" "This much memory can be used by each internal sort operation and hash table " "before switching to temporary disk files." @@ -30367,19 +32940,19 @@ msgstr "" "Такой объём памÑти может иÑпользоватьÑÑ ÐºÐ°Ð¶Ð´Ð¾Ð¹ внутренней операцией " "Ñортировки и таблицей хешей до Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ð° временные файлы на диÑке." -#: utils/misc/guc.c:2499 +#: utils/misc/guc_tables.c:2457 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Задаёт предельный объём памÑти Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¹ по обÑлуживанию." -#: utils/misc/guc.c:2500 +#: utils/misc/guc_tables.c:2458 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "ПодразумеваютÑÑ Ð² чаÑтноÑти операции VACUUM и CREATE INDEX." -#: utils/misc/guc.c:2510 +#: utils/misc/guc_tables.c:2468 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Задаёт предельный объём памÑти Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого декодированиÑ." -#: utils/misc/guc.c:2511 +#: utils/misc/guc_tables.c:2469 msgid "" "This much memory can be used by each internal reorder buffer before spilling " "to disk." @@ -30387,85 +32960,94 @@ msgstr "" "Такой объём памÑти может иÑпользоватьÑÑ ÐºÐ°Ð¶Ð´Ñ‹Ð¼ внутренним буфером " "переÑортировки до Ð²Ñ‹Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… на диÑк." -#: utils/misc/guc.c:2527 +#: utils/misc/guc_tables.c:2485 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Задаёт макÑимальную глубину Ñтека (в КБ)." -#: utils/misc/guc.c:2538 +#: utils/misc/guc_tables.c:2496 msgid "Limits the total size of all temporary files used by each process." msgstr "" "Ограничивает общий размер вÑех временных файлов, доÑтупный Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ " "процеÑÑа." -#: utils/misc/guc.c:2539 +#: utils/misc/guc_tables.c:2497 msgid "-1 means no limit." msgstr "-1 отключает ограничение." -#: utils/misc/guc.c:2549 +#: utils/misc/guc_tables.c:2507 msgid "Vacuum cost for a page found in the buffer cache." msgstr "СтоимоÑть очиÑтки Ð´Ð»Ñ Ñтраницы, найденной в кеше." -#: utils/misc/guc.c:2559 +#: utils/misc/guc_tables.c:2517 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "СтоимоÑть очиÑтки Ð´Ð»Ñ Ñтраницы, не найденной в кеше." -#: utils/misc/guc.c:2569 +#: utils/misc/guc_tables.c:2527 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "СтоимоÑть очиÑтки Ð´Ð»Ñ Ñтраницы, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ была \"грÑзной\"." -#: utils/misc/guc.c:2579 +#: utils/misc/guc_tables.c:2537 msgid "Vacuum cost amount available before napping." msgstr "Ð¡ÑƒÐ¼Ð¼Ð°Ñ€Ð½Ð°Ñ ÑтоимоÑть очиÑтки, при которой нужна передышка." -#: utils/misc/guc.c:2589 +#: utils/misc/guc_tables.c:2547 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "" "Ð¡ÑƒÐ¼Ð¼Ð°Ñ€Ð½Ð°Ñ ÑтоимоÑть очиÑтки, при которой нужна передышка, Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ñ‡Ð¸Ñтки." -#: utils/misc/guc.c:2599 +#: utils/misc/guc_tables.c:2557 msgid "" "Sets the maximum number of simultaneously open files for each server process." msgstr "" "Задаёт предельное чиÑло одновременно открытых файлов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñерверного " "процеÑÑа." -#: utils/misc/guc.c:2612 +#: utils/misc/guc_tables.c:2570 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Задаёт предельное чиÑло одновременно подготовленных транзакций." -#: utils/misc/guc.c:2623 +#: utils/misc/guc_tables.c:2581 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Задаёт минимальный OID таблиц, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… отÑлеживаютÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸." -#: utils/misc/guc.c:2624 +#: utils/misc/guc_tables.c:2582 msgid "Is used to avoid output on system tables." msgstr "ПрименÑетÑÑ Ð´Ð»Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑиÑтемных таблиц." -#: utils/misc/guc.c:2633 +#: utils/misc/guc_tables.c:2591 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Задаёт OID таблицы Ð´Ð»Ñ Ð±ÐµÐ·ÑƒÑловного отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð¾Ðº." -#: utils/misc/guc.c:2645 +#: utils/misc/guc_tables.c:2603 msgid "Sets the maximum allowed duration of any statement." msgstr "Задаёт предельную длительноÑть Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ оператора." -#: utils/misc/guc.c:2646 utils/misc/guc.c:2657 utils/misc/guc.c:2668 -#: utils/misc/guc.c:2679 +#: utils/misc/guc_tables.c:2604 utils/misc/guc_tables.c:2615 +#: utils/misc/guc_tables.c:2626 utils/misc/guc_tables.c:2637 +#: utils/misc/guc_tables.c:2648 msgid "A value of 0 turns off the timeout." msgstr "Ðулевое значение отключает тайм-аут." -#: utils/misc/guc.c:2656 +#: utils/misc/guc_tables.c:2614 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Задаёт макÑимальную продолжительноÑть Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð¾Ðº." -#: utils/misc/guc.c:2667 +#: utils/misc/guc_tables.c:2625 msgid "" "Sets the maximum allowed idle time between queries, when in a transaction." msgstr "" "Задаёт предельно допуÑтимую длительноÑть проÑÑ‚Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñƒ запроÑами в " "транзакции." -#: utils/misc/guc.c:2678 +#: utils/misc/guc_tables.c:2636 +msgid "" +"Sets the maximum allowed duration of any transaction within a session (not a " +"prepared transaction)." +msgstr "" +"Задаёт предельно допуÑтимую длительноÑть Ð´Ð»Ñ Ð»ÑŽÐ±Ñ‹Ñ… транзакций в ÑеанÑе " +"(кроме подготовленных)." + +#: utils/misc/guc_tables.c:2647 msgid "" "Sets the maximum allowed idle time between queries, when not in a " "transaction." @@ -30473,45 +33055,37 @@ msgstr "" "Задаёт предельно допуÑтимую длительноÑть проÑÑ‚Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñƒ запроÑами вне " "транзакций." -#: utils/misc/guc.c:2689 +#: utils/misc/guc_tables.c:2658 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "" "Минимальный возраÑÑ‚ Ñтрок таблицы, при котором VACUUM может их заморозить." -#: utils/misc/guc.c:2699 +#: utils/misc/guc_tables.c:2668 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "" "ВозраÑÑ‚, при котором VACUUM должен Ñканировать вÑÑŽ таблицу Ñ Ñ†ÐµÐ»ÑŒÑŽ " "заморозить кортежи." -#: utils/misc/guc.c:2709 +#: utils/misc/guc_tables.c:2678 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "" "Минимальный возраÑÑ‚, при котором VACUUM будет замораживать MultiXactId в " "Ñтроке таблицы." -#: utils/misc/guc.c:2719 +#: utils/misc/guc_tables.c:2688 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "" "ВозраÑÑ‚ multixact, при котором VACUUM должен Ñканировать вÑÑŽ таблицу Ñ Ñ†ÐµÐ»ÑŒÑŽ " "заморозить кортежи." -#: utils/misc/guc.c:2729 -msgid "" -"Number of transactions by which VACUUM and HOT cleanup should be deferred, " -"if any." -msgstr "" -"ОпределÑет, на Ñколько транзакций Ñледует задержать Ñтарые Ñтроки, выполнÑÑ " -"VACUUM или \"горÑчее\" обновление." - -#: utils/misc/guc.c:2738 +#: utils/misc/guc_tables.c:2698 msgid "" "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "" "ВозраÑÑ‚, при котором VACUUM должен включить защиту от Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ð¾ " "избежание отказа." -#: utils/misc/guc.c:2747 +#: utils/misc/guc_tables.c:2707 msgid "" "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound " "outage." @@ -30519,42 +33093,44 @@ msgstr "" "ВозраÑÑ‚ мультитранзакций, при котором VACUUM должен включить защиту от " "Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð²Ð¾ избежание отказа." -#: utils/misc/guc.c:2760 +#: utils/misc/guc_tables.c:2720 msgid "Sets the maximum number of locks per transaction." msgstr "Задаёт предельное чиÑло блокировок на транзакцию." -#: utils/misc/guc.c:2761 +#: utils/misc/guc_tables.c:2721 msgid "" "The shared lock table is sized on the assumption that at most " -"max_locks_per_transaction * max_connections distinct objects will need to be " -"locked at any one time." +"\"max_locks_per_transaction\" objects per server process or prepared " +"transaction will need to be locked at any one time." msgstr "" "Размер разделÑемой таблицы блокировок выбираетÑÑ Ð¸Ð· предположениÑ, что в " -"один момент времени потребуетÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ не больше чем " -"max_locks_per_transaction * max_connections различных объектов." +"один момент времени потребуетÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ не более " +"\"max_locks_per_transaction\" объектов Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñерверного процеÑÑа или " +"подготовленной транзакции." -#: utils/misc/guc.c:2772 +#: utils/misc/guc_tables.c:2732 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Задаёт предельное чиÑло предикатных блокировок на транзакцию." -#: utils/misc/guc.c:2773 +#: utils/misc/guc_tables.c:2733 msgid "" "The shared predicate lock table is sized on the assumption that at most " -"max_pred_locks_per_transaction * max_connections distinct objects will need " -"to be locked at any one time." +"\"max_pred_locks_per_transaction\" objects per server process or prepared " +"transaction will need to be locked at any one time." msgstr "" "Размер разделÑемой таблицы предикатных блокировок выбираетÑÑ Ð¸Ð· " -"предположениÑ, что в один момент времени потребуетÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ не больше " -"чем max_pred_locks_per_transaction * max_connections различных объектов." +"предположениÑ, что в один момент времени потребуетÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ не более " +"\"max_pred_locks_per_transaction\" объектов Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñерверного процеÑÑа " +"или подготовленной транзакции." -#: utils/misc/guc.c:2784 +#: utils/misc/guc_tables.c:2744 msgid "" "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "" "Задаёт макÑимальное чиÑло Ñтраниц и кортежей, блокируемых предикатными " "блокировками в одном отношении." -#: utils/misc/guc.c:2785 +#: utils/misc/guc_tables.c:2745 msgid "" "If more than this total of pages and tuples in the same relation are locked " "by a connection, those locks are replaced by a relation-level lock." @@ -30562,13 +33138,13 @@ msgstr "" "ЕÑли одним Ñоединением блокируетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ Ñтого общего чиÑла Ñтраниц и " "кортежей, Ñти блокировки заменÑÑŽÑ‚ÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¾Ð¹ на уровне отношениÑ." -#: utils/misc/guc.c:2795 +#: utils/misc/guc_tables.c:2755 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "" "Задаёт макÑимальное чиÑло кортежей, блокируемых предикатными блокировками в " "одной Ñтранице." -#: utils/misc/guc.c:2796 +#: utils/misc/guc_tables.c:2756 msgid "" "If more than this number of tuples on the same page are locked by a " "connection, those locks are replaced by a page-level lock." @@ -30576,45 +33152,50 @@ msgstr "" "ЕÑли одним Ñоединением блокируетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ Ñтого чиÑла кортежей на одной " "Ñтранице, Ñти блокировки заменÑÑŽÑ‚ÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¾Ð¹ на уровне Ñтраницы." -#: utils/misc/guc.c:2806 +#: utils/misc/guc_tables.c:2766 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Ограничивает времÑ, за которое клиент должен пройти аутентификацию." -#: utils/misc/guc.c:2818 +#: utils/misc/guc_tables.c:2778 msgid "" "Sets the amount of time to wait before authentication on connection startup." msgstr "Задаёт Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð´Ð¾ аутентификации при уÑтановлении ÑоединениÑ." -#: utils/misc/guc.c:2830 -msgid "Buffer size for reading ahead in the WAL during recovery." +#: utils/misc/guc_tables.c:2790 +msgid "Sets the maximum number of allocated pages for NOTIFY / LISTEN queue." +msgstr "" +"Задаёт макÑимальное чиÑло Ñтраниц, выделÑемых Ð´Ð»Ñ Ð¾Ñ‡ÐµÑ€ÐµÐ´Ð¸ NOTIFY / LISTEN." + +#: utils/misc/guc_tables.c:2800 +msgid "Buffer size for reading ahead in the WAL during recovery." msgstr "Размер буфера Ð´Ð»Ñ ÑƒÐ¿Ñ€ÐµÐ¶Ð´Ð°ÑŽÑ‰ÐµÐ³Ð¾ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ WAL во Ð²Ñ€ÐµÐ¼Ñ Ð²Ð¾ÑÑтановлениÑ." -#: utils/misc/guc.c:2831 +#: utils/misc/guc_tables.c:2801 msgid "" "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." msgstr "" "МакÑимальный объём WAL, прочитываемый наперёд Ð´Ð»Ñ Ð¾ÑущеÑÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´Ð²Ñ‹Ð±Ð¾Ñ€ÐºÐ¸ " "изменÑемых блоков данных." -#: utils/misc/guc.c:2841 +#: utils/misc/guc_tables.c:2811 msgid "Sets the size of WAL files held for standby servers." msgstr "" "ОпределÑет предельный объём файлов WAL, ÑохранÑемых Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ñ‹Ñ… Ñерверов." -#: utils/misc/guc.c:2852 +#: utils/misc/guc_tables.c:2822 msgid "Sets the minimum size to shrink the WAL to." msgstr "Задаёт минимальный размер WAL при Ñжатии." -#: utils/misc/guc.c:2864 +#: utils/misc/guc_tables.c:2834 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Задаёт размер WAL, при котором инициируетÑÑ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ°." -#: utils/misc/guc.c:2876 +#: utils/misc/guc_tables.c:2846 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "" "Задаёт макÑимальное Ð²Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ¶Ð´Ñƒ автоматичеÑкими контрольными точками WAL." -#: utils/misc/guc.c:2887 +#: utils/misc/guc_tables.c:2857 msgid "" "Sets the maximum time before warning if checkpoints triggered by WAL volume " "happen too frequently." @@ -30622,7 +33203,7 @@ msgstr "" "Задаёт макÑимальный интервал, в котором выдаётÑÑ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ðµ о том, что " "контрольные точки, вызванные активноÑтью WAL, проиÑходÑÑ‚ Ñлишком чаÑто." -#: utils/misc/guc.c:2889 +#: utils/misc/guc_tables.c:2859 msgid "" "Write a message to the server log if checkpoints caused by the filling of " "WAL segment files happen more frequently than this amount of time. Zero " @@ -30632,48 +33213,54 @@ msgstr "" "контрольными точками, вызванными заполнением файлов Ñегментов WAL, меньше " "заданного значениÑ. Ðулевое значение отключает Ñти предупреждениÑ." -#: utils/misc/guc.c:2902 utils/misc/guc.c:3120 utils/misc/guc.c:3168 +#: utils/misc/guc_tables.c:2872 utils/misc/guc_tables.c:3090 +#: utils/misc/guc_tables.c:3144 msgid "" "Number of pages after which previously performed writes are flushed to disk." msgstr "" "ЧиÑло Ñтраниц, по доÑтижении которого ранее выполненные операции запиÑи " "ÑбраÑываютÑÑ Ð½Ð° диÑк." -#: utils/misc/guc.c:2913 +#: utils/misc/guc_tables.c:2883 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Задаёт чиÑло буферов диÑковых Ñтраниц в разделÑемой памÑти Ð´Ð»Ñ WAL." -#: utils/misc/guc.c:2924 +#: utils/misc/guc_tables.c:2884 +msgid "" +"Specify -1 to have this value determined as a fraction of shared_buffers." +msgstr "При значении -1 Ñто чиÑло определÑетÑÑ ÐºÐ°Ðº процент от shared_buffers." + +#: utils/misc/guc_tables.c:2894 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Задержка между ÑброÑом WAL в процеÑÑе, запиÑывающем WAL." -#: utils/misc/guc.c:2935 +#: utils/misc/guc_tables.c:2905 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "" "Объём WAL, обработанный пишущим WAL процеÑÑом, при котором инициируетÑÑ " "ÑÐ±Ñ€Ð¾Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° на диÑк." -#: utils/misc/guc.c:2946 +#: utils/misc/guc_tables.c:2916 msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "" "Размер нового файла, при доÑтижении которого файл не пишетÑÑ Ð² WAL, а " "ÑбраÑываетÑÑ Ð½Ð° диÑк." -#: utils/misc/guc.c:2957 +#: utils/misc/guc_tables.c:2927 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "" "Задаёт предельное чиÑло одновременно работающих процеÑÑов передачи WAL." -#: utils/misc/guc.c:2968 +#: utils/misc/guc_tables.c:2938 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Задаёт предельное чиÑло одновременно ÑущеÑтвующих Ñлотов репликации." -#: utils/misc/guc.c:2978 +#: utils/misc/guc_tables.c:2948 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "" "Задаёт макÑимальный размер WAL, который могут резервировать Ñлоты репликации." -#: utils/misc/guc.c:2979 +#: utils/misc/guc_tables.c:2949 msgid "" "Replication slots will be marked as failed, and segments released for " "deletion or recycling, if this much space is occupied by WAL on disk." @@ -30682,11 +33269,11 @@ msgstr "" "помечены как нерабочие, а Ñегменты будут оÑвобождены Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ " "переработки." -#: utils/misc/guc.c:2991 +#: utils/misc/guc_tables.c:2961 msgid "Sets the maximum time to wait for WAL replication." msgstr "Задаёт предельное Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ WAL." -#: utils/misc/guc.c:3002 +#: utils/misc/guc_tables.c:2972 msgid "" "Sets the delay in microseconds between transaction commit and flushing WAL " "to disk." @@ -30694,19 +33281,19 @@ msgstr "" "Задаёт задержку в микроÑекундах между фикÑированием транзакций и ÑброÑом WAL " "на диÑк." -#: utils/misc/guc.c:3014 +#: utils/misc/guc_tables.c:2984 msgid "" "Sets the minimum number of concurrent open transactions required before " -"performing commit_delay." +"performing \"commit_delay\"." msgstr "" "Задаёт минимальное чиÑло одновременно открытых транзакций, которое требуетÑÑ " -"Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ commit_delay." +"Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ \"commit_delay\"." -#: utils/misc/guc.c:3025 +#: utils/misc/guc_tables.c:2995 msgid "Sets the number of digits displayed for floating-point values." msgstr "Задаёт чиÑло выводимых цифр Ð´Ð»Ñ Ñ‡Ð¸Ñел Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой." -#: utils/misc/guc.c:3026 +#: utils/misc/guc_tables.c:2996 msgid "" "This affects real, double precision, and geometric data types. A zero or " "negative parameter value is added to the standard number of digits (FLT_DIG " @@ -30718,7 +33305,7 @@ msgstr "" "(FLT_DIG или DBL_DIG ÑоответÑтвенно). Положительное значение включает режим " "точного вывода." -#: utils/misc/guc.c:3038 +#: utils/misc/guc_tables.c:3008 msgid "" "Sets the minimum execution time above which a sample of statements will be " "logged. Sampling is determined by log_statement_sample_rate." @@ -30727,22 +33314,22 @@ msgstr "" "которого он выводитÑÑ Ð² журнал. Выборка определÑетÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ " "log_statement_sample_rate." -#: utils/misc/guc.c:3041 +#: utils/misc/guc_tables.c:3011 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "При 0 выводÑÑ‚ÑÑ Ð²Ñе запроÑÑ‹ в выборке; -1 отключает Ñти ÑообщениÑ." -#: utils/misc/guc.c:3051 +#: utils/misc/guc_tables.c:3021 msgid "" "Sets the minimum execution time above which all statements will be logged." msgstr "" "Задаёт предельное Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ оператора, при превышении которого " "он выводитÑÑ Ð² журнал." -#: utils/misc/guc.c:3053 +#: utils/misc/guc_tables.c:3023 msgid "Zero prints all queries. -1 turns this feature off." msgstr "При 0 выводÑÑ‚ÑÑ Ð²Ñе запроÑÑ‹; -1 отключает Ñти ÑообщениÑ." -#: utils/misc/guc.c:3063 +#: utils/misc/guc_tables.c:3033 msgid "" "Sets the minimum execution time above which autovacuum actions will be " "logged." @@ -30750,12 +33337,12 @@ msgstr "" "Задаёт предельное Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ñ‡Ð¸Ñтки, при превышении которого Ñта " "Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð¸Ñ€ÑƒÐµÑ‚ÑÑ Ð² журнале." -#: utils/misc/guc.c:3065 +#: utils/misc/guc_tables.c:3035 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "" "При 0 протоколируютÑÑ Ð²Ñе операции автоочиÑтки; -1 отключает Ñти ÑообщениÑ." -#: utils/misc/guc.c:3075 +#: utils/misc/guc_tables.c:3045 msgid "" "Sets the maximum length in bytes of data logged for bind parameter values " "when logging statements." @@ -30763,11 +33350,11 @@ msgstr "" "Задаёт макÑимальный размер данных (в байтах), выводимых в значениÑÑ… " "привÑзанных параметров при протоколировании операторов." -#: utils/misc/guc.c:3077 utils/misc/guc.c:3089 +#: utils/misc/guc_tables.c:3047 utils/misc/guc_tables.c:3059 msgid "-1 to print values in full." msgstr "При -1 Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð²Ð¾Ð´ÑÑ‚ÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ñтью." -#: utils/misc/guc.c:3087 +#: utils/misc/guc_tables.c:3057 msgid "" "Sets the maximum length in bytes of data logged for bind parameter values " "when logging statements, on error." @@ -30775,17 +33362,17 @@ msgstr "" "Задаёт макÑимальный размер данных (в байтах), выводимых в значениÑÑ… " "привÑзанных параметров при протоколировании операторов в Ñлучае ошибки." -#: utils/misc/guc.c:3099 +#: utils/misc/guc_tables.c:3069 msgid "Background writer sleep time between rounds." msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ Ð² процеÑÑе фоновой запиÑи между подходами." -#: utils/misc/guc.c:3110 +#: utils/misc/guc_tables.c:3080 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "" "МакÑимальное чиÑло LRU-Ñтраниц, ÑбраÑываемых за один подход, в процеÑÑе " "фоновой запиÑи." -#: utils/misc/guc.c:3133 +#: utils/misc/guc_tables.c:3103 msgid "" "Number of simultaneous requests that can be handled efficiently by the disk " "subsystem." @@ -30793,83 +33380,97 @@ msgstr "" "ЧиÑло одновременных запроÑов, которые могут быть Ñффективно обработаны " "диÑковой подÑиÑтемой." -#: utils/misc/guc.c:3151 +#: utils/misc/guc_tables.c:3117 msgid "" -"A variant of effective_io_concurrency that is used for maintenance work." +"A variant of \"effective_io_concurrency\" that is used for maintenance work." msgstr "" -"Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° effective_io_concurrency, Ð¿Ñ€ÐµÐ´Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¹ " -"обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð‘Ð”." +"Ð’Ð°Ñ€Ð¸Ð°Ñ†Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"effective_io_concurrency\", Ð¿Ñ€ÐµÐ´Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ " +"операций обÑÐ»ÑƒÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð‘Ð”." + +#: utils/misc/guc_tables.c:3132 +msgid "Limit on the size of data reads and writes." +msgstr "Предельный размер Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¹ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸ запиÑи данных." -#: utils/misc/guc.c:3181 +#: utils/misc/guc_tables.c:3157 msgid "Maximum number of concurrent worker processes." msgstr "Задаёт макÑимально возможное чиÑло рабочих процеÑÑов." -#: utils/misc/guc.c:3193 +#: utils/misc/guc_tables.c:3169 msgid "Maximum number of logical replication worker processes." msgstr "" "Задаёт макÑимально возможное чиÑло рабочих процеÑÑов логичеÑкой репликации." -#: utils/misc/guc.c:3205 +#: utils/misc/guc_tables.c:3181 msgid "Maximum number of table synchronization workers per subscription." msgstr "" "Задаёт макÑимально возможное чиÑло процеÑÑов Ñинхронизации таблиц Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ " "подпиÑки." -#: utils/misc/guc.c:3215 +#: utils/misc/guc_tables.c:3193 +msgid "Maximum number of parallel apply workers per subscription." +msgstr "" +"Задаёт макÑимально возможное чиÑло параллельных применÑющих процеÑÑов Ð´Ð»Ñ " +"одной подпиÑки." + +#: utils/misc/guc_tables.c:3203 msgid "Sets the amount of time to wait before forcing log file rotation." msgstr "" "Задаёт Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ¸ перед принудительным переключением на Ñледующий файл " "журнала." -#: utils/misc/guc.c:3227 +#: utils/misc/guc_tables.c:3215 msgid "Sets the maximum size a log file can reach before being rotated." msgstr "" "Задаёт макÑимальный размер, которого может доÑтичь файл журнала до " "Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ð° другой файл." -#: utils/misc/guc.c:3239 +#: utils/misc/guc_tables.c:3227 msgid "Shows the maximum number of function arguments." msgstr "Показывает макÑимально возможное чиÑло аргументов функций." -#: utils/misc/guc.c:3250 +#: utils/misc/guc_tables.c:3238 msgid "Shows the maximum number of index keys." msgstr "Показывает макÑимально возможное чиÑло ключей в индекÑе." -#: utils/misc/guc.c:3261 +#: utils/misc/guc_tables.c:3249 msgid "Shows the maximum identifier length." msgstr "Показывает макÑимально возможную длину идентификатора." -#: utils/misc/guc.c:3272 +#: utils/misc/guc_tables.c:3260 msgid "Shows the size of a disk block." msgstr "Показывает размер диÑкового блока." -#: utils/misc/guc.c:3283 +#: utils/misc/guc_tables.c:3271 msgid "Shows the number of pages per disk file." msgstr "Показывает чиÑло Ñтраниц в одном файле." -#: utils/misc/guc.c:3294 +#: utils/misc/guc_tables.c:3282 msgid "Shows the block size in the write ahead log." msgstr "Показывает размер блока в журнале WAL." -#: utils/misc/guc.c:3305 +#: utils/misc/guc_tables.c:3293 msgid "" "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "" "Задаёт Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ¸ перед повторной попыткой Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº WAL поÑле неудачи." -#: utils/misc/guc.c:3317 +#: utils/misc/guc_tables.c:3305 msgid "Shows the size of write ahead log segments." msgstr "Показывает размер Ñегментов журнала предзапиÑи." -#: utils/misc/guc.c:3330 +#: utils/misc/guc_tables.c:3318 +msgid "Time for which WAL summary files should be kept." +msgstr "ВремÑ, в течение которого должны ÑохранÑтьÑÑ Ñ„Ð°Ð¹Ð»Ñ‹ Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ WAL." + +#: utils/misc/guc_tables.c:3331 msgid "Time to sleep between autovacuum runs." msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñƒ запуÑками автоочиÑтки." -#: utils/misc/guc.c:3340 +#: utils/misc/guc_tables.c:3341 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Минимальное чиÑло изменений или удалений кортежей, вызывающее очиÑтку." -#: utils/misc/guc.c:3349 +#: utils/misc/guc_tables.c:3350 msgid "" "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert " "vacuums." @@ -30877,27 +33478,27 @@ msgstr "" "Минимальное чиÑло добавлений кортежей, вызывающее очиÑтку; при -1 Ñ‚Ð°ÐºÐ°Ñ " "очиÑтка отключаетÑÑ." -#: utils/misc/guc.c:3358 +#: utils/misc/guc_tables.c:3359 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "" "Минимальное чиÑло добавлений, изменений или удалений кортежей, вызывающее " "анализ." -#: utils/misc/guc.c:3368 +#: utils/misc/guc_tables.c:3369 msgid "" "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "" "ВозраÑÑ‚, при котором необходима автоочиÑтка таблицы Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ " "Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ ID транзакций." -#: utils/misc/guc.c:3380 +#: utils/misc/guc_tables.c:3381 msgid "" "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "" "ВозраÑÑ‚ multixact, при котором необходима автоочиÑтка таблицы Ð´Ð»Ñ " "Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ multixact." -#: utils/misc/guc.c:3390 +#: utils/misc/guc_tables.c:3391 msgid "" "Sets the maximum number of simultaneously running autovacuum worker " "processes." @@ -30905,64 +33506,53 @@ msgstr "" "Задаёт предельное чиÑло одновременно выполнÑющихÑÑ Ñ€Ð°Ð±Ð¾Ñ‡Ð¸Ñ… процеÑÑов " "автоочиÑтки." -#: utils/misc/guc.c:3400 +#: utils/misc/guc_tables.c:3401 msgid "" "Sets the maximum number of parallel processes per maintenance operation." msgstr "" "Задаёт макÑимальное чиÑло параллельных процеÑÑов на одну операцию " "обÑлуживаниÑ." -#: utils/misc/guc.c:3410 +#: utils/misc/guc_tables.c:3411 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Задаёт макÑимальное чиÑло параллельных процеÑÑов на узел иÑполнителÑ." -#: utils/misc/guc.c:3421 +#: utils/misc/guc_tables.c:3422 msgid "" "Sets the maximum number of parallel workers that can be active at one time." msgstr "" -"Задаёт макÑимальное чиÑло параллельных процеÑÑов, которые могут быть активны " -"одновременно." +"Задаёт макÑимальное чиÑло параллельных иÑполнителей, которые могут быть " +"активны одновременно." -#: utils/misc/guc.c:3432 +#: utils/misc/guc_tables.c:3433 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "" "Задаёт предельный объём памÑти Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ рабочего процеÑÑа автоочиÑтки." -#: utils/misc/guc.c:3443 -msgid "" -"Time before a snapshot is too old to read pages changed after the snapshot " -"was taken." -msgstr "" -"Срок, по иÑтечении которого Ñнимок ÑчитаетÑÑ Ñлишком Ñтарым Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ " -"Ñтраниц, изменённых поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñнимка." - -#: utils/misc/guc.c:3444 -msgid "A value of -1 disables this feature." -msgstr "Значение -1 отключает Ñто поведение." - -#: utils/misc/guc.c:3454 +#: utils/misc/guc_tables.c:3444 msgid "Time between issuing TCP keepalives." msgstr "Интервал между TCP-пакетами пульÑа (keep-alive)." -#: utils/misc/guc.c:3455 utils/misc/guc.c:3466 utils/misc/guc.c:3590 +#: utils/misc/guc_tables.c:3445 utils/misc/guc_tables.c:3456 +#: utils/misc/guc_tables.c:3580 msgid "A value of 0 uses the system default." msgstr "При нулевом значении дейÑтвует ÑиÑтемный параметр." -#: utils/misc/guc.c:3465 +#: utils/misc/guc_tables.c:3455 msgid "Time between TCP keepalive retransmits." msgstr "Интервал между повторениÑми TCP-пакетов пульÑа (keep-alive)." -#: utils/misc/guc.c:3476 +#: utils/misc/guc_tables.c:3466 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "" "Повторное ÑоглаÑование SSL более не поддерживаетÑÑ; единÑтвенное допуÑтимое " "значение - 0." -#: utils/misc/guc.c:3487 +#: utils/misc/guc_tables.c:3477 msgid "Maximum number of TCP keepalive retransmits." msgstr "МакÑимальное чиÑло повторений TCP-пакетов пульÑа (keep-alive)." -#: utils/misc/guc.c:3488 +#: utils/misc/guc_tables.c:3478 msgid "" "Number of consecutive keepalive retransmits that can be lost before a " "connection is considered dead. A value of 0 uses the system default." @@ -30971,15 +33561,15 @@ msgstr "" "чем Ñоединение будет ÑчитатьÑÑ Ð¿Ñ€Ð¾Ð¿Ð°Ð²ÑˆÐ¸Ð¼. При нулевом значении дейÑтвует " "ÑиÑтемный параметр." -#: utils/misc/guc.c:3499 +#: utils/misc/guc_tables.c:3489 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Ограничивает результат точного поиÑка Ñ Ð¸Ñпользованием GIN." -#: utils/misc/guc.c:3510 +#: utils/misc/guc_tables.c:3500 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "ПодÑказывает планировщику примерный общий размер кешей данных." -#: utils/misc/guc.c:3511 +#: utils/misc/guc_tables.c:3501 msgid "" "That is, the total size of the caches (kernel cache and shared buffers) used " "for PostgreSQL data files. This is measured in disk pages, which are " @@ -30989,12 +33579,12 @@ msgstr "" "попадают файлы данных PostgreSQL. Размер задаётÑÑ Ð² диÑковых Ñтраницах " "(обычно Ñто 8 КБ)." -#: utils/misc/guc.c:3522 +#: utils/misc/guc_tables.c:3512 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "" "Задаёт минимальный объём данных в таблице Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ ÑканированиÑ." -#: utils/misc/guc.c:3523 +#: utils/misc/guc_tables.c:3513 msgid "" "If the planner estimates that it will read a number of table pages too small " "to reach this limit, a parallel scan will not be considered." @@ -31003,12 +33593,12 @@ msgstr "" "задано Ñтим ограничением, он иÑключает параллельное Ñканирование из " "раÑÑмотрениÑ." -#: utils/misc/guc.c:3533 +#: utils/misc/guc_tables.c:3523 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "" "Задаёт минимальный объём данных в индекÑе Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ ÑканированиÑ." -#: utils/misc/guc.c:3534 +#: utils/misc/guc_tables.c:3524 msgid "" "If the planner estimates that it will read a number of index pages too small " "to reach this limit, a parallel scan will not be considered." @@ -31017,64 +33607,68 @@ msgstr "" "задано Ñтим ограничением, он иÑключает параллельное Ñканирование из " "раÑÑмотрениÑ." -#: utils/misc/guc.c:3545 +#: utils/misc/guc_tables.c:3535 msgid "Shows the server version as an integer." msgstr "Показывает верÑию Ñервера в виде целого чиÑла." -#: utils/misc/guc.c:3556 +#: utils/misc/guc_tables.c:3546 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "" "ФикÑирует в протоколе превышение временными файлами заданного размера (в КБ)." -#: utils/misc/guc.c:3557 +#: utils/misc/guc_tables.c:3547 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "" "При 0 отмечаютÑÑ Ð²Ñе файлы; при -1 Ñти ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð°ÑŽÑ‚ÑÑ (по умолчанию)." -#: utils/misc/guc.c:3567 +#: utils/misc/guc_tables.c:3557 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Задаёт размер, резервируемый Ð´Ð»Ñ pg_stat_activity.query (в байтах)." -#: utils/misc/guc.c:3578 +#: utils/misc/guc_tables.c:3568 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Задаёт макÑимальный размер ÑпиÑка-очереди Ð´Ð»Ñ GIN-индекÑа." -#: utils/misc/guc.c:3589 +#: utils/misc/guc_tables.c:3579 msgid "TCP user timeout." msgstr "ПользовательÑкий таймаут TCP." -#: utils/misc/guc.c:3600 +#: utils/misc/guc_tables.c:3590 msgid "The size of huge page that should be requested." msgstr "Запрашиваемый размер огромных Ñтраниц." -#: utils/misc/guc.c:3611 +#: utils/misc/guc_tables.c:3601 msgid "Aggressively flush system caches for debugging purposes." msgstr "Включает агреÑÑивный ÑÐ±Ñ€Ð¾Ñ ÑиÑтемных кешей Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ¹ отладки." -#: utils/misc/guc.c:3634 +#: utils/misc/guc_tables.c:3624 msgid "" "Sets the time interval between checks for disconnection while running " "queries." msgstr "" "Задаёт интервал между проверками Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов." -#: utils/misc/guc.c:3645 +#: utils/misc/guc_tables.c:3635 msgid "Time between progress updates for long-running startup operations." msgstr "" "Интервал между обновлениÑми ÑоÑтоÑÐ½Ð¸Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций, выполнÑемых при " "запуÑке." -#: utils/misc/guc.c:3647 +#: utils/misc/guc_tables.c:3637 msgid "0 turns this feature off." msgstr "При 0 Ñта функциональноÑть отключаетÑÑ." -#: utils/misc/guc.c:3666 +#: utils/misc/guc_tables.c:3647 +msgid "Sets the iteration count for SCRAM secret generation." +msgstr "Задаёт количеÑтво итераций Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñекрета SCRAM." + +#: utils/misc/guc_tables.c:3667 msgid "" "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "" "Задаёт Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ° ориентир ÑтоимоÑти поÑледовательного Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñтраницы." -#: utils/misc/guc.c:3677 +#: utils/misc/guc_tables.c:3678 msgid "" "Sets the planner's estimate of the cost of a nonsequentially fetched disk " "page." @@ -31082,13 +33676,13 @@ msgstr "" "Задаёт Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ° ориентир ÑтоимоÑти непоÑледовательного Ñ‡Ñ‚ÐµÐ½Ð¸Ñ " "Ñтраницы." -#: utils/misc/guc.c:3688 +#: utils/misc/guc_tables.c:3689 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "" "Задаёт Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ° ориентир ÑтоимоÑти обработки каждого кортежа " "(Ñтроки)." -#: utils/misc/guc.c:3699 +#: utils/misc/guc_tables.c:3700 msgid "" "Sets the planner's estimate of the cost of processing each index entry " "during an index scan." @@ -31096,7 +33690,7 @@ msgstr "" "Задаёт Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ° ориентир ÑтоимоÑти обработки каждого Ñлемента " "индекÑа в процеÑÑе ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа." -#: utils/misc/guc.c:3710 +#: utils/misc/guc_tables.c:3711 msgid "" "Sets the planner's estimate of the cost of processing each operator or " "function call." @@ -31104,7 +33698,7 @@ msgstr "" "Задаёт Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ° ориентир ÑтоимоÑти обработки каждого оператора или " "вызова функции." -#: utils/misc/guc.c:3721 +#: utils/misc/guc_tables.c:3722 msgid "" "Sets the planner's estimate of the cost of passing each tuple (row) from " "worker to leader backend." @@ -31112,7 +33706,7 @@ msgstr "" "Задаёт Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ° ориентир ÑтоимоÑти передачи каждого кортежа (Ñтроки) " "ведущему процеÑÑу от рабочего." -#: utils/misc/guc.c:3732 +#: utils/misc/guc_tables.c:3733 msgid "" "Sets the planner's estimate of the cost of starting up worker processes for " "parallel query." @@ -31120,40 +33714,40 @@ msgstr "" "Задаёт Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ° ориентир ÑтоимоÑти запуÑка рабочих процеÑÑов Ð´Ð»Ñ " "параллельного Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа." -#: utils/misc/guc.c:3744 +#: utils/misc/guc_tables.c:3745 msgid "Perform JIT compilation if query is more expensive." msgstr "СтоимоÑть запроÑа, при превышении которой производитÑÑ JIT-компилÑциÑ." -#: utils/misc/guc.c:3745 +#: utils/misc/guc_tables.c:3746 msgid "-1 disables JIT compilation." msgstr "-1 отключает JIT-компилÑцию." -#: utils/misc/guc.c:3755 +#: utils/misc/guc_tables.c:3756 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "" "СтоимоÑть запроÑа, при превышении которой оптимизируютÑÑ JIT-" "Ñкомпилированные функции." -#: utils/misc/guc.c:3756 +#: utils/misc/guc_tables.c:3757 msgid "-1 disables optimization." msgstr "-1 отключает оптимизацию." -#: utils/misc/guc.c:3766 +#: utils/misc/guc_tables.c:3767 msgid "Perform JIT inlining if query is more expensive." msgstr "СтоимоÑть запроÑа, при которой выполнÑетÑÑ Ð²Ñтраивание JIT." -#: utils/misc/guc.c:3767 +#: utils/misc/guc_tables.c:3768 msgid "-1 disables inlining." msgstr "-1 отключает вÑтраивание кода." -#: utils/misc/guc.c:3777 +#: utils/misc/guc_tables.c:3778 msgid "" "Sets the planner's estimate of the fraction of a cursor's rows that will be " "retrieved." msgstr "" "Задаёт Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ° ориентир доли требуемых Ñтрок курÑора в общем чиÑле." -#: utils/misc/guc.c:3789 +#: utils/misc/guc_tables.c:3790 msgid "" "Sets the planner's estimate of the average size of a recursive query's " "working table." @@ -31161,37 +33755,37 @@ msgstr "" "Задаёт Ð´Ð»Ñ Ð¿Ð»Ð°Ð½Ð¸Ñ€Ð¾Ð²Ñ‰Ð¸ÐºÐ° ориентир Ñреднего размера рабочей таблицы в " "рекурÑивном запроÑе." -#: utils/misc/guc.c:3801 +#: utils/misc/guc_tables.c:3802 msgid "GEQO: selective pressure within the population." msgstr "GEQO: Ñелективное давление в популÑции." -#: utils/misc/guc.c:3812 +#: utils/misc/guc_tables.c:3813 msgid "GEQO: seed for random path selection." msgstr "GEQO: отправное значение Ð´Ð»Ñ Ñлучайного выбора пути." -#: utils/misc/guc.c:3823 -msgid "Multiple of work_mem to use for hash tables." -msgstr "Множитель work_mem, определÑющий объём памÑти Ð´Ð»Ñ Ñ…ÐµÑˆ-таблиц." +#: utils/misc/guc_tables.c:3824 +msgid "Multiple of \"work_mem\" to use for hash tables." +msgstr "Множитель \"work_mem\", определÑющий объём памÑти Ð´Ð»Ñ Ñ…ÐµÑˆ-таблиц." -#: utils/misc/guc.c:3834 +#: utils/misc/guc_tables.c:3835 msgid "Multiple of the average buffer usage to free per round." msgstr "" "Множитель Ð´Ð»Ñ Ñреднего чиÑла иÑпользованных буферов, определÑющий чиÑло " "буферов, оÑвобождаемых за один подход." -#: utils/misc/guc.c:3844 +#: utils/misc/guc_tables.c:3845 msgid "Sets the seed for random-number generation." msgstr "Задаёт отправное значение Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñлучайных чиÑел." -#: utils/misc/guc.c:3855 +#: utils/misc/guc_tables.c:3856 msgid "Vacuum cost delay in milliseconds." msgstr "Задержка очиÑтки (в миллиÑекундах)." -#: utils/misc/guc.c:3866 +#: utils/misc/guc_tables.c:3867 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Задержка очиÑтки Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ñ‡Ð¸Ñтки (в миллиÑекундах)." -#: utils/misc/guc.c:3877 +#: utils/misc/guc_tables.c:3878 msgid "" "Number of tuple updates or deletes prior to vacuum as a fraction of " "reltuples." @@ -31199,13 +33793,13 @@ msgstr "" "Отношение чиÑла обновлений или удалений кортежей к reltuples, определÑющее " "потребноÑть в очиÑтке." -#: utils/misc/guc.c:3887 +#: utils/misc/guc_tables.c:3888 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "" "Отношение чиÑла добавлений кортежей к reltuples, определÑющее потребноÑть в " "очиÑтке." -#: utils/misc/guc.c:3897 +#: utils/misc/guc_tables.c:3898 msgid "" "Number of tuple inserts, updates, or deletes prior to analyze as a fraction " "of reltuples." @@ -31213,7 +33807,7 @@ msgstr "" "Отношение чиÑла добавлений, обновлений или удалений кортежей к reltuples, " "определÑющее потребноÑть в анализе." -#: utils/misc/guc.c:3907 +#: utils/misc/guc_tables.c:3908 msgid "" "Time spent flushing dirty buffers during checkpoint, as fraction of " "checkpoint interval." @@ -31221,25 +33815,26 @@ msgstr "" "Отношение продолжительноÑти ÑброÑа \"грÑзных\" буферов во Ð²Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð¹ " "точки к интервалу контрольных точек." -#: utils/misc/guc.c:3917 -msgid "Fraction of statements exceeding log_min_duration_sample to be logged." +#: utils/misc/guc_tables.c:3918 +msgid "" +"Fraction of statements exceeding \"log_min_duration_sample\" to be logged." msgstr "" "Ð”Ð¾Ð»Ñ Ð·Ð°Ð¿Ð¸Ñываемых в журнал операторов Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью, превышающей " -"log_min_duration_sample." +"\"log_min_duration_sample\"." -#: utils/misc/guc.c:3918 +#: utils/misc/guc_tables.c:3919 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "" "Может задаватьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¼ от 0.0 (не запиÑывать никакие операторы) и 1.0 " "(запиÑывать вÑе)." -#: utils/misc/guc.c:3927 +#: utils/misc/guc_tables.c:3928 msgid "Sets the fraction of transactions from which to log all statements." msgstr "" "Задаёт долю транзакций, вÑе операторы которых будут запиÑыватьÑÑ Ð² журнал " "Ñервера." -#: utils/misc/guc.c:3928 +#: utils/misc/guc_tables.c:3929 msgid "" "Use a value between 0.0 (never log) and 1.0 (log all statements for all " "transactions)." @@ -31247,48 +33842,48 @@ msgstr "" "Значение 0.0 означает — не запиÑывать никакие транзакции, а значение 1.0 — " "запиÑывать вÑе операторы вÑех транзакций." -#: utils/misc/guc.c:3947 +#: utils/misc/guc_tables.c:3948 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "Задаёт команду оболочки, вызываемую Ð´Ð»Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð°Ñ†Ð¸Ð¸ файла WAL." -#: utils/misc/guc.c:3948 +#: utils/misc/guc_tables.c:3949 msgid "This is used only if \"archive_library\" is not set." msgstr "Это параметр иÑпользуетÑÑ, только еÑли не задан \"archive_library\"." -#: utils/misc/guc.c:3957 +#: utils/misc/guc_tables.c:3958 msgid "Sets the library that will be called to archive a WAL file." msgstr "Задаёт библиотеку, вызываемую Ð´Ð»Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð°Ñ†Ð¸Ð¸ файла WAL." -#: utils/misc/guc.c:3958 +#: utils/misc/guc_tables.c:3959 msgid "An empty string indicates that \"archive_command\" should be used." msgstr "" "ПуÑÑ‚Ð°Ñ Ñтрока указывает, что должен иÑпользоватьÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ " "\"archive_command\"." -#: utils/misc/guc.c:3967 +#: utils/misc/guc_tables.c:3968 msgid "" "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "" "Задаёт команду оболочки, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ вызыватьÑÑ Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð· архива " "файла WAL." -#: utils/misc/guc.c:3977 +#: utils/misc/guc_tables.c:3978 msgid "Sets the shell command that will be executed at every restart point." msgstr "" "Задаёт команду оболочки, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнÑтьÑÑ Ð¿Ñ€Ð¸ каждой точке " "перезапуÑка." -#: utils/misc/guc.c:3987 +#: utils/misc/guc_tables.c:3988 msgid "" "Sets the shell command that will be executed once at the end of recovery." msgstr "" "Задаёт команду оболочки, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ выполнÑтьÑÑ Ð² конце воÑÑтановлениÑ." -#: utils/misc/guc.c:3997 +#: utils/misc/guc_tables.c:3998 msgid "Specifies the timeline to recover into." msgstr "Указывает линию времени Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ð¾ÑÑтановлениÑ." -#: utils/misc/guc.c:4007 +#: utils/misc/guc_tables.c:4008 msgid "" "Set to \"immediate\" to end recovery as soon as a consistent state is " "reached." @@ -31296,24 +33891,24 @@ msgstr "" "Задайте значение \"immediate\", чтобы воÑÑтановление оÑтановилоÑÑŒ Ñразу " "поÑле доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ ÑоглаÑованного ÑоÑтоÑниÑ." -#: utils/misc/guc.c:4016 +#: utils/misc/guc_tables.c:4017 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "" "Задаёт идентификатор транзакции, вплоть до которой будет производитьÑÑ " "воÑÑтановление." -#: utils/misc/guc.c:4025 +#: utils/misc/guc_tables.c:4026 msgid "Sets the time stamp up to which recovery will proceed." msgstr "" "Задаёт момент времени, вплоть до которого будет производитьÑÑ Ð²Ð¾ÑÑтановление." -#: utils/misc/guc.c:4034 +#: utils/misc/guc_tables.c:4035 msgid "Sets the named restore point up to which recovery will proceed." msgstr "" "Задаёт именованную точку воÑÑтановлениÑ, до которой будет производитьÑÑ " "воÑÑтановление." -#: utils/misc/guc.c:4043 +#: utils/misc/guc_tables.c:4044 msgid "" "Sets the LSN of the write-ahead log location up to which recovery will " "proceed." @@ -31321,71 +33916,73 @@ msgstr "" "Задаёт в виде LSN позицию в журнале предзапиÑи, до которой будет " "производитьÑÑ Ð²Ð¾ÑÑтановление." -#: utils/misc/guc.c:4053 -msgid "Specifies a file name whose presence ends recovery in the standby." -msgstr "" -"Задаёт Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°, приÑутÑтвие которого выводит ведомый из режима " -"воÑÑтановлениÑ." - -#: utils/misc/guc.c:4063 +#: utils/misc/guc_tables.c:4054 msgid "Sets the connection string to be used to connect to the sending server." msgstr "" "Задаёт Ñтроку ÑоединениÑ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользоватьÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº " "передающему Ñерверу." -#: utils/misc/guc.c:4074 +#: utils/misc/guc_tables.c:4065 msgid "Sets the name of the replication slot to use on the sending server." msgstr "" "Задаёт Ð¸Ð¼Ñ Ñлота репликации, который будет иÑпользоватьÑÑ Ð½Ð° передающем " "Ñервере." -#: utils/misc/guc.c:4084 +#: utils/misc/guc_tables.c:4075 msgid "Sets the client's character set encoding." msgstr "Задаёт кодировку Ñимволов, иÑпользуемую клиентом." -#: utils/misc/guc.c:4095 +#: utils/misc/guc_tables.c:4086 msgid "Controls information prefixed to each log line." msgstr "ОпределÑет Ñодержимое префикÑа каждой Ñтроки протокола." -#: utils/misc/guc.c:4096 +#: utils/misc/guc_tables.c:4087 msgid "If blank, no prefix is used." msgstr "При пуÑтом значении Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ñ‚Ð°ÐºÐ¶Ðµ отÑутÑтвует." -#: utils/misc/guc.c:4105 +#: utils/misc/guc_tables.c:4096 msgid "Sets the time zone to use in log messages." msgstr "Задаёт чаÑовой поÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° времени в ÑообщениÑÑ… протокола." -#: utils/misc/guc.c:4115 +#: utils/misc/guc_tables.c:4106 msgid "Sets the display format for date and time values." msgstr "УÑтанавливает формат вывода дат и времени." -#: utils/misc/guc.c:4116 +#: utils/misc/guc_tables.c:4107 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Также помогает разбирать неоднозначно заданные вводимые даты." -#: utils/misc/guc.c:4127 +#: utils/misc/guc_tables.c:4118 msgid "Sets the default table access method for new tables." msgstr "Задаёт табличный метод доÑтупа по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… таблиц." -#: utils/misc/guc.c:4138 +#: utils/misc/guc_tables.c:4129 msgid "Sets the default tablespace to create tables and indexes in." msgstr "" "Задаёт табличное проÑтранÑтво по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… таблиц и индекÑов." -#: utils/misc/guc.c:4139 +#: utils/misc/guc_tables.c:4130 msgid "An empty string selects the database's default tablespace." msgstr "При пуÑтом значении иÑпользуетÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ðµ проÑтранÑтво базы данных." -#: utils/misc/guc.c:4149 +#: utils/misc/guc_tables.c:4140 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "" "Задаёт табличное проÑтранÑтво(а) Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ… таблиц и файлов Ñортировки." -#: utils/misc/guc.c:4160 +#: utils/misc/guc_tables.c:4151 +msgid "" +"Sets whether a CREATEROLE user automatically grants the role to themselves, " +"and with which options." +msgstr "" +"ОпределÑет, будет ли пользователь CREATEROLE автоматичеÑки включать ÑÐµÐ±Ñ Ð² " +"Ñоздаваемую роль и Ñ ÐºÐ°ÐºÐ¸Ð¼Ð¸ параметрами." + +#: utils/misc/guc_tables.c:4163 msgid "Sets the path for dynamically loadable modules." msgstr "Задаёт путь Ð´Ð»Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ‡ÐµÑки загружаемых модулей." -#: utils/misc/guc.c:4161 +#: utils/misc/guc_tables.c:4164 msgid "" "If a dynamically loadable module needs to be opened and the specified name " "does not have a directory component (i.e., the name does not contain a " @@ -31395,79 +33992,71 @@ msgstr "" "указан путь (нет Ñимвола '/'), ÑиÑтема будет иÑкать Ñтот файл в заданном " "пути." -#: utils/misc/guc.c:4174 +#: utils/misc/guc_tables.c:4177 msgid "Sets the location of the Kerberos server key file." msgstr "Задаёт размещение файла Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð¼ Kerberos Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ñервера." -#: utils/misc/guc.c:4185 +#: utils/misc/guc_tables.c:4188 msgid "Sets the Bonjour service name." msgstr "Задаёт название Ñлужбы Bonjour." -#: utils/misc/guc.c:4197 -msgid "Shows the collation order locale." -msgstr "Показывает правило Ñортировки." - -#: utils/misc/guc.c:4208 -msgid "Shows the character classification and case conversion locale." -msgstr "Показывает правило клаÑÑификации Ñимволов и Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ€ÐµÐ³Ð¸Ñтра." - -#: utils/misc/guc.c:4219 +#: utils/misc/guc_tables.c:4198 msgid "Sets the language in which messages are displayed." msgstr "Задаёт Ñзык выводимых Ñообщений." -#: utils/misc/guc.c:4229 +#: utils/misc/guc_tables.c:4208 msgid "Sets the locale for formatting monetary amounts." msgstr "Задаёт локаль Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´ÐµÐ½ÐµÐ¶Ð½Ñ‹Ñ… Ñумм." -#: utils/misc/guc.c:4239 +#: utils/misc/guc_tables.c:4218 msgid "Sets the locale for formatting numbers." msgstr "Задаёт локаль Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‡Ð¸Ñел." -#: utils/misc/guc.c:4249 +#: utils/misc/guc_tables.c:4228 msgid "Sets the locale for formatting date and time values." msgstr "Задаёт локаль Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ñ‚ и времени." -#: utils/misc/guc.c:4259 +#: utils/misc/guc_tables.c:4238 msgid "Lists shared libraries to preload into each backend." msgstr "" "СпиÑок разделÑемых библиотек, заранее загружаемых в каждый обÑлуживающий " "процеÑÑ." -#: utils/misc/guc.c:4270 +#: utils/misc/guc_tables.c:4249 msgid "Lists shared libraries to preload into server." msgstr "СпиÑок разделÑемых библиотек, заранее загружаемых в памÑть Ñервера." -#: utils/misc/guc.c:4281 +#: utils/misc/guc_tables.c:4260 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "" "СпиÑок непривилегированных разделÑемых библиотек, заранее загружаемых в " "каждый обÑлуживающий процеÑÑ." -#: utils/misc/guc.c:4292 +#: utils/misc/guc_tables.c:4271 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "Задаёт порÑдок проÑмотра Ñхемы при поиÑке неполных имён." -#: utils/misc/guc.c:4304 +#: utils/misc/guc_tables.c:4283 msgid "Shows the server (database) character set encoding." msgstr "Показывает кодировку Ñимволов Ñервера (базы данных)." -#: utils/misc/guc.c:4316 +#: utils/misc/guc_tables.c:4295 msgid "Shows the server version." msgstr "Показывает верÑию Ñервера." -#: utils/misc/guc.c:4328 +#: utils/misc/guc_tables.c:4307 msgid "Sets the current role." msgstr "Задаёт текущую роль." -#: utils/misc/guc.c:4340 +#: utils/misc/guc_tables.c:4319 msgid "Sets the session user name." msgstr "Задаёт Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² ÑеанÑе." -#: utils/misc/guc.c:4351 +#: utils/misc/guc_tables.c:4330 msgid "Sets the destination for server log output." msgstr "ОпределÑет, куда будет выводитьÑÑ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð» Ñервера." -#: utils/misc/guc.c:4352 +#: utils/misc/guc_tables.c:4331 msgid "" "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", " "\"jsonlog\", and \"eventlog\", depending on the platform." @@ -31475,24 +34064,24 @@ msgstr "" "Значение может включать Ñочетание Ñлов \"stderr\", \"syslog\", \"csvlog\", " "\"jsonlog\" и \"eventlog\", в завиÑимоÑти от платформы." -#: utils/misc/guc.c:4363 +#: utils/misc/guc_tables.c:4342 msgid "Sets the destination directory for log files." msgstr "Задаёт целевой каталог Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² протоколов." -#: utils/misc/guc.c:4364 +#: utils/misc/guc_tables.c:4343 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "" "Путь может быть абÑолютным или указыватьÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно каталога данных." -#: utils/misc/guc.c:4374 +#: utils/misc/guc_tables.c:4353 msgid "Sets the file name pattern for log files." msgstr "Задаёт шаблон имени Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² протоколов." -#: utils/misc/guc.c:4385 +#: utils/misc/guc_tables.c:4364 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "Задаёт Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ Ñообщений PostgreSQL в syslog." -#: utils/misc/guc.c:4396 +#: utils/misc/guc_tables.c:4375 msgid "" "Sets the application name used to identify PostgreSQL messages in the event " "log." @@ -31500,121 +34089,121 @@ msgstr "" "Задаёт Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ Ñообщений PostgreSQL в журнале " "Ñобытий." -#: utils/misc/guc.c:4407 +#: utils/misc/guc_tables.c:4386 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "" "Задаёт чаÑовой поÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° и разбора Ñтрокового предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸." -#: utils/misc/guc.c:4417 +#: utils/misc/guc_tables.c:4396 msgid "Selects a file of time zone abbreviations." msgstr "Выбирает файл Ñ Ñокращёнными названиÑми чаÑовых поÑÑов." -#: utils/misc/guc.c:4427 +#: utils/misc/guc_tables.c:4406 msgid "Sets the owning group of the Unix-domain socket." msgstr "Задаёт группу-владельца Unix-Ñокета." -#: utils/misc/guc.c:4428 +#: utils/misc/guc_tables.c:4407 msgid "" "The owning user of the socket is always the user that starts the server." msgstr "" "СобÑтвенно владельцем Ñокета вÑегда будет пользователь, запуÑкающий Ñервер." -#: utils/misc/guc.c:4438 +#: utils/misc/guc_tables.c:4417 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Задаёт каталоги, где будут ÑоздаватьÑÑ Unix-Ñокеты." -#: utils/misc/guc.c:4453 +#: utils/misc/guc_tables.c:4428 msgid "Sets the host name or IP address(es) to listen to." msgstr "Задаёт Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð° или IP-адреÑ(а) Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð²Ñзки." -#: utils/misc/guc.c:4468 +#: utils/misc/guc_tables.c:4443 msgid "Sets the server's data directory." msgstr "ОпределÑет каталог данных Ñервера." -#: utils/misc/guc.c:4479 +#: utils/misc/guc_tables.c:4454 msgid "Sets the server's main configuration file." msgstr "ОпределÑет оÑновной файл конфигурации Ñервера." -#: utils/misc/guc.c:4490 +#: utils/misc/guc_tables.c:4465 msgid "Sets the server's \"hba\" configuration file." msgstr "Задаёт путь к файлу конфигурации \"hba\"." -#: utils/misc/guc.c:4501 +#: utils/misc/guc_tables.c:4476 msgid "Sets the server's \"ident\" configuration file." msgstr "Задаёт путь к файлу конфигурации \"ident\"." -#: utils/misc/guc.c:4512 +#: utils/misc/guc_tables.c:4487 msgid "Writes the postmaster PID to the specified file." msgstr "Файл, в который будет запиÑан код процеÑÑа postmaster." -#: utils/misc/guc.c:4523 +#: utils/misc/guc_tables.c:4498 msgid "Shows the name of the SSL library." msgstr "Показывает Ð¸Ð¼Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¸ SSL." -#: utils/misc/guc.c:4538 +#: utils/misc/guc_tables.c:4513 msgid "Location of the SSL server certificate file." msgstr "Размещение файла Ñертификата Ñервера Ð´Ð»Ñ SSL." -#: utils/misc/guc.c:4548 +#: utils/misc/guc_tables.c:4523 msgid "Location of the SSL server private key file." msgstr "Размещение файла Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ ключом Ñервера Ð´Ð»Ñ SSL." -#: utils/misc/guc.c:4558 +#: utils/misc/guc_tables.c:4533 msgid "Location of the SSL certificate authority file." msgstr "Размещение файла центра Ñертификации Ð´Ð»Ñ SSL." -#: utils/misc/guc.c:4568 +#: utils/misc/guc_tables.c:4543 msgid "Location of the SSL certificate revocation list file." msgstr "Размещение файла Ñо ÑпиÑком отзыва Ñертификатов Ð´Ð»Ñ SSL." -#: utils/misc/guc.c:4578 +#: utils/misc/guc_tables.c:4553 msgid "Location of the SSL certificate revocation list directory." msgstr "Размещение каталога Ñо ÑпиÑками отзыва Ñертификатов Ð´Ð»Ñ SSL." -#: utils/misc/guc.c:4588 +#: utils/misc/guc_tables.c:4563 msgid "" "Number of synchronous standbys and list of names of potential synchronous " "ones." msgstr "" "КоличеÑтво потенциально Ñинхронных резервных Ñерверов и ÑпиÑок их имён." -#: utils/misc/guc.c:4599 +#: utils/misc/guc_tables.c:4574 msgid "Sets default text search configuration." msgstr "Задаёт конфигурацию текÑтового поиÑка по умолчанию." -#: utils/misc/guc.c:4609 +#: utils/misc/guc_tables.c:4584 msgid "Sets the list of allowed SSL ciphers." msgstr "Задаёт ÑпиÑок допуÑтимых алгоритмов ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ SSL." -#: utils/misc/guc.c:4624 +#: utils/misc/guc_tables.c:4599 msgid "Sets the curve to use for ECDH." msgstr "Задаёт кривую Ð´Ð»Ñ ECDH." -#: utils/misc/guc.c:4639 +#: utils/misc/guc_tables.c:4614 msgid "Location of the SSL DH parameters file." msgstr "Размещение файла Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸ SSL DH." -#: utils/misc/guc.c:4650 +#: utils/misc/guc_tables.c:4625 msgid "Command to obtain passphrases for SSL." msgstr "Команда, позволÑÑŽÑ‰Ð°Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒ пароль Ð´Ð»Ñ SSL." -#: utils/misc/guc.c:4661 +#: utils/misc/guc_tables.c:4636 msgid "Sets the application name to be reported in statistics and logs." msgstr "" "Задаёт Ð¸Ð¼Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ, которое будет выводитьÑÑ Ð² ÑтатиÑтике и протоколах." -#: utils/misc/guc.c:4672 +#: utils/misc/guc_tables.c:4647 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Задаёт Ð¸Ð¼Ñ ÐºÐ»Ð°Ñтера, которое будет добавлÑтьÑÑ Ð² название процеÑÑа." -#: utils/misc/guc.c:4683 +#: utils/misc/guc_tables.c:4658 msgid "" "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "" "Задаёт перечень менеджеров реÑурÑов WAL, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… выполнÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ " "целоÑтноÑти WAL." -#: utils/misc/guc.c:4684 +#: utils/misc/guc_tables.c:4659 msgid "" "Full-page images will be logged for all data blocks and cross-checked " "against the results of WAL replay." @@ -31622,28 +34211,53 @@ msgstr "" "При Ñтом в журнал будут запиÑыватьÑÑ Ð¾Ð±Ñ€Ð°Ð·Ñ‹ полных Ñтраниц Ð´Ð»Ñ Ð²Ñех блоков " "данных Ð´Ð»Ñ Ñверки Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð°Ð¼Ð¸ воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ WAL." -#: utils/misc/guc.c:4694 +#: utils/misc/guc_tables.c:4669 msgid "JIT provider to use." msgstr "ИÑпользуемый провайдер JIT." -#: utils/misc/guc.c:4705 +#: utils/misc/guc_tables.c:4680 msgid "Log backtrace for errors in these functions." msgstr "ЗапиÑывать в журнал Ñтек в Ñлучае ошибок в перечиÑленных функциÑÑ…." -#: utils/misc/guc.c:4725 +#: utils/misc/guc_tables.c:4691 +msgid "Use direct I/O for file access." +msgstr "ИÑпользовать прÑмой ввод/вывод Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸." + +#: utils/misc/guc_tables.c:4702 +msgid "" +"Lists streaming replication standby server replication slot names that " +"logical WAL sender processes will wait for." +msgstr "" +"ОпределÑет ÑпиÑок имён Ñлотов потовой репликации, готовноÑти которых будут " +"ждать процеÑÑÑ‹ передачи логичеÑких изменений." + +#: utils/misc/guc_tables.c:4704 +msgid "" +"Logical WAL sender processes will send decoded changes to output plugins " +"only after the specified replication slots have confirmed receiving WAL." +msgstr "" +"ПроцеÑÑÑ‹ передачи логичеÑких изменений из WAL будут передавать " +"декодированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñм вывода только поÑле того, как указанные " +"Ñлоты репликации подтвердÑÑ‚ получение WAL." + +#: utils/misc/guc_tables.c:4716 +msgid "Prohibits access to non-system relations of specified kinds." +msgstr "Запрещает доÑтуп к неÑиÑтемным отношениÑм указанных видов." + +#: utils/misc/guc_tables.c:4736 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "ОпределÑет, можно ли иÑпользовать \"\\'\" в текÑтовых Ñтроках." -#: utils/misc/guc.c:4735 +#: utils/misc/guc_tables.c:4746 msgid "Sets the output format for bytea." msgstr "Задаёт формат вывода данных типа bytea." -#: utils/misc/guc.c:4745 +#: utils/misc/guc_tables.c:4756 msgid "Sets the message levels that are sent to the client." msgstr "Ограничивает уровень Ñообщений, передаваемых клиенту." -#: utils/misc/guc.c:4746 utils/misc/guc.c:4832 utils/misc/guc.c:4843 -#: utils/misc/guc.c:4919 +#: utils/misc/guc_tables.c:4757 utils/misc/guc_tables.c:4853 +#: utils/misc/guc_tables.c:4864 msgid "" "Each level includes all the levels that follow it. The later the level, the " "fewer messages are sent." @@ -31651,16 +34265,16 @@ msgstr "" "Каждый уровень включает вÑе поÑледующие. Чем выше уровень, тем меньше " "Ñообщений." -#: utils/misc/guc.c:4756 +#: utils/misc/guc_tables.c:4767 msgid "Enables in-core computation of query identifiers." msgstr "Включает внутреннее вычиÑление идентификаторов запроÑов." -#: utils/misc/guc.c:4766 +#: utils/misc/guc_tables.c:4777 msgid "Enables the planner to use constraints to optimize queries." msgstr "" "Разрешает планировщику оптимизировать запроÑÑ‹, полагаÑÑÑŒ на ограничениÑ." -#: utils/misc/guc.c:4767 +#: utils/misc/guc_tables.c:4778 msgid "" "Table scans will be skipped if their constraints guarantee that no rows " "match the query." @@ -31668,89 +34282,88 @@ msgstr "" "Сканирование таблицы не будет выполнÑтьÑÑ, еÑли её Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð³Ð°Ñ€Ð°Ð½Ñ‚Ð¸Ñ€ÑƒÑŽÑ‚, " "что запроÑу не удовлетворÑÑŽÑ‚ никакие Ñтроки." -#: utils/misc/guc.c:4778 +#: utils/misc/guc_tables.c:4789 msgid "Sets the default compression method for compressible values." msgstr "Задаёт выбираемый по умолчанию метод ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð´Ð»Ñ Ñжимаемых значений." -#: utils/misc/guc.c:4789 +#: utils/misc/guc_tables.c:4800 msgid "Sets the transaction isolation level of each new transaction." msgstr "Задаёт уровень изолÑции транзакций Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… транзакций." -#: utils/misc/guc.c:4799 +#: utils/misc/guc_tables.c:4810 msgid "Sets the current transaction's isolation level." msgstr "Задаёт текущий уровень изолÑции транзакций." -#: utils/misc/guc.c:4810 +#: utils/misc/guc_tables.c:4821 msgid "Sets the display format for interval values." msgstr "Задаёт формат Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½Ð¸Ñ… значений." -#: utils/misc/guc.c:4821 +#: utils/misc/guc_tables.c:4832 +msgid "Log level for reporting invalid ICU locale strings." +msgstr "Уровень Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñообщений о некорректных Ñтроках локалей ICU." + +#: utils/misc/guc_tables.c:4842 msgid "Sets the verbosity of logged messages." msgstr "Задаёт детализацию протоколируемых Ñообщений." -#: utils/misc/guc.c:4831 +#: utils/misc/guc_tables.c:4852 msgid "Sets the message levels that are logged." msgstr "Ограничивает уровни протоколируемых Ñообщений." -#: utils/misc/guc.c:4842 +#: utils/misc/guc_tables.c:4863 msgid "" "Causes all statements generating error at or above this level to be logged." msgstr "" "Включает протоколирование Ð´Ð»Ñ SQL-операторов, выполненных Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ Ñтого " "или большего уровнÑ." -#: utils/misc/guc.c:4853 +#: utils/misc/guc_tables.c:4874 msgid "Sets the type of statements logged." msgstr "Задаёт тип протоколируемых операторов." -#: utils/misc/guc.c:4863 +#: utils/misc/guc_tables.c:4884 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "Задаёт Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ Ñообщений, отправлÑемых в syslog." -#: utils/misc/guc.c:4878 +#: utils/misc/guc_tables.c:4895 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "" "Задаёт режим ÑÑ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð¾Ð² и правил перезапиÑи Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ ÑеанÑа." -#: utils/misc/guc.c:4888 +#: utils/misc/guc_tables.c:4905 msgid "Sets the current transaction's synchronization level." msgstr "Задаёт уровень Ñинхронизации текущей транзакции." -#: utils/misc/guc.c:4898 -msgid "Allows archiving of WAL files using archive_command." -msgstr "Разрешает архивацию файлов WAL командой archive_command." +#: utils/misc/guc_tables.c:4915 +msgid "Allows archiving of WAL files using \"archive_command\"." +msgstr "Разрешает архивацию файлов WAL Ñ Ð¸Ñпользованием \"archive_command\"." -#: utils/misc/guc.c:4908 +#: utils/misc/guc_tables.c:4925 msgid "Sets the action to perform upon reaching the recovery target." msgstr "" "Задаёт дейÑтвие, которое будет выполнÑтьÑÑ Ð¿Ð¾ доÑтижении цели воÑÑтановлениÑ." -#: utils/misc/guc.c:4918 -msgid "Enables logging of recovery-related debugging information." -msgstr "" -"Включает протоколирование отладочной информации, ÑвÑзанной Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸ÐµÐ¹." - -#: utils/misc/guc.c:4935 +#: utils/misc/guc_tables.c:4935 msgid "Collects function-level statistics on database activity." msgstr "Включает Ñбор ÑтатиÑтики активноÑти в БД на уровне функций." -#: utils/misc/guc.c:4946 +#: utils/misc/guc_tables.c:4946 msgid "Sets the consistency of accesses to statistics data." msgstr "Задаёт режим ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ñтупа к данным ÑтатиÑтики." -#: utils/misc/guc.c:4956 +#: utils/misc/guc_tables.c:4956 msgid "Compresses full-page writes written in WAL file with specified method." msgstr "Сжимать данные запиÑываемых в WAL полных Ñтраниц заданным методом." -#: utils/misc/guc.c:4966 +#: utils/misc/guc_tables.c:4966 msgid "Sets the level of information written to the WAL." msgstr "Задаёт уровень информации, запиÑываемой в WAL." -#: utils/misc/guc.c:4976 +#: utils/misc/guc_tables.c:4976 msgid "Selects the dynamic shared memory implementation used." msgstr "Выбирает иÑпользуемую реализацию динамичеÑкой разделÑемой памÑти." -#: utils/misc/guc.c:4986 +#: utils/misc/guc_tables.c:4986 msgid "" "Selects the shared memory implementation used for the main shared memory " "region." @@ -31758,15 +34371,15 @@ msgstr "" "Выбирает реализацию разделÑемой памÑти Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñновным блоком " "разделÑемой памÑти." -#: utils/misc/guc.c:4996 +#: utils/misc/guc_tables.c:4996 msgid "Selects the method used for forcing WAL updates to disk." msgstr "Выбирает метод принудительной запиÑи изменений в WAL на диÑк." -#: utils/misc/guc.c:5006 +#: utils/misc/guc_tables.c:5006 msgid "Sets how binary values are to be encoded in XML." msgstr "ОпределÑет, как должны кодироватьÑÑ Ð´Ð²Ð¾Ð¸Ñ‡Ð½Ñ‹Ðµ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² XML." -#: utils/misc/guc.c:5016 +#: utils/misc/guc_tables.c:5016 msgid "" "Sets whether XML data in implicit parsing and serialization operations is to " "be considered as documents or content fragments." @@ -31774,39 +34387,45 @@ msgstr "" "ОпределÑет, Ñледует ли раÑÑматривать XML-данные в неÑвных операциÑÑ… разбора " "и Ñериализации как документы или как фрагменты ÑодержаниÑ." -#: utils/misc/guc.c:5027 +#: utils/misc/guc_tables.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "Включает иÑпользование огромных Ñтраниц в Linux и в Windows." -#: utils/misc/guc.c:5037 +#: utils/misc/guc_tables.c:5037 +msgid "Indicates the status of huge pages." +msgstr "Показывает ÑоÑтоÑние иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð³Ñ€Ð¾Ð¼Ð½Ñ‹Ñ… Ñтраниц." + +#: utils/misc/guc_tables.c:5048 msgid "Prefetch referenced blocks during recovery." msgstr "ОÑущеÑтвлÑть предвыборку изменÑемых блоков в процеÑÑе воÑÑтановлениÑ." -#: utils/misc/guc.c:5038 +#: utils/misc/guc_tables.c:5049 msgid "Look ahead in the WAL to find references to uncached data." msgstr "Прочитывать WAL наперёд Ð´Ð»Ñ Ð²Ñ‹Ñ‡Ð¸ÑÐ»ÐµÐ½Ð¸Ñ ÐµÑ‰Ñ‘ не кешированных блоков." -#: utils/misc/guc.c:5047 -msgid "Forces use of parallel query facilities." -msgstr "Принудительно включает режим параллельного Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов." +#: utils/misc/guc_tables.c:5058 +msgid "Forces the planner's use parallel query nodes." +msgstr "Принудительно включает в планировщике узлы параллельного выполнениÑ." -#: utils/misc/guc.c:5048 +#: utils/misc/guc_tables.c:5059 msgid "" -"If possible, run query using a parallel worker and with parallel " -"restrictions." +"This can be useful for testing the parallel query infrastructure by forcing " +"the planner to generate plans that contain nodes that perform tuple " +"communication between workers and the main process." msgstr "" -"ЕÑли возможно, Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÑетÑÑ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸ иÑполнителÑми и Ñ " -"ограничениÑми параллельноÑти." +"Это может быть полезно Ð´Ð»Ñ Ñ‚ÐµÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ñ„Ñ€Ð°Ñтруктуры параллельного " +"выполнениÑ, так как планировщик будет Ñтроить планы Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡ÐµÐ¹ кортежей " +"между параллельными иÑполнителÑми и оÑновным процеÑÑом." -#: utils/misc/guc.c:5058 +#: utils/misc/guc_tables.c:5071 msgid "Chooses the algorithm for encrypting passwords." msgstr "Выбирает алгоритм ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¹." -#: utils/misc/guc.c:5068 +#: utils/misc/guc_tables.c:5081 msgid "Controls the planner's selection of custom or generic plan." msgstr "УправлÑет выбором Ñпециализированных или общих планов планировщиком." -#: utils/misc/guc.c:5069 +#: utils/misc/guc_tables.c:5082 msgid "" "Prepared statements can have custom and generic plans, and the planner will " "attempt to choose which is better. This can be set to override the default " @@ -31816,617 +34435,295 @@ msgstr "" "планы, и планировщик пытаетÑÑ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ лучший вариант. Этот параметр " "позволÑет переопределить поведение по умолчанию." -#: utils/misc/guc.c:5081 +#: utils/misc/guc_tables.c:5094 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "" "Задаёт минимальную верÑию протокола SSL/TLS, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ иÑпользоватьÑÑ." -#: utils/misc/guc.c:5093 +#: utils/misc/guc_tables.c:5106 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "" "Задаёт макÑимальную верÑию протокола SSL/TLS, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ иÑпользоватьÑÑ." -#: utils/misc/guc.c:5105 +#: utils/misc/guc_tables.c:5118 msgid "" "Sets the method for synchronizing the data directory before crash recovery." msgstr "" "Задаёт метод Ñинхронизации каталога данных перед воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле ÑбоÑ." -#: utils/misc/guc.c:5680 utils/misc/guc.c:5696 -#, c-format -msgid "invalid configuration parameter name \"%s\"" -msgstr "неверное Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° конфигурации: \"%s\"" +#: utils/misc/guc_tables.c:5127 +msgid "" +"Forces immediate streaming or serialization of changes in large transactions." +msgstr "" +"Включает непоÑредÑтвенную передачу или Ñериализацию изменений в больших " +"транзакциÑÑ…." -#: utils/misc/guc.c:5682 -#, c-format +#: utils/misc/guc_tables.c:5128 msgid "" -"Custom parameter names must be two or more simple identifiers separated by " -"dots." +"On the publisher, it allows streaming or serializing each change in logical " +"decoding. On the subscriber, it allows serialization of all changes to files " +"and notifies the parallel apply workers to read and apply them at the end of " +"the transaction." msgstr "" -"Имена неÑтандартных параметров должны ÑоÑтоÑть из двух или более проÑтых " -"идентификаторов, разделённых точками." +"Ðа Ñтороне публикации Ñтот параметр определÑет выбор между потоковой " +"передачей и Ñериализацией в логичеÑком декодировании Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ изменениÑ. " +"Ðа Ñтороне подпиÑки он позволÑет включить Ñериализацию вÑех изменений в " +"файлы и ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñющих процеÑÑов о необходимоÑти прочитать и " +"применить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² конце транзакции." -#: utils/misc/guc.c:5698 +#: utils/misc/help_config.c:129 #, c-format -msgid "\"%s\" is a reserved prefix." -msgstr "\"%s\" — зарезервированный префикÑ." +msgid "internal error: unrecognized run-time parameter type\n" +msgstr "внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: нераÑпознанный тип параметра времени выполнениÑ\n" -#: utils/misc/guc.c:5712 +#: utils/misc/pg_controldata.c:50 utils/misc/pg_controldata.c:90 +#: utils/misc/pg_controldata.c:181 utils/misc/pg_controldata.c:222 #, c-format -msgid "unrecognized configuration parameter \"%s\"" -msgstr "нераÑпознанный параметр конфигурации: \"%s\"" +msgid "calculated CRC checksum does not match value stored in file" +msgstr "" +"вычиÑÐ»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма (CRC) не ÑоответÑтвует значению, Ñохранённому " +"в файле" -#: utils/misc/guc.c:6104 +# well-spelled: пользов +#: utils/misc/pg_rusage.c:64 #, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: ошибка доÑтупа к каталогу \"%s\": %s\n" +msgid "CPU: user: %d.%02d s, system: %d.%02d s, elapsed: %d.%02d s" +msgstr "CPU: пользов.: %d.%02d Ñ, ÑиÑтема: %d.%02d Ñ, прошло: %d.%02d Ñ" -#: utils/misc/guc.c:6109 +#: utils/misc/rls.c:127 #, c-format -msgid "" -"Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" +msgid "query would be affected by row-level security policy for table \"%s\"" msgstr "" -"ЗапуÑтите initdb или pg_basebackup Ð´Ð»Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ каталога данных " -"PostgreSQL.\n" +"Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð±ÑƒÐ´ÐµÑ‚ ограничен политикой безопаÑноÑти на уровне Ñтрок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ " +"\"%s\"" -#: utils/misc/guc.c:6129 +#: utils/misc/rls.c:129 #, c-format msgid "" -"%s does not know where to find the server configuration file.\n" -"You must specify the --config-file or -D invocation option or set the PGDATA " -"environment variable.\n" +"To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW " +"LEVEL SECURITY." msgstr "" -"%s не знает, где найти файл конфигурации Ñервера.\n" -"Ð’Ñ‹ должны указать его раÑположение в параметре --config-file или -D, либо " -"уÑтановить переменную Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n" +"Чтобы отключить политику Ð´Ð»Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð° таблицы, воÑпользуйтеÑÑŒ командой " +"ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/guc.c:6148 +#: utils/misc/timeout.c:520 #, c-format -msgid "%s: could not access the server configuration file \"%s\": %s\n" -msgstr "%s не может открыть файл конфигурации Ñервера \"%s\": %s\n" +msgid "cannot add more timeout reasons" +msgstr "добавить другие причины тайм-аута нельзÑ" -#: utils/misc/guc.c:6174 +#: utils/misc/tzparser.c:61 #, c-format msgid "" -"%s does not know where to find the database system data.\n" -"This can be specified as \"data_directory\" in \"%s\", or by the -D " -"invocation option, or by the PGDATA environment variable.\n" +"time zone abbreviation \"%s\" is too long (maximum %d characters) in time " +"zone file \"%s\", line %d" msgstr "" -"%s не знает, где найти данные СУБД.\n" -"Их раÑположение можно задать как значение \"data_directory\" в файле \"%s\", " -"либо передать в параметре -D, либо уÑтановить переменную Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n" +"краткое обозначение чаÑового поÑÑа \"%s\" должно Ñодержать меньше Ñимволов " +"(макÑимум %d) (файл чаÑовых поÑÑов \"%s\", Ñтрока %d)" -#: utils/misc/guc.c:6222 +#: utils/misc/tzparser.c:73 #, c-format -msgid "" -"%s does not know where to find the \"hba\" configuration file.\n" -"This can be specified as \"hba_file\" in \"%s\", or by the -D invocation " -"option, or by the PGDATA environment variable.\n" +msgid "time zone offset %d is out of range in time zone file \"%s\", line %d" msgstr "" -"%s не знает, где найти файл конфигурации \"hba\".\n" -"Его раÑположение можно задать как значение \"hba_file\" в файле \"%s\", либо " -"передать в параметре -D, либо уÑтановить переменную Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n" +"Ñмещение чаÑового поÑÑа %d выходит за рамки (файл чаÑовых поÑÑов \"%s\", " +"Ñтрока %d)" -#: utils/misc/guc.c:6245 +#: utils/misc/tzparser.c:112 #, c-format -msgid "" -"%s does not know where to find the \"ident\" configuration file.\n" -"This can be specified as \"ident_file\" in \"%s\", or by the -D invocation " -"option, or by the PGDATA environment variable.\n" +msgid "missing time zone abbreviation in time zone file \"%s\", line %d" msgstr "" -"%s не знает, где найти файл конфигурации \"ident\".\n" -"Его раÑположение можно задать как значение \"ident_file\" в файле \"%s\", " -"либо передать в параметре -D, либо уÑтановить переменную Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n" - -#: utils/misc/guc.c:7176 -msgid "Value exceeds integer range." -msgstr "Значение выходит за рамки целых чиÑел." +"отÑутÑтвует краткое обозначение чаÑового поÑÑа (файл чаÑовых поÑÑов \"%s\", " +"Ñтрока %d)" -#: utils/misc/guc.c:7412 +#: utils/misc/tzparser.c:121 #, c-format -msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d%s%s вне диапазона, допуÑтимого Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\" (%d .. %d)" +msgid "missing time zone offset in time zone file \"%s\", line %d" +msgstr "" +"отÑутÑтвует Ñмещение чаÑового поÑÑа (файл чаÑовых поÑÑов \"%s\", Ñтрока %d)" -#: utils/misc/guc.c:7448 +#: utils/misc/tzparser.c:133 #, c-format -msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" -msgstr "%g%s%s вне диапазона, допуÑтимого Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\" (%g .. %g)" +msgid "invalid number for time zone offset in time zone file \"%s\", line %d" +msgstr "" +"Ñмещение чаÑового поÑÑа должно быть чиÑлом (файл чаÑовых поÑÑов \"%s\", " +"Ñтрока %d)" -#: utils/misc/guc.c:7648 utils/misc/guc.c:9096 +#: utils/misc/tzparser.c:169 #, c-format -msgid "cannot set parameters during a parallel operation" -msgstr "уÑтанавливать параметры во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" +msgid "invalid syntax in time zone file \"%s\", line %d" +msgstr "ошибка ÑинтакÑиÑа в файле чаÑовых поÑÑов \"%s\", Ñтроке %d" -#: utils/misc/guc.c:7665 utils/misc/guc.c:8920 +#: utils/misc/tzparser.c:237 #, c-format -msgid "parameter \"%s\" cannot be changed" -msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ" +msgid "time zone abbreviation \"%s\" is multiply defined" +msgstr "краткое обозначение чаÑового поÑÑа \"%s\" определено неоднократно" -#: utils/misc/guc.c:7688 utils/misc/guc.c:7908 utils/misc/guc.c:8006 -#: utils/misc/guc.c:8104 utils/misc/guc.c:8228 utils/misc/guc.c:8331 -#: guc-file.l:353 +#: utils/misc/tzparser.c:239 #, c-format -msgid "parameter \"%s\" cannot be changed without restarting the server" -msgstr "параметр \"%s\" изменÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ при перезапуÑке Ñервера" +msgid "" +"Entry in time zone file \"%s\", line %d, conflicts with entry in file " +"\"%s\", line %d." +msgstr "" +"ЗапиÑÑŒ в файле чаÑовых поÑÑов \"%s\", Ñтроке %d, противоречит запиÑи в файле " +"\"%s\", Ñтроке %d." -#: utils/misc/guc.c:7698 +#: utils/misc/tzparser.c:301 #, c-format -msgid "parameter \"%s\" cannot be changed now" -msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ ÑейчаÑ" +msgid "invalid time zone file name \"%s\"" +msgstr "неправильное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° чаÑовых поÑÑов: \"%s\"" -#: utils/misc/guc.c:7725 utils/misc/guc.c:7783 utils/misc/guc.c:8896 -#: utils/misc/guc.c:11795 +#: utils/misc/tzparser.c:314 #, c-format -msgid "permission denied to set parameter \"%s\"" -msgstr "нет прав Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\"" +msgid "time zone file recursion limit exceeded in file \"%s\"" +msgstr "предел вложенноÑти файлов чаÑовых поÑÑов превышен в файле \"%s\"" -#: utils/misc/guc.c:7763 +#: utils/misc/tzparser.c:353 utils/misc/tzparser.c:366 #, c-format -msgid "parameter \"%s\" cannot be set after connection start" -msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ поÑле уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑоединениÑ" +msgid "could not read time zone file \"%s\": %m" +msgstr "прочитать файл чаÑовых поÑÑов \"%s\" не удалоÑÑŒ: %m" -#: utils/misc/guc.c:7822 +#: utils/misc/tzparser.c:377 #, c-format -msgid "cannot set parameter \"%s\" within security-definer function" -msgstr "" -"параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ в функции Ñ ÐºÐ¾Ð½Ñ‚ÐµÐºÑтом безопаÑноÑти " -"определившего" +msgid "line is too long in time zone file \"%s\", line %d" +msgstr "Ñлишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ Ñтрока в файле чаÑовых поÑÑов \"%s\" (Ñтрока %d)" -#: utils/misc/guc.c:8475 utils/misc/guc.c:8522 utils/misc/guc.c:10001 +#: utils/misc/tzparser.c:401 #, c-format -msgid "" -"must be superuser or have privileges of pg_read_all_settings to examine " -"\"%s\"" +msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "" -"чтобы прочитать \"%s\", нужно быть Ñуперпользователем или иметь права роли " -"pg_read_all_settings" +"в @INCLUDE не указано Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° (файл чаÑовых поÑÑов \"%s\", Ñтрока %d)" -#: utils/misc/guc.c:8606 +#: utils/mmgr/aset.c:452 utils/mmgr/bump.c:184 utils/mmgr/generation.c:216 +#: utils/mmgr/slab.c:371 #, c-format -msgid "SET %s takes only one argument" -msgstr "SET %s принимает только один аргумент" +msgid "Failed while creating memory context \"%s\"." +msgstr "Ошибка при Ñоздании контекÑта памÑти \"%s\"." -#: utils/misc/guc.c:8886 +#: utils/mmgr/dsa.c:523 utils/mmgr/dsa.c:1364 #, c-format -msgid "permission denied to perform ALTER SYSTEM RESET ALL" -msgstr "нет прав Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ALTER SYSTEM RESET ALL" +msgid "could not attach to dynamic shared area" +msgstr "не удалоÑÑŒ подключитьÑÑ Ðº динамичеÑкой разделÑемой облаÑти" -#: utils/misc/guc.c:8953 +#: utils/mmgr/mcxt.c:1155 #, c-format -msgid "parameter value for ALTER SYSTEM must not contain a newline" -msgstr "значение параметра Ð´Ð»Ñ ALTER SYSTEM не должно быть многоÑтрочным" +msgid "Failed on request of size %zu in memory context \"%s\"." +msgstr "Ошибка при запроÑе блока размером %zu в контекÑте памÑти \"%s\"." -#: utils/misc/guc.c:8998 +#: utils/mmgr/mcxt.c:1299 #, c-format -msgid "could not parse contents of file \"%s\"" -msgstr "не удалоÑÑŒ разобрать Ñодержимое файла \"%s\"" +msgid "logging memory contexts of PID %d" +msgstr "вывод информации о памÑти процеÑÑа Ñ PID %d" -#: utils/misc/guc.c:9172 +#: utils/mmgr/portalmem.c:187 #, c-format -msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" -msgstr "SET LOCAL TRANSACTION SNAPSHOT не реализовано" +msgid "cursor \"%s\" already exists" +msgstr "курÑор \"%s\" уже ÑущеÑтвует" -#: utils/misc/guc.c:9259 +#: utils/mmgr/portalmem.c:191 #, c-format -msgid "SET requires parameter name" -msgstr "SET требует Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°" +msgid "closing existing cursor \"%s\"" +msgstr "ÑущеÑтвующий курÑор (\"%s\") закрываетÑÑ" -#: utils/misc/guc.c:9392 +#: utils/mmgr/portalmem.c:401 #, c-format -msgid "attempt to redefine parameter \"%s\"" -msgstr "попытка переопределить параметр \"%s\"" +msgid "portal \"%s\" cannot be run" +msgstr "портал \"%s\" не может быть запущен" -#: utils/misc/guc.c:9719 +#: utils/mmgr/portalmem.c:479 #, c-format -msgid "invalid configuration parameter name \"%s\", removing it" -msgstr "неверное Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° конфигурации: \"%s\", он удалÑетÑÑ" +msgid "cannot drop pinned portal \"%s\"" +msgstr "удалить закреплённый портал \"%s\" нельзÑ" -#: utils/misc/guc.c:9721 +#: utils/mmgr/portalmem.c:487 #, c-format -msgid "\"%s\" is now a reserved prefix." -msgstr "Теперь \"%s\" — зарезервированный префикÑ." +msgid "cannot drop active portal \"%s\"" +msgstr "удалить активный портал \"%s\" нельзÑ" -#: utils/misc/guc.c:11235 +#: utils/mmgr/portalmem.c:738 #, c-format -msgid "while setting parameter \"%s\" to \"%s\"" -msgstr "при назначении параметру \"%s\" Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"%s\"" +msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" +msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ PREPARE Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸, Ñоздавшей курÑор WITH HOLD" -#: utils/misc/guc.c:11404 +#: utils/mmgr/portalmem.c:1232 #, c-format -msgid "parameter \"%s\" could not be set" -msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÑтановить" +msgid "" +"cannot perform transaction commands inside a cursor loop that is not read-" +"only" +msgstr "" +"транзакционные команды Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñть внутри цикла Ñ ÐºÑƒÑ€Ñором, " +"производÑщим изменениÑ" -#: utils/misc/guc.c:11496 +#: utils/sort/logtape.c:266 utils/sort/logtape.c:287 #, c-format -msgid "could not parse setting for parameter \"%s\"" -msgstr "не удалоÑÑŒ разобрать значение параметра \"%s\"" +msgid "could not seek to block %lld of temporary file" +msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ðº блоку %lld временного файла" -#: utils/misc/guc.c:11927 +#: utils/sort/sharedtuplestore.c:466 #, c-format -msgid "invalid value for parameter \"%s\": %g" -msgstr "неверное значение параметра \"%s\": %g" +msgid "unexpected chunk in shared tuplestore temporary file" +msgstr "неожиданный фрагмент в файле общего временного хранилища кортежей" -#: utils/misc/guc.c:12240 +#: utils/sort/sharedtuplestore.c:548 #, c-format -msgid "" -"\"temp_buffers\" cannot be changed after any temporary tables have been " -"accessed in the session." +msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "" -"параметр \"temp_buffers\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ поÑле Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº временным " -"таблицам в текущем ÑеанÑе." +"не удалоÑÑŒ перемеÑтитьÑÑ Ðº блоку %u в файле общего временного хранилища " +"кортежей" -#: utils/misc/guc.c:12252 +#: utils/sort/tuplesort.c:2372 #, c-format -msgid "Bonjour is not supported by this build" -msgstr "Bonjour не поддерживаетÑÑ Ð² данной Ñборке" +msgid "cannot have more than %d runs for an external sort" +msgstr "чиÑло потоков данных Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ¹ Ñортировки не может превышать %d" -#: utils/misc/guc.c:12265 +#: utils/sort/tuplesortvariants.c:1552 #, c-format -msgid "SSL is not supported by this build" -msgstr "SSL не поддерживаетÑÑ Ð² данной Ñборке" +msgid "could not create unique index \"%s\"" +msgstr "Ñоздать уникальный Ð¸Ð½Ð´ÐµÐºÑ \"%s\" не удалоÑÑŒ" -#: utils/misc/guc.c:12277 +#: utils/sort/tuplesortvariants.c:1554 #, c-format -msgid "Cannot enable parameter when \"log_statement_stats\" is true." -msgstr "" -"Этот параметр Ð½ÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ, когда \"log_statement_stats\" равен true." +msgid "Key %s is duplicated." +msgstr "Ключ %s дублируетÑÑ." -#: utils/misc/guc.c:12289 +#: utils/sort/tuplesortvariants.c:1555 #, c-format -msgid "" -"Cannot enable \"log_statement_stats\" when \"log_parser_stats\", " -"\"log_planner_stats\", or \"log_executor_stats\" is true." -msgstr "" -"Параметр \"log_statement_stats\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ, когда " -"\"log_parser_stats\", \"log_planner_stats\" или \"log_executor_stats\" равны " -"true." +msgid "Duplicate keys exist." +msgstr "Данные Ñодержат дублирующиеÑÑ ÐºÐ»ÑŽÑ‡Ð¸." -#: utils/misc/guc.c:12519 +#: utils/sort/tuplestore.c:518 utils/sort/tuplestore.c:528 +#: utils/sort/tuplestore.c:869 utils/sort/tuplestore.c:973 +#: utils/sort/tuplestore.c:1037 utils/sort/tuplestore.c:1054 +#: utils/sort/tuplestore.c:1256 utils/sort/tuplestore.c:1321 +#: utils/sort/tuplestore.c:1330 #, c-format -msgid "" -"effective_io_concurrency must be set to 0 on platforms that lack " -"posix_fadvise()." -msgstr "" -"Значение effective_io_concurrency должно равнÑтьÑÑ 0 на платформах, где " -"отÑутÑтвует lack posix_fadvise()." +msgid "could not seek in tuplestore temporary file" +msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ð²Ð¾ временном файле хранилища кортежей" -#: utils/misc/guc.c:12532 -#, c-format -msgid "" -"maintenance_io_concurrency must be set to 0 on platforms that lack " -"posix_fadvise()." -msgstr "" -"Значение maintenance_io_concurrency должно равнÑтьÑÑ 0 на платформах, где " -"отÑутÑтвует lack posix_fadvise()." - -#: utils/misc/guc.c:12546 -#, c-format -msgid "huge_page_size must be 0 on this platform." -msgstr "Значение huge_page_size должно равнÑтьÑÑ 0 на Ñтой платформе." - -#: utils/misc/guc.c:12558 -#, c-format -msgid "client_connection_check_interval must be set to 0 on this platform." -msgstr "" -"Значение client_connection_check_interval должно равнÑтьÑÑ 0 на Ñтой " -"платформе." - -#: utils/misc/guc.c:12670 -#, c-format -msgid "invalid character" -msgstr "неверный Ñимвол" - -#: utils/misc/guc.c:12730 -#, c-format -msgid "recovery_target_timeline is not a valid number." -msgstr "recovery_target_timeline не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимым чиÑлом." - -#: utils/misc/guc.c:12770 -#, c-format -msgid "multiple recovery targets specified" -msgstr "указано неÑколько целей воÑÑтановлениÑ" - -#: utils/misc/guc.c:12771 -#, c-format -msgid "" -"At most one of recovery_target, recovery_target_lsn, recovery_target_name, " -"recovery_target_time, recovery_target_xid may be set." -msgstr "" -"Может быть указана только одна из целей: recovery_target, " -"recovery_target_lsn, recovery_target_name, recovery_target_time, " -"recovery_target_xid." - -#: utils/misc/guc.c:12779 -#, c-format -msgid "The only allowed value is \"immediate\"." -msgstr "ЕдинÑтвенное допуÑтимое значение: \"immediate\"." - -#: utils/misc/help_config.c:130 -#, c-format -msgid "internal error: unrecognized run-time parameter type\n" -msgstr "внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: нераÑпознанный тип параметра времени выполнениÑ\n" - -#: utils/misc/pg_controldata.c:60 utils/misc/pg_controldata.c:138 -#: utils/misc/pg_controldata.c:241 utils/misc/pg_controldata.c:306 -#, c-format -msgid "calculated CRC checksum does not match value stored in file" -msgstr "" -"вычиÑÐ»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма (CRC) не ÑоответÑтвует значению, Ñохранённому " -"в файле" - -# well-spelled: пользов -#: utils/misc/pg_rusage.c:64 -#, c-format -msgid "CPU: user: %d.%02d s, system: %d.%02d s, elapsed: %d.%02d s" -msgstr "CPU: пользов.: %d.%02d Ñ, ÑиÑтема: %d.%02d Ñ, прошло: %d.%02d Ñ" - -#: utils/misc/rls.c:127 -#, c-format -msgid "query would be affected by row-level security policy for table \"%s\"" -msgstr "" -"Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð±ÑƒÐ´ÐµÑ‚ ограничен политикой безопаÑноÑти на уровне Ñтрок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ " -"\"%s\"" - -#: utils/misc/rls.c:129 -#, c-format -msgid "" -"To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW " -"LEVEL SECURITY." -msgstr "" -"Чтобы отключить политику Ð´Ð»Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†Ð° таблицы, воÑпользуйтеÑÑŒ командой " -"ALTER TABLE NO FORCE ROW LEVEL SECURITY." - -#: utils/misc/timeout.c:524 -#, c-format -msgid "cannot add more timeout reasons" -msgstr "добавить другие причины тайм-аута нельзÑ" - -#: utils/misc/tzparser.c:60 -#, c-format -msgid "" -"time zone abbreviation \"%s\" is too long (maximum %d characters) in time " -"zone file \"%s\", line %d" -msgstr "" -"краткое обозначение чаÑового поÑÑа \"%s\" должно Ñодержать меньше Ñимволов " -"(макÑимум %d) (файл чаÑовых поÑÑов \"%s\", Ñтрока %d)" - -#: utils/misc/tzparser.c:72 -#, c-format -msgid "time zone offset %d is out of range in time zone file \"%s\", line %d" -msgstr "" -"Ñмещение чаÑового поÑÑа %d выходит за рамки (файл чаÑовых поÑÑов \"%s\", " -"Ñтрока %d)" - -#: utils/misc/tzparser.c:111 -#, c-format -msgid "missing time zone abbreviation in time zone file \"%s\", line %d" -msgstr "" -"отÑутÑтвует краткое обозначение чаÑового поÑÑа (файл чаÑовых поÑÑов \"%s\", " -"Ñтрока %d)" - -#: utils/misc/tzparser.c:120 -#, c-format -msgid "missing time zone offset in time zone file \"%s\", line %d" -msgstr "" -"отÑутÑтвует Ñмещение чаÑового поÑÑа (файл чаÑовых поÑÑов \"%s\", Ñтрока %d)" - -#: utils/misc/tzparser.c:132 -#, c-format -msgid "invalid number for time zone offset in time zone file \"%s\", line %d" -msgstr "" -"Ñмещение чаÑового поÑÑа должно быть чиÑлом (файл чаÑовых поÑÑов \"%s\", " -"Ñтрока %d)" - -#: utils/misc/tzparser.c:168 -#, c-format -msgid "invalid syntax in time zone file \"%s\", line %d" -msgstr "ошибка ÑинтакÑиÑа в файле чаÑовых поÑÑов \"%s\", Ñтроке %d" - -#: utils/misc/tzparser.c:236 -#, c-format -msgid "time zone abbreviation \"%s\" is multiply defined" -msgstr "краткое обозначение чаÑового поÑÑа \"%s\" определено неоднократно" - -#: utils/misc/tzparser.c:238 -#, c-format -msgid "" -"Entry in time zone file \"%s\", line %d, conflicts with entry in file " -"\"%s\", line %d." -msgstr "" -"ЗапиÑÑŒ в файле чаÑовых поÑÑов \"%s\", Ñтроке %d, противоречит запиÑи в файле " -"\"%s\", Ñтроке %d." - -#: utils/misc/tzparser.c:300 -#, c-format -msgid "invalid time zone file name \"%s\"" -msgstr "неправильное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° чаÑовых поÑÑов: \"%s\"" - -#: utils/misc/tzparser.c:313 -#, c-format -msgid "time zone file recursion limit exceeded in file \"%s\"" -msgstr "предел вложенноÑти файлов чаÑовых поÑÑов превышен в файле \"%s\"" - -#: utils/misc/tzparser.c:352 utils/misc/tzparser.c:365 -#, c-format -msgid "could not read time zone file \"%s\": %m" -msgstr "прочитать файл чаÑовых поÑÑов \"%s\" не удалоÑÑŒ: %m" - -#: utils/misc/tzparser.c:376 -#, c-format -msgid "line is too long in time zone file \"%s\", line %d" -msgstr "Ñлишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ Ñтрока в файле чаÑовых поÑÑов \"%s\" (Ñтрока %d)" - -#: utils/misc/tzparser.c:400 -#, c-format -msgid "@INCLUDE without file name in time zone file \"%s\", line %d" -msgstr "" -"в @INCLUDE не указано Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° (файл чаÑовых поÑÑов \"%s\", Ñтрока %d)" - -#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:239 -#, c-format -msgid "Failed while creating memory context \"%s\"." -msgstr "Ошибка при Ñоздании контекÑта памÑти \"%s\"." - -#: utils/mmgr/dsa.c:519 utils/mmgr/dsa.c:1329 -#, c-format -msgid "could not attach to dynamic shared area" -msgstr "не удалоÑÑŒ подключитьÑÑ Ðº динамичеÑкой разделÑемой облаÑти" - -#: utils/mmgr/mcxt.c:889 utils/mmgr/mcxt.c:925 utils/mmgr/mcxt.c:963 -#: utils/mmgr/mcxt.c:1001 utils/mmgr/mcxt.c:1089 utils/mmgr/mcxt.c:1120 -#: utils/mmgr/mcxt.c:1156 utils/mmgr/mcxt.c:1208 utils/mmgr/mcxt.c:1243 -#: utils/mmgr/mcxt.c:1278 -#, c-format -msgid "Failed on request of size %zu in memory context \"%s\"." -msgstr "Ошибка при запроÑе блока размером %zu в контекÑте памÑти \"%s\"." - -#: utils/mmgr/mcxt.c:1052 -#, c-format -msgid "logging memory contexts of PID %d" -msgstr "вывод информации о памÑти процеÑÑа Ñ PID %d" - -#: utils/mmgr/portalmem.c:188 -#, c-format -msgid "cursor \"%s\" already exists" -msgstr "курÑор \"%s\" уже ÑущеÑтвует" - -#: utils/mmgr/portalmem.c:192 -#, c-format -msgid "closing existing cursor \"%s\"" -msgstr "ÑущеÑтвующий курÑор (\"%s\") закрываетÑÑ" - -#: utils/mmgr/portalmem.c:402 -#, c-format -msgid "portal \"%s\" cannot be run" -msgstr "портал \"%s\" не может быть запущен" - -#: utils/mmgr/portalmem.c:480 -#, c-format -msgid "cannot drop pinned portal \"%s\"" -msgstr "удалить закреплённый портал \"%s\" нельзÑ" - -#: utils/mmgr/portalmem.c:488 -#, c-format -msgid "cannot drop active portal \"%s\"" -msgstr "удалить активный портал \"%s\" нельзÑ" - -#: utils/mmgr/portalmem.c:739 -#, c-format -msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" -msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ PREPARE Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸, Ñоздавшей курÑор WITH HOLD" - -#: utils/mmgr/portalmem.c:1232 -#, c-format -msgid "" -"cannot perform transaction commands inside a cursor loop that is not read-" -"only" -msgstr "" -"транзакционные команды Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ñть внутри цикла Ñ ÐºÑƒÑ€Ñором, " -"производÑщим изменениÑ" - -#: utils/sort/logtape.c:266 utils/sort/logtape.c:289 -#, c-format -msgid "could not seek to block %ld of temporary file" -msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ðº блоку %ld временного файла" - -#: utils/sort/logtape.c:295 -#, c-format -msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" -msgstr "" -"не удалоÑÑŒ прочитать блок %ld временного файла (прочитано байт: %zu из %zu)" - -#: utils/sort/sharedtuplestore.c:432 utils/sort/sharedtuplestore.c:441 -#: utils/sort/sharedtuplestore.c:464 utils/sort/sharedtuplestore.c:481 -#: utils/sort/sharedtuplestore.c:498 -#, c-format -msgid "could not read from shared tuplestore temporary file" -msgstr "не удалоÑÑŒ прочитать файл общего временного хранилища кортежей" - -#: utils/sort/sharedtuplestore.c:487 -#, c-format -msgid "unexpected chunk in shared tuplestore temporary file" -msgstr "неожиданный фрагмент в файле общего временного хранилища кортежей" - -#: utils/sort/sharedtuplestore.c:572 -#, c-format -msgid "could not seek to block %u in shared tuplestore temporary file" -msgstr "" -"не удалоÑÑŒ перемеÑтитьÑÑ Ðº блоку %u в файле общего временного хранилища " -"кортежей" - -#: utils/sort/sharedtuplestore.c:579 -#, c-format -msgid "" -"could not read from shared tuplestore temporary file: read only %zu of %zu " -"bytes" -msgstr "" -"не удалоÑÑŒ прочитать файл общего временного хранилища кортежей (прочитано " -"байт: %zu из %zu)" - -#: utils/sort/tuplesort.c:3322 -#, c-format -msgid "cannot have more than %d runs for an external sort" -msgstr "чиÑло потоков данных Ð´Ð»Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ¹ Ñортировки не может превышать %d" - -#: utils/sort/tuplesort.c:4425 -#, c-format -msgid "could not create unique index \"%s\"" -msgstr "Ñоздать уникальный Ð¸Ð½Ð´ÐµÐºÑ \"%s\" не удалоÑÑŒ" - -#: utils/sort/tuplesort.c:4427 -#, c-format -msgid "Key %s is duplicated." -msgstr "Ключ %s дублируетÑÑ." - -#: utils/sort/tuplesort.c:4428 -#, c-format -msgid "Duplicate keys exist." -msgstr "Данные Ñодержат дублирующиеÑÑ ÐºÐ»ÑŽÑ‡Ð¸." - -#: utils/sort/tuplestore.c:518 utils/sort/tuplestore.c:528 -#: utils/sort/tuplestore.c:869 utils/sort/tuplestore.c:973 -#: utils/sort/tuplestore.c:1037 utils/sort/tuplestore.c:1054 -#: utils/sort/tuplestore.c:1256 utils/sort/tuplestore.c:1321 -#: utils/sort/tuplestore.c:1330 -#, c-format -msgid "could not seek in tuplestore temporary file" -msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ð²Ð¾ временном файле хранилища кортежей" - -#: utils/sort/tuplestore.c:1477 utils/sort/tuplestore.c:1540 -#: utils/sort/tuplestore.c:1548 -#, c-format -msgid "" -"could not read from tuplestore temporary file: read only %zu of %zu bytes" -msgstr "" -"не удалоÑÑŒ прочитать временный файл хранилища кортежей (прочитано байт: %zu " -"из %zu)" - -#: utils/time/snapmgr.c:570 +#: utils/time/snapmgr.c:536 #, c-format msgid "The source transaction is not running anymore." msgstr "ИÑÑ…Ð¾Ð´Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ ÑƒÐ¶Ðµ не выполнÑетÑÑ." -#: utils/time/snapmgr.c:1164 +#: utils/time/snapmgr.c:1136 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "ÑкÑпортировать Ñнимок из вложенной транзакции нельзÑ" -#: utils/time/snapmgr.c:1323 utils/time/snapmgr.c:1328 -#: utils/time/snapmgr.c:1333 utils/time/snapmgr.c:1348 -#: utils/time/snapmgr.c:1353 utils/time/snapmgr.c:1358 -#: utils/time/snapmgr.c:1373 utils/time/snapmgr.c:1378 -#: utils/time/snapmgr.c:1383 utils/time/snapmgr.c:1485 -#: utils/time/snapmgr.c:1501 utils/time/snapmgr.c:1526 +#: utils/time/snapmgr.c:1296 utils/time/snapmgr.c:1301 +#: utils/time/snapmgr.c:1306 utils/time/snapmgr.c:1321 +#: utils/time/snapmgr.c:1326 utils/time/snapmgr.c:1331 +#: utils/time/snapmgr.c:1346 utils/time/snapmgr.c:1351 +#: utils/time/snapmgr.c:1356 utils/time/snapmgr.c:1470 +#: utils/time/snapmgr.c:1486 utils/time/snapmgr.c:1511 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "неверные данные Ñнимка в файле \"%s\"" -#: utils/time/snapmgr.c:1420 +#: utils/time/snapmgr.c:1393 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "команда SET TRANSACTION SNAPSHOT должна выполнÑтьÑÑ Ð´Ð¾ запроÑов" -#: utils/time/snapmgr.c:1429 +#: utils/time/snapmgr.c:1402 #, c-format msgid "" "a snapshot-importing transaction must have isolation level SERIALIZABLE or " @@ -32435,12 +34732,17 @@ msgstr "" "транзакциÑ, Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€ÑƒÑŽÑ‰Ð°Ñ Ñнимок, должна иметь уровень изолÑции SERIALIZABLE " "или REPEATABLE READ" -#: utils/time/snapmgr.c:1438 utils/time/snapmgr.c:1447 +#: utils/time/snapmgr.c:1411 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "неверный идентификатор Ñнимка: \"%s\"" -#: utils/time/snapmgr.c:1539 +#: utils/time/snapmgr.c:1426 +#, c-format +msgid "snapshot \"%s\" does not exist" +msgstr "Ñнимок \"%s\" не ÑущеÑтвует" + +#: utils/time/snapmgr.c:1524 #, c-format msgid "" "a serializable transaction cannot import a snapshot from a non-serializable " @@ -32448,7 +34750,7 @@ msgid "" msgstr "" "ÑÐµÑ€Ð¸Ð°Ð»Ð¸Ð·ÑƒÐµÐ¼Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð½Ðµ может импортировать Ñнимок из не Ñериализуемой" -#: utils/time/snapmgr.c:1543 +#: utils/time/snapmgr.c:1528 #, c-format msgid "" "a non-read-only serializable transaction cannot import a snapshot from a " @@ -32457,304 +34759,294 @@ msgstr "" "ÑÐµÑ€Ð¸Ð°Ð»Ð¸Ð·ÑƒÐµÐ¼Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð² режиме \"чтение-запиÑÑŒ\" не может импортировать " "Ñнимок из транзакции в режиме \"только чтение\"" -#: utils/time/snapmgr.c:1558 +#: utils/time/snapmgr.c:1543 #, c-format msgid "cannot import a snapshot from a different database" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ Ñнимок из другой базы данных" -#: gram.y:1146 +#: gram.y:1231 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "вариант UNENCRYPTED PASSWORD более не поддерживаетÑÑ" -#: gram.y:1147 +#: gram.y:1232 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "" "Удалите Ñлово UNENCRYPTED, чтобы Ñохранить пароль в зашифрованном виде." -#: gram.y:1209 -#, c-format -msgid "unrecognized role option \"%s\"" -msgstr "нераÑпознанный параметр роли \"%s\"" - -#: gram.y:1474 gram.y:1490 +#: gram.y:1559 gram.y:1575 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTS не может включать Ñлементы Ñхемы" -#: gram.y:1647 +#: gram.y:1727 #, c-format msgid "current database cannot be changed" msgstr "Ñменить текущую базу данных нельзÑ" -#: gram.y:1780 +#: gram.y:1860 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "" "интервал, задающий чаÑовой поÑÑ, должен иметь точноÑть HOUR или HOUR TO " "MINUTE" -#: gram.y:2397 +#: gram.y:2487 #, c-format msgid "column number must be in range from 1 to %d" msgstr "номер Ñтолбца должен быть в диапазоне от 1 до %d" -#: gram.y:2999 +#: gram.y:3083 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "параметр поÑледовательноÑти \"%s\" здеÑÑŒ не поддерживаетÑÑ" -#: gram.y:3028 +#: gram.y:3122 #, c-format msgid "modulus for hash partition provided more than once" msgstr "модуль Ð´Ð»Ñ Ñ…ÐµÑˆ-Ñекции указан неоднократно" -#: gram.y:3037 +#: gram.y:3131 #, c-format msgid "remainder for hash partition provided more than once" msgstr "оÑтаток Ð´Ð»Ñ Ñ…ÐµÑˆ-Ñекции указан неоднократно" -#: gram.y:3044 +#: gram.y:3138 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "нераÑпознанное указание Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ…ÐµÑˆ-Ñекции \"%s\"" -#: gram.y:3052 +#: gram.y:3146 #, c-format msgid "modulus for hash partition must be specified" msgstr "необходимо указать модуль Ð´Ð»Ñ Ñ…ÐµÑˆ-Ñекции" -#: gram.y:3056 +#: gram.y:3150 #, c-format msgid "remainder for hash partition must be specified" msgstr "необходимо указать оÑтаток Ð´Ð»Ñ Ñ…ÐµÑˆ-Ñекции" -#: gram.y:3264 gram.y:3298 +#: gram.y:3358 gram.y:3392 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ STDIN/STDOUT неÑовмеÑтимы Ñ PROGRAM" -#: gram.y:3270 +#: gram.y:3364 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "предложение WHERE не допуÑкаетÑÑ Ñ COPY TO" -#: gram.y:3609 gram.y:3616 gram.y:12759 gram.y:12767 +#: gram.y:3712 gram.y:3719 gram.y:13023 gram.y:13031 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "указание GLOBAL при Ñоздании временных таблиц уÑтарело" -#: gram.y:3881 +#: gram.y:3995 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€ÑƒÐµÐ¼Ð¾Ð³Ð¾ Ñтолбца должно указыватьÑÑ GENERATED ALWAYS" -#: gram.y:4264 +#: gram.y:4432 #, c-format msgid "a column list with %s is only supported for ON DELETE actions" msgstr "ÑпиÑок Ñтолбцов Ñ %s поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð´ÐµÐ¹Ñтвий ON DELETE" -#: gram.y:4974 +#: gram.y:5151 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM более не поддерживаетÑÑ" -#: gram.y:5672 +#: gram.y:5849 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "нераÑпознанный вариант политики безопаÑноÑти Ñтрок \"%s\"" -#: gram.y:5673 +#: gram.y:5850 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "" "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÑŽÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ политики PERMISSIVE и RESTRICTIVE." -#: gram.y:5758 +#: gram.y:5935 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER не поддерживаетÑÑ" -#: gram.y:5795 +#: gram.y:5972 msgid "duplicate trigger events specified" msgstr "ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° повторÑÑŽÑ‚ÑÑ" -#: gram.y:5944 +#: gram.y:6121 #, c-format msgid "conflicting constraint properties" msgstr "противоречащие характериÑтики ограничениÑ" -#: gram.y:6043 +#: gram.y:6220 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "оператор CREATE ASSERTION ещё не реализован" -#: gram.y:6451 +#: gram.y:6537 +#, c-format +msgid "dropping an enum value is not implemented" +msgstr "удаление Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð· перечиÑÐ»ÐµÐ½Ð¸Ñ Ð½Ðµ поддерживаетÑÑ" + +#: gram.y:6655 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK более не требуетÑÑ" -#: gram.y:6452 +#: gram.y:6656 #, c-format msgid "Update your data type." msgstr "Обновите тип данных." -#: gram.y:8308 +#: gram.y:8529 #, c-format msgid "aggregates cannot have output arguments" msgstr "у агрегатных функций не может быть выходных аргументов" -#: gram.y:10993 gram.y:11012 +#: gram.y:11221 gram.y:11240 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "" "предложение WITH CHECK OPTION не поддерживаетÑÑ Ð´Ð»Ñ Ñ€ÐµÐºÑƒÑ€Ñивных предÑтавлений" -#: gram.y:12898 +#: gram.y:13162 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "ÑинтакÑÐ¸Ñ LIMIT #,# не поддерживаетÑÑ" -#: gram.y:12899 +#: gram.y:13163 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "ИÑпользуйте отдельные Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ LIMIT и OFFSET." -#: gram.y:13252 gram.y:13278 -#, c-format -msgid "VALUES in FROM must have an alias" -msgstr "ÑпиÑок VALUES во FROM должен иметь пÑевдоним" - -#: gram.y:13253 gram.y:13279 -#, c-format -msgid "For example, FROM (VALUES ...) [AS] foo." -msgstr "Ðапример, FROM (VALUES ...) [AS] foo." - -#: gram.y:13258 gram.y:13284 -#, c-format -msgid "subquery in FROM must have an alias" -msgstr "Ð¿Ð¾Ð´Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾ FROM должен иметь пÑевдоним" - -#: gram.y:13259 gram.y:13285 -#, c-format -msgid "For example, FROM (SELECT ...) [AS] foo." -msgstr "Ðапример, FROM (SELECT ...) [AS] foo." - -#: gram.y:13803 +#: gram.y:14038 #, c-format msgid "only one DEFAULT value is allowed" msgstr "допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ одно значение DEFAULT" -#: gram.y:13812 +#: gram.y:14047 #, c-format msgid "only one PATH value per column is allowed" msgstr "Ð´Ð»Ñ Ñтолбца допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ одно значение PATH" -#: gram.y:13821 +#: gram.y:14056 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "" "конфликтующие или избыточные объÑÐ²Ð»ÐµÐ½Ð¸Ñ NULL/NOT NULL Ð´Ð»Ñ Ñтолбца \"%s\"" -#: gram.y:13830 +#: gram.y:14065 #, c-format msgid "unrecognized column option \"%s\"" msgstr "нераÑпознанный параметр Ñтолбца \"%s\"" -#: gram.y:14084 +#: gram.y:14147 +#, c-format +msgid "only string constants are supported in JSON_TABLE path specification" +msgstr "в указании пути JSON_TABLE поддерживаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñтроковые конÑтанты" + +#: gram.y:14469 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "тип float должен иметь точноÑть минимум 1 бит" -#: gram.y:14093 +#: gram.y:14478 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "тип float должен иметь точноÑть меньше 54 бит" -#: gram.y:14596 +#: gram.y:14995 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "неверное чиÑло параметров в левой чаÑти Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ OVERLAPS" -#: gram.y:14601 +#: gram.y:15000 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "неверное чиÑло параметров в правой чаÑти Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ OVERLAPS" -#: gram.y:14778 +#: gram.y:15177 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "предикат UNIQUE ещё не реализован" -#: gram.y:15156 +#: gram.y:15591 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "ORDER BY Ñ WITHIN GROUP можно указать только один раз" -#: gram.y:15161 +#: gram.y:15596 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñ WITHIN GROUP" -#: gram.y:15166 +#: gram.y:15601 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñ WITHIN GROUP" -#: gram.y:15703 gram.y:15727 +#: gram.y:16328 gram.y:16352 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "началом рамки не может быть UNBOUNDED FOLLOWING" -#: gram.y:15708 +#: gram.y:16333 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "" "рамка, начинающаÑÑÑ Ñо Ñледующей Ñтроки, не может заканчиватьÑÑ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹" -#: gram.y:15732 +#: gram.y:16357 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "концом рамки не может быть UNBOUNDED PRECEDING" -#: gram.y:15738 +#: gram.y:16363 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "" "рамка, начинающаÑÑÑ Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ Ñтроки, не может иметь предшеÑтвующих Ñтрок" -#: gram.y:15745 +#: gram.y:16370 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "" "рамка, начинающаÑÑÑ Ñо Ñледующей Ñтроки, не может иметь предшеÑтвующих Ñтрок" -#: gram.y:16370 +#: gram.y:16919 +#, c-format +msgid "unrecognized JSON encoding: %s" +msgstr "нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° JSON: %s" + +#: gram.y:17243 #, c-format msgid "type modifier cannot have parameter name" msgstr "параметр функции-модификатора типа должен быть безымÑнным" -#: gram.y:16376 +#: gram.y:17249 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "модификатор типа не может включать ORDER BY" -#: gram.y:16444 gram.y:16451 gram.y:16458 +#: gram.y:17317 gram.y:17324 gram.y:17331 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать здеÑÑŒ как Ð¸Ð¼Ñ Ñ€Ð¾Ð»Ð¸" -#: gram.y:16548 gram.y:17983 +#: gram.y:17421 gram.y:18906 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIES Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ без Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ORDER BY" -#: gram.y:17662 gram.y:17849 +#: gram.y:18597 gram.y:18772 msgid "improper use of \"*\"" msgstr "недопуÑтимое иÑпользование \"*\"" -#: gram.y:17913 +#: gram.y:18836 #, c-format msgid "" "an ordered-set aggregate with a VARIADIC direct argument must have one " @@ -32763,340 +35055,1258 @@ msgstr "" "ÑÐ¾Ñ€Ñ‚Ð¸Ñ€ÑƒÑŽÑ‰Ð°Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ Ð½ÐµÐ¿Ð¾ÑредÑтвенным аргументом VARIADIC должна " "иметь один агрегатный аргумент VARIADIC того же типа данных" -#: gram.y:17950 +#: gram.y:18873 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "ORDER BY можно указать только один раз" -#: gram.y:17961 +#: gram.y:18884 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "OFFSET можно указать только один раз" -#: gram.y:17970 +#: gram.y:18893 +#, c-format +msgid "multiple LIMIT clauses not allowed" +msgstr "LIMIT можно указать только один раз" + +#: gram.y:18902 +#, c-format +msgid "multiple limit options not allowed" +msgstr "параметры LIMIT можно указать только один раз" + +#: gram.y:18929 +#, c-format +msgid "multiple WITH clauses not allowed" +msgstr "WITH можно указать только один раз" + +#: gram.y:19122 +#, c-format +msgid "OUT and INOUT arguments aren't allowed in TABLE functions" +msgstr "в табличных функциÑÑ… не может быть аргументов OUT и INOUT" + +#: gram.y:19255 +#, c-format +msgid "multiple COLLATE clauses not allowed" +msgstr "COLLATE можно указать только один раз" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:19293 gram.y:19306 +#, c-format +msgid "%s constraints cannot be marked DEFERRABLE" +msgstr "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ %s не могут иметь характериÑтики DEFERRABLE" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:19319 +#, c-format +msgid "%s constraints cannot be marked NOT VALID" +msgstr "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ %s не могут иметь характериÑтики NOT VALID" + +#. translator: %s is CHECK, UNIQUE, or similar +#: gram.y:19332 +#, c-format +msgid "%s constraints cannot be marked NO INHERIT" +msgstr "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ %s не могут иметь характериÑтики NO INHERIT" + +#: gram.y:19354 +#, c-format +msgid "unrecognized partitioning strategy \"%s\"" +msgstr "нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\"" + +#: gram.y:19378 +#, c-format +msgid "invalid publication object list" +msgstr "неверный ÑпиÑок объектов публикации" + +#: gram.y:19379 +#, c-format +msgid "" +"One of TABLE or TABLES IN SCHEMA must be specified before a standalone table " +"or schema name." +msgstr "" +"Перед именем отдельной таблицы или Ñхемы нужно указать TABLE либо TABLES IN " +"SCHEMA." + +#: gram.y:19395 +#, c-format +msgid "invalid table name" +msgstr "неверное Ð¸Ð¼Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹" + +#: gram.y:19416 +#, c-format +msgid "WHERE clause not allowed for schema" +msgstr "предложение WHERE не допуÑкаетÑÑ Ð´Ð»Ñ Ñхемы" + +#: gram.y:19423 +#, c-format +msgid "column specification not allowed for schema" +msgstr "указание Ñтолбца не допуÑкаетÑÑ Ð´Ð»Ñ Ñхемы" + +#: gram.y:19437 +#, c-format +msgid "invalid schema name" +msgstr "неверное Ð¸Ð¼Ñ Ñхемы" + +#: guc-file.l:192 +#, c-format +msgid "empty configuration file name: \"%s\"" +msgstr "пуÑтое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° конфигурации: \"%s\"" + +#: guc-file.l:209 +#, c-format +msgid "" +"could not open configuration file \"%s\": maximum nesting depth exceeded" +msgstr "" +"открыть файл конфигурации \"%s\" не удалоÑÑŒ: превышен предел вложенноÑти" + +#: guc-file.l:229 +#, c-format +msgid "configuration file recursion in \"%s\"" +msgstr "рекурÑÐ¸Ð²Ð½Ð°Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ñть файла конфигурации в \"%s\"" + +#: guc-file.l:245 +#, c-format +msgid "could not open configuration file \"%s\": %m" +msgstr "открыть файл конфигурации \"%s\" не удалоÑÑŒ: %m" + +#: guc-file.l:256 +#, c-format +msgid "skipping missing configuration file \"%s\"" +msgstr "отÑутÑтвующий файл конфигурации \"%s\" пропуÑкаетÑÑ" + +#: guc-file.l:511 +#, c-format +msgid "syntax error in file \"%s\" line %u, near end of line" +msgstr "ошибка ÑинтакÑиÑа в файле \"%s\", в конце Ñтроки %u" + +#: guc-file.l:521 +#, c-format +msgid "syntax error in file \"%s\" line %u, near token \"%s\"" +msgstr "ошибка ÑинтакÑиÑа в файле \"%s\", в Ñтроке %u, Ñ€Ñдом Ñ \"%s\"" + +#: guc-file.l:541 +#, c-format +msgid "too many syntax errors found, abandoning file \"%s\"" +msgstr "" +"обнаружено Ñлишком много ÑинтакÑичеÑких ошибок, обработка файла \"%s\" " +"прекращаетÑÑ" + +# skip-rule: space-after-comma, space-before-period +#: jsonpath_gram.y:267 +#, c-format +msgid ".decimal() can only have an optional precision[,scale]." +msgstr "Ðргументами .decimal() могут быть только точноÑть[,маÑштаб]." + +#: jsonpath_gram.y:599 +#, c-format +msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." +msgstr "ÐераÑпознанный Ñимвол флага \"%.*s\" в предикате LIKE_REGEX." + +#: jsonpath_gram.y:677 +#, c-format +msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" +msgstr "" +"флаг \"x\" Ñзыка XQuery (раÑширенные регулÑрные выражениÑ) не реализован" + +#: jsonpath_scan.l:174 +msgid "invalid Unicode escape sequence" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾ÑледовательноÑть Ñпецкодов Unicode" + +#: jsonpath_scan.l:180 +msgid "invalid hexadecimal character sequence" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾ÑледовательноÑть шеÑтнадцатеричных цифр" + +#: jsonpath_scan.l:195 +msgid "unexpected end after backslash" +msgstr "неожиданный конец Ñтроки поÑле обратной коÑой черты" + +#: jsonpath_scan.l:201 repl_scanner.l:211 scan.l:756 +msgid "unterminated quoted string" +msgstr "Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ Ñтрока в кавычках" + +#: jsonpath_scan.l:228 +msgid "unexpected end of comment" +msgstr "неожиданный конец комментариÑ" + +#: jsonpath_scan.l:319 +msgid "invalid numeric literal" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ‡Ð¸ÑÐ»Ð¾Ð²Ð°Ñ Ñтрока" + +#: jsonpath_scan.l:325 jsonpath_scan.l:331 jsonpath_scan.l:337 scan.l:1064 +#: scan.l:1068 scan.l:1072 scan.l:1076 +msgid "trailing junk after numeric literal" +msgstr "муÑорное Ñодержимое поÑле чиÑловой конÑтанты" + +#. translator: %s is typically "syntax error" +#: jsonpath_scan.l:375 +#, c-format +msgid "%s at end of jsonpath input" +msgstr "%s в конце аргумента jsonpath" + +#. translator: first %s is typically "syntax error" +#: jsonpath_scan.l:382 +#, c-format +msgid "%s at or near \"%s\" of jsonpath input" +msgstr "%s в Ñтроке jsonpath (примерное положение: \"%s\")" + +#: jsonpath_scan.l:568 +msgid "invalid input" +msgstr "некорректные входные данные" + +#: jsonpath_scan.l:594 +msgid "invalid hexadecimal digit" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑˆÐµÑÑ‚Ð½Ð°Ð´Ñ†Ð°Ñ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ Ñ†Ð¸Ñ„Ñ€Ð°" + +#: jsonpath_scan.l:625 +#, c-format +msgid "could not convert Unicode to server encoding" +msgstr "не удалоÑÑŒ преобразовать Ñимвол Unicode в Ñерверную кодировку" + +#: repl_gram.y:318 repl_gram.y:359 +#, c-format +msgid "invalid timeline %u" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u" + +#: repl_scanner.l:154 +msgid "invalid streaming start location" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° потока" + +#: scan.l:497 +msgid "unterminated /* comment" +msgstr "незавершённый комментарий /*" + +#: scan.l:517 +msgid "unterminated bit string literal" +msgstr "Ð¾Ð±Ð¾Ñ€Ð²Ð°Ð½Ð½Ð°Ñ Ð±Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтрока" + +#: scan.l:531 +msgid "unterminated hexadecimal string literal" +msgstr "Ð¾Ð±Ð¾Ñ€Ð²Ð°Ð½Ð½Ð°Ñ ÑˆÐµÑÑ‚Ð½Ð°Ð´Ñ†Ð°Ñ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ Ñтрока" + +#: scan.l:581 +#, c-format +msgid "unsafe use of string constant with Unicode escapes" +msgstr "небезопаÑное иÑпользование Ñтроковой конÑтанты Ñо Ñпецкодами Unicode" + +#: scan.l:582 +#, c-format +msgid "" +"String constants with Unicode escapes cannot be used when " +"\"standard_conforming_strings\" is off." +msgstr "" +"Строки Ñо Ñпецкодами Unicode Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать, когда параметр " +"\"standard_conforming_strings\" выключен." + +#: scan.l:643 +msgid "unhandled previous state in xqs" +msgstr "" +"необрабатываемое предыдущее ÑоÑтоÑние при обнаружении закрывающего апоÑтрофа" + +#: scan.l:717 +#, c-format +msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." +msgstr "Спецкоды Unicode должны иметь вид \\uXXXX или \\UXXXXXXXX." + +#: scan.l:728 +#, c-format +msgid "unsafe use of \\' in a string literal" +msgstr "небезопаÑное иÑпользование Ñимвола \\' в Ñтроке" + +#: scan.l:729 +#, c-format +msgid "" +"Use '' to write quotes in strings. \\' is insecure in client-only encodings." +msgstr "" +"ЗапиÑывайте апоÑтроф в Ñтроке в виде ''. ЗапиÑÑŒ \\' небезопаÑна Ð´Ð»Ñ " +"иÑключительно клиентÑких кодировок." + +#: scan.l:801 +msgid "unterminated dollar-quoted string" +msgstr "Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ Ñтрока Ñ $" + +#: scan.l:818 scan.l:828 +msgid "zero-length delimited identifier" +msgstr "пуÑтой идентификатор в кавычках" + +#: scan.l:839 syncrep_scanner.l:101 +msgid "unterminated quoted identifier" +msgstr "незавершённый идентификатор в кавычках" + +#: scan.l:1002 +msgid "operator too long" +msgstr "Ñлишком длинный оператор" + +#: scan.l:1015 +msgid "trailing junk after parameter" +msgstr "муÑорное Ñодержимое поÑле параметра" + +#: scan.l:1036 +msgid "invalid hexadecimal integer" +msgstr "неверное шеÑтнадцатеричное целое" + +#: scan.l:1040 +msgid "invalid octal integer" +msgstr "неверное воÑьмеричное целое" + +#: scan.l:1044 +msgid "invalid binary integer" +msgstr "неверное двоичное целое" + +#. translator: %s is typically the translation of "syntax error" +#: scan.l:1239 +#, c-format +msgid "%s at end of input" +msgstr "%s в конце" + +#. translator: first %s is typically the translation of "syntax error" +#: scan.l:1247 +#, c-format +msgid "%s at or near \"%s\"" +msgstr "%s (примерное положение: \"%s\")" + +#: scan.l:1439 +#, c-format +msgid "nonstandard use of \\' in a string literal" +msgstr "неÑтандартное применение \\' в Ñтроке" + +#: scan.l:1440 +#, c-format +msgid "" +"Use '' to write quotes in strings, or use the escape string syntax (E'...')." +msgstr "" +"ЗапиÑывайте апоÑтроф в Ñтроках в виде '' или иÑпользуйте ÑинтакÑÐ¸Ñ ÑпецÑтрок " +"(E'...')." + +#: scan.l:1449 +#, c-format +msgid "nonstandard use of \\\\ in a string literal" +msgstr "неÑтандартное применение \\\\ в Ñтроке" + +#: scan.l:1450 +#, c-format +msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." +msgstr "" +"ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи обратных ÑлÑшей ÑинтакÑÐ¸Ñ ÑпецÑтрок, например E'\\\\'." + +#: scan.l:1464 +#, c-format +msgid "nonstandard use of escape in a string literal" +msgstr "неÑтандартное иÑпользование ÑпецÑимвола в Ñтроке" + +#: scan.l:1465 +#, c-format +msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." +msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов ÑинтакÑÐ¸Ñ ÑпецÑтрок E'\\r\\n'." + +#, c-format +#~ msgid "cannot use RETURNING type %s in %s" +#~ msgstr "иÑпользовать в RETURNING тип %s в %s нельзÑ" + +#, c-format +#~ msgid "Please report this to <%s>." +#~ msgstr "ПожалуйÑта, напишите об Ñтой ошибке по адреÑу <%s>." + +#, c-format +#~ msgid "MinWords should be less than MaxWords" +#~ msgstr "Значение MinWords должно быть меньше MaxWords" + +#, c-format +#~ msgid "MinWords should be positive" +#~ msgstr "Значение MinWords должно быть положительным" + +#, c-format +#~ msgid "ShortWord should be >= 0" +#~ msgstr "Значение ShortWord должно быть >= 0" + +#, c-format +#~ msgid "MaxFragments should be >= 0" +#~ msgstr "Значение MaxFragments должно быть >= 0" + +#, c-format +#~ msgid "" +#~ "database is not accepting commands to avoid wraparound data loss in " +#~ "database \"%s\"" +#~ msgstr "" +#~ "база данных не принимает команды во избежание потери данных из-за " +#~ "Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¹ в базе данных \"%s\"" + +#, c-format +#~ msgid "" +#~ "Stop the postmaster and vacuum that database in single-user mode.\n" +#~ "You might also need to commit or roll back old prepared transactions, or " +#~ "drop stale replication slots." +#~ msgstr "" +#~ "ОÑтановите управлÑющий процеÑÑ (postmaster) и выполните очиÑтку (VACUUM) " +#~ "базы данных в монопольном режиме.\n" +#~ "Возможно, вам также придётÑÑ Ð·Ð°Ñ„Ð¸ÐºÑировать или откатить Ñтарые " +#~ "подготовленные транзакции и удалить неиÑпользуемые Ñлоты репликации." + +#, c-format +#~ msgid "" +#~ "database is not accepting commands to avoid wraparound data loss in " +#~ "database with OID %u" +#~ msgstr "" +#~ "база данных не принимает команды во избежание потери данных из-за " +#~ "Ð·Ð°Ñ†Ð¸ÐºÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¹ в базе данных Ñ OID %u" + +#, c-format +#~ msgid "cannot commit subtransactions during a parallel operation" +#~ msgstr "фикÑировать подтранзакции во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ñ… операций нельзÑ" + +#, c-format +#~ msgid "invalid segment number %d in file \"%s\"" +#~ msgstr "неверный номер Ñегмента %d в файле \"%s\"" + +#, c-format +#~ msgid "-X requires a power of two value between 1 MB and 1 GB" +#~ msgstr "" +#~ "Ð´Ð»Ñ -X требуетÑÑ Ñ‡Ð¸Ñло, равное Ñтепени двух, в интервале от 1 МБ до 1 ГБ" + +#, c-format +#~ msgid "invalid parameter name \"%s\"" +#~ msgstr "неверное Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\"" + +#, c-format +#~ msgid "MERGE not supported in COPY" +#~ msgstr "MERGE не поддерживаетÑÑ Ð² COPY" + +#, c-format +#~ msgid "cannot specify DELIMITER in BINARY mode" +#~ msgstr "в режиме BINARY Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ DELIMITER" + +#, c-format +#~ msgid "cannot specify DEFAULT in BINARY mode" +#~ msgstr "в режиме BINARY Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ DEFAULT" + +#, c-format +#~ msgid "cannot specify HEADER in BINARY mode" +#~ msgstr "в режиме BINARY Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать HEADER" + +#, c-format +#~ msgid "COPY quote available only in CSV mode" +#~ msgstr "определить кавычки Ð´Ð»Ñ COPY можно только в режиме CSV" + +#, c-format +#~ msgid "COPY escape available only in CSV mode" +#~ msgstr "определить ÑпецÑимвол Ð´Ð»Ñ COPY можно только в режиме CSV" + +#, c-format +#~ msgid "COPY force quote available only in CSV mode" +#~ msgstr "" +#~ "параметр force quote Ð´Ð»Ñ COPY можно иÑпользовать только в режиме CSV" + +#, c-format +#~ msgid "COPY force quote only available using COPY TO" +#~ msgstr "параметр force quote Ð´Ð»Ñ COPY можно иÑпользовать только Ñ COPY TO" + +#, c-format +#~ msgid "COPY force not null available only in CSV mode" +#~ msgstr "" +#~ "параметр force not null Ð´Ð»Ñ COPY можно иÑпользовать только в режиме CSV" + +#, c-format +#~ msgid "COPY force not null only available using COPY FROM" +#~ msgstr "" +#~ "параметр force not null Ð´Ð»Ñ COPY можно иÑпользовать только Ñ COPY FROM" + +#, c-format +#~ msgid "COPY force null available only in CSV mode" +#~ msgstr "параметр force null Ð´Ð»Ñ COPY можно иÑпользовать только в режиме CSV" + +#, c-format +#~ msgid "COPY force null only available using COPY FROM" +#~ msgstr "параметр force null Ð´Ð»Ñ COPY можно иÑпользовать только Ñ COPY FROM" + +#, c-format +#~ msgid "COPY DEFAULT only available using COPY FROM" +#~ msgstr "параметр DEFAULT Ð´Ð»Ñ COPY можно иÑпользовать только Ñ COPY FROM" + +#, c-format +#~ msgid "COPY delimiter must not appear in the DEFAULT specification" +#~ msgstr "" +#~ "разделитель Ð´Ð»Ñ COPY не должен приÑутÑтвовать в предÑтавлении DEFAULT" + +#, c-format +#~ msgid "CSV quote character must not appear in the DEFAULT specification" +#~ msgstr "" +#~ "Ñимвол кавычек в CSV не должен приÑутÑтвовать в предÑтавлении DEFAULT" + +#, c-format +#~ msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" +#~ msgstr "Ñтолбец FORCE_NOT_NULL \"%s\" не фигурирует в COPY" + +#, c-format +#~ msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" +#~ msgstr "Ñтолбец FORCE_QUOTE \"%s\" не фигурирует в COPY" + +#, c-format +#~ msgid "cannot create exclusion constraints on partitioned table \"%s\"" +#~ msgstr "" +#~ "Ñоздать ограничение-иÑключение в Ñекционированной таблице \"%s\" нельзÑ" + +#, c-format +#~ msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" +#~ msgstr "" +#~ "переÑтроить нерабочий Ð¸Ð½Ð´ÐµÐºÑ \"%s.%s\" неблокирующим ÑпоÑобом нельзÑ, он " +#~ "пропуÑкаетÑÑ" + +#, c-format +#~ msgid "" +#~ "specifying a table access method is not supported on a partitioned table" +#~ msgstr "" +#~ "указание табличного метода доÑтупа Ð´Ð»Ñ Ñекционированных таблиц не " +#~ "поддерживаютÑÑ" + +#, c-format +#~ msgid "cannot change access method of a partitioned table" +#~ msgstr "менÑть метод доÑтупа Ð´Ð»Ñ Ñекционированной таблицы нельзÑ" + +#, c-format +#~ msgid "" +#~ "MD5 authentication is not supported when \"db_user_namespace\" is enabled" +#~ msgstr "" +#~ "проверка подлинноÑти MD5 не поддерживаетÑÑ, когда включён режим " +#~ "\"db_user_namespace\"" + +#, c-format +#~ msgid "could not unbind after searching for user \"%s\" on server \"%s\"" +#~ msgstr "" +#~ "не удалоÑÑŒ отвÑзатьÑÑ Ð¿Ð¾Ñле поиÑка Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\" на Ñервере \"%s\"" + +#, c-format +#~ msgid "MERGE not supported in WITH query" +#~ msgstr "MERGE не поддерживаетÑÑ Ð² запроÑе WITH" + +#, c-format +#~ msgid "IS DISTINCT FROM requires = operator to yield boolean" +#~ msgstr "" +#~ "Ð´Ð»Ñ IS DISTINCT FROM требуетÑÑ, чтобы оператор = возвращал логичеÑкое " +#~ "значение" + +#, c-format +#~ msgid "could not fork autovacuum launcher process: %m" +#~ msgstr "породить процеÑÑ Ð·Ð°Ð¿ÑƒÑка автоочиÑтки не удалоÑÑŒ: %m" + +#, c-format +#~ msgid "could not fork autovacuum worker process: %m" +#~ msgstr "не удалоÑÑŒ породить рабочий процеÑÑ Ð°Ð²Ñ‚Ð¾Ð¾Ñ‡Ð¸Ñтки: %m" + +#, c-format +#~ msgid "" +#~ "Consider increasing the configuration parameter \"max_worker_processes\"." +#~ msgstr "Возможно, Ñтоит увеличить параметр \"max_worker_processes\"." + +#, c-format +#~ msgid "could not fork startup process: %m" +#~ msgstr "породить Ñтартовый процеÑÑ Ð½Ðµ удалоÑÑŒ: %m" + +#, c-format +#~ msgid "could not fork archiver process: %m" +#~ msgstr "породить процеÑÑ Ð°Ñ€Ñ…Ð¸Ð²Ð°Ñ‚Ð¾Ñ€Ð° не удалоÑÑŒ: %m" + +#, c-format +#~ msgid "could not fork checkpointer process: %m" +#~ msgstr "породить процеÑÑ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… точек не удалоÑÑŒ: %m" + +#, c-format +#~ msgid "could not fork WAL writer process: %m" +#~ msgstr "породить процеÑÑ Ð·Ð°Ð¿Ð¸Ñи WAL не удалоÑÑŒ: %m" + +#, c-format +#~ msgid "could not fork WAL receiver process: %m" +#~ msgstr "породить процеÑÑ ÑÑ‡Ð¸Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ WAL не удалоÑÑŒ: %m" + +#, c-format +#~ msgid "could not fork worker process: %m" +#~ msgstr "породить рабочий процеÑÑ Ð½Ðµ удалоÑÑŒ: %m" + +#, c-format +#~ msgid "could not remove file \"%s\": %s\n" +#~ msgstr "не удалоÑÑŒ Ñтереть файл \"%s\": %s\n" + +#, c-format +#~ msgid "publication_names parameter missing" +#~ msgstr "отÑутÑтвует параметр publication_names" + +#, c-format +#~ msgid "snapshot too old" +#~ msgstr "Ñнимок Ñлишком Ñтар" + +#, c-format +#~ msgid "must be superuser to rotate log files with adminpack 1.0" +#~ msgstr "" +#~ "прокручивать файлы протоколов, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ adminpack 1.0, может только " +#~ "Ñуперпользователь" + +#, c-format +#~ msgid "Consider using %s, which is part of core, instead." +#~ msgstr "" +#~ "РаÑÑмотрите возможноÑть иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ %s, включённой в Ñдро." + +#, c-format +#~ msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" +#~ msgstr "не удалоÑÑŒ запиÑать блок %u в файл \"%s\" (запиÑано байт: %d из %d)" + +#, c-format +#~ msgid "Unmatched \"%c\" character." +#~ msgstr "Ðепарный знак \"%c\"." + +#, c-format +#~ msgid "formatting field \"%s\" is only supported in to_char" +#~ msgstr "поле Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\" поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в функции to_char" + +#, c-format +#~ msgid "must be superuser to read files with adminpack 1.0" +#~ msgstr "" +#~ "читать файлы, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ adminpack 1.0, может только Ñуперпользователь" + +#, c-format +#~ msgid "" +#~ "string argument of jsonpath item method .%s() is not a valid " +#~ "representation of a double precision number" +#~ msgstr "" +#~ "Ñтроковый аргумент метода Ñлемента jsonpath .%s() не ÑвлÑетÑÑ " +#~ "предÑтавлением Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ double precision" + +#, c-format +#~ msgid "collation provider LIBC is not supported on this platform" +#~ msgstr "" +#~ "провайдер правил Ñортировки LIBC не поддерживаетÑÑ Ð½Ð° Ñтой платформе" + +#, c-format +#~ msgid "cannot subtract infinite timestamps" +#~ msgstr "вычитать беÑконечные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ timestamp нельзÑ" + +#~ msgid "Enables per-database user names." +#~ msgstr "Включает ÑвÑзывание имён пользователей Ñ Ð±Ð°Ð·Ð°Ð¼Ð¸ данных." + +#~ msgid "" +#~ "Time before a snapshot is too old to read pages changed after the " +#~ "snapshot was taken." +#~ msgstr "" +#~ "Срок, по иÑтечении которого Ñнимок ÑчитаетÑÑ Ñлишком Ñтарым Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ " +#~ "Ñтраниц, изменённых поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñнимка." + +#~ msgid "A value of -1 disables this feature." +#~ msgstr "Значение -1 отключает Ñто поведение." + +#~ msgid "Enables logging of recovery-related debugging information." +#~ msgstr "" +#~ "Включает протоколирование отладочной информации, ÑвÑзанной Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸ÐµÐ¹." + +#, c-format +#~ msgid "out of memory while trying to decode a record of length %u" +#~ msgstr "не удалоÑÑŒ выделить памÑть Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи длины %u" + +#, c-format +#~ msgid "record length %u at %X/%X too long" +#~ msgstr "длина запиÑи %u в позиции %X/%X Ñлишком велика" + +#, c-format +#~ msgid "parameter \"lc_collate\" must be specified" +#~ msgstr "необходимо указать параметр \"lc_collate\"" + +#, c-format +#~ msgid "parameter \"lc_ctype\" must be specified" +#~ msgstr "необходимо указать параметр \"lc_ctype\"" + +#, c-format +#~ msgid "Use ALTER DATABASE ... REFRESH COLLATION VERSION instead." +#~ msgstr "" +#~ "ВмеÑто Ñтого выполните ALTER DATABASE ... REFRESH COLLATION VERSION." + +#, c-format +#~ msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." +#~ msgstr "" +#~ "ВмеÑто Ñтого выполните ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." + +#, c-format +#~ msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." +#~ msgstr "" +#~ "ВмеÑто Ñтого выполните ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION." + +#, c-format +#~ msgid "Use ALTER TYPE instead." +#~ msgstr "ИÑпользуйте ALTER TYPE." + +#, c-format +#~ msgid "Use ALTER TABLE instead." +#~ msgstr "Изменить его можно Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ALTER TABLE." + +#~ msgid "Controls when to replicate or apply each change." +#~ msgstr "ОпределÑет, когда реплицировать или применÑть каждое изменение." + +#, c-format +#~ msgid "could not identify current directory: %m" +#~ msgstr "не удалоÑÑŒ определить текущий каталог: %m" + +#, c-format +#~ msgid "could not load library \"%s\": error code %lu" +#~ msgstr "не удалоÑÑŒ загрузить библиотеку \"%s\" (код ошибки: %lu)" + +#, c-format +#~ msgid "cannot create restricted tokens on this platform: error code %lu" +#~ msgstr "в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры (код ошибки: %lu)" + +#, c-format +#~ msgid "could not remove file or directory \"%s\": %m" +#~ msgstr "ошибка при удалении файла или каталога \"%s\": %m" + +#, c-format +#~ msgid "tablespaces are not supported on this platform" +#~ msgstr "табличные проÑтранÑтва не поддерживаютÑÑ Ð½Ð° Ñтой платформе" + +#, c-format +#~ msgid "invalid record offset at %X/%X" +#~ msgstr "неверное Ñмещение запиÑи: %X/%X" + +#, c-format +#~ msgid "missing contrecord at %X/%X" +#~ msgstr "нет запиÑи contrecord в %X/%X" + +#, c-format +#~ msgid "invalid primary checkpoint link in control file" +#~ msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÑылка на первичную контрольную точку в файле pg_control" + +#, c-format +#~ msgid "invalid checkpoint link in backup_label file" +#~ msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÑылка на контрольную точку в файле backup_label" + +#, c-format +#~ msgid "invalid primary checkpoint record" +#~ msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ первичной контрольной точки" + +#, c-format +#~ msgid "invalid resource manager ID in primary checkpoint record" +#~ msgstr "неверный ID менеджера реÑурÑов в запиÑи первичной контрольной точки" + +#, c-format +#~ msgid "invalid xl_info in primary checkpoint record" +#~ msgstr "неверные флаги xl_info в запиÑи первичной контрольной точки" + +#, c-format +#~ msgid "invalid length of primary checkpoint record" +#~ msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° запиÑи первичной контрольной точки" + +#, c-format +#~ msgid "promote trigger file found: %s" +#~ msgstr "найден файл триггера повышениÑ: %s" + +#, c-format +#~ msgid "could not stat promote trigger file \"%s\": %m" +#~ msgstr "" +#~ "не удалоÑÑŒ получить информацию о файле триггера Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ \"%s\": %m" + +#, c-format +#~ msgid "language with OID %u does not exist" +#~ msgstr "Ñзык Ñ OID %u не ÑущеÑтвует" + +#, c-format +#~ msgid "operator with OID %u does not exist" +#~ msgstr "оператор Ñ OID %u не ÑущеÑтвует" + +#, c-format +#~ msgid "operator class with OID %u does not exist" +#~ msgstr "клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð² Ñ OID %u не ÑущеÑтвует" + +#, c-format +#~ msgid "operator family with OID %u does not exist" +#~ msgstr "ÑемейÑтво операторов Ñ OID %u не ÑущеÑтвует" + +#, c-format +#~ msgid "text search dictionary with OID %u does not exist" +#~ msgstr "Ñловарь текÑтового поиÑка Ñ OID %u не ÑущеÑтвует" + +#, c-format +#~ msgid "text search configuration with OID %u does not exist" +#~ msgstr "ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка Ñ OID %u не ÑущеÑтвует" + +#, c-format +#~ msgid "conversion with OID %u does not exist" +#~ msgstr "преобразование Ñ OID %u не ÑущеÑтвует" + +#, c-format +#~ msgid "extension with OID %u does not exist" +#~ msgstr "раÑширение Ñ OID %u не ÑущеÑтвует" + +#, c-format +#~ msgid "statistics object with OID %u does not exist" +#~ msgstr "объект ÑтатиÑтики Ñ OID %u не ÑущеÑтвует" + +#, c-format +#~ msgid "must have CREATEROLE privilege" +#~ msgstr "требуетÑÑ Ð¿Ñ€Ð°Ð²Ð¾ CREATEROLE" + +#, c-format +#~ msgid "could not form array type name for type \"%s\"" +#~ msgstr "не удалоÑÑŒ Ñформировать Ð¸Ð¼Ñ Ñ‚Ð¸Ð¿Ð° маÑÑива Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° \"%s\"" + +#, c-format +#~ msgid "must be superuser to create subscriptions" +#~ msgstr "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñок нужно быть Ñуперпользователем" + +#, c-format +#~ msgid "" +#~ "tables were not subscribed, you will have to run %s to subscribe the " +#~ "tables" +#~ msgstr "" +#~ "в подпиÑке отÑутÑтвуют таблицы; потребуетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ %s, чтобы " +#~ "подпиÑатьÑÑ Ð½Ð° таблицы" + +#, c-format +#~ msgid "must be superuser to skip transaction" +#~ msgstr "чтобы пропуÑтить транзакцию, нужно быть Ñуперпользователем" + +#, c-format +#~ msgid "permission denied to change owner of subscription \"%s\"" +#~ msgstr "нет прав на изменение владельца подпиÑки \"%s\"" + +#, c-format +#~ msgid "The owner of a subscription must be a superuser." +#~ msgstr "Владельцем подпиÑки должен быть Ñуперпользователь." + +#, c-format +#~ msgid "" +#~ "Omit the generation expression in the definition of the child table " +#~ "column to inherit the generation expression from the parent table." +#~ msgstr "" +#~ "Уберите генерирующее выражение из Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñтолбца в дочерней таблице, " +#~ "чтобы Ñто выражение наÑледовалоÑÑŒ из родительÑкой." + +#, c-format +#~ msgid "column \"%s\" in child table has a conflicting generation expression" +#~ msgstr "" +#~ "Ñтолбец \"%s\" в дочерней таблице Ñодержит конфликтующее генерирующее " +#~ "выражение" + +#, c-format +#~ msgid "Foreign tables cannot have TRUNCATE triggers." +#~ msgstr "У Ñторонних таблиц не может быть триггеров TRUNCATE." + +#, c-format +#~ msgid "must be superuser to create superusers" +#~ msgstr "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñуперпользователей нужно быть Ñуперпользователем" + +#, c-format +#~ msgid "must be superuser to create replication users" +#~ msgstr "" +#~ "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹-репликаторов нужно быть Ñуперпользователем" + +#, c-format +#~ msgid "must be superuser to create bypassrls users" +#~ msgstr "" +#~ "Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ c атрибутом bypassrls нужно быть " +#~ "Ñуперпользователем" + +# skip-rule: translate-superuser +#, c-format +#~ msgid "" +#~ "must be superuser to alter superuser roles or change superuser attribute" +#~ msgstr "" +#~ "Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ ролей Ñуперпользователей или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð° superuser " +#~ "нужно быть Ñуперпользователем" + +#, c-format +#~ msgid "" +#~ "must be superuser to alter replication roles or change replication " +#~ "attribute" +#~ msgstr "" +#~ "Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ ролей репликации или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð° replication нужно " +#~ "быть Ñуперпользователем" + +#, c-format +#~ msgid "must be superuser to change bypassrls attribute" +#~ msgstr "Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð° bypassrls нужно быть Ñуперпользователем" + +#, c-format +#~ msgid "must be superuser to alter superusers" +#~ msgstr "Ð´Ð»Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ Ñуперпользователей нужно быть Ñуперпользователем" + +#, c-format +#~ msgid "must be superuser to drop superusers" +#~ msgstr "Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñуперпользователей нужно быть Ñуперпользователем" + +#, c-format +#~ msgid "must be superuser to rename superusers" +#~ msgstr "Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ñуперпользователей нужно быть Ñуперпользователем" + +#, c-format +#~ msgid "must be superuser to set grantor" +#~ msgstr "" +#~ "Ð´Ð»Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð° ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ нужно быть Ñуперпользователем" + +#, c-format +#~ msgid "skipping \"%s\" --- only superuser can vacuum it" +#~ msgstr "" +#~ "\"%s\" пропуÑкаетÑÑ --- только Ñуперпользователь может очиÑтить Ñту " +#~ "таблицу" + +#, c-format +#~ msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" +#~ msgstr "" +#~ "пропуÑкаетÑÑ \"%s\" --- только Ñуперпользователь или владелец БД может " +#~ "очиÑтить Ñту таблицу" + +#, c-format +#~ msgid "skipping \"%s\" --- only table or database owner can vacuum it" +#~ msgstr "" +#~ "\"%s\" пропуÑкаетÑÑ --- только владелец базы данных или Ñтой таблицы " +#~ "может очиÑтить её" + +#, c-format +#~ msgid "skipping \"%s\" --- only superuser can analyze it" +#~ msgstr "" +#~ "\"%s\" пропуÑкаетÑÑ --- только Ñуперпользователь может анализировать Ñтот " +#~ "объект" + +#, c-format +#~ msgid "skipping \"%s\" --- only superuser or database owner can analyze it" +#~ msgstr "" +#~ "\"%s\" пропуÑкаетÑÑ --- только Ñуперпользователь или владелец БД может " +#~ "анализировать Ñтот объект" + +#, c-format +#~ msgid "skipping \"%s\" --- only table or database owner can analyze it" +#~ msgstr "" +#~ "\"%s\" пропуÑкаетÑÑ --- только владелец таблицы или БД может " +#~ "анализировать Ñтот объект" + +#, c-format +#~ msgid "oldest xmin is far in the past" +#~ msgstr "Ñамый Ñтарый xmin далеко в прошлом" + #, c-format -msgid "multiple LIMIT clauses not allowed" -msgstr "LIMIT можно указать только один раз" +#~ msgid "" +#~ "Close open transactions with multixacts soon to avoid wraparound problems." +#~ msgstr "" +#~ "Скорее закройте открытые транзакции в мультитранзакциÑÑ…, чтобы избежать " +#~ "проблемы зацикливаниÑ." -#: gram.y:17979 #, c-format -msgid "multiple limit options not allowed" -msgstr "параметры LIMIT можно указать только один раз" +#~ msgid "unexpected EOF for tape %p: requested %zu bytes, read %zu bytes" +#~ msgstr "" +#~ "неожиданный конец файла Ð´Ð»Ñ Ð»ÐµÐ½Ñ‚Ñ‹ %p: запрашивалоÑÑŒ байт: %zu, прочитано: " +#~ "%zu" -#: gram.y:18006 #, c-format -msgid "multiple WITH clauses not allowed" -msgstr "WITH можно указать только один раз" +#~ msgid "" +#~ "could not read from hash-join temporary file: read only %zu of %zu bytes" +#~ msgstr "" +#~ "не удалоÑÑŒ прочитать временный файл хеш-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ (прочитано байт: %zu " +#~ "из %zu)" -#: gram.y:18199 #, c-format -msgid "OUT and INOUT arguments aren't allowed in TABLE functions" -msgstr "в табличных функциÑÑ… не может быть аргументов OUT и INOUT" +#~ msgid "Valid options in this context are: %s" +#~ msgstr "Ð’ данном контекÑте допуÑтимы параметры: %s" -#: gram.y:18332 #, c-format -msgid "multiple COLLATE clauses not allowed" -msgstr "COLLATE можно указать только один раз" +#~ msgid "could not load function _ldap_start_tls_sA in wldap32.dll" +#~ msgstr "не удалоÑÑŒ найти функцию _ldap_start_tls_sA в wldap32.dll" -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18370 gram.y:18383 #, c-format -msgid "%s constraints cannot be marked DEFERRABLE" -msgstr "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ %s не могут иметь характериÑтики DEFERRABLE" +#~ msgid "LDAP over SSL is not supported on this platform." +#~ msgstr "LDAP через SSL не поддерживаетÑÑ Ð² Ñтой ОС." -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18396 #, c-format -msgid "%s constraints cannot be marked NOT VALID" -msgstr "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ %s не могут иметь характериÑтики NOT VALID" +#~ msgid "authentication file token too long, skipping: \"%s\"" +#~ msgstr "" +#~ "Ñлишком длинный Ñлемент в файле конфигурации безопаÑноÑти пропуÑкаетÑÑ: " +#~ "\"%s\"" -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:18409 #, c-format -msgid "%s constraints cannot be marked NO INHERIT" -msgstr "Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ %s не могут иметь характериÑтики NO INHERIT" +#~ msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" +#~ msgstr "" +#~ "не удалоÑÑŒ открыть дополнительный файл конфигурации безопаÑноÑти \"@%s\" " +#~ "как \"%s\": %m" -#: gram.y:18433 #, c-format -msgid "invalid publication object list" -msgstr "неверный ÑпиÑок объектов публикации" +#~ msgid "local connections are not supported by this build" +#~ msgstr "локальные Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ðµ поддерживаютÑÑ Ð² Ñтой Ñборке" -#: gram.y:18434 #, c-format -msgid "" -"One of TABLE or TABLES IN SCHEMA must be specified before a standalone table " -"or schema name." -msgstr "" -"Перед именем отдельной таблицы или Ñхемы нужно указать TABLE либо TABLES IN " -"SCHEMA." +#~ msgid "could not open usermap file \"%s\": %m" +#~ msgstr "не удалоÑÑŒ открыть файл ÑопоÑтавлений пользователей \"%s\": %m" -#: gram.y:18450 #, c-format -msgid "invalid table name at or near" -msgstr "неверное Ð¸Ð¼Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹:" +#~ msgid "" +#~ " -n do not reinitialize shared memory after abnormal " +#~ "exit\n" +#~ msgstr "" +#~ " -n не переинициализировать разделÑемую памÑть поÑле\n" +#~ " аварийного выхода\n" -#: gram.y:18471 #, c-format -msgid "WHERE clause not allowed for schema" -msgstr "предложение WHERE не допуÑкаетÑÑ Ð´Ð»Ñ Ñхемы" +#~ msgid "generated columns are not supported on partitions" +#~ msgstr "генерируемые Ñтолбцы не поддерживаютÑÑ Ñ ÑекциÑми" -#: gram.y:18478 #, c-format -msgid "column specification not allowed for schema" -msgstr "указание Ñтолбца не допуÑкаетÑÑ Ð´Ð»Ñ Ñхемы" +#~ msgid "could not load pg_hba.conf" +#~ msgstr "не удалоÑÑŒ загрузить pg_hba.conf" -#: gram.y:18492 #, c-format -msgid "invalid schema name at or near" -msgstr "неверное Ð¸Ð¼Ñ Ñхемы:" +#~ msgid "select() failed in postmaster: %m" +#~ msgstr "Ñбой select() в postmaster'е: %m" -#: guc-file.l:314 #, c-format -msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" -msgstr "нераÑпознанный параметр конфигурации \"%s\" в файле \"%s\", Ñтроке %d" +#~ msgid "You might need to increase max_logical_replication_workers." +#~ msgstr "" +#~ "Возможно, Ñледует увеличить параметр max_logical_replication_workers." -#: guc-file.l:389 #, c-format -msgid "parameter \"%s\" removed from configuration file, reset to default" -msgstr "" -"параметр \"%s\" удалён из файла конфигурации, он принимает значение по " -"умолчанию" +#~ msgid "You might need to increase max_worker_processes." +#~ msgstr "Возможно, Ñледует увеличить параметр max_worker_processes." -#: guc-file.l:454 #, c-format -msgid "parameter \"%s\" changed to \"%s\"" -msgstr "параметр \"%s\" принÑл значение \"%s\"" +#~ msgid "logical decoding cannot be used while in recovery" +#~ msgstr "" +#~ "логичеÑкое декодирование Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в процеÑÑе воÑÑтановлениÑ" -#: guc-file.l:496 #, c-format -msgid "configuration file \"%s\" contains errors" -msgstr "файл конфигурации \"%s\" Ñодержит ошибки" +#~ msgid "" +#~ "could not read from streaming transaction's changes file \"%s\": read " +#~ "only %zu of %zu bytes" +#~ msgstr "" +#~ "не удалоÑÑŒ прочитать файл изменений потоковых транзакций " +#~ "\"%s\" (прочитано байт: %zu из %zu)" -#: guc-file.l:501 #, c-format -msgid "" -"configuration file \"%s\" contains errors; unaffected changes were applied" -msgstr "" -"файл конфигурации \"%s\" Ñодержит ошибки; были применены не завиÑимые " -"изменениÑ" +#~ msgid "" +#~ "could not read from streaming transaction's subxact file \"%s\": read " +#~ "only %zu of %zu bytes" +#~ msgstr "" +#~ "не удалоÑÑŒ прочитать файл потоковых подтранзакций \"%s\" (прочитано байт: " +#~ "%zu из %zu)" -#: guc-file.l:506 #, c-format -msgid "configuration file \"%s\" contains errors; no changes were applied" -msgstr "файл конфигурации \"%s\" Ñодержит ошибки; Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ были применены" +#~ msgid "must be superuser or replication role to use replication slots" +#~ msgstr "" +#~ "Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñлотов репликации требуетÑÑ Ñ€Ð¾Ð»ÑŒ репликации или права " +#~ "ÑуперпользователÑ" -#: guc-file.l:578 #, c-format -msgid "empty configuration file name: \"%s\"" -msgstr "пуÑтое Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° конфигурации: \"%s\"" +#~ msgid "" +#~ "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds " +#~ "max_slot_wal_keep_size" +#~ msgstr "" +#~ "Ñлот \"%s\" аннулируетÑÑ, так как его Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ restart_lsn %X/%X превышает " +#~ "max_slot_wal_keep_size" -#: guc-file.l:595 #, c-format -msgid "" -"could not open configuration file \"%s\": maximum nesting depth exceeded" -msgstr "" -"открыть файл конфигурации \"%s\" не удалоÑÑŒ: превышен предел вложенноÑти" +#~ msgid "cannot convert partitioned table \"%s\" to a view" +#~ msgstr "" +#~ "преобразовать Ñекционированную таблицу \"%s\" в предÑтавление нельзÑ" -#: guc-file.l:615 #, c-format -msgid "configuration file recursion in \"%s\"" -msgstr "рекурÑÐ¸Ð²Ð½Ð°Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ñть файла конфигурации в \"%s\"" +#~ msgid "cannot convert partition \"%s\" to a view" +#~ msgstr "преобразовать Ñекцию \"%s\" в предÑтавление нельзÑ" -#: guc-file.l:642 #, c-format -msgid "skipping missing configuration file \"%s\"" -msgstr "отÑутÑтвующий файл конфигурации \"%s\" пропуÑкаетÑÑ" +#~ msgid "could not convert table \"%s\" to a view because it is not empty" +#~ msgstr "" +#~ "не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как она не " +#~ "пуÑта1" -#: guc-file.l:896 #, c-format -msgid "syntax error in file \"%s\" line %u, near end of line" -msgstr "ошибка ÑинтакÑиÑа в файле \"%s\", в конце Ñтроки %u" +#~ msgid "could not convert table \"%s\" to a view because it has triggers" +#~ msgstr "" +#~ "не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как она " +#~ "Ñодержит триггеры" -#: guc-file.l:906 #, c-format -msgid "syntax error in file \"%s\" line %u, near token \"%s\"" -msgstr "ошибка ÑинтакÑиÑа в файле \"%s\", в Ñтроке %u, Ñ€Ñдом Ñ \"%s\"" +#~ msgid "" +#~ "In particular, the table cannot be involved in any foreign key " +#~ "relationships." +#~ msgstr "" +#~ "Кроме того, таблица не может быть задейÑтвована в ÑÑылках по внешнему " +#~ "ключу." -#: guc-file.l:926 #, c-format -msgid "too many syntax errors found, abandoning file \"%s\"" -msgstr "" -"обнаружено Ñлишком много ÑинтакÑичеÑких ошибок, обработка файла \"%s\" " -"прекращаетÑÑ" +#~ msgid "could not convert table \"%s\" to a view because it has indexes" +#~ msgstr "" +#~ "не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как она " +#~ "имеет индекÑÑ‹" -#: guc-file.l:981 #, c-format -msgid "empty configuration directory name: \"%s\"" -msgstr "пуÑтое Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° конфигурации: \"%s\"" +#~ msgid "could not convert table \"%s\" to a view because it has child tables" +#~ msgstr "" +#~ "не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как она " +#~ "имеет подчинённые таблицы" -#: guc-file.l:1000 #, c-format -msgid "could not open configuration directory \"%s\": %m" -msgstr "открыть каталог конфигурации \"%s\" не удалоÑÑŒ: %m" +#~ msgid "" +#~ "could not convert table \"%s\" to a view because it has parent tables" +#~ msgstr "" +#~ "не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как она " +#~ "имеет родительÑкие таблицы" -#: jsonpath_gram.y:530 #, c-format -msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." -msgstr "ÐераÑпознанный Ñимвол флага \"%.*s\" в предикате LIKE_REGEX." +#~ msgid "" +#~ "could not convert table \"%s\" to a view because it has row security " +#~ "enabled" +#~ msgstr "" +#~ "не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как Ð´Ð»Ñ Ð½ÐµÑ‘ " +#~ "включена защита на уровне Ñтрок" -#: jsonpath_gram.y:584 #, c-format -msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" -msgstr "" -"флаг \"x\" Ñзыка XQuery (раÑширенные регулÑрные выражениÑ) не реализован" +#~ msgid "" +#~ "could not convert table \"%s\" to a view because it has row security " +#~ "policies" +#~ msgstr "" +#~ "не удалоÑÑŒ преобразовать таблицу \"%s\" в предÑтавление, так как к ней " +#~ "применены политики защиты Ñтрок" -#. translator: %s is typically "syntax error" -#: jsonpath_scan.l:282 #, c-format -msgid "%s at end of jsonpath input" -msgstr "%s в конце аргумента jsonpath" +#~ msgid "could not link file \"%s\" to \"%s\": %m" +#~ msgstr "Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\" не удалоÑÑŒ Ñоздать ÑÑылку \"%s\": %m" -#. translator: first %s is typically "syntax error" -#: jsonpath_scan.l:289 #, c-format -msgid "%s at or near \"%s\" of jsonpath input" -msgstr "%s в Ñтроке jsonpath (примерное положение: \"%s\")" +#~ msgid "must be a superuser to terminate superuser process" +#~ msgstr "прерывать процеÑÑ ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¼Ð¾Ð¶ÐµÑ‚ только Ñуперпользователь" -#: repl_gram.y:303 repl_gram.y:335 #, c-format -msgid "invalid timeline %u" -msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u" +#~ msgid "" +#~ "must be a member of the role whose process is being terminated or member " +#~ "of pg_signal_backend" +#~ msgstr "" +#~ "необходимо быть членом роли, процеÑÑ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ прерываетÑÑ, или роли " +#~ "pg_signal_backend" -#: repl_scanner.l:142 -msgid "invalid streaming start location" -msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° потока" +#, c-format +#~ msgid "must be a superuser to cancel superuser query" +#~ msgstr "Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹ запроÑа ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½ÑƒÐ¶Ð½Ð¾ быть Ñуперпользователем" -#: repl_scanner.l:199 scan.l:724 -msgid "unterminated quoted string" -msgstr "Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ Ñтрока в кавычках" +#, c-format +#~ msgid "" +#~ "must be a member of the role whose query is being canceled or member of " +#~ "pg_signal_backend" +#~ msgstr "" +#~ "необходимо быть членом роли, Ð·Ð°Ð¿Ñ€Ð¾Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ отменÑетÑÑ, или роли " +#~ "pg_signal_backend" -#: scan.l:465 -msgid "unterminated /* comment" -msgstr "незавершённый комментарий /*" +#, c-format +#~ msgid "You might need to increase max_locks_per_transaction." +#~ msgstr "Возможно, Ñледует увеличить параметр max_locks_per_transaction." -#: scan.l:485 -msgid "unterminated bit string literal" -msgstr "Ð¾Ð±Ð¾Ñ€Ð²Ð°Ð½Ð½Ð°Ñ Ð±Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтрока" +#, c-format +#~ msgid "You might need to increase max_pred_locks_per_transaction." +#~ msgstr "" +#~ "Возможно, Ñледует увеличить значение параметра max_locks_per_transaction." -#: scan.l:499 -msgid "unterminated hexadecimal string literal" -msgstr "Ð¾Ð±Ð¾Ñ€Ð²Ð°Ð½Ð½Ð°Ñ ÑˆÐµÑÑ‚Ð½Ð°Ð´Ñ†Ð°Ñ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ Ñтрока" +#, c-format +#~ msgid "" +#~ "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" +#~ msgstr "" +#~ "Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ CHECKPOINT нужно быть Ñуперпользователем или иметь права " +#~ "роли pg_checkpoint" -#: scan.l:549 #, c-format -msgid "unsafe use of string constant with Unicode escapes" -msgstr "небезопаÑное иÑпользование Ñтроковой конÑтанты Ñо Ñпецкодами Unicode" +#~ msgid "argument %d cannot be null" +#~ msgstr "аргумент %d не может быть NULL" -#: scan.l:550 #, c-format -msgid "" -"String constants with Unicode escapes cannot be used when " -"standard_conforming_strings is off." -msgstr "" -"Строки Ñо Ñпецкодами Unicode Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать, когда параметр " -"standard_conforming_strings выключен." +#~ msgid "Object keys should be text." +#~ msgstr "Ключи объектов должны быть текÑтовыми." -#: scan.l:611 -msgid "unhandled previous state in xqs" -msgstr "" -"необрабатываемое предыдущее ÑоÑтоÑние при обнаружении закрывающего апоÑтрофа" +#, c-format +#~ msgid "Apply system library package updates." +#~ msgstr "Обновите пакет Ñ ÑиÑтемной библиотекой." -#: scan.l:685 #, c-format -msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." -msgstr "Спецкоды Unicode должны иметь вид \\uXXXX или \\UXXXXXXXX." +#~ msgid "gtsvector_in not implemented" +#~ msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ gtsvector_in не реализована" -#: scan.l:696 #, c-format -msgid "unsafe use of \\' in a string literal" -msgstr "небезопаÑное иÑпользование Ñимвола \\' в Ñтроке" +#~ msgid " GSS (authenticated=%s, encrypted=%s)" +#~ msgstr " GSS (аутентификациÑ=%s, шифрование=%s)" -#: scan.l:697 #, c-format -msgid "" -"Use '' to write quotes in strings. \\' is insecure in client-only encodings." -msgstr "" -"ЗапиÑывайте апоÑтроф в Ñтроке в виде ''. ЗапиÑÑŒ \\' небезопаÑна Ð´Ð»Ñ " -"иÑключительно клиентÑких кодировок." +#~ msgid "must be superuser or replication role to start walsender" +#~ msgstr "" +#~ "Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка процеÑÑа walsender требуетÑÑ Ñ€Ð¾Ð»ÑŒ репликации или права " +#~ "ÑуперпользователÑ" -#: scan.l:769 -msgid "unterminated dollar-quoted string" -msgstr "Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ Ñтрока Ñ $" +#~ msgid "" +#~ "Number of transactions by which VACUUM and HOT cleanup should be " +#~ "deferred, if any." +#~ msgstr "" +#~ "ОпределÑет, на Ñколько транзакций Ñледует задержать Ñтарые Ñтроки, " +#~ "выполнÑÑ VACUUM или \"горÑчее\" обновление." -#: scan.l:786 scan.l:796 -msgid "zero-length delimited identifier" -msgstr "пуÑтой идентификатор в кавычках" +#~ msgid "Specifies a file name whose presence ends recovery in the standby." +#~ msgstr "" +#~ "Задаёт Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°, приÑутÑтвие которого выводит ведомый из режима " +#~ "воÑÑтановлениÑ." -#: scan.l:807 syncrep_scanner.l:91 -msgid "unterminated quoted identifier" -msgstr "незавершённый идентификатор в кавычках" +#~ msgid "Shows the collation order locale." +#~ msgstr "Показывает правило Ñортировки." -#: scan.l:970 -msgid "operator too long" -msgstr "Ñлишком длинный оператор" +#~ msgid "Shows the character classification and case conversion locale." +#~ msgstr "" +#~ "Показывает правило клаÑÑификации Ñимволов и Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ€ÐµÐ³Ð¸Ñтра." -#: scan.l:983 -msgid "trailing junk after parameter" -msgstr "муÑорное Ñодержимое поÑле параметра" +#~ msgid "Forces use of parallel query facilities." +#~ msgstr "Принудительно включает режим параллельного Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов." -#: scan.l:1008 scan.l:1012 scan.l:1016 scan.l:1020 -msgid "trailing junk after numeric literal" -msgstr "муÑорное Ñодержимое поÑле чиÑловой конÑтанты" +#~ msgid "" +#~ "If possible, run query using a parallel worker and with parallel " +#~ "restrictions." +#~ msgstr "" +#~ "ЕÑли возможно, Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÑетÑÑ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸ иÑполнителÑми и Ñ " +#~ "ограничениÑми параллельноÑти." -#. translator: %s is typically the translation of "syntax error" -#: scan.l:1183 #, c-format -msgid "%s at end of input" -msgstr "%s в конце" +#~ msgid "" +#~ "must be superuser or have privileges of pg_read_all_settings to examine " +#~ "\"%s\"" +#~ msgstr "" +#~ "чтобы прочитать \"%s\", нужно быть Ñуперпользователем или иметь права " +#~ "роли pg_read_all_settings" -#. translator: first %s is typically the translation of "syntax error" -#: scan.l:1191 #, c-format -msgid "%s at or near \"%s\"" -msgstr "%s (примерное положение: \"%s\")" +#~ msgid "" +#~ "could not read block %ld of temporary file: read only %zu of %zu bytes" +#~ msgstr "" +#~ "не удалоÑÑŒ прочитать блок %ld временного файла (прочитано байт: %zu из " +#~ "%zu)" -#: scan.l:1382 #, c-format -msgid "nonstandard use of \\' in a string literal" -msgstr "неÑтандартное применение \\' в Ñтроке" +#~ msgid "could not read from shared tuplestore temporary file" +#~ msgstr "не удалоÑÑŒ прочитать файл общего временного хранилища кортежей" -#: scan.l:1383 #, c-format -msgid "" -"Use '' to write quotes in strings, or use the escape string syntax (E'...')." -msgstr "" -"ЗапиÑывайте апоÑтроф в Ñтроках в виде '' или иÑпользуйте ÑинтакÑÐ¸Ñ ÑпецÑтрок " -"(E'...')." +#~ msgid "" +#~ "could not read from shared tuplestore temporary file: read only %zu of " +#~ "%zu bytes" +#~ msgstr "" +#~ "не удалоÑÑŒ прочитать файл общего временного хранилища кортежей (прочитано " +#~ "байт: %zu из %zu)" -#: scan.l:1392 #, c-format -msgid "nonstandard use of \\\\ in a string literal" -msgstr "неÑтандартное применение \\\\ в Ñтроке" +#~ msgid "" +#~ "could not read from tuplestore temporary file: read only %zu of %zu bytes" +#~ msgstr "" +#~ "не удалоÑÑŒ прочитать временный файл хранилища кортежей (прочитано байт: " +#~ "%zu из %zu)" -#: scan.l:1393 #, c-format -msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." -msgstr "" -"ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи обратных ÑлÑшей ÑинтакÑÐ¸Ñ ÑпецÑтрок, например E'\\\\'." +#~ msgid "VALUES in FROM must have an alias" +#~ msgstr "ÑпиÑок VALUES во FROM должен иметь пÑевдоним" -#: scan.l:1407 #, c-format -msgid "nonstandard use of escape in a string literal" -msgstr "неÑтандартное иÑпользование ÑпецÑимвола в Ñтроке" +#~ msgid "For example, FROM (VALUES ...) [AS] foo." +#~ msgstr "Ðапример, FROM (VALUES ...) [AS] foo." -#: scan.l:1408 #, c-format -msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." -msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов ÑинтакÑÐ¸Ñ ÑпецÑтрок E'\\r\\n'." +#~ msgid "subquery in FROM must have an alias" +#~ msgstr "Ð¿Ð¾Ð´Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾ FROM должен иметь пÑевдоним" #, c-format -#~ msgid "could not read from temporary file: %m" -#~ msgstr "не удалоÑÑŒ прочитать из временного файла: %m" +#~ msgid "For example, FROM (SELECT ...) [AS] foo." +#~ msgstr "Ðапример, FROM (SELECT ...) [AS] foo." #, c-format -#~ msgid "cannot use invalid index \"%s\" as replica identity" -#~ msgstr "" -#~ "Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ реплики Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать нерабочий Ð¸Ð½Ð´ÐµÐºÑ \"%s\"" +#~ msgid "could not read from temporary file: %m" +#~ msgstr "не удалоÑÑŒ прочитать из временного файла: %m" #, c-format #~ msgid "Triggers on partitioned tables cannot have transition tables." @@ -33111,18 +36321,12 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ msgid "oidvector has too many elements" #~ msgstr "oidvector Ñодержит Ñлишком много Ñлементов" -#~ msgid "Enables reordering of GROUP BY keys." -#~ msgstr "Включает переупорÑдочивание ключей GROUP BY." - #~ msgid "unknown compression option \"%s\"" #~ msgstr "неизвеÑтный параметр ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\"" #~ msgid "invalid list syntax for \"publish\" option" #~ msgstr "неверный ÑинтакÑÐ¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"publish\"" -#~ msgid "unrecognized \"publish\" value: \"%s\"" -#~ msgstr "нераÑпознанное значение \"publish\": \"%s\"" - #~ msgid "" #~ "Table \"%s\" in schema \"%s\" is already part of the publication, adding " #~ "the same schema is not supported." @@ -33182,38 +36386,10 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ "Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° Ñортировки в базе данных \"%s\" верÑÐ¸Ñ Ñ„Ð°ÐºÑ‚Ð¸Ñ‡ÐµÑки не " #~ "определена, но при Ñтом она запиÑана" -#, fuzzy -#~ msgid "unrecognized JSON encoding: %s" -#~ msgstr "нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ°: \"%s\"" - -#, fuzzy -#~ msgid "cannot use JSON format with non-string output types" -#~ msgstr "привеÑти Ñтроку jsonb к типу %s нельзÑ" - -#, fuzzy -#~ msgid "unsupported JSON encoding" -#~ msgstr "неподдерживаемый код формата: %d" - -#, fuzzy -#~ msgid "returning SETOF types is not supported in SQL/JSON functions" -#~ msgstr "Ð´Ð»Ñ SQL-функций тип возврата %s не поддерживаетÑÑ" - -#, fuzzy -#~ msgid "cannot use type %s in IS JSON predicate" -#~ msgstr "в предикате индекÑа Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать агрегатные функции" - #, fuzzy #~ msgid "JSON_TABLE path name is not allowed here" #~ msgstr "SELECT ... INTO здеÑÑŒ не допуÑкаетÑÑ" -#, fuzzy -#~ msgid "JSON path expression must be type %s, not type %s" -#~ msgstr "аргумент конÑтрукции %s должен иметь тип %s, а не %s" - -#, fuzzy -#~ msgid "cannot cast DEFAULT expression type %s to %s" -#~ msgstr "привеÑти тип %s к %s нельзÑ" - #, fuzzy #~ msgid "JSON_TABLE() is not yet implemented for the json type" #~ msgstr "REINDEX Ð´Ð»Ñ Ñекционированных индекÑов ещё не реализован" @@ -33222,10 +36398,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ msgid "%s() is not yet implemented for the json type" #~ msgstr "политики Ð´Ð»Ñ Ñтой команды ещё не реализованы" -#, fuzzy -#~ msgid "cannot use RETURNING type %s in %s" -#~ msgstr "привеÑти тип %s к %s нельзÑ" - #, fuzzy #~ msgid "invalid JSON_TABLE plan" #~ msgstr "неверное указание OWNED BY" @@ -33234,10 +36406,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ msgid "invalid JSON_TABLE expression" #~ msgstr "неверное регулÑрное выражение: %s" -#, fuzzy -#~ msgid "duplicate JSON key %s" -#~ msgstr "Данные Ñодержат дублирующиеÑÑ ÐºÐ»ÑŽÑ‡Ð¸." - #~ msgid "fatal: " #~ msgstr "важно: " @@ -33462,9 +36630,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ msgid " -x NUM internal use\n" #~ msgstr " -x ЧИСЛО параметр Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÐµÐ³Ð¾ иÑпользованиÑ\n" -#~ msgid "too many range table entries" -#~ msgstr "Ñлишком много Ñлементов RTE" - #~ msgid "column alias list for \"%s\" has too many entries" #~ msgstr "Ñлишком много запиÑей в ÑпиÑке пÑевдонимов Ñтолбца \"%s\"" @@ -33679,9 +36844,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ msgid "Writes temporary statistics files to the specified directory." #~ msgstr "Каталог, в который будут запиÑыватьÑÑ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ðµ файлы ÑтатиÑтики." -#~ msgid "must be superuser to execute ALTER SYSTEM command" -#~ msgstr "выполнить команду ALTER SYSTEM может только Ñуперпользователь" - #~ msgid "" #~ "query-specified return tuple and function return type are not compatible" #~ msgstr "" @@ -33703,10 +36865,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ msgid "distance in phrase operator should not be greater than %d" #~ msgstr "диÑÑ‚Ð°Ð½Ñ†Ð¸Ñ Ð²Ð¾ фразовом операторе должна быть не больше %d" -#, fuzzy -#~ msgid "invalid hexadecimal digit" -#~ msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑˆÐµÑÑ‚Ð½Ð°Ð´Ñ†Ð°Ñ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ Ñ†Ð¸Ñ„Ñ€Ð°: \"%c\"" - #~ msgid "pclose failed: %m" #~ msgstr "ошибка pclose: %m" @@ -33753,10 +36911,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ "Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ PREPARE Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸, задейÑтвующей процеÑÑÑ‹ " #~ "логичеÑкой репликации" -#~ msgid "updated min recovery point to %X/%X on timeline %u" -#~ msgstr "" -#~ "Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð° на %X/%X на линии времени %u" - #~ msgid "recycled write-ahead log file \"%s\"" #~ msgstr "файл журнала предзапиÑи \"%s\" иÑпользуетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾" @@ -34009,9 +37163,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ msgid "could not reread block %d of file \"%s\": %m" #~ msgstr "не удалоÑÑŒ заново прочитать блок %d файла \"%s\": %m" -#~ msgid "logical replication launcher started" -#~ msgstr "процеÑÑ Ð·Ð°Ð¿ÑƒÑка логичеÑкой репликации запущен" - #~ msgid "only superusers can query or manipulate replication origins" #~ msgstr "" #~ "запрашивать или модифицировать иÑточники репликации могут только " @@ -34469,22 +37620,12 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ "Этот параметр определÑет, нужно ли шифровать пароли, заданные в CREATE " #~ "USER или ALTER USER без ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ ENCRYPTED или UNENCRYPTED." -#~ msgid "\"%s\" cannot be lower than \"%s\"." -#~ msgstr "ВерÑÐ¸Ñ \"%s\" не может быть ниже \"%s\"." - #~ msgid "could not write to temporary file: %m" #~ msgstr "не удалоÑÑŒ запиÑать во временный файл: %m" #~ msgid "could not write to tuplestore temporary file: %m" #~ msgstr "не удалоÑÑŒ запиÑать во временный файл иÑточника кортежей: %m" -#~ msgid "" -#~ "Unicode escape values cannot be used for code point values above 007F " -#~ "when the server encoding is not UTF8" -#~ msgstr "" -#~ "Спецкоды Unicode Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ выше 007F можно иÑпользовать только Ñ " -#~ "Ñерверной кодировкой UTF8" - #~ msgid "replication origin %d is already active for PID %d" #~ msgstr "иÑточник репликации %d уже занÑÑ‚ процеÑÑом Ñ PID %d" @@ -34996,9 +38137,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ msgid "using previous checkpoint record at %X/%X" #~ msgstr "иÑпользуетÑÑ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ контрольной точки по Ñмещению %X/%X" -#~ msgid "invalid secondary checkpoint link in control file" -#~ msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÑылка на вторичную контрольную точку в файле pg_control" - #~ msgid "invalid secondary checkpoint record" #~ msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ вторичной контрольной точки" @@ -35109,9 +38247,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ msgid "data directory \"%s\" has group or world access" #~ msgstr "к каталогу данных \"%s\" имеют доÑтуп вÑе или группа" -#~ msgid "worker process" -#~ msgstr "рабочий процеÑÑ" - #~ msgid "built-in type %u not found" #~ msgstr "вÑтроенный тип %u не найден" @@ -35126,13 +38261,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ msgstr "" #~ "тип данных \"%s.%s\", требуемый Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой репликации, не ÑущеÑтвует" -#~ msgid "" -#~ "logical replication could not find row for delete in replication target " -#~ "relation \"%s\"" -#~ msgstr "" -#~ "при логичеÑкой репликации не удалоÑÑŒ найти Ñтроку Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð² целевом " -#~ "отношении репликации \"%s\"" - #~ msgid "memory for serializable conflict tracking is nearly exhausted" #~ msgstr "" #~ "памÑть Ð´Ð»Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð¾Ð² Ñериализации практичеÑки иÑчерпана" @@ -35423,9 +38551,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ msgid "cannot create range partition with empty range" #~ msgstr "Ñоздать диапазонную Ñекцию Ñ Ð¿ÑƒÑтым диапазоном нельзÑ" -#~ msgid "could get display name for locale \"%s\": %s" -#~ msgstr "не удалоÑÑŒ получить отображаемое название локали \"%s\": %s" - #~ msgid "synchronized table states" #~ msgstr "ÑоÑтоÑние таблиц Ñинхронизировано" @@ -35560,9 +38685,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ msgid "Proceeding with relation creation anyway." #~ msgstr "ÐеÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° Ñто, Ñоздание Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð°ÐµÑ‚ÑÑ." -#~ msgid "default expression must not return a set" -#~ msgstr "выражение по умолчанию не может возвращать множеÑтво" - #~ msgid "access method name cannot be qualified" #~ msgstr "Ð¸Ð¼Ñ Ð¼ÐµÑ‚Ð¾Ð´Ð° доÑтупа не может быть ÑоÑтавным" @@ -36215,21 +39337,12 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ "Ð”Ð»Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð°Ñ†Ð¸Ð¸ WAL (archive_mode=on) wal_level должен быть \"archive\", " #~ "\"hot_standby\" или \"logical\"" -#~ msgid "postmaster became multithreaded" -#~ msgstr "процеÑÑ postmaster Ñтал многопоточным" - #~ msgid "could not determine input data types" #~ msgstr "не удалоÑÑŒ определить типы входных данных" #~ msgid "neither input type is an array" #~ msgstr "входной тип так же не ÑвлÑетÑÑ Ð¼Ð°ÑÑивом" -#~ msgid "unexpected \"=\"" -#~ msgstr "неожиданный знак \"=\"" - -#~ msgid "invalid symbol" -#~ msgstr "неверный Ñимвол" - #~ msgid "" #~ "must be superuser or have the same role to cancel queries running in " #~ "other server processes" @@ -36286,11 +39399,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ msgstr "" #~ "раÑпознать идентификатор локального Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (%ld) не удалоÑÑŒ: %s" -#~ msgid "cannot use physical replication slot created for logical decoding" -#~ msgstr "" -#~ "Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкого Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñозданный физичеÑкий " -#~ "Ñлот репликации" - #~ msgid "" #~ "incomplete read from reorderbuffer spill file: read %d instead of %u bytes" #~ msgstr "" @@ -36777,9 +39885,6 @@ msgstr "ИÑпользуйте Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ÑпецÑимволов Ñи #~ "ÐедоÑтаточно памÑти Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð¾Ðº подготовленных " #~ "транзакций." -#~ msgid "\"interval\" time zone \"%s\" not valid" -#~ msgstr "\"интервал\" Ñодержит неверный чаÑовой поÑÑ \"%s\"" - #~ msgid "inconsistent use of year %04d and \"BC\"" #~ msgstr "неÑоглаÑованное иÑпользование в годе %04d и \"BC\"" diff --git a/src/backend/po/sv.po b/src/backend/po/sv.po index a5ac231971365..db87d04a3c232 100644 --- a/src/backend/po/sv.po +++ b/src/backend/po/sv.po @@ -1,5 +1,5 @@ # Swedish message translation file for postgresql -# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023. +# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025. # # MÃ¥nga av termerna är tekniska termer som refererar till begrepp i SQL-satser # och liknande. Om man översätter vissa av dessa sÃ¥ kommer det bli väldigt @@ -21,10 +21,10 @@ # hänvisas till och inte nÃ¥gon annan städning. msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-01-21 18:45+0000\n" -"PO-Revision-Date: 2023-03-09 22:57+0100\n" +"POT-Creation-Date: 2025-02-12 13:46+0000\n" +"PO-Revision-Date: 2025-02-12 20:52+0100\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -33,46 +33,61 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../common/compression.c:130 ../common/compression.c:139 -#: ../common/compression.c:148 +#: ../common/binaryheap.c:121 ../common/binaryheap.c:159 +#, c-format +msgid "out of binary heap slots" +msgstr "slut pÃ¥ slottar i binär-heap" + +#: ../common/compression.c:132 ../common/compression.c:141 +#: ../common/compression.c:150 #, c-format msgid "this build does not support compression with %s" msgstr "detta bygge stöder inte komprimering med %s" -#: ../common/compression.c:203 +#: ../common/compression.c:205 msgid "found empty string where a compression option was expected" msgstr "hittade en tom sträng där en komprimeringsinställning förväntades" -#: ../common/compression.c:237 +#: ../common/compression.c:244 #, c-format msgid "unrecognized compression option: \"%s\"" msgstr "okänd komprimeringsflagga: \"%s\"" -#: ../common/compression.c:276 +#: ../common/compression.c:283 #, c-format msgid "compression option \"%s\" requires a value" msgstr "komprimeringsmetoden \"%s\" kräver ett värde" -#: ../common/compression.c:285 +#: ../common/compression.c:292 #, c-format msgid "value for compression option \"%s\" must be an integer" msgstr "värdet pÃ¥ komprimeringsflaggan \"%s\" mÃ¥ste vara ett heltal" -#: ../common/compression.c:335 +#: ../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "värdet pÃ¥ komprimeringsflaggan \"%s\" mÃ¥ste vara en boolean" + +#: ../common/compression.c:379 #, c-format msgid "compression algorithm \"%s\" does not accept a compression level" msgstr "komprimeringsalgoritmen \"%s\" har ingen komprimeringsnivÃ¥ som kan sättas" -#: ../common/compression.c:342 +#: ../common/compression.c:386 #, c-format msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" msgstr "komprimeringsalgoritmen \"%s\" förväntar sig en komprimeringsnivÃ¥ mellan %d och %d (standard är %d)" -#: ../common/compression.c:353 +#: ../common/compression.c:397 #, c-format msgid "compression algorithm \"%s\" does not accept a worker count" msgstr "komprimeringsalgoritm \"%s\" stöder inte ett arbetarantal" +#: ../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "komprimeringsalgoritmen \"%s\" stöder inte lÃ¥ngdistansläge" + #: ../common/config_info.c:134 ../common/config_info.c:142 #: ../common/config_info.c:150 ../common/config_info.c:158 #: ../common/config_info.c:166 ../common/config_info.c:174 @@ -80,66 +95,66 @@ msgstr "komprimeringsalgoritm \"%s\" stöder inte ett arbetarantal" msgid "not recorded" msgstr "ej sparad" -#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 -#: commands/copyfrom.c:1515 commands/extension.c:3383 utils/adt/genfile.c:123 +#: ../common/controldata_utils.c:93 ../common/controldata_utils.c:97 +#: commands/copyfrom.c:1739 commands/extension.c:3538 utils/adt/genfile.c:123 +#: utils/time/snapmgr.c:1430 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "kunde inte öppna filen \"%s\" för läsning: %m" -#: ../common/controldata_utils.c:84 ../common/controldata_utils.c:86 +#: ../common/controldata_utils.c:108 ../common/controldata_utils.c:110 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1348 access/transam/xlog.c:3207 -#: access/transam/xlog.c:4022 access/transam/xlogrecovery.c:1178 -#: access/transam/xlogrecovery.c:1270 access/transam/xlogrecovery.c:1307 -#: access/transam/xlogrecovery.c:1367 backup/basebackup.c:1843 -#: commands/extension.c:3393 libpq/hba.c:505 replication/logical/origin.c:729 -#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4948 -#: replication/logical/snapbuild.c:1858 replication/logical/snapbuild.c:1900 -#: replication/logical/snapbuild.c:1927 replication/slot.c:1807 -#: replication/slot.c:1848 replication/walsender.c:658 -#: storage/file/buffile.c:463 storage/file/copydir.c:195 -#: utils/adt/genfile.c:197 utils/adt/misc.c:863 utils/cache/relmapper.c:813 +#: access/transam/twophase.c:1353 access/transam/xlog.c:3477 +#: access/transam/xlog.c:4341 access/transam/xlogrecovery.c:1238 +#: access/transam/xlogrecovery.c:1336 access/transam/xlogrecovery.c:1373 +#: access/transam/xlogrecovery.c:1440 backup/basebackup.c:2123 +#: backup/walsummary.c:283 commands/extension.c:3548 libpq/hba.c:764 +#: replication/logical/origin.c:745 replication/logical/origin.c:781 +#: replication/logical/reorderbuffer.c:5113 +#: replication/logical/snapbuild.c:2052 replication/slot.c:2236 +#: replication/slot.c:2277 replication/walsender.c:655 +#: storage/file/buffile.c:470 storage/file/copydir.c:185 +#: utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 #, c-format msgid "could not read file \"%s\": %m" msgstr "kunde inte läsa fil \"%s\": %m" -#: ../common/controldata_utils.c:92 ../common/controldata_utils.c:95 -#: access/transam/xlog.c:3212 access/transam/xlog.c:4027 -#: backup/basebackup.c:1847 replication/logical/origin.c:734 -#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1863 -#: replication/logical/snapbuild.c:1905 replication/logical/snapbuild.c:1932 -#: replication/slot.c:1811 replication/slot.c:1852 replication/walsender.c:663 -#: utils/cache/relmapper.c:817 +#: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 +#: access/transam/xlog.c:3482 access/transam/xlog.c:4346 +#: replication/logical/origin.c:750 replication/logical/origin.c:789 +#: replication/logical/snapbuild.c:2057 replication/slot.c:2240 +#: replication/slot.c:2281 replication/walsender.c:660 +#: utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" -#: ../common/controldata_utils.c:104 ../common/controldata_utils.c:108 -#: ../common/controldata_utils.c:241 ../common/controldata_utils.c:244 -#: access/heap/rewriteheap.c:1178 access/heap/rewriteheap.c:1281 +#: ../common/controldata_utils.c:128 ../common/controldata_utils.c:132 +#: ../common/controldata_utils.c:277 ../common/controldata_utils.c:280 +#: access/heap/rewriteheap.c:1141 access/heap/rewriteheap.c:1246 #: access/transam/timeline.c:392 access/transam/timeline.c:438 -#: access/transam/timeline.c:516 access/transam/twophase.c:1360 -#: access/transam/twophase.c:1772 access/transam/xlog.c:3054 -#: access/transam/xlog.c:3247 access/transam/xlog.c:3252 -#: access/transam/xlog.c:3390 access/transam/xlog.c:3992 -#: access/transam/xlog.c:4738 commands/copyfrom.c:1575 commands/copyto.c:327 -#: libpq/be-fsstubs.c:455 libpq/be-fsstubs.c:525 -#: replication/logical/origin.c:667 replication/logical/origin.c:806 -#: replication/logical/reorderbuffer.c:5006 -#: replication/logical/snapbuild.c:1767 replication/logical/snapbuild.c:1940 -#: replication/slot.c:1698 replication/slot.c:1859 replication/walsender.c:673 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:745 -#: storage/file/fd.c:3643 storage/file/fd.c:3749 utils/cache/relmapper.c:828 +#: access/transam/timeline.c:512 access/transam/twophase.c:1365 +#: access/transam/twophase.c:1784 access/transam/xlog.c:3323 +#: access/transam/xlog.c:3517 access/transam/xlog.c:3522 +#: access/transam/xlog.c:3658 access/transam/xlog.c:4311 +#: access/transam/xlog.c:5246 commands/copyfrom.c:1799 commands/copyto.c:325 +#: libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 +#: replication/logical/origin.c:683 replication/logical/origin.c:822 +#: replication/logical/reorderbuffer.c:5165 +#: replication/logical/snapbuild.c:1819 replication/logical/snapbuild.c:1943 +#: replication/slot.c:2126 replication/slot.c:2288 replication/walsender.c:670 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:828 +#: storage/file/fd.c:3753 storage/file/fd.c:3859 utils/cache/relmapper.c:841 #: utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" msgstr "kunde inte stänga fil \"%s\": %m" -#: ../common/controldata_utils.c:124 +#: ../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "byte-ordning stämmer inte" -#: ../common/controldata_utils.c:126 +#: ../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -152,194 +167,211 @@ msgstr "" "inte detta program. I sÃ¥ fall kan nedanstÃ¥ende resultat vara felaktiga\n" "och PostgreSQL-installationen vara inkompatibel med databaskatalogen." -#: ../common/controldata_utils.c:189 ../common/controldata_utils.c:194 -#: ../common/file_utils.c:232 ../common/file_utils.c:291 -#: ../common/file_utils.c:365 access/heap/rewriteheap.c:1264 -#: access/transam/timeline.c:111 access/transam/timeline.c:251 -#: access/transam/timeline.c:348 access/transam/twophase.c:1304 -#: access/transam/xlog.c:2941 access/transam/xlog.c:3123 -#: access/transam/xlog.c:3162 access/transam/xlog.c:3357 -#: access/transam/xlog.c:4012 access/transam/xlogrecovery.c:4190 -#: access/transam/xlogrecovery.c:4293 access/transam/xlogutils.c:852 -#: backup/basebackup.c:522 backup/basebackup.c:1520 postmaster/syslogger.c:1560 -#: replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3601 -#: replication/logical/reorderbuffer.c:4152 -#: replication/logical/reorderbuffer.c:4928 -#: replication/logical/snapbuild.c:1722 replication/logical/snapbuild.c:1829 -#: replication/slot.c:1779 replication/walsender.c:631 -#: replication/walsender.c:2722 storage/file/copydir.c:161 -#: storage/file/fd.c:720 storage/file/fd.c:3395 storage/file/fd.c:3630 -#: storage/file/fd.c:3720 storage/smgr/md.c:538 utils/cache/relmapper.c:792 -#: utils/cache/relmapper.c:900 utils/error/elog.c:1933 -#: utils/init/miscinit.c:1366 utils/init/miscinit.c:1500 -#: utils/init/miscinit.c:1577 utils/misc/guc.c:8991 utils/misc/guc.c:9040 +#: ../common/controldata_utils.c:225 ../common/controldata_utils.c:230 +#: ../common/file_utils.c:70 ../common/file_utils.c:347 +#: ../common/file_utils.c:406 ../common/file_utils.c:480 +#: access/heap/rewriteheap.c:1229 access/transam/timeline.c:111 +#: access/transam/timeline.c:251 access/transam/timeline.c:348 +#: access/transam/twophase.c:1309 access/transam/xlog.c:3230 +#: access/transam/xlog.c:3393 access/transam/xlog.c:3432 +#: access/transam/xlog.c:3625 access/transam/xlog.c:4331 +#: access/transam/xlogrecovery.c:4264 access/transam/xlogrecovery.c:4367 +#: access/transam/xlogutils.c:836 backup/basebackup.c:547 +#: backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:624 +#: postmaster/syslogger.c:1511 replication/logical/origin.c:735 +#: replication/logical/reorderbuffer.c:3766 +#: replication/logical/reorderbuffer.c:4320 +#: replication/logical/reorderbuffer.c:5093 +#: replication/logical/snapbuild.c:1774 replication/logical/snapbuild.c:1884 +#: replication/slot.c:2208 replication/walsender.c:628 +#: replication/walsender.c:3051 storage/file/copydir.c:151 +#: storage/file/fd.c:803 storage/file/fd.c:3510 storage/file/fd.c:3740 +#: storage/file/fd.c:3830 storage/smgr/md.c:661 utils/cache/relmapper.c:818 +#: utils/cache/relmapper.c:935 utils/error/elog.c:2124 +#: utils/init/miscinit.c:1580 utils/init/miscinit.c:1714 +#: utils/init/miscinit.c:1791 utils/misc/guc.c:4777 utils/misc/guc.c:4827 #, c-format msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" -#: ../common/controldata_utils.c:210 ../common/controldata_utils.c:213 -#: access/transam/twophase.c:1745 access/transam/twophase.c:1754 -#: access/transam/xlog.c:8670 access/transam/xlogfuncs.c:600 +#: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 +#: access/transam/twophase.c:1757 access/transam/twophase.c:1766 +#: access/transam/xlog.c:9280 access/transam/xlogfuncs.c:698 #: backup/basebackup_server.c:173 backup/basebackup_server.c:266 -#: postmaster/postmaster.c:5638 postmaster/syslogger.c:1571 -#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 -#: utils/cache/relmapper.c:934 +#: backup/walsummary.c:304 postmaster/postmaster.c:4127 +#: postmaster/syslogger.c:1522 postmaster/syslogger.c:1535 +#: postmaster/syslogger.c:1548 utils/cache/relmapper.c:947 #, c-format msgid "could not write file \"%s\": %m" msgstr "kunde inte skriva fil \"%s\": %m" -#: ../common/controldata_utils.c:227 ../common/controldata_utils.c:232 -#: ../common/file_utils.c:303 ../common/file_utils.c:373 -#: access/heap/rewriteheap.c:960 access/heap/rewriteheap.c:1172 -#: access/heap/rewriteheap.c:1275 access/transam/timeline.c:432 -#: access/transam/timeline.c:510 access/transam/twophase.c:1766 -#: access/transam/xlog.c:3047 access/transam/xlog.c:3241 -#: access/transam/xlog.c:3985 access/transam/xlog.c:7973 -#: access/transam/xlog.c:8016 backup/basebackup_server.c:207 -#: replication/logical/snapbuild.c:1760 replication/slot.c:1684 -#: replication/slot.c:1789 storage/file/fd.c:737 storage/file/fd.c:3741 -#: storage/smgr/md.c:989 storage/smgr/md.c:1030 storage/sync/sync.c:453 -#: utils/cache/relmapper.c:949 utils/misc/guc.c:8760 +#: ../common/controldata_utils.c:263 ../common/controldata_utils.c:268 +#: ../common/file_utils.c:418 ../common/file_utils.c:488 +#: access/heap/rewriteheap.c:925 access/heap/rewriteheap.c:1135 +#: access/heap/rewriteheap.c:1240 access/transam/timeline.c:432 +#: access/transam/timeline.c:506 access/transam/twophase.c:1778 +#: access/transam/xlog.c:3316 access/transam/xlog.c:3511 +#: access/transam/xlog.c:4304 access/transam/xlog.c:8655 +#: access/transam/xlog.c:8700 backup/basebackup_server.c:207 +#: commands/dbcommands.c:514 replication/logical/snapbuild.c:1812 +#: replication/slot.c:2112 replication/slot.c:2218 storage/file/fd.c:820 +#: storage/file/fd.c:3851 storage/smgr/md.c:1331 storage/smgr/md.c:1376 +#: storage/sync/sync.c:446 utils/misc/guc.c:4530 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "kunde inte fsync:a fil \"%s\": %m" -#: ../common/cryptohash.c:266 ../common/cryptohash_openssl.c:133 -#: ../common/cryptohash_openssl.c:332 ../common/exec.c:560 ../common/exec.c:605 -#: ../common/exec.c:697 ../common/hmac.c:309 ../common/hmac.c:325 -#: ../common/hmac_openssl.c:132 ../common/hmac_openssl.c:327 -#: ../common/md5_common.c:155 ../common/psprintf.c:143 -#: ../common/scram-common.c:247 ../common/stringinfo.c:305 ../port/path.c:751 -#: ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1413 -#: access/transam/xlogrecovery.c:568 lib/dshash.c:253 libpq/auth.c:1338 -#: libpq/auth.c:1406 libpq/auth.c:1964 libpq/be-secure-gssapi.c:520 -#: postmaster/bgworker.c:349 postmaster/bgworker.c:931 -#: postmaster/postmaster.c:2591 postmaster/postmaster.c:4177 -#: postmaster/postmaster.c:4849 postmaster/postmaster.c:5563 -#: postmaster/postmaster.c:5934 -#: replication/libpqwalreceiver/libpqwalreceiver.c:296 -#: replication/logical/logical.c:205 replication/walsender.c:701 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:892 storage/file/fd.c:1434 -#: storage/file/fd.c:1595 storage/file/fd.c:2409 storage/ipc/procarray.c:1448 -#: storage/ipc/procarray.c:2260 storage/ipc/procarray.c:2267 -#: storage/ipc/procarray.c:2770 storage/ipc/procarray.c:3401 -#: utils/adt/formatting.c:1732 utils/adt/formatting.c:1854 -#: utils/adt/formatting.c:1977 utils/adt/pg_locale.c:450 -#: utils/adt/pg_locale.c:614 utils/adt/regexp.c:224 utils/fmgr/dfmgr.c:229 -#: utils/hash/dynahash.c:513 utils/hash/dynahash.c:613 -#: utils/hash/dynahash.c:1116 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 -#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5192 -#: utils/misc/guc.c:5208 utils/misc/guc.c:5221 utils/misc/guc.c:8738 -#: utils/misc/tzparser.c:476 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:701 -#: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:266 -#: utils/mmgr/mcxt.c:888 utils/mmgr/mcxt.c:924 utils/mmgr/mcxt.c:962 -#: utils/mmgr/mcxt.c:1000 utils/mmgr/mcxt.c:1088 utils/mmgr/mcxt.c:1119 -#: utils/mmgr/mcxt.c:1155 utils/mmgr/mcxt.c:1207 utils/mmgr/mcxt.c:1242 -#: utils/mmgr/mcxt.c:1277 utils/mmgr/slab.c:238 +#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:158 +#: ../common/cryptohash_openssl.c:356 ../common/exec.c:562 ../common/exec.c:607 +#: ../common/exec.c:699 ../common/hmac.c:309 ../common/hmac.c:325 +#: ../common/hmac_openssl.c:160 ../common/hmac_openssl.c:357 +#: ../common/md5_common.c:156 ../common/parse_manifest.c:157 +#: ../common/parse_manifest.c:852 ../common/psprintf.c:143 +#: ../common/scram-common.c:268 ../common/stringinfo.c:314 ../port/path.c:828 +#: ../port/path.c:865 ../port/path.c:882 access/transam/twophase.c:1418 +#: access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1352 +#: libpq/auth.c:1396 libpq/auth.c:1953 libpq/be-secure-gssapi.c:524 +#: postmaster/bgworker.c:355 postmaster/bgworker.c:945 +#: postmaster/postmaster.c:3560 postmaster/postmaster.c:4021 +#: postmaster/postmaster.c:4383 postmaster/walsummarizer.c:935 +#: replication/libpqwalreceiver/libpqwalreceiver.c:387 +#: replication/logical/logical.c:210 replication/walsender.c:835 +#: storage/buffer/localbuf.c:606 storage/file/fd.c:912 storage/file/fd.c:1443 +#: storage/file/fd.c:1604 storage/file/fd.c:2531 storage/ipc/procarray.c:1465 +#: storage/ipc/procarray.c:2219 storage/ipc/procarray.c:2226 +#: storage/ipc/procarray.c:2731 storage/ipc/procarray.c:3435 +#: utils/adt/formatting.c:1725 utils/adt/formatting.c:1873 +#: utils/adt/formatting.c:2075 utils/adt/pg_locale.c:532 +#: utils/adt/pg_locale.c:696 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:516 +#: utils/hash/dynahash.c:616 utils/hash/dynahash.c:1099 utils/mb/mbutils.c:401 +#: utils/mb/mbutils.c:429 utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 +#: utils/misc/guc.c:649 utils/misc/guc.c:674 utils/misc/guc.c:1062 +#: utils/misc/guc.c:4508 utils/misc/tzparser.c:477 utils/mmgr/aset.c:451 +#: utils/mmgr/bump.c:183 utils/mmgr/dsa.c:707 utils/mmgr/dsa.c:729 +#: utils/mmgr/dsa.c:810 utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1154 +#: utils/mmgr/slab.c:370 #, c-format msgid "out of memory" msgstr "slut pÃ¥ minne" -#: ../common/cryptohash.c:271 ../common/cryptohash.c:277 -#: ../common/cryptohash_openssl.c:344 ../common/cryptohash_openssl.c:352 -#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:339 -#: ../common/hmac_openssl.c:347 +#: ../common/cryptohash.c:266 ../common/cryptohash.c:272 +#: ../common/cryptohash_openssl.c:368 ../common/cryptohash_openssl.c:376 +#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:369 +#: ../common/hmac_openssl.c:377 msgid "success" msgstr "lyckades" -#: ../common/cryptohash.c:273 ../common/cryptohash_openssl.c:346 -#: ../common/hmac_openssl.c:341 +#: ../common/cryptohash.c:268 ../common/cryptohash_openssl.c:370 +#: ../common/hmac_openssl.c:371 msgid "destination buffer too small" msgstr "destinationsbuffer för liten" -#: ../common/cryptohash_openssl.c:348 ../common/hmac_openssl.c:343 +#: ../common/cryptohash_openssl.c:372 ../common/hmac_openssl.c:373 msgid "OpenSSL failure" msgstr "OpenSSL-fel" -#: ../common/exec.c:149 ../common/exec.c:266 ../common/exec.c:312 -#, c-format -msgid "could not identify current directory: %m" -msgstr "kunde inte identifiera aktuell katalog: %m" - -#: ../common/exec.c:168 +#: ../common/exec.c:174 #, c-format -msgid "invalid binary \"%s\"" -msgstr "ogiltig binär \"%s\"" +msgid "invalid binary \"%s\": %m" +msgstr "ogiltig binär \"%s\": %m" -#: ../common/exec.c:218 +#: ../common/exec.c:217 #, c-format -msgid "could not read binary \"%s\"" -msgstr "kunde inte läsa binär \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "kunde inte läsa binär \"%s\": %m" -#: ../common/exec.c:226 +#: ../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "kunde inte hitta en \"%s\" att köra" -#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:439 +#: ../common/exec.c:252 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "kunde inte byta katalog till \"%s\": %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "kunde inte konvertera sökvägen \"%s\" till en absolut sökväg: %m" -#: ../common/exec.c:299 access/transam/xlog.c:8319 backup/basebackup.c:1340 -#: utils/adt/misc.c:342 +#: ../common/exec.c:382 commands/collationcmds.c:876 commands/copyfrom.c:1723 +#: commands/copyto.c:654 libpq/be-secure-common.c:59 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "kan inte läsa symbolisk länk \"%s\": %m" +msgid "could not execute command \"%s\": %m" +msgstr "kunde inte köra kommandot \"%s\": %m" + +#: ../common/exec.c:394 libpq/be-secure-common.c:71 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "kunde inte läsa frÃ¥n kommando \"%s\": %m" + +#: ../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "ingen data returnerades frÃ¥n kommandot \"%s\"" -#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 -#: storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1663 -#: storage/ipc/latch.c:1789 +#: ../common/exec.c:424 libpq/pqcomm.c:192 storage/ipc/latch.c:1169 +#: storage/ipc/latch.c:1349 storage/ipc/latch.c:1589 storage/ipc/latch.c:1751 +#: storage/ipc/latch.c:1877 #, c-format msgid "%s() failed: %m" msgstr "%s() misslyckades: %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 -#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:162 -#: ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 -#: ../port/path.c:808 utils/misc/ps_status.c:181 utils/misc/ps_status.c:189 -#: utils/misc/ps_status.c:219 utils/misc/ps_status.c:227 +#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 +#: ../common/psprintf.c:145 ../port/path.c:830 ../port/path.c:867 +#: ../port/path.c:884 utils/misc/ps_status.c:193 utils/misc/ps_status.c:201 +#: utils/misc/ps_status.c:228 utils/misc/ps_status.c:236 #, c-format msgid "out of memory\n" msgstr "slut pÃ¥ minne\n" -#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:154 +#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" -#: ../common/file_utils.c:87 ../common/file_utils.c:451 -#: ../common/file_utils.c:455 access/transam/twophase.c:1316 -#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:230 -#: backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 -#: commands/copyfrom.c:1525 commands/copyto.c:725 commands/extension.c:3372 -#: commands/tablespace.c:826 commands/tablespace.c:917 guc-file.l:1061 -#: postmaster/pgarch.c:597 replication/logical/snapbuild.c:1639 -#: storage/file/copydir.c:68 storage/file/copydir.c:107 storage/file/fd.c:1951 -#: storage/file/fd.c:2037 storage/file/fd.c:3243 storage/file/fd.c:3450 -#: utils/adt/dbsize.c:92 utils/adt/dbsize.c:244 utils/adt/dbsize.c:324 -#: utils/adt/genfile.c:413 utils/adt/genfile.c:588 utils/adt/misc.c:327 +#: ../common/file_utils.c:76 storage/file/fd.c:3516 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" + +#: ../common/file_utils.c:120 ../common/file_utils.c:566 +#: ../common/file_utils.c:570 access/transam/twophase.c:1321 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 +#: backup/basebackup.c:355 backup/basebackup.c:553 backup/basebackup.c:624 +#: backup/walsummary.c:247 backup/walsummary.c:254 commands/copyfrom.c:1749 +#: commands/copyto.c:700 commands/extension.c:3527 commands/tablespace.c:804 +#: commands/tablespace.c:893 postmaster/pgarch.c:680 +#: replication/logical/snapbuild.c:1670 replication/logical/snapbuild.c:2173 +#: storage/file/fd.c:1968 storage/file/fd.c:2054 storage/file/fd.c:3564 +#: utils/adt/dbsize.c:105 utils/adt/dbsize.c:257 utils/adt/dbsize.c:337 +#: utils/adt/genfile.c:437 utils/adt/genfile.c:612 utils/adt/misc.c:340 #, c-format msgid "could not stat file \"%s\": %m" msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" -#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:749 -#: commands/tablespace.c:759 postmaster/postmaster.c:1576 -#: storage/file/fd.c:2812 storage/file/reinit.c:126 utils/adt/misc.c:235 -#: utils/misc/tzparser.c:338 +#: ../common/file_utils.c:130 ../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "detta bygge stöder inte synkmetod \"%s\"" + +#: ../common/file_utils.c:151 ../common/file_utils.c:281 +#: ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 +#: commands/tablespace.c:738 postmaster/postmaster.c:1470 +#: storage/file/fd.c:2933 storage/file/reinit.c:126 utils/adt/misc.c:256 +#: utils/misc/tzparser.c:339 #, c-format msgid "could not open directory \"%s\": %m" msgstr "kunde inte öppna katalog \"%s\": %m" -#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2824 +#: ../common/file_utils.c:169 ../common/file_utils.c:315 +#: ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2945 #, c-format msgid "could not read directory \"%s\": %m" msgstr "kunde inte läsa katalog \"%s\": %m" -#: ../common/file_utils.c:383 access/transam/xlogarchive.c:419 -#: postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1779 -#: replication/slot.c:721 replication/slot.c:1570 replication/slot.c:1712 -#: storage/file/fd.c:755 storage/file/fd.c:853 utils/time/snapmgr.c:1282 +#: ../common/file_utils.c:498 access/transam/xlogarchive.c:389 +#: postmaster/pgarch.c:834 postmaster/syslogger.c:1559 +#: replication/logical/snapbuild.c:1831 replication/slot.c:936 +#: replication/slot.c:1998 replication/slot.c:2140 storage/file/fd.c:838 +#: utils/time/snapmgr.c:1255 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" @@ -348,85 +380,102 @@ msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" msgid "internal error" msgstr "internt fel" -#: ../common/jsonapi.c:1075 +#: ../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "Recursive-descent-parser kan inte använda inkrementell lexer." + +#: ../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "Inkrementell parser kräver en inkrementell lexer." + +#: ../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON nästlad för djupt, maximal tillÃ¥tet djup är 6400." + +#: ../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "Escape-sekvens \"\\%s\" är ogiltig." +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "Escape-sekvens \"\\%.*s\" är ogiltig." -#: ../common/jsonapi.c:1078 +#: ../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Tecken med värde 0x%02x mÃ¥ste escape:as." -#: ../common/jsonapi.c:1081 +#: ../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "Förväntade slut pÃ¥ indata, men hittade \"%s\"." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "Förväntade slut pÃ¥ indata, men hittade \"%.*s\"." -#: ../common/jsonapi.c:1084 +#: ../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "Färväntade array-element eller \"]\", men hittade \"%s\"." +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "Färväntade array-element eller \"]\", men hittade \"%.*s\"." -#: ../common/jsonapi.c:1087 +#: ../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "Förväntade \",\" eller \"]\", men hittade \"%s\"." +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "Förväntade \",\" eller \"]\", men hittade \"%.*s\"." -#: ../common/jsonapi.c:1090 +#: ../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "Förväntade sig \":\" men hittade \"%s\"." +msgid "Expected \":\", but found \"%.*s\"." +msgstr "Förväntade sig \":\" men hittade \"%.*s\"." -#: ../common/jsonapi.c:1093 +#: ../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "Förväntade JSON-värde, men hittade \"%s\"." +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "Förväntade JSON-värde, men hittade \"%.*s\"." -#: ../common/jsonapi.c:1096 +#: ../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "Indatasträngen avslutades oväntat." -#: ../common/jsonapi.c:1098 +#: ../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "Färväntade sträng eller \"}\", men hittade \"%s\"." +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "Färväntade sträng eller \"}\", men hittade \"%.*s\"." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "Förväntade sig \",\" eller \"}\" men hittade \"%s\"." +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "Förväntade sig \",\" eller \"}\" men hittade \"%.*s\"." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "Förväntade sträng, men hittade \"%s\"." +msgid "Expected string, but found \"%.*s\"." +msgstr "Förväntade sträng, men hittade \"%.*s\"." -#: ../common/jsonapi.c:1107 +#: ../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "Token \"%s\" är ogiltig." +msgid "Token \"%.*s\" is invalid." +msgstr "Token \"%.*s\" är ogiltig." -#: ../common/jsonapi.c:1110 jsonpath_scan.l:495 +#: ../common/jsonapi.c:2164 jsonpath_scan.l:608 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kan inte konverteras till text." -#: ../common/jsonapi.c:1112 +#: ../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\" mÃ¥ste följas av fyra hexdecimala siffror." -#: ../common/jsonapi.c:1115 +#: ../common/jsonapi.c:2169 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Escape-värden för unicode kan inte användas för kodpunkter med värde över 007F när kodningen inte är UTF8." -#: ../common/jsonapi.c:1117 jsonpath_scan.l:516 +#: ../common/jsonapi.c:2178 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "Escape-värde för unicode kan inte översättas till serverns kodning %s." + +#: ../common/jsonapi.c:2185 jsonpath_scan.l:641 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodes övre surrogathalva fÃ¥r inte komma efter en övre surrogathalva." -#: ../common/jsonapi.c:1119 jsonpath_scan.l:527 jsonpath_scan.l:537 -#: jsonpath_scan.l:579 +#: ../common/jsonapi.c:2187 jsonpath_scan.l:652 jsonpath_scan.l:662 +#: jsonpath_scan.l:713 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicodes lägre surrogathalva mÃ¥ste följa en övre surrogathalva." @@ -451,6 +500,182 @@ msgstr "detalj: " msgid "hint: " msgstr "tips: " +#: ../common/parse_manifest.c:159 ../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "kunde inte initiera kontrollsumma för backup-manifest" + +#: ../common/parse_manifest.c:203 ../common/parse_manifest.c:260 +msgid "manifest ended unexpectedly" +msgstr "manifestet avslutades oväntat" + +#: ../common/parse_manifest.c:209 ../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "kunde inte uppdatera kontrollsumma för backup-manifest" + +#: ../common/parse_manifest.c:301 +msgid "unexpected object start" +msgstr "oväntad objektstart" + +#: ../common/parse_manifest.c:336 +msgid "unexpected object end" +msgstr "oväntat objektslut" + +#: ../common/parse_manifest.c:365 +msgid "unexpected array start" +msgstr "oväntad array-start" + +#: ../common/parse_manifest.c:390 +msgid "unexpected array end" +msgstr "oväntat array-slut" + +#: ../common/parse_manifest.c:417 +msgid "expected version indicator" +msgstr "förväntade en versionsindikator" + +#: ../common/parse_manifest.c:453 +msgid "unrecognized top-level field" +msgstr "okänt toppnivÃ¥fält" + +#: ../common/parse_manifest.c:472 +msgid "unexpected file field" +msgstr "oväntat filfält" + +#: ../common/parse_manifest.c:486 +msgid "unexpected WAL range field" +msgstr "oväntat WAL-intervall-fält" + +#: ../common/parse_manifest.c:492 +msgid "unexpected object field" +msgstr "oväntat objektfält" + +#: ../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "oväntad skalar" + +#: ../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "manifestversion är inte ett heltal" + +#: ../common/parse_manifest.c:612 +msgid "unexpected manifest version" +msgstr "oväntad manifestversion" + +#: ../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "manifestets systemidentifierare är inte ett heltal" + +#: ../common/parse_manifest.c:661 +msgid "missing path name" +msgstr "saknas sökväg" + +#: ../common/parse_manifest.c:664 +msgid "both path name and encoded path name" +msgstr "bÃ¥de sökväg och kodad sökväg" + +#: ../common/parse_manifest.c:666 +msgid "missing size" +msgstr "saknar storlek" + +#: ../common/parse_manifest.c:669 +msgid "checksum without algorithm" +msgstr "kontrollsumma utan algoritm" + +#: ../common/parse_manifest.c:683 +msgid "could not decode file name" +msgstr "kunde inte avkoda filnamn" + +#: ../common/parse_manifest.c:693 +msgid "file size is not an integer" +msgstr "filstorlek är inte ett haltal" + +#: ../common/parse_manifest.c:699 backup/basebackup.c:870 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "okänd algoritm för kontrollsumma: \"%s\"" + +#: ../common/parse_manifest.c:718 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "ogiltig kontrollsumma för fil \"%s\": \"%s\"" + +#: ../common/parse_manifest.c:761 +msgid "missing timeline" +msgstr "saknar tidslinje" + +#: ../common/parse_manifest.c:763 +msgid "missing start LSN" +msgstr "saknar start-LSN" + +#: ../common/parse_manifest.c:765 +msgid "missing end LSN" +msgstr "saknar slut-LSN" + +#: ../common/parse_manifest.c:771 +msgid "timeline is not an integer" +msgstr "tidslinje är inte ett heltal" + +#: ../common/parse_manifest.c:774 +msgid "could not parse start LSN" +msgstr "kunde inte parsa start-LSN" + +#: ../common/parse_manifest.c:777 +msgid "could not parse end LSN" +msgstr "kunde inte parsa slut-LSN" + +#: ../common/parse_manifest.c:842 +msgid "expected at least 2 lines" +msgstr "förväntade minst tvÃ¥ rader" + +#: ../common/parse_manifest.c:845 +msgid "last line not newline-terminated" +msgstr "sista raden är inte nyradsterminerad" + +#: ../common/parse_manifest.c:864 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "kunde inte göra klart kontrollsumma för backup-manifest" + +#: ../common/parse_manifest.c:868 +#, c-format +msgid "manifest has no checksum" +msgstr "manifestet har ingen kontrollsumma" + +#: ../common/parse_manifest.c:872 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "ogiltig kontrollsumma för manifest: \"%s\"" + +#: ../common/parse_manifest.c:876 +#, c-format +msgid "manifest checksum mismatch" +msgstr "kontrollsumma för manifest matchar inte" + +#: ../common/parse_manifest.c:891 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "kunde inte parsa backup-manifest: %s" + +#: ../common/percentrepl.c:79 ../common/percentrepl.c:85 +#: ../common/percentrepl.c:118 ../common/percentrepl.c:124 +#: tcop/backend_startup.c:741 utils/misc/guc.c:3167 utils/misc/guc.c:3208 +#: utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6931 +#: utils/misc/guc.c:6972 +#, c-format +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "ogiltigt värde för parameter \"%s\": \"%s\"" + +#: ../common/percentrepl.c:80 ../common/percentrepl.c:86 +#, c-format +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "Sträng avslutas oväntat efter escape-tecken \"%%\"." + +#: ../common/percentrepl.c:119 ../common/percentrepl.c:125 +#, c-format +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "Sträng innehÃ¥ller oväntad platshÃ¥llare \"%%%c\"." + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -466,74 +691,75 @@ msgstr "ogiltigt fork-namn" msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "Giltiga fork-värden är \"main\", \"fsm\", \"vm\" och \"init\"." -#: ../common/restricted_token.c:64 libpq/auth.c:1368 libpq/auth.c:2400 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "kunde inte ladda länkbibliotek \"%s\": felkod %lu" - -#: ../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "kan inte skapa token för begränsad Ã¥tkomst pÃ¥ denna plattorm: felkod %lu" - -#: ../common/restricted_token.c:82 +#: ../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "kunde inte öppna process-token: felkod %lu" -#: ../common/restricted_token.c:97 +#: ../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "kunde inte allokera SID: felkod %lu" -#: ../common/restricted_token.c:119 +#: ../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "kunde inte skapa token för begränsad Ã¥tkomst: felkod %lu" -#: ../common/restricted_token.c:140 +#: ../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "kunde inte starta process för kommando \"%s\": felkod %lu" -#: ../common/restricted_token.c:178 +#: ../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "kunde inte köra igen med token för begränsad Ã¥tkomst: felkod %lu" -#: ../common/restricted_token.c:193 +#: ../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "kunde inte hämta statuskod för underprocess: felkod %lu" -#: ../common/rmtree.c:79 backup/basebackup.c:1100 backup/basebackup.c:1276 +#: ../common/rmtree.c:97 access/heap/rewriteheap.c:1214 +#: access/transam/twophase.c:1717 access/transam/xlogarchive.c:119 +#: access/transam/xlogarchive.c:399 postmaster/postmaster.c:1048 +#: postmaster/syslogger.c:1488 replication/logical/origin.c:591 +#: replication/logical/reorderbuffer.c:4589 +#: replication/logical/snapbuild.c:1712 replication/logical/snapbuild.c:2146 +#: replication/slot.c:2192 storage/file/fd.c:878 storage/file/fd.c:3378 +#: storage/file/fd.c:3440 storage/file/reinit.c:261 storage/ipc/dsm.c:343 +#: storage/smgr/md.c:381 storage/smgr/md.c:440 storage/sync/sync.c:243 +#: utils/time/snapmgr.c:1591 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "kunde inte ta status pÃ¥ fil eller katalog \"%s\": %m" +msgid "could not remove file \"%s\": %m" +msgstr "kunde inte ta bort fil \"%s\": %m" -#: ../common/rmtree.c:101 ../common/rmtree.c:113 +#: ../common/rmtree.c:124 commands/tablespace.c:767 commands/tablespace.c:780 +#: commands/tablespace.c:815 commands/tablespace.c:905 storage/file/fd.c:3370 +#: storage/file/fd.c:3779 #, c-format -msgid "could not remove file or directory \"%s\": %m" -msgstr "kunde inte ta bort fil eller katalog \"%s\": %m" +msgid "could not remove directory \"%s\": %m" +msgstr "kunde inte ta bort katalog \"%s\": %m" -#: ../common/scram-common.c:260 +#: ../common/scram-common.c:281 msgid "could not encode salt" msgstr "kunde inte koda saltet" -#: ../common/scram-common.c:276 +#: ../common/scram-common.c:297 msgid "could not encode stored key" msgstr "kunde inte koda den lagrade nyckeln" -#: ../common/scram-common.c:293 +#: ../common/scram-common.c:314 msgid "could not encode server key" msgstr "kunde inte koda servernyckeln" -#: ../common/stringinfo.c:306 +#: ../common/stringinfo.c:315 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." msgstr "Kan inte utöka strängbuffer som innehÃ¥ller %d byte med ytterligare %d bytes." -#: ../common/stringinfo.c:310 +#: ../common/stringinfo.c:319 #, c-format msgid "" "out of memory\n" @@ -549,7 +775,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "kunde inte slÃ¥ upp effektivt användar-id %ld: %s" -#: ../common/username.c:45 libpq/auth.c:1900 +#: ../common/username.c:45 libpq/auth.c:1888 msgid "user does not exist" msgstr "användaren finns inte" @@ -558,105 +784,105 @@ msgstr "användaren finns inte" msgid "user name lookup failure: error code %lu" msgstr "misslyckad sökning efter användarnamn: felkod %lu" -#: ../common/wait_error.c:45 +#: ../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "kommandot är inte körbart" -#: ../common/wait_error.c:49 +#: ../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "kommandot kan ej hittas" -#: ../common/wait_error.c:54 +#: ../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "barnprocess avslutade med kod %d" -#: ../common/wait_error.c:62 +#: ../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "barnprocess terminerades med avbrott 0x%X" -#: ../common/wait_error.c:66 +#: ../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "barnprocess terminerades av signal %d: %s" -#: ../common/wait_error.c:72 +#: ../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "barnprocess avslutade med okänd statuskod %d" -#: ../port/chklocale.c:306 +#: ../port/chklocale.c:283 #, c-format msgid "could not determine encoding for codeset \"%s\"" msgstr "kunde inte bestämma kodning för teckentabell \"%s\"" -#: ../port/chklocale.c:427 ../port/chklocale.c:433 +#: ../port/chklocale.c:404 ../port/chklocale.c:410 #, c-format msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" msgstr "kunde inte bestämma kodning för lokal \"%s\": teckentabellen är \"%s\"" -#: ../port/dirmod.c:218 +#: ../port/dirmod.c:284 #, c-format msgid "could not set junction for \"%s\": %s" msgstr "kunde inte sätta knutpunkt (junction) för \"%s\": %s" -#: ../port/dirmod.c:221 +#: ../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" -msgstr "kunde inte sätta knutpunkt (junktion) för \"%s\": %s\n" +msgstr "kunde inte sätta knutpunkt (junction) för \"%s\": %s\n" -#: ../port/dirmod.c:295 +#: ../port/dirmod.c:364 #, c-format msgid "could not get junction for \"%s\": %s" msgstr "kunde inte hämta knutpunkt (junction) för \"%s\": %s" -#: ../port/dirmod.c:298 +#: ../port/dirmod.c:367 #, c-format msgid "could not get junction for \"%s\": %s\n" msgstr "kunde inte hämta knutpunkt (junction) för \"%s\": %s\n" -#: ../port/open.c:117 +#: ../port/open.c:115 #, c-format msgid "could not open file \"%s\": %s" msgstr "kunde inte öppna fil \"%s\": %s" -#: ../port/open.c:118 +#: ../port/open.c:116 msgid "lock violation" msgstr "lÃ¥s-överträdelse" -#: ../port/open.c:118 +#: ../port/open.c:116 msgid "sharing violation" msgstr "sharing-överträdelse" -#: ../port/open.c:119 +#: ../port/open.c:117 #, c-format msgid "Continuing to retry for 30 seconds." msgstr "Fortsätter att försöka i 30 sekunder." -#: ../port/open.c:120 +#: ../port/open.c:118 #, c-format msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "Du kan ha antivirus, backup eller liknande mjukvara som stör databassystemet" -#: ../port/path.c:775 +#: ../port/path.c:852 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "kunde inte fastställa nuvarande arbetskatalog: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "kunde inte fastställa nuvarande arbetskatalog: %m\n" #: ../port/strerror.c:72 #, c-format msgid "operating system error %d" msgstr "operativsystemfel %d" -#: ../port/thread.c:100 ../port/thread.c:136 +#: ../port/user.c:43 ../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "kunde inte slÃ¥ upp lokalt användar-id %d: %s" -#: ../port/thread.c:105 ../port/thread.c:141 +#: ../port/user.c:48 ../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "lokal användare med ID %d existerar inte" @@ -676,114 +902,104 @@ msgstr "kunde inte hämta SID för PowerUser-grupp: felkod %lu\n" msgid "could not check access token membership: error code %lu\n" msgstr "kunde inte kontrollera access-token-medlemskap: felkod %lu\n" -#: access/brin/brin.c:214 +#: access/brin/brin.c:405 #, c-format msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "förfrÃ¥gan efter BRIN-intervallsummering för index \"%s\" sida %u har inte spelats in" -#: access/brin/brin.c:1018 access/brin/brin.c:1119 access/gin/ginfast.c:1038 -#: access/transam/xlogfuncs.c:165 access/transam/xlogfuncs.c:192 -#: access/transam/xlogfuncs.c:231 access/transam/xlogfuncs.c:252 -#: access/transam/xlogfuncs.c:273 access/transam/xlogfuncs.c:343 -#: access/transam/xlogfuncs.c:401 +#: access/brin/brin.c:1385 access/brin/brin.c:1493 access/gin/ginfast.c:1040 +#: access/transam/xlogfuncs.c:183 access/transam/xlogfuncs.c:208 +#: access/transam/xlogfuncs.c:241 access/transam/xlogfuncs.c:280 +#: access/transam/xlogfuncs.c:301 access/transam/xlogfuncs.c:322 +#: access/transam/xlogfuncs.c:388 access/transam/xlogfuncs.c:446 #, c-format msgid "recovery is in progress" msgstr "Ã¥terställning pÃ¥gÃ¥r" -#: access/brin/brin.c:1019 access/brin/brin.c:1120 +#: access/brin/brin.c:1386 access/brin/brin.c:1494 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "BRIN-kontrollfunktioner kan inte köras under Ã¥terställning." -#: access/brin/brin.c:1024 access/brin/brin.c:1125 +#: access/brin/brin.c:1391 access/brin/brin.c:1499 #, c-format msgid "block number out of range: %lld" msgstr "blocknummer är utanför giltigt intervall: %lld" -#: access/brin/brin.c:1068 access/brin/brin.c:1151 +#: access/brin/brin.c:1436 access/brin/brin.c:1525 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\" är inte ett BRIN-index" -#: access/brin/brin.c:1084 access/brin/brin.c:1167 +#: access/brin/brin.c:1452 access/brin/brin.c:1541 #, c-format msgid "could not open parent table of index \"%s\"" msgstr "kunde inte öppna föräldratabell för index \"%s\"" -#: access/brin/brin_bloom.c:750 access/brin/brin_bloom.c:792 -#: access/brin/brin_minmax_multi.c:3012 access/brin/brin_minmax_multi.c:3155 -#: statistics/dependencies.c:663 statistics/dependencies.c:716 -#: statistics/mcv.c:1484 statistics/mcv.c:1515 statistics/mvdistinct.c:344 -#: statistics/mvdistinct.c:397 utils/adt/pseudotypes.c:43 -#: utils/adt/pseudotypes.c:77 utils/adt/pseudotypes.c:252 +#: access/brin/brin.c:1461 access/brin/brin.c:1557 access/gin/ginfast.c:1085 +#: parser/parse_utilcmd.c:2277 #, c-format -msgid "cannot accept a value of type %s" -msgstr "kan inte acceptera ett värde av type %s" +msgid "index \"%s\" is not valid" +msgstr "index \"%s\" är inte giltigt" -#: access/brin/brin_minmax_multi.c:2171 access/brin/brin_minmax_multi.c:2178 -#: access/brin/brin_minmax_multi.c:2185 utils/adt/timestamp.c:938 -#: utils/adt/timestamp.c:1509 utils/adt/timestamp.c:2761 -#: utils/adt/timestamp.c:2778 utils/adt/timestamp.c:2831 -#: utils/adt/timestamp.c:2870 utils/adt/timestamp.c:3115 -#: utils/adt/timestamp.c:3120 utils/adt/timestamp.c:3125 -#: utils/adt/timestamp.c:3175 utils/adt/timestamp.c:3182 -#: utils/adt/timestamp.c:3189 utils/adt/timestamp.c:3209 -#: utils/adt/timestamp.c:3216 utils/adt/timestamp.c:3223 -#: utils/adt/timestamp.c:3253 utils/adt/timestamp.c:3261 -#: utils/adt/timestamp.c:3305 utils/adt/timestamp.c:3731 -#: utils/adt/timestamp.c:3855 utils/adt/timestamp.c:4405 +#: access/brin/brin_bloom.c:783 access/brin/brin_bloom.c:825 +#: access/brin/brin_minmax_multi.c:2993 access/brin/brin_minmax_multi.c:3130 +#: statistics/dependencies.c:661 statistics/dependencies.c:714 +#: statistics/mcv.c:1480 statistics/mcv.c:1511 statistics/mvdistinct.c:343 +#: statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:40 +#: utils/adt/pseudotypes.c:74 utils/adt/tsgistidx.c:94 #, c-format -msgid "interval out of range" -msgstr "interval utanför giltigt intervall" +msgid "cannot accept a value of type %s" +msgstr "kan inte acceptera ett värde av type %s" -#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 -#: access/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1442 access/spgist/spgdoinsert.c:2001 +#: access/brin/brin_pageops.c:75 access/brin/brin_pageops.c:361 +#: access/brin/brin_pageops.c:851 access/gin/ginentrypage.c:109 +#: access/gist/gist.c:1463 access/spgist/spgdoinsert.c:2001 #: access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "indexradstorlek %zu överstiger maximum %zu för index \"%s\"" -#: access/brin/brin_revmap.c:393 access/brin/brin_revmap.c:399 +#: access/brin/brin_revmap.c:383 access/brin/brin_revmap.c:389 #, c-format msgid "corrupted BRIN index: inconsistent range map" msgstr "trasigt BRIN-index: inkonsistent intervall-map" -#: access/brin/brin_revmap.c:602 +#: access/brin/brin_revmap.c:583 #, c-format msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" msgstr "oväntad sidtyp 0x%04X i BRIN-index \"%s\" block %u" -#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:151 -#: access/gist/gistvalidate.c:153 access/hash/hashvalidate.c:139 +#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:149 +#: access/gist/gistvalidate.c:152 access/hash/hashvalidate.c:139 #: access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with invalid support number %d" msgstr "operatorfamilj \"%s\" för accessmetod %s innehÃ¥ller funktion %s med ogiltigt supportnummer %d" -#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:163 -#: access/gist/gistvalidate.c:165 access/hash/hashvalidate.c:118 +#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:161 +#: access/gist/gistvalidate.c:164 access/hash/hashvalidate.c:118 #: access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with wrong signature for support number %d" msgstr "operatorfamilj \"%s\" för accessmetod %s innehÃ¥ller funktion %s med felaktig signatur för supportnummer %d" -#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:182 -#: access/gist/gistvalidate.c:185 access/hash/hashvalidate.c:160 +#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:180 +#: access/gist/gistvalidate.c:184 access/hash/hashvalidate.c:160 #: access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with invalid strategy number %d" msgstr "operatorfamilj \"%s\" för accessmetod %s innehÃ¥ller operator %s med ogiltigt strateginummer %d" -#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:195 +#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:193 #: access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 #: access/spgist/spgvalidate.c:237 #, c-format msgid "operator family \"%s\" of access method %s contains invalid ORDER BY specification for operator %s" msgstr "operatorfamilj \"%s\" för accessmetod %s innehÃ¥ller ogiltig ORDER BY-specifikatioon för operator %s" -#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:208 -#: access/gist/gistvalidate.c:233 access/hash/hashvalidate.c:186 +#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:206 +#: access/gist/gistvalidate.c:232 access/hash/hashvalidate.c:186 #: access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with wrong signature" @@ -806,38 +1022,38 @@ msgstr "operatorfamilj \"%s\" för accessmetod %s saknas supportfunktion(er) f msgid "operator class \"%s\" of access method %s is missing operator(s)" msgstr "operatorklass \"%s\" för accessmetoden %s saknar operator(er)" -#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 -#: access/gist/gistvalidate.c:274 +#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:248 +#: access/gist/gistvalidate.c:273 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d" msgstr "operatorklass \"%s\" för accessmetod %s saknar supportfunktion %d" -#: access/common/attmap.c:122 +#: access/common/attmap.c:121 #, c-format msgid "Returned type %s does not match expected type %s in column %d." msgstr "Returnerad typ %s matchar inte förväntad type %s i kolumn %d." -#: access/common/attmap.c:150 +#: access/common/attmap.c:149 #, c-format msgid "Number of returned columns (%d) does not match expected column count (%d)." msgstr "Antalet returnerade kolumner (%d) matchar inte förväntat antal kolumner (%d)." -#: access/common/attmap.c:229 access/common/attmap.c:241 +#: access/common/attmap.c:233 access/common/attmap.c:245 #, c-format msgid "could not convert row type" msgstr "kunde inte konvertera radtypen" -#: access/common/attmap.c:230 +#: access/common/attmap.c:234 #, c-format msgid "Attribute \"%s\" of type %s does not match corresponding attribute of type %s." msgstr "Attribut \"%s\" för typ %s matchar inte motsvarande attribut för typ %s." -#: access/common/attmap.c:242 +#: access/common/attmap.c:246 #, c-format msgid "Attribute \"%s\" of type %s does not exist in type %s." msgstr "Attribut \"%s\" i typ %s finns inte i typ %s." -#: access/common/heaptuple.c:1036 access/common/heaptuple.c:1371 +#: access/common/heaptuple.c:1132 access/common/heaptuple.c:1467 #, c-format msgid "number of columns (%d) exceeds limit (%d)" msgstr "antalet kolumner (%d) överskrider gränsen (%d)" @@ -847,106 +1063,110 @@ msgstr "antalet kolumner (%d) överskrider gränsen (%d)" msgid "number of index columns (%d) exceeds limit (%d)" msgstr "antalet indexerade kolumner (%d) överskrider gränsen (%d)" -#: access/common/indextuple.c:209 access/spgist/spgutils.c:958 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:970 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "indexrad kräver %zu byte, maximal storlek är %zu" -#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 -#: tcop/postgres.c:1921 +#: access/common/printtup.c:292 commands/explain.c:5376 tcop/fastpath.c:107 +#: tcop/fastpath.c:454 tcop/postgres.c:1956 #, c-format msgid "unsupported format code: %d" msgstr "ej stödd formatkod: %d" -#: access/common/reloptions.c:521 access/common/reloptions.c:532 +#: access/common/reloptions.c:519 access/common/reloptions.c:530 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "Giltiga värden är \"on\", \"off\" och \"auto\"." -#: access/common/reloptions.c:543 +#: access/common/reloptions.c:541 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "Giltiga värden är \"local\" och \"cascaded\"." -#: access/common/reloptions.c:691 +#: access/common/reloptions.c:689 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "överskriden gräns för användardefinierade relationsparametertyper" -#: access/common/reloptions.c:1234 +#: access/common/reloptions.c:1231 #, c-format msgid "RESET must not include values for parameters" msgstr "RESET fÃ¥r inte ha med värden pÃ¥ parametrar" -#: access/common/reloptions.c:1266 +#: access/common/reloptions.c:1263 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "okänd parameternamnrymd \"%s\"" -#: access/common/reloptions.c:1303 utils/misc/guc.c:12986 +#: access/common/reloptions.c:1300 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "tabeller deklarerade med WITH OIDS stöds inte" -#: access/common/reloptions.c:1473 +#: access/common/reloptions.c:1468 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "okänd parameter \"%s\"" -#: access/common/reloptions.c:1585 +#: access/common/reloptions.c:1580 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "parameter \"%s\" angiven mer än en gÃ¥ng" -#: access/common/reloptions.c:1601 +#: access/common/reloptions.c:1596 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "ogiltigt värde för booleansk flagga \"%s\": \"%s\"" -#: access/common/reloptions.c:1613 +#: access/common/reloptions.c:1608 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "ogiltigt värde för heltalsflagga \"%s\": \"%s\"" -#: access/common/reloptions.c:1619 access/common/reloptions.c:1639 +#: access/common/reloptions.c:1614 access/common/reloptions.c:1634 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "värdet %s är utanför sitt intervall för flaggan \"%s\"" -#: access/common/reloptions.c:1621 +#: access/common/reloptions.c:1616 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Giltiga värden är mellan \"%d\" och \"%d\"." -#: access/common/reloptions.c:1633 +#: access/common/reloptions.c:1628 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "ogiltigt värde för flyttalsflagga \"%s\": %s" -#: access/common/reloptions.c:1641 +#: access/common/reloptions.c:1636 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Giltiga värden är mellan \"%f\" och \"%f\"." -#: access/common/reloptions.c:1663 +#: access/common/reloptions.c:1658 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "ogiltigt värde för enum-flagga \"%s\": %s" -#: access/common/toast_compression.c:32 +#: access/common/reloptions.c:1989 +#, c-format +msgid "cannot specify storage parameters for a partitioned table" +msgstr "kan inte ange lagringsparametrar för partitionerad tabell" + +#: access/common/reloptions.c:1990 +#, c-format +msgid "Specify storage parameters for its leaf partitions instead." +msgstr "Ange lagringsparametrar för dess löv-partition istället." + +#: access/common/toast_compression.c:31 #, c-format msgid "compression method lz4 not supported" msgstr "komprimeringsmetod lz4 stöds ej" -#: access/common/toast_compression.c:33 +#: access/common/toast_compression.c:32 #, c-format msgid "This functionality requires the server to be built with lz4 support." msgstr "Denna funktionalitet kräver att servern byggts med lz4-stöd." -#: access/common/tupdesc.c:825 parser/parse_clause.c:773 -#: parser/parse_relation.c:1857 -#, c-format -msgid "column \"%s\" cannot be declared SETOF" -msgstr "kolumn \"%s\" kan inte deklareras som SETOF" - #: access/gin/ginbulk.c:44 #, c-format msgid "posting list is too long" @@ -954,25 +1174,25 @@ msgstr "post-listan är för lÃ¥ng" #: access/gin/ginbulk.c:45 #, c-format -msgid "Reduce maintenance_work_mem." -msgstr "Minska maintenance_work_mem." +msgid "Reduce \"maintenance_work_mem\"." +msgstr "Minska \"maintenance_work_mem\"." -#: access/gin/ginfast.c:1039 +#: access/gin/ginfast.c:1041 #, c-format msgid "GIN pending list cannot be cleaned up during recovery." msgstr "väntande GIN-lista kan inte städas upp under Ã¥terställning." -#: access/gin/ginfast.c:1046 +#: access/gin/ginfast.c:1048 #, c-format msgid "\"%s\" is not a GIN index" msgstr "\"%s\" är inte ett GIN-index" -#: access/gin/ginfast.c:1057 +#: access/gin/ginfast.c:1059 #, c-format msgid "cannot access temporary indexes of other sessions" msgstr "kan inte flytta temporära index tillhörande andra sessioner" -#: access/gin/ginget.c:271 access/nbtree/nbtinsert.c:760 +#: access/gin/ginget.c:271 access/nbtree/nbtinsert.c:762 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "misslyckades att Ã¥terfinna tuple i index \"%s\"" @@ -987,50 +1207,50 @@ msgstr "gamla GIN-index stöder inte hela-index-scan eller sökningar efter null msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "För att fixa detta, kör REINDEX INDEX \"%s\"." -#: access/gin/ginutil.c:145 executor/execExpr.c:2165 -#: utils/adt/arrayfuncs.c:3819 utils/adt/arrayfuncs.c:6488 -#: utils/adt/rowtypes.c:957 +#: access/gin/ginutil.c:147 executor/execExpr.c:2200 +#: utils/adt/arrayfuncs.c:4016 utils/adt/arrayfuncs.c:6712 +#: utils/adt/rowtypes.c:974 #, c-format msgid "could not identify a comparison function for type %s" msgstr "kunde inte hitta nÃ¥gon jämförelsefunktion för typen %s" -#: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 +#: access/gin/ginvalidate.c:90 access/gist/gistvalidate.c:92 #: access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 #, c-format msgid "operator family \"%s\" of access method %s contains support function %s with different left and right input types" msgstr "operatorfamilj \"%s\" för accessmetod %s innehÃ¥ller supportfunktion %s med olika vänster- och höger-inputtyper" -#: access/gin/ginvalidate.c:260 +#: access/gin/ginvalidate.c:258 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d or %d" msgstr "operatorklass \"%s\" för accessmetod \"%s\" saknar supportfunktion %d eller %d" -#: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:350 +#: access/gin/ginvalidate.c:331 access/gist/gistvalidate.c:349 #: access/spgist/spgvalidate.c:387 #, c-format msgid "support function number %d is invalid for access method %s" msgstr "supportfunktionsnummer %d är ogiltig för accessmetod %s" -#: access/gist/gist.c:759 access/gist/gistvacuum.c:426 +#: access/gist/gist.c:760 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "index \"%s\" innehÃ¥ller en inre tupel som är markerad ogiltig" -#: access/gist/gist.c:761 access/gist/gistvacuum.c:428 +#: access/gist/gist.c:762 access/gist/gistvacuum.c:428 #, c-format msgid "This is caused by an incomplete page split at crash recovery before upgrading to PostgreSQL 9.1." msgstr "Detta orsakas av en inkomplett siduppdelning under krashÃ¥terställning körd innan uppdatering till PostgreSQL 9.1." -#: access/gist/gist.c:762 access/gist/gistutil.c:801 access/gist/gistutil.c:812 -#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:227 -#: access/hash/hashutil.c:238 access/hash/hashutil.c:250 -#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:810 -#: access/nbtree/nbtpage.c:821 +#: access/gist/gist.c:763 access/gist/gistutil.c:800 access/gist/gistutil.c:811 +#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:226 +#: access/hash/hashutil.c:237 access/hash/hashutil.c:249 +#: access/hash/hashutil.c:270 access/nbtree/nbtpage.c:813 +#: access/nbtree/nbtpage.c:824 #, c-format msgid "Please REINDEX it." msgstr "Var vänlig och kör REINDEX pÃ¥ det." -#: access/gist/gist.c:1176 +#: access/gist/gist.c:1196 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "lagar ofärdig split i index \"%s\", block %u" @@ -1045,52 +1265,52 @@ msgstr "picksplit-metod för kolumn %d i index \"%s\" misslyckades" msgid "The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command." msgstr "Indexet är inte optimalt. För att optimera det, kontakta en utvecklare eller försök använda kolumnen som det andra värdet i CREATE INDEX-kommandot." -#: access/gist/gistutil.c:798 access/hash/hashutil.c:224 -#: access/nbtree/nbtpage.c:807 +#: access/gist/gistutil.c:797 access/hash/hashutil.c:223 +#: access/nbtree/nbtpage.c:810 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "index \"%s\" innehÃ¥ller en oväntad nollställd sida vid block %u" -#: access/gist/gistutil.c:809 access/hash/hashutil.c:235 -#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:818 +#: access/gist/gistutil.c:808 access/hash/hashutil.c:234 +#: access/hash/hashutil.c:246 access/nbtree/nbtpage.c:821 #, c-format msgid "index \"%s\" contains corrupted page at block %u" msgstr "index \"%s\" har en trasig sida vid block %u" -#: access/gist/gistvalidate.c:203 +#: access/gist/gistvalidate.c:202 #, c-format msgid "operator family \"%s\" of access method %s contains unsupported ORDER BY specification for operator %s" msgstr "operatorfamiljen \"%s\" för accessmetod %s innehÃ¥ller en ORDER BY som inte stöds för operator %s" -#: access/gist/gistvalidate.c:214 +#: access/gist/gistvalidate.c:213 #, c-format msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY opfamily specification for operator %s" msgstr "operatorfamiljen \"%s\" för accessmetod %s innehÃ¥ller en inkorrekt ORDER BY \"opfamiily\"-specifikation för operator %s" -#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:335 -#: utils/adt/varchar.c:1003 utils/adt/varchar.c:1064 +#: access/hash/hashfunc.c:277 access/hash/hashfunc.c:333 +#: utils/adt/varchar.c:1008 utils/adt/varchar.c:1065 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "kunde inte bestämma vilken jämförelse (collation) som skall användas för sträng-hashning" -#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:336 catalog/heap.c:668 -#: catalog/heap.c:674 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:1962 commands/tablecmds.c:17443 commands/view.c:86 -#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1690 -#: utils/adt/formatting.c:1812 utils/adt/formatting.c:1935 utils/adt/like.c:190 -#: utils/adt/like_support.c:1025 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:1004 utils/adt/varchar.c:1065 utils/adt/varlena.c:1499 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 catalog/heap.c:672 +#: catalog/heap.c:678 commands/createas.c:201 commands/createas.c:508 +#: commands/indexcmds.c:2021 commands/tablecmds.c:18178 commands/view.c:81 +#: regex/regc_pg_locale.c:245 utils/adt/formatting.c:1653 +#: utils/adt/formatting.c:1801 utils/adt/formatting.c:1991 utils/adt/like.c:189 +#: utils/adt/like_support.c:1024 utils/adt/varchar.c:738 +#: utils/adt/varchar.c:1009 utils/adt/varchar.c:1066 utils/adt/varlena.c:1521 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "Använd en COLLATE-klausul för att sätta jämförelsen explicit." -#: access/hash/hashinsert.c:83 +#: access/hash/hashinsert.c:84 #, c-format msgid "index row size %zu exceeds hash maximum %zu" msgstr "indexradstorlek %zu överstiger hash-maximum %zu" -#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 -#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1019 +#: access/hash/hashinsert.c:86 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1031 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "Värden större än en buffert-sida kan inte indexeras." @@ -1105,17 +1325,17 @@ msgstr "ogiltigt overflow-blocknummer %u" msgid "out of overflow pages in hash index \"%s\"" msgstr "slut pÃ¥ överspillsidor i hash-index \"%s\"" -#: access/hash/hashsearch.c:315 +#: access/hash/hashsearch.c:311 #, c-format msgid "hash indexes do not support whole-index scans" msgstr "hash-index stöder inte hela-index-scans" -#: access/hash/hashutil.c:263 +#: access/hash/hashutil.c:262 #, c-format msgid "index \"%s\" is not a hash index" msgstr "index \"%s\" är inte ett hashträd" -#: access/hash/hashutil.c:269 +#: access/hash/hashutil.c:268 #, c-format msgid "index \"%s\" has wrong hash version" msgstr "index \"%s\" har fel hash-version" @@ -1130,236 +1350,235 @@ msgstr "operatorfamilj \"%s\" för accessmetod %s saknar supportfunktion för op msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "operatorfamilj \"%s\" för accessmetod %s saknar mellan-typ-operator(er)" -#: access/heap/heapam.c:2226 +#: access/heap/heapam.c:2206 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "kan inte lägga till tupler i en parellell arbetare" -#: access/heap/heapam.c:2697 +#: access/heap/heapam.c:2725 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "kan inte radera tupler under en parallell operation" -#: access/heap/heapam.c:2743 +#: access/heap/heapam.c:2772 #, c-format msgid "attempted to delete invisible tuple" msgstr "försökte ta bort en osynlig tuple" -#: access/heap/heapam.c:3183 access/heap/heapam.c:6025 +#: access/heap/heapam.c:3220 access/heap/heapam.c:6501 access/index/genam.c:818 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "kan inte uppdatera tupler under en parallell operation" -#: access/heap/heapam.c:3307 +#: access/heap/heapam.c:3397 #, c-format msgid "attempted to update invisible tuple" msgstr "försökte uppdatera en osynlig tuple" -#: access/heap/heapam.c:4669 access/heap/heapam.c:4707 -#: access/heap/heapam.c:4972 access/heap/heapam_handler.c:456 +#: access/heap/heapam.c:4908 access/heap/heapam.c:4946 +#: access/heap/heapam.c:5211 access/heap/heapam_handler.c:468 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "kunde inte lÃ¥sa rad i relationen \"%s\"" -#: access/heap/heapam_handler.c:401 +#: access/heap/heapam.c:6314 commands/trigger.c:3340 +#: executor/nodeModifyTable.c:2376 executor/nodeModifyTable.c:2467 +#, c-format +msgid "tuple to be updated was already modified by an operation triggered by the current command" +msgstr "tupel som skall uppdateras hade redan ändrats av en operation som triggats av aktuellt kommando" + +#: access/heap/heapam_handler.c:413 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update" msgstr "tupel som skall lÃ¥sas har redan flyttats till en annan partition av en samtida uppdatering" -#: access/heap/hio.c:360 access/heap/rewriteheap.c:660 +#: access/heap/hio.c:535 access/heap/rewriteheap.c:640 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "raden är för stor: storlek %zu, maximal storlek %zu" -#: access/heap/rewriteheap.c:920 +#: access/heap/rewriteheap.c:885 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "kunde inte skriva till fil \"%s\", skrev %d av %d: %m." -#: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 -#: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:2963 access/transam/xlog.c:3176 -#: access/transam/xlog.c:3964 access/transam/xlog.c:8653 -#: access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 -#: backup/basebackup_server.c:242 commands/dbcommands.c:517 -#: postmaster/postmaster.c:4604 postmaster/postmaster.c:5625 -#: replication/logical/origin.c:587 replication/slot.c:1631 -#: storage/file/copydir.c:167 storage/smgr/md.c:222 utils/time/snapmgr.c:1261 +#: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 +#: access/transam/timeline.c:329 access/transam/timeline.c:481 +#: access/transam/xlog.c:3255 access/transam/xlog.c:3446 +#: access/transam/xlog.c:4283 access/transam/xlog.c:9269 +#: access/transam/xlogfuncs.c:692 backup/basebackup_server.c:149 +#: backup/basebackup_server.c:242 commands/dbcommands.c:494 +#: postmaster/launch_backend.c:340 postmaster/postmaster.c:4114 +#: postmaster/walsummarizer.c:1212 replication/logical/origin.c:603 +#: replication/slot.c:2059 storage/file/copydir.c:157 storage/smgr/md.c:230 +#: utils/time/snapmgr.c:1234 #, c-format msgid "could not create file \"%s\": %m" -msgstr "kan inte skapa fil \"%s\": %m" +msgstr "kunde inte skapa fil \"%s\": %m" -#: access/heap/rewriteheap.c:1141 +#: access/heap/rewriteheap.c:1104 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "kunde inte trunkera fil \"%s\" till %u: %m" -#: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 -#: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3035 access/transam/xlog.c:3232 -#: access/transam/xlog.c:3976 commands/dbcommands.c:529 -#: postmaster/postmaster.c:4614 postmaster/postmaster.c:4624 -#: replication/logical/origin.c:599 replication/logical/origin.c:641 -#: replication/logical/origin.c:660 replication/logical/snapbuild.c:1736 -#: replication/slot.c:1666 storage/file/buffile.c:537 -#: storage/file/copydir.c:207 utils/init/miscinit.c:1441 -#: utils/init/miscinit.c:1452 utils/init/miscinit.c:1460 utils/misc/guc.c:8721 -#: utils/misc/guc.c:8752 utils/misc/guc.c:10741 utils/misc/guc.c:10755 -#: utils/time/snapmgr.c:1266 utils/time/snapmgr.c:1273 +#: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 +#: access/transam/timeline.c:424 access/transam/timeline.c:498 +#: access/transam/xlog.c:3305 access/transam/xlog.c:3502 +#: access/transam/xlog.c:4295 commands/dbcommands.c:506 +#: postmaster/launch_backend.c:351 postmaster/launch_backend.c:363 +#: replication/logical/origin.c:615 replication/logical/origin.c:657 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1788 +#: replication/slot.c:2094 storage/file/buffile.c:545 +#: storage/file/copydir.c:197 utils/init/miscinit.c:1655 +#: utils/init/miscinit.c:1666 utils/init/miscinit.c:1674 utils/misc/guc.c:4491 +#: utils/misc/guc.c:4522 utils/misc/guc.c:5675 utils/misc/guc.c:5693 +#: utils/time/snapmgr.c:1239 utils/time/snapmgr.c:1246 #, c-format msgid "could not write to file \"%s\": %m" msgstr "kunde inte skriva till fil \"%s\": %m" -#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1705 -#: access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:429 -#: postmaster/postmaster.c:1157 postmaster/syslogger.c:1537 -#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4421 -#: replication/logical/snapbuild.c:1681 replication/logical/snapbuild.c:2097 -#: replication/slot.c:1763 storage/file/fd.c:795 storage/file/fd.c:3263 -#: storage/file/fd.c:3325 storage/file/reinit.c:262 storage/ipc/dsm.c:317 -#: storage/smgr/md.c:370 storage/smgr/md.c:429 storage/sync/sync.c:250 -#: utils/time/snapmgr.c:1606 -#, c-format -msgid "could not remove file \"%s\": %m" -msgstr "kunde inte ta bort fil \"%s\": %m" - -#: access/heap/vacuumlazy.c:407 +#: access/heap/vacuumlazy.c:473 #, c-format msgid "aggressively vacuuming \"%s.%s.%s\"" msgstr "aggressiv vaccum av \"%s.%s.%s\"" -#: access/heap/vacuumlazy.c:412 +#: access/heap/vacuumlazy.c:478 #, c-format msgid "vacuuming \"%s.%s.%s\"" msgstr "kör vaccum pÃ¥ \"%s.%s.%s\"" -#: access/heap/vacuumlazy.c:663 +#: access/heap/vacuumlazy.c:626 #, c-format msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" msgstr "avslutade vacuum av \"%s.%s.%s\": indexskanningar: %d\n" -#: access/heap/vacuumlazy.c:674 +#: access/heap/vacuumlazy.c:637 #, c-format msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisk aggressiv vacuum för att förhindra \"wraparound\" av tabell \"%s.%s.%s\": indexskanningar: %d\n" -#: access/heap/vacuumlazy.c:676 +#: access/heap/vacuumlazy.c:639 #, c-format msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisk vacuum för att förhindra \"wraparound\" av tabell \"%s.%s.%s\": indexskanningar: %d\n" -#: access/heap/vacuumlazy.c:681 +#: access/heap/vacuumlazy.c:644 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisk vacuum av tabell \"%s.%s.%s\": indexskanningar: %d\n" -#: access/heap/vacuumlazy.c:683 +#: access/heap/vacuumlazy.c:646 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "automatisk vacuum av tabell \"%s.%s.%s\": indexskanningar: %d\n" -#: access/heap/vacuumlazy.c:690 +#: access/heap/vacuumlazy.c:653 #, c-format msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" msgstr "sidor: %u borttagna, %u kvar, %u skannade (%-2f%% av totala antalet)\n" -#: access/heap/vacuumlazy.c:697 +#: access/heap/vacuumlazy.c:660 #, c-format msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" msgstr "tupler: %lld borttagna, %lld kvar, %lld är döda men ännu inte möjliga att ta bort\n" -#: access/heap/vacuumlazy.c:703 +#: access/heap/vacuumlazy.c:666 #, c-format msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" msgstr "tupler missade: %lld döda frÃ¥n %u sidor som inte tagits bort pÃ¥ grund av lÃ¥stvister vid städning\n" -#: access/heap/vacuumlazy.c:708 +#: access/heap/vacuumlazy.c:672 #, c-format msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" msgstr "gräns för borttagning: %u, som var %d XID:er gammal när operationen avslutades\n" -#: access/heap/vacuumlazy.c:714 +#: access/heap/vacuumlazy.c:679 #, c-format msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" msgstr "ny relfrozenxid: %u, som är %d XID:er före tidigare värde\n" -#: access/heap/vacuumlazy.c:721 +#: access/heap/vacuumlazy.c:687 #, c-format msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" msgstr "ny relminmxid: %u, som är %d MXID:er för tidigare värde\n" -#: access/heap/vacuumlazy.c:727 +#: access/heap/vacuumlazy.c:690 +#, c-format +msgid "frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n" +msgstr "frysta: %u sidor i tabellen (%.2f%% av totalt) hade %lld frysta tupler\n" + +#: access/heap/vacuumlazy.c:698 msgid "index scan not needed: " msgstr "index-scan behövdes inte: " -#: access/heap/vacuumlazy.c:729 +#: access/heap/vacuumlazy.c:700 msgid "index scan needed: " msgstr "index-scan behövdes: " -#: access/heap/vacuumlazy.c:731 +#: access/heap/vacuumlazy.c:702 #, c-format msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" msgstr "%u sidor i tabell (%.2f%% av totalt) hade %lld döda postidentifierare borttagna\n" -#: access/heap/vacuumlazy.c:736 +#: access/heap/vacuumlazy.c:707 msgid "index scan bypassed: " msgstr "index-scan överhoppad: " -#: access/heap/vacuumlazy.c:738 +#: access/heap/vacuumlazy.c:709 msgid "index scan bypassed by failsafe: " msgstr "index-scan överhoppad av felsäkerhetsfunktion: " -#: access/heap/vacuumlazy.c:740 +#: access/heap/vacuumlazy.c:711 #, c-format msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" msgstr "%u sidor frÃ¥n tabell (%.2f%% totalt) har %lld döda postidentifierare\n" -#: access/heap/vacuumlazy.c:755 +#: access/heap/vacuumlazy.c:726 #, c-format msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" msgstr "index \"%s\": sidor: %u totalt, %u tidigare borttagna, %u nuvarande borttagna, %u Ã¥teranvändbara\n" -#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 +#: access/heap/vacuumlazy.c:738 commands/analyze.c:794 #, c-format msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" msgstr "I/O-timing: läs: %.3f ms, skriv: %.3f ms\n" -#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 +#: access/heap/vacuumlazy.c:748 commands/analyze.c:797 #, c-format msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" msgstr "snitt läshastighet: %.3f MB/s, snitt skrivhastighet: %.3f MB/s\n" -#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 +#: access/heap/vacuumlazy.c:751 commands/analyze.c:799 #, c-format msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" msgstr "bufferanvändning: %lld träffar, %lld missar, %lld nersmutsade\n" -#: access/heap/vacuumlazy.c:785 +#: access/heap/vacuumlazy.c:756 #, c-format msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" msgstr "WAL-användning: %lld poster, %lld hela sidor, %llu bytes\n" -#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 +#: access/heap/vacuumlazy.c:760 commands/analyze.c:803 #, c-format msgid "system usage: %s" msgstr "systemanvändning: %s" -#: access/heap/vacuumlazy.c:2463 +#: access/heap/vacuumlazy.c:2170 #, c-format msgid "table \"%s\": removed %lld dead item identifiers in %u pages" msgstr "tabell \"%s\": tog bort %lld döda postidentifierare i %u sidor" -#: access/heap/vacuumlazy.c:2629 +#: access/heap/vacuumlazy.c:2324 #, c-format msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" msgstr "hoppar över ej nödvändigt underhÃ¥ll av tabell \"%s.%s.%s\" som skyddsÃ¥tgärd efter %d index-scan" -#: access/heap/vacuumlazy.c:2634 +#: access/heap/vacuumlazy.c:2327 #, c-format msgid "The table's relfrozenxid or relminmxid is too far in the past." msgstr "Tabellens relfrozenxid eller relminmxid är för lÃ¥ngt bak i tiden." -#: access/heap/vacuumlazy.c:2635 +#: access/heap/vacuumlazy.c:2328 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1368,67 +1587,67 @@ msgstr "" "Överväg att öka konfigurationsparametern \"maintenance_work_mem\" eller \"autovacuum_work_mem\".\n" "Du kan ocksÃ¥ överväga andra metoder för att VACUUM skall hinna med allokeringen av transactions-ID." -#: access/heap/vacuumlazy.c:2878 +#: access/heap/vacuumlazy.c:2590 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\": stoppar trunkering pga konfliktande lÃ¥skrav" -#: access/heap/vacuumlazy.c:2948 +#: access/heap/vacuumlazy.c:2660 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "tabell \"%s\": trunkerade %u till %u sidor" -#: access/heap/vacuumlazy.c:3010 +#: access/heap/vacuumlazy.c:2722 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "tabell \"%s\": pausar trunkering pga konfliktande lÃ¥skrav" -#: access/heap/vacuumlazy.c:3170 +#: access/heap/vacuumlazy.c:2841 #, c-format msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" msgstr "stänger av parallell-flaggan för vacuumn pÃ¥ \"%s\" --- kan inte köra vacuum pÃ¥ temporära tabeller parallellt" -#: access/heap/vacuumlazy.c:3383 +#: access/heap/vacuumlazy.c:3108 #, c-format msgid "while scanning block %u offset %u of relation \"%s.%s\"" msgstr "vid skanning av block %u offset %u i relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3386 +#: access/heap/vacuumlazy.c:3111 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "vid skanning av block %u i relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3390 +#: access/heap/vacuumlazy.c:3115 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "vid skanning av relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3398 +#: access/heap/vacuumlazy.c:3123 #, c-format msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" msgstr "vid vacuum av block %u offset %u i relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3401 +#: access/heap/vacuumlazy.c:3126 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "vid vacuum av block %u i relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3405 +#: access/heap/vacuumlazy.c:3130 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "vid vacuum av relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1058 +#: access/heap/vacuumlazy.c:3135 commands/vacuumparallel.c:1112 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "vid vaccum av index \"%s\" i relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1064 +#: access/heap/vacuumlazy.c:3140 commands/vacuumparallel.c:1118 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "vid uppstädning av index \"%s\" i relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3421 +#: access/heap/vacuumlazy.c:3146 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "vid trunkering av relation \"%s.%s\" till %u block" @@ -1448,65 +1667,70 @@ msgstr "indexaccessmetod \"%s\" har ingen hanterare" msgid "transaction aborted during system catalog scan" msgstr "transaktionen avbruten under scan av systemkatalog" -#: access/index/indexam.c:142 catalog/objectaddress.c:1376 -#: commands/indexcmds.c:2790 commands/tablecmds.c:271 commands/tablecmds.c:295 -#: commands/tablecmds.c:17131 commands/tablecmds.c:18910 +#: access/index/genam.c:657 access/index/indexam.c:82 +#, c-format +msgid "cannot access index \"%s\" while it is being reindexed" +msgstr "kan inte använda index \"%s\" som hÃ¥ller pÃ¥ att indexeras om" + +#: access/index/indexam.c:203 catalog/objectaddress.c:1356 +#: commands/indexcmds.c:2851 commands/tablecmds.c:281 commands/tablecmds.c:305 +#: commands/tablecmds.c:17873 commands/tablecmds.c:19762 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" är inte ett index" -#: access/index/indexam.c:973 +#: access/index/indexam.c:1028 #, c-format msgid "operator class %s has no options" msgstr "operatorklass %s har inga flaggor" -#: access/nbtree/nbtinsert.c:666 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "duplicerat nyckelvärde bryter mot unik-villkor \"%s\"" -#: access/nbtree/nbtinsert.c:668 +#: access/nbtree/nbtinsert.c:670 #, c-format msgid "Key %s already exists." msgstr "Nyckeln %s existerar redan." -#: access/nbtree/nbtinsert.c:762 +#: access/nbtree/nbtinsert.c:764 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "Det kan bero pÃ¥ ett icke-immutable indexuttryck." -#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 -#: parser/parse_utilcmd.c:2332 +#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 +#: parser/parse_utilcmd.c:2323 #, c-format msgid "index \"%s\" is not a btree" msgstr "index \"%s\" är inte ett btree" -#: access/nbtree/nbtpage.c:166 access/nbtree/nbtpage.c:615 +#: access/nbtree/nbtpage.c:164 access/nbtree/nbtpage.c:618 #, c-format msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" msgstr "versionsfel i index \"%s\": filversion %d, aktuell version %d, minsta supportade version %d" -#: access/nbtree/nbtpage.c:1874 +#: access/nbtree/nbtpage.c:1861 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "index \"%s\" innehÃ¥ller en halvdöd intern sida" -#: access/nbtree/nbtpage.c:1876 +#: access/nbtree/nbtpage.c:1863 #, c-format msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." msgstr "Detta kan ha orsakats av en avbruten VACUUM i version 9.3 eller äldre, innan uppdatering. Vänligen REINDEX:era det." -#: access/nbtree/nbtutils.c:2669 +#: access/nbtree/nbtutils.c:5108 #, c-format msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" msgstr "indexradstorlek %zu överstiger btree version %u maximum %zu för index \"%s\"" -#: access/nbtree/nbtutils.c:2675 +#: access/nbtree/nbtutils.c:5114 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "Indexrad refererar tupel (%u,%u) i relation \"%s\"." -#: access/nbtree/nbtutils.c:2679 +#: access/nbtree/nbtutils.c:5118 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1521,12 +1745,18 @@ msgstr "" msgid "operator family \"%s\" of access method %s is missing support function for types %s and %s" msgstr "operatorfamilj \"%s\" för accessmetod %s saknar supportfunktioner för typerna %s och %s" -#: access/spgist/spgutils.c:244 +#: access/sequence/sequence.c:75 access/table/table.c:145 +#: optimizer/util/plancat.c:144 +#, c-format +msgid "cannot open relation \"%s\"" +msgstr "kan inte öppna relationen \"%s\"" + +#: access/spgist/spgutils.c:245 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "komprimeringsmetod mÃ¥ste definieras när lövtypen skiljer sig frÃ¥n indatatypen" -#: access/spgist/spgutils.c:1016 +#: access/spgist/spgutils.c:1028 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "SP-GiST inre tuplestorlek %zu överstiger maximala %zu" @@ -1541,322 +1771,313 @@ msgstr "SP-GiST lövdatatyp %s matchar deklarerad typ %s" msgid "operator family \"%s\" of access method %s is missing support function %d for type %s" msgstr "operatorfamilj \"%s\" för accessmetod %s saknar supportfunktion %d för typ %s" -#: access/table/table.c:49 access/table/table.c:83 access/table/table.c:112 -#: access/table/table.c:145 catalog/aclchk.c:1835 -#, c-format -msgid "\"%s\" is an index" -msgstr "\"%s\" är ett index" - -#: access/table/table.c:54 access/table/table.c:88 access/table/table.c:117 -#: access/table/table.c:150 catalog/aclchk.c:1842 commands/tablecmds.c:13829 -#: commands/tablecmds.c:17140 -#, c-format -msgid "\"%s\" is a composite type" -msgstr "\"%s\" är en composite-typ" - -#: access/table/tableam.c:266 +#: access/table/tableam.c:255 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "tid (%u, %u) är inte giltigt för relation \"%s\"" -#: access/table/tableamapi.c:115 +#: access/table/tableamapi.c:109 #, c-format -msgid "%s cannot be empty." -msgstr "%s fÃ¥r inte vara tom." +msgid "\"%s\" cannot be empty." +msgstr "\"%s\" fÃ¥r inte vara tom." -#: access/table/tableamapi.c:122 utils/misc/guc.c:12910 +#: access/table/tableamapi.c:116 access/transam/xlogrecovery.c:4859 #, c-format -msgid "%s is too long (maximum %d characters)." -msgstr "%s är för lÃ¥ng (maximalt %d tecken)." +msgid "\"%s\" is too long (maximum %d characters)." +msgstr "\"%s\" är för lÃ¥ng (maximalt %d tecken)." -#: access/table/tableamapi.c:145 +#: access/table/tableamapi.c:139 #, c-format msgid "table access method \"%s\" does not exist" msgstr "tabellaccessmetod \"%s\" existerar inte" -#: access/table/tableamapi.c:150 +#: access/table/tableamapi.c:144 #, c-format msgid "Table access method \"%s\" does not exist." msgstr "Tabellaccessmetod \"%s\" existerar inte." -#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:152 +#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:151 #, c-format msgid "sample percentage must be between 0 and 100" msgstr "urvalsprocent mÃ¥ste vara mellan 0 och 100" -#: access/transam/commit_ts.c:282 +#: access/transam/commit_ts.c:287 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "kan inte hämta commit-tidsstämpel för transaktion %u" -#: access/transam/commit_ts.c:380 +#: access/transam/commit_ts.c:385 #, c-format msgid "could not get commit timestamp data" msgstr "kunde inte hämta commit-tidsstämpeldata" -#: access/transam/commit_ts.c:382 +#: access/transam/commit_ts.c:387 #, c-format msgid "Make sure the configuration parameter \"%s\" is set on the primary server." msgstr "Se till att konfigurationsparametern \"%s\" är satt pÃ¥ primär-servern." -#: access/transam/commit_ts.c:384 +#: access/transam/commit_ts.c:389 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "Se till att konfigurationsparametern \"%s\" är satt." -#: access/transam/multixact.c:1022 +#: access/transam/multixact.c:1091 #, c-format -msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"" -msgstr "databasen tar inte emot kommandon som genererar nya MultiXactId:er för att förhinda dataförlust vid \"wraparound\" i databasen \"%s\"" +msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database \"%s\"" +msgstr "databasen tar inte emot kommandon som tilldelar nya MultiXactId:er för att förhinda dataförlust vid \"wraparound\" i databasen \"%s\"" -#: access/transam/multixact.c:1024 access/transam/multixact.c:1031 -#: access/transam/multixact.c:1055 access/transam/multixact.c:1064 +#: access/transam/multixact.c:1093 access/transam/multixact.c:1100 +#: access/transam/multixact.c:1124 access/transam/multixact.c:1133 +#: access/transam/varsup.c:158 access/transam/varsup.c:165 #, c-format msgid "" "Execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." msgstr "" -"Utför en hela databasen-VACUUM i den databasen.\n" +"Utför en databas-VACUUM i hela den databasen.\n" "Du kan ocksÃ¥ behöva commit:a eller rulla tillbaka gamla förberedda transaktioner eller slänga gamla replikeringsslottar." -#: access/transam/multixact.c:1029 +#: access/transam/multixact.c:1098 #, c-format -msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u" -msgstr "databasen tar inte emot kommandon som genererar nya MultiXactId:er för att förhinda dataförlust vid \"wraparound\" i databasen med OID %u" +msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database with OID %u" +msgstr "databasen tar inte emot kommandon som tilldelar nya MultiXactId:er för att förhinda dataförlust vid \"wraparound\" i databasen med OID %u" -#: access/transam/multixact.c:1050 access/transam/multixact.c:2334 +#: access/transam/multixact.c:1119 access/transam/multixact.c:2474 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" msgstr[0] "databasen \"%s\" mÃ¥ste städas innan ytterligare %u MultiXactId används" msgstr[1] "databasen \"%s\" mÃ¥ste städas innan ytterligare %u MultiXactId:er används" -#: access/transam/multixact.c:1059 access/transam/multixact.c:2343 +#: access/transam/multixact.c:1128 access/transam/multixact.c:2483 #, c-format msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" msgstr[0] "databas med OID %u mÃ¥ste städas (vacuum) innan %u till MultiXactId används" msgstr[1] "databas med OID %u mÃ¥ste städas (vacuum) innan %u till MultiXactId:er används" -#: access/transam/multixact.c:1120 +#: access/transam/multixact.c:1189 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "multixact \"members\"-gräns överskriden" -#: access/transam/multixact.c:1121 +#: access/transam/multixact.c:1190 #, c-format msgid "This command would create a multixact with %u members, but the remaining space is only enough for %u member." msgid_plural "This command would create a multixact with %u members, but the remaining space is only enough for %u members." msgstr[0] "Detta kommando skapar en multixact med %u medlemmar, men Ã¥terstÃ¥ende utrymmer räcker bara till %u medlem." msgstr[1] "Detta kommando skapar en multixact med %u medlemmar, men Ã¥terstÃ¥ende utrymmer räcker bara till %u medlemmar." -#: access/transam/multixact.c:1126 +#: access/transam/multixact.c:1195 #, c-format -msgid "Execute a database-wide VACUUM in database with OID %u with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." -msgstr "Kör en hela-databas-VACUUM i databas med OID %u med reducerade iställningar vacuum_multixact_freeze_min_age och vacuum_multixact_freeze_table_age." +msgid "Execute a database-wide VACUUM in database with OID %u with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." +msgstr "Kör en databas-VACUUM i hela databasen med OID %u med reducerade inställningar för \"vacuum_multixact_freeze_min_age\" och \"vacuum_multixact_freeze_table_age\"." -#: access/transam/multixact.c:1157 +#: access/transam/multixact.c:1226 #, c-format msgid "database with OID %u must be vacuumed before %d more multixact member is used" msgid_plural "database with OID %u must be vacuumed before %d more multixact members are used" msgstr[0] "databas med OID %u mÃ¥ste städas innan %d mer multixact-medlem används" msgstr[1] "databas med OID %u mÃ¥ste städas innan %d fler multixact-medlemmar används" -#: access/transam/multixact.c:1162 +#: access/transam/multixact.c:1231 #, c-format -msgid "Execute a database-wide VACUUM in that database with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." -msgstr "Kör en hela-databas-VACUUM i den databasen med reducerade inställningar för vacuum_multixact_freeze_min_age och vacuum_multixact_freeze_table_age." +msgid "Execute a database-wide VACUUM in that database with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." +msgstr "Kör en databas-VACUUM i hela den databasen med reducerade inställningar för \"vacuum_multixact_freeze_min_age\" och \"vacuum_multixact_freeze_table_age\"." -#: access/transam/multixact.c:1301 +#: access/transam/multixact.c:1371 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %u finns inte längre -- troligen en wraparound" -#: access/transam/multixact.c:1307 +#: access/transam/multixact.c:1377 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %u har inte skapats än -- troligen en wraparound" -#: access/transam/multixact.c:2339 access/transam/multixact.c:2348 -#: access/transam/varsup.c:151 access/transam/varsup.c:158 -#: access/transam/varsup.c:466 access/transam/varsup.c:473 +#: access/transam/multixact.c:2479 access/transam/multixact.c:2488 #, c-format msgid "" -"To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" +"To avoid MultiXactId assignment failures, execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." msgstr "" -"För att undvika att databasen stängs ner, utför en hela databas-VACCUM i den databasen.\n" +"För att undvika fel vid tilldelning av MultiXactId sÃ¥ utför en databas-VACCUM för hela den databasen.\n" "Du kan ocksÃ¥ behöva commit:a eller rulla tillbaka gamla förberedda transaktioner eller slänga gamla replikeringsslottar." -#: access/transam/multixact.c:2622 +#: access/transam/multixact.c:2767 #, c-format msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" msgstr "MultiXact-medlems wraparound-skydd är avslagen eftersom äldsta checkpoint:ade MultiXact %u inte finns pÃ¥ disk" -#: access/transam/multixact.c:2644 +#: access/transam/multixact.c:2789 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "MultiXact-medlems wraparound-skydd är nu pÃ¥slagen" -#: access/transam/multixact.c:3031 +#: access/transam/multixact.c:3180 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "äldsta MultiXact %u hittas inte, tidigast MultiXact %u, skippar trunkering" -#: access/transam/multixact.c:3049 +#: access/transam/multixact.c:3198 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" msgstr "kan inte trunkera upp till %u eftersom den inte finns pÃ¥ disk, skippar trunkering" -#: access/transam/multixact.c:3363 +#: access/transam/multixact.c:3517 #, c-format msgid "invalid MultiXactId: %u" msgstr "ogiltig MultiXactId: %u" -#: access/transam/parallel.c:718 access/transam/parallel.c:837 +#: access/transam/parallel.c:748 access/transam/parallel.c:867 #, c-format msgid "parallel worker failed to initialize" msgstr "parallell arbetare misslyckades med initiering" -#: access/transam/parallel.c:719 access/transam/parallel.c:838 +#: access/transam/parallel.c:749 access/transam/parallel.c:868 #, c-format msgid "More details may be available in the server log." msgstr "Fler detaljer kan finnas i serverloggen." -#: access/transam/parallel.c:899 +#: access/transam/parallel.c:929 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "postmaster avslutade under en parallell transaktion" -#: access/transam/parallel.c:1086 +#: access/transam/parallel.c:1116 #, c-format msgid "lost connection to parallel worker" msgstr "tappad kopplingen till parallell arbetare" -#: access/transam/parallel.c:1152 access/transam/parallel.c:1154 +#: access/transam/parallel.c:1172 access/transam/parallel.c:1174 msgid "parallel worker" msgstr "parallell arbetare" -#: access/transam/parallel.c:1307 +#: access/transam/parallel.c:1344 replication/logical/applyparallelworker.c:890 #, c-format msgid "could not map dynamic shared memory segment" msgstr "kunde inte skapa dynamiskt delat minnessegment: %m" -#: access/transam/parallel.c:1312 +#: access/transam/parallel.c:1349 replication/logical/applyparallelworker.c:896 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "ogiltigt magiskt nummer i dynamiskt delat minnessegment" -#: access/transam/rmgr.c:84 +#: access/transam/rmgr.c:93 #, c-format msgid "resource manager with ID %d not registered" msgstr "resurshanterare med ID %d är inte registrerad" -#: access/transam/rmgr.c:85 +#: access/transam/rmgr.c:94 #, c-format -msgid "Include the extension module that implements this resource manager in shared_preload_libraries." -msgstr "Inkludera utökningsmodulen som implementerar denna resurshanterar i shared_preload_libraries." +msgid "Include the extension module that implements this resource manager in \"shared_preload_libraries\"." +msgstr "Inkludera utökningsmodulen som implementerar denna resurshanterare i \"shared_preload_libraries\"." -#: access/transam/rmgr.c:101 +#: access/transam/rmgr.c:110 #, c-format msgid "custom resource manager name is invalid" msgstr "namn pÃ¥ egendefinierad resurshanterare är ogiltigt" -#: access/transam/rmgr.c:102 +#: access/transam/rmgr.c:111 #, c-format msgid "Provide a non-empty name for the custom resource manager." msgstr "Ange ett icke-tomt namn för den egendefinierade resurshanteraren." -#: access/transam/rmgr.c:105 +#: access/transam/rmgr.c:114 #, c-format msgid "custom resource manager ID %d is out of range" msgstr "egendefinierat resurshanterar-ID %d är utanför giltigt intervall" -#: access/transam/rmgr.c:106 +#: access/transam/rmgr.c:115 #, c-format msgid "Provide a custom resource manager ID between %d and %d." msgstr "Ange ett egendefinierat resurshanterar-ID mellan %d och %d." -#: access/transam/rmgr.c:111 access/transam/rmgr.c:116 -#: access/transam/rmgr.c:128 +#: access/transam/rmgr.c:120 access/transam/rmgr.c:125 +#: access/transam/rmgr.c:137 #, c-format msgid "failed to register custom resource manager \"%s\" with ID %d" msgstr "misslyckades med att registera en egendefinierad resurshanterare \"%s\" med ID %d" -#: access/transam/rmgr.c:112 +#: access/transam/rmgr.c:121 #, c-format -msgid "Custom resource manager must be registered while initializing modules in shared_preload_libraries." -msgstr "Egendefinierad resurshanterare mÃ¥ste vara registerad när man initierar moduler i shared_preload_libraries." +msgid "Custom resource manager must be registered while initializing modules in \"shared_preload_libraries\"." +msgstr "Egendefinierad resurshanterare mÃ¥ste vara registerad när man initierar moduler i \"shared_preload_libraries\"." -#: access/transam/rmgr.c:117 +#: access/transam/rmgr.c:126 #, c-format msgid "Custom resource manager \"%s\" already registered with the same ID." msgstr "Egendefinierad resurshanterare \"%s\" är redan registrerade med samma ID." -#: access/transam/rmgr.c:129 +#: access/transam/rmgr.c:138 #, c-format msgid "Existing resource manager with ID %d has the same name." msgstr "Det finns redan en resurshanterare med ID %d som har samma namn." -#: access/transam/rmgr.c:135 +#: access/transam/rmgr.c:144 #, c-format msgid "registered custom resource manager \"%s\" with ID %d" msgstr "registrerade egendefinerad resurshanterare \"%s\" med ID %d" -#: access/transam/slru.c:714 +#: access/transam/slru.c:361 +#, c-format +msgid "\"%s\" must be a multiple of %d" +msgstr "\"%s\" mÃ¥ste vara en multiple av \"%d\"" + +#: access/transam/slru.c:830 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "filen \"%s\" existerar inte, läses som nollor" -#: access/transam/slru.c:946 access/transam/slru.c:952 -#: access/transam/slru.c:960 access/transam/slru.c:965 -#: access/transam/slru.c:972 access/transam/slru.c:977 -#: access/transam/slru.c:984 access/transam/slru.c:991 +#: access/transam/slru.c:1059 access/transam/slru.c:1065 +#: access/transam/slru.c:1073 access/transam/slru.c:1078 +#: access/transam/slru.c:1085 access/transam/slru.c:1090 +#: access/transam/slru.c:1097 access/transam/slru.c:1104 #, c-format msgid "could not access status of transaction %u" msgstr "kunde inte läsa status pÃ¥ transaktion %u" -#: access/transam/slru.c:947 +#: access/transam/slru.c:1060 #, c-format msgid "Could not open file \"%s\": %m." msgstr "Kunde inte öppna fil \"%s\": %m." -#: access/transam/slru.c:953 +#: access/transam/slru.c:1066 #, c-format msgid "Could not seek in file \"%s\" to offset %d: %m." msgstr "Kunde inte söka i fil \"%s\" till offset %d: %m." -#: access/transam/slru.c:961 +#: access/transam/slru.c:1074 #, c-format msgid "Could not read from file \"%s\" at offset %d: %m." msgstr "Kunde inte läsa frÃ¥n fil \"%s\" pÃ¥ offset %d: %m." -#: access/transam/slru.c:966 +#: access/transam/slru.c:1079 #, c-format msgid "Could not read from file \"%s\" at offset %d: read too few bytes." msgstr "Kunde inte läsa frÃ¥n fil \"%s\" pÃ¥ offset %d: läste för fÃ¥ bytes." -#: access/transam/slru.c:973 +#: access/transam/slru.c:1086 #, c-format msgid "Could not write to file \"%s\" at offset %d: %m." msgstr "Kunde inte skriva till fil \"%s\" pÃ¥ offset %d: %m." -#: access/transam/slru.c:978 +#: access/transam/slru.c:1091 #, c-format msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." msgstr "Kunde inte skriva till fil \"%s\" pÃ¥ offset %d: skrev för fÃ¥ bytes." -#: access/transam/slru.c:985 +#: access/transam/slru.c:1098 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "Kunde inte fsync:a fil \"%s\": %m." -#: access/transam/slru.c:992 +#: access/transam/slru.c:1105 #, c-format msgid "Could not close file \"%s\": %m." msgstr "Kunde inte stänga fil \"%s\": %m." -#: access/transam/slru.c:1253 +#: access/transam/slru.c:1431 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "Kunde inte trunkera katalog \"%s\": trolig wraparound" @@ -1896,773 +2117,829 @@ msgstr "felaktig data i history-fil \"%s\"" msgid "Timeline IDs must be less than child timeline's ID." msgstr "Tidslinje-ID:er mÃ¥ste vara mindre än barnens tidslinje-ID:er." -#: access/transam/timeline.c:597 +#: access/transam/timeline.c:589 #, c-format msgid "requested timeline %u is not in this server's history" msgstr "efterfrÃ¥gad tidslinje %u finns inte i denna servers historik" -#: access/transam/twophase.c:385 +#: access/transam/twophase.c:368 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "transaktionsidentifierare \"%s\" är för lÃ¥ng" -#: access/transam/twophase.c:392 +#: access/transam/twophase.c:375 #, c-format msgid "prepared transactions are disabled" msgstr "förberedda transaktioner är avslagna" -#: access/transam/twophase.c:393 +#: access/transam/twophase.c:376 #, c-format -msgid "Set max_prepared_transactions to a nonzero value." -msgstr "Sätt max_prepared_transactions till ett ickenollvärde." +msgid "Set \"max_prepared_transactions\" to a nonzero value." +msgstr "Sätt \"max_prepared_transactions\" till ett värde som inte är noll." -#: access/transam/twophase.c:412 +#: access/transam/twophase.c:395 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "transaktionsidentifierare \"%s\" används redan" -#: access/transam/twophase.c:421 access/transam/twophase.c:2486 +#: access/transam/twophase.c:404 access/transam/twophase.c:2531 #, c-format msgid "maximum number of prepared transactions reached" msgstr "maximalt antal förberedda transaktioner har uppnÃ¥tts" -#: access/transam/twophase.c:422 access/transam/twophase.c:2487 +#: access/transam/twophase.c:405 access/transam/twophase.c:2532 #, c-format -msgid "Increase max_prepared_transactions (currently %d)." -msgstr "Öka max_prepared_transactions (nu %d)." +msgid "Increase \"max_prepared_transactions\" (currently %d)." +msgstr "Öka \"max_prepared_transactions\" (nu %d)." -#: access/transam/twophase.c:598 +#: access/transam/twophase.c:580 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "förberedd transaktion med identifierare \"%s\" är upptagen" -#: access/transam/twophase.c:604 +#: access/transam/twophase.c:586 #, c-format msgid "permission denied to finish prepared transaction" msgstr "rättighet saknas för att slutföra förberedd transaktion" -#: access/transam/twophase.c:605 +#: access/transam/twophase.c:587 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "MÃ¥ste vara superuser eller den användare som förberedde transaktionen" -#: access/transam/twophase.c:616 +#: access/transam/twophase.c:598 #, c-format msgid "prepared transaction belongs to another database" msgstr "förberedda transaktionen tillhör en annan databas" -#: access/transam/twophase.c:617 +#: access/transam/twophase.c:599 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "Anslut till databasen där transaktionen var förberedd för att slutföra den." -#: access/transam/twophase.c:632 +#: access/transam/twophase.c:614 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "förberedd transaktion med identifierare \"%s\" finns inte" -#: access/transam/twophase.c:1169 +#: access/transam/twophase.c:1174 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "tvÃ¥fas-statusfilens maximala längd överskriden" -#: access/transam/twophase.c:1324 +#: access/transam/twophase.c:1329 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" msgstr[0] "felaktig storlek pÃ¥ fil \"%s\": %lld byte" msgstr[1] "felaktig storlek pÃ¥ fil \"%s\": %lld bytes" -#: access/transam/twophase.c:1333 +#: access/transam/twophase.c:1338 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "inkorrekt justering (alignment) av CRC-offset för fil \"%s\"" -#: access/transam/twophase.c:1351 +#: access/transam/twophase.c:1356 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "kunde inte läsa fil \"%s\": läste %d av %lld" -#: access/transam/twophase.c:1366 +#: access/transam/twophase.c:1371 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "felaktigt magiskt nummer lagrat i fil \"%s\"" -#: access/transam/twophase.c:1372 +#: access/transam/twophase.c:1377 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "felaktig storlek lagrad i fil \"%s\"" -#: access/transam/twophase.c:1384 +#: access/transam/twophase.c:1389 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "beräknad CRC-checksumma matchar inte värdet som är lagrat i filen \"%s\"" -#: access/transam/twophase.c:1414 access/transam/xlogrecovery.c:569 -#: replication/logical/logical.c:206 replication/walsender.c:702 +#: access/transam/twophase.c:1419 access/transam/xlogrecovery.c:565 +#: postmaster/walsummarizer.c:936 replication/logical/logical.c:211 +#: replication/walsender.c:836 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Misslyckades vid allokering av en WAL-läs-processor." -#: access/transam/twophase.c:1424 +#: access/transam/twophase.c:1429 #, c-format msgid "could not read two-phase state from WAL at %X/%X: %s" msgstr "kunde inte läsa tvÃ¥fas-status frÃ¥n WAL vid %X/%X: %s" -#: access/transam/twophase.c:1429 +#: access/transam/twophase.c:1434 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "kunde inte läsa tvÃ¥fas-status frÃ¥n WAL vid %X/%X" -#: access/transam/twophase.c:1437 +#: access/transam/twophase.c:1442 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "förväntad tvÃ¥fas-statusdata finns inte i WAL vid %X/%X" -#: access/transam/twophase.c:1733 +#: access/transam/twophase.c:1745 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "kan inte Ã¥terskapa fil \"%s\": %m" -#: access/transam/twophase.c:1860 +#: access/transam/twophase.c:1872 #, c-format msgid "%u two-phase state file was written for a long-running prepared transaction" msgid_plural "%u two-phase state files were written for long-running prepared transactions" msgstr[0] "%u tvÃ¥fas-statusfil skrevs för lÃ¥ngkörande förberedd transkation" msgstr[1] "%u tvÃ¥fas-statusfiler skrevs för lÃ¥ngkörande förberedda transaktioner" -#: access/transam/twophase.c:2094 +#: access/transam/twophase.c:2107 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "Ã¥terskapar förberedd transaktion %u frÃ¥n delat minne" -#: access/transam/twophase.c:2187 +#: access/transam/twophase.c:2200 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "tar bort död tvÃ¥fas-statusfil för transaktioon %u" -#: access/transam/twophase.c:2194 +#: access/transam/twophase.c:2207 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "tar bort död tvÃ¥fas-statusfil frÃ¥n minne för transaktion %u" -#: access/transam/twophase.c:2207 +#: access/transam/twophase.c:2220 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "tar bort framtida tvÃ¥fas-statusfil för transaktion %u" -#: access/transam/twophase.c:2214 +#: access/transam/twophase.c:2227 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "tar bort framtida tvÃ¥fas-statusfil frÃ¥n minne för transaktion %u" -#: access/transam/twophase.c:2239 +#: access/transam/twophase.c:2252 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "korrupt tvÃ¥fas-statusfil för transaktion %u" -#: access/transam/twophase.c:2244 +#: access/transam/twophase.c:2257 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "korrupt tvÃ¥fas-status i minnet för transaktion %u" -#: access/transam/varsup.c:129 +#: access/transam/twophase.c:2514 #, c-format -msgid "database is not accepting commands to avoid wraparound data loss in database \"%s\"" -msgstr "databasen tar inte emot kommandon för att förhinda dataförlust vid \"wraparound\" i databasen \"%s\"" +msgid "could not recover two-phase state file for transaction %u" +msgstr "kunde inte Ã¥terställa tvÃ¥fas-statusfil för transaktion %u" -#: access/transam/varsup.c:131 access/transam/varsup.c:138 +#: access/transam/twophase.c:2516 #, c-format -msgid "" -"Stop the postmaster and vacuum that database in single-user mode.\n" -"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." -msgstr "" -"Stoppa postmaster och städa (vacuum) den databasen i enanvändarläge.\n" -"Du kan ocksÃ¥ behöva commit:a eller rulla tillbaka förberedda transaktioner eller slänga gamla replikeringsslottar." +msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." +msgstr "Statefil för tvÃ¥fas har hittats i WAL-post %X/%X men denna transaktion har redan Ã¥terställts frÃ¥n disk." + +#: access/transam/twophase.c:2524 storage/file/fd.c:514 utils/fmgr/dfmgr.c:209 +#, c-format +msgid "could not access file \"%s\": %m" +msgstr "kunde inte komma Ã¥t filen \"%s\": %m" + +#: access/transam/varsup.c:156 +#, c-format +msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database \"%s\"" +msgstr "databasen tar inte emot kommandon som tilldelar nya transaktions-ID för att förhinda dataförlust vid \"wraparound\" i databasen \"%s\"" -#: access/transam/varsup.c:136 +#: access/transam/varsup.c:163 #, c-format -msgid "database is not accepting commands to avoid wraparound data loss in database with OID %u" -msgstr "databasen tar inte emot kommandon för att förhinda dataförlust vid wraparound i databas med OID %u" +msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database with OID %u" +msgstr "databasen tar inte emot kommandon som tilldelar nya transaktions-ID för att förhinda dataförlust vid \"wraparound\" i databasen med OID %u" -#: access/transam/varsup.c:148 access/transam/varsup.c:463 +#: access/transam/varsup.c:175 access/transam/varsup.c:490 #, c-format msgid "database \"%s\" must be vacuumed within %u transactions" msgstr "databas \"%s\" mÃ¥ste städas (vacuum) inom %u transaktioner" -#: access/transam/varsup.c:155 access/transam/varsup.c:470 +#: access/transam/varsup.c:178 +#, c-format +msgid "" +"To avoid transaction ID assignment failures, execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"För att undvika fel vid tilldelning av transaktions-ID sÃ¥ utför en databas-VACCUM för hela den databasen.\n" +"Du kan ocksÃ¥ behöva commit:a eller rulla tillbaka gamla förberedda transaktioner eller slänga gamla replikeringsslottar." + +#: access/transam/varsup.c:182 access/transam/varsup.c:497 #, c-format msgid "database with OID %u must be vacuumed within %u transactions" msgstr "databas med OID %u mÃ¥ste städas (vacuum) inom %u transaktioner" -#: access/transam/xact.c:1098 +#: access/transam/varsup.c:185 access/transam/varsup.c:493 +#: access/transam/varsup.c:500 +#, c-format +msgid "" +"To avoid XID assignment failures, execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "" +"För att undvika fel vid tilldelning av XID sÃ¥ utför en databas-VACCUM för hela den databasen.\n" +"Du kan ocksÃ¥ behöva commit:a eller rulla tillbaka gamla förberedda transaktioner eller slänga gamla replikeringsslottar." + +#: access/transam/xact.c:649 +#, c-format +msgid "cannot assign transaction IDs during a parallel operation" +msgstr "can inte tilldela transaktions-ID under en parallell operation" + +#: access/transam/xact.c:840 +#, c-format +msgid "cannot modify data in a parallel worker" +msgstr "kan inte modifiera data i en parellell arbetare" + +#: access/transam/xact.c:1115 +#, c-format +msgid "cannot start commands during a parallel operation" +msgstr "kan inte starta kommandon under en parallell operation" + +#: access/transam/xact.c:1123 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "kan inte ha mer än 2^32-2 kommandon i en transaktion" -#: access/transam/xact.c:1644 +#: access/transam/xact.c:1664 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "maximalt antal commit:ade undertransaktioner (%d) överskridet" -#: access/transam/xact.c:2501 +#: access/transam/xact.c:2561 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "kan inte göra PREPARE pÃ¥ en transaktion som har arbetat med temporära objekt" -#: access/transam/xact.c:2511 +#: access/transam/xact.c:2571 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "kan inte göra PREPARE pÃ¥ en transaktion som har exporterade snapshots" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3478 +#: access/transam/xact.c:3593 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s kan inte köras i ett transaktionsblock" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3488 +#: access/transam/xact.c:3603 #, c-format msgid "%s cannot run inside a subtransaction" -msgstr "%s kan inte köras i ett undertransaktionsblock" +msgstr "%s kan inte köras i en undertransaktion" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3498 +#: access/transam/xact.c:3613 #, c-format msgid "%s cannot be executed within a pipeline" msgstr "%s kan inte köras inuti en pipeline" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3508 +#: access/transam/xact.c:3623 #, c-format msgid "%s cannot be executed from a function" msgstr "%s kan inte köras frÃ¥n en funktion" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3579 access/transam/xact.c:3894 -#: access/transam/xact.c:3973 access/transam/xact.c:4096 -#: access/transam/xact.c:4247 access/transam/xact.c:4316 -#: access/transam/xact.c:4427 +#: access/transam/xact.c:3694 access/transam/xact.c:4019 +#: access/transam/xact.c:4098 access/transam/xact.c:4221 +#: access/transam/xact.c:4372 access/transam/xact.c:4441 +#: access/transam/xact.c:4552 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s kan bara användas i transaktionsblock" -#: access/transam/xact.c:3780 +#: access/transam/xact.c:3905 #, c-format msgid "there is already a transaction in progress" msgstr "det är redan en transaktion igÃ¥ng" -#: access/transam/xact.c:3899 access/transam/xact.c:3978 -#: access/transam/xact.c:4101 +#: access/transam/xact.c:4024 access/transam/xact.c:4103 +#: access/transam/xact.c:4226 #, c-format msgid "there is no transaction in progress" msgstr "ingen transaktion pÃ¥gÃ¥r" -#: access/transam/xact.c:3989 +#: access/transam/xact.c:4114 #, c-format msgid "cannot commit during a parallel operation" msgstr "kan inte commit:a under en parallell operation" -#: access/transam/xact.c:4112 +#: access/transam/xact.c:4237 #, c-format msgid "cannot abort during a parallel operation" msgstr "can inte avbryta under en parallell operation" -#: access/transam/xact.c:4211 +#: access/transam/xact.c:4336 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "kan inte definiera sparpunkter under en parallell operation" -#: access/transam/xact.c:4298 +#: access/transam/xact.c:4423 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "kan inte frigöra en sparpunkt under en parallell operation" -#: access/transam/xact.c:4308 access/transam/xact.c:4359 -#: access/transam/xact.c:4419 access/transam/xact.c:4468 +#: access/transam/xact.c:4433 access/transam/xact.c:4484 +#: access/transam/xact.c:4544 access/transam/xact.c:4593 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "sparpunkt \"%s\" existerar inte" -#: access/transam/xact.c:4365 access/transam/xact.c:4474 +#: access/transam/xact.c:4490 access/transam/xact.c:4599 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "sparpunkt \"%s\" finns inte inom aktuell sparpunktsnivÃ¥" -#: access/transam/xact.c:4407 +#: access/transam/xact.c:4532 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "kan inte rulla tillbaka till sparpunkt under en parallell operation" -#: access/transam/xact.c:4535 +#: access/transam/xact.c:5376 #, c-format -msgid "cannot start subtransactions during a parallel operation" -msgstr "kan inte starta subtransaktioner under en parallell operation" +msgid "cannot have more than 2^32-1 subtransactions in a transaction" +msgstr "kan inte ha mer än 2^32-1 undertransaktioner i en transaktion" -#: access/transam/xact.c:4603 +#: access/transam/xlog.c:1542 #, c-format -msgid "cannot commit subtransactions during a parallel operation" -msgstr "kan inte commit:a subtransaktioner undert en parallell operation" +msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" +msgstr "förfrÃ¥gan att flush:a efter slutet av genererad WAL; efterfrÃ¥gad %X/%X, aktuell position %X/%X" -#: access/transam/xact.c:5250 +#: access/transam/xlog.c:1769 #, c-format -msgid "cannot have more than 2^32-1 subtransactions in a transaction" -msgstr "kan inte ha mer än 2^32-1 subtransaktioner i en transaktion" +msgid "cannot read past end of generated WAL: requested %X/%X, current position %X/%X" +msgstr "kan inte läsa efter slutet av genererad WAL; efterfrÃ¥gad %X/%X, aktuell position %X/%X" -#: access/transam/xlog.c:1463 +#: access/transam/xlog.c:2210 access/transam/xlog.c:4501 #, c-format -msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" -msgstr "förfrÃ¥gan att flush:a efter slutet av genererad WAL; efterfrÃ¥gad %X/%X, aktuell position %X/%X" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL-segmentstorleken mÃ¥ste vara en tvÃ¥potens mellan 1 MB och 1 GB." + +#: access/transam/xlog.c:2228 +#, c-format +msgid "\"%s\" must be set to -1 during binary upgrade mode." +msgstr "\"%s\" mÃ¥sta vara satt till -1 i binärt uppgraderingsläge" -#: access/transam/xlog.c:2224 +#: access/transam/xlog.c:2477 #, c-format -msgid "could not write to log file %s at offset %u, length %zu: %m" -msgstr "kunde inte skriva till loggfil %s vid offset %u, längd %zu: %m" +msgid "could not write to log file \"%s\" at offset %u, length %zu: %m" +msgstr "kunde inte skriva till loggfil \"%s\" vid offset %u, längd %zu: %m" -#: access/transam/xlog.c:3471 access/transam/xlogutils.c:847 -#: replication/walsender.c:2716 +#: access/transam/xlog.c:3739 access/transam/xlogutils.c:831 +#: replication/walsender.c:3045 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "efterfrÃ¥gat WAL-segment %s har redan tagits bort" -#: access/transam/xlog.c:3756 +#: access/transam/xlog.c:4061 #, c-format msgid "could not rename file \"%s\": %m" msgstr "kunde inte byta namn pÃ¥ fil \"%s\": %m" -#: access/transam/xlog.c:3798 access/transam/xlog.c:3808 +#: access/transam/xlog.c:4104 access/transam/xlog.c:4115 +#: access/transam/xlog.c:4136 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "krävd WAL-katalog \"%s\" finns inte" -#: access/transam/xlog.c:3814 +#: access/transam/xlog.c:4121 access/transam/xlog.c:4142 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "skapar saknad WAL-katalog \"%s\"" -#: access/transam/xlog.c:3817 commands/dbcommands.c:3045 +#: access/transam/xlog.c:4125 access/transam/xlog.c:4145 +#: commands/dbcommands.c:3262 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "kunde inte skapa saknad katalog \"%s\": %m" -#: access/transam/xlog.c:3884 +#: access/transam/xlog.c:4212 #, c-format msgid "could not generate secret authorization token" msgstr "kunde inte generera hemligt auktorisationstoken" -#: access/transam/xlog.c:4043 access/transam/xlog.c:4052 -#: access/transam/xlog.c:4076 access/transam/xlog.c:4083 -#: access/transam/xlog.c:4090 access/transam/xlog.c:4095 -#: access/transam/xlog.c:4102 access/transam/xlog.c:4109 -#: access/transam/xlog.c:4116 access/transam/xlog.c:4123 -#: access/transam/xlog.c:4130 access/transam/xlog.c:4137 -#: access/transam/xlog.c:4146 access/transam/xlog.c:4153 -#: utils/init/miscinit.c:1598 +#: access/transam/xlog.c:4363 access/transam/xlog.c:4373 +#: access/transam/xlog.c:4399 access/transam/xlog.c:4407 +#: access/transam/xlog.c:4415 access/transam/xlog.c:4421 +#: access/transam/xlog.c:4429 access/transam/xlog.c:4437 +#: access/transam/xlog.c:4445 access/transam/xlog.c:4453 +#: access/transam/xlog.c:4461 access/transam/xlog.c:4469 +#: access/transam/xlog.c:4479 access/transam/xlog.c:4487 +#: utils/init/miscinit.c:1812 #, c-format msgid "database files are incompatible with server" msgstr "databasfilerna är inkompatibla med servern" -#: access/transam/xlog.c:4044 +#: access/transam/xlog.c:4364 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "Databasklustret initierades med PG_CONTROL_VERSION %d (0x%08x), men servern kompilerades med PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlog.c:4048 +#: access/transam/xlog.c:4368 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "Detta kan orsakas av en felaktig byte-ordning. Du behöver troligen köra initdb." -#: access/transam/xlog.c:4053 +#: access/transam/xlog.c:4374 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "Databasklustret initierades med PG_CONTROL_VERSION %d, men servern kompilerades med PG_CONTROL_VERSION %d." -#: access/transam/xlog.c:4056 access/transam/xlog.c:4080 -#: access/transam/xlog.c:4087 access/transam/xlog.c:4092 +#: access/transam/xlog.c:4377 access/transam/xlog.c:4403 +#: access/transam/xlog.c:4411 access/transam/xlog.c:4417 #, c-format msgid "It looks like you need to initdb." msgstr "Du behöver troligen köra initdb." -#: access/transam/xlog.c:4067 +#: access/transam/xlog.c:4389 #, c-format msgid "incorrect checksum in control file" msgstr "ogiltig kontrollsumma kontrollfil" -#: access/transam/xlog.c:4077 +#: access/transam/xlog.c:4400 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "Databasklustret initierades med CATALOG_VERSION_NO %d, men servern kompilerades med CATALOG_VERSION_NO %d." -#: access/transam/xlog.c:4084 +#: access/transam/xlog.c:4408 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "Databasklustret initierades med MAXALIGN %d, men servern kompilerades med MAXALIGN %d." -#: access/transam/xlog.c:4091 +#: access/transam/xlog.c:4416 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "Databasklustret verkar använda en annan flyttalsrepresentation än vad serverprogrammet gör." -#: access/transam/xlog.c:4096 +#: access/transam/xlog.c:4422 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "Databasklustret initierades med BLCKSZ %d, men servern kompilerades med BLCKSZ %d." -#: access/transam/xlog.c:4099 access/transam/xlog.c:4106 -#: access/transam/xlog.c:4113 access/transam/xlog.c:4120 -#: access/transam/xlog.c:4127 access/transam/xlog.c:4134 -#: access/transam/xlog.c:4141 access/transam/xlog.c:4149 -#: access/transam/xlog.c:4156 +#: access/transam/xlog.c:4425 access/transam/xlog.c:4433 +#: access/transam/xlog.c:4441 access/transam/xlog.c:4449 +#: access/transam/xlog.c:4457 access/transam/xlog.c:4465 +#: access/transam/xlog.c:4473 access/transam/xlog.c:4482 +#: access/transam/xlog.c:4490 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Det verkar som om du mÃ¥ste kompilera om eller köra initdb." -#: access/transam/xlog.c:4103 +#: access/transam/xlog.c:4430 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "Databasklustret initierades med RELSEG_SIZE %d, men servern kompilerades med RELSEG_SIZE %d." -#: access/transam/xlog.c:4110 +#: access/transam/xlog.c:4438 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "Databasklustret initierades med XLOG_BLCKSZ %d, men servern kompilerades med XLOG_BLCKSZ %d." -#: access/transam/xlog.c:4117 +#: access/transam/xlog.c:4446 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "Databasklustret initierades med NAMEDATALEN %d, men servern kompilerades med NAMEDATALEN %d." -#: access/transam/xlog.c:4124 +#: access/transam/xlog.c:4454 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "Databasklustret initierades med INDEX_MAX_KEYS %d, men servern kompilerades med INDEX_MAX_KEYS %d." -#: access/transam/xlog.c:4131 +#: access/transam/xlog.c:4462 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "Databasklustret initierades med TOAST_MAX_CHUNK_SIZE %d, men servern kompilerades med TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlog.c:4138 +#: access/transam/xlog.c:4470 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "Databasklustret initierades med LOBLKSIZE %d, men servern kompilerades med LOBLKSIZE %d." -#: access/transam/xlog.c:4147 +#: access/transam/xlog.c:4480 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "Databasklustret initierades utan USE_FLOAT8_BYVAL, men servern kompilerades med USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4154 +#: access/transam/xlog.c:4488 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "Databasklustret initierades med USE_FLOAT8_BYVAL, men servern kompilerades utan USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4163 +#: access/transam/xlog.c:4497 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" -msgstr[0] "WAL-segmentstorlek mÃ¥ste vara en tvÃ¥potens mellan 1MB och 1GB men kontrollfilen anger %d byte" -msgstr[1] "WAL-segmentstorlek mÃ¥ste vara en tvÃ¥potens mellan 1MB och 1GB men kontrollfilen anger %d byte" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "ogiltigt WAL-segmentstorlek i kontrollfil (%d byte)" +msgstr[1] "ogiltigt WAL-segmentstorlek i kontrollfil (%d byte)" -#: access/transam/xlog.c:4175 +#: access/transam/xlog.c:4510 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"min_wal_size\" mÃ¥ste vara minst dubbla \"wal_segment_size\"" -#: access/transam/xlog.c:4179 +#: access/transam/xlog.c:4514 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"max_wal_size\" mÃ¥ste vara minst dubbla \"wal_segment_size\"" -#: access/transam/xlog.c:4620 +#: access/transam/xlog.c:4662 catalog/namespace.c:4696 +#: commands/tablespace.c:1210 commands/user.c:2529 commands/variable.c:72 +#: replication/slot.c:2429 tcop/postgres.c:3715 utils/error/elog.c:2247 +#, c-format +msgid "List syntax is invalid." +msgstr "List-syntaxen är ogiltig." + +#: access/transam/xlog.c:4708 commands/user.c:2545 commands/variable.c:173 +#: tcop/postgres.c:3731 utils/error/elog.c:2273 +#, c-format +msgid "Unrecognized key word: \"%s\"." +msgstr "Okänt nyckelord: \"%s\"" + +#: access/transam/xlog.c:5129 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "kunde inte skriva bootstrap-write-ahead-loggfil: %m" -#: access/transam/xlog.c:4628 +#: access/transam/xlog.c:5137 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "kunde inte fsync:a bootstrap-write-ahead-loggfil: %m" -#: access/transam/xlog.c:4634 +#: access/transam/xlog.c:5143 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "kunde inte stänga bootstrap-write-ahead-loggfil: %m" -#: access/transam/xlog.c:4852 +#: access/transam/xlog.c:5368 #, c-format -msgid "WAL was generated with wal_level=minimal, cannot continue recovering" -msgstr "WAL genererades med wal_level=minimal, kan inte fortsätta Ã¥terställande" +msgid "WAL was generated with \"wal_level=minimal\", cannot continue recovering" +msgstr "WAL genererades med \"wal_level=minimal\", kan inte fortsätta Ã¥terställande" -#: access/transam/xlog.c:4853 +#: access/transam/xlog.c:5369 #, c-format -msgid "This happens if you temporarily set wal_level=minimal on the server." -msgstr "Detta händer om du temporärt sätter wal_level=minimal pÃ¥ servern." +msgid "This happens if you temporarily set \"wal_level=minimal\" on the server." +msgstr "Detta händer om du temporärt sätter \"wal_level=minimal\" pÃ¥ servern." -#: access/transam/xlog.c:4854 +#: access/transam/xlog.c:5370 #, c-format -msgid "Use a backup taken after setting wal_level to higher than minimal." -msgstr "Använd en backup som är tagen efter att inställningen wal_level satts till ett högre värde än minimal." +msgid "Use a backup taken after setting \"wal_level\" to higher than \"minimal\"." +msgstr "Använd en backup som är tagen efter att inställningen \"wal_level\" satts till ett högre värde än \"minimal\"." -#: access/transam/xlog.c:4918 +#: access/transam/xlog.c:5435 #, c-format msgid "control file contains invalid checkpoint location" msgstr "kontrollfil innehÃ¥ller ogiltig checkpoint-position" -#: access/transam/xlog.c:4929 +#: access/transam/xlog.c:5446 #, c-format msgid "database system was shut down at %s" msgstr "databassystemet stängdes ner vid %s" -#: access/transam/xlog.c:4935 +#: access/transam/xlog.c:5452 #, c-format msgid "database system was shut down in recovery at %s" msgstr "databassystemet stängdes ner under Ã¥terställning vid %s" -#: access/transam/xlog.c:4941 +#: access/transam/xlog.c:5458 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "nedstängning av databasen avbröts; senast kända upptidpunkt vid %s" -#: access/transam/xlog.c:4947 +#: access/transam/xlog.c:5464 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "databassystemet avbröts under Ã¥terställning vid %s" -#: access/transam/xlog.c:4949 +#: access/transam/xlog.c:5466 #, c-format msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." msgstr "Det betyder troligen att en del data är förstörd och du behöver Ã¥terställa databasen frÃ¥n den senaste backup:en." -#: access/transam/xlog.c:4955 +#: access/transam/xlog.c:5472 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "databassystemet avbröts under Ã¥terställning vid loggtid %s" -#: access/transam/xlog.c:4957 +#: access/transam/xlog.c:5474 #, c-format msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." msgstr "Om detta har hänt mer än en gÃ¥ng sÃ¥ kan data vara korrupt och du kanske mÃ¥ste Ã¥terställa till ett tidigare Ã¥terställningsmÃ¥l." -#: access/transam/xlog.c:4963 +#: access/transam/xlog.c:5480 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "databassystemet avbröts; senast kända upptidpunkt vid %s" -#: access/transam/xlog.c:4969 +#: access/transam/xlog.c:5487 #, c-format msgid "control file contains invalid database cluster state" msgstr "kontrollfil innehÃ¥ller ogiltigt databasklustertillstÃ¥nd" -#: access/transam/xlog.c:5353 +#: access/transam/xlog.c:5875 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL slutar före sluttiden av online-backup:en" -#: access/transam/xlog.c:5354 +#: access/transam/xlog.c:5876 #, c-format msgid "All WAL generated while online backup was taken must be available at recovery." msgstr "Alla genererade WAL under tiden online-backup:en togs mÃ¥ste vara tillgängliga vid Ã¥terställning." -#: access/transam/xlog.c:5357 +#: access/transam/xlog.c:5880 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL avslutas innan konstistent Ã¥terställningspunkt" -#: access/transam/xlog.c:5405 +#: access/transam/xlog.c:5926 #, c-format msgid "selected new timeline ID: %u" msgstr "valt nytt tidslinje-ID: %u" -#: access/transam/xlog.c:5438 +#: access/transam/xlog.c:5959 #, c-format msgid "archive recovery complete" msgstr "arkivÃ¥terställning klar" -#: access/transam/xlog.c:6040 +#: access/transam/xlog.c:6612 #, c-format msgid "shutting down" msgstr "stänger ner" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6079 +#: access/transam/xlog.c:6651 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "restartpoint startar:%s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6091 +#: access/transam/xlog.c:6663 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "checkpoint startar:%s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6151 +#: access/transam/xlog.c:6728 #, c-format -msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" -msgstr "restartpoint klar: skrev %d buffers (%.1f%%); %d WAL-fil(er) tillagda, %d borttagna, %d recyclade; skriv=%ld.%03d s, synk=%ld.%03d s, totalt=%ld.%03d s; synk-filer=%d, längsta=%ld.%03d s, genomsnitt=%ld.%03d s; distans=%d kB, estimat=%d kB" +msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" +msgstr "restartpoint klar: skrev %d buffers (%.1f%%); %d WAL-fil(er) tillagda, %d borttagna, %d recyclade; skriv=%ld.%03d s, synk=%ld.%03d s, totalt=%ld.%03d s; synk-filer=%d, längsta=%ld.%03d s, genomsnitt=%ld.%03d s; distans=%d kB, estimat=%d kB; lsn=%X/%X, redo-lsn=%X/%X" -#: access/transam/xlog.c:6171 +#: access/transam/xlog.c:6751 #, c-format -msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" -msgstr "checkpoint klar: skrev %d buffers (%.1f%%); %d WAL-fil(er) tillagda, %d borttagna, %d recyclade; skriv=%ld.%03d s, synk=%ld.%03d s, totalt=%ld.%03d s; synk-filer=%d, längsta=%ld.%03d s, genomsnitt=%ld.%03d s; distans=%d kB, estimat=%d kB" +msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" +msgstr "checkpoint klar: skrev %d buffers (%.1f%%); %d WAL-fil(er) tillagda, %d borttagna, %d recyclade; skriv=%ld.%03d s, synk=%ld.%03d s, totalt=%ld.%03d s; synk-filer=%d, längsta=%ld.%03d s, genomsnitt=%ld.%03d s; distans=%d kB, estimat=%d kB; lsn=%X/%X, redo-lsn=%X/%X" -#: access/transam/xlog.c:6606 +#: access/transam/xlog.c:7233 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "samtidig write-ahead-logg-aktivitet när databassystemet stängs ner" -#: access/transam/xlog.c:7163 +#: access/transam/xlog.c:7818 #, c-format msgid "recovery restart point at %X/%X" msgstr "Ã¥terställningens omstartspunkt vid %X/%X" -#: access/transam/xlog.c:7165 +#: access/transam/xlog.c:7820 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Senaste kompletta transaktionen var vid loggtid %s" -#: access/transam/xlog.c:7412 +#: access/transam/xlog.c:8082 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "Ã¥terställningspunkt \"%s\" skapad vid %X/%X" -#: access/transam/xlog.c:7619 +#: access/transam/xlog.c:8289 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "online-backup avbröts, Ã¥terställning kan inte fortsätta" -#: access/transam/xlog.c:7676 +#: access/transam/xlog.c:8347 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "oväntad tidslinje-ID %u (skall vara %u) i checkpoint-post för nedstängning" -#: access/transam/xlog.c:7734 +#: access/transam/xlog.c:8405 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "oväntad tidslinje-ID %u (skall vara %u) i checkpoint-post för online" -#: access/transam/xlog.c:7763 +#: access/transam/xlog.c:8434 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "oväntad tidslinje-ID %u (skall vara %u) i post för slutet av Ã¥terställning" -#: access/transam/xlog.c:8021 +#: access/transam/xlog.c:8705 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "kunde inte fsync:a skriv-igenom-loggfil \"%s\": %m" -#: access/transam/xlog.c:8027 +#: access/transam/xlog.c:8710 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "kunde inte fdatasync:a fil \"%s\": %m" -#: access/transam/xlog.c:8122 access/transam/xlog.c:8489 +#: access/transam/xlog.c:8797 access/transam/xlog.c:9133 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "WAL-nivÃ¥ inte tillräcklig för att kunna skapa en online-backup" -#: access/transam/xlog.c:8123 access/transam/xlog.c:8490 -#: access/transam/xlogfuncs.c:199 +#: access/transam/xlog.c:8798 access/transam/xlogfuncs.c:248 #, c-format -msgid "wal_level must be set to \"replica\" or \"logical\" at server start." -msgstr "wal_level mÃ¥ste vara satt till \"replica\" eller \"logical\" vid serverstart." +msgid "\"wal_level\" must be set to \"replica\" or \"logical\" at server start." +msgstr "\"wal_level\" mÃ¥ste vara satt till \"replica\" eller \"logical\" vid serverstart." -#: access/transam/xlog.c:8128 +#: access/transam/xlog.c:8803 #, c-format msgid "backup label too long (max %d bytes)" msgstr "backup-etikett för lÃ¥ng (max %d byte)" -#: access/transam/xlog.c:8244 +#: access/transam/xlog.c:8924 #, c-format -msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "WAL skapad med full_page_writes=off har Ã¥terspelats sedab senaste omstartpunkten" +msgid "WAL generated with \"full_page_writes=off\" was replayed since last restartpoint" +msgstr "WAL skapad med \"full_page_writes=off\" har Ã¥terspelats sedan senaste omstartpunkten" -#: access/transam/xlog.c:8246 access/transam/xlog.c:8602 +#: access/transam/xlog.c:8926 access/transam/xlog.c:9222 #, c-format -msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." -msgstr "Det betyder att backup:en som tas pÃ¥ standby:en är trasig och inte skall användas. SlÃ¥ pÃ¥ full_page_writes och kör CHECKPOINT pÃ¥ primären och försök sedan ta en ny online-backup igen." +msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable \"full_page_writes\" and run CHECKPOINT on the primary, and then try an online backup again." +msgstr "Det betyder att backup:en som tas pÃ¥ standby:en är trasig och inte skall användas. SlÃ¥ pÃ¥ \"full_page_writes\" och kör CHECKPOINT pÃ¥ primären och försök sedan ta en ny online-backup igen." -#: access/transam/xlog.c:8326 backup/basebackup.c:1345 utils/adt/misc.c:347 +#: access/transam/xlog.c:9006 backup/basebackup.c:1417 utils/adt/misc.c:354 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "mÃ¥l för symbolisk länk \"%s\" är för lÃ¥ng" +msgid "could not read symbolic link \"%s\": %m" +msgstr "kan inte läsa symbolisk länk \"%s\": %m" -#: access/transam/xlog.c:8376 backup/basebackup.c:1360 -#: commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 +#: access/transam/xlog.c:9013 backup/basebackup.c:1422 utils/adt/misc.c:359 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "tabellutrymmen stöds inte pÃ¥ denna plattform" +msgid "symbolic link \"%s\" target is too long" +msgstr "mÃ¥l för symbolisk länk \"%s\" är för lÃ¥ng" -#: access/transam/xlog.c:8535 access/transam/xlog.c:8548 -#: access/transam/xlogrecovery.c:1192 access/transam/xlogrecovery.c:1199 -#: access/transam/xlogrecovery.c:1258 access/transam/xlogrecovery.c:1338 -#: access/transam/xlogrecovery.c:1362 +#: access/transam/xlog.c:9134 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "felaktig data i fil \"%s\"" +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "wal_level mÃ¥ste vara satt till \"replica\" eller \"logical\" vid serverstart." -#: access/transam/xlog.c:8552 backup/basebackup.c:1200 +#: access/transam/xlog.c:9172 backup/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "standby:en befordrades under online-backup" -#: access/transam/xlog.c:8553 backup/basebackup.c:1201 +#: access/transam/xlog.c:9173 backup/basebackup.c:1282 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "Det betyder att backupen som tas är trasig och inte skall användas. Försök ta en ny online-backup." -#: access/transam/xlog.c:8600 +#: access/transam/xlog.c:9220 #, c-format -msgid "WAL generated with full_page_writes=off was replayed during online backup" -msgstr "WAL skapad med full_page_writes=off Ã¥terspelades under online-backup" +msgid "WAL generated with \"full_page_writes=off\" was replayed during online backup" +msgstr "WAL skapad med \"full_page_writes=off\" Ã¥terspelades under online-backup" -#: access/transam/xlog.c:8725 +#: access/transam/xlog.c:9336 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "base_backup klar, väntar pÃ¥ att de WAL-segment som krävs blir arkiverade" -#: access/transam/xlog.c:8739 +#: access/transam/xlog.c:9350 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "väntar fortfarande pÃ¥ att alla krävda WAL-segments skall bli arkiverade (%d sekunder har gÃ¥tt)" -#: access/transam/xlog.c:8741 +#: access/transam/xlog.c:9352 #, c-format -msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." -msgstr "Kontrollera att ditt archive_command kör som det skall. Du kan avbryta denna backup pÃ¥ ett säkert sätt men databasbackup:en kommer inte vara användbart utan att alla WAL-segment finns." +msgid "Check that your \"archive_command\" is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." +msgstr "Kontrollera att ditt \"archive_command\" kör som det skall. Du kan avbryta denna backup pÃ¥ ett säkert sätt men databasbackup:en kommer inte vara användbar utan att alla WAL-segment finns." -#: access/transam/xlog.c:8748 +#: access/transam/xlog.c:9359 #, c-format msgid "all required WAL segments have been archived" msgstr "alla krävda WAL-segments har arkiverats" -#: access/transam/xlog.c:8752 +#: access/transam/xlog.c:9363 #, c-format msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" msgstr "WAL-arkivering är inte pÃ¥slagen; du mÃ¥ste se till att alla krävda WAL-segment har kopierats pÃ¥ annat sätt för att backup:en skall vara komplett" -#: access/transam/xlog.c:8801 +#: access/transam/xlog.c:9402 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "avbryter backup pÃ¥ grund av att backend:en stoppades innan pg_backup_stop anropades" -#: access/transam/xlogarchive.c:208 +#: access/transam/xlogarchive.c:213 #, c-format msgid "archive file \"%s\" has wrong size: %lld instead of %lld" msgstr "arkivfil \"%s\" har fel storlek: %lld istället för %lld" -#: access/transam/xlogarchive.c:217 +#: access/transam/xlogarchive.c:222 #, c-format msgid "restored log file \"%s\" from archive" msgstr "Ã¥terställd logfil \"%s\" frÃ¥n arkiv" -#: access/transam/xlogarchive.c:231 +#: access/transam/xlogarchive.c:236 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "restore_command returnerade exit-kod noll men stat() misslyckades." +msgid "\"restore_command\" returned a zero exit status, but stat() failed." +msgstr "\"restore_command\" returnerade exit-kod noll men stat() misslyckades." -#: access/transam/xlogarchive.c:263 +#: access/transam/xlogarchive.c:268 #, c-format msgid "could not restore file \"%s\" from archive: %s" msgstr "kunde inte Ã¥terställa fil \"%s\" frÃ¥n arkiv: %s" @@ -2670,892 +2947,961 @@ msgstr "kunde inte Ã¥terställa fil \"%s\" frÃ¥n arkiv: %s" #. translator: First %s represents a postgresql.conf parameter name like #. "recovery_end_command", the 2nd is the value of that parameter, the #. third an already translated error message. -#: access/transam/xlogarchive.c:376 +#: access/transam/xlogarchive.c:346 #, c-format msgid "%s \"%s\": %s" msgstr "%s \"%s\": %s" -#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:566 +#: access/transam/xlogarchive.c:456 access/transam/xlogarchive.c:536 #, c-format msgid "could not create archive status file \"%s\": %m" msgstr "kunde inte skapa arkiveringsstatusfil \"%s\": %m" -#: access/transam/xlogarchive.c:494 access/transam/xlogarchive.c:574 +#: access/transam/xlogarchive.c:464 access/transam/xlogarchive.c:544 #, c-format msgid "could not write archive status file \"%s\": %m" msgstr "kunde inte skriva arkiveringsstatusfil \"%s\": %m" -#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 +#: access/transam/xlogfuncs.c:69 backup/basebackup.c:997 #, c-format msgid "a backup is already in progress in this session" msgstr "en backup är redan pÃ¥ gÃ¥ng i denna session" -#: access/transam/xlogfuncs.c:126 +#: access/transam/xlogfuncs.c:140 #, c-format msgid "backup is not in progress" msgstr "ingen backup är pÃ¥ gÃ¥ng" -#: access/transam/xlogfuncs.c:127 +#: access/transam/xlogfuncs.c:141 #, c-format msgid "Did you call pg_backup_start()?" msgstr "Anropade du pg_backup_start()?" -#: access/transam/xlogfuncs.c:166 access/transam/xlogfuncs.c:193 -#: access/transam/xlogfuncs.c:232 access/transam/xlogfuncs.c:253 -#: access/transam/xlogfuncs.c:274 +#: access/transam/xlogfuncs.c:184 access/transam/xlogfuncs.c:242 +#: access/transam/xlogfuncs.c:281 access/transam/xlogfuncs.c:302 +#: access/transam/xlogfuncs.c:323 #, c-format msgid "WAL control functions cannot be executed during recovery." msgstr "WAL-kontrollfunktioner kan inte köras under Ã¥terställning." -#: access/transam/xlogfuncs.c:198 +#: access/transam/xlogfuncs.c:209 access/transam/xlogfuncs.c:389 +#: access/transam/xlogfuncs.c:447 +#, c-format +msgid "%s cannot be executed during recovery." +msgstr "%s kan inte köras under Ã¥terställning" + +#: access/transam/xlogfuncs.c:215 +#, c-format +msgid "pg_log_standby_snapshot() can only be used if \"wal_level\" >= \"replica\"" +msgstr "pg_log_standby_snapshot() kan bara användas om \"wal_level\" >= \"replica\"" + +#: access/transam/xlogfuncs.c:247 #, c-format msgid "WAL level not sufficient for creating a restore point" msgstr "WAL-nivÃ¥n är inte tillräcklig för att skapa en Ã¥terställningspunkt" -#: access/transam/xlogfuncs.c:206 +#: access/transam/xlogfuncs.c:255 #, c-format msgid "value too long for restore point (maximum %d characters)" msgstr "värdet för lÃ¥ngt för en Ã¥terställningspunkt (maximalt %d tecken)" -#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 +#: access/transam/xlogfuncs.c:486 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "%s kan inte köras under Ã¥terställning" +msgid "invalid WAL file name \"%s\"" +msgstr "ogiltigt WAL-filnamn \"%s\"" -#: access/transam/xlogfuncs.c:424 access/transam/xlogfuncs.c:454 -#: access/transam/xlogfuncs.c:478 access/transam/xlogfuncs.c:501 -#: access/transam/xlogfuncs.c:581 +#: access/transam/xlogfuncs.c:522 access/transam/xlogfuncs.c:552 +#: access/transam/xlogfuncs.c:576 access/transam/xlogfuncs.c:599 +#: access/transam/xlogfuncs.c:679 #, c-format msgid "recovery is not in progress" msgstr "Ã¥terställning är inte i gÃ¥ng" -#: access/transam/xlogfuncs.c:425 access/transam/xlogfuncs.c:455 -#: access/transam/xlogfuncs.c:479 access/transam/xlogfuncs.c:502 -#: access/transam/xlogfuncs.c:582 +#: access/transam/xlogfuncs.c:523 access/transam/xlogfuncs.c:553 +#: access/transam/xlogfuncs.c:577 access/transam/xlogfuncs.c:600 +#: access/transam/xlogfuncs.c:680 #, c-format msgid "Recovery control functions can only be executed during recovery." msgstr "Ã…terställningskontrollfunktioner kan bara köras under Ã¥terställning." -#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 +#: access/transam/xlogfuncs.c:528 access/transam/xlogfuncs.c:558 #, c-format msgid "standby promotion is ongoing" -msgstr "standby-befordring pÃ¥gÃ¥r" +msgstr "standby-befordran pÃ¥gÃ¥r" -#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 +#: access/transam/xlogfuncs.c:529 access/transam/xlogfuncs.c:559 #, c-format msgid "%s cannot be executed after promotion is triggered." msgstr "%s kan inte köras efter att befordran startats." -#: access/transam/xlogfuncs.c:587 +#: access/transam/xlogfuncs.c:685 #, c-format msgid "\"wait_seconds\" must not be negative or zero" msgstr "\"wait_seconds\" fÃ¥r inte vara negativ eller noll" -#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:252 +#: access/transam/xlogfuncs.c:707 storage/ipc/signalfuncs.c:265 #, c-format msgid "failed to send signal to postmaster: %m" msgstr "misslyckades med att sända en signal till postmaster: %m" -#: access/transam/xlogfuncs.c:643 +#: access/transam/xlogfuncs.c:739 libpq/be-secure.c:237 libpq/be-secure.c:346 +#, c-format +msgid "terminating connection due to unexpected postmaster exit" +msgstr "avslutar anslutning pÃ¥ grund av att postmaster stängde oväntat ner" + +#: access/transam/xlogfuncs.c:740 +#, c-format +msgid "while waiting on promotion" +msgstr "vid väntan pÃ¥ befordran" + +#: access/transam/xlogfuncs.c:744 #, c-format msgid "server did not promote within %d second" msgid_plural "server did not promote within %d seconds" msgstr[0] "servern befordrades inte inom %d sekund" msgstr[1] "servern befordrades inte inom %d sekunder" -#: access/transam/xlogprefetcher.c:1090 +#: access/transam/xlogprefetcher.c:1088 #, c-format -msgid "recovery_prefetch is not supported on platforms that lack posix_fadvise()." -msgstr "recovery_prefetch stöds inte pÃ¥ plattformar som saknar posix_fadvise()." +msgid "\"recovery_prefetch\" is not supported on platforms that lack posix_fadvise()." +msgstr "\"recovery_prefetch\" stöds inte pÃ¥ plattformar som saknar posix_fadvise()." -#: access/transam/xlogreader.c:625 +#: access/transam/xlogreader.c:619 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "ogiltig postoffset vid %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "ogiltig postlängd vid %X/%X: förväntade minst %u, fick %u" -#: access/transam/xlogreader.c:633 +#: access/transam/xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "contrecord är begärd vid %X/%X" -#: access/transam/xlogreader.c:674 access/transam/xlogreader.c:1121 -#, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "ogiltig postlängd vid %X/%X: förväntade %u, fick %u" - -#: access/transam/xlogreader.c:703 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "slut pÃ¥ minne vid avkodning av post med längden %u" - -#: access/transam/xlogreader.c:725 +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "postlängd %u vid %X/%X är för lÃ¥ng" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "ogiltig postlängd vid %X/%X: förväntade minst %u, fick %u" -#: access/transam/xlogreader.c:774 +#: access/transam/xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "det finns ingen contrecord-flagga vid %X/%X" -#: access/transam/xlogreader.c:787 +#: access/transam/xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "ogiltig contrecord-längd %u (förväntade %lld) vid %X/%X" -#: access/transam/xlogreader.c:922 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "det saknas en contrecord vid %X/%X" - -#: access/transam/xlogreader.c:1129 +#: access/transam/xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ogiltigt resurshanterar-ID %u vid %X/%X" -#: access/transam/xlogreader.c:1142 access/transam/xlogreader.c:1158 +#: access/transam/xlogreader.c:1155 access/transam/xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "post med inkorrekt prev-link %X/%X vid %X/%X" -#: access/transam/xlogreader.c:1194 +#: access/transam/xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "felaktig resurshanterardatakontrollsumma i post vid %X/%X" -#: access/transam/xlogreader.c:1231 +#: access/transam/xlogreader.c:1243 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "felaktigt magiskt nummer %04X i loggsegment %s, offset %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "felaktigt magiskt nummer %04X i WAL-segment %s, LSN %X/%X, offset %u" -#: access/transam/xlogreader.c:1245 access/transam/xlogreader.c:1286 +#: access/transam/xlogreader.c:1258 access/transam/xlogreader.c:1300 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "ogiltiga infobitar %04X i loggsegment %s, offset %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "ogiltiga infobitar %04X i WAL-segment %s, LSN %X/%X, offset %u" -#: access/transam/xlogreader.c:1260 +#: access/transam/xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL-fil är frÃ¥n ett annat databassystem: WAL-filens databassystemidentifierare är %llu, pg_control databassystemidentifierare är %llu" -#: access/transam/xlogreader.c:1268 +#: access/transam/xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" -msgstr "WAL-fil är frÃ¥n ett annat databassystem: inkorrekt segmentstorlek i sidhuvuid" +msgstr "WAL-fil är frÃ¥n ett annat databassystem: inkorrekt segmentstorlek i sidhuvud" -#: access/transam/xlogreader.c:1274 +#: access/transam/xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" -msgstr "WAL-fil är frÃ¥n ett annat databassystem: inkorrekt XLOG_BLCKSZ i sidhuvuid" +msgstr "WAL-fil är frÃ¥n ett annat databassystem: inkorrekt XLOG_BLCKSZ i sidhuvud" -#: access/transam/xlogreader.c:1305 +#: access/transam/xlogreader.c:1320 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "oväntad sidadress %X/%X i loggsegment %s, offset %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "oväntad sidadress %X/%X i WAL-segment %s, LSN %X/%X, offset %u" -# FIXME -#: access/transam/xlogreader.c:1330 +#: access/transam/xlogreader.c:1346 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "\"ej i sekvens\"-fel pÃ¥ tidslinje-ID %u (efter %u) i loggsegment %s, offset %u" +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "ej-i-sekvens för tidslinje-ID %u (efter %u) i WAL-segment %s, LSN %X/%X, offset %u" -#: access/transam/xlogreader.c:1735 +#: access/transam/xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "\"ej i sekvens\"-block_id %u vid %X/%X" -#: access/transam/xlogreader.c:1759 +#: access/transam/xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA är satt men ingen data inkluderad vid %X/%X" -#: access/transam/xlogreader.c:1766 +#: access/transam/xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA är ej satt men datalängden är %u vid %X/%X" -#: access/transam/xlogreader.c:1802 +#: access/transam/xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLE är satt men hÃ¥loffset %u längd %u block-image-längd %u vid %X/%X" +msgstr "BKPIMAGE_HAS_HOLE är satt men hÃ¥loffset %u längd %u blockavbildlängd %u vid %X/%X" -#: access/transam/xlogreader.c:1818 +#: access/transam/xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE är inte satt men hÃ¥loffset %u längd %u vid %X/%X" -#: access/transam/xlogreader.c:1832 +#: access/transam/xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" -msgstr "BKPIMAGE_COMPRESSED är satt men block-image-längd %u vid %X/%X" +msgstr "BKPIMAGE_COMPRESSED är satt men blockavbildlängd %u vid %X/%X" -#: access/transam/xlogreader.c:1847 +#: access/transam/xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" -msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED är satt men block-image-längd är %u vid %X/%X" +msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED är satt men blockavbildlängd är %u vid %X/%X" -#: access/transam/xlogreader.c:1863 +#: access/transam/xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL är satt men ingen tidigare rel vid %X/%X" -#: access/transam/xlogreader.c:1875 +#: access/transam/xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ogiltig block_id %u vid %X/%X" -#: access/transam/xlogreader.c:1942 +#: access/transam/xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "post med ogiltig längd vid %X/%X" -#: access/transam/xlogreader.c:1967 +#: access/transam/xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "kunde inte hitta backup-block med ID %d i WAL-post" -#: access/transam/xlogreader.c:2051 +#: access/transam/xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "kunde inte Ã¥terställa avbild vid %X/%X med ogiltigt block %d angivet" -#: access/transam/xlogreader.c:2058 +#: access/transam/xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" -msgstr "kunde inte Ã¥terställa image vid %X/%X med ogiltigt state, block %d" +msgstr "kunde inte Ã¥terställa avbild vid %X/%X med ogiltigt state, block %d" -#: access/transam/xlogreader.c:2085 access/transam/xlogreader.c:2102 +#: access/transam/xlogreader.c:2100 access/transam/xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" -msgstr "kunde inte Ã¥terställa image vid %X/%X, komprimerad med %s stöds inte av bygget, block %d" +msgstr "kunde inte Ã¥terställa avbild vid %X/%X, komprimerad med %s stöds inte av bygget, block %d" -#: access/transam/xlogreader.c:2111 +#: access/transam/xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" -msgstr "kunde inte Ã¥terställa image vid %X/%X, komprimerad med okänd metod, block %d" +msgstr "kunde inte Ã¥terställa avbild vid %X/%X, komprimerad med okänd metod, block %d" -#: access/transam/xlogreader.c:2119 +#: access/transam/xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" -msgstr "kunde inte packa upp image vid %X/%X, block %d" +msgstr "kunde inte packa upp avbild vid %X/%X, block %d" -#: access/transam/xlogrecovery.c:526 +#: access/transam/xlogrecovery.c:617 #, c-format -msgid "entering standby mode" -msgstr "gÃ¥r in i standby-läge" +msgid "starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on timeline ID %u" +msgstr "startar backupÃ¥terställning med redo LSN %X/%X, checkpoint LSN %X/%X, pÃ¥ tidslinje ID %u" -#: access/transam/xlogrecovery.c:529 +#: access/transam/xlogrecovery.c:649 #, c-format -msgid "starting point-in-time recovery to XID %u" -msgstr "startar point-in-time-Ã¥terställning till XID %u" +msgid "could not find redo location %X/%X referenced by checkpoint record at %X/%X" +msgstr "kunde inte hitta redo-position %X/%X refererad av checkpoint-post vid %X/%X" -#: access/transam/xlogrecovery.c:533 +#: access/transam/xlogrecovery.c:651 access/transam/xlogrecovery.c:662 #, c-format -msgid "starting point-in-time recovery to %s" -msgstr "startar point-in-time-Ã¥terställning till %s" +msgid "" +"If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/standby.signal\" and add required recovery options.\n" +"If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" +"Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." +msgstr "" +"Om du Ã¥terställer frÃ¥n en backup, gör touch pÃ¥ \"%s/recovery.signal\" eller \"%s/standby.signal\" och lägg till\n" +"önskade Ã¥terställningsalternativ. Om du inte Ã¥terställer frÃ¥n en backup, försök ta\n" +"bort filen \"%s/backup_label\". Var försiktig: borttagning av \"%s/backup_label\"\n" +"kommer resultera i ett trasigt kluster om du Ã¥terställer frÃ¥n en backup." -#: access/transam/xlogrecovery.c:537 +#: access/transam/xlogrecovery.c:660 #, c-format -msgid "starting point-in-time recovery to \"%s\"" -msgstr "startar point-in-time-Ã¥terställning till \"%s\"" +msgid "could not locate required checkpoint record at %X/%X" +msgstr "kunde inte hitta den checkpoint-post som krävs vid %X/%X" -#: access/transam/xlogrecovery.c:541 +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:664 #, c-format -msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" -msgstr "startar point-in-time-Ã¥terställning till WAL-position (LSN) \"%X/%X\"" +msgid "could not create symbolic link \"%s\": %m" +msgstr "kan inte skapa symbolisk länk \"%s\": %m" -#: access/transam/xlogrecovery.c:545 +#: access/transam/xlogrecovery.c:723 access/transam/xlogrecovery.c:729 #, c-format -msgid "starting point-in-time recovery to earliest consistent point" -msgstr "startar point-in-time-Ã¥terställning till tidigast konsistenta punkt" +msgid "ignoring file \"%s\" because no file \"%s\" exists" +msgstr "hoppar över fil \"%s\" dÃ¥ ingen fil \"%s\" finns" -#: access/transam/xlogrecovery.c:548 +#: access/transam/xlogrecovery.c:725 #, c-format -msgid "starting archive recovery" -msgstr "Startar arkivÃ¥terställning" +msgid "File \"%s\" was renamed to \"%s\"." +msgstr "Filen \"%s\" döptes om till \"%s\"." -#: access/transam/xlogrecovery.c:632 +#: access/transam/xlogrecovery.c:731 #, c-format -msgid "could not find redo location referenced by checkpoint record" -msgstr "kunde inte hitta redo-position refererad av checkpoint-post" +msgid "Could not rename file \"%s\" to \"%s\": %m." +msgstr "Kunde inte döpa om fil \"%s\" till \"%s\": %m" -#: access/transam/xlogrecovery.c:633 access/transam/xlogrecovery.c:643 +#: access/transam/xlogrecovery.c:770 #, c-format -msgid "" -"If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" -"If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" -"Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." -msgstr "" -"Om du Ã¥terställer frÃ¥n en backup, gör touch pÃ¥ \"%s/recovery.signal\" och lägg till\n" -"önskade Ã¥terställningsalternativ. Om du inte Ã¥terställer frÃ¥n en backup, försök ta\n" -"bort filen \"%s/backup_label\". Var försiktig: borttagning av \"%s/backup_label\"\n" -"kommer resultera i ett trasigt kluster om du Ã¥terställer frÃ¥n en backup." +msgid "restarting backup recovery with redo LSN %X/%X" +msgstr "startar om backupÃ¥terställning med redo LSN %X/%X" -#: access/transam/xlogrecovery.c:642 +#: access/transam/xlogrecovery.c:795 #, c-format -msgid "could not locate required checkpoint record" -msgstr "kunde inte hitta den checkpoint-post som krävs" +msgid "could not locate a valid checkpoint record at %X/%X" +msgstr "kunde inte hitta en giltig checkpoint-post vid %X/%X" -#: access/transam/xlogrecovery.c:671 commands/tablespace.c:685 +#: access/transam/xlogrecovery.c:806 #, c-format -msgid "could not create symbolic link \"%s\": %m" -msgstr "kan inte skapa symbolisk länk \"%s\": %m" +msgid "entering standby mode" +msgstr "gÃ¥r in i standby-läge" -#: access/transam/xlogrecovery.c:703 access/transam/xlogrecovery.c:709 +#: access/transam/xlogrecovery.c:809 #, c-format -msgid "ignoring file \"%s\" because no file \"%s\" exists" -msgstr "hoppar över fil \"%s\" dÃ¥ ingen fil \"%s\" finns" +msgid "starting point-in-time recovery to XID %u" +msgstr "startar point-in-time-Ã¥terställning till XID %u" -#: access/transam/xlogrecovery.c:705 +#: access/transam/xlogrecovery.c:813 #, c-format -msgid "File \"%s\" was renamed to \"%s\"." -msgstr "Filen \"%s\" döptes om till \"%s\"." +msgid "starting point-in-time recovery to %s" +msgstr "startar point-in-time-Ã¥terställning till %s" -#: access/transam/xlogrecovery.c:711 +#: access/transam/xlogrecovery.c:817 #, c-format -msgid "Could not rename file \"%s\" to \"%s\": %m." -msgstr "Kunde inte döpa om fil \"%s\" till \"%s\": %m" +msgid "starting point-in-time recovery to \"%s\"" +msgstr "startar point-in-time-Ã¥terställning till \"%s\"" + +#: access/transam/xlogrecovery.c:821 +#, c-format +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "startar point-in-time-Ã¥terställning till WAL-position (LSN) \"%X/%X\"" + +#: access/transam/xlogrecovery.c:825 +#, c-format +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "startar point-in-time-Ã¥terställning till tidigast konsistenta punkt" -#: access/transam/xlogrecovery.c:765 +#: access/transam/xlogrecovery.c:828 #, c-format -msgid "could not locate a valid checkpoint record" -msgstr "kunde inte hitta en giltig checkpoint-post" +msgid "starting archive recovery" +msgstr "Startar arkivÃ¥terställning" -#: access/transam/xlogrecovery.c:789 +#: access/transam/xlogrecovery.c:849 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "efterfrÃ¥gad tidslinje %u är inte ett barn till denna servers historik" -#: access/transam/xlogrecovery.c:791 +#: access/transam/xlogrecovery.c:851 #, c-format msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." msgstr "Senaste checkpoint är vid %X/%X pÃ¥ tidslinje %u, men i historiken för efterfrÃ¥gad tidslinje sÃ¥ avvek servern frÃ¥n den tidslinjen vid %X/%X." -#: access/transam/xlogrecovery.c:805 +#: access/transam/xlogrecovery.c:865 #, c-format msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" msgstr "efterfÃ¥gan tidslinje %u innehÃ¥ller inte minimal Ã¥terställningspunkt %X/%X pÃ¥ tidslinje %u" -#: access/transam/xlogrecovery.c:833 +#: access/transam/xlogrecovery.c:893 #, c-format msgid "invalid next transaction ID" msgstr "nästa transaktions-ID ogiltig" -#: access/transam/xlogrecovery.c:838 +#: access/transam/xlogrecovery.c:898 #, c-format msgid "invalid redo in checkpoint record" msgstr "ogiltig redo i checkpoint-post" -#: access/transam/xlogrecovery.c:849 +#: access/transam/xlogrecovery.c:909 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "ogiltig redo-post i nedstängnings-checkpoint" -#: access/transam/xlogrecovery.c:878 +#: access/transam/xlogrecovery.c:938 #, c-format msgid "database system was not properly shut down; automatic recovery in progress" msgstr "databassystemet stängdes inte ned korrekt; automatisk Ã¥terställning pÃ¥gÃ¥r" -#: access/transam/xlogrecovery.c:882 +#: access/transam/xlogrecovery.c:942 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "krashÃ¥terställning startar i tidslinje %u och har mÃ¥ltidslinje %u" -#: access/transam/xlogrecovery.c:925 +#: access/transam/xlogrecovery.c:985 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_label innehÃ¥ller data som inte stämmer med kontrollfil" -#: access/transam/xlogrecovery.c:926 +#: access/transam/xlogrecovery.c:986 #, c-format msgid "This means that the backup is corrupted and you will have to use another backup for recovery." msgstr "Det betyder att backup:en är trasig och du behöver använda en annan backup för att Ã¥terställa." -#: access/transam/xlogrecovery.c:980 +#: access/transam/xlogrecovery.c:1040 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "använda Ã¥terställningskommandofil \"%s\" stöds inte" -#: access/transam/xlogrecovery.c:1045 +#: access/transam/xlogrecovery.c:1105 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "standby-läge stöd inte av enanvändarservrar" -#: access/transam/xlogrecovery.c:1062 +#: access/transam/xlogrecovery.c:1122 #, c-format -msgid "specified neither primary_conninfo nor restore_command" -msgstr "angav varken primary_conninfo eller restore_command" +msgid "specified neither \"primary_conninfo\" nor \"restore_command\"" +msgstr "angav varken \"primary_conninfo\" eller \"restore_command\"" -#: access/transam/xlogrecovery.c:1063 +#: access/transam/xlogrecovery.c:1123 #, c-format msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." msgstr "Databasservern kommer med jämna mellanrum att poll:a pg_wal-underkatalogen för att se om filer placerats där." -#: access/transam/xlogrecovery.c:1071 +#: access/transam/xlogrecovery.c:1131 #, c-format -msgid "must specify restore_command when standby mode is not enabled" -msgstr "mÃ¥ste ange restore_command när standby-läge inte är pÃ¥slaget" +msgid "must specify \"restore_command\" when standby mode is not enabled" +msgstr "mÃ¥ste ange \"restore_command\" när standby-läge inte är pÃ¥slaget" -#: access/transam/xlogrecovery.c:1109 +#: access/transam/xlogrecovery.c:1169 #, c-format msgid "recovery target timeline %u does not exist" msgstr "Ã¥terställningsmÃ¥ltidslinje %u finns inte" -#: access/transam/xlogrecovery.c:1259 +#: access/transam/xlogrecovery.c:1252 access/transam/xlogrecovery.c:1259 +#: access/transam/xlogrecovery.c:1318 access/transam/xlogrecovery.c:1406 +#: access/transam/xlogrecovery.c:1415 access/transam/xlogrecovery.c:1435 +#, c-format +msgid "invalid data in file \"%s\"" +msgstr "felaktig data i fil \"%s\"" + +#: access/transam/xlogrecovery.c:1319 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "Parsad tidslinje-ID är %u men förväntade sig %u." -#: access/transam/xlogrecovery.c:1641 +#: access/transam/xlogrecovery.c:1330 +#, c-format +msgid "this is an incremental backup, not a data directory" +msgstr "detta är en inkrementell backup, inte en datakatalog" + +#: access/transam/xlogrecovery.c:1331 +#, c-format +msgid "Use pg_combinebackup to reconstruct a valid data directory." +msgstr "Använd pg_combinebackup för att Ã¥terskapa en giltig datakatalog." + +#: access/transam/xlogrecovery.c:1717 +#, c-format +msgid "unexpected record type found at redo point %X/%X" +msgstr "oväntad typ pÃ¥ post hittad vid redo-punkt %X/%X" + +#: access/transam/xlogrecovery.c:1740 #, c-format msgid "redo starts at %X/%X" msgstr "redo startar vid %X/%X" -#: access/transam/xlogrecovery.c:1654 +#: access/transam/xlogrecovery.c:1753 #, c-format msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" msgstr "redo pÃ¥gÃ¥r, förbrukad tid: %ld.%02d s, nuvarande LSN: %X/%X" -#: access/transam/xlogrecovery.c:1746 +#: access/transam/xlogrecovery.c:1843 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "efterfrÃ¥gad Ã¥terställningsstoppunkt är före en konsistent Ã¥terställningspunkt" -#: access/transam/xlogrecovery.c:1778 +#: access/transam/xlogrecovery.c:1875 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "redo gjord vid %X/%X systemanvändning: %s" -#: access/transam/xlogrecovery.c:1784 +#: access/transam/xlogrecovery.c:1881 #, c-format msgid "last completed transaction was at log time %s" msgstr "senaste kompletta transaktionen var vid loggtid %s" -#: access/transam/xlogrecovery.c:1793 +#: access/transam/xlogrecovery.c:1890 #, c-format msgid "redo is not required" msgstr "redo behövs inte" -#: access/transam/xlogrecovery.c:1804 +#: access/transam/xlogrecovery.c:1901 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "Ã¥terställning avslutades innan det konfigurerade Ã¥terställningsmÃ¥let nÃ¥ddes" -#: access/transam/xlogrecovery.c:1979 +#: access/transam/xlogrecovery.c:2095 #, c-format msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" msgstr "lyckades hoppa över saknad contrecord vid %X/%X, överskriven vid %s" -#: access/transam/xlogrecovery.c:2046 +#: access/transam/xlogrecovery.c:2162 #, c-format msgid "unexpected directory entry \"%s\" found in %s" msgstr "Oväntat katalogpost \"%s\" hittades i %s" -#: access/transam/xlogrecovery.c:2048 +#: access/transam/xlogrecovery.c:2164 #, c-format msgid "All directory entries in pg_tblspc/ should be symbolic links." msgstr "Alla katalogposter i pg_tblspc/ skall vara symboliska länkar" -#: access/transam/xlogrecovery.c:2049 +#: access/transam/xlogrecovery.c:2165 +#, c-format +msgid "Remove those directories, or set \"allow_in_place_tablespaces\" to ON transiently to let recovery complete." +msgstr "Ta bort dessa kataloger eller sätt \"allow_in_place_tablespaces\" temporärt till ON och lÃ¥t Ã¥terställningen gÃ¥ klart." + +#: access/transam/xlogrecovery.c:2217 #, c-format -msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." -msgstr "Ta bort dessa kataloger eller sätt allow_in_place_tablespaces temporärt till ON och lÃ¥t Ã¥terställningen gÃ¥ klart." +msgid "completed backup recovery with redo LSN %X/%X and end LSN %X/%X" +msgstr "slutförde backupÃ¥terställning vid redo-LSN %X/%X och slut-LSN %X/%X" -#: access/transam/xlogrecovery.c:2123 +#: access/transam/xlogrecovery.c:2247 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "konsistent Ã¥terställningstillstÃ¥nd uppnÃ¥tt vid %X/%X" #. translator: %s is a WAL record description -#: access/transam/xlogrecovery.c:2161 +#: access/transam/xlogrecovery.c:2285 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "WAL-redo vid %X/%X för %s" -#: access/transam/xlogrecovery.c:2257 +#: access/transam/xlogrecovery.c:2383 #, c-format msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" msgstr "oväntad föregÃ¥ende tidslinje-ID %u (nuvarande tidslinje-ID %u) i checkpoint-post" -#: access/transam/xlogrecovery.c:2266 +#: access/transam/xlogrecovery.c:2392 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "oväntad tidslinje-ID %u (efter %u) i checkpoint-post" -#: access/transam/xlogrecovery.c:2282 +#: access/transam/xlogrecovery.c:2408 #, c-format msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" msgstr "oväntad tidslinje-ID %u i checkpoint-post, innan vi nÃ¥tt minimal Ã¥terställningspunkt %X/%X pÃ¥ tidslinje %u" -#: access/transam/xlogrecovery.c:2466 access/transam/xlogrecovery.c:2742 +#: access/transam/xlogrecovery.c:2592 access/transam/xlogrecovery.c:2868 #, c-format msgid "recovery stopping after reaching consistency" msgstr "Ã¥terställning stoppad efter att ha uppnÃ¥tt konsistens" -#: access/transam/xlogrecovery.c:2487 +#: access/transam/xlogrecovery.c:2613 #, c-format msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" msgstr "Ã¥terställning stoppad före WAL-position (LSN) \"%X/%X\"" -#: access/transam/xlogrecovery.c:2577 +#: access/transam/xlogrecovery.c:2703 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "Ã¥terställning stoppad före commit av transaktion %u, tid %s" -#: access/transam/xlogrecovery.c:2584 +#: access/transam/xlogrecovery.c:2710 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "Ã¥terställning stoppad före abort av transaktion %u, tid %s" -#: access/transam/xlogrecovery.c:2637 +#: access/transam/xlogrecovery.c:2763 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "Ã¥terställning stoppad vid Ã¥terställningspunkt \"%s\", tid %s" -#: access/transam/xlogrecovery.c:2655 +#: access/transam/xlogrecovery.c:2781 #, c-format msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" msgstr "Ã¥terställning stoppad efter WAL-position (LSN) \"%X/%X\"" -#: access/transam/xlogrecovery.c:2722 +#: access/transam/xlogrecovery.c:2848 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "Ã¥terställning stoppad efter commit av transaktion %u, tid %s" -#: access/transam/xlogrecovery.c:2730 +#: access/transam/xlogrecovery.c:2856 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "Ã¥terställning stoppad efter abort av transaktion %u, tid %s" -#: access/transam/xlogrecovery.c:2811 +#: access/transam/xlogrecovery.c:2937 #, c-format msgid "pausing at the end of recovery" msgstr "pausar vid slutet av Ã¥terställning" -#: access/transam/xlogrecovery.c:2812 +#: access/transam/xlogrecovery.c:2938 #, c-format msgid "Execute pg_wal_replay_resume() to promote." msgstr "Kör pg_wal_replay_resume() för att befordra." -#: access/transam/xlogrecovery.c:2815 access/transam/xlogrecovery.c:4625 +#: access/transam/xlogrecovery.c:2941 access/transam/xlogrecovery.c:4679 #, c-format msgid "recovery has paused" msgstr "Ã¥terställning har pausats" -#: access/transam/xlogrecovery.c:2816 +#: access/transam/xlogrecovery.c:2942 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "Kör pg_wal_replay_resume() för att fortsätta." -#: access/transam/xlogrecovery.c:3082 -#, c-format -msgid "unexpected timeline ID %u in log segment %s, offset %u" -msgstr "oväntad tidslinje-ID %u i loggsegment %s, offset %u" - -#: access/transam/xlogrecovery.c:3287 -#, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "kunde inte läsa frÃ¥n loggsegment %s, offset %u: %m" - -#: access/transam/xlogrecovery.c:3293 +#: access/transam/xlogrecovery.c:3205 #, c-format -msgid "could not read from log segment %s, offset %u: read %d of %zu" -msgstr "kunde inte läsa frÃ¥n loggsegment %s, offset %u, läste %d av %zu" +msgid "unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u" +msgstr "oväntad tidslinje-ID %u i WAL-segment %s, LSN %X/%X, offset %u" -#: access/transam/xlogrecovery.c:3942 +#: access/transam/xlogrecovery.c:3413 #, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "ogiltig primär checkpoint-länk i kontrollfil" +msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: %m" +msgstr "kunde inte läsa frÃ¥n WAL-segment %s, LSN %X/%X, offset %u: %m" -#: access/transam/xlogrecovery.c:3946 +#: access/transam/xlogrecovery.c:3420 #, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "ogiltig checkpoint-länk i \"backup_label\"-fil" +msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu" +msgstr "kunde inte läsa frÃ¥n WAL-segment %s, LSN %X/%X, offset %u, läste %d av %zu" -#: access/transam/xlogrecovery.c:3964 +#: access/transam/xlogrecovery.c:4061 #, c-format -msgid "invalid primary checkpoint record" -msgstr "ogiltig primär checkpoint-post" +msgid "invalid checkpoint location" +msgstr "ogiltig checkpoint-position" -#: access/transam/xlogrecovery.c:3968 +#: access/transam/xlogrecovery.c:4071 #, c-format msgid "invalid checkpoint record" msgstr "ogiltig checkpoint-post" -#: access/transam/xlogrecovery.c:3979 -#, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "ogiltig resurshanterar-ID i primär checkpoint-post" - -#: access/transam/xlogrecovery.c:3983 +#: access/transam/xlogrecovery.c:4077 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "ogiltig resurshanterar-ID i checkpoint-post" -#: access/transam/xlogrecovery.c:3996 -#, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "ogiltig xl_info i primär checkpoint-post" - -#: access/transam/xlogrecovery.c:4000 +#: access/transam/xlogrecovery.c:4085 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "ogiltig xl_info i checkpoint-post" -#: access/transam/xlogrecovery.c:4011 -#, c-format -msgid "invalid length of primary checkpoint record" -msgstr "ogiltig längd i primär checkpoint-post" - -#: access/transam/xlogrecovery.c:4015 +#: access/transam/xlogrecovery.c:4091 #, c-format msgid "invalid length of checkpoint record" msgstr "ogiltig längd pÃ¥ checkpoint-post" -#: access/transam/xlogrecovery.c:4071 +#: access/transam/xlogrecovery.c:4145 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "ny tidslinje %u är inte ett barn till databasens systemtidslinje %u" -#: access/transam/xlogrecovery.c:4085 +#: access/transam/xlogrecovery.c:4159 #, c-format msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" msgstr "ny tidslinje %u skapad frÃ¥n aktuella databasens systemtidslinje %u innan nuvarande Ã¥terställningspunkt %X/%X" -#: access/transam/xlogrecovery.c:4104 +#: access/transam/xlogrecovery.c:4178 #, c-format msgid "new target timeline is %u" msgstr "ny mÃ¥ltidslinje är %u" -#: access/transam/xlogrecovery.c:4307 +#: access/transam/xlogrecovery.c:4381 #, c-format msgid "WAL receiver process shutdown requested" msgstr "nedstängning av WAL-mottagarprocess efterfrÃ¥gad" -#: access/transam/xlogrecovery.c:4370 +#: access/transam/xlogrecovery.c:4441 #, c-format msgid "received promote request" -msgstr "tog emot förfrÃ¥gan om befordring" - -#: access/transam/xlogrecovery.c:4383 -#, c-format -msgid "promote trigger file found: %s" -msgstr "triggerfil för befordring hittad: %s" - -#: access/transam/xlogrecovery.c:4391 -#, c-format -msgid "could not stat promote trigger file \"%s\": %m" -msgstr "kunde inte göra stat() pÃ¥ triggerfil för befordring \"%s\": %m" +msgstr "tog emot förfrÃ¥gan om befordran" -#: access/transam/xlogrecovery.c:4616 +#: access/transam/xlogrecovery.c:4670 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "hot standby är inte möjligt pÃ¥ grund av otillräckliga parameterinställningar" -#: access/transam/xlogrecovery.c:4617 access/transam/xlogrecovery.c:4644 -#: access/transam/xlogrecovery.c:4674 +#: access/transam/xlogrecovery.c:4671 access/transam/xlogrecovery.c:4698 +#: access/transam/xlogrecovery.c:4728 #, c-format msgid "%s = %d is a lower setting than on the primary server, where its value was %d." msgstr "%s = %d har ett lägre värde än pÃ¥ primärservern där värdet var %d." -#: access/transam/xlogrecovery.c:4626 +#: access/transam/xlogrecovery.c:4680 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "Om Ã¥terställning avpausas sÃ¥ kommer servern stänga ner." -#: access/transam/xlogrecovery.c:4627 +#: access/transam/xlogrecovery.c:4681 #, c-format msgid "You can then restart the server after making the necessary configuration changes." msgstr "Du kan dÃ¥ Ã¥terstarta servern efter att ha gjort de nödvändiga konfigurationsändringarna." -#: access/transam/xlogrecovery.c:4638 +#: access/transam/xlogrecovery.c:4692 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "befordran är inte möjligt pÃ¥ grund av otillräckliga parameterinställningar" -#: access/transam/xlogrecovery.c:4648 +#: access/transam/xlogrecovery.c:4702 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "Starta om servern efter att ha gjort de nödvändiga konfigurationsändringarna." -#: access/transam/xlogrecovery.c:4672 +#: access/transam/xlogrecovery.c:4726 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "Ã¥terställning avbruten pÃ¥ grund av otillräckliga parametervärden" -#: access/transam/xlogrecovery.c:4678 +#: access/transam/xlogrecovery.c:4732 #, c-format msgid "You can restart the server after making the necessary configuration changes." msgstr "Du kan starta om servern efter att du gjort de nödvändiga konfigurationsändringarna." -#: access/transam/xlogutils.c:1053 +#: access/transam/xlogrecovery.c:4774 +#, c-format +msgid "multiple recovery targets specified" +msgstr "multipla Ã¥terställningsmÃ¥l angivna" + +#: access/transam/xlogrecovery.c:4775 +#, c-format +msgid "At most one of \"recovery_target\", \"recovery_target_lsn\", \"recovery_target_name\", \"recovery_target_time\", \"recovery_target_xid\" may be set." +msgstr "Som mest en av \"recovery_target\", \"recovery_target_lsn\", \"recovery_target_name\", \"recovery_target_time\" och \"recovery_target_xid\" kan sättas." + +#: access/transam/xlogrecovery.c:4786 +#, c-format +msgid "The only allowed value is \"immediate\"." +msgstr "Det enda tillÃ¥tna värdet är \"immediate\"." + +#: access/transam/xlogrecovery.c:4938 utils/adt/timestamp.c:202 +#: utils/adt/timestamp.c:455 +#, c-format +msgid "timestamp out of range: \"%s\"" +msgstr "timestamp utanför giltigt intervall: \"%s\"" + +#: access/transam/xlogrecovery.c:4983 +#, c-format +msgid "\"recovery_target_timeline\" is not a valid number." +msgstr "\"recovery_target_timeline\" är inte ett giltigt nummer." + +#: access/transam/xlogutils.c:1032 +#, c-format +msgid "could not read from WAL segment %s, offset %d: %m" +msgstr "kunde inte läsa frÃ¥n WAL-segment %s, offset %d: %m" + +#: access/transam/xlogutils.c:1039 +#, c-format +msgid "could not read from WAL segment %s, offset %d: read %d of %d" +msgstr "kunde inte läsa frÃ¥n WAL-segment %s, offset %d, läste %d av %d" + +#: archive/shell_archive.c:98 +#, c-format +msgid "archive command failed with exit code %d" +msgstr "arkiveringskommando misslyckades med felkod %d" + +#: archive/shell_archive.c:100 archive/shell_archive.c:110 +#: archive/shell_archive.c:116 archive/shell_archive.c:125 +#, c-format +msgid "The failed archive command was: %s" +msgstr "Det misslyckade arkiveringskommandot var: %s" + +#: archive/shell_archive.c:107 +#, c-format +msgid "archive command was terminated by exception 0x%X" +msgstr "arkiveringskommandot terminerades med avbrott 0x%X" + +#: archive/shell_archive.c:109 postmaster/postmaster.c:3095 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "Se C-include-fil \"ntstatus.h\" för en beskrivning av det hexdecimala värdet." + +#: archive/shell_archive.c:114 #, c-format -msgid "could not read from log segment %s, offset %d: %m" -msgstr "kunde inte läsa frÃ¥n loggsegment %s, offset %d: %m" +msgid "archive command was terminated by signal %d: %s" +msgstr "arkiveringskommandot terminerades av signal %d: %s" -#: access/transam/xlogutils.c:1060 +#: archive/shell_archive.c:123 #, c-format -msgid "could not read from log segment %s, offset %d: read %d of %d" -msgstr "kunde inte läsa frÃ¥n loggsegment %s, offset %d, läste %d av %d" +msgid "archive command exited with unrecognized status %d" +msgstr "arkiveringskommandot avslutade med okänd statuskod %d" -#: backup/backup_manifest.c:253 +#: backup/backup_manifest.c:254 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "förväntade sluttidslinje %u men hittade tidslinje %u" -#: backup/backup_manifest.c:277 +#: backup/backup_manifest.c:278 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "förväntade starttidslinje %u men hittade tidslinje %u" -#: backup/backup_manifest.c:304 +#: backup/backup_manifest.c:305 #, c-format msgid "start timeline %u not found in history of timeline %u" msgstr "starttidslinje %u hittades inte i historiken för tidslinje %u" -#: backup/backup_manifest.c:355 +#: backup/backup_manifest.c:356 #, c-format msgid "could not rewind temporary file" msgstr "kunde inte spola tillbaka temporär fil" -#: backup/backup_manifest.c:374 -#, c-format -msgid "could not read from temporary file: read only %zu of %zu bytes" -msgstr "kunde inte läsa frÃ¥n temporärfil: läste bara %zu av %zu byte" - -#: backup/basebackup.c:454 +#: backup/basebackup.c:479 #, c-format msgid "could not find any WAL files" msgstr "kunde inte hitta nÃ¥gra WAL-filer" -#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 +#: backup/basebackup.c:494 backup/basebackup.c:509 backup/basebackup.c:518 #, c-format msgid "could not find WAL file \"%s\"" msgstr "kunde inte hitta WAL-fil \"%s\"" -#: backup/basebackup.c:535 backup/basebackup.c:560 +#: backup/basebackup.c:560 backup/basebackup.c:585 #, c-format msgid "unexpected WAL file size \"%s\"" msgstr "oväntad WAL-filstorlek \"%s\"" -#: backup/basebackup.c:630 +#: backup/basebackup.c:656 #, c-format msgid "%lld total checksum verification failure" msgid_plural "%lld total checksum verification failures" msgstr[0] "totalt %lld verifieringsfel av checksumma" msgstr[1] "totalt %lld verifieringsfel av checksumma" -#: backup/basebackup.c:637 +#: backup/basebackup.c:663 #, c-format msgid "checksum verification failure during base backup" msgstr "misslyckad verifiering av checksumma under basbackup" -#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 -#: backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 -#: backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 -#: backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 -#: backup/basebackup.c:861 backup/basebackup.c:874 +#: backup/basebackup.c:733 backup/basebackup.c:742 backup/basebackup.c:753 +#: backup/basebackup.c:770 backup/basebackup.c:779 backup/basebackup.c:788 +#: backup/basebackup.c:803 backup/basebackup.c:820 backup/basebackup.c:829 +#: backup/basebackup.c:841 backup/basebackup.c:865 backup/basebackup.c:879 +#: backup/basebackup.c:890 backup/basebackup.c:901 backup/basebackup.c:914 #, c-format msgid "duplicate option \"%s\"" msgstr "duplicerad flagga \"%s\"" -#: backup/basebackup.c:734 +#: backup/basebackup.c:761 #, c-format msgid "unrecognized checkpoint type: \"%s\"" msgstr "okänd checkpoint-typ: \"%s\"" -#: backup/basebackup.c:769 +#: backup/basebackup.c:793 +#, c-format +msgid "incremental backups cannot be taken unless WAL summarization is enabled" +msgstr "inkrementella backup:er kan inte tas om inte WAL-summering är pÃ¥slagen" + +#: backup/basebackup.c:809 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d är utanför giltigt intervall för parameter \"%s\" (%d .. %d)" -#: backup/basebackup.c:814 +#: backup/basebackup.c:854 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "okänd manifestflagga: \"%s\"" -#: backup/basebackup.c:830 -#, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "okänd checksum-algoritm: \"%s\"" - -#: backup/basebackup.c:865 +#: backup/basebackup.c:905 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "okänd komprimeringsalgoritm: \"%s\"" -#: backup/basebackup.c:881 +#: backup/basebackup.c:921 #, c-format msgid "unrecognized base backup option: \"%s\"" msgstr "okänd basbackupflagga: \"%s\"" -#: backup/basebackup.c:892 +#: backup/basebackup.c:932 #, c-format msgid "manifest checksums require a backup manifest" msgstr "manifestchecksummor kräver ett backup-manifest" -#: backup/basebackup.c:901 +#: backup/basebackup.c:941 #, c-format msgid "target detail cannot be used without target" msgstr "mÃ¥linställningar kan inte användas utan ett mÃ¥l" -#: backup/basebackup.c:910 backup/basebackup_target.c:218 +#: backup/basebackup.c:950 backup/basebackup_target.c:218 #, c-format msgid "target \"%s\" does not accept a target detail" msgstr "mÃ¥let \"%s\" stöder inte mÃ¥linställningar" -#: backup/basebackup.c:921 +#: backup/basebackup.c:961 #, c-format msgid "compression detail cannot be specified unless compression is enabled" msgstr "komprimeringsinställning kan inte anges om komprimering inte är pÃ¥slagen" -#: backup/basebackup.c:934 +#: backup/basebackup.c:974 #, c-format msgid "invalid compression specification: %s" msgstr "ogiltig inställning för komprimering: %s" -#: backup/basebackup.c:1431 +#: backup/basebackup.c:1024 #, c-format -msgid "skipping special file \"%s\"" -msgstr "hoppar över specialfil \"%s\"" +msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" +msgstr "mÃ¥ste UPLOAD_MANIFEST innan befordran av en inkrementell BASE_BACKUP" -#: backup/basebackup.c:1550 +#: backup/basebackup.c:1157 backup/basebackup.c:1358 #, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "ogiltigt segmentnummer %d i fil \"%s\"" +msgid "could not stat file or directory \"%s\": %m" +msgstr "kunde inte ta status pÃ¥ fil eller katalog \"%s\": %m" + +#: backup/basebackup.c:1544 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "hoppar över specialfil \"%s\"" -#: backup/basebackup.c:1590 +#: backup/basebackup.c:1751 #, c-format msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" msgstr "kunde inte verifiera checksumma i fil \"%s\", block %u: läsbufferstorlek %d och sidstorlek %d skiljer sig Ã¥t" -#: backup/basebackup.c:1664 +#: backup/basebackup.c:1813 +#, c-format +msgid "file \"%s\" has a total of %d checksum verification failure" +msgid_plural "file \"%s\" has a total of %d checksum verification failures" +msgstr[0] "filen \"%s\" har totalt %d kontrollerad felaktiga checksumma" +msgstr[1] "filen \"%s\" har totalt %d kontrollerade felaktiga checksummor" + +#: backup/basebackup.c:1917 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" msgstr "checksumkontroll misslyckades i fil \"%s\", block %u: beräknade %X men förväntade %X" -#: backup/basebackup.c:1671 +#: backup/basebackup.c:1924 #, c-format msgid "further checksum verification failures in file \"%s\" will not be reported" msgstr "ytterligare kontroller av checksummor i fil \"%s\" kommer inte rapporteras" -#: backup/basebackup.c:1718 -#, c-format -msgid "file \"%s\" has a total of %d checksum verification failure" -msgid_plural "file \"%s\" has a total of %d checksum verification failures" -msgstr[0] "filen \"%s\" har totalt %d kontrollerad felaktiga checksumma" -msgstr[1] "filen \"%s\" har totalt %d kontrollerade felaktiga checksummor" - -#: backup/basebackup.c:1764 +#: backup/basebackup.c:2048 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "filnamnet är för lÃ¥ngt för tar-format: \"%s\"" -#: backup/basebackup.c:1769 +#: backup/basebackup.c:2053 #, c-format msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" msgstr "mÃ¥l för symbolisk länk är för lÃ¥ngt för tar-format: filnamn \"%s\", mÃ¥l \"%s\"" +#: backup/basebackup.c:2127 +#, c-format +msgid "could not read file \"%s\": read %zd of %zu" +msgstr "kunde inte läsa fil \"%s\": läste %zd av %zu" + #: backup/basebackup_gzip.c:67 #, c-format msgid "gzip compression is not supported by this build" @@ -3566,24 +3912,89 @@ msgstr "gzip-komprimering stöds inte av detta bygge" msgid "could not initialize compression library" msgstr "kunde inte initierar komprimeringsbibliotek" +#: backup/basebackup_incremental.c:294 +#, c-format +msgid "manifest contains no required WAL ranges" +msgstr "manifestet innehÃ¥ller inga WAL-intervall som krävs" + +#: backup/basebackup_incremental.c:349 +#, c-format +msgid "timeline %u found in manifest, but not in this server's history" +msgstr "tidslinje %u hittades i manifest men inte i denna servers historik" + +#: backup/basebackup_incremental.c:414 +#, c-format +msgid "manifest requires WAL from initial timeline %u starting at %X/%X, but that timeline begins at %X/%X" +msgstr "manifestet kräver WAL frÃ¥n initiala tidslinjen %u vid start %X/%X men den tidslinjen börjar vid %X/%X" + +#: backup/basebackup_incremental.c:424 +#, c-format +msgid "manifest requires WAL from continuation timeline %u starting at %X/%X, but that timeline begins at %X/%X" +msgstr "manifestet kräver WAL frÃ¥n tidslinje %u att fortsätta med som startar vid %X/%X men den tidslinjen börjar vid %X/%X" + +#: backup/basebackup_incremental.c:435 +#, c-format +msgid "manifest requires WAL from final timeline %u ending at %X/%X, but this backup starts at %X/%X" +msgstr "manifestet kräver WAL frÃ¥n avslutande tidslinje %u som slutar vid %X/%X, men denna backup startar vid %X/%X" + +#: backup/basebackup_incremental.c:439 +#, c-format +msgid "This can happen for incremental backups on a standby if there was little activity since the previous backup." +msgstr "Detta kan hända vid inkrementella backuper pÃ¥ en standby om det är lite aktivitet frÃ¥n föregÃ¥ende backup." + +#: backup/basebackup_incremental.c:446 +#, c-format +msgid "manifest requires WAL from non-final timeline %u ending at %X/%X, but this server switched timelines at %X/%X" +msgstr "manifestet kräver WAL frÃ¥n en icke avslutande tidslinje %u som slutar vid %X/%X men denns server bytte tidslinje vid %X/%X" + +#: backup/basebackup_incremental.c:527 +#, c-format +msgid "WAL summaries are required on timeline %u from %X/%X to %X/%X, but no summaries for that timeline and LSN range exist" +msgstr "WAL-summering krävs för tidslinje %u frÃ¥n %X/%X till %X/%X men inga summeringar för den tidslinjen och det LSN-intervallet finns" + +#: backup/basebackup_incremental.c:534 +#, c-format +msgid "WAL summaries are required on timeline %u from %X/%X to %X/%X, but the summaries for that timeline and LSN range are incomplete" +msgstr "WAL-summering krävs för tidslinje %u frÃ¥n %X/%X till %X/%X men summeringar för den tidslinjen och det LSN-intervallet är inkompletta" + +#: backup/basebackup_incremental.c:538 +#, c-format +msgid "The first unsummarized LSN in this range is %X/%X." +msgstr "Den första icke summerade LSN i detta intervall är %X/%X." + +#: backup/basebackup_incremental.c:938 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "backupmanifest version 1 stöder inte inkrementell backup" + +#: backup/basebackup_incremental.c:956 +#, c-format +msgid "system identifier in backup manifest is %llu, but database system identifier is %llu" +msgstr "manifestets systemidentifierare är %llu men databasens systemidentifierare är %llu" + #: backup/basebackup_lz4.c:67 #, c-format msgid "lz4 compression is not supported by this build" msgstr "lz4-komprimering stöds inte av detta bygge" -#: backup/basebackup_server.c:75 +#: backup/basebackup_server.c:73 #, c-format -msgid "must be superuser or a role with privileges of the pg_write_server_files role to create backup stored on server" -msgstr "mÃ¥ste vara superuser eller en roll med rättigheter frÃ¥n rollen pg_write_server_files för att skapa backup som sparas pÃ¥ servern" +msgid "permission denied to create backup stored on server" +msgstr "rättighet saknas för att skapa backup som lagras pÃ¥ servern" + +#: backup/basebackup_server.c:74 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may create a backup stored on the server." +msgstr "Bara roller med rättigheter frÃ¥n rollen \"%s\" fÃ¥r skapa backup som lagras pÃ¥ servern." #: backup/basebackup_server.c:89 #, c-format msgid "relative path not allowed for backup stored on server" msgstr "relativ sökväg tillÃ¥ts inte för backup som sparas pÃ¥ servern" -#: backup/basebackup_server.c:102 commands/dbcommands.c:500 -#: commands/tablespace.c:163 commands/tablespace.c:179 -#: commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1558 +#: backup/basebackup_server.c:102 commands/dbcommands.c:477 +#: commands/tablespace.c:157 commands/tablespace.c:173 +#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:1986 #: storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" @@ -3594,19 +4005,21 @@ msgstr "kunde inte skapa katalog \"%s\": %m" msgid "directory \"%s\" exists but is not empty" msgstr "katalogen \"%s\" existerar men är inte tom" -#: backup/basebackup_server.c:123 utils/init/postinit.c:1072 +#: backup/basebackup_server.c:123 utils/init/postinit.c:1178 #, c-format msgid "could not access directory \"%s\": %m" msgstr "kunde inte komma Ã¥t katalog \"%s\": %m" #: backup/basebackup_server.c:175 backup/basebackup_server.c:182 #: backup/basebackup_server.c:268 backup/basebackup_server.c:275 -#: storage/smgr/md.c:487 storage/smgr/md.c:494 storage/smgr/md.c:785 +#: backup/walsummary.c:312 storage/smgr/md.c:502 storage/smgr/md.c:509 +#: storage/smgr/md.c:591 storage/smgr/md.c:613 storage/smgr/md.c:999 #, c-format msgid "Check free disk space." msgstr "Kontrollera ledigt diskutrymme." #: backup/basebackup_server.c:179 backup/basebackup_server.c:272 +#: backup/walsummary.c:309 #, c-format msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" msgstr "kunde inte skriva fil \"%s\": skrev bara %d av %d byte vid offset %u" @@ -3631,782 +4044,725 @@ msgstr "zstd-komprimering stöds inte av detta bygge" msgid "could not set compression worker count to %d: %s" msgstr "kunde inte sätta komprimeringens arbetarantal till %d: %s" -#: bootstrap/bootstrap.c:263 +#: backup/basebackup_zstd.c:129 +#, c-format +msgid "could not enable long-distance mode: %s" +msgstr "kunde inte aktivera lÃ¥ngdistansläge: %s" + +#: backup/walsummaryfuncs.c:95 #, c-format -msgid "-X requires a power of two value between 1 MB and 1 GB" -msgstr "-X kräver ett tvÃ¥potensvärde mellan 1 MB och 1 GB" +msgid "invalid timeline %lld" +msgstr "ogiltig tidslinje %lld" -#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3906 +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:623 tcop/postgres.c:3946 #, c-format msgid "--%s requires a value" msgstr "--%s kräver ett värde" -#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3911 +#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:628 tcop/postgres.c:3951 #, c-format msgid "-c %s requires a value" msgstr "-c %s kräver ett värde" -#: bootstrap/bootstrap.c:296 postmaster/postmaster.c:863 -#: postmaster/postmaster.c:876 +#: bootstrap/bootstrap.c:282 postmaster/postmaster.c:746 +#: postmaster/postmaster.c:759 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Försök med \"%s --help\" för mer information.\n" -#: bootstrap/bootstrap.c:305 +#: bootstrap/bootstrap.c:291 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s: ogiltigt kommandoradsargument\n" -#: catalog/aclchk.c:185 +#: catalog/aclchk.c:211 #, c-format msgid "grant options can only be granted to roles" msgstr "\"grant option\" kan bara ges till roller" -#: catalog/aclchk.c:307 +#: catalog/aclchk.c:333 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "inga rättigheter givna för kolumn \"%s\" i relation \"%s\"" -#: catalog/aclchk.c:312 +#: catalog/aclchk.c:338 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "inga rättigheter gavs till \"%s\"" -#: catalog/aclchk.c:320 +#: catalog/aclchk.c:346 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "inte alla rättigheter givna för kolumn \"%s\" i relation \"%s\"" -#: catalog/aclchk.c:325 +#: catalog/aclchk.c:351 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "inte alla rättigheter givna för \"%s\"" -#: catalog/aclchk.c:336 +#: catalog/aclchk.c:362 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "inga rättigheter kunde tas tillbaka frÃ¥n kolumn \"%s\" i relation \"%s\"" -#: catalog/aclchk.c:341 +#: catalog/aclchk.c:367 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "inga rättigheter kunde tas tillbaka frÃ¥n \"%s\"" -#: catalog/aclchk.c:349 +#: catalog/aclchk.c:375 #, c-format msgid "not all privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "inte alla rättigheter kunde tas tillbaka frÃ¥n kolumn \"%s\" i relation \"%s\"" -#: catalog/aclchk.c:354 +#: catalog/aclchk.c:380 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "inte alla rättigheter kunde tas tillbaka frÃ¥n \"%s\"" -#: catalog/aclchk.c:386 +#: catalog/aclchk.c:412 #, c-format msgid "grantor must be current user" msgstr "utfärdare mÃ¥ste vara den aktiva användaren" -#: catalog/aclchk.c:454 catalog/aclchk.c:1029 +#: catalog/aclchk.c:480 catalog/aclchk.c:1055 #, c-format msgid "invalid privilege type %s for relation" msgstr "ogiltig privilegietyp %s för relation" -#: catalog/aclchk.c:458 catalog/aclchk.c:1033 +#: catalog/aclchk.c:484 catalog/aclchk.c:1059 #, c-format msgid "invalid privilege type %s for sequence" msgstr "ogiltig privilegietyp %s för sekvens" -#: catalog/aclchk.c:462 +#: catalog/aclchk.c:488 #, c-format msgid "invalid privilege type %s for database" msgstr "ogiltig privilegietyp %s för databas" -#: catalog/aclchk.c:466 +#: catalog/aclchk.c:492 #, c-format msgid "invalid privilege type %s for domain" msgstr "ogiltig privilegietyp %s för domän" -#: catalog/aclchk.c:470 catalog/aclchk.c:1037 +#: catalog/aclchk.c:496 catalog/aclchk.c:1063 #, c-format msgid "invalid privilege type %s for function" msgstr "ogiltig privilegietyp %s för funktion" -#: catalog/aclchk.c:474 +#: catalog/aclchk.c:500 #, c-format msgid "invalid privilege type %s for language" msgstr "ogiltig privilegietyp %s för sprÃ¥k" -#: catalog/aclchk.c:478 +#: catalog/aclchk.c:504 #, c-format msgid "invalid privilege type %s for large object" msgstr "ogiltig privilegietyp %s för stort objekt" -#: catalog/aclchk.c:482 catalog/aclchk.c:1053 +#: catalog/aclchk.c:508 catalog/aclchk.c:1079 #, c-format msgid "invalid privilege type %s for schema" msgstr "ogiltig privilegietyp %s för schema" -#: catalog/aclchk.c:486 catalog/aclchk.c:1041 +#: catalog/aclchk.c:512 catalog/aclchk.c:1067 #, c-format msgid "invalid privilege type %s for procedure" msgstr "ogiltig rättighetstyp %s för procedur" -#: catalog/aclchk.c:490 catalog/aclchk.c:1045 +#: catalog/aclchk.c:516 catalog/aclchk.c:1071 #, c-format msgid "invalid privilege type %s for routine" msgstr "ogiltig rättighetstyp %s för rutin" -#: catalog/aclchk.c:494 +#: catalog/aclchk.c:520 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "ogiltig privilegietyp %s för tabellutrymme" -#: catalog/aclchk.c:498 catalog/aclchk.c:1049 +#: catalog/aclchk.c:524 catalog/aclchk.c:1075 #, c-format msgid "invalid privilege type %s for type" msgstr "ogiltig privilegietyp %s för typ" -#: catalog/aclchk.c:502 +#: catalog/aclchk.c:528 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "ogiltig privilegietyp %s för främmande data-omvandlare" -#: catalog/aclchk.c:506 +#: catalog/aclchk.c:532 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "ogiltig privilegietyp %s för främmande server" -#: catalog/aclchk.c:510 +#: catalog/aclchk.c:536 #, c-format msgid "invalid privilege type %s for parameter" msgstr "ogiltig privilegietyp %s för parameter" -#: catalog/aclchk.c:549 +#: catalog/aclchk.c:575 #, c-format msgid "column privileges are only valid for relations" msgstr "kolumnprivilegier är bara giltiga för relationer" -#: catalog/aclchk.c:712 catalog/aclchk.c:4486 catalog/aclchk.c:5333 -#: catalog/objectaddress.c:1072 catalog/pg_largeobject.c:116 -#: storage/large_object/inv_api.c:287 +#: catalog/aclchk.c:738 catalog/aclchk.c:3629 catalog/objectaddress.c:1054 +#: catalog/pg_largeobject.c:113 storage/large_object/inv_api.c:285 #, c-format msgid "large object %u does not exist" msgstr "stort objekt %u existerar inte" -#: catalog/aclchk.c:1086 +#: catalog/aclchk.c:1112 #, c-format msgid "default privileges cannot be set for columns" msgstr "standardrättigheter kan inte sättas för kolumner" -#: catalog/aclchk.c:1246 +#: catalog/aclchk.c:1148 +#, c-format +msgid "permission denied to change default privileges" +msgstr "rättighet saknas för att ändra standardrättigheter" + +#: catalog/aclchk.c:1266 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "kan inte använda IN SCHEMA-klausul samtidigt som GRANT/REVOKE ON SCHEMAS" -#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 -#: catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:776 -#: commands/sequence.c:1663 commands/tablecmds.c:7231 commands/tablecmds.c:7387 -#: commands/tablecmds.c:7437 commands/tablecmds.c:7511 -#: commands/tablecmds.c:7581 commands/tablecmds.c:7693 -#: commands/tablecmds.c:7787 commands/tablecmds.c:7846 -#: commands/tablecmds.c:7935 commands/tablecmds.c:7965 -#: commands/tablecmds.c:8093 commands/tablecmds.c:8175 -#: commands/tablecmds.c:8331 commands/tablecmds.c:8449 -#: commands/tablecmds.c:12167 commands/tablecmds.c:12348 -#: commands/tablecmds.c:12508 commands/tablecmds.c:13672 -#: commands/tablecmds.c:16240 commands/trigger.c:958 parser/analyze.c:2468 -#: parser/parse_relation.c:725 parser/parse_target.c:1063 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3434 -#: parser/parse_utilcmd.c:3470 parser/parse_utilcmd.c:3512 utils/adt/acl.c:2869 -#: utils/adt/ruleutils.c:2810 +#: catalog/aclchk.c:1617 catalog/catalog.c:659 catalog/objectaddress.c:1523 +#: catalog/pg_publication.c:528 commands/analyze.c:380 commands/copy.c:951 +#: commands/sequence.c:1655 commands/tablecmds.c:7541 commands/tablecmds.c:7695 +#: commands/tablecmds.c:7745 commands/tablecmds.c:7819 +#: commands/tablecmds.c:7889 commands/tablecmds.c:8019 +#: commands/tablecmds.c:8148 commands/tablecmds.c:8242 +#: commands/tablecmds.c:8343 commands/tablecmds.c:8470 +#: commands/tablecmds.c:8500 commands/tablecmds.c:8642 +#: commands/tablecmds.c:8735 commands/tablecmds.c:8869 +#: commands/tablecmds.c:8981 commands/tablecmds.c:12797 +#: commands/tablecmds.c:12989 commands/tablecmds.c:13150 +#: commands/tablecmds.c:14339 commands/tablecmds.c:16966 commands/trigger.c:942 +#: parser/analyze.c:2530 parser/parse_relation.c:737 parser/parse_target.c:1067 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3409 +#: parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2923 +#: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "kolumn \"%s\" i relation \"%s\" existerar inte" -#: catalog/aclchk.c:1850 catalog/objectaddress.c:1383 commands/sequence.c:1172 -#: commands/tablecmds.c:253 commands/tablecmds.c:17104 utils/adt/acl.c:2077 -#: utils/adt/acl.c:2107 utils/adt/acl.c:2139 utils/adt/acl.c:2171 -#: utils/adt/acl.c:2199 utils/adt/acl.c:2229 +#: catalog/aclchk.c:1862 +#, c-format +msgid "\"%s\" is an index" +msgstr "\"%s\" är ett index" + +#: catalog/aclchk.c:1869 commands/tablecmds.c:14496 commands/tablecmds.c:17882 +#, c-format +msgid "\"%s\" is a composite type" +msgstr "\"%s\" är en composite-typ" + +#: catalog/aclchk.c:1877 catalog/objectaddress.c:1363 commands/tablecmds.c:263 +#: commands/tablecmds.c:17846 utils/adt/acl.c:2107 utils/adt/acl.c:2137 +#: utils/adt/acl.c:2170 utils/adt/acl.c:2206 utils/adt/acl.c:2237 +#: utils/adt/acl.c:2268 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\" är inte en sekvens" -#: catalog/aclchk.c:1888 +#: catalog/aclchk.c:1915 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "sekvensen \"%s\" stöder bara USAGE-, SELECT- och UPDATE-rättigheter" -#: catalog/aclchk.c:1905 +#: catalog/aclchk.c:1932 #, c-format msgid "invalid privilege type %s for table" msgstr "ogiltig rättighetstyp %s för tabell" -#: catalog/aclchk.c:2071 +#: catalog/aclchk.c:2097 #, c-format msgid "invalid privilege type %s for column" msgstr "ogitligt rättighetstyp %s för kolumn" -#: catalog/aclchk.c:2084 +#: catalog/aclchk.c:2110 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "sekvensen \"%s\" stöder bara kolumnrättigheten SELECT" -#: catalog/aclchk.c:2666 +#: catalog/aclchk.c:2301 #, c-format msgid "language \"%s\" is not trusted" msgstr "sprÃ¥ket \"%s\" är inte betrott" -#: catalog/aclchk.c:2668 +#: catalog/aclchk.c:2303 #, c-format msgid "GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages." msgstr "GRANT och REVOKE är inte tillÃ¥tna pÃ¥ icke betrodda sprÃ¥k dÃ¥ bara en superuser kan använda icke betrodda sprÃ¥k." -#: catalog/aclchk.c:3182 +#: catalog/aclchk.c:2454 #, c-format msgid "cannot set privileges of array types" msgstr "kan inte sätta privilegier för array-typer" -#: catalog/aclchk.c:3183 +#: catalog/aclchk.c:2455 #, c-format msgid "Set the privileges of the element type instead." msgstr "Sätt rättigheter för elementtypen istället." -#: catalog/aclchk.c:3190 catalog/objectaddress.c:1649 +#: catalog/aclchk.c:2459 +#, c-format +msgid "cannot set privileges of multirange types" +msgstr "kan inte sätta privilegier för multirange-typer" + +#: catalog/aclchk.c:2460 +#, c-format +msgid "Set the privileges of the range type instead." +msgstr "Sätt rättigheter för range-typen istället." + +#: catalog/aclchk.c:2467 catalog/objectaddress.c:1629 #, c-format msgid "\"%s\" is not a domain" msgstr "\"%s\" är inte en domän" -#: catalog/aclchk.c:3462 +#: catalog/aclchk.c:2653 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "okänd privilegietyp \"%s\"" -#: catalog/aclchk.c:3527 +#: catalog/aclchk.c:2720 #, c-format msgid "permission denied for aggregate %s" msgstr "rättighet saknas för aggregat %s" -#: catalog/aclchk.c:3530 +#: catalog/aclchk.c:2723 #, c-format msgid "permission denied for collation %s" msgstr "rättighet saknas för jämförelse %s" -#: catalog/aclchk.c:3533 +#: catalog/aclchk.c:2726 #, c-format msgid "permission denied for column %s" msgstr "rättighet saknas för kolumn %s" -#: catalog/aclchk.c:3536 +#: catalog/aclchk.c:2729 #, c-format msgid "permission denied for conversion %s" msgstr "rättighet saknas för konvertering %s" -#: catalog/aclchk.c:3539 +#: catalog/aclchk.c:2732 #, c-format msgid "permission denied for database %s" msgstr "rättighet saknas för databas %s" -#: catalog/aclchk.c:3542 +#: catalog/aclchk.c:2735 #, c-format msgid "permission denied for domain %s" msgstr "rättighet saknas för domän %s" -#: catalog/aclchk.c:3545 +#: catalog/aclchk.c:2738 #, c-format msgid "permission denied for event trigger %s" msgstr "rättighet saknas för händelsetrigger %s" -#: catalog/aclchk.c:3548 +#: catalog/aclchk.c:2741 #, c-format msgid "permission denied for extension %s" msgstr "rättighet saknas för utökning %s" -#: catalog/aclchk.c:3551 +#: catalog/aclchk.c:2744 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "rättighet saknas för främmande data-omvandlare %s" -#: catalog/aclchk.c:3554 +#: catalog/aclchk.c:2747 #, c-format msgid "permission denied for foreign server %s" msgstr "rättighet saknas för främmande server %s" -#: catalog/aclchk.c:3557 +#: catalog/aclchk.c:2750 #, c-format msgid "permission denied for foreign table %s" msgstr "rättighet saknas för främmande tabell %s" -#: catalog/aclchk.c:3560 +#: catalog/aclchk.c:2753 #, c-format msgid "permission denied for function %s" msgstr "rättighet saknas för funktion %s" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:2756 #, c-format msgid "permission denied for index %s" msgstr "rättighet saknas för index %s" -#: catalog/aclchk.c:3566 +#: catalog/aclchk.c:2759 #, c-format msgid "permission denied for language %s" msgstr "rättighet saknas för sprÃ¥k %s" -#: catalog/aclchk.c:3569 +#: catalog/aclchk.c:2762 #, c-format msgid "permission denied for large object %s" msgstr "rättighet saknas för stort objekt %s" -#: catalog/aclchk.c:3572 +#: catalog/aclchk.c:2765 #, c-format msgid "permission denied for materialized view %s" msgstr "rättighet saknas för materialiserad vy %s" -#: catalog/aclchk.c:3575 +#: catalog/aclchk.c:2768 #, c-format msgid "permission denied for operator class %s" msgstr "rättighet saknas för operatorklasss %s" -#: catalog/aclchk.c:3578 +#: catalog/aclchk.c:2771 #, c-format msgid "permission denied for operator %s" msgstr "rättighet saknas för operator %s" -#: catalog/aclchk.c:3581 +#: catalog/aclchk.c:2774 #, c-format msgid "permission denied for operator family %s" msgstr "rättighet saknas för operatorfamilj %s" -#: catalog/aclchk.c:3584 +#: catalog/aclchk.c:2777 #, c-format msgid "permission denied for parameter %s" msgstr "rättighet saknas för parametern %s" -#: catalog/aclchk.c:3587 +#: catalog/aclchk.c:2780 #, c-format msgid "permission denied for policy %s" msgstr "rättighet saknas för policy %s" -#: catalog/aclchk.c:3590 +#: catalog/aclchk.c:2783 #, c-format msgid "permission denied for procedure %s" msgstr "rättighet saknas för procedur %s" -#: catalog/aclchk.c:3593 +#: catalog/aclchk.c:2786 #, c-format msgid "permission denied for publication %s" msgstr "rättighet saknas för publicering %s" -#: catalog/aclchk.c:3596 +#: catalog/aclchk.c:2789 #, c-format msgid "permission denied for routine %s" msgstr "rättighet saknas för rutin %s" -#: catalog/aclchk.c:3599 +#: catalog/aclchk.c:2792 #, c-format msgid "permission denied for schema %s" msgstr "rättighet saknas för schema %s" -#: catalog/aclchk.c:3602 commands/sequence.c:660 commands/sequence.c:886 -#: commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 -#: commands/sequence.c:1825 +#: catalog/aclchk.c:2795 commands/sequence.c:654 commands/sequence.c:880 +#: commands/sequence.c:922 commands/sequence.c:963 commands/sequence.c:1753 +#: commands/sequence.c:1799 #, c-format msgid "permission denied for sequence %s" msgstr "rättighet saknas för sekvens %s" -#: catalog/aclchk.c:3605 +#: catalog/aclchk.c:2798 #, c-format msgid "permission denied for statistics object %s" msgstr "rättighet saknas för statistikobjekt %s" -#: catalog/aclchk.c:3608 +#: catalog/aclchk.c:2801 #, c-format msgid "permission denied for subscription %s" msgstr "rättighet saknas för prenumeration %s" -#: catalog/aclchk.c:3611 +#: catalog/aclchk.c:2804 #, c-format msgid "permission denied for table %s" msgstr "rättighet saknas för tabell %s" -#: catalog/aclchk.c:3614 +#: catalog/aclchk.c:2807 #, c-format msgid "permission denied for tablespace %s" msgstr "rättighet saknas för tabellutrymme %s" -#: catalog/aclchk.c:3617 +#: catalog/aclchk.c:2810 #, c-format msgid "permission denied for text search configuration %s" msgstr "rättighet saknas för textsökkonfigurering %s" -#: catalog/aclchk.c:3620 +#: catalog/aclchk.c:2813 #, c-format msgid "permission denied for text search dictionary %s" msgstr "rättighet saknas för textsökordlista %s" -#: catalog/aclchk.c:3623 +#: catalog/aclchk.c:2816 #, c-format msgid "permission denied for type %s" msgstr "rättighet saknas för typ %s" -#: catalog/aclchk.c:3626 +#: catalog/aclchk.c:2819 #, c-format msgid "permission denied for view %s" msgstr "rättighet saknas för vy %s" -#: catalog/aclchk.c:3662 +#: catalog/aclchk.c:2855 #, c-format msgid "must be owner of aggregate %s" msgstr "mÃ¥ste vara ägaren till aggregatet %s" -#: catalog/aclchk.c:3665 +#: catalog/aclchk.c:2858 #, c-format msgid "must be owner of collation %s" msgstr "mÃ¥ste vara ägaren till jämförelsen %s" -#: catalog/aclchk.c:3668 +#: catalog/aclchk.c:2861 #, c-format msgid "must be owner of conversion %s" msgstr "mÃ¥ste vara ägaren till konverteringen %s" -#: catalog/aclchk.c:3671 +#: catalog/aclchk.c:2864 #, c-format msgid "must be owner of database %s" msgstr "mÃ¥ste vara ägaren till databasen %s" -#: catalog/aclchk.c:3674 +#: catalog/aclchk.c:2867 #, c-format msgid "must be owner of domain %s" msgstr "mÃ¥ste vara ägaren av domänen %s" -#: catalog/aclchk.c:3677 +#: catalog/aclchk.c:2870 #, c-format msgid "must be owner of event trigger %s" msgstr "mÃ¥ste vara ägaren till händelsetrigger %s" -#: catalog/aclchk.c:3680 +#: catalog/aclchk.c:2873 #, c-format msgid "must be owner of extension %s" msgstr "mÃ¥ste vara ägaren till utökningen %s" -#: catalog/aclchk.c:3683 +#: catalog/aclchk.c:2876 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "mÃ¥ste vara ägaren till främmande data-omvandlaren %s" -#: catalog/aclchk.c:3686 +#: catalog/aclchk.c:2879 #, c-format msgid "must be owner of foreign server %s" msgstr "mÃ¥ste vara ägaren till främmande servern %s" -#: catalog/aclchk.c:3689 +#: catalog/aclchk.c:2882 #, c-format msgid "must be owner of foreign table %s" msgstr "mÃ¥ste vara ägaren till främmande tabellen %s" -#: catalog/aclchk.c:3692 +#: catalog/aclchk.c:2885 #, c-format msgid "must be owner of function %s" msgstr "mÃ¥ste vara ägaren till funktionen %s" -#: catalog/aclchk.c:3695 +#: catalog/aclchk.c:2888 #, c-format msgid "must be owner of index %s" msgstr "mÃ¥ste vara ägaren till indexet %s" -#: catalog/aclchk.c:3698 +#: catalog/aclchk.c:2891 #, c-format msgid "must be owner of language %s" msgstr "mÃ¥ste vara ägaren till sprÃ¥ket %s" -#: catalog/aclchk.c:3701 +#: catalog/aclchk.c:2894 #, c-format msgid "must be owner of large object %s" msgstr "mÃ¥ste vara ägaren till stora objektet %s" -#: catalog/aclchk.c:3704 +#: catalog/aclchk.c:2897 #, c-format msgid "must be owner of materialized view %s" msgstr "mÃ¥ste vara ägaren till den materialiserade vyn %s" -#: catalog/aclchk.c:3707 +#: catalog/aclchk.c:2900 #, c-format msgid "must be owner of operator class %s" msgstr "mÃ¥ste vara ägaren till operatorklassen %s" -#: catalog/aclchk.c:3710 +#: catalog/aclchk.c:2903 #, c-format msgid "must be owner of operator %s" msgstr "mÃ¥ste vara ägaren till operatorn %s" -#: catalog/aclchk.c:3713 +#: catalog/aclchk.c:2906 #, c-format msgid "must be owner of operator family %s" msgstr "mÃ¥ste vara ägaren till operatorfamiljen %s" -#: catalog/aclchk.c:3716 +#: catalog/aclchk.c:2909 #, c-format msgid "must be owner of procedure %s" msgstr "mÃ¥ste vara ägaren till proceduren %s" -#: catalog/aclchk.c:3719 +#: catalog/aclchk.c:2912 #, c-format msgid "must be owner of publication %s" msgstr "mÃ¥ste vara ägaren till publiceringen %s" -#: catalog/aclchk.c:3722 +#: catalog/aclchk.c:2915 #, c-format msgid "must be owner of routine %s" msgstr "mÃ¥ste vara ägaren till rutinen %s" -#: catalog/aclchk.c:3725 +#: catalog/aclchk.c:2918 #, c-format msgid "must be owner of sequence %s" msgstr "mÃ¥ste vara ägaren till sekvensen %s" -#: catalog/aclchk.c:3728 +#: catalog/aclchk.c:2921 #, c-format msgid "must be owner of subscription %s" msgstr "mÃ¥ste vara ägaren till prenumerationen %s" -#: catalog/aclchk.c:3731 +#: catalog/aclchk.c:2924 #, c-format msgid "must be owner of table %s" msgstr "mÃ¥ste vara ägaren till tabellen %s" -#: catalog/aclchk.c:3734 +#: catalog/aclchk.c:2927 #, c-format msgid "must be owner of type %s" msgstr "mÃ¥ste vara ägaren till typen %s" -#: catalog/aclchk.c:3737 +#: catalog/aclchk.c:2930 #, c-format msgid "must be owner of view %s" msgstr "mÃ¥ste vara ägaren till vyn %s" -#: catalog/aclchk.c:3740 +#: catalog/aclchk.c:2933 #, c-format msgid "must be owner of schema %s" msgstr "mÃ¥ste vara ägaren till schemat %s" -#: catalog/aclchk.c:3743 +#: catalog/aclchk.c:2936 #, c-format msgid "must be owner of statistics object %s" msgstr "mÃ¥ste vara ägaren till statistikobjektet %s" -#: catalog/aclchk.c:3746 +#: catalog/aclchk.c:2939 #, c-format msgid "must be owner of tablespace %s" msgstr "mÃ¥ste vara ägaren till tabellutrymmet %s" -#: catalog/aclchk.c:3749 +#: catalog/aclchk.c:2942 #, c-format msgid "must be owner of text search configuration %s" msgstr "mÃ¥ste vara ägaren till textsökkonfigurationen %s" -#: catalog/aclchk.c:3752 +#: catalog/aclchk.c:2945 #, c-format msgid "must be owner of text search dictionary %s" msgstr "mÃ¥ste vara ägaren till textsökordlistan %s" -#: catalog/aclchk.c:3766 +#: catalog/aclchk.c:2959 #, c-format msgid "must be owner of relation %s" msgstr "mÃ¥ste vara ägaren till relationen %s" -#: catalog/aclchk.c:3812 +#: catalog/aclchk.c:3005 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "rättighet saknas för kolumn \"%s\" i relation \"%s\"" -#: catalog/aclchk.c:3957 catalog/aclchk.c:3976 +#: catalog/aclchk.c:3162 catalog/aclchk.c:4170 catalog/aclchk.c:4201 +#, c-format +msgid "%s with OID %u does not exist" +msgstr "%s med OID %u existerar inte" + +#: catalog/aclchk.c:3245 catalog/aclchk.c:3264 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "attribut %d i relation med OID %u existerar inte" -#: catalog/aclchk.c:4071 catalog/aclchk.c:5184 +#: catalog/aclchk.c:3302 catalog/aclchk.c:3365 catalog/aclchk.c:4004 #, c-format msgid "relation with OID %u does not exist" msgstr "relation med OID %u existerar inte" -#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2581 -#, c-format -msgid "database with OID %u does not exist" -msgstr "databas med OID %u finns inte" - -#: catalog/aclchk.c:4299 +#: catalog/aclchk.c:3550 #, c-format msgid "parameter ACL with OID %u does not exist" msgstr "parameter ACL med OID %u existerar inte" -#: catalog/aclchk.c:4353 catalog/aclchk.c:5262 tcop/fastpath.c:141 -#: utils/fmgr/fmgr.c:2037 -#, c-format -msgid "function with OID %u does not exist" -msgstr "funktionen med OID %u existerar inte" - -#: catalog/aclchk.c:4407 catalog/aclchk.c:5288 -#, c-format -msgid "language with OID %u does not exist" -msgstr "sprÃ¥k med OID %u existerar inte" - -#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 -#: commands/publicationcmds.c:1745 +#: catalog/aclchk.c:3723 commands/collationcmds.c:853 +#: commands/publicationcmds.c:1739 #, c-format msgid "schema with OID %u does not exist" msgstr "schema med OID %u existerar inte" -#: catalog/aclchk.c:4635 catalog/aclchk.c:5387 utils/adt/genfile.c:632 -#, c-format -msgid "tablespace with OID %u does not exist" -msgstr "tabellutrymme med OID %u finns inte" - -#: catalog/aclchk.c:4694 catalog/aclchk.c:5521 commands/foreigncmds.c:325 -#, c-format -msgid "foreign-data wrapper with OID %u does not exist" -msgstr "främmande data-omvandlare med OID %u finns inte" - -#: catalog/aclchk.c:4756 catalog/aclchk.c:5548 commands/foreigncmds.c:462 -#, c-format -msgid "foreign server with OID %u does not exist" -msgstr "främmande server med OID %u finns inte" - -#: catalog/aclchk.c:4816 catalog/aclchk.c:5210 utils/cache/typcache.c:385 -#: utils/cache/typcache.c:440 +#: catalog/aclchk.c:3797 catalog/aclchk.c:3824 catalog/aclchk.c:3853 +#: utils/cache/typcache.c:392 utils/cache/typcache.c:447 #, c-format msgid "type with OID %u does not exist" msgstr "typ med OID %u existerar inte" -#: catalog/aclchk.c:5236 -#, c-format -msgid "operator with OID %u does not exist" -msgstr "operator med OID %u existerar inte" - -#: catalog/aclchk.c:5413 -#, c-format -msgid "operator class with OID %u does not exist" -msgstr "operatorklass med OID %u existerar inte" - -#: catalog/aclchk.c:5440 -#, c-format -msgid "operator family with OID %u does not exist" -msgstr "operatorfamilj med OID %u existerar inte" - -#: catalog/aclchk.c:5467 -#, c-format -msgid "text search dictionary with OID %u does not exist" -msgstr "textsökordlista med OID %u existerar inte" - -#: catalog/aclchk.c:5494 -#, c-format -msgid "text search configuration with OID %u does not exist" -msgstr "textsökkonfiguration med OID %u existerar inte" - -#: catalog/aclchk.c:5575 commands/event_trigger.c:453 -#, c-format -msgid "event trigger with OID %u does not exist" -msgstr "händelsetrigger med OID %u existerar inte" - -#: catalog/aclchk.c:5628 commands/collationcmds.c:439 -#, c-format -msgid "collation with OID %u does not exist" -msgstr "jämförelse med OID %u existerar inte" - -#: catalog/aclchk.c:5654 -#, c-format -msgid "conversion with OID %u does not exist" -msgstr "konvertering med OID %u existerar inte" - -#: catalog/aclchk.c:5695 -#, c-format -msgid "extension with OID %u does not exist" -msgstr "utökning med OID %u existerar inte" - -#: catalog/aclchk.c:5722 commands/publicationcmds.c:1999 -#, c-format -msgid "publication with OID %u does not exist" -msgstr "publicering med OID %u existerar inte" - -#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1742 -#, c-format -msgid "subscription with OID %u does not exist" -msgstr "prenumeration med OID %u existerar inte" - -#: catalog/aclchk.c:5774 -#, c-format -msgid "statistics object with OID %u does not exist" -msgstr "statistikobjekt med OID %u finns inte" - -#: catalog/catalog.c:447 +#: catalog/catalog.c:477 #, c-format msgid "still searching for an unused OID in relation \"%s\"" msgstr "letar fortfarande efter en oanvänd OID i relationen \"%s\"" -#: catalog/catalog.c:449 +#: catalog/catalog.c:479 #, c-format msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." msgstr[0] "OID-kandidater har kontrollerats %llu gÃ¥ng men inga oanvända OID:er har hittats än." msgstr[1] "OID-kandidater har kontrollerats %llu gÃ¥nger men inga oanvända OID:er har hittats än." -#: catalog/catalog.c:474 +#: catalog/catalog.c:504 #, c-format msgid "new OID has been assigned in relation \"%s\" after %llu retry" msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" msgstr[0] "ny OID har tilldelats i relation \"%s\" after %llu försök" msgstr[1] "ny OID har tilldelats i relation \"%s\" after %llu försök" -#: catalog/catalog.c:605 catalog/catalog.c:672 +#: catalog/catalog.c:637 catalog/catalog.c:704 #, c-format msgid "must be superuser to call %s()" msgstr "mÃ¥ste vara en superuser för att anropa %s()" -#: catalog/catalog.c:614 +#: catalog/catalog.c:646 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() kan bara användas pÃ¥ systemkataloger" -#: catalog/catalog.c:619 parser/parse_utilcmd.c:2279 +#: catalog/catalog.c:651 parser/parse_utilcmd.c:2270 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "index \"%s\" tillhör inte tabell \"%s\"" -#: catalog/catalog.c:636 +#: catalog/catalog.c:668 #, c-format msgid "column \"%s\" is not of type oid" msgstr "kolumnen \"%s\" är inte av typen oid" -#: catalog/catalog.c:643 +#: catalog/catalog.c:675 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "index \"%s\" är inte indexet för kolumnen \"%s\"" -#: catalog/dependency.c:538 catalog/pg_shdepend.c:657 +#: catalog/dependency.c:497 catalog/pg_shdepend.c:703 #, c-format msgid "cannot drop %s because it is required by the database system" msgstr "kan inte ta bort %s eftersom den krävs av databassystemet" -#: catalog/dependency.c:830 catalog/dependency.c:1057 +#: catalog/dependency.c:789 catalog/dependency.c:1016 #, c-format msgid "cannot drop %s because %s requires it" msgstr "kan inte ta bort %s eftersom %s behöver den" -#: catalog/dependency.c:832 catalog/dependency.c:1059 +#: catalog/dependency.c:791 catalog/dependency.c:1018 #, c-format msgid "You can drop %s instead." msgstr "Du kan ta bort %s i stället." -#: catalog/dependency.c:1138 catalog/dependency.c:1147 +#: catalog/dependency.c:1097 catalog/dependency.c:1106 #, c-format msgid "%s depends on %s" msgstr "%s beror pÃ¥ %s" -#: catalog/dependency.c:1162 catalog/dependency.c:1171 +#: catalog/dependency.c:1121 catalog/dependency.c:1130 #, c-format msgid "drop cascades to %s" msgstr "drop svämmar över (cascades) till %s" -#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 +#: catalog/dependency.c:1138 catalog/pg_shdepend.c:868 #, c-format msgid "" "\n" @@ -4421,696 +4777,715 @@ msgstr[1] "" "\n" "och %d andra objekt (se serverloggen för en lista)" -#: catalog/dependency.c:1191 +#: catalog/dependency.c:1150 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "kan inte ta bort %s eftersom andra objekt beror pÃ¥ den" -#: catalog/dependency.c:1194 catalog/dependency.c:1201 -#: catalog/dependency.c:1212 commands/tablecmds.c:1328 -#: commands/tablecmds.c:14314 commands/tablespace.c:476 commands/user.c:1008 -#: commands/view.c:522 libpq/auth.c:329 replication/syncrep.c:1043 -#: storage/lmgr/deadlock.c:1152 storage/lmgr/proc.c:1413 utils/misc/guc.c:7402 -#: utils/misc/guc.c:7438 utils/misc/guc.c:7508 utils/misc/guc.c:11864 -#: utils/misc/guc.c:11898 utils/misc/guc.c:11932 utils/misc/guc.c:11975 -#: utils/misc/guc.c:12017 +#: catalog/dependency.c:1153 catalog/dependency.c:1160 +#: catalog/dependency.c:1171 commands/tablecmds.c:1459 +#: commands/tablecmds.c:15088 commands/tablespace.c:460 commands/user.c:1302 +#: commands/vacuum.c:211 commands/view.c:441 executor/execExprInterp.c:4655 +#: executor/execExprInterp.c:4663 libpq/auth.c:324 +#: replication/logical/applyparallelworker.c:1041 replication/syncrep.c:1011 +#: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1432 utils/misc/guc.c:3169 +#: utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6825 +#: utils/misc/guc.c:6859 utils/misc/guc.c:6893 utils/misc/guc.c:6936 +#: utils/misc/guc.c:6978 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1195 catalog/dependency.c:1202 +#: catalog/dependency.c:1154 catalog/dependency.c:1161 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "Använd DROP ... CASCADE för att ta bort de beroende objekten ocksÃ¥." -#: catalog/dependency.c:1199 +#: catalog/dependency.c:1158 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "kan inte ta bort önskade objekt eftersom andra objekt beror pÃ¥ dem" -#: catalog/dependency.c:1207 +#: catalog/dependency.c:1166 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" msgstr[0] "drop svämmar över (cascades) till %d andra objekt" msgstr[1] "drop svämmar över (cascades) till %d andra objekt" -#: catalog/dependency.c:1889 +#: catalog/dependency.c:1850 #, c-format msgid "constant of the type %s cannot be used here" msgstr "konstant av typen %s kan inte användas här" -#: catalog/dependency.c:2410 parser/parse_relation.c:3369 -#: parser/parse_relation.c:3379 +#: catalog/dependency.c:2375 parser/parse_relation.c:3407 +#: parser/parse_relation.c:3417 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "kolumn %d i relation \"%s\" finns inte" -#: catalog/heap.c:324 +#: catalog/heap.c:325 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "rättighet saknas för att skapa \"%s.%s\"" -#: catalog/heap.c:326 +#: catalog/heap.c:327 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Systemkatalogändringar är för tillfället inte tillÃ¥tna." -#: catalog/heap.c:466 commands/tablecmds.c:2348 commands/tablecmds.c:2985 -#: commands/tablecmds.c:6821 +#: catalog/heap.c:467 commands/tablecmds.c:2495 commands/tablecmds.c:2917 +#: commands/tablecmds.c:7163 #, c-format msgid "tables can have at most %d columns" msgstr "tabeller kan ha som mest %d kolumner" -#: catalog/heap.c:484 commands/tablecmds.c:7121 +#: catalog/heap.c:485 commands/tablecmds.c:7432 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "kolumnnamn \"%s\" stÃ¥r i konflikt med ett systemkolumnnamn" -#: catalog/heap.c:500 +#: catalog/heap.c:501 #, c-format msgid "column name \"%s\" specified more than once" msgstr "kolumnnamn \"%s\" angiven mer än en gÃ¥ng" #. translator: first %s is an integer not a name -#: catalog/heap.c:575 +#: catalog/heap.c:579 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "partitionsnyckelkolumn \"%s\" har pseudo-typ %s" -#: catalog/heap.c:580 +#: catalog/heap.c:584 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "kolumn \"%s\" har pseudo-typ %s" -#: catalog/heap.c:611 +#: catalog/heap.c:615 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "composite-typ %s kan inte vara en del av sig själv" #. translator: first %s is an integer not a name -#: catalog/heap.c:666 +#: catalog/heap.c:670 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "ingen jämförelse kunde härledas för partitionsnyckelkolumn %s med jämförelsetyp %s" -#: catalog/heap.c:672 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:676 commands/createas.c:198 commands/createas.c:505 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "ingen jämförelse kunde härledas för kolumn \"%s\" med jämförelsetyp %s" -#: catalog/heap.c:1148 catalog/index.c:874 commands/createas.c:408 -#: commands/tablecmds.c:3890 +#: catalog/heap.c:1161 catalog/index.c:899 commands/createas.c:401 +#: commands/tablecmds.c:4171 #, c-format msgid "relation \"%s\" already exists" msgstr "relationen \"%s\" finns redan" -#: catalog/heap.c:1164 catalog/pg_type.c:436 catalog/pg_type.c:784 -#: catalog/pg_type.c:931 commands/typecmds.c:249 commands/typecmds.c:261 -#: commands/typecmds.c:754 commands/typecmds.c:1169 commands/typecmds.c:1395 -#: commands/typecmds.c:1575 commands/typecmds.c:2547 +#: catalog/heap.c:1177 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: catalog/pg_type.c:977 commands/typecmds.c:253 commands/typecmds.c:265 +#: commands/typecmds.c:758 commands/typecmds.c:1179 commands/typecmds.c:1405 +#: commands/typecmds.c:1585 commands/typecmds.c:2556 #, c-format msgid "type \"%s\" already exists" msgstr "typen \"%s\" existerar redan" -#: catalog/heap.c:1165 +#: catalog/heap.c:1178 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "En relation har en associerad typ med samma namn sÃ¥ du mÃ¥ste använda ett namn som inte krockar med nÃ¥gon existerande typ." -#: catalog/heap.c:1205 +#: catalog/heap.c:1218 #, c-format -msgid "toast relfilenode value not set when in binary upgrade mode" -msgstr "relfilenode-värde för toast är inte satt i binärt uppgraderingsläge" +msgid "toast relfilenumber value not set when in binary upgrade mode" +msgstr "relfile-nummervärde för toast är inte satt i binärt uppgraderingsläge" -#: catalog/heap.c:1216 +#: catalog/heap.c:1229 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "pg_class heap OID-värde är inte satt i binärt uppgraderingsläge" -#: catalog/heap.c:1226 +#: catalog/heap.c:1239 #, c-format -msgid "relfilenode value not set when in binary upgrade mode" -msgstr "relfilenode-värde är inte satt i binärt uppgraderingsläge" +msgid "relfilenumber value not set when in binary upgrade mode" +msgstr "relfile-nummervärde är inte satt i binärt uppgraderingsläge" -#: catalog/heap.c:2127 +#: catalog/heap.c:2130 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "kan inte lägga till NO INHERIT-villkor till partitionerad tabell \"%s\"" -#: catalog/heap.c:2401 +#: catalog/heap.c:2402 #, c-format msgid "check constraint \"%s\" already exists" msgstr "check-villkor \"%s\" finns redan" -#: catalog/heap.c:2571 catalog/index.c:888 catalog/pg_constraint.c:689 -#: commands/tablecmds.c:8823 +#: catalog/heap.c:2574 catalog/index.c:913 catalog/pg_constraint.c:724 +#: commands/tablecmds.c:9356 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "integritetsvillkor \"%s\" för relation \"%s\" finns redan" -#: catalog/heap.c:2578 +#: catalog/heap.c:2581 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "villkor \"%s\" stÃ¥r i konflikt med icke-ärvt villkor pÃ¥ relation \"%s\"" -#: catalog/heap.c:2589 +#: catalog/heap.c:2592 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "villkor \"%s\" stÃ¥r i konflikt med ärvt villkor pÃ¥ relation \"%s\"" -#: catalog/heap.c:2599 +#: catalog/heap.c:2602 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "villkor \"%s\" stÃ¥r i konflikt med NOT VALID-villkor pÃ¥ relation \"%s\"" -#: catalog/heap.c:2604 +#: catalog/heap.c:2607 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "slÃ¥r samman villkor \"%s\" med ärvd definition" -#: catalog/heap.c:2709 +#: catalog/heap.c:2633 catalog/pg_constraint.c:853 commands/tablecmds.c:3074 +#: commands/tablecmds.c:3377 commands/tablecmds.c:7089 +#: commands/tablecmds.c:15907 commands/tablecmds.c:16038 +#, c-format +msgid "too many inheritance parents" +msgstr "för mÃ¥nga föräldrar i arv" + +#: catalog/heap.c:2717 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "kan inte använda genererad kolumn \"%s\" i kolumngenereringsuttryck" -#: catalog/heap.c:2711 +#: catalog/heap.c:2719 #, c-format msgid "A generated column cannot reference another generated column." msgstr "En genererad kolumn kan inte referera till en annan genererad kolumn." -#: catalog/heap.c:2717 +#: catalog/heap.c:2725 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "kan inte använda hela-raden-variabel i kolumngenereringsuttryck" -#: catalog/heap.c:2718 +#: catalog/heap.c:2726 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "Detta skulle leda till att den genererade kolumnen beror pÃ¥ sitt eget värde." -#: catalog/heap.c:2771 +#: catalog/heap.c:2781 #, c-format msgid "generation expression is not immutable" msgstr "genereringsuttryck är inte immutable" -#: catalog/heap.c:2799 rewrite/rewriteHandler.c:1273 +#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1276 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "kolumn \"%s\" har typ %s men default-uttryck har typen %s" -#: catalog/heap.c:2804 commands/prepare.c:334 parser/analyze.c:2692 -#: parser/parse_target.c:594 parser/parse_target.c:882 -#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1278 +#: catalog/heap.c:2814 commands/prepare.c:331 parser/analyze.c:2758 +#: parser/parse_target.c:592 parser/parse_target.c:882 +#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1281 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Du mÃ¥ste skriva om eller typomvandla uttrycket." -#: catalog/heap.c:2851 +#: catalog/heap.c:2861 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "bara tabell \"%s\" kan refereras i check-villkoret" -#: catalog/heap.c:3149 +#: catalog/heap.c:3167 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "inget stöd för kombinationen ON COMMIT och främmande nyckel" -#: catalog/heap.c:3150 +#: catalog/heap.c:3168 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "Tabell \"%s\" refererar till \"%s\", men de har inte samma ON COMMIT-inställning." -#: catalog/heap.c:3155 +#: catalog/heap.c:3173 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "kan inte trunkera en tabell som refererars till i ett främmande nyckelvillkor" -#: catalog/heap.c:3156 +#: catalog/heap.c:3174 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Tabell \"%s\" refererar till \"%s\"." -#: catalog/heap.c:3158 +#: catalog/heap.c:3176 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Trunkera tabellen \"%s\" samtidigt, eller använd TRUNCATE ... CASCADE." -#: catalog/index.c:223 parser/parse_utilcmd.c:2184 +#: catalog/index.c:219 parser/parse_utilcmd.c:2176 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "multipla primärnycklar för tabell \"%s\" tillÃ¥ts inte" -#: catalog/index.c:241 +#: catalog/index.c:233 +#, c-format +msgid "primary keys cannot use NULLS NOT DISTINCT indexes" +msgstr "primärnycklar kan inte använda NULLS NOT DISTINCT-index" + +#: catalog/index.c:250 #, c-format msgid "primary keys cannot be expressions" msgstr "primärnycklar kan inte vara uttryck" -#: catalog/index.c:258 +#: catalog/index.c:267 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "primärnyckelkolumn \"%s\" är inte markerad NOT NULL" -#: catalog/index.c:773 catalog/index.c:1932 +#: catalog/index.c:798 catalog/index.c:1915 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "användardefinierade index pÃ¥ systemkatalogen är inte möjligt" -#: catalog/index.c:813 +#: catalog/index.c:838 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "ickedeterministiska jämförelser (collation) stöds inte för operatorklass \"%s\"" -#: catalog/index.c:828 +#: catalog/index.c:853 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "samtida indexskapande pÃ¥ systemkatalogtabeller stöds inte" -#: catalog/index.c:837 catalog/index.c:1305 +#: catalog/index.c:862 catalog/index.c:1331 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "samtida indexskapande för uteslutningsvillkor stöds inte" -#: catalog/index.c:846 +#: catalog/index.c:871 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "delade index kan inte skapas efter initdb" -#: catalog/index.c:866 commands/createas.c:423 commands/sequence.c:158 -#: parser/parse_utilcmd.c:211 +#: catalog/index.c:891 commands/createas.c:416 commands/sequence.c:159 +#: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "relationen \"%s\" finns redan, hoppar över" -#: catalog/index.c:916 +#: catalog/index.c:941 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "pg_class index OID-värde är inte satt i binärt uppgraderingsläge" -#: catalog/index.c:926 utils/cache/relcache.c:3743 +#: catalog/index.c:951 utils/cache/relcache.c:3791 #, c-format -msgid "index relfilenode value not set when in binary upgrade mode" -msgstr "relfilenode-värde för index är inte satt i binärt uppgraderingsläge" +msgid "index relfilenumber value not set when in binary upgrade mode" +msgstr "relfile-nummervärde för index är inte satt i binärt uppgraderingsläge" -#: catalog/index.c:2231 +#: catalog/index.c:2214 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY mÃ¥ste vara första operationen i transaktion" -#: catalog/index.c:3635 +#: catalog/index.c:3668 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "kan inte omindexera temporära tabeller som tillhör andra sessioner" -#: catalog/index.c:3646 commands/indexcmds.c:3543 +#: catalog/index.c:3679 commands/indexcmds.c:3626 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "kan inte omindexera angivet index i TOAST-tabell" -#: catalog/index.c:3662 commands/indexcmds.c:3423 commands/indexcmds.c:3567 -#: commands/tablecmds.c:3305 +#: catalog/index.c:3695 commands/indexcmds.c:3504 commands/indexcmds.c:3650 +#: commands/tablecmds.c:3581 #, c-format msgid "cannot move system relation \"%s\"" msgstr "kan inte flytta systemrelation \"%s\"" -#: catalog/index.c:3806 +#: catalog/index.c:3832 #, c-format msgid "index \"%s\" was reindexed" msgstr "index \"%s\" omindexerades" -#: catalog/index.c:3943 +#: catalog/index.c:3998 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "kan inte omindexera ogiltigt index \"%s.%s\" pÃ¥ TOAST-tabell, hoppar över" -#: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 -#: commands/trigger.c:5718 +#: catalog/namespace.c:462 catalog/namespace.c:666 catalog/namespace.c:758 +#: commands/trigger.c:5729 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "referenser till andra databaser är inte implementerat: \"%s.%s.%s\"" -#: catalog/namespace.c:316 +#: catalog/namespace.c:519 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "temporära tabeller kan inte anges med ett schemanamn" -#: catalog/namespace.c:397 +#: catalog/namespace.c:600 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" msgstr "kunde inte ta lÃ¥s pÃ¥ relationen \"%s.%s\"" -#: catalog/namespace.c:402 commands/lockcmds.c:144 commands/lockcmds.c:233 +#: catalog/namespace.c:605 commands/lockcmds.c:143 commands/lockcmds.c:223 #, c-format msgid "could not obtain lock on relation \"%s\"" msgstr "kunde inte ta lÃ¥s pÃ¥ relationen \"%s\"" -#: catalog/namespace.c:430 parser/parse_relation.c:1373 +#: catalog/namespace.c:633 parser/parse_relation.c:1430 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "relationen \"%s.%s\" existerar inte" -#: catalog/namespace.c:435 parser/parse_relation.c:1386 -#: parser/parse_relation.c:1394 +#: catalog/namespace.c:638 parser/parse_relation.c:1443 +#: parser/parse_relation.c:1451 utils/adt/regproc.c:913 #, c-format msgid "relation \"%s\" does not exist" msgstr "relationen \"%s\" existerar inte" -#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1535 -#: commands/extension.c:1541 +#: catalog/namespace.c:704 catalog/namespace.c:3522 commands/extension.c:1607 +#: commands/extension.c:1613 #, c-format msgid "no schema has been selected to create in" msgstr "inget schema har valts för att skapa i" -#: catalog/namespace.c:653 catalog/namespace.c:666 +#: catalog/namespace.c:856 catalog/namespace.c:869 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "kan inte skapa relationer i temporära scheman som tillhör andra sessioner" -#: catalog/namespace.c:657 +#: catalog/namespace.c:860 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "kan inte skapa temporär relation i icke-temporärt schema" -#: catalog/namespace.c:672 +#: catalog/namespace.c:875 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "bara temporära relationer fÃ¥r skapas i temporära scheman" -#: catalog/namespace.c:2268 +#: catalog/namespace.c:2619 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "statistikobjektet \"%s\" existerar inte" -#: catalog/namespace.c:2391 +#: catalog/namespace.c:2761 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "textsökparser \"%s\" finns inte" -#: catalog/namespace.c:2517 +#: catalog/namespace.c:2906 utils/adt/regproc.c:1459 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "textsökkatalog \"%s\" finns inte" -#: catalog/namespace.c:2644 +#: catalog/namespace.c:3052 #, c-format msgid "text search template \"%s\" does not exist" msgstr "textsökmall \"%s\" finns inte" -#: catalog/namespace.c:2770 commands/tsearchcmds.c:1121 -#: utils/cache/ts_cache.c:613 +#: catalog/namespace.c:3197 commands/tsearchcmds.c:1168 +#: utils/adt/regproc.c:1349 utils/cache/ts_cache.c:635 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "textsökkonfiguration \"%s\" finns inte" -#: catalog/namespace.c:2883 parser/parse_expr.c:806 parser/parse_target.c:1255 +#: catalog/namespace.c:3329 parser/parse_expr.c:868 parser/parse_target.c:1259 #, c-format msgid "cross-database references are not implemented: %s" msgstr "referenser till andra databaser är inte implementerat: %s" -#: catalog/namespace.c:2889 gram.y:18258 gram.y:18298 parser/parse_expr.c:813 -#: parser/parse_target.c:1262 +#: catalog/namespace.c:3335 gram.y:19181 gram.y:19221 parser/parse_expr.c:875 +#: parser/parse_target.c:1266 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "ej korrekt kvalificerat namn (för mÃ¥nga namn med punkt): %s" -#: catalog/namespace.c:3019 +#: catalog/namespace.c:3465 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "kan inte flytta objekt in eller ut frÃ¥n temporära scheman" -#: catalog/namespace.c:3025 +#: catalog/namespace.c:3471 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "kan inte flytta objekt in eller ut frÃ¥n TOAST-schema" -#: catalog/namespace.c:3098 commands/schemacmds.c:245 commands/schemacmds.c:325 -#: commands/tablecmds.c:1273 +#: catalog/namespace.c:3544 commands/schemacmds.c:264 commands/schemacmds.c:344 +#: commands/tablecmds.c:1404 utils/adt/regproc.c:1688 #, c-format msgid "schema \"%s\" does not exist" msgstr "schema \"%s\" existerar inte" -#: catalog/namespace.c:3129 +#: catalog/namespace.c:3575 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "ej korrekt relationsnamn (för mÃ¥nga namn med punkt): %s" -#: catalog/namespace.c:3692 +#: catalog/namespace.c:4016 utils/adt/regproc.c:1056 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "jämförelse \"%s\" för kodning \"%s\" finns inte" -#: catalog/namespace.c:3747 +#: catalog/namespace.c:4071 #, c-format msgid "conversion \"%s\" does not exist" msgstr "konvertering \"%s\" finns inte" -#: catalog/namespace.c:4011 +#: catalog/namespace.c:4412 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "rättighet saknas för att skapa temporära tabeller i databasen \"%s\"" -#: catalog/namespace.c:4027 +#: catalog/namespace.c:4428 #, c-format msgid "cannot create temporary tables during recovery" msgstr "kan inte skapa temptabeller under Ã¥terställning" -#: catalog/namespace.c:4033 +#: catalog/namespace.c:4434 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "kan inte skapa temporära tabeller under en parallell operation" -#: catalog/namespace.c:4334 commands/tablespace.c:1236 commands/variable.c:64 -#: utils/misc/guc.c:12049 utils/misc/guc.c:12151 -#, c-format -msgid "List syntax is invalid." -msgstr "List-syntaxen är ogiltig." - -#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 -#: commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 -#: commands/tablecmds.c:12284 +#: catalog/objectaddress.c:1371 commands/policy.c:93 commands/policy.c:373 +#: commands/tablecmds.c:257 commands/tablecmds.c:299 commands/tablecmds.c:2327 +#: commands/tablecmds.c:12925 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" är inte en tabell" -#: catalog/objectaddress.c:1398 commands/tablecmds.c:259 -#: commands/tablecmds.c:17109 commands/view.c:119 +#: catalog/objectaddress.c:1378 commands/tablecmds.c:269 +#: commands/tablecmds.c:17851 commands/view.c:114 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" är inte en vy" -#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:265 -#: commands/tablecmds.c:17114 +#: catalog/objectaddress.c:1385 commands/matview.c:199 commands/tablecmds.c:275 +#: commands/tablecmds.c:17856 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" är inte en materialiserad vy" -#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 -#: commands/tablecmds.c:17119 +#: catalog/objectaddress.c:1392 commands/tablecmds.c:293 +#: commands/tablecmds.c:17861 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" är inte en främmande tabell" -#: catalog/objectaddress.c:1453 +#: catalog/objectaddress.c:1433 #, c-format msgid "must specify relation and object name" msgstr "mÃ¥ste ange relation och objektnamn" -#: catalog/objectaddress.c:1529 catalog/objectaddress.c:1582 +#: catalog/objectaddress.c:1509 catalog/objectaddress.c:1562 #, c-format msgid "column name must be qualified" msgstr "kolumnnamn mÃ¥ste vara kvalificerat" -#: catalog/objectaddress.c:1601 +#: catalog/objectaddress.c:1581 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "standardvärde för kolumn \"%s\" i relation \"%s\" existerar inte" -#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 -#: commands/tablecmds.c:275 commands/typecmds.c:274 commands/typecmds.c:3700 -#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:795 -#: utils/adt/acl.c:4434 +#: catalog/objectaddress.c:1618 commands/functioncmds.c:132 +#: commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3843 +#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 +#: utils/adt/acl.c:4560 #, c-format msgid "type \"%s\" does not exist" msgstr "typen \"%s\" existerar inte" -#: catalog/objectaddress.c:1757 +#: catalog/objectaddress.c:1737 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "operator %d (%s, %s) för %s finns inte" -#: catalog/objectaddress.c:1788 +#: catalog/objectaddress.c:1768 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "funktion %d (%s, %s) för %s finns inte" -#: catalog/objectaddress.c:1839 catalog/objectaddress.c:1865 +#: catalog/objectaddress.c:1819 catalog/objectaddress.c:1845 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "användarmappning för användare \"%s\" pÃ¥ server \"%s\" finns inte" -#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:691 +#: catalog/objectaddress.c:1834 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:713 #, c-format msgid "server \"%s\" does not exist" msgstr "server \"%s\" finns inte" -#: catalog/objectaddress.c:1921 +#: catalog/objectaddress.c:1901 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "publiceringsrelation \"%s\" i publicering \"%s\" finns inte" -#: catalog/objectaddress.c:1968 +#: catalog/objectaddress.c:1948 #, c-format msgid "publication schema \"%s\" in publication \"%s\" does not exist" msgstr "publiceringsschema \"%s\" i publicering \"%s\" finns inte" -#: catalog/objectaddress.c:2026 +#: catalog/objectaddress.c:2006 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "okänd standard-ACL-objekttyp \"%c\"" -#: catalog/objectaddress.c:2027 +#: catalog/objectaddress.c:2007 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "Giltiga objekttyper är \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." -#: catalog/objectaddress.c:2078 +#: catalog/objectaddress.c:2058 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "standard ACL för användare \"%s\" i schema \"%s\" pÃ¥ %s finns inte" -#: catalog/objectaddress.c:2083 +#: catalog/objectaddress.c:2063 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "standard ACL för användare \"%s\" pÃ¥ %s finns inte" -#: catalog/objectaddress.c:2110 catalog/objectaddress.c:2168 -#: catalog/objectaddress.c:2225 +#: catalog/objectaddress.c:2089 catalog/objectaddress.c:2146 +#: catalog/objectaddress.c:2201 #, c-format msgid "name or argument lists may not contain nulls" msgstr "namn eller argumentlistor fÃ¥r inte innehÃ¥lla null" -#: catalog/objectaddress.c:2144 +#: catalog/objectaddress.c:2123 #, c-format msgid "unsupported object type \"%s\"" msgstr "ej stöd för objekttyp \"%s\"" -#: catalog/objectaddress.c:2164 catalog/objectaddress.c:2182 -#: catalog/objectaddress.c:2247 catalog/objectaddress.c:2331 +#: catalog/objectaddress.c:2142 catalog/objectaddress.c:2159 +#: catalog/objectaddress.c:2224 catalog/objectaddress.c:2308 #, c-format msgid "name list length must be exactly %d" msgstr "namnlistlängen mÃ¥ste vara exakt %d" -#: catalog/objectaddress.c:2186 +#: catalog/objectaddress.c:2163 #, c-format msgid "large object OID may not be null" msgstr "stort objekt-OID fÃ¥r inte vara null" -#: catalog/objectaddress.c:2195 catalog/objectaddress.c:2265 -#: catalog/objectaddress.c:2272 +#: catalog/objectaddress.c:2172 catalog/objectaddress.c:2242 +#: catalog/objectaddress.c:2249 #, c-format msgid "name list length must be at least %d" msgstr "namnlistlängden mÃ¥ste vara minst %d" -#: catalog/objectaddress.c:2258 catalog/objectaddress.c:2279 +#: catalog/objectaddress.c:2235 catalog/objectaddress.c:2256 #, c-format msgid "argument list length must be exactly %d" msgstr "argumentlistans längd mÃ¥ste vara exakt %d" -#: catalog/objectaddress.c:2533 libpq/be-fsstubs.c:318 +#: catalog/objectaddress.c:2470 libpq/be-fsstubs.c:329 #, c-format msgid "must be owner of large object %u" msgstr "mÃ¥ste vara ägaren till stort objekt %u" -#: catalog/objectaddress.c:2548 commands/functioncmds.c:1566 +#: catalog/objectaddress.c:2485 commands/functioncmds.c:1560 #, c-format msgid "must be owner of type %s or type %s" msgstr "mÃ¥ste vara ägaren till typ %s eller typ %s" -#: catalog/objectaddress.c:2598 catalog/objectaddress.c:2616 +#: catalog/objectaddress.c:2512 catalog/objectaddress.c:2521 +#: catalog/objectaddress.c:2527 #, c-format -msgid "must be superuser" -msgstr "mÃ¥ste vara en superuser" +msgid "permission denied" +msgstr "rättighet saknas" + +#: catalog/objectaddress.c:2513 catalog/objectaddress.c:2522 +#, c-format +msgid "The current user must have the %s attribute." +msgstr "Aktuella användaren mÃ¥ste ha attributet %s." + +#: catalog/objectaddress.c:2528 +#, c-format +msgid "The current user must have the %s option on role \"%s\"." +msgstr "Aktuella användaren mÃ¥ste ha flaggan %s pÃ¥ rollen \"%s\"." -#: catalog/objectaddress.c:2605 +#: catalog/objectaddress.c:2542 #, c-format -msgid "must have CREATEROLE privilege" -msgstr "mÃ¥ste ha rättigheten CREATEROLE" +msgid "must be superuser" +msgstr "mÃ¥ste vara en superuser" -#: catalog/objectaddress.c:2686 +#: catalog/objectaddress.c:2611 #, c-format msgid "unrecognized object type \"%s\"" msgstr "okänd objekttyp \"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2978 +#: catalog/objectaddress.c:2928 #, c-format msgid "column %s of %s" msgstr "kolumn %s av %s" -#: catalog/objectaddress.c:2993 +#: catalog/objectaddress.c:2943 #, c-format msgid "function %s" msgstr "funktion %s" -#: catalog/objectaddress.c:3006 +#: catalog/objectaddress.c:2956 #, c-format msgid "type %s" msgstr "typ %s" -#: catalog/objectaddress.c:3043 +#: catalog/objectaddress.c:2993 #, c-format msgid "cast from %s to %s" msgstr "typomvandling frÃ¥n %s till %s" -#: catalog/objectaddress.c:3076 +#: catalog/objectaddress.c:3026 #, c-format msgid "collation %s" msgstr "jämförelse %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3107 +#: catalog/objectaddress.c:3057 #, c-format msgid "constraint %s on %s" msgstr "villkor %s pÃ¥ %s" -#: catalog/objectaddress.c:3113 +#: catalog/objectaddress.c:3063 #, c-format msgid "constraint %s" msgstr "villkor %s" -#: catalog/objectaddress.c:3145 +#: catalog/objectaddress.c:3095 #, c-format msgid "conversion %s" msgstr "konvertering %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3167 +#: catalog/objectaddress.c:3117 #, c-format msgid "default value for %s" msgstr "default-värde för %s" -#: catalog/objectaddress.c:3178 +#: catalog/objectaddress.c:3128 #, c-format msgid "language %s" msgstr "sprÃ¥k %s" -#: catalog/objectaddress.c:3186 +#: catalog/objectaddress.c:3136 #, c-format msgid "large object %u" msgstr "stort objekt %u" -#: catalog/objectaddress.c:3199 +#: catalog/objectaddress.c:3149 #, c-format msgid "operator %s" msgstr "operator %s" -#: catalog/objectaddress.c:3236 +#: catalog/objectaddress.c:3186 #, c-format msgid "operator class %s for access method %s" msgstr "operatorklass %s för accessmetod %s" -#: catalog/objectaddress.c:3264 +#: catalog/objectaddress.c:3214 #, c-format msgid "access method %s" msgstr "accessmetod %s" @@ -5119,7 +5494,7 @@ msgstr "accessmetod %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3313 +#: catalog/objectaddress.c:3269 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "operator %d (%s, %s) för %s: %s" @@ -5128,231 +5503,236 @@ msgstr "operator %d (%s, %s) för %s: %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3370 +#: catalog/objectaddress.c:3334 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "funktion %d (%s, %s) för %s: %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3422 +#: catalog/objectaddress.c:3388 #, c-format msgid "rule %s on %s" msgstr "regel %s pÃ¥ %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3468 +#: catalog/objectaddress.c:3434 #, c-format msgid "trigger %s on %s" msgstr "trigger %s pÃ¥ %s" -#: catalog/objectaddress.c:3488 +#: catalog/objectaddress.c:3454 #, c-format msgid "schema %s" msgstr "schema %s" -#: catalog/objectaddress.c:3516 +#: catalog/objectaddress.c:3482 #, c-format msgid "statistics object %s" msgstr "statistikobjekt %s" -#: catalog/objectaddress.c:3547 +#: catalog/objectaddress.c:3513 #, c-format msgid "text search parser %s" msgstr "textsökparser %s" -#: catalog/objectaddress.c:3578 +#: catalog/objectaddress.c:3544 #, c-format msgid "text search dictionary %s" msgstr "textsökordlista %s" -#: catalog/objectaddress.c:3609 +#: catalog/objectaddress.c:3575 #, c-format msgid "text search template %s" msgstr "textsökmall %s" -#: catalog/objectaddress.c:3640 +#: catalog/objectaddress.c:3606 #, c-format msgid "text search configuration %s" msgstr "textsökkonfiguration %s" -#: catalog/objectaddress.c:3653 +#: catalog/objectaddress.c:3619 #, c-format msgid "role %s" msgstr "roll %s" -#: catalog/objectaddress.c:3669 +#: catalog/objectaddress.c:3656 catalog/objectaddress.c:5505 +#, c-format +msgid "membership of role %s in role %s" +msgstr "medlemskap av rollen %s i rollen %s" + +#: catalog/objectaddress.c:3677 #, c-format msgid "database %s" msgstr "databas %s" -#: catalog/objectaddress.c:3685 +#: catalog/objectaddress.c:3693 #, c-format msgid "tablespace %s" msgstr "tabellutrymme %s" -#: catalog/objectaddress.c:3696 +#: catalog/objectaddress.c:3704 #, c-format msgid "foreign-data wrapper %s" msgstr "främmande data-omvandlare %s" -#: catalog/objectaddress.c:3706 +#: catalog/objectaddress.c:3714 #, c-format msgid "server %s" msgstr "server %s" -#: catalog/objectaddress.c:3739 +#: catalog/objectaddress.c:3747 #, c-format msgid "user mapping for %s on server %s" msgstr "användarmappning för %s pÃ¥ server %s" -#: catalog/objectaddress.c:3791 +#: catalog/objectaddress.c:3799 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "standardrättigheter för nya relationer som tillhör rollen %s i schema %s" -#: catalog/objectaddress.c:3795 +#: catalog/objectaddress.c:3803 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "standardrättigheter för nya relationer som tillhör rollen %s" -#: catalog/objectaddress.c:3801 +#: catalog/objectaddress.c:3809 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "standardrättigheter för nya sekvenser som tillhör rollen %s i schema %s" -#: catalog/objectaddress.c:3805 +#: catalog/objectaddress.c:3813 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "standardrättigheter för nya sekvenser som tillhör rollen %s" -#: catalog/objectaddress.c:3811 +#: catalog/objectaddress.c:3819 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "standardrättigheter för nya funktioner som tillhör rollen %s i schema %s" -#: catalog/objectaddress.c:3815 +#: catalog/objectaddress.c:3823 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "standardrättigheter för nya funktioner som tillhör rollen %s" -#: catalog/objectaddress.c:3821 +#: catalog/objectaddress.c:3829 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "standardrättigheter för nya typer som tillhör rollen %s i schema %s" -#: catalog/objectaddress.c:3825 +#: catalog/objectaddress.c:3833 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "standardrättigheter för nya typer som tillhör rollen %s" -#: catalog/objectaddress.c:3831 +#: catalog/objectaddress.c:3839 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr " %zu)" msgstr "servern försöke skicka för stort GSSAPI-paket (%zu > %zu)" @@ -14891,817 +15679,823 @@ msgstr "GSSAPI-fel vid uppackning" msgid "incoming GSSAPI message did not use confidentiality" msgstr "inkommande GSSAPI-meddelande använde inte sekretess" -#: libpq/be-secure-gssapi.c:570 +#: libpq/be-secure-gssapi.c:575 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %d)" msgstr "för stort GSSAPI-paket skickat av klienten (%zu > %d)" -#: libpq/be-secure-gssapi.c:594 +#: libpq/be-secure-gssapi.c:600 msgid "could not accept GSSAPI security context" msgstr "kunde inte acceptera GSSSPI-säkerhetskontext" -#: libpq/be-secure-gssapi.c:689 +#: libpq/be-secure-gssapi.c:701 msgid "GSSAPI size check error" msgstr "GSSAPI-fel vid kontroll av storlek" -#: libpq/be-secure-openssl.c:122 +#: libpq/be-secure-openssl.c:131 #, c-format msgid "could not create SSL context: %s" msgstr "kunde inte skapa SSL-kontext: %s" -#: libpq/be-secure-openssl.c:148 +#: libpq/be-secure-openssl.c:157 #, c-format msgid "could not load server certificate file \"%s\": %s" msgstr "kunde inte ladda serverns certifikatfil \"%s\": %s" -#: libpq/be-secure-openssl.c:168 +#: libpq/be-secure-openssl.c:177 #, c-format msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" msgstr "privat nyckelfil \"%s\" kan inte laddas om eftersom den kräver en lösenordsfras" -#: libpq/be-secure-openssl.c:173 +#: libpq/be-secure-openssl.c:182 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "kunde inte läsa in privata nyckelfilen \"%s\": %s" -#: libpq/be-secure-openssl.c:182 +#: libpq/be-secure-openssl.c:191 #, c-format msgid "check of private key failed: %s" msgstr "kontroll av privat nyckel misslyckades: %s" #. translator: first %s is a GUC option name, second %s is its value -#: libpq/be-secure-openssl.c:195 libpq/be-secure-openssl.c:218 +#: libpq/be-secure-openssl.c:204 libpq/be-secure-openssl.c:227 #, c-format msgid "\"%s\" setting \"%s\" not supported by this build" msgstr "\"%s\"-inställning \"%s\" stöds inte av detta bygge" -#: libpq/be-secure-openssl.c:205 +#: libpq/be-secure-openssl.c:214 #, c-format msgid "could not set minimum SSL protocol version" msgstr "kunde inte sätta minimal SSL-protokollversion" -#: libpq/be-secure-openssl.c:228 +#: libpq/be-secure-openssl.c:237 #, c-format msgid "could not set maximum SSL protocol version" msgstr "kunde inte sätta maximal SSL-protokollversion" -#: libpq/be-secure-openssl.c:244 +#: libpq/be-secure-openssl.c:253 #, c-format msgid "could not set SSL protocol version range" msgstr "kunde inte sätta SSL-protokollversionsintervall" -#: libpq/be-secure-openssl.c:245 +#: libpq/be-secure-openssl.c:254 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "\"%s\" fÃ¥r inte vara högre än \"%s\"" -#: libpq/be-secure-openssl.c:282 +#: libpq/be-secure-openssl.c:307 #, c-format msgid "could not set the cipher list (no valid ciphers available)" msgstr "kunde inte sätta kryptolistan (inga giltiga krypton är tillgängliga)" -#: libpq/be-secure-openssl.c:302 +#: libpq/be-secure-openssl.c:327 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "kunde inte ladda root-certifikatfilen \"%s\": %s" -#: libpq/be-secure-openssl.c:351 +#: libpq/be-secure-openssl.c:376 #, c-format msgid "could not load SSL certificate revocation list file \"%s\": %s" msgstr "kunde inte ladda fil \"%s\" med certifikatÃ¥terkallningslista för SSL: %s" -#: libpq/be-secure-openssl.c:359 +#: libpq/be-secure-openssl.c:384 #, c-format msgid "could not load SSL certificate revocation list directory \"%s\": %s" msgstr "kunde inte ladda katalog \"%s\" för certifikatÃ¥terkallning: %s" -#: libpq/be-secure-openssl.c:367 +#: libpq/be-secure-openssl.c:392 #, c-format msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" msgstr "kunde inte ladda fil \"%s\" eller katalog \"%s\" med certifikatÃ¥terkallning för SSL: %s" -#: libpq/be-secure-openssl.c:425 +#: libpq/be-secure-openssl.c:450 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "kunde inte initiera SSL-uppkoppling: SSL-kontex ej uppsatt" -#: libpq/be-secure-openssl.c:436 +#: libpq/be-secure-openssl.c:464 #, c-format msgid "could not initialize SSL connection: %s" msgstr "kunde inte initiera SSL-uppkoppling: %s" -#: libpq/be-secure-openssl.c:444 +#: libpq/be-secure-openssl.c:472 #, c-format msgid "could not set SSL socket: %s" msgstr "kunde inte sätta SSL-uttag (socket): %s" -#: libpq/be-secure-openssl.c:499 +#: libpq/be-secure-openssl.c:528 #, c-format msgid "could not accept SSL connection: %m" msgstr "kunde inte acceptera SSL-uppkoppling: %m" -#: libpq/be-secure-openssl.c:503 libpq/be-secure-openssl.c:556 +#: libpq/be-secure-openssl.c:532 libpq/be-secure-openssl.c:589 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "kunde inte starta SSL-anslutning: hittade EOF" -#: libpq/be-secure-openssl.c:542 +#: libpq/be-secure-openssl.c:573 #, c-format msgid "could not accept SSL connection: %s" msgstr "kunde inte acceptera SSL-uppkoppling: %s" -#: libpq/be-secure-openssl.c:545 +#: libpq/be-secure-openssl.c:577 #, c-format msgid "This may indicate that the client does not support any SSL protocol version between %s and %s." msgstr "Detta kan tyda pÃ¥ att servern inte stöder nÃ¥gon SSL-protokolversion mellan %s och %s." -#: libpq/be-secure-openssl.c:561 libpq/be-secure-openssl.c:741 -#: libpq/be-secure-openssl.c:805 +#: libpq/be-secure-openssl.c:594 libpq/be-secure-openssl.c:809 +#: libpq/be-secure-openssl.c:879 #, c-format msgid "unrecognized SSL error code: %d" msgstr "okänd SSL-felkod: %d" -#: libpq/be-secure-openssl.c:607 +#: libpq/be-secure-openssl.c:622 +#, c-format +msgid "received SSL connection request with unexpected ALPN protocol" +msgstr "tog emot anslutningsförfrÃ¥gan för SSL med oväntat ALPN-protokoll" + +#: libpq/be-secure-openssl.c:666 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "SSL-certifikatets \"comman name\" innehÃ¥ller null-värden" -#: libpq/be-secure-openssl.c:647 +#: libpq/be-secure-openssl.c:712 #, c-format msgid "SSL certificate's distinguished name contains embedded null" msgstr "SSL-certifikatets utskiljande namn innehÃ¥ller null-värden" -#: libpq/be-secure-openssl.c:730 libpq/be-secure-openssl.c:789 +#: libpq/be-secure-openssl.c:798 libpq/be-secure-openssl.c:863 #, c-format msgid "SSL error: %s" msgstr "SSL-fel: %s" -#: libpq/be-secure-openssl.c:971 +#: libpq/be-secure-openssl.c:1038 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "kunde inte öppna DH-parameterfil \"%s\": %m" -#: libpq/be-secure-openssl.c:983 +#: libpq/be-secure-openssl.c:1050 #, c-format msgid "could not load DH parameters file: %s" msgstr "kunde inte ladda DH-parameterfil: %s" -#: libpq/be-secure-openssl.c:993 +#: libpq/be-secure-openssl.c:1060 #, c-format msgid "invalid DH parameters: %s" msgstr "ogiltiga DH-parametrar: %s" -#: libpq/be-secure-openssl.c:1002 +#: libpq/be-secure-openssl.c:1069 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "ogiltiga DH-parametrar: p är inte ett primtal" -#: libpq/be-secure-openssl.c:1011 +#: libpq/be-secure-openssl.c:1078 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "ogiltiga DH-parametrar: varken lämplig generator eller säkert primtal" -#: libpq/be-secure-openssl.c:1172 +#: libpq/be-secure-openssl.c:1214 +#, c-format +msgid "Client certificate verification failed at depth %d: %s." +msgstr "Klientcertifikat-autentisering misslyckades vid djupet %d: %s." + +#: libpq/be-secure-openssl.c:1251 +#, c-format +msgid "Failed certificate data (unverified): subject \"%s\", serial number %s, issuer \"%s\"." +msgstr "Felaktig certifikatdata (ej verifierad): ämne \"%s\", serienummer %s, utställare \"%s\"." + +#: libpq/be-secure-openssl.c:1252 +msgid "unknown" +msgstr "okänd" + +#: libpq/be-secure-openssl.c:1389 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: kunde inte ladda DH-parametrar" -#: libpq/be-secure-openssl.c:1180 +#: libpq/be-secure-openssl.c:1397 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: kunde inte sätta DH-parametrar: %s" -#: libpq/be-secure-openssl.c:1207 +#: libpq/be-secure-openssl.c:1424 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: okänt kurvnamn: %s" -#: libpq/be-secure-openssl.c:1216 +#: libpq/be-secure-openssl.c:1433 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: kunde inte skapa nyckel" -#: libpq/be-secure-openssl.c:1244 +#: libpq/be-secure-openssl.c:1461 msgid "no SSL error reported" msgstr "inget SSL-fel rapporterat" -#: libpq/be-secure-openssl.c:1248 +#: libpq/be-secure-openssl.c:1479 #, c-format msgid "SSL error code %lu" msgstr "SSL-felkod %lu" -#: libpq/be-secure-openssl.c:1402 +#: libpq/be-secure-openssl.c:1636 #, c-format msgid "could not create BIO" msgstr "kunde inte skapa BIO" -#: libpq/be-secure-openssl.c:1412 +#: libpq/be-secure-openssl.c:1646 #, c-format msgid "could not get NID for ASN1_OBJECT object" msgstr "kunde inte hämta NID för ASN1_OBJECT-objekt" -#: libpq/be-secure-openssl.c:1420 +#: libpq/be-secure-openssl.c:1654 #, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" msgstr "kunde inte konvertera NID %d till en ASN1_OBJECT-struktur" -#: libpq/be-secure.c:209 libpq/be-secure.c:305 -#, c-format -msgid "terminating connection due to unexpected postmaster exit" -msgstr "avslutar anslutning pÃ¥ grund av att postmaster stängde oväntat ner" - -#: libpq/crypt.c:49 +#: libpq/crypt.c:48 #, c-format msgid "Role \"%s\" does not exist." msgstr "Rollen \"%s\" finns inte." -#: libpq/crypt.c:59 +#: libpq/crypt.c:58 #, c-format msgid "User \"%s\" has no password assigned." msgstr "Användaren \"%s\" har inget lösenord satt." -#: libpq/crypt.c:77 +#: libpq/crypt.c:76 #, c-format msgid "User \"%s\" has an expired password." msgstr "Användaren \"%s\" har ett utgÃ¥nget lösenord." -#: libpq/crypt.c:181 +#: libpq/crypt.c:182 #, c-format msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "Användaren \"%s\" har ett lösenord som inte kan användas med MD5-autentisering." -#: libpq/crypt.c:202 libpq/crypt.c:244 libpq/crypt.c:264 +#: libpq/crypt.c:203 libpq/crypt.c:245 libpq/crypt.c:265 #, c-format msgid "Password does not match for user \"%s\"." msgstr "Lösenordet matchar inte för användare \"%s\"." -#: libpq/crypt.c:283 +#: libpq/crypt.c:284 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "Lösenordet för användare \"%s\" är pÃ¥ ett okänt format." -#: libpq/hba.c:209 +#: libpq/hba.c:327 +#, c-format +msgid "invalid regular expression \"%s\": %s" +msgstr "ogiltigt reguljärt uttryck \"%s\": %s" + +#: libpq/hba.c:329 libpq/hba.c:661 libpq/hba.c:1245 libpq/hba.c:1265 +#: libpq/hba.c:1288 libpq/hba.c:1301 libpq/hba.c:1354 libpq/hba.c:1382 +#: libpq/hba.c:1390 libpq/hba.c:1402 libpq/hba.c:1423 libpq/hba.c:1436 +#: libpq/hba.c:1461 libpq/hba.c:1488 libpq/hba.c:1500 libpq/hba.c:1559 +#: libpq/hba.c:1579 libpq/hba.c:1593 libpq/hba.c:1613 libpq/hba.c:1624 +#: libpq/hba.c:1639 libpq/hba.c:1658 libpq/hba.c:1674 libpq/hba.c:1686 +#: libpq/hba.c:1752 libpq/hba.c:1765 libpq/hba.c:1787 libpq/hba.c:1799 +#: libpq/hba.c:1817 libpq/hba.c:1867 libpq/hba.c:1911 libpq/hba.c:1922 +#: libpq/hba.c:1938 libpq/hba.c:1955 libpq/hba.c:1966 libpq/hba.c:1985 +#: libpq/hba.c:2001 libpq/hba.c:2017 libpq/hba.c:2076 libpq/hba.c:2093 +#: libpq/hba.c:2106 libpq/hba.c:2118 libpq/hba.c:2137 libpq/hba.c:2223 +#: libpq/hba.c:2241 libpq/hba.c:2335 libpq/hba.c:2354 libpq/hba.c:2383 +#: libpq/hba.c:2396 libpq/hba.c:2419 libpq/hba.c:2441 libpq/hba.c:2455 +#: tsearch/ts_locale.c:241 +#, c-format +msgid "line %d of configuration file \"%s\"" +msgstr "rad %d i konfigurationsfil \"%s\"" + +#: libpq/hba.c:457 #, c-format -msgid "authentication file token too long, skipping: \"%s\"" -msgstr "autentiseringsfil-token för lÃ¥ng, hoppar över: \"%s\"" +msgid "skipping missing authentication file \"%s\"" +msgstr "hoppar över saknad autentiseringsfil \"%s\"" -#: libpq/hba.c:381 +#: libpq/hba.c:609 #, c-format -msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" -msgstr "kunde inte öppna sekundär autentiseringsfil \"@%s\" som \"%s\": %m" +msgid "could not open file \"%s\": maximum nesting depth exceeded" +msgstr "kunde inte öppna filen \"%s\": maximalt nästlingsdjup överskridet" -#: libpq/hba.c:832 +#: libpq/hba.c:1216 #, c-format msgid "error enumerating network interfaces: %m" msgstr "fel vid uppräkning av nätverksinterface: %m" #. translator: the second %s is a list of auth methods -#: libpq/hba.c:859 +#: libpq/hba.c:1243 #, c-format msgid "authentication option \"%s\" is only valid for authentication methods %s" msgstr "autentiseringsflagga \"%s\" är bara giltig för autentiseringsmetoder %s" -#: libpq/hba.c:861 libpq/hba.c:881 libpq/hba.c:916 libpq/hba.c:967 -#: libpq/hba.c:981 libpq/hba.c:1005 libpq/hba.c:1013 libpq/hba.c:1025 -#: libpq/hba.c:1046 libpq/hba.c:1059 libpq/hba.c:1079 libpq/hba.c:1101 -#: libpq/hba.c:1113 libpq/hba.c:1172 libpq/hba.c:1192 libpq/hba.c:1206 -#: libpq/hba.c:1226 libpq/hba.c:1237 libpq/hba.c:1252 libpq/hba.c:1271 -#: libpq/hba.c:1287 libpq/hba.c:1299 libpq/hba.c:1336 libpq/hba.c:1377 -#: libpq/hba.c:1390 libpq/hba.c:1412 libpq/hba.c:1424 libpq/hba.c:1442 -#: libpq/hba.c:1492 libpq/hba.c:1536 libpq/hba.c:1547 libpq/hba.c:1563 -#: libpq/hba.c:1580 libpq/hba.c:1591 libpq/hba.c:1610 libpq/hba.c:1626 -#: libpq/hba.c:1642 libpq/hba.c:1700 libpq/hba.c:1717 libpq/hba.c:1730 -#: libpq/hba.c:1742 libpq/hba.c:1761 libpq/hba.c:1847 libpq/hba.c:1865 -#: libpq/hba.c:1959 libpq/hba.c:1978 libpq/hba.c:2007 libpq/hba.c:2020 -#: libpq/hba.c:2043 libpq/hba.c:2065 libpq/hba.c:2079 tsearch/ts_locale.c:232 -#, c-format -msgid "line %d of configuration file \"%s\"" -msgstr "rad %d i konfigurationsfil \"%s\"" - -#: libpq/hba.c:879 +#: libpq/hba.c:1263 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "autentiseringsmetod \"%s\" kräver att argumentet \"%s\" är satt" -#: libpq/hba.c:903 +#: libpq/hba.c:1287 #, c-format -msgid "missing entry in file \"%s\" at end of line %d" -msgstr "saknar post i fil \"%s\" vid slutet av rad %d" +msgid "missing entry at end of line" +msgstr "saknar post vid slutet av raden" -#: libpq/hba.c:915 +#: libpq/hba.c:1300 #, c-format msgid "multiple values in ident field" msgstr "multipla värden i ident-fält" -#: libpq/hba.c:965 +#: libpq/hba.c:1352 #, c-format msgid "multiple values specified for connection type" msgstr "multipla värden angivna för anslutningstyp" -#: libpq/hba.c:966 +#: libpq/hba.c:1353 #, c-format msgid "Specify exactly one connection type per line." msgstr "Ange exakt en anslutningstyp per rad." -#: libpq/hba.c:980 -#, c-format -msgid "local connections are not supported by this build" -msgstr "lokala anslutningar stöds inte av detta bygge" - -#: libpq/hba.c:1003 +#: libpq/hba.c:1380 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "hostssl-post kan inte matcha dÃ¥ SSL är avslaget" -#: libpq/hba.c:1004 +#: libpq/hba.c:1381 #, c-format -msgid "Set ssl = on in postgresql.conf." -msgstr "Sätt ssl = on i postgresql.conf." +msgid "Set \"ssl = on\" in postgresql.conf." +msgstr "Sätt \"ssl = on\" i postgresql.conf." -#: libpq/hba.c:1012 +#: libpq/hba.c:1389 #, c-format msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "hostssl-post kan inte matcha dÃ¥ SSL inte stöds i detta bygge" -#: libpq/hba.c:1024 +#: libpq/hba.c:1401 #, c-format msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" msgstr "hostgssenc-post kan inte matcha dÃ¥ GSSAPI inte stöds i detta bygge" -#: libpq/hba.c:1044 +#: libpq/hba.c:1421 #, c-format msgid "invalid connection type \"%s\"" msgstr "ogiltig anslutningstyp \"%s\"" -#: libpq/hba.c:1058 +#: libpq/hba.c:1435 #, c-format msgid "end-of-line before database specification" msgstr "slut-pÃ¥-rad innan databasspecifikation" -#: libpq/hba.c:1078 +#: libpq/hba.c:1460 #, c-format msgid "end-of-line before role specification" msgstr "slut-pÃ¥-rad innan rollspecifikation" -#: libpq/hba.c:1100 +#: libpq/hba.c:1487 #, c-format msgid "end-of-line before IP address specification" msgstr "slut-pÃ¥-rad före IP-adressangivelse" -#: libpq/hba.c:1111 +#: libpq/hba.c:1498 #, c-format msgid "multiple values specified for host address" msgstr "multipla värden angivna för värdnamn" -#: libpq/hba.c:1112 +#: libpq/hba.c:1499 #, c-format msgid "Specify one address range per line." msgstr "Ange ett adressintervall per rad." -#: libpq/hba.c:1170 +#: libpq/hba.c:1557 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "ogiltig IP-adress \"%s\": %s" -#: libpq/hba.c:1190 +#: libpq/hba.c:1577 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "fÃ¥r inte ange bÃ¥de värdnamn och CIDR-mask: \"%s\"" -#: libpq/hba.c:1204 +#: libpq/hba.c:1591 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "ogiltig CIDR-mask i adress \"%s\"" -#: libpq/hba.c:1224 +#: libpq/hba.c:1611 #, c-format msgid "end-of-line before netmask specification" msgstr "slut-pÃ¥-fil innan nätmask-angivelse" -#: libpq/hba.c:1225 +#: libpq/hba.c:1612 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "Ange adressintervall pÃ¥ CIDR-format eller ange en separat nätmask." -#: libpq/hba.c:1236 +#: libpq/hba.c:1623 #, c-format msgid "multiple values specified for netmask" msgstr "multipla värden angivna för nätmask" -#: libpq/hba.c:1250 +#: libpq/hba.c:1637 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "ogiltig IP-mask \"%s\": %s" -#: libpq/hba.c:1270 +#: libpq/hba.c:1657 #, c-format msgid "IP address and mask do not match" msgstr "IP-adress och mask matchar inte varandra" -#: libpq/hba.c:1286 +#: libpq/hba.c:1673 #, c-format msgid "end-of-line before authentication method" msgstr "slut-pÃ¥-rad innan autentiseringsmetod" -#: libpq/hba.c:1297 +#: libpq/hba.c:1684 #, c-format msgid "multiple values specified for authentication type" msgstr "multipla värden angivna för autentiseringstyp" -#: libpq/hba.c:1298 +#: libpq/hba.c:1685 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Ange exakt en autentiseringstyp per rad." -#: libpq/hba.c:1375 +#: libpq/hba.c:1750 #, c-format msgid "invalid authentication method \"%s\"" msgstr "ogiltig autentiseringsmetod \"%s\"" -#: libpq/hba.c:1388 +#: libpq/hba.c:1763 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "ogiltig autentiseringsmetod \"%s\": stöds inte av detta bygge" -#: libpq/hba.c:1411 +#: libpq/hba.c:1786 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "gssapi-autentisering stöds ej pÃ¥ lokala uttag (socket)" -#: libpq/hba.c:1423 +#: libpq/hba.c:1798 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "peer-autentisering stöds bara pÃ¥ logala uttag (socket)" -#: libpq/hba.c:1441 +#: libpq/hba.c:1816 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "cert-autentisering stöds bara för hostssl-anslutningar" -#: libpq/hba.c:1491 +#: libpq/hba.c:1866 #, c-format msgid "authentication option not in name=value format: %s" msgstr "autentiseringsflagga et pÃ¥ formatet namn=värde: %s" -#: libpq/hba.c:1535 +#: libpq/hba.c:1910 #, c-format msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" msgstr "kan inte använda ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter eller ldapurl tillsammans med ldapprefix" -#: libpq/hba.c:1546 +#: libpq/hba.c:1921 #, c-format msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" msgstr "autentiseringsmetoden \"ldap\" kräver att argumenten \"ldapbasedn\", \"ldapprefix\" eller \"ldapsuffix\" är satta" -#: libpq/hba.c:1562 +#: libpq/hba.c:1937 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "kan inte använda ldapsearchattribute tillsammans med ldapsearchfilter" -#: libpq/hba.c:1579 +#: libpq/hba.c:1954 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "listan med RADIUS-servrar kan inte vara tom" -#: libpq/hba.c:1590 +#: libpq/hba.c:1965 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "listan med RADIUS-hemligheter kan inte vara tom" -#: libpq/hba.c:1607 +#: libpq/hba.c:1982 #, c-format msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "antalet RADIUS-hemligheter (%d) mÃ¥ste vara 1 eller samma som antalet RADIUS-servrar (%d)" -#: libpq/hba.c:1623 +#: libpq/hba.c:1998 #, c-format msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "antalet RADIUS-portar (%d) mÃ¥ste vara 1 eller samma som antalet RADIUS-servrar (%d)" -#: libpq/hba.c:1639 +#: libpq/hba.c:2014 #, c-format msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "antalet RADIUS-identifierare (%d) mÃ¥ste vara 1 eller samma som antalet RADIUS-servrar (%d)" -#: libpq/hba.c:1690 +#: libpq/hba.c:2066 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi och cert" -#: libpq/hba.c:1699 +#: libpq/hba.c:2075 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert kan bara konfigureras för \"hostssl\"-rader" -#: libpq/hba.c:1716 +#: libpq/hba.c:2092 #, c-format msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "clientcert tillÃ¥ter bara \"verify-full\" när man använder \"cert\"-autentisering" -#: libpq/hba.c:1729 +#: libpq/hba.c:2105 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "ogiltigt värde för clientcert: \"%s\"" -#: libpq/hba.c:1741 +#: libpq/hba.c:2117 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "clientname kan bara konfigureras för \"hostssl\"-rader" -#: libpq/hba.c:1760 +#: libpq/hba.c:2136 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "ogiltigt värde för clientname: \"%s\"" -#: libpq/hba.c:1793 +#: libpq/hba.c:2169 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "kunde inte parsa LDAP-URL \"%s\": %s" -#: libpq/hba.c:1804 +#: libpq/hba.c:2180 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "ej stöd för LDAP-URL-schema: %s" -#: libpq/hba.c:1828 +#: libpq/hba.c:2204 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "LDAP-URL:er stöds inte pÃ¥ denna platform" -#: libpq/hba.c:1846 +#: libpq/hba.c:2222 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "ogiltigt ldap-schema-värde: \"%s\"" -#: libpq/hba.c:1864 +#: libpq/hba.c:2240 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "ogiltigt LDAP-portnummer \"%s\"" -#: libpq/hba.c:1910 libpq/hba.c:1917 +#: libpq/hba.c:2286 libpq/hba.c:2293 msgid "gssapi and sspi" msgstr "gssapi och sspi" -#: libpq/hba.c:1926 libpq/hba.c:1935 +#: libpq/hba.c:2302 libpq/hba.c:2311 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1957 +#: libpq/hba.c:2333 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "kunde inte parsa RADIUS-serverlista \"%s\"" -#: libpq/hba.c:2005 +#: libpq/hba.c:2381 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "kunde inte parsa RADIUS-portlista \"%s\"" -#: libpq/hba.c:2019 +#: libpq/hba.c:2395 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "ogiltigt RADIUS-portnummer: \"%s\"" -#: libpq/hba.c:2041 +#: libpq/hba.c:2417 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "kunde inte parsa RADIUS-hemlighetlista: \"%s\"" -#: libpq/hba.c:2063 +#: libpq/hba.c:2439 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "kunde inte parsa RADIUS-identifierarlista: \"%s\"" -#: libpq/hba.c:2077 +#: libpq/hba.c:2453 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "okänd autentiseringsflaggnamn: \"%s\"" -#: libpq/hba.c:2274 +#: libpq/hba.c:2645 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "konfigurationsfil \"%s\" innehÃ¥ller inga poster" -#: libpq/hba.c:2374 -#, c-format -msgid "invalid regular expression \"%s\": %s" -msgstr "ogiltigt reguljärt uttryck \"%s\": %s" - -#: libpq/hba.c:2437 +#: libpq/hba.c:2798 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "matchning av reguljärt uttryck för \"%s\" misslyckades: %s" -#: libpq/hba.c:2456 +#: libpq/hba.c:2822 #, c-format msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" msgstr "reguljärt uttryck \"%s\" har inga deluttryck som krävs för bakÃ¥treferens i \"%s\"" -#: libpq/hba.c:2552 +#: libpq/hba.c:2925 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "givet användarnamn (%s) och autentiserat användarnamn (%s) matchar inte" -#: libpq/hba.c:2572 +#: libpq/hba.c:2945 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "ingen träff i användarmappning \"%s\" för användare \"%s\" autentiserad som \"%s\"" -#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 +#: libpq/pqcomm.c:211 libpq/pqcomm.c:219 libpq/pqcomm.c:250 libpq/pqcomm.c:259 +#: libpq/pqcomm.c:1648 libpq/pqcomm.c:1693 libpq/pqcomm.c:1733 +#: libpq/pqcomm.c:1777 libpq/pqcomm.c:1816 libpq/pqcomm.c:1855 +#: libpq/pqcomm.c:1891 libpq/pqcomm.c:1930 #, c-format -msgid "could not open usermap file \"%s\": %m" -msgstr "kunde inte öppna användarmappningsfil \"%s\": %m" +msgid "%s(%s) failed: %m" +msgstr "%s(%s) misslyckades: %m" -#: libpq/pqcomm.c:204 +#: libpq/pqcomm.c:296 #, c-format msgid "could not set socket to nonblocking mode: %m" msgstr "kunde inte sätta uttag (socket) till ickeblockerande läge: %m" -#: libpq/pqcomm.c:362 +#: libpq/pqcomm.c:456 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "Sökväg till unixdomänuttag \"%s\" är för lÃ¥ng (maximalt %d byte)" -#: libpq/pqcomm.c:383 +#: libpq/pqcomm.c:476 #, c-format msgid "could not translate host name \"%s\", service \"%s\" to address: %s" msgstr "kunde inte översätta värdnamn \"%s\", service \"%s\" till adress: %s" -#: libpq/pqcomm.c:387 +#: libpq/pqcomm.c:480 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "kunde inte översätta service \"%s\" till adress: %s" -#: libpq/pqcomm.c:414 +#: libpq/pqcomm.c:502 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "kunde inte binda till alla efterfrÃ¥gade adresser: MAXLISTEN (%d) överskriden" -#: libpq/pqcomm.c:423 +#: libpq/pqcomm.c:511 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:427 +#: libpq/pqcomm.c:514 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:432 +#: libpq/pqcomm.c:517 msgid "Unix" msgstr "Unix" -#: libpq/pqcomm.c:437 +#: libpq/pqcomm.c:521 #, c-format msgid "unrecognized address family %d" msgstr "ej igenkänd adressfamilj %d" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:463 +#: libpq/pqcomm.c:545 #, c-format msgid "could not create %s socket for address \"%s\": %m" msgstr "kunde inte skapa %s-uttag för adress \"%s\": %m" #. translator: third %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:489 libpq/pqcomm.c:507 +#: libpq/pqcomm.c:574 libpq/pqcomm.c:592 #, c-format msgid "%s(%s) failed for %s address \"%s\": %m" msgstr "%s(%s) misslyckades för %s-adress \"%s\": %m" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:530 +#: libpq/pqcomm.c:615 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "kunde inte binda %s-adress \"%s\": %m" -#: libpq/pqcomm.c:534 +#: libpq/pqcomm.c:619 #, c-format msgid "Is another postmaster already running on port %d?" msgstr "Kör en annan postmaster redan pÃ¥ port %d?" -#: libpq/pqcomm.c:536 +#: libpq/pqcomm.c:621 #, c-format msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." msgstr "Kör en annan postmaster redan pÃ¥ port %d? Om inte, vänta nÃ¥gra sekunder och försök igen." #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:569 +#: libpq/pqcomm.c:650 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "kunde inte lyssna pÃ¥ %s-adress \"%s\": %m" -#: libpq/pqcomm.c:578 +#: libpq/pqcomm.c:658 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "lyssnar pÃ¥ Unix-uttag (socket) \"%s\"" #. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:584 +#: libpq/pqcomm.c:663 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "lyssnar pÃ¥ %s-adress \"%s\", port %d" -#: libpq/pqcomm.c:675 +#: libpq/pqcomm.c:753 #, c-format msgid "group \"%s\" does not exist" msgstr "gruppen \"%s\" existerar inte" -#: libpq/pqcomm.c:685 +#: libpq/pqcomm.c:763 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "kunde inte sätta gruppen pÃ¥ filen \"%s\": %m" -#: libpq/pqcomm.c:696 +#: libpq/pqcomm.c:774 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "kunde inte sätta rättigheter pÃ¥ filen \"%s\": %m" -#: libpq/pqcomm.c:726 +#: libpq/pqcomm.c:803 #, c-format msgid "could not accept new connection: %m" msgstr "kunde inte acceptera ny uppkoppling: %m" -#: libpq/pqcomm.c:766 libpq/pqcomm.c:775 libpq/pqcomm.c:807 libpq/pqcomm.c:817 -#: libpq/pqcomm.c:1642 libpq/pqcomm.c:1687 libpq/pqcomm.c:1727 -#: libpq/pqcomm.c:1771 libpq/pqcomm.c:1810 libpq/pqcomm.c:1849 -#: libpq/pqcomm.c:1885 libpq/pqcomm.c:1924 -#, c-format -msgid "%s(%s) failed: %m" -msgstr "%s(%s) misslyckades: %m" - -#: libpq/pqcomm.c:921 +#: libpq/pqcomm.c:885 #, c-format msgid "there is no client connection" msgstr "det finns ingen klientanslutning" -#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 +#: libpq/pqcomm.c:941 libpq/pqcomm.c:1042 #, c-format msgid "could not receive data from client: %m" msgstr "kunde inte ta emot data frÃ¥n klient: %m" -#: libpq/pqcomm.c:1173 tcop/postgres.c:4371 +#: libpq/pqcomm.c:1149 tcop/postgres.c:4533 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "stänger anslutning dÃ¥ protokollsynkroniseringen tappades" -#: libpq/pqcomm.c:1239 +#: libpq/pqcomm.c:1215 #, c-format msgid "unexpected EOF within message length word" msgstr "oväntat EOF inom meddelandelängdord" -#: libpq/pqcomm.c:1249 +#: libpq/pqcomm.c:1225 #, c-format msgid "invalid message length" msgstr "ogiltig meddelandelängd" -#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 +#: libpq/pqcomm.c:1247 libpq/pqcomm.c:1260 #, c-format msgid "incomplete message from client" msgstr "inkomplett meddelande frÃ¥n klient" -#: libpq/pqcomm.c:1395 +#: libpq/pqcomm.c:1401 #, c-format msgid "could not send data to client: %m" msgstr "kunde inte skicka data till klient: %m" -#: libpq/pqcomm.c:1610 +#: libpq/pqcomm.c:1616 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s) misslyckades: felkod %d" -#: libpq/pqcomm.c:1699 +#: libpq/pqcomm.c:1705 #, c-format msgid "setting the keepalive idle time is not supported" msgstr "sätta idle-tid pÃ¥ keepalive stöds inte" -#: libpq/pqcomm.c:1783 libpq/pqcomm.c:1858 libpq/pqcomm.c:1933 +#: libpq/pqcomm.c:1789 libpq/pqcomm.c:1864 libpq/pqcomm.c:1939 #, c-format msgid "%s(%s) not supported" msgstr "%s(%s) stöds inte" -#: libpq/pqformat.c:406 +#: libpq/pqformat.c:404 #, c-format msgid "no data left in message" msgstr "ingen data kvar i meddelandet" -#: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 -#: utils/adt/arrayfuncs.c:1482 utils/adt/rowtypes.c:588 +#: libpq/pqformat.c:515 libpq/pqformat.c:533 libpq/pqformat.c:554 +#: utils/adt/array_userfuncs.c:797 utils/adt/arrayfuncs.c:1481 +#: utils/adt/rowtypes.c:613 #, c-format msgid "insufficient data left in message" msgstr "otillräckligt med data kvar i meddelande" -#: libpq/pqformat.c:597 libpq/pqformat.c:626 +#: libpq/pqformat.c:595 libpq/pqformat.c:624 #, c-format msgid "invalid string in message" msgstr "ogiltig sträng i meddelande" -#: libpq/pqformat.c:642 +#: libpq/pqformat.c:640 #, c-format msgid "invalid message format" msgstr "ogiltigt meddelandeformat" -#: main/main.c:239 +#: main/main.c:236 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: WSAStartup misslyckades: %d\n" -#: main/main.c:350 +#: main/main.c:324 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -15710,7 +16504,7 @@ msgstr "" "%s är PostgreSQL-servern.\n" "\n" -#: main/main.c:351 +#: main/main.c:325 #, c-format msgid "" "Usage:\n" @@ -15721,107 +16515,107 @@ msgstr "" " %s [FLAGGA]...\n" "\n" -#: main/main.c:352 +#: main/main.c:326 #, c-format msgid "Options:\n" msgstr "Flaggor:\n" -#: main/main.c:353 +#: main/main.c:327 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS antalet delade buffertar\n" -#: main/main.c:354 +#: main/main.c:328 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NAMN=VÄRDE sätt körparameter\n" -#: main/main.c:355 +#: main/main.c:329 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C NAMN skriv ut värde av runtime-parameter, avsluta sen\n" -#: main/main.c:356 +#: main/main.c:330 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 debug-nivÃ¥\n" -#: main/main.c:357 +#: main/main.c:331 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D DATADIR databaskatalog\n" -#: main/main.c:358 +#: main/main.c:332 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e använd europeiskt datumformat för indata (DMY)\n" -#: main/main.c:359 +#: main/main.c:333 #, c-format msgid " -F turn fsync off\n" msgstr " -F slÃ¥ av fsync\n" -#: main/main.c:360 +#: main/main.c:334 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h VÄRDNAMN värdnamn eller IP-adress att lyssna pÃ¥\n" -#: main/main.c:361 +#: main/main.c:335 #, c-format -msgid " -i enable TCP/IP connections\n" -msgstr " -i tillÃ¥t TCP/IP-uppkopplingar\n" +msgid " -i enable TCP/IP connections (deprecated)\n" +msgstr " -i tillÃ¥t TCP/IP-uppkopplingar (obsolet)\n" -#: main/main.c:362 +#: main/main.c:336 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k KATALOG plats för unix-domän-uttag (socket)\n" -#: main/main.c:364 +#: main/main.c:338 #, c-format msgid " -l enable SSL connections\n" msgstr " -l tillÃ¥t SSL-anslutningar\n" -#: main/main.c:366 +#: main/main.c:340 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N MAX-ANSLUT maximalt antal tillÃ¥tna anslutningar\n" -#: main/main.c:367 +#: main/main.c:341 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT portnummer att lyssna pÃ¥\n" -#: main/main.c:368 +#: main/main.c:342 #, c-format msgid " -s show statistics after each query\n" msgstr " -s visa statistik efter varje frÃ¥ga\n" -#: main/main.c:369 +#: main/main.c:343 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S WORK-MEM ställ in mängden minne för sorteringar (i kB)\n" -#: main/main.c:370 +#: main/main.c:344 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: main/main.c:371 +#: main/main.c:345 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAMN=VÄRDE sätt parameter (som används under körning)\n" -#: main/main.c:372 +#: main/main.c:346 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config beskriv konfigurationsparametrar, avsluta sedan\n" -#: main/main.c:373 +#: main/main.c:347 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: main/main.c:375 +#: main/main.c:349 #, c-format msgid "" "\n" @@ -15830,42 +16624,37 @@ msgstr "" "\n" "Utvecklarflaggor:\n" -#: main/main.c:376 +#: main/main.c:350 #, c-format msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" msgstr " -f s|i|o|b|t|n|m|h förbjud användning av vissa plan-typer\n" -#: main/main.c:377 -#, c-format -msgid " -n do not reinitialize shared memory after abnormal exit\n" -msgstr " -n initiera inte delat minne pÃ¥ nytt efter onormal avstängning\n" - -#: main/main.c:378 +#: main/main.c:351 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O tillÃ¥t strukturändring av systemtabeller\n" -#: main/main.c:379 +#: main/main.c:352 #, c-format msgid " -P disable system indexes\n" msgstr " -P stäng av systemindex\n" -#: main/main.c:380 +#: main/main.c:353 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex visa tidtagning efter varje frÃ¥ga\n" -#: main/main.c:381 +#: main/main.c:354 #, c-format -msgid " -T send SIGSTOP to all backend processes if one dies\n" -msgstr " -T skicka SIGSTOP till alla serverprocesser om en dör\n" +msgid " -T send SIGABRT to all backend processes if one dies\n" +msgstr " -T skicka SIGABRT till alla serverprocesser om en dör\n" -#: main/main.c:382 +#: main/main.c:355 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr " -W NUM vänta NUM sekunder för att tillÃ¥ta att en debugger kopplas in\n" -#: main/main.c:384 +#: main/main.c:357 #, c-format msgid "" "\n" @@ -15874,37 +16663,37 @@ msgstr "" "\n" "Flaggor för enanvändarläge:\n" -#: main/main.c:385 +#: main/main.c:358 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr " --single väljer enanvändarläge (mÃ¥ste vara första argumentet)\n" -#: main/main.c:386 +#: main/main.c:359 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAMN databasnamn (standard är användarnamnet)\n" -#: main/main.c:387 +#: main/main.c:360 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 överskugga debug-nivÃ¥\n" -#: main/main.c:388 +#: main/main.c:361 #, c-format msgid " -E echo statement before execution\n" msgstr " -E skriv ut sats före körning\n" -#: main/main.c:389 +#: main/main.c:362 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr " -j använd inte nyrad som en interaktiv frÃ¥geavskiljare\n" -#: main/main.c:390 main/main.c:396 +#: main/main.c:363 main/main.c:369 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r FILNAMN skicka stdout och stderr till angiven fil\n" -#: main/main.c:392 +#: main/main.c:365 #, c-format msgid "" "\n" @@ -15913,22 +16702,22 @@ msgstr "" "\n" "Flaggor för bootstrap-läge:\n" -#: main/main.c:393 +#: main/main.c:366 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot väljer bootstrap-läge (mÃ¥ste vara första argumentet)\n" -#: main/main.c:394 +#: main/main.c:367 #, c-format msgid " --check selects check mode (must be first argument)\n" msgstr " --check väljer kontrolläge (mÃ¥ste vara första argumentet)\n" -#: main/main.c:395 +#: main/main.c:368 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr " DBNAMN databasnamn (krävs i bootstrap-läge)\n" -#: main/main.c:398 +#: main/main.c:371 #, c-format msgid "" "\n" @@ -15944,12 +16733,12 @@ msgstr "" "\n" "Rapportera buggar till <%s>.\n" -#: main/main.c:402 +#: main/main.c:375 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: main/main.c:413 +#: main/main.c:386 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -15962,12 +16751,12 @@ msgstr "" "ev. säkehetsproblem. Se dokumentationen för mer information om hur man\n" "startar servern pÃ¥ rätt sätt.\n" -#: main/main.c:430 +#: main/main.c:403 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: riktig och effektiv användar-ID mÃ¥ste matcha varandra\n" -#: main/main.c:437 +#: main/main.c:410 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -15992,15 +16781,15 @@ msgstr "utökningsbar nodtyp \"%s\" finns redan" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods \"%s\" har inte registerats" -#: nodes/makefuncs.c:150 statistics/extended_stats.c:2336 +#: nodes/makefuncs.c:152 statistics/extended_stats.c:2310 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "relationen \"%s\" har ingen composite-typ" -#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2567 -#: parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 -#: parser/parse_expr.c:2023 parser/parse_func.c:710 parser/parse_oper.c:883 -#: utils/fmgr/funcapi.c:670 +#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2604 +#: parser/parse_coerce.c:2742 parser/parse_coerce.c:2789 +#: parser/parse_expr.c:2112 parser/parse_func.c:710 parser/parse_oper.c:869 +#: utils/fmgr/funcapi.c:669 #, c-format msgid "could not find array type for data type %s" msgstr "kunde inte hitta array-typ för datatyp %s" @@ -16015,935 +16804,936 @@ msgstr "portal \"%s\" med parametrar: %s" msgid "unnamed portal with parameters: %s" msgstr "ej namngiven portal med parametrar: %s" -#: optimizer/path/joinrels.c:855 +#: optimizer/path/joinrels.c:972 #, c-format msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN stöds bara med villkor som är merge-joinbara eller hash-joinbara" -#: optimizer/plan/createplan.c:7101 parser/parse_merge.c:182 -#: parser/parse_merge.c:189 +#: optimizer/plan/createplan.c:7175 parser/parse_merge.c:203 +#: rewrite/rewriteHandler.c:1680 #, c-format msgid "cannot execute MERGE on relation \"%s\"" msgstr "kan inte utföra MERGE pÃ¥ relation \"%s\"" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1192 +#: optimizer/plan/initsplan.c:1407 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s kan inte appliceras pÃ¥ den nullbara sidan av en outer join" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1344 parser/analyze.c:1714 parser/analyze.c:1970 -#: parser/analyze.c:3152 +#: optimizer/plan/planner.c:1380 parser/analyze.c:1771 parser/analyze.c:2029 +#: parser/analyze.c:3247 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" -msgstr "%s tillåẗs inte med UNION/INTERSECT/EXCEPT" +msgstr "%s tillÃ¥ts inte med UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:2051 optimizer/plan/planner.c:3707 +#: optimizer/plan/planner.c:2121 optimizer/plan/planner.c:4108 #, c-format msgid "could not implement GROUP BY" msgstr "kunde inte implementera GROUP BY" -#: optimizer/plan/planner.c:2052 optimizer/plan/planner.c:3708 -#: optimizer/plan/planner.c:4351 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:2122 optimizer/plan/planner.c:4109 +#: optimizer/plan/planner.c:4790 optimizer/prep/prepunion.c:1320 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "NÃ¥gra av datatyperna stöder bara hash:ning medan andra bara stöder sortering." -#: optimizer/plan/planner.c:4350 +#: optimizer/plan/planner.c:4789 #, c-format msgid "could not implement DISTINCT" msgstr "kunde inte implementera DISTINCT" -#: optimizer/plan/planner.c:5471 +#: optimizer/plan/planner.c:6134 #, c-format msgid "could not implement window PARTITION BY" msgstr "kunde inte implementera fönster-PARTITION BY" -#: optimizer/plan/planner.c:5472 +#: optimizer/plan/planner.c:6135 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Fönsterpartitioneringskolumner mÃ¥sta ha en sorterbar datatyp." -#: optimizer/plan/planner.c:5476 +#: optimizer/plan/planner.c:6139 #, c-format msgid "could not implement window ORDER BY" msgstr "kunde inte implementera fönster-ORDER BY" -#: optimizer/plan/planner.c:5477 +#: optimizer/plan/planner.c:6140 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Fönsterordningskolumner mÃ¥ste ha en sorterbar datatyp." -#: optimizer/prep/prepunion.c:509 +#: optimizer/prep/prepunion.c:467 #, c-format msgid "could not implement recursive UNION" msgstr "kunde inte implementera rekursiv UNION" -#: optimizer/prep/prepunion.c:510 +#: optimizer/prep/prepunion.c:468 #, c-format msgid "All column datatypes must be hashable." msgstr "Alla kolumndatatyper mÃ¥sta vara hash-bara." #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1045 +#: optimizer/prep/prepunion.c:1319 #, c-format msgid "could not implement %s" msgstr "kunde inte implementera %s" -#: optimizer/util/clauses.c:4777 +#: optimizer/util/clauses.c:4963 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL-funktion \"%s\" vid inline:ing" -#: optimizer/util/plancat.c:142 -#, c-format -msgid "cannot open relation \"%s\"" -msgstr "kan inte öppna relationen \"%s\"" - -#: optimizer/util/plancat.c:151 +#: optimizer/util/plancat.c:153 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "kan inte accessa temporära eller ologgade relationer under Ã¥terställning" -#: optimizer/util/plancat.c:691 +#: optimizer/util/plancat.c:768 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "inferens av unikt index för hel rad stöds inte" -#: optimizer/util/plancat.c:708 +#: optimizer/util/plancat.c:785 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "villkor för ON CONFLICT-klausul har inget associerat index" -#: optimizer/util/plancat.c:758 +#: optimizer/util/plancat.c:835 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE stöds inte med uteslutningsvillkor" -#: optimizer/util/plancat.c:863 +#: optimizer/util/plancat.c:945 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "finns inget unik eller uteslutningsvillkor som matchar ON CONFLICT-specifikationen" -#: parser/analyze.c:780 parser/analyze.c:1494 +#: parser/analyze.c:824 parser/analyze.c:1550 #, c-format msgid "VALUES lists must all be the same length" msgstr "VÄRDE-listor mÃ¥ste alla ha samma längd" -#: parser/analyze.c:981 +#: parser/analyze.c:1027 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT har fler uttryck än mÃ¥lkolumner" -#: parser/analyze.c:999 +#: parser/analyze.c:1045 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT har fler mÃ¥lkolumner än uttryck" -#: parser/analyze.c:1003 +#: parser/analyze.c:1049 #, c-format msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" msgstr "Imatningskällan är ett raduttryck som innehÃ¥ller samma antal kolumner som INSERT:en förväntade sig. Glömde du använda extra parenteser?" -#: parser/analyze.c:1302 parser/analyze.c:1687 +#: parser/analyze.c:1357 parser/analyze.c:1744 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO tillÃ¥ts inte här" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1617 parser/analyze.c:3363 +#: parser/analyze.c:1673 parser/analyze.c:3479 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s kan inte appliceras pÃ¥ VÄRDEN" -#: parser/analyze.c:1853 +#: parser/analyze.c:1911 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "ogiltig UNION/INTERSECT/EXCEPT ORDER BY-klausul" -#: parser/analyze.c:1854 +#: parser/analyze.c:1912 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "Bara kolumnnamn i resultatet kan användas, inte uttryck eller funktioner." -#: parser/analyze.c:1855 +#: parser/analyze.c:1913 #, c-format msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." msgstr "Lägg till uttrycket/funktionen till varje SELECT eller flytta UNION:en in i en FROM-klausul." -#: parser/analyze.c:1960 +#: parser/analyze.c:2019 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO tillÃ¥ts bara i den första SELECT i UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:2032 +#: parser/analyze.c:2091 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "UNION/INTERSECT/EXCEPT-medlemssats kan inte referera till andra relationer pÃ¥ samma frÃ¥genivÃ¥" -#: parser/analyze.c:2119 +#: parser/analyze.c:2178 #, c-format msgid "each %s query must have the same number of columns" msgstr "varje %s-frÃ¥ga mÃ¥ste ha samma antal kolumner" -#: parser/analyze.c:2523 +#: parser/analyze.c:2535 +#, c-format +msgid "SET target columns cannot be qualified with the relation name." +msgstr "mÃ¥lkolumner för SET kan inte kvalifiiceras med ett relationsnamn." + +#: parser/analyze.c:2589 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNING mÃ¥ste ha minst en kolumn" -#: parser/analyze.c:2626 +#: parser/analyze.c:2692 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" msgstr[0] "tilldelningskälla returnerade %d kolumn" msgstr[1] "tilldelningskälla returnerade %d kolumner" -#: parser/analyze.c:2687 +#: parser/analyze.c:2753 #, c-format msgid "variable \"%s\" is of type %s but expression is of type %s" msgstr "variabeln \"%s\" har typ %s men uttrycket har typ %s" #. translator: %s is a SQL keyword -#: parser/analyze.c:2811 parser/analyze.c:2819 +#: parser/analyze.c:2878 parser/analyze.c:2886 #, c-format msgid "cannot specify both %s and %s" msgstr "kan inte ange bÃ¥de %s och %s" -#: parser/analyze.c:2839 +#: parser/analyze.c:2906 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR fÃ¥r inte innehÃ¥lla datamodifierande satser i WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2847 +#: parser/analyze.c:2914 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s stöds inte" -#: parser/analyze.c:2850 +#: parser/analyze.c:2917 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "HÃ¥llbara markörer mÃ¥ste vara READ ONLY." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2858 +#: parser/analyze.c:2925 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s stöds inte" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2869 +#: parser/analyze.c:2936 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s är inte giltig" -#: parser/analyze.c:2872 +#: parser/analyze.c:2939 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Okänsliga markörer mÃ¥ste vara READ ONLY." -#: parser/analyze.c:2938 +#: parser/analyze.c:3033 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "materialiserade vyer fÃ¥r inte innehÃ¥lla datamodifierande satser i WITH" -#: parser/analyze.c:2948 +#: parser/analyze.c:3043 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "materialiserade vyer fÃ¥r inte använda temporära tabeller eller vyer" -#: parser/analyze.c:2958 +#: parser/analyze.c:3053 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "materialiserade vyer kan inte defineras med bundna parametrar" -#: parser/analyze.c:2970 +#: parser/analyze.c:3065 #, c-format msgid "materialized views cannot be unlogged" msgstr "materialiserad vyer kan inte vara ologgade" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3159 +#: parser/analyze.c:3254 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s tillÃ¥ts inte med DISTINCT-klausul" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3166 +#: parser/analyze.c:3261 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s tillÃ¥ts inte med GROUP BY-klausul" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3173 +#: parser/analyze.c:3268 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s tillÃ¥ts inte med HAVING-klausul" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3180 +#: parser/analyze.c:3275 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s tillÃ¥ts inte med aggregatfunktioner" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3187 +#: parser/analyze.c:3282 #, c-format msgid "%s is not allowed with window functions" msgstr "%s tillÃ¥ts inte med fönsterfunktioner" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3194 +#: parser/analyze.c:3289 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "%s tillÃ¥ts inte med mängdreturnerande funktioner i mÃ¥llistan" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3286 +#: parser/analyze.c:3388 #, c-format msgid "%s must specify unqualified relation names" msgstr "%s: mÃ¥ste ange okvalificerade relationsnamn" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3336 +#: parser/analyze.c:3452 #, c-format msgid "%s cannot be applied to a join" msgstr "%s kan inte appliceras pÃ¥ en join" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3345 +#: parser/analyze.c:3461 #, c-format msgid "%s cannot be applied to a function" msgstr "%s kan inte appliceras pÃ¥ en funktion" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3354 +#: parser/analyze.c:3470 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s kan inte appliceras pÃ¥ tabellfunktion" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3372 +#: parser/analyze.c:3488 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s kan inte appliceras pÃ¥ en WITH-frÃ¥ga" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3381 +#: parser/analyze.c:3497 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s kan inte appliceras pÃ¥ en namngiven tupellagring" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3401 +#: parser/analyze.c:3517 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "relationen \"%s\" i %s-klausul hittades inte i FROM-klausul" -#: parser/parse_agg.c:220 parser/parse_oper.c:227 +#: parser/parse_agg.c:210 parser/parse_oper.c:215 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "kunde inte identifiera en jämförelseoperator för typ %s" -#: parser/parse_agg.c:222 +#: parser/parse_agg.c:212 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "Aggregat med DISTINCT mÃ¥ste kunna sortera sina indata." -#: parser/parse_agg.c:257 +#: parser/parse_agg.c:270 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "GROUPING mÃ¥ste ha färre än 32 argument" -#: parser/parse_agg.c:360 +#: parser/parse_agg.c:373 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "aggregatfunktioner tillÃ¥ts inte i JOIN-villkor" -#: parser/parse_agg.c:362 +#: parser/parse_agg.c:375 msgid "grouping operations are not allowed in JOIN conditions" msgstr "gruppoperationer tillÃ¥ts inte i JOIN-villkor" -#: parser/parse_agg.c:374 +#: parser/parse_agg.c:385 msgid "aggregate functions are not allowed in FROM clause of their own query level" msgstr "aggregatfunktioner tillÃ¥ts inte i FROM-klausul pÃ¥ sin egen frÃ¥genivÃ¥" -#: parser/parse_agg.c:376 +#: parser/parse_agg.c:387 msgid "grouping operations are not allowed in FROM clause of their own query level" msgstr "gruppoperationer tillÃ¥ts inte i FROM-klausul pÃ¥ sin egen frÃ¥genivÃ¥" -#: parser/parse_agg.c:381 +#: parser/parse_agg.c:392 msgid "aggregate functions are not allowed in functions in FROM" msgstr "aggregatfunktioner tillÃ¥ts inte i funktioner i FROM" -#: parser/parse_agg.c:383 +#: parser/parse_agg.c:394 msgid "grouping operations are not allowed in functions in FROM" msgstr "gruppoperationer tillÃ¥ts inte i funktioner i FROM" -#: parser/parse_agg.c:391 +#: parser/parse_agg.c:402 msgid "aggregate functions are not allowed in policy expressions" msgstr "aggregatfunktioner tillÃ¥ts inte i policyuttryck" -#: parser/parse_agg.c:393 +#: parser/parse_agg.c:404 msgid "grouping operations are not allowed in policy expressions" msgstr "gruppoperationer tillÃ¥ts inte i policyuttryck" -#: parser/parse_agg.c:410 +#: parser/parse_agg.c:421 msgid "aggregate functions are not allowed in window RANGE" msgstr "aggregatfunktioner tillÃ¥ts inte i fönster-RANGE" -#: parser/parse_agg.c:412 +#: parser/parse_agg.c:423 msgid "grouping operations are not allowed in window RANGE" msgstr "grupperingsoperationer tillÃ¥ts inte i fönster-RANGE" -#: parser/parse_agg.c:417 +#: parser/parse_agg.c:428 msgid "aggregate functions are not allowed in window ROWS" msgstr "aggregatfunktioner tillÃ¥ts inte i fönster-RADER" -#: parser/parse_agg.c:419 +#: parser/parse_agg.c:430 msgid "grouping operations are not allowed in window ROWS" msgstr "grupperingsfunktioner tillÃ¥ts inte i fönster-RADER" -#: parser/parse_agg.c:424 +#: parser/parse_agg.c:435 msgid "aggregate functions are not allowed in window GROUPS" msgstr "aggregatfunktioner tillÃ¥ts inte i fönster-GROUPS" -#: parser/parse_agg.c:426 +#: parser/parse_agg.c:437 msgid "grouping operations are not allowed in window GROUPS" msgstr "grupperingsfunktioner tillÃ¥ts inte i fönster-GROUPS" -#: parser/parse_agg.c:439 +#: parser/parse_agg.c:450 msgid "aggregate functions are not allowed in MERGE WHEN conditions" msgstr "aggregatfunktioner tillÃ¥ts inte i MERGE WHEN-villkor" -#: parser/parse_agg.c:441 +#: parser/parse_agg.c:452 msgid "grouping operations are not allowed in MERGE WHEN conditions" msgstr "gruppoperationer tillÃ¥ts inte i MERGE WHEN-villkor" -#: parser/parse_agg.c:467 +#: parser/parse_agg.c:479 msgid "aggregate functions are not allowed in check constraints" msgstr "aggregatfunktioner tillÃ¥ts inte i check-villkor" -#: parser/parse_agg.c:469 +#: parser/parse_agg.c:481 msgid "grouping operations are not allowed in check constraints" msgstr "gruppoperationer tillÃ¥ts inte i check-villkor" -#: parser/parse_agg.c:476 +#: parser/parse_agg.c:488 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "aggregatfunktioner tillÃ¥ts inte i DEFAULT-uttryck" -#: parser/parse_agg.c:478 +#: parser/parse_agg.c:490 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "grupperingsoperationer tillÃ¥ts inte i DEFAULT-uttryck" -#: parser/parse_agg.c:483 +#: parser/parse_agg.c:495 msgid "aggregate functions are not allowed in index expressions" msgstr "aggregatfunktioner tillÃ¥ts inte i indexuttryck" -#: parser/parse_agg.c:485 +#: parser/parse_agg.c:497 msgid "grouping operations are not allowed in index expressions" msgstr "gruppoperationer tillÃ¥ts inte i indexuttryck" -#: parser/parse_agg.c:490 +#: parser/parse_agg.c:502 msgid "aggregate functions are not allowed in index predicates" msgstr "aggregatfunktionsanrop tillÃ¥ts inte i indexpredikat" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:504 msgid "grouping operations are not allowed in index predicates" msgstr "gruppoperationer tillÃ¥ts inte i indexpredikat" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:509 msgid "aggregate functions are not allowed in statistics expressions" msgstr "aggregatfunktioner tillÃ¥ts inte i statistikuttryck" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:511 msgid "grouping operations are not allowed in statistics expressions" msgstr "gruppoperationer tillÃ¥ts inte i statistikuttryck" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:516 msgid "aggregate functions are not allowed in transform expressions" msgstr "aggregatfunktioner tillÃ¥ts inte i transform-uttryck" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:518 msgid "grouping operations are not allowed in transform expressions" msgstr "gruppoperationer tillÃ¥ts inte i transforme-uttryck" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:523 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "aggregatfunktioner tillÃ¥ts inte i EXECUTE-parametrar" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:525 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "gruppoperationer tillÃ¥ts inte i EXECUTE-parametrar" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:530 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "aggregatfunktioner tillÃ¥ts inte i WHEN-villkor" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:532 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "gruppoperationer tillÃ¥ts inte i WHEN-villkor" -#: parser/parse_agg.c:525 +#: parser/parse_agg.c:537 msgid "aggregate functions are not allowed in partition bound" msgstr "aggregatfunktioner tillÃ¥ts inte i partitionsgräns" -#: parser/parse_agg.c:527 +#: parser/parse_agg.c:539 msgid "grouping operations are not allowed in partition bound" msgstr "gruppoperationer tillÃ¥ts inte i partitionsgräns" -#: parser/parse_agg.c:532 +#: parser/parse_agg.c:544 msgid "aggregate functions are not allowed in partition key expressions" msgstr "aggregatfunktioner tillÃ¥ts inte i partitionsnyckeluttryck" -#: parser/parse_agg.c:534 +#: parser/parse_agg.c:546 msgid "grouping operations are not allowed in partition key expressions" msgstr "gruppoperationer tillÃ¥ts inte i partitionsnyckeluttryck" -#: parser/parse_agg.c:540 +#: parser/parse_agg.c:552 msgid "aggregate functions are not allowed in column generation expressions" msgstr "aggregatfunktioner tillÃ¥ts inte i kolumngenereringsuttryck" -#: parser/parse_agg.c:542 +#: parser/parse_agg.c:554 msgid "grouping operations are not allowed in column generation expressions" msgstr "gruppoperationer tillÃ¥ts inte i kolumngenereringsuttryck" -#: parser/parse_agg.c:548 +#: parser/parse_agg.c:560 msgid "aggregate functions are not allowed in CALL arguments" msgstr "aggregatfunktioner tillÃ¥ts inte i CALL-argument" -#: parser/parse_agg.c:550 +#: parser/parse_agg.c:562 msgid "grouping operations are not allowed in CALL arguments" msgstr "gruppoperationer tillÃ¥ts inte i CALL-argument" -#: parser/parse_agg.c:556 +#: parser/parse_agg.c:568 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "aggregatfunktioner tillÃ¥ts inte i COPY FROM WHERE-villkor" -#: parser/parse_agg.c:558 +#: parser/parse_agg.c:570 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "gruppoperationer tillÃ¥ts inte i COPY FROM WHERE-villkor" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:585 parser/parse_clause.c:1836 +#: parser/parse_agg.c:597 parser/parse_clause.c:1962 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "aggregatfunktioner tillÃ¥ts inte i %s" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:588 +#: parser/parse_agg.c:600 #, c-format msgid "grouping operations are not allowed in %s" msgstr "gruppoperationer tillÃ¥ts inte i %s" -#: parser/parse_agg.c:689 +#: parser/parse_agg.c:701 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "yttre aggregat kan inte innehÃ¥lla inre variabel i sitt direkta argument" -#: parser/parse_agg.c:768 +#: parser/parse_agg.c:779 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "aggregatfunktionsanrop kan inte innehÃ¥lla mängdreturnerande funktionsanrop" -#: parser/parse_agg.c:769 parser/parse_expr.c:1674 parser/parse_expr.c:2156 -#: parser/parse_func.c:883 +#: parser/parse_agg.c:780 parser/parse_expr.c:1762 parser/parse_expr.c:2245 +#: parser/parse_func.c:885 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." msgstr "Du kanske kan flytta den mängdreturnerande funktionen in i en LATERAL FROM-konstruktion." -#: parser/parse_agg.c:774 +#: parser/parse_agg.c:785 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "aggregatfunktionsanrop kan inte innehÃ¥lla fönsterfunktionanrop" -#: parser/parse_agg.c:853 +#: parser/parse_agg.c:864 msgid "window functions are not allowed in JOIN conditions" msgstr "fönsterfunktioner tillÃ¥ts inte i JOIN-villkor" -#: parser/parse_agg.c:860 +#: parser/parse_agg.c:871 msgid "window functions are not allowed in functions in FROM" msgstr "fönsterfunktioner tillÃ¥ts inte i funktioner i FROM" -#: parser/parse_agg.c:866 +#: parser/parse_agg.c:877 msgid "window functions are not allowed in policy expressions" msgstr "fönsterfunktioner tillÃ¥ts inte i policy-uttryck" -#: parser/parse_agg.c:879 +#: parser/parse_agg.c:890 msgid "window functions are not allowed in window definitions" msgstr "fönsterfunktioner tillÃ¥ts inte i fönsterdefinitioner" -#: parser/parse_agg.c:890 +#: parser/parse_agg.c:901 msgid "window functions are not allowed in MERGE WHEN conditions" msgstr "fönsterfunktioner tillÃ¥ts inte i MERGE WHEN-villkor" -#: parser/parse_agg.c:914 +#: parser/parse_agg.c:926 msgid "window functions are not allowed in check constraints" msgstr "fönsterfunktioner tillÃ¥ts inte i check-villkor" -#: parser/parse_agg.c:918 +#: parser/parse_agg.c:930 msgid "window functions are not allowed in DEFAULT expressions" msgstr "fönsterfunktioner tillÃ¥ts inte i DEFAULT-uttryck" -#: parser/parse_agg.c:921 +#: parser/parse_agg.c:933 msgid "window functions are not allowed in index expressions" msgstr "fönsterfunktioner tillÃ¥ts inte i indexuttryck" -#: parser/parse_agg.c:924 +#: parser/parse_agg.c:936 msgid "window functions are not allowed in statistics expressions" msgstr "fönsterfunktioner tillÃ¥ts inte i statistikuttryck" -#: parser/parse_agg.c:927 +#: parser/parse_agg.c:939 msgid "window functions are not allowed in index predicates" msgstr "fönsterfunktioner tillÃ¥ts inte i indexpredikat" -#: parser/parse_agg.c:930 +#: parser/parse_agg.c:942 msgid "window functions are not allowed in transform expressions" msgstr "fönsterfunktioner tillÃ¥ts inte i transform-uttrycket" -#: parser/parse_agg.c:933 +#: parser/parse_agg.c:945 msgid "window functions are not allowed in EXECUTE parameters" msgstr "fönsterfunktioner tillÃ¥ts inte i EXECUTE-parametrar" -#: parser/parse_agg.c:936 +#: parser/parse_agg.c:948 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "fönsterfunktioner tillÃ¥ts inte i WHEN-villkor" -#: parser/parse_agg.c:939 +#: parser/parse_agg.c:951 msgid "window functions are not allowed in partition bound" msgstr "fönsterfunktioner tillÃ¥ts inte i partitiongräns" -#: parser/parse_agg.c:942 +#: parser/parse_agg.c:954 msgid "window functions are not allowed in partition key expressions" msgstr "fönsterfunktioner tillÃ¥ts inte i partitionsnyckeluttryck" -#: parser/parse_agg.c:945 +#: parser/parse_agg.c:957 msgid "window functions are not allowed in CALL arguments" msgstr "fönsterfunktioner tillÃ¥ts inte i CALL-argument" -#: parser/parse_agg.c:948 +#: parser/parse_agg.c:960 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "fönsterfunktioner tillÃ¥ts inte i COPY FROM WHERE-villkor" -#: parser/parse_agg.c:951 +#: parser/parse_agg.c:963 msgid "window functions are not allowed in column generation expressions" msgstr "fönsterfunktioner tillÃ¥ts inte i kolumngenereringsuttryck" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:974 parser/parse_clause.c:1845 +#: parser/parse_agg.c:986 parser/parse_clause.c:1971 #, c-format msgid "window functions are not allowed in %s" msgstr "fönsterfunktioner tillÃ¥ts inte i %s" -#: parser/parse_agg.c:1008 parser/parse_clause.c:2678 +#: parser/parse_agg.c:1020 parser/parse_clause.c:2804 #, c-format msgid "window \"%s\" does not exist" msgstr "fönster \"%s\" finns inte" -#: parser/parse_agg.c:1092 +#: parser/parse_agg.c:1108 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "för mÃ¥nga grupperingsmängder (maximalt 4096)" -#: parser/parse_agg.c:1232 +#: parser/parse_agg.c:1248 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "aggregatfunktioner tillÃ¥ts inte i en rekursiv frÃ¥gas rekursiva term" -#: parser/parse_agg.c:1425 +#: parser/parse_agg.c:1441 #, c-format msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" msgstr "kolumn \"%s.%s\" mÃ¥ste stÃ¥ med i GROUP BY-klausulen eller användas i en aggregatfunktion" -#: parser/parse_agg.c:1428 +#: parser/parse_agg.c:1444 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "Direkta argument till en sorterad-mängd-aggregat fÃ¥r bara använda grupperade kolumner." -#: parser/parse_agg.c:1433 +#: parser/parse_agg.c:1449 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "underfrÃ¥ga använder ogrupperad kolumn \"%s.%s\" frÃ¥n yttre frÃ¥ga" -#: parser/parse_agg.c:1597 +#: parser/parse_agg.c:1613 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "argument till GROUPING mÃ¥ste vare grupputtryck pÃ¥ den tillhörande frÃ¥genivÃ¥n" -#: parser/parse_clause.c:192 +#: parser/parse_clause.c:193 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "relationen \"%s\" kan inte vara mÃ¥let för en modifierande sats" -#: parser/parse_clause.c:572 parser/parse_clause.c:600 parser/parse_func.c:2554 +#: parser/parse_clause.c:569 parser/parse_clause.c:597 parser/parse_func.c:2553 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "mängdreturnerande funktioner mÃ¥ste vara pÃ¥ toppnivÃ¥ i FROM" -#: parser/parse_clause.c:612 +#: parser/parse_clause.c:609 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "multipla kolumndefinitionslistor tillÃ¥ts inte i samma funktion" -#: parser/parse_clause.c:645 +#: parser/parse_clause.c:642 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "ROWS FROM() med multipla funktioner kan inte ha en kolumndefinitionslista" -#: parser/parse_clause.c:646 +#: parser/parse_clause.c:643 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "Lägg till en separat kolumndefinitionslista för varje funktion inne i ROWS FROM()." -#: parser/parse_clause.c:652 +#: parser/parse_clause.c:649 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "UNNEST() med multipla argument kan inte ha en kolumndefinitionslista" -#: parser/parse_clause.c:653 +#: parser/parse_clause.c:650 #, c-format msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." msgstr "Använd separata UNNEST()-anrop inne i ROWS FROM() och koppla en kolumndefinitionslista till varje." -#: parser/parse_clause.c:660 +#: parser/parse_clause.c:657 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY kan inte användas tillsammans med en kolumndefinitionslista" -#: parser/parse_clause.c:661 +#: parser/parse_clause.c:658 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "Placera kolumndefinitionslistan inne i ROWS FROM()." -#: parser/parse_clause.c:761 +#: parser/parse_clause.c:762 parser/parse_jsontable.c:295 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "bara en FOR ORDINALITY-kolumn tillÃ¥ts" -#: parser/parse_clause.c:822 +#: parser/parse_clause.c:823 #, c-format msgid "column name \"%s\" is not unique" msgstr "kolumnnamn \"%s\" är inte unikt" -#: parser/parse_clause.c:864 +#: parser/parse_clause.c:865 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "namespace-namn \"%s\" är inte unikt" -#: parser/parse_clause.c:874 +#: parser/parse_clause.c:875 #, c-format msgid "only one default namespace is allowed" msgstr "bara ett standard-namespace tillÃ¥ts" -#: parser/parse_clause.c:934 +#: parser/parse_clause.c:935 #, c-format msgid "tablesample method %s does not exist" msgstr "tabellsamplingsmetod \"%s\" existerar inte" -#: parser/parse_clause.c:956 +#: parser/parse_clause.c:957 #, c-format msgid "tablesample method %s requires %d argument, not %d" msgid_plural "tablesample method %s requires %d arguments, not %d" msgstr[0] "tabellsamplingsmetod %s kräver %d argument, inte %d" msgstr[1] "tabellsamplingsmetod %s kräver %d argument, inte %d" -#: parser/parse_clause.c:990 +#: parser/parse_clause.c:991 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "tabellsamplingsmetod %s stöder inte REPEATABLE" -#: parser/parse_clause.c:1139 +#: parser/parse_clause.c:1144 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "TABLESAMPLE-klausul kan bara appliceras pÃ¥ tabeller och materialiserade vyer" -#: parser/parse_clause.c:1329 +#: parser/parse_clause.c:1331 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "kolumnnamn \"%s\" angivet mer än en gÃ¥ng i USING-klausul" -#: parser/parse_clause.c:1344 +#: parser/parse_clause.c:1346 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "gemensamt kolumnnamn \"%s\" finns mer än en gÃ¥ng i vänstra tabellen" -#: parser/parse_clause.c:1353 +#: parser/parse_clause.c:1355 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "kolumn \"%s\" angiven i USING-klausul finns inte i den vänstra tabellen" -#: parser/parse_clause.c:1368 +#: parser/parse_clause.c:1370 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "gemensamt kolumnnamn \"%s\" finns mer än en gÃ¥ng i högra tabellen" -#: parser/parse_clause.c:1377 +#: parser/parse_clause.c:1379 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "kolumn \"%s\" angiven i USING-klausul finns inte i den högra tabellen" -#: parser/parse_clause.c:1781 +#: parser/parse_clause.c:1907 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" msgstr "radantal kan inte vara null i FETCH FIRST ... WITH TIES-klausul" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1806 +#: parser/parse_clause.c:1932 #, c-format msgid "argument of %s must not contain variables" msgstr "argumentet till %s fÃ¥r inte innehÃ¥lla variabler" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1971 +#: parser/parse_clause.c:2097 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "%s \"%s\" är tvetydig" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1999 +#: parser/parse_clause.c:2125 #, c-format msgid "non-integer constant in %s" msgstr "ej heltalskonstant i %s" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2021 +#: parser/parse_clause.c:2147 #, c-format msgid "%s position %d is not in select list" msgstr "%s-position %d finns inte i select-listan" -#: parser/parse_clause.c:2460 +#: parser/parse_clause.c:2586 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE är begränsad till 12 element" -#: parser/parse_clause.c:2666 +#: parser/parse_clause.c:2792 #, c-format msgid "window \"%s\" is already defined" msgstr "fönster \"%s\" är redan definierad" -#: parser/parse_clause.c:2727 +#: parser/parse_clause.c:2853 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "kan inte övertrumfa PARTITION BY-klausul för fönster \"%s\"" -#: parser/parse_clause.c:2739 +#: parser/parse_clause.c:2865 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "kan inte övertrumfa ORDER BY-klausul för fönster \"%s\"" -#: parser/parse_clause.c:2769 parser/parse_clause.c:2775 +#: parser/parse_clause.c:2895 parser/parse_clause.c:2901 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "kan inte kopiera fönster \"%s\" dÃ¥ det har en fönsterramklausul" -#: parser/parse_clause.c:2777 +#: parser/parse_clause.c:2903 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "Ta bort parenteserna i denna OVER-klausul." -#: parser/parse_clause.c:2797 +#: parser/parse_clause.c:2923 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "RANGE med offset PRECEDING/FOLLOWING kräver exakt en ORDER BY-kolumn" -#: parser/parse_clause.c:2820 +#: parser/parse_clause.c:2946 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "GROUPS-läge kräver en ORDER BY-klausul" -#: parser/parse_clause.c:2891 +#: parser/parse_clause.c:3016 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "i ett aggregat med DISTINCT sÃ¥ mÃ¥ste ORDER BY-uttryck finnas i argumentlistan" -#: parser/parse_clause.c:2892 +#: parser/parse_clause.c:3017 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "i SELECT DISTINCT sÃ¥ mÃ¥ste ORDER BY-uttryck finnas i select-listan" -#: parser/parse_clause.c:2924 +#: parser/parse_clause.c:3049 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "ett aggregat med DISTINCT mÃ¥ste ha minst ett argument" -#: parser/parse_clause.c:2925 +#: parser/parse_clause.c:3050 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT mÃ¥ste ha minst en kolumn" -#: parser/parse_clause.c:2991 parser/parse_clause.c:3023 +#: parser/parse_clause.c:3116 parser/parse_clause.c:3148 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "SELECT DISTINCT ON-uttrycken mÃ¥ste matcha de initiala ORDER BY-uttrycken" -#: parser/parse_clause.c:3101 +#: parser/parse_clause.c:3226 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC tillÃ¥ts inte i ON CONFLICT-klausul" -#: parser/parse_clause.c:3107 +#: parser/parse_clause.c:3232 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST tillÃ¥ts inte i ON CONFLICT-klausul" -#: parser/parse_clause.c:3186 +#: parser/parse_clause.c:3311 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE kräver inferensangivelse eller villkorsnamn" -#: parser/parse_clause.c:3187 +#: parser/parse_clause.c:3312 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Till exempel, ON CONFLICT (kolumnnamn)." -#: parser/parse_clause.c:3198 +#: parser/parse_clause.c:3323 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT stöds inte för systemkatalogtabeller" -#: parser/parse_clause.c:3206 +#: parser/parse_clause.c:3331 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT stöds inte pÃ¥ tabell \"%s\" som används som katalogtabell" -#: parser/parse_clause.c:3336 +#: parser/parse_clause.c:3462 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "operator %s är inte en giltig sorteringsoperator" -#: parser/parse_clause.c:3338 +#: parser/parse_clause.c:3464 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "Sorteringsoperationer mÃ¥ste vara \"<\"- eller \">\"-medlemmar i btree-operatorfamiljer." -#: parser/parse_clause.c:3649 +#: parser/parse_clause.c:3775 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "RANGE med offset PRECEDING/FOLLOWING stöds inte för kolumntyp %s" -#: parser/parse_clause.c:3655 +#: parser/parse_clause.c:3781 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" msgstr "RANGE med offset PRECEDING/FOLLOWING stöd inte av kolumntyp %s och offset-typ %s" -#: parser/parse_clause.c:3658 +#: parser/parse_clause.c:3784 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Typomvandla offset-värdet till lämplig typ." -#: parser/parse_clause.c:3663 +#: parser/parse_clause.c:3789 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" msgstr "RANGE med offset PRECEDING/FOLLOWING har multipla tolkingar för kolumntyp %s och offset-typ %s" -#: parser/parse_clause.c:3666 +#: parser/parse_clause.c:3792 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "Typomvandla offset-värdet till exakt den önskade typen." #: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 #: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 -#: parser/parse_expr.c:2057 parser/parse_expr.c:2659 parser/parse_target.c:994 +#: parser/parse_expr.c:2146 parser/parse_expr.c:2754 parser/parse_expr.c:3405 +#: parser/parse_expr.c:3634 parser/parse_target.c:998 #, c-format msgid "cannot cast type %s to %s" msgstr "kan inte omvandla typ %s till %s" @@ -16978,121 +17768,121 @@ msgid "argument of %s must not return a set" msgstr "argumentet till %s fÃ¥r inte returnera en mängd" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1383 +#: parser/parse_coerce.c:1420 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "%s typer %s och %s matchar inte" -#: parser/parse_coerce.c:1499 +#: parser/parse_coerce.c:1536 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "argumenttyperna %s och %s matchar inte" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1551 +#: parser/parse_coerce.c:1588 #, c-format msgid "%s could not convert type %s to %s" msgstr "%s kan inte konvertera typ %s till %s" -#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 -#: parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 -#: parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 +#: parser/parse_coerce.c:2191 parser/parse_coerce.c:2211 +#: parser/parse_coerce.c:2231 parser/parse_coerce.c:2252 +#: parser/parse_coerce.c:2307 parser/parse_coerce.c:2341 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "argument deklarerade \"%s\" är inte alla likadana" -#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 -#: utils/fmgr/funcapi.c:601 +#: parser/parse_coerce.c:2286 parser/parse_coerce.c:2399 +#: utils/fmgr/funcapi.c:600 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "argumentet deklarerad %s är inte en array utan typ %s" -#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 -#: utils/fmgr/funcapi.c:615 +#: parser/parse_coerce.c:2319 parser/parse_coerce.c:2469 +#: utils/fmgr/funcapi.c:614 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "argumentet deklarerad %s är inte en intervalltyp utan typ %s" -#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 -#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:633 utils/fmgr/funcapi.c:698 +#: parser/parse_coerce.c:2353 parser/parse_coerce.c:2433 +#: parser/parse_coerce.c:2566 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "argumentet deklarerad %s är inte en multirange-typ utan typ %s" -#: parser/parse_coerce.c:2353 +#: parser/parse_coerce.c:2390 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "kan inte bestämma elementtypen av \"anyarray\"-argument" -#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 -#: parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 +#: parser/parse_coerce.c:2416 parser/parse_coerce.c:2447 +#: parser/parse_coerce.c:2486 parser/parse_coerce.c:2552 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "argument deklarerad %s är inte konsistent med argument deklarerad %s" -#: parser/parse_coerce.c:2474 +#: parser/parse_coerce.c:2511 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "kunde inte bestämma en polymorf typ dÃ¥ indata har typ %s" -#: parser/parse_coerce.c:2488 +#: parser/parse_coerce.c:2525 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "typen som matchar anynonarray är en array-typ: %s" -#: parser/parse_coerce.c:2498 +#: parser/parse_coerce.c:2535 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "typen som matchar anyenum är inte en enum-typ: %s" -#: parser/parse_coerce.c:2559 +#: parser/parse_coerce.c:2596 #, c-format msgid "arguments of anycompatible family cannot be cast to a common type" msgstr "argument till en anycompatible-familj kan inte typomvandlas till en vanlig typ" -#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 -#: parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 -#: parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 +#: parser/parse_coerce.c:2614 parser/parse_coerce.c:2635 +#: parser/parse_coerce.c:2685 parser/parse_coerce.c:2690 +#: parser/parse_coerce.c:2754 parser/parse_coerce.c:2766 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "kunde inte bestämma en polymorf typ %s dÃ¥ indata har typ %s" -#: parser/parse_coerce.c:2587 +#: parser/parse_coerce.c:2624 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" msgstr "anycompatiblerange-typ %s matchar inte anycompatiblerange-typ %s" -#: parser/parse_coerce.c:2608 +#: parser/parse_coerce.c:2645 #, c-format msgid "anycompatiblemultirange type %s does not match anycompatible type %s" msgstr "anycompatiblemultirange-typ %s matchar inte anycompatible-typ %s" -#: parser/parse_coerce.c:2622 +#: parser/parse_coerce.c:2659 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "typen som matchar anycompatiblenonarray är en array-typ: %s" -#: parser/parse_coerce.c:2857 +#: parser/parse_coerce.c:2894 #, c-format msgid "A result of type %s requires at least one input of type anyrange or anymultirange." msgstr "Ett resultat av typen %s kräver minst en indata med typen anyrange eller anymultirange." -#: parser/parse_coerce.c:2874 +#: parser/parse_coerce.c:2911 #, c-format msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." msgstr "Ett resultat av typ %s kräver minst en indata av typen anycompatiblerange eller anycompatiblemultirange." -#: parser/parse_coerce.c:2886 +#: parser/parse_coerce.c:2923 #, c-format msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." msgstr "Ett resultat av typ %s kräver minst en indata av typen anyelement, anyarray, anynonarray, anyenum, anyrange eller anymultirange." -#: parser/parse_coerce.c:2898 +#: parser/parse_coerce.c:2935 #, c-format msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." msgstr "Ett resultat av typ %s kräver minst en indata av typ anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange eller anycompatiblemultirange." -#: parser/parse_coerce.c:2928 +#: parser/parse_coerce.c:2965 msgid "A result of type internal requires at least one input of type internal." msgstr "Ett resultat av typ internal kräver minst en indata av typ internal." @@ -17138,380 +17928,551 @@ msgstr "rekursiv referens till frÃ¥ga \"%s\" fÃ¥r inte finnas i en INTERSECT" msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "rekursiv referens till frÃ¥ga \"%s\" fÃ¥r inte finnas i en EXCEPT" -#: parser/parse_cte.c:133 -#, c-format -msgid "MERGE not supported in WITH query" -msgstr "MERGE stöds inte i WITH-frÃ¥ga" - -#: parser/parse_cte.c:143 +#: parser/parse_cte.c:136 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "WITH-frÃ¥genamn \"%s\" angivet mer än en gÃ¥ng" -#: parser/parse_cte.c:314 +#: parser/parse_cte.c:308 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "kunde inte hitta en olikhetsoperator för typ %s" -#: parser/parse_cte.c:341 +#: parser/parse_cte.c:335 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "WITH-klausul som innehÃ¥ller en datamodifierande sats mÃ¥ste vara pÃ¥ toppnivÃ¥" -#: parser/parse_cte.c:390 +#: parser/parse_cte.c:384 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "rekursiv frÃ¥ga \"%s\" kolumn %d har typ %s i den ickerekursiva termen med typ %s totalt sett" -#: parser/parse_cte.c:396 +#: parser/parse_cte.c:390 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Typomvandla utdatan för den ickerekursiva termen till korrekt typ." -#: parser/parse_cte.c:401 +#: parser/parse_cte.c:395 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "rekursiv frÃ¥ga \"%s\" kolumn %d har jämförelse (collation) \"%s\" i en icke-rekursiv term men jämförelse \"%s\" totalt sett" -#: parser/parse_cte.c:405 +#: parser/parse_cte.c:399 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "Använd en COLLATE-klausul för att sätta jämförelse för den icke-rekursiva termen." -#: parser/parse_cte.c:426 +#: parser/parse_cte.c:420 #, c-format msgid "WITH query is not recursive" msgstr "WITH-frÃ¥ga är inte rekursiv" -#: parser/parse_cte.c:457 +#: parser/parse_cte.c:451 #, c-format msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" msgstr "med en SEARCH- eller CYCLE-klausul sÃ¥ mÃ¥ste vänstersidan av en UNION vara en SELECT" -#: parser/parse_cte.c:462 +#: parser/parse_cte.c:456 #, c-format msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" msgstr "med en SEARCH- eller CYCLE-klausul sÃ¥ mÃ¥ste högersidan av en UNION vara en SELECT" -#: parser/parse_cte.c:477 +#: parser/parse_cte.c:471 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "sökkolumn \"%s\" finns inte med i kolumnlistan för WITH-frÃ¥ga" -#: parser/parse_cte.c:484 +#: parser/parse_cte.c:478 #, c-format msgid "search column \"%s\" specified more than once" msgstr "sökkolumn \"%s\" angiven mer än en gÃ¥ng" -#: parser/parse_cte.c:493 +#: parser/parse_cte.c:487 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" msgstr "namn pÃ¥ söksekvensenskolumn \"%s\" används redan i kolumnlistan till WITH-frÃ¥ga" -#: parser/parse_cte.c:510 +#: parser/parse_cte.c:504 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "cycle-kolumn \"%s\" finns inte i kolumnlistan i WITH-frÃ¥ga" -#: parser/parse_cte.c:517 +#: parser/parse_cte.c:511 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "cycle-kolumn \"%s\" angiven mer än en gÃ¥ng" -#: parser/parse_cte.c:526 +#: parser/parse_cte.c:520 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" msgstr "mark-kolumnnamn \"%s\" för cycle används redan i kolumnlistan i WITH-frÃ¥ga" -#: parser/parse_cte.c:533 +#: parser/parse_cte.c:527 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" msgstr "path-kolumnnamn \"%s\" för cycle används redan i kolumnlistan i WITH-frÃ¥ga" -#: parser/parse_cte.c:541 +#: parser/parse_cte.c:535 #, c-format msgid "cycle mark column name and cycle path column name are the same" msgstr "mark-kolumnnamn och path-kolumnnamn i cycle är bÃ¥da samma" -#: parser/parse_cte.c:551 +#: parser/parse_cte.c:545 #, c-format msgid "search sequence column name and cycle mark column name are the same" msgstr "namn pÃ¥ söksekvenskolumn och namn pÃ¥ mark-kolumn i cycle är bÃ¥da samma" -#: parser/parse_cte.c:558 +#: parser/parse_cte.c:552 #, c-format msgid "search sequence column name and cycle path column name are the same" msgstr "namn pÃ¥ söksekvenskolumn och namn pÃ¥ path-kolumn i cycle är bÃ¥da samma" -#: parser/parse_cte.c:642 +#: parser/parse_cte.c:636 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "WITH-frÃ¥ga \"%s\" har %d kolumner tillgängliga men %d kolumner angivna" -#: parser/parse_cte.c:822 +#: parser/parse_cte.c:816 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "ömsesidig rekursion mellan WITH-poster är inte implementerat" -#: parser/parse_cte.c:874 +#: parser/parse_cte.c:868 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "rekursiv frÃ¥ga \"%s\" fÃ¥r inte innehÃ¥lla datamodifierande satser" -#: parser/parse_cte.c:882 +#: parser/parse_cte.c:876 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "rekursiv frÃ¥ga \"%s\" är inte pÃ¥ formen icke-rekursiv-term UNION [ALL] rekursiv-term" -#: parser/parse_cte.c:926 +#: parser/parse_cte.c:911 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY i en rekursiv frÃ¥ga är inte implementerat" -#: parser/parse_cte.c:932 +#: parser/parse_cte.c:917 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET i en rekursiv frÃ¥ga är inte implementerat" -#: parser/parse_cte.c:938 +#: parser/parse_cte.c:923 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT i en rekursiv frÃ¥ga är inte implementerat" -#: parser/parse_cte.c:944 +#: parser/parse_cte.c:929 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE i en rekursiv frÃ¥ga är inte implementerat" -#: parser/parse_cte.c:1001 +#: parser/parse_cte.c:1008 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "rekursiv referens till frÃ¥ga \"%s\" fÃ¥r inte finnas med mer än en gÃ¥ng" -#: parser/parse_expr.c:282 +#: parser/parse_expr.c:313 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT tillÃ¥ts inte i detta kontext" -#: parser/parse_expr.c:335 parser/parse_relation.c:3654 -#: parser/parse_relation.c:3674 +#: parser/parse_expr.c:406 parser/parse_relation.c:3691 +#: parser/parse_relation.c:3701 parser/parse_relation.c:3719 +#: parser/parse_relation.c:3726 parser/parse_relation.c:3740 #, c-format msgid "column %s.%s does not exist" msgstr "kolumnen %s.%s finns inte" -#: parser/parse_expr.c:347 +#: parser/parse_expr.c:418 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "kolumn \"%s\" fanns inte i datatypen %s" -#: parser/parse_expr.c:353 +#: parser/parse_expr.c:424 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "kunde inte hitta kolumnen \"%s\" i record-datatyp" -#: parser/parse_expr.c:359 +#: parser/parse_expr.c:430 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "kolumnotation .%s använd pÃ¥ typ %s som inte är en sammanslagen typ" -#: parser/parse_expr.c:390 parser/parse_target.c:739 +#: parser/parse_expr.c:461 parser/parse_target.c:732 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "radexpansion via \"*\" stöds inte här" -#: parser/parse_expr.c:512 +#: parser/parse_expr.c:584 msgid "cannot use column reference in DEFAULT expression" msgstr "kan inte använda kolumnreferenser i DEFAULT-uttryck" -#: parser/parse_expr.c:515 +#: parser/parse_expr.c:587 msgid "cannot use column reference in partition bound expression" msgstr "kan inte använda kolumnreferenser i partitionsgränsuttryck" -#: parser/parse_expr.c:784 parser/parse_relation.c:818 -#: parser/parse_relation.c:900 parser/parse_target.c:1234 +#: parser/parse_expr.c:846 parser/parse_relation.c:833 +#: parser/parse_relation.c:915 parser/parse_target.c:1238 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "kolumnreferens \"%s\" är tvetydig" -#: parser/parse_expr.c:840 parser/parse_param.c:110 parser/parse_param.c:142 -#: parser/parse_param.c:208 parser/parse_param.c:307 +#: parser/parse_expr.c:902 parser/parse_param.c:110 parser/parse_param.c:142 +#: parser/parse_param.c:204 parser/parse_param.c:303 #, c-format msgid "there is no parameter $%d" msgstr "det finns ingen parameter $%d" -#: parser/parse_expr.c:1040 +#. translator: %s is name of a SQL construct, eg NULLIF +#: parser/parse_expr.c:1103 parser/parse_expr.c:3065 #, c-format -msgid "NULLIF requires = operator to yield boolean" -msgstr "NULLIF kräver att =-operatorn returnerar boolean" +msgid "%s requires = operator to yield boolean" +msgstr "%s kräver att operatorn = returnerar boolean" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1046 parser/parse_expr.c:2975 +#: parser/parse_expr.c:1109 parser/parse_expr.c:3072 #, c-format msgid "%s must not return a set" msgstr "%s fÃ¥r inte returnera en mängd" -#: parser/parse_expr.c:1431 parser/parse_expr.c:1463 +#: parser/parse_expr.c:1395 +#, c-format +msgid "MERGE_ACTION() can only be used in the RETURNING list of a MERGE command" +msgstr "MERGE_ACTION() kan bara användas i RETURNING-listan för ett MERGE-kommando" + +#: parser/parse_expr.c:1519 parser/parse_expr.c:1551 #, c-format msgid "number of columns does not match number of values" msgstr "antalet kolumner matchar inte antalet värden" -#: parser/parse_expr.c:1477 +#: parser/parse_expr.c:1565 #, c-format msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" msgstr "källa till en multiple-kolumn-UPDATE-post mÃ¥ste vara en sub-SELECT eller ROW()-uttryck" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1672 parser/parse_expr.c:2154 parser/parse_func.c:2679 +#: parser/parse_expr.c:1760 parser/parse_expr.c:2243 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "mängdreturnerande funktioner tillÃ¥ts inte i %s" -#: parser/parse_expr.c:1735 +#: parser/parse_expr.c:1824 msgid "cannot use subquery in check constraint" msgstr "kan inte använda subfrÃ¥ga i check-villkor" -#: parser/parse_expr.c:1739 +#: parser/parse_expr.c:1828 msgid "cannot use subquery in DEFAULT expression" msgstr "kan inte använda underfrÃ¥ga i DEFAULT-uttryck" -#: parser/parse_expr.c:1742 +#: parser/parse_expr.c:1831 msgid "cannot use subquery in index expression" msgstr "kan inte använda subfrÃ¥ga i indexuttryck" -#: parser/parse_expr.c:1745 +#: parser/parse_expr.c:1834 msgid "cannot use subquery in index predicate" msgstr "kan inte använda subfrÃ¥ga i indexpredikat" -#: parser/parse_expr.c:1748 +#: parser/parse_expr.c:1837 msgid "cannot use subquery in statistics expression" msgstr "kan inte använda underfrÃ¥ga i statistikuttryck" -#: parser/parse_expr.c:1751 +#: parser/parse_expr.c:1840 msgid "cannot use subquery in transform expression" msgstr "kan inte använda underfrÃ¥ga i transformeringsuttrycket" -#: parser/parse_expr.c:1754 +#: parser/parse_expr.c:1843 msgid "cannot use subquery in EXECUTE parameter" msgstr "kan inte använda subfrÃ¥ga i EXECUTE-parameter" -#: parser/parse_expr.c:1757 +#: parser/parse_expr.c:1846 msgid "cannot use subquery in trigger WHEN condition" msgstr "kan inte använda subfrÃ¥ga i triggerns WHEN-villkor" -#: parser/parse_expr.c:1760 +#: parser/parse_expr.c:1849 msgid "cannot use subquery in partition bound" msgstr "kan inte använda underfrÃ¥ga i partitionsgräns" -#: parser/parse_expr.c:1763 +#: parser/parse_expr.c:1852 msgid "cannot use subquery in partition key expression" msgstr "kan inte använda underfrÃ¥ga i partitionsnyckeluttryck" -#: parser/parse_expr.c:1766 +#: parser/parse_expr.c:1855 msgid "cannot use subquery in CALL argument" msgstr "kan inte använda subfrÃ¥ga i CALL-argument" -#: parser/parse_expr.c:1769 +#: parser/parse_expr.c:1858 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "kan inte använda subfrÃ¥ga i COPY FROM WHERE-villkor" -#: parser/parse_expr.c:1772 +#: parser/parse_expr.c:1861 msgid "cannot use subquery in column generation expression" msgstr "kan inte använda subfrÃ¥ga i kolumngenereringsuttryck" -#: parser/parse_expr.c:1825 +#: parser/parse_expr.c:1914 parser/parse_expr.c:3764 #, c-format msgid "subquery must return only one column" msgstr "underfrÃ¥ga kan bara returnera en kolumn" -#: parser/parse_expr.c:1896 +#: parser/parse_expr.c:1985 #, c-format msgid "subquery has too many columns" msgstr "underfrÃ¥ga har för mÃ¥nga kolumner" -#: parser/parse_expr.c:1901 +#: parser/parse_expr.c:1990 #, c-format msgid "subquery has too few columns" msgstr "underfrÃ¥ga har för fÃ¥ kolumner" -#: parser/parse_expr.c:1997 +#: parser/parse_expr.c:2086 #, c-format msgid "cannot determine type of empty array" msgstr "kan inte bestämma typen av en tom array" -#: parser/parse_expr.c:1998 +#: parser/parse_expr.c:2087 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "Typomvandla explicit till den önskade typen, till exempel ARRAY[]::integer[]." -#: parser/parse_expr.c:2012 +#: parser/parse_expr.c:2101 #, c-format msgid "could not find element type for data type %s" msgstr "kunde inte hitta elementtyp för datatyp %s" -#: parser/parse_expr.c:2095 +#: parser/parse_expr.c:2184 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "ROW-uttryck kan ha som mest %d poster" -#: parser/parse_expr.c:2300 +#: parser/parse_expr.c:2389 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "onamnat XML-attributvärde mÃ¥ste vara en kolumnreferens" -#: parser/parse_expr.c:2301 +#: parser/parse_expr.c:2390 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "onamnat XML-elementvärde mÃ¥ste vara en kolumnreferens" -#: parser/parse_expr.c:2316 +#: parser/parse_expr.c:2405 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "XML-attributnamn \"%s\" finns med mer än en gÃ¥ng" -#: parser/parse_expr.c:2423 +#: parser/parse_expr.c:2513 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "kan inte typomvandla XMLSERIALIZE-resultat till %s" -#: parser/parse_expr.c:2732 parser/parse_expr.c:2928 +#: parser/parse_expr.c:2827 parser/parse_expr.c:3023 #, c-format msgid "unequal number of entries in row expressions" msgstr "olika antal element i raduttryck" -#: parser/parse_expr.c:2742 +#: parser/parse_expr.c:2837 #, c-format msgid "cannot compare rows of zero length" msgstr "kan inte jämföra rader med längden noll" -#: parser/parse_expr.c:2767 +#: parser/parse_expr.c:2862 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "operator för radjämförelse mÃ¥ste resultera i typen boolean, inte %s" -#: parser/parse_expr.c:2774 +#: parser/parse_expr.c:2869 #, c-format msgid "row comparison operator must not return a set" msgstr "radjämförelseoperator fÃ¥r inte returnera en mängd" -#: parser/parse_expr.c:2833 parser/parse_expr.c:2874 +#: parser/parse_expr.c:2928 parser/parse_expr.c:2969 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "kunde inte lista ut tolkning av radjämförelseoperator %s" -#: parser/parse_expr.c:2835 +#: parser/parse_expr.c:2930 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "Radjämförelseoperatorer mÃ¥ste vara associerade med btreee-operatorfamiljer." -#: parser/parse_expr.c:2876 +#: parser/parse_expr.c:2971 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Det finns flera lika sannolika kandidater." -#: parser/parse_expr.c:2969 +#: parser/parse_expr.c:3306 +#, c-format +msgid "JSON ENCODING clause is only allowed for bytea input type" +msgstr "JSON ENCODING tillÃ¥ts bara för input-typen bytea" + +#: parser/parse_expr.c:3370 +#, c-format +msgid "cannot use non-string types with implicit FORMAT JSON clause" +msgstr "kan inte använda icke-strängtyper med implicit FORMAT JSON-klausul" + +#: parser/parse_expr.c:3371 +#, c-format +msgid "cannot use non-string types with explicit FORMAT JSON clause" +msgstr "kan inte använda icke-strängtyper med explicit FORMAT JSON-klausul" + +#: parser/parse_expr.c:3460 +#, c-format +msgid "cannot use JSON format with non-string output types" +msgstr "kan inte använda JSON-formatet för utddata som inte är strängar" + +#: parser/parse_expr.c:3473 +#, c-format +msgid "cannot set JSON encoding for non-bytea output types" +msgstr "kan inte sätta JSON-kodning för utdata-typer som inte är bytea" + +#: parser/parse_expr.c:3478 +#, c-format +msgid "unsupported JSON encoding" +msgstr "ej stödd JSON-kodning" + +#: parser/parse_expr.c:3479 +#, c-format +msgid "Only UTF8 JSON encoding is supported." +msgstr "Enbart JSON-kodningen UTF8 stöds." + +#: parser/parse_expr.c:3516 +#, c-format +msgid "returning SETOF types is not supported in SQL/JSON functions" +msgstr "returtyp SETOF stöds inte för SQL/JSON-funktioner" + +#: parser/parse_expr.c:3521 +#, c-format +msgid "returning pseudo-types is not supported in SQL/JSON functions" +msgstr "pseudo-typer stöds inte som resultat för SQL/JSON-funktioner" + +#: parser/parse_expr.c:3849 parser/parse_func.c:866 +#, c-format +msgid "aggregate ORDER BY is not implemented for window functions" +msgstr "aggregat-ORDER BY är inte implementerat för fönsterfunktioner" + +#: parser/parse_expr.c:4072 +#, c-format +msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" +msgstr "kan inte använda JSON FORMAT ENCODING för indatatyper som inte är bytea" + +#: parser/parse_expr.c:4092 +#, c-format +msgid "cannot use type %s in IS JSON predicate" +msgstr "kan inte använda typen %s i ett IS JSON-predikat" + +#: parser/parse_expr.c:4118 parser/parse_expr.c:4239 +#, c-format +msgid "cannot use type %s in RETURNING clause of %s" +msgstr "kan inte använda typen %s i RETURNING-klausul för %s" + +#: parser/parse_expr.c:4120 +#, c-format +msgid "Try returning json or jsonb." +msgstr "Försök returnera json eller jsonb." + +#: parser/parse_expr.c:4168 +#, c-format +msgid "cannot use non-string types with WITH UNIQUE KEYS clause" +msgstr "kan inte använda icke-strängtyper med WITH UNIQUE KEYS-klausul" + +#: parser/parse_expr.c:4242 +#, c-format +msgid "Try returning a string type or bytea." +msgstr "Försök returnera en strängtyp eller bytea." + +#: parser/parse_expr.c:4307 +#, c-format +msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" +msgstr "kan inte ange FORMAT JSON i RETURNING-klausul för %s()" + +#: parser/parse_expr.c:4320 +#, c-format +msgid "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" +msgstr "SQL/JSON QUOTES fÃ¥r inte anges tillsammans med WITH WRAPPER" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4334 parser/parse_expr.c:4363 parser/parse_expr.c:4394 +#: parser/parse_expr.c:4420 parser/parse_expr.c:4446 +#: parser/parse_jsontable.c:94 +#, c-format +msgid "invalid %s behavior" +msgstr "ogiltig %s-angivelse" + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4337 parser/parse_expr.c:4366 +#, c-format +msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s." +msgstr "Bara uttrycken ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT eller DEFAULT tillÃ¥ts i %s för %s." + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4344 parser/parse_expr.c:4373 parser/parse_expr.c:4402 +#: parser/parse_expr.c:4430 parser/parse_expr.c:4456 +#, c-format +msgid "invalid %s behavior for column \"%s\"" +msgstr "ogiltig %s-angivelse för kolumn \"%s\"" + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4347 parser/parse_expr.c:4376 +#, c-format +msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns." +msgstr "Bara uttrycken ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT eller DEFAULT tillÃ¥ts i %s för formatterade kolumner." + +#: parser/parse_expr.c:4395 +#, c-format +msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s." +msgstr "Bara ERROR, TRUE, FALSE eller UNKNOWN tillÃ¥ts i %s för %s." + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4405 +#, c-format +msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns." +msgstr "Bara ERROR, TRUE, FALSE eller UNKNOWN tillÃ¥ts i %s för EXISTS-kolumner." + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4423 parser/parse_expr.c:4449 +#, c-format +msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s." +msgstr "Bara uttrycken ERROR, NULL eller DEFAULT tillÃ¥ts i %s för %s." + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4433 parser/parse_expr.c:4459 +#, c-format +msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns." +msgstr "Bara uttrycken ERROR, NULL eller DEFAULT tillÃ¥ts i %s för skalära kolumner." + +#: parser/parse_expr.c:4489 +#, c-format +msgid "JSON path expression must be of type %s, not of type %s" +msgstr "Uttryck för JSON-sökväg mÃ¥ste vara av typ %s, inte av typ %s" + +#: parser/parse_expr.c:4707 +#, c-format +msgid "can only specify a constant, non-aggregate function, or operator expression for DEFAULT" +msgstr "kan bara ange en konstant, en icke-aggregat-funktion eller ett operatoruttryck för DEFAULT" + +#: parser/parse_expr.c:4712 +#, c-format +msgid "DEFAULT expression must not contain column references" +msgstr "DEFAULT-uttryck fÃ¥r inte innehÃ¥lla kolumnreferenser" + +#: parser/parse_expr.c:4717 +#, c-format +msgid "DEFAULT expression must not return a set" +msgstr "DEFAULT-uttryck fÃ¥r inte returnera en mängd" + +#: parser/parse_expr.c:4793 parser/parse_expr.c:4802 +#, c-format +msgid "cannot cast behavior expression of type %s to %s" +msgstr "kan inte omvandla uttryck av typ %s till %s" + +#: parser/parse_expr.c:4796 #, c-format -msgid "IS DISTINCT FROM requires = operator to yield boolean" -msgstr "IS DISTINCT FROM kräver att operatorn = ger tillbaka en boolean" +msgid "You will need to explicitly cast the expression to type %s." +msgstr "Du mÃ¥ste explicit omvandla uttrycket till typen %s." #: parser/parse_func.c:194 #, c-format @@ -17523,7 +18484,7 @@ msgstr "argumentnamn \"%s\" angivet mer än en gÃ¥ng" msgid "positional argument cannot follow named argument" msgstr "positionella argument kan inte komma efter namngivna argument" -#: parser/parse_func.c:287 parser/parse_func.c:2369 +#: parser/parse_func.c:287 parser/parse_func.c:2368 #, c-format msgid "%s is not a procedure" msgstr "%s är inte en procedur" @@ -17642,7 +18603,7 @@ msgstr "Kunde inte välja en bästa kandidatfunktion: Du kan behöva lägga till msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." msgstr "Ingen aggregatfunktion matchar det givna namnet och argumenttyperna. Kanske har du placerat ORDER BY pÃ¥ fel plats; ORDER BY mÃ¥ste komma efter alla vanliga argument till aggregatet." -#: parser/parse_func.c:622 parser/parse_func.c:2412 +#: parser/parse_func.c:622 parser/parse_func.c:2411 #, c-format msgid "procedure %s does not exist" msgstr "proceduren \"%s\" finns inte" @@ -17662,137 +18623,132 @@ msgstr "Ingen funktion matchar det angivna namnet och argumenttyperna. Du kan be msgid "VARIADIC argument must be an array" msgstr "VARIADIC-argument mÃ¥ste vara en array" -#: parser/parse_func.c:790 parser/parse_func.c:854 +#: parser/parse_func.c:791 parser/parse_func.c:856 #, c-format msgid "%s(*) must be used to call a parameterless aggregate function" msgstr "%s(*) mÃ¥ste användas för att anropa en parameterlös aggregatfunktion" -#: parser/parse_func.c:797 +#: parser/parse_func.c:798 #, c-format msgid "aggregates cannot return sets" msgstr "aggregat kan inte returnera mängder" -#: parser/parse_func.c:812 +#: parser/parse_func.c:813 #, c-format msgid "aggregates cannot use named arguments" msgstr "aggregat kan inte använda namngivna argument" -#: parser/parse_func.c:844 +#: parser/parse_func.c:846 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "DISTINCT är inte implementerad för fönsterfunktioner" -#: parser/parse_func.c:864 -#, c-format -msgid "aggregate ORDER BY is not implemented for window functions" -msgstr "aggregat-ORDER BY är inte implementerat för fönsterfunktioner" - -#: parser/parse_func.c:873 +#: parser/parse_func.c:875 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "FILTER är inte implementerat för icke-aggregat-fönsterfunktioner" -#: parser/parse_func.c:882 +#: parser/parse_func.c:884 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "fönsterfunktioner kan inte innehÃ¥lla funtionsanrop till funktioner som returnerar mängder" -#: parser/parse_func.c:890 +#: parser/parse_func.c:892 #, c-format msgid "window functions cannot return sets" msgstr "fönsterfunktioner kan inte returnera mängder" -#: parser/parse_func.c:2168 parser/parse_func.c:2441 +#: parser/parse_func.c:2167 parser/parse_func.c:2440 #, c-format msgid "could not find a function named \"%s\"" msgstr "kunde inte hitta funktion med namn \"%s\"" -#: parser/parse_func.c:2182 parser/parse_func.c:2459 +#: parser/parse_func.c:2181 parser/parse_func.c:2458 #, c-format msgid "function name \"%s\" is not unique" msgstr "funktionsnamn \"%s\" är inte unikt" -#: parser/parse_func.c:2184 parser/parse_func.c:2462 +#: parser/parse_func.c:2183 parser/parse_func.c:2461 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "Ange argumentlistan för att välja funktionen entydigt." -#: parser/parse_func.c:2228 +#: parser/parse_func.c:2227 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" msgstr[0] "procedurer kan inte ha mer än %d argument" msgstr[1] "procedurer kan inte ha mer än %d argument" -#: parser/parse_func.c:2359 +#: parser/parse_func.c:2358 #, c-format msgid "%s is not a function" msgstr "%s är inte en funktion" -#: parser/parse_func.c:2379 +#: parser/parse_func.c:2378 #, c-format msgid "function %s is not an aggregate" msgstr "funktionen %s är inte en aggregatfunktion" -#: parser/parse_func.c:2407 +#: parser/parse_func.c:2406 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "kunde inte hitta en procedur med namn \"%s\"" -#: parser/parse_func.c:2421 +#: parser/parse_func.c:2420 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "kunde inte hitta ett aggregat med namn \"%s\"" -#: parser/parse_func.c:2426 +#: parser/parse_func.c:2425 #, c-format msgid "aggregate %s(*) does not exist" msgstr "aggregatfunktion %s(*) existerar inte" -#: parser/parse_func.c:2431 +#: parser/parse_func.c:2430 #, c-format msgid "aggregate %s does not exist" msgstr "aggregatfunktion %s existerar inte" -#: parser/parse_func.c:2467 +#: parser/parse_func.c:2466 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "procedurnamn \"%s\" är inte unikt" -#: parser/parse_func.c:2470 +#: parser/parse_func.c:2469 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "Ange argumentlistan för att välja proceduren entydigt." -#: parser/parse_func.c:2475 +#: parser/parse_func.c:2474 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "aggregatnamn \"%s\" är inte unikt" -#: parser/parse_func.c:2478 +#: parser/parse_func.c:2477 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "Ange argumentlistan för att välja aggregatet entydigt." -#: parser/parse_func.c:2483 +#: parser/parse_func.c:2482 #, c-format msgid "routine name \"%s\" is not unique" msgstr "rutinnamn \"%s\" är inte unikt" -#: parser/parse_func.c:2486 +#: parser/parse_func.c:2485 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "Ange argumentlistan för att välja rutinen entydigt." -#: parser/parse_func.c:2541 +#: parser/parse_func.c:2540 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "mängdreturnerande funktioner tillÃ¥ts inte i JOIN-villkor" -#: parser/parse_func.c:2562 +#: parser/parse_func.c:2561 msgid "set-returning functions are not allowed in policy expressions" msgstr "mängdreturnerande funktioner tillÃ¥ts inte i policy-uttryck" -#: parser/parse_func.c:2578 +#: parser/parse_func.c:2577 msgid "set-returning functions are not allowed in window definitions" msgstr "mängdreturnerande funktioner tillÃ¥ts inte i fönsterdefinitioner" @@ -17852,279 +18808,299 @@ msgstr "mängdreturnerande funktioner tillÃ¥ts inte i COPY FROM WHERE-villkor" msgid "set-returning functions are not allowed in column generation expressions" msgstr "mängdreturnerande funktioner tillÃ¥ts inte i kolumngenereringsuttryck" -#: parser/parse_merge.c:119 +#: parser/parse_jsontable.c:95 +#, c-format +msgid "Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause." +msgstr "Enbart EMPTY [ ARRAY ] eller ERROR tillÃ¥ts pÃ¥ toppnivÃ¥ i ON ERROR-klausul." + +#: parser/parse_jsontable.c:189 parser/parse_jsontable.c:203 +#, c-format +msgid "duplicate JSON_TABLE column or path name: %s" +msgstr "duplicerad JSON_TABLE-kolumn eller sökvägsnamn: %s" + +#: parser/parse_merge.c:129 #, c-format msgid "WITH RECURSIVE is not supported for MERGE statement" msgstr "WHERE RECURSIVE stöds inte i MERGE-satser" -#: parser/parse_merge.c:161 +#: parser/parse_merge.c:176 #, c-format msgid "unreachable WHEN clause specified after unconditional WHEN clause" msgstr "onÃ¥bar WHEN-klausul har angivits efter en ej villkorlig WHEN-klausul" -#: parser/parse_merge.c:191 -#, c-format -msgid "MERGE is not supported for relations with rules." -msgstr "MERGE stöds inte för relationer med regler." - -#: parser/parse_merge.c:208 +#: parser/parse_merge.c:222 #, c-format msgid "name \"%s\" specified more than once" msgstr "namnet \"%s\" angivet mer än en gÃ¥ng" -#: parser/parse_merge.c:210 +#: parser/parse_merge.c:224 #, c-format msgid "The name is used both as MERGE target table and data source." msgstr "Namnet används bÃ¥de som MERGE-mÃ¥ltabell och som datakälla." -#: parser/parse_node.c:86 +#: parser/parse_node.c:82 #, c-format msgid "target lists can have at most %d entries" msgstr "mÃ¥llista kan ha som mest %d poster" -#: parser/parse_oper.c:123 parser/parse_oper.c:690 +#: parser/parse_oper.c:114 parser/parse_oper.c:678 #, c-format msgid "postfix operators are not supported" msgstr "postfix-operatorer stöds inte" -#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:539 -#: utils/adt/regproc.c:723 -#, c-format -msgid "operator does not exist: %s" -msgstr "operator existerar inte: %s" - -#: parser/parse_oper.c:229 +#: parser/parse_oper.c:217 #, c-format msgid "Use an explicit ordering operator or modify the query." msgstr "Använd en explicit ordningsoperator eller ändra frÃ¥gan." -#: parser/parse_oper.c:485 +#: parser/parse_oper.c:473 #, c-format msgid "operator requires run-time type coercion: %s" msgstr "operator kräver run-time-typomvandling: %s" -#: parser/parse_oper.c:641 +#: parser/parse_oper.c:629 #, c-format msgid "operator is not unique: %s" msgstr "operatorn är inte unik: %s" -#: parser/parse_oper.c:643 +#: parser/parse_oper.c:631 #, c-format msgid "Could not choose a best candidate operator. You might need to add explicit type casts." msgstr "Kunde inte välja en bästa kandidatoperator. Du behöver troligen lägga till en explicit typomvandling." -#: parser/parse_oper.c:652 +#: parser/parse_oper.c:640 #, c-format msgid "No operator matches the given name and argument type. You might need to add an explicit type cast." msgstr "Ingen operator matchar det angivna namnet och argumenttyp. Du kan behöva lägga till explicita typomvandlingar." -#: parser/parse_oper.c:654 +#: parser/parse_oper.c:642 #, c-format msgid "No operator matches the given name and argument types. You might need to add explicit type casts." msgstr "Ingen operator matchar det angivna namnet och argumenttyperna. Du kan behöva lägga till explicita typomvandlingar." -#: parser/parse_oper.c:714 parser/parse_oper.c:828 -#, c-format -msgid "operator is only a shell: %s" -msgstr "operator är bara en shell-typ: %s" - -#: parser/parse_oper.c:816 +#: parser/parse_oper.c:803 #, c-format msgid "op ANY/ALL (array) requires array on right side" msgstr "op ANY/ALL (array) kräver en array pÃ¥ höger sida" -#: parser/parse_oper.c:858 +#: parser/parse_oper.c:844 #, c-format msgid "op ANY/ALL (array) requires operator to yield boolean" msgstr "op ANY/ALL (array) kräver att operatorn returnerar en boolean" -#: parser/parse_oper.c:863 +#: parser/parse_oper.c:849 #, c-format msgid "op ANY/ALL (array) requires operator not to return a set" msgstr "op ANY/ALL (array) kräver att operatorn inte returnerar en mängd" -#: parser/parse_param.c:225 +#: parser/parse_param.c:221 #, c-format msgid "inconsistent types deduced for parameter $%d" msgstr "inkonsistenta typer härledda för parameter $%d" -#: parser/parse_param.c:313 tcop/postgres.c:709 +#: parser/parse_param.c:309 tcop/postgres.c:744 #, c-format msgid "could not determine data type of parameter $%d" msgstr "kunde inte lista ut datatypen för parameter $%d" -#: parser/parse_relation.c:201 +#: parser/parse_relation.c:221 #, c-format msgid "table reference \"%s\" is ambiguous" msgstr "tabellreferens \"%s\" är tvetydig" -#: parser/parse_relation.c:245 +#: parser/parse_relation.c:265 #, c-format msgid "table reference %u is ambiguous" msgstr "tabellreferens %u är tvetydig" -#: parser/parse_relation.c:445 +#: parser/parse_relation.c:465 #, c-format msgid "table name \"%s\" specified more than once" msgstr "tabellnamn \"%s\" angivet mer än en gÃ¥ng" -#: parser/parse_relation.c:474 parser/parse_relation.c:3594 +#: parser/parse_relation.c:494 parser/parse_relation.c:3633 +#: parser/parse_relation.c:3642 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "ogiltig referens till FROM-klausulpost för tabell \"%s\"" -#: parser/parse_relation.c:478 parser/parse_relation.c:3599 +#: parser/parse_relation.c:498 parser/parse_relation.c:3644 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "Det finns en post för tabell \"%s\" men den kan inte refereras till frÃ¥n denna del av frÃ¥gan." -#: parser/parse_relation.c:480 +#: parser/parse_relation.c:500 #, c-format msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." msgstr "JOIN-typen mÃ¥ste vara INNER eller LEFT för att fungera med LATERAL." -#: parser/parse_relation.c:691 +#: parser/parse_relation.c:703 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "systemkolumn \"%s\" som refereras till i check-villkor är ogiltigt" -#: parser/parse_relation.c:700 +#: parser/parse_relation.c:712 #, c-format msgid "cannot use system column \"%s\" in column generation expression" msgstr "kan inte använda systemkolumn \"%s\" i kolumngenereringsuttryck" -#: parser/parse_relation.c:711 +#: parser/parse_relation.c:723 #, c-format msgid "cannot use system column \"%s\" in MERGE WHEN condition" msgstr "kan inte använda systemkolumn \"%s\" i MERGE WHEN-villkor" -#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 -#: parser/parse_relation.c:2357 +#: parser/parse_relation.c:1236 parser/parse_relation.c:1691 +#: parser/parse_relation.c:2384 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "tabell \"%s\" har %d kolumner tillgängliga men %d kolumner angivna" -#: parser/parse_relation.c:1388 +#: parser/parse_relation.c:1445 #, c-format msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." msgstr "Det finns en WITH-post med namn \"%s\" men den kan inte refereras till frÃ¥n denna del av frÃ¥gan." -#: parser/parse_relation.c:1390 +#: parser/parse_relation.c:1447 #, c-format msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." msgstr "Använd WITH RECURSIVE eller ändra ordning pÃ¥ WITH-posterna för att ta bort framÃ¥t-referenser." -#: parser/parse_relation.c:1778 +#: parser/parse_relation.c:1833 #, c-format msgid "a column definition list is redundant for a function with OUT parameters" msgstr "en kolumndefinitionslista är redundant för en funktion med OUT-parametrar" -#: parser/parse_relation.c:1784 +#: parser/parse_relation.c:1839 #, c-format msgid "a column definition list is redundant for a function returning a named composite type" msgstr "en kolumndefinitionslista är redundant för en funktion som returnerar en namngiven composite-typ" -#: parser/parse_relation.c:1791 +#: parser/parse_relation.c:1846 #, c-format msgid "a column definition list is only allowed for functions returning \"record\"" msgstr "en kolumndefinitionslista tillÃ¥ts bara för funktioner som returnerar \"record\"" -#: parser/parse_relation.c:1802 +#: parser/parse_relation.c:1857 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "en kolumndefinitionslista krävs för funktioner som returnerar \"record\"" -#: parser/parse_relation.c:1839 +#: parser/parse_relation.c:1894 #, c-format msgid "column definition lists can have at most %d entries" msgstr "kolumndefinitionslistor kan ha som mest %d poster" -#: parser/parse_relation.c:1899 +#: parser/parse_relation.c:1954 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "funktion \"%s\" i FROM har en icke stödd returtyp %s" -#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 +#: parser/parse_relation.c:1981 parser/parse_relation.c:2066 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "funktioner i FROM kan returnera som mest %d kolumner" -#: parser/parse_relation.c:2049 +#: parser/parse_relation.c:2096 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "funktionen %s har %d kolumner tillgängliga men %d kolumner angivna" -#: parser/parse_relation.c:2138 +#: parser/parse_relation.c:2177 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "VALUES-lista \"%s\" har %d kolumner tillgängliga men %d kolumner angivna" -#: parser/parse_relation.c:2210 +#: parser/parse_relation.c:2242 #, c-format msgid "joins can have at most %d columns" msgstr "joins kan ha som mest %d kolumner" -#: parser/parse_relation.c:2235 +#: parser/parse_relation.c:2267 #, c-format msgid "join expression \"%s\" has %d columns available but %d columns specified" msgstr "join-uttryck \"%s\" har %d kolumner tillgängliga men %d kolumner angivna" -#: parser/parse_relation.c:2330 +#: parser/parse_relation.c:2357 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "WITH-frÃ¥ga \"%s\" har ingen RETURNING-klausul" -#: parser/parse_relation.c:3597 +#: parser/parse_relation.c:3635 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Kanske tänkte du referera till tabellaliaset \"%s\"." -#: parser/parse_relation.c:3605 +#: parser/parse_relation.c:3647 +#, c-format +msgid "To reference that table, you must mark this subquery with LATERAL." +msgstr "För att referera till den tabellen sÃ¥ mÃ¥ste denna subfrÃ¥ga markeras som LATERAL." + +#: parser/parse_relation.c:3653 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "saknar FROM-klausulpost för tabell \"%s\"" -#: parser/parse_relation.c:3657 +#: parser/parse_relation.c:3693 #, c-format -msgid "Perhaps you meant to reference the column \"%s.%s\"." -msgstr "Kanske tänkte du referera till kolumnen \"%s.%s\"." +msgid "There are columns named \"%s\", but they are in tables that cannot be referenced from this part of the query." +msgstr "Det finns kolumner med namn \"%s\", men de är i tabeller som inte kan refereras till frÃ¥n denna del av frÃ¥gan." -#: parser/parse_relation.c:3659 +#: parser/parse_relation.c:3695 +#, c-format +msgid "Try using a table-qualified name." +msgstr "Försök med ett tabell-prefixat namn." + +#: parser/parse_relation.c:3703 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "Det finns en kolumn med namn \"%s\" i tabell \"%s\" men den kan inte refereras till frÃ¥n denna del av frÃ¥gan." -#: parser/parse_relation.c:3676 +#: parser/parse_relation.c:3706 +#, c-format +msgid "To reference that column, you must mark this subquery with LATERAL." +msgstr "För att referera till den kolumnen sÃ¥ mÃ¥ste denna subfrÃ¥ga markeras som LATERAL." + +#: parser/parse_relation.c:3708 +#, c-format +msgid "To reference that column, you must use a table-qualified name." +msgstr "För att referera till den kolumnen sÃ¥ mÃ¥ste du använda ett tabell-prefixat namn." + +#: parser/parse_relation.c:3728 +#, c-format +msgid "Perhaps you meant to reference the column \"%s.%s\"." +msgstr "Kanske tänkte du referera till kolumnen \"%s.%s\"." + +#: parser/parse_relation.c:3742 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "Kanske tänkte du referera till kolumnen \"%s.%s\" eller kolumnen \"%s.%s\"." -#: parser/parse_target.c:482 parser/parse_target.c:803 +#: parser/parse_target.c:480 parser/parse_target.c:795 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "kan inte skriva till systemkolumn \"%s\"" -#: parser/parse_target.c:510 +#: parser/parse_target.c:508 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "kan inte sätta ett array-element till DEFAULT" -#: parser/parse_target.c:515 +#: parser/parse_target.c:513 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "kan inte sätta ett underfält till DEFAULT" -#: parser/parse_target.c:589 +#: parser/parse_target.c:587 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "kolumn \"%s\" har typ %s men uttrycket är av typ %s" -#: parser/parse_target.c:787 +#: parser/parse_target.c:779 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" msgstr "kan inte tilldela till fält \"%s\" i kolumn \"%s\" dÃ¥ dess typ %s inte är en composit-typ" -#: parser/parse_target.c:796 +#: parser/parse_target.c:788 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" msgstr "kan inte tilldela till fält \"%s\" i kolumn \"%s\" dÃ¥ det inte finns nÃ¥gon sÃ¥dan kolumn i datatypen %s" @@ -18139,7 +19115,7 @@ msgstr "tilldelning med array-index till \"%s\" kräver typ %s men uttrycket har msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "underfält \"%s\" har typ %s men uttrycket har typ %s" -#: parser/parse_target.c:1323 +#: parser/parse_target.c:1327 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * utan tabeller angivna är inte giltigt" @@ -18159,8 +19135,8 @@ msgstr "dÃ¥lig %%TYPE-referens (för mÃ¥nga punktade namn): %s" msgid "type reference %s converted to %s" msgstr "typreferens %s konverterad till %s" -#: parser/parse_type.c:278 parser/parse_type.c:807 utils/cache/typcache.c:390 -#: utils/cache/typcache.c:445 +#: parser/parse_type.c:278 parser/parse_type.c:813 utils/cache/typcache.c:397 +#: utils/cache/typcache.c:452 #, c-format msgid "type \"%s\" is only a shell" msgstr "typ \"%s\" är bara ett skal" @@ -18175,369 +19151,359 @@ msgstr "typmodifierare tillÃ¥ts inte för typ \"%s\"" msgid "type modifiers must be simple constants or identifiers" msgstr "typmodifierare mÃ¥ste vare enkla konstanter eller identifierare" -#: parser/parse_type.c:725 parser/parse_type.c:770 +#: parser/parse_type.c:723 parser/parse_type.c:773 #, c-format msgid "invalid type name \"%s\"" msgstr "ogiltigt typnamn \"%s\"" -#: parser/parse_utilcmd.c:266 +#: parser/parse_utilcmd.c:263 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "kan inte skapa partitionerad tabell som barnarv" -#: parser/parse_utilcmd.c:579 +#: parser/parse_utilcmd.c:475 +#, c-format +msgid "cannot set logged status of a temporary sequence" +msgstr "kan inte sätta loggningsstatus för en temporär sekvens" + +#: parser/parse_utilcmd.c:611 #, c-format msgid "array of serial is not implemented" msgstr "array med serial är inte implementerat" -#: parser/parse_utilcmd.c:658 parser/parse_utilcmd.c:670 -#: parser/parse_utilcmd.c:729 +#: parser/parse_utilcmd.c:690 parser/parse_utilcmd.c:702 +#: parser/parse_utilcmd.c:761 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "motstridiga NULL/NOT NULL-villkor för kolumnen \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:682 +#: parser/parse_utilcmd.c:714 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "multipla default-värden angivna för kolumn \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:699 +#: parser/parse_utilcmd.c:731 #, c-format msgid "identity columns are not supported on typed tables" msgstr "identitetskolumner stöds inte pÃ¥ typade tabeller" -#: parser/parse_utilcmd.c:703 +#: parser/parse_utilcmd.c:735 #, c-format msgid "identity columns are not supported on partitions" msgstr "identitetskolumner stöds inte för partitioner" -#: parser/parse_utilcmd.c:712 +#: parser/parse_utilcmd.c:744 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "multipla identitetspecifikationer för kolumn \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:742 +#: parser/parse_utilcmd.c:774 #, c-format msgid "generated columns are not supported on typed tables" msgstr "genererade kolumner stöds inte pÃ¥ typade tabeller" -#: parser/parse_utilcmd.c:746 -#, c-format -msgid "generated columns are not supported on partitions" -msgstr "genererade kolumner stöds inte för partitioner" - -#: parser/parse_utilcmd.c:751 +#: parser/parse_utilcmd.c:778 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "multipla genereringsklausuler angivna för kolumn \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:769 parser/parse_utilcmd.c:884 +#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:911 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "primärnyckelvillkor stöds inte pÃ¥ främmande tabeller" -#: parser/parse_utilcmd.c:778 parser/parse_utilcmd.c:894 +#: parser/parse_utilcmd.c:805 parser/parse_utilcmd.c:921 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "unika villkor stöds inte pÃ¥ främmande tabeller" -#: parser/parse_utilcmd.c:823 +#: parser/parse_utilcmd.c:850 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "bÃ¥de default och identity angiven för kolumn \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:831 +#: parser/parse_utilcmd.c:858 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "bÃ¥de default och genereringsuttryck angiven för kolumn \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:839 +#: parser/parse_utilcmd.c:866 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "bÃ¥de identity och genereringsuttryck angiven för kolumn \"%s\" i tabell \"%s\"" -#: parser/parse_utilcmd.c:904 +#: parser/parse_utilcmd.c:931 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "uteslutningsvillkor stöds inte pÃ¥ främmande tabeller" -#: parser/parse_utilcmd.c:910 -#, c-format -msgid "exclusion constraints are not supported on partitioned tables" -msgstr "uteslutningsvillkor stöds inte för partitionerade tabeller" - -#: parser/parse_utilcmd.c:975 +#: parser/parse_utilcmd.c:996 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE stöds inte för att skapa främmande tabeller" -#: parser/parse_utilcmd.c:988 +#: parser/parse_utilcmd.c:1009 #, c-format msgid "relation \"%s\" is invalid in LIKE clause" msgstr "relationen \"%s\" är ogiltig i LIKE-klausul" -#: parser/parse_utilcmd.c:1754 parser/parse_utilcmd.c:1862 +#: parser/parse_utilcmd.c:1736 parser/parse_utilcmd.c:1844 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "Index \"%s\" innehÃ¥ller en hela-raden-referens." -#: parser/parse_utilcmd.c:2251 +#: parser/parse_utilcmd.c:2242 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "kan inte använda ett existerande index i CREATE TABLE" -#: parser/parse_utilcmd.c:2271 +#: parser/parse_utilcmd.c:2262 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "index \"%s\" är redan associerad med ett villkor" -#: parser/parse_utilcmd.c:2286 -#, c-format -msgid "index \"%s\" is not valid" -msgstr "index \"%s\" är inte giltigt" - -#: parser/parse_utilcmd.c:2292 +#: parser/parse_utilcmd.c:2283 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\" är inte ett unikt index" -#: parser/parse_utilcmd.c:2293 parser/parse_utilcmd.c:2300 -#: parser/parse_utilcmd.c:2307 parser/parse_utilcmd.c:2384 +#: parser/parse_utilcmd.c:2284 parser/parse_utilcmd.c:2291 +#: parser/parse_utilcmd.c:2298 parser/parse_utilcmd.c:2375 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "Kan inte skapa en primärnyckel eller ett unikt villkor med hjälp av ett sÃ¥dant index." -#: parser/parse_utilcmd.c:2299 +#: parser/parse_utilcmd.c:2290 #, c-format msgid "index \"%s\" contains expressions" msgstr "index \"%s\" innehÃ¥ller uttryck" -#: parser/parse_utilcmd.c:2306 +#: parser/parse_utilcmd.c:2297 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\" är ett partiellt index" -#: parser/parse_utilcmd.c:2318 +#: parser/parse_utilcmd.c:2309 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\" är ett \"deferrable\" index" -#: parser/parse_utilcmd.c:2319 +#: parser/parse_utilcmd.c:2310 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "Kan inte skapa ett icke-\"deferrable\" integritetsvillkor frÃ¥n ett \"deferrable\" index." -#: parser/parse_utilcmd.c:2383 +#: parser/parse_utilcmd.c:2374 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "index \"%s\" kolumn nummer %d har ingen standard för sorteringsbeteende" -#: parser/parse_utilcmd.c:2540 +#: parser/parse_utilcmd.c:2531 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "kolumn \"%s\" finns med tvÃ¥ gÃ¥nger i primära nyckel-villkoret" -#: parser/parse_utilcmd.c:2546 +#: parser/parse_utilcmd.c:2537 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "kolumn \"%s\" finns med tvÃ¥ gÃ¥nger i unique-villkoret" -#: parser/parse_utilcmd.c:2893 +#: parser/parse_utilcmd.c:2871 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "indexuttryck och predikat kan bara referera till tabellen som indexeras" -#: parser/parse_utilcmd.c:2965 +#: parser/parse_utilcmd.c:2943 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "statistikuttryck kan bara referera till tabellen som är refererad" -#: parser/parse_utilcmd.c:3008 +#: parser/parse_utilcmd.c:2986 #, c-format msgid "rules on materialized views are not supported" msgstr "regler pÃ¥ materialiserade vyer stöds inte" -#: parser/parse_utilcmd.c:3071 +#: parser/parse_utilcmd.c:3046 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "WHERE-villkor i regel kan inte innehÃ¥lla referenser till andra relationer" -#: parser/parse_utilcmd.c:3144 +#: parser/parse_utilcmd.c:3118 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "regler med WHERE-villkor kan bara innehÃ¥lla SELECT-, INSERT-, UPDATE- eller DELETE-handlingar" -#: parser/parse_utilcmd.c:3162 parser/parse_utilcmd.c:3263 -#: rewrite/rewriteHandler.c:513 rewrite/rewriteManip.c:1018 +#: parser/parse_utilcmd.c:3136 parser/parse_utilcmd.c:3237 +#: rewrite/rewriteHandler.c:544 rewrite/rewriteManip.c:1096 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "UNION-/INTERSECT-/EXCEPT-satser med villkor är inte implementerat" -#: parser/parse_utilcmd.c:3180 +#: parser/parse_utilcmd.c:3154 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON SELECT-regel kan inte använda OLD" -#: parser/parse_utilcmd.c:3184 +#: parser/parse_utilcmd.c:3158 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON SELECT-regel kan inte använda NEW" -#: parser/parse_utilcmd.c:3193 +#: parser/parse_utilcmd.c:3167 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON INSERT-regel kan inte använda OLD" -#: parser/parse_utilcmd.c:3199 +#: parser/parse_utilcmd.c:3173 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON DELETE-regel kan inte använda NEW" -#: parser/parse_utilcmd.c:3227 +#: parser/parse_utilcmd.c:3201 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "kan inte referera till OLD i WITH-frÃ¥ga" -#: parser/parse_utilcmd.c:3234 +#: parser/parse_utilcmd.c:3208 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "kan inte referera till NEW i WITH-frÃ¥ga" -#: parser/parse_utilcmd.c:3688 +#: parser/parse_utilcmd.c:3664 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "felplacerad DEFERRABLE-klausul" -#: parser/parse_utilcmd.c:3693 parser/parse_utilcmd.c:3708 +#: parser/parse_utilcmd.c:3669 parser/parse_utilcmd.c:3684 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "multipla DEFERRABLE/NOT DEFERRABLE-klausuler tillÃ¥ts inte" -#: parser/parse_utilcmd.c:3703 +#: parser/parse_utilcmd.c:3679 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "felplacerad NOT DEFERRABLE-klausul" -#: parser/parse_utilcmd.c:3724 +#: parser/parse_utilcmd.c:3700 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "felplacerad INITIALLY DEFERRED-klausul" -#: parser/parse_utilcmd.c:3729 parser/parse_utilcmd.c:3755 +#: parser/parse_utilcmd.c:3705 parser/parse_utilcmd.c:3731 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "multipla INITIALLY IMMEDIATE/DEFERRED-klausuler tillÃ¥ts inte" -#: parser/parse_utilcmd.c:3750 +#: parser/parse_utilcmd.c:3726 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "felplacerad klausul INITIALLY IMMEDIATE" -#: parser/parse_utilcmd.c:3941 +#: parser/parse_utilcmd.c:3919 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "CREATE anger ett schema (%s) som skiljer sig frÃ¥n det som skapas (%s)" -#: parser/parse_utilcmd.c:3976 +#: parser/parse_utilcmd.c:3954 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\" är inte en partitionerad tabell" -#: parser/parse_utilcmd.c:3983 +#: parser/parse_utilcmd.c:3961 #, c-format msgid "table \"%s\" is not partitioned" msgstr "tabell \"%s\" är inte partitionerad" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:3968 #, c-format msgid "index \"%s\" is not partitioned" msgstr "index \"%s\" är inte partitionerad" -#: parser/parse_utilcmd.c:4030 +#: parser/parse_utilcmd.c:4008 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "en hash-partitionerad tabell fÃ¥r inte ha en standardpartition" -#: parser/parse_utilcmd.c:4047 +#: parser/parse_utilcmd.c:4025 #, c-format msgid "invalid bound specification for a hash partition" msgstr "ogiltig gränsangivelse för hash-partition" -#: parser/parse_utilcmd.c:4053 partitioning/partbounds.c:4824 +#: parser/parse_utilcmd.c:4031 partitioning/partbounds.c:4802 #, c-format msgid "modulus for hash partition must be an integer value greater than zero" msgstr "modulo för hash-partition vara ett heltalsvärde större än noll" -#: parser/parse_utilcmd.c:4060 partitioning/partbounds.c:4832 +#: parser/parse_utilcmd.c:4038 partitioning/partbounds.c:4810 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "rest för hash-partition mÃ¥ste vara lägre än modulo" -#: parser/parse_utilcmd.c:4073 +#: parser/parse_utilcmd.c:4051 #, c-format msgid "invalid bound specification for a list partition" msgstr "ogiltig gränsangivelse för listpartition" -#: parser/parse_utilcmd.c:4126 +#: parser/parse_utilcmd.c:4104 #, c-format msgid "invalid bound specification for a range partition" msgstr "ogiltig gränsangivelse för range-partition" -#: parser/parse_utilcmd.c:4132 +#: parser/parse_utilcmd.c:4110 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROM mÃ¥ste ge exakt ett värde per partitionerande kolumn" -#: parser/parse_utilcmd.c:4136 +#: parser/parse_utilcmd.c:4114 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TO mÃ¥ste ge exakt ett värde per partitionerande kolumn" -#: parser/parse_utilcmd.c:4250 +#: parser/parse_utilcmd.c:4228 #, c-format msgid "cannot specify NULL in range bound" msgstr "kan inte ange NULL i range-gräns" -#: parser/parse_utilcmd.c:4299 +#: parser/parse_utilcmd.c:4277 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "varje gräns efter MAXVALUE mÃ¥ste ocksÃ¥ vara MAXVALUE" -#: parser/parse_utilcmd.c:4306 +#: parser/parse_utilcmd.c:4284 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "varje gräns efter MINVALUE mÃ¥ste ocksÃ¥ vara MINVALUE" -#: parser/parse_utilcmd.c:4349 +#: parser/parse_utilcmd.c:4327 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "angivet värde kan inte typomvandlas till typ %s för kolumn \"%s\"" -#: parser/parser.c:247 +#: parser/parser.c:273 msgid "UESCAPE must be followed by a simple string literal" msgstr "UESCAPE mÃ¥ste följas av en enkel stränglitteral" -#: parser/parser.c:252 +#: parser/parser.c:278 msgid "invalid Unicode escape character" msgstr "ogiltigt Unicode-escapetecken" -#: parser/parser.c:321 scan.l:1338 +#: parser/parser.c:347 scan.l:1393 #, c-format msgid "invalid Unicode escape value" msgstr "ogiltigt Unicode-escapevärde" -#: parser/parser.c:468 scan.l:684 utils/adt/varlena.c:6529 +#: parser/parser.c:494 scan.l:716 utils/adt/varlena.c:6640 #, c-format msgid "invalid Unicode escape" msgstr "ogiltig Unicode-escapesekvens" -#: parser/parser.c:469 +#: parser/parser.c:495 #, c-format msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Unicode-escapesekvenser mÃ¥ste vara \\XXXX eller \\+XXXXXX." -#: parser/parser.c:497 scan.l:645 scan.l:661 scan.l:677 -#: utils/adt/varlena.c:6554 +#: parser/parser.c:523 scan.l:677 scan.l:693 scan.l:709 +#: utils/adt/varlena.c:6665 #, c-format msgid "invalid Unicode surrogate pair" msgstr "ogiltigt Unicode-surrogatpar" @@ -18547,89 +19513,89 @@ msgstr "ogiltigt Unicode-surrogatpar" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "identifierare \"%s\" kommer trunkeras till \"%.*s\"" -#: partitioning/partbounds.c:2933 +#: partitioning/partbounds.c:2920 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "partition \"%s\" stÃ¥r i konflikt med existerande default-partition \"%s\"" -#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 -#: partitioning/partbounds.c:3026 +#: partitioning/partbounds.c:2972 partitioning/partbounds.c:2991 +#: partitioning/partbounds.c:3013 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "varje hash-partition-modulo mÃ¥ste vara en faktror av näste högre modulo" -#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 +#: partitioning/partbounds.c:2973 partitioning/partbounds.c:3014 #, c-format msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." msgstr "Ny modulon %d är inte en faktor av %d som är modulo för den existerande partitionen \"%s\"." -#: partitioning/partbounds.c:3005 +#: partitioning/partbounds.c:2992 #, c-format msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." msgstr "Ny modulon %d är inte delbar med %d som är modulo för den existerande paritionen \"%s\"." -#: partitioning/partbounds.c:3140 +#: partitioning/partbounds.c:3127 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "tom intervallsgräns angiven för partition \"%s\"" -#: partitioning/partbounds.c:3142 +#: partitioning/partbounds.c:3129 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." -msgstr "Angiven lägre gräns %s är större än eller lika med övre gräns %s." +msgstr "Angiven undre gräns %s är större än eller lika med övre gräns %s." -#: partitioning/partbounds.c:3254 +#: partitioning/partbounds.c:3237 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "partition \"%s\" skulle överlappa partition \"%s\"" -#: partitioning/partbounds.c:3371 +#: partitioning/partbounds.c:3354 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "hoppade över skanning av främmand tabell \"%s\" som er en partition för standardpartitionen \"%s\"" -#: partitioning/partbounds.c:4828 +#: partitioning/partbounds.c:4806 #, c-format msgid "remainder for hash partition must be an integer value greater than or equal to zero" msgstr "rest för hash-partition mÃ¥ste vara ett heltalsvärde större än eller lika med noll" -#: partitioning/partbounds.c:4852 +#: partitioning/partbounds.c:4830 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\" är inte en hash-partitionerad tabell" -#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 +#: partitioning/partbounds.c:4841 partitioning/partbounds.c:4958 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "antalet partitioneringskolumner (%d) stämmer inte med antalet partioneringsnycklas som angivits (%d)" -#: partitioning/partbounds.c:4885 +#: partitioning/partbounds.c:4863 #, c-format msgid "column %d of the partition key has type %s, but supplied value is of type %s" msgstr "kolumn %d i partitioneringsnyckeln har typ %s men använt värde har typ %s" -#: partitioning/partbounds.c:4917 +#: partitioning/partbounds.c:4895 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "kolumn %d i partitioneringsnyckeln har typ \"%s\" men använt värde har typ \"%s\"" -#: port/pg_sema.c:209 port/pg_shmem.c:695 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:695 +#: port/pg_sema.c:209 port/pg_shmem.c:717 port/posix_sema.c:209 +#: port/sysv_sema.c:329 port/sysv_shmem.c:717 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "kunde inte göra stat() pÃ¥ datakatalog \"%s\": %m" -#: port/pg_shmem.c:227 port/sysv_shmem.c:227 +#: port/pg_shmem.c:224 port/sysv_shmem.c:224 #, c-format msgid "could not create shared memory segment: %m" msgstr "kunde inte skapa delat minnessegment: %m" -#: port/pg_shmem.c:228 port/sysv_shmem.c:228 +#: port/pg_shmem.c:225 port/sysv_shmem.c:225 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "Misslyckade systemanropet var semget(key=%lu, size=%zu, 0%o)." -#: port/pg_shmem.c:232 port/sysv_shmem.c:232 +#: port/pg_shmem.c:229 port/sysv_shmem.c:229 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" @@ -18638,7 +19604,7 @@ msgstr "" "Felet betyder vanligen att PostgreSQLs begäran av delat minnessegment överskred kärnans SHMMAX-parameter eller möjligen att det är lägre än kärnans SHMMIN-parameter.\n" "PostgreSQLs dokumentation innehÃ¥ller mer information om konfigueration av delat minne." -#: port/pg_shmem.c:239 port/sysv_shmem.c:239 +#: port/pg_shmem.c:236 port/sysv_shmem.c:236 #, c-format msgid "" "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" @@ -18647,7 +19613,7 @@ msgstr "" "Felet betyder vanligen att PostgreSQLs begäran av delat minnessegment överskred kärnans SHMALL-parameter. Du kan behöva rekonfigurera kärnan med ett större SHMALL.\n" "PostgreSQLs dokumentation innehÃ¥ller mer information om konfigueration av delat minne." -#: port/pg_shmem.c:245 port/sysv_shmem.c:245 +#: port/pg_shmem.c:242 port/sysv_shmem.c:242 #, c-format msgid "" "This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" @@ -18656,54 +19622,59 @@ msgstr "" "Felet betyder *inte* att diskutrymmet tagit slut. Felet sker aningen om alla tillgängliga ID-nummer för delat minne tagit slut och dÃ¥ behöver du öka kärnans SHMMNI-parameter eller för att systemets totala gräns för delat minne ha nÃ¥tts.\n" "PostgreSQLs dokumentation innehÃ¥ller mer information om konfigueration av delat minne." -#: port/pg_shmem.c:633 port/sysv_shmem.c:633 +#: port/pg_shmem.c:584 port/sysv_shmem.c:584 port/win32_shmem.c:646 +#, c-format +msgid "\"huge_page_size\" must be 0 on this platform." +msgstr "\"huge_page_size\" mÃ¥ste vara 0 pÃ¥ denna plattform." + +#: port/pg_shmem.c:655 port/sysv_shmem.c:655 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "kunde inte mappa anonymt delat minne: %m" -#: port/pg_shmem.c:635 port/sysv_shmem.c:635 +#: port/pg_shmem.c:657 port/sysv_shmem.c:657 #, c-format -msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." -msgstr "Detta fel betyder vanligtvis att PostgreSQL:s begäran av delat minnessegment överskrider mängden tillgängligt minne, swap eller stora sidor. För att minska begärd storlek (nu %zu byte) minska PostgreSQL:s användning av delat minne t.ex. genom att dra ner pÃ¥ shared_buffers eller max_connections." +msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing \"shared_buffers\" or \"max_connections\"." +msgstr "Detta fel betyder vanligtvis att PostgreSQL:s begäran av delat minnessegment överskrider mängden tillgängligt minne, swap eller stora sidor. För att minska begärd storlek (nu %zu byte) minska PostgreSQL:s användning av delat minne t.ex. genom att dra ner pÃ¥ \"shared_buffers\" eller \"max_connections\"." -#: port/pg_shmem.c:703 port/sysv_shmem.c:703 +#: port/pg_shmem.c:725 port/sysv_shmem.c:725 #, c-format msgid "huge pages not supported on this platform" msgstr "stora sidor stöds inte pÃ¥ denna plattform" -#: port/pg_shmem.c:710 port/sysv_shmem.c:710 +#: port/pg_shmem.c:732 port/sysv_shmem.c:732 #, c-format -msgid "huge pages not supported with the current shared_memory_type setting" -msgstr "stora sidor stöds inte vid nuvarande inställning av shared_memory_type" +msgid "huge pages not supported with the current \"shared_memory_type\" setting" +msgstr "stora sidor stöds inte vid nuvarande inställning av \"shared_memory_type\"" -#: port/pg_shmem.c:770 port/sysv_shmem.c:770 utils/init/miscinit.c:1187 +#: port/pg_shmem.c:798 port/sysv_shmem.c:798 utils/init/miscinit.c:1401 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "redan existerande delat minnesblock (nyckel %lu, ID %lu) används fortfarande" -#: port/pg_shmem.c:773 port/sysv_shmem.c:773 utils/init/miscinit.c:1189 +#: port/pg_shmem.c:801 port/sysv_shmem.c:801 utils/init/miscinit.c:1403 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "Stäng ner gamla serverprocesser som hör ihop med datakatalogen \"%s\"." -#: port/sysv_sema.c:124 +#: port/sysv_sema.c:126 #, c-format msgid "could not create semaphores: %m" msgstr "kan inte skapa semafor: %m" -#: port/sysv_sema.c:125 +#: port/sysv_sema.c:127 #, c-format msgid "Failed system call was semget(%lu, %d, 0%o)." msgstr "Misslyckade systemanropet var semget(%lu, %d, 0%o)." -#: port/sysv_sema.c:129 +#: port/sysv_sema.c:131 #, c-format msgid "" -"This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its max_connections parameter.\n" +"This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its \"max_connections\" parameter.\n" "The PostgreSQL documentation contains more information about configuring your system for PostgreSQL." -msgstr "Detta fel betyder *inte* att disken blivit full. Detta fel kommer när systemgränsen för maximalt antal semaforvektorer (SEMMNI) överskridits eller när systemets globala maximum för semaforer (SEMMNS) överskridits. Du behöver öka respektive kernel-parameter. Alternativt kan du minska PostgreSQL:s användning av semaforer genom att dra ner pÃ¥ parametern max_connections. PostgreSQL:s dokumentation innehÃ¥ller mer information om hur du konfigurerar systemet för PostgreSQL." +msgstr "Detta fel betyder *inte* att disken blivit full. Detta fel kommer när systemgränsen för maximalt antal semaforvektorer (SEMMNI) överskridits eller när systemets globala maximum för semaforer (SEMMNS) överskridits. Du behöver öka respektive kernel-parameter. Alternativt kan du minska PostgreSQL:s användning av semaforer genom att dra ner pÃ¥ parametern \"max_connections\". PostgreSQL:s dokumentation innehÃ¥ller mer information om hur du konfigurerar systemet för PostgreSQL." -#: port/sysv_sema.c:159 +#: port/sysv_sema.c:161 #, c-format msgid "You possibly need to raise your kernel's SEMVMX value to be at least %d. Look into the PostgreSQL documentation for details." msgstr "Du kan behöva öka kärnans SEMVMX-värde till minst %d. Se PostgreSQL:s dokumentation för mer information." @@ -18733,12 +19704,12 @@ msgstr "skrev krashdump till fil \"%s\".\n" msgid "could not write crash dump to file \"%s\": error code %lu\n" msgstr "kunde inte skriva krashdump till fil \"%s\": felkod %lu\n" -#: port/win32/signal.c:206 +#: port/win32/signal.c:240 #, c-format msgid "could not create signal listener pipe for PID %d: error code %lu" msgstr "kunde inte skapa signallyssnarrör (pipe) för PID %d: felkod %lu" -#: port/win32/signal.c:261 +#: port/win32/signal.c:295 #, c-format msgid "could not create signal listener pipe: error code %lu; retrying\n" msgstr "kunde inte skapa signallyssnar-pipe: felkod %lu; försöker igen\n" @@ -18763,8 +19734,8 @@ msgstr "kunde inte lÃ¥sa upp semafor: felkod %lu" msgid "could not try-lock semaphore: error code %lu" msgstr "kunde inte utföra \"try-lock\" pÃ¥ semafor: felkod %lu" -#: port/win32_shmem.c:144 port/win32_shmem.c:159 port/win32_shmem.c:171 -#: port/win32_shmem.c:187 +#: port/win32_shmem.c:146 port/win32_shmem.c:161 port/win32_shmem.c:173 +#: port/win32_shmem.c:189 #, c-format msgid "could not enable user right \"%s\": error code %lu" msgstr "kunde inte aktivera användarrättighet \"%s\": felkod %lu" @@ -18772,2469 +19743,2729 @@ msgstr "kunde inte aktivera användarrättighet \"%s\": felkod %lu" #. translator: This is a term from Windows and should be translated to #. match the Windows localization. #. -#: port/win32_shmem.c:150 port/win32_shmem.c:159 port/win32_shmem.c:171 -#: port/win32_shmem.c:182 port/win32_shmem.c:184 port/win32_shmem.c:187 +#: port/win32_shmem.c:152 port/win32_shmem.c:161 port/win32_shmem.c:173 +#: port/win32_shmem.c:184 port/win32_shmem.c:186 port/win32_shmem.c:189 msgid "Lock pages in memory" msgstr "LÃ¥s sidor i minnet" -#: port/win32_shmem.c:152 port/win32_shmem.c:160 port/win32_shmem.c:172 -#: port/win32_shmem.c:188 +#: port/win32_shmem.c:154 port/win32_shmem.c:162 port/win32_shmem.c:174 +#: port/win32_shmem.c:190 #, c-format msgid "Failed system call was %s." msgstr "Misslyckat systemanrop var %s." -#: port/win32_shmem.c:182 +#: port/win32_shmem.c:184 #, c-format msgid "could not enable user right \"%s\"" msgstr "kunde inte aktivera användarrättighet \"%s\"" -#: port/win32_shmem.c:183 +#: port/win32_shmem.c:185 #, c-format msgid "Assign user right \"%s\" to the Windows user account which runs PostgreSQL." msgstr "Sätt användarrättighet \"%s\" pÃ¥ Windows-användarkontot som kör PostgreSQL." -#: port/win32_shmem.c:241 +#: port/win32_shmem.c:244 #, c-format msgid "the processor does not support large pages" msgstr "processorn stöder inte stora sidor" -#: port/win32_shmem.c:310 port/win32_shmem.c:346 port/win32_shmem.c:364 +#: port/win32_shmem.c:313 port/win32_shmem.c:349 port/win32_shmem.c:374 #, c-format msgid "could not create shared memory segment: error code %lu" msgstr "kunde inte skapa delat minnessegment: felkod %lu" -#: port/win32_shmem.c:311 +#: port/win32_shmem.c:314 #, c-format msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." msgstr "Misslyckade systemanropet var CreateFileMapping(size=%zu, name=%s)." -#: port/win32_shmem.c:336 +#: port/win32_shmem.c:339 #, c-format msgid "pre-existing shared memory block is still in use" msgstr "redan existerande delat minnesblock används fortfarande" -#: port/win32_shmem.c:337 +#: port/win32_shmem.c:340 #, c-format msgid "Check if there are any old server processes still running, and terminate them." msgstr "Kontrollera om det finns nÃ¥gra gamla serverprocesser som fortfarande kör och stäng ner dem." -#: port/win32_shmem.c:347 +#: port/win32_shmem.c:350 #, c-format msgid "Failed system call was DuplicateHandle." msgstr "Misslyckat systemanrop var DuplicateHandle." -#: port/win32_shmem.c:365 +#: port/win32_shmem.c:375 #, c-format msgid "Failed system call was MapViewOfFileEx." msgstr "Misslyckat systemanrop var MapViewOfFileEx." -#: postmaster/autovacuum.c:404 -#, c-format -msgid "could not fork autovacuum launcher process: %m" -msgstr "kunde inte starta autovacuum-process: %m" - -#: postmaster/autovacuum.c:752 +#: postmaster/autovacuum.c:686 #, c-format msgid "autovacuum worker took too long to start; canceled" msgstr "autovacuum-arbetaren tog för lÃ¥ng tid pÃ¥ sig att starta; avbruten" -#: postmaster/autovacuum.c:1482 -#, c-format -msgid "could not fork autovacuum worker process: %m" -msgstr "kunde inte starta autovacuum-arbetsprocess: %m" - -#: postmaster/autovacuum.c:2265 +#: postmaster/autovacuum.c:2203 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "autovacuum: slänger övergiven temptabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2490 +#: postmaster/autovacuum.c:2439 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "automatisk vacuum av tabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2493 +#: postmaster/autovacuum.c:2442 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "automatisk analys av tabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2686 +#: postmaster/autovacuum.c:2636 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "processar arbetspost för relation \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3297 +#: postmaster/autovacuum.c:3254 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "autovacuum har inte startats pÃ¥ grund av en felkonfigurering" -#: postmaster/autovacuum.c:3298 +#: postmaster/autovacuum.c:3255 #, c-format msgid "Enable the \"track_counts\" option." msgstr "SlÃ¥ pÃ¥ flaggan \"track_counts\"." -#: postmaster/bgworker.c:256 +#: postmaster/bgworker.c:260 #, c-format msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" msgstr "inkonsistent tillstÃ¥nd i bakgrundsarbetare (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:666 +#: postmaster/bgworker.c:651 #, c-format msgid "background worker \"%s\": background workers without shared memory access are not supported" msgstr "bakgrundsarbetare \"%s\": bakgrundsarbetare utan access till delat minne stöds inte" -#: postmaster/bgworker.c:677 +#: postmaster/bgworker.c:662 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "bakgrundsarbetare \"%s\" kan inte fÃ¥ databasaccess om den startar när postmaster startar" -#: postmaster/bgworker.c:691 +#: postmaster/bgworker.c:676 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "bakgrundsarbetare \"%s\": ogiltigt omstartsintervall" -#: postmaster/bgworker.c:706 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "bakgrundsarbetare \"%s\": parallella arbetare kan inte konfigureras för omstart" -#: postmaster/bgworker.c:730 tcop/postgres.c:3215 +#: postmaster/bgworker.c:715 tcop/postgres.c:3312 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "terminerar bakgrundsarbetare \"%s\" pga administratörskommando" -#: postmaster/bgworker.c:887 +#: postmaster/bgworker.c:888 #, c-format -msgid "background worker \"%s\": must be registered in shared_preload_libraries" -msgstr "bakgrundsarbetare \"%s\": mÃ¥ste vara registrerad i shared_preload_libraries" +msgid "background worker \"%s\": must be registered in \"shared_preload_libraries\"" +msgstr "bakgrundsarbetare \"%s\": mÃ¥ste vara registrerad i \"shared_preload_libraries\"" -#: postmaster/bgworker.c:899 +#: postmaster/bgworker.c:911 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "bakgrundsarbetare \"%s\": bara dynamiska bakgrundsarbetare kan be om notifiering" -#: postmaster/bgworker.c:914 +#: postmaster/bgworker.c:926 #, c-format msgid "too many background workers" msgstr "för mÃ¥nga bakgrundsarbetare" -#: postmaster/bgworker.c:915 +#: postmaster/bgworker.c:927 #, c-format msgid "Up to %d background worker can be registered with the current settings." msgid_plural "Up to %d background workers can be registered with the current settings." msgstr[0] "Upp till %d bakgrundsarbetare kan registreras med nuvarande inställning." msgstr[1] "Upp till %d bakgrundsarbetare kan registreras med nuvarande inställning." -#: postmaster/bgworker.c:919 +#: postmaster/bgworker.c:931 postmaster/checkpointer.c:445 #, c-format -msgid "Consider increasing the configuration parameter \"max_worker_processes\"." -msgstr "Överväg att öka konfigurationsparametern \"max_worker_processes\"." +msgid "Consider increasing the configuration parameter \"%s\"." +msgstr "Överväg att öka konfigurationsparametern \"%s\"." -#: postmaster/checkpointer.c:432 +#: postmaster/checkpointer.c:441 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" msgstr[0] "checkpoint:s sker för ofta (%d sekund emellan)" msgstr[1] "checkpoint:s sker för ofta (%d sekunder emellan)" -#: postmaster/checkpointer.c:436 -#, c-format -msgid "Consider increasing the configuration parameter \"max_wal_size\"." -msgstr "Överväg att öka konfigurationsparametern \"max_wal_size\"." - -#: postmaster/checkpointer.c:1060 +#: postmaster/checkpointer.c:1067 #, c-format msgid "checkpoint request failed" msgstr "checkpoint-behgäran misslyckades" -#: postmaster/checkpointer.c:1061 +#: postmaster/checkpointer.c:1068 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Se senaste meddelanden i serverloggen för mer information." -#: postmaster/pgarch.c:423 +#: postmaster/launch_backend.c:381 +#, c-format +msgid "could not execute server process \"%s\": %m" +msgstr "kunde inte köra serverprocess \"%s\": %m" + +#: postmaster/launch_backend.c:434 +#, c-format +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "kunde inte skapa fil-mapping för backend-parametrar: felkod %lu" + +#: postmaster/launch_backend.c:442 +#, c-format +msgid "could not map backend parameter memory: error code %lu" +msgstr "kunde inte mappa minne för backend-parametrar: felkod %lu" + +#: postmaster/launch_backend.c:459 +#, c-format +msgid "subprocess command line too long" +msgstr "subprocessens kommando är för lÃ¥ngt" + +#: postmaster/launch_backend.c:477 +#, c-format +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "Anrop till CreateProcess() misslyckades: %m (felkod %lu)" + +#: postmaster/launch_backend.c:504 +#, c-format +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "kunde inte avmappa vy för backend:ens parameterfil: felkod %lu" + +#: postmaster/launch_backend.c:508 +#, c-format +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "kunde inte stänga \"handle\" till backend:ens parameterfil: felkod %lu" + +#: postmaster/launch_backend.c:530 +#, c-format +msgid "giving up after too many tries to reserve shared memory" +msgstr "ger upp efter för mÃ¥nga försök att reservera delat minne" + +#: postmaster/launch_backend.c:531 +#, c-format +msgid "This might be caused by ASLR or antivirus software." +msgstr "Detta kan orsakas av ASLR eller antivirusprogram." + +#: postmaster/launch_backend.c:834 +#, c-format +msgid "could not duplicate socket %d for use in backend: error code %d" +msgstr "kunde inte duplicera uttag (socket) %d för att använda i backend: felkod %d" + +#: postmaster/launch_backend.c:866 +#, c-format +msgid "could not create inherited socket: error code %d\n" +msgstr "kunde inte skapa ärvt uttag (socket): felkod %d\n" + +#: postmaster/launch_backend.c:895 +#, c-format +msgid "could not open backend variables file \"%s\": %m\n" +msgstr "kunde inte öppna bakändans variabelfil \"%s\": %m\n" + +#: postmaster/launch_backend.c:901 +#, c-format +msgid "could not read from backend variables file \"%s\": %m\n" +msgstr "kunde inte läsa frÃ¥n bakändans variabelfil \"%s\": %m\n" + +#: postmaster/launch_backend.c:912 #, c-format -msgid "archive_mode enabled, yet archiving is not configured" -msgstr "archive_mode är pÃ¥slagen, men ändÃ¥ är arkivering inte konfigurerad" +msgid "could not read startup data from backend variables file \"%s\": %m\n" +msgstr "kunde inte uppstartsdata frÃ¥n bakändans variabelfil \"%s\": %m\n" -#: postmaster/pgarch.c:445 +#: postmaster/launch_backend.c:924 +#, c-format +msgid "could not remove file \"%s\": %m\n" +msgstr "kunde inte ta bort fil \"%s\": %m\n" + +#: postmaster/launch_backend.c:940 +#, c-format +msgid "could not map view of backend variables: error code %lu\n" +msgstr "kunde inte mappa in vy för bakgrundsvariabler: felkod %lu\n" + +#: postmaster/launch_backend.c:959 +#, c-format +msgid "could not unmap view of backend variables: error code %lu\n" +msgstr "kunde inte avmappa vy för bakgrundsvariabler: felkod %lu\n" + +#: postmaster/launch_backend.c:966 +#, c-format +msgid "could not close handle to backend parameter variables: error code %lu\n" +msgstr "kunde inte stänga \"handle\" till backend:ens parametervariabler: felkod %lu\n" + +#: postmaster/pgarch.c:428 +#, c-format +msgid "\"archive_mode\" enabled, yet archiving is not configured" +msgstr "\"archive_mode\" är pÃ¥slagen, men ändÃ¥ är arkivering inte konfigurerad" + +#: postmaster/pgarch.c:452 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "tog bort övergiven arkivstatusfil \"%s\": %m" -#: postmaster/pgarch.c:455 +#: postmaster/pgarch.c:462 #, c-format msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" msgstr "borttagning av övergiven arkivstatusfil \"%s\" misslyckades för mÃ¥nga gÃ¥nger, kommer försöka igen senare" -#: postmaster/pgarch.c:491 +#: postmaster/pgarch.c:498 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "arkivering av write-ahead-logg-fil \"%s\" misslyckades för mÃ¥nga gÃ¥nger, kommer försöka igen senare" -#: postmaster/pgarch.c:798 +#: postmaster/pgarch.c:879 postmaster/pgarch.c:918 +#, c-format +msgid "both \"archive_command\" and \"archive_library\" set" +msgstr "bÃ¥de \"archive_command\" och \"archive_library\" är satt" + +#: postmaster/pgarch.c:880 postmaster/pgarch.c:919 +#, c-format +msgid "Only one of \"archive_command\", \"archive_library\" may be set." +msgstr "Bara en av \"archive_command\" och \"archive_library\" fÃ¥r sättas." + +#: postmaster/pgarch.c:897 #, c-format msgid "restarting archiver process because value of \"archive_library\" was changed" msgstr "startar om arkiveringsprocess dÃ¥ värdet pÃ¥ \"archive_library\" har ändrats" -#: postmaster/pgarch.c:831 +#: postmaster/pgarch.c:934 #, c-format msgid "archive modules have to define the symbol %s" msgstr "arkiveringsmoduler mÃ¥ste definiera symbolen %s" -#: postmaster/pgarch.c:837 +#: postmaster/pgarch.c:940 #, c-format msgid "archive modules must register an archive callback" msgstr "arkiveringsmoduler mÃ¥ste registrera en arkiverings-callback" -#: postmaster/postmaster.c:744 +#: postmaster/postmaster.c:661 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: ogiltigt argument till flagga -f: \"%s\"\n" -#: postmaster/postmaster.c:823 +#: postmaster/postmaster.c:734 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: ogiltigt argument till flagga -t: \"%s\"\n" -#: postmaster/postmaster.c:874 +#: postmaster/postmaster.c:757 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: ogiltigt argument: \"%s\"\n" -#: postmaster/postmaster.c:942 +#: postmaster/postmaster.c:825 +#, c-format +msgid "%s: \"superuser_reserved_connections\" (%d) plus \"reserved_connections\" (%d) must be less than \"max_connections\" (%d)\n" +msgstr "%s: \"superuser_reserved_connections\" (%d) plus \"reserved_connections\" (%d) mÃ¥ste vara mindre än \"max_connections\" (%d)\n" + +#: postmaster/postmaster.c:833 #, c-format -msgid "%s: superuser_reserved_connections (%d) must be less than max_connections (%d)\n" -msgstr "%s: superuser_reserved_connections (%d) mÃ¥ste vara mindre än max_connections (%d)\n" +msgid "WAL archival cannot be enabled when \"wal_level\" is \"minimal\"" +msgstr "WAL-arkivering kan inte slÃ¥s pÃ¥ när \"wal_level\" är \"minimal\"" -#: postmaster/postmaster.c:949 +#: postmaster/postmaster.c:836 #, c-format -msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" -msgstr "WAL-arkivering kan inte slÃ¥s pÃ¥ när wal_level är \"minimal\"" +msgid "WAL streaming (\"max_wal_senders\" > 0) requires \"wal_level\" to be \"replica\" or \"logical\"" +msgstr "WAL-strömning (\"max_wal_senders\" > 0) kräver att \"wal_level\" är \"replica\" eller \"logical\"" -#: postmaster/postmaster.c:952 +#: postmaster/postmaster.c:839 #, c-format -msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" -msgstr "WAL-strömning (max_wal_senders > 0) kräver wal_level \"replica\" eller \"logical\"" +msgid "WAL cannot be summarized when \"wal_level\" is \"minimal\"" +msgstr "WAL kan inte summeras när \"wal_level\" är \"minimal\"" -#: postmaster/postmaster.c:960 +#: postmaster/postmaster.c:847 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: ogiltiga datumtokentabeller, det behöver lagas\n" -#: postmaster/postmaster.c:1113 +#: postmaster/postmaster.c:1004 #, c-format msgid "could not create I/O completion port for child queue" msgstr "kunde inte skapa \"I/O completion port\" för barnkö" -#: postmaster/postmaster.c:1178 +#: postmaster/postmaster.c:1069 #, c-format msgid "ending log output to stderr" msgstr "avslutar loggutmatning till stderr" -#: postmaster/postmaster.c:1179 +#: postmaster/postmaster.c:1070 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "Framtida loggutmatning kommer gÃ¥ till logg-destination \"%s\"." -#: postmaster/postmaster.c:1190 +#: postmaster/postmaster.c:1081 #, c-format msgid "starting %s" msgstr "startar %s" -#: postmaster/postmaster.c:1250 +#: postmaster/postmaster.c:1143 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "kunde inte skapa lyssnande uttag (socket) för \"%s\"" -#: postmaster/postmaster.c:1256 +#: postmaster/postmaster.c:1149 #, c-format msgid "could not create any TCP/IP sockets" msgstr "kunde inte skapa TCP/IP-uttag (socket)" -#: postmaster/postmaster.c:1288 +#: postmaster/postmaster.c:1181 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "DNSServiceRegister() misslyckades: felkod %ld" -#: postmaster/postmaster.c:1340 +#: postmaster/postmaster.c:1234 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "kunde inte skapa unix-domän-uttag (socket) i katalog \"%s\"" -#: postmaster/postmaster.c:1346 +#: postmaster/postmaster.c:1240 #, c-format msgid "could not create any Unix-domain sockets" msgstr "kunde inte skapa nÃ¥got Unix-domän-uttag (socket)" -#: postmaster/postmaster.c:1358 +#: postmaster/postmaster.c:1251 #, c-format msgid "no socket created for listening" msgstr "inget uttag (socket) skapat för lyssnande" -#: postmaster/postmaster.c:1389 +#: postmaster/postmaster.c:1282 #, c-format -msgid "%s: could not change permissions of external PID file \"%s\": %s\n" -msgstr "%s: kunde inte ändra rättigheter pÃ¥ extern PID-fil \"%s\": %s\n" +msgid "%s: could not change permissions of external PID file \"%s\": %m\n" +msgstr "%s: kunde inte ändra rättigheter pÃ¥ extern PID-fil \"%s\": %m\n" -#: postmaster/postmaster.c:1393 +#: postmaster/postmaster.c:1286 #, c-format -msgid "%s: could not write external PID file \"%s\": %s\n" -msgstr "%s: kunde inte skriva extern PID-fil \"%s\": %s\n" +msgid "%s: could not write external PID file \"%s\": %m\n" +msgstr "%s: kunde inte skriva extern PID-fil \"%s\": %m\n" -#: postmaster/postmaster.c:1420 utils/init/postinit.c:220 +#. translator: %s is a configuration file +#: postmaster/postmaster.c:1314 utils/init/postinit.c:221 #, c-format -msgid "could not load pg_hba.conf" -msgstr "kunde inte ladda pg_hba.conf" +msgid "could not load %s" +msgstr "kunde inte ladda \"%s\"" -#: postmaster/postmaster.c:1446 +#: postmaster/postmaster.c:1342 #, c-format msgid "postmaster became multithreaded during startup" msgstr "postmaster blev flertrÃ¥dad under uppstart" -#: postmaster/postmaster.c:1447 +#: postmaster/postmaster.c:1343 postmaster/postmaster.c:3684 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Sätt omgivningsvariabeln LC_ALL till en giltig lokal." -#: postmaster/postmaster.c:1548 +#: postmaster/postmaster.c:1442 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: kunde inte hitta min egna körbara fils sökväg" -#: postmaster/postmaster.c:1555 +#: postmaster/postmaster.c:1449 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: kunde inte hitta matchande postgres-binär" -#: postmaster/postmaster.c:1578 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1472 utils/misc/tzparser.c:341 #, c-format msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." msgstr "Detta tyder pÃ¥ en inkomplett PostgreSQL-installation alternativt att filen \"%s\" har flyttats bort frÃ¥n sin korrekta plats." -#: postmaster/postmaster.c:1605 +#: postmaster/postmaster.c:1499 #, c-format msgid "" "%s: could not find the database system\n" "Expected to find it in the directory \"%s\",\n" -"but could not open file \"%s\": %s\n" +"but could not open file \"%s\": %m\n" msgstr "" "%s: kunde inte hitta databassystemet\n" "Förväntade mig att hitta det i katalogen \"%s\",\n" -"men kunde inte öppna filen \"%s\": %s\n" - -#: postmaster/postmaster.c:1782 -#, c-format -msgid "select() failed in postmaster: %m" -msgstr "select() misslyckades i postmaster: %m" +"men kunde inte öppna filen \"%s\": %m\n" -#: postmaster/postmaster.c:1913 +#. translator: %s is SIGKILL or SIGABRT +#: postmaster/postmaster.c:1789 #, c-format -msgid "issuing SIGKILL to recalcitrant children" -msgstr "skickar SIGKILL till motsträviga barn" +msgid "issuing %s to recalcitrant children" +msgstr "skickar %s till motsträviga barn" -#: postmaster/postmaster.c:1934 +#: postmaster/postmaster.c:1811 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "stänger ner omedelbart dÃ¥ datakatalogens lÃ¥sfil är ogiltig" -#: postmaster/postmaster.c:2037 postmaster/postmaster.c:2065 -#, c-format -msgid "incomplete startup packet" -msgstr "ofullständigt startuppaket" - -#: postmaster/postmaster.c:2049 postmaster/postmaster.c:2082 -#, c-format -msgid "invalid length of startup packet" -msgstr "ogiltig längd pÃ¥ startuppaket" - -#: postmaster/postmaster.c:2111 -#, c-format -msgid "failed to send SSL negotiation response: %m" -msgstr "misslyckades att skicka SSL-förhandlingssvar: %m" - -#: postmaster/postmaster.c:2129 -#, c-format -msgid "received unencrypted data after SSL request" -msgstr "tog emot okrypterad data efter SSL-förfrÃ¥gan" - -#: postmaster/postmaster.c:2130 postmaster/postmaster.c:2174 -#, c-format -msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." -msgstr "Detta kan antingen vara en bug i klientens mjukvara eller bevis pÃ¥ ett försök att utföra en attack av typen man-in-the-middle." - -#: postmaster/postmaster.c:2155 -#, c-format -msgid "failed to send GSSAPI negotiation response: %m" -msgstr "misslyckades att skicka GSSAPI-förhandlingssvar: %m" - -#: postmaster/postmaster.c:2173 -#, c-format -msgid "received unencrypted data after GSSAPI encryption request" -msgstr "tog emot okrypterad data efter GSSAPI-krypteringsförfrÃ¥gan" - -#: postmaster/postmaster.c:2197 -#, c-format -msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" -msgstr "inget stöd för framändans protokoll %u.%u: servern stöder %u.0 till %u.%u" - -#: postmaster/postmaster.c:2261 utils/misc/guc.c:7400 utils/misc/guc.c:7436 -#: utils/misc/guc.c:7506 utils/misc/guc.c:8937 utils/misc/guc.c:11970 -#: utils/misc/guc.c:12011 -#, c-format -msgid "invalid value for parameter \"%s\": \"%s\"" -msgstr "ogiltigt värde för parameter \"%s\": \"%s\"" - -#: postmaster/postmaster.c:2264 -#, c-format -msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." -msgstr "Giltiga värden är: \"false\", 0, \"true\", 1, \"database\"." - -#: postmaster/postmaster.c:2309 -#, c-format -msgid "invalid startup packet layout: expected terminator as last byte" -msgstr "ogiltig startpaketlayout: förväntade en terminator som sista byte" - -#: postmaster/postmaster.c:2326 -#, c-format -msgid "no PostgreSQL user name specified in startup packet" -msgstr "inget PostgreSQL-användarnamn angivet i startuppaketet" - -#: postmaster/postmaster.c:2390 -#, c-format -msgid "the database system is starting up" -msgstr "databassystemet startar upp" - -#: postmaster/postmaster.c:2396 -#, c-format -msgid "the database system is not yet accepting connections" -msgstr "databassystemet tar ännu inte emot anslutningar" - -#: postmaster/postmaster.c:2397 -#, c-format -msgid "Consistent recovery state has not been yet reached." -msgstr "Konsistent Ã¥terställningstillstÃ¥nd har ännu inte uppnÃ¥tts." - -#: postmaster/postmaster.c:2401 -#, c-format -msgid "the database system is not accepting connections" -msgstr "databassystemet tar inte emot anslutningar" - -#: postmaster/postmaster.c:2402 -#, c-format -msgid "Hot standby mode is disabled." -msgstr "Hot standby-läge är avstängt." - -#: postmaster/postmaster.c:2407 -#, c-format -msgid "the database system is shutting down" -msgstr "databassystemet stänger ner" - -#: postmaster/postmaster.c:2412 -#, c-format -msgid "the database system is in recovery mode" -msgstr "databassystemet är Ã¥terställningsläge" - -#: postmaster/postmaster.c:2417 storage/ipc/procarray.c:490 -#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 -#, c-format -msgid "sorry, too many clients already" -msgstr "ledsen, för mÃ¥nga klienter" - -#: postmaster/postmaster.c:2504 +#: postmaster/postmaster.c:1874 #, c-format msgid "wrong key in cancel request for process %d" msgstr "fel nyckel i avbrytbegäran för process %d" -#: postmaster/postmaster.c:2516 +#: postmaster/postmaster.c:1886 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "PID %d i avbrytbegäran matchade inte nÃ¥gon process" -#: postmaster/postmaster.c:2770 +#: postmaster/postmaster.c:2106 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "mottog SIGHUP, läser om konfigurationsfiler" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2794 postmaster/postmaster.c:2798 +#: postmaster/postmaster.c:2134 postmaster/postmaster.c:2138 #, c-format msgid "%s was not reloaded" msgstr "%s laddades inte om" -#: postmaster/postmaster.c:2808 +#: postmaster/postmaster.c:2148 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL-konfiguration laddades inte om" -#: postmaster/postmaster.c:2864 +#: postmaster/postmaster.c:2234 #, c-format msgid "received smart shutdown request" msgstr "tog emot förfrÃ¥gan om att stänga ner smart" -#: postmaster/postmaster.c:2905 +#: postmaster/postmaster.c:2275 #, c-format msgid "received fast shutdown request" msgstr "tog emot förfrÃ¥gan om att stänga ner snabbt" -#: postmaster/postmaster.c:2923 +#: postmaster/postmaster.c:2293 #, c-format msgid "aborting any active transactions" msgstr "avbryter aktiva transaktioner" -#: postmaster/postmaster.c:2947 +#: postmaster/postmaster.c:2317 #, c-format msgid "received immediate shutdown request" msgstr "mottog begäran för omedelbar nedstängning" -#: postmaster/postmaster.c:3024 +#: postmaster/postmaster.c:2389 #, c-format msgid "shutdown at recovery target" msgstr "nedstängs vid Ã¥terställningsmÃ¥l" -#: postmaster/postmaster.c:3042 postmaster/postmaster.c:3078 +#: postmaster/postmaster.c:2407 postmaster/postmaster.c:2443 msgid "startup process" msgstr "uppstartprocess" -#: postmaster/postmaster.c:3045 +#: postmaster/postmaster.c:2410 #, c-format msgid "aborting startup due to startup process failure" msgstr "avbryter uppstart pÃ¥ grund av fel i startprocessen" -#: postmaster/postmaster.c:3118 +#: postmaster/postmaster.c:2485 #, c-format msgid "database system is ready to accept connections" msgstr "databassystemet är redo att ta emot anslutningar" -#: postmaster/postmaster.c:3139 +#: postmaster/postmaster.c:2506 msgid "background writer process" msgstr "bakgrundsskrivarprocess" -#: postmaster/postmaster.c:3186 +#: postmaster/postmaster.c:2553 msgid "checkpointer process" msgstr "checkpoint-process" -#: postmaster/postmaster.c:3202 +#: postmaster/postmaster.c:2569 msgid "WAL writer process" msgstr "WAL-skrivarprocess" -#: postmaster/postmaster.c:3217 +#: postmaster/postmaster.c:2584 msgid "WAL receiver process" msgstr "WAL-mottagarprocess" -#: postmaster/postmaster.c:3232 +#: postmaster/postmaster.c:2598 +msgid "WAL summarizer process" +msgstr "WAL-summeringsprocess" + +#: postmaster/postmaster.c:2613 msgid "autovacuum launcher process" msgstr "autovacuum-startprocess" -#: postmaster/postmaster.c:3250 +#: postmaster/postmaster.c:2631 msgid "archiver process" msgstr "arkiveringsprocess" -#: postmaster/postmaster.c:3263 +#: postmaster/postmaster.c:2644 msgid "system logger process" msgstr "system-logg-process" -#: postmaster/postmaster.c:3327 +#: postmaster/postmaster.c:2661 +msgid "slot sync worker process" +msgstr "arbetarprocess för slotsynkronisering" + +#: postmaster/postmaster.c:2717 #, c-format msgid "background worker \"%s\"" msgstr "bakgrundsarbetare \"%s\"" -#: postmaster/postmaster.c:3406 postmaster/postmaster.c:3426 -#: postmaster/postmaster.c:3433 postmaster/postmaster.c:3451 +#: postmaster/postmaster.c:2796 postmaster/postmaster.c:2816 +#: postmaster/postmaster.c:2823 postmaster/postmaster.c:2841 msgid "server process" msgstr "serverprocess" -#: postmaster/postmaster.c:3505 +#: postmaster/postmaster.c:2895 #, c-format msgid "terminating any other active server processes" msgstr "avslutar andra aktiva serverprocesser" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3742 +#: postmaster/postmaster.c:3082 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) avslutade med felkod %d" -#: postmaster/postmaster.c:3744 postmaster/postmaster.c:3756 -#: postmaster/postmaster.c:3766 postmaster/postmaster.c:3777 +#: postmaster/postmaster.c:3084 postmaster/postmaster.c:3096 +#: postmaster/postmaster.c:3106 postmaster/postmaster.c:3117 #, c-format msgid "Failed process was running: %s" msgstr "Misslyckad process körde: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3753 +#: postmaster/postmaster.c:3093 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) terminerades av avbrott 0x%X" -#: postmaster/postmaster.c:3755 postmaster/shell_archive.c:134 -#, c-format -msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "Se C-include-fil \"ntstatus.h\" för en beskrivning av det hexdecimala värdet." - #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3763 +#: postmaster/postmaster.c:3103 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) terminerades av signal %d: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3775 +#: postmaster/postmaster.c:3115 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) avslutade med okänd status %d" -#: postmaster/postmaster.c:3975 +#: postmaster/postmaster.c:3331 #, c-format msgid "abnormal database system shutdown" msgstr "ej normal databasnedstängning" -#: postmaster/postmaster.c:4001 +#: postmaster/postmaster.c:3357 #, c-format msgid "shutting down due to startup process failure" msgstr "stänger ner pÃ¥ grund av fel i startprocessen" -#: postmaster/postmaster.c:4007 +#: postmaster/postmaster.c:3363 #, c-format -msgid "shutting down because restart_after_crash is off" -msgstr "stänger ner dÃ¥ restart_after_crash är av" +msgid "shutting down because \"restart_after_crash\" is off" +msgstr "stänger ner dÃ¥ \"restart_after_crash\" är av" -#: postmaster/postmaster.c:4019 +#: postmaster/postmaster.c:3375 #, c-format msgid "all server processes terminated; reinitializing" msgstr "alla serverprocesser är avslutade; initierar pÃ¥ nytt" -#: postmaster/postmaster.c:4191 postmaster/postmaster.c:5527 -#: postmaster/postmaster.c:5925 +#: postmaster/postmaster.c:3574 postmaster/postmaster.c:3985 +#: postmaster/postmaster.c:4374 #, c-format msgid "could not generate random cancel key" msgstr "kunde inte skapa slumpad avbrytningsnyckel" -#: postmaster/postmaster.c:4253 +#: postmaster/postmaster.c:3607 #, c-format msgid "could not fork new process for connection: %m" msgstr "kunde inte fork():a ny process for uppkoppling: %m" -#: postmaster/postmaster.c:4295 +#: postmaster/postmaster.c:3649 msgid "could not fork new process for connection: " msgstr "kunde inte fork():a ny process for uppkoppling: " -#: postmaster/postmaster.c:4401 -#, c-format -msgid "connection received: host=%s port=%s" -msgstr "ansluting mottagen: värd=%s port=%s" - -#: postmaster/postmaster.c:4406 -#, c-format -msgid "connection received: host=%s" -msgstr "ansluting mottagen: värd=%s" - -#: postmaster/postmaster.c:4643 -#, c-format -msgid "could not execute server process \"%s\": %m" -msgstr "kunde inte köra serverprocess \"%s\": %m" - -#: postmaster/postmaster.c:4701 -#, c-format -msgid "could not create backend parameter file mapping: error code %lu" -msgstr "kunde inte skapa fil-mapping för backend-parametrar: felkod %lu" - -#: postmaster/postmaster.c:4710 -#, c-format -msgid "could not map backend parameter memory: error code %lu" -msgstr "kunde inte mappa minne för backend-parametrar: felkod %lu" - -#: postmaster/postmaster.c:4737 -#, c-format -msgid "subprocess command line too long" -msgstr "subprocessens kommando är för lÃ¥ngt" - -#: postmaster/postmaster.c:4755 -#, c-format -msgid "CreateProcess() call failed: %m (error code %lu)" -msgstr "Anrop till CreateProcess() misslyckades: %m (felkod %lu)" - -#: postmaster/postmaster.c:4782 -#, c-format -msgid "could not unmap view of backend parameter file: error code %lu" -msgstr "kunde inte avmappa vy för backend:ens parameterfil: felkod %lu" - -#: postmaster/postmaster.c:4786 -#, c-format -msgid "could not close handle to backend parameter file: error code %lu" -msgstr "kunde inte stänga \"handle\" till backend:ens parameterfil: felkod %lu" - -#: postmaster/postmaster.c:4808 -#, c-format -msgid "giving up after too many tries to reserve shared memory" -msgstr "ger upp efter för mÃ¥nga försök att reservera delat minne" - -#: postmaster/postmaster.c:4809 +#: postmaster/postmaster.c:3683 #, c-format -msgid "This might be caused by ASLR or antivirus software." -msgstr "Detta kan orsakas av ASLR eller antivirusprogram." +msgid "postmaster became multithreaded" +msgstr "postmaster blev flertrÃ¥dad" -#: postmaster/postmaster.c:4990 -#, c-format -msgid "SSL configuration could not be loaded in child process" -msgstr "SSL-konfigurering kunde inte laddas i barnprocess" - -#: postmaster/postmaster.c:5115 -#, c-format -msgid "Please report this to <%s>." -msgstr "Rapportera gärna detta till <%s>." - -#: postmaster/postmaster.c:5187 +#: postmaster/postmaster.c:3752 #, c-format msgid "database system is ready to accept read-only connections" msgstr "databassystemet är redo att ta emot read-only-anslutningar" -#: postmaster/postmaster.c:5451 -#, c-format -msgid "could not fork startup process: %m" -msgstr "kunde inte starta startup-processen: %m" - -#: postmaster/postmaster.c:5455 -#, c-format -msgid "could not fork archiver process: %m" -msgstr "kunde inte fork:a arkivprocess: %m" - -#: postmaster/postmaster.c:5459 -#, c-format -msgid "could not fork background writer process: %m" -msgstr "kunde inte starta process för bakgrundsskrivare: %m" - -#: postmaster/postmaster.c:5463 -#, c-format -msgid "could not fork checkpointer process: %m" -msgstr "kunde inte fork:a bakgrundsprocess: %m" - -#: postmaster/postmaster.c:5467 -#, c-format -msgid "could not fork WAL writer process: %m" -msgstr "kunde inte fork:a WAL-skrivprocess: %m" - -#: postmaster/postmaster.c:5471 -#, c-format -msgid "could not fork WAL receiver process: %m" -msgstr "kunde inte fork:a WAL-mottagarprocess: %m" - -#: postmaster/postmaster.c:5475 +#: postmaster/postmaster.c:3935 #, c-format -msgid "could not fork process: %m" -msgstr "kunde inte fork:a process: %m" +msgid "could not fork \"%s\" process: %m" +msgstr "kunde inte fork:a \"%s\"-process: %m" -#: postmaster/postmaster.c:5676 postmaster/postmaster.c:5703 +#: postmaster/postmaster.c:4173 postmaster/postmaster.c:4207 #, c-format msgid "database connection requirement not indicated during registration" msgstr "krav pÃ¥ databasanslutning fanns inte med vid registering" -#: postmaster/postmaster.c:5687 postmaster/postmaster.c:5714 +#: postmaster/postmaster.c:4183 postmaster/postmaster.c:4217 #, c-format msgid "invalid processing mode in background worker" msgstr "ogiltigt processläge i bakgrundsarbetare" -#: postmaster/postmaster.c:5799 -#, c-format -msgid "could not fork worker process: %m" -msgstr "kunde inte starta (fork) arbetarprocess: %m" - -#: postmaster/postmaster.c:5911 -#, c-format -msgid "no slot available for new worker process" -msgstr "ingen slot tillgänglig för ny arbetsprocess" - -#: postmaster/postmaster.c:6242 -#, c-format -msgid "could not duplicate socket %d for use in backend: error code %d" -msgstr "kunde inte duplicera uttag (socket) %d för att använda i backend: felkod %d" - -#: postmaster/postmaster.c:6274 -#, c-format -msgid "could not create inherited socket: error code %d\n" -msgstr "kunde inte skapa ärvt uttag (socket): felkod %d\n" - -#: postmaster/postmaster.c:6303 -#, c-format -msgid "could not open backend variables file \"%s\": %s\n" -msgstr "kunde inte öppna bakändans variabelfil \"%s\": %s\n" - -#: postmaster/postmaster.c:6310 +#: postmaster/postmaster.c:4277 #, c-format -msgid "could not read from backend variables file \"%s\": %s\n" -msgstr "kunde inte läsa frÃ¥n bakändans variabelfil \"%s\": %s\n" +msgid "could not fork background worker process: %m" +msgstr "kunde inte fork:a process för bakgrundsarbete: %m" -#: postmaster/postmaster.c:6319 +#: postmaster/postmaster.c:4360 #, c-format -msgid "could not remove file \"%s\": %s\n" -msgstr "kunde inte ta bort fil \"%s\": %s\n" +msgid "no slot available for new background worker process" +msgstr "ingen slot tillgänglig till ny process för bakgrundsarbete" -#: postmaster/postmaster.c:6336 -#, c-format -msgid "could not map view of backend variables: error code %lu\n" -msgstr "kunde inte mappa in vy för bakgrundsvariabler: felkod %lu\n" - -#: postmaster/postmaster.c:6345 -#, c-format -msgid "could not unmap view of backend variables: error code %lu\n" -msgstr "kunde inte avmappa vy för bakgrundsvariabler: felkod %lu\n" - -#: postmaster/postmaster.c:6352 -#, c-format -msgid "could not close handle to backend parameter variables: error code %lu\n" -msgstr "kunde inte stänga \"handle\" till backend:ens parametervariabler: felkod %lu\n" - -#: postmaster/postmaster.c:6526 +#: postmaster/postmaster.c:4623 #, c-format msgid "could not read exit code for process\n" msgstr "kunde inte läsa avslutningskod för process\n" -#: postmaster/postmaster.c:6531 +#: postmaster/postmaster.c:4665 #, c-format msgid "could not post child completion status\n" -msgstr "kunde inte skicka barnets avslutningsstatus\n" - -#: postmaster/shell_archive.c:123 -#, c-format -msgid "archive command failed with exit code %d" -msgstr "arkiveringskommando misslyckades med felkod %d" - -#: postmaster/shell_archive.c:125 postmaster/shell_archive.c:135 -#: postmaster/shell_archive.c:141 postmaster/shell_archive.c:150 -#, c-format -msgid "The failed archive command was: %s" -msgstr "Det misslyckade arkiveringskommandot var: %s" - -#: postmaster/shell_archive.c:132 -#, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "arkiveringskommandot terminerades med avbrott 0x%X" - -#: postmaster/shell_archive.c:139 -#, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "arkiveringskommandot terminerades av signal %d: %s" - -#: postmaster/shell_archive.c:148 -#, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "arkiveringskommandot avslutade med okänd statuskod %d" +msgstr "kunde inte skicka barnets avslutningsstatus\n" -#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 +#: postmaster/syslogger.c:529 postmaster/syslogger.c:1173 #, c-format msgid "could not read from logger pipe: %m" msgstr "kunde inte läsa frÃ¥n loggrör (pipe): %m" -#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 +#: postmaster/syslogger.c:629 postmaster/syslogger.c:643 #, c-format msgid "could not create pipe for syslog: %m" msgstr "kunde inte skapa rör (pipe) för syslog: %m" -#: postmaster/syslogger.c:677 +#: postmaster/syslogger.c:712 #, c-format msgid "could not fork system logger: %m" msgstr "kunde inte fork:a systemloggaren: %m" -#: postmaster/syslogger.c:713 +#: postmaster/syslogger.c:731 #, c-format msgid "redirecting log output to logging collector process" msgstr "omdirigerar loggutmatning till logginsamlingsprocess" -#: postmaster/syslogger.c:714 +#: postmaster/syslogger.c:732 #, c-format msgid "Future log output will appear in directory \"%s\"." msgstr "Framtida loggutmatning kommer dyka upp i katalog \"%s\"." -#: postmaster/syslogger.c:722 +#: postmaster/syslogger.c:740 #, c-format msgid "could not redirect stdout: %m" msgstr "kunde inte omdirigera stdout: %m" -#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 +#: postmaster/syslogger.c:745 postmaster/syslogger.c:762 #, c-format msgid "could not redirect stderr: %m" msgstr "kunde inte omdirigera stderr: %m" -#: postmaster/syslogger.c:1177 +#: postmaster/syslogger.c:1128 #, c-format -msgid "could not write to log file: %s\n" -msgstr "kunde inte skriva till loggfil: %s\n" +msgid "could not write to log file: %m\n" +msgstr "kunde inte skriva till loggfil: %m\n" -#: postmaster/syslogger.c:1295 +#: postmaster/syslogger.c:1246 #, c-format msgid "could not open log file \"%s\": %m" msgstr "kunde inte öppna loggfil \"%s\": %m" -#: postmaster/syslogger.c:1385 +#: postmaster/syslogger.c:1336 #, c-format msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "stänger av automatisk rotation (använd SIGHUP för att slÃ¥ pÃ¥ igen)" -#: regex/regc_pg_locale.c:242 +#: postmaster/walsummarizer.c:740 +#, c-format +msgid "WAL summarization is not progressing" +msgstr "WAL-summering avancerar inte" + +#: postmaster/walsummarizer.c:741 +#, c-format +msgid "Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/%X in memory." +msgstr "Summering krävs till %X/%X men har fastnat vid %X/%X pÃ¥ disk och vid %X/%X i minnet." + +#: postmaster/walsummarizer.c:755 +#, c-format +msgid "still waiting for WAL summarization through %X/%X after %ld second" +msgid_plural "still waiting for WAL summarization through %X/%X after %ld seconds" +msgstr[0] "väntar fortfarande pÃ¥ WAL-summering till %X/%X efter %ld sekund" +msgstr[1] "väntar fortfarande pÃ¥ WAL-summering till %X/%X efter %ld sekunder" + +#: postmaster/walsummarizer.c:760 +#, c-format +msgid "Summarization has reached %X/%X on disk and %X/%X in memory." +msgstr "Summering har nÃ¥tt %X/%X pÃ¥ disk och %X/%X i minnet." + +#: postmaster/walsummarizer.c:1000 +#, c-format +msgid "could not find a valid record after %X/%X" +msgstr "kunde inte hitta en giltig post efter %X/%X" + +#: postmaster/walsummarizer.c:1045 +#, c-format +msgid "could not read WAL from timeline %u at %X/%X: %s" +msgstr "kunde inte läsa WAL frÃ¥n tidslinje %u vid %X/%X: %s" + +#: postmaster/walsummarizer.c:1051 +#, c-format +msgid "could not read WAL from timeline %u at %X/%X" +msgstr "kunde inte läsa WAL frÃ¥n tidslinje %u vid %X/%X" + +#: regex/regc_pg_locale.c:244 #, c-format msgid "could not determine which collation to use for regular expression" msgstr "kunde inte bestämma vilken jämförelse (collation) som skall användas för reguljära uttryck" -#: regex/regc_pg_locale.c:265 +#: regex/regc_pg_locale.c:262 #, c-format msgid "nondeterministic collations are not supported for regular expressions" msgstr "ickedeterministiska jämförelser (collation) stöds inte för reguljära uttryck" -#: repl_gram.y:303 repl_gram.y:335 +#: repl_gram.y:318 repl_gram.y:359 #, c-format msgid "invalid timeline %u" msgstr "ogiltig tidslinje %u" -#: repl_scanner.l:142 +#: repl_scanner.l:154 msgid "invalid streaming start location" msgstr "ogiltig startposition för strömning" -#: repl_scanner.l:199 scan.l:724 -msgid "unterminated quoted string" -msgstr "icketerminerad citerad sträng" +#: replication/libpqwalreceiver/libpqwalreceiver.c:267 +#: replication/libpqwalreceiver/libpqwalreceiver.c:358 +#, c-format +msgid "password is required" +msgstr "lösenord krävs" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:268 +#, c-format +msgid "Non-superuser cannot connect if the server does not request a password." +msgstr "Icke superanvändare kan inte ansluta till servern om den inte kräver lösenord." -#: replication/libpqwalreceiver/libpqwalreceiver.c:240 +#: replication/libpqwalreceiver/libpqwalreceiver.c:269 +#, c-format +msgid "Target server's authentication method must be changed, or set password_required=false in the subscription parameters." +msgstr "MÃ¥lserverns autentiseringsmetod mÃ¥ste ändras eller sÃ¥ mÃ¥ste man sätta password_required=false i prenumerationens parametrar." + +#: replication/libpqwalreceiver/libpqwalreceiver.c:285 #, c-format msgid "could not clear search path: %s" msgstr "kunde inte nollställa sökväg: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:269 +#: replication/libpqwalreceiver/libpqwalreceiver.c:331 +#: replication/libpqwalreceiver/libpqwalreceiver.c:517 #, c-format msgid "invalid connection string syntax: %s" msgstr "ogiltig anslutningssträngsyntax %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:295 +#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#, c-format +msgid "Non-superusers must provide a password in the connection string." +msgstr "Icke superanvändare mÃ¥ste ange ett lösenord i anslutningssträngen." + +#: replication/libpqwalreceiver/libpqwalreceiver.c:386 #, c-format msgid "could not parse connection string: %s" msgstr "kunde inte parsa anslutningssträng: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:368 +#: replication/libpqwalreceiver/libpqwalreceiver.c:459 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "kunde inte hämta databassystemidentifierare och tidslinje-ID frÃ¥n primära servern: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:380 -#: replication/libpqwalreceiver/libpqwalreceiver.c:618 +#: replication/libpqwalreceiver/libpqwalreceiver.c:476 +#: replication/libpqwalreceiver/libpqwalreceiver.c:763 #, c-format msgid "invalid response from primary server" msgstr "ogiltigt svar frÃ¥n primär server" -#: replication/libpqwalreceiver/libpqwalreceiver.c:381 +#: replication/libpqwalreceiver/libpqwalreceiver.c:477 #, c-format msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." msgstr "Kunde inte identifiera system: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält." -#: replication/libpqwalreceiver/libpqwalreceiver.c:461 -#: replication/libpqwalreceiver/libpqwalreceiver.c:468 -#: replication/libpqwalreceiver/libpqwalreceiver.c:498 +#: replication/libpqwalreceiver/libpqwalreceiver.c:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:613 +#: replication/libpqwalreceiver/libpqwalreceiver.c:643 #, c-format msgid "could not start WAL streaming: %s" msgstr "kunde inte starta WAL-strömning: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:522 +#: replication/libpqwalreceiver/libpqwalreceiver.c:667 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "kunde inte skicka meddelandet end-of-streaming till primären: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:545 +#: replication/libpqwalreceiver/libpqwalreceiver.c:690 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "oväntad resultatmängd efter end-of-streaming" -#: replication/libpqwalreceiver/libpqwalreceiver.c:560 +#: replication/libpqwalreceiver/libpqwalreceiver.c:705 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "fel vid nestängning av strömmande COPY: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:570 +#: replication/libpqwalreceiver/libpqwalreceiver.c:715 #, c-format msgid "error reading result of streaming command: %s" msgstr "fel vid läsning av resultat frÃ¥n strömningskommando: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:579 -#: replication/libpqwalreceiver/libpqwalreceiver.c:817 +#: replication/libpqwalreceiver/libpqwalreceiver.c:724 +#: replication/libpqwalreceiver/libpqwalreceiver.c:957 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "oväntat resultat efter CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:751 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "kan inte ta emot fil med tidslinjehistorik frÃ¥n primära servern: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:619 +#: replication/libpqwalreceiver/libpqwalreceiver.c:764 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "Förväntade 1 tupel med 2 fält, fick %d tupler med %d fält." -#: replication/libpqwalreceiver/libpqwalreceiver.c:780 -#: replication/libpqwalreceiver/libpqwalreceiver.c:833 -#: replication/libpqwalreceiver/libpqwalreceiver.c:840 +#: replication/libpqwalreceiver/libpqwalreceiver.c:920 +#: replication/libpqwalreceiver/libpqwalreceiver.c:973 +#: replication/libpqwalreceiver/libpqwalreceiver.c:980 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "kunde inte ta emot data frÃ¥n WAL-ström: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:860 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1000 #, c-format msgid "could not send data to WAL stream: %s" msgstr "kunde inte skicka data till WAL-ström: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:952 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1101 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "kunde inte skapa replikeringsslot \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:998 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1140 +#, c-format +msgid "could not alter replication slot \"%s\": %s" +msgstr "kunde inte ändra replikeringsslot \"%s\": %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1174 #, c-format msgid "invalid query response" msgstr "ogiltigt frÃ¥gerespons" -#: replication/libpqwalreceiver/libpqwalreceiver.c:999 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1175 #, c-format msgid "Expected %d fields, got %d fields." msgstr "Förväntade %d fält, fick %d fält." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1069 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1245 #, c-format msgid "the query interface requires a database connection" msgstr "frÃ¥geinterface:et kräver en databasanslutning" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1100 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1277 msgid "empty query" msgstr "tom frÃ¥ga" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1106 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1283 msgid "unexpected pipeline mode" msgstr "oväntat pipeline-läge" -#: replication/logical/launcher.c:285 +#: replication/logical/applyparallelworker.c:719 +#, c-format +msgid "logical replication parallel apply worker for subscription \"%s\" has finished" +msgstr "logisk replikerings parallella ändringsapplicerare för prenumeration \"%s\" har avslutat" + +#: replication/logical/applyparallelworker.c:822 +#, c-format +msgid "lost connection to the logical replication apply worker" +msgstr "tappade anslutning till den logiska replikeringens ändringsapplicerare" + +#: replication/logical/applyparallelworker.c:1024 +#: replication/logical/applyparallelworker.c:1026 +msgid "logical replication parallel apply worker" +msgstr "logisk replikerings ändringsapplicerare" + +#: replication/logical/applyparallelworker.c:1040 +#, c-format +msgid "logical replication parallel apply worker exited due to error" +msgstr "logiska replikeringens ändringsappliceraren avslutade pÃ¥ grund av ett fel" + +#: replication/logical/applyparallelworker.c:1127 +#: replication/logical/applyparallelworker.c:1300 +#, c-format +msgid "lost connection to the logical replication parallel apply worker" +msgstr "tappade anslutning till den logiska replikeringens parallella ändringsapplicerare" + +#: replication/logical/applyparallelworker.c:1180 +#, c-format +msgid "could not send data to shared-memory queue" +msgstr "kunde inte skicka data till kö i delat minne" + +#: replication/logical/applyparallelworker.c:1215 +#, c-format +msgid "logical replication apply worker will serialize the remaining changes of remote transaction %u to a file" +msgstr "logiska replikeringens ändringsapplicerare kommer spara ner Ã¥terstÃ¥ende ändringarna av fjärrtransaktion %u til en fil" + +#: replication/logical/decode.c:177 replication/logical/logical.c:141 +#, c-format +msgid "logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary" +msgstr "logisk avkodning pÃ¥ standby kräver \"wal_level\" >= \"logical\" pÃ¥ primären" + +#: replication/logical/launcher.c:334 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "kan inte starta logisk replikeringsarbetare när max_replication_slots = 0" -#: replication/logical/launcher.c:365 +#: replication/logical/launcher.c:427 #, c-format msgid "out of logical replication worker slots" msgstr "slut pÃ¥ logiska replikeringsarbetarslots" -#: replication/logical/launcher.c:366 +#: replication/logical/launcher.c:428 replication/logical/launcher.c:514 +#: replication/slot.c:1524 storage/lmgr/lock.c:985 storage/lmgr/lock.c:1023 +#: storage/lmgr/lock.c:2836 storage/lmgr/lock.c:4221 storage/lmgr/lock.c:4286 +#: storage/lmgr/lock.c:4636 storage/lmgr/predicate.c:2469 +#: storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:3881 #, c-format -msgid "You might need to increase max_logical_replication_workers." -msgstr "Du kan behöva öka max_logical_replication_workers." +msgid "You might need to increase \"%s\"." +msgstr "Du kan behöva öka \"%s\"." -#: replication/logical/launcher.c:422 +#: replication/logical/launcher.c:513 #, c-format msgid "out of background worker slots" msgstr "slut pÃ¥ bakgrundsarbetarslots" -#: replication/logical/launcher.c:423 -#, c-format -msgid "You might need to increase max_worker_processes." -msgstr "Du kan behöva öka max_worker_processes." - -#: replication/logical/launcher.c:577 +#: replication/logical/launcher.c:720 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "logisk replikeringsarbetarslot %d är tom, kan inte ansluta" -#: replication/logical/launcher.c:586 +#: replication/logical/launcher.c:729 #, c-format msgid "logical replication worker slot %d is already used by another worker, cannot attach" msgstr "logiisk replikeringsarbetarslot %d används redan av en annan arbetare, kan inte ansluta" -#: replication/logical/logical.c:115 +#: replication/logical/logical.c:121 #, c-format -msgid "logical decoding requires wal_level >= logical" -msgstr "logisk avkodning kräver wal_level >= logical" +msgid "logical decoding requires \"wal_level\" >= \"logical\"" +msgstr "logisk avkodning kräver \"wal_level\" >= \"logical\"" -#: replication/logical/logical.c:120 +#: replication/logical/logical.c:126 #, c-format msgid "logical decoding requires a database connection" msgstr "logisk avkodning kräver en databasanslutning" -#: replication/logical/logical.c:138 -#, c-format -msgid "logical decoding cannot be used while in recovery" -msgstr "logisk avkodning kan inte användas under Ã¥terställning" - -#: replication/logical/logical.c:348 replication/logical/logical.c:502 +#: replication/logical/logical.c:365 replication/logical/logical.c:519 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "kan inte använda fysisk replikeringsslot för logisk avkodning" -#: replication/logical/logical.c:353 replication/logical/logical.c:507 +#: replication/logical/logical.c:370 replication/logical/logical.c:529 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "replikeringsslot \"%s\" har inte skapats i denna databasen" -#: replication/logical/logical.c:360 +#: replication/logical/logical.c:377 #, c-format msgid "cannot create logical replication slot in transaction that has performed writes" msgstr "kan inte skapa logisk replikeringsslot i transaktion som redan har utfört skrivningar" -#: replication/logical/logical.c:570 +#: replication/logical/logical.c:540 +#, c-format +msgid "cannot use replication slot \"%s\" for logical decoding" +msgstr "kan inte använda replikeringsslot \"%s\" för logisk avkodning" + +#: replication/logical/logical.c:542 replication/slot.c:798 +#: replication/slot.c:829 +#, c-format +msgid "This replication slot is being synchronized from the primary server." +msgstr "Denna replikeringsslot synkroniseras frÃ¥n primära servern." + +#: replication/logical/logical.c:543 +#, c-format +msgid "Specify another replication slot." +msgstr "Ange en annan replikeringsslot." + +#: replication/logical/logical.c:554 replication/logical/logical.c:561 +#, c-format +msgid "can no longer get changes from replication slot \"%s\"" +msgstr "kan inte längre fÃ¥ ändringar frÃ¥n replikeringsslot \"%s\"" + +#: replication/logical/logical.c:556 +#, c-format +msgid "This slot has been invalidated because it exceeded the maximum reserved size." +msgstr "Denna slot har invaliderats dÃ¥ den överskred maximal reserverad storlek." + +#: replication/logical/logical.c:563 +#, c-format +msgid "This slot has been invalidated because it was conflicting with recovery." +msgstr "Denna slot har invaliderats den var i konflikt med Ã¥terställningen." + +#: replication/logical/logical.c:628 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "startar logisk avkodning för slot \"%s\"" -#: replication/logical/logical.c:572 +#: replication/logical/logical.c:630 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Strömmar transaktioner commit:ade efter %X/%X, läser WAL frÃ¥n %X/%X" -#: replication/logical/logical.c:720 +#: replication/logical/logical.c:778 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "slot \"%s\", utdata-plugin \"%s\", i callback:en %s, associerad LSN %X/%X" -#: replication/logical/logical.c:726 +#: replication/logical/logical.c:784 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "slot \"%s\", utdata-plugin \"%s\", i callback:en %s" -#: replication/logical/logical.c:897 replication/logical/logical.c:942 -#: replication/logical/logical.c:987 replication/logical/logical.c:1033 +#: replication/logical/logical.c:955 replication/logical/logical.c:1000 +#: replication/logical/logical.c:1045 replication/logical/logical.c:1091 #, c-format msgid "logical replication at prepare time requires a %s callback" msgstr "logisk replikering vid prepare-tillfället kräver en %s-callback" -#: replication/logical/logical.c:1265 replication/logical/logical.c:1314 -#: replication/logical/logical.c:1355 replication/logical/logical.c:1441 -#: replication/logical/logical.c:1490 +#: replication/logical/logical.c:1323 replication/logical/logical.c:1372 +#: replication/logical/logical.c:1413 replication/logical/logical.c:1499 +#: replication/logical/logical.c:1548 #, c-format msgid "logical streaming requires a %s callback" msgstr "logisk strömning kräven en %s-callback" -#: replication/logical/logical.c:1400 +#: replication/logical/logical.c:1458 #, c-format msgid "logical streaming at prepare time requires a %s callback" msgstr "logisk strömning vid prepare-tillfället kräver en %s-callback" -#: replication/logical/logicalfuncs.c:126 +#: replication/logical/logicalfuncs.c:123 #, c-format msgid "slot name must not be null" msgstr "slot-namn fÃ¥r inte vara null" -#: replication/logical/logicalfuncs.c:142 +#: replication/logical/logicalfuncs.c:139 #, c-format msgid "options array must not be null" msgstr "flagg-array fÃ¥r inte vara null" -#: replication/logical/logicalfuncs.c:159 +#: replication/logical/logicalfuncs.c:156 #, c-format msgid "array must be one-dimensional" msgstr "array:en mÃ¥ste vara endimensionell" -#: replication/logical/logicalfuncs.c:165 +#: replication/logical/logicalfuncs.c:162 #, c-format msgid "array must not contain nulls" msgstr "array:en fÃ¥r inte innehÃ¥lla null" -#: replication/logical/logicalfuncs.c:181 utils/adt/json.c:1128 -#: utils/adt/jsonb.c:1302 +#: replication/logical/logicalfuncs.c:177 utils/adt/json.c:1420 +#: utils/adt/jsonb.c:1304 #, c-format msgid "array must have even number of elements" msgstr "array:en mÃ¥ste ha ett jämnt antal element" -#: replication/logical/logicalfuncs.c:227 -#, c-format -msgid "can no longer get changes from replication slot \"%s\"" -msgstr "kan inte längre fÃ¥ ändringar frÃ¥n replikeringsslot \"%s\"" - -#: replication/logical/logicalfuncs.c:229 replication/slotfuncs.c:616 -#, c-format -msgid "This slot has never previously reserved WAL, or it has been invalidated." -msgstr "Denna slot har aldrig tidigare reserverat WAL eller sÃ¥ har den invaliderats." - -#: replication/logical/logicalfuncs.c:241 +#: replication/logical/logicalfuncs.c:224 #, c-format msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" msgstr "utdata-plugin \"%s\" för logisk avkodning producerar binär utdata men funktionen \"%s\" förväntar sig textdata" -#: replication/logical/origin.c:189 +#: replication/logical/origin.c:190 #, c-format -msgid "cannot query or manipulate replication origin when max_replication_slots = 0" -msgstr "kan inte se eller ändra replikeringskällor när max_replication_slots = 0" +msgid "cannot query or manipulate replication origin when \"max_replication_slots\" is 0" +msgstr "kan inte se eller ändra replikeringskällor när \"max_replication_slots\" är 0" -#: replication/logical/origin.c:194 +#: replication/logical/origin.c:195 #, c-format msgid "cannot manipulate replication origins during recovery" msgstr "kan inte ändra replikeringskällor under tiden Ã¥terställning sker" -#: replication/logical/origin.c:228 +#: replication/logical/origin.c:240 #, c-format msgid "replication origin \"%s\" does not exist" msgstr "replikeringskälla \"%s\" finns inte" -#: replication/logical/origin.c:319 +#: replication/logical/origin.c:331 #, c-format msgid "could not find free replication origin ID" msgstr "kunde inte hitta ledig replikering-origin-ID" -#: replication/logical/origin.c:355 +#: replication/logical/origin.c:365 #, c-format msgid "could not drop replication origin with ID %d, in use by PID %d" msgstr "kunde inte slänga replikeringskälla med ID %d som används av PID %d" -#: replication/logical/origin.c:476 +#: replication/logical/origin.c:492 #, c-format msgid "replication origin with ID %d does not exist" msgstr "replikeringskälla med ID %d finns inte" -#: replication/logical/origin.c:741 +#: replication/logical/origin.c:757 #, c-format msgid "replication checkpoint has wrong magic %u instead of %u" msgstr "replikeringscheckpoint har fel magiskt tal %u istället för %u" -#: replication/logical/origin.c:782 +#: replication/logical/origin.c:798 #, c-format -msgid "could not find free replication state, increase max_replication_slots" -msgstr "kunde inte hitta ledig replikeringsplats, öka max_replication_slots" +msgid "could not find free replication state, increase \"max_replication_slots\"" +msgstr "kunde inte hitta ledig replikeringsplats, öka \"max_replication_slots\"" -#: replication/logical/origin.c:790 +#: replication/logical/origin.c:806 #, c-format msgid "recovered replication state of node %d to %X/%X" msgstr "Ã¥terställde replikeringstillstÃ¥nd för nod %d till %X/%X" -#: replication/logical/origin.c:800 +#: replication/logical/origin.c:816 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "replikeringsslot-checkpoint har felaktig kontrollsumma %u, förväntade %u" -#: replication/logical/origin.c:928 replication/logical/origin.c:1117 +#: replication/logical/origin.c:944 replication/logical/origin.c:1143 #, c-format msgid "replication origin with ID %d is already active for PID %d" msgstr "replikeringskälla med ID %d är redan aktiv för PID %d" -#: replication/logical/origin.c:939 replication/logical/origin.c:1129 +#: replication/logical/origin.c:955 replication/logical/origin.c:1156 #, c-format msgid "could not find free replication state slot for replication origin with ID %d" msgstr "kunde inte hitta ledig replikerings-state-slot för replikerings-origin med ID %d" -#: replication/logical/origin.c:941 replication/logical/origin.c:1131 -#: replication/slot.c:1947 +#: replication/logical/origin.c:957 replication/logical/origin.c:1158 +#: replication/slot.c:2384 #, c-format -msgid "Increase max_replication_slots and try again." -msgstr "Öka max_replication_slots och försök igen." +msgid "Increase \"max_replication_slots\" and try again." +msgstr "Öka \"max_replication_slots\" och försök igen." -#: replication/logical/origin.c:1088 +#: replication/logical/origin.c:1114 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "kan inte ställa in replikeringskälla när en redan är inställd" -#: replication/logical/origin.c:1168 replication/logical/origin.c:1380 -#: replication/logical/origin.c:1400 +#: replication/logical/origin.c:1199 replication/logical/origin.c:1415 +#: replication/logical/origin.c:1435 #, c-format msgid "no replication origin is configured" msgstr "ingen replikeringskälla är konfigurerad" -#: replication/logical/origin.c:1251 +#: replication/logical/origin.c:1285 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "replikeringskällnamn \"%s\" är reserverat" -#: replication/logical/origin.c:1253 +#: replication/logical/origin.c:1287 #, c-format -msgid "Origin names starting with \"pg_\" are reserved." -msgstr "Källnamn som startar med \"pg_\" är reserverade." +msgid "Origin names \"%s\", \"%s\", and names starting with \"pg_\" are reserved." +msgstr "Källnamn \"%s\", \"%s\" och namn som startar med \"pg_\" är reserverade." -#: replication/logical/relation.c:234 +#: replication/logical/relation.c:242 #, c-format msgid "\"%s\"" msgstr "\"%s\"" -#: replication/logical/relation.c:237 +#: replication/logical/relation.c:245 #, c-format msgid ", \"%s\"" msgstr ", \"%s\"" -#: replication/logical/relation.c:243 +#: replication/logical/relation.c:251 #, c-format msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" msgstr[0] "destinationsrelation \"%s.%s\" för logisk replikering saknar en replikerad kolumn: %s" msgstr[1] "destinationsrelation \"%s.%s\" för logisk replikering saknar nÃ¥gra replikerade kolumner: %s" -#: replication/logical/relation.c:298 +#: replication/logical/relation.c:306 #, c-format msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" msgstr "destinationsrelation \"%s.%s\" för logisk replikering använder systemkolumner i REPLICA IDENTITY-index" -#: replication/logical/relation.c:390 +#: replication/logical/relation.c:398 #, c-format msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "destinationsrelation \"%s.%s\" för logisk replikering finns inte" -#: replication/logical/reorderbuffer.c:3831 +#: replication/logical/reorderbuffer.c:3999 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "kunde inte skriva till datafil för XID %u: %m" -#: replication/logical/reorderbuffer.c:4177 -#: replication/logical/reorderbuffer.c:4202 +#: replication/logical/reorderbuffer.c:4345 +#: replication/logical/reorderbuffer.c:4370 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "kunde inte läsa frÃ¥n reorderbuffer spill-fil: %m" -#: replication/logical/reorderbuffer.c:4181 -#: replication/logical/reorderbuffer.c:4206 +#: replication/logical/reorderbuffer.c:4349 +#: replication/logical/reorderbuffer.c:4374 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "kunde inte läsa frÃ¥n reorderbuffer spill-fil: läste %d istället för %u byte" -#: replication/logical/reorderbuffer.c:4456 +#: replication/logical/reorderbuffer.c:4624 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "kunde inte radera fil \"%s\" vid borttagning av pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:4955 +#: replication/logical/reorderbuffer.c:5120 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "kunde inte läsa frÃ¥n fil \"%s\": läste %d istället för %d byte" -#: replication/logical/snapbuild.c:634 +#: replication/logical/slotsync.c:215 +#, c-format +msgid "could not synchronize replication slot \"%s\" because remote slot precedes local slot" +msgstr "kunde inte synkronisera replikeringsslot \"%s\" dÃ¥ fjärrslotten ligger tidigare än den lokala slotten" + +#: replication/logical/slotsync.c:217 +#, c-format +msgid "The remote slot has LSN %X/%X and catalog xmin %u, but the local slot has LSN %X/%X and catalog xmin %u." +msgstr "Fjärrslotten har LSN %X/%X och katalog-xmin %u men lokala slotten har LSN %X/%X och katalog-xmin %u." + +#: replication/logical/slotsync.c:459 +#, c-format +msgid "dropped replication slot \"%s\" of database with OID %u" +msgstr "slängde replikerings-slot \"%s\" för databas med OID %u" + +#: replication/logical/slotsync.c:579 +#, c-format +msgid "could not synchronize replication slot \"%s\"" +msgstr "kunde inte synkronisera replikeringsslot \"%s\"" + +#: replication/logical/slotsync.c:580 +#, c-format +msgid "Logical decoding could not find consistent point from local slot's LSN %X/%X." +msgstr "Logisk avkodning kunde inte hitta en konsistent punkt frÃ¥n lokala slottens LSN %X/%X" + +#: replication/logical/slotsync.c:589 +#, c-format +msgid "newly created replication slot \"%s\" is sync-ready now" +msgstr "nyskapad replikeringsslot \"%s\" är redo för synk nu" + +#: replication/logical/slotsync.c:628 +#, c-format +msgid "skipping slot synchronization because the received slot sync LSN %X/%X for slot \"%s\" is ahead of the standby position %X/%X" +msgstr "hoppar över slotsynkronisering dÃ¥ den mottagna slottens synk-LSN %X/%X för slot \"%s\" är längre fram än standby-positionen %X/%X" + +#: replication/logical/slotsync.c:650 +#, c-format +msgid "exiting from slot synchronization because same name slot \"%s\" already exists on the standby" +msgstr "avslutar slotsynkronisering dÃ¥ samma slotnamn \"%s\" redan finns pÃ¥ standby:en" + +#: replication/logical/slotsync.c:819 +#, c-format +msgid "could not fetch failover logical slots info from the primary server: %s" +msgstr "kan inte hämta logisk slot för failover frÃ¥n primära servern: %s" + +#: replication/logical/slotsync.c:965 +#, c-format +msgid "could not fetch primary_slot_name \"%s\" info from the primary server: %s" +msgstr "kan inte hämta info för primary_slot_name \"%s\" frÃ¥n primära servern: %s" + +#: replication/logical/slotsync.c:967 +#, c-format +msgid "Check if primary_slot_name is configured correctly." +msgstr "Kontrollera att primary_slot_name är korrekt konfigurerad." + +#: replication/logical/slotsync.c:987 +#, c-format +msgid "cannot synchronize replication slots from a standby server" +msgstr "kan inte synkronisera replikeringsslottar frÃ¥n en standby-server" + +#. translator: second %s is a GUC variable name +#: replication/logical/slotsync.c:996 +#, c-format +msgid "replication slot \"%s\" specified by \"%s\" does not exist on primary server" +msgstr "replikeringsslot \"%s\" angiven av %s finns inte pÃ¥ den primära servern." + +#. translator: first %s is a connection option; second %s is a GUC +#. variable name +#. +#: replication/logical/slotsync.c:1029 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be specified in \"%s\"" +msgstr "synkronisering av replikeringsslot kräver att \"%s\" anges i %s" + +#: replication/logical/slotsync.c:1050 +#, c-format +msgid "replication slot synchronization requires \"wal_level\" >= \"logical\"" +msgstr "synkronisering av replikeringsslot kräver at \"wal_level\" >= \"logical\"" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1063 replication/logical/slotsync.c:1091 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be set" +msgstr "synkronisering av replikeringsslot kräver att \"%s\" ocksÃ¥ anges" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1077 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be enabled" +msgstr "synkronisering av replikeringsslot kräver att \"%s\" ocksÃ¥ slÃ¥s pÃ¥" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1129 +#, c-format +msgid "replication slot synchronization worker will shut down because \"%s\" is disabled" +msgstr "arbetare för synkronisering av replikeringsslot kommer stängas ner dÃ¥ \"%s\" är avslagen" + +#: replication/logical/slotsync.c:1138 +#, c-format +msgid "replication slot synchronization worker will restart because of a parameter change" +msgstr "arbetare för synkronisering av replikeringsslot kommer startas om dÃ¥ parametrar ändrats" + +#: replication/logical/slotsync.c:1162 +#, c-format +msgid "replication slot synchronization worker is shutting down on receiving SIGINT" +msgstr "arbetare för synkronisering av replikeringsslot stänger ner efter mottagning av SIGINT" + +#: replication/logical/slotsync.c:1287 +#, c-format +msgid "cannot synchronize replication slots when standby promotion is ongoing" +msgstr "kan inte synkronisera replikeringsslot när befordran av standby pÃ¥gÃ¥r" + +#: replication/logical/slotsync.c:1295 +#, c-format +msgid "cannot synchronize replication slots concurrently" +msgstr "kan inte synkronisera replikeringsslottar parallellt" + +#: replication/logical/slotsync.c:1403 +#, c-format +msgid "slot sync worker started" +msgstr "arbetare för slot-synk startad" + +#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:900 +#: replication/walreceiver.c:307 +#, c-format +msgid "could not connect to the primary server: %s" +msgstr "kunde inte ansluta till primärserver: %s" + +#: replication/logical/snapbuild.c:653 #, c-format msgid "initial slot snapshot too large" msgstr "initialt slot-snapshot är för stort" -#: replication/logical/snapbuild.c:688 +#: replication/logical/snapbuild.c:707 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" msgstr[0] "exporterade logisk avkodnings-snapshot: \"%s\" med %u transaktions-ID" msgstr[1] "exporterade logisk avkodnings-snapshot: \"%s\" med %u transaktions-ID" -#: replication/logical/snapbuild.c:1367 replication/logical/snapbuild.c:1474 -#: replication/logical/snapbuild.c:2003 +#: replication/logical/snapbuild.c:1404 replication/logical/snapbuild.c:1501 +#: replication/logical/snapbuild.c:2017 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "logisk avkodning hittade konsistent punkt vid %X/%X" -#: replication/logical/snapbuild.c:1369 +#: replication/logical/snapbuild.c:1406 #, c-format msgid "There are no running transactions." msgstr "Det finns inga körande transaktioner." -#: replication/logical/snapbuild.c:1425 +#: replication/logical/snapbuild.c:1453 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "logisk avkodning hittade initial startpunkt vid %X/%X" -#: replication/logical/snapbuild.c:1427 replication/logical/snapbuild.c:1451 +#: replication/logical/snapbuild.c:1455 replication/logical/snapbuild.c:1479 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Väntar pÃ¥ att transaktioner (cirka %d) äldre än %u skall gÃ¥ klart." -#: replication/logical/snapbuild.c:1449 +#: replication/logical/snapbuild.c:1477 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "logisk avkodning hittade initial konsistent punkt vid %X/%X" -#: replication/logical/snapbuild.c:1476 +#: replication/logical/snapbuild.c:1503 #, c-format msgid "There are no old transactions anymore." msgstr "Det finns inte längre nÃ¥gra gamla transaktioner." -#: replication/logical/snapbuild.c:1871 +#: replication/logical/snapbuild.c:1904 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "snapbuild-state-fil \"%s\" har fel magiskt tal: %u istället för %u" -#: replication/logical/snapbuild.c:1877 +#: replication/logical/snapbuild.c:1910 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "snapbuild-state-fil \"%s\" har en ej stödd version: %u istället för %u" -#: replication/logical/snapbuild.c:1948 +#: replication/logical/snapbuild.c:1951 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "checksumma stämmer inte för snapbuild-state-fil \"%s\": är %u, skall vara %u" -#: replication/logical/snapbuild.c:2005 +#: replication/logical/snapbuild.c:2019 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Logisk avkodning kommer starta med sparat snapshot." -#: replication/logical/snapbuild.c:2077 +#: replication/logical/snapbuild.c:2126 #, c-format msgid "could not parse file name \"%s\"" msgstr "kunde inte parsa filnamn \"%s\"" -#: replication/logical/tablesync.c:151 +#: replication/logical/tablesync.c:161 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "logisk replikerings tabellsynkroniseringsarbetare för prenumeration \"%s\", tabell \"%s\" är klar" -#: replication/logical/tablesync.c:422 +#: replication/logical/tablesync.c:641 #, c-format msgid "logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled" msgstr "arbetarprocess för uppspelning av logisk replikering av prenumeration \"%s\" kommer starta om sÃ¥ att two_phase kan slÃ¥s pÃ¥" -#: replication/logical/tablesync.c:731 replication/logical/tablesync.c:872 +#: replication/logical/tablesync.c:827 replication/logical/tablesync.c:969 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "kunde inte hämta tabellinfo för tabell \"%s.%s\" frÃ¥n publicerare: %s" -#: replication/logical/tablesync.c:738 +#: replication/logical/tablesync.c:834 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "tabell \"%s.%s\" hittades inte hos publicerare" -#: replication/logical/tablesync.c:795 +#: replication/logical/tablesync.c:892 #, c-format msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" msgstr "kunde inte hämta kolumlista för tabell \"%s.%s\" frÃ¥n publicerare: %s" -#: replication/logical/tablesync.c:974 +#: replication/logical/tablesync.c:1071 #, c-format msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" msgstr "kunde inte hämta tabells WHERE-klausul för tabell \"%s.%s\" frÃ¥n publicerare: %s" -#: replication/logical/tablesync.c:1111 +#: replication/logical/tablesync.c:1230 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "kunde inte starta initial innehÃ¥llskopiering för tabell \"%s.%s\": %s" -#: replication/logical/tablesync.c:1323 replication/logical/worker.c:1635 -#, c-format -msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" -msgstr "användaren \"%s\" kan inte replikera in i en relation med radsäkerhet pÃ¥slagen: \"%s\"" - -#: replication/logical/tablesync.c:1338 +#: replication/logical/tablesync.c:1429 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "tabellkopiering kunde inte starta transaktion pÃ¥ publiceraren: %s" -#: replication/logical/tablesync.c:1387 +#: replication/logical/tablesync.c:1472 #, c-format msgid "replication origin \"%s\" already exists" msgstr "replikeringsurspring \"%s\" finns redan" -#: replication/logical/tablesync.c:1400 +#: replication/logical/tablesync.c:1505 replication/logical/worker.c:2361 +#, c-format +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "användaren \"%s\" kan inte replikera in i en relation med radsäkerhet pÃ¥slagen: \"%s\"" + +#: replication/logical/tablesync.c:1518 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "tabellkopiering kunde inte slutföra transaktion pÃ¥ publiceraren: %s" -#: replication/logical/worker.c:671 replication/logical/worker.c:786 +#: replication/logical/worker.c:481 #, c-format -msgid "incorrect binary data format in logical replication column %d" -msgstr "inkorrekt binärt dataformat i logisk replikeringskolumn %d" +msgid "logical replication parallel apply worker for subscription \"%s\" will stop" +msgstr "logiska replikeringens parallella ändringsapplicerare för prenumeration \"%s\" kommer stoppa" + +#: replication/logical/worker.c:483 +#, c-format +msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." +msgstr "Kan inte hantera strömmade replikerade transaktioner med parallell ändringsapplicerare innan alla tabeller har synkroniserats." -#: replication/logical/worker.c:1417 replication/logical/worker.c:1432 +#: replication/logical/worker.c:852 replication/logical/worker.c:967 #, c-format -msgid "could not read from streaming transaction's changes file \"%s\": read only %zu of %zu bytes" -msgstr "kunde inte läsa frÃ¥n strömmande transaktionens ändringsfil \"%s\": läste bara %zu av %zu byte" +msgid "incorrect binary data format in logical replication column %d" +msgstr "inkorrekt binärt dataformat i logisk replikeringskolumn %d" -#: replication/logical/worker.c:1761 +#: replication/logical/worker.c:2500 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "publicerare skickade inte identitetskolumn för replika som förväntades av den logiska replikeringens mÃ¥lrelation \"%s.%s\"" -#: replication/logical/worker.c:1768 +#: replication/logical/worker.c:2507 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "logisk replikeringsmÃ¥lrelation \"%s.%s\" har varken REPLICA IDENTITY-index eller PRIMARY KEY och den publicerade relationen har inte REPLICA IDENTITY FULL" -#: replication/logical/worker.c:2582 +#: replication/logical/worker.c:3371 #, c-format -msgid "invalid logical replication message type \"%c\"" -msgstr "ogiltig logisk replikeringsmeddelandetyp \"%c\"" +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "ogiltig logisk replikeringsmeddelandetyp \"??? (%d)\"" -#: replication/logical/worker.c:2746 +#: replication/logical/worker.c:3543 #, c-format msgid "data stream from publisher has ended" msgstr "dataströmmen frÃ¥n publiceraren har avslutats" -#: replication/logical/worker.c:2897 +#: replication/logical/worker.c:3697 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "avslutar logisk replikeringsarbetare pÃ¥ grund av timeout" -#: replication/logical/worker.c:3059 +#: replication/logical/worker.c:3891 +#, c-format +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" +msgstr "logiska replikerings ändringsapplicerare för prenumeration \"%s\" kommer att stoppa dÃ¥ prenumerationen har tagits bort" + +#: replication/logical/worker.c:3905 +#, c-format +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" +msgstr "logiska replikerings ändringsapplicerare för prenumeration \"%s\" kommer att stoppa dÃ¥ prenumerationen har stängts av" + +#: replication/logical/worker.c:3936 +#, c-format +msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" +msgstr "logiska replikeringens ändringsapplicerare för prenumeration \"%s\" kommer att stoppa pÃ¥ grund av ändrade parametrar" + +#: replication/logical/worker.c:3940 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" -msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" kommer stoppa dÃ¥ prenumerationen har tagits bort" +msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" +msgstr "logiska replikeringens ändringsapplicerare för prenumeration \"%s\" kommer att startas om pÃ¥ grund av ändrade parametrar" -#: replication/logical/worker.c:3070 +#: replication/logical/worker.c:3954 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" -msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" kommer stoppa dÃ¥ prenumerationen har stängts av" +msgid "logical replication parallel apply worker for subscription \"%s\" will stop because the subscription owner's superuser privileges have been revoked" +msgstr "logiska replikerings parallella ändringsapplicerare för prenumeration \"%s\" kommer att stoppa dÃ¥ prenumerationens ägare har blivit av med superuser-rättigheten" -#: replication/logical/worker.c:3096 +#: replication/logical/worker.c:3958 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" -msgstr "arbetarprocess för uppspelning av logisk replikering av prenumeration \"%s\" kommer starta om pÃ¥ grund av ändrade parametrar" +msgid "logical replication worker for subscription \"%s\" will restart because the subscription owner's superuser privileges have been revoked" +msgstr "logiska replikerings ändringsapplicerare för prenumeration \"%s\" kommer att startas om dÃ¥ prenumerationens ägare har blivit av med superuser-rättigheten" -#: replication/logical/worker.c:3220 replication/logical/worker.c:3245 +#: replication/logical/worker.c:4478 #, c-format -msgid "could not read from streaming transaction's subxact file \"%s\": read only %zu of %zu bytes" -msgstr "kunde inte läsa frÃ¥n strömmande transaktions subxact-fil \"%s\": läste bara %zu av %zu byte" +msgid "subscription has no replication slot set" +msgstr "prenumeration har ingen replikeringsslot angiven" -#: replication/logical/worker.c:3645 +#: replication/logical/worker.c:4591 #, c-format -msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" -msgstr "logisk replikerings uppspelningsarbetare för prenumeration %u kommer inte starta dÃ¥ prenumerationen togs bort under uppstart" +msgid "logical replication worker for subscription %u will not start because the subscription was removed during startup" +msgstr "logiska replikeringens ändringsapplicerare för prenumeration %u kommer inte att startas dÃ¥ prenumerationen togs bort i uppstarten" -#: replication/logical/worker.c:3657 +#: replication/logical/worker.c:4607 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" -msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" kommer inte starta dÃ¥ prenumerationen stänges av under uppstart" +msgid "logical replication worker for subscription \"%s\" will not start because the subscription was disabled during startup" +msgstr "logiska replikeringens ändringsapplicerare för prenumeration \"%s\" kommer inte att startas dÃ¥ prenumerationen stängdes av i uppstarten" -#: replication/logical/worker.c:3675 +#: replication/logical/worker.c:4631 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "logisk replikerings tabellsynkroniseringsarbetare för prenumeration \"%s\", tabell \"%s\" har startat" -#: replication/logical/worker.c:3679 +#: replication/logical/worker.c:4636 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" -msgstr "logisk replikerings uppspelningsarbetare för prenumeration \"%s\" har startat" - -#: replication/logical/worker.c:3720 -#, c-format -msgid "subscription has no replication slot set" -msgstr "prenumeration har ingen replikeringsslot angiven" +msgstr "logiska replikeringens ändringsapplicerare för prenumeration \"%s\" har startat" -#: replication/logical/worker.c:3856 +#: replication/logical/worker.c:4758 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "prenumeration \"%s\" har avaktiverats pÃ¥ grund av ett fel" -#: replication/logical/worker.c:3895 +#: replication/logical/worker.c:4806 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "logisk replikering börjar hoppa över transaktion vid LSN %X/%X" -#: replication/logical/worker.c:3909 +#: replication/logical/worker.c:4820 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "logisk replikering har slutfört överhoppande av transaktionen vid LSN %X/%X" -#: replication/logical/worker.c:3991 +#: replication/logical/worker.c:4902 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "överhoppnings-LSN för logiska prenumerationen \"%s\" har nollställts" -#: replication/logical/worker.c:3992 +#: replication/logical/worker.c:4903 #, c-format msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." msgstr "Fjärrtransaktionens slut-WAL-position (LSN) %X/%X matchade inte överhoppnings-LSN %X/%X." -#: replication/logical/worker.c:4018 +#: replication/logical/worker.c:4940 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" msgstr "processar fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\"" -#: replication/logical/worker.c:4022 +#: replication/logical/worker.c:4944 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" msgstr "processar fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" i transaktion %u" -#: replication/logical/worker.c:4027 +#: replication/logical/worker.c:4949 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" msgstr "processande av fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" i transaktion %u blev klar vid %X/%X" -#: replication/logical/worker.c:4034 +#: replication/logical/worker.c:4960 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u" +msgstr "processande av fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" för replikeringsmÃ¥lrelation \"%s.%s\" i transaktion %u" + +#: replication/logical/worker.c:4967 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" msgstr "processande av fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" för replikeringsmÃ¥lrelation \"%s.%s\" i transaktion %u blev klart vid %X/%X" -#: replication/logical/worker.c:4042 +#: replication/logical/worker.c:4978 +#, c-format +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u" +msgstr "processande av fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" för replikeringsmÃ¥lrelation \"%s.%s\" kolumn \"%s\" i transaktion %u" + +#: replication/logical/worker.c:4986 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" msgstr "processande av fjärrdata för replikeringskälla \"%s\" vid meddelandetyp \"%s\" för replikeringsmÃ¥lrelation \"%s.%s\" kolumn \"%s\" i transaktion %u blev klart vid %X/%X" -#: replication/pgoutput/pgoutput.c:319 +#: replication/pgoutput/pgoutput.c:322 #, c-format msgid "invalid proto_version" msgstr "ogiltig proto_version" -#: replication/pgoutput/pgoutput.c:324 +#: replication/pgoutput/pgoutput.c:327 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version \"%s\" är utanför giltigt intervall" -#: replication/pgoutput/pgoutput.c:341 +#: replication/pgoutput/pgoutput.c:344 #, c-format msgid "invalid publication_names syntax" msgstr "ogiltig publication_names-syntax" -#: replication/pgoutput/pgoutput.c:425 +#: replication/pgoutput/pgoutput.c:414 replication/pgoutput/pgoutput.c:418 #, c-format -msgid "client sent proto_version=%d but we only support protocol %d or lower" -msgstr "klienten skickade proto_version=%d men vi stöder bara protokoll %d eller lägre" +msgid "option \"%s\" missing" +msgstr "flaggan \"%s\" saknas." -#: replication/pgoutput/pgoutput.c:431 +#: replication/pgoutput/pgoutput.c:478 #, c-format -msgid "client sent proto_version=%d but we only support protocol %d or higher" -msgstr "klienten skickade proto_version=%d men vi stöder bara protokoll %d eller högre" +msgid "client sent proto_version=%d but server only supports protocol %d or lower" +msgstr "klienten skickade proto_version=%d men servern stöder bara protokoll %d eller lägre" -#: replication/pgoutput/pgoutput.c:437 +#: replication/pgoutput/pgoutput.c:484 #, c-format -msgid "publication_names parameter missing" -msgstr "saknar parameter publication_names" +msgid "client sent proto_version=%d but server only supports protocol %d or higher" +msgstr "klienten skickade proto_version=%d men servern stöder bara protokoll %d eller högre" -#: replication/pgoutput/pgoutput.c:450 +#: replication/pgoutput/pgoutput.c:499 #, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" msgstr "efterfrÃ¥gade proto_version=%d stöder inte strömning, kräver %d eller högre" -#: replication/pgoutput/pgoutput.c:455 +#: replication/pgoutput/pgoutput.c:505 +#, c-format +msgid "requested proto_version=%d does not support parallel streaming, need %d or higher" +msgstr "efterfrÃ¥gade proto_version=%d stöder inte parallell strömning, kräver %d eller högre" + +#: replication/pgoutput/pgoutput.c:510 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "ströming begärdes men det stöds inte av utdata-plugin:en" -#: replication/pgoutput/pgoutput.c:472 +#: replication/pgoutput/pgoutput.c:524 #, c-format msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" msgstr "efterfrÃ¥gade proto_version=%d stöder inte tvÃ¥fas-commit, kräver %d eller högre" -#: replication/pgoutput/pgoutput.c:477 +#: replication/pgoutput/pgoutput.c:529 #, c-format msgid "two-phase commit requested, but not supported by output plugin" msgstr "tvÃ¥fas-commit begärdes men det stöds inte av utdata-plugin:en" -#: replication/slot.c:205 +#: replication/slot.c:260 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "replikeringsslotnamn \"%s\" är för kort" -#: replication/slot.c:214 +#: replication/slot.c:269 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "replikeringsslotnamn \"%s\" är för lÃ¥ngt" -#: replication/slot.c:227 +#: replication/slot.c:282 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "replikeringsslotnamn \"%s\" innehÃ¥ller ogiltiga tecken" -#: replication/slot.c:229 +#: replication/slot.c:284 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "Replikeringsslotnamn fÃ¥r bara innehÃ¥lla smÃ¥ bokstäver, nummer och understreck." -#: replication/slot.c:283 +#: replication/slot.c:333 +#, c-format +msgid "cannot enable failover for a replication slot created on the standby" +msgstr "kan inte aktivera failover för en replikeringsslot som skapats pÃ¥ standby:en" + +#: replication/slot.c:345 replication/slot.c:849 +#, c-format +msgid "cannot enable failover for a temporary replication slot" +msgstr "kan inte aktivera failover för en temporär repllikeringsslot" + +#: replication/slot.c:370 #, c-format msgid "replication slot \"%s\" already exists" msgstr "replikeringsslot \"%s\" finns redan" -#: replication/slot.c:293 +#: replication/slot.c:380 #, c-format msgid "all replication slots are in use" msgstr "alla replikeringsslots används" -#: replication/slot.c:294 +#: replication/slot.c:381 #, c-format -msgid "Free one or increase max_replication_slots." -msgstr "Frigör en eller öka max_replication_slots." +msgid "Free one or increase \"max_replication_slots\"." +msgstr "Frigör en eller öka \"max_replication_slots\"." -#: replication/slot.c:472 replication/slotfuncs.c:727 -#: utils/activity/pgstat_replslot.c:55 utils/adt/genfile.c:704 +#: replication/slot.c:560 replication/slot.c:2450 replication/slotfuncs.c:661 +#: utils/activity/pgstat_replslot.c:56 utils/adt/genfile.c:728 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "replikeringsslot \"%s\" existerar inte" -#: replication/slot.c:518 replication/slot.c:1093 +#: replication/slot.c:606 replication/slot.c:1337 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "replikeringsslot \"%s\" är aktiv för PID %d" -#: replication/slot.c:754 replication/slot.c:1499 replication/slot.c:1882 +#: replication/slot.c:638 +#, c-format +msgid "acquired logical replication slot \"%s\"" +msgstr "tog logisk replikeringsslot \"%s\"" + +#: replication/slot.c:640 +#, c-format +msgid "acquired physical replication slot \"%s\"" +msgstr "tog fysisk replikeringsslot \"%s\"" + +#: replication/slot.c:729 +#, c-format +msgid "released logical replication slot \"%s\"" +msgstr "släppte logisk replikeringsslot \"%s\"" + +#: replication/slot.c:731 +#, c-format +msgid "released physical replication slot \"%s\"" +msgstr "släppte fysisk replikeringsslot \"%s\"" + +#: replication/slot.c:797 +#, c-format +msgid "cannot drop replication slot \"%s\"" +msgstr "kan inte slänga replikeringsslot \"%s\"" + +#: replication/slot.c:816 +#, c-format +msgid "cannot use %s with a physical replication slot" +msgstr "kan inte använda %s med en fysisk replikeringsslot" + +#: replication/slot.c:828 +#, c-format +msgid "cannot alter replication slot \"%s\"" +msgstr "kan inte ändra replikeringsslot \"%s\"" + +#: replication/slot.c:838 +#, c-format +msgid "cannot enable failover for a replication slot on the standby" +msgstr "kan inte aktivera failover för en replikeringsslot pÃ¥ standby:en" + +#: replication/slot.c:969 replication/slot.c:1927 replication/slot.c:2311 #, c-format msgid "could not remove directory \"%s\"" msgstr "kunde inte ta bort katalog \"%s\"" -#: replication/slot.c:1128 +#: replication/slot.c:1372 #, c-format -msgid "replication slots can only be used if max_replication_slots > 0" -msgstr "replikeringsslots kan bara användas om max_replication_slots > 0" +msgid "replication slots can only be used if \"max_replication_slots\" > 0" +msgstr "replikeringsslots kan bara användas om \"max_replication_slots\" > 0" -#: replication/slot.c:1133 +#: replication/slot.c:1377 #, c-format -msgid "replication slots can only be used if wal_level >= replica" -msgstr "replikeringsslots kan bara användas om wal_level >= replica" +msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" +msgstr "replikeringsslots kan bara användas om \"wal_level\" >= \"replica\"" -#: replication/slot.c:1145 +#: replication/slot.c:1389 #, c-format -msgid "must be superuser or replication role to use replication slots" -msgstr "mÃ¥ste vara superuser eller replikeringsroll för att använda replikeringsslottar" +msgid "permission denied to use replication slots" +msgstr "rättighet saknas för att använda replikeringsslottar" -#: replication/slot.c:1330 +#: replication/slot.c:1390 +#, c-format +msgid "Only roles with the %s attribute may use replication slots." +msgstr "Bara roller med attributet %s fÃ¥r använda replikeringsslottar." + +#: replication/slot.c:1498 +#, c-format +msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu byte." +msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." +msgstr[0] "Slottens restart_lsn %X/%X överskrider gränsen pÃ¥ %llu byte." +msgstr[1] "Slottens restart_lsn %X/%X överskrider gränsen pÃ¥ %llu bytes." + +#: replication/slot.c:1506 +#, c-format +msgid "The slot conflicted with xid horizon %u." +msgstr "Slotten är i konflikt med xid-horisont %u." + +#: replication/slot.c:1511 +msgid "Logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary server." +msgstr "logisk avkodning pÃ¥ standby kräver \"wal_level\" >= \"logical\" pÃ¥ primären" + +#: replication/slot.c:1519 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "avslutar process %d för att frigöra replikeringsslot \"%s\"" -#: replication/slot.c:1368 +#: replication/slot.c:1521 #, c-format -msgid "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds max_slot_wal_keep_size" -msgstr "invaliderar slot \"%s\" dÃ¥ dess restart_lsn %X/%X överskrider max_slot_wal_keep_size" +msgid "invalidating obsolete replication slot \"%s\"" +msgstr "invaliderar obsolet replikeringssslot \"%s\"" -#: replication/slot.c:1820 +#: replication/slot.c:2249 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "replikeringsslotfil \"%s\" har fel magiskt nummer: %u istället för %u" -#: replication/slot.c:1827 +#: replication/slot.c:2256 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "replikeringsslotfil \"%s\" har en icke stödd version %u" -#: replication/slot.c:1834 +#: replication/slot.c:2263 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "replikeringsslotfil \"%s\" har felaktig längd %u" -#: replication/slot.c:1870 +#: replication/slot.c:2299 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "kontrollsummefel för replikeringsslot-fil \"%s\": är %u, skall vara %u" -#: replication/slot.c:1904 +#: replication/slot.c:2333 #, c-format -msgid "logical replication slot \"%s\" exists, but wal_level < logical" -msgstr "logisk replikeringsslot \"%s\" finns men wal_level < replica" +msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" +msgstr "logisk replikeringsslot \"%s\" finns men \"wal_level\" < \"replica\"" -#: replication/slot.c:1906 +#: replication/slot.c:2335 #, c-format -msgid "Change wal_level to be logical or higher." -msgstr "Ändra wal_level till logical eller högre." +msgid "Change \"wal_level\" to be \"logical\" or higher." +msgstr "Ändra \"wal_level\" till \"logical\" eller högre." -#: replication/slot.c:1910 +#: replication/slot.c:2339 #, c-format -msgid "physical replication slot \"%s\" exists, but wal_level < replica" -msgstr "fysisk replikeringsslot \"%s\" finns men wal_level < replica" +msgid "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" +msgstr "fysisk replikeringsslot \"%s\" finns men \"wal_level\" < \"replica\"" -#: replication/slot.c:1912 +#: replication/slot.c:2341 #, c-format -msgid "Change wal_level to be replica or higher." -msgstr "Ändra wal_level till replica eller högre." +msgid "Change \"wal_level\" to be \"replica\" or higher." +msgstr "Ändra \"wal_level\" till \"replica\" eller högre." -#: replication/slot.c:1946 +#: replication/slot.c:2383 #, c-format msgid "too many replication slots active before shutdown" msgstr "för mÃ¥nga aktiva replikeringsslottar innan nerstängning" -#: replication/slotfuncs.c:592 +#: replication/slot.c:2458 +#, c-format +msgid "\"%s\" is not a physical replication slot" +msgstr "\"%s\" är inte en fysisk replikeringsslot" + +#: replication/slot.c:2635 +#, c-format +msgid "replication slot \"%s\" specified in parameter \"%s\" does not exist" +msgstr "replikeringsslot \"%s\" som angivits i parametern \"%s\" existerar inte" + +#: replication/slot.c:2637 replication/slot.c:2671 replication/slot.c:2686 +#, c-format +msgid "Logical replication is waiting on the standby associated with replication slot \"%s\"." +msgstr "Logisk replikering väntar pÃ¥ standby associerad med replikeringsslot \"%s\"." + +#: replication/slot.c:2639 +#, c-format +msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." +msgstr "Skapa replikeringsslotten \"%s\" eller ändra parametern \"%s\"" + +#: replication/slot.c:2649 +#, c-format +msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" +msgstr "kan inte ange logisk replikeringsslot \"%s\" i parametern \"%s\"" + +#: replication/slot.c:2651 +#, c-format +msgid "Logical replication is waiting for correction on replication slot \"%s\"." +msgstr "Logiska replikering väntar pÃ¥ rättning av replikeringsslot \"%s\"" + +#: replication/slot.c:2653 +#, c-format +msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." +msgstr "Ta bort logisk replikeringsslot \"%s\" frÃ¥n parametern \"%s\"" + +#: replication/slot.c:2669 +#, c-format +msgid "physical replication slot \"%s\" specified in parameter \"%s\" has been invalidated" +msgstr "fysisk replikeringsslot \"%s\" angiven i parametern \"%s\" har invaliderats" + +#: replication/slot.c:2673 +#, c-format +msgid "Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." +msgstr "Släng och Ã¥terskapa replikeringsslotten \"%s\" eller ändra parametern %s." + +#: replication/slot.c:2684 +#, c-format +msgid "replication slot \"%s\" specified in parameter \"%s\" does not have active_pid" +msgstr "replikeringsslot \"%s\" angiven i parametern \"%s\" har inte active_pid" + +#: replication/slot.c:2688 +#, c-format +msgid "Start the standby associated with the replication slot \"%s\", or amend parameter \"%s\"." +msgstr "Starta standby associerad med replikeringsslot \"%s\" eller ändra parametern \"%s\"." + +#: replication/slotfuncs.c:526 #, c-format msgid "invalid target WAL LSN" msgstr "ogiltig mÃ¥l-LSN för WAL" -#: replication/slotfuncs.c:614 +#: replication/slotfuncs.c:548 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "replikeringsslot \"%s\" kan inte avanceras" -#: replication/slotfuncs.c:632 +#: replication/slotfuncs.c:550 +#, c-format +msgid "This slot has never previously reserved WAL, or it has been invalidated." +msgstr "Denna slot har aldrig tidigare reserverat WAL eller sÃ¥ har den invaliderats." + +#: replication/slotfuncs.c:566 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "kan inte flytta fram replikeringsslot till %X/%X, minimum är %X/%X" -#: replication/slotfuncs.c:739 +#: replication/slotfuncs.c:673 #, c-format msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "kan inte kopiera fysisk replikeringsslot \"%s\" som en logisk replikeringsslot" -#: replication/slotfuncs.c:741 +#: replication/slotfuncs.c:675 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "kan inte kopiera logisk replikeringsslot \"%s\" som en fysisk replikeringsslot" -#: replication/slotfuncs.c:748 +#: replication/slotfuncs.c:682 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "kan inte kopiera en replikeringsslot som inte tidigare har reserverat WAL" -#: replication/slotfuncs.c:825 +#: replication/slotfuncs.c:768 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "kunde inte kopiera replikeringsslot \"%s\"" -#: replication/slotfuncs.c:827 +#: replication/slotfuncs.c:770 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "Källreplikeringsslotten ändrades pÃ¥ ett inkompatibelt sätt under copy-operationen." -#: replication/slotfuncs.c:833 +#: replication/slotfuncs.c:776 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "kan inte kopiera ej slutförd replikeringsslot \"%s\"" -#: replication/slotfuncs.c:835 +#: replication/slotfuncs.c:778 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "Försök igen när källreplikeringsslottens confirmed_flush_lsn är giltig." -#: replication/syncrep.c:268 +#: replication/slotfuncs.c:877 +#, c-format +msgid "replication slots can only be synchronized to a standby server" +msgstr "replikerings-slot kan bara synkroniseras till en standby-server" + +#: replication/syncrep.c:261 #, c-format msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" msgstr "avbryter väntan pÃ¥ synkron replikering samt avslutar anslutning pÃ¥ grund av ett administratörskommando" -#: replication/syncrep.c:269 replication/syncrep.c:286 +#: replication/syncrep.c:262 replication/syncrep.c:279 #, c-format msgid "The transaction has already committed locally, but might not have been replicated to the standby." msgstr "Transaktionen har redan commit:ats lokalt men har kanske inte replikerats till standby:en." -#: replication/syncrep.c:285 +#: replication/syncrep.c:278 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "avbryter väntan pÃ¥ synkron replikering efter användarens önskemÃ¥l" -#: replication/syncrep.c:494 +#: replication/syncrep.c:485 #, c-format -msgid "standby \"%s\" is now a synchronous standby with priority %u" -msgstr "standby \"%s\" är nu en synkron standby med prioritet %u" +msgid "standby \"%s\" is now a synchronous standby with priority %d" +msgstr "standby \"%s\" är nu en synkron standby med prioritet %d" -#: replication/syncrep.c:498 +#: replication/syncrep.c:489 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "standby \"%s\" är nu en kvorumkandidat för synkron standby" -#: replication/syncrep.c:1045 +#: replication/syncrep.c:1013 #, c-format -msgid "synchronous_standby_names parser failed" -msgstr "synchronous_standby_names-parser misslyckades" +msgid "\"synchronous_standby_names\" parser failed" +msgstr "\"synchronous_standby_names\"-parser misslyckades" -#: replication/syncrep.c:1051 +#: replication/syncrep.c:1019 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "antal synkrona standbys (%d) mÃ¥ste vara fler än noll" -#: replication/walreceiver.c:164 +#: replication/walreceiver.c:176 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "avslutar wal-mottagarprocessen pÃ¥ grund av ett administratörskommando" -#: replication/walreceiver.c:292 -#, c-format -msgid "could not connect to the primary server: %s" -msgstr "kunde inte ansluta till primärserver: %s" - -#: replication/walreceiver.c:339 +#: replication/walreceiver.c:354 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "databassystemets identifierare skiljer sig Ã¥t mellan primären och standby:en" -#: replication/walreceiver.c:340 +#: replication/walreceiver.c:355 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "Primärens identifierare är %s, standby:ens identifierare är %s." -#: replication/walreceiver.c:351 +#: replication/walreceiver.c:366 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "högsta tidslinjen %u i primären är efter Ã¥terställningstidslinjen %u" -#: replication/walreceiver.c:404 +#: replication/walreceiver.c:419 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "startade strömning av WAL frÃ¥n primären vid %X/%X pÃ¥ tidslinje %u" -#: replication/walreceiver.c:408 +#: replication/walreceiver.c:423 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "Ã¥terstartade WAL-strömning vid %X/%X pÃ¥ tidslinje %u" -#: replication/walreceiver.c:437 +#: replication/walreceiver.c:458 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "kan inte fortsätta WAL-strömning, Ã¥terställning har redan avslutats" -#: replication/walreceiver.c:475 +#: replication/walreceiver.c:502 #, c-format msgid "replication terminated by primary server" msgstr "replikering avslutad av primär server" -#: replication/walreceiver.c:476 +#: replication/walreceiver.c:503 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "Slut pÃ¥ WAL nÃ¥dd pÃ¥ tidslinje %u vid %X/%X." -#: replication/walreceiver.c:565 +#: replication/walreceiver.c:593 #, c-format msgid "terminating walreceiver due to timeout" msgstr "avslutar wal-mottagare pÃ¥ grund av timeout" -#: replication/walreceiver.c:603 +#: replication/walreceiver.c:625 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "primär server har ingen mer WAL pÃ¥ efterfrÃ¥gad tidslinje %u" -#: replication/walreceiver.c:619 replication/walreceiver.c:1045 +#: replication/walreceiver.c:641 replication/walreceiver.c:1071 #, c-format -msgid "could not close log segment %s: %m" -msgstr "kunde inte stänga loggsegment %s: %m" +msgid "could not close WAL segment %s: %m" +msgstr "kunde inte stänga WAL-segment %s: %m" -#: replication/walreceiver.c:738 +#: replication/walreceiver.c:760 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "hämtar tidslinjehistorikfil för tidslinje %u frÃ¥n primära servern" -#: replication/walreceiver.c:933 +#: replication/walreceiver.c:959 #, c-format -msgid "could not write to log segment %s at offset %u, length %lu: %m" -msgstr "kunde inte skriva till loggfilsegment %s pÃ¥ offset %u, längd %lu: %m" +msgid "could not write to WAL segment %s at offset %d, length %lu: %m" +msgstr "kunde inte skriva till WAL-segment %s pÃ¥ offset %d, längd %lu: %m" -#: replication/walsender.c:521 +#: replication/walsender.c:531 #, c-format msgid "cannot use %s with a logical replication slot" msgstr "kan inte använda %s med logisk replikeringsslot" -#: replication/walsender.c:638 storage/smgr/md.c:1364 +#: replication/walsender.c:635 storage/smgr/md.c:1735 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "kunde inte söka (seek) till slutet av filen \"%s\": %m" -#: replication/walsender.c:642 +#: replication/walsender.c:639 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "kunde inte söka till början av filen \"%s\": %m" -#: replication/walsender.c:719 +#: replication/walsender.c:853 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "kan inte använda logisk replikeringsslot för fysisk replikering" -#: replication/walsender.c:785 +#: replication/walsender.c:919 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "efterfrÃ¥gad startpunkt %X/%X pÃ¥ tidslinje %u finns inte i denna servers historik" -#: replication/walsender.c:788 +#: replication/walsender.c:922 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "Denna servers historik delade sig frÃ¥n tidslinje %u vid %X/%X." -#: replication/walsender.c:832 +#: replication/walsender.c:966 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "efterfrÃ¥gad startpunkt %X/%X är längre fram än denna servers flush:ade WAL-skrivposition %X/%X" -#: replication/walsender.c:1015 +#: replication/walsender.c:1160 #, c-format msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" msgstr "okänt värde för CREATE_REPLICATION_SLOT-flagga \"%s\": \"%s\"" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1100 +#: replication/walsender.c:1266 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s fÃ¥r inte anropas i en transaktion" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1110 +#: replication/walsender.c:1276 #, c-format msgid "%s must be called inside a transaction" msgstr "%s mÃ¥ste anropas i en transaktion" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1116 +#: replication/walsender.c:1282 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s mÃ¥ste anropas i transaktions REPEATABLE READ-isolationsläge" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1122 +#: replication/walsender.c:1287 +#, c-format +msgid "%s must be called in a read-only transaction" +msgstr "%s mÃ¥ste anropas i en read-only-transaktion" + +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1293 #, c-format msgid "%s must be called before any query" msgstr "%s mÃ¥ste anropas innan nÃ¥gon frÃ¥ga" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1128 +#: replication/walsender.c:1299 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s fÃ¥r inte anropas i en undertransaktion" -#: replication/walsender.c:1271 -#, c-format -msgid "cannot read from logical replication slot \"%s\"" -msgstr "kan inte läsa frÃ¥n logisk replikeringsslot \"%s\"" - -#: replication/walsender.c:1273 -#, c-format -msgid "This slot has been invalidated because it exceeded the maximum reserved size." -msgstr "Denna slot har invaliderats dÃ¥ den överskred maximal reserverad storlek." - -#: replication/walsender.c:1283 +#: replication/walsender.c:1472 #, c-format msgid "terminating walsender process after promotion" -msgstr "stänger ner walsender-process efter befordring" +msgstr "stänger ner walsender-process efter befordran" -#: replication/walsender.c:1704 +#: replication/walsender.c:2000 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "kan inte utföra nya kommandon när WAL-sändare är i stopp-läge" -#: replication/walsender.c:1739 +#: replication/walsender.c:2035 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "kan inte köra SQL-kommandon i WAL-sändare för fysisk replikering" -#: replication/walsender.c:1772 +#: replication/walsender.c:2068 #, c-format msgid "received replication command: %s" msgstr "tog emot replikeringskommando: %s" -#: replication/walsender.c:1780 tcop/fastpath.c:208 tcop/postgres.c:1114 -#: tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 -#: tcop/postgres.c:2614 tcop/postgres.c:2692 +#: replication/walsender.c:2076 tcop/fastpath.c:209 tcop/postgres.c:1142 +#: tcop/postgres.c:1500 tcop/postgres.c:1752 tcop/postgres.c:2234 +#: tcop/postgres.c:2672 tcop/postgres.c:2749 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "aktuella transaktionen har avbrutits, alla kommandon ignoreras tills slutet pÃ¥ transaktionen" -#: replication/walsender.c:1922 replication/walsender.c:1957 +#: replication/walsender.c:2233 replication/walsender.c:2268 #, c-format msgid "unexpected EOF on standby connection" msgstr "oväntat EOF frÃ¥n standby-anslutning" -#: replication/walsender.c:1945 +#: replication/walsender.c:2256 #, c-format msgid "invalid standby message type \"%c\"" msgstr "ogiltigt standby-meddelandetyp \"%c\"" -#: replication/walsender.c:2034 +#: replication/walsender.c:2345 #, c-format msgid "unexpected message type \"%c\"" msgstr "oväntad meddelandetyp \"%c\"" -#: replication/walsender.c:2447 +#: replication/walsender.c:2759 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "avslutar walsender-process pÃ¥ grund av replikerings-timeout" -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1013 +#: rewrite/rewriteDefine.c:104 rewrite/rewriteDefine.c:835 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "regel \"%s\" för relation \"%s\" existerar redan" -#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:951 +#: rewrite/rewriteDefine.c:261 rewrite/rewriteDefine.c:773 #, c-format msgid "relation \"%s\" cannot have rules" -msgstr "relationen \"%s\" kan inte regler" +msgstr "relationen \"%s\" kan inte ha regler" -#: rewrite/rewriteDefine.c:302 +#: rewrite/rewriteDefine.c:292 #, c-format msgid "rule actions on OLD are not implemented" msgstr "regelhandlingar pÃ¥ OLD är inte implementerat" -#: rewrite/rewriteDefine.c:303 +#: rewrite/rewriteDefine.c:293 #, c-format msgid "Use views or triggers instead." msgstr "Använd vyer eller triggrar istället." -#: rewrite/rewriteDefine.c:307 +#: rewrite/rewriteDefine.c:297 #, c-format msgid "rule actions on NEW are not implemented" msgstr "regelhandlingar pÃ¥ NEW är inte implementerat" -#: rewrite/rewriteDefine.c:308 +#: rewrite/rewriteDefine.c:298 #, c-format msgid "Use triggers instead." msgstr "Använd triggrar istället." -#: rewrite/rewriteDefine.c:321 +#: rewrite/rewriteDefine.c:312 +#, c-format +msgid "relation \"%s\" cannot have ON SELECT rules" +msgstr "relationen \"%s\" kan inte ha ON SELECT-regler" + +#: rewrite/rewriteDefine.c:322 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "INSTEAD NOTHING-regler pÃ¥ SELECT är inte implementerat ännu" -#: rewrite/rewriteDefine.c:322 +#: rewrite/rewriteDefine.c:323 #, c-format msgid "Use views instead." msgstr "Använd vyer istället." -#: rewrite/rewriteDefine.c:330 +#: rewrite/rewriteDefine.c:331 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "flera regelhandlingar pÃ¥ SELECT är inte implementerat" -#: rewrite/rewriteDefine.c:340 +#: rewrite/rewriteDefine.c:341 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "regler pÃ¥ SELECT mÃ¥ste ha handlingen INSTEAD SELECT" -#: rewrite/rewriteDefine.c:348 -#, c-format -msgid "rules on SELECT must not contain data-modifying statements in WITH" -msgstr "regler pÃ¥ SELECT fÃ¥r inte innehÃ¥lla datamodifierande satser i WITH" - -#: rewrite/rewriteDefine.c:356 -#, c-format -msgid "event qualifications are not implemented for rules on SELECT" -msgstr "händelsebegränsningar är inte implementerat för regler pÃ¥ SELECT" - -#: rewrite/rewriteDefine.c:383 -#, c-format -msgid "\"%s\" is already a view" -msgstr "\"%s\" är redan en vy" - -#: rewrite/rewriteDefine.c:407 -#, c-format -msgid "view rule for \"%s\" must be named \"%s\"" -msgstr "vy-regel (rule) för \"%s\" mÃ¥ste ha namnet \"%s\"" - -#: rewrite/rewriteDefine.c:436 -#, c-format -msgid "cannot convert partitioned table \"%s\" to a view" -msgstr "kan inte konvertera partitionerad tabell \"%s\" till en vy" - -#: rewrite/rewriteDefine.c:445 -#, c-format -msgid "cannot convert partition \"%s\" to a view" -msgstr "kan inte konvertera partition \"%s\" till en vy" - -#: rewrite/rewriteDefine.c:454 -#, c-format -msgid "could not convert table \"%s\" to a view because it is not empty" -msgstr "kunde inte konvertera tabell \"%s\" till en vy dÃ¥ den inte är tom" - -#: rewrite/rewriteDefine.c:463 -#, c-format -msgid "could not convert table \"%s\" to a view because it has triggers" -msgstr "kunde inte konvertera tabell \"%s\" till en vy dÃ¥ den har triggrar" - -#: rewrite/rewriteDefine.c:465 -#, c-format -msgid "In particular, the table cannot be involved in any foreign key relationships." -msgstr "Mer specifikt, tabellen kan inte vare inblandad i främmande-nyckelberoenden." - -#: rewrite/rewriteDefine.c:470 -#, c-format -msgid "could not convert table \"%s\" to a view because it has indexes" -msgstr "kunde inte konvertera tabell \"%s\" till en vy eftersom den har index" - -#: rewrite/rewriteDefine.c:476 +#: rewrite/rewriteDefine.c:349 #, c-format -msgid "could not convert table \"%s\" to a view because it has child tables" -msgstr "kunde inte konvertera tabell \"%s\" till en vy dÃ¥ den har barntabeller" +msgid "rules on SELECT must not contain data-modifying statements in WITH" +msgstr "regler pÃ¥ SELECT fÃ¥r inte innehÃ¥lla datamodifierande satser i WITH" -#: rewrite/rewriteDefine.c:482 +#: rewrite/rewriteDefine.c:357 #, c-format -msgid "could not convert table \"%s\" to a view because it has parent tables" -msgstr "kunde inte konvertera tabell \"%s\" till en vy dÃ¥ den har föräldratabeller" +msgid "event qualifications are not implemented for rules on SELECT" +msgstr "händelsebegränsningar är inte implementerat för regler pÃ¥ SELECT" -#: rewrite/rewriteDefine.c:488 +#: rewrite/rewriteDefine.c:384 #, c-format -msgid "could not convert table \"%s\" to a view because it has row security enabled" -msgstr "kunde inte konvertera tabell \"%s\" till en vy eftersom den har radsäkerhet pÃ¥slagen" +msgid "\"%s\" is already a view" +msgstr "\"%s\" är redan en vy" -#: rewrite/rewriteDefine.c:494 +#: rewrite/rewriteDefine.c:408 #, c-format -msgid "could not convert table \"%s\" to a view because it has row security policies" -msgstr "kunde inte konvertera tabell \"%s\" till en vy eftersom den har radsäkerhetspolicy" +msgid "view rule for \"%s\" must be named \"%s\"" +msgstr "vy-regel (rule) för \"%s\" mÃ¥ste ha namnet \"%s\"" -#: rewrite/rewriteDefine.c:521 +#: rewrite/rewriteDefine.c:435 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "kan inte ha flera RETURNING-listor i en regel" -#: rewrite/rewriteDefine.c:526 +#: rewrite/rewriteDefine.c:440 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "RETURNING-listor stöds inte i villkorade regler" -#: rewrite/rewriteDefine.c:530 +#: rewrite/rewriteDefine.c:444 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "RETURNING-listor stöds inte i icke-INSTEAD-regler" -#: rewrite/rewriteDefine.c:544 +#: rewrite/rewriteDefine.c:458 #, c-format msgid "non-view rule for \"%s\" must not be named \"%s\"" msgstr "regel (rule) för icke-vy \"%s\" fÃ¥r inte ha namnet \"%s\"" -#: rewrite/rewriteDefine.c:706 +#: rewrite/rewriteDefine.c:532 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "SELECT-regelns mÃ¥llista har för mÃ¥nga poster" -#: rewrite/rewriteDefine.c:707 +#: rewrite/rewriteDefine.c:533 #, c-format msgid "RETURNING list has too many entries" msgstr "RETURNING-lista har för mÃ¥nga element" -#: rewrite/rewriteDefine.c:734 +#: rewrite/rewriteDefine.c:560 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "kan inte konvertera en relation som har borttagna kolumner till en vy" -#: rewrite/rewriteDefine.c:735 +#: rewrite/rewriteDefine.c:561 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "kan inte skapa en RETURNING-lista för relationer som innehÃ¥ller borttagna kolumner" -#: rewrite/rewriteDefine.c:741 +#: rewrite/rewriteDefine.c:567 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "SELECT-regels mÃ¥lpost %d har ett annat kolumnnamn än kolumnen \"%s\"" -#: rewrite/rewriteDefine.c:743 +#: rewrite/rewriteDefine.c:569 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "SELECT-mÃ¥lpost har namn \"%s\"." -#: rewrite/rewriteDefine.c:752 +#: rewrite/rewriteDefine.c:578 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "SELECT-regels mÃ¥lpot %d har en annan typ än kolumnen \"%s\"" -#: rewrite/rewriteDefine.c:754 +#: rewrite/rewriteDefine.c:580 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "RETURNING-listans post %d har en annan typ än kolumnen \"%s\"" -#: rewrite/rewriteDefine.c:757 rewrite/rewriteDefine.c:781 +#: rewrite/rewriteDefine.c:583 rewrite/rewriteDefine.c:607 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "SELECT-mÃ¥lpost har typ %s men kolumnen har typ %s." -#: rewrite/rewriteDefine.c:760 rewrite/rewriteDefine.c:785 +#: rewrite/rewriteDefine.c:586 rewrite/rewriteDefine.c:611 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "RETURNING-listpost har typ %s men kolumnen har typ %s." -#: rewrite/rewriteDefine.c:776 +#: rewrite/rewriteDefine.c:602 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "SELECT-regelns mÃ¥lpost %d har en annan storlek än kolumnen \"%s\"" -#: rewrite/rewriteDefine.c:778 +#: rewrite/rewriteDefine.c:604 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "RETURNING-listpost %d har en annan storlek än kolumnen\"%s\"" -#: rewrite/rewriteDefine.c:795 +#: rewrite/rewriteDefine.c:621 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "SELECT-regels mÃ¥llista har för fÃ¥ element" -#: rewrite/rewriteDefine.c:796 +#: rewrite/rewriteDefine.c:622 #, c-format msgid "RETURNING list has too few entries" msgstr "RETURNING-lista har för fÃ¥ element" -#: rewrite/rewriteDefine.c:889 rewrite/rewriteDefine.c:1004 -#: rewrite/rewriteSupport.c:109 +#: rewrite/rewriteDefine.c:711 rewrite/rewriteDefine.c:826 +#: rewrite/rewriteSupport.c:108 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "regel \"%s\" för relation \"%s\" existerar inte" -#: rewrite/rewriteDefine.c:1023 +#: rewrite/rewriteDefine.c:845 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "byta namn pÃ¥ en ON SELECT-regel tillÃ¥ts inte" -#: rewrite/rewriteHandler.c:559 +#: rewrite/rewriteHandler.c:588 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "WITH-frÃ¥genamn \"%s\" finns bÃ¥de i en regelhändelse och i frÃ¥gan som skrivs om" -#: rewrite/rewriteHandler.c:586 +#: rewrite/rewriteHandler.c:615 #, c-format -msgid "INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH" -msgstr "INSERT...SELECT-regler stöds inte för frÃ¥gor som har datamodifierande satser i WITH" +msgid "INSERT ... SELECT rule actions are not supported for queries having data-modifying statements in WITH" +msgstr "INSERT ... SELECT-regler stöds inte för frÃ¥gor som har datamodifierande satser i WITH" -#: rewrite/rewriteHandler.c:639 +#: rewrite/rewriteHandler.c:668 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "kan inte ha RETURNING-listor i multipla regler" -#: rewrite/rewriteHandler.c:871 rewrite/rewriteHandler.c:910 +#: rewrite/rewriteHandler.c:900 rewrite/rewriteHandler.c:939 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "kan inte sätta in ett icke-DEFAULT-värde i kolumn \"%s\"" -#: rewrite/rewriteHandler.c:873 rewrite/rewriteHandler.c:939 +#: rewrite/rewriteHandler.c:902 rewrite/rewriteHandler.c:968 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "Kolumn \"%s\" är en identitetskolumn definierad som GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:875 +#: rewrite/rewriteHandler.c:904 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Använd OVERRIDING SYSTEM VALUE för att överskugga." -#: rewrite/rewriteHandler.c:937 rewrite/rewriteHandler.c:945 +#: rewrite/rewriteHandler.c:966 rewrite/rewriteHandler.c:974 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "kolumn \"%s\" kan bara uppdateras till DEFAULT" -#: rewrite/rewriteHandler.c:1092 rewrite/rewriteHandler.c:1110 +#: rewrite/rewriteHandler.c:1109 rewrite/rewriteHandler.c:1127 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "flera tilldelningar till samma kolumn \"%s\"" -#: rewrite/rewriteHandler.c:2112 rewrite/rewriteHandler.c:3990 +#: rewrite/rewriteHandler.c:1682 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE stöds inte för relationer med regler." + +#: rewrite/rewriteHandler.c:1722 rewrite/rewriteHandler.c:3262 +#, c-format +msgid "access to non-system view \"%s\" is restricted" +msgstr "access till icke-system vy \"%s\" är begränsad" + +#: rewrite/rewriteHandler.c:2122 rewrite/rewriteHandler.c:4254 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "oändlig rekursion detekterad i reglerna för relation \"%s\"" -#: rewrite/rewriteHandler.c:2197 +#: rewrite/rewriteHandler.c:2227 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "oändlig rekursion detekterad i policy för relation \"%s\"" -#: rewrite/rewriteHandler.c:2517 +#: rewrite/rewriteHandler.c:2589 msgid "Junk view columns are not updatable." msgstr "Skräpkolumner i vy är inte uppdateringsbara." -#: rewrite/rewriteHandler.c:2522 +#: rewrite/rewriteHandler.c:2594 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Vykolumner som inte är kolumner i dess basrelation är inte uppdateringsbara." -#: rewrite/rewriteHandler.c:2525 +#: rewrite/rewriteHandler.c:2597 msgid "View columns that refer to system columns are not updatable." msgstr "Vykolumner som refererar till systemkolumner är inte uppdateringsbara." -#: rewrite/rewriteHandler.c:2528 +#: rewrite/rewriteHandler.c:2600 msgid "View columns that return whole-row references are not updatable." msgstr "Vykolumner som returnerar hel-rad-referenser är inte uppdateringsbara." -#: rewrite/rewriteHandler.c:2589 +#: rewrite/rewriteHandler.c:2661 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Vyer som innehÃ¥ller DISTINCT är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2592 +#: rewrite/rewriteHandler.c:2664 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Vyer som innehÃ¥ller GROUP BY är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2595 +#: rewrite/rewriteHandler.c:2667 msgid "Views containing HAVING are not automatically updatable." msgstr "Vyer som innehÃ¥ller HAVING är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2598 +#: rewrite/rewriteHandler.c:2670 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Vyer som innehÃ¥ller UNION, INTERSECT eller EXCEPT är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2601 +#: rewrite/rewriteHandler.c:2673 msgid "Views containing WITH are not automatically updatable." msgstr "Vyer som innehÃ¥ller WITH är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2604 +#: rewrite/rewriteHandler.c:2676 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Vyer som innehÃ¥ller LIMIT eller OFFSET är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2616 +#: rewrite/rewriteHandler.c:2688 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Vyer som returnerar aggregatfunktioner är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2619 +#: rewrite/rewriteHandler.c:2691 msgid "Views that return window functions are not automatically updatable." msgstr "Vyer som returnerar fönsterfunktioner uppdateras inte automatiskt." -#: rewrite/rewriteHandler.c:2622 +#: rewrite/rewriteHandler.c:2694 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Vyer som returnerar mängd-returnerande funktioner är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2629 rewrite/rewriteHandler.c:2633 -#: rewrite/rewriteHandler.c:2641 +#: rewrite/rewriteHandler.c:2701 rewrite/rewriteHandler.c:2705 +#: rewrite/rewriteHandler.c:2713 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "Vyer som inte läser frÃ¥n en ensam tabell eller vy är inte automatiskt uppdateringsbar." -#: rewrite/rewriteHandler.c:2644 +#: rewrite/rewriteHandler.c:2716 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Vyer som innehÃ¥ller TABLESAMPLE är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:2668 +#: rewrite/rewriteHandler.c:2740 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Vyer som inte har nÃ¥gra uppdateringsbara kolumner är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:3145 +#: rewrite/rewriteHandler.c:3121 rewrite/rewriteHandler.c:3156 +#, c-format +msgid "cannot insert into view \"%s\"" +msgstr "kan inte sätta in i vy \"%s\"" + +#: rewrite/rewriteHandler.c:3124 +#, c-format +msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." +msgstr "För att tillÃ¥ta insättning i en vy sÃ¥ skapa en INSTEAD OF INSERT-trigger eller en villkorslös ON INSERT DO INSTEAD-regel." + +#: rewrite/rewriteHandler.c:3129 rewrite/rewriteHandler.c:3165 +#, c-format +msgid "cannot update view \"%s\"" +msgstr "kan inte uppdatera vy \"%s\"" + +#: rewrite/rewriteHandler.c:3132 +#, c-format +msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." +msgstr "För att tillÃ¥ta uppdatering av en vy sÃ¥ skapa en INSTEAD OF UPDATE-trigger eller en villkorslös ON UPDATE DO INSTEAD-regel." + +#: rewrite/rewriteHandler.c:3137 rewrite/rewriteHandler.c:3174 +#, c-format +msgid "cannot delete from view \"%s\"" +msgstr "kan inte radera frÃ¥n vy \"%s\"" + +#: rewrite/rewriteHandler.c:3140 +#, c-format +msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." +msgstr "För att tillÃ¥ta bortagning i en vy sÃ¥ skapa en INSTEAD OF DELETE-trigger eller en villkorslös ON DELETE DO INSTEAD-regel." + +#: rewrite/rewriteHandler.c:3159 +#, c-format +msgid "To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT trigger." +msgstr "För att tillÃ¥ta insert till en vy med MERGE sÃ¥ krävs en INSTEAD OF INSERT-trigger." + +#: rewrite/rewriteHandler.c:3168 +#, c-format +msgid "To enable updating the view using MERGE, provide an INSTEAD OF UPDATE trigger." +msgstr "För att tillÃ¥ta uppdatering av en vy sÃ¥ krävs en INSTEAD OF UPDATE-trigger." + +#: rewrite/rewriteHandler.c:3177 +#, c-format +msgid "To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE trigger." +msgstr "För att tillÃ¥ta borttagning frÃ¥n en vy sÃ¥ krävs en INSTEAD OF DELETE-trigger." + +#: rewrite/rewriteHandler.c:3352 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "kan inte insert:a i kolumn \"%s\" i vy \"%s\"" -#: rewrite/rewriteHandler.c:3153 +#: rewrite/rewriteHandler.c:3360 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "kan inte uppdatera kolumn \"%s\" i view \"%s\"" -#: rewrite/rewriteHandler.c:3644 +#: rewrite/rewriteHandler.c:3368 +#, c-format +msgid "cannot merge into column \"%s\" of view \"%s\"" +msgstr "kan inte merge:a till kolumn \"%s\" i vy \"%s\"" + +#: rewrite/rewriteHandler.c:3396 +#, c-format +msgid "cannot merge into view \"%s\"" +msgstr "kan inte merge:a till vy \"%s\"" + +#: rewrite/rewriteHandler.c:3398 +#, c-format +msgid "MERGE is not supported for views with INSTEAD OF triggers for some actions but not all." +msgstr "MERGE stöds inte för vyer med INSTEAD OF-trigger för vissa actions men inte för andra." + +#: rewrite/rewriteHandler.c:3399 +#, c-format +msgid "To enable merging into the view, either provide a full set of INSTEAD OF triggers or drop the existing INSTEAD OF triggers." +msgstr "För att tillÃ¥ta merge till en vy sÃ¥ antingen skapa en full uppsättning INSTEAD OF-triggers eller släng de befintliga INSERT OF-triggers." + +#: rewrite/rewriteHandler.c:3912 #, c-format msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" msgstr "DO INSTEAD NOTIFY-regler stöds inte för datamodifierande satser i WITH" -#: rewrite/rewriteHandler.c:3655 +#: rewrite/rewriteHandler.c:3923 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "DO INSTEAD NOTHING-regler stöds inte för datamodifierande satser i WITH" -#: rewrite/rewriteHandler.c:3669 +#: rewrite/rewriteHandler.c:3937 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "villkorliga DO INSTEAD-regler stöds inte för datamodifierande satser i WITH" -#: rewrite/rewriteHandler.c:3673 +#: rewrite/rewriteHandler.c:3941 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "DO ALSO-regler stöds inte för datamodifierande satser i WITH" -#: rewrite/rewriteHandler.c:3678 +#: rewrite/rewriteHandler.c:3946 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "fler-satsiga DO INSTEAD-regler stöds inte för datamodifierande satser i WITH" -#: rewrite/rewriteHandler.c:3918 rewrite/rewriteHandler.c:3926 -#: rewrite/rewriteHandler.c:3934 -#, c-format +#: rewrite/rewriteHandler.c:4206 msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "Vyer med villkorliga DO INSTEAD-regler är inte automatiskt uppdateringsbara." -#: rewrite/rewriteHandler.c:4039 +#: rewrite/rewriteHandler.c:4303 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "kan inte utföra INSERT RETURNING pÃ¥ relation \"%s\"" -#: rewrite/rewriteHandler.c:4041 +#: rewrite/rewriteHandler.c:4305 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "Du behöver en villkorslös ON INSERT DO INSTEAD-regel med en RETURNING-klausul." -#: rewrite/rewriteHandler.c:4046 +#: rewrite/rewriteHandler.c:4310 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "kan inte utföra UPDATE RETURNING pÃ¥ relation \"%s\"" -#: rewrite/rewriteHandler.c:4048 +#: rewrite/rewriteHandler.c:4312 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "Du behöver en villkorslös ON UPDATE DO INSTEAD-regel med en RETURNING-klausul." -#: rewrite/rewriteHandler.c:4053 +#: rewrite/rewriteHandler.c:4317 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "kan inte utföra DELETE RETURNING pÃ¥ relation \"%s\"" -#: rewrite/rewriteHandler.c:4055 +#: rewrite/rewriteHandler.c:4319 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "Du behöver en villkorslös ON DELETE DO INSTEAD-regel med en RETURNING-klausul." -#: rewrite/rewriteHandler.c:4073 +#: rewrite/rewriteHandler.c:4337 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "INSERT med ON CONFLICT-klausul kan inte användas med tabell som har INSERT- eller UPDATE-regler" -#: rewrite/rewriteHandler.c:4130 +#: rewrite/rewriteHandler.c:4394 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH kan inte användas i en frÃ¥ga där regler skrivit om den till flera olika frÃ¥gor" -#: rewrite/rewriteManip.c:1006 +#: rewrite/rewriteManip.c:1084 #, c-format msgid "conditional utility statements are not implemented" msgstr "villkorliga hjälpsatser är inte implementerat" -#: rewrite/rewriteManip.c:1172 +#: rewrite/rewriteManip.c:1431 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "WHERE CURRENT OF för en vy är inte implementerat" -#: rewrite/rewriteManip.c:1507 +#: rewrite/rewriteManip.c:1767 #, c-format msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" msgstr "NEW-variabler i ON UPDATE-regler kan inte referera till kolumner som är del av en multiple uppdatering i subjektets UPDATE-kommando" @@ -21244,109 +22475,117 @@ msgstr "NEW-variabler i ON UPDATE-regler kan inte referera till kolumner som är msgid "with a SEARCH or CYCLE clause, the recursive reference to WITH query \"%s\" must be at the top level of its right-hand SELECT" msgstr "med en SEARCH- eller CYCLE-klausul sÃ¥ mÃ¥ste rekursiva referensen till WITH-frÃ¥ga \"%s\" vara pÃ¥ toppnivÃ¥ eller i dess högra SELECT" -#: scan.l:465 +#: scan.l:497 msgid "unterminated /* comment" msgstr "ej avslutad /*-kommentar" -#: scan.l:485 +#: scan.l:517 msgid "unterminated bit string literal" msgstr "ej avslutad bitsträngslitteral" -#: scan.l:499 +#: scan.l:531 msgid "unterminated hexadecimal string literal" msgstr "ej avslutad hexadecimal stränglitteral" -#: scan.l:549 +#: scan.l:581 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "osäker användning av strängkonstand med Unicode-escape:r" -#: scan.l:550 +#: scan.l:582 #, c-format -msgid "String constants with Unicode escapes cannot be used when standard_conforming_strings is off." -msgstr "Strängkonstanter som innehÃ¥ller Unicode-escapesekvenser kan inte användas när standard_conforming_strings är av." +msgid "String constants with Unicode escapes cannot be used when \"standard_conforming_strings\" is off." +msgstr "Strängkonstanter som innehÃ¥ller Unicode-escapesekvenser kan inte användas när \"standard_conforming_strings\" är av." -#: scan.l:611 +#: scan.l:643 msgid "unhandled previous state in xqs" msgstr "tidigare state i xqs som ej kan hanteras" -#: scan.l:685 +#: scan.l:717 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "Unicode-escapesekvenser mÃ¥ste vara \\uXXXX eller \\UXXXXXXXX." -#: scan.l:696 +#: scan.l:728 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "osäker användning av \\' i stränglitteral" -#: scan.l:697 +#: scan.l:729 #, c-format msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." msgstr "Använd '' för att inkludera ett enkelcitattecken i en sträng. \\' är inte säkert i klient-teckenkodning." -#: scan.l:769 +#: scan.l:801 msgid "unterminated dollar-quoted string" msgstr "icke terminerad dollarciterad sträng" -#: scan.l:786 scan.l:796 +#: scan.l:818 scan.l:828 msgid "zero-length delimited identifier" msgstr "noll-längds avdelad identifierare" -#: scan.l:807 syncrep_scanner.l:91 +#: scan.l:839 syncrep_scanner.l:101 msgid "unterminated quoted identifier" msgstr "icke terminerad citerad identifierare" -#: scan.l:970 +#: scan.l:1002 msgid "operator too long" msgstr "operatorn är för lÃ¥ng" -#: scan.l:983 +#: scan.l:1015 msgid "trailing junk after parameter" msgstr "skräptecken kommer efter parameter" -#: scan.l:1008 scan.l:1012 scan.l:1016 scan.l:1020 -msgid "trailing junk after numeric literal" -msgstr "efterföljande skräp efter numerisk literal" +#: scan.l:1036 +msgid "invalid hexadecimal integer" +msgstr "ogiltigt hexdecimalt heltal" + +#: scan.l:1040 +msgid "invalid octal integer" +msgstr "ogiltigt oktalt heltal" + +#: scan.l:1044 +msgid "invalid binary integer" +msgstr "ogiltigt binärt heltal" #. translator: %s is typically the translation of "syntax error" -#: scan.l:1183 +#: scan.l:1239 #, c-format msgid "%s at end of input" msgstr "%s vid slutet av indatan" #. translator: first %s is typically the translation of "syntax error" -#: scan.l:1191 +#: scan.l:1247 #, c-format msgid "%s at or near \"%s\"" msgstr "%s vid eller nära \"%s\"" -#: scan.l:1382 +#: scan.l:1439 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "ickestandard användning av \\' i stränglitteral" -#: scan.l:1383 +#: scan.l:1440 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "Använd '' för att skriva citattecken i strängar eller använd escape-strängsyntac (E'...')." -#: scan.l:1392 +#: scan.l:1449 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "ickestandard användning av \\\\ i strängslitteral" -#: scan.l:1393 +#: scan.l:1450 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "Använd escape-strängsyntax för bakstreck, dvs. E'\\\\'." -#: scan.l:1407 +#: scan.l:1464 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "ickestandard användning av escape i stränglitteral" -#: scan.l:1408 +#: scan.l:1465 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Använd escape-strängsyntax, dvs E'\\r\\n'." @@ -21377,213 +22616,238 @@ msgstr "okänd Snowball-parameter: \"%s\"" msgid "missing Language parameter" msgstr "saknar parameter \"Language\"" -#: statistics/extended_stats.c:179 +#: statistics/extended_stats.c:176 #, c-format msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "statistikobjekt \"%s.%s\" kunde inte beräknas för relation \"%s.%s\"" -#: statistics/mcv.c:1372 +#: statistics/mcv.c:1368 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "en funktion med post som värde anropades i sammanhang där poster inte kan godtagas." -#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 +#: storage/buffer/bufmgr.c:649 storage/buffer/bufmgr.c:805 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "fÃ¥r inte röra temporära tabeller som tillhör andra sessioner" -#: storage/buffer/bufmgr.c:851 +#: storage/buffer/bufmgr.c:1532 +#, c-format +msgid "invalid page in block %u of relation %s; zeroing out page" +msgstr "felaktig sida i block %u för relation %s; nollställer sidan" + +#: storage/buffer/bufmgr.c:2277 storage/buffer/localbuf.c:361 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "kan inte utöka relation %s utöver %u block" -#: storage/buffer/bufmgr.c:938 +#: storage/buffer/bufmgr.c:2348 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "oväntad data efter EOF i block %u för relation %s" -#: storage/buffer/bufmgr.c:940 +#: storage/buffer/bufmgr.c:2350 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Detta beteende har observerats med buggiga kärnor; fundera pÃ¥ att uppdatera ditt system." -#: storage/buffer/bufmgr.c:1039 -#, c-format -msgid "invalid page in block %u of relation %s; zeroing out page" -msgstr "felaktig sida i block %u för relation %s; nollställer sidan" - -#: storage/buffer/bufmgr.c:4669 +#: storage/buffer/bufmgr.c:5653 #, c-format msgid "could not write block %u of %s" msgstr "kunde inte skriva block %u av %s" -#: storage/buffer/bufmgr.c:4671 +#: storage/buffer/bufmgr.c:5655 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Multipla fel --- skrivfelet kan vara permanent." -#: storage/buffer/bufmgr.c:4692 storage/buffer/bufmgr.c:4711 +#: storage/buffer/bufmgr.c:5677 storage/buffer/bufmgr.c:5697 #, c-format msgid "writing block %u of relation %s" msgstr "skriver block %u i relation %s" -#: storage/buffer/bufmgr.c:5015 -#, c-format -msgid "snapshot too old" -msgstr "snapshot för gammal" - -#: storage/buffer/localbuf.c:205 +#: storage/buffer/localbuf.c:220 #, c-format msgid "no empty local buffer available" msgstr "ingen tom lokal buffer tillgänglig" -#: storage/buffer/localbuf.c:433 +#: storage/buffer/localbuf.c:597 #, c-format msgid "cannot access temporary tables during a parallel operation" msgstr "kan inte komma Ã¥t temporära tabeller under en parallell operation" -#: storage/file/buffile.c:333 +#: storage/buffer/localbuf.c:712 +#, c-format +msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." +msgstr "\"temp_buffers\" kan inte ändras efter att man använt temporära tabeller i sessionen." + +#: storage/file/buffile.c:338 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "kunde inte öppna temporär fil \"%s\" frÃ¥n BufFile \"%s\": %m" -#: storage/file/buffile.c:723 storage/file/buffile.c:844 +#: storage/file/buffile.c:632 +#, c-format +msgid "could not read from file set \"%s\": read only %zu of %zu bytes" +msgstr "kunde inte läsa frÃ¥n filmängd \"%s\": läste bara %zu av %zu byte" + +#: storage/file/buffile.c:634 +#, c-format +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "kunde inte läsa frÃ¥n temporärfil: läste bara %zu av %zu byte" + +#: storage/file/buffile.c:774 storage/file/buffile.c:877 #, c-format msgid "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" msgstr "kunde inte bestämma storlek pÃ¥ temporär fil \"%s\" frÃ¥n BufFile \"%s\": %m" -#: storage/file/buffile.c:923 +#: storage/file/buffile.c:956 #, c-format msgid "could not delete fileset \"%s\": %m" msgstr "kunde inte radera filmängd \"%s\": %m" -#: storage/file/buffile.c:941 storage/smgr/md.c:325 storage/smgr/md.c:904 +#: storage/file/buffile.c:974 storage/smgr/md.c:336 storage/smgr/md.c:1194 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "kunde inte trunkera fil \"%s\": %m" -#: storage/file/fd.c:522 storage/file/fd.c:594 storage/file/fd.c:630 +#: storage/file/fd.c:583 storage/file/fd.c:655 storage/file/fd.c:691 #, c-format msgid "could not flush dirty data: %m" msgstr "kunde inte flush:a smutsig data: %m" -#: storage/file/fd.c:552 +#: storage/file/fd.c:613 #, c-format msgid "could not determine dirty data size: %m" msgstr "kunde inte lista ut storlek pÃ¥ smutsig data: %m" -#: storage/file/fd.c:604 +#: storage/file/fd.c:665 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "kunde inte göra munmap() vid flush:ning av data: %m" -#: storage/file/fd.c:843 -#, c-format -msgid "could not link file \"%s\" to \"%s\": %m" -msgstr "kunde inte länka fil \"%s\" till \"%s\": %m" - -#: storage/file/fd.c:967 +#: storage/file/fd.c:983 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit misslyckades: %m" -#: storage/file/fd.c:1057 +#: storage/file/fd.c:1073 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "otillräckligt antal fildeskriptorer tillgängligt för att starta serverprocessen" -#: storage/file/fd.c:1058 +#: storage/file/fd.c:1074 #, c-format -msgid "System allows %d, we need at least %d." -msgstr "Systemet tillÃ¥ter %d, vi behöver minst %d." +msgid "System allows %d, server needs at least %d." +msgstr "Systemet tillÃ¥ter %d, servern behöver minst %d." -#: storage/file/fd.c:1153 storage/file/fd.c:2496 storage/file/fd.c:2606 -#: storage/file/fd.c:2757 +#: storage/file/fd.c:1162 storage/file/fd.c:2618 storage/file/fd.c:2727 +#: storage/file/fd.c:2878 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "slut pÃ¥ fildeskriptorer: %m; frigör och försök igen" -#: storage/file/fd.c:1527 +#: storage/file/fd.c:1536 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "temporär fil: sökväg \"%s\", storlek %lu" -#: storage/file/fd.c:1658 +#: storage/file/fd.c:1675 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "kunde inte skapa temporär katalog \"%s\": %m" -#: storage/file/fd.c:1665 +#: storage/file/fd.c:1682 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "kunde inte skapa temporär underkatalog \"%s\": %m" -#: storage/file/fd.c:1862 +#: storage/file/fd.c:1879 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "kan inte skapa temporär fil \"%s\": %m" -#: storage/file/fd.c:1898 +#: storage/file/fd.c:1915 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "kunde inte öppna temporär fil \"%s\": %m" # unlink refererar till unix-funktionen unlink() sÃ¥ den översätter vi inte -#: storage/file/fd.c:1939 +#: storage/file/fd.c:1956 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "kunde inte unlink:a temporär fil \"%s\": %m" -#: storage/file/fd.c:2027 +#: storage/file/fd.c:2044 #, c-format msgid "could not delete file \"%s\": %m" msgstr "kunde inte radera fil \"%s\": %m" -#: storage/file/fd.c:2207 +#: storage/file/fd.c:2234 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "storlek pÃ¥ temporär fil överskrider temp_file_limit (%dkB)" -#: storage/file/fd.c:2472 storage/file/fd.c:2531 +#: storage/file/fd.c:2594 storage/file/fd.c:2653 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "överskred maxAllocatedDescs (%d) vid försök att öppna fil \"%s\"" -#: storage/file/fd.c:2576 +#: storage/file/fd.c:2698 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "överskred maxAllocatedDescs (%d) vid försök att köra kommando \"%s\"" -#: storage/file/fd.c:2733 +#: storage/file/fd.c:2854 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "överskred maxAllocatedDescs (%d) vid försök att öppna katalog \"%s\"" -#: storage/file/fd.c:3269 +#: storage/file/fd.c:3384 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "oväntad fil hittades i katalogen för temporära filer: \"%s\"" -#: storage/file/fd.c:3387 +#: storage/file/fd.c:3502 #, c-format msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" msgstr "synkroniserar datakatalog (syncfs), förbrukad tid: %ld.%02d s, aktuell sökväg: %s" -#: storage/file/fd.c:3401 -#, c-format -msgid "could not synchronize file system for file \"%s\": %m" -msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" - -#: storage/file/fd.c:3619 +#: storage/file/fd.c:3729 #, c-format msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "synkroniserar datakatalog (pre-fsync), förbrukad tid: %ld.%02d s, aktuell sökväg: %s" -#: storage/file/fd.c:3651 +#: storage/file/fd.c:3761 #, c-format msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "synkroniserar datakatalog (fsync), förbrukad tid: %ld.%02d s, aktuell sökväg: %s" +#: storage/file/fd.c:3950 +#, c-format +msgid "\"debug_io_direct\" is not supported on this platform." +msgstr "\"debug_io_direct\" stöds inte pÃ¥ denna plattform." + +#: storage/file/fd.c:3964 +#, c-format +msgid "Invalid list syntax in parameter \"%s\"" +msgstr "Ogiltigt listsyntax för parameter \"%s\"" + +#: storage/file/fd.c:3984 +#, c-format +msgid "Invalid option \"%s\"" +msgstr "Ogiltig flagga \"%s\"" + +#: storage/file/fd.c:3997 +#, c-format +msgid "\"debug_io_direct\" is not supported for WAL because XLOG_BLCKSZ is too small" +msgstr "\"debug_io_direct\" stöds inte för WAL dÃ¥ XLOG_BLCKSZ är för liten" + +#: storage/file/fd.c:4004 +#, c-format +msgid "\"debug_io_direct\" is not supported for data because BLCKSZ is too small" +msgstr "\"debug_io_direct\" stöds inte för data dÃ¥ BLCKSZ är för liten" + #: storage/file/reinit.c:145 #, c-format msgid "resetting unlogged relations (init), elapsed time: %ld.%02d s, current path: %s" @@ -21594,142 +22858,174 @@ msgstr "nollställer ologgade relationer (init), förbrukad tid %ld.%02d s, aktu msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" msgstr "nollställer ologgade relationer (cleanup), förbrukad tid %ld.%02d s, aktuell sökväg: %s" -#: storage/file/sharedfileset.c:79 +#: storage/file/sharedfileset.c:73 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "kunde inte koppla till en SharedFileSet som redan tagits bort" -#: storage/ipc/dsm.c:353 +#: storage/ipc/dsm.c:379 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "dynamiskt delat minnes kontrollsegment är korrupt" -#: storage/ipc/dsm.c:418 +#: storage/ipc/dsm.c:444 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "dynamiskt delat minnes kontrollsegment är inte giltigt" -#: storage/ipc/dsm.c:600 +#: storage/ipc/dsm.c:626 #, c-format msgid "too many dynamic shared memory segments" msgstr "för mÃ¥nga dynamiska delade minnessegment" -#: storage/ipc/dsm_impl.c:235 storage/ipc/dsm_impl.c:544 -#: storage/ipc/dsm_impl.c:648 storage/ipc/dsm_impl.c:819 +#: storage/ipc/dsm_impl.c:231 storage/ipc/dsm_impl.c:537 +#: storage/ipc/dsm_impl.c:641 storage/ipc/dsm_impl.c:812 #, c-format msgid "could not unmap shared memory segment \"%s\": %m" msgstr "kunde inte avmappa delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:245 storage/ipc/dsm_impl.c:554 -#: storage/ipc/dsm_impl.c:658 storage/ipc/dsm_impl.c:829 +#: storage/ipc/dsm_impl.c:241 storage/ipc/dsm_impl.c:547 +#: storage/ipc/dsm_impl.c:651 storage/ipc/dsm_impl.c:822 #, c-format msgid "could not remove shared memory segment \"%s\": %m" msgstr "kunde inte ta bort delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:269 storage/ipc/dsm_impl.c:729 -#: storage/ipc/dsm_impl.c:843 +#: storage/ipc/dsm_impl.c:265 storage/ipc/dsm_impl.c:722 +#: storage/ipc/dsm_impl.c:836 #, c-format msgid "could not open shared memory segment \"%s\": %m" msgstr "kunde inte öppna delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:294 storage/ipc/dsm_impl.c:570 -#: storage/ipc/dsm_impl.c:774 storage/ipc/dsm_impl.c:867 +#: storage/ipc/dsm_impl.c:290 storage/ipc/dsm_impl.c:563 +#: storage/ipc/dsm_impl.c:767 storage/ipc/dsm_impl.c:860 #, c-format msgid "could not stat shared memory segment \"%s\": %m" msgstr "kunde inte göra stat() pÃ¥ delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:313 storage/ipc/dsm_impl.c:918 +#: storage/ipc/dsm_impl.c:309 storage/ipc/dsm_impl.c:911 #, c-format msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" msgstr "kunde inte ändra storlek pÃ¥ delat minnessegment \"%s\" till %zu byte: %m" -#: storage/ipc/dsm_impl.c:335 storage/ipc/dsm_impl.c:591 -#: storage/ipc/dsm_impl.c:750 storage/ipc/dsm_impl.c:940 +#: storage/ipc/dsm_impl.c:331 storage/ipc/dsm_impl.c:584 +#: storage/ipc/dsm_impl.c:743 storage/ipc/dsm_impl.c:933 #, c-format msgid "could not map shared memory segment \"%s\": %m" msgstr "kunde inte mappa delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:526 +#: storage/ipc/dsm_impl.c:519 #, c-format msgid "could not get shared memory segment: %m" msgstr "kunde inte hämta delat minnessegment: %m" -#: storage/ipc/dsm_impl.c:714 +#: storage/ipc/dsm_impl.c:707 #, c-format msgid "could not create shared memory segment \"%s\": %m" msgstr "kunde inte skapa delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:951 +#: storage/ipc/dsm_impl.c:944 #, c-format msgid "could not close shared memory segment \"%s\": %m" msgstr "kunde inte stänga delat minnessegment \"%s\": %m" -#: storage/ipc/dsm_impl.c:991 storage/ipc/dsm_impl.c:1040 +#: storage/ipc/dsm_impl.c:984 storage/ipc/dsm_impl.c:1033 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "kunde inte duplicera handle för \"%s\": %m" -#: storage/ipc/procarray.c:3823 +#: storage/ipc/dsm_registry.c:142 +#, c-format +msgid "DSM segment name cannot be empty" +msgstr "Namn pÃ¥ DSM-segment fÃ¥r inte vara tomt" + +#: storage/ipc/dsm_registry.c:146 +#, c-format +msgid "DSM segment name too long" +msgstr "Namn pÃ¥ DSM-segment är för lÃ¥ngt" + +#: storage/ipc/dsm_registry.c:150 +#, c-format +msgid "DSM segment size must be nonzero" +msgstr "Storlek pÃ¥ DSM-segment fÃ¥r inte vara noll" + +#: storage/ipc/dsm_registry.c:176 +#, c-format +msgid "requested DSM segment size does not match size of existing segment" +msgstr "efterfrÃ¥gad storlek pÃ¥ DSM-segment matchar inte storleken pÃ¥ nuvarande segment" + +#: storage/ipc/procarray.c:488 storage/lmgr/proc.c:357 +#: tcop/backend_startup.c:304 +#, c-format +msgid "sorry, too many clients already" +msgstr "ledsen, för mÃ¥nga klienter" + +#: storage/ipc/procarray.c:3857 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "databasen \"%s\" används av förberedda transationer" -#: storage/ipc/procarray.c:3855 storage/ipc/signalfuncs.c:226 +#: storage/ipc/procarray.c:3893 storage/ipc/procarray.c:3901 +#: storage/ipc/signalfuncs.c:235 storage/ipc/signalfuncs.c:242 +#, c-format +msgid "permission denied to terminate process" +msgstr "rättighet saknas för att avsluta process" + +#: storage/ipc/procarray.c:3894 storage/ipc/signalfuncs.c:236 #, c-format -msgid "must be a superuser to terminate superuser process" -msgstr "mÃ¥ste vara superuser för stoppa en superusers process" +msgid "Only roles with the %s attribute may terminate processes of roles with the %s attribute." +msgstr "Bara roller med attributet %s fÃ¥r terminera processer för roller som har attributet %s." -#: storage/ipc/procarray.c:3862 storage/ipc/signalfuncs.c:231 +#: storage/ipc/procarray.c:3902 storage/ipc/signalfuncs.c:243 #, c-format -msgid "must be a member of the role whose process is being terminated or member of pg_signal_backend" -msgstr "mÃ¥ste vara medlem i den roll vars process hÃ¥ller pÃ¥ att avslutas eller medlem i pg_signal_backend" +msgid "Only roles with privileges of the role whose process is being terminated or with privileges of the \"%s\" role may terminate this process." +msgstr "Bara roller med rättigheter frÃ¥n rollen vars process kommer termineras eller med rättigheter frÃ¥n rollen \"%s\" fÃ¥r terminera denna process." -#: storage/ipc/procsignal.c:419 +#: storage/ipc/procsignal.c:416 #, c-format -msgid "still waiting for backend with PID %lu to accept ProcSignalBarrier" -msgstr "väntare fortfarande pÃ¥ att backend:en med PID %lu skall acceptera ProcSignalBarrier" +msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" +msgstr "väntare fortfarande pÃ¥ att backend:en med PID %d skall acceptera ProcSignalBarrier" -#: storage/ipc/shm_mq.c:384 +#: storage/ipc/shm_mq.c:383 #, c-format msgid "cannot send a message of size %zu via shared memory queue" msgstr "kan inte skicka ett meddelande med storlek %zu via kö i delat minne" -#: storage/ipc/shm_mq.c:719 +#: storage/ipc/shm_mq.c:718 #, c-format msgid "invalid message size %zu in shared memory queue" msgstr "ogiltig meddelandestorlek %zu i kö i delat minne" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 -#: storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4259 -#: storage/lmgr/lock.c:4324 storage/lmgr/lock.c:4674 -#: storage/lmgr/predicate.c:2472 storage/lmgr/predicate.c:2487 -#: storage/lmgr/predicate.c:3969 storage/lmgr/predicate.c:5081 -#: utils/hash/dynahash.c:1112 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:984 +#: storage/lmgr/lock.c:1022 storage/lmgr/lock.c:2835 storage/lmgr/lock.c:4220 +#: storage/lmgr/lock.c:4285 storage/lmgr/lock.c:4635 +#: storage/lmgr/predicate.c:2468 storage/lmgr/predicate.c:2483 +#: storage/lmgr/predicate.c:3880 storage/lmgr/predicate.c:4927 +#: utils/hash/dynahash.c:1095 #, c-format msgid "out of shared memory" msgstr "slut pÃ¥ delat minne" -#: storage/ipc/shmem.c:170 storage/ipc/shmem.c:266 +#: storage/ipc/shmem.c:161 storage/ipc/shmem.c:257 #, c-format msgid "out of shared memory (%zu bytes requested)" msgstr "slut pÃ¥ delat minne (%zu byte efterfrÃ¥gat)" -#: storage/ipc/shmem.c:445 +#: storage/ipc/shmem.c:436 #, c-format msgid "could not create ShmemIndex entry for data structure \"%s\"" msgstr "kunde inte skapa ShmemIndex-post för datastrukturen \"%s\"" -#: storage/ipc/shmem.c:460 +#: storage/ipc/shmem.c:451 #, c-format msgid "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, actual %zu" msgstr "ShmemIndex-poststorlek är fel för datastruktur \"%s\": förväntade %zu var %zu" -#: storage/ipc/shmem.c:479 +#: storage/ipc/shmem.c:470 #, c-format msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" msgstr "otillräckligt delat minne för datastruktur \"%s\" (efterfrÃ¥gade %zu byte)" -#: storage/ipc/shmem.c:511 storage/ipc/shmem.c:530 +#: storage/ipc/shmem.c:502 storage/ipc/shmem.c:521 #, c-format msgid "requested shared memory size overflows size_t" msgstr "efterfrÃ¥gad delat minnesstorlek överskrider size_t" @@ -21739,355 +23035,353 @@ msgstr "efterfrÃ¥gad delat minnesstorlek överskrider size_t" msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %d är inte en PostgreSQL backend-process" -#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1434 -#: utils/adt/mcxtfuncs.c:190 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1453 +#: utils/adt/mcxtfuncs.c:182 #, c-format msgid "could not send signal to process %d: %m" msgstr "kunde inte skicka signal till process %d: %m" -#: storage/ipc/signalfuncs.c:124 +#: storage/ipc/signalfuncs.c:129 storage/ipc/signalfuncs.c:136 +#, c-format +msgid "permission denied to cancel query" +msgstr "rättighet saknas för att avbryta frÃ¥ga" + +#: storage/ipc/signalfuncs.c:130 #, c-format -msgid "must be a superuser to cancel superuser query" -msgstr "mÃ¥ste vara superuser för att avbryta en superusers frÃ¥ga" +msgid "Only roles with the %s attribute may cancel queries of roles with the %s attribute." +msgstr "Bara roller med attributet %s fÃ¥r avbryta frÃ¥gor Ã¥t roller med attributet %s." -#: storage/ipc/signalfuncs.c:129 +#: storage/ipc/signalfuncs.c:137 #, c-format -msgid "must be a member of the role whose query is being canceled or member of pg_signal_backend" -msgstr "mÃ¥ste vara medlem i den roll vars frÃ¥ga hÃ¥ller pÃ¥ att avbrytas eller medlem i pg_signal_backend" +msgid "Only roles with privileges of the role whose query is being canceled or with privileges of the \"%s\" role may cancel this query." +msgstr "Bara roller med rättigheter frÃ¥n rollen vars frÃ¥ga kommer avbrytas eller med rättigheter frÃ¥n rollen \"%s\" fÃ¥r avbryta denna frÃ¥ga." -#: storage/ipc/signalfuncs.c:170 +#: storage/ipc/signalfuncs.c:179 #, c-format msgid "could not check the existence of the backend with PID %d: %m" msgstr "kunde inte kontrollera existensen av en backend med PID %d: %m" -#: storage/ipc/signalfuncs.c:188 +#: storage/ipc/signalfuncs.c:197 #, c-format msgid "backend with PID %d did not terminate within %lld millisecond" msgid_plural "backend with PID %d did not terminate within %lld milliseconds" msgstr[0] "backend med PID %d terminerade inte inom %lld millisekund" msgstr[1] "backend med PID %d terminerade inte inom %lld millisekunder" -#: storage/ipc/signalfuncs.c:219 +#: storage/ipc/signalfuncs.c:228 #, c-format msgid "\"timeout\" must not be negative" msgstr "\"timeout\" kan inte vara negativ" -#: storage/ipc/signalfuncs.c:271 -#, c-format -msgid "must be superuser to rotate log files with adminpack 1.0" -msgstr "mÃ¥ste vara superuser för att rotera loggfiler med adminpack 1.0" - -#. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:273 utils/adt/genfile.c:250 -#, c-format -msgid "Consider using %s, which is part of core, instead." -msgstr "Du kanske kan använda %s istället som är en del av core." - -#: storage/ipc/signalfuncs.c:279 storage/ipc/signalfuncs.c:299 +#: storage/ipc/signalfuncs.c:285 #, c-format msgid "rotation not possible because log collection not active" msgstr "rotering är inte möjligt dÃ¥ logginsamling inte är aktiverad" -#: storage/ipc/standby.c:307 +#: storage/ipc/standby.c:329 #, c-format msgid "recovery still waiting after %ld.%03d ms: %s" msgstr "Ã¥terställning väntar fortfarande efter %ld.%03d ms: %s" -#: storage/ipc/standby.c:316 +#: storage/ipc/standby.c:338 #, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "Ã¥terställning slutade vänta efter efter %ld.%03d ms: %s" -#: storage/ipc/standby.c:883 tcop/postgres.c:3344 +#: storage/ipc/standby.c:920 tcop/postgres.c:3196 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "avbryter sats pÃ¥ grund av konflikt med Ã¥terställning" -#: storage/ipc/standby.c:884 tcop/postgres.c:2499 +#: storage/ipc/standby.c:921 tcop/postgres.c:2557 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "Användartransaktion orsakade deadlock för buffer vid Ã¥terställning." -#: storage/ipc/standby.c:1423 +#: storage/ipc/standby.c:1486 msgid "unknown reason" msgstr "okänt skäl" -#: storage/ipc/standby.c:1428 +#: storage/ipc/standby.c:1491 msgid "recovery conflict on buffer pin" msgstr "Ã¥terställningskonflikt vid bufferfastlÃ¥sning" -#: storage/ipc/standby.c:1431 +#: storage/ipc/standby.c:1494 msgid "recovery conflict on lock" msgstr "Ã¥terställningskonflikt vid lÃ¥s" -#: storage/ipc/standby.c:1434 +#: storage/ipc/standby.c:1497 msgid "recovery conflict on tablespace" msgstr "Ã¥terställningskonflikt vid tabellutrymme" -#: storage/ipc/standby.c:1437 +#: storage/ipc/standby.c:1500 msgid "recovery conflict on snapshot" msgstr "Ã¥terställningskonflikt vid snapshot" -#: storage/ipc/standby.c:1440 +#: storage/ipc/standby.c:1503 +msgid "recovery conflict on replication slot" +msgstr "Ã¥terställningskonflikt vid replikeringsslot" + +#: storage/ipc/standby.c:1506 msgid "recovery conflict on buffer deadlock" msgstr "Ã¥terställningskonflikt vid bufferdeadlock" -#: storage/ipc/standby.c:1443 +#: storage/ipc/standby.c:1509 msgid "recovery conflict on database" msgstr "Ã¥terställningskonflikt vid databas" -#: storage/large_object/inv_api.c:191 +#: storage/large_object/inv_api.c:190 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "pg_largeobject-post för OID %u, sida %d har ogiltig datafältstorlek %d" -#: storage/large_object/inv_api.c:274 +#: storage/large_object/inv_api.c:272 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "ogiltiga flaggor för att öppna stort objekt: %d" -#: storage/large_object/inv_api.c:457 +#: storage/large_object/inv_api.c:297 storage/large_object/inv_api.c:309 +#: storage/large_object/inv_api.c:506 storage/large_object/inv_api.c:617 +#: storage/large_object/inv_api.c:807 +#, c-format +msgid "permission denied for large object %u" +msgstr "rättighet saknas för stort objekt %u" + +#: storage/large_object/inv_api.c:455 #, c-format msgid "invalid whence setting: %d" msgstr "ogiltig whence-inställning: %d" -#: storage/large_object/inv_api.c:629 +#: storage/large_object/inv_api.c:627 #, c-format msgid "invalid large object write request size: %d" msgstr "ogiltig storlek för stort objects skrivningbegäran: %d" -#: storage/lmgr/deadlock.c:1122 +#: storage/lmgr/deadlock.c:1104 #, c-format msgid "Process %d waits for %s on %s; blocked by process %d." msgstr "Process %d väntar pÃ¥ %s för %s; blockerad av process %d." -#: storage/lmgr/deadlock.c:1141 +#: storage/lmgr/deadlock.c:1123 #, c-format msgid "Process %d: %s" msgstr "Process %d: %s" -#: storage/lmgr/deadlock.c:1150 +#: storage/lmgr/deadlock.c:1132 #, c-format msgid "deadlock detected" msgstr "deadlock upptäckt" -#: storage/lmgr/deadlock.c:1153 +#: storage/lmgr/deadlock.c:1135 #, c-format msgid "See server log for query details." msgstr "Se server-logg för frÃ¥gedetaljer." -#: storage/lmgr/lmgr.c:859 +#: storage/lmgr/lmgr.c:848 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "vid uppdatering av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:862 +#: storage/lmgr/lmgr.c:851 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "vid borttagning av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:865 +#: storage/lmgr/lmgr.c:854 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "vid lÃ¥sning av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:868 +#: storage/lmgr/lmgr.c:857 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "vid lÃ¥sning av uppdaterad version (%u,%u) av tupel i relation \"%s\"" -#: storage/lmgr/lmgr.c:871 +#: storage/lmgr/lmgr.c:860 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "vid insättning av indextupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:874 +#: storage/lmgr/lmgr.c:863 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "vid kontroll av unikhet av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:877 +#: storage/lmgr/lmgr.c:866 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "vid Ã¥terkontroll av uppdaterad tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:880 +#: storage/lmgr/lmgr.c:869 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "vid kontroll av uteslutningsvillkor av tupel (%u,%u) i relation \"%s\"" -#: storage/lmgr/lmgr.c:1135 +#: storage/lmgr/lmgr.c:1239 #, c-format msgid "relation %u of database %u" msgstr "relation %u i databasen %u" -#: storage/lmgr/lmgr.c:1141 +#: storage/lmgr/lmgr.c:1245 #, c-format msgid "extension of relation %u of database %u" msgstr "utökning av relation %u i databas %u" -#: storage/lmgr/lmgr.c:1147 +#: storage/lmgr/lmgr.c:1251 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid för databas %u" -#: storage/lmgr/lmgr.c:1152 +#: storage/lmgr/lmgr.c:1256 #, c-format msgid "page %u of relation %u of database %u" msgstr "sida %u i relation %u i databas %u" -#: storage/lmgr/lmgr.c:1159 +#: storage/lmgr/lmgr.c:1263 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "tuple (%u,%u) i relation %u i databas %u" -#: storage/lmgr/lmgr.c:1167 +#: storage/lmgr/lmgr.c:1271 #, c-format msgid "transaction %u" msgstr "transaktion %u" -#: storage/lmgr/lmgr.c:1172 +#: storage/lmgr/lmgr.c:1276 #, c-format msgid "virtual transaction %d/%u" msgstr "vituell transaktion %d/%u" -#: storage/lmgr/lmgr.c:1178 +#: storage/lmgr/lmgr.c:1282 #, c-format msgid "speculative token %u of transaction %u" msgstr "spekulativ token %u för transaktion %u" -#: storage/lmgr/lmgr.c:1184 +#: storage/lmgr/lmgr.c:1288 #, c-format msgid "object %u of class %u of database %u" msgstr "objekt %u av klass %u i databas %u" -#: storage/lmgr/lmgr.c:1192 +#: storage/lmgr/lmgr.c:1296 #, c-format msgid "user lock [%u,%u,%u]" msgstr "användarlÃ¥s [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1199 +#: storage/lmgr/lmgr.c:1303 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "rÃ¥dgivande lÃ¥s [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1207 +#: storage/lmgr/lmgr.c:1311 +#, c-format +msgid "remote transaction %u of subscription %u of database %u" +msgstr "fjärrtransaktion %u för prenumeration %u i databas %u" + +#: storage/lmgr/lmgr.c:1318 #, c-format msgid "unrecognized locktag type %d" msgstr "okänd lÃ¥setikettyp %d" -#: storage/lmgr/lock.c:803 +#: storage/lmgr/lock.c:812 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" msgstr "kan inte ta lÃ¥släge %s pÃ¥ databasobjekt när Ã¥terställning pÃ¥gÃ¥r" -#: storage/lmgr/lock.c:805 +#: storage/lmgr/lock.c:814 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "Bara RowExclusiveLock eller lägre kan tas pÃ¥ databasobjekt under Ã¥terställning." -#: storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 storage/lmgr/lock.c:2846 -#: storage/lmgr/lock.c:4260 storage/lmgr/lock.c:4325 storage/lmgr/lock.c:4675 -#, c-format -msgid "You might need to increase max_locks_per_transaction." -msgstr "Du kan behöva öka parametern max_locks_per_transaction." - -#: storage/lmgr/lock.c:3301 storage/lmgr/lock.c:3369 storage/lmgr/lock.c:3485 +#: storage/lmgr/lock.c:3284 storage/lmgr/lock.c:3352 storage/lmgr/lock.c:3468 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" msgstr "kan inte göra PREPARE samtidigt som vi hÃ¥ller lÃ¥s pÃ¥ sessionsnivÃ¥ och transaktionsnivÃ¥ för samma objekt" -#: storage/lmgr/predicate.c:700 +#: storage/lmgr/predicate.c:653 #, c-format msgid "not enough elements in RWConflictPool to record a read/write conflict" msgstr "ej tillräckligt med element i RWConflictPool för att spara ner en läs/skriv-konflikt" -#: storage/lmgr/predicate.c:701 storage/lmgr/predicate.c:729 +#: storage/lmgr/predicate.c:654 storage/lmgr/predicate.c:679 #, c-format -msgid "You might need to run fewer transactions at a time or increase max_connections." -msgstr "Du kan behöva köra färre samtidiga transaktioner eller öka max_connections." +msgid "You might need to run fewer transactions at a time or increase \"max_connections\"." +msgstr "Du kan behöva köra färre samtidiga transaktioner eller öka \"max_connections\"." -#: storage/lmgr/predicate.c:728 +#: storage/lmgr/predicate.c:678 #, c-format msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "ej tillräckligt med element i RWConflictPool för att spara ner en potentiell läs/skriv-konflikt" -#: storage/lmgr/predicate.c:1695 +#: storage/lmgr/predicate.c:1686 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "\"default_transaction_isolation\" är satt till \"serializable\"." -#: storage/lmgr/predicate.c:1696 +#: storage/lmgr/predicate.c:1687 #, c-format msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." msgstr "Du kan använda \"SET default_transaction_isolation = 'repeatable read'\" för att ändra standardvärdet." -#: storage/lmgr/predicate.c:1747 +#: storage/lmgr/predicate.c:1738 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "en snapshot-importerande transaktion fÃ¥r inte vara READ ONLY DEFERRABLE" -#: storage/lmgr/predicate.c:1826 utils/time/snapmgr.c:569 -#: utils/time/snapmgr.c:575 +#: storage/lmgr/predicate.c:1817 utils/time/snapmgr.c:535 +#: utils/time/snapmgr.c:541 #, c-format msgid "could not import the requested snapshot" msgstr "kunde inte importera efterfrÃ¥gat snapshot" -#: storage/lmgr/predicate.c:1827 utils/time/snapmgr.c:576 +#: storage/lmgr/predicate.c:1818 utils/time/snapmgr.c:542 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "Källprocessen med PID %d kör inte längre." -#: storage/lmgr/predicate.c:2473 storage/lmgr/predicate.c:2488 -#: storage/lmgr/predicate.c:3970 -#, c-format -msgid "You might need to increase max_pred_locks_per_transaction." -msgstr "Du kan behöva öka parametern max_pred_locks_per_transaction." - -#: storage/lmgr/predicate.c:4101 storage/lmgr/predicate.c:4137 -#: storage/lmgr/predicate.c:4170 storage/lmgr/predicate.c:4178 -#: storage/lmgr/predicate.c:4217 storage/lmgr/predicate.c:4459 -#: storage/lmgr/predicate.c:4796 storage/lmgr/predicate.c:4808 -#: storage/lmgr/predicate.c:4851 storage/lmgr/predicate.c:4889 +#: storage/lmgr/predicate.c:3991 storage/lmgr/predicate.c:4027 +#: storage/lmgr/predicate.c:4060 storage/lmgr/predicate.c:4068 +#: storage/lmgr/predicate.c:4107 storage/lmgr/predicate.c:4337 +#: storage/lmgr/predicate.c:4656 storage/lmgr/predicate.c:4668 +#: storage/lmgr/predicate.c:4715 storage/lmgr/predicate.c:4751 #, c-format msgid "could not serialize access due to read/write dependencies among transactions" msgstr "kunde inte serialisera Ã¥tkomst pÃ¥ grund av läs/skriv-beroenden bland transaktionerna" -#: storage/lmgr/predicate.c:4103 storage/lmgr/predicate.c:4139 -#: storage/lmgr/predicate.c:4172 storage/lmgr/predicate.c:4180 -#: storage/lmgr/predicate.c:4219 storage/lmgr/predicate.c:4461 -#: storage/lmgr/predicate.c:4798 storage/lmgr/predicate.c:4810 -#: storage/lmgr/predicate.c:4853 storage/lmgr/predicate.c:4891 +#: storage/lmgr/predicate.c:3993 storage/lmgr/predicate.c:4029 +#: storage/lmgr/predicate.c:4062 storage/lmgr/predicate.c:4070 +#: storage/lmgr/predicate.c:4109 storage/lmgr/predicate.c:4339 +#: storage/lmgr/predicate.c:4658 storage/lmgr/predicate.c:4670 +#: storage/lmgr/predicate.c:4717 storage/lmgr/predicate.c:4753 #, c-format msgid "The transaction might succeed if retried." msgstr "Transaktionen kan lyckas om den körs igen." -#: storage/lmgr/proc.c:355 +#: storage/lmgr/proc.c:353 #, c-format -msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" -msgstr "antalet efterfrÃ¥gade standby-anslutningar överskrider max_wal_senders (nu %d)" +msgid "number of requested standby connections exceeds \"max_wal_senders\" (currently %d)" +msgstr "antalet efterfrÃ¥gade standby-anslutningar överskrider \"max_wal_senders\" (nu %d)" -#: storage/lmgr/proc.c:1531 +#: storage/lmgr/proc.c:1546 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "process %d undvek deadlock pÃ¥ %s för %s genom att kasta om köordningen efter %ld.%03d ms" -#: storage/lmgr/proc.c:1546 +#: storage/lmgr/proc.c:1561 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "process %d upptäckte deadlock medan den väntade pÃ¥ %s för %s efter %ld.%03d ms" -#: storage/lmgr/proc.c:1555 +#: storage/lmgr/proc.c:1570 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "process %d väntar fortfarande pÃ¥ %s för %s efter %ld.%03d ms" -#: storage/lmgr/proc.c:1562 +#: storage/lmgr/proc.c:1577 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "process %d fick %s pÃ¥ %s efter %ld.%03d ms" -#: storage/lmgr/proc.c:1579 +#: storage/lmgr/proc.c:1594 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "process %d misslyckades att ta %s pÃ¥ %s efter %ld.%03d ms" @@ -22120,391 +23414,561 @@ msgstr "trasiga postlängder: totalt %u, tillgänglig plats %u" msgid "corrupted line pointer: offset = %u, size = %u" msgstr "korrupt radpekare: offset = %u, storlek = %u" -#: storage/smgr/md.c:470 +#: storage/smgr/md.c:485 storage/smgr/md.c:547 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "kan inte utöka fil \"%s\" utöver %u block" -#: storage/smgr/md.c:485 +#: storage/smgr/md.c:500 storage/smgr/md.c:611 #, c-format msgid "could not extend file \"%s\": %m" msgstr "kunde inte utöka fil \"%s\": %m" -#: storage/smgr/md.c:491 +#: storage/smgr/md.c:506 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "kunde inte utöka fil \"%s\": skrev bara %d av %d byte vid block %u" -#: storage/smgr/md.c:706 +#: storage/smgr/md.c:589 #, c-format -msgid "could not read block %u in file \"%s\": %m" -msgstr "kunde inte läsa block %u i fil \"%s\": %m" +msgid "could not extend file \"%s\" with FileFallocate(): %m" +msgstr "kunde inte utöka fil \"%s\" med FileFallocate(): %m" -#: storage/smgr/md.c:722 +#: storage/smgr/md.c:869 #, c-format -msgid "could not read block %u in file \"%s\": read only %d of %d bytes" -msgstr "kunde inte läsa block %u i fil \"%s\": läste bara %d av %d byte" +msgid "could not read blocks %u..%u in file \"%s\": %m" +msgstr "kunde inte läsa block %u..%u i fil \"%s\": %m" -#: storage/smgr/md.c:776 +#: storage/smgr/md.c:895 #, c-format -msgid "could not write block %u in file \"%s\": %m" -msgstr "kunde inte skriva block %u i fil \"%s\": %m" +msgid "could not read blocks %u..%u in file \"%s\": read only %zu of %zu bytes" +msgstr "kunde inte läsa block %u..%u i fil \"%s\": läste bara %zu av %zu byte" -#: storage/smgr/md.c:781 +#: storage/smgr/md.c:995 #, c-format -msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" -msgstr "kunde inte skriva block %u i fil \"%s\": skrev bara %d av %d byte" +msgid "could not write blocks %u..%u in file \"%s\": %m" +msgstr "kunde inte skriva block %u..%u i fil \"%s\": %m" -#: storage/smgr/md.c:875 +#: storage/smgr/md.c:1165 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "kunde inte trunkera fil \"%s\" till %u block: den är bara %u block nu" -#: storage/smgr/md.c:930 +#: storage/smgr/md.c:1220 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "kunde inte trunkera fil \"%s\" till %u block: %m" -#: storage/smgr/md.c:1329 +#: storage/smgr/md.c:1700 #, c-format msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" msgstr "kunde inte öppna fil \"%s\" (mÃ¥lblock %u): föregÃ¥ende segment är bara %u block" -#: storage/smgr/md.c:1343 +#: storage/smgr/md.c:1714 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "kunde inte öppna fil \"%s\" (mÃ¥lblock %u): %m" -#: tcop/fastpath.c:148 +#: tcop/backend_startup.c:85 +#, c-format +msgid "SSL configuration could not be loaded in child process" +msgstr "SSL-konfigurering kunde inte laddas i barnprocess" + +#: tcop/backend_startup.c:208 +#, c-format +msgid "connection received: host=%s port=%s" +msgstr "ansluting mottagen: värd=%s port=%s" + +#: tcop/backend_startup.c:213 +#, c-format +msgid "connection received: host=%s" +msgstr "ansluting mottagen: värd=%s" + +#: tcop/backend_startup.c:277 +#, c-format +msgid "the database system is starting up" +msgstr "databassystemet startar upp" + +#: tcop/backend_startup.c:283 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "databassystemet tar ännu inte emot anslutningar" + +#: tcop/backend_startup.c:284 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "Konsistent Ã¥terställningstillstÃ¥nd har ännu inte uppnÃ¥tts." + +#: tcop/backend_startup.c:288 +#, c-format +msgid "the database system is not accepting connections" +msgstr "databassystemet tar inte emot anslutningar" + +#: tcop/backend_startup.c:289 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "Hot standby-läge är avstängt." + +#: tcop/backend_startup.c:294 +#, c-format +msgid "the database system is shutting down" +msgstr "databassystemet stänger ner" + +#: tcop/backend_startup.c:299 +#, c-format +msgid "the database system is in recovery mode" +msgstr "databassystemet är Ã¥terställningsläge" + +#: tcop/backend_startup.c:414 +#, c-format +msgid "received direct SSL connection request without ALPN protocol negotiation extension" +msgstr "förfrÃ¥gan för direkt SSL-anslutning har mottagits utan utökning för ALPN-protokollförhandling" + +#: tcop/backend_startup.c:420 +#, c-format +msgid "direct SSL connection accepted" +msgstr "direkt SSL-anslutning accepterad" + +#: tcop/backend_startup.c:430 +#, c-format +msgid "direct SSL connection rejected" +msgstr "direkt SSL-anslutning avvisad" + +#: tcop/backend_startup.c:489 tcop/backend_startup.c:517 +#, c-format +msgid "incomplete startup packet" +msgstr "ofullständigt startuppaket" + +#: tcop/backend_startup.c:501 tcop/backend_startup.c:538 +#, c-format +msgid "invalid length of startup packet" +msgstr "ogiltig längd pÃ¥ startuppaket" + +#: tcop/backend_startup.c:573 +#, c-format +msgid "SSLRequest accepted" +msgstr "SSLRequest accepterad" + +#: tcop/backend_startup.c:576 +#, c-format +msgid "SSLRequest rejected" +msgstr "SSLRequest nekad" + +#: tcop/backend_startup.c:585 +#, c-format +msgid "failed to send SSL negotiation response: %m" +msgstr "misslyckades att skicka SSL-förhandlingssvar: %m" + +#: tcop/backend_startup.c:603 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "tog emot okrypterad data efter SSL-förfrÃ¥gan" + +#: tcop/backend_startup.c:604 tcop/backend_startup.c:658 +#, c-format +msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." +msgstr "Detta kan antingen vara en bug i klientens mjukvara eller bevis pÃ¥ ett försök att utföra en attack av typen man-in-the-middle." + +#: tcop/backend_startup.c:627 +#, c-format +msgid "GSSENCRequest accepted" +msgstr "GSSENCRequest accepterad" + +#: tcop/backend_startup.c:630 +#, c-format +msgid "GSSENCRequest rejected" +msgstr "GSSENCRequest nekad" + +#: tcop/backend_startup.c:639 +#, c-format +msgid "failed to send GSSAPI negotiation response: %m" +msgstr "misslyckades att skicka GSSAPI-förhandlingssvar: %m" + +#: tcop/backend_startup.c:657 +#, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "tog emot okrypterad data efter GSSAPI-krypteringsförfrÃ¥gan" + +#: tcop/backend_startup.c:681 +#, c-format +msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" +msgstr "inget stöd för framändans protokoll %u.%u: servern stöder %u.0 till %u.%u" + +#: tcop/backend_startup.c:744 +#, c-format +msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." +msgstr "Giltiga värden är: \"false\", 0, \"true\", 1, \"database\"." + +#: tcop/backend_startup.c:785 +#, c-format +msgid "invalid startup packet layout: expected terminator as last byte" +msgstr "ogiltig startpaketlayout: förväntade en terminator som sista byte" + +#: tcop/backend_startup.c:802 +#, c-format +msgid "no PostgreSQL user name specified in startup packet" +msgstr "inget PostgreSQL-användarnamn angivet i startuppaketet" + +#: tcop/fastpath.c:142 utils/fmgr/fmgr.c:2161 +#, c-format +msgid "function with OID %u does not exist" +msgstr "funktionen med OID %u existerar inte" + +#: tcop/fastpath.c:149 #, c-format msgid "cannot call function \"%s\" via fastpath interface" msgstr "kan inte anropa funktionen \"%s\" via fastpath-interface" -#: tcop/fastpath.c:233 +#: tcop/fastpath.c:234 #, c-format msgid "fastpath function call: \"%s\" (OID %u)" msgstr "fastpath funktionsanrop: \"%s\" (OID %u)" -#: tcop/fastpath.c:312 tcop/postgres.c:1341 tcop/postgres.c:1577 -#: tcop/postgres.c:2036 tcop/postgres.c:2280 +#: tcop/fastpath.c:313 tcop/postgres.c:1369 tcop/postgres.c:1605 +#: tcop/postgres.c:2071 tcop/postgres.c:2333 #, c-format msgid "duration: %s ms" msgstr "varaktighet %s ms" -#: tcop/fastpath.c:316 +#: tcop/fastpath.c:317 #, c-format msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" msgstr "varaktighet: %s ms fastpath funktionsanrop: \"%s\" (OID %u)" -#: tcop/fastpath.c:352 +#: tcop/fastpath.c:353 #, c-format msgid "function call message contains %d arguments but function requires %d" msgstr "meddelande för funktionsanrop innehÃ¥ller %d argument men funktionen kräver %d" -#: tcop/fastpath.c:360 +#: tcop/fastpath.c:361 #, c-format msgid "function call message contains %d argument formats but %d arguments" msgstr "meddelande för funktioonsanrop innehÃ¥ller %d argumentformat men %d argument" -#: tcop/fastpath.c:384 +#: tcop/fastpath.c:385 #, c-format msgid "invalid argument size %d in function call message" msgstr "ogiltig argumentstorlek %d i funktionsaropsmeddelande" -#: tcop/fastpath.c:447 +#: tcop/fastpath.c:448 #, c-format msgid "incorrect binary data format in function argument %d" msgstr "inkorrekt binärt dataformat i funktionsargument %d" -#: tcop/postgres.c:444 tcop/postgres.c:4823 +#: tcop/postgres.c:467 tcop/postgres.c:5012 #, c-format msgid "invalid frontend message type %d" msgstr "ogiltig frontend-meddelandetyp %d" -#: tcop/postgres.c:1051 +#: tcop/postgres.c:1076 #, c-format msgid "statement: %s" msgstr "sats: %s" -#: tcop/postgres.c:1346 +#: tcop/postgres.c:1374 #, c-format msgid "duration: %s ms statement: %s" msgstr "varaktighet: %s ms sats: %s" -#: tcop/postgres.c:1452 +#: tcop/postgres.c:1480 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "kan inte stoppa in multipla kommandon i en förberedd sats" -#: tcop/postgres.c:1582 +#: tcop/postgres.c:1610 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "varaktighet: %s ms parse %s: %s" -#: tcop/postgres.c:1648 tcop/postgres.c:2595 +#: tcop/postgres.c:1677 tcop/postgres.c:2653 #, c-format msgid "unnamed prepared statement does not exist" msgstr "förberedd sats utan namn existerar inte" -#: tcop/postgres.c:1689 +#: tcop/postgres.c:1729 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "bind-meddelande har %d parameterformat men %d parametrar" -#: tcop/postgres.c:1695 +#: tcop/postgres.c:1735 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "bind-meddelande ger %d parametrar men förberedd sats \"%s\" kräver %d" -#: tcop/postgres.c:1914 +#: tcop/postgres.c:1949 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "inkorrekt binärdataformat i bind-parameter %d" -#: tcop/postgres.c:2041 +#: tcop/postgres.c:2076 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "varaktighet: %s ms bind %s%s%s: %s" -#: tcop/postgres.c:2091 tcop/postgres.c:2678 +#: tcop/postgres.c:2131 tcop/postgres.c:2735 #, c-format msgid "portal \"%s\" does not exist" msgstr "portal \"%s\" existerar inte" -#: tcop/postgres.c:2160 +#: tcop/postgres.c:2213 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2162 tcop/postgres.c:2288 +#: tcop/postgres.c:2215 tcop/postgres.c:2341 msgid "execute fetch from" msgstr "kör hämtning frÃ¥n" -#: tcop/postgres.c:2163 tcop/postgres.c:2289 +#: tcop/postgres.c:2216 tcop/postgres.c:2342 msgid "execute" msgstr "kör" -#: tcop/postgres.c:2285 +#: tcop/postgres.c:2338 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "varaktighet: %s ms %s %s%s%s: %s" -#: tcop/postgres.c:2431 +#: tcop/postgres.c:2486 #, c-format msgid "prepare: %s" msgstr "prepare: %s" -#: tcop/postgres.c:2456 +#: tcop/postgres.c:2511 #, c-format -msgid "parameters: %s" -msgstr "parametrar: %s" +msgid "Parameters: %s" +msgstr "Parametrar: %s" -#: tcop/postgres.c:2471 +#: tcop/postgres.c:2526 #, c-format -msgid "abort reason: recovery conflict" -msgstr "abortskäl: Ã¥terställningskonflikt" +msgid "Abort reason: recovery conflict" +msgstr "Abortskäl: Ã¥terställningskonflikt" -#: tcop/postgres.c:2487 +#: tcop/postgres.c:2542 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "Användaren höll delad bufferfastlÃ¥sning för länge." -#: tcop/postgres.c:2490 +#: tcop/postgres.c:2545 #, c-format msgid "User was holding a relation lock for too long." msgstr "Användare höll ett relationslÃ¥s för länge." -#: tcop/postgres.c:2493 +#: tcop/postgres.c:2548 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "Användaren använde eller har använt ett tablespace som tagits bort." -#: tcop/postgres.c:2496 +#: tcop/postgres.c:2551 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "AnvändarfrÃ¥gan kan ha behövt se radversioner som har tagits bort." -#: tcop/postgres.c:2502 +#: tcop/postgres.c:2554 +#, c-format +msgid "User was using a logical replication slot that must be invalidated." +msgstr "Användaren använde en logisk replikeringsslot som mÃ¥ste invalideras." + +#: tcop/postgres.c:2560 #, c-format msgid "User was connected to a database that must be dropped." msgstr "Användare var ansluten till databas som mÃ¥ste slängas." -#: tcop/postgres.c:2541 +#: tcop/postgres.c:2599 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "portal \"%s\" parameter $%d = %s" -#: tcop/postgres.c:2544 +#: tcop/postgres.c:2602 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "portal \"%s\" parameter $%d" -#: tcop/postgres.c:2550 +#: tcop/postgres.c:2608 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "ej namngiven portalparameter $%d = %s" -#: tcop/postgres.c:2553 +#: tcop/postgres.c:2611 #, c-format msgid "unnamed portal parameter $%d" msgstr "ej namngiven portalparameter $%d" -#: tcop/postgres.c:2898 +#: tcop/postgres.c:2955 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "stänger anslutning pÃ¥ grund av oväntad SIGQUIT-signal" -#: tcop/postgres.c:2904 +#: tcop/postgres.c:2961 #, c-format msgid "terminating connection because of crash of another server process" msgstr "avbryter anslutning pÃ¥ grund av en krash i en annan serverprocess" -#: tcop/postgres.c:2905 +#: tcop/postgres.c:2962 #, c-format msgid "The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory." msgstr "Postmastern har sagt Ã¥t denna serverprocess att rulla tillbaka den aktuella transaktionen och avsluta dÃ¥ en annan process har avslutats onormalt och har eventuellt trasat sönder delat minne." -#: tcop/postgres.c:2909 tcop/postgres.c:3270 +#: tcop/postgres.c:2966 tcop/postgres.c:3219 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "Du kan strax Ã¥teransluta till databasen och upprepa kommandot." -#: tcop/postgres.c:2916 +#: tcop/postgres.c:2973 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "stänger anslutning pÃ¥ grund av kommando för omedelbar nedstängning" -#: tcop/postgres.c:3002 +#: tcop/postgres.c:3051 #, c-format msgid "floating-point exception" msgstr "flyttalsavbrott" -#: tcop/postgres.c:3003 +#: tcop/postgres.c:3052 #, c-format msgid "An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero." msgstr "En ogiltig flyttalsoperation har signalerats. Detta beror troligen pÃ¥ ett resultat som är utanför giltigt intervall eller en ogiltig operation sÃ¥ som division med noll." -#: tcop/postgres.c:3174 +#: tcop/postgres.c:3217 +#, c-format +msgid "terminating connection due to conflict with recovery" +msgstr "avslutar anslutning pÃ¥ grund av konflikt med Ã¥terställning" + +#: tcop/postgres.c:3289 #, c-format msgid "canceling authentication due to timeout" msgstr "avbryter autentisering pÃ¥ grund av timeout" -#: tcop/postgres.c:3178 +#: tcop/postgres.c:3293 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "avslutar autovacuum-process pÃ¥ grund av ett administratörskommando" -#: tcop/postgres.c:3182 +#: tcop/postgres.c:3297 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "avslutar logisk replikeringsarbetare pÃ¥ grund av ett administratörskommando" -#: tcop/postgres.c:3199 tcop/postgres.c:3209 tcop/postgres.c:3268 -#, c-format -msgid "terminating connection due to conflict with recovery" -msgstr "avslutar anslutning pÃ¥ grund av konflikt med Ã¥terställning" - -#: tcop/postgres.c:3220 +#: tcop/postgres.c:3317 #, c-format msgid "terminating connection due to administrator command" msgstr "avslutar anslutning pÃ¥ grund av ett administratörskommando" -#: tcop/postgres.c:3251 +#: tcop/postgres.c:3348 #, c-format msgid "connection to client lost" msgstr "anslutning till klient har brutits" -#: tcop/postgres.c:3321 +#: tcop/postgres.c:3400 #, c-format msgid "canceling statement due to lock timeout" msgstr "avbryter sats pÃ¥ grund av lÃ¥s-timeout" -#: tcop/postgres.c:3328 +#: tcop/postgres.c:3407 #, c-format msgid "canceling statement due to statement timeout" msgstr "avbryter sats pÃ¥ grund av sats-timeout" -#: tcop/postgres.c:3335 +#: tcop/postgres.c:3414 #, c-format msgid "canceling autovacuum task" msgstr "avbryter autovacuum-uppgift" -#: tcop/postgres.c:3358 +#: tcop/postgres.c:3427 #, c-format msgid "canceling statement due to user request" msgstr "avbryter sats pÃ¥ användares begäran" -#: tcop/postgres.c:3372 +#: tcop/postgres.c:3448 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "terminerar anslutning pÃ¥ grund av idle-in-transaction-timeout" -#: tcop/postgres.c:3383 +#: tcop/postgres.c:3461 +#, c-format +msgid "terminating connection due to transaction timeout" +msgstr "terminerar anslutning pÃ¥ grund av transaktionstimeout" + +#: tcop/postgres.c:3474 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "stänger anslutning pÃ¥ grund av idle-session-timeout" -#: tcop/postgres.c:3523 +#: tcop/postgres.c:3564 #, c-format msgid "stack depth limit exceeded" msgstr "maximalt stackdjup överskridet" -#: tcop/postgres.c:3524 +#: tcop/postgres.c:3565 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "Öka konfigurationsparametern \"max_stack_depth\" (nu %dkB) efter att ha undersökt att plattformens gräns för stackdjup är tillräcklig." -#: tcop/postgres.c:3587 +#: tcop/postgres.c:3612 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "\"max_stack_depth\" fÃ¥r ej överskrida %ldkB." -#: tcop/postgres.c:3589 +#: tcop/postgres.c:3614 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "Öka plattformens stackdjupbegränsning via \"ulimit -s\" eller motsvarande." -#: tcop/postgres.c:3945 +#: tcop/postgres.c:3637 +#, c-format +msgid "\"client_connection_check_interval\" must be set to 0 on this platform." +msgstr "\"client_connection_check_interval\" mÃ¥ste sättas till 0 pÃ¥ denna plattform." + +#: tcop/postgres.c:3658 +#, c-format +msgid "Cannot enable parameter when \"log_statement_stats\" is true." +msgstr "Kan inte slÃ¥ pÃ¥ parameter när \"log_statement_stats\" är satt." + +#: tcop/postgres.c:3673 +#, c-format +msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." +msgstr "Kan inte slÃ¥ pÃ¥ \"log_statement_stats\" när \"log_parser_stats\", \"log_planner_stats\" eller \"log_executor_stats\" är satta." + +#: tcop/postgres.c:4098 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "ogiltigt kommandoradsargument för serverprocess: %s" -#: tcop/postgres.c:3946 tcop/postgres.c:3952 +#: tcop/postgres.c:4099 tcop/postgres.c:4105 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: tcop/postgres.c:3950 +#: tcop/postgres.c:4103 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: ogiltigt kommandoradsargument: %s" -#: tcop/postgres.c:4003 +#: tcop/postgres.c:4156 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: ingen databas eller användarnamn angivet" -#: tcop/postgres.c:4725 +#: tcop/postgres.c:4909 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "ogiltig subtyp %d för CLOSE-meddelande" -#: tcop/postgres.c:4760 +#: tcop/postgres.c:4946 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "ogiltig subtyp %d för DESCRIBE-meddelande" -#: tcop/postgres.c:4844 +#: tcop/postgres.c:5033 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "fastpath-funktionsanrop stöds inte i en replikeringsanslutning" -#: tcop/postgres.c:4848 +#: tcop/postgres.c:5037 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "utökat frÃ¥geprotokoll stöds inte i en replikeringsanslutning" -#: tcop/postgres.c:5025 +#: tcop/postgres.c:5217 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "nedkoppling: sessionstid: %d:%02d:%02d.%03d användare=%s databas=%s värd=%s%s%s" @@ -22514,52 +23978,58 @@ msgstr "nedkoppling: sessionstid: %d:%02d:%02d.%03d användare=%s databas=%s vä msgid "bind message has %d result formats but query has %d columns" msgstr "bind-meddelande har %d resultatformat men frÃ¥gan har %d kolumner" -#: tcop/pquery.c:944 tcop/pquery.c:1701 +#: tcop/pquery.c:942 tcop/pquery.c:1696 #, c-format msgid "cursor can only scan forward" msgstr "markör kan bara hoppa framÃ¥t" -#: tcop/pquery.c:945 tcop/pquery.c:1702 +#: tcop/pquery.c:943 tcop/pquery.c:1697 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Deklarera den med flaggan SCROLL för att kunna traversera bakÃ¥t." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:417 +#: tcop/utility.c:410 #, c-format msgid "cannot execute %s in a read-only transaction" msgstr "kan inte köra %s i read-only-transaktion" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:435 +#: tcop/utility.c:428 #, c-format msgid "cannot execute %s during a parallel operation" msgstr "kan inte köra %s under parallell operation" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:454 +#: tcop/utility.c:447 #, c-format msgid "cannot execute %s during recovery" msgstr "kan inte köra %s under Ã¥terställning" #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:472 +#: tcop/utility.c:465 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "kan inte köra %s inom säkerhetsbegränsad operation" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:828 +#: tcop/utility.c:821 #, c-format msgid "cannot execute %s within a background process" msgstr "kan inte köra %s i en bakgrundsprocess" -#: tcop/utility.c:953 +#. translator: %s is name of a SQL command, eg CHECKPOINT +#: tcop/utility.c:947 +#, c-format +msgid "permission denied to execute %s command" +msgstr "rättighet saknas för köra kommandot %s" + +#: tcop/utility.c:949 #, c-format -msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" -msgstr "mÃ¥ste vara superuser eller ha rättigheter frÃ¥n pg_checkpoint att göra CHECKPOINT" +msgid "Only roles with privileges of the \"%s\" role may execute this command." +msgstr "Bara roller med rättigheter frÃ¥n rollen \"%s\" fÃ¥r köra detta kommando." -#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:616 #, c-format msgid "multiple DictFile parameters" msgstr "multipla DictFile-parametrar" @@ -22579,7 +24049,7 @@ msgstr "okänd Ispell-parameter: \"%s\"" msgid "missing AffFile parameter" msgstr "saknar AffFile-parameter" -#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:639 +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:640 #, c-format msgid "missing DictFile parameter" msgstr "saknar DictFile-parameter" @@ -22617,7 +24087,7 @@ msgstr "kunde inte öppna synonymordboksfil \"%s\": %m" #: tsearch/dict_thesaurus.c:212 #, c-format msgid "unexpected delimiter" -msgstr "oväntad avdelare" +msgstr "oväntad separator" #: tsearch/dict_thesaurus.c:262 tsearch/dict_thesaurus.c:278 #, c-format @@ -22664,28 +24134,28 @@ msgstr "synonymordbokens ersättningsord \"%s\" känns inte igen av underordbok msgid "thesaurus substitute phrase is empty (rule %d)" msgstr "synonymordbokens ersättningsfras är tim (regel %d)" -#: tsearch/dict_thesaurus.c:624 +#: tsearch/dict_thesaurus.c:625 #, c-format msgid "multiple Dictionary parameters" msgstr "multipla ordboksparametrar" -#: tsearch/dict_thesaurus.c:631 +#: tsearch/dict_thesaurus.c:632 #, c-format msgid "unrecognized Thesaurus parameter: \"%s\"" msgstr "okänd synonymordboksparameter: \"%s\"" -#: tsearch/dict_thesaurus.c:643 +#: tsearch/dict_thesaurus.c:644 #, c-format msgid "missing Dictionary parameter" msgstr "saknar ordlistparameter" #: tsearch/spell.c:381 tsearch/spell.c:398 tsearch/spell.c:407 -#: tsearch/spell.c:1063 +#: tsearch/spell.c:1043 #, c-format msgid "invalid affix flag \"%s\"" msgstr "ogiltig affix-flagga \"%s\"" -#: tsearch/spell.c:385 tsearch/spell.c:1067 +#: tsearch/spell.c:385 tsearch/spell.c:1047 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "affix-flaggan \"%s\" är utanför giltigt intervall" @@ -22705,65 +24175,60 @@ msgstr "ogiltig affix-flagga \"%s\" med flaggvärdet \"long\"" msgid "could not open dictionary file \"%s\": %m" msgstr "kunde inte öppna ordboksfil \"%s\": %m" -#: tsearch/spell.c:764 utils/adt/regexp.c:209 -#, c-format -msgid "invalid regular expression: %s" -msgstr "ogiltigt reguljärt uttryck: %s" - -#: tsearch/spell.c:1190 tsearch/spell.c:1202 tsearch/spell.c:1762 -#: tsearch/spell.c:1767 tsearch/spell.c:1772 +#: tsearch/spell.c:1170 tsearch/spell.c:1182 tsearch/spell.c:1742 +#: tsearch/spell.c:1747 tsearch/spell.c:1752 #, c-format msgid "invalid affix alias \"%s\"" msgstr "ogiltigt affix-alias \"%s\"" -#: tsearch/spell.c:1243 tsearch/spell.c:1314 tsearch/spell.c:1463 +#: tsearch/spell.c:1223 tsearch/spell.c:1294 tsearch/spell.c:1443 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "kunde inte öppna affix-fil \"%s\": %m" -#: tsearch/spell.c:1297 +#: tsearch/spell.c:1277 #, c-format msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" msgstr "Ispell-ordbok stöder bara flaggorna \"default\", \"long\" och \"num\"" -#: tsearch/spell.c:1341 +#: tsearch/spell.c:1321 #, c-format msgid "invalid number of flag vector aliases" msgstr "ogiltigt antal alias i flaggvektor" -#: tsearch/spell.c:1364 +#: tsearch/spell.c:1344 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "antalet alias överskriver angivet antal %d" -#: tsearch/spell.c:1579 +#: tsearch/spell.c:1559 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "affix-fil innehÃ¥ller kommandon pÃ¥ gammalt och nytt format" -#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1127 +#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:277 utils/adt/tsvector_op.c:1126 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "strängen är för lÃ¥ng för tsvector (%d byte, max %d byte)" -#: tsearch/ts_locale.c:227 +#: tsearch/ts_locale.c:236 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "rad %d i konfigureringsfil \"%s\": \"%s\"" -#: tsearch/ts_locale.c:307 +#: tsearch/ts_locale.c:315 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "konvertering frÃ¥n wchar_t till serverkodning misslyckades: %m" -#: tsearch/ts_parse.c:386 tsearch/ts_parse.c:393 tsearch/ts_parse.c:572 -#: tsearch/ts_parse.c:579 +#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 +#: tsearch/ts_parse.c:580 #, c-format msgid "word is too long to be indexed" msgstr "ordet är för lÃ¥ngt för att indexeras" -#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 -#: tsearch/ts_parse.c:580 +#: tsearch/ts_parse.c:388 tsearch/ts_parse.c:395 tsearch/ts_parse.c:574 +#: tsearch/ts_parse.c:581 #, c-format msgid "Words longer than %d characters are ignored." msgstr "Ord längre än %d tecken hoppas över." @@ -22778,72 +24243,67 @@ msgstr "ogiltigt filnamn \"%s\" till textsökkonfiguration" msgid "could not open stop-word file \"%s\": %m" msgstr "kunde inte öppna stoppordsfil \"%s\": %m" -#: tsearch/wparser.c:313 tsearch/wparser.c:401 tsearch/wparser.c:478 +#: tsearch/wparser.c:306 tsearch/wparser.c:394 tsearch/wparser.c:471 #, c-format msgid "text search parser does not support headline creation" msgstr "textsökparsern stöder inte skapande av rubriker" -#: tsearch/wparser_def.c:2574 +#: tsearch/wparser_def.c:2664 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "okänd rubrikparameter: \"%s\"" -#: tsearch/wparser_def.c:2593 +#: tsearch/wparser_def.c:2674 #, c-format -msgid "MinWords should be less than MaxWords" -msgstr "MinWords skall vara mindre än MaxWords" +msgid "%s must be less than %s" +msgstr "%s mÃ¥ste vara mindre än %s" -#: tsearch/wparser_def.c:2597 +#: tsearch/wparser_def.c:2678 #, c-format -msgid "MinWords should be positive" -msgstr "MinWords skall vara positiv" +msgid "%s must be positive" +msgstr "%s mÃ¥ste vara positiv" -#: tsearch/wparser_def.c:2601 +#: tsearch/wparser_def.c:2682 tsearch/wparser_def.c:2686 #, c-format -msgid "ShortWord should be >= 0" -msgstr "ShortWord skall vara >= 0" +msgid "%s must be >= 0" +msgstr "%s mÃ¥ste vara >= 0" -#: tsearch/wparser_def.c:2605 -#, c-format -msgid "MaxFragments should be >= 0" -msgstr "MaxFragments skall vara >= 0" - -#: utils/activity/pgstat.c:421 +#: utils/activity/pgstat.c:435 #, c-format msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "kunde inte radera permanent statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1209 +#: utils/activity/pgstat.c:1255 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "ogiltig statistiktyp \"%s\"" -#: utils/activity/pgstat.c:1289 +#: utils/activity/pgstat.c:1335 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "kunde inte öppna temporär statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1395 +#: utils/activity/pgstat.c:1455 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "kunde inte skriva temporär statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1404 +#: utils/activity/pgstat.c:1464 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "kunde inte stänga temporär statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1412 +#: utils/activity/pgstat.c:1472 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "kunde inte döpa om temporär statistikfil \"%s\" till \"%s\": %m" -#: utils/activity/pgstat.c:1461 +#: utils/activity/pgstat.c:1521 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "kunde inte öppna statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1617 +#: utils/activity/pgstat.c:1683 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "korrupt statistikfil \"%s\"" @@ -22853,288 +24313,302 @@ msgstr "korrupt statistikfil \"%s\"" msgid "function call to dropped function" msgstr "funktionsanrop till borttagen funktion" -#: utils/activity/pgstat_xact.c:371 +#: utils/activity/pgstat_xact.c:362 #, c-format msgid "resetting existing statistics for kind %s, db=%u, oid=%u" msgstr "Ã¥terställer existerande statistik för typ %s, db=%u, oid=%u" -#: utils/adt/acl.c:168 utils/adt/name.c:93 +#: utils/activity/wait_event.c:207 utils/activity/wait_event.c:232 +#, c-format +msgid "wait event \"%s\" already exists in type \"%s\"" +msgstr "wait event \"%s\" finns redan i type \"%s\"" + +#: utils/activity/wait_event.c:246 +#, c-format +msgid "too many custom wait events" +msgstr "för mÃ¥nga egendefinierade wait event" + +#: utils/adt/acl.c:183 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "identifieraren för lÃ¥ng" -#: utils/adt/acl.c:169 utils/adt/name.c:94 +#: utils/adt/acl.c:184 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Identifierare mÃ¥ste vara mindre än %d tecken." -#: utils/adt/acl.c:252 +#: utils/adt/acl.c:272 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "okänt nyckelord: \"%s\"" -#: utils/adt/acl.c:253 +#: utils/adt/acl.c:273 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "ACL-nyckelord mÃ¥ste vara \"group\" eller \"user\"." -#: utils/adt/acl.c:258 +#: utils/adt/acl.c:281 #, c-format msgid "missing name" msgstr "namn saknas" -#: utils/adt/acl.c:259 +#: utils/adt/acl.c:282 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "Ett namn mÃ¥ste följa efter nyckelorden \"group\" resp. \"user\"." -#: utils/adt/acl.c:265 +#: utils/adt/acl.c:288 #, c-format msgid "missing \"=\" sign" msgstr "saknar \"=\"-tecken" -#: utils/adt/acl.c:324 +#: utils/adt/acl.c:350 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "ogiltigt lägestecken: mÃ¥ste vara en av \"%s\"" -#: utils/adt/acl.c:346 +#: utils/adt/acl.c:380 #, c-format msgid "a name must follow the \"/\" sign" msgstr "ett namn mÃ¥ste följa pÃ¥ tecknet \"/\"" -#: utils/adt/acl.c:354 +#: utils/adt/acl.c:392 #, c-format msgid "defaulting grantor to user ID %u" msgstr "sätter fullmaktsgivaranvändar-ID till standardvärdet %u" -#: utils/adt/acl.c:540 +#: utils/adt/acl.c:578 #, c-format msgid "ACL array contains wrong data type" msgstr "ACL-array innehÃ¥ller fel datatyp" -#: utils/adt/acl.c:544 +#: utils/adt/acl.c:582 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "ACL-array:er mÃ¥ste vara endimensionella" -#: utils/adt/acl.c:548 +#: utils/adt/acl.c:586 #, c-format msgid "ACL arrays must not contain null values" msgstr "ACL-array:er fÃ¥r inte innehÃ¥lla null-värden" -#: utils/adt/acl.c:572 +#: utils/adt/acl.c:615 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "skräp vid slutet av ACL-angivelse" -#: utils/adt/acl.c:1214 +#: utils/adt/acl.c:1263 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "fullmaksgivarflaggor kan inte ges tillbaka till den som givit det till dig" -#: utils/adt/acl.c:1275 -#, c-format -msgid "dependent privileges exist" -msgstr "det finns beroende privilegier" - -#: utils/adt/acl.c:1276 -#, c-format -msgid "Use CASCADE to revoke them too." -msgstr "Använd CASCADE för att Ã¥terkalla dem med." - -#: utils/adt/acl.c:1530 +#: utils/adt/acl.c:1579 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert stöds inte länge" -#: utils/adt/acl.c:1540 +#: utils/adt/acl.c:1589 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove stöds inte längre" -#: utils/adt/acl.c:1630 utils/adt/acl.c:1684 +#: utils/adt/acl.c:1709 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "okänd privilegietyp: \"%s\"" -#: utils/adt/acl.c:3469 utils/adt/regproc.c:101 utils/adt/regproc.c:277 +#: utils/adt/acl.c:3550 utils/adt/regproc.c:100 utils/adt/regproc.c:265 #, c-format msgid "function \"%s\" does not exist" msgstr "funktionen \"%s\" finns inte" -#: utils/adt/acl.c:5008 -#, c-format -msgid "must be member of role \"%s\"" -msgstr "mÃ¥ste vara medlem i rollen \"%s\"" - -#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:936 -#: utils/adt/arrayfuncs.c:1544 utils/adt/arrayfuncs.c:3263 -#: utils/adt/arrayfuncs.c:3405 utils/adt/arrayfuncs.c:5981 -#: utils/adt/arrayfuncs.c:6322 utils/adt/arrayutils.c:94 -#: utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 +#: utils/adt/acl.c:5196 #, c-format -msgid "array size exceeds the maximum allowed (%d)" -msgstr "array-storlek överskrider maximalt tillÃ¥tna (%d)" +msgid "must be able to SET ROLE \"%s\"" +msgstr "mÃ¥ste kunna utföra SET ROLE \"%s\"" -#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:467 -#: utils/adt/array_userfuncs.c:547 utils/adt/json.c:645 utils/adt/json.c:740 -#: utils/adt/json.c:778 utils/adt/jsonb.c:1114 utils/adt/jsonb.c:1143 -#: utils/adt/jsonb.c:1537 utils/adt/jsonb.c:1701 utils/adt/jsonb.c:1711 +#: utils/adt/array_userfuncs.c:102 utils/adt/array_userfuncs.c:489 +#: utils/adt/array_userfuncs.c:866 utils/adt/json.c:602 utils/adt/json.c:740 +#: utils/adt/json.c:790 utils/adt/jsonb.c:1025 utils/adt/jsonb.c:1098 +#: utils/adt/jsonb.c:1530 utils/adt/jsonb.c:1718 utils/adt/jsonb.c:1728 #, c-format msgid "could not determine input data type" msgstr "kan inte bestämma indatatyp" -#: utils/adt/array_userfuncs.c:85 +#: utils/adt/array_userfuncs.c:107 #, c-format msgid "input data type is not an array" msgstr "indatatyp är inte en array" -#: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 -#: utils/adt/float.c:1234 utils/adt/float.c:1308 utils/adt/float.c:4046 -#: utils/adt/float.c:4060 utils/adt/int.c:777 utils/adt/int.c:799 -#: utils/adt/int.c:813 utils/adt/int.c:827 utils/adt/int.c:858 -#: utils/adt/int.c:879 utils/adt/int.c:996 utils/adt/int.c:1010 -#: utils/adt/int.c:1024 utils/adt/int.c:1057 utils/adt/int.c:1071 -#: utils/adt/int.c:1085 utils/adt/int.c:1116 utils/adt/int.c:1198 -#: utils/adt/int.c:1262 utils/adt/int.c:1330 utils/adt/int.c:1336 -#: utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4265 -#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 -#: utils/adt/varlena.c:3391 +#: utils/adt/array_userfuncs.c:151 utils/adt/array_userfuncs.c:203 +#: utils/adt/float.c:1222 utils/adt/float.c:1296 utils/adt/float.c:4022 +#: utils/adt/float.c:4060 utils/adt/int.c:778 utils/adt/int.c:800 +#: utils/adt/int.c:814 utils/adt/int.c:828 utils/adt/int.c:859 +#: utils/adt/int.c:880 utils/adt/int.c:997 utils/adt/int.c:1011 +#: utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 +#: utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 +#: utils/adt/int.c:1263 utils/adt/int.c:1331 utils/adt/int.c:1337 +#: utils/adt/int8.c:1256 utils/adt/numeric.c:1917 utils/adt/numeric.c:4454 +#: utils/adt/rangetypes.c:1488 utils/adt/rangetypes.c:1501 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1135 +#: utils/adt/varlena.c:3137 #, c-format msgid "integer out of range" msgstr "heltal utanför giltigt intervall" -#: utils/adt/array_userfuncs.c:136 utils/adt/array_userfuncs.c:191 +#: utils/adt/array_userfuncs.c:158 utils/adt/array_userfuncs.c:213 #, c-format msgid "argument must be empty or one-dimensional array" msgstr "argumentet mÃ¥ste vara tomt eller en endimensionell array" -#: utils/adt/array_userfuncs.c:273 utils/adt/array_userfuncs.c:312 -#: utils/adt/array_userfuncs.c:349 utils/adt/array_userfuncs.c:378 -#: utils/adt/array_userfuncs.c:406 +#: utils/adt/array_userfuncs.c:295 utils/adt/array_userfuncs.c:334 +#: utils/adt/array_userfuncs.c:371 utils/adt/array_userfuncs.c:400 +#: utils/adt/array_userfuncs.c:428 #, c-format msgid "cannot concatenate incompatible arrays" msgstr "kan inte konkatenera inkompatibla arrayer" -#: utils/adt/array_userfuncs.c:274 +#: utils/adt/array_userfuncs.c:296 #, c-format msgid "Arrays with element types %s and %s are not compatible for concatenation." msgstr "Array:er med elementtyper %s och %s är inte kompatibla för sammaslagning." -#: utils/adt/array_userfuncs.c:313 +#: utils/adt/array_userfuncs.c:335 #, c-format msgid "Arrays of %d and %d dimensions are not compatible for concatenation." msgstr "Array:er med dimensioner %d och %d är inte kompatibla för sammaslagning." -#: utils/adt/array_userfuncs.c:350 +#: utils/adt/array_userfuncs.c:372 #, c-format msgid "Arrays with differing element dimensions are not compatible for concatenation." msgstr "Array:er med olika elementdimensioner är inte kompatibla för sammaslagning." -#: utils/adt/array_userfuncs.c:379 utils/adt/array_userfuncs.c:407 +#: utils/adt/array_userfuncs.c:401 utils/adt/array_userfuncs.c:429 #, c-format msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "Array:er med olika dimensioner fungerar inte vid konkatenering." -#: utils/adt/array_userfuncs.c:663 utils/adt/array_userfuncs.c:815 +#: utils/adt/array_userfuncs.c:975 utils/adt/array_userfuncs.c:983 +#: utils/adt/arrayfuncs.c:5616 utils/adt/arrayfuncs.c:5622 +#, c-format +msgid "cannot accumulate arrays of different dimensionality" +msgstr "kan inte ackumulera arrayer med olika dimensioner" + +#: utils/adt/array_userfuncs.c:1272 utils/adt/array_userfuncs.c:1426 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "sökning efter element i en multidimensionell array stöds inte" -#: utils/adt/array_userfuncs.c:687 +#: utils/adt/array_userfuncs.c:1301 #, c-format msgid "initial position must not be null" msgstr "initiala positionen fÃ¥r ej vara null" -#: utils/adt/arrayfuncs.c:271 utils/adt/arrayfuncs.c:285 -#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:318 -#: utils/adt/arrayfuncs.c:333 utils/adt/arrayfuncs.c:347 -#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 -#: utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:509 -#: utils/adt/arrayfuncs.c:520 utils/adt/arrayfuncs.c:535 -#: utils/adt/arrayfuncs.c:556 utils/adt/arrayfuncs.c:586 -#: utils/adt/arrayfuncs.c:593 utils/adt/arrayfuncs.c:601 -#: utils/adt/arrayfuncs.c:635 utils/adt/arrayfuncs.c:658 -#: utils/adt/arrayfuncs.c:678 utils/adt/arrayfuncs.c:790 -#: utils/adt/arrayfuncs.c:799 utils/adt/arrayfuncs.c:829 -#: utils/adt/arrayfuncs.c:844 utils/adt/arrayfuncs.c:897 +#: utils/adt/array_userfuncs.c:1674 #, c-format -msgid "malformed array literal: \"%s\"" -msgstr "felaktig array-literal: \"%s\"" +msgid "sample size must be between 0 and %d" +msgstr "samplingsstorleken mÃ¥ste vara mellan 0 och %d" -#: utils/adt/arrayfuncs.c:272 +#: utils/adt/arrayfuncs.c:264 utils/adt/arrayfuncs.c:273 +#: utils/adt/arrayfuncs.c:284 utils/adt/arrayfuncs.c:307 +#: utils/adt/arrayfuncs.c:440 utils/adt/arrayfuncs.c:454 +#: utils/adt/arrayfuncs.c:466 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:668 utils/adt/arrayfuncs.c:703 +#: utils/adt/arrayfuncs.c:718 utils/adt/arrayfuncs.c:777 +#: utils/adt/arrayfuncs.c:782 utils/adt/arrayfuncs.c:870 +#: utils/adt/arrayfuncs.c:897 utils/adt/arrayfuncs.c:904 +#: utils/adt/arrayfuncs.c:941 #, c-format -msgid "\"[\" must introduce explicitly-specified array dimensions." -msgstr "\"[\" mÃ¥ste införa explicit angivna array-dimensioner." +msgid "malformed array literal: \"%s\"" +msgstr "felaktig array-literal: \"%s\"" -#: utils/adt/arrayfuncs.c:286 +#: utils/adt/arrayfuncs.c:265 #, c-format -msgid "Missing array dimension value." -msgstr "Saknar värde i array-dimension." +msgid "Array value must start with \"{\" or dimension information." +msgstr "Array-värde mÃ¥ste starta med \"{\" eller dimensionsinformation" -#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 +#: utils/adt/arrayfuncs.c:274 utils/adt/arrayfuncs.c:467 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "Saknar \"%s\" efter array-dimensioner." -#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2910 -#: utils/adt/arrayfuncs.c:2942 utils/adt/arrayfuncs.c:2957 +#: utils/adt/arrayfuncs.c:285 #, c-format -msgid "upper bound cannot be less than lower bound" -msgstr "övre gränsen kan inte vara lägre än undre gränsen" +msgid "Array contents must start with \"{\"." +msgstr "Array-innehÃ¥ll mÃ¥ste starta med \"{\"." -#: utils/adt/arrayfuncs.c:319 +#: utils/adt/arrayfuncs.c:308 utils/adt/multirangetypes.c:292 #, c-format -msgid "Array value must start with \"{\" or dimension information." -msgstr "Array-värde mÃ¥ste starta med \"{\" eller dimensionsinformation" +msgid "Junk after closing right brace." +msgstr "Skräp efter avslutande höger parentes." -#: utils/adt/arrayfuncs.c:348 +#: utils/adt/arrayfuncs.c:431 utils/adt/arrayfuncs.c:643 #, c-format -msgid "Array contents must start with \"{\"." -msgstr "Array-innehÃ¥ll mÃ¥ste starta med \"{\"." +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "antal array-dimensioner överskriver maximalt tillÃ¥tna (%d)" -#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 +#: utils/adt/arrayfuncs.c:441 #, c-format -msgid "Specified array dimensions do not match array contents." -msgstr "Angivna array-dimensioner matchar inte array-innehÃ¥llet." +msgid "\"[\" must introduce explicitly-specified array dimensions." +msgstr "\"[\" mÃ¥ste införa explicit angivna array-dimensioner." -#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:521 -#: utils/adt/multirangetypes.c:164 utils/adt/rangetypes.c:2310 -#: utils/adt/rangetypes.c:2318 utils/adt/rowtypes.c:211 -#: utils/adt/rowtypes.c:219 +#: utils/adt/arrayfuncs.c:455 #, c-format -msgid "Unexpected end of input." -msgstr "oväntat slut pÃ¥ indata." +msgid "Missing array dimension value." +msgstr "Saknar värde i array-dimension." + +#: utils/adt/arrayfuncs.c:481 utils/adt/arrayfuncs.c:2940 +#: utils/adt/arrayfuncs.c:2985 utils/adt/arrayfuncs.c:3000 +#, c-format +msgid "upper bound cannot be less than lower bound" +msgstr "övre gränsen kan inte vara lägre än undre gränsen" + +#: utils/adt/arrayfuncs.c:487 +#, c-format +msgid "array upper bound is too large: %d" +msgstr "övre gräns för array är för stor: %d" -#: utils/adt/arrayfuncs.c:510 utils/adt/arrayfuncs.c:557 -#: utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:538 +#, c-format +msgid "array bound is out of integer range" +msgstr "array-gräns är utanför giltigt interval för integer" + +#: utils/adt/arrayfuncs.c:637 utils/adt/arrayfuncs.c:669 +#: utils/adt/arrayfuncs.c:704 utils/adt/arrayfuncs.c:898 #, c-format msgid "Unexpected \"%c\" character." msgstr "oväntat tecken \"%c\"." -#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 +#: utils/adt/arrayfuncs.c:719 #, c-format msgid "Unexpected array element." msgstr "Oväntat array-element." -#: utils/adt/arrayfuncs.c:594 +#: utils/adt/arrayfuncs.c:778 #, c-format -msgid "Unmatched \"%c\" character." -msgstr "Icke matchat tecken \"%c\"." +msgid "Specified array dimensions do not match array contents." +msgstr "Angivna array-dimensioner matchar inte array-innehÃ¥llet." -#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2489 +#: utils/adt/arrayfuncs.c:783 utils/adt/jsonfuncs.c:2598 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "Flerdimensionella array:er mÃ¥ste ha underarray:er med matchande dimensioner." -#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:287 +#: utils/adt/arrayfuncs.c:871 utils/adt/arrayfuncs.c:905 #, c-format -msgid "Junk after closing right brace." -msgstr "Skräp efter avslutande höger parentes." +msgid "Incorrectly quoted array element." +msgstr "Felaktigt quote:at array-element." + +#: utils/adt/arrayfuncs.c:942 utils/adt/multirangetypes.c:165 +#: utils/adt/rangetypes.c:2464 utils/adt/rangetypes.c:2472 +#: utils/adt/rowtypes.c:218 utils/adt/rowtypes.c:229 +#, c-format +msgid "Unexpected end of input." +msgstr "oväntat slut pÃ¥ indata." -#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3371 -#: utils/adt/arrayfuncs.c:5885 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 +#: utils/adt/arrayfuncs.c:6106 #, c-format msgid "invalid number of dimensions: %d" msgstr "felaktigt antal dimensioner: %d" @@ -23149,149 +24623,144 @@ msgstr "ogiltiga array-flaggor" msgid "binary data has array element type %u (%s) instead of expected %u (%s)" msgstr "binär data har array-elementtyp typ %u (%s) istället för förväntade %u (%s)" -#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:445 -#: utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2915 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:450 +#: utils/adt/rangetypes.c:351 utils/cache/lsyscache.c:2958 #, c-format msgid "no binary input function available for type %s" msgstr "ingen binär indatafunktion finns för typen %s" -#: utils/adt/arrayfuncs.c:1518 +#: utils/adt/arrayfuncs.c:1509 #, c-format msgid "improper binary format in array element %d" msgstr "felaktigt binärt format i array-element %d" -#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:450 -#: utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2948 +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 +#: utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:2991 #, c-format msgid "no binary output function available for type %s" msgstr "det saknas en binär output-funktion för typen %s" -#: utils/adt/arrayfuncs.c:2078 +#: utils/adt/arrayfuncs.c:2067 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "slice av fixlängd-array är inte implementerat" -#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 -#: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2566 -#: utils/adt/arrayfuncs.c:2888 utils/adt/arrayfuncs.c:5871 -#: utils/adt/arrayfuncs.c:5897 utils/adt/arrayfuncs.c:5908 -#: utils/adt/json.c:1141 utils/adt/json.c:1215 utils/adt/jsonb.c:1315 -#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4325 utils/adt/jsonfuncs.c:4479 -#: utils/adt/jsonfuncs.c:4591 utils/adt/jsonfuncs.c:4640 +#: utils/adt/arrayfuncs.c:2245 utils/adt/arrayfuncs.c:2267 +#: utils/adt/arrayfuncs.c:2316 utils/adt/arrayfuncs.c:2570 +#: utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6092 +#: utils/adt/arrayfuncs.c:6118 utils/adt/arrayfuncs.c:6129 +#: utils/adt/json.c:1433 utils/adt/json.c:1505 utils/adt/jsonb.c:1317 +#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4710 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4974 utils/adt/jsonfuncs.c:5022 #, c-format msgid "wrong number of array subscripts" msgstr "fel antal array-indexeringar" -#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 -#: utils/adt/arrayfuncs.c:2633 utils/adt/arrayfuncs.c:2947 +#: utils/adt/arrayfuncs.c:2250 utils/adt/arrayfuncs.c:2374 +#: utils/adt/arrayfuncs.c:2653 utils/adt/arrayfuncs.c:2990 #, c-format msgid "array subscript out of range" msgstr "array-index utanför giltigt omrÃ¥de" -#: utils/adt/arrayfuncs.c:2266 +#: utils/adt/arrayfuncs.c:2255 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "kan inte tilldela null-värde till ett element i en array med fast längd" -#: utils/adt/arrayfuncs.c:2835 +#: utils/adt/arrayfuncs.c:2855 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "uppdatering av slice pÃ¥ fixlängd-array är inte implementerat" -#: utils/adt/arrayfuncs.c:2866 +#: utils/adt/arrayfuncs.c:2886 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "array-slice-index mÃ¥ste inkludera bÃ¥da gränser" -#: utils/adt/arrayfuncs.c:2867 +#: utils/adt/arrayfuncs.c:2887 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "Vid tilldelning till en slice av en tom array sÃ¥ mÃ¥ste slice-gränserna anges" -#: utils/adt/arrayfuncs.c:2878 utils/adt/arrayfuncs.c:2974 +#: utils/adt/arrayfuncs.c:2905 utils/adt/arrayfuncs.c:3017 #, c-format msgid "source array too small" msgstr "käll-array för liten" -#: utils/adt/arrayfuncs.c:3529 +#: utils/adt/arrayfuncs.c:3657 #, c-format msgid "null array element not allowed in this context" msgstr "null-element i arrayer stöds inte i detta kontext" -#: utils/adt/arrayfuncs.c:3631 utils/adt/arrayfuncs.c:3802 -#: utils/adt/arrayfuncs.c:4193 +#: utils/adt/arrayfuncs.c:3828 utils/adt/arrayfuncs.c:3999 +#: utils/adt/arrayfuncs.c:4390 #, c-format msgid "cannot compare arrays of different element types" msgstr "kan inte jämföra arrayer med olika elementtyper" -#: utils/adt/arrayfuncs.c:3980 utils/adt/multirangetypes.c:2799 -#: utils/adt/multirangetypes.c:2871 utils/adt/rangetypes.c:1343 -#: utils/adt/rangetypes.c:1407 utils/adt/rowtypes.c:1858 +#: utils/adt/arrayfuncs.c:4177 utils/adt/multirangetypes.c:2805 +#: utils/adt/multirangetypes.c:2877 utils/adt/rangetypes.c:1361 +#: utils/adt/rangetypes.c:1425 utils/adt/rowtypes.c:1875 #, c-format msgid "could not identify a hash function for type %s" msgstr "kunde inte hitta en hash-funktion för typ %s" -#: utils/adt/arrayfuncs.c:4108 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4305 utils/adt/rowtypes.c:1996 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "kunde inte hitta en utökad hash-funktion för typ %s" -#: utils/adt/arrayfuncs.c:5285 +#: utils/adt/arrayfuncs.c:5506 #, c-format msgid "data type %s is not an array type" msgstr "datatypen %s är inte en arraytyp" -#: utils/adt/arrayfuncs.c:5340 +#: utils/adt/arrayfuncs.c:5561 #, c-format msgid "cannot accumulate null arrays" msgstr "kan inte ackumulera null-array:er" -#: utils/adt/arrayfuncs.c:5368 +#: utils/adt/arrayfuncs.c:5589 #, c-format msgid "cannot accumulate empty arrays" msgstr "kan inte ackumulera tomma array:er" -#: utils/adt/arrayfuncs.c:5395 utils/adt/arrayfuncs.c:5401 -#, c-format -msgid "cannot accumulate arrays of different dimensionality" -msgstr "kan inte ackumulera arrayer med olika dimensioner" - -#: utils/adt/arrayfuncs.c:5769 utils/adt/arrayfuncs.c:5809 +#: utils/adt/arrayfuncs.c:5990 utils/adt/arrayfuncs.c:6030 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "dimensionsarray eller undre gränsarray kan inte vara null" -#: utils/adt/arrayfuncs.c:5872 utils/adt/arrayfuncs.c:5898 +#: utils/adt/arrayfuncs.c:6093 utils/adt/arrayfuncs.c:6119 #, c-format msgid "Dimension array must be one dimensional." msgstr "Dimensionsarray mÃ¥ste vara endimensionell." -#: utils/adt/arrayfuncs.c:5877 utils/adt/arrayfuncs.c:5903 +#: utils/adt/arrayfuncs.c:6098 utils/adt/arrayfuncs.c:6124 #, c-format msgid "dimension values cannot be null" msgstr "dimensionsvärden kan inte vara null" -#: utils/adt/arrayfuncs.c:5909 +#: utils/adt/arrayfuncs.c:6130 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Undre arraygräns har annan storlek än dimensionsarray." -#: utils/adt/arrayfuncs.c:6187 +#: utils/adt/arrayfuncs.c:6411 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "borttagning av element frÃ¥n en multidimensionell array stöds inte" -#: utils/adt/arrayfuncs.c:6464 +#: utils/adt/arrayfuncs.c:6688 #, c-format msgid "thresholds must be one-dimensional array" msgstr "gränsvärden mÃ¥ste vara en endimensionell array" -#: utils/adt/arrayfuncs.c:6469 +#: utils/adt/arrayfuncs.c:6693 #, c-format msgid "thresholds array must not contain NULLs" msgstr "gränsvärdesarray fÃ¥r inte innehÃ¥lla NULLL-värden" -#: utils/adt/arrayfuncs.c:6702 +#: utils/adt/arrayfuncs.c:6926 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "antal element att trimma mÃ¥ste vara mellan 0 och %d" @@ -23309,238 +24778,265 @@ msgstr "array-index i tilldelning kan inte vara null" #: utils/adt/arrayutils.c:140 #, c-format msgid "array lower bound is too large: %d" -msgstr "lägre gräns för array är för stor: %d" +msgstr "undre gräns för array är för stor: %d" -#: utils/adt/arrayutils.c:240 +#: utils/adt/arrayutils.c:242 #, c-format msgid "typmod array must be type cstring[]" msgstr "typmod-array mÃ¥ste ha typ cstring[]" -#: utils/adt/arrayutils.c:245 +#: utils/adt/arrayutils.c:247 #, c-format msgid "typmod array must be one-dimensional" msgstr "typmod-array mÃ¥ste vara endimensionell" -#: utils/adt/arrayutils.c:250 +#: utils/adt/arrayutils.c:252 #, c-format msgid "typmod array must not contain nulls" msgstr "typmod-arrayen fÃ¥r inte innehÃ¥lla null-värden" -#: utils/adt/ascii.c:76 +#: utils/adt/ascii.c:77 #, c-format msgid "encoding conversion from %s to ASCII not supported" msgstr "kodningskonvertering frÃ¥n %s till ASCII stöds inte" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:276 utils/adt/datetime.c:4058 -#: utils/adt/float.c:188 utils/adt/float.c:272 utils/adt/float.c:284 -#: utils/adt/float.c:401 utils/adt/float.c:486 utils/adt/float.c:502 -#: utils/adt/geo_ops.c:220 utils/adt/geo_ops.c:230 utils/adt/geo_ops.c:242 -#: utils/adt/geo_ops.c:274 utils/adt/geo_ops.c:316 utils/adt/geo_ops.c:326 -#: utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1389 utils/adt/geo_ops.c:1424 -#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3392 utils/adt/geo_ops.c:4607 -#: utils/adt/geo_ops.c:4622 utils/adt/geo_ops.c:4629 utils/adt/int.c:173 -#: utils/adt/int.c:185 utils/adt/jsonpath.c:182 utils/adt/mac.c:93 -#: utils/adt/mac8.c:93 utils/adt/mac8.c:166 utils/adt/mac8.c:184 -#: utils/adt/mac8.c:202 utils/adt/mac8.c:221 utils/adt/network.c:99 -#: utils/adt/numeric.c:698 utils/adt/numeric.c:717 utils/adt/numeric.c:6854 -#: utils/adt/numeric.c:6878 utils/adt/numeric.c:6902 utils/adt/numeric.c:7904 -#: utils/adt/numutils.c:158 utils/adt/numutils.c:234 utils/adt/numutils.c:318 -#: utils/adt/oid.c:44 utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 -#: utils/adt/pg_lsn.c:74 utils/adt/tid.c:76 utils/adt/tid.c:84 -#: utils/adt/tid.c:98 utils/adt/tid.c:107 utils/adt/timestamp.c:497 -#: utils/adt/uuid.c:135 utils/adt/xid8funcs.c:346 +#: utils/adt/bool.c:149 utils/adt/cash.c:354 utils/adt/datetime.c:4142 +#: utils/adt/float.c:200 utils/adt/float.c:287 utils/adt/float.c:301 +#: utils/adt/float.c:406 utils/adt/float.c:489 utils/adt/float.c:503 +#: utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 +#: utils/adt/geo_ops.c:1417 utils/adt/geo_ops.c:1454 utils/adt/geo_ops.c:1462 +#: utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 +#: utils/adt/geo_ops.c:4672 utils/adt/int.c:174 utils/adt/int.c:186 +#: utils/adt/jsonpath.c:185 utils/adt/mac.c:94 utils/adt/mac8.c:226 +#: utils/adt/network.c:99 utils/adt/numeric.c:803 utils/adt/numeric.c:7221 +#: utils/adt/numeric.c:7424 utils/adt/numeric.c:8371 utils/adt/numutils.c:356 +#: utils/adt/numutils.c:618 utils/adt/numutils.c:880 utils/adt/numutils.c:919 +#: utils/adt/numutils.c:941 utils/adt/numutils.c:1005 utils/adt/numutils.c:1027 +#: utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 +#: utils/adt/tid.c:94 utils/adt/tid.c:103 utils/adt/timestamp.c:510 +#: utils/adt/uuid.c:140 utils/adt/xid8funcs.c:323 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "ogiltig indatasyntax för type %s: \"%s\"" -#: utils/adt/cash.c:214 utils/adt/cash.c:239 utils/adt/cash.c:249 -#: utils/adt/cash.c:289 utils/adt/int.c:179 utils/adt/numutils.c:152 -#: utils/adt/numutils.c:228 utils/adt/numutils.c:312 utils/adt/oid.c:70 -#: utils/adt/oid.c:109 +#: utils/adt/cash.c:98 utils/adt/cash.c:111 utils/adt/cash.c:124 +#: utils/adt/cash.c:137 utils/adt/cash.c:150 #, c-format -msgid "value \"%s\" is out of range for type %s" -msgstr "värdet \"%s\" är utanför giltigt intervall för typen %s" +msgid "money out of range" +msgstr "money utanför giltigt intervall" -#: utils/adt/cash.c:651 utils/adt/cash.c:701 utils/adt/cash.c:752 -#: utils/adt/cash.c:801 utils/adt/cash.c:853 utils/adt/cash.c:903 -#: utils/adt/float.c:105 utils/adt/int.c:842 utils/adt/int.c:958 -#: utils/adt/int.c:1038 utils/adt/int.c:1100 utils/adt/int.c:1138 -#: utils/adt/int.c:1166 utils/adt/int8.c:515 utils/adt/int8.c:573 -#: utils/adt/int8.c:943 utils/adt/int8.c:1023 utils/adt/int8.c:1085 -#: utils/adt/int8.c:1165 utils/adt/numeric.c:3093 utils/adt/numeric.c:3116 -#: utils/adt/numeric.c:3201 utils/adt/numeric.c:3219 utils/adt/numeric.c:3315 -#: utils/adt/numeric.c:8453 utils/adt/numeric.c:8743 utils/adt/numeric.c:9068 -#: utils/adt/numeric.c:10525 utils/adt/timestamp.c:3337 +#: utils/adt/cash.c:161 utils/adt/cash.c:723 utils/adt/float.c:99 +#: utils/adt/int.c:843 utils/adt/int.c:959 utils/adt/int.c:1039 +#: utils/adt/int.c:1101 utils/adt/int.c:1139 utils/adt/int.c:1167 +#: utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:942 +#: utils/adt/int8.c:1022 utils/adt/int8.c:1084 utils/adt/int8.c:1164 +#: utils/adt/numeric.c:3191 utils/adt/numeric.c:3214 utils/adt/numeric.c:3299 +#: utils/adt/numeric.c:3317 utils/adt/numeric.c:3413 utils/adt/numeric.c:8920 +#: utils/adt/numeric.c:9233 utils/adt/numeric.c:9581 utils/adt/numeric.c:9697 +#: utils/adt/numeric.c:11208 utils/adt/timestamp.c:3713 #, c-format msgid "division by zero" msgstr "division med noll" -#: utils/adt/char.c:196 +#: utils/adt/cash.c:292 utils/adt/cash.c:317 utils/adt/cash.c:327 +#: utils/adt/cash.c:367 utils/adt/int.c:180 utils/adt/numutils.c:350 +#: utils/adt/numutils.c:612 utils/adt/numutils.c:874 utils/adt/numutils.c:925 +#: utils/adt/numutils.c:964 utils/adt/numutils.c:1011 +#, c-format +msgid "value \"%s\" is out of range for type %s" +msgstr "värdet \"%s\" är utanför giltigt intervall för typen %s" + +#: utils/adt/char.c:197 #, c-format msgid "\"char\" out of range" msgstr "\"char\" utanför sitt intervall" -#: utils/adt/cryptohashfuncs.c:47 utils/adt/cryptohashfuncs.c:69 +#: utils/adt/cryptohashfuncs.c:48 utils/adt/cryptohashfuncs.c:70 #, c-format msgid "could not compute %s hash: %s" msgstr "kunde inte beräkna %s-hash: %s" -#: utils/adt/date.c:63 utils/adt/timestamp.c:98 utils/adt/varbit.c:105 +#: utils/adt/date.c:64 utils/adt/timestamp.c:116 utils/adt/varbit.c:105 #: utils/adt/varchar.c:48 #, c-format msgid "invalid type modifier" msgstr "ogiltig typmodifierare" -#: utils/adt/date.c:75 +#: utils/adt/date.c:76 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "TIME(%d)%s-precisionen fÃ¥r inte vara negativ" -#: utils/adt/date.c:81 +#: utils/adt/date.c:82 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%s-precisionen reducerad till maximalt tillÃ¥tna, %d" -#: utils/adt/date.c:160 utils/adt/date.c:168 utils/adt/formatting.c:4299 -#: utils/adt/formatting.c:4308 utils/adt/formatting.c:4414 -#: utils/adt/formatting.c:4424 +#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4424 +#: utils/adt/formatting.c:4433 utils/adt/formatting.c:4538 +#: utils/adt/formatting.c:4548 #, c-format msgid "date out of range: \"%s\"" msgstr "datum utanför giltigt intervall \"%s\"" -#: utils/adt/date.c:215 utils/adt/date.c:513 utils/adt/date.c:537 -#: utils/adt/xml.c:2209 +#: utils/adt/date.c:222 utils/adt/date.c:520 utils/adt/date.c:544 +#: utils/adt/rangetypes.c:1584 utils/adt/rangetypes.c:1599 utils/adt/xml.c:2552 #, c-format msgid "date out of range" msgstr "datum utanför giltigt intervall" -#: utils/adt/date.c:261 utils/adt/timestamp.c:581 +#: utils/adt/date.c:268 utils/adt/timestamp.c:598 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "datumfältvärde utanför giltigt omrÃ¥de: %d-%02d-%02d" -#: utils/adt/date.c:268 utils/adt/date.c:277 utils/adt/timestamp.c:587 +#: utils/adt/date.c:275 utils/adt/date.c:284 utils/adt/timestamp.c:604 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "datum utanför giltigt omrÃ¥de: %d-%02d-%02d" -#: utils/adt/date.c:488 +#: utils/adt/date.c:495 #, c-format msgid "cannot subtract infinite dates" msgstr "kan inte subtrahera oändliga datum" -#: utils/adt/date.c:586 utils/adt/date.c:649 utils/adt/date.c:685 -#: utils/adt/date.c:2868 utils/adt/date.c:2878 +#: utils/adt/date.c:593 utils/adt/date.c:656 utils/adt/date.c:692 +#: utils/adt/date.c:2906 utils/adt/date.c:2916 #, c-format msgid "date out of range for timestamp" msgstr "datum utanför filtigt omrÃ¥de för timestamp" -#: utils/adt/date.c:1115 utils/adt/date.c:1198 utils/adt/date.c:1214 -#: utils/adt/date.c:2195 utils/adt/date.c:2973 utils/adt/timestamp.c:4032 -#: utils/adt/timestamp.c:4225 utils/adt/timestamp.c:4397 -#: utils/adt/timestamp.c:4650 utils/adt/timestamp.c:4851 -#: utils/adt/timestamp.c:4898 utils/adt/timestamp.c:5122 -#: utils/adt/timestamp.c:5169 utils/adt/timestamp.c:5299 +#: utils/adt/date.c:1122 utils/adt/date.c:1205 utils/adt/date.c:1221 +#: utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4726 +#: utils/adt/timestamp.c:4941 utils/adt/timestamp.c:5089 +#: utils/adt/timestamp.c:5342 utils/adt/timestamp.c:5543 +#: utils/adt/timestamp.c:5590 utils/adt/timestamp.c:5814 +#: utils/adt/timestamp.c:5861 utils/adt/timestamp.c:5941 +#: utils/adt/timestamp.c:6070 #, c-format msgid "unit \"%s\" not supported for type %s" msgstr "enheten \"%s\" stöds inte för typen %s" -#: utils/adt/date.c:1223 utils/adt/date.c:2211 utils/adt/date.c:2993 -#: utils/adt/timestamp.c:4046 utils/adt/timestamp.c:4242 -#: utils/adt/timestamp.c:4411 utils/adt/timestamp.c:4610 -#: utils/adt/timestamp.c:4907 utils/adt/timestamp.c:5178 -#: utils/adt/timestamp.c:5360 +#: utils/adt/date.c:1230 utils/adt/date.c:2231 utils/adt/date.c:3031 +#: utils/adt/timestamp.c:4740 utils/adt/timestamp.c:4958 +#: utils/adt/timestamp.c:5103 utils/adt/timestamp.c:5302 +#: utils/adt/timestamp.c:5599 utils/adt/timestamp.c:5870 +#: utils/adt/timestamp.c:5911 utils/adt/timestamp.c:6131 #, c-format msgid "unit \"%s\" not recognized for type %s" msgstr "enheten \"%s\" känns inte igen för typen %s" -#: utils/adt/date.c:1307 utils/adt/date.c:1353 utils/adt/date.c:1907 -#: utils/adt/date.c:1938 utils/adt/date.c:1967 utils/adt/date.c:2831 -#: utils/adt/date.c:3078 utils/adt/datetime.c:420 utils/adt/datetime.c:1869 -#: utils/adt/formatting.c:4141 utils/adt/formatting.c:4177 -#: utils/adt/formatting.c:4268 utils/adt/formatting.c:4390 utils/adt/json.c:418 -#: utils/adt/json.c:457 utils/adt/timestamp.c:225 utils/adt/timestamp.c:257 -#: utils/adt/timestamp.c:699 utils/adt/timestamp.c:708 -#: utils/adt/timestamp.c:786 utils/adt/timestamp.c:819 -#: utils/adt/timestamp.c:2916 utils/adt/timestamp.c:2937 -#: utils/adt/timestamp.c:2950 utils/adt/timestamp.c:2959 -#: utils/adt/timestamp.c:2967 utils/adt/timestamp.c:3022 -#: utils/adt/timestamp.c:3045 utils/adt/timestamp.c:3058 -#: utils/adt/timestamp.c:3069 utils/adt/timestamp.c:3077 -#: utils/adt/timestamp.c:3736 utils/adt/timestamp.c:3860 -#: utils/adt/timestamp.c:3950 utils/adt/timestamp.c:4040 -#: utils/adt/timestamp.c:4133 utils/adt/timestamp.c:4236 -#: utils/adt/timestamp.c:4715 utils/adt/timestamp.c:4989 -#: utils/adt/timestamp.c:5439 utils/adt/timestamp.c:5453 -#: utils/adt/timestamp.c:5458 utils/adt/timestamp.c:5472 -#: utils/adt/timestamp.c:5505 utils/adt/timestamp.c:5592 -#: utils/adt/timestamp.c:5633 utils/adt/timestamp.c:5637 -#: utils/adt/timestamp.c:5706 utils/adt/timestamp.c:5710 -#: utils/adt/timestamp.c:5724 utils/adt/timestamp.c:5758 utils/adt/xml.c:2231 -#: utils/adt/xml.c:2238 utils/adt/xml.c:2258 utils/adt/xml.c:2265 +#: utils/adt/date.c:1314 utils/adt/date.c:1360 utils/adt/date.c:1919 +#: utils/adt/date.c:1950 utils/adt/date.c:1979 utils/adt/date.c:2869 +#: utils/adt/date.c:3101 utils/adt/datetime.c:422 utils/adt/datetime.c:1807 +#: utils/adt/formatting.c:4269 utils/adt/formatting.c:4305 +#: utils/adt/formatting.c:4392 utils/adt/formatting.c:4514 utils/adt/json.c:366 +#: utils/adt/json.c:405 utils/adt/timestamp.c:248 utils/adt/timestamp.c:280 +#: utils/adt/timestamp.c:716 utils/adt/timestamp.c:725 +#: utils/adt/timestamp.c:803 utils/adt/timestamp.c:836 +#: utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3075 +#: utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3097 +#: utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3129 +#: utils/adt/timestamp.c:3140 utils/adt/timestamp.c:3146 +#: utils/adt/timestamp.c:3152 utils/adt/timestamp.c:3157 +#: utils/adt/timestamp.c:3210 utils/adt/timestamp.c:3219 +#: utils/adt/timestamp.c:3240 utils/adt/timestamp.c:3245 +#: utils/adt/timestamp.c:3266 utils/adt/timestamp.c:3279 +#: utils/adt/timestamp.c:3293 utils/adt/timestamp.c:3301 +#: utils/adt/timestamp.c:3307 utils/adt/timestamp.c:3312 +#: utils/adt/timestamp.c:4380 utils/adt/timestamp.c:4532 +#: utils/adt/timestamp.c:4608 utils/adt/timestamp.c:4644 +#: utils/adt/timestamp.c:4734 utils/adt/timestamp.c:4813 +#: utils/adt/timestamp.c:4849 utils/adt/timestamp.c:4952 +#: utils/adt/timestamp.c:5407 utils/adt/timestamp.c:5681 +#: utils/adt/timestamp.c:6199 utils/adt/timestamp.c:6209 +#: utils/adt/timestamp.c:6214 utils/adt/timestamp.c:6220 +#: utils/adt/timestamp.c:6260 utils/adt/timestamp.c:6347 +#: utils/adt/timestamp.c:6388 utils/adt/timestamp.c:6392 +#: utils/adt/timestamp.c:6446 utils/adt/timestamp.c:6450 +#: utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2574 +#: utils/adt/xml.c:2581 utils/adt/xml.c:2601 utils/adt/xml.c:2608 #, c-format msgid "timestamp out of range" msgstr "timestamp utanför giltigt intervall" -#: utils/adt/date.c:1524 utils/adt/date.c:2326 utils/adt/formatting.c:4476 +#: utils/adt/date.c:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4597 #, c-format msgid "time out of range" msgstr "time utanför giltigt intervall" -#: utils/adt/date.c:1576 utils/adt/timestamp.c:596 +#: utils/adt/date.c:1588 utils/adt/timestamp.c:613 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "time-värde utanför giltigt omrÃ¥de: %d:%02d:%02g" -#: utils/adt/date.c:2096 utils/adt/date.c:2630 utils/adt/float.c:1048 -#: utils/adt/float.c:1124 utils/adt/int.c:634 utils/adt/int.c:681 -#: utils/adt/int.c:716 utils/adt/int8.c:414 utils/adt/numeric.c:2497 -#: utils/adt/timestamp.c:3386 utils/adt/timestamp.c:3417 -#: utils/adt/timestamp.c:3448 +#: utils/adt/date.c:2020 +#, c-format +msgid "cannot convert infinite interval to time" +msgstr "kan inte konvertera oändligt intervall till time" + +#: utils/adt/date.c:2061 utils/adt/date.c:2605 +#, c-format +msgid "cannot add infinite interval to time" +msgstr "kan inte addera oändligt intervall till time" + +#: utils/adt/date.c:2084 utils/adt/date.c:2632 +#, c-format +msgid "cannot subtract infinite interval from time" +msgstr "kan inte subtrahera oändligt intervall frÃ¥n time" + +#: utils/adt/date.c:2115 utils/adt/date.c:2667 utils/adt/float.c:1036 +#: utils/adt/float.c:1112 utils/adt/int.c:635 utils/adt/int.c:682 +#: utils/adt/int.c:717 utils/adt/int8.c:413 utils/adt/numeric.c:2595 +#: utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 +#: utils/adt/timestamp.c:3888 #, c-format msgid "invalid preceding or following size in window function" msgstr "ogiltig föregÃ¥ende eller efterföljande storlek i fönsterfunktion" -#: utils/adt/date.c:2334 +#: utils/adt/date.c:2360 #, c-format msgid "time zone displacement out of range" msgstr "tidszonförskjutning utanför giltigt intervall" -#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 -#: utils/adt/datetime.c:4906 utils/adt/timestamp.c:516 -#: utils/adt/timestamp.c:543 utils/adt/timestamp.c:4319 -#: utils/adt/timestamp.c:5464 utils/adt/timestamp.c:5716 +#: utils/adt/date.c:3132 utils/adt/timestamp.c:6242 utils/adt/timestamp.c:6479 #, c-format -msgid "time zone \"%s\" not recognized" -msgstr "tidszon \"%s\" känns inte igen" +msgid "interval time zone \"%s\" must be finite" +msgstr "intervalltidszonen \"%s\" mÃ¥ste vara ändlig" -#: utils/adt/date.c:3116 utils/adt/timestamp.c:5494 utils/adt/timestamp.c:5747 +#: utils/adt/date.c:3139 utils/adt/timestamp.c:6249 utils/adt/timestamp.c:6486 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "intervalltidszonen \"%s\" kan inte inkludera mÃ¥nader eller Ã¥r" -#: utils/adt/datetime.c:4031 utils/adt/datetime.c:4038 +#: utils/adt/datetime.c:3232 utils/adt/datetime.c:4127 +#: utils/adt/datetime.c:4133 utils/adt/timestamp.c:528 +#, c-format +msgid "time zone \"%s\" not recognized" +msgstr "tidszon \"%s\" känns inte igen" + +#: utils/adt/datetime.c:4101 utils/adt/datetime.c:4108 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "datum/tid-värde utanför giltigt omrÃ¥de: \"%s\"" -#: utils/adt/datetime.c:4040 +#: utils/adt/datetime.c:4110 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Du kanske behöver en annan inställning av variabeln \"datestyle\"." -#: utils/adt/datetime.c:4045 +#: utils/adt/datetime.c:4115 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "intervall-värde utanför giltigt omrÃ¥de: \"%s\"" -#: utils/adt/datetime.c:4051 +#: utils/adt/datetime.c:4121 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "tidszonförskjutning itanför sitt intervall: \"%s\"" -#: utils/adt/datetime.c:4908 +#: utils/adt/datetime.c:4135 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "Detta tidszonsnamn finns i konfigurationsfilen för tidszonsförkortning \"%s\"." @@ -23550,67 +25046,67 @@ msgstr "Detta tidszonsnamn finns i konfigurationsfilen för tidszonsförkortning msgid "invalid Datum pointer" msgstr "ogiltigt Datum-pekare" -#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 +#: utils/adt/dbsize.c:764 utils/adt/dbsize.c:840 #, c-format msgid "invalid size: \"%s\"" msgstr "ogiltig storlek: \"%s\"" -#: utils/adt/dbsize.c:814 +#: utils/adt/dbsize.c:841 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "Ogiltig storleksenhet: \"%s\"." -#: utils/adt/dbsize.c:815 +#: utils/adt/dbsize.c:842 #, c-format -msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." -msgstr "Giltiga enheter är \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\" och \"PB\"." +msgid "Valid units are \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." +msgstr "Giltiga enheter är \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\" och \"PB\"." -#: utils/adt/domains.c:92 +#: utils/adt/domains.c:95 #, c-format msgid "type %s is not a domain" msgstr "typen %s är inte en domän" -#: utils/adt/encode.c:65 utils/adt/encode.c:113 +#: utils/adt/encode.c:66 utils/adt/encode.c:114 #, c-format msgid "unrecognized encoding: \"%s\"" msgstr "okänd kodning: \"%s\"" -#: utils/adt/encode.c:79 +#: utils/adt/encode.c:80 #, c-format msgid "result of encoding conversion is too large" msgstr "resultat frÃ¥n kodningskonvertering är för stort" -#: utils/adt/encode.c:127 +#: utils/adt/encode.c:128 #, c-format msgid "result of decoding conversion is too large" msgstr "resultatet av avkodningskonverteringen är för stort" -#: utils/adt/encode.c:186 +#: utils/adt/encode.c:217 utils/adt/encode.c:227 #, c-format msgid "invalid hexadecimal digit: \"%.*s\"" msgstr "ogiltigt hexdecimal siffra: \"%.*s\"" -#: utils/adt/encode.c:216 +#: utils/adt/encode.c:223 #, c-format msgid "invalid hexadecimal data: odd number of digits" msgstr "ogiltig hexadecimal data: udda antal siffror" -#: utils/adt/encode.c:334 +#: utils/adt/encode.c:344 #, c-format msgid "unexpected \"=\" while decoding base64 sequence" msgstr "oväntat \"=\" vid avkodning av base64-sekvens" -#: utils/adt/encode.c:346 +#: utils/adt/encode.c:356 #, c-format msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" msgstr "ogiltig symbol \"%.*s\" hittades vid avkodning av base64-sekvens" -#: utils/adt/encode.c:367 +#: utils/adt/encode.c:377 #, c-format msgid "invalid base64 end sequence" msgstr "ogiltig base64-slutsekvens" -#: utils/adt/encode.c:368 +#: utils/adt/encode.c:378 #, c-format msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "Indata saknar paddning, är trunkerad eller är trasig pÃ¥ annat sätt." @@ -23625,375 +25121,370 @@ msgstr "osäker användning av nytt värde \"%s\" i enum typ %s" msgid "New enum values must be committed before they can be used." msgstr "Nya enum-värden mÃ¥ste commit:as innan de kan användas." -#: utils/adt/enum.c:120 utils/adt/enum.c:130 utils/adt/enum.c:188 -#: utils/adt/enum.c:198 +#: utils/adt/enum.c:121 utils/adt/enum.c:131 utils/adt/enum.c:194 +#: utils/adt/enum.c:204 #, c-format msgid "invalid input value for enum %s: \"%s\"" msgstr "ogiltigt indata-värde för enum %s: \"%s\"" -#: utils/adt/enum.c:160 utils/adt/enum.c:226 utils/adt/enum.c:285 +#: utils/adt/enum.c:166 utils/adt/enum.c:232 utils/adt/enum.c:291 #, c-format msgid "invalid internal value for enum: %u" msgstr "ogiltigt internt värde för enum: %u" -#: utils/adt/enum.c:445 utils/adt/enum.c:474 utils/adt/enum.c:514 -#: utils/adt/enum.c:534 +#: utils/adt/enum.c:451 utils/adt/enum.c:480 utils/adt/enum.c:520 +#: utils/adt/enum.c:540 #, c-format msgid "could not determine actual enum type" msgstr "kunde inte bestämma den verkliga enum-typen" -#: utils/adt/enum.c:453 utils/adt/enum.c:482 +#: utils/adt/enum.c:459 utils/adt/enum.c:488 #, c-format msgid "enum %s contains no values" msgstr "enum %s innehÃ¥ller inga värden" -#: utils/adt/float.c:89 +#: utils/adt/float.c:83 #, c-format msgid "value out of range: overflow" msgstr "värde utanför giltigt intervall: overflow" -#: utils/adt/float.c:97 +#: utils/adt/float.c:91 #, c-format msgid "value out of range: underflow" msgstr "värde utanför giltigt intervall: underflow" -#: utils/adt/float.c:266 +#: utils/adt/float.c:280 #, c-format msgid "\"%s\" is out of range for type real" msgstr "\"%s\" är utanför giltigt intervall för typen real" -#: utils/adt/float.c:478 +#: utils/adt/float.c:482 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "\"%s\" är utanför giltigt intervall för typen double precision" -#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:354 -#: utils/adt/int.c:892 utils/adt/int.c:914 utils/adt/int.c:928 -#: utils/adt/int.c:942 utils/adt/int.c:974 utils/adt/int.c:1212 -#: utils/adt/int8.c:1278 utils/adt/numeric.c:4377 utils/adt/numeric.c:4382 +#: utils/adt/float.c:1247 utils/adt/float.c:1321 utils/adt/int.c:355 +#: utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 +#: utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 +#: utils/adt/int8.c:1277 utils/adt/numeric.c:4593 utils/adt/numeric.c:4598 #, c-format msgid "smallint out of range" msgstr "smallint utanför sitt intervall" -#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9482 +#: utils/adt/float.c:1447 utils/adt/numeric.c:3709 utils/adt/numeric.c:10112 #, c-format msgid "cannot take square root of a negative number" msgstr "kan inte ta kvadratroten av ett negativt tal" -#: utils/adt/float.c:1527 utils/adt/numeric.c:3886 utils/adt/numeric.c:3998 +#: utils/adt/float.c:1515 utils/adt/numeric.c:3997 utils/adt/numeric.c:4109 #, c-format msgid "zero raised to a negative power is undefined" msgstr "noll upphöjt med ett negativt tal är odefinierat" -#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10378 +#: utils/adt/float.c:1519 utils/adt/numeric.c:4001 utils/adt/numeric.c:11003 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "ett negativt tal upphöjt i en icke-negativ potens ger ett komplext resultat" -#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 -#: utils/adt/numeric.c:10153 +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3909 +#: utils/adt/numeric.c:10783 #, c-format msgid "cannot take logarithm of zero" msgstr "kan inte ta logartimen av noll" -#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 -#: utils/adt/numeric.c:3793 utils/adt/numeric.c:10157 +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3847 +#: utils/adt/numeric.c:3904 utils/adt/numeric.c:10787 #, c-format msgid "cannot take logarithm of a negative number" msgstr "kan inte ta logaritmen av ett negativt tal" -#: utils/adt/float.c:1777 utils/adt/float.c:1808 utils/adt/float.c:1903 -#: utils/adt/float.c:1930 utils/adt/float.c:1958 utils/adt/float.c:1985 -#: utils/adt/float.c:2132 utils/adt/float.c:2169 utils/adt/float.c:2339 -#: utils/adt/float.c:2395 utils/adt/float.c:2460 utils/adt/float.c:2517 -#: utils/adt/float.c:2708 utils/adt/float.c:2732 +#: utils/adt/float.c:1765 utils/adt/float.c:1796 utils/adt/float.c:1891 +#: utils/adt/float.c:1918 utils/adt/float.c:1946 utils/adt/float.c:1973 +#: utils/adt/float.c:2120 utils/adt/float.c:2157 utils/adt/float.c:2327 +#: utils/adt/float.c:2383 utils/adt/float.c:2448 utils/adt/float.c:2505 +#: utils/adt/float.c:2696 utils/adt/float.c:2720 #, c-format msgid "input is out of range" msgstr "indata är utanför giltigt intervall" -#: utils/adt/float.c:2796 -#, c-format -msgid "setseed parameter %g is out of allowed range [-1,1]" -msgstr "setseed-parameter %g är utanför giltigt intervall [-1,1]" - -#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 +#: utils/adt/float.c:4000 utils/adt/numeric.c:1857 #, c-format msgid "count must be greater than zero" msgstr "antal mÃ¥ste vara större än noll" -#: utils/adt/float.c:4029 utils/adt/numeric.c:1781 +#: utils/adt/float.c:4005 utils/adt/numeric.c:1868 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" -msgstr "operand, lägre gräns och övre gräns kan inte vara NaN" +msgstr "operand, undre gräns och övre gräns kan inte vara NaN" -#: utils/adt/float.c:4035 utils/adt/numeric.c:1786 +#: utils/adt/float.c:4011 utils/adt/numeric.c:1873 #, c-format msgid "lower and upper bounds must be finite" -msgstr "lägre och övre gräns mÃ¥ste vara ändliga" +msgstr "undre och övre gräns mÃ¥ste vara ändliga" -#: utils/adt/float.c:4069 utils/adt/numeric.c:1800 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1887 #, c-format msgid "lower bound cannot equal upper bound" -msgstr "lägre gräns kan inte vara samma som övre gräns" +msgstr "undre gräns kan inte vara samma som övre gräns" -#: utils/adt/formatting.c:561 +#: utils/adt/formatting.c:530 #, c-format msgid "invalid format specification for an interval value" msgstr "ogiltig formatspecifikation för ett intervallvärdei" -#: utils/adt/formatting.c:562 +#: utils/adt/formatting.c:531 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Intervaller är inte kopplade till specifika kalenderdatum." -#: utils/adt/formatting.c:1192 +#: utils/adt/formatting.c:1161 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\" mÃ¥ste vara det sista mönstret som används" -#: utils/adt/formatting.c:1200 +#: utils/adt/formatting.c:1169 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\" mÃ¥ste vara före \"PR\"" -#: utils/adt/formatting.c:1216 +#: utils/adt/formatting.c:1185 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\" mÃ¥ste vara före \"PR\"" -#: utils/adt/formatting.c:1243 +#: utils/adt/formatting.c:1212 #, c-format msgid "multiple decimal points" msgstr "multipla decimalpunkter" -#: utils/adt/formatting.c:1247 utils/adt/formatting.c:1330 +#: utils/adt/formatting.c:1216 utils/adt/formatting.c:1299 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "kan inte använda \"V\" ach decimalpunkt tillsammans" -#: utils/adt/formatting.c:1259 +#: utils/adt/formatting.c:1228 #, c-format msgid "cannot use \"S\" twice" msgstr "kan inte använda \"S\" tvÃ¥ gÃ¥nger" -#: utils/adt/formatting.c:1263 +#: utils/adt/formatting.c:1232 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "kan inte använda \"S\" och \"PL\"/\"MI\"/\"SG\"/\"PR\" tillsammans" -#: utils/adt/formatting.c:1283 +#: utils/adt/formatting.c:1252 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "kan inte använda \"S\" och \"MI\" tillsammans." -#: utils/adt/formatting.c:1293 +#: utils/adt/formatting.c:1262 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "kan inte använda \"S\" och \"PL\" tillsammans." -#: utils/adt/formatting.c:1303 +#: utils/adt/formatting.c:1272 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "kan inte använda \"S\" och \"SG\" tillsammans." -#: utils/adt/formatting.c:1312 +#: utils/adt/formatting.c:1281 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "kan inte använda \"PR\" och \"S\"/\"PL\"/\"MI\"/\"SG\" tillsammans." -#: utils/adt/formatting.c:1338 +#: utils/adt/formatting.c:1307 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "kan inte använda \"EEEE\" tvÃ¥ gÃ¥nger" -#: utils/adt/formatting.c:1344 +#: utils/adt/formatting.c:1313 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\" är inkompatibel med andra format" -#: utils/adt/formatting.c:1345 +#: utils/adt/formatting.c:1314 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "\"EEEE\" fÃ¥r bara användas tillsammans med siffror- och decimalpunkts-mönster." -#: utils/adt/formatting.c:1429 +#: utils/adt/formatting.c:1398 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "ogiltigt formatseparator för datetime: \"%s\"" -#: utils/adt/formatting.c:1556 +#: utils/adt/formatting.c:1525 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\" är inte ett nummer" -#: utils/adt/formatting.c:1634 +#: utils/adt/formatting.c:1603 #, c-format msgid "case conversion failed: %s" msgstr "case-konvertering misslyckades: %s" -#: utils/adt/formatting.c:1688 utils/adt/formatting.c:1810 -#: utils/adt/formatting.c:1933 +#: utils/adt/formatting.c:1651 utils/adt/formatting.c:1799 +#: utils/adt/formatting.c:1989 #, c-format msgid "could not determine which collation to use for %s function" msgstr "kunde inte bestämma jämförelse (collation) för funktionen %s" -#: utils/adt/formatting.c:2314 +#: utils/adt/formatting.c:2410 #, c-format msgid "invalid combination of date conventions" msgstr "ogiltig kombination av datumkonventioner" -#: utils/adt/formatting.c:2315 +#: utils/adt/formatting.c:2411 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "Blanda inte datumkonventionerna Gregoriansk och ISO-veckor i formatteringsmall." -#: utils/adt/formatting.c:2338 +#: utils/adt/formatting.c:2433 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "värden för \"%s\" i formatsträng stÃ¥r i konflikt med varandra" -#: utils/adt/formatting.c:2341 +#: utils/adt/formatting.c:2435 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Detta värde motsäger en tidigare inställning för samma fälttyp." -#: utils/adt/formatting.c:2412 +#: utils/adt/formatting.c:2502 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "källsträngen är för kort för formatfält \"%s\"" -#: utils/adt/formatting.c:2415 +#: utils/adt/formatting.c:2504 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Fältet kräver %d tecken men bara %d Ã¥terstÃ¥r." -#: utils/adt/formatting.c:2418 utils/adt/formatting.c:2433 +#: utils/adt/formatting.c:2506 utils/adt/formatting.c:2520 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "Om din källsträng inte är av fast längd sÃ¥ testa med modifieraren \"FM\"." -#: utils/adt/formatting.c:2428 utils/adt/formatting.c:2442 -#: utils/adt/formatting.c:2665 +#: utils/adt/formatting.c:2516 utils/adt/formatting.c:2529 +#: utils/adt/formatting.c:2750 utils/adt/formatting.c:3650 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "ogiltigt värde \"%s\" för \"%s\"" -#: utils/adt/formatting.c:2430 +#: utils/adt/formatting.c:2518 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Fältet kräver %d tecken men bara %d kunde parsas." -#: utils/adt/formatting.c:2444 +#: utils/adt/formatting.c:2531 #, c-format msgid "Value must be an integer." msgstr "Värdet mÃ¥ste vara ett heltal." -#: utils/adt/formatting.c:2449 +#: utils/adt/formatting.c:2536 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "värdet för \"%s\" i källsträng är utanför giltigt intervall" -#: utils/adt/formatting.c:2451 +#: utils/adt/formatting.c:2538 #, c-format msgid "Value must be in the range %d to %d." msgstr "Värdet mÃ¥ste vara i intervallet %d till %d." -#: utils/adt/formatting.c:2667 +#: utils/adt/formatting.c:2752 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "Det givna värdet matchar inget av de tillÃ¥tna värdena för detta fält." -#: utils/adt/formatting.c:2886 utils/adt/formatting.c:2906 -#: utils/adt/formatting.c:2926 utils/adt/formatting.c:2946 -#: utils/adt/formatting.c:2965 utils/adt/formatting.c:2984 -#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3026 -#: utils/adt/formatting.c:3044 utils/adt/formatting.c:3062 -#: utils/adt/formatting.c:3079 utils/adt/formatting.c:3096 +#: utils/adt/formatting.c:2968 utils/adt/formatting.c:2988 +#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3028 +#: utils/adt/formatting.c:3047 utils/adt/formatting.c:3066 +#: utils/adt/formatting.c:3090 utils/adt/formatting.c:3108 +#: utils/adt/formatting.c:3126 utils/adt/formatting.c:3144 +#: utils/adt/formatting.c:3161 utils/adt/formatting.c:3178 #, c-format msgid "localized string format value too long" msgstr "lokaliserat strängformatvärde är för lÃ¥ngt" -#: utils/adt/formatting.c:3373 +#: utils/adt/formatting.c:3458 #, c-format msgid "unmatched format separator \"%c\"" msgstr "ej matchande formatteringsseparator \"%c\"" -#: utils/adt/formatting.c:3434 +#: utils/adt/formatting.c:3519 #, c-format msgid "unmatched format character \"%s\"" msgstr "ej matchande formatteringstecken \"%s\"" -#: utils/adt/formatting.c:3540 utils/adt/formatting.c:3884 +#: utils/adt/formatting.c:3652 #, c-format -msgid "formatting field \"%s\" is only supported in to_char" -msgstr "formateringsfält \"%s\" stöds bara i to_char" +msgid "Time zone abbreviation is not recognized." +msgstr "Känner inte igen förkortning för tidszon." -#: utils/adt/formatting.c:3715 +#: utils/adt/formatting.c:3853 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "ogiltig indatasträng för \"Y,YYY\"" -#: utils/adt/formatting.c:3801 +#: utils/adt/formatting.c:3942 #, c-format msgid "input string is too short for datetime format" msgstr "indatasträngen är för kort för datetime-formatet" -#: utils/adt/formatting.c:3809 +#: utils/adt/formatting.c:3950 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "efterföljande tecken finns kvar i indatasträngen efter datetime-formattering" -#: utils/adt/formatting.c:4370 +#: utils/adt/formatting.c:4494 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "saknar tidszon i indatasträngen för typen timestamptz" -#: utils/adt/formatting.c:4376 +#: utils/adt/formatting.c:4500 #, c-format msgid "timestamptz out of range" msgstr "timestamptz utanför giltigt intervall" -#: utils/adt/formatting.c:4404 +#: utils/adt/formatting.c:4528 #, c-format msgid "datetime format is zoned but not timed" msgstr "datetime-format har zon men inte tid" -#: utils/adt/formatting.c:4456 +#: utils/adt/formatting.c:4577 #, c-format msgid "missing time zone in input string for type timetz" msgstr "saknar tidszon i indatasträng för typ timetz" -#: utils/adt/formatting.c:4462 +#: utils/adt/formatting.c:4583 #, c-format msgid "timetz out of range" msgstr "timetz utanför giltigt intervall" -#: utils/adt/formatting.c:4488 +#: utils/adt/formatting.c:4609 #, c-format msgid "datetime format is not dated and not timed" msgstr "datetime-format har inte datum och inte tid" -#: utils/adt/formatting.c:4621 +#: utils/adt/formatting.c:4786 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "timmen \"%d\" är ogiltigt för en 12-timmars-klocka" -#: utils/adt/formatting.c:4623 +#: utils/adt/formatting.c:4788 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "Använd en 24-timmars-klocka eller ange en timme mellan 1 och 12." -#: utils/adt/formatting.c:4734 +#: utils/adt/formatting.c:4900 #, c-format msgid "cannot calculate day of year without year information" msgstr "kan inte beräkna dag pÃ¥ Ã¥ret utan Ã¥rsinformation" -#: utils/adt/formatting.c:5653 +#: utils/adt/formatting.c:5852 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" stöds inte för indata" -#: utils/adt/formatting.c:5665 +#: utils/adt/formatting.c:5864 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\" stöds inte för indata" @@ -24005,12 +25496,12 @@ msgstr "absolut sökväg tillÃ¥ts inte" #: utils/adt/genfile.c:89 #, c-format -msgid "path must be in or below the current directory" -msgstr "sökväg mÃ¥ste vara i eller under den aktuella katalogen" +msgid "path must be in or below the data directory" +msgstr "sökväg mÃ¥ste vara i eller under datakatalogen" -#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:189 -#: utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:836 -#: utils/adt/oracle_compat.c:1139 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:190 +#: utils/adt/oracle_compat.c:288 utils/adt/oracle_compat.c:839 +#: utils/adt/oracle_compat.c:1142 #, c-format msgid "requested length too large" msgstr "efterfrÃ¥gad längd är för lÃ¥ng" @@ -24025,610 +25516,696 @@ msgstr "kunde inte söka (seek) i fil \"%s\": %m" msgid "file length too large" msgstr "fillängd är för stor" -#: utils/adt/genfile.c:248 +#: utils/adt/genfile.c:656 #, c-format -msgid "must be superuser to read files with adminpack 1.0" -msgstr "mÃ¥ste vara superuser för att läsa filer med adminpack 1.0" +msgid "tablespace with OID %u does not exist" +msgstr "tabellutrymme med OID %u finns inte" -#: utils/adt/geo_ops.c:979 utils/adt/geo_ops.c:1025 +#: utils/adt/geo_ops.c:998 utils/adt/geo_ops.c:1052 #, c-format msgid "invalid line specification: A and B cannot both be zero" msgstr "ogiltig radangivelse: A och B kan inte bÃ¥da vara noll" -#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1097 +#: utils/adt/geo_ops.c:1008 utils/adt/geo_ops.c:1124 #, c-format msgid "invalid line specification: must be two distinct points" msgstr "ogiltig linjeangivelse: mÃ¥ste vara tvÃ¥ enskilda punkter" -#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4330 -#: utils/adt/geo_ops.c:5210 +#: utils/adt/geo_ops.c:1438 utils/adt/geo_ops.c:3438 utils/adt/geo_ops.c:4368 +#: utils/adt/geo_ops.c:5253 #, c-format msgid "too many points requested" msgstr "för mÃ¥nga punkter efterfrÃ¥gade" -#: utils/adt/geo_ops.c:1472 +#: utils/adt/geo_ops.c:1502 #, c-format msgid "invalid number of points in external \"path\" value" msgstr "ogiltigt antal punkter i externt \"path\"-värde" -#: utils/adt/geo_ops.c:3449 +#: utils/adt/geo_ops.c:3487 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "ogiltigt antal punkter i ett externt \"polygon\"-värde" -#: utils/adt/geo_ops.c:4425 +#: utils/adt/geo_ops.c:4463 #, c-format msgid "open path cannot be converted to polygon" msgstr "öppen väg kan inte konverteras till en polygon" -#: utils/adt/geo_ops.c:4675 +#: utils/adt/geo_ops.c:4718 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "ogiltig radie i ett externt cirkelvärde" -#: utils/adt/geo_ops.c:5196 +#: utils/adt/geo_ops.c:5239 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "kan inte konvertera en cirkel med radie noll till en polygon" -#: utils/adt/geo_ops.c:5201 +#: utils/adt/geo_ops.c:5244 #, c-format msgid "must request at least 2 points" msgstr "mÃ¥ste efterfrÃ¥ga minst 2 punkter" -#: utils/adt/int.c:263 +#: utils/adt/int.c:264 #, c-format msgid "invalid int2vector data" msgstr "ogiltig int2vector-data" -#: utils/adt/int.c:1528 utils/adt/int8.c:1404 utils/adt/numeric.c:1678 -#: utils/adt/timestamp.c:5809 utils/adt/timestamp.c:5889 +#: utils/adt/int.c:1529 utils/adt/int8.c:1403 utils/adt/numeric.c:1765 +#: utils/adt/timestamp.c:6546 utils/adt/timestamp.c:6632 #, c-format msgid "step size cannot equal zero" msgstr "stegstorleken kan inte vara noll" -#: utils/adt/int8.c:449 utils/adt/int8.c:472 utils/adt/int8.c:486 -#: utils/adt/int8.c:500 utils/adt/int8.c:531 utils/adt/int8.c:555 -#: utils/adt/int8.c:637 utils/adt/int8.c:705 utils/adt/int8.c:711 -#: utils/adt/int8.c:737 utils/adt/int8.c:751 utils/adt/int8.c:775 -#: utils/adt/int8.c:788 utils/adt/int8.c:900 utils/adt/int8.c:914 -#: utils/adt/int8.c:928 utils/adt/int8.c:959 utils/adt/int8.c:981 -#: utils/adt/int8.c:995 utils/adt/int8.c:1009 utils/adt/int8.c:1042 -#: utils/adt/int8.c:1056 utils/adt/int8.c:1070 utils/adt/int8.c:1101 -#: utils/adt/int8.c:1123 utils/adt/int8.c:1137 utils/adt/int8.c:1151 -#: utils/adt/int8.c:1313 utils/adt/int8.c:1348 utils/adt/numeric.c:4336 +#: utils/adt/int8.c:448 utils/adt/int8.c:471 utils/adt/int8.c:485 +#: utils/adt/int8.c:499 utils/adt/int8.c:530 utils/adt/int8.c:554 +#: utils/adt/int8.c:636 utils/adt/int8.c:704 utils/adt/int8.c:710 +#: utils/adt/int8.c:736 utils/adt/int8.c:750 utils/adt/int8.c:774 +#: utils/adt/int8.c:787 utils/adt/int8.c:899 utils/adt/int8.c:913 +#: utils/adt/int8.c:927 utils/adt/int8.c:958 utils/adt/int8.c:980 +#: utils/adt/int8.c:994 utils/adt/int8.c:1008 utils/adt/int8.c:1041 +#: utils/adt/int8.c:1055 utils/adt/int8.c:1069 utils/adt/int8.c:1100 +#: utils/adt/int8.c:1122 utils/adt/int8.c:1136 utils/adt/int8.c:1150 +#: utils/adt/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4542 +#: utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 #: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint utanför sitt intervall" -#: utils/adt/int8.c:1361 +#: utils/adt/int8.c:1360 #, c-format msgid "OID out of range" msgstr "OID utanför sitt intervall" -#: utils/adt/json.c:271 utils/adt/jsonb.c:757 +#: utils/adt/json.c:202 utils/adt/jsonb.c:664 #, c-format msgid "key value must be scalar, not array, composite, or json" msgstr "nyckelvärde mÃ¥ste vara skalär, inte array, composite eller json" -#: utils/adt/json.c:892 utils/adt/json.c:902 utils/fmgr/funcapi.c:2104 +#: utils/adt/json.c:1034 utils/adt/json.c:1044 utils/fmgr/funcapi.c:2090 #, c-format msgid "could not determine data type for argument %d" msgstr "kunde inte lista ut datatypen för argument %d" -#: utils/adt/json.c:926 utils/adt/jsonb.c:1727 +#: utils/adt/json.c:1067 utils/adt/json.c:1266 utils/adt/json.c:1449 +#: utils/adt/json.c:1527 utils/adt/jsonb.c:1333 utils/adt/jsonb.c:1423 #, c-format -msgid "field name must not be null" -msgstr "fältnamnet fÃ¥r inte vara null" +msgid "null value not allowed for object key" +msgstr "null-värde tillÃ¥ts inte som objektnyckel" + +#: utils/adt/json.c:1117 utils/adt/json.c:1288 +#, c-format +msgid "duplicate JSON object key value: %s" +msgstr "duplicerat nyckelvärde i JSON objekt: %s" -#: utils/adt/json.c:1010 utils/adt/jsonb.c:1177 +#: utils/adt/json.c:1226 utils/adt/jsonb.c:1134 #, c-format msgid "argument list must have even number of elements" msgstr "argumentlistan mÃ¥ste ha ett jämt antal element" #. translator: %s is a SQL function name -#: utils/adt/json.c:1012 utils/adt/jsonb.c:1179 +#: utils/adt/json.c:1228 utils/adt/jsonb.c:1136 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "Argumenten till %s mÃ¥ste bestÃ¥ av varannan nyckel och varannat värde." -#: utils/adt/json.c:1028 -#, c-format -msgid "argument %d cannot be null" -msgstr "argument %d kan inte vara null" - -#: utils/adt/json.c:1029 -#, c-format -msgid "Object keys should be text." -msgstr "Objektnycklar skall vara text." - -#: utils/adt/json.c:1135 utils/adt/jsonb.c:1309 +#: utils/adt/json.c:1427 utils/adt/jsonb.c:1311 #, c-format msgid "array must have two columns" msgstr "array:en mÃ¥ste ha tvÃ¥ kolumner" -#: utils/adt/json.c:1159 utils/adt/json.c:1242 utils/adt/jsonb.c:1333 -#: utils/adt/jsonb.c:1428 -#, c-format -msgid "null value not allowed for object key" -msgstr "null-värde tillÃ¥ts inte som objektnyckel" - -#: utils/adt/json.c:1231 utils/adt/jsonb.c:1417 +#: utils/adt/json.c:1516 utils/adt/jsonb.c:1412 #, c-format msgid "mismatched array dimensions" msgstr "array-dimensionerna stämmer inte" -#: utils/adt/jsonb.c:287 +#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1956 +#, c-format +msgid "duplicate JSON object key value" +msgstr "duplicerat nyckelvärde i JSON objekt" + +#: utils/adt/jsonb.c:282 #, c-format msgid "string too long to represent as jsonb string" msgstr "strängen är för lÃ¥ng för att representeras som en jsonb-sträng" -#: utils/adt/jsonb.c:288 +#: utils/adt/jsonb.c:283 #, c-format msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "PÃ¥ grund av en implementationsbegränsning sÃ¥ kan jsonb-strängar inte överstiga %d byte." -#: utils/adt/jsonb.c:1192 +#: utils/adt/jsonb.c:1153 #, c-format msgid "argument %d: key must not be null" msgstr "argument %d: nyckeln fÃ¥r inte vara null" -#: utils/adt/jsonb.c:1780 +#: utils/adt/jsonb.c:1744 +#, c-format +msgid "field name must not be null" +msgstr "fältnamnet fÃ¥r inte vara null" + +#: utils/adt/jsonb.c:1806 #, c-format msgid "object keys must be strings" msgstr "objektnycklar mÃ¥ste vara strängar" -#: utils/adt/jsonb.c:1943 +#: utils/adt/jsonb.c:2017 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "kan inte typomvandla jsonb-null till type %s" -#: utils/adt/jsonb.c:1944 +#: utils/adt/jsonb.c:2018 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "kan inte typomvandla jsonb-sträng till typ %s" -#: utils/adt/jsonb.c:1945 +#: utils/adt/jsonb.c:2019 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "kan inte typomvandla jsonb-numeric till typ %s" -#: utils/adt/jsonb.c:1946 +#: utils/adt/jsonb.c:2020 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "kan inte typomvandla jsonb-boolean till typ %s" -#: utils/adt/jsonb.c:1947 +#: utils/adt/jsonb.c:2021 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "kan inte typomvandla jsonb-array till typ %s" -#: utils/adt/jsonb.c:1948 +#: utils/adt/jsonb.c:2022 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "kan inte typomvandla jsonb-objekt till typ %s" -#: utils/adt/jsonb.c:1949 +#: utils/adt/jsonb.c:2023 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "kan inte typomvandla jsonb-array eller objekt till typ %s" -#: utils/adt/jsonb_util.c:752 +#: utils/adt/jsonb_util.c:756 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "antalet jsonb-objektpar överskrider det maximalt tillÃ¥tna (%zu)" -#: utils/adt/jsonb_util.c:793 +#: utils/adt/jsonb_util.c:797 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "antalet jsonb-array-element överskrider det maximalt tillÃ¥tna (%zu)" -#: utils/adt/jsonb_util.c:1667 utils/adt/jsonb_util.c:1687 +#: utils/adt/jsonb_util.c:1671 utils/adt/jsonb_util.c:1691 #, c-format -msgid "total size of jsonb array elements exceeds the maximum of %u bytes" -msgstr "total storlek pÃ¥ elementen i jsonb-array överskrider maximala %u byte" +msgid "total size of jsonb array elements exceeds the maximum of %d bytes" +msgstr "total storleken pÃ¥ element i jsonb-array överskrider maximala %d byte" -#: utils/adt/jsonb_util.c:1748 utils/adt/jsonb_util.c:1783 -#: utils/adt/jsonb_util.c:1803 +#: utils/adt/jsonb_util.c:1752 utils/adt/jsonb_util.c:1787 +#: utils/adt/jsonb_util.c:1807 #, c-format -msgid "total size of jsonb object elements exceeds the maximum of %u bytes" -msgstr "total storlek pÃ¥ element i jsonb-objekt överskrider maximum pÃ¥ %u byte" +msgid "total size of jsonb object elements exceeds the maximum of %d bytes" +msgstr "total storleken pÃ¥ element i jsonb-objekt överskrider maximala %d byte" -#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 +#: utils/adt/jsonbsubs.c:67 utils/adt/jsonbsubs.c:148 #, c-format msgid "jsonb subscript does not support slices" msgstr "array-index-syntax för jsonb stöder inte slices" -#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 +#: utils/adt/jsonbsubs.c:100 utils/adt/jsonbsubs.c:114 #, c-format msgid "subscript type %s is not supported" msgstr "array-index-typ %s stöds inte" -#: utils/adt/jsonbsubs.c:104 +#: utils/adt/jsonbsubs.c:101 #, c-format msgid "jsonb subscript must be coercible to only one type, integer or text." msgstr "array-index för jsonb mÃ¥ste vara konverterbar till en av typerna integer eller text." -#: utils/adt/jsonbsubs.c:118 +#: utils/adt/jsonbsubs.c:115 #, c-format msgid "jsonb subscript must be coercible to either integer or text." msgstr "array-index för jsonb mÃ¥ste vara konverterbar till antingen integer eller text." -#: utils/adt/jsonbsubs.c:139 +#: utils/adt/jsonbsubs.c:136 #, c-format msgid "jsonb subscript must have text type" msgstr "array-index för jsonb mÃ¥ste ha typen text" -#: utils/adt/jsonbsubs.c:207 +#: utils/adt/jsonbsubs.c:204 #, c-format msgid "jsonb subscript in assignment must not be null" msgstr "array-index för jsonb i tilldelning kan inte vara null" -#: utils/adt/jsonfuncs.c:561 utils/adt/jsonfuncs.c:797 -#: utils/adt/jsonfuncs.c:2367 utils/adt/jsonfuncs.c:2807 -#: utils/adt/jsonfuncs.c:3596 utils/adt/jsonfuncs.c:3929 +#: utils/adt/jsonfuncs.c:583 utils/adt/jsonfuncs.c:830 +#: utils/adt/jsonfuncs.c:2439 utils/adt/jsonfuncs.c:3015 +#: utils/adt/jsonfuncs.c:3948 utils/adt/jsonfuncs.c:4295 #, c-format msgid "cannot call %s on a scalar" msgstr "kan inte anropa %s pÃ¥ en skalär" -#: utils/adt/jsonfuncs.c:566 utils/adt/jsonfuncs.c:784 -#: utils/adt/jsonfuncs.c:2809 utils/adt/jsonfuncs.c:3585 +#: utils/adt/jsonfuncs.c:588 utils/adt/jsonfuncs.c:815 +#: utils/adt/jsonfuncs.c:3017 utils/adt/jsonfuncs.c:3935 #, c-format msgid "cannot call %s on an array" msgstr "kan inte anropa %s pÃ¥ en array" -#: utils/adt/jsonfuncs.c:693 +#: utils/adt/jsonfuncs.c:724 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "JSON-data, rad %d: %s%s%s" -#: utils/adt/jsonfuncs.c:1833 utils/adt/jsonfuncs.c:1868 +#: utils/adt/jsonfuncs.c:1883 utils/adt/jsonfuncs.c:1920 #, c-format msgid "cannot get array length of a scalar" msgstr "kan inte hämta array-längd pÃ¥ skalär" -#: utils/adt/jsonfuncs.c:1837 utils/adt/jsonfuncs.c:1856 +#: utils/adt/jsonfuncs.c:1887 utils/adt/jsonfuncs.c:1906 #, c-format msgid "cannot get array length of a non-array" msgstr "kan inte hämta array-längd pÃ¥ icke-array" -#: utils/adt/jsonfuncs.c:1930 +#: utils/adt/jsonfuncs.c:1986 #, c-format msgid "cannot call %s on a non-object" msgstr "kan inte anropa %s pÃ¥ ett icke-objekt" -#: utils/adt/jsonfuncs.c:2114 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot deconstruct an array as an object" msgstr "kan inte dekonstruera en array som ett objekt" -#: utils/adt/jsonfuncs.c:2126 +#: utils/adt/jsonfuncs.c:2188 #, c-format msgid "cannot deconstruct a scalar" msgstr "kan inte dekonstruera en skalär" -#: utils/adt/jsonfuncs.c:2169 +#: utils/adt/jsonfuncs.c:2233 #, c-format msgid "cannot extract elements from a scalar" msgstr "kan inte extrahera element frÃ¥n en skalär" -#: utils/adt/jsonfuncs.c:2173 +#: utils/adt/jsonfuncs.c:2237 #, c-format msgid "cannot extract elements from an object" msgstr "kan inte extrahera element frÃ¥n ett objekt" -#: utils/adt/jsonfuncs.c:2354 utils/adt/jsonfuncs.c:3814 +#: utils/adt/jsonfuncs.c:2424 utils/adt/jsonfuncs.c:4173 #, c-format msgid "cannot call %s on a non-array" msgstr "kan inte anropa %s pÃ¥ icke-array" -#: utils/adt/jsonfuncs.c:2424 utils/adt/jsonfuncs.c:2429 -#: utils/adt/jsonfuncs.c:2446 utils/adt/jsonfuncs.c:2452 +#: utils/adt/jsonfuncs.c:2515 utils/adt/jsonfuncs.c:2520 +#: utils/adt/jsonfuncs.c:2538 utils/adt/jsonfuncs.c:2544 #, c-format msgid "expected JSON array" msgstr "förväntade JSON-array" -#: utils/adt/jsonfuncs.c:2425 +#: utils/adt/jsonfuncs.c:2516 #, c-format msgid "See the value of key \"%s\"." msgstr "Se värdetypen för nyckel \"%s\"" -#: utils/adt/jsonfuncs.c:2447 +#: utils/adt/jsonfuncs.c:2539 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Se array-element %s för nyckel \"%s\"." -#: utils/adt/jsonfuncs.c:2453 +#: utils/adt/jsonfuncs.c:2545 #, c-format msgid "See the array element %s." msgstr "Se array-element %s." -#: utils/adt/jsonfuncs.c:2488 +#: utils/adt/jsonfuncs.c:2597 #, c-format msgid "malformed JSON array" msgstr "felaktig JSON-array" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3315 +#: utils/adt/jsonfuncs.c:3647 #, c-format msgid "first argument of %s must be a row type" msgstr "första argumentet till %s mÃ¥ste vara en radtyp" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3339 +#: utils/adt/jsonfuncs.c:3671 #, c-format msgid "could not determine row type for result of %s" msgstr "kunde inte lista ut radtyp för resultat av %s" -#: utils/adt/jsonfuncs.c:3341 +#: utils/adt/jsonfuncs.c:3673 #, c-format msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." msgstr "Ange en icke-null record som argument eller anropa funktionen i FROM-klausulen med en kolumndefinitionslista." -#: utils/adt/jsonfuncs.c:3703 utils/fmgr/funcapi.c:103 +#: utils/adt/jsonfuncs.c:4059 utils/fmgr/funcapi.c:94 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "materialiserat läge krävs, men stöds inte i detta kontext" -#: utils/adt/jsonfuncs.c:3831 utils/adt/jsonfuncs.c:3911 +#: utils/adt/jsonfuncs.c:4190 utils/adt/jsonfuncs.c:4274 #, c-format msgid "argument of %s must be an array of objects" msgstr "argumentet till %s mÃ¥ste vara en array med objekt" -#: utils/adt/jsonfuncs.c:3864 +#: utils/adt/jsonfuncs.c:4223 #, c-format msgid "cannot call %s on an object" msgstr "kan inte anropa %s pÃ¥ ett objekt" -#: utils/adt/jsonfuncs.c:4271 utils/adt/jsonfuncs.c:4330 -#: utils/adt/jsonfuncs.c:4411 +#: utils/adt/jsonfuncs.c:4656 utils/adt/jsonfuncs.c:4715 +#: utils/adt/jsonfuncs.c:4795 #, c-format msgid "cannot delete from scalar" msgstr "kan inte radera frÃ¥n en skalär" -#: utils/adt/jsonfuncs.c:4416 +#: utils/adt/jsonfuncs.c:4800 #, c-format msgid "cannot delete from object using integer index" msgstr "kan inte radera frÃ¥n objekt genom att använda heltalsindex" -#: utils/adt/jsonfuncs.c:4484 utils/adt/jsonfuncs.c:4645 +#: utils/adt/jsonfuncs.c:4868 utils/adt/jsonfuncs.c:5027 #, c-format msgid "cannot set path in scalar" msgstr "kan inte sätta sökväg i skalär" -#: utils/adt/jsonfuncs.c:4526 utils/adt/jsonfuncs.c:4568 +#: utils/adt/jsonfuncs.c:4909 utils/adt/jsonfuncs.c:4951 #, c-format msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" msgstr "null_value_treatment mÃ¥ste vara \"delete_key\", \"return_target\", \"use_json_null\" eller \"raise_exception\"" -#: utils/adt/jsonfuncs.c:4539 +#: utils/adt/jsonfuncs.c:4922 #, c-format msgid "JSON value must not be null" msgstr "JSON-värde fÃ¥r inte vara null" -#: utils/adt/jsonfuncs.c:4540 +#: utils/adt/jsonfuncs.c:4923 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "Avbrott utlöstes dÃ¥ null_value_treatment är \"raise_exception\"." -#: utils/adt/jsonfuncs.c:4541 +#: utils/adt/jsonfuncs.c:4924 #, c-format msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." msgstr "För att undvika detta sÃ¥ ändra null_value_treatment-argumentet eller se till att ett SQL-NULL inte skickas." -#: utils/adt/jsonfuncs.c:4596 +#: utils/adt/jsonfuncs.c:4979 #, c-format msgid "cannot delete path in scalar" msgstr "kan inte radera sökväg i skalär" -#: utils/adt/jsonfuncs.c:4812 +#: utils/adt/jsonfuncs.c:5193 #, c-format msgid "path element at position %d is null" msgstr "sökvägselement vid position %d är null" -#: utils/adt/jsonfuncs.c:4831 utils/adt/jsonfuncs.c:4862 -#: utils/adt/jsonfuncs.c:4935 +#: utils/adt/jsonfuncs.c:5212 utils/adt/jsonfuncs.c:5243 +#: utils/adt/jsonfuncs.c:5316 #, c-format msgid "cannot replace existing key" msgstr "kan inte ersätta befintlig nyckel" -#: utils/adt/jsonfuncs.c:4832 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:5213 utils/adt/jsonfuncs.c:5244 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." msgstr "Sökvägen förväntar sig att nyckeln är ett sammansatt objekt men det är ett skalärt värde." -#: utils/adt/jsonfuncs.c:4936 +#: utils/adt/jsonfuncs.c:5317 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Försök använda funktionen jsonb_set för att ersätta nyckelvärde." -#: utils/adt/jsonfuncs.c:5040 +#: utils/adt/jsonfuncs.c:5421 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "sökvägselement vid position %d är inte ett heltal: \"%s\"" -#: utils/adt/jsonfuncs.c:5057 +#: utils/adt/jsonfuncs.c:5438 #, c-format msgid "path element at position %d is out of range: %d" msgstr "sökvägselement vid position %d är utanför giltigt intervall: %d\"" -#: utils/adt/jsonfuncs.c:5209 +#: utils/adt/jsonfuncs.c:5590 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "fel flaggtyp, bara array:er och skalärer tillÃ¥ts" -#: utils/adt/jsonfuncs.c:5216 +#: utils/adt/jsonfuncs.c:5597 #, c-format msgid "flag array element is not a string" msgstr "flaggelement i arrayen är inte en sträng" -#: utils/adt/jsonfuncs.c:5217 utils/adt/jsonfuncs.c:5239 +#: utils/adt/jsonfuncs.c:5598 utils/adt/jsonfuncs.c:5620 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "Möjliga värden är: \"string\", \"numeric\", \"boolean\", \"key\" samt \"all\"." -#: utils/adt/jsonfuncs.c:5237 +#: utils/adt/jsonfuncs.c:5618 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "fel flagga i flagg-array: \"%s\"" -#: utils/adt/jsonpath.c:362 +#: utils/adt/jsonpath.c:389 #, c-format msgid "@ is not allowed in root expressions" msgstr "@ är inte tillÃ¥ten i rotuttryck" -#: utils/adt/jsonpath.c:368 +#: utils/adt/jsonpath.c:395 #, c-format msgid "LAST is allowed only in array subscripts" msgstr "LAST tillÃ¥ts bara i array-indexeringar" -#: utils/adt/jsonpath_exec.c:360 +#: utils/adt/jsonpath_exec.c:491 #, c-format msgid "single boolean result is expected" msgstr "förväntade ett booleanskt resultat" -#: utils/adt/jsonpath_exec.c:556 +#: utils/adt/jsonpath_exec.c:851 #, c-format -msgid "\"vars\" argument is not an object" -msgstr "\"variabel\"-argumentet är inte ett objekt" +msgid "jsonpath wildcard array accessor can only be applied to an array" +msgstr "jsonpaths arrayväljare med wildcard kan bara applcieras pÃ¥ en array" -#: utils/adt/jsonpath_exec.c:557 +#: utils/adt/jsonpath_exec.c:874 #, c-format -msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." -msgstr "Jsonpath-parametrar skall kodas som nyckel-värde-par av \"variabel\"-objekt." +msgid "jsonpath wildcard member accessor can only be applied to an object" +msgstr "jsonpaths medlemsväljare med wildcard kan bara appliceras pÃ¥ ett objekt" + +#: utils/adt/jsonpath_exec.c:923 +#, c-format +msgid "jsonpath array subscript is out of bounds" +msgstr "array-index för jsonpath är utanför giltigt omrÃ¥de" + +#: utils/adt/jsonpath_exec.c:980 +#, c-format +msgid "jsonpath array accessor can only be applied to an array" +msgstr "jsonpaths arrayväljare kan bara appliceras pÃ¥ en array" -#: utils/adt/jsonpath_exec.c:674 +#: utils/adt/jsonpath_exec.c:1044 #, c-format msgid "JSON object does not contain key \"%s\"" msgstr "JSON-objekt innehÃ¥ller inte nyckeln \"%s\"" -#: utils/adt/jsonpath_exec.c:686 +#: utils/adt/jsonpath_exec.c:1056 #, c-format msgid "jsonpath member accessor can only be applied to an object" msgstr "jsonpaths medlemsväljare kan bara appliceras pÃ¥ ett objekt" -#: utils/adt/jsonpath_exec.c:715 +#: utils/adt/jsonpath_exec.c:1114 #, c-format -msgid "jsonpath wildcard array accessor can only be applied to an array" -msgstr "jsonpaths arrayväljare med wildcard kan bara applcieras pÃ¥ en array" +msgid "jsonpath item method .%s() can only be applied to an array" +msgstr "jsonpaths elementmetod .%s() kan bara applicerars pÃ¥ en array" -#: utils/adt/jsonpath_exec.c:763 +#: utils/adt/jsonpath_exec.c:1167 utils/adt/jsonpath_exec.c:1193 #, c-format -msgid "jsonpath array subscript is out of bounds" -msgstr "array-index för jsonpath är utanför giltigt omrÃ¥de" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type double precision" +msgstr "argumentet \"%s\" till jsonpaths elementmetod .%s() är ogiltig för typen double precision" -#: utils/adt/jsonpath_exec.c:820 +#: utils/adt/jsonpath_exec.c:1172 utils/adt/jsonpath_exec.c:1198 +#: utils/adt/jsonpath_exec.c:1414 utils/adt/jsonpath_exec.c:1446 #, c-format -msgid "jsonpath array accessor can only be applied to an array" -msgstr "jsonpaths arrayväljare kan bara appliceras pÃ¥ en array" +msgid "NaN or Infinity is not allowed for jsonpath item method .%s()" +msgstr "NaN eller Infinity tillÃ¥ts inte för jsonpaths elementmetod .%s()" -#: utils/adt/jsonpath_exec.c:872 +#: utils/adt/jsonpath_exec.c:1211 utils/adt/jsonpath_exec.c:1313 +#: utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1593 #, c-format -msgid "jsonpath wildcard member accessor can only be applied to an object" -msgstr "jsonpaths medlemsväljare med wildcard kan bara appliceras pÃ¥ ett objekt" +msgid "jsonpath item method .%s() can only be applied to a string or numeric value" +msgstr "jsonpaths elementmetod .%s() kan bara applicerars pÃ¥ en sträng eller ett numeriskt värde" -#: utils/adt/jsonpath_exec.c:1006 +#: utils/adt/jsonpath_exec.c:1281 utils/adt/jsonpath_exec.c:1305 #, c-format -msgid "jsonpath item method .%s() can only be applied to an array" -msgstr "jsonpaths elementmetod .%s() lkan bara applicerar pÃ¥ en array" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type bigint" +msgstr "argumentet \"%s\" till jsonpaths elementmetod .%s() är ogiltig för typen bigint" -#: utils/adt/jsonpath_exec.c:1059 +#: utils/adt/jsonpath_exec.c:1357 utils/adt/jsonpath_exec.c:1377 #, c-format -msgid "numeric argument of jsonpath item method .%s() is out of range for type double precision" -msgstr "numeriskt argument till jsonpaths elementmetod .%s() är utanför giltigt intervall för typen double precision" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type boolean" +msgstr "argumentet \"%s\" till jsonpaths elementmetod .%s() är ogiltig för typen boolean" -#: utils/adt/jsonpath_exec.c:1080 +#: utils/adt/jsonpath_exec.c:1386 #, c-format -msgid "string argument of jsonpath item method .%s() is not a valid representation of a double precision number" -msgstr "strängargument till jsonpaths elementmetod .%s() är inte en giltig representation av ett double precision-nummer" +msgid "jsonpath item method .%s() can only be applied to a boolean, string, or numeric value" +msgstr "jsonpaths elementmetod .%s() kan bara appliceras pÃ¥ en boolean, sträng eller ett numeriskt värde" -#: utils/adt/jsonpath_exec.c:1093 +#: utils/adt/jsonpath_exec.c:1439 utils/adt/jsonpath_exec.c:1528 #, c-format -msgid "jsonpath item method .%s() can only be applied to a string or numeric value" -msgstr "jsonpaths elementmetod .%s() kan bara applicerar pÃ¥ en sträng eller ett numeriskt värde" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type numeric" +msgstr "argumentet \"%s\" till jsonpaths elementmetod .%s() är ogiltig för typen numeric" + +#: utils/adt/jsonpath_exec.c:1487 +#, c-format +msgid "precision of jsonpath item method .%s() is out of range for type integer" +msgstr "precisionen för jsonpaths elementmetod .%s() är utanför giltigt intervall för typen integer" -#: utils/adt/jsonpath_exec.c:1583 +#: utils/adt/jsonpath_exec.c:1501 +#, c-format +msgid "scale of jsonpath item method .%s() is out of range for type integer" +msgstr "skalan för jsonpaths elementmetod .%s() är utanför giltigt intervall för typen integer" + +#: utils/adt/jsonpath_exec.c:1561 utils/adt/jsonpath_exec.c:1585 +#, c-format +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type integer" +msgstr "argumentet \"%s\" till jsonpaths elementmetod .%s() är ogiltig för typen integer" + +#: utils/adt/jsonpath_exec.c:1648 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a boolean, string, numeric, or datetime value" +msgstr "jsonpaths elementmetod .%s() kan bara applicerars pÃ¥ en boolean, sträng eller ett datetime-värde" + +#: utils/adt/jsonpath_exec.c:2137 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "vänster operand pÃ¥ jsonpath-operator %s är inte ett ensamt numeriskt värde" -#: utils/adt/jsonpath_exec.c:1590 +#: utils/adt/jsonpath_exec.c:2144 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "höger operand pÃ¥ jsonpath-operator %s är inte ett ensamt numeriskt värde" -#: utils/adt/jsonpath_exec.c:1658 +#: utils/adt/jsonpath_exec.c:2212 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "operand till unär jsonpath-operator %s är inte ett numeriskt värde" -#: utils/adt/jsonpath_exec.c:1756 +#: utils/adt/jsonpath_exec.c:2311 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "jsonpaths elementmetod .%s() kan bara appliceras pÃ¥ ett numeriskt värde" -#: utils/adt/jsonpath_exec.c:1796 +#: utils/adt/jsonpath_exec.c:2357 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" -msgstr "jsonpaths elementmetod .%s() lkan bara applicerar pÃ¥ en sträng" +msgstr "jsonpaths elementmetod .%s() kan bara appliceras pÃ¥ en sträng" + +#: utils/adt/jsonpath_exec.c:2450 +#, c-format +msgid "time precision of jsonpath item method .%s() is out of range for type integer" +msgstr "tidsprecisionen till jsonpaths elementmetod .%s() är utanför giltigt intervall för typen integer" -#: utils/adt/jsonpath_exec.c:1890 +#: utils/adt/jsonpath_exec.c:2484 utils/adt/jsonpath_exec.c:2490 +#: utils/adt/jsonpath_exec.c:2517 utils/adt/jsonpath_exec.c:2545 +#: utils/adt/jsonpath_exec.c:2598 utils/adt/jsonpath_exec.c:2649 +#: utils/adt/jsonpath_exec.c:2720 #, c-format -msgid "datetime format is not recognized: \"%s\"" -msgstr "datetime-format känns inte igen: \"%s\"" +msgid "%s format is not recognized: \"%s\"" +msgstr "%s-format känns inte igen: \"%s\"" -#: utils/adt/jsonpath_exec.c:1892 +#: utils/adt/jsonpath_exec.c:2486 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "Använd ett datetime-mallargument för att ange indataformatet." -#: utils/adt/jsonpath_exec.c:1960 +#: utils/adt/jsonpath_exec.c:2679 utils/adt/jsonpath_exec.c:2760 +#, c-format +msgid "time precision of jsonpath item method .%s() is invalid" +msgstr "tidsprecisionen till jsonpaths elementmetod .%s() är ogiltigt" + +#: utils/adt/jsonpath_exec.c:2840 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "elementmetod .%s() för jsonpath kan bara appliceras pÃ¥ ett objekt" -#: utils/adt/jsonpath_exec.c:2142 +#: utils/adt/jsonpath_exec.c:3124 +#, c-format +msgid "could not convert value of type %s to jsonpath" +msgstr "kunde inte konvertera värde av typ %s till jsonpath" + +#: utils/adt/jsonpath_exec.c:3158 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "kunde inte hitta jsonpath-variabel \"%s\"" -#: utils/adt/jsonpath_exec.c:2406 +#: utils/adt/jsonpath_exec.c:3211 +#, c-format +msgid "\"vars\" argument is not an object" +msgstr "\"variabel\"-argumentet är inte ett objekt" + +#: utils/adt/jsonpath_exec.c:3212 +#, c-format +msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." +msgstr "Jsonpath-parametrar skall kodas som nyckel-värde-par av \"variabel\"-objekt." + +#: utils/adt/jsonpath_exec.c:3475 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "array-index för jsonpath är inte ett ensamt numeriskt värde" -#: utils/adt/jsonpath_exec.c:2418 +#: utils/adt/jsonpath_exec.c:3487 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "array-index för jsonpath är utanför giltigt interval för integer" -#: utils/adt/jsonpath_exec.c:2595 +#: utils/adt/jsonpath_exec.c:3671 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "kan inte konvertera värde frÃ¥n %s till %s utan att använda tidszon" -#: utils/adt/jsonpath_exec.c:2597 +#: utils/adt/jsonpath_exec.c:3673 #, c-format msgid "Use *_tz() function for time zone support." msgstr "ANvända *_tz()-funktioner som stöder tidszon." -#: utils/adt/levenshtein.c:133 +#: utils/adt/jsonpath_exec.c:3981 +#, c-format +msgid "JSON path expression for column \"%s\" must return single item when no wrapper is requested" +msgstr "Uttryck för JSON-sökväg för kolumn \"%s\" skall returnera exakt ett värde när wrapper inte efterfrÃ¥gas" + +#: utils/adt/jsonpath_exec.c:3983 utils/adt/jsonpath_exec.c:3988 +#, c-format +msgid "Use the WITH WRAPPER clause to wrap SQL/JSON items into an array." +msgstr "Använd klausulen WITH WRAPPER för att packa SQL/JSON-poster in i en array." + +#: utils/adt/jsonpath_exec.c:3987 +#, c-format +msgid "JSON path expression in JSON_QUERY must return single item when no wrapper is requested" +msgstr "Uttryck för JSON-sökväg i JSON_QUERY skall returnera exakt ett värde när wrapper inte efterfrÃ¥gas" + +#: utils/adt/jsonpath_exec.c:4045 utils/adt/jsonpath_exec.c:4069 +#, c-format +msgid "JSON path expression for column \"%s\" must return single scalar item" +msgstr "Uttryck för JSON-sökväg för kolumn \"%s\" skall returnera exakt ett skalärt värde" + +#: utils/adt/jsonpath_exec.c:4050 utils/adt/jsonpath_exec.c:4074 +#, c-format +msgid "JSON path expression in JSON_VALUE must return single scalar item" +msgstr "Uttryck för JSON-sökväg i JSON_VALUE skall returnera exakt ett skalärt värde" + +#: utils/adt/levenshtein.c:132 #, c-format msgid "levenshtein argument exceeds maximum length of %d characters" msgstr "levenshtein-argument överskrider maximala längden pÃ¥ %d tecken" -#: utils/adt/like.c:160 +#: utils/adt/like.c:159 #, c-format msgid "nondeterministic collations are not supported for LIKE" msgstr "ickedeterministiska jämförelser (collation) stöds inte för LIKE" -#: utils/adt/like.c:189 utils/adt/like_support.c:1024 +#: utils/adt/like.c:188 utils/adt/like_support.c:1023 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "kunde inte bestämma vilken jämförelse (collation) som skall användas för ILIKE" -#: utils/adt/like.c:201 +#: utils/adt/like.c:200 #, c-format msgid "nondeterministic collations are not supported for ILIKE" msgstr "ickedeterministiska jämförelser (collation) stöds inte för ILIKE" @@ -24638,144 +26215,144 @@ msgstr "ickedeterministiska jämförelser (collation) stöds inte för ILIKE" msgid "LIKE pattern must not end with escape character" msgstr "LIKE-mönster för inte sluta med ett escape-tecken" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:786 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:800 #, c-format msgid "invalid escape string" msgstr "ogiltig escape-sträng" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:787 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:801 #, c-format msgid "Escape string must be empty or one character." msgstr "Escape-sträng mÃ¥ste vara tom eller ett tecken." -#: utils/adt/like_support.c:1014 +#: utils/adt/like_support.c:1013 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "matchning utan skiftlägeskänslighet stöds inte för typen bytea" -#: utils/adt/like_support.c:1115 +#: utils/adt/like_support.c:1114 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "matching med reguljär-uttryck stöds inte för typen bytea" -#: utils/adt/mac.c:101 +#: utils/adt/mac.c:102 #, c-format msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "ogiltigt oktet-värde i \"macaddr\"-värde: \"%s\"" -#: utils/adt/mac8.c:563 +#: utils/adt/mac8.c:555 #, c-format msgid "macaddr8 data out of range to convert to macaddr" msgstr "macaddr8-data utanför giltigt intervall för att konverteras till macaddr" -#: utils/adt/mac8.c:564 +#: utils/adt/mac8.c:556 #, c-format msgid "Only addresses that have FF and FE as values in the 4th and 5th bytes from the left, for example xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted from macaddr8 to macaddr." msgstr "Bara adresser som har FF och FE som värden i 4:e och 5:e byten frÃ¥n vänster, till exempel xx:xx:xx:ff:fe:xx:xx:xx, är möjliga att konvertera frÃ¥n macaddr8 till macaddr." -#: utils/adt/mcxtfuncs.c:182 +#: utils/adt/mcxtfuncs.c:173 #, c-format msgid "PID %d is not a PostgreSQL server process" msgstr "PID %d är inte en PostgreSQL serverprocess" -#: utils/adt/misc.c:216 +#: utils/adt/misc.c:237 #, c-format msgid "global tablespace never has databases" msgstr "globala tablespace:t innehÃ¥ller aldrig databaser" -#: utils/adt/misc.c:238 +#: utils/adt/misc.c:259 #, c-format msgid "%u is not a tablespace OID" msgstr "%u är inte ett tabelespace-OID" -#: utils/adt/misc.c:457 +#: utils/adt/misc.c:454 msgid "unreserved" msgstr "oreserverad" -#: utils/adt/misc.c:461 +#: utils/adt/misc.c:458 msgid "unreserved (cannot be function or type name)" msgstr "ej reserverad (kan inte vara funktion eller typnamn)" -#: utils/adt/misc.c:465 +#: utils/adt/misc.c:462 msgid "reserved (can be function or type name)" msgstr "reserverad (kan vara funktion eller typnamn)" -#: utils/adt/misc.c:469 +#: utils/adt/misc.c:466 msgid "reserved" msgstr "reserverad" -#: utils/adt/misc.c:480 +#: utils/adt/misc.c:477 msgid "can be bare label" msgstr "kan vara en enkelt namn" -#: utils/adt/misc.c:485 +#: utils/adt/misc.c:482 msgid "requires AS" msgstr "kräver AS" -#: utils/adt/misc.c:732 utils/adt/misc.c:746 utils/adt/misc.c:785 -#: utils/adt/misc.c:791 utils/adt/misc.c:797 utils/adt/misc.c:820 +#: utils/adt/misc.c:897 utils/adt/misc.c:911 utils/adt/misc.c:950 +#: utils/adt/misc.c:956 utils/adt/misc.c:962 utils/adt/misc.c:985 #, c-format msgid "string is not a valid identifier: \"%s\"" msgstr "sträng är inte en giltig identifierare: \"%s\"" -#: utils/adt/misc.c:734 +#: utils/adt/misc.c:899 #, c-format msgid "String has unclosed double quotes." msgstr "Sträng har ej avslutade dubbla citattecken." -#: utils/adt/misc.c:748 +#: utils/adt/misc.c:913 #, c-format msgid "Quoted identifier must not be empty." msgstr "Citerad identifierare fÃ¥r inte vara tom." -#: utils/adt/misc.c:787 +#: utils/adt/misc.c:952 #, c-format msgid "No valid identifier before \".\"." msgstr "Ingen giltig indentifierare innan \".\"." -#: utils/adt/misc.c:793 +#: utils/adt/misc.c:958 #, c-format msgid "No valid identifier after \".\"." msgstr "Ingen giltig identifierare efter \".\"." -#: utils/adt/misc.c:853 +#: utils/adt/misc.c:1018 #, c-format msgid "log format \"%s\" is not supported" msgstr "loggformat \"%s\" stöds inte" -#: utils/adt/misc.c:854 +#: utils/adt/misc.c:1019 #, c-format msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." msgstr "Loggformat som stöds är \"stderr\", \"csvlog\" och \"jsonlog\"." -#: utils/adt/multirangetypes.c:149 utils/adt/multirangetypes.c:162 -#: utils/adt/multirangetypes.c:191 utils/adt/multirangetypes.c:261 -#: utils/adt/multirangetypes.c:285 +#: utils/adt/multirangetypes.c:150 utils/adt/multirangetypes.c:163 +#: utils/adt/multirangetypes.c:192 utils/adt/multirangetypes.c:266 +#: utils/adt/multirangetypes.c:290 #, c-format msgid "malformed multirange literal: \"%s\"" msgstr "trasig multirange-litteral: \"%s\"" -#: utils/adt/multirangetypes.c:151 +#: utils/adt/multirangetypes.c:152 #, c-format msgid "Missing left brace." msgstr "Saknar vänster krullparentes" -#: utils/adt/multirangetypes.c:193 +#: utils/adt/multirangetypes.c:194 #, c-format msgid "Expected range start." msgstr "Förväntade range-start" -#: utils/adt/multirangetypes.c:263 +#: utils/adt/multirangetypes.c:268 #, c-format msgid "Expected comma or end of multirange." msgstr "Oväntat komma eller slut pÃ¥ multirange." -#: utils/adt/multirangetypes.c:976 +#: utils/adt/multirangetypes.c:981 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "multiranges kan inte skapas frÃ¥n en multidimensionell array" -#: utils/adt/multirangetypes.c:1002 +#: utils/adt/multirangetypes.c:1007 #, c-format msgid "multirange values cannot contain null members" msgstr "multirange-värden kan inte innehÃ¥lla null-medlemmar" @@ -24834,779 +26411,876 @@ msgstr "kunde inte formattera \"cidr\"-värde: %m" msgid "cannot merge addresses from different families" msgstr "kan inte slÃ¥ samman adresser frÃ¥n olika familjer" -#: utils/adt/network.c:1901 +#: utils/adt/network.c:1893 #, c-format msgid "cannot AND inet values of different sizes" msgstr "kan inte AND:a inet-värden av olika storlek" -#: utils/adt/network.c:1933 +#: utils/adt/network.c:1925 #, c-format msgid "cannot OR inet values of different sizes" msgstr "kan inte OR:a inet-värden av olika storlek" -#: utils/adt/network.c:1994 utils/adt/network.c:2070 +#: utils/adt/network.c:1986 utils/adt/network.c:2062 #, c-format msgid "result is out of range" msgstr "resultatet är utanför giltigt intervall" -#: utils/adt/network.c:2035 +#: utils/adt/network.c:2027 #, c-format msgid "cannot subtract inet values of different sizes" msgstr "kan inte subtrahera inet-värden av olika storlek" -#: utils/adt/numeric.c:1027 +#: utils/adt/numeric.c:793 utils/adt/numeric.c:3659 utils/adt/numeric.c:7216 +#: utils/adt/numeric.c:7419 utils/adt/numeric.c:7891 utils/adt/numeric.c:10586 +#: utils/adt/numeric.c:11061 utils/adt/numeric.c:11155 +#: utils/adt/numeric.c:11290 +#, c-format +msgid "value overflows numeric format" +msgstr "overflow pÃ¥ värde i formatet numeric" + +#: utils/adt/numeric.c:1106 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "ogiltigt tecken i externt \"numric\"-värde" -#: utils/adt/numeric.c:1033 +#: utils/adt/numeric.c:1112 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "ogiltig skala i externt \"numeric\"-värde" -#: utils/adt/numeric.c:1042 +#: utils/adt/numeric.c:1121 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "felaktig siffra i externt numeriskt (\"numeric\") värde " -#: utils/adt/numeric.c:1257 utils/adt/numeric.c:1271 +#: utils/adt/numeric.c:1336 utils/adt/numeric.c:1350 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "Precisionen %d för NUMERIC mÃ¥ste vara mellan 1 och %d" -#: utils/adt/numeric.c:1262 +#: utils/adt/numeric.c:1341 #, c-format msgid "NUMERIC scale %d must be between %d and %d" msgstr "Skalan %d för NUMERIC mÃ¥ste vara mellan %d och %d" -#: utils/adt/numeric.c:1280 +#: utils/adt/numeric.c:1359 #, c-format msgid "invalid NUMERIC type modifier" msgstr "ogiltig typmodifierare för NUMERIC" -#: utils/adt/numeric.c:1638 +#: utils/adt/numeric.c:1725 #, c-format msgid "start value cannot be NaN" msgstr "startvärde fÃ¥r inte vara NaN" -#: utils/adt/numeric.c:1642 +#: utils/adt/numeric.c:1729 #, c-format msgid "start value cannot be infinity" msgstr "startvärde fÃ¥r inte vara oändligt" -#: utils/adt/numeric.c:1649 +#: utils/adt/numeric.c:1736 #, c-format msgid "stop value cannot be NaN" msgstr "stoppvärde fÃ¥r inte vara NaN" -#: utils/adt/numeric.c:1653 +#: utils/adt/numeric.c:1740 #, c-format msgid "stop value cannot be infinity" msgstr "stoppvärde fÃ¥r inte vara oändligt" -#: utils/adt/numeric.c:1666 +#: utils/adt/numeric.c:1753 #, c-format msgid "step size cannot be NaN" msgstr "stegstorlek fÃ¥r inte vara NaN" -#: utils/adt/numeric.c:1670 +#: utils/adt/numeric.c:1757 #, c-format msgid "step size cannot be infinity" msgstr "stegstorlek fÃ¥r inte vara oändligt" -#: utils/adt/numeric.c:3551 +#: utils/adt/numeric.c:3649 #, c-format msgid "factorial of a negative number is undefined" msgstr "fakultet av ett negativt tal är odefinierat" -#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6917 utils/adt/numeric.c:7432 -#: utils/adt/numeric.c:9956 utils/adt/numeric.c:10435 utils/adt/numeric.c:10561 -#: utils/adt/numeric.c:10634 +#: utils/adt/numeric.c:4256 #, c-format -msgid "value overflows numeric format" -msgstr "overflow pÃ¥ värde i formatet numeric" +msgid "lower bound cannot be NaN" +msgstr "undre gräns kan inte vara NaN" + +#: utils/adt/numeric.c:4260 +#, c-format +msgid "lower bound cannot be infinity" +msgstr "undre gräns kan inte vara oändlig" + +#: utils/adt/numeric.c:4267 +#, c-format +msgid "upper bound cannot be NaN" +msgstr "övre gräns kan inte vara NaN" + +#: utils/adt/numeric.c:4271 +#, c-format +msgid "upper bound cannot be infinity" +msgstr "övre gräns kan inte vara oändlig" -#: utils/adt/numeric.c:4243 utils/adt/numeric.c:4323 utils/adt/numeric.c:4364 -#: utils/adt/numeric.c:4558 +#: utils/adt/numeric.c:4432 utils/adt/numeric.c:4520 utils/adt/numeric.c:4580 +#: utils/adt/numeric.c:4776 #, c-format msgid "cannot convert NaN to %s" msgstr "kan inte konvertera NaN till %s" -#: utils/adt/numeric.c:4247 utils/adt/numeric.c:4327 utils/adt/numeric.c:4368 -#: utils/adt/numeric.c:4562 +#: utils/adt/numeric.c:4436 utils/adt/numeric.c:4524 utils/adt/numeric.c:4584 +#: utils/adt/numeric.c:4780 #, c-format msgid "cannot convert infinity to %s" msgstr "kan inte konvertera oändlighet till %s" -#: utils/adt/numeric.c:4571 +#: utils/adt/numeric.c:4789 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn är utanför giltigt intervall" -#: utils/adt/numeric.c:7519 utils/adt/numeric.c:7565 +#: utils/adt/numeric.c:7981 utils/adt/numeric.c:8032 #, c-format msgid "numeric field overflow" msgstr "overflow i numeric-fält" -#: utils/adt/numeric.c:7520 +#: utils/adt/numeric.c:7982 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "Ett fält med precision %d, skala %d mÃ¥ste avrundas till ett absolut värde mindre än %s%d." -#: utils/adt/numeric.c:7566 +#: utils/adt/numeric.c:8033 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "Ett fält med precision %d, skala %d kan inte innehÃ¥lla ett oändligt värde." -#: utils/adt/oid.c:293 +#: utils/adt/numeric.c:11359 utils/adt/pseudorandomfuncs.c:135 +#: utils/adt/pseudorandomfuncs.c:159 +#, c-format +msgid "lower bound must be less than or equal to upper bound" +msgstr "undre gräns mÃ¥ste vara mindre eller lika med övre gräns" + +#: utils/adt/oid.c:217 #, c-format msgid "invalid oidvector data" msgstr "ogiltig oidvector-data" -#: utils/adt/oracle_compat.c:973 +#: utils/adt/oracle_compat.c:976 #, c-format msgid "requested character too large" msgstr "efterfrÃ¥gat tecken är för stort" -#: utils/adt/oracle_compat.c:1017 +#: utils/adt/oracle_compat.c:1020 #, c-format msgid "character number must be positive" msgstr "teckennummmer mÃ¥ste vara positivt" -#: utils/adt/oracle_compat.c:1021 +#: utils/adt/oracle_compat.c:1024 #, c-format msgid "null character not permitted" msgstr "nolltecken tillÃ¥ts inte" -#: utils/adt/oracle_compat.c:1039 utils/adt/oracle_compat.c:1092 +#: utils/adt/oracle_compat.c:1042 utils/adt/oracle_compat.c:1095 #, c-format msgid "requested character too large for encoding: %u" msgstr "efterfrÃ¥gat tecken är för stort för kodning: %u" -#: utils/adt/oracle_compat.c:1080 +#: utils/adt/oracle_compat.c:1083 #, c-format msgid "requested character not valid for encoding: %u" msgstr "efterfrÃ¥gat tecken är inte giltigt för kodning: %u" -#: utils/adt/orderedsetaggs.c:448 utils/adt/orderedsetaggs.c:552 -#: utils/adt/orderedsetaggs.c:690 +#: utils/adt/orderedsetaggs.c:446 utils/adt/orderedsetaggs.c:551 +#: utils/adt/orderedsetaggs.c:691 #, c-format msgid "percentile value %g is not between 0 and 1" msgstr "percentil-värde %g är inte mellan 0 och 1" -#: utils/adt/pg_locale.c:1228 +#: utils/adt/pg_locale.c:326 utils/adt/pg_locale.c:358 #, c-format -msgid "Apply system library package updates." -msgstr "Applicera paketuppdateringar för systembibliotek." +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "lokalnamn \"%s\" innehÃ¥ller tecken som ej är ASCII" -#: utils/adt/pg_locale.c:1452 utils/adt/pg_locale.c:1700 -#: utils/adt/pg_locale.c:1979 utils/adt/pg_locale.c:2001 +#: utils/adt/pg_locale.c:1507 #, c-format -msgid "could not open collator for locale \"%s\": %s" -msgstr "kunde inte öppna jämförelse för lokal \"%s\": %s" +msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" +msgstr "kunde inte öppna jämförelse för lokal \"%s\" med regler \"%s\": %s" -#: utils/adt/pg_locale.c:1465 utils/adt/pg_locale.c:2010 +#: utils/adt/pg_locale.c:1518 utils/adt/pg_locale.c:2992 +#: utils/adt/pg_locale.c:3065 #, c-format msgid "ICU is not supported in this build" msgstr "ICU stöds inte av detta bygge" -#: utils/adt/pg_locale.c:1494 +#: utils/adt/pg_locale.c:1546 #, c-format msgid "could not create locale \"%s\": %m" msgstr "kunde inte skapa locale \"%s\": %m" -#: utils/adt/pg_locale.c:1497 +#: utils/adt/pg_locale.c:1549 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "Operativsystemet kunde inte hitta nÃ¥gon lokaldata för lokalnamnet \"%s\"." -#: utils/adt/pg_locale.c:1605 +#: utils/adt/pg_locale.c:1670 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "jämförelser (collations) med olika collate- och ctype-värden stöds inte pÃ¥ denna plattform" -#: utils/adt/pg_locale.c:1614 -#, c-format -msgid "collation provider LIBC is not supported on this platform" -msgstr "leverantören LIBC för jämförelse (collation) stöds inte pÃ¥ denna plattform" - -#: utils/adt/pg_locale.c:1649 +#: utils/adt/pg_locale.c:1717 #, c-format msgid "collation \"%s\" has no actual version, but a version was recorded" msgstr "jämförelse (collation) \"%s\" har ingen version men en version har lagrats" -#: utils/adt/pg_locale.c:1655 +#: utils/adt/pg_locale.c:1723 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "jämförelse (collation) \"%s\" har en version som inte matchar" -#: utils/adt/pg_locale.c:1657 +#: utils/adt/pg_locale.c:1725 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "Jämförelsen (collation) i databasen har skapats med version %s men operativsystemet har version %s." -#: utils/adt/pg_locale.c:1660 +#: utils/adt/pg_locale.c:1728 #, c-format msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgstr "Bygg om alla objekt som pÃ¥verkas av denna jämförelse (collation) och kör ALTER COLLATION %s REFRESH VERSION eller bygg PostgreSQL med rätt bibliotekversion." -#: utils/adt/pg_locale.c:1731 +#: utils/adt/pg_locale.c:1772 utils/adt/pg_locale.c:2556 +#: utils/adt/pg_locale.c:2581 +#, c-format +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "ogiltigt lokalnamn \"%s\" för inbyggd leverantör" + +#: utils/adt/pg_locale.c:1814 #, c-format msgid "could not load locale \"%s\"" msgstr "kunde inte skapa locale \"%s\"" -#: utils/adt/pg_locale.c:1756 +#: utils/adt/pg_locale.c:1839 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "kunde inte hitta jämförelseversion (collation) för lokal \"%s\": felkod %lu" -#: utils/adt/pg_locale.c:1794 +#: utils/adt/pg_locale.c:1895 utils/adt/pg_locale.c:1908 +#, c-format +msgid "could not convert string to UTF-16: error code %lu" +msgstr "kunde inte konvertera sträng till UTF-16: felkod %lu" + +#: utils/adt/pg_locale.c:1920 +#, c-format +msgid "could not compare Unicode strings: %m" +msgstr "kunde inte jämföra Unicode-strängar: %m" + +#: utils/adt/pg_locale.c:2094 +#, c-format +msgid "collation failed: %s" +msgstr "jämförelse misslyckades: %s" + +#: utils/adt/pg_locale.c:2313 utils/adt/pg_locale.c:2345 +#, c-format +msgid "sort key generation failed: %s" +msgstr "generering av sorteringsnyckel misslyckades: %s" + +#: utils/adt/pg_locale.c:2635 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "kunde inte härleda sprÃ¥k frÃ¥n lokalen \"%s\": %s" + +#: utils/adt/pg_locale.c:2656 utils/adt/pg_locale.c:2672 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "kunde inte öppna jämförelse för lokal \"%s\": %s" + +#: utils/adt/pg_locale.c:2697 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "kodning \"%s\" stöds inte av ICU" -#: utils/adt/pg_locale.c:1801 +#: utils/adt/pg_locale.c:2704 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "kunde inte öppna ICU-konverterare för kodning \"%s\": %s" -#: utils/adt/pg_locale.c:1832 utils/adt/pg_locale.c:1841 -#: utils/adt/pg_locale.c:1870 utils/adt/pg_locale.c:1880 +#: utils/adt/pg_locale.c:2722 utils/adt/pg_locale.c:2741 +#: utils/adt/pg_locale.c:2797 utils/adt/pg_locale.c:2808 #, c-format msgid "%s failed: %s" msgstr "%s misslyckades: %s" -#: utils/adt/pg_locale.c:2179 +#: utils/adt/pg_locale.c:2983 +#, c-format +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "kunde inte konvertera lokalnamn \"%s\" till sprÃ¥ktagg: %s" + +#: utils/adt/pg_locale.c:3024 +#, c-format +msgid "could not get language from ICU locale \"%s\": %s" +msgstr "kunde inte härleda sprÃ¥k frÃ¥n ICU-lokalen \"%s\": %s" + +#: utils/adt/pg_locale.c:3026 utils/adt/pg_locale.c:3055 +#, c-format +msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." +msgstr "För att stänga av validering av ICU-lokal, sätt parameter \"%s\" till \"%s\"" + +#: utils/adt/pg_locale.c:3053 +#, c-format +msgid "ICU locale \"%s\" has unknown language \"%s\"" +msgstr "ICU-lokalen \"%s\" har ett okänt sprÃ¥k \"%s\"" + +#: utils/adt/pg_locale.c:3204 #, c-format msgid "invalid multibyte character for locale" msgstr "ogiltigt multibyte-tecken för lokalen" -#: utils/adt/pg_locale.c:2180 +#: utils/adt/pg_locale.c:3205 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "Serverns LC_CTYPE-lokal är troligen inkompatibel med databasens teckenkodning." -#: utils/adt/pg_lsn.c:263 +#: utils/adt/pg_lsn.c:262 #, c-format msgid "cannot add NaN to pg_lsn" msgstr "kan inte addera NaN till pg_lsn" -#: utils/adt/pg_lsn.c:297 +#: utils/adt/pg_lsn.c:296 #, c-format msgid "cannot subtract NaN from pg_lsn" msgstr "kan inte subtrahera Nan frÃ¥n pg_lsn" -#: utils/adt/pg_upgrade_support.c:29 +#: utils/adt/pg_upgrade_support.c:39 #, c-format msgid "function can only be called when server is in binary upgrade mode" msgstr "funktionen kan bara anropas när servern är i binärt uppgraderingsläge" -#: utils/adt/pgstatfuncs.c:482 +#: utils/adt/pgstatfuncs.c:252 #, c-format msgid "invalid command name: \"%s\"" msgstr "ogiltigt kommandonamn: \"%s\"" -#: utils/adt/pgstatfuncs.c:2114 +#: utils/adt/pgstatfuncs.c:1739 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "okänt Ã¥terställningsmÃ¥l \"%s\"" -#: utils/adt/pgstatfuncs.c:2115 +#: utils/adt/pgstatfuncs.c:1740 #, c-format -msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." -msgstr "MÃ¥let mÃ¥ste vara \"archiver\", \"bgwriter\", \"recovery_prefetch\" eller \"wal\"." +msgid "Target must be \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"recovery_prefetch\", \"slru\", or \"wal\"." +msgstr "MÃ¥let mÃ¥ste vara \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"recovery_prefetch\", \"slru\" eller \"wal\"." -#: utils/adt/pgstatfuncs.c:2193 +#: utils/adt/pgstatfuncs.c:1822 #, c-format msgid "invalid subscription OID %u" msgstr "ogiltigt prenumerations-OID: %u" -#: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 +#: utils/adt/pseudorandomfuncs.c:69 +#, c-format +msgid "setseed parameter %g is out of allowed range [-1,1]" +msgstr "setseed-parameter %g är utanför giltigt intervall [-1,1]" + +#: utils/adt/pseudotypes.c:55 utils/adt/pseudotypes.c:89 #, c-format msgid "cannot display a value of type %s" msgstr "kan inte visa ett värde av typ %s" -#: utils/adt/pseudotypes.c:321 +#: utils/adt/pseudotypes.c:307 #, c-format msgid "cannot accept a value of a shell type" msgstr "kan inte acceptera ett värde av typen shell" -#: utils/adt/pseudotypes.c:331 +#: utils/adt/pseudotypes.c:317 #, c-format msgid "cannot display a value of a shell type" msgstr "kan inte visa ett värde av typen shell" -#: utils/adt/rangetypes.c:404 +#: utils/adt/rangetypes.c:422 #, c-format msgid "range constructor flags argument must not be null" msgstr "konstruktorflaggargument till range fÃ¥r inte vara null" -#: utils/adt/rangetypes.c:1003 +#: utils/adt/rangetypes.c:1021 #, c-format msgid "result of range difference would not be contiguous" msgstr "resultatet av range-skillnad skulle inte vara angränsande" -#: utils/adt/rangetypes.c:1064 +#: utils/adt/rangetypes.c:1082 #, c-format msgid "result of range union would not be contiguous" msgstr "resultatet av range-union skulle inte vara angränsande" -#: utils/adt/rangetypes.c:1689 +#: utils/adt/rangetypes.c:1757 #, c-format msgid "range lower bound must be less than or equal to range upper bound" -msgstr "lägre gräns för range mÃ¥ste vara lägre eller lika med övre gräns för range" +msgstr "undre gräns för range mÃ¥ste vara lägre eller lika med övre gräns för range" -#: utils/adt/rangetypes.c:2112 utils/adt/rangetypes.c:2125 -#: utils/adt/rangetypes.c:2139 +#: utils/adt/rangetypes.c:2256 utils/adt/rangetypes.c:2269 +#: utils/adt/rangetypes.c:2283 #, c-format msgid "invalid range bound flags" msgstr "ogiltig gränsflagga för range" -#: utils/adt/rangetypes.c:2113 utils/adt/rangetypes.c:2126 -#: utils/adt/rangetypes.c:2140 +#: utils/adt/rangetypes.c:2257 utils/adt/rangetypes.c:2270 +#: utils/adt/rangetypes.c:2284 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "Giltiga värden är \"[]\", \"[)\", \"(]\" och \"()\"." -#: utils/adt/rangetypes.c:2205 utils/adt/rangetypes.c:2222 -#: utils/adt/rangetypes.c:2235 utils/adt/rangetypes.c:2253 -#: utils/adt/rangetypes.c:2264 utils/adt/rangetypes.c:2308 -#: utils/adt/rangetypes.c:2316 +#: utils/adt/rangetypes.c:2352 utils/adt/rangetypes.c:2369 +#: utils/adt/rangetypes.c:2384 utils/adt/rangetypes.c:2404 +#: utils/adt/rangetypes.c:2415 utils/adt/rangetypes.c:2462 +#: utils/adt/rangetypes.c:2470 #, c-format msgid "malformed range literal: \"%s\"" msgstr "trasig range-litteral: \"%s\"" -#: utils/adt/rangetypes.c:2207 +#: utils/adt/rangetypes.c:2354 #, c-format msgid "Junk after \"empty\" key word." msgstr "Skräp efter nyckelordet \"empty\"." -#: utils/adt/rangetypes.c:2224 +#: utils/adt/rangetypes.c:2371 #, c-format msgid "Missing left parenthesis or bracket." msgstr "Saknar vänster parentes eller hakparentes." -#: utils/adt/rangetypes.c:2237 +#: utils/adt/rangetypes.c:2386 #, c-format msgid "Missing comma after lower bound." -msgstr "Saknar komma efter lägre gräns." +msgstr "Saknar komma efter undre gräns." -#: utils/adt/rangetypes.c:2255 +#: utils/adt/rangetypes.c:2406 #, c-format msgid "Too many commas." msgstr "För mÃ¥nga komman." -#: utils/adt/rangetypes.c:2266 +#: utils/adt/rangetypes.c:2417 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "Skräp efter höger parentes eller hakparentes." -#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4528 +#: utils/adt/regexp.c:304 utils/adt/regexp.c:1996 utils/adt/varlena.c:4273 #, c-format msgid "regular expression failed: %s" msgstr "reguljärt uttryck misslyckades: %s" -#: utils/adt/regexp.c:431 utils/adt/regexp.c:666 +#: utils/adt/regexp.c:445 utils/adt/regexp.c:680 #, c-format msgid "invalid regular expression option: \"%.*s\"" msgstr "ogiltigt flagga till reguljärt uttryck: \"%.*s\"" -#: utils/adt/regexp.c:668 +#: utils/adt/regexp.c:682 #, c-format msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." msgstr "Om du menade att använda regexp_replace() med en startstartparameter sÃ¥ cast:a fjärde argumentet uttryckligen till integer." -#: utils/adt/regexp.c:702 utils/adt/regexp.c:711 utils/adt/regexp.c:1068 -#: utils/adt/regexp.c:1132 utils/adt/regexp.c:1141 utils/adt/regexp.c:1150 -#: utils/adt/regexp.c:1159 utils/adt/regexp.c:1839 utils/adt/regexp.c:1848 -#: utils/adt/regexp.c:1857 utils/misc/guc.c:11859 utils/misc/guc.c:11893 +#: utils/adt/regexp.c:716 utils/adt/regexp.c:725 utils/adt/regexp.c:1082 +#: utils/adt/regexp.c:1146 utils/adt/regexp.c:1155 utils/adt/regexp.c:1164 +#: utils/adt/regexp.c:1173 utils/adt/regexp.c:1853 utils/adt/regexp.c:1862 +#: utils/adt/regexp.c:1871 utils/misc/guc.c:6820 utils/misc/guc.c:6854 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "ogiltigt värde för parameter \"%s\": %d" -#: utils/adt/regexp.c:922 +#: utils/adt/regexp.c:936 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "Regulart uttryck i SQL fÃ¥r inte innehÃ¥lla mer än tvÃ¥ dubbelcitat-escape-separatorer" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:1079 utils/adt/regexp.c:1170 utils/adt/regexp.c:1257 -#: utils/adt/regexp.c:1296 utils/adt/regexp.c:1684 utils/adt/regexp.c:1739 -#: utils/adt/regexp.c:1868 +#: utils/adt/regexp.c:1093 utils/adt/regexp.c:1184 utils/adt/regexp.c:1271 +#: utils/adt/regexp.c:1310 utils/adt/regexp.c:1698 utils/adt/regexp.c:1753 +#: utils/adt/regexp.c:1882 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s stöder inte \"global\"-flaggan" -#: utils/adt/regexp.c:1298 +#: utils/adt/regexp.c:1312 #, c-format msgid "Use the regexp_matches function instead." msgstr "Använd regexp_matches-funktionen istället." -#: utils/adt/regexp.c:1486 +#: utils/adt/regexp.c:1500 #, c-format msgid "too many regular expression matches" msgstr "för mÃ¥nga reguljära uttryck matchar" -#: utils/adt/regproc.c:105 +#: utils/adt/regproc.c:104 #, c-format msgid "more than one function named \"%s\"" msgstr "mer än en funktion med namn %s" -#: utils/adt/regproc.c:543 +#: utils/adt/regproc.c:513 #, c-format msgid "more than one operator named %s" msgstr "mer än en operator med namn %s" -#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 -#: utils/adt/ruleutils.c:9872 utils/adt/ruleutils.c:10041 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10509 +#: utils/adt/ruleutils.c:10722 #, c-format msgid "too many arguments" msgstr "för mÃ¥nga argument" -#: utils/adt/regproc.c:716 utils/adt/regproc.c:757 +#: utils/adt/regproc.c:676 #, c-format msgid "Provide two argument types for operator." msgstr "Ange tvÃ¥ argumenttyper för operatorn." -#: utils/adt/regproc.c:1639 utils/adt/regproc.c:1663 utils/adt/regproc.c:1764 -#: utils/adt/regproc.c:1788 utils/adt/regproc.c:1890 utils/adt/regproc.c:1895 -#: utils/adt/varlena.c:3667 utils/adt/varlena.c:3672 +#: utils/adt/regproc.c:1564 utils/adt/regproc.c:1681 utils/adt/regproc.c:1810 +#: utils/adt/regproc.c:1815 utils/adt/varlena.c:3413 utils/adt/varlena.c:3418 #, c-format msgid "invalid name syntax" msgstr "ogiltig namnsyntax" -#: utils/adt/regproc.c:1953 +#: utils/adt/regproc.c:1924 #, c-format msgid "expected a left parenthesis" msgstr "förväntade en vänsterparentes" -#: utils/adt/regproc.c:1969 +#: utils/adt/regproc.c:1942 #, c-format msgid "expected a right parenthesis" msgstr "förväntade en högreparentes" -#: utils/adt/regproc.c:1988 +#: utils/adt/regproc.c:1961 #, c-format msgid "expected a type name" msgstr "förväntade ett typnamn" -#: utils/adt/regproc.c:2020 +#: utils/adt/regproc.c:1993 #, c-format msgid "improper type name" msgstr "olämpligt typnamn" -#: utils/adt/ri_triggers.c:307 utils/adt/ri_triggers.c:1611 -#: utils/adt/ri_triggers.c:2598 +#: utils/adt/ri_triggers.c:303 utils/adt/ri_triggers.c:1616 +#: utils/adt/ri_triggers.c:2601 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "insert eller update pÃ¥ tabell \"%s\" bryter mot främmande nyckel-villkoret \"%s\"" -#: utils/adt/ri_triggers.c:310 utils/adt/ri_triggers.c:1614 +#: utils/adt/ri_triggers.c:306 utils/adt/ri_triggers.c:1619 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MATCH FULL tillÃ¥ter inte att man blandar null och icke-null-värden." -#: utils/adt/ri_triggers.c:2031 +#: utils/adt/ri_triggers.c:2036 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "funktionen \"%s\" mÃ¥ste köras för INSERT" -#: utils/adt/ri_triggers.c:2037 +#: utils/adt/ri_triggers.c:2042 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "funktionen \"%s\" mÃ¥ste köras för UPDATE" -#: utils/adt/ri_triggers.c:2043 +#: utils/adt/ri_triggers.c:2048 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "funktionen \"%s\" mÃ¥ste köras för DELETE" -#: utils/adt/ri_triggers.c:2066 +#: utils/adt/ri_triggers.c:2071 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "ingen pg_constraint-post för trigger \"%s\" pÃ¥ tabell \"%s\"" -#: utils/adt/ri_triggers.c:2068 +#: utils/adt/ri_triggers.c:2073 #, c-format msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." msgstr "Ta bort denna trigger för referensiell integritet och dess kollegor, gör sen ALTER TABLE ADD CONSTRAINT." -#: utils/adt/ri_triggers.c:2423 +#: utils/adt/ri_triggers.c:2426 #, c-format msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" msgstr "referentiell integritetsfrÃ¥ga pÃ¥ \"%s\" frÃ¥n villkor \"%s\" pÃ¥ \"%s\" gav oväntat resultat" -#: utils/adt/ri_triggers.c:2427 +#: utils/adt/ri_triggers.c:2430 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "Detta beror troligen pÃ¥ att en regel har skrivit om frÃ¥gan." -#: utils/adt/ri_triggers.c:2588 +#: utils/adt/ri_triggers.c:2591 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "borttagning av partition \"%s\" bryter mot främmande nyckel-villkoret \"%s\"" -#: utils/adt/ri_triggers.c:2591 utils/adt/ri_triggers.c:2616 +#: utils/adt/ri_triggers.c:2594 utils/adt/ri_triggers.c:2619 #, c-format msgid "Key (%s)=(%s) is still referenced from table \"%s\"." msgstr "Nyckeln (%s)=(%s) refereras fortfarande till frÃ¥n tabell \"%s\"." -#: utils/adt/ri_triggers.c:2602 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "Nyckel (%s)=(%s) finns inte i tabellen \"%s\"." -#: utils/adt/ri_triggers.c:2605 +#: utils/adt/ri_triggers.c:2608 #, c-format msgid "Key is not present in table \"%s\"." msgstr "Nyckeln finns inte i tabellen \"%s\"." -#: utils/adt/ri_triggers.c:2611 +#: utils/adt/ri_triggers.c:2614 #, c-format msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" msgstr "update eller delete pÃ¥ tabell \"%s\" bryter mot främmande nyckel-villkoret \"%s\" för tabell \"%s\"" -#: utils/adt/ri_triggers.c:2619 +#: utils/adt/ri_triggers.c:2622 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "Nyckel refereras fortfarande till frÃ¥n tabell \"%s\"." -#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:483 +#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:509 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "inläsning av annonym composite-typ är inte implementerat" -#: utils/adt/rowtypes.c:157 utils/adt/rowtypes.c:186 utils/adt/rowtypes.c:209 -#: utils/adt/rowtypes.c:217 utils/adt/rowtypes.c:269 utils/adt/rowtypes.c:277 +#: utils/adt/rowtypes.c:158 utils/adt/rowtypes.c:190 utils/adt/rowtypes.c:216 +#: utils/adt/rowtypes.c:227 utils/adt/rowtypes.c:285 utils/adt/rowtypes.c:296 #, c-format msgid "malformed record literal: \"%s\"" msgstr "felaktig postliteral: \"%s\"" -#: utils/adt/rowtypes.c:158 +#: utils/adt/rowtypes.c:159 #, c-format msgid "Missing left parenthesis." msgstr "Saknar vänster parentes" -#: utils/adt/rowtypes.c:187 +#: utils/adt/rowtypes.c:191 #, c-format msgid "Too few columns." msgstr "För fÃ¥ kolumner." -#: utils/adt/rowtypes.c:270 +#: utils/adt/rowtypes.c:286 #, c-format msgid "Too many columns." msgstr "För mÃ¥nga kolumner." -#: utils/adt/rowtypes.c:278 +#: utils/adt/rowtypes.c:297 #, c-format msgid "Junk after right parenthesis." msgstr "Skräp efter höger parentes" -#: utils/adt/rowtypes.c:532 +#: utils/adt/rowtypes.c:558 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "fel antal kolumner: %d, förväntade %d" -#: utils/adt/rowtypes.c:574 +#: utils/adt/rowtypes.c:599 #, c-format msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" msgstr "binär data har typ %u (%s) istället för förväntad %u (%s) i postkolumn %d" -#: utils/adt/rowtypes.c:641 +#: utils/adt/rowtypes.c:660 #, c-format msgid "improper binary format in record column %d" msgstr "felaktigt binärt format i postkolumn %d" -#: utils/adt/rowtypes.c:932 utils/adt/rowtypes.c:1178 utils/adt/rowtypes.c:1436 -#: utils/adt/rowtypes.c:1682 +#: utils/adt/rowtypes.c:949 utils/adt/rowtypes.c:1195 utils/adt/rowtypes.c:1453 +#: utils/adt/rowtypes.c:1699 #, c-format msgid "cannot compare dissimilar column types %s and %s at record column %d" msgstr "kan inte jämföra olika kolumntyper %s och %s vid postkolumn %d" -#: utils/adt/rowtypes.c:1023 utils/adt/rowtypes.c:1248 -#: utils/adt/rowtypes.c:1533 utils/adt/rowtypes.c:1718 +#: utils/adt/rowtypes.c:1040 utils/adt/rowtypes.c:1265 +#: utils/adt/rowtypes.c:1550 utils/adt/rowtypes.c:1735 #, c-format msgid "cannot compare record types with different numbers of columns" msgstr "kan inte jämföra record-typer med olika antal kolumner" -#: utils/adt/ruleutils.c:2705 +#: utils/adt/ruleutils.c:2694 #, c-format msgid "input is a query, not an expression" msgstr "indata är en frÃ¥ga, inte ett uttryck" -#: utils/adt/ruleutils.c:2717 +#: utils/adt/ruleutils.c:2706 #, c-format msgid "expression contains variables of more than one relation" msgstr "uttryck innehÃ¥ller variabler till mer än en relation" -#: utils/adt/ruleutils.c:2724 +#: utils/adt/ruleutils.c:2713 #, c-format msgid "expression contains variables" msgstr "uttryck innehÃ¥ller variabler" -#: utils/adt/ruleutils.c:5247 +#: utils/adt/ruleutils.c:5246 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "regel \"%s\" har en icke stödd händelsetyp %d" -#: utils/adt/timestamp.c:110 +#: utils/adt/timestamp.c:128 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "prceision för TIMESTAMP(%d)%s kan inte vara negativ" -#: utils/adt/timestamp.c:116 +#: utils/adt/timestamp.c:134 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "precision för TIMESTAMP(%d)%s reducerad till högsta tillÃ¥tna, %d" -#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12883 -#, c-format -msgid "timestamp out of range: \"%s\"" -msgstr "timestamp utanför giltigt intervall: \"%s\"" - -#: utils/adt/timestamp.c:375 +#: utils/adt/timestamp.c:394 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "timestamp(%d)-precision mÃ¥ste vara mellan %d och %d" -#: utils/adt/timestamp.c:499 +#: utils/adt/timestamp.c:512 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "Numeriska tidszoner mÃ¥ste ha \"-\" eller \"+\" som sitt första tecken." -#: utils/adt/timestamp.c:512 +#: utils/adt/timestamp.c:524 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "numerisk tidszon \"%s\" utanför giltigt intervall" -#: utils/adt/timestamp.c:608 utils/adt/timestamp.c:618 -#: utils/adt/timestamp.c:626 +#: utils/adt/timestamp.c:625 utils/adt/timestamp.c:635 +#: utils/adt/timestamp.c:643 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "timestamp utanför giltigt intervall: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:727 +#: utils/adt/timestamp.c:744 #, c-format msgid "timestamp cannot be NaN" msgstr "timestamp kan inte vara NaN" -#: utils/adt/timestamp.c:745 utils/adt/timestamp.c:757 +#: utils/adt/timestamp.c:762 utils/adt/timestamp.c:774 #, c-format msgid "timestamp out of range: \"%g\"" msgstr "timestamp utanför giltigt intervall: \"%g\"" -#: utils/adt/timestamp.c:1062 utils/adt/timestamp.c:1095 +#: utils/adt/timestamp.c:957 utils/adt/timestamp.c:1516 +#: utils/adt/timestamp.c:1526 utils/adt/timestamp.c:1587 +#: utils/adt/timestamp.c:2807 utils/adt/timestamp.c:2816 +#: utils/adt/timestamp.c:2831 utils/adt/timestamp.c:2905 +#: utils/adt/timestamp.c:2922 utils/adt/timestamp.c:2979 +#: utils/adt/timestamp.c:3022 utils/adt/timestamp.c:3400 +#: utils/adt/timestamp.c:3458 utils/adt/timestamp.c:3481 +#: utils/adt/timestamp.c:3490 utils/adt/timestamp.c:3514 +#: utils/adt/timestamp.c:3537 utils/adt/timestamp.c:3546 +#: utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3782 +#: utils/adt/timestamp.c:4189 utils/adt/timestamp.c:4226 +#: utils/adt/timestamp.c:4274 utils/adt/timestamp.c:4283 +#: utils/adt/timestamp.c:4375 utils/adt/timestamp.c:4422 +#: utils/adt/timestamp.c:4431 utils/adt/timestamp.c:4527 +#: utils/adt/timestamp.c:4580 utils/adt/timestamp.c:4590 +#: utils/adt/timestamp.c:4785 utils/adt/timestamp.c:4795 +#: utils/adt/timestamp.c:5097 +#, c-format +msgid "interval out of range" +msgstr "interval utanför giltigt intervall" + +#: utils/adt/timestamp.c:1094 utils/adt/timestamp.c:1127 #, c-format msgid "invalid INTERVAL type modifier" msgstr "ogitligt modifierare för typen INTERVAL" -#: utils/adt/timestamp.c:1078 +#: utils/adt/timestamp.c:1110 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d)-precision kan inte vara negativ" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1116 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d)-precision reducerad till maximalt tillÃ¥tna, %d" -#: utils/adt/timestamp.c:1466 +#: utils/adt/timestamp.c:1506 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "interval(%d)-precision mÃ¥ste vara mellan %d och %d" -#: utils/adt/timestamp.c:2689 -#, c-format -msgid "cannot subtract infinite timestamps" -msgstr "kan inte subtrahera oändliga tider (timestamp)" - -#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:4074 +#: utils/adt/timestamp.c:4564 utils/adt/timestamp.c:4769 #, c-format msgid "origin out of range" msgstr "origin utanför giltigt intervall" -#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:4079 +#: utils/adt/timestamp.c:4569 utils/adt/timestamp.c:4774 +#, c-format +msgid "timestamps cannot be binned into infinite intervals" +msgstr "timestamps kan inte injusteras in i oändliga intervall" + +#: utils/adt/timestamp.c:4574 utils/adt/timestamp.c:4779 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "timestamps kan inte injusteras in i intervall som innehÃ¥ller mÃ¥nader eller Ã¥r" -#: utils/adt/timestamp.c:3903 utils/adt/timestamp.c:4086 +#: utils/adt/timestamp.c:4585 utils/adt/timestamp.c:4790 #, c-format msgid "stride must be greater than zero" msgstr "\"stride\" mÃ¥ste vara större än noll" -#: utils/adt/timestamp.c:4399 +#: utils/adt/timestamp.c:5091 #, c-format msgid "Months usually have fractional weeks." msgstr "MÃ¥nader har vanligtvis veckor som decimaltal." -#: utils/adt/trigfuncs.c:42 +#: utils/adt/timestamp.c:6551 utils/adt/timestamp.c:6637 +#, c-format +msgid "step size cannot be infinite" +msgstr "stegstorlek fÃ¥r inte vara oändlig" + +#: utils/adt/trigfuncs.c:41 #, c-format msgid "suppress_redundant_updates_trigger: must be called as trigger" msgstr "suppress_redundant_updates_trigger: mÃ¥ste anropas som trigger" -#: utils/adt/trigfuncs.c:48 +#: utils/adt/trigfuncs.c:47 #, c-format msgid "suppress_redundant_updates_trigger: must be called on update" msgstr "suppress_redundant_updates_trigger: mÃ¥ste anropas vid update" -#: utils/adt/trigfuncs.c:54 +#: utils/adt/trigfuncs.c:53 #, c-format msgid "suppress_redundant_updates_trigger: must be called before update" msgstr "suppress_redundant_updates_trigger: mÃ¥ste anropas innan update" -#: utils/adt/trigfuncs.c:60 +#: utils/adt/trigfuncs.c:59 #, c-format msgid "suppress_redundant_updates_trigger: must be called for each row" msgstr "suppress_redundant_updates_trigger: mÃ¥ste anropas för varje rad" -#: utils/adt/tsgistidx.c:92 -#, c-format -msgid "gtsvector_in not implemented" -msgstr "gtsvector_in är inte implementerad" - -#: utils/adt/tsquery.c:199 utils/adt/tsquery_op.c:124 +#: utils/adt/tsquery.c:210 utils/adt/tsquery_op.c:125 #, c-format msgid "distance in phrase operator must be an integer value between zero and %d inclusive" msgstr "distans i frasoperator mÃ¥ste vara ett heltalsvärde mellan noll och %d, inklusive" -#: utils/adt/tsquery.c:306 utils/adt/tsquery.c:691 -#: utils/adt/tsvector_parser.c:133 -#, c-format -msgid "syntax error in tsquery: \"%s\"" -msgstr "syntaxfel i tsquery: \"%s\"" - -#: utils/adt/tsquery.c:330 +#: utils/adt/tsquery.c:344 #, c-format msgid "no operand in tsquery: \"%s\"" msgstr "ingen operand i tsquery: \"%s\"" -#: utils/adt/tsquery.c:534 +#: utils/adt/tsquery.c:554 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "värdet är för stort i tsquery: \"%s\"" -#: utils/adt/tsquery.c:539 +#: utils/adt/tsquery.c:559 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "operanden är för lÃ¥ng i tsquery: \"%s\"" -#: utils/adt/tsquery.c:567 +#: utils/adt/tsquery.c:587 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "ord för lÃ¥ngt i tsquery: \"%s\"" -#: utils/adt/tsquery.c:835 +#: utils/adt/tsquery.c:713 utils/adt/tsvector_parser.c:147 +#, c-format +msgid "syntax error in tsquery: \"%s\"" +msgstr "syntaxfel i tsquery: \"%s\"" + +#: utils/adt/tsquery.c:879 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" msgstr "textsökfrÃ¥ga innehÃ¥ller inte lexem: \"%s\"" -#: utils/adt/tsquery.c:846 utils/adt/tsquery_util.c:375 +#: utils/adt/tsquery.c:890 utils/adt/tsquery_util.c:376 #, c-format msgid "tsquery is too large" msgstr "tsquery är för stor" -#: utils/adt/tsquery_cleanup.c:407 +#: utils/adt/tsquery_cleanup.c:409 #, c-format msgid "text-search query contains only stop words or doesn't contain lexemes, ignored" msgstr "textsökfrÃ¥ga innehÃ¥ller bara stoppord eller innehÃ¥ller inga lexem, hoppar över" @@ -25636,12 +27310,12 @@ msgstr "array med vikter fÃ¥r inte innehÃ¥lla null-värden" msgid "weight out of range" msgstr "vikten är utanför giltigt intervall" -#: utils/adt/tsvector.c:215 +#: utils/adt/tsvector.c:216 #, c-format msgid "word is too long (%ld bytes, max %ld bytes)" msgstr "ordet är för lÃ¥ngt (%ld byte, max %ld byte)" -#: utils/adt/tsvector.c:222 +#: utils/adt/tsvector.c:223 #, c-format msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "strängen är för lÃ¥ng för tsvector (%ld byte, max %ld byte)" @@ -25656,72 +27330,72 @@ msgstr "lexem-array:en fÃ¥r inte innehÃ¥lla null-värden" msgid "lexeme array may not contain empty strings" msgstr "lexem-array:en fÃ¥r inte innehÃ¥lla tomma strängar" -#: utils/adt/tsvector_op.c:846 +#: utils/adt/tsvector_op.c:845 #, c-format msgid "weight array may not contain nulls" msgstr "vikt-array:en fÃ¥r inte innehÃ¥lla null-värden" -#: utils/adt/tsvector_op.c:870 +#: utils/adt/tsvector_op.c:869 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "okänd vikt: \"%c\"" -#: utils/adt/tsvector_op.c:2434 +#: utils/adt/tsvector_op.c:2599 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "ts_stat-frÃ¥gan mÃ¥ste returnera en tsvector-kolumn" -#: utils/adt/tsvector_op.c:2623 +#: utils/adt/tsvector_op.c:2788 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "tsvector-kolumnen \"%s\" existerar inte" -#: utils/adt/tsvector_op.c:2630 +#: utils/adt/tsvector_op.c:2795 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "kolumnen \"%s\" är inte av typen tsvector" -#: utils/adt/tsvector_op.c:2642 +#: utils/adt/tsvector_op.c:2807 #, c-format msgid "configuration column \"%s\" does not exist" -msgstr "konfigurationskolumnen \"%s\" existerar inte" +msgstr "kolumnen \"%s\" för konfiguration existerar inte" -#: utils/adt/tsvector_op.c:2648 +#: utils/adt/tsvector_op.c:2813 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "kolumn \"%s\" har inte regconfig-typ" -#: utils/adt/tsvector_op.c:2655 +#: utils/adt/tsvector_op.c:2820 #, c-format msgid "configuration column \"%s\" must not be null" -msgstr "konfigurationskolumn \"%s\" fÃ¥r inte vara null" +msgstr "kolumn \"%s\" för konfiguration fÃ¥r inte vara null" -#: utils/adt/tsvector_op.c:2668 +#: utils/adt/tsvector_op.c:2833 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" -msgstr "Textsökkonfigurationsnamn \"%s\" mÃ¥ste vara angivet med schema" +msgstr "Konfigurationsnamn \"%s\" för textsök mÃ¥ste vara angivet med schema" -#: utils/adt/tsvector_op.c:2693 +#: utils/adt/tsvector_op.c:2858 #, c-format msgid "column \"%s\" is not of a character type" msgstr "kolumnen \"%s\" är inte av typen character" -#: utils/adt/tsvector_parser.c:134 +#: utils/adt/tsvector_parser.c:148 #, c-format msgid "syntax error in tsvector: \"%s\"" msgstr "syntaxfel i tsvector: \"%s\"" -#: utils/adt/tsvector_parser.c:200 +#: utils/adt/tsvector_parser.c:221 #, c-format msgid "there is no escaped character: \"%s\"" msgstr "det finns inget escape-tecken: \"%s\"" -#: utils/adt/tsvector_parser.c:318 +#: utils/adt/tsvector_parser.c:339 #, c-format msgid "wrong position info in tsvector: \"%s\"" msgstr "fel positionsinfo i tsvector: \"%s\"" -#: utils/adt/uuid.c:413 +#: utils/adt/uuid.c:418 #, c-format msgid "could not generate random values" msgstr "kunde inte generera slumpmässiga värden" @@ -25766,9 +27440,9 @@ msgstr "ogiltig längd pÃ¥ extern bitsträng" msgid "bit string too long for type bit varying(%d)" msgstr "bitsträngen för lÃ¥ng för typen bit varying(%d)" -#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:889 -#: utils/adt/varlena.c:952 utils/adt/varlena.c:1109 utils/adt/varlena.c:3309 -#: utils/adt/varlena.c:3387 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:911 +#: utils/adt/varlena.c:974 utils/adt/varlena.c:1131 utils/adt/varlena.c:3055 +#: utils/adt/varlena.c:3133 #, c-format msgid "negative substring length not allowed" msgstr "negativ substräng-läng tillÃ¥ts inte" @@ -25793,477 +27467,472 @@ msgstr "kan inte XOR:a bitsträngar av olika storlek" msgid "bit index %d out of valid range (0..%d)" msgstr "bitindex %d utanför giltigt intervall (0..%d)" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3591 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3337 #, c-format msgid "new bit must be 0 or 1" msgstr "nya biten mÃ¥ste vara 0 eller 1" -#: utils/adt/varchar.c:157 utils/adt/varchar.c:310 +#: utils/adt/varchar.c:161 utils/adt/varchar.c:312 #, c-format msgid "value too long for type character(%d)" msgstr "värdet för lÃ¥ngt för typen character (%d)" -#: utils/adt/varchar.c:472 utils/adt/varchar.c:634 +#: utils/adt/varchar.c:475 utils/adt/varchar.c:639 #, c-format msgid "value too long for type character varying(%d)" msgstr "värdet för lÃ¥ngt för typen character varying(%d)" -#: utils/adt/varchar.c:732 utils/adt/varlena.c:1498 +#: utils/adt/varchar.c:737 utils/adt/varlena.c:1520 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "kunde inte bestämma vilken jämförelse (collation) som skall användas för strängjämförelse" -#: utils/adt/varlena.c:1208 utils/adt/varlena.c:1947 +#: utils/adt/varlena.c:1230 utils/adt/varlena.c:1809 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "ickedeterministiska jämförelser (collation) stöds inte för substrängsökningar" -#: utils/adt/varlena.c:1596 utils/adt/varlena.c:1609 -#, c-format -msgid "could not convert string to UTF-16: error code %lu" -msgstr "kunde inte konvertera sträng till UTF-16: felkod %lu" - -#: utils/adt/varlena.c:1624 -#, c-format -msgid "could not compare Unicode strings: %m" -msgstr "kunde inte jämföra Unicode-strängar: %m" - -#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2396 -#, c-format -msgid "collation failed: %s" -msgstr "jämförelse misslyckades: %s" - -#: utils/adt/varlena.c:2582 -#, c-format -msgid "sort key generation failed: %s" -msgstr "generering av sorteringsnyckel misslyckades: %s" - -#: utils/adt/varlena.c:3475 utils/adt/varlena.c:3542 +#: utils/adt/varlena.c:3221 utils/adt/varlena.c:3288 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "index %d utanför giltigt intervall, 0..%d" -#: utils/adt/varlena.c:3506 utils/adt/varlena.c:3578 +#: utils/adt/varlena.c:3252 utils/adt/varlena.c:3324 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "index %lld utanför giltigt intervall, 0..%lld" -#: utils/adt/varlena.c:4640 +#: utils/adt/varlena.c:4385 #, c-format msgid "field position must not be zero" msgstr "fältpositionen fÃ¥r inte vara noll" -#: utils/adt/varlena.c:5660 +#: utils/adt/varlena.c:5630 #, c-format msgid "unterminated format() type specifier" msgstr "icketerminerad typangivelse för format()" -#: utils/adt/varlena.c:5661 utils/adt/varlena.c:5795 utils/adt/varlena.c:5916 +#: utils/adt/varlena.c:5631 utils/adt/varlena.c:5765 utils/adt/varlena.c:5886 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "För ett ensamt \"%%\" använd \"%%%%\"." -#: utils/adt/varlena.c:5793 utils/adt/varlena.c:5914 +#: utils/adt/varlena.c:5763 utils/adt/varlena.c:5884 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "okänd typspecifierare \"%.*s\" för format()" -#: utils/adt/varlena.c:5806 utils/adt/varlena.c:5863 +#: utils/adt/varlena.c:5776 utils/adt/varlena.c:5833 #, c-format msgid "too few arguments for format()" msgstr "för fÃ¥ argument till format()" -#: utils/adt/varlena.c:5959 utils/adt/varlena.c:6141 +#: utils/adt/varlena.c:5929 utils/adt/varlena.c:6111 #, c-format msgid "number is out of range" msgstr "numret är utanför giltigt intervall" -#: utils/adt/varlena.c:6022 utils/adt/varlena.c:6050 +#: utils/adt/varlena.c:5992 utils/adt/varlena.c:6020 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "formatet anger argument 0 men argumenten är numrerade frÃ¥n 1" -#: utils/adt/varlena.c:6043 +#: utils/adt/varlena.c:6013 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "argumentposition för bredd mÃ¥ste avslutas med \"$\"" -#: utils/adt/varlena.c:6088 +#: utils/adt/varlena.c:6058 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "null-värden kan inte formatteras som SQL-identifierare" -#: utils/adt/varlena.c:6214 +#: utils/adt/varlena.c:6266 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "Unicode-normalisering kan bara utföras om server-kodningen är UTF8" -#: utils/adt/varlena.c:6227 +#: utils/adt/varlena.c:6279 #, c-format msgid "invalid normalization form: %s" msgstr "ogiltigt normaliseringsform: %s" -#: utils/adt/varlena.c:6430 utils/adt/varlena.c:6465 utils/adt/varlena.c:6500 +#: utils/adt/varlena.c:6324 +#, c-format +msgid "Unicode categorization can only be performed if server encoding is UTF8" +msgstr "Unicode-kategorisering kan bara utföras om server-kodningen är UTF8" + +#: utils/adt/varlena.c:6541 utils/adt/varlena.c:6576 utils/adt/varlena.c:6611 #, c-format msgid "invalid Unicode code point: %04X" msgstr "ogiltig Unicode-kodpunkt: %04X" -#: utils/adt/varlena.c:6530 +#: utils/adt/varlena.c:6641 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "Unicode-escapesekvenser mÃ¥ste vara \\XXXX, \\+XXXXXX, \\UXXXX eller \\UXXXXXXXX." -#: utils/adt/windowfuncs.c:306 +#: utils/adt/windowfuncs.c:443 #, c-format msgid "argument of ntile must be greater than zero" msgstr "argumentet till ntile mÃ¥ste vara större än noll" -#: utils/adt/windowfuncs.c:528 +#: utils/adt/windowfuncs.c:707 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "argumentet till nth_value mÃ¥ste vara större än noll" -#: utils/adt/xid8funcs.c:117 +#: utils/adt/xid8funcs.c:120 #, c-format msgid "transaction ID %llu is in the future" msgstr "transaktions-ID %llu är frÃ¥n framtiden" -#: utils/adt/xid8funcs.c:547 +#: utils/adt/xid8funcs.c:522 #, c-format msgid "invalid external pg_snapshot data" msgstr "ogiltig extern pg_snapshot-data" -#: utils/adt/xml.c:222 +#: utils/adt/xml.c:238 #, c-format msgid "unsupported XML feature" msgstr "ej stödd XML-finess" -#: utils/adt/xml.c:223 +#: utils/adt/xml.c:239 #, c-format msgid "This functionality requires the server to be built with libxml support." msgstr "Denna funktionalitet kräver att servern byggts med libxml-support." -#: utils/adt/xml.c:242 utils/mb/mbutils.c:627 +#: utils/adt/xml.c:258 utils/mb/mbutils.c:627 #, c-format msgid "invalid encoding name \"%s\"" msgstr "ogiltigt kodningsnamn \"%s\"" -#: utils/adt/xml.c:485 utils/adt/xml.c:490 +#: utils/adt/xml.c:506 utils/adt/xml.c:511 #, c-format msgid "invalid XML comment" msgstr "ogiltigt XML-kommentar" -#: utils/adt/xml.c:619 +#: utils/adt/xml.c:697 #, c-format msgid "not an XML document" msgstr "inget XML-dokument" -#: utils/adt/xml.c:778 utils/adt/xml.c:801 +#: utils/adt/xml.c:1008 utils/adt/xml.c:1031 #, c-format msgid "invalid XML processing instruction" msgstr "ogiltig XML-processinstruktion" -#: utils/adt/xml.c:779 +#: utils/adt/xml.c:1009 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "XML-processinstruktions mÃ¥lnamn kan inte vara \"%s\"." -#: utils/adt/xml.c:802 +#: utils/adt/xml.c:1032 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-processinstruktion kan inte innehÃ¥lla \"?>\"." -#: utils/adt/xml.c:881 +#: utils/adt/xml.c:1111 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate är inte implementerat" -#: utils/adt/xml.c:960 +#: utils/adt/xml.c:1167 #, c-format msgid "could not initialize XML library" msgstr "kunde inte initiera XML-bibliotek" -#: utils/adt/xml.c:961 +#: utils/adt/xml.c:1168 #, c-format msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." msgstr "libxml2 har inkompatibel char-typ: sizeof(char)=%zu, sizeof(xmlChar)=%zu." -#: utils/adt/xml.c:1047 +#: utils/adt/xml.c:1254 #, c-format msgid "could not set up XML error handler" msgstr "kunde inte ställa in XML-felhanterare" -#: utils/adt/xml.c:1048 +#: utils/adt/xml.c:1255 #, c-format msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." msgstr "Detta tyder pÃ¥ att libxml2-versionen som används inte är kompatibel med libxml2-header-filerna som PostgreSQL byggts med." -#: utils/adt/xml.c:1935 +#: utils/adt/xml.c:2281 msgid "Invalid character value." msgstr "Ogiltigt teckenvärde." -#: utils/adt/xml.c:1938 +#: utils/adt/xml.c:2284 msgid "Space required." msgstr "Mellanslag krävs." -#: utils/adt/xml.c:1941 +#: utils/adt/xml.c:2287 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone tillÃ¥ter bara 'yes' eller 'no'." -#: utils/adt/xml.c:1944 +#: utils/adt/xml.c:2290 msgid "Malformed declaration: missing version." msgstr "Felaktig deklaration: saknar version." -#: utils/adt/xml.c:1947 +#: utils/adt/xml.c:2293 msgid "Missing encoding in text declaration." msgstr "Saknar kodning i textdeklaration." -#: utils/adt/xml.c:1950 +#: utils/adt/xml.c:2296 msgid "Parsing XML declaration: '?>' expected." msgstr "Parsar XML-deklaration: förväntade sig '?>'" -#: utils/adt/xml.c:1953 +#: utils/adt/xml.c:2299 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Okänd libxml-felkod: %d." -#: utils/adt/xml.c:2210 +#: utils/adt/xml.c:2553 #, c-format msgid "XML does not support infinite date values." msgstr "XML stöder inte oändliga datumvärden." -#: utils/adt/xml.c:2232 utils/adt/xml.c:2259 +#: utils/adt/xml.c:2575 utils/adt/xml.c:2602 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML stöder inte oändliga timestamp-värden." -#: utils/adt/xml.c:2675 +#: utils/adt/xml.c:3018 #, c-format msgid "invalid query" msgstr "ogiltig frÃ¥ga" -#: utils/adt/xml.c:4015 +#: utils/adt/xml.c:3110 +#, c-format +msgid "portal \"%s\" does not return tuples" +msgstr "portalen \"%s\" returnerar inga tupler" + +#: utils/adt/xml.c:4362 #, c-format msgid "invalid array for XML namespace mapping" msgstr "ogiltig array till XML-namnrymdmappning" -#: utils/adt/xml.c:4016 +#: utils/adt/xml.c:4363 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "Arrayen mÃ¥ste vara tvÃ¥dimensionell där längden pÃ¥ andra axeln är 2." -#: utils/adt/xml.c:4040 +#: utils/adt/xml.c:4387 #, c-format msgid "empty XPath expression" msgstr "tomt XPath-uttryck" -#: utils/adt/xml.c:4092 +#: utils/adt/xml.c:4439 #, c-format msgid "neither namespace name nor URI may be null" msgstr "varken namnrymdnamn eller URI fÃ¥r vara null" -#: utils/adt/xml.c:4099 +#: utils/adt/xml.c:4446 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "kunde inte registrera XML-namnrymd med namn \"%s\" och URL \"%s\"" -#: utils/adt/xml.c:4450 +#: utils/adt/xml.c:4795 #, c-format msgid "DEFAULT namespace is not supported" msgstr "namnrymden DEFAULT stöds inte" -#: utils/adt/xml.c:4479 +#: utils/adt/xml.c:4824 #, c-format msgid "row path filter must not be empty string" msgstr "sökvägsfilter för rad fÃ¥r inte vara tomma strängen" -#: utils/adt/xml.c:4510 +#: utils/adt/xml.c:4858 #, c-format msgid "column path filter must not be empty string" msgstr "sokvägsfilter för kolumn fÃ¥r inte vara tomma strängen" -#: utils/adt/xml.c:4654 +#: utils/adt/xml.c:5005 #, c-format msgid "more than one value returned by column XPath expression" msgstr "mer än ett värde returnerades frÃ¥n kolumns XPath-uttryck" -#: utils/cache/lsyscache.c:1042 +#: utils/cache/lsyscache.c:1017 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "typomvandling frÃ¥n typ %s till typ %s finns inte" -#: utils/cache/lsyscache.c:2844 utils/cache/lsyscache.c:2877 -#: utils/cache/lsyscache.c:2910 utils/cache/lsyscache.c:2943 +#: utils/cache/lsyscache.c:2887 utils/cache/lsyscache.c:2920 +#: utils/cache/lsyscache.c:2953 utils/cache/lsyscache.c:2986 #, c-format msgid "type %s is only a shell" msgstr "typ %s är bara en shell-typ" -#: utils/cache/lsyscache.c:2849 +#: utils/cache/lsyscache.c:2892 #, c-format msgid "no input function available for type %s" msgstr "ingen inläsningsfunktion finns för typ %s" -#: utils/cache/lsyscache.c:2882 +#: utils/cache/lsyscache.c:2925 #, c-format msgid "no output function available for type %s" msgstr "ingen utmatningsfunktion finns för typ %s" -#: utils/cache/partcache.c:215 +#: utils/cache/partcache.c:216 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d for type %s" msgstr "operatorklass \"%s\" för accessmetod %s saknar supportfunktion %d för typ %s" -#: utils/cache/plancache.c:720 +#: utils/cache/plancache.c:747 #, c-format msgid "cached plan must not change result type" msgstr "cache:ad plan fÃ¥r inte ändra resultattyp" -#: utils/cache/relcache.c:3753 +#: utils/cache/relcache.c:3801 #, c-format -msgid "heap relfilenode value not set when in binary upgrade mode" -msgstr "relfilenode-värde för heap är inte satt i binärt uppgraderingsläge" +msgid "heap relfilenumber value not set when in binary upgrade mode" +msgstr "relfile-nummer för heap är inte satt i binärt uppgraderingsläge" -#: utils/cache/relcache.c:3761 +#: utils/cache/relcache.c:3809 #, c-format -msgid "unexpected request for new relfilenode in binary upgrade mode" -msgstr "oväntad begäran av ny relfilenode i binärt uppgraderingsläge" +msgid "unexpected request for new relfilenumber in binary upgrade mode" +msgstr "oväntad begäran av nytt relfile-nummer i binärt uppgraderingsläge" -#: utils/cache/relcache.c:6472 +#: utils/cache/relcache.c:6539 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "kunde inte skapa initieringsfil \"%s\" för relations-cache: %m" -#: utils/cache/relcache.c:6474 +#: utils/cache/relcache.c:6541 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Fortsätter ändÃ¥, trots att nÃ¥got är fel." -#: utils/cache/relcache.c:6796 +#: utils/cache/relcache.c:6871 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "kunde inte ta bort cache-fil \"%s\": %m" -#: utils/cache/relmapper.c:590 +#: utils/cache/relmapper.c:596 #, c-format msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "kan inte göra PREPARE pÃ¥ en transaktion som ändrat relationsmappningen" -#: utils/cache/relmapper.c:836 +#: utils/cache/relmapper.c:852 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "relationsmappningsfilen \"%s\" innehÃ¥ller ogiltig data" -#: utils/cache/relmapper.c:846 +#: utils/cache/relmapper.c:862 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "relationsmappningsfilen \"%s\" innehÃ¥ller en felaktig checksumma" -#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:575 +#: utils/cache/typcache.c:1812 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "posttypen har inte registrerats" -#: utils/error/assert.c:39 +#: utils/error/assert.c:37 #, c-format msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" msgstr "TRAP: ExceptionalCondition: fel argument i PID %d\n" -#: utils/error/assert.c:42 +#: utils/error/assert.c:40 #, c-format -msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" -msgstr "TRAP: %s(\"%s\", Fil: \"%s\", Rad: %d, PID: %d)\n" +msgid "TRAP: failed Assert(\"%s\"), File: \"%s\", Line: %d, PID: %d\n" +msgstr "TRAP: misslyckad Assert(\"%s\"), Fil: \"%s\", Rad: %d, PID: %d)\n" -#: utils/error/elog.c:404 +#: utils/error/elog.c:415 #, c-format msgid "error occurred before error message processing is available\n" msgstr "fel uppstod innan processning av felmeddelande är tillgängligt\n" -#: utils/error/elog.c:1943 +#: utils/error/elog.c:2134 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "kunde inte Ã¥teröppna filen \"%s\" som stderr: %m" -#: utils/error/elog.c:1956 +#: utils/error/elog.c:2147 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "kunde inte Ã¥teröppna filen \"%s\" som stdout: %m" -#: utils/error/elog.c:2521 utils/error/elog.c:2548 utils/error/elog.c:2564 +#: utils/error/elog.c:2183 +#, c-format +msgid "Invalid character" +msgstr "Ogiltigt tecken" + +#: utils/error/elog.c:2889 utils/error/elog.c:2916 utils/error/elog.c:2932 msgid "[unknown]" msgstr "[okänd]" -#: utils/error/elog.c:2837 utils/error/elog.c:3158 utils/error/elog.c:3265 +#: utils/error/elog.c:3202 utils/error/elog.c:3526 utils/error/elog.c:3633 msgid "missing error text" msgstr "saknar feltext" -#: utils/error/elog.c:2840 utils/error/elog.c:2843 +#: utils/error/elog.c:3205 utils/error/elog.c:3208 #, c-format msgid " at character %d" msgstr " vid tecken %d" -#: utils/error/elog.c:2853 utils/error/elog.c:2860 +#: utils/error/elog.c:3218 utils/error/elog.c:3225 msgid "DETAIL: " msgstr "DETALJ: " -#: utils/error/elog.c:2867 +#: utils/error/elog.c:3232 msgid "HINT: " msgstr "TIPS: " -#: utils/error/elog.c:2874 +#: utils/error/elog.c:3239 msgid "QUERY: " msgstr "FRÃ…GA: " -#: utils/error/elog.c:2881 +#: utils/error/elog.c:3246 msgid "CONTEXT: " msgstr "KONTEXT: " -#: utils/error/elog.c:2891 +#: utils/error/elog.c:3256 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "PLATS: %s, %s:%d\n" -#: utils/error/elog.c:2898 +#: utils/error/elog.c:3263 #, c-format msgid "LOCATION: %s:%d\n" msgstr "PLATS: %s:%d\n" -#: utils/error/elog.c:2905 +#: utils/error/elog.c:3270 msgid "BACKTRACE: " msgstr "BACKTRACE: " -#: utils/error/elog.c:2917 +#: utils/error/elog.c:3282 msgid "STATEMENT: " msgstr "SATS: " -#: utils/error/elog.c:3310 +#: utils/error/elog.c:3678 msgid "DEBUG" msgstr "DEBUG" -#: utils/error/elog.c:3314 +#: utils/error/elog.c:3682 msgid "LOG" msgstr "LOGG" -#: utils/error/elog.c:3317 +#: utils/error/elog.c:3685 msgid "INFO" msgstr "INFO" -#: utils/error/elog.c:3320 +#: utils/error/elog.c:3688 msgid "NOTICE" msgstr "NOTIS" -#: utils/error/elog.c:3324 +#: utils/error/elog.c:3692 msgid "WARNING" msgstr "VARNING" -#: utils/error/elog.c:3327 +#: utils/error/elog.c:3695 msgid "ERROR" msgstr "FEL" -#: utils/error/elog.c:3330 +#: utils/error/elog.c:3698 msgid "FATAL" msgstr "FATALT" -#: utils/error/elog.c:3333 +#: utils/error/elog.c:3701 msgid "PANIC" msgstr "PANIK" @@ -26336,412 +28005,429 @@ msgstr "Magiskt block har oväntad längd eller annan paddning." msgid "incompatible library \"%s\": magic block mismatch" msgstr "inkompatibelt bibliotek \"%s\": magiskt block matchar inte" -#: utils/fmgr/dfmgr.c:492 +#: utils/fmgr/dfmgr.c:475 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "Ã¥tkomst till biblioteket \"%s\" tillÃ¥ts inte" -#: utils/fmgr/dfmgr.c:518 +#: utils/fmgr/dfmgr.c:501 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "ogiltigt macro-namn i dynamisk biblioteksökväg: %s" -#: utils/fmgr/dfmgr.c:558 +#: utils/fmgr/dfmgr.c:541 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "komponent med längden noll i parameter \"dynamic_library_path\"" -#: utils/fmgr/dfmgr.c:577 +#: utils/fmgr/dfmgr.c:560 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "komponent som inte är en absolut sökväg i parameter \"dynamic_library_path\"" -#: utils/fmgr/fmgr.c:238 +#: utils/fmgr/fmgr.c:236 #, c-format msgid "internal function \"%s\" is not in internal lookup table" msgstr "interna funktionen \"%s\" finns inte i den interna uppslagstabellen" -#: utils/fmgr/fmgr.c:484 +#: utils/fmgr/fmgr.c:470 #, c-format msgid "could not find function information for function \"%s\"" msgstr "kunde inte hitta funktionsinformation för funktion \"%s\"" -#: utils/fmgr/fmgr.c:486 +#: utils/fmgr/fmgr.c:472 #, c-format msgid "SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname)." msgstr "SQL-anropbara funktioner kräver en medföljande PG_FUNCTION_INFO_V1(funknamn)." -#: utils/fmgr/fmgr.c:504 +#: utils/fmgr/fmgr.c:490 #, c-format msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "okänd API-version %d rapporterad av infofunktion \"%s\"" -#: utils/fmgr/fmgr.c:1985 +#: utils/fmgr/fmgr.c:2109 #, c-format msgid "operator class options info is absent in function call context" msgstr "info om operatorklassflaggor saknas i funktionens anropskontext" -#: utils/fmgr/fmgr.c:2052 +#: utils/fmgr/fmgr.c:2176 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "sprÃ¥kvalideringsfunktion %u anropad för sprÃ¥k %u istället för %u" -#: utils/fmgr/funcapi.c:498 +#: utils/fmgr/funcapi.c:496 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "kunde inte bestämma resultattyp för funktion \"%s\" som deklarerats att returnera typ %s" -#: utils/fmgr/funcapi.c:643 +#: utils/fmgr/funcapi.c:642 #, c-format msgid "argument declared %s does not contain a range type but type %s" msgstr "argumentet deklarerad %s innehÃ¥ller inte en range-typ utan typ %s" -#: utils/fmgr/funcapi.c:726 -#, c-format -msgid "could not find multirange type for data type %s" -msgstr "kunde inte hitta multirange-typ för datatyp %s" - -#: utils/fmgr/funcapi.c:1943 utils/fmgr/funcapi.c:1975 +#: utils/fmgr/funcapi.c:1929 utils/fmgr/funcapi.c:1961 #, c-format msgid "number of aliases does not match number of columns" msgstr "antalet alias matchar inte antalet kolumner" -#: utils/fmgr/funcapi.c:1969 +#: utils/fmgr/funcapi.c:1955 #, c-format msgid "no column alias was provided" msgstr "inget kolumnalias angivet" -#: utils/fmgr/funcapi.c:1993 +#: utils/fmgr/funcapi.c:1979 #, c-format msgid "could not determine row description for function returning record" msgstr "kunde inte fÃ¥ radbeskrivning för funktion som returnerar en record" -#: utils/init/miscinit.c:329 +#: utils/init/miscinit.c:353 #, c-format msgid "data directory \"%s\" does not exist" msgstr "databaskatalogen \"%s\" existerar inte" -#: utils/init/miscinit.c:334 +#: utils/init/miscinit.c:358 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "kunde inte läsa rättigheter pÃ¥ katalog \"%s\": %m" -#: utils/init/miscinit.c:342 +#: utils/init/miscinit.c:366 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "angiven datakatalog \"%s\" är inte en katalog" -#: utils/init/miscinit.c:358 +#: utils/init/miscinit.c:382 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "datakatalogen \"%s\" har fel ägare" -#: utils/init/miscinit.c:360 +#: utils/init/miscinit.c:384 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "Servern mÃ¥ste startas av den användare som äger datakatalogen." -#: utils/init/miscinit.c:378 +#: utils/init/miscinit.c:402 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "datakatalogen \"%s\" har felaktiga rättigheter" -#: utils/init/miscinit.c:380 +#: utils/init/miscinit.c:404 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Rättigheterna skall vara u=rwx (0700) eller u=rwx,g=rx (0750)." -#: utils/init/miscinit.c:665 utils/misc/guc.c:7830 +#: utils/init/miscinit.c:462 +#, c-format +msgid "could not change directory to \"%s\": %m" +msgstr "kunde inte byta katalog till \"%s\": %m" + +#: utils/init/miscinit.c:720 utils/misc/guc.c:3650 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "kan inte sätta parameter \"%s\" frÃ¥n en säkerhetsbegränsad operation" -#: utils/init/miscinit.c:733 +#: utils/init/miscinit.c:807 #, c-format msgid "role with OID %u does not exist" msgstr "roll med OID %u existerar inte" -#: utils/init/miscinit.c:763 +#: utils/init/miscinit.c:853 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "roll \"%s\" tillÃ¥ts inte logga in" -#: utils/init/miscinit.c:781 +#: utils/init/miscinit.c:874 #, c-format msgid "too many connections for role \"%s\"" msgstr "för mÃ¥nga uppkopplingar för roll \"%s\"" -#: utils/init/miscinit.c:841 -#, c-format -msgid "permission denied to set session authorization" -msgstr "rättighet saknas för att sätta sessionsauktorisation" - -#: utils/init/miscinit.c:924 +#: utils/init/miscinit.c:1045 #, c-format msgid "invalid role OID: %u" msgstr "ogiltigt roll-OID: %u" -#: utils/init/miscinit.c:978 +#: utils/init/miscinit.c:1192 #, c-format msgid "database system is shut down" msgstr "databassystemet är nedstängt" -#: utils/init/miscinit.c:1065 +#: utils/init/miscinit.c:1279 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "kan inte skapa lÃ¥sfil \"%s\": %m" -#: utils/init/miscinit.c:1079 +#: utils/init/miscinit.c:1293 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "kunde inte öppna lÃ¥sfil \"%s\": %m" -#: utils/init/miscinit.c:1086 +#: utils/init/miscinit.c:1300 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "kunde inte läsa lÃ¥sfil \"%s\": %m" -#: utils/init/miscinit.c:1095 +#: utils/init/miscinit.c:1309 #, c-format msgid "lock file \"%s\" is empty" msgstr "lÃ¥sfilen \"%s\" är tom" -#: utils/init/miscinit.c:1096 +#: utils/init/miscinit.c:1310 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." msgstr "Antingen startar en annan server eller sÃ¥ är lÃ¥sfilen kvar frÃ¥n en tidigare serverkrash vid uppstart." -#: utils/init/miscinit.c:1140 +#: utils/init/miscinit.c:1354 #, c-format msgid "lock file \"%s\" already exists" msgstr "lÃ¥sfil med namn \"%s\" finns redan" -#: utils/init/miscinit.c:1144 +#: utils/init/miscinit.c:1358 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "Kör en annan postgres (PID %d) i datakatalogen \"%s\"?" -#: utils/init/miscinit.c:1146 +#: utils/init/miscinit.c:1360 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "Kör en annan postmaster (PID %d) i datakatalogen \"%s\"?" -#: utils/init/miscinit.c:1149 +#: utils/init/miscinit.c:1363 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Använder en annan postgres (PID %d) uttagesfilen (socket) \"%s\"?" -#: utils/init/miscinit.c:1151 +#: utils/init/miscinit.c:1365 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Använder en annan postmaster (PID %d) uttagesfilen (socket) \"%s\"?" -#: utils/init/miscinit.c:1202 +#: utils/init/miscinit.c:1416 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "kunde inte ta bort gammal lÃ¥sfil \"%s\": %m" -#: utils/init/miscinit.c:1204 +#: utils/init/miscinit.c:1418 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." msgstr "Filen verkar ha lämnats kvar av misstag, men kan inte tas bort. Ta bort den för hand och försök igen.>" -#: utils/init/miscinit.c:1241 utils/init/miscinit.c:1255 -#: utils/init/miscinit.c:1266 +#: utils/init/miscinit.c:1455 utils/init/miscinit.c:1469 +#: utils/init/miscinit.c:1480 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "kunde inte skriva lÃ¥sfil \"%s\": %m" -#: utils/init/miscinit.c:1377 utils/init/miscinit.c:1519 utils/misc/guc.c:10827 +#: utils/init/miscinit.c:1591 utils/init/miscinit.c:1733 utils/misc/guc.c:5765 #, c-format msgid "could not read from file \"%s\": %m" msgstr "kunde inte läsa frÃ¥n fil \"%s\": %m" -#: utils/init/miscinit.c:1507 +#: utils/init/miscinit.c:1721 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "kunde inte öppna fil \"%s\": %m: fortsätter ändÃ¥" -#: utils/init/miscinit.c:1532 +#: utils/init/miscinit.c:1746 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "lÃ¥sfil \"%s\" innehÃ¥ller fel PID: %ld istället för %ld" -#: utils/init/miscinit.c:1571 utils/init/miscinit.c:1587 +#: utils/init/miscinit.c:1785 utils/init/miscinit.c:1801 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\" är inte en giltigt datakatalog" -#: utils/init/miscinit.c:1573 +#: utils/init/miscinit.c:1787 #, c-format msgid "File \"%s\" is missing." msgstr "Filen \"%s\" saknas." -#: utils/init/miscinit.c:1589 +#: utils/init/miscinit.c:1803 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Filen \"%s\" innehÃ¥ller inte giltig data." -#: utils/init/miscinit.c:1591 +#: utils/init/miscinit.c:1805 #, c-format msgid "You might need to initdb." msgstr "Du kan behöva köra initdb." -#: utils/init/miscinit.c:1599 +#: utils/init/miscinit.c:1813 #, c-format msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." msgstr "Datakatalogen har skapats av PostgreSQL version %s, som inte är kompatibel med version %s." -#: utils/init/postinit.c:258 +#: utils/init/postinit.c:259 #, c-format msgid "replication connection authorized: user=%s" msgstr "replikeringsanslutning auktoriserad: användare=%s" -#: utils/init/postinit.c:261 +#: utils/init/postinit.c:262 #, c-format msgid "connection authorized: user=%s" msgstr "anslutning auktoriserad: användare=%s" -#: utils/init/postinit.c:264 +#: utils/init/postinit.c:265 #, c-format msgid " database=%s" msgstr "databas=%s" -#: utils/init/postinit.c:267 +#: utils/init/postinit.c:268 #, c-format msgid " application_name=%s" msgstr " applikationsnamn=%s" -#: utils/init/postinit.c:272 +#: utils/init/postinit.c:273 #, c-format msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" msgstr "SSL pÃ¥slagen (protokoll=%s, krypto=%s, bitar=%d)" -#: utils/init/postinit.c:284 +#: utils/init/postinit.c:285 #, c-format -msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" -msgstr " GSS (autentiserad=%s, krypterad=%s, principal=%s)" +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s, principal=%s)" +msgstr " GSS (autentiserad=%s, krypterad=%s, delegerade_referenser=%s, principal=%s)" -#: utils/init/postinit.c:285 utils/init/postinit.c:286 -#: utils/init/postinit.c:291 utils/init/postinit.c:292 +#: utils/init/postinit.c:286 utils/init/postinit.c:287 +#: utils/init/postinit.c:288 utils/init/postinit.c:293 +#: utils/init/postinit.c:294 utils/init/postinit.c:295 msgid "no" msgstr "nej" -#: utils/init/postinit.c:285 utils/init/postinit.c:286 -#: utils/init/postinit.c:291 utils/init/postinit.c:292 +#: utils/init/postinit.c:286 utils/init/postinit.c:287 +#: utils/init/postinit.c:288 utils/init/postinit.c:293 +#: utils/init/postinit.c:294 utils/init/postinit.c:295 msgid "yes" msgstr "ja" -#: utils/init/postinit.c:290 +#: utils/init/postinit.c:292 #, c-format -msgid " GSS (authenticated=%s, encrypted=%s)" -msgstr "GSS (autentiserad=%s, krypterad=%s)" +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)" +msgstr " GSS (autentiserad=%s, krypterad=%s, delegerade_referenser=%s)" -#: utils/init/postinit.c:330 +#: utils/init/postinit.c:333 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "databasen \"%s\" har försvunnit frÃ¥n pg_database" -#: utils/init/postinit.c:332 +#: utils/init/postinit.c:335 #, c-format msgid "Database OID %u now seems to belong to \"%s\"." msgstr "Databasen med OID %u verkar nu höra till \"%s\"." -#: utils/init/postinit.c:352 +#: utils/init/postinit.c:355 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "databasen \"%s\" tar för närvarande inte emot uppkopplingar" -#: utils/init/postinit.c:365 +#: utils/init/postinit.c:368 #, c-format msgid "permission denied for database \"%s\"" msgstr "rättighet saknas för databas \"%s\"" -#: utils/init/postinit.c:366 +#: utils/init/postinit.c:369 #, c-format msgid "User does not have CONNECT privilege." msgstr "Användaren har inte rättigheten CONNECT." -#: utils/init/postinit.c:383 +#: utils/init/postinit.c:389 #, c-format msgid "too many connections for database \"%s\"" msgstr "för mÃ¥nga uppkopplingar till databasen \"%s\"" -#: utils/init/postinit.c:409 utils/init/postinit.c:416 +#: utils/init/postinit.c:413 utils/init/postinit.c:420 #, c-format msgid "database locale is incompatible with operating system" msgstr "databaslokalen är inkompatibel med operativsystemet" -#: utils/init/postinit.c:410 +#: utils/init/postinit.c:414 #, c-format msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." msgstr "Databasen initierades med LC_COLLATE \"%s\" vilket inte känns igen av setlocale()." -#: utils/init/postinit.c:412 utils/init/postinit.c:419 +#: utils/init/postinit.c:416 utils/init/postinit.c:423 #, c-format msgid "Recreate the database with another locale or install the missing locale." msgstr "Ã…terskapa databasen med en annan lokal eller installera den saknade lokalen." -#: utils/init/postinit.c:417 +#: utils/init/postinit.c:421 #, c-format msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." msgstr "Databasen initierades med LC_CTYPE \"%s\", vilket inte känns igen av setlocale()." -#: utils/init/postinit.c:462 +#: utils/init/postinit.c:493 #, c-format msgid "database \"%s\" has a collation version mismatch" msgstr "databasen \"%s\" har en jämförelse (collation) vars version som inte matchar" -#: utils/init/postinit.c:464 +#: utils/init/postinit.c:495 #, c-format msgid "The database was created using collation version %s, but the operating system provides version %s." msgstr "Databasen skapades med jämförelseversion %s men operativsystemet tillhandahÃ¥ller version %s." -#: utils/init/postinit.c:467 +#: utils/init/postinit.c:498 #, c-format msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." msgstr "Bygg om alla objekt i denna databas som använder standardjämförelse (collation) och kör ALTER DATABASE %s REFRESH COLLATION VERSION eller bygg PostgreSQL med rätt bibliotekversion." -#: utils/init/postinit.c:835 +#: utils/init/postinit.c:904 #, c-format msgid "no roles are defined in this database system" msgstr "inga roller är definierade i detta databassystem" -#: utils/init/postinit.c:836 +#: utils/init/postinit.c:905 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Du borde direkt köra CREATE USER \"%s\" SUPERUSER;." -#: utils/init/postinit.c:868 +#: utils/init/postinit.c:942 #, c-format msgid "must be superuser to connect in binary upgrade mode" -msgstr "mÃ¥ste vara superuser för att ansluta i binärt uppgraderingsläger" +msgstr "mÃ¥ste vara superuser för att ansluta i binärt uppgraderingsläge" -#: utils/init/postinit.c:881 +#: utils/init/postinit.c:962 #, c-format -msgid "remaining connection slots are reserved for non-replication superuser connections" -msgstr "resterande anslutningsslottar är reserverade för superuser-anslutningar utan replikering" +msgid "remaining connection slots are reserved for roles with the %s attribute" +msgstr "resterande anslutningsslottar är reserverade för roller med attributet %s" -#: utils/init/postinit.c:891 +#: utils/init/postinit.c:968 #, c-format -msgid "must be superuser or replication role to start walsender" -msgstr "mÃ¥ste vara superuser eller replikeringsroll för att starta \"walsender\"" +msgid "remaining connection slots are reserved for roles with privileges of the \"%s\" role" +msgstr "resterande anslutningsslottar är reserverade för roller med rättigheter frÃ¥n rollen \"%s\"" -#: utils/init/postinit.c:960 +#: utils/init/postinit.c:980 #, c-format -msgid "database %u does not exist" -msgstr "databasen %u existerar inte" +msgid "permission denied to start WAL sender" +msgstr "rättighet saknas för att starta WAL-skickare" + +#: utils/init/postinit.c:981 +#, c-format +msgid "Only roles with the %s attribute may start a WAL sender process." +msgstr "Bara roller med attributet %s fÃ¥r starta en process för WAL-skickande." -#: utils/init/postinit.c:1049 +#: utils/init/postinit.c:1099 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Det verkar precis ha tagits bort eller döpts om." -#: utils/init/postinit.c:1067 +#: utils/init/postinit.c:1103 +#, c-format +msgid "database %u does not exist" +msgstr "databasen %u existerar inte" + +#: utils/init/postinit.c:1112 +#, c-format +msgid "cannot connect to invalid database \"%s\"" +msgstr "kan inte ansluta till ogiltig databas \"%s\"" + +#: utils/init/postinit.c:1173 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Databasens underbibliotek \"%s\" saknas." +#: utils/init/usercontext.c:43 +#, c-format +msgid "role \"%s\" cannot SET ROLE to \"%s\"" +msgstr "rollen \"%s\" kan inte göra SET ROLE till \"%s\"" + #: utils/mb/conv.c:522 utils/mb/conv.c:733 #, c-format msgid "invalid encoding number: %d" @@ -26764,11 +28450,6 @@ msgstr "oväntat kodnings-ID %d för WIN-teckenuppsättningarna" msgid "conversion between %s and %s is not supported" msgstr "konvertering mellan %s och %s stöds inte" -#: utils/mb/mbutils.c:385 -#, c-format -msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" -msgstr "standardkonverteringsfunktion för kodning \"%s\" till \"%s\" finns inte" - #: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 #: utils/mb/mbutils.c:842 #, c-format @@ -26795,2214 +28476,2352 @@ msgstr "ogiltigt byte-sekvens för kodning \"%s\": 0x%02x\"" msgid "invalid Unicode code point" msgstr "ogiltig Unicode-kodpunkt" -#: utils/mb/mbutils.c:1146 +#: utils/mb/mbutils.c:1201 #, c-format msgid "bind_textdomain_codeset failed" msgstr "bind_textdomain_codeset misslyckades" -#: utils/mb/mbutils.c:1667 +#: utils/mb/mbutils.c:1718 #, c-format msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "ogiltigt byte-sekvens för kodning \"%s\": %s" -#: utils/mb/mbutils.c:1700 +#: utils/mb/mbutils.c:1751 +#, c-format +msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" +msgstr "tecken med byte-sekvens %s i kodning \"%s\" har inget motsvarande i kodning \"%s\"" + +#: utils/misc/conffiles.c:88 +#, c-format +msgid "empty configuration directory name: \"%s\"" +msgstr "konfigurationskatalogens namn är tomt: \"%s\"" + +#: utils/misc/conffiles.c:100 +#, c-format +msgid "could not open configuration directory \"%s\": %m" +msgstr "kunde inte öppna konfigureringskatalog \"%s\": %m" + +#: utils/misc/guc.c:122 +msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." +msgstr "Giltiga enheter för denna parameter är \"B\", \"kB\", \"MB\", \"GB\" och \"TB\"." + +#: utils/misc/guc.c:159 +msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." +msgstr "Giltiga enheter för denna parameter är \"us\", \"ms\", \"s\", \"min\", \"h\" och \"d\"." + +#: utils/misc/guc.c:430 +#, c-format +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "okänd konfigurationsparameter \"%s\" i fil \"%s\" rad %d" + +#: utils/misc/guc.c:470 utils/misc/guc.c:3504 utils/misc/guc.c:3748 +#: utils/misc/guc.c:3846 utils/misc/guc.c:3944 utils/misc/guc.c:4071 +#: utils/misc/guc.c:4212 +#, c-format +msgid "parameter \"%s\" cannot be changed without restarting the server" +msgstr "parameter \"%s\" kan inte ändras utan att starta om servern" + +#: utils/misc/guc.c:506 +#, c-format +msgid "parameter \"%s\" removed from configuration file, reset to default" +msgstr "parameter \"%s\" borttagen frÃ¥n konfigurationsfil, Ã¥terställs till standard" + +#: utils/misc/guc.c:571 +#, c-format +msgid "parameter \"%s\" changed to \"%s\"" +msgstr "parameter \"%s\" ändrad till \"%s\"" + +#: utils/misc/guc.c:613 +#, c-format +msgid "configuration file \"%s\" contains errors" +msgstr "konfigurationsfil \"%s\" innehÃ¥ller fel" + +#: utils/misc/guc.c:618 +#, c-format +msgid "configuration file \"%s\" contains errors; unaffected changes were applied" +msgstr "konfigurationsfil \"%s\" innehÃ¥ller fel; opÃ¥verkade ändringar har utförts" + +#: utils/misc/guc.c:623 +#, c-format +msgid "configuration file \"%s\" contains errors; no changes were applied" +msgstr "konfigurationsfil \"%s\" innehÃ¥ller fel; inga ändringar har utförts" + +#: utils/misc/guc.c:1139 utils/misc/guc.c:1155 +#, c-format +msgid "invalid configuration parameter name \"%s\"" +msgstr "ogiltig konfigurationsparameter \"%s\"" + +#: utils/misc/guc.c:1141 +#, c-format +msgid "Custom parameter names must be two or more simple identifiers separated by dots." +msgstr "Egenskapade parameternamn mÃ¥ste vara tvÃ¥ eller fler enkla identifierare separerade med punkter." + +#: utils/misc/guc.c:1157 +#, c-format +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\" är ett reserverat prefix." + +#: utils/misc/guc.c:1170 utils/misc/guc.c:1280 +#, c-format +msgid "unrecognized configuration parameter \"%s\"" +msgstr "okänd konfigurationsparameter \"%s\"" + +#: utils/misc/guc.c:1802 +#, c-format +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: kunde inte komma Ã¥t katalogen \"%s\": %m\n" + +#: utils/misc/guc.c:1806 +#, c-format +msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" +msgstr "Kör initdb eller pg_basebackup för att initiera en PostgreSQL-datakatalog.\n" + +#: utils/misc/guc.c:1830 +#, c-format +msgid "" +"%s does not know where to find the server configuration file.\n" +"You must specify the --config-file or -D invocation option or set the PGDATA environment variable.\n" +msgstr "" +"%s vet inte var servens konfigurationsfil är.\n" +"Du mÃ¥ste ange flaggan --config-file eller -D alternativt sätta omgivningsvariabeln PGDATA.\n" + +#: utils/misc/guc.c:1853 +#, c-format +msgid "%s: could not access the server configuration file \"%s\": %m\n" +msgstr "%s: ingen Ã¥tkomst till serverns konfigureringsfil \"%s\": %m\n" + +#: utils/misc/guc.c:1881 +#, c-format +msgid "" +"%s does not know where to find the database system data.\n" +"This can be specified as \"data_directory\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "" +"%s vet inte var databasens systemdata är.\n" +"Det kan anges med \"data_directory\" i \"%s\" eller med flaggan -D alternativt genom att sätta omgivningsvariabeln PGDATA.\n" + +#: utils/misc/guc.c:1933 +#, c-format +msgid "" +"%s does not know where to find the \"hba\" configuration file.\n" +"This can be specified as \"hba_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "" +"%s vet inte var \"hba\"-konfigurationsfilen är.\n" +"Detta kan anges som \"hba_file\" i \"%s\" eller med flaggan -D alternativt genom att sätta omgivningsvariabeln PGDATA.\n" + +#: utils/misc/guc.c:1964 +#, c-format +msgid "" +"%s does not know where to find the \"ident\" configuration file.\n" +"This can be specified as \"ident_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "" +"%s vet inte var \"ident\"-konfigurationsfilen är.\n" +"Detta kan anges som \"ident_file\" i \"%s\" eller med flaggan -D alternativt genom att sätta omgivningsvariabeln PGDATA.\n" + +#: utils/misc/guc.c:2943 +msgid "Value exceeds integer range." +msgstr "Värde överskriver heltalsintervall." + +#: utils/misc/guc.c:3185 +#, c-format +msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d%s%s .. %d%s%s)" +msgstr "%d%s%s är utanför giltigt intervall för parameter \"%s\" (%d%s%s .. %d%s%s)" + +#: utils/misc/guc.c:3226 +#, c-format +msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g%s%s .. %g%s%s)" +msgstr "%g%s%s är utanför giltigt intervall för parameter \"%s\" (%g%s%s .. %g%s%s)" + +#: utils/misc/guc.c:3465 +#, c-format +msgid "parameter \"%s\" cannot be set during a parallel operation" +msgstr "parameter \"%s\" can inte sättas under en parallell operation" + +#: utils/misc/guc.c:3481 utils/misc/guc.c:4696 +#, c-format +msgid "parameter \"%s\" cannot be changed" +msgstr "parameter \"%s\" kan inte ändras" + +#: utils/misc/guc.c:3514 +#, c-format +msgid "parameter \"%s\" cannot be changed now" +msgstr "parameter \"%s\" kan inte ändras nu" + +#: utils/misc/guc.c:3541 utils/misc/guc.c:3603 utils/misc/guc.c:4671 +#: utils/misc/guc.c:6756 +#, c-format +msgid "permission denied to set parameter \"%s\"" +msgstr "rättighet saknas för att sätta parameter \"%s\"" + +#: utils/misc/guc.c:3583 +#, c-format +msgid "parameter \"%s\" cannot be set after connection start" +msgstr "parameter \"%s\" kan inte ändras efter uppkopplingen startats" + +#: utils/misc/guc.c:3642 +#, c-format +msgid "cannot set parameter \"%s\" within security-definer function" +msgstr "kan inte sätta parameter \"%s\" inom en security-definer-funktion" + +#: utils/misc/guc.c:3663 +#, c-format +msgid "parameter \"%s\" cannot be reset" +msgstr "parametern \"%s\" kunde inte Ã¥terställas" + +#: utils/misc/guc.c:3670 +#, c-format +msgid "parameter \"%s\" cannot be set locally in functions" +msgstr "parametern \"%s\" kan inte ändras lokalt i funktioner" + +#: utils/misc/guc.c:4370 utils/misc/guc.c:4418 utils/misc/guc.c:5450 +#, c-format +msgid "permission denied to examine \"%s\"" +msgstr "rättighet saknas för att se \"%s\"" + +#: utils/misc/guc.c:4371 utils/misc/guc.c:4419 utils/misc/guc.c:5451 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may examine this parameter." +msgstr "Bara roller med rättigheter frÃ¥n rollen \"%s\" fÃ¥r se denna parameter." + +#: utils/misc/guc.c:4629 +#, c-format +msgid "ALTER SYSTEM is not allowed in this environment" +msgstr "ALTER SYSTEM tillÃ¥ts inte i denna miljö" + +#: utils/misc/guc.c:4661 +#, c-format +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "rättighet saknas för att utföra ALTER SYSTEM RESET ALL" + +#: utils/misc/guc.c:4740 +#, c-format +msgid "parameter value for ALTER SYSTEM must not contain a newline" +msgstr "parametervärde till ALTER SYSTEM kan inte innehÃ¥lla nyradstecken" + +#: utils/misc/guc.c:4785 +#, c-format +msgid "could not parse contents of file \"%s\"" +msgstr "kunde inte parsa innehÃ¥llet i fil \"%s\"" + +#: utils/misc/guc.c:4967 +#, c-format +msgid "attempt to redefine parameter \"%s\"" +msgstr "försök att omdefiniera parameter \"%s\"" + +#: utils/misc/guc.c:5306 +#, c-format +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "ogiltigt konfigurationsparameternamn \"%s\", tas bort" + +#: utils/misc/guc.c:5308 +#, c-format +msgid "\"%s\" is now a reserved prefix." +msgstr "\"%s\" är nu ett reserverat prefix." + +#: utils/misc/guc.c:6179 +#, c-format +msgid "while setting parameter \"%s\" to \"%s\"" +msgstr "vid sättande av parameter \"%s\" till \"%s\"" + +#: utils/misc/guc.c:6348 +#, c-format +msgid "parameter \"%s\" could not be set" +msgstr "parameter \"%s\" kunde inte sättas" + +#: utils/misc/guc.c:6438 +#, c-format +msgid "could not parse setting for parameter \"%s\"" +msgstr "kunde inte tolka inställningen för parameter \"%s\"" + +#: utils/misc/guc.c:6888 +#, c-format +msgid "invalid value for parameter \"%s\": %g" +msgstr "ogiltigt värde för parameter \"%s\": %g" + +#: utils/misc/guc_funcs.c:54 +#, c-format +msgid "cannot set parameters during a parallel operation" +msgstr "kan inte sätta parametrar under en parallell operation" + +#: utils/misc/guc_funcs.c:130 +#, c-format +msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" +msgstr "SET LOCAL TRANSACTION SNAPSHOT är inte implementerat ännu" + +#: utils/misc/guc_funcs.c:218 +#, c-format +msgid "SET %s takes only one argument" +msgstr "SET %s tar bara ett argument" + +#: utils/misc/guc_funcs.c:342 #, c-format -msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" -msgstr "tecken med byte-sekvens %s i kodning \"%s\" har inget motsvarande i kodning \"%s\"" +msgid "SET requires parameter name" +msgstr "SET kräver ett parameternamn" -#: utils/misc/guc.c:776 +#: utils/misc/guc_tables.c:676 msgid "Ungrouped" msgstr "Ej grupperad" -#: utils/misc/guc.c:778 +#: utils/misc/guc_tables.c:677 msgid "File Locations" msgstr "Filplatser" -#: utils/misc/guc.c:780 +#: utils/misc/guc_tables.c:678 msgid "Connections and Authentication / Connection Settings" msgstr "Uppkopplingar och Autentisering / Uppkopplingsinställningar" -#: utils/misc/guc.c:782 +#: utils/misc/guc_tables.c:679 +msgid "Connections and Authentication / TCP Settings" +msgstr "Uppkopplingar och Autentisering / TCP-inställningar" + +#: utils/misc/guc_tables.c:680 msgid "Connections and Authentication / Authentication" msgstr "Uppkopplingar och Autentisering / Autentisering" -#: utils/misc/guc.c:784 +#: utils/misc/guc_tables.c:681 msgid "Connections and Authentication / SSL" msgstr "Uppkopplingar och Autentisering / SSL" -#: utils/misc/guc.c:786 +#: utils/misc/guc_tables.c:682 msgid "Resource Usage / Memory" msgstr "Resursanvändning / Minne" -#: utils/misc/guc.c:788 +#: utils/misc/guc_tables.c:683 msgid "Resource Usage / Disk" msgstr "Resursanvändning / Disk" -#: utils/misc/guc.c:790 +#: utils/misc/guc_tables.c:684 msgid "Resource Usage / Kernel Resources" msgstr "Resursanvändning / Kärnresurser" -#: utils/misc/guc.c:792 +#: utils/misc/guc_tables.c:685 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "Resursanvändning / Kostnadsbaserad Vacuum-fördröjning" -#: utils/misc/guc.c:794 +#: utils/misc/guc_tables.c:686 msgid "Resource Usage / Background Writer" msgstr "Resursanvändning / Bakgrundskrivare" -#: utils/misc/guc.c:796 +#: utils/misc/guc_tables.c:687 msgid "Resource Usage / Asynchronous Behavior" msgstr "Resursanvändning / Asynkront beteende" -#: utils/misc/guc.c:798 +#: utils/misc/guc_tables.c:688 msgid "Write-Ahead Log / Settings" msgstr "Write-Ahead Log / Inställningar" -#: utils/misc/guc.c:800 +#: utils/misc/guc_tables.c:689 msgid "Write-Ahead Log / Checkpoints" msgstr "Write-Ahead Log / Checkpoint:er" -#: utils/misc/guc.c:802 +#: utils/misc/guc_tables.c:690 msgid "Write-Ahead Log / Archiving" msgstr "Write-Ahead Log / Arkivering" -#: utils/misc/guc.c:804 +#: utils/misc/guc_tables.c:691 msgid "Write-Ahead Log / Recovery" msgstr "Write-Ahead Log / Ã…terställning" -#: utils/misc/guc.c:806 +#: utils/misc/guc_tables.c:692 msgid "Write-Ahead Log / Archive Recovery" msgstr "Write-Ahead Log / Ã…terställning frÃ¥n arkiv" -#: utils/misc/guc.c:808 +#: utils/misc/guc_tables.c:693 msgid "Write-Ahead Log / Recovery Target" msgstr "Write-Ahead Log / Ã…terställningsmÃ¥l" -#: utils/misc/guc.c:810 +#: utils/misc/guc_tables.c:694 +msgid "Write-Ahead Log / Summarization" +msgstr "Write-Ahead Log / Summering" + +#: utils/misc/guc_tables.c:695 msgid "Replication / Sending Servers" msgstr "Replilering / Skickande servrar" -#: utils/misc/guc.c:812 +#: utils/misc/guc_tables.c:696 msgid "Replication / Primary Server" msgstr "Replikering / Primärserver" -#: utils/misc/guc.c:814 +#: utils/misc/guc_tables.c:697 msgid "Replication / Standby Servers" msgstr "Replikering / Standby-servrar" -#: utils/misc/guc.c:816 +#: utils/misc/guc_tables.c:698 msgid "Replication / Subscribers" msgstr "Replikering / Prenumeranter" -#: utils/misc/guc.c:818 +#: utils/misc/guc_tables.c:699 msgid "Query Tuning / Planner Method Configuration" msgstr "FrÃ¥geoptimering / Planeringsmetodinställningar" -#: utils/misc/guc.c:820 +#: utils/misc/guc_tables.c:700 msgid "Query Tuning / Planner Cost Constants" msgstr "FrÃ¥geoptimering / Plannerarens kostnadskonstanter" -#: utils/misc/guc.c:822 +#: utils/misc/guc_tables.c:701 msgid "Query Tuning / Genetic Query Optimizer" msgstr "FrÃ¥geoptimering / Genetisk frÃ¥geoptimerare" -#: utils/misc/guc.c:824 +#: utils/misc/guc_tables.c:702 msgid "Query Tuning / Other Planner Options" msgstr "FrÃ¥geoptimering / Andra planeringsinställningar" -#: utils/misc/guc.c:826 +#: utils/misc/guc_tables.c:703 msgid "Reporting and Logging / Where to Log" msgstr "Rapportering och loggning / Logga var?" -#: utils/misc/guc.c:828 +#: utils/misc/guc_tables.c:704 msgid "Reporting and Logging / When to Log" msgstr "Rapportering och loggning / Logga när?" -#: utils/misc/guc.c:830 +#: utils/misc/guc_tables.c:705 msgid "Reporting and Logging / What to Log" msgstr "Rapportering och loggning / Logga vad?" -#: utils/misc/guc.c:832 +#: utils/misc/guc_tables.c:706 msgid "Reporting and Logging / Process Title" msgstr "Rapportering och loggning / Processtitel" -#: utils/misc/guc.c:834 +#: utils/misc/guc_tables.c:707 msgid "Statistics / Monitoring" msgstr "Statistik / Övervakning" -#: utils/misc/guc.c:836 +#: utils/misc/guc_tables.c:708 msgid "Statistics / Cumulative Query and Index Statistics" msgstr "Statistik / Ihopsamlad frÃ¥ge- och index-statistik" -#: utils/misc/guc.c:838 +#: utils/misc/guc_tables.c:709 msgid "Autovacuum" msgstr "Autovacuum" -#: utils/misc/guc.c:840 +#: utils/misc/guc_tables.c:710 msgid "Client Connection Defaults / Statement Behavior" msgstr "Standard för klientanslutning / Satsbeteende" -#: utils/misc/guc.c:842 +#: utils/misc/guc_tables.c:711 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Standard för klientanslutning / Lokal och formattering" -#: utils/misc/guc.c:844 +#: utils/misc/guc_tables.c:712 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Standard för klientanslutning / Förladdning av delat bibliotek" -#: utils/misc/guc.c:846 +#: utils/misc/guc_tables.c:713 msgid "Client Connection Defaults / Other Defaults" msgstr "Standard för klientanslutning / Övriga standardvärden" -#: utils/misc/guc.c:848 +#: utils/misc/guc_tables.c:714 msgid "Lock Management" msgstr "LÃ¥shantering" -#: utils/misc/guc.c:850 +#: utils/misc/guc_tables.c:715 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "Version och plattformskompabilitet / Tidigare PostrgreSQL-versioner" -#: utils/misc/guc.c:852 +#: utils/misc/guc_tables.c:716 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "Version och plattformskompabilitet / Andra plattformar och klienter" -#: utils/misc/guc.c:854 +#: utils/misc/guc_tables.c:717 msgid "Error Handling" msgstr "Felhantering" -#: utils/misc/guc.c:856 +#: utils/misc/guc_tables.c:718 msgid "Preset Options" msgstr "Förinställningsflaggor" -#: utils/misc/guc.c:858 +#: utils/misc/guc_tables.c:719 msgid "Customized Options" msgstr "Ändrade flaggor" -#: utils/misc/guc.c:860 +#: utils/misc/guc_tables.c:720 msgid "Developer Options" msgstr "Utvecklarflaggor" -#: utils/misc/guc.c:918 -msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." -msgstr "Giltiga enheter för denna parameter är \"B\", \"kB\", \"MB\", \"GB\" och \"TB\"." - -#: utils/misc/guc.c:955 -msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." -msgstr "Giltiga enheter för denna parameter är \"us\", \"ms\", \"s\", \"min\", \"h\" och \"d\"." - -#: utils/misc/guc.c:1017 +#: utils/misc/guc_tables.c:775 msgid "Enables the planner's use of sequential-scan plans." msgstr "Aktiverar planerarens användning av planer med sekvensiell skanning." -#: utils/misc/guc.c:1027 +#: utils/misc/guc_tables.c:785 msgid "Enables the planner's use of index-scan plans." msgstr "Aktiverar planerarens användning av planer med indexskanning." -#: utils/misc/guc.c:1037 +#: utils/misc/guc_tables.c:795 msgid "Enables the planner's use of index-only-scan plans." msgstr "Aktiverar planerarens användning av planer med skanning av enbart index." -#: utils/misc/guc.c:1047 +#: utils/misc/guc_tables.c:805 msgid "Enables the planner's use of bitmap-scan plans." msgstr "Aktiverar planerarens användning av planer med bitmapskanning." -#: utils/misc/guc.c:1057 +#: utils/misc/guc_tables.c:815 msgid "Enables the planner's use of TID scan plans." msgstr "Aktiverar planerarens användning av planer med TID-skanning." -#: utils/misc/guc.c:1067 +#: utils/misc/guc_tables.c:825 msgid "Enables the planner's use of explicit sort steps." msgstr "SlÃ¥r pÃ¥ planerarens användning av explicita sorteringssteg." -#: utils/misc/guc.c:1077 +#: utils/misc/guc_tables.c:835 msgid "Enables the planner's use of incremental sort steps." msgstr "Aktiverar planerarens användning av inkrementella sorteringssteg." -#: utils/misc/guc.c:1087 +#: utils/misc/guc_tables.c:845 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Aktiverar planerarens användning av planer med hash-aggregering" -#: utils/misc/guc.c:1097 +#: utils/misc/guc_tables.c:855 msgid "Enables the planner's use of materialization." msgstr "Aktiverar planerarens användning av materialisering." -#: utils/misc/guc.c:1107 +#: utils/misc/guc_tables.c:865 msgid "Enables the planner's use of memoization." msgstr "Aktiverar planerarens användning av memoization." -#: utils/misc/guc.c:1117 +#: utils/misc/guc_tables.c:875 msgid "Enables the planner's use of nested-loop join plans." msgstr "Aktiverar planerarens användning av planer med nästlad loop-join," -#: utils/misc/guc.c:1127 +#: utils/misc/guc_tables.c:885 msgid "Enables the planner's use of merge join plans." msgstr "Aktiverar planerarens användning av merge-join-planer." -#: utils/misc/guc.c:1137 +#: utils/misc/guc_tables.c:895 msgid "Enables the planner's use of hash join plans." msgstr "Aktiverar planerarens användning av hash-join-planer." -#: utils/misc/guc.c:1147 +#: utils/misc/guc_tables.c:905 msgid "Enables the planner's use of gather merge plans." msgstr "Aktiverar planerarens användning av planer med gather-merge." -#: utils/misc/guc.c:1157 +#: utils/misc/guc_tables.c:915 msgid "Enables partitionwise join." msgstr "Aktiverar join per partition." -#: utils/misc/guc.c:1167 +#: utils/misc/guc_tables.c:925 msgid "Enables partitionwise aggregation and grouping." msgstr "Aktiverar aggregering och gruppering per partition." -#: utils/misc/guc.c:1177 +#: utils/misc/guc_tables.c:935 msgid "Enables the planner's use of parallel append plans." msgstr "Aktiverar planerarens användning av planer med parallell append." -#: utils/misc/guc.c:1187 +#: utils/misc/guc_tables.c:945 msgid "Enables the planner's use of parallel hash plans." msgstr "Aktiverar planerarens användning av planer med parallell hash." -#: utils/misc/guc.c:1197 +#: utils/misc/guc_tables.c:955 msgid "Enables plan-time and execution-time partition pruning." msgstr "Aktiverar rensning av partitioner vid planering och vid körning." -#: utils/misc/guc.c:1198 +#: utils/misc/guc_tables.c:956 msgid "Allows the query planner and executor to compare partition bounds to conditions in the query to determine which partitions must be scanned." msgstr "TillÃ¥ter att frÃ¥geplaneraren och exekveraren jämför partitionsgränser med villkor i frÃ¥gan för att bestämma vilka partitioner som skall skannas." -#: utils/misc/guc.c:1209 +#: utils/misc/guc_tables.c:967 +msgid "Enables the planner's ability to produce plans that provide presorted input for ORDER BY / DISTINCT aggregate functions." +msgstr "SlÃ¥r pÃ¥ planerarens möjlighet att skapa planer som tillhandahÃ¥ller försorterad indata till aggregatfunktioner med ORDER BY / DISTINCT." + +#: utils/misc/guc_tables.c:970 +msgid "Allows the query planner to build plans that provide presorted input for aggregate functions with an ORDER BY / DISTINCT clause. When disabled, implicit sorts are always performed during execution." +msgstr "TillÃ¥ter att planeraren kan skapa planer som tillhandahÃ¥ller försorterad indata till aggregatfunktioner med en ORDER BY / DISTINCT-klausul. Om avstängd sÃ¥ kommer implicita sorteringar alltid utföras vid exekvering." + +#: utils/misc/guc_tables.c:982 msgid "Enables the planner's use of async append plans." msgstr "Aktiverar planerarens användning av planer med async append." -#: utils/misc/guc.c:1219 +#: utils/misc/guc_tables.c:992 +msgid "Enables reordering of GROUP BY keys." +msgstr "Aktiverar omkastning av nycklar i GROUP BY." + +#: utils/misc/guc_tables.c:1002 msgid "Enables genetic query optimization." msgstr "Aktiverar genetisk frÃ¥geoptimering." -#: utils/misc/guc.c:1220 +#: utils/misc/guc_tables.c:1003 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Denna algoritm försöker utföra planering utan fullständig sökning." -#: utils/misc/guc.c:1231 +#: utils/misc/guc_tables.c:1017 msgid "Shows whether the current user is a superuser." msgstr "Visar om den aktuella användaren är en superuser." -#: utils/misc/guc.c:1241 +#: utils/misc/guc_tables.c:1032 +msgid "Allows running the ALTER SYSTEM command." +msgstr "TillÃ¥ter att kommandot ALTER SYSTEM körs." + +#: utils/misc/guc_tables.c:1033 +msgid "Can be set to off for environments where global configuration changes should be made using a different method." +msgstr "Kan sättas till av för miljöer där global konfiguration skall hanteras pÃ¥ annat sätt." + +#: utils/misc/guc_tables.c:1043 msgid "Enables advertising the server via Bonjour." msgstr "Aktiverar annonsering av servern via Bonjour." -#: utils/misc/guc.c:1250 +#: utils/misc/guc_tables.c:1052 msgid "Collects transaction commit time." msgstr "Samlar in tid för transaktions-commit." -#: utils/misc/guc.c:1259 +#: utils/misc/guc_tables.c:1061 msgid "Enables SSL connections." msgstr "TillÃ¥ter SSL-anslutningar." -#: utils/misc/guc.c:1268 -msgid "Controls whether ssl_passphrase_command is called during server reload." -msgstr "Styr hurvida ssl_passphrase_command anropas vid omladdning av server." +#: utils/misc/guc_tables.c:1070 +msgid "Controls whether \"ssl_passphrase_command\" is called during server reload." +msgstr "Styr hurvida \"ssl_passphrase_command\" anropas vid omladdning av server." -#: utils/misc/guc.c:1277 +#: utils/misc/guc_tables.c:1079 msgid "Give priority to server ciphersuite order." msgstr "Ge prioritet till serverns ordning av kryptometoder." -#: utils/misc/guc.c:1286 +#: utils/misc/guc_tables.c:1088 msgid "Forces synchronization of updates to disk." msgstr "Tvingar synkronisering av uppdateringar till disk." -#: utils/misc/guc.c:1287 -msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This insures that a database cluster will recover to a consistent state after an operating system or hardware crash." +#: utils/misc/guc_tables.c:1089 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." msgstr "Servern kommer använda systemanropet fsync() pÃ¥ ett antal platser för att se till att uppdateringar fysiskt skrivs till disk. Detta för att säkerställa att databasklustret kan starta i ett konsistent tillstÃ¥nd efter en operativsystemkrash eller hÃ¥rdvarukrash." -#: utils/misc/guc.c:1298 +#: utils/misc/guc_tables.c:1100 msgid "Continues processing after a checksum failure." msgstr "Fortsätter processande efter checksummefel." -#: utils/misc/guc.c:1299 +#: utils/misc/guc_tables.c:1101 msgid "Detection of a checksum failure normally causes PostgreSQL to report an error, aborting the current transaction. Setting ignore_checksum_failure to true causes the system to ignore the failure (but still report a warning), and continue processing. This behavior could cause crashes or other serious problems. Only has an effect if checksums are enabled." msgstr "Normalt vid detektion av checksummefel sÃ¥ rapporterar PostgreSQL felet och avbryter den aktuella transaktionen. Sätts ignore_checksum_failure till true sÃ¥ kommer systemet hoppa över felet (men fortfarande rapportera en varning). Detta beteende kan orsaka krasher eller andra allvarliga problem. Detta pÃ¥verkas bara om checksummor är pÃ¥slaget." -#: utils/misc/guc.c:1313 +#: utils/misc/guc_tables.c:1115 msgid "Continues processing past damaged page headers." msgstr "Fortsätter processande efter trasiga sidhuvuden." -#: utils/misc/guc.c:1314 -msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting zero_damaged_pages to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." -msgstr "Normalt vid detektion av trasiga sidhuvuden sÃ¥ rapporterar PostgreSQL felet och avbryter den aktuella transaktionen. Sätts zero_damaged_pages till true sÃ¥ kommer systemet istället rapportera en varning, nollställa den trasiga sidan samt fortsätta processa. Detta kommer förstöra data (alla rader i den trasiga sidan)." +#: utils/misc/guc_tables.c:1116 +msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting \"zero_damaged_pages\" to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." +msgstr "Normalt vid detektion av trasiga sidhuvuden sÃ¥ rapporterar PostgreSQL felet och avbryter den aktuella transaktionen. Sätts \"zero_damaged_pages\" till true sÃ¥ kommer systemet istället rapportera en varning, nollställa den trasiga sidan samt fortsätta processa. Detta kommer förstöra data (alla rader i den trasiga sidan)." -#: utils/misc/guc.c:1327 +#: utils/misc/guc_tables.c:1129 msgid "Continues recovery after an invalid pages failure." msgstr "Fortsätter Ã¥terställande efter fel pÃ¥ grund av ogiltiga sidor." -#: utils/misc/guc.c:1328 -msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting ignore_invalid_pages to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." -msgstr "Normalt vid detektion av WAL-poster som refererar till ogiltiga sidor under Ã¥terställning sÃ¥ kommer PostgreSQL att signalera ett fel pÃ¥ PANIC-nivÃ¥ och avbryta Ã¥terställningen. Sätts ignore_invalid_pages till true sÃ¥ kommer systemet hoppa över ogiltiga sidreferenser i WAL-poster (men fortfarande rapportera en varning) och fortsätta Ã¥terställningen. Detta beteende kan orsaka krasher, dataförluster, sprida eller dölja korruption eller ge andra allvarliga problem. Detta pÃ¥verkar bara under Ã¥terställning eller i standby-läge." +#: utils/misc/guc_tables.c:1130 +msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting \"ignore_invalid_pages\" to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." +msgstr "Normalt vid detektion av WAL-poster som refererar till ogiltiga sidor under Ã¥terställning sÃ¥ kommer PostgreSQL att signalera ett fel pÃ¥ PANIC-nivÃ¥ och avbryta Ã¥terställningen. Sätts \"ignore_invalid_pages\" till true sÃ¥ kommer systemet hoppa över ogiltiga sidreferenser i WAL-poster (men fortfarande rapportera en varning) och fortsätta Ã¥terställningen. Detta beteende kan orsaka krasher, dataförluster, sprida eller dölja korruption eller ge andra allvarliga problem. Detta pÃ¥verkar bara under Ã¥terställning eller i standby-läge." -#: utils/misc/guc.c:1346 +#: utils/misc/guc_tables.c:1148 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "Skriver fulla sidor till WAL första gÃ¥ngen de ändras efter en checkpoint." -#: utils/misc/guc.c:1347 +#: utils/misc/guc_tables.c:1149 msgid "A page write in process during an operating system crash might be only partially written to disk. During recovery, the row changes stored in WAL are not enough to recover. This option writes pages when first modified after a checkpoint to WAL so full recovery is possible." msgstr "En sidskrivning som sker vid en operativsystemkrash kan bli delvis utskriven till disk. Under Ã¥terställning sÃ¥ kommer radändringar i WAL:en inte vara tillräckligt för att Ã¥terställa datan. Denna flagga skriver ut sidor först efter att en WAL-checkpoint gjorts vilket gör att full Ã¥terställning kan ske." -#: utils/misc/guc.c:1360 +#: utils/misc/guc_tables.c:1162 msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." msgstr "Skriver fulla sidor till WAL första gÃ¥ngen de ändras efter en checkpoint, även för ickekritisk ändring." -#: utils/misc/guc.c:1370 +#: utils/misc/guc_tables.c:1172 msgid "Writes zeroes to new WAL files before first use." msgstr "Skriv nollor till nya WAL-filer innan första användning." -#: utils/misc/guc.c:1380 +#: utils/misc/guc_tables.c:1182 msgid "Recycles WAL files by renaming them." msgstr "Ã…teranvänder WAL-filer genom att byta namn pÃ¥ dem." -#: utils/misc/guc.c:1390 +#: utils/misc/guc_tables.c:1192 msgid "Logs each checkpoint." msgstr "Logga varje checkpoint." -#: utils/misc/guc.c:1399 +#: utils/misc/guc_tables.c:1201 msgid "Logs each successful connection." msgstr "Logga varje lyckad anslutning." -#: utils/misc/guc.c:1408 +#: utils/misc/guc_tables.c:1210 +msgid "Logs details of pre-authentication connection handshake." +msgstr "Logga detaljer om anslutningshandskakning före autentisering." + +#: utils/misc/guc_tables.c:1220 msgid "Logs end of a session, including duration." msgstr "Loggar slut pÃ¥ session, inklusive längden." -#: utils/misc/guc.c:1417 +#: utils/misc/guc_tables.c:1229 msgid "Logs each replication command." msgstr "Loggar alla replikeringskommanon." -#: utils/misc/guc.c:1426 +#: utils/misc/guc_tables.c:1238 msgid "Shows whether the running server has assertion checks enabled." msgstr "Visar om den körande servern har assert-kontroller pÃ¥slagna." -#: utils/misc/guc.c:1441 +#: utils/misc/guc_tables.c:1249 msgid "Terminate session on any error." msgstr "Avbryt sessionen vid fel." -#: utils/misc/guc.c:1450 +#: utils/misc/guc_tables.c:1258 msgid "Reinitialize server after backend crash." msgstr "Ã…terinitiera servern efter en backend-krash." -#: utils/misc/guc.c:1459 +#: utils/misc/guc_tables.c:1267 msgid "Remove temporary files after backend crash." msgstr "Ta bort temporära filer efter en backend-krash." -#: utils/misc/guc.c:1470 +#: utils/misc/guc_tables.c:1277 +msgid "Send SIGABRT not SIGQUIT to child processes after backend crash." +msgstr "Skicka SIGABRT och inte SIGQUIT till barnprocesser efter att backend:en krashat." + +#: utils/misc/guc_tables.c:1287 +msgid "Send SIGABRT not SIGKILL to stuck child processes." +msgstr "Skicka SIGABRT och inte SIGKILL till barnprocesser som fastnat." + +#: utils/misc/guc_tables.c:1298 msgid "Logs the duration of each completed SQL statement." msgstr "Loggar tiden för varje avslutad SQL-sats." -#: utils/misc/guc.c:1479 +#: utils/misc/guc_tables.c:1307 msgid "Logs each query's parse tree." msgstr "Loggar alla frÃ¥gors parse-träd." -#: utils/misc/guc.c:1488 +#: utils/misc/guc_tables.c:1316 msgid "Logs each query's rewritten parse tree." msgstr "Logga alla frÃ¥gors omskrivet parse-träd." -#: utils/misc/guc.c:1497 +#: utils/misc/guc_tables.c:1325 msgid "Logs each query's execution plan." msgstr "Logga alla frÃ¥gors körningsplan." -#: utils/misc/guc.c:1506 +#: utils/misc/guc_tables.c:1334 msgid "Indents parse and plan tree displays." msgstr "Indentera parse och planeringsträdutskrifter" -#: utils/misc/guc.c:1515 +#: utils/misc/guc_tables.c:1343 msgid "Writes parser performance statistics to the server log." msgstr "Skriver parserns prestandastatistik till serverloggen." -#: utils/misc/guc.c:1524 +#: utils/misc/guc_tables.c:1352 msgid "Writes planner performance statistics to the server log." msgstr "Skriver planerarens prestandastatistik till serverloggen." -#: utils/misc/guc.c:1533 +#: utils/misc/guc_tables.c:1361 msgid "Writes executor performance statistics to the server log." msgstr "Skrivere exekverarens prestandastatistik till serverloggen." -#: utils/misc/guc.c:1542 +#: utils/misc/guc_tables.c:1370 msgid "Writes cumulative performance statistics to the server log." msgstr "Skriver ackumulerad prestandastatistik till serverloggen." -#: utils/misc/guc.c:1552 +#: utils/misc/guc_tables.c:1380 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "Loggar statisik för användning av systemresurser (minne och CPU) för olika B-tree-operationer." -#: utils/misc/guc.c:1564 +#: utils/misc/guc_tables.c:1392 msgid "Collects information about executing commands." msgstr "Samla information om körda kommanon." -#: utils/misc/guc.c:1565 +#: utils/misc/guc_tables.c:1393 msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." msgstr "SlÃ¥r pÃ¥ insamling av information om det nu körande kommandot för varje session, tillsammans med klockslaget när det kommandot började köra." -#: utils/misc/guc.c:1575 +#: utils/misc/guc_tables.c:1403 msgid "Collects statistics on database activity." msgstr "Samla in statistik om databasaktivitet." -#: utils/misc/guc.c:1584 +#: utils/misc/guc_tables.c:1412 msgid "Collects timing statistics for database I/O activity." msgstr "Samla in timingstatistik om databasens I/O-aktivitet." -#: utils/misc/guc.c:1593 +#: utils/misc/guc_tables.c:1421 msgid "Collects timing statistics for WAL I/O activity." msgstr "Samla in timingstatistik om I/O-aktivitet för WAL." -#: utils/misc/guc.c:1603 +#: utils/misc/guc_tables.c:1431 msgid "Updates the process title to show the active SQL command." msgstr "Uppdaterar processtitel till att visa aktivt SQL-kommando." -#: utils/misc/guc.c:1604 +#: utils/misc/guc_tables.c:1432 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "SlÃ¥r pÃ¥ uppdatering av processtiteln varje gÃ¥ng ett nytt SQL-kommando tas emot av servern." -#: utils/misc/guc.c:1617 +#: utils/misc/guc_tables.c:1441 msgid "Starts the autovacuum subprocess." msgstr "Starta autovacuum-barnprocess." -#: utils/misc/guc.c:1627 +#: utils/misc/guc_tables.c:1451 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Skapar debug-output för LISTEN och NOTIFY." -#: utils/misc/guc.c:1639 +#: utils/misc/guc_tables.c:1463 msgid "Emits information about lock usage." msgstr "Visar information om lÃ¥sanvändning." -#: utils/misc/guc.c:1649 +#: utils/misc/guc_tables.c:1473 msgid "Emits information about user lock usage." msgstr "Visar information om användares lÃ¥sanvändning." -#: utils/misc/guc.c:1659 +#: utils/misc/guc_tables.c:1483 msgid "Emits information about lightweight lock usage." msgstr "Visar information om lättviktig lÃ¥sanvändning." -#: utils/misc/guc.c:1669 +#: utils/misc/guc_tables.c:1493 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "Dumpar information om alla aktuella lÃ¥s när en deadlock-timeout sker." -#: utils/misc/guc.c:1681 +#: utils/misc/guc_tables.c:1505 msgid "Logs long lock waits." msgstr "Loggar lÃ¥nga väntetider pÃ¥ lÃ¥s." -#: utils/misc/guc.c:1690 +#: utils/misc/guc_tables.c:1514 msgid "Logs standby recovery conflict waits." msgstr "Loggar väntande pÃ¥ Ã¥terställningskonflikter i standby" -#: utils/misc/guc.c:1699 +#: utils/misc/guc_tables.c:1523 msgid "Logs the host name in the connection logs." msgstr "Loggar hostnamnet i anslutningsloggen." -#: utils/misc/guc.c:1700 +#: utils/misc/guc_tables.c:1524 msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." msgstr "Som standard visar anslutningsloggen bara IP-adressen för den anslutande värden. Om du vill att värdnamnet skall visas sÃ¥ kan du slÃ¥ pÃ¥ detta men beroende pÃ¥ hur uppsättningen av namnuppslag är gjored sÃ¥ kan detta ha en markant prestandapÃ¥verkan." -#: utils/misc/guc.c:1711 +#: utils/misc/guc_tables.c:1535 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Tolkar \"uttryck=NULL\" som \"uttryck IS NULL\"." -#: utils/misc/guc.c:1712 +#: utils/misc/guc_tables.c:1536 msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." msgstr "Om pÃ¥slagen sÃ¥ kommer uttryck pÃ¥ formen uttryck = NULL (eller NULL = uttryck) att behandlas som uttryck IS NULL, det vill säga returnera true om uttryck evalueras till värdet null eller evalueras till false annars. Det korrekta beteendet för uttryck = NULL är att alltid returnera null (okänt)." -#: utils/misc/guc.c:1724 -msgid "Enables per-database user names." -msgstr "Aktiverar användarnamn per databas." - -#: utils/misc/guc.c:1733 +#: utils/misc/guc_tables.c:1548 msgid "Sets the default read-only status of new transactions." msgstr "Ställer in standard read-only-status för nya transaktioner." -#: utils/misc/guc.c:1743 +#: utils/misc/guc_tables.c:1558 msgid "Sets the current transaction's read-only status." msgstr "Ställer in nuvarande transaktions read-only-status." -#: utils/misc/guc.c:1753 +#: utils/misc/guc_tables.c:1568 msgid "Sets the default deferrable status of new transactions." msgstr "Ställer in standard deferrable-status för nya transaktioner." -#: utils/misc/guc.c:1762 +#: utils/misc/guc_tables.c:1577 msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." msgstr "Bestämmer om en serialiserbar transaktion för läsning kommer fördröjas tills den kan köras utan serialiseringsfel." -#: utils/misc/guc.c:1772 +#: utils/misc/guc_tables.c:1587 msgid "Enable row security." msgstr "Aktiverar radsäkerhet." -#: utils/misc/guc.c:1773 +#: utils/misc/guc_tables.c:1588 msgid "When enabled, row security will be applied to all users." msgstr "Om aktiv sÃ¥ kommer radsäkerhet användas för alla användare." -#: utils/misc/guc.c:1781 +#: utils/misc/guc_tables.c:1596 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "Kontrollera funktionskroppen vid CREATE FUNCTION och CREATE PROCEDURE." -#: utils/misc/guc.c:1790 +#: utils/misc/guc_tables.c:1605 msgid "Enable input of NULL elements in arrays." msgstr "Aktiverar inmatning av NULL-element i arrayer." -#: utils/misc/guc.c:1791 +#: utils/misc/guc_tables.c:1606 msgid "When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally." msgstr "Om pÃ¥slagen sÃ¥ kommer ej citerade NULL i indatavärden för en array betyda värdet null, annars tolkas det bokstavligt." -#: utils/misc/guc.c:1807 +#: utils/misc/guc_tables.c:1622 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS stöds inte längre; denna kan bara vara false." -#: utils/misc/guc.c:1817 -msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." -msgstr "Starta en subprocess för att fÃ¥nga output frÃ¥n stderr och/eller csv-loggar till loggfiler." +#: utils/misc/guc_tables.c:1632 +msgid "Start a subprocess to capture stderr, csvlog and/or jsonlog into log files." +msgstr "Starta en subprocess för att fÃ¥nga stderr, csvlog och/eller jsonlog till loggfiler." -#: utils/misc/guc.c:1826 +#: utils/misc/guc_tables.c:1641 msgid "Truncate existing log files of same name during log rotation." msgstr "Trunkera existerande loggfiler med samma namn under loggrotering." -#: utils/misc/guc.c:1837 +#: utils/misc/guc_tables.c:1652 msgid "Emit information about resource usage in sorting." msgstr "Skicka ut information om resursanvändning vid sortering." -#: utils/misc/guc.c:1851 +#: utils/misc/guc_tables.c:1666 msgid "Generate debugging output for synchronized scanning." msgstr "Generera debug-output för synkroniserad skanning." -#: utils/misc/guc.c:1866 +#: utils/misc/guc_tables.c:1681 msgid "Enable bounded sorting using heap sort." msgstr "SlÃ¥r pÃ¥ begränsad sortering med heap-sort." -#: utils/misc/guc.c:1879 +#: utils/misc/guc_tables.c:1694 msgid "Emit WAL-related debugging output." msgstr "Skicka ut WAL-relaterad debug-data." -#: utils/misc/guc.c:1891 +#: utils/misc/guc_tables.c:1706 msgid "Shows whether datetimes are integer based." msgstr "Visa hurvida datetime är heltalsbaserad" -#: utils/misc/guc.c:1902 +#: utils/misc/guc_tables.c:1717 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "Anger hurvida Kerberos- och GSSAPI-användarnamn skall tolkas skiftlägesokänsligt." -#: utils/misc/guc.c:1912 +#: utils/misc/guc_tables.c:1727 +msgid "Sets whether GSSAPI delegation should be accepted from the client." +msgstr "Anger hurvida GSSAPI-delegering skall accpeteras frÃ¥n klienten." + +#: utils/misc/guc_tables.c:1737 msgid "Warn about backslash escapes in ordinary string literals." msgstr "Varna om backÃ¥tstreck-escape i vanliga stränglitteraler." -#: utils/misc/guc.c:1922 +#: utils/misc/guc_tables.c:1747 msgid "Causes '...' strings to treat backslashes literally." msgstr "Gör att '...'-stängar tolkar bakÃ¥tstreck bokstavligt." -#: utils/misc/guc.c:1933 +#: utils/misc/guc_tables.c:1758 msgid "Enable synchronized sequential scans." msgstr "SlÃ¥ pÃ¥ synkroniserad sekvensiell skanning." -#: utils/misc/guc.c:1943 +#: utils/misc/guc_tables.c:1768 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "Anger hurvida man skall inkludera eller exkludera transaktion för Ã¥terställningmÃ¥l." -#: utils/misc/guc.c:1953 +#: utils/misc/guc_tables.c:1778 +msgid "Starts the WAL summarizer process to enable incremental backup." +msgstr "Startar process för WAL-summering för att tillÃ¥ta inkrementella backuper." + +#: utils/misc/guc_tables.c:1788 msgid "Allows connections and queries during recovery." msgstr "TillÃ¥t anslutningar och frÃ¥gor under Ã¥terställning." -#: utils/misc/guc.c:1963 +#: utils/misc/guc_tables.c:1798 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "TillÃ¥ter feedback frÃ¥n en hot standby till primären för att undvika frÃ¥gekonflikter." -#: utils/misc/guc.c:1973 +#: utils/misc/guc_tables.c:1808 msgid "Shows whether hot standby is currently active." msgstr "Visar hurvida hot standby är aktiv för närvarande." -#: utils/misc/guc.c:1984 +#: utils/misc/guc_tables.c:1819 msgid "Allows modifications of the structure of system tables." msgstr "TillÃ¥ter strukturförändringar av systemtabeller." -#: utils/misc/guc.c:1995 +#: utils/misc/guc_tables.c:1830 msgid "Disables reading from system indexes." msgstr "Stänger av läsning frÃ¥n systemindex." -#: utils/misc/guc.c:1996 +#: utils/misc/guc_tables.c:1831 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "Det förhindrar inte uppdatering av index sÃ¥ det är helt säkert att använda. Det värsta som kan hända är att det är lÃ¥ngsamt." -#: utils/misc/guc.c:2007 +#: utils/misc/guc_tables.c:1842 msgid "Allows tablespaces directly inside pg_tblspc, for testing." msgstr "TillÃ¥ter tabellutrymmen direkt inuti pg_tblspc, för testning" -#: utils/misc/guc.c:2018 +#: utils/misc/guc_tables.c:1853 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "SlÃ¥r pÃ¥ bakÃ¥tkompabilitetsläge för rättighetskontroller pÃ¥ stora objekt." -#: utils/misc/guc.c:2019 +#: utils/misc/guc_tables.c:1854 msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." msgstr "Hoppar över rättighetskontroller vid läsning eller modifiering av stora objekt, för kompabilitet med PostgreSQL-releaser innan 9.0." -#: utils/misc/guc.c:2029 +#: utils/misc/guc_tables.c:1864 msgid "When generating SQL fragments, quote all identifiers." msgstr "När SQL-fragment genereras sÃ¥ citera alla identifierare." -#: utils/misc/guc.c:2039 +#: utils/misc/guc_tables.c:1874 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Visar om datachecksummor är pÃ¥slagna för detta kluster." -#: utils/misc/guc.c:2050 +#: utils/misc/guc_tables.c:1885 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "Lägg till sekvensnummer till syslog-meddelanden för att undvika att duplikat tas bort." -#: utils/misc/guc.c:2060 +#: utils/misc/guc_tables.c:1895 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "Dela meddelanden som skickas till syslog till egna rader och begränsa till 1024 byte." -#: utils/misc/guc.c:2070 +#: utils/misc/guc_tables.c:1905 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Bestämmer om \"Gather\" och \"Gather Merge\" ocksÃ¥ exekverar subplaner." -#: utils/misc/guc.c:2071 +#: utils/misc/guc_tables.c:1906 msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "Skall gather-noder ocksÃ¥ exekvera subplaner eller bara samla in tupler?" -#: utils/misc/guc.c:2081 +#: utils/misc/guc_tables.c:1916 msgid "Allow JIT compilation." msgstr "TillÃ¥t JIT-kompilering." -#: utils/misc/guc.c:2092 +#: utils/misc/guc_tables.c:1927 msgid "Register JIT-compiled functions with debugger." msgstr "Registrera JIT-kompilerade funktioner hos debuggern." -#: utils/misc/guc.c:2109 +#: utils/misc/guc_tables.c:1944 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Skriv ut LLVM-bitkod för att möjliggöra JIT-debuggning." -#: utils/misc/guc.c:2120 +#: utils/misc/guc_tables.c:1955 msgid "Allow JIT compilation of expressions." msgstr "TillÃ¥t JIT-kompilering av uttryck." -#: utils/misc/guc.c:2131 +#: utils/misc/guc_tables.c:1966 msgid "Register JIT-compiled functions with perf profiler." msgstr "Registrera JIT-kompilerade funktioner med perf-profilerare." -#: utils/misc/guc.c:2148 +#: utils/misc/guc_tables.c:1983 msgid "Allow JIT compilation of tuple deforming." msgstr "TillÃ¥t JIT-kompilering av tupeluppdelning." -#: utils/misc/guc.c:2159 +#: utils/misc/guc_tables.c:1994 msgid "Whether to continue running after a failure to sync data files." msgstr "Hurvida vi skall fortsätta efter ett fel att synka datafiler." -#: utils/misc/guc.c:2168 +#: utils/misc/guc_tables.c:2003 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "Anger hurvida en WAL-mottagare skall skapa en temporär replikeringsslot om ingen permanent slot är konfigurerad." -#: utils/misc/guc.c:2186 +#: utils/misc/guc_tables.c:2012 +msgid "Enables event triggers." +msgstr "Aktiverar händelsetriggrar." + +#: utils/misc/guc_tables.c:2013 +msgid "When enabled, event triggers will fire for all applicable statements." +msgstr "Om aktiverad sÃ¥ kommer händelsetriggrar anropas för alla satser där det gÃ¥r." + +#: utils/misc/guc_tables.c:2022 +msgid "Enables a physical standby to synchronize logical failover replication slots from the primary server." +msgstr "TillÃ¥ter att en fysisk standby synkroniserar logiska replikeringsslottar för failover frÃ¥n primära servern." + +#: utils/misc/guc_tables.c:2040 msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." msgstr "Sätter tiden vi väntar innan vi tvingar ett byte till nästa WAL-fil." -#: utils/misc/guc.c:2197 +#: utils/misc/guc_tables.c:2051 msgid "Sets the amount of time to wait after authentication on connection startup." msgstr "Sätter tiden att vänta efter authentiserng vid uppstart av anslutningen." -#: utils/misc/guc.c:2199 utils/misc/guc.c:2820 +#: utils/misc/guc_tables.c:2053 utils/misc/guc_tables.c:2780 msgid "This allows attaching a debugger to the process." msgstr "Detta tillÃ¥ter att man ansluter en debugger till processen." -#: utils/misc/guc.c:2208 +#: utils/misc/guc_tables.c:2062 msgid "Sets the default statistics target." msgstr "Sätter standardstatistikmÃ¥let." -#: utils/misc/guc.c:2209 +#: utils/misc/guc_tables.c:2063 msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." msgstr "Detta gäller tabellkolumner som inte har ett kolumnspecifikt mÃ¥l satt med ALTER TABLE SET STATISTICS." -#: utils/misc/guc.c:2218 +#: utils/misc/guc_tables.c:2072 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "Sätter en övre gräns pÃ¥ FROM-listans storlek där subfrÃ¥gor slÃ¥s isär." -#: utils/misc/guc.c:2220 +#: utils/misc/guc_tables.c:2074 msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." msgstr "Planeraren kommer slÃ¥ samman subfrÃ¥gor med yttre frÃ¥gor om den resulterande FROM-listan inte har fler än sÃ¥ här mÃ¥nga poster." -#: utils/misc/guc.c:2231 +#: utils/misc/guc_tables.c:2085 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "Sätter en övre gräns pÃ¥ FROM-listans storlek där JOIN-konstruktioner plattas till." -#: utils/misc/guc.c:2233 +#: utils/misc/guc_tables.c:2087 msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." msgstr "Planeraren kommer platta till explicita JOIN-konstruktioner till listor av FROM-poster när resultatet blir en lista med max sÃ¥ här mÃ¥nga poster." -#: utils/misc/guc.c:2244 +#: utils/misc/guc_tables.c:2098 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "Sätter en undre gräns pÃ¥ antal FROM-poster när GEQO används." -#: utils/misc/guc.c:2254 +#: utils/misc/guc_tables.c:2108 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: effort används som standard för andra GEQO-parametrar." -#: utils/misc/guc.c:2264 +#: utils/misc/guc_tables.c:2118 msgid "GEQO: number of individuals in the population." msgstr "GEQO: antal individer i populationen." -#: utils/misc/guc.c:2265 utils/misc/guc.c:2275 +#: utils/misc/guc_tables.c:2119 utils/misc/guc_tables.c:2129 msgid "Zero selects a suitable default value." msgstr "Noll väljer ett lämpligt standardvärde." -#: utils/misc/guc.c:2274 +#: utils/misc/guc_tables.c:2128 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: antal iterationer för algoritmen." -#: utils/misc/guc.c:2286 +#: utils/misc/guc_tables.c:2140 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Sätter tiden som väntas pÃ¥ ett lÃ¥s innan kontroll av deadlock sker." -#: utils/misc/guc.c:2297 +#: utils/misc/guc_tables.c:2151 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "Sätter maximal fördröjning innan frÃ¥gor avbryts när en \"hot standby\"-server processar arkiverad WAL-data." -#: utils/misc/guc.c:2308 +#: utils/misc/guc_tables.c:2162 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "Sätter maximal fördröjning innan frÃ¥gor avbryts när en \"hot stanby\"-server processar strömmad WAL-data." -#: utils/misc/guc.c:2319 +#: utils/misc/guc_tables.c:2173 msgid "Sets the minimum delay for applying changes during recovery." msgstr "Ställer in minsta fördröjning för att applicera ändringar under Ã¥terställning." -#: utils/misc/guc.c:2330 +#: utils/misc/guc_tables.c:2184 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "Sätter maximalt intervall mellan statusrapporter till skickande server frÃ¥n WAL-mottagaren." -#: utils/misc/guc.c:2341 +#: utils/misc/guc_tables.c:2195 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "Sätter maximal väntetid för att ta emot data frÃ¥n skickande server." -#: utils/misc/guc.c:2352 +#: utils/misc/guc_tables.c:2206 msgid "Sets the maximum number of concurrent connections." msgstr "Sätter maximalt antal samtidiga anslutningar." -#: utils/misc/guc.c:2363 +#: utils/misc/guc_tables.c:2217 msgid "Sets the number of connection slots reserved for superusers." msgstr "Sätter antalet anslutningsslottar som reserverats för superusers." -#: utils/misc/guc.c:2373 +#: utils/misc/guc_tables.c:2227 +msgid "Sets the number of connection slots reserved for roles with privileges of pg_use_reserved_connections." +msgstr "Sätter antalet anslutningsslottar som reserverats för roller med rättigheter frÃ¥n pg_use_reserved_connections." + +#: utils/misc/guc_tables.c:2238 msgid "Amount of dynamic shared memory reserved at startup." msgstr "Mängd dynamiskt delat minne som reserveras vid uppstart" -#: utils/misc/guc.c:2388 +#: utils/misc/guc_tables.c:2253 msgid "Sets the number of shared memory buffers used by the server." msgstr "Sätter antalet delade minnesbuffrar som används av servern." -#: utils/misc/guc.c:2399 +#: utils/misc/guc_tables.c:2264 +msgid "Sets the buffer pool size for VACUUM, ANALYZE, and autovacuum." +msgstr "Sätter buffer-poolens storlek för VACUUM, ANALYZE och autovacuum." + +#: utils/misc/guc_tables.c:2275 msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." msgstr "Visa storlek pÃ¥ serverns huvudsakliga delade minnesarea (avrundat upp till närmaste MB)." -#: utils/misc/guc.c:2410 +#: utils/misc/guc_tables.c:2286 msgid "Shows the number of huge pages needed for the main shared memory area." msgstr "Visa antal stora sidor som krävs för den huvudsakliga delade minnesarean." -#: utils/misc/guc.c:2411 +#: utils/misc/guc_tables.c:2287 msgid "-1 indicates that the value could not be determined." msgstr "-1 betyder att värdet inte kunde bestämmas." -#: utils/misc/guc.c:2421 +#: utils/misc/guc_tables.c:2297 +msgid "Sets the size of the dedicated buffer pool used for the commit timestamp cache." +msgstr "Sätter storlek pÃ¥ den dedikerade bufferpoolen som används till cache av commit-tidsstämplar." + +#: utils/misc/guc_tables.c:2298 utils/misc/guc_tables.c:2353 +#: utils/misc/guc_tables.c:2364 +msgid "Specify 0 to have this value determined as a fraction of shared_buffers." +msgstr "Ange 0 för att sätta detta värde till en brÃ¥kdel av shared_buffers." + +#: utils/misc/guc_tables.c:2308 +msgid "Sets the size of the dedicated buffer pool used for the MultiXact member cache." +msgstr "Sätter storlek pÃ¥ den dedikerade bufferpoolen som används till cache av MultiXact-medlemmar." + +#: utils/misc/guc_tables.c:2319 +msgid "Sets the size of the dedicated buffer pool used for the MultiXact offset cache." +msgstr "Sätter storlek pÃ¥ den dedikerade bufferpoolen som används till cache av MultiXact-offset." + +#: utils/misc/guc_tables.c:2330 +msgid "Sets the size of the dedicated buffer pool used for the LISTEN/NOTIFY message cache." +msgstr "Sätter storlek pÃ¥ den dedikerade bufferpoolen som används till cache av LISTEN/NOTIFY-meddelande." + +#: utils/misc/guc_tables.c:2341 +msgid "Sets the size of the dedicated buffer pool used for the serializable transaction cache." +msgstr "Sätter storlek pÃ¥ den dedikerade bufferpoolen som används till cache av serialiserbara transaktioner." + +#: utils/misc/guc_tables.c:2352 +msgid "Sets the size of the dedicated buffer pool used for the subtransaction cache." +msgstr "Sätter storlek pÃ¥ den dedikerade bufferpoolen som används som cache för undertransaktioner." + +#: utils/misc/guc_tables.c:2363 +msgid "Sets the size of the dedicated buffer pool used for the transaction status cache." +msgstr "Sätter storlek pÃ¥ den dedikerade bufferpoolen som används till cache av transaktionsstatus." + +#: utils/misc/guc_tables.c:2374 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Sätter maximalt antal temporära buffertar som används per session." -#: utils/misc/guc.c:2432 +#: utils/misc/guc_tables.c:2385 msgid "Sets the TCP port the server listens on." msgstr "Sätter TCP-porten som servern lyssnar pÃ¥." -#: utils/misc/guc.c:2442 +#: utils/misc/guc_tables.c:2395 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Sätter accessrättigheter för Unix-domainuttag (socket)." -#: utils/misc/guc.c:2443 +#: utils/misc/guc_tables.c:2396 msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Unixdomänuttag (socket) använder unix vanliga filsystemsrättigheter. Parametervärdet förväntas vara en numerisk rättighetsangivelse sÃ¥ som accepteras av systemanropen chmod och umask. (För att använda det vanliga oktala formatet sÃ¥ mÃ¥ste numret börja med 0 (noll).)" -#: utils/misc/guc.c:2457 +#: utils/misc/guc_tables.c:2410 msgid "Sets the file permissions for log files." msgstr "Sätter filrättigheter för loggfiler." -#: utils/misc/guc.c:2458 +#: utils/misc/guc_tables.c:2411 msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Parametervärdet förväntas vara en numerisk rättighetsangivelse sÃ¥ som accepteras av systemanropen chmod och umask. (För att använda det vanliga oktala formatet sÃ¥ mÃ¥ste numret börja med 0 (noll).)" -#: utils/misc/guc.c:2472 +#: utils/misc/guc_tables.c:2425 msgid "Shows the mode of the data directory." msgstr "Visar rättigheter för datakatalog" -#: utils/misc/guc.c:2473 +#: utils/misc/guc_tables.c:2426 msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Parametervärdet är en numerisk rättighetsangivelse sÃ¥ som accepteras av systemanropen chmod och umask. (För att använda det vanliga oktala formatet sÃ¥ mÃ¥ste numret börja med 0 (noll).)" -#: utils/misc/guc.c:2486 +#: utils/misc/guc_tables.c:2439 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Sätter maximalt minne som används för frÃ¥gors arbetsyta." -#: utils/misc/guc.c:2487 +#: utils/misc/guc_tables.c:2440 msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." msgstr "SÃ¥ här mycket minne kan användas av varje intern sorteringsoperation resp. hash-tabell innan temporära filer pÃ¥ disk börjar användas." -#: utils/misc/guc.c:2499 +#: utils/misc/guc_tables.c:2457 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Sätter det maximala minnet som fÃ¥r användas för underhÃ¥llsoperationer." -#: utils/misc/guc.c:2500 +#: utils/misc/guc_tables.c:2458 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Detta inkluderar operationer som VACUUM och CREATE INDEX." -#: utils/misc/guc.c:2510 +#: utils/misc/guc_tables.c:2468 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Sätter det maximala minnet som fÃ¥r användas för logisk avkodning." -#: utils/misc/guc.c:2511 +#: utils/misc/guc_tables.c:2469 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." msgstr "SÃ¥ här mycket minne kan användas av varje intern omsorteringsbuffer innan data spills till disk." -#: utils/misc/guc.c:2527 +#: utils/misc/guc_tables.c:2485 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Sätter det maximala stackdjupet, i kilobyte." -#: utils/misc/guc.c:2538 +#: utils/misc/guc_tables.c:2496 msgid "Limits the total size of all temporary files used by each process." msgstr "Begränsar den totala storleken för alla temporära filer som används i en process." -#: utils/misc/guc.c:2539 +#: utils/misc/guc_tables.c:2497 msgid "-1 means no limit." msgstr "-1 betyder ingen gräns." -#: utils/misc/guc.c:2549 +#: utils/misc/guc_tables.c:2507 msgid "Vacuum cost for a page found in the buffer cache." msgstr "Vacuum-kostnad för en sida som hittas i buffer-cache:n." -#: utils/misc/guc.c:2559 +#: utils/misc/guc_tables.c:2517 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "Vacuum-kostnad för en sida som inte hittas i buffer-cache:n." -#: utils/misc/guc.c:2569 +#: utils/misc/guc_tables.c:2527 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "Vacuum-kostnad för sidor som smutsats ner vid vacuum." -#: utils/misc/guc.c:2579 +#: utils/misc/guc_tables.c:2537 msgid "Vacuum cost amount available before napping." msgstr "Vacuum-kostnad kvar innan pausande." -#: utils/misc/guc.c:2589 +#: utils/misc/guc_tables.c:2547 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "Vacuum-kostnad kvar innan pausande, för autovacuum." -#: utils/misc/guc.c:2599 +#: utils/misc/guc_tables.c:2557 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "Sätter det maximala antalet filer som en serverprocess kan ha öppna pÃ¥ en gÃ¥ng." -#: utils/misc/guc.c:2612 +#: utils/misc/guc_tables.c:2570 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Sätter det maximala antalet förberedda transaktioner man fÃ¥r ha pÃ¥ en gÃ¥ng." -#: utils/misc/guc.c:2623 +#: utils/misc/guc_tables.c:2581 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Sätter minsta tabell-OID för spÃ¥rning av lÃ¥s." -#: utils/misc/guc.c:2624 +#: utils/misc/guc_tables.c:2582 msgid "Is used to avoid output on system tables." msgstr "Används för att undvika utdata för systemtabeller." -#: utils/misc/guc.c:2633 +#: utils/misc/guc_tables.c:2591 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Sätter OID för tabellen med ovillkorlig lÃ¥sspÃ¥rning." -#: utils/misc/guc.c:2645 +#: utils/misc/guc_tables.c:2603 msgid "Sets the maximum allowed duration of any statement." msgstr "Sätter den maximala tiden som en sats fÃ¥r köra." -#: utils/misc/guc.c:2646 utils/misc/guc.c:2657 utils/misc/guc.c:2668 -#: utils/misc/guc.c:2679 +#: utils/misc/guc_tables.c:2604 utils/misc/guc_tables.c:2615 +#: utils/misc/guc_tables.c:2626 utils/misc/guc_tables.c:2637 +#: utils/misc/guc_tables.c:2648 msgid "A value of 0 turns off the timeout." msgstr "Värdet 0 stänger av timeout:en." -#: utils/misc/guc.c:2656 +#: utils/misc/guc_tables.c:2614 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Sätter den maximala tiden som man fÃ¥r vänta pÃ¥ ett lÃ¥s." -#: utils/misc/guc.c:2667 +#: utils/misc/guc_tables.c:2625 msgid "Sets the maximum allowed idle time between queries, when in a transaction." msgstr "Sätter den maximalt tillÃ¥tna inaktiva tiden mellan frÃ¥gor i en transaktion." -#: utils/misc/guc.c:2678 +#: utils/misc/guc_tables.c:2636 +msgid "Sets the maximum allowed duration of any transaction within a session (not a prepared transaction)." +msgstr "Sätter den maximala tillÃ¥tana tiden för en transaktion i en session (ej en preparerad transaktion)." + +#: utils/misc/guc_tables.c:2647 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." msgstr "Sätter den maximalt tillÃ¥tna inaktiva tiden mellan frÃ¥gor utanför en transaktion." -#: utils/misc/guc.c:2689 +#: utils/misc/guc_tables.c:2658 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "Minimal Ã¥lder där VACUUM skall frysa en tabellrad." -#: utils/misc/guc.c:2699 +#: utils/misc/guc_tables.c:2668 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "Ã…lder där VACUUM skall skanna hela tabellen för att frysa tupler." -#: utils/misc/guc.c:2709 +#: utils/misc/guc_tables.c:2678 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "Minsta Ã¥lder där VACUUM skall frysa en MultiXactId i en tabellrad." -#: utils/misc/guc.c:2719 +#: utils/misc/guc_tables.c:2688 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "Multixact-Ã¥lder där VACUUM skall skanna hela tabellen för att frysa tupler." -#: utils/misc/guc.c:2729 -msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." -msgstr "Antalet transaktioner som VACUUM och HOT-städning skall fördröjas (om nÃ¥gon)." - -#: utils/misc/guc.c:2738 +#: utils/misc/guc_tables.c:2698 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "Ã…lder där VACUUM skall startas som skyddsÃ¥tgärd för att undvika wraparound-stopp." -#: utils/misc/guc.c:2747 +#: utils/misc/guc_tables.c:2707 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "Multixact-Ã¥lder där VACUUM skall startas som skyddsÃ¥tgärd för att undvika wraparound-stopp." -#: utils/misc/guc.c:2760 +#: utils/misc/guc_tables.c:2720 msgid "Sets the maximum number of locks per transaction." msgstr "Sätter det maximala antalet lÃ¥s per transaktion." -#: utils/misc/guc.c:2761 -msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." -msgstr "Den delade lÃ¥stabellen har storlek efter antagandet att maximalt max_locks_per_transaction * max_connections olika objekt kommer behöva lÃ¥sas vid en tidpunkt." +#: utils/misc/guc_tables.c:2721 +msgid "The shared lock table is sized on the assumption that at most \"max_locks_per_transaction\" objects per server process or prepared transaction will need to be locked at any one time." +msgstr "Den delade lÃ¥stabellen har storlek efter antagandet att maximalt \"max_locks_per_transaction\" objekt per serverprocess eller per förberedd transaktion kommer behöva lÃ¥sas vid varje enskild tidpunkt." -#: utils/misc/guc.c:2772 +#: utils/misc/guc_tables.c:2732 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Sätter det maximala antalet predikatlÃ¥s per transaktion." -#: utils/misc/guc.c:2773 -msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." -msgstr "Den delade predikatlÃ¥stabellen har storlek efter antagandet att maximalt max_pred_locks_per_transaction * max_connections olika objekt kommer behöva lÃ¥sas vid en tidpunkt." +#: utils/misc/guc_tables.c:2733 +msgid "The shared predicate lock table is sized on the assumption that at most \"max_pred_locks_per_transaction\" objects per server process or prepared transaction will need to be locked at any one time." +msgstr "Den delade predikatlÃ¥stabellen har storlek efter antagandet att maximalt \"max_pred_locks_per_transaction\" objekt per serverprocess eller per förberedd transaktion kommer behöva lÃ¥sas vid varje enskild tidpunkt." -#: utils/misc/guc.c:2784 +#: utils/misc/guc_tables.c:2744 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "Sätter det maximala antalet predikatlÃ¥sta sidor och tupler per relation." -#: utils/misc/guc.c:2785 +#: utils/misc/guc_tables.c:2745 msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." msgstr "Om fler än detta totala antal sidor och tupler för samma relation är lÃ¥sta av en anslutning sÃ¥ ersätts dessa lÃ¥s med ett lÃ¥s pÃ¥ relationen." -#: utils/misc/guc.c:2795 +#: utils/misc/guc_tables.c:2755 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "Sätter det maximala antalet predikatlÃ¥sta tupler per sida." -#: utils/misc/guc.c:2796 +#: utils/misc/guc_tables.c:2756 msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." msgstr "Om fler än detta antal tupler pÃ¥ samma sida är lÃ¥sta av en anslutning sÃ¥ ersätts dessa lÃ¥s med ett lÃ¥s pÃ¥ sidan." -#: utils/misc/guc.c:2806 +#: utils/misc/guc_tables.c:2766 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Sätter maximalt tillÃ¥ten tid att slutföra klientautentisering." -#: utils/misc/guc.c:2818 +#: utils/misc/guc_tables.c:2778 msgid "Sets the amount of time to wait before authentication on connection startup." msgstr "Sätter tiden att vänta före authentiserng vid uppstart av anslutningen.." -#: utils/misc/guc.c:2830 +#: utils/misc/guc_tables.c:2790 +msgid "Sets the maximum number of allocated pages for NOTIFY / LISTEN queue." +msgstr "Sätter det maximala antalet allokerade sidor till kö för NOTIFY / LISTEN." + +#: utils/misc/guc_tables.c:2800 msgid "Buffer size for reading ahead in the WAL during recovery." msgstr "Bufferstorlek för read-ahead av WAL vid Ã¥terställning." -#: utils/misc/guc.c:2831 +#: utils/misc/guc_tables.c:2801 msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." msgstr "Maximal längd att läsa i förväg av WAL för att prefetch:a refererade datablock." -#: utils/misc/guc.c:2841 +#: utils/misc/guc_tables.c:2811 msgid "Sets the size of WAL files held for standby servers." msgstr "Sätter storlek pÃ¥ WAL-filer som sparas för standby-servrar." -#: utils/misc/guc.c:2852 +#: utils/misc/guc_tables.c:2822 msgid "Sets the minimum size to shrink the WAL to." msgstr "Sätter maximal storlek som WAL kan krympas till." -#: utils/misc/guc.c:2864 +#: utils/misc/guc_tables.c:2834 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Sätter WAL-storlek som triggar en checkpoint." -#: utils/misc/guc.c:2876 +#: utils/misc/guc_tables.c:2846 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "Sätter maximal tid mellan tvÃ¥ automatiska WAL-checkpoint:er." -#: utils/misc/guc.c:2887 +#: utils/misc/guc_tables.c:2857 msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." msgstr "Sätter maximal tid innan en varning ges för att stor WAL-volymn gör att checkpoint triggas för ofta." -#: utils/misc/guc.c:2889 +#: utils/misc/guc_tables.c:2859 msgid "Write a message to the server log if checkpoints caused by the filling of WAL segment files happen more frequently than this amount of time. Zero turns off the warning." msgstr "Skriv ett meddelande i serverloggen om checkpoint:er som orsakas av fulla WAL-segmentfiler händer oftare än denna tid. Noll stänger av varningen." -#: utils/misc/guc.c:2902 utils/misc/guc.c:3120 utils/misc/guc.c:3168 +#: utils/misc/guc_tables.c:2872 utils/misc/guc_tables.c:3090 +#: utils/misc/guc_tables.c:3144 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "Antal sidor varefter tidigare skrivningar flush:as till disk." -#: utils/misc/guc.c:2913 +#: utils/misc/guc_tables.c:2883 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Sätter antal buffrar för disksidor i delat minne för WAL." -#: utils/misc/guc.c:2924 +#: utils/misc/guc_tables.c:2884 +msgid "Specify -1 to have this value determined as a fraction of shared_buffers." +msgstr "Ange -1 för att sätta detta värde till en brÃ¥kdel av shared_buffers." + +#: utils/misc/guc_tables.c:2894 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Tid mellan WAL-flush:ar utförda i WAL-skrivaren." -#: utils/misc/guc.c:2935 +#: utils/misc/guc_tables.c:2905 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "Mängden WAL utskrivna av WAL-skrivaren som triggar en flush." -#: utils/misc/guc.c:2946 +#: utils/misc/guc_tables.c:2916 msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "Minimal storlek pÃ¥ ny fil som skall fsync:as istället för att skriva till WAL." -#: utils/misc/guc.c:2957 +#: utils/misc/guc_tables.c:2927 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "Sätter maximalt antal samtidigt körande WAL-sändarprocesser." -#: utils/misc/guc.c:2968 +#: utils/misc/guc_tables.c:2938 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Sätter maximalt antal samtidigt definierade replikeringsslottar." -#: utils/misc/guc.c:2978 +#: utils/misc/guc_tables.c:2948 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "Sätter maximalt WAL-storlek som kan reserveras av replikeringsslottar." -#: utils/misc/guc.c:2979 +#: utils/misc/guc_tables.c:2949 msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." msgstr "Replikeringsslottar kommer markeras som misslyckade och segment kommer släppas till borttagning eller Ã¥teranvändning när sÃ¥ här mycket plats används av WAL pÃ¥ disk." -#: utils/misc/guc.c:2991 +#: utils/misc/guc_tables.c:2961 msgid "Sets the maximum time to wait for WAL replication." msgstr "Sätter maximal tid att vänta pÃ¥ WAL-replikering." -#: utils/misc/guc.c:3002 +#: utils/misc/guc_tables.c:2972 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "Sätter fördröjning i mikrosekunder mellan transaktions-commit ochj flush:ning av WAL till disk." -#: utils/misc/guc.c:3014 -msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." -msgstr "Sätter minsta antal samtida öppna transaktioner som krävs innan vi utför en commit_delay." +#: utils/misc/guc_tables.c:2984 +msgid "Sets the minimum number of concurrent open transactions required before performing \"commit_delay\"." +msgstr "Sätter minsta antal samtida öppna transaktioner som krävs innan vi utför en \"commit_delay\"." -#: utils/misc/guc.c:3025 +#: utils/misc/guc_tables.c:2995 msgid "Sets the number of digits displayed for floating-point values." msgstr "Sätter antal siffror som visas för flyttalsvärden." -#: utils/misc/guc.c:3026 +#: utils/misc/guc_tables.c:2996 msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." msgstr "Detta pÃ¥verkar real, double precision och geometriska datatyper. Noll eller negativt parametervärde läggs till standard antal siffror (FLT_DIG eller DBL_DIG respektive). Ett värde större än noll väljer ett exakt utmatningsläge." -#: utils/misc/guc.c:3038 +#: utils/misc/guc_tables.c:3008 msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." msgstr "Sätter minimal körtid där ett urval av lÃ¥ngsammare satser kommer loggas. Urvalet bestämms av log_statement_sample_rate." -#: utils/misc/guc.c:3041 +#: utils/misc/guc_tables.c:3011 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "Noll loggar ett urval som inkluderar alla frÃ¥gor. -1 stänger av denna funktion." -#: utils/misc/guc.c:3051 +#: utils/misc/guc_tables.c:3021 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "Sätter minimal körtid där alla lÃ¥ngsammare satser kommer loggas." -#: utils/misc/guc.c:3053 +#: utils/misc/guc_tables.c:3023 msgid "Zero prints all queries. -1 turns this feature off." msgstr "Noll skriver ut alla frÃ¥gor. -1 stänger av denna finess." -#: utils/misc/guc.c:3063 +#: utils/misc/guc_tables.c:3033 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "Sätter minimal körtid där lÃ¥ngsammare autovacuum-operationer kommer loggas." -#: utils/misc/guc.c:3065 +#: utils/misc/guc_tables.c:3035 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "Noll skriver ut alla operationer. -1 stänger av autovacuum." -#: utils/misc/guc.c:3075 +#: utils/misc/guc_tables.c:3045 msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." msgstr "Sätter maximal längd i byte pÃ¥ data som loggas för bind-parametrar vid loggning av satser." -#: utils/misc/guc.c:3077 utils/misc/guc.c:3089 +#: utils/misc/guc_tables.c:3047 utils/misc/guc_tables.c:3059 msgid "-1 to print values in full." msgstr "-1 för att skriva ut hela värden." -#: utils/misc/guc.c:3087 +#: utils/misc/guc_tables.c:3057 msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." msgstr "Sätter maximal längs i byte pÃ¥ data som loggas för bind-parametrar vid loggning av satser i samband med fel." -#: utils/misc/guc.c:3099 +#: utils/misc/guc_tables.c:3069 msgid "Background writer sleep time between rounds." msgstr "Bakgrundsskrivarens sleep-tid mellan körningar." -#: utils/misc/guc.c:3110 +#: utils/misc/guc_tables.c:3080 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "Bakgrundsskrivarens maximala antal LRU-sidor som flush:as per omgÃ¥ng." -#: utils/misc/guc.c:3133 +#: utils/misc/guc_tables.c:3103 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "Antal samtidiga förfrÃ¥gningar som kan effektivt kan hanteras av disksystemet." -#: utils/misc/guc.c:3151 -msgid "A variant of effective_io_concurrency that is used for maintenance work." -msgstr "En variant av effective_io_concurrency som används för underhÃ¥llsarbete." +#: utils/misc/guc_tables.c:3117 +msgid "A variant of \"effective_io_concurrency\" that is used for maintenance work." +msgstr "En variant av \"effective_io_concurrency\" som används för underhÃ¥llsarbete." -#: utils/misc/guc.c:3181 +#: utils/misc/guc_tables.c:3132 +msgid "Limit on the size of data reads and writes." +msgstr "Begränsa storlek pÃ¥ data för läsning och skrivning." + +#: utils/misc/guc_tables.c:3157 msgid "Maximum number of concurrent worker processes." msgstr "Maximalt antal samtidiga arbetsprocesser." -#: utils/misc/guc.c:3193 +#: utils/misc/guc_tables.c:3169 msgid "Maximum number of logical replication worker processes." msgstr "Maximalt antal arbetsprocesser för logisk replikering." -#: utils/misc/guc.c:3205 +#: utils/misc/guc_tables.c:3181 msgid "Maximum number of table synchronization workers per subscription." -msgstr "Maximalt antal tabellsynkroniseringsarbetare per prenumeration." +msgstr "Maximalt antal arbetare som synkroniserar tabeller per prenumeration." + +#: utils/misc/guc_tables.c:3193 +msgid "Maximum number of parallel apply workers per subscription." +msgstr "Maximalt antal parallella arbetare som applicerar ändring per prenumeration." -#: utils/misc/guc.c:3215 +#: utils/misc/guc_tables.c:3203 msgid "Sets the amount of time to wait before forcing log file rotation." msgstr "Sätter tiden vi väntar innan vi tvingar rotering av loggfil." -#: utils/misc/guc.c:3227 +#: utils/misc/guc_tables.c:3215 msgid "Sets the maximum size a log file can reach before being rotated." msgstr "Sätter maximalt storlek en loggfil kan bli innan vi tvingar rotering." -#: utils/misc/guc.c:3239 +#: utils/misc/guc_tables.c:3227 msgid "Shows the maximum number of function arguments." msgstr "Visar maximalt antal funktionsargument." -#: utils/misc/guc.c:3250 +#: utils/misc/guc_tables.c:3238 msgid "Shows the maximum number of index keys." msgstr "Visar maximalt antal indexnycklar." -#: utils/misc/guc.c:3261 +#: utils/misc/guc_tables.c:3249 msgid "Shows the maximum identifier length." msgstr "Visar den maximala identifierarlängden." -#: utils/misc/guc.c:3272 +#: utils/misc/guc_tables.c:3260 msgid "Shows the size of a disk block." msgstr "Visar storleken pÃ¥ ett diskblock." -#: utils/misc/guc.c:3283 +#: utils/misc/guc_tables.c:3271 msgid "Shows the number of pages per disk file." msgstr "Visar antal sidor per diskfil." -#: utils/misc/guc.c:3294 +#: utils/misc/guc_tables.c:3282 msgid "Shows the block size in the write ahead log." msgstr "Visar blockstorleken i the write-ahead-loggen." -#: utils/misc/guc.c:3305 +#: utils/misc/guc_tables.c:3293 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "Sätter väntetiden innan databasen försöker ta emot WAL efter ett misslyckat försök." -#: utils/misc/guc.c:3317 +#: utils/misc/guc_tables.c:3305 msgid "Shows the size of write ahead log segments." msgstr "Visar storleken pÃ¥ write-ahead-log-segment." -#: utils/misc/guc.c:3330 +#: utils/misc/guc_tables.c:3318 +msgid "Time for which WAL summary files should be kept." +msgstr "Tid som filer för WAL-summering skall behÃ¥llas." + +#: utils/misc/guc_tables.c:3331 msgid "Time to sleep between autovacuum runs." msgstr "Tid att sova mellan körningar av autovacuum." -#: utils/misc/guc.c:3340 +#: utils/misc/guc_tables.c:3341 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Minst antal tupel-uppdateringar eller raderingar innan vacuum." -#: utils/misc/guc.c:3349 +#: utils/misc/guc_tables.c:3350 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." msgstr "Minsta antal tupel-insert innnan vacuum eller -1 för att stänga av insert-vacuum." -#: utils/misc/guc.c:3358 +#: utils/misc/guc_tables.c:3359 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "Minsta antal tupel-insert, -update eller -delete innan analyze." -#: utils/misc/guc.c:3368 +#: utils/misc/guc_tables.c:3369 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "Ã…lder dÃ¥ autovacuum körs pÃ¥ en tabell för att förhindra wrapaound pÃ¥ transaktions-ID." -#: utils/misc/guc.c:3380 +#: utils/misc/guc_tables.c:3381 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "Ã…lder pÃ¥ multixact dÃ¥ autovacuum körs pÃ¥ en tabell för att förhindra wrapaound pÃ¥ multixact." -#: utils/misc/guc.c:3390 +#: utils/misc/guc_tables.c:3391 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "Sätter maximalt antal samtidigt körande arbetsprocesser för autovacuum." -#: utils/misc/guc.c:3400 +#: utils/misc/guc_tables.c:3401 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "Sätter maximalt antal parallella processer per underhÃ¥llsoperation." -#: utils/misc/guc.c:3410 +#: utils/misc/guc_tables.c:3411 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Sätter maximalt antal parallella processer per exekveringsnod." -#: utils/misc/guc.c:3421 +#: utils/misc/guc_tables.c:3422 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "Sätter maximalt antal parallella arbetare som kan vara aktiva pÃ¥ en gÃ¥ng." -#: utils/misc/guc.c:3432 +#: utils/misc/guc_tables.c:3433 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "Sätter maximalt minne som kan användas av varje arbetsprocess för autovacuum." -#: utils/misc/guc.c:3443 -msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." -msgstr "Tid innan ett snapshot är för gammalt för att läsa sidor som ändrats efter snapshot:en tagits." - -#: utils/misc/guc.c:3444 -msgid "A value of -1 disables this feature." -msgstr "Värdet -1 stänger av denna funktion." - -#: utils/misc/guc.c:3454 +#: utils/misc/guc_tables.c:3444 msgid "Time between issuing TCP keepalives." msgstr "Tid mellan skickande av TCP-keepalive." -#: utils/misc/guc.c:3455 utils/misc/guc.c:3466 utils/misc/guc.c:3590 +#: utils/misc/guc_tables.c:3445 utils/misc/guc_tables.c:3456 +#: utils/misc/guc_tables.c:3580 msgid "A value of 0 uses the system default." msgstr "Värdet 0 anger systemets standardvärde." -#: utils/misc/guc.c:3465 +#: utils/misc/guc_tables.c:3455 msgid "Time between TCP keepalive retransmits." msgstr "Tid mellan omsändning av TCP-keepalive." -#: utils/misc/guc.c:3476 +#: utils/misc/guc_tables.c:3466 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "SSL-förhandling stöds inte längre; denna kan bara vara 0." -#: utils/misc/guc.c:3487 +#: utils/misc/guc_tables.c:3477 msgid "Maximum number of TCP keepalive retransmits." msgstr "Maximalt antal omsändningar av TCP-keepalive." -#: utils/misc/guc.c:3488 +#: utils/misc/guc_tables.c:3478 msgid "Number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." msgstr "Atalet keepalive-omsändingar i rad som kan försvinna innan en anslutning anses vara död. Värdet 0 betyder systemstandardvärdet." -#: utils/misc/guc.c:3499 +#: utils/misc/guc_tables.c:3489 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Sätter maximalt tillÃ¥tna resultat för exakt sökning med GIN." -#: utils/misc/guc.c:3510 +#: utils/misc/guc_tables.c:3500 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "Sätter planerarens antagande om totala storleken pÃ¥ datacachen." -#: utils/misc/guc.c:3511 +#: utils/misc/guc_tables.c:3501 msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." msgstr "Det är totala storleken pÃ¥ cachen (kernelcache och delade buffertar) som användas för PostgreSQLs datafiler. Det mäts i disksidor som normalt är 8 kb styck." -#: utils/misc/guc.c:3522 +#: utils/misc/guc_tables.c:3512 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "Sätter minsta mängd tabelldata för en parallell skanning." -#: utils/misc/guc.c:3523 +#: utils/misc/guc_tables.c:3513 msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." msgstr "Om planeraren beräknar att den kommer läsa för fÃ¥ tabellsidor för att nÃ¥ denna gräns sÃ¥ kommer den inte försöka med en parallell skanning." -#: utils/misc/guc.c:3533 +#: utils/misc/guc_tables.c:3523 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "Anger minimala mängden indexdata för en parallell scan." -#: utils/misc/guc.c:3534 +#: utils/misc/guc_tables.c:3524 msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." msgstr "Om planeraren beräknar att den kommer läsa för fÃ¥ indexsidor för att nÃ¥ denna gräns sÃ¥ kommer den inte försöka med en parallell skanning." -#: utils/misc/guc.c:3545 +#: utils/misc/guc_tables.c:3535 msgid "Shows the server version as an integer." msgstr "Visar serverns version som ett heltal." -#: utils/misc/guc.c:3556 +#: utils/misc/guc_tables.c:3546 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "Logga användning av temporära filer som är större än detta antal kilobyte." -#: utils/misc/guc.c:3557 +#: utils/misc/guc_tables.c:3547 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "Noll loggar alla filer. Standard är -1 (stänger av denna finess)." -#: utils/misc/guc.c:3567 +#: utils/misc/guc_tables.c:3557 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Ställer in storleken reserverad för pg_stat_activity.query, i byte." -#: utils/misc/guc.c:3578 +#: utils/misc/guc_tables.c:3568 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Sätter maximal storlek pÃ¥ väntelistan för GIN-index." -#: utils/misc/guc.c:3589 +#: utils/misc/guc_tables.c:3579 msgid "TCP user timeout." msgstr "Användartimeout för TCP." -#: utils/misc/guc.c:3600 +#: utils/misc/guc_tables.c:3590 msgid "The size of huge page that should be requested." msgstr "Storleken pÃ¥ stora sidor skall hämtas." -#: utils/misc/guc.c:3611 +#: utils/misc/guc_tables.c:3601 msgid "Aggressively flush system caches for debugging purposes." msgstr "Flush:a systemcache aggressivt för att förenkla debugging." -#: utils/misc/guc.c:3634 +#: utils/misc/guc_tables.c:3624 msgid "Sets the time interval between checks for disconnection while running queries." msgstr "Sätter tidsintervall mellan test för nedkoppling när frÃ¥gor körs." -#: utils/misc/guc.c:3645 +#: utils/misc/guc_tables.c:3635 msgid "Time between progress updates for long-running startup operations." msgstr "Tid mellan uppdatering av progress för startupoperationer som kör länge." -#: utils/misc/guc.c:3647 +#: utils/misc/guc_tables.c:3637 msgid "0 turns this feature off." msgstr "0 stänger av denna finess." -#: utils/misc/guc.c:3666 +#: utils/misc/guc_tables.c:3647 +msgid "Sets the iteration count for SCRAM secret generation." +msgstr "Sätter iterationsräknare för generering av SCRAM-hemlighet." + +#: utils/misc/guc_tables.c:3667 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "Ställer in planerarens estimat av kostnaden för att hämta en disksida sekvensiellt." -#: utils/misc/guc.c:3677 +#: utils/misc/guc_tables.c:3678 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "Ställer in planerarens estimat av kostnaden för att hämta en disksida icke-sekvensiellt." -#: utils/misc/guc.c:3688 +#: utils/misc/guc_tables.c:3689 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "Ställer in planerarens estimat av kostnaden för att processa varje tupel (rad)." -#: utils/misc/guc.c:3699 +#: utils/misc/guc_tables.c:3700 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "Sätter planerarens kostnadsuppskattning för att processa varje indexpost under en indexskanning." -#: utils/misc/guc.c:3710 +#: utils/misc/guc_tables.c:3711 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "Sätter planerarens kostnadsuppskattning för att processa varje operator- eller funktions-anrop." -#: utils/misc/guc.c:3721 +#: utils/misc/guc_tables.c:3722 msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." msgstr "Sätter planerarens kostnadsuppskattning för att skicka varje tupel (rad) frÃ¥n en arbetare till ledar-backend:en. " -#: utils/misc/guc.c:3732 +#: utils/misc/guc_tables.c:3733 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "Sätter planerarens kostnadsuppskattning för att starta upp en arbetsprocess för en parallell frÃ¥ga." -#: utils/misc/guc.c:3744 +#: utils/misc/guc_tables.c:3745 msgid "Perform JIT compilation if query is more expensive." msgstr "Utför JIT-kompilering om frÃ¥gan är dyrare." -#: utils/misc/guc.c:3745 +#: utils/misc/guc_tables.c:3746 msgid "-1 disables JIT compilation." msgstr "-1 stänger av JIT-kompilering." -#: utils/misc/guc.c:3755 +#: utils/misc/guc_tables.c:3756 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "Optimera JIT-kompilerade funktioner om frÃ¥gan är dyrare." -#: utils/misc/guc.c:3756 +#: utils/misc/guc_tables.c:3757 msgid "-1 disables optimization." msgstr "-1 stänger av optimering." -#: utils/misc/guc.c:3766 +#: utils/misc/guc_tables.c:3767 msgid "Perform JIT inlining if query is more expensive." msgstr "Utför JIT-\"inlining\" om frÃ¥gan är dyrare." -#: utils/misc/guc.c:3767 +#: utils/misc/guc_tables.c:3768 msgid "-1 disables inlining." msgstr "-1 stänger av \"inlining\"" -#: utils/misc/guc.c:3777 +#: utils/misc/guc_tables.c:3778 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "Sätter planerarens uppskattning av hur stor del av markörens rader som kommer hämtas. " -#: utils/misc/guc.c:3789 +#: utils/misc/guc_tables.c:3790 msgid "Sets the planner's estimate of the average size of a recursive query's working table." msgstr "Sätter planerarens uppskattning av genomsnittliga storleken pÃ¥ en rekursiv frÃ¥gas arbetstabell." -#: utils/misc/guc.c:3801 +#: utils/misc/guc_tables.c:3802 msgid "GEQO: selective pressure within the population." msgstr "GEQO: selektionstryck inom populationen." -#: utils/misc/guc.c:3812 +#: utils/misc/guc_tables.c:3813 msgid "GEQO: seed for random path selection." msgstr "GEQO: slumptalsfrö för val av slumpad sökväg." -#: utils/misc/guc.c:3823 -msgid "Multiple of work_mem to use for hash tables." -msgstr "Multipel av work_mem för att använda till hash-tabeller." +#: utils/misc/guc_tables.c:3824 +msgid "Multiple of \"work_mem\" to use for hash tables." +msgstr "Multipel av \"work_mem\" för att använda till hash-tabeller." -#: utils/misc/guc.c:3834 +#: utils/misc/guc_tables.c:3835 msgid "Multiple of the average buffer usage to free per round." msgstr "Multipel av genomsnittlig bufferanvändning som frias per runda." -#: utils/misc/guc.c:3844 +#: utils/misc/guc_tables.c:3845 msgid "Sets the seed for random-number generation." msgstr "Sätter fröet för slumptalsgeneratorn." -#: utils/misc/guc.c:3855 +#: utils/misc/guc_tables.c:3856 msgid "Vacuum cost delay in milliseconds." msgstr "Städkostfördröjning i millisekunder." -#: utils/misc/guc.c:3866 +#: utils/misc/guc_tables.c:3867 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Städkostfördröjning i millisekunder, för autovacuum." -#: utils/misc/guc.c:3877 +#: utils/misc/guc_tables.c:3878 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "Antalet tupeluppdateringar eller borttagningar innan vacuum relativt reltuples." -#: utils/misc/guc.c:3887 +#: utils/misc/guc_tables.c:3888 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "Antal tupelinsättningar innan vacuum relativt reltuples." -#: utils/misc/guc.c:3897 +#: utils/misc/guc_tables.c:3898 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "Antalet tupelinsättningar, uppdateringar eller borttagningar innan analyze relativt reltuples." -#: utils/misc/guc.c:3907 +#: utils/misc/guc_tables.c:3908 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "Tid lagd pÃ¥ att flusha nedsmutsade buffrar vid checkpoint relativt checkpoint-intervallet." -#: utils/misc/guc.c:3917 -msgid "Fraction of statements exceeding log_min_duration_sample to be logged." -msgstr "BrÃ¥kdel av satser som överskrider log_min_duration_sample som skall loggas." +#: utils/misc/guc_tables.c:3918 +msgid "Fraction of statements exceeding \"log_min_duration_sample\" to be logged." +msgstr "BrÃ¥kdel av satser som överskrider \"log_min_duration_sample\" som skall loggas." -#: utils/misc/guc.c:3918 +#: utils/misc/guc_tables.c:3919 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "Använd ett värde mellan 0.0 (logga aldrig) och 1.0 (logga alltid)." -#: utils/misc/guc.c:3927 +#: utils/misc/guc_tables.c:3928 msgid "Sets the fraction of transactions from which to log all statements." msgstr "Ställer in brÃ¥kdel av transaktionerna frÃ¥n vilka alla satser skall loggas." -#: utils/misc/guc.c:3928 +#: utils/misc/guc_tables.c:3929 msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." msgstr "Använd ett värde mellan 0.0 (logga aldrig) till 1.0 (logga all satser i alla transaktioner)." -#: utils/misc/guc.c:3947 +#: utils/misc/guc_tables.c:3948 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "Sätter shell-kommandot som kommer anropas för att arkivera en WAL-fil." -#: utils/misc/guc.c:3948 +#: utils/misc/guc_tables.c:3949 msgid "This is used only if \"archive_library\" is not set." msgstr "Detta används enbart om \"archive_library\" inte är satt." -#: utils/misc/guc.c:3957 +#: utils/misc/guc_tables.c:3958 msgid "Sets the library that will be called to archive a WAL file." msgstr "Sätter biblioteket som kommer anropas för att arkivera en WAL-fil." -#: utils/misc/guc.c:3958 +#: utils/misc/guc_tables.c:3959 msgid "An empty string indicates that \"archive_command\" should be used." msgstr "En tom sträng betyder att \"archive_command\" skall användas." -#: utils/misc/guc.c:3967 +#: utils/misc/guc_tables.c:3968 msgid "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "Sätter shell-kommandot som kommer anropas för att fÃ¥ en arkiverad WAL-fil." -#: utils/misc/guc.c:3977 +#: utils/misc/guc_tables.c:3978 msgid "Sets the shell command that will be executed at every restart point." msgstr "Sätter shell-kommandot som kommer anropas vid varje omstartspunkt." -#: utils/misc/guc.c:3987 +#: utils/misc/guc_tables.c:3988 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "Sätter shell-kommandot som kommer anropas en gÃ¥ng i slutet av en Ã¥terställning." -#: utils/misc/guc.c:3997 +#: utils/misc/guc_tables.c:3998 msgid "Specifies the timeline to recover into." msgstr "Anger tidslinjen att Ã¥terställa till." -#: utils/misc/guc.c:4007 +#: utils/misc/guc_tables.c:4008 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "Sätt till \"immediate\" för att avsluta Ã¥terställning sÃ¥ snart ett konsistent tillstÃ¥nd uppnÃ¥s." -#: utils/misc/guc.c:4016 +#: utils/misc/guc_tables.c:4017 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "Sätter transaktions-ID som Ã¥terställning kommer gÃ¥ till." -#: utils/misc/guc.c:4025 +#: utils/misc/guc_tables.c:4026 msgid "Sets the time stamp up to which recovery will proceed." msgstr "Sätter tidsstämpel som Ã¥terställning kommer gÃ¥ till." -#: utils/misc/guc.c:4034 +#: utils/misc/guc_tables.c:4035 msgid "Sets the named restore point up to which recovery will proceed." msgstr "Sätter namngiven Ã¥terställningspunkt som Ã¥terställning kommer gÃ¥ till." -#: utils/misc/guc.c:4043 +#: utils/misc/guc_tables.c:4044 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "Sätter LSN för write-ahead-logg-position som Ã¥terställning kommer fÃ¥ till." -#: utils/misc/guc.c:4053 -msgid "Specifies a file name whose presence ends recovery in the standby." -msgstr "Anger ett filnamn vars närvaro gör att Ã¥terställning avslutas i en standby." - -#: utils/misc/guc.c:4063 +#: utils/misc/guc_tables.c:4054 msgid "Sets the connection string to be used to connect to the sending server." msgstr "Sätter anslutningssträng som anvönds för att ansluta till skickande server." -#: utils/misc/guc.c:4074 +#: utils/misc/guc_tables.c:4065 msgid "Sets the name of the replication slot to use on the sending server." msgstr "Sätter namnet pÃ¥ replikeringsslotten som skall användas av den skickande servern." -#: utils/misc/guc.c:4084 +#: utils/misc/guc_tables.c:4075 msgid "Sets the client's character set encoding." msgstr "Ställer in klientens teckenkodning." -#: utils/misc/guc.c:4095 +#: utils/misc/guc_tables.c:4086 msgid "Controls information prefixed to each log line." msgstr "Styr information prefixat till varje loggrad." -#: utils/misc/guc.c:4096 +#: utils/misc/guc_tables.c:4087 msgid "If blank, no prefix is used." msgstr "Om tom sÃ¥ används inget prefix." -#: utils/misc/guc.c:4105 +#: utils/misc/guc_tables.c:4096 msgid "Sets the time zone to use in log messages." msgstr "Sätter tidszonen som används i loggmeddelanden." -#: utils/misc/guc.c:4115 +#: utils/misc/guc_tables.c:4106 msgid "Sets the display format for date and time values." msgstr "Sätter displayformat för datum och tidvärden." -#: utils/misc/guc.c:4116 +#: utils/misc/guc_tables.c:4107 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Styr ocksÃ¥ tolkning av tvetydig datumindata." -#: utils/misc/guc.c:4127 +#: utils/misc/guc_tables.c:4118 msgid "Sets the default table access method for new tables." msgstr "Ställer in standard tabellaccessmetod för nya tabeller." -#: utils/misc/guc.c:4138 +#: utils/misc/guc_tables.c:4129 msgid "Sets the default tablespace to create tables and indexes in." msgstr "Ställer in standard tabellutrymme där tabeller och index skapas." -#: utils/misc/guc.c:4139 +#: utils/misc/guc_tables.c:4130 msgid "An empty string selects the database's default tablespace." msgstr "En tom sträng väljer databasens standardtabellutrymme." -#: utils/misc/guc.c:4149 +#: utils/misc/guc_tables.c:4140 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "Ställer in tablespace för temporära tabeller och sorteringsfiler." -#: utils/misc/guc.c:4160 +#: utils/misc/guc_tables.c:4151 +msgid "Sets whether a CREATEROLE user automatically grants the role to themselves, and with which options." +msgstr "Sätter hurvida en CREATEROLE-användare automatiskt fÃ¥r rollen själva, och med vilka flaggor." + +#: utils/misc/guc_tables.c:4163 msgid "Sets the path for dynamically loadable modules." msgstr "Sätter sökvägen till dynamiskt laddade moduler." -#: utils/misc/guc.c:4161 +#: utils/misc/guc_tables.c:4164 msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." msgstr "Om en dynamiskt laddad modul behöver öppnas och det angivna namnet inte har en katalogkomponent (dvs, namnet inte innehÃ¥ller snedstreck) sÃ¥ kommer systemet använda denna sökväg för filen." -#: utils/misc/guc.c:4174 +#: utils/misc/guc_tables.c:4177 msgid "Sets the location of the Kerberos server key file." msgstr "Ställer in platsen för Kerberos servernyckelfil." -#: utils/misc/guc.c:4185 +#: utils/misc/guc_tables.c:4188 msgid "Sets the Bonjour service name." msgstr "Sätter Bonjour-tjänstens namn." -#: utils/misc/guc.c:4197 -msgid "Shows the collation order locale." -msgstr "Visar lokal för jämförelseordning." - -#: utils/misc/guc.c:4208 -msgid "Shows the character classification and case conversion locale." -msgstr "Visar lokal för teckenklassificering samt skiftlägeskonvertering." - -#: utils/misc/guc.c:4219 +#: utils/misc/guc_tables.c:4198 msgid "Sets the language in which messages are displayed." msgstr "Sätter sprÃ¥ket som meddelanden visas i." -#: utils/misc/guc.c:4229 +#: utils/misc/guc_tables.c:4208 msgid "Sets the locale for formatting monetary amounts." msgstr "Sätter lokalen för att formattera monetära belopp." -#: utils/misc/guc.c:4239 +#: utils/misc/guc_tables.c:4218 msgid "Sets the locale for formatting numbers." msgstr "Ställer in lokalen för att formattera nummer." -#: utils/misc/guc.c:4249 +#: utils/misc/guc_tables.c:4228 msgid "Sets the locale for formatting date and time values." msgstr "Sätter lokalen för att formattera datum och tider." -#: utils/misc/guc.c:4259 +#: utils/misc/guc_tables.c:4238 msgid "Lists shared libraries to preload into each backend." msgstr "Listar delade bibliotek som skall förladdas i varje backend." -#: utils/misc/guc.c:4270 +#: utils/misc/guc_tables.c:4249 msgid "Lists shared libraries to preload into server." msgstr "Listar delade bibliotek som skall förladdas i servern." -#: utils/misc/guc.c:4281 +#: utils/misc/guc_tables.c:4260 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "Listar ej priviligerade delade bibliotek som förladdas in i varje backend." -#: utils/misc/guc.c:4292 +#: utils/misc/guc_tables.c:4271 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "Sätter schemats sökordning för namn som inte är schema-prefixade." -#: utils/misc/guc.c:4304 +#: utils/misc/guc_tables.c:4283 msgid "Shows the server (database) character set encoding." msgstr "Visar serverns (databasens) teckenkodning." -#: utils/misc/guc.c:4316 +#: utils/misc/guc_tables.c:4295 msgid "Shows the server version." msgstr "Visar serverversionen" -#: utils/misc/guc.c:4328 +#: utils/misc/guc_tables.c:4307 msgid "Sets the current role." msgstr "Ställer in den aktiva rollen." -#: utils/misc/guc.c:4340 +#: utils/misc/guc_tables.c:4319 msgid "Sets the session user name." msgstr "Sätter sessionens användarnamn." -#: utils/misc/guc.c:4351 +#: utils/misc/guc_tables.c:4330 msgid "Sets the destination for server log output." msgstr "Sätter serverloggens destination." -#: utils/misc/guc.c:4352 +#: utils/misc/guc_tables.c:4331 msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." msgstr "Giltiga värden är kombinationer av \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\" och \"eventlog\", beroende pÃ¥ plattform." -#: utils/misc/guc.c:4363 +#: utils/misc/guc_tables.c:4342 msgid "Sets the destination directory for log files." msgstr "Sätter destinationskatalogen för loggfiler." -#: utils/misc/guc.c:4364 +#: utils/misc/guc_tables.c:4343 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "Kan anges relativt datakatalogen eller som en absolut sökväg." -#: utils/misc/guc.c:4374 +#: utils/misc/guc_tables.c:4353 msgid "Sets the file name pattern for log files." msgstr "Sätter filnamnsmallen för loggfiler." -#: utils/misc/guc.c:4385 +#: utils/misc/guc_tables.c:4364 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "Sätter programnamnet som används för att identifiera PostgreSQLs meddelanden i syslog." -#: utils/misc/guc.c:4396 +#: utils/misc/guc_tables.c:4375 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "Sätter applikationsnamnet som används för att identifiera PostgreSQLs meddelanden i händelseloggen." -#: utils/misc/guc.c:4407 +#: utils/misc/guc_tables.c:4386 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "Ställer in tidszon för visande och tolkande av tidsstämplar." -#: utils/misc/guc.c:4417 +#: utils/misc/guc_tables.c:4396 msgid "Selects a file of time zone abbreviations." msgstr "Väljer en fil för tidszonsförkortningar." -#: utils/misc/guc.c:4427 +#: utils/misc/guc_tables.c:4406 msgid "Sets the owning group of the Unix-domain socket." msgstr "Sätter ägande grupp för Unix-domainuttaget (socket)." -#: utils/misc/guc.c:4428 +#: utils/misc/guc_tables.c:4407 msgid "The owning user of the socket is always the user that starts the server." msgstr "Ägaren av uttaget (socker) är alltid användaren som startar servern." -#: utils/misc/guc.c:4438 +#: utils/misc/guc_tables.c:4417 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Ställer in kataloger där Unix-domän-uttag (socket) kommer skapas." -#: utils/misc/guc.c:4453 +#: utils/misc/guc_tables.c:4428 msgid "Sets the host name or IP address(es) to listen to." msgstr "Sätter värdnamn eller IP-adress(er) att lyssna pÃ¥." -#: utils/misc/guc.c:4468 +#: utils/misc/guc_tables.c:4443 msgid "Sets the server's data directory." msgstr "Ställer in serverns datakatalog." -#: utils/misc/guc.c:4479 +#: utils/misc/guc_tables.c:4454 msgid "Sets the server's main configuration file." msgstr "Sätter serverns huvudkonfigurationsfil." -#: utils/misc/guc.c:4490 +#: utils/misc/guc_tables.c:4465 msgid "Sets the server's \"hba\" configuration file." msgstr "Sätter serverns \"hba\"-konfigurationsfil." -#: utils/misc/guc.c:4501 +#: utils/misc/guc_tables.c:4476 msgid "Sets the server's \"ident\" configuration file." msgstr "Sätter serverns \"ident\"-konfigurationsfil." -#: utils/misc/guc.c:4512 +#: utils/misc/guc_tables.c:4487 msgid "Writes the postmaster PID to the specified file." msgstr "Skriver postmaster-PID till angiven fil." -#: utils/misc/guc.c:4523 +#: utils/misc/guc_tables.c:4498 msgid "Shows the name of the SSL library." msgstr "Visar namnet pÃ¥ SSL-biblioteket." -#: utils/misc/guc.c:4538 +#: utils/misc/guc_tables.c:4513 msgid "Location of the SSL server certificate file." msgstr "Plats för serverns SSL-certifikatfil." -#: utils/misc/guc.c:4548 +#: utils/misc/guc_tables.c:4523 msgid "Location of the SSL server private key file." msgstr "Plats för serverns privata SSL-nyckelfil." -#: utils/misc/guc.c:4558 +#: utils/misc/guc_tables.c:4533 msgid "Location of the SSL certificate authority file." msgstr "Plats för SSL-certifikats auktoritetsfil." -#: utils/misc/guc.c:4568 +#: utils/misc/guc_tables.c:4543 msgid "Location of the SSL certificate revocation list file." msgstr "Plats för SSL-certifikats Ã¥terkallningsfil." -#: utils/misc/guc.c:4578 +#: utils/misc/guc_tables.c:4553 msgid "Location of the SSL certificate revocation list directory." msgstr "Plats av katalog för SSL-certifikats Ã¥terkallningslistor." -#: utils/misc/guc.c:4588 +#: utils/misc/guc_tables.c:4563 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "Antalet synkrona standby och en lista med namn pÃ¥ potentiellt synkrona sÃ¥dana." -#: utils/misc/guc.c:4599 +#: utils/misc/guc_tables.c:4574 msgid "Sets default text search configuration." msgstr "Ställer in standard textsökkonfiguration." -#: utils/misc/guc.c:4609 +#: utils/misc/guc_tables.c:4584 msgid "Sets the list of allowed SSL ciphers." msgstr "Ställer in listan med tillÃ¥tna SSL-krypton." -#: utils/misc/guc.c:4624 +#: utils/misc/guc_tables.c:4599 msgid "Sets the curve to use for ECDH." msgstr "Ställer in kurvan att använda för ECDH." -#: utils/misc/guc.c:4639 +#: utils/misc/guc_tables.c:4614 msgid "Location of the SSL DH parameters file." msgstr "Plats för SSL DH-parameterfil." -#: utils/misc/guc.c:4650 +#: utils/misc/guc_tables.c:4625 msgid "Command to obtain passphrases for SSL." msgstr "Kommando för att hämta lösenfraser för SSL." -#: utils/misc/guc.c:4661 +#: utils/misc/guc_tables.c:4636 msgid "Sets the application name to be reported in statistics and logs." msgstr "Sätter applikationsnamn som rapporteras i statistik och loggar." -#: utils/misc/guc.c:4672 +#: utils/misc/guc_tables.c:4647 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Sätter namnet pÃ¥ klustret som inkluderas i processtiteln." -#: utils/misc/guc.c:4683 +#: utils/misc/guc_tables.c:4658 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "Sätter WAL-resurshanterare som WAL-konsistenskontoller görs med." -#: utils/misc/guc.c:4684 +#: utils/misc/guc_tables.c:4659 msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." msgstr "Hela sidkopior kommer loggas för alla datablock och kontrolleras mot resultatet av en WAL-uppspelning." -#: utils/misc/guc.c:4694 +#: utils/misc/guc_tables.c:4669 msgid "JIT provider to use." msgstr "JIT-leverantör som används." -#: utils/misc/guc.c:4705 +#: utils/misc/guc_tables.c:4680 msgid "Log backtrace for errors in these functions." msgstr "Loggar backtrace vid fel i dessa funktioner." -#: utils/misc/guc.c:4725 +#: utils/misc/guc_tables.c:4691 +msgid "Use direct I/O for file access." +msgstr "Använd direct-I/O för filaccess." + +#: utils/misc/guc_tables.c:4702 +msgid "Lists streaming replication standby server replication slot names that logical WAL sender processes will wait for." +msgstr "Listar replikeringsslotnamn pÃ¥ server för replikering-standby som processen för skickande av logisk WAL väntar pÃ¥." + +#: utils/misc/guc_tables.c:4704 +msgid "Logical WAL sender processes will send decoded changes to output plugins only after the specified replication slots have confirmed receiving WAL." +msgstr "Processen för skickande av logisk WAL skickar avkodade ändringar till utdata-plugin:er enbart efter att de angivna replikeringsslottarna bekräftat att de tagit emot WAL." + +#: utils/misc/guc_tables.c:4716 +msgid "Prohibits access to non-system relations of specified kinds." +msgstr "Förhindrar access till icke-system-relationer av angivna sorter." + +#: utils/misc/guc_tables.c:4736 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Anger hurvida \"\\'\" tillÃ¥ts i sträng-literaler." -#: utils/misc/guc.c:4735 +#: utils/misc/guc_tables.c:4746 msgid "Sets the output format for bytea." msgstr "Ställer in output-format för bytea." -#: utils/misc/guc.c:4745 +#: utils/misc/guc_tables.c:4756 msgid "Sets the message levels that are sent to the client." msgstr "Ställer in meddelandenivÃ¥er som skickas till klienten." -#: utils/misc/guc.c:4746 utils/misc/guc.c:4832 utils/misc/guc.c:4843 -#: utils/misc/guc.c:4919 +#: utils/misc/guc_tables.c:4757 utils/misc/guc_tables.c:4853 +#: utils/misc/guc_tables.c:4864 msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." msgstr "Varje nivÃ¥ inkluderar de efterföljande nivÃ¥erna. Ju senare nivÃ¥ destÃ¥ färre meddlanden skickas." -#: utils/misc/guc.c:4756 +#: utils/misc/guc_tables.c:4767 msgid "Enables in-core computation of query identifiers." msgstr "SlÃ¥r pÃ¥ intern uträkning av identifierare för frÃ¥gor." -#: utils/misc/guc.c:4766 +#: utils/misc/guc_tables.c:4777 msgid "Enables the planner to use constraints to optimize queries." msgstr "SlÃ¥r pÃ¥ planerarens användning av integritetsvillkor för att optimera frÃ¥gor." -#: utils/misc/guc.c:4767 +#: utils/misc/guc_tables.c:4778 msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." msgstr "Tabellskanningar kommer hoppas över om dess integritetsvillkor garanterar att inga rader komma matchas av frÃ¥gan." -#: utils/misc/guc.c:4778 +#: utils/misc/guc_tables.c:4789 msgid "Sets the default compression method for compressible values." msgstr "Ställer in standard komprimeringsmetod för komprimeringsbara värden." -#: utils/misc/guc.c:4789 +#: utils/misc/guc_tables.c:4800 msgid "Sets the transaction isolation level of each new transaction." msgstr "Ställer in isolationsnivÃ¥n för nya transaktioner." -#: utils/misc/guc.c:4799 +#: utils/misc/guc_tables.c:4810 msgid "Sets the current transaction's isolation level." msgstr "Sätter den aktuella transaktionsisolationsnivÃ¥n." -#: utils/misc/guc.c:4810 +#: utils/misc/guc_tables.c:4821 msgid "Sets the display format for interval values." msgstr "Ställer in visningsformat för intervallvärden." -#: utils/misc/guc.c:4821 +#: utils/misc/guc_tables.c:4832 +msgid "Log level for reporting invalid ICU locale strings." +msgstr "LoggnivÃ¥ för rapportering av ogiltiga ICU-lokalsträngar." + +#: utils/misc/guc_tables.c:4842 msgid "Sets the verbosity of logged messages." msgstr "Ställer in pratighet för loggade meddelanden." -#: utils/misc/guc.c:4831 +#: utils/misc/guc_tables.c:4852 msgid "Sets the message levels that are logged." msgstr "Ställer in meddelandenivÃ¥er som loggas." -#: utils/misc/guc.c:4842 +#: utils/misc/guc_tables.c:4863 msgid "Causes all statements generating error at or above this level to be logged." msgstr "Gör att alla satser som genererar fel vid eller över denna nivÃ¥ kommer loggas." -#: utils/misc/guc.c:4853 +#: utils/misc/guc_tables.c:4874 msgid "Sets the type of statements logged." msgstr "Ställer in vilken sorts satser som loggas." -#: utils/misc/guc.c:4863 +#: utils/misc/guc_tables.c:4884 msgid "Sets the syslog \"facility\" to be used when syslog enabled." msgstr "Ställer in syslog-\"facility\" som används när syslog är pÃ¥slagen." -#: utils/misc/guc.c:4878 +#: utils/misc/guc_tables.c:4895 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "Sätter sessionens beteende för triggrar och omskrivningsregler." -#: utils/misc/guc.c:4888 +#: utils/misc/guc_tables.c:4905 msgid "Sets the current transaction's synchronization level." msgstr "Ställer in den nuvarande transaktionens synkroniseringsnivÃ¥." -#: utils/misc/guc.c:4898 -msgid "Allows archiving of WAL files using archive_command." -msgstr "TillÃ¥ter arkivering av WAL-filer med hjälp av archive_command." +#: utils/misc/guc_tables.c:4915 +msgid "Allows archiving of WAL files using \"archive_command\"." +msgstr "TillÃ¥ter arkivering av WAL-filer med hjälp av \"archive_command\"." -#: utils/misc/guc.c:4908 +#: utils/misc/guc_tables.c:4925 msgid "Sets the action to perform upon reaching the recovery target." msgstr "Sätter handling som skall utföras när Ã¥terställningsmÃ¥l nÃ¥s." -#: utils/misc/guc.c:4918 -msgid "Enables logging of recovery-related debugging information." -msgstr "SlÃ¥r pÃ¥ loggning av Ã¥terställningsrelaterad debug-information." - -#: utils/misc/guc.c:4935 +#: utils/misc/guc_tables.c:4935 msgid "Collects function-level statistics on database activity." msgstr "Samlar in statistik pÃ¥ funktionsnivÃ¥ över databasaktivitet." -#: utils/misc/guc.c:4946 +#: utils/misc/guc_tables.c:4946 msgid "Sets the consistency of accesses to statistics data." msgstr "Sätter konsistensinställning för accesser av statistikdata." -#: utils/misc/guc.c:4956 +#: utils/misc/guc_tables.c:4956 msgid "Compresses full-page writes written in WAL file with specified method." msgstr "Komprimerar skrivning av hela sidor i WAL-filen med angiven metod." -#: utils/misc/guc.c:4966 +#: utils/misc/guc_tables.c:4966 msgid "Sets the level of information written to the WAL." msgstr "Ställer in mängden information som skrivs till WAL." -#: utils/misc/guc.c:4976 +#: utils/misc/guc_tables.c:4976 msgid "Selects the dynamic shared memory implementation used." msgstr "Väljer implementation som används för dynamiskt delat minne." -#: utils/misc/guc.c:4986 +#: utils/misc/guc_tables.c:4986 msgid "Selects the shared memory implementation used for the main shared memory region." msgstr "Väljer implementation för delat minne som används för det delade minnets huvudregionen." -#: utils/misc/guc.c:4996 +#: utils/misc/guc_tables.c:4996 msgid "Selects the method used for forcing WAL updates to disk." msgstr "Väljer metod för att tvinga WAL-uppdateringar till disk." -#: utils/misc/guc.c:5006 +#: utils/misc/guc_tables.c:5006 msgid "Sets how binary values are to be encoded in XML." msgstr "Ställer in hur binära värden kodas i XML." -#: utils/misc/guc.c:5016 +#: utils/misc/guc_tables.c:5016 msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." msgstr "Anger hurvida XML-data vid implicit parsning och serialiseringsoperationer ses som dokument eller innehÃ¥llsfragment." -#: utils/misc/guc.c:5027 +#: utils/misc/guc_tables.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "Använd stora sidor pÃ¥ Linux resp. Windows." -#: utils/misc/guc.c:5037 +#: utils/misc/guc_tables.c:5037 +msgid "Indicates the status of huge pages." +msgstr "Visas status för stora sidor." + +#: utils/misc/guc_tables.c:5048 msgid "Prefetch referenced blocks during recovery." msgstr "Prefetch:a refererade block vid Ã¥terställning." -#: utils/misc/guc.c:5038 +#: utils/misc/guc_tables.c:5049 msgid "Look ahead in the WAL to find references to uncached data." msgstr "Sök framÃ¥t i WAL för att hitta referenser till icke cache:ad data." -#: utils/misc/guc.c:5047 -msgid "Forces use of parallel query facilities." -msgstr "Tvingar användning av parallella frÃ¥gefinesser." +#: utils/misc/guc_tables.c:5058 +msgid "Forces the planner's use parallel query nodes." +msgstr "Tvingar planeraren att använda parallella frÃ¥genoder." -#: utils/misc/guc.c:5048 -msgid "If possible, run query using a parallel worker and with parallel restrictions." -msgstr "Om det är möjligt sÃ¥ kör frÃ¥ga med en parallell arbetare och med parallella begränsningar." +#: utils/misc/guc_tables.c:5059 +msgid "This can be useful for testing the parallel query infrastructure by forcing the planner to generate plans that contain nodes that perform tuple communication between workers and the main process." +msgstr "Detta är användbart för att testa infrastrukturen för parallella frÃ¥gor genom att tvinga planeraren att generera planer som innehÃ¥ller noder som skickar tupler mellan arbetare och huvudprocessen." -#: utils/misc/guc.c:5058 +#: utils/misc/guc_tables.c:5071 msgid "Chooses the algorithm for encrypting passwords." msgstr "Väljer algoritm för att kryptera lösenord." -#: utils/misc/guc.c:5068 +#: utils/misc/guc_tables.c:5081 msgid "Controls the planner's selection of custom or generic plan." msgstr "Styr planerarens användning av egendefinierad eller generell plan." -#: utils/misc/guc.c:5069 +#: utils/misc/guc_tables.c:5082 msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." msgstr "Preparerade satser kan ha egendefinierade och generella planer och planeraren kommer försöka välja den som är bäst. Detta kan anges att övertrumfa standardbeteendet." -#: utils/misc/guc.c:5081 +#: utils/misc/guc_tables.c:5094 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "Sätter minsta SSL/TLS-protokollversion som skall användas." -#: utils/misc/guc.c:5093 +#: utils/misc/guc_tables.c:5106 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "Sätter högsta SSL/TLS-protokollversion som skall användas." -#: utils/misc/guc.c:5105 +#: utils/misc/guc_tables.c:5118 msgid "Sets the method for synchronizing the data directory before crash recovery." msgstr "Ställer in metoden för att synkronisera datakatalogen innan kraschÃ¥terställning." -#: utils/misc/guc.c:5680 utils/misc/guc.c:5696 -#, c-format -msgid "invalid configuration parameter name \"%s\"" -msgstr "ogiltig konfigurationsparameter \"%s\"" - -#: utils/misc/guc.c:5682 -#, c-format -msgid "Custom parameter names must be two or more simple identifiers separated by dots." -msgstr "Egenskapade parameternamn mÃ¥ste vara tvÃ¥ eller fler enkla identifierare separerade med punkter." - -#: utils/misc/guc.c:5698 -#, c-format -msgid "\"%s\" is a reserved prefix." -msgstr "\"%s\" är ett reserverat prefix." - -#: utils/misc/guc.c:5712 -#, c-format -msgid "unrecognized configuration parameter \"%s\"" -msgstr "okänd konfigurationsparameter \"%s\"" - -#: utils/misc/guc.c:6104 -#, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: kunde inte komma Ã¥t katalogen \"%s\": %s\n" - -#: utils/misc/guc.c:6109 -#, c-format -msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" -msgstr "Kör initdb eller pg_basebackup för att initiera en PostgreSQL-datakatalog.\n" - -#: utils/misc/guc.c:6129 -#, c-format -msgid "" -"%s does not know where to find the server configuration file.\n" -"You must specify the --config-file or -D invocation option or set the PGDATA environment variable.\n" -msgstr "" -"%s vet inte var servens konfigurationsfil är.\n" -"Du mÃ¥ste ange flaggan --config-file eller -D alternativt sätta omgivningsvariabeln PGDATA.\n" - -#: utils/misc/guc.c:6148 -#, c-format -msgid "%s: could not access the server configuration file \"%s\": %s\n" -msgstr "%s: har inte Ã¥tkomst till serverns konfigureringsfil \"%s\": %s\n" - -#: utils/misc/guc.c:6174 -#, c-format -msgid "" -"%s does not know where to find the database system data.\n" -"This can be specified as \"data_directory\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" -msgstr "" -"%s vet inte var databasens systemdata är.\n" -"Det kan anges med \"data_directory\" i \"%s\" eller med flaggan -D alternativt genom att sätta omgivningsvariabeln PGDATA.\n" - -#: utils/misc/guc.c:6222 -#, c-format -msgid "" -"%s does not know where to find the \"hba\" configuration file.\n" -"This can be specified as \"hba_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" -msgstr "" -"%s vet inte var \"hba\"-konfigurationsfilen är.\n" -"Detta kan anges som \"hba_file\" i \"%s\" eller med flaggan -D alternativt genom att sätta omgivningsvariabeln PGDATA.\n" - -#: utils/misc/guc.c:6245 -#, c-format -msgid "" -"%s does not know where to find the \"ident\" configuration file.\n" -"This can be specified as \"ident_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" -msgstr "" -"%s vet inte var \"ident\"-konfigurationsfilen är.\n" -"Detta kan anges som \"ident_file\" i \"%s\" eller med flaggan -D alternativt genom att sätta omgivningsvariabeln PGDATA.\n" - -#: utils/misc/guc.c:7176 -msgid "Value exceeds integer range." -msgstr "Värde överskriver heltalsintervall." - -#: utils/misc/guc.c:7412 -#, c-format -msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d%s%s är utanför giltigt intervall för parameter \"%s\" (%d .. %d)" - -#: utils/misc/guc.c:7448 -#, c-format -msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" -msgstr "%g%s%s är utanför giltigt intervall för parameter \"%s\" (%g .. %g)" - -#: utils/misc/guc.c:7648 utils/misc/guc.c:9096 -#, c-format -msgid "cannot set parameters during a parallel operation" -msgstr "kan inte sätta parametrar under en parallell operation" - -#: utils/misc/guc.c:7665 utils/misc/guc.c:8920 -#, c-format -msgid "parameter \"%s\" cannot be changed" -msgstr "parameter \"%s\" kan inte ändras" - -#: utils/misc/guc.c:7698 -#, c-format -msgid "parameter \"%s\" cannot be changed now" -msgstr "parameter \"%s\" kan inte ändras nu" - -#: utils/misc/guc.c:7725 utils/misc/guc.c:7783 utils/misc/guc.c:8896 -#: utils/misc/guc.c:11795 -#, c-format -msgid "permission denied to set parameter \"%s\"" -msgstr "rättighet saknas för att sätta parameter \"%s\"" - -#: utils/misc/guc.c:7763 -#, c-format -msgid "parameter \"%s\" cannot be set after connection start" -msgstr "parameter \"%s\" kan inte ändras efter uppkopplingen startats" - -#: utils/misc/guc.c:7822 -#, c-format -msgid "cannot set parameter \"%s\" within security-definer function" -msgstr "kan inte sätta parameter \"%s\" inom en security-definer-funktion" - -#: utils/misc/guc.c:8475 utils/misc/guc.c:8522 utils/misc/guc.c:10001 -#, c-format -msgid "must be superuser or have privileges of pg_read_all_settings to examine \"%s\"" -msgstr "mÃ¥ste vara superuser eller ha rättigheter frÃ¥n pg_read_all_settings för att undersöka \"%s\"" - -#: utils/misc/guc.c:8606 -#, c-format -msgid "SET %s takes only one argument" -msgstr "SET %s tar bara ett argument" - -#: utils/misc/guc.c:8886 -#, c-format -msgid "permission denied to perform ALTER SYSTEM RESET ALL" -msgstr "rättighet saknas för att utföra ALTER SYSTEM RESET ALL" - -#: utils/misc/guc.c:8953 -#, c-format -msgid "parameter value for ALTER SYSTEM must not contain a newline" -msgstr "parametervärde till ALTER SYSTEM kan inte innehÃ¥lla nyradstecken" - -#: utils/misc/guc.c:8998 -#, c-format -msgid "could not parse contents of file \"%s\"" -msgstr "kunde inte parsa innehÃ¥llet i fil \"%s\"" - -#: utils/misc/guc.c:9172 -#, c-format -msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" -msgstr "SET LOCAL TRANSACTION SNAPSHOT är inte implementerat ännu" - -#: utils/misc/guc.c:9259 -#, c-format -msgid "SET requires parameter name" -msgstr "SET kräver ett parameternamn" - -#: utils/misc/guc.c:9392 -#, c-format -msgid "attempt to redefine parameter \"%s\"" -msgstr "försök att omdefiniera parameter \"%s\"" - -#: utils/misc/guc.c:9719 -#, c-format -msgid "invalid configuration parameter name \"%s\", removing it" -msgstr "ogiltigt konfigurationsparameternamn \"%s\", tas bort" - -#: utils/misc/guc.c:9721 -#, c-format -msgid "\"%s\" is now a reserved prefix." -msgstr "\"%s\" är nu ett reserverat prefix." - -#: utils/misc/guc.c:11235 -#, c-format -msgid "while setting parameter \"%s\" to \"%s\"" -msgstr "vid sättande av parameter \"%s\" till \"%s\"" - -#: utils/misc/guc.c:11404 -#, c-format -msgid "parameter \"%s\" could not be set" -msgstr "parameter \"%s\" kunde inte sättas" - -#: utils/misc/guc.c:11496 -#, c-format -msgid "could not parse setting for parameter \"%s\"" -msgstr "kunde inte tolka inställningen för parameter \"%s\"" - -#: utils/misc/guc.c:11927 -#, c-format -msgid "invalid value for parameter \"%s\": %g" -msgstr "ogiltigt värde för parameter \"%s\": %g" - -#: utils/misc/guc.c:12240 -#, c-format -msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." -msgstr "\"temp_buffers\" kan inte ändras efter att man använt temporära tabeller i sessionen." - -#: utils/misc/guc.c:12252 -#, c-format -msgid "Bonjour is not supported by this build" -msgstr "Bonjour stöds inte av detta bygge" - -#: utils/misc/guc.c:12265 -#, c-format -msgid "SSL is not supported by this build" -msgstr "SSL stöds inte av detta bygge" - -#: utils/misc/guc.c:12277 -#, c-format -msgid "Cannot enable parameter when \"log_statement_stats\" is true." -msgstr "Kan inte slÃ¥ pÃ¥ parameter när \"log_statement_stats\" är satt." - -#: utils/misc/guc.c:12289 -#, c-format -msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." -msgstr "Kan inte slÃ¥ pÃ¥ \"log_statement_stats\" när \"log_parser_stats\", \"log_planner_stats\" eller \"log_executor_stats\" är satta." - -#: utils/misc/guc.c:12519 -#, c-format -msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." -msgstr "effective_io_concurrency mÃ¥ste sättas till 0 pÃ¥ plattformar som saknar posix_fadvise()." - -#: utils/misc/guc.c:12532 -#, c-format -msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." -msgstr "maintenance_io_concurrency mÃ¥ste sättas till 0 pÃ¥ plattformar som saknar posix_fadvise()." - -#: utils/misc/guc.c:12546 -#, c-format -msgid "huge_page_size must be 0 on this platform." -msgstr "huge_page_size mÃ¥ste vara 0 pÃ¥ denna plattform." - -#: utils/misc/guc.c:12558 -#, c-format -msgid "client_connection_check_interval must be set to 0 on this platform." -msgstr "client_connection_check_interval mÃ¥ste sättas till 0 pÃ¥ denna plattform." - -#: utils/misc/guc.c:12670 -#, c-format -msgid "invalid character" -msgstr "ogiltigt tecken" - -#: utils/misc/guc.c:12730 -#, c-format -msgid "recovery_target_timeline is not a valid number." -msgstr "recovery_target_timeline är inte ett giltigt nummer." - -#: utils/misc/guc.c:12770 -#, c-format -msgid "multiple recovery targets specified" -msgstr "multipla Ã¥terställningsmÃ¥l angivna" - -#: utils/misc/guc.c:12771 -#, c-format -msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." -msgstr "Som mest en av recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time och recovery_target_xid kan sättas." +#: utils/misc/guc_tables.c:5127 +msgid "Forces immediate streaming or serialization of changes in large transactions." +msgstr "Tvingar omedelbar strömning eller serialisering av ändringar i stora transaktioner." -#: utils/misc/guc.c:12779 -#, c-format -msgid "The only allowed value is \"immediate\"." -msgstr "Det enda tillÃ¥tna värdet är \"immediate\"." +#: utils/misc/guc_tables.c:5128 +msgid "On the publisher, it allows streaming or serializing each change in logical decoding. On the subscriber, it allows serialization of all changes to files and notifies the parallel apply workers to read and apply them at the end of the transaction." +msgstr "PÃ¥ publiceringssidan sÃ¥ tillÃ¥ter detta strömning eller serialisering av varje ändring i den logiska kodningen. PÃ¥ prenumerationsstidan sÃ¥ tillÃ¥ter det serialisering av alla ändringar till filer samt notifiering till den parallella appliceraren att läsa in och applicera dem i slutet av transaktionen." -#: utils/misc/help_config.c:130 +#: utils/misc/help_config.c:129 #, c-format msgid "internal error: unrecognized run-time parameter type\n" msgstr "internt fel: okänd parametertyp\n" -#: utils/misc/pg_controldata.c:60 utils/misc/pg_controldata.c:138 -#: utils/misc/pg_controldata.c:241 utils/misc/pg_controldata.c:306 +#: utils/misc/pg_controldata.c:50 utils/misc/pg_controldata.c:90 +#: utils/misc/pg_controldata.c:181 utils/misc/pg_controldata.c:222 #, c-format msgid "calculated CRC checksum does not match value stored in file" msgstr "uträknad CRC-checksumma matchar inte värdet som är lagrat i fil" @@ -29022,125 +30841,123 @@ msgstr "frÃ¥gan pÃ¥verkas av radsäkerhetspolicyn för tabell \"%s\"" msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." msgstr "För att slÃ¥ av policyn för tabellens ägare, använd ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/timeout.c:524 +#: utils/misc/timeout.c:520 #, c-format msgid "cannot add more timeout reasons" msgstr "kan inte lägga till fler timeoutskäl" -#: utils/misc/tzparser.c:60 +#: utils/misc/tzparser.c:61 #, c-format msgid "time zone abbreviation \"%s\" is too long (maximum %d characters) in time zone file \"%s\", line %d" msgstr "tidszonförkortningen \"%s\" är för lÃ¥ng (max %d tecken) i tidszonfilen \"%s\", rad %d" -#: utils/misc/tzparser.c:72 +#: utils/misc/tzparser.c:73 #, c-format msgid "time zone offset %d is out of range in time zone file \"%s\", line %d" msgstr "tidszonoffset %d är otanför giltigt intervall i tidszonfilen \"%s\", rad %d" -#: utils/misc/tzparser.c:111 +#: utils/misc/tzparser.c:112 #, c-format msgid "missing time zone abbreviation in time zone file \"%s\", line %d" msgstr "tidszonförkortning saknas i tidszonfilen \"%s\", rad %d" -#: utils/misc/tzparser.c:120 +#: utils/misc/tzparser.c:121 #, c-format msgid "missing time zone offset in time zone file \"%s\", line %d" msgstr "tidszonoffset saknas i tidszonfilen \"%s\", rad %d" -#: utils/misc/tzparser.c:132 +#: utils/misc/tzparser.c:133 #, c-format msgid "invalid number for time zone offset in time zone file \"%s\", line %d" msgstr "felaktigt nummer för tidszonsoffset i tidszonfilen \"%s\", rad %d" -#: utils/misc/tzparser.c:168 +#: utils/misc/tzparser.c:169 #, c-format msgid "invalid syntax in time zone file \"%s\", line %d" msgstr "felaktig syntax i tidszonfilen \"%s\", rad %d" -#: utils/misc/tzparser.c:236 +#: utils/misc/tzparser.c:237 #, c-format msgid "time zone abbreviation \"%s\" is multiply defined" msgstr "tidszonförkortningen \"%s\" är definierad flera gÃ¥nger" -#: utils/misc/tzparser.c:238 +#: utils/misc/tzparser.c:239 #, c-format msgid "Entry in time zone file \"%s\", line %d, conflicts with entry in file \"%s\", line %d." msgstr "Post i tidszonfilen \"%s\", rad %d, stÃ¥r i konflikt med post i filen \"%s\", rad %d." -#: utils/misc/tzparser.c:300 +#: utils/misc/tzparser.c:301 #, c-format msgid "invalid time zone file name \"%s\"" msgstr "ogiltigt tidszonfilnamn: \"%s\"" -#: utils/misc/tzparser.c:313 +#: utils/misc/tzparser.c:314 #, c-format msgid "time zone file recursion limit exceeded in file \"%s\"" msgstr "tidszonfilens rekursiva maxtak överskridet i filen \"%s\"" -#: utils/misc/tzparser.c:352 utils/misc/tzparser.c:365 +#: utils/misc/tzparser.c:353 utils/misc/tzparser.c:366 #, c-format msgid "could not read time zone file \"%s\": %m" msgstr "kunde inte läsa tidszonfil \"%s\": %m" -#: utils/misc/tzparser.c:376 +#: utils/misc/tzparser.c:377 #, c-format msgid "line is too long in time zone file \"%s\", line %d" msgstr "raden är för lÃ¥ng i tidszonfil \"%s\", rad %d" -#: utils/misc/tzparser.c:400 +#: utils/misc/tzparser.c:401 #, c-format msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "@INCLUDE utan filnamn i tidszonfil \"%s\", rad %d" -#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:239 +#: utils/mmgr/aset.c:452 utils/mmgr/bump.c:184 utils/mmgr/generation.c:216 +#: utils/mmgr/slab.c:371 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Misslyckades vid skapande av minneskontext \"%s\"." -#: utils/mmgr/dsa.c:519 utils/mmgr/dsa.c:1329 +#: utils/mmgr/dsa.c:523 utils/mmgr/dsa.c:1364 #, c-format msgid "could not attach to dynamic shared area" msgstr "kunde inte ansluta till dynamisk delad area" -#: utils/mmgr/mcxt.c:889 utils/mmgr/mcxt.c:925 utils/mmgr/mcxt.c:963 -#: utils/mmgr/mcxt.c:1001 utils/mmgr/mcxt.c:1089 utils/mmgr/mcxt.c:1120 -#: utils/mmgr/mcxt.c:1156 utils/mmgr/mcxt.c:1208 utils/mmgr/mcxt.c:1243 -#: utils/mmgr/mcxt.c:1278 +#: utils/mmgr/mcxt.c:1155 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "Misslyckades med förfrÃ¥gan av storlek %zu i minneskontext \"%s\"." -#: utils/mmgr/mcxt.c:1052 +#: utils/mmgr/mcxt.c:1299 #, c-format msgid "logging memory contexts of PID %d" msgstr "loggar minneskontext för PID %d" -#: utils/mmgr/portalmem.c:188 +#: utils/mmgr/portalmem.c:187 #, c-format msgid "cursor \"%s\" already exists" msgstr "markör \"%s\" finns redan" -#: utils/mmgr/portalmem.c:192 +#: utils/mmgr/portalmem.c:191 #, c-format msgid "closing existing cursor \"%s\"" msgstr "stänger existerande markör \"%s\"" -#: utils/mmgr/portalmem.c:402 +#: utils/mmgr/portalmem.c:401 #, c-format msgid "portal \"%s\" cannot be run" msgstr "portal \"%s\" kan inte köras" -#: utils/mmgr/portalmem.c:480 +#: utils/mmgr/portalmem.c:479 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "kan inte ta bort fastsatt portal \"%s\"" -#: utils/mmgr/portalmem.c:488 +#: utils/mmgr/portalmem.c:487 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "kan inte ta bort aktiv portal \"%s\"" -#: utils/mmgr/portalmem.c:739 +#: utils/mmgr/portalmem.c:738 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "kan inte göra PREPARE pÃ¥ en transaktion som skapat en markör med WITH HOLD" @@ -29150,54 +30967,37 @@ msgstr "kan inte göra PREPARE pÃ¥ en transaktion som skapat en markör med WITH msgid "cannot perform transaction commands inside a cursor loop that is not read-only" msgstr "kan inte utföra transaktionskommandon i en markörloop som inte är read-only" -#: utils/sort/logtape.c:266 utils/sort/logtape.c:289 -#, c-format -msgid "could not seek to block %ld of temporary file" -msgstr "kunde inte söka (seek) till block %ld i temporärfil" - -#: utils/sort/logtape.c:295 -#, c-format -msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" -msgstr "kunde inte läsa block %ld i temporärfil: läste bara %zu av %zu byte" - -#: utils/sort/sharedtuplestore.c:431 utils/sort/sharedtuplestore.c:440 -#: utils/sort/sharedtuplestore.c:463 utils/sort/sharedtuplestore.c:480 -#: utils/sort/sharedtuplestore.c:497 +#: utils/sort/logtape.c:266 utils/sort/logtape.c:287 #, c-format -msgid "could not read from shared tuplestore temporary file" -msgstr "kunde inte läsa frÃ¥n delad temporär lagringsfil för tupler" +msgid "could not seek to block %lld of temporary file" +msgstr "kunde inte söka (seek) till block %lld i temporärfil" -#: utils/sort/sharedtuplestore.c:486 +#: utils/sort/sharedtuplestore.c:466 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "oväntad chunk i delad temporär lagringsfil för tupler" -#: utils/sort/sharedtuplestore.c:571 +#: utils/sort/sharedtuplestore.c:548 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "kunde inte söka (seek) till block %u i delad temporär lagringsfil för tupler" -#: utils/sort/sharedtuplestore.c:578 -#, c-format -msgid "could not read from shared tuplestore temporary file: read only %zu of %zu bytes" -msgstr "kunde inte läsa frÃ¥n delad temporär lagringsfil för tupler: läste bara %zu av %zu byte" - -#: utils/sort/tuplesort.c:3322 +#: utils/sort/tuplesort.c:2372 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "kan inte ha mer än %d körningar för en extern sortering" -#: utils/sort/tuplesort.c:4425 +#: utils/sort/tuplesortvariants.c:1552 #, c-format msgid "could not create unique index \"%s\"" msgstr "kunde inte skapa unikt index \"%s\"" -#: utils/sort/tuplesort.c:4427 +#: utils/sort/tuplesortvariants.c:1554 #, c-format msgid "Key %s is duplicated." msgstr "Nyckeln %s är duplicerad." -#: utils/sort/tuplesort.c:4428 +#: utils/sort/tuplesortvariants.c:1555 #, c-format msgid "Duplicate keys exist." msgstr "Duplicerade nycklar existerar." @@ -29211,58 +31011,57 @@ msgstr "Duplicerade nycklar existerar." msgid "could not seek in tuplestore temporary file" msgstr "kunde inte söka i temporär lagringsfil för tupler" -#: utils/sort/tuplestore.c:1477 utils/sort/tuplestore.c:1540 -#: utils/sort/tuplestore.c:1548 -#, c-format -msgid "could not read from tuplestore temporary file: read only %zu of %zu bytes" -msgstr "kunde inte läsa frÃ¥n temporär lagringsfil för tupler: läste bara %zu av %zu byte" - -#: utils/time/snapmgr.c:570 +#: utils/time/snapmgr.c:536 #, c-format msgid "The source transaction is not running anymore." msgstr "Källtransaktionen kör inte längre." -#: utils/time/snapmgr.c:1164 +#: utils/time/snapmgr.c:1136 #, c-format msgid "cannot export a snapshot from a subtransaction" -msgstr "kan inte exportera ett snapshot frÃ¥n en subtransaktion" +msgstr "kan inte exportera ett snapshot frÃ¥n en undertransaktion" -#: utils/time/snapmgr.c:1323 utils/time/snapmgr.c:1328 -#: utils/time/snapmgr.c:1333 utils/time/snapmgr.c:1348 -#: utils/time/snapmgr.c:1353 utils/time/snapmgr.c:1358 -#: utils/time/snapmgr.c:1373 utils/time/snapmgr.c:1378 -#: utils/time/snapmgr.c:1383 utils/time/snapmgr.c:1485 -#: utils/time/snapmgr.c:1501 utils/time/snapmgr.c:1526 +#: utils/time/snapmgr.c:1296 utils/time/snapmgr.c:1301 +#: utils/time/snapmgr.c:1306 utils/time/snapmgr.c:1321 +#: utils/time/snapmgr.c:1326 utils/time/snapmgr.c:1331 +#: utils/time/snapmgr.c:1346 utils/time/snapmgr.c:1351 +#: utils/time/snapmgr.c:1356 utils/time/snapmgr.c:1470 +#: utils/time/snapmgr.c:1486 utils/time/snapmgr.c:1511 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "ogiltig snapshot-data i fil \"%s\"" -#: utils/time/snapmgr.c:1420 +#: utils/time/snapmgr.c:1393 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "SET TRANSACTION SNAPSHOT mÃ¥ste anropas innan nÃ¥gon frÃ¥ga" -#: utils/time/snapmgr.c:1429 +#: utils/time/snapmgr.c:1402 #, c-format msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" msgstr "en snapshot-importerande transaktion mÃ¥ste ha isoleringsnivÃ¥ SERIALIZABLE eller REPEATABLE READ" -#: utils/time/snapmgr.c:1438 utils/time/snapmgr.c:1447 +#: utils/time/snapmgr.c:1411 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "ogiltig snapshot-identifierare: \"%s\"" -#: utils/time/snapmgr.c:1539 +#: utils/time/snapmgr.c:1426 +#, c-format +msgid "snapshot \"%s\" does not exist" +msgstr "snapshot \"%s\" existerar inte" + +#: utils/time/snapmgr.c:1524 #, c-format msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" msgstr "en serialiserbar transaktion kan inte importera ett snapshot frÃ¥n en icke-serialiserbar transaktion" -#: utils/time/snapmgr.c:1543 +#: utils/time/snapmgr.c:1528 #, c-format msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" msgstr "en serialiserbar transaktion som inte är read-only kan inte importera en snapshot frÃ¥n en read-only-transaktion." -#: utils/time/snapmgr.c:1558 +#: utils/time/snapmgr.c:1543 #, c-format msgid "cannot import a snapshot from a different database" msgstr "kan inte importera en snapshot frÃ¥n en annan databas" diff --git a/src/backend/po/uk.po b/src/backend/po/uk.po index 1095fd9139f36..afa0d84e0afb3 100644 --- a/src/backend/po/uk.po +++ b/src/backend/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:40+0000\n" -"PO-Revision-Date: 2022-09-13 14:35+0200\n" +"POT-Creation-Date: 2025-03-29 10:30+0000\n" +"PO-Revision-Date: 2025-04-01 15:40\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,44 +14,64 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/postgres.pot\n" -"X-Crowdin-File-ID: 896\n" -"X-Generator: Poedit 3.1.1\n" +"X-Crowdin-File: /REL_17_STABLE/postgres.pot\n" +"X-Crowdin-File-ID: 988\n" -#: ../common/compression.c:157 +#: ../common/binaryheap.c:121 ../common/binaryheap.c:159 +#, c-format +msgid "out of binary heap slots" +msgstr "недоÑтатньо Ñлотів двійкової купи" + +#: ../common/compression.c:132 ../common/compression.c:141 +#: ../common/compression.c:150 +#, c-format +msgid "this build does not support compression with %s" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð· %s" + +#: ../common/compression.c:205 msgid "found empty string where a compression option was expected" msgstr "знайдено порожній Ñ€Ñдок, де очікувавÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ ÑтиÑканнÑ" -#: ../common/compression.c:187 +#: ../common/compression.c:244 #, c-format -msgid "unknown compression option \"%s\"" -msgstr "невідомий параметр ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\"" +msgid "unrecognized compression option: \"%s\"" +msgstr "нерозпізнаний алгоритм ÑтиÑканнÑ: \"%s\"" -#: ../common/compression.c:226 +#: ../common/compression.c:283 #, c-format msgid "compression option \"%s\" requires a value" msgstr "параметр ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" потребує значеннÑ" -#: ../common/compression.c:235 +#: ../common/compression.c:292 #, c-format msgid "value for compression option \"%s\" must be an integer" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" має бути цілим чиÑлом" -#: ../common/compression.c:273 +#: ../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" має бути логічним значеннÑм" + +#: ../common/compression.c:379 #, c-format msgid "compression algorithm \"%s\" does not accept a compression level" msgstr "алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" не приймає рівень ÑтиÑканнÑ" -#: ../common/compression.c:277 +#: ../common/compression.c:386 #, c-format -msgid "compression algorithm \"%s\" expects a compression level between %d and %d" -msgstr "алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" очікує рівень ÑтиÑÐºÐ°Ð½Ð½Ñ Ð¼Ñ–Ð¶ %d Ñ– %d" +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" очікує рівень ÑтиÑÐºÐ°Ð½Ð½Ñ Ð¼Ñ–Ð¶ %d Ñ– %d (за замовчуваннÑм %d)" -#: ../common/compression.c:289 +#: ../common/compression.c:397 #, c-format msgid "compression algorithm \"%s\" does not accept a worker count" msgstr "алгоритм ÑтиÑÐ½ÐµÐ½Ð½Ñ \"%s\" не приймає кількіÑть працівників" +#: ../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "алгоритм ÑтиÑÐ½ÐµÐ½Ð½Ñ \"%s\" не підтримує режим довгої відÑтані" + #: ../common/config_info.c:134 ../common/config_info.c:142 #: ../common/config_info.c:150 ../common/config_info.c:158 #: ../common/config_info.c:166 ../common/config_info.c:174 @@ -59,264 +79,279 @@ msgstr "алгоритм ÑтиÑÐ½ÐµÐ½Ð½Ñ \"%s\" не приймає кіль msgid "not recorded" msgstr "не запиÑано" -#: ../common/controldata_utils.c:69 ../common/controldata_utils.c:73 -#: commands/copyfrom.c:1515 commands/extension.c:3383 utils/adt/genfile.c:123 +#: ../common/controldata_utils.c:93 ../common/controldata_utils.c:97 +#: commands/copyfrom.c:1739 commands/extension.c:3538 utils/adt/genfile.c:123 +#: utils/time/snapmgr.c:1430 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m" -#: ../common/controldata_utils.c:84 ../common/controldata_utils.c:86 +#: ../common/controldata_utils.c:108 ../common/controldata_utils.c:110 #: access/transam/timeline.c:143 access/transam/timeline.c:362 -#: access/transam/twophase.c:1348 access/transam/xlog.c:3207 -#: access/transam/xlog.c:4022 access/transam/xlogrecovery.c:1178 -#: access/transam/xlogrecovery.c:1270 access/transam/xlogrecovery.c:1307 -#: access/transam/xlogrecovery.c:1367 backup/basebackup.c:1842 -#: commands/extension.c:3393 libpq/hba.c:505 replication/logical/origin.c:729 -#: replication/logical/origin.c:765 replication/logical/reorderbuffer.c:4924 -#: replication/logical/snapbuild.c:1848 replication/logical/snapbuild.c:1890 -#: replication/logical/snapbuild.c:1917 replication/slot.c:1772 -#: replication/slot.c:1813 replication/walsender.c:659 -#: storage/file/buffile.c:463 storage/file/copydir.c:195 -#: utils/adt/genfile.c:197 utils/adt/misc.c:863 utils/cache/relmapper.c:813 +#: access/transam/twophase.c:1353 access/transam/xlog.c:3477 +#: access/transam/xlog.c:4341 access/transam/xlogrecovery.c:1238 +#: access/transam/xlogrecovery.c:1336 access/transam/xlogrecovery.c:1373 +#: access/transam/xlogrecovery.c:1440 backup/basebackup.c:2123 +#: backup/walsummary.c:283 commands/extension.c:3548 libpq/hba.c:764 +#: replication/logical/origin.c:745 replication/logical/origin.c:781 +#: replication/logical/reorderbuffer.c:5113 +#: replication/logical/snapbuild.c:2052 replication/slot.c:2236 +#: replication/slot.c:2277 replication/walsender.c:655 +#: storage/file/buffile.c:470 storage/file/copydir.c:185 +#: utils/adt/genfile.c:197 utils/adt/misc.c:1028 utils/cache/relmapper.c:829 #, c-format msgid "could not read file \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" -#: ../common/controldata_utils.c:92 ../common/controldata_utils.c:95 -#: access/transam/xlog.c:3212 access/transam/xlog.c:4027 -#: backup/basebackup.c:1846 replication/logical/origin.c:734 -#: replication/logical/origin.c:773 replication/logical/snapbuild.c:1853 -#: replication/logical/snapbuild.c:1895 replication/logical/snapbuild.c:1922 -#: replication/slot.c:1776 replication/slot.c:1817 replication/walsender.c:664 -#: utils/cache/relmapper.c:817 +#: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 +#: access/transam/xlog.c:3482 access/transam/xlog.c:4346 +#: replication/logical/origin.c:750 replication/logical/origin.c:789 +#: replication/logical/snapbuild.c:2057 replication/slot.c:2240 +#: replication/slot.c:2281 replication/walsender.c:660 +#: utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %zu" -#: ../common/controldata_utils.c:104 ../common/controldata_utils.c:108 -#: ../common/controldata_utils.c:241 ../common/controldata_utils.c:244 -#: access/heap/rewriteheap.c:1178 access/heap/rewriteheap.c:1281 +#: ../common/controldata_utils.c:128 ../common/controldata_utils.c:132 +#: ../common/controldata_utils.c:277 ../common/controldata_utils.c:280 +#: access/heap/rewriteheap.c:1141 access/heap/rewriteheap.c:1246 #: access/transam/timeline.c:392 access/transam/timeline.c:438 -#: access/transam/timeline.c:516 access/transam/twophase.c:1360 -#: access/transam/twophase.c:1772 access/transam/xlog.c:3054 -#: access/transam/xlog.c:3247 access/transam/xlog.c:3252 -#: access/transam/xlog.c:3390 access/transam/xlog.c:3992 -#: access/transam/xlog.c:4738 commands/copyfrom.c:1575 commands/copyto.c:327 -#: libpq/be-fsstubs.c:455 libpq/be-fsstubs.c:525 -#: replication/logical/origin.c:667 replication/logical/origin.c:806 -#: replication/logical/reorderbuffer.c:4982 -#: replication/logical/snapbuild.c:1757 replication/logical/snapbuild.c:1930 -#: replication/slot.c:1663 replication/slot.c:1824 replication/walsender.c:674 -#: storage/file/copydir.c:218 storage/file/copydir.c:223 storage/file/fd.c:745 -#: storage/file/fd.c:3643 storage/file/fd.c:3749 utils/cache/relmapper.c:828 +#: access/transam/timeline.c:512 access/transam/twophase.c:1365 +#: access/transam/twophase.c:1784 access/transam/xlog.c:3323 +#: access/transam/xlog.c:3517 access/transam/xlog.c:3522 +#: access/transam/xlog.c:3658 access/transam/xlog.c:4311 +#: access/transam/xlog.c:5246 commands/copyfrom.c:1799 commands/copyto.c:325 +#: libpq/be-fsstubs.c:470 libpq/be-fsstubs.c:540 +#: replication/logical/origin.c:683 replication/logical/origin.c:822 +#: replication/logical/reorderbuffer.c:5165 +#: replication/logical/snapbuild.c:1819 replication/logical/snapbuild.c:1943 +#: replication/slot.c:2126 replication/slot.c:2288 replication/walsender.c:670 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:828 +#: storage/file/fd.c:3753 storage/file/fd.c:3859 utils/cache/relmapper.c:841 #: utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" msgstr "неможливо закрити файл \"%s\": %m" -#: ../common/controldata_utils.c:124 +#: ../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "неправильний порÑдок байтів" -#: ../common/controldata_utils.c:126 +#: ../common/controldata_utils.c:170 #, c-format -msgid "" -"possible byte ordering mismatch\n" +msgid "possible byte ordering mismatch\n" "The byte ordering used to store the pg_control file might not match the one\n" "used by this program. In that case the results below would be incorrect, and\n" "the PostgreSQL installation would be incompatible with this data directory." -msgstr "" -"можлива помилка у поÑлідовноÑті байтів.\n" +msgstr "можлива помилка у поÑлідовноÑті байтів.\n" "ПорÑдок байтів, що викориÑтовують Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ pg_control, може не відповідати тому, Ñкий викориÑтовуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ програмою. У такому випадку результати нижче будуть неправильним, Ñ– інÑталÑÑ†Ñ–Ñ PostgreSQL буде неÑуміÑною з цим каталогом даних." -#: ../common/controldata_utils.c:189 ../common/controldata_utils.c:194 -#: ../common/file_utils.c:232 ../common/file_utils.c:291 -#: ../common/file_utils.c:365 access/heap/rewriteheap.c:1264 -#: access/transam/timeline.c:111 access/transam/timeline.c:251 -#: access/transam/timeline.c:348 access/transam/twophase.c:1304 -#: access/transam/xlog.c:2941 access/transam/xlog.c:3123 -#: access/transam/xlog.c:3162 access/transam/xlog.c:3357 -#: access/transam/xlog.c:4012 access/transam/xlogrecovery.c:4164 -#: access/transam/xlogrecovery.c:4267 access/transam/xlogutils.c:850 -#: backup/basebackup.c:522 backup/basebackup.c:1519 postmaster/syslogger.c:1560 -#: replication/logical/origin.c:719 replication/logical/reorderbuffer.c:3579 -#: replication/logical/reorderbuffer.c:4128 -#: replication/logical/reorderbuffer.c:4904 -#: replication/logical/snapbuild.c:1712 replication/logical/snapbuild.c:1819 -#: replication/slot.c:1744 replication/walsender.c:632 -#: replication/walsender.c:2723 storage/file/copydir.c:161 -#: storage/file/fd.c:720 storage/file/fd.c:3395 storage/file/fd.c:3630 -#: storage/file/fd.c:3720 storage/smgr/md.c:524 utils/cache/relmapper.c:792 -#: utils/cache/relmapper.c:900 utils/error/elog.c:1933 -#: utils/init/miscinit.c:1366 utils/init/miscinit.c:1500 -#: utils/init/miscinit.c:1577 utils/misc/guc.c:9001 utils/misc/guc.c:9050 +#: ../common/controldata_utils.c:225 ../common/controldata_utils.c:230 +#: ../common/file_utils.c:70 ../common/file_utils.c:347 +#: ../common/file_utils.c:406 ../common/file_utils.c:480 +#: access/heap/rewriteheap.c:1229 access/transam/timeline.c:111 +#: access/transam/timeline.c:251 access/transam/timeline.c:348 +#: access/transam/twophase.c:1309 access/transam/xlog.c:3230 +#: access/transam/xlog.c:3393 access/transam/xlog.c:3432 +#: access/transam/xlog.c:3625 access/transam/xlog.c:4331 +#: access/transam/xlogrecovery.c:4264 access/transam/xlogrecovery.c:4367 +#: access/transam/xlogutils.c:836 backup/basebackup.c:547 +#: backup/basebackup.c:1598 backup/walsummary.c:220 libpq/hba.c:624 +#: postmaster/syslogger.c:1511 replication/logical/origin.c:735 +#: replication/logical/reorderbuffer.c:3766 +#: replication/logical/reorderbuffer.c:4320 +#: replication/logical/reorderbuffer.c:5093 +#: replication/logical/snapbuild.c:1774 replication/logical/snapbuild.c:1884 +#: replication/slot.c:2208 replication/walsender.c:628 +#: replication/walsender.c:3051 storage/file/copydir.c:151 +#: storage/file/fd.c:803 storage/file/fd.c:3510 storage/file/fd.c:3740 +#: storage/file/fd.c:3830 storage/smgr/md.c:661 utils/cache/relmapper.c:818 +#: utils/cache/relmapper.c:935 utils/error/elog.c:2124 +#: utils/init/miscinit.c:1580 utils/init/miscinit.c:1714 +#: utils/init/miscinit.c:1791 utils/misc/guc.c:4777 utils/misc/guc.c:4827 #, c-format msgid "could not open file \"%s\": %m" msgstr "не можливо відкрити файл \"%s\": %m" -#: ../common/controldata_utils.c:210 ../common/controldata_utils.c:213 -#: access/transam/twophase.c:1745 access/transam/twophase.c:1754 -#: access/transam/xlog.c:8656 access/transam/xlogfuncs.c:600 +#: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 +#: access/transam/twophase.c:1757 access/transam/twophase.c:1766 +#: access/transam/xlog.c:9280 access/transam/xlogfuncs.c:698 #: backup/basebackup_server.c:173 backup/basebackup_server.c:266 -#: postmaster/postmaster.c:5631 postmaster/syslogger.c:1571 -#: postmaster/syslogger.c:1584 postmaster/syslogger.c:1597 -#: utils/cache/relmapper.c:934 +#: backup/walsummary.c:304 postmaster/postmaster.c:4127 +#: postmaster/syslogger.c:1522 postmaster/syslogger.c:1535 +#: postmaster/syslogger.c:1548 utils/cache/relmapper.c:947 #, c-format msgid "could not write file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m" -#: ../common/controldata_utils.c:227 ../common/controldata_utils.c:232 -#: ../common/file_utils.c:303 ../common/file_utils.c:373 -#: access/heap/rewriteheap.c:960 access/heap/rewriteheap.c:1172 -#: access/heap/rewriteheap.c:1275 access/transam/timeline.c:432 -#: access/transam/timeline.c:510 access/transam/twophase.c:1766 -#: access/transam/xlog.c:3047 access/transam/xlog.c:3241 -#: access/transam/xlog.c:3985 access/transam/xlog.c:7959 -#: access/transam/xlog.c:8002 backup/basebackup_server.c:207 -#: replication/logical/snapbuild.c:1750 replication/slot.c:1649 -#: replication/slot.c:1754 storage/file/fd.c:737 storage/file/fd.c:3741 -#: storage/smgr/md.c:975 storage/smgr/md.c:1016 storage/sync/sync.c:453 -#: utils/cache/relmapper.c:949 utils/misc/guc.c:8770 +#: ../common/controldata_utils.c:263 ../common/controldata_utils.c:268 +#: ../common/file_utils.c:418 ../common/file_utils.c:488 +#: access/heap/rewriteheap.c:925 access/heap/rewriteheap.c:1135 +#: access/heap/rewriteheap.c:1240 access/transam/timeline.c:432 +#: access/transam/timeline.c:506 access/transam/twophase.c:1778 +#: access/transam/xlog.c:3316 access/transam/xlog.c:3511 +#: access/transam/xlog.c:4304 access/transam/xlog.c:8655 +#: access/transam/xlog.c:8700 backup/basebackup_server.c:207 +#: commands/dbcommands.c:514 replication/logical/snapbuild.c:1812 +#: replication/slot.c:2112 replication/slot.c:2218 storage/file/fd.c:820 +#: storage/file/fd.c:3851 storage/smgr/md.c:1331 storage/smgr/md.c:1376 +#: storage/sync/sync.c:446 utils/misc/guc.c:4530 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "не вдалоÑÑ fsync файл \"%s\": %m" -#: ../common/cryptohash.c:266 ../common/cryptohash_openssl.c:133 -#: ../common/cryptohash_openssl.c:332 ../common/exec.c:560 ../common/exec.c:605 -#: ../common/exec.c:697 ../common/hmac.c:309 ../common/hmac.c:325 -#: ../common/hmac_openssl.c:132 ../common/hmac_openssl.c:327 -#: ../common/md5_common.c:155 ../common/psprintf.c:143 -#: ../common/scram-common.c:247 ../common/stringinfo.c:305 ../port/path.c:751 -#: ../port/path.c:789 ../port/path.c:806 access/transam/twophase.c:1413 -#: access/transam/xlogrecovery.c:568 lib/dshash.c:253 libpq/auth.c:1338 -#: libpq/auth.c:1406 libpq/auth.c:1964 libpq/be-secure-gssapi.c:520 -#: postmaster/bgworker.c:349 postmaster/bgworker.c:931 -#: postmaster/postmaster.c:2584 postmaster/postmaster.c:4170 -#: postmaster/postmaster.c:4842 postmaster/postmaster.c:5556 -#: postmaster/postmaster.c:5927 -#: replication/libpqwalreceiver/libpqwalreceiver.c:296 -#: replication/logical/logical.c:205 replication/walsender.c:702 -#: storage/buffer/localbuf.c:442 storage/file/fd.c:892 storage/file/fd.c:1434 -#: storage/file/fd.c:1595 storage/file/fd.c:2409 storage/ipc/procarray.c:1437 -#: storage/ipc/procarray.c:2249 storage/ipc/procarray.c:2256 -#: storage/ipc/procarray.c:2759 storage/ipc/procarray.c:3390 -#: utils/adt/formatting.c:1727 utils/adt/formatting.c:1849 -#: utils/adt/formatting.c:1972 utils/adt/pg_locale.c:450 -#: utils/adt/pg_locale.c:614 utils/adt/regexp.c:224 utils/fmgr/dfmgr.c:229 -#: utils/hash/dynahash.c:513 utils/hash/dynahash.c:613 -#: utils/hash/dynahash.c:1116 utils/mb/mbutils.c:401 utils/mb/mbutils.c:429 -#: utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 utils/misc/guc.c:5202 -#: utils/misc/guc.c:5218 utils/misc/guc.c:5231 utils/misc/guc.c:8748 -#: utils/misc/tzparser.c:476 utils/mmgr/aset.c:476 utils/mmgr/dsa.c:701 -#: utils/mmgr/dsa.c:723 utils/mmgr/dsa.c:804 utils/mmgr/generation.c:266 -#: utils/mmgr/mcxt.c:888 utils/mmgr/mcxt.c:924 utils/mmgr/mcxt.c:962 -#: utils/mmgr/mcxt.c:1000 utils/mmgr/mcxt.c:1088 utils/mmgr/mcxt.c:1119 -#: utils/mmgr/mcxt.c:1155 utils/mmgr/mcxt.c:1207 utils/mmgr/mcxt.c:1242 -#: utils/mmgr/mcxt.c:1277 utils/mmgr/slab.c:236 +#: ../common/cryptohash.c:261 ../common/cryptohash_openssl.c:158 +#: ../common/cryptohash_openssl.c:356 ../common/exec.c:562 ../common/exec.c:607 +#: ../common/exec.c:699 ../common/hmac.c:309 ../common/hmac.c:325 +#: ../common/hmac_openssl.c:160 ../common/hmac_openssl.c:357 +#: ../common/md5_common.c:156 ../common/parse_manifest.c:157 +#: ../common/parse_manifest.c:852 ../common/psprintf.c:143 +#: ../common/scram-common.c:268 ../common/stringinfo.c:314 ../port/path.c:828 +#: ../port/path.c:865 ../port/path.c:882 access/transam/twophase.c:1418 +#: access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1352 +#: libpq/auth.c:1396 libpq/auth.c:1953 libpq/be-secure-gssapi.c:524 +#: postmaster/bgworker.c:355 postmaster/bgworker.c:945 +#: postmaster/postmaster.c:3560 postmaster/postmaster.c:4021 +#: postmaster/postmaster.c:4383 postmaster/walsummarizer.c:935 +#: replication/libpqwalreceiver/libpqwalreceiver.c:387 +#: replication/logical/logical.c:210 replication/walsender.c:835 +#: storage/buffer/localbuf.c:606 storage/file/fd.c:912 storage/file/fd.c:1443 +#: storage/file/fd.c:1604 storage/file/fd.c:2531 storage/ipc/procarray.c:1465 +#: storage/ipc/procarray.c:2219 storage/ipc/procarray.c:2226 +#: storage/ipc/procarray.c:2731 storage/ipc/procarray.c:3435 +#: utils/adt/formatting.c:1725 utils/adt/formatting.c:1873 +#: utils/adt/formatting.c:2075 utils/adt/pg_locale.c:532 +#: utils/adt/pg_locale.c:696 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:516 +#: utils/hash/dynahash.c:616 utils/hash/dynahash.c:1099 utils/mb/mbutils.c:401 +#: utils/mb/mbutils.c:429 utils/mb/mbutils.c:814 utils/mb/mbutils.c:841 +#: utils/misc/guc.c:649 utils/misc/guc.c:674 utils/misc/guc.c:1062 +#: utils/misc/guc.c:4508 utils/misc/tzparser.c:477 utils/mmgr/aset.c:451 +#: utils/mmgr/bump.c:183 utils/mmgr/dsa.c:707 utils/mmgr/dsa.c:729 +#: utils/mmgr/dsa.c:810 utils/mmgr/generation.c:215 utils/mmgr/mcxt.c:1154 +#: utils/mmgr/slab.c:370 #, c-format msgid "out of memory" msgstr "недоÑтатньо пам'Ñті" -#: ../common/cryptohash.c:271 ../common/cryptohash.c:277 -#: ../common/cryptohash_openssl.c:344 ../common/cryptohash_openssl.c:352 -#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:339 -#: ../common/hmac_openssl.c:347 +#: ../common/cryptohash.c:266 ../common/cryptohash.c:272 +#: ../common/cryptohash_openssl.c:368 ../common/cryptohash_openssl.c:376 +#: ../common/hmac.c:321 ../common/hmac.c:329 ../common/hmac_openssl.c:369 +#: ../common/hmac_openssl.c:377 msgid "success" msgstr "уÑпіх" -#: ../common/cryptohash.c:273 ../common/cryptohash_openssl.c:346 -#: ../common/hmac_openssl.c:341 +#: ../common/cryptohash.c:268 ../common/cryptohash_openssl.c:370 +#: ../common/hmac_openssl.c:371 msgid "destination buffer too small" msgstr "буфер Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ малий" -#: ../common/cryptohash_openssl.c:348 ../common/hmac_openssl.c:343 +#: ../common/cryptohash_openssl.c:372 ../common/hmac_openssl.c:373 msgid "OpenSSL failure" msgstr "Помилка OpenSSL" -#: ../common/exec.c:149 ../common/exec.c:266 ../common/exec.c:312 -#, c-format -msgid "could not identify current directory: %m" -msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ поточний каталог: %m" - -#: ../common/exec.c:168 +#: ../common/exec.c:174 #, c-format -msgid "invalid binary \"%s\"" -msgstr "невірний бінарний файл \"%s\"" +msgid "invalid binary \"%s\": %m" +msgstr "невірний бінарний файл \"%s\": %m" -#: ../common/exec.c:218 +#: ../common/exec.c:217 #, c-format -msgid "could not read binary \"%s\"" -msgstr "неможливо прочитати бінарний файл \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ бінарний файл \"%s\": %m" -#: ../common/exec.c:226 +#: ../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "неможливо знайти \"%s\" Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ" -#: ../common/exec.c:282 ../common/exec.c:321 utils/init/miscinit.c:439 +#: ../common/exec.c:252 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ каталог на \"%s\": %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ абÑолютний шлÑÑ… \"%s\": %m" -#: ../common/exec.c:299 access/transam/xlog.c:8305 backup/basebackup.c:1339 -#: utils/adt/misc.c:342 +#: ../common/exec.c:382 commands/collationcmds.c:876 commands/copyfrom.c:1723 +#: commands/copyto.c:654 libpq/be-secure-common.c:59 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "не можливо прочитати Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m" +msgid "could not execute command \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ команду \"%s\": %m" + +#: ../common/exec.c:394 libpq/be-secure-common.c:71 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ виÑновок команди \"%s\": %m" + +#: ../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "команда \"%s\" не повернула жодних даних" -#: ../common/exec.c:422 libpq/pqcomm.c:746 storage/ipc/latch.c:1092 -#: storage/ipc/latch.c:1272 storage/ipc/latch.c:1501 storage/ipc/latch.c:1662 -#: storage/ipc/latch.c:1788 +#: ../common/exec.c:424 libpq/pqcomm.c:192 storage/ipc/latch.c:1169 +#: storage/ipc/latch.c:1349 storage/ipc/latch.c:1589 storage/ipc/latch.c:1751 +#: storage/ipc/latch.c:1877 #, c-format msgid "%s() failed: %m" msgstr "%s() помилка: %m" #: ../common/fe_memutils.c:35 ../common/fe_memutils.c:75 -#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:162 -#: ../common/psprintf.c:145 ../port/path.c:753 ../port/path.c:791 -#: ../port/path.c:808 utils/misc/ps_status.c:181 utils/misc/ps_status.c:189 -#: utils/misc/ps_status.c:219 utils/misc/ps_status.c:227 +#: ../common/fe_memutils.c:98 ../common/fe_memutils.c:161 +#: ../common/psprintf.c:145 ../port/path.c:830 ../port/path.c:867 +#: ../port/path.c:884 utils/misc/ps_status.c:193 utils/misc/ps_status.c:201 +#: utils/misc/ps_status.c:228 utils/misc/ps_status.c:236 #, c-format msgid "out of memory\n" msgstr "недоÑтатньо пам'Ñті\n" -#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:154 +#: ../common/fe_memutils.c:92 ../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" -#: ../common/file_utils.c:87 ../common/file_utils.c:451 -#: ../common/file_utils.c:455 access/transam/twophase.c:1316 -#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:230 -#: backup/basebackup.c:338 backup/basebackup.c:528 backup/basebackup.c:599 -#: commands/copyfrom.c:1525 commands/copyto.c:725 commands/extension.c:3372 -#: commands/tablespace.c:826 commands/tablespace.c:917 postmaster/pgarch.c:603 -#: replication/logical/snapbuild.c:1629 storage/file/copydir.c:68 -#: storage/file/copydir.c:107 storage/file/fd.c:1951 storage/file/fd.c:2037 -#: storage/file/fd.c:3243 storage/file/fd.c:3450 utils/adt/dbsize.c:92 -#: utils/adt/dbsize.c:244 utils/adt/dbsize.c:324 utils/adt/genfile.c:413 -#: utils/adt/genfile.c:588 utils/adt/misc.c:327 guc-file.l:1061 +#: ../common/file_utils.c:76 storage/file/fd.c:3516 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не вдалоÑÑ Ñинхронізувати файлову ÑиÑтему Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" + +#: ../common/file_utils.c:120 ../common/file_utils.c:566 +#: ../common/file_utils.c:570 access/transam/twophase.c:1321 +#: access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 +#: backup/basebackup.c:355 backup/basebackup.c:553 backup/basebackup.c:624 +#: backup/walsummary.c:247 backup/walsummary.c:254 commands/copyfrom.c:1749 +#: commands/copyto.c:700 commands/extension.c:3527 commands/tablespace.c:804 +#: commands/tablespace.c:893 postmaster/pgarch.c:680 +#: replication/logical/snapbuild.c:1670 replication/logical/snapbuild.c:2173 +#: storage/file/fd.c:1968 storage/file/fd.c:2054 storage/file/fd.c:3564 +#: utils/adt/dbsize.c:105 utils/adt/dbsize.c:257 utils/adt/dbsize.c:337 +#: utils/adt/genfile.c:437 utils/adt/genfile.c:612 utils/adt/misc.c:340 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" -#: ../common/file_utils.c:166 ../common/pgfnames.c:48 commands/tablespace.c:749 -#: commands/tablespace.c:759 postmaster/postmaster.c:1576 -#: storage/file/fd.c:2812 storage/file/reinit.c:126 utils/adt/misc.c:235 -#: utils/misc/tzparser.c:338 +#: ../common/file_utils.c:130 ../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує метод Ñинхронізації \"%s\"" + +#: ../common/file_utils.c:151 ../common/file_utils.c:281 +#: ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 +#: commands/tablespace.c:738 postmaster/postmaster.c:1470 +#: storage/file/fd.c:2933 storage/file/reinit.c:126 utils/adt/misc.c:256 +#: utils/misc/tzparser.c:339 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" -#: ../common/file_utils.c:200 ../common/pgfnames.c:69 storage/file/fd.c:2824 +#: ../common/file_utils.c:169 ../common/file_utils.c:315 +#: ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2945 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" -#: ../common/file_utils.c:383 access/transam/xlogarchive.c:419 -#: postmaster/syslogger.c:1608 replication/logical/snapbuild.c:1769 -#: replication/slot.c:693 replication/slot.c:1535 replication/slot.c:1677 -#: storage/file/fd.c:755 storage/file/fd.c:853 utils/time/snapmgr.c:1282 +#: ../common/file_utils.c:498 access/transam/xlogarchive.c:389 +#: postmaster/pgarch.c:834 postmaster/syslogger.c:1559 +#: replication/logical/snapbuild.c:1831 replication/slot.c:936 +#: replication/slot.c:1998 replication/slot.c:2140 storage/file/fd.c:838 +#: utils/time/snapmgr.c:1255 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" @@ -325,85 +360,102 @@ msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s msgid "internal error" msgstr "Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°" -#: ../common/jsonapi.c:1075 +#: ../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "РекурÑивний ÑпуÑк не може викориÑтовувати інкрементний лекÑичний аналізатор." + +#: ../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "Інкрементний аналізатор потребує Інкрементний лекÑичний аналізатор." + +#: ../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON вкладений занадто глибокий, макÑимально дозволена глибина - 6400." + +#: ../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "ÐеприпуÑтима Ñпеціальна поÑлідовніÑть \"\\%s\"." +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "ÐеприпуÑтима Ñпеціальна поÑлідовніÑть \"\\%.*s\"." -#: ../common/jsonapi.c:1078 +#: ../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ зі значеннÑм 0x%02x повинен бути пропущений." -#: ../common/jsonapi.c:1081 +#: ../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "ОчікувавÑÑ ÐºÑ–Ð½ÐµÑ†ÑŒ введеннÑ, але знайдено \"%s\"." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "ОчікувавÑÑ ÐºÑ–Ð½ÐµÑ†ÑŒ введеннÑ, але знайдено \"%.*s\"." -#: ../common/jsonapi.c:1084 +#: ../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "ОчікувавÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚ маÑиву або \"]\", але знайдено \"%s\"." +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "ОчікувавÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚ маÑиву або \"]\", але знайдено \"%.*s\"." -#: ../common/jsonapi.c:1087 +#: ../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "ОчікувалоÑÑŒ \",\" або \"]\", але знайдено \"%s\"." +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "ОчікувалоÑÑŒ \",\" або \"]\", але знайдено \"%.*s\"." -#: ../common/jsonapi.c:1090 +#: ../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "ОчікувалоÑÑŒ \":\", але знайдено \"%s\"." +msgid "Expected \":\", but found \"%.*s\"." +msgstr "ОчікувалоÑÑŒ \":\", але знайдено \"%.*s\"." -#: ../common/jsonapi.c:1093 +#: ../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "ОчікувалоÑÑŒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ JSON, але знайдено \"%s\"." +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "ОчікувалоÑÑŒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ JSON, але знайдено \"%.*s\"." -#: ../common/jsonapi.c:1096 +#: ../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "ÐеÑподіваний кінець вхідного Ñ€Ñдка." -#: ../common/jsonapi.c:1098 +#: ../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "ОчікувавÑÑ Ñ€Ñдок або \"}\", але знайдено \"%s\"." +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "ОчікувавÑÑ Ñ€Ñдок або \"}\", але знайдено \"%.*s\"." -#: ../common/jsonapi.c:1101 +#: ../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "ОчікувалоÑÑŒ \",\" або \"}\", але знайдено \"%s\"." +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "ОчікувалоÑÑŒ \",\" або \"}\", але знайдено \"%.*s\"." -#: ../common/jsonapi.c:1104 +#: ../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "ОчікувавÑÑ Ñ€Ñдок, але знайдено \"%s\"." +msgid "Expected string, but found \"%.*s\"." +msgstr "ОчікувавÑÑ Ñ€Ñдок, але знайдено \"%.*s\"." -#: ../common/jsonapi.c:1107 +#: ../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "ÐеприпуÑтимий маркер \"%s\"." +msgid "Token \"%.*s\" is invalid." +msgstr "ÐеприпуÑтимий маркер \"%.*s\"." -#: ../common/jsonapi.c:1110 jsonpath_scan.l:495 +#: ../common/jsonapi.c:2164 jsonpath_scan.l:608 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 не можна перетворити в текÑÑ‚." -#: ../common/jsonapi.c:1112 +#: ../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" повинні прÑмувати чотири шіÑтнадцÑткових чиÑла." -#: ../common/jsonapi.c:1115 +#: ../common/jsonapi.c:2169 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ñ…Ð¾Ð´Ñƒ Unicode не можна викориÑтовувати Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ кодових точок більше 007F, Ñкщо ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ UTF8." -#: ../common/jsonapi.c:1117 jsonpath_scan.l:516 +#: ../common/jsonapi.c:2178 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñимволу Unicode не вдалоÑÑ Ð¿ÐµÑ€ÐµÐºÐ»Ð°Ñти в ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера %s." + +#: ../common/jsonapi.c:2185 jsonpath_scan.l:641 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Старший Ñурогат Unicode не повинен прÑмувати за іншим Ñтаршим Ñурогатом." -#: ../common/jsonapi.c:1119 jsonpath_scan.l:527 jsonpath_scan.l:537 -#: jsonpath_scan.l:579 +#: ../common/jsonapi.c:2187 jsonpath_scan.l:652 jsonpath_scan.l:662 +#: jsonpath_scan.l:713 #, c-format msgid "Unicode low surrogate must follow a high surrogate." msgstr "Молодший Ñурогат Unicode не повинен прÑмувати за іншим молодшим Ñурогатом." @@ -428,6 +480,182 @@ msgstr "деталі: " msgid "hint: " msgstr "підказка: " +#: ../common/parse_manifest.c:159 ../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ контрольну Ñуму маніфеÑту" + +#: ../common/parse_manifest.c:203 ../common/parse_manifest.c:260 +msgid "manifest ended unexpectedly" +msgstr "маніфеÑÑ‚ закінчивÑÑ Ð½ÐµÑподівано" + +#: ../common/parse_manifest.c:209 ../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ контрольну Ñуму маніфеÑту" + +#: ../common/parse_manifest.c:301 +msgid "unexpected object start" +msgstr "неочікуваний початок об'єкта" + +#: ../common/parse_manifest.c:336 +msgid "unexpected object end" +msgstr "неочікуваний кінець об'єкта" + +#: ../common/parse_manifest.c:365 +msgid "unexpected array start" +msgstr "неочікуваний початок маÑиву" + +#: ../common/parse_manifest.c:390 +msgid "unexpected array end" +msgstr "неочікуваний кінець маÑиву" + +#: ../common/parse_manifest.c:417 +msgid "expected version indicator" +msgstr "індикатор очікуваної верÑÑ–Ñ—" + +#: ../common/parse_manifest.c:453 +msgid "unrecognized top-level field" +msgstr "нерозпізнане поле верхнього рівнÑ" + +#: ../common/parse_manifest.c:472 +msgid "unexpected file field" +msgstr "неочікуване поле файлу" + +#: ../common/parse_manifest.c:486 +msgid "unexpected WAL range field" +msgstr "неочікуване поле діапазону WAL" + +#: ../common/parse_manifest.c:492 +msgid "unexpected object field" +msgstr "неочікуване поле об'єкта" + +#: ../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "неочікуваний ÑкалÑÑ€" + +#: ../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "верÑÑ–Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту не ціле чиÑло" + +#: ../common/parse_manifest.c:612 +msgid "unexpected manifest version" +msgstr "неочікувана верÑÑ–Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту" + +#: ../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "ÑиÑтемний ідентифікатор в маніфеÑті не ціле чиÑло" + +#: ../common/parse_manifest.c:661 +msgid "missing path name" +msgstr "пропущено шлÑÑ…" + +#: ../common/parse_manifest.c:664 +msgid "both path name and encoded path name" +msgstr "Ñ– ім'Ñ ÑˆÐ»Ñху, Ñ– закодований шлÑÑ…" + +#: ../common/parse_manifest.c:666 +msgid "missing size" +msgstr "відÑутній розмір" + +#: ../common/parse_manifest.c:669 +msgid "checksum without algorithm" +msgstr "контрольна Ñума без алгоритму" + +#: ../common/parse_manifest.c:683 +msgid "could not decode file name" +msgstr "не вдалоÑÑ Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ñ‚Ð¸ ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ" + +#: ../common/parse_manifest.c:693 +msgid "file size is not an integer" +msgstr "розмір файлу не Ñ” цілим чиÑлом" + +#: ../common/parse_manifest.c:699 backup/basebackup.c:870 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "нерозпізнаний алгоритм контрольної Ñуми: \"%s\"" + +#: ../common/parse_manifest.c:718 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "неприпуÑтима контрольна Ñума Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": \"%s\"" + +#: ../common/parse_manifest.c:761 +msgid "missing timeline" +msgstr "відÑÑƒÑ‚Ð½Ñ Ñ‡Ð°Ñова шкала" + +#: ../common/parse_manifest.c:763 +msgid "missing start LSN" +msgstr "відÑутній LSN початку" + +#: ../common/parse_manifest.c:765 +msgid "missing end LSN" +msgstr "відÑутній LSN кінцÑ" + +#: ../common/parse_manifest.c:771 +msgid "timeline is not an integer" +msgstr "чаÑова Ð»Ñ–Ð½Ñ–Ñ Ð½Ðµ Ñ” цілим чиÑлом" + +#: ../common/parse_manifest.c:774 +msgid "could not parse start LSN" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ початковий LSN" + +#: ../common/parse_manifest.c:777 +msgid "could not parse end LSN" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ кінцевий LSN" + +#: ../common/parse_manifest.c:842 +msgid "expected at least 2 lines" +msgstr "очікувалоÑÑ Ð¿Ñ€Ð¸Ð½Ð°Ð¹Ð¼Ð½Ñ– 2 Ñ€Ñдки" + +#: ../common/parse_manifest.c:845 +msgid "last line not newline-terminated" +msgstr "оÑтанній Ñ€Ñдок не завершений новим Ñ€Ñдком" + +#: ../common/parse_manifest.c:864 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "не вдалоÑÑ Ð¾Ñтаточно завершити контрольну Ñуму маніфеÑту" + +#: ../common/parse_manifest.c:868 +#, c-format +msgid "manifest has no checksum" +msgstr "у маніфеÑті немає контрольної Ñуми" + +#: ../common/parse_manifest.c:872 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "неприпуÑтима контрольна Ñума маніфеÑту: \"%s\"" + +#: ../common/parse_manifest.c:876 +#, c-format +msgid "manifest checksum mismatch" +msgstr "невідповідніÑть контрольної Ñуми маніфеÑту" + +#: ../common/parse_manifest.c:891 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ маніфеÑÑ‚ резервної копії: %s" + +#: ../common/percentrepl.c:79 ../common/percentrepl.c:85 +#: ../common/percentrepl.c:118 ../common/percentrepl.c:124 +#: tcop/backend_startup.c:741 utils/misc/guc.c:3167 utils/misc/guc.c:3208 +#: utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6931 +#: utils/misc/guc.c:6972 +#, c-format +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\": \"%s\"" + +#: ../common/percentrepl.c:80 ../common/percentrepl.c:86 +#, c-format +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "РÑдок неÑподівано завершуєтьÑÑ Ð¿Ñ–ÑÐ»Ñ Ñпеціального Ñимволу \"%%\"." + +#: ../common/percentrepl.c:119 ../common/percentrepl.c:125 +#, c-format +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "РÑдок міÑтить неочікуваний заповнювач \"%%%c\"." + #: ../common/pgfnames.c:74 #, c-format msgid "could not close directory \"%s\": %m" @@ -443,82 +671,79 @@ msgstr "неприпуÑтима назва відгалуженнÑ" msgid "Valid fork names are \"main\", \"fsm\", \"vm\", and \"init\"." msgstr "Дозволені назви відгалуженнÑ: \"main\", \"fsm\", \"vm\" або \"init\"." -#: ../common/restricted_token.c:64 libpq/auth.c:1368 libpq/auth.c:2400 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ бібліотеку \"%s\": код помилки %lu" - -#: ../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "не вдалоÑÑ Ñтворити обмежені токени на цій платформі: код помилки %lu" - -#: ../common/restricted_token.c:82 +#: ../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ токен процеÑу: код помилки %lu" -#: ../common/restricted_token.c:97 +#: ../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ SID: код помилки %lu" -#: ../common/restricted_token.c:119 +#: ../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "не вдалоÑÑ Ñтворити обмежений токен: код помилки %lu" -#: ../common/restricted_token.c:140 +#: ../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ \"%s\": код помилки %lu" -#: ../common/restricted_token.c:178 +#: ../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑтити з обмеженим токеном: код помилки %lu" -#: ../common/restricted_token.c:193 +#: ../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑу: код помилки %lu" -#: ../common/rmtree.c:79 backup/basebackup.c:1099 backup/basebackup.c:1275 +#: ../common/rmtree.c:97 access/heap/rewriteheap.c:1214 +#: access/transam/twophase.c:1717 access/transam/xlogarchive.c:119 +#: access/transam/xlogarchive.c:399 postmaster/postmaster.c:1048 +#: postmaster/syslogger.c:1488 replication/logical/origin.c:591 +#: replication/logical/reorderbuffer.c:4589 +#: replication/logical/snapbuild.c:1712 replication/logical/snapbuild.c:2146 +#: replication/slot.c:2192 storage/file/fd.c:878 storage/file/fd.c:3378 +#: storage/file/fd.c:3440 storage/file/reinit.c:261 storage/ipc/dsm.c:343 +#: storage/smgr/md.c:381 storage/smgr/md.c:440 storage/sync/sync.c:243 +#: utils/time/snapmgr.c:1591 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про файл або каталог \"%s\": %m" +msgid "could not remove file \"%s\": %m" +msgstr "не можливо видалити файл \"%s\": %m" -#: ../common/rmtree.c:101 ../common/rmtree.c:113 +#: ../common/rmtree.c:124 commands/tablespace.c:767 commands/tablespace.c:780 +#: commands/tablespace.c:815 commands/tablespace.c:905 storage/file/fd.c:3370 +#: storage/file/fd.c:3779 #, c-format -msgid "could not remove file or directory \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл або каталог \"%s\": %m" +msgid "could not remove directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ каталог \"%s\": %m" -#: ../common/scram-common.c:260 +#: ../common/scram-common.c:281 msgid "could not encode salt" msgstr "не вдалоÑÑ Ð·Ð°ÐºÐ¾Ð´ÑƒÐ²Ð°Ñ‚Ð¸ Ñіль" -#: ../common/scram-common.c:276 +#: ../common/scram-common.c:297 msgid "could not encode stored key" msgstr "на вдалоÑÑ Ð·Ð°ÐºÐ¾Ð´ÑƒÐ²Ð°Ñ‚Ð¸ збережений ключ" -#: ../common/scram-common.c:293 +#: ../common/scram-common.c:314 msgid "could not encode server key" msgstr "не вдалоÑÑ Ð·Ð°ÐºÐ¾Ð´ÑƒÐ²Ð°Ñ‚Ð¸ Ñерверний ключ" -#: ../common/stringinfo.c:306 +#: ../common/stringinfo.c:315 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." msgstr "Ðе вдалоÑÑ Ð·Ð±Ñ–Ð»ÑŒÑˆÐ¸Ñ‚Ð¸ Ñ€Ñдковий буфер (міÑтить: %d байтів, потребувалоÑÑŒ: %d байтів)." -#: ../common/stringinfo.c:310 +#: ../common/stringinfo.c:319 #, c-format -msgid "" -"out of memory\n" -"\n" +msgid "out of memory\n\n" "Cannot enlarge string buffer containing %d bytes by %d more bytes.\n" -msgstr "" -"недоÑтатньо пам'Ñті\n" -"\n" +msgstr "недоÑтатньо пам'Ñті\n\n" "Ðеможливо збільшити Ñ€Ñдковий буфер (міÑтить: %d байт, потребувалоÑÑŒ: %d байт).\n" #: ../common/username.c:43 @@ -526,7 +751,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "не можу знайти кориÑтувача з ефективним ID %ld: %s" -#: ../common/username.c:45 libpq/auth.c:1900 +#: ../common/username.c:45 libpq/auth.c:1888 msgid "user does not exist" msgstr "кориÑтувача не Ñ–Ñнує" @@ -535,105 +760,105 @@ msgstr "кориÑтувача не Ñ–Ñнує" msgid "user name lookup failure: error code %lu" msgstr "невдала підÑтановка імені кориÑтувача: код помилки %lu" -#: ../common/wait_error.c:45 +#: ../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "неможливо виконати команду" -#: ../common/wait_error.c:49 +#: ../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "команду не знайдено" -#: ../common/wait_error.c:54 +#: ../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· кодом виходу %d" -#: ../common/wait_error.c:62 +#: ../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через помилку 0Ñ…%X" -#: ../common/wait_error.c:66 +#: ../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через Ñигнал %d: %s" -#: ../common/wait_error.c:72 +#: ../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· невизнаним ÑтатуÑом %d" -#: ../port/chklocale.c:306 +#: ../port/chklocale.c:283 #, c-format msgid "could not determine encoding for codeset \"%s\"" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ñƒ Ñимволів \"%s\"" -#: ../port/chklocale.c:427 ../port/chklocale.c:433 +#: ../port/chklocale.c:404 ../port/chklocale.c:410 #, c-format msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð´Ð¾ÐºÐ°Ð»Ñ– \"%s\": набір Ñимволів \"%s\"" -#: ../port/dirmod.c:218 +#: ../port/dirmod.c:284 #, c-format msgid "could not set junction for \"%s\": %s" msgstr "не вдалоÑÑ Ð²Ñтановити ÑÐ¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ \"%s\": %s" -#: ../port/dirmod.c:221 +#: ../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" msgstr "не вдалоÑÑ Ð²Ñтановити ÑÐ¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ \"%s\": %s\n" -#: ../port/dirmod.c:295 +#: ../port/dirmod.c:364 #, c-format msgid "could not get junction for \"%s\": %s" msgstr "не вдалоÑÑ Ð²Ñтановити ÑÐ¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ \"%s\": %s" -#: ../port/dirmod.c:298 +#: ../port/dirmod.c:367 #, c-format msgid "could not get junction for \"%s\": %s\n" msgstr "не вдалоÑÑ Ð²Ñтановити ÑÐ¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ \"%s\": %s\n" -#: ../port/open.c:117 +#: ../port/open.c:115 #, c-format msgid "could not open file \"%s\": %s" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %s" -#: ../port/open.c:118 +#: ../port/open.c:116 msgid "lock violation" msgstr "Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ" -#: ../port/open.c:118 +#: ../port/open.c:116 msgid "sharing violation" msgstr "Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ñпільного доÑтупу" -#: ../port/open.c:119 +#: ../port/open.c:117 #, c-format msgid "Continuing to retry for 30 seconds." msgstr "Продовжую Ñпроби протÑгом 30 Ñекунд." -#: ../port/open.c:120 +#: ../port/open.c:118 #, c-format msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "Ви можливо маєте антивіруÑ, резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ аналогічне програмне забезпеченнÑ, що втручаєтьÑÑ Ñƒ роботу ÑиÑтеми бази даних." -#: ../port/path.c:775 +#: ../port/path.c:852 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ поточний робочий каталог: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ поточний робочий каталог: %m\n" #: ../port/strerror.c:72 #, c-format msgid "operating system error %d" msgstr "помилка операційної ÑиÑтеми %d" -#: ../port/thread.c:100 ../port/thread.c:136 +#: ../port/user.c:43 ../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ локального кориÑтувача з ідентифікатором %d: %s" -#: ../port/thread.c:105 ../port/thread.c:141 +#: ../port/user.c:48 ../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "локального кориÑтувача з ідентифікатором %d не Ñ–Ñнує" @@ -653,114 +878,104 @@ msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ SID Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¸ PowerUsers: msgid "could not check access token membership: error code %lu\n" msgstr "не вдаєтьÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ членÑтво токену доÑтупу: код помилки %lu\n" -#: access/brin/brin.c:214 +#: access/brin/brin.c:405 #, c-format msgid "request for BRIN range summarization for index \"%s\" page %u was not recorded" msgstr "запит на підÑумок діапазону BRIN Ð´Ð»Ñ Ñ–Ð½Ð´ÐµÐºÑу «%s» Ñторінки %u не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати" -#: access/brin/brin.c:1018 access/brin/brin.c:1119 access/gin/ginfast.c:1035 -#: access/transam/xlogfuncs.c:165 access/transam/xlogfuncs.c:192 -#: access/transam/xlogfuncs.c:231 access/transam/xlogfuncs.c:252 -#: access/transam/xlogfuncs.c:273 access/transam/xlogfuncs.c:343 -#: access/transam/xlogfuncs.c:401 +#: access/brin/brin.c:1387 access/brin/brin.c:1495 access/gin/ginfast.c:1040 +#: access/transam/xlogfuncs.c:183 access/transam/xlogfuncs.c:208 +#: access/transam/xlogfuncs.c:241 access/transam/xlogfuncs.c:280 +#: access/transam/xlogfuncs.c:301 access/transam/xlogfuncs.c:322 +#: access/transam/xlogfuncs.c:388 access/transam/xlogfuncs.c:446 #, c-format msgid "recovery is in progress" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñƒ процеÑÑ–" -#: access/brin/brin.c:1019 access/brin/brin.c:1120 +#: access/brin/brin.c:1388 access/brin/brin.c:1496 #, c-format msgid "BRIN control functions cannot be executed during recovery." msgstr "Контрольна Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ BRIN не може бути виконана під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: access/brin/brin.c:1024 access/brin/brin.c:1125 +#: access/brin/brin.c:1393 access/brin/brin.c:1501 #, c-format msgid "block number out of range: %lld" msgstr "номер блоку поза діапазоном: %lld" -#: access/brin/brin.c:1068 access/brin/brin.c:1151 +#: access/brin/brin.c:1438 access/brin/brin.c:1527 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\" не Ñ” індекÑом BRIN" -#: access/brin/brin.c:1084 access/brin/brin.c:1167 +#: access/brin/brin.c:1454 access/brin/brin.c:1543 #, c-format msgid "could not open parent table of index \"%s\"" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ батьківÑьку таблицю індекÑу \"%s\"" -#: access/brin/brin_bloom.c:750 access/brin/brin_bloom.c:792 -#: access/brin/brin_minmax_multi.c:3004 access/brin/brin_minmax_multi.c:3147 -#: statistics/dependencies.c:663 statistics/dependencies.c:716 -#: statistics/mcv.c:1484 statistics/mcv.c:1515 statistics/mvdistinct.c:344 -#: statistics/mvdistinct.c:397 utils/adt/pseudotypes.c:43 -#: utils/adt/pseudotypes.c:77 utils/adt/pseudotypes.c:252 +#: access/brin/brin.c:1463 access/brin/brin.c:1559 access/gin/ginfast.c:1085 +#: parser/parse_utilcmd.c:2277 #, c-format -msgid "cannot accept a value of type %s" -msgstr "не можна прийнÑти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s" +msgid "index \"%s\" is not valid" +msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" не Ñ” припуÑтимим" -#: access/brin/brin_minmax_multi.c:2163 access/brin/brin_minmax_multi.c:2170 -#: access/brin/brin_minmax_multi.c:2177 utils/adt/timestamp.c:938 -#: utils/adt/timestamp.c:1509 utils/adt/timestamp.c:2761 -#: utils/adt/timestamp.c:2778 utils/adt/timestamp.c:2831 -#: utils/adt/timestamp.c:2870 utils/adt/timestamp.c:3115 -#: utils/adt/timestamp.c:3120 utils/adt/timestamp.c:3125 -#: utils/adt/timestamp.c:3175 utils/adt/timestamp.c:3182 -#: utils/adt/timestamp.c:3189 utils/adt/timestamp.c:3209 -#: utils/adt/timestamp.c:3216 utils/adt/timestamp.c:3223 -#: utils/adt/timestamp.c:3253 utils/adt/timestamp.c:3261 -#: utils/adt/timestamp.c:3305 utils/adt/timestamp.c:3731 -#: utils/adt/timestamp.c:3855 utils/adt/timestamp.c:4405 +#: access/brin/brin_bloom.c:785 access/brin/brin_bloom.c:827 +#: access/brin/brin_minmax_multi.c:2984 access/brin/brin_minmax_multi.c:3121 +#: statistics/dependencies.c:661 statistics/dependencies.c:714 +#: statistics/mcv.c:1480 statistics/mcv.c:1511 statistics/mvdistinct.c:343 +#: statistics/mvdistinct.c:396 utils/adt/pseudotypes.c:40 +#: utils/adt/pseudotypes.c:74 utils/adt/tsgistidx.c:94 #, c-format -msgid "interval out of range" -msgstr "інтервал поза діапазоном" +msgid "cannot accept a value of type %s" +msgstr "не можна прийнÑти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s" -#: access/brin/brin_pageops.c:76 access/brin/brin_pageops.c:362 -#: access/brin/brin_pageops.c:848 access/gin/ginentrypage.c:110 -#: access/gist/gist.c:1442 access/spgist/spgdoinsert.c:2001 +#: access/brin/brin_pageops.c:75 access/brin/brin_pageops.c:361 +#: access/brin/brin_pageops.c:851 access/gin/ginentrypage.c:109 +#: access/gist/gist.c:1463 access/spgist/spgdoinsert.c:2001 #: access/spgist/spgdoinsert.c:2278 #, c-format msgid "index row size %zu exceeds maximum %zu for index \"%s\"" msgstr "розмір Ñ€Ñдка індекÑу %zu перевищує макÑимальний %zu Ð´Ð»Ñ Ñ–Ð½Ð´ÐµÐºÑу \"%s\"" -#: access/brin/brin_revmap.c:393 access/brin/brin_revmap.c:399 +#: access/brin/brin_revmap.c:383 access/brin/brin_revmap.c:389 #, c-format msgid "corrupted BRIN index: inconsistent range map" msgstr "пошкоджений BRIN індекÑ: неÑуміÑна карта діапазонів" -#: access/brin/brin_revmap.c:602 +#: access/brin/brin_revmap.c:583 #, c-format msgid "unexpected page type 0x%04X in BRIN index \"%s\" block %u" msgstr "неочікуваний тип Ñторінки 0x%04X в BRIN індекÑÑ– \"%s\" блокує %u" -#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:151 -#: access/gist/gistvalidate.c:153 access/hash/hashvalidate.c:139 +#: access/brin/brin_validate.c:118 access/gin/ginvalidate.c:149 +#: access/gist/gistvalidate.c:152 access/hash/hashvalidate.c:139 #: access/nbtree/nbtvalidate.c:120 access/spgist/spgvalidate.c:189 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with invalid support number %d" msgstr "ÑімейÑтво операторів \"%s\" методу доÑтупу %s міÑтить функцію %s з недопуÑтимим номером підтримки %d" -#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:163 -#: access/gist/gistvalidate.c:165 access/hash/hashvalidate.c:118 +#: access/brin/brin_validate.c:134 access/gin/ginvalidate.c:161 +#: access/gist/gistvalidate.c:164 access/hash/hashvalidate.c:118 #: access/nbtree/nbtvalidate.c:132 access/spgist/spgvalidate.c:201 #, c-format msgid "operator family \"%s\" of access method %s contains function %s with wrong signature for support number %d" msgstr "ÑімейÑтво операторів \"%s\" з доÑтупом %s міÑтить функцію %s з неправильним підпиÑом Ð´Ð»Ñ Ð½Ð¾Ð¼ÐµÑ€Ñƒ підтримки %d" -#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:182 -#: access/gist/gistvalidate.c:185 access/hash/hashvalidate.c:160 +#: access/brin/brin_validate.c:156 access/gin/ginvalidate.c:180 +#: access/gist/gistvalidate.c:184 access/hash/hashvalidate.c:160 #: access/nbtree/nbtvalidate.c:152 access/spgist/spgvalidate.c:221 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with invalid strategy number %d" msgstr "ÑімейÑтво операторів \"%s\" з доÑтупом %s міÑтить оператор %s з недопуÑтимим Ñтратегічним номером %d" -#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:195 +#: access/brin/brin_validate.c:185 access/gin/ginvalidate.c:193 #: access/hash/hashvalidate.c:173 access/nbtree/nbtvalidate.c:165 #: access/spgist/spgvalidate.c:237 #, c-format msgid "operator family \"%s\" of access method %s contains invalid ORDER BY specification for operator %s" msgstr "ÑімейÑтво операторів \"%s\" з доÑтупом %s міÑтить некоректну Ñпецифікацію ORDER BY Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° %s" -#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:208 -#: access/gist/gistvalidate.c:233 access/hash/hashvalidate.c:186 +#: access/brin/brin_validate.c:198 access/gin/ginvalidate.c:206 +#: access/gist/gistvalidate.c:232 access/hash/hashvalidate.c:186 #: access/nbtree/nbtvalidate.c:178 access/spgist/spgvalidate.c:253 #, c-format msgid "operator family \"%s\" of access method %s contains operator %s with wrong signature" @@ -783,38 +998,38 @@ msgstr "ÑімейÑтво операторів \"%s\" з методом Ð´Ð¾Ñ msgid "operator class \"%s\" of access method %s is missing operator(s)" msgstr "ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² \"%s\" з методом доÑтупа %s не має операторів" -#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:250 -#: access/gist/gistvalidate.c:274 +#: access/brin/brin_validate.c:270 access/gin/ginvalidate.c:248 +#: access/gist/gistvalidate.c:273 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d" msgstr "ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² \"%s\" з доÑтупом %s немає функції підтримки %d" -#: access/common/attmap.c:122 +#: access/common/attmap.c:121 #, c-format msgid "Returned type %s does not match expected type %s in column %d." msgstr "Повернений тип %s не відповідає очікуваному типу %s в Ñтовпці %d." -#: access/common/attmap.c:150 +#: access/common/attmap.c:149 #, c-format msgid "Number of returned columns (%d) does not match expected column count (%d)." msgstr "КількіÑть повернених Ñтовпців (%d) не відповідає очікуваній кількоÑті Ñтовпців (%d)." -#: access/common/attmap.c:229 access/common/attmap.c:241 +#: access/common/attmap.c:233 access/common/attmap.c:245 #, c-format msgid "could not convert row type" msgstr "неможливо конвертувати тип Ñ€Ñдка" -#: access/common/attmap.c:230 +#: access/common/attmap.c:234 #, c-format msgid "Attribute \"%s\" of type %s does not match corresponding attribute of type %s." msgstr "Ðтрибут \"%s\" типу %s не збігаєтьÑÑ Ð· відповідним атрибутом типу %s." -#: access/common/attmap.c:242 +#: access/common/attmap.c:246 #, c-format msgid "Attribute \"%s\" of type %s does not exist in type %s." msgstr "Ðтрибут \"%s\" типу %s не Ñ–Ñнує в типі %s." -#: access/common/heaptuple.c:1036 access/common/heaptuple.c:1371 +#: access/common/heaptuple.c:1132 access/common/heaptuple.c:1467 #, c-format msgid "number of columns (%d) exceeds limit (%d)" msgstr "кількіÑть Ñтовпців (%d) перевищує Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ (%d)" @@ -824,106 +1039,110 @@ msgstr "кількіÑть Ñтовпців (%d) перевищує обмеже msgid "number of index columns (%d) exceeds limit (%d)" msgstr "кількіÑть індекÑних Ñтовпців (%d) перевищує Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ (%d)" -#: access/common/indextuple.c:209 access/spgist/spgutils.c:958 +#: access/common/indextuple.c:209 access/spgist/spgutils.c:970 #, c-format msgid "index row requires %zu bytes, maximum size is %zu" msgstr "індекÑний Ñ€Ñдок вимагає %zu байтів, макÑимальний розмір %zu" -#: access/common/printtup.c:292 tcop/fastpath.c:106 tcop/fastpath.c:453 -#: tcop/postgres.c:1921 +#: access/common/printtup.c:292 commands/explain.c:5376 tcop/fastpath.c:107 +#: tcop/fastpath.c:454 tcop/postgres.c:1956 #, c-format msgid "unsupported format code: %d" msgstr "цей формат коду не підтримуєтьÑÑ:%d" -#: access/common/reloptions.c:521 access/common/reloptions.c:532 +#: access/common/reloptions.c:519 access/common/reloptions.c:530 msgid "Valid values are \"on\", \"off\", and \"auto\"." msgstr "ДійÑні Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"увімкнено\", \"вимкнено\" та \"автоматично\"." -#: access/common/reloptions.c:543 +#: access/common/reloptions.c:541 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "ПрипуÑтимі Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð»Ð¸ÑˆÐµ \"local\" Ñ– \"cascaded\"." -#: access/common/reloptions.c:691 +#: access/common/reloptions.c:689 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "перевищено вÑтановлене кориÑтувачем Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ параметрів відношеннÑ" -#: access/common/reloptions.c:1234 +#: access/common/reloptions.c:1231 #, c-format msgid "RESET must not include values for parameters" msgstr "RESET не має міÑтити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð²" -#: access/common/reloptions.c:1266 +#: access/common/reloptions.c:1263 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "нерозпізнаний параметр проÑтору імен \"%s\"" -#: access/common/reloptions.c:1303 utils/misc/guc.c:12996 +#: access/common/reloptions.c:1300 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "таблиці, позначені WITH OIDS, не підтримуютьÑÑ" -#: access/common/reloptions.c:1473 +#: access/common/reloptions.c:1468 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "нерозпізнаний параметр \"%s\"" -#: access/common/reloptions.c:1585 +#: access/common/reloptions.c:1580 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "параметр «%s» вказано кілька разів" -#: access/common/reloptions.c:1601 +#: access/common/reloptions.c:1596 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð±ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ параметра \"%s\": %s" -#: access/common/reloptions.c:1613 +#: access/common/reloptions.c:1608 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ†Ñ–Ð»Ð¾Ð³Ð¾ параметра \"%s\": %s" -#: access/common/reloptions.c:1619 access/common/reloptions.c:1639 +#: access/common/reloptions.c:1614 access/common/reloptions.c:1634 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s поза допуÑтимими межами Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\"" -#: access/common/reloptions.c:1621 +#: access/common/reloptions.c:1616 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "ПрипуÑтимі Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´ÑтьÑÑ Ð¼Ñ–Ð¶ \"%d\" Ñ– \"%d\"." -#: access/common/reloptions.c:1633 +#: access/common/reloptions.c:1628 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ‡Ð¸Ñла з плавучою точкою параметра \"%s\": %s" -#: access/common/reloptions.c:1641 +#: access/common/reloptions.c:1636 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "ПрипуÑтимі Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ…Ð¾Ð´ÑтьÑÑ Ð¼Ñ–Ð¶ \"%f\" Ñ– \"%f\"." -#: access/common/reloptions.c:1663 +#: access/common/reloptions.c:1658 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "недійÑне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° Ð¿ÐµÑ€ÐµÑ€Ð°Ñ…ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\": %s" -#: access/common/toast_compression.c:32 +#: access/common/reloptions.c:1989 +#, c-format +msgid "cannot specify storage parameters for a partitioned table" +msgstr "неможливо вказати параметри Ñховища Ð´Ð»Ñ Ñекціонованої таблиці" + +#: access/common/reloptions.c:1990 +#, c-format +msgid "Specify storage parameters for its leaf partitions instead." +msgstr "Вкажіть параметри Ñховища Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¸Ñ… розділів." + +#: access/common/toast_compression.c:31 #, c-format msgid "compression method lz4 not supported" msgstr "метод ÑтиÑÐºÐ°Ð½Ð½Ñ lz4 не підтримуєтьÑÑ" -#: access/common/toast_compression.c:33 +#: access/common/toast_compression.c:32 #, c-format msgid "This functionality requires the server to be built with lz4 support." msgstr "Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¾Ð½Ð°Ð»ÑŒÐ½Ñ–Ñть потребує, щоб Ñервер був побудований з підтримкою lz4." -#: access/common/tupdesc.c:825 parser/parse_clause.c:773 -#: parser/parse_relation.c:1857 -#, c-format -msgid "column \"%s\" cannot be declared SETOF" -msgstr "Ñтовпець\"%s\" не може бути оголошений SETOF" - #: access/gin/ginbulk.c:44 #, c-format msgid "posting list is too long" @@ -931,83 +1150,83 @@ msgstr "ÑпиÑок вказівників задовгий" #: access/gin/ginbulk.c:45 #, c-format -msgid "Reduce maintenance_work_mem." -msgstr "Зменшіть maintenance_work_mem." +msgid "Reduce \"maintenance_work_mem\"." +msgstr "Зменшіть \"maintenance_work_mem\"." -#: access/gin/ginfast.c:1036 +#: access/gin/ginfast.c:1041 #, c-format msgid "GIN pending list cannot be cleaned up during recovery." msgstr "Черга запиÑів GIN не може бути очищена під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: access/gin/ginfast.c:1043 +#: access/gin/ginfast.c:1048 #, c-format msgid "\"%s\" is not a GIN index" msgstr "\"%s\" не Ñ” індекÑом GIN" -#: access/gin/ginfast.c:1054 +#: access/gin/ginfast.c:1059 #, c-format msgid "cannot access temporary indexes of other sessions" msgstr "доÑтуп до тимчаÑових індекÑів з інших ÑеÑій заблокований" -#: access/gin/ginget.c:271 access/nbtree/nbtinsert.c:760 +#: access/gin/ginget.c:271 access/nbtree/nbtinsert.c:762 #, c-format msgid "failed to re-find tuple within index \"%s\"" msgstr "не вдалоÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ знайти кортеж в межах індекÑу \"%s\"" -#: access/gin/ginscan.c:431 +#: access/gin/ginscan.c:436 #, c-format msgid "old GIN indexes do not support whole-index scans nor searches for nulls" msgstr "Ñтарі індекÑи GIN не підтримують ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ñ–Ð»Ð¾Ð³Ð¾ індекÑу й пошуки Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ null" -#: access/gin/ginscan.c:432 +#: access/gin/ginscan.c:437 #, c-format msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "Щоб виправити це, зробіть REINDEX INDEX \"%s\"." -#: access/gin/ginutil.c:145 executor/execExpr.c:2165 -#: utils/adt/arrayfuncs.c:3819 utils/adt/arrayfuncs.c:6488 -#: utils/adt/rowtypes.c:957 +#: access/gin/ginutil.c:147 executor/execExpr.c:2200 +#: utils/adt/arrayfuncs.c:4016 utils/adt/arrayfuncs.c:6714 +#: utils/adt/rowtypes.c:974 #, c-format msgid "could not identify a comparison function for type %s" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ порівнÑльну функцію Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" -#: access/gin/ginvalidate.c:92 access/gist/gistvalidate.c:93 +#: access/gin/ginvalidate.c:90 access/gist/gistvalidate.c:92 #: access/hash/hashvalidate.c:102 access/spgist/spgvalidate.c:102 #, c-format msgid "operator family \"%s\" of access method %s contains support function %s with different left and right input types" msgstr "ÑімейÑтво операторів \"%s\" з методом доÑтупу %s міÑтить функцію підтримки %s з різними типами вводу зліва Ñ– Ñправа" -#: access/gin/ginvalidate.c:260 +#: access/gin/ginvalidate.c:258 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d or %d" msgstr "ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² \"%s\" з методом доÑтупу %s не має функції підтримки %d або %d" -#: access/gin/ginvalidate.c:333 access/gist/gistvalidate.c:350 +#: access/gin/ginvalidate.c:331 access/gist/gistvalidate.c:349 #: access/spgist/spgvalidate.c:387 #, c-format msgid "support function number %d is invalid for access method %s" msgstr "номер функції підтримки %d неприпуÑтимий Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ доÑтупу %s" -#: access/gist/gist.c:759 access/gist/gistvacuum.c:426 +#: access/gist/gist.c:760 access/gist/gistvacuum.c:426 #, c-format msgid "index \"%s\" contains an inner tuple marked as invalid" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" міÑтить внутрішній кортеж, позначений Ñк неправильний" -#: access/gist/gist.c:761 access/gist/gistvacuum.c:428 +#: access/gist/gist.c:762 access/gist/gistvacuum.c:428 #, c-format msgid "This is caused by an incomplete page split at crash recovery before upgrading to PostgreSQL 9.1." msgstr "Це викликано неповним поділом Ñторінки під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ покращеннÑм до верÑÑ–Ñ— PostgreSQL 9.1." -#: access/gist/gist.c:762 access/gist/gistutil.c:801 access/gist/gistutil.c:812 -#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:227 -#: access/hash/hashutil.c:238 access/hash/hashutil.c:250 -#: access/hash/hashutil.c:271 access/nbtree/nbtpage.c:810 -#: access/nbtree/nbtpage.c:821 +#: access/gist/gist.c:763 access/gist/gistutil.c:800 access/gist/gistutil.c:811 +#: access/gist/gistvacuum.c:429 access/hash/hashutil.c:226 +#: access/hash/hashutil.c:237 access/hash/hashutil.c:249 +#: access/hash/hashutil.c:270 access/nbtree/nbtpage.c:813 +#: access/nbtree/nbtpage.c:824 #, c-format msgid "Please REINDEX it." msgstr "Будь лаÑка, виконайте REINDEX." -#: access/gist/gist.c:1176 +#: access/gist/gist.c:1196 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "Ð²Ð¸Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¿Ð¾Ð²Ð½Ð¾Ð³Ð¾ розділу в індекÑÑ– \"%s\", блок %u" @@ -1022,52 +1241,52 @@ msgstr "помилка методу picksplit Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ %d інде msgid "The index is not optimal. To optimize it, contact a developer, or try to use the column as the second one in the CREATE INDEX command." msgstr "Ð†Ð½Ð´ÐµÐºÑ Ð½Ðµ Ñ” оптимальним. Щоб оптимізувати його, зв'ÑжітьÑÑ Ð· розробником або Ñпробуйте викориÑтати Ñтовпець Ñк другий Ñ–Ð½Ð´ÐµÐºÑ Ñƒ команді CREATE INDEX." -#: access/gist/gistutil.c:798 access/hash/hashutil.c:224 -#: access/nbtree/nbtpage.c:807 +#: access/gist/gistutil.c:797 access/hash/hashutil.c:223 +#: access/nbtree/nbtpage.c:810 #, c-format msgid "index \"%s\" contains unexpected zero page at block %u" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" міÑтить неочікувану нульову Ñторінку в блоці %u" -#: access/gist/gistutil.c:809 access/hash/hashutil.c:235 -#: access/hash/hashutil.c:247 access/nbtree/nbtpage.c:818 +#: access/gist/gistutil.c:808 access/hash/hashutil.c:234 +#: access/hash/hashutil.c:246 access/nbtree/nbtpage.c:821 #, c-format msgid "index \"%s\" contains corrupted page at block %u" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" міÑтить пошкоджену Ñторінку в блоці %u" -#: access/gist/gistvalidate.c:203 +#: access/gist/gistvalidate.c:202 #, c-format msgid "operator family \"%s\" of access method %s contains unsupported ORDER BY specification for operator %s" msgstr "ÑімейÑтво операторів \"%s\" з методом доÑтупу %s міÑтить непідтримувану Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñпецифікацію ORDER BY %s" -#: access/gist/gistvalidate.c:214 +#: access/gist/gistvalidate.c:213 #, c-format msgid "operator family \"%s\" of access method %s contains incorrect ORDER BY opfamily specification for operator %s" msgstr "ÑімейÑтво операторів \"%s\" з методом доÑтупу %s міÑтить некоректну Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñпецифікацію ORDER BY opfamily %s" -#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 -#: utils/adt/varchar.c:1003 utils/adt/varchar.c:1063 +#: access/hash/hashfunc.c:277 access/hash/hashfunc.c:333 +#: utils/adt/varchar.c:1008 utils/adt/varchar.c:1065 #, c-format msgid "could not determine which collation to use for string hashing" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸, Ñкий параметр ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтати Ð´Ð»Ñ Ð¾Ð±Ñ‡Ð¸ÑÐ»ÐµÐ½Ð½Ñ Ñ…ÐµÑˆÑƒ Ñ€Ñдків" -#: access/hash/hashfunc.c:279 access/hash/hashfunc.c:335 catalog/heap.c:665 -#: catalog/heap.c:671 commands/createas.c:206 commands/createas.c:515 -#: commands/indexcmds.c:1951 commands/tablecmds.c:17446 commands/view.c:86 -#: regex/regc_pg_locale.c:243 utils/adt/formatting.c:1685 -#: utils/adt/formatting.c:1807 utils/adt/formatting.c:1930 utils/adt/like.c:190 -#: utils/adt/like_support.c:1024 utils/adt/varchar.c:733 -#: utils/adt/varchar.c:1004 utils/adt/varchar.c:1064 utils/adt/varlena.c:1499 +#: access/hash/hashfunc.c:278 access/hash/hashfunc.c:334 catalog/heap.c:673 +#: catalog/heap.c:679 commands/createas.c:201 commands/createas.c:508 +#: commands/indexcmds.c:2021 commands/tablecmds.c:18209 commands/view.c:81 +#: regex/regc_pg_locale.c:245 utils/adt/formatting.c:1653 +#: utils/adt/formatting.c:1801 utils/adt/formatting.c:1991 utils/adt/like.c:189 +#: utils/adt/like_support.c:1024 utils/adt/varchar.c:738 +#: utils/adt/varchar.c:1009 utils/adt/varchar.c:1066 utils/adt/varlena.c:1521 #, c-format msgid "Use the COLLATE clause to set the collation explicitly." msgstr "ВикориÑтайте опцію COLLATE Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð² ÑортуваннÑ." -#: access/hash/hashinsert.c:83 +#: access/hash/hashinsert.c:84 #, c-format msgid "index row size %zu exceeds hash maximum %zu" msgstr "індекÑний Ñ€Ñдок розміру %zu перевищує макÑимальний хеш %zu" -#: access/hash/hashinsert.c:85 access/spgist/spgdoinsert.c:2005 -#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1019 +#: access/hash/hashinsert.c:86 access/spgist/spgdoinsert.c:2005 +#: access/spgist/spgdoinsert.c:2282 access/spgist/spgutils.c:1031 #, c-format msgid "Values larger than a buffer page cannot be indexed." msgstr "ЗначеннÑ, що перевищують буфер Ñторінки, не можна індекÑувати." @@ -1082,17 +1301,17 @@ msgstr "недійÑний номер блока Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ %u" msgid "out of overflow pages in hash index \"%s\"" msgstr "закінчилиÑÑŒ переповнені Ñторінки в хеш-індекÑÑ– \"%s\"" -#: access/hash/hashsearch.c:315 +#: access/hash/hashsearch.c:311 #, c-format msgid "hash indexes do not support whole-index scans" msgstr "хеш-індекÑи не підтримують ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ñ–Ð»Ð¾Ð³Ð¾ індекÑу" -#: access/hash/hashutil.c:263 +#: access/hash/hashutil.c:262 #, c-format msgid "index \"%s\" is not a hash index" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" не Ñ” хеш-індекÑом" -#: access/hash/hashutil.c:269 +#: access/hash/hashutil.c:268 #, c-format msgid "index \"%s\" has wrong hash version" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" має неправильну верÑÑ–ÑŽ хешу" @@ -1107,305 +1326,302 @@ msgstr "ÑімейÑтво операторів \"%s\" з методом Ð´Ð¾Ñ msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "ÑімейÑтво операторів \"%s\" з методом доÑтупу %s не міÑтить міжтипового оператора (ів)" -#: access/heap/heapam.c:2226 +#: access/heap/heapam.c:2206 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "не вдалоÑÑ Ð²Ñтавити кортежі в паралельного працівника" -#: access/heap/heapam.c:2697 +#: access/heap/heapam.c:2725 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ кортежі під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ñ— операції" -#: access/heap/heapam.c:2743 +#: access/heap/heapam.c:2772 #, c-format msgid "attempted to delete invisible tuple" msgstr "Ñпроба видалити невидимий кортеж" -#: access/heap/heapam.c:3175 access/heap/heapam.c:6017 +#: access/heap/heapam.c:3220 access/heap/heapam.c:6501 access/index/genam.c:818 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "неможливо оновити кортежі під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ñ— операції" -#: access/heap/heapam.c:3299 +#: access/heap/heapam.c:3397 #, c-format msgid "attempted to update invisible tuple" msgstr "Ñпроба оновити невидимий кортеж" -#: access/heap/heapam.c:4661 access/heap/heapam.c:4699 -#: access/heap/heapam.c:4964 access/heap/heapam_handler.c:456 +#: access/heap/heapam.c:4908 access/heap/heapam.c:4946 +#: access/heap/heapam.c:5211 access/heap/heapam_handler.c:468 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ Ñ€Ñдку ÑтоÑовно \"%s\"" -#: access/heap/heapam_handler.c:401 +#: access/heap/heapam.c:6314 commands/trigger.c:3340 +#: executor/nodeModifyTable.c:2376 executor/nodeModifyTable.c:2467 +#, c-format +msgid "tuple to be updated was already modified by an operation triggered by the current command" +msgstr "кортеж, Ñкий повинен бути оновленим, вже змінений в операції, Ñка викликана поточною командою" + +#: access/heap/heapam_handler.c:413 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update" msgstr "кортеж, Ñкий підлÑгає блокуванню, вже був переміщений до іншої Ñекції в результаті паралельного оновленнÑ" -#: access/heap/hio.c:360 access/heap/rewriteheap.c:660 +#: access/heap/hio.c:535 access/heap/rewriteheap.c:640 #, c-format msgid "row is too big: size %zu, maximum size %zu" msgstr "Ñ€Ñдок завеликий: розмір %zu, макÑимальний розмір %zu" -#: access/heap/rewriteheap.c:920 +#: access/heap/rewriteheap.c:885 #, c-format msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файлу \"%s\", запиÑано %d з %d: %m" -#: access/heap/rewriteheap.c:1013 access/heap/rewriteheap.c:1131 -#: access/transam/timeline.c:329 access/transam/timeline.c:485 -#: access/transam/xlog.c:2963 access/transam/xlog.c:3176 -#: access/transam/xlog.c:3964 access/transam/xlog.c:8639 -#: access/transam/xlogfuncs.c:594 backup/basebackup_server.c:149 -#: backup/basebackup_server.c:242 commands/dbcommands.c:524 -#: postmaster/postmaster.c:4597 postmaster/postmaster.c:5618 -#: replication/logical/origin.c:587 replication/slot.c:1596 -#: storage/file/copydir.c:167 storage/smgr/md.c:222 utils/time/snapmgr.c:1261 +#: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 +#: access/transam/timeline.c:329 access/transam/timeline.c:481 +#: access/transam/xlog.c:3255 access/transam/xlog.c:3446 +#: access/transam/xlog.c:4283 access/transam/xlog.c:9269 +#: access/transam/xlogfuncs.c:692 backup/basebackup_server.c:149 +#: backup/basebackup_server.c:242 commands/dbcommands.c:494 +#: postmaster/launch_backend.c:340 postmaster/postmaster.c:4114 +#: postmaster/walsummarizer.c:1212 replication/logical/origin.c:603 +#: replication/slot.c:2059 storage/file/copydir.c:157 storage/smgr/md.c:230 +#: utils/time/snapmgr.c:1234 #, c-format msgid "could not create file \"%s\": %m" msgstr "неможливо Ñтворити файл \"%s\": %m" -#: access/heap/rewriteheap.c:1141 +#: access/heap/rewriteheap.c:1104 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "не вдалоÑÑ Ñкоротити файл \"%s\" до потрібного розміру %u: %m" -#: access/heap/rewriteheap.c:1159 access/transam/timeline.c:384 -#: access/transam/timeline.c:424 access/transam/timeline.c:502 -#: access/transam/xlog.c:3035 access/transam/xlog.c:3232 -#: access/transam/xlog.c:3976 commands/dbcommands.c:536 -#: postmaster/postmaster.c:4607 postmaster/postmaster.c:4617 -#: replication/logical/origin.c:599 replication/logical/origin.c:641 -#: replication/logical/origin.c:660 replication/logical/snapbuild.c:1726 -#: replication/slot.c:1631 storage/file/buffile.c:537 -#: storage/file/copydir.c:207 utils/init/miscinit.c:1441 -#: utils/init/miscinit.c:1452 utils/init/miscinit.c:1460 utils/misc/guc.c:8731 -#: utils/misc/guc.c:8762 utils/misc/guc.c:10751 utils/misc/guc.c:10765 -#: utils/time/snapmgr.c:1266 utils/time/snapmgr.c:1273 +#: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 +#: access/transam/timeline.c:424 access/transam/timeline.c:498 +#: access/transam/xlog.c:3305 access/transam/xlog.c:3502 +#: access/transam/xlog.c:4295 commands/dbcommands.c:506 +#: postmaster/launch_backend.c:351 postmaster/launch_backend.c:363 +#: replication/logical/origin.c:615 replication/logical/origin.c:657 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1788 +#: replication/slot.c:2094 storage/file/buffile.c:545 +#: storage/file/copydir.c:197 utils/init/miscinit.c:1655 +#: utils/init/miscinit.c:1666 utils/init/miscinit.c:1674 utils/misc/guc.c:4491 +#: utils/misc/guc.c:4522 utils/misc/guc.c:5675 utils/misc/guc.c:5693 +#: utils/time/snapmgr.c:1239 utils/time/snapmgr.c:1246 #, c-format msgid "could not write to file \"%s\": %m" msgstr "неможливо запиÑати до файлу \"%s\": %m" -#: access/heap/rewriteheap.c:1249 access/transam/twophase.c:1705 -#: access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:429 -#: postmaster/postmaster.c:1157 postmaster/syslogger.c:1537 -#: replication/logical/origin.c:575 replication/logical/reorderbuffer.c:4397 -#: replication/logical/snapbuild.c:1671 replication/logical/snapbuild.c:2087 -#: replication/slot.c:1728 storage/file/fd.c:795 storage/file/fd.c:3263 -#: storage/file/fd.c:3325 storage/file/reinit.c:262 storage/ipc/dsm.c:317 -#: storage/smgr/md.c:349 storage/smgr/md.c:415 storage/sync/sync.c:250 -#: utils/time/snapmgr.c:1606 -#, c-format -msgid "could not remove file \"%s\": %m" -msgstr "не можливо видалити файл \"%s\": %m" - -#: access/heap/vacuumlazy.c:407 +#: access/heap/vacuumlazy.c:473 #, c-format msgid "aggressively vacuuming \"%s.%s.%s\"" msgstr "агреÑивне Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ \"%s.%s.%s\"" -#: access/heap/vacuumlazy.c:412 +#: access/heap/vacuumlazy.c:478 #, c-format msgid "vacuuming \"%s.%s.%s\"" msgstr "Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ \"%s.%s.%s\"" -#: access/heap/vacuumlazy.c:663 +#: access/heap/vacuumlazy.c:626 #, c-format msgid "finished vacuuming \"%s.%s.%s\": index scans: %d\n" msgstr "Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð¾ \"%s.%s.%s\": Ñканувань індекÑу: %d\n" -#: access/heap/vacuumlazy.c:674 +#: access/heap/vacuumlazy.c:637 #, c-format msgid "automatic aggressive vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "автоматичний агреÑивний вакуум Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½ÑŽ таблиці \"%s.%s.%s\": ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу: %d\n" -#: access/heap/vacuumlazy.c:676 +#: access/heap/vacuumlazy.c:639 #, c-format msgid "automatic vacuum to prevent wraparound of table \"%s.%s.%s\": index scans: %d\n" msgstr "автоматичне Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½ÑŽ таблиці \"%s.%s.%s\": ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу: %d\n" -#: access/heap/vacuumlazy.c:681 +#: access/heap/vacuumlazy.c:644 #, c-format msgid "automatic aggressive vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "автоматична агреÑивне Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s.%s.%s\": Ñканувань індекÑу: %d\n" -#: access/heap/vacuumlazy.c:683 +#: access/heap/vacuumlazy.c:646 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" msgstr "автоматичне Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s.%s.%s\": Ñканувань індекÑу: %d\n" -#: access/heap/vacuumlazy.c:690 +#: access/heap/vacuumlazy.c:653 #, c-format msgid "pages: %u removed, %u remain, %u scanned (%.2f%% of total)\n" msgstr "Ñторінок: %u видалено, %u залишилоÑÑŒ, %u відÑкановано (%.2f%% від загальної кількоÑті)\n" -#: access/heap/vacuumlazy.c:697 +#: access/heap/vacuumlazy.c:660 #, c-format msgid "tuples: %lld removed, %lld remain, %lld are dead but not yet removable\n" msgstr "кортежів: %lld видалено, %lld залишилоÑÑŒ, %lld мертвих, але вÑе ще не можуть бути видаленні\n" -#: access/heap/vacuumlazy.c:703 +#: access/heap/vacuumlazy.c:666 #, c-format msgid "tuples missed: %lld dead from %u pages not removed due to cleanup lock contention\n" msgstr "пропущено кортежів: %lld померлих з %u Ñторінок не видалено через Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ\n" -#: access/heap/vacuumlazy.c:708 +#: access/heap/vacuumlazy.c:672 #, c-format msgid "removable cutoff: %u, which was %d XIDs old when operation ended\n" -msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ð¸Ñ€Ñ–Ð·Ñƒ : %u, це було %d XIDs Ñтарий при завершенні операції\n" +msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ð¸Ñ€Ñ–Ð·Ñƒ: %u, це було %d XIDs Ñтарий при завершенні операції\n" -#: access/heap/vacuumlazy.c:714 +#: access/heap/vacuumlazy.c:679 #, c-format msgid "new relfrozenxid: %u, which is %d XIDs ahead of previous value\n" msgstr "новий relfrozenxid: %u, що Ñ” %d XIDs попереду попереднього значеннÑ\n" -#: access/heap/vacuumlazy.c:721 +#: access/heap/vacuumlazy.c:687 #, c-format msgid "new relminmxid: %u, which is %d MXIDs ahead of previous value\n" msgstr "новий relminmxid: %u, що Ñтановить %d MXIDs попереду попереднього значеннÑ\n" -#: access/heap/vacuumlazy.c:727 +#: access/heap/vacuumlazy.c:690 +#, c-format +msgid "frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n" +msgstr "заморожено: %u Ñторінок з таблиці (%.2f%% з уÑього) має %lld заморожені Ñ€Ñдків\n" + +#: access/heap/vacuumlazy.c:698 msgid "index scan not needed: " msgstr "ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу не потрібне: " -#: access/heap/vacuumlazy.c:729 +#: access/heap/vacuumlazy.c:700 msgid "index scan needed: " msgstr "ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу потрібне: " -#: access/heap/vacuumlazy.c:731 +#: access/heap/vacuumlazy.c:702 #, c-format msgid "%u pages from table (%.2f%% of total) had %lld dead item identifiers removed\n" msgstr "у %u Ñторінок з таблиці (%.2f%% від загальної кількоÑті) було видалено %lld мертвих ідентифікаторів елементів\n" -#: access/heap/vacuumlazy.c:736 +#: access/heap/vacuumlazy.c:707 msgid "index scan bypassed: " msgstr "ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу пропущено: " -#: access/heap/vacuumlazy.c:738 +#: access/heap/vacuumlazy.c:709 msgid "index scan bypassed by failsafe: " msgstr "ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу безпечно пропущено: " -#: access/heap/vacuumlazy.c:740 +#: access/heap/vacuumlazy.c:711 #, c-format msgid "%u pages from table (%.2f%% of total) have %lld dead item identifiers\n" msgstr "%u Ñторінок з таблиці (%.2f%% від загальної кількоÑті) мають %lld мертвих ідентифікаторів елементів\n" -#: access/heap/vacuumlazy.c:755 +#: access/heap/vacuumlazy.c:726 #, c-format msgid "index \"%s\": pages: %u in total, %u newly deleted, %u currently deleted, %u reusable\n" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\": Ñторінок: %u загалом, %u нещодавно видалено, %u наразі видалено, %u Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ викориÑтаннÑ\n" -#: access/heap/vacuumlazy.c:767 commands/analyze.c:796 +#: access/heap/vacuumlazy.c:738 commands/analyze.c:794 #, c-format msgid "I/O timings: read: %.3f ms, write: %.3f ms\n" msgstr "Ñ‡Ð°Ñ Ð²Ð²Ð¾Ð´Ñƒ-виведеннÑ: Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ %.3f мÑ, запиÑ: %.3f мÑ\n" -#: access/heap/vacuumlazy.c:777 commands/analyze.c:799 +#: access/heap/vacuumlazy.c:748 commands/analyze.c:797 #, c-format msgid "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" msgstr "ÑÐµÑ€ÐµÐ´Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÑ–Ñть читаннÑ: %.3f МБ/Ñ, ÑÐµÑ€ÐµÐ´Ð½Ñ ÑˆÐ²Ð¸Ð´ÐºÑ–Ñть запиÑу: %.3f МБ/Ñ\n" -#: access/heap/vacuumlazy.c:780 commands/analyze.c:801 +#: access/heap/vacuumlazy.c:751 commands/analyze.c:799 #, c-format msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" msgstr "викориÑÑ‚Ð°Ð½Ð½Ñ Ð±ÑƒÑ„ÐµÑ€Ð°: %lld звернень, %lld промахів, %lld, брудних запиÑів\n" -#: access/heap/vacuumlazy.c:785 +#: access/heap/vacuumlazy.c:756 #, c-format msgid "WAL usage: %lld records, %lld full page images, %llu bytes\n" msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ WAL: %lld запиÑів, %lld зображень на повну Ñторінку, %llu байтів\n" -#: access/heap/vacuumlazy.c:789 commands/analyze.c:805 +#: access/heap/vacuumlazy.c:760 commands/analyze.c:803 #, c-format msgid "system usage: %s" msgstr "викориÑÑ‚Ð°Ð½Ð½Ñ ÑиÑтеми: %s" -#: access/heap/vacuumlazy.c:2463 +#: access/heap/vacuumlazy.c:2173 #, c-format msgid "table \"%s\": removed %lld dead item identifiers in %u pages" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\": видалено %lld мертвих ідентифікаторів елементів в %u Ñторінках" -#: access/heap/vacuumlazy.c:2629 +#: access/heap/vacuumlazy.c:2327 #, c-format msgid "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after %d index scans" msgstr "безпечне Ð¿Ñ€Ð¾Ð¿ÑƒÑ‰ÐµÐ½Ð½Ñ Ð½ÐµÑ–Ñтотного обÑÐ»ÑƒÐ³Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s.%s.%s\" піÑÐ»Ñ %d Ñканів індекÑу" -#: access/heap/vacuumlazy.c:2634 +#: access/heap/vacuumlazy.c:2330 #, c-format msgid "The table's relfrozenxid or relminmxid is too far in the past." msgstr "relfrozenxid або relminmxid таблиці занадто далеко в минулому." -#: access/heap/vacuumlazy.c:2635 +#: access/heap/vacuumlazy.c:2331 #, c-format -msgid "" -"Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" +msgid "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" "You might also need to consider other ways for VACUUM to keep up with the allocation of transaction IDs." -msgstr "" -"Можливо, Ñлід збільшити параметр конфігурації \"maintenance_work_mem\" або \"autovacuum_work_mem\".\n" +msgstr "Можливо, Ñлід збільшити параметр конфігурації \"maintenance_work_mem\" або \"autovacuum_work_mem\".\n" "Можливо, вам також доведетьÑÑ Ñ€Ð¾Ð·Ð³Ð»Ñнути інші ÑпоÑоби, щоб VACUUM не відÑтавав від розподілу ідентифікаторів транзакцій." -#: access/heap/vacuumlazy.c:2878 +#: access/heap/vacuumlazy.c:2593 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\": зупинка ÑÐºÐ¾Ñ€Ð¾Ñ‡ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· конфліктний запит блокуваннÑ" -#: access/heap/vacuumlazy.c:2948 +#: access/heap/vacuumlazy.c:2663 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s: Ñкорочена від %u до %u Ñторінок" -#: access/heap/vacuumlazy.c:3010 +#: access/heap/vacuumlazy.c:2725 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s: Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð½Ñ ÑÐºÐ¾Ñ€Ð¾Ñ‡ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· конфліктуючий запит блокуваннÑ" -#: access/heap/vacuumlazy.c:3170 +#: access/heap/vacuumlazy.c:2844 #, c-format msgid "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary tables in parallel" msgstr "Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ñ— опції Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð½Ð° \"%s\" --- неможливо паралельно очиÑтити тимчаÑові таблиці" -#: access/heap/vacuumlazy.c:3383 +#: access/heap/vacuumlazy.c:3111 #, c-format msgid "while scanning block %u offset %u of relation \"%s.%s\"" msgstr "під Ñ‡Ð°Ñ ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒ %u зÑувом %u Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3386 +#: access/heap/vacuumlazy.c:3114 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "у процеÑÑ– ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒ %u Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3390 +#: access/heap/vacuumlazy.c:3118 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "у процеÑÑ– ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3398 +#: access/heap/vacuumlazy.c:3126 #, c-format msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" msgstr "під Ñ‡Ð°Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒ %u зÑувом %u Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3401 +#: access/heap/vacuumlazy.c:3129 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "у процеÑÑ– Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒ %u Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3405 +#: access/heap/vacuumlazy.c:3133 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "у процеÑÑ– Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3410 commands/vacuumparallel.c:1057 +#: access/heap/vacuumlazy.c:3138 commands/vacuumparallel.c:1112 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "у процеÑÑ– Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3415 commands/vacuumparallel.c:1063 +#: access/heap/vacuumlazy.c:3143 commands/vacuumparallel.c:1118 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "у процеÑÑ– Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\"" -#: access/heap/vacuumlazy.c:3421 +#: access/heap/vacuumlazy.c:3149 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "у процеÑÑ– ÑÐºÐ¾Ñ€Ð¾Ñ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" до %u блоків" @@ -1425,71 +1641,74 @@ msgstr "Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ доÑтупу індекÑа \"%s\" не задан msgid "transaction aborted during system catalog scan" msgstr "транзакцію перервано під Ñ‡Ð°Ñ ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ ÑиÑтемного каталогу" -#: access/index/indexam.c:142 catalog/objectaddress.c:1376 -#: commands/indexcmds.c:2779 commands/tablecmds.c:271 commands/tablecmds.c:295 -#: commands/tablecmds.c:17134 commands/tablecmds.c:18902 +#: access/index/genam.c:657 access/index/indexam.c:82 +#, c-format +msgid "cannot access index \"%s\" while it is being reindexed" +msgstr "неможливо отримати доÑтуп до індекÑа \"%s\" в процеÑÑ– реіндекÑації" + +#: access/index/indexam.c:203 catalog/objectaddress.c:1356 +#: commands/indexcmds.c:2851 commands/tablecmds.c:281 commands/tablecmds.c:305 +#: commands/tablecmds.c:17904 commands/tablecmds.c:19793 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" не Ñ” індекÑом" -#: access/index/indexam.c:973 +#: access/index/indexam.c:1028 #, c-format msgid "operator class %s has no options" msgstr "ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² %s без параметрів" -#: access/nbtree/nbtinsert.c:666 +#: access/nbtree/nbtinsert.c:668 #, c-format msgid "duplicate key value violates unique constraint \"%s\"" msgstr "повторювані Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° порушують Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑƒÐ½Ñ–ÐºÐ°Ð»ÑŒÐ½Ð¾Ñті \"%s\"" -#: access/nbtree/nbtinsert.c:668 +#: access/nbtree/nbtinsert.c:670 #, c-format msgid "Key %s already exists." msgstr "Ключ %s вже Ñ–Ñнує." -#: access/nbtree/nbtinsert.c:762 +#: access/nbtree/nbtinsert.c:764 #, c-format msgid "This may be because of a non-immutable index expression." msgstr "Можливо, це викликано змінною природою індекÑного вираженнÑ." -#: access/nbtree/nbtpage.c:159 access/nbtree/nbtpage.c:608 -#: parser/parse_utilcmd.c:2332 +#: access/nbtree/nbtpage.c:157 access/nbtree/nbtpage.c:611 +#: parser/parse_utilcmd.c:2323 #, c-format msgid "index \"%s\" is not a btree" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" не Ñ” b-деревом" -#: access/nbtree/nbtpage.c:166 access/nbtree/nbtpage.c:615 +#: access/nbtree/nbtpage.c:164 access/nbtree/nbtpage.c:618 #, c-format msgid "version mismatch in index \"%s\": file version %d, current version %d, minimal supported version %d" msgstr "невідповідніÑть верÑÑ–Ñ— в індекÑÑ– \"%s\": верÑÑ–Ñ Ñ„Ð°Ð¹Ð»Ð° %d, поточна верÑÑ–Ñ %d, мінімальна підтримувана верÑÑ–Ñ %d" -#: access/nbtree/nbtpage.c:1874 +#: access/nbtree/nbtpage.c:1861 #, c-format msgid "index \"%s\" contains a half-dead internal page" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" міÑтить наполовину мертву внутрішню Ñторінку" -#: access/nbtree/nbtpage.c:1876 +#: access/nbtree/nbtpage.c:1863 #, c-format msgid "This can be caused by an interrupted VACUUM in version 9.3 or older, before upgrade. Please REINDEX it." msgstr "Це могло ÑтатиÑÑ Ñ‡ÐµÑ€ÐµÐ· Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ VACUUM у верÑÑ–Ñ— 9.3 або Ñтарше перед оновленнÑм. Будь лаÑка, виконайте REINDEX." -#: access/nbtree/nbtutils.c:2669 +#: access/nbtree/nbtutils.c:5108 #, c-format msgid "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" msgstr "розмір Ñ€Ñдка індекÑу %zu перевищує макÑимальний розмір Ð´Ð»Ñ Ð²ÐµÑ€ÑÑ–Ñ— %u btree %zu Ð´Ð»Ñ Ñ–Ð½Ð´ÐµÐºÑу \"%s\"" -#: access/nbtree/nbtutils.c:2675 +#: access/nbtree/nbtutils.c:5114 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "РÑдок індекÑу поÑилаєтьÑÑ Ð½Ð° кортеж (%u,,%u) у відношенні \"%s\"." -#: access/nbtree/nbtutils.c:2679 +#: access/nbtree/nbtutils.c:5118 #, c-format -msgid "" -"Values larger than 1/3 of a buffer page cannot be indexed.\n" +msgid "Values larger than 1/3 of a buffer page cannot be indexed.\n" "Consider a function index of an MD5 hash of the value, or use full text indexing." -msgstr "" -"ЗначеннÑ, що займають більше, ніж 1/3 Ñторінки буферу, не можуть бути індекÑовані.\n" +msgstr "ЗначеннÑ, що займають більше, ніж 1/3 Ñторінки буферу, не можуть бути індекÑовані.\n" "Радимо заÑтоÑувати Ñ–Ð½Ð´ÐµÐºÑ MD5-хеш Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ викориÑтати повнотекÑтове індекÑуваннÑ." #: access/nbtree/nbtvalidate.c:246 @@ -1497,12 +1716,18 @@ msgstr "" msgid "operator family \"%s\" of access method %s is missing support function for types %s and %s" msgstr "ÑімейÑтво операторів \"%s\" методу доÑтупу %s не має опорної функції Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñ–Ð² %s та %s" -#: access/spgist/spgutils.c:244 +#: access/sequence/sequence.c:75 access/table/table.c:145 +#: optimizer/util/plancat.c:144 +#, c-format +msgid "cannot open relation \"%s\"" +msgstr "неможливо відкрити Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" + +#: access/spgist/spgutils.c:245 #, c-format msgid "compress method must be defined when leaf type is different from input type" msgstr "метод ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ бути визначений, коли тип лиÑтів відрізнÑєтьÑÑ Ð²Ñ–Ð´ вхідного типу" -#: access/spgist/spgutils.c:1016 +#: access/spgist/spgutils.c:1028 #, c-format msgid "SP-GiST inner tuple size %zu exceeds maximum %zu" msgstr "Внутрішній розмір кортежу SP-GiST %zu перевищує макÑимальний %zu" @@ -1517,90 +1742,76 @@ msgstr "тип даних кінцевого вузла SP-GiST %s не відп msgid "operator family \"%s\" of access method %s is missing support function %d for type %s" msgstr "ÑімейÑтво операторів \"%s\" методу доÑтупу %s не має опорної функції Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñ–Ð² %d Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" -#: access/table/table.c:49 access/table/table.c:83 access/table/table.c:112 -#: access/table/table.c:145 catalog/aclchk.c:1835 -#, c-format -msgid "\"%s\" is an index" -msgstr "\"%s\" Ñ” індекÑом" - -#: access/table/table.c:54 access/table/table.c:88 access/table/table.c:117 -#: access/table/table.c:150 catalog/aclchk.c:1842 commands/tablecmds.c:13785 -#: commands/tablecmds.c:17143 -#, c-format -msgid "\"%s\" is a composite type" -msgstr "\"%s\" це Ñкладений тип" - -#: access/table/tableam.c:266 +#: access/table/tableam.c:256 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "невірний tid (%u, %u) Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: access/table/tableamapi.c:115 +#: access/table/tableamapi.c:109 #, c-format -msgid "%s cannot be empty." -msgstr "%s не може бути пуÑтим." +msgid "\"%s\" cannot be empty." +msgstr "\"%s\" не може бути пуÑтим." -#: access/table/tableamapi.c:122 utils/misc/guc.c:12920 +#: access/table/tableamapi.c:116 access/transam/xlogrecovery.c:4859 #, c-format -msgid "%s is too long (maximum %d characters)." -msgstr "%s занадто довгий (макÑимум %d Ñимволів)." +msgid "\"%s\" is too long (maximum %d characters)." +msgstr "\"%s\" занадто довгий (макÑимум %d Ñимволів)." -#: access/table/tableamapi.c:145 +#: access/table/tableamapi.c:139 #, c-format msgid "table access method \"%s\" does not exist" msgstr "табличного методу доÑтупу \"%s\" не Ñ–Ñнує" -#: access/table/tableamapi.c:150 +#: access/table/tableamapi.c:144 #, c-format msgid "Table access method \"%s\" does not exist." msgstr "Табличного методу доÑтупу \"%s\" не Ñ–Ñнує." -#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:152 +#: access/tablesample/bernoulli.c:148 access/tablesample/system.c:151 #, c-format msgid "sample percentage must be between 0 and 100" msgstr "відÑоток вибірки повинен задаватиÑÑ Ñ‡Ð¸Ñлом від 0 до 100" -#: access/transam/commit_ts.c:282 +#: access/transam/commit_ts.c:287 #, c-format msgid "cannot retrieve commit timestamp for transaction %u" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ мітку позначки чаÑу транзакції %u" -#: access/transam/commit_ts.c:380 +#: access/transam/commit_ts.c:385 #, c-format msgid "could not get commit timestamp data" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ позначку чаÑу фікÑації" -#: access/transam/commit_ts.c:382 +#: access/transam/commit_ts.c:387 #, c-format msgid "Make sure the configuration parameter \"%s\" is set on the primary server." msgstr "ПереконайтеÑÑŒ, що в конфігурації оÑновного Ñерверу вÑтановлений параметр \"%s\"." -#: access/transam/commit_ts.c:384 +#: access/transam/commit_ts.c:389 #, c-format msgid "Make sure the configuration parameter \"%s\" is set." msgstr "ПереконайтеÑÑŒ, що в конфігурації вÑтановлений параметр \"%s\"." -#: access/transam/multixact.c:1021 +#: access/transam/multixact.c:1091 #, c-format -msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database \"%s\"" -msgstr "щоб уникнути втрат даних у базі даних \"%s\", база даних не приймає команди, що Ñтворюють нові MultiXactIds" +msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database \"%s\"" +msgstr "база даних не приймає команди, Ñкі призначають нові MultiXactId, щоб уникнути втрати даних через Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½Ñ Ñƒ базі даних \"%s\"" -#: access/transam/multixact.c:1023 access/transam/multixact.c:1030 -#: access/transam/multixact.c:1054 access/transam/multixact.c:1063 +#: access/transam/multixact.c:1093 access/transam/multixact.c:1100 +#: access/transam/multixact.c:1124 access/transam/multixact.c:1133 +#: access/transam/varsup.c:158 access/transam/varsup.c:165 #, c-format -msgid "" -"Execute a database-wide VACUUM in that database.\n" +msgid "Execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." -msgstr "" -"Виконати очиÑтку (VACUUM) по вÑій базі даних.\n" +msgstr "Виконати очиÑтку (VACUUM) по вÑій базі даних.\n" "Можливо, вам доведетьÑÑ Ð·Ð°Ñ„Ñ–ÐºÑувати, відкотити назад Ñтарі підготовані транзакції або видалити заÑтарілі Ñлоти реплікації." -#: access/transam/multixact.c:1028 +#: access/transam/multixact.c:1098 #, c-format -msgid "database is not accepting commands that generate new MultiXactIds to avoid wraparound data loss in database with OID %u" -msgstr "щоб уникнути втрат даних в базі даних з OID %u, база даних не приймає команди, що Ñтворюють нові MultiXactIds" +msgid "database is not accepting commands that assign new MultiXactIds to avoid wraparound data loss in database with OID %u" +msgstr "база даних не приймає команди, Ñкі призначають нові MultiXactId, щоб уникнути втрати даних через Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½Ñ Ñƒ базі даних з OID %u" -#: access/transam/multixact.c:1049 access/transam/multixact.c:2333 +#: access/transam/multixact.c:1119 access/transam/multixact.c:2474 #, c-format msgid "database \"%s\" must be vacuumed before %u more MultiXactId is used" msgid_plural "database \"%s\" must be vacuumed before %u more MultiXactIds are used" @@ -1609,7 +1820,7 @@ msgstr[1] "бази даних \"%s\" повинні бути очищені (va msgstr[2] "баз даних \"%s\" повинні бути очищені (vacuumed) перед тим, Ñк більшіÑть MultiXactIds буде викориÑтано (%u)" msgstr[3] "баз даних \"%s\" повинні бути очищені (vacuumed) перед тим, Ñк більшіÑть MultiXactId буде викориÑтано (%u)" -#: access/transam/multixact.c:1058 access/transam/multixact.c:2342 +#: access/transam/multixact.c:1128 access/transam/multixact.c:2483 #, c-format msgid "database with OID %u must be vacuumed before %u more MultiXactId is used" msgid_plural "database with OID %u must be vacuumed before %u more MultiXactIds are used" @@ -1618,12 +1829,12 @@ msgstr[1] "бази даних з OID %u повинні бути очищені msgstr[2] "баз даних з OID %u повинні бути очищені (vacuumed), перед тим Ñк більшіÑть MultiXactIds буде викориÑтано (%u)" msgstr[3] "баз даних з OID %u повинні бути очищені (vacuumed), перед тим Ñк більшіÑть MultiXactId буде викориÑтано (%u)" -#: access/transam/multixact.c:1119 +#: access/transam/multixact.c:1189 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "перевищено ліміт членів мультитранзакції" -#: access/transam/multixact.c:1120 +#: access/transam/multixact.c:1190 #, c-format msgid "This command would create a multixact with %u members, but the remaining space is only enough for %u member." msgid_plural "This command would create a multixact with %u members, but the remaining space is only enough for %u members." @@ -1632,12 +1843,12 @@ msgstr[1] "ÐœÑƒÐ»ÑŒÑ‚Ð¸Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ñтворена цією коман msgstr[2] "ÐœÑƒÐ»ÑŒÑ‚Ð¸Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ñтворена цією командою з %u членів, але міÑÑ†Ñ Ð²Ð¸Ñтачає лише Ð´Ð»Ñ %u членів." msgstr[3] "ÐœÑƒÐ»ÑŒÑ‚Ð¸Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ñтворена цією командою з %u членів, але міÑÑ†Ñ Ð²Ð¸Ñтачає лише Ð´Ð»Ñ %u членів." -#: access/transam/multixact.c:1125 +#: access/transam/multixact.c:1195 #, c-format -msgid "Execute a database-wide VACUUM in database with OID %u with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." -msgstr "Виконати очиÑтку (VACUUM) по вÑій базі даних з OID %u зі зменшеннÑм Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ vacuum_multixact_freeze_min_age та vacuum_multixact_freeze_table_age settings." +msgid "Execute a database-wide VACUUM in database with OID %u with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." +msgstr "Виконати очиÑтку (VACUUM) по вÑій базі даних з OID %u зі зменшеннÑм Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"vacuum_multixact_freeze_min_age\" та \"vacuum_multixact_freeze_table_age settings\"." -#: access/transam/multixact.c:1156 +#: access/transam/multixact.c:1226 #, c-format msgid "database with OID %u must be vacuumed before %d more multixact member is used" msgid_plural "database with OID %u must be vacuumed before %d more multixact members are used" @@ -1646,201 +1857,202 @@ msgstr[1] "база даних з OID %u повинна бути очищена msgstr[2] "база даних з OID %u повинна бути очищена перед викориÑтаннÑм додаткових членів мультитранзакції (%d)" msgstr[3] "база даних з OID %u повинна бути очищена перед викориÑтаннÑм додаткових членів мультитранзакції (%d)" -#: access/transam/multixact.c:1161 +#: access/transam/multixact.c:1231 #, c-format -msgid "Execute a database-wide VACUUM in that database with reduced vacuum_multixact_freeze_min_age and vacuum_multixact_freeze_table_age settings." -msgstr "Виконати Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ (VACUUM) по вÑій цій базі даних зі зменшеннÑм Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ vacuum_multixact_freeze_min_age та vacuum_multixact_freeze_table_age settings." +msgid "Execute a database-wide VACUUM in that database with reduced \"vacuum_multixact_freeze_min_age\" and \"vacuum_multixact_freeze_table_age\" settings." +msgstr "Виконати Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ (VACUUM) по вÑій цій базі даних зі зменшеннÑм Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"vacuum_multixact_freeze_min_age\" та \"vacuum_multixact_freeze_table_age\" settings." -#: access/transam/multixact.c:1300 +#: access/transam/multixact.c:1371 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %u припинив Ñ–ÑÐ½ÑƒÐ²Ð°Ð½Ð½Ñ -- очевидно відбулоÑÑ Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½Ñ" -#: access/transam/multixact.c:1306 +#: access/transam/multixact.c:1377 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %u ще не був Ñтворений -- очевидно відбулоÑÑ Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½Ñ" -#: access/transam/multixact.c:2338 access/transam/multixact.c:2347 -#: access/transam/varsup.c:151 access/transam/varsup.c:158 -#: access/transam/varsup.c:466 access/transam/varsup.c:473 +#: access/transam/multixact.c:2479 access/transam/multixact.c:2488 #, c-format -msgid "" -"To avoid a database shutdown, execute a database-wide VACUUM in that database.\n" +msgid "To avoid MultiXactId assignment failures, execute a database-wide VACUUM in that database.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." -msgstr "" -"Щоб уникнути Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних, виконайте VACUUM Ð´Ð»Ñ Ð²Ñієї бази даних.\n" -"Можливо, вам доведетьÑÑ Ð·Ð°Ñ„Ñ–ÐºÑувати або відкотити назад Ñтарі підготовленні транзакції або видалити заÑтарілі Ñлоти реплікації." +msgstr "Щоб уникнути збоїв у призначенні MultiXactId, виконайте VACUUM Ð´Ð»Ñ Ð²Ñієї бази даних у цій базі даних.\n" +"Вам також може знадобитиÑÑ Ð·Ð°Ñ„Ñ–ÐºÑувати або відкотити Ñтарі підготовлені транзакції, або видалити заÑтарілі Ñлоти реплікації." -#: access/transam/multixact.c:2621 +#: access/transam/multixact.c:2767 #, c-format msgid "MultiXact member wraparound protections are disabled because oldest checkpointed MultiXact %u does not exist on disk" msgstr "ЗахиÑÑ‚ від Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½Ñ Ñ‡Ð»ÐµÐ½Ñƒ MultiXact вимкнена, оÑкільки найÑтаріша контрольна точка MultiXact %u не Ñ–Ñнує на диÑку" -#: access/transam/multixact.c:2643 +#: access/transam/multixact.c:2789 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "ЗахиÑÑ‚ від Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½Ñ Ñ‡Ð»ÐµÐ½Ñƒ MultiXact наразі ввімкнена" -#: access/transam/multixact.c:3030 +#: access/transam/multixact.c:3180 #, c-format msgid "oldest MultiXact %u not found, earliest MultiXact %u, skipping truncation" msgstr "найÑтарішу MultiXact %u не знайдено, найновіша MultiXact %u, ÑÐºÐ¾Ñ€Ð¾Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑкаєтьÑÑ" -#: access/transam/multixact.c:3048 +#: access/transam/multixact.c:3198 #, c-format msgid "cannot truncate up to MultiXact %u because it does not exist on disk, skipping truncation" msgstr "неможливо виконати ÑÐºÐ¾Ñ€Ð¾Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾ MultiXact %u, оÑкільки Ñ—Ñ— не Ñ–Ñнує на диÑку, ÑÐºÐ¾Ñ€Ð¾Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑкаєтьÑÑ" -#: access/transam/multixact.c:3362 +#: access/transam/multixact.c:3517 #, c-format msgid "invalid MultiXactId: %u" msgstr "неприпуÑтимий MultiXactId: %u" -#: access/transam/parallel.c:718 access/transam/parallel.c:837 +#: access/transam/parallel.c:748 access/transam/parallel.c:867 #, c-format msgid "parallel worker failed to initialize" msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ ініціалізацію паралельного виконавцÑ" -#: access/transam/parallel.c:719 access/transam/parallel.c:838 +#: access/transam/parallel.c:749 access/transam/parallel.c:868 #, c-format msgid "More details may be available in the server log." msgstr "Більше деталей можуть бути доÑтупні в журналі Ñерверу." -#: access/transam/parallel.c:899 +#: access/transam/parallel.c:929 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "postmaster завершивÑÑ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ñ— транзакції" -#: access/transam/parallel.c:1086 +#: access/transam/parallel.c:1116 #, c-format msgid "lost connection to parallel worker" msgstr "втрачено зв'Ñзок з паралельним виконавцем" -#: access/transam/parallel.c:1152 access/transam/parallel.c:1154 +#: access/transam/parallel.c:1172 access/transam/parallel.c:1174 msgid "parallel worker" msgstr "паралельний виконавець" -#: access/transam/parallel.c:1307 +#: access/transam/parallel.c:1344 replication/logical/applyparallelworker.c:890 #, c-format msgid "could not map dynamic shared memory segment" msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚Ð¸ динамічний Ñегмент Ñпільної пам'Ñті" -#: access/transam/parallel.c:1312 +#: access/transam/parallel.c:1349 replication/logical/applyparallelworker.c:896 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "неприпуÑтиме магічне чиÑло в динамічному Ñегменті Ñпільної пам'Ñті" -#: access/transam/rmgr.c:84 +#: access/transam/rmgr.c:93 #, c-format msgid "resource manager with ID %d not registered" msgstr "менеджер реÑурÑів з ID %d не зареєÑтрований" -#: access/transam/rmgr.c:85 +#: access/transam/rmgr.c:94 #, c-format -msgid "Include the extension module that implements this resource manager in shared_preload_libraries." -msgstr "Включає модуль розширеннÑ, Ñкий впроваджує цей менеджер реÑурÑів у shared_preload_libraries." +msgid "Include the extension module that implements this resource manager in \"shared_preload_libraries\"." +msgstr "Включає модуль розширеннÑ, Ñкий впроваджує цей менеджер реÑурÑів у \"shared_preload_libraries\"." -#: access/transam/rmgr.c:101 +#: access/transam/rmgr.c:110 #, c-format msgid "custom resource manager name is invalid" msgstr "назва кориÑтувацького менеджера реÑурÑів неприпуÑтима" -#: access/transam/rmgr.c:102 +#: access/transam/rmgr.c:111 #, c-format msgid "Provide a non-empty name for the custom resource manager." msgstr "Вкажіть непорожню назву Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувацького менеджера реÑурÑів." -#: access/transam/rmgr.c:105 +#: access/transam/rmgr.c:114 #, c-format msgid "custom resource manager ID %d is out of range" msgstr "ID %d кориÑтувацького менеджера реÑурÑів поза діапазоном" -#: access/transam/rmgr.c:106 +#: access/transam/rmgr.c:115 #, c-format msgid "Provide a custom resource manager ID between %d and %d." msgstr "Вкажіть ID кориÑтувацького менеджера реÑурÑів між %d Ñ– %d." -#: access/transam/rmgr.c:111 access/transam/rmgr.c:116 -#: access/transam/rmgr.c:128 +#: access/transam/rmgr.c:120 access/transam/rmgr.c:125 +#: access/transam/rmgr.c:137 #, c-format msgid "failed to register custom resource manager \"%s\" with ID %d" msgstr "не вдалоÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрувати кориÑтувацький менеджер реÑурÑів \"%s\" з ID %d" -#: access/transam/rmgr.c:112 +#: access/transam/rmgr.c:121 #, c-format -msgid "Custom resource manager must be registered while initializing modules in shared_preload_libraries." -msgstr "КориÑтувацький менеджер реÑурÑів повинен бути зареєÑтрований під Ñ‡Ð°Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— модулів у shared_preload_libraries." +msgid "Custom resource manager must be registered while initializing modules in \"shared_preload_libraries\"." +msgstr "КориÑтувацький менеджер реÑурÑів повинен бути зареєÑтрований під Ñ‡Ð°Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— модулів у \"shared_preload_libraries\"." -#: access/transam/rmgr.c:117 +#: access/transam/rmgr.c:126 #, c-format msgid "Custom resource manager \"%s\" already registered with the same ID." msgstr "КориÑтувацький менеджер реÑурÑів \"%s\" вже зареєÑтрований з таким Ñамим ID." -#: access/transam/rmgr.c:129 +#: access/transam/rmgr.c:138 #, c-format msgid "Existing resource manager with ID %d has the same name." msgstr "ІÑнуючий менеджер реÑурÑів з ID %d має таку Ñаму назву." -#: access/transam/rmgr.c:135 +#: access/transam/rmgr.c:144 #, c-format msgid "registered custom resource manager \"%s\" with ID %d" msgstr "зареєÑтрований кориÑтувацький менеджер реÑурÑів \"%s\" з ID %d" -#: access/transam/slru.c:713 +#: access/transam/slru.c:361 +#, c-format +msgid "\"%s\" must be a multiple of %d" +msgstr "\"%s\" має бути кратним %d" + +#: access/transam/slru.c:830 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "файл \"%s\" не Ñ–Ñнує, вважаєтьÑÑ Ð½ÑƒÐ»ÑŒÐ¾Ð²Ð¸Ð¼" -#: access/transam/slru.c:945 access/transam/slru.c:951 -#: access/transam/slru.c:959 access/transam/slru.c:964 -#: access/transam/slru.c:971 access/transam/slru.c:976 -#: access/transam/slru.c:983 access/transam/slru.c:990 +#: access/transam/slru.c:1059 access/transam/slru.c:1065 +#: access/transam/slru.c:1073 access/transam/slru.c:1078 +#: access/transam/slru.c:1085 access/transam/slru.c:1090 +#: access/transam/slru.c:1097 access/transam/slru.c:1104 #, c-format msgid "could not access status of transaction %u" msgstr "не можливо отримати ÑÑ‚Ð°Ñ‚ÑƒÑ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— %u" -#: access/transam/slru.c:946 +#: access/transam/slru.c:1060 #, c-format msgid "Could not open file \"%s\": %m." msgstr "Ðе можливо відкрити файл \"%s\": %m." -#: access/transam/slru.c:952 +#: access/transam/slru.c:1066 #, c-format msgid "Could not seek in file \"%s\" to offset %d: %m." msgstr "Ðе вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ у файлі \"%s\" до зÑуву %d: %m." -#: access/transam/slru.c:960 +#: access/transam/slru.c:1074 #, c-format msgid "Could not read from file \"%s\" at offset %d: %m." msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу \"%s\" по зÑуву %d: %m." -#: access/transam/slru.c:965 +#: access/transam/slru.c:1079 #, c-format msgid "Could not read from file \"%s\" at offset %d: read too few bytes." msgstr "Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу \"%s\" по зÑуву %d: прочитано занадто мало байтів." -#: access/transam/slru.c:972 +#: access/transam/slru.c:1086 #, c-format msgid "Could not write to file \"%s\" at offset %d: %m." msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файлу \"%s\" зÑув %d: %m." -#: access/transam/slru.c:977 +#: access/transam/slru.c:1091 #, c-format msgid "Could not write to file \"%s\" at offset %d: wrote too few bytes." msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файлу \"%s\" зÑув %d: запиÑано занадто мало байтів." -#: access/transam/slru.c:984 +#: access/transam/slru.c:1098 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "Ðе вдалоÑÑ Ñинхронізувати файл \"%s\": %m." -#: access/transam/slru.c:991 +#: access/transam/slru.c:1105 #, c-format msgid "Could not close file \"%s\": %m." msgstr "Ðе можливо закрити файл \"%s\": %m." -#: access/transam/slru.c:1252 +#: access/transam/slru.c:1431 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "не вдалоÑÑ ÑпуÑтошити каталог \"%s\": очевидно ÑталоÑÑ Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½Ñ" @@ -1880,77 +2092,77 @@ msgstr "неприпуÑтимі дані у файлу Ñ–Ñторії \"%s\"" msgid "Timeline IDs must be less than child timeline's ID." msgstr "Ідентифікатори ліній чаÑу повинні бути меншими від ідентифікатора дочірньої лінії." -#: access/transam/timeline.c:597 +#: access/transam/timeline.c:589 #, c-format msgid "requested timeline %u is not in this server's history" msgstr "в Ñ–Ñторії даного Ñерверу немає запитаної лінії чаÑу %u" -#: access/transam/twophase.c:385 +#: access/transam/twophase.c:368 #, c-format msgid "transaction identifier \"%s\" is too long" msgstr "ідентифікатор транзакції \"%s\" задовгий" -#: access/transam/twophase.c:392 +#: access/transam/twophase.c:375 #, c-format msgid "prepared transactions are disabled" msgstr "підготовлені транзакції вимкнено" -#: access/transam/twophase.c:393 +#: access/transam/twophase.c:376 #, c-format -msgid "Set max_prepared_transactions to a nonzero value." -msgstr "Ð’Ñтановіть ненульове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° max_prepared_transactions." +msgid "Set \"max_prepared_transactions\" to a nonzero value." +msgstr "Ð’Ñтановіть ненульове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"max_prepared_transactions\"." -#: access/transam/twophase.c:412 +#: access/transam/twophase.c:395 #, c-format msgid "transaction identifier \"%s\" is already in use" msgstr "ідентифікатор транзакції \"%s\" вже викориÑтовуєтьÑÑ" -#: access/transam/twophase.c:421 access/transam/twophase.c:2486 +#: access/transam/twophase.c:404 access/transam/twophase.c:2531 #, c-format msgid "maximum number of prepared transactions reached" msgstr "доÑÑгнуто макÑимального чиÑла підготованих транзакцій" -#: access/transam/twophase.c:422 access/transam/twophase.c:2487 +#: access/transam/twophase.c:405 access/transam/twophase.c:2532 #, c-format -msgid "Increase max_prepared_transactions (currently %d)." -msgstr "Збільшіть max_prepared_transactions (наразі %d)." +msgid "Increase \"max_prepared_transactions\" (currently %d)." +msgstr "Збільшіть \"max_prepared_transactions\" (наразі %d)." -#: access/transam/twophase.c:598 +#: access/transam/twophase.c:580 #, c-format msgid "prepared transaction with identifier \"%s\" is busy" msgstr "підготовлена Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð· ідентифікатором \"%s\" зайнÑта" -#: access/transam/twophase.c:604 +#: access/transam/twophase.c:586 #, c-format msgid "permission denied to finish prepared transaction" msgstr "немає дозволу Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ… транзакцій" -#: access/transam/twophase.c:605 +#: access/transam/twophase.c:587 #, c-format msgid "Must be superuser or the user that prepared the transaction." msgstr "Треба пути ÑуперкориÑтувачем або кориÑтувачем, Ñкий підготував транзакцію." -#: access/transam/twophase.c:616 +#: access/transam/twophase.c:598 #, c-format msgid "prepared transaction belongs to another database" msgstr "підготовлена Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð½Ð°Ð»ÐµÐ¶Ð¸Ñ‚ÑŒ до іншої бази даних" -#: access/transam/twophase.c:617 +#: access/transam/twophase.c:599 #, c-format msgid "Connect to the database where the transaction was prepared to finish it." msgstr "З'єднайтеÑÑŒ з базою даних, де була підготовлена транзакціÑ, щоб завершити Ñ—Ñ—." -#: access/transam/twophase.c:632 +#: access/transam/twophase.c:614 #, c-format msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "підготовленої транзакції з ідентифікатором \"%s\" не Ñ–Ñнує" -#: access/transam/twophase.c:1169 +#: access/transam/twophase.c:1174 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "перевищено граничний розмір файла у 2-фазовому Ñтані" -#: access/transam/twophase.c:1324 +#: access/transam/twophase.c:1329 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" @@ -1959,58 +2171,59 @@ msgstr[1] "неправильний розмір файлу \"%s\": %lld бай msgstr[2] "неправильний розмір файлу \"%s\": %lld байтів" msgstr[3] "неправильний розмір файлу \"%s\": %lld байтів" -#: access/transam/twophase.c:1333 +#: access/transam/twophase.c:1338 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "неправильне Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ñуву CRC Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\"" -#: access/transam/twophase.c:1351 +#: access/transam/twophase.c:1356 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %lld" -#: access/transam/twophase.c:1366 +#: access/transam/twophase.c:1371 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "неприпуÑтиме магічне чиÑло, збережене у файлі\"%s\"" -#: access/transam/twophase.c:1372 +#: access/transam/twophase.c:1377 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "неприпуÑтимий розмір, збережений у файлі \"%s\"" -#: access/transam/twophase.c:1384 +#: access/transam/twophase.c:1389 #, c-format msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "обчиÑлена контрольна Ñума CRC не відповідає значенню, збереженому у файлі \"%s\"" -#: access/transam/twophase.c:1414 access/transam/xlogrecovery.c:569 -#: replication/logical/logical.c:206 replication/walsender.c:703 +#: access/transam/twophase.c:1419 access/transam/xlogrecovery.c:565 +#: postmaster/walsummarizer.c:936 replication/logical/logical.c:211 +#: replication/walsender.c:836 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Ðе вдалоÑÑ Ñ€Ð¾Ð·Ð¼Ñ–Ñтити обробник журналу транзакцій." -#: access/transam/twophase.c:1424 +#: access/transam/twophase.c:1429 #, c-format msgid "could not read two-phase state from WAL at %X/%X: %s" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ 2-фазовий Ñтан з WAL при %X/%X: %s" -#: access/transam/twophase.c:1429 +#: access/transam/twophase.c:1434 #, c-format msgid "could not read two-phase state from WAL at %X/%X" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ 2-фазовий Ñтан з WAL при %X/%X" -#: access/transam/twophase.c:1437 +#: access/transam/twophase.c:1442 #, c-format msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "очікувані дані 2-фазного Ñтану відÑутні в WAL при %X/%X" -#: access/transam/twophase.c:1733 +#: access/transam/twophase.c:1745 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ файл \"%s\": %m" -#: access/transam/twophase.c:1860 +#: access/transam/twophase.c:1872 #, c-format msgid "%u two-phase state file was written for a long-running prepared transaction" msgid_plural "%u two-phase state files were written for long-running prepared transactions" @@ -2019,634 +2232,691 @@ msgstr[1] "%u 2-фазовий Ñтан файлів був запиÑаний msgstr[2] "%u 2-фазовий Ñтан файлів був запиÑаний завдÑки довготривалим підготовленим транзакціÑм" msgstr[3] "%u 2-фазовий Ñтан файлів був запиÑаний завдÑки довготривалим підготовленим транзакціÑм" -#: access/transam/twophase.c:2094 +#: access/transam/twophase.c:2107 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð¾Ñ— транзакції %u із Ñпільної пам'Ñті" -#: access/transam/twophase.c:2187 +#: access/transam/twophase.c:2200 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ñтарілого файла 2-фазового Ñтану Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— %u" -#: access/transam/twophase.c:2194 +#: access/transam/twophase.c:2207 #, c-format msgid "removing stale two-phase state from memory for transaction %u" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð· пам'Ñті заÑтарілого 2-фазового Ñтану Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— %u" -#: access/transam/twophase.c:2207 +#: access/transam/twophase.c:2220 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ майбутнього 2-фазового Ñтану Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— %u" -#: access/transam/twophase.c:2214 +#: access/transam/twophase.c:2227 #, c-format msgid "removing future two-phase state from memory for transaction %u" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð· пам'Ñті майбутнього 2-фазового Ñтану Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— %u" -#: access/transam/twophase.c:2239 +#: access/transam/twophase.c:2252 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "пошкоджений файл двофазного Ñтану Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— %u" -#: access/transam/twophase.c:2244 +#: access/transam/twophase.c:2257 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "пошкоджена пам'Ñть двофазного Ñтану Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— %u" -#: access/transam/varsup.c:129 +#: access/transam/twophase.c:2514 #, c-format -msgid "database is not accepting commands to avoid wraparound data loss in database \"%s\"" -msgstr "база даних не приймає команди, щоб уникнути втрати даних через Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ð¹ в БД \"%s\"" +msgid "could not recover two-phase state file for transaction %u" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ файл 2-фазового Ñтану Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— %u" -#: access/transam/varsup.c:131 access/transam/varsup.c:138 +#: access/transam/twophase.c:2516 #, c-format -msgid "" -"Stop the postmaster and vacuum that database in single-user mode.\n" -"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." -msgstr "" -"Зупиніть postmaster Ñ– виконайте Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ (vacuum) бази даних в однокориÑтувацькому режимі.\n" -"Можливо, також доведетьÑÑ Ð·Ð°Ñ„Ñ–ÐºÑувати або відкотити назад Ñтарі підготовлені транзакції, або розірвати заÑтарілі реплікаційні Ñлоти." +msgid "Two-phase state file has been found in WAL record %X/%X, but this transaction has already been restored from disk." +msgstr "Файл 2-фазового Ñтану був знайдений в запиÑу WAL %X/%X, але Ñ†Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð²Ð¶Ðµ відновлена з диÑку." + +#: access/transam/twophase.c:2524 storage/file/fd.c:514 utils/fmgr/dfmgr.c:209 +#, c-format +msgid "could not access file \"%s\": %m" +msgstr "немає доÑтупу до файлу \"%s\": %m" + +#: access/transam/varsup.c:156 +#, c-format +msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database \"%s\"" +msgstr "база даних не приймає команди, Ñкі призначають нові ідентифікатори транзакцій, щоб уникнути обхідної втрати даних у базі даних \"%s\"" -#: access/transam/varsup.c:136 +#: access/transam/varsup.c:163 #, c-format -msgid "database is not accepting commands to avoid wraparound data loss in database with OID %u" -msgstr "база даних не приймає команди Ð·Ð°Ð´Ð»Ñ ÑƒÐ½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð²Ñ‚Ñ€Ð°Ñ‚Ð¸ даних через Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ð¹ в базі даних з OID %u" +msgid "database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database with OID %u" +msgstr "база даних не приймає команди, Ñкі призначають нові ідентифікатори транзакцій, щоб уникнути обхідної втрати даних у базі даних з OID %u" -#: access/transam/varsup.c:148 access/transam/varsup.c:463 +#: access/transam/varsup.c:175 access/transam/varsup.c:490 #, c-format msgid "database \"%s\" must be vacuumed within %u transactions" msgstr "база даних \"%s\" повинна бути очищена (граничне чиÑло транзакцій: %u)" -#: access/transam/varsup.c:155 access/transam/varsup.c:470 +#: access/transam/varsup.c:178 +#, c-format +msgid "To avoid transaction ID assignment failures, execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "Щоб уникнути збоїв у призначенні ID транзакцій, виконайте VACUUM Ð´Ð»Ñ Ð²Ñієї бази даних у цій базі даних.\n" +"Вам також може знадобитиÑÑ Ð·Ð°Ñ„Ñ–ÐºÑувати або відкотити Ñтарі підготовлені транзакції, або видалити заÑтарілі Ñлоти реплікації." + +#: access/transam/varsup.c:182 access/transam/varsup.c:497 #, c-format msgid "database with OID %u must be vacuumed within %u transactions" msgstr "база даних з OID %u повинна бути очищена (граничне чиÑло транзакцій: %u)" -#: access/transam/xact.c:1098 +#: access/transam/varsup.c:185 access/transam/varsup.c:493 +#: access/transam/varsup.c:500 +#, c-format +msgid "To avoid XID assignment failures, execute a database-wide VACUUM in that database.\n" +"You might also need to commit or roll back old prepared transactions, or drop stale replication slots." +msgstr "Щоб уникнути збоїв у призначенні XID, виконайте VACUUM Ð´Ð»Ñ Ð²Ñієї бази даних у цій базі даних.\n" +"Вам також може знадобитиÑÑ Ð·Ð°Ñ„Ñ–ÐºÑувати або відкотити Ñтарі підготовлені транзакції, або видалити заÑтарілі Ñлоти реплікації." + +#: access/transam/xact.c:649 +#, c-format +msgid "cannot assign transaction IDs during a parallel operation" +msgstr "не можна призначити ідентифікатори транзакцій під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¸Ñ… операцій" + +#: access/transam/xact.c:840 +#, c-format +msgid "cannot modify data in a parallel worker" +msgstr "неможливо змінити дані паралельного виконавцÑ" + +#: access/transam/xact.c:1115 +#, c-format +msgid "cannot start commands during a parallel operation" +msgstr "неможливо запуÑтити команди під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¸Ñ… операцій" + +#: access/transam/xact.c:1123 #, c-format msgid "cannot have more than 2^32-2 commands in a transaction" msgstr "в одній транзакції не може бути більше 2^32-2 команд" -#: access/transam/xact.c:1644 +#: access/transam/xact.c:1664 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "перевищено межу чиÑла зафікÑованих підтранзакцій (%d)" -#: access/transam/xact.c:2501 +#: access/transam/xact.c:2561 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "неможливо виконати PREPARE Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ—, що здійÑнювалаÑÑ Ð½Ð° тимчаÑових об'єктах" -#: access/transam/xact.c:2511 +#: access/transam/xact.c:2571 #, c-format msgid "cannot PREPARE a transaction that has exported snapshots" msgstr "не можна виконати PREPARE Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ—, Ñка має екÑпортовані знімки" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3474 +#: access/transam/xact.c:3593 #, c-format msgid "%s cannot run inside a transaction block" msgstr "%s неможливо запуÑтити вÑередині блоку транзакції" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3484 +#: access/transam/xact.c:3603 #, c-format msgid "%s cannot run inside a subtransaction" msgstr "%s неможливо запуÑтити вÑередині підтранзакції" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3494 +#: access/transam/xact.c:3613 +#, c-format +msgid "%s cannot be executed within a pipeline" +msgstr "%s не можна викориÑтовувати в межах конвеєра" + +#. translator: %s represents an SQL statement name +#: access/transam/xact.c:3623 #, c-format msgid "%s cannot be executed from a function" msgstr "%s неможливо виконати з функції" #. translator: %s represents an SQL statement name -#: access/transam/xact.c:3565 access/transam/xact.c:3878 -#: access/transam/xact.c:3957 access/transam/xact.c:4080 -#: access/transam/xact.c:4231 access/transam/xact.c:4300 -#: access/transam/xact.c:4411 +#: access/transam/xact.c:3694 access/transam/xact.c:4019 +#: access/transam/xact.c:4098 access/transam/xact.c:4221 +#: access/transam/xact.c:4372 access/transam/xact.c:4441 +#: access/transam/xact.c:4552 #, c-format msgid "%s can only be used in transaction blocks" msgstr "%s може викориÑтовуватиÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ в блоках транзакції" -#: access/transam/xact.c:3764 +#: access/transam/xact.c:3905 #, c-format msgid "there is already a transaction in progress" msgstr "Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð²Ð¶Ðµ виконуєтьÑÑ" -#: access/transam/xact.c:3883 access/transam/xact.c:3962 -#: access/transam/xact.c:4085 +#: access/transam/xact.c:4024 access/transam/xact.c:4103 +#: access/transam/xact.c:4226 #, c-format msgid "there is no transaction in progress" msgstr "немає незавершеної транзакції" -#: access/transam/xact.c:3973 +#: access/transam/xact.c:4114 #, c-format msgid "cannot commit during a parallel operation" msgstr "не можна фікÑувати транзакції під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¸Ñ… операцій" -#: access/transam/xact.c:4096 +#: access/transam/xact.c:4237 #, c-format msgid "cannot abort during a parallel operation" msgstr "не можна перервати під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¸Ñ… операцій" -#: access/transam/xact.c:4195 +#: access/transam/xact.c:4336 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "не можна визначати точки Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¸Ñ… операцій" -#: access/transam/xact.c:4282 +#: access/transam/xact.c:4423 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "не можна вивільнÑти точки Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¸Ñ… транзакцій" -#: access/transam/xact.c:4292 access/transam/xact.c:4343 -#: access/transam/xact.c:4403 access/transam/xact.c:4452 +#: access/transam/xact.c:4433 access/transam/xact.c:4484 +#: access/transam/xact.c:4544 access/transam/xact.c:4593 #, c-format msgid "savepoint \"%s\" does not exist" msgstr "точка Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: access/transam/xact.c:4349 access/transam/xact.c:4458 +#: access/transam/xact.c:4490 access/transam/xact.c:4599 #, c-format msgid "savepoint \"%s\" does not exist within current savepoint level" msgstr "точка Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує на поточному рівні Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡Ð¾Ðº" -#: access/transam/xact.c:4391 +#: access/transam/xact.c:4532 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "не можна відкотити назад до точки Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¸Ñ… операцій" -#: access/transam/xact.c:4519 -#, c-format -msgid "cannot start subtransactions during a parallel operation" -msgstr "не можна запуÑтити підтранзакцію під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¸Ñ… операцій" - -#: access/transam/xact.c:4587 -#, c-format -msgid "cannot commit subtransactions during a parallel operation" -msgstr "не можна визначити підтранзакцію під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¸Ñ… операцій" - -#: access/transam/xact.c:5234 +#: access/transam/xact.c:5376 #, c-format msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "в одній транзакції не може бути більше 2^32-1 підтранзакцій" -#: access/transam/xlog.c:1463 +#: access/transam/xlog.c:1542 #, c-format msgid "request to flush past end of generated WAL; request %X/%X, current position %X/%X" msgstr "запит на Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¼Ð¸Ð½ÑƒÐ»Ð¾Ð³Ð¾ ÐºÑ–Ð½Ñ†Ñ Ð·Ð³ÐµÐ½ÐµÑ€Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ WAL; запит %X/%X, поточна Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ %X/%X" -#: access/transam/xlog.c:2224 +#: access/transam/xlog.c:1769 #, c-format -msgid "could not write to log file %s at offset %u, length %zu: %m" -msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати у файл журналу %s (зÑув: %u, довжина: %zu): %m" +msgid "cannot read past end of generated WAL: requested %X/%X, current position %X/%X" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ оÑтанній кінець згенерованого WAL: запит %X/%X, поточна Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ %X/%X" -#: access/transam/xlog.c:3471 access/transam/xlogutils.c:845 -#: replication/walsender.c:2717 +#: access/transam/xlog.c:2210 access/transam/xlog.c:4501 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "Розмір Ñегмента WAL повинен бути Ñтепенем двійки від 1 МБ до 1 ГБ." + +#: access/transam/xlog.c:2228 +#, c-format +msgid "\"%s\" must be set to -1 during binary upgrade mode." +msgstr "\"%s\" має бути вÑтановлено на -1 під Ñ‡Ð°Ñ Ð´Ð²Ñ–Ð¹ÐºÐ¾Ð²Ð¾Ð³Ð¾ режиму оновленнÑ." + +#: access/transam/xlog.c:2477 +#, c-format +msgid "could not write to log file \"%s\" at offset %u, length %zu: %m" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файлу журналу подій \"%s\" при зÑуві %u, довжина %zu: %m" + +#: access/transam/xlog.c:3739 access/transam/xlogutils.c:831 +#: replication/walsender.c:3045 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "запитуваний Ñегмент WAL %s вже видалений" -#: access/transam/xlog.c:3756 +#: access/transam/xlog.c:4061 #, c-format msgid "could not rename file \"%s\": %m" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\": %m" -#: access/transam/xlog.c:3798 access/transam/xlog.c:3808 +#: access/transam/xlog.c:4104 access/transam/xlog.c:4115 +#: access/transam/xlog.c:4136 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "необхідний каталог WAL \"%s\" не Ñ–Ñнує" -#: access/transam/xlog.c:3814 +#: access/transam/xlog.c:4121 access/transam/xlog.c:4142 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "ÑтворюєтьÑÑ Ð²Ñ–Ð´Ñутній каталог WAL \"%s\"" -#: access/transam/xlog.c:3817 commands/dbcommands.c:3049 +#: access/transam/xlog.c:4125 access/transam/xlog.c:4145 +#: commands/dbcommands.c:3262 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "не вдалоÑÑ Ñтворити відÑтуній каталог \"%s\": %m" -#: access/transam/xlog.c:3884 +#: access/transam/xlog.c:4212 #, c-format msgid "could not generate secret authorization token" msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ Ñекретний токен Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ—" -#: access/transam/xlog.c:4043 access/transam/xlog.c:4052 -#: access/transam/xlog.c:4076 access/transam/xlog.c:4083 -#: access/transam/xlog.c:4090 access/transam/xlog.c:4095 -#: access/transam/xlog.c:4102 access/transam/xlog.c:4109 -#: access/transam/xlog.c:4116 access/transam/xlog.c:4123 -#: access/transam/xlog.c:4130 access/transam/xlog.c:4137 -#: access/transam/xlog.c:4146 access/transam/xlog.c:4153 -#: utils/init/miscinit.c:1598 +#: access/transam/xlog.c:4363 access/transam/xlog.c:4373 +#: access/transam/xlog.c:4399 access/transam/xlog.c:4407 +#: access/transam/xlog.c:4415 access/transam/xlog.c:4421 +#: access/transam/xlog.c:4429 access/transam/xlog.c:4437 +#: access/transam/xlog.c:4445 access/transam/xlog.c:4453 +#: access/transam/xlog.c:4461 access/transam/xlog.c:4469 +#: access/transam/xlog.c:4479 access/transam/xlog.c:4487 +#: utils/init/miscinit.c:1812 #, c-format msgid "database files are incompatible with server" msgstr "файли бази даних Ñ” неÑуміÑними з даним Ñервером" -#: access/transam/xlog.c:4044 +#: access/transam/xlog.c:4364 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), but the server was compiled with PG_CONTROL_VERSION %d (0x%08x)." msgstr "КлаÑтер бази даних було ініціалізовано з PG_CONTROL_VERSION %d (0x%08x), але Ñервер було Ñкомпільовано з PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlog.c:4048 +#: access/transam/xlog.c:4368 #, c-format msgid "This could be a problem of mismatched byte ordering. It looks like you need to initdb." msgstr "Можливо, проблема викликана різним порÑдком байту. ЗдаєтьÑÑ, вам потрібно виконати команду \"initdb\"." -#: access/transam/xlog.c:4053 +#: access/transam/xlog.c:4374 #, c-format msgid "The database cluster was initialized with PG_CONTROL_VERSION %d, but the server was compiled with PG_CONTROL_VERSION %d." msgstr "КлаÑтер баз даних був ініціалізований з PG_CONTROL_VERSION %d, але Ñервер Ñкомпільований з PG_CONTROL_VERSION %d." -#: access/transam/xlog.c:4056 access/transam/xlog.c:4080 -#: access/transam/xlog.c:4087 access/transam/xlog.c:4092 +#: access/transam/xlog.c:4377 access/transam/xlog.c:4403 +#: access/transam/xlog.c:4411 access/transam/xlog.c:4417 #, c-format msgid "It looks like you need to initdb." msgstr "ЗдаєтьÑÑ, Вам треба виконати initdb." -#: access/transam/xlog.c:4067 +#: access/transam/xlog.c:4389 #, c-format msgid "incorrect checksum in control file" msgstr "помилка контрольної Ñуми у файлі pg_control" -#: access/transam/xlog.c:4077 +#: access/transam/xlog.c:4400 #, c-format msgid "The database cluster was initialized with CATALOG_VERSION_NO %d, but the server was compiled with CATALOG_VERSION_NO %d." msgstr "КлаÑтер бази даних було ініціалізовано з CATALOG_VERSION_NO %d, але Ñервер було Ñкомпільовано з CATALOG_VERSION_NO %d." -#: access/transam/xlog.c:4084 +#: access/transam/xlog.c:4408 #, c-format msgid "The database cluster was initialized with MAXALIGN %d, but the server was compiled with MAXALIGN %d." msgstr "КлаÑтер бази даних було ініціалізовано з MAXALIGN %d, але Ñервер було Ñкомпільовано з MAXALIGN %d." -#: access/transam/xlog.c:4091 +#: access/transam/xlog.c:4416 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "ЗдаєтьÑÑ, в клаÑтері баз даних Ñ– в програмі Ñервера викориÑтовуютьÑÑ Ñ€Ñ–Ð·Ð½Ñ– формати чиÑел з плаваючою точкою." -#: access/transam/xlog.c:4096 +#: access/transam/xlog.c:4422 #, c-format msgid "The database cluster was initialized with BLCKSZ %d, but the server was compiled with BLCKSZ %d." msgstr "КлаÑтер бази даних було ініціалізовано з BLCKSZ %d, але Ñервер було Ñкомпільовано з BLCKSZ %d." -#: access/transam/xlog.c:4099 access/transam/xlog.c:4106 -#: access/transam/xlog.c:4113 access/transam/xlog.c:4120 -#: access/transam/xlog.c:4127 access/transam/xlog.c:4134 -#: access/transam/xlog.c:4141 access/transam/xlog.c:4149 -#: access/transam/xlog.c:4156 +#: access/transam/xlog.c:4425 access/transam/xlog.c:4433 +#: access/transam/xlog.c:4441 access/transam/xlog.c:4449 +#: access/transam/xlog.c:4457 access/transam/xlog.c:4465 +#: access/transam/xlog.c:4473 access/transam/xlog.c:4482 +#: access/transam/xlog.c:4490 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "ЗдаєтьÑÑ, вам потрібно перекомпілювати Ñервер або виконати initdb." -#: access/transam/xlog.c:4103 +#: access/transam/xlog.c:4430 #, c-format msgid "The database cluster was initialized with RELSEG_SIZE %d, but the server was compiled with RELSEG_SIZE %d." msgstr "КлаÑтер бази даних було ініціалізовано з ELSEG_SIZE %d, але Ñервер було Ñкомпільовано з ELSEG_SIZE %d." -#: access/transam/xlog.c:4110 +#: access/transam/xlog.c:4438 #, c-format msgid "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was compiled with XLOG_BLCKSZ %d." msgstr "КлаÑтер бази даних було ініціалізовано з XLOG_BLCKSZ %d, але Ñервер було Ñкомпільовано з XLOG_BLCKSZ %d." -#: access/transam/xlog.c:4117 +#: access/transam/xlog.c:4446 #, c-format msgid "The database cluster was initialized with NAMEDATALEN %d, but the server was compiled with NAMEDATALEN %d." msgstr "КлаÑтер бази даних було ініціалізовано з NAMEDATALEN %d, але Ñервер було Ñкомпільовано з NAMEDATALEN %d." -#: access/transam/xlog.c:4124 +#: access/transam/xlog.c:4454 #, c-format msgid "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server was compiled with INDEX_MAX_KEYS %d." msgstr "КлаÑтер бази даних було ініціалізовано з INDEX_MAX_KEYS %d, але Ñервер було Ñкомпільовано з INDEX_MAX_KEYS %d." -#: access/transam/xlog.c:4131 +#: access/transam/xlog.c:4462 #, c-format msgid "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the server was compiled with TOAST_MAX_CHUNK_SIZE %d." msgstr "КлаÑтер бази даних було ініціалізовано з TOAST_MAX_CHUNK_SIZE %d, але Ñервер було Ñкомпільовано з TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlog.c:4138 +#: access/transam/xlog.c:4470 #, c-format msgid "The database cluster was initialized with LOBLKSIZE %d, but the server was compiled with LOBLKSIZE %d." msgstr "КлаÑтер бази даних було ініціалізовано з LOBLKSIZE %d, але Ñервер було Ñкомпільовано з LOBLKSIZE %d." -#: access/transam/xlog.c:4147 +#: access/transam/xlog.c:4480 #, c-format msgid "The database cluster was initialized without USE_FLOAT8_BYVAL but the server was compiled with USE_FLOAT8_BYVAL." msgstr "КлаÑтер бази даних було ініціалізовано без USE_FLOAT8_BYVAL, але Ñервер було Ñкомпільовано з USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4154 +#: access/transam/xlog.c:4488 #, c-format msgid "The database cluster was initialized with USE_FLOAT8_BYVAL but the server was compiled without USE_FLOAT8_BYVAL." msgstr "КлаÑтер бази даних було ініціалізовано з USE_FLOAT8_BYVAL, але Ñервер було Ñкомпільовано без USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4163 +#: access/transam/xlog.c:4497 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" -msgstr[0] "Розмір Ñегменту WAL повинен задаватиÑÑŒ Ñтупенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d" -msgstr[1] "Розмір Ñегменту WAL повинен задаватиÑÑŒ Ñтупенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d" -msgstr[2] "Розмір Ñегменту WAL повинен задаватиÑÑŒ Ñтупенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d" -msgstr[3] "Розмір Ñегменту WAL повинен задаватиÑÑŒ Ñтупенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "невірний розмір Ñегменту WAL у файлі ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ (%d байт)" +msgstr[1] "невірний розмір Ñегмента WAL у файлі ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ (%d байтів)" +msgstr[2] "невірний розмір Ñегмента WAL у файлі ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ (%d байтів)" +msgstr[3] "невірний розмір Ñегмента WAL у файлі ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ (%d байтів)" -#: access/transam/xlog.c:4175 +#: access/transam/xlog.c:4510 #, c-format msgid "\"min_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"min_wal_size\" має бути мінімум у 2 рази більше, ніж \"wal_segment_size\"" -#: access/transam/xlog.c:4179 +#: access/transam/xlog.c:4514 #, c-format msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" msgstr "\"max_wal_size\" має бути мінімум у 2 рази більше, ніж \"wal_segment_size\"" -#: access/transam/xlog.c:4620 +#: access/transam/xlog.c:4662 catalog/namespace.c:4696 +#: commands/tablespace.c:1210 commands/user.c:2529 commands/variable.c:72 +#: replication/slot.c:2446 tcop/postgres.c:3715 utils/error/elog.c:2247 +#, c-format +msgid "List syntax is invalid." +msgstr "Помилка ÑинтакÑиÑу у ÑпиÑку." + +#: access/transam/xlog.c:4708 commands/user.c:2545 commands/variable.c:173 +#: tcop/postgres.c:3731 utils/error/elog.c:2273 +#, c-format +msgid "Unrecognized key word: \"%s\"." +msgstr "Ðерозпізнане ключове Ñлово: \"%s\"." + +#: access/transam/xlog.c:5129 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати початкове Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð¿ÐµÑ€ÐµÐ´Ð¶ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ журналюваннÑ: %m" -#: access/transam/xlog.c:4628 +#: access/transam/xlog.c:5137 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "не вдалоÑÑ Ñкинути на диÑк початкове Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð¿ÐµÑ€ÐµÐ´Ð¶ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ журналюваннÑ: %m" -#: access/transam/xlog.c:4634 +#: access/transam/xlog.c:5143 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ початкове Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð¿ÐµÑ€ÐµÐ´Ð¶ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ журналюваннÑ: %m" -#: access/transam/xlog.c:4852 +#: access/transam/xlog.c:5368 #, c-format -msgid "WAL was generated with wal_level=minimal, cannot continue recovering" -msgstr "WAL був Ñтворений з параметром wal_level=minimal, неможливо продовжити відновленнÑ" +msgid "WAL was generated with \"wal_level=minimal\", cannot continue recovering" +msgstr "WAL був Ñтворений з \"wal_level=minimal\", неможливо продовжити відновленнÑ" -#: access/transam/xlog.c:4853 +#: access/transam/xlog.c:5369 #, c-format -msgid "This happens if you temporarily set wal_level=minimal on the server." -msgstr "Це траплÑєтьÑÑ, Ñкщо ви тимчаÑово вÑтановили параметр wal_level=minimal на Ñервері." +msgid "This happens if you temporarily set \"wal_level=minimal\" on the server." +msgstr "Це траплÑєтьÑÑ, Ñкщо ви тимчаÑово вÑтановили \"wal_level=minimal\" на Ñервері." -#: access/transam/xlog.c:4854 +#: access/transam/xlog.c:5370 #, c-format -msgid "Use a backup taken after setting wal_level to higher than minimal." -msgstr "ВикориÑтовуйте резервну копію, зроблену піÑÐ»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ wal_level, що перевищує макÑимальне." +msgid "Use a backup taken after setting \"wal_level\" to higher than \"minimal\"." +msgstr "ВикориÑтовуйте резервну копію, зроблену піÑÐ»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ wal_level, що перевищує мінимальний рівень." -#: access/transam/xlog.c:4918 +#: access/transam/xlog.c:5435 #, c-format msgid "control file contains invalid checkpoint location" msgstr "контрольний файл міÑтить недійÑне Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки" -#: access/transam/xlog.c:4929 +#: access/transam/xlog.c:5446 #, c-format msgid "database system was shut down at %s" msgstr "ÑиÑтема бази даних була вимкнена %s" -#: access/transam/xlog.c:4935 +#: access/transam/xlog.c:5452 #, c-format msgid "database system was shut down in recovery at %s" msgstr "ÑиÑтема бази даних завершила роботу у процеÑÑ– Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ %s" -#: access/transam/xlog.c:4941 +#: access/transam/xlog.c:5458 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ бази даних було перервано; оÑтанній момент роботи %s" -#: access/transam/xlog.c:4947 +#: access/transam/xlog.c:5464 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "ÑиÑтема бази даних була перервана в процеÑÑ– Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ %s" -#: access/transam/xlog.c:4949 +#: access/transam/xlog.c:5466 #, c-format msgid "This probably means that some data is corrupted and you will have to use the last backup for recovery." msgstr "Це, ймовірно, означає, що деÑкі дані були пошкоджені, Ñ– вам доведетьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ базу даних з оÑтаннього збереженнÑ." -#: access/transam/xlog.c:4955 +#: access/transam/xlog.c:5472 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "робота ÑиÑтеми бази даних була перервана в процеÑÑ– відновленнÑ, Ñ‡Ð°Ñ Ð² журналі %s" -#: access/transam/xlog.c:4957 +#: access/transam/xlog.c:5474 #, c-format msgid "If this has occurred more than once some data might be corrupted and you might need to choose an earlier recovery target." msgstr "Якщо це відбуваєтьÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ, ніж один раз, можливо, ÑкіÑÑŒ дані були зіпÑовані, Ñ– Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ñ€ÐµÐ±Ð° вибрати більш ранню точку." -#: access/transam/xlog.c:4963 +#: access/transam/xlog.c:5480 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "робота ÑиÑтеми бази даних була перервана; оÑтанній момент роботи %s" -#: access/transam/xlog.c:4969 +#: access/transam/xlog.c:5487 #, c-format msgid "control file contains invalid database cluster state" msgstr "контрольний файл міÑтить недійÑний Ñтан клаÑтеру бази даних" -#: access/transam/xlog.c:5347 +#: access/transam/xlog.c:5875 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL завершивÑÑ Ð´Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ð½Ð»Ð°Ð¹Ð½ резервного копіюваннÑ" -#: access/transam/xlog.c:5348 +#: access/transam/xlog.c:5876 #, c-format msgid "All WAL generated while online backup was taken must be available at recovery." msgstr "Ð’ÑÑ– журнали WAL, Ñтворені під Ñ‡Ð°Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ \"на ходу\", повинні бути в наÑвноÑті Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: access/transam/xlog.c:5351 +#: access/transam/xlog.c:5880 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL завершивÑÑ Ð´Ð¾ узгодженої точки відновленнÑ" -#: access/transam/xlog.c:5399 +#: access/transam/xlog.c:5926 #, c-format msgid "selected new timeline ID: %u" msgstr "вибрано новий ID чаÑової лінії: %u" -#: access/transam/xlog.c:5432 +#: access/transam/xlog.c:5959 #, c-format msgid "archive recovery complete" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ завершено" -#: access/transam/xlog.c:6026 +#: access/transam/xlog.c:6612 #, c-format msgid "shutting down" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6065 +#: access/transam/xlog.c:6651 #, c-format msgid "restartpoint starting:%s%s%s%s%s%s%s%s" msgstr "початок точки перезапуÑку: %s%s%s%s%s%s%s%s" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6077 +#: access/transam/xlog.c:6663 #, c-format msgid "checkpoint starting:%s%s%s%s%s%s%s%s" msgstr "початок контрольної точки: %s%s%s%s%s%s%s%s" -#: access/transam/xlog.c:6137 +#: access/transam/xlog.c:6728 #, c-format -msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" -msgstr "точка перезапуÑку завершена: запиÑано %d буферів (%.1f%%); %d WAL файлів додано, %d видалено, %d перероблених; запиÑ=%ld.%03d Ñек, ÑинхронізаціÑ=%ld.%03d Ñек, уÑього=%ld.%03d Ñек; файли Ñинхронізації=%d, найдовший=%ld.%03d Ñек, Ñередній=%ld.%03d Ñек; диÑтанціÑ=%d кб, приблизно=%d кб" +msgid "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" +msgstr "точка перезапуÑку завершена: запиÑано %d буферів (%.1f%%); %d WAL файлів додано, %d видалено, %d перероблених; запиÑ=%ld.%03d Ñек, ÑинхронізаціÑ=%ld.%03d Ñек, уÑього=%ld.%03d Ñек; файли Ñинхронізації=%d, найдовший=%ld.%03d Ñек, Ñередній=%ld.%03d Ñек; диÑтанціÑ=%d кб, приблизно=%d кб; lsn=%X/%X, lsn повтору=%X/%X" -#: access/transam/xlog.c:6157 +#: access/transam/xlog.c:6751 #, c-format -msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB" -msgstr "контрольна точка завершена: запиÑано %d буферів (%.1f%%); %d WAL файлів додано, %d видалено, %d перероблених; запиÑ=%ld.%03d Ñек, ÑинхронізаціÑ=%ld.%03d Ñек, уÑього=%ld.%03d Ñек; файли Ñинхронізації=%d, найдовший=%ld.%03d Ñек, Ñередній=%ld.%03d Ñек; диÑтанціÑ=%d кб, приблизно=%d кб" +msgid "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d removed, %d recycled; write=%ld.%03d s, sync=%ld.%03d s, total=%ld.%03d s; sync files=%d, longest=%ld.%03d s, average=%ld.%03d s; distance=%d kB, estimate=%d kB; lsn=%X/%X, redo lsn=%X/%X" +msgstr "контрольна точка завершена: запиÑано %d буферів (%.1f%%); %d WAL файлів додано, %d видалено, %d перероблених; запиÑ=%ld.%03d Ñек, ÑинхронізаціÑ=%ld.%03d Ñек, уÑього=%ld.%03d Ñек; файли Ñинхронізації=%d, найдовший=%ld.%03d Ñек, Ñередній=%ld.%03d Ñек; диÑтанціÑ=%d кб, приблизно=%d кб; lsn=%X/%X, lsn повтору=%X/%X" -#: access/transam/xlog.c:6592 +#: access/transam/xlog.c:7233 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "під Ñ‡Ð°Ñ Ñ‚Ð¾Ð³Ð¾ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð‘Ð” помічено конкурентну активніÑть у випереджувальному журналюванні" -#: access/transam/xlog.c:7149 +#: access/transam/xlog.c:7818 #, c-format msgid "recovery restart point at %X/%X" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð¾Ñ— точки %X/%X" -#: access/transam/xlog.c:7151 +#: access/transam/xlog.c:7820 #, c-format msgid "Last completed transaction was at log time %s." msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð° Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð±ÑƒÐ»Ð° в %s." -#: access/transam/xlog.c:7398 +#: access/transam/xlog.c:8082 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "точка Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ \"%s\" Ñтворена в %X/%X" -#: access/transam/xlog.c:7605 +#: access/transam/xlog.c:8289 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "онлайн резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ ÑкаÑовано, неможливо продовжити відновленнÑ" -#: access/transam/xlog.c:7662 +#: access/transam/xlog.c:8347 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "неочікуваний ID лінії чаÑу %u (повинен бути %u) у запиÑÑ– контрольної точки вимкненнÑ" -#: access/transam/xlog.c:7720 +#: access/transam/xlog.c:8405 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "неочікуваний ID лінії чаÑу %u (повинен бути %u) у запиÑÑ– контрольної точки онлайн" -#: access/transam/xlog.c:7749 +#: access/transam/xlog.c:8434 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "неочікуваний ID лінії чаÑу %u (повинен бути %u) у запиÑÑ– ÐºÑ–Ð½Ñ†Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ" -#: access/transam/xlog.c:8007 +#: access/transam/xlog.c:8705 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "не вдалоÑÑŒÑÑинхронізувати файл наÑкрізного запиÑу %s: %m" -#: access/transam/xlog.c:8013 +#: access/transam/xlog.c:8710 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "не вдалоÑÑ fdatasync файл \"%s\": %m" -#: access/transam/xlog.c:8108 access/transam/xlog.c:8475 +#: access/transam/xlog.c:8797 access/transam/xlog.c:9133 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "Обраний рівень WAL недоÑтатній Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ \"на ходу\"" -#: access/transam/xlog.c:8109 access/transam/xlog.c:8476 -#: access/transam/xlogfuncs.c:199 +#: access/transam/xlog.c:8798 access/transam/xlogfuncs.c:248 #, c-format -msgid "wal_level must be set to \"replica\" or \"logical\" at server start." -msgstr "вÑтановіть wal_level \"replica\" або \"logical\" при запуÑку Ñерверу." +msgid "\"wal_level\" must be set to \"replica\" or \"logical\" at server start." +msgstr "\"wal_level\" потрібно задати \"replica\" або \"logical\" при запуÑку Ñервера." -#: access/transam/xlog.c:8114 +#: access/transam/xlog.c:8803 #, c-format msgid "backup label too long (max %d bytes)" msgstr "мітка резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð´Ð¾Ð²Ð³Ð° (макÑимум %d байт)" -#: access/transam/xlog.c:8230 +#: access/transam/xlog.c:8924 #, c-format -msgid "WAL generated with full_page_writes=off was replayed since last restartpoint" -msgstr "ПіÑÐ»Ñ Ð¾Ñтанньої точки Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±ÑƒÐ² відтворений WAL, Ñтворений в режимі full_page_writes=off" +msgid "WAL generated with \"full_page_writes=off\" was replayed since last restartpoint" +msgstr "ПіÑÐ»Ñ Ð¾Ñтанньої точки Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð±ÑƒÐ² відтворений WAL, Ñтворений в режимі \"full_page_writes=off\"" -#: access/transam/xlog.c:8232 access/transam/xlog.c:8588 +#: access/transam/xlog.c:8926 access/transam/xlog.c:9222 #, c-format -msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable full_page_writes and run CHECKPOINT on the primary, and then try an online backup again." -msgstr "Це означає, що резервна копіÑ, зроблена на резервному Ñервері пошкоджена Ñ– не повинна викориÑтовуватиÑÑŒ. Ðктивуйте full_page_writes Ñ– запуÑтіть CHECKPOINT на оÑновному Ñервері, а потім Ñпробуйте ще раз Ñтворити резервну копію в Інтернеті." +msgid "This means that the backup being taken on the standby is corrupt and should not be used. Enable \"full_page_writes\" and run CHECKPOINT on the primary, and then try an online backup again." +msgstr "Це означає, що резервна копіÑ, зроблена на резервному Ñервері пошкоджена Ñ– не повинна викориÑтовуватиÑÑŒ. Ðктивуйте \"full_page_writes\" Ñ– запуÑтіть CHECKPOINT на оÑновному Ñервері, а потім Ñпробуйте ще раз Ñтворити резервну копію." -#: access/transam/xlog.c:8312 backup/basebackup.c:1344 utils/adt/misc.c:347 +#: access/transam/xlog.c:9006 backup/basebackup.c:1417 utils/adt/misc.c:354 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "таргет Ñимволічного поÑÐ¸Ð»Ð°Ð½Ð½Ñ \"%s\" задовгий" +msgid "could not read symbolic link \"%s\": %m" +msgstr "не можливо прочитати Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m" -#: access/transam/xlog.c:8362 backup/basebackup.c:1359 -#: commands/tablespace.c:399 commands/tablespace.c:581 utils/adt/misc.c:355 +#: access/transam/xlog.c:9013 backup/basebackup.c:1422 utils/adt/misc.c:359 #, c-format -msgid "tablespaces are not supported on this platform" -msgstr "табличний проÑтір не підтримуєтьÑÑ Ð½Ð° цій платформі" +msgid "symbolic link \"%s\" target is too long" +msgstr "таргет Ñимволічного поÑÐ¸Ð»Ð°Ð½Ð½Ñ \"%s\" задовгий" -#: access/transam/xlog.c:8521 access/transam/xlog.c:8534 -#: access/transam/xlogrecovery.c:1192 access/transam/xlogrecovery.c:1199 -#: access/transam/xlogrecovery.c:1258 access/transam/xlogrecovery.c:1338 -#: access/transam/xlogrecovery.c:1362 +#: access/transam/xlog.c:9134 #, c-format -msgid "invalid data in file \"%s\"" -msgstr "невірні дані у файлі \"%s\"" +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "вÑтановіть wal_level \"replica\" або \"logical\" при запуÑку Ñерверу." -#: access/transam/xlog.c:8538 backup/basebackup.c:1199 +#: access/transam/xlog.c:9172 backup/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "режим Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ підвищено у процеÑÑ– резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ \"на ходу\"" -#: access/transam/xlog.c:8539 backup/basebackup.c:1200 +#: access/transam/xlog.c:9173 backup/basebackup.c:1282 #, c-format msgid "This means that the backup being taken is corrupt and should not be used. Try taking another online backup." msgstr "Це означає, що вибрана резервна ÐºÐ¾Ð¿Ñ–Ñ Ñ” пошкодженою Ñ– Ñ—Ñ— не Ñлід викориÑтовувати. Спробуйте викориÑтати іншу онлайн резервну копію." -#: access/transam/xlog.c:8586 +#: access/transam/xlog.c:9220 #, c-format -msgid "WAL generated with full_page_writes=off was replayed during online backup" -msgstr "У процеÑÑ– резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ \"на ходу\" був відтворений WAL, Ñтворений в режимі full_page_writes=off" +msgid "WAL generated with \"full_page_writes=off\" was replayed during online backup" +msgstr "WAL Ñтворений з \"full_page_writes=off\" було відтворено під Ñ‡Ð°Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ копіюваннÑ" -#: access/transam/xlog.c:8711 +#: access/transam/xlog.c:9336 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ðµ, очікуютьÑÑ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ñ– Ñегменти WAL Ð´Ð»Ñ Ð°Ñ€Ñ…Ñ–Ð²Ð°Ñ†Ñ–Ñ—" -#: access/transam/xlog.c:8725 +#: access/transam/xlog.c:9350 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "вÑе ще чекає на необхідні Ñегменти WAL Ð´Ð»Ñ Ð°Ñ€Ñ…Ñ–Ð²Ð°Ñ†Ñ–Ñ— (%d Ñекунд пройшло)" -#: access/transam/xlog.c:8727 +#: access/transam/xlog.c:9352 #, c-format -msgid "Check that your archive_command is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." -msgstr "Перевірте, чи правильно виконуєтьÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° archive_command. Ви можете безпечно ÑкаÑувати це резервне копіюваннÑ, але резервна ÐºÐ¾Ð¿Ñ–Ñ Ð‘Ð” буде непридатна без уÑÑ–Ñ… Ñегментів WAL." +msgid "Check that your \"archive_command\" is executing properly. You can safely cancel this backup, but the database backup will not be usable without all the WAL segments." +msgstr "Перевірте, що ваша \"archive_command\" виконуєтьÑÑ Ð½Ð°Ð»ÐµÐ¶Ð½Ð¸Ð¼ чином. Ви можете безпечно ÑкаÑувати резервну копію, але резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних буде непридатним без вÑÑ–Ñ… Ñегментів WAL." -#: access/transam/xlog.c:8734 +#: access/transam/xlog.c:9359 #, c-format msgid "all required WAL segments have been archived" msgstr "уÑÑ– необхідні Ñегменти WAL архівовані" -#: access/transam/xlog.c:8738 +#: access/transam/xlog.c:9363 #, c-format msgid "WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup" msgstr "Ð°Ñ€Ñ…Ñ–Ð²Ð°Ñ†Ñ–Ñ WAL не налаштована; ви повинні забезпечити ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²ÑÑ–Ñ… необхідних Ñегментів WAL іншими заÑобами Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ñ— копії" -#: access/transam/xlog.c:8787 +#: access/transam/xlog.c:9402 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ð±Ñлуговуючого процеÑу до виклику pg_backup_stop" -#: access/transam/xlogarchive.c:208 +#: access/transam/xlogarchive.c:213 #, c-format msgid "archive file \"%s\" has wrong size: %lld instead of %lld" msgstr "файл архіву \"%s\" має неправильний розмір: %lld заміÑть %lld" -#: access/transam/xlogarchive.c:217 +#: access/transam/xlogarchive.c:222 #, c-format msgid "restored log file \"%s\" from archive" msgstr "відновлений файл журналу \"%s\" з архіву" -#: access/transam/xlogarchive.c:231 +#: access/transam/xlogarchive.c:236 #, c-format -msgid "restore_command returned a zero exit status, but stat() failed." -msgstr "restore_command повернула нульовий ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ð¸Ñ…Ð¾Ð´Ñƒ, але stat() не вдавÑÑ." +msgid "\"restore_command\" returned a zero exit status, but stat() failed." +msgstr "\"restore_command\" повернула нульовий ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ð¸Ñ…Ð¾Ð´Ñƒ, але виклик stat() не вдавÑÑ." -#: access/transam/xlogarchive.c:263 +#: access/transam/xlogarchive.c:268 #, c-format msgid "could not restore file \"%s\" from archive: %s" msgstr "неможливо відновити файл \"%s\" з архіву: %s" @@ -2654,93 +2924,114 @@ msgstr "неможливо відновити файл \"%s\" з архіву: % #. translator: First %s represents a postgresql.conf parameter name like #. "recovery_end_command", the 2nd is the value of that parameter, the #. third an already translated error message. -#: access/transam/xlogarchive.c:376 +#: access/transam/xlogarchive.c:346 #, c-format msgid "%s \"%s\": %s" msgstr "%s \"%s\": %s" -#: access/transam/xlogarchive.c:486 access/transam/xlogarchive.c:566 +#: access/transam/xlogarchive.c:456 access/transam/xlogarchive.c:536 #, c-format msgid "could not create archive status file \"%s\": %m" msgstr "неможливо Ñтворити файл ÑтатуÑу архіву \"%s\": %m" -#: access/transam/xlogarchive.c:494 access/transam/xlogarchive.c:574 +#: access/transam/xlogarchive.c:464 access/transam/xlogarchive.c:544 #, c-format msgid "could not write archive status file \"%s\": %m" msgstr "неможливо запиÑати файл архівного ÑтатуÑу \"%s\": %m" -#: access/transam/xlogfuncs.c:74 backup/basebackup.c:957 +#: access/transam/xlogfuncs.c:69 backup/basebackup.c:997 #, c-format msgid "a backup is already in progress in this session" msgstr "резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ñ€Ð°Ð·Ñ– триває в цьому ÑеанÑÑ–" -#: access/transam/xlogfuncs.c:126 +#: access/transam/xlogfuncs.c:140 #, c-format msgid "backup is not in progress" msgstr "резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ðµ виконуєтьÑÑ" -#: access/transam/xlogfuncs.c:127 +#: access/transam/xlogfuncs.c:141 #, c-format msgid "Did you call pg_backup_start()?" msgstr "Ви викликали pg_backup_start()?" -#: access/transam/xlogfuncs.c:166 access/transam/xlogfuncs.c:193 -#: access/transam/xlogfuncs.c:232 access/transam/xlogfuncs.c:253 -#: access/transam/xlogfuncs.c:274 +#: access/transam/xlogfuncs.c:184 access/transam/xlogfuncs.c:242 +#: access/transam/xlogfuncs.c:281 access/transam/xlogfuncs.c:302 +#: access/transam/xlogfuncs.c:323 #, c-format msgid "WAL control functions cannot be executed during recovery." msgstr "Функції ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ WAL не можна викориÑтовувати під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: access/transam/xlogfuncs.c:198 +#: access/transam/xlogfuncs.c:209 access/transam/xlogfuncs.c:389 +#: access/transam/xlogfuncs.c:447 +#, c-format +msgid "%s cannot be executed during recovery." +msgstr "%s не можна викориÑтовувати під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." + +#: access/transam/xlogfuncs.c:215 +#, c-format +msgid "pg_log_standby_snapshot() can only be used if \"wal_level\" >= \"replica\"" +msgstr "pg_log_standby_snapshot() можна викориÑтовувати лише Ñкщо \"wal_level\" >= \"replica\"" + +#: access/transam/xlogfuncs.c:247 #, c-format msgid "WAL level not sufficient for creating a restore point" msgstr "Обраний рівень WAL не доÑтатній Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ відновленнÑ" -#: access/transam/xlogfuncs.c:206 +#: access/transam/xlogfuncs.c:255 #, c-format msgid "value too long for restore point (maximum %d characters)" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÑƒÑ” межу (%d Ñимв.)" -#: access/transam/xlogfuncs.c:344 access/transam/xlogfuncs.c:402 +#: access/transam/xlogfuncs.c:486 #, c-format -msgid "%s cannot be executed during recovery." -msgstr "%s не можна викориÑтовувати під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." +msgid "invalid WAL file name \"%s\"" +msgstr "неприпуÑтиме ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ WAL \"%s\"" -#: access/transam/xlogfuncs.c:424 access/transam/xlogfuncs.c:454 -#: access/transam/xlogfuncs.c:478 access/transam/xlogfuncs.c:501 -#: access/transam/xlogfuncs.c:581 +#: access/transam/xlogfuncs.c:522 access/transam/xlogfuncs.c:552 +#: access/transam/xlogfuncs.c:576 access/transam/xlogfuncs.c:599 +#: access/transam/xlogfuncs.c:679 #, c-format msgid "recovery is not in progress" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ виконуєтьÑÑ" -#: access/transam/xlogfuncs.c:425 access/transam/xlogfuncs.c:455 -#: access/transam/xlogfuncs.c:479 access/transam/xlogfuncs.c:502 -#: access/transam/xlogfuncs.c:582 +#: access/transam/xlogfuncs.c:523 access/transam/xlogfuncs.c:553 +#: access/transam/xlogfuncs.c:577 access/transam/xlogfuncs.c:600 +#: access/transam/xlogfuncs.c:680 #, c-format msgid "Recovery control functions can only be executed during recovery." msgstr "Функції ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñм можна викориÑтовувати тільки під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: access/transam/xlogfuncs.c:430 access/transam/xlogfuncs.c:460 +#: access/transam/xlogfuncs.c:528 access/transam/xlogfuncs.c:558 #, c-format msgid "standby promotion is ongoing" msgstr "проÑÑƒÐ²Ð°Ð½Ð½Ñ Ð² режимі Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð¸Ð²Ð°Ñ”" -#: access/transam/xlogfuncs.c:431 access/transam/xlogfuncs.c:461 +#: access/transam/xlogfuncs.c:529 access/transam/xlogfuncs.c:559 #, c-format msgid "%s cannot be executed after promotion is triggered." msgstr "%s не може бути виконаний піÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾ Ñк Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð¾." -#: access/transam/xlogfuncs.c:587 +#: access/transam/xlogfuncs.c:685 #, c-format msgid "\"wait_seconds\" must not be negative or zero" msgstr "\"wait_seconds\" не має бути від'ємним чи нулем" -#: access/transam/xlogfuncs.c:607 storage/ipc/signalfuncs.c:252 +#: access/transam/xlogfuncs.c:707 storage/ipc/signalfuncs.c:265 #, c-format msgid "failed to send signal to postmaster: %m" msgstr "надіÑлати Ñигнал процеÑу postmaster не вдалоÑÑ: %m" -#: access/transam/xlogfuncs.c:643 +#: access/transam/xlogfuncs.c:739 libpq/be-secure.c:237 libpq/be-secure.c:346 +#, c-format +msgid "terminating connection due to unexpected postmaster exit" +msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· неочікуване Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ð³Ð¾ процеÑу" + +#: access/transam/xlogfuncs.c:740 +#, c-format +msgid "while waiting on promotion" +msgstr "в очікуванні на підвищеннÑ" + +#: access/transam/xlogfuncs.c:744 #, c-format msgid "server did not promote within %d second" msgid_plural "server did not promote within %d seconds" @@ -2749,665 +3040,717 @@ msgstr[1] "Ñервер не підвищувавÑÑ Ð¿Ñ€Ð¾Ñ‚Ñгом %d Ñек msgstr[2] "Ñервер не підвищувавÑÑ Ð¿Ñ€Ð¾Ñ‚Ñгом %d Ñекунд" msgstr[3] "Ñервер не підвищувавÑÑ Ð¿Ñ€Ð¾Ñ‚Ñгом %d Ñекунд" -#: access/transam/xlogprefetcher.c:1072 +#: access/transam/xlogprefetcher.c:1088 #, c-format -msgid "recovery_prefetch not supported on platforms that lack posix_fadvise()." -msgstr "recovery_prefetch не підтримуєтьÑÑ Ð½Ð° платформах, у Ñких відÑÑƒÑ‚Ð½Ñ posix_fadvise()." +msgid "\"recovery_prefetch\" is not supported on platforms that lack posix_fadvise()." +msgstr "\"recovery_prefetch\" не підтримуєтьÑÑ Ð½Ð° платформах, у Ñких відÑÑƒÑ‚Ð½Ñ posix_fadvise()." -#: access/transam/xlogreader.c:621 +#: access/transam/xlogreader.c:619 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "невірний зÑув запиÑу: %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "неприпуÑтиме Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу в %X/%X: очікувалоÑÑŒ хоча б %u, отримано %u" -#: access/transam/xlogreader.c:629 +#: access/transam/xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "по зÑуву %X/%X запитано Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу" -#: access/transam/xlogreader.c:670 access/transam/xlogreader.c:1102 +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "невірна довжина запиÑу по зÑуву %X/%X: очікувалоÑÑŒ %u, отримано %u" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "неприпуÑтима довжина запиÑу %X/%X: очікувалаÑÑŒ мінімум %u, отримано %u" -#: access/transam/xlogreader.c:699 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "не виÑтачило пам'Ñті під Ñ‡Ð°Ñ Ñпроби Ð·Ð°ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу довжиною %u" - -#: access/transam/xlogreader.c:721 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "довжина запиÑу %u на %X/%X Ñ” задовгою" - -#: access/transam/xlogreader.c:770 +#: access/transam/xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" -msgstr "немає Ð¿Ñ€Ð°Ð¿Ð¾Ñ€Ñ†Ñ contrecord в позиції %X/%X" +msgstr "немає прапора contrecord на %X/%X" -#: access/transam/xlogreader.c:783 +#: access/transam/xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "неприпуÑтима довжина contrecord %u (очікувалоÑÑŒ %lld) на %X/%X" -#: access/transam/xlogreader.c:1110 +#: access/transam/xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "невірний ID менеджера реÑурÑів %u в %X/%X" -#: access/transam/xlogreader.c:1123 access/transam/xlogreader.c:1139 +#: access/transam/xlogreader.c:1155 access/transam/xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð· неправильним попереднім поÑиланнÑм %X/%X на %X/%X" -#: access/transam/xlogreader.c:1175 +#: access/transam/xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "некоректна контрольна Ñума даних менеджера реÑурÑів у запиÑу по зÑуву %X/%X" -#: access/transam/xlogreader.c:1212 +#: access/transam/xlogreader.c:1243 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "невірне магічне чиÑло %04X в Ñегменті журналу %s, зÑув %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "невірне магічне чиÑло %04X в Ñегменті WAL %s, LSN %X/%X, зÑув %u" -#: access/transam/xlogreader.c:1226 access/transam/xlogreader.c:1267 +#: access/transam/xlogreader.c:1258 access/transam/xlogreader.c:1300 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "невірні інформаційні біти %04X в Ñегменті журналу %s, зÑув %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "невірні інформаційні біти %04X в Ñегменті WAL %s, LSN %X/%X, зÑув %u" -#: access/transam/xlogreader.c:1241 +#: access/transam/xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL файл належить іншій ÑиÑтемі баз даних: ідентифікатор ÑиÑтеми баз даних де міÑтитьÑÑ WAL файл - %llu, а ідентифікатор ÑиÑтеми баз даних pg_control - %llu" -#: access/transam/xlogreader.c:1249 +#: access/transam/xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "Файл WAL належить іншій ÑиÑтемі баз даних: некоректний розмір Ñегменту в заголовку Ñторінки" -#: access/transam/xlogreader.c:1255 +#: access/transam/xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "Файл WAL належить іншій ÑиÑтемі баз даних: некоректний XLOG_BLCKSZ в заголовку Ñторінки" -#: access/transam/xlogreader.c:1286 +#: access/transam/xlogreader.c:1320 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "неочікуваний pageaddr %X/%X в Ñегменті журналу %s, зÑув %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "неочікуваний pageaddr %X/%X у Ñегменті WAL %s, LSN %X/%X, Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ %u" -#: access/transam/xlogreader.c:1311 +#: access/transam/xlogreader.c:1346 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð¿Ð¾ÑлідовноÑті ID лінії чаÑу %u (піÑÐ»Ñ %u) в Ñегменті журналу %s, зÑув %u" +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð¿Ð¾ÑлідовноÑті ID лінії чаÑу %u (піÑÐ»Ñ %u) у Ñегменті WAL %s, LSN %X/%X, зÑув %u" -#: access/transam/xlogreader.c:1706 +#: access/transam/xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "ідентифікатор блока %u out-of-order в позиції %X/%X" -#: access/transam/xlogreader.c:1730 +#: access/transam/xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA вÑтановлений, але немає даних в позиції %X/%X" -#: access/transam/xlogreader.c:1737 +#: access/transam/xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA вÑтановлений, але довжина даних дорівнює %u в позиції %X/%X" -#: access/transam/xlogreader.c:1773 +#: access/transam/xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE вÑтановлений, але Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку задані: зÑув %u, довжина %u, при довжині образу блока %u в позиції %X/%X" -#: access/transam/xlogreader.c:1789 +#: access/transam/xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE не вÑтановлений, але Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку задані: зÑув %u, довжина %u в позиції %X/%X" -#: access/transam/xlogreader.c:1803 +#: access/transam/xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED вÑтановлений, але довжина образу блока дорівнює %u в позиції %X/%X" -#: access/transam/xlogreader.c:1818 +#: access/transam/xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "ні BKPIMAGE_HAS_HOLE, ні BKPIMAGE_COMPRESSED не вÑтановлені, але довжина образу блока дорівнює %u в позиції %X/%X" -#: access/transam/xlogreader.c:1834 +#: access/transam/xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL вÑтановлений, але попереднє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ задано в позиції %X/%X" -#: access/transam/xlogreader.c:1846 +#: access/transam/xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "невірний ідентифікатор блоку %u в позиції %X/%X" -#: access/transam/xlogreader.c:1913 +#: access/transam/xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð· невірною довжиною на %X/%X" -#: access/transam/xlogreader.c:1938 +#: access/transam/xlogreader.c:1982 #, c-format -msgid "failed to locate backup block with ID %d in WAL record" -msgstr "не вдалоÑÑзнайти блок резервної копії з ID %d у запиÑÑ– WAL" +msgid "could not locate backup block with ID %d in WAL record" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ блок резервної копії з ID %d у запиÑÑ– WAL" -#: access/transam/xlogreader.c:2044 access/transam/xlogreader.c:2061 +#: access/transam/xlogreader.c:2066 #, c-format -msgid "image at %X/%X compressed with %s not supported by build, block %d" -msgstr "образ в позиції %X/%X, Ñкий ÑтиÑнено за допомогою %s не підтримуєтьÑÑ Ð·Ð±Ñ–Ñ€ÐºÐ¾ÑŽ, блок %d" +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X з недійÑним вказаним блоком %d" -#: access/transam/xlogreader.c:2070 +#: access/transam/xlogreader.c:2073 #, c-format -msgid "image at %X/%X compressed with unknown method, block %d" -msgstr "образ в позиції %X/%X ÑтиÑнено невідомим методом, блок %d" +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X з недійÑним Ñтаном, блок %d" -#: access/transam/xlogreader.c:2078 +#: access/transam/xlogreader.c:2100 access/transam/xlogreader.c:2117 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "невірно ÑтиÑнутий образ в позиції %X/%X, блок %d" +msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð² %X/%X, ÑтиÑнуте %s, не підтримуєтьÑÑ Ð·Ð±Ñ–Ñ€ÐºÐ¾ÑŽ, блок %d" -#: access/transam/xlogrecovery.c:526 +#: access/transam/xlogreader.c:2126 #, c-format -msgid "entering standby mode" -msgstr "перехід у режим очікуваннÑ" +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X ÑтиÑнуте з невідомим методом, блок %d" -#: access/transam/xlogrecovery.c:529 +#: access/transam/xlogreader.c:2134 #, c-format -msgid "starting point-in-time recovery to XID %u" -msgstr "починаєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ в чаÑÑ– до XID %u" +msgid "could not decompress image at %X/%X, block %d" +msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° %X/%X, блок %d" -#: access/transam/xlogrecovery.c:533 +#: access/transam/xlogrecovery.c:617 #, c-format -msgid "starting point-in-time recovery to %s" -msgstr "починаєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ в чаÑÑ– до %s" +msgid "starting backup recovery with redo LSN %X/%X, checkpoint LSN %X/%X, on timeline ID %u" +msgstr "Ñтартуємо Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ñ— копії з LSN Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð½Ñ %X/%X, LSN контрольної точки %X/%X, на чаÑовій шкалі з ID %u" -#: access/transam/xlogrecovery.c:537 +#: access/transam/xlogrecovery.c:649 #, c-format -msgid "starting point-in-time recovery to \"%s\"" -msgstr "починаєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ в чаÑÑ– до \"%s\"" +msgid "could not find redo location %X/%X referenced by checkpoint record at %X/%X" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ REDO %X/%X, вказане запиÑом контрольної точки в %X/%X" -#: access/transam/xlogrecovery.c:541 +#: access/transam/xlogrecovery.c:651 access/transam/xlogrecovery.c:662 #, c-format -msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" -msgstr "починаєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ в чаÑÑ– до локації WAL (LSN) \"%X/%X\"" - -#: access/transam/xlogrecovery.c:545 -#, c-format -msgid "starting point-in-time recovery to earliest consistent point" -msgstr "починаєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… до першої точки домовленоÑті" - -#: access/transam/xlogrecovery.c:548 -#, c-format -msgid "starting archive recovery" -msgstr "початок Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ" - -#: access/transam/xlogrecovery.c:632 -#, c-format -msgid "could not find redo location referenced by checkpoint record" -msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ REDO, вказане запиÑом контрольної точки" - -#: access/transam/xlogrecovery.c:633 access/transam/xlogrecovery.c:643 -#, c-format -msgid "" -"If you are restoring from a backup, touch \"%s/recovery.signal\" and add required recovery options.\n" +msgid "If you are restoring from a backup, touch \"%s/recovery.signal\" or \"%s/standby.signal\" and add required recovery options.\n" "If you are not restoring from a backup, try removing the file \"%s/backup_label\".\n" "Be careful: removing \"%s/backup_label\" will result in a corrupt cluster if restoring from a backup." -msgstr "" -"Якщо ви відновлюєте з резервної копії, оновіть файл \"%s/recovery.signal\" та додайте необхідні параметри відновленнÑ.\n" -"Якщо ви не відновлюєте з резервної копії, Ñпробуйте видалити файл \"%s/backup_label\".\n" -"Будьте обережні: Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ \"%s/backup_label\" призведе до Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ñтеру при відновленні з резервної копії." +msgstr "Якщо ви відновлюєтеÑÑ Ð· резервної копії, оновіть \"%s/recovery.signal\" або \"%s/standby.signal\" Ñ– додайте необхідні параметри відновленнÑ.\n" +"Якщо ви відновлюєте не з резервної копії, Ñпробуйте видалити файл \"%s/backup_label\".\n" +"Будьте обережні: Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ \"%s/backup_label\" призведе до Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ñтера при відновленні з резервної копії." -#: access/transam/xlogrecovery.c:642 +#: access/transam/xlogrecovery.c:660 #, c-format -msgid "could not locate required checkpoint record" -msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ð¾Ñ— контрольної точки" +msgid "could not locate required checkpoint record at %X/%X" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð¾Ñ— контрольної точки в %X/%X" -#: access/transam/xlogrecovery.c:671 commands/tablespace.c:685 +#: access/transam/xlogrecovery.c:690 commands/tablespace.c:664 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "не вдалоÑÑ Ñтворити Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m" -#: access/transam/xlogrecovery.c:703 access/transam/xlogrecovery.c:709 +#: access/transam/xlogrecovery.c:723 access/transam/xlogrecovery.c:729 #, c-format msgid "ignoring file \"%s\" because no file \"%s\" exists" msgstr "файл \"%s\" ігноруєтьÑÑ, тому що файлу \"%s\" не Ñ–Ñнує" -#: access/transam/xlogrecovery.c:705 +#: access/transam/xlogrecovery.c:725 #, c-format msgid "File \"%s\" was renamed to \"%s\"." msgstr "Файл \"%s\" був перейменований на \"%s\"." -#: access/transam/xlogrecovery.c:711 +#: access/transam/xlogrecovery.c:731 #, c-format msgid "Could not rename file \"%s\" to \"%s\": %m." msgstr "Ðеможливо перейменувати файл \"%s\" на \"%s\": %m." -#: access/transam/xlogrecovery.c:765 +#: access/transam/xlogrecovery.c:770 +#, c-format +msgid "restarting backup recovery with redo LSN %X/%X" +msgstr "перезапуÑк Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ñ— копії на LSN %X/%X" + +#: access/transam/xlogrecovery.c:795 +#, c-format +msgid "could not locate a valid checkpoint record at %X/%X" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾Ð¿ÑƒÑтимої контрольної точки в %X/%X" + +#: access/transam/xlogrecovery.c:806 +#, c-format +msgid "entering standby mode" +msgstr "перехід у режим очікуваннÑ" + +#: access/transam/xlogrecovery.c:809 +#, c-format +msgid "starting point-in-time recovery to XID %u" +msgstr "починаєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ в чаÑÑ– до XID %u" + +#: access/transam/xlogrecovery.c:813 +#, c-format +msgid "starting point-in-time recovery to %s" +msgstr "починаєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ в чаÑÑ– до %s" + +#: access/transam/xlogrecovery.c:817 #, c-format -msgid "could not locate a valid checkpoint record" -msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ð·Ð°Ð¿Ð¸Ñ Ð´Ð¾Ð¿ÑƒÑтимої контрольної точки" +msgid "starting point-in-time recovery to \"%s\"" +msgstr "починаєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ в чаÑÑ– до \"%s\"" + +#: access/transam/xlogrecovery.c:821 +#, c-format +msgid "starting point-in-time recovery to WAL location (LSN) \"%X/%X\"" +msgstr "починаєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ в чаÑÑ– до локації WAL (LSN) \"%X/%X\"" + +#: access/transam/xlogrecovery.c:825 +#, c-format +msgid "starting point-in-time recovery to earliest consistent point" +msgstr "починаєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… до першої точки домовленоÑті" + +#: access/transam/xlogrecovery.c:828 +#, c-format +msgid "starting archive recovery" +msgstr "початок Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ" -#: access/transam/xlogrecovery.c:789 +#: access/transam/xlogrecovery.c:849 #, c-format msgid "requested timeline %u is not a child of this server's history" msgstr "запитувана Ð»Ñ–Ð½Ñ–Ñ Ñ‡Ð°Ñу %u не Ñ” відгалуженнÑм Ñ–Ñторії цього Ñерверу" -#: access/transam/xlogrecovery.c:791 +#: access/transam/xlogrecovery.c:851 #, c-format msgid "Latest checkpoint is at %X/%X on timeline %u, but in the history of the requested timeline, the server forked off from that timeline at %X/%X." msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð° точка %X/%X на лінії чаÑу %u, але в Ñ–Ñторії запитуваної лінії чаÑу Ñервер відгалузивÑÑ Ð· цієї лінії в %X/%X." -#: access/transam/xlogrecovery.c:805 +#: access/transam/xlogrecovery.c:865 #, c-format msgid "requested timeline %u does not contain minimum recovery point %X/%X on timeline %u" msgstr "запитувана Ð»Ñ–Ð½Ñ–Ñ Ñ‡Ð°Ñу %u не міÑтить мінімальну точку Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ %X/%X на лінії чаÑу %u" -#: access/transam/xlogrecovery.c:833 +#: access/transam/xlogrecovery.c:893 #, c-format msgid "invalid next transaction ID" msgstr "невірний ID наÑтупної транзакції" -#: access/transam/xlogrecovery.c:838 +#: access/transam/xlogrecovery.c:898 #, c-format msgid "invalid redo in checkpoint record" msgstr "невірний Ð·Ð°Ð¿Ð¸Ñ REDO в контрольній точці" -#: access/transam/xlogrecovery.c:849 +#: access/transam/xlogrecovery.c:909 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "невірний Ð·Ð°Ð¿Ð¸Ñ REDO в контрольній точці вимкненнÑ" -#: access/transam/xlogrecovery.c:878 +#: access/transam/xlogrecovery.c:938 #, c-format msgid "database system was not properly shut down; automatic recovery in progress" msgstr "робота ÑиÑтеми бази даних не була завершена належним чином; відбуваєтьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ðµ відновленнÑ" -#: access/transam/xlogrecovery.c:882 +#: access/transam/xlogrecovery.c:942 #, c-format msgid "crash recovery starts in timeline %u and has target timeline %u" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð·Ð±Ð¾ÑŽ починаєтьÑÑ Ð½Ð° лінії чаÑу %u Ñ– має цільову лінію чаÑу: %u" -#: access/transam/xlogrecovery.c:925 +#: access/transam/xlogrecovery.c:985 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_label міÑтить дані, Ñкі не узгоджені з файлом pg_control" -#: access/transam/xlogrecovery.c:926 +#: access/transam/xlogrecovery.c:986 #, c-format msgid "This means that the backup is corrupted and you will have to use another backup for recovery." msgstr "Це означає, що резервна ÐºÐ¾Ð¿Ñ–Ñ Ð±ÑƒÐ»Ð° пошкоджена Ñ– вам доведетьÑÑ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтати іншу резервну копію Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: access/transam/xlogrecovery.c:980 +#: access/transam/xlogrecovery.c:1040 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "викориÑÑ‚Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ команд Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ \"%s\" не підтримуєтьÑÑ" -#: access/transam/xlogrecovery.c:1045 +#: access/transam/xlogrecovery.c:1105 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "режим Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримуєтьÑÑ Ð¾Ð´Ð½Ð¾ÐºÐ¾Ñ€Ð¸Ñтувацьким Ñервером" -#: access/transam/xlogrecovery.c:1062 +#: access/transam/xlogrecovery.c:1122 #, c-format -msgid "specified neither primary_conninfo nor restore_command" -msgstr "не заззначено ані параметр primary_conninfo, ані параметр restore_command" +msgid "specified neither \"primary_conninfo\" nor \"restore_command\"" +msgstr "не вказано ні \"primary_conninfo\", ані \"restore_command\"" -#: access/transam/xlogrecovery.c:1063 +#: access/transam/xlogrecovery.c:1123 #, c-format msgid "The database server will regularly poll the pg_wal subdirectory to check for files placed there." msgstr "Сервер бази даних буде регулÑрно опитувати підкатолог pg_wal Ñ– перевірÑти файли, що міÑÑ‚ÑтьÑÑ Ñƒ ньому." -#: access/transam/xlogrecovery.c:1071 +#: access/transam/xlogrecovery.c:1131 #, c-format -msgid "must specify restore_command when standby mode is not enabled" -msgstr "необхідно вказати restore_command, Ñкщо не ввімкнено режиму очікуваннÑ" +msgid "must specify \"restore_command\" when standby mode is not enabled" +msgstr "необхідно вказати \"restore_command\", Ñкщо не ввімкнено режиму очікуваннÑ" -#: access/transam/xlogrecovery.c:1109 +#: access/transam/xlogrecovery.c:1169 #, c-format msgid "recovery target timeline %u does not exist" msgstr "цільова Ð»Ñ–Ð½Ñ–Ñ Ñ‡Ð°Ñу Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ %u не Ñ–Ñнує" -#: access/transam/xlogrecovery.c:1259 +#: access/transam/xlogrecovery.c:1252 access/transam/xlogrecovery.c:1259 +#: access/transam/xlogrecovery.c:1318 access/transam/xlogrecovery.c:1406 +#: access/transam/xlogrecovery.c:1415 access/transam/xlogrecovery.c:1435 +#, c-format +msgid "invalid data in file \"%s\"" +msgstr "невірні дані у файлі \"%s\"" + +#: access/transam/xlogrecovery.c:1319 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "Проаналізовано ID чаÑової лінії %u, очіувалоÑÑ %u." -#: access/transam/xlogrecovery.c:1641 +#: access/transam/xlogrecovery.c:1330 +#, c-format +msgid "this is an incremental backup, not a data directory" +msgstr "це інкрементна резервна копіÑ, а не каталог даних" + +#: access/transam/xlogrecovery.c:1331 +#, c-format +msgid "Use pg_combinebackup to reconstruct a valid data directory." +msgstr "ВикориÑтовуйте pg_combinebackup Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð³Ð¾ каталогу даних." + +#: access/transam/xlogrecovery.c:1717 +#, c-format +msgid "unexpected record type found at redo point %X/%X" +msgstr "знайдено неочікуваний тип запиÑу в точці Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð½Ñ %X/%X" + +#: access/transam/xlogrecovery.c:1740 #, c-format msgid "redo starts at %X/%X" msgstr "Ð·Ð°Ð¿Ð¸Ñ REDO починаєтьÑÑ Ð· %X/%X" -#: access/transam/xlogrecovery.c:1654 +#: access/transam/xlogrecovery.c:1753 #, c-format msgid "redo in progress, elapsed time: %ld.%02d s, current LSN: %X/%X" msgstr "Ð·Ð°Ð¿Ð¸Ñ REDO триває, минуло чаÑу: %ld.%02d s, поточний LSN: %X/%X" -#: access/transam/xlogrecovery.c:1746 +#: access/transam/xlogrecovery.c:1843 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "запитувана точка Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ÑƒÑ” узгодженій точці відновленнÑ" -#: access/transam/xlogrecovery.c:1778 +#: access/transam/xlogrecovery.c:1875 #, c-format msgid "redo done at %X/%X system usage: %s" msgstr "повторно виконано через %X/%X ÑиÑтемне викориÑтаннÑ: %s" -#: access/transam/xlogrecovery.c:1784 +#: access/transam/xlogrecovery.c:1881 #, c-format msgid "last completed transaction was at log time %s" msgstr "оÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð° Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð±ÑƒÐ»Ð° в %s" -#: access/transam/xlogrecovery.c:1793 +#: access/transam/xlogrecovery.c:1890 #, c-format msgid "redo is not required" msgstr "дані REDO не потрібні" -#: access/transam/xlogrecovery.c:1804 +#: access/transam/xlogrecovery.c:1901 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»Ð¾ÑÑŒ до доÑÑÐ³ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚Ð¾Ð²Ð°Ð½Ð¾Ñ— цілі відновленнÑ" -#: access/transam/xlogrecovery.c:1979 +#: access/transam/xlogrecovery.c:2095 #, c-format msgid "successfully skipped missing contrecord at %X/%X, overwritten at %s" msgstr "уÑпішно пропущений відÑутній contrecord при %X/%X, перезапиÑано на %s" -#: access/transam/xlogrecovery.c:2046 +#: access/transam/xlogrecovery.c:2162 #, c-format msgid "unexpected directory entry \"%s\" found in %s" msgstr "знайдено неочікуваний Ð·Ð°Ð¿Ð¸Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ \"%s\" в %s" -#: access/transam/xlogrecovery.c:2048 +#: access/transam/xlogrecovery.c:2164 #, c-format msgid "All directory entries in pg_tblspc/ should be symbolic links." msgstr "Ð’ÑÑ– запиÑи каталогу в pg_tblspc/ повинні бути Ñимволічними поÑиланнÑми." -#: access/transam/xlogrecovery.c:2049 +#: access/transam/xlogrecovery.c:2165 +#, c-format +msgid "Remove those directories, or set \"allow_in_place_tablespaces\" to ON transiently to let recovery complete." +msgstr "Видаліть ті каталоги, або тимчаÑово вÑтановіть Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"allow_in_place_tablespaces\" Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ON, щоб завершити відновленнÑ." + +#: access/transam/xlogrecovery.c:2217 #, c-format -msgid "Remove those directories, or set allow_in_place_tablespaces to ON transiently to let recovery complete." -msgstr "Видаліть ті каталоги, або тимчаÑово вÑтановіть Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° allow_in_place_tablespaces Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ON, щоб завершити відновленнÑ." +msgid "completed backup recovery with redo LSN %X/%X and end LSN %X/%X" +msgstr "завершено Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ñ— копії з LSN Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÐµÐ½Ð½Ñ %X/%X Ñ– LSN Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ %X/%X" -#: access/transam/xlogrecovery.c:2123 +#: access/transam/xlogrecovery.c:2247 #, c-format msgid "consistent recovery state reached at %X/%X" msgstr "узгоджений Ñтан Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ÑÑгнутий %X/%X" #. translator: %s is a WAL record description -#: access/transam/xlogrecovery.c:2161 +#: access/transam/xlogrecovery.c:2285 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "Ð·Ð°Ð¿Ð¸Ñ REDO в WAL в позиції %X/%X Ð´Ð»Ñ %s" -#: access/transam/xlogrecovery.c:2257 +#: access/transam/xlogrecovery.c:2383 #, c-format msgid "unexpected previous timeline ID %u (current timeline ID %u) in checkpoint record" msgstr "неÑподіваний ID попередньої лінії чаÑу %u (ID теперішньої лінії чаÑу %u) в запиÑÑ– контрольної точки" -#: access/transam/xlogrecovery.c:2266 +#: access/transam/xlogrecovery.c:2392 #, c-format msgid "unexpected timeline ID %u (after %u) in checkpoint record" msgstr "неочікуваний ID лінії чаÑу %u (піÑÐ»Ñ %u) в запиÑÑ– контрольної точки" -#: access/transam/xlogrecovery.c:2282 +#: access/transam/xlogrecovery.c:2408 #, c-format msgid "unexpected timeline ID %u in checkpoint record, before reaching minimum recovery point %X/%X on timeline %u" msgstr "неочікуваний ID лінії чаÑу %u в запиÑÑ– контрольної точки, до доÑÑÐ³Ð½ÐµÐ½Ð½Ñ Ð¼Ñ–Ð½Ñ–Ð¼Ð°Ð»ÑŒÐ½Ð¾Ñ— точки Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ %X/%X на лінії чаÑу %u" -#: access/transam/xlogrecovery.c:2464 access/transam/xlogrecovery.c:2735 +#: access/transam/xlogrecovery.c:2592 access/transam/xlogrecovery.c:2868 #, c-format msgid "recovery stopping after reaching consistency" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·ÑƒÐ¿Ð¸Ð½ÑєтьÑÑ Ð¿Ñ–ÑÐ»Ñ Ð´Ð¾ÑÑÐ³Ð½ÐµÐ½Ð½Ñ ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð¾Ñті" -#: access/transam/xlogrecovery.c:2485 +#: access/transam/xlogrecovery.c:2613 #, c-format msgid "recovery stopping before WAL location (LSN) \"%X/%X\"" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·ÑƒÐ¿Ð¸Ð½ÑєтьÑÑ Ð¿ÐµÑ€ÐµÐ´ позицією WAL (LSN) \"%X/%X\"" -#: access/transam/xlogrecovery.c:2570 +#: access/transam/xlogrecovery.c:2703 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÑєтьÑÑ Ð´Ð¾ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— %u, Ñ‡Ð°Ñ %s" -#: access/transam/xlogrecovery.c:2577 +#: access/transam/xlogrecovery.c:2710 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÑєтьÑÑ Ð´Ð¾ ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— %u, Ñ‡Ð°Ñ %s" -#: access/transam/xlogrecovery.c:2630 +#: access/transam/xlogrecovery.c:2763 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÑєтьÑÑ Ð² точці відновленнÑ\"%s\", Ñ‡Ð°Ñ %s" -#: access/transam/xlogrecovery.c:2648 +#: access/transam/xlogrecovery.c:2781 #, c-format msgid "recovery stopping after WAL location (LSN) \"%X/%X\"" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÑєтьÑÑ Ð¿Ñ–ÑÐ½Ñ Ð»Ð¾ÐºÐ°Ñ†Ñ–Ñ— WAL (LSN) \"%X/%X\"" -#: access/transam/xlogrecovery.c:2715 +#: access/transam/xlogrecovery.c:2848 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÑєтьÑÑ Ð¿Ñ–ÑÐ»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— %u, Ñ‡Ð°Ñ %s" -#: access/transam/xlogrecovery.c:2723 +#: access/transam/xlogrecovery.c:2856 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÑєтьÑÑ Ð¿Ñ–ÑÐ»Ñ ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ— %u, Ñ‡Ð°Ñ %s" -#: access/transam/xlogrecovery.c:2804 +#: access/transam/xlogrecovery.c:2937 #, c-format msgid "pausing at the end of recovery" msgstr "пауза в кінці відновленнÑ" -#: access/transam/xlogrecovery.c:2805 +#: access/transam/xlogrecovery.c:2938 #, c-format msgid "Execute pg_wal_replay_resume() to promote." msgstr "Виконайте pg_wal_replay_resume() Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ€Ñ–Ð²Ð½Ñ." -#: access/transam/xlogrecovery.c:2808 access/transam/xlogrecovery.c:4599 +#: access/transam/xlogrecovery.c:2941 access/transam/xlogrecovery.c:4679 #, c-format msgid "recovery has paused" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·ÑƒÐ¿Ð¸Ð½ÐµÐ½Ð¾" -#: access/transam/xlogrecovery.c:2809 +#: access/transam/xlogrecovery.c:2942 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "Виконайте pg_wal_replay_resume(), щоб продовжити." -#: access/transam/xlogrecovery.c:3069 -#, c-format -msgid "unexpected timeline ID %u in log segment %s, offset %u" -msgstr "неочіукваний ID лінії чаÑу %u в Ñегменті журналу %s, зÑув %u" - -#: access/transam/xlogrecovery.c:3274 -#, c-format -msgid "could not read from log segment %s, offset %u: %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñегмент журналу %s, зÑув %u: %m" - -#: access/transam/xlogrecovery.c:3280 +#: access/transam/xlogrecovery.c:3205 #, c-format -msgid "could not read from log segment %s, offset %u: read %d of %zu" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñегмент журналу %s, зÑув %u: прочитано %d з %zu" +msgid "unexpected timeline ID %u in WAL segment %s, LSN %X/%X, offset %u" +msgstr "неочікуваний ID лінії чаÑу %u в Ñегменті WAL %s, LSN %X/%X, offset %u" -#: access/transam/xlogrecovery.c:3916 +#: access/transam/xlogrecovery.c:3413 #, c-format -msgid "invalid primary checkpoint link in control file" -msgstr "невірне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° первинну контрольну точку в контрольному файлі" +msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñегмент журналу %s, LSN %X/%X, зÑув %u: %m" -#: access/transam/xlogrecovery.c:3920 +#: access/transam/xlogrecovery.c:3420 #, c-format -msgid "invalid checkpoint link in backup_label file" -msgstr "невірне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° контрольну точку в файлі backup_label" +msgid "could not read from WAL segment %s, LSN %X/%X, offset %u: read %d of %zu" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñегмент WAL %s, LSN %X/%X, зÑув %u: прочитано %d з %zu" -#: access/transam/xlogrecovery.c:3938 +#: access/transam/xlogrecovery.c:4061 #, c-format -msgid "invalid primary checkpoint record" -msgstr "невірний Ð·Ð°Ð¿Ð¸Ñ Ð¿ÐµÑ€Ð²Ð¸Ð½Ð½Ð¾Ñ— контрольної точки" +msgid "invalid checkpoint location" +msgstr "невірне Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки" -#: access/transam/xlogrecovery.c:3942 +#: access/transam/xlogrecovery.c:4071 #, c-format msgid "invalid checkpoint record" msgstr "невірний Ð·Ð°Ð¿Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки" -#: access/transam/xlogrecovery.c:3953 -#, c-format -msgid "invalid resource manager ID in primary checkpoint record" -msgstr "невірний ID менеджера реÑурÑів в запиÑÑ– первинної контрольної точки" - -#: access/transam/xlogrecovery.c:3957 +#: access/transam/xlogrecovery.c:4077 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "невірний ID менеджера реÑурÑів в запиÑÑ– контрольної точки" -#: access/transam/xlogrecovery.c:3970 -#, c-format -msgid "invalid xl_info in primary checkpoint record" -msgstr "невірний xl_info у запиÑÑ– первинної контрольної точки" - -#: access/transam/xlogrecovery.c:3974 +#: access/transam/xlogrecovery.c:4085 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "невірний xl_info у запиÑÑ– контрольної точки" -#: access/transam/xlogrecovery.c:3985 -#, c-format -msgid "invalid length of primary checkpoint record" -msgstr "невірна довжина запиÑу первинної контрольної очки" - -#: access/transam/xlogrecovery.c:3989 +#: access/transam/xlogrecovery.c:4091 #, c-format msgid "invalid length of checkpoint record" msgstr "невірна довжина запиÑу контрольної точки" -#: access/transam/xlogrecovery.c:4045 +#: access/transam/xlogrecovery.c:4145 #, c-format msgid "new timeline %u is not a child of database system timeline %u" msgstr "нова Ð»Ñ–Ð½Ñ–Ñ Ñ‡Ð°Ñу %u не Ñ” дочірньою Ð´Ð»Ñ Ð»Ñ–Ð½Ñ–Ñ— чаÑу ÑиÑтеми бази даних %u" -#: access/transam/xlogrecovery.c:4059 +#: access/transam/xlogrecovery.c:4159 #, c-format msgid "new timeline %u forked off current database system timeline %u before current recovery point %X/%X" msgstr "нова Ð»Ñ–Ð½Ñ–Ñ Ñ‡Ð°Ñу %u відгалузилаÑÑŒ від поточної лінії чаÑу бази даних %u до поточної точки Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ %X/%X" -#: access/transam/xlogrecovery.c:4078 +#: access/transam/xlogrecovery.c:4178 #, c-format msgid "new target timeline is %u" msgstr "нова цільова Ð»Ñ–Ð½Ñ–Ñ Ñ‡Ð°Ñу %u" -#: access/transam/xlogrecovery.c:4281 +#: access/transam/xlogrecovery.c:4381 #, c-format msgid "WAL receiver process shutdown requested" msgstr "Запит на Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу приймача WAL" -#: access/transam/xlogrecovery.c:4344 +#: access/transam/xlogrecovery.c:4441 #, c-format msgid "received promote request" msgstr "отримано запит Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ ÑтатуÑу" -#: access/transam/xlogrecovery.c:4357 -#, c-format -msgid "promote trigger file found: %s" -msgstr "знайдено файл тригера підвищеннÑ: %s" - -#: access/transam/xlogrecovery.c:4365 -#, c-format -msgid "could not stat promote trigger file \"%s\": %m" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про файл тригера Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ \"%s\": %m" - -#: access/transam/xlogrecovery.c:4590 +#: access/transam/xlogrecovery.c:4670 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "hot standby неможливий через недоÑтатнє Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð²" -#: access/transam/xlogrecovery.c:4591 access/transam/xlogrecovery.c:4618 -#: access/transam/xlogrecovery.c:4648 +#: access/transam/xlogrecovery.c:4671 access/transam/xlogrecovery.c:4698 +#: access/transam/xlogrecovery.c:4728 #, c-format msgid "%s = %d is a lower setting than on the primary server, where its value was %d." msgstr "%s = %d Ñ” нижчим параметром, ніж на оÑновному Ñервері, де його Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ %d." -#: access/transam/xlogrecovery.c:4600 +#: access/transam/xlogrecovery.c:4680 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "Якщо Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ буде зупинено, Ñервер завершить роботу." -#: access/transam/xlogrecovery.c:4601 +#: access/transam/xlogrecovery.c:4681 #, c-format msgid "You can then restart the server after making the necessary configuration changes." msgstr "ПіÑÐ»Ñ Ð·Ð´Ñ–Ð¹ÑÐ½ÐµÐ½Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð¸Ñ… змін у конфігурації, ви можете перезапуÑтити Ñервер." -#: access/transam/xlogrecovery.c:4612 +#: access/transam/xlogrecovery.c:4692 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ðµ через недоÑтатнє Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð²" -#: access/transam/xlogrecovery.c:4622 +#: access/transam/xlogrecovery.c:4702 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "ПерезапуÑтити Ñервер піÑÐ»Ñ Ð·Ð´Ñ–Ð¹ÑÐ½ÐµÐ½Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð¸Ñ… змін у конфігурації." -#: access/transam/xlogrecovery.c:4646 +#: access/transam/xlogrecovery.c:4726 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через недоÑтатнє Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð²" -#: access/transam/xlogrecovery.c:4652 +#: access/transam/xlogrecovery.c:4732 #, c-format msgid "You can restart the server after making the necessary configuration changes." msgstr "Ви можете перезапуÑтити Ñервер, піÑÐ»Ñ Ð·Ð´Ñ–Ð¹ÑÐ½ÐµÐ½Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð¸Ñ… змін у конфігурації." -#: access/transam/xlogutils.c:1051 +#: access/transam/xlogrecovery.c:4774 +#, c-format +msgid "multiple recovery targets specified" +msgstr "вказано декілька цілей відновленнÑ" + +#: access/transam/xlogrecovery.c:4775 +#, c-format +msgid "At most one of \"recovery_target\", \"recovery_target_lsn\", \"recovery_target_name\", \"recovery_target_time\", \"recovery_target_xid\" may be set." +msgstr "МакÑимум один із \"recovery_target\", \"recovery_target_lsn\", \"recovery_target_name\", \"recovery_target_time\", \"recovery_target_xid\" може бути вÑтановлений." + +#: access/transam/xlogrecovery.c:4786 +#, c-format +msgid "The only allowed value is \"immediate\"." +msgstr "Єдиним дозволеним значеннÑм Ñ” \"immediate\"." + +#: access/transam/xlogrecovery.c:4938 utils/adt/timestamp.c:202 +#: utils/adt/timestamp.c:455 +#, c-format +msgid "timestamp out of range: \"%s\"" +msgstr "позначка чаÑу поза діапазоном: \"%s\"" + +#: access/transam/xlogrecovery.c:4983 +#, c-format +msgid "\"recovery_target_timeline\" is not a valid number." +msgstr "\"recovery_target_timeline\" не Ñ” допуÑтимим чиÑлом." + +#: access/transam/xlogutils.c:1032 +#, c-format +msgid "could not read from WAL segment %s, offset %d: %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñегмент WAL %s, зÑув %d: %m" + +#: access/transam/xlogutils.c:1039 +#, c-format +msgid "could not read from WAL segment %s, offset %d: read %d of %d" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñегмент WAL %s, зÑув %d: прочитано %d з %d" + +#: archive/shell_archive.c:98 +#, c-format +msgid "archive command failed with exit code %d" +msgstr "команда архівації завершилаÑÑŒ помилкой з кодом %d" + +#: archive/shell_archive.c:100 archive/shell_archive.c:110 +#: archive/shell_archive.c:116 archive/shell_archive.c:125 +#, c-format +msgid "The failed archive command was: %s" +msgstr "Команда архівації з помилкою: %s" + +#: archive/shell_archive.c:107 +#, c-format +msgid "archive command was terminated by exception 0x%X" +msgstr "команда архівації була перервана винÑтком 0x%X" + +#: archive/shell_archive.c:109 postmaster/postmaster.c:3095 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "ÐžÐ¿Ð¸Ñ Ñ†ÑŒÐ¾Ð³Ð¾ ШіÑтнадцÑткового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¸Ð²Ñ–Ñ‚ÑŒÑÑ Ñƒ включаємому C-файлі \"ntstatus.h\"." + +#: archive/shell_archive.c:114 #, c-format -msgid "could not read from log segment %s, offset %d: %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñегмент журналу %s, зÑув %d: %m" +msgid "archive command was terminated by signal %d: %s" +msgstr "команда архівації була перервана Ñигналом %d: %s" -#: access/transam/xlogutils.c:1058 +#: archive/shell_archive.c:123 #, c-format -msgid "could not read from log segment %s, offset %d: read %d of %d" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñегмент журналу %s, зÑув %d: прочитано %d з %d" +msgid "archive command exited with unrecognized status %d" +msgstr "команда архівації завершена з нерозпізнаним ÑтатуÑом %d" -#: backup/backup_manifest.c:253 +#: backup/backup_manifest.c:254 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "очікувавÑÑ ÐºÑ–Ð½ÐµÑ†ÑŒ чаÑової шкали %u але знайдено чаÑову шкалу %u" -#: backup/backup_manifest.c:277 +#: backup/backup_manifest.c:278 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "очікувавÑÑ Ð¿Ð¾Ñ‡Ð°Ñ‚Ð¾Ðº чаÑової шкали %u але знайдено чаÑову шкалу %u" -#: backup/backup_manifest.c:304 +#: backup/backup_manifest.c:305 #, c-format msgid "start timeline %u not found in history of timeline %u" msgstr "початок чаÑової шкали %u не знайдено в Ñ–Ñторії чаÑової шкали %u" -#: backup/backup_manifest.c:355 +#: backup/backup_manifest.c:356 #, c-format msgid "could not rewind temporary file" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¼Ð¾Ñ‚Ð°Ñ‚Ð¸ назад тимчаÑовий файл" -#: backup/backup_manifest.c:374 -#, c-format -msgid "could not read from temporary file: %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з тимчаÑового файлу: %m" - -#: backup/basebackup.c:454 +#: backup/basebackup.c:479 #, c-format msgid "could not find any WAL files" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ні одного файла WAL" -#: backup/basebackup.c:469 backup/basebackup.c:484 backup/basebackup.c:493 +#: backup/basebackup.c:494 backup/basebackup.c:509 backup/basebackup.c:518 #, c-format msgid "could not find WAL file \"%s\"" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файл WAL \"%s\"" -#: backup/basebackup.c:535 backup/basebackup.c:560 +#: backup/basebackup.c:560 backup/basebackup.c:585 #, c-format msgid "unexpected WAL file size \"%s\"" msgstr "неочікуаний розмір файлу WAL \"%s\"" -#: backup/basebackup.c:630 +#: backup/basebackup.c:656 #, c-format msgid "%lld total checksum verification failure" msgid_plural "%lld total checksum verification failures" @@ -3416,101 +3759,96 @@ msgstr[1] "вÑього помилок перевірки контрольних msgstr[2] "вÑього помилок перевірки контрольних Ñум: %lld" msgstr[3] "вÑього помилок перевірки контрольних Ñум: %lld" -#: backup/basebackup.c:637 +#: backup/basebackup.c:663 #, c-format msgid "checksum verification failure during base backup" msgstr "під Ñ‡Ð°Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ñвлено неполадки контрольних Ñум" -#: backup/basebackup.c:706 backup/basebackup.c:715 backup/basebackup.c:726 -#: backup/basebackup.c:743 backup/basebackup.c:752 backup/basebackup.c:763 -#: backup/basebackup.c:780 backup/basebackup.c:789 backup/basebackup.c:801 -#: backup/basebackup.c:825 backup/basebackup.c:839 backup/basebackup.c:850 -#: backup/basebackup.c:861 backup/basebackup.c:874 +#: backup/basebackup.c:733 backup/basebackup.c:742 backup/basebackup.c:753 +#: backup/basebackup.c:770 backup/basebackup.c:779 backup/basebackup.c:788 +#: backup/basebackup.c:803 backup/basebackup.c:820 backup/basebackup.c:829 +#: backup/basebackup.c:841 backup/basebackup.c:865 backup/basebackup.c:879 +#: backup/basebackup.c:890 backup/basebackup.c:901 backup/basebackup.c:914 #, c-format msgid "duplicate option \"%s\"" msgstr "повторюваний параметр \"%s\"" -#: backup/basebackup.c:734 +#: backup/basebackup.c:761 #, c-format msgid "unrecognized checkpoint type: \"%s\"" msgstr "нерозпізнаний тип контрольної точки: \"%s\"" -#: backup/basebackup.c:769 +#: backup/basebackup.c:793 +#, c-format +msgid "incremental backups cannot be taken unless WAL summarization is enabled" +msgstr "інкрементні резервні копії не можна Ñтворювати, Ñкщо не ввімкнено підÑÑƒÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ WAL" + +#: backup/basebackup.c:809 #, c-format msgid "%d is outside the valid range for parameter \"%s\" (%d .. %d)" msgstr "%d за припуÑтимим діапазномо Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\" (%d .. %d)" -#: backup/basebackup.c:814 +#: backup/basebackup.c:854 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "нерозпізнаний параметр маніфеÑту: \"%s\"" -#: backup/basebackup.c:830 -#, c-format -msgid "unrecognized checksum algorithm: \"%s\"" -msgstr "нерозпізнаний алгоритм контрольної Ñуми: \"%s\"" - -#: backup/basebackup.c:865 +#: backup/basebackup.c:905 #, c-format -msgid "unrecognized compression algorithm \"%s\"" -msgstr "нерозпізнаний алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\"" +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "нерозпізнаний алгоритм ÑтиÑканнÑ: \"%s\"" -#: backup/basebackup.c:881 +#: backup/basebackup.c:921 #, c-format msgid "unrecognized base backup option: \"%s\"" msgstr "нерозпізнаний параметр базової резервної копії: \"%s\"" -#: backup/basebackup.c:892 +#: backup/basebackup.c:932 #, c-format msgid "manifest checksums require a backup manifest" msgstr "контрольні Ñуми маніфеÑту потребують резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту" -#: backup/basebackup.c:901 +#: backup/basebackup.c:941 #, c-format msgid "target detail cannot be used without target" msgstr "елемент цілі не можна викориÑтовувати без цілі" -#: backup/basebackup.c:910 backup/basebackup_target.c:218 +#: backup/basebackup.c:950 backup/basebackup_target.c:218 #, c-format -msgid "target '%s' does not accept a target detail" -msgstr "ціль '%s' не приймає елемент цілі" +msgid "target \"%s\" does not accept a target detail" +msgstr "ціль \"%s\" не приймає елемент цілі" -#: backup/basebackup.c:921 +#: backup/basebackup.c:961 #, c-format -msgid "compression detail requires compression" -msgstr "елемент ÑтиÑÐºÐ°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” ÑтиÑканнÑ" +msgid "compression detail cannot be specified unless compression is enabled" +msgstr "деталі ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð½Ðµ можуть бути вказані, Ñкщо не увімкнено ÑтиÑненнÑ" -#: backup/basebackup.c:934 +#: backup/basebackup.c:974 #, c-format msgid "invalid compression specification: %s" msgstr "неприпуÑтима ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ ÑтиÑканнÑ: %s" -#: backup/basebackup.c:1430 -#, c-format -msgid "skipping special file \"%s\"" -msgstr "Ñпеціальний файл \"%s\" пропуÑкаєтьÑÑ" - -#: backup/basebackup.c:1549 +#: backup/basebackup.c:1024 #, c-format -msgid "invalid segment number %d in file \"%s\"" -msgstr "неприпуÑтимий номер Ñегменту %d в файлі \"%s\"" +msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" +msgstr "повинен UPLOAD_MANIFEST перед виконаннÑм інкрементного BASE_BACKUP" -#: backup/basebackup.c:1589 +#: backup/basebackup.c:1157 backup/basebackup.c:1358 #, c-format -msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ контрольну Ñуму у файлі \"%s\", блок %u: розмір прочитаного буфера %d Ñ– розмір прочитаної Ñторінки %d відрізнÑютьÑÑ" +msgid "could not stat file or directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про файл або каталог \"%s\": %m" -#: backup/basebackup.c:1663 +#: backup/basebackup.c:1544 #, c-format -msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" -msgstr "помилка перевірки контрольної Ñуми у файлі \"%s\", блок %u: обчиÑлено %X, але очікувалоÑÑŒ %X" +msgid "skipping special file \"%s\"" +msgstr "Ñпеціальний файл \"%s\" пропуÑкаєтьÑÑ" -#: backup/basebackup.c:1670 +#: backup/basebackup.c:1751 #, c-format -msgid "further checksum verification failures in file \"%s\" will not be reported" -msgstr "про подальші помилки під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ контрольної Ñуми в файлі \"%s\" повідомлÑтиÑÑŒ не буде" +msgid "could not verify checksum in file \"%s\", block %u: read buffer size %d and page size %d differ" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ контрольну Ñуму у файлі \"%s\", блок %u: розмір прочитаного буфера %d Ñ– розмір прочитаної Ñторінки %d відрізнÑютьÑÑ" -#: backup/basebackup.c:1717 +#: backup/basebackup.c:1813 #, c-format msgid "file \"%s\" has a total of %d checksum verification failure" msgid_plural "file \"%s\" has a total of %d checksum verification failures" @@ -3519,44 +3857,124 @@ msgstr[1] "файл \"%s\" має загальну кількіÑть помил msgstr[2] "файл \"%s\" має загальну кількіÑть помилок перевірки контрольної Ñуми: %d" msgstr[3] "файл \"%s\" має загальну кількіÑть помилок перевірки контрольної Ñуми: %d" -#: backup/basebackup.c:1763 +#: backup/basebackup.c:1917 +#, c-format +msgid "checksum verification failed in file \"%s\", block %u: calculated %X but expected %X" +msgstr "помилка перевірки контрольної Ñуми у файлі \"%s\", блок %u: обчиÑлено %X, але очікувалоÑÑŒ %X" + +#: backup/basebackup.c:1924 +#, c-format +msgid "further checksum verification failures in file \"%s\" will not be reported" +msgstr "про подальші помилки під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ контрольної Ñуми в файлі \"%s\" повідомлÑтиÑÑŒ не буде" + +#: backup/basebackup.c:2048 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ занадто довге Ð´Ð»Ñ tar формату: \"%s\"" -#: backup/basebackup.c:1768 +#: backup/basebackup.c:2053 #, c-format msgid "symbolic link target too long for tar format: file name \"%s\", target \"%s\"" msgstr "мета Ñимвольного поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ довга Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñƒ tar: ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\", мета \"%s\"" +#: backup/basebackup.c:2127 +#, c-format +msgid "could not read file \"%s\": read %zd of %zu" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ %zd з %zu" + #: backup/basebackup_gzip.c:67 #, c-format msgid "gzip compression is not supported by this build" msgstr "ÑтиÑÐºÐ°Ð½Ð½Ñ gzip не підтримуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ збіркою" -#: backup/basebackup_gzip.c:147 +#: backup/basebackup_gzip.c:143 #, c-format msgid "could not initialize compression library" msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ бібліотеку ÑтиÑканнÑ" +#: backup/basebackup_incremental.c:294 +#, c-format +msgid "manifest contains no required WAL ranges" +msgstr "маніфеÑÑ‚ не міÑтить необхідних діапазонів WAL" + +#: backup/basebackup_incremental.c:349 +#, c-format +msgid "timeline %u found in manifest, but not in this server's history" +msgstr "чаÑову шкалу %u знайдено в маніфеÑті, але не в Ñ–Ñторії цього Ñервера" + +#: backup/basebackup_incremental.c:414 +#, c-format +msgid "manifest requires WAL from initial timeline %u starting at %X/%X, but that timeline begins at %X/%X" +msgstr "маніфеÑÑ‚ вимагає WAL з початкової шкали %u, починаючи з %X/%X, але Ñ†Ñ ÑˆÐºÐ°Ð»Ð° починаєтьÑÑ Ð· %X/%X" + +#: backup/basebackup_incremental.c:424 +#, c-format +msgid "manifest requires WAL from continuation timeline %u starting at %X/%X, but that timeline begins at %X/%X" +msgstr "маніфеÑÑ‚ вимагає WAL зі шкали Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ %u, починаючи з %X/%X, але Ñ†Ñ ÑˆÐºÐ°Ð»Ð° починаєтьÑÑ Ð· %X/%X" + +#: backup/basebackup_incremental.c:435 +#, c-format +msgid "manifest requires WAL from final timeline %u ending at %X/%X, but this backup starts at %X/%X" +msgstr "маніфеÑÑ‚ вимагає WAL з кінцевої шкали чаÑу %u, що закінчуєтьÑÑ Ð½Ð° %X/%X, але Ñ†Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð° ÐºÐ¾Ð¿Ñ–Ñ Ð¿Ð¾Ñ‡Ð¸Ð½Ð°Ñ”Ñ‚ÑŒÑÑ Ð· %X/%X" + +#: backup/basebackup_incremental.c:439 +#, c-format +msgid "This can happen for incremental backups on a standby if there was little activity since the previous backup." +msgstr "Це може ÑтатиÑÑ Ð· інкрементними резервними копіÑми на резервному Ñервері, Ñкщо було замало активноÑті з минулої резервної копії." + +#: backup/basebackup_incremental.c:446 +#, c-format +msgid "manifest requires WAL from non-final timeline %u ending at %X/%X, but this server switched timelines at %X/%X" +msgstr "маніфеÑÑ‚ вимагає WAL з не фінальної лінійки %u, що закінчуєтьÑÑ Ð½Ð° %X/%X, але цей Ñервер перемкнув лінійки на %X/%X" + +#: backup/basebackup_incremental.c:527 +#, c-format +msgid "WAL summaries are required on timeline %u from %X/%X to %X/%X, but no summaries for that timeline and LSN range exist" +msgstr "Ð—Ð²ÐµÐ´ÐµÐ½Ð½Ñ WAL потрібні на чаÑовій шкалі %u від %X/%X до %X/%X, але зведень Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— шкали та діапазону LSN не Ñ–Ñнує" + +#: backup/basebackup_incremental.c:534 +#, c-format +msgid "WAL summaries are required on timeline %u from %X/%X to %X/%X, but the summaries for that timeline and LSN range are incomplete" +msgstr "Ð—Ð²ÐµÐ´ÐµÐ½Ð½Ñ WAL потрібні на чаÑовій шкалі %u від %X/%X до %X/%X, але Ð·Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— чаÑової шкали та діапазону LSN Ñ” неповними" + +#: backup/basebackup_incremental.c:538 +#, c-format +msgid "The first unsummarized LSN in this range is %X/%X." +msgstr "Перший не підÑумований LSN у цьому діапазоні - %X/%X." + +#: backup/basebackup_incremental.c:938 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "маніфеÑÑ‚ резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñ— 1 не підтримує інкреметного резервного копіюваннÑ" + +#: backup/basebackup_incremental.c:956 +#, c-format +msgid "system identifier in backup manifest is %llu, but database system identifier is %llu" +msgstr "ÑиÑтемний ідентифікатор в маніфеÑті резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ %llu, але ідентифікатор ÑиÑтеми бази даних Ñ” %llu" + #: backup/basebackup_lz4.c:67 #, c-format msgid "lz4 compression is not supported by this build" msgstr "ÑтиÑÐºÐ°Ð½Ð½Ñ lz4 не підтримуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ збіркою" -#: backup/basebackup_server.c:75 +#: backup/basebackup_server.c:73 +#, c-format +msgid "permission denied to create backup stored on server" +msgstr "немає прав на ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ñ— копії, збереженої на Ñервері" + +#: backup/basebackup_server.c:74 #, c-format -msgid "must be superuser or a role with privileges of the pg_write_server_files role to create server backup" -msgstr "потрібно бути ÑуперкориÑтувачем або роллю з правами ролі pg_write_server_files Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ñ— копії Ñервера" +msgid "Only roles with privileges of the \"%s\" role may create a backup stored on the server." +msgstr "Тільки ролі з привілеÑми ролі \"%s\" можуть Ñтворювати резервні копії, що зберігаютьÑÑ Ð½Ð° Ñервері." #: backup/basebackup_server.c:89 #, c-format -msgid "relative path not allowed for server backup" -msgstr "відноÑний шлÑÑ… не дозволений Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñервера" +msgid "relative path not allowed for backup stored on server" +msgstr "відноÑний шлÑÑ… не дозволений Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð¾Ð³Ð¾ на Ñервері" -#: backup/basebackup_server.c:102 commands/dbcommands.c:507 -#: commands/tablespace.c:163 commands/tablespace.c:179 -#: commands/tablespace.c:614 commands/tablespace.c:659 replication/slot.c:1523 +#: backup/basebackup_server.c:102 commands/dbcommands.c:477 +#: commands/tablespace.c:157 commands/tablespace.c:173 +#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:1986 #: storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" @@ -3567,19 +3985,21 @@ msgstr "не вдалоÑÑ Ñтворити каталог \"%s\": %m" msgid "directory \"%s\" exists but is not empty" msgstr "каталог \"%s\" Ñ–Ñнує, але він не порожній" -#: backup/basebackup_server.c:123 utils/init/postinit.c:1071 +#: backup/basebackup_server.c:123 utils/init/postinit.c:1178 #, c-format msgid "could not access directory \"%s\": %m" msgstr "немає доÑтупу до каталогу \"%s\": %m" #: backup/basebackup_server.c:175 backup/basebackup_server.c:182 #: backup/basebackup_server.c:268 backup/basebackup_server.c:275 -#: storage/smgr/md.c:473 storage/smgr/md.c:480 storage/smgr/md.c:771 +#: backup/walsummary.c:312 storage/smgr/md.c:502 storage/smgr/md.c:509 +#: storage/smgr/md.c:591 storage/smgr/md.c:613 storage/smgr/md.c:999 #, c-format msgid "Check free disk space." msgstr "Перевірьте вільний диÑковий проÑтір." #: backup/basebackup_server.c:179 backup/basebackup_server.c:272 +#: backup/walsummary.c:309 #, c-format msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": запиÑано лише %d з %d байтів зі зÑувом %u" @@ -3591,731 +4011,674 @@ msgstr "нерозпізнана ціль: \"%s\"" #: backup/basebackup_target.c:237 #, c-format -msgid "target '%s' requires a target detail" -msgstr "ціль '%s' потребує елемент цілі" +msgid "target \"%s\" requires a target detail" +msgstr "ціль \"%s\" потребує елемент цілі" #: backup/basebackup_zstd.c:66 #, c-format msgid "zstd compression is not supported by this build" msgstr "ÑтиÑÐºÐ°Ð½Ð½Ñ zstd не підтримуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ збіркою" -#: backup/basebackup_zstd.c:120 +#: backup/basebackup_zstd.c:117 #, c-format msgid "could not set compression worker count to %d: %s" msgstr "не вдалоÑÑ Ð²Ñтановити кількіÑть процеÑів ÑтиÑÐºÐ°Ð½Ð½Ñ Ð½Ð° %d: %s" -#: bootstrap/bootstrap.c:263 +#: backup/basebackup_zstd.c:129 #, c-format -msgid "-X requires a power of two value between 1 MB and 1 GB" -msgstr "Ð´Ð»Ñ -X необхідне чиÑло, Ñке дорівнює Ñтупеню 2 в інтервалі від 1 МБ до 1 ГБ" +msgid "could not enable long-distance mode: %s" +msgstr "не вдалоÑÑ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ режим довгої відÑтані: %s" -#: bootstrap/bootstrap.c:280 postmaster/postmaster.c:846 tcop/postgres.c:3894 +#: backup/walsummaryfuncs.c:95 +#, c-format +msgid "invalid timeline %lld" +msgstr "неприпуÑтима чаÑова шкала %lld" + +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:623 tcop/postgres.c:3946 #, c-format msgid "--%s requires a value" msgstr "--%s необхідне значеннÑ" -#: bootstrap/bootstrap.c:285 postmaster/postmaster.c:851 tcop/postgres.c:3899 +#: bootstrap/bootstrap.c:244 postmaster/postmaster.c:628 tcop/postgres.c:3951 #, c-format msgid "-c %s requires a value" msgstr "-c %s необхідне значеннÑ" -#: bootstrap/bootstrap.c:296 postmaster/postmaster.c:863 -#: postmaster/postmaster.c:876 +#: bootstrap/bootstrap.c:282 postmaster/postmaster.c:746 +#: postmaster/postmaster.c:759 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації.\n" -#: bootstrap/bootstrap.c:305 +#: bootstrap/bootstrap.c:291 #, c-format msgid "%s: invalid command-line arguments\n" msgstr "%s: невірні аргументи командного Ñ€Ñдка\n" -#: catalog/aclchk.c:185 +#: catalog/aclchk.c:211 #, c-format msgid "grant options can only be granted to roles" msgstr "право Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð² можна надавати тільки ролÑм" -#: catalog/aclchk.c:307 +#: catalog/aclchk.c:333 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не призначено ніÑких прав" -#: catalog/aclchk.c:312 +#: catalog/aclchk.c:338 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "Ð´Ð»Ñ \"%s\" не призначено ніÑких прав" -#: catalog/aclchk.c:320 +#: catalog/aclchk.c:346 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" призначено не вÑÑ– права" -#: catalog/aclchk.c:325 +#: catalog/aclchk.c:351 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "Ð´Ð»Ñ \"%s\" призначено не вÑÑ– права" -#: catalog/aclchk.c:336 +#: catalog/aclchk.c:362 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" жодні права не можуть бути відкликані" -#: catalog/aclchk.c:341 +#: catalog/aclchk.c:367 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "Ð´Ð»Ñ \"%s\" жодні права не можуть бути відкликані" -#: catalog/aclchk.c:349 +#: catalog/aclchk.c:375 #, c-format msgid "not all privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не вÑÑ– права можуть бути відкликані" -#: catalog/aclchk.c:354 +#: catalog/aclchk.c:380 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "Ð´Ð»Ñ \"%s\" не вÑÑ– права можуть бути відкликані" -#: catalog/aclchk.c:386 +#: catalog/aclchk.c:412 #, c-format msgid "grantor must be current user" msgstr "грантодавець повинен бути поточним кориÑтувачем" -#: catalog/aclchk.c:454 catalog/aclchk.c:1029 +#: catalog/aclchk.c:480 catalog/aclchk.c:1055 #, c-format msgid "invalid privilege type %s for relation" msgstr "недійÑний тип права %s Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ" -#: catalog/aclchk.c:458 catalog/aclchk.c:1033 +#: catalog/aclchk.c:484 catalog/aclchk.c:1059 #, c-format msgid "invalid privilege type %s for sequence" msgstr "невірний тип права %s Ð´Ð»Ñ Ð¿Ð¾ÑлідовноÑті" -#: catalog/aclchk.c:462 +#: catalog/aclchk.c:488 #, c-format msgid "invalid privilege type %s for database" msgstr "недійÑний тип права %s Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних" -#: catalog/aclchk.c:466 +#: catalog/aclchk.c:492 #, c-format msgid "invalid privilege type %s for domain" msgstr "недійÑний тип права %s Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ" -#: catalog/aclchk.c:470 catalog/aclchk.c:1037 +#: catalog/aclchk.c:496 catalog/aclchk.c:1063 #, c-format msgid "invalid privilege type %s for function" msgstr "недійÑний тип права %s Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—" -#: catalog/aclchk.c:474 +#: catalog/aclchk.c:500 #, c-format msgid "invalid privilege type %s for language" msgstr "недійÑний тип права %s Ð´Ð»Ñ Ð¼Ð¾Ð²Ð¸" -#: catalog/aclchk.c:478 +#: catalog/aclchk.c:504 #, c-format msgid "invalid privilege type %s for large object" msgstr "недійÑний тип права %s Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об'єкту" -#: catalog/aclchk.c:482 catalog/aclchk.c:1053 +#: catalog/aclchk.c:508 catalog/aclchk.c:1079 #, c-format msgid "invalid privilege type %s for schema" msgstr "недійÑний тип привілеїв %s Ð´Ð»Ñ Ñхеми" -#: catalog/aclchk.c:486 catalog/aclchk.c:1041 +#: catalog/aclchk.c:512 catalog/aclchk.c:1067 #, c-format msgid "invalid privilege type %s for procedure" msgstr "недійÑний тип привілеїв %s Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸" -#: catalog/aclchk.c:490 catalog/aclchk.c:1045 +#: catalog/aclchk.c:516 catalog/aclchk.c:1071 #, c-format msgid "invalid privilege type %s for routine" msgstr "недійÑний тип привілею %s Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸" -#: catalog/aclchk.c:494 +#: catalog/aclchk.c:520 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "недійÑний тип привілеїв %s Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору" -#: catalog/aclchk.c:498 catalog/aclchk.c:1049 +#: catalog/aclchk.c:524 catalog/aclchk.c:1075 #, c-format msgid "invalid privilege type %s for type" msgstr "недійÑний тип привілею %s Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ" -#: catalog/aclchk.c:502 +#: catalog/aclchk.c:528 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "недійÑний тип привілею %s Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° Ñторонніх даних" -#: catalog/aclchk.c:506 +#: catalog/aclchk.c:532 #, c-format msgid "invalid privilege type %s for foreign server" -msgstr "недійÑний тип привілею%s Ð´Ð»Ñ Ñтороннього Ñерверу" +msgstr "недійÑний тип привілею %s Ð´Ð»Ñ Ñтороннього Ñерверу" -#: catalog/aclchk.c:510 +#: catalog/aclchk.c:536 #, c-format msgid "invalid privilege type %s for parameter" msgstr "неприпуÑтимий тип привілею %s Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ" -#: catalog/aclchk.c:549 +#: catalog/aclchk.c:575 #, c-format msgid "column privileges are only valid for relations" msgstr "привілеї ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð´Ñ–Ð¹Ñні лише Ð´Ð»Ñ Ð·Ð²'Ñзків" -#: catalog/aclchk.c:712 catalog/aclchk.c:4486 catalog/aclchk.c:5333 -#: catalog/objectaddress.c:1072 catalog/pg_largeobject.c:116 -#: storage/large_object/inv_api.c:287 +#: catalog/aclchk.c:738 catalog/aclchk.c:3629 catalog/objectaddress.c:1054 +#: catalog/pg_largeobject.c:113 storage/large_object/inv_api.c:285 #, c-format msgid "large object %u does not exist" msgstr "великого об'єкту %u не Ñ–Ñнує" -#: catalog/aclchk.c:1086 +#: catalog/aclchk.c:1112 #, c-format msgid "default privileges cannot be set for columns" msgstr "права за замовчуваннÑм не можна вÑтановити Ð´Ð»Ñ Ñтовпців" -#: catalog/aclchk.c:1246 +#: catalog/aclchk.c:1148 +#, c-format +msgid "permission denied to change default privileges" +msgstr "немає дозволу Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ прав за замовчуваннÑм" + +#: catalog/aclchk.c:1266 #, c-format msgid "cannot use IN SCHEMA clause when using GRANT/REVOKE ON SCHEMAS" msgstr "Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ IN SCHEMA не можна викориÑтати в GRANT/REVOKE ON SCHEMAS" -#: catalog/aclchk.c:1587 catalog/catalog.c:627 catalog/objectaddress.c:1543 -#: catalog/pg_publication.c:510 commands/analyze.c:391 commands/copy.c:776 -#: commands/sequence.c:1663 commands/tablecmds.c:7231 commands/tablecmds.c:7387 -#: commands/tablecmds.c:7437 commands/tablecmds.c:7511 -#: commands/tablecmds.c:7581 commands/tablecmds.c:7693 -#: commands/tablecmds.c:7787 commands/tablecmds.c:7846 -#: commands/tablecmds.c:7935 commands/tablecmds.c:7965 -#: commands/tablecmds.c:8093 commands/tablecmds.c:8175 -#: commands/tablecmds.c:8331 commands/tablecmds.c:8449 -#: commands/tablecmds.c:12123 commands/tablecmds.c:12304 -#: commands/tablecmds.c:12464 commands/tablecmds.c:13628 -#: commands/tablecmds.c:16216 commands/trigger.c:958 parser/analyze.c:2468 -#: parser/parse_relation.c:725 parser/parse_target.c:1063 -#: parser/parse_type.c:144 parser/parse_utilcmd.c:3434 -#: parser/parse_utilcmd.c:3470 parser/parse_utilcmd.c:3512 utils/adt/acl.c:2869 -#: utils/adt/ruleutils.c:2820 +#: catalog/aclchk.c:1617 catalog/catalog.c:659 catalog/objectaddress.c:1523 +#: catalog/pg_publication.c:528 commands/analyze.c:380 commands/copy.c:951 +#: commands/sequence.c:1655 commands/tablecmds.c:7572 commands/tablecmds.c:7726 +#: commands/tablecmds.c:7776 commands/tablecmds.c:7850 +#: commands/tablecmds.c:7920 commands/tablecmds.c:8050 +#: commands/tablecmds.c:8179 commands/tablecmds.c:8273 +#: commands/tablecmds.c:8374 commands/tablecmds.c:8501 +#: commands/tablecmds.c:8531 commands/tablecmds.c:8673 +#: commands/tablecmds.c:8766 commands/tablecmds.c:8900 +#: commands/tablecmds.c:9012 commands/tablecmds.c:12828 +#: commands/tablecmds.c:13020 commands/tablecmds.c:13181 +#: commands/tablecmds.c:14370 commands/tablecmds.c:16997 commands/trigger.c:942 +#: parser/analyze.c:2530 parser/parse_relation.c:737 parser/parse_target.c:1067 +#: parser/parse_type.c:144 parser/parse_utilcmd.c:3409 +#: parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2923 +#: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "Ñтовпець \"%s\" зв'Ñзку \"%s\" не Ñ–Ñнує" -#: catalog/aclchk.c:1850 catalog/objectaddress.c:1383 commands/sequence.c:1172 -#: commands/tablecmds.c:253 commands/tablecmds.c:17107 utils/adt/acl.c:2077 -#: utils/adt/acl.c:2107 utils/adt/acl.c:2139 utils/adt/acl.c:2171 -#: utils/adt/acl.c:2199 utils/adt/acl.c:2229 +#: catalog/aclchk.c:1862 +#, c-format +msgid "\"%s\" is an index" +msgstr "\"%s\" Ñ” індекÑом" + +#: catalog/aclchk.c:1869 commands/tablecmds.c:14527 commands/tablecmds.c:17913 +#, c-format +msgid "\"%s\" is a composite type" +msgstr "\"%s\" це Ñкладений тип" + +#: catalog/aclchk.c:1877 catalog/objectaddress.c:1363 commands/tablecmds.c:263 +#: commands/tablecmds.c:17877 utils/adt/acl.c:2107 utils/adt/acl.c:2137 +#: utils/adt/acl.c:2170 utils/adt/acl.c:2206 utils/adt/acl.c:2237 +#: utils/adt/acl.c:2268 #, c-format msgid "\"%s\" is not a sequence" -msgstr "\"%s\" не поÑлідовніÑть" +msgstr "\"%s\" не Ñ” поÑлідовніÑтю" -#: catalog/aclchk.c:1888 +#: catalog/aclchk.c:1915 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "поÑлідовніÑть \"%s\" підтримує лише привілеї USAGE, SELECT та UPDATE" -#: catalog/aclchk.c:1905 +#: catalog/aclchk.c:1932 #, c-format msgid "invalid privilege type %s for table" msgstr "недійÑний тип привілею %s Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–" -#: catalog/aclchk.c:2071 +#: catalog/aclchk.c:2097 #, c-format msgid "invalid privilege type %s for column" -msgstr "недійÑний тип права %s Ð´Ð»Ñ ÑтовпцÑ" +msgstr "недійÑний тип привілею %s Ð´Ð»Ñ ÑтовпцÑ" -#: catalog/aclchk.c:2084 +#: catalog/aclchk.c:2110 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" -msgstr "поÑлідовніÑть \"%s\" підтримує тільки право ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ SELECT" +msgstr "поÑлідовніÑть \"%s\" підтримує тільки привілей ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ SELECT" -#: catalog/aclchk.c:2666 +#: catalog/aclchk.c:2301 #, c-format msgid "language \"%s\" is not trusted" msgstr "мова \"%s\" не Ñ” довіреною" -#: catalog/aclchk.c:2668 +#: catalog/aclchk.c:2303 #, c-format msgid "GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages." -msgstr "GRANT Ñ– REVOKE не допуÑтимі Ð´Ð»Ñ Ð½ÐµÐ´Ð¾Ð²Ñ–Ñ€ÐµÐ½Ð¸Ñ… мов, тому що тільки ÑуперкориÑтувачі можуть викориÑтовувати недовірені мови." +msgstr "GRANT Ñ– REVOKE не Ñ” допуÑтимими Ð´Ð»Ñ Ð½ÐµÐ´Ð¾Ð²Ñ–Ñ€ÐµÐ½Ð¸Ñ… мов, тому що тільки ÑуперкориÑтувачі можуть викориÑтовувати недовірені мови." -#: catalog/aclchk.c:3182 +#: catalog/aclchk.c:2454 #, c-format msgid "cannot set privileges of array types" msgstr "не можна вÑтановити права Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñ–Ð² маÑивів" -#: catalog/aclchk.c:3183 +#: catalog/aclchk.c:2455 #, c-format msgid "Set the privileges of the element type instead." msgstr "ЗаміÑть цього вÑтановіть права Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ елементу." -#: catalog/aclchk.c:3190 catalog/objectaddress.c:1649 +#: catalog/aclchk.c:2459 +#, c-format +msgid "cannot set privileges of multirange types" +msgstr "не можна вÑтановити права Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñ–Ð² множинного діапазону" + +#: catalog/aclchk.c:2460 +#, c-format +msgid "Set the privileges of the range type instead." +msgstr "ЗаміÑть цього вÑтановіть права типу діапазону." + +#: catalog/aclchk.c:2467 catalog/objectaddress.c:1629 #, c-format msgid "\"%s\" is not a domain" msgstr "\"%s\" не Ñ” доменом" -#: catalog/aclchk.c:3462 +#: catalog/aclchk.c:2653 #, c-format msgid "unrecognized privilege type \"%s\"" -msgstr "нерозпізнане право \"%s\"" +msgstr "нерозпізнаний привілей \"%s\"" -#: catalog/aclchk.c:3527 +#: catalog/aclchk.c:2720 #, c-format msgid "permission denied for aggregate %s" msgstr "немає дозволу Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ñƒ %s" -#: catalog/aclchk.c:3530 +#: catalog/aclchk.c:2723 #, c-format msgid "permission denied for collation %s" msgstr "немає дозволу Ð´Ð»Ñ ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ %s" -#: catalog/aclchk.c:3533 +#: catalog/aclchk.c:2726 #, c-format msgid "permission denied for column %s" msgstr "немає дозволу Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ %s" -#: catalog/aclchk.c:3536 +#: catalog/aclchk.c:2729 #, c-format msgid "permission denied for conversion %s" msgstr "немає дозволу Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %s" -#: catalog/aclchk.c:3539 +#: catalog/aclchk.c:2732 #, c-format msgid "permission denied for database %s" msgstr "немає доÑтупу Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних %s" -#: catalog/aclchk.c:3542 +#: catalog/aclchk.c:2735 #, c-format msgid "permission denied for domain %s" msgstr "немає дозволу Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ %s" -#: catalog/aclchk.c:3545 +#: catalog/aclchk.c:2738 #, c-format msgid "permission denied for event trigger %s" msgstr "немає дозволу Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ð° подій %s" -#: catalog/aclchk.c:3548 +#: catalog/aclchk.c:2741 #, c-format msgid "permission denied for extension %s" msgstr "немає дозволу Ð´Ð»Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ %s" -#: catalog/aclchk.c:3551 +#: catalog/aclchk.c:2744 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "немає дозволу Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° Ñторонніх даних %s" -#: catalog/aclchk.c:3554 +#: catalog/aclchk.c:2747 #, c-format msgid "permission denied for foreign server %s" msgstr "немає дозволу Ð´Ð»Ñ Ñтороннього Ñерверу %s" -#: catalog/aclchk.c:3557 +#: catalog/aclchk.c:2750 #, c-format msgid "permission denied for foreign table %s" msgstr "немає дозволу Ð´Ð»Ñ Ñторонньої таблиці %s" -#: catalog/aclchk.c:3560 +#: catalog/aclchk.c:2753 #, c-format msgid "permission denied for function %s" msgstr "немає дозволу Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— %s" -#: catalog/aclchk.c:3563 +#: catalog/aclchk.c:2756 #, c-format msgid "permission denied for index %s" msgstr "немає дозволу Ð´Ð»Ñ Ñ–Ð½Ð´ÐµÐºÑу %s" -#: catalog/aclchk.c:3566 +#: catalog/aclchk.c:2759 #, c-format msgid "permission denied for language %s" msgstr "немає дозволу Ð´Ð»Ñ Ð¼Ð¾Ð²Ð¸ %s" -#: catalog/aclchk.c:3569 +#: catalog/aclchk.c:2762 #, c-format msgid "permission denied for large object %s" msgstr "немає дозволу Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об'єкту %s" -#: catalog/aclchk.c:3572 +#: catalog/aclchk.c:2765 #, c-format msgid "permission denied for materialized view %s" msgstr "немає дозволу Ð´Ð»Ñ Ð¼Ð°Ñ‚ÐµÑ€Ñ–Ð°Ð»Ñ–Ð·Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ %s" -#: catalog/aclchk.c:3575 +#: catalog/aclchk.c:2768 #, c-format msgid "permission denied for operator class %s" msgstr "немає дозволу Ð´Ð»Ñ ÐºÐ»Ð°Ñу операторів %s" -#: catalog/aclchk.c:3578 +#: catalog/aclchk.c:2771 #, c-format msgid "permission denied for operator %s" msgstr "немає дозволу Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° %s" -#: catalog/aclchk.c:3581 +#: catalog/aclchk.c:2774 #, c-format msgid "permission denied for operator family %s" msgstr "немає дозволу Ð´Ð»Ñ ÑімейÑтва операторів %s" -#: catalog/aclchk.c:3584 +#: catalog/aclchk.c:2777 #, c-format msgid "permission denied for parameter %s" msgstr "дозвіл відхилено Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ %s" -#: catalog/aclchk.c:3587 +#: catalog/aclchk.c:2780 #, c-format msgid "permission denied for policy %s" msgstr "немає дозволу Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸ %s" -#: catalog/aclchk.c:3590 +#: catalog/aclchk.c:2783 #, c-format msgid "permission denied for procedure %s" msgstr "немає дозволу Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸ %s" -#: catalog/aclchk.c:3593 +#: catalog/aclchk.c:2786 #, c-format msgid "permission denied for publication %s" msgstr "немає дозволу Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— %s" -#: catalog/aclchk.c:3596 +#: catalog/aclchk.c:2789 #, c-format msgid "permission denied for routine %s" msgstr "немає дозволу Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ %s" -#: catalog/aclchk.c:3599 +#: catalog/aclchk.c:2792 #, c-format msgid "permission denied for schema %s" msgstr "немає дозволу Ð´Ð»Ñ Ñхеми %s" -#: catalog/aclchk.c:3602 commands/sequence.c:660 commands/sequence.c:886 -#: commands/sequence.c:928 commands/sequence.c:969 commands/sequence.c:1761 -#: commands/sequence.c:1825 +#: catalog/aclchk.c:2795 commands/sequence.c:654 commands/sequence.c:880 +#: commands/sequence.c:922 commands/sequence.c:963 commands/sequence.c:1753 +#: commands/sequence.c:1799 #, c-format msgid "permission denied for sequence %s" msgstr "немає дозволу Ð´Ð»Ñ Ð¿Ð¾ÑлідовноÑті %s" -#: catalog/aclchk.c:3605 +#: catalog/aclchk.c:2798 #, c-format msgid "permission denied for statistics object %s" msgstr "немає дозволу Ð´Ð»Ñ Ð¾Ð±'єкту ÑтатиÑтики %s" -#: catalog/aclchk.c:3608 +#: catalog/aclchk.c:2801 #, c-format msgid "permission denied for subscription %s" msgstr "немає дозволу Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки %s" -#: catalog/aclchk.c:3611 +#: catalog/aclchk.c:2804 #, c-format msgid "permission denied for table %s" msgstr "немає дозволу Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– %s" -#: catalog/aclchk.c:3614 +#: catalog/aclchk.c:2807 #, c-format msgid "permission denied for tablespace %s" msgstr "немає дозволу Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору %s" -#: catalog/aclchk.c:3617 +#: catalog/aclchk.c:2810 #, c-format msgid "permission denied for text search configuration %s" msgstr "немає дозволу Ð´Ð»Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— текÑтового пошуку %s" -#: catalog/aclchk.c:3620 +#: catalog/aclchk.c:2813 #, c-format msgid "permission denied for text search dictionary %s" msgstr "немає дозволу Ð´Ð»Ñ Ñловника текÑтового пошуку %s" -#: catalog/aclchk.c:3623 +#: catalog/aclchk.c:2816 #, c-format msgid "permission denied for type %s" msgstr "немає дозволу Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" -#: catalog/aclchk.c:3626 +#: catalog/aclchk.c:2819 #, c-format msgid "permission denied for view %s" msgstr "немає дозволу Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ %s" -#: catalog/aclchk.c:3662 +#: catalog/aclchk.c:2855 #, c-format msgid "must be owner of aggregate %s" msgstr "треба бути влаÑником агрегату %s" -#: catalog/aclchk.c:3665 +#: catalog/aclchk.c:2858 #, c-format msgid "must be owner of collation %s" msgstr "треба бути влаÑником правил ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ %s" -#: catalog/aclchk.c:3668 +#: catalog/aclchk.c:2861 #, c-format msgid "must be owner of conversion %s" msgstr "треба бути влаÑником Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %s" -#: catalog/aclchk.c:3671 +#: catalog/aclchk.c:2864 #, c-format msgid "must be owner of database %s" msgstr "треба бути влаÑником бази даних %s" -#: catalog/aclchk.c:3674 +#: catalog/aclchk.c:2867 #, c-format msgid "must be owner of domain %s" msgstr "треба бути влаÑником домену %s" -#: catalog/aclchk.c:3677 +#: catalog/aclchk.c:2870 #, c-format msgid "must be owner of event trigger %s" msgstr "треба бути влаÑником тригеру подій %s" -#: catalog/aclchk.c:3680 +#: catalog/aclchk.c:2873 #, c-format msgid "must be owner of extension %s" msgstr "треба бути влаÑником Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ %s" -#: catalog/aclchk.c:3683 +#: catalog/aclchk.c:2876 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "треба бути влаÑником джерела Ñторонніх даних %s" -#: catalog/aclchk.c:3686 +#: catalog/aclchk.c:2879 #, c-format msgid "must be owner of foreign server %s" msgstr "треба бути влаÑником Ñтороннього Ñерверу %s" -#: catalog/aclchk.c:3689 +#: catalog/aclchk.c:2882 #, c-format msgid "must be owner of foreign table %s" msgstr "треба бути влаÑником Ñторонньої таблиці %s" -#: catalog/aclchk.c:3692 +#: catalog/aclchk.c:2885 #, c-format msgid "must be owner of function %s" msgstr "треба бути влаÑником функції %s" -#: catalog/aclchk.c:3695 +#: catalog/aclchk.c:2888 #, c-format msgid "must be owner of index %s" msgstr "треба бути влаÑником індекÑу %s" -#: catalog/aclchk.c:3698 +#: catalog/aclchk.c:2891 #, c-format msgid "must be owner of language %s" msgstr "треба бути влаÑником мови %s" -#: catalog/aclchk.c:3701 +#: catalog/aclchk.c:2894 #, c-format msgid "must be owner of large object %s" msgstr "треба бути влаÑником великого об'єкту %s" -#: catalog/aclchk.c:3704 +#: catalog/aclchk.c:2897 #, c-format msgid "must be owner of materialized view %s" msgstr "треба бути влаÑником матеріалізованого Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ %s" -#: catalog/aclchk.c:3707 +#: catalog/aclchk.c:2900 #, c-format msgid "must be owner of operator class %s" msgstr "треба бути влаÑником клаÑу операторів %s" -#: catalog/aclchk.c:3710 +#: catalog/aclchk.c:2903 #, c-format msgid "must be owner of operator %s" msgstr "треба бути влаÑником оператора %s" -#: catalog/aclchk.c:3713 +#: catalog/aclchk.c:2906 #, c-format msgid "must be owner of operator family %s" msgstr "треба бути влаÑником ÑімейÑтва операторів %s" -#: catalog/aclchk.c:3716 +#: catalog/aclchk.c:2909 #, c-format msgid "must be owner of procedure %s" msgstr "треба бути влаÑником процедури %s" -#: catalog/aclchk.c:3719 +#: catalog/aclchk.c:2912 #, c-format msgid "must be owner of publication %s" msgstr "треба бути влаÑником публікації %s" -#: catalog/aclchk.c:3722 +#: catalog/aclchk.c:2915 #, c-format msgid "must be owner of routine %s" msgstr "треба бути влаÑником підпрограми %s" -#: catalog/aclchk.c:3725 +#: catalog/aclchk.c:2918 #, c-format msgid "must be owner of sequence %s" msgstr "треба бути влаÑником поÑлідовноÑті %s" -#: catalog/aclchk.c:3728 +#: catalog/aclchk.c:2921 #, c-format msgid "must be owner of subscription %s" msgstr "треба бути влаÑником підпиÑки %s" -#: catalog/aclchk.c:3731 +#: catalog/aclchk.c:2924 #, c-format msgid "must be owner of table %s" msgstr "треба бути влаÑником таблиці %s" -#: catalog/aclchk.c:3734 +#: catalog/aclchk.c:2927 #, c-format msgid "must be owner of type %s" msgstr "треба бути влаÑником типу %s" -#: catalog/aclchk.c:3737 +#: catalog/aclchk.c:2930 #, c-format msgid "must be owner of view %s" msgstr "треба бути влаÑником Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ %s" -#: catalog/aclchk.c:3740 +#: catalog/aclchk.c:2933 #, c-format msgid "must be owner of schema %s" msgstr "треба бути влаÑником Ñхеми %s" -#: catalog/aclchk.c:3743 +#: catalog/aclchk.c:2936 #, c-format msgid "must be owner of statistics object %s" msgstr "треба бути влаÑником об'єкту ÑтатиÑтики %s" -#: catalog/aclchk.c:3746 +#: catalog/aclchk.c:2939 #, c-format msgid "must be owner of tablespace %s" msgstr "треба бути влаÑником табличного проÑтору %s" -#: catalog/aclchk.c:3749 +#: catalog/aclchk.c:2942 #, c-format msgid "must be owner of text search configuration %s" msgstr "треба бути влаÑником конфігурації текÑтового пошуку %s" -#: catalog/aclchk.c:3752 +#: catalog/aclchk.c:2945 #, c-format msgid "must be owner of text search dictionary %s" msgstr "треба бути влаÑником Ñловника текÑтового пошуку %s" -#: catalog/aclchk.c:3766 +#: catalog/aclchk.c:2959 #, c-format msgid "must be owner of relation %s" msgstr "треба бути влаÑником Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %s" -#: catalog/aclchk.c:3812 +#: catalog/aclchk.c:3005 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "немає дозволу Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: catalog/aclchk.c:3957 catalog/aclchk.c:3976 +#: catalog/aclchk.c:3162 catalog/aclchk.c:4170 catalog/aclchk.c:4201 +#, c-format +msgid "%s with OID %u does not exist" +msgstr "%s з OID %u не Ñ–Ñнує" + +#: catalog/aclchk.c:3245 catalog/aclchk.c:3264 #, c-format msgid "attribute %d of relation with OID %u does not exist" msgstr "атрибут %d Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· OID %u не Ñ–Ñнує" -#: catalog/aclchk.c:4071 catalog/aclchk.c:5184 +#: catalog/aclchk.c:3302 catalog/aclchk.c:3365 catalog/aclchk.c:4004 #, c-format msgid "relation with OID %u does not exist" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· OID %u не Ñ–Ñнує" -#: catalog/aclchk.c:4184 catalog/aclchk.c:5602 commands/dbcommands.c:2585 -#, c-format -msgid "database with OID %u does not exist" -msgstr "база даних з OID %u не Ñ–Ñнує" - -#: catalog/aclchk.c:4299 +#: catalog/aclchk.c:3550 #, c-format msgid "parameter ACL with OID %u does not exist" msgstr "параметр ACL з OID %u не Ñ–Ñнує" -#: catalog/aclchk.c:4353 catalog/aclchk.c:5262 tcop/fastpath.c:141 -#: utils/fmgr/fmgr.c:2037 -#, c-format -msgid "function with OID %u does not exist" -msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð· OID %u не Ñ–Ñнує" - -#: catalog/aclchk.c:4407 catalog/aclchk.c:5288 -#, c-format -msgid "language with OID %u does not exist" -msgstr "мова з OID %u не Ñ–Ñнує" - -#: catalog/aclchk.c:4571 catalog/aclchk.c:5360 commands/collationcmds.c:595 -#: commands/publicationcmds.c:1794 +#: catalog/aclchk.c:3723 commands/collationcmds.c:853 +#: commands/publicationcmds.c:1739 #, c-format msgid "schema with OID %u does not exist" msgstr "Ñхема з OID %u не Ñ–Ñнує" -#: catalog/aclchk.c:4635 catalog/aclchk.c:5387 utils/adt/genfile.c:632 -#, c-format -msgid "tablespace with OID %u does not exist" -msgstr "табличний проÑтір з OID %u не Ñ–Ñнує" - -#: catalog/aclchk.c:4694 catalog/aclchk.c:5521 commands/foreigncmds.c:325 -#, c-format -msgid "foreign-data wrapper with OID %u does not exist" -msgstr "джерело Ñторонніх даних з OID %u не Ñ–Ñнує" - -#: catalog/aclchk.c:4756 catalog/aclchk.c:5548 commands/foreigncmds.c:462 -#, c-format -msgid "foreign server with OID %u does not exist" -msgstr "Ñтороннього Ñерверу з OID %u не уÑніє" - -#: catalog/aclchk.c:4816 catalog/aclchk.c:5210 utils/cache/typcache.c:385 -#: utils/cache/typcache.c:440 +#: catalog/aclchk.c:3797 catalog/aclchk.c:3824 catalog/aclchk.c:3853 +#: utils/cache/typcache.c:392 utils/cache/typcache.c:447 #, c-format msgid "type with OID %u does not exist" msgstr "тип з OID %u не Ñ–Ñнує" -#: catalog/aclchk.c:5236 -#, c-format -msgid "operator with OID %u does not exist" -msgstr "оператора з OID %u не Ñ–Ñнує" - -#: catalog/aclchk.c:5413 -#, c-format -msgid "operator class with OID %u does not exist" -msgstr "клаÑу операторів з OID %u не Ñ–Ñнує" - -#: catalog/aclchk.c:5440 -#, c-format -msgid "operator family with OID %u does not exist" -msgstr "ÑімейÑтва операторів з OID %u не Ñ–Ñнує" - -#: catalog/aclchk.c:5467 -#, c-format -msgid "text search dictionary with OID %u does not exist" -msgstr "Ñловник текÑтового пошуку з OID %u не Ñ–Ñнує" - -#: catalog/aclchk.c:5494 -#, c-format -msgid "text search configuration with OID %u does not exist" -msgstr "ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐºÑтового пошуку %u з OID не Ñ–Ñнує" - -#: catalog/aclchk.c:5575 commands/event_trigger.c:453 -#, c-format -msgid "event trigger with OID %u does not exist" -msgstr "тригер подій %u з OID не Ñ–Ñнує" - -#: catalog/aclchk.c:5628 commands/collationcmds.c:439 -#, c-format -msgid "collation with OID %u does not exist" -msgstr "порÑдку ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ %u з OID не Ñ–Ñнує" - -#: catalog/aclchk.c:5654 -#, c-format -msgid "conversion with OID %u does not exist" -msgstr "Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %u з OID не Ñ–Ñнує" - -#: catalog/aclchk.c:5695 -#, c-format -msgid "extension with OID %u does not exist" -msgstr "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ %u з OID не Ñ–Ñнує" - -#: catalog/aclchk.c:5722 commands/publicationcmds.c:2048 -#, c-format -msgid "publication with OID %u does not exist" -msgstr "публікації %u з OID не Ñ–Ñнує" - -#: catalog/aclchk.c:5748 commands/subscriptioncmds.c:1739 -#, c-format -msgid "subscription with OID %u does not exist" -msgstr "підпиÑки %u з OID не Ñ–Ñнує" - -#: catalog/aclchk.c:5774 -#, c-format -msgid "statistics object with OID %u does not exist" -msgstr "об'єкту ÑтатиÑтики %u з OID не Ñ–Ñнує" - -#: catalog/catalog.c:447 +#: catalog/catalog.c:477 #, c-format msgid "still searching for an unused OID in relation \"%s\"" msgstr "вÑе ще шукаю невикориÑтаний OID у відношенні \"%s\"" -#: catalog/catalog.c:449 +#: catalog/catalog.c:479 #, c-format msgid "OID candidates have been checked %llu time, but no unused OID has been found yet." msgid_plural "OID candidates have been checked %llu times, but no unused OID has been found yet." @@ -4324,7 +4687,7 @@ msgstr[1] "OID кандидати буле перевірені %llu рази, msgstr[2] "OID кандидати буле перевірені %llu разів, але невикориÑтаного OID вÑе ще не знайдено." msgstr[3] "OID кандидати буле перевірені %llu разів, але невикориÑтаного OID вÑе ще не знайдено." -#: catalog/catalog.c:474 +#: catalog/catalog.c:504 #, c-format msgid "new OID has been assigned in relation \"%s\" after %llu retry" msgid_plural "new OID has been assigned in relation \"%s\" after %llu retries" @@ -4333,108 +4696,101 @@ msgstr[1] "новий OID було призначено у відношенні msgstr[2] "новий OID було призначено у відношенні \"%s\" піÑÐ»Ñ %llu повторних Ñпроб" msgstr[3] "новий OID було призначено у відношенні \"%s\" піÑÐ»Ñ %llu повторних Ñпроб" -#: catalog/catalog.c:605 catalog/catalog.c:672 +#: catalog/catalog.c:637 catalog/catalog.c:704 #, c-format msgid "must be superuser to call %s()" msgstr "Ð´Ð»Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ %s() потрібно бути ÑуперкориÑтувачем" -#: catalog/catalog.c:614 +#: catalog/catalog.c:646 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() можна викориÑтовувати лише Ð´Ð»Ñ ÑиÑтемних каталогів" -#: catalog/catalog.c:619 parser/parse_utilcmd.c:2279 +#: catalog/catalog.c:651 parser/parse_utilcmd.c:2270 #, c-format msgid "index \"%s\" does not belong to table \"%s\"" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" не належить таблиці \"%s\"" -#: catalog/catalog.c:636 +#: catalog/catalog.c:668 #, c-format msgid "column \"%s\" is not of type oid" msgstr "Ñтовпець \"%s\" повинен мати тип oid" -#: catalog/catalog.c:643 +#: catalog/catalog.c:675 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" не Ñ” індекÑом Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: catalog/dependency.c:538 catalog/pg_shdepend.c:657 +#: catalog/dependency.c:497 catalog/pg_shdepend.c:703 #, c-format msgid "cannot drop %s because it is required by the database system" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ %s, оÑкільки він потрібний ÑиÑтемі бази даних" -#: catalog/dependency.c:830 catalog/dependency.c:1057 +#: catalog/dependency.c:789 catalog/dependency.c:1016 #, c-format msgid "cannot drop %s because %s requires it" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ %s, оÑкільки %s потребує його" -#: catalog/dependency.c:832 catalog/dependency.c:1059 +#: catalog/dependency.c:791 catalog/dependency.c:1018 #, c-format msgid "You can drop %s instead." msgstr "Ви можете видалити %s заміÑть цього." -#: catalog/dependency.c:1138 catalog/dependency.c:1147 +#: catalog/dependency.c:1097 catalog/dependency.c:1106 #, c-format msgid "%s depends on %s" msgstr "%s залежить від %s" -#: catalog/dependency.c:1162 catalog/dependency.c:1171 +#: catalog/dependency.c:1121 catalog/dependency.c:1130 #, c-format msgid "drop cascades to %s" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾ÑˆÐ¸Ñ€ÑŽÑ”Ñ‚ÑŒÑÑ (cascades) на об'єкт %s" -#: catalog/dependency.c:1179 catalog/pg_shdepend.c:822 +#: catalog/dependency.c:1138 catalog/pg_shdepend.c:868 #, c-format -msgid "" -"\n" +msgid "\n" "and %d other object (see server log for list)" -msgid_plural "" -"\n" +msgid_plural "\n" "and %d other objects (see server log for list)" -msgstr[0] "" -"\n" +msgstr[0] "\n" "Ñ– ще %d інших об'єктів (див. ÑпиÑок у протоколі Ñерверу)" -msgstr[1] "" -"\n" +msgstr[1] "\n" "Ñ– ще %d інші об'єкти (див. ÑпиÑок у протоколі Ñерверу)" -msgstr[2] "" -"\n" +msgstr[2] "\n" +"Ñ– ще %d інших об'єктів (див. ÑпиÑок у протоколі Ñерверу)" +msgstr[3] "\n" "Ñ– ще %d інших об'єктів (див. ÑпиÑок у протоколі Ñерверу)" -msgstr[3] "" -"\n" -"Ñ– ще %d інші об'єкти (див. ÑпиÑок у протоколі Ñервера)" -#: catalog/dependency.c:1191 +#: catalog/dependency.c:1150 #, c-format msgid "cannot drop %s because other objects depend on it" msgstr "неможливо видалити %s, тому що від нього залежать інші об'єкти" -#: catalog/dependency.c:1193 catalog/dependency.c:1194 -#: catalog/dependency.c:1200 catalog/dependency.c:1201 -#: catalog/dependency.c:1211 catalog/dependency.c:1212 -#: commands/publicationcmds.c:632 commands/tablecmds.c:1328 -#: commands/tablecmds.c:14270 commands/tablespace.c:476 commands/user.c:1008 -#: commands/view.c:522 libpq/auth.c:329 replication/syncrep.c:1043 -#: storage/lmgr/deadlock.c:1152 storage/lmgr/proc.c:1409 utils/adt/acl.c:5333 -#: utils/adt/jsonfuncs.c:618 utils/adt/jsonfuncs.c:624 utils/misc/guc.c:7412 -#: utils/misc/guc.c:7448 utils/misc/guc.c:7518 utils/misc/guc.c:11874 -#: utils/misc/guc.c:11908 utils/misc/guc.c:11942 utils/misc/guc.c:11985 -#: utils/misc/guc.c:12027 +#: catalog/dependency.c:1153 catalog/dependency.c:1160 +#: catalog/dependency.c:1171 commands/tablecmds.c:1459 +#: commands/tablecmds.c:15119 commands/tablespace.c:460 commands/user.c:1302 +#: commands/vacuum.c:211 commands/view.c:441 executor/execExprInterp.c:4655 +#: executor/execExprInterp.c:4663 libpq/auth.c:324 +#: replication/logical/applyparallelworker.c:1041 replication/syncrep.c:1011 +#: storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1432 utils/misc/guc.c:3169 +#: utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6825 +#: utils/misc/guc.c:6859 utils/misc/guc.c:6893 utils/misc/guc.c:6936 +#: utils/misc/guc.c:6978 #, c-format msgid "%s" msgstr "%s" -#: catalog/dependency.c:1195 catalog/dependency.c:1202 +#: catalog/dependency.c:1154 catalog/dependency.c:1161 #, c-format msgid "Use DROP ... CASCADE to drop the dependent objects too." msgstr "ВикориÑтайте DROP ... CASCADE Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð»ÐµÐ¶Ð½Ð¸Ñ… об'єктів також." -#: catalog/dependency.c:1199 +#: catalog/dependency.c:1158 #, c-format msgid "cannot drop desired object(s) because other objects depend on them" msgstr "не можна видалити бажаний(-Ñ–) об'єкт(-и) тому, що інші об'єкти залежні від нього(них)" -#: catalog/dependency.c:1207 +#: catalog/dependency.c:1166 #, c-format msgid "drop cascades to %d other object" msgid_plural "drop cascades to %d other objects" @@ -4443,662 +4799,679 @@ msgstr[1] "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾ÑˆÐ¸Ñ€ÑŽÑ”Ñ‚ÑŒÑÑ (cascades) на ще %d Ñ– msgstr[2] "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾ÑˆÐ¸Ñ€ÑŽÑ”Ñ‚ÑŒÑÑ (cascades) на ще %d інших об'єктів" msgstr[3] "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾ÑˆÐ¸Ñ€ÑŽÑ”Ñ‚ÑŒÑÑ (cascades) на ще %d інших об'єктів" -#: catalog/dependency.c:1889 +#: catalog/dependency.c:1850 #, c-format msgid "constant of the type %s cannot be used here" msgstr "конÑтанта типу %s не може бути викориÑтана тут" -#: catalog/dependency.c:2410 parser/parse_relation.c:3370 -#: parser/parse_relation.c:3380 +#: catalog/dependency.c:2375 parser/parse_relation.c:3407 +#: parser/parse_relation.c:3417 #, c-format msgid "column %d of relation \"%s\" does not exist" msgstr "Ñтовпець %d Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: catalog/heap.c:324 +#: catalog/heap.c:326 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "немає дозволу Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ \"%s.%s\"" -#: catalog/heap.c:326 +#: catalog/heap.c:328 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Ð—Ð¼Ñ–Ð½ÐµÐ½Ð½Ñ ÑиÑтемного каталогу наразі заборонено." -#: catalog/heap.c:463 commands/tablecmds.c:2348 commands/tablecmds.c:2985 -#: commands/tablecmds.c:6821 +#: catalog/heap.c:468 commands/tablecmds.c:2495 commands/tablecmds.c:2917 +#: commands/tablecmds.c:7163 #, c-format msgid "tables can have at most %d columns" msgstr "таблиці можуть міÑтити макÑимум %d Ñтовпців" -#: catalog/heap.c:481 commands/tablecmds.c:7121 +#: catalog/heap.c:486 commands/tablecmds.c:7463 #, c-format msgid "column name \"%s\" conflicts with a system column name" msgstr "ім'Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" конфліктує з ÑиÑтемним іменем ÑтовпцÑ" -#: catalog/heap.c:497 +#: catalog/heap.c:502 #, c-format msgid "column name \"%s\" specified more than once" msgstr "ім'Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" вказано кілька разів" #. translator: first %s is an integer not a name -#: catalog/heap.c:572 +#: catalog/heap.c:580 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "Ñтовпець ключа ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ %s має пÑевдотип %s" -#: catalog/heap.c:577 +#: catalog/heap.c:585 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "Ñтовпець \"%s\" має пÑевдо-тип %s" -#: catalog/heap.c:608 +#: catalog/heap.c:616 #, c-format msgid "composite type %s cannot be made a member of itself" msgstr "Ñкладений тип %s не може міÑтити Ñам Ñебе" #. translator: first %s is an integer not a name -#: catalog/heap.c:663 +#: catalog/heap.c:671 #, c-format msgid "no collation was derived for partition key column %s with collatable type %s" msgstr "Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ ÐºÐ»ÑŽÑ‡Ð° ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" з Ñортируючим типом %s не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ параметри ÑортуваннÑ" -#: catalog/heap.c:669 commands/createas.c:203 commands/createas.c:512 +#: catalog/heap.c:677 commands/createas.c:198 commands/createas.c:505 #, c-format msgid "no collation was derived for column \"%s\" with collatable type %s" msgstr "Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" із Ñортувальним типом %s не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ параметри ÑортуваннÑ" -#: catalog/heap.c:1145 catalog/index.c:874 commands/createas.c:408 -#: commands/tablecmds.c:3890 +#: catalog/heap.c:1162 catalog/index.c:899 commands/createas.c:401 +#: commands/tablecmds.c:4171 #, c-format msgid "relation \"%s\" already exists" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" вже Ñ–Ñнує" -#: catalog/heap.c:1161 catalog/pg_type.c:436 catalog/pg_type.c:784 -#: catalog/pg_type.c:931 commands/typecmds.c:249 commands/typecmds.c:261 -#: commands/typecmds.c:754 commands/typecmds.c:1169 commands/typecmds.c:1395 -#: commands/typecmds.c:1575 commands/typecmds.c:2547 +#: catalog/heap.c:1178 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: catalog/pg_type.c:977 commands/typecmds.c:253 commands/typecmds.c:265 +#: commands/typecmds.c:758 commands/typecmds.c:1179 commands/typecmds.c:1405 +#: commands/typecmds.c:1585 commands/typecmds.c:2556 #, c-format msgid "type \"%s\" already exists" msgstr "тип \"%s\" вже Ñ–Ñнує" -#: catalog/heap.c:1162 +#: catalog/heap.c:1179 #, c-format msgid "A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type." msgstr "З відношеннÑм вже пов'Ñзаний тип з таким Ñамим іменем, тому виберіть ім'Ñ, Ñке не буде конфліктувати з типами, що Ñ–Ñнують." -#: catalog/heap.c:1202 +#: catalog/heap.c:1219 #, c-format -msgid "toast relfilenode value not set when in binary upgrade mode" -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ toast relfilenode не вÑтановлено в режимі двійкового оновленнÑ" +msgid "toast relfilenumber value not set when in binary upgrade mode" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ toast relfilenumber не вÑтановлено в режимі двійкового оновленнÑ" -#: catalog/heap.c:1213 +#: catalog/heap.c:1230 #, c-format msgid "pg_class heap OID value not set when in binary upgrade mode" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ OID в pg_class не задано в режимі двійкового оновленнÑ" -#: catalog/heap.c:1223 +#: catalog/heap.c:1240 #, c-format -msgid "relfilenode value not set when in binary upgrade mode" -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ relfilenode не вÑтановлено в режимі двійкового оновленнÑ" +msgid "relfilenumber value not set when in binary upgrade mode" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ relfilenumber не вÑтановлено в режимі двійкового оновленнÑ" -#: catalog/heap.c:2127 +#: catalog/heap.c:2185 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "не можна додати Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ NO INHERIT до Ñекціонованої таблиці \"%s\"" -#: catalog/heap.c:2401 +#: catalog/heap.c:2452 #, c-format msgid "check constraint \"%s\" already exists" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ \"%s\" вже інÑує" -#: catalog/heap.c:2571 catalog/index.c:888 catalog/pg_constraint.c:689 -#: commands/tablecmds.c:8823 +#: catalog/heap.c:2624 catalog/index.c:913 catalog/pg_constraint.c:724 +#: commands/tablecmds.c:9387 #, c-format msgid "constraint \"%s\" for relation \"%s\" already exists" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" вже Ñ–Ñнує" -#: catalog/heap.c:2578 +#: catalog/heap.c:2631 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" конфліктує з неуÑпадкованим обмеженнÑм Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: catalog/heap.c:2589 +#: catalog/heap.c:2642 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" конфліктує з уÑпадкованим обмеженнÑм Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: catalog/heap.c:2599 +#: catalog/heap.c:2652 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" конфліктує з обмеженнÑм NOT VALID в відношенні \"%s\"" -#: catalog/heap.c:2604 +#: catalog/heap.c:2657 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" з уÑпадкованим визначеннÑм" -#: catalog/heap.c:2709 +#: catalog/heap.c:2683 catalog/pg_constraint.c:853 commands/tablecmds.c:3074 +#: commands/tablecmds.c:3377 commands/tablecmds.c:7089 +#: commands/tablecmds.c:15938 commands/tablecmds.c:16069 +#, c-format +msgid "too many inheritance parents" +msgstr "занадто багато батьків наÑлідуваннÑ" + +#: catalog/heap.c:2767 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" -msgstr "в виразі ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð½Ðµ можна викориÑтовувати згенерований Ñтовпець \"%s\" " +msgstr "в виразі ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð½Ðµ можна викориÑтовувати згенерований Ñтовпець \"%s\"" -#: catalog/heap.c:2711 +#: catalog/heap.c:2769 #, c-format msgid "A generated column cannot reference another generated column." msgstr "Згенерований Ñтовпець не може поÑилатиÑÑ Ð½Ð° інший згенерований Ñтовпець." -#: catalog/heap.c:2717 +#: catalog/heap.c:2775 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "у виразі ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñтовпців не можна викориÑтовувати змінну уÑього Ñ€Ñдка" -#: catalog/heap.c:2718 +#: catalog/heap.c:2776 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "Це призведе до того, що згенерований Ñтовпець буде залежати від влаÑного значеннÑ." -#: catalog/heap.c:2771 +#: catalog/heap.c:2831 #, c-format msgid "generation expression is not immutable" msgstr "вираз генерації не Ñ” незмінним" -#: catalog/heap.c:2799 rewrite/rewriteHandler.c:1268 +#: catalog/heap.c:2859 rewrite/rewriteHandler.c:1276 #, c-format msgid "column \"%s\" is of type %s but default expression is of type %s" msgstr "Ñтовпець \"%s\" має тип %s, але тип виразу за замовчуваннÑм %s" -#: catalog/heap.c:2804 commands/prepare.c:334 parser/analyze.c:2692 -#: parser/parse_target.c:594 parser/parse_target.c:882 -#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1273 +#: catalog/heap.c:2864 commands/prepare.c:331 parser/analyze.c:2758 +#: parser/parse_target.c:592 parser/parse_target.c:882 +#: parser/parse_target.c:892 rewrite/rewriteHandler.c:1281 #, c-format msgid "You will need to rewrite or cast the expression." msgstr "Потрібно буде перепиÑати або привеÑти вираз." -#: catalog/heap.c:2851 +#: catalog/heap.c:2911 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "в обмеженні-перевірці можна поÑилатиÑÑ Ð»Ð¸ÑˆÐµ на таблицю \"%s\"" -#: catalog/heap.c:3149 +#: catalog/heap.c:3217 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "непідтримуване Ð¿Ð¾Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ ключа з ON COMMIT" -#: catalog/heap.c:3150 +#: catalog/heap.c:3218 #, c-format msgid "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting." msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" поÑилаєтьÑÑ Ð½Ð° \"%s\", але вони не мають той же параметр ON COMMIT." -#: catalog/heap.c:3155 +#: catalog/heap.c:3223 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "Ñкоротити таблицю, на Ñку поÑилаєтьÑÑ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ð¹ ключ, не можливо" -#: catalog/heap.c:3156 +#: catalog/heap.c:3224 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" поÑилаєтьÑÑ Ð½Ð° \"%s\"." -#: catalog/heap.c:3158 +#: catalog/heap.c:3226 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Скоротіть таблицю \"%s\" паралельно або викориÑтайте TRUNCATE ... CASCADE." -#: catalog/index.c:223 parser/parse_utilcmd.c:2184 +#: catalog/index.c:219 parser/parse_utilcmd.c:2176 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" не може міÑтити кілька первинних ключів" -#: catalog/index.c:241 +#: catalog/index.c:233 +#, c-format +msgid "primary keys cannot use NULLS NOT DISTINCT indexes" +msgstr "первинні ключі не можуть викориÑтовувати NULLS NOT DISTINCT індекÑи" + +#: catalog/index.c:250 #, c-format msgid "primary keys cannot be expressions" msgstr "первинні ключі не можуть бути виразами" -#: catalog/index.c:258 +#: catalog/index.c:267 #, c-format msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "Ñтовпець первинного ключа \"%s\" не позначений Ñк NOT NULL" -#: catalog/index.c:773 catalog/index.c:1932 +#: catalog/index.c:798 catalog/index.c:1915 #, c-format msgid "user-defined indexes on system catalog tables are not supported" msgstr "кориÑтувацькі індекÑи в таблицÑÑ… ÑиÑтемного каталогу не підтримуютьÑÑ" -#: catalog/index.c:813 +#: catalog/index.c:838 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "недетерміновані правила ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ Ð´Ð»Ñ ÐºÐ»Ð°Ñу операторів \"%s\"" -#: catalog/index.c:828 +#: catalog/index.c:853 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "паралельне ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу в таблицÑÑ… ÑиÑтемного каталогу не підтримуєтьÑÑ" -#: catalog/index.c:837 catalog/index.c:1305 +#: catalog/index.c:862 catalog/index.c:1331 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "парарельне ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½ÑŒ-виключень не підтримуєтьÑÑ" -#: catalog/index.c:846 +#: catalog/index.c:871 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "не можливо Ñтворити Ñпільні індекÑи піÑÐ»Ñ initdb" -#: catalog/index.c:866 commands/createas.c:423 commands/sequence.c:158 -#: parser/parse_utilcmd.c:211 +#: catalog/index.c:891 commands/createas.c:416 commands/sequence.c:159 +#: parser/parse_utilcmd.c:209 #, c-format msgid "relation \"%s\" already exists, skipping" msgstr "Ð²Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" вже Ñ–Ñнує, пропуÑкаємо" -#: catalog/index.c:916 +#: catalog/index.c:941 #, c-format msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ OID індекÑа в pg_class не вÑтановлено в режимі двійкового оновленнÑ" -#: catalog/index.c:926 utils/cache/relcache.c:3722 +#: catalog/index.c:951 utils/cache/relcache.c:3791 #, c-format -msgid "index relfilenode value not set when in binary upgrade mode" -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу relfilenode не вÑтановлено в режимі двійкового оновленнÑ" +msgid "index relfilenumber value not set when in binary upgrade mode" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу relfilenumber не вÑтановлено в режимі двійкового оновленнÑ" -#: catalog/index.c:2231 +#: catalog/index.c:2214 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY повинен бути першою дією в транзакції" -#: catalog/index.c:3633 +#: catalog/index.c:3668 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "повторно індекÑувати тимчаÑові таблиці інших ÑеанÑів не можна" -#: catalog/index.c:3644 commands/indexcmds.c:3532 +#: catalog/index.c:3679 commands/indexcmds.c:3626 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "переіндекÑувати неприпуÑтимий Ñ–Ð½Ð´ÐµÐºÑ Ð² таблиці TOAST не можна" -#: catalog/index.c:3660 commands/indexcmds.c:3412 commands/indexcmds.c:3556 -#: commands/tablecmds.c:3305 +#: catalog/index.c:3695 commands/indexcmds.c:3504 commands/indexcmds.c:3650 +#: commands/tablecmds.c:3581 #, c-format msgid "cannot move system relation \"%s\"" msgstr "переміÑтити ÑиÑтемне Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не можна" -#: catalog/index.c:3804 +#: catalog/index.c:3832 #, c-format msgid "index \"%s\" was reindexed" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" був перебудований" -#: catalog/index.c:3941 +#: catalog/index.c:3998 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "переіндекÑувати неприпуÑтимий Ñ–Ð½Ð´ÐµÐºÑ \"%s.%s\" в таблиці TOAST не можна, пропуÑкаєтьÑÑ" -#: catalog/namespace.c:259 catalog/namespace.c:463 catalog/namespace.c:555 -#: commands/trigger.c:5711 +#: catalog/namespace.c:462 catalog/namespace.c:666 catalog/namespace.c:758 +#: commands/trigger.c:5729 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "cross-database поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ðµ реалізовані: \"%s.%s.%s\"" -#: catalog/namespace.c:316 +#: catalog/namespace.c:519 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñових таблиць ім'Ñ Ñхеми не вказуєтьÑÑ" -#: catalog/namespace.c:397 +#: catalog/namespace.c:600 #, c-format msgid "could not obtain lock on relation \"%s.%s\"" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð²'Ñзку \"%s.%s\"" -#: catalog/namespace.c:402 commands/lockcmds.c:144 commands/lockcmds.c:233 +#: catalog/namespace.c:605 commands/lockcmds.c:143 commands/lockcmds.c:223 #, c-format msgid "could not obtain lock on relation \"%s\"" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð²'Ñзку \"%s\"" -#: catalog/namespace.c:430 parser/parse_relation.c:1373 +#: catalog/namespace.c:633 parser/parse_relation.c:1430 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" не Ñ–Ñнує" -#: catalog/namespace.c:435 parser/parse_relation.c:1386 -#: parser/parse_relation.c:1394 +#: catalog/namespace.c:638 parser/parse_relation.c:1443 +#: parser/parse_relation.c:1451 utils/adt/regproc.c:913 #, c-format msgid "relation \"%s\" does not exist" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: catalog/namespace.c:501 catalog/namespace.c:3076 commands/extension.c:1535 -#: commands/extension.c:1541 +#: catalog/namespace.c:704 catalog/namespace.c:3522 commands/extension.c:1607 +#: commands/extension.c:1613 #, c-format msgid "no schema has been selected to create in" msgstr "не вибрано Ñхему Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±'єктів" -#: catalog/namespace.c:653 catalog/namespace.c:666 +#: catalog/namespace.c:856 catalog/namespace.c:869 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "неможливо Ñтворити Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð² тимчаÑових Ñхемах з інших ÑеанÑів" -#: catalog/namespace.c:657 +#: catalog/namespace.c:860 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "неможливо Ñтворити тимчаÑове Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð² не тимчаÑовій Ñхемі" -#: catalog/namespace.c:672 +#: catalog/namespace.c:875 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "в тимчаÑових Ñхемах можуть бути Ñтворені тільки тимчаÑові відношеннÑ" -#: catalog/namespace.c:2268 +#: catalog/namespace.c:2619 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "об'єкт ÑтатиÑтики \"%s\" не Ñ–Ñнує" -#: catalog/namespace.c:2391 +#: catalog/namespace.c:2761 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "парÑер текÑтового пошуку \"%s\" не Ñ–Ñнує" -#: catalog/namespace.c:2517 +#: catalog/namespace.c:2906 utils/adt/regproc.c:1459 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "Ñловник текÑтового пошуку \"%s\" не Ñ–Ñнує" -#: catalog/namespace.c:2644 +#: catalog/namespace.c:3052 #, c-format msgid "text search template \"%s\" does not exist" msgstr "шаблон текÑтового пошуку \"%s\" не Ñ–Ñнує" -#: catalog/namespace.c:2770 commands/tsearchcmds.c:1121 -#: utils/cache/ts_cache.c:613 +#: catalog/namespace.c:3197 commands/tsearchcmds.c:1168 +#: utils/adt/regproc.c:1349 utils/cache/ts_cache.c:635 #, c-format msgid "text search configuration \"%s\" does not exist" msgstr "ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐºÑтового пошуку \"%s\" не Ñ–Ñнує" -#: catalog/namespace.c:2883 parser/parse_expr.c:868 parser/parse_target.c:1255 +#: catalog/namespace.c:3329 parser/parse_expr.c:868 parser/parse_target.c:1259 #, c-format msgid "cross-database references are not implemented: %s" msgstr "міжбазові поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ðµ реалізовані: %s" -#: catalog/namespace.c:2889 parser/parse_expr.c:875 parser/parse_target.c:1262 -#: gram.y:19330 gram.y:19370 +#: catalog/namespace.c:3335 parser/parse_expr.c:875 parser/parse_target.c:1266 +#: gram.y:19181 gram.y:19221 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неправильне повне ім'Ñ (забагато компонентів): %s" -#: catalog/namespace.c:3019 +#: catalog/namespace.c:3465 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "не можна переміщати об'єкти в або з тимчаÑових Ñхем" -#: catalog/namespace.c:3025 +#: catalog/namespace.c:3471 #, c-format msgid "cannot move objects into or out of TOAST schema" msgstr "не можна переміщати об'єкти в або з Ñхем TOAST" -#: catalog/namespace.c:3098 commands/schemacmds.c:245 commands/schemacmds.c:325 -#: commands/tablecmds.c:1273 +#: catalog/namespace.c:3544 commands/schemacmds.c:264 commands/schemacmds.c:344 +#: commands/tablecmds.c:1404 utils/adt/regproc.c:1688 #, c-format msgid "schema \"%s\" does not exist" msgstr "Ñхема \"%s\" не Ñ–Ñнує" -#: catalog/namespace.c:3129 +#: catalog/namespace.c:3575 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "неправильне ім'Ñ Ð·Ð²'Ñзку (забагато компонентів): %s" -#: catalog/namespace.c:3692 +#: catalog/namespace.c:4016 utils/adt/regproc.c:1056 #, c-format msgid "collation \"%s\" for encoding \"%s\" does not exist" msgstr "правило ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" Ð´Ð»Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: catalog/namespace.c:3747 +#: catalog/namespace.c:4071 #, c-format msgid "conversion \"%s\" does not exist" msgstr "перетвореннÑ\"%s\" не Ñ–Ñнує" -#: catalog/namespace.c:4011 +#: catalog/namespace.c:4412 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "немає дозволу Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñових таблиць в базі даних \"%s\"" -#: catalog/namespace.c:4027 +#: catalog/namespace.c:4428 #, c-format msgid "cannot create temporary tables during recovery" msgstr "не можна Ñтворити тимчаÑові таблиці під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ" -#: catalog/namespace.c:4033 +#: catalog/namespace.c:4434 #, c-format msgid "cannot create temporary tables during a parallel operation" msgstr "не можна Ñтворити тимчаÑові таблиці під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ñ— операції" -#: catalog/namespace.c:4334 commands/tablespace.c:1236 commands/variable.c:64 -#: utils/misc/guc.c:12059 utils/misc/guc.c:12161 -#, c-format -msgid "List syntax is invalid." -msgstr "Помилка ÑинтакÑиÑу у ÑпиÑку." - -#: catalog/objectaddress.c:1391 commands/policy.c:96 commands/policy.c:376 -#: commands/tablecmds.c:247 commands/tablecmds.c:289 commands/tablecmds.c:2184 -#: commands/tablecmds.c:12240 +#: catalog/objectaddress.c:1371 commands/policy.c:93 commands/policy.c:373 +#: commands/tablecmds.c:257 commands/tablecmds.c:299 commands/tablecmds.c:2327 +#: commands/tablecmds.c:12956 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" не Ñ” таблицею" -#: catalog/objectaddress.c:1398 commands/tablecmds.c:259 -#: commands/tablecmds.c:17112 commands/view.c:119 +#: catalog/objectaddress.c:1378 commands/tablecmds.c:269 +#: commands/tablecmds.c:17882 commands/view.c:114 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" не Ñ” поданнÑм" -#: catalog/objectaddress.c:1405 commands/matview.c:186 commands/tablecmds.c:265 -#: commands/tablecmds.c:17117 +#: catalog/objectaddress.c:1385 commands/matview.c:199 commands/tablecmds.c:275 +#: commands/tablecmds.c:17887 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" не Ñ” матеріалізованим поданнÑм" -#: catalog/objectaddress.c:1412 commands/tablecmds.c:283 -#: commands/tablecmds.c:17122 +#: catalog/objectaddress.c:1392 commands/tablecmds.c:293 +#: commands/tablecmds.c:17892 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" не Ñ” Ñторонньою таблицею" -#: catalog/objectaddress.c:1453 +#: catalog/objectaddress.c:1433 #, c-format msgid "must specify relation and object name" msgstr "треба вказати Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð¹ ім'Ñ Ð¾Ð±'єкта" -#: catalog/objectaddress.c:1529 catalog/objectaddress.c:1582 +#: catalog/objectaddress.c:1509 catalog/objectaddress.c:1562 #, c-format msgid "column name must be qualified" msgstr "Ñлід вказати ім'Ñ ÑтовпцÑ" -#: catalog/objectaddress.c:1601 +#: catalog/objectaddress.c:1581 #, c-format msgid "default value for column \"%s\" of relation \"%s\" does not exist" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: catalog/objectaddress.c:1638 commands/functioncmds.c:138 -#: commands/tablecmds.c:275 commands/typecmds.c:274 commands/typecmds.c:3700 -#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:795 -#: utils/adt/acl.c:4434 +#: catalog/objectaddress.c:1618 commands/functioncmds.c:132 +#: commands/tablecmds.c:285 commands/typecmds.c:278 commands/typecmds.c:3843 +#: parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 +#: utils/adt/acl.c:4560 #, c-format msgid "type \"%s\" does not exist" msgstr "тип \"%s\" не Ñ–Ñнує" -#: catalog/objectaddress.c:1757 +#: catalog/objectaddress.c:1737 #, c-format msgid "operator %d (%s, %s) of %s does not exist" msgstr "оператор %d (%s, %s) з %s не Ñ–Ñнує" -#: catalog/objectaddress.c:1788 +#: catalog/objectaddress.c:1768 #, c-format msgid "function %d (%s, %s) of %s does not exist" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %d (%s, %s) з %s не Ñ–Ñнує" -#: catalog/objectaddress.c:1839 catalog/objectaddress.c:1865 +#: catalog/objectaddress.c:1819 catalog/objectaddress.c:1845 #, c-format msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\" на Ñервері \"%s\"не Ñ–Ñнує" -#: catalog/objectaddress.c:1854 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:691 +#: catalog/objectaddress.c:1834 commands/foreigncmds.c:430 +#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:713 #, c-format msgid "server \"%s\" does not exist" msgstr "Ñервер \"%s\" не Ñ–Ñнує" -#: catalog/objectaddress.c:1921 +#: catalog/objectaddress.c:1901 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"%s\" в публікації \"%s\" не Ñ–Ñнує" -#: catalog/objectaddress.c:1968 +#: catalog/objectaddress.c:1948 #, c-format msgid "publication schema \"%s\" in publication \"%s\" does not exist" msgstr "Ñхема публікації \"%s\" в публікації \"%s\" не Ñ–Ñнує" -#: catalog/objectaddress.c:2026 +#: catalog/objectaddress.c:2006 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "нерозпізнаний тип об'єкта ACL за замовчуваннÑм \"%c\"" -#: catalog/objectaddress.c:2027 +#: catalog/objectaddress.c:2007 #, c-format msgid "Valid object types are \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." msgstr "ПрипуÑтимі типи об'єктів: \"%c\", \"%c\", \"%c\", \"%c\", \"%c\"." -#: catalog/objectaddress.c:2078 +#: catalog/objectaddress.c:2058 #, c-format msgid "default ACL for user \"%s\" in schema \"%s\" on %s does not exist" msgstr "ACL за замовчуваннÑм Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\" в Ñхемі \"%s\" Ð´Ð»Ñ Ð¾Ð±'єкту %s не Ñ–Ñнує" -#: catalog/objectaddress.c:2083 +#: catalog/objectaddress.c:2063 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "ACL за замовчуваннÑм Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\" Ñ– Ð´Ð»Ñ Ð¾Ð±'єкту %s не Ñ–Ñнує" -#: catalog/objectaddress.c:2110 catalog/objectaddress.c:2168 -#: catalog/objectaddress.c:2225 +#: catalog/objectaddress.c:2089 catalog/objectaddress.c:2146 +#: catalog/objectaddress.c:2201 #, c-format msgid "name or argument lists may not contain nulls" msgstr "ÑпиÑки імен та аргументів не повинні міÑтити Null" -#: catalog/objectaddress.c:2144 +#: catalog/objectaddress.c:2123 #, c-format msgid "unsupported object type \"%s\"" msgstr "непідтримуваний тип об'єкта \"%s\"" -#: catalog/objectaddress.c:2164 catalog/objectaddress.c:2182 -#: catalog/objectaddress.c:2325 +#: catalog/objectaddress.c:2142 catalog/objectaddress.c:2159 +#: catalog/objectaddress.c:2224 catalog/objectaddress.c:2308 #, c-format msgid "name list length must be exactly %d" msgstr "довжина ÑпиÑку імен повинна бути точно %d" -#: catalog/objectaddress.c:2186 +#: catalog/objectaddress.c:2163 #, c-format msgid "large object OID may not be null" msgstr "OID великого об'єкта не повинно бути нулем" -#: catalog/objectaddress.c:2195 catalog/objectaddress.c:2259 -#: catalog/objectaddress.c:2266 +#: catalog/objectaddress.c:2172 catalog/objectaddress.c:2242 +#: catalog/objectaddress.c:2249 #, c-format msgid "name list length must be at least %d" msgstr "довжина ÑпиÑку імен повинна бути щонайменше %d" -#: catalog/objectaddress.c:2252 catalog/objectaddress.c:2273 +#: catalog/objectaddress.c:2235 catalog/objectaddress.c:2256 #, c-format msgid "argument list length must be exactly %d" msgstr "довжина ÑпиÑку аргументів повинна бути точно %d" -#: catalog/objectaddress.c:2527 libpq/be-fsstubs.c:318 +#: catalog/objectaddress.c:2470 libpq/be-fsstubs.c:329 #, c-format msgid "must be owner of large object %u" msgstr "треба бути влаÑником великого об'єкта %u" -#: catalog/objectaddress.c:2542 commands/functioncmds.c:1566 +#: catalog/objectaddress.c:2485 commands/functioncmds.c:1560 #, c-format msgid "must be owner of type %s or type %s" msgstr "треба бути влаÑником типу %s або типу %s" -#: catalog/objectaddress.c:2592 catalog/objectaddress.c:2610 +#: catalog/objectaddress.c:2512 catalog/objectaddress.c:2521 +#: catalog/objectaddress.c:2527 #, c-format -msgid "must be superuser" -msgstr "треба бути ÑуперкориÑтувачем" +msgid "permission denied" +msgstr "немає доÑтупу" + +#: catalog/objectaddress.c:2513 catalog/objectaddress.c:2522 +#, c-format +msgid "The current user must have the %s attribute." +msgstr "Поточний кориÑтувач повинен мати атрибут %s." + +#: catalog/objectaddress.c:2528 +#, c-format +msgid "The current user must have the %s option on role \"%s\"." +msgstr "Поточний кориÑтувач повинен мати параметр %s Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ– \"%s\"." -#: catalog/objectaddress.c:2599 +#: catalog/objectaddress.c:2542 #, c-format -msgid "must have CREATEROLE privilege" -msgstr "треба мати право CREATEROLE" +msgid "must be superuser" +msgstr "треба бути ÑуперкориÑтувачем" -#: catalog/objectaddress.c:2680 +#: catalog/objectaddress.c:2611 #, c-format msgid "unrecognized object type \"%s\"" msgstr "нерозпізнаний тип об'єкту \"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2972 +#: catalog/objectaddress.c:2928 #, c-format msgid "column %s of %s" msgstr "Ñтовпець %s з %s" -#: catalog/objectaddress.c:2987 +#: catalog/objectaddress.c:2943 #, c-format msgid "function %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %s" -#: catalog/objectaddress.c:3000 +#: catalog/objectaddress.c:2956 #, c-format msgid "type %s" msgstr "тип %s" -#: catalog/objectaddress.c:3037 +#: catalog/objectaddress.c:2993 #, c-format msgid "cast from %s to %s" msgstr "Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ %s до %s" -#: catalog/objectaddress.c:3070 +#: catalog/objectaddress.c:3026 #, c-format msgid "collation %s" msgstr "ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3101 +#: catalog/objectaddress.c:3057 #, c-format msgid "constraint %s on %s" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ %s на %s" -#: catalog/objectaddress.c:3107 +#: catalog/objectaddress.c:3063 #, c-format msgid "constraint %s" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ %s" -#: catalog/objectaddress.c:3139 +#: catalog/objectaddress.c:3095 #, c-format msgid "conversion %s" msgstr "Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3161 +#: catalog/objectaddress.c:3117 #, c-format msgid "default value for %s" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм Ð´Ð»Ñ %s" -#: catalog/objectaddress.c:3172 +#: catalog/objectaddress.c:3128 #, c-format msgid "language %s" msgstr "мова %s" -#: catalog/objectaddress.c:3180 +#: catalog/objectaddress.c:3136 #, c-format msgid "large object %u" msgstr "великий об'єкт %u" -#: catalog/objectaddress.c:3193 +#: catalog/objectaddress.c:3149 #, c-format msgid "operator %s" msgstr "оператор %s" -#: catalog/objectaddress.c:3230 +#: catalog/objectaddress.c:3186 #, c-format msgid "operator class %s for access method %s" msgstr "ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² %s Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ доÑтупу %s" -#: catalog/objectaddress.c:3258 +#: catalog/objectaddress.c:3214 #, c-format msgid "access method %s" msgstr "метод доÑтупу %s" @@ -5107,7 +5480,7 @@ msgstr "метод доÑтупу %s" #. first two %s's are data type names, the third %s is the #. description of the operator family, and the last %s is the #. textual form of the operator with arguments. -#: catalog/objectaddress.c:3307 +#: catalog/objectaddress.c:3269 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "оператор %d (%s, %s) з %s: %s" @@ -5116,231 +5489,236 @@ msgstr "оператор %d (%s, %s) з %s: %s" #. are data type names, the third %s is the description of the #. operator family, and the last %s is the textual form of the #. function with arguments. -#: catalog/objectaddress.c:3364 +#: catalog/objectaddress.c:3334 #, c-format msgid "function %d (%s, %s) of %s: %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %d (%s, %s) з %s: %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3416 +#: catalog/objectaddress.c:3388 #, c-format msgid "rule %s on %s" msgstr "правило %s на %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3462 +#: catalog/objectaddress.c:3434 #, c-format msgid "trigger %s on %s" msgstr "тригер %s на %s" -#: catalog/objectaddress.c:3482 +#: catalog/objectaddress.c:3454 #, c-format msgid "schema %s" msgstr "Ñхема %s" -#: catalog/objectaddress.c:3510 +#: catalog/objectaddress.c:3482 #, c-format msgid "statistics object %s" msgstr "об'єкт ÑтатиÑтики %s" -#: catalog/objectaddress.c:3541 +#: catalog/objectaddress.c:3513 #, c-format msgid "text search parser %s" msgstr "парÑер текÑтового пошуку %s" -#: catalog/objectaddress.c:3572 +#: catalog/objectaddress.c:3544 #, c-format msgid "text search dictionary %s" msgstr "Ñловник текÑтового пошуку %s" -#: catalog/objectaddress.c:3603 +#: catalog/objectaddress.c:3575 #, c-format msgid "text search template %s" msgstr "шаблон текÑтового пошуку %s" -#: catalog/objectaddress.c:3634 +#: catalog/objectaddress.c:3606 #, c-format msgid "text search configuration %s" msgstr "ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐºÑтового пошуку %s" -#: catalog/objectaddress.c:3647 +#: catalog/objectaddress.c:3619 #, c-format msgid "role %s" msgstr "роль %s" -#: catalog/objectaddress.c:3663 +#: catalog/objectaddress.c:3656 catalog/objectaddress.c:5505 +#, c-format +msgid "membership of role %s in role %s" +msgstr "членÑтво ролі %s в ролі %s" + +#: catalog/objectaddress.c:3677 #, c-format msgid "database %s" msgstr "база даних %s" -#: catalog/objectaddress.c:3679 +#: catalog/objectaddress.c:3693 #, c-format msgid "tablespace %s" msgstr "табличний проÑтір %s" -#: catalog/objectaddress.c:3690 +#: catalog/objectaddress.c:3704 #, c-format msgid "foreign-data wrapper %s" msgstr "джерело Ñторонніх даних %s" -#: catalog/objectaddress.c:3700 +#: catalog/objectaddress.c:3714 #, c-format msgid "server %s" msgstr "Ñервер %s" -#: catalog/objectaddress.c:3733 +#: catalog/objectaddress.c:3747 #, c-format msgid "user mapping for %s on server %s" msgstr "зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ %s на Ñервері %s" -#: catalog/objectaddress.c:3785 +#: catalog/objectaddress.c:3799 #, c-format msgid "default privileges on new relations belonging to role %s in schema %s" msgstr "права за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… відношень, що належать ролі %s в Ñхемі %s" -#: catalog/objectaddress.c:3789 +#: catalog/objectaddress.c:3803 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "права за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… відношень, що належать ролі %s" -#: catalog/objectaddress.c:3795 +#: catalog/objectaddress.c:3809 #, c-format msgid "default privileges on new sequences belonging to role %s in schema %s" msgstr "права за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… поÑлідовноÑтей, що належать ролі %s в Ñхемі %s" -#: catalog/objectaddress.c:3799 +#: catalog/objectaddress.c:3813 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "права за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… поÑлідовноÑтей, що належать ролі %s" -#: catalog/objectaddress.c:3805 +#: catalog/objectaddress.c:3819 #, c-format msgid "default privileges on new functions belonging to role %s in schema %s" msgstr "права за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… функцій, що належать ролі %s в Ñхемі %s" -#: catalog/objectaddress.c:3809 +#: catalog/objectaddress.c:3823 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "права за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… функцій, що належать ролі %s" -#: catalog/objectaddress.c:3815 +#: catalog/objectaddress.c:3829 #, c-format msgid "default privileges on new types belonging to role %s in schema %s" msgstr "права за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… типів, що належать ролі %s в Ñхемі %s" -#: catalog/objectaddress.c:3819 +#: catalog/objectaddress.c:3833 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "права за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… типів, що належать ролі %s" -#: catalog/objectaddress.c:3825 +#: catalog/objectaddress.c:3839 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "права за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… Ñхем, що належать ролі %s" -#: catalog/objectaddress.c:3832 +#: catalog/objectaddress.c:3846 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "права за замовчуваннÑм, що належать ролі %s в Ñхемі %s" -#: catalog/objectaddress.c:3836 +#: catalog/objectaddress.c:3850 #, c-format msgid "default privileges belonging to role %s" msgstr "права за замовчуваннÑм належать ролі %s" -#: catalog/objectaddress.c:3858 +#: catalog/objectaddress.c:3872 #, c-format msgid "extension %s" msgstr "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ %s" -#: catalog/objectaddress.c:3875 +#: catalog/objectaddress.c:3889 #, c-format msgid "event trigger %s" msgstr "тригер подій %s" -#: catalog/objectaddress.c:3902 +#: catalog/objectaddress.c:3913 #, c-format msgid "parameter %s" msgstr "параметр %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3945 +#: catalog/objectaddress.c:3956 #, c-format msgid "policy %s on %s" msgstr "політика %s на %s" -#: catalog/objectaddress.c:3959 +#: catalog/objectaddress.c:3970 #, c-format msgid "publication %s" msgstr "Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ %s" -#: catalog/objectaddress.c:3972 +#: catalog/objectaddress.c:3983 #, c-format msgid "publication of schema %s in publication %s" msgstr "Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñхеми %s в публікації %s" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:4003 +#: catalog/objectaddress.c:4014 #, c-format msgid "publication of %s in publication %s" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— %s в публікації %s" -#: catalog/objectaddress.c:4016 +#: catalog/objectaddress.c:4027 #, c-format msgid "subscription %s" msgstr "підпиÑка %s" -#: catalog/objectaddress.c:4037 +#: catalog/objectaddress.c:4048 #, c-format msgid "transform for %s language %s" msgstr "транÑÑ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð´Ð»Ñ %s мови %s" -#: catalog/objectaddress.c:4108 +#: catalog/objectaddress.c:4117 #, c-format msgid "table %s" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ %s" -#: catalog/objectaddress.c:4113 +#: catalog/objectaddress.c:4122 #, c-format msgid "index %s" msgstr "Ñ–Ð½Ð´ÐµÐºÑ %s" -#: catalog/objectaddress.c:4117 +#: catalog/objectaddress.c:4126 #, c-format msgid "sequence %s" msgstr "поÑлідовніÑть %s" -#: catalog/objectaddress.c:4121 +#: catalog/objectaddress.c:4130 #, c-format msgid "toast table %s" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ toast %s" -#: catalog/objectaddress.c:4125 +#: catalog/objectaddress.c:4134 #, c-format msgid "view %s" msgstr "Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ %s" -#: catalog/objectaddress.c:4129 +#: catalog/objectaddress.c:4138 #, c-format msgid "materialized view %s" msgstr "матеріалізоване Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ %s" -#: catalog/objectaddress.c:4133 +#: catalog/objectaddress.c:4142 #, c-format msgid "composite type %s" msgstr "Ñкладений тип %s" -#: catalog/objectaddress.c:4137 +#: catalog/objectaddress.c:4146 #, c-format msgid "foreign table %s" msgstr "Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ %s" -#: catalog/objectaddress.c:4142 +#: catalog/objectaddress.c:4151 #, c-format msgid "relation %s" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %s" -#: catalog/objectaddress.c:4183 +#: catalog/objectaddress.c:4192 #, c-format msgid "operator family %s for access method %s" msgstr "ÑімейÑтво операторів %s Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ доÑтупу %s" @@ -5384,7 +5762,7 @@ msgstr "не можна пропуÑтити початкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ msgid "return type of inverse transition function %s is not %s" msgstr "інвертована Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ñƒ %s повинна повертати тип %s" -#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2978 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2991 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "прÑма й інвертована функції переходу агрегату повинні мати однакову ÑуворіÑть" @@ -5399,7 +5777,7 @@ msgstr "фінальна Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð· додатковими аргумен msgid "return type of combine function %s is not %s" msgstr "комбінуюча Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %s повинна повертати тип %s" -#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3883 +#: catalog/pg_aggregate.c:439 executor/nodeAgg.c:3902 #, c-format msgid "combine function with transition type %s must not be declared STRICT" msgstr "комбінуюча Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð· перехідним типом %s не повинна оголошуватиÑÑŒ Ñк Ñувора (STRICT)" @@ -5414,12 +5792,12 @@ msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ñеріалізації %s повинна поверта msgid "return type of deserialization function %s is not %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð´ÐµÑеріалізації %s повинна повертати тип %s" -#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:191 catalog/pg_proc.c:225 +#: catalog/pg_aggregate.c:498 catalog/pg_proc.c:189 catalog/pg_proc.c:223 #, c-format msgid "cannot determine result data type" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ тип результату" -#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:204 catalog/pg_proc.c:233 +#: catalog/pg_aggregate.c:513 catalog/pg_proc.c:202 catalog/pg_proc.c:231 #, c-format msgid "unsafe use of pseudo-type \"internal\"" msgstr "небезпечне викориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñевдотипу (pseudo-type) \"internal\"" @@ -5434,7 +5812,7 @@ msgstr "Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ€ÑƒÑ…Ð¾Ð¼Ð¾Ð³Ð¾ агрегату повертає msgid "sort operator can only be specified for single-argument aggregates" msgstr "оператора ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ð½Ð° вказати лише Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð¸Ñ… функцій з одним аргументом" -#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:386 +#: catalog/pg_aggregate.c:706 catalog/pg_proc.c:384 #, c-format msgid "cannot change routine kind" msgstr "неможливо змінити тип підпрограми" @@ -5459,13 +5837,13 @@ msgstr "\"%s\" Ñ” агрегатом Ð´Ð»Ñ Ð³Ñ–Ð¿Ð¾Ñ‚ÐµÑ‚Ð¸Ñ‡Ð½Ð¸Ñ… набор msgid "cannot change number of direct arguments of an aggregate function" msgstr "змінити кількіÑть прÑмих аргументів агрегатної функції не можна" -#: catalog/pg_aggregate.c:858 commands/functioncmds.c:695 -#: commands/typecmds.c:1976 commands/typecmds.c:2022 commands/typecmds.c:2074 -#: commands/typecmds.c:2111 commands/typecmds.c:2145 commands/typecmds.c:2179 -#: commands/typecmds.c:2213 commands/typecmds.c:2242 commands/typecmds.c:2329 -#: commands/typecmds.c:2371 parser/parse_func.c:417 parser/parse_func.c:448 +#: catalog/pg_aggregate.c:858 commands/functioncmds.c:686 +#: commands/typecmds.c:1985 commands/typecmds.c:2031 commands/typecmds.c:2083 +#: commands/typecmds.c:2120 commands/typecmds.c:2154 commands/typecmds.c:2188 +#: commands/typecmds.c:2222 commands/typecmds.c:2251 commands/typecmds.c:2338 +#: commands/typecmds.c:2380 parser/parse_func.c:417 parser/parse_func.c:448 #: parser/parse_func.c:475 parser/parse_func.c:489 parser/parse_func.c:611 -#: parser/parse_func.c:631 parser/parse_func.c:2173 parser/parse_func.c:2446 +#: parser/parse_func.c:631 parser/parse_func.c:2172 parser/parse_func.c:2445 #, c-format msgid "function %s does not exist" msgstr "функції %s не Ñ–Ñнує" @@ -5485,7 +5863,7 @@ msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %s повинна прийнÑти VARIADIC ANY Ð´Ð»Ñ Ð² msgid "function %s requires run-time type coercion" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %s потребує Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð² під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ" -#: catalog/pg_cast.c:68 +#: catalog/pg_cast.c:75 #, c-format msgid "cast from type %s to type %s already exists" msgstr "Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ типу %s до типу %s вже Ñ–Ñнує" @@ -5560,193 +5938,208 @@ msgstr "правило ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" вже Ñ–Ñнує" msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "правило ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s \" Ð´Ð»Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" вже Ñ–Ñнує" -#: catalog/pg_constraint.c:697 +#: catalog/pg_constraint.c:732 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ %s вже Ñ–Ñнує" -#: catalog/pg_constraint.c:893 catalog/pg_constraint.c:986 +#: catalog/pg_constraint.c:932 catalog/pg_constraint.c:1025 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "індекÑу \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\" не Ñ–Ñнує" -#: catalog/pg_constraint.c:1075 +#: catalog/pg_constraint.c:1125 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ \"%s\" не Ñ–Ñнує" -#: catalog/pg_conversion.c:67 +#: catalog/pg_conversion.c:64 #, c-format msgid "conversion \"%s\" already exists" msgstr "Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ \"%s\" вже Ñ–Ñнує" -#: catalog/pg_conversion.c:80 +#: catalog/pg_conversion.c:77 #, c-format msgid "default conversion for %s to %s already exists" msgstr "Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм від %s до %s вже Ñ–Ñнує" -#: catalog/pg_depend.c:222 commands/extension.c:3271 +#: catalog/pg_depend.c:224 commands/extension.c:3397 #, c-format msgid "%s is already a member of extension \"%s\"" msgstr "%s вже Ñ” членом Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\"" -#: catalog/pg_depend.c:229 catalog/pg_depend.c:280 commands/extension.c:3311 +#: catalog/pg_depend.c:231 catalog/pg_depend.c:282 commands/extension.c:3437 #, c-format msgid "%s is not a member of extension \"%s\"" msgstr "%s не Ñ” членом Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\"" -#: catalog/pg_depend.c:232 +#: catalog/pg_depend.c:234 #, c-format msgid "An extension is not allowed to replace an object that it does not own." msgstr "Розширенню не дозволÑєтьÑÑ Ð·Ð°Ð¼Ñ–Ð½ÑŽÐ²Ð°Ñ‚Ð¸ об'єкт, Ñкий йому не належить." -#: catalog/pg_depend.c:283 +#: catalog/pg_depend.c:285 #, c-format msgid "An extension may only use CREATE ... IF NOT EXISTS to skip object creation if the conflicting object is one that it already owns." msgstr "Ð Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ðµ викориÑтовувати лише CREATE ... IF NOT EXISTS, щоб пропуÑтити ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±'єкту, Ñкщо конфліктуючий об'єкт уже належить йому." -#: catalog/pg_depend.c:646 +#: catalog/pg_depend.c:648 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "неможливо видалити залежніÑть від об'єкта %s, тому що це ÑиÑтемний об'єкт" -#: catalog/pg_enum.c:128 catalog/pg_enum.c:230 catalog/pg_enum.c:525 +#: catalog/pg_enum.c:175 catalog/pg_enum.c:314 catalog/pg_enum.c:624 #, c-format msgid "invalid enum label \"%s\"" msgstr "неприпуÑтима мітка Ð¿ÐµÑ€ÐµÑ€Ð°Ñ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"" -#: catalog/pg_enum.c:129 catalog/pg_enum.c:231 catalog/pg_enum.c:526 +#: catalog/pg_enum.c:176 catalog/pg_enum.c:315 catalog/pg_enum.c:625 #, c-format msgid "Labels must be %d bytes or less." msgstr "Мітки повинні бути %d байт або менше." -#: catalog/pg_enum.c:259 +#: catalog/pg_enum.c:343 #, c-format msgid "enum label \"%s\" already exists, skipping" msgstr "мітка Ð¿ÐµÑ€ÐµÑ€Ð°Ñ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" вже Ñ–Ñнує, пропуÑкаємо" -#: catalog/pg_enum.c:266 catalog/pg_enum.c:569 +#: catalog/pg_enum.c:350 catalog/pg_enum.c:668 #, c-format msgid "enum label \"%s\" already exists" msgstr "мітка Ð¿ÐµÑ€ÐµÑ€Ð°Ñ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" вже Ñ–Ñнує" -#: catalog/pg_enum.c:321 catalog/pg_enum.c:564 +#: catalog/pg_enum.c:405 catalog/pg_enum.c:663 #, c-format msgid "\"%s\" is not an existing enum label" msgstr "\"%s\" не Ñ” Ñ–Ñнуючою міткою перераховуваннÑ" -#: catalog/pg_enum.c:379 +#: catalog/pg_enum.c:463 #, c-format msgid "pg_enum OID value not set when in binary upgrade mode" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ OID в pg_enum не вÑтановлено в режимі двійкового оновленнÑ" -#: catalog/pg_enum.c:389 +#: catalog/pg_enum.c:473 #, c-format msgid "ALTER TYPE ADD BEFORE/AFTER is incompatible with binary upgrade" msgstr "КонÑÑ‚Ñ€ÑƒÐºÑ†Ñ–Ñ ALTER TYPE ADD BEFORE/AFTER неÑуміÑна з двійковим оновленнÑм даних" -#: catalog/pg_inherits.c:593 +#: catalog/pg_inherits.c:592 #, c-format msgid "cannot detach partition \"%s\"" msgstr "не можна відключити розділ \"%s\"" -#: catalog/pg_inherits.c:595 +#: catalog/pg_inherits.c:594 #, c-format msgid "The partition is being detached concurrently or has an unfinished detach." msgstr "Розділ відключаєтьÑÑ Ð¾Ð´Ð½Ð¾Ñ‡Ð°Ñно або має незакінчене відключеннÑ." -#: catalog/pg_inherits.c:596 commands/tablecmds.c:4488 -#: commands/tablecmds.c:15385 +#: catalog/pg_inherits.c:595 commands/tablecmds.c:4800 +#: commands/tablecmds.c:16184 #, c-format msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." msgstr "ВикориÑтайте ALTER TABLE ... DETACH PARTITION ... FINALIZE щоб завершити очікувану операцію відключеннÑ." -#: catalog/pg_inherits.c:600 +#: catalog/pg_inherits.c:599 #, c-format msgid "cannot complete detaching partition \"%s\"" msgstr "не можна завершити Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ \"%s\"" -#: catalog/pg_inherits.c:602 +#: catalog/pg_inherits.c:601 #, c-format msgid "There's no pending concurrent detach." msgstr "Ðемає жодного очікуючого паралельного відключеннÑ." -#: catalog/pg_namespace.c:64 commands/schemacmds.c:254 +#: catalog/pg_namespace.c:64 commands/schemacmds.c:273 #, c-format msgid "schema \"%s\" already exists" msgstr "Ñхема \"%s\" вже Ñ–Ñнує" -#: catalog/pg_operator.c:219 catalog/pg_operator.c:361 +#: catalog/pg_operator.c:213 catalog/pg_operator.c:355 #, c-format msgid "\"%s\" is not a valid operator name" msgstr "\"%s\" не Ñ” коректним оператором" -#: catalog/pg_operator.c:370 +#: catalog/pg_operator.c:379 +#, c-format +msgid "operator %s already exists" +msgstr "оператор %s вже Ñ–Ñнує" + +#: catalog/pg_operator.c:445 commands/operatorcmds.c:600 +#, c-format +msgid "operator cannot be its own negator" +msgstr "оператор не може бути влаÑним запереченнÑм" + +#: catalog/pg_operator.c:572 #, c-format msgid "only binary operators can have commutators" msgstr "(commutators) можна визначити лише Ð´Ð»Ñ Ð±Ñ–Ð½Ð°Ñ€Ð½Ð¸Ñ… операторів" -#: catalog/pg_operator.c:374 commands/operatorcmds.c:507 +#: catalog/pg_operator.c:576 #, c-format msgid "only binary operators can have join selectivity" msgstr "функцію оцінки з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ визначити лише Ð´Ð»Ñ Ð±Ñ–Ð½Ð°Ñ€Ð½Ð¸Ñ… операторів" -#: catalog/pg_operator.c:378 +#: catalog/pg_operator.c:580 #, c-format msgid "only binary operators can merge join" msgstr "підтримку з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð»Ð¸Ñ‚Ñ‚Ñм можливо позначити лише Ð´Ð»Ñ Ð±Ñ–Ð½Ð°Ñ€Ð½Ð¸Ñ… операторів" -#: catalog/pg_operator.c:382 +#: catalog/pg_operator.c:584 #, c-format msgid "only binary operators can hash" msgstr "підтримка хешу можливо позначити лише Ð´Ð»Ñ Ð±Ñ–Ð½Ð°Ñ€Ð½Ð¸Ñ… операторів" -#: catalog/pg_operator.c:393 +#: catalog/pg_operator.c:593 #, c-format msgid "only boolean operators can have negators" msgstr "зворотню операцію можливо визначити лише Ð´Ð»Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¸Ñ… операторів" -#: catalog/pg_operator.c:397 commands/operatorcmds.c:515 +#: catalog/pg_operator.c:597 #, c-format msgid "only boolean operators can have restriction selectivity" msgstr "функцію оцінки Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ визначити лише Ð´Ð»Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¸Ñ… операторів" -#: catalog/pg_operator.c:401 commands/operatorcmds.c:519 +#: catalog/pg_operator.c:601 #, c-format msgid "only boolean operators can have join selectivity" msgstr "функцію оцінки з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ визначити лише Ð´Ð»Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¸Ñ… операторів" -#: catalog/pg_operator.c:405 +#: catalog/pg_operator.c:605 #, c-format msgid "only boolean operators can merge join" msgstr "підтримку з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð»Ð¸Ñ‚Ñ‚Ñм можливо позначити лише Ð´Ð»Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¸Ñ… операторів" -#: catalog/pg_operator.c:409 +#: catalog/pg_operator.c:609 #, c-format msgid "only boolean operators can hash" msgstr "підтримку хешу можливо позначити лише Ð´Ð»Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¸Ñ… операторів" -#: catalog/pg_operator.c:421 +#: catalog/pg_operator.c:739 #, c-format -msgid "operator %s already exists" -msgstr "оператор %s вже Ñ–Ñнує" +msgid "commutator operator %s is already the commutator of operator %s" +msgstr "оператор комутатора %s вже Ñ” комутатором оператора %s" -#: catalog/pg_operator.c:621 +#: catalog/pg_operator.c:744 #, c-format -msgid "operator cannot be its own negator or sort operator" -msgstr "оператор не може бути зворотнім до Ñебе або влаÑним оператором ÑортуваннÑ" +msgid "commutator operator %s is already the commutator of operator %u" +msgstr "оператор комутатора %s вже Ñ” комутатором оператора %u" -#: catalog/pg_parameter_acl.c:52 +#: catalog/pg_operator.c:807 #, c-format -msgid "parameter ACL \"%s\" does not exist" -msgstr "параметр ACL \"%s\" не Ñ–Ñнує" +msgid "negator operator %s is already the negator of operator %s" +msgstr "оператор Ð·Ð°Ð¿ÐµÑ€ÐµÑ‡ÐµÐ½Ð½Ñ %s вже Ñ” запереченнÑм оператора %s" + +#: catalog/pg_operator.c:812 +#, c-format +msgid "negator operator %s is already the negator of operator %u" +msgstr "заперечний оператор %s вже Ñ” запереченнÑм оператора %u" -#: catalog/pg_parameter_acl.c:87 +#: catalog/pg_parameter_acl.c:50 #, c-format -msgid "invalid parameter name \"%s\"" -msgstr "неприпуÑтима назва параметру \"%s\"" +msgid "parameter ACL \"%s\" does not exist" +msgstr "параметр ACL \"%s\" не Ñ–Ñнує" -#: catalog/pg_proc.c:132 parser/parse_func.c:2235 +#: catalog/pg_proc.c:130 parser/parse_func.c:2234 #, c-format msgid "functions cannot have more than %d argument" msgid_plural "functions cannot have more than %d arguments" @@ -5755,37 +6148,37 @@ msgstr[1] "функції не можуть мати більше %d аргум msgstr[2] "функції не можуть мати більше %d аргументів" msgstr[3] "функції не можуть мати більше %d аргументів" -#: catalog/pg_proc.c:376 +#: catalog/pg_proc.c:374 #, c-format msgid "function \"%s\" already exists with same argument types" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" з аргументами таких типів вже Ñ–Ñнує" -#: catalog/pg_proc.c:388 +#: catalog/pg_proc.c:386 #, c-format msgid "\"%s\" is an aggregate function." msgstr "\"%s\" Ñ” функцією агрегату." -#: catalog/pg_proc.c:390 +#: catalog/pg_proc.c:388 #, c-format msgid "\"%s\" is a function." msgstr "\"%s\" Ñ” функцією." -#: catalog/pg_proc.c:392 +#: catalog/pg_proc.c:390 #, c-format msgid "\"%s\" is a procedure." msgstr "\"%s\" Ñ” процедурою." -#: catalog/pg_proc.c:394 +#: catalog/pg_proc.c:392 #, c-format msgid "\"%s\" is a window function." msgstr "\"%s\" Ñ” функцією вікна." -#: catalog/pg_proc.c:414 +#: catalog/pg_proc.c:412 #, c-format msgid "cannot change whether a procedure has output parameters" msgstr "неможливо визначити вихідні параметри Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸" -#: catalog/pg_proc.c:415 catalog/pg_proc.c:445 +#: catalog/pg_proc.c:413 catalog/pg_proc.c:443 #, c-format msgid "cannot change return type of existing function" msgstr "неможливо змінити тип Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ñ–Ñнуючої функції" @@ -5794,178 +6187,170 @@ msgstr "неможливо змінити тип Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ñ–Ñную #. AGGREGATE #. #. translator: first %s is DROP FUNCTION or DROP PROCEDURE -#: catalog/pg_proc.c:421 catalog/pg_proc.c:448 catalog/pg_proc.c:493 -#: catalog/pg_proc.c:519 catalog/pg_proc.c:545 +#: catalog/pg_proc.c:419 catalog/pg_proc.c:446 catalog/pg_proc.c:491 +#: catalog/pg_proc.c:517 catalog/pg_proc.c:541 #, c-format msgid "Use %s %s first." msgstr "ВикориÑтайте %s %s Ñпочатку." -#: catalog/pg_proc.c:446 +#: catalog/pg_proc.c:444 #, c-format msgid "Row type defined by OUT parameters is different." msgstr "Параметри OUT визначають другий тип Ñ€Ñдку." -#: catalog/pg_proc.c:490 +#: catalog/pg_proc.c:488 #, c-format msgid "cannot change name of input parameter \"%s\"" msgstr "неможливо змінити ім'Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¾Ð³Ð¾ параметру \"%s\"" -#: catalog/pg_proc.c:517 +#: catalog/pg_proc.c:515 #, c-format msgid "cannot remove parameter defaults from existing function" msgstr "неможливо прибрати параметр за замовчуваннÑм з Ñ–Ñнуючої функції" -#: catalog/pg_proc.c:543 +#: catalog/pg_proc.c:539 #, c-format msgid "cannot change data type of existing parameter default value" msgstr "неможливо змінити тип даних Ð´Ð»Ñ Ñ–Ñнуючого Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ за замовчуваннÑм" -#: catalog/pg_proc.c:757 +#: catalog/pg_proc.c:750 #, c-format msgid "there is no built-in function named \"%s\"" msgstr "немає вбудованої функції \"%s\"" -#: catalog/pg_proc.c:855 +#: catalog/pg_proc.c:843 #, c-format msgid "SQL functions cannot return type %s" msgstr "Функції SQL не можуть повернути тип %s" -#: catalog/pg_proc.c:870 +#: catalog/pg_proc.c:858 #, c-format msgid "SQL functions cannot have arguments of type %s" msgstr "функції SQL не можуть мати аргументи типу %s" -#: catalog/pg_proc.c:1000 executor/functions.c:1473 +#: catalog/pg_proc.c:986 executor/functions.c:1468 #, c-format msgid "SQL function \"%s\"" msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ SQL \"%s\"" -#: catalog/pg_publication.c:63 catalog/pg_publication.c:71 -#: catalog/pg_publication.c:79 catalog/pg_publication.c:85 +#: catalog/pg_publication.c:66 catalog/pg_publication.c:74 +#: catalog/pg_publication.c:82 catalog/pg_publication.c:88 #, c-format msgid "cannot add relation \"%s\" to publication" msgstr "не можна додати Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" до публікації" -#: catalog/pg_publication.c:73 +#: catalog/pg_publication.c:76 #, c-format msgid "This operation is not supported for system tables." msgstr "Ð¦Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ підтримуєтьÑÑ Ð´Ð»Ñ ÑиÑтемних таблиць." -#: catalog/pg_publication.c:81 +#: catalog/pg_publication.c:84 #, c-format msgid "This operation is not supported for temporary tables." msgstr "Ð¦Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ підтримуєтьÑÑ Ð´Ð»Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñових таблиць." -#: catalog/pg_publication.c:87 +#: catalog/pg_publication.c:90 #, c-format msgid "This operation is not supported for unlogged tables." msgstr "Ð¦Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ підтримуєтьÑÑ Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ без журналюваннÑ." -#: catalog/pg_publication.c:101 catalog/pg_publication.c:109 -#: commands/publicationcmds.c:238 +#: catalog/pg_publication.c:104 catalog/pg_publication.c:112 #, c-format msgid "cannot add schema \"%s\" to publication" msgstr "не можна додати Ñхему \"%s\" до публікації" -#: catalog/pg_publication.c:103 +#: catalog/pg_publication.c:106 #, c-format msgid "This operation is not supported for system schemas." msgstr "Ð¦Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ підтримуєтьÑÑ Ð´Ð»Ñ ÑиÑтемних Ñхем." -#: catalog/pg_publication.c:111 +#: catalog/pg_publication.c:114 #, c-format msgid "Temporary schemas cannot be replicated." msgstr "ТимчаÑові Ñхеми не можуть бути репліковані." -#: catalog/pg_publication.c:374 +#: catalog/pg_publication.c:392 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" вже Ñ” членом публікації \"%s\"" -#: catalog/pg_publication.c:516 +#: catalog/pg_publication.c:534 #, c-format -msgid "cannot reference system column \"%s\" in publication column list" -msgstr "не можна поÑилатиÑÑŒ на ÑиÑтемний Ñтовпець \"%s\" у ÑпиÑку Ñтовпців публікації" +msgid "cannot use system column \"%s\" in publication column list" +msgstr "не можна викориÑтати ÑиÑтемний Ñтовпець \"%s\" у ÑпиÑку Ñтовпців публікації" -#: catalog/pg_publication.c:522 +#: catalog/pg_publication.c:540 #, c-format -msgid "cannot reference generated column \"%s\" in publication column list" -msgstr "не можна поÑилатиÑÑŒ на згенерований Ñтовпець \"%s\" у ÑпиÑку Ñтовпців публікації" +msgid "cannot use generated column \"%s\" in publication column list" +msgstr "не можна викориÑтати згенерований Ñтовпець \"%s\" у ÑпиÑку Ñтовпців публікації" -#: catalog/pg_publication.c:528 +#: catalog/pg_publication.c:546 #, c-format msgid "duplicate column \"%s\" in publication column list" msgstr "дуплікат ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" в ÑпиÑку Ñтовпців публікації" -#: catalog/pg_publication.c:618 +#: catalog/pg_publication.c:636 #, c-format msgid "schema \"%s\" is already member of publication \"%s\"" msgstr "Ñхема \"%s\" вже Ñ” членом публікації \"%s\"" -#: catalog/pg_publication.c:1045 commands/publicationcmds.c:1407 -#: commands/publicationcmds.c:1453 commands/publicationcmds.c:2016 -#, c-format -msgid "publication \"%s\" does not exist" -msgstr "Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ \"%s\" вже Ñ–Ñнує" - -#: catalog/pg_shdepend.c:829 +#: catalog/pg_shdepend.c:875 #, c-format -msgid "" -"\n" +msgid "\n" "and objects in %d other database (see server log for list)" -msgid_plural "" -"\n" +msgid_plural "\n" "and objects in %d other databases (see server log for list)" -msgstr[0] "" -"\n" +msgstr[0] "\n" "Ñ– об'єкти в %d іншій базі даних (див. ÑпиÑок в протоколі Ñервера)" -msgstr[1] "" -"\n" +msgstr[1] "\n" "Ñ– об'єкти в %d інших базах даних (див. ÑпиÑок в протоколі Ñервера)" -msgstr[2] "" -"\n" +msgstr[2] "\n" "Ñ– об'єкти в %d інших базах даних (див. ÑпиÑок в протоколі Ñервера)" -msgstr[3] "" -"\n" +msgstr[3] "\n" "Ñ– об'єкти в %d інших базах даних (див. ÑпиÑок в протоколі Ñервера)" -#: catalog/pg_shdepend.c:1176 +#: catalog/pg_shdepend.c:1222 #, c-format msgid "role %u was concurrently dropped" msgstr "роль %u було видалено паралельним ÑпоÑобом" -#: catalog/pg_shdepend.c:1188 +#: catalog/pg_shdepend.c:1234 #, c-format msgid "tablespace %u was concurrently dropped" msgstr "табличний проÑтір %u було видалено паралельним ÑпоÑобом" -#: catalog/pg_shdepend.c:1202 +#: catalog/pg_shdepend.c:1248 #, c-format msgid "database %u was concurrently dropped" msgstr "базу даних %u було видалено паралельним ÑпоÑобом" -#: catalog/pg_shdepend.c:1253 +#: catalog/pg_shdepend.c:1299 #, c-format msgid "owner of %s" msgstr "влаÑник об'єкту %s" -#: catalog/pg_shdepend.c:1255 +#: catalog/pg_shdepend.c:1301 #, c-format msgid "privileges for %s" msgstr "права Ð´Ð»Ñ %s" -#: catalog/pg_shdepend.c:1257 +#: catalog/pg_shdepend.c:1303 +#, c-format +msgid "initial privileges for %s" +msgstr "початкові права Ð´Ð»Ñ %s" + +#: catalog/pg_shdepend.c:1305 #, c-format msgid "target of %s" msgstr "ціль %s" -#: catalog/pg_shdepend.c:1259 +#: catalog/pg_shdepend.c:1307 #, c-format msgid "tablespace for %s" msgstr "табличний проÑтір Ð´Ð»Ñ %s" #. translator: %s will always be "database %s" -#: catalog/pg_shdepend.c:1267 +#: catalog/pg_shdepend.c:1315 #, c-format msgid "%d object in %s" msgid_plural "%d objects in %s" @@ -5974,28 +6359,22 @@ msgstr[1] "%d об'єкти в %s" msgstr[2] "%d об'єктів у %s" msgstr[3] "%d об'єктів у %s" -#: catalog/pg_shdepend.c:1331 +#: catalog/pg_shdepend.c:1379 #, c-format msgid "cannot drop objects owned by %s because they are required by the database system" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ об'єкти, що належать %s, оÑкільки вони потрібні ÑиÑтемі бази даних" -#: catalog/pg_shdepend.c:1477 +#: catalog/pg_shdepend.c:1560 #, c-format msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ влаÑника об'єктів, що належать ролі %s, тому що вони необхідні ÑиÑтемі баз даних" -#: catalog/pg_subscription.c:216 commands/subscriptioncmds.c:991 -#: commands/subscriptioncmds.c:1356 commands/subscriptioncmds.c:1707 -#, c-format -msgid "subscription \"%s\" does not exist" -msgstr "підпиÑка \"%s\" не Ñ–Ñнує" - -#: catalog/pg_subscription.c:474 +#: catalog/pg_subscription.c:438 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½ÑŒ Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\"" -#: catalog/pg_subscription.c:476 +#: catalog/pg_subscription.c:440 #, c-format msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" у процеÑÑ– та знаходитьÑÑ Ñƒ Ñтані \"%c\"." @@ -6003,218 +6382,227 @@ msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \" #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command #. -#: catalog/pg_subscription.c:483 +#: catalog/pg_subscription.c:447 #, c-format msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." msgstr "ВикориÑтайте %s, щоб активувати підпиÑку, Ñкщо вона ще не активована, або викориÑтайте %s, щоб видалити підпиÑку." -#: catalog/pg_type.c:136 catalog/pg_type.c:476 +#: catalog/pg_type.c:133 catalog/pg_type.c:474 #, c-format msgid "pg_type OID value not set when in binary upgrade mode" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ OID в pg_type не задано в режимі двійкового оновленнÑ" -#: catalog/pg_type.c:256 +#: catalog/pg_type.c:253 #, c-format msgid "invalid type internal size %d" msgstr "неприпуÑтимий внутрішній розмір типу %d" -#: catalog/pg_type.c:272 catalog/pg_type.c:280 catalog/pg_type.c:288 -#: catalog/pg_type.c:297 +#: catalog/pg_type.c:269 catalog/pg_type.c:277 catalog/pg_type.c:285 +#: catalog/pg_type.c:294 #, c-format msgid "alignment \"%c\" is invalid for passed-by-value type of size %d" msgstr "Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ \"%c\" недійÑне Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ переданого за значеннÑм розміром: %d" -#: catalog/pg_type.c:304 +#: catalog/pg_type.c:301 #, c-format msgid "internal size %d is invalid for passed-by-value type" msgstr "внутрішній розмір %d недійÑний Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ, переданого за значеннÑм" -#: catalog/pg_type.c:314 catalog/pg_type.c:320 +#: catalog/pg_type.c:311 catalog/pg_type.c:317 #, c-format msgid "alignment \"%c\" is invalid for variable-length type" msgstr "Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ \"%c\" недійÑне Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ змінної довжини" -#: catalog/pg_type.c:328 commands/typecmds.c:4151 +#: catalog/pg_type.c:325 commands/typecmds.c:4363 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñ–Ð² фікÑованого розміру заÑтоÑовуєтьÑÑ Ð»Ð¸ÑˆÐµ режим Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ PLAIN" -#: catalog/pg_type.c:827 -#, c-format -msgid "could not form array type name for type \"%s\"" -msgstr "не вдалоÑÑ Ñформувати ім'Ñ Ñ‚Ð¸Ð¿Ñƒ маÑиву Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ \"%s\"" - -#: catalog/pg_type.c:932 +#: catalog/pg_type.c:978 #, c-format msgid "Failed while creating a multirange type for type \"%s\"." msgstr "Помилка під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð³Ð°Ñ‚Ð¾Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ð½Ð¾Ð³Ð¾ типу Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ \"%s\"." -#: catalog/pg_type.c:933 +#: catalog/pg_type.c:979 #, c-format msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." msgstr "Ви можете вручну вказати назву багатодіапазонного типу за допомогою атрибуту \"multirange_type_name\"." -#: catalog/storage.c:505 storage/buffer/bufmgr.c:1047 +#: catalog/storage.c:533 storage/buffer/bufmgr.c:1540 #, c-format msgid "invalid page in block %u of relation %s" msgstr "неприпуÑтима Ñторінка в блоці %u Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %s" -#: commands/aggregatecmds.c:170 +#: commands/aggregatecmds.c:167 #, c-format msgid "only ordered-set aggregates can be hypothetical" msgstr "гіпотетичними можуть бути тільки впорÑдковані агрегати" -#: commands/aggregatecmds.c:195 +#: commands/aggregatecmds.c:192 #, c-format msgid "aggregate attribute \"%s\" not recognized" msgstr "атрибут агрегату \"%s\" не розпізнано" -#: commands/aggregatecmds.c:205 +#: commands/aggregatecmds.c:202 #, c-format msgid "aggregate stype must be specified" msgstr "у визначенні агрегату необхідно вказати stype" -#: commands/aggregatecmds.c:209 +#: commands/aggregatecmds.c:206 #, c-format msgid "aggregate sfunc must be specified" msgstr "в визначенні агрегату потребуєтьÑÑ sfunc" -#: commands/aggregatecmds.c:221 +#: commands/aggregatecmds.c:218 #, c-format msgid "aggregate msfunc must be specified when mstype is specified" msgstr "в визначенні агрегату потребуєтьÑÑ msfunc, коли mstype визначений" -#: commands/aggregatecmds.c:225 +#: commands/aggregatecmds.c:222 #, c-format msgid "aggregate minvfunc must be specified when mstype is specified" msgstr "в визначенні агрегату потребуєтьÑÑ minvfunc, коли mstype визначений" -#: commands/aggregatecmds.c:232 +#: commands/aggregatecmds.c:229 #, c-format msgid "aggregate msfunc must not be specified without mstype" msgstr "msfunc Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ñƒ не повинна визначатиÑÑŒ без mstype" -#: commands/aggregatecmds.c:236 +#: commands/aggregatecmds.c:233 #, c-format msgid "aggregate minvfunc must not be specified without mstype" msgstr "minvfunc Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ñƒ не повинна визначатиÑÑŒ без mstype" -#: commands/aggregatecmds.c:240 +#: commands/aggregatecmds.c:237 #, c-format msgid "aggregate mfinalfunc must not be specified without mstype" msgstr "mfinalfunc Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ñƒ не повинна визначатиÑÑŒ без mstype" -#: commands/aggregatecmds.c:244 +#: commands/aggregatecmds.c:241 #, c-format msgid "aggregate msspace must not be specified without mstype" msgstr "msspace Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ñƒ не повинна визначатиÑÑŒ без mstype" -#: commands/aggregatecmds.c:248 +#: commands/aggregatecmds.c:245 #, c-format msgid "aggregate minitcond must not be specified without mstype" msgstr "minitcond Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ñƒ не повинна визначатиÑÑŒ без mstype" -#: commands/aggregatecmds.c:277 +#: commands/aggregatecmds.c:274 #, c-format msgid "aggregate input type must be specified" msgstr "Ñлід указати тип агрегату вводу" -#: commands/aggregatecmds.c:307 +#: commands/aggregatecmds.c:304 #, c-format msgid "basetype is redundant with aggregate input type specification" msgstr "в визначенні агрегату з зазначеннÑм вхідного типу не потрібен базовий тип" -#: commands/aggregatecmds.c:350 commands/aggregatecmds.c:391 +#: commands/aggregatecmds.c:347 commands/aggregatecmds.c:388 #, c-format msgid "aggregate transition data type cannot be %s" msgstr "тип даних агрегату транзакції не може бути %s" -#: commands/aggregatecmds.c:362 +#: commands/aggregatecmds.c:359 #, c-format msgid "serialization functions may be specified only when the aggregate transition data type is %s" msgstr "функції Ñеріалізації можуть визначатиÑÑŒ, лише коли перехідний тип даних агрегату %s" -#: commands/aggregatecmds.c:372 +#: commands/aggregatecmds.c:369 #, c-format msgid "must specify both or neither of serialization and deserialization functions" msgstr "повинні визначатиÑÑŒ обидві або жодна з Ñеріалізуючих та деÑеріалізуючих функцій" -#: commands/aggregatecmds.c:437 commands/functioncmds.c:643 +#: commands/aggregatecmds.c:434 commands/functioncmds.c:634 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "параметр \"parallel\" має мати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ SAFE, RESTRICTED, або UNSAFE" -#: commands/aggregatecmds.c:493 +#: commands/aggregatecmds.c:490 #, c-format msgid "parameter \"%s\" must be READ_ONLY, SHAREABLE, or READ_WRITE" msgstr "параметр \"%s\" має мати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ READ_ONLY, SHAREABLE, або READ_WRITE" -#: commands/alter.c:84 commands/event_trigger.c:174 +#: commands/alter.c:83 commands/event_trigger.c:191 #, c-format msgid "event trigger \"%s\" already exists" msgstr "тригер подій \"%s\" вже Ñ–Ñнує" -#: commands/alter.c:87 commands/foreigncmds.c:593 +#: commands/alter.c:86 commands/foreigncmds.c:593 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "джерело Ñторонніх даних \"%s\" вже Ñ–Ñнує" -#: commands/alter.c:90 commands/foreigncmds.c:884 +#: commands/alter.c:89 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "Ñервер \"%s\" вже Ñ–Ñнує" -#: commands/alter.c:93 commands/proclang.c:133 +#: commands/alter.c:92 commands/proclang.c:131 #, c-format msgid "language \"%s\" already exists" msgstr "мова \"%s\" вже Ñ–Ñнує" -#: commands/alter.c:96 commands/publicationcmds.c:792 +#: commands/alter.c:95 commands/publicationcmds.c:764 #, c-format msgid "publication \"%s\" already exists" msgstr "Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ \"%s\" вже Ñ–Ñнує" -#: commands/alter.c:99 commands/subscriptioncmds.c:569 +#: commands/alter.c:98 commands/subscriptioncmds.c:669 #, c-format msgid "subscription \"%s\" already exists" msgstr "підпиÑка \"%s\" вже Ñ–Ñнує" -#: commands/alter.c:122 +#: commands/alter.c:121 #, c-format msgid "conversion \"%s\" already exists in schema \"%s\"" msgstr "Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ \"%s\" вже Ñ–Ñнує в Ñхемі \"%s\"" -#: commands/alter.c:126 +#: commands/alter.c:125 #, c-format msgid "statistics object \"%s\" already exists in schema \"%s\"" msgstr "об'єкт ÑтатиÑтики \"%s\" вже Ñ–Ñнує в Ñхемі \"%s\"" -#: commands/alter.c:130 +#: commands/alter.c:129 #, c-format msgid "text search parser \"%s\" already exists in schema \"%s\"" msgstr "парÑер текÑтового пошуку \"%s\" вже Ñ–Ñнує в Ñхемі \"%s\"" -#: commands/alter.c:134 +#: commands/alter.c:133 #, c-format msgid "text search dictionary \"%s\" already exists in schema \"%s\"" msgstr "Ñловник текÑтового пошуку \"%s\" вже Ñ–Ñнує в Ñхемі \"%s\"" -#: commands/alter.c:138 +#: commands/alter.c:137 #, c-format msgid "text search template \"%s\" already exists in schema \"%s\"" msgstr "шаблон текÑтового пошуку \"%s\" вже Ñ–Ñнує в Ñхемі \"%s\"" -#: commands/alter.c:142 +#: commands/alter.c:141 #, c-format msgid "text search configuration \"%s\" already exists in schema \"%s\"" msgstr "ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐºÑтового пошуку \"%s\" вже Ñ–Ñнує в Ñхемі \"%s\"" -#: commands/alter.c:215 +#: commands/alter.c:214 #, c-format msgid "must be superuser to rename %s" msgstr "перейменувати %s може тільки ÑуперкориÑтувач" -#: commands/alter.c:746 +#: commands/alter.c:256 commands/subscriptioncmds.c:648 +#: commands/subscriptioncmds.c:1129 commands/subscriptioncmds.c:1212 +#: commands/subscriptioncmds.c:1918 +#, c-format +msgid "password_required=false is superuser-only" +msgstr "password_required=false тільки Ð´Ð»Ñ ÑуперкориÑтувачів" + +#: commands/alter.c:257 commands/subscriptioncmds.c:649 +#: commands/subscriptioncmds.c:1130 commands/subscriptioncmds.c:1213 +#: commands/subscriptioncmds.c:1919 +#, c-format +msgid "Subscriptions with the password_required option set to false may only be created or modified by the superuser." +msgstr "ПідпиÑки з налаштуваннÑм password_required=false можуть бути Ñтворені або змінені тільки ÑуперкориÑтувачем." + +#: commands/alter.c:735 #, c-format msgid "must be superuser to set schema of %s" msgstr "вÑтановити Ñхему об'єкту %s може тільки ÑуперкориÑтувач" @@ -6234,7 +6622,7 @@ msgstr "Тільки ÑуперкориÑтувач може Ñтворити м msgid "access method \"%s\" already exists" msgstr "метод доÑтупу \"%s\" вже Ñ–Ñнує" -#: commands/amcmds.c:154 commands/indexcmds.c:213 commands/indexcmds.c:833 +#: commands/amcmds.c:154 commands/indexcmds.c:224 commands/indexcmds.c:850 #: commands/opclasscmds.c:375 commands/opclasscmds.c:833 #, c-format msgid "access method \"%s\" does not exist" @@ -6245,94 +6633,94 @@ msgstr "методу доÑтупу \"%s\" не Ñ–Ñнує" msgid "handler function is not specified" msgstr "функціÑ-обробник не вказана" -#: commands/amcmds.c:264 commands/event_trigger.c:183 -#: commands/foreigncmds.c:489 commands/proclang.c:80 commands/trigger.c:713 -#: parser/parse_clause.c:942 +#: commands/amcmds.c:264 commands/event_trigger.c:200 +#: commands/foreigncmds.c:489 commands/proclang.c:78 commands/trigger.c:702 +#: parser/parse_clause.c:943 #, c-format msgid "function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %s повинна повертати тип %s" -#: commands/analyze.c:228 +#: commands/analyze.c:217 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "пропуÑк об'єкту \"%s\" --- неможливо аналізувати цю Ñторонню таблицю" -#: commands/analyze.c:245 +#: commands/analyze.c:234 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "пропуÑк об'єкту \"%s\" --- неможливо аналізувати не-таблиці або Ñпеціальні ÑиÑтемні таблиці" -#: commands/analyze.c:325 +#: commands/analyze.c:314 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "аналізуєтьÑÑ Ð´ÐµÑ€ÐµÐ²Ð¾ наÑÐ»Ñ–Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s.%s\"" -#: commands/analyze.c:330 +#: commands/analyze.c:319 #, c-format msgid "analyzing \"%s.%s\"" msgstr "аналіз \"%s.%s\"" -#: commands/analyze.c:396 +#: commands/analyze.c:385 #, c-format msgid "column \"%s\" of relation \"%s\" appears more than once" msgstr "Ñтовпець \"%s\" відноÑно \"%s\" з'ÑвлÑєтьÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ одного разу" -#: commands/analyze.c:787 +#: commands/analyze.c:785 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" msgstr "автоматичний аналіз таблиці \"%s.%s.%s\"\n" -#: commands/analyze.c:1334 +#: commands/analyze.c:1300 #, c-format msgid "\"%s\": scanned %d of %u pages, containing %.0f live rows and %.0f dead rows; %d rows in sample, %.0f estimated total rows" msgstr "\"%s\": проÑкановано %d з %u Ñторінок, вони міÑÑ‚Ñть %.0f живих Ñ€Ñдків Ñ– %.0f мертвих Ñ€Ñдків; %d Ñ€Ñдків вибрані; %.0f приблизне загальне чиÑло Ñ€Ñдків" -#: commands/analyze.c:1414 +#: commands/analyze.c:1384 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no child tables" msgstr "пропуÑкаєтьÑÑ Ð°Ð½Ð°Ð»Ñ–Ð· дерева наÑÐ»Ñ–Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s.%s\" --- це дерево наÑÐ»Ñ–Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ міÑтить дочірніх таблиць" -#: commands/analyze.c:1512 +#: commands/analyze.c:1482 #, c-format msgid "skipping analyze of \"%s.%s\" inheritance tree --- this inheritance tree contains no analyzable child tables" msgstr "пропуÑкаєтьÑÑ Ð°Ð½Ð°Ð»Ñ–Ð· дерева наÑÐ»Ñ–Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s.%s\" --- це дерево наÑÐ»Ñ–Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ міÑтить аналізуючих дочірніх таблиць" -#: commands/async.c:646 +#: commands/async.c:612 #, c-format msgid "channel name cannot be empty" msgstr "ім'Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ не може бути пуÑтим" -#: commands/async.c:652 +#: commands/async.c:618 #, c-format msgid "channel name too long" msgstr "ім'Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ задовге" -#: commands/async.c:657 +#: commands/async.c:623 #, c-format msgid "payload string too long" msgstr "Ñ€Ñдок Ð½Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð¾Ð²Ð³Ð¸Ð¹" -#: commands/async.c:876 +#: commands/async.c:842 #, c-format msgid "cannot PREPARE a transaction that has executed LISTEN, UNLISTEN, or NOTIFY" msgstr "виконати PREPARE Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ—, Ñка виконала LISTEN, UNLISTEN або NOTIFY неможливо" -#: commands/async.c:980 +#: commands/async.c:946 #, c-format msgid "too many notifications in the NOTIFY queue" msgstr "занадто багато Ñповіщень у черзі NOTIFY" -#: commands/async.c:1602 +#: commands/async.c:1553 #, c-format msgid "NOTIFY queue is %.0f%% full" msgstr "Черга NOTIFY заповнена на %.0f%%" -#: commands/async.c:1604 +#: commands/async.c:1555 #, c-format msgid "The server process with PID %d is among those with the oldest transactions." msgstr "Серверний Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð· PID %d Ñеред процеÑів з найдавнішими транзакціÑми." -#: commands/async.c:1607 +#: commands/async.c:1558 #, c-format msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "Черга NOTIFY не може бути Ñпорожненою, поки цей Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½Ðµ завершить поточну транзакцію." @@ -6342,193 +6730,213 @@ msgstr "Черга NOTIFY не може бути Ñпорожненою, пок msgid "unrecognized CLUSTER option \"%s\"" msgstr "нерозпізнаний параметр CLUSTER \"%s\"" -#: commands/cluster.c:158 commands/cluster.c:431 +#: commands/cluster.c:159 commands/cluster.c:433 #, c-format msgid "cannot cluster temporary tables of other sessions" msgstr "не можна клаÑтеризувати тимчаÑові таблиці з інших ÑеанÑів" -#: commands/cluster.c:176 +#: commands/cluster.c:177 #, c-format msgid "there is no previously clustered index for table \"%s\"" msgstr "немає попереднього клаÑтеризованого індекÑу Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: commands/cluster.c:190 commands/tablecmds.c:14084 commands/tablecmds.c:15978 +#: commands/cluster.c:191 commands/tablecmds.c:14828 commands/tablecmds.c:16760 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ñ†Ñ– \"%s\" не Ñ–Ñнує" -#: commands/cluster.c:420 +#: commands/cluster.c:422 #, c-format msgid "cannot cluster a shared catalog" msgstr "не можна клаÑтеризувати Ñпільний каталог" -#: commands/cluster.c:435 +#: commands/cluster.c:437 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "не можна очищати тимчаÑові таблиці з інших ÑеанÑів" -#: commands/cluster.c:511 commands/tablecmds.c:15988 +#: commands/cluster.c:513 commands/tablecmds.c:16770 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" не Ñ” індекÑом Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: commands/cluster.c:519 +#: commands/cluster.c:521 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð·Ð° індекÑом \"%s\" неможлива, тому що метод доÑтупу не підтримує клаÑтеризацію" -#: commands/cluster.c:531 +#: commands/cluster.c:533 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "неможливо клаÑтеризувати за Ñекційним індекÑом \"%s\"" -#: commands/cluster.c:545 +#: commands/cluster.c:547 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "неможливо клаÑтеризувати за невірним індекÑом \"%s\"" -#: commands/cluster.c:569 +#: commands/cluster.c:571 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "неможливо помітити Ñ–Ð½Ð´ÐµÐºÑ ÐºÐ»Ð°Ñтеризованим в Ñекційній таблиці" -#: commands/cluster.c:948 +#: commands/cluster.c:956 #, c-format msgid "clustering \"%s.%s\" using index scan on \"%s\"" msgstr "клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ñ–Ñ \"%s.%s\" з викориÑтаннÑм ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу \"%s\"" -#: commands/cluster.c:954 +#: commands/cluster.c:962 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ñ–Ñ \"%s.%s\"з викориÑтаннÑм поÑлідовного ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° ÑортуваннÑ" -#: commands/cluster.c:959 +#: commands/cluster.c:967 #, c-format msgid "vacuuming \"%s.%s\"" msgstr "Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ \"%s.%s\"" -#: commands/cluster.c:985 +#: commands/cluster.c:994 #, c-format msgid "\"%s.%s\": found %.0f removable, %.0f nonremovable row versions in %u pages" msgstr "\"%s.%s\": знайдено верÑій Ñ€Ñдків, що можуть бути видалені %.0f, що не можуть бути видалені %.0f, переглÑнуто Ñторінок %u" -#: commands/cluster.c:990 +#: commands/cluster.c:999 #, c-format -msgid "" -"%.0f dead row versions cannot be removed yet.\n" +msgid "%.0f dead row versions cannot be removed yet.\n" "%s." -msgstr "" -"%.0f \"мертві\" верÑÑ–Ñ— Ñ€Ñдків доÑÑ– не можуть бути видалені.\n" +msgstr "%.0f \"мертві\" верÑÑ–Ñ— Ñ€Ñдків доÑÑ– не можуть бути видалені.\n" "%s." -#: commands/collationcmds.c:106 +#: commands/cluster.c:1744 +#, c-format +msgid "permission denied to cluster \"%s\", skipping it" +msgstr "відмовлено в дозволі клаÑтеру \"%s\", пропуÑк" + +#: commands/collationcmds.c:110 #, c-format msgid "collation attribute \"%s\" not recognized" msgstr "атрибут collation \"%s\" не розпізнаний" -#: commands/collationcmds.c:119 commands/collationcmds.c:125 -#: commands/define.c:356 commands/tablecmds.c:7768 -#: replication/pgoutput/pgoutput.c:311 replication/pgoutput/pgoutput.c:334 -#: replication/pgoutput/pgoutput.c:348 replication/pgoutput/pgoutput.c:358 -#: replication/pgoutput/pgoutput.c:368 replication/pgoutput/pgoutput.c:378 -#: replication/walsender.c:1002 replication/walsender.c:1024 -#: replication/walsender.c:1034 +#: commands/collationcmds.c:123 commands/collationcmds.c:129 +#: commands/define.c:388 commands/tablecmds.c:8160 +#: replication/pgoutput/pgoutput.c:314 replication/pgoutput/pgoutput.c:337 +#: replication/pgoutput/pgoutput.c:351 replication/pgoutput/pgoutput.c:361 +#: replication/pgoutput/pgoutput.c:371 replication/pgoutput/pgoutput.c:381 +#: replication/pgoutput/pgoutput.c:393 replication/walsender.c:1146 +#: replication/walsender.c:1168 replication/walsender.c:1178 +#: replication/walsender.c:1187 replication/walsender.c:1426 #, c-format msgid "conflicting or redundant options" msgstr "конфліктуючі або надлишкові параметри" -#: commands/collationcmds.c:120 +#: commands/collationcmds.c:124 #, c-format msgid "LOCALE cannot be specified together with LC_COLLATE or LC_CTYPE." msgstr "LOCALE не може вказуватиÑÑŒ разом з LC_COLLATE або LC_CTYPE." -#: commands/collationcmds.c:126 +#: commands/collationcmds.c:130 #, c-format msgid "FROM cannot be specified together with any other options." msgstr "FROM не можна вказувати разом з будь-Ñкими іншими параметрами." -#: commands/collationcmds.c:174 +#: commands/collationcmds.c:189 #, c-format msgid "collation \"default\" cannot be copied" msgstr "ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"за замовчуваннÑм\" не може бути Ñкопійовано" -#: commands/collationcmds.c:204 +#: commands/collationcmds.c:225 #, c-format msgid "unrecognized collation provider: %s" msgstr "нерозпізнаний поÑтачальник правил ÑортуваннÑ: %s" -#: commands/collationcmds.c:232 -#, c-format -msgid "parameter \"lc_collate\" must be specified" -msgstr "необхідно вказати параметр \"lc_collate\"" - -#: commands/collationcmds.c:237 +#: commands/collationcmds.c:253 commands/collationcmds.c:264 +#: commands/collationcmds.c:270 commands/collationcmds.c:278 #, c-format -msgid "parameter \"lc_ctype\" must be specified" -msgstr "необхідно вказати параметр \"lc_ctype\"" +msgid "parameter \"%s\" must be specified" +msgstr "необхідно вказати параметр \"%s\"" -#: commands/collationcmds.c:244 +#: commands/collationcmds.c:293 commands/dbcommands.c:1134 #, c-format -msgid "parameter \"locale\" must be specified" -msgstr "необхідно вказати параметр \"locale\"" +msgid "using standard form \"%s\" for ICU locale \"%s\"" +msgstr "викориÑÑ‚Ð°Ð½Ð½Ñ Ñтандартної форми \"%s\" Ð´Ð»Ñ Ð¼Ð¾Ð²Ð¸ ICU \"%s\"" -#: commands/collationcmds.c:256 +#: commands/collationcmds.c:312 #, c-format msgid "nondeterministic collations not supported with this provider" msgstr "недетерміновані правила ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ Ñ†Ð¸Ð¼ провайдером" -#: commands/collationcmds.c:275 +#: commands/collationcmds.c:317 commands/dbcommands.c:1087 +#, c-format +msgid "ICU rules cannot be specified unless locale provider is ICU" +msgstr "Правила ICU не можна вказати, Ñкщо поÑтачальник локалі не ICU" + +#: commands/collationcmds.c:340 #, c-format msgid "current database's encoding is not supported with this provider" msgstr "ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— бази даних не підтримуєтьÑÑ Ñ†Ð¸Ð¼ провайдером" -#: commands/collationcmds.c:334 +#: commands/collationcmds.c:409 #, c-format msgid "collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"" msgstr "правило ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" Ð´Ð»Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" вже Ñ–Ñнує в Ñхемі \"%s\"" -#: commands/collationcmds.c:345 +#: commands/collationcmds.c:420 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "правило ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" вже Ñ–Ñнує в Ñхемі \"%s\"" -#: commands/collationcmds.c:395 commands/dbcommands.c:2402 +#: commands/collationcmds.c:445 +#, c-format +msgid "cannot refresh version of default collation" +msgstr "оновити верÑÑ–ÑŽ правила ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° замовчуваннÑм не можна" + +#. translator: %s is an SQL command +#. translator: %s is an SQL ALTER command +#: commands/collationcmds.c:447 commands/subscriptioncmds.c:1376 +#: commands/tablecmds.c:7936 commands/tablecmds.c:7946 +#: commands/tablecmds.c:7948 commands/tablecmds.c:14530 +#: commands/tablecmds.c:17915 commands/tablecmds.c:17936 +#: commands/typecmds.c:3787 commands/typecmds.c:3872 commands/typecmds.c:4226 +#, c-format +msgid "Use %s instead." +msgstr "ВикориÑтайте %s заміÑть цього." + +#: commands/collationcmds.c:480 commands/dbcommands.c:2566 #, c-format msgid "changing version from %s to %s" msgstr "зміна верÑÑ–Ñ— з %s на %s" -#: commands/collationcmds.c:410 commands/dbcommands.c:2415 +#: commands/collationcmds.c:495 commands/dbcommands.c:2579 #, c-format msgid "version has not changed" msgstr "верÑÑ–ÑŽ не змінено" -#: commands/collationcmds.c:532 +#: commands/collationcmds.c:528 commands/dbcommands.c:2749 #, c-format -msgid "could not convert locale name \"%s\" to language tag: %s" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ локальну назву \"%s\" на мітку мови: %s" +msgid "database with OID %u does not exist" +msgstr "база даних з OID %u не Ñ–Ñнує" -#: commands/collationcmds.c:590 +#: commands/collationcmds.c:554 #, c-format -msgid "must be superuser to import system collations" -msgstr "імпортувати ÑиÑтмені правила ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ тільки ÑуперкориÑтувач" +msgid "collation with OID %u does not exist" +msgstr "порÑдку ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ %u з OID не Ñ–Ñнує" -#: commands/collationcmds.c:618 commands/copyfrom.c:1499 commands/copyto.c:679 -#: libpq/be-secure-common.c:81 +#: commands/collationcmds.c:848 #, c-format -msgid "could not execute command \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ команду \"%s\": %m" +msgid "must be superuser to import system collations" +msgstr "імпортувати ÑиÑтмені правила ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ тільки ÑуперкориÑтувач" -#: commands/collationcmds.c:753 +#: commands/collationcmds.c:968 commands/collationcmds.c:1053 #, c-format msgid "no usable system locales were found" msgstr "придатні ÑиÑтемні локалі не знайдені" -#: commands/comment.c:61 commands/dbcommands.c:1542 commands/dbcommands.c:1739 -#: commands/dbcommands.c:1852 commands/dbcommands.c:2046 -#: commands/dbcommands.c:2288 commands/dbcommands.c:2375 -#: commands/dbcommands.c:2485 commands/dbcommands.c:2984 -#: utils/init/postinit.c:942 utils/init/postinit.c:1047 -#: utils/init/postinit.c:1064 +#: commands/comment.c:61 commands/dbcommands.c:1665 commands/dbcommands.c:1883 +#: commands/dbcommands.c:1995 commands/dbcommands.c:2193 +#: commands/dbcommands.c:2433 commands/dbcommands.c:2526 +#: commands/dbcommands.c:2650 commands/dbcommands.c:3161 +#: utils/init/postinit.c:1034 utils/init/postinit.c:1098 +#: utils/init/postinit.c:1171 #, c-format msgid "database \"%s\" does not exist" msgstr "бази даних \"%s\" не Ñ–Ñнує" @@ -6538,327 +6946,345 @@ msgstr "бази даних \"%s\" не Ñ–Ñнує" msgid "cannot set comment on relation \"%s\"" msgstr "вÑтановити коментар Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не можна" -#: commands/constraint.c:63 utils/adt/ri_triggers.c:2014 +#: commands/constraint.c:61 utils/adt/ri_triggers.c:2019 #, c-format msgid "function \"%s\" was not called by trigger manager" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" не була викликана менеджером тригерів" -#: commands/constraint.c:70 utils/adt/ri_triggers.c:2023 +#: commands/constraint.c:68 utils/adt/ri_triggers.c:2028 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" повинна запуÑкатиÑÑ Ð² AFTER ROW" -#: commands/constraint.c:84 +#: commands/constraint.c:82 #, c-format msgid "function \"%s\" must be fired for INSERT or UPDATE" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" повинна запуÑкатиÑÑ Ð´Ð»Ñ INSERT або UPDATE" -#: commands/conversioncmds.c:67 +#: commands/conversioncmds.c:62 #, c-format msgid "source encoding \"%s\" does not exist" msgstr "вихідного ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: commands/conversioncmds.c:74 +#: commands/conversioncmds.c:69 #, c-format msgid "destination encoding \"%s\" does not exist" msgstr "цільового ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: commands/conversioncmds.c:87 +#: commands/conversioncmds.c:82 #, c-format msgid "encoding conversion to or from \"SQL_ASCII\" is not supported" msgstr "Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð² або з \"SQL_ASCII\" не підтримуєтьÑÑ" -#: commands/conversioncmds.c:100 +#: commands/conversioncmds.c:95 #, c-format msgid "encoding conversion function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ %s повинна повертати тип %s" -#: commands/conversioncmds.c:130 +#: commands/conversioncmds.c:125 #, c-format msgid "encoding conversion function %s returned incorrect result for empty input" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ %s повернула неправильний результат Ð´Ð»Ñ Ð¿Ð¾Ñ€Ð¾Ð¶Ð½ÑŒÐ¾Ð³Ð¾ вводу" -#: commands/copy.c:86 +#: commands/copy.c:84 +#, c-format +msgid "permission denied to COPY to or from an external program" +msgstr "немає дозволу Ð´Ð»Ñ COPY в або з зовнішньої програми" + +#: commands/copy.c:85 #, c-format -msgid "must be superuser or have privileges of the pg_execute_server_program role to COPY to or from an external program" -msgstr "Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ COPY із зовнішніми програмами потрібно бути ÑуперкориÑтувачем або мати права ролі pg_execute_server_program" +msgid "Only roles with privileges of the \"%s\" role may COPY to or from an external program." +msgstr "Тільки ролі з правами \"%s\" можуть виконувати COPY з зовнішньою програмою." -#: commands/copy.c:87 commands/copy.c:96 commands/copy.c:103 +#: commands/copy.c:87 commands/copy.c:98 commands/copy.c:107 #, c-format msgid "Anyone can COPY to stdout or from stdin. psql's \\copy command also works for anyone." msgstr "Будь-хто може викориÑтати COPY to stdout або from stdin, а також команду psql \\copy." #: commands/copy.c:95 #, c-format -msgid "must be superuser or have privileges of the pg_read_server_files role to COPY from a file" -msgstr "Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ COPY з файлу потрібно бути ÑуперкориÑтувачем або мати права ролі pg_read_server_files" +msgid "permission denied to COPY from a file" +msgstr "немає дозволу Ð´Ð»Ñ COPY з файлу" + +#: commands/copy.c:96 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may COPY from a file." +msgstr "Тільки ролі з правами \"%s\" можуть виконувати COPY з файлу." + +#: commands/copy.c:104 +#, c-format +msgid "permission denied to COPY to a file" +msgstr "немає дозволу Ð´Ð»Ñ COPY в файл" -#: commands/copy.c:102 +#: commands/copy.c:105 #, c-format -msgid "must be superuser or have privileges of the pg_write_server_files role to COPY to a file" -msgstr "Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ COPY до файлу потрібно бути ÑуперкориÑтувачем або мати права ролі pg_write_server_files" +msgid "Only roles with privileges of the \"%s\" role may COPY to a file." +msgstr "Тільки ролі з правами \"%s\" можуть виконувати COPY в файл." -#: commands/copy.c:188 +#: commands/copy.c:193 #, c-format msgid "COPY FROM not supported with row-level security" msgstr "COPY FROM не підтримуєтьÑÑ Ñ–Ð· захиÑтом на рівні Ñ€Ñдків" -#: commands/copy.c:189 +#: commands/copy.c:194 #, c-format msgid "Use INSERT statements instead." msgstr "ВикориÑтайте оператори INSERT заміÑть цього." -#: commands/copy.c:280 -#, c-format -msgid "MERGE not supported in COPY" -msgstr "COPY не підтримує MERGE" - -#: commands/copy.c:373 +#: commands/copy.c:375 #, c-format msgid "cannot use \"%s\" with HEADER in COPY TO" msgstr "викориÑтовувати \"%s\" з HEADER в COPY TO не можна" -#: commands/copy.c:382 +#: commands/copy.c:384 #, c-format msgid "%s requires a Boolean value or \"match\"" msgstr "%s потребує Boolean або \"відповідніÑть\"" -#: commands/copy.c:441 +#. translator: first %s is the name of a COPY option, e.g. ON_ERROR, +#. second %s is a COPY with direction, e.g. COPY TO +#: commands/copy.c:402 commands/copy.c:782 commands/copy.c:798 +#: commands/copy.c:815 commands/copy.c:841 commands/copy.c:851 +#, c-format +msgid "COPY %s cannot be used with %s" +msgstr "COPY %s не можна викориÑтовувати з %s" + +#. translator: first %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:416 commands/copy.c:441 +#, c-format +msgid "COPY %s \"%s\" not recognized" +msgstr "COPY %s \"%s\" не розпізнано" + +#: commands/copy.c:502 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "Формат \"%s\" Ð´Ð»Ñ COPY не розпізнано" -#: commands/copy.c:493 commands/copy.c:506 commands/copy.c:519 -#: commands/copy.c:538 +#: commands/copy.c:560 commands/copy.c:575 commands/copy.c:590 +#: commands/copy.c:609 #, c-format msgid "argument to option \"%s\" must be a list of column names" msgstr "аргументом функції \"%s\" повинен бути ÑпиÑок імен Ñтовпців" -#: commands/copy.c:550 +#: commands/copy.c:621 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "аргументом функції \"%s\" повинне бути припуÑтиме ім'Ñ ÐºÐ¾Ð´Ñƒ" -#: commands/copy.c:557 commands/dbcommands.c:856 commands/dbcommands.c:2236 +#: commands/copy.c:642 commands/dbcommands.c:866 commands/dbcommands.c:2381 #, c-format msgid "option \"%s\" not recognized" msgstr "параметр \"%s\" не розпізнано" -#: commands/copy.c:569 +#. translator: %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:655 commands/copy.c:660 commands/copy.c:665 +#: commands/copy.c:740 #, c-format -msgid "cannot specify DELIMITER in BINARY mode" -msgstr "неможливо визначити DELIMITER в режимі BINARY" +msgid "cannot specify %s in BINARY mode" +msgstr "не можна вказати %s в режимі BINARY" -#: commands/copy.c:574 +#: commands/copy.c:670 #, c-format -msgid "cannot specify NULL in BINARY mode" -msgstr "неможливо визначити NULL в режимі BINARY" +msgid "only ON_ERROR STOP is allowed in BINARY mode" +msgstr "в режимі BINARY допуÑкаєтьÑÑ Ð»Ð¸ÑˆÐµ ON_ERROR STOP" -#: commands/copy.c:596 +#: commands/copy.c:692 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "роздільник Ð´Ð»Ñ COPY повинен бути однобайтовим Ñимволом" -#: commands/copy.c:603 +#: commands/copy.c:699 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "Роздільник Ð´Ð»Ñ COPY не може бути Ñимволом нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸" -#: commands/copy.c:609 +#: commands/copy.c:705 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ NULL Ð´Ð»Ñ COPY не може включати Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸" -#: commands/copy.c:626 +#: commands/copy.c:715 #, c-format -msgid "COPY delimiter cannot be \"%s\"" -msgstr "роздільник COPY не може бути \"%s\"" +msgid "COPY default representation cannot use newline or carriage return" +msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ð´Ð»Ñ COPY за замовчуваннÑм не може включати Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸" -#: commands/copy.c:632 +#: commands/copy.c:733 #, c-format -msgid "cannot specify HEADER in BINARY mode" -msgstr "не можна вказати HEADER у режимі BINARY" +msgid "COPY delimiter cannot be \"%s\"" +msgstr "роздільник COPY не може бути \"%s\"" -#: commands/copy.c:638 +#. translator: %s is the name of a COPY option, e.g. ON_ERROR +#: commands/copy.c:747 commands/copy.c:764 commands/copy.c:776 +#: commands/copy.c:791 commands/copy.c:807 #, c-format -msgid "COPY quote available only in CSV mode" -msgstr "лапки Ð´Ð»Ñ COPY доуÑтпні тільки в режимі CSV" +msgid "COPY %s requires CSV mode" +msgstr "Ð”Ð»Ñ COPY %s потрібен режим CSV" -#: commands/copy.c:643 +#: commands/copy.c:752 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "лапки Ð´Ð»Ñ COPY повинні бути однобайтовим Ñимволом" -#: commands/copy.c:648 +#: commands/copy.c:757 #, c-format msgid "COPY delimiter and quote must be different" msgstr "роздільник Ñ– лапки Ð´Ð»Ñ COPY повинні бути різними" -#: commands/copy.c:654 -#, c-format -msgid "COPY escape available only in CSV mode" -msgstr "вихід Ð´Ð»Ñ COPY доÑтупний тільки в режимі CSV" - -#: commands/copy.c:659 +#: commands/copy.c:769 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "вихід Ð´Ð»Ñ COPY повинен бути однобайтовим Ñимволом" -#: commands/copy.c:665 -#, c-format -msgid "COPY force quote available only in CSV mode" -msgstr "Параметр force quote Ð´Ð»Ñ COPY можна викориÑтати тільки в режимі CSV" - -#: commands/copy.c:669 -#, c-format -msgid "COPY force quote only available using COPY TO" -msgstr "Параметр force quote Ð´Ð»Ñ COPY можна викориÑтати тільки з COPY TO" - -#: commands/copy.c:675 -#, c-format -msgid "COPY force not null available only in CSV mode" -msgstr "Параметр force not null Ð´Ð»Ñ COPY можна викориÑтати тільки в режимі CSV" - -#: commands/copy.c:679 -#, c-format -msgid "COPY force not null only available using COPY FROM" -msgstr "Параметр force not null Ð´Ð»Ñ COPY можна викориÑтати тільки з COPY FROM" - -#: commands/copy.c:685 -#, c-format -msgid "COPY force null available only in CSV mode" -msgstr "Параметр force null Ð´Ð»Ñ COPY можна викориÑтати тільки в режимі CSV" - -#: commands/copy.c:690 +#. translator: %s is the name of a COPY option, e.g. NULL +#: commands/copy.c:823 commands/copy.c:859 #, c-format -msgid "COPY force null only available using COPY FROM" -msgstr "Параметр force null only Ð´Ð»Ñ COPY можна викориÑтати тільки з COPY FROM" +msgid "COPY delimiter character must not appear in the %s specification" +msgstr "Ñимвол розділювача Ð´Ð»Ñ COPY не повинен з'ÑвлÑтиÑÑ Ð² Ñпецифікації %s" -#: commands/copy.c:696 +#. translator: %s is the name of a COPY option, e.g. NULL +#: commands/copy.c:832 commands/copy.c:868 #, c-format -msgid "COPY delimiter must not appear in the NULL specification" -msgstr "роздільник COPY не повинен з'ÑвлÑтиÑÑ Ñƒ Ñпецифікації NULL" +msgid "CSV quote character must not appear in the %s specification" +msgstr "лапки CSV не повинні з'ÑвлÑтиÑÑ Ñƒ Ñпецифікації %s" -#: commands/copy.c:703 +#: commands/copy.c:877 #, c-format -msgid "CSV quote character must not appear in the NULL specification" -msgstr "лапки CSV не повинні з'ÑвлÑтиÑÑ Ñƒ Ñпецифікації NULL" +msgid "NULL specification and DEFAULT specification cannot be the same" +msgstr "Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ NULL Ñ– ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ DEFAULT не може Ñпівпадати" -#: commands/copy.c:764 +#: commands/copy.c:939 #, c-format msgid "column \"%s\" is a generated column" msgstr "Ñтовпець \"%s\" Ñ” згенерованим Ñтовпцем" -#: commands/copy.c:766 +#: commands/copy.c:941 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "Згенеровані Ñтовпці не можна викориÑтовувати в COPY." -#: commands/copy.c:781 commands/indexcmds.c:1822 commands/statscmds.c:243 -#: commands/tablecmds.c:2379 commands/tablecmds.c:3035 -#: commands/tablecmds.c:3529 parser/parse_relation.c:3656 -#: parser/parse_relation.c:3676 utils/adt/tsvector_op.c:2685 +#: commands/copy.c:956 commands/indexcmds.c:1890 commands/statscmds.c:239 +#: commands/tablecmds.c:2526 commands/tablecmds.c:2997 +#: commands/tablecmds.c:3808 parser/parse_relation.c:3692 +#: parser/parse_relation.c:3702 parser/parse_relation.c:3720 +#: parser/parse_relation.c:3727 parser/parse_relation.c:3741 +#: utils/adt/tsvector_op.c:2853 #, c-format msgid "column \"%s\" does not exist" msgstr "ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" не Ñ–Ñнує" -#: commands/copy.c:788 commands/tablecmds.c:2405 commands/trigger.c:967 -#: parser/parse_target.c:1079 parser/parse_target.c:1090 +#: commands/copy.c:963 commands/tablecmds.c:2552 commands/trigger.c:951 +#: parser/parse_target.c:1083 parser/parse_target.c:1094 #, c-format msgid "column \"%s\" specified more than once" msgstr "Ñтовпець \"%s\" вказано більше чим один раз" -#: commands/copyfrom.c:123 +#: commands/copyfrom.c:118 +#, c-format +msgid "COPY %s" +msgstr "COPY %s" + +#: commands/copyfrom.c:126 #, c-format msgid "COPY %s, line %llu, column %s" msgstr "COPY %s, Ñ€Ñдок %llu, Ñтовпець %s" -#: commands/copyfrom.c:128 commands/copyfrom.c:174 +#: commands/copyfrom.c:131 commands/copyfrom.c:177 #, c-format msgid "COPY %s, line %llu" msgstr "COPY %s, Ñ€Ñдок %llu" -#: commands/copyfrom.c:140 +#: commands/copyfrom.c:143 #, c-format msgid "COPY %s, line %llu, column %s: \"%s\"" msgstr "COPY %s, Ñ€Ñдок %llu, Ñтовпець %s: \"%s\"" -#: commands/copyfrom.c:150 +#: commands/copyfrom.c:153 #, c-format msgid "COPY %s, line %llu, column %s: null input" msgstr "COPY %s, Ñ€Ñдок %llu, Ñтовпець %s: null введеннÑ" -#: commands/copyfrom.c:167 +#: commands/copyfrom.c:170 #, c-format msgid "COPY %s, line %llu: \"%s\"" msgstr "COPY %s, Ñ€Ñдок %llu: \"%s\"" -#: commands/copyfrom.c:569 +#: commands/copyfrom.c:673 #, c-format msgid "cannot copy to view \"%s\"" msgstr "неможливо Ñкопіювати до Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\"" -#: commands/copyfrom.c:571 +#: commands/copyfrom.c:675 #, c-format msgid "To enable copying to a view, provide an INSTEAD OF INSERT trigger." msgstr "Щоб Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð¾Ð¿ÑƒÑкало ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… у нього, вÑтановіть тригер INSTEAD OF INSERT." -#: commands/copyfrom.c:575 +#: commands/copyfrom.c:679 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "не можна копіювати матеріалізоване Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\"" -#: commands/copyfrom.c:580 +#: commands/copyfrom.c:684 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "неможливо Ñкопіювати поÑлідовніÑть \"%s\"" -#: commands/copyfrom.c:585 +#: commands/copyfrom.c:689 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "неможливо копіювати у Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\", Ñке не Ñ” таблицею" -#: commands/copyfrom.c:625 +#: commands/copyfrom.c:729 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "виконати COPY FREEZE в Ñекціонованій таблиці не можна" -#: commands/copyfrom.c:640 +#: commands/copyfrom.c:744 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "виконати COPY FREEZE через попередню активніÑть в транзакції не можна" -#: commands/copyfrom.c:646 +#: commands/copyfrom.c:750 #, c-format msgid "cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction" msgstr "не можна виконати COPY FREEZE, тому, що Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð½Ðµ була Ñтворена або Ñкорочена в поточній підтранзакції" -#: commands/copyfrom.c:1267 commands/copyto.c:611 +#: commands/copyfrom.c:1313 +#, c-format +msgid "%llu row was skipped due to data type incompatibility" +msgid_plural "%llu rows were skipped due to data type incompatibility" +msgstr[0] "РÑдок %llu пропущено через неÑуміÑніÑть типів даних" +msgstr[1] "РÑдки %llu пропущено через неÑуміÑніÑть типів даних" +msgstr[2] "РÑдки %llu пропущено через неÑуміÑніÑть типів даних" +msgstr[3] "РÑдки %llu пропущено через неÑуміÑніÑть типів даних" + +#. translator: first %s is the name of a COPY option, e.g. FORCE_NOT_NULL +#. translator: %s is the name of a COPY option, e.g. FORCE_NOT_NULL +#: commands/copyfrom.c:1448 commands/copyfrom.c:1491 commands/copyto.c:601 #, c-format -msgid "FORCE_NOT_NULL column \"%s\" not referenced by COPY" -msgstr "Стовпець FORCE_NOT_NULL \"%s\" не фігурує в COPY" +msgid "%s column \"%s\" not referenced by COPY" +msgstr "%s Ñтовпець \"%s\" не фігурує в COPY" -#: commands/copyfrom.c:1290 commands/copyto.c:634 +#: commands/copyfrom.c:1544 utils/mb/mbutils.c:385 #, c-format -msgid "FORCE_NULL column \"%s\" not referenced by COPY" -msgstr "Стовпець FORCE_NULL \"%s\" не фігурує в COPY" +msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" +msgstr "функції за замовчуваннÑм Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð· ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" в \"%s\" не Ñ–Ñнує" -#: commands/copyfrom.c:1518 +#: commands/copyfrom.c:1742 #, c-format msgid "COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \\copy." msgstr "COPY FROM наказує Ñерверному процеÑу PostgreSQL прочитати дані з файлу. Можливо, вам потрібна клієнтÑька команда, наприклад \\copy в psql." -#: commands/copyfrom.c:1531 commands/copyto.c:731 +#: commands/copyfrom.c:1755 commands/copyto.c:706 #, c-format msgid "\"%s\" is a directory" msgstr "\"%s\" - каталог" -#: commands/copyfrom.c:1599 commands/copyto.c:301 libpq/be-secure-common.c:105 +#: commands/copyfrom.c:1823 commands/copyto.c:299 libpq/be-secure-common.c:83 #, c-format msgid "could not close pipe to external command: %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ канал за допомогою зовнішньої команди: %m" -#: commands/copyfrom.c:1614 commands/copyto.c:306 +#: commands/copyfrom.c:1838 commands/copyto.c:304 #, c-format msgid "program \"%s\" failed" msgstr "збій програми \"%s\"" @@ -6899,25 +7325,25 @@ msgid "could not read from COPY file: %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл COPY: %m" #: commands/copyfromparse.c:278 commands/copyfromparse.c:303 -#: tcop/postgres.c:358 +#: replication/walsender.c:756 replication/walsender.c:782 tcop/postgres.c:381 #, c-format msgid "unexpected EOF on client connection with an open transaction" msgstr "неочікуваний обрив з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· клієнтом при відкритій транзакції" -#: commands/copyfromparse.c:294 +#: commands/copyfromparse.c:294 replication/walsender.c:772 #, c-format msgid "unexpected message type 0x%02X during COPY from stdin" msgstr "неочікуваний тип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ 0x%02X під Ñ‡Ð°Ñ COPY з stdin" -#: commands/copyfromparse.c:317 +#: commands/copyfromparse.c:317 replication/walsender.c:803 #, c-format msgid "COPY from stdin failed: %s" msgstr "помилка при stdin COPY: %s" #: commands/copyfromparse.c:785 #, c-format -msgid "wrong number of fields in header line: field count is %d, expected %d" -msgstr "неправильна кількіÑть полів у заголовку Ñ€Ñдка: кількіÑть полів %d, очікувалоÑÑŒ %d" +msgid "wrong number of fields in header line: got %d, expected %d" +msgstr "неправильна кількіÑть полів у Ñ€Ñдку заголовку: отримано %d, очікувалоÑÑŒ %d" #: commands/copyfromparse.c:801 #, c-format @@ -6929,430 +7355,497 @@ msgstr "невідповідніÑть назви ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð² полі з msgid "column name mismatch in header line field %d: got \"%s\", expected \"%s\"" msgstr "невідповідніÑть назви ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð² полі заголовку %d: отримано \"%s\", очікувалоÑÑŒ \"%s\"" -#: commands/copyfromparse.c:890 commands/copyfromparse.c:1495 -#: commands/copyfromparse.c:1725 +#: commands/copyfromparse.c:892 commands/copyfromparse.c:1554 +#: commands/copyfromparse.c:1810 #, c-format msgid "extra data after last expected column" msgstr "зайві дані піÑÐ»Ñ Ð²Ð¼Ñ–Ñту оÑтаннього ÑтовпцÑ" -#: commands/copyfromparse.c:904 +#: commands/copyfromparse.c:906 #, c-format msgid "missing data for column \"%s\"" msgstr "відÑутні дані Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: commands/copyfromparse.c:982 +#: commands/copyfromparse.c:990 +#, c-format +msgid "skipping row due to data type incompatibility at line %llu for column \"%s\": \"%s\"" +msgstr "пропуÑк Ñ€Ñдка через неÑуміÑніÑть типів даних в Ñ€Ñдку %llu Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\": \"%s\"" + +#: commands/copyfromparse.c:998 +#, c-format +msgid "skipping row due to data type incompatibility at line %llu for column \"%s\": null input" +msgstr "пропуÑк Ñ€Ñдка через неÑуміÑніÑть типів даних в Ñ€Ñдку %llu Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\": Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ null" + +#: commands/copyfromparse.c:1044 #, c-format msgid "received copy data after EOF marker" msgstr "піÑÐ»Ñ Ð¼Ð°Ñ€ÐºÐµÑ€Ð° ÐºÑ–Ð½Ñ†Ñ Ñ„Ð°Ð¹Ð»Ñƒ продовжуютьÑÑ Ð´Ð°Ð½Ñ– COPY" -#: commands/copyfromparse.c:989 +#: commands/copyfromparse.c:1051 #, c-format msgid "row field count is %d, expected %d" msgstr "кількіÑть полів у Ñ€Ñдку: %d, очікувалоÑÑŒ: %d" -#: commands/copyfromparse.c:1277 commands/copyfromparse.c:1294 +#: commands/copyfromparse.c:1336 commands/copyfromparse.c:1353 #, c-format msgid "literal carriage return found in data" msgstr "в даних виÑвлено Ñвне Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸" -#: commands/copyfromparse.c:1278 commands/copyfromparse.c:1295 +#: commands/copyfromparse.c:1337 commands/copyfromparse.c:1354 #, c-format msgid "unquoted carriage return found in data" msgstr "в даних виÑвлено Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸ без лапок" -#: commands/copyfromparse.c:1280 commands/copyfromparse.c:1297 +#: commands/copyfromparse.c:1339 commands/copyfromparse.c:1356 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "ВикориÑтайте \"\\r\", щоб позначити Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸." -#: commands/copyfromparse.c:1281 commands/copyfromparse.c:1298 +#: commands/copyfromparse.c:1340 commands/copyfromparse.c:1357 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "ВикориÑтайте CSV в лапках, щоб позначити Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸." -#: commands/copyfromparse.c:1310 +#: commands/copyfromparse.c:1369 #, c-format msgid "literal newline found in data" msgstr "в даних знайдено Ñвний новий Ñ€Ñдок" -#: commands/copyfromparse.c:1311 +#: commands/copyfromparse.c:1370 #, c-format msgid "unquoted newline found in data" msgstr "в даних знайдено новий Ñ€Ñдок без лапок" -#: commands/copyfromparse.c:1313 +#: commands/copyfromparse.c:1372 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "ВикориÑтайте \"\\n\", щоб предÑтавити новий Ñ€Ñдок." -#: commands/copyfromparse.c:1314 +#: commands/copyfromparse.c:1373 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "ВикориÑтайте CSV в лапках, щоб позначити новий Ñ€Ñдок." -#: commands/copyfromparse.c:1360 commands/copyfromparse.c:1396 +#: commands/copyfromparse.c:1419 commands/copyfromparse.c:1455 #, c-format msgid "end-of-copy marker does not match previous newline style" msgstr "маркер \"кінець копії\" не відповідає попередньому Ñтилю нового Ñ€Ñдка" -#: commands/copyfromparse.c:1369 commands/copyfromparse.c:1385 +#: commands/copyfromparse.c:1428 commands/copyfromparse.c:1444 #, c-format msgid "end-of-copy marker corrupt" msgstr "маркер \"кінець копії\" зіпÑований" -#: commands/copyfromparse.c:1809 +#: commands/copyfromparse.c:1746 commands/copyfromparse.c:1961 +#, c-format +msgid "unexpected default marker in COPY data" +msgstr "неочікуваний маркер за замовчуваннÑм в даних COPY" + +#: commands/copyfromparse.c:1747 commands/copyfromparse.c:1962 +#, c-format +msgid "Column \"%s\" has no default value." +msgstr "Колонка \"%s\" не має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм." + +#: commands/copyfromparse.c:1894 #, c-format msgid "unterminated CSV quoted field" msgstr "незакінчене поле в лапках CSV" -#: commands/copyfromparse.c:1885 commands/copyfromparse.c:1904 +#: commands/copyfromparse.c:1996 commands/copyfromparse.c:2015 #, c-format msgid "unexpected EOF in COPY data" msgstr "неочікуваний кінец файлу в даних COPY" -#: commands/copyfromparse.c:1894 +#: commands/copyfromparse.c:2005 #, c-format msgid "invalid field size" msgstr "невірний розмір полÑ" -#: commands/copyfromparse.c:1917 +#: commands/copyfromparse.c:2028 #, c-format msgid "incorrect binary data format" msgstr "невірний двійковий формат даних" -#: commands/copyto.c:234 +#: commands/copyto.c:229 #, c-format msgid "could not write to COPY program: %m" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати в канал програми COPY: %m" -#: commands/copyto.c:239 +#: commands/copyto.c:234 #, c-format msgid "could not write to COPY file: %m" msgstr "не можливо запиÑати в файл COPY: %m" -#: commands/copyto.c:369 +#: commands/copyto.c:379 #, c-format msgid "cannot copy from view \"%s\"" msgstr "неможливо Ñкопіювати з Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\"" -#: commands/copyto.c:371 commands/copyto.c:377 commands/copyto.c:383 -#: commands/copyto.c:394 +#: commands/copyto.c:381 commands/copyto.c:387 commands/copyto.c:393 +#: commands/copyto.c:404 #, c-format msgid "Try the COPY (SELECT ...) TO variant." msgstr "Спробуйте варіацію COPY (SELECT ...) TO." -#: commands/copyto.c:375 +#: commands/copyto.c:385 #, c-format msgid "cannot copy from materialized view \"%s\"" msgstr "неможливо Ñкопіювати з матеріалізованого Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\"" -#: commands/copyto.c:381 +#: commands/copyto.c:391 #, c-format msgid "cannot copy from foreign table \"%s\"" msgstr "неможливо Ñкопіювати зі Ñторонньої таблиці \"%s\"" -#: commands/copyto.c:387 +#: commands/copyto.c:397 #, c-format msgid "cannot copy from sequence \"%s\"" msgstr "не вдалоÑÑ Ñкопіювати з поÑлідовноÑті \"%s\"" -#: commands/copyto.c:392 +#: commands/copyto.c:402 #, c-format msgid "cannot copy from partitioned table \"%s\"" msgstr "неможливо Ñкопіювати з Ñекційної таблиці \"%s\"" -#: commands/copyto.c:398 +#: commands/copyto.c:408 #, c-format msgid "cannot copy from non-table relation \"%s\"" msgstr "не можна копіювати з Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\", котре не Ñ” таблицею" -#: commands/copyto.c:450 +#: commands/copyto.c:460 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for COPY" msgstr "правила DO INSTEAD NOTHING не підтримуютьÑÑ Ð´Ð»Ñ COPY" -#: commands/copyto.c:464 +#: commands/copyto.c:474 #, c-format msgid "conditional DO INSTEAD rules are not supported for COPY" msgstr "умовні правила DO INSTEAD не підтримуютьÑÑ Ð´Ð»Ñ COPY" -#: commands/copyto.c:468 +#: commands/copyto.c:478 #, c-format -msgid "DO ALSO rules are not supported for the COPY" +msgid "DO ALSO rules are not supported for COPY" msgstr "правила DO ALSO не підтримуютьÑÑ Ð´Ð»Ñ COPY" -#: commands/copyto.c:473 +#: commands/copyto.c:483 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for COPY" msgstr "Ñкладові правила DO INSTEAD не підтримуютьÑÑ Ð· COPY" -#: commands/copyto.c:483 +#: commands/copyto.c:493 #, c-format msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO) не підтримуєтьÑÑ" -#: commands/copyto.c:500 +#: commands/copyto.c:499 +#, c-format +msgid "COPY query must not be a utility command" +msgstr "запит COPY не повинен бути командою утиліти" + +#: commands/copyto.c:515 #, c-format msgid "COPY query must have a RETURNING clause" msgstr "Ð’ запиті COPY повинно бути Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ RETURNING" -#: commands/copyto.c:529 +#: commands/copyto.c:544 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "відношеннÑ, згадане в операторі COPY, змінилоÑÑŒ" -#: commands/copyto.c:588 -#, c-format -msgid "FORCE_QUOTE column \"%s\" not referenced by COPY" -msgstr "Стовпець FORCE_QUOTE \"%s\" не фігурує в COPY" - -#: commands/copyto.c:696 +#: commands/copyto.c:671 #, c-format msgid "relative path not allowed for COPY to file" msgstr "при виконанні COPY в файл не можна вказувати відноÑний шлÑÑ…" -#: commands/copyto.c:715 +#: commands/copyto.c:690 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу: %m" -#: commands/copyto.c:718 +#: commands/copyto.c:693 #, c-format msgid "COPY TO instructs the PostgreSQL server process to write a file. You may want a client-side facility such as psql's \\copy." msgstr "COPY TO наказує Ñерверному процеÑу PostgreSQL запиÑати дані до файлу. Можливо, вам потрібна клієнтÑька команда, наприклад \\copy в psql." -#: commands/createas.c:215 commands/createas.c:523 +#: commands/createas.c:210 commands/createas.c:516 #, c-format msgid "too many column names were specified" msgstr "вказано забагато імен Ñтовпців" -#: commands/createas.c:546 +#: commands/createas.c:539 #, c-format msgid "policies not yet implemented for this command" msgstr "політики Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— команди вÑе ще не реалізовані" -#: commands/dbcommands.c:819 +#: commands/dbcommands.c:829 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATION більше не підтримуєтьÑÑ" -#: commands/dbcommands.c:820 +#: commands/dbcommands.c:830 #, c-format msgid "Consider using tablespaces instead." msgstr "РозглÑньте можливіÑть викориÑÑ‚Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¸Ñ… проÑторів." -#: commands/dbcommands.c:845 +#: commands/dbcommands.c:855 #, c-format msgid "OIDs less than %u are reserved for system objects" msgstr "OID котрі менше ніж %u, зарезервовані Ð´Ð»Ñ ÑиÑтемних об'єктів" -#: commands/dbcommands.c:876 utils/adt/ascii.c:145 +#: commands/dbcommands.c:886 utils/adt/ascii.c:146 #, c-format msgid "%d is not a valid encoding code" msgstr "%d не Ñ” вірним кодом кодуваннÑ" -#: commands/dbcommands.c:887 utils/adt/ascii.c:127 +#: commands/dbcommands.c:897 utils/adt/ascii.c:128 #, c-format msgid "%s is not a valid encoding name" msgstr "%s не Ñ” вірним ім'Ñм кодуваннÑ" -#: commands/dbcommands.c:914 +#: commands/dbcommands.c:931 #, c-format msgid "unrecognized locale provider: %s" msgstr "нерозпізнаний поÑтачальник локалів: %s" -#: commands/dbcommands.c:920 -#, c-format -msgid "ICU locale cannot be specified unless locale provider is ICU" -msgstr "ICU локаль не може бути визначена, Ñкщо поÑтачальник локалі не ICU" - -#: commands/dbcommands.c:936 commands/dbcommands.c:2269 commands/user.c:237 -#: commands/user.c:611 +#: commands/dbcommands.c:944 commands/dbcommands.c:2414 commands/user.c:299 +#: commands/user.c:739 #, c-format msgid "invalid connection limit: %d" msgstr "недійÑний ліміт з'єднаннÑ: %d" -#: commands/dbcommands.c:957 +#: commands/dbcommands.c:965 #, c-format msgid "permission denied to create database" msgstr "немає дозволу Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних" -#: commands/dbcommands.c:981 +#: commands/dbcommands.c:989 #, c-format msgid "template database \"%s\" does not exist" msgstr "шаблону бази даних \"%s\" не Ñ–Ñнує" -#: commands/dbcommands.c:993 +#: commands/dbcommands.c:999 +#, c-format +msgid "cannot use invalid database \"%s\" as template" +msgstr "не можна викориÑтовувати невірну базу даних \"%s\" в ÑкоÑті шаблону" + +#: commands/dbcommands.c:1000 commands/dbcommands.c:2444 +#: utils/init/postinit.c:1113 +#, c-format +msgid "Use DROP DATABASE to drop invalid databases." +msgstr "ВикориÑтайте DROP DATABASE Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ²Ñ–Ñ€Ð½Ð¸Ñ… баз даних." + +#: commands/dbcommands.c:1011 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "немає дозволу Ð´Ð»Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних \"%s\"" -#: commands/dbcommands.c:1010 +#: commands/dbcommands.c:1028 #, c-format -msgid "invalid create database strategy %s" -msgstr "неприпуÑтима ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ñ–Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних %s" +msgid "invalid create database strategy \"%s\"" +msgstr "неприпуÑтима ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ñ–Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних \"%s\"" -#: commands/dbcommands.c:1011 +#: commands/dbcommands.c:1029 #, c-format -msgid "Valid strategies are \"wal_log\", and \"file_copy\"." -msgstr "ПрипуÑтимі Ñтратегії: \"wal_log\" Ñ– \"file_copy\"." +msgid "Valid strategies are \"wal_log\" and \"file_copy\"." +msgstr "ПрипуÑтимі Ñтратегії - це \"wal_log\" Ñ– \"file_copy\"." -#: commands/dbcommands.c:1030 +#: commands/dbcommands.c:1050 #, c-format msgid "invalid server encoding %d" msgstr "недійÑний Ñервер ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ %d" -#: commands/dbcommands.c:1036 commands/dbcommands.c:1041 +#: commands/dbcommands.c:1056 +#, c-format +msgid "invalid LC_COLLATE locale name: \"%s\"" +msgstr "неприпуÑтиме ім'Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– LC_COLLATE: \"%s\"" + +#: commands/dbcommands.c:1057 commands/dbcommands.c:1063 +#, c-format +msgid "If the locale name is specific to ICU, use ICU_LOCALE." +msgstr "Якщо ім'Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– характерне Ð´Ð»Ñ ICU, викориÑтовуйте ICU_LOCALE." + +#: commands/dbcommands.c:1062 +#, c-format +msgid "invalid LC_CTYPE locale name: \"%s\"" +msgstr "неприпуÑтиме ім'Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– LC_CTYPE: \"%s\"" + +#: commands/dbcommands.c:1074 +#, c-format +msgid "BUILTIN_LOCALE cannot be specified unless locale provider is builtin" +msgstr "BUILTIN_LOCALE не може бути вказано, Ñкщо поÑтачальник локалі не вбудований" + +#: commands/dbcommands.c:1082 +#, c-format +msgid "ICU locale cannot be specified unless locale provider is ICU" +msgstr "ICU локаль не може бути визначена, Ñкщо поÑтачальник локалі не ICU" + +#: commands/dbcommands.c:1100 +#, c-format +msgid "LOCALE or BUILTIN_LOCALE must be specified" +msgstr "Ðеобхідно вказати LOCALE або BUILTIN_LOCALE" + +#: commands/dbcommands.c:1109 #, c-format -msgid "invalid locale name: \"%s\"" -msgstr "неприпуÑтиме ім'Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–: \"%s\"" +msgid "encoding \"%s\" is not supported with ICU provider" +msgstr "ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" не підтримуєтьÑÑ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ð¾Ð¼ ICU" -#: commands/dbcommands.c:1055 +#: commands/dbcommands.c:1119 #, c-format -msgid "ICU locale must be specified" -msgstr "Ðеобхідно вказати локаль ICU" +msgid "LOCALE or ICU_LOCALE must be specified" +msgstr "Ðеобхідно вказати LOCALE або ICU_LOCALE" -#: commands/dbcommands.c:1076 +#: commands/dbcommands.c:1163 #, c-format msgid "new encoding (%s) is incompatible with the encoding of the template database (%s)" msgstr "нове ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ (%s) неÑуміÑне з кодуваннÑм шаблона бази даних (%s)" -#: commands/dbcommands.c:1079 +#: commands/dbcommands.c:1166 #, c-format msgid "Use the same encoding as in the template database, or use template0 as template." msgstr "ВикориÑтайте ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° бази даних або виберіть template0 в ÑкоÑті шаблона." -#: commands/dbcommands.c:1084 +#: commands/dbcommands.c:1171 #, c-format msgid "new collation (%s) is incompatible with the collation of the template database (%s)" msgstr "нове правило ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ (%s) неÑуміÑне з правилом в шаблоні бази даних (%s)" -#: commands/dbcommands.c:1086 +#: commands/dbcommands.c:1173 #, c-format msgid "Use the same collation as in the template database, or use template0 as template." msgstr "ВикориÑтайте те ж Ñаме правило ÑортуваннÑ, що Ñ– в шаблоні бази даних, або виберіть template0 в ÑкоÑті шаблона." -#: commands/dbcommands.c:1091 +#: commands/dbcommands.c:1178 #, c-format msgid "new LC_CTYPE (%s) is incompatible with the LC_CTYPE of the template database (%s)" msgstr "новий параметр LC_CTYPE (%s) неÑуміÑний з LC_CTYPE в шаблоні бази даних (%s)" -#: commands/dbcommands.c:1093 +#: commands/dbcommands.c:1180 #, c-format msgid "Use the same LC_CTYPE as in the template database, or use template0 as template." msgstr "ВикориÑтайте той Ñамий LC_CTYPE, що Ñ– в шаблоні бази даних, або виберіть template0 в ÑкоÑті шаблона." -#: commands/dbcommands.c:1098 +#: commands/dbcommands.c:1185 #, c-format msgid "new locale provider (%s) does not match locale provider of the template database (%s)" msgstr "новий поÑтачальник локалі (%s) не відповідає поÑтачальнику локалі шаблону бази даних (%s)" -#: commands/dbcommands.c:1100 +#: commands/dbcommands.c:1187 #, c-format msgid "Use the same locale provider as in the template database, or use template0 as template." msgstr "ВикориÑтайте такого ж поÑтачальника локалі, що й у шаблоні бази даних, або викориÑтайте template0 в ÑкоÑті шаблону." -#: commands/dbcommands.c:1109 +#: commands/dbcommands.c:1199 #, c-format msgid "new ICU locale (%s) is incompatible with the ICU locale of the template database (%s)" msgstr "нова ICU локаль (%s) неÑуміÑна з ICU локалью шаблону бази даних (%s)" -#: commands/dbcommands.c:1111 +#: commands/dbcommands.c:1201 #, c-format msgid "Use the same ICU locale as in the template database, or use template0 as template." msgstr "ВикориÑтайте таку ж ICU локаль, що й у шаблоні бази даних, або викориÑтайте template0 в ÑкоÑті шаблону." -#: commands/dbcommands.c:1134 +#: commands/dbcommands.c:1212 +#, c-format +msgid "new ICU collation rules (%s) are incompatible with the ICU collation rules of the template database (%s)" +msgstr "нові правила ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ICU (%s) неÑуміÑні з правилами ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ICU шаблону бази даних (%s)" + +#: commands/dbcommands.c:1214 +#, c-format +msgid "Use the same ICU collation rules as in the template database, or use template0 as template." +msgstr "ВикориÑтайте ті ж правила ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ICU, що й в шаблоні бази даних, або виберіть template0 в ÑкоÑті шаблону." + +#: commands/dbcommands.c:1243 #, c-format msgid "template database \"%s\" has a collation version, but no actual collation version could be determined" msgstr "шаблон бази даних \"%s\" має верÑÑ–ÑŽ правил ÑортуваннÑ, але фактичну верÑÑ–ÑŽ визначити не вдалоÑÑ" -#: commands/dbcommands.c:1139 +#: commands/dbcommands.c:1248 #, c-format msgid "template database \"%s\" has a collation version mismatch" msgstr "шаблон бази даних \"%s\" має невідповідніÑть верÑÑ–Ñ— параметрів ÑортуваннÑ" -#: commands/dbcommands.c:1141 +#: commands/dbcommands.c:1250 #, c-format msgid "The template database was created using collation version %s, but the operating system provides version %s." msgstr "Шаблон бази даних було Ñтворено за допомогою параметрів ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñ— %s, але операційна ÑиÑтема надає верÑÑ–ÑŽ %s." -#: commands/dbcommands.c:1144 +#: commands/dbcommands.c:1253 #, c-format msgid "Rebuild all objects in the template database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." msgstr "Перебудуйте вÑÑ– об'єкти шаблону бази даних, Ñкі викориÑтовують Ñтандартний параметр ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ виконайте ALTER DATABASE %s REFRESH COLLATION VERSION, або побудуйте PostgreSQL з правильною верÑією бібліотеки." -#: commands/dbcommands.c:1180 commands/dbcommands.c:1898 +#: commands/dbcommands.c:1298 commands/dbcommands.c:2041 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "pg_global не можна викориÑтати в ÑкоÑті табличного проÑтору за замовчуваннÑм" -#: commands/dbcommands.c:1206 +#: commands/dbcommands.c:1324 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ новий табличний проÑтір за замовчуваннÑм \"%s\"" -#: commands/dbcommands.c:1208 +#: commands/dbcommands.c:1326 #, c-format msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." msgstr "БД \"%s\" вже міÑтить таблиці, що знаходÑтьÑÑ Ð² цьому табличному проÑторі." -#: commands/dbcommands.c:1238 commands/dbcommands.c:1768 +#: commands/dbcommands.c:1356 commands/dbcommands.c:1912 #, c-format msgid "database \"%s\" already exists" msgstr "база даних \"%s\" вже Ñ–Ñнує" -#: commands/dbcommands.c:1252 +#: commands/dbcommands.c:1370 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "вихідна база даних \"%s\" зайнÑта іншими кориÑтувачами" -#: commands/dbcommands.c:1274 +#: commands/dbcommands.c:1392 #, c-format msgid "database OID %u is already in use by database \"%s\"" msgstr "OID %u вже викориÑтовуєтьÑÑ Ð±Ð°Ð·Ð¾ÑŽ даних \"%s\" вже викориÑтовує" -#: commands/dbcommands.c:1280 +#: commands/dbcommands.c:1398 #, c-format msgid "data directory with the specified OID %u already exists" msgstr "каталог даних з вказаним OID %u вже Ñ–Ñнує" -#: commands/dbcommands.c:1451 commands/dbcommands.c:1466 +#: commands/dbcommands.c:1571 commands/dbcommands.c:1586 +#: utils/adt/pg_locale.c:2588 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" не відповідає локалі \"%s\"" -#: commands/dbcommands.c:1454 +#: commands/dbcommands.c:1574 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "Обраний параметр LC_CTYPE потребує ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"." -#: commands/dbcommands.c:1469 +#: commands/dbcommands.c:1589 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "Обраний параметр LC_COLLATE потребує ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"." -#: commands/dbcommands.c:1549 +#: commands/dbcommands.c:1672 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "бази даних \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dbcommands.c:1573 +#: commands/dbcommands.c:1696 #, c-format msgid "cannot drop a template database" msgstr "неможливо видалити шаблон бази даних" -#: commands/dbcommands.c:1579 +#: commands/dbcommands.c:1702 #, c-format msgid "cannot drop the currently open database" msgstr "неможливо видалити наразі відкриту базу даних" -#: commands/dbcommands.c:1592 +#: commands/dbcommands.c:1715 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "база даних \"%s\" викориÑтовуєтьÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ð¼ Ñлотом логічної реплікації" -#: commands/dbcommands.c:1594 +#: commands/dbcommands.c:1717 #, c-format msgid "There is %d active slot." msgid_plural "There are %d active slots." @@ -7361,12 +7854,12 @@ msgstr[1] "Ðктивні Ñлоти %d." msgstr[2] "Ðктивних Ñлотів %d." msgstr[3] "Ðктивних Ñлотів %d." -#: commands/dbcommands.c:1608 +#: commands/dbcommands.c:1731 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "база даних \"%s\" викориÑтовуєтьÑÑ Ð² підпиÑці логічної реплікації" -#: commands/dbcommands.c:1610 +#: commands/dbcommands.c:1733 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." @@ -7375,69 +7868,74 @@ msgstr[1] "Знайдено підпиÑки %d." msgstr[2] "Знайдено підпиÑок %d." msgstr[3] "Знайдено підпиÑок %d." -#: commands/dbcommands.c:1631 commands/dbcommands.c:1790 -#: commands/dbcommands.c:1920 +#: commands/dbcommands.c:1754 commands/dbcommands.c:1934 +#: commands/dbcommands.c:2063 #, c-format msgid "database \"%s\" is being accessed by other users" msgstr "база даних \"%s\" зайнÑта іншими кориÑтувачами" -#: commands/dbcommands.c:1750 +#: commands/dbcommands.c:1894 #, c-format msgid "permission denied to rename database" msgstr "немає дозволу Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних" -#: commands/dbcommands.c:1779 +#: commands/dbcommands.c:1923 #, c-format msgid "current database cannot be renamed" msgstr "поточна база даних не може бути перейменована" -#: commands/dbcommands.c:1876 +#: commands/dbcommands.c:2019 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "неможливо змінити табличний проÑтір наразі відкритої бази даних" -#: commands/dbcommands.c:1982 +#: commands/dbcommands.c:2125 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "деÑкі Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних \"%s\" вже Ñ” в табличному проÑторі \"%s\"" -#: commands/dbcommands.c:1984 +#: commands/dbcommands.c:2127 #, c-format msgid "You must move them back to the database's default tablespace before using this command." msgstr "Перед тим, Ñк виконувати цю команду, вам треба повернути Ñ—Ñ… в табличний проÑтір за замовчуваннÑм Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— бази даних." -#: commands/dbcommands.c:2111 commands/dbcommands.c:2822 -#: commands/dbcommands.c:3086 commands/dbcommands.c:3200 +#: commands/dbcommands.c:2256 commands/dbcommands.c:2999 +#: commands/dbcommands.c:3299 commands/dbcommands.c:3412 #, c-format msgid "some useless files may be left behind in old database directory \"%s\"" msgstr "у Ñтарому каталозі бази даних \"%s\" могли залишитиÑÑ Ð½ÐµÐ¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ñ– файли" -#: commands/dbcommands.c:2172 +#: commands/dbcommands.c:2317 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "нерозпізнаний параметр DROP DATABASE \"%s\"" -#: commands/dbcommands.c:2250 +#: commands/dbcommands.c:2395 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "параметр \"%s\" не може бути вказаним з іншими параметрами" -#: commands/dbcommands.c:2306 +#: commands/dbcommands.c:2443 +#, c-format +msgid "cannot alter invalid database \"%s\"" +msgstr "неможливо змінити невірну базу даних \"%s\"" + +#: commands/dbcommands.c:2460 #, c-format msgid "cannot disallow connections for current database" msgstr "не можна заборонити з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— бази даних" -#: commands/dbcommands.c:2525 +#: commands/dbcommands.c:2690 #, c-format msgid "permission denied to change owner of database" msgstr "немає дозволу Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ влаÑника бази даних" -#: commands/dbcommands.c:2928 +#: commands/dbcommands.c:3105 #, c-format msgid "There are %d other session(s) and %d prepared transaction(s) using the database." msgstr "Знайдено %d інших ÑеанÑів Ñ– %d підготованих транзакцій з викориÑтаннÑм цієї бази даних." -#: commands/dbcommands.c:2931 +#: commands/dbcommands.c:3108 #, c-format msgid "There is %d other session using the database." msgid_plural "There are %d other sessions using the database." @@ -7446,7 +7944,7 @@ msgstr[1] "Є %d інші ÑеанÑи з викориÑтаннÑм цієї б msgstr[2] "Є %d інших ÑеанÑів з викориÑтаннÑм цієї бази даних." msgstr[3] "Є %d інших ÑеанÑів з викориÑтаннÑм цієї бази даних." -#: commands/dbcommands.c:2936 storage/ipc/procarray.c:3814 +#: commands/dbcommands.c:3113 storage/ipc/procarray.c:3859 #, c-format msgid "There is %d prepared transaction using the database." msgid_plural "There are %d prepared transactions using the database." @@ -7455,553 +7953,598 @@ msgstr[1] "З цією базою даних пов'Ñзані %d підгото msgstr[2] "З цією базою даних пов'Ñзані %d підготовлених транзакцій." msgstr[3] "З цією базою даних пов'Ñзані %d підготовлених транзакцій." -#: commands/dbcommands.c:3042 +#: commands/dbcommands.c:3255 #, c-format msgid "missing directory \"%s\"" msgstr "відÑутній каталог \"%s\"" -#: commands/dbcommands.c:3102 commands/tablespace.c:190 -#: commands/tablespace.c:654 +#: commands/dbcommands.c:3313 commands/tablespace.c:184 +#: commands/tablespace.c:633 #, c-format msgid "could not stat directory \"%s\": %m" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про каталог \"%s\": %m" -#: commands/define.c:54 commands/define.c:225 commands/define.c:257 -#: commands/define.c:285 commands/define.c:331 +#: commands/define.c:53 commands/define.c:257 commands/define.c:289 +#: commands/define.c:317 commands/define.c:363 #, c-format msgid "%s requires a parameter" msgstr "%s потребує параметру" -#: commands/define.c:87 commands/define.c:98 commands/define.c:192 -#: commands/define.c:210 +#: commands/define.c:86 commands/define.c:97 commands/define.c:191 +#: commands/define.c:209 commands/define.c:224 commands/define.c:242 #, c-format msgid "%s requires a numeric value" msgstr "%s потребує чиÑлового значеннÑ" -#: commands/define.c:154 +#: commands/define.c:153 #, c-format msgid "%s requires a Boolean value" msgstr "%s потребує логічного значеннÑ" -#: commands/define.c:168 commands/define.c:177 commands/define.c:294 +#: commands/define.c:167 commands/define.c:176 commands/define.c:326 #, c-format msgid "%s requires an integer value" msgstr "%s потребує ціле значеннÑ" -#: commands/define.c:239 +#: commands/define.c:271 #, c-format msgid "argument of %s must be a name" msgstr "аргументом %s повинно бути ім'Ñ" -#: commands/define.c:269 +#: commands/define.c:301 #, c-format msgid "argument of %s must be a type name" msgstr "аргументом %s повинно бути ім'Ñ Ñ‚Ð¸Ð¿Ñƒ" -#: commands/define.c:315 +#: commands/define.c:347 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "невірний аргумент Ð´Ð»Ñ %s: \"%s\"" -#: commands/dropcmds.c:100 commands/functioncmds.c:1394 -#: utils/adt/ruleutils.c:2918 +#: commands/dropcmds.c:96 commands/functioncmds.c:1382 +#: utils/adt/ruleutils.c:2910 #, c-format msgid "\"%s\" is an aggregate function" msgstr "\"%s\" Ñ” функцією агрегату" -#: commands/dropcmds.c:102 +#: commands/dropcmds.c:98 #, c-format msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "ВикориÑтайте DROP AGGREGATE, щоб видалити агрегатні функції." -#: commands/dropcmds.c:158 commands/sequence.c:475 commands/tablecmds.c:3613 -#: commands/tablecmds.c:3771 commands/tablecmds.c:3823 -#: commands/tablecmds.c:16411 tcop/utility.c:1332 +#: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:3892 +#: commands/tablecmds.c:4050 commands/tablecmds.c:4102 +#: commands/tablecmds.c:17192 tcop/utility.c:1325 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:188 commands/dropcmds.c:287 commands/tablecmds.c:1278 +#: commands/dropcmds.c:183 commands/dropcmds.c:282 commands/tablecmds.c:1409 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "Ñхеми \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:228 commands/dropcmds.c:267 commands/tablecmds.c:276 +#: commands/dropcmds.c:223 commands/dropcmds.c:262 commands/tablecmds.c:286 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "типу \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:257 +#: commands/dropcmds.c:252 #, c-format msgid "access method \"%s\" does not exist, skipping" msgstr "методу доÑтупу \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:275 +#: commands/dropcmds.c:270 #, c-format msgid "collation \"%s\" does not exist, skipping" msgstr "правила ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:282 +#: commands/dropcmds.c:277 #, c-format msgid "conversion \"%s\" does not exist, skipping" msgstr "Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:293 commands/statscmds.c:655 +#: commands/dropcmds.c:288 commands/statscmds.c:664 #, c-format msgid "statistics object \"%s\" does not exist, skipping" msgstr "об'єкту ÑтатиÑтики \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:300 +#: commands/dropcmds.c:295 #, c-format msgid "text search parser \"%s\" does not exist, skipping" msgstr "парÑеру текÑтового пошуку \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:307 +#: commands/dropcmds.c:302 #, c-format msgid "text search dictionary \"%s\" does not exist, skipping" msgstr "Ñловника текÑтового пошуку \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:314 +#: commands/dropcmds.c:309 #, c-format msgid "text search template \"%s\" does not exist, skipping" msgstr "шаблону текÑтового пошуку \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:321 +#: commands/dropcmds.c:316 #, c-format msgid "text search configuration \"%s\" does not exist, skipping" msgstr "конфігурації текÑтового пошуку \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:326 +#: commands/dropcmds.c:321 #, c-format msgid "extension \"%s\" does not exist, skipping" msgstr "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:336 +#: commands/dropcmds.c:331 #, c-format msgid "function %s(%s) does not exist, skipping" msgstr "функції %s(%s) не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:349 +#: commands/dropcmds.c:344 #, c-format msgid "procedure %s(%s) does not exist, skipping" msgstr "процедури %s(%s) не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:362 +#: commands/dropcmds.c:357 #, c-format msgid "routine %s(%s) does not exist, skipping" msgstr "підпрограми %s(%s) не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:375 +#: commands/dropcmds.c:370 #, c-format msgid "aggregate %s(%s) does not exist, skipping" msgstr "агрегату %s(%s) не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:388 +#: commands/dropcmds.c:383 #, c-format msgid "operator %s does not exist, skipping" msgstr "оператора \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:394 +#: commands/dropcmds.c:389 #, c-format msgid "language \"%s\" does not exist, skipping" msgstr "мови \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:403 +#: commands/dropcmds.c:398 #, c-format msgid "cast from type %s to type %s does not exist, skipping" msgstr "Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ типу %s до типу %s не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:412 +#: commands/dropcmds.c:407 #, c-format msgid "transform for type %s language \"%s\" does not exist, skipping" msgstr "транÑформації Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s мови \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:420 +#: commands/dropcmds.c:415 #, c-format msgid "trigger \"%s\" for relation \"%s\" does not exist, skipping" msgstr "тригеру \"%s\" Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:429 +#: commands/dropcmds.c:424 #, c-format msgid "policy \"%s\" for relation \"%s\" does not exist, skipping" msgstr "політики \"%s\" Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:436 +#: commands/dropcmds.c:431 #, c-format msgid "event trigger \"%s\" does not exist, skipping" msgstr "тригеру подій \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:442 +#: commands/dropcmds.c:437 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist, skipping" msgstr "правила \"%s\" Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:449 +#: commands/dropcmds.c:444 #, c-format msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "джерела Ñторонніх даних \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:453 commands/foreigncmds.c:1360 +#: commands/dropcmds.c:448 commands/foreigncmds.c:1360 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "Ñерверу \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/dropcmds.c:462 +#: commands/dropcmds.c:457 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\", skipping" msgstr "клаÑу операторів \"%s\" не Ñ–Ñнує Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ доÑтупу \"%s\", пропуÑкаємо" -#: commands/dropcmds.c:474 +#: commands/dropcmds.c:469 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\", skipping" msgstr "ÑімейÑтва операторів \"%s\" не Ñ–Ñнує Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ доÑтупу \"%s\", пропуÑкаємо" -#: commands/dropcmds.c:481 +#: commands/dropcmds.c:476 #, c-format msgid "publication \"%s\" does not exist, skipping" msgstr "публікації \"%s\" не Ñ–Ñнує, пропуÑкаємо" -#: commands/event_trigger.c:125 +#: commands/event_trigger.c:137 #, c-format msgid "permission denied to create event trigger \"%s\"" msgstr "немає дозволу Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ð° подій %s\"" -#: commands/event_trigger.c:127 +#: commands/event_trigger.c:139 #, c-format msgid "Must be superuser to create an event trigger." msgstr "Тільки ÑуперкориÑтувач може Ñтворити тригер подій." -#: commands/event_trigger.c:136 +#: commands/event_trigger.c:149 #, c-format msgid "unrecognized event name \"%s\"" msgstr "нерозпізнане ім'Ñ Ð¿Ð¾Ð´Ñ–Ð¹ \"%s\"" -#: commands/event_trigger.c:153 +#: commands/event_trigger.c:166 #, c-format msgid "unrecognized filter variable \"%s\"" msgstr "нерозпізнана змінна фільтру \"%s\"" -#: commands/event_trigger.c:207 +#: commands/event_trigger.c:181 +#, c-format +msgid "tag filtering is not supported for login event triggers" +msgstr "Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐ³Ñ–Ð² не підтримуєтьÑÑ Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² події входу" + +#: commands/event_trigger.c:224 #, c-format msgid "filter value \"%s\" not recognized for filter variable \"%s\"" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ñƒ \"%s\" не розпізнано Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ— фільтру \"%s\"" #. translator: %s represents an SQL statement name -#: commands/event_trigger.c:213 commands/event_trigger.c:235 +#: commands/event_trigger.c:230 commands/event_trigger.c:252 #, c-format msgid "event triggers are not supported for %s" msgstr "Ð´Ð»Ñ %s тригери подій не підтримуютьÑÑ" -#: commands/event_trigger.c:248 +#: commands/event_trigger.c:265 #, c-format msgid "filter variable \"%s\" specified more than once" msgstr "змінну фільтра \"%s\" вказано кілька разів" -#: commands/event_trigger.c:377 commands/event_trigger.c:421 -#: commands/event_trigger.c:515 +#: commands/event_trigger.c:438 commands/event_trigger.c:490 +#: commands/event_trigger.c:584 #, c-format msgid "event trigger \"%s\" does not exist" msgstr "тригеру подій \"%s\" не Ñ–Ñнує" -#: commands/event_trigger.c:483 +#: commands/event_trigger.c:522 +#, c-format +msgid "event trigger with OID %u does not exist" +msgstr "тригер подій %u з OID не Ñ–Ñнує" + +#: commands/event_trigger.c:552 #, c-format msgid "permission denied to change owner of event trigger \"%s\"" msgstr "немає дозволу Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ влаÑника тригера подій \"%s\"" -#: commands/event_trigger.c:485 +#: commands/event_trigger.c:554 #, c-format msgid "The owner of an event trigger must be a superuser." msgstr "ВлаÑником тригеру подій може бути тільки ÑуперкориÑтувач." -#: commands/event_trigger.c:1304 +#: commands/event_trigger.c:1409 #, c-format msgid "%s can only be called in a sql_drop event trigger function" msgstr "%s можливо викликати лише в подієвій тригерній функції sql_drop" -#: commands/event_trigger.c:1400 commands/event_trigger.c:1421 +#: commands/event_trigger.c:1502 commands/event_trigger.c:1523 #, c-format msgid "%s can only be called in a table_rewrite event trigger function" msgstr "%s можливо викликати лише в подієвій тригерній функції table_rewrite" -#: commands/event_trigger.c:1834 +#: commands/event_trigger.c:1936 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s можливо викликати тільки в подієвій тригерній функції" -#: commands/explain.c:218 +#: commands/explain.c:241 commands/explain.c:266 #, c-format msgid "unrecognized value for EXPLAIN option \"%s\": \"%s\"" msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ EXPLAIN \"%s\": \"%s\"" -#: commands/explain.c:225 +#: commands/explain.c:273 #, c-format msgid "unrecognized EXPLAIN option \"%s\"" msgstr "нерозпізнаний параметр EXPLAIN \"%s\"" -#: commands/explain.c:233 +#: commands/explain.c:282 #, c-format msgid "EXPLAIN option WAL requires ANALYZE" msgstr "Параметр WAL оператора EXPLAIN потребує вказівки ANALYZE" -#: commands/explain.c:242 +#: commands/explain.c:291 #, c-format msgid "EXPLAIN option TIMING requires ANALYZE" msgstr "Параметр TIMING оператора EXPLAIN потребує вказівки ANALYZE" -#: commands/extension.c:173 commands/extension.c:2936 +#: commands/explain.c:297 +#, c-format +msgid "EXPLAIN option SERIALIZE requires ANALYZE" +msgstr "Параметр SERIALIZE оператора EXPLAIN потребує вказівки ANALYZE" + +#: commands/explain.c:303 +#, c-format +msgid "EXPLAIN options ANALYZE and GENERIC_PLAN cannot be used together" +msgstr "Параметри ANALYZE Ñ– GENERIC_PLAN не можуть викориÑтовуватиÑÑŒ разом" + +#: commands/extension.c:178 commands/extension.c:3031 #, c-format msgid "extension \"%s\" does not exist" msgstr "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: commands/extension.c:272 commands/extension.c:281 commands/extension.c:293 -#: commands/extension.c:303 +#: commands/extension.c:277 commands/extension.c:286 commands/extension.c:298 +#: commands/extension.c:308 #, c-format msgid "invalid extension name: \"%s\"" msgstr "невірне ім'Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ: \"%s\"" -#: commands/extension.c:273 +#: commands/extension.c:278 #, c-format msgid "Extension names must not be empty." msgstr "Імена Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð½Ðµ повинні бути пуÑтими." -#: commands/extension.c:282 +#: commands/extension.c:287 #, c-format msgid "Extension names must not contain \"--\"." msgstr "Імена Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð½Ðµ повинні міÑтити \"--\"." -#: commands/extension.c:294 +#: commands/extension.c:299 #, c-format msgid "Extension names must not begin or end with \"-\"." msgstr "Імена Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð½Ðµ повинні починатиÑÑ Ð°Ð±Ð¾ закінчуватиÑÑ Ñимволом \"-\"." -#: commands/extension.c:304 +#: commands/extension.c:309 #, c-format msgid "Extension names must not contain directory separator characters." msgstr "Імена Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð½Ðµ повинні міÑтити роздільники шлÑху." -#: commands/extension.c:319 commands/extension.c:328 commands/extension.c:337 -#: commands/extension.c:347 +#: commands/extension.c:324 commands/extension.c:333 commands/extension.c:342 +#: commands/extension.c:352 #, c-format msgid "invalid extension version name: \"%s\"" msgstr "невірне ім'Ñ Ð²ÐµÑ€ÑÑ–Ñ— розширеннÑ: \"%s\"" -#: commands/extension.c:320 +#: commands/extension.c:325 #, c-format msgid "Version names must not be empty." msgstr "Імена верÑÑ–Ñ— не повинні бути пуÑтими." -#: commands/extension.c:329 +#: commands/extension.c:334 #, c-format msgid "Version names must not contain \"--\"." msgstr "Імена верÑÑ–Ñ— не повинні міÑтити \"--\"." -#: commands/extension.c:338 +#: commands/extension.c:343 #, c-format msgid "Version names must not begin or end with \"-\"." msgstr "Імена верÑÑ–Ñ— не повинні починатиÑÑŒ або закінчуватиÑÑŒ Ñимволом \"-\"." -#: commands/extension.c:348 +#: commands/extension.c:353 #, c-format msgid "Version names must not contain directory separator characters." msgstr "Імена верÑÑ–Ñ— не повинні міÑтити роздільники шлÑху." -#: commands/extension.c:502 +#: commands/extension.c:507 #, c-format msgid "extension \"%s\" is not available" msgstr "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\" недоÑтупне" -#: commands/extension.c:503 +#: commands/extension.c:508 #, c-format msgid "Could not open extension control file \"%s\": %m." msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ контрольний файл Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\": %m." -#: commands/extension.c:505 +#: commands/extension.c:510 #, c-format msgid "The extension must first be installed on the system where PostgreSQL is running." msgstr "Ð Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ñпочатку має бути вÑтановлене в ÑиÑтемі, де запущено PostgreSQL." -#: commands/extension.c:509 +#: commands/extension.c:514 #, c-format msgid "could not open extension control file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ керуючий файл Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\": %m" -#: commands/extension.c:531 commands/extension.c:541 +#: commands/extension.c:537 commands/extension.c:547 #, c-format msgid "parameter \"%s\" cannot be set in a secondary extension control file" msgstr "параметр \"%s\" не можна задавати в додатковому керуючому файлі розширеннÑ" -#: commands/extension.c:563 commands/extension.c:571 commands/extension.c:579 -#: utils/misc/guc.c:7390 +#: commands/extension.c:569 commands/extension.c:577 commands/extension.c:585 +#: utils/misc/guc.c:3147 #, c-format msgid "parameter \"%s\" requires a Boolean value" msgstr "параметр \"%s\" потребує логічного значеннÑ" -#: commands/extension.c:588 +#: commands/extension.c:594 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" не Ñ” невірним ім'Ñм кодуваннÑ" -#: commands/extension.c:602 +#: commands/extension.c:608 commands/extension.c:623 #, c-format msgid "parameter \"%s\" must be a list of extension names" msgstr "параметр \"%s\" повинен міÑтити ÑпиÑок імен розширень" -#: commands/extension.c:609 +#: commands/extension.c:630 #, c-format msgid "unrecognized parameter \"%s\" in file \"%s\"" msgstr "нерозпізнаний параметр \"%s\" в файлі \"%s\"" -#: commands/extension.c:618 +#: commands/extension.c:639 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "параметр \"schema\" не може бути вказаним, коли \"relocatable\" Ñ” дійÑним" -#: commands/extension.c:796 +#: commands/extension.c:817 #, c-format msgid "transaction control statements are not allowed within an extension script" msgstr "в Ñкрипті Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð½Ðµ повинно бути операторів ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñми" -#: commands/extension.c:873 +#: commands/extension.c:897 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "немає дозволу Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ %s\"" -#: commands/extension.c:876 +#: commands/extension.c:900 #, c-format msgid "Must have CREATE privilege on current database to create this extension." msgstr "Ðеобхідно мати право CREATE Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— бази даних щоб Ñтворити це розширеннÑ." -#: commands/extension.c:877 +#: commands/extension.c:901 #, c-format msgid "Must be superuser to create this extension." msgstr "Тільки ÑуперкориÑтувач може Ñтворити це розширеннÑ." -#: commands/extension.c:881 +#: commands/extension.c:905 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "немає дозволу Ð´Ð»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ %s\"" -#: commands/extension.c:884 +#: commands/extension.c:908 #, c-format msgid "Must have CREATE privilege on current database to update this extension." msgstr "Ðеобхідно мати право CREATE Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— бази даних щоб оновити це розширеннÑ." -#: commands/extension.c:885 +#: commands/extension.c:909 #, c-format msgid "Must be superuser to update this extension." msgstr "Тільки ÑуперкориÑтувач може оновити це розширеннÑ." -#: commands/extension.c:1216 +#: commands/extension.c:1042 +#, c-format +msgid "invalid character in extension owner: must not contain any of \"%s\"" +msgstr "неприпуÑтимий Ñимвол у влаÑника розширеннÑ: не може міÑтити жодного з \"%s\"" + +#: commands/extension.c:1066 commands/extension.c:1093 +#, c-format +msgid "invalid character in extension \"%s\" schema: must not contain any of \"%s\"" +msgstr "неприпуÑтимий Ñимвол у розширенні \"%s\" Ñхеми: не повинно міÑтити жодної з \"%s\"" + +#: commands/extension.c:1288 #, c-format msgid "extension \"%s\" has no update path from version \"%s\" to version \"%s\"" msgstr "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\" не має жодного шлÑху Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ верÑÑ–Ñ— \"%s\" до верÑÑ–Ñ— \"%s\"" -#: commands/extension.c:1424 commands/extension.c:2994 +#: commands/extension.c:1496 commands/extension.c:3089 #, c-format msgid "version to install must be specified" msgstr "Ð´Ð»Ñ Ñ–Ð½ÑталÑції Ñлід указати верÑÑ–ÑŽ" -#: commands/extension.c:1461 +#: commands/extension.c:1533 #, c-format msgid "extension \"%s\" has no installation script nor update path for version \"%s\"" msgstr "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\" не має ні Ñкрипту Ð´Ð»Ñ Ð²ÑтановленнÑ, ні шлÑху Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²ÐµÑ€ÑÑ–Ñ— \"%s\"" -#: commands/extension.c:1495 +#: commands/extension.c:1567 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\" треба вÑтановлювати в Ñхемі \"%s\"" -#: commands/extension.c:1655 +#: commands/extension.c:1727 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "виÑвлено циклічну залежніÑть між розширеннÑми \"%s\" Ñ– \"%s\"" -#: commands/extension.c:1660 +#: commands/extension.c:1732 #, c-format msgid "installing required extension \"%s\"" msgstr "вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð¸Ñ… розширень \"%s\"" -#: commands/extension.c:1683 +#: commands/extension.c:1755 #, c-format msgid "required extension \"%s\" is not installed" msgstr "необхідні Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\" не вÑтановлено" -#: commands/extension.c:1686 +#: commands/extension.c:1758 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "ВикориÑтайте CREATE EXTENSION ... CASCADE також Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð¸Ñ… розширень." -#: commands/extension.c:1721 +#: commands/extension.c:1793 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\" вже Ñ–Ñнує, пропуÑкаємо" -#: commands/extension.c:1728 +#: commands/extension.c:1800 #, c-format msgid "extension \"%s\" already exists" msgstr "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\" вже Ñ–Ñнує" -#: commands/extension.c:1739 +#: commands/extension.c:1811 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "вкладенні оператори CREATE EXTENSION не підтримуютьÑÑ" -#: commands/extension.c:1903 +#: commands/extension.c:1975 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "неможливо видалити Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\", оÑкільки воно змінюєтьÑÑ" -#: commands/extension.c:2380 +#: commands/extension.c:2450 #, c-format msgid "%s can only be called from an SQL script executed by CREATE EXTENSION" msgstr "%s можна викликати лише з SQL-Ñкрипта, виконаного CREATE EXTENSION" -#: commands/extension.c:2392 +#: commands/extension.c:2462 #, c-format msgid "OID %u does not refer to a table" msgstr "OID %u не поÑилаєтьÑÑ Ð½Ð° таблицю" -#: commands/extension.c:2397 +#: commands/extension.c:2467 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" не Ñ” членом Ñтвореного розширеннÑ" -#: commands/extension.c:2751 +#: commands/extension.c:2813 #, c-format msgid "cannot move extension \"%s\" into schema \"%s\" because the extension contains the schema" msgstr "неможливо переміÑтити Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\" в Ñхему \"%s\", оÑкільки Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¼Ñ–Ñтить Ñхему" -#: commands/extension.c:2792 commands/extension.c:2855 +#: commands/extension.c:2854 commands/extension.c:2948 #, c-format msgid "extension \"%s\" does not support SET SCHEMA" msgstr "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\" не підтримує SET SCHEMA" -#: commands/extension.c:2857 +#: commands/extension.c:2911 +#, c-format +msgid "cannot SET SCHEMA of extension \"%s\" because other extensions prevent it" +msgstr "неможливо виконати SET SCHEMA Ð´Ð»Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\", оÑкільки інші Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð²Ð°Ð¶Ð°ÑŽÑ‚ÑŒ цьому" + +#: commands/extension.c:2913 +#, c-format +msgid "Extension \"%s\" requests no relocation of extension \"%s\"." +msgstr "Ð Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\" запитує не переноÑити Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\"." + +#: commands/extension.c:2950 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "%s не Ñ” Ñхемою Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\"" -#: commands/extension.c:2916 +#: commands/extension.c:3011 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "вкладенні оператори ALTER EXTENSION не підтримуютьÑÑ" -#: commands/extension.c:3005 +#: commands/extension.c:3100 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "верÑÑ–Ñ \"%s\" Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\" вже вÑтановлена" -#: commands/extension.c:3217 +#: commands/extension.c:3311 #, c-format msgid "cannot add an object of this type to an extension" msgstr "додати об'єкт цього типу до Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð½Ðµ можна" -#: commands/extension.c:3283 +#: commands/extension.c:3409 #, c-format msgid "cannot add schema \"%s\" to extension \"%s\" because the schema contains the extension" msgstr "неможливо додати Ñхему \"%s\" до Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ \"%s\", оÑкільки Ñхема міÑтить розширеннÑ" -#: commands/extension.c:3377 +#: commands/extension.c:3491 commands/typecmds.c:4042 utils/fmgr/funcapi.c:725 +#, c-format +msgid "could not find multirange type for data type %s" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ багатодіапазонний тип Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ даних %s" + +#: commands/extension.c:3532 #, c-format msgid "file \"%s\" is too large" msgstr "файл \"%s\" занадто великий" @@ -8031,11 +8574,21 @@ msgstr "Треба бути ÑуперкориÑтувачем, щоб змін msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "ВлаÑником джерела Ñторонніх даних може бути тільки ÑуперкориÑтувач." -#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:669 +#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:691 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "джерела Ñторонніх даних \"%s\" не Ñ–Ñнує" +#: commands/foreigncmds.c:325 +#, c-format +msgid "foreign-data wrapper with OID %u does not exist" +msgstr "джерело Ñторонніх даних з OID %u не Ñ–Ñнує" + +#: commands/foreigncmds.c:462 +#, c-format +msgid "foreign server with OID %u does not exist" +msgstr "Ñтороннього Ñерверу з OID %u не уÑніє" + #: commands/foreigncmds.c:580 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" @@ -8091,7 +8644,7 @@ msgstr "зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\" не Ñ–Ñнує д msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\" не Ñ–Ñнує Ð´Ð»Ñ Ñервера \"%s\", пропуÑкаємо" -#: commands/foreigncmds.c:1507 foreign/foreign.c:390 +#: commands/foreigncmds.c:1507 foreign/foreign.c:404 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "джерело Ñторонніх даних \"%s\" не має обробника" @@ -8106,363 +8659,368 @@ msgstr "джерело Ñторонніх даних \"%s\" не підтрим msgid "importing foreign table \"%s\"" msgstr "імпорт Ñторонньої таблиці \"%s\"" -#: commands/functioncmds.c:109 +#: commands/functioncmds.c:104 #, c-format msgid "SQL function cannot return shell type %s" msgstr "SQL-Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð½Ðµ може повертати тип оболонки %s" -#: commands/functioncmds.c:114 +#: commands/functioncmds.c:109 #, c-format msgid "return type %s is only a shell" msgstr "тип, що повертаєтьÑÑ, %s - лише оболонка" -#: commands/functioncmds.c:144 parser/parse_type.c:354 +#: commands/functioncmds.c:138 parser/parse_type.c:354 #, c-format msgid "type modifier cannot be specified for shell type \"%s\"" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ оболонки \"%s\" неможливо вказати модифікатор типу" -#: commands/functioncmds.c:150 +#: commands/functioncmds.c:144 #, c-format msgid "type \"%s\" is not yet defined" msgstr "тип \"%s\" вÑе ще не визначений" -#: commands/functioncmds.c:151 +#: commands/functioncmds.c:145 #, c-format msgid "Creating a shell type definition." msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ оболонки." -#: commands/functioncmds.c:250 +#: commands/functioncmds.c:244 #, c-format msgid "SQL function cannot accept shell type %s" msgstr "SQL-Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð½Ðµ може приймати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ оболонки %s" -#: commands/functioncmds.c:256 +#: commands/functioncmds.c:250 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "агрегатна Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð½Ðµ може приймати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ оболонки %s" -#: commands/functioncmds.c:261 +#: commands/functioncmds.c:255 #, c-format msgid "argument type %s is only a shell" msgstr "тип аргументу %s - лише оболонка" -#: commands/functioncmds.c:271 +#: commands/functioncmds.c:265 #, c-format msgid "type %s does not exist" msgstr "тип \"%s\" не Ñ–Ñнує" -#: commands/functioncmds.c:285 +#: commands/functioncmds.c:279 #, c-format msgid "aggregates cannot accept set arguments" msgstr "агрегатні функції не приймають в аргументах набору" -#: commands/functioncmds.c:289 +#: commands/functioncmds.c:283 #, c-format msgid "procedures cannot accept set arguments" msgstr "процедури не приймають в аргументах набору" -#: commands/functioncmds.c:293 +#: commands/functioncmds.c:287 #, c-format msgid "functions cannot accept set arguments" msgstr "функції не приймають в аргументах набору" -#: commands/functioncmds.c:303 +#: commands/functioncmds.c:297 #, c-format msgid "VARIADIC parameter must be the last input parameter" msgstr "Параметр VARIADIC повинен бути оÑтаннім в ÑпиÑку вхідних параметрів" -#: commands/functioncmds.c:323 +#: commands/functioncmds.c:317 #, c-format msgid "VARIADIC parameter must be the last parameter" msgstr "Параметр VARIADIC повинен бути оÑтаннім параметром" -#: commands/functioncmds.c:348 +#: commands/functioncmds.c:342 #, c-format msgid "VARIADIC parameter must be an array" msgstr "Параметр VARIADIC повинен бути маÑивом" -#: commands/functioncmds.c:393 +#: commands/functioncmds.c:387 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "ім'Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ «%s» викориÑтано декілька разів" -#: commands/functioncmds.c:411 +#: commands/functioncmds.c:405 #, c-format msgid "only input parameters can have default values" msgstr "тільки ввідні параметри можуть мати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм" -#: commands/functioncmds.c:426 +#: commands/functioncmds.c:420 #, c-format msgid "cannot use table references in parameter default value" msgstr "у значенні параметру за замовчуваннÑм не можна поÑилатиÑÑŒ на таблиці" -#: commands/functioncmds.c:450 +#: commands/functioncmds.c:444 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "вхідні параметри, наÑтупні за параметром зі значеннÑм \"за замовчуваннÑм\", також повинні мати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"за замовчуваннÑм\"" -#: commands/functioncmds.c:460 +#: commands/functioncmds.c:454 #, c-format msgid "procedure OUT parameters cannot appear after one with a default value" msgstr "параметри процедури OUT не можуть з'ÑвлÑтиÑÑŒ піÑÐ»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° зі значеннÑм за замовчуваннÑм" -#: commands/functioncmds.c:605 commands/functioncmds.c:784 +#: commands/functioncmds.c:596 commands/functioncmds.c:775 #, c-format msgid "invalid attribute in procedure definition" msgstr "некоректний атрибут у визначенні процедури" -#: commands/functioncmds.c:701 +#: commands/functioncmds.c:692 #, c-format msgid "support function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ %s повинна повертати тип %s" -#: commands/functioncmds.c:712 +#: commands/functioncmds.c:703 #, c-format msgid "must be superuser to specify a support function" msgstr "Ð´Ð»Ñ ÑƒÑ‚Ð¾Ñ‡Ð½ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— підтримки потрібно бути ÑуперкориÑтувачем" -#: commands/functioncmds.c:833 commands/functioncmds.c:1439 +#: commands/functioncmds.c:824 commands/functioncmds.c:1427 #, c-format msgid "COST must be positive" msgstr "COST має бути додатнім" -#: commands/functioncmds.c:841 commands/functioncmds.c:1447 +#: commands/functioncmds.c:832 commands/functioncmds.c:1435 #, c-format msgid "ROWS must be positive" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ROWS повинно бути позитивним" -#: commands/functioncmds.c:870 +#: commands/functioncmds.c:861 #, c-format msgid "no function body specified" msgstr "не вказано тіло функції" -#: commands/functioncmds.c:875 +#: commands/functioncmds.c:866 #, c-format msgid "duplicate function body specified" msgstr "вказано тіло дубліката функції" -#: commands/functioncmds.c:880 +#: commands/functioncmds.c:871 #, c-format msgid "inline SQL function body only valid for language SQL" msgstr "вбудоване тіло функції SQL допуÑтиме лише Ð´Ð»Ñ Ð¼Ð¾Ð²Ð¸ SQL" -#: commands/functioncmds.c:922 +#: commands/functioncmds.c:913 #, c-format msgid "SQL function with unquoted function body cannot have polymorphic arguments" msgstr "SQL Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð· тілом без лапок не може мати поліморфні аргументи" -#: commands/functioncmds.c:948 commands/functioncmds.c:967 +#: commands/functioncmds.c:939 commands/functioncmds.c:958 #, c-format msgid "%s is not yet supported in unquoted SQL function body" msgstr "%s ще не підтримуєтьÑÑ Ñƒ тілі SQL функції без лапок" -#: commands/functioncmds.c:995 +#: commands/functioncmds.c:986 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "Ð´Ð»Ñ Ð¼Ð¾Ð²Ð¸ \"%s\" потрібен лише один вираз AS" -#: commands/functioncmds.c:1100 +#: commands/functioncmds.c:1091 #, c-format msgid "no language specified" msgstr "не вказано жодної мови" -#: commands/functioncmds.c:1108 commands/functioncmds.c:2109 -#: commands/proclang.c:237 +#: commands/functioncmds.c:1099 commands/functioncmds.c:2117 +#: commands/proclang.c:235 #, c-format msgid "language \"%s\" does not exist" msgstr "мови \"%s\" не Ñ–Ñнує" -#: commands/functioncmds.c:1110 commands/functioncmds.c:2111 +#: commands/functioncmds.c:1101 commands/functioncmds.c:2119 #, c-format msgid "Use CREATE EXTENSION to load the language into the database." msgstr "ВикориÑтайте CREATE EXTENSION, щоб завантажити мову в базу даних." -#: commands/functioncmds.c:1145 commands/functioncmds.c:1431 +#: commands/functioncmds.c:1134 commands/functioncmds.c:1419 #, c-format msgid "only superuser can define a leakproof function" msgstr "лише ÑуперкориÑтувачі можуть визначити функцію з атрибутом leakproof" -#: commands/functioncmds.c:1196 +#: commands/functioncmds.c:1185 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "результат функції повинен мати тип %s відповідно з параметрами OUT" -#: commands/functioncmds.c:1209 +#: commands/functioncmds.c:1198 #, c-format msgid "function result type must be specified" msgstr "необхідно вказати тип результату функції" -#: commands/functioncmds.c:1263 commands/functioncmds.c:1451 +#: commands/functioncmds.c:1251 commands/functioncmds.c:1439 #, c-format msgid "ROWS is not applicable when function does not return a set" msgstr "ROWS не заÑтоÑовуєтьÑÑ, коли Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð½Ðµ повертає набір" -#: commands/functioncmds.c:1552 +#: commands/functioncmds.c:1546 #, c-format msgid "source data type %s is a pseudo-type" msgstr "вихідний тип даних %s Ñ” пÑевдотипом" -#: commands/functioncmds.c:1558 +#: commands/functioncmds.c:1552 #, c-format msgid "target data type %s is a pseudo-type" msgstr "цільовий тип даних %s Ñ” пÑевдотипом" -#: commands/functioncmds.c:1582 +#: commands/functioncmds.c:1576 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ ігноруватиÑÑ, оÑкільки вихідні дані мають тип домену" -#: commands/functioncmds.c:1587 +#: commands/functioncmds.c:1581 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ ігноруватиÑÑ, оÑкільки цільові дані мають тип домену" -#: commands/functioncmds.c:1612 +#: commands/functioncmds.c:1606 #, c-format msgid "cast function must take one to three arguments" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° приймати від одного до трьох аргументів" -#: commands/functioncmds.c:1616 +#: commands/functioncmds.c:1612 #, c-format msgid "argument of cast function must match or be binary-coercible from source data type" msgstr "аргумент функції Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ Ñпівпадати або бути двійково-ÑуміÑним з вихідним типом даних" -#: commands/functioncmds.c:1620 +#: commands/functioncmds.c:1616 #, c-format msgid "second argument of cast function must be type %s" msgstr "другий аргумент функції Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ мати тип %s" -#: commands/functioncmds.c:1625 +#: commands/functioncmds.c:1621 #, c-format msgid "third argument of cast function must be type %s" msgstr "третій аргумент функції Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ мати тип %s" -#: commands/functioncmds.c:1630 +#: commands/functioncmds.c:1628 #, c-format msgid "return data type of cast function must match or be binary-coercible to target data type" msgstr "тип вертаючих даних функції Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ Ñпівпадати або бути двійково-ÑуміÑним з цільовим типом даних" -#: commands/functioncmds.c:1641 +#: commands/functioncmds.c:1639 #, c-format msgid "cast function must not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð½Ðµ може бути змінною (volatile)" -#: commands/functioncmds.c:1646 +#: commands/functioncmds.c:1644 #, c-format msgid "cast function must be a normal function" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° бути звичайною функцією" -#: commands/functioncmds.c:1650 +#: commands/functioncmds.c:1648 #, c-format msgid "cast function must not return a set" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð½Ðµ може вертати набір" -#: commands/functioncmds.c:1676 +#: commands/functioncmds.c:1674 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "тільки ÑуперкориÑтувач може Ñтворити Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ WITHOUT FUNCTION" -#: commands/functioncmds.c:1691 +#: commands/functioncmds.c:1689 #, c-format msgid "source and target data types are not physically compatible" msgstr "вихідний та цільовий типи даних не ÑуміÑні фізично" -#: commands/functioncmds.c:1706 +#: commands/functioncmds.c:1709 #, c-format msgid "composite data types are not binary-compatible" msgstr "Ñкладені типи даних не ÑуміÑні на двійковому рівні" -#: commands/functioncmds.c:1712 -#, c-format -msgid "enum data types are not binary-compatible" -msgstr "типи переліку не ÑуміÑні на двійковому рівні" - -#: commands/functioncmds.c:1718 +#: commands/functioncmds.c:1715 #, c-format msgid "array data types are not binary-compatible" msgstr "типи маÑивів не ÑуміÑні на двійковому рівні" -#: commands/functioncmds.c:1735 +#: commands/functioncmds.c:1723 +#, c-format +msgid "range data types are not binary-compatible" +msgstr "типи-діапазону не ÑуміÑні на двійковому рівні" + +#: commands/functioncmds.c:1729 +#, c-format +msgid "enum data types are not binary-compatible" +msgstr "типи переліку не ÑуміÑні на двійковому рівні" + +#: commands/functioncmds.c:1746 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "типи доменів не можуть вважатиÑÑŒ ÑуміÑними на двійковому рівні" -#: commands/functioncmds.c:1745 +#: commands/functioncmds.c:1756 #, c-format msgid "source data type and target data type are the same" msgstr "вихідний тип даних Ñпівпадає з цільовим типом" -#: commands/functioncmds.c:1778 +#: commands/functioncmds.c:1789 #, c-format msgid "transform function must not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ðµ може бути мінливою" -#: commands/functioncmds.c:1782 +#: commands/functioncmds.c:1793 #, c-format msgid "transform function must be a normal function" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° бути нормальною функцією" -#: commands/functioncmds.c:1786 +#: commands/functioncmds.c:1797 #, c-format msgid "transform function must not return a set" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ðµ повинна повертати набір" -#: commands/functioncmds.c:1790 +#: commands/functioncmds.c:1801 #, c-format msgid "transform function must take one argument" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° приймати один аргумент" -#: commands/functioncmds.c:1794 +#: commands/functioncmds.c:1805 #, c-format msgid "first argument of transform function must be type %s" msgstr "перший аргумент функції Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ бути типу %s" -#: commands/functioncmds.c:1833 +#: commands/functioncmds.c:1844 #, c-format msgid "data type %s is a pseudo-type" msgstr "тип даних %s Ñ” пÑевдотипом" -#: commands/functioncmds.c:1839 +#: commands/functioncmds.c:1850 #, c-format msgid "data type %s is a domain" msgstr "тип даних %s Ñ” доменом" -#: commands/functioncmds.c:1879 +#: commands/functioncmds.c:1890 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "результат функції FROM SQL має бути типу %s" -#: commands/functioncmds.c:1905 +#: commands/functioncmds.c:1916 #, c-format msgid "return data type of TO SQL function must be the transform data type" msgstr "результат функції TO SQL повинен мати тип даних перетвореннÑ" -#: commands/functioncmds.c:1934 +#: commands/functioncmds.c:1943 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s мови \"%s\" вже Ñ–Ñнує" -#: commands/functioncmds.c:2021 +#: commands/functioncmds.c:2029 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s мови \"%s\" не Ñ–Ñнує" -#: commands/functioncmds.c:2045 +#: commands/functioncmds.c:2053 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %s вже Ñ–Ñнує в Ñхемі \"%s\"" -#: commands/functioncmds.c:2096 +#: commands/functioncmds.c:2104 #, c-format msgid "no inline code specified" msgstr "не вказано жодного впровадженого коду" -#: commands/functioncmds.c:2142 +#: commands/functioncmds.c:2150 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "мова \"%s\" не підтримує Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð²Ð¿Ñ€Ð¾Ð²Ð°Ð´Ð¶ÐµÐ½Ð¾Ð³Ð¾ коду" -#: commands/functioncmds.c:2237 +#: commands/functioncmds.c:2245 #, c-format msgid "cannot pass more than %d argument to a procedure" msgid_plural "cannot pass more than %d arguments to a procedure" @@ -8471,333 +9029,338 @@ msgstr[1] "процедурі неможливо передати більше % msgstr[2] "процедурі неможливо передати більше %d аргументів" msgstr[3] "процедурі неможливо передати більше %d аргументів" -#: commands/indexcmds.c:634 +#: commands/indexcmds.c:656 #, c-format msgid "must specify at least one column" msgstr "треба вказати хоча б один Ñтовпець" -#: commands/indexcmds.c:638 +#: commands/indexcmds.c:660 #, c-format msgid "cannot use more than %d columns in an index" msgstr "не можна викориÑтовувати більше ніж %d Ñтовпців в індекÑÑ–" -#: commands/indexcmds.c:681 +#: commands/indexcmds.c:703 #, c-format msgid "cannot create index on relation \"%s\"" msgstr "Ñтворити Ñ–Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не можна" -#: commands/indexcmds.c:707 +#: commands/indexcmds.c:729 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "неможливо Ñтворити Ñ–Ð½Ð´ÐµÐºÑ Ð² Ñекційній таблиці \"%s\" паралельним ÑпоÑобом" -#: commands/indexcmds.c:712 -#, c-format -msgid "cannot create exclusion constraints on partitioned table \"%s\"" -msgstr "Ñтворити обмеженнÑ-винÑток в Ñекціонованій таблиці \"%s\" не можна" - -#: commands/indexcmds.c:722 +#: commands/indexcmds.c:739 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "неможливо Ñтворити індекÑи в тимчаÑових таблицÑÑ… в інших ÑеанÑах" -#: commands/indexcmds.c:760 commands/tablecmds.c:781 commands/tablespace.c:1204 +#: commands/indexcmds.c:777 commands/tablecmds.c:818 commands/tablespace.c:1178 #, c-format msgid "cannot specify default tablespace for partitioned relations" msgstr "Ð´Ð»Ñ Ñекціонованих відношень не можна вказати табличний проÑтір за замовчуваннÑм" -#: commands/indexcmds.c:792 commands/tablecmds.c:816 commands/tablecmds.c:3312 +#: commands/indexcmds.c:809 commands/tablecmds.c:849 commands/tablecmds.c:3588 #, c-format msgid "only shared relations can be placed in pg_global tablespace" msgstr "тільки Ñпільні Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ бути поміщені в табличний pg_global" -#: commands/indexcmds.c:825 +#: commands/indexcmds.c:842 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "заÑтарілий метод доÑтупу \"rtree\" підмінÑєтьÑÑ Ð¼ÐµÑ‚Ð¾Ð´Ð¾Ð¼ \"gist\"" -#: commands/indexcmds.c:846 +#: commands/indexcmds.c:863 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "методу доÑтупу \"%s\" не підтримує унікальні індекÑи" -#: commands/indexcmds.c:851 +#: commands/indexcmds.c:868 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "методу доÑтупу \"%s\" не підтримує включені Ñтовпці" -#: commands/indexcmds.c:856 +#: commands/indexcmds.c:873 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "метод доÑтупу \"%s\" не підтримує багатоÑтовпцеві індекÑи" -#: commands/indexcmds.c:861 +#: commands/indexcmds.c:878 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "метод доÑтупу \"%s\" не підтримує обмеженнÑ-винÑтки" -#: commands/indexcmds.c:986 +#: commands/indexcmds.c:1007 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "не можна зіÑтавити ключ розділу з індекÑом викориÑтовуючи метод доÑтупу \"%s\"" -#: commands/indexcmds.c:996 +#: commands/indexcmds.c:1017 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "непідтримуване Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" з визначеннÑм ключа ÑекціонуваннÑ" -#: commands/indexcmds.c:998 +#: commands/indexcmds.c:1019 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ %s не можуть викориÑтовуватиÑÑŒ, Ñкщо ключі ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°ÑŽÑ‚ÑŒ вирази." -#: commands/indexcmds.c:1037 +#: commands/indexcmds.c:1069 +#, c-format +msgid "cannot match partition key to index on column \"%s\" using non-equal operator \"%s\"" +msgstr "не вдаєтьÑÑ Ð·Ñ–Ñтавити ключ розділу з індекÑом у Ñтовпці \"%s\" за допомогою оператора нерівноÑті \"%s\"" + +#: commands/indexcmds.c:1085 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑƒÐ½Ñ–ÐºÐ°Ð»ÑŒÐ½Ð¾Ñті в Ñекціонованій таблиці повинно включати вÑÑ– Ñтовпці ÑекціонуваннÑ" -#: commands/indexcmds.c:1038 +#: commands/indexcmds.c:1086 #, c-format msgid "%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key." msgstr "в обмеженні %s таблиці\"%s\" не виÑтачає ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\", що Ñ” чаÑтиною ключа ÑекціонуваннÑ." -#: commands/indexcmds.c:1057 commands/indexcmds.c:1076 +#: commands/indexcmds.c:1105 commands/indexcmds.c:1124 #, c-format msgid "index creation on system columns is not supported" msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу Ð´Ð»Ñ ÑиÑтемних Ñтовпців не підтримуєтьÑÑ" -#: commands/indexcmds.c:1267 tcop/utility.c:1518 +#: commands/indexcmds.c:1354 tcop/utility.c:1515 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "не можна Ñтворити унікальний Ñ–Ð½Ð´ÐµÐºÑ Ð² Ñекціонованій таблиці \"%s\"" -#: commands/indexcmds.c:1269 tcop/utility.c:1520 +#: commands/indexcmds.c:1356 tcop/utility.c:1517 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" міÑтить Ñекції, Ñкі Ñ” зовнішніми таблицÑми." -#: commands/indexcmds.c:1739 +#: commands/indexcmds.c:1806 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "функції в предикаті індекÑу повинні бути позначені Ñк IMMUTABLE" -#: commands/indexcmds.c:1817 parser/parse_utilcmd.c:2528 -#: parser/parse_utilcmd.c:2663 +#: commands/indexcmds.c:1885 parser/parse_utilcmd.c:2519 +#: parser/parse_utilcmd.c:2654 #, c-format msgid "column \"%s\" named in key does not exist" msgstr "вказаний у ключі Ñтовпець \"%s\" не Ñ–Ñнує" -#: commands/indexcmds.c:1841 parser/parse_utilcmd.c:1825 +#: commands/indexcmds.c:1909 parser/parse_utilcmd.c:1807 #, c-format msgid "expressions are not supported in included columns" msgstr "вирази не підтримуютьÑÑ Ñƒ включених ÑтовпцÑÑ… " -#: commands/indexcmds.c:1882 +#: commands/indexcmds.c:1950 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "функції в індекÑному виразі повинні бути позначені Ñк IMMUTABLE" -#: commands/indexcmds.c:1897 +#: commands/indexcmds.c:1965 #, c-format msgid "including column does not support a collation" msgstr "включені Ñтовпці не підтримують правила ÑортуваннÑ" -#: commands/indexcmds.c:1901 +#: commands/indexcmds.c:1969 #, c-format msgid "including column does not support an operator class" msgstr "включені Ñтовпці не підтримують клаÑи операторів" -#: commands/indexcmds.c:1905 +#: commands/indexcmds.c:1973 #, c-format msgid "including column does not support ASC/DESC options" msgstr "включені Ñтовпці не підтримують параметри ASC/DESC" -#: commands/indexcmds.c:1909 +#: commands/indexcmds.c:1977 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "включені Ñтовпці не підтримують параметри NULLS FIRST/LAST" -#: commands/indexcmds.c:1950 +#: commands/indexcmds.c:2020 #, c-format msgid "could not determine which collation to use for index expression" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸, Ñке правило ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтати Ð´Ð»Ñ Ñ–Ð½Ð´ÐµÐºÑного виразу" -#: commands/indexcmds.c:1958 commands/tablecmds.c:17453 commands/typecmds.c:807 -#: parser/parse_expr.c:2752 parser/parse_type.c:570 parser/parse_utilcmd.c:3795 -#: utils/adt/misc.c:601 +#: commands/indexcmds.c:2028 commands/tablecmds.c:18216 commands/typecmds.c:811 +#: parser/parse_expr.c:2793 parser/parse_type.c:568 parser/parse_utilcmd.c:3771 +#: utils/adt/misc.c:630 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не підтримує правила ÑортуваннÑ" -#: commands/indexcmds.c:2023 +#: commands/indexcmds.c:2095 #, c-format msgid "operator %s is not commutative" msgstr "оператор %s не комутативний" -#: commands/indexcmds.c:2025 +#: commands/indexcmds.c:2097 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "Ð’ обмеженнÑÑ…-виключеннÑÑ… можуть викориÑтовуватиÑÑŒ лише комутативні оператори." -#: commands/indexcmds.c:2051 +#: commands/indexcmds.c:2123 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "оператор %s не Ñ” членом ÑімейÑтва операторів \"%s\"" -#: commands/indexcmds.c:2054 +#: commands/indexcmds.c:2126 #, c-format msgid "The exclusion operator must be related to the index operator class for the constraint." msgstr "Оператор винÑтку Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ відноÑитиÑÑŒ до клаÑу операторів індекÑу." -#: commands/indexcmds.c:2089 +#: commands/indexcmds.c:2161 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "метод доÑтупу \"%s\" не підтримує параметри ASC/DESC" -#: commands/indexcmds.c:2094 +#: commands/indexcmds.c:2166 #, c-format msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "метод доÑтупу \"%s\" не підтримує параметри NULLS FIRST/LAST" -#: commands/indexcmds.c:2140 commands/tablecmds.c:17478 -#: commands/tablecmds.c:17484 commands/typecmds.c:2302 +#: commands/indexcmds.c:2210 commands/tablecmds.c:18241 +#: commands/tablecmds.c:18247 commands/typecmds.c:2311 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "тип даних %s не має клаÑу операторів за замовчуваннÑм Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ доÑтупу \"%s\"" -#: commands/indexcmds.c:2142 +#: commands/indexcmds.c:2212 #, c-format msgid "You must specify an operator class for the index or define a default operator class for the data type." msgstr "Ви повинні вказати ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² Ð´Ð»Ñ Ñ–Ð½Ð´ÐµÐºÑу або визначити ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² за замовчуваннÑм Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу даних." -#: commands/indexcmds.c:2171 commands/indexcmds.c:2179 +#: commands/indexcmds.c:2241 commands/indexcmds.c:2249 #: commands/opclasscmds.c:205 #, c-format msgid "operator class \"%s\" does not exist for access method \"%s\"" msgstr "ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² \"%s\" не Ñ–Ñнує Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ доÑтупу \"%s\"" -#: commands/indexcmds.c:2193 commands/typecmds.c:2290 +#: commands/indexcmds.c:2263 commands/typecmds.c:2299 #, c-format msgid "operator class \"%s\" does not accept data type %s" msgstr "ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² \"%s\" не приймає тип даних %s" -#: commands/indexcmds.c:2283 +#: commands/indexcmds.c:2353 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ даних %s Ñ” кілька клаÑів операторів за замовчуваннÑм" -#: commands/indexcmds.c:2611 +#: commands/indexcmds.c:2681 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "нерозпізнаний параметр REINDEX \"%s\"" -#: commands/indexcmds.c:2835 +#: commands/indexcmds.c:2913 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" не має індекÑів, Ñкі можна переіндекÑувати паралельно" -#: commands/indexcmds.c:2849 +#: commands/indexcmds.c:2927 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" не має індекÑів Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ–Ð½Ð´ÐµÐºÑуваннÑ" -#: commands/indexcmds.c:2889 commands/indexcmds.c:3393 -#: commands/indexcmds.c:3521 +#: commands/indexcmds.c:2974 commands/indexcmds.c:3485 +#: commands/indexcmds.c:3615 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "не можна конкурентно переіндекÑувати ÑиÑтемні каталоги" -#: commands/indexcmds.c:2912 +#: commands/indexcmds.c:2998 #, c-format msgid "can only reindex the currently open database" msgstr "переіндекÑувати можна тільки наразі відкриту базу даних" -#: commands/indexcmds.c:3000 +#: commands/indexcmds.c:3090 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "не можна конкурентно переіндекÑувати ÑиÑтемні каталоги, пропуÑкаємо" -#: commands/indexcmds.c:3033 +#: commands/indexcmds.c:3123 #, c-format msgid "cannot move system relations, skipping all" msgstr "не можна переміÑтити ÑиÑтемні відношеннÑ, пропуÑкаютьÑÑ ÑƒÑÑ–" -#: commands/indexcmds.c:3079 +#: commands/indexcmds.c:3169 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÑ–Ð½Ð´ÐµÐºÑÑƒÐ²Ð°Ð½Ð½Ñ Ñекціонованої таблиці \"%s.%s\"" -#: commands/indexcmds.c:3082 +#: commands/indexcmds.c:3172 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÑ–Ð½Ð´ÐµÐºÑÑƒÐ²Ð°Ð½Ð½Ñ Ñекціонованого індекÑу \"%s.%s\"" -#: commands/indexcmds.c:3273 commands/indexcmds.c:4129 +#: commands/indexcmds.c:3365 commands/indexcmds.c:4241 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s.%s\" була переіндекÑована" -#: commands/indexcmds.c:3425 commands/indexcmds.c:3477 +#: commands/indexcmds.c:3517 commands/indexcmds.c:3570 +#, c-format +msgid "skipping reindex of invalid index \"%s.%s\"" +msgstr "пропуÑк пере індекÑації недійÑного індекÑу \"%s.%s\"" + +#: commands/indexcmds.c:3520 commands/indexcmds.c:3573 #, c-format -msgid "cannot reindex invalid index \"%s.%s\" concurrently, skipping" -msgstr "неможливо переіндекÑувати пошкоджений Ñ–Ð½Ð´ÐµÐºÑ \"%s.%s\" паралельно, пропуÑкаєтьÑÑ" +msgid "Use DROP INDEX or REINDEX INDEX." +msgstr "ВикориÑтовуйте DROP INDEX або REINDEX INDEX." -#: commands/indexcmds.c:3431 +#: commands/indexcmds.c:3524 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "неможливо переіндекÑувати Ñ–Ð½Ð´ÐµÐºÑ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ-Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ \"%s.%s\" паралельно, пропуÑкаєтьÑÑ" -#: commands/indexcmds.c:3586 +#: commands/indexcmds.c:3680 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "неможливо переіндекÑувати цей тип відношень паралельон" -#: commands/indexcmds.c:3607 +#: commands/indexcmds.c:3698 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "не можна переміÑтити не Ñпільне Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð´Ð¾ табличного проÑтору \"%s\"" -#: commands/indexcmds.c:4110 commands/indexcmds.c:4122 +#: commands/indexcmds.c:4222 commands/indexcmds.c:4234 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s.%s\" був перебудований" -#: commands/indexcmds.c:4112 commands/indexcmds.c:4131 +#: commands/indexcmds.c:4224 commands/indexcmds.c:4243 #, c-format msgid "%s." msgstr "%s." -#: commands/lockcmds.c:92 +#: commands/lockcmds.c:91 #, c-format msgid "cannot lock relation \"%s\"" msgstr "блокувати Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не можна" -#: commands/matview.c:193 +#: commands/matview.c:206 #, c-format msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "CONCURRENTLY не може викориÑтовуватиÑÑŒ, коли матеріалізоване Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð½Ðµ наповнено" -#: commands/matview.c:199 gram.y:19067 +#: commands/matview.c:212 gram.y:18918 #, c-format msgid "%s and %s options cannot be used together" msgstr "параметри %s та %s не можуть бути викориÑтані разом" -#: commands/matview.c:256 +#: commands/matview.c:269 #, c-format msgid "cannot refresh materialized view \"%s\" concurrently" msgstr "оновити матеріалізоване Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" паралельно не можна" -#: commands/matview.c:259 +#: commands/matview.c:272 #, c-format msgid "Create a unique index with no WHERE clause on one or more columns of the materialized view." msgstr "Створіть унікальний Ñ–Ð½Ð´ÐµÐºÑ Ð±ÐµÐ· Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ WHERE Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ або більше Ñтовпців матеріалізованого поданнÑ." -#: commands/matview.c:653 +#: commands/matview.c:666 #, c-format msgid "new data for materialized view \"%s\" contains duplicate rows without any null columns" msgstr "нові дані Ð´Ð»Ñ Ð¼Ð°Ñ‚ÐµÑ€Ñ–Ð°Ð»Ñ–Ð·Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" міÑÑ‚Ñть Ñ€Ñдки, Ñкі дублюютьÑÑ (без ÑƒÑ€Ð°Ñ…ÑƒÐ²Ð°Ð½Ð½Ñ Ñтовпців з null)" -#: commands/matview.c:655 +#: commands/matview.c:668 #, c-format msgid "Row: %s" msgstr "РÑдок: %s" @@ -8952,7 +9515,7 @@ msgstr "функції equal image Ð´Ð»Ñ btree повинні приймати #: commands/opclasscmds.c:1319 #, c-format msgid "btree equal image functions must return boolean" -msgstr "функції equal image Ð´Ð»Ñ btree повинні повертати логічне значеннÑ" +msgstr "функції equal image Ð´Ð»Ñ btree повинні повертати логічне значеннÑ" #: commands/opclasscmds.c:1332 #, c-format @@ -8999,123 +9562,140 @@ msgstr "номер оператора %d Ð´Ð»Ñ (%s,%s) з'ÑвлÑєтьÑÑ Ð± msgid "operator %d(%s,%s) already exists in operator family \"%s\"" msgstr "оператор %d(%s,%s) вже Ñ–Ñнує в ÑімейÑтві операторів \"%s\"" -#: commands/opclasscmds.c:1566 +#: commands/opclasscmds.c:1589 #, c-format msgid "function %d(%s,%s) already exists in operator family \"%s\"" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %d(%s,%s) вже Ñ–Ñнує в ÑімейÑтві операторів \"%s\"" -#: commands/opclasscmds.c:1647 +#: commands/opclasscmds.c:1744 #, c-format msgid "operator %d(%s,%s) does not exist in operator family \"%s\"" msgstr "оператора %d(%s,%s) не Ñ–Ñнує в ÑімейÑтві операторів \"%s\"" -#: commands/opclasscmds.c:1687 +#: commands/opclasscmds.c:1784 #, c-format msgid "function %d(%s,%s) does not exist in operator family \"%s\"" msgstr "функції %d(%s,%s) не Ñ–Ñнує в ÑімейÑтві операторів \"%s\"" -#: commands/opclasscmds.c:1718 +#: commands/opclasscmds.c:1815 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² \"%s\" Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ доÑтупу \"%s\" вже Ñ–Ñнує в Ñхемі \"%s\"" -#: commands/opclasscmds.c:1741 +#: commands/opclasscmds.c:1838 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "ÑімейÑтво операторів \"%s\" Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ доÑтупу \"%s\" вже Ñ–Ñнує в Ñхемі \"%s\"" -#: commands/operatorcmds.c:111 commands/operatorcmds.c:119 +#: commands/operatorcmds.c:113 commands/operatorcmds.c:121 #, c-format msgid "SETOF type not allowed for operator argument" msgstr "Ðргументом оператора не може бути тип SETOF" -#: commands/operatorcmds.c:152 commands/operatorcmds.c:479 +#: commands/operatorcmds.c:154 commands/operatorcmds.c:554 #, c-format msgid "operator attribute \"%s\" not recognized" msgstr "атрибут оператора \"%s\" не розпізнаний" -#: commands/operatorcmds.c:163 +#: commands/operatorcmds.c:165 #, c-format msgid "operator function must be specified" msgstr "необхідно вказати функцію оператора" -#: commands/operatorcmds.c:181 +#: commands/operatorcmds.c:183 #, c-format msgid "operator argument types must be specified" msgstr "необхідно вказати типи аргументу оператора" -#: commands/operatorcmds.c:185 +#: commands/operatorcmds.c:187 #, c-format msgid "operator right argument type must be specified" msgstr "необхідно вказати правильний тип аргументу оператора" -#: commands/operatorcmds.c:186 +#: commands/operatorcmds.c:188 #, c-format msgid "Postfix operators are not supported." msgstr "ПоÑтфікÑні оператори не підтримуютьÑÑ." -#: commands/operatorcmds.c:290 +#: commands/operatorcmds.c:292 #, c-format msgid "restriction estimator function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¾Ñ†Ñ–Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ %s повинна повертати тип %s" -#: commands/operatorcmds.c:333 +#: commands/operatorcmds.c:335 #, c-format msgid "join estimator function %s has multiple matches" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¾Ñ†Ñ–Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ %s має декілька збігів" -#: commands/operatorcmds.c:348 +#: commands/operatorcmds.c:350 #, c-format msgid "join estimator function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¾Ñ†Ñ–Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ %s повинна повертати тип %s" -#: commands/operatorcmds.c:473 +#: commands/operatorcmds.c:388 parser/parse_oper.c:119 parser/parse_oper.c:637 +#: utils/adt/regproc.c:509 utils/adt/regproc.c:683 +#, c-format +msgid "operator does not exist: %s" +msgstr "оператор не Ñ–Ñнує: %s" + +#: commands/operatorcmds.c:396 parser/parse_oper.c:702 parser/parse_oper.c:815 +#, c-format +msgid "operator is only a shell: %s" +msgstr "оператор Ñ” лише оболонкою: %s" + +#: commands/operatorcmds.c:548 #, c-format msgid "operator attribute \"%s\" cannot be changed" msgstr "атрибут оператора \"%s\" неможливо змінити" -#: commands/policy.c:89 commands/policy.c:382 commands/statscmds.c:149 -#: commands/tablecmds.c:1609 commands/tablecmds.c:2197 -#: commands/tablecmds.c:3423 commands/tablecmds.c:6312 -#: commands/tablecmds.c:9104 commands/tablecmds.c:17033 -#: commands/tablecmds.c:17068 commands/trigger.c:327 commands/trigger.c:1382 -#: commands/trigger.c:1492 rewrite/rewriteDefine.c:278 -#: rewrite/rewriteDefine.c:945 rewrite/rewriteRemove.c:80 +#: commands/operatorcmds.c:615 commands/operatorcmds.c:622 +#: commands/operatorcmds.c:628 commands/operatorcmds.c:634 +#, c-format +msgid "operator attribute \"%s\" cannot be changed if it has already been set" +msgstr "атрибут оператора \"%s\" не може бути змінений, Ñкщо він вже вÑтановлений" + +#: commands/policy.c:86 commands/policy.c:379 commands/statscmds.c:146 +#: commands/tablecmds.c:1740 commands/tablecmds.c:2340 +#: commands/tablecmds.c:3702 commands/tablecmds.c:6605 +#: commands/tablecmds.c:9668 commands/tablecmds.c:17803 +#: commands/tablecmds.c:17838 commands/trigger.c:316 commands/trigger.c:1332 +#: commands/trigger.c:1442 rewrite/rewriteDefine.c:268 +#: rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 #, c-format msgid "permission denied: \"%s\" is a system catalog" msgstr "доÑтуп заборонений: \"%s\" - ÑиÑтемний каталог" -#: commands/policy.c:172 +#: commands/policy.c:169 #, c-format msgid "ignoring specified roles other than PUBLIC" msgstr "вÑÑ– вказані ролі, крім PUBLIC, ігноруютьÑÑ" -#: commands/policy.c:173 +#: commands/policy.c:170 #, c-format msgid "All roles are members of the PUBLIC role." msgstr "Роль PUBLIC включає в Ñебе вÑÑ– інші ролі." -#: commands/policy.c:607 +#: commands/policy.c:603 #, c-format msgid "WITH CHECK cannot be applied to SELECT or DELETE" msgstr "WITH CHECK не можна заÑтоÑувати до SELECT або DELETE" -#: commands/policy.c:616 commands/policy.c:921 +#: commands/policy.c:612 commands/policy.c:915 #, c-format msgid "only WITH CHECK expression allowed for INSERT" msgstr "Ð´Ð»Ñ INSERT допуÑкаєтьÑÑ Ð»Ð¸ÑˆÐµ вираз WITH CHECK" -#: commands/policy.c:691 commands/policy.c:1144 +#: commands/policy.c:686 commands/policy.c:1138 #, c-format msgid "policy \"%s\" for table \"%s\" already exists" msgstr "політика \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\" вже Ñ–Ñнує" -#: commands/policy.c:893 commands/policy.c:1172 commands/policy.c:1243 +#: commands/policy.c:887 commands/policy.c:1166 commands/policy.c:1237 #, c-format msgid "policy \"%s\" for table \"%s\" does not exist" msgstr "політика \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\" не Ñ–Ñнує" -#: commands/policy.c:911 +#: commands/policy.c:905 #, c-format msgid "only USING expression allowed for SELECT, DELETE" msgstr "Ð´Ð»Ñ SELECT, DELETE допуÑкаєтьÑÑ Ð»Ð¸ÑˆÐµ вираз USING" @@ -9131,247 +9711,259 @@ msgid "cannot create a cursor WITH HOLD within security-restricted operation" msgstr "не можна Ñтворити курÑÐ¾Ñ WITH HOLD в межах операції з обмеженнÑм по безпеці" #: commands/portalcmds.c:189 commands/portalcmds.c:242 -#: executor/execCurrent.c:70 utils/adt/xml.c:2593 utils/adt/xml.c:2763 +#: executor/execCurrent.c:70 utils/adt/xml.c:2936 utils/adt/xml.c:3106 #, c-format msgid "cursor \"%s\" does not exist" msgstr "курÑор \"%s\" не Ñ–Ñнує" -#: commands/prepare.c:75 +#: commands/prepare.c:72 #, c-format msgid "invalid statement name: must not be empty" msgstr "неприпуÑтиме ім'Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°: не повинне бути пуÑтим" -#: commands/prepare.c:230 commands/prepare.c:235 +#: commands/prepare.c:227 commands/prepare.c:232 #, c-format msgid "prepared statement is not a SELECT" msgstr "підготовлений оператор не SELECT" -#: commands/prepare.c:295 +#: commands/prepare.c:292 #, c-format msgid "wrong number of parameters for prepared statement \"%s\"" msgstr "невірне чиÑло параметрів Ð´Ð»Ñ Ð¿Ñ–Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð¾Ð³Ð¾ оператора \"%s\"" -#: commands/prepare.c:297 +#: commands/prepare.c:294 #, c-format msgid "Expected %d parameters but got %d." msgstr "ОчікувалоÑÑŒ %d параметрів, але отримано %d." -#: commands/prepare.c:330 +#: commands/prepare.c:327 #, c-format msgid "parameter $%d of type %s cannot be coerced to the expected type %s" msgstr "параметр $%d типу %s не можна привеÑти до очікуваного типу %s" -#: commands/prepare.c:414 +#: commands/prepare.c:411 #, c-format msgid "prepared statement \"%s\" already exists" msgstr "підготовлений оператор \"%s\" вже Ñ–Ñнує" -#: commands/prepare.c:453 +#: commands/prepare.c:450 #, c-format msgid "prepared statement \"%s\" does not exist" msgstr "підготовлений оператор \"%s\" не Ñ–Ñнує" -#: commands/proclang.c:68 +#: commands/proclang.c:66 #, c-format msgid "must be superuser to create custom procedural language" msgstr "Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацької мови потрібно бути ÑуперкориÑтувачем" -#: commands/publicationcmds.c:129 +#: commands/publicationcmds.c:124 postmaster/postmaster.c:1108 +#: postmaster/postmaster.c:1210 utils/init/miscinit.c:1865 #, c-format -msgid "invalid list syntax for \"publish\" option" -msgstr "неприпуÑтимий ÑпиÑок ÑинтакÑиÑу параметру \"publish\"" +msgid "invalid list syntax in parameter \"%s\"" +msgstr "неприпуÑтимий ÑинтакÑÐ¸Ñ ÑпиÑку в параметрі \"%s\"" -#: commands/publicationcmds.c:147 +#: commands/publicationcmds.c:143 #, c-format -msgid "unrecognized \"publish\" value: \"%s\"" -msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"publish\": \"%s\"" +msgid "unrecognized value for publication option \"%s\": \"%s\"" +msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° публікації \"%s\": \"%s\"" -#: commands/publicationcmds.c:160 +#: commands/publicationcmds.c:157 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "нерозпізнаний параметр публікації: \"%s\"" -#: commands/publicationcmds.c:201 +#: commands/publicationcmds.c:198 #, c-format msgid "no schema has been selected for CURRENT_SCHEMA" msgstr "жодної Ñхеми не вибрано Ð´Ð»Ñ CURRENT_SCHEMA" -#: commands/publicationcmds.c:240 -#, c-format -msgid "Table \"%s\" in schema \"%s\" is already part of the publication, adding the same schema is not supported." -msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" в Ñхемі \"%s\" вже Ñ” чаÑтиною публікації, Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ñ‚Ñ–Ñ”Ñ— ж Ñхеми не підтримуєтьÑÑ." +#: commands/publicationcmds.c:495 +msgid "System columns are not allowed." +msgstr "СиÑтемні Ñтовпці не допуÑкаютьÑÑ." -#: commands/publicationcmds.c:246 -#, c-format -msgid "cannot add relation \"%s.%s\" to publication" -msgstr "не можна додати Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" до публікації" +#: commands/publicationcmds.c:502 commands/publicationcmds.c:507 +#: commands/publicationcmds.c:524 +msgid "User-defined operators are not allowed." +msgstr "КориÑтувацькі оператори не допуÑкаютьÑÑ." -#: commands/publicationcmds.c:249 -#, c-format -msgid "Table's schema \"%s\" is already part of the publication or part of the specified schema list." -msgstr "Схема таблиці \"%s\" вже Ñ” чаÑтиною публікації або чаÑтиною вказаного ÑпиÑку Ñхем." +#: commands/publicationcmds.c:548 +msgid "Only columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions are allowed." +msgstr "ДозволÑютьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ Ñтовпці, конÑтанти, вбудовані оператори, вбудовані типи даних, вбудовані параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° незмінні вбудовані функції." -#: commands/publicationcmds.c:504 +#: commands/publicationcmds.c:560 msgid "User-defined types are not allowed." msgstr "КориÑтувацькі типи не допуÑкаютьÑÑ." -#: commands/publicationcmds.c:507 +#: commands/publicationcmds.c:563 msgid "User-defined or built-in mutable functions are not allowed." msgstr "КориÑтувацькі або вбудовані змінні функції не допуÑкаютьÑÑ." -#: commands/publicationcmds.c:510 +#: commands/publicationcmds.c:566 msgid "User-defined collations are not allowed." msgstr "КориÑтувацькі параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ допуÑкаютьÑÑ." -#: commands/publicationcmds.c:564 -msgid "System columns are not allowed." -msgstr "СиÑтемні Ñтовпці не допуÑкаютьÑÑ." - -#: commands/publicationcmds.c:571 commands/publicationcmds.c:576 -#: commands/publicationcmds.c:593 -msgid "User-defined operators are not allowed." -msgstr "КориÑтувацькі оператори не допуÑкаютьÑÑ." - -#: commands/publicationcmds.c:617 -msgid "Expressions only allow columns, constants, built-in operators, built-in data types, built-in collations, and immutable built-in functions." -msgstr "Вирази допуÑкають лише Ñтовпці, конÑтанти, вбудовані оператори, вбудовані типи даних, вбудовані параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– незмінні вбудовані функції." - -#: commands/publicationcmds.c:631 +#: commands/publicationcmds.c:576 #, c-format msgid "invalid publication WHERE expression" msgstr "неприпуÑтимий вираз публікації WHERE" -#: commands/publicationcmds.c:684 +#: commands/publicationcmds.c:629 #, c-format msgid "cannot use publication WHERE clause for relation \"%s\"" msgstr "викориÑтовувати вираз публікації WHERE Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не можна" -#: commands/publicationcmds.c:686 +#: commands/publicationcmds.c:631 #, c-format msgid "WHERE clause cannot be used for a partitioned table when %s is false." msgstr "вираз WHERE Ð´Ð»Ñ Ñекціонованих таблиць не можна викориÑтовувати, коли %s Ñ” false." -#: commands/publicationcmds.c:744 +#: commands/publicationcmds.c:702 commands/publicationcmds.c:716 #, c-format -msgid "cannot use publication column list for relation \"%s\"" -msgstr "викориÑтовувати ÑпиÑок Ñтовпців публікації Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не можна" +msgid "cannot use column list for relation \"%s.%s\" in publication \"%s\"" +msgstr "не можна викориÑтовувати ÑпиÑок Ñтовпців Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" в публікації \"%s\"" -#: commands/publicationcmds.c:746 +#: commands/publicationcmds.c:705 #, c-format -msgid "Column list cannot be used for a partitioned table when %s is false." -msgstr "СпиÑок Ñтовпців Ð´Ð»Ñ Ñекціонованих таблиць не можна викориÑтовувати, коли %s Ñ” false." +msgid "Column lists cannot be specified in publications containing FOR TABLES IN SCHEMA elements." +msgstr "СпиÑки Ñтовпців не можна вказувати в публікаціÑÑ…, що міÑÑ‚Ñть елементи FOR TABLES IN SCHEMA." -#: commands/publicationcmds.c:781 +#: commands/publicationcmds.c:719 +#, c-format +msgid "Column lists cannot be specified for partitioned tables when %s is false." +msgstr "СпиÑки Ñтовпців Ð´Ð»Ñ Ñекціонованих таблиць не можна викориÑтовувати, коли %s Ñ” false." + +#: commands/publicationcmds.c:754 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— УСІХ ТÐБЛИЦЬ потрібно бути ÑуперкориÑтувачем" -#: commands/publicationcmds.c:854 +#: commands/publicationcmds.c:825 #, c-format -msgid "must be superuser to create FOR ALL TABLES IN SCHEMA publication" -msgstr "Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— FOR ALL TABLES IN SCHEMA потрібно бути ÑуперкориÑтувачем" +msgid "must be superuser to create FOR TABLES IN SCHEMA publication" +msgstr "щоб Ñтворити публікацію FOR TABLES IN SCHEMA потрібно бути ÑуперкориÑтувачем" -#: commands/publicationcmds.c:893 +#: commands/publicationcmds.c:861 #, c-format -msgid "wal_level is insufficient to publish logical changes" -msgstr "недоÑтатній wal_level Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— логічних змін" +msgid "\"wal_level\" is insufficient to publish logical changes" +msgstr "недоÑтатній \"wal_level\" Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— логічних змін" -#: commands/publicationcmds.c:894 +#: commands/publicationcmds.c:862 #, c-format -msgid "Set wal_level to logical before creating subscriptions." -msgstr "Ð’Ñтановіть wal_level на \"logical\" перед ÑтвореннÑм підпиÑок." +msgid "Set \"wal_level\" to \"logical\" before creating subscriptions." +msgstr "Ð’Ñтановіть \"wal_level\" на \"logical\" перед ÑтвореннÑм підпиÑок." -#: commands/publicationcmds.c:991 commands/publicationcmds.c:999 +#: commands/publicationcmds.c:958 commands/publicationcmds.c:966 #, c-format msgid "cannot set parameter \"%s\" to false for publication \"%s\"" msgstr "вÑтановити параметр \"%s\" на false Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"%s\" не можна" -#: commands/publicationcmds.c:994 +#: commands/publicationcmds.c:961 #, c-format msgid "The publication contains a WHERE clause for partitioned table \"%s\", which is not allowed when \"%s\" is false." msgstr "ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¼Ñ–Ñтить вираз WHERE Ð´Ð»Ñ Ñекціонованої таблиці \"%s\", Ñкий не допуÑкаєтьÑÑ ÐºÐ¾Ð»Ð¸ \"%s\" Ñ” false." -#: commands/publicationcmds.c:1002 +#: commands/publicationcmds.c:969 #, c-format msgid "The publication contains a column list for partitioned table \"%s\", which is not allowed when \"%s\" is false." msgstr "ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¼Ñ–Ñтить ÑпиÑок Ñтовпців Ð´Ð»Ñ Ñекціонованої таблиці \"%s\", Ñкий не допуÑкаєтьÑÑ ÐºÐ¾Ð»Ð¸ \"%s\" Ñ” false." -#: commands/publicationcmds.c:1364 +#: commands/publicationcmds.c:1292 +#, c-format +msgid "cannot add schema to publication \"%s\"" +msgstr "не можна додати Ñхему до публікації \"%s\"" + +#: commands/publicationcmds.c:1294 +#, c-format +msgid "Schemas cannot be added if any tables that specify a column list are already part of the publication." +msgstr "Схеми не можна додавати, Ñкщо будь-Ñка таблицÑ, що вказуює на ÑпиÑок Ñтовпців, вже Ñ” чаÑтиною публікації." + +#: commands/publicationcmds.c:1342 #, c-format msgid "must be superuser to add or set schemas" msgstr "Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñхем потрібно бути ÑуперкориÑтувачем" -#: commands/publicationcmds.c:1373 commands/publicationcmds.c:1381 +#: commands/publicationcmds.c:1351 commands/publicationcmds.c:1359 #, c-format msgid "publication \"%s\" is defined as FOR ALL TABLES" msgstr "Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ \"%s\" визначена ДЛЯ ВСІХ ТÐБЛИЦЬ" -#: commands/publicationcmds.c:1375 +#: commands/publicationcmds.c:1353 #, c-format -msgid "Tables from schema cannot be added to, dropped from, or set on FOR ALL TABLES publications." -msgstr "Таблиці з Ñхеми не можуть бути додані до публікацій FOR ALL TABLES, видалені з них або вÑтановлені до них." +msgid "Schemas cannot be added to or dropped from FOR ALL TABLES publications." +msgstr "До публікації FOR ALL TABLES не можна додати або видалити Ñхеми." -#: commands/publicationcmds.c:1383 +#: commands/publicationcmds.c:1361 #, c-format msgid "Tables cannot be added to or dropped from FOR ALL TABLES publications." msgstr "У публікації ВСІХ ТÐБЛИЦЬ не можна додати або видалити таблиці." -#: commands/publicationcmds.c:1642 commands/publicationcmds.c:1705 +#: commands/publicationcmds.c:1385 commands/publicationcmds.c:1424 +#: commands/publicationcmds.c:1961 utils/cache/lsyscache.c:3634 +#, c-format +msgid "publication \"%s\" does not exist" +msgstr "Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ \"%s\" вже Ñ–Ñнує" + +#: commands/publicationcmds.c:1587 commands/publicationcmds.c:1650 #, c-format msgid "conflicting or redundant WHERE clauses for table \"%s\"" msgstr "конфліктуючі або надлишкові вирази WHERE Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: commands/publicationcmds.c:1649 commands/publicationcmds.c:1717 +#: commands/publicationcmds.c:1594 commands/publicationcmds.c:1662 #, c-format msgid "conflicting or redundant column lists for table \"%s\"" msgstr "конфліктуючі або надлишкові ÑпиÑки Ñтовпців Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: commands/publicationcmds.c:1851 +#: commands/publicationcmds.c:1796 #, c-format msgid "column list must not be specified in ALTER PUBLICATION ... DROP" msgstr "ÑпиÑок Ñтовпців не можна вказувати в ALTER PUBLICATION ... DROP" -#: commands/publicationcmds.c:1863 +#: commands/publicationcmds.c:1808 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "відноÑини \"%s\" не Ñ” чаÑтиною публікації" -#: commands/publicationcmds.c:1870 +#: commands/publicationcmds.c:1815 #, c-format msgid "cannot use a WHERE clause when removing a table from a publication" msgstr "під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– з публікації викориÑтовувати вираз WHERE не можна" -#: commands/publicationcmds.c:1930 +#: commands/publicationcmds.c:1875 #, c-format msgid "tables from schema \"%s\" are not part of the publication" msgstr "таблиці зі Ñхеми \"%s\" не Ñ” чаÑтиною публікації" -#: commands/publicationcmds.c:1973 commands/publicationcmds.c:1980 +#: commands/publicationcmds.c:1918 commands/publicationcmds.c:1925 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "немає прав на зміну влаÑника публікації \"%s\"" -#: commands/publicationcmds.c:1975 +#: commands/publicationcmds.c:1920 #, c-format msgid "The owner of a FOR ALL TABLES publication must be a superuser." msgstr "ВлаÑником публікації УСІХ ТÐБЛИЦЬ повинен бути ÑуперкориÑтувач." -#: commands/publicationcmds.c:1982 +#: commands/publicationcmds.c:1927 +#, c-format +msgid "The owner of a FOR TABLES IN SCHEMA publication must be a superuser." +msgstr "ВлаÑник публікації публікації FOR TABLES IN SCHEMA повинен бути ÑуперкориÑтувачем." + +#: commands/publicationcmds.c:1993 #, c-format -msgid "The owner of a FOR ALL TABLES IN SCHEMA publication must be a superuser." -msgstr "ВлаÑник публікації FOR ALL TABLES IN SCHEMA повинен бути ÑуперкориÑтувачем." +msgid "publication with OID %u does not exist" +msgstr "публікації %u з OID не Ñ–Ñнує" -#: commands/schemacmds.c:105 commands/schemacmds.c:270 +#: commands/schemacmds.c:109 commands/schemacmds.c:289 #, c-format msgid "unacceptable schema name \"%s\"" msgstr "непримуÑтиме ім'Ñ Ñхеми \"%s\"" -#: commands/schemacmds.c:106 commands/schemacmds.c:271 +#: commands/schemacmds.c:110 commands/schemacmds.c:290 #, c-format msgid "The prefix \"pg_\" is reserved for system schemas." msgstr "ÐŸÑ€ÐµÑ„Ñ–ÐºÑ \"pg_\" зарезервований Ð´Ð»Ñ ÑиÑтемних Ñхем." -#: commands/schemacmds.c:130 +#: commands/schemacmds.c:134 #, c-format msgid "schema \"%s\" already exists, skipping" msgstr "Ñхема \"%s\" вже Ñ–Ñнує, пропуÑкаєтьÑÑ" @@ -9401,3059 +9993,3254 @@ msgstr "мітки безпеки не підтримуютьÑÑ Ð´Ð»Ñ Ñ†ÑŒÐ¾ msgid "cannot set security label on relation \"%s\"" msgstr "не можна вÑтановити мітку безпеки Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/sequence.c:755 +#: commands/sequence.c:748 #, c-format msgid "nextval: reached maximum value of sequence \"%s\" (%lld)" msgstr "nextval: доÑÑгнено макÑимального Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾ÑлідовноÑті \"%s\" (%lld)" -#: commands/sequence.c:774 +#: commands/sequence.c:767 #, c-format msgid "nextval: reached minimum value of sequence \"%s\" (%lld)" msgstr "nextval: доÑÑгнено мінімального Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾ÑлідовноÑті \"%s\" (%lld)" -#: commands/sequence.c:892 +#: commands/sequence.c:886 #, c-format msgid "currval of sequence \"%s\" is not yet defined in this session" msgstr "поточне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ (currval) Ð´Ð»Ñ Ð¿Ð¾ÑлідовноÑті \"%s\" ще не визначено у цьому ÑеанÑÑ–" -#: commands/sequence.c:911 commands/sequence.c:917 +#: commands/sequence.c:905 commands/sequence.c:911 #, c-format msgid "lastval is not yet defined in this session" msgstr "оÑтаннє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‰Ðµ не визначено в цьому ÑеанÑÑ–" -#: commands/sequence.c:997 +#: commands/sequence.c:991 #, c-format msgid "setval: value %lld is out of bounds for sequence \"%s\" (%lld..%lld)" msgstr "setval: Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %lld поза межами поÑлідовноÑті \"%s\" (%lld..%lld)" -#: commands/sequence.c:1365 +#: commands/sequence.c:1357 #, c-format msgid "invalid sequence option SEQUENCE NAME" msgstr "неприпуÑтимий параметр поÑлідовноÑті SEQUENCE NAME" -#: commands/sequence.c:1391 +#: commands/sequence.c:1383 #, c-format msgid "identity column type must be smallint, integer, or bigint" msgstr "типом ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— може бути тільки smallint, integer або bigint" -#: commands/sequence.c:1392 +#: commands/sequence.c:1384 #, c-format msgid "sequence type must be smallint, integer, or bigint" msgstr "типом поÑлідовноÑті може бути тільки smallint, integer або bigint" -#: commands/sequence.c:1426 +#: commands/sequence.c:1418 #, c-format msgid "INCREMENT must not be zero" msgstr "INCREMENT не повинен бути нулем" -#: commands/sequence.c:1474 +#: commands/sequence.c:1466 #, c-format msgid "MAXVALUE (%lld) is out of range for sequence data type %s" msgstr "MAXVALUE (%lld) виходить за межі діапазону типу даних поÑлідовноÑті %s" -#: commands/sequence.c:1506 +#: commands/sequence.c:1498 #, c-format msgid "MINVALUE (%lld) is out of range for sequence data type %s" msgstr "MINVALUE (%lld) виходить за межі діапазону Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ даних поÑлідовноÑті %s" -#: commands/sequence.c:1514 +#: commands/sequence.c:1506 #, c-format msgid "MINVALUE (%lld) must be less than MAXVALUE (%lld)" msgstr "MINVALUE (%lld) повинно бути меншим за MAXVALUE (%lld)" -#: commands/sequence.c:1535 +#: commands/sequence.c:1527 #, c-format msgid "START value (%lld) cannot be less than MINVALUE (%lld)" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ START (%lld) не може бути меншим за MINVALUE (%lld)" -#: commands/sequence.c:1541 +#: commands/sequence.c:1533 #, c-format msgid "START value (%lld) cannot be greater than MAXVALUE (%lld)" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ START (%lld) не може бути більшим за MAXVALUE (%lld)" -#: commands/sequence.c:1565 +#: commands/sequence.c:1557 #, c-format msgid "RESTART value (%lld) cannot be less than MINVALUE (%lld)" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ RESTART (%lld) не може бути меншим за MINVALUE (%lld)" -#: commands/sequence.c:1571 +#: commands/sequence.c:1563 #, c-format msgid "RESTART value (%lld) cannot be greater than MAXVALUE (%lld)" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ RESTART (%lld) не може бути більшим за MAXVALUE (%lld)" -#: commands/sequence.c:1582 +#: commands/sequence.c:1574 #, c-format msgid "CACHE (%lld) must be greater than zero" msgstr "CACHE (%lld) повинно бути більше нулÑ" -#: commands/sequence.c:1618 +#: commands/sequence.c:1610 #, c-format msgid "invalid OWNED BY option" msgstr "неприпуÑтимий параметр OWNED BY" -#: commands/sequence.c:1619 +#: commands/sequence.c:1611 #, c-format msgid "Specify OWNED BY table.column or OWNED BY NONE." msgstr "Вкажіть OWNED BY таблицÑ.Ñтовпець або OWNED BY NONE." -#: commands/sequence.c:1644 +#: commands/sequence.c:1636 #, c-format msgid "sequence cannot be owned by relation \"%s\"" msgstr "поÑлідовніÑть не може належати відношенню \"%s\"" -#: commands/sequence.c:1652 +#: commands/sequence.c:1644 #, c-format msgid "sequence must have same owner as table it is linked to" msgstr "поÑлідовніÑть повинна мати того ж влаÑника, що Ñ– таблицÑ, з Ñкою вона зв'Ñзана" -#: commands/sequence.c:1656 +#: commands/sequence.c:1648 #, c-format msgid "sequence must be in same schema as table it is linked to" msgstr "поÑлідовніÑть повинна бути в тій Ñамій Ñхемі, що Ñ– таблицÑ, з Ñкою вона зв'Ñзана" -#: commands/sequence.c:1678 +#: commands/sequence.c:1670 #, c-format msgid "cannot change ownership of identity sequence" msgstr "змінити влаÑника поÑлідовноÑті ідентифікації не можна" -#: commands/sequence.c:1679 commands/tablecmds.c:13775 -#: commands/tablecmds.c:16431 +#: commands/sequence.c:1671 commands/tablecmds.c:14517 +#: commands/tablecmds.c:17212 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "ПоÑлідовніÑть \"%s\" зв'Ñзана з таблицею \"%s\"." -#: commands/statscmds.c:109 commands/statscmds.c:118 tcop/utility.c:1876 +#: commands/statscmds.c:106 commands/statscmds.c:115 tcop/utility.c:1883 #, c-format msgid "only a single relation is allowed in CREATE STATISTICS" msgstr "в CREATE STATISTICS можна вказати лише одне відношеннÑ" -#: commands/statscmds.c:136 +#: commands/statscmds.c:133 #, c-format msgid "cannot define statistics for relation \"%s\"" msgstr "визначити ÑтатиÑтику Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не можна" -#: commands/statscmds.c:191 +#: commands/statscmds.c:187 #, c-format msgid "statistics object \"%s\" already exists, skipping" msgstr "об'єкт ÑтатиÑтики \"%s\" вже Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/statscmds.c:199 +#: commands/statscmds.c:195 #, c-format msgid "statistics object \"%s\" already exists" msgstr "об'єкт ÑтатиÑтики \"%s\" вже Ñ–Ñнує" -#: commands/statscmds.c:210 +#: commands/statscmds.c:206 #, c-format msgid "cannot have more than %d columns in statistics" msgstr "в ÑтатиÑтиці не може бути більше ніж %d Ñтовпців" -#: commands/statscmds.c:251 commands/statscmds.c:274 commands/statscmds.c:308 +#: commands/statscmds.c:247 commands/statscmds.c:270 commands/statscmds.c:304 #, c-format msgid "statistics creation on system columns is not supported" msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑтатиÑтики Ð´Ð»Ñ ÑиÑтемних Ñтовпців не підтримуєтьÑÑ" -#: commands/statscmds.c:258 commands/statscmds.c:281 +#: commands/statscmds.c:254 commands/statscmds.c:277 #, c-format msgid "column \"%s\" cannot be used in statistics because its type %s has no default btree operator class" msgstr "Ñтовпець \"%s\" не можна викориÑтати в ÑтатиÑтиці, тому що Ð´Ð»Ñ Ð¹Ð¾Ð³Ð¾ типу %s не визначений ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° (btree) за замовчуваннÑм" -#: commands/statscmds.c:325 +#: commands/statscmds.c:321 #, c-format msgid "expression cannot be used in multivariate statistics because its type %s has no default btree operator class" msgstr "вираз не може викориÑтовуватиÑÑŒ у багатоваріативній ÑтатиÑтиці, тому що його тип %s немає визначеного клаÑу оператора btree за замовчуваннÑм" -#: commands/statscmds.c:346 +#: commands/statscmds.c:342 #, c-format msgid "when building statistics on a single expression, statistics kinds may not be specified" msgstr "при побудові ÑтатиÑтики Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ виразу види ÑтатиÑтики можуть не вказуватиÑÑŒ" -#: commands/statscmds.c:375 +#: commands/statscmds.c:371 #, c-format msgid "unrecognized statistics kind \"%s\"" msgstr "нерозпізнаний вид ÑтатиÑтики \"%s\"" -#: commands/statscmds.c:404 +#: commands/statscmds.c:400 #, c-format msgid "extended statistics require at least 2 columns" msgstr "Ð´Ð»Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¾Ñ— ÑтатиÑтики потрібно мінімум 2 Ñтовпці" -#: commands/statscmds.c:422 +#: commands/statscmds.c:418 #, c-format msgid "duplicate column name in statistics definition" msgstr "Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ñ–Ð¼ÐµÐ½Ñ– ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ñƒ визначенні ÑтатиÑтики" -#: commands/statscmds.c:457 +#: commands/statscmds.c:453 #, c-format msgid "duplicate expression in statistics definition" msgstr "дублікат виразу у визначенні ÑтатиÑтики" -#: commands/statscmds.c:620 commands/tablecmds.c:8072 +#: commands/statscmds.c:628 commands/tablecmds.c:8651 #, c-format msgid "statistics target %d is too low" msgstr "мета ÑтатиÑтики занадто мала %d" -#: commands/statscmds.c:628 commands/tablecmds.c:8080 +#: commands/statscmds.c:636 commands/tablecmds.c:8659 #, c-format msgid "lowering statistics target to %d" msgstr "мета ÑтатиÑтики знижуєтьÑÑ Ð´Ð¾ %d" -#: commands/statscmds.c:651 +#: commands/statscmds.c:660 #, c-format msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "об'єкт ÑтатиÑтики \"%s.%s\" не Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/subscriptioncmds.c:251 commands/subscriptioncmds.c:298 +#: commands/subscriptioncmds.c:275 commands/subscriptioncmds.c:372 #, c-format msgid "unrecognized subscription parameter: \"%s\"" msgstr "нерозпізнаний параметр підпиÑки: \"%s\"" -#: commands/subscriptioncmds.c:289 +#: commands/subscriptioncmds.c:340 replication/pgoutput/pgoutput.c:404 +#, c-format +msgid "unrecognized origin value: \"%s\"" +msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ: \"%s\"" + +#: commands/subscriptioncmds.c:363 #, c-format msgid "invalid WAL location (LSN): %s" msgstr "неприпуÑтиме Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL (LSN): %s" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:313 commands/subscriptioncmds.c:320 -#: commands/subscriptioncmds.c:327 commands/subscriptioncmds.c:349 -#: commands/subscriptioncmds.c:365 +#: commands/subscriptioncmds.c:387 commands/subscriptioncmds.c:394 +#: commands/subscriptioncmds.c:401 commands/subscriptioncmds.c:423 +#: commands/subscriptioncmds.c:439 #, c-format msgid "%s and %s are mutually exclusive options" msgstr "%s та %s Ñ” взаємовиключними опціÑми" #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:355 commands/subscriptioncmds.c:371 +#: commands/subscriptioncmds.c:429 commands/subscriptioncmds.c:445 #, c-format msgid "subscription with %s must also set %s" msgstr "підпиÑка з %s повинна також вÑтановити %s" -#: commands/subscriptioncmds.c:433 +#: commands/subscriptioncmds.c:506 +#, c-format +msgid "could not receive list of publications from the publisher: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑпиÑок публікацій з Ñервера публікації: %s" + +#: commands/subscriptioncmds.c:538 #, c-format -msgid "could not receive publication from the publisher: %s" -msgid_plural "could not receive list of publications from the publisher: %s" -msgstr[0] "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ публікацію з Ñервера публікації: %s" -msgstr[1] "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑпиÑок публікацій з Ñервера публікації: %s" -msgstr[2] "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑпиÑок публікацій з Ñервера публікації: %s" -msgstr[3] "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑпиÑок публікацій з Ñервера публікації: %s" +msgid "publication %s does not exist on the publisher" +msgid_plural "publications %s do not exist on the publisher" +msgstr[0] "публікації %s не Ñ–Ñнує на Ñервері публікації" +msgstr[1] "публікацій %s не Ñ–Ñнує на Ñервері публікації" +msgstr[2] "публікацій %s не Ñ–Ñнує на Ñервері публікації" +msgstr[3] "публікацій %s не Ñ–Ñнує на Ñервері публікації" -#: commands/subscriptioncmds.c:467 +#: commands/subscriptioncmds.c:626 #, c-format -msgid "publication %s does not exist in the publisher" -msgid_plural "publications %s do not exist in the publisher" -msgstr[0] "Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ %s не Ñ–Ñнує на Ñервері публікації" -msgstr[1] "публікації %s не Ñ–Ñнують на Ñервері публікації" -msgstr[2] "публікації %s не Ñ–Ñнують на Ñервері публікації" -msgstr[3] "публікації %s не Ñ–Ñнують на Ñервері публікації" +msgid "permission denied to create subscription" +msgstr "немає дозволу Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки" -#: commands/subscriptioncmds.c:549 +#: commands/subscriptioncmds.c:627 #, c-format -msgid "must be superuser to create subscriptions" -msgstr "Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñок потрібно бути ÑуперкориÑтувачем" +msgid "Only roles with privileges of the \"%s\" role may create subscriptions." +msgstr "Тільки ролі з правами \"%s\" можуть Ñтворювати підпиÑки." -#: commands/subscriptioncmds.c:650 commands/subscriptioncmds.c:778 -#: replication/logical/tablesync.c:1236 replication/logical/worker.c:3722 +#: commands/subscriptioncmds.c:758 commands/subscriptioncmds.c:891 +#: commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1345 +#: replication/logical/worker.c:4514 #, c-format msgid "could not connect to the publisher: %s" msgstr "не вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑŒ до Ñервера публікації: %s" -#: commands/subscriptioncmds.c:719 +#: commands/subscriptioncmds.c:829 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "на Ñервері публікації Ñтворений Ñлот реплікації \"%s\"" -#. translator: %s is an SQL ALTER statement -#: commands/subscriptioncmds.c:732 +#: commands/subscriptioncmds.c:841 +#, c-format +msgid "subscription was created, but is not connected" +msgstr "підпиÑка була Ñтворена, але не підключена" + +#: commands/subscriptioncmds.c:842 +#, c-format +msgid "To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription." +msgstr "Щоб ініціювати реплікацію, необхідно вручну Ñтворити Ñлот реплікації, підключити підпиÑку Ñ– оновити підпиÑку." + +#: commands/subscriptioncmds.c:1109 commands/subscriptioncmds.c:1590 +#: commands/subscriptioncmds.c:1973 utils/cache/lsyscache.c:3684 #, c-format -msgid "tables were not subscribed, you will have to run %s to subscribe the tables" -msgstr "таблиці не були підпиÑані, вам необхідно виконати %s, щоб підпиÑати таблиці" +msgid "subscription \"%s\" does not exist" +msgstr "підпиÑка \"%s\" не Ñ–Ñнує" -#: commands/subscriptioncmds.c:1035 +#: commands/subscriptioncmds.c:1166 commands/subscriptioncmds.c:1245 #, c-format msgid "cannot set %s for enabled subscription" msgstr "неможливо вÑтановити %s Ð´Ð»Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð¾Ñ— підпиÑки" -#: commands/subscriptioncmds.c:1088 +#: commands/subscriptioncmds.c:1233 +#, c-format +msgid "cannot set option \"%s\" for a subscription that does not have a slot name" +msgstr "не може задати параметр \"%s\" Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки, Ñка не має назви Ñлоту" + +#: commands/subscriptioncmds.c:1279 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "увімкнути підпиÑку, Ð´Ð»Ñ Ñкої не задано ім'Ñ Ñлота, не можна" -#: commands/subscriptioncmds.c:1131 commands/subscriptioncmds.c:1183 +#: commands/subscriptioncmds.c:1323 commands/subscriptioncmds.c:1374 #, c-format msgid "ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION з оновленнÑм Ð´Ð»Ñ Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ… підпиÑок не допуÑкаєтьÑÑ" -#: commands/subscriptioncmds.c:1132 commands/subscriptioncmds.c:1184 +#: commands/subscriptioncmds.c:1324 #, c-format msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." msgstr "ВикориÑтайте ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false)." -#: commands/subscriptioncmds.c:1141 commands/subscriptioncmds.c:1193 +#: commands/subscriptioncmds.c:1333 commands/subscriptioncmds.c:1388 #, c-format msgid "ALTER SUBSCRIPTION with refresh and copy_data is not allowed when two_phase is enabled" msgstr "ALTER SUBSCRIPTION з параметрами refresh Ñ– copy_data не допуÑкаєтьÑÑ, коли two_phase ввімкнено" -#: commands/subscriptioncmds.c:1142 commands/subscriptioncmds.c:1194 +#: commands/subscriptioncmds.c:1334 +#, c-format +msgid "Use ALTER SUBSCRIPTION ... SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "ВикориÑтайте ALTER SUBSCRIPTION ... SET PUBLICATION з параметрами refresh або copy_data, Ñкі дорівнюють false, або викориÑтайте DROP/CREATE SUBSCRIPTION." + +#. translator: %s is an SQL ALTER command +#: commands/subscriptioncmds.c:1390 #, c-format -msgid "Use ALTER SUBSCRIPTION ...SET PUBLICATION with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." -msgstr "ВикориÑтайте ALTER SUBSCRIPTION ...SET PUBLICATION з параметрами refresh або copy_data, Ñкі дорівнюють false, або викориÑтайте DROP/CREATE SUBSCRIPTION." +msgid "Use %s with refresh = false, or with copy_data = false, or use DROP/CREATE SUBSCRIPTION." +msgstr "ВикориÑтовуйте %s з refresh = false, або з copy_data = false, або викориÑтовуйте DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1214 +#: commands/subscriptioncmds.c:1412 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESH Ð´Ð»Ñ Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ… підпиÑок не допуÑкаєтьÑÑ" -#: commands/subscriptioncmds.c:1239 +#: commands/subscriptioncmds.c:1437 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH with copy_data is not allowed when two_phase is enabled" -msgstr "ALTER SUBSCRIPTION ... REFRESH з параметром copy_data не допуÑкаєтьÑÑ, коли two_phase ввімкнено" +msgstr "ALTER SUBSCRIPTION ... REFRESH з параметром copy_data не допуÑкаєтьÑÑ, коли two_phase ввімкнено" -#: commands/subscriptioncmds.c:1240 +#: commands/subscriptioncmds.c:1438 #, c-format msgid "Use ALTER SUBSCRIPTION ... REFRESH with copy_data = false, or use DROP/CREATE SUBSCRIPTION." msgstr "ВикориÑтайте ALTER SUBSCRIPTION ... REFRESH з параметром copy_data, Ñкий дорівнює false, або викориÑтайте DROP/CREATE SUBSCRIPTION." -#: commands/subscriptioncmds.c:1260 -#, c-format -msgid "must be superuser to skip transaction" -msgstr "щоб пропуÑтити транзакцію потрібно бути ÑуперкориÑтувачем" - -#: commands/subscriptioncmds.c:1280 +#: commands/subscriptioncmds.c:1473 #, c-format msgid "skip WAL location (LSN %X/%X) must be greater than origin LSN %X/%X" msgstr "пропуÑтити Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL (LSN %X/%X) повинно бути більше, ніж origin LSN %X/%X" -#: commands/subscriptioncmds.c:1360 +#: commands/subscriptioncmds.c:1594 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "підпиÑка \"%s\" не Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/subscriptioncmds.c:1618 +#: commands/subscriptioncmds.c:1863 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "видалено Ñлот реплікації \"%s\" на Ñервері публікації" -#: commands/subscriptioncmds.c:1627 commands/subscriptioncmds.c:1635 +#: commands/subscriptioncmds.c:1872 commands/subscriptioncmds.c:1880 #, c-format msgid "could not drop replication slot \"%s\" on publisher: %s" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñлот реплікації \"%s\" на Ñервері публікації: %s" -#: commands/subscriptioncmds.c:1669 +#: commands/subscriptioncmds.c:2005 #, c-format -msgid "permission denied to change owner of subscription \"%s\"" -msgstr "немає прав на зміну влаÑника підпиÑки \"%s\"" - -#: commands/subscriptioncmds.c:1671 -#, c-format -msgid "The owner of a subscription must be a superuser." -msgstr "ВлаÑником підпиÑки повинен бути ÑуперкориÑтувач." +msgid "subscription with OID %u does not exist" +msgstr "підпиÑки %u з OID не Ñ–Ñнує" -#: commands/subscriptioncmds.c:1785 +#: commands/subscriptioncmds.c:2079 commands/subscriptioncmds.c:2204 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑпиÑок реплікованих таблиць із Ñервера публікації: %s" -#: commands/subscriptioncmds.c:1807 replication/logical/tablesync.c:813 -#: replication/pgoutput/pgoutput.c:1066 +#: commands/subscriptioncmds.c:2115 +#, c-format +msgid "subscription \"%s\" requested copy_data with origin = NONE but might copy data that had a different origin" +msgstr "підпиÑка \"%s\" запроÑив copy_data зі походженнÑм = NONE, але може Ñкопіювати дані, що мають інше походженнÑ" + +#: commands/subscriptioncmds.c:2117 +#, c-format +msgid "The subscription being created subscribes to a publication (%s) that contains tables that are written to by other subscriptions." +msgid_plural "The subscription being created subscribes to publications (%s) that contain tables that are written to by other subscriptions." +msgstr[0] "Створювана підпиÑка підпиÑуєтьÑÑ Ð½Ð° публікацію (%s), Ñкі міÑтить таблиці, до Ñких запиÑуютьÑÑ Ñ–Ð½ÑˆÑ– підпиÑки." +msgstr[1] "Створювана підпиÑка підпиÑуєтьÑÑ Ð½Ð° публікації (%s), Ñка міÑтить таблиці, до Ñких запиÑуютьÑÑ Ñ–Ð½ÑˆÑ– підпиÑки." +msgstr[2] "Створювана підпиÑка підпиÑуєтьÑÑ Ð½Ð° публікації (%s), Ñка міÑтить таблиці, до Ñких запиÑуютьÑÑ Ñ–Ð½ÑˆÑ– підпиÑки." +msgstr[3] "Створювана підпиÑка підпиÑуєтьÑÑ Ð½Ð° публікації (%s), Ñка міÑтить таблиці, до Ñких запиÑуютьÑÑ Ñ–Ð½ÑˆÑ– підпиÑки." + +#: commands/subscriptioncmds.c:2120 +#, c-format +msgid "Verify that initial data copied from the publisher tables did not come from other origins." +msgstr "ПереконайтеÑÑ, що вихідні дані, Ñкопійовані з таблиць публікатора, не були отримані з інших джерел." + +#: commands/subscriptioncmds.c:2226 replication/logical/tablesync.c:906 +#: replication/pgoutput/pgoutput.c:1143 #, c-format msgid "cannot use different column lists for table \"%s.%s\" in different publications" msgstr "викориÑтовувати різні ÑпиÑки Ñтовпців Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s.%s\" в різних публікаціÑÑ… не можна" -#: commands/subscriptioncmds.c:1857 +#: commands/subscriptioncmds.c:2276 #, c-format msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" msgstr "не вдалоÑÑ Ð·'єднатиÑÑŒ з Ñервером публікації під Ñ‡Ð°Ñ Ñпроби видалити Ñлот реплікації \"%s\": %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:1860 +#: commands/subscriptioncmds.c:2279 #, c-format -msgid "Use %s to disassociate the subscription from the slot." -msgstr "ВикориÑтовуйте %s , щоб відв'Ñзати підпиÑку від Ñлоту." +msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." +msgstr "ВикориÑтовуйте %s, щоб вимкнути підпиÑку, а потім викориÑтайте %s, щоб від'єднати Ñ—Ñ— від Ñлоту." -#: commands/subscriptioncmds.c:1890 +#: commands/subscriptioncmds.c:2310 #, c-format msgid "publication name \"%s\" used more than once" msgstr "ім'Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"%s\" викориÑтовуєтьÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ ніж один раз" -#: commands/subscriptioncmds.c:1934 +#: commands/subscriptioncmds.c:2354 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ \"%s\" вже в підпиÑці \"%s\"" -#: commands/subscriptioncmds.c:1948 +#: commands/subscriptioncmds.c:2368 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ \"%s\" не знаходитьÑÑ Ð² підпиÑці \"%s\"" -#: commands/subscriptioncmds.c:1959 +#: commands/subscriptioncmds.c:2379 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "не можна видалити вÑÑ– публікації з підпиÑки" -#: commands/tablecmds.c:245 commands/tablecmds.c:287 +#: commands/subscriptioncmds.c:2436 +#, c-format +msgid "%s requires a Boolean value or \"parallel\"" +msgstr "%s потребує логічне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ \"parallel\"" + +#: commands/tablecmds.c:255 commands/tablecmds.c:297 #, c-format msgid "table \"%s\" does not exist" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" не Ñ–Ñнує" -#: commands/tablecmds.c:246 commands/tablecmds.c:288 +#: commands/tablecmds.c:256 commands/tablecmds.c:298 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" не Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/tablecmds.c:248 commands/tablecmds.c:290 +#: commands/tablecmds.c:258 commands/tablecmds.c:300 msgid "Use DROP TABLE to remove a table." msgstr "ВикориÑтайте DROP TABLE Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–." -#: commands/tablecmds.c:251 +#: commands/tablecmds.c:261 #, c-format msgid "sequence \"%s\" does not exist" msgstr "поÑлідовніÑть \"%s\" не Ñ–Ñнує" -#: commands/tablecmds.c:252 +#: commands/tablecmds.c:262 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "поÑлідовніÑть \"%s\" не Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/tablecmds.c:254 +#: commands/tablecmds.c:264 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "ВикориÑтайте DROP SEQUENCE, щоб видалити поÑлідовніÑть." -#: commands/tablecmds.c:257 +#: commands/tablecmds.c:267 #, c-format msgid "view \"%s\" does not exist" msgstr "Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: commands/tablecmds.c:258 +#: commands/tablecmds.c:268 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/tablecmds.c:260 +#: commands/tablecmds.c:270 msgid "Use DROP VIEW to remove a view." msgstr "ВикориÑтайте DROP VIEW Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ." -#: commands/tablecmds.c:263 +#: commands/tablecmds.c:273 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "матеріалізоване Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: commands/tablecmds.c:264 +#: commands/tablecmds.c:274 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "матеріалізоване Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/tablecmds.c:266 +#: commands/tablecmds.c:276 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "ВикориÑтайте DROP MATERIALIZED VIEW, щоб видалити матеріалізоване поданнÑ." -#: commands/tablecmds.c:269 commands/tablecmds.c:293 commands/tablecmds.c:18945 -#: parser/parse_utilcmd.c:2260 +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19836 +#: parser/parse_utilcmd.c:2251 #, c-format msgid "index \"%s\" does not exist" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" не Ñ–Ñнує" -#: commands/tablecmds.c:270 commands/tablecmds.c:294 +#: commands/tablecmds.c:280 commands/tablecmds.c:304 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" не Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/tablecmds.c:272 commands/tablecmds.c:296 +#: commands/tablecmds.c:282 commands/tablecmds.c:306 msgid "Use DROP INDEX to remove an index." msgstr "ВикориÑтайте DROP INDEX, щоб видалити індекÑ." -#: commands/tablecmds.c:277 +#: commands/tablecmds.c:287 #, c-format msgid "\"%s\" is not a type" msgstr "\"%s\" не Ñ” типом" -#: commands/tablecmds.c:278 +#: commands/tablecmds.c:288 msgid "Use DROP TYPE to remove a type." msgstr "ВикориÑтайте DROP TYPE, щоб видалити тип." -#: commands/tablecmds.c:281 commands/tablecmds.c:13614 -#: commands/tablecmds.c:16134 +#: commands/tablecmds.c:291 commands/tablecmds.c:14356 +#: commands/tablecmds.c:16917 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" не Ñ–Ñнує" -#: commands/tablecmds.c:282 +#: commands/tablecmds.c:292 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" не Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/tablecmds.c:284 +#: commands/tablecmds.c:294 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "ВикориÑтайте DROP FOREIGN TABLE щоб видалити Ñторонню таблицю." -#: commands/tablecmds.c:697 +#: commands/tablecmds.c:734 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT можна викориÑтовувати лише Ð´Ð»Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñових таблиць" -#: commands/tablecmds.c:728 +#: commands/tablecmds.c:765 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "неможливо Ñтворити тимчаÑову таблицю в межах операції з обмеженнÑм безпеки" -#: commands/tablecmds.c:764 commands/tablecmds.c:14921 +#: commands/tablecmds.c:801 commands/tablecmds.c:15776 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" буде уÑпадковуватиÑÑŒ більш ніж один раз" -#: commands/tablecmds.c:949 -#, c-format -msgid "specifying a table access method is not supported on a partitioned table" -msgstr "Ð²ÐºÐ°Ð·Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ доÑтупу до таблиці не підтримуєтьÑÑ Ð· Ñекційною таблицею" - -#: commands/tablecmds.c:1042 +#: commands/tablecmds.c:1067 #, c-format msgid "\"%s\" is not partitioned" msgstr "\"%s\" не Ñекціоновано" -#: commands/tablecmds.c:1137 +#: commands/tablecmds.c:1161 #, c-format msgid "cannot partition using more than %d columns" msgstr "чиÑло Ñтовпців в ключі ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ може перевищувати %d" -#: commands/tablecmds.c:1193 +#: commands/tablecmds.c:1217 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "не можна Ñтворити зовнішню Ñекцію в Ñекціонованій таблиці \"%s\"" -#: commands/tablecmds.c:1195 +#: commands/tablecmds.c:1219 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" міÑтить індекÑи, Ñкі унікальні." -#: commands/tablecmds.c:1358 +#: commands/tablecmds.c:1338 commands/tablecmds.c:13372 +#, c-format +msgid "too many array dimensions" +msgstr "занадто багато вимірів маÑиву" + +#: commands/tablecmds.c:1343 parser/parse_clause.c:774 +#: parser/parse_relation.c:1912 +#, c-format +msgid "column \"%s\" cannot be declared SETOF" +msgstr "Ñтовпець\"%s\" не може бути оголошений SETOF" + +#: commands/tablecmds.c:1489 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY не підтримує Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÐºÑ–Ð»ÑŒÐºÐ¾Ñ… об'єктів" -#: commands/tablecmds.c:1362 +#: commands/tablecmds.c:1493 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY не підтримує режим CASCADE" -#: commands/tablecmds.c:1466 +#: commands/tablecmds.c:1597 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "неможливо видалити Ñекціонований Ñ–Ð½Ð´ÐµÐºÑ \"%s\" паралельно" -#: commands/tablecmds.c:1754 +#: commands/tablecmds.c:1885 #, c-format msgid "cannot truncate only a partitioned table" msgstr "Ñкоротити тільки Ñекціоновану таблицю не можна" -#: commands/tablecmds.c:1755 +#: commands/tablecmds.c:1886 #, c-format msgid "Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly." msgstr "Ðе вказуйте ключове Ñлово ONLY або викориÑтайте TRUNCATE ONLY безпоÑередньо Ð´Ð»Ñ Ñекцій." -#: commands/tablecmds.c:1827 +#: commands/tablecmds.c:1959 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "ÑÐºÐ¾Ñ€Ð¾Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾ÑˆÐ¸Ñ€ÑŽÑ”Ñ‚ÑŒÑÑ Ð½Ð° таблицю \"%s\"" -#: commands/tablecmds.c:2177 +#: commands/tablecmds.c:2320 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "Ñкоротити зовнішню таблицю \"%s\" не можна" -#: commands/tablecmds.c:2234 +#: commands/tablecmds.c:2377 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "тимчаÑові таблиці інших ÑеанÑів не можна Ñкоротити" -#: commands/tablecmds.c:2462 commands/tablecmds.c:14818 +#: commands/tablecmds.c:2606 commands/tablecmds.c:15673 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ Ñекціонованої таблиці \"%s\" не допуÑкаєтьÑÑ" -#: commands/tablecmds.c:2467 +#: commands/tablecmds.c:2611 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ розділу \"%s\" не допуÑкаєтьÑÑ" -#: commands/tablecmds.c:2475 parser/parse_utilcmd.c:2490 -#: parser/parse_utilcmd.c:2632 +#: commands/tablecmds.c:2619 parser/parse_utilcmd.c:2481 +#: parser/parse_utilcmd.c:2623 #, c-format msgid "inherited relation \"%s\" is not a table or foreign table" msgstr "уÑпадковане Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ” таблицею або Ñторонньою таблицею" -#: commands/tablecmds.c:2487 +#: commands/tablecmds.c:2631 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "Ñтворити тимчаÑове Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñк Ñекцію поÑтійного відношеннÑ\"%s\" не можна" -#: commands/tablecmds.c:2496 commands/tablecmds.c:14797 +#: commands/tablecmds.c:2640 commands/tablecmds.c:15652 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "тимчаÑове Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не може уÑпадковуватиÑÑŒ" -#: commands/tablecmds.c:2506 commands/tablecmds.c:14805 +#: commands/tablecmds.c:2650 commands/tablecmds.c:15660 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ тимчаÑового Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñ–Ð½ÑˆÐ¾Ð³Ð¾ ÑеанÑу неможливе" -#: commands/tablecmds.c:2560 +#: commands/tablecmds.c:2791 commands/tablecmds.c:2845 +#: commands/tablecmds.c:13055 parser/parse_utilcmd.c:1265 +#: parser/parse_utilcmd.c:1308 parser/parse_utilcmd.c:1735 +#: parser/parse_utilcmd.c:1843 #, c-format -msgid "merging multiple inherited definitions of column \"%s\"" -msgstr "Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´ÐµÐºÑ–Ð»ÑŒÐºÐ¾Ñ… уÑпадкованих визначень ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" +msgid "cannot convert whole-row table reference" +msgstr "перетворити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° тип уÑього Ñ€Ñдка таблиці не можна" -#: commands/tablecmds.c:2568 +#: commands/tablecmds.c:2792 parser/parse_utilcmd.c:1266 #, c-format -msgid "inherited column \"%s\" has a type conflict" -msgstr "конфлікт типів в уÑпадкованому Ñтовпці \"%s\"" +msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "Вираз генерації Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" міÑтить поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° веÑÑŒ Ñ€Ñдок на таблицю \"%s\"." -#: commands/tablecmds.c:2570 commands/tablecmds.c:2593 -#: commands/tablecmds.c:2610 commands/tablecmds.c:2866 -#: commands/tablecmds.c:2896 commands/tablecmds.c:2910 -#: parser/parse_coerce.c:2155 parser/parse_coerce.c:2175 -#: parser/parse_coerce.c:2195 parser/parse_coerce.c:2216 -#: parser/parse_coerce.c:2271 parser/parse_coerce.c:2305 -#: parser/parse_coerce.c:2381 parser/parse_coerce.c:2412 -#: parser/parse_coerce.c:2451 parser/parse_coerce.c:2518 -#: parser/parse_param.c:227 +#: commands/tablecmds.c:2846 parser/parse_utilcmd.c:1309 #, c-format -msgid "%s versus %s" -msgstr "%s проти %s" +msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." +msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" поÑилаєтьÑÑ Ð½Ð° тип уÑього Ñ€Ñдка в таблиці \"%s\"." -#: commands/tablecmds.c:2579 +#: commands/tablecmds.c:2956 commands/tablecmds.c:3227 #, c-format -msgid "inherited column \"%s\" has a collation conflict" -msgstr "конфлікт правил ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² уÑпадкованому Ñтовпці \"%s\"" +msgid "column \"%s\" inherits from generated column but specifies default" +msgstr "Ñтовпець \"%s\" уÑпадковуєтьÑÑ Ñ–Ð· згенерованого ÑтовпцÑ, але вказує за замовчуваннÑм" -#: commands/tablecmds.c:2581 commands/tablecmds.c:2878 -#: commands/tablecmds.c:6752 +#: commands/tablecmds.c:2961 commands/tablecmds.c:3232 #, c-format -msgid "\"%s\" versus \"%s\"" -msgstr "\"%s\" проти \"%s\"" +msgid "column \"%s\" inherits from generated column but specifies identity" +msgstr "Ñтовпець \"%s\" уÑпадковуєтьÑÑ Ñ–Ð· згенерованого ÑтовпцÑ, але вказує ідентичніÑть" -#: commands/tablecmds.c:2591 +#: commands/tablecmds.c:2969 commands/tablecmds.c:3240 #, c-format -msgid "inherited column \"%s\" has a storage parameter conflict" -msgstr "конфлікт параметрів Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð² уÑпадкованому Ñтовпці \"%s\"" +msgid "child column \"%s\" specifies generation expression" +msgstr "дочірній Ñтовпець \"%s\" визначає вираз генерації" -#: commands/tablecmds.c:2608 commands/tablecmds.c:2908 +#: commands/tablecmds.c:2971 commands/tablecmds.c:3242 #, c-format -msgid "column \"%s\" has a compression method conflict" -msgstr "конфлікт методів ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð² Ñтовпці \"%s\"" +msgid "A child table column cannot be generated unless its parent column is." +msgstr "Стовпець дочірньої таблиці не може бути Ñтворений, Ñкщо не Ñтворено Ñтовпець батьківÑької таблиці." -#: commands/tablecmds.c:2623 +#: commands/tablecmds.c:3017 #, c-format -msgid "inherited column \"%s\" has a generation conflict" -msgstr "конфлікт Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð² уÑпадкованому Ñтовпці \"%s\"" +msgid "column \"%s\" inherits conflicting generation expressions" +msgstr "Ñтовпець \"%s\" уÑпадковує конфліктуючи вирази генерації" -#: commands/tablecmds.c:2717 commands/tablecmds.c:2772 -#: commands/tablecmds.c:12338 parser/parse_utilcmd.c:1301 -#: parser/parse_utilcmd.c:1344 parser/parse_utilcmd.c:1753 -#: parser/parse_utilcmd.c:1861 +#: commands/tablecmds.c:3019 #, c-format -msgid "cannot convert whole-row table reference" -msgstr "перетворити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° тип уÑього Ñ€Ñдка таблиці не можна" +msgid "To resolve the conflict, specify a generation expression explicitly." +msgstr "Щоб вирішити цей конфлікт, Ñвно вкажіть вираз генерації." -#: commands/tablecmds.c:2718 parser/parse_utilcmd.c:1302 +#: commands/tablecmds.c:3023 #, c-format -msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." -msgstr "Вираз генерації Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" міÑтить поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° веÑÑŒ Ñ€Ñдок на таблицю \"%s\"." +msgid "column \"%s\" inherits conflicting default values" +msgstr "Ñтовпець \"%s\" уÑпадковує конфліктні Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм" -#: commands/tablecmds.c:2773 parser/parse_utilcmd.c:1345 +#: commands/tablecmds.c:3025 #, c-format -msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." -msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" поÑилаєтьÑÑ Ð½Ð° тип уÑього Ñ€Ñдка в таблиці \"%s\"." +msgid "To resolve the conflict, specify a default explicitly." +msgstr "Ð”Ð»Ñ ÑƒÑÑƒÐ½ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ð»Ñ–ÐºÑ‚Ñƒ вкажіть бажане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм." + +#: commands/tablecmds.c:3080 +#, c-format +msgid "check constraint name \"%s\" appears multiple times but with different expressions" +msgstr "ім'Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" з'ÑвлÑєтьÑÑ Ð´ÐµÐºÑ–Ð»ÑŒÐºÐ° разів, але з різними виразами" -#: commands/tablecmds.c:2852 +#: commands/tablecmds.c:3131 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "Ð·Ð»Ð¸Ñ‚Ñ‚Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" з уÑпадкованим визначеннÑм" -#: commands/tablecmds.c:2856 +#: commands/tablecmds.c:3135 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ– Ð·Ð»Ð¸Ñ‚Ñ‚Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" з уÑпадкованим визначеннÑм" -#: commands/tablecmds.c:2857 +#: commands/tablecmds.c:3136 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "Визначений кориÑтувачем Ñтовпець переміщений в позицію уÑпадкованого ÑтовпцÑ." -#: commands/tablecmds.c:2864 +#: commands/tablecmds.c:3148 #, c-format msgid "column \"%s\" has a type conflict" msgstr "конфлікт типів в Ñтовпці \"%s\"" -#: commands/tablecmds.c:2876 +#: commands/tablecmds.c:3150 commands/tablecmds.c:3184 +#: commands/tablecmds.c:3200 commands/tablecmds.c:3307 +#: commands/tablecmds.c:3340 commands/tablecmds.c:3356 +#: parser/parse_coerce.c:2192 parser/parse_coerce.c:2212 +#: parser/parse_coerce.c:2232 parser/parse_coerce.c:2253 +#: parser/parse_coerce.c:2308 parser/parse_coerce.c:2342 +#: parser/parse_coerce.c:2418 parser/parse_coerce.c:2449 +#: parser/parse_coerce.c:2488 parser/parse_coerce.c:2555 +#: parser/parse_param.c:223 #, c-format -msgid "column \"%s\" has a collation conflict" -msgstr "конфлікт правил ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² Ñтовпці \"%s\"" +msgid "%s versus %s" +msgstr "%s проти %s" -#: commands/tablecmds.c:2894 +#: commands/tablecmds.c:3162 #, c-format -msgid "column \"%s\" has a storage parameter conflict" -msgstr "конфлікт параметрів Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð² Ñтовпці \"%s\"" +msgid "column \"%s\" has a collation conflict" +msgstr "конфлікт правил ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² Ñтовпці \"%s\"" -#: commands/tablecmds.c:2935 +#: commands/tablecmds.c:3164 commands/tablecmds.c:3326 +#: commands/tablecmds.c:7080 #, c-format -msgid "child column \"%s\" specifies generation expression" -msgstr "дочірній Ñтовпець \"%s\" визначає вираз генерації" +msgid "\"%s\" versus \"%s\"" +msgstr "\"%s\" проти \"%s\"" -#: commands/tablecmds.c:2937 +#: commands/tablecmds.c:3182 #, c-format -msgid "Omit the generation expression in the definition of the child table column to inherit the generation expression from the parent table." -msgstr "ПропуÑтіть вираз генерації у визначенні ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð´Ð¾Ñ‡Ñ–Ñ€ÑŒÐ½Ð¾Ñ— таблиці щоб уÑпадкувати вираз генерації з батьківÑької таблиці." +msgid "column \"%s\" has a storage parameter conflict" +msgstr "конфлікт параметрів Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð² Ñтовпці \"%s\"" -#: commands/tablecmds.c:2941 +#: commands/tablecmds.c:3198 commands/tablecmds.c:3354 #, c-format -msgid "column \"%s\" inherits from generated column but specifies default" -msgstr "Ñтовпець \"%s\" уÑпадковуєтьÑÑ Ñ–Ð· згенерованого ÑтовпцÑ, але вказує за замовчуваннÑм" +msgid "column \"%s\" has a compression method conflict" +msgstr "конфлікт методів ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð² Ñтовпці \"%s\"" -#: commands/tablecmds.c:2946 +#: commands/tablecmds.c:3293 #, c-format -msgid "column \"%s\" inherits from generated column but specifies identity" -msgstr "Ñтовпець \"%s\" уÑпадковуєтьÑÑ Ñ–Ð· згенерованого ÑтовпцÑ, але вказує ідентичніÑть" +msgid "merging multiple inherited definitions of column \"%s\"" +msgstr "Ð·Ð»Ð¸Ñ‚Ñ‚Ñ Ð´ÐµÐºÑ–Ð»ÑŒÐºÐ¾Ñ… уÑпадкованих визначень ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: commands/tablecmds.c:3055 +#: commands/tablecmds.c:3305 #, c-format -msgid "column \"%s\" inherits conflicting generation expressions" -msgstr "Ñтовпець \"%s\" уÑпадковує конфліктуючи вирази генерації" +msgid "inherited column \"%s\" has a type conflict" +msgstr "конфлікт типів в уÑпадкованому Ñтовпці \"%s\"" -#: commands/tablecmds.c:3060 +#: commands/tablecmds.c:3324 #, c-format -msgid "column \"%s\" inherits conflicting default values" -msgstr "Ñтовпець \"%s\" уÑпадковує конфліктні Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм" +msgid "inherited column \"%s\" has a collation conflict" +msgstr "конфлікт правил ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² уÑпадкованому Ñтовпці \"%s\"" -#: commands/tablecmds.c:3062 +#: commands/tablecmds.c:3338 #, c-format -msgid "To resolve the conflict, specify a default explicitly." -msgstr "Ð”Ð»Ñ ÑƒÑÑƒÐ½ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ð»Ñ–ÐºÑ‚Ñƒ вкажіть бажане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм." +msgid "inherited column \"%s\" has a storage parameter conflict" +msgstr "конфлікт параметрів Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð² уÑпадкованому Ñтовпці \"%s\"" -#: commands/tablecmds.c:3108 +#: commands/tablecmds.c:3366 #, c-format -msgid "check constraint name \"%s\" appears multiple times but with different expressions" -msgstr "ім'Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" з'ÑвлÑєтьÑÑ Ð´ÐµÐºÑ–Ð»ÑŒÐºÐ° разів, але з різними виразами" +msgid "inherited column \"%s\" has a generation conflict" +msgstr "конфлікт Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð² уÑпадкованому Ñтовпці \"%s\"" -#: commands/tablecmds.c:3321 +#: commands/tablecmds.c:3597 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "переміщувати тимчаÑові таблиці інших ÑеанÑів не можна" -#: commands/tablecmds.c:3391 +#: commands/tablecmds.c:3670 #, c-format msgid "cannot rename column of typed table" msgstr "перейменувати Ñтовпець типізованої таблиці не можна" -#: commands/tablecmds.c:3410 +#: commands/tablecmds.c:3689 #, c-format msgid "cannot rename columns of relation \"%s\"" msgstr "перейменувати Ñтовпці Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %s не можна" -#: commands/tablecmds.c:3505 +#: commands/tablecmds.c:3784 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "уÑпадкований Ñтовпець \"%s\" повинен бути перейменований в дочірніх таблицÑÑ… також" -#: commands/tablecmds.c:3537 +#: commands/tablecmds.c:3816 #, c-format msgid "cannot rename system column \"%s\"" msgstr "не можна перейменувати ÑиÑтемний Ñтовпець \"%s\"" -#: commands/tablecmds.c:3552 +#: commands/tablecmds.c:3831 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "не можна перейменувати уÑпадкований Ñтовпець \"%s\"" -#: commands/tablecmds.c:3704 +#: commands/tablecmds.c:3983 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "уÑпадковане Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" повинно бути перейменовано в дочірніх таблицÑÑ… також" -#: commands/tablecmds.c:3711 +#: commands/tablecmds.c:3990 #, c-format msgid "cannot rename inherited constraint \"%s\"" msgstr "не можна перейменувати уÑпадковане Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\"" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4008 +#: commands/tablecmds.c:4290 #, c-format msgid "cannot %s \"%s\" because it is being used by active queries in this session" msgstr "не можна виконати %s \"%s\", тому що цей об'єкт викориÑтовуєтьÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ð¼Ð¸ запитами в цьому ÑеанÑÑ–" #. translator: first %s is a SQL command, eg ALTER TABLE -#: commands/tablecmds.c:4017 +#: commands/tablecmds.c:4299 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "не можна виконати %s \"%s\", тому що з цим об'єктом зв'Ñзані очікуванні події тригерів" -#: commands/tablecmds.c:4486 +#: commands/tablecmds.c:4325 +#, c-format +msgid "cannot alter temporary tables of other sessions" +msgstr "не можна змінювати тимчаÑові таблиці з інших ÑеанÑів" + +#: commands/tablecmds.c:4798 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "не можна змінити розділ \"%s\" з неповним відключеннÑм" -#: commands/tablecmds.c:4679 commands/tablecmds.c:4694 +#: commands/tablecmds.c:5002 commands/tablecmds.c:5017 #, c-format msgid "cannot change persistence setting twice" msgstr "неможливо двічі змінити параметр ÑтійкоÑті" -#: commands/tablecmds.c:4715 -#, c-format -msgid "cannot change access method of a partitioned table" -msgstr "неможливо змінити метод доÑтупу Ñекціонованої таблиці" - -#: commands/tablecmds.c:4721 +#: commands/tablecmds.c:5038 #, c-format msgid "cannot have multiple SET ACCESS METHOD subcommands" msgstr "неможливо мати декілька підкоманд SET ACCESS METHOD" -#: commands/tablecmds.c:5476 +#: commands/tablecmds.c:5768 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "перезапиÑати ÑиÑтемне Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не можна" -#: commands/tablecmds.c:5482 +#: commands/tablecmds.c:5774 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "перезапиÑати таблицю \"%s\", що викориÑтовуєтьÑÑ Ñк Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ, не можна" -#: commands/tablecmds.c:5492 +#: commands/tablecmds.c:5786 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "неможливо перезапиÑати тимчаÑові таблиці інших ÑеанÑів" -#: commands/tablecmds.c:5986 +#: commands/tablecmds.c:6281 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" міÑтить null значеннÑ" -#: commands/tablecmds.c:6003 +#: commands/tablecmds.c:6298 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "перевірка Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" порушуєтьÑÑ Ð´ÐµÑким Ñ€Ñдком" -#: commands/tablecmds.c:6022 partitioning/partbounds.c:3404 +#: commands/tablecmds.c:6317 partitioning/partbounds.c:3387 #, c-format msgid "updated partition constraint for default partition \"%s\" would be violated by some row" msgstr "оновлене Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñекції Ð´Ð»Ñ Ñекції за замовчуваннÑм \"%s\" буде порушено деÑкими Ñ€Ñдками" -#: commands/tablecmds.c:6028 +#: commands/tablecmds.c:6323 #, c-format msgid "partition constraint of relation \"%s\" is violated by some row" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñекції Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" порушуєтьÑÑ Ð´ÐµÑким Ñ€Ñдком" #. translator: %s is a group of some SQL keywords -#: commands/tablecmds.c:6295 +#: commands/tablecmds.c:6588 #, c-format msgid "ALTER action %s cannot be performed on relation \"%s\"" msgstr "Дію ALTER %s не можна виконати на відношенні \"%s\"" -#: commands/tablecmds.c:6510 commands/tablecmds.c:6517 +#: commands/tablecmds.c:6843 commands/tablecmds.c:6850 #, c-format msgid "cannot alter type \"%s\" because column \"%s.%s\" uses it" msgstr "неможливо змінити тип \"%s\", тому що Ñтовпець \"%s.%s\" викориÑтовує його" -#: commands/tablecmds.c:6524 +#: commands/tablecmds.c:6857 #, c-format msgid "cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type" msgstr "неможливо змінити Ñторонню таблицю \"%s\", тому що Ñтовпець \"%s.%s\" викориÑтовує тип Ñ—Ñ— Ñ€Ñдка" -#: commands/tablecmds.c:6531 +#: commands/tablecmds.c:6864 #, c-format msgid "cannot alter table \"%s\" because column \"%s.%s\" uses its row type" msgstr "неможливо змінити таблицю \"%s\", тому що Ñтовпець \"%s.%s\" викориÑтовує тип Ñ—Ñ— Ñ€Ñдка" -#: commands/tablecmds.c:6587 +#: commands/tablecmds.c:6920 #, c-format msgid "cannot alter type \"%s\" because it is the type of a typed table" msgstr "неможливо змінити тип \"%s\", тому що це тип типізованої таблиці" -#: commands/tablecmds.c:6589 +#: commands/tablecmds.c:6922 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "Щоб змінити типізовані таблиці, викориÑтайте також ALTER ... CASCADE." -#: commands/tablecmds.c:6635 +#: commands/tablecmds.c:6968 #, c-format msgid "type %s is not a composite type" msgstr "тип %s не Ñ” Ñкладеним" -#: commands/tablecmds.c:6662 +#: commands/tablecmds.c:6995 #, c-format msgid "cannot add column to typed table" msgstr "неможливо додати Ñтовпець до типізованої таблиці" -#: commands/tablecmds.c:6715 +#: commands/tablecmds.c:7043 #, c-format msgid "cannot add column to a partition" msgstr "неможливо додати Ñтовпець до розділу" -#: commands/tablecmds.c:6744 commands/tablecmds.c:15048 +#: commands/tablecmds.c:7072 commands/tablecmds.c:15891 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "Ð´Ð¾Ñ‡Ñ–Ñ€Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" має інший тип Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: commands/tablecmds.c:6750 commands/tablecmds.c:15055 +#: commands/tablecmds.c:7078 commands/tablecmds.c:15897 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "Ð´Ð¾Ñ‡Ñ–Ñ€Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" має інше правило ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: commands/tablecmds.c:6764 +#: commands/tablecmds.c:7096 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" Ð´Ð»Ñ Ð½Ð°Ñ‰Ð°Ð´ÐºÐ° \"%s\"" -#: commands/tablecmds.c:6807 +#: commands/tablecmds.c:7149 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "неможливо додати Ñтовпець ідентифікації в таблицю, Ñка має дочірні таблиці" -#: commands/tablecmds.c:7051 +#: commands/tablecmds.c:7393 #, c-format msgid "column must be added to child tables too" msgstr "Ñтовпець також повинен бути доданий до дочірніх таблиць" -#: commands/tablecmds.c:7129 +#: commands/tablecmds.c:7471 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" вже Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/tablecmds.c:7136 +#: commands/tablecmds.c:7478 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" вже Ñ–Ñнує" -#: commands/tablecmds.c:7202 commands/tablecmds.c:11977 +#: commands/tablecmds.c:7544 commands/tablecmds.c:12683 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "неможливо видалити Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ з Ñекціонованої таблиці, коли Ñ–Ñнують Ñекції" -#: commands/tablecmds.c:7203 commands/tablecmds.c:7520 -#: commands/tablecmds.c:8517 commands/tablecmds.c:11978 +#: commands/tablecmds.c:7545 commands/tablecmds.c:7859 +#: commands/tablecmds.c:8037 commands/tablecmds.c:8144 +#: commands/tablecmds.c:8261 commands/tablecmds.c:9080 +#: commands/tablecmds.c:12684 #, c-format msgid "Do not specify the ONLY keyword." msgstr "Ðе вказуйте ключове Ñлово ONLY." -#: commands/tablecmds.c:7240 commands/tablecmds.c:7446 -#: commands/tablecmds.c:7588 commands/tablecmds.c:7702 -#: commands/tablecmds.c:7796 commands/tablecmds.c:7855 -#: commands/tablecmds.c:7974 commands/tablecmds.c:8113 -#: commands/tablecmds.c:8183 commands/tablecmds.c:8339 -#: commands/tablecmds.c:12132 commands/tablecmds.c:13637 -#: commands/tablecmds.c:16225 +#: commands/tablecmds.c:7581 commands/tablecmds.c:7785 +#: commands/tablecmds.c:7927 commands/tablecmds.c:8059 +#: commands/tablecmds.c:8188 commands/tablecmds.c:8282 +#: commands/tablecmds.c:8383 commands/tablecmds.c:8540 +#: commands/tablecmds.c:8693 commands/tablecmds.c:8774 +#: commands/tablecmds.c:8908 commands/tablecmds.c:12837 +#: commands/tablecmds.c:14379 commands/tablecmds.c:17006 #, c-format msgid "cannot alter system column \"%s\"" msgstr "не можна змінити ÑиÑтемний Ñтовпець \"%s\"" -#: commands/tablecmds.c:7246 commands/tablecmds.c:7594 +#: commands/tablecmds.c:7587 commands/tablecmds.c:7933 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" Ñ” Ñтовпцем ідентифікації" -#: commands/tablecmds.c:7289 +#: commands/tablecmds.c:7628 #, c-format msgid "column \"%s\" is in a primary key" msgstr "Ñтовпець \"%s\" входить до первинного ключа" -#: commands/tablecmds.c:7294 +#: commands/tablecmds.c:7633 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "Ñтовпець \"%s\" в індекÑÑ–, що викориÑтовуєтьÑÑ Ñк Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ¸" -#: commands/tablecmds.c:7317 +#: commands/tablecmds.c:7656 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "Ñтовпець \"%s\" в батьківÑькій таблиці позначений Ñк NOT NULL" -#: commands/tablecmds.c:7517 commands/tablecmds.c:9000 +#: commands/tablecmds.c:7856 commands/tablecmds.c:9564 #, c-format msgid "constraint must be added to child tables too" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ бути додано у дочірні таблиці також" -#: commands/tablecmds.c:7518 +#: commands/tablecmds.c:7857 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "Стовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" вже не NOT NULL." -#: commands/tablecmds.c:7596 -#, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead." -msgstr "ЗаміÑть цього викориÑтайте ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY." - -#: commands/tablecmds.c:7601 +#: commands/tablecmds.c:7942 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" Ñ” згенерованим Ñтовпцем" -#: commands/tablecmds.c:7604 +#: commands/tablecmds.c:8036 #, c-format -msgid "Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead." -msgstr "ЗаміÑть цього викориÑтайте ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION" +msgid "cannot add identity to a column of only the partitioned table" +msgstr "не може додати ідентифікатор до ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð»Ð¸ÑˆÐµ розділеної таблиці" -#: commands/tablecmds.c:7713 +#: commands/tablecmds.c:8042 +#, c-format +msgid "cannot add identity to a column of a partition" +msgstr "не може додати ідентифікатор до ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ" + +#: commands/tablecmds.c:8070 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" повинен бути оголошений Ñк NOT NULL, щоб додати ідентифікацію" -#: commands/tablecmds.c:7719 +#: commands/tablecmds.c:8076 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" вже Ñ” Ñтовпцем ідентифікації" -#: commands/tablecmds.c:7725 +#: commands/tablecmds.c:8082 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" вже має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм" -#: commands/tablecmds.c:7802 commands/tablecmds.c:7863 +#: commands/tablecmds.c:8143 +#, c-format +msgid "cannot change identity column of only the partitioned table" +msgstr "не можна змінювати Ñтовпець ідентичноÑті лише в розбитій на розділи таблиці" + +#: commands/tablecmds.c:8149 +#, c-format +msgid "cannot change identity column of a partition" +msgstr "не можна змінити Ñтовпець ідентичноÑті розділу" + +#: commands/tablecmds.c:8194 commands/tablecmds.c:8290 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ” Ñтовпцем ідентифікації" -#: commands/tablecmds.c:7868 +#: commands/tablecmds.c:8260 +#, c-format +msgid "cannot drop identity from a column of only the partitioned table" +msgstr "не можна вилучити ідентифікатор зі ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð»Ð¸ÑˆÐµ розбитої на розділи таблиці" + +#: commands/tablecmds.c:8266 +#, c-format +msgid "cannot drop identity from a column of a partition" +msgstr "не можна вилучити ідентифікатор зі ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ" + +#: commands/tablecmds.c:8295 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ” Ñтовпцем ідентифікації, пропуÑкаєтьÑÑ" -#: commands/tablecmds.c:7921 +#: commands/tablecmds.c:8389 +#, c-format +msgid "column \"%s\" of relation \"%s\" is not a generated column" +msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ” згенерованим Ñтовпцем" + +#: commands/tablecmds.c:8487 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "ALTER TABLE / DROP EXPRESSION повинен бути заÑтоÑований Ñ– до дочірніх таблиць" -#: commands/tablecmds.c:7943 +#: commands/tablecmds.c:8509 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "не можна видалити вираз генерації з уÑпадкованого ÑтовпцÑ" -#: commands/tablecmds.c:7982 +#: commands/tablecmds.c:8548 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ” збереженим згенерованим Ñтовпцем" -#: commands/tablecmds.c:7987 +#: commands/tablecmds.c:8553 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ” збереженим згенерованим Ñтовпцем, пропуÑкаєтьÑÑ" -#: commands/tablecmds.c:8060 +#: commands/tablecmds.c:8631 #, c-format msgid "cannot refer to non-index column by number" msgstr "не можна поÑилатиÑÑŒ на неіндекÑований Ñтовпець за номером" -#: commands/tablecmds.c:8103 +#: commands/tablecmds.c:8683 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "Ñтовпець з номером %d Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %s не Ñ–Ñнує" -#: commands/tablecmds.c:8122 +#: commands/tablecmds.c:8702 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "змінити ÑтатиÑтику включеного ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" індекÑу \"%s\" не можна" -#: commands/tablecmds.c:8127 +#: commands/tablecmds.c:8707 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "змінити ÑтатиÑтику невираженого ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" індекÑу \"%s\" не можна" -#: commands/tablecmds.c:8129 +#: commands/tablecmds.c:8709 #, c-format msgid "Alter statistics on table column instead." msgstr "ЗаміÑть цього змініть ÑтатиÑтику ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð² таблиці." -#: commands/tablecmds.c:8319 -#, c-format -msgid "invalid storage type \"%s\"" -msgstr "неприпуÑтимий тип Ñховища \"%s\"" - -#: commands/tablecmds.c:8351 -#, c-format -msgid "column data type %s can only have storage PLAIN" -msgstr "тип даних ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ %s може мати тільки Ñховище PLAIN" - -#: commands/tablecmds.c:8396 +#: commands/tablecmds.c:8955 #, c-format msgid "cannot drop column from typed table" msgstr "не можна видалити Ñтовпець з типізованої таблиці" -#: commands/tablecmds.c:8455 +#: commands/tablecmds.c:9018 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/tablecmds.c:8468 +#: commands/tablecmds.c:9031 #, c-format msgid "cannot drop system column \"%s\"" msgstr "не можна видалити ÑиÑтемний Ñтовпець \"%s\"" -#: commands/tablecmds.c:8478 +#: commands/tablecmds.c:9041 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "не можна видалити уÑпадкований Ñтовпець \"%s\"" -#: commands/tablecmds.c:8491 +#: commands/tablecmds.c:9054 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "не можна видалити Ñтовпець \"%s\", тому що він Ñ” чаÑтиною ключа Ñекції Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:8516 +#: commands/tablecmds.c:9079 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "видалити Ñтовпець тільки з Ñекціонованої таблиці, коли Ñ–Ñнують Ñекції, не можна" -#: commands/tablecmds.c:8720 +#: commands/tablecmds.c:9284 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX не підтримуєтьÑÑ Ñ–Ð· Ñекціонованими таблицÑми" -#: commands/tablecmds.c:8745 +#: commands/tablecmds.c:9309 #, c-format msgid "ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"" msgstr "ALTER TABLE / ADD CONSTRAINT USING INDEX перейменує Ñ–Ð½Ð´ÐµÐºÑ \"%s\" в \"%s\"" -#: commands/tablecmds.c:9082 +#: commands/tablecmds.c:9646 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "не можна викориÑтати ONLY Ð´Ð»Ñ Ñтороннього ключа в Ñекціонованій таблиці \"%s\", Ñкий поÑилаєтьÑÑ Ð½Ð° Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:9088 +#: commands/tablecmds.c:9652 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "не можна додати Ñторонній ключ з характериÑтикою NOT VALID в Ñекціоновану таблицю \"%s\", Ñкий поÑилаєтьÑÑ Ð½Ð° Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:9091 +#: commands/tablecmds.c:9655 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ñ‰Ðµ не підтримуєтьÑÑ Ð· Ñекціонованими таблицÑми." -#: commands/tablecmds.c:9098 commands/tablecmds.c:9564 +#: commands/tablecmds.c:9662 commands/tablecmds.c:10123 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "вказане Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ” таблицею" -#: commands/tablecmds.c:9121 +#: commands/tablecmds.c:9685 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð² поÑтійних таблицÑÑ… можуть поÑилатиÑÑŒ лише на поÑтійні таблиці" -#: commands/tablecmds.c:9128 +#: commands/tablecmds.c:9692 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð² нежурнальованих таблицÑÑ… можуть поÑилатиÑÑŒ тільки на поÑтійні або нежурналюємі таблиці" -#: commands/tablecmds.c:9134 +#: commands/tablecmds.c:9698 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð² тимчаÑових таблицÑÑ… можуть поÑилатиÑÑŒ лише на тимчаÑові таблиці" -#: commands/tablecmds.c:9138 +#: commands/tablecmds.c:9702 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð² тимчаÑових таблицÑÑ… повинні поÑилатиÑÑŒ лише на тичаÑові таблиці поточного ÑеанÑу" -#: commands/tablecmds.c:9212 commands/tablecmds.c:9218 +#: commands/tablecmds.c:9766 commands/tablecmds.c:9772 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "неприпуÑтима Ð´Ñ–Ñ %s Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ ключа, Ñкий міÑтить згеренований Ñтовпець" -#: commands/tablecmds.c:9234 +#: commands/tablecmds.c:9788 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "чиÑло Ñтовпців в джерелі Ñ– призначенні зовнішнього ключа не збігаєтьÑÑ" -#: commands/tablecmds.c:9341 +#: commands/tablecmds.c:9895 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ ключа \"%s\" не можна реалізувати" -#: commands/tablecmds.c:9343 +#: commands/tablecmds.c:9897 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Стовпці ключа \"%s\" Ñ– \"%s\" міÑÑ‚Ñть неÑуміÑні типи: %s Ñ– %s." -#: commands/tablecmds.c:9500 +#: commands/tablecmds.c:10066 #, c-format msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" msgstr "Ñтовпець \"%s\" вказаний у дії ON DELETE SET повинен бути чаÑтиною зовнішнього ключа" -#: commands/tablecmds.c:9773 commands/tablecmds.c:10220 -#: parser/parse_utilcmd.c:795 parser/parse_utilcmd.c:924 +#: commands/tablecmds.c:10423 commands/tablecmds.c:10863 +#: parser/parse_utilcmd.c:822 parser/parse_utilcmd.c:945 #, c-format msgid "foreign key constraints are not supported on foreign tables" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ ключа Ð´Ð»Ñ Ñторонніх таблиць не підтримуютьÑÑ" -#: commands/tablecmds.c:10749 commands/tablecmds.c:11027 -#: commands/tablecmds.c:11934 commands/tablecmds.c:12009 +#: commands/tablecmds.c:10846 +#, c-format +msgid "cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"" +msgstr "не можна підключити таблицю \"%s\" в ÑкоÑті Ñекції, тому що на неї поÑилаєтьÑÑ Ñторонній ключ \"%s\"" + +#: commands/tablecmds.c:11447 commands/tablecmds.c:11728 +#: commands/tablecmds.c:12640 commands/tablecmds.c:12714 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: commands/tablecmds.c:10756 +#: commands/tablecmds.c:11454 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ” обмеженнÑм зовнішнього ключа" -#: commands/tablecmds.c:10794 +#: commands/tablecmds.c:11492 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" -msgstr "не можна змінити Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" +msgstr "неможливо змінити Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:10797 +#: commands/tablecmds.c:11495 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" походить з Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"." -#: commands/tablecmds.c:10799 +#: commands/tablecmds.c:11497 #, c-format -msgid "You may alter the constraint it derives from, instead." +msgid "You may alter the constraint it derives from instead." msgstr "ÐатоміÑть ви можете змінити початкове обмеженнÑ." -#: commands/tablecmds.c:11035 +#: commands/tablecmds.c:11736 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ” зовнішнім ключем або перевіркою обмеженнÑм " -#: commands/tablecmds.c:11113 +#: commands/tablecmds.c:11813 #, c-format msgid "constraint must be validated on child tables too" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ дотримуватиÑÑ Ð² дочірніх таблицÑÑ… також" -#: commands/tablecmds.c:11197 +#: commands/tablecmds.c:11900 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "Ñтовпець \"%s\", вказаний в обмеженні зовнішнього ключа, не Ñ–Ñнує" -#: commands/tablecmds.c:11202 +#: commands/tablecmds.c:11906 +#, c-format +msgid "system columns cannot be used in foreign keys" +msgstr "в зовнішніх ключах не можна викориÑтовувати ÑиÑтемні Ñтовпці" + +#: commands/tablecmds.c:11910 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "у зовнішньому ключі не може бути більш ніж %d ключів" -#: commands/tablecmds.c:11268 +#: commands/tablecmds.c:11975 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "викориÑтовувати затримуваний первинний ключ в цільовій зовнішній таблиці \"%s\" не можна" -#: commands/tablecmds.c:11285 +#: commands/tablecmds.c:11992 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "у цільовій зовнішній таблиці \"%s\" немає первинного ключа" -#: commands/tablecmds.c:11350 +#: commands/tablecmds.c:12060 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "у ÑпиÑку Ñтовпців зовнішнього ключа не повинно бути повторень" -#: commands/tablecmds.c:11444 +#: commands/tablecmds.c:12152 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "викориÑтовувати затримане Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑƒÐ½Ñ–ÐºÐ°Ð»ÑŒÐ½Ð¾Ñті в цільовій зовнішній таблиці \"%s\" не можна" -#: commands/tablecmds.c:11449 +#: commands/tablecmds.c:12157 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "у цільовій зовнішній таблиці \"%s\" немає Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑƒÐ½Ñ–ÐºÐ°Ð»ÑŒÐ½Ð¾Ñті, відповідного даним ключам" -#: commands/tablecmds.c:11890 +#: commands/tablecmds.c:12596 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "видалити уÑпадковане Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не можна" -#: commands/tablecmds.c:11940 +#: commands/tablecmds.c:12646 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/tablecmds.c:12116 +#: commands/tablecmds.c:12821 #, c-format msgid "cannot alter column type of typed table" msgstr "змінити тип ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð² типізованій таблиці не можна" -#: commands/tablecmds.c:12143 +#: commands/tablecmds.c:12847 +#, c-format +msgid "cannot specify USING when altering type of generated column" +msgstr "не можна вказати USING під Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ типу згенерованого ÑтовпцÑ" + +#: commands/tablecmds.c:12848 commands/tablecmds.c:18059 +#: commands/tablecmds.c:18149 commands/trigger.c:656 +#: rewrite/rewriteHandler.c:941 rewrite/rewriteHandler.c:976 +#, c-format +msgid "Column \"%s\" is a generated column." +msgstr "Стовпець \"%s\" Ñ” згенерованим Ñтовпцем." + +#: commands/tablecmds.c:12858 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "змінити уÑпадкований Ñтовпець \"%s\" не можна" -#: commands/tablecmds.c:12152 +#: commands/tablecmds.c:12867 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "не можна змінити Ñтовпець \"%s\", тому що він Ñ” чаÑтиною ключа Ñекції Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:12202 +#: commands/tablecmds.c:12917 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "результати Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ USING Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" не можна автоматично наведено Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" -#: commands/tablecmds.c:12205 +#: commands/tablecmds.c:12920 #, c-format msgid "You might need to add an explicit cast." msgstr "Можливо, необхідно додати Ñвне Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ." -#: commands/tablecmds.c:12209 +#: commands/tablecmds.c:12924 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "Ñтовпець \"%s\" не можна автоматично привеÑти до типу %s" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:12212 +#: commands/tablecmds.c:12928 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Можливо, необхідно вказати \"USING %s::%s\"." -#: commands/tablecmds.c:12311 +#: commands/tablecmds.c:13027 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "не можна змінити уÑпадкований Ñтовпець \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:12339 +#: commands/tablecmds.c:13056 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "Вираз USING міÑтить поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° тип уÑього Ñ€Ñдка таблиці." -#: commands/tablecmds.c:12350 +#: commands/tablecmds.c:13067 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "тип уÑпадкованого ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" повинен бути змінений Ñ– в дочірніх таблицÑÑ…" -#: commands/tablecmds.c:12475 +#: commands/tablecmds.c:13192 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "не можна змінити тип ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" двічі" -#: commands/tablecmds.c:12513 +#: commands/tablecmds.c:13230 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "вираз генерації Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" не можна автоматично привеÑти до типу %s" -#: commands/tablecmds.c:12518 +#: commands/tablecmds.c:13235 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" не можна автоматично привеÑти до типу %s" -#: commands/tablecmds.c:12599 +#: commands/tablecmds.c:13539 #, c-format -msgid "cannot alter type of a column used by a view or rule" -msgstr "змінити тип ÑтовпцÑ, залученого в поданні або правилі, не можна" +msgid "cannot alter type of a column used by a function or procedure" +msgstr "неможливо змінити тип ÑтовпцÑ, Ñкий викориÑтовуєтьÑÑ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ”ÑŽ або процедурою" -#: commands/tablecmds.c:12600 commands/tablecmds.c:12619 -#: commands/tablecmds.c:12637 +#: commands/tablecmds.c:13540 commands/tablecmds.c:13555 +#: commands/tablecmds.c:13575 commands/tablecmds.c:13594 +#: commands/tablecmds.c:13653 #, c-format msgid "%s depends on column \"%s\"" msgstr "%s залежить від ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: commands/tablecmds.c:12618 +#: commands/tablecmds.c:13554 +#, c-format +msgid "cannot alter type of a column used by a view or rule" +msgstr "змінити тип ÑтовпцÑ, залученого в поданні або правилі, не можна" + +#: commands/tablecmds.c:13574 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "неможливо змінити тип ÑтовпцÑ, що викориÑтовуєтьÑÑ Ñƒ визначенні тригеру" -#: commands/tablecmds.c:12636 +#: commands/tablecmds.c:13593 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "неможливо змінити тип ÑтовпцÑ, що викориÑтовуєтьÑÑ Ñƒ визначенні політики" -#: commands/tablecmds.c:12667 +#: commands/tablecmds.c:13624 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "змінити тип ÑтовпцÑ, Ñкий викориÑтовуєтьÑÑ Ð·Ð³ÐµÐ½ÐµÑ€Ð¾Ð²Ð°Ð½Ð¸Ð¼ Ñтовпцем, не можна" -#: commands/tablecmds.c:12668 +#: commands/tablecmds.c:13625 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Стовпець \"%s\" викориÑтовуєтьÑÑ Ð·Ð³ÐµÐ½ÐµÑ€Ð¾Ð²Ð°Ð½Ð¸Ð¼ Ñтовпцем \"%s\"." -#: commands/tablecmds.c:13745 commands/tablecmds.c:13757 +#: commands/tablecmds.c:13652 +#, c-format +msgid "cannot alter type of a column used by a publication WHERE clause" +msgstr "неможливо змінити тип ÑтовпцÑ, Ñкий викориÑтовуєтьÑÑ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ”ÑŽ в реченні WHERE" + +#: commands/tablecmds.c:14487 commands/tablecmds.c:14499 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "неможливо змінити влаÑника індекÑу \"%s\"" -#: commands/tablecmds.c:13747 commands/tablecmds.c:13759 +#: commands/tablecmds.c:14489 commands/tablecmds.c:14501 #, c-format -msgid "Change the ownership of the index's table, instead." +msgid "Change the ownership of the index's table instead." msgstr "ЗаміÑть цього змініть влаÑника таблиці, що міÑтить цей індекÑ." -#: commands/tablecmds.c:13773 +#: commands/tablecmds.c:14515 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "неможливо змінити влаÑника поÑлідовноÑті \"%s\"" -#: commands/tablecmds.c:13787 commands/tablecmds.c:17144 -#: commands/tablecmds.c:17163 -#, c-format -msgid "Use ALTER TYPE instead." -msgstr "ЗаміÑть цього викориÑтайте ALTER TYPE." - -#: commands/tablecmds.c:13796 +#: commands/tablecmds.c:14540 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "неможливо змінити влаÑника Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:14158 +#: commands/tablecmds.c:15007 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "в одній інÑтрукції не може бути декілька підкоманд SET TABLESPACE" -#: commands/tablecmds.c:14235 +#: commands/tablecmds.c:15084 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "неможливо вÑтановити параметри Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:14269 commands/view.c:521 +#: commands/tablecmds.c:15118 commands/view.c:440 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION підтримуєтьÑÑ Ð»Ð¸ÑˆÐµ з автооновлюваними поданнÑми" -#: commands/tablecmds.c:14519 +#: commands/tablecmds.c:15369 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "у табличних проÑторах Ñ–Ñнують лише таблиці, індекÑи та матеріалізовані поданнÑ" -#: commands/tablecmds.c:14531 +#: commands/tablecmds.c:15381 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "переміщувати Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñƒ або з табличного проÑтору pg_global не можна" -#: commands/tablecmds.c:14623 +#: commands/tablecmds.c:15473 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" неможливе" -#: commands/tablecmds.c:14639 +#: commands/tablecmds.c:15489 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr " табличному проÑторі \"%s\" не знайдені відповідні відноÑини" -#: commands/tablecmds.c:14756 +#: commands/tablecmds.c:15611 #, c-format msgid "cannot change inheritance of typed table" msgstr "змінити уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð·Ð¾Ð²Ð°Ð½Ð¾Ñ— таблиці не можна" -#: commands/tablecmds.c:14761 commands/tablecmds.c:15317 +#: commands/tablecmds.c:15616 commands/tablecmds.c:16116 #, c-format msgid "cannot change inheritance of a partition" msgstr "змінити уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñекції не можна" -#: commands/tablecmds.c:14766 +#: commands/tablecmds.c:15621 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "змінити уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñекціонованої таблиці не можна" -#: commands/tablecmds.c:14812 +#: commands/tablecmds.c:15667 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñового Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñ–Ð½ÑˆÐ¾Ð³Ð¾ ÑеанÑу не можливе" -#: commands/tablecmds.c:14825 +#: commands/tablecmds.c:15680 #, c-format msgid "cannot inherit from a partition" msgstr "уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ Ñекції неможливе" -#: commands/tablecmds.c:14847 commands/tablecmds.c:17797 +#: commands/tablecmds.c:15702 commands/tablecmds.c:18560 #, c-format msgid "circular inheritance not allowed" msgstr "циклічне уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ¿Ñ€Ð¸Ð¿ÑƒÑтиме" -#: commands/tablecmds.c:14848 commands/tablecmds.c:17798 +#: commands/tablecmds.c:15703 commands/tablecmds.c:18561 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" вже Ñ” нащадком \"%s\"." -#: commands/tablecmds.c:14861 +#: commands/tablecmds.c:15716 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "тригер \"%s\" не дозволÑÑ” таблиці \"%s\" Ñтати нащадком уÑпадкуваннÑ" -#: commands/tablecmds.c:14863 +#: commands/tablecmds.c:15718 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "Тригери ROW з перехідними таблицÑми не підтримуютьÑÑ Ð² ієрархіÑÑ… уÑпадкуваннÑ." -#: commands/tablecmds.c:15066 +#: commands/tablecmds.c:15907 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "Ñтовпець \"%s\" в дочірній таблиці має бути позначений Ñк NOT NULL" -#: commands/tablecmds.c:15075 +#: commands/tablecmds.c:15916 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "Ñтовпець \"%s\" у дочірній таблиці повинен бути згенерованим Ñтовпцем" -#: commands/tablecmds.c:15125 +#: commands/tablecmds.c:15920 #, c-format -msgid "column \"%s\" in child table has a conflicting generation expression" -msgstr "Ñтовпець \"%s\" в дочірній таблиці міÑтить конфліктний вираз генеруваннÑ" +msgid "column \"%s\" in child table must not be a generated column" +msgstr "Ñтовпець \"%s\" у дочірній таблиці повинен бути не генерованим Ñтовпцем" -#: commands/tablecmds.c:15153 +#: commands/tablecmds.c:15958 #, c-format msgid "child table is missing column \"%s\"" msgstr "у дочірній таблиці не виÑтачає ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: commands/tablecmds.c:15241 +#: commands/tablecmds.c:16039 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "Ð´Ð¾Ñ‡Ñ–Ñ€Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" має інше Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:15249 +#: commands/tablecmds.c:16046 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" конфліктує з неуÑпадкованим обмеженнÑм дочірньої таблиці \"%s\"" -#: commands/tablecmds.c:15260 +#: commands/tablecmds.c:16056 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" конфліктує з NOT VALID обмеженнÑм дочірньої таблиці \"%s\"" -#: commands/tablecmds.c:15295 +#: commands/tablecmds.c:16094 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "у дочірній таблиці не виÑтачає Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:15381 +#: commands/tablecmds.c:16180 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "розділ \"%s\" вже очікує Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð² Ñекціонованій таблиці \"%s.%s\"" -#: commands/tablecmds.c:15410 commands/tablecmds.c:15458 +#: commands/tablecmds.c:16209 commands/tablecmds.c:16255 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ” Ñекцією Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:15464 +#: commands/tablecmds.c:16261 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ” предком Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:15692 +#: commands/tablecmds.c:16488 #, c-format msgid "typed tables cannot inherit" msgstr "типізовані таблиці не можуть уÑпадковуватиÑÑŒ" -#: commands/tablecmds.c:15722 +#: commands/tablecmds.c:16518 #, c-format msgid "table is missing column \"%s\"" msgstr "у таблиці не виÑтачає ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: commands/tablecmds.c:15733 +#: commands/tablecmds.c:16529 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¼Ñ–Ñтить Ñтовпець \"%s\", а тип потребує \"%s\"" -#: commands/tablecmds.c:15742 +#: commands/tablecmds.c:16538 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" міÑтить Ñтовпець \"%s\" іншого типу" -#: commands/tablecmds.c:15756 +#: commands/tablecmds.c:16552 #, c-format msgid "table has extra column \"%s\"" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¼Ñ–Ñтить зайвий Ñтовпець \"%s\"" -#: commands/tablecmds.c:15808 +#: commands/tablecmds.c:16604 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" - не типізована таблицÑ" -#: commands/tablecmds.c:15996 +#: commands/tablecmds.c:16778 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— репліки не можна викориÑтати неунікальний Ñ–Ð½Ð´ÐµÐºÑ \"%s\"" -#: commands/tablecmds.c:16002 +#: commands/tablecmds.c:16784 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— репліки не можна викориÑтати небезпоÑередній Ñ–Ð½Ð´ÐµÐºÑ \"%s\"" -#: commands/tablecmds.c:16008 +#: commands/tablecmds.c:16790 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— репліки не можна викориÑтати Ñ–Ð½Ð´ÐµÐºÑ Ð· виразом \"%s\"" -#: commands/tablecmds.c:16014 +#: commands/tablecmds.c:16796 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— репліки не можна викориÑтати чаÑтковий Ñ–Ð½Ð´ÐµÐºÑ \"%s\"" -#: commands/tablecmds.c:16020 -#, c-format -msgid "cannot use invalid index \"%s\" as replica identity" -msgstr "Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— репліки не можна викориÑтати неприпуÑтимий Ñ–Ð½Ð´ÐµÐºÑ \"%s\"" - -#: commands/tablecmds.c:16037 +#: commands/tablecmds.c:16813 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" не можна викориÑтати Ñк ідентифікацію репліки, тому що Ñтовпець %d - ÑиÑтемний Ñтовпець" -#: commands/tablecmds.c:16044 +#: commands/tablecmds.c:16820 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" не можна викориÑтати Ñк ідентифікацію репліки, тому що Ñтовпець \"%s\" допуÑкає Null" -#: commands/tablecmds.c:16291 +#: commands/tablecmds.c:17072 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "змінити Ñтан Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\" не можна, тому що вона тимчаÑова" -#: commands/tablecmds.c:16315 +#: commands/tablecmds.c:17096 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "таблицю \"%s\" не можна змінити на нежурнальовану, тому що вона Ñ” чаÑтиною публікації" -#: commands/tablecmds.c:16317 +#: commands/tablecmds.c:17098 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Ðежурнальовані Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð½Ðµ підтримують реплікацію." -#: commands/tablecmds.c:16362 +#: commands/tablecmds.c:17143 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ таблицю \"%s\" на журнальовану, тому що вона поÑилаєтьÑÑ Ð½Ð° нежурнальовану таблицю \"%s\"" -#: commands/tablecmds.c:16372 +#: commands/tablecmds.c:17153 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ таблицю \"%s\" на нежурнальовану, тому що вона поÑилаєтьÑÑ Ð½Ð° журнальовану таблицю \"%s\"" -#: commands/tablecmds.c:16430 +#: commands/tablecmds.c:17211 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "переміÑтити поÑлідовніÑть з влаÑником в іншу Ñхему не можна" -#: commands/tablecmds.c:16458 -#, c-format -msgid "cannot move table \"%s\" to schema \"%s\"" -msgstr "неможливо переміÑтити таблицю \"%s\" в Ñхему \"%s \"" - -#: commands/tablecmds.c:16460 -#, c-format -msgid "The schema \"%s\" and same schema's table \"%s\" cannot be part of the same publication \"%s\"." -msgstr "Схема \"%s\" Ñ– Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ñ‚Ñ–Ñ”Ñ— ж Ñхеми \"%s\" не можуть бути чаÑтиною тієї ж публікації \"%s\"." - -#: commands/tablecmds.c:16564 +#: commands/tablecmds.c:17319 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" вже Ñ–Ñнує в Ñхемі \"%s\"" -#: commands/tablecmds.c:16977 +#: commands/tablecmds.c:17744 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\" не Ñ” таблицею або матеріалізованим поданнÑм" -#: commands/tablecmds.c:17127 +#: commands/tablecmds.c:17897 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" - не Ñкладений тип" -#: commands/tablecmds.c:17155 +#: commands/tablecmds.c:17927 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "змінити Ñхему індекÑу \"%s\" не можна" -#: commands/tablecmds.c:17157 commands/tablecmds.c:17169 +#: commands/tablecmds.c:17929 commands/tablecmds.c:17943 #, c-format msgid "Change the schema of the table instead." msgstr "ЗаміÑть цього змініть Ñхему таблиці." -#: commands/tablecmds.c:17161 +#: commands/tablecmds.c:17933 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "змінити Ñхему Ñкладеного типу \"%s\" не можна" -#: commands/tablecmds.c:17167 +#: commands/tablecmds.c:17941 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "змінити Ñхему таблиці TOAST \"%s\" не можна" -#: commands/tablecmds.c:17204 -#, c-format -msgid "unrecognized partitioning strategy \"%s\"" -msgstr "нерозпізнана ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ñ–Ñ ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"" - -#: commands/tablecmds.c:17212 +#: commands/tablecmds.c:17973 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ñ–Ñ ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ \"по ÑпиÑку\" не може викориÑтовувати декілька Ñтовпців" -#: commands/tablecmds.c:17278 +#: commands/tablecmds.c:18039 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "Ñтовпець \"%s\", згаданий в ключі ÑекціонуваннÑ, не Ñ–Ñнує" -#: commands/tablecmds.c:17286 +#: commands/tablecmds.c:18047 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "ÑиÑтемний Ñтовпець \"%s\" не можна викориÑтати в ключі ÑекціонуваннÑ" -#: commands/tablecmds.c:17297 commands/tablecmds.c:17411 +#: commands/tablecmds.c:18058 commands/tablecmds.c:18148 #, c-format msgid "cannot use generated column in partition key" msgstr "викориÑтати згенерований Ñтовпець в ключі Ñекції, не можна" -#: commands/tablecmds.c:17298 commands/tablecmds.c:17412 commands/trigger.c:667 -#: rewrite/rewriteHandler.c:907 rewrite/rewriteHandler.c:942 +#: commands/tablecmds.c:18131 #, c-format -msgid "Column \"%s\" is a generated column." -msgstr "Стовпець \"%s\" Ñ” згенерованим Ñтовпцем." +msgid "partition key expressions cannot contain system column references" +msgstr "вирази ключа ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можуть міÑтити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° ÑиÑтемний Ñтовпець" -#: commands/tablecmds.c:17374 +#: commands/tablecmds.c:18178 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "функції у виразі ключа ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ– бути позначені Ñк IMMUTABLE" -#: commands/tablecmds.c:17394 -#, c-format -msgid "partition key expressions cannot contain system column references" -msgstr "вирази ключа ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можуть міÑтити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° ÑиÑтемний Ñтовпець" - -#: commands/tablecmds.c:17424 +#: commands/tablecmds.c:18187 #, c-format msgid "cannot use constant expression as partition key" msgstr "не можна викориÑтати конÑтантий вираз Ñк ключ ÑекціонуваннÑ" -#: commands/tablecmds.c:17445 +#: commands/tablecmds.c:18208 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸, Ñке правило ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтати Ð´Ð»Ñ Ð²Ð¸Ñ€Ð°Ð·Ñƒ ÑекціонуваннÑ" -#: commands/tablecmds.c:17480 +#: commands/tablecmds.c:18243 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "Ви повинні вказати ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² Ð³ÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ визначити ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² Ð³ÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° замовчуваннÑм Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу даних." -#: commands/tablecmds.c:17486 +#: commands/tablecmds.c:18249 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "Ви повинні вказати ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² (btree) або визначити ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² (btree) за замовчуваннÑм Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу даних." -#: commands/tablecmds.c:17737 +#: commands/tablecmds.c:18500 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" вже Ñ” Ñекцією" -#: commands/tablecmds.c:17743 +#: commands/tablecmds.c:18506 #, c-format msgid "cannot attach a typed table as partition" msgstr "неможливо підключити типізовану таблицю в ÑкоÑті Ñекції" -#: commands/tablecmds.c:17759 +#: commands/tablecmds.c:18522 #, c-format msgid "cannot attach inheritance child as partition" msgstr "неможливо підключити нащадка уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð² ÑкоÑті Ñекції" -#: commands/tablecmds.c:17773 +#: commands/tablecmds.c:18536 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "неможливо підключити предка уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð² ÑкоÑті Ñекції" -#: commands/tablecmds.c:17807 +#: commands/tablecmds.c:18570 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "неможливо підкючити тимчаÑове Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð² ÑкоÑті Ñекції поÑтійного Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:17815 +#: commands/tablecmds.c:18578 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "неможливо підключити поÑтійне Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð² ÑкоÑті Ñекції тимчаÑового Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/tablecmds.c:17823 +#: commands/tablecmds.c:18586 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "неможливо підключити Ñекцію до тимчаÑового Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð² іншому ÑеанÑÑ–" -#: commands/tablecmds.c:17830 +#: commands/tablecmds.c:18593 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "неможливо підключити тимчаÑове Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· іншого ÑеанÑу в ÑкоÑті Ñекції" -#: commands/tablecmds.c:17850 +#: commands/tablecmds.c:18613 +#, c-format +msgid "table \"%s\" being attached contains an identity column \"%s\"" +msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\", що додаєтьÑÑ, міÑтить Ñтовпець ідентичноÑті \"%s\"" + +#: commands/tablecmds.c:18615 +#, c-format +msgid "The new partition may not contain an identity column." +msgstr "Ðовий розділ може не міÑтити ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ‡Ð½Ð¾Ñті." + +#: commands/tablecmds.c:18623 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" міÑтить Ñтовпець \"%s\", відÑутній в батьківÑькій \"%s\"" -#: commands/tablecmds.c:17853 +#: commands/tablecmds.c:18626 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "Ðова ÑÐµÐºÑ†Ñ–Ñ Ð¼Ð¾Ð¶Ðµ міÑтити лише Ñтовпці, що Ñ” у батьківÑькій таблиці." -#: commands/tablecmds.c:17865 +#: commands/tablecmds.c:18638 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "тригер \"%s\" не дозволÑÑ” зробити таблицю \"%s\" Ñекцією" -#: commands/tablecmds.c:17867 +#: commands/tablecmds.c:18640 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "Тригери ROW з перехідними таблицÑми не підтримуютьÑÑ Ð´Ð»Ñ Ñекцій." -#: commands/tablecmds.c:18046 +#: commands/tablecmds.c:18816 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "не можна підключити зовнішню таблицю \"%s\" в ÑкоÑті Ñекції Ñекціонованої таблиці \"%s\"" -#: commands/tablecmds.c:18049 +#: commands/tablecmds.c:18819 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Секціонована Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" міÑтить унікальні індекÑи." -#: commands/tablecmds.c:18360 +#: commands/tablecmds.c:19141 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "не можна одночаÑно відключити розділи, коли Ñ–Ñнує розділ за замовчуваннÑм" -#: commands/tablecmds.c:18469 +#: commands/tablecmds.c:19250 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "Ñекціоновану таблицю \"%s\" було видалено одночаÑно" -#: commands/tablecmds.c:18475 +#: commands/tablecmds.c:19256 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "розділ \"%s\" було видалено паралельно" -#: commands/tablecmds.c:18979 commands/tablecmds.c:18999 -#: commands/tablecmds.c:19019 commands/tablecmds.c:19038 -#: commands/tablecmds.c:19080 +#: commands/tablecmds.c:19870 commands/tablecmds.c:19890 +#: commands/tablecmds.c:19911 commands/tablecmds.c:19930 +#: commands/tablecmds.c:19972 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "неможливо підключити Ñ–Ð½Ð´ÐµÐºÑ \"%s\" в ÑкоÑті Ñекції індекÑу \"%s\"" -#: commands/tablecmds.c:18982 +#: commands/tablecmds.c:19873 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Ð†Ð½Ð´ÐµÐºÑ \"%s\" вже підключений до іншого індекÑу." -#: commands/tablecmds.c:19002 +#: commands/tablecmds.c:19893 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Ð†Ð½Ð´ÐµÐºÑ \"%s\" не Ñ” індекÑом жодної Ñекції таблиці \"%s\"." -#: commands/tablecmds.c:19022 +#: commands/tablecmds.c:19914 #, c-format msgid "The index definitions do not match." msgstr "Ð’Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑів не Ñпівпадають." -#: commands/tablecmds.c:19041 +#: commands/tablecmds.c:19933 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "Ð†Ð½Ð´ÐµÐºÑ \"%s\" належить обмеженню в таблиці \"%s\", але Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ–Ð½Ð´ÐµÐºÑу \"%s\" не Ñ–Ñнує." -#: commands/tablecmds.c:19083 +#: commands/tablecmds.c:19975 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "До Ñекції \"%s\" вже підключений інший індекÑ." -#: commands/tablecmds.c:19313 +#: commands/tablecmds.c:20211 #, c-format msgid "column data type %s does not support compression" msgstr "тип даних ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ %s не підтримує ÑтиÑканнÑ" -#: commands/tablecmds.c:19320 +#: commands/tablecmds.c:20218 #, c-format msgid "invalid compression method \"%s\"" msgstr "неприпуÑтимий метод ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\"" -#: commands/tablespace.c:199 commands/tablespace.c:665 +#: commands/tablecmds.c:20244 +#, c-format +msgid "invalid storage type \"%s\"" +msgstr "неприпуÑтимий тип Ñховища \"%s\"" + +#: commands/tablecmds.c:20254 +#, c-format +msgid "column data type %s can only have storage PLAIN" +msgstr "тип даних ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ %s може мати тільки Ñховище PLAIN" + +#: commands/tablespace.c:193 commands/tablespace.c:644 #, c-format msgid "\"%s\" exists but is not a directory" msgstr "\"%s\" Ñ–Ñнує, але це не каталог" -#: commands/tablespace.c:231 +#: commands/tablespace.c:224 #, c-format msgid "permission denied to create tablespace \"%s\"" msgstr "немає прав на ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору \"%s\"" -#: commands/tablespace.c:233 +#: commands/tablespace.c:226 #, c-format msgid "Must be superuser to create a tablespace." msgstr "Щоб Ñтворити табличний проÑтір, потрібно бути ÑуперкориÑтувачем." -#: commands/tablespace.c:249 +#: commands/tablespace.c:242 #, c-format msgid "tablespace location cannot contain single quotes" msgstr "у шлÑху до Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтіру не повинно бути одинарних лапок" -#: commands/tablespace.c:262 +#: commands/tablespace.c:255 #, c-format msgid "tablespace location must be an absolute path" msgstr "шлÑÑ… до Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору повинен бути абÑолютним" -#: commands/tablespace.c:274 +#: commands/tablespace.c:267 #, c-format msgid "tablespace location \"%s\" is too long" msgstr "шлÑÑ… до Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору \"%s\" занадто довгий" -#: commands/tablespace.c:281 +#: commands/tablespace.c:274 #, c-format msgid "tablespace location should not be inside the data directory" msgstr "табличний проÑтір не повинен розташовуватиÑÑŒ вÑередині каталогу даних" -#: commands/tablespace.c:290 commands/tablespace.c:996 +#: commands/tablespace.c:283 commands/tablespace.c:970 #, c-format msgid "unacceptable tablespace name \"%s\"" msgstr "неприпуÑтиме ім'Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору \"%s\"" -#: commands/tablespace.c:292 commands/tablespace.c:997 +#: commands/tablespace.c:285 commands/tablespace.c:971 #, c-format msgid "The prefix \"pg_\" is reserved for system tablespaces." msgstr "ÐŸÑ€ÐµÑ„Ñ–ÐºÑ \"\"pg_\" зарезервований Ð´Ð»Ñ ÑиÑтемних табличних проÑторів." -#: commands/tablespace.c:311 commands/tablespace.c:1018 +#: commands/tablespace.c:304 commands/tablespace.c:992 #, c-format msgid "tablespace \"%s\" already exists" msgstr "табличний проÑтір \"%s\" вже Ñ–Ñнує" -#: commands/tablespace.c:329 +#: commands/tablespace.c:320 #, c-format msgid "pg_tablespace OID value not set when in binary upgrade mode" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ OID pg_tablespace не вÑтановлено в режимі двійкового оновленнÑ" -#: commands/tablespace.c:441 commands/tablespace.c:979 -#: commands/tablespace.c:1068 commands/tablespace.c:1137 -#: commands/tablespace.c:1283 commands/tablespace.c:1486 +#: commands/tablespace.c:425 commands/tablespace.c:953 +#: commands/tablespace.c:1042 commands/tablespace.c:1111 +#: commands/tablespace.c:1257 commands/tablespace.c:1460 #, c-format msgid "tablespace \"%s\" does not exist" msgstr "табличний проÑтір \"%s\" не Ñ–Ñнує" -#: commands/tablespace.c:447 +#: commands/tablespace.c:431 #, c-format msgid "tablespace \"%s\" does not exist, skipping" msgstr "табличний проÑтір \"%s\" вже Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/tablespace.c:473 +#: commands/tablespace.c:457 #, c-format msgid "tablespace \"%s\" cannot be dropped because some objects depend on it" msgstr "табличний проÑтір \"%s\" не можна видалити, тому що деÑкі об'єкти залежать від нього" -#: commands/tablespace.c:540 +#: commands/tablespace.c:524 #, c-format msgid "tablespace \"%s\" is not empty" msgstr "табличний проÑтір \"%s\" не пуÑтий" -#: commands/tablespace.c:632 +#: commands/tablespace.c:611 #, c-format msgid "directory \"%s\" does not exist" msgstr "каталог \"%s\" не Ñ–Ñнує" -#: commands/tablespace.c:633 +#: commands/tablespace.c:612 #, c-format msgid "Create this directory for the tablespace before restarting the server." msgstr "Створіть цей каталог Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору до перезапуÑку Ñервера." -#: commands/tablespace.c:638 +#: commands/tablespace.c:617 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñтановити права Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ \"%s\": %m" -#: commands/tablespace.c:670 +#: commands/tablespace.c:649 #, c-format msgid "directory \"%s\" already in use as a tablespace" msgstr "каталог \"%s\" вже викориÑтовуєтьÑÑ Ð² ÑкоÑті табличного проÑтору" -#: commands/tablespace.c:788 commands/tablespace.c:801 -#: commands/tablespace.c:837 commands/tablespace.c:929 storage/file/fd.c:3255 -#: storage/file/fd.c:3669 -#, c-format -msgid "could not remove directory \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ каталог \"%s\": %m" - -#: commands/tablespace.c:850 commands/tablespace.c:938 +#: commands/tablespace.c:827 commands/tablespace.c:913 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñимвольне поÑÐ¸Ð»Ð°Ð½Ð½Ñ \"%s\": %m" -#: commands/tablespace.c:860 commands/tablespace.c:947 +#: commands/tablespace.c:836 commands/tablespace.c:921 #, c-format msgid "\"%s\" is not a directory or symbolic link" msgstr "\"%s\" - не каталог або Ñимвольне поÑиланнÑ" -#: commands/tablespace.c:1142 +#: commands/tablespace.c:1116 #, c-format msgid "Tablespace \"%s\" does not exist." msgstr "Табличний проÑтір \"%s\" не Ñ–Ñнує." -#: commands/tablespace.c:1588 +#: commands/tablespace.c:1562 #, c-format msgid "directories for tablespace %u could not be removed" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ каталоги табличного проÑтору %u" -#: commands/tablespace.c:1590 +#: commands/tablespace.c:1564 #, c-format msgid "You can remove the directories manually if necessary." msgstr "За потреби ви можете видалити каталоги вручну." -#: commands/trigger.c:229 commands/trigger.c:240 +#: commands/trigger.c:225 commands/trigger.c:236 #, c-format msgid "\"%s\" is a table" msgstr "\"%s\" - таблицÑ" -#: commands/trigger.c:231 commands/trigger.c:242 +#: commands/trigger.c:227 commands/trigger.c:238 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Таблиці не можуть мати тригери INSTEAD OF." -#: commands/trigger.c:263 +#: commands/trigger.c:259 #, c-format msgid "\"%s\" is a partitioned table" msgstr "\"%s\" Ñ” Ñекційною таблицею" -#: commands/trigger.c:265 +#: commands/trigger.c:261 #, c-format -msgid "Triggers on partitioned tables cannot have transition tables." -msgstr "Тригери Ñекціонованих таблиць не можуть викориÑтовувати перехідні таблиці." +msgid "ROW triggers with transition tables are not supported on partitioned tables." +msgstr "Тригери ROW з перехідними таблицÑми не підтримуютьÑÑ Ð´Ð»Ñ Ñекційованих таблиць." -#: commands/trigger.c:277 commands/trigger.c:284 commands/trigger.c:455 +#: commands/trigger.c:273 commands/trigger.c:280 commands/trigger.c:444 #, c-format msgid "\"%s\" is a view" msgstr "\"%s\" - поданнÑ" -#: commands/trigger.c:279 +#: commands/trigger.c:275 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ð½Ðµ можуть мати Ñ€Ñдкові тригери BEFORE або AFTER." -#: commands/trigger.c:286 +#: commands/trigger.c:282 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ð½Ðµ можуть мати тригери TRUNCATE." -#: commands/trigger.c:294 commands/trigger.c:301 commands/trigger.c:313 -#: commands/trigger.c:448 +#: commands/trigger.c:290 commands/trigger.c:302 commands/trigger.c:437 #, c-format msgid "\"%s\" is a foreign table" msgstr "\"%s\" - Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ" -#: commands/trigger.c:296 +#: commands/trigger.c:292 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "Зовнішні таблиці не можуть мати тригери INSTEAD OF." -#: commands/trigger.c:303 -#, c-format -msgid "Foreign tables cannot have TRUNCATE triggers." -msgstr "Зовнішні таблиці не можуть мати тригери TRUNCATE." - -#: commands/trigger.c:315 +#: commands/trigger.c:304 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Зовнішні таблиці не можуть мати обмежувальні тригери." -#: commands/trigger.c:320 commands/trigger.c:1375 commands/trigger.c:1482 +#: commands/trigger.c:309 commands/trigger.c:1325 commands/trigger.c:1432 #, c-format msgid "relation \"%s\" cannot have triggers" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не може мати тригери" -#: commands/trigger.c:391 +#: commands/trigger.c:380 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "Тригери TRUNCATE FOR EACH ROW не підтримуютьÑÑ" -#: commands/trigger.c:399 +#: commands/trigger.c:388 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "Тригери INSTEAD OF повинні мати тип FOR EACH ROW" -#: commands/trigger.c:403 +#: commands/trigger.c:392 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "Тригери INSTEAD OF не можуть мати умови WHEN" -#: commands/trigger.c:407 +#: commands/trigger.c:396 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "Тригери INSTEAD OF не можуть мати ÑпиÑок Ñтовпців" -#: commands/trigger.c:436 +#: commands/trigger.c:425 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "Змінна Ñ–Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ ROW в реченні REFERENCING не підтримуєтьÑÑ" -#: commands/trigger.c:437 +#: commands/trigger.c:426 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "ВикориÑтайте OLD TABLE або NEW TABLE Ð´Ð»Ñ Ñ–Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÑ…Ñ–Ð´Ð½Ð¸Ñ… таблиць." -#: commands/trigger.c:450 +#: commands/trigger.c:439 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Тригери зовнішніх таблиць не можуть викориÑтовувати перехідні таблиці." -#: commands/trigger.c:457 +#: commands/trigger.c:446 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Тригери подань не можуть викориÑтовувати перехідні таблиці." -#: commands/trigger.c:473 +#: commands/trigger.c:462 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "Тригери ROW з перехідними таблицÑми Ð´Ð»Ñ Ñекцій не підтримуютьÑÑ" -#: commands/trigger.c:477 +#: commands/trigger.c:466 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" msgstr "Тригери ROW з перехідними таблицÑми Ð´Ð»Ñ Ð½Ð°Ñ‰Ð°Ð´ÐºÑ–Ð² уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ" -#: commands/trigger.c:483 +#: commands/trigger.c:472 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "ім'Ñ Ð¿ÐµÑ€ÐµÑ…Ñ–Ð´Ð½Ð¾Ñ— таблиці можна задати лише Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñƒ AFTER" -#: commands/trigger.c:488 +#: commands/trigger.c:477 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "Тригери TRUNCATE з перехідними таблицÑми не підтримуютьÑÑ" -#: commands/trigger.c:505 +#: commands/trigger.c:494 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" msgstr "перехідні таблиці не можна задати Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð², призначених Ð´Ð»Ñ ÐºÑ–Ð»ÑŒÐºÐ¾Ñ… подій" -#: commands/trigger.c:516 +#: commands/trigger.c:505 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "перехідні таблиці не можна задати Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² зі ÑпиÑками Ñтовпців" -#: commands/trigger.c:533 +#: commands/trigger.c:522 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE можна задати лише Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² INSERT або UPDATE" -#: commands/trigger.c:538 +#: commands/trigger.c:527 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE не можна задавати декілька разів" -#: commands/trigger.c:548 +#: commands/trigger.c:537 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE можна задати лише Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² DELETE або UPDATE" -#: commands/trigger.c:553 +#: commands/trigger.c:542 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE не можна задавати декілька разів" -#: commands/trigger.c:563 +#: commands/trigger.c:552 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "Ім'Ñ OLD TABLE та ім'Ñ NEW TABLE не можуть бути однаковими" -#: commands/trigger.c:627 commands/trigger.c:640 +#: commands/trigger.c:616 commands/trigger.c:629 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "в умові WHEN операторного тригера не можна поÑилатиÑÑŒ на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑтовпцÑ" -#: commands/trigger.c:632 +#: commands/trigger.c:621 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "Ð’ умові WHEN тригеру INSERT не можна поÑилатиÑÑŒ на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ OLD" -#: commands/trigger.c:645 +#: commands/trigger.c:634 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "Ð’ умові WHEN тригера DELETE не можна поÑилатиÑÑŒ на Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ NEW" -#: commands/trigger.c:650 +#: commands/trigger.c:639 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "Ð’ умові WHEN тригера BEFORE не можна поÑилатиÑÑŒ на ÑиÑтемні Ñтовпці NEW" -#: commands/trigger.c:658 commands/trigger.c:666 +#: commands/trigger.c:647 commands/trigger.c:655 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "Ð’ умові WHEN тригера BEFORE не можна поÑилатиÑÑŒ на згенеровані Ñтовпці NEW" -#: commands/trigger.c:659 +#: commands/trigger.c:648 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "ВикориÑтовуєтьÑÑ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° веÑÑŒ Ñ€Ñдок Ñ– Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¼Ñ–Ñтить згенеровані Ñтовпці." -#: commands/trigger.c:774 commands/trigger.c:1657 +#: commands/trigger.c:763 commands/trigger.c:1607 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "тригер \"%s\" Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" вже Ñ–Ñнує" -#: commands/trigger.c:787 +#: commands/trigger.c:776 #, c-format msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" msgstr "тригер \"%s\" Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" Ñ” зовнішнім або дочірнім тригером" -#: commands/trigger.c:806 +#: commands/trigger.c:795 #, c-format msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" msgstr "тригер \"%s\" Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" Ñ” зовнішнім тригером" -#: commands/trigger.c:1447 commands/trigger.c:1600 commands/trigger.c:1876 +#: commands/trigger.c:1397 commands/trigger.c:1550 commands/trigger.c:1831 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "тригер \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\" не Ñ–Ñнує" -#: commands/trigger.c:1572 +#: commands/trigger.c:1522 #, c-format msgid "cannot rename trigger \"%s\" on table \"%s\"" msgstr "перейменувати тригер \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\" не можна" -#: commands/trigger.c:1574 +#: commands/trigger.c:1524 #, c-format -msgid "Rename trigger on partitioned table \"%s\" instead." +msgid "Rename the trigger on the partitioned table \"%s\" instead." msgstr "ЗаміÑть цього перейменуйте тригер Ð´Ð»Ñ Ñекціонованої таблиці \"%s\"." -#: commands/trigger.c:1674 +#: commands/trigger.c:1624 #, c-format msgid "renamed trigger \"%s\" on relation \"%s\"" msgstr "перейменовано тригер \"%s\" Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" -#: commands/trigger.c:1816 +#: commands/trigger.c:1770 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "немає доÑтупу: \"%s\" - ÑиÑтемний тригер" -#: commands/trigger.c:2437 +#: commands/trigger.c:2379 #, c-format msgid "trigger function %u returned null value" msgstr "тригерна Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %u повернула Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ null" -#: commands/trigger.c:2497 commands/trigger.c:2715 commands/trigger.c:2965 -#: commands/trigger.c:3298 +#: commands/trigger.c:2439 commands/trigger.c:2657 commands/trigger.c:2910 +#: commands/trigger.c:3263 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "Тригер BEFORE STATEMENT не може повертати значеннÑ" -#: commands/trigger.c:2573 +#: commands/trigger.c:2515 #, c-format msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" msgstr "Ð¿ÐµÑ€ÐµÐ¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ€Ñдка до іншої Ñекції під Ñ‡Ð°Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñƒ BEFORE FOR EACH ROW не підтримуєтьÑÑ" -#: commands/trigger.c:2574 +#: commands/trigger.c:2516 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "Перед виконаннÑм тригера \"%s\", Ñ€Ñдок повинен був бути в Ñекції \"%s.%s\"." -#: commands/trigger.c:3372 executor/nodeModifyTable.c:2226 -#: executor/nodeModifyTable.c:2309 -#, c-format -msgid "tuple to be updated was already modified by an operation triggered by the current command" -msgstr "кортеж, Ñкий повинен бути оновленим, вже змінений в операції, Ñка викликана поточною командою" - -#: commands/trigger.c:3373 executor/nodeModifyTable.c:1412 -#: executor/nodeModifyTable.c:1486 executor/nodeModifyTable.c:2227 -#: executor/nodeModifyTable.c:2310 executor/nodeModifyTable.c:2968 +#: commands/trigger.c:3341 executor/nodeModifyTable.c:1541 +#: executor/nodeModifyTable.c:1615 executor/nodeModifyTable.c:2377 +#: executor/nodeModifyTable.c:2468 executor/nodeModifyTable.c:3132 +#: executor/nodeModifyTable.c:3302 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "Можливо, Ð´Ð»Ñ Ð¿Ð¾ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ в інші Ñ€Ñдки Ñлід викориÑтати тригер AFTER заміÑть тригера BEFORE." -#: commands/trigger.c:3402 executor/nodeLockRows.c:229 -#: executor/nodeLockRows.c:238 executor/nodeModifyTable.c:329 -#: executor/nodeModifyTable.c:1428 executor/nodeModifyTable.c:2244 -#: executor/nodeModifyTable.c:2454 +#: commands/trigger.c:3382 executor/nodeLockRows.c:228 +#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:314 +#: executor/nodeModifyTable.c:1557 executor/nodeModifyTable.c:2394 +#: executor/nodeModifyTable.c:2618 #, c-format msgid "could not serialize access due to concurrent update" msgstr "не вдалоÑÑ Ñеріалізувати доÑтуп через паралельне оновленнÑ" -#: commands/trigger.c:3410 executor/nodeModifyTable.c:1518 -#: executor/nodeModifyTable.c:2327 executor/nodeModifyTable.c:2478 -#: executor/nodeModifyTable.c:2834 +#: commands/trigger.c:3390 executor/nodeModifyTable.c:1647 +#: executor/nodeModifyTable.c:2485 executor/nodeModifyTable.c:2642 +#: executor/nodeModifyTable.c:3150 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "не вдалоÑÑ Ñеріалізувати доÑтуп через паралельне видаленнÑ" -#: commands/trigger.c:4586 +#: commands/trigger.c:4599 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "не можна виконати відкладений тригер в межах операції з обмеженнÑм по безпеці" -#: commands/trigger.c:5762 +#: commands/trigger.c:5780 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" не Ñ” відкладеним" -#: commands/trigger.c:5785 +#: commands/trigger.c:5803 #, c-format msgid "constraint \"%s\" does not exist" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: commands/tsearchcmds.c:118 commands/tsearchcmds.c:635 +#: commands/tsearchcmds.c:124 commands/tsearchcmds.c:641 #, c-format msgid "function %s should return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %s повинна повертати тип %s" -#: commands/tsearchcmds.c:194 +#: commands/tsearchcmds.c:200 #, c-format msgid "must be superuser to create text search parsers" msgstr "Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ñ–Ð² текÑтового пошуку потрібно бути ÑуперкориÑтувачем" -#: commands/tsearchcmds.c:247 +#: commands/tsearchcmds.c:253 #, c-format msgid "text search parser parameter \"%s\" not recognized" msgstr "параметр аналізатора текÑтового пошуку \"%s\" не розпізнаний" -#: commands/tsearchcmds.c:257 +#: commands/tsearchcmds.c:263 #, c-format msgid "text search parser start method is required" msgstr "Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð° текÑтового пошуку необхідний метод start" -#: commands/tsearchcmds.c:262 +#: commands/tsearchcmds.c:268 #, c-format msgid "text search parser gettoken method is required" msgstr "Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð° текÑтового пошуку необхідний метод gettoken" -#: commands/tsearchcmds.c:267 +#: commands/tsearchcmds.c:273 #, c-format msgid "text search parser end method is required" msgstr "Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð° текÑтового пошуку необхідний метод end" -#: commands/tsearchcmds.c:272 +#: commands/tsearchcmds.c:278 #, c-format msgid "text search parser lextypes method is required" msgstr "Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð° текÑтового пошуку необхідний метод lextypes" -#: commands/tsearchcmds.c:366 +#: commands/tsearchcmds.c:372 #, c-format msgid "text search template \"%s\" does not accept options" msgstr "шаблон текÑтового пошуку \"%s\" не приймає параметри" -#: commands/tsearchcmds.c:440 +#: commands/tsearchcmds.c:446 #, c-format msgid "text search template is required" msgstr "необхідний шаблон текÑтового пошуку" -#: commands/tsearchcmds.c:701 +#: commands/tsearchcmds.c:707 #, c-format msgid "must be superuser to create text search templates" msgstr "Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ñ–Ð² текÑтового пошуку потрібно бути ÑуперкориÑтувачем" -#: commands/tsearchcmds.c:743 +#: commands/tsearchcmds.c:749 #, c-format msgid "text search template parameter \"%s\" not recognized" msgstr "параметр шаблону текÑтового пошуку \"%s\" не розпізнаний" -#: commands/tsearchcmds.c:753 +#: commands/tsearchcmds.c:759 #, c-format msgid "text search template lexize method is required" msgstr "Ð´Ð»Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ñƒ текÑтового пошуку необхідний метод lexize" -#: commands/tsearchcmds.c:933 +#: commands/tsearchcmds.c:939 #, c-format msgid "text search configuration parameter \"%s\" not recognized" msgstr "параметр конфігурації текÑтового пошуку \"%s\" не розпізнаний" -#: commands/tsearchcmds.c:940 +#: commands/tsearchcmds.c:946 #, c-format msgid "cannot specify both PARSER and COPY options" msgstr "вказати параметри PARSER Ñ– COPY одночаÑно не можна" -#: commands/tsearchcmds.c:976 +#: commands/tsearchcmds.c:982 #, c-format msgid "text search parser is required" msgstr "необхідний аналізатор текÑтового пошуку" -#: commands/tsearchcmds.c:1200 +#: commands/tsearchcmds.c:1277 #, c-format msgid "token type \"%s\" does not exist" msgstr "тип маркера \"%s\" не Ñ–Ñнує" -#: commands/tsearchcmds.c:1427 +#: commands/tsearchcmds.c:1540 #, c-format msgid "mapping for token type \"%s\" does not exist" msgstr "зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ маркера \"%s\" не Ñ–Ñнує" -#: commands/tsearchcmds.c:1433 +#: commands/tsearchcmds.c:1546 #, c-format msgid "mapping for token type \"%s\" does not exist, skipping" msgstr "зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ маркера \"%s\" не Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/tsearchcmds.c:1596 commands/tsearchcmds.c:1711 +#: commands/tsearchcmds.c:1707 commands/tsearchcmds.c:1822 #, c-format msgid "invalid parameter list format: \"%s\"" msgstr "неприпуÑтимий формат ÑпиÑку параметрів: \"%s\"" -#: commands/typecmds.c:217 +#: commands/typecmds.c:221 #, c-format msgid "must be superuser to create a base type" msgstr "Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð³Ð¾ типу потрібно бути ÑуперкориÑтувачем" -#: commands/typecmds.c:275 +#: commands/typecmds.c:279 #, c-format msgid "Create the type as a shell type, then create its I/O functions, then do a full CREATE TYPE." msgstr "Створіть тип в ÑкоÑті оболонки, потім Ñтворіть його функції вводу-виводу, а потім виконайте повну CREATE TYPE." -#: commands/typecmds.c:327 commands/typecmds.c:1450 commands/typecmds.c:4268 +#: commands/typecmds.c:331 commands/typecmds.c:1460 commands/typecmds.c:4480 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "атрибут типу \"%s\" не розпізнаний" -#: commands/typecmds.c:382 +#: commands/typecmds.c:386 #, c-format msgid "invalid type category \"%s\": must be simple ASCII" msgstr "неприпуÑтима ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ñ–Ñ Ñ‚Ð¸Ð¿Ñƒ \"%s\": повинен бути проÑтий ASCII" -#: commands/typecmds.c:401 +#: commands/typecmds.c:405 #, c-format msgid "array element type cannot be %s" msgstr "типом елементу маÑиву не може бути %s" -#: commands/typecmds.c:433 +#: commands/typecmds.c:437 #, c-format msgid "alignment \"%s\" not recognized" msgstr "тип Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\" не розпізнаний" -#: commands/typecmds.c:450 commands/typecmds.c:4142 +#: commands/typecmds.c:454 commands/typecmds.c:4354 #, c-format msgid "storage \"%s\" not recognized" msgstr "Ñховище \"%s\" не розпізнане" -#: commands/typecmds.c:461 +#: commands/typecmds.c:465 #, c-format msgid "type input function must be specified" msgstr "необхідно вказати функцію вводу типу" -#: commands/typecmds.c:465 +#: commands/typecmds.c:469 #, c-format msgid "type output function must be specified" msgstr "необхідно вказати функцію виводу типу" -#: commands/typecmds.c:470 +#: commands/typecmds.c:474 #, c-format msgid "type modifier output function is useless without a type modifier input function" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ модифікатора типу недоцільна без функції вводу модифікатора типу" -#: commands/typecmds.c:512 +#: commands/typecmds.c:516 #, c-format msgid "element type cannot be specified without a subscripting function" msgstr "тип елементу не можна вказати без припуÑтимої функції підпиÑки" -#: commands/typecmds.c:781 +#: commands/typecmds.c:785 #, c-format msgid "\"%s\" is not a valid base type for a domain" msgstr "\"%s\" - невідповідний базовий тип Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ" -#: commands/typecmds.c:879 +#: commands/typecmds.c:883 #, c-format msgid "multiple default expressions" msgstr "неодноразове Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ за замовчуваннÑм" -#: commands/typecmds.c:942 commands/typecmds.c:951 +#: commands/typecmds.c:946 commands/typecmds.c:955 #, c-format msgid "conflicting NULL/NOT NULL constraints" msgstr "конфліктуючі Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ NULL/NOT NULL" -#: commands/typecmds.c:967 +#: commands/typecmds.c:971 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "перевірки Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ–Ð² не можуть позначатиÑÑŒ Ñк NO INHERIT" -#: commands/typecmds.c:976 commands/typecmds.c:2960 +#: commands/typecmds.c:980 commands/typecmds.c:2940 #, c-format msgid "unique constraints not possible for domains" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑƒÐ½Ñ–ÐºÐ°Ð»ÑŒÐ½Ð¾Ñті неможливе Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ–Ð²" -#: commands/typecmds.c:982 commands/typecmds.c:2966 +#: commands/typecmds.c:986 commands/typecmds.c:2946 #, c-format msgid "primary key constraints not possible for domains" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€Ð²Ð¸Ð½Ð½Ð¾Ð³Ð¾ ключа неможливі Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ–Ð²" -#: commands/typecmds.c:988 commands/typecmds.c:2972 +#: commands/typecmds.c:992 commands/typecmds.c:2952 #, c-format msgid "exclusion constraints not possible for domains" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð½Ñтків неможливі Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ–Ð²" -#: commands/typecmds.c:994 commands/typecmds.c:2978 +#: commands/typecmds.c:998 commands/typecmds.c:2958 #, c-format msgid "foreign key constraints not possible for domains" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ñ… ключів неможливі Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ–Ð²" -#: commands/typecmds.c:1003 commands/typecmds.c:2987 +#: commands/typecmds.c:1007 commands/typecmds.c:2967 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "Ð·Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½ÑŒ Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñ–Ð² не підтримуєтьÑÑ" -#: commands/typecmds.c:1317 utils/cache/typcache.c:2567 +#: commands/typecmds.c:1327 utils/cache/typcache.c:2570 #, c-format msgid "%s is not an enum" msgstr "%s не Ñ” переліком" -#: commands/typecmds.c:1458 +#: commands/typecmds.c:1468 #, c-format msgid "type attribute \"subtype\" is required" msgstr "вимагаєтьÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚ типу \"subtype\"" -#: commands/typecmds.c:1463 +#: commands/typecmds.c:1473 #, c-format msgid "range subtype cannot be %s" msgstr "%s не може бути підтипом діапазону" -#: commands/typecmds.c:1482 +#: commands/typecmds.c:1492 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "вказано правило ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ñƒ, але підтип не підтримує ÑортуваннÑ" -#: commands/typecmds.c:1492 +#: commands/typecmds.c:1502 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "неможливо вказати канонічну функцію без попередньо Ñтвореного типу оболонки" -#: commands/typecmds.c:1493 +#: commands/typecmds.c:1503 #, c-format msgid "Create the type as a shell type, then create its canonicalization function, then do a full CREATE TYPE." msgstr "Створіть тип в ÑкоÑті оболонки, потім Ñтворіть його функцію канонізації, а потім виконайте повну CREATE TYPE." -#: commands/typecmds.c:1966 +#: commands/typecmds.c:1975 #, c-format msgid "type input function %s has multiple matches" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s має декілька збігів" -#: commands/typecmds.c:1984 +#: commands/typecmds.c:1993 #, c-format msgid "type input function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð²Ð¾Ð´Ñƒ типу %s повинна повертати тип %s" -#: commands/typecmds.c:2000 +#: commands/typecmds.c:2009 #, c-format msgid "type input function %s should not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s не повинна бути змінною" -#: commands/typecmds.c:2028 +#: commands/typecmds.c:2037 #, c-format msgid "type output function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ типу %s повинна повертати тип %s" -#: commands/typecmds.c:2035 +#: commands/typecmds.c:2044 #, c-format msgid "type output function %s should not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ типу %s не повинна бути змінною" -#: commands/typecmds.c:2064 +#: commands/typecmds.c:2073 #, c-format msgid "type receive function %s has multiple matches" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s має декілька збігів" -#: commands/typecmds.c:2082 +#: commands/typecmds.c:2091 #, c-format msgid "type receive function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s повинна повертати тип %s" -#: commands/typecmds.c:2089 +#: commands/typecmds.c:2098 #, c-format msgid "type receive function %s should not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s не повинна бути змінною" -#: commands/typecmds.c:2117 +#: commands/typecmds.c:2126 #, c-format msgid "type send function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s повинна повертати тип %s" -#: commands/typecmds.c:2124 +#: commands/typecmds.c:2133 #, c-format msgid "type send function %s should not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s не повинна бути змінною" -#: commands/typecmds.c:2151 +#: commands/typecmds.c:2160 #, c-format msgid "typmod_in function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ typmod_in %s повинна повертати тип %s" -#: commands/typecmds.c:2158 +#: commands/typecmds.c:2167 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð²Ð¾Ð´Ñƒ модифікатора типу %s не повинна бути змінною" -#: commands/typecmds.c:2185 +#: commands/typecmds.c:2194 #, c-format msgid "typmod_out function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ typmod_out %s повинна повертати тип %s" -#: commands/typecmds.c:2192 +#: commands/typecmds.c:2201 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ модифікатора типу %s не повинна бути змінною" -#: commands/typecmds.c:2219 +#: commands/typecmds.c:2228 #, c-format msgid "type analyze function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ñƒ типу %s повинна повертати тип %s" -#: commands/typecmds.c:2248 +#: commands/typecmds.c:2257 #, c-format msgid "type subscripting function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки типу %s повинна повертати тип %s" -#: commands/typecmds.c:2258 +#: commands/typecmds.c:2267 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "типи визначені кориÑтувачем не можуть викориÑтовувати функцію підпиÑки %s" -#: commands/typecmds.c:2304 +#: commands/typecmds.c:2313 #, c-format msgid "You must specify an operator class for the range type or define a default operator class for the subtype." msgstr "Ви повинні вказати ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ діапазону або визначити ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð² за замовчуваннÑм Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ підтипу." -#: commands/typecmds.c:2335 +#: commands/typecmds.c:2344 #, c-format msgid "range canonical function %s must return range type" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ ÐºÐ°Ð½Ð¾Ð½Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ діапазону %s повинна вертати тип діапазону" -#: commands/typecmds.c:2341 +#: commands/typecmds.c:2350 #, c-format msgid "range canonical function %s must be immutable" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ ÐºÐ°Ð½Ð¾Ð½Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ діапазону %s повинна бути незмінною" -#: commands/typecmds.c:2377 +#: commands/typecmds.c:2386 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ñ€Ð¾Ð·Ð±Ñ–Ð¶Ð½Ð¾Ñтей Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð¸Ð¿Ñƒ діапазону %s повинна повертати тип %s" -#: commands/typecmds.c:2384 +#: commands/typecmds.c:2393 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ñ€Ð¾Ð·Ð±Ñ–Ð¶Ð½Ð¾Ñтей Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ð¸Ð¿Ñƒ діапазону %s повинна бути незмінною" -#: commands/typecmds.c:2411 +#: commands/typecmds.c:2420 #, c-format msgid "pg_type array OID value not set when in binary upgrade mode" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ OID маÑиву pg_type не вÑтановлено в режимі двійкового оновленнÑ" -#: commands/typecmds.c:2444 +#: commands/typecmds.c:2453 #, c-format msgid "pg_type multirange OID value not set when in binary upgrade mode" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ OID в pg_type не задано під Ñ‡Ð°Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ двійкового оновленнÑ" -#: commands/typecmds.c:2477 +#: commands/typecmds.c:2486 #, c-format msgid "pg_type multirange array OID value not set when in binary upgrade mode" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ OID маÑиву в pg_type не задано під Ñ‡Ð°Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ двійкового оновленнÑ" -#: commands/typecmds.c:2776 -#, c-format -msgid "column \"%s\" of table \"%s\" contains null values" -msgstr "Ñтовпець \"%s\" таблиці \"%s\" міÑтить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ NULL" - -#: commands/typecmds.c:2889 commands/typecmds.c:3091 +#: commands/typecmds.c:2868 commands/typecmds.c:3093 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ \"%s\" не Ñ–Ñнує" -#: commands/typecmds.c:2893 +#: commands/typecmds.c:2872 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ \"%s\" не Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/typecmds.c:3098 +#: commands/typecmds.c:3100 #, c-format msgid "constraint \"%s\" of domain \"%s\" is not a check constraint" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ \"%s\" не Ñ” перевірочним обмеженнÑм" -#: commands/typecmds.c:3204 +#: commands/typecmds.c:3180 +#, c-format +msgid "column \"%s\" of table \"%s\" contains null values" +msgstr "Ñтовпець \"%s\" таблиці \"%s\" міÑтить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ NULL" + +#: commands/typecmds.c:3269 #, c-format msgid "column \"%s\" of table \"%s\" contains values that violate the new constraint" msgstr "Ñтовпець \"%s\" таблиці \"%s\" міÑтить значеннÑ, Ñкі порушують нове обмеженнÑ" -#: commands/typecmds.c:3433 commands/typecmds.c:3633 commands/typecmds.c:3714 -#: commands/typecmds.c:3900 +#: commands/typecmds.c:3498 commands/typecmds.c:3772 commands/typecmds.c:3857 +#: commands/typecmds.c:4073 #, c-format msgid "%s is not a domain" msgstr "%s - не домен" -#: commands/typecmds.c:3465 +#: commands/typecmds.c:3532 commands/typecmds.c:3686 #, c-format msgid "constraint \"%s\" for domain \"%s\" already exists" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ \"%s\" вже Ñ–Ñнує" -#: commands/typecmds.c:3516 +#: commands/typecmds.c:3583 #, c-format msgid "cannot use table references in domain check constraint" msgstr "у перевірочному обмеженні Ð´Ð»Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ не можна поÑилатиÑÑŒ на таблиці" -#: commands/typecmds.c:3645 commands/typecmds.c:3726 commands/typecmds.c:4017 +#: commands/typecmds.c:3784 commands/typecmds.c:3869 commands/typecmds.c:4223 #, c-format msgid "%s is a table's row type" msgstr "%s - тип Ñ€Ñдків таблиці" -#: commands/typecmds.c:3647 commands/typecmds.c:3728 commands/typecmds.c:4019 -#, c-format -msgid "Use ALTER TABLE instead." -msgstr "ЗаміÑть цього викориÑтайте ALTER TABLE." - -#: commands/typecmds.c:3653 commands/typecmds.c:3734 commands/typecmds.c:3932 +#: commands/typecmds.c:3794 commands/typecmds.c:3879 commands/typecmds.c:4121 #, c-format msgid "cannot alter array type %s" msgstr "змінити тип маÑиву \"%s\" не можна" -#: commands/typecmds.c:3655 commands/typecmds.c:3736 commands/typecmds.c:3934 +#: commands/typecmds.c:3796 commands/typecmds.c:3881 commands/typecmds.c:4123 #, c-format msgid "You can alter type %s, which will alter the array type as well." msgstr "Ви можете змінити тип %s, Ñкий Ñпричинить зміну типу маÑиву." -#: commands/typecmds.c:4002 +#: commands/typecmds.c:3892 +#, c-format +msgid "cannot alter multirange type %s" +msgstr "не можна змінювати багатодіапазонний тип %s" + +#: commands/typecmds.c:3895 +#, c-format +msgid "You can alter type %s, which will alter the multirange type as well." +msgstr "Ви можете змінити тип %s, що також змінить тип мультидіапазону." + +#: commands/typecmds.c:4202 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "тип \"%s\" вже Ñ–Ñнує в Ñхемі \"%s\"" -#: commands/typecmds.c:4170 +#: commands/typecmds.c:4382 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "неможливо змінити Ñховище типу на PLAIN" -#: commands/typecmds.c:4263 +#: commands/typecmds.c:4475 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "атрибут типу \"%s\" неможливо змінити" -#: commands/typecmds.c:4281 +#: commands/typecmds.c:4493 #, c-format msgid "must be superuser to alter a type" msgstr "Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ типу потрібно бути ÑуперкориÑтувачем" -#: commands/typecmds.c:4302 commands/typecmds.c:4311 +#: commands/typecmds.c:4514 commands/typecmds.c:4523 #, c-format msgid "%s is not a base type" msgstr "%s - не Ñ” базовим типом" -#: commands/user.c:138 +#: commands/user.c:200 #, c-format msgid "SYSID can no longer be specified" msgstr "SYSID вже не потрібно вказувати" -#: commands/user.c:256 -#, c-format -msgid "must be superuser to create superusers" -msgstr "Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÑуперкориÑтувачів необхідно бути ÑуперкориÑтувачем" - -#: commands/user.c:263 +#: commands/user.c:318 commands/user.c:324 commands/user.c:330 +#: commands/user.c:336 commands/user.c:342 #, c-format -msgid "must be superuser to create replication users" -msgstr "Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів реплікацій потрібно бути ÑуперкориÑтувачем" +msgid "permission denied to create role" +msgstr "немає прав Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»Ñ–" -#: commands/user.c:270 +#: commands/user.c:319 #, c-format -msgid "must be superuser to create bypassrls users" -msgstr "Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ bypassrls кориÑтувачів потрібно бути ÑуперкориÑтувачем" +msgid "Only roles with the %s attribute may create roles." +msgstr "Створювати ролі можуть лише ролі з атрибутом %s." -#: commands/user.c:277 +#: commands/user.c:325 commands/user.c:331 commands/user.c:337 +#: commands/user.c:343 #, c-format -msgid "permission denied to create role" -msgstr "немає прав Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»Ñ–" +msgid "Only roles with the %s attribute may create roles with the %s attribute." +msgstr "Тільки ролі з атрибутом %s можуть Ñтворювати ролі з атрибутом %s." -#: commands/user.c:287 commands/user.c:1139 commands/user.c:1146 -#: utils/adt/acl.c:5331 utils/adt/acl.c:5337 gram.y:17457 gram.y:17503 +#: commands/user.c:354 commands/user.c:1386 commands/user.c:1393 +#: utils/adt/acl.c:5574 utils/adt/acl.c:5580 gram.y:17310 gram.y:17356 #, c-format msgid "role name \"%s\" is reserved" msgstr "ім'Ñ Ñ€Ð¾Ð»Ñ– \"%s\" зарезервовано" -#: commands/user.c:289 commands/user.c:1141 commands/user.c:1148 +#: commands/user.c:356 commands/user.c:1388 commands/user.c:1395 #, c-format msgid "Role names starting with \"pg_\" are reserved." msgstr "Імена ролей, Ñкі починаютьÑÑ Ð½Ð° \"pg_\", зарезервовані." -#: commands/user.c:310 commands/user.c:1163 +#: commands/user.c:377 commands/user.c:1410 #, c-format msgid "role \"%s\" already exists" msgstr "роль \"%s\" вже Ñ–Ñнує" -#: commands/user.c:376 commands/user.c:754 +#: commands/user.c:439 commands/user.c:924 #, c-format msgid "empty string is not a valid password, clearing password" msgstr "пуÑтий Ñ€Ñдок Ñ” неприпуÑтимим паролем, пароль ÑкидаєтьÑÑ" -#: commands/user.c:405 +#: commands/user.c:468 #, c-format msgid "pg_authid OID value not set when in binary upgrade mode" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ OID в pg_authid не вÑтановлено в режимі двійкового оновленнÑ" -#: commands/user.c:638 +#: commands/user.c:652 commands/user.c:1010 +msgid "Cannot alter reserved roles." +msgstr "Ðе можна змінити зарезервовані ролі." + +#: commands/user.c:759 commands/user.c:765 commands/user.c:781 +#: commands/user.c:789 commands/user.c:803 commands/user.c:809 +#: commands/user.c:815 commands/user.c:824 commands/user.c:869 +#: commands/user.c:1032 commands/user.c:1043 #, c-format -msgid "must be superuser to alter superuser roles or change superuser attribute" -msgstr "Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ ролей ÑуперкориÑтувача або зміни атрибуту ÑуперкориÑтувача потрібно бути ÑуперкориÑтувачем" +msgid "permission denied to alter role" +msgstr "немає прав на зміну ролі" -#: commands/user.c:645 +#: commands/user.c:760 commands/user.c:1033 #, c-format -msgid "must be superuser to alter replication roles or change replication attribute" -msgstr "Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ ролей реплікації або зміни атрибуту реплікації потрібно бути ÑуперкориÑтувачем" +msgid "Only roles with the %s attribute may alter roles with the %s attribute." +msgstr "Тільки ролі з атрибутом %s можуть змінювати ролі з атрибутом %s." -#: commands/user.c:652 +#: commands/user.c:766 commands/user.c:804 commands/user.c:810 +#: commands/user.c:816 #, c-format -msgid "must be superuser to change bypassrls attribute" -msgstr "Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ атрибута bypassrls потрібно бути ÑуперкориÑтувачем" +msgid "Only roles with the %s attribute may change the %s attribute." +msgstr "Змінити атрибут %s може тільки роль з атрибутом %s." -#: commands/user.c:661 commands/user.c:866 +#: commands/user.c:782 commands/user.c:1044 #, c-format -msgid "permission denied" -msgstr "немає доÑтупу" +msgid "Only roles with the %s attribute and the %s option on role \"%s\" may alter this role." +msgstr "Тільки ролі з атрибутом %s та опцією %s на роль \"%s\" можуть змінити цю роль." -#: commands/user.c:859 commands/user.c:1400 commands/user.c:1573 +#: commands/user.c:790 #, c-format -msgid "must be superuser to alter superusers" -msgstr "Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ ÑуперкориÑтувачів потрібно бути ÑуперкориÑтувачем" +msgid "To change another role's password, the current user must have the %s attribute and the %s option on the role." +msgstr "Щоб змінити пароль іншої ролі, поточний кориÑтувач повинен мати атрибут %s та параметр %s в ролі." -#: commands/user.c:896 +#: commands/user.c:825 #, c-format -msgid "must be superuser to alter settings globally" -msgstr "Ð´Ð»Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¾Ñ— зміни параметрів потрібно бути ÑуперкориÑтувачем" +msgid "Only roles with the %s option on role \"%s\" may add or drop members." +msgstr "Тільки ролі з опцією %s на роль \"%s\" можуть додавати чи видалÑти учаÑників." -#: commands/user.c:918 +#: commands/user.c:870 +#, c-format +msgid "The bootstrap superuser must have the %s attribute." +msgstr "СуперкориÑтувач завантажувача повинен мати атрибут %s." + +#: commands/user.c:1075 +#, c-format +msgid "permission denied to alter setting" +msgstr "немає прав на зміну налаштувань" + +#: commands/user.c:1076 +#, c-format +msgid "Only roles with the %s attribute may alter settings globally." +msgstr "Тільки ролі з атрибутом %s можуть змінювати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¾." + +#: commands/user.c:1100 commands/user.c:1171 commands/user.c:1177 #, c-format msgid "permission denied to drop role" msgstr "немає прав Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»Ñ–" -#: commands/user.c:943 +#: commands/user.c:1101 +#, c-format +msgid "Only roles with the %s attribute and the %s option on the target roles may drop roles." +msgstr "Тільки ролі з атрибутом %s та опцією %s на цільових ролÑÑ… можуть видалÑти ролі." + +#: commands/user.c:1125 #, c-format msgid "cannot use special role specifier in DROP ROLE" msgstr "викориÑтати Ñпеціальну роль у DROP ROLE не можна" -#: commands/user.c:953 commands/user.c:1110 commands/variable.c:778 -#: commands/variable.c:781 commands/variable.c:865 commands/variable.c:868 -#: utils/adt/acl.c:5186 utils/adt/acl.c:5234 utils/adt/acl.c:5262 -#: utils/adt/acl.c:5281 utils/init/miscinit.c:725 +#: commands/user.c:1135 commands/user.c:1357 commands/variable.c:851 +#: commands/variable.c:854 commands/variable.c:971 commands/variable.c:974 +#: utils/adt/acl.c:365 utils/adt/acl.c:385 utils/adt/acl.c:5429 +#: utils/adt/acl.c:5477 utils/adt/acl.c:5505 utils/adt/acl.c:5524 +#: utils/adt/regproc.c:1571 utils/init/miscinit.c:799 #, c-format msgid "role \"%s\" does not exist" msgstr "роль \"%s\" не Ñ–Ñнує" -#: commands/user.c:958 +#: commands/user.c:1140 #, c-format msgid "role \"%s\" does not exist, skipping" msgstr "роль \"%s\" не Ñ–Ñнує, пропуÑкаєтьÑÑ" -#: commands/user.c:971 commands/user.c:975 +#: commands/user.c:1153 commands/user.c:1157 #, c-format msgid "current user cannot be dropped" msgstr "кориÑтувач не можна видалити Ñам Ñебе" -#: commands/user.c:979 +#: commands/user.c:1161 #, c-format msgid "session user cannot be dropped" msgstr "кориÑтувача поточного ÑеанÑу не можна видалити" -#: commands/user.c:989 +#: commands/user.c:1172 #, c-format -msgid "must be superuser to drop superusers" -msgstr "Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÑуперкориÑтувачів потрібно бути ÑуперкориÑтувачем" +msgid "Only roles with the %s attribute may drop roles with the %s attribute." +msgstr "Тільки ролі з атрибутом %s можуть видалÑти ролі з атрибутом %s." -#: commands/user.c:1005 +#: commands/user.c:1178 +#, c-format +msgid "Only roles with the %s attribute and the %s option on role \"%s\" may drop this role." +msgstr "Тільки ролі з атрибутом %s та опцією %s на роль \"%s\" можуть видалити цю роль." + +#: commands/user.c:1299 #, c-format msgid "role \"%s\" cannot be dropped because some objects depend on it" msgstr "роль \"%s\" не можна видалити, тому що деÑкі об'єкти залежать від неї" -#: commands/user.c:1126 +#: commands/user.c:1373 #, c-format msgid "session user cannot be renamed" msgstr "кориÑтувача поточного ÑеанÑу не можна перейменувати" -#: commands/user.c:1130 +#: commands/user.c:1377 #, c-format msgid "current user cannot be renamed" msgstr "кориÑтувач не може перейменувати Ñам Ñебе" -#: commands/user.c:1173 -#, c-format -msgid "must be superuser to rename superusers" -msgstr "Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ ÑуперкориÑтувачів потрібно бути ÑуперкориÑтувачем" - -#: commands/user.c:1180 +#: commands/user.c:1421 commands/user.c:1431 #, c-format msgid "permission denied to rename role" msgstr "немає прав на Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð»Ñ–" -#: commands/user.c:1201 +#: commands/user.c:1422 +#, c-format +msgid "Only roles with the %s attribute may rename roles with the %s attribute." +msgstr "Тільки ролі з атрибутом %s можуть перейменовувати ролі з атрибутом %s." + +#: commands/user.c:1432 +#, c-format +msgid "Only roles with the %s attribute and the %s option on role \"%s\" may rename this role." +msgstr "Тільки ролі з атрибутом %s та опцією %s на роль \"%s\" можуть перейменувати цю роль." + +#: commands/user.c:1454 #, c-format msgid "MD5 password cleared because of role rename" msgstr "У результаті Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð»Ñ– Ñума MD5 паролю очищена" -#: commands/user.c:1261 +#: commands/user.c:1518 gram.y:1294 +#, c-format +msgid "unrecognized role option \"%s\"" +msgstr "нерозпізнаний параметр ролі \"%s\"" + +#: commands/user.c:1523 +#, c-format +msgid "unrecognized value for role option \"%s\": \"%s\"" +msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ ролі \"%s\": \"%s\"" + +#: commands/user.c:1556 #, c-format msgid "column names cannot be included in GRANT/REVOKE ROLE" msgstr "в GRANT/REVOKE ROLE не можна включати назви Ñтовпців" -#: commands/user.c:1299 +#: commands/user.c:1596 #, c-format msgid "permission denied to drop objects" msgstr "немає прав на Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ð±'єктів" -#: commands/user.c:1326 commands/user.c:1335 +#: commands/user.c:1597 #, c-format -msgid "permission denied to reassign objects" -msgstr "немає прав на повторне Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð±'єктів" +msgid "Only roles with privileges of role \"%s\" may drop objects owned by it." +msgstr "Тільки ролі з привілеÑми ролі \"%s\" можуть видалÑти об'єкти, що належать йому." -#: commands/user.c:1408 commands/user.c:1581 +#: commands/user.c:1625 commands/user.c:1636 #, c-format -msgid "must have admin option on role \"%s\"" -msgstr "потрібно мати параметр admin Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ– \"%s\"" +msgid "permission denied to reassign objects" +msgstr "немає прав на повторне Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð±'єктів" -#: commands/user.c:1422 +#: commands/user.c:1626 #, c-format -msgid "role \"%s\" cannot have explicit members" -msgstr "роль \"%s\" не може мати Ñвних членів" +msgid "Only roles with privileges of role \"%s\" may reassign objects owned by it." +msgstr "Тільки ролі з привілеÑми ролі \"%s\" можуть переназначати об'єкти, що належать йому." -#: commands/user.c:1432 +#: commands/user.c:1637 #, c-format -msgid "must be superuser to set grantor" -msgstr "Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð° ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ необхідно бути ÑуперкориÑтувачем" +msgid "Only roles with privileges of role \"%s\" may reassign objects to it." +msgstr "Тільки ролі з привілеÑми ролі \"%s\" можуть перепризначати об'єкти." -#: commands/user.c:1468 +#: commands/user.c:1733 #, c-format msgid "role \"%s\" cannot be a member of any role" msgstr "роль \"%s\" не може бути членом Ñкої-небудь ролі" -#: commands/user.c:1481 +#: commands/user.c:1746 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "роль \"%s\" - учаÑник ролі \"%s\"" -#: commands/user.c:1496 +#: commands/user.c:1786 commands/user.c:1812 +#, c-format +msgid "%s option cannot be granted back to your own grantor" +msgstr "параметр %s не можна призначити тому, хто призначив Ñ—Ñ… вам" + +#: commands/user.c:1889 +#, c-format +msgid "role \"%s\" has already been granted membership in role \"%s\" by role \"%s\"" +msgstr "роль \"%s\" вже отримала членÑтво в ролі \"%s\" від ролі \"%s\"" + +#: commands/user.c:2024 +#, c-format +msgid "role \"%s\" has not been granted membership in role \"%s\" by role \"%s\"" +msgstr "роль \"%s\" не отримала членÑтво в ролі \"%s\" від ролі \"%s\"" + +#: commands/user.c:2124 #, c-format -msgid "role \"%s\" is already a member of role \"%s\"" -msgstr "роль \"%s\" вже Ñ” учаÑником ролі \"%s\"" +msgid "role \"%s\" cannot have explicit members" +msgstr "роль \"%s\" не може мати Ñвних членів" + +#: commands/user.c:2135 commands/user.c:2158 +#, c-format +msgid "permission denied to grant role \"%s\"" +msgstr "немає дозволу Ð´Ð»Ñ Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ñ€Ð¾Ð»Ñ– \"%s\"" + +#: commands/user.c:2137 +#, c-format +msgid "Only roles with the %s attribute may grant roles with the %s attribute." +msgstr "Тільки ролі з атрибутом %s можуть надавати членÑтво ролі з атрибутом %s." + +#: commands/user.c:2142 commands/user.c:2165 +#, c-format +msgid "permission denied to revoke role \"%s\"" +msgstr "немає дозволу Ð´Ð»Ñ Ð²Ñ–Ð´ÐºÐ»Ð¸ÐºÐ°Ð½Ð½Ñ Ñ€Ð¾Ð»Ñ– \"%s\"" + +#: commands/user.c:2144 +#, c-format +msgid "Only roles with the %s attribute may revoke roles with the %s attribute." +msgstr "Тільки ролі з атрибутом %s можуть відкликати членÑтво ролі з атрибутом %s." + +#: commands/user.c:2160 +#, c-format +msgid "Only roles with the %s option on role \"%s\" may grant this role." +msgstr "Тільки ролі з опцією %s на роль \"%s\" можуть надавати членÑтво до цієї ролі." + +#: commands/user.c:2167 +#, c-format +msgid "Only roles with the %s option on role \"%s\" may revoke this role." +msgstr "Тільки ролі з опцією %s на роль \"%s\" можуть відкликати членÑтво в цій ролі." + +#: commands/user.c:2247 commands/user.c:2256 +#, c-format +msgid "permission denied to grant privileges as role \"%s\"" +msgstr "немає дозволу Ð´Ð»Ñ Ð½Ð°Ð´Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð²Ñ–Ð»ÐµÑ—Ð² ролі \"%s\"" + +#: commands/user.c:2249 +#, c-format +msgid "Only roles with privileges of role \"%s\" may grant privileges as this role." +msgstr "Тільки ролі з привілеÑми ролі \"%s\" можуть надавати привілеї цієї ролі." + +#: commands/user.c:2258 +#, c-format +msgid "The grantor must have the %s option on role \"%s\"." +msgstr "ВлаÑник прав повинен мати опцію %s Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ– \"%s\"." + +#: commands/user.c:2266 +#, c-format +msgid "permission denied to revoke privileges granted by role \"%s\"" +msgstr "відмовлено у дозволі на Ð²Ñ–Ð´ÐºÐ»Ð¸ÐºÐ°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð²Ñ–Ð»ÐµÑ—Ð², наданих роллю \"%s\"" + +#: commands/user.c:2268 +#, c-format +msgid "Only roles with privileges of role \"%s\" may revoke privileges granted by this role." +msgstr "Тільки ролі з привілеÑми ролі \"%s\" можуть відкликати привілеї, надані цією роллю." + +#: commands/user.c:2491 utils/adt/acl.c:1324 +#, c-format +msgid "dependent privileges exist" +msgstr "залежні права Ñ–Ñнують" + +#: commands/user.c:2492 utils/adt/acl.c:1325 +#, c-format +msgid "Use CASCADE to revoke them too." +msgstr "ВикориÑтайте CASCADE, щоб відкликати Ñ—Ñ…." -#: commands/user.c:1603 +#: commands/vacuum.c:134 #, c-format -msgid "role \"%s\" is not a member of role \"%s\"" -msgstr "роль \"%s\" не Ñ” учаÑником ролі \"%s\"" +msgid "\"vacuum_buffer_usage_limit\" must be 0 or between %d kB and %d kB" +msgstr "\"vacuum_buffer_usage_limit\" має бути 0 або між %d та %d kB" -#: commands/vacuum.c:139 +#: commands/vacuum.c:209 +#, c-format +msgid "BUFFER_USAGE_LIMIT option must be 0 or between %d kB and %d kB" +msgstr "Параметр BUFFER_USAGE_LIMIT повинен бути 0 або між %d та %d kB" + +#: commands/vacuum.c:219 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "нерозпізнаний параметр ANALYZE \"%s\"" -#: commands/vacuum.c:177 +#: commands/vacuum.c:259 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "паралельний параметр потребує Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ñ–Ð¶ 0 Ñ– %d" -#: commands/vacuum.c:189 +#: commands/vacuum.c:271 #, c-format msgid "parallel workers for vacuum must be between 0 and %d" msgstr "одночаÑні процеÑи Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ– бути між 0 Ñ– %d" -#: commands/vacuum.c:206 +#: commands/vacuum.c:292 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "нерозпізнаний параметр VACUUM \"%s\"" -#: commands/vacuum.c:229 +#: commands/vacuum.c:318 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULL не можна виконати паралельно" -#: commands/vacuum.c:245 +#: commands/vacuum.c:329 #, c-format -msgid "ANALYZE option must be specified when a column list is provided" -msgstr "Якщо задаєтьÑÑ ÑпиÑок Ñтовпців, необхідно вказати параметр ANALYZE" +msgid "BUFFER_USAGE_LIMIT cannot be specified for VACUUM FULL" +msgstr "BUFFER_USAGE_LIMIT не можна задати Ð´Ð»Ñ VACUUM FULL" -#: commands/vacuum.c:335 +#: commands/vacuum.c:343 #, c-format -msgid "%s cannot be executed from VACUUM or ANALYZE" -msgstr "%s не можна виконати під Ñ‡Ð°Ñ VACUUM або ANALYZE" +msgid "ANALYZE option must be specified when a column list is provided" +msgstr "Якщо задаєтьÑÑ ÑпиÑок Ñтовпців, необхідно вказати параметр ANALYZE" -#: commands/vacuum.c:345 +#: commands/vacuum.c:355 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "Параметр VACUUM DISABLE_PAGE_SKIPPING не можна викориÑтовувати з FULL" -#: commands/vacuum.c:352 +#: commands/vacuum.c:362 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" msgstr "PROCESS_TOAST потребуєтьÑÑ Ð· VACUUM FULL" -#: commands/vacuum.c:586 +#: commands/vacuum.c:371 #, c-format -msgid "skipping \"%s\" --- only superuser can vacuum it" -msgstr "\"%s\" пропуÑкаєтьÑÑ --- лише ÑуперкориÑтувач може очиÑтити" +msgid "ONLY_DATABASE_STATS cannot be specified with a list of tables" +msgstr "ONLY_DATABASE_STATS не можна вказувати зі ÑпиÑком таблиць" -#: commands/vacuum.c:590 +#: commands/vacuum.c:380 #, c-format -msgid "skipping \"%s\" --- only superuser or database owner can vacuum it" -msgstr "пропуÑкаєтьÑÑ \"%s\" --- лише ÑуперкориÑтувач або влаÑник БД може очиÑтити" +msgid "ONLY_DATABASE_STATS cannot be specified with other VACUUM options" +msgstr "ONLY_DATABASE_STATS не можна вказувати з іншими опціÑми VACUUUM" -#: commands/vacuum.c:594 +#: commands/vacuum.c:515 #, c-format -msgid "skipping \"%s\" --- only table or database owner can vacuum it" -msgstr "пропуÑкаєтьÑÑ \"%s\" --- лише влаÑник таблиці або бази даних може очиÑтити" - -#: commands/vacuum.c:609 -#, c-format -msgid "skipping \"%s\" --- only superuser can analyze it" -msgstr "пропуÑк об'єкта \"%s\" --- тільки ÑуперкориÑтувач може його аналізувати" +msgid "%s cannot be executed from VACUUM or ANALYZE" +msgstr "%s не можна виконати під Ñ‡Ð°Ñ VACUUM або ANALYZE" -#: commands/vacuum.c:613 +#: commands/vacuum.c:730 #, c-format -msgid "skipping \"%s\" --- only superuser or database owner can analyze it" -msgstr "пропуÑк об'єкта \"%s\" --- тільки ÑуперкориÑтувач або влаÑник бази даних може його аналізувати" +msgid "permission denied to vacuum \"%s\", skipping it" +msgstr "немає дозволу Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки\"%s\", пропуÑкаємо його" -#: commands/vacuum.c:617 +#: commands/vacuum.c:743 #, c-format -msgid "skipping \"%s\" --- only table or database owner can analyze it" -msgstr "пропуÑк об'єкта \"%s\" --- тільки влаÑник таблиці або бази даних може його аналізувати" +msgid "permission denied to analyze \"%s\", skipping it" +msgstr "відмовлено в дозволі на аналіз \"%s\", пропуÑк" -#: commands/vacuum.c:696 commands/vacuum.c:792 +#: commands/vacuum.c:821 commands/vacuum.c:918 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "очиÑтка \"%s\" пропуÑкаєтьÑÑ --- Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ´Ð¾Ñтупне" -#: commands/vacuum.c:701 +#: commands/vacuum.c:826 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "очиÑтка \"%s\" пропуÑкаєтьÑÑ --- це Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð±Ñ–Ð»ÑŒÑˆÐµ не Ñ–Ñнує" -#: commands/vacuum.c:717 commands/vacuum.c:797 +#: commands/vacuum.c:842 commands/vacuum.c:923 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "пропуÑк аналізу об'єкта \"%s\" --- Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ´Ð¾Ñтупне" -#: commands/vacuum.c:722 +#: commands/vacuum.c:847 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "пропуÑк аналізу об'єкта\"%s\" --- Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð±Ñ–Ð»ÑŒÑˆÐµ не Ñ–Ñнує" -#: commands/vacuum.c:1041 +#: commands/vacuum.c:1139 #, c-format -msgid "oldest xmin is far in the past" -msgstr "найÑтарший xmin далеко в минулому" +msgid "cutoff for removing and freezing tuples is far in the past" +msgstr "відÑÑ–ÐºÐ°Ð½Ð½Ñ Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ‚Ð° Ð·Ð°Ð¼Ð¾Ñ€Ð¾Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ñ‚ÐµÐ¶Ñ–Ð² залишилоÑÑ Ð´Ð°Ð»ÐµÐºÐ¾ в минулому" -#: commands/vacuum.c:1042 +#: commands/vacuum.c:1140 commands/vacuum.c:1145 #, c-format -msgid "" -"Close open transactions soon to avoid wraparound problems.\n" +msgid "Close open transactions soon to avoid wraparound problems.\n" "You might also need to commit or roll back old prepared transactions, or drop stale replication slots." -msgstr "" -"Завершіть відкриті транзакції Ñкнайшвидше, щоб уникнути проблеми зацикленнÑ.\n" +msgstr "Завершіть відкриті транзакції Ñкнайшвидше, щоб уникнути проблеми зацикленнÑ.\n" "Можливо, вам також доведетьÑÑ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¸Ñ‚Ð¸ або відкотити Ñтарі підготовленні транзакції, або видалити заÑтарілі Ñлоти реплікації." -#: commands/vacuum.c:1085 -#, c-format -msgid "oldest multixact is far in the past" -msgstr "найÑтарший multixact далеко в минулому" - -#: commands/vacuum.c:1086 +#: commands/vacuum.c:1144 #, c-format -msgid "Close open transactions with multixacts soon to avoid wraparound problems." -msgstr "Завершіть відкриті транзакції з multixacts Ñкнайшвидше, щоб уникнути проблеми зацикленнÑ." +msgid "cutoff for freezing multixacts is far in the past" +msgstr "відÑÑ–ÐºÐ°Ð½Ð½Ñ Ð´Ð»Ñ Ð·Ð°Ð¼Ð¾Ñ€Ð¾Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ð¹ залишилоÑÑ Ð´Ð°Ð»ÐµÐºÐ¾ в минулому" -#: commands/vacuum.c:1798 +#: commands/vacuum.c:1900 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "деÑкі бази даних не очищалиÑÑ Ð¿Ñ€Ð¾Ñ‚Ñгом більш ніж 2 мільÑрдів транзакцій" -#: commands/vacuum.c:1799 +#: commands/vacuum.c:1901 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "Можливо, ви вже втратили дані в результаті Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ð¹." -#: commands/vacuum.c:1963 +#: commands/vacuum.c:2080 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "пропуÑкаєтьÑÑ \"%s\" --- очищати не таблиці або Ñпеціальні ÑиÑтемні таблиці не можна" -#: commands/vacuum.c:2334 +#: commands/vacuum.c:2512 #, c-format -msgid "scanned index \"%s\" to remove %d row versions" -msgstr "проÑканований Ñ–Ð½Ð´ÐµÐºÑ \"%s\", видалено верÑій Ñ€Ñдків %d" +msgid "scanned index \"%s\" to remove %lld row versions" +msgstr "проÑканований Ñ–Ð½Ð´ÐµÐºÑ \"%s\", видалено верÑій Ñ€Ñдків %lld" -#: commands/vacuum.c:2353 +#: commands/vacuum.c:2531 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" наразі міÑтить %.0f верÑій Ñ€Ñдків у %u Ñторінках" -#: commands/vacuum.c:2357 +#: commands/vacuum.c:2535 #, c-format -msgid "" -"%.0f index row versions were removed.\n" +msgid "%.0f index row versions were removed.\n" "%u index pages were newly deleted.\n" "%u index pages are currently deleted, of which %u are currently reusable." -msgstr "" -"%.0f верÑій індекÑних Ñ€Ñдків було видалено.\n" +msgstr "%.0f верÑій індекÑних Ñ€Ñдків було видалено.\n" "%u індекÑних Ñторінок щойно видалено.\n" "%u індекÑних Ñторінок наразі видалено, з Ñких %u наразі можна викориÑтовувати повторно." -#: commands/vacuumparallel.c:663 +#: commands/vacuumparallel.c:707 #, c-format msgid "launched %d parallel vacuum worker for index vacuuming (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index vacuuming (planned: %d)" @@ -12462,171 +13249,196 @@ msgstr[1] "запущено %d паралельних виконавців оч msgstr[2] "запущено %d паралельних виконавців очиÑтки Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу (заплановано: %d)" msgstr[3] "запущено %d паралельних виконавців очиÑтки Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу (заплановано: %d)" -#: commands/vacuumparallel.c:669 +#: commands/vacuumparallel.c:713 #, c-format msgid "launched %d parallel vacuum worker for index cleanup (planned: %d)" msgid_plural "launched %d parallel vacuum workers for index cleanup (planned: %d)" -msgstr[0] "запущений %d паралельний вакуумний працівник Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу (заплановано: %d)" +msgstr[0] "запущений %d паралельний виконавець очиÑтки Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу (заплановано: %d)" msgstr[1] "запущено %d паралельних виконавців очиÑтки Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу (заплановано: %d)" -msgstr[2] "запущено %d паралельних робітників-пилоÑоÑів Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу (заплановано: %d)" +msgstr[2] "запущено %d паралельних виконавців очиÑтки Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу (заплановано: %d)" msgstr[3] "запущено %d паралельних виконавців очиÑтки Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу (заплановано: %d)" -#: commands/variable.c:165 utils/misc/guc.c:12109 utils/misc/guc.c:12187 -#, c-format -msgid "Unrecognized key word: \"%s\"." -msgstr "Ðерозпізнане ключове Ñлово: \"%s\"." - -#: commands/variable.c:177 +#: commands/variable.c:185 #, c-format msgid "Conflicting \"datestyle\" specifications." msgstr "Суперечливі Ñпецифікації Ñтилю дат." -#: commands/variable.c:299 +#: commands/variable.c:307 #, c-format msgid "Cannot specify months in time zone interval." msgstr "Ð’ інтервалі, що задає чаÑовий поÑÑ, не можна вказувати міÑÑці." -#: commands/variable.c:305 +#: commands/variable.c:313 #, c-format msgid "Cannot specify days in time zone interval." msgstr "Ð’ інтервалі, що задає чаÑовий поÑÑ, не можна вказувати дні." -#: commands/variable.c:343 commands/variable.c:425 +#: commands/variable.c:351 commands/variable.c:433 #, c-format msgid "time zone \"%s\" appears to use leap seconds" msgstr "чаÑовий поÑÑ \"%s\", мабуть, викориÑтовує виÑокоÑні Ñекунди" -#: commands/variable.c:345 commands/variable.c:427 +#: commands/variable.c:353 commands/variable.c:435 #, c-format msgid "PostgreSQL does not support leap seconds." msgstr "PostgreSQL не підтримує виÑокоÑні Ñекунди." -#: commands/variable.c:354 +#: commands/variable.c:362 #, c-format msgid "UTC timezone offset is out of range." msgstr "ЗÑув чаÑового поÑÑу UTC поза діапазоном." -#: commands/variable.c:494 +#: commands/variable.c:552 #, c-format msgid "cannot set transaction read-write mode inside a read-only transaction" msgstr "не можна вÑтановити режим транзакції \"читаннÑ-запиÑ\" вÑередині транзакції \"лише читаннÑ\"" -#: commands/variable.c:501 +#: commands/variable.c:559 #, c-format msgid "transaction read-write mode must be set before any query" msgstr "режим транзакції \"читаннÑ-запиÑ\" повинен бути вÑтановлений до Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð²" -#: commands/variable.c:508 +#: commands/variable.c:566 #, c-format msgid "cannot set transaction read-write mode during recovery" msgstr "не можна вÑтановити режим транзакції \"читаннÑ-запиÑ\" під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ" -#: commands/variable.c:534 +#: commands/variable.c:592 #, c-format msgid "SET TRANSACTION ISOLATION LEVEL must be called before any query" msgstr "Команда SET TRANSACTION ISOLATION LEVEL повинна викликатиÑÑ Ð´Ð¾ будь-Ñких запитів" -#: commands/variable.c:541 +#: commands/variable.c:599 #, c-format msgid "SET TRANSACTION ISOLATION LEVEL must not be called in a subtransaction" msgstr "Команда SET TRANSACTION ISOLATION LEVEL не повинна викликатиÑÑŒ в підтранзакції" -#: commands/variable.c:548 storage/lmgr/predicate.c:1694 +#: commands/variable.c:606 storage/lmgr/predicate.c:1685 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "викориÑтовувати Ñеріалізований режим в hot standby не можна" -#: commands/variable.c:549 +#: commands/variable.c:607 #, c-format msgid "You can use REPEATABLE READ instead." msgstr "Ви можете викориÑтати REPEATABLE READ заміÑть цього." -#: commands/variable.c:567 +#: commands/variable.c:625 #, c-format msgid "SET TRANSACTION [NOT] DEFERRABLE cannot be called within a subtransaction" msgstr "Команда SET TRANSACTION [NOT] DEFERRABLE не може викликатиÑÑŒ в підтранзакції" -#: commands/variable.c:573 +#: commands/variable.c:631 #, c-format msgid "SET TRANSACTION [NOT] DEFERRABLE must be called before any query" msgstr "Команда SET TRANSACTION [NOT] DEFERRABLE повинна викликатиÑÑŒ до будь-Ñких запитів" -#: commands/variable.c:655 +#: commands/variable.c:713 #, c-format msgid "Conversion between %s and %s is not supported." msgstr "ÐŸÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¼Ñ–Ð¶ %s Ñ– %s не підтримуєтьÑÑ." -#: commands/variable.c:662 +#: commands/variable.c:720 #, c-format msgid "Cannot change \"client_encoding\" now." msgstr "Змінити клієнтÑьке ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ñ€Ð°Ð· неможливо." -#: commands/variable.c:723 +#: commands/variable.c:781 #, c-format -msgid "cannot change client_encoding during a parallel operation" +msgid "cannot change \"client_encoding\" during a parallel operation" msgstr "змінити клієнтÑьке ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ñ— операції неможливо" -#: commands/variable.c:890 +#: commands/variable.c:876 +#, c-format +msgid "permission will be denied to set session authorization \"%s\"" +msgstr "буде відмовлено у вÑтановленні авторизації ÑеанÑу \"%s\"" + +#: commands/variable.c:881 +#, c-format +msgid "permission denied to set session authorization \"%s\"" +msgstr "відмовлено у вÑтановленні авторизації ÑеанÑу \"%s\"" + +#: commands/variable.c:991 #, c-format msgid "permission will be denied to set role \"%s\"" -msgstr "немає прав Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»Ñ– \"%s\"" +msgstr "немає дозволу Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»Ñ– \"%s\"" -#: commands/variable.c:895 +#: commands/variable.c:996 #, c-format msgid "permission denied to set role \"%s\"" msgstr "немає прав Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ€Ð¾Ð»Ñ– \"%s\"" -#: commands/view.c:84 +#: commands/variable.c:1200 +#, c-format +msgid "Bonjour is not supported by this build" +msgstr "Bonjour не підтримуєтьÑÑ Ð´Ð°Ð½Ð¾ÑŽ збіркою" + +#: commands/variable.c:1228 +#, c-format +msgid "\"effective_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()." +msgstr "\"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ effective_io_concurrency повинне дорівнювати 0 (нулю) на платформах, де відÑутній posix_fadvise()." + +#: commands/variable.c:1241 +#, c-format +msgid "\"maintenance_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()." +msgstr "\"maintenance_io_concurrency повинне бути вÑтановлене на 0, на платформах Ñкі не мають posix_fadvise()." + +#: commands/variable.c:1254 +#, c-format +msgid "SSL is not supported by this build" +msgstr "SSL не підтримуєтьÑÑ Ð´Ð°Ð½Ð¾ÑŽ збіркою" + +#: commands/view.c:79 #, c-format msgid "could not determine which collation to use for view column \"%s\"" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸, Ñке правило ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтати Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\"" -#: commands/view.c:279 commands/view.c:290 +#: commands/view.c:274 commands/view.c:285 #, c-format msgid "cannot drop columns from view" msgstr "видалити Ñтовпці з Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾" -#: commands/view.c:295 +#: commands/view.c:290 #, c-format msgid "cannot change name of view column \"%s\" to \"%s\"" msgstr "змінити ім'Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" на \"%s\" в поданні неможливо" -#: commands/view.c:298 +#: commands/view.c:293 #, c-format msgid "Use ALTER VIEW ... RENAME COLUMN ... to change name of view column instead." -msgstr "Щоб змінити назву ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ, заміÑть цього викориÑтайте ALTER VIEW ... RENAME COLUMN ..." +msgstr "Щоб змінити назву ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ, заміÑть цього викориÑтайте ALTER VIEW ... RENAME COLUMN." -#: commands/view.c:309 +#: commands/view.c:304 #, c-format msgid "cannot change data type of view column \"%s\" from %s to %s" msgstr "змінити тип ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" з %s на %s неможливо" -#: commands/view.c:323 +#: commands/view.c:318 #, c-format msgid "cannot change collation of view column \"%s\" from \"%s\" to \"%s\"" msgstr "змінити параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" з \"%s\" на \"%s\" не можна" -#: commands/view.c:468 +#: commands/view.c:387 #, c-format msgid "views must not contain SELECT INTO" msgstr "Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð½Ðµ повинні міÑтити SELECT INTO" -#: commands/view.c:480 +#: commands/view.c:399 #, c-format msgid "views must not contain data-modifying statements in WITH" msgstr "Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð½Ðµ повинні міÑтити інÑтрукції, Ñкі змінюють дані в WITH" -#: commands/view.c:550 +#: commands/view.c:469 #, c-format msgid "CREATE VIEW specifies more column names than columns" msgstr "У CREATE VIEW вказано більше імен Ñтовпців, ніж Ñамих Ñтовпців" -#: commands/view.c:558 +#: commands/view.c:477 #, c-format msgid "views cannot be unlogged because they do not have storage" msgstr "Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð½Ðµ можуть бути нежурнальованими, так Ñк вони не мають Ñховища" -#: commands/view.c:572 +#: commands/view.c:491 #, c-format msgid "view \"%s\" will be a temporary view" msgstr "Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" буде тичаÑовим поданнÑм" @@ -12662,58 +13474,58 @@ msgstr "курÑор \"%s\" не розташовуєтьÑÑ Ñƒ Ñ€Ñдку" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "курÑор \"%s\" - не проÑте оновлюване ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2485 +#: executor/execCurrent.c:280 executor/execExprInterp.c:2555 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "тип параметру %d (%s) не відповідає тому, з котрим тривала підготовка плану (%s)" -#: executor/execCurrent.c:292 executor/execExprInterp.c:2497 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2567 #, c-format msgid "no value found for parameter %d" msgstr "не знайдено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ %d" -#: executor/execExpr.c:632 executor/execExpr.c:639 executor/execExpr.c:645 -#: executor/execExprInterp.c:4169 executor/execExprInterp.c:4186 -#: executor/execExprInterp.c:4285 executor/nodeModifyTable.c:218 -#: executor/nodeModifyTable.c:229 executor/nodeModifyTable.c:246 -#: executor/nodeModifyTable.c:254 +#: executor/execExpr.c:642 executor/execExpr.c:649 executor/execExpr.c:655 +#: executor/execExprInterp.c:4852 executor/execExprInterp.c:4869 +#: executor/execExprInterp.c:4968 executor/nodeModifyTable.c:203 +#: executor/nodeModifyTable.c:214 executor/nodeModifyTable.c:231 +#: executor/nodeModifyTable.c:239 #, c-format msgid "table row type and query-specified row type do not match" msgstr "тип Ñ€Ñдка таблиці відрізнÑєтьÑÑ Ð²Ñ–Ð´ типу Ñ€Ñдка-результату запиту" -#: executor/execExpr.c:633 executor/nodeModifyTable.c:219 +#: executor/execExpr.c:643 executor/nodeModifyTable.c:204 #, c-format msgid "Query has too many columns." msgstr "Запит повертає дуже багато Ñтовпців." -#: executor/execExpr.c:640 executor/nodeModifyTable.c:247 +#: executor/execExpr.c:650 executor/nodeModifyTable.c:232 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "Запит надає Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð¾Ð³Ð¾ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð· порÑдковим номером %d." -#: executor/execExpr.c:646 executor/execExprInterp.c:4187 -#: executor/nodeModifyTable.c:230 +#: executor/execExpr.c:656 executor/execExprInterp.c:4870 +#: executor/nodeModifyTable.c:215 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¼Ð°Ñ” тип %s у порÑдковому розташуванні %d, але запит очікує %s." -#: executor/execExpr.c:1110 parser/parse_agg.c:827 +#: executor/execExpr.c:1104 parser/parse_agg.c:838 #, c-format msgid "window function calls cannot be nested" msgstr "виклики віконних функцій не можуть бути вкладеними" -#: executor/execExpr.c:1614 +#: executor/execExpr.c:1649 #, c-format msgid "target type is not an array" msgstr "цільовий тип не Ñ” маÑивом" -#: executor/execExpr.c:1954 +#: executor/execExpr.c:1989 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "Стовпець ROW() має тип %s заміÑть %s" -#: executor/execExpr.c:2736 executor/execSRF.c:718 parser/parse_func.c:138 -#: parser/parse_func.c:655 parser/parse_func.c:1031 +#: executor/execExpr.c:2653 executor/execSRF.c:718 parser/parse_func.c:138 +#: parser/parse_func.c:655 parser/parse_func.c:1033 #, c-format msgid "cannot pass more than %d argument to a function" msgid_plural "cannot pass more than %d arguments to a function" @@ -12722,91 +13534,121 @@ msgstr[1] "функції не можна передати більше ніж % msgstr[2] "функції не можна передати більше ніж %d аргументів" msgstr[3] "функції не можна передати більше ніж %d аргументів" -#: executor/execExpr.c:2763 executor/execSRF.c:738 executor/functions.c:1073 -#: utils/adt/jsonfuncs.c:3736 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 +#: executor/execExpr.c:2680 executor/execSRF.c:738 executor/functions.c:1068 +#: utils/adt/jsonfuncs.c:4054 utils/fmgr/funcapi.c:89 utils/fmgr/funcapi.c:143 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"set-valued\" викликана в контекÑті, де йому немає міÑцÑ" -#: executor/execExpr.c:3122 parser/parse_node.c:276 parser/parse_node.c:326 +#: executor/execExpr.c:3086 parser/parse_node.c:272 parser/parse_node.c:322 #, c-format msgid "cannot subscript type %s because it does not support subscripting" msgstr "не можна підпиÑати вказати тип %s, тому що він не підтримує підпиÑку" -#: executor/execExpr.c:3250 executor/execExpr.c:3272 +#: executor/execExpr.c:3214 executor/execExpr.c:3236 #, c-format msgid "type %s does not support subscripted assignment" msgstr "тип %s не підтримує вказані приÑÐ²Ð¾Ñ”Ð½Ð½Ñ Ð·Ð° підпиÑкою" -#: executor/execExprInterp.c:1950 +#: executor/execExprInterp.c:2019 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "атрибут %d типу %s був видалений" -#: executor/execExprInterp.c:1956 +#: executor/execExprInterp.c:2025 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "атрибут %d типу %s має неправильний тип" -#: executor/execExprInterp.c:1958 executor/execExprInterp.c:3086 -#: executor/execExprInterp.c:3132 +#: executor/execExprInterp.c:2027 executor/execExprInterp.c:3226 +#: executor/execExprInterp.c:3272 #, c-format msgid "Table has type %s, but query expects %s." msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¼Ð°Ñ” тип %s, але запит очікував %s." -#: executor/execExprInterp.c:2037 utils/adt/expandedrecord.c:99 -#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1749 -#: utils/cache/typcache.c:1908 utils/cache/typcache.c:2055 -#: utils/fmgr/funcapi.c:527 +#: executor/execExprInterp.c:2107 utils/adt/expandedrecord.c:99 +#: utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1752 +#: utils/cache/typcache.c:1911 utils/cache/typcache.c:2058 +#: utils/fmgr/funcapi.c:569 #, c-format msgid "type %s is not composite" msgstr "тип %s не Ñ” Ñкладеним" -#: executor/execExprInterp.c:2575 +#: executor/execExprInterp.c:2710 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ такого типу не підтримуєтьÑÑ" -#: executor/execExprInterp.c:2788 +#: executor/execExprInterp.c:2923 #, c-format msgid "cannot merge incompatible arrays" msgstr "не можна об'єднати неÑуміÑні маÑиви" -#: executor/execExprInterp.c:2789 +#: executor/execExprInterp.c:2924 #, c-format msgid "Array with element type %s cannot be included in ARRAY construct with element type %s." msgstr "МаÑив з типом елементів %s не може бути включений в конÑтрукцію ARRAY з типом елементів %s." -#: executor/execExprInterp.c:2810 utils/adt/arrayfuncs.c:263 -#: utils/adt/arrayfuncs.c:563 utils/adt/arrayfuncs.c:1305 -#: utils/adt/arrayfuncs.c:3375 utils/adt/arrayfuncs.c:5372 -#: utils/adt/arrayfuncs.c:5889 utils/adt/arraysubs.c:150 +#: executor/execExprInterp.c:2945 utils/adt/arrayfuncs.c:1305 +#: utils/adt/arrayfuncs.c:3503 utils/adt/arrayfuncs.c:5593 +#: utils/adt/arrayfuncs.c:6112 utils/adt/arraysubs.c:150 #: utils/adt/arraysubs.c:488 #, c-format msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" msgstr "чиÑло вимірів маÑива (%d) перевищує ліміт (%d)" -#: executor/execExprInterp.c:2830 executor/execExprInterp.c:2860 +#: executor/execExprInterp.c:2965 executor/execExprInterp.c:3000 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "Ð´Ð»Ñ Ð±Ð°Ð³Ð°Ñ‚Ð¾Ð²Ð¸Ð¼Ñ–Ñ€Ð½Ð¸Ñ… маÑивів повинні задаватиÑÑŒ вирази з відповідними вимірами" -#: executor/execExprInterp.c:3085 executor/execExprInterp.c:3131 +#: executor/execExprInterp.c:2977 utils/adt/array_expanded.c:274 +#: utils/adt/arrayfuncs.c:335 utils/adt/arrayfuncs.c:494 +#: utils/adt/arrayfuncs.c:727 utils/adt/arrayfuncs.c:1533 +#: utils/adt/arrayfuncs.c:2341 utils/adt/arrayfuncs.c:2356 +#: utils/adt/arrayfuncs.c:2618 utils/adt/arrayfuncs.c:2634 +#: utils/adt/arrayfuncs.c:2895 utils/adt/arrayfuncs.c:2949 +#: utils/adt/arrayfuncs.c:2964 utils/adt/arrayfuncs.c:3305 +#: utils/adt/arrayfuncs.c:3533 utils/adt/arrayfuncs.c:5365 +#: utils/adt/arrayfuncs.c:6204 utils/adt/arrayfuncs.c:6548 +#: utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 +#: utils/adt/arrayutils.c:99 +#, c-format +msgid "array size exceeds the maximum allowed (%d)" +msgstr "розмір маÑиву перевищує макÑимальний допуÑтимий розмір (%d)" + +#: executor/execExprInterp.c:3225 executor/execExprInterp.c:3271 #, c-format msgid "attribute %d has wrong type" msgstr "атрибут %d має неправильний тип" -#: executor/execExprInterp.c:3713 utils/adt/domains.c:149 +#: executor/execExprInterp.c:3857 utils/adt/domains.c:158 #, c-format msgid "domain %s does not allow null values" msgstr "домен %s не допуÑкає Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ null" -#: executor/execExprInterp.c:3728 utils/adt/domains.c:184 +#: executor/execExprInterp.c:3872 utils/adt/domains.c:196 #, c-format msgid "value for domain %s violates check constraint \"%s\"" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ %s порушує перевірочнео Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\"" -#: executor/execExprInterp.c:4170 +#: executor/execExprInterp.c:4447 +#, c-format +msgid "no SQL/JSON item found for specified path of column \"%s\"" +msgstr "не знайдено елемента SQL/JSON Ð´Ð»Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾Ð³Ð¾ шлÑху ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" + +#: executor/execExprInterp.c:4452 +#, c-format +msgid "no SQL/JSON item found for specified path" +msgstr "не знайдено елемента SQL/JSON Ð´Ð»Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾Ð³Ð¾ шлÑху" + +#. translator: first %s is a SQL/JSON clause (e.g. ON ERROR) +#: executor/execExprInterp.c:4652 executor/execExprInterp.c:4660 +#, c-format +msgid "could not coerce %s expression (%s) to the RETURNING type" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¸Ð²ÐµÑти %s вираз (%s) до типу RETURNING" + +#: executor/execExprInterp.c:4853 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." @@ -12815,304 +13657,258 @@ msgstr[1] "РÑдок таблиці міÑтить %d атрибути, але msgstr[2] "РÑдок таблиці міÑтить %d атрибутів, але запит очікував %d." msgstr[3] "РÑдок таблиці міÑтить %d атрибутів, але запит очікував %d." -#: executor/execExprInterp.c:4286 executor/execSRF.c:977 +#: executor/execExprInterp.c:4969 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "ÐевідповідніÑть параметрів фізичного Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð¾Ð³Ð¾ атрибуту %d." -#: executor/execExprInterp.c:4984 -#, c-format -msgid "SQL/JSON item cannot be cast to target type" -msgstr "привеÑти елемент SQL/JSON до цільового типу не можна" - -#: executor/execExprInterp.c:5038 -#, c-format -msgid "no SQL/JSON item" -msgstr "немає елемента SQL/JSON" - -#: executor/execIndexing.c:571 +#: executor/execIndexing.c:593 #, c-format msgid "ON CONFLICT does not support deferrable unique constraints/exclusion constraints as arbiters" msgstr "ON CONFLICT не підтримує відкладені Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑƒÐ½Ñ–ÐºÐ°Ð»ÑŒÐ½Ð¾Ñті/обмеженнÑ-Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð² ÑкоÑті визначального індекÑу" -#: executor/execIndexing.c:848 +#: executor/execIndexing.c:870 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "не вдалоÑÑ Ñтворити обмеженнÑ-Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ \"%s\"" -#: executor/execIndexing.c:851 +#: executor/execIndexing.c:873 #, c-format msgid "Key %s conflicts with key %s." msgstr "Ключ %s конфліктує з ключем %s." -#: executor/execIndexing.c:853 +#: executor/execIndexing.c:875 #, c-format msgid "Key conflicts exist." msgstr "ІÑнують конфлікти ключей." -#: executor/execIndexing.c:859 +#: executor/execIndexing.c:881 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "конфліктуюче Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° порушує обмеженнÑ-Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ \"%s\"" -#: executor/execIndexing.c:862 +#: executor/execIndexing.c:884 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "Ключ %s конфліктує з Ñ–Ñнуючим ключем %s." -#: executor/execIndexing.c:864 +#: executor/execIndexing.c:886 #, c-format msgid "Key conflicts with existing key." msgstr "Ключ конфліктує з Ñ–Ñнуючим ключем." -#: executor/execMain.c:1009 +#: executor/execMain.c:1039 #, c-format msgid "cannot change sequence \"%s\"" msgstr "поÑлідовніÑть \"%s\" не можна змінити" -#: executor/execMain.c:1015 +#: executor/execMain.c:1045 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "TOAST-Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не можна змінити" -#: executor/execMain.c:1033 rewrite/rewriteHandler.c:3068 -#: rewrite/rewriteHandler.c:3904 -#, c-format -msgid "cannot insert into view \"%s\"" -msgstr "вÑтавити дані в Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не можна" - -#: executor/execMain.c:1035 rewrite/rewriteHandler.c:3071 -#: rewrite/rewriteHandler.c:3907 -#, c-format -msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." -msgstr "Щоб Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð¾Ð¿ÑƒÑкало Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…, вÑтановіть тригер INSTEAD OF INSERT або безумовне правило ON INSERT DO INSTEAD." - -#: executor/execMain.c:1041 rewrite/rewriteHandler.c:3076 -#: rewrite/rewriteHandler.c:3912 -#, c-format -msgid "cannot update view \"%s\"" -msgstr "оновити Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не можна" - -#: executor/execMain.c:1043 rewrite/rewriteHandler.c:3079 -#: rewrite/rewriteHandler.c:3915 -#, c-format -msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." -msgstr "Щоб Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð¾Ð¿ÑƒÑкало оновленнÑ, вÑтановіть тригер INSTEAD OF UPDATE або безумовне правило ON UPDATE DO INSTEAD." - -#: executor/execMain.c:1049 rewrite/rewriteHandler.c:3084 -#: rewrite/rewriteHandler.c:3920 -#, c-format -msgid "cannot delete from view \"%s\"" -msgstr "видалити дані з Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не можна" - -#: executor/execMain.c:1051 rewrite/rewriteHandler.c:3087 -#: rewrite/rewriteHandler.c:3923 -#, c-format -msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." -msgstr "Щоб Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð¾Ð¿ÑƒÑкало Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…, вÑтановіть тригер INSTEAD OF DELETE або безумновне правило ON DELETE DO INSTEAD." - -#: executor/execMain.c:1062 +#: executor/execMain.c:1064 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "змінити матеріалізоване Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не можна" -#: executor/execMain.c:1074 +#: executor/execMain.c:1076 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "вÑтавлÑти дані в зовнішню таблицю \"%s\" не можна" -#: executor/execMain.c:1080 +#: executor/execMain.c:1082 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" не допуÑкає Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…" -#: executor/execMain.c:1087 +#: executor/execMain.c:1089 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "оновити зовнішню таблицю \"%s\" не можна" -#: executor/execMain.c:1093 +#: executor/execMain.c:1095 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" не дозволÑÑ” оновленнÑ" -#: executor/execMain.c:1100 +#: executor/execMain.c:1102 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "видалÑти дані з зовнішньої таблиці \"%s\" не можна" -#: executor/execMain.c:1106 +#: executor/execMain.c:1108 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" не дозволÑÑ” Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…" -#: executor/execMain.c:1117 +#: executor/execMain.c:1119 #, c-format msgid "cannot change relation \"%s\"" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не можна змінити" -#: executor/execMain.c:1144 +#: executor/execMain.c:1146 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "блокувати Ñ€Ñдки в поÑлідовноÑті \"%s\" не можна" -#: executor/execMain.c:1151 +#: executor/execMain.c:1153 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "блокувати Ñ€Ñдки в TOAST-відношенні \"%s\" не можна" -#: executor/execMain.c:1158 +#: executor/execMain.c:1160 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "блокувати Ñ€Ñдки в поданні \"%s\" не можна" -#: executor/execMain.c:1166 +#: executor/execMain.c:1168 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "блокувати Ñ€Ñдки в матеріалізованому поданні \"%s\" не можна" -#: executor/execMain.c:1175 executor/execMain.c:2653 -#: executor/nodeLockRows.c:136 +#: executor/execMain.c:1177 executor/execMain.c:2689 +#: executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" msgstr "блокувати Ñ€Ñдки в зовнішній таблиці \"%s\" не можна" -#: executor/execMain.c:1181 +#: executor/execMain.c:1183 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "блокувати Ñ€Ñдки у відношенні \"%s\" не можна" -#: executor/execMain.c:1888 +#: executor/execMain.c:1901 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "новий Ñ€Ñдок Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" порушує Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñекції" -#: executor/execMain.c:1890 executor/execMain.c:1973 executor/execMain.c:2023 -#: executor/execMain.c:2132 +#: executor/execMain.c:1903 executor/execMain.c:1987 executor/execMain.c:2038 +#: executor/execMain.c:2148 #, c-format msgid "Failing row contains %s." msgstr "Помилковий Ñ€Ñдок міÑтить %s." -#: executor/execMain.c:1970 +#: executor/execMain.c:1984 #, c-format msgid "null value in column \"%s\" of relation \"%s\" violates not-null constraint" msgstr "null Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² Ñтовпці \"%s\" Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" порушує not-null обмеженнÑ" -#: executor/execMain.c:2021 +#: executor/execMain.c:2036 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "новий Ñ€Ñдок Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" порушує перевірне Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÑƒ \"%s\"" -#: executor/execMain.c:2130 +#: executor/execMain.c:2146 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "новий Ñ€Ñдок порушує параметр перевірки Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\"" -#: executor/execMain.c:2140 +#: executor/execMain.c:2156 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "новий Ñ€Ñдок порушує політику захиÑту на рівні Ñ€Ñдків \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: executor/execMain.c:2145 +#: executor/execMain.c:2161 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "новий Ñ€Ñдок порушує політику захиÑту на рівні Ñ€Ñдків Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: executor/execMain.c:2153 +#: executor/execMain.c:2169 #, c-format msgid "target row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "цільовий Ñ€Ñдок порушує політику захиÑту на рівні Ñ€Ñдків \"%s\" (вираз USING) Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: executor/execMain.c:2158 +#: executor/execMain.c:2174 #, c-format msgid "target row violates row-level security policy (USING expression) for table \"%s\"" msgstr "цільовий Ñ€Ñдок порушує політику захиÑту на рівні Ñ€Ñдків (вираз USING) Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: executor/execMain.c:2165 +#: executor/execMain.c:2181 #, c-format msgid "new row violates row-level security policy \"%s\" (USING expression) for table \"%s\"" msgstr "новий Ñ€Ñдок порушує політику захиÑту на рівні Ñ€Ñдків \"%s\" (вираз USING) Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: executor/execMain.c:2170 +#: executor/execMain.c:2186 #, c-format msgid "new row violates row-level security policy (USING expression) for table \"%s\"" msgstr "новий Ñ€Ñдок порушує політику захиÑту на рівні Ñ€Ñдків (вираз USING) Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: executor/execPartition.c:330 +#: executor/execPartition.c:327 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "Ð´Ð»Ñ Ñ€Ñдка не знайдено Ñекції у відношенні \"%s\"" -#: executor/execPartition.c:333 +#: executor/execPartition.c:330 #, c-format msgid "Partition key of the failing row contains %s." msgstr "Ключ ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð½ÐµÐ²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ð³Ð¾ Ñ€Ñдка міÑтить %s." -#: executor/execReplication.c:196 executor/execReplication.c:373 +#: executor/execReplication.c:272 executor/execReplication.c:456 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update, retrying" msgstr "кортеж, що підлÑгає блокуванню, вже переміщено в іншу Ñекцію в результаті паралельного оновленнÑ, триває повторна Ñпроба" -#: executor/execReplication.c:200 executor/execReplication.c:377 +#: executor/execReplication.c:276 executor/execReplication.c:460 #, c-format msgid "concurrent update, retrying" msgstr "паралельне оновленнÑ, триває повторна Ñпроба" -#: executor/execReplication.c:206 executor/execReplication.c:383 +#: executor/execReplication.c:282 executor/execReplication.c:466 #, c-format msgid "concurrent delete, retrying" msgstr "паралельне видаленнÑ, триває повторна Ñпроба" -#: executor/execReplication.c:269 parser/parse_cte.c:509 -#: parser/parse_oper.c:233 utils/adt/array_userfuncs.c:720 -#: utils/adt/array_userfuncs.c:859 utils/adt/arrayfuncs.c:3655 -#: utils/adt/arrayfuncs.c:4210 utils/adt/arrayfuncs.c:6202 -#: utils/adt/rowtypes.c:1203 +#: executor/execReplication.c:352 parser/parse_cte.c:302 +#: parser/parse_oper.c:221 utils/adt/array_userfuncs.c:1334 +#: utils/adt/array_userfuncs.c:1477 utils/adt/arrayfuncs.c:3852 +#: utils/adt/arrayfuncs.c:4407 utils/adt/arrayfuncs.c:6428 +#: utils/adt/rowtypes.c:1220 #, c-format msgid "could not identify an equality operator for type %s" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ оператора рівноÑті Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" -#: executor/execReplication.c:592 executor/execReplication.c:598 +#: executor/execReplication.c:687 executor/execReplication.c:693 #, c-format msgid "cannot update table \"%s\"" msgstr "оновити таблицю \"%s\" не можна" -#: executor/execReplication.c:594 executor/execReplication.c:606 +#: executor/execReplication.c:689 executor/execReplication.c:701 #, c-format msgid "Column used in the publication WHERE expression is not part of the replica identity." msgstr "Стовпець, що викориÑтовуєтьÑÑ Ð² виразі WHERE публікації не Ñ” чаÑтиною ідентифікації репліки." -#: executor/execReplication.c:600 executor/execReplication.c:612 +#: executor/execReplication.c:695 executor/execReplication.c:707 #, c-format msgid "Column list used by the publication does not cover the replica identity." msgstr "СпиÑок Ñтовпців, Ñкий викориÑтовуєтьÑÑ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ”ÑŽ, не охоплює ідентифікацію репліки." -#: executor/execReplication.c:604 executor/execReplication.c:610 +#: executor/execReplication.c:699 executor/execReplication.c:705 #, c-format msgid "cannot delete from table \"%s\"" msgstr "видалити дані з таблиці \"%s\" не можна" -#: executor/execReplication.c:630 +#: executor/execReplication.c:725 #, c-format msgid "cannot update table \"%s\" because it does not have a replica identity and publishes updates" msgstr "Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð² таблиці \"%s\" неможливе, тому що в ній відÑутній ідентифікатор репліки, Ñ– вона публікує оновленнÑ" -#: executor/execReplication.c:632 +#: executor/execReplication.c:727 #, c-format msgid "To enable updating the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Щоб Ñ†Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ð»Ð° оновленнÑ, вÑтановіть REPLICA IDENTITY, викориÑтавши ALTER TABLE." -#: executor/execReplication.c:636 +#: executor/execReplication.c:731 #, c-format msgid "cannot delete from table \"%s\" because it does not have a replica identity and publishes deletes" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð· таблиці \"%s\" неможливе, тому що в ній відÑутній ідентифікатор репліки, Ñ– вона публікує видаленнÑ" -#: executor/execReplication.c:638 +#: executor/execReplication.c:733 #, c-format msgid "To enable deleting from the table, set REPLICA IDENTITY using ALTER TABLE." msgstr "Щоб Ñ†Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ð»Ð° видаленнÑ, вÑтановіть REPLICA IDENTITY, викориÑтавши ALTER TABLE." -#: executor/execReplication.c:654 +#: executor/execReplication.c:749 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "викориÑтовувати Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" Ñк ціль логічної реплікації, не можна" @@ -13161,18 +13957,28 @@ msgstr[3] "Повернений Ñ€Ñдок міÑтить %d атрибутів, msgid "Returned type %s at ordinal position %d, but query expects %s." msgstr "Повернений тип %s у порÑдковій позиції %d, але запит очікував %s." -#: executor/execTuples.c:146 executor/execTuples.c:353 -#: executor/execTuples.c:521 executor/execTuples.c:712 +#: executor/execTuples.c:147 executor/execTuples.c:368 +#: executor/execTuples.c:563 executor/execTuples.c:772 #, c-format msgid "cannot retrieve a system column in this context" msgstr "не можна отримати ÑиÑтемний Ñтовпець в цьому контекÑті" -#: executor/execUtils.c:736 +#: executor/execTuples.c:163 executor/execTuples.c:580 +#, c-format +msgid "don't have transaction information for this type of tuple" +msgstr "немає інформації про транзакцію Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу кортежу" + +#: executor/execTuples.c:390 executor/execTuples.c:794 +#, c-format +msgid "don't have a storage tuple in this context" +msgstr "в цьому контекÑті немає Ñховища кортежів" + +#: executor/execUtils.c:713 #, c-format msgid "materialized view \"%s\" has not been populated" msgstr "матеріалізоване Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не було наповнене" -#: executor/execUtils.c:738 +#: executor/execUtils.c:715 #, c-format msgid "Use the REFRESH MATERIALIZED VIEW command." msgstr "ВикориÑтайте команду REFRESH MATERIALIZED VIEW." @@ -13182,340 +13988,331 @@ msgstr "ВикориÑтайте команду REFRESH MATERIALIZED VIEW." msgid "could not determine actual type of argument declared %s" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ фактичний тип аргументу, оголошеного Ñк %s" -#: executor/functions.c:514 +#: executor/functions.c:513 #, c-format msgid "cannot COPY to/from client in an SQL function" msgstr "у функції SQL не можна виконати COPY до/з клієнта" #. translator: %s is a SQL statement name -#: executor/functions.c:520 +#: executor/functions.c:519 #, c-format msgid "%s is not allowed in an SQL function" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ SQL не дозволÑÑ” викориÑÑ‚Ð°Ð½Ð½Ñ %s" #. translator: %s is a SQL statement name -#: executor/functions.c:528 executor/spi.c:1742 executor/spi.c:2631 +#: executor/functions.c:527 executor/spi.c:1744 executor/spi.c:2657 #, c-format msgid "%s is not allowed in a non-volatile function" msgstr "незмінна Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð½Ðµ дозволÑÑ” викориÑÑ‚Ð°Ð½Ð½Ñ %s" -#: executor/functions.c:1457 +#: executor/functions.c:1452 #, c-format msgid "SQL function \"%s\" statement %d" msgstr "SQL Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" оператор %d" -#: executor/functions.c:1483 +#: executor/functions.c:1478 #, c-format msgid "SQL function \"%s\" during startup" msgstr "SQL Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку" -#: executor/functions.c:1568 +#: executor/functions.c:1563 #, c-format msgid "calling procedures with output arguments is not supported in SQL functions" msgstr "виклик процедур з вихідними аргументами в функціÑÑ… SQL не підтримуєтьÑÑ" -#: executor/functions.c:1701 executor/functions.c:1739 -#: executor/functions.c:1753 executor/functions.c:1843 -#: executor/functions.c:1876 executor/functions.c:1890 +#: executor/functions.c:1698 executor/functions.c:1736 +#: executor/functions.c:1750 executor/functions.c:1845 +#: executor/functions.c:1878 executor/functions.c:1892 #, c-format msgid "return type mismatch in function declared to return %s" msgstr "невідповідніÑть типу Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð² функції, оголошеній Ñк %s" -#: executor/functions.c:1703 +#: executor/functions.c:1700 #, c-format -msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE RETURNING." -msgstr "ОÑтаннім оператором у функції повинен бути SELECT або INSERT/UPDATE/DELETE RETURNING." +msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE RETURNING." +msgstr "ОÑтаннім оператором у функції повинен бути SELECT або INSERT/UPDATE/DELETE/MERGE RETURNING." -#: executor/functions.c:1741 +#: executor/functions.c:1738 #, c-format msgid "Final statement must return exactly one column." msgstr "ОÑтанній оператор повинен вертати один Ñтовпець." -#: executor/functions.c:1755 +#: executor/functions.c:1752 #, c-format msgid "Actual return type is %s." msgstr "Фактичний тип поверненнÑ: %s." -#: executor/functions.c:1845 +#: executor/functions.c:1847 #, c-format msgid "Final statement returns too many columns." msgstr "ОÑтанній оператор вертає дуже багато Ñтовпців." -#: executor/functions.c:1878 +#: executor/functions.c:1880 #, c-format msgid "Final statement returns %s instead of %s at column %d." msgstr "ОÑтанній оператор поветрає %s заміÑть %s Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ %d." -#: executor/functions.c:1892 +#: executor/functions.c:1894 #, c-format msgid "Final statement returns too few columns." msgstr "ОÑтанній оператор вертає дуже мало Ñтовпців." -#: executor/functions.c:1920 +#: executor/functions.c:1922 #, c-format msgid "return type %s is not supported for SQL functions" msgstr "Ð´Ð»Ñ SQL функцій тип Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ %s не підтримуєтьÑÑ" -#: executor/nodeAgg.c:3006 executor/nodeAgg.c:3015 executor/nodeAgg.c:3027 -#, c-format -msgid "unexpected EOF for tape %p: requested %zu bytes, read %zu bytes" -msgstr "неочікуваний обрив Ð´Ð»Ñ Ñтрічки %p: запитано %zu байт, прочитано %zu байт" - -#: executor/nodeAgg.c:3917 executor/nodeWindowAgg.c:2962 +#: executor/nodeAgg.c:3936 executor/nodeWindowAgg.c:2975 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "агрегатна Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %u повинна мати ÑуміÑні тип Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ– тип переходу" -#: executor/nodeAgg.c:3947 parser/parse_agg.c:668 parser/parse_agg.c:696 +#: executor/nodeAgg.c:3966 parser/parse_agg.c:680 parser/parse_agg.c:708 #, c-format msgid "aggregate function calls cannot be nested" msgstr "виклики агрегатних функцій не можуть бути вкладеними" -#: executor/nodeCustom.c:145 executor/nodeCustom.c:156 +#: executor/nodeCustom.c:144 executor/nodeCustom.c:155 #, c-format msgid "custom scan \"%s\" does not support MarkPos" msgstr "налаштовуване ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" не підтримує MarkPos" -#: executor/nodeHashjoin.c:1046 executor/nodeHashjoin.c:1076 +#: executor/nodeHashjoin.c:1131 executor/nodeHashjoin.c:1161 #, c-format msgid "could not rewind hash-join temporary file" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¼Ð¾Ñ‚Ð°Ñ‚Ð¸ назад тимчаÑовий файл хеш-з'єднаннÑ" -#: executor/nodeHashjoin.c:1272 executor/nodeHashjoin.c:1283 -#, c-format -msgid "could not read from hash-join temporary file: read only %zu of %zu bytes" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ тимчаÑовий файл хеш-з'єднаннÑ: прочитано лише %zu з %zu байт" - -#: executor/nodeIndexonlyscan.c:240 +#: executor/nodeIndexonlyscan.c:239 #, c-format msgid "lossy distance functions are not supported in index-only scans" msgstr "функції неточної (lossy) диÑтанції не підтримуютьÑÑ Ð² ÑкануваннÑÑ… лише по індекÑу" -#: executor/nodeLimit.c:374 +#: executor/nodeLimit.c:373 #, c-format msgid "OFFSET must not be negative" msgstr "OFFSET повинен бути не негативним" -#: executor/nodeLimit.c:400 +#: executor/nodeLimit.c:399 #, c-format msgid "LIMIT must not be negative" msgstr "LIMIT повинен бути не негативним" -#: executor/nodeMergejoin.c:1570 +#: executor/nodeMergejoin.c:1579 #, c-format msgid "RIGHT JOIN is only supported with merge-joinable join conditions" msgstr "RIGHT JOIN підтримуєтьÑÑ Ð»Ð¸ÑˆÐµ з умовами, Ñкі допуÑкають з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð»Ð¸Ñ‚Ñ‚Ñм" -#: executor/nodeMergejoin.c:1588 +#: executor/nodeMergejoin.c:1597 #, c-format msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOIN підтримуєтьÑÑ Ð»Ð¸ÑˆÐµ з умовами, Ñкі допуÑкають з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð»Ð¸Ñ‚Ñ‚Ñм" -#: executor/nodeModifyTable.c:255 +#: executor/nodeModifyTable.c:240 #, c-format msgid "Query has too few columns." msgstr "Запит повертає дуже мало Ñтовпців." -#: executor/nodeModifyTable.c:1411 executor/nodeModifyTable.c:1485 +#: executor/nodeModifyTable.c:1540 executor/nodeModifyTable.c:1614 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" -msgstr "кортеж, Ñкий підлÑгає видаленню, вже змінений в операції, Ñка викликана поточною командою." +msgstr "кортеж, Ñкий підлÑгає видаленню, вже змінений в операції, Ñка викликана поточною командою" -#: executor/nodeModifyTable.c:1642 +#: executor/nodeModifyTable.c:1769 #, c-format msgid "invalid ON UPDATE specification" msgstr "неприпуÑтима ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ ON UPDATE" -#: executor/nodeModifyTable.c:1643 +#: executor/nodeModifyTable.c:1770 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "Результуючий кортеж з'ÑвитьÑÑ Ð² іншій Ñекції в порівнÑнні з оригінальним кортежем." -#: executor/nodeModifyTable.c:2084 +#: executor/nodeModifyTable.c:2226 #, c-format msgid "cannot move tuple across partitions when a non-root ancestor of the source partition is directly referenced in a foreign key" msgstr "не можна переÑувати кортеж між різними партиціÑми, коли не кореневий предок Ñекції джерела безпоÑередньо поÑилаєтьÑÑ Ð½Ð° зовнішній ключ" -#: executor/nodeModifyTable.c:2085 +#: executor/nodeModifyTable.c:2227 #, c-format -msgid "A foreign key points to ancestor \"%s\", but not the root ancestor \"%s\"." +msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "Зовнішній ключ вказує на предка \"%s\", але не на кореневого предка \"%s\"." -#: executor/nodeModifyTable.c:2088 +#: executor/nodeModifyTable.c:2230 #, c-format -msgid "Consider defining the foreign key on \"%s\"." -msgstr "РозглÑньте Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ ключа на \"%s\"." +msgid "Consider defining the foreign key on table \"%s\"." +msgstr "РозглÑньте Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ ключа Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"." #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2432 executor/nodeModifyTable.c:2823 +#: executor/nodeModifyTable.c:2596 executor/nodeModifyTable.c:3138 +#: executor/nodeModifyTable.c:3308 #, c-format msgid "%s command cannot affect row a second time" msgstr "команда %s не може вплинути на Ñ€Ñдок вдруге" -#: executor/nodeModifyTable.c:2434 +#: executor/nodeModifyTable.c:2598 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "ПереконайтеÑÑ, що немає Ñ€Ñдків Ð´Ð»Ñ Ð²Ñтавки з тією ж командою з дуплікованими обмежувальними значеннÑми." -#: executor/nodeModifyTable.c:2825 +#: executor/nodeModifyTable.c:3131 executor/nodeModifyTable.c:3301 #, c-format -msgid "Ensure that not more than one source row matches any one target row." -msgstr "ПереконайтеÑÑŒ, що не більше ніж один вихідний Ñ€Ñдок відповідає будь-Ñкому одному цільовому Ñ€Ñдку." +msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" +msgstr "кортеж, Ñкий підлÑгає оновленню або видаленню, вже змінено операцією, викликаною поточною командою" -#: executor/nodeModifyTable.c:2928 +#: executor/nodeModifyTable.c:3140 executor/nodeModifyTable.c:3310 #, c-format -msgid "tuple to be deleted was already moved to another partition due to concurrent update" -msgstr "кортеж, Ñкий підлÑгає видаленню, вже переміщено в іншу Ñекцію в результаті паралельного оновленнÑ" +msgid "Ensure that not more than one source row matches any one target row." +msgstr "ПереконайтеÑÑŒ, що не більше ніж один вихідний Ñ€Ñдок відповідає будь-Ñкому одному цільовому Ñ€Ñдку." -#: executor/nodeModifyTable.c:2967 +#: executor/nodeModifyTable.c:3209 #, c-format -msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" -msgstr "кортеж, Ñкий підлÑгає оновленню або видаленню, вже змінено операцією, викликаною поточною командою" +msgid "tuple to be merged was already moved to another partition due to concurrent update" +msgstr "кортеж, Ñкий підлÑгає об'єднанню, вже переміщено в іншу Ñекцію в результаті паралельного оновленнÑ" -#: executor/nodeSamplescan.c:260 +#: executor/nodeSamplescan.c:244 #, c-format msgid "TABLESAMPLE parameter cannot be null" msgstr "Параметр TABLESAMPLE не може бути null" -#: executor/nodeSamplescan.c:272 +#: executor/nodeSamplescan.c:256 #, c-format msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "Параметр TABLESAMPLE REPEATABLE не може бути null" -#: executor/nodeSubplan.c:346 executor/nodeSubplan.c:385 -#: executor/nodeSubplan.c:1159 +#: executor/nodeSubplan.c:325 executor/nodeSubplan.c:351 +#: executor/nodeSubplan.c:405 executor/nodeSubplan.c:1174 #, c-format msgid "more than one row returned by a subquery used as an expression" msgstr "підзапит, викориÑтаний в ÑкоÑті вираженнÑ, повернув більше ніж один Ñ€Ñдок" -#: executor/nodeTableFuncscan.c:377 +#: executor/nodeTableFuncscan.c:370 #, c-format msgid "namespace URI must not be null" msgstr "проÑтір імен URI не повинен бути null" -#: executor/nodeTableFuncscan.c:393 +#: executor/nodeTableFuncscan.c:389 #, c-format msgid "row filter expression must not be null" msgstr "вираз фільтру Ñ€Ñдків не повинен бути null" -#: executor/nodeTableFuncscan.c:420 +#: executor/nodeTableFuncscan.c:416 #, c-format msgid "column filter expression must not be null" msgstr "вираз фільтру Ñтовпців не повинен бути null" -#: executor/nodeTableFuncscan.c:421 +#: executor/nodeTableFuncscan.c:417 #, c-format msgid "Filter for column \"%s\" is null." msgstr "Фільтр Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" Ñ” null." -#: executor/nodeTableFuncscan.c:511 +#: executor/nodeTableFuncscan.c:507 #, c-format msgid "null is not allowed in column \"%s\"" msgstr "у Ñтовпці \"%s\" не допуÑкаєтьÑÑ null" -#: executor/nodeWindowAgg.c:355 +#: executor/nodeWindowAgg.c:356 #, c-format msgid "moving-aggregate transition function must not return null" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ñƒ рухомого агрегату не повинна вертати Null-значеннÑ" -#: executor/nodeWindowAgg.c:2080 +#: executor/nodeWindowAgg.c:2083 #, c-format msgid "frame starting offset must not be null" msgstr "зÑув початку рамки не повинен бути null" -#: executor/nodeWindowAgg.c:2093 +#: executor/nodeWindowAgg.c:2096 #, c-format msgid "frame starting offset must not be negative" msgstr "зÑув початку рамки не повинен бути негативним" -#: executor/nodeWindowAgg.c:2105 +#: executor/nodeWindowAgg.c:2108 #, c-format msgid "frame ending offset must not be null" msgstr "зÑув ÐºÑ–Ð½Ñ†Ñ Ñ€Ð°Ð¼ÐºÐ¸ не повинен бути null" -#: executor/nodeWindowAgg.c:2118 +#: executor/nodeWindowAgg.c:2121 #, c-format msgid "frame ending offset must not be negative" msgstr "зÑув ÐºÑ–Ð½Ñ†Ñ Ñ€Ð°Ð¼ÐºÐ¸ не повинен бути негативним" -#: executor/nodeWindowAgg.c:2878 +#: executor/nodeWindowAgg.c:2891 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "агрегатна Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %s не підтримує викориÑÑ‚Ð°Ð½Ð½Ñ Ð² ÑкоÑті віконної функції" -#: executor/spi.c:242 executor/spi.c:342 +#: executor/spi.c:241 executor/spi.c:341 #, c-format msgid "invalid transaction termination" msgstr "неприпуÑтиме Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ—" -#: executor/spi.c:257 +#: executor/spi.c:256 #, c-format msgid "cannot commit while a subtransaction is active" msgstr "неможливо затвердити, коли підтранзакції активні" -#: executor/spi.c:348 +#: executor/spi.c:347 #, c-format msgid "cannot roll back while a subtransaction is active" msgstr "неможливо відкотити, коли підтранзакції активні" -#: executor/spi.c:472 +#: executor/spi.c:471 #, c-format msgid "transaction left non-empty SPI stack" msgstr "Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð»Ð° непорожню групу SPI" -#: executor/spi.c:473 executor/spi.c:533 +#: executor/spi.c:472 executor/spi.c:532 #, c-format msgid "Check for missing \"SPI_finish\" calls." msgstr "Перевірте наÑвніÑть виклику \"SPI_finish\"." -#: executor/spi.c:532 +#: executor/spi.c:531 #, c-format msgid "subtransaction left non-empty SPI stack" msgstr "Ð¿Ñ–Ð´Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð»Ð° непорожню групу SPI" -#: executor/spi.c:1600 +#: executor/spi.c:1602 #, c-format msgid "cannot open multi-query plan as cursor" msgstr "неможливо відкрити план декількох запитів Ñк курÑор" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:1610 +#: executor/spi.c:1612 #, c-format msgid "cannot open %s query as cursor" msgstr "неможливо відкрити запит %s Ñк курÑор" -#: executor/spi.c:1716 +#: executor/spi.c:1718 #, c-format msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE не підтримуєтьÑÑ" -#: executor/spi.c:1717 parser/analyze.c:2861 +#: executor/spi.c:1719 parser/analyze.c:2928 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "КурÑори з прокручуваннÑм повинні бути READ ONLY." -#: executor/spi.c:2470 +#: executor/spi.c:2496 #, c-format msgid "empty query does not return tuples" msgstr "пуÑтий запит не повертає кортежі" #. translator: %s is name of a SQL command, eg INSERT -#: executor/spi.c:2544 +#: executor/spi.c:2570 #, c-format msgid "%s query does not return tuples" msgstr "%s запит не повертає кортежі" -#: executor/spi.c:2959 +#: executor/spi.c:2987 #, c-format msgid "SQL expression \"%s\"" msgstr "SQL вираз \"%s\"" -#: executor/spi.c:2964 +#: executor/spi.c:2992 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "PL/pgSQL приÑÐ²Ð¾Ñ”Ð½Ð½Ñ \"%s\"" -#: executor/spi.c:2967 +#: executor/spi.c:2995 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL-оператор \"%s\"" @@ -13525,33 +14322,34 @@ msgstr "SQL-оператор \"%s\"" msgid "could not send tuple to shared-memory queue" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ кортеж у чергу в Ñпільну пам'Ñть" -#: foreign/foreign.c:221 +#: foreign/foreign.c:225 +#, c-format +msgid "user mapping not found for user \"%s\", server \"%s\"" +msgstr "зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача не знайдено Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\", Ñервер \"%s\"" + +#: foreign/foreign.c:336 optimizer/plan/createplan.c:7153 +#: optimizer/util/plancat.c:540 #, c-format -msgid "user mapping not found for \"%s\"" -msgstr "зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\" не знайдено" +msgid "access to non-system foreign table is restricted" +msgstr "доÑтуп до не ÑиÑтемної Ñторонньої таблиці обмежено" -#: foreign/foreign.c:638 +#: foreign/foreign.c:660 #, c-format msgid "invalid option \"%s\"" msgstr "недійÑний параметр \"%s\"" -#: foreign/foreign.c:640 +#: foreign/foreign.c:662 #, c-format -msgid "Valid options in this context are: %s" -msgstr "У цьому контекÑті припуÑтимі параметри: %s" +msgid "Perhaps you meant the option \"%s\"." +msgstr "Можливо, ви мали на увазі параметр \"%s\"." -#: foreign/foreign.c:642 +#: foreign/foreign.c:664 #, c-format msgid "There are no valid options in this context." msgstr "У цьому контекÑті немає припуÑтимих варіантів." -#: jit/jit.c:205 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:415 -#, c-format -msgid "could not access file \"%s\": %m" -msgstr "немає доÑтупу до файлу \"%s\": %m" - -#: lib/dshash.c:254 utils/mmgr/dsa.c:702 utils/mmgr/dsa.c:724 -#: utils/mmgr/dsa.c:805 +#: lib/dshash.c:254 utils/mmgr/dsa.c:708 utils/mmgr/dsa.c:730 +#: utils/mmgr/dsa.c:811 #, c-format msgid "Failed on DSA request of size %zu." msgstr "Ðе вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ запит DSA розміру %zu." @@ -13561,578 +14359,568 @@ msgstr "Ðе вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ запит DSA розміру %zu." msgid "expected SASL response, got message type %d" msgstr "очікувалаÑÑ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´ÑŒ SASL, але отримано тип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ %d" -#: libpq/auth-scram.c:258 +#: libpq/auth-scram.c:263 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "клієнт обрав неприпуÑтимий механізм автентифікації SASL" -#: libpq/auth-scram.c:279 libpq/auth-scram.c:523 libpq/auth-scram.c:534 +#: libpq/auth-scram.c:287 libpq/auth-scram.c:536 libpq/auth-scram.c:547 #, c-format msgid "invalid SCRAM secret for user \"%s\"" msgstr "неприпуÑтимий Ñекрет SCRAM Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\"" -#: libpq/auth-scram.c:290 +#: libpq/auth-scram.c:298 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "КориÑтувач \"%s\" не має припуÑтимого Ñекрету SCRAM." -#: libpq/auth-scram.c:368 libpq/auth-scram.c:373 libpq/auth-scram.c:714 -#: libpq/auth-scram.c:722 libpq/auth-scram.c:827 libpq/auth-scram.c:840 -#: libpq/auth-scram.c:850 libpq/auth-scram.c:958 libpq/auth-scram.c:965 -#: libpq/auth-scram.c:980 libpq/auth-scram.c:995 libpq/auth-scram.c:1009 -#: libpq/auth-scram.c:1027 libpq/auth-scram.c:1042 libpq/auth-scram.c:1355 -#: libpq/auth-scram.c:1363 +#: libpq/auth-scram.c:378 libpq/auth-scram.c:383 libpq/auth-scram.c:737 +#: libpq/auth-scram.c:745 libpq/auth-scram.c:850 libpq/auth-scram.c:863 +#: libpq/auth-scram.c:873 libpq/auth-scram.c:981 libpq/auth-scram.c:988 +#: libpq/auth-scram.c:1003 libpq/auth-scram.c:1018 libpq/auth-scram.c:1032 +#: libpq/auth-scram.c:1050 libpq/auth-scram.c:1065 libpq/auth-scram.c:1379 +#: libpq/auth-scram.c:1387 #, c-format msgid "malformed SCRAM message" msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM" -#: libpq/auth-scram.c:369 +#: libpq/auth-scram.c:379 #, c-format msgid "The message is empty." msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ€Ð¾Ð¶Ð½Ñ”." -#: libpq/auth-scram.c:374 +#: libpq/auth-scram.c:384 #, c-format msgid "Message length does not match input length." msgstr "Довжина Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ відповідає довжині вводу." -#: libpq/auth-scram.c:406 +#: libpq/auth-scram.c:416 #, c-format msgid "invalid SCRAM response" msgstr "неприпуÑтима відповідь SCRAM" -#: libpq/auth-scram.c:407 +#: libpq/auth-scram.c:417 #, c-format msgid "Nonce does not match." msgstr "Одноразовий ідентифікатор не збігаєтьÑÑ." -#: libpq/auth-scram.c:483 +#: libpq/auth-scram.c:493 #, c-format msgid "could not generate random salt" msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ випадкову Ñіль" -#: libpq/auth-scram.c:715 +#: libpq/auth-scram.c:738 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "ОчікувавÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚ \"%c\", але знайдено \"%s\"." -#: libpq/auth-scram.c:723 libpq/auth-scram.c:851 +#: libpq/auth-scram.c:746 libpq/auth-scram.c:874 #, c-format msgid "Expected character \"=\" for attribute \"%c\"." msgstr "ОчікувавÑÑ Ñимвол \"=\" Ð´Ð»Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ñƒ \"%c\"." -#: libpq/auth-scram.c:828 +#: libpq/auth-scram.c:851 #, c-format msgid "Attribute expected, but found end of string." msgstr "ОчікувавÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚, але знайдено кінець Ñ€Ñдка." -#: libpq/auth-scram.c:841 +#: libpq/auth-scram.c:864 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "ОчікувавÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚, але знайдено неприпуÑтимий Ñимвол \"%s\"." -#: libpq/auth-scram.c:959 libpq/auth-scram.c:981 +#: libpq/auth-scram.c:982 libpq/auth-scram.c:1004 #, c-format msgid "The client selected SCRAM-SHA-256-PLUS, but the SCRAM message does not include channel binding data." msgstr "Клієнт обрав алгоритм SCRAM-SHA-256-PLUS, але Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM не міÑтить даних зв’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð²." -#: libpq/auth-scram.c:966 libpq/auth-scram.c:996 +#: libpq/auth-scram.c:989 libpq/auth-scram.c:1019 #, c-format msgid "Comma expected, but found character \"%s\"." msgstr "ОчікувалаÑÑŒ кома, але знайдено Ñимвол \"%s\"." -#: libpq/auth-scram.c:987 +#: libpq/auth-scram.c:1010 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "Помилка ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð²â€™ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð² SCRAM" -#: libpq/auth-scram.c:988 +#: libpq/auth-scram.c:1011 #, c-format msgid "The client supports SCRAM channel binding but thinks the server does not. However, this server does support channel binding." msgstr "Клієнт підтримує зв’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð² SCRAM, але думає, що Ñервер не підтримує. Однак, Ñервер теж підтримує зв’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð²." -#: libpq/auth-scram.c:1010 +#: libpq/auth-scram.c:1033 #, c-format msgid "The client selected SCRAM-SHA-256 without channel binding, but the SCRAM message includes channel binding data." msgstr "Клієнт обрав алгоритм SCRAM-SHA-256 без зв’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð², але Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM міÑтить дані зв’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð²." -#: libpq/auth-scram.c:1021 +#: libpq/auth-scram.c:1044 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "непідтримуваний тип зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð² SCRAM \"%s\"" -#: libpq/auth-scram.c:1028 +#: libpq/auth-scram.c:1051 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "Ðеочікувана позначка зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð² \"%s\"." -#: libpq/auth-scram.c:1038 +#: libpq/auth-scram.c:1061 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "клієнт викориÑтовує ідентифікатор Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ—, але це не підтримуєтьÑÑ" -#: libpq/auth-scram.c:1043 +#: libpq/auth-scram.c:1066 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "Ðеочікуваний атрибут \"%s\" у першому повідомленні клієнта." -#: libpq/auth-scram.c:1059 +#: libpq/auth-scram.c:1082 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "клієнт потребує непідтримуване Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ SCRAM" -#: libpq/auth-scram.c:1073 +#: libpq/auth-scram.c:1096 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "недруковані Ñимволи в одноразовому ідентифікаторі SCRAM" -#: libpq/auth-scram.c:1203 +#: libpq/auth-scram.c:1227 #, c-format msgid "could not generate random nonce" msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ випадковий одноразовий ідентифікатор" -#: libpq/auth-scram.c:1213 +#: libpq/auth-scram.c:1237 #, c-format msgid "could not encode random nonce" msgstr "не вдалоÑÑ ÐºÐ¾Ð´ÑƒÐ²Ð°Ñ‚Ð¸ випадковий одноразовий ідентифікатор" -#: libpq/auth-scram.c:1319 +#: libpq/auth-scram.c:1343 #, c-format msgid "SCRAM channel binding check failed" msgstr "Помилка перевірки зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð² SCRAM" -#: libpq/auth-scram.c:1337 +#: libpq/auth-scram.c:1361 #, c-format msgid "unexpected SCRAM channel-binding attribute in client-final-message" msgstr "неочікуваний атрибут зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð² SCRAM в оÑтанньому повідомленні клієнта" -#: libpq/auth-scram.c:1356 +#: libpq/auth-scram.c:1380 #, c-format msgid "Malformed proof in client-final-message." msgstr "Ðеправильне Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð² оÑтанньому повідомленні клієнта." -#: libpq/auth-scram.c:1364 +#: libpq/auth-scram.c:1388 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "Ð¡Ð¼Ñ–Ñ‚Ñ‚Ñ Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾ в кінці оÑтаннього Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°." -#: libpq/auth.c:275 +#: libpq/auth.c:269 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "кориÑтувач \"%s\" не пройшов автентифікацію: відхилений хоÑÑ‚" -#: libpq/auth.c:278 +#: libpq/auth.c:272 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "кориÑтувач \"%s\" не пройшов автентифікацію \"trust\"" -#: libpq/auth.c:281 +#: libpq/auth.c:275 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "КориÑтувач \"%s\" не пройшов автентифікацію Ident" -#: libpq/auth.c:284 +#: libpq/auth.c:278 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "КориÑтувач \"%s\" не пройшов автентифікацію Peer" -#: libpq/auth.c:289 +#: libpq/auth.c:283 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "кориÑтувач \"%s\" не пройшов автентифікацію за допомогою паролÑ" -#: libpq/auth.c:294 +#: libpq/auth.c:288 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "КориÑтувач \"%s\" не пройшов автентифікацію GSSAPI" -#: libpq/auth.c:297 +#: libpq/auth.c:291 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "КориÑтувач \"%s\" не пройшов автентифікацію SSPI" -#: libpq/auth.c:300 +#: libpq/auth.c:294 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "КориÑтувач \"%s\" не пройшов автентифікацію PAM" -#: libpq/auth.c:303 +#: libpq/auth.c:297 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "КориÑтувач \"%s\" не пройшов автентифікацію BSD" -#: libpq/auth.c:306 +#: libpq/auth.c:300 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "КориÑтувач \"%s\" не пройшов автентифікацію LDAP" -#: libpq/auth.c:309 +#: libpq/auth.c:303 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "кориÑтувач \"%s\" не пройшов автентифікацію за Ñертифікатом" -#: libpq/auth.c:312 +#: libpq/auth.c:306 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "КориÑтувач \"%s\" не пройшов автентифікацію RADIUS" -#: libpq/auth.c:315 +#: libpq/auth.c:309 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "кориÑтувач \"%s\" не пройшов автентифікацію: неприпуÑтимий метод автентифікації" -#: libpq/auth.c:319 +#: libpq/auth.c:313 #, c-format -msgid "Connection matched pg_hba.conf line %d: \"%s\"" -msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð°Ñ” Ñ€Ñдку %d в pg_hba.conf: \"%s\"" +msgid "Connection matched file \"%s\" line %d: \"%s\"" +msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð°Ñ” файлу \"%s\" Ñ€Ñдок %d: \"%s\"" -#: libpq/auth.c:362 +#: libpq/auth.c:357 #, c-format msgid "authentication identifier set more than once" msgstr "ідентифікатор автентифікації вÑтановлено більш ніж один раз" -#: libpq/auth.c:363 +#: libpq/auth.c:358 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "попередній ідентифікатор: \"%s\"; новий ідентифікатор: \"%s\"" -#: libpq/auth.c:372 +#: libpq/auth.c:368 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ¾Ð²Ð°Ð½Ð¾: ідентифікатор=\"%s\" метод=%s (%s:%d)" -#: libpq/auth.c:411 +#: libpq/auth.c:408 #, c-format msgid "client certificates can only be checked if a root certificate store is available" msgstr "Ñертифікати клієнтів можуть перевірÑтиÑÑ, лише Ñкщо доÑтупне Ñховище кореневих Ñертифікатів" -#: libpq/auth.c:422 +#: libpq/auth.c:419 #, c-format msgid "connection requires a valid client certificate" msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” припуÑтимий Ñертифікат клієнта" -#: libpq/auth.c:453 libpq/auth.c:499 +#: libpq/auth.c:450 libpq/auth.c:496 msgid "GSS encryption" msgstr "Ð¨Ð¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ GSS" -#: libpq/auth.c:456 libpq/auth.c:502 +#: libpq/auth.c:453 libpq/auth.c:499 msgid "SSL encryption" msgstr "Ð¨Ð¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ SSL" -#: libpq/auth.c:458 libpq/auth.c:504 +#: libpq/auth.c:455 libpq/auth.c:501 msgid "no encryption" msgstr "без шифруваннÑ" #. translator: last %s describes encryption state -#: libpq/auth.c:464 +#: libpq/auth.c:461 #, c-format msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" msgstr "pg_hba.conf відхилÑÑ” Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— Ð´Ð»Ñ Ñ…Ð¾Ñту \"%s\", кориÑтувача \"%s\", %s" #. translator: last %s describes encryption state -#: libpq/auth.c:471 +#: libpq/auth.c:468 #, c-format msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "pg_hba.conf відхилÑÑ” Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ…Ð¾Ñту \"%s\", кориÑтувача \"%s\", бази даних \"%s\", %s" -#: libpq/auth.c:509 +#: libpq/auth.c:506 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "IP-адреÑа клієнта дозволÑєтьÑÑ Ð² \"%s\", відповідає прÑмому перетворенню." -#: libpq/auth.c:512 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "IP-адреÑа клієнта дозволÑєтьÑÑ Ð² \"%s\", прÑме Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ðµ перевірÑлоÑÑ." -#: libpq/auth.c:515 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "IP-адреÑа клієнта дозволÑєтьÑÑ Ð² \"%s\", не відповідає прÑмому перетворенню." -#: libpq/auth.c:518 +#: libpq/auth.c:515 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "ПереклаÑти ім'Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ñького хоÑту \"%s\" в IP-адреÑу: %s, не вдалоÑÑ." -#: libpq/auth.c:523 +#: libpq/auth.c:520 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "Отримати ім'Ñ Ñ…Ð¾Ñту з IP-адреÑи клієнта: %s, не вдалоÑÑ." #. translator: last %s describes encryption state -#: libpq/auth.c:531 +#: libpq/auth.c:528 #, c-format msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" msgstr "в pg_hba.conf немає запиÑу, що дозволÑÑ” Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— з хоÑту \"%s\", кориÑтувача \"%s\", %s" #. translator: last %s describes encryption state -#: libpq/auth.c:539 +#: libpq/auth.c:536 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "в pg_hba.conf немає запиÑу Ð´Ð»Ñ Ñ…Ð¾Ñту \"%s\", кориÑтувача \"%s\", бази даних \"%s\", %s" -#: libpq/auth.c:712 +#: libpq/auth.c:656 +#, c-format +msgid "connection authenticated: user=\"%s\" method=%s (%s:%d)" +msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ¾Ð²Ð°Ð½Ð¾: user=\"%s\" method=%s (%s:%d)" + +#: libpq/auth.c:725 #, c-format msgid "expected password response, got message type %d" msgstr "очікувалаÑÑ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´ з паролем, але отримано тип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ %d" -#: libpq/auth.c:733 +#: libpq/auth.c:746 #, c-format msgid "invalid password packet size" msgstr "неприпуÑтимий розмір пакету з паролем" -#: libpq/auth.c:751 +#: libpq/auth.c:764 #, c-format msgid "empty password returned by client" msgstr "клієнт повернув пуÑтий пароль" -#: libpq/auth.c:880 libpq/hba.c:1335 -#, c-format -msgid "MD5 authentication is not supported when \"db_user_namespace\" is enabled" -msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ MD5 не підтримуєтьÑÑ, коли увімкнуто режим \"db_user_namespace\"" - -#: libpq/auth.c:886 +#: libpq/auth.c:892 #, c-format msgid "could not generate random MD5 salt" msgstr "не вдалоÑÑ Ñтворити випадкову Ñіль Ð´Ð»Ñ MD5" -#: libpq/auth.c:935 libpq/be-secure-gssapi.c:535 +#: libpq/auth.c:943 libpq/be-secure-gssapi.c:540 #, c-format msgid "could not set environment: %m" msgstr "не вдалоÑÑ Ð²Ñтановити Ñередовище: %m" -#: libpq/auth.c:971 +#: libpq/auth.c:982 #, c-format msgid "expected GSS response, got message type %d" msgstr "очікувалаÑÑ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´ÑŒ GSS, але отримано тип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ %d" -#: libpq/auth.c:1031 +#: libpq/auth.c:1048 msgid "accepting GSS security context failed" msgstr "прийнÑти контекÑÑ‚ безпеки GSS не вдалоÑÑŒ" -#: libpq/auth.c:1072 +#: libpq/auth.c:1089 msgid "retrieving GSS user name failed" msgstr "Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ–Ð¼'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача GSS не виконано" -#: libpq/auth.c:1221 +#: libpq/auth.c:1235 msgid "could not acquire SSPI credentials" msgstr "не вдалоÑÑŒ отримати облікові дані SSPI" -#: libpq/auth.c:1246 +#: libpq/auth.c:1260 #, c-format msgid "expected SSPI response, got message type %d" msgstr "очікувалаÑÑŒ відповідь SSPI, але отримано тип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ %d" -#: libpq/auth.c:1324 +#: libpq/auth.c:1338 msgid "could not accept SSPI security context" msgstr "прийнÑти контекÑÑ‚ безпеки SSPI не вдалоÑÑ" -#: libpq/auth.c:1386 +#: libpq/auth.c:1379 msgid "could not get token from SSPI security context" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ маркер з контекÑту безпеки SSPI" -#: libpq/auth.c:1525 libpq/auth.c:1544 +#: libpq/auth.c:1515 libpq/auth.c:1534 #, c-format msgid "could not translate name" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐºÐ»Ð°Ñти ім'Ñ" -#: libpq/auth.c:1557 +#: libpq/auth.c:1547 #, c-format msgid "realm name too long" msgstr "ім'Ñ Ð¾Ð±Ð»Ð°Ñті дуже довге" -#: libpq/auth.c:1572 +#: libpq/auth.c:1562 #, c-format msgid "translated account name too long" msgstr "ім'Ñ Ð¿ÐµÑ€ÐµÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ð³Ð¾ облікового запиÑу дуже довге" -#: libpq/auth.c:1753 +#: libpq/auth.c:1741 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "не вдалоÑÑ Ñтворити Ñокет Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Ñерверу Ident: %m" -#: libpq/auth.c:1768 +#: libpq/auth.c:1756 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¸Ð²'ÑзатиÑÑ Ð´Ð¾ локальної адреÑи \"%s\": %m" -#: libpq/auth.c:1780 +#: libpq/auth.c:1768 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "не вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ Ident-Ñерверу за адреÑою \"%s\", порт %s: %m" -#: libpq/auth.c:1802 +#: libpq/auth.c:1790 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати запит до Ident -Ñерверу за адреÑою \"%s\", порт %s: %m" -#: libpq/auth.c:1819 +#: libpq/auth.c:1807 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ відповідь від Ident-Ñерверу за адреÑою \"%s\", порт %s: %m" -#: libpq/auth.c:1829 +#: libpq/auth.c:1817 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "неприпуÑтимо форматована відповідь від Ident-Ñерверу: \"%s\"" -#: libpq/auth.c:1882 +#: libpq/auth.c:1870 #, c-format msgid "peer authentication is not supported on this platform" msgstr "Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ peer не підтримуєтьÑÑ Ð½Ð° цій платформі" -#: libpq/auth.c:1886 +#: libpq/auth.c:1874 #, c-format msgid "could not get peer credentials: %m" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ облікові дані кориÑтувача через peer: %m" -#: libpq/auth.c:1898 +#: libpq/auth.c:1886 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ локального кориÑтувача за ідентифікатором (%ld): %s" -#: libpq/auth.c:1999 +#: libpq/auth.c:1988 #, c-format msgid "error from underlying PAM layer: %s" msgstr "помилка у нижчому шарі PAM: %s" -#: libpq/auth.c:2010 +#: libpq/auth.c:1999 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "непідтримувана розмова PAM %d/\"%s\"" -#: libpq/auth.c:2070 +#: libpq/auth.c:2056 #, c-format msgid "could not create PAM authenticator: %s" msgstr "не вдалоÑÑ Ñтворити автентифікатор PAM: %s" -#: libpq/auth.c:2081 +#: libpq/auth.c:2067 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "помилка в pam_set_item(PAM_USER): %s" -#: libpq/auth.c:2113 +#: libpq/auth.c:2099 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "помилка в pam_set_item(PAM_RHOST): %s" -#: libpq/auth.c:2125 +#: libpq/auth.c:2111 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "помилка в pam_set_item(PAM_CONV): %s" -#: libpq/auth.c:2138 +#: libpq/auth.c:2124 #, c-format msgid "pam_authenticate failed: %s" msgstr "помилка в pam_authenticate: %sв" -#: libpq/auth.c:2151 +#: libpq/auth.c:2137 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "помилка в pam_acct_mgmt: %s" -#: libpq/auth.c:2162 +#: libpq/auth.c:2148 #, c-format msgid "could not release PAM authenticator: %s" msgstr "не вдалоÑÑ Ð²Ð¸Ð²Ñ–Ð»ÑŒÐ½Ð¸Ñ‚Ð¸ автентифікатор PAM: %s" -#: libpq/auth.c:2242 +#: libpq/auth.c:2228 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ протокол LDAP: код помилки %d" -#: libpq/auth.c:2279 +#: libpq/auth.c:2265 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ назву домена з ldapbasedn" -#: libpq/auth.c:2287 +#: libpq/auth.c:2273 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ LDAP не змогла знайти запиÑи DNS SRV Ð´Ð»Ñ \"%s\"" -#: libpq/auth.c:2289 +#: libpq/auth.c:2275 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Ð’Ñтановіть назву Ñервера LDAP, Ñвно." -#: libpq/auth.c:2341 +#: libpq/auth.c:2327 #, c-format msgid "could not initialize LDAP: %s" msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ протокол LDAP: %s" -#: libpq/auth.c:2351 +#: libpq/auth.c:2337 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "протокол ldaps з поточною бібліотекою LDAP не підтримуєтьÑÑ" -#: libpq/auth.c:2359 +#: libpq/auth.c:2345 #, c-format msgid "could not initialize LDAP: %m" msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ протокол LDAP: %m" -#: libpq/auth.c:2369 +#: libpq/auth.c:2355 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "не вдалоÑÑ Ð²Ñтановити верÑÑ–ÑŽ протоколу LDAP: %s" -#: libpq/auth.c:2409 -#, c-format -msgid "could not load function _ldap_start_tls_sA in wldap32.dll" -msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ функцію _ldap_start_tls_sA in wldap32.dll" - -#: libpq/auth.c:2410 -#, c-format -msgid "LDAP over SSL is not supported on this platform." -msgstr "Протокол LDAP через протокол SSL не підтримуєтьÑÑ Ð½Ð° цій платформі." - -#: libpq/auth.c:2426 +#: libpq/auth.c:2371 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "не вдалоÑÑ Ð¿Ð¾Ñ‡Ð°Ñ‚Ð¸ ÑÐµÐ°Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ LDAP TLS: %s" -#: libpq/auth.c:2497 +#: libpq/auth.c:2448 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "Сервер LDAP не вказаний, Ñ– не ldapbasedn" -#: libpq/auth.c:2504 +#: libpq/auth.c:2455 #, c-format msgid "LDAP server not specified" msgstr "LDAP-Ñервер не вказаний" -#: libpq/auth.c:2566 +#: libpq/auth.c:2517 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "неприпуÑтимий Ñимвол в імені кориÑтувача Ð´Ð»Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— LDAP" -#: libpq/auth.c:2583 +#: libpq/auth.c:2534 #, c-format msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ початкову прив'Ñзку LDAP Ð´Ð»Ñ ldapbinddn \"%s\" на Ñервері \"%s\": %s" -#: libpq/auth.c:2612 +#: libpq/auth.c:2564 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ LDAP-пошук за фільтром \"%s\" на Ñервері \"%s\": %s" -#: libpq/auth.c:2626 +#: libpq/auth.c:2580 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAP-кориÑтувач \"%s\" не Ñ–Ñнує" -#: libpq/auth.c:2627 +#: libpq/auth.c:2581 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "LDAP-пошук за фільтром \"%s\" на Ñервері \"%s\" не повернув запиÑів." -#: libpq/auth.c:2631 +#: libpq/auth.c:2585 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAP-кориÑтувач \"%s\" не унікальний" -#: libpq/auth.c:2632 +#: libpq/auth.c:2586 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "LDAP search for filter \"%s\" on server \"%s\" returned %d entries." @@ -14141,251 +14929,233 @@ msgstr[1] "LDAP-пошук за фільтром \"%s\" на Ñервері \"%s msgstr[2] "LDAP-пошук за фільтром \"%s\" на Ñервері \"%s\" повернув %d запиÑів." msgstr[3] "LDAP-пошук за фільтром \"%s\" на Ñервері \"%s\" повернув %d запиÑів." -#: libpq/auth.c:2652 +#: libpq/auth.c:2606 #, c-format msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ dn Ð´Ð»Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ результату, що відповідає \"%s\" на Ñервері \"%s\": %s" -#: libpq/auth.c:2673 -#, c-format -msgid "could not unbind after searching for user \"%s\" on server \"%s\"" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð²'ÑзатиÑÑŒ піÑÐ»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ кориÑтувача \"%s\" на Ñервері \"%s\"" - -#: libpq/auth.c:2704 +#: libpq/auth.c:2633 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "Помилка під Ñ‡Ð°Ñ Ñ€ÐµÑ”Ñтрації в протоколі LDAP кориÑтувача \"%s\" на Ñервері \"%s\": %s" -#: libpq/auth.c:2736 +#: libpq/auth.c:2665 #, c-format msgid "LDAP diagnostics: %s" msgstr "ДіагноÑтика LDAP: %s" -#: libpq/auth.c:2774 +#: libpq/auth.c:2703 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "помилка автентифікації Ñертифіката Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\": Ñертифікат клієнта не міÑтить імені кориÑтувача" -#: libpq/auth.c:2795 +#: libpq/auth.c:2724 #, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" msgstr "помилка автентифікації Ñертифікату Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\": не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ DN Ñуб'єкта" -#: libpq/auth.c:2818 +#: libpq/auth.c:2747 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" msgstr "помилка перевірки Ñертифікату (clientcert=verify-full) Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\": DN невідповідніÑть" -#: libpq/auth.c:2823 +#: libpq/auth.c:2752 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "помилка перевірки Ñертифікату (clientcert=verify-full) Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\": CN невідповідніÑть" -#: libpq/auth.c:2925 +#: libpq/auth.c:2854 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-Ñервер не вказаний" -#: libpq/auth.c:2932 +#: libpq/auth.c:2861 #, c-format msgid "RADIUS secret not specified" msgstr "Секрет RADIUS не вказаний" -#: libpq/auth.c:2946 +#: libpq/auth.c:2875 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ RADIUS не підтримує паролі довші ніж %d Ñимволів" -#: libpq/auth.c:3053 libpq/hba.c:1976 +#: libpq/auth.c:2977 libpq/hba.c:2352 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ ім'Ñ Ñерверу RADIUS \"%s\" в адреÑу: %s" -#: libpq/auth.c:3067 +#: libpq/auth.c:2991 #, c-format msgid "could not generate random encryption vector" msgstr "не вдалоÑÑ Ñтворити випадковий вектор шифруваннÑ" -#: libpq/auth.c:3104 +#: libpq/auth.c:3028 #, c-format msgid "could not perform MD5 encryption of password: %s" msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ MD5 ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŽ: %s" -#: libpq/auth.c:3131 +#: libpq/auth.c:3055 #, c-format msgid "could not create RADIUS socket: %m" msgstr "не вдалоÑÑ Ñтворити Ñокет RADIUS: %m" -#: libpq/auth.c:3153 +#: libpq/auth.c:3071 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¸Ð²'ÑзатиÑÑ Ð´Ð¾ локального Ñокету RADIUS: %m" -#: libpq/auth.c:3163 +#: libpq/auth.c:3081 #, c-format msgid "could not send RADIUS packet: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ð¸ пакет RADIUS: %m" -#: libpq/auth.c:3197 libpq/auth.c:3223 +#: libpq/auth.c:3115 libpq/auth.c:3141 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ– RADIUS від %s" -#: libpq/auth.c:3216 +#: libpq/auth.c:3134 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ ÑÑ‚Ð°Ñ‚ÑƒÑ Ñокету RADIUS: %m" -#: libpq/auth.c:3246 +#: libpq/auth.c:3164 #, c-format msgid "could not read RADIUS response: %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ відповідь RADIUS: %m" -#: libpq/auth.c:3259 libpq/auth.c:3263 +#: libpq/auth.c:3172 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "Відповідь RADIUS від %s була відправлена з неправильного порту: %d" -#: libpq/auth.c:3272 +#: libpq/auth.c:3180 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "Занадто коротка відповідь RADIUS від %s: %d" -#: libpq/auth.c:3279 +#: libpq/auth.c:3187 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "У відповіді RADIUS від %s покшоджена довжина: %d (фактична довжина %d)" -#: libpq/auth.c:3287 +#: libpq/auth.c:3195 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "Прийшла відповідь RADIUS від %s на інший запит: %d (очікувалаÑÑ %d)" -#: libpq/auth.c:3312 +#: libpq/auth.c:3220 #, c-format msgid "could not perform MD5 encryption of received packet: %s" msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ MD5 ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð¾Ð³Ð¾ пакету: %s" -#: libpq/auth.c:3322 +#: libpq/auth.c:3230 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "Відповідь RADIUS від %s має неправильний Ð¿Ñ–Ð´Ð¿Ð¸Ñ MD5" -#: libpq/auth.c:3340 +#: libpq/auth.c:3248 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "Відповідь RADIUS від %s має неприпуÑтимий код (%d) Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\"" -#: libpq/be-fsstubs.c:128 libpq/be-fsstubs.c:157 libpq/be-fsstubs.c:185 -#: libpq/be-fsstubs.c:211 libpq/be-fsstubs.c:236 libpq/be-fsstubs.c:274 -#: libpq/be-fsstubs.c:297 libpq/be-fsstubs.c:545 +#: libpq/be-fsstubs.c:133 libpq/be-fsstubs.c:162 libpq/be-fsstubs.c:190 +#: libpq/be-fsstubs.c:216 libpq/be-fsstubs.c:241 libpq/be-fsstubs.c:283 +#: libpq/be-fsstubs.c:306 libpq/be-fsstubs.c:560 #, c-format msgid "invalid large-object descriptor: %d" msgstr "неприпуÑтимий деÑкриптор великого об'єкту: %d" -#: libpq/be-fsstubs.c:168 +#: libpq/be-fsstubs.c:173 #, c-format msgid "large object descriptor %d was not opened for reading" msgstr "деÑкриптор великого об'єкту %d не був відкритий Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ" -#: libpq/be-fsstubs.c:192 libpq/be-fsstubs.c:552 +#: libpq/be-fsstubs.c:197 libpq/be-fsstubs.c:567 #, c-format msgid "large object descriptor %d was not opened for writing" msgstr "деÑкриптор великого об’єкту %d не був відкритий Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу" -#: libpq/be-fsstubs.c:219 +#: libpq/be-fsstubs.c:224 #, c-format msgid "lo_lseek result out of range for large-object descriptor %d" msgstr "результат lo_lseek Ð´Ð»Ñ Ð´ÐµÑкриптора великого об'єкту %d поза діапазоном" -#: libpq/be-fsstubs.c:282 +#: libpq/be-fsstubs.c:291 #, c-format msgid "lo_tell result out of range for large-object descriptor %d" msgstr "результат lo_tell Ð´Ð»Ñ Ð´ÐµÑкриптору\\а великого об'єкту %d поза діапазоном" -#: libpq/be-fsstubs.c:424 +#: libpq/be-fsstubs.c:439 #, c-format msgid "could not open server file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл Ñервера \"%s\": %m" -#: libpq/be-fsstubs.c:447 +#: libpq/be-fsstubs.c:462 #, c-format msgid "could not read server file \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл Ñервера \"%s\": %m" -#: libpq/be-fsstubs.c:506 +#: libpq/be-fsstubs.c:521 #, c-format msgid "could not create server file \"%s\": %m" msgstr "не вдалоÑÑ Ñтворити файл Ñервера \"%s\": %m" -#: libpq/be-fsstubs.c:518 +#: libpq/be-fsstubs.c:533 #, c-format msgid "could not write server file \"%s\": %m" msgstr "не вдалоÑÑ Ð½Ð°Ð¿Ð¸Ñати файл Ñервера \"%s\": %m" -#: libpq/be-fsstubs.c:758 +#: libpq/be-fsstubs.c:774 #, c-format msgid "large object read request is too large" msgstr "запит на Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об'єкту має завеликий розмір" -#: libpq/be-fsstubs.c:800 utils/adt/genfile.c:262 utils/adt/genfile.c:301 -#: utils/adt/genfile.c:337 +#: libpq/be-fsstubs.c:816 utils/adt/genfile.c:248 utils/adt/genfile.c:269 #, c-format msgid "requested length cannot be negative" msgstr "запитувана довжина не може бути негативною" -#: libpq/be-fsstubs.c:851 storage/large_object/inv_api.c:299 -#: storage/large_object/inv_api.c:311 storage/large_object/inv_api.c:508 -#: storage/large_object/inv_api.c:619 storage/large_object/inv_api.c:809 -#, c-format -msgid "permission denied for large object %u" -msgstr "немає дозволу Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об'єкта %u" - -#: libpq/be-secure-common.c:93 -#, c-format -msgid "could not read from command \"%s\": %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ виÑновок команди \"%s\": %m" - -#: libpq/be-secure-common.c:113 +#: libpq/be-secure-common.c:94 #, c-format msgid "command \"%s\" failed" msgstr "помилка команди \"%s\"" -#: libpq/be-secure-common.c:141 +#: libpq/be-secure-common.c:123 #, c-format msgid "could not access private key file \"%s\": %m" msgstr "не вдалоÑÑŒ отримати доÑтуп до файла закритиго ключа \"%s\": %m" -#: libpq/be-secure-common.c:151 +#: libpq/be-secure-common.c:133 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "файл закритого ключа \"%s\" не Ñ” звичайним" -#: libpq/be-secure-common.c:177 +#: libpq/be-secure-common.c:159 #, c-format msgid "private key file \"%s\" must be owned by the database user or root" msgstr "файл закритого ключа \"%s\" повинен належати кориÑтувачу бази даних або корінÑ" -#: libpq/be-secure-common.c:187 +#: libpq/be-secure-common.c:169 #, c-format msgid "private key file \"%s\" has group or world access" msgstr "до файлу закритого ключа \"%s\" мають доÑтуп група або вÑÑ–" -#: libpq/be-secure-common.c:189 +#: libpq/be-secure-common.c:171 #, c-format msgid "File must have permissions u=rw (0600) or less if owned by the database user, or permissions u=rw,g=r (0640) or less if owned by root." msgstr "Файл повинен мати дозволи u=rw (0600) або менше, Ñкщо він належить кориÑтувачу бази даних, або u=rw,g=r (0640) або менше, Ñкщо він належить кореню." -#: libpq/be-secure-gssapi.c:204 +#: libpq/be-secure-gssapi.c:201 msgid "GSSAPI wrap error" msgstr "помилка при згортанні GSSAPI" -#: libpq/be-secure-gssapi.c:211 +#: libpq/be-secure-gssapi.c:208 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "вихідне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ GSSAPI не буде викориÑтовувати конфіденційніÑть" -#: libpq/be-secure-gssapi.c:218 libpq/be-secure-gssapi.c:622 +#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "Ñервер намагавÑÑ Ð½Ð°Ð´Ñ–Ñлати переповнений пакет GSSAPI (%zu > %zu)" @@ -14404,1094 +15174,1068 @@ msgstr "помилка при розгортанні GSSAPI" msgid "incoming GSSAPI message did not use confidentiality" msgstr "вхідне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ GSSAPI не викориÑтовувало конфіденційніÑть" -#: libpq/be-secure-gssapi.c:570 +#: libpq/be-secure-gssapi.c:575 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %d)" msgstr "переповнений пакет GSSAPI, надіÑланий клієнтом (%zu > %d)" -#: libpq/be-secure-gssapi.c:594 +#: libpq/be-secure-gssapi.c:600 msgid "could not accept GSSAPI security context" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¸Ð¹Ð½Ñти контекÑÑ‚ безпеки GSSAPI" -#: libpq/be-secure-gssapi.c:689 +#: libpq/be-secure-gssapi.c:701 msgid "GSSAPI size check error" msgstr "помилка перевірки розміру GSSAPI" -#: libpq/be-secure-openssl.c:122 +#: libpq/be-secure-openssl.c:131 #, c-format msgid "could not create SSL context: %s" msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ SSL: %s" -#: libpq/be-secure-openssl.c:148 +#: libpq/be-secure-openssl.c:157 #, c-format msgid "could not load server certificate file \"%s\": %s" msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ Ñертифікат Ñерверу \"%s\": %s" -#: libpq/be-secure-openssl.c:168 +#: libpq/be-secure-openssl.c:177 #, c-format msgid "private key file \"%s\" cannot be reloaded because it requires a passphrase" msgstr "файл закритого ключа \"%s\" не можна перезавантажити, тому що це потребує парольну фразу" -#: libpq/be-secure-openssl.c:173 +#: libpq/be-secure-openssl.c:182 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "не вдалоÑÑŒ завантажити файл закритого ключа \"%s\": %s" -#: libpq/be-secure-openssl.c:182 +#: libpq/be-secure-openssl.c:191 #, c-format msgid "check of private key failed: %s" msgstr "помилка під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ приватного ключа: %s" #. translator: first %s is a GUC option name, second %s is its value -#: libpq/be-secure-openssl.c:195 libpq/be-secure-openssl.c:218 +#: libpq/be-secure-openssl.c:204 libpq/be-secure-openssl.c:227 #, c-format msgid "\"%s\" setting \"%s\" not supported by this build" msgstr "\"%s\" Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" не підтримуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ збіркою" -#: libpq/be-secure-openssl.c:205 +#: libpq/be-secure-openssl.c:214 #, c-format msgid "could not set minimum SSL protocol version" msgstr "не вдалоÑÑ Ð²Ñтановити мінімальну верÑÑ–ÑŽ протоколу SSL" -#: libpq/be-secure-openssl.c:228 +#: libpq/be-secure-openssl.c:237 #, c-format msgid "could not set maximum SSL protocol version" msgstr "не вдалоÑÑ Ð²Ñтановити макÑимальну верÑÑ–ÑŽ протоколу SSL" -#: libpq/be-secure-openssl.c:244 +#: libpq/be-secure-openssl.c:253 #, c-format msgid "could not set SSL protocol version range" msgstr "не вдалоÑÑ Ð²Ñтановити діапазон верÑій протоколу SSL" -#: libpq/be-secure-openssl.c:245 +#: libpq/be-secure-openssl.c:254 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "\"%s\" не може бути більше, ніж \"%s\"" -#: libpq/be-secure-openssl.c:282 +#: libpq/be-secure-openssl.c:307 #, c-format msgid "could not set the cipher list (no valid ciphers available)" msgstr "не вдалоÑÑ Ð²Ñтановити ÑпиÑок шифрів (немає дійÑних шифрів)" -#: libpq/be-secure-openssl.c:302 +#: libpq/be-secure-openssl.c:327 #, c-format msgid "could not load root certificate file \"%s\": %s" msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл кореневого Ñертифікату \"%s\": %s" -#: libpq/be-secure-openssl.c:351 +#: libpq/be-secure-openssl.c:376 #, c-format msgid "could not load SSL certificate revocation list file \"%s\": %s" msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл зі ÑпиÑком відкликаних Ñертифікатів SSL \"%s\": %s" -#: libpq/be-secure-openssl.c:359 +#: libpq/be-secure-openssl.c:384 #, c-format msgid "could not load SSL certificate revocation list directory \"%s\": %s" msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ каталог ÑпиÑку відкликаних Ñертифікатів SSL \"%s\": %s" -#: libpq/be-secure-openssl.c:367 +#: libpq/be-secure-openssl.c:392 #, c-format msgid "could not load SSL certificate revocation list file \"%s\" or directory \"%s\": %s" msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл \"%s\" або каталог \"%s\" ÑпиÑку відкликаних Ñертифікатів SSL: %s" -#: libpq/be-secure-openssl.c:425 +#: libpq/be-secure-openssl.c:450 #, c-format msgid "could not initialize SSL connection: SSL context not set up" msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ SSL-підключеннÑ: контекÑÑ‚ SSL не вÑтановлений" -#: libpq/be-secure-openssl.c:436 +#: libpq/be-secure-openssl.c:464 #, c-format msgid "could not initialize SSL connection: %s" msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ SSL-підключеннÑ: %s" -#: libpq/be-secure-openssl.c:444 +#: libpq/be-secure-openssl.c:472 #, c-format msgid "could not set SSL socket: %s" msgstr "не вдалоÑÑ Ð²Ñтановити SSL-Ñокет: %s" -#: libpq/be-secure-openssl.c:499 +#: libpq/be-secure-openssl.c:528 #, c-format msgid "could not accept SSL connection: %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¸Ð¹Ð½Ñти SSL-підключеннÑ: %m" -#: libpq/be-secure-openssl.c:503 libpq/be-secure-openssl.c:556 +#: libpq/be-secure-openssl.c:532 libpq/be-secure-openssl.c:589 #, c-format msgid "could not accept SSL connection: EOF detected" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¸Ð¹Ð½Ñти SSL-підключеннÑ: виÑвлений EOF" -#: libpq/be-secure-openssl.c:542 +#: libpq/be-secure-openssl.c:573 #, c-format msgid "could not accept SSL connection: %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ SSL: %s" -#: libpq/be-secure-openssl.c:545 +#: libpq/be-secure-openssl.c:577 #, c-format msgid "This may indicate that the client does not support any SSL protocol version between %s and %s." msgstr "Це може вказувати, що клієнт не підтримує жодної верÑÑ–Ñ— протоколу SSL між %s Ñ– %s." -#: libpq/be-secure-openssl.c:561 libpq/be-secure-openssl.c:741 -#: libpq/be-secure-openssl.c:805 +#: libpq/be-secure-openssl.c:594 libpq/be-secure-openssl.c:809 +#: libpq/be-secure-openssl.c:879 #, c-format msgid "unrecognized SSL error code: %d" msgstr "нерозпізнаний код помилки SSL: %d" -#: libpq/be-secure-openssl.c:607 +#: libpq/be-secure-openssl.c:622 +#, c-format +msgid "received SSL connection request with unexpected ALPN protocol" +msgstr "отримано запит на Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ SSL з неÑподіваним протоколом ALPN" + +#: libpq/be-secure-openssl.c:666 #, c-format msgid "SSL certificate's common name contains embedded null" msgstr "Спільне ім'Ñ SSL-Ñертифікату міÑтить нульовий байт" -#: libpq/be-secure-openssl.c:647 +#: libpq/be-secure-openssl.c:712 #, c-format msgid "SSL certificate's distinguished name contains embedded null" msgstr "Унікальна назва Ñертифікату SSL міÑтить вбудоване null-значеннÑ" -#: libpq/be-secure-openssl.c:730 libpq/be-secure-openssl.c:789 +#: libpq/be-secure-openssl.c:798 libpq/be-secure-openssl.c:863 #, c-format msgid "SSL error: %s" msgstr "Помилка SSL: %s" -#: libpq/be-secure-openssl.c:971 +#: libpq/be-secure-openssl.c:1038 #, c-format msgid "could not open DH parameters file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл параметрів DH \"%s\": %m" -#: libpq/be-secure-openssl.c:983 +#: libpq/be-secure-openssl.c:1050 #, c-format msgid "could not load DH parameters file: %s" msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл параметрів DH: %s" -#: libpq/be-secure-openssl.c:993 +#: libpq/be-secure-openssl.c:1060 #, c-format msgid "invalid DH parameters: %s" msgstr "неприпуÑтимі параметри DH: %s" -#: libpq/be-secure-openssl.c:1002 +#: libpq/be-secure-openssl.c:1069 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "неприпуÑтимі параметри DH: Ñ€ - не штрих" -#: libpq/be-secure-openssl.c:1011 +#: libpq/be-secure-openssl.c:1078 #, c-format msgid "invalid DH parameters: neither suitable generator or safe prime" msgstr "неприпуÑтимі параметри DH: немає придатного генератора або безпечного штриха" -#: libpq/be-secure-openssl.c:1172 +#: libpq/be-secure-openssl.c:1214 #, c-format -msgid "DH: could not load DH parameters" +msgid "Client certificate verification failed at depth %d: %s." +msgstr "Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ Ñертифікат клієнта на глибині %d: %s." + +#: libpq/be-secure-openssl.c:1251 +#, c-format +msgid "Failed certificate data (unverified): subject \"%s\", serial number %s, issuer \"%s\"." +msgstr "Помилкові дані Ñертифіката (неперевірені): тема \"%s\", Ñерійний номер %s, емітент \"%s\"." + +#: libpq/be-secure-openssl.c:1252 +msgid "unknown" +msgstr "невідомо" + +#: libpq/be-secure-openssl.c:1389 +#, c-format +msgid "DH: could not load DH parameters" msgstr "DH: не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ параметри DH" -#: libpq/be-secure-openssl.c:1180 +#: libpq/be-secure-openssl.c:1397 #, c-format msgid "DH: could not set DH parameters: %s" msgstr "DH: не вдалоÑÑ Ð²Ñтановити параметри DH: %s" -#: libpq/be-secure-openssl.c:1207 +#: libpq/be-secure-openssl.c:1424 #, c-format msgid "ECDH: unrecognized curve name: %s" msgstr "ECDH: нерозпізнане ім'Ñ ÐºÑ€Ð¸Ð²Ð¾Ñ—: %s" -#: libpq/be-secure-openssl.c:1216 +#: libpq/be-secure-openssl.c:1433 #, c-format msgid "ECDH: could not create key" msgstr "ECDH: не вдалоÑÑ Ñтворити ключ" -#: libpq/be-secure-openssl.c:1244 +#: libpq/be-secure-openssl.c:1461 msgid "no SSL error reported" msgstr "немає Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку SSL" -#: libpq/be-secure-openssl.c:1248 +#: libpq/be-secure-openssl.c:1479 #, c-format msgid "SSL error code %lu" msgstr "Код помилки SSL %lu" -#: libpq/be-secure-openssl.c:1402 +#: libpq/be-secure-openssl.c:1636 #, c-format msgid "could not create BIO" msgstr "неможливо Ñтворити BIO" -#: libpq/be-secure-openssl.c:1412 +#: libpq/be-secure-openssl.c:1646 #, c-format msgid "could not get NID for ASN1_OBJECT object" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ NID Ð´Ð»Ñ Ð¾Ð±'єкту ASN1_OBJECT" -#: libpq/be-secure-openssl.c:1420 +#: libpq/be-secure-openssl.c:1654 #, c-format msgid "could not convert NID %d to an ASN1_OBJECT structure" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ NID %d в Ñтруктуру ASN1_OBJECT" -#: libpq/be-secure.c:209 libpq/be-secure.c:305 -#, c-format -msgid "terminating connection due to unexpected postmaster exit" -msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· неочікуване Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ð³Ð¾ процеÑу" - -#: libpq/crypt.c:49 +#: libpq/crypt.c:48 #, c-format msgid "Role \"%s\" does not exist." msgstr "Роль \"%s\" не Ñ–Ñнує." -#: libpq/crypt.c:59 +#: libpq/crypt.c:58 #, c-format msgid "User \"%s\" has no password assigned." msgstr "КориÑтувач \"%s\" не має паролÑ." -#: libpq/crypt.c:77 +#: libpq/crypt.c:76 #, c-format msgid "User \"%s\" has an expired password." msgstr "КориÑтувач \"%s\" має проÑтрочений пароль." -#: libpq/crypt.c:181 +#: libpq/crypt.c:182 #, c-format msgid "User \"%s\" has a password that cannot be used with MD5 authentication." msgstr "КориÑтувач \"%s\" має пароль, Ñкий не можна викориÑтовувати з автентифікацією MD5." -#: libpq/crypt.c:202 libpq/crypt.c:244 libpq/crypt.c:264 +#: libpq/crypt.c:203 libpq/crypt.c:245 libpq/crypt.c:265 #, c-format msgid "Password does not match for user \"%s\"." msgstr "Пароль не підходить Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\"." -#: libpq/crypt.c:283 +#: libpq/crypt.c:284 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "Пароль кориÑтувача \"%s\" предÑтавлений в нерозпізнаному форматі." -#: libpq/hba.c:209 +#: libpq/hba.c:327 +#, c-format +msgid "invalid regular expression \"%s\": %s" +msgstr "недійÑний регулÑрний вираз \"%s\": %s" + +#: libpq/hba.c:329 libpq/hba.c:661 libpq/hba.c:1245 libpq/hba.c:1265 +#: libpq/hba.c:1288 libpq/hba.c:1301 libpq/hba.c:1354 libpq/hba.c:1382 +#: libpq/hba.c:1390 libpq/hba.c:1402 libpq/hba.c:1423 libpq/hba.c:1436 +#: libpq/hba.c:1461 libpq/hba.c:1488 libpq/hba.c:1500 libpq/hba.c:1559 +#: libpq/hba.c:1579 libpq/hba.c:1593 libpq/hba.c:1613 libpq/hba.c:1624 +#: libpq/hba.c:1639 libpq/hba.c:1658 libpq/hba.c:1674 libpq/hba.c:1686 +#: libpq/hba.c:1752 libpq/hba.c:1765 libpq/hba.c:1787 libpq/hba.c:1799 +#: libpq/hba.c:1817 libpq/hba.c:1867 libpq/hba.c:1911 libpq/hba.c:1922 +#: libpq/hba.c:1938 libpq/hba.c:1955 libpq/hba.c:1966 libpq/hba.c:1985 +#: libpq/hba.c:2001 libpq/hba.c:2017 libpq/hba.c:2076 libpq/hba.c:2093 +#: libpq/hba.c:2106 libpq/hba.c:2118 libpq/hba.c:2137 libpq/hba.c:2223 +#: libpq/hba.c:2241 libpq/hba.c:2335 libpq/hba.c:2354 libpq/hba.c:2383 +#: libpq/hba.c:2396 libpq/hba.c:2419 libpq/hba.c:2441 libpq/hba.c:2455 +#: tsearch/ts_locale.c:241 +#, c-format +msgid "line %d of configuration file \"%s\"" +msgstr "Ñ€Ñдок %d файла конфігурації \"%s\"" + +#: libpq/hba.c:457 #, c-format -msgid "authentication file token too long, skipping: \"%s\"" -msgstr "занадто довгий маркер у файлі автентифікації, пропуÑкаєтьÑÑ: \"%s\"" +msgid "skipping missing authentication file \"%s\"" +msgstr "пропуÑкаєтьÑÑ Ð²Ñ–Ð´Ñутній файл автентифікації \"%s\"" -#: libpq/hba.c:381 +#: libpq/hba.c:609 #, c-format -msgid "could not open secondary authentication file \"@%s\" as \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ додатковий файл автентифікації \"@%s\" as \"%s\": %m" +msgid "could not open file \"%s\": maximum nesting depth exceeded" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": макÑимальну глибину Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð¾" -#: libpq/hba.c:832 +#: libpq/hba.c:1216 #, c-format msgid "error enumerating network interfaces: %m" msgstr "помилка Ð¿ÐµÑ€ÐµÑ€Ð°Ñ…ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ€ÐµÐ¶ÐµÐ²Ð¸Ñ… інтерфейÑів: %m" #. translator: the second %s is a list of auth methods -#: libpq/hba.c:859 +#: libpq/hba.c:1243 #, c-format msgid "authentication option \"%s\" is only valid for authentication methods %s" msgstr "параметр автентифікації \"%s\" припуÑтимий лише Ð´Ð»Ñ ÑпоÑобів автентифікації %s" -#: libpq/hba.c:861 libpq/hba.c:881 libpq/hba.c:916 libpq/hba.c:967 -#: libpq/hba.c:981 libpq/hba.c:1005 libpq/hba.c:1013 libpq/hba.c:1025 -#: libpq/hba.c:1046 libpq/hba.c:1059 libpq/hba.c:1079 libpq/hba.c:1101 -#: libpq/hba.c:1113 libpq/hba.c:1172 libpq/hba.c:1192 libpq/hba.c:1206 -#: libpq/hba.c:1226 libpq/hba.c:1237 libpq/hba.c:1252 libpq/hba.c:1271 -#: libpq/hba.c:1287 libpq/hba.c:1299 libpq/hba.c:1336 libpq/hba.c:1377 -#: libpq/hba.c:1390 libpq/hba.c:1412 libpq/hba.c:1424 libpq/hba.c:1442 -#: libpq/hba.c:1492 libpq/hba.c:1536 libpq/hba.c:1547 libpq/hba.c:1563 -#: libpq/hba.c:1580 libpq/hba.c:1591 libpq/hba.c:1610 libpq/hba.c:1626 -#: libpq/hba.c:1642 libpq/hba.c:1700 libpq/hba.c:1717 libpq/hba.c:1730 -#: libpq/hba.c:1742 libpq/hba.c:1761 libpq/hba.c:1847 libpq/hba.c:1865 -#: libpq/hba.c:1959 libpq/hba.c:1978 libpq/hba.c:2007 libpq/hba.c:2020 -#: libpq/hba.c:2043 libpq/hba.c:2065 libpq/hba.c:2079 tsearch/ts_locale.c:232 -#, c-format -msgid "line %d of configuration file \"%s\"" -msgstr "Ñ€Ñдок %d файла конфігурації \"%s\"" - -#: libpq/hba.c:879 +#: libpq/hba.c:1263 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "ÑпоÑіб автентифікації \"%s\" потребує аргумент \"%s\" Ð´Ð»Ñ Ð²ÑтановленнÑ" -#: libpq/hba.c:903 +#: libpq/hba.c:1287 #, c-format -msgid "missing entry in file \"%s\" at end of line %d" -msgstr "відÑутнє Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð² файлі \"%s\" в кінці Ñ€Ñдка %d" +msgid "missing entry at end of line" +msgstr "відÑутній Ð·Ð°Ð¿Ð¸Ñ Ð² кінці Ñ€Ñдка" -#: libpq/hba.c:915 +#: libpq/hba.c:1300 #, c-format msgid "multiple values in ident field" msgstr "кілька значень в полі ident" -#: libpq/hba.c:965 +#: libpq/hba.c:1352 #, c-format msgid "multiple values specified for connection type" msgstr "кілька значень вказано Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ підключеннÑ" -#: libpq/hba.c:966 +#: libpq/hba.c:1353 #, c-format msgid "Specify exactly one connection type per line." msgstr "Вкажіть в Ñ€Ñдку єдиний тип підключеннÑ." -#: libpq/hba.c:980 -#, c-format -msgid "local connections are not supported by this build" -msgstr "локальні Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð½Ðµ підтримуютьÑÑ Ñ†Ñ–Ñ”ÑŽ збіркою" - -#: libpq/hba.c:1003 +#: libpq/hba.c:1380 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "Ð·Ð°Ð¿Ð¸Ñ hostssl не збігаєтьÑÑ, тому що протокол SSL вимкнутий" -#: libpq/hba.c:1004 +#: libpq/hba.c:1381 #, c-format -msgid "Set ssl = on in postgresql.conf." -msgstr "Ð’Ñтановіть ssl = on в postgresql.conf." +msgid "Set \"ssl = on\" in postgresql.conf." +msgstr "Ð’Ñтановіть \"ssl = on\" в postgresql.conf." -#: libpq/hba.c:1012 +#: libpq/hba.c:1389 #, c-format msgid "hostssl record cannot match because SSL is not supported by this build" msgstr "Ð·Ð°Ð¿Ð¸Ñ hostssl не збігаєтьÑÑ, тому що SSL не підтримуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ збіркою" -#: libpq/hba.c:1024 +#: libpq/hba.c:1401 #, c-format msgid "hostgssenc record cannot match because GSSAPI is not supported by this build" msgstr "Ð·Ð°Ð¿Ð¸Ñ hostgssenc не може збігатиÑÑŒ, оÑкільки GSSAPI не підтримуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ збіркою" -#: libpq/hba.c:1044 +#: libpq/hba.c:1421 #, c-format msgid "invalid connection type \"%s\"" msgstr "неприпуÑтимий тип Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ \"%s\"" -#: libpq/hba.c:1058 +#: libpq/hba.c:1435 #, c-format msgid "end-of-line before database specification" msgstr "кінець Ñ€Ñдка перед визначеннÑм бази даних" -#: libpq/hba.c:1078 +#: libpq/hba.c:1460 #, c-format msgid "end-of-line before role specification" msgstr "кінець Ñ€Ñдка перед визначеннÑм ролі" -#: libpq/hba.c:1100 +#: libpq/hba.c:1487 #, c-format msgid "end-of-line before IP address specification" msgstr "кінець Ñ€Ñдка перед визначеннÑм IP-адреÑ" -#: libpq/hba.c:1111 +#: libpq/hba.c:1498 #, c-format msgid "multiple values specified for host address" msgstr "Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑи хоÑта вказано кілька значень" -#: libpq/hba.c:1112 +#: libpq/hba.c:1499 #, c-format msgid "Specify one address range per line." msgstr "Вкажіть один діапазон адреÑи в Ñ€Ñдку." -#: libpq/hba.c:1170 +#: libpq/hba.c:1557 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "неприпуÑтима IP адреÑа \"%s\": %s" -#: libpq/hba.c:1190 +#: libpq/hba.c:1577 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "визначити одночаÑно Ñ–Ð¼â€™Ñ Ñ…Ð¾Ñта Ñ– маÑку CIDR не можна: \"%s\"" -#: libpq/hba.c:1204 +#: libpq/hba.c:1591 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "неприпуÑтима маÑка CIDR в адреÑÑ– \"%s\"" -#: libpq/hba.c:1224 +#: libpq/hba.c:1611 #, c-format msgid "end-of-line before netmask specification" msgstr "кінець Ñ€Ñдка перед визначеннÑм маÑки мережі" -#: libpq/hba.c:1225 +#: libpq/hba.c:1612 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "Вкажіть діапазон Ð°Ð´Ñ€ÐµÑ Ð² нотації CIDR або надайте окрему маÑку мережі." -#: libpq/hba.c:1236 +#: libpq/hba.c:1623 #, c-format msgid "multiple values specified for netmask" msgstr "Ð´Ð»Ñ Ð¼Ð°Ñки мережі вказано декілька значень" -#: libpq/hba.c:1250 +#: libpq/hba.c:1637 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "неприпуÑтима маÑка IP \"%s\": %s" -#: libpq/hba.c:1270 +#: libpq/hba.c:1657 #, c-format msgid "IP address and mask do not match" msgstr "IP-адреÑа Ñ– маÑка не збігаютьÑÑ" -#: libpq/hba.c:1286 +#: libpq/hba.c:1673 #, c-format msgid "end-of-line before authentication method" msgstr "кінець Ñ€Ñдка перед ÑпоÑобом автентифікації" -#: libpq/hba.c:1297 +#: libpq/hba.c:1684 #, c-format msgid "multiple values specified for authentication type" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ автентифікації вказано декілька значень" -#: libpq/hba.c:1298 +#: libpq/hba.c:1685 #, c-format msgid "Specify exactly one authentication type per line." msgstr "Вкажіть у Ñ€Ñдку єдиний тип автентифікації." -#: libpq/hba.c:1375 +#: libpq/hba.c:1750 #, c-format msgid "invalid authentication method \"%s\"" msgstr "неприпуÑтимий ÑпоÑіб автентифікації \"%s\"" -#: libpq/hba.c:1388 +#: libpq/hba.c:1763 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "неприпуÑтимий ÑпоÑіб автентифікації \"%s\": не підтримуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ збіркою" -#: libpq/hba.c:1411 +#: libpq/hba.c:1786 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ gssapi Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… Ñокетів не підтримуєтьÑÑ" -#: libpq/hba.c:1423 +#: libpq/hba.c:1798 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ peer підтримуєтьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… Ñокетів" -#: libpq/hba.c:1441 +#: libpq/hba.c:1816 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ cert підтримуєтьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½ÑŒ hostssl" -#: libpq/hba.c:1491 +#: libpq/hba.c:1866 #, c-format msgid "authentication option not in name=value format: %s" msgstr "параметр автентифікації вказаний не в форматі ім’Ñ=значеннÑ: %s" -#: libpq/hba.c:1535 +#: libpq/hba.c:1910 #, c-format msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" msgstr "не можна викориÑтовувати ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter або ldapurl разом з ldapprefix" -#: libpq/hba.c:1546 +#: libpq/hba.c:1921 #, c-format msgid "authentication method \"ldap\" requires argument \"ldapbasedn\", \"ldapprefix\", or \"ldapsuffix\" to be set" msgstr "ÑпоÑіб автентифікації \"ldap\" потребує вÑтановити аргумент \"ldapbasedn\", \"ldapprefix\" або \"ldapsuffix\"" -#: libpq/hba.c:1562 +#: libpq/hba.c:1937 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "не можна викориÑтовувати ldapsearchattribute разом з ldapsearchfilter" -#: libpq/hba.c:1579 +#: libpq/hba.c:1954 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "ÑпиÑок Ñерверів RADIUS не може бути порожнім" -#: libpq/hba.c:1590 +#: libpq/hba.c:1965 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "ÑпиÑок Ñекретів RADIUS не може бути порожнім" -#: libpq/hba.c:1607 +#: libpq/hba.c:1982 #, c-format msgid "the number of RADIUS secrets (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "кількіÑть Ñекретів RADIUS (%d) повинна бути 1 або дорівнювати кількоÑті Ñерверів RADIUS (%d)" -#: libpq/hba.c:1623 +#: libpq/hba.c:1998 #, c-format msgid "the number of RADIUS ports (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "кількіÑть портів RADIUS (%d) повинна бути 1 або дорівнювати кількоÑті Ñерверів RADIUS (%d)" -#: libpq/hba.c:1639 +#: libpq/hba.c:2014 #, c-format msgid "the number of RADIUS identifiers (%d) must be 1 or the same as the number of RADIUS servers (%d)" msgstr "кількіÑть ідентифікаторів RADIUS (%d) повинна бути 1 або дорівнювати кількоÑті Ñерверів RADIUS (%d)" -#: libpq/hba.c:1690 +#: libpq/hba.c:2066 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident, peer, gssapi, sspi Ñ– cert" -#: libpq/hba.c:1699 +#: libpq/hba.c:2075 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "clientcert може бути налаштовано лише Ð´Ð»Ñ Ñ€Ñдків \"hostssl\"" -#: libpq/hba.c:1716 +#: libpq/hba.c:2092 #, c-format msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "clientcert приймає лише \"verify-full\" під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"cert\"" -#: libpq/hba.c:1729 +#: libpq/hba.c:2105 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ clientcert: \"%s\"" -#: libpq/hba.c:1741 +#: libpq/hba.c:2117 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "clientname можна налаштувати лише Ð´Ð»Ñ Ñ€Ñдків \"hostssl\"" -#: libpq/hba.c:1760 +#: libpq/hba.c:2136 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ clientname: \"%s\"" -#: libpq/hba.c:1793 +#: libpq/hba.c:2169 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ URL-адреÑу LDAP \"%s\": %s" -#: libpq/hba.c:1804 +#: libpq/hba.c:2180 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "непідтримувана Ñхема в URL-адреÑÑ– LDAP: %s" -#: libpq/hba.c:1828 +#: libpq/hba.c:2204 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "URL-адреÑа LDAP не підтримуєтьÑÑ Ð½Ð° цій платформі" -#: libpq/hba.c:1846 +#: libpq/hba.c:2222 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "недійÑне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ldapscheme: \"%s\"" -#: libpq/hba.c:1864 +#: libpq/hba.c:2240 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "недійÑний номер порту LDAP: \"%s\"" -#: libpq/hba.c:1910 libpq/hba.c:1917 +#: libpq/hba.c:2286 libpq/hba.c:2293 msgid "gssapi and sspi" msgstr "gssapi Ñ– sspi" -#: libpq/hba.c:1926 libpq/hba.c:1935 +#: libpq/hba.c:2302 libpq/hba.c:2311 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:1957 +#: libpq/hba.c:2333 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑпиÑок Ñерверів RADIUS \"%s\"" -#: libpq/hba.c:2005 +#: libpq/hba.c:2381 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑпиÑок портів RADIUS \"%s\"" -#: libpq/hba.c:2019 +#: libpq/hba.c:2395 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "недійÑний номер порту RADIUS: \"%s\"" -#: libpq/hba.c:2041 +#: libpq/hba.c:2417 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑпиÑок Ñекретів RADIUS \"%s\"" -#: libpq/hba.c:2063 +#: libpq/hba.c:2439 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑпиÑок ідентифікаторів RADIUS \"%s\"" -#: libpq/hba.c:2077 +#: libpq/hba.c:2453 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "нерозпізнане Ñ–Ð¼â€™Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° автентифікації: \"%s\"" -#: libpq/hba.c:2223 utils/adt/hbafuncs.c:376 guc-file.l:631 -#, c-format -msgid "could not open configuration file \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл конфігурації \"%s\": %m" - -#: libpq/hba.c:2274 +#: libpq/hba.c:2645 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "файл конфігурації \"%s\" не міÑтить елементів" -#: libpq/hba.c:2374 -#, c-format -msgid "invalid regular expression \"%s\": %s" -msgstr "недійÑний регулÑрний вираз \"%s\": %s" - -#: libpq/hba.c:2437 +#: libpq/hba.c:2798 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "помилка при пошуку за регулÑрним виразом Ð´Ð»Ñ \"%s\": %s" -#: libpq/hba.c:2456 +#: libpq/hba.c:2822 #, c-format msgid "regular expression \"%s\" has no subexpressions as requested by backreference in \"%s\"" msgstr "регулÑрний вираз \"%s не міÑтить підвиразів, необхідних Ð´Ð»Ñ Ð·Ð²Ð¾Ñ€Ð¾Ñ‚Ð½Ð¾Ð³Ð¾ поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² \"%s\"" -#: libpq/hba.c:2552 +#: libpq/hba.c:2925 #, c-format msgid "provided user name (%s) and authenticated user name (%s) do not match" msgstr "вказане ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача (%s) Ñ– автентифіковане ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача (%s) не збігаютьÑÑ" -#: libpq/hba.c:2572 +#: libpq/hba.c:2945 #, c-format msgid "no match in usermap \"%s\" for user \"%s\" authenticated as \"%s\"" msgstr "немає відповідноÑті у файлі зіÑтавлень \"%s\" Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача \"%s\" автентифікованого Ñк \"%s\"" -#: libpq/hba.c:2605 utils/adt/hbafuncs.c:512 +#: libpq/pqcomm.c:211 libpq/pqcomm.c:219 libpq/pqcomm.c:250 libpq/pqcomm.c:259 +#: libpq/pqcomm.c:1648 libpq/pqcomm.c:1693 libpq/pqcomm.c:1733 +#: libpq/pqcomm.c:1777 libpq/pqcomm.c:1816 libpq/pqcomm.c:1855 +#: libpq/pqcomm.c:1891 libpq/pqcomm.c:1930 #, c-format -msgid "could not open usermap file \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл usermap: \"%s\": %m" +msgid "%s(%s) failed: %m" +msgstr "%s(%s) помилка: %m" -#: libpq/pqcomm.c:204 +#: libpq/pqcomm.c:296 #, c-format msgid "could not set socket to nonblocking mode: %m" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²ÐµÑти Ñокет у неблокуючий режим: %m" -#: libpq/pqcomm.c:362 +#: libpq/pqcomm.c:456 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "ШлÑÑ… Unix-Ñокету \"%s\" занадто довгий (макÑимум %d байтів)" -#: libpq/pqcomm.c:383 +#: libpq/pqcomm.c:476 #, c-format msgid "could not translate host name \"%s\", service \"%s\" to address: %s" msgstr "не вдалоÑÑŒ переклаÑти ім'Ñ Ñ…Ð¾Ñта \"%s\", Ñлужби \"%s\" в адреÑу: %s" -#: libpq/pqcomm.c:387 +#: libpq/pqcomm.c:480 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "не вдалоÑÑŒ переклаÑти Ñлужбу \"%s\" в адреÑу: %s" -#: libpq/pqcomm.c:414 +#: libpq/pqcomm.c:502 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "не вдалоÑÑŒ прив'ÑзатиÑÑŒ до вÑÑ–Ñ… запитаних адреÑ: MAXLISTEN (%d) перевищено" -#: libpq/pqcomm.c:423 +#: libpq/pqcomm.c:511 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:427 +#: libpq/pqcomm.c:514 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:432 +#: libpq/pqcomm.c:517 msgid "Unix" msgstr "Unix" -#: libpq/pqcomm.c:437 +#: libpq/pqcomm.c:521 #, c-format msgid "unrecognized address family %d" msgstr "нерозпізнане ÑімейÑтво адреÑів %d" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:463 +#: libpq/pqcomm.c:545 #, c-format msgid "could not create %s socket for address \"%s\": %m" msgstr "не вдалоÑÑŒ Ñтворити Ñокет %s Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑи \"%s\": %m" #. translator: third %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:489 libpq/pqcomm.c:507 +#: libpq/pqcomm.c:574 libpq/pqcomm.c:592 #, c-format msgid "%s(%s) failed for %s address \"%s\": %m" msgstr "%s(%s) помилка %s Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑи \"%s\": %m" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:530 +#: libpq/pqcomm.c:615 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "не вдалоÑÑŒ прив'ÑзатиÑÑŒ до адреÑи %s \"%s\": %m" -#: libpq/pqcomm.c:534 +#: libpq/pqcomm.c:619 #, c-format msgid "Is another postmaster already running on port %d?" msgstr "Можливо інший Ð¿Ñ€Ð¾Ñ†ÐµÑ postmaster вже виконуєтьÑÑ Ð½Ð° порті %d?" -#: libpq/pqcomm.c:536 +#: libpq/pqcomm.c:621 #, c-format msgid "Is another postmaster already running on port %d? If not, wait a few seconds and retry." msgstr "Можливо порт %d вже зайнÑтий іншим процеÑом postmaster? Якщо ні, почекайте пару Ñекунд Ñ– Ñпробуйте знову." #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:569 +#: libpq/pqcomm.c:650 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "не вдалоÑÑŒ проÑлухати на адреÑÑ– %s \"%s\": %m" -#: libpq/pqcomm.c:578 +#: libpq/pqcomm.c:658 #, c-format msgid "listening on Unix socket \"%s\"" msgstr "проÑлуховувати UNIX Ñокет \"%s\"" #. translator: first %s is IPv4 or IPv6 -#: libpq/pqcomm.c:584 +#: libpq/pqcomm.c:663 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "проÑлуховувати %s адреÑу \"%s\", порт %d" -#: libpq/pqcomm.c:675 +#: libpq/pqcomm.c:753 #, c-format msgid "group \"%s\" does not exist" msgstr "група \"%s\" не Ñ–Ñнує" -#: libpq/pqcomm.c:685 +#: libpq/pqcomm.c:763 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "не вдалоÑÑŒ вÑтановити групу Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": %m" -#: libpq/pqcomm.c:696 +#: libpq/pqcomm.c:774 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "не вдалоÑÑŒ вÑтановити дозволи Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": %m" -#: libpq/pqcomm.c:726 +#: libpq/pqcomm.c:803 #, c-format msgid "could not accept new connection: %m" msgstr "не вдалоÑÑŒ прийнÑти нове підключеннÑ: %m" -#: libpq/pqcomm.c:766 libpq/pqcomm.c:775 libpq/pqcomm.c:807 libpq/pqcomm.c:817 -#: libpq/pqcomm.c:1642 libpq/pqcomm.c:1687 libpq/pqcomm.c:1727 -#: libpq/pqcomm.c:1771 libpq/pqcomm.c:1810 libpq/pqcomm.c:1849 -#: libpq/pqcomm.c:1885 libpq/pqcomm.c:1924 -#, c-format -msgid "%s(%s) failed: %m" -msgstr "%s(%s) помилка: %m" - -#: libpq/pqcomm.c:921 +#: libpq/pqcomm.c:885 #, c-format msgid "there is no client connection" msgstr "немає клієнтÑького підключеннÑ" -#: libpq/pqcomm.c:972 libpq/pqcomm.c:1068 +#: libpq/pqcomm.c:941 libpq/pqcomm.c:1042 #, c-format msgid "could not receive data from client: %m" msgstr "не вдалоÑÑŒ отримати дані від клієнта: %m" -#: libpq/pqcomm.c:1173 tcop/postgres.c:4359 +#: libpq/pqcomm.c:1149 tcop/postgres.c:4533 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· втрату Ñинхронізації протоколу" -#: libpq/pqcomm.c:1239 +#: libpq/pqcomm.c:1215 #, c-format msgid "unexpected EOF within message length word" msgstr "неочікуваний EOF в Ñлові довжини повідомленнÑ" -#: libpq/pqcomm.c:1249 +#: libpq/pqcomm.c:1225 #, c-format msgid "invalid message length" msgstr "неприпуÑтима довжина повідомленнÑ" -#: libpq/pqcomm.c:1271 libpq/pqcomm.c:1284 +#: libpq/pqcomm.c:1247 libpq/pqcomm.c:1260 #, c-format msgid "incomplete message from client" msgstr "неповне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ клієнта" -#: libpq/pqcomm.c:1395 +#: libpq/pqcomm.c:1401 #, c-format msgid "could not send data to client: %m" msgstr "не вдалоÑÑŒ надіÑлати дані клієнту: %m" -#: libpq/pqcomm.c:1610 +#: libpq/pqcomm.c:1616 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s) помилка: код помилки %d" -#: libpq/pqcomm.c:1699 +#: libpq/pqcomm.c:1705 #, c-format msgid "setting the keepalive idle time is not supported" msgstr "вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу проÑтою keepalive не підтримуєтьÑÑ" -#: libpq/pqcomm.c:1783 libpq/pqcomm.c:1858 libpq/pqcomm.c:1933 +#: libpq/pqcomm.c:1789 libpq/pqcomm.c:1864 libpq/pqcomm.c:1939 #, c-format msgid "%s(%s) not supported" msgstr "%s(%s) не підтримуєтьÑÑ" -#: libpq/pqformat.c:406 +#: libpq/pqformat.c:404 #, c-format msgid "no data left in message" msgstr "у Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ залишилоÑÑŒ даних" -#: libpq/pqformat.c:517 libpq/pqformat.c:535 libpq/pqformat.c:556 -#: utils/adt/arrayfuncs.c:1482 utils/adt/rowtypes.c:588 +#: libpq/pqformat.c:515 libpq/pqformat.c:533 libpq/pqformat.c:554 +#: utils/adt/array_userfuncs.c:797 utils/adt/arrayfuncs.c:1481 +#: utils/adt/rowtypes.c:613 #, c-format msgid "insufficient data left in message" msgstr "недоÑтатьно даних залишилоÑÑŒ в повідомленні" -#: libpq/pqformat.c:597 libpq/pqformat.c:626 +#: libpq/pqformat.c:595 libpq/pqformat.c:624 #, c-format msgid "invalid string in message" msgstr "неприпуÑтимий Ñ€Ñдок в повідомленні" -#: libpq/pqformat.c:642 +#: libpq/pqformat.c:640 #, c-format msgid "invalid message format" msgstr "неприпуÑтимий формат повідомленнÑ" -#: main/main.c:239 +#: main/main.c:236 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: помилка WSAStartup: %d\n" -#: main/main.c:350 +#: main/main.c:324 #, c-format -msgid "" -"%s is the PostgreSQL server.\n" -"\n" -msgstr "" -"%s - Ñервер PostgreSQL.\n" -"\n" +msgid "%s is the PostgreSQL server.\n\n" +msgstr "%s - Ñервер PostgreSQL.\n\n" -#: main/main.c:351 +#: main/main.c:325 #, c-format -msgid "" -"Usage:\n" -" %s [OPTION]...\n" -"\n" -msgstr "" -"ВикориÑтаннÑ:\n" -" %s [OPTION]...\n" -"\n" +msgid "Usage:\n" +" %s [OPTION]...\n\n" +msgstr "ВикориÑтаннÑ:\n" +" %s [OPTION]...\n\n" -#: main/main.c:352 +#: main/main.c:326 #, c-format msgid "Options:\n" msgstr "Параметри:\n" -#: main/main.c:353 +#: main/main.c:327 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS чиÑло Ñпільних буферів\n" -#: main/main.c:354 +#: main/main.c:328 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NAME=VALUE вÑтановити параметр під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ\n" -#: main/main.c:355 +#: main/main.c:329 #, c-format msgid " -C NAME print value of run-time parameter, then exit\n" msgstr " -C NAME вивеÑти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ– вийти\n" -#: main/main.c:356 +#: main/main.c:330 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 рівень налагодженнÑ\n" -#: main/main.c:357 +#: main/main.c:331 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D DATADIR каталог бази даних\n" -#: main/main.c:358 +#: main/main.c:332 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e викориÑтати європейÑький формат дат (DMY)\n" -#: main/main.c:359 +#: main/main.c:333 #, c-format msgid " -F turn fsync off\n" msgstr " -F вимкнути fsync\n" -#: main/main.c:360 +#: main/main.c:334 #, c-format msgid " -h HOSTNAME host name or IP address to listen on\n" msgstr " -h HOSTNAME Ñ–Ð¼â€™Ñ Ñ…Ð¾Ñта або IP-адреÑа Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑлуховуваннÑ\n" -#: main/main.c:361 +#: main/main.c:335 #, c-format -msgid " -i enable TCP/IP connections\n" -msgstr " -i активувати Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ TCP/IP\n" +msgid " -i enable TCP/IP connections (deprecated)\n" +msgstr " -i активувати Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ TCP/IP (заÑтаріле)\n" -#: main/main.c:362 +#: main/main.c:336 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k DIRECTORY Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Unix-Ñокетів\n" -#: main/main.c:364 +#: main/main.c:338 #, c-format msgid " -l enable SSL connections\n" msgstr " -l активувати SSL-підключеннÑ\n" -#: main/main.c:366 +#: main/main.c:340 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N MAX-CONNECT макÑимальне чиÑло дозволених підключень\n" -#: main/main.c:367 +#: main/main.c:341 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT номер порту Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑлуховуваннÑ\n" -#: main/main.c:368 +#: main/main.c:342 #, c-format msgid " -s show statistics after each query\n" msgstr " -s відображувати ÑтатиÑтику піÑÐ»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ запиту\n" -#: main/main.c:369 +#: main/main.c:343 #, c-format msgid " -S WORK-MEM set amount of memory for sorts (in kB)\n" msgstr " -S WORK-MEM вказати обÑÑг пам'Ñті Ð´Ð»Ñ ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ (в КБ)\n" -#: main/main.c:370 +#: main/main.c:344 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" -#: main/main.c:371 +#: main/main.c:345 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAME=VALUE вÑтановити параметр під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ\n" -#: main/main.c:372 +#: main/main.c:346 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config опиÑати параметри конфігурації Ñ– вийти\n" -#: main/main.c:373 +#: main/main.c:347 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати довідку Ñ– вийти\n" -#: main/main.c:375 +#: main/main.c:349 #, c-format -msgid "" -"\n" +msgid "\n" "Developer options:\n" -msgstr "" -"\n" +msgstr "\n" "Параметри Ð´Ð»Ñ Ñ€Ð¾Ð·Ñ€Ð¾Ð±Ð½Ð¸ÐºÑ–Ð²:\n" -#: main/main.c:376 -#, c-format -msgid " -f s|i|n|m|h forbid use of some plan types\n" -msgstr " -f s|i|n|m|h заборонити викориÑÑ‚Ð°Ð½Ð½Ñ Ð´ÐµÑких типів плану\n" - -#: main/main.c:377 +#: main/main.c:350 #, c-format -msgid " -n do not reinitialize shared memory after abnormal exit\n" -msgstr " -n не повторювати ініціалізацію Ñпільної пам'Ñті піÑÐ»Ñ Ð½ÐµÐ½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ виходу\n" +msgid " -f s|i|o|b|t|n|m|h forbid use of some plan types\n" +msgstr " -f s|i|o|b|t|n|m|h заборонити викориÑтовувати деÑкі типи плану\n" -#: main/main.c:378 +#: main/main.c:351 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O дозволити змінювати Ñтруктуру ÑиÑтемних таблиць\n" -#: main/main.c:379 +#: main/main.c:352 #, c-format msgid " -P disable system indexes\n" msgstr " -P вимкнути ÑиÑтемні індекÑи\n" -#: main/main.c:380 +#: main/main.c:353 #, c-format msgid " -t pa|pl|ex show timings after each query\n" msgstr " -t pa|pl|ex показувати Ñ‡Ð°Ñ Ð¿Ñ–ÑÐ»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ запиту\n" -#: main/main.c:381 +#: main/main.c:354 #, c-format -msgid " -T send SIGSTOP to all backend processes if one dies\n" -msgstr " -T надіÑлати SIGSTOP уÑім внутрішнім процеÑам, Ñкщо один вимкнетьÑÑ\n" +msgid " -T send SIGABRT to all backend processes if one dies\n" +msgstr " -T надіÑлати SIGABRT уÑім внутрішнім процеÑам, Ñкщо один вимкнетьÑÑ\n" -#: main/main.c:382 +#: main/main.c:355 #, c-format msgid " -W NUM wait NUM seconds to allow attach from a debugger\n" msgstr " -W NUM очікувати NUM Ñекунд, щоб дозволити Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ налагоджувача\n" -#: main/main.c:384 +#: main/main.c:357 #, c-format -msgid "" -"\n" +msgid "\n" "Options for single-user mode:\n" -msgstr "" -"\n" +msgstr "\n" "Параметри Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾ÐºÐ¾Ñ€Ð¸Ñтувацького режиму:\n" -#: main/main.c:385 +#: main/main.c:358 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr " --single уÑтановка однокориÑтувацького режиму (цей аргумент повинен бути першим)\n" -#: main/main.c:386 +#: main/main.c:359 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME Ñ–Ð¼â€™Ñ Ð±Ð°Ð·Ð¸ даних (за замовчуваннÑм - ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача)\n" -#: main/main.c:387 +#: main/main.c:360 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 змінити рівень налагодженнÑ\n" -#: main/main.c:388 +#: main/main.c:361 #, c-format msgid " -E echo statement before execution\n" msgstr " -E інÑÑ‚Ñ€ÑƒÐºÑ†Ñ–Ñ Ð²Ñ–Ð´Ð»ÑƒÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ виконаннÑм\n" -#: main/main.c:389 +#: main/main.c:362 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr " -j не викориÑтовувати новий Ñ€Ñдок Ñк роздільник інтерактивних запитів\n" -#: main/main.c:390 main/main.c:396 +#: main/main.c:363 main/main.c:369 #, c-format msgid " -r FILENAME send stdout and stderr to given file\n" msgstr " -r FILENAME надіÑлати stdout Ñ– stderr до вказаного файлу\n" -#: main/main.c:392 +#: main/main.c:365 #, c-format -msgid "" -"\n" +msgid "\n" "Options for bootstrapping mode:\n" -msgstr "" -"\n" +msgstr "\n" "Параметри Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ початкового завантаженнÑ:\n" -#: main/main.c:393 +#: main/main.c:366 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot уÑтановка режиму початкового Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ (цей аргумент повинен бути першим)\n" -#: main/main.c:394 +#: main/main.c:367 #, c-format msgid " --check selects check mode (must be first argument)\n" msgstr " --check обирає режим перевірки (має бути першим аргументом)\n" -#: main/main.c:395 +#: main/main.c:368 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr " DBNAME ім'Ñ Ð±Ð°Ð·Ð¸ даних (обов'Ñзковий аргумент у режимі початкового завантаженнÑ)\n" -#: main/main.c:398 +#: main/main.c:371 #, c-format -msgid "" -"\n" +msgid "\n" "Please read the documentation for the complete list of run-time\n" "configuration settings and how to set them on the command line or in\n" -"the configuration file.\n" -"\n" +"the configuration file.\n\n" "Report bugs to <%s>.\n" -msgstr "" -"\n" -"Будь-лаÑка прочитайте інÑтрукцію Ð´Ð»Ñ Ð¿Ð¾Ð²Ð½Ð¾Ð³Ð¾ ÑпиÑку параметрів конфігурації Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ– Ñ—Ñ… вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñƒ командний Ñ€Ñдок або в файл конфігурації.\n" -"\n" +msgstr "\n" +"Будь-лаÑка прочитайте інÑтрукцію Ð´Ð»Ñ Ð¿Ð¾Ð²Ð½Ð¾Ð³Ð¾ ÑпиÑку параметрів конфігурації Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñ– Ñ—Ñ… вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñƒ командний Ñ€Ñдок або в файл конфігурації.\n\n" "Про помилки повідомлÑйте <%s>.\n" -#: main/main.c:402 +#: main/main.c:375 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" -#: main/main.c:413 +#: main/main.c:386 #, c-format -msgid "" -"\"root\" execution of the PostgreSQL server is not permitted.\n" +msgid "\"root\" execution of the PostgreSQL server is not permitted.\n" "The server must be started under an unprivileged user ID to prevent\n" "possible system security compromise. See the documentation for\n" "more information on how to properly start the server.\n" -msgstr "" -"ЗапуÑкати Ñервер PostgreSQL під іменем \"root\" не дозволено.\n" +msgstr "ЗапуÑкати Ñервер PostgreSQL під іменем \"root\" не дозволено.\n" "Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð¿Ñ€Ð¾Ð¼ÐµÑ‚Ð°Ñ†Ñ–Ñ— ÑиÑтеми безпеки Ñервер повинен запуÑкати непривілейований кориÑтувач. ДивітьÑÑ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–ÑŽ, щоб дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про те, Ñк правильно запуÑтити Ñервер.\n" -#: main/main.c:430 +#: main/main.c:403 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: дійÑний Ñ– ефективний ID кориÑтувача повинні збігатиÑÑ\n" -#: main/main.c:437 +#: main/main.c:410 #, c-format -msgid "" -"Execution of PostgreSQL by a user with administrative permissions is not\n" +msgid "Execution of PostgreSQL by a user with administrative permissions is not\n" "permitted.\n" "The server must be started under an unprivileged user ID to prevent\n" "possible system security compromises. See the documentation for\n" "more information on how to properly start the server.\n" -msgstr "" -"ЗапуÑкати PostgreSQL під іменем кориÑтувача з правами адмініÑтратора не дозволено.\n" +msgstr "ЗапуÑкати PostgreSQL під іменем кориÑтувача з правами адмініÑтратора не дозволено.\n" "Ð”Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾Ñ— компрометації ÑиÑтеми безпеки Ñервер повинен запуÑкати непривілейований кориÑтувач. ДивітьÑÑ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ñ–ÑŽ, щоб дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ про те, Ñк правильно запуÑтити Ñервер.\n" #: nodes/extensible.c:66 @@ -15504,20 +16248,15 @@ msgstr "розширений тип вузла \"%s\" вже Ñ–Ñнує" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "Методи розширеного вузла \"%s\" не зареєÑтровані" -#: nodes/makefuncs.c:151 statistics/extended_stats.c:2336 +#: nodes/makefuncs.c:152 nodes/makefuncs.c:178 statistics/extended_stats.c:2310 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не має Ñкладеного типу" -#: nodes/makefuncs.c:905 -#, c-format -msgid "unrecognized JSON encoding: %s" -msgstr "нерозпізнане JSON кодуваннÑ: %s" - -#: nodes/nodeFuncs.c:114 nodes/nodeFuncs.c:145 parser/parse_coerce.c:2567 -#: parser/parse_coerce.c:2705 parser/parse_coerce.c:2752 -#: parser/parse_expr.c:2085 parser/parse_func.c:710 parser/parse_oper.c:883 -#: utils/fmgr/funcapi.c:627 +#: nodes/nodeFuncs.c:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2604 +#: parser/parse_coerce.c:2742 parser/parse_coerce.c:2789 +#: parser/parse_expr.c:2120 parser/parse_func.c:710 parser/parse_oper.c:869 +#: utils/fmgr/funcapi.c:669 #, c-format msgid "could not find array type for data type %s" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ тип маÑиву Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ даних %s" @@ -15532,173 +16271,184 @@ msgstr "портал \"%s\" з параметрами: %s" msgid "unnamed portal with parameters: %s" msgstr "портал без імені з параметрами: %s" -#: optimizer/path/joinrels.c:855 +#: optimizer/path/joinrels.c:973 #, c-format msgid "FULL JOIN is only supported with merge-joinable or hash-joinable join conditions" msgstr "FULL JOIN підтримуєтьÑÑ Ð»Ð¸ÑˆÐµ з умовами, Ñкі допуÑкають з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð»Ð¸Ñ‚Ñ‚Ñм або хеш-з'єднаннÑм" +#: optimizer/plan/createplan.c:7175 parser/parse_merge.c:203 +#: rewrite/rewriteHandler.c:1680 +#, c-format +msgid "cannot execute MERGE on relation \"%s\"" +msgstr "не можна виконати MERGE Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" + #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/initsplan.c:1192 +#: optimizer/plan/initsplan.c:1407 #, c-format msgid "%s cannot be applied to the nullable side of an outer join" msgstr "%s не можна заÑтоÑовувати до нульової Ñторони зовнішнього з’єднаннÑ" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: optimizer/plan/planner.c:1341 parser/analyze.c:1714 parser/analyze.c:1970 -#: parser/analyze.c:3152 +#: optimizer/plan/planner.c:1380 parser/analyze.c:1771 parser/analyze.c:2029 +#: parser/analyze.c:3247 #, c-format msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s неÑуміÑно з UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:2048 optimizer/plan/planner.c:3704 +#: optimizer/plan/planner.c:2121 optimizer/plan/planner.c:4108 #, c-format msgid "could not implement GROUP BY" msgstr "не вдалоÑÑ Ñ€ÐµÐ°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ GROUP BY" -#: optimizer/plan/planner.c:2049 optimizer/plan/planner.c:3705 -#: optimizer/plan/planner.c:4348 optimizer/prep/prepunion.c:1046 +#: optimizer/plan/planner.c:2122 optimizer/plan/planner.c:4109 +#: optimizer/plan/planner.c:4790 optimizer/prep/prepunion.c:1320 #, c-format msgid "Some of the datatypes only support hashing, while others only support sorting." msgstr "ДеÑкі типи даних підтримують лише хешуваннÑ, в той Ñ‡Ð°Ñ Ñк інші підтримують тільки ÑортуваннÑ." -#: optimizer/plan/planner.c:4347 +#: optimizer/plan/planner.c:4789 #, c-format msgid "could not implement DISTINCT" msgstr "не вдалоÑÑ Ñ€ÐµÐ°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ DISTINCT" -#: optimizer/plan/planner.c:5468 +#: optimizer/plan/planner.c:6134 #, c-format msgid "could not implement window PARTITION BY" msgstr "не вдалоÑÑ Ñ€ÐµÐ°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ PARTITION BY Ð´Ð»Ñ Ð²Ñ–ÐºÐ½Ð°" -#: optimizer/plan/planner.c:5469 +#: optimizer/plan/planner.c:6135 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Стовпці, що розділÑють вікна, повинні мати типи даних з можливіÑтю ÑортуваннÑ." -#: optimizer/plan/planner.c:5473 +#: optimizer/plan/planner.c:6139 #, c-format msgid "could not implement window ORDER BY" msgstr "не вдалоÑÑ Ñ€ÐµÐ°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ORDER BY Ð´Ð»Ñ Ð²Ñ–ÐºÐ½Ð°" -#: optimizer/plan/planner.c:5474 +#: optimizer/plan/planner.c:6140 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Стовпці, що впорÑдковують вікна, повинні мати типи даних з можливіÑтю ÑортуваннÑ." -#: optimizer/prep/prepunion.c:509 +#: optimizer/prep/prepunion.c:467 #, c-format msgid "could not implement recursive UNION" msgstr "не вдалоÑÑ Ñ€ÐµÐ°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ рекурÑивний UNION" -#: optimizer/prep/prepunion.c:510 +#: optimizer/prep/prepunion.c:468 #, c-format msgid "All column datatypes must be hashable." msgstr "УÑÑ– Ñтовпці повинні мати типи даних з можливіÑтю хешуваннÑ." #. translator: %s is UNION, INTERSECT, or EXCEPT -#: optimizer/prep/prepunion.c:1045 +#: optimizer/prep/prepunion.c:1319 #, c-format msgid "could not implement %s" msgstr "не вдалоÑÑ Ñ€ÐµÐ°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ %s" -#: optimizer/util/clauses.c:4854 +#: optimizer/util/clauses.c:4963 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "Впроваджена в код SQL-Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\"" -#: optimizer/util/plancat.c:133 +#: optimizer/util/plancat.c:153 #, c-format msgid "cannot access temporary or unlogged relations during recovery" msgstr "отримати доÑтуп до тимчаÑових або нежурнальованих відношень під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ можна" -#: optimizer/util/plancat.c:673 +#: optimizer/util/plancat.c:768 #, c-format msgid "whole row unique index inference specifications are not supported" msgstr "вказівки з поÑиланнÑм на веÑÑŒ Ñ€Ñдок Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ унікального індекÑу не підтримуютьÑÑ" -#: optimizer/util/plancat.c:690 +#: optimizer/util/plancat.c:785 #, c-format msgid "constraint in ON CONFLICT clause has no associated index" msgstr "з обмеженнÑм в реченні ON CONFLICT не пов'Ñзаний індекÑ" -#: optimizer/util/plancat.c:740 +#: optimizer/util/plancat.c:835 #, c-format msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATE не підтримуєтьÑÑ Ð· обмеженнÑми-винÑтками" -#: optimizer/util/plancat.c:845 +#: optimizer/util/plancat.c:945 #, c-format msgid "there is no unique or exclusion constraint matching the ON CONFLICT specification" msgstr "немає унікального Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ обмеженнÑ-Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ð³Ð¾ Ñпецифікації ON CONFLICT" -#: parser/analyze.c:780 parser/analyze.c:1494 +#: parser/analyze.c:824 parser/analyze.c:1550 #, c-format msgid "VALUES lists must all be the same length" msgstr "СпиÑки VALUES повинні мати однакову довжину" -#: parser/analyze.c:981 +#: parser/analyze.c:1027 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERT міÑтить більше виразів, ніж цільових Ñтовпців" -#: parser/analyze.c:999 +#: parser/analyze.c:1045 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERT міÑтить більше цільових Ñтовпців, ніж виразів" -#: parser/analyze.c:1003 +#: parser/analyze.c:1049 #, c-format msgid "The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?" msgstr "Джерелом даних Ñ” вираз Ñ€Ñдка, Ñкий міÑтить Ñтільки ж Ñтовпців, Ñкільки потребуєтьÑÑ Ð´Ð»Ñ INSERT. Ви випадково викориÑтовували додаткові дужки?" -#: parser/analyze.c:1302 parser/analyze.c:1687 +#: parser/analyze.c:1357 parser/analyze.c:1744 #, c-format msgid "SELECT ... INTO is not allowed here" msgstr "SELECT ... INTO не дозволÑєтьÑÑ Ñ‚ÑƒÑ‚" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:1617 parser/analyze.c:3363 +#: parser/analyze.c:1673 parser/analyze.c:3479 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%s не можна заÑтоÑовувати до VALUES" -#: parser/analyze.c:1853 +#: parser/analyze.c:1911 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "неприпуÑтиме Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ UNION/INTERSECT/EXCEPT ORDER BY" -#: parser/analyze.c:1854 +#: parser/analyze.c:1912 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "Дозволено викориÑÑ‚Ð°Ð½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ імен Ñтовпців, але не виразів або функцій." -#: parser/analyze.c:1855 +#: parser/analyze.c:1913 #, c-format msgid "Add the expression/function to every SELECT, or move the UNION into a FROM clause." msgstr "Додайте вираз/Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð´Ð¾ кожного SELECT, або переміÑтіть UNION у Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ FROM." -#: parser/analyze.c:1960 +#: parser/analyze.c:2019 #, c-format msgid "INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT" msgstr "INTO дозволÑєтьÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ лише до першого SELECT в UNION/INTERSECT/EXCEPT" -#: parser/analyze.c:2032 +#: parser/analyze.c:2091 #, c-format msgid "UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level" msgstr "УчаÑник інÑтрукції UNION/INTERSECT/EXCEPT не може поÑилатиÑÑŒ на інші відноÑини на тому ж рівні" -#: parser/analyze.c:2119 +#: parser/analyze.c:2178 #, c-format msgid "each %s query must have the same number of columns" msgstr "кожен %s запит повинен мати однакову кількіÑть Ñтовпців" -#: parser/analyze.c:2523 +#: parser/analyze.c:2535 +#, c-format +msgid "SET target columns cannot be qualified with the relation name." +msgstr "Цільові Ñтовпці SET не можуть бути кваліфіковані за допомогою імені відношеннÑ." + +#: parser/analyze.c:2589 #, c-format msgid "RETURNING must have at least one column" msgstr "Ð’ RETURNING повинен бути мінімум один Ñтовпець" -#: parser/analyze.c:2626 +#: parser/analyze.c:2692 #, c-format msgid "assignment source returned %d column" msgid_plural "assignment source returned %d columns" @@ -15707,548 +16457,548 @@ msgstr[1] "джерело Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÑƒÐ»Ð¾ %d Ñтов msgstr[2] "джерело Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÑƒÐ»Ð¾ %d Ñтовпців" msgstr[3] "джерело Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÑƒÐ»Ð¾ %d Ñтовпців" -#: parser/analyze.c:2687 +#: parser/analyze.c:2753 #, c-format msgid "variable \"%s\" is of type %s but expression is of type %s" msgstr "змінна \"%s\" має тип %s, але вираз має тип %s" #. translator: %s is a SQL keyword -#: parser/analyze.c:2811 parser/analyze.c:2819 +#: parser/analyze.c:2878 parser/analyze.c:2886 #, c-format msgid "cannot specify both %s and %s" msgstr "не можна вказати Ñк %s, так Ñ– %s" -#: parser/analyze.c:2839 +#: parser/analyze.c:2906 #, c-format msgid "DECLARE CURSOR must not contain data-modifying statements in WITH" msgstr "DECLARE CURSOR не повинен міÑтити операторів, Ñкі змінюють дані в WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2847 +#: parser/analyze.c:2914 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %s не підтримуєтьÑÑ" -#: parser/analyze.c:2850 +#: parser/analyze.c:2917 #, c-format msgid "Holdable cursors must be READ ONLY." msgstr "КурÑори, що зберігаютьÑÑ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ– бути READ ONLY." #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2858 +#: parser/analyze.c:2925 #, c-format msgid "DECLARE SCROLL CURSOR ... %s is not supported" msgstr "DECLARE SCROLL CURSOR ... %s не підтримуєтьÑÑ" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:2869 +#: parser/analyze.c:2936 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %s не Ñ” припуÑтимим" -#: parser/analyze.c:2872 +#: parser/analyze.c:2939 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "Ðечутливі курÑори повинні бути READ ONLY." -#: parser/analyze.c:2938 +#: parser/analyze.c:3033 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "в матеріалізованих поданнÑÑ… не повинні викориÑтовуватиÑÑŒ оператори, Ñкі змінюють дані в WITH" -#: parser/analyze.c:2948 +#: parser/analyze.c:3043 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "в матеріалізованих поданнÑÑ… не повинні викориÑтовуватиÑÑŒ тимчаÑові таблиці або поданнÑ" -#: parser/analyze.c:2958 +#: parser/analyze.c:3053 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "визначати матеріалізовані Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð· зв'Ñзаними параметрами не можна" -#: parser/analyze.c:2970 +#: parser/analyze.c:3065 #, c-format msgid "materialized views cannot be unlogged" msgstr "матеріалізовані Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð½Ðµ можуть бути нежурнальованими" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3159 +#: parser/analyze.c:3254 #, c-format msgid "%s is not allowed with DISTINCT clause" msgstr "%s не дозволÑєтьÑÑ Ð· реченнÑм DISTINCT" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3166 +#: parser/analyze.c:3261 #, c-format msgid "%s is not allowed with GROUP BY clause" msgstr "%s не дозволÑєтьÑÑ Ð· реченнÑм GROUP BY" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3173 +#: parser/analyze.c:3268 #, c-format msgid "%s is not allowed with HAVING clause" msgstr "%s не дозволÑєтьÑÑ Ð· реченнÑм HAVING" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3180 +#: parser/analyze.c:3275 #, c-format msgid "%s is not allowed with aggregate functions" msgstr "%s не дозволÑєтьÑÑ Ð· агрегатними функціÑми" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3187 +#: parser/analyze.c:3282 #, c-format msgid "%s is not allowed with window functions" msgstr "%s не дозволÑєтьÑÑ Ð· віконними функціÑми" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3194 +#: parser/analyze.c:3289 #, c-format msgid "%s is not allowed with set-returning functions in the target list" msgstr "%s не дозволÑєтьÑÑ Ð· функціÑми, Ñкі повертають безлічі, в цільовому ÑпиÑку" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3286 +#: parser/analyze.c:3388 #, c-format msgid "%s must specify unqualified relation names" msgstr "Ð´Ð»Ñ %s потрібно вказати некваліфіковані імена відноÑин" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3336 +#: parser/analyze.c:3452 #, c-format msgid "%s cannot be applied to a join" msgstr "%s не можна заÑтоÑовувати до з'єднаннÑ" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3345 +#: parser/analyze.c:3461 #, c-format msgid "%s cannot be applied to a function" msgstr "%s не можна заÑтоÑовувати до функції" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3354 +#: parser/analyze.c:3470 #, c-format msgid "%s cannot be applied to a table function" msgstr "%s не можна заÑтоÑовувати до табличної функції" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3372 +#: parser/analyze.c:3488 #, c-format msgid "%s cannot be applied to a WITH query" msgstr "%s не можна заÑтоÑовувати до запиту WITH" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3381 +#: parser/analyze.c:3497 #, c-format msgid "%s cannot be applied to a named tuplestore" msgstr "%s не можна заÑтоÑовувати до іменованого джерела кортежів" #. translator: %s is a SQL row locking clause such as FOR UPDATE -#: parser/analyze.c:3401 +#: parser/analyze.c:3517 #, c-format msgid "relation \"%s\" in %s clause not found in FROM clause" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" в реченні %s не знайдено в реченні FROM" -#: parser/parse_agg.c:220 parser/parse_oper.c:227 +#: parser/parse_agg.c:210 parser/parse_oper.c:215 #, c-format msgid "could not identify an ordering operator for type %s" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ оператора ÑортуваннÑ" -#: parser/parse_agg.c:222 +#: parser/parse_agg.c:212 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "Ðгрегатним функціÑм з DISTINCT необхідно Ñортувати Ñ—Ñ… вхідні дані." -#: parser/parse_agg.c:257 +#: parser/parse_agg.c:270 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "GROUPING повинно міÑтити меньше, ніж 32 аргумента" -#: parser/parse_agg.c:360 +#: parser/parse_agg.c:373 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "агрегатні функції не дозволÑютьÑÑ Ð² умовах JOIN" -#: parser/parse_agg.c:362 +#: parser/parse_agg.c:375 msgid "grouping operations are not allowed in JOIN conditions" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ дозволÑютьÑÑ Ð² умовах JOIN" -#: parser/parse_agg.c:374 +#: parser/parse_agg.c:385 msgid "aggregate functions are not allowed in FROM clause of their own query level" msgstr "агрегатні функції не можна заÑтоÑовувати в реченні FROM Ñ—Ñ… Ñ€Ñ–Ð²Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ" -#: parser/parse_agg.c:376 +#: parser/parse_agg.c:387 msgid "grouping operations are not allowed in FROM clause of their own query level" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати в реченні FROM Ñ—Ñ… Ñ€Ñ–Ð²Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ" -#: parser/parse_agg.c:381 +#: parser/parse_agg.c:392 msgid "aggregate functions are not allowed in functions in FROM" msgstr "агрегатні функції не можна заÑтоÑовувати у функціÑÑ… у FROM" -#: parser/parse_agg.c:383 +#: parser/parse_agg.c:394 msgid "grouping operations are not allowed in functions in FROM" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати у функціÑÑ… у FROM" -#: parser/parse_agg.c:391 +#: parser/parse_agg.c:402 msgid "aggregate functions are not allowed in policy expressions" msgstr "агрегатні функції не можна заÑтоÑовувати у виразах політики" -#: parser/parse_agg.c:393 +#: parser/parse_agg.c:404 msgid "grouping operations are not allowed in policy expressions" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати у виразах політики" -#: parser/parse_agg.c:410 +#: parser/parse_agg.c:421 msgid "aggregate functions are not allowed in window RANGE" msgstr "агрегатні функції не можна заÑтоÑовувати у вікні RANGE " -#: parser/parse_agg.c:412 +#: parser/parse_agg.c:423 msgid "grouping operations are not allowed in window RANGE" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати у вікні RANGE" -#: parser/parse_agg.c:417 +#: parser/parse_agg.c:428 msgid "aggregate functions are not allowed in window ROWS" msgstr "агрегатні функції не можна заÑтоÑовувати у вікні ROWS" -#: parser/parse_agg.c:419 +#: parser/parse_agg.c:430 msgid "grouping operations are not allowed in window ROWS" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати у вікні ROWS" -#: parser/parse_agg.c:424 +#: parser/parse_agg.c:435 msgid "aggregate functions are not allowed in window GROUPS" msgstr "агрегатні функції не можна заÑтоÑовувати у вікні GROUPS" -#: parser/parse_agg.c:426 +#: parser/parse_agg.c:437 msgid "grouping operations are not allowed in window GROUPS" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати у вікні GROUPS" -#: parser/parse_agg.c:439 +#: parser/parse_agg.c:450 msgid "aggregate functions are not allowed in MERGE WHEN conditions" msgstr "агрегатні функції не можна заÑтоÑовувати в умовах MERGE WHEN" -#: parser/parse_agg.c:441 +#: parser/parse_agg.c:452 msgid "grouping operations are not allowed in MERGE WHEN conditions" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати в умовах MERGE WHEN" -#: parser/parse_agg.c:467 +#: parser/parse_agg.c:479 msgid "aggregate functions are not allowed in check constraints" msgstr "агрегатні функції не можна заÑтоÑовувати в перевірці обмежень" -#: parser/parse_agg.c:469 +#: parser/parse_agg.c:481 msgid "grouping operations are not allowed in check constraints" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати в перевірці обмежень" -#: parser/parse_agg.c:476 +#: parser/parse_agg.c:488 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "агрегатні функції не можна заÑтоÑовувати у виразах DEFAULT" -#: parser/parse_agg.c:478 +#: parser/parse_agg.c:490 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати у виразах DEFAULT" -#: parser/parse_agg.c:483 +#: parser/parse_agg.c:495 msgid "aggregate functions are not allowed in index expressions" msgstr "агрегатні функції не можна заÑтоÑовувати у виразах індекÑів" -#: parser/parse_agg.c:485 +#: parser/parse_agg.c:497 msgid "grouping operations are not allowed in index expressions" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати у виразах індекÑів" -#: parser/parse_agg.c:490 +#: parser/parse_agg.c:502 msgid "aggregate functions are not allowed in index predicates" msgstr "агрегатні функції не можна заÑтоÑовувати в предикатах індекÑів" -#: parser/parse_agg.c:492 +#: parser/parse_agg.c:504 msgid "grouping operations are not allowed in index predicates" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати в предикатах індекÑів" -#: parser/parse_agg.c:497 +#: parser/parse_agg.c:509 msgid "aggregate functions are not allowed in statistics expressions" msgstr "агрегатні функції не можна заÑтоÑовувати у виразах ÑтатиÑтики" -#: parser/parse_agg.c:499 +#: parser/parse_agg.c:511 msgid "grouping operations are not allowed in statistics expressions" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати у виразах ÑтатиÑтики" -#: parser/parse_agg.c:504 +#: parser/parse_agg.c:516 msgid "aggregate functions are not allowed in transform expressions" msgstr "агрегатні функції не можна заÑтоÑовувати у виразах перетворюваннÑ" -#: parser/parse_agg.c:506 +#: parser/parse_agg.c:518 msgid "grouping operations are not allowed in transform expressions" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати у виразах перетворюваннÑ" -#: parser/parse_agg.c:511 +#: parser/parse_agg.c:523 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "агрегатні функції не можна заÑтоÑовувати в параметрах EXECUTE" -#: parser/parse_agg.c:513 +#: parser/parse_agg.c:525 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати в параметрах EXECUTE" -#: parser/parse_agg.c:518 +#: parser/parse_agg.c:530 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "агрегатні функції не можна заÑтоÑовувати в умовах Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² WHEN" -#: parser/parse_agg.c:520 +#: parser/parse_agg.c:532 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати в умовах Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² WHEN" -#: parser/parse_agg.c:525 +#: parser/parse_agg.c:537 msgid "aggregate functions are not allowed in partition bound" msgstr "агрегатні функції не можна заÑтоÑовувати в границі Ñекції" -#: parser/parse_agg.c:527 +#: parser/parse_agg.c:539 msgid "grouping operations are not allowed in partition bound" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати в границі Ñекції" -#: parser/parse_agg.c:532 +#: parser/parse_agg.c:544 msgid "aggregate functions are not allowed in partition key expressions" msgstr "агрегатні функції не можна заÑтоÑовувати у виразах ключа ÑекціонуваннÑ" -#: parser/parse_agg.c:534 +#: parser/parse_agg.c:546 msgid "grouping operations are not allowed in partition key expressions" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати у виразах ключа ÑекціонуваннÑ" -#: parser/parse_agg.c:540 +#: parser/parse_agg.c:552 msgid "aggregate functions are not allowed in column generation expressions" msgstr "агрегатні функції не можна заÑтоÑовувати у виразах генерації Ñтовпців" -#: parser/parse_agg.c:542 +#: parser/parse_agg.c:554 msgid "grouping operations are not allowed in column generation expressions" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати у виразах генерації Ñтовпців" -#: parser/parse_agg.c:548 +#: parser/parse_agg.c:560 msgid "aggregate functions are not allowed in CALL arguments" msgstr "агрегатні функції не можна заÑтоÑовувати в аргументах CALL" -#: parser/parse_agg.c:550 +#: parser/parse_agg.c:562 msgid "grouping operations are not allowed in CALL arguments" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати в аргументах CALL" -#: parser/parse_agg.c:556 +#: parser/parse_agg.c:568 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "агрегатні функції не можна заÑтоÑовувати в умовах COPY FROM WHERE" -#: parser/parse_agg.c:558 +#: parser/parse_agg.c:570 msgid "grouping operations are not allowed in COPY FROM WHERE conditions" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати в умовах COPY FROM WHERE" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:585 parser/parse_clause.c:1837 +#: parser/parse_agg.c:597 parser/parse_clause.c:1962 #, c-format msgid "aggregate functions are not allowed in %s" msgstr "агрегатні функції не можна заÑтоÑовувати в %s" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:588 +#: parser/parse_agg.c:600 #, c-format msgid "grouping operations are not allowed in %s" msgstr "операції Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна заÑтоÑовувати в %s" -#: parser/parse_agg.c:689 +#: parser/parse_agg.c:701 #, c-format msgid "outer-level aggregate cannot contain a lower-level variable in its direct arguments" msgstr "агрегат зовнішнього Ñ€Ñ–Ð²Ð½Ñ Ð½Ðµ може міÑтити змінну нижчого Ñ€Ñ–Ð²Ð½Ñ Ñƒ Ñвоїх аргументах" -#: parser/parse_agg.c:768 +#: parser/parse_agg.c:779 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "виклики агрегатної функції не можуть міÑтити викликів функції, що повертають множину" -#: parser/parse_agg.c:769 parser/parse_expr.c:1736 parser/parse_expr.c:2218 -#: parser/parse_func.c:883 +#: parser/parse_agg.c:780 parser/parse_expr.c:1762 parser/parse_expr.c:2253 +#: parser/parse_func.c:885 #, c-format msgid "You might be able to move the set-returning function into a LATERAL FROM item." msgstr "Можливо переміÑтити функцію, що повертає множину, в елемент LATERAL FROM." -#: parser/parse_agg.c:774 +#: parser/parse_agg.c:785 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "виклики агрегатних функцій не можуть міÑтити виклики віконних функцій" -#: parser/parse_agg.c:853 +#: parser/parse_agg.c:864 msgid "window functions are not allowed in JOIN conditions" msgstr "віконні функції не можна заÑтоÑовувати в умовах JOIN" -#: parser/parse_agg.c:860 +#: parser/parse_agg.c:871 msgid "window functions are not allowed in functions in FROM" msgstr "віконні функції не можна заÑтоÑовувати у функціÑÑ… в FROM" -#: parser/parse_agg.c:866 +#: parser/parse_agg.c:877 msgid "window functions are not allowed in policy expressions" msgstr "віконні функції не можна заÑтоÑовувати у виразах політики" -#: parser/parse_agg.c:879 +#: parser/parse_agg.c:890 msgid "window functions are not allowed in window definitions" msgstr "віконні функції не можна заÑтоÑовувати у визначенні вікна" -#: parser/parse_agg.c:890 +#: parser/parse_agg.c:901 msgid "window functions are not allowed in MERGE WHEN conditions" msgstr "віконні функції не можна заÑтоÑовувати в умовах MERGE WHEN" -#: parser/parse_agg.c:914 +#: parser/parse_agg.c:926 msgid "window functions are not allowed in check constraints" msgstr "віконні функції не можна заÑтоÑовувати в перевірках обмежень" -#: parser/parse_agg.c:918 +#: parser/parse_agg.c:930 msgid "window functions are not allowed in DEFAULT expressions" msgstr "віконні функції не можна заÑтоÑовувати у виразах DEFAULT" -#: parser/parse_agg.c:921 +#: parser/parse_agg.c:933 msgid "window functions are not allowed in index expressions" msgstr "віконні функції не можна заÑтоÑовувати у виразах індекÑів" -#: parser/parse_agg.c:924 +#: parser/parse_agg.c:936 msgid "window functions are not allowed in statistics expressions" msgstr "віконні функції не можна заÑтоÑовувати у виразах ÑтатиÑтики" -#: parser/parse_agg.c:927 +#: parser/parse_agg.c:939 msgid "window functions are not allowed in index predicates" msgstr "віконні функції не можна заÑтоÑовувати в предикатах індекÑів" -#: parser/parse_agg.c:930 +#: parser/parse_agg.c:942 msgid "window functions are not allowed in transform expressions" msgstr "віконні функції не можна заÑтоÑовувати у виразах перетворюваннÑ" -#: parser/parse_agg.c:933 +#: parser/parse_agg.c:945 msgid "window functions are not allowed in EXECUTE parameters" msgstr "віконні функції не можна заÑтоÑовувати в параметрах EXECUTE" -#: parser/parse_agg.c:936 +#: parser/parse_agg.c:948 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "віконні функції не можна заÑтоÑовувати в умовах WHEN Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð²" -#: parser/parse_agg.c:939 +#: parser/parse_agg.c:951 msgid "window functions are not allowed in partition bound" msgstr "віконні функції не можна заÑтоÑовувати в границі Ñекції" -#: parser/parse_agg.c:942 +#: parser/parse_agg.c:954 msgid "window functions are not allowed in partition key expressions" msgstr "віконні функції не можна заÑтоÑовувати у виразах ключа ÑекціонуваннÑ" -#: parser/parse_agg.c:945 +#: parser/parse_agg.c:957 msgid "window functions are not allowed in CALL arguments" msgstr "віконні функції не можна заÑтоÑовувати в аргументах CALL" -#: parser/parse_agg.c:948 +#: parser/parse_agg.c:960 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "віконні функції не можна заÑтоÑовувати в умовах COPY FROM WHERE" -#: parser/parse_agg.c:951 +#: parser/parse_agg.c:963 msgid "window functions are not allowed in column generation expressions" msgstr "віконні функції не можна заÑтоÑовувати у виразах генерації Ñтовпців" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_agg.c:974 parser/parse_clause.c:1846 +#: parser/parse_agg.c:986 parser/parse_clause.c:1971 #, c-format msgid "window functions are not allowed in %s" msgstr "віконні функції не можна заÑтоÑовувати в %s" -#: parser/parse_agg.c:1008 parser/parse_clause.c:2679 +#: parser/parse_agg.c:1020 parser/parse_clause.c:2804 #, c-format msgid "window \"%s\" does not exist" msgstr "вікно \"%s\" не Ñ–Ñнує" -#: parser/parse_agg.c:1092 +#: parser/parse_agg.c:1108 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "забагато наборів Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ (макÑимум 4096)" -#: parser/parse_agg.c:1232 +#: parser/parse_agg.c:1248 #, c-format msgid "aggregate functions are not allowed in a recursive query's recursive term" msgstr "агрегатні функції не дозволені у рекурÑивному терміні рекурÑивного запиту" -#: parser/parse_agg.c:1425 +#: parser/parse_agg.c:1441 #, c-format msgid "column \"%s.%s\" must appear in the GROUP BY clause or be used in an aggregate function" msgstr "Ñтовпець \"%s.%s\" повинен з'ÑвлÑтиÑÑ Ñƒ реченні Група BY або викориÑтовуватиÑÑ Ð² агрегатній функції" -#: parser/parse_agg.c:1428 +#: parser/parse_agg.c:1444 #, c-format msgid "Direct arguments of an ordered-set aggregate must use only grouped columns." msgstr "ПрÑмі аргументи Ñортувального агрегату можуть викориÑтовувати лише згруповані Ñтовпці." -#: parser/parse_agg.c:1433 +#: parser/parse_agg.c:1449 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "вкладений запит викориÑтовує не згруповані Ñтовпці \"%s.%s\" з зовнішнього запиту" -#: parser/parse_agg.c:1597 +#: parser/parse_agg.c:1613 #, c-format msgid "arguments to GROUPING must be grouping expressions of the associated query level" msgstr "аргументами Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°ÑŽÑ‚ÑŒ бути вирази Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²'Ñзаного Ñ€Ñ–Ð²Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ" -#: parser/parse_clause.c:190 +#: parser/parse_clause.c:193 #, c-format msgid "relation \"%s\" cannot be the target of a modifying statement" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не може бути метою модифікованої інÑтрукції" -#: parser/parse_clause.c:570 parser/parse_clause.c:598 parser/parse_func.c:2554 +#: parser/parse_clause.c:569 parser/parse_clause.c:597 parser/parse_func.c:2553 #, c-format msgid "set-returning functions must appear at top level of FROM" msgstr "функції, що повертають множину, мають з'ÑвлÑтиÑÑ Ð½Ð° вищому рівні FROM" -#: parser/parse_clause.c:610 +#: parser/parse_clause.c:609 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "кілька ÑпиÑків з визначеннÑм Ñтовпців не дозволені Ð´Ð»Ñ Ñ‚Ð¾Ñ— Ñамої функції" -#: parser/parse_clause.c:643 +#: parser/parse_clause.c:642 #, c-format msgid "ROWS FROM() with multiple functions cannot have a column definition list" msgstr "ROWS FROM() з декількома функціÑми не можуть мати ÑпиÑок з визначеннÑм Ñтовпців" -#: parser/parse_clause.c:644 +#: parser/parse_clause.c:643 #, c-format msgid "Put a separate column definition list for each function inside ROWS FROM()." msgstr "Укладіть окремі ÑпиÑки з визначеннÑм Ñтовпців Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ— з функцій вÑередині ROWS FROM()." -#: parser/parse_clause.c:650 +#: parser/parse_clause.c:649 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "UNNEST() з кількома аргументами не можуть мати ÑпиÑок з визначеннÑм Ñтовпців" -#: parser/parse_clause.c:651 +#: parser/parse_clause.c:650 #, c-format msgid "Use separate UNNEST() calls inside ROWS FROM(), and attach a column definition list to each one." msgstr "ВикориÑтайте окремі виклики UNNEST() вÑередині ROWS FROM() Ñ– підключіть ÑпиÑок з визначеннÑм Ñтовпців до кожного." -#: parser/parse_clause.c:658 +#: parser/parse_clause.c:657 #, c-format msgid "WITH ORDINALITY cannot be used with a column definition list" msgstr "WITH ORDINALITY не можна викориÑтовувати з ÑпиÑком з визначеннÑм Ñтовпців" -#: parser/parse_clause.c:659 +#: parser/parse_clause.c:658 #, c-format msgid "Put the column definition list inside ROWS FROM()." msgstr "ПоміÑтіть ÑпиÑок з визначеннÑм Ñтовпців вÑередину ROWS FROM()." -#: parser/parse_clause.c:761 +#: parser/parse_clause.c:762 parser/parse_jsontable.c:295 #, c-format msgid "only one FOR ORDINALITY column is allowed" msgstr "FOR ORDINALITY дозволÑєтьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑтовпцÑ" -#: parser/parse_clause.c:822 parser/parse_jsontable.c:445 +#: parser/parse_clause.c:823 #, c-format msgid "column name \"%s\" is not unique" msgstr "ім'Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" не Ñ” унікальним" -#: parser/parse_clause.c:864 +#: parser/parse_clause.c:865 #, c-format msgid "namespace name \"%s\" is not unique" msgstr "ім'Ñ Ð¿Ñ€Ð¾Ñтору імен \"%s\" не Ñ” унікальним" -#: parser/parse_clause.c:874 +#: parser/parse_clause.c:875 #, c-format msgid "only one default namespace is allowed" msgstr "дозволено тільки один проÑтір імен за замовчуваннÑм" -#: parser/parse_clause.c:934 +#: parser/parse_clause.c:935 #, c-format msgid "tablesample method %s does not exist" msgstr "метод %s Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ð¸Ð±Ñ–Ñ€ÐºÐ¸ не Ñ–Ñнує" -#: parser/parse_clause.c:956 +#: parser/parse_clause.c:957 #, c-format msgid "tablesample method %s requires %d argument, not %d" msgid_plural "tablesample method %s requires %d arguments, not %d" @@ -16257,204 +17007,204 @@ msgstr[1] "метод %s Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ð¸Ð±Ñ–Ñ€ÐºÐ¸ потребу msgstr[2] "метод %s Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ð¸Ð±Ñ–Ñ€ÐºÐ¸ потребує аргументів: %d, отримано: %d" msgstr[3] "метод %s Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ð¸Ð±Ñ–Ñ€ÐºÐ¸ потребує аргументів: %d, отримано: %d" -#: parser/parse_clause.c:990 +#: parser/parse_clause.c:991 #, c-format msgid "tablesample method %s does not support REPEATABLE" msgstr "метод %s Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ð¸Ð±Ñ–Ñ€ÐºÐ¸ не підтримує REPEATABLE" -#: parser/parse_clause.c:1140 +#: parser/parse_clause.c:1144 #, c-format msgid "TABLESAMPLE clause can only be applied to tables and materialized views" msgstr "Ð ÐµÑ‡ÐµÐ½Ð½Ñ TABLESAMPLE можна заÑтоÑовувати лише до таблиць або матеріалізованих подань" -#: parser/parse_clause.c:1330 +#: parser/parse_clause.c:1331 #, c-format msgid "column name \"%s\" appears more than once in USING clause" msgstr "Ñ–Ð¼â€™Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" з'ÑвлÑєтьÑÑ Ñƒ реченні USING неодноразово" -#: parser/parse_clause.c:1345 +#: parser/parse_clause.c:1346 #, c-format msgid "common column name \"%s\" appears more than once in left table" msgstr "Ñ–Ð¼â€™Ñ Ñпільного ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" з'ÑвлÑєтьÑÑ Ñƒ таблиці зліва неодноразово" -#: parser/parse_clause.c:1354 +#: parser/parse_clause.c:1355 #, c-format msgid "column \"%s\" specified in USING clause does not exist in left table" msgstr "в таблиці зліва не Ñ–Ñнує Ñтовпець \"%s\", вказаний в реченні USING" -#: parser/parse_clause.c:1369 +#: parser/parse_clause.c:1370 #, c-format msgid "common column name \"%s\" appears more than once in right table" msgstr "Ñ–Ð¼â€™Ñ Ñпільного ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" з'ÑвлÑєтьÑÑ Ð² таблиці Ñправа неодноразово" -#: parser/parse_clause.c:1378 +#: parser/parse_clause.c:1379 #, c-format msgid "column \"%s\" specified in USING clause does not exist in right table" msgstr "в таблиці Ñправа не Ñ–Ñнує Ñтовпець \"%s\", вказаний в реченні USING" -#: parser/parse_clause.c:1782 +#: parser/parse_clause.c:1907 #, c-format msgid "row count cannot be null in FETCH FIRST ... WITH TIES clause" msgstr "кількіÑть Ñ€Ñдків не може бути NULL в операторі FETCH FIRST ... WITH TIES" #. translator: %s is name of a SQL construct, eg LIMIT -#: parser/parse_clause.c:1807 +#: parser/parse_clause.c:1932 #, c-format msgid "argument of %s must not contain variables" msgstr "аргумент %s не може міÑтити змінні" #. translator: first %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:1972 +#: parser/parse_clause.c:2097 #, c-format msgid "%s \"%s\" is ambiguous" msgstr "вираз %s \"%s\" неоднозначний" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2000 +#: parser/parse_clause.c:2125 #, c-format msgid "non-integer constant in %s" msgstr "нецілочиÑельна конÑтанта в %s" #. translator: %s is name of a SQL construct, eg ORDER BY -#: parser/parse_clause.c:2022 +#: parser/parse_clause.c:2147 #, c-format msgid "%s position %d is not in select list" msgstr "в ÑпиÑку вибірки %s немає позиції %d" -#: parser/parse_clause.c:2461 +#: parser/parse_clause.c:2586 #, c-format msgid "CUBE is limited to 12 elements" msgstr "CUBE має Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð² 12 елементів" -#: parser/parse_clause.c:2667 +#: parser/parse_clause.c:2792 #, c-format msgid "window \"%s\" is already defined" msgstr "вікно \"%s\" вже визначено" -#: parser/parse_clause.c:2728 +#: parser/parse_clause.c:2853 #, c-format msgid "cannot override PARTITION BY clause of window \"%s\"" msgstr "змінити Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ PARTITION BY Ð´Ð»Ñ Ð²Ñ–ÐºÐ½Ð° \"%s\" не можна" -#: parser/parse_clause.c:2740 +#: parser/parse_clause.c:2865 #, c-format msgid "cannot override ORDER BY clause of window \"%s\"" msgstr "змінити Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ ORDER BY Ð´Ð»Ñ Ð²Ñ–ÐºÐ½Ð° \"%s\" не можна" -#: parser/parse_clause.c:2770 parser/parse_clause.c:2776 +#: parser/parse_clause.c:2895 parser/parse_clause.c:2901 #, c-format msgid "cannot copy window \"%s\" because it has a frame clause" msgstr "Ñкопіювати вікно \"%s\", Ñке має Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ Ñ€Ð°Ð¼ÐºÐ¸, не можна" -#: parser/parse_clause.c:2778 +#: parser/parse_clause.c:2903 #, c-format msgid "Omit the parentheses in this OVER clause." msgstr "ПропуÑтіть дужки в реченні OVER." -#: parser/parse_clause.c:2798 +#: parser/parse_clause.c:2923 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING requires exactly one ORDER BY column" msgstr "Ð”Ð»Ñ RANGE з зÑувом PRECEDING/FOLLOWING потребуєтьÑÑ Ð»Ð¸ÑˆÐµ один Ñтовпець в ORDER BY" -#: parser/parse_clause.c:2821 +#: parser/parse_clause.c:2946 #, c-format msgid "GROUPS mode requires an ORDER BY clause" msgstr "Ð”Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ GROUPS потребуєтьÑÑ Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ ORDER BY" -#: parser/parse_clause.c:2892 +#: parser/parse_clause.c:3016 #, c-format msgid "in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list" msgstr "Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð¾Ñ— функції з DISTINCT, вирази ORDER BY повинні з'ÑвлÑтиÑÑŒ у ÑпиÑку аргументів" -#: parser/parse_clause.c:2893 +#: parser/parse_clause.c:3017 #, c-format msgid "for SELECT DISTINCT, ORDER BY expressions must appear in select list" msgstr "Ð´Ð»Ñ SELECT DISTINCT вирази ORDER BY повинні бути в ÑпиÑку вибірки" -#: parser/parse_clause.c:2925 +#: parser/parse_clause.c:3049 #, c-format msgid "an aggregate with DISTINCT must have at least one argument" msgstr "агрегатна Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð· DISTINCT повинна мати мінімум один аргумент" -#: parser/parse_clause.c:2926 +#: parser/parse_clause.c:3050 #, c-format msgid "SELECT DISTINCT must have at least one column" msgstr "SELECT DISTINCT повинен мати мінімум один Ñтовпець" -#: parser/parse_clause.c:2992 parser/parse_clause.c:3024 +#: parser/parse_clause.c:3116 parser/parse_clause.c:3148 #, c-format msgid "SELECT DISTINCT ON expressions must match initial ORDER BY expressions" msgstr "Вирази SELECT DISTINCT ON повинні відповідати початковим виразам ORDER BY" -#: parser/parse_clause.c:3102 +#: parser/parse_clause.c:3226 #, c-format msgid "ASC/DESC is not allowed in ON CONFLICT clause" msgstr "ASC/DESC не дозволÑєтьÑÑ Ð² реченні ON CONFLICT" -#: parser/parse_clause.c:3108 +#: parser/parse_clause.c:3232 #, c-format msgid "NULLS FIRST/LAST is not allowed in ON CONFLICT clause" msgstr "NULLS FIRST/LAST не довзолÑєтьÑÑ Ð² реченні ON CONFLICT" -#: parser/parse_clause.c:3187 +#: parser/parse_clause.c:3311 #, c-format msgid "ON CONFLICT DO UPDATE requires inference specification or constraint name" msgstr "ON CONFLICT DO UPDATE вимагає Ñпецифікації виÑновку або імені обмеженнÑ" -#: parser/parse_clause.c:3188 +#: parser/parse_clause.c:3312 #, c-format msgid "For example, ON CONFLICT (column_name)." msgstr "Ðаприклад, ON CONFLICT (ім'Ñ_ÑтовпцÑ)." -#: parser/parse_clause.c:3199 +#: parser/parse_clause.c:3323 #, c-format msgid "ON CONFLICT is not supported with system catalog tables" msgstr "ON CONFLICT не підтримуєтьÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñми ÑиÑтемного каталогу" -#: parser/parse_clause.c:3207 +#: parser/parse_clause.c:3331 #, c-format msgid "ON CONFLICT is not supported on table \"%s\" used as a catalog table" msgstr "ON CONFLICT не підтримуєтьÑÑ Ð² таблиці \"%s\", що викориÑтовуєтьÑÑ Ñк Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ" -#: parser/parse_clause.c:3337 +#: parser/parse_clause.c:3462 #, c-format msgid "operator %s is not a valid ordering operator" msgstr "оператор %s не Ñ” дійÑним оператором ÑортуваннÑ" -#: parser/parse_clause.c:3339 +#: parser/parse_clause.c:3464 #, c-format msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "Оператори ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ– бути учаÑниками \"<\" або \">\" ÑімейÑтв операторів btree." -#: parser/parse_clause.c:3650 +#: parser/parse_clause.c:3775 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s" msgstr "RANGE зі зÑувом PRECEDING/FOLLOWING не підтримуєтьÑÑ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ %s" -#: parser/parse_clause.c:3656 +#: parser/parse_clause.c:3781 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING is not supported for column type %s and offset type %s" msgstr "RANGE зі зÑувом PRECEDING/FOLLOWING не підтримуєтьÑÑ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ %s Ñ– типу зÑуву %s" -#: parser/parse_clause.c:3659 +#: parser/parse_clause.c:3784 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "Приведіть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ñуву до потрібного типу." -#: parser/parse_clause.c:3664 +#: parser/parse_clause.c:3789 #, c-format msgid "RANGE with offset PRECEDING/FOLLOWING has multiple interpretations for column type %s and offset type %s" msgstr "RANGE зі зÑувом PRECEDING/FOLLOWING має декілька інтерпретацій Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ %s Ñ– типу зÑуву %s" -#: parser/parse_clause.c:3667 +#: parser/parse_clause.c:3792 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "Приведіть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ñуву в точноÑті до призначеного типу." #: parser/parse_coerce.c:1050 parser/parse_coerce.c:1088 #: parser/parse_coerce.c:1106 parser/parse_coerce.c:1121 -#: parser/parse_expr.c:2119 parser/parse_expr.c:2721 parser/parse_expr.c:3378 -#: parser/parse_expr.c:3611 parser/parse_expr.c:4447 parser/parse_target.c:994 +#: parser/parse_expr.c:2154 parser/parse_expr.c:2762 parser/parse_expr.c:3413 +#: parser/parse_expr.c:3642 parser/parse_target.c:998 #, c-format msgid "cannot cast type %s to %s" msgstr "неможливо транÑлювати тип %s в %s" @@ -16489,137 +17239,137 @@ msgid "argument of %s must not return a set" msgstr "аргумент конÑтрукції %s не повинен повертати набір" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1383 +#: parser/parse_coerce.c:1420 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "у конÑтрукції %s типи %s Ñ– %s не можуть бути відповідними" -#: parser/parse_coerce.c:1499 +#: parser/parse_coerce.c:1536 #, c-format msgid "argument types %s and %s cannot be matched" msgstr "типи аргументів %s Ñ– %s не можуть збігатиÑÑŒ" #. translator: first %s is name of a SQL construct, eg CASE -#: parser/parse_coerce.c:1551 +#: parser/parse_coerce.c:1588 #, c-format msgid "%s could not convert type %s to %s" msgstr "у конÑтрукції %s не можна перетворити тип %s в %s" -#: parser/parse_coerce.c:2154 parser/parse_coerce.c:2174 -#: parser/parse_coerce.c:2194 parser/parse_coerce.c:2215 -#: parser/parse_coerce.c:2270 parser/parse_coerce.c:2304 +#: parser/parse_coerce.c:2191 parser/parse_coerce.c:2211 +#: parser/parse_coerce.c:2231 parser/parse_coerce.c:2252 +#: parser/parse_coerce.c:2307 parser/parse_coerce.c:2341 #, c-format msgid "arguments declared \"%s\" are not all alike" msgstr "оголошенні аргументи \"%s\", повинні бути Ñхожими" -#: parser/parse_coerce.c:2249 parser/parse_coerce.c:2362 -#: utils/fmgr/funcapi.c:558 +#: parser/parse_coerce.c:2286 parser/parse_coerce.c:2399 +#: utils/fmgr/funcapi.c:600 #, c-format msgid "argument declared %s is not an array but type %s" msgstr "аргумент, оголошений Ñк %s , Ñ” не маÑивом, а типом %s" -#: parser/parse_coerce.c:2282 parser/parse_coerce.c:2432 -#: utils/fmgr/funcapi.c:572 +#: parser/parse_coerce.c:2319 parser/parse_coerce.c:2469 +#: utils/fmgr/funcapi.c:614 #, c-format msgid "argument declared %s is not a range type but type %s" msgstr "аргумент, оголошений Ñк %s, Ñ” не діапазонним типом, а типом %s" -#: parser/parse_coerce.c:2316 parser/parse_coerce.c:2396 -#: parser/parse_coerce.c:2529 utils/fmgr/funcapi.c:590 utils/fmgr/funcapi.c:655 +#: parser/parse_coerce.c:2353 parser/parse_coerce.c:2433 +#: parser/parse_coerce.c:2566 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 #, c-format msgid "argument declared %s is not a multirange type but type %s" msgstr "оголошений аргумент %s не Ñ” багатодіапазонним типом, а типом %s" -#: parser/parse_coerce.c:2353 +#: parser/parse_coerce.c:2390 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "не можна визначити тип елемента аргументу \"anyarray\"" -#: parser/parse_coerce.c:2379 parser/parse_coerce.c:2410 -#: parser/parse_coerce.c:2449 parser/parse_coerce.c:2515 +#: parser/parse_coerce.c:2416 parser/parse_coerce.c:2447 +#: parser/parse_coerce.c:2486 parser/parse_coerce.c:2552 #, c-format msgid "argument declared %s is not consistent with argument declared %s" msgstr "аргумент, оголошений Ñк %s, не узгоджуєтьÑÑ Ð· аргументом, оголошеним Ñк %s" -#: parser/parse_coerce.c:2474 +#: parser/parse_coerce.c:2511 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ поліморфний тип, тому що вхідні аргументи мають тип %s" -#: parser/parse_coerce.c:2488 +#: parser/parse_coerce.c:2525 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "тип, відповідний \"anynonarray\", Ñ” маÑивом: %s" -#: parser/parse_coerce.c:2498 +#: parser/parse_coerce.c:2535 #, c-format msgid "type matched to anyenum is not an enum type: %s" msgstr "тип, відповідний \"anyenum\", не Ñ” переліком: %s" -#: parser/parse_coerce.c:2559 +#: parser/parse_coerce.c:2596 #, c-format msgid "arguments of anycompatible family cannot be cast to a common type" msgstr "аргументи ÑімейÑтва anycompatible не можна привеÑти до Ñпільного типу" -#: parser/parse_coerce.c:2577 parser/parse_coerce.c:2598 -#: parser/parse_coerce.c:2648 parser/parse_coerce.c:2653 -#: parser/parse_coerce.c:2717 parser/parse_coerce.c:2729 +#: parser/parse_coerce.c:2614 parser/parse_coerce.c:2635 +#: parser/parse_coerce.c:2685 parser/parse_coerce.c:2690 +#: parser/parse_coerce.c:2754 parser/parse_coerce.c:2766 #, c-format msgid "could not determine polymorphic type %s because input has type %s" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ поліморфний тип %s тому що вхідні дані мають тип %s" -#: parser/parse_coerce.c:2587 +#: parser/parse_coerce.c:2624 #, c-format msgid "anycompatiblerange type %s does not match anycompatible type %s" -msgstr "тип anycompatiblerange %s не збігаєтьÑÑ Ð· типом anycompatible %s" +msgstr "тип anycompatiblerange %s не збігаєтьÑÑ Ð· типом anycompatible %s" -#: parser/parse_coerce.c:2608 +#: parser/parse_coerce.c:2645 #, c-format msgid "anycompatiblemultirange type %s does not match anycompatible type %s" msgstr "тип anycompatiblemultirange %s не збігаєтьÑÑ Ð· типом anycompatible %s" -#: parser/parse_coerce.c:2622 +#: parser/parse_coerce.c:2659 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "тип відповідний до anycompatiblenonarray Ñ” маÑивом: %s" -#: parser/parse_coerce.c:2857 +#: parser/parse_coerce.c:2894 #, c-format msgid "A result of type %s requires at least one input of type anyrange or anymultirange." msgstr "Результат типу %s потребує принаймні одного Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ anyrange або anymultirange." -#: parser/parse_coerce.c:2874 +#: parser/parse_coerce.c:2911 #, c-format msgid "A result of type %s requires at least one input of type anycompatiblerange or anycompatiblemultirange." msgstr "Результат типу %s потребує принаймні одного Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ anycompatiblerange або anycompatiblemultirange." -#: parser/parse_coerce.c:2886 +#: parser/parse_coerce.c:2923 #, c-format msgid "A result of type %s requires at least one input of type anyelement, anyarray, anynonarray, anyenum, anyrange, or anymultirange." msgstr "Результат типу %s потребує принаймні одного Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ anyelement, anyarray, anynonarray, anyenum, anyrange, або anymultirange." -#: parser/parse_coerce.c:2898 +#: parser/parse_coerce.c:2935 #, c-format msgid "A result of type %s requires at least one input of type anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange, or anycompatiblemultirange." msgstr "Результат типу %s потребує ввеÑти Ñк мінімум один тип anycompatible, anycompatiblearray, anycompatiblenonarray, anycompatiblerange або anycompatiblemultirange." -#: parser/parse_coerce.c:2928 +#: parser/parse_coerce.c:2965 msgid "A result of type internal requires at least one input of type internal." msgstr "Результат внутрішнього типу потребує ввеÑти Ñк мінімум один внутрішній тип." #: parser/parse_collate.c:228 parser/parse_collate.c:475 -#: parser/parse_collate.c:1012 +#: parser/parse_collate.c:1005 #, c-format msgid "collation mismatch between implicit collations \"%s\" and \"%s\"" msgstr "невідповідніÑть параметрів ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ неÑвними параметрами ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" Ñ– \"%s\"" #: parser/parse_collate.c:231 parser/parse_collate.c:478 -#: parser/parse_collate.c:1015 +#: parser/parse_collate.c:1008 #, c-format msgid "You can choose the collation by applying the COLLATE clause to one or both expressions." msgstr "Ви можете обрати параметри ÑортуваннÑ, заÑтоÑувавши Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ COLLATE до одного або обох виразів." -#: parser/parse_collate.c:862 +#: parser/parse_collate.c:855 #, c-format msgid "collation mismatch between explicit collations \"%s\" and \"%s\"" msgstr "невідповідніÑть параметрів ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ Ñвними параметрами ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" Ñ– \"%s\"" @@ -16649,480 +17399,551 @@ msgstr "рекурÑивне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° запит \"%s\" не по msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "рекурÑивне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° запит \"%s\" не повинне з'ÑвлÑтиÑÑŒ в EXCEPT" -#: parser/parse_cte.c:133 -#, c-format -msgid "MERGE not supported in WITH query" -msgstr "MERGE не підтримуєтьÑÑ Ð² запиті WITH" - -#: parser/parse_cte.c:143 +#: parser/parse_cte.c:136 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "Ð†Ð¼â€™Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ WITH \"%s\" вказано неодноразово" -#: parser/parse_cte.c:275 +#: parser/parse_cte.c:308 +#, c-format +msgid "could not identify an inequality operator for type %s" +msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ оператора нерівноÑті Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" + +#: parser/parse_cte.c:335 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "Ð ÐµÑ‡ÐµÐ½Ð½Ñ WITH, Ñке міÑтить оператор, що змінює дані, повинне бути на верхньому рівні" -#: parser/parse_cte.c:324 +#: parser/parse_cte.c:384 #, c-format msgid "recursive query \"%s\" column %d has type %s in non-recursive term but type %s overall" msgstr "у рекурÑивному запиті \"%s\" Ñтовпець %d має тип %s у нерекурÑивній чаÑтині, але загалом тип %s" -#: parser/parse_cte.c:330 +#: parser/parse_cte.c:390 #, c-format msgid "Cast the output of the non-recursive term to the correct type." msgstr "Приведіть результат нерекурÑивної чаÑтини до правильного типу." -#: parser/parse_cte.c:335 +#: parser/parse_cte.c:395 #, c-format msgid "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term but collation \"%s\" overall" msgstr "у рекурÑивному запиті \"%s\" Ñтовпець %d має параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" у нерекурÑивній чаÑтині, але загалом параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"" -#: parser/parse_cte.c:339 +#: parser/parse_cte.c:399 #, c-format msgid "Use the COLLATE clause to set the collation of the non-recursive term." msgstr "ВикориÑтайте Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ COLLATE, щоб вÑтановити параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² нерекурÑивній чаÑтині." -#: parser/parse_cte.c:357 +#: parser/parse_cte.c:420 #, c-format msgid "WITH query is not recursive" msgstr "Запит WITH не Ñ” рекурÑивним" -#: parser/parse_cte.c:388 +#: parser/parse_cte.c:451 #, c-format msgid "with a SEARCH or CYCLE clause, the left side of the UNION must be a SELECT" msgstr "з реченнÑм з SEARCH або CYCLE, ліва Ñторона UNION повинна бути SELECT" -#: parser/parse_cte.c:393 +#: parser/parse_cte.c:456 #, c-format msgid "with a SEARCH or CYCLE clause, the right side of the UNION must be a SELECT" msgstr "з реченнÑм з SEARCH або CYCLE, права Ñторона UNION повинна бути SELECT" -#: parser/parse_cte.c:408 +#: parser/parse_cte.c:471 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "пошуковий Ñтовпець \"%s\" відÑутній в ÑпиÑку Ñтовпців запиту WITH" -#: parser/parse_cte.c:415 +#: parser/parse_cte.c:478 #, c-format msgid "search column \"%s\" specified more than once" msgstr "пошуковий Ñтовпець \"%s\" вказано більше одного разу" -#: parser/parse_cte.c:424 +#: parser/parse_cte.c:487 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" msgstr "назва поÑлідовноÑті пошуку \"%s\" вже викориÑтовуєтьÑÑ Ñƒ ÑпиÑку Ñтовпців запиту WITH" -#: parser/parse_cte.c:443 +#: parser/parse_cte.c:504 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "Ñтовпець циклу \"%s\" відÑутній в ÑпиÑку Ñтовпців запиту WITH" -#: parser/parse_cte.c:450 +#: parser/parse_cte.c:511 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "Ñтовпець циклу \"%s\" вказано більше одного разу" -#: parser/parse_cte.c:459 +#: parser/parse_cte.c:520 #, c-format msgid "cycle mark column name \"%s\" already used in WITH query column list" msgstr "назва ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐºÐ¸ циклу \"%s\" вже викориÑтовуєтьÑÑ Ñƒ ÑпиÑку Ñтовпців запиту WITH" -#: parser/parse_cte.c:471 +#: parser/parse_cte.c:527 #, c-format msgid "cycle path column name \"%s\" already used in WITH query column list" msgstr "назва ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ñ†Ð¸ÐºÐ»Ñƒ шлÑху \"%s\" вже викориÑтовуєтьÑÑ Ñƒ ÑпиÑку Ñтовпців запиту WITH" -#: parser/parse_cte.c:479 +#: parser/parse_cte.c:535 #, c-format msgid "cycle mark column name and cycle path column name are the same" msgstr "назва ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐºÐ¸ циклу Ñ– назва ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ñ†Ð¸ÐºÐ»Ñƒ шлÑху однакові" -#: parser/parse_cte.c:515 -#, c-format -msgid "could not identify an inequality operator for type %s" -msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ оператора нерівноÑті Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" - -#: parser/parse_cte.c:527 +#: parser/parse_cte.c:545 #, c-format msgid "search sequence column name and cycle mark column name are the same" msgstr "назва ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð¿Ð¾ÑлідовноÑті пошуку Ñ– назва ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐºÐ¸ циклу однакові" -#: parser/parse_cte.c:534 +#: parser/parse_cte.c:552 #, c-format msgid "search sequence column name and cycle path column name are the same" msgstr "назва ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð¿Ð¾ÑлідовноÑті пошуку Ñ– назва ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ñ†Ð¸ÐºÐ»Ñƒ шлÑху однакові" -#: parser/parse_cte.c:618 +#: parser/parse_cte.c:636 #, c-format msgid "WITH query \"%s\" has %d columns available but %d columns specified" msgstr "Запит WITH \"%s\" має %d доÑтупних Ñтовпців, але %d Ñтовпців вказано" -#: parser/parse_cte.c:798 +#: parser/parse_cte.c:816 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "взаємна рекурÑÑ–Ñ Ð¼Ñ–Ð¶ елементами WITH не реалізована" -#: parser/parse_cte.c:850 +#: parser/parse_cte.c:868 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "рекурÑивний запит \"%s\" не повинен міÑтити оператори, Ñкі змінюють дані" -#: parser/parse_cte.c:858 +#: parser/parse_cte.c:876 #, c-format msgid "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] recursive-term" msgstr "рекурÑивний запит \"%s\" не має форми (нерекурÑивна чаÑтина) UNION [ALL] (рекурÑивна чаÑтина)" -#: parser/parse_cte.c:902 +#: parser/parse_cte.c:911 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY в рекурÑивному запиті не реалізовано" -#: parser/parse_cte.c:908 +#: parser/parse_cte.c:917 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET у рекурÑивному запиті не реалізовано" -#: parser/parse_cte.c:914 +#: parser/parse_cte.c:923 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT у рекурÑивному запиті не реалізовано" -#: parser/parse_cte.c:920 +#: parser/parse_cte.c:929 #, c-format msgid "FOR UPDATE/SHARE in a recursive query is not implemented" msgstr "FOR UPDATE/SHARE в рекурÑивному запиті не реалізовано" -#: parser/parse_cte.c:977 +#: parser/parse_cte.c:1008 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "рекурÑивне поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° запит \"%s\" не повинне з'ÑвлÑтиÑÑŒ неодноразово" -#: parser/parse_expr.c:300 +#: parser/parse_expr.c:313 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "DEFAULT не допуÑкаєтьÑÑ Ð² цьому контекÑті" -#: parser/parse_expr.c:397 parser/parse_relation.c:3655 -#: parser/parse_relation.c:3675 +#: parser/parse_expr.c:406 parser/parse_relation.c:3691 +#: parser/parse_relation.c:3701 parser/parse_relation.c:3719 +#: parser/parse_relation.c:3726 parser/parse_relation.c:3740 #, c-format msgid "column %s.%s does not exist" msgstr "Ñтовпець %s.%s не Ñ–Ñнує" -#: parser/parse_expr.c:409 +#: parser/parse_expr.c:418 #, c-format msgid "column \"%s\" not found in data type %s" msgstr "Ñтовпець \"%s\" не знайдено в типі даних %s" -#: parser/parse_expr.c:415 +#: parser/parse_expr.c:424 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "не вдалоÑÑ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÑƒÐ²Ð°Ñ‚Ð¸ Ñтовпець \"%s\" в типі запиÑу" -#: parser/parse_expr.c:421 +#: parser/parse_expr.c:430 #, c-format msgid "column notation .%s applied to type %s, which is not a composite type" msgstr "Ð·Ð°Ð¿Ð¸Ñ Ñ–Ð¼ÐµÐ½Ñ– ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ .%s заÑтоÑований до типу %s, котрий не Ñ” Ñкладеним типом" -#: parser/parse_expr.c:452 parser/parse_target.c:739 +#: parser/parse_expr.c:461 parser/parse_target.c:732 #, c-format msgid "row expansion via \"*\" is not supported here" msgstr "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ñ€Ñдка через \"*\" тут не підтримуєтьÑÑ" -#: parser/parse_expr.c:574 +#: parser/parse_expr.c:584 msgid "cannot use column reference in DEFAULT expression" msgstr "у виразі DEFAULT не можна викориÑтовувати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñтовпець" -#: parser/parse_expr.c:577 +#: parser/parse_expr.c:587 msgid "cannot use column reference in partition bound expression" msgstr "у виразі границі Ñекції не можна викориÑтовувати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñтовпці" -#: parser/parse_expr.c:846 parser/parse_relation.c:818 -#: parser/parse_relation.c:900 parser/parse_target.c:1234 +#: parser/parse_expr.c:846 parser/parse_relation.c:833 +#: parser/parse_relation.c:915 parser/parse_target.c:1238 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñтовпець \"%s\" Ñ” неоднозначним" #: parser/parse_expr.c:902 parser/parse_param.c:110 parser/parse_param.c:142 -#: parser/parse_param.c:208 parser/parse_param.c:307 +#: parser/parse_param.c:204 parser/parse_param.c:303 #, c-format msgid "there is no parameter $%d" msgstr "параметр $%d не Ñ–Ñнує" -#: parser/parse_expr.c:1102 +#. translator: %s is name of a SQL construct, eg NULLIF +#: parser/parse_expr.c:1103 parser/parse_expr.c:3073 #, c-format -msgid "NULLIF requires = operator to yield boolean" -msgstr "NULLIF потребує = щоб оператор повертав логічне значеннÑ" +msgid "%s requires = operator to yield boolean" +msgstr "%s потребує, щоб оператор = повертав логічне значеннÑ" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1108 parser/parse_expr.c:3037 +#: parser/parse_expr.c:1109 parser/parse_expr.c:3080 #, c-format msgid "%s must not return a set" msgstr "%s не повинна повертати набір" -#: parser/parse_expr.c:1493 parser/parse_expr.c:1525 +#: parser/parse_expr.c:1395 +#, c-format +msgid "MERGE_ACTION() can only be used in the RETURNING list of a MERGE command" +msgstr "MERGE_ACTION() можна викориÑтовувати лише в ÑпиÑку RETURNING Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ MERGE" + +#: parser/parse_expr.c:1519 parser/parse_expr.c:1551 #, c-format msgid "number of columns does not match number of values" msgstr "кількіÑть Ñтовпців не відповідає кількоÑті значень" -#: parser/parse_expr.c:1539 +#: parser/parse_expr.c:1565 #, c-format msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression" msgstr "джерелом Ð´Ð»Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñƒ UPDATE з декількома ÑтовпцÑми повинен бути вкладений SELECT або вираз ROW()" #. translator: %s is name of a SQL construct, eg GROUP BY -#: parser/parse_expr.c:1734 parser/parse_expr.c:2216 parser/parse_func.c:2679 +#: parser/parse_expr.c:1760 parser/parse_expr.c:2251 parser/parse_func.c:2679 #, c-format msgid "set-returning functions are not allowed in %s" msgstr "функції, повертаючі набори, не дозволÑютьÑÑ Ð² %s" -#: parser/parse_expr.c:1797 +#: parser/parse_expr.c:1824 msgid "cannot use subquery in check constraint" msgstr "в обмеженні-перевірці не можна викориÑтовувати підзапити" -#: parser/parse_expr.c:1801 +#: parser/parse_expr.c:1828 msgid "cannot use subquery in DEFAULT expression" msgstr "у виразі DEFAULT не можна викориÑтовувати підзапити" -#: parser/parse_expr.c:1804 +#: parser/parse_expr.c:1831 msgid "cannot use subquery in index expression" msgstr "в індекÑному виразі не можна викориÑтовувати підзапити" -#: parser/parse_expr.c:1807 +#: parser/parse_expr.c:1834 msgid "cannot use subquery in index predicate" msgstr "в предикаті індекÑу не можна викориÑтовувати підзапити" -#: parser/parse_expr.c:1810 +#: parser/parse_expr.c:1837 msgid "cannot use subquery in statistics expression" msgstr "у виразі ÑтатиÑтики не можна викориÑтовувати підзапит" -#: parser/parse_expr.c:1813 +#: parser/parse_expr.c:1840 msgid "cannot use subquery in transform expression" msgstr "у виразі Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ðµ можна викориÑтовувати підзапити" -#: parser/parse_expr.c:1816 +#: parser/parse_expr.c:1843 msgid "cannot use subquery in EXECUTE parameter" msgstr "в параметрі EXECUTE не можна викориÑтовувати підзапити" -#: parser/parse_expr.c:1819 +#: parser/parse_expr.c:1846 msgid "cannot use subquery in trigger WHEN condition" msgstr "в умові WHEN Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñƒ не можна викориÑтовувати підзапити" -#: parser/parse_expr.c:1822 +#: parser/parse_expr.c:1849 msgid "cannot use subquery in partition bound" msgstr "в границі Ñекції не можна викориÑтовувати підзапити" -#: parser/parse_expr.c:1825 +#: parser/parse_expr.c:1852 msgid "cannot use subquery in partition key expression" msgstr "у виразі ключа ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ можна викориÑтовувати підзапити" -#: parser/parse_expr.c:1828 +#: parser/parse_expr.c:1855 msgid "cannot use subquery in CALL argument" msgstr "в аргументі CALL не можна викориÑтовувати підзапити" -#: parser/parse_expr.c:1831 +#: parser/parse_expr.c:1858 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "не можна викориÑтовувати підзапити в умові COPY FROM WHERE" -#: parser/parse_expr.c:1834 +#: parser/parse_expr.c:1861 msgid "cannot use subquery in column generation expression" msgstr "у виразі генерації Ñтовпців не можна викориÑтовувати підзапити" -#: parser/parse_expr.c:1887 parser/parse_expr.c:3724 +#: parser/parse_expr.c:1914 parser/parse_expr.c:3772 #, c-format msgid "subquery must return only one column" msgstr "підзапит повинен повертати лише один Ñтовпець" -#: parser/parse_expr.c:1958 +#: parser/parse_expr.c:1985 #, c-format msgid "subquery has too many columns" msgstr "підзапит має занадто багато Ñтовпців" -#: parser/parse_expr.c:1963 +#: parser/parse_expr.c:1990 #, c-format msgid "subquery has too few columns" msgstr "підзапит має занадто мало Ñтовпців" -#: parser/parse_expr.c:2059 +#: parser/parse_expr.c:2094 #, c-format msgid "cannot determine type of empty array" msgstr "тип пуÑтого маÑиву визначити не можна" -#: parser/parse_expr.c:2060 +#: parser/parse_expr.c:2095 #, c-format msgid "Explicitly cast to the desired type, for example ARRAY[]::integer[]." msgstr "Приведіть його до бажаного типу Ñвним чином, наприклад ARRAY[]::integer[]." -#: parser/parse_expr.c:2074 +#: parser/parse_expr.c:2109 #, c-format msgid "could not find element type for data type %s" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ тип елементу Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ даних %s" -#: parser/parse_expr.c:2157 +#: parser/parse_expr.c:2192 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "ROW вирази можуть мати макÑимум %d елементів" -#: parser/parse_expr.c:2362 +#: parser/parse_expr.c:2397 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "заміÑть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ XML-атрибуту без імені повинен вказуватиÑÑŒ Ñтовпець" -#: parser/parse_expr.c:2363 +#: parser/parse_expr.c:2398 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "заміÑть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ XML-елементу без імені повинен вказуватиÑÑŒ Ñтовпець" -#: parser/parse_expr.c:2378 +#: parser/parse_expr.c:2413 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "Ім'Ñ XML-атрибуту \"%s\" з'ÑвлÑєтьÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ñ€Ð°Ð·Ð¾Ð²Ð¾" -#: parser/parse_expr.c:2485 +#: parser/parse_expr.c:2521 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "привеÑти результат XMLSERIALIZE до %s не можна" -#: parser/parse_expr.c:2794 parser/parse_expr.c:2990 +#: parser/parse_expr.c:2835 parser/parse_expr.c:3031 #, c-format msgid "unequal number of entries in row expressions" msgstr "неоднакова кількіÑть елементів у виразах Ñ€Ñдка" -#: parser/parse_expr.c:2804 +#: parser/parse_expr.c:2845 #, c-format msgid "cannot compare rows of zero length" msgstr "Ñ€Ñдки нульової довжини порівнювати не можна" -#: parser/parse_expr.c:2829 +#: parser/parse_expr.c:2870 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "оператор порівнÑÐ½Ð½Ñ Ñ€Ñдків повинен видавати логічний тип, а не %s" -#: parser/parse_expr.c:2836 +#: parser/parse_expr.c:2877 #, c-format msgid "row comparison operator must not return a set" msgstr "оператор порівнÑÐ½Ð½Ñ Ñ€Ñдків повинен вертати набір" -#: parser/parse_expr.c:2895 parser/parse_expr.c:2936 +#: parser/parse_expr.c:2936 parser/parse_expr.c:2977 #, c-format msgid "could not determine interpretation of row comparison operator %s" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ інтерпретацію оператора порівнÑÐ½Ð½Ñ Ñ€Ñдків %s" -#: parser/parse_expr.c:2897 +#: parser/parse_expr.c:2938 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "Оператори порівнÑÐ½Ð½Ñ Ñ€Ñдків повинні бути пов'Ñзанні з ÑімейÑтвом операторів btree." -#: parser/parse_expr.c:2938 +#: parser/parse_expr.c:2979 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "ІÑнує декілька рівноцінних кандидатів." -#: parser/parse_expr.c:3031 -#, c-format -msgid "IS DISTINCT FROM requires = operator to yield boolean" -msgstr "IS DISTINCT FROM, потребує = щоб оператор повертав логічне значеннÑ" - -#: parser/parse_expr.c:3283 +#: parser/parse_expr.c:3314 #, c-format msgid "JSON ENCODING clause is only allowed for bytea input type" msgstr "Вираз JSON ENCODING дозволено лише Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ bytea" -#: parser/parse_expr.c:3290 -#, c-format -msgid "FORMAT JSON has no effect for json and jsonb types" -msgstr "FORMAT JSON не має впливу Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñ–Ð² json Ñ– jsonb" - -#: parser/parse_expr.c:3345 +#: parser/parse_expr.c:3378 #, c-format msgid "cannot use non-string types with implicit FORMAT JSON clause" msgstr "викориÑтовувати типи, Ñкі не Ñ” string з неÑвним виразом FORMAT JSON не можна" -#: parser/parse_expr.c:3449 +#: parser/parse_expr.c:3379 +#, c-format +msgid "cannot use non-string types with explicit FORMAT JSON clause" +msgstr "викориÑтовувати типи, Ñкі не Ñ” string з Ñвним виразом FORMAT JSON не можна" + +#: parser/parse_expr.c:3468 #, c-format msgid "cannot use JSON format with non-string output types" msgstr "викориÑтовувати формат JSON з типами виводу, Ñкі не Ñ” string не можна" -#: parser/parse_expr.c:3462 +#: parser/parse_expr.c:3481 #, c-format msgid "cannot set JSON encoding for non-bytea output types" msgstr "вÑтановити ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ JSON Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñ–Ð² виводу, Ñкі не Ñ” bytea не можна" -#: parser/parse_expr.c:3467 +#: parser/parse_expr.c:3486 #, c-format msgid "unsupported JSON encoding" msgstr "непідтримуване JSON кодуваннÑ" -#: parser/parse_expr.c:3468 +#: parser/parse_expr.c:3487 #, c-format msgid "Only UTF8 JSON encoding is supported." -msgstr "Лише UTF8 JSON ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÑƒÑ”Ñ‚ÑŒÑÑ." +msgstr "ПідтримуєтьÑÑ Ð»Ð¸ÑˆÐµ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ UTF8 формату JSON." -#: parser/parse_expr.c:3505 +#: parser/parse_expr.c:3524 #, c-format msgid "returning SETOF types is not supported in SQL/JSON functions" -msgstr "Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð² SETOF у функціÑÑ… SQL/JSON не підтримуєтьÑÑ" +msgstr "Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð² SETOF не підтримуєтьÑÑ Ñƒ функціÑÑ… SQL/JSON" + +#: parser/parse_expr.c:3529 +#, c-format +msgid "returning pseudo-types is not supported in SQL/JSON functions" +msgstr "Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð¿Ñевдо-типів не підтримуєтьÑÑ Ñƒ функціÑÑ… SQL/JSON" -#: parser/parse_expr.c:3805 parser/parse_func.c:864 +#: parser/parse_expr.c:3857 parser/parse_func.c:866 #, c-format msgid "aggregate ORDER BY is not implemented for window functions" msgstr "агрегатне Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ ORDER BY Ð´Ð»Ñ Ð²Ñ–ÐºÐ¾Ð½Ð½Ð¸Ñ… функцій не реалізовано" -#: parser/parse_expr.c:4022 +#: parser/parse_expr.c:4080 #, c-format msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" msgstr "викориÑтовувати вираз JSON FORMAT ENCODING Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñ–Ð² введеннÑ, Ñкі не Ñ” bytea не можна" -#: parser/parse_expr.c:4042 +#: parser/parse_expr.c:4100 #, c-format msgid "cannot use type %s in IS JSON predicate" msgstr "викориÑтовувати тип %s в предикаті IS JSON не можна" -#: parser/parse_expr.c:4108 +#: parser/parse_expr.c:4126 parser/parse_expr.c:4247 #, c-format -msgid "JSON_TABLE path name is not allowed here" -msgstr "назва шлÑху JSON_TABLE не допуÑкаєтьÑÑ Ñ‚ÑƒÑ‚" +msgid "cannot use type %s in RETURNING clause of %s" +msgstr "неможливо викориÑтати тип %s в реченні RETURNING %s" -#: parser/parse_expr.c:4135 +#: parser/parse_expr.c:4128 #, c-format -msgid "JSON path expression must be type %s, not type %s" -msgstr "вираз шлÑху JSON повинен бути типом %s, а не %s" +msgid "Try returning json or jsonb." +msgstr "Спробуйте повернути json або jsonb." + +#: parser/parse_expr.c:4176 +#, c-format +msgid "cannot use non-string types with WITH UNIQUE KEYS clause" +msgstr "не можна викориÑтовувати не Ñтрокові типи з пунктом WITH UNIQUE KEYS" + +#: parser/parse_expr.c:4250 +#, c-format +msgid "Try returning a string type or bytea." +msgstr "Спробуйте повернути тип string або bytea." -#: parser/parse_expr.c:4297 +#: parser/parse_expr.c:4315 #, c-format -msgid "cannot cast DEFAULT expression type %s to %s" -msgstr "привеÑти тип виразу DEFAULT %s до %s не можна" +msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" +msgstr "не можна вказати FORMAT JSON в реченні RETURNING %s()" -#: parser/parse_expr.c:4466 +#: parser/parse_expr.c:4328 #, c-format -msgid "JSON_TABLE() is not yet implemented for the json type" -msgstr "JSON_TABLE() ще не реалізовано Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ json" +msgid "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" +msgstr "Поведінка SQL/JSON QUOTES не повинна визначатиÑÑ, коли викориÑтовуєтьÑÑ WITH WRAPPER" -#: parser/parse_expr.c:4467 parser/parse_expr.c:4477 +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4342 parser/parse_expr.c:4371 parser/parse_expr.c:4402 +#: parser/parse_expr.c:4428 parser/parse_expr.c:4454 +#: parser/parse_jsontable.c:94 #, c-format -msgid "Try casting the argument to jsonb" -msgstr "Спробуйте привеÑти аргумент до jsonb" +msgid "invalid %s behavior" +msgstr "неприпуÑтима поведінка %s" -#: parser/parse_expr.c:4476 +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4345 parser/parse_expr.c:4374 #, c-format -msgid "%s() is not yet implemented for the json type" -msgstr "%s() ще не реалізовано Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ json" +msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s." +msgstr "Тільки ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, або DEFAULT вираз дозволений в %s Ð´Ð»Ñ %s." -#: parser/parse_expr.c:4497 parser/parse_expr.c:4598 +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name a SQL/JSON clause (eg. ON EMPTY) +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4352 parser/parse_expr.c:4381 parser/parse_expr.c:4410 +#: parser/parse_expr.c:4438 parser/parse_expr.c:4464 #, c-format -msgid "cannot use RETURNING type %s in %s" -msgstr "викориÑтовувати тип RETURNING %s в %s не можна" +msgid "invalid %s behavior for column \"%s\"" +msgstr "неприпуÑтима поведінка %s Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s \"" -#: parser/parse_expr.c:4540 +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4355 parser/parse_expr.c:4384 #, c-format -msgid "cannot use non-string types with WITH UNIQUE KEYS clause" -msgstr "викориÑтовувати типи, Ñкі не Ñ” string з виразом WITH UNIQUE KEYS не можна" +msgid "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns." +msgstr "Тільки ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, або DEFAULT вираз дозволений в %s Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¾Ð²Ð°Ð½Ð¸Ñ… Ñтовпців." -#: parser/parse_expr.c:4601 +#: parser/parse_expr.c:4403 #, c-format -msgid "Try returning a string type or bytea." -msgstr "Спробуйте повернути тип string або bytea." +msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s." +msgstr "Тільки ERROR, TRUE, FALSE, або UNKNOWN дозволені в %s Ð´Ð»Ñ %s." + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4413 +#, c-format +msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns." +msgstr "Тільки ERROR, TRUE, FALSE або UNKNOWN дозволÑєтьÑÑ Ð² %s Ð´Ð»Ñ Ñтовпців EXISTS." + +#. translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY), +#. second %s is a SQL/JSON function name (e.g. JSON_QUERY) +#: parser/parse_expr.c:4431 parser/parse_expr.c:4457 +#, c-format +msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s." +msgstr "Тільки ERROR, NULL або DEFAULT вираз дозволений в %s Ð´Ð»Ñ %s." + +#. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) +#: parser/parse_expr.c:4441 parser/parse_expr.c:4467 +#, c-format +msgid "Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns." +msgstr "Тільки ERROR, NULL або DEFAULT вираз дозволений в %s Ð´Ð»Ñ ÑкалÑрних Ñтовпців." + +#: parser/parse_expr.c:4497 +#, c-format +msgid "JSON path expression must be of type %s, not of type %s" +msgstr "вираз шлÑху JSON повинен бути типом %s, а не %s" + +#: parser/parse_expr.c:4715 +#, c-format +msgid "can only specify a constant, non-aggregate function, or operator expression for DEFAULT" +msgstr "можна вказати лише конÑтанту, не агрегатну функцію або вираз операторів Ð´Ð»Ñ DEFAULT" + +#: parser/parse_expr.c:4720 +#, c-format +msgid "DEFAULT expression must not contain column references" +msgstr "вираз DEFAULT не повинен міÑтити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñтовпець" + +#: parser/parse_expr.c:4725 +#, c-format +msgid "DEFAULT expression must not return a set" +msgstr "вираз DEFAULT не повинен повертати набір" + +#: parser/parse_expr.c:4801 parser/parse_expr.c:4810 +#, c-format +msgid "cannot cast behavior expression of type %s to %s" +msgstr "неможливо привеÑти тип виразу %s до %s" + +#: parser/parse_expr.c:4804 +#, c-format +msgid "You will need to explicitly cast the expression to type %s." +msgstr "Вам необхідно Ñвно привеÑти вираз до типу %s." #: parser/parse_func.c:194 #, c-format @@ -17134,7 +17955,7 @@ msgstr "Ñ–Ð¼â€™Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñƒ \"%s\" викориÑтовуєтьÑÑ Ð½ msgid "positional argument cannot follow named argument" msgstr "позиційний аргумент не може Ñтежити за іменованим аргументомв" -#: parser/parse_func.c:287 parser/parse_func.c:2369 +#: parser/parse_func.c:287 parser/parse_func.c:2368 #, c-format msgid "%s is not a procedure" msgstr "%s не Ñ” процедурою" @@ -17257,7 +18078,7 @@ msgstr "Ðе вдалоÑÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð¸ найкращу кандидатуру msgid "No aggregate function matches the given name and argument types. Perhaps you misplaced ORDER BY; ORDER BY must appear after all regular arguments of the aggregate." msgstr "Ðгрегатну функцію з цим ім'Ñм Ñ– типами аргументів не знайдено. Можливо, ви невірно розміÑтили Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ ORDER BY; Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ ORDER BY повинно з'ÑвлÑтиÑÑŒ піÑÐ»Ñ Ð²ÑÑ–Ñ… звичайних аргументів агрегату." -#: parser/parse_func.c:622 parser/parse_func.c:2412 +#: parser/parse_func.c:622 parser/parse_func.c:2411 #, c-format msgid "procedure %s does not exist" msgstr "процедура %s не Ñ–Ñнує" @@ -17277,57 +18098,57 @@ msgstr "Функцію з цим ім'Ñм Ñ– типами аргументів msgid "VARIADIC argument must be an array" msgstr "Ðргумент VARIADIC повинен бути маÑивом" -#: parser/parse_func.c:790 parser/parse_func.c:854 +#: parser/parse_func.c:791 parser/parse_func.c:856 #, c-format msgid "%s(*) must be used to call a parameterless aggregate function" msgstr " %s(*) треба викориÑтовувати Ð´Ð»Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ агрегатної функції без параметрів" -#: parser/parse_func.c:797 +#: parser/parse_func.c:798 #, c-format msgid "aggregates cannot return sets" msgstr "агрегатні функції не можуть повертати набори" -#: parser/parse_func.c:812 +#: parser/parse_func.c:813 #, c-format msgid "aggregates cannot use named arguments" msgstr "агрегатні функції не можуть викориÑтовувати іменовані аргументи" -#: parser/parse_func.c:844 +#: parser/parse_func.c:846 #, c-format msgid "DISTINCT is not implemented for window functions" msgstr "DISTINCT Ð´Ð»Ñ Ð²Ñ–ÐºÐ¾Ð½Ð½Ð¸Ñ… функції не реалізовано" -#: parser/parse_func.c:873 +#: parser/parse_func.c:875 #, c-format msgid "FILTER is not implemented for non-aggregate window functions" msgstr "FILTER Ð´Ð»Ñ Ð½ÐµÐ°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð¸Ñ… віконних функцій не реалізовано" -#: parser/parse_func.c:882 +#: parser/parse_func.c:884 #, c-format msgid "window function calls cannot contain set-returning function calls" msgstr "виклики віконних функцій не можуть міÑтити виклики функцій, Ñкі повертають набори" -#: parser/parse_func.c:890 +#: parser/parse_func.c:892 #, c-format msgid "window functions cannot return sets" msgstr "віконні функції не можуть повертати набори" -#: parser/parse_func.c:2168 parser/parse_func.c:2441 +#: parser/parse_func.c:2167 parser/parse_func.c:2440 #, c-format msgid "could not find a function named \"%s\"" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ функцію з іменем \"%s\"" -#: parser/parse_func.c:2182 parser/parse_func.c:2459 +#: parser/parse_func.c:2181 parser/parse_func.c:2458 #, c-format msgid "function name \"%s\" is not unique" msgstr "Ñ–Ð¼â€™Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— \"%s\" не Ñ” унікальним" -#: parser/parse_func.c:2184 parser/parse_func.c:2462 +#: parser/parse_func.c:2183 parser/parse_func.c:2461 #, c-format msgid "Specify the argument list to select the function unambiguously." msgstr "Укажіть ÑпиÑок аргументів Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ð³Ð¾ вибору функції." -#: parser/parse_func.c:2228 +#: parser/parse_func.c:2227 #, c-format msgid "procedures cannot have more than %d argument" msgid_plural "procedures cannot have more than %d arguments" @@ -17336,75 +18157,75 @@ msgstr[1] "процедури не можуть мати більш ніж %d а msgstr[2] "процедури не можуть мати більш ніж %d аргументів" msgstr[3] "процедури не можуть мати більш ніж %d аргументів" -#: parser/parse_func.c:2359 +#: parser/parse_func.c:2358 #, c-format msgid "%s is not a function" msgstr "%s не Ñ” функцією" -#: parser/parse_func.c:2379 +#: parser/parse_func.c:2378 #, c-format msgid "function %s is not an aggregate" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ %s не Ñ” агрегатною" -#: parser/parse_func.c:2407 +#: parser/parse_func.c:2406 #, c-format msgid "could not find a procedure named \"%s\"" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ процедуру з іменем \"%s\"" -#: parser/parse_func.c:2421 +#: parser/parse_func.c:2420 #, c-format msgid "could not find an aggregate named \"%s\"" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ агрегат з ім'Ñм \"%s\"" -#: parser/parse_func.c:2426 +#: parser/parse_func.c:2425 #, c-format msgid "aggregate %s(*) does not exist" msgstr "агрегат %s (*) не Ñ–Ñнує" -#: parser/parse_func.c:2431 +#: parser/parse_func.c:2430 #, c-format msgid "aggregate %s does not exist" msgstr "агрегат %s не Ñ–Ñнує" -#: parser/parse_func.c:2467 +#: parser/parse_func.c:2466 #, c-format msgid "procedure name \"%s\" is not unique" msgstr "назва процедури \"%s\" не Ñ” унікальною" -#: parser/parse_func.c:2470 +#: parser/parse_func.c:2469 #, c-format msgid "Specify the argument list to select the procedure unambiguously." msgstr "Вкажіть ÑпиÑок аргументів Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ð³Ð¾ вибору процедури." -#: parser/parse_func.c:2475 +#: parser/parse_func.c:2474 #, c-format msgid "aggregate name \"%s\" is not unique" msgstr "назва агрегатної функції \"%s\" не Ñ” унікальною" -#: parser/parse_func.c:2478 +#: parser/parse_func.c:2477 #, c-format msgid "Specify the argument list to select the aggregate unambiguously." msgstr "Вкажіть ÑпиÑок аргументів Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ð³Ð¾ вибору агрегатної функції." -#: parser/parse_func.c:2483 +#: parser/parse_func.c:2482 #, c-format msgid "routine name \"%s\" is not unique" msgstr "назва підпрограми \"%s\" не Ñ” унікальною" -#: parser/parse_func.c:2486 +#: parser/parse_func.c:2485 #, c-format msgid "Specify the argument list to select the routine unambiguously." msgstr "Вкажіть ÑпиÑок аргументів Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð¾Ð³Ð¾ вибору підпрограми." -#: parser/parse_func.c:2541 +#: parser/parse_func.c:2540 msgid "set-returning functions are not allowed in JOIN conditions" msgstr "функції, що повертають множину, не можна заÑтоÑовувати в умовах групуваннÑ" -#: parser/parse_func.c:2562 +#: parser/parse_func.c:2561 msgid "set-returning functions are not allowed in policy expressions" msgstr "функції, що повертають множину, не можна заÑтоÑовувати у виразах політики" -#: parser/parse_func.c:2578 +#: parser/parse_func.c:2577 msgid "set-returning functions are not allowed in window definitions" msgstr "функції, що повертають множину, не можна заÑтоÑовувати у віконних визначеннÑÑ…" @@ -17464,356 +18285,299 @@ msgstr "функції, що повертають множину не можна msgid "set-returning functions are not allowed in column generation expressions" msgstr "функції, що повертають множину не можна заÑтоÑовувати у виразах генерації Ñтовпців" -#: parser/parse_jsontable.c:143 -#, c-format -msgid "duplicate JSON_TABLE column name: %s" -msgstr "дублікат назви ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ JSON_TABLE: %s" - -#: parser/parse_jsontable.c:144 -#, c-format -msgid "JSON_TABLE column names must be distinct from one another." -msgstr "назви Ñтовпців JSON_TABLE повинні відрізнÑтиÑÑŒ одне від одного." - -#: parser/parse_jsontable.c:247 -#, c-format -msgid "nested JSON_TABLE columns must contain an explicit AS pathname specification if an explicit PLAN clause is used" -msgstr "вкладені Ñтовпці JSON_TABLE повинні міÑтити Ñвну Ñпецифікацію шлÑхів AS, Ñкщо викориÑтовуєтьÑÑ Ñвний вираз PLAN" - -#: parser/parse_jsontable.c:260 parser/parse_jsontable.c:271 -#: parser/parse_jsontable.c:387 parser/parse_jsontable.c:588 -#: parser/parse_jsontable.c:607 -#, c-format -msgid "invalid JSON_TABLE plan" -msgstr "неприпуÑтимий JSON_TABLE план" - -#: parser/parse_jsontable.c:261 -#, c-format -msgid "Plan node for nested path %s was not found in plan." -msgstr "Вузол плану Ð´Ð»Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ð³Ð¾ шлÑху %s не знайдено в плані." - -#: parser/parse_jsontable.c:272 -#, c-format -msgid "Plan node contains some extra or duplicate sibling nodes." -msgstr "Вузол плану міÑтить деÑкі додаткові або повторювані однорідні вузли." - -#: parser/parse_jsontable.c:388 -#, c-format -msgid "Path name was %s not found in nested columns list." -msgstr "Ðазва шлÑху %s не знайдена в ÑпиÑку вкладенних Ñтовпців." - -#: parser/parse_jsontable.c:477 -#, c-format -msgid "cannot use WITH WRAPPER clause with scalar columns" -msgstr "викориÑтовувати вираз WITH WRAPPER із ÑкалÑрними ÑтовпцÑми не можна" - -#: parser/parse_jsontable.c:482 -#, c-format -msgid "cannot use OMIT QUOTES clause with scalar columns" -msgstr "викориÑтовувати вираз OMIT QUOTES із ÑкалÑрними ÑтовпцÑми не можна" - -#: parser/parse_jsontable.c:566 -#, c-format -msgid "invalid JSON_TABLE expression" -msgstr "неприпуÑтимий вираз JSON_TABLE" - -#: parser/parse_jsontable.c:567 -#, c-format -msgid "JSON_TABLE columns must contain explicit AS pathname specification if explicit PLAN clause is used" -msgstr "Ñтовпці JSON_TABLE повинні міÑтити Ñвну Ñпецифікацію шлÑху AS, Ñкщо викориÑтовуєтьÑÑ Ñвний вираз PLAN" - -#: parser/parse_jsontable.c:589 -#, c-format -msgid "Expected INNER or OUTER JSON_TABLE plan node." -msgstr "ОчікувавÑÑ INNER або OUTER вузол плану JSON_TABLE." - -#: parser/parse_jsontable.c:608 +#: parser/parse_jsontable.c:95 #, c-format -msgid "Path name mismatch: expected %s but %s is given." -msgstr "ÐевідповідніÑть назви шлÑху: очікувалоÑÑŒ %s, але дано %s." +msgid "Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause." +msgstr "Тільки EMPTY [ ARRAY ] або ERROR дозволÑєтьÑÑ Ð² верхньому рівні Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ ON ERROR." -#: parser/parse_jsontable.c:709 +#: parser/parse_jsontable.c:189 parser/parse_jsontable.c:203 #, c-format -msgid "only string constants supported in JSON_TABLE path specification" -msgstr "у Ñпецифікації шлÑху JSON_TABLE підтримуютьÑÑ Ð»Ð¸ÑˆÐµ Ñ€Ñдкові конÑтанти" +msgid "duplicate JSON_TABLE column or path name: %s" +msgstr "дублікат назви ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ JSON_TABLE або шлÑху: %s" -#: parser/parse_merge.c:119 +#: parser/parse_merge.c:129 #, c-format msgid "WITH RECURSIVE is not supported for MERGE statement" msgstr "WITH RECURSIVE не підтримуєтьÑÑ Ð´Ð»Ñ Ñ–Ð½Ñтрукції MERGE" -#: parser/parse_merge.c:163 +#: parser/parse_merge.c:176 #, c-format msgid "unreachable WHEN clause specified after unconditional WHEN clause" msgstr "недоÑÑжна Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ WHEN зазначено піÑÐ»Ñ Ð±ÐµÐ·ÑƒÐ¼Ð¾Ð²Ð½Ð¾Ð³Ð¾ Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ WHEN" -#: parser/parse_merge.c:178 parser/parse_merge.c:184 -#, c-format -msgid "cannot execute MERGE on relation \"%s\"" -msgstr "не можна виконати MERGE Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"" - -#: parser/parse_merge.c:186 -#, c-format -msgid "MERGE is not supported for relations with rules." -msgstr "MERGE не підтримує Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· правилами." - -#: parser/parse_merge.c:203 +#: parser/parse_merge.c:222 #, c-format msgid "name \"%s\" specified more than once" msgstr "ім'Ñ \"%s\" вказано кілька разів" -#: parser/parse_merge.c:205 +#: parser/parse_merge.c:224 #, c-format msgid "The name is used both as MERGE target table and data source." msgstr "Ім'Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾ одночаÑно Ñк цільова Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ñ‚Ð° джерело MERGE." -#: parser/parse_node.c:86 +#: parser/parse_node.c:82 #, c-format msgid "target lists can have at most %d entries" msgstr "цільові ÑпиÑки можуть мати макÑимум %d елементів" -#: parser/parse_oper.c:123 parser/parse_oper.c:690 +#: parser/parse_oper.c:114 parser/parse_oper.c:678 #, c-format msgid "postfix operators are not supported" msgstr "поÑтфікÑні оператори не підтримуютьÑÑ" -#: parser/parse_oper.c:130 parser/parse_oper.c:649 utils/adt/regproc.c:539 -#: utils/adt/regproc.c:723 -#, c-format -msgid "operator does not exist: %s" -msgstr "оператор не Ñ–Ñнує: %s" - -#: parser/parse_oper.c:229 +#: parser/parse_oper.c:217 #, c-format msgid "Use an explicit ordering operator or modify the query." msgstr "ВикориÑтати Ñвний оператор ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ змінити запит." -#: parser/parse_oper.c:485 +#: parser/parse_oper.c:473 #, c-format msgid "operator requires run-time type coercion: %s" msgstr "оператор вимагає Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð² під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ: %s" -#: parser/parse_oper.c:641 +#: parser/parse_oper.c:629 #, c-format msgid "operator is not unique: %s" msgstr "оператор не Ñ” унікальним: %s" -#: parser/parse_oper.c:643 +#: parser/parse_oper.c:631 #, c-format msgid "Could not choose a best candidate operator. You might need to add explicit type casts." msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð±Ñ€Ð°Ñ‚Ð¸ найкращу кандидатуру оператора. Вам, можливо треба додати Ñвні Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð²." -#: parser/parse_oper.c:652 +#: parser/parse_oper.c:640 #, c-format msgid "No operator matches the given name and argument type. You might need to add an explicit type cast." msgstr "Жодний оператор не відповідає даному імені та типу аргументу. Вам, можливо, треба додати Ñвне Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ." -#: parser/parse_oper.c:654 +#: parser/parse_oper.c:642 #, c-format msgid "No operator matches the given name and argument types. You might need to add explicit type casts." msgstr "Жодний оператор не відповідає даному імені та типу аргументу. Вам, можливо, треба додати Ñвні Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð²." -#: parser/parse_oper.c:714 parser/parse_oper.c:828 -#, c-format -msgid "operator is only a shell: %s" -msgstr "оператор Ñ” лише оболонкою: %s" - -#: parser/parse_oper.c:816 +#: parser/parse_oper.c:803 #, c-format msgid "op ANY/ALL (array) requires array on right side" msgstr "op ANY/ALL (маÑив) вимагає маÑив Ñправа" -#: parser/parse_oper.c:858 +#: parser/parse_oper.c:844 #, c-format msgid "op ANY/ALL (array) requires operator to yield boolean" msgstr "op ANY/ALL (маÑив) вимагає оператора Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð½Ð½Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ типу" -#: parser/parse_oper.c:863 +#: parser/parse_oper.c:849 #, c-format msgid "op ANY/ALL (array) requires operator not to return a set" msgstr "op ANY/ALL (маÑив) вимагає оператора не Ð´Ð»Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð¼Ð½Ð¾Ð¶Ð¸Ð½Ð¸" -#: parser/parse_param.c:225 +#: parser/parse_param.c:221 #, c-format msgid "inconsistent types deduced for parameter $%d" msgstr "Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ $%d виведені неузгоджені типи" -#: parser/parse_param.c:313 tcop/postgres.c:709 +#: parser/parse_param.c:309 tcop/postgres.c:744 #, c-format msgid "could not determine data type of parameter $%d" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ тип даних параметра $%d" -#: parser/parse_relation.c:201 +#: parser/parse_relation.c:221 #, c-format msgid "table reference \"%s\" is ambiguous" msgstr "поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° таблицю \"%s\" неоднозначне" -#: parser/parse_relation.c:245 +#: parser/parse_relation.c:265 #, c-format msgid "table reference %u is ambiguous" msgstr "поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° таблицю %u неоднозначне" -#: parser/parse_relation.c:445 +#: parser/parse_relation.c:465 #, c-format msgid "table name \"%s\" specified more than once" msgstr "ім'Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\" вказано більше одного разу" -#: parser/parse_relation.c:474 parser/parse_relation.c:3595 +#: parser/parse_relation.c:494 parser/parse_relation.c:3633 +#: parser/parse_relation.c:3642 #, c-format msgid "invalid reference to FROM-clause entry for table \"%s\"" msgstr "в елементі Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ FROM неприпуÑтиме поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° таблицю \"%s\"" -#: parser/parse_relation.c:478 parser/parse_relation.c:3600 +#: parser/parse_relation.c:498 parser/parse_relation.c:3644 #, c-format msgid "There is an entry for table \"%s\", but it cannot be referenced from this part of the query." msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" приÑÑƒÑ‚Ð½Ñ Ð² запиті, але поÑилатиÑÑ Ð½Ð° неї з цієї чаÑтини запиту не можна." -#: parser/parse_relation.c:480 +#: parser/parse_relation.c:500 #, c-format msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." msgstr "Ð”Ð»Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ LATERAL тип JOIN повинен бути INNER або LEFT." -#: parser/parse_relation.c:691 +#: parser/parse_relation.c:703 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "недопуÑтиме поÑÐ¸Ð»Ð°Ð½Ð½Ñ ÑиÑтеми Ñтовпців \"%s\" в обмеженні Check" -#: parser/parse_relation.c:700 +#: parser/parse_relation.c:712 #, c-format msgid "cannot use system column \"%s\" in column generation expression" msgstr "викориÑтовувати ÑиÑтемний Ñтовпець \"%s\" у виразах генерації Ñтовпців, не можна" -#: parser/parse_relation.c:711 +#: parser/parse_relation.c:723 #, c-format msgid "cannot use system column \"%s\" in MERGE WHEN condition" msgstr "неможливо викориÑтати Ñимтемний Ñтовпець \"%s\" в умові MERGE WHEN" -#: parser/parse_relation.c:1184 parser/parse_relation.c:1636 -#: parser/parse_relation.c:2358 +#: parser/parse_relation.c:1236 parser/parse_relation.c:1691 +#: parser/parse_relation.c:2384 #, c-format msgid "table \"%s\" has %d columns available but %d columns specified" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" має %d доÑтупних Ñтовпців, але вказано %d Ñтовпців" -#: parser/parse_relation.c:1388 +#: parser/parse_relation.c:1445 #, c-format msgid "There is a WITH item named \"%s\", but it cannot be referenced from this part of the query." msgstr "ІÑнує WITH елемент \"%s\" але на нього не можна поÑилатиÑÑ Ð· цієї чаÑтини запиту." -#: parser/parse_relation.c:1390 +#: parser/parse_relation.c:1447 #, c-format msgid "Use WITH RECURSIVE, or re-order the WITH items to remove forward references." msgstr "ВикориÑтовувати WITH RECURSIVE, або перевпорÑдкувати елементи WITH, щоб видалити попередні поÑиланнÑ." -#: parser/parse_relation.c:1778 +#: parser/parse_relation.c:1833 #, c-format msgid "a column definition list is redundant for a function with OUT parameters" msgstr "ÑпиÑок з визначеннÑм Ñтовпців не потрібен Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— з параметрами OUT" -#: parser/parse_relation.c:1784 +#: parser/parse_relation.c:1839 #, c-format msgid "a column definition list is redundant for a function returning a named composite type" msgstr "ÑпиÑок з визначеннÑм Ñтовпців не потрібен Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—, Ñка повертає іменований Ñкладений тип" -#: parser/parse_relation.c:1791 +#: parser/parse_relation.c:1846 #, c-format msgid "a column definition list is only allowed for functions returning \"record\"" msgstr "ÑпиÑок з визначеннÑм Ñтовпців дозволений лише Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹, що повертають \"запиÑ\"" -#: parser/parse_relation.c:1802 +#: parser/parse_relation.c:1857 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "ÑпиÑок з визначеннÑм Ñтовпців вимагаєтьÑÑ Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¹, що повертають \"запиÑ\"" -#: parser/parse_relation.c:1839 +#: parser/parse_relation.c:1894 #, c-format msgid "column definition lists can have at most %d entries" msgstr "ÑпиÑки визначень Ñтовпців можуть мати макÑимум %d елементів" -#: parser/parse_relation.c:1899 +#: parser/parse_relation.c:1954 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" у FROM повертає тип, що не підтримуєтьÑÑ %s" -#: parser/parse_relation.c:1926 parser/parse_relation.c:2019 +#: parser/parse_relation.c:1981 parser/parse_relation.c:2066 #, c-format msgid "functions in FROM can return at most %d columns" msgstr "функції з FROM можуть повертати не більше %d Ñтовпців" -#: parser/parse_relation.c:2050 +#: parser/parse_relation.c:2096 #, c-format msgid "%s function has %d columns available but %d columns specified" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" має %d доÑтупних Ñтовпців, але вказано %d Ñтовпців" -#: parser/parse_relation.c:2139 +#: parser/parse_relation.c:2177 #, c-format msgid "VALUES lists \"%s\" have %d columns available but %d columns specified" msgstr "VALUES ÑпиÑки \"%s\" мають %d доÑтупних Ñтовпців, але %d Ñтовпців вказано" -#: parser/parse_relation.c:2211 +#: parser/parse_relation.c:2242 #, c-format msgid "joins can have at most %d columns" msgstr "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ мати макÑимум %d Ñтовпців" -#: parser/parse_relation.c:2236 +#: parser/parse_relation.c:2267 #, c-format msgid "join expression \"%s\" has %d columns available but %d columns specified" msgstr "вираз з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ \"%s\" має %d доÑтупних Ñтовпців, але %d Ñтовпців вказано" -#: parser/parse_relation.c:2331 +#: parser/parse_relation.c:2357 #, c-format msgid "WITH query \"%s\" does not have a RETURNING clause" msgstr "WITH запит \"%s\" не має Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ RETURNING" -#: parser/parse_relation.c:3598 +#: parser/parse_relation.c:3635 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "Можливо, малоÑÑ Ð½Ð° увазі поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° пÑевдонім таблиці \"%s\"." -#: parser/parse_relation.c:3606 +#: parser/parse_relation.c:3647 #, c-format -msgid "missing FROM-clause entry for table \"%s\"" +msgid "To reference that table, you must mark this subquery with LATERAL." +msgstr "Щоб викориÑтати цю таблицю, вам потрібно позначити цей підзапит Ñк LATERAL." + +#: parser/parse_relation.c:3653 +#, c-format +msgid "missing FROM-clause entry for table \"%s\"" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" відÑÑƒÑ‚Ð½Ñ Ð² реченні FROM" -#: parser/parse_relation.c:3658 +#: parser/parse_relation.c:3693 #, c-format -msgid "Perhaps you meant to reference the column \"%s.%s\"." -msgstr "Можливо, передбачалоÑÑŒ поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñтовпець \"%s.%s\"." +msgid "There are columns named \"%s\", but they are in tables that cannot be referenced from this part of the query." +msgstr "Є Ñтовпці з назвою \"%s\", але вони знаходÑтьÑÑ Ð² таблицÑÑ…, на Ñкі не можна поÑилатиÑÑ Ð· цієї чаÑтини запиту." + +#: parser/parse_relation.c:3695 +#, c-format +msgid "Try using a table-qualified name." +msgstr "Спробуй викориÑтати повне ім'Ñ Ð²ÐºÐ»ÑŽÑ‡Ð½Ð¾ з таблицею." -#: parser/parse_relation.c:3660 +#: parser/parse_relation.c:3703 #, c-format msgid "There is a column named \"%s\" in table \"%s\", but it cannot be referenced from this part of the query." msgstr "Є Ñтовпець з іменем \"%s\" в таблиці \"%s\", але на нього не можна поÑилатиÑÑŒ з цієї чаÑтини запиту." -#: parser/parse_relation.c:3677 +#: parser/parse_relation.c:3706 +#, c-format +msgid "To reference that column, you must mark this subquery with LATERAL." +msgstr "Щоб викориÑтати цей Ñтовпець, вам потрібно позначити цей підзапит Ñк LATERAL." + +#: parser/parse_relation.c:3708 +#, c-format +msgid "To reference that column, you must use a table-qualified name." +msgstr "Щоб поÑилатиÑÑ Ð½Ð° цей Ñтовпець, ви повинні викориÑтовувати повне ім'Ñ Ð²ÐºÐ»ÑŽÑ‡Ð½Ð¾ з таблицею." + +#: parser/parse_relation.c:3728 +#, c-format +msgid "Perhaps you meant to reference the column \"%s.%s\"." +msgstr "Можливо, передбачалоÑÑŒ поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñтовпець \"%s.%s\"." + +#: parser/parse_relation.c:3742 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\" or the column \"%s.%s\"." msgstr "Можливо, передбачалоÑÑŒ поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñтовпець \"%s.%s\" або Ñтовпець \"%s.%s\"." -#: parser/parse_target.c:482 parser/parse_target.c:803 +#: parser/parse_target.c:480 parser/parse_target.c:795 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "призначити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑиÑтемному Ñтовпцю \"%s\" не можна" -#: parser/parse_target.c:510 +#: parser/parse_target.c:508 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "елементу маÑива не можна вÑтановити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ DEFAULT" -#: parser/parse_target.c:515 +#: parser/parse_target.c:513 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "підполю не можна вÑтановити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ DEFAULT" -#: parser/parse_target.c:589 +#: parser/parse_target.c:587 #, c-format msgid "column \"%s\" is of type %s but expression is of type %s" msgstr "Ñтовпець \"%s\" має тип %s, а вираз %s" -#: parser/parse_target.c:787 +#: parser/parse_target.c:779 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because its type %s is not a composite type" msgstr "призначити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð»ÑŽ \"%s\" ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" не можна, тому, що тип %s не Ñ” Ñкладеним типом" -#: parser/parse_target.c:796 +#: parser/parse_target.c:788 #, c-format msgid "cannot assign to field \"%s\" of column \"%s\" because there is no such column in data type %s" msgstr "призначити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð»ÑŽ \"%s\" ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" не можна, тому, що в типі даних %s немає такого ÑтовпцÑ" @@ -17828,7 +18592,7 @@ msgstr "індекÑоване приÑÐ²Ð¾Ñ”Ð½Ð½Ñ \"%s\" вимагає тип msgid "subfield \"%s\" is of type %s but expression is of type %s" msgstr "підполе \"%s\" має тип %s, але вираз має тип %s" -#: parser/parse_target.c:1323 +#: parser/parse_target.c:1327 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "SELECT * повинен поÑилатиÑÑŒ на таблиці" @@ -17848,8 +18612,8 @@ msgstr "неправильне поÑÐ¸Ð»Ð°Ð½Ð½Ñ %%TYPE (занадто баг msgid "type reference %s converted to %s" msgstr "поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° тип %s перетворене на тип %s" -#: parser/parse_type.c:278 parser/parse_type.c:807 utils/cache/typcache.c:390 -#: utils/cache/typcache.c:445 +#: parser/parse_type.c:278 parser/parse_type.c:813 utils/cache/typcache.c:397 +#: utils/cache/typcache.c:452 #, c-format msgid "type \"%s\" is only a shell" msgstr "тип \"%s\" Ñ” лише оболонкою" @@ -17864,374 +18628,364 @@ msgstr "тип \"%s\" не дозволÑÑ” викориÑÑ‚Ð°Ð½Ð½Ñ Ð¼Ð¾Ð´Ð¸Ñ„ msgid "type modifiers must be simple constants or identifiers" msgstr "модифікатором типу повинна бути звичайна конÑтанта або ідентифікатор" -#: parser/parse_type.c:725 parser/parse_type.c:770 +#: parser/parse_type.c:723 parser/parse_type.c:773 #, c-format msgid "invalid type name \"%s\"" msgstr "невірне ім'Ñ Ñ‚Ð¸Ð¿Ñƒ \"%s\"" -#: parser/parse_utilcmd.c:266 +#: parser/parse_utilcmd.c:263 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "Ñтворити Ñекціоновану таблицю в ÑкоÑті нащадка не можна" -#: parser/parse_utilcmd.c:579 +#: parser/parse_utilcmd.c:475 +#, c-format +msgid "cannot set logged status of a temporary sequence" +msgstr "неможливо вÑтановити ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñової поÑлідовноÑті" + +#: parser/parse_utilcmd.c:611 #, c-format msgid "array of serial is not implemented" msgstr "маÑиви поÑлідовноÑті не реалізовані" -#: parser/parse_utilcmd.c:658 parser/parse_utilcmd.c:670 -#: parser/parse_utilcmd.c:729 +#: parser/parse_utilcmd.c:690 parser/parse_utilcmd.c:702 +#: parser/parse_utilcmd.c:761 #, c-format msgid "conflicting NULL/NOT NULL declarations for column \"%s\" of table \"%s\"" msgstr "неÑуміÑні Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ NULL/NOT NULL Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" таблиці \"%s\"" -#: parser/parse_utilcmd.c:682 +#: parser/parse_utilcmd.c:714 #, c-format msgid "multiple default values specified for column \"%s\" of table \"%s\"" msgstr "Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" таблиці \"%s\" вказано декілька значень за замовчуваннÑм" -#: parser/parse_utilcmd.c:699 +#: parser/parse_utilcmd.c:731 #, c-format msgid "identity columns are not supported on typed tables" msgstr "ідентифікаційні Ñтовпці не підтримуютьÑÑ Ð² типізованих таблицÑÑ…" -#: parser/parse_utilcmd.c:703 +#: parser/parse_utilcmd.c:735 #, c-format msgid "identity columns are not supported on partitions" msgstr "ідентифікаційні Ñтовпці не підтримуютьÑÑ Ð· ÑекціÑми" -#: parser/parse_utilcmd.c:712 +#: parser/parse_utilcmd.c:744 #, c-format msgid "multiple identity specifications for column \"%s\" of table \"%s\"" msgstr "Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" таблиці \"%s\" влаÑтивіÑть identity вказана неодноразово" -#: parser/parse_utilcmd.c:742 +#: parser/parse_utilcmd.c:774 #, c-format msgid "generated columns are not supported on typed tables" msgstr "згенеровані Ñтовпці не підтримуютьÑÑ Ð² типізованих таблицÑÑ…" -#: parser/parse_utilcmd.c:746 -#, c-format -msgid "generated columns are not supported on partitions" -msgstr "згенеровані Ñтовпці не підтримуютьÑÑ Ð² ÑекціÑÑ…" - -#: parser/parse_utilcmd.c:751 +#: parser/parse_utilcmd.c:778 #, c-format msgid "multiple generation clauses specified for column \"%s\" of table \"%s\"" msgstr "Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" таблиці \"%s\" вказано декілька речень генерації" -#: parser/parse_utilcmd.c:769 parser/parse_utilcmd.c:884 +#: parser/parse_utilcmd.c:796 parser/parse_utilcmd.c:911 #, c-format msgid "primary key constraints are not supported on foreign tables" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€Ð²Ð¸Ð½Ð½Ð¾Ð³Ð¾ ключа Ð´Ð»Ñ Ñторонніх таблиць не підтримуютьÑÑ" -#: parser/parse_utilcmd.c:778 parser/parse_utilcmd.c:894 +#: parser/parse_utilcmd.c:805 parser/parse_utilcmd.c:921 #, c-format msgid "unique constraints are not supported on foreign tables" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑƒÐ½Ñ–ÐºÐ°Ð»ÑŒÐ½Ð¾Ñті Ð´Ð»Ñ Ñторонніх таблиць не підтримуютьÑÑ" -#: parser/parse_utilcmd.c:823 +#: parser/parse_utilcmd.c:850 #, c-format msgid "both default and identity specified for column \"%s\" of table \"%s\"" msgstr "Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" таблиці \"%s\" вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм Ñ– влаÑтивіÑть identity" -#: parser/parse_utilcmd.c:831 +#: parser/parse_utilcmd.c:858 #, c-format msgid "both default and generation expression specified for column \"%s\" of table \"%s\"" msgstr "Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" таблиці \"%s\" вказано вираз за замовчуваннÑм Ñ– вираз генерації" -#: parser/parse_utilcmd.c:839 +#: parser/parse_utilcmd.c:866 #, c-format msgid "both identity and generation expression specified for column \"%s\" of table \"%s\"" msgstr "Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" таблиці \"%s\" вказано вираз ідентичноÑті Ñ– вираз генерації" -#: parser/parse_utilcmd.c:904 +#: parser/parse_utilcmd.c:931 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "обмеженнÑ-Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñторонніх таблиць не підтримуютьÑÑ" -#: parser/parse_utilcmd.c:910 -#, c-format -msgid "exclusion constraints are not supported on partitioned tables" -msgstr "обмеженнÑ-Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñекціонованих таблиць не підтримуютьÑÑ" - -#: parser/parse_utilcmd.c:975 +#: parser/parse_utilcmd.c:996 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "LIKE не підтримуєтьÑÑ Ð¿Ñ€Ð¸ Ñтворенні Ñторонніх таблиць" -#: parser/parse_utilcmd.c:988 +#: parser/parse_utilcmd.c:1009 #, c-format msgid "relation \"%s\" is invalid in LIKE clause" msgstr "невірше Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" в реченні LIKE" -#: parser/parse_utilcmd.c:1754 parser/parse_utilcmd.c:1862 +#: parser/parse_utilcmd.c:1736 parser/parse_utilcmd.c:1844 #, c-format msgid "Index \"%s\" contains a whole-row table reference." msgstr "Ð†Ð½Ð´ÐµÐºÑ \"%s\" міÑтить поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° таблицю на веÑÑŒ Ñ€Ñдок." -#: parser/parse_utilcmd.c:2251 +#: parser/parse_utilcmd.c:2242 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "у CREATE TABLE не можна викориÑтовувати Ñ–Ñнуючий індекÑ" -#: parser/parse_utilcmd.c:2271 +#: parser/parse_utilcmd.c:2262 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" вже пов'Ñзаний з обмеженнÑм" -#: parser/parse_utilcmd.c:2286 -#, c-format -msgid "index \"%s\" is not valid" -msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" не Ñ” припуÑтимим" - -#: parser/parse_utilcmd.c:2292 +#: parser/parse_utilcmd.c:2283 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\" не Ñ” унікальним індекÑом" -#: parser/parse_utilcmd.c:2293 parser/parse_utilcmd.c:2300 -#: parser/parse_utilcmd.c:2307 parser/parse_utilcmd.c:2384 +#: parser/parse_utilcmd.c:2284 parser/parse_utilcmd.c:2291 +#: parser/parse_utilcmd.c:2298 parser/parse_utilcmd.c:2375 #, c-format msgid "Cannot create a primary key or unique constraint using such an index." msgstr "Створити первинний ключ або Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑƒÐ½Ñ–ÐºÐ°Ð»ÑŒÐ½Ð¾Ñті, викориÑтовуючи такий індекÑ, не можна." -#: parser/parse_utilcmd.c:2299 +#: parser/parse_utilcmd.c:2290 #, c-format msgid "index \"%s\" contains expressions" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" міÑтить вирази" -#: parser/parse_utilcmd.c:2306 +#: parser/parse_utilcmd.c:2297 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\" Ñ” чаÑтковим індекÑом" -#: parser/parse_utilcmd.c:2318 +#: parser/parse_utilcmd.c:2309 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\" Ñ” індекÑом, що відкладаєтьÑÑ" -#: parser/parse_utilcmd.c:2319 +#: parser/parse_utilcmd.c:2310 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "Створити обмеженнÑ, що не відкладаєтьÑÑ, викориÑтовуючи індекÑ, що відкладаєтьÑÑ, не можна." -#: parser/parse_utilcmd.c:2383 +#: parser/parse_utilcmd.c:2374 #, c-format msgid "index \"%s\" column number %d does not have default sorting behavior" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" номер ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ %d не має поведінки ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° замовчуваннÑм" -#: parser/parse_utilcmd.c:2540 +#: parser/parse_utilcmd.c:2531 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "Ñтовпець \"%s\" з'ÑвлÑєтьÑÑ Ð´Ð²Ñ–Ñ‡Ñ– в обмеженні первинного ключа" -#: parser/parse_utilcmd.c:2546 +#: parser/parse_utilcmd.c:2537 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "Ñтовпець \"%s\" з'ÑвлÑєтьÑÑ Ð´Ð²Ñ–Ñ‡Ñ– в обмеженні унікальноÑті" -#: parser/parse_utilcmd.c:2893 +#: parser/parse_utilcmd.c:2871 #, c-format msgid "index expressions and predicates can refer only to the table being indexed" msgstr "індекÑ-вирази й предикати можуть поÑилатиÑÑŒ лише на індекÑовану таблицю" -#: parser/parse_utilcmd.c:2965 +#: parser/parse_utilcmd.c:2943 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "вирази ÑтатиÑтики можуть поÑилатиÑÑ Ð»Ð¸ÑˆÐµ на таблицю, Ð´Ð»Ñ Ñкої збираєтьÑÑ ÑтатиÑтика" -#: parser/parse_utilcmd.c:3008 +#: parser/parse_utilcmd.c:2986 #, c-format msgid "rules on materialized views are not supported" msgstr "правила Ð´Ð»Ñ Ð¼Ð°Ñ‚ÐµÑ€Ñ–Ð°Ð»Ñ–Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ… подань не підтримуютьÑÑ" -#: parser/parse_utilcmd.c:3071 +#: parser/parse_utilcmd.c:3046 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "в умовах WHERE правила не можуть міÑтити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° інші зв'Ñзки" -#: parser/parse_utilcmd.c:3144 +#: parser/parse_utilcmd.c:3118 #, c-format msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELETE actions" msgstr "правила з умовами WHERE можуть мати лише дії SELECT, INSERT, UPDATE або DELETE" -#: parser/parse_utilcmd.c:3162 parser/parse_utilcmd.c:3263 -#: rewrite/rewriteHandler.c:508 rewrite/rewriteManip.c:1018 +#: parser/parse_utilcmd.c:3136 parser/parse_utilcmd.c:3237 +#: rewrite/rewriteHandler.c:544 rewrite/rewriteManip.c:1096 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "умовні оператори UNION/INTERSECT/EXCEPT не реалізовані" -#: parser/parse_utilcmd.c:3180 +#: parser/parse_utilcmd.c:3154 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "у правилі ON SELECT не можна викориÑтовувати OLD" -#: parser/parse_utilcmd.c:3184 +#: parser/parse_utilcmd.c:3158 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "у правилі ON SELECT не можна викориÑтовувати NEW" -#: parser/parse_utilcmd.c:3193 +#: parser/parse_utilcmd.c:3167 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "у правилі ON INSERT не можна викориÑтовувати OLD" -#: parser/parse_utilcmd.c:3199 +#: parser/parse_utilcmd.c:3173 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "у правилі ON DELETE не можна викориÑтовувати NEW" -#: parser/parse_utilcmd.c:3227 +#: parser/parse_utilcmd.c:3201 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "у запиті WITH не можна поÑилатиÑÑ Ð½Ð° OLD" -#: parser/parse_utilcmd.c:3234 +#: parser/parse_utilcmd.c:3208 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "у запиті WITH не можна поÑилатиÑÑ Ð½Ð° NEW" -#: parser/parse_utilcmd.c:3688 +#: parser/parse_utilcmd.c:3664 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ DEFERRABLE розташовано неправильно" -#: parser/parse_utilcmd.c:3693 parser/parse_utilcmd.c:3708 +#: parser/parse_utilcmd.c:3669 parser/parse_utilcmd.c:3684 #, c-format msgid "multiple DEFERRABLE/NOT DEFERRABLE clauses not allowed" msgstr "декілька речень DEFERRABLE/NOT DEFERRABLE не допуÑкаютьÑÑ" -#: parser/parse_utilcmd.c:3703 +#: parser/parse_utilcmd.c:3679 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ NOT DEFERRABLE розташовано неправильно" -#: parser/parse_utilcmd.c:3716 parser/parse_utilcmd.c:3742 gram.y:6051 +#: parser/parse_utilcmd.c:3692 parser/parse_utilcmd.c:3718 gram.y:6114 #, c-format msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" msgstr "обмеженнÑ, оголошене Ñк INITIALLY DEFERRED, повинно бути оголошене Ñк DEFERRABLE" -#: parser/parse_utilcmd.c:3724 +#: parser/parse_utilcmd.c:3700 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ INITIALLY DEFERRED розташовано неправильно" -#: parser/parse_utilcmd.c:3729 parser/parse_utilcmd.c:3755 +#: parser/parse_utilcmd.c:3705 parser/parse_utilcmd.c:3731 #, c-format msgid "multiple INITIALLY IMMEDIATE/DEFERRED clauses not allowed" msgstr "декілька речень INITIALLY IMMEDIATE/DEFERRED не допуÑкаютьÑÑ" -#: parser/parse_utilcmd.c:3750 +#: parser/parse_utilcmd.c:3726 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ INITIALLY IMMEDIATE розташовано неправильно" -#: parser/parse_utilcmd.c:3941 +#: parser/parse_utilcmd.c:3919 #, c-format msgid "CREATE specifies a schema (%s) different from the one being created (%s)" msgstr "Ð’ CREATE вказана Ñхема (%s), Ñка відрізнÑєтьÑÑ Ð²Ñ–Ð´ Ñтворюваної (%s)" -#: parser/parse_utilcmd.c:3976 +#: parser/parse_utilcmd.c:3954 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\" не Ñ” Ñекціонованою таблицею" -#: parser/parse_utilcmd.c:3983 +#: parser/parse_utilcmd.c:3961 #, c-format msgid "table \"%s\" is not partitioned" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s\" не Ñ” Ñекційною" -#: parser/parse_utilcmd.c:3990 +#: parser/parse_utilcmd.c:3968 #, c-format msgid "index \"%s\" is not partitioned" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" не Ñ” Ñекціонованим" -#: parser/parse_utilcmd.c:4030 +#: parser/parse_utilcmd.c:4008 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "у геш-Ñекціонованій таблиці не може бути розділу за замовчуваннÑм" -#: parser/parse_utilcmd.c:4047 +#: parser/parse_utilcmd.c:4025 #, c-format msgid "invalid bound specification for a hash partition" msgstr "неприпуÑтима вказівка границі Ð´Ð»Ñ Ð³ÐµÑˆ-Ñекції" -#: parser/parse_utilcmd.c:4053 partitioning/partbounds.c:4824 +#: parser/parse_utilcmd.c:4031 partitioning/partbounds.c:4802 #, c-format msgid "modulus for hash partition must be an integer value greater than zero" -msgstr "модуль Ð´Ð»Ñ Ñ…ÐµÑˆ-Ñекції повинен бути цілим чиÑлом більшим за нуль" +msgstr "модуль Ð´Ð»Ñ Ñ…ÐµÑˆ-Ñекції повинен бути цілим чиÑлом більше за нуль" -#: parser/parse_utilcmd.c:4060 partitioning/partbounds.c:4832 +#: parser/parse_utilcmd.c:4038 partitioning/partbounds.c:4810 #, c-format msgid "remainder for hash partition must be less than modulus" msgstr "залишок Ð´Ð»Ñ Ð³ÐµÑˆ-Ñекції повинен бути меньшим, ніж модуль" -#: parser/parse_utilcmd.c:4073 +#: parser/parse_utilcmd.c:4051 #, c-format msgid "invalid bound specification for a list partition" msgstr "нерипуÑтима вказівка границі Ð´Ð»Ñ Ñекції по ÑпиÑку" -#: parser/parse_utilcmd.c:4126 +#: parser/parse_utilcmd.c:4104 #, c-format msgid "invalid bound specification for a range partition" msgstr "неприпуÑтима вказівка границі Ð´Ð»Ñ Ñекції діапазону" -#: parser/parse_utilcmd.c:4132 +#: parser/parse_utilcmd.c:4110 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "Ð’ FROM повинно вказуватиÑÑ Ð»Ð¸ÑˆÐµ одне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ ÑекціонуваннÑ" -#: parser/parse_utilcmd.c:4136 +#: parser/parse_utilcmd.c:4114 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "Ð’ TO повинно вказуватиÑÑ Ð»Ð¸ÑˆÐµ одне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ ÑекціонуваннÑ" -#: parser/parse_utilcmd.c:4250 +#: parser/parse_utilcmd.c:4228 #, c-format msgid "cannot specify NULL in range bound" msgstr "вказати NULL в діапазоні границі не можна" -#: parser/parse_utilcmd.c:4299 +#: parser/parse_utilcmd.c:4277 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "за кожною границею MAXVALUE повинні бути лише границі MAXVALUE" -#: parser/parse_utilcmd.c:4306 +#: parser/parse_utilcmd.c:4284 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "за кожною границею MINVALUE повинні бути лише границі MINVALUE" -#: parser/parse_utilcmd.c:4349 +#: parser/parse_utilcmd.c:4327 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "вказане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ можна привеÑти до типу %s Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: parser/parser.c:263 +#: parser/parser.c:273 msgid "UESCAPE must be followed by a simple string literal" msgstr "UESCAPE повинен відÑтежуватиÑÑŒ проÑтим літеральним Ñ€Ñдком" -#: parser/parser.c:268 +#: parser/parser.c:278 msgid "invalid Unicode escape character" msgstr "неприпуÑтимий Ñимвол Ñпеціального коду Unicode" -#: parser/parser.c:337 scan.l:1338 +#: parser/parser.c:347 scan.l:1393 #, c-format msgid "invalid Unicode escape value" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñпеціального коду Unicode" -#: parser/parser.c:484 utils/adt/varlena.c:6533 scan.l:684 +#: parser/parser.c:494 utils/adt/varlena.c:6640 scan.l:716 #, c-format msgid "invalid Unicode escape" msgstr "неприпуÑтимий Ñпеціальний код Unicode" -#: parser/parser.c:485 +#: parser/parser.c:495 #, c-format msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Спеціальні Ñимволи Unicode повинні бути \\XXXX або \\+XXXXXX." -#: parser/parser.c:513 utils/adt/varlena.c:6558 scan.l:645 scan.l:661 -#: scan.l:677 +#: parser/parser.c:523 utils/adt/varlena.c:6665 scan.l:677 scan.l:693 +#: scan.l:709 #, c-format msgid "invalid Unicode surrogate pair" msgstr "неприпуÑтима Ñурогатна пара Unicode" @@ -18241,165 +18995,162 @@ msgstr "неприпуÑтима Ñурогатна пара Unicode" msgid "identifier \"%s\" will be truncated to \"%.*s\"" msgstr "ідентифікатор \"%s\" буде Ñкорочено до \"%.*s\"" -#: partitioning/partbounds.c:2933 +#: partitioning/partbounds.c:2920 #, c-format msgid "partition \"%s\" conflicts with existing default partition \"%s\"" msgstr "Ñ–Ñнують конфлікти між розділом \"%s\" та Ñ–Ñнуючим розділом за замовчуваннÑм \"%s\"" -#: partitioning/partbounds.c:2985 partitioning/partbounds.c:3004 -#: partitioning/partbounds.c:3026 +#: partitioning/partbounds.c:2972 partitioning/partbounds.c:2991 +#: partitioning/partbounds.c:3013 #, c-format msgid "every hash partition modulus must be a factor of the next larger modulus" msgstr "модуль кожної геш-Ñекції повинен бути дільником наÑтупних більших модулів" -#: partitioning/partbounds.c:2986 partitioning/partbounds.c:3027 +#: partitioning/partbounds.c:2973 partitioning/partbounds.c:3014 #, c-format msgid "The new modulus %d is not a factor of %d, the modulus of existing partition \"%s\"." msgstr "Ðовий модуль %d не Ñ” дільником %d, поточний модуль розділу \"%s\"." -#: partitioning/partbounds.c:3005 +#: partitioning/partbounds.c:2992 #, c-format msgid "The new modulus %d is not divisible by %d, the modulus of existing partition \"%s\"." msgstr "Ðовий модуль %d не ділитьÑÑ Ð½Ð° %d, поточний модуль розділу \"%s\"." -#: partitioning/partbounds.c:3140 +#: partitioning/partbounds.c:3127 #, c-format msgid "empty range bound specified for partition \"%s\"" msgstr "Ð´Ð»Ñ Ñекції \"%s\" вказані границі, Ñкі утворюють пуÑтий діапазон" -#: partitioning/partbounds.c:3142 +#: partitioning/partbounds.c:3129 #, c-format msgid "Specified lower bound %s is greater than or equal to upper bound %s." msgstr "Вказана Ð½Ð¸Ð¶Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ %s більша або дорівнює верхній границі %s." -#: partitioning/partbounds.c:3254 +#: partitioning/partbounds.c:3237 #, c-format msgid "partition \"%s\" would overlap partition \"%s\"" msgstr "ÑÐµÐºÑ†Ñ–Ñ \"%s\" буде перекривати Ñекцію \"%s\"" -#: partitioning/partbounds.c:3371 +#: partitioning/partbounds.c:3354 #, c-format msgid "skipped scanning foreign table \"%s\" which is a partition of default partition \"%s\"" msgstr "пропущено ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ñ— таблиці \"%s\" Ñка Ñ” Ñекцією Ñекції за замовчуваннÑм \"%s\"" -#: partitioning/partbounds.c:4828 +#: partitioning/partbounds.c:4806 #, c-format msgid "remainder for hash partition must be an integer value greater than or equal to zero" -msgstr "залишок Ð´Ð»Ñ Ñ…ÐµÑˆ-Ñекції повинен бути цілим чиÑлом більшим або рівним нулю" +msgstr "залишок Ð´Ð»Ñ Ñ…ÐµÑˆ-Ñекції повинен бути цілим чиÑлом більше або дорівнювати нулю" -#: partitioning/partbounds.c:4852 +#: partitioning/partbounds.c:4830 #, c-format msgid "\"%s\" is not a hash partitioned table" msgstr "\"%s\" не Ñ” геш-Ñекціонованою таблицею" -#: partitioning/partbounds.c:4863 partitioning/partbounds.c:4980 +#: partitioning/partbounds.c:4841 partitioning/partbounds.c:4958 #, c-format msgid "number of partitioning columns (%d) does not match number of partition keys provided (%d)" msgstr "кількіÑть Ñекціонованих Ñтовпців (%d) не дорівнює кількоÑті наданих ключів ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ (%d)" -#: partitioning/partbounds.c:4885 +#: partitioning/partbounds.c:4863 #, c-format msgid "column %d of the partition key has type %s, but supplied value is of type %s" msgstr "Ñтовпець %d ключа ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” тип %s, але Ð´Ð»Ñ Ð½ÑŒÐ¾Ð³Ð¾ вказане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s" -#: partitioning/partbounds.c:4917 +#: partitioning/partbounds.c:4895 #, c-format msgid "column %d of the partition key has type \"%s\", but supplied value is of type \"%s\"" msgstr "Ñтовпець %d ключа ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð°Ñ” тип \"%s\", але Ð´Ð»Ñ Ð½ÑŒÐ¾Ð³Ð¾ вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ \"%s\"" -#: port/pg_sema.c:209 port/pg_shmem.c:695 port/posix_sema.c:209 -#: port/sysv_sema.c:327 port/sysv_shmem.c:695 +#: port/pg_sema.c:209 port/pg_shmem.c:717 port/posix_sema.c:209 +#: port/sysv_sema.c:329 port/sysv_shmem.c:717 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñтановити дані каталогу \"%s\": %m" -#: port/pg_shmem.c:227 port/sysv_shmem.c:227 +#: port/pg_shmem.c:224 port/sysv_shmem.c:224 #, c-format msgid "could not create shared memory segment: %m" msgstr "не вдалоÑÑ Ñтворити Ñегмент Ñпільної пам'Ñті: %m" -#: port/pg_shmem.c:228 port/sysv_shmem.c:228 +#: port/pg_shmem.c:225 port/sysv_shmem.c:225 #, c-format msgid "Failed system call was shmget(key=%lu, size=%zu, 0%o)." msgstr "Помилка в ÑиÑтемному виклику shmget (ключ=%lu, розмір=%zu, 0%o)." -#: port/pg_shmem.c:232 port/sysv_shmem.c:232 +#: port/pg_shmem.c:229 port/sysv_shmem.c:229 #, c-format -msgid "" -"This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" +msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter, or possibly that it is less than your kernel's SHMMIN parameter.\n" "The PostgreSQL documentation contains more information about shared memory configuration." -msgstr "" -"Ð¦Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° зазвичай означає, що запит PostgreSQL Ð´Ð»Ñ Ñегменту Ñпільної пам'Ñті перевищує параметр SHMMAX вашого Ñдра, або можливо що він менший за параметр SHMMIN вашого Ñдра.\n" +msgstr "Ð¦Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° зазвичай означає, що запит PostgreSQL Ð´Ð»Ñ Ñегменту Ñпільної пам'Ñті перевищує параметр SHMMAX вашого Ñдра, або можливо що він менший за параметр SHMMIN вашого Ñдра.\n" "Більше інформації про Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñпільної пам'Ñті міÑтитьÑÑ Ð² інÑтрукції PostgreSQL." -#: port/pg_shmem.c:239 port/sysv_shmem.c:239 +#: port/pg_shmem.c:236 port/sysv_shmem.c:236 #, c-format -msgid "" -"This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" +msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMALL parameter. You might need to reconfigure the kernel with larger SHMALL.\n" "The PostgreSQL documentation contains more information about shared memory configuration." -msgstr "" -"Ð¦Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° зазвичай означає, що запит PostgreSQL Ð´Ð»Ñ Ñегменту Ñпільної пам'Ñті перевищує параметр SHMALL вашого Ñдра. Можливо, вам Ñлід переналаштувати ваше Ñдро, збільшивши параметр SHMALL.\n" +msgstr "Ð¦Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° зазвичай означає, що запит PostgreSQL Ð´Ð»Ñ Ñегменту Ñпільної пам'Ñті перевищує параметр SHMALL вашого Ñдра. Можливо, вам Ñлід переналаштувати ваше Ñдро, збільшивши параметр SHMALL.\n" "Більше інформації про Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñпільної пам'Ñті міÑтитьÑÑ Ð² інÑтрукції PostgreSQL." -#: port/pg_shmem.c:245 port/sysv_shmem.c:245 +#: port/pg_shmem.c:242 port/sysv_shmem.c:242 #, c-format -msgid "" -"This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" +msgid "This error does *not* mean that you have run out of disk space. It occurs either if all available shared memory IDs have been taken, in which case you need to raise the SHMMNI parameter in your kernel, or because the system's overall limit for shared memory has been reached.\n" "The PostgreSQL documentation contains more information about shared memory configuration." -msgstr "" -"Ð¦Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° ÐЕ означає, що на диÑку немає міÑцÑ. Ймовірніше за вÑе, були зайнÑті вÑÑ– доÑтупні ID Ñпільної пам'Ñті, в такому випадку вам потрібно підвищити параметр SHMMNI у вашому Ñдрі, або перевищено граничний розмір Ñпільної пам'Ñті.\n" +msgstr "Ð¦Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° ÐЕ означає, що на диÑку немає міÑцÑ. Ймовірніше за вÑе, були зайнÑті вÑÑ– доÑтупні ID Ñпільної пам'Ñті, в такому випадку вам потрібно підвищити параметр SHMMNI у вашому Ñдрі, або перевищено граничний розмір Ñпільної пам'Ñті.\n" "Детальна Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñпільної пам'Ñті міÑтитьÑÑ Ð² інÑтрукції PostgreSQL." -#: port/pg_shmem.c:633 port/sysv_shmem.c:633 +#: port/pg_shmem.c:584 port/sysv_shmem.c:584 port/win32_shmem.c:646 +#, c-format +msgid "\"huge_page_size\" must be 0 on this platform." +msgstr "\"huge_page_size\" повинен бути 0 на цій платформі." + +#: port/pg_shmem.c:655 port/sysv_shmem.c:655 #, c-format msgid "could not map anonymous shared memory: %m" msgstr "не вдалоÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ‚Ð¸ анонімну Ñпільну пам'Ñть: %m" -#: port/pg_shmem.c:635 port/sysv_shmem.c:635 +#: port/pg_shmem.c:657 port/sysv_shmem.c:657 #, c-format -msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections." -msgstr "Ð¦Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° зазвичай означає, що запит PostgreSQL Ð´Ð»Ñ Ñегменту Ñпільної пам'Ñті перевищує об'єм доÑтупної фізичної або віртуальної пам'Ñті або гігантÑких Ñторінок. Щоб зменшити розмір запиту (поточний: %zu байтів), зменшіть викориÑÑ‚Ð°Ð½Ð½Ñ Ñпільної пам'Ñті PostgreSQL, можливо зменшив shared_buffers або max_connections." +msgid "This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently %zu bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing \"shared_buffers\" or \"max_connections\"." +msgstr "Ð¦Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° зазвичай означає, що запит PostgreSQL Ð´Ð»Ñ Ñегменту Ñпільної пам'Ñті перевищує об'єм доÑтупної фізичної або віртуальної пам'Ñті або гігантÑьких Ñторінок. Щоб зменшити розмір запиту (поточний: %zu байтів), зменшіть викориÑÑ‚Ð°Ð½Ð½Ñ Ñпільної пам'Ñті PostgreSQL, можливо зменшив \"shared_buffers\" або \"max_connections\"." -#: port/pg_shmem.c:703 port/sysv_shmem.c:703 +#: port/pg_shmem.c:725 port/sysv_shmem.c:725 #, c-format msgid "huge pages not supported on this platform" msgstr "величезні Ñторінки на цій плтаформі не підтримуютьÑÑ" -#: port/pg_shmem.c:710 port/sysv_shmem.c:710 +#: port/pg_shmem.c:732 port/sysv_shmem.c:732 #, c-format -msgid "huge pages not supported with the current shared_memory_type setting" -msgstr "величезні Ñторінки не підтримуютьÑÑ Ð· поточним параметром shared_memory_type" +msgid "huge pages not supported with the current \"shared_memory_type\" setting" +msgstr "величезні Ñторінки не підтримуютьÑÑ Ð· поточним параметром \"shared_memory_type\"" -#: port/pg_shmem.c:770 port/sysv_shmem.c:770 utils/init/miscinit.c:1187 +#: port/pg_shmem.c:798 port/sysv_shmem.c:798 utils/init/miscinit.c:1401 #, c-format msgid "pre-existing shared memory block (key %lu, ID %lu) is still in use" msgstr "раніше виділений блок Ñпільної пам'Ñті (ключ %lu, ідентифікатор %lu) вÑе ще викориÑтовуєтьÑÑ" -#: port/pg_shmem.c:773 port/sysv_shmem.c:773 utils/init/miscinit.c:1189 +#: port/pg_shmem.c:801 port/sysv_shmem.c:801 utils/init/miscinit.c:1403 #, c-format msgid "Terminate any old server processes associated with data directory \"%s\"." msgstr "Припинити будь-Ñкі Ñтарі Ñерверні процеÑи, пов'Ñзані з каталогом даних \"%s\"." -#: port/sysv_sema.c:124 +#: port/sysv_sema.c:126 #, c-format msgid "could not create semaphores: %m" msgstr "не вдалоÑÑ Ñтворити Ñемафори: %m" -#: port/sysv_sema.c:125 +#: port/sysv_sema.c:127 #, c-format msgid "Failed system call was semget(%lu, %d, 0%o)." msgstr "Помилка ÑиÑтемного виклику semget(%lu, %d, 0%o)." -#: port/sysv_sema.c:129 +#: port/sysv_sema.c:131 #, c-format -msgid "" -"This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its max_connections parameter.\n" +msgid "This error does *not* mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL's consumption of semaphores by reducing its \"max_connections\" parameter.\n" "The PostgreSQL documentation contains more information about configuring your system for PostgreSQL." -msgstr "" -"Ð¦Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° ÐЕ означає, що на диÑку немає міÑцÑ. Ймовірніше за вÑе перевищено ліміт чиÑла вÑтановлених Ñемафорів (SEMMNI), або загального чиÑла Ñемафорів (SEMMNS) в ÑиÑтемі. Вам потрібно збільшити відповідний параметр Ñдра. Інший ÑпоÑіб - зменшити ÑÐ¿Ð¾Ð¶Ð¸Ð²Ð°Ð½Ð½Ñ PostgreSQL в Ñемафорах, зменшивши параметр max_connections.\n" +msgstr "Ð¦Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° ÐЕ означає, що на диÑку немає міÑцÑ. Ймовірніше за вÑе перевищено ліміт чиÑла вÑтановлених Ñемафорів (SEMMNI), або загального чиÑла Ñемафорів (SEMMNS) в ÑиÑтемі. Вам потрібно збільшити відповідний параметр Ñдра. Інший ÑпоÑіб - зменшити ÑÐ¿Ð¾Ð¶Ð¸Ð²Ð°Ð½Ð½Ñ PostgreSQL в Ñемафорах, зменшивши параметр \"max_connections\".\n" "Більше інформації про Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¾Ñ— ÑиÑтеми Ð´Ð»Ñ PostgreSQL міÑтитьÑÑ Ð² інÑтрукції PostgreSQL." -#: port/sysv_sema.c:159 +#: port/sysv_sema.c:161 #, c-format msgid "You possibly need to raise your kernel's SEMVMX value to be at least %d. Look into the PostgreSQL documentation for details." msgstr "Можливо, вам потрібно збілшити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ SEMVMX вашого Ñдра, мінімум до %d. Детальніше про це напиÑано в інÑтрукції PostgreSQL." @@ -18429,12 +19180,12 @@ msgstr "аварійний дамп запиÑано у фай \"%s\"\n" msgid "could not write crash dump to file \"%s\": error code %lu\n" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати аварійний дамп у файл \"%s\": код помилки %lu\n" -#: port/win32/signal.c:206 +#: port/win32/signal.c:240 #, c-format msgid "could not create signal listener pipe for PID %d: error code %lu" msgstr "не вдалоÑÑ Ñтворити канал Ñигнального проÑлуховувача Ð´Ð»Ñ PID %d: код помилки %lu" -#: port/win32/signal.c:261 +#: port/win32/signal.c:295 #, c-format msgid "could not create signal listener pipe: error code %lu; retrying\n" msgstr "не вдалоÑÑ Ñтворити канал Ñигнального проÑлуховувача: код помилки %lu; триває повторна Ñпроба\n" @@ -18459,8 +19210,8 @@ msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ñ‚Ð¸ Ñемафор: код по msgid "could not try-lock semaphore: error code %lu" msgstr "не вдалоÑÑ Ñпробувати заблокувати Ñемафор: код помилки %lu" -#: port/win32_shmem.c:144 port/win32_shmem.c:159 port/win32_shmem.c:171 -#: port/win32_shmem.c:187 +#: port/win32_shmem.c:146 port/win32_shmem.c:161 port/win32_shmem.c:173 +#: port/win32_shmem.c:189 #, c-format msgid "could not enable user right \"%s\": error code %lu" msgstr "не вдалоÑÑ Ð°ÐºÑ‚Ð¸Ð²ÑƒÐ²Ð°Ñ‚Ð¸ право кориÑтувача \"%s\": код помилки %lu" @@ -18468,153 +19219,143 @@ msgstr "не вдалоÑÑ Ð°ÐºÑ‚Ð¸Ð²ÑƒÐ²Ð°Ñ‚Ð¸ право кориÑтувач #. translator: This is a term from Windows and should be translated to #. match the Windows localization. #. -#: port/win32_shmem.c:150 port/win32_shmem.c:159 port/win32_shmem.c:171 -#: port/win32_shmem.c:182 port/win32_shmem.c:184 port/win32_shmem.c:187 +#: port/win32_shmem.c:152 port/win32_shmem.c:161 port/win32_shmem.c:173 +#: port/win32_shmem.c:184 port/win32_shmem.c:186 port/win32_shmem.c:189 msgid "Lock pages in memory" msgstr "Ð‘Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñторінок у пам'Ñті" -#: port/win32_shmem.c:152 port/win32_shmem.c:160 port/win32_shmem.c:172 -#: port/win32_shmem.c:188 +#: port/win32_shmem.c:154 port/win32_shmem.c:162 port/win32_shmem.c:174 +#: port/win32_shmem.c:190 #, c-format msgid "Failed system call was %s." msgstr "Помилка ÑиÑтемного виклику %s." -#: port/win32_shmem.c:182 +#: port/win32_shmem.c:184 #, c-format msgid "could not enable user right \"%s\"" msgstr "не вдалоÑÑ Ð°ÐºÑ‚Ð¸Ð²ÑƒÐ²Ð°Ñ‚Ð¸ право кориÑтувача \"%s\"" -#: port/win32_shmem.c:183 +#: port/win32_shmem.c:185 #, c-format msgid "Assign user right \"%s\" to the Windows user account which runs PostgreSQL." msgstr "Призначити право кориÑтувача \"%s\" до облікового запиÑу кориÑтувача Windows, що запуÑкає PostgreSQL." -#: port/win32_shmem.c:241 +#: port/win32_shmem.c:244 #, c-format msgid "the processor does not support large pages" msgstr "процеÑор не підтримує великі Ñторінки" -#: port/win32_shmem.c:310 port/win32_shmem.c:346 port/win32_shmem.c:364 +#: port/win32_shmem.c:313 port/win32_shmem.c:349 port/win32_shmem.c:374 #, c-format msgid "could not create shared memory segment: error code %lu" msgstr "не вдалоÑÑ Ñтворити Ñегмент Ñпільної пам'Ñті: код помилки %lu" -#: port/win32_shmem.c:311 +#: port/win32_shmem.c:314 #, c-format msgid "Failed system call was CreateFileMapping(size=%zu, name=%s)." msgstr "Помилка ÑиÑтемного виклику CreateFileMapping(розмір=%zu, ім'Ñ=%s)." -#: port/win32_shmem.c:336 +#: port/win32_shmem.c:339 #, c-format msgid "pre-existing shared memory block is still in use" msgstr "раніше Ñтворений блок Ñпільної пам'Ñті вÑе ще викориÑтовуєтьÑÑ" -#: port/win32_shmem.c:337 +#: port/win32_shmem.c:340 #, c-format msgid "Check if there are any old server processes still running, and terminate them." msgstr "Перевірити, Ñкщо будь-Ñкі Ñтарі Ñерверні процеÑи вÑе ще працюють, та завершити Ñ—Ñ…." -#: port/win32_shmem.c:347 +#: port/win32_shmem.c:350 #, c-format msgid "Failed system call was DuplicateHandle." msgstr "Помилка в ÑиÑтемному виклику DuplicateHandle." -#: port/win32_shmem.c:365 +#: port/win32_shmem.c:375 #, c-format msgid "Failed system call was MapViewOfFileEx." msgstr "Помилка в ÑиÑтемному виклику MapViewOfFileEx." -#: postmaster/autovacuum.c:404 -#, c-format -msgid "could not fork autovacuum launcher process: %m" -msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð¿ÑƒÑку автоочиÑтки: %m" - -#: postmaster/autovacuum.c:752 +#: postmaster/autovacuum.c:686 #, c-format msgid "autovacuum worker took too long to start; canceled" msgstr "Ñтарт процеÑа автовакуума зайнÑв забагато чаÑу; ÑкаÑовано" -#: postmaster/autovacuum.c:1482 -#, c-format -msgid "could not fork autovacuum worker process: %m" -msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ робочий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð°Ð²Ñ‚Ð¾Ð¾Ñ‡Ð¸Ñ‚Ñки: %m" - -#: postmaster/autovacuum.c:2262 +#: postmaster/autovacuum.c:2203 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "автоочиÑтка: Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ñтарілої тимчаÑової таблиці \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2487 +#: postmaster/autovacuum.c:2439 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "автоматична очиÑтка таблиці \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2490 +#: postmaster/autovacuum.c:2442 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "автоматичний аналіз таблиці \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2683 +#: postmaster/autovacuum.c:2636 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "обробка робочого Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3294 +#: postmaster/autovacuum.c:3254 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "автоочиÑтку не запущено через неправильну конфігурацію" -#: postmaster/autovacuum.c:3295 +#: postmaster/autovacuum.c:3255 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Ðктивувати параметр \"track_counts\"." -#: postmaster/bgworker.c:256 +#: postmaster/bgworker.c:260 #, c-format msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" msgstr "неÑуміÑний Ñтан фонового процеÑу (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:666 +#: postmaster/bgworker.c:651 #, c-format -msgid "background worker \"%s\": background worker without shared memory access are not supported" -msgstr "фоновий виконавець \"%s\": фоновий виконавець, без доÑтупу до Ñпільної пам'Ñті не підтримуєтьÑÑ" +msgid "background worker \"%s\": background workers without shared memory access are not supported" +msgstr "фоновий виконавець \"%s\": фонові виконавці без доÑтупу до Ñпільної пам'Ñті не підтримуютьÑÑ" -#: postmaster/bgworker.c:677 +#: postmaster/bgworker.c:662 #, c-format msgid "background worker \"%s\": cannot request database access if starting at postmaster start" msgstr "фоновий виконавець \"%s\": не може запитувати доÑтуп до бази даних, Ñкщо його запущено при Ñтарті адмініÑтратора поштового ÑервіÑу" -#: postmaster/bgworker.c:691 +#: postmaster/bgworker.c:676 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "фоновий виконавець \"%s\": неприпуÑтимий інтервал перезавантаженнÑ" -#: postmaster/bgworker.c:706 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "фоновий виконавець\"%s\": паралельні виконавці не можуть бути налаштовані Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ" -#: postmaster/bgworker.c:730 tcop/postgres.c:3203 +#: postmaster/bgworker.c:715 tcop/postgres.c:3312 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð³Ð¾ процеÑу \"%s\" по команді адмініÑтратора" -#: postmaster/bgworker.c:887 +#: postmaster/bgworker.c:888 #, c-format -msgid "background worker \"%s\": must be registered in shared_preload_libraries" -msgstr "фоновий Ð¿Ñ€Ð¾Ñ†ÐµÑ \"%s\": повинен бути зареєÑтрований в shared_preload_libraries" +msgid "background worker \"%s\": must be registered in \"shared_preload_libraries\"" +msgstr "фоновий Ð¿Ñ€Ð¾Ñ†ÐµÑ \"%s\": повинен бути зареєÑтрований в \"shared_preload_libraries\"" -#: postmaster/bgworker.c:899 +#: postmaster/bgworker.c:911 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "фоновий Ð¿Ñ€Ð¾Ñ†ÐµÑ \"%s\": лише динамічні фонові процеÑи можуть запитувати ÑповіщеннÑ" -#: postmaster/bgworker.c:914 +#: postmaster/bgworker.c:926 #, c-format msgid "too many background workers" msgstr "занадто багато фонових процеÑів" -#: postmaster/bgworker.c:915 +#: postmaster/bgworker.c:927 #, c-format msgid "Up to %d background worker can be registered with the current settings." msgid_plural "Up to %d background workers can be registered with the current settings." @@ -18623,12 +19364,12 @@ msgstr[1] "МакÑимальне можливе чиÑло фонових пр msgstr[2] "МакÑимальне можливе чиÑло фонових процеÑів при поточних параметрах: %d." msgstr[3] "МакÑимальне можливе чиÑло фонових процеÑів при поточних параметрах: %d." -#: postmaster/bgworker.c:919 +#: postmaster/bgworker.c:931 postmaster/checkpointer.c:445 #, c-format -msgid "Consider increasing the configuration parameter \"max_worker_processes\"." -msgstr "Можливо, Ñлід збільшити параметр конфігурації \"max_worker_processes\"." +msgid "Consider increasing the configuration parameter \"%s\"." +msgstr "Можливо, Ñлід збільшити параметр конфігурації \"%s\"." -#: postmaster/checkpointer.c:432 +#: postmaster/checkpointer.c:441 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" @@ -18637,1115 +19378,1070 @@ msgstr[1] "контрольні точки відбуваютьÑÑ Ð·Ð°Ð½Ð°Ð´Ñ‚ msgstr[2] "контрольні точки відбуваютьÑÑ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ чаÑто (через %d Ñек.)" msgstr[3] "контрольні точки відбуваютьÑÑ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ чаÑто (через %d Ñек.)" -#: postmaster/checkpointer.c:436 -#, c-format -msgid "Consider increasing the configuration parameter \"max_wal_size\"." -msgstr "Можливо, Ñлід збільшити параметр конфігурації \"max_wal_size\"." - -#: postmaster/checkpointer.c:1060 +#: postmaster/checkpointer.c:1067 #, c-format msgid "checkpoint request failed" msgstr "збій при запиті контрольної точки" -#: postmaster/checkpointer.c:1061 +#: postmaster/checkpointer.c:1068 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Ð”Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹, звернітьÑÑ Ð´Ð¾ оÑтанніх повідомлень в протоколі Ñерверу." -#: postmaster/pgarch.c:429 +#: postmaster/launch_backend.c:381 +#, c-format +msgid "could not execute server process \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ñерверні процеÑи \"%s\":%m" + +#: postmaster/launch_backend.c:434 +#, c-format +msgid "could not create backend parameter file mapping: error code %lu" +msgstr "не вдалоÑÑ Ñтворити Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ параметру внутрішнього Ñервера: код помилки %lu" + +#: postmaster/launch_backend.c:442 +#, c-format +msgid "could not map backend parameter memory: error code %lu" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚Ð¸ пам'Ñть параметру внутрішнього Ñервера: код помилки %lu" + +#: postmaster/launch_backend.c:459 +#, c-format +msgid "subprocess command line too long" +msgstr "командний Ñ€Ñдок підпроцеÑу занадто довгий" + +#: postmaster/launch_backend.c:477 +#, c-format +msgid "CreateProcess() call failed: %m (error code %lu)" +msgstr "помилка виклику CreateProcess(): %m (код помилки %lu)" + +#: postmaster/launch_backend.c:504 #, c-format -msgid "archive_mode enabled, yet archiving is not configured" -msgstr "archive_mode активовано, але Ð°Ñ€Ñ…Ñ–Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ налаштовано" +msgid "could not unmap view of backend parameter file: error code %lu" +msgstr "не вдалоÑÑ Ð²Ð¸Ð¼ÐºÐ½ÑƒÑ‚Ð¸ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ параметру внутрішнього Ñервера: код помилки %lu" + +#: postmaster/launch_backend.c:508 +#, c-format +msgid "could not close handle to backend parameter file: error code %lu" +msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ покажчик файлу параметру внутрішнього Ñервера: код помилки %lu" + +#: postmaster/launch_backend.c:530 +#, c-format +msgid "giving up after too many tries to reserve shared memory" +msgstr "кількіÑть повторних Ñпроб Ñ€ÐµÐ·ÐµÑ€Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñпільної пам'Ñті доÑÑгло межі" + +#: postmaster/launch_backend.c:531 +#, c-format +msgid "This might be caused by ASLR or antivirus software." +msgstr "Це може бути викликано антивіруÑним програмним забезпеченнÑм або ASLR." + +#: postmaster/launch_backend.c:834 +#, c-format +msgid "could not duplicate socket %d for use in backend: error code %d" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ñ‚Ð¸ Ñокет %d Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ: код помилки %d" + +#: postmaster/launch_backend.c:866 +#, c-format +msgid "could not create inherited socket: error code %d\n" +msgstr "не вдалоÑÑ Ñтворити уÑпадкований Ñокет: код помилки %d\n" + +#: postmaster/launch_backend.c:895 +#, c-format +msgid "could not open backend variables file \"%s\": %m\n" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ внутрішні змінні файли \"%s\": %m\n" + +#: postmaster/launch_backend.c:901 +#, c-format +msgid "could not read from backend variables file \"%s\": %m\n" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ внутрішні змінні файли \"%s\": %m\n" + +#: postmaster/launch_backend.c:912 +#, c-format +msgid "could not read startup data from backend variables file \"%s\": %m\n" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñтартові дані у файлах внутрішніх змінних \"%s\": %m\n" + +#: postmaster/launch_backend.c:924 +#, c-format +msgid "could not remove file \"%s\": %m\n" +msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл \"%s\": %m\n" + +#: postmaster/launch_backend.c:940 +#, c-format +msgid "could not map view of backend variables: error code %lu\n" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚Ð¸ файл Ñерверних змінних: код помилки %lu\n" + +#: postmaster/launch_backend.c:959 +#, c-format +msgid "could not unmap view of backend variables: error code %lu\n" +msgstr "не вдалоÑÑ Ð²Ð¸Ð¼ÐºÐ½ÑƒÑ‚Ð¸ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ñерверних змінних: код помилки %lu\n" + +#: postmaster/launch_backend.c:966 +#, c-format +msgid "could not close handle to backend parameter variables: error code %lu\n" +msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ покажчик файлу Ñерверних змінних: код помилки %lu\n" + +#: postmaster/pgarch.c:428 +#, c-format +msgid "\"archive_mode\" enabled, yet archiving is not configured" +msgstr "\"archive_mode\" активовано, але Ð°Ñ€Ñ…Ñ–Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ налаштовано" -#: postmaster/pgarch.c:451 +#: postmaster/pgarch.c:452 #, c-format msgid "removed orphan archive status file \"%s\"" msgstr "видалено залишковий файл ÑтатуÑу архіву \"%s\"" -#: postmaster/pgarch.c:461 +#: postmaster/pgarch.c:462 #, c-format msgid "removal of orphan archive status file \"%s\" failed too many times, will try again later" -msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð»Ð¸ÑˆÐºÐ¾Ð²Ð¾Ð³Ð¾ файлу ÑтатуÑу архіву \"%s\" не вдалоÑÑ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ багато разів, пізніже Ñпробуємо знову" +msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð»Ð¸ÑˆÐºÐ¾Ð²Ð¾Ð³Ð¾ файлу ÑтатуÑу архіву \"%s\" не вдалоÑÑ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ багато разів, пізніже Ñпробуємо знову" -#: postmaster/pgarch.c:497 +#: postmaster/pgarch.c:498 #, c-format msgid "archiving write-ahead log file \"%s\" failed too many times, will try again later" msgstr "Ð°Ñ€Ñ…Ñ–Ð²Ð°Ñ†Ñ–Ñ Ñ„Ð°Ð¹Ð»Ñƒ випереджувальног Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\" не виконана багато разів, наÑтупна Ñпроба буде пізніже" -#: postmaster/pgarch.c:809 +#: postmaster/pgarch.c:879 postmaster/pgarch.c:918 +#, c-format +msgid "both \"archive_command\" and \"archive_library\" set" +msgstr "вÑтановлено команду \"archive_command\" Ñ– \"archive_library\"" + +#: postmaster/pgarch.c:880 postmaster/pgarch.c:919 +#, c-format +msgid "Only one of \"archive_command\", \"archive_library\" may be set." +msgstr "Можливо вÑтановити лише одну з \"archive_command\", \"archive_library\"." + +#: postmaster/pgarch.c:897 #, c-format msgid "restarting archiver process because value of \"archive_library\" was changed" msgstr "перезапуÑк процеÑу архіватора, оÑкільки Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"archive_library\" було змінено" -#: postmaster/pgarch.c:842 +#: postmaster/pgarch.c:934 #, c-format -msgid "archive modules have to declare the _PG_archive_module_init symbol" -msgstr "модулі архіву повинні оголошувати Ñимвол _PG_archive_module_init" +msgid "archive modules have to define the symbol %s" +msgstr "архівні модулі повинні визначити Ñимвол %s" -#: postmaster/pgarch.c:848 +#: postmaster/pgarch.c:940 #, c-format msgid "archive modules must register an archive callback" msgstr "модулі архіву повинні реєÑтрувати зворотний виклик архіву" -#: postmaster/postmaster.c:744 +#: postmaster/postmaster.c:661 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: неприпуÑтимий аргумент Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ -f: \"%s\"\n" -#: postmaster/postmaster.c:823 +#: postmaster/postmaster.c:734 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: неприпуÑтимий аргумент Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ -t: \"%s\"\n" -#: postmaster/postmaster.c:874 +#: postmaster/postmaster.c:757 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: неприпуÑтимий аргумент: \"%s\"\n" -#: postmaster/postmaster.c:942 +#: postmaster/postmaster.c:825 #, c-format -msgid "%s: superuser_reserved_connections (%d) must be less than max_connections (%d)\n" -msgstr "%s: superuser_reserved_connections (%d) має бути меншим ніж max_connections (%d)\n" +msgid "%s: \"superuser_reserved_connections\" (%d) plus \"reserved_connections\" (%d) must be less than \"max_connections\" (%d)\n" +msgstr "%s: \"superuser_reserved_connections\" (%d) Ð¿Ð»ÑŽÑ \"reserved_connections\" (%d) має бути меншим за \"max_connections\" (%d)\n" -#: postmaster/postmaster.c:949 +#: postmaster/postmaster.c:833 #, c-format -msgid "WAL archival cannot be enabled when wal_level is \"minimal\"" -msgstr "WAL архіватор не може бути активованим, коли wal_level \"мінімальний\"" +msgid "WAL archival cannot be enabled when \"wal_level\" is \"minimal\"" +msgstr "WAL архіватор не може бути активованим, коли \"wal_level\" вÑтановлено в \"minimal\"" -#: postmaster/postmaster.c:952 +#: postmaster/postmaster.c:836 #, c-format -msgid "WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\"" -msgstr "Потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ WAL (max_wal_senders > 0) вимагає wal_level \"replica\" або \"logical\"" +msgid "WAL streaming (\"max_wal_senders\" > 0) requires \"wal_level\" to be \"replica\" or \"logical\"" +msgstr "Потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ WAL (\"max_wal_senders\" > 0) вимагає \"wal_level\" \"replica\" або \"logical\"" -#: postmaster/postmaster.c:960 +#: postmaster/postmaster.c:839 +#, c-format +msgid "WAL cannot be summarized when \"wal_level\" is \"minimal\"" +msgstr "неможливо підÑумувати WAL, Ñкщо \"wal_level\" дорівнє \"minimal\"" + +#: postmaster/postmaster.c:847 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: неприпуÑтимі таблиці маркерів чаÑу, будь-лаÑка виправіть\n" -#: postmaster/postmaster.c:1113 +#: postmaster/postmaster.c:1004 #, c-format msgid "could not create I/O completion port for child queue" msgstr "не вдалоÑÑ Ñтворити завершений порт вводу-виводу Ð´Ð»Ñ Ñ‡ÐµÑ€Ð³Ð¸ дітей" -#: postmaster/postmaster.c:1178 +#: postmaster/postmaster.c:1069 #, c-format msgid "ending log output to stderr" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу виводу Stderr" -#: postmaster/postmaster.c:1179 +#: postmaster/postmaster.c:1070 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "Ð’ майбутньому Ð·Ð°Ð¿Ð¸Ñ Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ запиÑуватиÑÑ Ð² Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\"." -#: postmaster/postmaster.c:1190 +#: postmaster/postmaster.c:1081 #, c-format msgid "starting %s" msgstr "початок %s" -#: postmaster/postmaster.c:1219 postmaster/postmaster.c:1318 -#: utils/init/miscinit.c:1651 -#, c-format -msgid "invalid list syntax in parameter \"%s\"" -msgstr "неприпуÑтимий ÑинтакÑÐ¸Ñ ÑпиÑку в параметрі \"%s\"" - -#: postmaster/postmaster.c:1250 +#: postmaster/postmaster.c:1143 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "не вдалоÑÑ Ñтворити Ñокет проÑÐ»ÑƒÑ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ \"%s\"" -#: postmaster/postmaster.c:1256 +#: postmaster/postmaster.c:1149 #, c-format msgid "could not create any TCP/IP sockets" msgstr "не вдалоÑÑ Ñтворити TCP/IP Ñокети" -#: postmaster/postmaster.c:1288 +#: postmaster/postmaster.c:1181 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "Помилка DNSServiceRegister(): код помилки %ld" -#: postmaster/postmaster.c:1340 +#: postmaster/postmaster.c:1234 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "не вдалоÑÑ Ñтворити Unix-domain Ñокет в каталозі \"%s\"" -#: postmaster/postmaster.c:1346 +#: postmaster/postmaster.c:1240 #, c-format msgid "could not create any Unix-domain sockets" msgstr "не вдалоÑÑ Ñтворити Unix-domain Ñокети" -#: postmaster/postmaster.c:1358 +#: postmaster/postmaster.c:1251 #, c-format msgid "no socket created for listening" msgstr "не Ñтворено жодного Ñокету Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑлуховуваннÑ" -#: postmaster/postmaster.c:1389 +#: postmaster/postmaster.c:1282 #, c-format -msgid "%s: could not change permissions of external PID file \"%s\": %s\n" -msgstr "%s: не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ дозволи зовнішнього PID файлу \"%s\": %s\n" +msgid "%s: could not change permissions of external PID file \"%s\": %m\n" +msgstr "%s: не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ дозволи зовнішнього PID файлу \"%s\": %m\n" -#: postmaster/postmaster.c:1393 +#: postmaster/postmaster.c:1286 #, c-format -msgid "%s: could not write external PID file \"%s\": %s\n" -msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати зовнішній PID файл \"%s\": %s\n" +msgid "%s: could not write external PID file \"%s\": %m\n" +msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати зовнішній PID файл \"%s\": %m\n" -#: postmaster/postmaster.c:1420 utils/init/postinit.c:220 +#. translator: %s is a configuration file +#: postmaster/postmaster.c:1314 utils/init/postinit.c:221 #, c-format -msgid "could not load pg_hba.conf" -msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ pg_hba.conf" +msgid "could not load %s" +msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ %s" -#: postmaster/postmaster.c:1446 +#: postmaster/postmaster.c:1342 #, c-format msgid "postmaster became multithreaded during startup" msgstr "адмініÑтратор поштового Ñервера Ñтав багатопотоковим під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку" -#: postmaster/postmaster.c:1447 +#: postmaster/postmaster.c:1343 postmaster/postmaster.c:3684 #, c-format msgid "Set the LC_ALL environment variable to a valid locale." msgstr "Ð’Ñтановити в змінній Ñередовища LC_ALL дійіÑну локаль." -#: postmaster/postmaster.c:1548 +#: postmaster/postmaster.c:1442 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ñвій влаÑний шлÑÑ… Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ" -#: postmaster/postmaster.c:1555 +#: postmaster/postmaster.c:1449 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ відповідний postgres файл, що виконуєтьÑÑ" -#: postmaster/postmaster.c:1578 utils/misc/tzparser.c:340 +#: postmaster/postmaster.c:1472 utils/misc/tzparser.c:341 #, c-format msgid "This may indicate an incomplete PostgreSQL installation, or that the file \"%s\" has been moved away from its proper location." msgstr "Це може означати неповне вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ PostgreSQL, або те, що файл \"%s\" було переміщено з його правильного розташуваннÑ." -#: postmaster/postmaster.c:1605 +#: postmaster/postmaster.c:1499 #, c-format -msgid "" -"%s: could not find the database system\n" +msgid "%s: could not find the database system\n" "Expected to find it in the directory \"%s\",\n" -"but could not open file \"%s\": %s\n" -msgstr "" -"%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ÑиÑтему бази даних\n" +"but could not open file \"%s\": %m\n" +msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ÑиÑтему бази даних\n" "ОчікувалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ñ—Ñ— у каталозі \"%s\",\n" -"але не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %s\n" - -#: postmaster/postmaster.c:1782 -#, c-format -msgid "select() failed in postmaster: %m" -msgstr "помилка вибирати() в адмініÑтраторі поштового Ñервера: %m" +"але не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %m\n" -#: postmaster/postmaster.c:1913 +#. translator: %s is SIGKILL or SIGABRT +#: postmaster/postmaster.c:1789 #, c-format -msgid "issuing SIGKILL to recalcitrant children" -msgstr "надÑÐ¸Ð»Ð°Ð½Ð½Ñ SIGKILL непокірливим дітÑм" +msgid "issuing %s to recalcitrant children" +msgstr "надÑÐ¸Ð»Ð°Ð½Ð½Ñ %s непокірливим дітÑм" -#: postmaster/postmaster.c:1934 +#: postmaster/postmaster.c:1811 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "виконуєтьÑÑ Ð½ÐµÐ³Ð°Ð¹Ð½Ðµ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ через неприпуÑтимий файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ даних" -#: postmaster/postmaster.c:2037 postmaster/postmaster.c:2065 -#, c-format -msgid "incomplete startup packet" -msgstr "неповний Ñтартовий пакет" - -#: postmaster/postmaster.c:2049 -#, c-format -msgid "invalid length of startup packet" -msgstr "неприпуÑтима довжина Ñтартового пакету" - -#: postmaster/postmaster.c:2104 -#, c-format -msgid "failed to send SSL negotiation response: %m" -msgstr "помилка надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ SSL в процеÑÑ– відповіді зв'ÑзуваннÑ: %m" - -#: postmaster/postmaster.c:2122 -#, c-format -msgid "received unencrypted data after SSL request" -msgstr "отримані незашифровані дані піÑÐ»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ SSL" - -#: postmaster/postmaster.c:2123 postmaster/postmaster.c:2167 -#, c-format -msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." -msgstr "Це може бути або помилкою клієнтÑького програмного забезпеченнÑ, або доказом Ñпроби техноÑферної атаки." - -#: postmaster/postmaster.c:2148 -#, c-format -msgid "failed to send GSSAPI negotiation response: %m" -msgstr "помилка надÑÐ¸Ð»Ð°Ð½Ð½Ñ GSSAPI в процеÑÑ– відповіді зв'ÑзуваннÑ: %m" - -#: postmaster/postmaster.c:2166 -#, c-format -msgid "received unencrypted data after GSSAPI encryption request" -msgstr "отримані незашифровані дані піÑÐ»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ GSSAPI" - -#: postmaster/postmaster.c:2190 -#, c-format -msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" -msgstr "протокол інтерфейÑу, що не підтримуєтьÑÑ, %u.%u: Ñервер підтримує %u.0 до %u.%u" - -#: postmaster/postmaster.c:2254 utils/misc/guc.c:7410 utils/misc/guc.c:7446 -#: utils/misc/guc.c:7516 utils/misc/guc.c:8947 utils/misc/guc.c:11980 -#: utils/misc/guc.c:12021 -#, c-format -msgid "invalid value for parameter \"%s\": \"%s\"" -msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\": \"%s\"" - -#: postmaster/postmaster.c:2257 -#, c-format -msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." -msgstr "ДійÑні значеннÑ: \"false\", 0, \"true\", 1, \"database\"." - -#: postmaster/postmaster.c:2302 -#, c-format -msgid "invalid startup packet layout: expected terminator as last byte" -msgstr "неприпуÑтима Ñтруктура Ñтартового пакету: оÑтаннім байтом очікувавÑÑ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ð°Ñ‚Ð¾Ñ€" - -#: postmaster/postmaster.c:2319 -#, c-format -msgid "no PostgreSQL user name specified in startup packet" -msgstr "не вказано жодного ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача PostgreSQL у Ñтартовому пакеті" - -#: postmaster/postmaster.c:2383 -#, c-format -msgid "the database system is starting up" -msgstr "ÑиÑтема бази даних запуÑкаєтьÑÑ" - -#: postmaster/postmaster.c:2389 -#, c-format -msgid "the database system is not yet accepting connections" -msgstr "ÑиÑтема бази даних ще не приймає підключеннÑ" - -#: postmaster/postmaster.c:2390 -#, c-format -msgid "Consistent recovery state has not been yet reached." -msgstr "Узгодженого Ñтану Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‰Ðµ не доÑÑгнуто." - -#: postmaster/postmaster.c:2394 -#, c-format -msgid "the database system is not accepting connections" -msgstr "ÑиÑтема бази даних не приймає підключеннÑ" - -#: postmaster/postmaster.c:2395 -#, c-format -msgid "Hot standby mode is disabled." -msgstr "Режим Hot standby вимкнений." - -#: postmaster/postmaster.c:2400 -#, c-format -msgid "the database system is shutting down" -msgstr "ÑиÑтема бази даних завершує роботу" - -#: postmaster/postmaster.c:2405 -#, c-format -msgid "the database system is in recovery mode" -msgstr "ÑиÑтема бази даних у режимі відновленнÑ" - -#: postmaster/postmaster.c:2410 storage/ipc/procarray.c:479 -#: storage/ipc/sinvaladt.c:306 storage/lmgr/proc.c:359 -#, c-format -msgid "sorry, too many clients already" -msgstr "вибачте, вже забагато клієнтів" - -#: postmaster/postmaster.c:2497 +#: postmaster/postmaster.c:1874 #, c-format msgid "wrong key in cancel request for process %d" msgstr "неправильний ключ в запиті ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу %d" -#: postmaster/postmaster.c:2509 +#: postmaster/postmaster.c:1886 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "PID %d в запиті на ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ відповідає жодному процеÑу" -#: postmaster/postmaster.c:2763 +#: postmaster/postmaster.c:2106 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "отримано SIGHUP, Ð¿Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² конфігурацій" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2787 postmaster/postmaster.c:2791 +#: postmaster/postmaster.c:2134 postmaster/postmaster.c:2138 #, c-format msgid "%s was not reloaded" msgstr "%s не було перезавантажено" -#: postmaster/postmaster.c:2801 +#: postmaster/postmaster.c:2148 #, c-format msgid "SSL configuration was not reloaded" msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ SSL не була перезавантажена" -#: postmaster/postmaster.c:2857 +#: postmaster/postmaster.c:2234 #, c-format msgid "received smart shutdown request" msgstr "отримано smart запит на Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸" -#: postmaster/postmaster.c:2898 +#: postmaster/postmaster.c:2275 #, c-format msgid "received fast shutdown request" msgstr "отримано швидкий запит на Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸" -#: postmaster/postmaster.c:2916 +#: postmaster/postmaster.c:2293 #, c-format msgid "aborting any active transactions" msgstr "Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ð±ÑƒÐ´ÑŒ-Ñких активних транзакцій" -#: postmaster/postmaster.c:2940 +#: postmaster/postmaster.c:2317 #, c-format msgid "received immediate shutdown request" msgstr "отримано запит на негайне Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸" -#: postmaster/postmaster.c:3017 +#: postmaster/postmaster.c:2389 #, c-format msgid "shutdown at recovery target" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ при відновленні мети" -#: postmaster/postmaster.c:3035 postmaster/postmaster.c:3071 +#: postmaster/postmaster.c:2407 postmaster/postmaster.c:2443 msgid "startup process" msgstr "Ñтартовий процеÑ" -#: postmaster/postmaster.c:3038 +#: postmaster/postmaster.c:2410 #, c-format msgid "aborting startup due to startup process failure" msgstr "Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿ÑƒÑку через помилку в Ñтартовому процеÑÑ–" -#: postmaster/postmaster.c:3111 +#: postmaster/postmaster.c:2485 #, c-format msgid "database system is ready to accept connections" msgstr "ÑиÑтема бази даних готова до Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ" -#: postmaster/postmaster.c:3132 +#: postmaster/postmaster.c:2506 msgid "background writer process" msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð³Ð¾ запиÑу" -#: postmaster/postmaster.c:3179 +#: postmaster/postmaster.c:2553 msgid "checkpointer process" msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… точок" -#: postmaster/postmaster.c:3195 +#: postmaster/postmaster.c:2569 msgid "WAL writer process" msgstr "ÐŸÑ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð¿Ð¸Ñу WAL" -#: postmaster/postmaster.c:3210 +#: postmaster/postmaster.c:2584 msgid "WAL receiver process" msgstr "ÐŸÑ€Ð¾Ñ†ÐµÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ WAL" -#: postmaster/postmaster.c:3225 +#: postmaster/postmaster.c:2598 +msgid "WAL summarizer process" +msgstr "ÐŸÑ€Ð¾Ñ†ÐµÑ Ð¿Ñ–Ð´ÑÑƒÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ WAL" + +#: postmaster/postmaster.c:2613 msgid "autovacuum launcher process" msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð¿ÑƒÑку автоочиÑтки" -#: postmaster/postmaster.c:3243 +#: postmaster/postmaster.c:2631 msgid "archiver process" msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð°Ñ€Ñ…Ñ–Ð²Ð°Ñ†Ñ–Ñ—" -#: postmaster/postmaster.c:3256 +#: postmaster/postmaster.c:2644 msgid "system logger process" msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ ÑиÑтемного журналюваннÑ" -#: postmaster/postmaster.c:3320 +#: postmaster/postmaster.c:2661 +msgid "slot sync worker process" +msgstr "робочий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñинхронізації Ñлоту" + +#: postmaster/postmaster.c:2717 #, c-format msgid "background worker \"%s\"" msgstr "фоновий виконавець \"%s\"" -#: postmaster/postmaster.c:3399 postmaster/postmaster.c:3419 -#: postmaster/postmaster.c:3426 postmaster/postmaster.c:3444 +#: postmaster/postmaster.c:2796 postmaster/postmaster.c:2816 +#: postmaster/postmaster.c:2823 postmaster/postmaster.c:2841 msgid "server process" msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñервера" -#: postmaster/postmaster.c:3498 +#: postmaster/postmaster.c:2895 #, c-format msgid "terminating any other active server processes" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð±ÑƒÐ´ÑŒ-Ñких інших активних Ñерверних процеÑів" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3735 +#: postmaster/postmaster.c:3082 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d) завершивÑÑ Ð· кодом виходу %d" -#: postmaster/postmaster.c:3737 postmaster/postmaster.c:3749 -#: postmaster/postmaster.c:3759 postmaster/postmaster.c:3770 +#: postmaster/postmaster.c:3084 postmaster/postmaster.c:3096 +#: postmaster/postmaster.c:3106 postmaster/postmaster.c:3117 #, c-format msgid "Failed process was running: %s" msgstr "ÐŸÑ€Ð¾Ñ†ÐµÑ Ñ‰Ð¾ завершивÑÑ Ð²Ð¸ÐºÐ¾Ð½ÑƒÐ²Ð°Ð² дію: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3746 +#: postmaster/postmaster.c:3093 #, c-format msgid "%s (PID %d) was terminated by exception 0x%X" msgstr "%s (PID %d) був перерваний винÑтком 0x%X" -#: postmaster/postmaster.c:3748 postmaster/shell_archive.c:132 -#, c-format -msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." -msgstr "ÐžÐ¿Ð¸Ñ Ñ†ÑŒÐ¾Ð³Ð¾ ШіÑтнадцÑткового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¸Ð²Ñ–Ñ‚ÑŒÑÑ Ñƒ включаємому C-файлі \"ntstatus.h\"." - #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3756 +#: postmaster/postmaster.c:3103 #, c-format msgid "%s (PID %d) was terminated by signal %d: %s" msgstr "%s (PID %d) був перерваний Ñигналом %d: %s" #. translator: %s is a noun phrase describing a child process, such as #. "server process" -#: postmaster/postmaster.c:3768 +#: postmaster/postmaster.c:3115 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) завершивÑÑ Ð· нерозпізнаним ÑтатуÑом %d" -#: postmaster/postmaster.c:3968 +#: postmaster/postmaster.c:3331 #, c-format msgid "abnormal database system shutdown" msgstr "ненормальне Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ ÑиÑтеми бази даних" -#: postmaster/postmaster.c:3994 +#: postmaster/postmaster.c:3357 #, c-format msgid "shutting down due to startup process failure" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ через помилку в Ñтартовому процеÑÑ–" -#: postmaster/postmaster.c:4000 +#: postmaster/postmaster.c:3363 #, c-format -msgid "shutting down because restart_after_crash is off" -msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸, тому що restart_after_crash вимкнено" +msgid "shutting down because \"restart_after_crash\" is off" +msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸, тому що \"restart_after_crash\" вимкнено" -#: postmaster/postmaster.c:4012 +#: postmaster/postmaster.c:3375 #, c-format msgid "all server processes terminated; reinitializing" msgstr "уÑÑ– Ñерверні процеÑи перервано; повторна ініціалізаціÑ" -#: postmaster/postmaster.c:4184 postmaster/postmaster.c:5520 -#: postmaster/postmaster.c:5918 +#: postmaster/postmaster.c:3574 postmaster/postmaster.c:3985 +#: postmaster/postmaster.c:4374 #, c-format msgid "could not generate random cancel key" msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ випадковий ключ ÑкаÑуваннÑ" -#: postmaster/postmaster.c:4246 +#: postmaster/postmaster.c:3607 #, c-format msgid "could not fork new process for connection: %m" msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ нові процеÑи Ð´Ð»Ñ Ð·'єднаннÑ: %m" -#: postmaster/postmaster.c:4288 +#: postmaster/postmaster.c:3649 msgid "could not fork new process for connection: " msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ нові процеÑи Ð´Ð»Ñ Ð·'єднаннÑ: " -#: postmaster/postmaster.c:4394 +#: postmaster/postmaster.c:3683 #, c-format -msgid "connection received: host=%s port=%s" -msgstr "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð¾: хоÑÑ‚=%s порт=%s" +msgid "postmaster became multithreaded" +msgstr "postmaster Ñтав багатопотоковим" -#: postmaster/postmaster.c:4399 +#: postmaster/postmaster.c:3752 #, c-format -msgid "connection received: host=%s" -msgstr "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð¾: хоÑÑ‚=%s" +msgid "database system is ready to accept read-only connections" +msgstr "ÑиÑтема бази даних готова до Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ" -#: postmaster/postmaster.c:4636 +#: postmaster/postmaster.c:3935 #, c-format -msgid "could not execute server process \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ñерверні процеÑи \"%s\":%m" +msgid "could not fork \"%s\" process: %m" +msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ Ð¿Ñ€Ð¾Ñ†ÐµÑ \"%s\": %m" -#: postmaster/postmaster.c:4694 +#: postmaster/postmaster.c:4173 postmaster/postmaster.c:4207 #, c-format -msgid "could not create backend parameter file mapping: error code %lu" -msgstr "не вдалоÑÑ Ñтворити Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ параметру внутрішнього Ñервера: код помилки %lu" +msgid "database connection requirement not indicated during registration" +msgstr "під Ñ‡Ð°Ñ Ñ€ÐµÑ”Ñтрації не вказувалоÑÑ, що вимагаєтьÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних" -#: postmaster/postmaster.c:4703 +#: postmaster/postmaster.c:4183 postmaster/postmaster.c:4217 #, c-format -msgid "could not map backend parameter memory: error code %lu" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚Ð¸ пам'Ñть параметру внутрішнього Ñервера: код помилки %lu" +msgid "invalid processing mode in background worker" +msgstr "неприпуÑтимий режим обробки у фоновому запиÑÑ–" -#: postmaster/postmaster.c:4730 +#: postmaster/postmaster.c:4277 #, c-format -msgid "subprocess command line too long" -msgstr "командний Ñ€Ñдок підпроцеÑу занадто довгий" +msgid "could not fork background worker process: %m" +msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ фоновий процеÑ: %m" -#: postmaster/postmaster.c:4748 +#: postmaster/postmaster.c:4360 #, c-format -msgid "CreateProcess() call failed: %m (error code %lu)" -msgstr "помилка виклику CreateProcess(): %m (код помилки %lu)" +msgid "no slot available for new background worker process" +msgstr "немає доÑтупного Ñлоту Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ фонового робочого процеÑу" -#: postmaster/postmaster.c:4775 +#: postmaster/postmaster.c:4623 #, c-format -msgid "could not unmap view of backend parameter file: error code %lu" -msgstr "не вдалоÑÑ Ð²Ð¸Ð¼ÐºÐ½ÑƒÑ‚Ð¸ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ параметру внутрішнього Ñервера: код помилки %lu" +msgid "could not read exit code for process\n" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу\n" -#: postmaster/postmaster.c:4779 +#: postmaster/postmaster.c:4665 #, c-format -msgid "could not close handle to backend parameter file: error code %lu" -msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ покажчик файлу параметру внутрішнього Ñервера: код помилки %lu" +msgid "could not post child completion status\n" +msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати ÑÑ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð½Ð°Ñ‰Ð°Ð´ÐºÐ°\n" -#: postmaster/postmaster.c:4801 +#: postmaster/syslogger.c:529 postmaster/syslogger.c:1173 #, c-format -msgid "giving up after too many tries to reserve shared memory" -msgstr "кількіÑть повторних Ñпроб Ñ€ÐµÐ·ÐµÑ€Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñпільної пам'Ñті доÑÑгло межі" +msgid "could not read from logger pipe: %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з каналу журналюваннÑ: %m" -#: postmaster/postmaster.c:4802 +#: postmaster/syslogger.c:629 postmaster/syslogger.c:643 #, c-format -msgid "This might be caused by ASLR or antivirus software." -msgstr "Це може бути викликано антивіруÑним програмним забезпеченнÑм або ASLR." +msgid "could not create pipe for syslog: %m" +msgstr "не вдалоÑÑ Ñтворити канал Ð´Ð»Ñ syslog: %m" -#: postmaster/postmaster.c:4983 +#: postmaster/syslogger.c:712 #, c-format -msgid "SSL configuration could not be loaded in child process" -msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ конфігурацію SSL в дочірній процеÑ" +msgid "could not fork system logger: %m" +msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ Ð¿Ñ€Ð¾Ñ†ÐµÑ ÑиÑтемного журналюваннÑ: %m" -#: postmaster/postmaster.c:5108 +#: postmaster/syslogger.c:731 #, c-format -msgid "Please report this to <%s>." -msgstr "Будь-лаÑка повідомте про це <%s>." +msgid "redirecting log output to logging collector process" +msgstr "переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ в протокол прочеÑу збирача протоколів" -#: postmaster/postmaster.c:5180 +#: postmaster/syslogger.c:732 #, c-format -msgid "database system is ready to accept read-only connections" -msgstr "ÑиÑтема бази даних готова до Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ" - -#: postmaster/postmaster.c:5444 -#, c-format -msgid "could not fork startup process: %m" -msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ Ñтартовий процеÑ: %m" - -#: postmaster/postmaster.c:5448 -#, c-format -msgid "could not fork archiver process: %m" -msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð°Ñ€Ñ…Ñ–Ð²Ð°Ñ‚Ð¾Ñ€Ð°: %m" - -#: postmaster/postmaster.c:5452 -#, c-format -msgid "could not fork background writer process: %m" -msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ фоновий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð¿Ð¸Ñу: %m" - -#: postmaster/postmaster.c:5456 -#, c-format -msgid "could not fork checkpointer process: %m" -msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ Ð¿Ñ€Ð¾Ñ†ÐµÑ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… точок: %m" - -#: postmaster/postmaster.c:5460 -#, c-format -msgid "could not fork WAL writer process: %m" -msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð¿Ð¸Ñу WAL: %m" - -#: postmaster/postmaster.c:5464 -#, c-format -msgid "could not fork WAL receiver process: %m" -msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ WAL: %m" - -#: postmaster/postmaster.c:5468 -#, c-format -msgid "could not fork process: %m" -msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ процеÑ: %m" - -#: postmaster/postmaster.c:5669 postmaster/postmaster.c:5696 -#, c-format -msgid "database connection requirement not indicated during registration" -msgstr "під Ñ‡Ð°Ñ Ñ€ÐµÑ”Ñтрації не вказувалоÑÑ, що вимагаєтьÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних" - -#: postmaster/postmaster.c:5680 postmaster/postmaster.c:5707 -#, c-format -msgid "invalid processing mode in background worker" -msgstr "неприпуÑтимий режим обробки у фоновому запиÑÑ–" - -#: postmaster/postmaster.c:5792 -#, c-format -msgid "could not fork worker process: %m" -msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð¿Ð¸Ñу: %m" - -#: postmaster/postmaster.c:5904 -#, c-format -msgid "no slot available for new worker process" -msgstr "немає доÑтупного Ñлоту Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ робочого процеÑу" - -#: postmaster/postmaster.c:6235 -#, c-format -msgid "could not duplicate socket %d for use in backend: error code %d" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ñ‚Ð¸ Ñокет %d Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ: код помилки %d" - -#: postmaster/postmaster.c:6267 -#, c-format -msgid "could not create inherited socket: error code %d\n" -msgstr "не вдалоÑÑ Ñтворити уÑпадкований Ñокет: код помилки %d\n" - -#: postmaster/postmaster.c:6296 -#, c-format -msgid "could not open backend variables file \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ внутрішні змінні файли \"%s\": %s\n" - -#: postmaster/postmaster.c:6303 -#, c-format -msgid "could not read from backend variables file \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ внутрішні змінні файли \"%s\": %s\n" - -#: postmaster/postmaster.c:6312 -#, c-format -msgid "could not remove file \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл \"%s\": %s\n" - -#: postmaster/postmaster.c:6329 -#, c-format -msgid "could not map view of backend variables: error code %lu\n" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð·Ð¸Ñ‚Ð¸ файл Ñерверних змінних: код помилки %lu\n" - -#: postmaster/postmaster.c:6338 -#, c-format -msgid "could not unmap view of backend variables: error code %lu\n" -msgstr "не вдалоÑÑ Ð²Ð¸Ð¼ÐºÐ½ÑƒÑ‚Ð¸ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ñерверних змінних: код помилки %lu\n" - -#: postmaster/postmaster.c:6345 -#, c-format -msgid "could not close handle to backend parameter variables: error code %lu\n" -msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ покажчик файлу Ñерверних змінних: код помилки %lu\n" - -#: postmaster/postmaster.c:6519 -#, c-format -msgid "could not read exit code for process\n" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу\n" - -#: postmaster/postmaster.c:6524 -#, c-format -msgid "could not post child completion status\n" -msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати ÑÑ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð½Ð°Ñ‰Ð°Ð´ÐºÐ°\n" +msgid "Future log output will appear in directory \"%s\"." +msgstr "ÐаÑтупні протоколи будуть виводитиÑÑŒ в каталог \"%s\"." -#: postmaster/shell_archive.c:121 +#: postmaster/syslogger.c:740 #, c-format -msgid "archive command failed with exit code %d" -msgstr "команда архівації завершилаÑÑŒ помилкой з кодом %d" +msgid "could not redirect stdout: %m" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑпрÑмувати stdout: %m" -#: postmaster/shell_archive.c:123 postmaster/shell_archive.c:133 -#: postmaster/shell_archive.c:139 postmaster/shell_archive.c:148 +#: postmaster/syslogger.c:745 postmaster/syslogger.c:762 #, c-format -msgid "The failed archive command was: %s" -msgstr "Команда архівації з помилкою: %s" +msgid "could not redirect stderr: %m" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑпрÑмувати stderr: %m" -#: postmaster/shell_archive.c:130 +#: postmaster/syslogger.c:1128 #, c-format -msgid "archive command was terminated by exception 0x%X" -msgstr "команда архівації була перервана винÑтком 0x%X" +msgid "could not write to log file: %m\n" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файлу протокола: %m\n" -#: postmaster/shell_archive.c:137 +#: postmaster/syslogger.c:1246 #, c-format -msgid "archive command was terminated by signal %d: %s" -msgstr "команда архівації була перервана Ñигналом %d: %s" +msgid "could not open log file \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу \"%s\": %m" -#: postmaster/shell_archive.c:146 +#: postmaster/syslogger.c:1336 #, c-format -msgid "archive command exited with unrecognized status %d" -msgstr "команда архівації завершена з нерозпізнаним ÑтатуÑом %d" +msgid "disabling automatic rotation (use SIGHUP to re-enable)" +msgstr "Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ (щоб повторно ввімкнути, викориÑтайте SIGHUP)" -#: postmaster/syslogger.c:501 postmaster/syslogger.c:1222 +#: postmaster/walsummarizer.c:740 #, c-format -msgid "could not read from logger pipe: %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з каналу журналюваннÑ: %m" +msgid "WAL summarization is not progressing" +msgstr "ÐŸÑ–Ð´Ð±Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ–Ð´Ñумків WAL не проÑуваєтьÑÑ" -#: postmaster/syslogger.c:598 postmaster/syslogger.c:612 +#: postmaster/walsummarizer.c:741 #, c-format -msgid "could not create pipe for syslog: %m" -msgstr "не вдалоÑÑ Ñтворити канал Ð´Ð»Ñ syslog: %m" +msgid "Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/%X in memory." +msgstr "ПідÑÑƒÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€Ñ–Ð±Ð½Ðµ через %X/%X, але воно заÑтрÑгло на %X/%X на диÑку та %X/%X у пам'Ñті." -#: postmaster/syslogger.c:677 +#: postmaster/walsummarizer.c:755 #, c-format -msgid "could not fork system logger: %m" -msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð¾Ð´Ð¸Ñ‚Ð¸ Ð¿Ñ€Ð¾Ñ†ÐµÑ ÑиÑтемного журналюваннÑ: %m" +msgid "still waiting for WAL summarization through %X/%X after %ld second" +msgid_plural "still waiting for WAL summarization through %X/%X after %ld seconds" +msgstr[0] "вÑе ще чекає на Ð¿Ñ–Ð´Ð±Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ–Ð´Ñумків WAL через %X/%X через %ld Ñекунду" +msgstr[1] "вÑе ще чекає на Ð¿Ñ–Ð´Ð±Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ–Ð´Ñумків WAL через %X/%X через %ld Ñекунди" +msgstr[2] "вÑе ще чекає на Ð¿Ñ–Ð´Ð±Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ–Ð´Ñумків WAL через %X/%X через %ld Ñекунд" +msgstr[3] "вÑе ще чекає на Ð¿Ñ–Ð´Ð±Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ–Ð´Ñумків WAL через %X/%X через %ld Ñекунд" -#: postmaster/syslogger.c:713 +#: postmaster/walsummarizer.c:760 #, c-format -msgid "redirecting log output to logging collector process" -msgstr "переÑпрÑÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ в протокол прочеÑу збирача протоколів" +msgid "Summarization has reached %X/%X on disk and %X/%X in memory." +msgstr "ПідÑумок доÑÑгнув %X/%X на диÑку та %X/%X у пам'Ñті." -#: postmaster/syslogger.c:714 +#: postmaster/walsummarizer.c:1000 #, c-format -msgid "Future log output will appear in directory \"%s\"." -msgstr "ÐаÑтупні протоколи будуть виводитиÑÑŒ в каталог \"%s\"." +msgid "could not find a valid record after %X/%X" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ припуÑтимий Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X" -#: postmaster/syslogger.c:722 +#: postmaster/walsummarizer.c:1045 #, c-format -msgid "could not redirect stdout: %m" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑпрÑмувати stdout: %m" +msgid "could not read WAL from timeline %u at %X/%X: %s" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ WAL з чаÑової шкали %u за адреÑою %X/%X: %s" -#: postmaster/syslogger.c:727 postmaster/syslogger.c:744 +#: postmaster/walsummarizer.c:1051 #, c-format -msgid "could not redirect stderr: %m" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑпрÑмувати stderr: %m" +msgid "could not read WAL from timeline %u at %X/%X" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ WAL з чаÑової шкали %u на %X/%X" -#: postmaster/syslogger.c:1177 +#: regex/regc_pg_locale.c:244 #, c-format -msgid "could not write to log file: %s\n" -msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файлу протокола: %s\n" +msgid "could not determine which collation to use for regular expression" +msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ Ñкі параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтати Ð´Ð»Ñ Ñ€ÐµÐ³ÑƒÐ»Ñрного виразу" -#: postmaster/syslogger.c:1295 +#: regex/regc_pg_locale.c:262 #, c-format -msgid "could not open log file \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу \"%s\": %m" +msgid "nondeterministic collations are not supported for regular expressions" +msgstr "недетерміновані правила ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ Ð´Ð»Ñ Ñ€ÐµÐ³ÑƒÐ»Ñрних виразів" -#: postmaster/syslogger.c:1385 +#: replication/libpqwalreceiver/libpqwalreceiver.c:267 +#: replication/libpqwalreceiver/libpqwalreceiver.c:358 #, c-format -msgid "disabling automatic rotation (use SIGHUP to re-enable)" -msgstr "Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ (щоб повторно ввімкнути, викориÑтайте SIGHUP)" +msgid "password is required" +msgstr "пароль обов'Ñзковий" -#: regex/regc_pg_locale.c:242 +#: replication/libpqwalreceiver/libpqwalreceiver.c:268 #, c-format -msgid "could not determine which collation to use for regular expression" -msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ Ñкі параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтати Ð´Ð»Ñ Ñ€ÐµÐ³ÑƒÐ»Ñрного виразу" +msgid "Non-superuser cannot connect if the server does not request a password." +msgstr "ÐеÑуперкориÑтувач не може підключитиÑÑ, Ñкщо Ñервер не запитує пароль." -#: regex/regc_pg_locale.c:265 +#: replication/libpqwalreceiver/libpqwalreceiver.c:269 #, c-format -msgid "nondeterministic collations are not supported for regular expressions" -msgstr "недетерміновані правила ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ Ð´Ð»Ñ Ñ€ÐµÐ³ÑƒÐ»Ñрних виразів" +msgid "Target server's authentication method must be changed, or set password_required=false in the subscription parameters." +msgstr "Ðеобхідно змінити метод автентифікації цільового Ñервера або вÑтановити password_required=false у параметрах підпиÑки." -#: replication/libpqwalreceiver/libpqwalreceiver.c:240 +#: replication/libpqwalreceiver/libpqwalreceiver.c:285 #, c-format msgid "could not clear search path: %s" msgstr "не вдалоÑÑ Ð¾Ñ‡Ð¸Ñтити шлÑÑ… пошуку: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:269 +#: replication/libpqwalreceiver/libpqwalreceiver.c:331 +#: replication/libpqwalreceiver/libpqwalreceiver.c:517 #, c-format msgid "invalid connection string syntax: %s" msgstr "неприпуÑтимий ÑинтакÑÐ¸Ñ Ñ€Ñдка підключеннÑ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:295 +#: replication/libpqwalreceiver/libpqwalreceiver.c:359 +#, c-format +msgid "Non-superusers must provide a password in the connection string." +msgstr "ÐеÑуперкориÑтувачі повинні вказати пароль Ð´Ð»Ñ Ñ€Ñдка підключеннÑ." + +#: replication/libpqwalreceiver/libpqwalreceiver.c:386 #, c-format msgid "could not parse connection string: %s" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ñ€Ñдок підключеннÑ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:368 +#: replication/libpqwalreceiver/libpqwalreceiver.c:459 #, c-format msgid "could not receive database system identifier and timeline ID from the primary server: %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ідентифікатор ÑиÑтеми бази даних та ідентифікатор чаÑової шкали з оÑновного Ñерверу: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:380 -#: replication/libpqwalreceiver/libpqwalreceiver.c:618 +#: replication/libpqwalreceiver/libpqwalreceiver.c:476 +#: replication/libpqwalreceiver/libpqwalreceiver.c:763 #, c-format msgid "invalid response from primary server" msgstr "неприпуÑтима відповідь з оÑновного Ñерверу" -#: replication/libpqwalreceiver/libpqwalreceiver.c:381 +#: replication/libpqwalreceiver/libpqwalreceiver.c:477 #, c-format msgid "Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields." msgstr "Ðе вдалоÑÑ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÑƒÐ²Ð°Ñ‚Ð¸ ÑиÑтему: отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d або більше полів." -#: replication/libpqwalreceiver/libpqwalreceiver.c:461 -#: replication/libpqwalreceiver/libpqwalreceiver.c:468 -#: replication/libpqwalreceiver/libpqwalreceiver.c:498 +#: replication/libpqwalreceiver/libpqwalreceiver.c:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:613 +#: replication/libpqwalreceiver/libpqwalreceiver.c:643 #, c-format msgid "could not start WAL streaming: %s" msgstr "не вдалоÑÑ Ð¿Ð¾Ñ‡Ð°Ñ‚Ð¸ потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:522 +#: replication/libpqwalreceiver/libpqwalreceiver.c:667 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ оÑновному Ñерверу Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ кінець передваннÑ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:545 +#: replication/libpqwalreceiver/libpqwalreceiver.c:690 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "неочікуваний набір результатів піÑÐ»Ñ ÐºÑ–Ð½Ñ†Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ–" -#: replication/libpqwalreceiver/libpqwalreceiver.c:560 +#: replication/libpqwalreceiver/libpqwalreceiver.c:705 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "помилка при завершенні потокового Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ \"копіювати\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:570 +#: replication/libpqwalreceiver/libpqwalreceiver.c:715 #, c-format msgid "error reading result of streaming command: %s" msgstr "помилка при читанні результату команди потокового передаваннÑ: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:579 -#: replication/libpqwalreceiver/libpqwalreceiver.c:817 +#: replication/libpqwalreceiver/libpqwalreceiver.c:724 +#: replication/libpqwalreceiver/libpqwalreceiver.c:957 #, c-format msgid "unexpected result after CommandComplete: %s" msgstr "неочікуваний результат CommandComplete: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:606 +#: replication/libpqwalreceiver/libpqwalreceiver.c:751 #, c-format msgid "could not receive timeline history file from the primary server: %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ файл Ñ–Ñторії чаÑової шкали з оÑновного Ñервера: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:619 +#: replication/libpqwalreceiver/libpqwalreceiver.c:764 #, c-format msgid "Expected 1 tuple with 2 fields, got %d tuples with %d fields." msgstr "ОчікувалоÑÑ 1 кортеж з 2 поле, отримано %d кортежів з %d полÑми." -#: replication/libpqwalreceiver/libpqwalreceiver.c:780 -#: replication/libpqwalreceiver/libpqwalreceiver.c:833 -#: replication/libpqwalreceiver/libpqwalreceiver.c:840 +#: replication/libpqwalreceiver/libpqwalreceiver.c:920 +#: replication/libpqwalreceiver/libpqwalreceiver.c:973 +#: replication/libpqwalreceiver/libpqwalreceiver.c:980 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані з WAL потоку: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:860 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1000 #, c-format msgid "could not send data to WAL stream: %s" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ дані потоку WAL: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:952 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1101 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "не вдалоÑÑ Ñтворити Ñлот реплікації \"%s\": %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:998 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1140 +#, c-format +msgid "could not alter replication slot \"%s\": %s" +msgstr "не може змінити Ñлот реплікації \"%s\": %s" + +#: replication/libpqwalreceiver/libpqwalreceiver.c:1174 #, c-format msgid "invalid query response" msgstr "неприпуÑтима відповідь на запит" -#: replication/libpqwalreceiver/libpqwalreceiver.c:999 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1175 #, c-format msgid "Expected %d fields, got %d fields." msgstr "ОчікувалоÑÑ %d полів, отримано %d полі." -#: replication/libpqwalreceiver/libpqwalreceiver.c:1069 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1245 #, c-format msgid "the query interface requires a database connection" msgstr "Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² вимагає Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1100 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1277 msgid "empty query" msgstr "пуÑтий запит" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1106 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1283 msgid "unexpected pipeline mode" msgstr "неочікуваний режим конвеєра" -#: replication/logical/launcher.c:285 +#: replication/logical/applyparallelworker.c:719 +#, c-format +msgid "logical replication parallel apply worker for subscription \"%s\" has finished" +msgstr "завершено логічну реплікацію паралельного аплікатора Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\"" + +#: replication/logical/applyparallelworker.c:822 +#, c-format +msgid "lost connection to the logical replication apply worker" +msgstr "втрачено зв'Ñзок з робочим заÑтоÑунком логічної реплікації" + +#: replication/logical/applyparallelworker.c:1024 +#: replication/logical/applyparallelworker.c:1026 +msgid "logical replication parallel apply worker" +msgstr "заÑтоÑовуючій робочий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ñ— реплікації" + +#: replication/logical/applyparallelworker.c:1040 +#, c-format +msgid "logical replication parallel apply worker exited due to error" +msgstr "паралельний робочий додаток логічнаої реплікації завершив роботу через помилку" + +#: replication/logical/applyparallelworker.c:1127 +#: replication/logical/applyparallelworker.c:1300 +#, c-format +msgid "lost connection to the logical replication parallel apply worker" +msgstr "втрачено зв'Ñзок з паралельним робочим заÑтоÑунком логічної реплікації" + +#: replication/logical/applyparallelworker.c:1180 +#, c-format +msgid "could not send data to shared-memory queue" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ дані в чергу в Ñпільну пам'Ñть" + +#: replication/logical/applyparallelworker.c:1215 +#, c-format +msgid "logical replication apply worker will serialize the remaining changes of remote transaction %u to a file" +msgstr "заÑтоÑовуючий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації буде Ñеріалізувати зміни, що залишилиÑÑ Ð²Ñ–Ð´Ð´Ð°Ð»ÐµÐ½Ð¾ÑŽ транзакцією %u до файлу" + +#: replication/logical/decode.c:177 replication/logical/logical.c:141 +#, c-format +msgid "logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary" +msgstr "логічне Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° standby вимагає \"wal_level\" >= \"logical\" на оÑновному Ñервері" + +#: replication/logical/launcher.c:334 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "неможливо почати логічні запиÑи реплікацій, коли max_replication_slots = 0" -#: replication/logical/launcher.c:365 +#: replication/logical/launcher.c:427 #, c-format msgid "out of logical replication worker slots" msgstr "недоÑтатньо Ñлотів Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑів логічної реплікації" -#: replication/logical/launcher.c:366 +#: replication/logical/launcher.c:428 replication/logical/launcher.c:514 +#: replication/slot.c:1524 storage/lmgr/lock.c:985 storage/lmgr/lock.c:1023 +#: storage/lmgr/lock.c:2836 storage/lmgr/lock.c:4221 storage/lmgr/lock.c:4286 +#: storage/lmgr/lock.c:4636 storage/lmgr/predicate.c:2469 +#: storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:3881 #, c-format -msgid "You might need to increase max_logical_replication_workers." -msgstr "Можливо, вам Ñлід збільшити max_logical_replication_workers." +msgid "You might need to increase \"%s\"." +msgstr "Можливо, вам Ñлід збільшити \"%s\"." -#: replication/logical/launcher.c:422 +#: replication/logical/launcher.c:513 #, c-format msgid "out of background worker slots" msgstr "недоÑтатньо Ñлотів Ð´Ð»Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¸Ñ… робочих процеÑів" -#: replication/logical/launcher.c:423 -#, c-format -msgid "You might need to increase max_worker_processes." -msgstr "Можливо, вам Ñлід збільшити max_worker_processes." - -#: replication/logical/launcher.c:577 +#: replication/logical/launcher.c:720 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "Ñлот запиÑу логічної реплікації %d пуÑтий, неможливо підключитиÑÑ" -#: replication/logical/launcher.c:586 +#: replication/logical/launcher.c:729 #, c-format msgid "logical replication worker slot %d is already used by another worker, cannot attach" msgstr "Ñлот запиÑу логічної реплікації %d вже викориÑтовуєтьÑÑ Ñ–Ð½ÑˆÐ¸Ð¼ виконавцем, неможливо підключитиÑÑ" -#: replication/logical/logical.c:115 +#: replication/logical/logical.c:121 #, c-format -msgid "logical decoding requires wal_level >= logical" -msgstr "логічне Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ” wal_level >= logical" +msgid "logical decoding requires \"wal_level\" >= \"logical\"" +msgstr "логічне Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ” \"wal_level\" >= logical\"" -#: replication/logical/logical.c:120 +#: replication/logical/logical.c:126 #, c-format msgid "logical decoding requires a database connection" msgstr "логічне Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð¼Ð°Ð³Ð°Ñ” Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних" -#: replication/logical/logical.c:138 -#, c-format -msgid "logical decoding cannot be used while in recovery" -msgstr "логічне Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ викориÑтовувати під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ" - -#: replication/logical/logical.c:348 replication/logical/logical.c:502 +#: replication/logical/logical.c:365 replication/logical/logical.c:519 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "неможливо викориÑтовувати Ñлот невідповідної реплікації Ð´Ð»Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ кодуваннÑ" -#: replication/logical/logical.c:353 replication/logical/logical.c:507 +#: replication/logical/logical.c:370 replication/logical/logical.c:529 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "Ñлот реплікації \"%s\" був Ñтворений не в цій базі даних" -#: replication/logical/logical.c:360 +#: replication/logical/logical.c:377 #, c-format msgid "cannot create logical replication slot in transaction that has performed writes" msgstr "неможливо Ñтворити Ñлот логічної реплікації у транзакції, що виконує запиÑуваннÑ" -#: replication/logical/logical.c:568 +#: replication/logical/logical.c:540 +#, c-format +msgid "cannot use replication slot \"%s\" for logical decoding" +msgstr "не може викориÑтовувати Ñлот реплікації \"%s\" Ð´Ð»Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ декодуваннÑ" + +#: replication/logical/logical.c:542 replication/slot.c:798 +#: replication/slot.c:829 +#, c-format +msgid "This replication slot is being synchronized from the primary server." +msgstr "Цей Ñлот реплікації ÑинхронізуєтьÑÑ Ð· оÑновного Ñервера." + +#: replication/logical/logical.c:543 +#, c-format +msgid "Specify another replication slot." +msgstr "Вкажіть інший Ñлот реплікації." + +#: replication/logical/logical.c:554 replication/logical/logical.c:561 +#, c-format +msgid "can no longer get changes from replication slot \"%s\"" +msgstr "більше не можна отримувати зміни з Ñлоту реплікації \"%s\"" + +#: replication/logical/logical.c:556 +#, c-format +msgid "This slot has been invalidated because it exceeded the maximum reserved size." +msgstr "Цей Ñлот визнано недійÑним, тому що він перевищив макÑимально зарезервований розмір." + +#: replication/logical/logical.c:563 +#, c-format +msgid "This slot has been invalidated because it was conflicting with recovery." +msgstr "Цей Ñлот було ÑкаÑовано, оÑкільки він Ñуперечив відновленню." + +#: replication/logical/logical.c:628 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "початок логічного Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñлоту \"%s\"" -#: replication/logical/logical.c:570 +#: replication/logical/logical.c:630 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ð¹, що затверджені, піÑÐ»Ñ %X/%X, Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ WAL з %X/%X." -#: replication/logical/logical.c:718 +#: replication/logical/logical.c:778 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback, associated LSN %X/%X" msgstr "Ñлот \"%s\", плагін виходу \"%s\", у зворотньому виклику %s, пов'Ñзаний номер LSN %X/%X" -#: replication/logical/logical.c:724 +#: replication/logical/logical.c:784 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "Ñлот \"%s\", плагін виходу \"%s\", у зворотньому виклику %s" -#: replication/logical/logical.c:895 replication/logical/logical.c:940 -#: replication/logical/logical.c:985 replication/logical/logical.c:1031 +#: replication/logical/logical.c:955 replication/logical/logical.c:1000 +#: replication/logical/logical.c:1045 replication/logical/logical.c:1091 #, c-format msgid "logical replication at prepare time requires a %s callback" msgstr "логічна Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿Ñ–Ð´Ð³Ð¾Ñ‚Ð¾Ð²ÐºÐ¸ потребує %s зворотнього виклику" -#: replication/logical/logical.c:1263 replication/logical/logical.c:1312 -#: replication/logical/logical.c:1353 replication/logical/logical.c:1439 -#: replication/logical/logical.c:1488 +#: replication/logical/logical.c:1323 replication/logical/logical.c:1372 +#: replication/logical/logical.c:1413 replication/logical/logical.c:1499 +#: replication/logical/logical.c:1548 #, c-format msgid "logical streaming requires a %s callback" msgstr "логічне потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” %s зворотнього виклику" -#: replication/logical/logical.c:1398 +#: replication/logical/logical.c:1458 #, c-format msgid "logical streaming at prepare time requires a %s callback" msgstr "логічне потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿Ñ–Ð´Ð³Ð¾Ñ‚Ð¾Ð²ÐºÐ¸ потребує %s зворотнього виклику" -#: replication/logical/logicalfuncs.c:126 +#: replication/logical/logicalfuncs.c:123 #, c-format msgid "slot name must not be null" msgstr "ім'Ñ Ñлоту має бути не Null-значеннÑ" -#: replication/logical/logicalfuncs.c:142 +#: replication/logical/logicalfuncs.c:139 #, c-format msgid "options array must not be null" msgstr "маÑив параметрів має бути не Null-значеннÑ" -#: replication/logical/logicalfuncs.c:159 +#: replication/logical/logicalfuncs.c:156 #, c-format msgid "array must be one-dimensional" msgstr "маÑив має бути одновимірним" -#: replication/logical/logicalfuncs.c:165 +#: replication/logical/logicalfuncs.c:162 #, c-format msgid "array must not contain nulls" msgstr "маÑив не має включати nulls" -#: replication/logical/logicalfuncs.c:181 utils/adt/json.c:1437 -#: utils/adt/jsonb.c:1365 +#: replication/logical/logicalfuncs.c:177 utils/adt/json.c:1420 +#: utils/adt/jsonb.c:1304 #, c-format msgid "array must have even number of elements" msgstr "маÑив повинен мати парну кількіÑть елементів" -#: replication/logical/logicalfuncs.c:227 -#, c-format -msgid "can no longer get changes from replication slot \"%s\"" -msgstr "більше не можна отримувати зміни з Ñлоту реплікації \"%s\"" - -#: replication/logical/logicalfuncs.c:229 replication/slotfuncs.c:616 -#, c-format -msgid "This slot has never previously reserved WAL, or it has been invalidated." -msgstr "Цей Ñлот ніколи раніше не резервував WAL, або він був недійÑним." - -#: replication/logical/logicalfuncs.c:241 +#: replication/logical/logicalfuncs.c:224 #, c-format msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" msgstr "плагін виходу логічного Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" вироблÑÑ” бінарний вихід, але Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" очікує текÑтові дані" -#: replication/logical/origin.c:189 +#: replication/logical/origin.c:190 #, c-format -msgid "cannot query or manipulate replication origin when max_replication_slots = 0" -msgstr "неможливо вимагати або маніпулювати джерелами реплікації, коли max_replication_slots = 0" +msgid "cannot query or manipulate replication origin when \"max_replication_slots\" is 0" +msgstr "неможливо надіÑлати запит або маніпулювати джерелами реплікації, коли \"max_replication_slots\" = 0" -#: replication/logical/origin.c:194 +#: replication/logical/origin.c:195 #, c-format msgid "cannot manipulate replication origins during recovery" msgstr "неможливо маніпулювати джерелами реплікації під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ" -#: replication/logical/origin.c:228 +#: replication/logical/origin.c:240 #, c-format msgid "replication origin \"%s\" does not exist" msgstr "джерело реплікації \"%s\" не Ñ–Ñнує" -#: replication/logical/origin.c:319 +#: replication/logical/origin.c:331 #, c-format -msgid "could not find free replication origin OID" -msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ вільний ідентифікатор OID джерела реплікації" +msgid "could not find free replication origin ID" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ вільний ідентифікатор ID джерела реплікації" -#: replication/logical/origin.c:355 +#: replication/logical/origin.c:365 #, c-format -msgid "could not drop replication origin with OID %d, in use by PID %d" -msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ñ–Ñ€Ð²Ð°Ñ‚Ð¸ джерело реплікації з ідентифікатором OID %d, викориÑтовуєтьÑÑ PID %d" +msgid "could not drop replication origin with ID %d, in use by PID %d" +msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ñ–Ñ€Ð²Ð°Ñ‚Ð¸ джерело реплікації з ідентифікатором ID %d, викориÑтовуєтьÑÑ PID %d" -#: replication/logical/origin.c:476 +#: replication/logical/origin.c:492 #, c-format -msgid "replication origin with OID %u does not exist" -msgstr "джерело реплікації з ідентифікатором OID %u не Ñ–Ñнує" +msgid "replication origin with ID %d does not exist" +msgstr "джерело реплікації з ідентифікатором ID %d не Ñ–Ñнує" -#: replication/logical/origin.c:741 +#: replication/logical/origin.c:757 #, c-format msgid "replication checkpoint has wrong magic %u instead of %u" msgstr "контрольна точка реплікації має неправильну Ñигнатуру %u заміÑть %u" -#: replication/logical/origin.c:782 +#: replication/logical/origin.c:798 #, c-format -msgid "could not find free replication state, increase max_replication_slots" -msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ вільний Ñлот Ð´Ð»Ñ Ñтану реплікації, збільшіть max_replication_slots" +msgid "could not find free replication state, increase \"max_replication_slots\"" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ вільний Ñлот Ð´Ð»Ñ Ñтану реплікації, збільшіть \"max_replication_slots\"" -#: replication/logical/origin.c:790 +#: replication/logical/origin.c:806 #, c-format -msgid "recovered replication state of node %u to %X/%X" -msgstr "відновлений Ñтан реплікації вузла %u в %X/%X" +msgid "recovered replication state of node %d to %X/%X" +msgstr "відновлений Ñтан реплікації вузла %d в %X/%X" -#: replication/logical/origin.c:800 +#: replication/logical/origin.c:816 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "неправильна контрольна Ñума файлу контрольної точки Ð´Ð»Ñ Ñлота реплікації %u, очікувалоÑÑŒ %u" -#: replication/logical/origin.c:928 replication/logical/origin.c:1117 +#: replication/logical/origin.c:944 replication/logical/origin.c:1143 #, c-format -msgid "replication origin with OID %d is already active for PID %d" -msgstr "джерело реплікації з OID %d вже активний Ð´Ð»Ñ PID %d" +msgid "replication origin with ID %d is already active for PID %d" +msgstr "джерело реплікації з ID %d вже активний Ð´Ð»Ñ PID %d" -#: replication/logical/origin.c:939 replication/logical/origin.c:1129 +#: replication/logical/origin.c:955 replication/logical/origin.c:1156 #, c-format -msgid "could not find free replication state slot for replication origin with OID %u" -msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ вільний Ñлот Ñтану реплікації Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації з OID %u" +msgid "could not find free replication state slot for replication origin with ID %d" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ вільний Ñлот Ñтану реплікації Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації з ID %d" -#: replication/logical/origin.c:941 replication/logical/origin.c:1131 -#: replication/slot.c:1912 +#: replication/logical/origin.c:957 replication/logical/origin.c:1158 +#: replication/slot.c:2401 #, c-format -msgid "Increase max_replication_slots and try again." -msgstr "Збільшіть max_replication_slots Ñ– Ñпробуйте знову." +msgid "Increase \"max_replication_slots\" and try again." +msgstr "Збільшіть \"max_replication_slots\" Ñ– Ñпробуйте знову." -#: replication/logical/origin.c:1088 +#: replication/logical/origin.c:1114 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "не можна налаштувати джерело реплікації, коли один вже налаштований" -#: replication/logical/origin.c:1168 replication/logical/origin.c:1380 -#: replication/logical/origin.c:1400 +#: replication/logical/origin.c:1199 replication/logical/origin.c:1415 +#: replication/logical/origin.c:1435 #, c-format msgid "no replication origin is configured" msgstr "жодне джерело реплікації не налаштоване" -#: replication/logical/origin.c:1251 +#: replication/logical/origin.c:1285 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "назва джерела реплікації \"%s\" зарезервована" -#: replication/logical/origin.c:1253 +#: replication/logical/origin.c:1287 #, c-format -msgid "Origin names starting with \"pg_\" are reserved." -msgstr "Ðазви джерел, Ñкі починаютьÑÑ Ð½Ð° \"pg_\" зарезервовані." +msgid "Origin names \"%s\", \"%s\", and names starting with \"pg_\" are reserved." +msgstr "Імена походженнÑм \"%s\", \"%s\" та імена, що починаютьÑÑ Ð· \"pg_\", Ñ” зарезервованими." -#: replication/logical/relation.c:234 +#: replication/logical/relation.c:242 #, c-format msgid "\"%s\"" msgstr "\"%s\"" -#: replication/logical/relation.c:237 +#: replication/logical/relation.c:245 #, c-format msgid ", \"%s\"" msgstr ", \"%s\"" -#: replication/logical/relation.c:243 +#: replication/logical/relation.c:251 #, c-format msgid "logical replication target relation \"%s.%s\" is missing replicated column: %s" msgid_plural "logical replication target relation \"%s.%s\" is missing replicated columns: %s" @@ -19754,49 +20450,177 @@ msgstr[1] "в цільовому відношенні логічної репл msgstr[2] "в цільовому відношенні логічної реплікації \"%s.%s\" пропущено репліковані Ñтовпці: %s" msgstr[3] "в цільовому відношенні логічної реплікації \"%s.%s\" пропущено репліковані Ñтовпці: %s" -#: replication/logical/relation.c:298 +#: replication/logical/relation.c:306 #, c-format msgid "logical replication target relation \"%s.%s\" uses system columns in REPLICA IDENTITY index" msgstr "в цільовому відношенні логічної реплікації \"%s.%s\" в індекÑÑ– REPLICA IDENTITY викориÑтовуютьÑÑ ÑиÑтемні Ñтовпці" -#: replication/logical/relation.c:390 +#: replication/logical/relation.c:398 #, c-format msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "цільове Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації \"%s.%s\" не Ñ–Ñнує" -#: replication/logical/reorderbuffer.c:3809 +#: replication/logical/reorderbuffer.c:3999 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати у файл даних Ð´Ð»Ñ XID %u: %m" -#: replication/logical/reorderbuffer.c:4153 -#: replication/logical/reorderbuffer.c:4178 +#: replication/logical/reorderbuffer.c:4345 +#: replication/logical/reorderbuffer.c:4370 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð±ÑƒÑ„ÐµÑ€Ñƒ переÑортуваннÑ: %m" -#: replication/logical/reorderbuffer.c:4157 -#: replication/logical/reorderbuffer.c:4182 +#: replication/logical/reorderbuffer.c:4349 +#: replication/logical/reorderbuffer.c:4374 #, c-format msgid "could not read from reorderbuffer spill file: read %d instead of %u bytes" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð±ÑƒÑ„ÐµÑ€Ñƒ переÑортуваннÑ: прочитано %d заміÑть %u байт" -#: replication/logical/reorderbuffer.c:4432 +#: replication/logical/reorderbuffer.c:4624 #, c-format msgid "could not remove file \"%s\" during removal of pg_replslot/%s/xid*: %m" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл \"%s\" під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ pg_replslot/%s/xid*: %m" -#: replication/logical/reorderbuffer.c:4931 +#: replication/logical/reorderbuffer.c:5120 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу \"%s\": прочитано %d заміÑть %d байт" -#: replication/logical/snapbuild.c:627 +#: replication/logical/slotsync.c:215 +#, c-format +msgid "could not synchronize replication slot \"%s\" because remote slot precedes local slot" +msgstr "не вдалоÑÑ Ñинхронізувати Ñлот реплікації \"%s\", оÑкільки віддалений Ñлот передує локальному" + +#: replication/logical/slotsync.c:217 +#, c-format +msgid "The remote slot has LSN %X/%X and catalog xmin %u, but the local slot has LSN %X/%X and catalog xmin %u." +msgstr "Віддалений Ñлот має LSN %X/%X Ñ– каталог xmin %u, а локальний Ñлот має LSN %X/%X Ñ– каталог xmin %u." + +#: replication/logical/slotsync.c:459 +#, c-format +msgid "dropped replication slot \"%s\" of database with OID %u" +msgstr "видалено Ñлот реплікації \"%s\" бази даних з OID %u" + +#: replication/logical/slotsync.c:579 +#, c-format +msgid "could not synchronize replication slot \"%s\"" +msgstr "не вдалоÑÑ Ñинхронізувати Ñлот реплікації \"%s\"" + +#: replication/logical/slotsync.c:580 +#, c-format +msgid "Logical decoding could not find consistent point from local slot's LSN %X/%X." +msgstr "Логічне Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ може знайти Ñтійку точку з локальних LSN %X/%X." + +#: replication/logical/slotsync.c:589 +#, c-format +msgid "newly created replication slot \"%s\" is sync-ready now" +msgstr "новоÑтворений Ñлот реплікації \"%s\" готовий до Ñинхронізації" + +#: replication/logical/slotsync.c:628 +#, c-format +msgid "skipping slot synchronization because the received slot sync LSN %X/%X for slot \"%s\" is ahead of the standby position %X/%X" +msgstr "пропуÑк Ñинхронізації Ñлотів, оÑкільки отримана ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñлотів LSN %X/%X Ð´Ð»Ñ Ñлота \"%s\" випереджає позицію Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ %X/%X" + +#: replication/logical/slotsync.c:650 +#, c-format +msgid "exiting from slot synchronization because same name slot \"%s\" already exists on the standby" +msgstr "вихід із Ñинхронізації Ñлотів, оÑкільки однойменний Ñлот \"%s\" вже Ñ–Ñнує у режимі очікуваннÑ" + +#: replication/logical/slotsync.c:819 +#, c-format +msgid "could not fetch failover logical slots info from the primary server: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про логічні Ñлоти обходу відмови з оÑновного Ñервера: %s" + +#: replication/logical/slotsync.c:965 +#, c-format +msgid "could not fetch primary_slot_name \"%s\" info from the primary server: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію primary_slot_name \"%s\" з первинного Ñервера: %s" + +#: replication/logical/slotsync.c:967 +#, c-format +msgid "Check if primary_slot_name is configured correctly." +msgstr "Перевірте, чи правильно налаштовано primary_slot_name." + +#: replication/logical/slotsync.c:987 +#, c-format +msgid "cannot synchronize replication slots from a standby server" +msgstr "не вдаєтьÑÑ Ñинхронізувати Ñлоти реплікації з резервного Ñервера" + +#. translator: second %s is a GUC variable name +#: replication/logical/slotsync.c:996 +#, c-format +msgid "replication slot \"%s\" specified by \"%s\" does not exist on primary server" +msgstr "Ñлот реплікації \"%s\", на Ñкий вказує \"%s\", не Ñ–Ñнує на оÑновному Ñервері" + +#. translator: first %s is a connection option; second %s is a GUC +#. variable name +#. +#: replication/logical/slotsync.c:1029 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be specified in \"%s\"" +msgstr "Ð´Ð»Ñ Ñинхронізації Ñлотів реплікації потрібно, щоб \"%s\" було вказано у \"%s\"" + +#: replication/logical/slotsync.c:1050 +#, c-format +msgid "replication slot synchronization requires \"wal_level\" >= \"logical\"" +msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñлотів вимагає \"wal_level\" >= \"logical\"" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1063 replication/logical/slotsync.c:1091 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be set" +msgstr "Ð´Ð»Ñ Ñинхронізації Ñлотів реплікації потрібно, щоб було вказано \"%s\"" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1077 +#, c-format +msgid "replication slot synchronization requires \"%s\" to be enabled" +msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñлотів реплікації потребує Ð²Ð²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ \"%s\"" + +#. translator: %s is a GUC variable name +#: replication/logical/slotsync.c:1129 +#, c-format +msgid "replication slot synchronization worker will shut down because \"%s\" is disabled" +msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñинхронизації Ñлотів реплікації буде вимкнутий, тому що \"%s\" відключено" + +#: replication/logical/slotsync.c:1138 +#, c-format +msgid "replication slot synchronization worker will restart because of a parameter change" +msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñинхронізації Ñлотів реплікації буде перезавантажений через зміну параметра" + +#: replication/logical/slotsync.c:1162 +#, c-format +msgid "replication slot synchronization worker is shutting down on receiving SIGINT" +msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñинхронізації Ñлотів реплікації буде вимкнуто через Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SIGINT" + +#: replication/logical/slotsync.c:1287 +#, c-format +msgid "cannot synchronize replication slots when standby promotion is ongoing" +msgstr "неможливо Ñинхронізувати Ñлоти реплікації під Ñ‡Ð°Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ Ñервера" + +#: replication/logical/slotsync.c:1295 +#, c-format +msgid "cannot synchronize replication slots concurrently" +msgstr "не може Ñинхронізувати Ñлоти реплікації одночаÑно" + +#: replication/logical/slotsync.c:1403 +#, c-format +msgid "slot sync worker started" +msgstr "запущено працівника Ñинхронізації Ñлотів" + +#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:905 +#: replication/walreceiver.c:307 +#, c-format +msgid "could not connect to the primary server: %s" +msgstr "не вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ оÑновного Ñерверу: %s" + +#: replication/logical/snapbuild.c:653 #, c-format msgid "initial slot snapshot too large" msgstr "початковий знімок Ñлота занадто великий" -#: replication/logical/snapbuild.c:681 +#: replication/logical/snapbuild.c:707 #, c-format msgid "exported logical decoding snapshot: \"%s\" with %u transaction ID" msgid_plural "exported logical decoding snapshot: \"%s\" with %u transaction IDs" @@ -19805,1133 +20629,1330 @@ msgstr[1] "екÑпортовано знімок логічного декоду msgstr[2] "екÑпортовано знімок логічного Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" з %u ID транзакціÑми" msgstr[3] "екÑпортовано знімок логічного Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" з %u ID транзакціÑми" -#: replication/logical/snapbuild.c:1357 replication/logical/snapbuild.c:1464 -#: replication/logical/snapbuild.c:1993 +#: replication/logical/snapbuild.c:1404 replication/logical/snapbuild.c:1501 +#: replication/logical/snapbuild.c:2017 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу логічного ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾ в точці %X/%X" -#: replication/logical/snapbuild.c:1359 +#: replication/logical/snapbuild.c:1406 #, c-format msgid "There are no running transactions." msgstr "Більше активних транзакцій немає." -#: replication/logical/snapbuild.c:1415 +#: replication/logical/snapbuild.c:1453 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "початкова Ñтартова точка процеÑу логічного Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð° в точці %X/%X" -#: replication/logical/snapbuild.c:1417 replication/logical/snapbuild.c:1441 +#: replication/logical/snapbuild.c:1455 replication/logical/snapbuild.c:1479 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ð¹ (приблизно %d) Ñтаріше, ніж %u до кінцÑ." -#: replication/logical/snapbuild.c:1439 +#: replication/logical/snapbuild.c:1477 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "початкова точка ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу логічного ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ð° в точці %X/%X" -#: replication/logical/snapbuild.c:1466 +#: replication/logical/snapbuild.c:1503 #, c-format msgid "There are no old transactions anymore." msgstr "Більше Ñтарих транзакцій немає." -#: replication/logical/snapbuild.c:1861 +#: replication/logical/snapbuild.c:1904 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "файл Ñтану snapbuild \"%s\" має неправильне магічне чиÑло: %u заміÑть %u" -#: replication/logical/snapbuild.c:1867 +#: replication/logical/snapbuild.c:1910 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "файл Ñтану snapbuild \"%s\" має непідтримуючу верÑÑ–ÑŽ: %u заміÑть %u" -#: replication/logical/snapbuild.c:1938 +#: replication/logical/snapbuild.c:1951 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "у файлі Ñтану snapbuild \"%s\" невідповідніÑть контрольної Ñуми: %u, повинно бути %u" -#: replication/logical/snapbuild.c:1995 +#: replication/logical/snapbuild.c:2019 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Логічне Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‡Ð½ÐµÑ‚ÑŒÑÑ Ð·Ñ– збереженого знімку." -#: replication/logical/snapbuild.c:2067 +#: replication/logical/snapbuild.c:2126 #, c-format msgid "could not parse file name \"%s\"" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\"" -#: replication/logical/tablesync.c:151 +#: replication/logical/tablesync.c:161 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has finished" msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñинхронізації таблиці при логічній реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\", таблиці \"%s\" закінчив обробку" -#: replication/logical/tablesync.c:422 +#: replication/logical/tablesync.c:641 #, c-format msgid "logical replication apply worker for subscription \"%s\" will restart so that two_phase can be enabled" msgstr "заÑтоÑовуючий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" буде перезавантажено, щоб можна було активувати two_phase" -#: replication/logical/tablesync.c:732 replication/logical/tablesync.c:876 +#: replication/logical/tablesync.c:827 replication/logical/tablesync.c:969 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про таблицю \"%s.%s\" з Ñерверу публікації: %s" -#: replication/logical/tablesync.c:739 +#: replication/logical/tablesync.c:834 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s.%s\" не знайдена на Ñервері публікації" -#: replication/logical/tablesync.c:799 +#: replication/logical/tablesync.c:892 #, c-format msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про ÑпиÑок Ñтовпців Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s.%s\" з Ñерверу публікації: %s" -#: replication/logical/tablesync.c:981 +#: replication/logical/tablesync.c:1071 #, c-format msgid "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про вираз WHERE Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s.%s\" з Ñерверу публікації: %s" -#: replication/logical/tablesync.c:1118 +#: replication/logical/tablesync.c:1230 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "не вдалоÑÑ Ð¿Ð¾Ñ‡Ð°Ñ‚Ð¸ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ð³Ð¾ зміÑту таблиці \"%s.%s\": %s" -#: replication/logical/tablesync.c:1330 replication/logical/worker.c:1634 -#, c-format -msgid "\"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" -msgstr "\"%s\" реплікувати у Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· увімкненим захиÑтом на рівні Ñ€Ñдків, не можна: \"%s\"" - -#: replication/logical/tablesync.c:1345 +#: replication/logical/tablesync.c:1429 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "копії таблиці не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити транзакцію на Ñервері публікації: %s" -#: replication/logical/tablesync.c:1394 +#: replication/logical/tablesync.c:1472 #, c-format msgid "replication origin \"%s\" already exists" msgstr "джерело реплікації \"%s\" вже Ñ–Ñнує" -#: replication/logical/tablesync.c:1407 +#: replication/logical/tablesync.c:1505 replication/logical/worker.c:2361 +#, c-format +msgid "user \"%s\" cannot replicate into relation with row-level security enabled: \"%s\"" +msgstr "кориÑтувач \"%s\" не може реплікувати у Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· увімкненим захиÑтом на рівні Ñ€Ñдків: \"%s\"" + +#: replication/logical/tablesync.c:1518 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "копії таблиці не вдалоÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ñ‚Ð¸ транзакцію на Ñервері публікації: %s" -#: replication/logical/worker.c:671 replication/logical/worker.c:786 +#: replication/logical/worker.c:481 #, c-format -msgid "incorrect binary data format in logical replication column %d" -msgstr "невірний формат двійкових даних в Ñтовпці логічної реплікації %d" +msgid "logical replication parallel apply worker for subscription \"%s\" will stop" +msgstr "заÑтоÑовуючий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" буде зупинено" -#: replication/logical/worker.c:1417 replication/logical/worker.c:1431 +#: replication/logical/worker.c:483 #, c-format -msgid "could not read from streaming transaction's changes file \"%s\": %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу змін потокової транзакції \"%s\": %m" +msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." +msgstr "Ðеможливо оброблÑти транзакції потокової реплікації з викориÑтаннÑм паралельних заÑтоÑовуючих працівників, доки не буде Ñинхронізовано вÑÑ– таблиці." -#: replication/logical/worker.c:1760 +#: replication/logical/worker.c:852 replication/logical/worker.c:967 +#, c-format +msgid "incorrect binary data format in logical replication column %d" +msgstr "невірний формат двійкових даних в Ñтовпці логічної реплікації %d" + +#: replication/logical/worker.c:2504 #, c-format msgid "publisher did not send replica identity column expected by the logical replication target relation \"%s.%s\"" msgstr "Ñервер публікації не передав Ñтовпець ідентифікації репліки очікуваний Ð´Ð»Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ зв'Ñзку логічної реплікації \"%s.%s\"" -#: replication/logical/worker.c:1767 +#: replication/logical/worker.c:2511 #, c-format msgid "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY index nor PRIMARY KEY and published relation does not have REPLICA IDENTITY FULL" msgstr "в цільовому зв'Ñзку логічної реплікації \"%s.%s\" немає ні індекÑу REPLICA IDENTITY, ні ключа PRIMARY KEY Ñ– публіковаий зв'Ñзок не має REPLICA IDENTITY FULL" -#: replication/logical/worker.c:2570 +#: replication/logical/worker.c:3382 #, c-format -msgid "invalid logical replication message type \"%c\"" -msgstr "неприпуÑтимий тип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації \"%c\"" +msgid "invalid logical replication message type \"??? (%d)\"" +msgstr "неприпуÑтимий тип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації \"??? (%d)\"" -#: replication/logical/worker.c:2734 +#: replication/logical/worker.c:3554 #, c-format msgid "data stream from publisher has ended" msgstr "потік даних з Ñерверу публікації завершивÑÑ" -#: replication/logical/worker.c:2885 +#: replication/logical/worker.c:3708 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу логічної реплікації через тайм-аут" -#: replication/logical/worker.c:3047 +#: replication/logical/worker.c:3902 +#, c-format +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" +msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" буде зупинено, тому, що підпиÑка була видалена" + +#: replication/logical/worker.c:3916 +#, c-format +msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" +msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" буде зупинено, тому, що підпиÑка була вимкнута" + +#: replication/logical/worker.c:3947 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was removed" -msgstr "заÑтоÑовуючий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" буде зупинено, тому, що підпиÑка була видалена" +msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" +msgstr "процеÑ, що заÑтоÑовує паралельну логічну реплікацію Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\", буде зупинено через зміну параметру" -#: replication/logical/worker.c:3058 +#: replication/logical/worker.c:3951 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will stop because the subscription was disabled" -msgstr "заÑтоÑовуючий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" буде зупинено, тому, що підпиÑка була вимкнута" +msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" +msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\", буде перезавантажено через зміну параметру" -#: replication/logical/worker.c:3084 +#: replication/logical/worker.c:3965 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will restart because of a parameter change" -msgstr "процеÑ, що заÑтоÑовує логічну реплікацію Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\", буде перезавантажено через зміну параметру" +msgid "logical replication parallel apply worker for subscription \"%s\" will stop because the subscription owner's superuser privileges have been revoked" +msgstr "логічна Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ аплікатора Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" буде зупинена, оÑкільки права ÑуперкориÑтувача влаÑника підпиÑки було відкликано" -#: replication/logical/worker.c:3208 replication/logical/worker.c:3230 +#: replication/logical/worker.c:3969 #, c-format -msgid "could not read from streaming transaction's subxact file \"%s\": %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу subxact потокової транзакції \"%s\": %m" +msgid "logical replication worker for subscription \"%s\" will restart because the subscription owner's superuser privileges have been revoked" +msgstr "працівник логічної реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" буде перезапущено, оÑкільки права ÑуперкориÑтувача влаÑника підпиÑки було відкликано" + +#: replication/logical/worker.c:4489 +#, c-format +msgid "subscription has no replication slot set" +msgstr "Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки не вÑтановлений Ñлот реплікації" -#: replication/logical/worker.c:3629 +#: replication/logical/worker.c:4602 #, c-format -msgid "logical replication apply worker for subscription %u will not start because the subscription was removed during startup" -msgstr "заÑтоÑовуючий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки %u не буде почато, тому, що підпиÑка була видалена під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку" +msgid "logical replication worker for subscription %u will not start because the subscription was removed during startup" +msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки %u не буде почато, тому, що підпиÑка була видалена під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку" -#: replication/logical/worker.c:3641 +#: replication/logical/worker.c:4618 #, c-format -msgid "logical replication apply worker for subscription \"%s\" will not start because the subscription was disabled during startup" -msgstr "заÑтоÑовуючий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" не буде почато, тому, що підпиÑка була вимкнута під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку" +msgid "logical replication worker for subscription \"%s\" will not start because the subscription was disabled during startup" +msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" не буде почато, тому, що підпиÑка була вимкнута під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку" -#: replication/logical/worker.c:3659 +#: replication/logical/worker.c:4642 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "проÑец Ñинхронізації таблиці під Ñ‡Ð°Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\", таблиці \"%s\" запущений" -#: replication/logical/worker.c:3663 +#: replication/logical/worker.c:4647 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "заÑтоÑовуючий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" запущений" -#: replication/logical/worker.c:3704 +#: replication/logical/worker.c:4769 #, c-format -msgid "subscription has no replication slot set" -msgstr "Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки не вÑтановлений Ñлот реплікації" +msgid "subscription \"%s\" has been disabled because of an error" +msgstr "підпиÑка \"%s\" була відключена через помилку" -#: replication/logical/worker.c:3791 +#: replication/logical/worker.c:4817 #, c-format -msgid "logical replication apply worker for subscription \"%s\" two_phase is %s" -msgstr "заÑтоÑовуючий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ñ— реплікації Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" two_phase Ñ” %s" +msgid "logical replication starts skipping transaction at LSN %X/%X" +msgstr "логічна Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¿Ð¾Ñ‡Ð¸Ð½Ð°Ñ” пропуÑкати транзакцію в LSN %X/%X" -#: replication/logical/worker.c:3840 +#: replication/logical/worker.c:4831 #, c-format -msgid "logical replication subscription \"%s\" has been disabled due to an error" -msgstr "логічну реплікацію підпиÑки \"%s\" було вимкнено через помилку" +msgid "logical replication completed skipping transaction at LSN %X/%X" +msgstr "логічна Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»Ð° пропуÑкати транзакцію в LSN %X/%X" -#: replication/logical/worker.c:3879 +#: replication/logical/worker.c:4913 #, c-format -msgid "start skipping logical replication transaction finished at %X/%X" -msgstr "почати пропуÑк транзакції логічної реплікації, завершеної в %X/%X" +msgid "skip-LSN of subscription \"%s\" cleared" +msgstr "очищено LSN пропуÑку підпиÑки \"%s\"" -#: replication/logical/worker.c:3893 +#: replication/logical/worker.c:4914 #, c-format -msgid "done skipping logical replication transaction finished at %X/%X" -msgstr "виконано пропуÑк транзакції логічної реплікації, завершеної в %X/%X" +msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X." +msgstr "Кінцеве Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL віддаленої транзакції (LSN) %X/%X не відповідає skip-LSN %X/%X." -#: replication/logical/worker.c:3975 +#: replication/logical/worker.c:4951 #, c-format -msgid "skip-LSN of logical replication subscription \"%s\" cleared" -msgstr "skip-LSN логічної реплікації підпиÑки \"%s\" очищено" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" +msgstr "обробка віддалених даних Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації \"%s\" під Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ \"%s\"" -#: replication/logical/worker.c:3976 +#: replication/logical/worker.c:4955 #, c-format -msgid "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN %X/%X" -msgstr "Кінцеве Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL віддаленої транзакції (LSN) %X/%X не відповідає skip-LSN %X/%X" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" +msgstr "обробка віддалених даних Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації \"%s\" під Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ \"%s\" у транзакції %u" -#: replication/logical/worker.c:4002 +#: replication/logical/worker.c:4960 #, c-format -msgid "processing remote data for replication origin \"%s\" during \"%s\"" -msgstr "обробка віддалених даних Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації \"%s\" під Ñ‡Ð°Ñ \"%s\"" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u, finished at %X/%X" +msgstr "обробку віддалених даних Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації \"%s\" під Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ \"%s\" у транзакції %u завершено о %X/%X" -#: replication/logical/worker.c:4006 +#: replication/logical/worker.c:4971 #, c-format -msgid "processing remote data for replication origin \"%s\" during \"%s\" in transaction %u" -msgstr "обробка віддалених даних Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації \"%s\" під Ñ‡Ð°Ñ \"%s\" у транзакції %u" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u" +msgstr "обробка віддалених даних Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації \"%s\" під Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ \"%s\" Ð´Ð»Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"%s.%s\" в транзакції %u" -#: replication/logical/worker.c:4011 +#: replication/logical/worker.c:4978 #, c-format -msgid "processing remote data for replication origin \"%s\" during \"%s\" in transaction %u finished at %X/%X" -msgstr "обробку віддалених даних Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації \"%s\" під Ñ‡Ð°Ñ \"%s\" у транзакції %u завершено о %X/%X" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" in transaction %u, finished at %X/%X" +msgstr "обробку віддалених даних Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації \"%s\" під Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ \"%s\" Ð´Ð»Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"%s.%s\" в транзакції %u завершено о %X/%X" -#: replication/logical/worker.c:4018 +#: replication/logical/worker.c:4989 #, c-format -msgid "processing remote data for replication origin \"%s\" during \"%s\" for replication target relation \"%s.%s\" in transaction %u finished at %X/%X" -msgstr "обробку віддалених даних Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації \"%s\" під Ñ‡Ð°Ñ \"%s\" Ð´Ð»Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"%s.%s\" в транзакції %u завершено о %X/%X" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u" +msgstr "обробка віддалених даних Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації \"%s\" під Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ \"%s\" Ð´Ð»Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"%s.%s\" Ñтовпчик \"%s\" у транзакції %u" -#: replication/logical/worker.c:4026 +#: replication/logical/worker.c:4997 #, c-format -msgid "processing remote data for replication origin \"%s\" during \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u finished at %X/%X" -msgstr "обробку віддалених даних Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації \"%s\" під Ñ‡Ð°Ñ \"%s\" Ð´Ð»Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"%s.%s\" Ñтовпчик \"%s\" у транзакції %u завершено о %X/%X" +msgid "processing remote data for replication origin \"%s\" during message type \"%s\" for replication target relation \"%s.%s\" column \"%s\" in transaction %u, finished at %X/%X" +msgstr "обробку віддалених даних Ð´Ð»Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° реплікації \"%s\" під Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ \"%s\" Ð´Ð»Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"%s.%s\" Ñтовпчик \"%s\" у транзакції %u завершено о %X/%X" -#: replication/pgoutput/pgoutput.c:319 +#: replication/pgoutput/pgoutput.c:322 #, c-format msgid "invalid proto_version" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ proto_version" -#: replication/pgoutput/pgoutput.c:324 +#: replication/pgoutput/pgoutput.c:327 #, c-format msgid "proto_version \"%s\" out of range" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ proto_version \"%s\" за межами діапазону" -#: replication/pgoutput/pgoutput.c:341 +#: replication/pgoutput/pgoutput.c:344 #, c-format msgid "invalid publication_names syntax" msgstr "неприпуÑтимий ÑинтакÑÐ¸Ñ publication_names" -#: replication/pgoutput/pgoutput.c:425 +#: replication/pgoutput/pgoutput.c:414 replication/pgoutput/pgoutput.c:418 #, c-format -msgid "client sent proto_version=%d but we only support protocol %d or lower" -msgstr "клієнт передав proto_version=%d, але ми підтримуємо лише протокол %d або нижче" +msgid "option \"%s\" missing" +msgstr "параметр \"%s\" відÑутній" -#: replication/pgoutput/pgoutput.c:431 +#: replication/pgoutput/pgoutput.c:478 #, c-format -msgid "client sent proto_version=%d but we only support protocol %d or higher" -msgstr "клієнт передав proto_version=%d, але ми підтримуємо лише протокол %d або вище" +msgid "client sent proto_version=%d but server only supports protocol %d or lower" +msgstr "клієнт передав proto_version=%d, але Ñервер підтримує лише протокол %d або нижче" -#: replication/pgoutput/pgoutput.c:437 +#: replication/pgoutput/pgoutput.c:484 #, c-format -msgid "publication_names parameter missing" -msgstr "пропущено параметр publication_names" +msgid "client sent proto_version=%d but server only supports protocol %d or higher" +msgstr "клієнт передав proto_version=%d, але Ñервер підтримує лише протокол %d або вище" -#: replication/pgoutput/pgoutput.c:450 +#: replication/pgoutput/pgoutput.c:499 #, c-format msgid "requested proto_version=%d does not support streaming, need %d or higher" msgstr "запитувана proto_version=%d не підтримує потокову передачу, потребуєтьÑÑ %d або вища" -#: replication/pgoutput/pgoutput.c:455 +#: replication/pgoutput/pgoutput.c:505 +#, c-format +msgid "requested proto_version=%d does not support parallel streaming, need %d or higher" +msgstr "запитувана proto_version=%d не підтримує паралельний потік, потрібно %d або вище" + +#: replication/pgoutput/pgoutput.c:510 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "запитане потокова передавача, але не підтримуєтьÑÑ Ð¿Ð»Ð°Ð³Ñ–Ð½Ð¾Ð¼ виводу" -#: replication/pgoutput/pgoutput.c:472 +#: replication/pgoutput/pgoutput.c:524 #, c-format msgid "requested proto_version=%d does not support two-phase commit, need %d or higher" msgstr "запитувана proto_version=%d не підтримує двоетапне затвердженнÑ, потрібна %d або вища" -#: replication/pgoutput/pgoutput.c:477 +#: replication/pgoutput/pgoutput.c:529 #, c-format msgid "two-phase commit requested, but not supported by output plugin" msgstr "запитано двоетапне затвердженнÑ, але не підтримуєтьÑÑ Ð¿Ð»Ð°Ð³Ñ–Ð½Ð¾Ð¼ виводу" -#: replication/slot.c:205 +#: replication/slot.c:260 #, c-format msgid "replication slot name \"%s\" is too short" msgstr "ім'Ñ Ñлоту реплікації \"%s\" занадто коротке" -#: replication/slot.c:214 +#: replication/slot.c:269 #, c-format msgid "replication slot name \"%s\" is too long" msgstr "ім'Ñ Ñлоту реплікації \"%s\" занадто довге" -#: replication/slot.c:227 +#: replication/slot.c:282 #, c-format msgid "replication slot name \"%s\" contains invalid character" msgstr "ім'Ñ Ñлоту реплікації \"%s\" міÑтить неприпуÑтимий Ñимвол" -#: replication/slot.c:229 +#: replication/slot.c:284 #, c-format msgid "Replication slot names may only contain lower case letters, numbers, and the underscore character." msgstr "Імена Ñлота реплікації можуть міÑтити лише букви в нижньому кейÑÑ–, чиÑла, Ñ– Ñимвол підкреÑленнÑ." -#: replication/slot.c:283 +#: replication/slot.c:333 +#, c-format +msgid "cannot enable failover for a replication slot created on the standby" +msgstr "не вдаєтьÑÑ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÑƒÑ‚Ð¸ відмовоÑтійкіÑть Ð´Ð»Ñ Ñлота реплікації, Ñтвореного в режимі очікуваннÑ" + +#: replication/slot.c:345 replication/slot.c:849 +#, c-format +msgid "cannot enable failover for a temporary replication slot" +msgstr "не вдаєтьÑÑ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÑƒÑ‚Ð¸ відмовоÑтійкіÑть Ð´Ð»Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñового Ñлота реплікації" + +#: replication/slot.c:370 #, c-format msgid "replication slot \"%s\" already exists" msgstr "Ñлот реплікації \"%s\" вже Ñ–Ñнує" -#: replication/slot.c:293 +#: replication/slot.c:380 #, c-format msgid "all replication slots are in use" msgstr "викориÑтовуютьÑÑ Ð²ÑÑ– Ñлоти реплікації" -#: replication/slot.c:294 +#: replication/slot.c:381 #, c-format -msgid "Free one or increase max_replication_slots." -msgstr "Звільніть непотрібні або збільшіть max_replication_slots." +msgid "Free one or increase \"max_replication_slots\"." +msgstr "Звільніть непотрібні або збільшіть \"max_replication_slots\"." -#: replication/slot.c:444 replication/slotfuncs.c:727 -#: utils/activity/pgstat_replslot.c:55 utils/adt/genfile.c:704 +#: replication/slot.c:560 replication/slot.c:2467 replication/slotfuncs.c:661 +#: utils/activity/pgstat_replslot.c:56 utils/adt/genfile.c:728 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "Ñлот реплікації \"%s\" не Ñ–Ñнує" -#: replication/slot.c:490 replication/slot.c:1058 +#: replication/slot.c:606 replication/slot.c:1337 #, c-format msgid "replication slot \"%s\" is active for PID %d" msgstr "Ñлот реплікації \"%s\" активний Ð´Ð»Ñ PID %d" -#: replication/slot.c:726 replication/slot.c:1464 replication/slot.c:1847 +#: replication/slot.c:638 +#, c-format +msgid "acquired logical replication slot \"%s\"" +msgstr "придбано Ñлот логічної реплікації \"%s\"" + +#: replication/slot.c:640 +#, c-format +msgid "acquired physical replication slot \"%s\"" +msgstr "придбано фізичний Ñлот реплікації \"%s\"" + +#: replication/slot.c:729 +#, c-format +msgid "released logical replication slot \"%s\"" +msgstr "звільнено Ñлот логічної реплікації \"%s\"" + +#: replication/slot.c:731 +#, c-format +msgid "released physical replication slot \"%s\"" +msgstr "звільнено фізичний Ñлот реплікації \"%s\"" + +#: replication/slot.c:797 +#, c-format +msgid "cannot drop replication slot \"%s\"" +msgstr "не може Ñкинути Ñлот реплікації \"%s\"" + +#: replication/slot.c:816 +#, c-format +msgid "cannot use %s with a physical replication slot" +msgstr "не може викориÑтовувати %s з фізичним Ñлотом реплікації" + +#: replication/slot.c:828 +#, c-format +msgid "cannot alter replication slot \"%s\"" +msgstr "не може змінювати Ñлот реплікації \"%s\"" + +#: replication/slot.c:838 +#, c-format +msgid "cannot enable failover for a replication slot on the standby" +msgstr "не вдаєтьÑÑ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÑƒÑ‚Ð¸ обхід відмови Ð´Ð»Ñ Ñлота реплікації в режимі очікуваннÑ" + +#: replication/slot.c:969 replication/slot.c:1927 replication/slot.c:2311 #, c-format msgid "could not remove directory \"%s\"" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ каталог \"%s\"" -#: replication/slot.c:1093 +#: replication/slot.c:1372 #, c-format -msgid "replication slots can only be used if max_replication_slots > 0" -msgstr "Ñлоти реплікації можна викориÑтовувати лише Ñкщо max_replication_slots > 0" +msgid "replication slots can only be used if \"max_replication_slots\" > 0" +msgstr "Ñлоти реплікації можна викориÑтовувати лише Ñкщо \"max_replication_slots\" > 0" -#: replication/slot.c:1098 +#: replication/slot.c:1377 #, c-format -msgid "replication slots can only be used if wal_level >= replica" -msgstr "Ñлоти реплікації можна викориÑтовувати лише Ñкщо wal_level >= replica" +msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" +msgstr "Ñлоти реплікації можна викориÑтовувати лише Ñкщо \"wal_level\" >= \"replica\"" -#: replication/slot.c:1110 +#: replication/slot.c:1389 #, c-format -msgid "must be superuser or replication role to use replication slots" -msgstr "має бути право ÑуперкориÑтувача або реплікації Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ð¹Ð½Ð¸Ñ… Ñлотів" +msgid "permission denied to use replication slots" +msgstr "немає дозволу Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñлотів реплікації" -#: replication/slot.c:1295 +#: replication/slot.c:1390 +#, c-format +msgid "Only roles with the %s attribute may use replication slots." +msgstr "Тільки ролі з атрибутом %s можуть викориÑтовувати Ñлоти реплікації." + +#: replication/slot.c:1498 +#, c-format +msgid "The slot's restart_lsn %X/%X exceeds the limit by %llu byte." +msgid_plural "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes." +msgstr[0] "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ restart_lsn Ñлота %X/%X перевищує ліміт на %llu байт." +msgstr[1] "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ restart_lsn Ñлота %X/%X перевищує ліміт на %llu байта." +msgstr[2] "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ restart_lsn Ñлота %X/%X перевищує ліміт на %llu байтів." +msgstr[3] "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ restart_lsn Ñлота %X/%X перевищує ліміт на %llu байтів." + +#: replication/slot.c:1506 +#, c-format +msgid "The slot conflicted with xid horizon %u." +msgstr "Слот конфліктував з горизонтом xid %u." + +#: replication/slot.c:1511 +msgid "Logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary server." +msgstr "Логічне Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° резервному Ñервері вимагає \"wal_level\" >= \"logical\" на оÑновному Ñервері." + +#: replication/slot.c:1519 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу %d Ð´Ð»Ñ Ð·Ð²Ñ–Ð»ÑŒÐ½ÐµÐ½Ð½Ñ Ñлоту реплікації \"%s\"" -#: replication/slot.c:1333 +#: replication/slot.c:1521 #, c-format -msgid "invalidating slot \"%s\" because its restart_lsn %X/%X exceeds max_slot_wal_keep_size" -msgstr "Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð½Ñ Ñлоту \"%s\" тому, що його restart_lsn %X/%X перевищує max_slot_wal_keep_size" +msgid "invalidating obsolete replication slot \"%s\"" +msgstr "Ð°Ð½ÑƒÐ»ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ñтарілого Ñлоту реплікації \"%s\"" -#: replication/slot.c:1785 +#: replication/slot.c:2249 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "файл Ñлоту реплікації \"%s\" має неправильне магічне чиÑло: %u заміÑть %u" -#: replication/slot.c:1792 +#: replication/slot.c:2256 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "файл Ñлоту реплікації \"%s\" має непідтримуючу верÑÑ–ÑŽ %u" -#: replication/slot.c:1799 +#: replication/slot.c:2263 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "файл Ñлоту реплікації \"%s\" має пошкоджену довжину %u" -#: replication/slot.c:1835 +#: replication/slot.c:2299 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "у файлі Ñлоту реплікації \"%s\" невідповідніÑть контрольної Ñуми: %u, повинно бути %u" -#: replication/slot.c:1869 +#: replication/slot.c:2335 #, c-format -msgid "logical replication slot \"%s\" exists, but wal_level < logical" -msgstr "Ñлот логічної реплікації \"%s\" Ñ–Ñнує, але wal_level < logical" +msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" +msgstr "Ñлот логічної реплікації \"%s\" Ñ–Ñнує, але \"wal_level\" < \"logical\"" -#: replication/slot.c:1871 +#: replication/slot.c:2337 #, c-format -msgid "Change wal_level to be logical or higher." -msgstr "Змініть wal_level на logical або вище." +msgid "Change \"wal_level\" to be \"logical\" or higher." +msgstr "Змініть \"wal_level\" на \"logical\" або вище." -#: replication/slot.c:1875 +#: replication/slot.c:2349 #, c-format -msgid "physical replication slot \"%s\" exists, but wal_level < replica" -msgstr "Ñлот фізичної реплікації \"%s\" Ñ–Ñнує, але wal_level < replica" +msgid "logical replication slot \"%s\" exists on the standby, but \"hot_standby\" = \"off\"" +msgstr "Ñлот логічної реплікації \"%s\" Ñ–Ñнує на резервному Ñервері, але hot_standby = off\"" -#: replication/slot.c:1877 +#: replication/slot.c:2351 #, c-format -msgid "Change wal_level to be replica or higher." -msgstr "Змініть wal_level на replica або вище." +msgid "Change \"hot_standby\" to be \"on\"." +msgstr "Змінити \"hot_standby\" у Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"on\"." -#: replication/slot.c:1911 +#: replication/slot.c:2356 +#, c-format +msgid "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" +msgstr "Ñлот фізичної реплікації \"%s\" Ñ–Ñнує, але \"wal_level\" < \"replica\"" + +#: replication/slot.c:2358 +#, c-format +msgid "Change \"wal_level\" to be \"replica\" or higher." +msgstr "Змініть \"wal_level\" на \"replica\" або вище." + +#: replication/slot.c:2400 #, c-format msgid "too many replication slots active before shutdown" msgstr "перед завершеннÑм роботи активно занадто багато Ñлотів реплікації" -#: replication/slotfuncs.c:592 +#: replication/slot.c:2475 +#, c-format +msgid "\"%s\" is not a physical replication slot" +msgstr "\"%s\" не Ñ” фізичним Ñлотом реплікації" + +#: replication/slot.c:2654 +#, c-format +msgid "replication slot \"%s\" specified in parameter \"%s\" does not exist" +msgstr "Ñлот реплікації \"%s\", вказаний в параметрі \"%s\", не Ñ–Ñнує" + +#: replication/slot.c:2656 replication/slot.c:2690 replication/slot.c:2705 +#, c-format +msgid "Logical replication is waiting on the standby associated with replication slot \"%s\"." +msgstr "Логічна Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ‡ÐµÐºÐ°Ñ” на Ñлоті реплікації, що пов'Ñзана з Ñлотом реплікації \"%s\"." + +#: replication/slot.c:2658 +#, c-format +msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." +msgstr "Створіть Ñлот реплікації \"%s\" або змініть параметр \"%s\"." + +#: replication/slot.c:2668 +#, c-format +msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" +msgstr "неможливо вказати Ñлот логічної реплікації \"%s\" в параметрі \"%s\"" + +#: replication/slot.c:2670 +#, c-format +msgid "Logical replication is waiting for correction on replication slot \"%s\"." +msgstr "Логічна Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð¾Ñ‡Ñ–ÐºÑƒÑ” на корекцію на Ñлоті реплікації \"%s\"." + +#: replication/slot.c:2672 +#, c-format +msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." +msgstr "Приберіть Ñлот логічної реплікації \"%s\" з параметру \"%s\"." + +#: replication/slot.c:2688 +#, c-format +msgid "physical replication slot \"%s\" specified in parameter \"%s\" has been invalidated" +msgstr "Ñлот фізичної реплікації \"%s\" вказаний у параметрі \"%s\" було анульовано" + +#: replication/slot.c:2692 +#, c-format +msgid "Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." +msgstr "Видаліть Ñ– повторно Ñтворіть Ñлот реплікації \"%s\" або змініть параметр \"%s\"." + +#: replication/slot.c:2703 +#, c-format +msgid "replication slot \"%s\" specified in parameter \"%s\" does not have active_pid" +msgstr "Ñлот реплікації \"%s\", вказаний в параметрі \"%s\", не має active_pid" + +#: replication/slot.c:2707 +#, c-format +msgid "Start the standby associated with the replication slot \"%s\", or amend parameter \"%s\"." +msgstr "ЗапуÑтіть резервний Ñервер аÑоційований зі Ñлотом реплікації \"%s\" або змініть параметр \"%s\"." + +#: replication/slotfuncs.c:526 #, c-format msgid "invalid target WAL LSN" msgstr "неприпуÑтима ціль WAL LSN" -#: replication/slotfuncs.c:614 +#: replication/slotfuncs.c:548 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "Ñлот реплікації \"%s\" не може бути розширеним" -#: replication/slotfuncs.c:632 +#: replication/slotfuncs.c:550 +#, c-format +msgid "This slot has never previously reserved WAL, or it has been invalidated." +msgstr "Цей Ñлот ніколи раніше не резервував WAL, або він був недійÑним." + +#: replication/slotfuncs.c:566 #, c-format msgid "cannot advance replication slot to %X/%X, minimum is %X/%X" msgstr "проÑунути Ñлот реплікації до позиції %X/%X не можна, мінімальна Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ %X/%X" -#: replication/slotfuncs.c:739 +#: replication/slotfuncs.c:673 #, c-format msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "не можна Ñкопіювати Ñлот фізичної реплікації \"%s\" Ñк Ñлот логічної реплікації" -#: replication/slotfuncs.c:741 +#: replication/slotfuncs.c:675 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "не можна Ñкопіювати Ñлот логічної реплікації \"%s\" Ñк Ñлот фізичної реплікації" -#: replication/slotfuncs.c:748 +#: replication/slotfuncs.c:682 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "не можна Ñкопіювати Ñлот реплікації, Ñкий не резервує WAL" -#: replication/slotfuncs.c:825 +#: replication/slotfuncs.c:773 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "не вдалоÑÑ Ñкопіювати Ñлот реплікації \"%s\"" -#: replication/slotfuncs.c:827 +#: replication/slotfuncs.c:775 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "Слот реплікації джерела був змінений неÑуміÑно під Ñ‡Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— копіюваннÑ." -#: replication/slotfuncs.c:833 +#: replication/slotfuncs.c:781 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "не можна Ñкопіювати незавершений Ñлот логічної реплікації \"%s\"" -#: replication/slotfuncs.c:835 +#: replication/slotfuncs.c:783 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "Повторіть, коли confirmed_flush_lsn Ñлоту джерела реплікації Ñ” дійÑним." -#: replication/syncrep.c:268 +#: replication/slotfuncs.c:882 +#, c-format +msgid "replication slots can only be synchronized to a standby server" +msgstr "Ñлоти реплікації можна Ñинхронізувати лише з резервним Ñервером" + +#: replication/syncrep.c:261 #, c-format msgid "canceling the wait for synchronous replication and terminating connection due to administrator command" msgstr "ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронної реплікації Ñ– Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ð¾ команді адмініÑтратора" -#: replication/syncrep.c:269 replication/syncrep.c:286 +#: replication/syncrep.c:262 replication/syncrep.c:279 #, c-format msgid "The transaction has already committed locally, but might not have been replicated to the standby." msgstr "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð²Ð¶Ðµ була затверджена локально, але можливо не була реплікована до режиму очікуваннÑ." -#: replication/syncrep.c:285 +#: replication/syncrep.c:278 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñинхронної реплікації по запиту кориÑтувача" -#: replication/syncrep.c:494 +#: replication/syncrep.c:485 #, c-format -msgid "standby \"%s\" is now a synchronous standby with priority %u" -msgstr "режим Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" зараз Ñ” Ñинхронним з пріоритетом %u" +msgid "standby \"%s\" is now a synchronous standby with priority %d" +msgstr "Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" тепер Ñ” Ñинхронним очікуваннÑм з пріоритетом %d" -#: replication/syncrep.c:498 +#: replication/syncrep.c:489 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "режим Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" зараз Ñ” кандидатом Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð² кворум Ñинхронних" -#: replication/syncrep.c:1045 +#: replication/syncrep.c:1013 #, c-format -msgid "synchronous_standby_names parser failed" -msgstr "помилка при аналізуванні synchronous_standby_names" +msgid "\"synchronous_standby_names\" parser failed" +msgstr "помилка при аналізуванні \"synchronous_standby_names\"" -#: replication/syncrep.c:1051 +#: replication/syncrep.c:1019 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "кількіÑть Ñинхронних режимів Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ (%d) повинно бути більше нулÑ" -#: replication/walreceiver.c:164 +#: replication/walreceiver.c:176 #, c-format msgid "terminating walreceiver process due to administrator command" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу walreceiver по команді адмініÑтратора" -#: replication/walreceiver.c:292 -#, c-format -msgid "could not connect to the primary server: %s" -msgstr "не вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ оÑновного Ñерверу: %s" - -#: replication/walreceiver.c:339 +#: replication/walreceiver.c:354 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "ідентифікатор ÑиÑтеми бази даних на оÑновному Ñ– резервному Ñерверах відрізнÑютьÑÑ" -#: replication/walreceiver.c:340 +#: replication/walreceiver.c:355 #, c-format msgid "The primary's identifier is %s, the standby's identifier is %s." msgstr "Ідентифікатор на оÑновному Ñервері %s, на резервному %s." -#: replication/walreceiver.c:351 +#: replication/walreceiver.c:366 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "оÑÑ‚Ð°Ð½Ð½Ñ Ñ‡Ð°Ñова шкала %u на оÑновному Ñервері відÑтає від відновлюючої чаÑової шкали %u" -#: replication/walreceiver.c:404 +#: replication/walreceiver.c:419 #, c-format msgid "started streaming WAL from primary at %X/%X on timeline %u" msgstr "запущено потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ WAL з оÑновного Ñерверу з позиції %X/%X на чаÑовій шкалі %u" -#: replication/walreceiver.c:408 +#: replication/walreceiver.c:423 #, c-format msgid "restarted WAL streaming at %X/%X on timeline %u" msgstr "перезапуÑка потокового Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ WAL з позиції %X/%X на чаÑовій шкалі %u" -#: replication/walreceiver.c:437 +#: replication/walreceiver.c:458 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "продовжити потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ WAL не можна, Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð¶Ðµ завершено" -#: replication/walreceiver.c:475 +#: replication/walreceiver.c:502 #, c-format msgid "replication terminated by primary server" msgstr "Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð° оÑновним Ñервером" -#: replication/walreceiver.c:476 +#: replication/walreceiver.c:503 #, c-format msgid "End of WAL reached on timeline %u at %X/%X." msgstr "Ðа чаÑовій шкалі %u в позиції %X/%X WAL доÑÑг кінцÑ." -#: replication/walreceiver.c:565 +#: replication/walreceiver.c:593 #, c-format msgid "terminating walreceiver due to timeout" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу walreceiver через тайм-аут" -#: replication/walreceiver.c:603 +#: replication/walreceiver.c:625 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "оÑновний Ñервер більше не міÑтить WAL Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ð°Ð½Ð¾Ñ— чаÑової шкали %u" -#: replication/walreceiver.c:619 replication/walreceiver.c:1045 +#: replication/walreceiver.c:641 replication/walreceiver.c:1071 #, c-format -msgid "could not close log segment %s: %m" -msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ Ñегмент журналу %s: %m" +msgid "could not close WAL segment %s: %m" +msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ Ñегмент WAL %s: %m" -#: replication/walreceiver.c:738 +#: replication/walreceiver.c:760 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ñ–Ñторії чаÑової шкали Ð´Ð»Ñ Ñ‡Ð°Ñової шкали %u з оÑновного Ñерверу" -#: replication/walreceiver.c:933 +#: replication/walreceiver.c:959 #, c-format -msgid "could not write to log segment %s at offset %u, length %lu: %m" -msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати в Ñегмент журналу %s зÑув %u, довжина %lu: %m" +msgid "could not write to WAL segment %s at offset %d, length %lu: %m" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати у Ñегмент WAL %s зі зміщеннÑм %d, довжиною %lu: %m" -#: replication/walsender.c:521 +#: replication/walsender.c:531 #, c-format -msgid "cannot use \"%s\" with logical replication slot \"%s\"" -msgstr "викориÑтовувати \"%s\" зі Ñлотом логічної реплікації \"%s\", не можна" +msgid "cannot use %s with a logical replication slot" +msgstr "викориÑтовувати %s зі Ñлотом логічної реплікації не можна" -#: replication/walsender.c:639 storage/smgr/md.c:1350 +#: replication/walsender.c:635 storage/smgr/md.c:1735 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "не вдалоÑÑ Ð´Ð¾ÑÑгти ÐºÑ–Ð½Ñ†Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" -#: replication/walsender.c:643 +#: replication/walsender.c:639 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ початок файлу \"%s\": %m" -#: replication/walsender.c:720 +#: replication/walsender.c:853 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "викориÑтовувати логічний Ñлот реплікації Ð´Ð»Ñ Ñ„Ñ–Ð·Ð¸Ñ‡Ð½Ð¾Ñ— реплікації, не можна" -#: replication/walsender.c:786 +#: replication/walsender.c:919 #, c-format msgid "requested starting point %X/%X on timeline %u is not in this server's history" msgstr "в Ñ–Ñторії Ñерверу немає запитаної початкової точки %X/%X на чаÑовій шкалі %u" -#: replication/walsender.c:789 +#: replication/walsender.c:922 #, c-format msgid "This server's history forked from timeline %u at %X/%X." msgstr "ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Ñерверу відгалузилаÑÑŒ від чаÑової шкали %u в позиції %X/%X." -#: replication/walsender.c:833 +#: replication/walsender.c:966 #, c-format msgid "requested starting point %X/%X is ahead of the WAL flush position of this server %X/%X" msgstr "запитана початкова точка %X/%X попереду Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð¸Ñ… даних WAL на цьому Ñервері %X/%X" -#: replication/walsender.c:1016 +#: replication/walsender.c:1160 #, c-format msgid "unrecognized value for CREATE_REPLICATION_SLOT option \"%s\": \"%s\"" msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ CREATE_REPLICATION_SLOT \"%s\": \"%s\"" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1101 +#: replication/walsender.c:1266 #, c-format msgid "%s must not be called inside a transaction" msgstr "%s не має викликатиÑÑ Ð²Ñередині транзакції" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1111 +#: replication/walsender.c:1276 #, c-format msgid "%s must be called inside a transaction" msgstr "%s має викликатиÑÑ Ð²Ñередині транзакції" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1117 +#: replication/walsender.c:1282 #, c-format msgid "%s must be called in REPEATABLE READ isolation mode transaction" msgstr "%s повинен бути викликаний в режимі ізолÑції REPEATABLE READ" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1123 +#: replication/walsender.c:1287 #, c-format -msgid "%s must be called before any query" -msgstr "%s має викликатиÑÑ Ð´Ð¾ будь-Ñкого запиту" +msgid "%s must be called in a read-only transaction" +msgstr "%s має викликатиÑÑ Ð² транзакції \"лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\"" #. translator: %s is a CREATE_REPLICATION_SLOT statement -#: replication/walsender.c:1129 +#: replication/walsender.c:1293 #, c-format -msgid "%s must not be called in a subtransaction" -msgstr "%s не має викликатиÑÑ Ð²Ñередині підтранзакції" - -#: replication/walsender.c:1272 -#, c-format -msgid "cannot read from logical replication slot \"%s\"" -msgstr "не можна прочитати із Ñлоту логічної реплікації \"%s\"" +msgid "%s must be called before any query" +msgstr "%s має викликатиÑÑ Ð´Ð¾ будь-Ñкого запиту" -#: replication/walsender.c:1274 +#. translator: %s is a CREATE_REPLICATION_SLOT statement +#: replication/walsender.c:1299 #, c-format -msgid "This slot has been invalidated because it exceeded the maximum reserved size." -msgstr "Цей Ñлот визнано недійÑним, тому що він перевищив макÑимально зарезервований розмір." +msgid "%s must not be called in a subtransaction" +msgstr "%s не має викликатиÑÑ Ð²Ñередині підтранзакції" -#: replication/walsender.c:1284 +#: replication/walsender.c:1472 #, c-format msgid "terminating walsender process after promotion" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу walsender піÑÐ»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ" -#: replication/walsender.c:1705 +#: replication/walsender.c:2000 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "не можна виконувати нові команди, поки Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸ WAL знаходитьÑÑ Ð² режимі зупинки" -#: replication/walsender.c:1740 +#: replication/walsender.c:2035 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "не можна виконувати команди SQL в процеÑÑ– відправки WAL Ð´Ð»Ñ Ñ„Ñ–Ð·Ð¸Ñ‡Ð½Ð¾Ñ— реплікації" -#: replication/walsender.c:1773 +#: replication/walsender.c:2068 #, c-format msgid "received replication command: %s" msgstr "отримано команду реплікації: %s" -#: replication/walsender.c:1781 tcop/fastpath.c:208 tcop/postgres.c:1114 -#: tcop/postgres.c:1472 tcop/postgres.c:1712 tcop/postgres.c:2181 -#: tcop/postgres.c:2602 tcop/postgres.c:2680 +#: replication/walsender.c:2076 tcop/fastpath.c:209 tcop/postgres.c:1142 +#: tcop/postgres.c:1500 tcop/postgres.c:1752 tcop/postgres.c:2234 +#: tcop/postgres.c:2672 tcop/postgres.c:2749 #, c-format msgid "current transaction is aborted, commands ignored until end of transaction block" msgstr "поточна Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð°, команди до ÐºÑ–Ð½Ñ†Ñ Ð±Ð»Ð¾ÐºÐ° транзакції пропуÑкаютьÑÑ" -#: replication/walsender.c:1923 replication/walsender.c:1958 +#: replication/walsender.c:2233 replication/walsender.c:2268 #, c-format msgid "unexpected EOF on standby connection" msgstr "неочікуваний обрив з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· резервним Ñервером" -#: replication/walsender.c:1946 +#: replication/walsender.c:2256 #, c-format msgid "invalid standby message type \"%c\"" msgstr "неприпуÑтимий тип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ Ñерверу \"%c\"" -#: replication/walsender.c:2035 +#: replication/walsender.c:2345 #, c-format msgid "unexpected message type \"%c\"" msgstr "неочікуваний тип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ \"%c\"" -#: replication/walsender.c:2448 +#: replication/walsender.c:2759 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу walsender через тайм-аут реплікації" -#: rewrite/rewriteDefine.c:112 rewrite/rewriteDefine.c:1001 +#: rewrite/rewriteDefine.c:104 rewrite/rewriteDefine.c:835 #, c-format msgid "rule \"%s\" for relation \"%s\" already exists" msgstr "правило \"%s\" Ð´Ð»Ñ Ð·Ð²'Ñзка \"%s\" вже Ñ–Ñнує" -#: rewrite/rewriteDefine.c:271 rewrite/rewriteDefine.c:939 +#: rewrite/rewriteDefine.c:261 rewrite/rewriteDefine.c:773 #, c-format msgid "relation \"%s\" cannot have rules" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не може мати правил" -#: rewrite/rewriteDefine.c:302 +#: rewrite/rewriteDefine.c:292 #, c-format msgid "rule actions on OLD are not implemented" msgstr "дії правил Ð´Ð»Ñ OLD не реалізовані" -#: rewrite/rewriteDefine.c:303 +#: rewrite/rewriteDefine.c:293 #, c-format msgid "Use views or triggers instead." msgstr "ВикориÑтайте Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ тригери заміÑть." -#: rewrite/rewriteDefine.c:307 +#: rewrite/rewriteDefine.c:297 #, c-format msgid "rule actions on NEW are not implemented" msgstr "дії правил Ð´Ð»Ñ NEW не реалізовані" -#: rewrite/rewriteDefine.c:308 +#: rewrite/rewriteDefine.c:298 #, c-format msgid "Use triggers instead." msgstr "ВикориÑтайте тригери заміÑть." -#: rewrite/rewriteDefine.c:321 +#: rewrite/rewriteDefine.c:312 +#, c-format +msgid "relation \"%s\" cannot have ON SELECT rules" +msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не може мати правил ON SELECT" + +#: rewrite/rewriteDefine.c:322 #, c-format msgid "INSTEAD NOTHING rules on SELECT are not implemented" msgstr "Правила INSTEAD NOTHING Ð´Ð»Ñ SELECT не реалізовані" -#: rewrite/rewriteDefine.c:322 +#: rewrite/rewriteDefine.c:323 #, c-format msgid "Use views instead." msgstr "ВикориÑтайте Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ñ–Ñть." -#: rewrite/rewriteDefine.c:330 +#: rewrite/rewriteDefine.c:331 #, c-format msgid "multiple actions for rules on SELECT are not implemented" msgstr "декілька дій в правилах Ð´Ð»Ñ SELECT не реалізовані" -#: rewrite/rewriteDefine.c:340 +#: rewrite/rewriteDefine.c:341 #, c-format msgid "rules on SELECT must have action INSTEAD SELECT" msgstr "правила Ð´Ð»Ñ SELECT повинні мати дію INSTEAD SELECT" -#: rewrite/rewriteDefine.c:348 +#: rewrite/rewriteDefine.c:349 #, c-format msgid "rules on SELECT must not contain data-modifying statements in WITH" msgstr "правила Ð´Ð»Ñ SELECT не повинні міÑтити операторів, Ñкі змінюють дані в WITH" -#: rewrite/rewriteDefine.c:356 +#: rewrite/rewriteDefine.c:357 #, c-format msgid "event qualifications are not implemented for rules on SELECT" msgstr "в правилах Ð´Ð»Ñ SELECT не може бути умов" -#: rewrite/rewriteDefine.c:383 +#: rewrite/rewriteDefine.c:384 #, c-format msgid "\"%s\" is already a view" msgstr "\"%s\" вже Ñ” поданнÑм" -#: rewrite/rewriteDefine.c:407 +#: rewrite/rewriteDefine.c:408 #, c-format msgid "view rule for \"%s\" must be named \"%s\"" msgstr "правило Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð»Ñ \"%s\" повинно називатиÑÑ \"%s\"" -#: rewrite/rewriteDefine.c:436 -#, c-format -msgid "cannot convert partitioned table \"%s\" to a view" -msgstr "перетворити Ñекціоновану таблицю \"%s\" на поданнÑ, не можна" - -#: rewrite/rewriteDefine.c:445 -#, c-format -msgid "cannot convert partition \"%s\" to a view" -msgstr "перетворити Ñекцію \"%s\" на поданнÑ, не можна" - -#: rewrite/rewriteDefine.c:454 -#, c-format -msgid "could not convert table \"%s\" to a view because it is not empty" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ таблицю \"%s\" на поданнÑ, тому, що вона не пуÑта" - -#: rewrite/rewriteDefine.c:463 -#, c-format -msgid "could not convert table \"%s\" to a view because it has triggers" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ таблицю \"%s\" на поданнÑ, тому, що вона має тригери" - -#: rewrite/rewriteDefine.c:465 -#, c-format -msgid "In particular, the table cannot be involved in any foreign key relationships." -msgstr "Крім того, Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð½Ðµ може бути включена в зв'Ñзок зовнішніх ключів." - -#: rewrite/rewriteDefine.c:470 -#, c-format -msgid "could not convert table \"%s\" to a view because it has indexes" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ таблицю \"%s\" на поданнÑ, тому, що вона має індекÑи" - -#: rewrite/rewriteDefine.c:476 -#, c-format -msgid "could not convert table \"%s\" to a view because it has child tables" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ таблицю \"%s\" на поданнÑ, тому, що вона має дочірні таблиці" - -#: rewrite/rewriteDefine.c:482 -#, c-format -msgid "could not convert table \"%s\" to a view because it has parent tables" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ таблицю \"%s\" на поданнÑ, тому, що вона має батьківÑькі таблиці" - -#: rewrite/rewriteDefine.c:488 -#, c-format -msgid "could not convert table \"%s\" to a view because it has row security enabled" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ таблицю \"%s\" на поданнÑ, тому, що Ð´Ð»Ñ Ð½ÐµÑ— активований захиÑÑ‚ на рівні Ñ€Ñдків" - -#: rewrite/rewriteDefine.c:494 -#, c-format -msgid "could not convert table \"%s\" to a view because it has row security policies" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ таблицю \"%s\" на поданнÑ, тому, що вона має політику захиÑту Ñ€Ñдків" - -#: rewrite/rewriteDefine.c:521 +#: rewrite/rewriteDefine.c:435 #, c-format msgid "cannot have multiple RETURNING lists in a rule" msgstr "правило не може мати декілька ÑпиÑків RETURNING" -#: rewrite/rewriteDefine.c:526 +#: rewrite/rewriteDefine.c:440 #, c-format msgid "RETURNING lists are not supported in conditional rules" msgstr "Умовні правила не підтримують ÑпиÑки RETURNING" -#: rewrite/rewriteDefine.c:530 +#: rewrite/rewriteDefine.c:444 #, c-format msgid "RETURNING lists are not supported in non-INSTEAD rules" msgstr "Правила non-INSTEAD не підтримують ÑпиÑки RETURNING" -#: rewrite/rewriteDefine.c:694 +#: rewrite/rewriteDefine.c:458 +#, c-format +msgid "non-view rule for \"%s\" must not be named \"%s\"" +msgstr "правило не-Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð»Ñ \"%s\" не повинно мати назву \"%s\"" + +#: rewrite/rewriteDefine.c:532 #, c-format msgid "SELECT rule's target list has too many entries" msgstr "СпиÑок цілей правила Ð´Ð»Ñ SELECT має занадто багато елементів" -#: rewrite/rewriteDefine.c:695 +#: rewrite/rewriteDefine.c:533 #, c-format msgid "RETURNING list has too many entries" msgstr "СпиÑок RETURNING має занадто багато елементів" -#: rewrite/rewriteDefine.c:722 +#: rewrite/rewriteDefine.c:560 #, c-format msgid "cannot convert relation containing dropped columns to view" msgstr "перетворити зв'Ñзок, Ñкий міÑтить видаленні Ñтовпці, на Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð½Ðµ можна" -#: rewrite/rewriteDefine.c:723 +#: rewrite/rewriteDefine.c:561 #, c-format msgid "cannot create a RETURNING list for a relation containing dropped columns" msgstr "Ñтворити ÑпиÑок RETURNING Ð´Ð»Ñ Ð·Ð²'Ñзка, Ñкий міÑтить видаленні Ñтовпці, не можна" -#: rewrite/rewriteDefine.c:729 +#: rewrite/rewriteDefine.c:567 #, c-format msgid "SELECT rule's target entry %d has different column name from column \"%s\"" msgstr "Елемент результата правила Ð´Ð»Ñ SELECT %d відрізнÑєтьÑÑ Ñ–Ð¼ÐµÐ½ÐµÐ¼ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð²Ñ–Ð´ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: rewrite/rewriteDefine.c:731 +#: rewrite/rewriteDefine.c:569 #, c-format msgid "SELECT target entry is named \"%s\"." msgstr "Ім'Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð° результату SELECT \"%s\"." -#: rewrite/rewriteDefine.c:740 +#: rewrite/rewriteDefine.c:578 #, c-format msgid "SELECT rule's target entry %d has different type from column \"%s\"" msgstr "Елемент результата правила Ð´Ð»Ñ SELECT %d відрізнÑєтьÑÑ Ñ‚Ð¸Ð¿Ð¾Ð¼ від ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: rewrite/rewriteDefine.c:742 +#: rewrite/rewriteDefine.c:580 #, c-format msgid "RETURNING list's entry %d has different type from column \"%s\"" msgstr "Елемент ÑпиÑку RETURNING %d відрізнÑєтьÑÑ Ñ‚Ð¸Ð¿Ð¾Ð¼ від ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: rewrite/rewriteDefine.c:745 rewrite/rewriteDefine.c:769 +#: rewrite/rewriteDefine.c:583 rewrite/rewriteDefine.c:607 #, c-format msgid "SELECT target entry has type %s, but column has type %s." msgstr "Елемент результату SELECT має тип %s, але Ñтовпець має тип %s." -#: rewrite/rewriteDefine.c:748 rewrite/rewriteDefine.c:773 +#: rewrite/rewriteDefine.c:586 rewrite/rewriteDefine.c:611 #, c-format msgid "RETURNING list entry has type %s, but column has type %s." msgstr "Елемент ÑпиÑку RETURNING має тип %s, але Ñтовпець має тип %s." -#: rewrite/rewriteDefine.c:764 +#: rewrite/rewriteDefine.c:602 #, c-format msgid "SELECT rule's target entry %d has different size from column \"%s\"" msgstr "Елемент результата правил Ð´Ð»Ñ SELECT %d відрізнÑєтьÑÑ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ð¾Ð¼ від ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: rewrite/rewriteDefine.c:766 +#: rewrite/rewriteDefine.c:604 #, c-format msgid "RETURNING list's entry %d has different size from column \"%s\"" msgstr "Елемент ÑпиÑку RETURNING %d відрізнÑєтьÑÑ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ð¾Ð¼ від ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: rewrite/rewriteDefine.c:783 +#: rewrite/rewriteDefine.c:621 #, c-format msgid "SELECT rule's target list has too few entries" msgstr "СпиÑок результату правила Ð´Ð»Ñ SELECT має занадто мало елементів" -#: rewrite/rewriteDefine.c:784 +#: rewrite/rewriteDefine.c:622 #, c-format msgid "RETURNING list has too few entries" msgstr "СпиÑок RETURNING має занадто мало елементів" -#: rewrite/rewriteDefine.c:877 rewrite/rewriteDefine.c:992 -#: rewrite/rewriteSupport.c:109 +#: rewrite/rewriteDefine.c:711 rewrite/rewriteDefine.c:826 +#: rewrite/rewriteSupport.c:108 #, c-format msgid "rule \"%s\" for relation \"%s\" does not exist" msgstr "правило \"%s\" Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: rewrite/rewriteDefine.c:1011 +#: rewrite/rewriteDefine.c:845 #, c-format msgid "renaming an ON SELECT rule is not allowed" msgstr "не допуÑкаєтьÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° ON SELECT" -#: rewrite/rewriteHandler.c:554 +#: rewrite/rewriteHandler.c:588 #, c-format msgid "WITH query name \"%s\" appears in both a rule action and the query being rewritten" msgstr "Ім'Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ WITH \"%s\" з'ÑвлÑєтьÑÑ Ñ– в дії правила, Ñ– в перепиÑаному запиті" -#: rewrite/rewriteHandler.c:581 +#: rewrite/rewriteHandler.c:615 #, c-format -msgid "INSERT...SELECT rule actions are not supported for queries having data-modifying statements in WITH" -msgstr "Дії правил INSERT...SELECT не підтримуютьÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð², Ñкі змінюють дані в операторах WITH" +msgid "INSERT ... SELECT rule actions are not supported for queries having data-modifying statements in WITH" +msgstr "Дії правил INSERT ... SELECT не підтримуютьÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð², Ñкі змінюють дані в операторах WITH" -#: rewrite/rewriteHandler.c:634 +#: rewrite/rewriteHandler.c:668 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "ÑпиÑки RETURNING може мати лише одне правило" -#: rewrite/rewriteHandler.c:866 rewrite/rewriteHandler.c:905 +#: rewrite/rewriteHandler.c:900 rewrite/rewriteHandler.c:939 #, c-format msgid "cannot insert a non-DEFAULT value into column \"%s\"" msgstr "вÑтавити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ non-DEFAULT до ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" не можна" -#: rewrite/rewriteHandler.c:868 rewrite/rewriteHandler.c:934 +#: rewrite/rewriteHandler.c:902 rewrite/rewriteHandler.c:968 #, c-format msgid "Column \"%s\" is an identity column defined as GENERATED ALWAYS." msgstr "Стовпець \"%s\" Ñ” ідентифікаційним Ñтовпцем визначеним Ñк GENERATED ALWAYS." -#: rewrite/rewriteHandler.c:870 +#: rewrite/rewriteHandler.c:904 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Ð”Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ викориÑтайте OVERRIDING SYSTEM VALUE." -#: rewrite/rewriteHandler.c:932 rewrite/rewriteHandler.c:940 +#: rewrite/rewriteHandler.c:966 rewrite/rewriteHandler.c:974 #, c-format msgid "column \"%s\" can only be updated to DEFAULT" msgstr "Ñтовпець \"%s\" може бути оновлено тільки до DEFAULT" -#: rewrite/rewriteHandler.c:1087 rewrite/rewriteHandler.c:1105 +#: rewrite/rewriteHandler.c:1109 rewrite/rewriteHandler.c:1127 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "кілька завдань Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: rewrite/rewriteHandler.c:2111 rewrite/rewriteHandler.c:3978 +#: rewrite/rewriteHandler.c:1682 +#, c-format +msgid "MERGE is not supported for relations with rules." +msgstr "MERGE не підтримує Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· правилами." + +#: rewrite/rewriteHandler.c:1722 rewrite/rewriteHandler.c:3262 +#, c-format +msgid "access to non-system view \"%s\" is restricted" +msgstr "доÑтуп до неÑиÑтемного Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" обмежено" + +#: rewrite/rewriteHandler.c:2122 rewrite/rewriteHandler.c:4254 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "виÑвлена безкінечна рекурÑÑ–Ñ Ñƒ правилах Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ñин \"%s\"" -#: rewrite/rewriteHandler.c:2196 +#: rewrite/rewriteHandler.c:2227 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "виÑвлена безкінечна рекурÑÑ–Ñ Ð² політиці Ð´Ð»Ñ Ð·Ð²'Ñзка \"%s\"" -#: rewrite/rewriteHandler.c:2516 +#: rewrite/rewriteHandler.c:2589 msgid "Junk view columns are not updatable." msgstr "Утилізовані Ñтовпці подань не оновлюютьÑÑ." -#: rewrite/rewriteHandler.c:2521 +#: rewrite/rewriteHandler.c:2594 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Стовпці поданнÑ, Ñкі не Ñ” ÑтовпцÑми базового зв'Ñзку, не оновлюютьÑÑ." -#: rewrite/rewriteHandler.c:2524 +#: rewrite/rewriteHandler.c:2597 msgid "View columns that refer to system columns are not updatable." msgstr "Стовпці поданнÑ, Ñкі поÑилаютьÑÑ Ð½Ð° ÑиÑтемні Ñтовпці, не оновлюютьÑÑ." -#: rewrite/rewriteHandler.c:2527 +#: rewrite/rewriteHandler.c:2600 msgid "View columns that return whole-row references are not updatable." msgstr "Стовпці поданнÑ, що повертають поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° веÑÑŒ Ñ€Ñдок, не оновлюютьÑÑ." -#: rewrite/rewriteHandler.c:2588 +#: rewrite/rewriteHandler.c:2661 msgid "Views containing DISTINCT are not automatically updatable." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ñкі міÑÑ‚Ñть DISTINCT не оновлюютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." -#: rewrite/rewriteHandler.c:2591 +#: rewrite/rewriteHandler.c:2664 msgid "Views containing GROUP BY are not automatically updatable." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ñкі міÑÑ‚Ñть GROUP BY не оновлюютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." -#: rewrite/rewriteHandler.c:2594 +#: rewrite/rewriteHandler.c:2667 msgid "Views containing HAVING are not automatically updatable." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ñкі міÑÑ‚Ñть HAVING не оновлюютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." -#: rewrite/rewriteHandler.c:2597 +#: rewrite/rewriteHandler.c:2670 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ñкі міÑÑ‚Ñть UNION, INTERSECT, або EXCEPT не оновлюютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." -#: rewrite/rewriteHandler.c:2600 +#: rewrite/rewriteHandler.c:2673 msgid "Views containing WITH are not automatically updatable." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ñкі міÑÑ‚Ñть WITH не оновлюютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." -#: rewrite/rewriteHandler.c:2603 +#: rewrite/rewriteHandler.c:2676 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ñкі міÑÑ‚Ñть LIMIT або OFFSET не оновлюютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." -#: rewrite/rewriteHandler.c:2615 +#: rewrite/rewriteHandler.c:2688 msgid "Views that return aggregate functions are not automatically updatable." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ñкі повертають агрегатні функції не оновлюютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." -#: rewrite/rewriteHandler.c:2618 +#: rewrite/rewriteHandler.c:2691 msgid "Views that return window functions are not automatically updatable." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ñкі повертають віконні функції не оновлюютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." -#: rewrite/rewriteHandler.c:2621 +#: rewrite/rewriteHandler.c:2694 msgid "Views that return set-returning functions are not automatically updatable." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ñкі повертають set-returning функції не оновлюютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." -#: rewrite/rewriteHandler.c:2628 rewrite/rewriteHandler.c:2632 -#: rewrite/rewriteHandler.c:2640 +#: rewrite/rewriteHandler.c:2701 rewrite/rewriteHandler.c:2705 +#: rewrite/rewriteHandler.c:2713 msgid "Views that do not select from a single table or view are not automatically updatable." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ñкі обирають дані не з одної таблиці або Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð½Ðµ оновлюютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." -#: rewrite/rewriteHandler.c:2643 +#: rewrite/rewriteHandler.c:2716 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ñкі міÑÑ‚Ñть TABLESAMPLE не оновлюютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." -#: rewrite/rewriteHandler.c:2667 +#: rewrite/rewriteHandler.c:2740 msgid "Views that have no updatable columns are not automatically updatable." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ñкі не мають оновлюваних Ñтовпців не оновлюютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." -#: rewrite/rewriteHandler.c:3144 +#: rewrite/rewriteHandler.c:3121 rewrite/rewriteHandler.c:3156 +#, c-format +msgid "cannot insert into view \"%s\"" +msgstr "вÑтавити дані в Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не можна" + +#: rewrite/rewriteHandler.c:3124 +#, c-format +msgid "To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule." +msgstr "Щоб Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð¾Ð¿ÑƒÑкало Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…, вÑтановіть тригер INSTEAD OF INSERT або безумовне правило ON INSERT DO INSTEAD." + +#: rewrite/rewriteHandler.c:3129 rewrite/rewriteHandler.c:3165 +#, c-format +msgid "cannot update view \"%s\"" +msgstr "оновити Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не можна" + +#: rewrite/rewriteHandler.c:3132 +#, c-format +msgid "To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule." +msgstr "Щоб Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð¾Ð¿ÑƒÑкало оновленнÑ, вÑтановіть тригер INSTEAD OF UPDATE або безумовне правило ON UPDATE DO INSTEAD." + +#: rewrite/rewriteHandler.c:3137 rewrite/rewriteHandler.c:3174 +#, c-format +msgid "cannot delete from view \"%s\"" +msgstr "видалити дані з Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не можна" + +#: rewrite/rewriteHandler.c:3140 +#, c-format +msgid "To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule." +msgstr "Щоб Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð¾Ð¿ÑƒÑкало Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…, вÑтановіть тригер INSTEAD OF DELETE або безумновне правило ON DELETE DO INSTEAD." + +#: rewrite/rewriteHandler.c:3159 +#, c-format +msgid "To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT trigger." +msgstr "Щоб Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð¾Ð¿ÑƒÑкало вÑтавку даних за допомогою MERGE, вÑтановіть тригер INSTEAD OF INSERT." + +#: rewrite/rewriteHandler.c:3168 +#, c-format +msgid "To enable updating the view using MERGE, provide an INSTEAD OF UPDATE trigger." +msgstr "Щоб Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð¾Ð¿ÑƒÑкало Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… за допомогою MERGE, вÑтановіть тригер INSTEAD OF UPDATE." + +#: rewrite/rewriteHandler.c:3177 +#, c-format +msgid "To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE trigger." +msgstr "Щоб Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð¾Ð¿ÑƒÑкало Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… за допомогою MERGE, вÑтановіть тригер INSTEAD OF DELETE." + +#: rewrite/rewriteHandler.c:3352 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "вÑтавити дані в Ñтовпець \"%s\" Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не можна" -#: rewrite/rewriteHandler.c:3152 +#: rewrite/rewriteHandler.c:3360 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "оновити дані в Ñтовпці \"%s\" Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\" не можна" -#: rewrite/rewriteHandler.c:3639 +#: rewrite/rewriteHandler.c:3368 +#, c-format +msgid "cannot merge into column \"%s\" of view \"%s\"" +msgstr "неможливо об'єднати дані в Ñтовпець \"%s\" Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\"" + +#: rewrite/rewriteHandler.c:3396 +#, c-format +msgid "cannot merge into view \"%s\"" +msgstr "неможливо об'єднати дані в Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s\"" + +#: rewrite/rewriteHandler.c:3398 +#, c-format +msgid "MERGE is not supported for views with INSTEAD OF triggers for some actions but not all." +msgstr "MERGE не підтримуєтьÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð½ÑŒ з тригерами INSTEAD OF Ð´Ð»Ñ Ð´ÐµÑких дій, але не вÑÑ–Ñ…." + +#: rewrite/rewriteHandler.c:3399 +#, c-format +msgid "To enable merging into the view, either provide a full set of INSTEAD OF triggers or drop the existing INSTEAD OF triggers." +msgstr "Щоб Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð´Ð¾Ð¿ÑƒÑкало об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñƒ нього, або вÑтановіть повний набір тригерів INSTEAD OF або видаліть Ñ–Ñнуючі тригери INSTEAD OF." + +#: rewrite/rewriteHandler.c:3912 #, c-format msgid "DO INSTEAD NOTIFY rules are not supported for data-modifying statements in WITH" msgstr "Правила DO INSTEAD NOTIFY не підтримуютьÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð², Ñкі змінюють дані в WITH" -#: rewrite/rewriteHandler.c:3650 +#: rewrite/rewriteHandler.c:3923 #, c-format msgid "DO INSTEAD NOTHING rules are not supported for data-modifying statements in WITH" msgstr "Правила DO INSTEAD NOTHING не підтримуютьÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð², Ñкі змінюють дані в WITH" -#: rewrite/rewriteHandler.c:3664 +#: rewrite/rewriteHandler.c:3937 #, c-format msgid "conditional DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "умовні правила DO INSTEAD не підтримуютьÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð², Ñкі змінюють дані в WITH" -#: rewrite/rewriteHandler.c:3668 +#: rewrite/rewriteHandler.c:3941 #, c-format msgid "DO ALSO rules are not supported for data-modifying statements in WITH" msgstr "Правила DO ALSO не підтримуютьÑÑ Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð², Ñкі змінюють дані в WITH" -#: rewrite/rewriteHandler.c:3673 +#: rewrite/rewriteHandler.c:3946 #, c-format msgid "multi-statement DO INSTEAD rules are not supported for data-modifying statements in WITH" msgstr "Ñкладові правила DO INSTEAD не підтримуютьÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°Ð¼Ð¸, Ñкі змінюють дані у WITH" -#: rewrite/rewriteHandler.c:3906 rewrite/rewriteHandler.c:3914 -#: rewrite/rewriteHandler.c:3922 -#, c-format +#: rewrite/rewriteHandler.c:4206 msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ Ð· умовними правилами DO INSTEAD не оновлюютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾." -#: rewrite/rewriteHandler.c:4015 +#: rewrite/rewriteHandler.c:4303 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "виконати INSERT RETURNING Ð´Ð»Ñ Ð·Ð²'Ñзка \"%s\" не можна" -#: rewrite/rewriteHandler.c:4017 +#: rewrite/rewriteHandler.c:4305 #, c-format msgid "You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause." msgstr "Вам потрібне безумовне правило ON INSERT DO INSTEAD з реченнÑм RETURNING." -#: rewrite/rewriteHandler.c:4022 +#: rewrite/rewriteHandler.c:4310 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "виконати UPDATE RETURNING Ð´Ð»Ñ Ð·Ð²'Ñзка \"%s\" не можна" -#: rewrite/rewriteHandler.c:4024 +#: rewrite/rewriteHandler.c:4312 #, c-format msgid "You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause." msgstr "Вам потрібне безумовне правило ON UPDATE DO INSTEAD з реченнÑм RETURNING." -#: rewrite/rewriteHandler.c:4029 +#: rewrite/rewriteHandler.c:4317 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "виконати DELETE RETURNING Ð´Ð»Ñ Ð·Ð²'Ñзка \"%s\" не можна" -#: rewrite/rewriteHandler.c:4031 +#: rewrite/rewriteHandler.c:4319 #, c-format msgid "You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause." msgstr "Вам потрібне безумовне правило ON DELETE DO INSTEAD з реченнÑм RETURNING." -#: rewrite/rewriteHandler.c:4049 +#: rewrite/rewriteHandler.c:4337 #, c-format msgid "INSERT with ON CONFLICT clause cannot be used with table that has INSERT or UPDATE rules" msgstr "INSERT з реченнÑм ON CONFLICT не можна викориÑтовувати з таблицею, Ñка має правила INSERT або UPDATE" -#: rewrite/rewriteHandler.c:4106 +#: rewrite/rewriteHandler.c:4394 #, c-format msgid "WITH cannot be used in a query that is rewritten by rules into multiple queries" msgstr "WITH не можна викориÑтовувати в запиті, Ñкий перепиÑаний правилами в декілька запитів" -#: rewrite/rewriteManip.c:1006 +#: rewrite/rewriteManip.c:1084 #, c-format msgid "conditional utility statements are not implemented" msgstr "умовні Ñлужбові оператори не реалізовані" -#: rewrite/rewriteManip.c:1172 +#: rewrite/rewriteManip.c:1431 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "Умова WHERE CURRENT OF Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð½Ðµ реалізована" -#: rewrite/rewriteManip.c:1507 +#: rewrite/rewriteManip.c:1767 #, c-format msgid "NEW variables in ON UPDATE rules cannot reference columns that are part of a multiple assignment in the subject UPDATE command" msgstr "Змінні NEW в правилах ON UPDATE не можуть поÑилатиÑÑŒ на Ñтовпці, Ñкі Ñ” чаÑтиною декілької призначень в команді UPDATE" @@ -20967,358 +21988,415 @@ msgstr "нерозпізнаний параметр Snowball: \"%s\"" msgid "missing Language parameter" msgstr "пропущений параметр Language" -#: statistics/extended_stats.c:179 +#: statistics/extended_stats.c:176 #, c-format msgid "statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"" msgstr "об'єкт ÑтатиÑтики \"%s.%s\" не вдалоÑÑ Ð¾Ð±Ñ‡Ð¸Ñлити Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\"" -#: statistics/mcv.c:1372 +#: statistics/mcv.c:1368 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "функціÑ, що повертає набір, викликана у контекÑті, що не приймає тип запиÑ" -#: storage/buffer/bufmgr.c:603 storage/buffer/bufmgr.c:773 +#: storage/buffer/bufmgr.c:649 storage/buffer/bufmgr.c:805 #, c-format msgid "cannot access temporary tables of other sessions" msgstr "доÑтуп до тимчаÑових таблиць з інших ÑеÑій заблоковано" -#: storage/buffer/bufmgr.c:851 +#: storage/buffer/bufmgr.c:1532 +#, c-format +msgid "invalid page in block %u of relation %s; zeroing out page" +msgstr "неприпуÑтима Ñторінка в блоці %u Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %s; Ñторінка обнулÑєтьÑÑ" + +#: storage/buffer/bufmgr.c:2277 storage/buffer/localbuf.c:361 #, c-format msgid "cannot extend relation %s beyond %u blocks" msgstr "не можна розширити Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %s понад %u блоків" -#: storage/buffer/bufmgr.c:938 +#: storage/buffer/bufmgr.c:2348 #, c-format msgid "unexpected data beyond EOF in block %u of relation %s" msgstr "неочікуванні дані піÑÐ»Ñ EOF в блоці %u Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %s" -#: storage/buffer/bufmgr.c:940 +#: storage/buffer/bufmgr.c:2350 #, c-format msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Ð¦Ñ ÑÐ¸Ñ‚ÑƒÐ°Ñ†Ñ–Ñ Ð¼Ð¾Ð¶Ðµ виникати через помилки в Ñдрі; можливо, вам Ñлід оновити вашу ÑиÑтему." -#: storage/buffer/bufmgr.c:1039 -#, c-format -msgid "invalid page in block %u of relation %s; zeroing out page" -msgstr "неприпуÑтима Ñторінка в блоці %u Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %s; Ñторінка обнулÑєтьÑÑ" - -#: storage/buffer/bufmgr.c:4663 +#: storage/buffer/bufmgr.c:5654 #, c-format msgid "could not write block %u of %s" msgstr "неможливо запиÑати блок %u файлу %s" -#: storage/buffer/bufmgr.c:4665 +#: storage/buffer/bufmgr.c:5656 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Кілька неполадок --- можливо, поÑтійна помилка запиÑу." -#: storage/buffer/bufmgr.c:4686 storage/buffer/bufmgr.c:4705 +#: storage/buffer/bufmgr.c:5678 storage/buffer/bufmgr.c:5698 #, c-format msgid "writing block %u of relation %s" msgstr "запиÑÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒ %u зв'Ñзку %s" -#: storage/buffer/bufmgr.c:5009 -#, c-format -msgid "snapshot too old" -msgstr "знімок Ñ” заÑтарим" - -#: storage/buffer/localbuf.c:205 +#: storage/buffer/localbuf.c:220 #, c-format msgid "no empty local buffer available" msgstr "немає жодного пуÑтого локального буферу" -#: storage/buffer/localbuf.c:433 +#: storage/buffer/localbuf.c:597 #, c-format msgid "cannot access temporary tables during a parallel operation" msgstr "немає доÑтупу до тимчаÑових таблиць під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ñ— операції" -#: storage/file/buffile.c:333 +#: storage/buffer/localbuf.c:712 +#, c-format +msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." +msgstr "параметр \"temp_buffers\" не можна змінити піÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾, Ñк тимчаÑові таблиці отримали доÑтуп в ÑеанÑÑ–." + +#: storage/file/buffile.c:338 #, c-format msgid "could not open temporary file \"%s\" from BufFile \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ тимчаÑовий файл \"%s\" з BufFile \"%s\": %m" -#: storage/file/buffile.c:723 storage/file/buffile.c:844 +#: storage/file/buffile.c:632 +#, c-format +msgid "could not read from file set \"%s\": read only %zu of %zu bytes" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано лише %zu з %zu байт" + +#: storage/file/buffile.c:634 +#, c-format +msgid "could not read from temporary file: read only %zu of %zu bytes" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ тимчаÑовий файл: прочитано лише %zu з %zu байт" + +#: storage/file/buffile.c:774 storage/file/buffile.c:877 #, c-format msgid "could not determine size of temporary file \"%s\" from BufFile \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ розмір тимчаÑового файлу \"%s\" з BufFile \"%s\": %m" -#: storage/file/buffile.c:923 +#: storage/file/buffile.c:956 #, c-format msgid "could not delete fileset \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ набір файлів \"%s\": %m" -#: storage/file/buffile.c:941 storage/smgr/md.c:310 storage/smgr/md.c:890 +#: storage/file/buffile.c:974 storage/smgr/md.c:336 storage/smgr/md.c:1194 #, c-format msgid "could not truncate file \"%s\": %m" msgstr "не вдалоÑÑ Ñкоротити файл \"%s\": %m" -#: storage/file/fd.c:522 storage/file/fd.c:594 storage/file/fd.c:630 +#: storage/file/fd.c:583 storage/file/fd.c:655 storage/file/fd.c:691 #, c-format msgid "could not flush dirty data: %m" msgstr "не вдалоÑÑ Ð¾Ñ‡Ð¸Ñтити \"брудні\" дані: %m" -#: storage/file/fd.c:552 +#: storage/file/fd.c:613 #, c-format msgid "could not determine dirty data size: %m" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ розмір \"брудних\" даних: %m" -#: storage/file/fd.c:604 +#: storage/file/fd.c:665 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "не вдалоÑÑ munmap() під Ñ‡Ð°Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…: %m" -#: storage/file/fd.c:843 -#, c-format -msgid "could not link file \"%s\" to \"%s\": %m" -msgstr "Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\" не вдалоÑÑ Ñтворити поÑÐ¸Ð»Ð°Ð½Ð½Ñ \"%s\": %m" - -#: storage/file/fd.c:967 +#: storage/file/fd.c:983 #, c-format msgid "getrlimit failed: %m" msgstr "помилка getrlimit: %m" -#: storage/file/fd.c:1057 +#: storage/file/fd.c:1073 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "недоÑтатньо доÑтупних деÑкрипторів файлу Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку Ñерверного процеÑу" -#: storage/file/fd.c:1058 +#: storage/file/fd.c:1074 #, c-format -msgid "System allows %d, we need at least %d." -msgstr "СиÑтема дозволÑÑ” %d, потрібно щонайменше %d." +msgid "System allows %d, server needs at least %d." +msgstr "СиÑтема дозволÑÑ” %d, Ñервер потребує щонайменше %d." -#: storage/file/fd.c:1153 storage/file/fd.c:2496 storage/file/fd.c:2606 -#: storage/file/fd.c:2757 +#: storage/file/fd.c:1162 storage/file/fd.c:2618 storage/file/fd.c:2727 +#: storage/file/fd.c:2878 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "неÑтача деÑкрипторів файлу: %m; вивільніть Ñ– Ñпробуйте знову" -#: storage/file/fd.c:1527 +#: storage/file/fd.c:1536 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "тимчаÑовий файл: шлÑÑ… \"%s\", розмір %lu" -#: storage/file/fd.c:1658 +#: storage/file/fd.c:1675 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "неможливо Ñтворити тимчаÑовий каталог \"%s\": %m" -#: storage/file/fd.c:1665 +#: storage/file/fd.c:1682 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "неможливо Ñтворити тимчаÑовий підкаталог \"%s\": %m" -#: storage/file/fd.c:1862 +#: storage/file/fd.c:1879 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "неможливо Ñтворити тимчаÑовий файл \"%s\": %m" -#: storage/file/fd.c:1898 +#: storage/file/fd.c:1915 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "неможливо відкрити тимчаÑовий файл \"%s\": %m" -#: storage/file/fd.c:1939 +#: storage/file/fd.c:1956 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "помилка Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñового файлу \"%s\": %m" -#: storage/file/fd.c:2027 +#: storage/file/fd.c:2044 #, c-format msgid "could not delete file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл \"%s\": %m" -#: storage/file/fd.c:2207 +#: storage/file/fd.c:2234 #, c-format msgid "temporary file size exceeds temp_file_limit (%dkB)" msgstr "розмір тимчаÑового файлу перевищує temp_file_limit (%d Кб)" -#: storage/file/fd.c:2472 storage/file/fd.c:2531 +#: storage/file/fd.c:2594 storage/file/fd.c:2653 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "перевищено maxAllocatedDescs (%d) при Ñпробі відкрити файл \"%s\"" -#: storage/file/fd.c:2576 +#: storage/file/fd.c:2698 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "перевищено maxAllocatedDescs (%d) при Ñпробі виконати команду \"%s\"" -#: storage/file/fd.c:2733 +#: storage/file/fd.c:2854 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "перевищено maxAllocatedDescs (%d) при Ñпробі відкрити каталог \"%s\"" -#: storage/file/fd.c:3269 +#: storage/file/fd.c:3384 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "знайдено неочікуваний файл в каталозі тимчаÑових файлів: \"%s\"" -#: storage/file/fd.c:3387 +#: storage/file/fd.c:3502 #, c-format msgid "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ даних (syncfs), витрачено чаÑу: %ld.%02d Ñ, поточний шлÑÑ…: %s" -#: storage/file/fd.c:3401 -#, c-format -msgid "could not synchronize file system for file \"%s\": %m" -msgstr "не вдалоÑÑ Ñинхронізувати файлову ÑиÑтему Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" - -#: storage/file/fd.c:3619 +#: storage/file/fd.c:3729 #, c-format msgid "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ даних (pre-fsync), витрачено чаÑу: %ld.%02d Ñ, поточний шлÑÑ…: %s" -#: storage/file/fd.c:3651 +#: storage/file/fd.c:3761 #, c-format msgid "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ даних (fsync), витрачено чаÑу: %ld.%02d Ñ, поточний шлÑÑ…: %s" +#: storage/file/fd.c:3950 +#, c-format +msgid "\"debug_io_direct\" is not supported on this platform." +msgstr "\"debug_io_direct\" не підтримуєтьÑÑ Ð½Ð° цій платформі." + +#: storage/file/fd.c:3964 +#, c-format +msgid "Invalid list syntax in parameter \"%s\"" +msgstr "ÐеприпуÑтимий ÑинтакÑÐ¸Ñ ÑпиÑку в параметрі \"%s\"" + +#: storage/file/fd.c:3984 +#, c-format +msgid "Invalid option \"%s\"" +msgstr "ÐедійÑний параметр \"%s\"" + +#: storage/file/fd.c:3997 +#, c-format +msgid "\"debug_io_direct\" is not supported for WAL because XLOG_BLCKSZ is too small" +msgstr "\"debug_io_direct\" не підтримуєтьÑÑ Ð´Ð»Ñ WAL, оÑкільки XLOG_BLCKSZ занадто малий" + +#: storage/file/fd.c:4004 +#, c-format +msgid "\"debug_io_direct\" is not supported for data because BLCKSZ is too small" +msgstr "\"debug_io_direct\" не підтримуєтьÑÑ Ð´Ð»Ñ Ð´Ð°Ð½Ð¸Ñ…, тому що BLCKSZ занадто малий" + #: storage/file/reinit.c:145 #, c-format msgid "resetting unlogged relations (init), elapsed time: %ld.%02d s, current path: %s" -msgstr "ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð½ÐµÐ¶ÑƒÑ€Ð½Ð°Ð»ÑŒÐ¾Ð²Ð°Ð½Ð¸Ñ… відношень (init), витрачено чаÑу: %ld.%02d , поточний шлÑÑ…: %s" +msgstr "ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð½ÐµÐ¶ÑƒÑ€Ð½Ð°Ð»ÑŒÐ¾Ð²Ð°Ð½Ð¸Ñ… відношень (init), витрачено чаÑу: %ld.%02d, поточний шлÑÑ…: %s" #: storage/file/reinit.c:148 #, c-format msgid "resetting unlogged relations (cleanup), elapsed time: %ld.%02d s, current path: %s" msgstr "ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð½ÐµÐ¶ÑƒÑ€Ð½Ð°Ð»ÑŒÐ¾Ð²Ð°Ð½Ð¸Ñ… відношень (очищеннÑ), витрачено чаÑу: %ld.%02d Ñ, поточний шлÑÑ…: %s" -#: storage/file/sharedfileset.c:79 +#: storage/file/sharedfileset.c:73 #, c-format msgid "could not attach to a SharedFileSet that is already destroyed" msgstr "не вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ вже знищеному набору SharedFileSet" -#: storage/ipc/dsm.c:353 +#: storage/ipc/dsm.c:379 #, c-format msgid "dynamic shared memory control segment is corrupt" msgstr "Ñегмент ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— Ñпільної пам'Ñті пошкоджений" -#: storage/ipc/dsm.c:418 +#: storage/ipc/dsm.c:444 #, c-format msgid "dynamic shared memory control segment is not valid" msgstr "Ñегмент ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— Ñпільної пам'Ñті недійÑний" -#: storage/ipc/dsm.c:600 +#: storage/ipc/dsm.c:626 #, c-format msgid "too many dynamic shared memory segments" msgstr "занадто багато Ñегментів динамічної Ñпільної пам'Ñті" -#: storage/ipc/dsm_impl.c:235 storage/ipc/dsm_impl.c:544 -#: storage/ipc/dsm_impl.c:648 storage/ipc/dsm_impl.c:819 +#: storage/ipc/dsm_impl.c:231 storage/ipc/dsm_impl.c:537 +#: storage/ipc/dsm_impl.c:641 storage/ipc/dsm_impl.c:812 #, c-format msgid "could not unmap shared memory segment \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð²Ñ–Ð»ÑŒÐ½Ð¸Ñ‚Ð¸ Ñегмент Ñпільної пам'Ñті \"%s\": %m" -#: storage/ipc/dsm_impl.c:245 storage/ipc/dsm_impl.c:554 -#: storage/ipc/dsm_impl.c:658 storage/ipc/dsm_impl.c:829 +#: storage/ipc/dsm_impl.c:241 storage/ipc/dsm_impl.c:547 +#: storage/ipc/dsm_impl.c:651 storage/ipc/dsm_impl.c:822 #, c-format msgid "could not remove shared memory segment \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñегмент Ñпільної пам'Ñті \"%s\": %m" -#: storage/ipc/dsm_impl.c:269 storage/ipc/dsm_impl.c:729 -#: storage/ipc/dsm_impl.c:843 +#: storage/ipc/dsm_impl.c:265 storage/ipc/dsm_impl.c:722 +#: storage/ipc/dsm_impl.c:836 #, c-format msgid "could not open shared memory segment \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ Ñегмент Ñпільної пам'Ñті \"%s\": %m" -#: storage/ipc/dsm_impl.c:294 storage/ipc/dsm_impl.c:570 -#: storage/ipc/dsm_impl.c:774 storage/ipc/dsm_impl.c:867 +#: storage/ipc/dsm_impl.c:290 storage/ipc/dsm_impl.c:563 +#: storage/ipc/dsm_impl.c:767 storage/ipc/dsm_impl.c:860 #, c-format msgid "could not stat shared memory segment \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð²ÐµÑ€Ð½ÑƒÑ‚Ð¸ÑÑ Ð´Ð¾ Ñегменту Ñпільної пам'Ñті \"%s\": %m" -#: storage/ipc/dsm_impl.c:313 storage/ipc/dsm_impl.c:918 +#: storage/ipc/dsm_impl.c:309 storage/ipc/dsm_impl.c:911 #, c-format msgid "could not resize shared memory segment \"%s\" to %zu bytes: %m" msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ розмір Ñегменту Ñпільної пам'Ñті \"%s\" до %zu байтів: %m" -#: storage/ipc/dsm_impl.c:335 storage/ipc/dsm_impl.c:591 -#: storage/ipc/dsm_impl.c:750 storage/ipc/dsm_impl.c:940 +#: storage/ipc/dsm_impl.c:331 storage/ipc/dsm_impl.c:584 +#: storage/ipc/dsm_impl.c:743 storage/ipc/dsm_impl.c:933 #, c-format msgid "could not map shared memory segment \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ‚Ð¸ Ñегмент Ñпільної пам'Ñті \"%s\": %m" -#: storage/ipc/dsm_impl.c:526 +#: storage/ipc/dsm_impl.c:519 #, c-format msgid "could not get shared memory segment: %m" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ñегмент Ñпільної пам'Ñті: %m" -#: storage/ipc/dsm_impl.c:714 +#: storage/ipc/dsm_impl.c:707 #, c-format msgid "could not create shared memory segment \"%s\": %m" msgstr "не вдалоÑÑ Ñтворити Ñегмент Ñпільної пам'Ñті \"%s\": %m" -#: storage/ipc/dsm_impl.c:951 +#: storage/ipc/dsm_impl.c:944 #, c-format msgid "could not close shared memory segment \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ Ñегмент Ñпільної пам'Ñті \"%s\": %m" -#: storage/ipc/dsm_impl.c:991 storage/ipc/dsm_impl.c:1040 +#: storage/ipc/dsm_impl.c:984 storage/ipc/dsm_impl.c:1033 #, c-format msgid "could not duplicate handle for \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ñ‚Ð¸ маркер Ð´Ð»Ñ \"%s\": %m" -#: storage/ipc/procarray.c:3812 +#: storage/ipc/dsm_registry.c:142 +#, c-format +msgid "DSM segment name cannot be empty" +msgstr "Ім'Ñ Ñегмента DSM не може бути порожнім" + +#: storage/ipc/dsm_registry.c:146 +#, c-format +msgid "DSM segment name too long" +msgstr "Занадто довге ім'Ñ Ñегменту DSM" + +#: storage/ipc/dsm_registry.c:150 +#, c-format +msgid "DSM segment size must be nonzero" +msgstr "Розмір Ñегменту DSM повинен бути ненульовим" + +#: storage/ipc/dsm_registry.c:176 +#, c-format +msgid "requested DSM segment size does not match size of existing segment" +msgstr "розмір запитуваного Ñегмента DSM не збігаєтьÑÑ Ð· розміром наÑвного Ñегмента" + +#: storage/ipc/procarray.c:488 storage/lmgr/proc.c:357 +#: tcop/backend_startup.c:304 +#, c-format +msgid "sorry, too many clients already" +msgstr "вибачте, вже забагато клієнтів" + +#: storage/ipc/procarray.c:3857 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "база даних \"%s\" викориÑтовуєтьÑÑ Ð¿Ñ–Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¼Ð¸ транзакціÑми" -#: storage/ipc/procarray.c:3844 storage/ipc/signalfuncs.c:226 +#: storage/ipc/procarray.c:3893 storage/ipc/procarray.c:3901 +#: storage/ipc/signalfuncs.c:235 storage/ipc/signalfuncs.c:242 +#, c-format +msgid "permission denied to terminate process" +msgstr "немає дозволу Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу" + +#: storage/ipc/procarray.c:3894 storage/ipc/signalfuncs.c:236 #, c-format -msgid "must be a superuser to terminate superuser process" -msgstr "щоб припинити Ð¿Ñ€Ð¾Ñ†ÐµÑ ÑуперкориÑтувача потрібно бути ÑуперкориÑтувачем" +msgid "Only roles with the %s attribute may terminate processes of roles with the %s attribute." +msgstr "Тільки ролі з атрибутом %s можуть припинити процеÑи ролей з атрибутом %s." -#: storage/ipc/procarray.c:3851 storage/ipc/signalfuncs.c:231 +#: storage/ipc/procarray.c:3902 storage/ipc/signalfuncs.c:243 #, c-format -msgid "must be a member of the role whose process is being terminated or member of pg_signal_backend" -msgstr "потрібно бути учаÑником ролі, Ð¿Ñ€Ð¾Ñ†ÐµÑ ÐºÐ¾Ñ‚Ñ€Ð¾Ñ— припинÑєтьÑÑ Ð°Ð±Ð¾ учаÑником pg_signal_backend" +msgid "Only roles with privileges of the role whose process is being terminated or with privileges of the \"%s\" role may terminate this process." +msgstr "Лише ролі з привілеÑми ролі, Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñкої завершуєтьÑÑ, або з привілеÑми ролі \"%s\" можуть завершити цей процеÑ." -#: storage/ipc/procsignal.c:419 +#: storage/ipc/procsignal.c:416 #, c-format -msgid "still waiting for backend with PID %lu to accept ProcSignalBarrier" -msgstr "вÑе ще чекаємо на прийнÑÑ‚Ñ‚Ñ ProcSignalBarrier від бекенд з PID %lu" +msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" +msgstr "вÑе ще чекаємо на прийнÑÑ‚Ñ‚Ñ ProcSignalBarrier від бекенд з PID %d" -#: storage/ipc/shm_mq.c:384 +#: storage/ipc/shm_mq.c:383 #, c-format msgid "cannot send a message of size %zu via shared memory queue" msgstr "не можна надÑилати Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñƒ %zu через чергу Ñпільної пам'Ñті" -#: storage/ipc/shm_mq.c:719 +#: storage/ipc/shm_mq.c:718 #, c-format msgid "invalid message size %zu in shared memory queue" msgstr "неприпуÑтимий розмір Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ %zu в черзі Ñпільної пам'Ñті" -#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:982 -#: storage/lmgr/lock.c:1020 storage/lmgr/lock.c:2845 storage/lmgr/lock.c:4259 -#: storage/lmgr/lock.c:4324 storage/lmgr/lock.c:4674 -#: storage/lmgr/predicate.c:2472 storage/lmgr/predicate.c:2487 -#: storage/lmgr/predicate.c:3969 storage/lmgr/predicate.c:5081 -#: utils/hash/dynahash.c:1112 +#: storage/ipc/shm_toc.c:118 storage/ipc/shm_toc.c:200 storage/lmgr/lock.c:984 +#: storage/lmgr/lock.c:1022 storage/lmgr/lock.c:2835 storage/lmgr/lock.c:4220 +#: storage/lmgr/lock.c:4285 storage/lmgr/lock.c:4635 +#: storage/lmgr/predicate.c:2468 storage/lmgr/predicate.c:2483 +#: storage/lmgr/predicate.c:3880 storage/lmgr/predicate.c:4927 +#: utils/hash/dynahash.c:1095 #, c-format msgid "out of shared memory" msgstr "неÑтача Ñпільної пам'Ñті" -#: storage/ipc/shmem.c:170 storage/ipc/shmem.c:266 +#: storage/ipc/shmem.c:161 storage/ipc/shmem.c:257 #, c-format msgid "out of shared memory (%zu bytes requested)" msgstr "неÑтача Ñпільної пам'Ñті (потребуєтьÑÑ %zu байт)" -#: storage/ipc/shmem.c:445 +#: storage/ipc/shmem.c:436 #, c-format msgid "could not create ShmemIndex entry for data structure \"%s\"" msgstr "не вдалоÑÑ Ñтворити Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ ShmemIndex Ð´Ð»Ñ Ñтруктури даних \"%s\"" -#: storage/ipc/shmem.c:460 +#: storage/ipc/shmem.c:451 #, c-format msgid "ShmemIndex entry size is wrong for data structure \"%s\": expected %zu, actual %zu" msgstr "розмір Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ ShmemIndex Ñ” неправильним Ð´Ð»Ñ Ñтруктури даних \"%s\": очікувано %zu, фактично %zu" -#: storage/ipc/shmem.c:479 +#: storage/ipc/shmem.c:470 #, c-format msgid "not enough shared memory for data structure \"%s\" (%zu bytes requested)" msgstr "недоÑтатньо Ñпільної пам'Ñті Ð´Ð»Ñ Ñтруктури даних \"%s\" (потрібно було %zu байтів)" -#: storage/ipc/shmem.c:511 storage/ipc/shmem.c:530 +#: storage/ipc/shmem.c:502 storage/ipc/shmem.c:521 #, c-format msgid "requested shared memory size overflows size_t" msgstr "запитаний Ñегмент Ñпільної пам'Ñті не вміщаєтьÑÑ Ð² size_t" @@ -21328,28 +22406,33 @@ msgstr "запитаний Ñегмент Ñпільної пам'Ñті не в msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %d не Ñ” внутрішнім процеÑом PostgreSQL" -#: storage/ipc/signalfuncs.c:104 storage/lmgr/proc.c:1430 -#: utils/adt/mcxtfuncs.c:190 +#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1453 +#: utils/adt/mcxtfuncs.c:182 #, c-format msgid "could not send signal to process %d: %m" msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати Ñигнал процеÑу %d: %m" -#: storage/ipc/signalfuncs.c:124 +#: storage/ipc/signalfuncs.c:129 storage/ipc/signalfuncs.c:136 +#, c-format +msgid "permission denied to cancel query" +msgstr "немає дозволу Ð´Ð»Ñ ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ" + +#: storage/ipc/signalfuncs.c:130 #, c-format -msgid "must be a superuser to cancel superuser query" -msgstr "щоб ÑкаÑувати запит ÑуперкориÑтувача потрібно бути ÑуперкориÑтувачем" +msgid "Only roles with the %s attribute may cancel queries of roles with the %s attribute." +msgstr "Лише ролі з атрибутом %s можуть ÑкаÑовувати запити ролей з атрибутом %s." -#: storage/ipc/signalfuncs.c:129 +#: storage/ipc/signalfuncs.c:137 #, c-format -msgid "must be a member of the role whose query is being canceled or member of pg_signal_backend" -msgstr "потрібно бути учаÑником ролі, запит котрої ÑкаÑовуєтьÑÑ, або учаÑником pg_signal_backend" +msgid "Only roles with privileges of the role whose query is being canceled or with privileges of the \"%s\" role may cancel this query." +msgstr "Лише ролі з привілеÑми ролі, запит Ñкої ÑкаÑовуєтьÑÑ, або з привілеÑми ролі \"%s\" можуть ÑкаÑувати цей запит." -#: storage/ipc/signalfuncs.c:170 +#: storage/ipc/signalfuncs.c:179 #, c-format msgid "could not check the existence of the backend with PID %d: %m" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ наÑвніÑть процеÑу з PID %d: %m" -#: storage/ipc/signalfuncs.c:188 +#: storage/ipc/signalfuncs.c:197 #, c-format msgid "backend with PID %d did not terminate within %lld millisecond" msgid_plural "backend with PID %d did not terminate within %lld milliseconds" @@ -21358,327 +22441,320 @@ msgstr[1] "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð· PID %d не завершивÑÑ Ð¿Ñ€Ð¾Ñ‚Ñгом %ll msgstr[2] "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð· PID %d не завершивÑÑ Ð¿Ñ€Ð¾Ñ‚Ñгом %lld міліÑекунд" msgstr[3] "Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð· PID %d не завершивÑÑ Ð¿Ñ€Ð¾Ñ‚Ñгом %lld міліÑекунд" -#: storage/ipc/signalfuncs.c:219 +#: storage/ipc/signalfuncs.c:228 #, c-format msgid "\"timeout\" must not be negative" msgstr "\"timeout\" повинен не може бути негативним" -#: storage/ipc/signalfuncs.c:271 -#, c-format -msgid "must be superuser to rotate log files with adminpack 1.0" -msgstr "прокручувати файли протоколів викориÑтовуючи adminpack 1.0, може лише ÑуперкориÑтувач" - -#. translator: %s is a SQL function name -#: storage/ipc/signalfuncs.c:273 utils/adt/genfile.c:250 -#, c-format -msgid "Consider using %s, which is part of core, instead." -msgstr "РозглÑньте викориÑÑ‚Ð°Ð½Ð½Ñ %s, що Ñ” чаÑтиною Ñдра." - -#: storage/ipc/signalfuncs.c:279 storage/ipc/signalfuncs.c:299 +#: storage/ipc/signalfuncs.c:285 #, c-format msgid "rotation not possible because log collection not active" msgstr "Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ðµ тому, що запиÑÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð»ÐµÐºÑ†Ñ–Ñ— не активоване" -#: storage/ipc/standby.c:307 +#: storage/ipc/standby.c:329 #, c-format msgid "recovery still waiting after %ld.%03d ms: %s" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñе ще чекає, піÑÐ»Ñ %ld.%03d мÑ: %s" -#: storage/ipc/standby.c:316 +#: storage/ipc/standby.c:338 #, c-format msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ð»Ð¾ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ %ld.%03d мÑ: %s" -#: storage/ipc/standby.c:883 tcop/postgres.c:3332 +#: storage/ipc/standby.c:920 tcop/postgres.c:3196 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ÑкаÑовано через конфлікт з процеÑом відновленнÑ" -#: storage/ipc/standby.c:884 tcop/postgres.c:2487 +#: storage/ipc/standby.c:921 tcop/postgres.c:2557 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ ÐºÐ¾Ñ€Ð¸Ñтувача призвела до взаємного Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð· процеÑом відновленнÑ." -#: storage/ipc/standby.c:1423 +#: storage/ipc/standby.c:1486 msgid "unknown reason" msgstr "невідома причина" -#: storage/ipc/standby.c:1428 +#: storage/ipc/standby.c:1491 msgid "recovery conflict on buffer pin" msgstr "конфлікт відновленнÑ, закріпленого в буфері" -#: storage/ipc/standby.c:1431 +#: storage/ipc/standby.c:1494 msgid "recovery conflict on lock" msgstr "конфлікт Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ блокуванні" -#: storage/ipc/standby.c:1434 +#: storage/ipc/standby.c:1497 msgid "recovery conflict on tablespace" msgstr "конфлікт Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñƒ табличному проÑторі" -#: storage/ipc/standby.c:1437 +#: storage/ipc/standby.c:1500 msgid "recovery conflict on snapshot" msgstr "конфлікт Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð·Ð½Ñ–Ð¼ÐºÑƒ" -#: storage/ipc/standby.c:1440 +#: storage/ipc/standby.c:1503 +msgid "recovery conflict on replication slot" +msgstr "конфлікт Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñƒ Ñлоті реплікації" + +#: storage/ipc/standby.c:1506 msgid "recovery conflict on buffer deadlock" msgstr "конфлікт Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ взаємному блокуванні буфера" -#: storage/ipc/standby.c:1443 +#: storage/ipc/standby.c:1509 msgid "recovery conflict on database" msgstr "конфлікт Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñƒ базі даних" -#: storage/large_object/inv_api.c:191 +#: storage/large_object/inv_api.c:190 #, c-format msgid "pg_largeobject entry for OID %u, page %d has invalid data field size %d" msgstr "у введенні pg_largeobject Ð´Ð»Ñ OID %u, Ñторінка %d має неприпуÑтимий розмір Ð¿Ð¾Ð»Ñ Ð´Ð°Ð½Ð¸Ñ… %d" -#: storage/large_object/inv_api.c:274 +#: storage/large_object/inv_api.c:272 #, c-format msgid "invalid flags for opening a large object: %d" msgstr "неприпуÑтимі позначки Ð´Ð»Ñ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об'єкту: %d" -#: storage/large_object/inv_api.c:457 +#: storage/large_object/inv_api.c:297 storage/large_object/inv_api.c:309 +#: storage/large_object/inv_api.c:506 storage/large_object/inv_api.c:617 +#: storage/large_object/inv_api.c:807 +#, c-format +msgid "permission denied for large object %u" +msgstr "немає дозволу Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об'єкта %u" + +#: storage/large_object/inv_api.c:455 #, c-format msgid "invalid whence setting: %d" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ñ€Ñ–Ñ”Ð½Ñ‚Ð¸Ñ€Ñƒ: %d" -#: storage/large_object/inv_api.c:629 +#: storage/large_object/inv_api.c:627 #, c-format msgid "invalid large object write request size: %d" msgstr "неприпуÑтимий розмір запиÑу великого об'єкту: %d" -#: storage/lmgr/deadlock.c:1122 +#: storage/lmgr/deadlock.c:1104 #, c-format msgid "Process %d waits for %s on %s; blocked by process %d." msgstr "ÐŸÑ€Ð¾Ñ†ÐµÑ %d очікує в режимі %s Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"; заблокований процеÑом %d." -#: storage/lmgr/deadlock.c:1141 +#: storage/lmgr/deadlock.c:1123 #, c-format msgid "Process %d: %s" msgstr "ÐŸÑ€Ð¾Ñ†ÐµÑ %d: %s" -#: storage/lmgr/deadlock.c:1150 +#: storage/lmgr/deadlock.c:1132 #, c-format msgid "deadlock detected" msgstr "виÑвлено взаємне блокуваннÑ" -#: storage/lmgr/deadlock.c:1153 +#: storage/lmgr/deadlock.c:1135 #, c-format msgid "See server log for query details." msgstr "Подробиці запиту переглÑньте в запиÑÑ– Ñерверу." -#: storage/lmgr/lmgr.c:859 +#: storage/lmgr/lmgr.c:848 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "при оновленні кортежу (%u,%u) в зв'Ñзку \"%s\"" -#: storage/lmgr/lmgr.c:862 +#: storage/lmgr/lmgr.c:851 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "при видаленні кортежу (%u,%u) в зв'Ñзку \"%s\"" -#: storage/lmgr/lmgr.c:865 +#: storage/lmgr/lmgr.c:854 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "при блокуванні кортежу (%u,%u) в зв'Ñзку \"%s\"" -#: storage/lmgr/lmgr.c:868 +#: storage/lmgr/lmgr.c:857 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "при блокуванні оновленої верÑÑ–Ñ— (%u,%u) кортежу в зв'Ñзку \"%s\"" -#: storage/lmgr/lmgr.c:871 +#: storage/lmgr/lmgr.c:860 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "при вÑтавці кортежу індекÑу (%u,%u) в зв'Ñзку \"%s\"" -#: storage/lmgr/lmgr.c:874 +#: storage/lmgr/lmgr.c:863 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ унікальноÑті кортежа (%u,%u) у відношенні \"%s\"" -#: storage/lmgr/lmgr.c:877 +#: storage/lmgr/lmgr.c:866 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "під Ñ‡Ð°Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ñ— перевірки оновленого кортежа (%u,%u) у відношенні \"%s\"" -#: storage/lmgr/lmgr.c:880 +#: storage/lmgr/lmgr.c:869 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ обмеженнÑ-Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ‚ÐµÐ¶Ð° (%u,%u) у відношенні \"%s\"" -#: storage/lmgr/lmgr.c:1135 +#: storage/lmgr/lmgr.c:1239 #, c-format msgid "relation %u of database %u" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %u бази даних %u" -#: storage/lmgr/lmgr.c:1141 +#: storage/lmgr/lmgr.c:1245 #, c-format msgid "extension of relation %u of database %u" msgstr "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %u бази даних %u" -#: storage/lmgr/lmgr.c:1147 +#: storage/lmgr/lmgr.c:1251 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid бази даних %u" -#: storage/lmgr/lmgr.c:1152 +#: storage/lmgr/lmgr.c:1256 #, c-format msgid "page %u of relation %u of database %u" msgstr "Ñторінка %u Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %u бази даних %u" -#: storage/lmgr/lmgr.c:1159 +#: storage/lmgr/lmgr.c:1263 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "кортеж (%u,%u) Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %u бази даних %u" -#: storage/lmgr/lmgr.c:1167 +#: storage/lmgr/lmgr.c:1271 #, c-format msgid "transaction %u" msgstr "Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ %u" -#: storage/lmgr/lmgr.c:1172 +#: storage/lmgr/lmgr.c:1276 #, c-format msgid "virtual transaction %d/%u" msgstr "віртуальна Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ %d/%u" -#: storage/lmgr/lmgr.c:1178 +#: storage/lmgr/lmgr.c:1282 #, c-format msgid "speculative token %u of transaction %u" msgstr "орієнтовний маркер %u транзакції %u" -#: storage/lmgr/lmgr.c:1184 +#: storage/lmgr/lmgr.c:1288 #, c-format msgid "object %u of class %u of database %u" msgstr "об’єкт %u клаÑу %u бази даних %u" -#: storage/lmgr/lmgr.c:1192 +#: storage/lmgr/lmgr.c:1296 #, c-format msgid "user lock [%u,%u,%u]" msgstr "кориÑтувацьке Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1199 +#: storage/lmgr/lmgr.c:1303 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "рекомендаційне Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1207 +#: storage/lmgr/lmgr.c:1311 +#, c-format +msgid "remote transaction %u of subscription %u of database %u" +msgstr "віддалена Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ %u з підпиÑки %u з бази даних %u" + +#: storage/lmgr/lmgr.c:1318 #, c-format msgid "unrecognized locktag type %d" msgstr "нерозпізнаний тип Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ %d" -#: storage/lmgr/lock.c:803 +#: storage/lmgr/lock.c:812 #, c-format msgid "cannot acquire lock mode %s on database objects while recovery is in progress" msgstr "поки виконуєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ, не можна отримати Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð±'єктів бази даних в режимі %s" -#: storage/lmgr/lock.c:805 +#: storage/lmgr/lock.c:814 #, c-format msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "Під Ñ‡Ð°Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¾Ð±'єктів бази даних може бути отримане лише Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ RowExclusiveLock або менш Ñильна." -#: storage/lmgr/lock.c:983 storage/lmgr/lock.c:1021 storage/lmgr/lock.c:2846 -#: storage/lmgr/lock.c:4260 storage/lmgr/lock.c:4325 storage/lmgr/lock.c:4675 -#, c-format -msgid "You might need to increase max_locks_per_transaction." -msgstr "Можливо, Ñлід збільшити параметр max_locks_per_transaction." - -#: storage/lmgr/lock.c:3301 storage/lmgr/lock.c:3369 storage/lmgr/lock.c:3485 +#: storage/lmgr/lock.c:3284 storage/lmgr/lock.c:3352 storage/lmgr/lock.c:3468 #, c-format msgid "cannot PREPARE while holding both session-level and transaction-level locks on the same object" msgstr "не можна виконати PREPARE, під Ñ‡Ð°Ñ ÑƒÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° рівні ÑеанÑу Ñ– на рівні транзакції Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ об'єкта" -#: storage/lmgr/predicate.c:700 +#: storage/lmgr/predicate.c:653 #, c-format msgid "not enough elements in RWConflictPool to record a read/write conflict" msgstr "в RWConflictPool недоÑтатньо елементів Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу про конфлікт читаннÑ/запиÑу" -#: storage/lmgr/predicate.c:701 storage/lmgr/predicate.c:729 +#: storage/lmgr/predicate.c:654 storage/lmgr/predicate.c:679 #, c-format -msgid "You might need to run fewer transactions at a time or increase max_connections." -msgstr "Можливо, вам Ñлід виконувати менше транзакцій в Ñекунду або збільшити параметр max_connections." +msgid "You might need to run fewer transactions at a time or increase \"max_connections\"." +msgstr "Можливо, вам Ñлід виконувати менше транзакцій в Ñекунду або збільшити параметр \"max_connections\"." -#: storage/lmgr/predicate.c:728 +#: storage/lmgr/predicate.c:678 #, c-format msgid "not enough elements in RWConflictPool to record a potential read/write conflict" msgstr "в RWConflictPool недоÑтатньо елементів Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу про потенціальний конфлікт читаннÑ/запиÑу" -#: storage/lmgr/predicate.c:1695 +#: storage/lmgr/predicate.c:1686 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "параметр \"default_transaction_isolation\" має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"serializable\"." -#: storage/lmgr/predicate.c:1696 +#: storage/lmgr/predicate.c:1687 #, c-format msgid "You can use \"SET default_transaction_isolation = 'repeatable read'\" to change the default." msgstr "Ви можете викориÑтати \"SET default_transaction_isolation = 'repeatable read'\" щоб змінити режим за замовчуваннÑм." -#: storage/lmgr/predicate.c:1747 +#: storage/lmgr/predicate.c:1738 #, c-format msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "транзакціÑ, Ñка імпортує знімок не повинна бутив READ ONLY DEFERRABLE" -#: storage/lmgr/predicate.c:1826 utils/time/snapmgr.c:569 -#: utils/time/snapmgr.c:575 +#: storage/lmgr/predicate.c:1817 utils/time/snapmgr.c:535 +#: utils/time/snapmgr.c:541 #, c-format msgid "could not import the requested snapshot" msgstr "не вдалоÑÑ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸ запитаний знімок" -#: storage/lmgr/predicate.c:1827 utils/time/snapmgr.c:576 +#: storage/lmgr/predicate.c:1818 utils/time/snapmgr.c:542 #, c-format msgid "The source process with PID %d is not running anymore." msgstr "Вихідний Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð· PID %d вже не виконуєтьÑÑ." -#: storage/lmgr/predicate.c:2473 storage/lmgr/predicate.c:2488 -#: storage/lmgr/predicate.c:3970 -#, c-format -msgid "You might need to increase max_pred_locks_per_transaction." -msgstr "Можливо, вам Ñлід збільшити параметр max_pred_locks_per_transaction." - -#: storage/lmgr/predicate.c:4101 storage/lmgr/predicate.c:4137 -#: storage/lmgr/predicate.c:4170 storage/lmgr/predicate.c:4178 -#: storage/lmgr/predicate.c:4217 storage/lmgr/predicate.c:4459 -#: storage/lmgr/predicate.c:4796 storage/lmgr/predicate.c:4808 -#: storage/lmgr/predicate.c:4851 storage/lmgr/predicate.c:4889 +#: storage/lmgr/predicate.c:3991 storage/lmgr/predicate.c:4027 +#: storage/lmgr/predicate.c:4060 storage/lmgr/predicate.c:4068 +#: storage/lmgr/predicate.c:4107 storage/lmgr/predicate.c:4337 +#: storage/lmgr/predicate.c:4656 storage/lmgr/predicate.c:4668 +#: storage/lmgr/predicate.c:4715 storage/lmgr/predicate.c:4751 #, c-format msgid "could not serialize access due to read/write dependencies among transactions" msgstr "не вдалоÑÑ Ñеріалізувати доÑтуп через залежніÑть читаннÑ/запиÑу Ñеред транзакцій" -#: storage/lmgr/predicate.c:4103 storage/lmgr/predicate.c:4139 -#: storage/lmgr/predicate.c:4172 storage/lmgr/predicate.c:4180 -#: storage/lmgr/predicate.c:4219 storage/lmgr/predicate.c:4461 -#: storage/lmgr/predicate.c:4798 storage/lmgr/predicate.c:4810 -#: storage/lmgr/predicate.c:4853 storage/lmgr/predicate.c:4891 +#: storage/lmgr/predicate.c:3993 storage/lmgr/predicate.c:4029 +#: storage/lmgr/predicate.c:4062 storage/lmgr/predicate.c:4070 +#: storage/lmgr/predicate.c:4109 storage/lmgr/predicate.c:4339 +#: storage/lmgr/predicate.c:4658 storage/lmgr/predicate.c:4670 +#: storage/lmgr/predicate.c:4717 storage/lmgr/predicate.c:4753 #, c-format msgid "The transaction might succeed if retried." msgstr "Ð¢Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð¼Ð¾Ð¶Ðµ завершитиÑÑ ÑƒÑпішно, Ñкщо повторити Ñпробу." -#: storage/lmgr/proc.c:355 +#: storage/lmgr/proc.c:353 #, c-format -msgid "number of requested standby connections exceeds max_wal_senders (currently %d)" -msgstr "кількіÑть запитаних підключень резервного Ñерверу перевищує max_wal_senders (поточна %d)" +msgid "number of requested standby connections exceeds \"max_wal_senders\" (currently %d)" +msgstr "кількіÑть запитаних підключень резервного Ñерверу перевищує \"max_wal_senders\" (поточна %d)" -#: storage/lmgr/proc.c:1527 +#: storage/lmgr/proc.c:1546 #, c-format msgid "process %d avoided deadlock for %s on %s by rearranging queue order after %ld.%03d ms" msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ %d уникнув взаємного блокуваннÑ, чекаючи в режимі %s Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ %s змінивши порÑдок черги піÑÐ»Ñ %ld.%03d мÑ" -#: storage/lmgr/proc.c:1542 +#: storage/lmgr/proc.c:1561 #, c-format msgid "process %d detected deadlock while waiting for %s on %s after %ld.%03d ms" msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ %d виÑвив взаємне блокуваннÑ, чекаючи в режимі %s Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ %s піÑÐ»Ñ %ld.%03d мÑ" -#: storage/lmgr/proc.c:1551 +#: storage/lmgr/proc.c:1570 #, c-format msgid "process %d still waiting for %s on %s after %ld.%03d ms" msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ %d вÑе ще чекає в режимі %s Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ %s піÑÐ»Ñ %ld.%03d мÑ" -#: storage/lmgr/proc.c:1558 +#: storage/lmgr/proc.c:1577 #, c-format msgid "process %d acquired %s on %s after %ld.%03d ms" msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ %d отримав в режимі %s Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ %s піÑÐ»Ñ %ld.%03d мÑ" -#: storage/lmgr/proc.c:1575 +#: storage/lmgr/proc.c:1594 #, c-format msgid "process %d failed to acquire %s on %s after %ld.%03d ms" msgstr "Ð¿Ñ€Ð¾Ñ†ÐµÑ %d не зміг отримати в режимі %s Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ %s піÑÐ»Ñ %ld.%03d мÑ" @@ -21711,391 +22787,561 @@ msgstr "пошкоджена довжина елементу: загальний msgid "corrupted line pointer: offset = %u, size = %u" msgstr "пошкоджений вказівник Ñ€Ñдка: зÑув = %u, розмір = %u" -#: storage/smgr/md.c:456 +#: storage/smgr/md.c:485 storage/smgr/md.c:547 #, c-format msgid "cannot extend file \"%s\" beyond %u blocks" msgstr "не можна розширити файл \"%s\" до блоку %u" -#: storage/smgr/md.c:471 +#: storage/smgr/md.c:500 storage/smgr/md.c:611 #, c-format msgid "could not extend file \"%s\": %m" msgstr "не вдалоÑÑ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€Ð¸Ñ‚Ð¸ файл \"%s\": %m" -#: storage/smgr/md.c:477 +#: storage/smgr/md.c:506 #, c-format msgid "could not extend file \"%s\": wrote only %d of %d bytes at block %u" msgstr "не вдалоÑÑ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€Ð¸Ñ‚Ð¸ файл \"%s\" запиÑано лише %d з %d байт в блоку %u" -#: storage/smgr/md.c:692 +#: storage/smgr/md.c:589 #, c-format -msgid "could not read block %u in file \"%s\": %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ блок %u в файлі \"%s\": %m" +msgid "could not extend file \"%s\" with FileFallocate(): %m" +msgstr "не вдалоÑÑ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€Ð¸Ñ‚Ð¸ файл \"%s\" за допомогою FileFallocate(): %m" -#: storage/smgr/md.c:708 +#: storage/smgr/md.c:869 #, c-format -msgid "could not read block %u in file \"%s\": read only %d of %d bytes" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ блок %u в файлі \"%s\": прочитано лише %d з %d байт" +msgid "could not read blocks %u..%u in file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ блоки %u..%u у файлі \"%s\": %m" -#: storage/smgr/md.c:762 +#: storage/smgr/md.c:895 #, c-format -msgid "could not write block %u in file \"%s\": %m" -msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати блок %u у файл \"%s\": %m" +msgid "could not read blocks %u..%u in file \"%s\": read only %zu of %zu bytes" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ блоки %u..%u у файлі \"%s\": прочитано лише %zu з %zu байтів" -#: storage/smgr/md.c:767 +#: storage/smgr/md.c:995 #, c-format -msgid "could not write block %u in file \"%s\": wrote only %d of %d bytes" -msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати блок %u в файл \"%s\": запиÑано лише %d з %d байт" +msgid "could not write blocks %u..%u in file \"%s\": %m" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати блоки %u..%u у файл \"%s\": %m" -#: storage/smgr/md.c:861 +#: storage/smgr/md.c:1165 #, c-format msgid "could not truncate file \"%s\" to %u blocks: it's only %u blocks now" msgstr "не вдалоÑÑ Ñкоротити файл \"%s\" до %u блоків: лише %u блоків зараз" -#: storage/smgr/md.c:916 +#: storage/smgr/md.c:1220 #, c-format msgid "could not truncate file \"%s\" to %u blocks: %m" msgstr "не вдалоÑÑ Ñкоротити файл \"%s\" до %u блоків: %m" -#: storage/smgr/md.c:1315 +#: storage/smgr/md.c:1700 #, c-format msgid "could not open file \"%s\" (target block %u): previous segment is only %u blocks" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" (цільовий блок %u): попередній Ñегмент має лише %u блоків" -#: storage/smgr/md.c:1329 +#: storage/smgr/md.c:1714 +#, c-format +msgid "could not open file \"%s\" (target block %u): %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" (цільовий блок %u): %m" + +#: tcop/backend_startup.c:85 +#, c-format +msgid "SSL configuration could not be loaded in child process" +msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ конфігурацію SSL в дочірній процеÑ" + +#: tcop/backend_startup.c:208 +#, c-format +msgid "connection received: host=%s port=%s" +msgstr "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð¾: хоÑÑ‚=%s порт=%s" + +#: tcop/backend_startup.c:213 +#, c-format +msgid "connection received: host=%s" +msgstr "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð¾: хоÑÑ‚=%s" + +#: tcop/backend_startup.c:277 +#, c-format +msgid "the database system is starting up" +msgstr "ÑиÑтема бази даних запуÑкаєтьÑÑ" + +#: tcop/backend_startup.c:283 +#, c-format +msgid "the database system is not yet accepting connections" +msgstr "ÑиÑтема бази даних ще не приймає підключеннÑ" + +#: tcop/backend_startup.c:284 +#, c-format +msgid "Consistent recovery state has not been yet reached." +msgstr "Узгодженого Ñтану Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‰Ðµ не доÑÑгнуто." + +#: tcop/backend_startup.c:288 +#, c-format +msgid "the database system is not accepting connections" +msgstr "ÑиÑтема бази даних не приймає підключеннÑ" + +#: tcop/backend_startup.c:289 +#, c-format +msgid "Hot standby mode is disabled." +msgstr "Режим Hot standby вимкнений." + +#: tcop/backend_startup.c:294 +#, c-format +msgid "the database system is shutting down" +msgstr "ÑиÑтема бази даних завершує роботу" + +#: tcop/backend_startup.c:299 +#, c-format +msgid "the database system is in recovery mode" +msgstr "ÑиÑтема бази даних у режимі відновленнÑ" + +#: tcop/backend_startup.c:414 +#, c-format +msgid "received direct SSL connection request without ALPN protocol negotiation extension" +msgstr "отримано запит на Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ SSL без Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ ALPN" + +#: tcop/backend_startup.c:420 +#, c-format +msgid "direct SSL connection accepted" +msgstr "прийнÑто прÑме SSL-підключеннÑ" + +#: tcop/backend_startup.c:430 +#, c-format +msgid "direct SSL connection rejected" +msgstr "прÑме SSL Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ñ…Ð¸Ð»ÐµÐ½Ð¾" + +#: tcop/backend_startup.c:489 tcop/backend_startup.c:517 +#, c-format +msgid "incomplete startup packet" +msgstr "неповний Ñтартовий пакет" + +#: tcop/backend_startup.c:501 tcop/backend_startup.c:538 +#, c-format +msgid "invalid length of startup packet" +msgstr "неприпуÑтима довжина Ñтартового пакету" + +#: tcop/backend_startup.c:573 +#, c-format +msgid "SSLRequest accepted" +msgstr "SSLRequest прийнÑто" + +#: tcop/backend_startup.c:576 +#, c-format +msgid "SSLRequest rejected" +msgstr "SSLRequest відхилено" + +#: tcop/backend_startup.c:585 +#, c-format +msgid "failed to send SSL negotiation response: %m" +msgstr "помилка надÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ SSL в процеÑÑ– відповіді зв'ÑзуваннÑ: %m" + +#: tcop/backend_startup.c:603 +#, c-format +msgid "received unencrypted data after SSL request" +msgstr "отримані незашифровані дані піÑÐ»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ SSL" + +#: tcop/backend_startup.c:604 tcop/backend_startup.c:658 +#, c-format +msgid "This could be either a client-software bug or evidence of an attempted man-in-the-middle attack." +msgstr "Це може бути або помилкою клієнтÑького програмного забезпеченнÑ, або доказом Ñпроби техноÑферної атаки." + +#: tcop/backend_startup.c:627 +#, c-format +msgid "GSSENCRequest accepted" +msgstr "GSSENCRequest прийнÑтий" + +#: tcop/backend_startup.c:630 +#, c-format +msgid "GSSENCRequest rejected" +msgstr "GSSENCRequest відхилений" + +#: tcop/backend_startup.c:639 +#, c-format +msgid "failed to send GSSAPI negotiation response: %m" +msgstr "помилка надÑÐ¸Ð»Ð°Ð½Ð½Ñ GSSAPI в процеÑÑ– відповіді зв'ÑзуваннÑ: %m" + +#: tcop/backend_startup.c:657 +#, c-format +msgid "received unencrypted data after GSSAPI encryption request" +msgstr "отримані незашифровані дані піÑÐ»Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ GSSAPI" + +#: tcop/backend_startup.c:681 +#, c-format +msgid "unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u" +msgstr "протокол інтерфейÑу, що не підтримуєтьÑÑ, %u.%u: Ñервер підтримує %u.0 до %u.%u" + +#: tcop/backend_startup.c:744 +#, c-format +msgid "Valid values are: \"false\", 0, \"true\", 1, \"database\"." +msgstr "ДійÑні значеннÑ: \"false\", 0, \"true\", 1, \"database\"." + +#: tcop/backend_startup.c:785 +#, c-format +msgid "invalid startup packet layout: expected terminator as last byte" +msgstr "неприпуÑтима Ñтруктура Ñтартового пакету: оÑтаннім байтом очікувавÑÑ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ð°Ñ‚Ð¾Ñ€" + +#: tcop/backend_startup.c:802 +#, c-format +msgid "no PostgreSQL user name specified in startup packet" +msgstr "не вказано жодного ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача PostgreSQL у Ñтартовому пакеті" + +#: tcop/fastpath.c:142 utils/fmgr/fmgr.c:2161 #, c-format -msgid "could not open file \"%s\" (target block %u): %m" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" (цільовий блок %u): %m" +msgid "function with OID %u does not exist" +msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð· OID %u не Ñ–Ñнує" -#: tcop/fastpath.c:148 +#: tcop/fastpath.c:149 #, c-format msgid "cannot call function \"%s\" via fastpath interface" msgstr "неможливо викликати функцію \"%s\" через Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ fastpath" -#: tcop/fastpath.c:233 +#: tcop/fastpath.c:234 #, c-format msgid "fastpath function call: \"%s\" (OID %u)" msgstr "виклик функції fastpath: \"%s\" (OID %u)" -#: tcop/fastpath.c:312 tcop/postgres.c:1341 tcop/postgres.c:1577 -#: tcop/postgres.c:2036 tcop/postgres.c:2268 +#: tcop/fastpath.c:313 tcop/postgres.c:1369 tcop/postgres.c:1605 +#: tcop/postgres.c:2071 tcop/postgres.c:2333 #, c-format msgid "duration: %s ms" msgstr "триваліÑть: %s мÑ" -#: tcop/fastpath.c:316 +#: tcop/fastpath.c:317 #, c-format msgid "duration: %s ms fastpath function call: \"%s\" (OID %u)" msgstr "триваліÑть: %s мÑ, виклик функції fastpath: \"%s\" (OID %u)" -#: tcop/fastpath.c:352 +#: tcop/fastpath.c:353 #, c-format msgid "function call message contains %d arguments but function requires %d" msgstr "Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ функції міÑтить %d аргументів, але Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±ÑƒÑ” %d" -#: tcop/fastpath.c:360 +#: tcop/fastpath.c:361 #, c-format msgid "function call message contains %d argument formats but %d arguments" msgstr "Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ функції міÑтить %d форматів, але %d аргументів" -#: tcop/fastpath.c:384 +#: tcop/fastpath.c:385 #, c-format msgid "invalid argument size %d in function call message" msgstr "неприпуÑтимий розмір аргументу %d в повідомленні виклику функції" -#: tcop/fastpath.c:447 +#: tcop/fastpath.c:448 #, c-format msgid "incorrect binary data format in function argument %d" msgstr "неправильний формат двійкових даних в аргументі функції %d" -#: tcop/postgres.c:444 tcop/postgres.c:4811 +#: tcop/postgres.c:467 tcop/postgres.c:5012 #, c-format msgid "invalid frontend message type %d" msgstr "неприпуÑтимий тип клієнтÑького Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ %d" -#: tcop/postgres.c:1051 +#: tcop/postgres.c:1076 #, c-format msgid "statement: %s" msgstr "оператор: %s" -#: tcop/postgres.c:1346 +#: tcop/postgres.c:1374 #, c-format msgid "duration: %s ms statement: %s" msgstr "триваліÑть: %s мÑ, оператор: %s" -#: tcop/postgres.c:1452 +#: tcop/postgres.c:1480 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "до підтготовленого оператору не можна вÑтавити декілька команд" -#: tcop/postgres.c:1582 +#: tcop/postgres.c:1610 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "триваліÑть: %s мÑ, Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ð½Ð½Ñ %s: %s" -#: tcop/postgres.c:1648 tcop/postgres.c:2583 +#: tcop/postgres.c:1677 tcop/postgres.c:2653 #, c-format msgid "unnamed prepared statement does not exist" msgstr "підготовлений оператор без імені не Ñ–Ñнує" -#: tcop/postgres.c:1689 +#: tcop/postgres.c:1729 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ bind має %d форматів, але %d параметрів" -#: tcop/postgres.c:1695 +#: tcop/postgres.c:1735 #, c-format msgid "bind message supplies %d parameters, but prepared statement \"%s\" requires %d" msgstr "в повідомленні bind передано %d параметрів, але підготовлений оператор \"%s\" потребує %d" -#: tcop/postgres.c:1914 +#: tcop/postgres.c:1949 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "невірний формат двійкових даних в параметрі bind %d" -#: tcop/postgres.c:2041 +#: tcop/postgres.c:2076 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "триваліÑть: %s мÑ, Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ bind %s%s%s: %s" -#: tcop/postgres.c:2091 tcop/postgres.c:2666 +#: tcop/postgres.c:2131 tcop/postgres.c:2735 #, c-format msgid "portal \"%s\" does not exist" msgstr "портал \"%s\" не Ñ–Ñнує" -#: tcop/postgres.c:2160 +#: tcop/postgres.c:2213 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2162 tcop/postgres.c:2276 +#: tcop/postgres.c:2215 tcop/postgres.c:2341 msgid "execute fetch from" msgstr "виконати витÑÐ³Ð½ÐµÐ½Ð½Ñ Ð·" -#: tcop/postgres.c:2163 tcop/postgres.c:2277 +#: tcop/postgres.c:2216 tcop/postgres.c:2342 msgid "execute" msgstr "виконувати" -#: tcop/postgres.c:2273 +#: tcop/postgres.c:2338 #, c-format msgid "duration: %s ms %s %s%s%s: %s" msgstr "триваліÑть: %s Ð¼Ñ %s %s%s%s: %s" -#: tcop/postgres.c:2419 +#: tcop/postgres.c:2486 #, c-format msgid "prepare: %s" msgstr "підготовка: %s" -#: tcop/postgres.c:2444 +#: tcop/postgres.c:2511 #, c-format -msgid "parameters: %s" -msgstr "параметри: %s" +msgid "Parameters: %s" +msgstr "Параметри: %s" -#: tcop/postgres.c:2459 +#: tcop/postgres.c:2526 #, c-format -msgid "abort reason: recovery conflict" -msgstr "причина перериваннÑ: конфлікт під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ" +msgid "Abort reason: recovery conflict" +msgstr "Причина перериваннÑ: конфлікт відновленнÑ" -#: tcop/postgres.c:2475 +#: tcop/postgres.c:2542 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "КориÑтувач утримував позначку Ñпільного буферу занадто довго." -#: tcop/postgres.c:2478 +#: tcop/postgres.c:2545 #, c-format msgid "User was holding a relation lock for too long." msgstr "КориÑтувач утримував Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ довго." -#: tcop/postgres.c:2481 +#: tcop/postgres.c:2548 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "КориÑтувач викориÑтовував табличний проÑтір Ñкий повинен бути видаленим." -#: tcop/postgres.c:2484 +#: tcop/postgres.c:2551 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "Запиту кориÑтувача потрібно було бачити верÑÑ–Ñ— Ñ€Ñдків, Ñкі повинні бути видалені." -#: tcop/postgres.c:2490 +#: tcop/postgres.c:2554 +#, c-format +msgid "User was using a logical replication slot that must be invalidated." +msgstr "КориÑтувач викориÑтовував логічний Ñлот реплікації, Ñкий повинен бути анульований." + +#: tcop/postgres.c:2560 #, c-format msgid "User was connected to a database that must be dropped." msgstr "КориÑтувач був підключен до бази даних, Ñка повинна бути видалена." -#: tcop/postgres.c:2529 +#: tcop/postgres.c:2599 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "параметр порталу \"%s\": $%d = %s" -#: tcop/postgres.c:2532 +#: tcop/postgres.c:2602 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "параметр порталу \"%s\": $%d" -#: tcop/postgres.c:2538 +#: tcop/postgres.c:2608 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "параметр порталу без назви $%d = %s" -#: tcop/postgres.c:2541 +#: tcop/postgres.c:2611 #, c-format msgid "unnamed portal parameter $%d" msgstr "параметр порталу без назви $%d" -#: tcop/postgres.c:2886 +#: tcop/postgres.c:2955 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· неочікуваний Ñигнал SIGQUIT" -#: tcop/postgres.c:2892 +#: tcop/postgres.c:2961 #, c-format msgid "terminating connection because of crash of another server process" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· аварійне Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ іншого Ñерверного процеÑу" -#: tcop/postgres.c:2893 +#: tcop/postgres.c:2962 #, c-format msgid "The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory." msgstr "Керуючий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð²Ñ–Ð´Ð´Ð°Ð² команду цьому Ñерверному процеÑу відкотити поточну транзакцію Ñ– завершитиÑÑ, тому, що інший Ñерверний Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾ Ñ– можливо пошкодив Ñпільну пам'Ñть." -#: tcop/postgres.c:2897 tcop/postgres.c:3258 +#: tcop/postgres.c:2966 tcop/postgres.c:3219 #, c-format msgid "In a moment you should be able to reconnect to the database and repeat your command." msgstr "Ð’ цей момент ви можете повторно підключитиÑÑ Ð´Ð¾ бази даних Ñ– повторити вашу команду." -#: tcop/postgres.c:2904 +#: tcop/postgres.c:2973 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· команду негайного Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸" -#: tcop/postgres.c:2990 +#: tcop/postgres.c:3051 #, c-format msgid "floating-point exception" msgstr "винÑток в операції з рухомою комою" -#: tcop/postgres.c:2991 +#: tcop/postgres.c:3052 #, c-format msgid "An invalid floating-point operation was signaled. This probably means an out-of-range result or an invalid operation, such as division by zero." msgstr "Ðадійшло Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ неприпуÑтиму операцію з рухомою комою. Можливо, це значить, що результат виÑвивÑÑ Ð·Ð° діапазоном або виникла неприпуÑтима операціÑ, така Ñк Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð½Ð° нуль." -#: tcop/postgres.c:3162 +#: tcop/postgres.c:3217 +#, c-format +msgid "terminating connection due to conflict with recovery" +msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· конфлікт з процеÑом відновленнÑ" + +#: tcop/postgres.c:3289 #, c-format msgid "canceling authentication due to timeout" msgstr "ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— через тайм-аут" -#: tcop/postgres.c:3166 +#: tcop/postgres.c:3293 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑу автоочиÑтки по команді адмініÑтратора" -#: tcop/postgres.c:3170 +#: tcop/postgres.c:3297 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ð±Ñ€Ð¾Ð±Ð½Ð¸ÐºÐ° логічної реплікації по команді адмініÑтратора" -#: tcop/postgres.c:3187 tcop/postgres.c:3197 tcop/postgres.c:3256 -#, c-format -msgid "terminating connection due to conflict with recovery" -msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· конфлікт з процеÑом відновленнÑ" - -#: tcop/postgres.c:3208 +#: tcop/postgres.c:3317 #, c-format msgid "terminating connection due to administrator command" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¿Ð¾ команді адмініÑтратора" -#: tcop/postgres.c:3239 +#: tcop/postgres.c:3348 #, c-format msgid "connection to client lost" msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ клієнта втрачено" -#: tcop/postgres.c:3309 +#: tcop/postgres.c:3400 #, c-format msgid "canceling statement due to lock timeout" msgstr "Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ÑкаÑовано через тайм-аут блокуваннÑ" -#: tcop/postgres.c:3316 +#: tcop/postgres.c:3407 #, c-format msgid "canceling statement due to statement timeout" msgstr "Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ÑкаÑовано через тайм-аут" -#: tcop/postgres.c:3323 +#: tcop/postgres.c:3414 #, c-format msgid "canceling autovacuum task" msgstr "ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ñ‡Ð¸Ñтки" -#: tcop/postgres.c:3346 +#: tcop/postgres.c:3427 #, c-format msgid "canceling statement due to user request" msgstr "Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° ÑкаÑовано по запиту кориÑтувача" -#: tcop/postgres.c:3360 +#: tcop/postgres.c:3448 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· тайм-аут бездіÑльноÑті в транзакції" -#: tcop/postgres.c:3371 +#: tcop/postgres.c:3461 +#, c-format +msgid "terminating connection due to transaction timeout" +msgstr "Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· тайм-аут транзакції" + +#: tcop/postgres.c:3474 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· тайм-аут неактивного ÑеанÑу" -#: tcop/postgres.c:3511 +#: tcop/postgres.c:3564 #, c-format msgid "stack depth limit exceeded" msgstr "перевищено ліміт глибини Ñтека" -#: tcop/postgres.c:3512 +#: tcop/postgres.c:3565 #, c-format msgid "Increase the configuration parameter \"max_stack_depth\" (currently %dkB), after ensuring the platform's stack depth limit is adequate." msgstr "Збільште параметр конфігурації \"max_stack_depth\" (поточне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d КБ), попередньо переконавшиÑÑŒ, що ОС надає доÑтатній розмір Ñтеку." -#: tcop/postgres.c:3575 +#: tcop/postgres.c:3612 #, c-format msgid "\"max_stack_depth\" must not exceed %ldkB." msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"max_stack_depth\" не повинно перевищувати %ld КБ." -#: tcop/postgres.c:3577 +#: tcop/postgres.c:3614 #, c-format msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." msgstr "Збільшіть ліміт глибини Ñтека в ÑиÑтемі через команду \"ulimit -s\" або через локальний еквівалент." -#: tcop/postgres.c:3933 +#: tcop/postgres.c:3637 +#, c-format +msgid "\"client_connection_check_interval\" must be set to 0 on this platform." +msgstr "\"client_connection_check_interval\" має бути вÑтановлений в 0 на цій платформі." + +#: tcop/postgres.c:3658 +#, c-format +msgid "Cannot enable parameter when \"log_statement_stats\" is true." +msgstr "Ðе можна ввімкнути параметр, коли \"log_statement_stats\" дорівнює true." + +#: tcop/postgres.c:3673 +#, c-format +msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." +msgstr "Ðе можна ввімкнути \"log_statement_stats\", коли \"log_parser_stats\", \"log_planner_stats\", або \"log_executor_stats\" дорівнюють true." + +#: tcop/postgres.c:4098 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "неприпуÑтимий аргумент командного Ñ€Ñдка Ð´Ð»Ñ Ñерверного процеÑу: %s" -#: tcop/postgres.c:3934 tcop/postgres.c:3940 +#: tcop/postgres.c:4099 tcop/postgres.c:4105 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." -#: tcop/postgres.c:3938 +#: tcop/postgres.c:4103 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: неприпуÑтимий аргумент командного Ñ€Ñдка: %s" -#: tcop/postgres.c:3991 +#: tcop/postgres.c:4156 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: ні база даних, ні ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача не вказані" -#: tcop/postgres.c:4713 +#: tcop/postgres.c:4909 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "неприпуÑтимий підтип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ CLOSE %d" -#: tcop/postgres.c:4748 +#: tcop/postgres.c:4946 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "неприпуÑтимий підтип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ DESCRIBE %d" -#: tcop/postgres.c:4832 +#: tcop/postgres.c:5033 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "виклики функції fastpath не підтримуютьÑÑ Ð² підключенні реплікації" -#: tcop/postgres.c:4836 +#: tcop/postgres.c:5037 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "протокол розширених запитів не підтримуєтьÑÑ Ð² підключенні реплікації" -#: tcop/postgres.c:5013 +#: tcop/postgres.c:5217 #, c-format msgid "disconnection: session time: %d:%02d:%02d.%03d user=%s database=%s host=%s%s%s" msgstr "відключеннÑ: Ñ‡Ð°Ñ ÑеанÑу: %d:%02d:%02d.%03d кориÑтувач = %s база даних = %s хоÑÑ‚ = %s%s%s" @@ -22105,52 +23351,58 @@ msgstr "відключеннÑ: Ñ‡Ð°Ñ ÑеанÑу: %d:%02d:%02d.%03d кори msgid "bind message has %d result formats but query has %d columns" msgstr "Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ bind має %d форматів, але запит має %d Ñтовпців" -#: tcop/pquery.c:944 tcop/pquery.c:1701 +#: tcop/pquery.c:942 tcop/pquery.c:1696 #, c-format msgid "cursor can only scan forward" msgstr "курÑор може Ñканувати лише вперед" -#: tcop/pquery.c:945 tcop/pquery.c:1702 +#: tcop/pquery.c:943 tcop/pquery.c:1697 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "ОголоÑити з параметром SCROLL, щоб активувати зворотню розгортку." #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:417 +#: tcop/utility.c:410 #, c-format msgid "cannot execute %s in a read-only transaction" msgstr "не можна виконати %s в транзакції \"лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\"" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:435 +#: tcop/utility.c:428 #, c-format msgid "cannot execute %s during a parallel operation" msgstr "не можна виконати %s під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¸Ñ… операцій" #. translator: %s is name of a SQL command, eg CREATE -#: tcop/utility.c:454 +#: tcop/utility.c:447 #, c-format msgid "cannot execute %s during recovery" msgstr "не можна виконати %s під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ" #. translator: %s is name of a SQL command, eg PREPARE -#: tcop/utility.c:472 +#: tcop/utility.c:465 #, c-format msgid "cannot execute %s within security-restricted operation" msgstr "не можна виконати %s в межах операції з обмеженнÑми безпеки" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:828 +#: tcop/utility.c:821 #, c-format msgid "cannot execute %s within a background process" msgstr "не можна виконати %s у фоновому процеÑÑ–" -#: tcop/utility.c:953 +#. translator: %s is name of a SQL command, eg CHECKPOINT +#: tcop/utility.c:947 +#, c-format +msgid "permission denied to execute %s command" +msgstr "немає дозволу Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ %s" + +#: tcop/utility.c:949 #, c-format -msgid "must be superuser or have privileges of pg_checkpoint to do CHECKPOINT" -msgstr "щоб виконати CHECKPOINT, потрібно бути ÑуперкориÑтувачем або мати права pg_checkpoint" +msgid "Only roles with privileges of the \"%s\" role may execute this command." +msgstr "Цю команду можуть виконувати лише ролі з привілеÑми ролі \"%s\"." -#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:615 +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:616 #, c-format msgid "multiple DictFile parameters" msgstr "повторюваний параметр DictFile" @@ -22170,7 +23422,7 @@ msgstr "нерозпізнаний параметр Ispell: \"%s\"" msgid "missing AffFile parameter" msgstr "пропущено параметр AffFile" -#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:639 +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:640 #, c-format msgid "missing DictFile parameter" msgstr "пропущено параметр DictFile" @@ -22255,112 +23507,112 @@ msgstr "Ñлова-замінника в тезауруÑÑ– \"%s\" немає у msgid "thesaurus substitute phrase is empty (rule %d)" msgstr "фраза-замінник в тезауруÑÑ– пуÑта (правило %d)" -#: tsearch/dict_thesaurus.c:624 +#: tsearch/dict_thesaurus.c:625 #, c-format msgid "multiple Dictionary parameters" msgstr "повторюваний параметр Dictionary" -#: tsearch/dict_thesaurus.c:631 +#: tsearch/dict_thesaurus.c:632 #, c-format msgid "unrecognized Thesaurus parameter: \"%s\"" msgstr "нерозпізнаний параметр тезауруÑу: \"%s\"" -#: tsearch/dict_thesaurus.c:643 +#: tsearch/dict_thesaurus.c:644 #, c-format msgid "missing Dictionary parameter" msgstr "пропущено параметр Dictionary" -#: tsearch/spell.c:380 tsearch/spell.c:397 tsearch/spell.c:406 -#: tsearch/spell.c:1062 +#: tsearch/spell.c:382 tsearch/spell.c:399 tsearch/spell.c:408 +#: tsearch/spell.c:1045 #, c-format msgid "invalid affix flag \"%s\"" msgstr "неприпуÑтимиа позначка affix \"%s\"" -#: tsearch/spell.c:384 tsearch/spell.c:1066 +#: tsearch/spell.c:386 tsearch/spell.c:1049 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "позначка affix \"%s\" поза діапазоном" -#: tsearch/spell.c:414 +#: tsearch/spell.c:416 #, c-format msgid "invalid character in affix flag \"%s\"" msgstr "неприпуÑтимий Ñимвол в позначці affix \"%s\"" -#: tsearch/spell.c:434 +#: tsearch/spell.c:436 #, c-format msgid "invalid affix flag \"%s\" with \"long\" flag value" msgstr "неприпуÑтима позначка affix \"%s\" зі значеннÑм позначки \"long\"" -#: tsearch/spell.c:524 +#: tsearch/spell.c:526 #, c-format msgid "could not open dictionary file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл Ñловника \"%s\": %m" -#: tsearch/spell.c:763 utils/adt/regexp.c:209 +#: tsearch/spell.c:750 utils/adt/regexp.c:223 jsonpath_gram.y:629 #, c-format msgid "invalid regular expression: %s" msgstr "неприпуÑтимий регулÑрний вираз: %s" -#: tsearch/spell.c:982 tsearch/spell.c:999 tsearch/spell.c:1016 -#: tsearch/spell.c:1033 tsearch/spell.c:1098 gram.y:18884 gram.y:18901 +#: tsearch/spell.c:964 tsearch/spell.c:981 tsearch/spell.c:998 +#: tsearch/spell.c:1015 tsearch/spell.c:1081 gram.y:18735 gram.y:18752 #, c-format msgid "syntax error" msgstr "ÑинтакÑична помилка" -#: tsearch/spell.c:1189 tsearch/spell.c:1201 tsearch/spell.c:1761 -#: tsearch/spell.c:1766 tsearch/spell.c:1771 +#: tsearch/spell.c:1173 tsearch/spell.c:1185 tsearch/spell.c:1746 +#: tsearch/spell.c:1751 tsearch/spell.c:1756 #, c-format msgid "invalid affix alias \"%s\"" msgstr "неприпуÑтимий пÑевдонім affix \"%s\"" -#: tsearch/spell.c:1242 tsearch/spell.c:1313 tsearch/spell.c:1462 +#: tsearch/spell.c:1226 tsearch/spell.c:1297 tsearch/spell.c:1446 #, c-format msgid "could not open affix file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл affix \"%s\": %m" -#: tsearch/spell.c:1296 +#: tsearch/spell.c:1280 #, c-format msgid "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag values" msgstr "Словник Ispell підтримує Ð´Ð»Ñ Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐºÐ¸ лише Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"default\", \"long\", Ñ–\"num\"" -#: tsearch/spell.c:1340 +#: tsearch/spell.c:1324 #, c-format msgid "invalid number of flag vector aliases" msgstr "неприпуÑтима кількіÑть векторів позначок" -#: tsearch/spell.c:1363 +#: tsearch/spell.c:1347 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "кількіÑть пÑевдонімів перевищує вказане чиÑло %d" -#: tsearch/spell.c:1578 +#: tsearch/spell.c:1562 #, c-format msgid "affix file contains both old-style and new-style commands" msgstr "файл affix міÑтить команди Ñ– в Ñтарому, Ñ– в новому Ñтилі" -#: tsearch/to_tsany.c:195 utils/adt/tsvector.c:272 utils/adt/tsvector_op.c:1127 +#: tsearch/to_tsany.c:194 utils/adt/tsvector.c:277 utils/adt/tsvector_op.c:1126 #, c-format msgid "string is too long for tsvector (%d bytes, max %d bytes)" msgstr "Ñ€Ñдок занадто довгий Ð´Ð»Ñ tsvector (%d байт, макÑимум %d байт)" -#: tsearch/ts_locale.c:227 +#: tsearch/ts_locale.c:236 #, c-format msgid "line %d of configuration file \"%s\": \"%s\"" msgstr "Ñ€Ñдок %d файлу конфігурації \"%s\": \"%s\"" -#: tsearch/ts_locale.c:307 +#: tsearch/ts_locale.c:315 #, c-format msgid "conversion from wchar_t to server encoding failed: %m" msgstr "перетворити wchar_t в ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñерверу не вдалоÑÑ: %mв" -#: tsearch/ts_parse.c:386 tsearch/ts_parse.c:393 tsearch/ts_parse.c:562 -#: tsearch/ts_parse.c:569 +#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:573 +#: tsearch/ts_parse.c:580 #, c-format msgid "word is too long to be indexed" msgstr "Ñлово занадто довге Ð´Ð»Ñ Ñ–Ð½Ð´ÐµÐºÑуваннÑ" -#: tsearch/ts_parse.c:387 tsearch/ts_parse.c:394 tsearch/ts_parse.c:563 -#: tsearch/ts_parse.c:570 +#: tsearch/ts_parse.c:388 tsearch/ts_parse.c:395 tsearch/ts_parse.c:574 +#: tsearch/ts_parse.c:581 #, c-format msgid "Words longer than %d characters are ignored." msgstr "Слова довші за %d Ñимволів пропуÑкаютьÑÑ." @@ -22375,77 +23627,67 @@ msgstr "неприпуÑтиме ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ конфігурації Ñ‚ msgid "could not open stop-word file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл Ñтоп-Ñлова \"%s\": %m" -#: tsearch/wparser.c:313 tsearch/wparser.c:401 tsearch/wparser.c:478 +#: tsearch/wparser.c:306 tsearch/wparser.c:394 tsearch/wparser.c:471 #, c-format msgid "text search parser does not support headline creation" msgstr "аналізатор текÑтового пошуку не підтримує ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑƒ" -#: tsearch/wparser_def.c:2578 +#: tsearch/wparser_def.c:2664 #, c-format msgid "unrecognized headline parameter: \"%s\"" msgstr "нерозпізнаний параметр заголовку: \"%s\"" -#: tsearch/wparser_def.c:2597 -#, c-format -msgid "MinWords should be less than MaxWords" -msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ MinWords повинно бути меньшим за MaxWords" - -#: tsearch/wparser_def.c:2601 +#: tsearch/wparser_def.c:2674 #, c-format -msgid "MinWords should be positive" -msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ MinWords повинно бути позитивним" +msgid "%s must be less than %s" +msgstr "%s має бути менше ніж %s" -#: tsearch/wparser_def.c:2605 +#: tsearch/wparser_def.c:2678 #, c-format -msgid "ShortWord should be >= 0" -msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ShortWord повинно бути >= 0" +msgid "%s must be positive" +msgstr "%s має бути додатним" -#: tsearch/wparser_def.c:2609 +#: tsearch/wparser_def.c:2682 tsearch/wparser_def.c:2686 #, c-format -msgid "MaxFragments should be >= 0" -msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ MaxFragments повинно бути >= 0" +msgid "%s must be >= 0" +msgstr "%s повинно бути >= 0" -#: utils/activity/pgstat.c:421 +#: utils/activity/pgstat.c:435 #, c-format msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´'єднати файл поÑтійної ÑтатиÑтики \"%s\": %m" -#: utils/activity/pgstat.c:428 -#, c-format -msgid "unlinked permanent statistics file \"%s\"" -msgstr "від'єднаний файл поÑтійної ÑтатиÑтики \"%s\"" - -#: utils/activity/pgstat.c:1200 +#: utils/activity/pgstat.c:1255 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "неприпуÑтимий тип ÑтатиÑтики: \"%s\"" -#: utils/activity/pgstat.c:1280 +#: utils/activity/pgstat.c:1335 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ тимчаÑовий файл ÑтатиÑтики \"%s\": %m" -#: utils/activity/pgstat.c:1386 +#: utils/activity/pgstat.c:1455 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати в тимчаÑовий файл ÑтатиÑтики \"%s\": %m" -#: utils/activity/pgstat.c:1395 +#: utils/activity/pgstat.c:1464 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ тимчаÑовий файл ÑтатиÑтики \"%s\": %m" -#: utils/activity/pgstat.c:1403 +#: utils/activity/pgstat.c:1472 #, c-format msgid "could not rename temporary statistics file \"%s\" to \"%s\": %m" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ тимчаÑовий файл ÑтатиÑтики з \"%s\" в \"%s\": %m" -#: utils/activity/pgstat.c:1452 +#: utils/activity/pgstat.c:1521 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл ÑтатиÑтики \"%s\": %m" -#: utils/activity/pgstat.c:1608 +#: utils/activity/pgstat.c:1683 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "пошкоджений файл ÑтатиÑтики \"%s\"" @@ -22455,288 +23697,302 @@ msgstr "пошкоджений файл ÑтатиÑтики \"%s\"" msgid "function call to dropped function" msgstr "виклик видаленої функції" -#: utils/activity/pgstat_xact.c:371 +#: utils/activity/pgstat_xact.c:362 #, c-format -msgid "resetting existing stats for type %s, db=%u, oid=%u" +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" msgstr "ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ñ–Ñнуючої ÑтатиÑтики Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s, db=%u, oid=%u" -#: utils/adt/acl.c:168 utils/adt/name.c:93 +#: utils/activity/wait_event.c:207 utils/activity/wait_event.c:232 +#, c-format +msgid "wait event \"%s\" already exists in type \"%s\"" +msgstr "Ð¿Ð¾Ð´Ñ–Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" вже Ñ–Ñнує в типі \"%s\"" + +#: utils/activity/wait_event.c:246 +#, c-format +msgid "too many custom wait events" +msgstr "занадто багато кориÑтувацьких подій очікуваннÑ" + +#: utils/adt/acl.c:183 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "занадто довгий ідентифікатор" -#: utils/adt/acl.c:169 utils/adt/name.c:94 +#: utils/adt/acl.c:184 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Ідентифікатор повинен бути короче ніж %d Ñимволів." -#: utils/adt/acl.c:252 +#: utils/adt/acl.c:272 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "нерозпізнане ключове Ñлово: \"%s\"" -#: utils/adt/acl.c:253 +#: utils/adt/acl.c:273 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "Ключовим Ñловом ACL повинно бути \"group\" або \"user\"." -#: utils/adt/acl.c:258 +#: utils/adt/acl.c:281 #, c-format msgid "missing name" msgstr "пропущено ім'Ñ" -#: utils/adt/acl.c:259 +#: utils/adt/acl.c:282 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "За ключовими Ñловами \"group\" або \"user\" повинно йти ім'Ñ." -#: utils/adt/acl.c:265 +#: utils/adt/acl.c:288 #, c-format msgid "missing \"=\" sign" msgstr "пропущено знак \"=\"" -#: utils/adt/acl.c:324 +#: utils/adt/acl.c:350 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "неприпуÑтимий Ñимвол режиму: повинен бути один з \"%s\"" -#: utils/adt/acl.c:346 +#: utils/adt/acl.c:380 #, c-format msgid "a name must follow the \"/\" sign" msgstr "за знаком \"/\" повинно прÑмувати ім'Ñ" -#: utils/adt/acl.c:354 +#: utils/adt/acl.c:392 #, c-format msgid "defaulting grantor to user ID %u" msgstr "призначив права кориÑтувач з ідентифікатором %u" -#: utils/adt/acl.c:540 +#: utils/adt/acl.c:578 #, c-format msgid "ACL array contains wrong data type" msgstr "МаÑив ACL міÑтить неправильний тип даних" -#: utils/adt/acl.c:544 +#: utils/adt/acl.c:582 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "МаÑиви ACL повинні бути одновимірними" -#: utils/adt/acl.c:548 +#: utils/adt/acl.c:586 #, c-format msgid "ACL arrays must not contain null values" msgstr "МаÑиви ACL не повинні міÑтити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ null" -#: utils/adt/acl.c:572 +#: utils/adt/acl.c:615 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "зайве ÑÐ¼Ñ–Ñ‚Ñ‚Ñ Ð² кінці Ñпецифікації ACL" -#: utils/adt/acl.c:1214 +#: utils/adt/acl.c:1263 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "параметри Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð² не можна повернути тому, хто призначив Ñ—Ñ… вам" -#: utils/adt/acl.c:1275 -#, c-format -msgid "dependent privileges exist" -msgstr "залежні права Ñ–Ñнують" - -#: utils/adt/acl.c:1276 -#, c-format -msgid "Use CASCADE to revoke them too." -msgstr "ВикориÑтайте CASCADE, щоб відкликати Ñ—Ñ…." - -#: utils/adt/acl.c:1530 +#: utils/adt/acl.c:1579 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert більше не підтримуєтьÑÑ" -#: utils/adt/acl.c:1540 +#: utils/adt/acl.c:1589 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove більше не підтримуєтьÑÑ" -#: utils/adt/acl.c:1630 utils/adt/acl.c:1684 +#: utils/adt/acl.c:1709 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "нерозпізнаний тип прав: \"%s\"" -#: utils/adt/acl.c:3469 utils/adt/regproc.c:101 utils/adt/regproc.c:277 +#: utils/adt/acl.c:3550 utils/adt/regproc.c:100 utils/adt/regproc.c:265 #, c-format msgid "function \"%s\" does not exist" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" не Ñ–Ñнує" -#: utils/adt/acl.c:5008 -#, c-format -msgid "must be member of role \"%s\"" -msgstr "потрібно бути учаÑником ролі \"%s\"" - -#: utils/adt/array_expanded.c:274 utils/adt/arrayfuncs.c:936 -#: utils/adt/arrayfuncs.c:1544 utils/adt/arrayfuncs.c:3263 -#: utils/adt/arrayfuncs.c:3405 utils/adt/arrayfuncs.c:5981 -#: utils/adt/arrayfuncs.c:6322 utils/adt/arrayutils.c:94 -#: utils/adt/arrayutils.c:103 utils/adt/arrayutils.c:110 +#: utils/adt/acl.c:5196 #, c-format -msgid "array size exceeds the maximum allowed (%d)" -msgstr "розмір маÑиву перевищує макÑимальний допуÑтимий розмір (%d)" +msgid "must be able to SET ROLE \"%s\"" +msgstr "потрібно мати можливіÑть SET ROLE \"%s\"" -#: utils/adt/array_userfuncs.c:80 utils/adt/array_userfuncs.c:467 -#: utils/adt/array_userfuncs.c:547 utils/adt/json.c:667 utils/adt/json.c:803 -#: utils/adt/json.c:837 utils/adt/jsonb.c:1104 utils/adt/jsonb.c:1177 -#: utils/adt/jsonb.c:1598 utils/adt/jsonb.c:1785 utils/adt/jsonb.c:1795 +#: utils/adt/array_userfuncs.c:102 utils/adt/array_userfuncs.c:489 +#: utils/adt/array_userfuncs.c:866 utils/adt/json.c:602 utils/adt/json.c:740 +#: utils/adt/json.c:790 utils/adt/jsonb.c:1025 utils/adt/jsonb.c:1098 +#: utils/adt/jsonb.c:1530 utils/adt/jsonb.c:1718 utils/adt/jsonb.c:1728 #, c-format msgid "could not determine input data type" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ тип вхідних даних" -#: utils/adt/array_userfuncs.c:85 +#: utils/adt/array_userfuncs.c:107 #, c-format msgid "input data type is not an array" msgstr "тип вхідних даних не Ñ” маÑивом" -#: utils/adt/array_userfuncs.c:129 utils/adt/array_userfuncs.c:181 -#: utils/adt/float.c:1234 utils/adt/float.c:1308 utils/adt/float.c:4046 -#: utils/adt/float.c:4060 utils/adt/int.c:781 utils/adt/int.c:803 -#: utils/adt/int.c:817 utils/adt/int.c:831 utils/adt/int.c:862 -#: utils/adt/int.c:883 utils/adt/int.c:1000 utils/adt/int.c:1014 -#: utils/adt/int.c:1028 utils/adt/int.c:1061 utils/adt/int.c:1075 -#: utils/adt/int.c:1089 utils/adt/int.c:1120 utils/adt/int.c:1202 -#: utils/adt/int.c:1266 utils/adt/int.c:1334 utils/adt/int.c:1340 -#: utils/adt/int8.c:1257 utils/adt/numeric.c:1830 utils/adt/numeric.c:4265 -#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1113 -#: utils/adt/varlena.c:3395 +#: utils/adt/array_userfuncs.c:151 utils/adt/array_userfuncs.c:203 +#: utils/adt/float.c:1222 utils/adt/float.c:1296 utils/adt/float.c:4022 +#: utils/adt/float.c:4060 utils/adt/int.c:778 utils/adt/int.c:800 +#: utils/adt/int.c:814 utils/adt/int.c:828 utils/adt/int.c:859 +#: utils/adt/int.c:880 utils/adt/int.c:997 utils/adt/int.c:1011 +#: utils/adt/int.c:1025 utils/adt/int.c:1058 utils/adt/int.c:1072 +#: utils/adt/int.c:1086 utils/adt/int.c:1117 utils/adt/int.c:1199 +#: utils/adt/int.c:1263 utils/adt/int.c:1331 utils/adt/int.c:1337 +#: utils/adt/int8.c:1256 utils/adt/numeric.c:1917 utils/adt/numeric.c:4454 +#: utils/adt/rangetypes.c:1488 utils/adt/rangetypes.c:1501 +#: utils/adt/varbit.c:1195 utils/adt/varbit.c:1596 utils/adt/varlena.c:1135 +#: utils/adt/varlena.c:3137 #, c-format msgid "integer out of range" msgstr "ціле чиÑло поза діапазоном" -#: utils/adt/array_userfuncs.c:136 utils/adt/array_userfuncs.c:191 +#: utils/adt/array_userfuncs.c:158 utils/adt/array_userfuncs.c:213 #, c-format msgid "argument must be empty or one-dimensional array" msgstr "аргумент повинен бути пуÑтим або одновимірним маÑивом" -#: utils/adt/array_userfuncs.c:273 utils/adt/array_userfuncs.c:312 -#: utils/adt/array_userfuncs.c:349 utils/adt/array_userfuncs.c:378 -#: utils/adt/array_userfuncs.c:406 +#: utils/adt/array_userfuncs.c:295 utils/adt/array_userfuncs.c:334 +#: utils/adt/array_userfuncs.c:371 utils/adt/array_userfuncs.c:400 +#: utils/adt/array_userfuncs.c:428 #, c-format msgid "cannot concatenate incompatible arrays" msgstr "об'єднувати неÑуміÑні маÑиви не можна" -#: utils/adt/array_userfuncs.c:274 +#: utils/adt/array_userfuncs.c:296 #, c-format msgid "Arrays with element types %s and %s are not compatible for concatenation." msgstr "МаÑиви з елементами типів %s Ñ– %s не Ñ” ÑуміÑними Ð´Ð»Ñ Ð¾Ð±'єднаннÑ." -#: utils/adt/array_userfuncs.c:313 +#: utils/adt/array_userfuncs.c:335 #, c-format msgid "Arrays of %d and %d dimensions are not compatible for concatenation." msgstr "МаÑиви з вимірами %d Ñ– %d не Ñ” ÑуміÑними Ð´Ð»Ñ Ð¾Ð±'єднаннÑ." -#: utils/adt/array_userfuncs.c:350 +#: utils/adt/array_userfuncs.c:372 #, c-format msgid "Arrays with differing element dimensions are not compatible for concatenation." msgstr "МаÑиви з різними вимірами елементів не Ñ” ÑуміÑними Ð´Ð»Ñ Ð¾Ð±'єднаннÑ." -#: utils/adt/array_userfuncs.c:379 utils/adt/array_userfuncs.c:407 +#: utils/adt/array_userfuncs.c:401 utils/adt/array_userfuncs.c:429 #, c-format msgid "Arrays with differing dimensions are not compatible for concatenation." msgstr "МаÑиви з різними вимірами не Ñ” ÑуміÑними Ð´Ð»Ñ Ð¾Ð±'єднаннÑ." -#: utils/adt/array_userfuncs.c:663 utils/adt/array_userfuncs.c:815 +#: utils/adt/array_userfuncs.c:975 utils/adt/array_userfuncs.c:983 +#: utils/adt/arrayfuncs.c:5616 utils/adt/arrayfuncs.c:5622 +#, c-format +msgid "cannot accumulate arrays of different dimensionality" +msgstr "накопичувати маÑиви різної розмірноÑті не можна" + +#: utils/adt/array_userfuncs.c:1272 utils/adt/array_userfuncs.c:1426 #, c-format msgid "searching for elements in multidimensional arrays is not supported" msgstr "пошук елементів у багатовимірних маÑивах не підтримуєтьÑÑ" -#: utils/adt/array_userfuncs.c:687 +#: utils/adt/array_userfuncs.c:1301 #, c-format msgid "initial position must not be null" msgstr "початкова Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ Ð½Ðµ повинна бути null" -#: utils/adt/arrayfuncs.c:271 utils/adt/arrayfuncs.c:285 -#: utils/adt/arrayfuncs.c:296 utils/adt/arrayfuncs.c:318 -#: utils/adt/arrayfuncs.c:333 utils/adt/arrayfuncs.c:347 -#: utils/adt/arrayfuncs.c:353 utils/adt/arrayfuncs.c:360 -#: utils/adt/arrayfuncs.c:493 utils/adt/arrayfuncs.c:509 -#: utils/adt/arrayfuncs.c:520 utils/adt/arrayfuncs.c:535 -#: utils/adt/arrayfuncs.c:556 utils/adt/arrayfuncs.c:586 -#: utils/adt/arrayfuncs.c:593 utils/adt/arrayfuncs.c:601 -#: utils/adt/arrayfuncs.c:635 utils/adt/arrayfuncs.c:658 -#: utils/adt/arrayfuncs.c:678 utils/adt/arrayfuncs.c:790 -#: utils/adt/arrayfuncs.c:799 utils/adt/arrayfuncs.c:829 -#: utils/adt/arrayfuncs.c:844 utils/adt/arrayfuncs.c:897 +#: utils/adt/array_userfuncs.c:1674 #, c-format -msgid "malformed array literal: \"%s\"" -msgstr "неправильний літерал маÑиву: \"%s\"" +msgid "sample size must be between 0 and %d" +msgstr "розмір вибірки повинен бути між 0 Ñ– %d" -#: utils/adt/arrayfuncs.c:272 +#: utils/adt/arrayfuncs.c:264 utils/adt/arrayfuncs.c:273 +#: utils/adt/arrayfuncs.c:284 utils/adt/arrayfuncs.c:307 +#: utils/adt/arrayfuncs.c:440 utils/adt/arrayfuncs.c:454 +#: utils/adt/arrayfuncs.c:466 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:668 utils/adt/arrayfuncs.c:703 +#: utils/adt/arrayfuncs.c:718 utils/adt/arrayfuncs.c:777 +#: utils/adt/arrayfuncs.c:782 utils/adt/arrayfuncs.c:870 +#: utils/adt/arrayfuncs.c:897 utils/adt/arrayfuncs.c:904 +#: utils/adt/arrayfuncs.c:941 #, c-format -msgid "\"[\" must introduce explicitly-specified array dimensions." -msgstr "\"[\" повинно предÑтавлÑти Ñвно вказані виміри маÑиву." +msgid "malformed array literal: \"%s\"" +msgstr "неправильний літерал маÑиву: \"%s\"" -#: utils/adt/arrayfuncs.c:286 +#: utils/adt/arrayfuncs.c:265 #, c-format -msgid "Missing array dimension value." -msgstr "Пропущено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼Ñ–Ñ€Ñƒ маÑиву." +msgid "Array value must start with \"{\" or dimension information." +msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñиву повинно починатиÑÑŒ з \"{\" або з інформації про вимір." -#: utils/adt/arrayfuncs.c:297 utils/adt/arrayfuncs.c:334 +#: utils/adt/arrayfuncs.c:274 utils/adt/arrayfuncs.c:467 #, c-format msgid "Missing \"%s\" after array dimensions." msgstr "Пропущено \"%s\" піÑÐ»Ñ Ð²Ð¸Ð¼Ñ–Ñ€Ñ–Ð² маÑиву." -#: utils/adt/arrayfuncs.c:306 utils/adt/arrayfuncs.c:2910 -#: utils/adt/arrayfuncs.c:2942 utils/adt/arrayfuncs.c:2957 +#: utils/adt/arrayfuncs.c:285 #, c-format -msgid "upper bound cannot be less than lower bound" -msgstr "Ð²ÐµÑ€Ñ…Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ð½Ðµ може бути меньше нижньої границі" +msgid "Array contents must start with \"{\"." +msgstr "ВміÑÑ‚ маÑиву повинен починатиÑÑŒ з \"{\"." -#: utils/adt/arrayfuncs.c:319 +#: utils/adt/arrayfuncs.c:308 utils/adt/multirangetypes.c:292 #, c-format -msgid "Array value must start with \"{\" or dimension information." -msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñиву повинно починатиÑÑŒ з \"{\" або з інформації про вимір." +msgid "Junk after closing right brace." +msgstr "Ð¡Ð¼Ñ–Ñ‚Ñ‚Ñ Ð¿Ñ–ÑÐ»Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð°Ð²Ð¾Ñ— дужки." -#: utils/adt/arrayfuncs.c:348 +#: utils/adt/arrayfuncs.c:431 utils/adt/arrayfuncs.c:643 #, c-format -msgid "Array contents must start with \"{\"." -msgstr "ВміÑÑ‚ маÑиву повинен починатиÑÑŒ з \"{\"." +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "кількіÑть вимірів маÑиву перевищує макÑимально дозволену (%d)" -#: utils/adt/arrayfuncs.c:354 utils/adt/arrayfuncs.c:361 +#: utils/adt/arrayfuncs.c:441 #, c-format -msgid "Specified array dimensions do not match array contents." -msgstr "Вказані виміри маÑиву не відповідають його вміÑту." +msgid "\"[\" must introduce explicitly-specified array dimensions." +msgstr "\"[\" повинно предÑтавлÑти Ñвно вказані виміри маÑиву." -#: utils/adt/arrayfuncs.c:494 utils/adt/arrayfuncs.c:521 -#: utils/adt/multirangetypes.c:164 utils/adt/rangetypes.c:2310 -#: utils/adt/rangetypes.c:2318 utils/adt/rowtypes.c:211 -#: utils/adt/rowtypes.c:219 +#: utils/adt/arrayfuncs.c:455 #, c-format -msgid "Unexpected end of input." -msgstr "Ðеочікуваний кінец введеннÑ." +msgid "Missing array dimension value." +msgstr "Пропущено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼Ñ–Ñ€Ñƒ маÑиву." + +#: utils/adt/arrayfuncs.c:481 utils/adt/arrayfuncs.c:2940 +#: utils/adt/arrayfuncs.c:2985 utils/adt/arrayfuncs.c:3000 +#, c-format +msgid "upper bound cannot be less than lower bound" +msgstr "Ð²ÐµÑ€Ñ…Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ð½Ðµ може бути меньше нижньої границі" + +#: utils/adt/arrayfuncs.c:487 +#, c-format +msgid "array upper bound is too large: %d" +msgstr "Ð²ÐµÑ€Ñ…Ð½Ñ Ð¼ÐµÐ¶Ð° маÑиву занадто велика: %d" + +#: utils/adt/arrayfuncs.c:538 +#, c-format +msgid "array bound is out of integer range" +msgstr "межа маÑиву знаходитьÑÑ Ð·Ð° межами цілочиÑельного діапазону" -#: utils/adt/arrayfuncs.c:510 utils/adt/arrayfuncs.c:557 -#: utils/adt/arrayfuncs.c:587 utils/adt/arrayfuncs.c:636 +#: utils/adt/arrayfuncs.c:637 utils/adt/arrayfuncs.c:669 +#: utils/adt/arrayfuncs.c:704 utils/adt/arrayfuncs.c:898 #, c-format msgid "Unexpected \"%c\" character." msgstr "Ðеочікуваний Ñимвол \"%c\"." -#: utils/adt/arrayfuncs.c:536 utils/adt/arrayfuncs.c:659 +#: utils/adt/arrayfuncs.c:719 #, c-format msgid "Unexpected array element." msgstr "Ðеочікуваний елемент маÑиву." -#: utils/adt/arrayfuncs.c:594 +#: utils/adt/arrayfuncs.c:778 #, c-format -msgid "Unmatched \"%c\" character." -msgstr "Ðевідповідний Ñимвол \"%c\"." +msgid "Specified array dimensions do not match array contents." +msgstr "Вказані виміри маÑиву не відповідають його вміÑту." -#: utils/adt/arrayfuncs.c:602 utils/adt/jsonfuncs.c:2482 +#: utils/adt/arrayfuncs.c:783 utils/adt/jsonfuncs.c:2598 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "Багатовимірні маÑиви повинні мати вкладені маÑиви з відповідними вимірами." -#: utils/adt/arrayfuncs.c:679 utils/adt/multirangetypes.c:287 +#: utils/adt/arrayfuncs.c:871 utils/adt/arrayfuncs.c:905 #, c-format -msgid "Junk after closing right brace." -msgstr "Ð¡Ð¼Ñ–Ñ‚Ñ‚Ñ Ð¿Ñ–ÑÐ»Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð°Ð²Ð¾Ñ— дужки." +msgid "Incorrectly quoted array element." +msgstr "Ðеправильно процитовано елемент маÑиву." + +#: utils/adt/arrayfuncs.c:942 utils/adt/multirangetypes.c:165 +#: utils/adt/rangetypes.c:2464 utils/adt/rangetypes.c:2472 +#: utils/adt/rowtypes.c:218 utils/adt/rowtypes.c:229 +#, c-format +msgid "Unexpected end of input." +msgstr "Ðеочікуваний кінец введеннÑ." -#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3371 -#: utils/adt/arrayfuncs.c:5885 +#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 +#: utils/adt/arrayfuncs.c:6108 #, c-format msgid "invalid number of dimensions: %d" msgstr "неприпуÑтима кількіÑть вимірів: %d" @@ -22751,149 +24007,144 @@ msgstr "неприпуÑтимі позначки маÑиву" msgid "binary data has array element type %u (%s) instead of expected %u (%s)" msgstr "двійкові дані мають тип елементу маÑиву %u (%s) заміÑть очікуваного %u (%s)" -#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:445 -#: utils/adt/rangetypes.c:333 utils/cache/lsyscache.c:2915 +#: utils/adt/arrayfuncs.c:1378 utils/adt/multirangetypes.c:450 +#: utils/adt/rangetypes.c:351 utils/cache/lsyscache.c:2958 #, c-format msgid "no binary input function available for type %s" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s немає функції Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð²Ñ–Ð¹ÐºÐ¾Ð²Ð¸Ñ… даних" -#: utils/adt/arrayfuncs.c:1518 +#: utils/adt/arrayfuncs.c:1509 #, c-format msgid "improper binary format in array element %d" msgstr "неправильний двійковий формат в елементі маÑиву %d" -#: utils/adt/arrayfuncs.c:1599 utils/adt/multirangetypes.c:450 -#: utils/adt/rangetypes.c:338 utils/cache/lsyscache.c:2948 +#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 +#: utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:2991 #, c-format msgid "no binary output function available for type %s" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s немає функції виводу двійкових даних" -#: utils/adt/arrayfuncs.c:2078 +#: utils/adt/arrayfuncs.c:2067 #, c-format msgid "slices of fixed-length arrays not implemented" msgstr "Ñ€Ð¾Ð·Ñ€Ñ–Ð·Ð°Ð½Ð½Ñ Ð¼Ð°Ñивів поÑтійної довжини не реалізовано" -#: utils/adt/arrayfuncs.c:2256 utils/adt/arrayfuncs.c:2278 -#: utils/adt/arrayfuncs.c:2327 utils/adt/arrayfuncs.c:2566 -#: utils/adt/arrayfuncs.c:2888 utils/adt/arrayfuncs.c:5871 -#: utils/adt/arrayfuncs.c:5897 utils/adt/arrayfuncs.c:5908 -#: utils/adt/json.c:1450 utils/adt/json.c:1524 utils/adt/jsonb.c:1378 -#: utils/adt/jsonb.c:1464 utils/adt/jsonfuncs.c:4363 utils/adt/jsonfuncs.c:4516 -#: utils/adt/jsonfuncs.c:4628 utils/adt/jsonfuncs.c:4677 +#: utils/adt/arrayfuncs.c:2245 utils/adt/arrayfuncs.c:2267 +#: utils/adt/arrayfuncs.c:2316 utils/adt/arrayfuncs.c:2570 +#: utils/adt/arrayfuncs.c:2915 utils/adt/arrayfuncs.c:6094 +#: utils/adt/arrayfuncs.c:6120 utils/adt/arrayfuncs.c:6131 +#: utils/adt/json.c:1433 utils/adt/json.c:1505 utils/adt/jsonb.c:1317 +#: utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4710 utils/adt/jsonfuncs.c:4863 +#: utils/adt/jsonfuncs.c:4974 utils/adt/jsonfuncs.c:5022 #, c-format msgid "wrong number of array subscripts" msgstr "невірне чиÑло верхніх індекÑів маÑива" -#: utils/adt/arrayfuncs.c:2261 utils/adt/arrayfuncs.c:2369 -#: utils/adt/arrayfuncs.c:2633 utils/adt/arrayfuncs.c:2947 +#: utils/adt/arrayfuncs.c:2250 utils/adt/arrayfuncs.c:2374 +#: utils/adt/arrayfuncs.c:2653 utils/adt/arrayfuncs.c:2990 #, c-format msgid "array subscript out of range" msgstr "верхній Ñ–Ð½Ð´ÐµÐºÑ Ð¼Ð°Ñиву поза діапазоном" -#: utils/adt/arrayfuncs.c:2266 +#: utils/adt/arrayfuncs.c:2255 #, c-format msgid "cannot assign null value to an element of a fixed-length array" msgstr "не можна призначати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ null Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñƒ маÑива поÑтійної довжини" -#: utils/adt/arrayfuncs.c:2835 +#: utils/adt/arrayfuncs.c:2855 #, c-format msgid "updates on slices of fixed-length arrays not implemented" msgstr "Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð² зрізах маÑивів поÑтійної довжини не реалізовані" -#: utils/adt/arrayfuncs.c:2866 +#: utils/adt/arrayfuncs.c:2886 #, c-format msgid "array slice subscript must provide both boundaries" msgstr "у вказівці зрізу маÑива повинні бути задані обидві межі" -#: utils/adt/arrayfuncs.c:2867 +#: utils/adt/arrayfuncs.c:2887 #, c-format msgid "When assigning to a slice of an empty array value, slice boundaries must be fully specified." msgstr "Під Ñ‡Ð°Ñ Ð¿Ñ€Ð¸ÑÐ²Ð¾Ñ”Ð½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ зрізу в пуÑтому маÑиві, межі зрізу повинні вказуватиÑÑ Ð¿Ð¾Ð²Ð½Ñ–Ñтю." -#: utils/adt/arrayfuncs.c:2878 utils/adt/arrayfuncs.c:2974 +#: utils/adt/arrayfuncs.c:2905 utils/adt/arrayfuncs.c:3017 #, c-format msgid "source array too small" msgstr "вихідний маÑив занадто малий" -#: utils/adt/arrayfuncs.c:3529 +#: utils/adt/arrayfuncs.c:3657 #, c-format msgid "null array element not allowed in this context" msgstr "елемент маÑиву null не дозволений в цьому контекÑті" -#: utils/adt/arrayfuncs.c:3631 utils/adt/arrayfuncs.c:3802 -#: utils/adt/arrayfuncs.c:4193 +#: utils/adt/arrayfuncs.c:3828 utils/adt/arrayfuncs.c:3999 +#: utils/adt/arrayfuncs.c:4390 #, c-format msgid "cannot compare arrays of different element types" msgstr "не можна порівнювати маÑиви з елементами різних типів" -#: utils/adt/arrayfuncs.c:3980 utils/adt/multirangetypes.c:2799 -#: utils/adt/multirangetypes.c:2871 utils/adt/rangetypes.c:1343 -#: utils/adt/rangetypes.c:1407 utils/adt/rowtypes.c:1858 +#: utils/adt/arrayfuncs.c:4177 utils/adt/multirangetypes.c:2805 +#: utils/adt/multirangetypes.c:2877 utils/adt/rangetypes.c:1361 +#: utils/adt/rangetypes.c:1425 utils/adt/rowtypes.c:1875 #, c-format msgid "could not identify a hash function for type %s" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ геш-функцію Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" -#: utils/adt/arrayfuncs.c:4108 utils/adt/rowtypes.c:1979 +#: utils/adt/arrayfuncs.c:4305 utils/adt/rowtypes.c:1996 #, c-format msgid "could not identify an extended hash function for type %s" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ розширену геш-функцію Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" -#: utils/adt/arrayfuncs.c:5285 +#: utils/adt/arrayfuncs.c:5506 #, c-format msgid "data type %s is not an array type" msgstr "тип даних %s не Ñ” типом маÑиву" -#: utils/adt/arrayfuncs.c:5340 +#: utils/adt/arrayfuncs.c:5561 #, c-format msgid "cannot accumulate null arrays" msgstr "накопичувати null-маÑиви не можна" -#: utils/adt/arrayfuncs.c:5368 +#: utils/adt/arrayfuncs.c:5589 #, c-format msgid "cannot accumulate empty arrays" msgstr "накопичувати пуÑті маÑиви не можна" -#: utils/adt/arrayfuncs.c:5395 utils/adt/arrayfuncs.c:5401 -#, c-format -msgid "cannot accumulate arrays of different dimensionality" -msgstr "накопичувати маÑиви різної розмірноÑті не можна" - -#: utils/adt/arrayfuncs.c:5769 utils/adt/arrayfuncs.c:5809 +#: utils/adt/arrayfuncs.c:5992 utils/adt/arrayfuncs.c:6032 #, c-format msgid "dimension array or low bound array cannot be null" msgstr "маÑив розмірноÑті або маÑив нижніх границь не може бути null" -#: utils/adt/arrayfuncs.c:5872 utils/adt/arrayfuncs.c:5898 +#: utils/adt/arrayfuncs.c:6095 utils/adt/arrayfuncs.c:6121 #, c-format msgid "Dimension array must be one dimensional." msgstr "МаÑив розмірноÑті повинен бути одновимірним." -#: utils/adt/arrayfuncs.c:5877 utils/adt/arrayfuncs.c:5903 +#: utils/adt/arrayfuncs.c:6100 utils/adt/arrayfuncs.c:6126 #, c-format msgid "dimension values cannot be null" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ð½Ð¾Ñтей не можуть бути null" -#: utils/adt/arrayfuncs.c:5909 +#: utils/adt/arrayfuncs.c:6132 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "МаÑив нижніх границь відрізнÑєтьÑÑ Ð·Ð° розміром від маÑиву розмірноÑтей." -#: utils/adt/arrayfuncs.c:6187 +#: utils/adt/arrayfuncs.c:6413 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñ–Ð² з багатовимірних маÑивів не підтримуєтьÑÑ" -#: utils/adt/arrayfuncs.c:6464 +#: utils/adt/arrayfuncs.c:6690 #, c-format msgid "thresholds must be one-dimensional array" msgstr "граничне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð¾ вказуватиÑÑŒ одновимірним маÑивом" -#: utils/adt/arrayfuncs.c:6469 +#: utils/adt/arrayfuncs.c:6695 #, c-format msgid "thresholds array must not contain NULLs" msgstr "маÑив границь не повинен міÑтити NULL" -#: utils/adt/arrayfuncs.c:6702 +#: utils/adt/arrayfuncs.c:6928 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "кількіÑть елементів Ð´Ð»Ñ Ð¾Ð±Ñ€Ñ–Ð·ÐºÐ¸ має бути між 0 Ñ– %d" @@ -22913,236 +24164,263 @@ msgstr "підрÑдковий Ñимвол маÑиву у призначенн msgid "array lower bound is too large: %d" msgstr "Ð½Ð¸Ð¶Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ð¼Ð°Ñиву занадто велика: %d" -#: utils/adt/arrayutils.c:240 +#: utils/adt/arrayutils.c:242 #, c-format msgid "typmod array must be type cstring[]" msgstr "маÑив typmod повинен мати тип cstring[]" -#: utils/adt/arrayutils.c:245 +#: utils/adt/arrayutils.c:247 #, c-format msgid "typmod array must be one-dimensional" msgstr "маÑив typmod повинен бути одновимірним" -#: utils/adt/arrayutils.c:250 +#: utils/adt/arrayutils.c:252 #, c-format msgid "typmod array must not contain nulls" msgstr "маÑив typmod не повинен міÑтити елементи nulls" -#: utils/adt/ascii.c:76 +#: utils/adt/ascii.c:77 #, c-format msgid "encoding conversion from %s to ASCII not supported" msgstr "Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð· %s в ASCII не підтримуєтьÑÑ" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:153 utils/adt/cash.c:276 utils/adt/datetime.c:4058 -#: utils/adt/float.c:188 utils/adt/float.c:272 utils/adt/float.c:284 -#: utils/adt/float.c:401 utils/adt/float.c:486 utils/adt/float.c:502 -#: utils/adt/geo_ops.c:220 utils/adt/geo_ops.c:230 utils/adt/geo_ops.c:242 -#: utils/adt/geo_ops.c:274 utils/adt/geo_ops.c:316 utils/adt/geo_ops.c:326 -#: utils/adt/geo_ops.c:974 utils/adt/geo_ops.c:1389 utils/adt/geo_ops.c:1424 -#: utils/adt/geo_ops.c:1432 utils/adt/geo_ops.c:3392 utils/adt/geo_ops.c:4604 -#: utils/adt/geo_ops.c:4619 utils/adt/geo_ops.c:4626 utils/adt/int.c:165 -#: utils/adt/int.c:177 utils/adt/jsonpath.c:184 utils/adt/mac.c:93 -#: utils/adt/mac8.c:93 utils/adt/mac8.c:166 utils/adt/mac8.c:184 -#: utils/adt/mac8.c:202 utils/adt/mac8.c:221 utils/adt/network.c:99 -#: utils/adt/numeric.c:698 utils/adt/numeric.c:717 utils/adt/numeric.c:6854 -#: utils/adt/numeric.c:6878 utils/adt/numeric.c:6902 utils/adt/numeric.c:7904 -#: utils/adt/numutils.c:158 utils/adt/numutils.c:234 utils/adt/numutils.c:318 -#: utils/adt/oid.c:44 utils/adt/oid.c:58 utils/adt/oid.c:64 utils/adt/oid.c:86 -#: utils/adt/pg_lsn.c:74 utils/adt/tid.c:76 utils/adt/tid.c:84 -#: utils/adt/tid.c:98 utils/adt/tid.c:107 utils/adt/timestamp.c:497 -#: utils/adt/uuid.c:135 utils/adt/xid8funcs.c:346 +#: utils/adt/bool.c:149 utils/adt/cash.c:354 utils/adt/datetime.c:4142 +#: utils/adt/float.c:200 utils/adt/float.c:287 utils/adt/float.c:301 +#: utils/adt/float.c:406 utils/adt/float.c:489 utils/adt/float.c:503 +#: utils/adt/geo_ops.c:250 utils/adt/geo_ops.c:335 utils/adt/geo_ops.c:974 +#: utils/adt/geo_ops.c:1417 utils/adt/geo_ops.c:1454 utils/adt/geo_ops.c:1462 +#: utils/adt/geo_ops.c:3428 utils/adt/geo_ops.c:4650 utils/adt/geo_ops.c:4665 +#: utils/adt/geo_ops.c:4672 utils/adt/int.c:174 utils/adt/int.c:186 +#: utils/adt/jsonpath.c:185 utils/adt/mac.c:94 utils/adt/mac8.c:226 +#: utils/adt/network.c:99 utils/adt/numeric.c:803 utils/adt/numeric.c:7221 +#: utils/adt/numeric.c:7424 utils/adt/numeric.c:8371 utils/adt/numutils.c:356 +#: utils/adt/numutils.c:618 utils/adt/numutils.c:880 utils/adt/numutils.c:919 +#: utils/adt/numutils.c:941 utils/adt/numutils.c:1005 utils/adt/numutils.c:1027 +#: utils/adt/pg_lsn.c:73 utils/adt/tid.c:72 utils/adt/tid.c:80 +#: utils/adt/tid.c:94 utils/adt/tid.c:103 utils/adt/timestamp.c:510 +#: utils/adt/uuid.c:140 utils/adt/xid8funcs.c:323 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "неприпуÑтимий ÑинтакÑÐ¸Ñ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s: \"%s\"" -#: utils/adt/cash.c:214 utils/adt/cash.c:239 utils/adt/cash.c:249 -#: utils/adt/cash.c:289 utils/adt/int.c:171 utils/adt/numutils.c:152 -#: utils/adt/numutils.c:228 utils/adt/numutils.c:312 utils/adt/oid.c:70 -#: utils/adt/oid.c:109 +#: utils/adt/cash.c:98 utils/adt/cash.c:111 utils/adt/cash.c:124 +#: utils/adt/cash.c:137 utils/adt/cash.c:150 #, c-format -msgid "value \"%s\" is out of range for type %s" -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" поза діапазоном Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" +msgid "money out of range" +msgstr "гроші поза діапазоном" -#: utils/adt/cash.c:651 utils/adt/cash.c:701 utils/adt/cash.c:752 -#: utils/adt/cash.c:801 utils/adt/cash.c:853 utils/adt/cash.c:903 -#: utils/adt/float.c:105 utils/adt/int.c:846 utils/adt/int.c:962 -#: utils/adt/int.c:1042 utils/adt/int.c:1104 utils/adt/int.c:1142 -#: utils/adt/int.c:1170 utils/adt/int8.c:515 utils/adt/int8.c:573 -#: utils/adt/int8.c:943 utils/adt/int8.c:1023 utils/adt/int8.c:1085 -#: utils/adt/int8.c:1165 utils/adt/numeric.c:3093 utils/adt/numeric.c:3116 -#: utils/adt/numeric.c:3201 utils/adt/numeric.c:3219 utils/adt/numeric.c:3315 -#: utils/adt/numeric.c:8453 utils/adt/numeric.c:8743 utils/adt/numeric.c:9068 -#: utils/adt/numeric.c:10525 utils/adt/timestamp.c:3337 +#: utils/adt/cash.c:161 utils/adt/cash.c:723 utils/adt/float.c:99 +#: utils/adt/int.c:843 utils/adt/int.c:959 utils/adt/int.c:1039 +#: utils/adt/int.c:1101 utils/adt/int.c:1139 utils/adt/int.c:1167 +#: utils/adt/int8.c:514 utils/adt/int8.c:572 utils/adt/int8.c:942 +#: utils/adt/int8.c:1022 utils/adt/int8.c:1084 utils/adt/int8.c:1164 +#: utils/adt/numeric.c:3191 utils/adt/numeric.c:3214 utils/adt/numeric.c:3299 +#: utils/adt/numeric.c:3317 utils/adt/numeric.c:3413 utils/adt/numeric.c:8920 +#: utils/adt/numeric.c:9233 utils/adt/numeric.c:9581 utils/adt/numeric.c:9697 +#: utils/adt/numeric.c:11208 utils/adt/timestamp.c:3713 #, c-format msgid "division by zero" msgstr "Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð½Ð° нуль" -#: utils/adt/char.c:196 +#: utils/adt/cash.c:292 utils/adt/cash.c:317 utils/adt/cash.c:327 +#: utils/adt/cash.c:367 utils/adt/int.c:180 utils/adt/numutils.c:350 +#: utils/adt/numutils.c:612 utils/adt/numutils.c:874 utils/adt/numutils.c:925 +#: utils/adt/numutils.c:964 utils/adt/numutils.c:1011 +#, c-format +msgid "value \"%s\" is out of range for type %s" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" поза діапазоном Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" + +#: utils/adt/char.c:197 #, c-format msgid "\"char\" out of range" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"char\" поза діапазоном" -#: utils/adt/cryptohashfuncs.c:47 utils/adt/cryptohashfuncs.c:69 +#: utils/adt/cryptohashfuncs.c:48 utils/adt/cryptohashfuncs.c:70 #, c-format msgid "could not compute %s hash: %s" msgstr "не вдалоÑÑ Ð¾Ð±Ñ‡Ð¸Ñлити %s хеш: %s" -#: utils/adt/date.c:63 utils/adt/timestamp.c:98 utils/adt/varbit.c:105 +#: utils/adt/date.c:64 utils/adt/timestamp.c:116 utils/adt/varbit.c:105 #: utils/adt/varchar.c:48 #, c-format msgid "invalid type modifier" msgstr "неприпуÑтимий тип модифікатора" -#: utils/adt/date.c:75 +#: utils/adt/date.c:76 #, c-format msgid "TIME(%d)%s precision must not be negative" msgstr "TIME(%d)%s точніÑть не повинна бути від'ємною" -#: utils/adt/date.c:81 +#: utils/adt/date.c:82 #, c-format msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%s точніÑть зменшена до дозволеного макÑимуму, %d" -#: utils/adt/date.c:160 utils/adt/date.c:168 utils/adt/formatting.c:4294 -#: utils/adt/formatting.c:4303 utils/adt/formatting.c:4409 -#: utils/adt/formatting.c:4419 +#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4424 +#: utils/adt/formatting.c:4433 utils/adt/formatting.c:4538 +#: utils/adt/formatting.c:4548 #, c-format msgid "date out of range: \"%s\"" msgstr "дата поза діапазоном: \"%s\"" -#: utils/adt/date.c:215 utils/adt/date.c:513 utils/adt/date.c:537 -#: utils/adt/xml.c:2209 +#: utils/adt/date.c:222 utils/adt/date.c:520 utils/adt/date.c:544 +#: utils/adt/rangetypes.c:1584 utils/adt/rangetypes.c:1599 utils/adt/xml.c:2552 #, c-format msgid "date out of range" msgstr "дата поза діапазоном" -#: utils/adt/date.c:261 utils/adt/timestamp.c:581 +#: utils/adt/date.c:268 utils/adt/timestamp.c:598 #, c-format msgid "date field value out of range: %d-%02d-%02d" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ date поза діапазоном: %d-%02d-%02d" -#: utils/adt/date.c:268 utils/adt/date.c:277 utils/adt/timestamp.c:587 +#: utils/adt/date.c:275 utils/adt/date.c:284 utils/adt/timestamp.c:604 #, c-format msgid "date out of range: %d-%02d-%02d" msgstr "дата поза діапазоном: %d-%02d-%02d" -#: utils/adt/date.c:488 +#: utils/adt/date.c:495 #, c-format msgid "cannot subtract infinite dates" msgstr "віднімати безкінечні дати не можна" -#: utils/adt/date.c:586 utils/adt/date.c:649 utils/adt/date.c:685 -#: utils/adt/date.c:2868 utils/adt/date.c:2878 +#: utils/adt/date.c:593 utils/adt/date.c:656 utils/adt/date.c:692 +#: utils/adt/date.c:2906 utils/adt/date.c:2916 #, c-format msgid "date out of range for timestamp" msgstr "Ð´Ð»Ñ Ð¿Ð¾Ð·Ð½Ð°Ñ‡ÐºÐ¸ чаÑу дата поза діапазоном" -#: utils/adt/date.c:1115 utils/adt/date.c:1198 utils/adt/date.c:1214 -#: utils/adt/date.c:2195 utils/adt/date.c:2973 utils/adt/timestamp.c:4032 -#: utils/adt/timestamp.c:4225 utils/adt/timestamp.c:4397 -#: utils/adt/timestamp.c:4650 utils/adt/timestamp.c:4851 -#: utils/adt/timestamp.c:4898 utils/adt/timestamp.c:5122 -#: utils/adt/timestamp.c:5169 utils/adt/timestamp.c:5299 +#: utils/adt/date.c:1122 utils/adt/date.c:1205 utils/adt/date.c:1221 +#: utils/adt/date.c:2215 utils/adt/date.c:3011 utils/adt/timestamp.c:4726 +#: utils/adt/timestamp.c:4941 utils/adt/timestamp.c:5089 +#: utils/adt/timestamp.c:5342 utils/adt/timestamp.c:5543 +#: utils/adt/timestamp.c:5590 utils/adt/timestamp.c:5814 +#: utils/adt/timestamp.c:5861 utils/adt/timestamp.c:5941 +#: utils/adt/timestamp.c:6070 #, c-format msgid "unit \"%s\" not supported for type %s" msgstr "Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ \"%s\" не підтримуєтьÑÑ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" -#: utils/adt/date.c:1223 utils/adt/date.c:2211 utils/adt/date.c:2993 -#: utils/adt/timestamp.c:4046 utils/adt/timestamp.c:4242 -#: utils/adt/timestamp.c:4411 utils/adt/timestamp.c:4610 -#: utils/adt/timestamp.c:4907 utils/adt/timestamp.c:5178 -#: utils/adt/timestamp.c:5360 +#: utils/adt/date.c:1230 utils/adt/date.c:2231 utils/adt/date.c:3031 +#: utils/adt/timestamp.c:4740 utils/adt/timestamp.c:4958 +#: utils/adt/timestamp.c:5103 utils/adt/timestamp.c:5302 +#: utils/adt/timestamp.c:5599 utils/adt/timestamp.c:5870 +#: utils/adt/timestamp.c:5911 utils/adt/timestamp.c:6131 #, c-format msgid "unit \"%s\" not recognized for type %s" msgstr "нерозпізнана Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ \"%s\" Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" -#: utils/adt/date.c:1307 utils/adt/date.c:1353 utils/adt/date.c:1907 -#: utils/adt/date.c:1938 utils/adt/date.c:1967 utils/adt/date.c:2831 -#: utils/adt/date.c:3078 utils/adt/datetime.c:420 utils/adt/datetime.c:1869 -#: utils/adt/formatting.c:4136 utils/adt/formatting.c:4172 -#: utils/adt/formatting.c:4263 utils/adt/formatting.c:4385 utils/adt/json.c:440 -#: utils/adt/json.c:479 utils/adt/timestamp.c:225 utils/adt/timestamp.c:257 -#: utils/adt/timestamp.c:699 utils/adt/timestamp.c:708 -#: utils/adt/timestamp.c:786 utils/adt/timestamp.c:819 -#: utils/adt/timestamp.c:2916 utils/adt/timestamp.c:2937 -#: utils/adt/timestamp.c:2950 utils/adt/timestamp.c:2959 -#: utils/adt/timestamp.c:2967 utils/adt/timestamp.c:3022 -#: utils/adt/timestamp.c:3045 utils/adt/timestamp.c:3058 -#: utils/adt/timestamp.c:3069 utils/adt/timestamp.c:3077 -#: utils/adt/timestamp.c:3736 utils/adt/timestamp.c:3860 -#: utils/adt/timestamp.c:3950 utils/adt/timestamp.c:4040 -#: utils/adt/timestamp.c:4133 utils/adt/timestamp.c:4236 -#: utils/adt/timestamp.c:4715 utils/adt/timestamp.c:4989 -#: utils/adt/timestamp.c:5439 utils/adt/timestamp.c:5453 -#: utils/adt/timestamp.c:5458 utils/adt/timestamp.c:5472 -#: utils/adt/timestamp.c:5505 utils/adt/timestamp.c:5592 -#: utils/adt/timestamp.c:5633 utils/adt/timestamp.c:5637 -#: utils/adt/timestamp.c:5706 utils/adt/timestamp.c:5710 -#: utils/adt/timestamp.c:5724 utils/adt/timestamp.c:5758 utils/adt/xml.c:2231 -#: utils/adt/xml.c:2238 utils/adt/xml.c:2258 utils/adt/xml.c:2265 +#: utils/adt/date.c:1314 utils/adt/date.c:1360 utils/adt/date.c:1919 +#: utils/adt/date.c:1950 utils/adt/date.c:1979 utils/adt/date.c:2869 +#: utils/adt/date.c:3101 utils/adt/datetime.c:422 utils/adt/datetime.c:1807 +#: utils/adt/formatting.c:4269 utils/adt/formatting.c:4305 +#: utils/adt/formatting.c:4392 utils/adt/formatting.c:4514 utils/adt/json.c:366 +#: utils/adt/json.c:405 utils/adt/timestamp.c:248 utils/adt/timestamp.c:280 +#: utils/adt/timestamp.c:716 utils/adt/timestamp.c:725 +#: utils/adt/timestamp.c:803 utils/adt/timestamp.c:836 +#: utils/adt/timestamp.c:3066 utils/adt/timestamp.c:3075 +#: utils/adt/timestamp.c:3092 utils/adt/timestamp.c:3097 +#: utils/adt/timestamp.c:3116 utils/adt/timestamp.c:3129 +#: utils/adt/timestamp.c:3140 utils/adt/timestamp.c:3146 +#: utils/adt/timestamp.c:3152 utils/adt/timestamp.c:3157 +#: utils/adt/timestamp.c:3210 utils/adt/timestamp.c:3219 +#: utils/adt/timestamp.c:3240 utils/adt/timestamp.c:3245 +#: utils/adt/timestamp.c:3266 utils/adt/timestamp.c:3279 +#: utils/adt/timestamp.c:3293 utils/adt/timestamp.c:3301 +#: utils/adt/timestamp.c:3307 utils/adt/timestamp.c:3312 +#: utils/adt/timestamp.c:4380 utils/adt/timestamp.c:4532 +#: utils/adt/timestamp.c:4608 utils/adt/timestamp.c:4644 +#: utils/adt/timestamp.c:4734 utils/adt/timestamp.c:4813 +#: utils/adt/timestamp.c:4849 utils/adt/timestamp.c:4952 +#: utils/adt/timestamp.c:5407 utils/adt/timestamp.c:5681 +#: utils/adt/timestamp.c:6199 utils/adt/timestamp.c:6209 +#: utils/adt/timestamp.c:6214 utils/adt/timestamp.c:6220 +#: utils/adt/timestamp.c:6260 utils/adt/timestamp.c:6347 +#: utils/adt/timestamp.c:6388 utils/adt/timestamp.c:6392 +#: utils/adt/timestamp.c:6446 utils/adt/timestamp.c:6450 +#: utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2574 +#: utils/adt/xml.c:2581 utils/adt/xml.c:2601 utils/adt/xml.c:2608 #, c-format msgid "timestamp out of range" msgstr "позначка чаÑу поза діапазоном" -#: utils/adt/date.c:1524 utils/adt/date.c:2326 utils/adt/formatting.c:4471 +#: utils/adt/date.c:1536 utils/adt/date.c:2352 utils/adt/formatting.c:4597 #, c-format msgid "time out of range" msgstr "Ñ‡Ð°Ñ Ð¿Ð¾Ð·Ð° діапазоном" -#: utils/adt/date.c:1576 utils/adt/timestamp.c:596 +#: utils/adt/date.c:1588 utils/adt/timestamp.c:613 #, c-format msgid "time field value out of range: %d:%02d:%02g" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ time поза діапазоном: %d:%02d:%02g" -#: utils/adt/date.c:2096 utils/adt/date.c:2630 utils/adt/float.c:1048 -#: utils/adt/float.c:1124 utils/adt/int.c:638 utils/adt/int.c:685 -#: utils/adt/int.c:720 utils/adt/int8.c:414 utils/adt/numeric.c:2497 -#: utils/adt/timestamp.c:3386 utils/adt/timestamp.c:3417 -#: utils/adt/timestamp.c:3448 +#: utils/adt/date.c:2020 +#, c-format +msgid "cannot convert infinite interval to time" +msgstr "не можна перетворити неÑкінченний інтервал у чаÑ" + +#: utils/adt/date.c:2061 utils/adt/date.c:2605 +#, c-format +msgid "cannot add infinite interval to time" +msgstr "не можна додати неÑкінченний інтервал до чаÑу" + +#: utils/adt/date.c:2084 utils/adt/date.c:2632 +#, c-format +msgid "cannot subtract infinite interval from time" +msgstr "не можна віднÑти від чаÑу неÑкінченний інтервал" + +#: utils/adt/date.c:2115 utils/adt/date.c:2667 utils/adt/float.c:1036 +#: utils/adt/float.c:1112 utils/adt/int.c:635 utils/adt/int.c:682 +#: utils/adt/int.c:717 utils/adt/int8.c:413 utils/adt/numeric.c:2595 +#: utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 +#: utils/adt/timestamp.c:3888 #, c-format msgid "invalid preceding or following size in window function" msgstr "неприпуÑтимий розмір preceding або following у віконній функції" -#: utils/adt/date.c:2334 +#: utils/adt/date.c:2360 #, c-format msgid "time zone displacement out of range" msgstr "зÑув чаÑового поÑÑу поза діапазоном" -#: utils/adt/date.c:3084 utils/adt/datetime.c:1121 utils/adt/datetime.c:2027 -#: utils/adt/datetime.c:4906 utils/adt/timestamp.c:516 -#: utils/adt/timestamp.c:543 utils/adt/timestamp.c:4319 -#: utils/adt/timestamp.c:5464 utils/adt/timestamp.c:5716 +#: utils/adt/date.c:3132 utils/adt/timestamp.c:6242 utils/adt/timestamp.c:6479 #, c-format -msgid "time zone \"%s\" not recognized" -msgstr "чаÑовий поÑÑ \"%s\" не розпізнаний" +msgid "interval time zone \"%s\" must be finite" +msgstr "чаÑовий поÑÑ Ñ–Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ñƒ \"%s\" має бути Ñкінченним" -#: utils/adt/date.c:3116 utils/adt/timestamp.c:5494 utils/adt/timestamp.c:5747 +#: utils/adt/date.c:3139 utils/adt/timestamp.c:6249 utils/adt/timestamp.c:6486 #, c-format msgid "interval time zone \"%s\" must not include months or days" msgstr "інтервал \"%s\", Ñкий задає чаÑовий поÑÑ, не повинен включати міÑÑці або дні" -#: utils/adt/datetime.c:4031 utils/adt/datetime.c:4038 +#: utils/adt/datetime.c:3232 utils/adt/datetime.c:4127 +#: utils/adt/datetime.c:4133 utils/adt/timestamp.c:528 +#, c-format +msgid "time zone \"%s\" not recognized" +msgstr "чаÑовий поÑÑ \"%s\" не розпізнаний" + +#: utils/adt/datetime.c:4101 utils/adt/datetime.c:4108 #, c-format msgid "date/time field value out of range: \"%s\"" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ дата/Ñ‡Ð°Ñ Ð¿Ð¾Ð·Ð° діапазоном: \"%s\"" -#: utils/adt/datetime.c:4040 +#: utils/adt/datetime.c:4110 #, c-format msgid "Perhaps you need a different \"datestyle\" setting." msgstr "Можливо, вам потрібні інші Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"datestyle\"." -#: utils/adt/datetime.c:4045 +#: utils/adt/datetime.c:4115 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ інтервал, поза діапазоном: \"%s\"" -#: utils/adt/datetime.c:4051 +#: utils/adt/datetime.c:4121 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ‡Ð°Ñового поÑÑу, поза діапазоном: \"%s\"" -#: utils/adt/datetime.c:4908 +#: utils/adt/datetime.c:4135 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "Це ім'Ñ Ñ‡Ð°Ñового поÑÑу з'ÑвлÑєтьÑÑ Ñƒ файлі конфігурації чаÑового поÑÑу з кодом \"%s\"." @@ -23152,75 +24430,75 @@ msgstr "Це ім'Ñ Ñ‡Ð°Ñового поÑÑу з'ÑвлÑєтьÑÑ Ñƒ фай msgid "invalid Datum pointer" msgstr "неприпуÑтимий вказівник Datum" -#: utils/adt/dbsize.c:747 utils/adt/dbsize.c:813 +#: utils/adt/dbsize.c:764 utils/adt/dbsize.c:840 #, c-format msgid "invalid size: \"%s\"" msgstr "неприпуÑтимий розмір: \"%s\"" -#: utils/adt/dbsize.c:814 +#: utils/adt/dbsize.c:841 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "ÐеприпуÑтима Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ Ð²Ð¸Ð¼Ñ–Ñ€ÑŽÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·Ð¼Ñ–Ñ€Ñƒ: \"%s\"." -#: utils/adt/dbsize.c:815 +#: utils/adt/dbsize.c:842 #, c-format -msgid "Valid units are \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." -msgstr "ПрипуÑтимі одиниці вимірюваннÑ: \"bytes\", \"kB\", \"MB\", \"GB\", \"TB\", Ñ– \"PB\"." +msgid "Valid units are \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", and \"PB\"." +msgstr "ПрипуÑтимі одиниці вимірюваннÑ: \"bytes\", \"B\", \"kB\", \"MB\", \"GB\", \"TB\", Ñ– \"PB\"." -#: utils/adt/domains.c:92 +#: utils/adt/domains.c:95 #, c-format msgid "type %s is not a domain" msgstr "тип %s не Ñ” доменом" -#: utils/adt/encode.c:65 utils/adt/encode.c:113 +#: utils/adt/encode.c:66 utils/adt/encode.c:114 #, c-format msgid "unrecognized encoding: \"%s\"" msgstr "нерозпізнане кодуваннÑ: \"%s\"" -#: utils/adt/encode.c:79 +#: utils/adt/encode.c:80 #, c-format msgid "result of encoding conversion is too large" msgstr "результат Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ великий" -#: utils/adt/encode.c:127 +#: utils/adt/encode.c:128 #, c-format msgid "result of decoding conversion is too large" msgstr "результат Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ великий" -#: utils/adt/encode.c:186 +#: utils/adt/encode.c:217 utils/adt/encode.c:227 #, c-format msgid "invalid hexadecimal digit: \"%.*s\"" msgstr "неприпуÑтиме шіÑтнадцÑткове чиÑло: \"%.*s\"" -#: utils/adt/encode.c:216 +#: utils/adt/encode.c:223 #, c-format msgid "invalid hexadecimal data: odd number of digits" msgstr "неприпуÑтимі шіÑтнадцÑдкові дані: непарна кількіÑть чиÑел" -#: utils/adt/encode.c:334 +#: utils/adt/encode.c:344 #, c-format msgid "unexpected \"=\" while decoding base64 sequence" msgstr "неочікуваний Ñимвол \"=\" під Ñ‡Ð°Ñ Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑлідовноÑті base64" -#: utils/adt/encode.c:346 +#: utils/adt/encode.c:356 #, c-format msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" msgstr "виÑвлено неприпуÑтимий Ñимвол \"%.*s\" під Ñ‡Ð°Ñ Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑлідовноÑті base64" -#: utils/adt/encode.c:367 +#: utils/adt/encode.c:377 #, c-format msgid "invalid base64 end sequence" msgstr "неприпуÑтима Ñкінченна поÑлідовніÑть base64" -#: utils/adt/encode.c:368 +#: utils/adt/encode.c:378 #, c-format msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "Вхідні дані позбавлені можливоÑті заповненнÑ, Ñкорочені, або пошкоджені іншим чином." -#: utils/adt/encode.c:482 utils/adt/encode.c:547 utils/adt/jsonfuncs.c:623 -#: utils/adt/varlena.c:335 utils/adt/varlena.c:376 jsonpath_gram.y:528 -#: jsonpath_scan.l:515 jsonpath_scan.l:526 jsonpath_scan.l:536 -#: jsonpath_scan.l:578 +#: utils/adt/encode.c:492 utils/adt/encode.c:557 utils/adt/jsonfuncs.c:659 +#: utils/adt/varlena.c:333 utils/adt/varlena.c:374 jsonpath_gram.y:266 +#: jsonpath_gram.y:598 jsonpath_scan.l:640 jsonpath_scan.l:651 +#: jsonpath_scan.l:661 jsonpath_scan.l:712 #, c-format msgid "invalid input syntax for type %s" msgstr "неприпуÑтимий вхідний ÑинтакÑÐ¸Ñ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" @@ -23235,375 +24513,370 @@ msgstr "небезпечне викориÑÑ‚Ð°Ð½Ð½Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ значен msgid "New enum values must be committed before they can be used." msgstr "Ðові Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ»Ñ–ÐºÑƒ повинні бути затверджені, перш ніж Ñ—Ñ… можна викориÑтовувати." -#: utils/adt/enum.c:120 utils/adt/enum.c:130 utils/adt/enum.c:188 -#: utils/adt/enum.c:198 +#: utils/adt/enum.c:121 utils/adt/enum.c:131 utils/adt/enum.c:194 +#: utils/adt/enum.c:204 #, c-format msgid "invalid input value for enum %s: \"%s\"" msgstr "неприпуÑтиме вхідне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ»Ñ–ÐºÑƒ %s: \"%s\"" -#: utils/adt/enum.c:160 utils/adt/enum.c:226 utils/adt/enum.c:285 +#: utils/adt/enum.c:166 utils/adt/enum.c:232 utils/adt/enum.c:291 #, c-format msgid "invalid internal value for enum: %u" msgstr "неприпуÑтиме внутрішнє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ»Ñ–ÐºÑƒ: %u" -#: utils/adt/enum.c:445 utils/adt/enum.c:474 utils/adt/enum.c:514 -#: utils/adt/enum.c:534 +#: utils/adt/enum.c:451 utils/adt/enum.c:480 utils/adt/enum.c:520 +#: utils/adt/enum.c:540 #, c-format msgid "could not determine actual enum type" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ фактичний тип переліку" -#: utils/adt/enum.c:453 utils/adt/enum.c:482 +#: utils/adt/enum.c:459 utils/adt/enum.c:488 #, c-format msgid "enum %s contains no values" msgstr "перелік %s не міÑтить значень" -#: utils/adt/float.c:89 +#: utils/adt/float.c:83 #, c-format msgid "value out of range: overflow" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð·Ð° діапазоном: надлишок" -#: utils/adt/float.c:97 +#: utils/adt/float.c:91 #, c-format msgid "value out of range: underflow" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð·Ð° діапазоном: недоÑтача" -#: utils/adt/float.c:266 +#: utils/adt/float.c:280 #, c-format msgid "\"%s\" is out of range for type real" msgstr "\"%s\" поза діапазоном Ð´Ð»Ñ Ð´Ñ–Ð¹Ñного типу" -#: utils/adt/float.c:478 +#: utils/adt/float.c:482 #, c-format msgid "\"%s\" is out of range for type double precision" msgstr "\"%s\" поза діапазоном Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ double precision" -#: utils/adt/float.c:1259 utils/adt/float.c:1333 utils/adt/int.c:358 -#: utils/adt/int.c:896 utils/adt/int.c:918 utils/adt/int.c:932 -#: utils/adt/int.c:946 utils/adt/int.c:978 utils/adt/int.c:1216 -#: utils/adt/int8.c:1278 utils/adt/numeric.c:4377 utils/adt/numeric.c:4382 +#: utils/adt/float.c:1247 utils/adt/float.c:1321 utils/adt/int.c:355 +#: utils/adt/int.c:893 utils/adt/int.c:915 utils/adt/int.c:929 +#: utils/adt/int.c:943 utils/adt/int.c:975 utils/adt/int.c:1213 +#: utils/adt/int8.c:1277 utils/adt/numeric.c:4593 utils/adt/numeric.c:4598 #, c-format msgid "smallint out of range" msgstr "двобайтове ціле поза діапазоном" -#: utils/adt/float.c:1459 utils/adt/numeric.c:3611 utils/adt/numeric.c:9482 +#: utils/adt/float.c:1447 utils/adt/numeric.c:3709 utils/adt/numeric.c:10112 #, c-format msgid "cannot take square root of a negative number" msgstr "вилучити квадратний корінь від'ємного чиÑла не можна" -#: utils/adt/float.c:1527 utils/adt/numeric.c:3886 utils/adt/numeric.c:3998 +#: utils/adt/float.c:1515 utils/adt/numeric.c:3997 utils/adt/numeric.c:4109 #, c-format msgid "zero raised to a negative power is undefined" msgstr "нуль у від'ємному Ñтупені дає невизначеніÑть" -#: utils/adt/float.c:1531 utils/adt/numeric.c:3890 utils/adt/numeric.c:10378 +#: utils/adt/float.c:1519 utils/adt/numeric.c:4001 utils/adt/numeric.c:11003 #, c-format msgid "a negative number raised to a non-integer power yields a complex result" msgstr "від'ємне чиÑло у не цілому Ñтупені дає комплекÑний результат" -#: utils/adt/float.c:1707 utils/adt/float.c:1740 utils/adt/numeric.c:3798 -#: utils/adt/numeric.c:10153 +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3909 +#: utils/adt/numeric.c:10783 #, c-format msgid "cannot take logarithm of zero" msgstr "обчиÑлити логарифм Ð½ÑƒÐ»Ñ Ð½Ðµ можна" -#: utils/adt/float.c:1711 utils/adt/float.c:1744 utils/adt/numeric.c:3736 -#: utils/adt/numeric.c:3793 utils/adt/numeric.c:10157 +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3847 +#: utils/adt/numeric.c:3904 utils/adt/numeric.c:10787 #, c-format msgid "cannot take logarithm of a negative number" msgstr "обчиÑлити логарифм від'ємного чиÑла не можна" -#: utils/adt/float.c:1777 utils/adt/float.c:1808 utils/adt/float.c:1903 -#: utils/adt/float.c:1930 utils/adt/float.c:1958 utils/adt/float.c:1985 -#: utils/adt/float.c:2132 utils/adt/float.c:2169 utils/adt/float.c:2339 -#: utils/adt/float.c:2395 utils/adt/float.c:2460 utils/adt/float.c:2517 -#: utils/adt/float.c:2708 utils/adt/float.c:2732 +#: utils/adt/float.c:1765 utils/adt/float.c:1796 utils/adt/float.c:1891 +#: utils/adt/float.c:1918 utils/adt/float.c:1946 utils/adt/float.c:1973 +#: utils/adt/float.c:2120 utils/adt/float.c:2157 utils/adt/float.c:2327 +#: utils/adt/float.c:2383 utils/adt/float.c:2448 utils/adt/float.c:2505 +#: utils/adt/float.c:2696 utils/adt/float.c:2720 #, c-format msgid "input is out of range" msgstr "введене Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð·Ð° діапазоном" -#: utils/adt/float.c:2796 -#, c-format -msgid "setseed parameter %g is out of allowed range [-1,1]" -msgstr "параметр setseed %g поза допуÑтимим діапазоном [-1,1]" - -#: utils/adt/float.c:4024 utils/adt/numeric.c:1770 +#: utils/adt/float.c:4000 utils/adt/numeric.c:1857 #, c-format msgid "count must be greater than zero" msgstr "лічильник повинен бути більше нулÑ" -#: utils/adt/float.c:4029 utils/adt/numeric.c:1781 +#: utils/adt/float.c:4005 utils/adt/numeric.c:1868 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "операнд, Ð½Ð¸Ð¶Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ñ– Ð²ÐµÑ€Ñ…Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ð½Ðµ можуть бути NaN" -#: utils/adt/float.c:4035 utils/adt/numeric.c:1786 +#: utils/adt/float.c:4011 utils/adt/numeric.c:1873 #, c-format msgid "lower and upper bounds must be finite" msgstr "Ð½Ð¸Ð¶Ð½Ñ Ñ– Ð²ÐµÑ€Ñ…Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ– повинні бути Ñкінченними" -#: utils/adt/float.c:4069 utils/adt/numeric.c:1800 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1887 #, c-format msgid "lower bound cannot equal upper bound" msgstr "Ð½Ð¸Ð¶Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ð½Ðµ може дорівнювати верхній границі" -#: utils/adt/formatting.c:561 +#: utils/adt/formatting.c:530 #, c-format msgid "invalid format specification for an interval value" msgstr "неприпуÑтима ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñƒ Ð´Ð»Ñ Ñ†Ñ–Ð»Ð¾Ð³Ð¾ значеннÑ" -#: utils/adt/formatting.c:562 +#: utils/adt/formatting.c:531 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "Інтервали не зв'ÑзуютьÑÑ Ð· певними календарними датами." -#: utils/adt/formatting.c:1187 +#: utils/adt/formatting.c:1161 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\" повинно бути оÑтаннім викориÑтаним шаблоном" -#: utils/adt/formatting.c:1195 +#: utils/adt/formatting.c:1169 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\" повинна бути до \"PR\"" -#: utils/adt/formatting.c:1211 +#: utils/adt/formatting.c:1185 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\" повинен бути до \"PR\"" -#: utils/adt/formatting.c:1238 +#: utils/adt/formatting.c:1212 #, c-format msgid "multiple decimal points" msgstr "чиÑленні деÑÑткові точки" -#: utils/adt/formatting.c:1242 utils/adt/formatting.c:1325 +#: utils/adt/formatting.c:1216 utils/adt/formatting.c:1299 #, c-format msgid "cannot use \"V\" and decimal point together" msgstr "викориÑтовувати \"V\" Ñ– деÑÑткову точку разом, не можна" -#: utils/adt/formatting.c:1254 +#: utils/adt/formatting.c:1228 #, c-format msgid "cannot use \"S\" twice" msgstr "викориÑтовувати \"S\" двічі, не можна" -#: utils/adt/formatting.c:1258 +#: utils/adt/formatting.c:1232 #, c-format msgid "cannot use \"S\" and \"PL\"/\"MI\"/\"SG\"/\"PR\" together" msgstr "викориÑтовувати \"S\" Ñ– \"PL\"/\"MI\"/\"SG\"/\"PR\" разом, не можна" -#: utils/adt/formatting.c:1278 +#: utils/adt/formatting.c:1252 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "викориÑтовувати \"S\" Ñ– \"MI\" разом, не можна" -#: utils/adt/formatting.c:1288 +#: utils/adt/formatting.c:1262 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "не можна викориÑтовувати \"S\" Ñ– \"PL\" разом" -#: utils/adt/formatting.c:1298 +#: utils/adt/formatting.c:1272 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "не можна викориÑтовувати \"S\" Ñ– \"SG\" разом" -#: utils/adt/formatting.c:1307 +#: utils/adt/formatting.c:1281 #, c-format msgid "cannot use \"PR\" and \"S\"/\"PL\"/\"MI\"/\"SG\" together" msgstr "не можна викориÑтовувати \"PR\" Ñ– \"S\"/\"PL\"/\"MI\"/\"SG\" разом" -#: utils/adt/formatting.c:1333 +#: utils/adt/formatting.c:1307 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "не можна викориÑтовувати \"EEEE\" двічі" -#: utils/adt/formatting.c:1339 +#: utils/adt/formatting.c:1313 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\" Ñ” неÑуміÑним з іншими форматами" -#: utils/adt/formatting.c:1340 +#: utils/adt/formatting.c:1314 #, c-format msgid "\"EEEE\" may only be used together with digit and decimal point patterns." msgstr "\"EEEE\" може викориÑтовуватиÑÑŒ лише разом з шаблонами цифр Ñ– деÑÑткової точки." -#: utils/adt/formatting.c:1424 +#: utils/adt/formatting.c:1398 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "неприпуÑтимий роздільник формату дати й чаÑу: \"%s\"" -#: utils/adt/formatting.c:1551 +#: utils/adt/formatting.c:1525 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\" не Ñ” чиÑлом" -#: utils/adt/formatting.c:1629 +#: utils/adt/formatting.c:1603 #, c-format msgid "case conversion failed: %s" msgstr "помилка при перетворенні регіÑтру: %s" -#: utils/adt/formatting.c:1683 utils/adt/formatting.c:1805 -#: utils/adt/formatting.c:1928 +#: utils/adt/formatting.c:1651 utils/adt/formatting.c:1799 +#: utils/adt/formatting.c:1989 #, c-format msgid "could not determine which collation to use for %s function" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ Ñкий параметр ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтати Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— %s" -#: utils/adt/formatting.c:2309 +#: utils/adt/formatting.c:2410 #, c-format msgid "invalid combination of date conventions" msgstr "неприпуÑтиме Ð¿Ð¾Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñтилів дат" -#: utils/adt/formatting.c:2310 +#: utils/adt/formatting.c:2411 #, c-format msgid "Do not mix Gregorian and ISO week date conventions in a formatting template." msgstr "Ðе змішуйте Gregorian Ñ– ISO Ñтилі дат (тижнів) в одному шаблоні форматуваннÑ." -#: utils/adt/formatting.c:2333 +#: utils/adt/formatting.c:2433 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "конфліктуючі Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ \"%s\" Ð¿Ð¾Ð»Ñ Ð² Ñ€Ñдку форматуваннÑ" -#: utils/adt/formatting.c:2336 +#: utils/adt/formatting.c:2435 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "Це Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñуперечить попередньому параметри Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ Ñ‚Ð¾Ð³Ð¾ ж типу." -#: utils/adt/formatting.c:2407 +#: utils/adt/formatting.c:2502 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "вихідний Ñ€Ñдок занадто короткий Ð´Ð»Ñ \"%s\" Ð¿Ð¾Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ" -#: utils/adt/formatting.c:2410 +#: utils/adt/formatting.c:2504 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "Поле потребує %d Ñимволів, але залишилоÑÑŒ лише %d." -#: utils/adt/formatting.c:2413 utils/adt/formatting.c:2428 +#: utils/adt/formatting.c:2506 utils/adt/formatting.c:2520 #, c-format msgid "If your source string is not fixed-width, try using the \"FM\" modifier." msgstr "Якщо ваш вихідний Ñ€Ñдок не має поÑтійної ширини, Ñпробуйте викориÑтати \"FM\" модифікатор." -#: utils/adt/formatting.c:2423 utils/adt/formatting.c:2437 -#: utils/adt/formatting.c:2660 +#: utils/adt/formatting.c:2516 utils/adt/formatting.c:2529 +#: utils/adt/formatting.c:2750 utils/adt/formatting.c:3650 #, c-format msgid "invalid value \"%s\" for \"%s\"" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ \"%s\"" -#: utils/adt/formatting.c:2425 +#: utils/adt/formatting.c:2518 #, c-format msgid "Field requires %d characters, but only %d could be parsed." msgstr "Поле потребує %d Ñимволів, але вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ лише %d." -#: utils/adt/formatting.c:2439 +#: utils/adt/formatting.c:2531 #, c-format msgid "Value must be an integer." msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ðµ бути цілим чиÑлом." -#: utils/adt/formatting.c:2444 +#: utils/adt/formatting.c:2536 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ \"%s\" у вихідному Ñ€Ñдку поза діапазоном" -#: utils/adt/formatting.c:2446 +#: utils/adt/formatting.c:2538 #, c-format msgid "Value must be in the range %d to %d." msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ðµ бути в діапазоні %d до %d." -#: utils/adt/formatting.c:2662 +#: utils/adt/formatting.c:2752 #, c-format msgid "The given value did not match any of the allowed values for this field." msgstr "Дане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ відповідає жодному з доÑтупних значень Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ полÑ." -#: utils/adt/formatting.c:2881 utils/adt/formatting.c:2901 -#: utils/adt/formatting.c:2921 utils/adt/formatting.c:2941 -#: utils/adt/formatting.c:2960 utils/adt/formatting.c:2979 -#: utils/adt/formatting.c:3003 utils/adt/formatting.c:3021 -#: utils/adt/formatting.c:3039 utils/adt/formatting.c:3057 -#: utils/adt/formatting.c:3074 utils/adt/formatting.c:3091 +#: utils/adt/formatting.c:2968 utils/adt/formatting.c:2988 +#: utils/adt/formatting.c:3008 utils/adt/formatting.c:3028 +#: utils/adt/formatting.c:3047 utils/adt/formatting.c:3066 +#: utils/adt/formatting.c:3090 utils/adt/formatting.c:3108 +#: utils/adt/formatting.c:3126 utils/adt/formatting.c:3144 +#: utils/adt/formatting.c:3161 utils/adt/formatting.c:3178 #, c-format msgid "localized string format value too long" msgstr "занадто довге Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñƒ локалізованого Ñ€Ñдка" -#: utils/adt/formatting.c:3368 +#: utils/adt/formatting.c:3458 #, c-format msgid "unmatched format separator \"%c\"" -msgstr "невідповідний роздільник формату \"%c\"" +msgstr "невідповідний роздільник формату \"%c\"" -#: utils/adt/formatting.c:3429 +#: utils/adt/formatting.c:3519 #, c-format msgid "unmatched format character \"%s\"" msgstr "невідповідний формат Ñимволу \"%s\"" -#: utils/adt/formatting.c:3535 utils/adt/formatting.c:3879 +#: utils/adt/formatting.c:3652 #, c-format -msgid "formatting field \"%s\" is only supported in to_char" -msgstr "поле Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" підтримуєтьÑÑ Ð»Ð¸ÑˆÐµ в функції to_char" +msgid "Time zone abbreviation is not recognized." +msgstr "Ðбревіатуру чаÑової зони не розпізнано." -#: utils/adt/formatting.c:3710 +#: utils/adt/formatting.c:3853 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr "неприпуÑтимий вхідний Ñ€Ñдок Ð´Ð»Ñ \"Y,YYY\"" -#: utils/adt/formatting.c:3796 +#: utils/adt/formatting.c:3942 #, c-format msgid "input string is too short for datetime format" msgstr "вхідний Ñ€Ñдок занадто короткий Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñƒ дати й чаÑу" -#: utils/adt/formatting.c:3804 +#: utils/adt/formatting.c:3950 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "Ñимволи наприкінці залишаютьÑÑ Ñƒ вхідному Ñ€Ñдку піÑÐ»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñƒ дати й чаÑу" -#: utils/adt/formatting.c:4365 +#: utils/adt/formatting.c:4494 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "пропущено чаÑовий поÑÑ Ñƒ вхідному Ñ€Ñдку Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ timestamptz" -#: utils/adt/formatting.c:4371 +#: utils/adt/formatting.c:4500 #, c-format msgid "timestamptz out of range" msgstr "timestamptz поза діапазоном" -#: utils/adt/formatting.c:4399 +#: utils/adt/formatting.c:4528 #, c-format msgid "datetime format is zoned but not timed" msgstr "формат дати й чаÑу зоновано, але не приурочено" -#: utils/adt/formatting.c:4451 +#: utils/adt/formatting.c:4577 #, c-format msgid "missing time zone in input string for type timetz" msgstr "пропущено чаÑовий поÑÑ Ñƒ вхідному Ñ€Ñдку Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ timetz" -#: utils/adt/formatting.c:4457 +#: utils/adt/formatting.c:4583 #, c-format msgid "timetz out of range" msgstr "timetz поза діапазоном" -#: utils/adt/formatting.c:4483 +#: utils/adt/formatting.c:4609 #, c-format msgid "datetime format is not dated and not timed" msgstr "формат дати й чаÑу не датований Ñ– не приурочений" -#: utils/adt/formatting.c:4616 +#: utils/adt/formatting.c:4786 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "година \"%d\" неприпуÑтима Ð´Ð»Ñ 12-чаÑового годинника" -#: utils/adt/formatting.c:4618 +#: utils/adt/formatting.c:4788 #, c-format msgid "Use the 24-hour clock, or give an hour between 1 and 12." msgstr "ВикориÑтайте 24-чаÑовий годинник, або передавайте години від 1 до 12." -#: utils/adt/formatting.c:4729 +#: utils/adt/formatting.c:4900 #, c-format msgid "cannot calculate day of year without year information" msgstr "не можна обчиÑлити день року без інформації про рік" -#: utils/adt/formatting.c:5648 +#: utils/adt/formatting.c:5852 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\" не підтримуєтьÑÑ Ð¿Ñ€Ð¸ введенні" -#: utils/adt/formatting.c:5660 +#: utils/adt/formatting.c:5864 #, c-format msgid "\"RN\" not supported for input" msgstr "\"RN\" не підтримуєтьÑÑ Ð¿Ñ€Ð¸ введенні" @@ -23615,12 +24888,12 @@ msgstr "абÑолютний шлÑÑ… не дозволений" #: utils/adt/genfile.c:89 #, c-format -msgid "path must be in or below the current directory" -msgstr "шлÑÑ… повинен вказувати поточний або вкладений каталог" +msgid "path must be in or below the data directory" +msgstr "шлÑÑ… повинен вказувати каталог даних або вкладений каталог" -#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:189 -#: utils/adt/oracle_compat.c:287 utils/adt/oracle_compat.c:836 -#: utils/adt/oracle_compat.c:1139 +#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:190 +#: utils/adt/oracle_compat.c:288 utils/adt/oracle_compat.c:839 +#: utils/adt/oracle_compat.c:1142 #, c-format msgid "requested length too large" msgstr "запитана довжина занадто велика" @@ -23635,655 +24908,701 @@ msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ в файлі \"%s\": %m" msgid "file length too large" msgstr "довжина файлу завелика" -#: utils/adt/genfile.c:248 +#: utils/adt/genfile.c:656 #, c-format -msgid "must be superuser to read files with adminpack 1.0" -msgstr "щоб читати файли, викориÑтовуючи adminpack 1.0 потрібно бути ÑуперкориÑтувачем" +msgid "tablespace with OID %u does not exist" +msgstr "табличний проÑтір з OID %u не Ñ–Ñнує" -#: utils/adt/geo_ops.c:979 utils/adt/geo_ops.c:1025 +#: utils/adt/geo_ops.c:998 utils/adt/geo_ops.c:1052 #, c-format msgid "invalid line specification: A and B cannot both be zero" msgstr "неприпуÑтима ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ€Ñдка: A Ñ– B не можуть бути нульовими" -#: utils/adt/geo_ops.c:987 utils/adt/geo_ops.c:1097 +#: utils/adt/geo_ops.c:1008 utils/adt/geo_ops.c:1124 #, c-format msgid "invalid line specification: must be two distinct points" msgstr "неприпуÑтима ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ€Ñдка: повинно бути дві різних точки" -#: utils/adt/geo_ops.c:1410 utils/adt/geo_ops.c:3402 utils/adt/geo_ops.c:4327 -#: utils/adt/geo_ops.c:5207 +#: utils/adt/geo_ops.c:1438 utils/adt/geo_ops.c:3438 utils/adt/geo_ops.c:4368 +#: utils/adt/geo_ops.c:5253 #, c-format msgid "too many points requested" msgstr "запитано занадто багато точок" -#: utils/adt/geo_ops.c:1472 +#: utils/adt/geo_ops.c:1502 #, c-format msgid "invalid number of points in external \"path\" value" msgstr "неприпуÑтима кількіÑть точок у зовнішньому значенні \"path\"" -#: utils/adt/geo_ops.c:3449 +#: utils/adt/geo_ops.c:3487 #, c-format msgid "invalid number of points in external \"polygon\" value" msgstr "неприпуÑтима кількіÑть точок в зовнішньому значенні \"polygon\"" -#: utils/adt/geo_ops.c:4422 +#: utils/adt/geo_ops.c:4463 #, c-format msgid "open path cannot be converted to polygon" msgstr "відкритий шлÑÑ… не можна перетворити в багатокутник" -#: utils/adt/geo_ops.c:4672 +#: utils/adt/geo_ops.c:4718 #, c-format msgid "invalid radius in external \"circle\" value" msgstr "неприпуÑтимий Ñ€Ð°Ð´Ñ–ÑƒÑ Ñƒ зовнішньому значенні \"circle\"" -#: utils/adt/geo_ops.c:5193 +#: utils/adt/geo_ops.c:5239 #, c-format msgid "cannot convert circle with radius zero to polygon" msgstr "круг з нульовим радіуÑом не можна перетворити в багатокутник" -#: utils/adt/geo_ops.c:5198 +#: utils/adt/geo_ops.c:5244 #, c-format msgid "must request at least 2 points" msgstr "повинно бути запитано мінімум 2 точки" -#: utils/adt/int.c:188 -#, c-format -msgid "int2vector has too many elements" -msgstr "int2vector має занадто багато елементів" - -#: utils/adt/int.c:261 +#: utils/adt/int.c:264 #, c-format msgid "invalid int2vector data" msgstr "неприпуÑтимі дані int2vector" -#: utils/adt/int.c:267 utils/adt/oid.c:215 utils/adt/oid.c:296 -#, c-format -msgid "oidvector has too many elements" -msgstr "oidvector має занадто багато елементів" - -#: utils/adt/int.c:1532 utils/adt/int8.c:1404 utils/adt/numeric.c:1678 -#: utils/adt/timestamp.c:5809 utils/adt/timestamp.c:5889 +#: utils/adt/int.c:1529 utils/adt/int8.c:1403 utils/adt/numeric.c:1765 +#: utils/adt/timestamp.c:6546 utils/adt/timestamp.c:6632 #, c-format msgid "step size cannot equal zero" msgstr "розмір кроку не може дорівнювати нулю" -#: utils/adt/int8.c:449 utils/adt/int8.c:472 utils/adt/int8.c:486 -#: utils/adt/int8.c:500 utils/adt/int8.c:531 utils/adt/int8.c:555 -#: utils/adt/int8.c:637 utils/adt/int8.c:705 utils/adt/int8.c:711 -#: utils/adt/int8.c:737 utils/adt/int8.c:751 utils/adt/int8.c:775 -#: utils/adt/int8.c:788 utils/adt/int8.c:900 utils/adt/int8.c:914 -#: utils/adt/int8.c:928 utils/adt/int8.c:959 utils/adt/int8.c:981 -#: utils/adt/int8.c:995 utils/adt/int8.c:1009 utils/adt/int8.c:1042 -#: utils/adt/int8.c:1056 utils/adt/int8.c:1070 utils/adt/int8.c:1101 -#: utils/adt/int8.c:1123 utils/adt/int8.c:1137 utils/adt/int8.c:1151 -#: utils/adt/int8.c:1313 utils/adt/int8.c:1348 utils/adt/numeric.c:4336 +#: utils/adt/int8.c:448 utils/adt/int8.c:471 utils/adt/int8.c:485 +#: utils/adt/int8.c:499 utils/adt/int8.c:530 utils/adt/int8.c:554 +#: utils/adt/int8.c:636 utils/adt/int8.c:704 utils/adt/int8.c:710 +#: utils/adt/int8.c:736 utils/adt/int8.c:750 utils/adt/int8.c:774 +#: utils/adt/int8.c:787 utils/adt/int8.c:899 utils/adt/int8.c:913 +#: utils/adt/int8.c:927 utils/adt/int8.c:958 utils/adt/int8.c:980 +#: utils/adt/int8.c:994 utils/adt/int8.c:1008 utils/adt/int8.c:1041 +#: utils/adt/int8.c:1055 utils/adt/int8.c:1069 utils/adt/int8.c:1100 +#: utils/adt/int8.c:1122 utils/adt/int8.c:1136 utils/adt/int8.c:1150 +#: utils/adt/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4542 +#: utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 #: utils/adt/varbit.c:1676 #, c-format msgid "bigint out of range" msgstr "bigint поза діапазоном" -#: utils/adt/int8.c:1361 +#: utils/adt/int8.c:1360 #, c-format msgid "OID out of range" msgstr "OID поза діапазоном" -#: utils/adt/json.c:293 utils/adt/jsonb.c:747 +#: utils/adt/json.c:202 utils/adt/jsonb.c:664 #, c-format msgid "key value must be scalar, not array, composite, or json" msgstr "значеннÑм ключа повинен бути ÑкалÑÑ€, не маÑив, композитний тип, або json" -#: utils/adt/json.c:1069 utils/adt/json.c:1079 utils/fmgr/funcapi.c:2061 +#: utils/adt/json.c:1034 utils/adt/json.c:1044 utils/fmgr/funcapi.c:2090 #, c-format msgid "could not determine data type for argument %d" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ тип даних Ð´Ð»Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñƒ %d" -#: utils/adt/json.c:1102 utils/adt/jsonb.c:1811 +#: utils/adt/json.c:1067 utils/adt/json.c:1266 utils/adt/json.c:1449 +#: utils/adt/json.c:1527 utils/adt/jsonb.c:1333 utils/adt/jsonb.c:1423 #, c-format -msgid "field name must not be null" -msgstr "ім'Ñ Ð¿Ð¾Ð»Ñ Ð½Ðµ повинно бути null" +msgid "null value not allowed for object key" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ null не дозволене Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡Ð° об'єкту" -#: utils/adt/json.c:1141 utils/adt/json.c:1305 +#: utils/adt/json.c:1117 utils/adt/json.c:1288 #, c-format -msgid "duplicate JSON key %s" -msgstr "дублікат ключа JSON %s" +msgid "duplicate JSON object key value: %s" +msgstr "дублікат ключа об'єкта JSON: %s" -#: utils/adt/json.c:1249 utils/adt/jsonb.c:1195 +#: utils/adt/json.c:1226 utils/adt/jsonb.c:1134 #, c-format msgid "argument list must have even number of elements" msgstr "ÑпиÑок аргументів повинен мати парну кількіÑть елементів" #. translator: %s is a SQL function name -#: utils/adt/json.c:1251 utils/adt/jsonb.c:1197 +#: utils/adt/json.c:1228 utils/adt/jsonb.c:1136 #, c-format msgid "The arguments of %s must consist of alternating keys and values." msgstr "Ðргументи %s повинні ÑкладатиÑÑŒ з альтернативних ключей Ñ– значень." -#: utils/adt/json.c:1289 -#, c-format -msgid "argument %d cannot be null" -msgstr "аргумент %d не може бути null" - -#: utils/adt/json.c:1290 -#, c-format -msgid "Object keys should be text." -msgstr "Ключі об'єктів повинні бути текÑтовими." - -#: utils/adt/json.c:1444 utils/adt/jsonb.c:1372 +#: utils/adt/json.c:1427 utils/adt/jsonb.c:1311 #, c-format msgid "array must have two columns" msgstr "маÑив повинен мати два ÑтовпцÑ" -#: utils/adt/json.c:1468 utils/adt/json.c:1551 utils/adt/jsonb.c:1396 -#: utils/adt/jsonb.c:1491 -#, c-format -msgid "null value not allowed for object key" -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ null не дозволене Ð´Ð»Ñ ÐºÐ»ÑŽÑ‡Ð° об'єкту" - -#: utils/adt/json.c:1540 utils/adt/jsonb.c:1480 +#: utils/adt/json.c:1516 utils/adt/jsonb.c:1412 #, c-format msgid "mismatched array dimensions" msgstr "невідповідні виміри маÑиву" -#: utils/adt/json.c:1720 utils/adt/jsonb_util.c:1958 +#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1956 #, c-format msgid "duplicate JSON object key value" msgstr "дублікат Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° об'єкту JSON" -#: utils/adt/jsonb.c:276 +#: utils/adt/jsonb.c:282 #, c-format msgid "string too long to represent as jsonb string" msgstr "Ñ€Ñдок занадто довгий Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð² ÑкоÑті Ñ€Ñдка jsonb" -#: utils/adt/jsonb.c:277 +#: utils/adt/jsonb.c:283 #, c-format msgid "Due to an implementation restriction, jsonb strings cannot exceed %d bytes." msgstr "Через Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ ÑƒÐ¿Ñ€Ð¾Ð²Ð°Ð´Ð¶ÐµÐ½Ð½Ñ, Ñ€Ñдки jsonb не можуть перевищувати %d байт." -#: utils/adt/jsonb.c:1214 +#: utils/adt/jsonb.c:1153 #, c-format msgid "argument %d: key must not be null" msgstr "аргумент %d: ключ не повинен бути null" -#: utils/adt/jsonb.c:1873 +#: utils/adt/jsonb.c:1744 +#, c-format +msgid "field name must not be null" +msgstr "ім'Ñ Ð¿Ð¾Ð»Ñ Ð½Ðµ повинно бути null" + +#: utils/adt/jsonb.c:1806 #, c-format msgid "object keys must be strings" msgstr "ключі об'єктів повинні бути Ñ€Ñдками" -#: utils/adt/jsonb.c:2083 +#: utils/adt/jsonb.c:2017 #, c-format msgid "cannot cast jsonb null to type %s" msgstr "привеÑти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ jsonb null до типу %s не можна" -#: utils/adt/jsonb.c:2084 +#: utils/adt/jsonb.c:2018 #, c-format msgid "cannot cast jsonb string to type %s" msgstr "привеÑти Ñ€Ñдок jsonb до типу %s не можна" -#: utils/adt/jsonb.c:2085 +#: utils/adt/jsonb.c:2019 #, c-format msgid "cannot cast jsonb numeric to type %s" msgstr "привеÑти чиÑло jsonb до типу %s не можна" -#: utils/adt/jsonb.c:2086 +#: utils/adt/jsonb.c:2020 #, c-format msgid "cannot cast jsonb boolean to type %s" msgstr "привеÑти логічне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ jsonb до типу %s не можна" -#: utils/adt/jsonb.c:2087 +#: utils/adt/jsonb.c:2021 #, c-format msgid "cannot cast jsonb array to type %s" msgstr "привеÑти маÑив jsonb до типу %s не можна" -#: utils/adt/jsonb.c:2088 +#: utils/adt/jsonb.c:2022 #, c-format msgid "cannot cast jsonb object to type %s" msgstr "привеÑти об'єкт jsonb до типу %s не можна" -#: utils/adt/jsonb.c:2089 +#: utils/adt/jsonb.c:2023 #, c-format msgid "cannot cast jsonb array or object to type %s" msgstr "привеÑти маÑив або об'єкт jsonb до типу %s не можна" -#: utils/adt/jsonb_util.c:758 +#: utils/adt/jsonb_util.c:756 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "кількіÑть пар об'єкта jsonb перевищує макÑимально дозволену (%zu)" -#: utils/adt/jsonb_util.c:799 +#: utils/adt/jsonb_util.c:797 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "кількіÑть елементів маÑиву jsonb перевищує макÑимально дозволену(%zu)" -#: utils/adt/jsonb_util.c:1673 utils/adt/jsonb_util.c:1693 +#: utils/adt/jsonb_util.c:1671 utils/adt/jsonb_util.c:1691 #, c-format -msgid "total size of jsonb array elements exceeds the maximum of %u bytes" -msgstr "загальний розмір елементів маÑиву jsonb перевищує макÑимум (%u байт)" +msgid "total size of jsonb array elements exceeds the maximum of %d bytes" +msgstr "загальний розмір елементів маÑиву jsonb перевищує макÑимум %d байт" -#: utils/adt/jsonb_util.c:1754 utils/adt/jsonb_util.c:1789 -#: utils/adt/jsonb_util.c:1809 +#: utils/adt/jsonb_util.c:1752 utils/adt/jsonb_util.c:1787 +#: utils/adt/jsonb_util.c:1807 #, c-format -msgid "total size of jsonb object elements exceeds the maximum of %u bytes" -msgstr "загальний розмір елементів об'єкту jsonb перевищує макÑимум (%u байт)" +msgid "total size of jsonb object elements exceeds the maximum of %d bytes" +msgstr "загальний розмір елементів об'єкту jsonb перевищує макÑимум %d байт" -#: utils/adt/jsonbsubs.c:70 utils/adt/jsonbsubs.c:151 +#: utils/adt/jsonbsubs.c:67 utils/adt/jsonbsubs.c:148 #, c-format msgid "jsonb subscript does not support slices" msgstr "підрÑдковий Ñимвол jsonb не підтримує Ñектори" -#: utils/adt/jsonbsubs.c:103 utils/adt/jsonbsubs.c:117 +#: utils/adt/jsonbsubs.c:100 utils/adt/jsonbsubs.c:114 #, c-format msgid "subscript type %s is not supported" msgstr "тип підпиÑки %s не підтримуєтьÑÑ" -#: utils/adt/jsonbsubs.c:104 +#: utils/adt/jsonbsubs.c:101 #, c-format msgid "jsonb subscript must be coercible to only one type, integer or text." msgstr "підрÑдковий Ñимвол jsonb повинен бути приведений лише до одного типу, integer або text." -#: utils/adt/jsonbsubs.c:118 +#: utils/adt/jsonbsubs.c:115 #, c-format msgid "jsonb subscript must be coercible to either integer or text." msgstr "підрÑдковий Ñимвол jsonb повинен бути приведений або до integer, або до text." -#: utils/adt/jsonbsubs.c:139 +#: utils/adt/jsonbsubs.c:136 #, c-format msgid "jsonb subscript must have text type" msgstr "підрÑдковий Ñимвол jsonb повинен мати тип text" -#: utils/adt/jsonbsubs.c:207 +#: utils/adt/jsonbsubs.c:204 #, c-format msgid "jsonb subscript in assignment must not be null" msgstr "підрÑдковий Ñимвол jsonb у приÑвоєнні не повинен бути null" -#: utils/adt/jsonfuncs.c:555 utils/adt/jsonfuncs.c:791 -#: utils/adt/jsonfuncs.c:2360 utils/adt/jsonfuncs.c:2800 -#: utils/adt/jsonfuncs.c:3634 utils/adt/jsonfuncs.c:3967 +#: utils/adt/jsonfuncs.c:583 utils/adt/jsonfuncs.c:830 +#: utils/adt/jsonfuncs.c:2439 utils/adt/jsonfuncs.c:3015 +#: utils/adt/jsonfuncs.c:3948 utils/adt/jsonfuncs.c:4295 #, c-format msgid "cannot call %s on a scalar" msgstr "викликати %s зі ÑкалÑром, не можна" -#: utils/adt/jsonfuncs.c:560 utils/adt/jsonfuncs.c:778 -#: utils/adt/jsonfuncs.c:2802 utils/adt/jsonfuncs.c:3623 +#: utils/adt/jsonfuncs.c:588 utils/adt/jsonfuncs.c:815 +#: utils/adt/jsonfuncs.c:3017 utils/adt/jsonfuncs.c:3935 #, c-format msgid "cannot call %s on an array" msgstr "викликати %s з маÑивом, не можна" -#: utils/adt/jsonfuncs.c:617 jsonpath_scan.l:494 +#: utils/adt/jsonfuncs.c:647 jsonpath_scan.l:607 #, c-format msgid "unsupported Unicode escape sequence" msgstr "непідтримувана Ñпеціальна поÑлідовніÑть Unicode" -#: utils/adt/jsonfuncs.c:687 +#: utils/adt/jsonfuncs.c:724 #, c-format msgid "JSON data, line %d: %s%s%s" msgstr "Дані JSON, Ñ€Ñдок %d: %s%s%s" -#: utils/adt/jsonfuncs.c:1825 utils/adt/jsonfuncs.c:1860 +#: utils/adt/jsonfuncs.c:1883 utils/adt/jsonfuncs.c:1920 #, c-format msgid "cannot get array length of a scalar" msgstr "отримати довжину ÑкалÑра маÑиву не можна" -#: utils/adt/jsonfuncs.c:1829 utils/adt/jsonfuncs.c:1848 +#: utils/adt/jsonfuncs.c:1887 utils/adt/jsonfuncs.c:1906 #, c-format msgid "cannot get array length of a non-array" msgstr "отримати довжину маÑива Ð´Ð»Ñ Ð½Ðµ маÑиву не можна" -#: utils/adt/jsonfuncs.c:1922 +#: utils/adt/jsonfuncs.c:1986 #, c-format msgid "cannot call %s on a non-object" msgstr "викликати %s з не об'єктом, не можна" -#: utils/adt/jsonfuncs.c:2106 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot deconstruct an array as an object" msgstr "вилучити маÑив у виглÑді об'єкту не можна" -#: utils/adt/jsonfuncs.c:2118 +#: utils/adt/jsonfuncs.c:2188 #, c-format msgid "cannot deconstruct a scalar" msgstr "вилучити ÑкалÑÑ€ не можна" -#: utils/adt/jsonfuncs.c:2161 +#: utils/adt/jsonfuncs.c:2233 #, c-format msgid "cannot extract elements from a scalar" msgstr "вилучити елементи зі ÑкалÑру не можна" -#: utils/adt/jsonfuncs.c:2165 +#: utils/adt/jsonfuncs.c:2237 #, c-format msgid "cannot extract elements from an object" msgstr "вилучити елементи з об'єкту не можна" -#: utils/adt/jsonfuncs.c:2347 utils/adt/jsonfuncs.c:3852 +#: utils/adt/jsonfuncs.c:2424 utils/adt/jsonfuncs.c:4173 #, c-format msgid "cannot call %s on a non-array" msgstr "викликати %s з не маÑивом не можна" -#: utils/adt/jsonfuncs.c:2417 utils/adt/jsonfuncs.c:2422 -#: utils/adt/jsonfuncs.c:2439 utils/adt/jsonfuncs.c:2445 +#: utils/adt/jsonfuncs.c:2515 utils/adt/jsonfuncs.c:2520 +#: utils/adt/jsonfuncs.c:2538 utils/adt/jsonfuncs.c:2544 #, c-format msgid "expected JSON array" msgstr "очікувавÑÑ Ð¼Ð°Ñив JSON" -#: utils/adt/jsonfuncs.c:2418 +#: utils/adt/jsonfuncs.c:2516 #, c-format msgid "See the value of key \"%s\"." msgstr "Перевірте Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° \"%s\"." -#: utils/adt/jsonfuncs.c:2440 +#: utils/adt/jsonfuncs.c:2539 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "Перевірте елемент маÑиву %s ключа \"%s\"." -#: utils/adt/jsonfuncs.c:2446 +#: utils/adt/jsonfuncs.c:2545 #, c-format msgid "See the array element %s." msgstr "Перевірте елемент маÑиву %s." -#: utils/adt/jsonfuncs.c:2481 +#: utils/adt/jsonfuncs.c:2597 #, c-format msgid "malformed JSON array" msgstr "неправильний маÑив JSON" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3353 +#: utils/adt/jsonfuncs.c:3647 #, c-format msgid "first argument of %s must be a row type" msgstr "першим аргументом %s повинен бути тип Ñ€Ñдка" #. translator: %s is a function name, eg json_to_record -#: utils/adt/jsonfuncs.c:3377 +#: utils/adt/jsonfuncs.c:3671 #, c-format msgid "could not determine row type for result of %s" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ тип Ñ€Ñдка Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñƒ %s" -#: utils/adt/jsonfuncs.c:3379 +#: utils/adt/jsonfuncs.c:3673 #, c-format msgid "Provide a non-null record argument, or call the function in the FROM clause using a column definition list." msgstr "Ðадайте аргумент ненульового запиÑу, або викличте функцію в реченні FROM, викориÑтовуючи ÑпиÑок Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñтовпців." -#: utils/adt/jsonfuncs.c:3741 utils/fmgr/funcapi.c:94 +#: utils/adt/jsonfuncs.c:4059 utils/fmgr/funcapi.c:94 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "необхідний режим матеріалізації (materialize mode), але він неприпуÑтимий у цьому контекÑті" -#: utils/adt/jsonfuncs.c:3869 utils/adt/jsonfuncs.c:3949 +#: utils/adt/jsonfuncs.c:4190 utils/adt/jsonfuncs.c:4274 #, c-format msgid "argument of %s must be an array of objects" msgstr "аргументом %s повинен бути маÑив об'єктів" -#: utils/adt/jsonfuncs.c:3902 +#: utils/adt/jsonfuncs.c:4223 #, c-format msgid "cannot call %s on an object" msgstr "викликати %s з об'єктом не можна" -#: utils/adt/jsonfuncs.c:4309 utils/adt/jsonfuncs.c:4368 -#: utils/adt/jsonfuncs.c:4448 +#: utils/adt/jsonfuncs.c:4656 utils/adt/jsonfuncs.c:4715 +#: utils/adt/jsonfuncs.c:4795 #, c-format msgid "cannot delete from scalar" msgstr "видалити зі ÑкалÑру не можна" -#: utils/adt/jsonfuncs.c:4453 +#: utils/adt/jsonfuncs.c:4800 #, c-format msgid "cannot delete from object using integer index" msgstr "видалити з об'єкту по чиÑловому індекÑу не можна" -#: utils/adt/jsonfuncs.c:4521 utils/adt/jsonfuncs.c:4682 +#: utils/adt/jsonfuncs.c:4868 utils/adt/jsonfuncs.c:5027 #, c-format msgid "cannot set path in scalar" msgstr "вÑтановити шлÑÑ… в ÑкалÑрі не можна" -#: utils/adt/jsonfuncs.c:4563 utils/adt/jsonfuncs.c:4605 +#: utils/adt/jsonfuncs.c:4909 utils/adt/jsonfuncs.c:4951 #, c-format msgid "null_value_treatment must be \"delete_key\", \"return_target\", \"use_json_null\", or \"raise_exception\"" msgstr "null_value_treatment має бути \"delete_key\", \"return_target\", \"use_json_null\", або \"raise_exception\"" -#: utils/adt/jsonfuncs.c:4576 +#: utils/adt/jsonfuncs.c:4922 #, c-format msgid "JSON value must not be null" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ JSON не повинне бути null" -#: utils/adt/jsonfuncs.c:4577 +#: utils/adt/jsonfuncs.c:4923 #, c-format msgid "Exception was raised because null_value_treatment is \"raise_exception\"." msgstr "ВинÑток було запущено через те, що null_value_treatment дорівнює \"raise_exception\"." -#: utils/adt/jsonfuncs.c:4578 +#: utils/adt/jsonfuncs.c:4924 #, c-format msgid "To avoid, either change the null_value_treatment argument or ensure that an SQL NULL is not passed." msgstr "Щоб уникнути, або змініть аргумент null_value_treatment або переконайтеÑÑŒ що SQL NULL не передано." -#: utils/adt/jsonfuncs.c:4633 +#: utils/adt/jsonfuncs.c:4979 #, c-format msgid "cannot delete path in scalar" msgstr "видалити шлÑÑ… в ÑкалÑрі не можна" -#: utils/adt/jsonfuncs.c:4849 +#: utils/adt/jsonfuncs.c:5193 #, c-format msgid "path element at position %d is null" msgstr "елемент шлÑху в позиції %d Ñ” null" -#: utils/adt/jsonfuncs.c:4868 utils/adt/jsonfuncs.c:4899 -#: utils/adt/jsonfuncs.c:4966 +#: utils/adt/jsonfuncs.c:5212 utils/adt/jsonfuncs.c:5243 +#: utils/adt/jsonfuncs.c:5316 #, c-format msgid "cannot replace existing key" msgstr "замініти Ñ–Ñнуючий ключ не можна" -#: utils/adt/jsonfuncs.c:4869 utils/adt/jsonfuncs.c:4900 +#: utils/adt/jsonfuncs.c:5213 utils/adt/jsonfuncs.c:5244 #, c-format msgid "The path assumes key is a composite object, but it is a scalar value." msgstr "ШлÑÑ… припуÑкає, що ключ Ñ” Ñкладеним об'єктом, але це ÑкалÑрне значеннÑ." -#: utils/adt/jsonfuncs.c:4967 +#: utils/adt/jsonfuncs.c:5317 #, c-format msgid "Try using the function jsonb_set to replace key value." msgstr "Спробуйте, викориÑтати функцію jsonb_set, щоб замінити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð°." -#: utils/adt/jsonfuncs.c:5071 +#: utils/adt/jsonfuncs.c:5421 #, c-format msgid "path element at position %d is not an integer: \"%s\"" msgstr "елмент шлÑху в позиції %d не Ñ” цілим чиÑлом: \"%s\"" -#: utils/adt/jsonfuncs.c:5088 +#: utils/adt/jsonfuncs.c:5438 #, c-format msgid "path element at position %d is out of range: %d" msgstr "елемент шлÑху в позиції %d поза діапазоном: %d" -#: utils/adt/jsonfuncs.c:5240 +#: utils/adt/jsonfuncs.c:5590 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "неправильний тип позначки, дозволені лише маÑиви Ñ– ÑкалÑри" -#: utils/adt/jsonfuncs.c:5247 +#: utils/adt/jsonfuncs.c:5597 #, c-format msgid "flag array element is not a string" msgstr "елемент маÑиву позначок не Ñ” Ñ€Ñдком" -#: utils/adt/jsonfuncs.c:5248 utils/adt/jsonfuncs.c:5270 +#: utils/adt/jsonfuncs.c:5598 utils/adt/jsonfuncs.c:5620 #, c-format msgid "Possible values are: \"string\", \"numeric\", \"boolean\", \"key\", and \"all\"." msgstr "Можливі значеннÑ: \"string\", \"numeric\", \"boolean\", \"key\", Ñ– \"all\"." -#: utils/adt/jsonfuncs.c:5268 +#: utils/adt/jsonfuncs.c:5618 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "неправильна позначка в маÑиві позначок: \"%s\"" -#: utils/adt/jsonpath.c:364 +#: utils/adt/jsonpath.c:389 #, c-format msgid "@ is not allowed in root expressions" msgstr "@ не дозволÑєтьÑÑ Ð² кореневих виразах" -#: utils/adt/jsonpath.c:370 +#: utils/adt/jsonpath.c:395 #, c-format msgid "LAST is allowed only in array subscripts" msgstr "LAST дозволÑєтьÑÑ Ð»Ð¸ÑˆÐµ в підрÑдкових Ñимволах маÑиву" -#: utils/adt/jsonpath_exec.c:434 +#: utils/adt/jsonpath_exec.c:491 #, c-format msgid "single boolean result is expected" msgstr "очікуєтьÑÑ Ð¾Ð´Ð¸Ð½ логічний результат" -#: utils/adt/jsonpath_exec.c:746 -#, c-format -msgid "JSON object does not contain key \"%s\"" -msgstr "Об'єкт JSON не міÑтить ключа \"%s\"" - -#: utils/adt/jsonpath_exec.c:758 -#, c-format -msgid "jsonpath member accessor can only be applied to an object" -msgstr "доÑтуп Ð´Ð»Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð° jsonpath може бути заÑтоÑований лише до об'єкта" - -#: utils/adt/jsonpath_exec.c:787 +#: utils/adt/jsonpath_exec.c:851 #, c-format msgid "jsonpath wildcard array accessor can only be applied to an array" msgstr "доÑтуп до підÑтановочного маÑиву jsonpath може бути заÑтоÑований лише до маÑиву" -#: utils/adt/jsonpath_exec.c:835 +#: utils/adt/jsonpath_exec.c:874 +#, c-format +msgid "jsonpath wildcard member accessor can only be applied to an object" +msgstr "доÑтуп до підÑтановочного елемента jsonpath може бути заÑтоÑований лише до об'єкта" + +#: utils/adt/jsonpath_exec.c:923 #, c-format msgid "jsonpath array subscript is out of bounds" msgstr "підрÑдковий Ñимвол маÑиву jsonpath поза межами" -#: utils/adt/jsonpath_exec.c:892 +#: utils/adt/jsonpath_exec.c:980 #, c-format msgid "jsonpath array accessor can only be applied to an array" msgstr "доÑтуп до маÑиву jsonpath може бути заÑтоÑований лише до маÑиву" -#: utils/adt/jsonpath_exec.c:944 +#: utils/adt/jsonpath_exec.c:1044 #, c-format -msgid "jsonpath wildcard member accessor can only be applied to an object" -msgstr "доÑтуп до підÑтановочного елемента jsonpath може бути заÑтоÑований лише до об'єкта" +msgid "JSON object does not contain key \"%s\"" +msgstr "Об'єкт JSON не міÑтить ключа \"%s\"" + +#: utils/adt/jsonpath_exec.c:1056 +#, c-format +msgid "jsonpath member accessor can only be applied to an object" +msgstr "доÑтуп Ð´Ð»Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ð° jsonpath може бути заÑтоÑований лише до об'єкта" -#: utils/adt/jsonpath_exec.c:1074 +#: utils/adt/jsonpath_exec.c:1114 #, c-format msgid "jsonpath item method .%s() can only be applied to an array" msgstr "метод елемента jsonpath .%s() може бути заÑтоÑований лише до маÑиву" -#: utils/adt/jsonpath_exec.c:1127 +#: utils/adt/jsonpath_exec.c:1167 utils/adt/jsonpath_exec.c:1193 #, c-format -msgid "numeric argument of jsonpath item method .%s() is out of range for type double precision" -msgstr "чиÑловий аргумент методу елемента jsonpath .%s() поза діапазоном Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ double precision" +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type double precision" +msgstr "аргумент \"%s\" методу елемента jsonpath .%s() поза діапазоном Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ double precision" -#: utils/adt/jsonpath_exec.c:1148 +#: utils/adt/jsonpath_exec.c:1172 utils/adt/jsonpath_exec.c:1198 +#: utils/adt/jsonpath_exec.c:1414 utils/adt/jsonpath_exec.c:1446 #, c-format -msgid "string argument of jsonpath item method .%s() is not a valid representation of a double precision number" -msgstr "Ñтроковий аргумент методу елемента jsonpath .%s() не Ñ” предÑтавленнÑм чиÑла double precision" +msgid "NaN or Infinity is not allowed for jsonpath item method .%s()" +msgstr "NaN та Infinity не дозволÑютьÑÑ Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñƒ елементу jsonpath .%s()" -#: utils/adt/jsonpath_exec.c:1161 +#: utils/adt/jsonpath_exec.c:1211 utils/adt/jsonpath_exec.c:1313 +#: utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1593 #, c-format msgid "jsonpath item method .%s() can only be applied to a string or numeric value" msgstr "метод елемента jsonpath .%s() може бути заÑтоÑований лише до Ñ€Ñдка або чиÑлового значеннÑ" -#: utils/adt/jsonpath_exec.c:1651 +#: utils/adt/jsonpath_exec.c:1281 utils/adt/jsonpath_exec.c:1305 +#, c-format +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type bigint" +msgstr "аргумент \"%s\" методу елемента jsonpath .%s() поза діапазоном Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ bigint" + +#: utils/adt/jsonpath_exec.c:1357 utils/adt/jsonpath_exec.c:1377 +#, c-format +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type boolean" +msgstr "аргумент \"%s\" методу елемента jsonpath .%s() поза діапазоном Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ boolean" + +#: utils/adt/jsonpath_exec.c:1386 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a boolean, string, or numeric value" +msgstr "Метод jsonpath елемента .%s() може бути заÑтоÑований лише до boolean, Ñ€Ñдка або чиÑлового значеннÑ" + +#: utils/adt/jsonpath_exec.c:1439 utils/adt/jsonpath_exec.c:1528 +#, c-format +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type numeric" +msgstr "аргумент \"%s\" методу елемента jsonpath .%s() поза діапазоном Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ numeric" + +#: utils/adt/jsonpath_exec.c:1487 +#, c-format +msgid "precision of jsonpath item method .%s() is out of range for type integer" +msgstr "точніÑть методу елементу jsonpath .%s() знаходитьÑÑ Ð·Ð° межами діапазону Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ integer" + +#: utils/adt/jsonpath_exec.c:1501 +#, c-format +msgid "scale of jsonpath item method .%s() is out of range for type integer" +msgstr "маÑштаб методу jsonpath елементу .%s() знаходитьÑÑ Ð·Ð° межами діапазону Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ integer" + +#: utils/adt/jsonpath_exec.c:1561 utils/adt/jsonpath_exec.c:1585 +#, c-format +msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type integer" +msgstr "аргумент \"%s\" методу елемента jsonpath .%s() поза діапазоном Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ integer" + +#: utils/adt/jsonpath_exec.c:1648 +#, c-format +msgid "jsonpath item method .%s() can only be applied to a boolean, string, numeric, or datetime value" +msgstr "Метод jsonpath елемента .%s() можна заÑтоÑувати лише до Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ boolean, Ñ€Ñдка, чиÑла або дати" + +#: utils/adt/jsonpath_exec.c:2137 #, c-format msgid "left operand of jsonpath operator %s is not a single numeric value" msgstr "лівий операнд оператора jsonpath %s не Ñ” єдиним чиÑловим значеннÑм" -#: utils/adt/jsonpath_exec.c:1658 +#: utils/adt/jsonpath_exec.c:2144 #, c-format msgid "right operand of jsonpath operator %s is not a single numeric value" msgstr "правий операнд оператора jsonpath %s не Ñ” єдиним чиÑловим значеннÑм" -#: utils/adt/jsonpath_exec.c:1726 +#: utils/adt/jsonpath_exec.c:2212 #, c-format msgid "operand of unary jsonpath operator %s is not a numeric value" msgstr "операнд унарного оператора jsonpath %s не Ñ” єдиним чиÑловим значеннÑм" -#: utils/adt/jsonpath_exec.c:1824 +#: utils/adt/jsonpath_exec.c:2311 #, c-format msgid "jsonpath item method .%s() can only be applied to a numeric value" msgstr "метод елемента jsonpath .%s() може бути заÑтоÑований лише до чиÑлового значеннÑ" -#: utils/adt/jsonpath_exec.c:1864 +#: utils/adt/jsonpath_exec.c:2357 #, c-format msgid "jsonpath item method .%s() can only be applied to a string" msgstr "метод елемента jsonpath .%s() може бути заÑтоÑований лише до Ñ€Ñдку" -#: utils/adt/jsonpath_exec.c:1958 +#: utils/adt/jsonpath_exec.c:2450 +#, c-format +msgid "time precision of jsonpath item method .%s() is out of range for type integer" +msgstr "точніÑть чаÑу методу елементу jsonpath .%s() знаходитьÑÑ Ð·Ð° межами діапазону Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ integer" + +#: utils/adt/jsonpath_exec.c:2484 utils/adt/jsonpath_exec.c:2490 +#: utils/adt/jsonpath_exec.c:2517 utils/adt/jsonpath_exec.c:2545 +#: utils/adt/jsonpath_exec.c:2598 utils/adt/jsonpath_exec.c:2649 +#: utils/adt/jsonpath_exec.c:2720 #, c-format -msgid "datetime format is not recognized: \"%s\"" -msgstr "формат дати й чаÑу не розпізнано: \"%s\"" +msgid "%s format is not recognized: \"%s\"" +msgstr "Формат %s не розпізнано: \"%s\"" -#: utils/adt/jsonpath_exec.c:1960 +#: utils/adt/jsonpath_exec.c:2486 #, c-format msgid "Use a datetime template argument to specify the input data format." msgstr "ВикориÑтайте аргумент шаблону дати й чаÑу щоб вказати формат вхідних даних." -#: utils/adt/jsonpath_exec.c:2028 +#: utils/adt/jsonpath_exec.c:2679 utils/adt/jsonpath_exec.c:2760 +#, c-format +msgid "time precision of jsonpath item method .%s() is invalid" +msgstr "чаÑова точніÑть методу елементу jsonpath .%s() Ñ” неприпуÑтимою" + +#: utils/adt/jsonpath_exec.c:2840 #, c-format msgid "jsonpath item method .%s() can only be applied to an object" msgstr "метод елемента jsonpath .%s() може бути заÑтоÑований лише до об'єкта" -#: utils/adt/jsonpath_exec.c:2195 +#: utils/adt/jsonpath_exec.c:3124 +#, c-format +msgid "could not convert value of type %s to jsonpath" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s в jsonpath" + +#: utils/adt/jsonpath_exec.c:3158 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ змінну jsonpath \"%s\"" -#: utils/adt/jsonpath_exec.c:2216 +#: utils/adt/jsonpath_exec.c:3211 #, c-format msgid "\"vars\" argument is not an object" msgstr "аргумент \"vars\" не Ñ” об'єктом" -#: utils/adt/jsonpath_exec.c:2217 +#: utils/adt/jsonpath_exec.c:3212 #, c-format msgid "Jsonpath parameters should be encoded as key-value pairs of \"vars\" object." msgstr "Параметри Jsonpath повинні бути закодовані в ÑкоÑті пар \"ключ-значеннÑ\" об'єкту \"vars\"." -#: utils/adt/jsonpath_exec.c:2495 +#: utils/adt/jsonpath_exec.c:3475 #, c-format msgid "jsonpath array subscript is not a single numeric value" msgstr "підрÑдковий Ñимвол маÑиву jsonpath не Ñ” єдиним чиÑловим значеннÑм" -#: utils/adt/jsonpath_exec.c:2507 +#: utils/adt/jsonpath_exec.c:3487 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "підрÑдковий Ñимвол маÑиву jsonpath поза цілим діапазоном" -#: utils/adt/jsonpath_exec.c:2691 +#: utils/adt/jsonpath_exec.c:3671 #, c-format msgid "cannot convert value from %s to %s without time zone usage" msgstr "не можна перетворити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð· %s в %s без викориÑÑ‚Ð°Ð½Ð½Ñ Ñ‡Ð°Ñового поÑÑу" -#: utils/adt/jsonpath_exec.c:2693 +#: utils/adt/jsonpath_exec.c:3673 #, c-format msgid "Use *_tz() function for time zone support." msgstr "ВикориÑтовуйте функцію *_tz() Ð´Ð»Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÐºÐ¸ чаÑового поÑÑу." -#: utils/adt/jsonpath_exec.c:2974 +#: utils/adt/jsonpath_exec.c:3981 +#, c-format +msgid "JSON path expression for column \"%s\" must return single item when no wrapper is requested" +msgstr "Вираз шлÑху в JSON Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" повинен повернути єдиний елемент, Ñкщо не вказано жодної обгортки" + +#: utils/adt/jsonpath_exec.c:3983 utils/adt/jsonpath_exec.c:3988 #, c-format -msgid "JSON path expression in JSON_QUERY should return singleton item without wrapper" -msgstr "Вираз шлÑху JSON в JSON_QUERY повинен повертати одиночний ÑкалÑрний елемент без обгортки" +msgid "Use the WITH WRAPPER clause to wrap SQL/JSON items into an array." +msgstr "ВикориÑтайте вираз WITH WRAPPER, щоб обернути елементи SQL/JSON в маÑив." -#: utils/adt/jsonpath_exec.c:2976 +#: utils/adt/jsonpath_exec.c:3987 #, c-format -msgid "Use WITH WRAPPER clause to wrap SQL/JSON item sequence into array." -msgstr "ВикориÑтайте вираз WITH WRAPPER, щоб обернути поÑлідовніÑть елементів SQL/JSON в маÑив." +msgid "JSON path expression in JSON_QUERY must return single item when no wrapper is requested" +msgstr "Вираз шлÑху JSON в JSON_QUERY повинен повернути єдиний елемент, Ñкщо не вказано жодної обгортки" -#: utils/adt/jsonpath_exec.c:3024 utils/adt/jsonpath_exec.c:3044 +#: utils/adt/jsonpath_exec.c:4045 utils/adt/jsonpath_exec.c:4069 #, c-format -msgid "JSON path expression in JSON_VALUE should return singleton scalar item" -msgstr "Вираз шлÑху JSON в JSON_VALUE повинен повертати одиночний ÑкалÑрний елемент" +msgid "JSON path expression for column \"%s\" must return single scalar item" +msgstr "Вираз шлÑху JSON Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\" повинен повертати одинарний ÑкалÑÑ€" -#: utils/adt/jsonpath_exec.c:3137 +#: utils/adt/jsonpath_exec.c:4050 utils/adt/jsonpath_exec.c:4074 #, c-format -msgid "only bool, numeric, and text types could be casted to supported jsonpath types." -msgstr "лише логічні, чиÑлові, та текÑтові типи можуть бути приведені до підтримуваних типів jsonpath." +msgid "JSON path expression in JSON_VALUE must return single scalar item" +msgstr "Вираз шлÑху JSON в JSON_VALUE повинен повертати одиничний ÑкалÑрний елемент" -#: utils/adt/levenshtein.c:133 +#: utils/adt/levenshtein.c:132 #, c-format msgid "levenshtein argument exceeds maximum length of %d characters" msgstr "довжина аргументу levenshtein перевищує макÑимальну довжину, %d Ñимволів" -#: utils/adt/like.c:160 +#: utils/adt/like.c:159 #, c-format msgid "nondeterministic collations are not supported for LIKE" msgstr "недетерміновані параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ Ð´Ð»Ñ LIKE" -#: utils/adt/like.c:189 utils/adt/like_support.c:1023 +#: utils/adt/like.c:188 utils/adt/like_support.c:1023 #, c-format msgid "could not determine which collation to use for ILIKE" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ Ñкий параметр ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтати Ð´Ð»Ñ ILIKE" -#: utils/adt/like.c:201 +#: utils/adt/like.c:200 #, c-format msgid "nondeterministic collations are not supported for ILIKE" msgstr "недетерміновані параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ Ð´Ð»Ñ ILIKE" @@ -24293,12 +25612,12 @@ msgstr "недетерміновані параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ msgid "LIKE pattern must not end with escape character" msgstr "Шаблон LIKE не повинен закінчуватиÑÑŒ Ñимволом виходу" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:786 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:800 #, c-format msgid "invalid escape string" msgstr "неприпуÑтимий Ñ€Ñдок виходу" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:787 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:801 #, c-format msgid "Escape string must be empty or one character." msgstr "РÑдок виходу повинен бути пуÑтим або ÑкладатиÑÑ Ð· одного Ñимволу." @@ -24313,124 +25632,124 @@ msgstr "порівнÑÐ½Ð½Ñ Ð±ÐµÐ· ÑƒÑ€Ð°Ñ…ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ³Ñ–Ñтру не msgid "regular-expression matching not supported on type bytea" msgstr "порівнÑÐ½Ð½Ñ Ð· регулÑрними виразами не підтримуєтьÑÑ Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ bytea" -#: utils/adt/mac.c:101 +#: utils/adt/mac.c:102 #, c-format msgid "invalid octet value in \"macaddr\" value: \"%s\"" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾ÐºÑ‚ÐµÑ‚Ñƒ в значенні типу \"macaddr\": \"%s\"" -#: utils/adt/mac8.c:563 +#: utils/adt/mac8.c:555 #, c-format msgid "macaddr8 data out of range to convert to macaddr" msgstr "дані macaddr8 поза діапазоном, Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð² macaddr" -#: utils/adt/mac8.c:564 +#: utils/adt/mac8.c:556 #, c-format msgid "Only addresses that have FF and FE as values in the 4th and 5th bytes from the left, for example xx:xx:xx:ff:fe:xx:xx:xx, are eligible to be converted from macaddr8 to macaddr." msgstr "Лише адреÑи, Ñкі мають FF Ñ– FE в ÑкоÑті значень в четвертому Ñ– п'Ñтому байті зліва, наприклад xx:xx:xx:ff:fe:xx:xx:xx можуть бути перетворені з macaddr8 в macaddr." -#: utils/adt/mcxtfuncs.c:182 +#: utils/adt/mcxtfuncs.c:173 #, c-format msgid "PID %d is not a PostgreSQL server process" msgstr "PID %d не Ñ” Ñерверним процеÑом PostgreSQL" -#: utils/adt/misc.c:216 +#: utils/adt/misc.c:237 #, c-format msgid "global tablespace never has databases" msgstr "в табличному проÑторі global николи не було баз даних" -#: utils/adt/misc.c:238 +#: utils/adt/misc.c:259 #, c-format msgid "%u is not a tablespace OID" msgstr "%u не Ñ” OID табличного проÑтору" -#: utils/adt/misc.c:457 +#: utils/adt/misc.c:454 msgid "unreserved" msgstr "не зарезервовано" -#: utils/adt/misc.c:461 +#: utils/adt/misc.c:458 msgid "unreserved (cannot be function or type name)" msgstr "не зарезервовано (не може бути іменем типу або функції)" -#: utils/adt/misc.c:465 +#: utils/adt/misc.c:462 msgid "reserved (can be function or type name)" msgstr "зарезервовано (може бути іменем типу або функції)" -#: utils/adt/misc.c:469 +#: utils/adt/misc.c:466 msgid "reserved" msgstr "зарезервовано" -#: utils/adt/misc.c:480 +#: utils/adt/misc.c:477 msgid "can be bare label" msgstr "може бути пуÑтою міткою" -#: utils/adt/misc.c:485 +#: utils/adt/misc.c:482 msgid "requires AS" msgstr "потребує AS" -#: utils/adt/misc.c:732 utils/adt/misc.c:746 utils/adt/misc.c:785 -#: utils/adt/misc.c:791 utils/adt/misc.c:797 utils/adt/misc.c:820 +#: utils/adt/misc.c:897 utils/adt/misc.c:911 utils/adt/misc.c:950 +#: utils/adt/misc.c:956 utils/adt/misc.c:962 utils/adt/misc.c:985 #, c-format msgid "string is not a valid identifier: \"%s\"" msgstr "Ñ€Ñдок не Ñ” припуÑтимим ідентифікатором: \"%s\"" -#: utils/adt/misc.c:734 +#: utils/adt/misc.c:899 #, c-format msgid "String has unclosed double quotes." msgstr "РÑдок має не закриті лапки." -#: utils/adt/misc.c:748 +#: utils/adt/misc.c:913 #, c-format msgid "Quoted identifier must not be empty." msgstr "Ідентифікатор в лапках не повинен бути пуÑтим." -#: utils/adt/misc.c:787 +#: utils/adt/misc.c:952 #, c-format msgid "No valid identifier before \".\"." msgstr "Перед \".\" немає припуÑтимого ідентифікатору." -#: utils/adt/misc.c:793 +#: utils/adt/misc.c:958 #, c-format msgid "No valid identifier after \".\"." msgstr "ПіÑÐ»Ñ \".\" немає припуÑтимого ідентифікатора." -#: utils/adt/misc.c:853 +#: utils/adt/misc.c:1018 #, c-format msgid "log format \"%s\" is not supported" msgstr "формат журналу \"%s\" не підтримуєтьÑÑ" -#: utils/adt/misc.c:854 +#: utils/adt/misc.c:1019 #, c-format msgid "The supported log formats are \"stderr\", \"csvlog\", and \"jsonlog\"." msgstr "Підтримуванні формати журналів: \"stderr\", \"csvlog\", Ñ– \"jsonlog\"." -#: utils/adt/multirangetypes.c:149 utils/adt/multirangetypes.c:162 -#: utils/adt/multirangetypes.c:191 utils/adt/multirangetypes.c:261 -#: utils/adt/multirangetypes.c:285 +#: utils/adt/multirangetypes.c:150 utils/adt/multirangetypes.c:163 +#: utils/adt/multirangetypes.c:192 utils/adt/multirangetypes.c:266 +#: utils/adt/multirangetypes.c:290 #, c-format msgid "malformed multirange literal: \"%s\"" msgstr "неправильний багатодіапазонний літерал: \"%s\"" -#: utils/adt/multirangetypes.c:151 +#: utils/adt/multirangetypes.c:152 #, c-format msgid "Missing left brace." msgstr "Пропущено ліву дужку." -#: utils/adt/multirangetypes.c:193 +#: utils/adt/multirangetypes.c:194 #, c-format msgid "Expected range start." msgstr "Очікуваний початок діапазону." -#: utils/adt/multirangetypes.c:263 +#: utils/adt/multirangetypes.c:268 #, c-format msgid "Expected comma or end of multirange." msgstr "ОчікувалаÑÑŒ кома або Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ñƒ." -#: utils/adt/multirangetypes.c:976 +#: utils/adt/multirangetypes.c:981 #, c-format msgid "multiranges cannot be constructed from multidimensional arrays" msgstr "мультидіапазони не можуть бути побудовані з багатовимірних маÑивів" -#: utils/adt/multirangetypes.c:1002 +#: utils/adt/multirangetypes.c:1007 #, c-format msgid "multirange values cannot contain null members" msgstr "мультидіапазонні Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ можуть міÑтити членів null" @@ -24489,794 +25808,891 @@ msgstr "не вдалоÑÑ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ cidr: %m" msgid "cannot merge addresses from different families" msgstr "об'єднати адреÑи з різних ÑімейÑтв не можна" -#: utils/adt/network.c:1901 +#: utils/adt/network.c:1893 #, c-format msgid "cannot AND inet values of different sizes" msgstr "не можна викориÑтовувати \"І\" (AND) Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ inet різного розміру" -#: utils/adt/network.c:1933 +#: utils/adt/network.c:1925 #, c-format msgid "cannot OR inet values of different sizes" msgstr "не можна викориÑтовувати \"ÐБО\" (OR) Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ inet різного розміру" -#: utils/adt/network.c:1994 utils/adt/network.c:2070 +#: utils/adt/network.c:1986 utils/adt/network.c:2062 #, c-format msgid "result is out of range" msgstr "результат поза діапазоном" -#: utils/adt/network.c:2035 +#: utils/adt/network.c:2027 #, c-format msgid "cannot subtract inet values of different sizes" msgstr "не можна віднімати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ inet різного розміру" -#: utils/adt/numeric.c:1027 +#: utils/adt/numeric.c:793 utils/adt/numeric.c:3659 utils/adt/numeric.c:7216 +#: utils/adt/numeric.c:7419 utils/adt/numeric.c:7891 utils/adt/numeric.c:10586 +#: utils/adt/numeric.c:11061 utils/adt/numeric.c:11155 +#: utils/adt/numeric.c:11290 +#, c-format +msgid "value overflows numeric format" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð²Ð½ÑŽÑŽÑ‚ÑŒ формат numeric" + +#: utils/adt/numeric.c:1106 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "неприпуÑтимий знак у зовнішньому значенні \"numeric\"" -#: utils/adt/numeric.c:1033 +#: utils/adt/numeric.c:1112 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "неприпуÑтимий маÑштаб у зовнішньому значенні \"numeric\"" -#: utils/adt/numeric.c:1042 +#: utils/adt/numeric.c:1121 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "неприпуÑтиме чиÑло у зовнішньому значенні \"numeric\"" -#: utils/adt/numeric.c:1257 utils/adt/numeric.c:1271 +#: utils/adt/numeric.c:1336 utils/adt/numeric.c:1350 #, c-format msgid "NUMERIC precision %d must be between 1 and %d" msgstr "ТочніÑть NUMERIC %d повинна бути між 1 Ñ– %d" -#: utils/adt/numeric.c:1262 +#: utils/adt/numeric.c:1341 #, c-format msgid "NUMERIC scale %d must be between %d and %d" msgstr "МаÑштаб NUMERIC %d повинен бути між %d Ñ– %d" -#: utils/adt/numeric.c:1280 +#: utils/adt/numeric.c:1359 #, c-format msgid "invalid NUMERIC type modifier" msgstr "неприпуÑтимий модифікатор типу NUMERIC" -#: utils/adt/numeric.c:1638 +#: utils/adt/numeric.c:1725 #, c-format msgid "start value cannot be NaN" msgstr "початкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ може бути NaN" -#: utils/adt/numeric.c:1642 +#: utils/adt/numeric.c:1729 #, c-format msgid "start value cannot be infinity" msgstr "початкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ може бути неÑкінченніÑтю" -#: utils/adt/numeric.c:1649 +#: utils/adt/numeric.c:1736 #, c-format msgid "stop value cannot be NaN" msgstr "кінцеве Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ може бути NaN" -#: utils/adt/numeric.c:1653 +#: utils/adt/numeric.c:1740 #, c-format msgid "stop value cannot be infinity" msgstr "кінцеве Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ може бути неÑкінченніÑтю" -#: utils/adt/numeric.c:1666 +#: utils/adt/numeric.c:1753 #, c-format msgid "step size cannot be NaN" msgstr "розмір кроку не може бути NaN" -#: utils/adt/numeric.c:1670 +#: utils/adt/numeric.c:1757 #, c-format msgid "step size cannot be infinity" msgstr "розмір кроку не може бути неÑкінченніÑтю" -#: utils/adt/numeric.c:3551 +#: utils/adt/numeric.c:3649 #, c-format msgid "factorial of a negative number is undefined" msgstr "факторіал від'ємного чиÑла не визначено" -#: utils/adt/numeric.c:3561 utils/adt/numeric.c:6917 utils/adt/numeric.c:7432 -#: utils/adt/numeric.c:9956 utils/adt/numeric.c:10435 utils/adt/numeric.c:10561 -#: utils/adt/numeric.c:10634 +#: utils/adt/numeric.c:4256 #, c-format -msgid "value overflows numeric format" -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð²Ð½ÑŽÑŽÑ‚ÑŒ формат numeric" +msgid "lower bound cannot be NaN" +msgstr "Ð½Ð¸Ð¶Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ð½Ðµ може бути NaN" -#: utils/adt/numeric.c:4243 utils/adt/numeric.c:4323 utils/adt/numeric.c:4364 -#: utils/adt/numeric.c:4558 +#: utils/adt/numeric.c:4260 +#, c-format +msgid "lower bound cannot be infinity" +msgstr "Ð½Ð¸Ð¶Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ð½Ðµ може бути неÑкінченніÑтю" + +#: utils/adt/numeric.c:4267 +#, c-format +msgid "upper bound cannot be NaN" +msgstr "Ð²ÐµÑ€Ñ…Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ð½Ðµ може бути NaN" + +#: utils/adt/numeric.c:4271 +#, c-format +msgid "upper bound cannot be infinity" +msgstr "Ð²ÐµÑ€Ñ…Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ð½Ðµ може бути неÑкінченніÑтю" + +#: utils/adt/numeric.c:4432 utils/adt/numeric.c:4520 utils/adt/numeric.c:4580 +#: utils/adt/numeric.c:4776 #, c-format msgid "cannot convert NaN to %s" msgstr "неможливо перетворити NaN на %s" -#: utils/adt/numeric.c:4247 utils/adt/numeric.c:4327 utils/adt/numeric.c:4368 -#: utils/adt/numeric.c:4562 +#: utils/adt/numeric.c:4436 utils/adt/numeric.c:4524 utils/adt/numeric.c:4584 +#: utils/adt/numeric.c:4780 #, c-format msgid "cannot convert infinity to %s" msgstr "неможливо перетворити неÑкінченніÑть на %s" -#: utils/adt/numeric.c:4571 +#: utils/adt/numeric.c:4789 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn поза діапазоном" -#: utils/adt/numeric.c:7519 utils/adt/numeric.c:7565 +#: utils/adt/numeric.c:7981 utils/adt/numeric.c:8032 #, c-format msgid "numeric field overflow" msgstr "надлишок Ð¿Ð¾Ð»Ñ numeric" -#: utils/adt/numeric.c:7520 +#: utils/adt/numeric.c:7982 #, c-format msgid "A field with precision %d, scale %d must round to an absolute value less than %s%d." msgstr "Поле з точніÑтю %d, маÑштабом %d повинне округлÑтиÑÑŒ до абÑолютного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼ÐµÐ½ÑŒÑˆÐµ, ніж %s%d." -#: utils/adt/numeric.c:7566 +#: utils/adt/numeric.c:8033 #, c-format msgid "A field with precision %d, scale %d cannot hold an infinite value." msgstr "Поле з точніÑтю %d, маÑштабом %d не може міÑтити неÑкінченне значеннÑ." -#: utils/adt/oid.c:290 +#: utils/adt/numeric.c:11359 utils/adt/pseudorandomfuncs.c:135 +#: utils/adt/pseudorandomfuncs.c:159 +#, c-format +msgid "lower bound must be less than or equal to upper bound" +msgstr "Ð½Ð¸Ð¶Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ð° бути менше або дорівнювати верхній границі" + +#: utils/adt/oid.c:217 #, c-format msgid "invalid oidvector data" msgstr "неприпуÑтимі дані oidvector" -#: utils/adt/oracle_compat.c:973 +#: utils/adt/oracle_compat.c:976 #, c-format msgid "requested character too large" msgstr "запитаний Ñимвол занадто великий" -#: utils/adt/oracle_compat.c:1017 +#: utils/adt/oracle_compat.c:1020 #, c-format msgid "character number must be positive" msgstr "номер Ñимволу має бути додатнім" -#: utils/adt/oracle_compat.c:1021 +#: utils/adt/oracle_compat.c:1024 #, c-format msgid "null character not permitted" msgstr "Ñимвол не може бути null" -#: utils/adt/oracle_compat.c:1039 utils/adt/oracle_compat.c:1092 +#: utils/adt/oracle_compat.c:1042 utils/adt/oracle_compat.c:1095 #, c-format msgid "requested character too large for encoding: %u" msgstr "запитаний Ñимвол занадто великий Ð´Ð»Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ: %u" -#: utils/adt/oracle_compat.c:1080 +#: utils/adt/oracle_compat.c:1083 #, c-format msgid "requested character not valid for encoding: %u" msgstr "запитаний Ñимвол не припуÑтимий Ð´Ð»Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ: %u" -#: utils/adt/orderedsetaggs.c:448 utils/adt/orderedsetaggs.c:552 -#: utils/adt/orderedsetaggs.c:690 +#: utils/adt/orderedsetaggs.c:446 utils/adt/orderedsetaggs.c:551 +#: utils/adt/orderedsetaggs.c:691 #, c-format msgid "percentile value %g is not between 0 and 1" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ½Ñ‚Ð¸Ð»Ñ %g не Ñ” між 0 Ñ– 1" -#: utils/adt/pg_locale.c:1228 +#: utils/adt/pg_locale.c:326 utils/adt/pg_locale.c:358 #, c-format -msgid "Apply system library package updates." -msgstr "ЗаÑтоÑуйте Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð°ÐºÐµÑ‚Ñƒ з ÑиÑтемною бібліотекою." +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "назва локалі \"%s\" міÑтить не-ASCII Ñимволи" -#: utils/adt/pg_locale.c:1452 utils/adt/pg_locale.c:1700 -#: utils/adt/pg_locale.c:1979 utils/adt/pg_locale.c:2001 +#: utils/adt/pg_locale.c:1507 #, c-format -msgid "could not open collator for locale \"%s\": %s" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ Ñортувальник Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— \"%s\": %s" +msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ Ñортувальник Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ—\"%s\" з правилами \"%s\": %s" -#: utils/adt/pg_locale.c:1465 utils/adt/pg_locale.c:2010 +#: utils/adt/pg_locale.c:1518 utils/adt/pg_locale.c:2992 +#: utils/adt/pg_locale.c:3065 #, c-format msgid "ICU is not supported in this build" msgstr "ICU не підтримуєтьÑÑ Ð² цій збірці" -#: utils/adt/pg_locale.c:1494 +#: utils/adt/pg_locale.c:1546 #, c-format msgid "could not create locale \"%s\": %m" msgstr "не вдалоÑÑ Ñтворити локалізацію \"%s\": %m" -#: utils/adt/pg_locale.c:1497 +#: utils/adt/pg_locale.c:1549 #, c-format msgid "The operating system could not find any locale data for the locale name \"%s\"." msgstr "Операційній ÑиÑтемі не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ дані локалізації з іменем \"%s\"." -#: utils/adt/pg_locale.c:1605 +#: utils/adt/pg_locale.c:1670 #, c-format msgid "collations with different collate and ctype values are not supported on this platform" msgstr "параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð· різними значеннÑми collate Ñ– ctype не підтримуютьÑÑ Ð½Ð° цій платформі" -#: utils/adt/pg_locale.c:1614 -#, c-format -msgid "collation provider LIBC is not supported on this platform" -msgstr "провайдер параметрів ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ LIBC не підтримуєтьÑÑ Ð½Ð° цій платформі" - -#: utils/adt/pg_locale.c:1649 +#: utils/adt/pg_locale.c:1717 #, c-format msgid "collation \"%s\" has no actual version, but a version was recorded" msgstr "Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" Ñкий не має фактичної верÑÑ–Ñ—, була вказана верÑÑ–Ñ" -#: utils/adt/pg_locale.c:1655 +#: utils/adt/pg_locale.c:1723 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "невідповідніÑть верÑій Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"" -#: utils/adt/pg_locale.c:1657 +#: utils/adt/pg_locale.c:1725 #, c-format msgid "The collation in the database was created using version %s, but the operating system provides version %s." msgstr "Параметр ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² базі даних був Ñтворений з верÑією %s, але операційна ÑиÑтема надає верÑÑ–ÑŽ %s." -#: utils/adt/pg_locale.c:1660 +#: utils/adt/pg_locale.c:1728 #, c-format msgid "Rebuild all objects affected by this collation and run ALTER COLLATION %s REFRESH VERSION, or build PostgreSQL with the right library version." msgstr "Перебудуйте вÑÑ– об'єкти, Ñкі ÑтоÑуютьÑÑ Ñ†ÑŒÐ¾Ð³Ð¾ параметру ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– виконайте ALTER COLLATION %s REFRESH VERSION, або побудуйте PostgreSQL з правильною верÑією бібліотеки." -#: utils/adt/pg_locale.c:1731 +#: utils/adt/pg_locale.c:1772 utils/adt/pg_locale.c:2556 +#: utils/adt/pg_locale.c:2581 +#, c-format +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "неприпуÑтиме ім'Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– \"%s\" Ð´Ð»Ñ Ð²Ð±ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ провайдера" + +#: utils/adt/pg_locale.c:1814 #, c-format msgid "could not load locale \"%s\"" msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ локаль \"%s\"" -#: utils/adt/pg_locale.c:1756 +#: utils/adt/pg_locale.c:1839 #, c-format msgid "could not get collation version for locale \"%s\": error code %lu" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ верÑÑ–ÑŽ параметрів ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— \"%s\": код помилки %lu" -#: utils/adt/pg_locale.c:1794 +#: utils/adt/pg_locale.c:1895 utils/adt/pg_locale.c:1908 +#, c-format +msgid "could not convert string to UTF-16: error code %lu" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ Ñ€Ñдок в UTF-16: код помилки %lu" + +#: utils/adt/pg_locale.c:1920 +#, c-format +msgid "could not compare Unicode strings: %m" +msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ñ–Ð²Ð½Ñти Ñ€Ñдки в Unicode: %m" + +#: utils/adt/pg_locale.c:2094 +#, c-format +msgid "collation failed: %s" +msgstr "помилка в бібліотеці ÑортуваннÑ: %s" + +#: utils/adt/pg_locale.c:2313 utils/adt/pg_locale.c:2345 +#, c-format +msgid "sort key generation failed: %s" +msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ ключ ÑортуваннÑ: %s" + +#: utils/adt/pg_locale.c:2635 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ мову з локалі \"%s\": %s" + +#: utils/adt/pg_locale.c:2656 utils/adt/pg_locale.c:2672 +#, c-format +msgid "could not open collator for locale \"%s\": %s" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ Ñортувальник Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— \"%s\": %s" + +#: utils/adt/pg_locale.c:2697 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "ICU не підтримує ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"" -#: utils/adt/pg_locale.c:1801 +#: utils/adt/pg_locale.c:2704 #, c-format msgid "could not open ICU converter for encoding \"%s\": %s" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ перетворювач ICU Ð´Ð»Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\": %s" -#: utils/adt/pg_locale.c:1832 utils/adt/pg_locale.c:1841 -#: utils/adt/pg_locale.c:1870 utils/adt/pg_locale.c:1880 +#: utils/adt/pg_locale.c:2722 utils/adt/pg_locale.c:2741 +#: utils/adt/pg_locale.c:2797 utils/adt/pg_locale.c:2808 #, c-format msgid "%s failed: %s" msgstr "%s помилка: %s" -#: utils/adt/pg_locale.c:2179 +#: utils/adt/pg_locale.c:2983 +#, c-format +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ локальну назву \"%s\" на мітку мови: %s" + +#: utils/adt/pg_locale.c:3024 +#, c-format +msgid "could not get language from ICU locale \"%s\": %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ мову з локалі ICU \"%s\": %s" + +#: utils/adt/pg_locale.c:3026 utils/adt/pg_locale.c:3055 +#, c-format +msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." +msgstr "Щоб вимкнути перевірку мови ICU, вÑтановіть параметр \"%s\" на \"%s\"." + +#: utils/adt/pg_locale.c:3053 +#, c-format +msgid "ICU locale \"%s\" has unknown language \"%s\"" +msgstr "locale ICU \"%s\" має невідому мову \"%s\"" + +#: utils/adt/pg_locale.c:3204 #, c-format msgid "invalid multibyte character for locale" msgstr "неприпуÑтимий мультибайтний Ñимвол Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ—" -#: utils/adt/pg_locale.c:2180 +#: utils/adt/pg_locale.c:3205 #, c-format msgid "The server's LC_CTYPE locale is probably incompatible with the database encoding." msgstr "Параметр локалізації Ñерверу LC_CTYPE, можливо, неÑуміÑний з кодуваннÑм бази даних." -#: utils/adt/pg_lsn.c:263 +#: utils/adt/pg_lsn.c:262 #, c-format msgid "cannot add NaN to pg_lsn" msgstr "не можна додати NaN в pg_lsn" -#: utils/adt/pg_lsn.c:297 +#: utils/adt/pg_lsn.c:296 #, c-format msgid "cannot subtract NaN from pg_lsn" msgstr "віднімати NaN з pg_lsn не можна" -#: utils/adt/pg_upgrade_support.c:29 +#: utils/adt/pg_upgrade_support.c:39 #, c-format msgid "function can only be called when server is in binary upgrade mode" msgstr "функцію можна викликати тільки коли Ñервер знаходитьÑÑ Ð² режимі двійкового оновленнÑ" -#: utils/adt/pgstatfuncs.c:482 +#: utils/adt/pgstatfuncs.c:252 #, c-format msgid "invalid command name: \"%s\"" msgstr "неприпуÑтиме Ñ–Ð¼â€™Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸: \"%s\"" -#: utils/adt/pgstatfuncs.c:2114 +#: utils/adt/pgstatfuncs.c:1739 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "нерозпізнане Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¼ÐµÑ‚Ð¸: \"%s\"" -#: utils/adt/pgstatfuncs.c:2115 +#: utils/adt/pgstatfuncs.c:1740 #, c-format -msgid "Target must be \"archiver\", \"bgwriter\", \"recovery_prefetch\", or \"wal\"." -msgstr "Ціль має бути \"archiver\", \"bgwriter\", \"recovery_prefetch\", або \"wal\"." +msgid "Target must be \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"recovery_prefetch\", \"slru\", or \"wal\"." +msgstr "Ціллю має бути \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"recovery_prefetch\", \"slru\" або \"wal\"." -#: utils/adt/pgstatfuncs.c:2193 +#: utils/adt/pgstatfuncs.c:1822 #, c-format msgid "invalid subscription OID %u" msgstr "некоректний OID підпиÑки %u" -#: utils/adt/pseudotypes.c:58 utils/adt/pseudotypes.c:92 +#: utils/adt/pseudorandomfuncs.c:69 +#, c-format +msgid "setseed parameter %g is out of allowed range [-1,1]" +msgstr "параметр setseed %g поза допуÑтимим діапазоном [-1,1]" + +#: utils/adt/pseudotypes.c:55 utils/adt/pseudotypes.c:89 #, c-format msgid "cannot display a value of type %s" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ %s не можна відобразити" -#: utils/adt/pseudotypes.c:321 +#: utils/adt/pseudotypes.c:307 #, c-format msgid "cannot accept a value of a shell type" msgstr "не можна прийнÑти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ shell" -#: utils/adt/pseudotypes.c:331 +#: utils/adt/pseudotypes.c:317 #, c-format msgid "cannot display a value of a shell type" msgstr "не можна відобразити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ shell" -#: utils/adt/rangetypes.c:404 +#: utils/adt/rangetypes.c:422 #, c-format msgid "range constructor flags argument must not be null" msgstr "аргумент позначок конÑтруктору діапазону не може бути null" -#: utils/adt/rangetypes.c:1003 +#: utils/adt/rangetypes.c:1021 #, c-format msgid "result of range difference would not be contiguous" msgstr "результат різниці діапазонів не буде безперервним" -#: utils/adt/rangetypes.c:1064 +#: utils/adt/rangetypes.c:1082 #, c-format msgid "result of range union would not be contiguous" msgstr "результат об'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ñ–Ð² не буде безперервним" -#: utils/adt/rangetypes.c:1689 +#: utils/adt/rangetypes.c:1757 #, c-format msgid "range lower bound must be less than or equal to range upper bound" msgstr "Ð½Ð¸Ð¶Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ð´Ñ–Ð°Ð¿Ð°Ð·Ð¾Ð½Ñƒ повинна бути менше або дорівнювати верхній границі діапазону" -#: utils/adt/rangetypes.c:2112 utils/adt/rangetypes.c:2125 -#: utils/adt/rangetypes.c:2139 +#: utils/adt/rangetypes.c:2256 utils/adt/rangetypes.c:2269 +#: utils/adt/rangetypes.c:2283 #, c-format msgid "invalid range bound flags" msgstr "неприпуÑтимі позначки границь діапазону" -#: utils/adt/rangetypes.c:2113 utils/adt/rangetypes.c:2126 -#: utils/adt/rangetypes.c:2140 +#: utils/adt/rangetypes.c:2257 utils/adt/rangetypes.c:2270 +#: utils/adt/rangetypes.c:2284 #, c-format msgid "Valid values are \"[]\", \"[)\", \"(]\", and \"()\"." msgstr "ПрипуÑтимі Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"[]\", \"[)\", \"(]\", Ñ– \"()\"." -#: utils/adt/rangetypes.c:2205 utils/adt/rangetypes.c:2222 -#: utils/adt/rangetypes.c:2235 utils/adt/rangetypes.c:2253 -#: utils/adt/rangetypes.c:2264 utils/adt/rangetypes.c:2308 -#: utils/adt/rangetypes.c:2316 +#: utils/adt/rangetypes.c:2352 utils/adt/rangetypes.c:2369 +#: utils/adt/rangetypes.c:2384 utils/adt/rangetypes.c:2404 +#: utils/adt/rangetypes.c:2415 utils/adt/rangetypes.c:2462 +#: utils/adt/rangetypes.c:2470 #, c-format msgid "malformed range literal: \"%s\"" msgstr "неправильний літерал діапазону: \"%s\"" -#: utils/adt/rangetypes.c:2207 +#: utils/adt/rangetypes.c:2354 #, c-format msgid "Junk after \"empty\" key word." msgstr "Ð¡Ð¼Ñ–Ñ‚Ñ‚Ñ Ð¿Ñ–ÑÐ»Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¾Ð³Ð¾ Ñлова \"empty\"." -#: utils/adt/rangetypes.c:2224 +#: utils/adt/rangetypes.c:2371 #, c-format msgid "Missing left parenthesis or bracket." msgstr "Пропущено ліву дужку (круглу або квадратну)." -#: utils/adt/rangetypes.c:2237 +#: utils/adt/rangetypes.c:2386 #, c-format msgid "Missing comma after lower bound." msgstr "Пропущено кому піÑÐ»Ñ Ð½Ð¸Ð¶Ð½ÑŒÐ¾Ñ— границі." -#: utils/adt/rangetypes.c:2255 +#: utils/adt/rangetypes.c:2406 #, c-format msgid "Too many commas." msgstr "Занадто багато ком." -#: utils/adt/rangetypes.c:2266 +#: utils/adt/rangetypes.c:2417 #, c-format msgid "Junk after right parenthesis or bracket." msgstr "Ð¡Ð¼Ñ–Ñ‚Ñ‚Ñ Ð¿Ñ–ÑÐ»Ñ Ð¿Ñ€Ð°Ð²Ð¾Ñ— дужки." -#: utils/adt/regexp.c:290 utils/adt/regexp.c:1983 utils/adt/varlena.c:4532 +#: utils/adt/regexp.c:304 utils/adt/regexp.c:1996 utils/adt/varlena.c:4273 #, c-format msgid "regular expression failed: %s" msgstr "помилка в регулÑрному виразі: %s" -#: utils/adt/regexp.c:431 utils/adt/regexp.c:666 +#: utils/adt/regexp.c:445 utils/adt/regexp.c:680 #, c-format msgid "invalid regular expression option: \"%.*s\"" msgstr "неприпуÑтимий параметр регулÑрного виразу: \"%.*s\"" -#: utils/adt/regexp.c:668 +#: utils/adt/regexp.c:682 #, c-format msgid "If you meant to use regexp_replace() with a start parameter, cast the fourth argument to integer explicitly." msgstr "Якщо ви хочете викориÑтовувати regexp_replace() з початковим параметром, приведіть тип четвертого аргумента до цілого чиÑла." -#: utils/adt/regexp.c:702 utils/adt/regexp.c:711 utils/adt/regexp.c:1068 -#: utils/adt/regexp.c:1132 utils/adt/regexp.c:1141 utils/adt/regexp.c:1150 -#: utils/adt/regexp.c:1159 utils/adt/regexp.c:1839 utils/adt/regexp.c:1848 -#: utils/adt/regexp.c:1857 utils/misc/guc.c:11869 utils/misc/guc.c:11903 +#: utils/adt/regexp.c:716 utils/adt/regexp.c:725 utils/adt/regexp.c:1082 +#: utils/adt/regexp.c:1146 utils/adt/regexp.c:1155 utils/adt/regexp.c:1164 +#: utils/adt/regexp.c:1173 utils/adt/regexp.c:1853 utils/adt/regexp.c:1862 +#: utils/adt/regexp.c:1871 utils/misc/guc.c:6820 utils/misc/guc.c:6854 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\": %d" -#: utils/adt/regexp.c:922 +#: utils/adt/regexp.c:936 #, c-format msgid "SQL regular expression may not contain more than two escape-double-quote separators" msgstr "РегулÑрний вираз SQL не може міÑтити більше двох роздільників escape-double-quote" #. translator: %s is a SQL function name -#: utils/adt/regexp.c:1079 utils/adt/regexp.c:1170 utils/adt/regexp.c:1257 -#: utils/adt/regexp.c:1296 utils/adt/regexp.c:1684 utils/adt/regexp.c:1739 -#: utils/adt/regexp.c:1868 +#: utils/adt/regexp.c:1093 utils/adt/regexp.c:1184 utils/adt/regexp.c:1271 +#: utils/adt/regexp.c:1310 utils/adt/regexp.c:1698 utils/adt/regexp.c:1753 +#: utils/adt/regexp.c:1882 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s не підтримує параметр \"global\"" -#: utils/adt/regexp.c:1298 +#: utils/adt/regexp.c:1312 #, c-format msgid "Use the regexp_matches function instead." msgstr "ВикориÑтайте функцію regexp_matches заміÑть." -#: utils/adt/regexp.c:1486 +#: utils/adt/regexp.c:1500 #, c-format msgid "too many regular expression matches" msgstr "занадто багато відповідноÑтей Ð´Ð»Ñ Ñ€ÐµÐ³ÑƒÐ»Ñрного виразу" -#: utils/adt/regproc.c:105 +#: utils/adt/regproc.c:104 #, c-format msgid "more than one function named \"%s\"" msgstr "ім'Ñ \"%s\" мають декілька функцій" -#: utils/adt/regproc.c:543 +#: utils/adt/regproc.c:513 #, c-format msgid "more than one operator named %s" msgstr "ім'Ñ %s мають декілька операторів" -#: utils/adt/regproc.c:710 utils/adt/regproc.c:751 gram.y:8885 +#: utils/adt/regproc.c:670 gram.y:8992 #, c-format msgid "missing argument" msgstr "пропущено аргумент" -#: utils/adt/regproc.c:711 utils/adt/regproc.c:752 gram.y:8886 +#: utils/adt/regproc.c:671 gram.y:8993 #, c-format msgid "Use NONE to denote the missing argument of a unary operator." msgstr "Щоб позначити пропущений аргумент унарного оператору, викориÑтайте NONE." -#: utils/adt/regproc.c:715 utils/adt/regproc.c:756 utils/adt/regproc.c:2055 -#: utils/adt/ruleutils.c:10116 utils/adt/ruleutils.c:10398 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10516 +#: utils/adt/ruleutils.c:10729 #, c-format msgid "too many arguments" msgstr "занадто багато аргументів" -#: utils/adt/regproc.c:716 utils/adt/regproc.c:757 +#: utils/adt/regproc.c:676 #, c-format msgid "Provide two argument types for operator." msgstr "Ðадайте Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° два типи аргументів." -#: utils/adt/regproc.c:1639 utils/adt/regproc.c:1663 utils/adt/regproc.c:1764 -#: utils/adt/regproc.c:1788 utils/adt/regproc.c:1890 utils/adt/regproc.c:1895 -#: utils/adt/varlena.c:3671 utils/adt/varlena.c:3676 +#: utils/adt/regproc.c:1564 utils/adt/regproc.c:1681 utils/adt/regproc.c:1810 +#: utils/adt/regproc.c:1815 utils/adt/varlena.c:3413 utils/adt/varlena.c:3418 #, c-format msgid "invalid name syntax" msgstr "неприпуÑтимий ÑинтакÑÐ¸Ñ Ð² імені" -#: utils/adt/regproc.c:1953 +#: utils/adt/regproc.c:1924 #, c-format msgid "expected a left parenthesis" msgstr "очікувалаÑÑŒ ліва дужка" -#: utils/adt/regproc.c:1969 +#: utils/adt/regproc.c:1942 #, c-format msgid "expected a right parenthesis" msgstr "очікувалаÑÑŒ права дужка" -#: utils/adt/regproc.c:1988 +#: utils/adt/regproc.c:1961 #, c-format msgid "expected a type name" msgstr "очікувалоÑÑŒ ім'Ñ Ñ‚Ð¸Ð¿Ñƒ" -#: utils/adt/regproc.c:2020 +#: utils/adt/regproc.c:1993 #, c-format msgid "improper type name" msgstr "неправильне ім'Ñ Ñ‚Ð¸Ð¿Ñƒ" -#: utils/adt/ri_triggers.c:307 utils/adt/ri_triggers.c:1611 -#: utils/adt/ri_triggers.c:2598 +#: utils/adt/ri_triggers.c:303 utils/adt/ri_triggers.c:1616 +#: utils/adt/ri_triggers.c:2601 #, c-format msgid "insert or update on table \"%s\" violates foreign key constraint \"%s\"" msgstr "insert або update в таблиці \"%s\" порушує Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ ключа \"%s\"" -#: utils/adt/ri_triggers.c:310 utils/adt/ri_triggers.c:1614 +#: utils/adt/ri_triggers.c:306 utils/adt/ri_triggers.c:1619 #, c-format msgid "MATCH FULL does not allow mixing of null and nonnull key values." msgstr "MATCH FULL не дозволÑÑ” змішувати в значенні ключа null Ñ– nonnull." -#: utils/adt/ri_triggers.c:2031 +#: utils/adt/ri_triggers.c:2036 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" повинна запуÑкатиÑÑŒ Ð´Ð»Ñ INSERT" -#: utils/adt/ri_triggers.c:2037 +#: utils/adt/ri_triggers.c:2042 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" повинна запуÑкатиÑÑŒ Ð´Ð»Ñ UPDATE" -#: utils/adt/ri_triggers.c:2043 +#: utils/adt/ri_triggers.c:2048 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" повинна запуÑкатиÑÑŒ Ð´Ð»Ñ DELETE" -#: utils/adt/ri_triggers.c:2066 +#: utils/adt/ri_triggers.c:2071 #, c-format msgid "no pg_constraint entry for trigger \"%s\" on table \"%s\"" msgstr "Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñƒ \"%s\" таблиці \"%s\" немає Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ pg_constraint" -#: utils/adt/ri_triggers.c:2068 +#: utils/adt/ri_triggers.c:2073 #, c-format msgid "Remove this referential integrity trigger and its mates, then do ALTER TABLE ADD CONSTRAINT." msgstr "Видаліть цей тригер ціліÑноÑті зв’Ñзків Ñ– пов'Ñзані об'єкти, а потім виконайте ALTER TABLE ADD CONSTRAINT." -#: utils/adt/ri_triggers.c:2098 gram.y:4286 +#: utils/adt/ri_triggers.c:2103 gram.y:4340 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "Вираз MATCH PARTIAL вÑе ще не реалізований" -#: utils/adt/ri_triggers.c:2423 +#: utils/adt/ri_triggers.c:2426 #, c-format msgid "referential integrity query on \"%s\" from constraint \"%s\" on \"%s\" gave unexpected result" msgstr "неочікуваний результат запиту ціліÑноÑті зв’Ñзків до \"%s\" з Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\" таблиці \"%s\"" -#: utils/adt/ri_triggers.c:2427 +#: utils/adt/ri_triggers.c:2430 #, c-format msgid "This is most likely due to a rule having rewritten the query." msgstr "Скоріше за вÑе, це викликано правилом, Ñке перепиÑало запит." -#: utils/adt/ri_triggers.c:2588 +#: utils/adt/ri_triggers.c:2591 #, c-format msgid "removing partition \"%s\" violates foreign key constraint \"%s\"" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñекції \"%s\" порушує Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ ключа \"%s" -#: utils/adt/ri_triggers.c:2591 utils/adt/ri_triggers.c:2616 +#: utils/adt/ri_triggers.c:2594 utils/adt/ri_triggers.c:2619 #, c-format msgid "Key (%s)=(%s) is still referenced from table \"%s\"." msgstr "Ðа ключ (%s)=(%s) вÑе ще Ñ” поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² таблиці \"%s\"." -#: utils/adt/ri_triggers.c:2602 +#: utils/adt/ri_triggers.c:2605 #, c-format msgid "Key (%s)=(%s) is not present in table \"%s\"." msgstr "Ключ (%s)=(%s) не приÑутній в таблиці \"%s\"." -#: utils/adt/ri_triggers.c:2605 +#: utils/adt/ri_triggers.c:2608 #, c-format msgid "Key is not present in table \"%s\"." msgstr "Ключ не приÑутній в таблиці \"%s\"." -#: utils/adt/ri_triggers.c:2611 +#: utils/adt/ri_triggers.c:2614 #, c-format msgid "update or delete on table \"%s\" violates foreign key constraint \"%s\" on table \"%s\"" msgstr "update або delete в таблиці \"%s\" порушує Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ ключа \"%s\" таблиці \"%s\"" -#: utils/adt/ri_triggers.c:2619 +#: utils/adt/ri_triggers.c:2622 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "Ðа ключ вÑе ще Ñ” поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð² таблиці \"%s\"." -#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:483 +#: utils/adt/rowtypes.c:105 utils/adt/rowtypes.c:509 #, c-format msgid "input of anonymous composite types is not implemented" msgstr "Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð°Ð½Ð¾Ð½Ñ–Ð¼Ð½Ð¸Ñ… Ñкладених типів не реалізовано" -#: utils/adt/rowtypes.c:157 utils/adt/rowtypes.c:186 utils/adt/rowtypes.c:209 -#: utils/adt/rowtypes.c:217 utils/adt/rowtypes.c:269 utils/adt/rowtypes.c:277 +#: utils/adt/rowtypes.c:158 utils/adt/rowtypes.c:190 utils/adt/rowtypes.c:216 +#: utils/adt/rowtypes.c:227 utils/adt/rowtypes.c:285 utils/adt/rowtypes.c:296 #, c-format msgid "malformed record literal: \"%s\"" msgstr "невірно Ñформований літерал запиÑу: \"%s\"" -#: utils/adt/rowtypes.c:158 +#: utils/adt/rowtypes.c:159 #, c-format msgid "Missing left parenthesis." msgstr "ВідÑÑƒÑ‚Ð½Ñ Ð»Ñ–Ð²Ð° дужка." -#: utils/adt/rowtypes.c:187 +#: utils/adt/rowtypes.c:191 #, c-format msgid "Too few columns." msgstr "Занадто мало Ñтовпців." -#: utils/adt/rowtypes.c:270 +#: utils/adt/rowtypes.c:286 #, c-format msgid "Too many columns." msgstr "Занадто багато Ñтовпців." -#: utils/adt/rowtypes.c:278 +#: utils/adt/rowtypes.c:297 #, c-format msgid "Junk after right parenthesis." msgstr "Ð¡Ð¼Ñ–Ñ‚Ñ‚Ñ Ð¿Ñ–Ñла правої дужки." -#: utils/adt/rowtypes.c:532 +#: utils/adt/rowtypes.c:558 #, c-format msgid "wrong number of columns: %d, expected %d" msgstr "неправильна кількіÑть Ñтовпців: %d, очікувалоÑÑŒ %d" -#: utils/adt/rowtypes.c:574 +#: utils/adt/rowtypes.c:599 #, c-format msgid "binary data has type %u (%s) instead of expected %u (%s) in record column %d" msgstr "двійкові дані мають тип %u (%s) заміÑть очікуваного %u (%s) в Ñтовпці запиÑу %d" -#: utils/adt/rowtypes.c:641 +#: utils/adt/rowtypes.c:660 #, c-format msgid "improper binary format in record column %d" msgstr "неправильний двійковий формат у Ñтовпці запиÑу %d" -#: utils/adt/rowtypes.c:932 utils/adt/rowtypes.c:1178 utils/adt/rowtypes.c:1436 -#: utils/adt/rowtypes.c:1682 +#: utils/adt/rowtypes.c:949 utils/adt/rowtypes.c:1195 utils/adt/rowtypes.c:1453 +#: utils/adt/rowtypes.c:1699 #, c-format msgid "cannot compare dissimilar column types %s and %s at record column %d" msgstr "не можна порівнювати неподібні типи Ñтовпців %s Ñ– %s, Ñтовпець запиÑу %d" -#: utils/adt/rowtypes.c:1023 utils/adt/rowtypes.c:1248 -#: utils/adt/rowtypes.c:1533 utils/adt/rowtypes.c:1718 +#: utils/adt/rowtypes.c:1040 utils/adt/rowtypes.c:1265 +#: utils/adt/rowtypes.c:1550 utils/adt/rowtypes.c:1735 #, c-format msgid "cannot compare record types with different numbers of columns" msgstr "не можна порівнювати типи запиÑів з різної кількіÑтю Ñтовпців" -#: utils/adt/ruleutils.c:2715 +#: utils/adt/ruleutils.c:2694 #, c-format msgid "input is a query, not an expression" msgstr "вхідне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ” запитом, а не виразом" -#: utils/adt/ruleutils.c:2727 +#: utils/adt/ruleutils.c:2706 #, c-format msgid "expression contains variables of more than one relation" msgstr "вираз міÑтить змінні більше одного відношеннÑ" -#: utils/adt/ruleutils.c:2734 +#: utils/adt/ruleutils.c:2713 #, c-format msgid "expression contains variables" msgstr "вираз міÑтить змінні" -#: utils/adt/ruleutils.c:5257 +#: utils/adt/ruleutils.c:5246 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "правило \"%s\" має непідтримуваний тип подій %d" -#: utils/adt/timestamp.c:110 +#: utils/adt/timestamp.c:128 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "TIMESTAMP(%d)%s точніÑть не повинна бути від'ємною" -#: utils/adt/timestamp.c:116 +#: utils/adt/timestamp.c:134 #, c-format msgid "TIMESTAMP(%d)%s precision reduced to maximum allowed, %d" msgstr "TIMESTAMP(%d)%s точніÑть зменшена до дозволеного макÑимуму, %d" -#: utils/adt/timestamp.c:179 utils/adt/timestamp.c:437 utils/misc/guc.c:12893 -#, c-format -msgid "timestamp out of range: \"%s\"" -msgstr "позначка чаÑу поза діапазоном: \"%s\"" - -#: utils/adt/timestamp.c:375 +#: utils/adt/timestamp.c:394 #, c-format msgid "timestamp(%d) precision must be between %d and %d" msgstr "точніÑть позначки чаÑу (%d) повинна бути між %d Ñ– %d" -#: utils/adt/timestamp.c:499 +#: utils/adt/timestamp.c:512 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "ЧиÑлові чаÑові поÑÑи повинні мати \"-\" або \"+\" в ÑкоÑті першого Ñимволу." -#: utils/adt/timestamp.c:512 +#: utils/adt/timestamp.c:524 #, c-format msgid "numeric time zone \"%s\" out of range" msgstr "чиÑловий чаÑовий поÑÑ \"%s\" поза діапазоном" -#: utils/adt/timestamp.c:608 utils/adt/timestamp.c:618 -#: utils/adt/timestamp.c:626 +#: utils/adt/timestamp.c:625 utils/adt/timestamp.c:635 +#: utils/adt/timestamp.c:643 #, c-format msgid "timestamp out of range: %d-%02d-%02d %d:%02d:%02g" msgstr "позначка чаÑу поза діапазоном: %d-%02d-%02d %d:%02d:%02g" -#: utils/adt/timestamp.c:727 +#: utils/adt/timestamp.c:744 #, c-format msgid "timestamp cannot be NaN" msgstr "позначка чаÑу не може бути NaN" -#: utils/adt/timestamp.c:745 utils/adt/timestamp.c:757 +#: utils/adt/timestamp.c:762 utils/adt/timestamp.c:774 #, c-format msgid "timestamp out of range: \"%g\"" msgstr "позначка чаÑу поза діапазоном: \"%g\"" -#: utils/adt/timestamp.c:1062 utils/adt/timestamp.c:1095 +#: utils/adt/timestamp.c:957 utils/adt/timestamp.c:1516 +#: utils/adt/timestamp.c:1526 utils/adt/timestamp.c:1587 +#: utils/adt/timestamp.c:2807 utils/adt/timestamp.c:2816 +#: utils/adt/timestamp.c:2831 utils/adt/timestamp.c:2905 +#: utils/adt/timestamp.c:2922 utils/adt/timestamp.c:2979 +#: utils/adt/timestamp.c:3022 utils/adt/timestamp.c:3400 +#: utils/adt/timestamp.c:3458 utils/adt/timestamp.c:3481 +#: utils/adt/timestamp.c:3490 utils/adt/timestamp.c:3514 +#: utils/adt/timestamp.c:3537 utils/adt/timestamp.c:3546 +#: utils/adt/timestamp.c:3681 utils/adt/timestamp.c:3782 +#: utils/adt/timestamp.c:4189 utils/adt/timestamp.c:4226 +#: utils/adt/timestamp.c:4274 utils/adt/timestamp.c:4283 +#: utils/adt/timestamp.c:4375 utils/adt/timestamp.c:4422 +#: utils/adt/timestamp.c:4431 utils/adt/timestamp.c:4527 +#: utils/adt/timestamp.c:4580 utils/adt/timestamp.c:4590 +#: utils/adt/timestamp.c:4785 utils/adt/timestamp.c:4795 +#: utils/adt/timestamp.c:5097 +#, c-format +msgid "interval out of range" +msgstr "інтервал поза діапазоном" + +#: utils/adt/timestamp.c:1094 utils/adt/timestamp.c:1127 #, c-format msgid "invalid INTERVAL type modifier" msgstr "неприпуÑтимий модифікатор типу INTERVAL" -#: utils/adt/timestamp.c:1078 +#: utils/adt/timestamp.c:1110 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d) точніÑть не повинна бути від'ємною" -#: utils/adt/timestamp.c:1084 +#: utils/adt/timestamp.c:1116 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d) точніÑть зменшена до макÑимально можливої, %d" -#: utils/adt/timestamp.c:1466 +#: utils/adt/timestamp.c:1506 #, c-format msgid "interval(%d) precision must be between %d and %d" msgstr "interval(%d) точніÑть повинна бути між %d Ñ– %d" -#: utils/adt/timestamp.c:2689 -#, c-format -msgid "cannot subtract infinite timestamps" -msgstr "віднімати безкінечні позначки чаÑу не можна" - -#: utils/adt/timestamp.c:3891 utils/adt/timestamp.c:4074 +#: utils/adt/timestamp.c:4564 utils/adt/timestamp.c:4769 #, c-format msgid "origin out of range" msgstr "джерело поза діапазоном" -#: utils/adt/timestamp.c:3896 utils/adt/timestamp.c:4079 +#: utils/adt/timestamp.c:4569 utils/adt/timestamp.c:4774 +#, c-format +msgid "timestamps cannot be binned into infinite intervals" +msgstr "мітки чаÑу не можуть бути розбиті на неÑкінченні інтервали" + +#: utils/adt/timestamp.c:4574 utils/adt/timestamp.c:4779 #, c-format msgid "timestamps cannot be binned into intervals containing months or years" msgstr "позначки чаÑу не можна розділÑти на інтервали, що міÑÑ‚Ñть міÑÑці або роки" -#: utils/adt/timestamp.c:3903 utils/adt/timestamp.c:4086 +#: utils/adt/timestamp.c:4585 utils/adt/timestamp.c:4790 #, c-format msgid "stride must be greater than zero" msgstr "крок повинен бути більше нулÑ" -#: utils/adt/timestamp.c:4399 +#: utils/adt/timestamp.c:5091 #, c-format msgid "Months usually have fractional weeks." msgstr "У міÑÑців зазвичай Ñ” дробові тижні." -#: utils/adt/trigfuncs.c:42 +#: utils/adt/timestamp.c:6551 utils/adt/timestamp.c:6637 +#, c-format +msgid "step size cannot be infinite" +msgstr "розмір кроку не може бути неÑкінченним" + +#: utils/adt/trigfuncs.c:41 #, c-format msgid "suppress_redundant_updates_trigger: must be called as trigger" msgstr "suppress_redundant_updates_trigger: повинна викликатиÑÑŒ Ñк тригер" -#: utils/adt/trigfuncs.c:48 +#: utils/adt/trigfuncs.c:47 #, c-format msgid "suppress_redundant_updates_trigger: must be called on update" msgstr "suppress_redundant_updates_trigger: повинна викликатиÑÑŒ при оновленні" -#: utils/adt/trigfuncs.c:54 +#: utils/adt/trigfuncs.c:53 #, c-format msgid "suppress_redundant_updates_trigger: must be called before update" msgstr "suppress_redundant_updates_trigger: повинна викликатиÑÑŒ перед оновленнÑм" -#: utils/adt/trigfuncs.c:60 +#: utils/adt/trigfuncs.c:59 #, c-format msgid "suppress_redundant_updates_trigger: must be called for each row" msgstr "suppress_redundant_updates_trigger: повинна Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ‚Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´ кожним Ñ€Ñдком" -#: utils/adt/tsgistidx.c:92 -#, c-format -msgid "gtsvector_in not implemented" -msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ gtsvector_in не реалізована" - -#: utils/adt/tsquery.c:199 utils/adt/tsquery_op.c:124 +#: utils/adt/tsquery.c:210 utils/adt/tsquery_op.c:125 #, c-format msgid "distance in phrase operator must be an integer value between zero and %d inclusive" msgstr "відÑтань у фразовому операторі повинна бути цілим чиÑлом від Ð½ÑƒÐ»Ñ Ð´Ð¾ %d включно" -#: utils/adt/tsquery.c:306 utils/adt/tsquery.c:691 -#: utils/adt/tsvector_parser.c:133 -#, c-format -msgid "syntax error in tsquery: \"%s\"" -msgstr "ÑинтакÑична помилка в tsquery: \"%s\"" - -#: utils/adt/tsquery.c:330 +#: utils/adt/tsquery.c:344 #, c-format msgid "no operand in tsquery: \"%s\"" msgstr "немає оператора в tsquery: \"%s\"" -#: utils/adt/tsquery.c:534 +#: utils/adt/tsquery.c:554 #, c-format msgid "value is too big in tsquery: \"%s\"" msgstr "занадто велике Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² tsquery: \"%s\"" -#: utils/adt/tsquery.c:539 +#: utils/adt/tsquery.c:559 #, c-format msgid "operand is too long in tsquery: \"%s\"" msgstr "занадто довгий операнд в tsquery: \"%s\"" -#: utils/adt/tsquery.c:567 +#: utils/adt/tsquery.c:587 #, c-format msgid "word is too long in tsquery: \"%s\"" msgstr "занадто довге Ñлово в tsquery: \"%s\"" -#: utils/adt/tsquery.c:835 +#: utils/adt/tsquery.c:713 utils/adt/tsvector_parser.c:147 +#, c-format +msgid "syntax error in tsquery: \"%s\"" +msgstr "ÑинтакÑична помилка в tsquery: \"%s\"" + +#: utils/adt/tsquery.c:879 #, c-format msgid "text-search query doesn't contain lexemes: \"%s\"" msgstr "запит пошуку текÑту не міÑтить лекÑем: \"%s\"" -#: utils/adt/tsquery.c:846 utils/adt/tsquery_util.c:375 +#: utils/adt/tsquery.c:890 utils/adt/tsquery_util.c:376 #, c-format msgid "tsquery is too large" msgstr "tsquery занадто великий" -#: utils/adt/tsquery_cleanup.c:407 +#: utils/adt/tsquery_cleanup.c:409 #, c-format msgid "text-search query contains only stop words or doesn't contain lexemes, ignored" msgstr "запит пошуку текÑту ігноруєтьÑÑ, тому, що міÑтить лише Ñтоп-Ñлова або не міÑтить лекÑем" @@ -25306,12 +26722,12 @@ msgstr "маÑив значимоÑті не повинен міÑтити null" msgid "weight out of range" msgstr "значиміÑть поза діапазоном" -#: utils/adt/tsvector.c:215 +#: utils/adt/tsvector.c:216 #, c-format msgid "word is too long (%ld bytes, max %ld bytes)" msgstr "Ñлово занадто довге (%ld байт, при макÑимумі %ld)" -#: utils/adt/tsvector.c:222 +#: utils/adt/tsvector.c:223 #, c-format msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "Ñ€Ñдок занадто довгий Ð´Ð»Ñ tsvector (%ld байт, при макÑимумі %ld)" @@ -25326,72 +26742,72 @@ msgstr "маÑив лекÑем не може міÑтити null" msgid "lexeme array may not contain empty strings" msgstr "маÑив лекÑем не може міÑтити порожніх Ñ€Ñдків" -#: utils/adt/tsvector_op.c:846 +#: utils/adt/tsvector_op.c:845 #, c-format msgid "weight array may not contain nulls" msgstr "маÑив значимоÑті не може міÑтити null" -#: utils/adt/tsvector_op.c:870 +#: utils/adt/tsvector_op.c:869 #, c-format msgid "unrecognized weight: \"%c\"" msgstr "нерозпізнана значиміÑть: \"%c\"" -#: utils/adt/tsvector_op.c:2431 +#: utils/adt/tsvector_op.c:2599 #, c-format msgid "ts_stat query must return one tsvector column" msgstr "запит ts_stat повинен повернути один Ñтовпець tsvector" -#: utils/adt/tsvector_op.c:2620 +#: utils/adt/tsvector_op.c:2788 #, c-format msgid "tsvector column \"%s\" does not exist" msgstr "Ñтовпець типу tsvector \"%s\" не Ñ–Ñнує" -#: utils/adt/tsvector_op.c:2627 +#: utils/adt/tsvector_op.c:2795 #, c-format msgid "column \"%s\" is not of tsvector type" msgstr "Ñтовпець \"%s\" повинен мати тип tsvector" -#: utils/adt/tsvector_op.c:2639 +#: utils/adt/tsvector_op.c:2807 #, c-format msgid "configuration column \"%s\" does not exist" msgstr "Ñтовпець конфігурації \"%s\" не Ñ–Ñнує" -#: utils/adt/tsvector_op.c:2645 +#: utils/adt/tsvector_op.c:2813 #, c-format msgid "column \"%s\" is not of regconfig type" msgstr "Ñтовпець \"%s\" повинен мати тип regconfig" -#: utils/adt/tsvector_op.c:2652 +#: utils/adt/tsvector_op.c:2820 #, c-format msgid "configuration column \"%s\" must not be null" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— \"%s\" не повинне бути null" -#: utils/adt/tsvector_op.c:2665 +#: utils/adt/tsvector_op.c:2833 #, c-format msgid "text search configuration name \"%s\" must be schema-qualified" msgstr "ім'Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— текÑтового пошуку \"%s\" повинно вказуватиÑÑ Ð·Ñ– Ñхемою" -#: utils/adt/tsvector_op.c:2690 +#: utils/adt/tsvector_op.c:2858 #, c-format msgid "column \"%s\" is not of a character type" msgstr "Ñтовпець \"%s\" має не Ñимвольний тип" -#: utils/adt/tsvector_parser.c:134 +#: utils/adt/tsvector_parser.c:148 #, c-format msgid "syntax error in tsvector: \"%s\"" msgstr "ÑинтакÑична помилка в tsvector: \"%s\"" -#: utils/adt/tsvector_parser.c:200 +#: utils/adt/tsvector_parser.c:221 #, c-format msgid "there is no escaped character: \"%s\"" msgstr "немає пропущеного Ñимволу: \"%s\"" -#: utils/adt/tsvector_parser.c:318 +#: utils/adt/tsvector_parser.c:339 #, c-format msgid "wrong position info in tsvector: \"%s\"" msgstr "неправильна Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ позицію в tsvector: \"%s\"" -#: utils/adt/uuid.c:413 +#: utils/adt/uuid.c:418 #, c-format msgid "could not generate random values" msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ випадкові значеннÑ" @@ -25436,9 +26852,9 @@ msgstr "неприпуÑтима довжина у зовнішньому Ñ€Ñд msgid "bit string too long for type bit varying(%d)" msgstr "Ñ€Ñдок бітів занадто довгий Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ bit varying(%d)" -#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:889 -#: utils/adt/varlena.c:952 utils/adt/varlena.c:1109 utils/adt/varlena.c:3313 -#: utils/adt/varlena.c:3391 +#: utils/adt/varbit.c:1081 utils/adt/varbit.c:1191 utils/adt/varlena.c:911 +#: utils/adt/varlena.c:974 utils/adt/varlena.c:1131 utils/adt/varlena.c:3055 +#: utils/adt/varlena.c:3133 #, c-format msgid "negative substring length not allowed" msgstr "від'ємна довжина підрÑдка не дозволена" @@ -25463,477 +26879,472 @@ msgstr "не можна викориÑтовувати (XOR) Ð´Ð»Ñ Ð±Ñ–Ñ‚Ð¾Ð²Ð¸ msgid "bit index %d out of valid range (0..%d)" msgstr "Ñ–Ð½Ð´ÐµÐºÑ Ð±Ñ–Ñ‚Ñƒ %d поза припуÑтимим діапазоном (0..%d)" -#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3595 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3337 #, c-format msgid "new bit must be 0 or 1" msgstr "новий біт повинен бути 0 або 1" -#: utils/adt/varchar.c:157 utils/adt/varchar.c:310 +#: utils/adt/varchar.c:161 utils/adt/varchar.c:312 #, c-format msgid "value too long for type character(%d)" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ довге Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ character(%d)" -#: utils/adt/varchar.c:472 utils/adt/varchar.c:634 +#: utils/adt/varchar.c:475 utils/adt/varchar.c:639 #, c-format msgid "value too long for type character varying(%d)" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ довге Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ character varying(%d)" -#: utils/adt/varchar.c:732 utils/adt/varlena.c:1498 +#: utils/adt/varchar.c:737 utils/adt/varlena.c:1520 #, c-format msgid "could not determine which collation to use for string comparison" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸, Ñкий параметр ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтати Ð´Ð»Ñ Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑÐ½Ð½Ñ Ñ€Ñдків" -#: utils/adt/varlena.c:1208 utils/adt/varlena.c:1947 +#: utils/adt/varlena.c:1230 utils/adt/varlena.c:1809 #, c-format msgid "nondeterministic collations are not supported for substring searches" msgstr "недетерміновані параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ підрÑдків" -#: utils/adt/varlena.c:1596 utils/adt/varlena.c:1609 -#, c-format -msgid "could not convert string to UTF-16: error code %lu" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ Ñ€Ñдок в UTF-16: код помилки %lu" - -#: utils/adt/varlena.c:1624 -#, c-format -msgid "could not compare Unicode strings: %m" -msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ñ–Ð²Ð½Ñти Ñ€Ñдки в Unicode: %m" - -#: utils/adt/varlena.c:1675 utils/adt/varlena.c:2398 -#, c-format -msgid "collation failed: %s" -msgstr "помилка в бібліотеці ÑортуваннÑ: %s" - -#: utils/adt/varlena.c:2585 -#, c-format -msgid "sort key generation failed: %s" -msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ ключ ÑортуваннÑ: %s" - -#: utils/adt/varlena.c:3479 utils/adt/varlena.c:3546 +#: utils/adt/varlena.c:3221 utils/adt/varlena.c:3288 #, c-format msgid "index %d out of valid range, 0..%d" msgstr "Ñ–Ð½Ð´ÐµÐºÑ %d поза припуÑтимим діапазоном, 0..%d" -#: utils/adt/varlena.c:3510 utils/adt/varlena.c:3582 +#: utils/adt/varlena.c:3252 utils/adt/varlena.c:3324 #, c-format msgid "index %lld out of valid range, 0..%lld" msgstr "Ñ–Ð½Ð´ÐµÐºÑ %lld поза допуÑтимим діапазоном, 0..%lld" -#: utils/adt/varlena.c:4644 +#: utils/adt/varlena.c:4385 #, c-format msgid "field position must not be zero" msgstr "Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ Ð¿Ð¾Ð»Ñ Ð½Ðµ повинна бути нульовою" -#: utils/adt/varlena.c:5664 +#: utils/adt/varlena.c:5630 #, c-format msgid "unterminated format() type specifier" msgstr "незавершений Ñпецифікатор типу format()" -#: utils/adt/varlena.c:5665 utils/adt/varlena.c:5799 utils/adt/varlena.c:5920 +#: utils/adt/varlena.c:5631 utils/adt/varlena.c:5765 utils/adt/varlena.c:5886 #, c-format msgid "For a single \"%%\" use \"%%%%\"." msgstr "Ð”Ð»Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ знаку \"%%\", викориÑтайте \"%%%%\"." -#: utils/adt/varlena.c:5797 utils/adt/varlena.c:5918 +#: utils/adt/varlena.c:5763 utils/adt/varlena.c:5884 #, c-format msgid "unrecognized format() type specifier \"%.*s\"" msgstr "нерозпізнаний Ñпецифікатор типу format() \"%.*s\"" -#: utils/adt/varlena.c:5810 utils/adt/varlena.c:5867 +#: utils/adt/varlena.c:5776 utils/adt/varlena.c:5833 #, c-format msgid "too few arguments for format()" msgstr "занадто мало аргументів Ð´Ð»Ñ format()" -#: utils/adt/varlena.c:5963 utils/adt/varlena.c:6145 +#: utils/adt/varlena.c:5929 utils/adt/varlena.c:6111 #, c-format msgid "number is out of range" msgstr "чиÑло поза діапазоном" -#: utils/adt/varlena.c:6026 utils/adt/varlena.c:6054 +#: utils/adt/varlena.c:5992 utils/adt/varlena.c:6020 #, c-format msgid "format specifies argument 0, but arguments are numbered from 1" msgstr "формат поÑилаєтьÑÑ Ð½Ð° аргумент 0, але аргументи нумеруютÑÑ Ð· 1" -#: utils/adt/varlena.c:6047 +#: utils/adt/varlena.c:6013 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "вказівка аргументу ширини повинно закінчуватиÑÑ \"$\"" -#: utils/adt/varlena.c:6092 +#: utils/adt/varlena.c:6058 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ null не можна форматувати у виглÑді SQL-ідентифікатору" -#: utils/adt/varlena.c:6218 +#: utils/adt/varlena.c:6266 #, c-format msgid "Unicode normalization can only be performed if server encoding is UTF8" msgstr "ÐÐ¾Ñ€Ð¼Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Unicode може виконуватиÑÑŒ лише тоді, коли ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñерверу - UTF8" -#: utils/adt/varlena.c:6231 +#: utils/adt/varlena.c:6279 #, c-format msgid "invalid normalization form: %s" msgstr "неприпуÑтима форма нормалізації: %s" -#: utils/adt/varlena.c:6434 utils/adt/varlena.c:6469 utils/adt/varlena.c:6504 +#: utils/adt/varlena.c:6324 +#, c-format +msgid "Unicode categorization can only be performed if server encoding is UTF8" +msgstr "ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð² юні коді може бути виконана, тільки Ñкщо ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера - UTF8" + +#: utils/adt/varlena.c:6541 utils/adt/varlena.c:6576 utils/adt/varlena.c:6611 #, c-format msgid "invalid Unicode code point: %04X" msgstr "неприпуÑтима точка коду Unicode: %04X" -#: utils/adt/varlena.c:6534 +#: utils/adt/varlena.c:6641 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "Спеціальні коди Unicode повинні бути \\XXXX, \\+XXXXXX, \\uXXXXXX, або \\UXXXXXX." -#: utils/adt/windowfuncs.c:306 +#: utils/adt/windowfuncs.c:443 #, c-format msgid "argument of ntile must be greater than zero" msgstr "аргумент ntile повинен бути більше нулÑ" -#: utils/adt/windowfuncs.c:528 +#: utils/adt/windowfuncs.c:707 #, c-format msgid "argument of nth_value must be greater than zero" msgstr "аргумент nth_value повинен бути більше нулÑ" -#: utils/adt/xid8funcs.c:117 +#: utils/adt/xid8funcs.c:120 #, c-format msgid "transaction ID %llu is in the future" msgstr "ідентифікатор транзакції %llu знаходитьÑÑ Ð² майбутньому" -#: utils/adt/xid8funcs.c:547 +#: utils/adt/xid8funcs.c:522 #, c-format msgid "invalid external pg_snapshot data" msgstr "неприпуÑтимі зовнішні дані pg_snapshot" -#: utils/adt/xml.c:222 +#: utils/adt/xml.c:238 #, c-format msgid "unsupported XML feature" msgstr "XML-функції не підтримуютьÑÑ" -#: utils/adt/xml.c:223 +#: utils/adt/xml.c:239 #, c-format msgid "This functionality requires the server to be built with libxml support." msgstr "Ð¦Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ð¾Ð½Ð°Ð»ÑŒÐ½Ñ–Ñть потребує, щоб Ñервер був побудований з підтримкою libxml." -#: utils/adt/xml.c:242 utils/mb/mbutils.c:627 +#: utils/adt/xml.c:258 utils/mb/mbutils.c:627 #, c-format msgid "invalid encoding name \"%s\"" msgstr "неприпуÑтиме Ñ–Ð¼â€™Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"" -#: utils/adt/xml.c:485 utils/adt/xml.c:490 +#: utils/adt/xml.c:506 utils/adt/xml.c:511 #, c-format msgid "invalid XML comment" msgstr "неприпуÑтимий XML-коментар" -#: utils/adt/xml.c:619 +#: utils/adt/xml.c:697 #, c-format msgid "not an XML document" msgstr "не XML-документ" -#: utils/adt/xml.c:778 utils/adt/xml.c:801 +#: utils/adt/xml.c:1008 utils/adt/xml.c:1031 #, c-format msgid "invalid XML processing instruction" msgstr "неприпуÑтима XML-команда обробки" -#: utils/adt/xml.c:779 +#: utils/adt/xml.c:1009 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "Метою XML-команди обробки не може бути \"%s\"." -#: utils/adt/xml.c:802 +#: utils/adt/xml.c:1032 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-команда обробки не може міÑтити \"?>\"." -#: utils/adt/xml.c:881 +#: utils/adt/xml.c:1111 #, c-format msgid "xmlvalidate is not implemented" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ xmlvalidate не реалізована" -#: utils/adt/xml.c:960 +#: utils/adt/xml.c:1167 #, c-format msgid "could not initialize XML library" msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ бібліотеку XML" -#: utils/adt/xml.c:961 +#: utils/adt/xml.c:1168 #, c-format msgid "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." msgstr "libxml2 має неÑуміÑний тип char: sizeof(char)=%zu, sizeof(xmlChar)=%zu." -#: utils/adt/xml.c:1047 +#: utils/adt/xml.c:1254 #, c-format msgid "could not set up XML error handler" msgstr "не вдалоÑÑ Ð²Ñтановити обробник XML-помилок" -#: utils/adt/xml.c:1048 +#: utils/adt/xml.c:1255 #, c-format msgid "This probably indicates that the version of libxml2 being used is not compatible with the libxml2 header files that PostgreSQL was built with." msgstr "Можливо це означає, що викориÑтовувана верÑÑ–Ñ libxml2 неÑуміÑна з файлами-заголовками libxml2, з котрими був зібраний PostgreSQL." -#: utils/adt/xml.c:1935 +#: utils/adt/xml.c:2281 msgid "Invalid character value." msgstr "ÐеприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñимволу." -#: utils/adt/xml.c:1938 +#: utils/adt/xml.c:2284 msgid "Space required." msgstr "ПотребуєтьÑÑ Ð¿Ñ€Ð¾Ð±Ñ–Ð»." -#: utils/adt/xml.c:1941 +#: utils/adt/xml.c:2287 msgid "standalone accepts only 'yes' or 'no'." msgstr "значеннÑми атрибуту standalone можуть бути лише 'yes' або 'no'." -#: utils/adt/xml.c:1944 +#: utils/adt/xml.c:2290 msgid "Malformed declaration: missing version." msgstr "Ðеправильне оголошеннÑ: пропущена верÑÑ–Ñ." -#: utils/adt/xml.c:1947 +#: utils/adt/xml.c:2293 msgid "Missing encoding in text declaration." msgstr "Ð’ оголошенні пропущене кодуваннÑ." -#: utils/adt/xml.c:1950 +#: utils/adt/xml.c:2296 msgid "Parsing XML declaration: '?>' expected." msgstr "Ðналіз XML-оголошеннÑ: '?>' очікуєтьÑÑ." -#: utils/adt/xml.c:1953 +#: utils/adt/xml.c:2299 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Ðерозпізнаний код помилки libxml: %d." -#: utils/adt/xml.c:2210 +#: utils/adt/xml.c:2553 #, c-format msgid "XML does not support infinite date values." msgstr "XML не підтримує безкінечні Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² датах." -#: utils/adt/xml.c:2232 utils/adt/xml.c:2259 +#: utils/adt/xml.c:2575 utils/adt/xml.c:2602 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML не підтримує безкінченні Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² позначках чаÑу." -#: utils/adt/xml.c:2675 +#: utils/adt/xml.c:3018 #, c-format msgid "invalid query" msgstr "неприпуÑтимий запит" -#: utils/adt/xml.c:4015 +#: utils/adt/xml.c:3110 +#, c-format +msgid "portal \"%s\" does not return tuples" +msgstr "portal \"%s\" не повертає кортежі" + +#: utils/adt/xml.c:4362 #, c-format msgid "invalid array for XML namespace mapping" msgstr "неприпуÑтимий маÑив з зіÑтавленнÑм проÑтіру імен XML" -#: utils/adt/xml.c:4016 +#: utils/adt/xml.c:4363 #, c-format msgid "The array must be two-dimensional with length of the second axis equal to 2." msgstr "МаÑив повинен бути двовимірним Ñ– міÑтити 2 елемента по другій віÑÑ–." -#: utils/adt/xml.c:4040 +#: utils/adt/xml.c:4387 #, c-format msgid "empty XPath expression" msgstr "пуÑтий вираз XPath" -#: utils/adt/xml.c:4092 +#: utils/adt/xml.c:4439 #, c-format msgid "neither namespace name nor URI may be null" msgstr "ні ім'Ñ Ð¿Ñ€Ð¾Ñтіру імен ні URI не можуть бути null" -#: utils/adt/xml.c:4099 +#: utils/adt/xml.c:4446 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "не вдалоÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрувати проÑтір імен XML з ім'Ñм \"%s\" Ñ– URI \"%s\"" -#: utils/adt/xml.c:4450 +#: utils/adt/xml.c:4795 #, c-format msgid "DEFAULT namespace is not supported" msgstr "ПроÑтір імен DEFAULT не підтримуєтьÑÑ" -#: utils/adt/xml.c:4479 +#: utils/adt/xml.c:4824 #, c-format msgid "row path filter must not be empty string" msgstr "шлÑÑ… фільтруючих Ñ€Ñдків не повинен бути пуÑтим" -#: utils/adt/xml.c:4510 +#: utils/adt/xml.c:4858 #, c-format msgid "column path filter must not be empty string" msgstr "шлÑÑ… фільтруючого ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð½Ðµ повинен бути пуÑтим" -#: utils/adt/xml.c:4654 +#: utils/adt/xml.c:5005 #, c-format msgid "more than one value returned by column XPath expression" msgstr "вираз XPath, Ñкий відбирає Ñтовпець, повернув більше одного значеннÑ" -#: utils/cache/lsyscache.c:1042 +#: utils/cache/lsyscache.c:1017 #, c-format msgid "cast from type %s to type %s does not exist" msgstr "Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ типу %s до типу %s не Ñ–Ñнує" -#: utils/cache/lsyscache.c:2844 utils/cache/lsyscache.c:2877 -#: utils/cache/lsyscache.c:2910 utils/cache/lsyscache.c:2943 +#: utils/cache/lsyscache.c:2887 utils/cache/lsyscache.c:2920 +#: utils/cache/lsyscache.c:2953 utils/cache/lsyscache.c:2986 #, c-format msgid "type %s is only a shell" msgstr "тип %s лише оболонка" -#: utils/cache/lsyscache.c:2849 +#: utils/cache/lsyscache.c:2892 #, c-format msgid "no input function available for type %s" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s немає доÑтупної функції введеннÑ" -#: utils/cache/lsyscache.c:2882 +#: utils/cache/lsyscache.c:2925 #, c-format msgid "no output function available for type %s" msgstr "Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s немає доÑтупної функції виводу" -#: utils/cache/partcache.c:215 +#: utils/cache/partcache.c:216 #, c-format msgid "operator class \"%s\" of access method %s is missing support function %d for type %s" msgstr "в клаÑÑ– операторів \"%s\" методу доÑтупу %s пропущено опорну функцію %d Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" -#: utils/cache/plancache.c:720 +#: utils/cache/plancache.c:747 #, c-format msgid "cached plan must not change result type" msgstr "в кешованому плані не повинен змінюватиÑÑŒ тип результату" -#: utils/cache/relcache.c:3732 +#: utils/cache/relcache.c:3801 #, c-format -msgid "heap relfilenode value not set when in binary upgrade mode" -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ relfilenode динамічної пам'Ñті не вÑтановлено в режимі двійкового оновленнÑ" +msgid "heap relfilenumber value not set when in binary upgrade mode" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ relfilenumber не вÑтановлене у режимі двійкового оновленнÑ" -#: utils/cache/relcache.c:3740 +#: utils/cache/relcache.c:3809 #, c-format -msgid "unexpected request for new relfilenode in binary upgrade mode" -msgstr "неочікуваний запит на новий relfilenode в режимі двійкового оновленнÑ" +msgid "unexpected request for new relfilenumber in binary upgrade mode" +msgstr "неочікуваний запит на новий relfilenumber в режимі двійкового оновленнÑ" -#: utils/cache/relcache.c:6451 +#: utils/cache/relcache.c:6539 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "не вдалоÑÑ Ñтворити файл ініціалізації Ð´Ð»Ñ ÐºÐµÑˆÑƒ відношень \"%s\": %m" -#: utils/cache/relcache.c:6453 +#: utils/cache/relcache.c:6541 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Продовжуємо уÑе одно, але щоÑÑŒ не так." -#: utils/cache/relcache.c:6775 +#: utils/cache/relcache.c:6871 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл кешу \"%s\": %m" -#: utils/cache/relmapper.c:590 +#: utils/cache/relmapper.c:596 #, c-format msgid "cannot PREPARE a transaction that modified relation mapping" msgstr "виконати PREPARE Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ—, Ñка змінила зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½ÑŒ, не можна" -#: utils/cache/relmapper.c:836 +#: utils/cache/relmapper.c:852 #, c-format msgid "relation mapping file \"%s\" contains invalid data" msgstr "файл зіÑтавлень відношень \"%s\" міÑтить неприпуÑтимі дані" -#: utils/cache/relmapper.c:846 +#: utils/cache/relmapper.c:862 #, c-format msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "файл зіÑтавлень відношень \"%s\" міÑтить неправильну контрольну Ñуму" -#: utils/cache/typcache.c:1809 utils/fmgr/funcapi.c:532 +#: utils/cache/typcache.c:1812 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "тип запиÑу не зареєÑтрований" -#: utils/error/assert.c:39 +#: utils/error/assert.c:37 #, c-format msgid "TRAP: ExceptionalCondition: bad arguments in PID %d\n" msgstr "TRAP: ExceptionalCondition: невірні аргументи в PID %d\n" -#: utils/error/assert.c:42 +#: utils/error/assert.c:40 #, c-format -msgid "TRAP: %s(\"%s\", File: \"%s\", Line: %d, PID: %d)\n" -msgstr "TRAP: %s(\"%s\", Файл: \"%s\", РÑдок: %d, PID: %d)\n" +msgid "TRAP: failed Assert(\"%s\"), File: \"%s\", Line: %d, PID: %d\n" +msgstr "TRAP: помилка Assert(\"%s\"), файл: \"%s\", Ñ€Ñдок: %d, PID: %d\n" -#: utils/error/elog.c:404 +#: utils/error/elog.c:415 #, c-format msgid "error occurred before error message processing is available\n" msgstr "ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° перед тим, Ñк обробка Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку була доÑтупна\n" -#: utils/error/elog.c:1943 +#: utils/error/elog.c:2134 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "не вдалоÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ відкрити файл \"%s\" Ñк stderr: %m" -#: utils/error/elog.c:1956 +#: utils/error/elog.c:2147 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "не вдалоÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ відкрити файл \"%s\" Ñк stdout: %m" -#: utils/error/elog.c:2521 utils/error/elog.c:2548 utils/error/elog.c:2564 +#: utils/error/elog.c:2183 +#, c-format +msgid "Invalid character" +msgstr "ÐеприпуÑтимий Ñимвол" + +#: utils/error/elog.c:2889 utils/error/elog.c:2916 utils/error/elog.c:2932 msgid "[unknown]" msgstr "[unknown]" -#: utils/error/elog.c:2837 utils/error/elog.c:3158 utils/error/elog.c:3265 +#: utils/error/elog.c:3202 utils/error/elog.c:3526 utils/error/elog.c:3633 msgid "missing error text" msgstr "пропущено текÑÑ‚ помилки" -#: utils/error/elog.c:2840 utils/error/elog.c:2843 +#: utils/error/elog.c:3205 utils/error/elog.c:3208 #, c-format msgid " at character %d" msgstr " Ñимвол %d" -#: utils/error/elog.c:2853 utils/error/elog.c:2860 +#: utils/error/elog.c:3218 utils/error/elog.c:3225 msgid "DETAIL: " msgstr "ВІДОМОСТІ: " -#: utils/error/elog.c:2867 +#: utils/error/elog.c:3232 msgid "HINT: " msgstr "УКÐЗІВКÐ: " -#: utils/error/elog.c:2874 +#: utils/error/elog.c:3239 msgid "QUERY: " msgstr "ЗÐПИТ: " -#: utils/error/elog.c:2881 +#: utils/error/elog.c:3246 msgid "CONTEXT: " msgstr "КОÐТЕКСТ: " -#: utils/error/elog.c:2891 +#: utils/error/elog.c:3256 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "РОЗТÐШУВÐÐÐЯ: %s, %s:%d\n" -#: utils/error/elog.c:2898 +#: utils/error/elog.c:3263 #, c-format msgid "LOCATION: %s:%d\n" msgstr "РОЗТÐШУВÐÐÐЯ: %s:%d\n" -#: utils/error/elog.c:2905 +#: utils/error/elog.c:3270 msgid "BACKTRACE: " msgstr "ВІДСТЕЖУВÐТИ: " -#: utils/error/elog.c:2917 +#: utils/error/elog.c:3282 msgid "STATEMENT: " msgstr "ІÐСТРУКЦІЯ: " -#: utils/error/elog.c:3310 +#: utils/error/elog.c:3678 msgid "DEBUG" msgstr "ÐÐЛÐГОДЖЕÐÐЯ" -#: utils/error/elog.c:3314 +#: utils/error/elog.c:3682 msgid "LOG" msgstr "ЗÐПИСУВÐÐÐЯ" -#: utils/error/elog.c:3317 +#: utils/error/elog.c:3685 msgid "INFO" msgstr "ІÐФОРМÐЦІЯ" -#: utils/error/elog.c:3320 +#: utils/error/elog.c:3688 msgid "NOTICE" msgstr "ПОВІДОМЛЕÐÐЯ" -#: utils/error/elog.c:3324 +#: utils/error/elog.c:3692 msgid "WARNING" msgstr "ПОПЕРЕДЖЕÐÐЯ" -#: utils/error/elog.c:3327 +#: utils/error/elog.c:3695 msgid "ERROR" msgstr "ПОМИЛКÐ" -#: utils/error/elog.c:3330 +#: utils/error/elog.c:3698 msgid "FATAL" msgstr "ФÐТÐЛЬÐО" -#: utils/error/elog.c:3333 +#: utils/error/elog.c:3701 msgid "PANIC" msgstr "ПÐÐІКÐ" @@ -26006,2689 +27417,2815 @@ msgstr "Магічний блок має неочікувану довжину msgid "incompatible library \"%s\": magic block mismatch" msgstr "неÑуміÑна бібліотка \"%s\": невідповідніÑть магічного блоку" -#: utils/fmgr/dfmgr.c:492 +#: utils/fmgr/dfmgr.c:475 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "доÑтуп до бібліотеки \"%s\" не дозволений" -#: utils/fmgr/dfmgr.c:518 +#: utils/fmgr/dfmgr.c:501 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "неприпуÑтиме ім'Ñ Ð¼Ð°ÐºÑ€Ð¾Ñу в шлÑху динамічної бібліотеки: %s" -#: utils/fmgr/dfmgr.c:558 +#: utils/fmgr/dfmgr.c:541 #, c-format msgid "zero-length component in parameter \"dynamic_library_path\"" msgstr "параметр \"dynamic_library_path\" міÑтить компонент нульової довжини" -#: utils/fmgr/dfmgr.c:577 +#: utils/fmgr/dfmgr.c:560 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "параметр \"dynamic_library_path\" міÑтить компонент, Ñкий не Ñ” абÑолютним шлÑхом" -#: utils/fmgr/fmgr.c:238 +#: utils/fmgr/fmgr.c:236 #, c-format msgid "internal function \"%s\" is not in internal lookup table" msgstr "внутрішньої функції \"%s\" немає у внутрішній таблиці підÑтановки" -#: utils/fmgr/fmgr.c:484 +#: utils/fmgr/fmgr.c:470 #, c-format msgid "could not find function information for function \"%s\"" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ інформацію про функцію \"%s\"" -#: utils/fmgr/fmgr.c:486 +#: utils/fmgr/fmgr.c:472 #, c-format msgid "SQL-callable functions need an accompanying PG_FUNCTION_INFO_V1(funcname)." msgstr "Функції, Ñкі викликаютьÑÑ Ð· SQL, потребують додаткове Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ PG_FUNCTION_INFO_V1(ім'Ñ_функції)." -#: utils/fmgr/fmgr.c:504 +#: utils/fmgr/fmgr.c:490 #, c-format msgid "unrecognized API version %d reported by info function \"%s\"" msgstr "нерозпізнана верÑÑ–Ñ API %d, повідомлена інформаційною функцією \"%s\"" -#: utils/fmgr/fmgr.c:1985 +#: utils/fmgr/fmgr.c:2109 #, c-format msgid "operator class options info is absent in function call context" msgstr "в контекÑті виклику функції відÑÑƒÑ‚Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ ÑтоÑовно параметрів клаÑів операторів" -#: utils/fmgr/fmgr.c:2052 +#: utils/fmgr/fmgr.c:2176 #, c-format msgid "language validation function %u called for language %u instead of %u" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¼Ð¾Ð²Ð½Ð¾Ñ— перевірки %u викликана Ð´Ð»Ñ Ð¼Ð¾Ð²Ð¸ %u заміÑть %u" -#: utils/fmgr/funcapi.c:455 +#: utils/fmgr/funcapi.c:496 #, c-format msgid "could not determine actual result type for function \"%s\" declared to return type %s" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ фактичний тип результату Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— \"%s\" оголошеної Ñк, та, котра повертає тип %s" -#: utils/fmgr/funcapi.c:600 +#: utils/fmgr/funcapi.c:642 #, c-format msgid "argument declared %s does not contain a range type but type %s" msgstr "оголошений аргумент %s не міÑтить тип діапазону, а тип %s" -#: utils/fmgr/funcapi.c:683 -#, c-format -msgid "could not find multirange type for data type %s" -msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ багатодіапазонний тип Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ даних %s" - -#: utils/fmgr/funcapi.c:1900 utils/fmgr/funcapi.c:1932 +#: utils/fmgr/funcapi.c:1929 utils/fmgr/funcapi.c:1961 #, c-format msgid "number of aliases does not match number of columns" msgstr "кількіÑть пÑевдонімів не відповідає кількоÑті Ñтовпців" -#: utils/fmgr/funcapi.c:1926 +#: utils/fmgr/funcapi.c:1955 #, c-format msgid "no column alias was provided" msgstr "жодного пÑевдоніму Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð½Ðµ було надано" -#: utils/fmgr/funcapi.c:1950 +#: utils/fmgr/funcapi.c:1979 #, c-format msgid "could not determine row description for function returning record" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ Ð¾Ð¿Ð¸Ñ Ñ€Ñдка Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—, що повертає запиÑ" -#: utils/init/miscinit.c:329 +#: utils/init/miscinit.c:353 #, c-format msgid "data directory \"%s\" does not exist" msgstr "каталог даних \"%s\" не Ñ–Ñнує" -#: utils/init/miscinit.c:334 +#: utils/init/miscinit.c:358 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ дозволи на каталог \"%s\": %m" -#: utils/init/miscinit.c:342 +#: utils/init/miscinit.c:366 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "вказаний каталог даних \"%s\" не Ñ” каталогом" -#: utils/init/miscinit.c:358 +#: utils/init/miscinit.c:382 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "влаÑник каталогу даних \"%s\" визначений неправильно" -#: utils/init/miscinit.c:360 +#: utils/init/miscinit.c:384 #, c-format msgid "The server must be started by the user that owns the data directory." msgstr "Сервер повинен запуÑкати кориÑтувач, Ñкий володіє каталогом даних." -#: utils/init/miscinit.c:378 +#: utils/init/miscinit.c:402 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "каталог даних \"%s\" має неприпуÑтимі дозволи" -#: utils/init/miscinit.c:380 +#: utils/init/miscinit.c:404 #, c-format msgid "Permissions should be u=rwx (0700) or u=rwx,g=rx (0750)." msgstr "Дозволи повинні бути u=rwx (0700) або u=rwx,g=rx (0750)." -#: utils/init/miscinit.c:665 utils/misc/guc.c:7840 +#: utils/init/miscinit.c:462 +#, c-format +msgid "could not change directory to \"%s\": %m" +msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ каталог на \"%s\": %m" + +#: utils/init/miscinit.c:720 utils/misc/guc.c:3650 #, c-format msgid "cannot set parameter \"%s\" within security-restricted operation" msgstr "вÑтановити параметр \"%s\" в межах операції з обмеженнÑми по безпеці, не можна" -#: utils/init/miscinit.c:733 +#: utils/init/miscinit.c:807 #, c-format msgid "role with OID %u does not exist" msgstr "роль з OID %u не Ñ–Ñнує" -#: utils/init/miscinit.c:763 +#: utils/init/miscinit.c:853 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ– \"%s\" вхід не дозволений" -#: utils/init/miscinit.c:781 +#: utils/init/miscinit.c:874 #, c-format msgid "too many connections for role \"%s\"" msgstr "занадто багато підключень Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ– \"%s\"" -#: utils/init/miscinit.c:841 -#, c-format -msgid "permission denied to set session authorization" -msgstr "немає прав Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ— в ÑеанÑÑ–" - -#: utils/init/miscinit.c:924 +#: utils/init/miscinit.c:1045 #, c-format msgid "invalid role OID: %u" msgstr "неприпуÑтимий OID ролі: %u" -#: utils/init/miscinit.c:978 +#: utils/init/miscinit.c:1192 #, c-format msgid "database system is shut down" msgstr "ÑиÑтема бази даних вимкнена" -#: utils/init/miscinit.c:1065 +#: utils/init/miscinit.c:1279 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "не вдалоÑÑ Ñтворити файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\": %m" -#: utils/init/miscinit.c:1079 +#: utils/init/miscinit.c:1293 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\": %m" -#: utils/init/miscinit.c:1086 +#: utils/init/miscinit.c:1300 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\": %m" -#: utils/init/miscinit.c:1095 +#: utils/init/miscinit.c:1309 #, c-format msgid "lock file \"%s\" is empty" msgstr "файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" пуÑтий" -#: utils/init/miscinit.c:1096 +#: utils/init/miscinit.c:1310 #, c-format msgid "Either another server is starting, or the lock file is the remnant of a previous server startup crash." msgstr "Ðбо зараз запуÑкаєтьÑÑ Ñ–Ð½ÑˆÐ¸Ð¹ Ñервер, або цей файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð»Ð¸ÑˆÐ¸Ð²ÑÑ Ð² результаті збою під Ñ‡Ð°Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ запуÑку." -#: utils/init/miscinit.c:1140 +#: utils/init/miscinit.c:1354 #, c-format msgid "lock file \"%s\" already exists" msgstr "файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" вже Ñ–Ñнує" -#: utils/init/miscinit.c:1144 +#: utils/init/miscinit.c:1358 #, c-format msgid "Is another postgres (PID %d) running in data directory \"%s\"?" msgstr "Інший postgres (PID %d) працює з каталогом даних \"%s\"?" -#: utils/init/miscinit.c:1146 +#: utils/init/miscinit.c:1360 #, c-format msgid "Is another postmaster (PID %d) running in data directory \"%s\"?" msgstr "Інший postmaster (PID %d) працює з каталогом даних \"%s\"?" -#: utils/init/miscinit.c:1149 +#: utils/init/miscinit.c:1363 #, c-format msgid "Is another postgres (PID %d) using socket file \"%s\"?" msgstr "Інший postgres (PID %d) викориÑтовує файл Ñокету \"%s\"?" -#: utils/init/miscinit.c:1151 +#: utils/init/miscinit.c:1365 #, c-format msgid "Is another postmaster (PID %d) using socket file \"%s\"?" msgstr "Інший postmaster (PID %d) викориÑтовує файл Ñокету \"%s\"?" -#: utils/init/miscinit.c:1202 +#: utils/init/miscinit.c:1416 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñтарий файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\": %m" -#: utils/init/miscinit.c:1204 +#: utils/init/miscinit.c:1418 #, c-format msgid "The file seems accidentally left over, but it could not be removed. Please remove the file by hand and try again." msgstr "ЗдаєтьÑÑ, файл залишивÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¾Ð²Ð¾, але видалити його не вийшло. Будь-лаÑка, видаліть файл вручну або Ñпробуйте знову." -#: utils/init/miscinit.c:1241 utils/init/miscinit.c:1255 -#: utils/init/miscinit.c:1266 +#: utils/init/miscinit.c:1455 utils/init/miscinit.c:1469 +#: utils/init/miscinit.c:1480 #, c-format msgid "could not write lock file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\": %m" -#: utils/init/miscinit.c:1377 utils/init/miscinit.c:1519 utils/misc/guc.c:10837 +#: utils/init/miscinit.c:1591 utils/init/miscinit.c:1733 utils/misc/guc.c:5765 #, c-format msgid "could not read from file \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу \"%s\": %m" -#: utils/init/miscinit.c:1507 +#: utils/init/miscinit.c:1721 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %m; вÑе одно продовжуєтьÑÑ" -#: utils/init/miscinit.c:1532 +#: utils/init/miscinit.c:1746 #, c-format msgid "lock file \"%s\" contains wrong PID: %ld instead of %ld" msgstr "файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" міÑтить неправильний PID: %ld заміÑть %ld" -#: utils/init/miscinit.c:1571 utils/init/miscinit.c:1587 +#: utils/init/miscinit.c:1785 utils/init/miscinit.c:1801 #, c-format msgid "\"%s\" is not a valid data directory" msgstr "\"%s\" не Ñ” припуÑтимим каталогом даних" -#: utils/init/miscinit.c:1573 +#: utils/init/miscinit.c:1787 #, c-format msgid "File \"%s\" is missing." msgstr "Файл \"%s\" пропущено." -#: utils/init/miscinit.c:1589 +#: utils/init/miscinit.c:1803 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Файл \"%s\" не міÑтить припуÑтимих даних." -#: utils/init/miscinit.c:1591 +#: utils/init/miscinit.c:1805 #, c-format msgid "You might need to initdb." msgstr "Можливо, вам Ñлід виконати initdb." -#: utils/init/miscinit.c:1599 +#: utils/init/miscinit.c:1813 #, c-format msgid "The data directory was initialized by PostgreSQL version %s, which is not compatible with this version %s." msgstr "Каталог даних ініціалізований Ñервером PostgreSQL верÑÑ–Ñ— %s, не ÑуміÑною з цією верÑією %s." -#: utils/init/postinit.c:258 +#: utils/init/postinit.c:259 #, c-format msgid "replication connection authorized: user=%s" msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— авторизовано: кориÑтувач=%s" -#: utils/init/postinit.c:261 +#: utils/init/postinit.c:262 #, c-format msgid "connection authorized: user=%s" msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð¾Ð²Ð°Ð½Ð¾: кориÑтувач=%s" -#: utils/init/postinit.c:264 +#: utils/init/postinit.c:265 #, c-format msgid " database=%s" msgstr " database=%s" -#: utils/init/postinit.c:267 +#: utils/init/postinit.c:268 #, c-format msgid " application_name=%s" msgstr " application_name=%s" -#: utils/init/postinit.c:272 +#: utils/init/postinit.c:273 #, c-format msgid " SSL enabled (protocol=%s, cipher=%s, bits=%d)" msgstr " SSL активовано (протокол=%s, шифр=%s, біти=%d)" -#: utils/init/postinit.c:284 +#: utils/init/postinit.c:285 #, c-format -msgid " GSS (authenticated=%s, encrypted=%s, principal=%s)" -msgstr " GSS (автентифіковано=%s, закодовано=%s, ведучій=%s)" +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s, principal=%s)" +msgstr " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s, principal=%s)" -#: utils/init/postinit.c:285 utils/init/postinit.c:286 -#: utils/init/postinit.c:291 utils/init/postinit.c:292 +#: utils/init/postinit.c:286 utils/init/postinit.c:287 +#: utils/init/postinit.c:288 utils/init/postinit.c:293 +#: utils/init/postinit.c:294 utils/init/postinit.c:295 msgid "no" msgstr "ні" -#: utils/init/postinit.c:285 utils/init/postinit.c:286 -#: utils/init/postinit.c:291 utils/init/postinit.c:292 +#: utils/init/postinit.c:286 utils/init/postinit.c:287 +#: utils/init/postinit.c:288 utils/init/postinit.c:293 +#: utils/init/postinit.c:294 utils/init/postinit.c:295 msgid "yes" msgstr "так" -#: utils/init/postinit.c:290 +#: utils/init/postinit.c:292 #, c-format -msgid " GSS (authenticated=%s, encrypted=%s)" -msgstr " GSS (автентифіковано=%s, закодовано=%s)" +msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)" +msgstr " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)" -#: utils/init/postinit.c:330 +#: utils/init/postinit.c:333 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "база даних \"%s\" зникла з pg_database" -#: utils/init/postinit.c:332 +#: utils/init/postinit.c:335 #, c-format msgid "Database OID %u now seems to belong to \"%s\"." msgstr "ЗдаєтьÑÑ, база даних з OID %u тепер належить \"%s\"." -#: utils/init/postinit.c:352 +#: utils/init/postinit.c:355 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "база даних \"%s\" не приймає Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð² даний момент" -#: utils/init/postinit.c:365 +#: utils/init/postinit.c:368 #, c-format msgid "permission denied for database \"%s\"" msgstr "доÑтуп до бази даних \"%s\" відхилений" -#: utils/init/postinit.c:366 +#: utils/init/postinit.c:369 #, c-format msgid "User does not have CONNECT privilege." msgstr "КориÑтувач не має права CONNECT." -#: utils/init/postinit.c:383 +#: utils/init/postinit.c:389 #, c-format msgid "too many connections for database \"%s\"" msgstr "занадто багато підключень до бази даних \"%s\"" -#: utils/init/postinit.c:409 utils/init/postinit.c:416 +#: utils/init/postinit.c:413 utils/init/postinit.c:420 #, c-format msgid "database locale is incompatible with operating system" msgstr "Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð±Ð°Ð·Ð¸ даних неÑуміÑна з операційною ÑиÑтемою" -#: utils/init/postinit.c:410 +#: utils/init/postinit.c:414 #, c-format msgid "The database was initialized with LC_COLLATE \"%s\", which is not recognized by setlocale()." msgstr "База даних була ініціалізована з параметром LC_COLLATE \"%s\", але зараз setlocale() не розпізнає його." -#: utils/init/postinit.c:412 utils/init/postinit.c:419 +#: utils/init/postinit.c:416 utils/init/postinit.c:423 #, c-format msgid "Recreate the database with another locale or install the missing locale." msgstr "Повторно Ñтворіть базу даних з іншою локалізацією або вÑтановіть пропущену локалізацію." -#: utils/init/postinit.c:417 +#: utils/init/postinit.c:421 #, c-format msgid "The database was initialized with LC_CTYPE \"%s\", which is not recognized by setlocale()." msgstr "База даних була ініціалізована з параметром LC_CTYPE \"%s\", але зараз setlocale() не розпізнає його." -#: utils/init/postinit.c:457 -#, c-format -msgid "database \"%s\" has no actual collation version, but a version was recorded" -msgstr "Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних \"%s\", Ñка не має фактичної верÑÑ–Ñ— ÑортуваннÑ, була вказана верÑÑ–Ñ" - -#: utils/init/postinit.c:461 +#: utils/init/postinit.c:493 #, c-format msgid "database \"%s\" has a collation version mismatch" msgstr "база даних \"%s\" має невідповідніÑть верÑÑ–Ñ— параметрів ÑортуваннÑ" -#: utils/init/postinit.c:463 +#: utils/init/postinit.c:495 #, c-format msgid "The database was created using collation version %s, but the operating system provides version %s." msgstr "Базу даних було Ñтворено за допомогою параметрів ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñ— %s, але операційна ÑиÑтема надає верÑÑ–ÑŽ %s." -#: utils/init/postinit.c:466 +#: utils/init/postinit.c:498 #, c-format msgid "Rebuild all objects in this database that use the default collation and run ALTER DATABASE %s REFRESH COLLATION VERSION, or build PostgreSQL with the right library version." msgstr "Перебудуйте вÑÑ– об'єкти бази даних, Ñкі викориÑтовують Ñтандартний параметр ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ виконайте ALTER DATABASE %s REFRESH COLLATION VERSION, або побудуйте PostgreSQL з правильною верÑією бібліотеки." -#: utils/init/postinit.c:834 +#: utils/init/postinit.c:904 #, c-format msgid "no roles are defined in this database system" msgstr "в цій ÑиÑтемі баз даних не визначено жодної ролі" -#: utils/init/postinit.c:835 +#: utils/init/postinit.c:905 #, c-format msgid "You should immediately run CREATE USER \"%s\" SUPERUSER;." msgstr "Ви повинні негайно виконати CREATE USER \"%s\" SUPERUSER;." -#: utils/init/postinit.c:867 +#: utils/init/postinit.c:942 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "потрібно бути ÑуперкориÑтувачем, щоб підключитиÑÑŒ в режимі двійкового оновленнÑ" -#: utils/init/postinit.c:880 +#: utils/init/postinit.c:962 #, c-format -msgid "remaining connection slots are reserved for non-replication superuser connections" -msgstr "Ñлоти підключень, Ñкі залишилиÑÑŒ, зарезервовані Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½ÑŒ ÑуперкориÑтувача (не Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—)" +msgid "remaining connection slots are reserved for roles with the %s attribute" +msgstr "Ñлоти підключеннÑ, що залишилиÑÑ, зарезервовані Ð´Ð»Ñ Ñ€Ð¾Ð»ÐµÐ¹ з атрибутом %s" -#: utils/init/postinit.c:890 +#: utils/init/postinit.c:968 #, c-format -msgid "must be superuser or replication role to start walsender" -msgstr "Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку процеÑу walsender потребуєтьÑÑ Ñ€Ð¾Ð»ÑŒ реплікації або бути ÑуперкориÑтувачем" +msgid "remaining connection slots are reserved for roles with privileges of the \"%s\" role" +msgstr "Ñлоти підключеннÑ, що залишилиÑÑ, зарезервовані Ð´Ð»Ñ Ñ€Ð¾Ð»ÐµÐ¹ з привілеÑми ролі \"%s\"" -#: utils/init/postinit.c:959 +#: utils/init/postinit.c:980 #, c-format -msgid "database %u does not exist" -msgstr "база даних %u не Ñ–Ñнує" +msgid "permission denied to start WAL sender" +msgstr "немає дозволу Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑку відправника WAL" + +#: utils/init/postinit.c:981 +#, c-format +msgid "Only roles with the %s attribute may start a WAL sender process." +msgstr "Тільки ролі з атрибутом %s можуть почати Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²ÐºÐ¸ WAL." -#: utils/init/postinit.c:1048 +#: utils/init/postinit.c:1099 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Схоже, вона щойно була видалена або перейменована." -#: utils/init/postinit.c:1066 +#: utils/init/postinit.c:1103 +#, c-format +msgid "database %u does not exist" +msgstr "база даних %u не Ñ–Ñнує" + +#: utils/init/postinit.c:1112 +#, c-format +msgid "cannot connect to invalid database \"%s\"" +msgstr "неможливо під'єднатиÑÑ Ð´Ð¾ невірної бази даних \"%s\"" + +#: utils/init/postinit.c:1173 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Підкаталог бази даних \"%s\" пропущений." -#: utils/mb/conv.c:522 utils/mb/conv.c:733 +#: utils/init/usercontext.c:43 +#, c-format +msgid "role \"%s\" cannot SET ROLE to \"%s\"" +msgstr "роль \"%s\" не може виконати SET ROLE Ð´Ð»Ñ \"%s\"" + +#: utils/mb/conv.c:522 utils/mb/conv.c:733 +#, c-format +msgid "invalid encoding number: %d" +msgstr "неприпуÑтимий номер кодуваннÑ: %d" + +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:129 +#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:165 +#, c-format +msgid "unexpected encoding ID %d for ISO 8859 character sets" +msgstr "неочікуваний ідентифікатор ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ %d Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ñ–Ð² Ñимволів ISO 8859" + +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:110 +#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:146 +#, c-format +msgid "unexpected encoding ID %d for WIN character sets" +msgstr "неочікуваний ідентифікатор ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ %d Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ñ–Ð² Ñимволів WIN" + +#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:900 +#, c-format +msgid "conversion between %s and %s is not supported" +msgstr "Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¼Ñ–Ð¶ %s Ñ– %s не підтримуєтьÑÑ" + +#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 +#: utils/mb/mbutils.c:842 +#, c-format +msgid "String of %d bytes is too long for encoding conversion." +msgstr "РÑдок з %d байт занадто довгиÐ¹ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ." + +#: utils/mb/mbutils.c:568 +#, c-format +msgid "invalid source encoding name \"%s\"" +msgstr "неприпуÑтиме Ñ–Ð¼â€™Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¾Ð³Ð¾ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"" + +#: utils/mb/mbutils.c:573 +#, c-format +msgid "invalid destination encoding name \"%s\"" +msgstr "неприпуÑтиме Ñ–Ð¼â€™Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñƒ \"%s\"" + +#: utils/mb/mbutils.c:713 +#, c-format +msgid "invalid byte value for encoding \"%s\": 0x%02x" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð±Ð°Ð¹Ñ‚Ñƒ Ð´Ð»Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\": 0x%02x" + +#: utils/mb/mbutils.c:877 +#, c-format +msgid "invalid Unicode code point" +msgstr "неприпуÑтима кодова точка Unicode" + +#: utils/mb/mbutils.c:1201 +#, c-format +msgid "bind_textdomain_codeset failed" +msgstr "помилка в bind_textdomain_codeset" + +#: utils/mb/mbutils.c:1718 +#, c-format +msgid "invalid byte sequence for encoding \"%s\": %s" +msgstr "неприпуÑтима поÑлідовніÑть байтів Ð´Ð»Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\": %s" + +#: utils/mb/mbutils.c:1751 +#, c-format +msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" +msgstr "Ñимвол з поÑлідовніÑтю байтів %s в кодуванні \"%s\" не має еквіваленту в кодуванні \"%s\"" + +#: utils/misc/conffiles.c:88 +#, c-format +msgid "empty configuration directory name: \"%s\"" +msgstr "пуÑта назва каталогу конфігурації: \"%s\"" + +#: utils/misc/conffiles.c:100 +#, c-format +msgid "could not open configuration directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог конфігурації \"%s\": %m" + +#: utils/misc/guc.c:122 +msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." +msgstr "ПрипуÑтимі одиниці Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ параметру: \"B\", \"kB\", \"MB\", \"GB\", Ñ– \"TB\"." + +#: utils/misc/guc.c:159 +msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." +msgstr "ПрипуÑтимі одиниці Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ параметру: \"us\", \"ms\", \"s\", \"min\", \"h\", Ñ– \"d\"." + +#: utils/misc/guc.c:430 +#, c-format +msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" +msgstr "нерозпізнаний параметр конфігурації \"%s\" у файлі \"%s\" Ñ€Ñдок %d" + +#: utils/misc/guc.c:470 utils/misc/guc.c:3504 utils/misc/guc.c:3748 +#: utils/misc/guc.c:3846 utils/misc/guc.c:3944 utils/misc/guc.c:4071 +#: utils/misc/guc.c:4212 +#, c-format +msgid "parameter \"%s\" cannot be changed without restarting the server" +msgstr "параметр \"%s\" не може бути змінений, без Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñервера" + +#: utils/misc/guc.c:506 +#, c-format +msgid "parameter \"%s\" removed from configuration file, reset to default" +msgstr "параметр \"%s\" видалений з файла конфігурації, Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñкинуто до \"за замовчуваннÑм\"" + +#: utils/misc/guc.c:571 +#, c-format +msgid "parameter \"%s\" changed to \"%s\"" +msgstr "параметр \"%s\" змінено на \"%s\"" + +#: utils/misc/guc.c:613 +#, c-format +msgid "configuration file \"%s\" contains errors" +msgstr "файл конфігурації \"%s\" міÑтить помилки" + +#: utils/misc/guc.c:618 +#, c-format +msgid "configuration file \"%s\" contains errors; unaffected changes were applied" +msgstr "файл конфігурації \"%s\" міÑтить помилки; були заÑтоÑовані не залежні зміни" + +#: utils/misc/guc.c:623 +#, c-format +msgid "configuration file \"%s\" contains errors; no changes were applied" +msgstr "файл конфігурації \"%s\" міÑтить помилки; зміни не були заÑтоÑовані" + +#: utils/misc/guc.c:1139 utils/misc/guc.c:1155 +#, c-format +msgid "invalid configuration parameter name \"%s\"" +msgstr "неприпуÑтима назва параметра конфігурації \"%s\"" + +#: utils/misc/guc.c:1141 +#, c-format +msgid "Custom parameter names must be two or more simple identifiers separated by dots." +msgstr "ВлаÑні назви параметрів повинні міÑтити два або більше проÑтих ідентифікаторів, розділених крапками." + +#: utils/misc/guc.c:1157 +#, c-format +msgid "\"%s\" is a reserved prefix." +msgstr "\"%s\" Ñ” зарезервованим префікÑом." + +#: utils/misc/guc.c:1170 utils/misc/guc.c:1280 +#, c-format +msgid "unrecognized configuration parameter \"%s\"" +msgstr "нерозпізнаний параметр конфігурації \"%s\"" + +#: utils/misc/guc.c:1802 +#, c-format +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ доÑтуп до каталогу \"%s\": %m\n" + +#: utils/misc/guc.c:1806 +#, c-format +msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" +msgstr "ЗапуÑтіть initdb або pg_basebackup Ð´Ð»Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— каталогу даних PostgreSQL.\n" + +#: utils/misc/guc.c:1830 +#, c-format +msgid "%s does not know where to find the server configuration file.\n" +"You must specify the --config-file or -D invocation option or set the PGDATA environment variable.\n" +msgstr "%s не знає де знайти файл конфігурації Ñервера.\n" +"Ви повинні вказати його Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð² параметрі --config-file або -D, або вÑтановити змінну Ñередовища PGDATA.\n" + +#: utils/misc/guc.c:1853 +#, c-format +msgid "%s: could not access the server configuration file \"%s\": %m\n" +msgstr "%s: не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ доÑтуп до файлу конфігурації Ñервера \"%s\": %m\n" + +#: utils/misc/guc.c:1881 +#, c-format +msgid "%s does not know where to find the database system data.\n" +"This can be specified as \"data_directory\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "%s не знає де знайти дані ÑиÑтеми бази даних.\n" +"Їх Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути вказано Ñк \"data_directory\" в \"%s\", або передано в параметрі -D, або вÑтановлено змінну Ñередовища PGDATA.\n" + +#: utils/misc/guc.c:1933 +#, c-format +msgid "%s does not know where to find the \"hba\" configuration file.\n" +"This can be specified as \"hba_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "%s не знає де знайти файл конфігурації \"hba\".\n" +"Його Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути вказано Ñк \"hba_file\" в \"%s\", або передано в параметрі -D, або вÑтановлено змінну Ñередовища PGDATA.\n" + +#: utils/misc/guc.c:1964 +#, c-format +msgid "%s does not know where to find the \"ident\" configuration file.\n" +"This can be specified as \"ident_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" +msgstr "%s не знає де знайти файл конфігурації \"ident\".\n" +"Його Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути вказано Ñк \"ident_file\" в \"%s\", або передано в параметрі -D, або вÑтановлено змінну Ñередовища PGDATA.\n" + +#: utils/misc/guc.c:2943 +msgid "Value exceeds integer range." +msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÑƒÑ” діапазон цілих чиÑел." + +#: utils/misc/guc.c:3185 +#, c-format +msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d%s%s .. %d%s%s)" +msgstr "%d%s%s поза припуÑтимим діапазоном Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\" (%d%s%s .. %d%s%s)" + +#: utils/misc/guc.c:3226 +#, c-format +msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g%s%s .. %g%s%s)" +msgstr "%g%s%s поза припуÑтимим діапазоном Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\" (%g%s%s .. %g%s%s)" + +#: utils/misc/guc.c:3465 +#, c-format +msgid "parameter \"%s\" cannot be set during a parallel operation" +msgstr "параметр \"%s\" не можна вÑтановити під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¸Ñ… операцій" + +#: utils/misc/guc.c:3481 utils/misc/guc.c:4696 +#, c-format +msgid "parameter \"%s\" cannot be changed" +msgstr "параметр \"%s\" не може бути змінений" + +#: utils/misc/guc.c:3514 +#, c-format +msgid "parameter \"%s\" cannot be changed now" +msgstr "параметр \"%s\" не може бути змінений зараз" + +#: utils/misc/guc.c:3541 utils/misc/guc.c:3603 utils/misc/guc.c:4671 +#: utils/misc/guc.c:6756 +#, c-format +msgid "permission denied to set parameter \"%s\"" +msgstr "немає прав Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\"" + +#: utils/misc/guc.c:3583 +#, c-format +msgid "parameter \"%s\" cannot be set after connection start" +msgstr "параметр \"%s\" не можна вÑтановити піÑÐ»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ" + +#: utils/misc/guc.c:3642 +#, c-format +msgid "cannot set parameter \"%s\" within security-definer function" +msgstr "параметр \"%s\" не можна вÑтановити в межах функції безпеки" + +#: utils/misc/guc.c:3663 +#, c-format +msgid "parameter \"%s\" cannot be reset" +msgstr "параметр \"%s\" не можна Ñкинути" + +#: utils/misc/guc.c:3670 +#, c-format +msgid "parameter \"%s\" cannot be set locally in functions" +msgstr "параметр \"%s\" не може бути вÑтановлений локально в функціÑÑ…" + +#: utils/misc/guc.c:4370 utils/misc/guc.c:4418 utils/misc/guc.c:5450 +#, c-format +msgid "permission denied to examine \"%s\"" +msgstr "немає дозволу Ð´Ð»Ñ Ð²Ð¸Ð²Ñ‡ÐµÐ½Ð½Ñ \"%s\"" + +#: utils/misc/guc.c:4371 utils/misc/guc.c:4419 utils/misc/guc.c:5451 +#, c-format +msgid "Only roles with privileges of the \"%s\" role may examine this parameter." +msgstr "Тільки ролі з привілеÑми ролі \"%s\" можуть перевірÑти цей параметр." + +#: utils/misc/guc.c:4629 +#, c-format +msgid "ALTER SYSTEM is not allowed in this environment" +msgstr "ALTER SYSTEM не допуÑкаєтьÑÑ Ð² цьому Ñередовищі" + +#: utils/misc/guc.c:4661 +#, c-format +msgid "permission denied to perform ALTER SYSTEM RESET ALL" +msgstr "немає дозволу Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ALTER SYSTEM RESET ALL" + +#: utils/misc/guc.c:4740 #, c-format -msgid "invalid encoding number: %d" -msgstr "неприпуÑтимий номер кодуваннÑ: %d" +msgid "parameter value for ALTER SYSTEM must not contain a newline" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ Ð´Ð»Ñ ALTER SYSTEM не повинне міÑтити нового Ñ€Ñдка" -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:129 -#: utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c:165 +#: utils/misc/guc.c:4785 #, c-format -msgid "unexpected encoding ID %d for ISO 8859 character sets" -msgstr "неочікуваний ідентифікатор ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ %d Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ñ–Ð² Ñимволів ISO 8859" +msgid "could not parse contents of file \"%s\"" +msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ зміÑÑ‚ файла \"%s\"" -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:110 -#: utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c:146 +#: utils/misc/guc.c:4967 #, c-format -msgid "unexpected encoding ID %d for WIN character sets" -msgstr "неочікуваний ідентифікатор ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ %d Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ñ–Ð² Ñимволів WIN" +msgid "attempt to redefine parameter \"%s\"" +msgstr "Ñпроба перевизначити параметр \"%s\"" -#: utils/mb/mbutils.c:297 utils/mb/mbutils.c:900 +#: utils/misc/guc.c:5306 #, c-format -msgid "conversion between %s and %s is not supported" -msgstr "Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¼Ñ–Ð¶ %s Ñ– %s не підтримуєтьÑÑ" +msgid "invalid configuration parameter name \"%s\", removing it" +msgstr "неприпуÑтима назва параметра конфігурації \"%s\", видалÑємо" -#: utils/mb/mbutils.c:385 +#: utils/misc/guc.c:5308 #, c-format -msgid "default conversion function for encoding \"%s\" to \"%s\" does not exist" -msgstr "функції за замовчуваннÑм Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð· ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" в \"%s\" не Ñ–Ñнує" +msgid "\"%s\" is now a reserved prefix." +msgstr "\"%s\" тепер Ñ” зарезервованим префікÑом." -#: utils/mb/mbutils.c:402 utils/mb/mbutils.c:430 utils/mb/mbutils.c:815 -#: utils/mb/mbutils.c:842 +#: utils/misc/guc.c:6179 #, c-format -msgid "String of %d bytes is too long for encoding conversion." -msgstr "РÑдок з %d байт занадто довгий Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ." +msgid "while setting parameter \"%s\" to \"%s\"" +msgstr "під Ñ‡Ð°Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\" на \"%s\"" -#: utils/mb/mbutils.c:568 +#: utils/misc/guc.c:6348 #, c-format -msgid "invalid source encoding name \"%s\"" -msgstr "неприпуÑтиме Ñ–Ð¼â€™Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¾Ð³Ð¾ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"" +msgid "parameter \"%s\" could not be set" +msgstr "параметр \"%s\" не вдалоÑÑ Ð²Ñтановити" -#: utils/mb/mbutils.c:573 +#: utils/misc/guc.c:6438 #, c-format -msgid "invalid destination encoding name \"%s\"" -msgstr "неприпуÑтиме Ñ–Ð¼â€™Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñƒ \"%s\"" +msgid "could not parse setting for parameter \"%s\"" +msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\"" -#: utils/mb/mbutils.c:713 +#: utils/misc/guc.c:6888 #, c-format -msgid "invalid byte value for encoding \"%s\": 0x%02x" -msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð±Ð°Ð¹Ñ‚Ñƒ Ð´Ð»Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\": 0x%02x" +msgid "invalid value for parameter \"%s\": %g" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\": %g" -#: utils/mb/mbutils.c:877 +#: utils/misc/guc_funcs.c:54 #, c-format -msgid "invalid Unicode code point" -msgstr "неприпуÑтима кодова точка Unicode" +msgid "cannot set parameters during a parallel operation" +msgstr "вÑтановити параметри під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ñ— операції не можна" -#: utils/mb/mbutils.c:1146 +#: utils/misc/guc_funcs.c:130 #, c-format -msgid "bind_textdomain_codeset failed" -msgstr "помилка в bind_textdomain_codeset" +msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" +msgstr "SET LOCAL TRANSACTION SNAPSHOT не реалізовано" -#: utils/mb/mbutils.c:1667 +#: utils/misc/guc_funcs.c:218 #, c-format -msgid "invalid byte sequence for encoding \"%s\": %s" -msgstr "неприпуÑтима поÑлідовніÑть байтів Ð´Ð»Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\": %s" +msgid "SET %s takes only one argument" +msgstr "SET %s приймає лише один аргумент" -#: utils/mb/mbutils.c:1700 +#: utils/misc/guc_funcs.c:342 #, c-format -msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" -msgstr "Ñимвол з поÑлідовніÑтю байтів %s в кодуванні \"%s\" не має еквіваленту в кодуванні \"%s\"" +msgid "SET requires parameter name" +msgstr "SET потребує ім'Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°" -#: utils/misc/guc.c:776 +#: utils/misc/guc_tables.c:676 msgid "Ungrouped" msgstr "Розгруповано" -#: utils/misc/guc.c:778 +#: utils/misc/guc_tables.c:677 msgid "File Locations" msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð²" -#: utils/misc/guc.c:780 +#: utils/misc/guc_tables.c:678 msgid "Connections and Authentication / Connection Settings" msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ– Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ / Параметри підключень" -#: utils/misc/guc.c:782 +#: utils/misc/guc_tables.c:679 +msgid "Connections and Authentication / TCP Settings" +msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ– Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ / ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ TCP" + +#: utils/misc/guc_tables.c:680 msgid "Connections and Authentication / Authentication" msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ– Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ / ÐвтентифікаціÑ" -#: utils/misc/guc.c:784 +#: utils/misc/guc_tables.c:681 msgid "Connections and Authentication / SSL" msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ– Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ / SSL" -#: utils/misc/guc.c:786 +#: utils/misc/guc_tables.c:682 msgid "Resource Usage / Memory" msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñ€ÐµÑурÑу / Пам'Ñть" -#: utils/misc/guc.c:788 +#: utils/misc/guc_tables.c:683 msgid "Resource Usage / Disk" msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñ€ÐµÑурÑу / ДиÑк" -#: utils/misc/guc.c:790 +#: utils/misc/guc_tables.c:684 msgid "Resource Usage / Kernel Resources" msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñ€ÐµÑурÑу / РеÑурÑи Ñдра" -#: utils/misc/guc.c:792 +#: utils/misc/guc_tables.c:685 msgid "Resource Usage / Cost-Based Vacuum Delay" msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñ€ÐµÑурÑу / Затримка очиÑтки по вартоÑті" -#: utils/misc/guc.c:794 +#: utils/misc/guc_tables.c:686 msgid "Resource Usage / Background Writer" msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñ€ÐµÑурÑу / Фоновий запиÑ" -#: utils/misc/guc.c:796 +#: utils/misc/guc_tables.c:687 msgid "Resource Usage / Asynchronous Behavior" msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ñ€ÐµÑурÑу / ÐÑинхронна поведінка" -#: utils/misc/guc.c:798 +#: utils/misc/guc_tables.c:688 msgid "Write-Ahead Log / Settings" msgstr "Журнал WAL / Параметри" -#: utils/misc/guc.c:800 +#: utils/misc/guc_tables.c:689 msgid "Write-Ahead Log / Checkpoints" msgstr "Журнал WAL / Контрольні точки" -#: utils/misc/guc.c:802 +#: utils/misc/guc_tables.c:690 msgid "Write-Ahead Log / Archiving" msgstr "Журнал WAL / ÐрхіваціÑ" -#: utils/misc/guc.c:804 +#: utils/misc/guc_tables.c:691 msgid "Write-Ahead Log / Recovery" msgstr "Журнал WAL / ВідновленнÑ" -#: utils/misc/guc.c:806 +#: utils/misc/guc_tables.c:692 msgid "Write-Ahead Log / Archive Recovery" msgstr "Журнал WAL / Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ" -#: utils/misc/guc.c:808 +#: utils/misc/guc_tables.c:693 msgid "Write-Ahead Log / Recovery Target" msgstr "Журнал WAL / Мета відновленнÑ" -#: utils/misc/guc.c:810 +#: utils/misc/guc_tables.c:694 +msgid "Write-Ahead Log / Summarization" +msgstr "Журнал попереднього запиÑу / ПідÑумки" + +#: utils/misc/guc_tables.c:695 msgid "Replication / Sending Servers" msgstr "Ð ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ / ÐадÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñерверів" -#: utils/misc/guc.c:812 +#: utils/misc/guc_tables.c:696 msgid "Replication / Primary Server" msgstr "Ð ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ / ОÑновний Ñервер" -#: utils/misc/guc.c:814 +#: utils/misc/guc_tables.c:697 msgid "Replication / Standby Servers" msgstr "Ð ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ / Резервні Ñервера" -#: utils/misc/guc.c:816 +#: utils/misc/guc_tables.c:698 msgid "Replication / Subscribers" msgstr "Ð ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ / ПідпиÑники" -#: utils/misc/guc.c:818 +#: utils/misc/guc_tables.c:699 msgid "Query Tuning / Planner Method Configuration" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² / ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñ–Ð² планувальника" -#: utils/misc/guc.c:820 +#: utils/misc/guc_tables.c:700 msgid "Query Tuning / Planner Cost Constants" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² / КонÑтанти вартоÑті Ð´Ð»Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸ÐºÐ°" -#: utils/misc/guc.c:822 +#: utils/misc/guc_tables.c:701 msgid "Query Tuning / Genetic Query Optimizer" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² / Генетичний оптимізатор запитів" -#: utils/misc/guc.c:824 +#: utils/misc/guc_tables.c:702 msgid "Query Tuning / Other Planner Options" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð² / Інші параметри планувальника" -#: utils/misc/guc.c:826 +#: utils/misc/guc_tables.c:703 msgid "Reporting and Logging / Where to Log" msgstr "Звіти Ñ– Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ / Куди запиÑувати" -#: utils/misc/guc.c:828 +#: utils/misc/guc_tables.c:704 msgid "Reporting and Logging / When to Log" msgstr "Звіти Ñ– Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ / Коли запиÑувати" -#: utils/misc/guc.c:830 +#: utils/misc/guc_tables.c:705 msgid "Reporting and Logging / What to Log" msgstr "Звіти Ñ– Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ / Що запиÑувати" -#: utils/misc/guc.c:832 +#: utils/misc/guc_tables.c:706 msgid "Reporting and Logging / Process Title" msgstr "Ð—Ð²Ñ–Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ / Ðазва процеÑу" -#: utils/misc/guc.c:834 +#: utils/misc/guc_tables.c:707 msgid "Statistics / Monitoring" msgstr "СтатиÑтика / Моніторинг" -#: utils/misc/guc.c:836 +#: utils/misc/guc_tables.c:708 msgid "Statistics / Cumulative Query and Index Statistics" msgstr "СтатиÑтика / КумулÑтивна ÑтатиÑтика запитів та індекÑів" -#: utils/misc/guc.c:838 +#: utils/misc/guc_tables.c:709 msgid "Autovacuum" msgstr "ÐвтоочиÑтка" -#: utils/misc/guc.c:840 +#: utils/misc/guc_tables.c:710 msgid "Client Connection Defaults / Statement Behavior" msgstr "Параметри клієнтÑьких ÑеанÑів за замовчуваннÑм / Поведінка декларацій" -#: utils/misc/guc.c:842 +#: utils/misc/guc_tables.c:711 msgid "Client Connection Defaults / Locale and Formatting" msgstr "Параметри клієнтÑьких ÑеанÑів за замовчуваннÑм / Ð›Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ– форматуваннÑ" -#: utils/misc/guc.c:844 +#: utils/misc/guc_tables.c:712 msgid "Client Connection Defaults / Shared Library Preloading" msgstr "Параметри клієнтÑьких ÑеанÑів за замовчуваннÑм / Попереднє Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñпільних бібліотек" -#: utils/misc/guc.c:846 +#: utils/misc/guc_tables.c:713 msgid "Client Connection Defaults / Other Defaults" msgstr "Параметри клієнтÑьких ÑеанÑів за замовчуваннÑм / Інші параметри за замовчуваннÑм" -#: utils/misc/guc.c:848 +#: utils/misc/guc_tables.c:714 msgid "Lock Management" msgstr "ÐšÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñм" -#: utils/misc/guc.c:850 +#: utils/misc/guc_tables.c:715 msgid "Version and Platform Compatibility / Previous PostgreSQL Versions" msgstr "СуміÑніÑть верÑій Ñ– платформ / Попередні верÑÑ–Ñ— PostgreSQL" -#: utils/misc/guc.c:852 +#: utils/misc/guc_tables.c:716 msgid "Version and Platform Compatibility / Other Platforms and Clients" msgstr "СуміÑніÑть верÑій Ñ– платформ / Інші платформи Ñ– клієнти" -#: utils/misc/guc.c:854 +#: utils/misc/guc_tables.c:717 msgid "Error Handling" msgstr "Обробка помилок" -#: utils/misc/guc.c:856 +#: utils/misc/guc_tables.c:718 msgid "Preset Options" msgstr "Визначені параметри" -#: utils/misc/guc.c:858 +#: utils/misc/guc_tables.c:719 msgid "Customized Options" msgstr "ÐаÑтроєні параметри" -#: utils/misc/guc.c:860 +#: utils/misc/guc_tables.c:720 msgid "Developer Options" msgstr "Параметри Ð´Ð»Ñ Ñ€Ð¾Ð·Ñ€Ð¾Ð±Ð½Ð¸ÐºÑ–Ð²" -#: utils/misc/guc.c:918 -msgid "Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"." -msgstr "ПрипуÑтимі одиниці Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ параметру: \"B\", \"kB\", \"MB\", \"GB\", Ñ– \"TB\"." - -#: utils/misc/guc.c:955 -msgid "Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"." -msgstr "ПрипуÑтимі одиниці Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ параметру: \"us\", \"ms\", \"s\", \"min\", \"h\", Ñ– \"d\"." - -#: utils/misc/guc.c:1017 +#: utils/misc/guc_tables.c:775 msgid "Enables the planner's use of sequential-scan plans." msgstr "Дає змогу планувальнику викориÑтати плани поÑлідовного ÑкануваннÑ." -#: utils/misc/guc.c:1027 +#: utils/misc/guc_tables.c:785 msgid "Enables the planner's use of index-scan plans." msgstr "Дає змогу планувальнику викориÑтати плани ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ індекÑу." -#: utils/misc/guc.c:1037 +#: utils/misc/guc_tables.c:795 msgid "Enables the planner's use of index-only-scan plans." msgstr "Дає змогу планувальнику викориÑтати плани ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð»Ð¸ÑˆÐµ індекÑа." -#: utils/misc/guc.c:1047 +#: utils/misc/guc_tables.c:805 msgid "Enables the planner's use of bitmap-scan plans." msgstr "Дає змогу планувальнику викориÑтати плани ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ точковому риÑунку." -#: utils/misc/guc.c:1057 +#: utils/misc/guc_tables.c:815 msgid "Enables the planner's use of TID scan plans." msgstr "Дає змогу планувальнику викориÑтати плани ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ TID." -#: utils/misc/guc.c:1067 +#: utils/misc/guc_tables.c:825 msgid "Enables the planner's use of explicit sort steps." msgstr "Дає змогу планувальнику викориÑтати кроки з Ñвним ÑортуваннÑм." -#: utils/misc/guc.c:1077 +#: utils/misc/guc_tables.c:835 msgid "Enables the planner's use of incremental sort steps." msgstr "Дає змогу планувальнику викориÑтати кроки інкрементного ÑортуваннÑ." -#: utils/misc/guc.c:1087 +#: utils/misc/guc_tables.c:845 msgid "Enables the planner's use of hashed aggregation plans." msgstr "Дає змогу планувальнику викориÑтовувати плани агрегації по гешу." -#: utils/misc/guc.c:1097 +#: utils/misc/guc_tables.c:855 msgid "Enables the planner's use of materialization." msgstr "Дає змогу планувальнику викориÑтовувати матеріалізацію." -#: utils/misc/guc.c:1107 +#: utils/misc/guc_tables.c:865 msgid "Enables the planner's use of memoization." msgstr "Дає змогу планувальнику викориÑтовувати мемоїзацію." -#: utils/misc/guc.c:1117 +#: utils/misc/guc_tables.c:875 msgid "Enables the planner's use of nested-loop join plans." msgstr "Дає змогу планувальнику викориÑтовувати плани з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· вкладеними циклами." -#: utils/misc/guc.c:1127 +#: utils/misc/guc_tables.c:885 msgid "Enables the planner's use of merge join plans." msgstr "Дає змогу планувальнику викориÑтовувати плани з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¾Ð±'єднаннÑм." -#: utils/misc/guc.c:1137 +#: utils/misc/guc_tables.c:895 msgid "Enables the planner's use of hash join plans." msgstr "Дає змогу планувальнику викориÑтовувати плани з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ð¾ гешу." -#: utils/misc/guc.c:1147 +#: utils/misc/guc_tables.c:905 msgid "Enables the planner's use of gather merge plans." msgstr "Дає змогу планувальнику викориÑтовувати плани збору об'єднаннÑм." -#: utils/misc/guc.c:1157 +#: utils/misc/guc_tables.c:915 msgid "Enables partitionwise join." msgstr "Вмикає з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· урахуваннÑм ÑекціонуваннÑ." -#: utils/misc/guc.c:1167 +#: utils/misc/guc_tables.c:925 msgid "Enables partitionwise aggregation and grouping." msgstr "Вмикає агрегацію Ñ– Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð· урахуваннÑм ÑекціонуваннÑ." -#: utils/misc/guc.c:1177 +#: utils/misc/guc_tables.c:935 msgid "Enables the planner's use of parallel append plans." msgstr "Дає змогу планувальнику викориÑтовувати плани паралельного додаваннÑ." -#: utils/misc/guc.c:1187 +#: utils/misc/guc_tables.c:945 msgid "Enables the planner's use of parallel hash plans." msgstr "Дає змогу планувальнику викориÑтовувати плани паралельного з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ð¾ гешу." -#: utils/misc/guc.c:1197 +#: utils/misc/guc_tables.c:955 msgid "Enables plan-time and execution-time partition pruning." msgstr "Ðктивує Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ під Ñ‡Ð°Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– виконаннÑ." -#: utils/misc/guc.c:1198 +#: utils/misc/guc_tables.c:956 msgid "Allows the query planner and executor to compare partition bounds to conditions in the query to determine which partitions must be scanned." msgstr "ДозволÑÑ” планувальнику Ñ– виконавцю запитів порівнювати границі Ñекцій з умовами в запиті Ñ– визначати Ñкі Ñекції повинні бути відÑкановані." -#: utils/misc/guc.c:1209 +#: utils/misc/guc_tables.c:967 +msgid "Enables the planner's ability to produce plans that provide presorted input for ORDER BY / DISTINCT aggregate functions." +msgstr "ДозволÑÑ” планувальнику Ñтворювати плани з попередньо відÑортованими даними Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð¾Ð²Ð°Ð½Ð¸Ñ… функцій ORDER BY / DISTINCT." + +#: utils/misc/guc_tables.c:970 +msgid "Allows the query planner to build plans that provide presorted input for aggregate functions with an ORDER BY / DISTINCT clause. When disabled, implicit sorts are always performed during execution." +msgstr "ДозволÑÑ” планувальнику запитів Ñтворювати плани, Ñкі надають попередньо відÑортовані дані Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð¾Ð²Ð°Ð½Ð¸Ñ… функцій з реченнÑм ORDER BY / DISTINCT. Якщо цей параметр вимкнено, під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ завжди виконуєтьÑÑ Ð½ÐµÑвне ÑортуваннÑ." + +#: utils/misc/guc_tables.c:982 msgid "Enables the planner's use of async append plans." msgstr "Дає змогу планувальнику викориÑтовувати аÑинхронні плани додаваннÑ." -#: utils/misc/guc.c:1219 -msgid "enable reordering of GROUP BY key" -msgstr "дозволити перевпорÑÐ´ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð° GROUP BY" +#: utils/misc/guc_tables.c:992 +msgid "Enables reordering of GROUP BY keys." +msgstr "ДозволÑÑ” перевпорÑдкувати ключі GROUP BY." -#: utils/misc/guc.c:1229 +#: utils/misc/guc_tables.c:1002 msgid "Enables genetic query optimization." msgstr "Вмикає генетичну оптимізацію запитів." -#: utils/misc/guc.c:1230 +#: utils/misc/guc_tables.c:1003 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "Цей алгоритм намагаєтьÑÑ Ð¿Ð¾Ð±ÑƒÐ´ÑƒÐ²Ð°Ñ‚Ð¸ план без повного перебору." -#: utils/misc/guc.c:1241 +#: utils/misc/guc_tables.c:1017 msgid "Shows whether the current user is a superuser." msgstr "Показує, чи Ñ” поточний кориÑтувач ÑуперкориÑтувачем." -#: utils/misc/guc.c:1251 +#: utils/misc/guc_tables.c:1032 +msgid "Allows running the ALTER SYSTEM command." +msgstr "ДозволÑÑ” запуÑкати команду ALTER SYSTEM." + +#: utils/misc/guc_tables.c:1033 +msgid "Can be set to off for environments where global configuration changes should be made using a different method." +msgstr "Може бути вимкнене Ð´Ð»Ñ Ñередовищ, де Ñлід вноÑити зміни глобальних налаштувань за допомогою іншого методу." + +#: utils/misc/guc_tables.c:1043 msgid "Enables advertising the server via Bonjour." msgstr "Вмикає Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ Ñерверу через Bonjour." -#: utils/misc/guc.c:1260 +#: utils/misc/guc_tables.c:1052 msgid "Collects transaction commit time." msgstr "Збирає Ñ‡Ð°Ñ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ð¹." -#: utils/misc/guc.c:1269 +#: utils/misc/guc_tables.c:1061 msgid "Enables SSL connections." msgstr "Вмикає SSL-підключеннÑ." -#: utils/misc/guc.c:1278 -msgid "Controls whether ssl_passphrase_command is called during server reload." -msgstr "Визначає, чи викликаєтьÑÑ ssl_passphrase_command під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñервера." +#: utils/misc/guc_tables.c:1070 +msgid "Controls whether \"ssl_passphrase_command\" is called during server reload." +msgstr "Визначає, чи викликаєтьÑÑ \"ssl_passphrase_command\" під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñервера." -#: utils/misc/guc.c:1287 +#: utils/misc/guc_tables.c:1079 msgid "Give priority to server ciphersuite order." msgstr "Віддавати перевагу замовленню набору шрифтів Ñервера." -#: utils/misc/guc.c:1296 +#: utils/misc/guc_tables.c:1088 msgid "Forces synchronization of updates to disk." msgstr "ПримуÑова ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½ÑŒ на диÑк." -#: utils/misc/guc.c:1297 -msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This insures that a database cluster will recover to a consistent state after an operating system or hardware crash." -msgstr "Сервер буде викориÑтовувати ÑиÑтемний виклик fsync() в декількох міÑцÑÑ…, щоб впевнитиÑÑŒ, що Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ñ–Ð·Ð¸Ñ‡Ð½Ð¾ запиÑані на диÑк. Це дозволить привеÑти клаÑтер бази даних в узгоджений Ñтан піÑÐ»Ñ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ операційної ÑиÑтеми або апаратного забезпеченнÑ." +#: utils/misc/guc_tables.c:1089 +msgid "The server will use the fsync() system call in several places to make sure that updates are physically written to disk. This ensures that a database cluster will recover to a consistent state after an operating system or hardware crash." +msgstr "Сервер буде викориÑтовувати ÑиÑтемний виклик fsync() в декількох міÑцÑÑ…, щоб переконатиÑÑ, що Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ñ–Ð·Ð¸Ñ‡Ð½Ð¾ запиÑані на диÑк. Це гарантує, що клаÑтер баз даних відновитьÑÑ Ð´Ð¾ узгодженого Ñтану піÑÐ»Ñ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ операційної ÑиÑтеми чи апаратного збою." -#: utils/misc/guc.c:1308 +#: utils/misc/guc_tables.c:1100 msgid "Continues processing after a checksum failure." msgstr "Продовжує обробку піÑÐ»Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ контрольної Ñуми." -#: utils/misc/guc.c:1309 +#: utils/misc/guc_tables.c:1101 msgid "Detection of a checksum failure normally causes PostgreSQL to report an error, aborting the current transaction. Setting ignore_checksum_failure to true causes the system to ignore the failure (but still report a warning), and continue processing. This behavior could cause crashes or other serious problems. Only has an effect if checksums are enabled." msgstr "ВиÑвлÑючи помилку контрольної Ñуми, PostgreSQL звичайно повідомлÑÑ” про помилку Ñ– перериває поточну транзакцію. Ðле Ñкщо ignore_checksum_failure дорівнює true, ÑиÑтема пропуÑтить помилку (але видаÑть попередженнÑ) Ñ– продовжить обробку. Ð¦Ñ Ð¿Ð¾Ð²ÐµÐ´Ñ–Ð½ÐºÐ° може бути причиною аварійних завершень роботи або інших Ñерйозних проблем. Це має міÑце, лише Ñкщо ввімкнен контроль цілоÑноÑті Ñторінок." -#: utils/misc/guc.c:1323 +#: utils/misc/guc_tables.c:1115 msgid "Continues processing past damaged page headers." msgstr "Продовжує обробку при пошкоджені заголовків Ñторінок." -#: utils/misc/guc.c:1324 -msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting zero_damaged_pages to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." -msgstr "ВиÑвлÑючи пошкоджений заголовок Ñторінки, PostgreSQL звичайно повідомлÑÑ” про помилку, перериваючи поточну транзакцію. Ðле Ñкщо zero_damaged_pages дорівнює true ÑиÑтема видаÑть попередженнÑ, обнулить пошкоджену Ñторінку, Ñ– продовжить обробку. Ð¦Ñ Ð¿Ð¾Ð²ÐµÐ´Ñ–Ð½ÐºÐ° знищить дані, а Ñаме Ñ€Ñдків в пошкодженій Ñторінці." +#: utils/misc/guc_tables.c:1116 +msgid "Detection of a damaged page header normally causes PostgreSQL to report an error, aborting the current transaction. Setting \"zero_damaged_pages\" to true causes the system to instead report a warning, zero out the damaged page, and continue processing. This behavior will destroy data, namely all the rows on the damaged page." +msgstr "ВиÑвлÑючи пошкоджений заголовок Ñторінки, PostgreSQL звичайно повідомлÑÑ” про помилку, перериваючи поточну транзакцію. Ðле Ñкщо \"zero_damaged_pages\" дорівнює true ÑиÑтема видаÑть попередженнÑ, обнулить пошкоджену Ñторінку, Ñ– продовжить обробку. Ð¦Ñ Ð¿Ð¾Ð²ÐµÐ´Ñ–Ð½ÐºÐ° знищить дані, а Ñаме Ñ€Ñдків в пошкодженій Ñторінці." -#: utils/misc/guc.c:1337 +#: utils/misc/guc_tables.c:1129 msgid "Continues recovery after an invalid pages failure." msgstr "Продовжує Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ неприпуÑтимих Ñторінок." -#: utils/misc/guc.c:1338 -msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting ignore_invalid_pages to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." -msgstr "ВиÑÐ²Ð»ÐµÐ½Ð½Ñ WAL запиÑів, Ñкі мають поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° неприпуÑтимі Ñторінки під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ, змушує PostgreSQL піднÑти помилку на рівень PANIC, перериваючи відновленнÑ. Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ ignore_invalid_pages на true змуÑить ÑиÑтему ігнорувати неприпуÑтимі поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñторінки в WAL запиÑах (але вÑе ще буде повідомлÑти про попередженнÑ), Ñ– продовжити відновленнÑ. Ð¦Ñ Ð¿Ð¾Ð²ÐµÐ´Ñ–Ð½ÐºÐ° може викликати збої, втрату даних, розповÑÑŽÐ´Ð¶ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ Ð¿Ñ€Ð¸Ñ…Ð¾Ð²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½ÑŒ, або інші Ñерйозні проблеми. Діє лише під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ в режимі очікуваннÑ." +#: utils/misc/guc_tables.c:1130 +msgid "Detection of WAL records having references to invalid pages during recovery causes PostgreSQL to raise a PANIC-level error, aborting the recovery. Setting \"ignore_invalid_pages\" to true causes the system to ignore invalid page references in WAL records (but still report a warning), and continue recovery. This behavior may cause crashes, data loss, propagate or hide corruption, or other serious problems. Only has an effect during recovery or in standby mode." +msgstr "ВиÑÐ²Ð»ÐµÐ½Ð½Ñ WAL запиÑів, Ñкі мають поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° неприпуÑтимі Ñторінки під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ, змушує PostgreSQL піднÑти помилку на рівень PANIC, перериваючи відновленнÑ. Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"ignore_invalid_pages\" на true змуÑить ÑиÑтему ігнорувати неприпуÑтимі поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñторінки в WAL запиÑах (але вÑе ще буде повідомлÑти про попередженнÑ), Ñ– продовжити відновленнÑ. Ð¦Ñ Ð¿Ð¾Ð²ÐµÐ´Ñ–Ð½ÐºÐ° може викликати збої, втрату даних, розповÑÑŽÐ´Ð¶ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ Ð¿Ñ€Ð¸Ñ…Ð¾Ð²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½ÑŒ, або інші Ñерйозні проблеми. Діє лише під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ в режимі очікуваннÑ." -#: utils/misc/guc.c:1356 +#: utils/misc/guc_tables.c:1148 msgid "Writes full pages to WAL when first modified after a checkpoint." msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð¿Ð¾Ð²Ð½Ð¸Ñ… Ñторінок до WAL при першій зміні піÑÐ»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки." -#: utils/misc/guc.c:1357 +#: utils/misc/guc_tables.c:1149 msgid "A page write in process during an operating system crash might be only partially written to disk. During recovery, the row changes stored in WAL are not enough to recover. This option writes pages when first modified after a checkpoint to WAL so full recovery is possible." msgstr "Сторінка, запиÑувана під Ñ‡Ð°Ñ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ операційної ÑиÑтеми може бути запиÑаною на диÑк чаÑтково. Під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ, журналу змін Ñ€Ñдків в WAL буде недоÑтатньо Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ. Цей параметр запиÑує повні Ñторінки піÑÐ»Ñ Ð¿ÐµÑ€ÑˆÐ¾Ñ— зміни піÑÐ»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки, тож Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ðµ." -#: utils/misc/guc.c:1370 +#: utils/misc/guc_tables.c:1162 msgid "Writes full pages to WAL when first modified after a checkpoint, even for a non-critical modification." -msgstr "ЗапиÑує повні Ñторінки до WAL при першій зміні піÑÐ»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки, навіть при некритичних змінах." +msgstr "Ð—Ð°Ð¿Ð¸Ñ Ð¿Ð¾Ð²Ð½Ð¸Ñ… Ñторінок до WAL при першій зміні піÑÐ»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки, навіть при некритичних змінах." -#: utils/misc/guc.c:1380 +#: utils/misc/guc_tables.c:1172 msgid "Writes zeroes to new WAL files before first use." msgstr "Перед першим викориÑтаннÑм запиÑує нулі до нових файлів WAL." -#: utils/misc/guc.c:1390 +#: utils/misc/guc_tables.c:1182 msgid "Recycles WAL files by renaming them." msgstr "ПерезапиÑує файли WAL, перейменувавши Ñ—Ñ…." -#: utils/misc/guc.c:1400 +#: utils/misc/guc_tables.c:1192 msgid "Logs each checkpoint." msgstr "Журналювати кожну контрольну точку." -#: utils/misc/guc.c:1409 +#: utils/misc/guc_tables.c:1201 msgid "Logs each successful connection." msgstr "Журналювати кожне уÑпішне підключеннÑ." -#: utils/misc/guc.c:1418 +#: utils/misc/guc_tables.c:1210 +msgid "Logs details of pre-authentication connection handshake." +msgstr "Журналювати деталі рукоÑтиÑÐºÐ°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ автентифікацією." + +#: utils/misc/guc_tables.c:1220 msgid "Logs end of a session, including duration." msgstr "Журналювати кінець ÑеанÑу, зокрема триваліÑть." -#: utils/misc/guc.c:1427 +#: utils/misc/guc_tables.c:1229 msgid "Logs each replication command." msgstr "Журналювати кожну команду реплікації." -#: utils/misc/guc.c:1436 +#: utils/misc/guc_tables.c:1238 msgid "Shows whether the running server has assertion checks enabled." msgstr "Показує, чи активовані перевірки Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð½Ð° працюючому Ñервері." -#: utils/misc/guc.c:1451 +#: utils/misc/guc_tables.c:1249 msgid "Terminate session on any error." msgstr "ПрипинÑти ÑеанÑи при будь-Ñкій помилці." -#: utils/misc/guc.c:1460 +#: utils/misc/guc_tables.c:1258 msgid "Reinitialize server after backend crash." msgstr "Повторити ініціалізацію Ñервера, піÑÐ»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ аварійного Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸." -#: utils/misc/guc.c:1469 +#: utils/misc/guc_tables.c:1267 msgid "Remove temporary files after backend crash." msgstr "Видалити тимчаÑові файли піÑÐ»Ñ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ внутрішнього Ñервера." -#: utils/misc/guc.c:1480 +#: utils/misc/guc_tables.c:1277 +msgid "Send SIGABRT not SIGQUIT to child processes after backend crash." +msgstr "ÐадÑилати SIGABRT, а не SIGQUIT дочірнім процеÑам піÑÐ»Ñ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ бекенда." + +#: utils/misc/guc_tables.c:1287 +msgid "Send SIGABRT not SIGKILL to stuck child processes." +msgstr "ÐадÑилати SIGABRT, а не SIGKILL до дочірніх процеÑів, що заÑтрÑгли." + +#: utils/misc/guc_tables.c:1298 msgid "Logs the duration of each completed SQL statement." msgstr "Журналювати триваліÑть кожного виконаного SQL-оператора." -#: utils/misc/guc.c:1489 +#: utils/misc/guc_tables.c:1307 msgid "Logs each query's parse tree." msgstr "Журналювати дерево аналізу Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ запиту." -#: utils/misc/guc.c:1498 +#: utils/misc/guc_tables.c:1316 msgid "Logs each query's rewritten parse tree." msgstr "Журналювати перепиÑане дерево аналізу Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ запиту." -#: utils/misc/guc.c:1507 +#: utils/misc/guc_tables.c:1325 msgid "Logs each query's execution plan." msgstr "Журналювати план Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ запиту." -#: utils/misc/guc.c:1516 +#: utils/misc/guc_tables.c:1334 msgid "Indents parse and plan tree displays." msgstr "ВідÑтупи при відображенні дерев аналізу Ñ– плану запитів." -#: utils/misc/guc.c:1525 +#: utils/misc/guc_tables.c:1343 msgid "Writes parser performance statistics to the server log." msgstr "Ð—Ð°Ð¿Ð¸Ñ ÑтатиÑтики продуктивноÑті аналізу до запиÑу Ñервера." -#: utils/misc/guc.c:1534 +#: utils/misc/guc_tables.c:1352 msgid "Writes planner performance statistics to the server log." msgstr "Ð—Ð°Ð¿Ð¸Ñ ÑтатиÑтики продуктивноÑті планувальника до запиÑу Ñервера." -#: utils/misc/guc.c:1543 +#: utils/misc/guc_tables.c:1361 msgid "Writes executor performance statistics to the server log." msgstr "Ð—Ð°Ð¿Ð¸Ñ ÑтатиÑтики продуктивноÑті виконувача до запиÑу Ñервера." -#: utils/misc/guc.c:1552 +#: utils/misc/guc_tables.c:1370 msgid "Writes cumulative performance statistics to the server log." msgstr "Ð—Ð°Ð¿Ð¸Ñ Ñукупної ÑтатиÑтики продуктивноÑті до запиÑу Ñервера." -#: utils/misc/guc.c:1562 +#: utils/misc/guc_tables.c:1380 msgid "Logs system resource usage statistics (memory and CPU) on various B-tree operations." msgstr "Журналювати ÑтатиÑтику викориÑÑ‚Ð°Ð½Ð½Ñ ÑиÑтемних реÑурÑів (пам'Ñті Ñ– ЦП) при різноманітних операціÑÑ… з B-tree." -#: utils/misc/guc.c:1574 +#: utils/misc/guc_tables.c:1392 msgid "Collects information about executing commands." msgstr "Збирати інформацію про команди Ñкі виконуютьÑÑ." -#: utils/misc/guc.c:1575 +#: utils/misc/guc_tables.c:1393 msgid "Enables the collection of information on the currently executing command of each session, along with the time at which that command began execution." msgstr "Ðктивує збір інформації про поточні команди, Ñкі виконуютьÑÑ Ð² кожному ÑеанÑÑ–, разом з чаÑом запуÑку команди." -#: utils/misc/guc.c:1585 +#: utils/misc/guc_tables.c:1403 msgid "Collects statistics on database activity." msgstr "Збирати ÑтатиÑтику про активніÑть бази даних." -#: utils/misc/guc.c:1594 +#: utils/misc/guc_tables.c:1412 msgid "Collects timing statistics for database I/O activity." msgstr "Збирати ÑтатиÑтику за чаÑом активноÑті введеннÑ/Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних." -#: utils/misc/guc.c:1603 +#: utils/misc/guc_tables.c:1421 msgid "Collects timing statistics for WAL I/O activity." msgstr "Збирає ÑтатиÑтику чаÑу Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñті вводу/виводу WAL." -#: utils/misc/guc.c:1613 +#: utils/misc/guc_tables.c:1431 msgid "Updates the process title to show the active SQL command." msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð¸Ð²Ð¾Ð´Ð¸Ñ‚ÑŒ в заголовок процеÑу активну SQL-команду." -#: utils/misc/guc.c:1614 +#: utils/misc/guc_tables.c:1432 msgid "Enables updating of the process title every time a new SQL command is received by the server." msgstr "Відображає в заголовку процеÑа кожну SQL-команду, отриману Ñервером." -#: utils/misc/guc.c:1627 +#: utils/misc/guc_tables.c:1441 msgid "Starts the autovacuum subprocess." msgstr "ЗапуÑкає Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð°Ð²Ñ‚Ð¾Ð¾Ñ‡Ð¸Ñтки." -#: utils/misc/guc.c:1637 +#: utils/misc/guc_tables.c:1451 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "Генерує налагодженні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ LISTEN Ñ– NOTIFY." -#: utils/misc/guc.c:1649 +#: utils/misc/guc_tables.c:1463 msgid "Emits information about lock usage." msgstr "Видає інформацію про блокуваннÑ, Ñкі викориÑтовуютьÑÑ." -#: utils/misc/guc.c:1659 +#: utils/misc/guc_tables.c:1473 msgid "Emits information about user lock usage." msgstr "Видає інформацію про кориÑтувацькі блокуваннÑ, Ñкі викориÑтовуютьÑÑ." -#: utils/misc/guc.c:1669 +#: utils/misc/guc_tables.c:1483 msgid "Emits information about lightweight lock usage." msgstr "Видає інформацію про Ñпрощені блокуваннÑ, Ñкі викориÑтовуютьÑÑ." -#: utils/misc/guc.c:1679 +#: utils/misc/guc_tables.c:1493 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "Виводить інформацію про вÑÑ– поточні блокуваннÑ, при тайм-ауті взаємного блокуваннÑ." -#: utils/misc/guc.c:1691 +#: utils/misc/guc_tables.c:1505 msgid "Logs long lock waits." msgstr "Журналювати тривалі Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð² блокуваннÑÑ…." -#: utils/misc/guc.c:1700 +#: utils/misc/guc_tables.c:1514 msgid "Logs standby recovery conflict waits." msgstr "Журналює Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ„Ð»Ñ–ÐºÑ‚Ñƒ відновленнÑ." -#: utils/misc/guc.c:1709 +#: utils/misc/guc_tables.c:1523 msgid "Logs the host name in the connection logs." msgstr "Журналювати Ñ–Ð¼â€™Ñ Ñ…Ð¾Ñта до запиÑів підключеннÑ." -#: utils/misc/guc.c:1710 +#: utils/misc/guc_tables.c:1524 msgid "By default, connection logs only show the IP address of the connecting host. If you want them to show the host name you can turn this on, but depending on your host name resolution setup it might impose a non-negligible performance penalty." msgstr "За замовчуваннÑм, запиÑи підключень показують лише IP-адреÑи хоÑтів, Ñкі підключилиÑÑ. Якщо ви хочете бачити імена хоÑтів ви можете ввімкнути цей параметр, але врахуйте, що це може значно вплинути на продуктивніÑть." -#: utils/misc/guc.c:1721 +#: utils/misc/guc_tables.c:1535 msgid "Treats \"expr=NULL\" as \"expr IS NULL\"." msgstr "Вважати \"expr=NULL\" Ñк \"expr IS NULL\"." -#: utils/misc/guc.c:1722 +#: utils/misc/guc_tables.c:1536 msgid "When turned on, expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL, that is, they return true if expr evaluates to the null value, and false otherwise. The correct behavior of expr = NULL is to always return null (unknown)." msgstr "Коли цей параметр ввімкнений, вирази форми expr = NULL (або NULL = expr) вважаютьÑÑ Ñк expr IS NULL, тобто, повертають true, Ñкщо expr Ñпівпадає зі значеннÑм null, Ñ– false в іншому разі. Правильна поведінка expr = NULL - завжди повертати null (невідомо)." -#: utils/misc/guc.c:1734 -msgid "Enables per-database user names." -msgstr "Вмикає зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð¼ÐµÐ½ кориÑтувачів з базами даних." - -#: utils/misc/guc.c:1743 +#: utils/misc/guc_tables.c:1548 msgid "Sets the default read-only status of new transactions." msgstr "Ð’Ñтановлює ÑÑ‚Ð°Ñ‚ÑƒÑ \"лише читаннÑ\" за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… транзакцій." -#: utils/misc/guc.c:1753 +#: utils/misc/guc_tables.c:1558 msgid "Sets the current transaction's read-only status." msgstr "Ð’Ñтановлює ÑÑ‚Ð°Ñ‚ÑƒÑ \"лише читаннÑ\" Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— транзакції." -#: utils/misc/guc.c:1763 +#: utils/misc/guc_tables.c:1568 msgid "Sets the default deferrable status of new transactions." msgstr "Ð’Ñтановлює ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ñ–Ð´ÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ð³Ð¾ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð° замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… транзакцій." -#: utils/misc/guc.c:1772 +#: utils/misc/guc_tables.c:1577 msgid "Whether to defer a read-only serializable transaction until it can be executed with no possible serialization failures." msgstr "Визначає, чи відкладати Ñеріалізовану транзакцію \"лише читаннÑ\" до моменту, коли збій Ñеріалізації буде виключений." -#: utils/misc/guc.c:1782 +#: utils/misc/guc_tables.c:1587 msgid "Enable row security." msgstr "Вмикає захиÑÑ‚ на рівні Ñ€Ñдків." -#: utils/misc/guc.c:1783 +#: utils/misc/guc_tables.c:1588 msgid "When enabled, row security will be applied to all users." msgstr "Коли ввімкнено, захиÑÑ‚ на рівні Ñ€Ñдків буде заÑтоÑовано до вÑÑ–Ñ… кориÑтувачів." -#: utils/misc/guc.c:1791 +#: utils/misc/guc_tables.c:1596 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "Перевірте тіла підпрограм під Ñ‡Ð°Ñ CREATE FUNCTION Ñ– CREATE PROCEDURE." -#: utils/misc/guc.c:1800 +#: utils/misc/guc_tables.c:1605 msgid "Enable input of NULL elements in arrays." msgstr "ДозволÑÑ” Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ NULL елементів у маÑивах." -#: utils/misc/guc.c:1801 +#: utils/misc/guc_tables.c:1606 msgid "When turned on, unquoted NULL in an array input value means a null value; otherwise it is taken literally." msgstr "Коли цей параметр ввімкнений, NULL без лапок при введенні до маÑиву ÑприймаєтьÑÑ Ñк Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ null; в іншому разі Ñк Ñ€Ñдок." -#: utils/misc/guc.c:1817 +#: utils/misc/guc_tables.c:1622 msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS більше не підтримуєтьÑÑ; це може бути помилковим." -#: utils/misc/guc.c:1827 -msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." -msgstr "ЗапуÑкає Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ stderr Ñ–/або csvlogs до файлів журналу." +#: utils/misc/guc_tables.c:1632 +msgid "Start a subprocess to capture stderr, csvlog and/or jsonlog into log files." +msgstr "ЗапуÑкає Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð¿Ð¸ÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ stderr, csvlog Ñ–/або jsonlog до файлів журналу." -#: utils/misc/guc.c:1836 +#: utils/misc/guc_tables.c:1641 msgid "Truncate existing log files of same name during log rotation." msgstr "Скорочувати Ñ–Ñнуючі файли журналу з тим Ñамим іменем під Ñ‡Ð°Ñ Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ." -#: utils/misc/guc.c:1847 +#: utils/misc/guc_tables.c:1652 msgid "Emit information about resource usage in sorting." msgstr "Виводити інформацію про викориÑÑ‚Ð°Ð½Ð½Ñ Ñ€ÐµÑурÑу при Ñортуванні." -#: utils/misc/guc.c:1861 +#: utils/misc/guc_tables.c:1666 msgid "Generate debugging output for synchronized scanning." msgstr "Створює налагодженні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñинхронного ÑкануваннÑ." -#: utils/misc/guc.c:1876 +#: utils/misc/guc_tables.c:1681 msgid "Enable bounded sorting using heap sort." msgstr "Вмикає обмежене ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовуючи динамічне ÑортуваннÑ." -#: utils/misc/guc.c:1889 +#: utils/misc/guc_tables.c:1694 msgid "Emit WAL-related debugging output." msgstr "Виводити налагодженні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²'Ñзані з WAL." -#: utils/misc/guc.c:1901 +#: utils/misc/guc_tables.c:1706 msgid "Shows whether datetimes are integer based." msgstr "Показує, чи базуютьÑÑ Ð´Ð°Ñ‚Ð¸ на цілих чиÑлах." -#: utils/misc/guc.c:1912 +#: utils/misc/guc_tables.c:1717 msgid "Sets whether Kerberos and GSSAPI user names should be treated as case-insensitive." msgstr "Ð’Ñтановлює обробку без ÑƒÑ€Ð°Ñ…ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ³Ñ–Ñтру імен кориÑтувачів Kerberos Ñ– GSSAPI." -#: utils/misc/guc.c:1922 +#: utils/misc/guc_tables.c:1727 +msgid "Sets whether GSSAPI delegation should be accepted from the client." +msgstr "Ð’Ñтановлює чи Ñлід приймати делегацію GSSAPI від клієнта." + +#: utils/misc/guc_tables.c:1737 msgid "Warn about backslash escapes in ordinary string literals." msgstr "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ ÑпецÑимволи \"\\\" в звичайних Ñ€Ñдках." -#: utils/misc/guc.c:1932 +#: utils/misc/guc_tables.c:1747 msgid "Causes '...' strings to treat backslashes literally." msgstr "Вмикає буквальну обробку Ñимволів \"\\\" в Ñ€Ñдках '...'." -#: utils/misc/guc.c:1943 +#: utils/misc/guc_tables.c:1758 msgid "Enable synchronized sequential scans." msgstr "Вмикає Ñинхронізацію поÑлідовного ÑкануваннÑ." -#: utils/misc/guc.c:1953 +#: utils/misc/guc_tables.c:1768 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "Ð’Ñтановлює, включати чи виключати транзакції з метою відновленнÑ." -#: utils/misc/guc.c:1963 +#: utils/misc/guc_tables.c:1778 +msgid "Starts the WAL summarizer process to enable incremental backup." +msgstr "ЗапуÑкає Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿Ñ–Ð´ÑÑƒÐ¼Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ WAL, щоб увімкнути інкрементне резервне копіюваннÑ." + +#: utils/misc/guc_tables.c:1788 msgid "Allows connections and queries during recovery." msgstr "ДозволÑÑ” Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ– запити під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: utils/misc/guc.c:1973 +#: utils/misc/guc_tables.c:1798 msgid "Allows feedback from a hot standby to the primary that will avoid query conflicts." msgstr "ДозволÑÑ” зворотній зв'Ñзок Ñерверу hot standby з оÑновним Ð´Ð»Ñ ÑƒÐ½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ð»Ñ–ÐºÑ‚Ñ–Ð² запитів." -#: utils/misc/guc.c:1983 +#: utils/misc/guc_tables.c:1808 msgid "Shows whether hot standby is currently active." msgstr "Показує, чи hot standby наразі активний." -#: utils/misc/guc.c:1994 +#: utils/misc/guc_tables.c:1819 msgid "Allows modifications of the structure of system tables." msgstr "ДозволÑÑ” модифікації Ñтруктури ÑиÑтемних таблиць." -#: utils/misc/guc.c:2005 +#: utils/misc/guc_tables.c:1830 msgid "Disables reading from system indexes." msgstr "Вимикає Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð· ÑиÑтемних індекÑів." -#: utils/misc/guc.c:2006 +#: utils/misc/guc_tables.c:1831 msgid "It does not prevent updating the indexes, so it is safe to use. The worst consequence is slowness." msgstr "Це не заборонÑÑ” Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑів, тож дана поведінка безпечна. Ðайгірший наÑлідок це ÑповільненнÑ." -#: utils/misc/guc.c:2017 +#: utils/misc/guc_tables.c:1842 msgid "Allows tablespaces directly inside pg_tblspc, for testing." msgstr "ДозволÑÑ” табличні проÑтори безпоÑередньо вÑередині pg_tblspc, Ð´Ð»Ñ Ñ‚ÐµÑтуваннÑ." -#: utils/misc/guc.c:2028 +#: utils/misc/guc_tables.c:1853 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "Вмикає режим зворотньої ÑуміÑноÑті при перевірці прав Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об'єктів." -#: utils/misc/guc.c:2029 +#: utils/misc/guc_tables.c:1854 msgid "Skips privilege checks when reading or modifying large objects, for compatibility with PostgreSQL releases prior to 9.0." msgstr "ПропуÑкає перевірки прав при читанні або зміненні великих об'єктів, Ð´Ð»Ñ ÑуміÑноÑті з верÑÑ–Ñми PostgreSQL до 9.0." -#: utils/misc/guc.c:2039 +#: utils/misc/guc_tables.c:1864 msgid "When generating SQL fragments, quote all identifiers." msgstr "Генеруючи SQL-фрагменти, включати вÑÑ– ідентифікатори в лапки." -#: utils/misc/guc.c:2049 +#: utils/misc/guc_tables.c:1874 msgid "Shows whether data checksums are turned on for this cluster." msgstr "Показує, чи ввімкнена контрольна Ñума даних Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ клаÑтеру." -#: utils/misc/guc.c:2060 +#: utils/misc/guc_tables.c:1885 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "Додає поÑлідовне чиÑло до повідомлень syslog, щоб уникнути Ñ–Ð³Ð½Ð¾Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð´ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ‚Ñ–Ð²." -#: utils/misc/guc.c:2070 +#: utils/misc/guc_tables.c:1895 msgid "Split messages sent to syslog by lines and to fit into 1024 bytes." msgstr "РозділÑÑ” повідомленнÑ, Ñкі передаютьÑÑ Ð² syslog, Ñ€Ñдками розміром не більше 1024 байт." -#: utils/misc/guc.c:2080 +#: utils/misc/guc_tables.c:1905 msgid "Controls whether Gather and Gather Merge also run subplans." msgstr "Визначає, чи вузли Ð·Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ñ– Ð·Ñ–Ð±Ñ€Ð°Ð½Ð½Ñ Ð¾Ð±'єднаннÑм також виконають підплани." -#: utils/misc/guc.c:2081 +#: utils/misc/guc_tables.c:1906 msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "Чи повинні вузли збірки також виконувати підплани або тільки збирати кортежі?" -#: utils/misc/guc.c:2091 +#: utils/misc/guc_tables.c:1916 msgid "Allow JIT compilation." msgstr "Дозволити JIT-компілÑцію." -#: utils/misc/guc.c:2102 +#: utils/misc/guc_tables.c:1927 msgid "Register JIT-compiled functions with debugger." msgstr "ЗареєÑтруйте функції JIT-compiled за допомогою налагоджувача." -#: utils/misc/guc.c:2119 +#: utils/misc/guc_tables.c:1944 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "Виводити бітовий код LLVM Ð´Ð»Ñ Ð¿Ð¾Ð»ÐµÐ³ÑˆÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ JIT." -#: utils/misc/guc.c:2130 +#: utils/misc/guc_tables.c:1955 msgid "Allow JIT compilation of expressions." msgstr "Дозволити JIT-компілÑцію виразів." -#: utils/misc/guc.c:2141 +#: utils/misc/guc_tables.c:1966 msgid "Register JIT-compiled functions with perf profiler." msgstr "ЗареєÑтруйте функції JIT-compiled за допомогою профілювальника perf." -#: utils/misc/guc.c:2158 +#: utils/misc/guc_tables.c:1983 msgid "Allow JIT compilation of tuple deforming." msgstr "Дозволити JIT-компілÑцію Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ñ‚ÐµÐ¶Ñ–Ð²." -#: utils/misc/guc.c:2169 +#: utils/misc/guc_tables.c:1994 msgid "Whether to continue running after a failure to sync data files." msgstr "Чи продовжувати Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ Ñинхронізації файлів даних на диÑку." -#: utils/misc/guc.c:2178 +#: utils/misc/guc_tables.c:2003 msgid "Sets whether a WAL receiver should create a temporary replication slot if no permanent slot is configured." msgstr "Ð’Ñтановлює чи повинен одержувач WAL Ñтворити тимчаÑовий Ñлот реплікації, Ñкщо поÑтійний Ñлот не налаштований." -#: utils/misc/guc.c:2196 +#: utils/misc/guc_tables.c:2012 +msgid "Enables event triggers." +msgstr "Вмикає тригери подій." + +#: utils/misc/guc_tables.c:2013 +msgid "When enabled, event triggers will fire for all applicable statements." +msgstr "Якщо увімкнено, тригери подій Ñпрацьовуватимуть Ð´Ð»Ñ Ð²ÑÑ–Ñ… заÑтоÑовних операторів." + +#: utils/misc/guc_tables.c:2022 +msgid "Enables a physical standby to synchronize logical failover replication slots from the primary server." +msgstr "Вмикає фізичний резерв Ð´Ð»Ñ Ñинхронізації логічних Ñлотів реплікації з оÑновним Ñервером." + +#: utils/misc/guc_tables.c:2040 msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." msgstr "Ð’Ñтановлює кількіÑть чаÑу Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ примуÑовим переходом на наÑтупний файл WAL." -#: utils/misc/guc.c:2207 +#: utils/misc/guc_tables.c:2051 msgid "Sets the amount of time to wait after authentication on connection startup." msgstr "Ð’Ñтановлює кількіÑть чаÑу Ð´Ð»Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð°Ð²Ñ‚ÐµÐ½Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку з'єднаннÑ." -#: utils/misc/guc.c:2209 utils/misc/guc.c:2830 +#: utils/misc/guc_tables.c:2053 utils/misc/guc_tables.c:2780 msgid "This allows attaching a debugger to the process." msgstr "Це дозволÑÑ” підключити налагоджувач до процеÑу." -#: utils/misc/guc.c:2218 +#: utils/misc/guc_tables.c:2062 msgid "Sets the default statistics target." msgstr "Ð’Ñтановлює мету ÑтатиÑтики за замовчуваннÑм." -#: utils/misc/guc.c:2219 +#: utils/misc/guc_tables.c:2063 msgid "This applies to table columns that have not had a column-specific target set via ALTER TABLE SET STATISTICS." msgstr "Це заÑтоÑовуєтьÑÑ Ð´Ð¾ Ñтовпців таблиці, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ñ€Ð¸Ñ… мета ÑтатиÑтики не вÑтановлена Ñвно через ALTER TABLE SET STATISTICS." -#: utils/misc/guc.c:2228 +#: utils/misc/guc_tables.c:2072 msgid "Sets the FROM-list size beyond which subqueries are not collapsed." msgstr "Ð’Ñтановлює розмір Ð´Ð»Ñ ÑпиÑку FROM, при перевищені котрого вкладені запити не згортаютьÑÑ." -#: utils/misc/guc.c:2230 +#: utils/misc/guc_tables.c:2074 msgid "The planner will merge subqueries into upper queries if the resulting FROM list would have no more than this many items." msgstr "Планувальник об'єднає вкладені запити з зовнішніми, Ñкщо в отриманому ÑпиÑку FROM буде не більше заданої кількоÑті елементів." -#: utils/misc/guc.c:2241 +#: utils/misc/guc_tables.c:2085 msgid "Sets the FROM-list size beyond which JOIN constructs are not flattened." msgstr "Ð’Ñтановлює розмір Ð´Ð»Ñ ÑпиÑку FROM, при перевищенні котрого конÑтрукції JOIN не подаютьÑÑ Ñƒ виглÑді Ñ€Ñдка." -#: utils/misc/guc.c:2243 +#: utils/misc/guc_tables.c:2087 msgid "The planner will flatten explicit JOIN constructs into lists of FROM items whenever a list of no more than this many items would result." msgstr "Планувальник буде подавати у виглÑді Ñ€Ñдка Ñвні конÑтрукції JOIN в ÑпиÑки FROM, допоки в отриманому ÑпиÑку не більше заданої кількоÑті елементів." -#: utils/misc/guc.c:2254 +#: utils/misc/guc_tables.c:2098 msgid "Sets the threshold of FROM items beyond which GEQO is used." msgstr "Ð’Ñтановлює граничне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñ–Ð² FROM, при перевищенні котрого викориÑтовуєтьÑÑ GEQO." -#: utils/misc/guc.c:2264 +#: utils/misc/guc_tables.c:2108 msgid "GEQO: effort is used to set the default for other GEQO parameters." msgstr "GEQO: зуÑÐ¸Ð»Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтовувалиÑÑŒ щоб вÑтановити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм Ð´Ð»Ñ Ñ–Ð½ÑˆÐ¸Ñ… параметрів GEQO." -#: utils/misc/guc.c:2274 +#: utils/misc/guc_tables.c:2118 msgid "GEQO: number of individuals in the population." msgstr "GEQO: кількіÑть кориÑтувачів у популÑції." -#: utils/misc/guc.c:2275 utils/misc/guc.c:2285 +#: utils/misc/guc_tables.c:2119 utils/misc/guc_tables.c:2129 msgid "Zero selects a suitable default value." msgstr "Ðуль вибирає придатне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм." -#: utils/misc/guc.c:2284 +#: utils/misc/guc_tables.c:2128 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: кількіÑть ітерацій в алгоритмі." -#: utils/misc/guc.c:2296 +#: utils/misc/guc_tables.c:2140 msgid "Sets the time to wait on a lock before checking for deadlock." msgstr "Ð’Ñтановлює Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð² блокуванні до перевірки на взаємне блокуваннÑ." -#: utils/misc/guc.c:2307 +#: utils/misc/guc_tables.c:2151 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing archived WAL data." msgstr "Ð’Ñтановлює макÑимальну затримку до ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð², коли hot standby Ñервер оброблÑÑ” архівні дані WAL." -#: utils/misc/guc.c:2318 +#: utils/misc/guc_tables.c:2162 msgid "Sets the maximum delay before canceling queries when a hot standby server is processing streamed WAL data." msgstr "Ð’Ñтановлює макÑимальну затримку до ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð², коли hot standby Ñервер оброблÑÑ” дані WAL з потоку." -#: utils/misc/guc.c:2329 +#: utils/misc/guc_tables.c:2173 msgid "Sets the minimum delay for applying changes during recovery." msgstr "Ð’Ñтановлює мінімальну затримку Ð´Ð»Ñ Ð·Ð°ÑтоÑÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½ під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: utils/misc/guc.c:2340 +#: utils/misc/guc_tables.c:2184 msgid "Sets the maximum interval between WAL receiver status reports to the sending server." msgstr "Ð’Ñтановлює макÑимальний інтервал між звітами про Ñтан одержувачів WAL Ð´Ð»Ñ Ñерверу надÑиланнÑ." -#: utils/misc/guc.c:2351 +#: utils/misc/guc_tables.c:2195 msgid "Sets the maximum wait time to receive data from the sending server." msgstr "Ð’Ñтановлює макÑимальний Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з Ñерверу надÑиланнÑ." -#: utils/misc/guc.c:2362 +#: utils/misc/guc_tables.c:2206 msgid "Sets the maximum number of concurrent connections." msgstr "Ð’Ñтановлює макÑимальну кілкіÑть паралельних підключень." -#: utils/misc/guc.c:2373 +#: utils/misc/guc_tables.c:2217 msgid "Sets the number of connection slots reserved for superusers." msgstr "Ð’Ñтановлює кількіÑть зарезервованих Ñлотів підключень Ð´Ð»Ñ ÑуперкориÑтувачів." -#: utils/misc/guc.c:2383 +#: utils/misc/guc_tables.c:2227 +msgid "Sets the number of connection slots reserved for roles with privileges of pg_use_reserved_connections." +msgstr "Ð’Ñтановлює кількіÑть Ñлотів підключеннÑ, зарезервованих Ð´Ð»Ñ Ñ€Ð¾Ð»ÐµÐ¹ з правами pg_use_reserved_connections." + +#: utils/misc/guc_tables.c:2238 msgid "Amount of dynamic shared memory reserved at startup." msgstr "КількіÑть динамічної Ñпільної пам'Ñті, зарезервованої під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку." -#: utils/misc/guc.c:2398 +#: utils/misc/guc_tables.c:2253 msgid "Sets the number of shared memory buffers used by the server." msgstr "Ð’Ñтановлює кількіÑть буферів Ñпільної пам'Ñті, викориÑтовуваних Ñервером." -#: utils/misc/guc.c:2409 +#: utils/misc/guc_tables.c:2264 +msgid "Sets the buffer pool size for VACUUM, ANALYZE, and autovacuum." +msgstr "Ð’Ñтановлює розмір буферного пулу Ð´Ð»Ñ VACUUM, ANALYZE та автоочиÑтки." + +#: utils/misc/guc_tables.c:2275 msgid "Shows the size of the server's main shared memory area (rounded up to the nearest MB)." msgstr "Показує розмір оÑновної Ñпільної пам'Ñті Ñервера (Ð¾ÐºÑ€ÑƒÐ³Ð»ÐµÐ½Ð½Ñ Ð´Ð¾ найближчого МБ)." -#: utils/misc/guc.c:2420 +#: utils/misc/guc_tables.c:2286 msgid "Shows the number of huge pages needed for the main shared memory area." msgstr "Показує кількіÑть величезних Ñторінок, потрібних Ð´Ð»Ñ Ð¾Ñновної облаÑті Ñпільної пам'Ñті." -#: utils/misc/guc.c:2421 +#: utils/misc/guc_tables.c:2287 msgid "-1 indicates that the value could not be determined." msgstr "-1 вказує на те, що Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ може бути визначене." -#: utils/misc/guc.c:2431 +#: utils/misc/guc_tables.c:2297 +msgid "Sets the size of the dedicated buffer pool used for the commit timestamp cache." +msgstr "Ð’Ñтановлює розмір Ñпеціального буфера, що викориÑтовуєтьÑÑ Ð´Ð»Ñ ÐºÐµÑˆÑƒ чаÑів комітів." + +#: utils/misc/guc_tables.c:2298 utils/misc/guc_tables.c:2353 +#: utils/misc/guc_tables.c:2364 +msgid "Specify 0 to have this value determined as a fraction of shared_buffers." +msgstr "Вкажіть 0, щоб це Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð°Ð»Ð¾ÑÑ Ñк чаÑтка shared_buffers." + +#: utils/misc/guc_tables.c:2308 +msgid "Sets the size of the dedicated buffer pool used for the MultiXact member cache." +msgstr "Ð’Ñтановлює розмір Ñпеціального буфера, що викориÑтовуєтьÑÑ Ð´Ð»Ñ ÐºÐµÑˆÑƒ членів MultiXact." + +#: utils/misc/guc_tables.c:2319 +msgid "Sets the size of the dedicated buffer pool used for the MultiXact offset cache." +msgstr "Ð’Ñтановлює розмір Ñпеціального буфера, що викориÑтовуєтьÑÑ Ð´Ð»Ñ ÐºÐµÑˆÑƒ зÑувів MultiXact." + +#: utils/misc/guc_tables.c:2330 +msgid "Sets the size of the dedicated buffer pool used for the LISTEN/NOTIFY message cache." +msgstr "Ð’Ñтановлює розмір Ñпеціального буфера, що викориÑтовуєтьÑÑ Ð´Ð»Ñ ÐºÐµÑˆÑƒ повідомлень LISTEN/NOTIFY." + +#: utils/misc/guc_tables.c:2341 +msgid "Sets the size of the dedicated buffer pool used for the serializable transaction cache." +msgstr "Ð’Ñтановлює розмір Ñпеціального буфера, що викориÑтовуєтьÑÑ Ð´Ð»Ñ ÐºÐµÑˆÑƒ Ñеріалізованих транзакцій." + +#: utils/misc/guc_tables.c:2352 +msgid "Sets the size of the dedicated buffer pool used for the subtransaction cache." +msgstr "Ð’Ñтановлює розмір Ñпеціального буфера, що викориÑтовуєтьÑÑ Ð´Ð»Ñ ÐºÐµÑˆÑƒ Ñубтранзакцій." + +#: utils/misc/guc_tables.c:2363 +msgid "Sets the size of the dedicated buffer pool used for the transaction status cache." +msgstr "Ð’Ñтановлює розмір Ñпеціального буфера, що викориÑтовуєтьÑÑ Ð´Ð»Ñ ÐºÐµÑˆÑƒ ÑтатуÑів транзакцій." + +#: utils/misc/guc_tables.c:2374 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "Ð’Ñтановлює макÑимальну кількіÑть викориÑтовуваних тимчаÑових буферів, Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ ÑеанÑу." -#: utils/misc/guc.c:2442 +#: utils/misc/guc_tables.c:2385 msgid "Sets the TCP port the server listens on." msgstr "Ð’Ñтановлює TCP-порт Ð´Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ Ñерверу." -#: utils/misc/guc.c:2452 +#: utils/misc/guc_tables.c:2395 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Ð’Ñтановлює дозволи на доÑтуп Ð´Ð»Ñ Unix-Ñокету." -#: utils/misc/guc.c:2453 +#: utils/misc/guc_tables.c:2396 msgid "Unix-domain sockets use the usual Unix file system permission set. The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Ð”Ð»Ñ Unix-Ñокетів викориÑтовуєтьÑÑ Ð·Ð²Ð¸Ñ‡Ð½Ð¸Ð¹ набір дозволів, Ñк у файлових ÑиÑтемах Unix. ОчікуєтьÑÑ, що Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° вказуєтьÑÑ Ñƒ формі, Ñка прийнÑта Ð´Ð»Ñ ÑиÑтемних викликів chmod Ñ– umask. (Щоб викориÑтати звичний віÑімковий формат, додайте в початок 0 (нуль).)" -#: utils/misc/guc.c:2467 +#: utils/misc/guc_tables.c:2410 msgid "Sets the file permissions for log files." msgstr "Ð’Ñтановлює права дозволу Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² журналу." -#: utils/misc/guc.c:2468 +#: utils/misc/guc_tables.c:2411 msgid "The parameter value is expected to be a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "ОчікуєтьÑÑ, що Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ буде вказано в чиÑловому форматі, Ñкий ÑприймаєтьÑÑ ÑиÑтемними викликами chmod Ñ– umask. (Щоб викориÑтати звичний віÑімковий формат, додайте в початок 0 (нуль).)" -#: utils/misc/guc.c:2482 +#: utils/misc/guc_tables.c:2425 msgid "Shows the mode of the data directory." msgstr "Показує режим каталогу даних." -#: utils/misc/guc.c:2483 +#: utils/misc/guc_tables.c:2426 msgid "The parameter value is a numeric mode specification in the form accepted by the chmod and umask system calls. (To use the customary octal format the number must start with a 0 (zero).)" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ вказуєтьÑÑ Ð² чиÑловому форматі, Ñкий ÑприймаєтьÑÑ ÑиÑтемними викликами chmod Ñ– umask. (Щоб викориÑтати звичний віÑімковий формат, додайте в початок 0 (нуль).)" -#: utils/misc/guc.c:2496 +#: utils/misc/guc_tables.c:2439 msgid "Sets the maximum memory to be used for query workspaces." msgstr "Ð’Ñтановлює макÑимальний об'єм пам'Ñті Ð´Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‡Ð¸Ñ… проÑторів запитів." -#: utils/misc/guc.c:2497 +#: utils/misc/guc_tables.c:2440 msgid "This much memory can be used by each internal sort operation and hash table before switching to temporary disk files." msgstr "Такий об'єм пам'Ñті може викориÑтовуватиÑÑŒ кожною внутрішньою операцією ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– таблицею Ð³ÐµÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð½Ð° тимчаÑові файли на диÑку." -#: utils/misc/guc.c:2509 +#: utils/misc/guc_tables.c:2457 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "Ð’Ñтановлює макÑимальний об'єм пам'Ñті Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ð¹ по обÑлуговуванню." -#: utils/misc/guc.c:2510 +#: utils/misc/guc_tables.c:2458 msgid "This includes operations such as VACUUM and CREATE INDEX." msgstr "Це включає такі операції Ñк VACUUM Ñ– CREATE INDEX." -#: utils/misc/guc.c:2520 +#: utils/misc/guc_tables.c:2468 msgid "Sets the maximum memory to be used for logical decoding." msgstr "Ð’Ñтановлює макÑимальний об'єм пам'Ñті Ð´Ð»Ñ Ð»Ð¾Ð³Ñ–Ñ‡Ð½Ð¾Ð³Ð¾ декодуваннÑ." -#: utils/misc/guc.c:2521 +#: utils/misc/guc_tables.c:2469 msgid "This much memory can be used by each internal reorder buffer before spilling to disk." msgstr "Ð¦Ñ Ð²ÐµÐ»Ð¸ÐºÐ° кількіÑть пам'Ñті може бути викориÑтана кожним внутрішнім перевпорÑдковуючим буфером перед запиÑом на диÑк." -#: utils/misc/guc.c:2537 +#: utils/misc/guc_tables.c:2485 msgid "Sets the maximum stack depth, in kilobytes." msgstr "Ð’Ñтановлює макÑимальну глибину Ñтека, в КБ." -#: utils/misc/guc.c:2548 +#: utils/misc/guc_tables.c:2496 msgid "Limits the total size of all temporary files used by each process." msgstr "Обмежує загальний розмір вÑÑ–Ñ… тимчаÑових файлів, Ñкі викориÑтовуютьÑÑ ÐºÐ¾Ð¶Ð½Ð¸Ð¼ процеÑом." -#: utils/misc/guc.c:2549 +#: utils/misc/guc_tables.c:2497 msgid "-1 means no limit." msgstr "-1 вимикає обмеженнÑ." -#: utils/misc/guc.c:2559 +#: utils/misc/guc_tables.c:2507 msgid "Vacuum cost for a page found in the buffer cache." msgstr "ВартіÑть очиÑтки Ð´Ð»Ñ Ñторінки, Ñка була знайдена в буферному кеші." -#: utils/misc/guc.c:2569 +#: utils/misc/guc_tables.c:2517 msgid "Vacuum cost for a page not found in the buffer cache." msgstr "ВартіÑть очиÑтки Ð´Ð»Ñ Ñторінки, Ñка не була знайдена в буферному кеші." -#: utils/misc/guc.c:2579 +#: utils/misc/guc_tables.c:2527 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "ВартіÑть очиÑтки Ð´Ð»Ñ Ñторінки, Ñка не була \"брудною\"." -#: utils/misc/guc.c:2589 +#: utils/misc/guc_tables.c:2537 msgid "Vacuum cost amount available before napping." msgstr "КількіÑть доÑтупних витрат вакууму перед від'єднаннÑм." -#: utils/misc/guc.c:2599 +#: utils/misc/guc_tables.c:2547 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "КількіÑть доÑтупних витрат вакууму перед від'єднаннÑм, Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð²Ð°ÐºÑƒÑƒÐ¼Ñƒ." -#: utils/misc/guc.c:2609 +#: utils/misc/guc_tables.c:2557 msgid "Sets the maximum number of simultaneously open files for each server process." msgstr "Ð’Ñтановлює макÑимальну кількіÑть одночаÑно відкритих файлів Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ процеÑу." -#: utils/misc/guc.c:2622 +#: utils/misc/guc_tables.c:2570 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "Ð’Ñтановлює макÑимальну кількіÑть одночаÑно підготовлених транзакцій." -#: utils/misc/guc.c:2633 +#: utils/misc/guc_tables.c:2581 msgid "Sets the minimum OID of tables for tracking locks." msgstr "Ð’Ñтановлює мінімальний OID таблиць, Ð´Ð»Ñ Ñких відÑтежуютьÑÑ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ." -#: utils/misc/guc.c:2634 +#: utils/misc/guc_tables.c:2582 msgid "Is used to avoid output on system tables." msgstr "ВикориÑтовуєтьÑÑ Ð´Ð»Ñ ÑƒÐ½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ ÑиÑтемних таблиць." -#: utils/misc/guc.c:2643 +#: utils/misc/guc_tables.c:2591 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "Ð’Ñтановлює OID таблиці Ð´Ð»Ñ Ð±ÐµÐ·ÑƒÐ¼Ð¾Ð²Ð½Ð¾Ð³Ð¾ траÑÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½ÑŒ." -#: utils/misc/guc.c:2655 +#: utils/misc/guc_tables.c:2603 msgid "Sets the maximum allowed duration of any statement." msgstr "Ð’Ñтановлює макÑимальну триваліÑть Ð´Ð»Ñ Ð±ÑƒÐ´ÑŒ-Ñкого оператору." -#: utils/misc/guc.c:2656 utils/misc/guc.c:2667 utils/misc/guc.c:2678 -#: utils/misc/guc.c:2689 +#: utils/misc/guc_tables.c:2604 utils/misc/guc_tables.c:2615 +#: utils/misc/guc_tables.c:2626 utils/misc/guc_tables.c:2637 +#: utils/misc/guc_tables.c:2648 msgid "A value of 0 turns off the timeout." msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0 (нуль) вимикає тайм-аут." -#: utils/misc/guc.c:2666 +#: utils/misc/guc_tables.c:2614 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "Ð’Ñтановлює макÑимально дозволену триваліÑть Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½ÑŒ." -#: utils/misc/guc.c:2677 +#: utils/misc/guc_tables.c:2625 msgid "Sets the maximum allowed idle time between queries, when in a transaction." msgstr "Ð’Ñтановлює макÑимально дозволений Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ запитами під Ñ‡Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ—." -#: utils/misc/guc.c:2688 +#: utils/misc/guc_tables.c:2636 +msgid "Sets the maximum allowed duration of any transaction within a session (not a prepared transaction)." +msgstr "Ð’Ñтановлює макÑимально дозволений Ñ‡Ð°Ñ Ð±ÑƒÐ´ÑŒ-Ñкої транзакції в межах ÑеÑÑ–Ñ— (не підготовленої транзакцієї)." + +#: utils/misc/guc_tables.c:2647 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." msgstr "Ð’Ñтановлює макÑимально дозволений Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ запитами поза транзакцією." -#: utils/misc/guc.c:2699 +#: utils/misc/guc_tables.c:2658 msgid "Minimum age at which VACUUM should freeze a table row." msgstr "Мінімальний вік Ñ€Ñдків таблиці, при котрому VACUUM зможе Ñ—Ñ… закріпити." -#: utils/misc/guc.c:2709 +#: utils/misc/guc_tables.c:2668 msgid "Age at which VACUUM should scan whole table to freeze tuples." msgstr "Вік, при котрому VACUUM повинен Ñканувати вÑÑŽ таблицю, щоб закріпити кортежі." -#: utils/misc/guc.c:2719 +#: utils/misc/guc_tables.c:2678 msgid "Minimum age at which VACUUM should freeze a MultiXactId in a table row." msgstr "Мінімальний вік, при котрому VACUUM повинен закріпити MultiXactId в Ñ€Ñдку таблиці." -#: utils/misc/guc.c:2729 +#: utils/misc/guc_tables.c:2688 msgid "Multixact age at which VACUUM should scan whole table to freeze tuples." msgstr "Вік Multixact, при котрому VACUUM повинен Ñканувати вÑÑŽ таблицю, щоб закріпити кортежі." -#: utils/misc/guc.c:2739 -msgid "Number of transactions by which VACUUM and HOT cleanup should be deferred, if any." -msgstr "Визначає, кількіÑть транзакцій Ñкі потрібно буде відклаÑти, виконуючи VACUUM Ñ– HOT очищеннÑ." - -#: utils/misc/guc.c:2748 +#: utils/misc/guc_tables.c:2698 msgid "Age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "Вік, у Ñкому VACUUM повинен Ñпрацювати безпечно, щоб уникнути зацикленнÑ." -#: utils/misc/guc.c:2757 +#: utils/misc/guc_tables.c:2707 msgid "Multixact age at which VACUUM should trigger failsafe to avoid a wraparound outage." msgstr "Вік Multixact, у Ñкому VACUUM повинен Ñпрацювати безпечно, щоб уникнути зацикленнÑ." -#: utils/misc/guc.c:2770 +#: utils/misc/guc_tables.c:2720 msgid "Sets the maximum number of locks per transaction." msgstr "Ð’Ñтановлює макÑимальну кілкіÑть блокувань на транзакцію." -#: utils/misc/guc.c:2771 -msgid "The shared lock table is sized on the assumption that at most max_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." -msgstr "Розмір Ñпільної таблиці блокувань вибираєтьÑÑ Ð· припущеннÑ, що в один момент чаÑу буде потрібно заблокувати не більше ніж max_locks_per_transaction * max_connections різних об'єктів." +#: utils/misc/guc_tables.c:2721 +msgid "The shared lock table is sized on the assumption that at most \"max_locks_per_transaction\" objects per server process or prepared transaction will need to be locked at any one time." +msgstr "Розмір Ñпільної таблиці Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð°Ñ”Ñ‚ÑŒÑÑ Ð· припущеннÑ, що в будь-Ñкий момент чаÑу потрібно заблокувати не більше \"max_locks_per_transaction\" об'єктів на один Ñерверний Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð°Ð±Ð¾ підготовлену транзакцію." -#: utils/misc/guc.c:2782 +#: utils/misc/guc_tables.c:2732 msgid "Sets the maximum number of predicate locks per transaction." msgstr "Ð’Ñтановлює макÑимальну кількіÑть предикатних блокувань на транзакцію." -#: utils/misc/guc.c:2783 -msgid "The shared predicate lock table is sized on the assumption that at most max_pred_locks_per_transaction * max_connections distinct objects will need to be locked at any one time." -msgstr "Розмір Ñпільної таблиці предикатних блокувань вибираєтьÑÑ Ð· припущеннÑ, що в один момент чаÑу буде потрібно заблокувати не більше ніж max_locks_per_transaction * max_connections різних об'єктів." +#: utils/misc/guc_tables.c:2733 +msgid "The shared predicate lock table is sized on the assumption that at most \"max_pred_locks_per_transaction\" objects per server process or prepared transaction will need to be locked at any one time." +msgstr "Розмір Ñпільної таблиці Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€ÐµÐ´Ð¸ÐºÐ°Ñ‚Ñ–Ð² визначаєтьÑÑ Ð· припущеннÑ, що за один раз потрібно заблокувати не більше \"max_pred_locks_per_transaction\" об'єктів на один Ñерверний Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð°Ð±Ð¾ підготовлену транзакцію." -#: utils/misc/guc.c:2794 +#: utils/misc/guc_tables.c:2744 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." msgstr "Ð’Ñтановлює макÑимальну кількіÑть Ñторінок Ñ– кортежів, блокованих предикатними блокуваннÑми в одному відношенні." -#: utils/misc/guc.c:2795 +#: utils/misc/guc_tables.c:2745 msgid "If more than this total of pages and tuples in the same relation are locked by a connection, those locks are replaced by a relation-level lock." msgstr "Якщо одним підключеннÑм блокуєтьÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ цієї загальної кількоÑті Ñторінок Ñ– кортежів, ці Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ñ–Ð½ÑŽÑŽÑ‚ÑŒÑÑ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñм на рівні відношеннÑ." -#: utils/misc/guc.c:2805 +#: utils/misc/guc_tables.c:2755 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "Ð’Ñтановлює макÑимальну кількіÑть кортежів, блокованих предикатними блокуваннÑми в одній Ñторінці." -#: utils/misc/guc.c:2806 +#: utils/misc/guc_tables.c:2756 msgid "If more than this number of tuples on the same page are locked by a connection, those locks are replaced by a page-level lock." msgstr "Якщо одним підключеннÑм блокуєтьÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ цієї кількоÑті кортежів на одній Ñ– тій же Ñторінці, ці Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ñ–Ð½ÑŽÑŽÑ‚ÑŒÑÑ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñм на рівні Ñторінки." -#: utils/misc/guc.c:2816 +#: utils/misc/guc_tables.c:2766 msgid "Sets the maximum allowed time to complete client authentication." msgstr "Ð’Ñтановлює макÑимально допуÑтимий чаÑ, за котрий клієнт повинен завершити автентифікацію." -#: utils/misc/guc.c:2828 +#: utils/misc/guc_tables.c:2778 msgid "Sets the amount of time to wait before authentication on connection startup." msgstr "Ð’Ñтановлює кількіÑть чаÑу Ð´Ð»Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ автенифікацією під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку з'єднаннÑ." -#: utils/misc/guc.c:2840 -msgid "Maximum buffer size for reading ahead in the WAL during recovery." -msgstr "МакÑимальний розмір буфера Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð² WAL під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." +#: utils/misc/guc_tables.c:2790 +msgid "Sets the maximum number of allocated pages for NOTIFY / LISTEN queue." +msgstr "Ð’Ñтановлює макÑимальну кількіÑть виділених Ñторінок Ð´Ð»Ñ Ñ‡ÐµÑ€Ð³Ð¸ NOTIFY / LISTEN." -#: utils/misc/guc.c:2841 -msgid "This controls the maximum distance we can read ahead in the WAL to prefetch referenced blocks." -msgstr "Контролює макÑимальну відÑтань на Ñку ми можемо наперед прочитати в WAL, щоб отримати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° блоки." +#: utils/misc/guc_tables.c:2800 +msgid "Buffer size for reading ahead in the WAL during recovery." +msgstr "Розмір буфера Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð² WAL під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: utils/misc/guc.c:2851 +#: utils/misc/guc_tables.c:2801 +msgid "Maximum distance to read ahead in the WAL to prefetch referenced data blocks." +msgstr "МакÑимальна відÑтань до Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ WAL, Ð´Ð»Ñ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð½ÑŒÐ¾Ð³Ð¾ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð±Ð»Ð¾ÐºÑ–Ð², на Ñкі поÑилаютьÑÑ." + +#: utils/misc/guc_tables.c:2811 msgid "Sets the size of WAL files held for standby servers." msgstr "Ð’Ñтановлює розмір WAL файлів, Ñкі потрібно зберігати Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¸Ñ… Ñерверів." -#: utils/misc/guc.c:2862 +#: utils/misc/guc_tables.c:2822 msgid "Sets the minimum size to shrink the WAL to." msgstr "Ð’Ñтановлює мінімальний розмір WAL при ÑтиÑканні." -#: utils/misc/guc.c:2874 +#: utils/misc/guc_tables.c:2834 msgid "Sets the WAL size that triggers a checkpoint." msgstr "Ð’Ñтановлює розмір WAL, при котрому ініціюєтьÑÑ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð° точка." -#: utils/misc/guc.c:2886 +#: utils/misc/guc_tables.c:2846 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "Ð’Ñтановлює макÑимальний Ñ‡Ð°Ñ Ð¼Ñ–Ð¶ автоматичними контрольними точками WAL." -#: utils/misc/guc.c:2897 +#: utils/misc/guc_tables.c:2857 msgid "Sets the maximum time before warning if checkpoints triggered by WAL volume happen too frequently." msgstr "Ð’Ñтановлює макÑимальний Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ´ попередженнÑм, Ñкщо контрольні точки WAL відбуваютьÑÑ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ чаÑто." -#: utils/misc/guc.c:2899 +#: utils/misc/guc_tables.c:2859 msgid "Write a message to the server log if checkpoints caused by the filling of WAL segment files happen more frequently than this amount of time. Zero turns off the warning." msgstr "ЗапиÑує в журнал Ñерверу повідомленнÑ, Ñкщо контрольні точки, викликані переповненнÑм файлів Ñегментів контрольних точок, з'ÑвлÑютьÑÑ Ñ‡Ð°Ñтіше ніж цей проміжок чаÑу. Ðуль вимикає попередженнÑ." -#: utils/misc/guc.c:2912 utils/misc/guc.c:3130 utils/misc/guc.c:3178 +#: utils/misc/guc_tables.c:2872 utils/misc/guc_tables.c:3090 +#: utils/misc/guc_tables.c:3144 msgid "Number of pages after which previously performed writes are flushed to disk." msgstr "ЧиÑло Ñторінок, піÑÐ»Ñ Ð´Ð¾ÑÑÐ³Ð½ÐµÐ½Ð½Ñ Ñкого раніше виконані операції запиÑу ÑкидаютьÑÑ Ð½Ð° диÑк." -#: utils/misc/guc.c:2923 +#: utils/misc/guc_tables.c:2883 msgid "Sets the number of disk-page buffers in shared memory for WAL." msgstr "Ð’Ñтановлює кількіÑть буферів диÑкових Ñторінок в Ñпільній пам'Ñті Ð´Ð»Ñ WAL." -#: utils/misc/guc.c:2934 +#: utils/misc/guc_tables.c:2884 +msgid "Specify -1 to have this value determined as a fraction of shared_buffers." +msgstr "Вкажіть -1, щоб це Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð°Ð»Ð¾ÑÑ Ñк чаÑтка shared_buffers." + +#: utils/misc/guc_tables.c:2894 msgid "Time between WAL flushes performed in the WAL writer." msgstr "Ð§Ð°Ñ Ð¼Ñ–Ð¶ ÑкиданнÑм WAL в процеÑÑ–, запиÑуючого WAL." -#: utils/misc/guc.c:2945 +#: utils/misc/guc_tables.c:2905 msgid "Amount of WAL written out by WAL writer that triggers a flush." msgstr "ОбÑÑг WAL, оброблений пишучим WAL процеÑом, при котрому ініціюєтьÑÑ ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ на диÑк." -#: utils/misc/guc.c:2956 +#: utils/misc/guc_tables.c:2916 msgid "Minimum size of new file to fsync instead of writing WAL." msgstr "Мінімальний розмір нового файлу Ð´Ð»Ñ fsync заміÑть запиÑÑƒÐ²Ð°Ð½Ð½Ñ WAL." -#: utils/misc/guc.c:2967 +#: utils/misc/guc_tables.c:2927 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "Ð’Ñтановлює макÑимальну кількіÑть одночаÑно працюючих процеÑів передачі WAL." -#: utils/misc/guc.c:2978 +#: utils/misc/guc_tables.c:2938 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "Ð’Ñтановлює макÑимальну кількіÑть одночаÑно визначених Ñлотів реплікації." -#: utils/misc/guc.c:2988 +#: utils/misc/guc_tables.c:2948 msgid "Sets the maximum WAL size that can be reserved by replication slots." msgstr "Ð’Ñтановлює макÑимальний розмір WAL, Ñкий може бути зарезервований Ñлотами реплікації." -#: utils/misc/guc.c:2989 +#: utils/misc/guc_tables.c:2949 msgid "Replication slots will be marked as failed, and segments released for deletion or recycling, if this much space is occupied by WAL on disk." msgstr "Слоти реплікації будуть позначені Ñк невдалі, Ñ– розблоковані Ñегменти Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ переробки, Ñкщо цю кількіÑть міÑÑ†Ñ Ð½Ð° диÑку займає WAL." -#: utils/misc/guc.c:3001 +#: utils/misc/guc_tables.c:2961 msgid "Sets the maximum time to wait for WAL replication." msgstr "Ð’Ñтановлює макÑимальний Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— WAL." -#: utils/misc/guc.c:3012 +#: utils/misc/guc_tables.c:2972 msgid "Sets the delay in microseconds between transaction commit and flushing WAL to disk." msgstr "Ð’Ñтановлює затримку в міліÑекундах між затвердженнÑм транзакцій Ñ– ÑкиданнÑм WAL на диÑк." -#: utils/misc/guc.c:3024 -msgid "Sets the minimum number of concurrent open transactions required before performing commit_delay." -msgstr "Ð’Ñтановлює мінімальну кількіÑть одночаÑно відкритих транзакцій, необхідних до Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ commit_delay." +#: utils/misc/guc_tables.c:2984 +msgid "Sets the minimum number of concurrent open transactions required before performing \"commit_delay\"." +msgstr "Ð’Ñтановлює мінімальну кількіÑть одночаÑно відкритих транзакцій, необхідних до Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ \"commit_delay\"." -#: utils/misc/guc.c:3035 +#: utils/misc/guc_tables.c:2995 msgid "Sets the number of digits displayed for floating-point values." msgstr "Ð’Ñтановлює кількіÑть виведених чиÑел Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ з плаваючою точкою." -#: utils/misc/guc.c:3036 +#: utils/misc/guc_tables.c:2996 msgid "This affects real, double precision, and geometric data types. A zero or negative parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate). Any value greater than zero selects precise output mode." msgstr "Це впливає на типи реальних, подвійної точноÑті та геометричних даних. Ðульове або від'ємне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ додаєтьÑÑ Ð´Ð¾ Ñтандартної кількоÑті цифр (FLT_DIG або DBL_DIG у відповідних випадках). Будь-Ñке Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð±Ñ–Ð»ÑŒÑˆÐµ нулÑ, обирає точний режим виводу." -#: utils/misc/guc.c:3048 +#: utils/misc/guc_tables.c:3008 msgid "Sets the minimum execution time above which a sample of statements will be logged. Sampling is determined by log_statement_sample_rate." msgstr "Ð’Ñтановлює мінімальний Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ, понад Ñкого вибірка тверджень буде запиÑуватиÑÑŒ. Вибірка визначаєтьÑÑ log_statement_sample_rate." -#: utils/misc/guc.c:3051 +#: utils/misc/guc_tables.c:3011 msgid "Zero logs a sample of all queries. -1 turns this feature off." msgstr "При 0 (нуль) фікÑує зразок вÑÑ–Ñ… запитів. -1 вимикає цю функцію." -#: utils/misc/guc.c:3061 +#: utils/misc/guc_tables.c:3021 msgid "Sets the minimum execution time above which all statements will be logged." msgstr "Ð’Ñтановлює мінімальний Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ, понад Ñкого вÑÑ– Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð±ÑƒÐ´ÑƒÑ‚ÑŒ запиÑуватиÑÑŒ." -#: utils/misc/guc.c:3063 +#: utils/misc/guc_tables.c:3023 msgid "Zero prints all queries. -1 turns this feature off." msgstr "При 0 (нуль) протоколюютьÑÑ Ð²ÑÑ– запити. -1 вимикає цю функцію." -#: utils/misc/guc.c:3073 +#: utils/misc/guc_tables.c:3033 msgid "Sets the minimum execution time above which autovacuum actions will be logged." msgstr "Ð’Ñтановлює мінімальний Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ñ‡Ð¸Ñтки, при перевищенні котрого Ñ†Ñ Ð´Ñ–Ñ Ñ„Ñ–ÐºÑуєтьÑÑ Ð² протоколі." -#: utils/misc/guc.c:3075 +#: utils/misc/guc_tables.c:3035 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "При 0 (нуль) протоколюютьÑÑ Ð²ÑÑ– дії автоочиÑтки. -1 вимикає Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ñ‡Ð¸Ñтки." -#: utils/misc/guc.c:3085 +#: utils/misc/guc_tables.c:3045 msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements." msgstr "Ð’Ñтановлює макÑимальну довжину в байтах даних, що реєÑтруютьÑÑ Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ параметрів під Ñ‡Ð°Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð²." -#: utils/misc/guc.c:3087 utils/misc/guc.c:3099 +#: utils/misc/guc_tables.c:3047 utils/misc/guc_tables.c:3059 msgid "-1 to print values in full." msgstr "-1 Ð´Ð»Ñ Ð´Ñ€ÑƒÐºÑƒ значень в повному виглÑді." -#: utils/misc/guc.c:3097 +#: utils/misc/guc_tables.c:3057 msgid "Sets the maximum length in bytes of data logged for bind parameter values when logging statements, on error." msgstr "Ð’Ñтановлює макÑимальну довжину в байтах, даних, що реєÑтруютьÑÑ Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ параметрів під Ñ‡Ð°Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð², у разі помилки." -#: utils/misc/guc.c:3109 +#: utils/misc/guc_tables.c:3069 msgid "Background writer sleep time between rounds." msgstr "Ð§Ð°Ñ Ð¿Ñ€Ð¸Ð·ÑƒÐ¿Ð¸Ð½ÐµÐ½Ð½Ñ Ð² процеÑÑ– фонового запиÑу між підходами." -#: utils/misc/guc.c:3120 +#: utils/misc/guc_tables.c:3080 msgid "Background writer maximum number of LRU pages to flush per round." msgstr "МакÑимальна кількіÑть LRU-Ñторінок, Ñкі ÑкидаютьÑÑ Ð·Ð° один підхід, в процеÑÑ– фонового запиÑу." -#: utils/misc/guc.c:3143 +#: utils/misc/guc_tables.c:3103 msgid "Number of simultaneous requests that can be handled efficiently by the disk subsystem." msgstr "КількіÑть одночаÑних запитів, Ñкі можуть бути ефективно оброблені диÑковою підÑиÑтемою." -#: utils/misc/guc.c:3161 -msgid "A variant of effective_io_concurrency that is used for maintenance work." -msgstr "Варіант effective_io_concurrency, що викориÑтовуєтьÑÑ Ð´Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ з обÑлуговуваннÑ." +#: utils/misc/guc_tables.c:3117 +msgid "A variant of \"effective_io_concurrency\" that is used for maintenance work." +msgstr "Варіант \"effective_io_concurrency\", що викориÑтовуєтьÑÑ Ð´Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ з обÑлуговуваннÑ." -#: utils/misc/guc.c:3191 +#: utils/misc/guc_tables.c:3132 +msgid "Limit on the size of data reads and writes." +msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° розмір Ð·Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° запиÑуваннÑ." + +#: utils/misc/guc_tables.c:3157 msgid "Maximum number of concurrent worker processes." msgstr "МакÑимальна кількіÑть одночаÑно працюючих процеÑів." -#: utils/misc/guc.c:3203 +#: utils/misc/guc_tables.c:3169 msgid "Maximum number of logical replication worker processes." msgstr "МакÑимальна кількіÑть працюючих процеÑів логічної реплікації." -#: utils/misc/guc.c:3215 +#: utils/misc/guc_tables.c:3181 msgid "Maximum number of table synchronization workers per subscription." msgstr "МакÑимальна кількіÑть процеÑів Ñинхронізації таблиць Ð´Ð»Ñ Ð¾Ð´Ð½Ñ–Ñ”Ñ— підпиÑки." -#: utils/misc/guc.c:3225 +#: utils/misc/guc_tables.c:3193 +msgid "Maximum number of parallel apply workers per subscription." +msgstr "МакÑимальна кількіÑть паралельних процеÑів при підпиÑці на одну підпиÑку." + +#: utils/misc/guc_tables.c:3203 msgid "Sets the amount of time to wait before forcing log file rotation." msgstr "Ð’Ñтановлює кількіÑть чаÑу Ð´Ð»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ журналу." -#: utils/misc/guc.c:3237 +#: utils/misc/guc_tables.c:3215 msgid "Sets the maximum size a log file can reach before being rotated." msgstr "Ð’Ñтановлює макÑимальний розмір файлу журналу, Ñкого він може доÑÑгнути, до ротації." -#: utils/misc/guc.c:3249 +#: utils/misc/guc_tables.c:3227 msgid "Shows the maximum number of function arguments." msgstr "Показує макÑимальну кількіÑть аргументів функції." -#: utils/misc/guc.c:3260 +#: utils/misc/guc_tables.c:3238 msgid "Shows the maximum number of index keys." msgstr "Показує макÑимальну кількіÑть ключів в індекÑÑ–." -#: utils/misc/guc.c:3271 +#: utils/misc/guc_tables.c:3249 msgid "Shows the maximum identifier length." msgstr "Показує макÑимальну довжину ідентифікатора." -#: utils/misc/guc.c:3282 +#: utils/misc/guc_tables.c:3260 msgid "Shows the size of a disk block." msgstr "Показує розмір диÑкового блоку." -#: utils/misc/guc.c:3293 +#: utils/misc/guc_tables.c:3271 msgid "Shows the number of pages per disk file." msgstr "Показує кількіÑть Ñторінок в одному диÑковому файлі." -#: utils/misc/guc.c:3304 +#: utils/misc/guc_tables.c:3282 msgid "Shows the block size in the write ahead log." msgstr "Показує розмір блоку в журналі WAL." -#: utils/misc/guc.c:3315 +#: utils/misc/guc_tables.c:3293 msgid "Sets the time to wait before retrying to retrieve WAL after a failed attempt." msgstr "Ð’Ñтановлює Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ повторною Ñпробою Ð·Ð²ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¾ WAL піÑÐ»Ñ Ð½ÐµÐ²Ð´Ð°Ñ‡Ñ–." -#: utils/misc/guc.c:3327 +#: utils/misc/guc_tables.c:3305 msgid "Shows the size of write ahead log segments." msgstr "Показує розмір Ñегментів WAL." -#: utils/misc/guc.c:3340 +#: utils/misc/guc_tables.c:3318 +msgid "Time for which WAL summary files should be kept." +msgstr "ЧаÑ, протÑгом Ñкого Ñлід зберігати зведені файли WAL." + +#: utils/misc/guc_tables.c:3331 msgid "Time to sleep between autovacuum runs." msgstr "Ð§Ð°Ñ Ð¿Ñ€Ð¸Ð·ÑƒÐ¿Ð¸Ð½ÐµÐ½Ð½Ñ Ð¼Ñ–Ð¶ запуÑками автоочиÑтки." -#: utils/misc/guc.c:3350 +#: utils/misc/guc_tables.c:3341 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "Мінімальна кількіÑть оновлень або видалень кортежів перед очиÑткою." -#: utils/misc/guc.c:3359 +#: utils/misc/guc_tables.c:3350 msgid "Minimum number of tuple inserts prior to vacuum, or -1 to disable insert vacuums." msgstr "Мінімальна кількіÑть вÑтавлених кортежів перед очищеннÑм, або -1 щоб вимкнути Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð²Ñтавки." -#: utils/misc/guc.c:3368 +#: utils/misc/guc_tables.c:3359 msgid "Minimum number of tuple inserts, updates, or deletes prior to analyze." msgstr "Мінімальна кількіÑть вÑтавлень, оновлень або видалень кортежів перед аналізом." -#: utils/misc/guc.c:3378 +#: utils/misc/guc_tables.c:3369 msgid "Age at which to autovacuum a table to prevent transaction ID wraparound." msgstr "Вік, при котрому необхідна автоочиÑтка таблиці Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½Ñ ID транзакцій." -#: utils/misc/guc.c:3390 +#: utils/misc/guc_tables.c:3381 msgid "Multixact age at which to autovacuum a table to prevent multixact wraparound." msgstr "Вік Multixact, при котрому необхідна автоочиÑтка таблиці Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð±Ñ–Ð³Ð°Ð½Ð½Ñ Ð·Ð°Ñ†Ð¸ÐºÐ»ÐµÐ½Ð½Ñ multixact." -#: utils/misc/guc.c:3400 +#: utils/misc/guc_tables.c:3391 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "Ð’Ñтановлює макÑимальну кількіÑть одночаÑно працюючих робочих процеÑів автоочиÑтки." -#: utils/misc/guc.c:3410 +#: utils/misc/guc_tables.c:3401 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "Ð’Ñтановлює макÑимальну кількіÑть паралельних процеÑів на одну операцію обÑлуговуваннÑ." -#: utils/misc/guc.c:3420 +#: utils/misc/guc_tables.c:3411 msgid "Sets the maximum number of parallel processes per executor node." msgstr "Ð’Ñтановлює макÑимальну кількіÑть паралельних процеÑів на вузол виконавцÑ." -#: utils/misc/guc.c:3431 +#: utils/misc/guc_tables.c:3422 msgid "Sets the maximum number of parallel workers that can be active at one time." msgstr "Ð’Ñтановлює макÑимальну кількіÑть паралельних процеÑів, Ñкі можуть бути активні в один момент." -#: utils/misc/guc.c:3442 +#: utils/misc/guc_tables.c:3433 msgid "Sets the maximum memory to be used by each autovacuum worker process." msgstr "Ð’Ñтановлює макÑимальний об'єм пам'Ñті Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ робочого процеÑу автоочиÑтки." -#: utils/misc/guc.c:3453 -msgid "Time before a snapshot is too old to read pages changed after the snapshot was taken." -msgstr "Термін, піÑÐ»Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ñ‚Ñ€Ð¾Ð³Ð¾ знімок вважаєтьÑÑ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ Ñтарим Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñторінок, змінених піÑÐ»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð½Ñ–Ð¼ÐºÑƒ." - -#: utils/misc/guc.c:3454 -msgid "A value of -1 disables this feature." -msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ -1 вимикає цю функцію." - -#: utils/misc/guc.c:3464 +#: utils/misc/guc_tables.c:3444 msgid "Time between issuing TCP keepalives." msgstr "Ð§Ð°Ñ Ð¼Ñ–Ð¶ видачею TCP keepalives." -#: utils/misc/guc.c:3465 utils/misc/guc.c:3476 utils/misc/guc.c:3600 +#: utils/misc/guc_tables.c:3445 utils/misc/guc_tables.c:3456 +#: utils/misc/guc_tables.c:3580 msgid "A value of 0 uses the system default." msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0 (нуль) викориÑтовує ÑиÑтему за замовчуваннÑм." -#: utils/misc/guc.c:3475 +#: utils/misc/guc_tables.c:3455 msgid "Time between TCP keepalive retransmits." msgstr "Ð§Ð°Ñ Ð¼Ñ–Ð¶ повтореннÑми TCP keepalive." -#: utils/misc/guc.c:3486 +#: utils/misc/guc_tables.c:3466 msgid "SSL renegotiation is no longer supported; this can only be 0." msgstr "Повторне ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ SSL більше не підтримуєтьÑÑ; єдине допуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ - 0 (нуль)." -#: utils/misc/guc.c:3497 +#: utils/misc/guc_tables.c:3477 msgid "Maximum number of TCP keepalive retransmits." msgstr "МакÑимальна кількіÑть повторень TCP keepalive." -#: utils/misc/guc.c:3498 -msgid "This controls the number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." -msgstr "Цей параметр визначає, Ñка кількіÑть поÑлідовних повторень keepalive може бути втрачена, перед тим Ñк Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ вважатиÑÑŒ \"мертвим\". Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0 (нуль) викориÑтовує ÑиÑтему за замовчуваннÑм." +#: utils/misc/guc_tables.c:3478 +msgid "Number of consecutive keepalive retransmits that can be lost before a connection is considered dead. A value of 0 uses the system default." +msgstr "КількіÑть поÑлідовних повторень keepalive може бути втрачена, перед тим Ñк Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð±ÑƒÐ´Ðµ вважатиÑÑŒ \"мертвим\". Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ 0 (нуль) викориÑтовує ÑиÑтему за замовчуваннÑм." -#: utils/misc/guc.c:3509 +#: utils/misc/guc_tables.c:3489 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "Ð’Ñтановлює макÑимально допуÑтимий результат Ð´Ð»Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ пошуку з викориÑтаннÑм GIN." -#: utils/misc/guc.c:3520 +#: utils/misc/guc_tables.c:3500 msgid "Sets the planner's assumption about the total size of the data caches." msgstr "Ð’Ñтановлює планувальнику припуÑтимий загальний розмір кешей даних." -#: utils/misc/guc.c:3521 +#: utils/misc/guc_tables.c:3501 msgid "That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each." msgstr "МаєтьÑÑ Ð½Ð° увазі загальний розмір кешей (кеша Ñдра Ñ– Ñпільних буферів), Ñкі викориÑтовуютьÑÑ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² даних PostgreSQL. Розмір задаєтьÑÑ Ð² диÑкових Ñторінках, звичайно це 8 КБ." -#: utils/misc/guc.c:3532 +#: utils/misc/guc_tables.c:3512 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "Ð’Ñтановлює мінімальний обÑÑг даних в таблиці Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ ÑкануваннÑ." -#: utils/misc/guc.c:3533 +#: utils/misc/guc_tables.c:3513 msgid "If the planner estimates that it will read a number of table pages too small to reach this limit, a parallel scan will not be considered." msgstr "Якщо планувальник вважає, що він прочитає меньше Ñторінок таблиці, ніж задано цим обмеженнÑм, паралельне ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ буде розглÑдатиÑÑŒ." -#: utils/misc/guc.c:3543 +#: utils/misc/guc_tables.c:3523 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "Ð’Ñтановлює мінімальний обÑÑг даних в індекÑÑ– Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ ÑкануваннÑ." -#: utils/misc/guc.c:3544 +#: utils/misc/guc_tables.c:3524 msgid "If the planner estimates that it will read a number of index pages too small to reach this limit, a parallel scan will not be considered." msgstr "Якщо планувальник вважає, що він прочитає меньше Ñторінок індекÑу, ніж задано цим обмеженнÑм, паралельне ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ буде розглÑдатиÑÑŒ." -#: utils/misc/guc.c:3555 +#: utils/misc/guc_tables.c:3535 msgid "Shows the server version as an integer." msgstr "Показує верÑÑ–ÑŽ Ñервера у виглÑді цілого чиÑла." -#: utils/misc/guc.c:3566 +#: utils/misc/guc_tables.c:3546 msgid "Log the use of temporary files larger than this number of kilobytes." msgstr "ЗапиÑує до журналу Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñовими файлами заданого розміру в КБ." -#: utils/misc/guc.c:3567 +#: utils/misc/guc_tables.c:3547 msgid "Zero logs all files. The default is -1 (turning this feature off)." msgstr "0 (нуль) фікÑує вÑÑ– файли. -1 вимикає цю функцію (за замовчуваннÑм)." -#: utils/misc/guc.c:3577 +#: utils/misc/guc_tables.c:3557 msgid "Sets the size reserved for pg_stat_activity.query, in bytes." msgstr "Ð’Ñтановлює розмір, зарезервований Ð´Ð»Ñ pg_stat_activity.query, в байтах." -#: utils/misc/guc.c:3588 +#: utils/misc/guc_tables.c:3568 msgid "Sets the maximum size of the pending list for GIN index." msgstr "Ð’Ñтановлює макÑимальний розмір ÑпиÑку-Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ GIN-індекÑу." -#: utils/misc/guc.c:3599 +#: utils/misc/guc_tables.c:3579 msgid "TCP user timeout." msgstr "Таймаут кориÑтувача TCP." -#: utils/misc/guc.c:3610 +#: utils/misc/guc_tables.c:3590 msgid "The size of huge page that should be requested." msgstr "Розмір величезної Ñторінки, Ñку необхідно затребувати." -#: utils/misc/guc.c:3621 +#: utils/misc/guc_tables.c:3601 msgid "Aggressively flush system caches for debugging purposes." msgstr "ÐгреÑивно Ñкидати ÑиÑтемні кеші Ð´Ð»Ñ Ñ†Ñ–Ð»ÐµÐ¹ налагодженнÑ." -#: utils/misc/guc.c:3644 +#: utils/misc/guc_tables.c:3624 msgid "Sets the time interval between checks for disconnection while running queries." msgstr "Ð’Ñтановлює інтервал чаÑу між перевірками Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð²." -#: utils/misc/guc.c:3655 +#: utils/misc/guc_tables.c:3635 msgid "Time between progress updates for long-running startup operations." msgstr "Ð§Ð°Ñ Ð¼Ñ–Ð¶ оновленнÑми прогреÑу Ð´Ð»Ñ Ð´Ð¾Ð²Ð³Ð¾Ñ‚Ñ€Ð¸Ð²Ð°ÑŽÑ‡Ð¸Ñ… операцій запуÑку." -#: utils/misc/guc.c:3657 +#: utils/misc/guc_tables.c:3637 msgid "0 turns this feature off." msgstr "0 вимикає цю функцію." -#: utils/misc/guc.c:3676 +#: utils/misc/guc_tables.c:3647 +msgid "Sets the iteration count for SCRAM secret generation." +msgstr "Ð’Ñтановлює кількіÑть ітерацій Ð´Ð»Ñ Ñекретного Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ SCRAM." + +#: utils/misc/guc_tables.c:3667 msgid "Sets the planner's estimate of the cost of a sequentially fetched disk page." msgstr "Ð’Ñтановлює Ð´Ð»Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸ÐºÐ° орієнтир вартоÑті поÑлідовного Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¸Ñкових Ñторінок." -#: utils/misc/guc.c:3687 +#: utils/misc/guc_tables.c:3678 msgid "Sets the planner's estimate of the cost of a nonsequentially fetched disk page." msgstr "Ð’Ñтановлює Ð´Ð»Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸ÐºÐ° орієнтир вартоÑті непоÑлідовного Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð´Ð¸Ñкових Ñторінок." -#: utils/misc/guc.c:3698 +#: utils/misc/guc_tables.c:3689 msgid "Sets the planner's estimate of the cost of processing each tuple (row)." msgstr "Ð’Ñтановлює Ð´Ð»Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸ÐºÐ° орієнтир вартоÑті обробки кожного кортежу (Ñ€Ñдка)." -#: utils/misc/guc.c:3709 +#: utils/misc/guc_tables.c:3700 msgid "Sets the planner's estimate of the cost of processing each index entry during an index scan." msgstr "Ð’Ñтановлює Ð´Ð»Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸ÐºÐ° орієнтир вартоÑті обробки кожного елементу індекÑа під Ñ‡Ð°Ñ ÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу." -#: utils/misc/guc.c:3720 +#: utils/misc/guc_tables.c:3711 msgid "Sets the planner's estimate of the cost of processing each operator or function call." msgstr "Ð’Ñтановлює Ð´Ð»Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸ÐºÐ° орієнтир вартоÑті обробки кожного оператора або виклику функції." -#: utils/misc/guc.c:3731 +#: utils/misc/guc_tables.c:3722 msgid "Sets the planner's estimate of the cost of passing each tuple (row) from worker to leader backend." msgstr "Ð’Ñтановлює Ð´Ð»Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸ÐºÐ° приблизну вартіÑть Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ кортежу (Ñ€Ñдка) від робочого процеÑу вихідному процеÑу." -#: utils/misc/guc.c:3742 +#: utils/misc/guc_tables.c:3733 msgid "Sets the planner's estimate of the cost of starting up worker processes for parallel query." msgstr "Ð’Ñтановлює Ð´Ð»Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸ÐºÐ° орієнтир вартоÑті запуÑку робочих процеÑів Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ запиту." -#: utils/misc/guc.c:3754 +#: utils/misc/guc_tables.c:3745 msgid "Perform JIT compilation if query is more expensive." msgstr "Якщо запит дорожчий, виконуєтьÑÑ JIT-компілÑціÑ." -#: utils/misc/guc.c:3755 +#: utils/misc/guc_tables.c:3746 msgid "-1 disables JIT compilation." msgstr "-1 вимикає JIT-компілÑцію." -#: utils/misc/guc.c:3765 +#: utils/misc/guc_tables.c:3756 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "Оптимізувати функції JIT-compiled, Ñкщо запит дорожчий." -#: utils/misc/guc.c:3766 +#: utils/misc/guc_tables.c:3757 msgid "-1 disables optimization." msgstr "-1 вимикає оптимізацію." -#: utils/misc/guc.c:3776 +#: utils/misc/guc_tables.c:3767 msgid "Perform JIT inlining if query is more expensive." msgstr "Якщо запит дорожчий, виконуєтьÑÑ Ð²Ð±ÑƒÐ´Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ JIT." -#: utils/misc/guc.c:3777 +#: utils/misc/guc_tables.c:3768 msgid "-1 disables inlining." msgstr "-1 вимикає вбудовуваннÑ." -#: utils/misc/guc.c:3787 +#: utils/misc/guc_tables.c:3778 msgid "Sets the planner's estimate of the fraction of a cursor's rows that will be retrieved." msgstr "Ð’Ñтановлює Ð´Ð»Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸ÐºÐ° орієнтир чаÑтки необхідних Ñ€Ñдків курÑора в загальній кількоÑті." -#: utils/misc/guc.c:3799 +#: utils/misc/guc_tables.c:3790 msgid "Sets the planner's estimate of the average size of a recursive query's working table." msgstr "Ð’Ñтановлює Ð´Ð»Ñ Ð¿Ð»Ð°Ð½ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¸ÐºÐ° орієнтир Ñереднього розміру робочої таблиці рекурÑивного запиту." -#: utils/misc/guc.c:3811 +#: utils/misc/guc_tables.c:3802 msgid "GEQO: selective pressure within the population." msgstr "GEQO: вибірковий тиÑк в популÑції." -#: utils/misc/guc.c:3822 +#: utils/misc/guc_tables.c:3813 msgid "GEQO: seed for random path selection." msgstr "GEQO: відправна Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¾Ð²Ð¾Ð³Ð¾ вибору шлÑху." -#: utils/misc/guc.c:3833 -msgid "Multiple of work_mem to use for hash tables." -msgstr "Декілька work_mem Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð³ÐµÑˆ-таблиць." +#: utils/misc/guc_tables.c:3824 +msgid "Multiple of \"work_mem\" to use for hash tables." +msgstr "Декілька \"work_mem\" Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñ…ÐµÑˆ-таблиць." -#: utils/misc/guc.c:3844 +#: utils/misc/guc_tables.c:3835 msgid "Multiple of the average buffer usage to free per round." msgstr "Множник Ð´Ð»Ñ Ñередньої кількоÑті викориÑтаних буферів, Ñкий визначає кількіÑть буферів, Ñкі звільнÑютьÑÑ Ð·Ð° один підхід." -#: utils/misc/guc.c:3854 +#: utils/misc/guc_tables.c:3845 msgid "Sets the seed for random-number generation." msgstr "Ð’Ñтановлює відправне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° випадкових чиÑел." -#: utils/misc/guc.c:3865 +#: utils/misc/guc_tables.c:3856 msgid "Vacuum cost delay in milliseconds." msgstr "Затримка вартоÑті очиÑтки в міліÑекундах." -#: utils/misc/guc.c:3876 +#: utils/misc/guc_tables.c:3867 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "Затримка вартоÑті очиÑтки в міліÑекундах, Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¾Ñ‡Ð¸Ñтки." -#: utils/misc/guc.c:3887 +#: utils/misc/guc_tables.c:3878 msgid "Number of tuple updates or deletes prior to vacuum as a fraction of reltuples." msgstr "КількіÑть оновлень або видалень кортежів до reltuples, Ñка визначає потребу в очиÑтці." -#: utils/misc/guc.c:3897 +#: utils/misc/guc_tables.c:3888 msgid "Number of tuple inserts prior to vacuum as a fraction of reltuples." msgstr "КількіÑть вÑтавлень кортежів до reltuples, Ñка визначає потребу в очиÑтці." -#: utils/misc/guc.c:3907 +#: utils/misc/guc_tables.c:3898 msgid "Number of tuple inserts, updates, or deletes prior to analyze as a fraction of reltuples." msgstr "КількіÑть вÑтавлень, оновлень або видалень кортежів до reltuples, Ñка визначає потребу в аналізі." -#: utils/misc/guc.c:3917 +#: utils/misc/guc_tables.c:3908 msgid "Time spent flushing dirty buffers during checkpoint, as fraction of checkpoint interval." msgstr "Ð§Ð°Ñ Ñ‚Ñ€Ð¸Ð²Ð°Ð»Ð¾Ñті Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ \"брудних\" буферів під Ñ‡Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки до інтервалу контрольних точок." -#: utils/misc/guc.c:3927 -msgid "Fraction of statements exceeding log_min_duration_sample to be logged." -msgstr "ЧаÑтка тверджень, перевищує log_min_duration_sample, що підлÑгає запиÑу." +#: utils/misc/guc_tables.c:3918 +msgid "Fraction of statements exceeding \"log_min_duration_sample\" to be logged." +msgstr "ЧаÑтка тверджень, перевищує \"log_min_duration_sample\", що підлÑгає запиÑу." -#: utils/misc/guc.c:3928 +#: utils/misc/guc_tables.c:3919 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." msgstr "ВикориÑтайте Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ñ–Ð¶ 0.0 (ніколи не запиÑувати) Ñ– 1.0 (завжди запиÑувати)." -#: utils/misc/guc.c:3937 +#: utils/misc/guc_tables.c:3928 msgid "Sets the fraction of transactions from which to log all statements." msgstr "Ð’Ñтановлює чаÑтину транзакцій, від Ñких необхідно журналювати вÑÑ– команди." -#: utils/misc/guc.c:3938 +#: utils/misc/guc_tables.c:3929 msgid "Use a value between 0.0 (never log) and 1.0 (log all statements for all transactions)." msgstr "ВикориÑтайте Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ñ–Ð¶ 0.0 (ніколи не запиÑувати) Ñ– 1.0 (запиÑувати вÑÑ– команди Ð´Ð»Ñ Ð²ÑÑ–Ñ… транзакцій)." -#: utils/misc/guc.c:3957 +#: utils/misc/guc_tables.c:3948 msgid "Sets the shell command that will be called to archive a WAL file." msgstr "Ð’Ñтановлює команду оболонки, Ñка буде викликатиÑÑŒ Ð´Ð»Ñ Ð°Ñ€Ñ…Ñ–Ð²Ð°Ñ†Ñ–Ñ— файлу WAL." -#: utils/misc/guc.c:3958 +#: utils/misc/guc_tables.c:3949 msgid "This is used only if \"archive_library\" is not set." msgstr "Це викориÑтовуєтьÑÑ Ð»Ð¸ÑˆÐµ, Ñкщо \"archive_library\" не вÑтановлено." -#: utils/misc/guc.c:3967 +#: utils/misc/guc_tables.c:3958 msgid "Sets the library that will be called to archive a WAL file." msgstr "Ð’Ñтановлює бібліотеку, Ñка буде викликана Ð´Ð»Ñ Ð°Ñ€Ñ…Ñ–Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ WAL." -#: utils/misc/guc.c:3968 +#: utils/misc/guc_tables.c:3959 msgid "An empty string indicates that \"archive_command\" should be used." msgstr "Порожній Ñ€Ñдок вказує на те, що Ñлід викориÑтовувати \"archive_command\"." -#: utils/misc/guc.c:3977 +#: utils/misc/guc_tables.c:3968 msgid "Sets the shell command that will be called to retrieve an archived WAL file." msgstr "Ð’Ñтановлює команду оболонки, Ñка буде викликана Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ файлу WAL." -#: utils/misc/guc.c:3987 +#: utils/misc/guc_tables.c:3978 msgid "Sets the shell command that will be executed at every restart point." msgstr "Ð’Ñтановлює команду оболонки, Ñка буде виконуватиÑÑ Ð² кожній точці перезапуÑку." -#: utils/misc/guc.c:3997 +#: utils/misc/guc_tables.c:3988 msgid "Sets the shell command that will be executed once at the end of recovery." msgstr "Ð’Ñтановлює команду оболонки, Ñка буде виконуватиÑÑ Ð¾Ð´Ð¸Ð½ раз в кінці відновленнÑ." -#: utils/misc/guc.c:4007 +#: utils/misc/guc_tables.c:3998 msgid "Specifies the timeline to recover into." msgstr "Вказує лінію чаÑу Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: utils/misc/guc.c:4017 +#: utils/misc/guc_tables.c:4008 msgid "Set to \"immediate\" to end recovery as soon as a consistent state is reached." msgstr "Ð’Ñтановіть на \"негайно\" щоб закінчити Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñк тільки буде доÑÑгнуто узгодженого Ñтану." -#: utils/misc/guc.c:4026 +#: utils/misc/guc_tables.c:4017 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "Ð’Ñтановлює ідентифікатор транзакції, до Ñкої буде продовжуватиÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: utils/misc/guc.c:4035 +#: utils/misc/guc_tables.c:4026 msgid "Sets the time stamp up to which recovery will proceed." msgstr "Ð’Ñтановлює позначку чаÑу, до Ñкої буде продовжуватиÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: utils/misc/guc.c:4044 +#: utils/misc/guc_tables.c:4035 msgid "Sets the named restore point up to which recovery will proceed." msgstr "Ð’Ñтановлює назву точки відновленнÑ, до Ñкої буде продовжуватиÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: utils/misc/guc.c:4053 +#: utils/misc/guc_tables.c:4044 msgid "Sets the LSN of the write-ahead log location up to which recovery will proceed." msgstr "Ð’Ñтановлює номер LSN Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð¿ÐµÑ€ÐµÐ´Ð¶ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ журналюваннÑ, до Ñкого буде продовжуватиÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: utils/misc/guc.c:4063 -msgid "Specifies a file name whose presence ends recovery in the standby." -msgstr "Вказує назву файлу, наÑвніÑть Ñкого закінчує Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð² режимі очікуваннÑ." - -#: utils/misc/guc.c:4073 +#: utils/misc/guc_tables.c:4054 msgid "Sets the connection string to be used to connect to the sending server." msgstr "Ð’Ñтановлює Ñ€Ñдок Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñкий буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Ñерверу надÑиланнÑ." -#: utils/misc/guc.c:4084 +#: utils/misc/guc_tables.c:4065 msgid "Sets the name of the replication slot to use on the sending server." msgstr "Ð’Ñтановлює назву Ñлота реплікації, Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð½Ð° Ñервері надÑиланнÑ." -#: utils/misc/guc.c:4094 +#: utils/misc/guc_tables.c:4075 msgid "Sets the client's character set encoding." msgstr "Ð’Ñтановлює ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñимволів, викориÑтовуване клієнтом." -#: utils/misc/guc.c:4105 +#: utils/misc/guc_tables.c:4086 msgid "Controls information prefixed to each log line." msgstr "Визначає інформацію префікÑа кожного Ñ€Ñдка протокола." -#: utils/misc/guc.c:4106 +#: utils/misc/guc_tables.c:4087 msgid "If blank, no prefix is used." msgstr "При пуÑтому значенні, Ð¿Ñ€ÐµÑ„Ñ–ÐºÑ Ñ‚Ð°ÐºÐ¾Ð¶ відÑутній." -#: utils/misc/guc.c:4115 +#: utils/misc/guc_tables.c:4096 msgid "Sets the time zone to use in log messages." msgstr "Ð’Ñтановлює чаÑовий поÑÑ Ð´Ð»Ñ Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‡Ð°Ñу в повідомленÑÑ… протокола." -#: utils/misc/guc.c:4125 +#: utils/misc/guc_tables.c:4106 msgid "Sets the display format for date and time values." msgstr "Ð’Ñтановлює формат Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ чаÑу Ñ– дат." -#: utils/misc/guc.c:4126 +#: utils/misc/guc_tables.c:4107 msgid "Also controls interpretation of ambiguous date inputs." msgstr "Також визначає багатозначні задані дати, Ñкі вводÑтьÑÑ." -#: utils/misc/guc.c:4137 +#: utils/misc/guc_tables.c:4118 msgid "Sets the default table access method for new tables." msgstr "Ð’Ñтановлює метод доÑтупу до таблиці за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… таблиць." -#: utils/misc/guc.c:4148 +#: utils/misc/guc_tables.c:4129 msgid "Sets the default tablespace to create tables and indexes in." msgstr "Ð’Ñтановлює табличний проÑтір за замовчуваннÑм, Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ Ñ– індекÑів." -#: utils/misc/guc.c:4149 +#: utils/misc/guc_tables.c:4130 msgid "An empty string selects the database's default tablespace." msgstr "ПуÑтий Ñ€Ñдок вибирає табличний проÑтір за замовчуваннÑм бази даних." -#: utils/misc/guc.c:4159 +#: utils/misc/guc_tables.c:4140 msgid "Sets the tablespace(s) to use for temporary tables and sort files." msgstr "Ð’Ñтановлює табличний проÑтір(проÑтори) Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð² тимчаÑових таблицÑÑ… Ñ– файлах ÑортуваннÑ." -#: utils/misc/guc.c:4170 +#: utils/misc/guc_tables.c:4151 +msgid "Sets whether a CREATEROLE user automatically grants the role to themselves, and with which options." +msgstr "Задає, чи буде кориÑтувач CREATEROLE автоматично призначати Ñобі цю роль Ñ– з Ñкими параметрами." + +#: utils/misc/guc_tables.c:4163 msgid "Sets the path for dynamically loadable modules." msgstr "Ð’Ñтановлює шлÑÑ… Ð´Ð»Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾ завантажуваних модулів." -#: utils/misc/guc.c:4171 +#: utils/misc/guc_tables.c:4164 msgid "If a dynamically loadable module needs to be opened and the specified name does not have a directory component (i.e., the name does not contain a slash), the system will search this path for the specified file." msgstr "Якщо динамічно завантажений модуль потрібно відкрити Ñ– у вказаному імені немає компонента каталогу (наприклад, ім'Ñ Ð½Ðµ міÑтить Ñимвол \"/\"), ÑиÑтема буде шукати цей шлÑÑ… у вказаному файлі." -#: utils/misc/guc.c:4184 +#: utils/misc/guc_tables.c:4177 msgid "Sets the location of the Kerberos server key file." msgstr "Ð’Ñтановлює Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ з ключем Kerberos Ð´Ð»Ñ Ð´Ð°Ð½Ð¾Ð³Ð¾ Ñервера." -#: utils/misc/guc.c:4195 +#: utils/misc/guc_tables.c:4188 msgid "Sets the Bonjour service name." msgstr "Ð’Ñтановлює ім'Ñ Ñлужби Bonjour." -#: utils/misc/guc.c:4207 -msgid "Shows the collation order locale." -msgstr "Показує порÑдок локалізації параметра ÑортуваннÑ." - -#: utils/misc/guc.c:4218 -msgid "Shows the character classification and case conversion locale." -msgstr "Показує клаÑифікацію Ñимволу Ñ– Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ—." - -#: utils/misc/guc.c:4229 +#: utils/misc/guc_tables.c:4198 msgid "Sets the language in which messages are displayed." msgstr "Ð’Ñтановлює мову виведених повідомлень." -#: utils/misc/guc.c:4239 +#: utils/misc/guc_tables.c:4208 msgid "Sets the locale for formatting monetary amounts." msgstr "Ð’Ñтановлює локалізацію Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ñ€Ð¾ÑˆÐ¾Ð²Ð¸Ñ… Ñум." -#: utils/misc/guc.c:4249 +#: utils/misc/guc_tables.c:4218 msgid "Sets the locale for formatting numbers." msgstr "Ð’Ñтановлює локалізацію Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‡Ð¸Ñел." -#: utils/misc/guc.c:4259 +#: utils/misc/guc_tables.c:4228 msgid "Sets the locale for formatting date and time values." msgstr "Ð’Ñтановлює локалізацію Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ дати Ñ– чаÑу." -#: utils/misc/guc.c:4269 +#: utils/misc/guc_tables.c:4238 msgid "Lists shared libraries to preload into each backend." msgstr "СпиÑок Ñпільних бібліотек, попередньо завантажених до кожного внутрішнього Ñерверу." -#: utils/misc/guc.c:4280 +#: utils/misc/guc_tables.c:4249 msgid "Lists shared libraries to preload into server." msgstr "СпиÑок Ñпільних бібліотек, попередньо завантажених до Ñерверу." -#: utils/misc/guc.c:4291 +#: utils/misc/guc_tables.c:4260 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "СпиÑок непривілейованих Ñпільних бібліотек, попередньо завантажених до кожного внутрішнього Ñерверу." -#: utils/misc/guc.c:4302 +#: utils/misc/guc_tables.c:4271 msgid "Sets the schema search order for names that are not schema-qualified." msgstr "Ð’Ñтановлює порÑдок пошуку Ñхеми Ð´Ð»Ñ Ñ–Ð¼ÐµÐ½, Ñкі не Ñ” Ñхемо-кваліфікованими." -#: utils/misc/guc.c:4314 +#: utils/misc/guc_tables.c:4283 msgid "Shows the server (database) character set encoding." msgstr "Показує набір Ñимволів ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера (бази даних)." -#: utils/misc/guc.c:4326 +#: utils/misc/guc_tables.c:4295 msgid "Shows the server version." msgstr "Показує верÑÑ–ÑŽ Ñервера." -#: utils/misc/guc.c:4338 +#: utils/misc/guc_tables.c:4307 msgid "Sets the current role." msgstr "Ð’Ñтановлює чинну роль." -#: utils/misc/guc.c:4350 +#: utils/misc/guc_tables.c:4319 msgid "Sets the session user name." msgstr "Ð’Ñтановлює ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача в ÑеанÑÑ–." -#: utils/misc/guc.c:4361 +#: utils/misc/guc_tables.c:4330 msgid "Sets the destination for server log output." msgstr "Ð’Ñтановлює, куди буде виводитиÑÑ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð» Ñерверу." -#: utils/misc/guc.c:4362 +#: utils/misc/guc_tables.c:4331 msgid "Valid values are combinations of \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", and \"eventlog\", depending on the platform." msgstr "ДійÑні Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ - це комбінації \"stderr\", \"syslog\", \"csvlog\", \"jsonlog\", Ñ– \"eventlog\", в залежноÑті від платформи." -#: utils/misc/guc.c:4373 +#: utils/misc/guc_tables.c:4342 msgid "Sets the destination directory for log files." msgstr "Ð’Ñтановлює каталог Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² журналу." -#: utils/misc/guc.c:4374 +#: utils/misc/guc_tables.c:4343 msgid "Can be specified as relative to the data directory or as absolute path." msgstr "ШлÑÑ… може бути абÑолютним або вказуватиÑÑ Ð²Ñ–Ð´Ð½Ð¾Ñно каталогу даних." -#: utils/misc/guc.c:4384 +#: utils/misc/guc_tables.c:4353 msgid "Sets the file name pattern for log files." msgstr "Ð’Ñтановлює шаблон імені Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² журналу." -#: utils/misc/guc.c:4395 +#: utils/misc/guc_tables.c:4364 msgid "Sets the program name used to identify PostgreSQL messages in syslog." msgstr "Ð’Ñтановлює ім'Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— повідомлень PostgreSQL в syslog." -#: utils/misc/guc.c:4406 +#: utils/misc/guc_tables.c:4375 msgid "Sets the application name used to identify PostgreSQL messages in the event log." msgstr "Ð’Ñтановлює ім'Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ Ð´Ð»Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— повідомлень PostgreSQL в журналі подій." -#: utils/misc/guc.c:4417 +#: utils/misc/guc_tables.c:4386 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "Ð’Ñтановлює чаÑовий поÑÑ Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð° інтерпретації позначок чаÑу." -#: utils/misc/guc.c:4427 +#: utils/misc/guc_tables.c:4396 msgid "Selects a file of time zone abbreviations." msgstr "Вибирає файл з Ñкороченими іменами чаÑових поÑÑів." -#: utils/misc/guc.c:4437 +#: utils/misc/guc_tables.c:4406 msgid "Sets the owning group of the Unix-domain socket." msgstr "Ð’Ñтановлює відповідальну групу Unix-Ñокету." -#: utils/misc/guc.c:4438 +#: utils/misc/guc_tables.c:4407 msgid "The owning user of the socket is always the user that starts the server." msgstr "Відповідальний кориÑтувач Ñокету це завжди той кориÑтувач Ñкий запуÑтив Ñервер." -#: utils/misc/guc.c:4448 +#: utils/misc/guc_tables.c:4417 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Ð’Ñтановлює каталоги, де будуть ÑтворюватиÑÑŒ Unix-Ñокети." -#: utils/misc/guc.c:4463 +#: utils/misc/guc_tables.c:4428 msgid "Sets the host name or IP address(es) to listen to." msgstr "Ð’Ñтановлює ім'Ñ Ñ…Ð¾Ñту або IP-адреÑу Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð²'Ñзки." -#: utils/misc/guc.c:4478 +#: utils/misc/guc_tables.c:4443 msgid "Sets the server's data directory." msgstr "Ð’Ñтановлює каталог даних Ñерверу." -#: utils/misc/guc.c:4489 +#: utils/misc/guc_tables.c:4454 msgid "Sets the server's main configuration file." msgstr "Ð’Ñтановлює оÑновний файл конфігурації Ñерверу." -#: utils/misc/guc.c:4500 +#: utils/misc/guc_tables.c:4465 msgid "Sets the server's \"hba\" configuration file." msgstr "Ð’Ñтановлює \"hba\" файл конфігурації Ñерверу." -#: utils/misc/guc.c:4511 +#: utils/misc/guc_tables.c:4476 msgid "Sets the server's \"ident\" configuration file." msgstr "Ð’Ñтановлює \"ident\" файл конфігурації Ñерверу." -#: utils/misc/guc.c:4522 +#: utils/misc/guc_tables.c:4487 msgid "Writes the postmaster PID to the specified file." msgstr "ЗапиÑує ідентифікатор процеÑу (PID) postmaster у вказаний файл." -#: utils/misc/guc.c:4533 +#: utils/misc/guc_tables.c:4498 msgid "Shows the name of the SSL library." msgstr "Показує назву бібліотеки SSL." -#: utils/misc/guc.c:4548 +#: utils/misc/guc_tables.c:4513 msgid "Location of the SSL server certificate file." msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° Ñертифікату Ñервера Ð´Ð»Ñ SSL." -#: utils/misc/guc.c:4558 +#: utils/misc/guc_tables.c:4523 msgid "Location of the SSL server private key file." msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° з закритим ключем Ñервера Ð´Ð»Ñ SSL." -#: utils/misc/guc.c:4568 +#: utils/misc/guc_tables.c:4533 msgid "Location of the SSL certificate authority file." msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° центру Ñертифікації Ð´Ð»Ñ SSL." -#: utils/misc/guc.c:4578 +#: utils/misc/guc_tables.c:4543 msgid "Location of the SSL certificate revocation list file." msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° зі ÑпиÑком відкликаних Ñертфікатів Ð´Ð»Ñ SSL." -#: utils/misc/guc.c:4588 +#: utils/misc/guc_tables.c:4553 msgid "Location of the SSL certificate revocation list directory." msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ ÑпиÑку відкликаних Ñертифікатів SSL." -#: utils/misc/guc.c:4598 +#: utils/misc/guc_tables.c:4563 msgid "Number of synchronous standbys and list of names of potential synchronous ones." msgstr "КількіÑть потенційно Ñинхронних режимів Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ– ÑпиÑок Ñ—Ñ… імен." -#: utils/misc/guc.c:4609 +#: utils/misc/guc_tables.c:4574 msgid "Sets default text search configuration." msgstr "Ð’Ñтановлює конфігурацію текÑтового пошуку за замовчуваннÑм." -#: utils/misc/guc.c:4619 +#: utils/misc/guc_tables.c:4584 msgid "Sets the list of allowed SSL ciphers." msgstr "Ð’Ñтановлює ÑпиÑок дозволених шифрів Ð´Ð»Ñ SSL." -#: utils/misc/guc.c:4634 +#: utils/misc/guc_tables.c:4599 msgid "Sets the curve to use for ECDH." msgstr "Ð’Ñтановлює криву Ð´Ð»Ñ ECDH." -#: utils/misc/guc.c:4649 +#: utils/misc/guc_tables.c:4614 msgid "Location of the SSL DH parameters file." msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° з параметрами SSL DH." -#: utils/misc/guc.c:4660 +#: utils/misc/guc_tables.c:4625 msgid "Command to obtain passphrases for SSL." msgstr "Команда, що дозволÑÑ” отримати парольну фразу Ð´Ð»Ñ SSL." -#: utils/misc/guc.c:4671 +#: utils/misc/guc_tables.c:4636 msgid "Sets the application name to be reported in statistics and logs." msgstr "Ð’Ñтановлює ім'Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸, Ñке буде повідомлÑтиÑÑŒ у ÑтатиÑтиці Ñ– протоколах." -#: utils/misc/guc.c:4682 +#: utils/misc/guc_tables.c:4647 msgid "Sets the name of the cluster, which is included in the process title." msgstr "Ð’Ñтановлює ім'Ñ ÐºÐ»Ð°Ñтеру, Ñке буде включене до заголовка процеÑу." -#: utils/misc/guc.c:4693 +#: utils/misc/guc_tables.c:4658 msgid "Sets the WAL resource managers for which WAL consistency checks are done." msgstr "Ð’Ñтановлює менеджерів реÑурÑу WAL, Ð´Ð»Ñ Ñких виконано перевірки узгодженоÑті WAL." -#: utils/misc/guc.c:4694 +#: utils/misc/guc_tables.c:4659 msgid "Full-page images will be logged for all data blocks and cross-checked against the results of WAL replay." msgstr "При цьому до журналу будуть запиÑуватиÑÑŒ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð½Ð¸Ñ…Ñ Ñторінок Ð´Ð»Ñ Ð²ÑÑ–Ñ… блоків даних Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ з результатами Ð²Ñ–Ð´Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ WAL." -#: utils/misc/guc.c:4704 +#: utils/misc/guc_tables.c:4669 msgid "JIT provider to use." msgstr "ВикориÑтовувати провайдер JIT." -#: utils/misc/guc.c:4715 +#: utils/misc/guc_tables.c:4680 msgid "Log backtrace for errors in these functions." msgstr "ВідÑтежувати запиÑи помилок у ціх функціÑÑ…." -#: utils/misc/guc.c:4735 +#: utils/misc/guc_tables.c:4691 +msgid "Use direct I/O for file access." +msgstr "ВикориÑтовувати прÑмий ввід Ð´Ð»Ñ Ð´Ð¾Ñтупу до файлу." + +#: utils/misc/guc_tables.c:4702 +msgid "Lists streaming replication standby server replication slot names that logical WAL sender processes will wait for." +msgstr "Відображає ÑпиÑок імен Ñлотів реплікації, Ñкі очікують процеÑу логічного відправника WAL." + +#: utils/misc/guc_tables.c:4704 +msgid "Logical WAL sender processes will send decoded changes to output plugins only after the specified replication slots have confirmed receiving WAL." +msgstr "Логічні процеÑи відправки WAL будуть відправлÑти декодовані зміни до плагінів виводу лише піÑÐ»Ñ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼ÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¸Ñ… Ñлотів реплікації (WAL)." + +#: utils/misc/guc_tables.c:4716 +msgid "Prohibits access to non-system relations of specified kinds." +msgstr "ЗаборонÑÑ” доÑтуп до неÑиÑтемних відноÑин вказаних типів." + +#: utils/misc/guc_tables.c:4736 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "Ð’Ñтановлює, чи дозволене викориÑÑ‚Ð°Ð½Ð½Ñ \"\\\" в текÑтових Ñ€Ñдках." -#: utils/misc/guc.c:4745 +#: utils/misc/guc_tables.c:4746 msgid "Sets the output format for bytea." msgstr "Ð’Ñтановлює формат виводу Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ bytea." -#: utils/misc/guc.c:4755 +#: utils/misc/guc_tables.c:4756 msgid "Sets the message levels that are sent to the client." msgstr "Ð’Ñтановлює рівень повідомлень, переданих клієнту." -#: utils/misc/guc.c:4756 utils/misc/guc.c:4842 utils/misc/guc.c:4853 -#: utils/misc/guc.c:4929 -msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." -msgstr "Кожен рівень включає вÑÑ– наÑтупні рівні. Чим вище рівень, тим менше повідомлень надіÑлано." - -#: utils/misc/guc.c:4766 -msgid "Enables in-core computation of query identifiers." -msgstr "Вмикає внутрішнє обчиÑÐ»ÐµÐ½Ð½Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ñ–Ð² запиту." - -#: utils/misc/guc.c:4776 -msgid "Enables the planner to use constraints to optimize queries." -msgstr "Дає змогу планувальнику оптимізувати запити, викориÑтовуючи обмеженнÑ." - -#: utils/misc/guc.c:4777 -msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." -msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– буде пропущено, Ñкщо Ñ—Ñ— Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð³Ð°Ñ€Ð°Ð½Ñ‚ÑƒÑŽÑ‚ÑŒ, що запиту не відповідають ніÑкі Ñ€Ñдки." - -#: utils/misc/guc.c:4788 -msgid "Sets the default compression method for compressible values." -msgstr "Ð’Ñтановлює метод ÑтиÑÐºÐ°Ð½Ð½Ñ Ð·Ð° замовчуваннÑм Ð´Ð»Ñ ÑтиÑливих значень." - -#: utils/misc/guc.c:4799 -msgid "Sets the transaction isolation level of each new transaction." -msgstr "Ð’Ñтановлює рівень ізолÑції транзакції Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ— нової транзакції." - -#: utils/misc/guc.c:4809 -msgid "Sets the current transaction's isolation level." -msgstr "Ð’Ñтановлює чинний рівень ізолÑції транзакцій." - -#: utils/misc/guc.c:4820 -msgid "Sets the display format for interval values." -msgstr "Ð’Ñтановлює формат Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ–Ñ… значень." - -#: utils/misc/guc.c:4831 -msgid "Sets the verbosity of logged messages." -msgstr "Ð’Ñтановлює детальніÑть повідомлень, Ñкі протоколюютьÑÑ." - -#: utils/misc/guc.c:4841 -msgid "Sets the message levels that are logged." -msgstr "Ð’Ñтанолвює рівні повідомлень, Ñкі протоколюютьÑÑ." - -#: utils/misc/guc.c:4852 -msgid "Causes all statements generating error at or above this level to be logged." -msgstr "Вмикає Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²ÑÑ–Ñ… операторів, виконаних з помилкою цього або вище рівнÑ." - -#: utils/misc/guc.c:4863 -msgid "Sets the type of statements logged." -msgstr "Ð’Ñтановлює тип операторів, Ñкі протоколюютьÑÑ." - -#: utils/misc/guc.c:4873 -msgid "Sets the syslog \"facility\" to be used when syslog enabled." -msgstr "Ð’Ñтановлює отримувача повідомлень, Ñкі відправлÑютьÑÑ Ð´Ð¾ syslog." - -#: utils/misc/guc.c:4888 -msgid "Sets the session's behavior for triggers and rewrite rules." -msgstr "Ð’Ñтановлює поведінку Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² Ñ– правил перезапиÑу Ð´Ð»Ñ ÑеанÑу." - -#: utils/misc/guc.c:4898 -msgid "Sets the current transaction's synchronization level." -msgstr "Ð’Ñтановлює рівень Ñинхронізації поточної транзакції." - -#: utils/misc/guc.c:4908 -msgid "Allows archiving of WAL files using archive_command." -msgstr "ДозволÑÑ” архівацію файлів WAL, викориÑтовуючи archive_command." - -#: utils/misc/guc.c:4918 -msgid "Sets the action to perform upon reaching the recovery target." -msgstr "Ð’Ñтновлює дію Ñку потрібно виконати в разі доÑÑÐ³Ð½ÐµÐ½Ð½Ñ Ð¼ÐµÑ‚Ð¸ відновленнÑ." - -#: utils/misc/guc.c:4928 -msgid "Enables logging of recovery-related debugging information." -msgstr "Вмикає Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ð¾Ñ— інформації, пов'Ñзаної з відновленнÑм." - -#: utils/misc/guc.c:4945 -msgid "Collects function-level statistics on database activity." -msgstr "Збирає ÑтатиÑтику активноÑті в базі даних на рівні функцій." - -#: utils/misc/guc.c:4956 -msgid "Sets the consistency of accesses to statistics data" -msgstr "Ð’Ñтановлює поÑлідовніÑть доÑтупу до даних ÑтатиÑтики" - -#: utils/misc/guc.c:4966 -msgid "Compresses full-page writes written in WAL file with specified method." -msgstr "СтиÑкає повноÑторінкові запиÑи, запиÑані у файлі WAL за допомогою вказаного методу." - -#: utils/misc/guc.c:4976 -msgid "Sets the level of information written to the WAL." -msgstr "Ð’Ñтановлює рівень інформації, Ñка запиÑуєтьÑÑ Ð´Ð¾ WAL." - -#: utils/misc/guc.c:4986 -msgid "Selects the dynamic shared memory implementation used." -msgstr "Вибирає викориÑтовуване Ð²Ð¿Ñ€Ð¾Ð²Ð°Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— Ñпільної пам'Ñті." - -#: utils/misc/guc.c:4996 -msgid "Selects the shared memory implementation used for the main shared memory region." -msgstr "Вибирає Ð²Ð¿Ñ€Ð¾Ð²Ð°Ð´Ð¶ÐµÐ½Ð½Ñ Ñпільної пам'Ñті, що викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¾Ñновної облаÑті Ñпільної пам'Ñті." - -#: utils/misc/guc.c:5006 -msgid "Selects the method used for forcing WAL updates to disk." -msgstr "Вибирає метод примуÑового запиÑу оновлень в WAL на диÑк." - -#: utils/misc/guc.c:5016 -msgid "Sets how binary values are to be encoded in XML." -msgstr "Ð’Ñтановлює, Ñк повинні кодуватиÑÑŒ двійкові Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² XML." - -#: utils/misc/guc.c:5026 -msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." -msgstr "Ð’Ñтановлює, чи Ñлід розглÑдати XML-дані в неÑвних операціÑÑ… аналізу Ñ– Ñеріалізації Ñк документи або Ñк фрагменти зміÑту." - -#: utils/misc/guc.c:5037 -msgid "Use of huge pages on Linux or Windows." -msgstr "ВикориÑтовувати величезні Ñторінки в Linux або Windows." - -#: utils/misc/guc.c:5047 -msgid "Prefetch referenced blocks during recovery" -msgstr "Попередньо вибирати пов'Ñзані блоки під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ" - -#: utils/misc/guc.c:5048 -msgid "Look ahead in the WAL to find references to uncached data." -msgstr "Шукати в WAL поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° незакешовані дані." - -#: utils/misc/guc.c:5057 -msgid "Forces use of parallel query facilities." -msgstr "ПримуÑово викориÑтовувати паралельне Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñ–Ð²." - -#: utils/misc/guc.c:5058 -msgid "If possible, run query using a parallel worker and with parallel restrictions." -msgstr "Якщо можливо, виконувати запит викориÑтовуючи паралельного працівника Ñ– з обмеженнÑми паралельноÑті." - -#: utils/misc/guc.c:5068 -msgid "Chooses the algorithm for encrypting passwords." -msgstr "Виберіть алгоритм Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ–Ð²." - -#: utils/misc/guc.c:5078 -msgid "Controls the planner's selection of custom or generic plan." -msgstr "Контролює вибір планувальником Ñпеціального або загального плану." - -#: utils/misc/guc.c:5079 -msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." -msgstr "Підготовлені оператори можуть мати Ñпеціальні або загальні плани, Ñ– планувальник Ñпробує вибрати, Ñкий краще. Це може бути вÑтановлено Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ поведінки за замовчуваннÑм." - -#: utils/misc/guc.c:5091 -msgid "Sets the minimum SSL/TLS protocol version to use." -msgstr "Ð’Ñтановлює мінімальну верÑÑ–ÑŽ протоколу SSL/TLS Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ." - -#: utils/misc/guc.c:5103 -msgid "Sets the maximum SSL/TLS protocol version to use." -msgstr "Ð’Ñтановлює макÑимальну верÑÑ–ÑŽ протоколу SSL/TLS Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ." - -#: utils/misc/guc.c:5115 -msgid "Sets the method for synchronizing the data directory before crash recovery." -msgstr "Ð’Ñтановлює метод Ð´Ð»Ñ Ñинхронізації каталогу даних перед аварійним відновленнÑм." - -#: utils/misc/guc.c:5690 utils/misc/guc.c:5706 -#, c-format -msgid "invalid configuration parameter name \"%s\"" -msgstr "неприпуÑтима назва параметра конфігурації \"%s\"" - -#: utils/misc/guc.c:5692 -#, c-format -msgid "Custom parameter names must be two or more simple identifiers separated by dots." -msgstr "ВлаÑні назви параметрів повинні міÑтити два або більше проÑтих ідентифікаторів, розділених крапками." - -#: utils/misc/guc.c:5708 -#, c-format -msgid "\"%s\" is a reserved prefix." -msgstr "\"%s\" Ñ” зарезервованим префікÑом." - -#: utils/misc/guc.c:5722 -#, c-format -msgid "unrecognized configuration parameter \"%s\"" -msgstr "нерозпізнаний параметр конфігурації \"%s\"" - -#: utils/misc/guc.c:6114 -#, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: немає доÑтупу до каталогу \"%s\": %s\n" - -#: utils/misc/guc.c:6119 -#, c-format -msgid "Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n" -msgstr "ЗапуÑтіть initdb або pg_basebackup Ð´Ð»Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— каталогу даних PostgreSQL.\n" - -#: utils/misc/guc.c:6139 -#, c-format -msgid "" -"%s does not know where to find the server configuration file.\n" -"You must specify the --config-file or -D invocation option or set the PGDATA environment variable.\n" -msgstr "" -"%s не знає де знайти файл конфігурації Ñервера.\n" -"Ви повинні вказати його Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð² параметрі --config-file або -D, або вÑтановити змінну Ñередовища PGDATA.\n" - -#: utils/misc/guc.c:6158 -#, c-format -msgid "%s: could not access the server configuration file \"%s\": %s\n" -msgstr "%s: не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ доÑтуп до файлу конфігурації Ñервера \"%s\": %s\n" - -#: utils/misc/guc.c:6184 -#, c-format -msgid "" -"%s does not know where to find the database system data.\n" -"This can be specified as \"data_directory\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" -msgstr "" -"%s не знає де знайти дані ÑиÑтеми бази даних.\n" -"Їх Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути вказано Ñк \"data_directory\" в \"%s\", або передано в параметрі -D, або вÑтановлено змінну Ñередовища PGDATA.\n" - -#: utils/misc/guc.c:6232 -#, c-format -msgid "" -"%s does not know where to find the \"hba\" configuration file.\n" -"This can be specified as \"hba_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" -msgstr "" -"%s не знає де знайти файл конфігурації \"hba\".\n" -"Його Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути вказано Ñк \"hba_file\" в \"%s\", або передано в параметрі -D, або вÑтановлено змінну Ñередовища PGDATA.\n" +#: utils/misc/guc_tables.c:4757 utils/misc/guc_tables.c:4853 +#: utils/misc/guc_tables.c:4864 +msgid "Each level includes all the levels that follow it. The later the level, the fewer messages are sent." +msgstr "Кожен рівень включає вÑÑ– наÑтупні рівні. Чим вище рівень, тим менше повідомлень надіÑлано." -#: utils/misc/guc.c:6255 -#, c-format -msgid "" -"%s does not know where to find the \"ident\" configuration file.\n" -"This can be specified as \"ident_file\" in \"%s\", or by the -D invocation option, or by the PGDATA environment variable.\n" -msgstr "" -"%s не знає де знайти файл конфігурації \"ident\".\n" -"Його Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути вказано Ñк \"ident_file\" в \"%s\", або передано в параметрі -D, або вÑтановлено змінну Ñередовища PGDATA.\n" +#: utils/misc/guc_tables.c:4767 +msgid "Enables in-core computation of query identifiers." +msgstr "Вмикає внутрішнє обчиÑÐ»ÐµÐ½Ð½Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ñ–Ð² запиту." -#: utils/misc/guc.c:7186 -msgid "Value exceeds integer range." -msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÑƒÑ” діапазон цілих чиÑел." +#: utils/misc/guc_tables.c:4777 +msgid "Enables the planner to use constraints to optimize queries." +msgstr "Дає змогу планувальнику оптимізувати запити, викориÑтовуючи обмеженнÑ." -#: utils/misc/guc.c:7422 -#, c-format -msgid "%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)" -msgstr "%d%s%s поза припуÑтимим діапазоном Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\" (%d .. %d)" +#: utils/misc/guc_tables.c:4778 +msgid "Table scans will be skipped if their constraints guarantee that no rows match the query." +msgstr "Ð¡ÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– буде пропущено, Ñкщо Ñ—Ñ— Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð³Ð°Ñ€Ð°Ð½Ñ‚ÑƒÑŽÑ‚ÑŒ, що запиту не відповідають ніÑкі Ñ€Ñдки." -#: utils/misc/guc.c:7458 -#, c-format -msgid "%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)" -msgstr "%g%s%s поза припуÑтимим діапазоном Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\" (%g .. %g)" +#: utils/misc/guc_tables.c:4789 +msgid "Sets the default compression method for compressible values." +msgstr "Ð’Ñтановлює метод ÑтиÑÐºÐ°Ð½Ð½Ñ Ð·Ð° замовчуваннÑм Ð´Ð»Ñ ÑтиÑливих значень." -#: utils/misc/guc.c:7658 utils/misc/guc.c:9106 -#, c-format -msgid "cannot set parameters during a parallel operation" -msgstr "вÑтановити параметри під Ñ‡Ð°Ñ Ð¿Ð°Ñ€Ð°Ð»ÐµÐ»ÑŒÐ½Ð¾Ñ— операції не можна" +#: utils/misc/guc_tables.c:4800 +msgid "Sets the transaction isolation level of each new transaction." +msgstr "Ð’Ñтановлює рівень ізолÑції транзакції Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ñ— нової транзакції." -#: utils/misc/guc.c:7675 utils/misc/guc.c:8930 -#, c-format -msgid "parameter \"%s\" cannot be changed" -msgstr "параметр \"%s\" не може бути змінений" +#: utils/misc/guc_tables.c:4810 +msgid "Sets the current transaction's isolation level." +msgstr "Ð’Ñтановлює чинний рівень ізолÑції транзакцій." -#: utils/misc/guc.c:7698 utils/misc/guc.c:7918 utils/misc/guc.c:8016 -#: utils/misc/guc.c:8114 utils/misc/guc.c:8238 utils/misc/guc.c:8341 -#: guc-file.l:353 -#, c-format -msgid "parameter \"%s\" cannot be changed without restarting the server" -msgstr "параметр \"%s\" не може бути змінений, без Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñервера" +#: utils/misc/guc_tables.c:4821 +msgid "Sets the display format for interval values." +msgstr "Ð’Ñтановлює формат Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ–Ñ… значень." -#: utils/misc/guc.c:7708 -#, c-format -msgid "parameter \"%s\" cannot be changed now" -msgstr "параметр \"%s\" не може бути змінений зараз" +#: utils/misc/guc_tables.c:4832 +msgid "Log level for reporting invalid ICU locale strings." +msgstr "Рівень протоколу Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ невірні Ñ€Ñдки локалі ICU." -#: utils/misc/guc.c:7735 utils/misc/guc.c:7793 utils/misc/guc.c:8906 -#: utils/misc/guc.c:11805 -#, c-format -msgid "permission denied to set parameter \"%s\"" -msgstr "немає прав Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\"" +#: utils/misc/guc_tables.c:4842 +msgid "Sets the verbosity of logged messages." +msgstr "Ð’Ñтановлює детальніÑть повідомлень, Ñкі протоколюютьÑÑ." -#: utils/misc/guc.c:7773 -#, c-format -msgid "parameter \"%s\" cannot be set after connection start" -msgstr "параметр \"%s\" не можна вÑтановити піÑÐ»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ" +#: utils/misc/guc_tables.c:4852 +msgid "Sets the message levels that are logged." +msgstr "Ð’Ñтанолвює рівні повідомлень, Ñкі протоколюютьÑÑ." -#: utils/misc/guc.c:7832 -#, c-format -msgid "cannot set parameter \"%s\" within security-definer function" -msgstr "параметр \"%s\" не можна вÑтановити в межах функції безпеки" +#: utils/misc/guc_tables.c:4863 +msgid "Causes all statements generating error at or above this level to be logged." +msgstr "Вмикає Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²ÑÑ–Ñ… операторів, виконаних з помилкою цього або вище рівнÑ." -#: utils/misc/guc.c:8485 utils/misc/guc.c:8532 utils/misc/guc.c:10011 -#, c-format -msgid "must be superuser or have privileges of pg_read_all_settings to examine \"%s\"" -msgstr "щоб доÑлідити \"%s\", потрібно бути ÑуперкориÑтувачем або мати права ролі pg_read_all_settings" +#: utils/misc/guc_tables.c:4874 +msgid "Sets the type of statements logged." +msgstr "Ð’Ñтановлює тип операторів, Ñкі протоколюютьÑÑ." -#: utils/misc/guc.c:8616 -#, c-format -msgid "SET %s takes only one argument" -msgstr "SET %s приймає лише один аргумент" +#: utils/misc/guc_tables.c:4884 +msgid "Sets the syslog \"facility\" to be used when syslog enabled." +msgstr "Ð’Ñтановлює отримувача повідомлень, Ñкі відправлÑютьÑÑ Ð´Ð¾ syslog." -#: utils/misc/guc.c:8896 -#, c-format -msgid "permission denied to perform ALTER SYSTEM RESET ALL" -msgstr "немає дозволу Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ALTER SYSTEM RESET ALL" +#: utils/misc/guc_tables.c:4895 +msgid "Sets the session's behavior for triggers and rewrite rules." +msgstr "Ð’Ñтановлює поведінку Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² Ñ– правил перезапиÑу Ð´Ð»Ñ ÑеанÑу." -#: utils/misc/guc.c:8963 -#, c-format -msgid "parameter value for ALTER SYSTEM must not contain a newline" -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ Ð´Ð»Ñ ALTER SYSTEM не повинне міÑтити нового Ñ€Ñдка" +#: utils/misc/guc_tables.c:4905 +msgid "Sets the current transaction's synchronization level." +msgstr "Ð’Ñтановлює рівень Ñинхронізації поточної транзакції." -#: utils/misc/guc.c:9008 -#, c-format -msgid "could not parse contents of file \"%s\"" -msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ зміÑÑ‚ файла \"%s\"" +#: utils/misc/guc_tables.c:4915 +msgid "Allows archiving of WAL files using \"archive_command\"." +msgstr "ДозволÑÑ” архівацію файлів WAL, викориÑтовуючи \"archive_command\"." -#: utils/misc/guc.c:9182 -#, c-format -msgid "SET LOCAL TRANSACTION SNAPSHOT is not implemented" -msgstr "SET LOCAL TRANSACTION SNAPSHOT не реалізовано" +#: utils/misc/guc_tables.c:4925 +msgid "Sets the action to perform upon reaching the recovery target." +msgstr "Ð’Ñтновлює дію Ñку потрібно виконати в разі доÑÑÐ³Ð½ÐµÐ½Ð½Ñ Ð¼ÐµÑ‚Ð¸ відновленнÑ." -#: utils/misc/guc.c:9269 -#, c-format -msgid "SET requires parameter name" -msgstr "SET потребує ім'Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°" +#: utils/misc/guc_tables.c:4935 +msgid "Collects function-level statistics on database activity." +msgstr "Збирає ÑтатиÑтику активноÑті в базі даних на рівні функцій." -#: utils/misc/guc.c:9402 -#, c-format -msgid "attempt to redefine parameter \"%s\"" -msgstr "Ñпроба перевизначити параметр \"%s\"" +#: utils/misc/guc_tables.c:4946 +msgid "Sets the consistency of accesses to statistics data." +msgstr "Ð’Ñтановлює поÑлідовніÑть доÑтупу до даних ÑтатиÑтики." -#: utils/misc/guc.c:9729 -#, c-format -msgid "invalid configuration parameter name \"%s\", removing it" -msgstr "неприпуÑтима назва параметра конфігурації \"%s\", видалÑємо" +#: utils/misc/guc_tables.c:4956 +msgid "Compresses full-page writes written in WAL file with specified method." +msgstr "СтиÑкає повноÑторінкові запиÑи, запиÑані у файлі WAL за допомогою вказаного методу." -#: utils/misc/guc.c:9731 -#, c-format -msgid "\"%s\" is now a reserved prefix." -msgstr "\"%s\" тепер Ñ” зарезервованим префікÑом." +#: utils/misc/guc_tables.c:4966 +msgid "Sets the level of information written to the WAL." +msgstr "Ð’Ñтановлює рівень інформації, Ñка запиÑуєтьÑÑ Ð´Ð¾ WAL." -#: utils/misc/guc.c:11245 -#, c-format -msgid "while setting parameter \"%s\" to \"%s\"" -msgstr "під Ñ‡Ð°Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\" на \"%s\"" +#: utils/misc/guc_tables.c:4976 +msgid "Selects the dynamic shared memory implementation used." +msgstr "Вибирає викориÑтовуване Ð²Ð¿Ñ€Ð¾Ð²Ð°Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— Ñпільної пам'Ñті." -#: utils/misc/guc.c:11414 -#, c-format -msgid "parameter \"%s\" could not be set" -msgstr "параметр \"%s\" не вдалоÑÑ Ð²Ñтановити" +#: utils/misc/guc_tables.c:4986 +msgid "Selects the shared memory implementation used for the main shared memory region." +msgstr "Вибирає Ð²Ð¿Ñ€Ð¾Ð²Ð°Ð´Ð¶ÐµÐ½Ð½Ñ Ñпільної пам'Ñті, що викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð¾Ñновної облаÑті Ñпільної пам'Ñті." -#: utils/misc/guc.c:11506 -#, c-format -msgid "could not parse setting for parameter \"%s\"" -msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\"" +#: utils/misc/guc_tables.c:4996 +msgid "Selects the method used for forcing WAL updates to disk." +msgstr "Вибирає метод примуÑового запиÑу оновлень в WAL на диÑк." -#: utils/misc/guc.c:11937 -#, c-format -msgid "invalid value for parameter \"%s\": %g" -msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\": %g" +#: utils/misc/guc_tables.c:5006 +msgid "Sets how binary values are to be encoded in XML." +msgstr "Ð’Ñтановлює, Ñк повинні кодуватиÑÑŒ двійкові Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² XML." -#: utils/misc/guc.c:12250 -#, c-format -msgid "\"temp_buffers\" cannot be changed after any temporary tables have been accessed in the session." -msgstr "параметр \"temp_buffers\" не можна змінити піÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾, Ñк тимчаÑові таблиці отримали доÑтуп в ÑеанÑÑ–." +#: utils/misc/guc_tables.c:5016 +msgid "Sets whether XML data in implicit parsing and serialization operations is to be considered as documents or content fragments." +msgstr "Ð’Ñтановлює, чи Ñлід розглÑдати XML-дані в неÑвних операціÑÑ… аналізу Ñ– Ñеріалізації Ñк документи або Ñк фрагменти зміÑту." -#: utils/misc/guc.c:12262 -#, c-format -msgid "Bonjour is not supported by this build" -msgstr "Bonjour не підтримуєтьÑÑ Ð´Ð°Ð½Ð¾ÑŽ збіркою" +#: utils/misc/guc_tables.c:5027 +msgid "Use of huge pages on Linux or Windows." +msgstr "ВикориÑтовувати величезні Ñторінки в Linux або Windows." -#: utils/misc/guc.c:12275 -#, c-format -msgid "SSL is not supported by this build" -msgstr "SSL не підтримуєтьÑÑ Ð´Ð°Ð½Ð¾ÑŽ збіркою" +#: utils/misc/guc_tables.c:5037 +msgid "Indicates the status of huge pages." +msgstr "Показує ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… Ñторінок." -#: utils/misc/guc.c:12287 -#, c-format -msgid "Cannot enable parameter when \"log_statement_stats\" is true." -msgstr "Ðе можна ввімкнути параметр, коли \"log_statement_stats\" дорівнює true." +#: utils/misc/guc_tables.c:5048 +msgid "Prefetch referenced blocks during recovery." +msgstr "Попередньо вибирати пов'Ñзані блоки під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ." -#: utils/misc/guc.c:12299 -#, c-format -msgid "Cannot enable \"log_statement_stats\" when \"log_parser_stats\", \"log_planner_stats\", or \"log_executor_stats\" is true." -msgstr "Ðе можна ввімкнути \"log_statement_stats\", коли \"log_parser_stats\", \"log_planner_stats\", або \"log_executor_stats\" дорівнюють true." +#: utils/misc/guc_tables.c:5049 +msgid "Look ahead in the WAL to find references to uncached data." +msgstr "Шукати в WAL поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° незакешовані дані." -#: utils/misc/guc.c:12529 -#, c-format -msgid "effective_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ effective_io_concurrency повинне дорівнювати 0 (нулю) на платформах, де відÑутній posix_fadvise()." +#: utils/misc/guc_tables.c:5058 +msgid "Forces the planner's use parallel query nodes." +msgstr "Змушує планувальник викориÑтовувати паралельні вузли запитів." -#: utils/misc/guc.c:12542 -#, c-format -msgid "maintenance_io_concurrency must be set to 0 on platforms that lack posix_fadvise()." -msgstr "maintenance_io_concurrency повинне бути вÑтановлене на 0, на платформах Ñкі не мають posix_fadvise()." +#: utils/misc/guc_tables.c:5059 +msgid "This can be useful for testing the parallel query infrastructure by forcing the planner to generate plans that contain nodes that perform tuple communication between workers and the main process." +msgstr "Це може бути кориÑно Ð´Ð»Ñ Ñ‚ÐµÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ñ€Ð°Ñтруктури паралельних запитів, змушуючи планувальник генерувати плани, Ñкі міÑÑ‚Ñть вузли, що виконують зв'Ñзок кортежів між робітниками та оÑновним процеÑом." -#: utils/misc/guc.c:12556 -#, c-format -msgid "huge_page_size must be 0 on this platform." -msgstr "huge_page_size повинен бути 0 на цій платформі." +#: utils/misc/guc_tables.c:5071 +msgid "Chooses the algorithm for encrypting passwords." +msgstr "Виберіть алгоритм Ð´Ð»Ñ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ–Ð²." -#: utils/misc/guc.c:12568 -#, c-format -msgid "client_connection_check_interval must be set to 0 on this platform." -msgstr "client_connection_check_interval має бути вÑтановлений в 0 на цій платформі." +#: utils/misc/guc_tables.c:5081 +msgid "Controls the planner's selection of custom or generic plan." +msgstr "Контролює вибір планувальником Ñпеціального або загального плану." -#: utils/misc/guc.c:12680 -#, c-format -msgid "invalid character" -msgstr "неприпуÑтимий Ñимвол" +#: utils/misc/guc_tables.c:5082 +msgid "Prepared statements can have custom and generic plans, and the planner will attempt to choose which is better. This can be set to override the default behavior." +msgstr "Підготовлені оператори можуть мати Ñпеціальні або загальні плани, Ñ– планувальник Ñпробує вибрати, Ñкий краще. Це може бути вÑтановлено Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½Ð¸ поведінки за замовчуваннÑм." -#: utils/misc/guc.c:12740 -#, c-format -msgid "recovery_target_timeline is not a valid number." -msgstr "recovery_target_timeline не Ñ” допуÑтимим чиÑлом." +#: utils/misc/guc_tables.c:5094 +msgid "Sets the minimum SSL/TLS protocol version to use." +msgstr "Ð’Ñтановлює мінімальну верÑÑ–ÑŽ протоколу SSL/TLS Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ." -#: utils/misc/guc.c:12780 -#, c-format -msgid "multiple recovery targets specified" -msgstr "вказано декілька цілей відновленнÑ" +#: utils/misc/guc_tables.c:5106 +msgid "Sets the maximum SSL/TLS protocol version to use." +msgstr "Ð’Ñтановлює макÑимальну верÑÑ–ÑŽ протоколу SSL/TLS Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ." -#: utils/misc/guc.c:12781 -#, c-format -msgid "At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set." -msgstr "МакÑимум один із recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid може бути вÑтановлений." +#: utils/misc/guc_tables.c:5118 +msgid "Sets the method for synchronizing the data directory before crash recovery." +msgstr "Ð’Ñтановлює метод Ð´Ð»Ñ Ñинхронізації каталогу даних перед аварійним відновленнÑм." -#: utils/misc/guc.c:12789 -#, c-format -msgid "The only allowed value is \"immediate\"." -msgstr "Єдиним дозволеним значеннÑм Ñ” \"immediate\"." +#: utils/misc/guc_tables.c:5127 +msgid "Forces immediate streaming or serialization of changes in large transactions." +msgstr "Забезпечує негайну потокову передачу або Ñеріалізацію змін у великих транзакціÑÑ…." -#: utils/misc/help_config.c:130 +#: utils/misc/guc_tables.c:5128 +msgid "On the publisher, it allows streaming or serializing each change in logical decoding. On the subscriber, it allows serialization of all changes to files and notifies the parallel apply workers to read and apply them at the end of the transaction." +msgstr "Ðа Ñтороні Ð²Ð¸Ð´Ð°Ð²Ñ†Ñ Ñ†Ðµ дозволÑÑ” передавати в потоковому режимі або Ñеріалізувати кожну зміну в логічному декодуванні. Ðа Ñтороні абонента це дозволÑÑ” Ñеріалізувати вÑÑ– зміни у файлах Ñ– Ñповіщає працівників паралельних робочих процеÑів про необхідніÑть прочитати Ñ– заÑтоÑувати Ñ—Ñ… в кінці транзакції." + +#: utils/misc/help_config.c:129 #, c-format msgid "internal error: unrecognized run-time parameter type\n" msgstr "Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: нерозпізнаний тип параметра чаÑу виконаннÑ\n" -#: utils/misc/pg_controldata.c:60 utils/misc/pg_controldata.c:138 -#: utils/misc/pg_controldata.c:241 utils/misc/pg_controldata.c:306 +#: utils/misc/pg_controldata.c:50 utils/misc/pg_controldata.c:90 +#: utils/misc/pg_controldata.c:181 utils/misc/pg_controldata.c:222 #, c-format msgid "calculated CRC checksum does not match value stored in file" msgstr "обчиÑлена контрольна Ñума CRC не відповідає значенню, збереженому у файлі" @@ -28708,125 +30245,123 @@ msgstr "запит буде обмежений політикою безпеки msgid "To disable the policy for the table's owner, use ALTER TABLE NO FORCE ROW LEVEL SECURITY." msgstr "Щоб вимкнути політику Ð´Ð»Ñ Ð²Ð»Ð°Ñника таблиці, викориÑтайте ALTER TABLE NO FORCE ROW LEVEL SECURITY." -#: utils/misc/timeout.c:524 +#: utils/misc/timeout.c:520 #, c-format msgid "cannot add more timeout reasons" msgstr "додати більше причин тайм-ауту не можна" -#: utils/misc/tzparser.c:60 +#: utils/misc/tzparser.c:61 #, c-format msgid "time zone abbreviation \"%s\" is too long (maximum %d characters) in time zone file \"%s\", line %d" msgstr "ÑÐºÐ¾Ñ€Ð¾Ñ‡ÐµÐ½Ð½Ñ Ñ‡Ð°Ñового поÑÑу \"%s\" занадто довге (макÑимум %d Ñимволів) у файлі чаÑового поÑÑу \"%s\", Ñ€Ñдок %d" -#: utils/misc/tzparser.c:72 +#: utils/misc/tzparser.c:73 #, c-format msgid "time zone offset %d is out of range in time zone file \"%s\", line %d" msgstr "зÑув чаÑового поÑÑу %d поза діапазоном у файлі чаÑового поÑÑу \"%s\", Ñ€Ñдок %d" -#: utils/misc/tzparser.c:111 +#: utils/misc/tzparser.c:112 #, c-format msgid "missing time zone abbreviation in time zone file \"%s\", line %d" msgstr "пропущено ÑÐºÐ¾Ñ€Ð¾Ñ‡ÐµÐ½Ð½Ñ Ñ‡Ð°Ñового поÑÑу в файлі чаÑового поÑÑу \"%s\", Ñ€Ñдок %d" -#: utils/misc/tzparser.c:120 +#: utils/misc/tzparser.c:121 #, c-format msgid "missing time zone offset in time zone file \"%s\", line %d" msgstr "пропущено зÑув чаÑового поÑÑу в файлі чаÑового поÑÑу \"%s\", Ñ€Ñдок %d" -#: utils/misc/tzparser.c:132 +#: utils/misc/tzparser.c:133 #, c-format msgid "invalid number for time zone offset in time zone file \"%s\", line %d" msgstr "неприпуÑтиме чиÑло зÑуву чаÑового поÑÑу в файлі чаÑового поÑÑу \"%s\", Ñ€Ñдок %d" -#: utils/misc/tzparser.c:168 +#: utils/misc/tzparser.c:169 #, c-format msgid "invalid syntax in time zone file \"%s\", line %d" msgstr "неприпуÑтимий ÑинтакÑÐ¸Ñ Ñƒ файлі чаÑового поÑÑу \"%s\", Ñ€Ñдок %d" -#: utils/misc/tzparser.c:236 +#: utils/misc/tzparser.c:237 #, c-format msgid "time zone abbreviation \"%s\" is multiply defined" msgstr "ÑÐºÐ¾Ñ€Ð¾Ñ‡ÐµÐ½Ð½Ñ Ñ‡Ð°Ñового поÑÑу \"%s\" визначено неодноразово" -#: utils/misc/tzparser.c:238 +#: utils/misc/tzparser.c:239 #, c-format msgid "Entry in time zone file \"%s\", line %d, conflicts with entry in file \"%s\", line %d." msgstr "Ð—Ð°Ð¿Ð¸Ñ Ñƒ файлі чаÑового поÑÑу \"%s\", Ñ€Ñдок %d, конфліктує з запиÑом у файлі \"%s\", Ñ€Ñдок %d." -#: utils/misc/tzparser.c:300 +#: utils/misc/tzparser.c:301 #, c-format msgid "invalid time zone file name \"%s\"" msgstr "неприпуÑтиме ім'Ñ Ñ„Ð°Ð¹Ð»Ð° чаÑового поÑÑу \"%s\"" -#: utils/misc/tzparser.c:313 +#: utils/misc/tzparser.c:314 #, c-format msgid "time zone file recursion limit exceeded in file \"%s\"" msgstr "ліміт рекурÑÑ–Ñ— файла чаÑового поÑÑу перевищено у файлі \"%s\"" -#: utils/misc/tzparser.c:352 utils/misc/tzparser.c:365 +#: utils/misc/tzparser.c:353 utils/misc/tzparser.c:366 #, c-format msgid "could not read time zone file \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл чаÑового поÑÑу \"%s\": %m" -#: utils/misc/tzparser.c:376 +#: utils/misc/tzparser.c:377 #, c-format msgid "line is too long in time zone file \"%s\", line %d" msgstr "занадто довгий Ñ€Ñдок у файлі чаÑового поÑÑу \"%s\", Ñ€Ñдок %d" -#: utils/misc/tzparser.c:400 +#: utils/misc/tzparser.c:401 #, c-format msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "в @INCLUDE не вказано ім'Ñ Ñ„Ð°Ð¹Ð»Ð° у файлі чаÑового поÑÑу \"%s\", Ñ€Ñдок %d" -#: utils/mmgr/aset.c:477 utils/mmgr/generation.c:267 utils/mmgr/slab.c:237 +#: utils/mmgr/aset.c:452 utils/mmgr/bump.c:184 utils/mmgr/generation.c:216 +#: utils/mmgr/slab.c:371 #, c-format msgid "Failed while creating memory context \"%s\"." msgstr "Помилка під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐºÑту пам'Ñті \"%s\"." -#: utils/mmgr/dsa.c:519 utils/mmgr/dsa.c:1329 +#: utils/mmgr/dsa.c:523 utils/mmgr/dsa.c:1364 #, c-format msgid "could not attach to dynamic shared area" msgstr "не вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑŒ до динамічно-Ñпільної облаÑті" -#: utils/mmgr/mcxt.c:889 utils/mmgr/mcxt.c:925 utils/mmgr/mcxt.c:963 -#: utils/mmgr/mcxt.c:1001 utils/mmgr/mcxt.c:1089 utils/mmgr/mcxt.c:1120 -#: utils/mmgr/mcxt.c:1156 utils/mmgr/mcxt.c:1208 utils/mmgr/mcxt.c:1243 -#: utils/mmgr/mcxt.c:1278 +#: utils/mmgr/mcxt.c:1155 #, c-format msgid "Failed on request of size %zu in memory context \"%s\"." msgstr "Помилка в запиті розміру %zu в контекÑті пам'Ñті \"%s\"." -#: utils/mmgr/mcxt.c:1052 +#: utils/mmgr/mcxt.c:1299 #, c-format msgid "logging memory contexts of PID %d" msgstr "Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐºÑтів пам'Ñті PID %d" -#: utils/mmgr/portalmem.c:188 +#: utils/mmgr/portalmem.c:187 #, c-format msgid "cursor \"%s\" already exists" msgstr "курÑор \"%s\" вже Ñ–Ñнує" -#: utils/mmgr/portalmem.c:192 +#: utils/mmgr/portalmem.c:191 #, c-format msgid "closing existing cursor \"%s\"" msgstr "Ñ–Ñнуючий курÑор \"%s\" закриваєтьÑÑ" -#: utils/mmgr/portalmem.c:402 +#: utils/mmgr/portalmem.c:401 #, c-format msgid "portal \"%s\" cannot be run" msgstr "портал \"%s\" не можна запуÑтити" -#: utils/mmgr/portalmem.c:480 +#: utils/mmgr/portalmem.c:479 #, c-format msgid "cannot drop pinned portal \"%s\"" msgstr "видалити закріплений портал \"%s\" не можна" -#: utils/mmgr/portalmem.c:488 +#: utils/mmgr/portalmem.c:487 #, c-format msgid "cannot drop active portal \"%s\"" msgstr "видалити активний портал \"%s\" не можна" -#: utils/mmgr/portalmem.c:739 +#: utils/mmgr/portalmem.c:738 #, c-format msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "не можна виконати PREPARE Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ—, Ñка Ñтворила курÑор WITH HOLD" @@ -28836,54 +30371,37 @@ msgstr "не можна виконати PREPARE Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ—, Ñ msgid "cannot perform transaction commands inside a cursor loop that is not read-only" msgstr "виконати команди транзакції вÑередині циклу з курÑором, Ñкий не Ñ” \"лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\", не можна" -#: utils/sort/logtape.c:266 utils/sort/logtape.c:289 -#, c-format -msgid "could not seek to block %ld of temporary file" -msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ шлÑÑ… до Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ %ld тимчаÑового файлу" - -#: utils/sort/logtape.c:295 -#, c-format -msgid "could not read block %ld of temporary file: read only %zu of %zu bytes" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ блок %ld тимчаÑового файлу: прочитано лише %zu з %zu байт." - -#: utils/sort/sharedtuplestore.c:431 utils/sort/sharedtuplestore.c:440 -#: utils/sort/sharedtuplestore.c:463 utils/sort/sharedtuplestore.c:480 -#: utils/sort/sharedtuplestore.c:497 +#: utils/sort/logtape.c:266 utils/sort/logtape.c:287 #, c-format -msgid "could not read from shared tuplestore temporary file" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ тимчаÑовий файл зі зпільного Ñховища кортежів" +msgid "could not seek to block %lld of temporary file" +msgstr "не може намагатиÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ñ‚Ð¸ %lld тимчаÑового файлу" -#: utils/sort/sharedtuplestore.c:486 +#: utils/sort/sharedtuplestore.c:466 #, c-format msgid "unexpected chunk in shared tuplestore temporary file" msgstr "неочікуваний блок у тимчаÑовому файлі Ñпільного Ñховища кортежів" -#: utils/sort/sharedtuplestore.c:571 +#: utils/sort/sharedtuplestore.c:548 #, c-format msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ %u у тимчаÑовому файлі зі Ñпільного Ñховища кортежів" -#: utils/sort/sharedtuplestore.c:578 -#, c-format -msgid "could not read from shared tuplestore temporary file: read only %zu of %zu bytes" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з тимчаÑового файлу зі Ñпільного Ñховища кортежів: прочитано лише %zu з %zu байт" - -#: utils/sort/tuplesort.c:3322 +#: utils/sort/tuplesort.c:2372 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "кількіÑть виконуючих процеÑів Ð´Ð»Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ може перевищувати %d" -#: utils/sort/tuplesort.c:4425 +#: utils/sort/tuplesortvariants.c:1552 #, c-format msgid "could not create unique index \"%s\"" msgstr "не вдалоÑÑ Ñтворити унікальний Ñ–Ð½Ð´ÐµÐºÑ \"%s\"" -#: utils/sort/tuplesort.c:4427 +#: utils/sort/tuplesortvariants.c:1554 #, c-format msgid "Key %s is duplicated." msgstr "Ключ %s дублюєтьÑÑ." -#: utils/sort/tuplesort.c:4428 +#: utils/sort/tuplesortvariants.c:1555 #, c-format msgid "Duplicate keys exist." msgstr "Дублікати ключів Ñ–Ñнують." @@ -28897,138 +30415,132 @@ msgstr "Дублікати ключів Ñ–Ñнують." msgid "could not seek in tuplestore temporary file" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ у тимчаÑовому файлі зі Ñховища кортежів" -#: utils/sort/tuplestore.c:1477 utils/sort/tuplestore.c:1540 -#: utils/sort/tuplestore.c:1548 -#, c-format -msgid "could not read from tuplestore temporary file: read only %zu of %zu bytes" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з тимчаÑового файлу зі Ñховища кортежів: прочитано лише %zu з %zu байт" - -#: utils/time/snapmgr.c:570 +#: utils/time/snapmgr.c:536 #, c-format msgid "The source transaction is not running anymore." msgstr "Вихідна Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð²Ð¶Ðµ не виконуєтьÑÑ." -#: utils/time/snapmgr.c:1164 +#: utils/time/snapmgr.c:1136 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "екÑпортувати знімок з підтранзакції не можна" -#: utils/time/snapmgr.c:1323 utils/time/snapmgr.c:1328 -#: utils/time/snapmgr.c:1333 utils/time/snapmgr.c:1348 -#: utils/time/snapmgr.c:1353 utils/time/snapmgr.c:1358 -#: utils/time/snapmgr.c:1373 utils/time/snapmgr.c:1378 -#: utils/time/snapmgr.c:1383 utils/time/snapmgr.c:1485 -#: utils/time/snapmgr.c:1501 utils/time/snapmgr.c:1526 +#: utils/time/snapmgr.c:1296 utils/time/snapmgr.c:1301 +#: utils/time/snapmgr.c:1306 utils/time/snapmgr.c:1321 +#: utils/time/snapmgr.c:1326 utils/time/snapmgr.c:1331 +#: utils/time/snapmgr.c:1346 utils/time/snapmgr.c:1351 +#: utils/time/snapmgr.c:1356 utils/time/snapmgr.c:1470 +#: utils/time/snapmgr.c:1486 utils/time/snapmgr.c:1511 #, c-format msgid "invalid snapshot data in file \"%s\"" msgstr "неприпуÑтимі дані знімку в файлі \"%s\"" -#: utils/time/snapmgr.c:1420 +#: utils/time/snapmgr.c:1393 #, c-format msgid "SET TRANSACTION SNAPSHOT must be called before any query" msgstr "SET TRANSACTION SNAPSHOT повинна викликатиÑÑŒ перед будь-Ñким запитом" -#: utils/time/snapmgr.c:1429 +#: utils/time/snapmgr.c:1402 #, c-format msgid "a snapshot-importing transaction must have isolation level SERIALIZABLE or REPEATABLE READ" msgstr "транзакціÑ, Ñка імпортує знімок, повинна мати рівень ізолÑції SERIALIZABLE або REPEATABLE READ" -#: utils/time/snapmgr.c:1438 utils/time/snapmgr.c:1447 +#: utils/time/snapmgr.c:1411 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "неприпуÑтимий ідентифікатор знімка: \"%s\"" -#: utils/time/snapmgr.c:1539 +#: utils/time/snapmgr.c:1426 +#, c-format +msgid "snapshot \"%s\" does not exist" +msgstr "знімок \"%s\" не Ñ–Ñнує" + +#: utils/time/snapmgr.c:1524 #, c-format msgid "a serializable transaction cannot import a snapshot from a non-serializable transaction" msgstr "Ñеріалізована Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð½Ðµ може імпортувати знімок з не Ñеріалізованої транзакції" -#: utils/time/snapmgr.c:1543 +#: utils/time/snapmgr.c:1528 #, c-format msgid "a non-read-only serializable transaction cannot import a snapshot from a read-only transaction" msgstr "Ñеріалізована Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð² режимі \"читаннÑ-запиÑ\" не може імпортувати знімок з транзакції в режимі \"тільки читаннÑ\"" -#: utils/time/snapmgr.c:1558 +#: utils/time/snapmgr.c:1543 #, c-format msgid "cannot import a snapshot from a different database" msgstr "імпортувати знімок з іншої бази даних не можна" -#: gram.y:1260 +#: gram.y:1231 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD більше не підтримуєтьÑÑ" -#: gram.y:1261 +#: gram.y:1232 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "Видаліть UNENCRYPTED, щоб зберегти пароль у зашифрованій формі." -#: gram.y:1323 -#, c-format -msgid "unrecognized role option \"%s\"" -msgstr "нерозпізнаний параметр ролі \"%s\"" - -#: gram.y:1588 gram.y:1604 +#: gram.y:1559 gram.y:1575 #, c-format msgid "CREATE SCHEMA IF NOT EXISTS cannot include schema elements" msgstr "CREATE SCHEMA IF NOT EXISTS не може включати елементи Ñхеми" -#: gram.y:1761 +#: gram.y:1727 #, c-format msgid "current database cannot be changed" msgstr "поточна база даних не може бути змінена" -#: gram.y:1894 +#: gram.y:1860 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "інтервал, Ñкий задає чаÑовий поÑÑ, повинен бути HOUR або HOUR TO MINUTE" -#: gram.y:2511 +#: gram.y:2487 #, c-format msgid "column number must be in range from 1 to %d" msgstr "номер ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð¿Ð¾Ð²Ð¸Ð½ÐµÐ½ бути в діапазоні від 1 до %d" -#: gram.y:3113 +#: gram.y:3083 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "параметр поÑлідовноÑті \"%s\" тут не підтримуєтьÑÑ" -#: gram.y:3142 +#: gram.y:3122 #, c-format msgid "modulus for hash partition provided more than once" msgstr "модуль Ð´Ð»Ñ Ð³ÐµÑˆ-Ñекції вказано неодноразово" -#: gram.y:3151 +#: gram.y:3131 #, c-format msgid "remainder for hash partition provided more than once" msgstr "решта Ð´Ð»Ñ Ð³ÐµÑˆ-Ñекції вказана неодноразово" -#: gram.y:3158 +#: gram.y:3138 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "нерозпізнана ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ– геш-Ñекції \"%s\"" -#: gram.y:3166 +#: gram.y:3146 #, c-format msgid "modulus for hash partition must be specified" msgstr "потрібно вказати модуль Ð´Ð»Ñ Ð³ÐµÑˆ-Ñекції" -#: gram.y:3170 +#: gram.y:3150 #, c-format msgid "remainder for hash partition must be specified" msgstr "потрібно вказати решту Ð´Ð»Ñ Ð³ÐµÑˆ-Ñекції" -#: gram.y:3378 gram.y:3412 +#: gram.y:3358 gram.y:3392 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUT не допуÑкаєтьÑÑ Ð· PROGRAM" -#: gram.y:3384 +#: gram.y:3364 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "Ð ÐµÑ‡ÐµÐ½Ð½Ñ WHERE не дозволÑєтьÑÑ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовувати з COPY TO" -#: gram.y:3723 gram.y:3730 gram.y:12873 gram.y:12881 +#: gram.y:3712 gram.y:3719 gram.y:13023 gram.y:13031 #, c-format msgid "GLOBAL is deprecated in temporary table creation" msgstr "GLOBAL при Ñтворенні тимчаÑових таблиць заÑтаріло" @@ -29038,510 +30550,522 @@ msgstr "GLOBAL при Ñтворенні тимчаÑових таблиць з msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "Ð´Ð»Ñ Ð·Ð³ÐµÐ½ÐµÑ€Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ ÑтовпцÑ, потрібно вказати GENERATED ALWAYS" -#: gram.y:4378 +#: gram.y:4432 #, c-format msgid "a column list with %s is only supported for ON DELETE actions" msgstr "ÑпиÑок Ñтовпців з %s підтримуєтьÑÑ Ð»Ð¸ÑˆÐµ Ð´Ð»Ñ Ð´Ñ–Ð¹ ON DELETE" -#: gram.y:5088 +#: gram.y:5151 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM більше не підтримуєтьÑÑ" -#: gram.y:5786 +#: gram.y:5849 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "нерозпізнаний параметр безпеки Ñ€Ñдка \"%s\"" -#: gram.y:5787 +#: gram.y:5850 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "Ðаразі підтримуютьÑÑ Ð»Ð¸ÑˆÐµ політики PERMISSIVE або RESTRICTIVE." -#: gram.y:5872 +#: gram.y:5935 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" msgstr "CREATE OR REPLACE CONSTRAINT TRIGGER не підтримуєтьÑÑ" -#: gram.y:5909 +#: gram.y:5972 msgid "duplicate trigger events specified" msgstr "вказані події тригера повторюютьÑÑ" -#: gram.y:6058 +#: gram.y:6121 #, c-format msgid "conflicting constraint properties" msgstr "конфліктуючі влаÑтивоÑті обмеженнÑ" -#: gram.y:6157 +#: gram.y:6220 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTION ще не реалізований" -#: gram.y:6565 +#: gram.y:6537 +#, c-format +msgid "dropping an enum value is not implemented" +msgstr "Ð²Ñ–Ð´ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ»Ñ–ÐºÑƒ не реалізовано" + +#: gram.y:6655 #, c-format msgid "RECHECK is no longer required" msgstr "RECHECK більше не потребуєтьÑÑ" -#: gram.y:6566 +#: gram.y:6656 #, c-format msgid "Update your data type." msgstr "Поновіть ваш тип даних." -#: gram.y:8422 +#: gram.y:8529 #, c-format msgid "aggregates cannot have output arguments" msgstr "агрегатні функції не можуть мати вихідних аргументів" -#: gram.y:11107 gram.y:11126 +#: gram.y:11221 gram.y:11240 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTION не підтримуєтьÑÑ Ð´Ð»Ñ Ñ€ÐµÐºÑƒÑ€Ñивних подань" -#: gram.y:13012 +#: gram.y:13162 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "СинтакÑÐ¸Ñ LIMIT #,# не підтримуєтьÑÑ" -#: gram.y:13013 +#: gram.y:13163 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "ВикориÑтайте окремі Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ LIMIT Ñ– OFFSET." -#: gram.y:13366 gram.y:13392 -#, c-format -msgid "VALUES in FROM must have an alias" -msgstr "VALUES в FROM повинен мати пÑевдонім" - -#: gram.y:13367 gram.y:13393 -#, c-format -msgid "For example, FROM (VALUES ...) [AS] foo." -msgstr "Ðаприклад, FROM (VALUES ...) [AS] foo." - -#: gram.y:13372 gram.y:13398 -#, c-format -msgid "subquery in FROM must have an alias" -msgstr "підзапит в FROM повинен мати пÑевдонім" - -#: gram.y:13373 gram.y:13399 -#, c-format -msgid "For example, FROM (SELECT ...) [AS] foo." -msgstr "Ðаприклад, FROM (SELECT ...) [AS] foo." - -#: gram.y:13932 +#: gram.y:14038 #, c-format msgid "only one DEFAULT value is allowed" msgstr "допуÑкаєтьÑÑ Ð»Ð¸ÑˆÐµ одне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ DEFAULT" -#: gram.y:13941 +#: gram.y:14047 #, c-format msgid "only one PATH value per column is allowed" msgstr "Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð´Ð¾Ð¿ÑƒÑкаєтьÑÑ Ð»Ð¸ÑˆÐµ одне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ PATH" -#: gram.y:13950 +#: gram.y:14056 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "конфліктуючі або надлишкові Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ NULL / NOT NULL Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: gram.y:13959 +#: gram.y:14065 #, c-format msgid "unrecognized column option \"%s\"" msgstr "нерозпізнаний параметр ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: gram.y:14217 +#: gram.y:14147 +#, c-format +msgid "only string constants are supported in JSON_TABLE path specification" +msgstr "у Ñпецифікації шлÑху JSON_TABLE підтримуютьÑÑ Ð»Ð¸ÑˆÐµ Ñ€Ñдкові конÑтанти" + +#: gram.y:14469 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "точніÑть Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ float повинна бути мінімум 1 біт" -#: gram.y:14226 +#: gram.y:14478 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "точніÑть Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ float повинна бути меньше 54 біт" -#: gram.y:14736 +#: gram.y:14995 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "неправильна кількіÑть параметрів у лівій чаÑтині виразу OVERLAPS" -#: gram.y:14741 +#: gram.y:15000 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "неправильна кількіÑть параметрів у правій чаÑтині виразу OVERLAPS" -#: gram.y:14918 +#: gram.y:15177 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "Предикат UNIQUE ще не реалізований" -#: gram.y:15356 +#: gram.y:15591 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "викориÑтовувати Ñ€ÐµÑ‡ÐµÐ½Ð½Ñ ORDER BY з WITHIN GROUP неодноразово, не можна" -#: gram.y:15361 +#: gram.y:15596 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "викориÑтовувати DISTINCT з WITHIN GROUP не можна" -#: gram.y:15366 +#: gram.y:15601 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "викориÑтовувати VARIADIC з WITHIN GROUP не можна" -#: gram.y:15916 gram.y:15940 +#: gram.y:16328 gram.y:16352 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "початком рамки не може бути UNBOUNDED FOLLOWING" -#: gram.y:15921 +#: gram.y:16333 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "рамка, Ñка починаєтьÑÑ Ð· наÑтупного Ñ€Ñдка не можна закінчуватиÑÑŒ поточним Ñ€Ñдком" -#: gram.y:15945 +#: gram.y:16357 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "кінцем рамки не може бути UNBOUNDED PRECEDING" -#: gram.y:15951 +#: gram.y:16363 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "рамка, Ñка починаєтьÑÑ Ð· поточного Ñ€Ñдка не може мати попередніх Ñ€Ñдків" -#: gram.y:15958 +#: gram.y:16370 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "рамка, Ñка починаєтьÑÑ Ð· наÑтупного Ñ€Ñдка не може мати попередніх Ñ€Ñдків" -#: gram.y:16644 gram.y:16836 +#: gram.y:16919 #, c-format -msgid "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" -msgstr "Поведінка SQL/JSON QUOTES не повинна визначатиÑÑ, коли викориÑтовуєтьÑÑ WITH WRAPPER" +msgid "unrecognized JSON encoding: %s" +msgstr "нерозпізнане ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ JSON: %s" -#: gram.y:17390 +#: gram.y:17243 #, c-format msgid "type modifier cannot have parameter name" msgstr "тип modifier не може мати ім'Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°" -#: gram.y:17396 +#: gram.y:17249 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "тип modifier не може мати ORDER BY" -#: gram.y:17464 gram.y:17471 gram.y:17478 +#: gram.y:17317 gram.y:17324 gram.y:17331 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s не можна викориÑтовувати тут Ñк ім'Ñ Ñ€Ð¾Ð»Ñ–" -#: gram.y:17568 gram.y:19055 +#: gram.y:17421 gram.y:18906 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIES не можна задати без оператора ORDER BY" -#: gram.y:18734 gram.y:18921 +#: gram.y:18597 gram.y:18772 msgid "improper use of \"*\"" msgstr "неправильне викориÑÑ‚Ð°Ð½Ð½Ñ \"*\"" -#: gram.y:18985 +#: gram.y:18836 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "Ñортувальна агрегатна Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð· прÑмим аргументом VARIADIC повинна мати один агрегатний аргумент VARIADIC того ж типу даних" -#: gram.y:19022 +#: gram.y:18873 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "кілька речень ORDER BY не допуÑкаєтьÑÑ" -#: gram.y:19033 +#: gram.y:18884 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "кілька речень OFFSET не допуÑкаєтьÑÑ" -#: gram.y:19042 +#: gram.y:18893 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "кілька речень LIMIT не допуÑкаєтьÑÑ" -#: gram.y:19051 +#: gram.y:18902 #, c-format msgid "multiple limit options not allowed" msgstr "викориÑÑ‚Ð°Ð½Ð½Ñ Ð´ÐµÐºÑ–Ð»ÑŒÐºÐ¾Ñ… параметрів Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ðµ дозволÑєтьÑÑ" -#: gram.y:19078 +#: gram.y:18929 #, c-format msgid "multiple WITH clauses not allowed" msgstr "кілька речень WITH не допуÑкаєтьÑÑ" -#: gram.y:19271 +#: gram.y:19122 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "Ð’ табличних функціÑÑ… аргументи OUT Ñ– INOUT не дозволÑютьÑÑ" -#: gram.y:19404 +#: gram.y:19255 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "кілька речень COLLATE не допуÑкаєтьÑÑ" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19442 gram.y:19455 +#: gram.y:19293 gram.y:19306 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ %s не можуть бути позначені DEFERRABLE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19468 +#: gram.y:19319 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ %s не можуть бути позначені NOT VALID" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19481 +#: gram.y:19332 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ %s не можуть бути позначені NO INHERIT" -#: gram.y:19505 +#: gram.y:19354 +#, c-format +msgid "unrecognized partitioning strategy \"%s\"" +msgstr "нерозпізнана ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ñ–Ñ ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"" + +#: gram.y:19378 #, c-format msgid "invalid publication object list" msgstr "неприпуÑтимий ÑпиÑок об'єктів публікації" -#: gram.y:19506 +#: gram.y:19379 #, c-format -msgid "One of TABLE or ALL TABLES IN SCHEMA must be specified before a standalone table or schema name." -msgstr "Одну з TABLE або ALL TABLES IN SCHEMA необхідно вказати перед назвою автономної таблиці або Ñхеми." +msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." +msgstr "Одну з TABLE або TABLES IN SCHEMA необхідно вказати перед назвою автономної таблиці або Ñхеми." -#: gram.y:19522 +#: gram.y:19395 #, c-format -msgid "invalid table name at or near" -msgstr "неприпуÑтима назва таблиці білÑ" +msgid "invalid table name" +msgstr "неприпуÑтиме ім'Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–" -#: gram.y:19543 +#: gram.y:19416 #, c-format msgid "WHERE clause not allowed for schema" msgstr "Ð ÐµÑ‡ÐµÐ½Ð½Ñ WHERE не допуÑкаєтьÑÑ Ð´Ð»Ñ Ñхеми" -#: gram.y:19550 +#: gram.y:19423 #, c-format msgid "column specification not allowed for schema" msgstr "ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð½Ðµ дозволена Ð´Ð»Ñ Ñхеми" -#: gram.y:19564 -#, c-format -msgid "invalid schema name at or near" -msgstr "неприпуÑтиме ім'Ñ Ñхеми на або поблизу" - -#: guc-file.l:314 -#, c-format -msgid "unrecognized configuration parameter \"%s\" in file \"%s\" line %d" -msgstr "нерозпізнаний параметр конфігурації \"%s\" у файлі \"%s\" Ñ€Ñдок %d" - -#: guc-file.l:389 -#, c-format -msgid "parameter \"%s\" removed from configuration file, reset to default" -msgstr "параметр \"%s\" видалений з файла конфігурації, Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñкинуто до \"за замовчуваннÑм\"" - -#: guc-file.l:454 -#, c-format -msgid "parameter \"%s\" changed to \"%s\"" -msgstr "параметр \"%s\" змінено на \"%s\"" - -#: guc-file.l:496 -#, c-format -msgid "configuration file \"%s\" contains errors" -msgstr "файл конфігурації \"%s\" міÑтить помилки" - -#: guc-file.l:501 -#, c-format -msgid "configuration file \"%s\" contains errors; unaffected changes were applied" -msgstr "файл конфігурації \"%s\" міÑтить помилки; були заÑтоÑовані не залежні зміни" - -#: guc-file.l:506 +#: gram.y:19437 #, c-format -msgid "configuration file \"%s\" contains errors; no changes were applied" -msgstr "файл конфігурації \"%s\" міÑтить помилки; зміни не були заÑтоÑовані" +msgid "invalid schema name" +msgstr "неприпуÑтиме ім'Ñ Ñхеми" -#: guc-file.l:578 +#: guc-file.l:192 #, c-format msgid "empty configuration file name: \"%s\"" msgstr "пуÑта назва файлу конфігурації: \"%s\"" -#: guc-file.l:595 +#: guc-file.l:209 #, c-format msgid "could not open configuration file \"%s\": maximum nesting depth exceeded" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл конфігурації \"%s\": макÑимальну глибину Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ð¸Ñ‰ÐµÐ½Ð¾" -#: guc-file.l:615 +#: guc-file.l:229 #, c-format msgid "configuration file recursion in \"%s\"" msgstr "рекурÑÑ–Ñ Ñ„Ð°Ð¹Ð»Ñƒ конфігурації в \"%s\"" -#: guc-file.l:642 +#: guc-file.l:245 +#, c-format +msgid "could not open configuration file \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл конфігурації \"%s\": %m" + +#: guc-file.l:256 #, c-format msgid "skipping missing configuration file \"%s\"" msgstr "відÑутній файл конфігурації \"%s\" пропуÑкаєтьÑÑ" -#: guc-file.l:896 +#: guc-file.l:511 #, c-format msgid "syntax error in file \"%s\" line %u, near end of line" msgstr "ÑинтакÑична помилка у файлі \"%s\" поблизу ÐºÑ–Ð½Ñ†Ñ Ñ€Ñдка %u" -#: guc-file.l:906 +#: guc-file.l:521 #, c-format msgid "syntax error in file \"%s\" line %u, near token \"%s\"" msgstr "ÑинтакÑична помилка у файлі \"%s\" Ñ€Ñдок %u, поблизу маркера \"%s\"" -#: guc-file.l:926 +#: guc-file.l:541 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "знайдено занадто багато ÑинтакÑичних помилок, Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\"" -#: guc-file.l:981 -#, c-format -msgid "empty configuration directory name: \"%s\"" -msgstr "пуÑта назва каталогу конфігурації: \"%s\"" - -#: guc-file.l:1000 +#: jsonpath_gram.y:267 #, c-format -msgid "could not open configuration directory \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог конфігурації \"%s\": %m" +msgid ".decimal() can only have an optional precision[,scale]." +msgstr ".decimal() може мати лише необов'Ñзковий параметр precision[,scale]." -#: jsonpath_gram.y:529 +#: jsonpath_gram.y:599 #, c-format msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." msgstr "Ðерозпізнаний Ñимвол позначки \"%.*s\" в предикаті LIKE_REGEX." -#: jsonpath_gram.y:583 +#: jsonpath_gram.y:677 #, c-format msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" msgstr "XQuery \"x\" позначка (розширені регулÑрні вирази) не реалізовано" +#: jsonpath_scan.l:174 +msgid "invalid Unicode escape sequence" +msgstr "неприпуÑтима Ñпеціальна поÑлідовніÑть Unicode" + +#: jsonpath_scan.l:180 +msgid "invalid hexadecimal character sequence" +msgstr "неприпуÑтима шіÑтнадцÑткова поÑлідовніÑть Ñимволів" + +#: jsonpath_scan.l:195 +msgid "unexpected end after backslash" +msgstr "неочікуваний кінець піÑÐ»Ñ Ð·Ð²Ð¾Ñ€Ð¾Ñ‚Ð½Ð¾Ð³Ð¾ Ñлеша" + +#: jsonpath_scan.l:201 repl_scanner.l:211 scan.l:756 +msgid "unterminated quoted string" +msgstr "незавершений Ñ€Ñдок в лапках" + +#: jsonpath_scan.l:228 +msgid "unexpected end of comment" +msgstr "неочікуваний кінець коментарÑ" + +#: jsonpath_scan.l:319 +msgid "invalid numeric literal" +msgstr "невірна чиÑлова конÑтанта" + +#: jsonpath_scan.l:325 jsonpath_scan.l:331 jsonpath_scan.l:337 scan.l:1064 +#: scan.l:1068 scan.l:1072 scan.l:1076 +msgid "trailing junk after numeric literal" +msgstr "ÑÐ¼Ñ–Ñ‚Ñ‚Ñ Ð¿Ñ–ÑÐ»Ñ Ñ‡Ð¸Ñлового літерала" + #. translator: %s is typically "syntax error" -#: jsonpath_scan.l:282 +#: jsonpath_scan.l:375 #, c-format msgid "%s at end of jsonpath input" msgstr "%s в кінці Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ jsonpath" #. translator: first %s is typically "syntax error" -#: jsonpath_scan.l:289 +#: jsonpath_scan.l:382 #, c-format msgid "%s at or near \"%s\" of jsonpath input" msgstr "%s в або Ð±Ñ–Ð»Ñ \"%s\" Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ jsonpath" -#: repl_gram.y:303 repl_gram.y:335 +#: jsonpath_scan.l:568 +msgid "invalid input" +msgstr "неправильні вхідні дані" + +#: jsonpath_scan.l:594 +msgid "invalid hexadecimal digit" +msgstr "неприпуÑтима шіÑтнадцÑткова цифра" + +#: jsonpath_scan.l:625 +#, c-format +msgid "could not convert Unicode to server encoding" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ Юнікод в Ñерверне кодуваннÑ" + +#: repl_gram.y:318 repl_gram.y:359 #, c-format msgid "invalid timeline %u" msgstr "неприпуÑтима чаÑова шкала %u" -#: repl_scanner.l:142 +#: repl_scanner.l:154 msgid "invalid streaming start location" msgstr "неприпуÑтиме Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÑƒ потокового передаваннÑ" -#: repl_scanner.l:199 scan.l:724 -msgid "unterminated quoted string" -msgstr "незавершений Ñ€Ñдок в лапках" - -#: scan.l:465 +#: scan.l:497 msgid "unterminated /* comment" msgstr "незавершений коментар /*" -#: scan.l:485 +#: scan.l:517 msgid "unterminated bit string literal" msgstr "незавершений бітовий Ñ€Ñдок" -#: scan.l:499 +#: scan.l:531 msgid "unterminated hexadecimal string literal" msgstr "незавершений шіÑтнадцÑтковий Ñ€Ñдок" -#: scan.l:549 +#: scan.l:581 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "небезпечне викориÑÑ‚Ð°Ð½Ð½Ñ Ñ€Ñдкової конÑтани зі Ñпеціальними кодами Unicode" -#: scan.l:550 +#: scan.l:582 #, c-format -msgid "String constants with Unicode escapes cannot be used when standard_conforming_strings is off." -msgstr "КонÑтанти Ñ€Ñдка зі Ñпеціальними кодами Unicode не можна викориÑтовувати, коли параметр standard_conforming_strings вимкнений." +msgid "String constants with Unicode escapes cannot be used when \"standard_conforming_strings\" is off." +msgstr "КонÑтанти Ñ€Ñдка зі Ñпеціальними кодами Unicode не можна викориÑтовувати, коли параметр \"standard_conforming_strings\" вимкнений." -#: scan.l:611 +#: scan.l:643 msgid "unhandled previous state in xqs" msgstr "необроблений попередній Ñтан у xqs" -#: scan.l:685 +#: scan.l:717 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "Спеціальні коди Unicode повинні бути \\uXXXX або \\UXXXXXXXX." -#: scan.l:696 +#: scan.l:728 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "небезпечне викориÑÑ‚Ð°Ð½Ð½Ñ Ñимволу \\' в Ñ€Ñдку" -#: scan.l:697 +#: scan.l:729 #, c-format msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." msgstr "ВикориÑтайте \" щоб запиÑати лапки в Ñ€Ñдку. Ð—Ð°Ð¿Ð¸Ñ \\' небезпечний лише Ð´Ð»Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ñьких кодувань." -#: scan.l:769 +#: scan.l:801 msgid "unterminated dollar-quoted string" msgstr "незавершений Ñ€Ñдок з $" -#: scan.l:786 scan.l:796 +#: scan.l:818 scan.l:828 msgid "zero-length delimited identifier" msgstr "пуÑтий ідентифікатор із роздільниками" -#: scan.l:807 syncrep_scanner.l:91 +#: scan.l:839 syncrep_scanner.l:101 msgid "unterminated quoted identifier" msgstr "незавершений ідентифікатор в лапках" -#: scan.l:970 +#: scan.l:1002 msgid "operator too long" msgstr "занадто довгий оператор" -#: scan.l:983 +#: scan.l:1015 msgid "trailing junk after parameter" msgstr "ÑÐ¼Ñ–Ñ‚Ñ‚Ñ Ð¿Ñ–ÑÐ»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ" -#: scan.l:1008 scan.l:1012 scan.l:1016 scan.l:1020 -msgid "trailing junk after numeric literal" -msgstr "ÑÐ¼Ñ–Ñ‚Ñ‚Ñ Ð¿Ñ–ÑÐ»Ñ Ñ‡Ð¸Ñлового літерала" +#: scan.l:1036 +msgid "invalid hexadecimal integer" +msgstr "неприпуÑтиме шіÑтнадцÑткове чиÑло" + +#: scan.l:1040 +msgid "invalid octal integer" +msgstr "помилкове віÑімкове чиÑло" + +#: scan.l:1044 +msgid "invalid binary integer" +msgstr "неприпуÑтиме двійкове ціле чиÑло" #. translator: %s is typically the translation of "syntax error" -#: scan.l:1183 +#: scan.l:1239 #, c-format msgid "%s at end of input" msgstr "%s в кінці введеннÑ" #. translator: first %s is typically the translation of "syntax error" -#: scan.l:1191 +#: scan.l:1247 #, c-format msgid "%s at or near \"%s\"" msgstr "%s в або поблизу \"%s\"" -#: scan.l:1382 +#: scan.l:1439 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "неÑтандартне викориÑÑ‚Ð°Ð½Ð½Ñ \\' в Ñ€Ñдку" -#: scan.l:1383 +#: scan.l:1440 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "Щоб запиÑати лапки у Ñ€Ñдку викориÑтовуйте \" або ÑинтакÑÐ¸Ñ Ñпеціальних Ñ€Ñдків (E'...')." -#: scan.l:1392 +#: scan.l:1449 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "неÑтандартне викориÑÑ‚Ð°Ð½Ð½Ñ \\\\ в Ñ€Ñдку" -#: scan.l:1393 +#: scan.l:1450 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "Ð”Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу зворотніх ÑкіÑних риÑок \"\\\" викориÑтовуйте ÑинтакÑÐ¸Ñ Ñпеціальних Ñ€Ñдків, наприклад E'\\\\'." -#: scan.l:1407 +#: scan.l:1464 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "неÑтандартне викориÑÑ‚Ð°Ð½Ð½Ñ Ñпеціального Ñимволу в Ñ€Ñдку" -#: scan.l:1408 +#: scan.l:1465 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Ð”Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу Ñпеціальних Ñимволів викориÑтовуйте ÑинтакÑÐ¸Ñ Ñпеціальних Ñ€Ñдків E'\\r\\n'." + diff --git a/src/backend/port/Makefile b/src/backend/port/Makefile index 2d00b4f05a7fd..47338d9922957 100644 --- a/src/backend/port/Makefile +++ b/src/backend/port/Makefile @@ -43,6 +43,6 @@ else $(CC) $(CFLAGS) -c $< endif -distclean clean: +clean: rm -f tas_cpp.s $(MAKE) -C win32 clean diff --git a/src/backend/port/aix/mkldexport.sh b/src/backend/port/aix/mkldexport.sh deleted file mode 100755 index adf3793e8686b..0000000000000 --- a/src/backend/port/aix/mkldexport.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/sh -# -# mkldexport -# create an AIX exports file from an object file -# -# src/backend/port/aix/mkldexport.sh -# -# Usage: -# mkldexport objectfile [location] -# where -# objectfile is the current location of the object file. -# location is the eventual (installed) location of the -# object file (if different from the current -# working directory). -# -# [This file comes from the Postgres 4.2 distribution. - ay 7/95] -# -# Header: /usr/local/devel/postgres/src/tools/mkldexport/RCS/mkldexport.sh,v 1.2 1994/03/13 04:59:12 aoki Exp -# - -# setting this to nm -B might be better -# ... due to changes in AIX 4.x ... -# ... let us search in different directories - Gerhard Reithofer -if [ -x /usr/ucb/nm ] -then NM=/usr/ucb/nm -elif [ -x /usr/bin/nm ] -then NM=/usr/bin/nm -elif [ -x /usr/ccs/bin/nm ] -then NM=/usr/ccs/bin/nm -elif [ -x /usr/usg/bin/nm ] -then NM=/usr/usg/bin/nm -else echo "Fatal error: cannot find `nm' ... please check your installation." - exit 1 -fi - -CMDNAME=`basename $0` -if [ -z "$1" ]; then - echo "Usage: $CMDNAME object [location]" - exit 1 -fi -OBJNAME=`basename $1` -if [ "`basename $OBJNAME`" != "`basename $OBJNAME .o`" ]; then - OBJNAME=`basename $OBJNAME .o`.so -fi -if [ -z "$2" ]; then - echo '#!' -else - if [ "$2" = "." ]; then - # for the base executable (AIX 4.2 and up) - echo '#! .' - else - echo '#!' $2 - fi -fi -$NM -BCg $1 | \ - egrep ' [TDB] ' | \ - sed -e 's/.* //' | \ - egrep -v '\$' | \ - sed -e 's/^[.]//' | \ - sort | \ - uniq diff --git a/src/backend/port/atomics.c b/src/backend/port/atomics.c index 22123929e8d0d..93789b4e0584b 100644 --- a/src/backend/port/atomics.c +++ b/src/backend/port/atomics.c @@ -3,7 +3,7 @@ * atomics.c * Non-Inline parts of the atomics implementation * - * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/port/meson.build b/src/backend/port/meson.build index 8fa68a88aa877..7820e86016dd4 100644 --- a/src/backend/port/meson.build +++ b/src/backend/port/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'atomics.c', diff --git a/src/backend/port/posix_sema.c b/src/backend/port/posix_sema.c index 315ed16b197eb..5886d2233f5bd 100644 --- a/src/backend/port/posix_sema.c +++ b/src/backend/port/posix_sema.c @@ -15,7 +15,7 @@ * forked backends, but they could not be accessed by exec'd backends. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/port/sysv_sema.c b/src/backend/port/sysv_sema.c index 0e9c35994ab15..aafd44c866e12 100644 --- a/src/backend/port/sysv_sema.c +++ b/src/backend/port/sysv_sema.c @@ -4,7 +4,7 @@ * Implement PGSemaphores using SysV semaphore facilities * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -50,8 +50,14 @@ typedef int IpcSemaphoreId; /* semaphore ID returned by semget(2) */ * we allocate. It must be *less than* your kernel's SEMMSL (max semaphores * per set) parameter, which is often around 25. (Less than, because we * allocate one extra sema in each set for identification purposes.) + * + * The present value of 19 is chosen with one eye on NetBSD/OpenBSD's default + * SEMMNS setting of 60. Remembering the extra sema per set, this lets us + * allocate three sets with 57 useful semaphores before exceeding that, which + * is enough to run our core regression tests. Users of those systems will + * still want to raise SEMMNS for any sort of production work, though. */ -#define SEMAS_PER_SET 16 +#define SEMAS_PER_SET 19 #define IPCProtection (0600) /* access/modify by user only */ @@ -127,7 +133,7 @@ InternalIpcSemaphoreCreate(IpcSemaphoreKey semKey, int numSems) "semaphore sets (SEMMNI), or the system wide maximum number of " "semaphores (SEMMNS), would be exceeded. You need to raise the " "respective kernel parameter. Alternatively, reduce PostgreSQL's " - "consumption of semaphores by reducing its max_connections parameter.\n" + "consumption of semaphores by reducing its \"max_connections\" parameter.\n" "The PostgreSQL documentation contains more information about " "configuring your system for PostgreSQL.") : 0)); } diff --git a/src/backend/port/sysv_shmem.c b/src/backend/port/sysv_shmem.c index eaba244bc9c85..362a37d3b3a21 100644 --- a/src/backend/port/sysv_shmem.c +++ b/src/backend/port/sysv_shmem.c @@ -9,7 +9,7 @@ * exist, though, because mmap'd shmem provides no way to find out how * many processes are attached, which we need for interlocking purposes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -34,6 +34,7 @@ #include "storage/fd.h" #include "storage/ipc.h" #include "storage/pg_shmem.h" +#include "utils/guc.h" #include "utils/guc_hooks.h" #include "utils/pidfile.h" @@ -86,7 +87,7 @@ typedef enum SHMSTATE_ATTACHED, /* pertinent to DataDir, has attached PIDs */ SHMSTATE_ENOENT, /* no segment of that ID */ SHMSTATE_FOREIGN, /* exists, but not pertinent to DataDir */ - SHMSTATE_UNATTACHED /* pertinent to DataDir, no attached PIDs */ + SHMSTATE_UNATTACHED, /* pertinent to DataDir, no attached PIDs */ } IpcMemoryState; @@ -580,7 +581,7 @@ check_huge_page_size(int *newval, void **extra, GucSource source) /* Recent enough Linux only, for now. See GetHugePageSize(). */ if (*newval != 0) { - GUC_check_errdetail("huge_page_size must be 0 on this platform."); + GUC_check_errdetail("\"huge_page_size\" must be 0 on this platform."); return false; } #endif @@ -627,6 +628,14 @@ CreateAnonymousSegment(Size *size) } #endif + /* + * Report whether huge pages are in use. This needs to be tracked before + * the second mmap() call if attempting to use huge pages failed + * previously. + */ + SetConfigOption("huge_pages_status", (ptr == MAP_FAILED) ? "off" : "on", + PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); + if (ptr == MAP_FAILED && huge_pages != HUGE_PAGES_ON) { /* @@ -649,8 +658,8 @@ CreateAnonymousSegment(Size *size) "for a shared memory segment exceeded available memory, " "swap space, or huge pages. To reduce the request size " "(currently %zu bytes), reduce PostgreSQL's shared " - "memory usage, perhaps by reducing shared_buffers or " - "max_connections.", + "memory usage, perhaps by reducing \"shared_buffers\" or " + "\"max_connections\".", allocsize) : 0)); } @@ -720,7 +729,7 @@ PGSharedMemoryCreate(Size size, if (huge_pages == HUGE_PAGES_ON && shared_memory_type != SHMEM_TYPE_MMAP) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("huge pages not supported with the current shared_memory_type setting"))); + errmsg("huge pages not supported with the current \"shared_memory_type\" setting"))); /* Room for a header? */ Assert(size > MAXALIGN(sizeof(PGShmemHeader))); @@ -737,8 +746,14 @@ PGSharedMemoryCreate(Size size, sysvsize = sizeof(PGShmemHeader); } else + { sysvsize = size; + /* huge pages are only available with mmap */ + SetConfigOption("huge_pages_status", "off", + PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); + } + /* * Loop till we find a free IPC key. Trust CreateDataDirLockFile() to * ensure no more than one postmaster per data directory can enter this diff --git a/src/backend/port/tas/sunstudio_sparc.s b/src/backend/port/tas/sunstudio_sparc.s index daefd0ffea223..3400713afd556 100644 --- a/src/backend/port/tas/sunstudio_sparc.s +++ b/src/backend/port/tas/sunstudio_sparc.s @@ -3,7 +3,7 @@ ! sunstudio_sparc.s ! compare and swap for Sun Studio on Sparc ! -! Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +! Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group ! Portions Copyright (c) 1994, Regents of the University of California ! ! IDENTIFICATION diff --git a/src/backend/port/tas/sunstudio_x86.s b/src/backend/port/tas/sunstudio_x86.s index 5cd8354cdba01..b4608a9ceb267 100644 --- a/src/backend/port/tas/sunstudio_x86.s +++ b/src/backend/port/tas/sunstudio_x86.s @@ -3,7 +3,7 @@ / sunstudio_x86.s / compare and swap for Sun Studio on x86 / -/ Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +/ Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group / Portions Copyright (c) 1994, Regents of the University of California / / IDENTIFICATION diff --git a/src/backend/port/win32/crashdump.c b/src/backend/port/win32/crashdump.c index 3d7c3d554a118..f2af65676850f 100644 --- a/src/backend/port/win32/crashdump.c +++ b/src/backend/port/win32/crashdump.c @@ -28,7 +28,7 @@ * be added, though at the cost of a greater chance of the crash dump failing. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/port/win32/crashdump.c diff --git a/src/backend/port/win32/meson.build b/src/backend/port/win32/meson.build index 937e0a35e43b6..bca70f08e9fb3 100644 --- a/src/backend/port/win32/meson.build +++ b/src/backend/port/win32/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'crashdump.c', diff --git a/src/backend/port/win32/signal.c b/src/backend/port/win32/signal.c index 7afae60e02af7..285cb611b4f09 100644 --- a/src/backend/port/win32/signal.c +++ b/src/backend/port/win32/signal.c @@ -3,7 +3,7 @@ * signal.c * Microsoft Windows Win32 Signal Emulation Functions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/port/win32/signal.c diff --git a/src/backend/port/win32/socket.c b/src/backend/port/win32/socket.c index 9c339397d1278..0a819e07ae132 100644 --- a/src/backend/port/win32/socket.c +++ b/src/backend/port/win32/socket.c @@ -3,7 +3,7 @@ * socket.c * Microsoft Windows Win32 Socket Functions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/port/win32/socket.c @@ -303,6 +303,7 @@ pgwin32_socket(int af, int type, int protocol) if (ioctlsocket(s, FIONBIO, &on)) { TranslateSocketError(); + closesocket(s); return INVALID_SOCKET; } errno = 0; diff --git a/src/backend/port/win32/timer.c b/src/backend/port/win32/timer.c index d8cc2dfd2a78b..b601603a2121c 100644 --- a/src/backend/port/win32/timer.c +++ b/src/backend/port/win32/timer.c @@ -8,7 +8,7 @@ * - Does not support interval timer (value->it_interval) * - Only supports ITIMER_REAL * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/port/win32/timer.c diff --git a/src/backend/port/win32_sema.c b/src/backend/port/win32_sema.c index 7246145cf5d94..f2b54bdfda08b 100644 --- a/src/backend/port/win32_sema.c +++ b/src/backend/port/win32_sema.c @@ -3,7 +3,7 @@ * win32_sema.c * Microsoft Windows Win32 Semaphores Emulation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/port/win32_sema.c diff --git a/src/backend/port/win32_shmem.c b/src/backend/port/win32_shmem.c index 62e08074770f2..3bcce9d3b6329 100644 --- a/src/backend/port/win32_shmem.c +++ b/src/backend/port/win32_shmem.c @@ -3,7 +3,7 @@ * win32_shmem.c * Implement shared memory using win32 facilities * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/port/win32_shmem.c @@ -401,6 +401,11 @@ PGSharedMemoryCreate(Size size, on_shmem_exit(pgwin32_SharedMemoryDelete, PointerGetDatum(hmap2)); *shim = hdr; + + /* Report whether huge pages are in use */ + SetConfigOption("huge_pages_status", (flProtect & SEC_LARGE_PAGES) ? + "on" : "off", PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); + return hdr; } @@ -638,7 +643,7 @@ check_huge_page_size(int *newval, void **extra, GucSource source) { if (*newval != 0) { - GUC_check_errdetail("huge_page_size must be 0 on this platform."); + GUC_check_errdetail("\"huge_page_size\" must be 0 on this platform."); return false; } return true; diff --git a/src/backend/postmaster/Makefile b/src/backend/postmaster/Makefile index 047448b34eb80..db08543d19589 100644 --- a/src/backend/postmaster/Makefile +++ b/src/backend/postmaster/Makefile @@ -20,10 +20,12 @@ OBJS = \ checkpointer.o \ fork_process.o \ interrupt.o \ + launch_backend.o \ pgarch.o \ postmaster.o \ startup.o \ syslogger.o \ + walsummarizer.o \ walwriter.o include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index f929b62e8adaa..51198b779e416 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -51,7 +51,7 @@ * holding the relation lock) during which a worker may choose a table that was * already vacuumed; this is a bug in the current design. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -76,15 +76,16 @@ #include "catalog/dependency.h" #include "catalog/namespace.h" #include "catalog/pg_database.h" +#include "catalog/pg_namespace.h" #include "commands/dbcommands.h" #include "commands/vacuum.h" +#include "common/int.h" #include "lib/ilist.h" #include "libpq/pqsignal.h" #include "miscadmin.h" #include "nodes/makefuncs.h" #include "pgstat.h" #include "postmaster/autovacuum.h" -#include "postmaster/fork_process.h" #include "postmaster/interrupt.h" #include "postmaster/postmaster.h" #include "storage/bufmgr.h" @@ -94,7 +95,6 @@ #include "storage/pmsignal.h" #include "storage/proc.h" #include "storage/procsignal.h" -#include "storage/sinvaladt.h" #include "storage/smgr.h" #include "tcop/tcopprot.h" #include "utils/fmgroids.h" @@ -135,10 +135,6 @@ int Log_autovacuum_min_duration = 600000; #define MIN_AUTOVAC_SLEEPTIME 100.0 /* milliseconds */ #define MAX_AUTOVAC_SLEEPTIME 300 /* seconds */ -/* Flags to tell if we are in an autovacuum process */ -static bool am_autovacuum_launcher = false; -static bool am_autovacuum_worker = false; - /* * Variables to save the cost-related storage parameters for the current * relation being vacuumed by this autovacuum worker. Using these, we can @@ -250,7 +246,7 @@ typedef enum { AutoVacForkFailed, /* failed trying to start a worker */ AutoVacRebalance, /* rebalance the cost limits */ - AutoVacNumSignals /* must be last */ + AutoVacNumSignals, /* must be last */ } AutoVacuumSignal; /* @@ -315,13 +311,6 @@ static WorkerInfo MyWorkerInfo = NULL; /* PID of launcher, valid only in worker while shutting down */ int AutovacuumLauncherPid = 0; -#ifdef EXEC_BACKEND -static pid_t avlauncher_forkexec(void); -static pid_t avworker_forkexec(void); -#endif -NON_EXEC_STATIC void AutoVacWorkerMain(int argc, char *argv[]) pg_attribute_noreturn(); -NON_EXEC_STATIC void AutoVacLauncherMain(int argc, char *argv[]) pg_attribute_noreturn(); - static Oid do_start_worker(void); static void HandleAutoVacLauncherInterrupts(void); static void AutoVacLauncherShutdown(void) pg_attribute_noreturn(); @@ -365,87 +354,23 @@ static void avl_sigusr2_handler(SIGNAL_ARGS); * AUTOVACUUM LAUNCHER CODE ********************************************************************/ -#ifdef EXEC_BACKEND -/* - * forkexec routine for the autovacuum launcher process. - * - * Format up the arglist, then fork and exec. - */ -static pid_t -avlauncher_forkexec(void) -{ - char *av[10]; - int ac = 0; - - av[ac++] = "postgres"; - av[ac++] = "--forkavlauncher"; - av[ac++] = NULL; /* filled in by postmaster_forkexec */ - av[ac] = NULL; - - Assert(ac < lengthof(av)); - - return postmaster_forkexec(ac, av); -} - /* - * We need this set from the outside, before InitProcess is called + * Main entry point for the autovacuum launcher process. */ void -AutovacuumLauncherIAm(void) +AutoVacLauncherMain(char *startup_data, size_t startup_data_len) { - am_autovacuum_launcher = true; -} -#endif + sigjmp_buf local_sigjmp_buf; -/* - * Main entry point for autovacuum launcher process, to be called from the - * postmaster. - */ -int -StartAutoVacLauncher(void) -{ - pid_t AutoVacPID; + Assert(startup_data_len == 0); -#ifdef EXEC_BACKEND - switch ((AutoVacPID = avlauncher_forkexec())) -#else - switch ((AutoVacPID = fork_process())) -#endif + /* Release postmaster's working memory context */ + if (PostmasterContext) { - case -1: - ereport(LOG, - (errmsg("could not fork autovacuum launcher process: %m"))); - return 0; - -#ifndef EXEC_BACKEND - case 0: - /* in postmaster child ... */ - InitPostmasterChild(); - - /* Close the postmaster's sockets */ - ClosePostmasterPorts(false); - - AutoVacLauncherMain(0, NULL); - break; -#endif - default: - return (int) AutoVacPID; + MemoryContextDelete(PostmasterContext); + PostmasterContext = NULL; } - /* shouldn't get here */ - return 0; -} - -/* - * Main loop for the autovacuum launcher process. - */ -NON_EXEC_STATIC void -AutoVacLauncherMain(int argc, char *argv[]) -{ - sigjmp_buf local_sigjmp_buf; - - am_autovacuum_launcher = true; - MyBackendType = B_AUTOVAC_LAUNCHER; init_ps_display(NULL); @@ -476,19 +401,15 @@ AutoVacLauncherMain(int argc, char *argv[]) pqsignal(SIGCHLD, SIG_DFL); /* - * Create a per-backend PGPROC struct in shared memory, except in the - * EXEC_BACKEND case where this was done in SubPostmasterMain. We must do - * this before we can use LWLocks (and in the EXEC_BACKEND case we already - * had to do some stuff with LWLocks). + * Create a per-backend PGPROC struct in shared memory. We must do this + * before we can use LWLocks or access any shared memory. */ -#ifndef EXEC_BACKEND InitProcess(); -#endif /* Early initialization */ BaseInit(); - InitPostgres(NULL, InvalidOid, NULL, InvalidOid, false, false, NULL); + InitPostgres(NULL, InvalidOid, NULL, InvalidOid, 0, NULL); SetProcessingMode(NormalProcessing); @@ -555,7 +476,7 @@ AutoVacLauncherMain(int argc, char *argv[]) FlushErrorState(); /* Flush any leaked data in the top-level context */ - MemoryContextResetAndDeleteChildren(AutovacMemCxt); + MemoryContextReset(AutovacMemCxt); /* don't leave dangling pointers to freed memory */ DatabaseListCxt = NULL; @@ -599,6 +520,7 @@ AutoVacLauncherMain(int argc, char *argv[]) * regular maintenance from being executed. */ SetConfigOption("statement_timeout", "0", PGC_SUSET, PGC_S_OVERRIDE); + SetConfigOption("transaction_timeout", "0", PGC_SUSET, PGC_S_OVERRIDE); SetConfigOption("lock_timeout", "0", PGC_SUSET, PGC_S_OVERRIDE); SetConfigOption("idle_in_transaction_session_timeout", "0", PGC_SUSET, PGC_S_OVERRIDE); @@ -1132,10 +1054,8 @@ rebuild_database_list(Oid newdb) static int db_comparator(const void *a, const void *b) { - if (((const avl_dbase *) a)->adl_score == ((const avl_dbase *) b)->adl_score) - return 0; - else - return (((const avl_dbase *) a)->adl_score < ((const avl_dbase *) b)->adl_score) ? 1 : -1; + return pg_cmp_s32(((const avl_dbase *) a)->adl_score, + ((const avl_dbase *) b)->adl_score); } /* @@ -1423,12 +1343,8 @@ AutoVacWorkerFailed(void) static void avl_sigusr2_handler(SIGNAL_ARGS) { - int save_errno = errno; - got_SIGUSR2 = true; SetLatch(MyLatch); - - errno = save_errno; } @@ -1436,89 +1352,24 @@ avl_sigusr2_handler(SIGNAL_ARGS) * AUTOVACUUM WORKER CODE ********************************************************************/ -#ifdef EXEC_BACKEND /* - * forkexec routines for the autovacuum worker. - * - * Format up the arglist, then fork and exec. - */ -static pid_t -avworker_forkexec(void) -{ - char *av[10]; - int ac = 0; - - av[ac++] = "postgres"; - av[ac++] = "--forkavworker"; - av[ac++] = NULL; /* filled in by postmaster_forkexec */ - av[ac] = NULL; - - Assert(ac < lengthof(av)); - - return postmaster_forkexec(ac, av); -} - -/* - * We need this set from the outside, before InitProcess is called + * Main entry point for autovacuum worker processes. */ void -AutovacuumWorkerIAm(void) +AutoVacWorkerMain(char *startup_data, size_t startup_data_len) { - am_autovacuum_worker = true; -} -#endif + sigjmp_buf local_sigjmp_buf; + Oid dbid; -/* - * Main entry point for autovacuum worker process. - * - * This code is heavily based on pgarch.c, q.v. - */ -int -StartAutoVacWorker(void) -{ - pid_t worker_pid; + Assert(startup_data_len == 0); -#ifdef EXEC_BACKEND - switch ((worker_pid = avworker_forkexec())) -#else - switch ((worker_pid = fork_process())) -#endif + /* Release postmaster's working memory context */ + if (PostmasterContext) { - case -1: - ereport(LOG, - (errmsg("could not fork autovacuum worker process: %m"))); - return 0; - -#ifndef EXEC_BACKEND - case 0: - /* in postmaster child ... */ - InitPostmasterChild(); - - /* Close the postmaster's sockets */ - ClosePostmasterPorts(false); - - AutoVacWorkerMain(0, NULL); - break; -#endif - default: - return (int) worker_pid; + MemoryContextDelete(PostmasterContext); + PostmasterContext = NULL; } - /* shouldn't get here */ - return 0; -} - -/* - * AutoVacWorkerMain - */ -NON_EXEC_STATIC void -AutoVacWorkerMain(int argc, char *argv[]) -{ - sigjmp_buf local_sigjmp_buf; - Oid dbid; - - am_autovacuum_worker = true; - MyBackendType = B_AUTOVAC_WORKER; init_ps_display(NULL); @@ -1548,14 +1399,10 @@ AutoVacWorkerMain(int argc, char *argv[]) pqsignal(SIGCHLD, SIG_DFL); /* - * Create a per-backend PGPROC struct in shared memory, except in the - * EXEC_BACKEND case where this was done in SubPostmasterMain. We must do - * this before we can use LWLocks (and in the EXEC_BACKEND case we already - * had to do some stuff with LWLocks). + * Create a per-backend PGPROC struct in shared memory. We must do this + * before we can use LWLocks or access any shared memory. */ -#ifndef EXEC_BACKEND InitProcess(); -#endif /* Early initialization */ BaseInit(); @@ -1617,6 +1464,7 @@ AutoVacWorkerMain(int argc, char *argv[]) * regular maintenance from being executed. */ SetConfigOption("statement_timeout", "0", PGC_SUSET, PGC_S_OVERRIDE); + SetConfigOption("transaction_timeout", "0", PGC_SUSET, PGC_S_OVERRIDE); SetConfigOption("lock_timeout", "0", PGC_SUSET, PGC_S_OVERRIDE); SetConfigOption("idle_in_transaction_session_timeout", "0", PGC_SUSET, PGC_S_OVERRIDE); @@ -1701,12 +1549,15 @@ AutoVacWorkerMain(int argc, char *argv[]) pgstat_report_autovac(dbid); /* - * Connect to the selected database, specifying no particular user + * Connect to the selected database, specifying no particular user, + * and ignoring datallowconn. Collect the database's name for + * display. * * Note: if we have selected a just-deleted database (due to using * stale stats info), we'll fail and exit here. */ - InitPostgres(NULL, dbid, NULL, InvalidOid, false, false, + InitPostgres(NULL, dbid, NULL, InvalidOid, + INIT_PG_OVERRIDE_ALLOW_CONNS, dbname); SetProcessingMode(NormalProcessing); set_ps_display(dbname); @@ -1972,6 +1823,18 @@ get_database_list(void) avw_dbase *avdb; MemoryContext oldcxt; + /* + * If database has partially been dropped, we can't, nor need to, + * vacuum it. + */ + if (database_is_invalid_form(pgdatabase)) + { + elog(DEBUG2, + "autovacuum: skipping invalid database \"%s\"", + NameStr(pgdatabase->datname)); + continue; + } + /* * Allocate our results in the caller's context, not the * transaction's. We do this inside the loop, and restore the original @@ -2317,6 +2180,24 @@ do_autovacuum(void) continue; } + /* + * Try to lock the temp namespace, too. Even though we have lock on + * the table itself, there's a risk of deadlock against an incoming + * backend trying to clean out the temp namespace, in case this table + * has dependencies (such as sequences) that the backend's + * performDeletion call might visit in a different order. If we can + * get AccessShareLock on the namespace, that's sufficient to ensure + * we're not running concurrently with RemoveTempRelations. If we + * can't, back off and let RemoveTempRelations do its thing. + */ + if (!ConditionalLockDatabaseObject(NamespaceRelationId, + classForm->relnamespace, 0, + AccessShareLock)) + { + UnlockRelationOid(relid, AccessExclusiveLock); + continue; + } + /* OK, let's delete it */ ereport(LOG, (errmsg("autovacuum: dropping orphan temp table \"%s.%s.%s\"", @@ -2334,7 +2215,7 @@ do_autovacuum(void) /* * To commit the deletion, end current transaction and start a new - * one. Note this also releases the lock we took. + * one. Note this also releases the locks we took. */ CommitTransactionCommand(); StartTransactionCommand(); @@ -2510,7 +2391,7 @@ do_autovacuum(void) /* clean up memory before each iteration */ - MemoryContextResetAndDeleteChildren(PortalContext); + MemoryContextReset(PortalContext); /* * Save the relation name for a possible error message, to avoid a @@ -2565,7 +2446,7 @@ do_autovacuum(void) /* this resets ProcGlobal->statusFlags[i] too */ AbortOutOfAnyTransaction(); FlushErrorState(); - MemoryContextResetAndDeleteChildren(PortalContext); + MemoryContextReset(PortalContext); /* restart our transaction for the following operations */ StartTransactionCommand(); @@ -2655,8 +2536,8 @@ do_autovacuum(void) * * Even if we didn't vacuum anything, it may still be important to do * this, because one indirect effect of vac_update_datfrozenxid() is to - * update ShmemVariableCache->xidVacLimit. That might need to be done - * even if we haven't vacuumed anything, because relations with older + * update TransamVariables->xidVacLimit. That might need to be done even + * if we haven't vacuumed anything, because relations with older * relfrozenxid values or other databases with older datfrozenxid values * might have been dropped, allowing xidVacLimit to advance. * @@ -2707,7 +2588,7 @@ perform_work_item(AutoVacuumWorkItem *workitem) autovac_report_workitem(workitem, cur_nspname, cur_relname); /* clean up memory before each work item */ - MemoryContextResetAndDeleteChildren(PortalContext); + MemoryContextReset(PortalContext); /* * We will abort the current work item if something errors out, and @@ -2759,7 +2640,7 @@ perform_work_item(AutoVacuumWorkItem *workitem) /* this resets ProcGlobal->statusFlags[i] too */ AbortOutOfAnyTransaction(); FlushErrorState(); - MemoryContextResetAndDeleteChildren(PortalContext); + MemoryContextReset(PortalContext); /* restart our transaction for the following operations */ StartTransactionCommand(); @@ -2933,6 +2814,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, tab->at_params.multixact_freeze_table_age = multixact_freeze_table_age; tab->at_params.is_wraparound = wraparound; tab->at_params.log_min_duration = log_min_duration; + tab->at_params.toast_parent = InvalidOid; tab->at_storage_param_vac_cost_limit = avopts ? avopts->vacuum_cost_limit : 0; tab->at_storage_param_vac_cost_delay = avopts ? @@ -3060,6 +2942,7 @@ relation_needs_vacanalyze(Oid relid, int freeze_max_age; int multixact_freeze_max_age; TransactionId xidForceLimit; + TransactionId relfrozenxid; MultiXactId multiForceLimit; Assert(classForm != NULL); @@ -3111,16 +2994,18 @@ relation_needs_vacanalyze(Oid relid, xidForceLimit = recentXid - freeze_max_age; if (xidForceLimit < FirstNormalTransactionId) xidForceLimit -= FirstNormalTransactionId; - force_vacuum = (TransactionIdIsNormal(classForm->relfrozenxid) && - TransactionIdPrecedes(classForm->relfrozenxid, - xidForceLimit)); + relfrozenxid = classForm->relfrozenxid; + force_vacuum = (TransactionIdIsNormal(relfrozenxid) && + TransactionIdPrecedes(relfrozenxid, xidForceLimit)); if (!force_vacuum) { + MultiXactId relminmxid = classForm->relminmxid; + multiForceLimit = recentMulti - multixact_freeze_max_age; if (multiForceLimit < FirstMultiXactId) multiForceLimit -= FirstMultiXactId; - force_vacuum = MultiXactIdIsValid(classForm->relminmxid) && - MultiXactIdPrecedes(classForm->relminmxid, multiForceLimit); + force_vacuum = MultiXactIdIsValid(relminmxid) && + MultiXactIdPrecedes(relminmxid, multiForceLimit); } *wraparound = force_vacuum; @@ -3370,24 +3255,6 @@ autovac_init(void) errhint("Enable the \"track_counts\" option."))); } -/* - * IsAutoVacuum functions - * Return whether this is either a launcher autovacuum process or a worker - * process. - */ -bool -IsAutoVacuumLauncherProcess(void) -{ - return am_autovacuum_launcher; -} - -bool -IsAutoVacuumWorkerProcess(void) -{ - return am_autovacuum_worker; -} - - /* * AutoVacuumShmemSize * Compute space needed for autovacuum-related shared memory @@ -3469,12 +3336,12 @@ check_autovacuum_work_mem(int *newval, void **extra, GucSource source) return true; /* - * We clamp manually-set values to at least 1MB. Since + * We clamp manually-set values to at least 64kB. Since * maintenance_work_mem is always set to at least this value, do the same * here. */ - if (*newval < 1024) - *newval = 1024; + if (*newval < 64) + *newval = 64; return true; } diff --git a/src/backend/postmaster/auxprocess.c b/src/backend/postmaster/auxprocess.c index cae6feb356211..78f4263eeb129 100644 --- a/src/backend/postmaster/auxprocess.c +++ b/src/backend/postmaster/auxprocess.c @@ -3,7 +3,7 @@ * functions related to auxiliary processes. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -15,74 +15,41 @@ #include #include -#include "libpq/pqsignal.h" #include "miscadmin.h" #include "pgstat.h" #include "postmaster/auxprocess.h" #include "postmaster/bgwriter.h" #include "postmaster/startup.h" +#include "postmaster/walsummarizer.h" #include "postmaster/walwriter.h" #include "replication/walreceiver.h" -#include "storage/bufmgr.h" -#include "storage/bufpage.h" #include "storage/condition_variable.h" #include "storage/ipc.h" #include "storage/proc.h" -#include "tcop/tcopprot.h" +#include "storage/procsignal.h" #include "utils/memutils.h" #include "utils/ps_status.h" -#include "utils/rel.h" static void ShutdownAuxiliaryProcess(int code, Datum arg); -/* ---------------- - * global variables - * ---------------- - */ - -AuxProcType MyAuxProcType = NotAnAuxProcess; /* declared in miscadmin.h */ - - /* - * AuxiliaryProcessMain - * - * The main entry point for auxiliary processes, such as the bgwriter, - * walwriter, walreceiver, bootstrapper and the shared memory checker code. + * AuxiliaryProcessMainCommon * - * This code is here just because of historical reasons. + * Common initialization code for auxiliary processes, such as the bgwriter, + * walwriter, walreceiver, and the startup process. */ void -AuxiliaryProcessMain(AuxProcType auxtype) +AuxiliaryProcessMainCommon(void) { Assert(IsUnderPostmaster); - MyAuxProcType = auxtype; - - switch (MyAuxProcType) + /* Release postmaster's working memory context */ + if (PostmasterContext) { - case StartupProcess: - MyBackendType = B_STARTUP; - break; - case ArchiverProcess: - MyBackendType = B_ARCHIVER; - break; - case BgWriterProcess: - MyBackendType = B_BG_WRITER; - break; - case CheckpointerProcess: - MyBackendType = B_CHECKPOINTER; - break; - case WalWriterProcess: - MyBackendType = B_WAL_WRITER; - break; - case WalReceiverProcess: - MyBackendType = B_WAL_RECEIVER; - break; - default: - elog(PANIC, "unrecognized process type: %d", (int) MyAuxProcType); - MyBackendType = B_INVALID; + MemoryContextDelete(PostmasterContext); + PostmasterContext = NULL; } init_ps_display(NULL); @@ -97,26 +64,13 @@ AuxiliaryProcessMain(AuxProcType auxtype) */ /* - * Create a PGPROC so we can use LWLocks. In the EXEC_BACKEND case, this - * was already done by SubPostmasterMain(). + * Create a PGPROC so we can use LWLocks and access shared memory. */ -#ifndef EXEC_BACKEND InitAuxiliaryProcess(); -#endif BaseInit(); - /* - * Assign the ProcSignalSlot for an auxiliary process. Since it doesn't - * have a BackendId, the slot is statically allocated based on the - * auxiliary process type (MyAuxProcType). Backends use slots indexed in - * the range from 1 to MaxBackends (inclusive), so we use MaxBackends + - * AuxProcType + 1 as the index of the slot for an auxiliary process. - * - * This will need rethinking if we ever want more than one of a particular - * auxiliary process type. - */ - ProcSignalInit(MaxBackends + MyAuxProcType + 1); + ProcSignalInit(); /* * Auxiliary processes don't run transactions, but they may need a @@ -134,37 +88,6 @@ AuxiliaryProcessMain(AuxProcType auxtype) before_shmem_exit(ShutdownAuxiliaryProcess, 0); SetProcessingMode(NormalProcessing); - - switch (MyAuxProcType) - { - case StartupProcess: - StartupProcessMain(); - proc_exit(1); - - case ArchiverProcess: - PgArchiverMain(); - proc_exit(1); - - case BgWriterProcess: - BackgroundWriterMain(); - proc_exit(1); - - case CheckpointerProcess: - CheckpointerMain(); - proc_exit(1); - - case WalWriterProcess: - WalWriterMain(); - proc_exit(1); - - case WalReceiverProcess: - WalReceiverMain(); - proc_exit(1); - - default: - elog(PANIC, "unrecognized process type: %d", (int) MyAuxProcType); - proc_exit(1); - } } /* diff --git a/src/backend/postmaster/bgworker.c b/src/backend/postmaster/bgworker.c index 0dd22b23511a1..b37ccb85ad6fc 100644 --- a/src/backend/postmaster/bgworker.c +++ b/src/backend/postmaster/bgworker.c @@ -2,7 +2,7 @@ * bgworker.c * POSTGRES pluggable background workers implementation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/postmaster/bgworker.c @@ -18,21 +18,19 @@ #include "pgstat.h" #include "port/atomics.h" #include "postmaster/bgworker_internals.h" -#include "postmaster/interrupt.h" #include "postmaster/postmaster.h" #include "replication/logicallauncher.h" #include "replication/logicalworker.h" -#include "storage/dsm.h" #include "storage/ipc.h" #include "storage/latch.h" #include "storage/lwlock.h" -#include "storage/pg_shmem.h" #include "storage/pmsignal.h" #include "storage/proc.h" #include "storage/procsignal.h" #include "storage/shmem.h" #include "tcop/tcopprot.h" #include "utils/ascii.h" +#include "utils/memutils.h" #include "utils/ps_status.h" #include "utils/timeout.h" @@ -131,6 +129,9 @@ static const struct }, { "ParallelApplyWorkerMain", ParallelApplyWorkerMain + }, + { + "TablesyncWorkerMain", TablesyncWorkerMain } }; @@ -344,7 +345,9 @@ BackgroundWorkerStateChange(bool allow_new_workers) /* * Copy the registration data into the registered workers list. */ - rw = malloc(sizeof(RegisteredBgWorker)); + rw = MemoryContextAllocExtended(PostmasterContext, + sizeof(RegisteredBgWorker), + MCXT_ALLOC_NO_OOM | MCXT_ALLOC_ZERO); if (rw == NULL) { ereport(LOG, @@ -362,7 +365,7 @@ BackgroundWorkerStateChange(bool allow_new_workers) ascii_safe_strlcpy(rw->rw_worker.bgw_type, slot->worker.bgw_type, BGW_MAXLEN); ascii_safe_strlcpy(rw->rw_worker.bgw_library_name, - slot->worker.bgw_library_name, BGW_MAXLEN); + slot->worker.bgw_library_name, MAXPGPATH); ascii_safe_strlcpy(rw->rw_worker.bgw_function_name, slot->worker.bgw_function_name, BGW_MAXLEN); @@ -452,7 +455,7 @@ ForgetBackgroundWorker(slist_mutable_iter *cur) rw->rw_worker.bgw_name))); slist_delete_current(cur); - free(rw); + pfree(rw); } /* @@ -625,27 +628,6 @@ ResetBackgroundWorkerCrashTimes(void) } } -#ifdef EXEC_BACKEND -/* - * In EXEC_BACKEND mode, workers use this to retrieve their details from - * shared memory. - */ -BackgroundWorker * -BackgroundWorkerEntry(int slotno) -{ - static BackgroundWorker myEntry; - BackgroundWorkerSlot *slot; - - Assert(slotno < BackgroundWorkerData->total_slots); - slot = &BackgroundWorkerData->slot[slotno]; - Assert(slot->in_use); - - /* must copy this in case we don't intend to retain shmem access */ - memcpy(&myEntry, &slot->worker, sizeof myEntry); - return &myEntry; -} -#endif - /* * Complain about the BackgroundWorker definition using error level elevel. * Return true if it looks ok, false if not (unless elevel >= ERROR, in @@ -735,23 +717,32 @@ bgworker_die(SIGNAL_ARGS) } /* - * Start a new background worker - * - * This is the main entry point for background worker, to be called from - * postmaster. + * Main entry point for background worker processes. */ void -StartBackgroundWorker(void) +BackgroundWorkerMain(char *startup_data, size_t startup_data_len) { sigjmp_buf local_sigjmp_buf; - BackgroundWorker *worker = MyBgworkerEntry; + BackgroundWorker *worker; bgworker_main_type entrypt; - if (worker == NULL) + if (startup_data == NULL) elog(FATAL, "unable to find bgworker entry"); + Assert(startup_data_len == sizeof(BackgroundWorker)); + worker = MemoryContextAlloc(TopMemoryContext, sizeof(BackgroundWorker)); + memcpy(worker, startup_data, sizeof(BackgroundWorker)); - IsBackgroundWorker = true; + /* + * Now that we're done reading the startup data, release postmaster's + * working memory context. + */ + if (PostmasterContext) + { + MemoryContextDelete(PostmasterContext); + PostmasterContext = NULL; + } + MyBgworkerEntry = worker; MyBackendType = B_BG_WORKER; init_ps_display(worker->bgw_name); @@ -828,14 +819,10 @@ StartBackgroundWorker(void) PG_exception_stack = &local_sigjmp_buf; /* - * Create a per-backend PGPROC struct in shared memory, except in the - * EXEC_BACKEND case where this was done in SubPostmasterMain. We must do - * this before we can use LWLocks (and in the EXEC_BACKEND case we already - * had to do some stuff with LWLocks). + * Create a per-backend PGPROC struct in shared memory. We must do this + * before we can use LWLocks or access any shared memory. */ -#ifndef EXEC_BACKEND InitProcess(); -#endif /* * Early initialization. @@ -877,21 +864,43 @@ RegisterBackgroundWorker(BackgroundWorker *worker) RegisteredBgWorker *rw; static int numworkers = 0; - if (!IsUnderPostmaster) - ereport(DEBUG1, - (errmsg_internal("registering background worker \"%s\"", worker->bgw_name))); - - if (!process_shared_preload_libraries_in_progress && - strcmp(worker->bgw_library_name, "postgres") != 0) + /* + * Static background workers can only be registered in the postmaster + * process. + */ + if (IsUnderPostmaster || !IsPostmasterEnvironment) { - if (!IsUnderPostmaster) - ereport(LOG, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("background worker \"%s\": must be registered in shared_preload_libraries", - worker->bgw_name))); + /* + * In EXEC_BACKEND or single-user mode, we process + * shared_preload_libraries in backend processes too. We cannot + * register static background workers at that stage, but many + * libraries' _PG_init() functions don't distinguish whether they're + * being loaded in the postmaster or in a backend, they just check + * process_shared_preload_libraries_in_progress. It's a bit sloppy, + * but for historical reasons we tolerate it. In EXEC_BACKEND mode, + * the background workers should already have been registered when the + * library was loaded in postmaster. + */ + if (process_shared_preload_libraries_in_progress) + return; + ereport(LOG, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("background worker \"%s\": must be registered in \"shared_preload_libraries\"", + worker->bgw_name))); return; } + /* + * Cannot register static background workers after calling + * BackgroundWorkerShmemInit(). + */ + if (BackgroundWorkerData != NULL) + elog(ERROR, "cannot register background worker \"%s\" after shmem init", + worker->bgw_name); + + ereport(DEBUG1, + (errmsg_internal("registering background worker \"%s\"", worker->bgw_name))); + if (!SanityCheckBackgroundWorker(worker, LOG)) return; @@ -919,14 +928,16 @@ RegisterBackgroundWorker(BackgroundWorker *worker) "Up to %d background workers can be registered with the current settings.", max_worker_processes, max_worker_processes), - errhint("Consider increasing the configuration parameter \"max_worker_processes\"."))); + errhint("Consider increasing the configuration parameter \"%s\".", "max_worker_processes"))); return; } /* * Copy the registration data into the registered workers list. */ - rw = malloc(sizeof(RegisteredBgWorker)); + rw = MemoryContextAllocExtended(PostmasterContext, + sizeof(RegisteredBgWorker), + MCXT_ALLOC_NO_OOM); if (rw == NULL) { ereport(LOG, diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c index caad642ec93b9..0f75548759a36 100644 --- a/src/backend/postmaster/bgwriter.c +++ b/src/backend/postmaster/bgwriter.c @@ -21,7 +21,7 @@ * should be killed by SIGQUIT and then a recovery cycle started. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -32,25 +32,21 @@ #include "postgres.h" #include "access/xlog.h" -#include "access/xlog_internal.h" #include "libpq/pqsignal.h" #include "miscadmin.h" #include "pgstat.h" +#include "postmaster/auxprocess.h" #include "postmaster/bgwriter.h" #include "postmaster/interrupt.h" #include "storage/buf_internals.h" #include "storage/bufmgr.h" #include "storage/condition_variable.h" #include "storage/fd.h" -#include "storage/ipc.h" #include "storage/lwlock.h" #include "storage/proc.h" #include "storage/procsignal.h" -#include "storage/shmem.h" #include "storage/smgr.h" -#include "storage/spin.h" #include "storage/standby.h" -#include "utils/guc.h" #include "utils/memutils.h" #include "utils/resowner.h" #include "utils/timestamp.h" @@ -88,13 +84,18 @@ static XLogRecPtr last_snapshot_lsn = InvalidXLogRecPtr; * basic execution environment, but not enabled signals yet. */ void -BackgroundWriterMain(void) +BackgroundWriterMain(char *startup_data, size_t startup_data_len) { sigjmp_buf local_sigjmp_buf; MemoryContext bgwriter_context; bool prev_hibernate; WritebackContext wb_context; + Assert(startup_data_len == 0); + + MyBackendType = B_BG_WRITER; + AuxiliaryProcessMainCommon(); + /* * Properly accept or ignore signals that might be sent to us. */ @@ -182,7 +183,7 @@ BackgroundWriterMain(void) FlushErrorState(); /* Flush any leaked data in the top-level context */ - MemoryContextResetAndDeleteChildren(bgwriter_context); + MemoryContextReset(bgwriter_context); /* re-initialize to avoid repeated errors causing problems */ WritebackContextInit(&wb_context, &bgwriter_flush_after); @@ -197,13 +198,6 @@ BackgroundWriterMain(void) */ pg_usleep(1000000L); - /* - * Close all open files after any error. This is helpful on Windows, - * where holding deleted files open causes various strange errors. - * It's not clear we need it elsewhere, but shouldn't hurt. - */ - smgrcloseall(); - /* Report wait end here, when there is no further possibility of wait */ pgstat_report_wait_end(); } @@ -241,14 +235,17 @@ BackgroundWriterMain(void) /* Report pending statistics to the cumulative stats system */ pgstat_report_bgwriter(); + pgstat_report_wal(true); if (FirstCallSinceLastCheckpoint()) { /* - * After any checkpoint, close all smgr files. This is so we - * won't hang onto smgr references to deleted files indefinitely. + * After any checkpoint, free all smgr objects. Otherwise we + * would never do so for dropped relations, as the bgwriter does + * not process shared invalidation messages or call + * AtEOXact_SMgr(). */ - smgrcloseall(); + smgrdestroyall(); } /* @@ -330,7 +327,7 @@ BackgroundWriterMain(void) if (rc == WL_TIMEOUT && can_hibernate && prev_hibernate) { /* Ask for notification at next buffer allocation */ - StrategyNotifyBgWriter(MyProc->pgprocno); + StrategyNotifyBgWriter(MyProcNumber); /* Sleep ... */ (void) WaitLatch(MyLatch, WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c index ace9893d95767..199f008bcda81 100644 --- a/src/backend/postmaster/checkpointer.c +++ b/src/backend/postmaster/checkpointer.c @@ -23,7 +23,7 @@ * restart needs to be forced.) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -42,6 +42,7 @@ #include "libpq/pqsignal.h" #include "miscadmin.h" #include "pgstat.h" +#include "postmaster/auxprocess.h" #include "postmaster/bgwriter.h" #include "postmaster/interrupt.h" #include "replication/syncrep.h" @@ -91,17 +92,11 @@ * requesting backends since the last checkpoint start. The flags are * chosen so that OR'ing is the correct way to combine multiple requests. * - * num_backend_writes is used to count the number of buffer writes performed - * by user backend processes. This counter should be wide enough that it - * can't overflow during a single processing cycle. num_backend_fsync - * counts the subset of those writes that also had to do their own fsync, - * because the checkpointer failed to absorb their request. - * * The requests array holds fsync requests sent by backends and not yet * absorbed by the checkpointer. * - * Unlike the checkpoint fields, num_backend_writes, num_backend_fsync, and - * the requests fields are protected by CheckpointerCommLock. + * Unlike the checkpoint fields, requests related fields are protected by + * CheckpointerCommLock. *---------- */ typedef struct @@ -125,9 +120,6 @@ typedef struct ConditionVariable start_cv; /* signaled when ckpt_started advances */ ConditionVariable done_cv; /* signaled when ckpt_done advances */ - uint32 num_backend_writes; /* counts user backend buffer writes */ - uint32 num_backend_fsync; /* counts user backend fsync calls */ - int num_requests; /* current # of requests */ int max_requests; /* allocated array size */ CheckpointerRequest requests[FLEXIBLE_ARRAY_MEMBER]; @@ -178,11 +170,16 @@ static void ReqCheckpointHandler(SIGNAL_ARGS); * basic execution environment, but not enabled signals yet. */ void -CheckpointerMain(void) +CheckpointerMain(char *startup_data, size_t startup_data_len) { sigjmp_buf local_sigjmp_buf; MemoryContext checkpointer_context; + Assert(startup_data_len == 0); + + MyBackendType = B_CHECKPOINTER; + AuxiliaryProcessMainCommon(); + CheckpointerShmem->checkpointer_pid = MyProcPid; /* @@ -299,7 +296,7 @@ CheckpointerMain(void) FlushErrorState(); /* Flush any leaked data in the top-level context */ - MemoryContextResetAndDeleteChildren(checkpointer_context); + MemoryContextReset(checkpointer_context); /* Now we can allow interrupts again */ RESUME_INTERRUPTS(); @@ -310,13 +307,6 @@ CheckpointerMain(void) * fast as we can. */ pg_usleep(1000000L); - - /* - * Close all open files after any error. This is helpful on Windows, - * where holding deleted files open causes various strange errors. - * It's not clear we need it elsewhere, but shouldn't hurt. - */ - smgrcloseall(); } /* We can now handle ereport(ERROR) */ @@ -349,6 +339,8 @@ CheckpointerMain(void) pg_time_t now; int elapsed_secs; int cur_timeout; + bool chkpt_or_rstpt_requested = false; + bool chkpt_or_rstpt_timed = false; /* Clear any already-pending wakeups */ ResetLatch(MyLatch); @@ -367,7 +359,7 @@ CheckpointerMain(void) if (((volatile CheckpointerShmemStruct *) CheckpointerShmem)->ckpt_flags) { do_checkpoint = true; - PendingCheckpointerStats.requested_checkpoints++; + chkpt_or_rstpt_requested = true; } /* @@ -381,7 +373,7 @@ CheckpointerMain(void) if (elapsed_secs >= CheckPointTimeout) { if (!do_checkpoint) - PendingCheckpointerStats.timed_checkpoints++; + chkpt_or_rstpt_timed = true; do_checkpoint = true; flags |= CHECKPOINT_CAUSE_TIME; } @@ -417,6 +409,24 @@ CheckpointerMain(void) if (flags & CHECKPOINT_END_OF_RECOVERY) do_restartpoint = false; + if (chkpt_or_rstpt_timed) + { + chkpt_or_rstpt_timed = false; + if (do_restartpoint) + PendingCheckpointerStats.restartpoints_timed++; + else + PendingCheckpointerStats.num_timed++; + } + + if (chkpt_or_rstpt_requested) + { + chkpt_or_rstpt_requested = false; + if (do_restartpoint) + PendingCheckpointerStats.restartpoints_requested++; + else + PendingCheckpointerStats.num_requested++; + } + /* * We will warn if (a) too soon since last checkpoint (whatever * caused it) and (b) somebody set the CHECKPOINT_CAUSE_XLOG flag @@ -432,7 +442,7 @@ CheckpointerMain(void) "checkpoints are occurring too frequently (%d seconds apart)", elapsed_secs, elapsed_secs), - errhint("Consider increasing the configuration parameter \"max_wal_size\"."))); + errhint("Consider increasing the configuration parameter \"%s\".", "max_wal_size"))); /* * Initialize checkpointer-private variables used during @@ -458,10 +468,12 @@ CheckpointerMain(void) ckpt_performed = CreateRestartPoint(flags); /* - * After any checkpoint, close all smgr files. This is so we - * won't hang onto smgr references to deleted files indefinitely. + * After any checkpoint, free all smgr objects. Otherwise we + * would never do so for dropped relations, as the checkpointer + * does not process shared invalidation messages or call + * AtEOXact_SMgr(). */ - smgrcloseall(); + smgrdestroyall(); /* * Indicate checkpoint completion to any waiting backends. @@ -480,6 +492,9 @@ CheckpointerMain(void) * checkpoints happen at a predictable spacing. */ last_checkpoint_time = now; + + if (do_restartpoint) + PendingCheckpointerStats.restartpoints_performed++; } else { @@ -578,7 +593,7 @@ HandleCheckpointerInterrupts(void) * updates the statistics, increment the checkpoint request and flush * out pending statistic. */ - PendingCheckpointerStats.requested_checkpoints++; + PendingCheckpointerStats.num_requested++; ShutdownXLOG(0, 0); pgstat_report_checkpointer(); pgstat_report_wal(true); @@ -843,15 +858,11 @@ IsCheckpointOnSchedule(double progress) static void ReqCheckpointHandler(SIGNAL_ARGS) { - int save_errno = errno; - /* * The signaling process should have set ckpt_flags nonzero, so all we * need do is ensure that our main loop gets kicked out of any wait. */ SetLatch(MyLatch); - - errno = save_errno; } @@ -944,11 +955,8 @@ RequestCheckpoint(int flags) */ CreateCheckPoint(flags | CHECKPOINT_IMMEDIATE); - /* - * After any checkpoint, close all smgr files. This is so we won't - * hang onto smgr references to deleted files indefinitely. - */ - smgrcloseall(); + /* Free all smgr objects, as CheckpointerMain() normally would. */ + smgrdestroyall(); return; } @@ -1095,10 +1103,6 @@ ForwardSyncRequest(const FileTag *ftag, SyncRequestType type) LWLockAcquire(CheckpointerCommLock, LW_EXCLUSIVE); - /* Count all backend writes regardless of if they fit in the queue */ - if (!AmBackgroundWriterProcess()) - CheckpointerShmem->num_backend_writes++; - /* * If the checkpointer isn't running or the request queue is full, the * backend will have to perform its own fsync request. But before forcing @@ -1108,12 +1112,6 @@ ForwardSyncRequest(const FileTag *ftag, SyncRequestType type) (CheckpointerShmem->num_requests >= CheckpointerShmem->max_requests && !CompactCheckpointerRequestQueue())) { - /* - * Count the subset of writes where backends have to do their own - * fsync - */ - if (!AmBackgroundWriterProcess()) - CheckpointerShmem->num_backend_fsync++; LWLockRelease(CheckpointerCommLock); return false; } @@ -1171,6 +1169,10 @@ CompactCheckpointerRequestQueue(void) /* must hold CheckpointerCommLock in exclusive mode */ Assert(LWLockHeldByMe(CheckpointerCommLock)); + /* Avoid memory allocations in a critical section. */ + if (CritSectionCount > 0) + return false; + /* Initialize skip_slot array */ skip_slot = palloc0(sizeof(bool) * CheckpointerShmem->num_requests); @@ -1270,15 +1272,6 @@ AbsorbSyncRequests(void) LWLockAcquire(CheckpointerCommLock, LW_EXCLUSIVE); - /* Transfer stats counts into pending pgstats message */ - PendingCheckpointerStats.buf_written_backend - += CheckpointerShmem->num_backend_writes; - PendingCheckpointerStats.buf_fsync_backend - += CheckpointerShmem->num_backend_fsync; - - CheckpointerShmem->num_backend_writes = 0; - CheckpointerShmem->num_backend_fsync = 0; - /* * We try to avoid holding the lock for a long time by copying the request * array, and processing the requests after releasing the lock. diff --git a/src/backend/postmaster/fork_process.c b/src/backend/postmaster/fork_process.c index 6f9c2765d6894..b3010e3e36abf 100644 --- a/src/backend/postmaster/fork_process.c +++ b/src/backend/postmaster/fork_process.c @@ -4,7 +4,7 @@ * EXEC_BACKEND case; it might be extended to do so, but it would be * considerably more complex. * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/postmaster/fork_process.c @@ -19,6 +19,7 @@ #include #include "libpq/pqsignal.h" +#include "miscadmin.h" #include "postmaster/fork_process.h" #ifndef WIN32 @@ -66,6 +67,7 @@ fork_process(void) if (result == 0) { /* fork succeeded, in child */ + MyProcPid = getpid(); #ifdef LINUX_PROFILE setitimer(ITIMER_PROF, &prof_itimer, NULL); #endif diff --git a/src/backend/postmaster/interrupt.c b/src/backend/postmaster/interrupt.c index 6d4bd76bf8194..eedc0980cf113 100644 --- a/src/backend/postmaster/interrupt.c +++ b/src/backend/postmaster/interrupt.c @@ -3,7 +3,7 @@ * interrupt.c * Interrupt handling routines. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -60,12 +60,8 @@ HandleMainLoopInterrupts(void) void SignalHandlerForConfigReload(SIGNAL_ARGS) { - int save_errno = errno; - ConfigReloadPending = true; SetLatch(MyLatch); - - errno = save_errno; } /* @@ -108,10 +104,6 @@ SignalHandlerForCrashExit(SIGNAL_ARGS) void SignalHandlerForShutdownRequest(SIGNAL_ARGS) { - int save_errno = errno; - ShutdownRequestPending = true; SetLatch(MyLatch); - - errno = save_errno; } diff --git a/src/backend/postmaster/launch_backend.c b/src/backend/postmaster/launch_backend.c new file mode 100644 index 0000000000000..d23aed237d2cf --- /dev/null +++ b/src/backend/postmaster/launch_backend.c @@ -0,0 +1,1055 @@ +/*------------------------------------------------------------------------- + * + * launch_backend.c + * Functions for launching backends and other postmaster child + * processes. + * + * On Unix systems, a new child process is launched with fork(). It inherits + * all the global variables and data structures that had been initialized in + * the postmaster. After forking, the child process closes the file + * descriptors that are not needed in the child process, and sets up the + * mechanism to detect death of the parent postmaster process, etc. After + * that, it calls the right Main function depending on the kind of child + * process. + * + * In EXEC_BACKEND mode, which is used on Windows but can be enabled on other + * platforms for testing, the child process is launched by fork() + exec() (or + * CreateProcess() on Windows). It does not inherit the state from the + * postmaster, so it needs to re-attach to the shared memory, re-initialize + * global variables, reload the config file etc. to get the process to the + * same state as after fork() on a Unix system. + * + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/backend/postmaster/launch_backend.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include + +#include "access/xlog.h" +#include "common/file_utils.h" +#include "libpq/libpq-be.h" +#include "libpq/pqsignal.h" +#include "miscadmin.h" +#include "nodes/queryjumble.h" +#include "port.h" +#include "postmaster/autovacuum.h" +#include "postmaster/auxprocess.h" +#include "postmaster/bgworker_internals.h" +#include "postmaster/bgwriter.h" +#include "postmaster/fork_process.h" +#include "postmaster/pgarch.h" +#include "postmaster/postmaster.h" +#include "postmaster/startup.h" +#include "postmaster/syslogger.h" +#include "postmaster/walsummarizer.h" +#include "postmaster/walwriter.h" +#include "replication/slotsync.h" +#include "replication/walreceiver.h" +#include "storage/dsm.h" +#include "storage/fd.h" +#include "storage/ipc.h" +#include "storage/pg_shmem.h" +#include "storage/pmsignal.h" +#include "storage/proc.h" +#include "tcop/backend_startup.h" +#include "tcop/tcopprot.h" +#include "utils/builtins.h" +#include "utils/datetime.h" +#include "utils/guc.h" +#include "utils/injection_point.h" +#include "utils/memutils.h" +#include "utils/timestamp.h" + +#ifdef EXEC_BACKEND +#include "nodes/queryjumble.h" +#include "storage/pg_shmem.h" +#include "storage/spin.h" +#endif + + +#ifdef EXEC_BACKEND + +/* Type for a socket that can be inherited to a client process */ +#ifdef WIN32 +typedef struct +{ + SOCKET origsocket; /* Original socket value, or PGINVALID_SOCKET + * if not a socket */ + WSAPROTOCOL_INFO wsainfo; +} InheritableSocket; +#else +typedef int InheritableSocket; +#endif + +/* + * Structure contains all variables passed to exec:ed backends + */ +typedef struct +{ + char DataDir[MAXPGPATH]; + int32 MyCancelKey; + int MyPMChildSlot; +#ifndef WIN32 + unsigned long UsedShmemSegID; +#else + void *ShmemProtectiveRegion; + HANDLE UsedShmemSegID; +#endif + void *UsedShmemSegAddr; + slock_t *ShmemLock; + struct bkend *ShmemBackendArray; +#ifdef USE_INJECTION_POINTS + struct InjectionPointsCtl *ActiveInjectionPoints; +#endif +#ifndef HAVE_SPINLOCKS + PGSemaphore *SpinlockSemaArray; +#endif + int NamedLWLockTrancheRequests; + NamedLWLockTranche *NamedLWLockTrancheArray; + LWLockPadded *MainLWLockArray; + slock_t *ProcStructLock; + PROC_HDR *ProcGlobal; + PGPROC *AuxiliaryProcs; + PGPROC *PreparedXactProcs; + PMSignalData *PMSignalState; + pid_t PostmasterPid; + TimestampTz PgStartTime; + TimestampTz PgReloadTime; + pg_time_t first_syslogger_file_time; + bool redirection_done; + bool IsBinaryUpgrade; + bool query_id_enabled; + int max_safe_fds; + int MaxBackends; +#ifdef WIN32 + HANDLE PostmasterHandle; + HANDLE initial_signal_pipe; + HANDLE syslogPipe[2]; +#else + int postmaster_alive_fds[2]; + int syslogPipe[2]; +#endif + char my_exec_path[MAXPGPATH]; + char pkglib_path[MAXPGPATH]; + + /* + * These are only used by backend processes, but are here because passing + * a socket needs some special handling on Windows. 'client_sock' is an + * explicit argument to postmaster_child_launch, but is stored in + * MyClientSocket in the child process. + */ + ClientSocket client_sock; + InheritableSocket inh_sock; + + /* + * Extra startup data, content depends on the child process. + */ + size_t startup_data_len; + char startup_data[FLEXIBLE_ARRAY_MEMBER]; +} BackendParameters; + +#define SizeOfBackendParameters(startup_data_len) (offsetof(BackendParameters, startup_data) + startup_data_len) + +static void read_backend_variables(char *id, char **startup_data, size_t *startup_data_len); +static void restore_backend_variables(BackendParameters *param); + +static bool save_backend_variables(BackendParameters *param, ClientSocket *client_sock, +#ifdef WIN32 + HANDLE childProcess, pid_t childPid, +#endif + char *startup_data, size_t startup_data_len); + +static pid_t internal_forkexec(const char *child_kind, char *startup_data, size_t startup_data_len, ClientSocket *client_sock); + +#endif /* EXEC_BACKEND */ + +/* + * Information needed to launch different kinds of child processes. + */ +typedef struct +{ + const char *name; + void (*main_fn) (char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); + bool shmem_attach; +} child_process_kind; + +child_process_kind child_process_kinds[] = { + [B_INVALID] = {"invalid", NULL, false}, + + [B_BACKEND] = {"backend", BackendMain, true}, + [B_AUTOVAC_LAUNCHER] = {"autovacuum launcher", AutoVacLauncherMain, true}, + [B_AUTOVAC_WORKER] = {"autovacuum worker", AutoVacWorkerMain, true}, + [B_BG_WORKER] = {"bgworker", BackgroundWorkerMain, true}, + + /* + * WAL senders start their life as regular backend processes, and change + * their type after authenticating the client for replication. We list it + * here for PostmasterChildName() but cannot launch them directly. + */ + [B_WAL_SENDER] = {"wal sender", NULL, true}, + [B_SLOTSYNC_WORKER] = {"slot sync worker", ReplSlotSyncWorkerMain, true}, + + [B_STANDALONE_BACKEND] = {"standalone backend", NULL, false}, + + [B_ARCHIVER] = {"archiver", PgArchiverMain, true}, + [B_BG_WRITER] = {"bgwriter", BackgroundWriterMain, true}, + [B_CHECKPOINTER] = {"checkpointer", CheckpointerMain, true}, + [B_STARTUP] = {"startup", StartupProcessMain, true}, + [B_WAL_RECEIVER] = {"wal_receiver", WalReceiverMain, true}, + [B_WAL_SUMMARIZER] = {"wal_summarizer", WalSummarizerMain, true}, + [B_WAL_WRITER] = {"wal_writer", WalWriterMain, true}, + + [B_LOGGER] = {"syslogger", SysLoggerMain, false}, +}; + +const char * +PostmasterChildName(BackendType child_type) +{ + return child_process_kinds[child_type].name; +} + +/* + * Start a new postmaster child process. + * + * The child process will be restored to roughly the same state whether + * EXEC_BACKEND is used or not: it will be attached to shared memory if + * appropriate, and fds and other resources that we've inherited from + * postmaster that are not needed in a child process have been closed. + * + * 'startup_data' is an optional contiguous chunk of data that is passed to + * the child process. + */ +pid_t +postmaster_child_launch(BackendType child_type, + char *startup_data, size_t startup_data_len, + ClientSocket *client_sock) +{ + pid_t pid; + + Assert(IsPostmasterEnvironment && !IsUnderPostmaster); + +#ifdef EXEC_BACKEND + pid = internal_forkexec(child_process_kinds[child_type].name, + startup_data, startup_data_len, client_sock); + /* the child process will arrive in SubPostmasterMain */ +#else /* !EXEC_BACKEND */ + pid = fork_process(); + if (pid == 0) /* child */ + { + /* Close the postmaster's sockets */ + ClosePostmasterPorts(child_type == B_LOGGER); + + /* Detangle from postmaster */ + InitPostmasterChild(); + + /* Detach shared memory if not needed. */ + if (!child_process_kinds[child_type].shmem_attach) + { + dsm_detach_all(); + PGSharedMemoryDetach(); + } + + /* + * Enter the Main function with TopMemoryContext. The startup data is + * allocated in PostmasterContext, so we cannot release it here yet. + * The Main function will do it after it's done handling the startup + * data. + */ + MemoryContextSwitchTo(TopMemoryContext); + + if (client_sock) + { + MyClientSocket = palloc(sizeof(ClientSocket)); + memcpy(MyClientSocket, client_sock, sizeof(ClientSocket)); + } + + /* + * Run the appropriate Main function + */ + child_process_kinds[child_type].main_fn(startup_data, startup_data_len); + pg_unreachable(); /* main_fn never returns */ + } +#endif /* EXEC_BACKEND */ + return pid; +} + +#ifdef EXEC_BACKEND +#ifndef WIN32 + +/* + * internal_forkexec non-win32 implementation + * + * - writes out backend variables to the parameter file + * - fork():s, and then exec():s the child process + */ +static pid_t +internal_forkexec(const char *child_kind, char *startup_data, size_t startup_data_len, ClientSocket *client_sock) +{ + static unsigned long tmpBackendFileNum = 0; + pid_t pid; + char tmpfilename[MAXPGPATH]; + size_t paramsz; + BackendParameters *param; + FILE *fp; + char *argv[4]; + char forkav[MAXPGPATH]; + + /* + * Use palloc0 to make sure padding bytes are initialized, to prevent + * Valgrind from complaining about writing uninitialized bytes to the + * file. This isn't performance critical, and the win32 implementation + * initializes the padding bytes to zeros, so do it even when not using + * Valgrind. + */ + paramsz = SizeOfBackendParameters(startup_data_len); + param = palloc0(paramsz); + if (!save_backend_variables(param, client_sock, startup_data, startup_data_len)) + { + pfree(param); + return -1; /* log made by save_backend_variables */ + } + + /* Calculate name for temp file */ + snprintf(tmpfilename, MAXPGPATH, "%s/%s.backend_var.%d.%lu", + PG_TEMP_FILES_DIR, PG_TEMP_FILE_PREFIX, + MyProcPid, ++tmpBackendFileNum); + + /* Open file */ + fp = AllocateFile(tmpfilename, PG_BINARY_W); + if (!fp) + { + /* + * As in OpenTemporaryFileInTablespace, try to make the temp-file + * directory, ignoring errors. + */ + (void) MakePGDirectory(PG_TEMP_FILES_DIR); + + fp = AllocateFile(tmpfilename, PG_BINARY_W); + if (!fp) + { + ereport(LOG, + (errcode_for_file_access(), + errmsg("could not create file \"%s\": %m", + tmpfilename))); + pfree(param); + return -1; + } + } + + if (fwrite(param, paramsz, 1, fp) != 1) + { + ereport(LOG, + (errcode_for_file_access(), + errmsg("could not write to file \"%s\": %m", tmpfilename))); + FreeFile(fp); + pfree(param); + return -1; + } + pfree(param); + + /* Release file */ + if (FreeFile(fp)) + { + ereport(LOG, + (errcode_for_file_access(), + errmsg("could not write to file \"%s\": %m", tmpfilename))); + return -1; + } + + /* set up argv properly */ + argv[0] = "postgres"; + snprintf(forkav, MAXPGPATH, "--forkchild=%s", child_kind); + argv[1] = forkav; + /* Insert temp file name after --forkchild argument */ + argv[2] = tmpfilename; + argv[3] = NULL; + + /* Fire off execv in child */ + if ((pid = fork_process()) == 0) + { + if (execv(postgres_exec_path, argv) < 0) + { + ereport(LOG, + (errmsg("could not execute server process \"%s\": %m", + postgres_exec_path))); + /* We're already in the child process here, can't return */ + exit(1); + } + } + + return pid; /* Parent returns pid, or -1 on fork failure */ +} +#else /* WIN32 */ + +/* + * internal_forkexec win32 implementation + * + * - starts backend using CreateProcess(), in suspended state + * - writes out backend variables to the parameter file + * - during this, duplicates handles and sockets required for + * inheritance into the new process + * - resumes execution of the new process once the backend parameter + * file is complete. + */ +static pid_t +internal_forkexec(const char *child_kind, char *startup_data, size_t startup_data_len, ClientSocket *client_sock) +{ + int retry_count = 0; + STARTUPINFO si; + PROCESS_INFORMATION pi; + char cmdLine[MAXPGPATH * 2]; + HANDLE paramHandle; + BackendParameters *param; + SECURITY_ATTRIBUTES sa; + size_t paramsz; + char paramHandleStr[32]; + int l; + + paramsz = SizeOfBackendParameters(startup_data_len); + + /* Resume here if we need to retry */ +retry: + + /* Set up shared memory for parameter passing */ + ZeroMemory(&sa, sizeof(sa)); + sa.nLength = sizeof(sa); + sa.bInheritHandle = TRUE; + paramHandle = CreateFileMapping(INVALID_HANDLE_VALUE, + &sa, + PAGE_READWRITE, + 0, + paramsz, + NULL); + if (paramHandle == INVALID_HANDLE_VALUE) + { + ereport(LOG, + (errmsg("could not create backend parameter file mapping: error code %lu", + GetLastError()))); + return -1; + } + param = MapViewOfFile(paramHandle, FILE_MAP_WRITE, 0, 0, paramsz); + if (!param) + { + ereport(LOG, + (errmsg("could not map backend parameter memory: error code %lu", + GetLastError()))); + CloseHandle(paramHandle); + return -1; + } + + /* Format the cmd line */ +#ifdef _WIN64 + sprintf(paramHandleStr, "%llu", (LONG_PTR) paramHandle); +#else + sprintf(paramHandleStr, "%lu", (DWORD) paramHandle); +#endif + l = snprintf(cmdLine, sizeof(cmdLine) - 1, "\"%s\" --forkchild=\"%s\" %s", + postgres_exec_path, child_kind, paramHandleStr); + if (l >= sizeof(cmdLine)) + { + ereport(LOG, + (errmsg("subprocess command line too long"))); + UnmapViewOfFile(param); + CloseHandle(paramHandle); + return -1; + } + + memset(&pi, 0, sizeof(pi)); + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + + /* + * Create the subprocess in a suspended state. This will be resumed later, + * once we have written out the parameter file. + */ + if (!CreateProcess(NULL, cmdLine, NULL, NULL, TRUE, CREATE_SUSPENDED, + NULL, NULL, &si, &pi)) + { + ereport(LOG, + (errmsg("CreateProcess() call failed: %m (error code %lu)", + GetLastError()))); + UnmapViewOfFile(param); + CloseHandle(paramHandle); + return -1; + } + + if (!save_backend_variables(param, client_sock, pi.hProcess, pi.dwProcessId, startup_data, startup_data_len)) + { + /* + * log made by save_backend_variables, but we have to clean up the + * mess with the half-started process + */ + if (!TerminateProcess(pi.hProcess, 255)) + ereport(LOG, + (errmsg_internal("could not terminate unstarted process: error code %lu", + GetLastError()))); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + UnmapViewOfFile(param); + CloseHandle(paramHandle); + return -1; /* log made by save_backend_variables */ + } + + /* Drop the parameter shared memory that is now inherited to the backend */ + if (!UnmapViewOfFile(param)) + ereport(LOG, + (errmsg("could not unmap view of backend parameter file: error code %lu", + GetLastError()))); + if (!CloseHandle(paramHandle)) + ereport(LOG, + (errmsg("could not close handle to backend parameter file: error code %lu", + GetLastError()))); + + /* + * Reserve the memory region used by our main shared memory segment before + * we resume the child process. Normally this should succeed, but if ASLR + * is active then it might sometimes fail due to the stack or heap having + * gotten mapped into that range. In that case, just terminate the + * process and retry. + */ + if (!pgwin32_ReserveSharedMemoryRegion(pi.hProcess)) + { + /* pgwin32_ReserveSharedMemoryRegion already made a log entry */ + if (!TerminateProcess(pi.hProcess, 255)) + ereport(LOG, + (errmsg_internal("could not terminate process that failed to reserve memory: error code %lu", + GetLastError()))); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + if (++retry_count < 100) + goto retry; + ereport(LOG, + (errmsg("giving up after too many tries to reserve shared memory"), + errhint("This might be caused by ASLR or antivirus software."))); + return -1; + } + + /* + * Now that the backend variables are written out, we start the child + * thread so it can start initializing while we set up the rest of the + * parent state. + */ + if (ResumeThread(pi.hThread) == -1) + { + if (!TerminateProcess(pi.hProcess, 255)) + { + ereport(LOG, + (errmsg_internal("could not terminate unstartable process: error code %lu", + GetLastError()))); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + return -1; + } + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + ereport(LOG, + (errmsg_internal("could not resume thread of unstarted process: error code %lu", + GetLastError()))); + return -1; + } + + /* Set up notification when the child process dies */ + pgwin32_register_deadchild_callback(pi.hProcess, pi.dwProcessId); + + /* Don't close pi.hProcess, it's owned by the deadchild callback now */ + + CloseHandle(pi.hThread); + + return pi.dwProcessId; +} +#endif /* WIN32 */ + +/* + * SubPostmasterMain -- Get the fork/exec'd process into a state equivalent + * to what it would be if we'd simply forked on Unix, and then + * dispatch to the appropriate place. + * + * The first two command line arguments are expected to be "--forkchild=", + * where indicates which postmaster child we are to become, and + * the name of a variables file that we can read to load data that would + * have been inherited by fork() on Unix. + */ +void +SubPostmasterMain(int argc, char *argv[]) +{ + char *startup_data; + size_t startup_data_len; + char *child_kind; + BackendType child_type; + bool found = false; + + /* In EXEC_BACKEND case we will not have inherited these settings */ + IsPostmasterEnvironment = true; + whereToSendOutput = DestNone; + + /* Setup essential subsystems (to ensure elog() behaves sanely) */ + InitializeGUCOptions(); + + /* Check we got appropriate args */ + if (argc != 3) + elog(FATAL, "invalid subpostmaster invocation"); + + /* Find the entry in child_process_kinds */ + if (strncmp(argv[1], "--forkchild=", 12) != 0) + elog(FATAL, "invalid subpostmaster invocation (--forkchild argument missing)"); + child_kind = argv[1] + 12; + found = false; + for (int idx = 0; idx < lengthof(child_process_kinds); idx++) + { + if (strcmp(child_process_kinds[idx].name, child_kind) == 0) + { + child_type = (BackendType) idx; + found = true; + break; + } + } + if (!found) + elog(ERROR, "unknown child kind %s", child_kind); + + /* Read in the variables file */ + read_backend_variables(argv[2], &startup_data, &startup_data_len); + + /* Close the postmaster's sockets (as soon as we know them) */ + ClosePostmasterPorts(child_type == B_LOGGER); + + /* Setup as postmaster child */ + InitPostmasterChild(); + + /* + * If appropriate, physically re-attach to shared memory segment. We want + * to do this before going any further to ensure that we can attach at the + * same address the postmaster used. On the other hand, if we choose not + * to re-attach, we may have other cleanup to do. + * + * If testing EXEC_BACKEND on Linux, you should run this as root before + * starting the postmaster: + * + * sysctl -w kernel.randomize_va_space=0 + * + * This prevents using randomized stack and code addresses that cause the + * child process's memory map to be different from the parent's, making it + * sometimes impossible to attach to shared memory at the desired address. + * Return the setting to its old value (usually '1' or '2') when finished. + */ + if (child_process_kinds[child_type].shmem_attach) + PGSharedMemoryReAttach(); + else + PGSharedMemoryNoReAttach(); + + /* Read in remaining GUC variables */ + read_nondefault_variables(); + + /* + * Check that the data directory looks valid, which will also check the + * privileges on the data directory and update our umask and file/group + * variables for creating files later. Note: this should really be done + * before we create any files or directories. + */ + checkDataDir(); + + /* + * (re-)read control file, as it contains config. The postmaster will + * already have read this, but this process doesn't know about that. + */ + LocalProcessControlFile(false); + + /* + * Reload any libraries that were preloaded by the postmaster. Since we + * exec'd this process, those libraries didn't come along with us; but we + * should load them into all child processes to be consistent with the + * non-EXEC_BACKEND behavior. + */ + process_shared_preload_libraries(); + + /* Restore basic shared memory pointers */ + if (UsedShmemSegAddr != NULL) + InitShmemAccess(UsedShmemSegAddr); + + /* + * Run the appropriate Main function + */ + child_process_kinds[child_type].main_fn(startup_data, startup_data_len); + pg_unreachable(); /* main_fn never returns */ +} + +/* + * The following need to be available to the save/restore_backend_variables + * functions. They are marked NON_EXEC_STATIC in their home modules. + */ +extern slock_t *ShmemLock; +extern slock_t *ProcStructLock; +extern PGPROC *AuxiliaryProcs; +extern PMSignalData *PMSignalState; +extern pg_time_t first_syslogger_file_time; +extern struct bkend *ShmemBackendArray; +extern bool redirection_done; + +#ifndef WIN32 +#define write_inheritable_socket(dest, src, childpid) ((*(dest) = (src)), true) +#define read_inheritable_socket(dest, src) (*(dest) = *(src)) +#else +static bool write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE child); +static bool write_inheritable_socket(InheritableSocket *dest, SOCKET src, + pid_t childPid); +static void read_inheritable_socket(SOCKET *dest, InheritableSocket *src); +#endif + + +/* Save critical backend variables into the BackendParameters struct */ +static bool +save_backend_variables(BackendParameters *param, ClientSocket *client_sock, +#ifdef WIN32 + HANDLE childProcess, pid_t childPid, +#endif + char *startup_data, size_t startup_data_len) +{ + if (client_sock) + memcpy(¶m->client_sock, client_sock, sizeof(ClientSocket)); + else + memset(¶m->client_sock, 0, sizeof(ClientSocket)); + if (!write_inheritable_socket(¶m->inh_sock, + client_sock ? client_sock->sock : PGINVALID_SOCKET, + childPid)) + return false; + + strlcpy(param->DataDir, DataDir, MAXPGPATH); + + param->MyCancelKey = MyCancelKey; + param->MyPMChildSlot = MyPMChildSlot; + +#ifdef WIN32 + param->ShmemProtectiveRegion = ShmemProtectiveRegion; +#endif + param->UsedShmemSegID = UsedShmemSegID; + param->UsedShmemSegAddr = UsedShmemSegAddr; + + param->ShmemLock = ShmemLock; + param->ShmemBackendArray = ShmemBackendArray; + +#ifdef USE_INJECTION_POINTS + param->ActiveInjectionPoints = ActiveInjectionPoints; +#endif + +#ifndef HAVE_SPINLOCKS + param->SpinlockSemaArray = SpinlockSemaArray; +#endif + param->NamedLWLockTrancheRequests = NamedLWLockTrancheRequests; + param->NamedLWLockTrancheArray = NamedLWLockTrancheArray; + param->MainLWLockArray = MainLWLockArray; + param->ProcStructLock = ProcStructLock; + param->ProcGlobal = ProcGlobal; + param->AuxiliaryProcs = AuxiliaryProcs; + param->PreparedXactProcs = PreparedXactProcs; + param->PMSignalState = PMSignalState; + + param->PostmasterPid = PostmasterPid; + param->PgStartTime = PgStartTime; + param->PgReloadTime = PgReloadTime; + param->first_syslogger_file_time = first_syslogger_file_time; + + param->redirection_done = redirection_done; + param->IsBinaryUpgrade = IsBinaryUpgrade; + param->query_id_enabled = query_id_enabled; + param->max_safe_fds = max_safe_fds; + + param->MaxBackends = MaxBackends; + +#ifdef WIN32 + param->PostmasterHandle = PostmasterHandle; + if (!write_duplicated_handle(¶m->initial_signal_pipe, + pgwin32_create_signal_listener(childPid), + childProcess)) + return false; +#else + memcpy(¶m->postmaster_alive_fds, &postmaster_alive_fds, + sizeof(postmaster_alive_fds)); +#endif + + memcpy(¶m->syslogPipe, &syslogPipe, sizeof(syslogPipe)); + + strlcpy(param->my_exec_path, my_exec_path, MAXPGPATH); + + strlcpy(param->pkglib_path, pkglib_path, MAXPGPATH); + + param->startup_data_len = startup_data_len; + if (startup_data_len > 0) + memcpy(param->startup_data, startup_data, startup_data_len); + + return true; +} + +#ifdef WIN32 +/* + * Duplicate a handle for usage in a child process, and write the child + * process instance of the handle to the parameter file. + */ +static bool +write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE childProcess) +{ + HANDLE hChild = INVALID_HANDLE_VALUE; + + if (!DuplicateHandle(GetCurrentProcess(), + src, + childProcess, + &hChild, + 0, + TRUE, + DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) + { + ereport(LOG, + (errmsg_internal("could not duplicate handle to be written to backend parameter file: error code %lu", + GetLastError()))); + return false; + } + + *dest = hChild; + return true; +} + +/* + * Duplicate a socket for usage in a child process, and write the resulting + * structure to the parameter file. + * This is required because a number of LSPs (Layered Service Providers) very + * common on Windows (antivirus, firewalls, download managers etc) break + * straight socket inheritance. + */ +static bool +write_inheritable_socket(InheritableSocket *dest, SOCKET src, pid_t childpid) +{ + dest->origsocket = src; + if (src != 0 && src != PGINVALID_SOCKET) + { + /* Actual socket */ + if (WSADuplicateSocket(src, childpid, &dest->wsainfo) != 0) + { + ereport(LOG, + (errmsg("could not duplicate socket %d for use in backend: error code %d", + (int) src, WSAGetLastError()))); + return false; + } + } + return true; +} + +/* + * Read a duplicate socket structure back, and get the socket descriptor. + */ +static void +read_inheritable_socket(SOCKET *dest, InheritableSocket *src) +{ + SOCKET s; + + if (src->origsocket == PGINVALID_SOCKET || src->origsocket == 0) + { + /* Not a real socket! */ + *dest = src->origsocket; + } + else + { + /* Actual socket, so create from structure */ + s = WSASocket(FROM_PROTOCOL_INFO, + FROM_PROTOCOL_INFO, + FROM_PROTOCOL_INFO, + &src->wsainfo, + 0, + 0); + if (s == INVALID_SOCKET) + { + write_stderr("could not create inherited socket: error code %d\n", + WSAGetLastError()); + exit(1); + } + *dest = s; + + /* + * To make sure we don't get two references to the same socket, close + * the original one. (This would happen when inheritance actually + * works.. + */ + closesocket(src->origsocket); + } +} +#endif + +static void +read_backend_variables(char *id, char **startup_data, size_t *startup_data_len) +{ + BackendParameters param; + +#ifndef WIN32 + /* Non-win32 implementation reads from file */ + FILE *fp; + + /* Open file */ + fp = AllocateFile(id, PG_BINARY_R); + if (!fp) + { + write_stderr("could not open backend variables file \"%s\": %m\n", id); + exit(1); + } + + if (fread(¶m, sizeof(param), 1, fp) != 1) + { + write_stderr("could not read from backend variables file \"%s\": %m\n", id); + exit(1); + } + + /* read startup data */ + *startup_data_len = param.startup_data_len; + if (param.startup_data_len > 0) + { + *startup_data = palloc(*startup_data_len); + if (fread(*startup_data, *startup_data_len, 1, fp) != 1) + { + write_stderr("could not read startup data from backend variables file \"%s\": %m\n", + id); + exit(1); + } + } + else + *startup_data = NULL; + + /* Release file */ + FreeFile(fp); + if (unlink(id) != 0) + { + write_stderr("could not remove file \"%s\": %m\n", id); + exit(1); + } +#else + /* Win32 version uses mapped file */ + HANDLE paramHandle; + BackendParameters *paramp; + +#ifdef _WIN64 + paramHandle = (HANDLE) _atoi64(id); +#else + paramHandle = (HANDLE) atol(id); +#endif + paramp = MapViewOfFile(paramHandle, FILE_MAP_READ, 0, 0, 0); + if (!paramp) + { + write_stderr("could not map view of backend variables: error code %lu\n", + GetLastError()); + exit(1); + } + + memcpy(¶m, paramp, sizeof(BackendParameters)); + + /* read startup data */ + *startup_data_len = param.startup_data_len; + if (param.startup_data_len > 0) + { + *startup_data = palloc(paramp->startup_data_len); + memcpy(*startup_data, paramp->startup_data, param.startup_data_len); + } + else + *startup_data = NULL; + + if (!UnmapViewOfFile(paramp)) + { + write_stderr("could not unmap view of backend variables: error code %lu\n", + GetLastError()); + exit(1); + } + + if (!CloseHandle(paramHandle)) + { + write_stderr("could not close handle to backend parameter variables: error code %lu\n", + GetLastError()); + exit(1); + } +#endif + + restore_backend_variables(¶m); +} + +/* Restore critical backend variables from the BackendParameters struct */ +static void +restore_backend_variables(BackendParameters *param) +{ + if (param->client_sock.sock != PGINVALID_SOCKET) + { + MyClientSocket = MemoryContextAlloc(TopMemoryContext, sizeof(ClientSocket)); + memcpy(MyClientSocket, ¶m->client_sock, sizeof(ClientSocket)); + read_inheritable_socket(&MyClientSocket->sock, ¶m->inh_sock); + } + + SetDataDir(param->DataDir); + + MyCancelKey = param->MyCancelKey; + MyPMChildSlot = param->MyPMChildSlot; + +#ifdef WIN32 + ShmemProtectiveRegion = param->ShmemProtectiveRegion; +#endif + UsedShmemSegID = param->UsedShmemSegID; + UsedShmemSegAddr = param->UsedShmemSegAddr; + + ShmemLock = param->ShmemLock; + ShmemBackendArray = param->ShmemBackendArray; + +#ifdef USE_INJECTION_POINTS + ActiveInjectionPoints = param->ActiveInjectionPoints; +#endif + +#ifndef HAVE_SPINLOCKS + SpinlockSemaArray = param->SpinlockSemaArray; +#endif + NamedLWLockTrancheRequests = param->NamedLWLockTrancheRequests; + NamedLWLockTrancheArray = param->NamedLWLockTrancheArray; + MainLWLockArray = param->MainLWLockArray; + ProcStructLock = param->ProcStructLock; + ProcGlobal = param->ProcGlobal; + AuxiliaryProcs = param->AuxiliaryProcs; + PreparedXactProcs = param->PreparedXactProcs; + PMSignalState = param->PMSignalState; + + PostmasterPid = param->PostmasterPid; + PgStartTime = param->PgStartTime; + PgReloadTime = param->PgReloadTime; + first_syslogger_file_time = param->first_syslogger_file_time; + + redirection_done = param->redirection_done; + IsBinaryUpgrade = param->IsBinaryUpgrade; + query_id_enabled = param->query_id_enabled; + max_safe_fds = param->max_safe_fds; + + MaxBackends = param->MaxBackends; + +#ifdef WIN32 + PostmasterHandle = param->PostmasterHandle; + pgwin32_initial_signal_pipe = param->initial_signal_pipe; +#else + memcpy(&postmaster_alive_fds, ¶m->postmaster_alive_fds, + sizeof(postmaster_alive_fds)); +#endif + + memcpy(&syslogPipe, ¶m->syslogPipe, sizeof(syslogPipe)); + + strlcpy(my_exec_path, param->my_exec_path, MAXPGPATH); + + strlcpy(pkglib_path, param->pkglib_path, MAXPGPATH); + + /* + * We need to restore fd.c's counts of externally-opened FDs; to avoid + * confusion, be sure to do this after restoring max_safe_fds. (Note: + * BackendInitialize will handle this for (*client_sock)->sock.) + */ +#ifndef WIN32 + if (postmaster_alive_fds[0] >= 0) + ReserveExternalFD(); + if (postmaster_alive_fds[1] >= 0) + ReserveExternalFD(); +#endif +} + +#endif /* EXEC_BACKEND */ diff --git a/src/backend/postmaster/meson.build b/src/backend/postmaster/meson.build index cda921fd10b3b..0ea4bbe084eaa 100644 --- a/src/backend/postmaster/meson.build +++ b/src/backend/postmaster/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'autovacuum.c', @@ -8,9 +8,11 @@ backend_sources += files( 'checkpointer.c', 'fork_process.c', 'interrupt.c', + 'launch_backend.c', 'pgarch.c', 'postmaster.c', 'startup.c', 'syslogger.c', + 'walsummarizer.c', 'walwriter.c', ) diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c index 46af349564447..02f91431f5f3c 100644 --- a/src/backend/postmaster/pgarch.c +++ b/src/backend/postmaster/pgarch.c @@ -14,7 +14,7 @@ * * Initial author: Simon Riggs simon@2ndquadrant.com * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -36,8 +36,10 @@ #include "lib/binaryheap.h" #include "libpq/pqsignal.h" #include "pgstat.h" +#include "postmaster/auxprocess.h" #include "postmaster/interrupt.h" #include "postmaster/pgarch.h" +#include "storage/condition_variable.h" #include "storage/fd.h" #include "storage/ipc.h" #include "storage/latch.h" @@ -45,10 +47,11 @@ #include "storage/proc.h" #include "storage/procsignal.h" #include "storage/shmem.h" -#include "storage/spin.h" #include "utils/guc.h" #include "utils/memutils.h" #include "utils/ps_status.h" +#include "utils/resowner.h" +#include "utils/timeout.h" /* ---------- @@ -80,17 +83,16 @@ /* Shared memory area for archiver process */ typedef struct PgArchData { - int pgprocno; /* pgprocno of archiver process */ + int pgprocno; /* proc number of archiver process */ /* - * Forces a directory scan in pgarch_readyXlog(). Protected by arch_lck. + * Forces a directory scan in pgarch_readyXlog(). */ - bool force_dir_scan; - - slock_t arch_lck; + pg_atomic_uint32 force_dir_scan; } PgArchData; char *XLogArchiveLibrary = ""; +char *arch_module_check_errdetail_string; /* ---------- @@ -101,6 +103,7 @@ static time_t last_sigterm_time = 0; static PgArchData *PgArch = NULL; static const ArchiveModuleCallbacks *ArchiveCallbacks; static ArchiveModuleState *archive_module_state; +static MemoryContext archive_context; /* @@ -173,8 +176,8 @@ PgArchShmemInit(void) { /* First time through, so initialize */ MemSet(PgArch, 0, PgArchShmemSize()); - PgArch->pgprocno = INVALID_PGPROCNO; - SpinLockInit(&PgArch->arch_lck); + PgArch->pgprocno = INVALID_PROC_NUMBER; + pg_atomic_init_u32(&PgArch->force_dir_scan, 0); } } @@ -211,8 +214,13 @@ PgArchCanRestart(void) /* Main entry point for archiver process */ void -PgArchiverMain(void) +PgArchiverMain(char *startup_data, size_t startup_data_len) { + Assert(startup_data_len == 0); + + MyBackendType = B_ARCHIVER; + AuxiliaryProcessMainCommon(); + /* * Ignore all signals usually bound to some action in the postmaster, * except for SIGHUP, SIGTERM, SIGUSR1, SIGUSR2, and SIGQUIT. @@ -239,10 +247,10 @@ PgArchiverMain(void) on_shmem_exit(pgarch_die, 0); /* - * Advertise our pgprocno so that backends can use our latch to wake us up - * while we're sleeping. + * Advertise our proc number so that backends can use our latch to wake us + * up while we're sleeping. */ - PgArch->pgprocno = MyProc->pgprocno; + PgArch->pgprocno = MyProcNumber; /* Create workspace for pgarch_readyXlog() */ arch_files = palloc(sizeof(struct arch_files_state)); @@ -252,6 +260,11 @@ PgArchiverMain(void) arch_files->arch_heap = binaryheap_allocate(NUM_FILES_PER_DIRECTORY_SCAN, ready_file_comparator, NULL); + /* Initialize our memory context. */ + archive_context = AllocSetContextCreate(TopMemoryContext, + "archiver", + ALLOCSET_DEFAULT_SIZES); + /* Load the archive_library. */ LoadArchiveLibrary(); @@ -274,7 +287,7 @@ PgArchWakeup(void) * process' (or no process') latch. Even in that case the archiver will * be relaunched shortly and will start archiving. */ - if (arch_pgprocno != INVALID_PGPROCNO) + if (arch_pgprocno != INVALID_PROC_NUMBER) SetLatch(&ProcGlobal->allProcs[arch_pgprocno].procLatch); } @@ -283,13 +296,9 @@ PgArchWakeup(void) static void pgarch_waken_stop(SIGNAL_ARGS) { - int save_errno = errno; - /* set flag to do a final cycle and shut down afterwards */ ready_to_stop = true; SetLatch(MyLatch); - - errno = save_errno; } /* @@ -408,12 +417,17 @@ pgarch_ArchiverCopyLoop(void) */ HandlePgArchInterrupts(); + /* Reset variables that might be set by the callback */ + arch_module_check_errdetail_string = NULL; + /* can't do anything if not configured ... */ if (ArchiveCallbacks->check_configured_cb != NULL && !ArchiveCallbacks->check_configured_cb(archive_module_state)) { ereport(WARNING, - (errmsg("archive_mode enabled, yet archiving is not configured"))); + (errmsg("\"archive_mode\" enabled, yet archiving is not configured"), + arch_module_check_errdetail_string ? + errdetail_internal("%s", arch_module_check_errdetail_string) : 0)); return; } @@ -501,6 +515,8 @@ pgarch_ArchiverCopyLoop(void) static bool pgarch_archiveXlog(char *xlog) { + sigjmp_buf local_sigjmp_buf; + MemoryContext oldcontext; char pathname[MAXPGPATH]; char activitymsg[MAXFNAMELEN + 16]; bool ret; @@ -511,7 +527,87 @@ pgarch_archiveXlog(char *xlog) snprintf(activitymsg, sizeof(activitymsg), "archiving %s", xlog); set_ps_display(activitymsg); - ret = ArchiveCallbacks->archive_file_cb(archive_module_state, xlog, pathname); + oldcontext = MemoryContextSwitchTo(archive_context); + + /* + * Since the archiver operates at the bottom of the exception stack, + * ERRORs turn into FATALs and cause the archiver process to restart. + * However, using ereport(ERROR, ...) when there are problems is easy to + * code and maintain. Therefore, we create our own exception handler to + * catch ERRORs and return false instead of restarting the archiver + * whenever there is a failure. + * + * We assume ERRORs from the archiving callback are the most common + * exceptions experienced by the archiver, so we opt to handle exceptions + * here instead of PgArchiverMain() to avoid reinitializing the archiver + * too frequently. We could instead add a sigsetjmp() block to + * PgArchiverMain() and use PG_TRY/PG_CATCH here, but the extra code to + * avoid the odd archiver restart doesn't seem worth it. + */ + if (sigsetjmp(local_sigjmp_buf, 1) != 0) + { + /* Since not using PG_TRY, must reset error stack by hand */ + error_context_stack = NULL; + + /* Prevent interrupts while cleaning up */ + HOLD_INTERRUPTS(); + + /* Report the error to the server log. */ + EmitErrorReport(); + + /* + * Try to clean up anything the archive module left behind. We try to + * cover anything that an archive module could conceivably have left + * behind, but it is of course possible that modules could be doing + * unexpected things that require additional cleanup. Module authors + * should be sure to do any extra required cleanup in a PG_CATCH block + * within the archiving callback, and they are encouraged to notify + * the pgsql-hackers mailing list so that we can add it here. + */ + disable_all_timeouts(false); + LWLockReleaseAll(); + ConditionVariableCancelSleep(); + pgstat_report_wait_end(); + ReleaseAuxProcessResources(false); + AtEOXact_Files(false); + AtEOXact_HashTables(false); + + /* + * Return to the original memory context and clear ErrorContext for + * next time. + */ + MemoryContextSwitchTo(oldcontext); + FlushErrorState(); + + /* Flush any leaked data */ + MemoryContextReset(archive_context); + + /* Remove our exception handler */ + PG_exception_stack = NULL; + + /* Now we can allow interrupts again */ + RESUME_INTERRUPTS(); + + /* Report failure so that the archiver retries this file */ + ret = false; + } + else + { + /* Enable our exception handler */ + PG_exception_stack = &local_sigjmp_buf; + + /* Archive the file! */ + ret = ArchiveCallbacks->archive_file_cb(archive_module_state, + xlog, pathname); + + /* Remove our exception handler */ + PG_exception_stack = NULL; + + /* Reset our memory context and switch back to the original one */ + MemoryContextSwitchTo(oldcontext); + MemoryContextReset(archive_context); + } + if (ret) snprintf(activitymsg, sizeof(activitymsg), "last was %s", xlog); else @@ -549,18 +645,12 @@ pgarch_readyXlog(char *xlog) char XLogArchiveStatusDir[MAXPGPATH]; DIR *rldir; struct dirent *rlde; - bool force_dir_scan; /* * If a directory scan was requested, clear the stored file names and * proceed. */ - SpinLockAcquire(&PgArch->arch_lck); - force_dir_scan = PgArch->force_dir_scan; - PgArch->force_dir_scan = false; - SpinLockRelease(&PgArch->arch_lck); - - if (force_dir_scan) + if (pg_atomic_exchange_u32(&PgArch->force_dir_scan, 0) == 1) arch_files->arch_files_size = 0; /* @@ -711,9 +801,7 @@ ready_file_comparator(Datum a, Datum b, void *arg) void PgArchForceDirScan(void) { - SpinLockAcquire(&PgArch->arch_lck); - PgArch->force_dir_scan = true; - SpinLockRelease(&PgArch->arch_lck); + pg_atomic_write_membarrier_u32(&PgArch->force_dir_scan, 1); } /* @@ -756,7 +844,7 @@ pgarch_archiveDone(char *xlog) static void pgarch_die(int code, Datum arg) { - PgArch->pgprocno = INVALID_PGPROCNO; + PgArch->pgprocno = INVALID_PROC_NUMBER; } /* @@ -788,8 +876,8 @@ HandlePgArchInterrupts(void) if (XLogArchiveLibrary[0] != '\0' && XLogArchiveCommand[0] != '\0') ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("both archive_command and archive_library set"), - errdetail("Only one of archive_command, archive_library may be set."))); + errmsg("both \"archive_command\" and \"archive_library\" set"), + errdetail("Only one of \"archive_command\", \"archive_library\" may be set."))); archiveLibChanged = strcmp(XLogArchiveLibrary, archiveLib) != 0; pfree(archiveLib); @@ -827,8 +915,8 @@ LoadArchiveLibrary(void) if (XLogArchiveLibrary[0] != '\0' && XLogArchiveCommand[0] != '\0') ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("both archive_command and archive_library set"), - errdetail("Only one of archive_command, archive_library may be set."))); + errmsg("both \"archive_command\" and \"archive_library\" set"), + errdetail("Only one of \"archive_command\", \"archive_library\" may be set."))); /* * If shell archiving is enabled, use our special initialization function. diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 4c49393fc5ad8..d032091495b1e 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -2,9 +2,9 @@ * * postmaster.c * This program acts as a clearing house for requests to the - * POSTGRES system. Frontend programs send a startup message - * to the Postmaster and the postmaster uses the info in the - * message to setup a backend process. + * POSTGRES system. Frontend programs connect to the Postmaster, + * and postmaster forks a new backend process to handle the + * connection. * * The postmaster also manages system-wide operations such as * startup and shutdown. The postmaster itself doesn't do those @@ -32,7 +32,7 @@ * clients. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -89,50 +89,42 @@ #include #endif -#include "access/transam.h" #include "access/xlog.h" #include "access/xlogrecovery.h" -#include "catalog/pg_control.h" #include "common/file_perm.h" +#include "common/file_utils.h" #include "common/ip.h" #include "common/pg_prng.h" -#include "common/string.h" #include "lib/ilist.h" -#include "libpq/auth.h" #include "libpq/libpq.h" -#include "libpq/pqformat.h" #include "libpq/pqsignal.h" -#include "nodes/queryjumble.h" #include "pg_getopt.h" #include "pgstat.h" #include "port/pg_bswap.h" #include "postmaster/autovacuum.h" #include "postmaster/auxprocess.h" #include "postmaster/bgworker_internals.h" -#include "postmaster/fork_process.h" -#include "postmaster/interrupt.h" #include "postmaster/pgarch.h" #include "postmaster/postmaster.h" #include "postmaster/syslogger.h" +#include "postmaster/walsummarizer.h" #include "replication/logicallauncher.h" +#include "replication/slotsync.h" #include "replication/walsender.h" #include "storage/fd.h" #include "storage/ipc.h" -#include "storage/pg_shmem.h" #include "storage/pmsignal.h" #include "storage/proc.h" +#include "tcop/backend_startup.h" #include "tcop/tcopprot.h" -#include "utils/builtins.h" #include "utils/datetime.h" #include "utils/memutils.h" #include "utils/pidfile.h" -#include "utils/ps_status.h" -#include "utils/timeout.h" #include "utils/timestamp.h" #include "utils/varlena.h" #ifdef EXEC_BACKEND -#include "storage/spin.h" +#include "storage/pg_shmem.h" #endif @@ -167,11 +159,11 @@ * they will never become live backends. dead_end children are not assigned a * PMChildSlot. dead_end children have bkend_type NORMAL. * - * "Special" children such as the startup, bgwriter and autovacuum launcher - * tasks are not in this list. They are tracked via StartupPID and other - * pid_t variables below. (Thus, there can't be more than one of any given - * "special" child process type. We use BackendList entries for any child - * process there can be more than one of.) + * "Special" children such as the startup, bgwriter, autovacuum launcher, and + * slot sync worker tasks are not in this list. They are tracked via StartupPID + * and other pid_t variables below. (Thus, there can't be more than one of any + * given "special" child process type. We use BackendList entries for any + * child process there can be more than one of.) */ typedef struct bkend { @@ -187,7 +179,7 @@ typedef struct bkend static dlist_head BackendList = DLIST_STATIC_INIT(BackendList); #ifdef EXEC_BACKEND -static Backend *ShmemBackendArray; +Backend *ShmemBackendArray; #endif BackgroundWorker *MyBgworkerEntry = NULL; @@ -226,7 +218,8 @@ int ReservedConnections; /* The socket(s) we're listening to. */ #define MAXLISTEN 64 -static pgsocket ListenSocket[MAXLISTEN]; +static int NumListenSockets = 0; +static pgsocket *ListenSockets = NULL; /* still more option variables */ bool EnableSSL = false; @@ -236,7 +229,6 @@ int AuthenticationTimeout = 60; bool log_hostname; /* for ps display and logging */ bool Log_connections = false; -bool Db_user_namespace = false; bool enable_bonjour = false; char *bonjour_name; @@ -251,9 +243,11 @@ static pid_t StartupPID = 0, CheckpointerPID = 0, WalWriterPID = 0, WalReceiverPID = 0, + WalSummarizerPID = 0, AutoVacPID = 0, PgArchPID = 0, - SysLoggerPID = 0; + SysLoggerPID = 0, + SlotSyncWorkerPID = 0; /* Startup process's status */ typedef enum @@ -261,7 +255,7 @@ typedef enum STARTUP_NOT_RUNNING, STARTUP_RUNNING, STARTUP_SIGNALED, /* we sent it a SIGQUIT or SIGKILL */ - STARTUP_CRASHED + STARTUP_CRASHED, } StartupStatusEnum; static StartupStatusEnum StartupStatus = STARTUP_NOT_RUNNING; @@ -331,7 +325,7 @@ typedef enum PM_SHUTDOWN_2, /* waiting for archiver and walsenders to * finish */ PM_WAIT_DEAD_END, /* waiting for dead_end children to exit */ - PM_NO_CHILDREN /* all important children have exited */ + PM_NO_CHILDREN, /* all important children have exited */ } PMState; static PMState pmState = PM_INIT; @@ -384,7 +378,7 @@ static WaitEventSet *pm_wait_set; #ifdef USE_SSL /* Set when and if SSL has been initialized properly */ -static bool LoadedSSL = false; +bool LoadedSSL = false; #endif #ifdef USE_BONJOUR @@ -398,8 +392,6 @@ static void CloseServerPorts(int status, Datum arg); static void unlink_external_pid_file(int status, Datum arg); static void getInstallationPaths(const char *argv0); static void checkControlFile(void); -static Port *ConnCreate(int serverFd); -static void ConnFree(Port *port); static void handle_pm_pmsignal_signal(SIGNAL_ARGS); static void handle_pm_child_exit_signal(SIGNAL_ARGS); static void handle_pm_reload_request_signal(SIGNAL_ARGS); @@ -408,24 +400,18 @@ static void process_pm_pmsignal(void); static void process_pm_child_exit(void); static void process_pm_reload_request(void); static void process_pm_shutdown_request(void); -static void process_startup_packet_die(SIGNAL_ARGS); static void dummy_handler(SIGNAL_ARGS); -static void StartupPacketTimeoutHandler(void); static void CleanupBackend(int pid, int exitstatus); static bool CleanupBackgroundWorker(int pid, int exitstatus); static void HandleChildCrash(int pid, int exitstatus, const char *procname); static void LogChildExit(int lev, const char *procname, int pid, int exitstatus); static void PostmasterStateMachine(void); -static void BackendInitialize(Port *port); -static void BackendRun(Port *port) pg_attribute_noreturn(); + static void ExitPostmaster(int status) pg_attribute_noreturn(); static int ServerLoop(void); -static int BackendStartup(Port *port); -static int ProcessStartupPacket(Port *port, bool ssl_done, bool gss_done); -static void SendNegotiateProtocolVersion(List *unrecognized_protocol_options); -static void processCancelRequest(Port *port, void *pkt); -static void report_fork_failure_to_client(Port *port, int errnum); +static int BackendStartup(ClientSocket *client_sock); +static void report_fork_failure_to_client(ClientSocket *client_sock, int errnum); static CAC_state canAcceptConnections(int backend_type); static bool RandomCancelKey(int32 *cancel_key); static void signal_child(pid_t pid, int signal); @@ -439,10 +425,12 @@ static int CountChildren(int target); static bool assign_backendlist_entry(RegisteredBgWorker *rw); static void maybe_start_bgworkers(void); static bool CreateOptsFile(int argc, char *argv[], char *fullprogname); -static pid_t StartChildProcess(AuxProcType type); +static pid_t StartChildProcess(BackendType type); static void StartAutovacuumWorker(void); static void MaybeStartWalReceiver(void); +static void MaybeStartWalSummarizer(void); static void InitPostmasterDeathWatchHandle(void); +static void MaybeStartSlotSyncWorker(void); /* * Archiver is allowed to start up at the current postmaster state? @@ -474,95 +462,10 @@ typedef struct } win32_deadchild_waitinfo; #endif /* WIN32 */ -static pid_t backend_forkexec(Port *port); -static pid_t internal_forkexec(int argc, char *argv[], Port *port); - -/* Type for a socket that can be inherited to a client process */ -#ifdef WIN32 -typedef struct -{ - SOCKET origsocket; /* Original socket value, or PGINVALID_SOCKET - * if not a socket */ - WSAPROTOCOL_INFO wsainfo; -} InheritableSocket; -#else -typedef int InheritableSocket; -#endif - -/* - * Structure contains all variables passed to exec:ed backends - */ -typedef struct -{ - Port port; - InheritableSocket portsocket; - char DataDir[MAXPGPATH]; - pgsocket ListenSocket[MAXLISTEN]; - int32 MyCancelKey; - int MyPMChildSlot; -#ifndef WIN32 - unsigned long UsedShmemSegID; -#else - void *ShmemProtectiveRegion; - HANDLE UsedShmemSegID; -#endif - void *UsedShmemSegAddr; - slock_t *ShmemLock; - VariableCache ShmemVariableCache; - Backend *ShmemBackendArray; -#ifndef HAVE_SPINLOCKS - PGSemaphore *SpinlockSemaArray; -#endif - int NamedLWLockTrancheRequests; - NamedLWLockTranche *NamedLWLockTrancheArray; - LWLockPadded *MainLWLockArray; - slock_t *ProcStructLock; - PROC_HDR *ProcGlobal; - PGPROC *AuxiliaryProcs; - PGPROC *PreparedXactProcs; - PMSignalData *PMSignalState; - pid_t PostmasterPid; - TimestampTz PgStartTime; - TimestampTz PgReloadTime; - pg_time_t first_syslogger_file_time; - bool redirection_done; - bool IsBinaryUpgrade; - bool query_id_enabled; - int max_safe_fds; - int MaxBackends; -#ifdef WIN32 - HANDLE PostmasterHandle; - HANDLE initial_signal_pipe; - HANDLE syslogPipe[2]; -#else - int postmaster_alive_fds[2]; - int syslogPipe[2]; -#endif - char my_exec_path[MAXPGPATH]; - char pkglib_path[MAXPGPATH]; -} BackendParameters; - -static void read_backend_variables(char *id, Port *port); -static void restore_backend_variables(BackendParameters *param, Port *port); - -#ifndef WIN32 -static bool save_backend_variables(BackendParameters *param, Port *port); -#else -static bool save_backend_variables(BackendParameters *param, Port *port, - HANDLE childProcess, pid_t childPid); -#endif - static void ShmemBackendArrayAdd(Backend *bn); static void ShmemBackendArrayRemove(Backend *bn); #endif /* EXEC_BACKEND */ -#define StartupDataBase() StartChildProcess(StartupProcess) -#define StartArchiver() StartChildProcess(ArchiverProcess) -#define StartBackgroundWriter() StartChildProcess(BgWriterProcess) -#define StartCheckpointer() StartChildProcess(CheckpointerProcess) -#define StartWalWriter() StartChildProcess(WalWriterProcess) -#define StartWalReceiver() StartChildProcess(WalReceiverProcess) - /* Macros to check exit status of a child process */ #define EXIT_STATUS_0(st) ((st) == 0) #define EXIT_STATUS_1(st) (WIFEXITED(st) && WEXITSTATUS(st) == 1) @@ -589,7 +492,6 @@ PostmasterMain(int argc, char *argv[]) int status; char *userDoption = NULL; bool listen_addr_saved = false; - int i; char *output_config_variable = NULL; InitProcessGlobals(); @@ -920,7 +822,7 @@ PostmasterMain(int argc, char *argv[]) */ if (SuperuserReservedConnections + ReservedConnections >= MaxConnections) { - write_stderr("%s: superuser_reserved_connections (%d) plus reserved_connections (%d) must be less than max_connections (%d)\n", + write_stderr("%s: \"superuser_reserved_connections\" (%d) plus \"reserved_connections\" (%d) must be less than \"max_connections\" (%d)\n", progname, SuperuserReservedConnections, ReservedConnections, MaxConnections); @@ -928,10 +830,13 @@ PostmasterMain(int argc, char *argv[]) } if (XLogArchiveMode > ARCHIVE_MODE_OFF && wal_level == WAL_LEVEL_MINIMAL) ereport(ERROR, - (errmsg("WAL archival cannot be enabled when wal_level is \"minimal\""))); + (errmsg("WAL archival cannot be enabled when \"wal_level\" is \"minimal\""))); if (max_wal_senders > 0 && wal_level == WAL_LEVEL_MINIMAL) ereport(ERROR, - (errmsg("WAL streaming (max_wal_senders > 0) requires wal_level \"replica\" or \"logical\""))); + (errmsg("WAL streaming (\"max_wal_senders\" > 0) requires \"wal_level\" to be \"replica\" or \"logical\""))); + if (summarize_wal && wal_level == WAL_LEVEL_MINIMAL) + ereport(ERROR, + (errmsg("WAL cannot be summarized when \"wal_level\" is \"minimal\""))); /* * Other one-time internal sanity checks can go here, if they are fast. @@ -1105,11 +1010,11 @@ PostmasterMain(int argc, char *argv[]) /* * Clean out the temp directory used to transmit parameters to child - * processes (see internal_forkexec, below). We must do this before - * launching any child processes, else we have a race condition: we could - * remove a parameter file before the child can read it. It should be - * safe to do so now, because we verified earlier that there are no - * conflicting Postgres processes in this data directory. + * processes (see internal_forkexec). We must do this before launching + * any child processes, else we have a race condition: we could remove a + * parameter file before the child can read it. It should be safe to do + * so now, because we verified earlier that there are no conflicting + * Postgres processes in this data directory. */ RemovePgTempFilesInDir(PG_TEMP_FILES_DIR, true, false); #endif @@ -1178,12 +1083,10 @@ PostmasterMain(int argc, char *argv[]) /* * Establish input sockets. * - * First, mark them all closed, and set up an on_proc_exit function that's - * charged with closing the sockets again at postmaster shutdown. + * First set up an on_proc_exit function that's charged with closing the + * sockets again at postmaster shutdown. */ - for (i = 0; i < MAXLISTEN; i++) - ListenSocket[i] = PGINVALID_SOCKET; - + ListenSockets = palloc(MAXLISTEN * sizeof(pgsocket)); on_proc_exit(CloseServerPorts, 0); if (ListenAddresses) @@ -1211,15 +1114,19 @@ PostmasterMain(int argc, char *argv[]) char *curhost = (char *) lfirst(l); if (strcmp(curhost, "*") == 0) - status = StreamServerPort(AF_UNSPEC, NULL, + status = ListenServerPort(AF_UNSPEC, NULL, (unsigned short) PostPortNumber, NULL, - ListenSocket, MAXLISTEN); + ListenSockets, + &NumListenSockets, + MAXLISTEN); else - status = StreamServerPort(AF_UNSPEC, curhost, + status = ListenServerPort(AF_UNSPEC, curhost, (unsigned short) PostPortNumber, NULL, - ListenSocket, MAXLISTEN); + ListenSockets, + &NumListenSockets, + MAXLISTEN); if (status == STATUS_OK) { @@ -1247,7 +1154,7 @@ PostmasterMain(int argc, char *argv[]) #ifdef USE_BONJOUR /* Register for Bonjour only if we opened TCP socket(s) */ - if (enable_bonjour && ListenSocket[0] != PGINVALID_SOCKET) + if (enable_bonjour && NumListenSockets > 0) { DNSServiceErrorType err; @@ -1308,10 +1215,12 @@ PostmasterMain(int argc, char *argv[]) { char *socketdir = (char *) lfirst(l); - status = StreamServerPort(AF_UNIX, NULL, + status = ListenServerPort(AF_UNIX, NULL, (unsigned short) PostPortNumber, socketdir, - ListenSocket, MAXLISTEN); + ListenSockets, + &NumListenSockets, + MAXLISTEN); if (status == STATUS_OK) { @@ -1337,7 +1246,7 @@ PostmasterMain(int argc, char *argv[]) /* * check that we have some socket to listen on */ - if (ListenSocket[0] == PGINVALID_SOCKET) + if (NumListenSockets == 0) ereport(FATAL, (errmsg("no socket created for listening"))); @@ -1370,12 +1279,12 @@ PostmasterMain(int argc, char *argv[]) /* Make PID file world readable */ if (chmod(external_pid_file, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) != 0) - write_stderr("%s: could not change permissions of external PID file \"%s\": %s\n", - progname, external_pid_file, strerror(errno)); + write_stderr("%s: could not change permissions of external PID file \"%s\": %m\n", + progname, external_pid_file); } else - write_stderr("%s: could not write external PID file \"%s\": %s\n", - progname, external_pid_file, strerror(errno)); + write_stderr("%s: could not write external PID file \"%s\": %m\n", + progname, external_pid_file); on_proc_exit(unlink_external_pid_file, 0); } @@ -1424,6 +1333,8 @@ PostmasterMain(int argc, char *argv[]) * calls fork() without an immediate exec(), both of which have undefined * behavior in a multithreaded program. A multithreaded postmaster is the * normal case on Windows, which offers neither fork() nor sigprocmask(). + * Currently, macOS is the only platform having pthread_is_threaded_np(), + * so we need not worry whether this HINT is appropriate elsewhere. */ if (pthread_is_threaded_np() != 0) ereport(FATAL, @@ -1445,14 +1356,14 @@ PostmasterMain(int argc, char *argv[]) /* Start bgwriter and checkpointer so they can help with recovery */ if (CheckpointerPID == 0) - CheckpointerPID = StartCheckpointer(); + CheckpointerPID = StartChildProcess(B_CHECKPOINTER); if (BgWriterPID == 0) - BgWriterPID = StartBackgroundWriter(); + BgWriterPID = StartChildProcess(B_BG_WRITER); /* * We're ready to rock and roll... */ - StartupPID = StartupDataBase(); + StartupPID = StartChildProcess(B_STARTUP); Assert(StartupPID != 0); StartupStatus = STARTUP_RUNNING; pmState = PM_STARTUP; @@ -1485,14 +1396,12 @@ CloseServerPorts(int status, Datum arg) * before we remove the postmaster.pid lockfile; otherwise there's a race * condition if a new postmaster wants to re-use the TCP port number. */ - for (i = 0; i < MAXLISTEN; i++) + for (i = 0; i < NumListenSockets; i++) { - if (ListenSocket[i] != PGINVALID_SOCKET) - { - StreamClose(ListenSocket[i]); - ListenSocket[i] = PGINVALID_SOCKET; - } + if (closesocket(ListenSockets[i]) != 0) + elog(LOG, "could not close listen socket: %m"); } + NumListenSockets = 0; /* * Next, remove any filesystem entries for Unix sockets. To avoid race @@ -1565,8 +1474,8 @@ getInstallationPaths(const char *argv0) FreeDir(pdir); /* - * XXX is it worth similarly checking the share/ directory? If the lib/ - * directory is there, then share/ probably is too. + * It's not worth checking the share/ directory. If the lib/ directory is + * there, then share/ probably is too. */ } @@ -1589,8 +1498,8 @@ checkControlFile(void) { write_stderr("%s: could not find the database system\n" "Expected to find it in the directory \"%s\",\n" - "but could not open file \"%s\": %s\n", - progname, DataDir, path, strerror(errno)); + "but could not open file \"%s\": %m\n", + progname, DataDir, path); ExitPostmaster(2); } FreeFile(fp); @@ -1693,29 +1602,19 @@ DetermineSleepTime(void) static void ConfigurePostmasterWaitSet(bool accept_connections) { - int nsockets; - if (pm_wait_set) FreeWaitEventSet(pm_wait_set); pm_wait_set = NULL; - /* How many server sockets do we need to wait for? */ - nsockets = 0; - if (accept_connections) - { - while (nsockets < MAXLISTEN && - ListenSocket[nsockets] != PGINVALID_SOCKET) - ++nsockets; - } - - pm_wait_set = CreateWaitEventSet(CurrentMemoryContext, 1 + nsockets); + pm_wait_set = CreateWaitEventSet(NULL, + accept_connections ? (1 + NumListenSockets) : 1); AddWaitEventToSet(pm_wait_set, WL_LATCH_SET, PGINVALID_SOCKET, MyLatch, NULL); if (accept_connections) { - for (int i = 0; i < nsockets; i++) - AddWaitEventToSet(pm_wait_set, WL_SOCKET_ACCEPT, ListenSocket[i], + for (int i = 0; i < NumListenSockets; i++) + AddWaitEventToSet(pm_wait_set, WL_SOCKET_ACCEPT, ListenSockets[i], NULL, NULL); } } @@ -1771,19 +1670,16 @@ ServerLoop(void) if (events[i].events & WL_SOCKET_ACCEPT) { - Port *port; + ClientSocket s; - port = ConnCreate(events[i].fd); - if (port) - { - BackendStartup(port); + if (AcceptConnection(events[i].fd, &s) == STATUS_OK) + BackendStartup(&s); - /* - * We no longer need the open socket or port structure in - * this process - */ - StreamClose(port->sock); - ConnFree(port); + /* We no longer need the open socket in this process */ + if (s.sock != PGINVALID_SOCKET) + { + if (closesocket(s.sock) != 0) + elog(LOG, "could not close client socket: %m"); } } } @@ -1801,9 +1697,9 @@ ServerLoop(void) pmState == PM_HOT_STANDBY || pmState == PM_STARTUP) { if (CheckpointerPID == 0) - CheckpointerPID = StartCheckpointer(); + CheckpointerPID = StartChildProcess(B_CHECKPOINTER); if (BgWriterPID == 0) - BgWriterPID = StartBackgroundWriter(); + BgWriterPID = StartChildProcess(B_BG_WRITER); } /* @@ -1812,7 +1708,7 @@ ServerLoop(void) * be writing any new WAL). */ if (WalWriterPID == 0 && pmState == PM_RUN) - WalWriterPID = StartWalWriter(); + WalWriterPID = StartChildProcess(B_WAL_WRITER); /* * If we have lost the autovacuum launcher, try to start a new one. We @@ -1824,14 +1720,17 @@ ServerLoop(void) (AutoVacuumingActive() || start_autovac_launcher) && pmState == PM_RUN) { - AutoVacPID = StartAutoVacLauncher(); + AutoVacPID = StartChildProcess(B_AUTOVAC_LAUNCHER); if (AutoVacPID != 0) start_autovac_launcher = false; /* signal processed */ } /* If we have lost the archiver, try to start a new one. */ if (PgArchPID == 0 && PgArchStartupAllowed()) - PgArchPID = StartArchiver(); + PgArchPID = StartChildProcess(B_ARCHIVER); + + /* If we need to start a slot sync worker, try to do that now */ + MaybeStartSlotSyncWorker(); /* If we need to signal the autovacuum launcher, do so now */ if (avlauncher_needs_signal) @@ -1845,6 +1744,9 @@ ServerLoop(void) if (WalReceiverRequested) MaybeStartWalReceiver(); + /* If we need to start a WAL summarizer, try to do that now */ + MaybeStartWalSummarizer(); + /* Get other worker processes running, if needed */ if (StartWorkerNeeded || HaveCrashedWorker) maybe_start_bgworkers(); @@ -1926,486 +1828,14 @@ ServerLoop(void) } } -/* - * Read a client's startup packet and do something according to it. - * - * Returns STATUS_OK or STATUS_ERROR, or might call ereport(FATAL) and - * not return at all. - * - * (Note that ereport(FATAL) stuff is sent to the client, so only use it - * if that's what you want. Return STATUS_ERROR if you don't want to - * send anything to the client, which would typically be appropriate - * if we detect a communications failure.) - * - * Set ssl_done and/or gss_done when negotiation of an encrypted layer - * (currently, TLS or GSSAPI) is completed. A successful negotiation of either - * encryption layer sets both flags, but a rejected negotiation sets only the - * flag for that layer, since the client may wish to try the other one. We - * should make no assumption here about the order in which the client may make - * requests. - */ -static int -ProcessStartupPacket(Port *port, bool ssl_done, bool gss_done) -{ - int32 len; - char *buf; - ProtocolVersion proto; - MemoryContext oldcontext; - - pq_startmsgread(); - - /* - * Grab the first byte of the length word separately, so that we can tell - * whether we have no data at all or an incomplete packet. (This might - * sound inefficient, but it's not really, because of buffering in - * pqcomm.c.) - */ - if (pq_getbytes((char *) &len, 1) == EOF) - { - /* - * If we get no data at all, don't clutter the log with a complaint; - * such cases often occur for legitimate reasons. An example is that - * we might be here after responding to NEGOTIATE_SSL_CODE, and if the - * client didn't like our response, it'll probably just drop the - * connection. Service-monitoring software also often just opens and - * closes a connection without sending anything. (So do port - * scanners, which may be less benign, but it's not really our job to - * notice those.) - */ - return STATUS_ERROR; - } - - if (pq_getbytes(((char *) &len) + 1, 3) == EOF) - { - /* Got a partial length word, so bleat about that */ - if (!ssl_done && !gss_done) - ereport(COMMERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("incomplete startup packet"))); - return STATUS_ERROR; - } - - len = pg_ntoh32(len); - len -= 4; - - if (len < (int32) sizeof(ProtocolVersion) || - len > MAX_STARTUP_PACKET_LENGTH) - { - ereport(COMMERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("invalid length of startup packet"))); - return STATUS_ERROR; - } - - /* - * Allocate space to hold the startup packet, plus one extra byte that's - * initialized to be zero. This ensures we will have null termination of - * all strings inside the packet. - */ - buf = palloc(len + 1); - buf[len] = '\0'; - - if (pq_getbytes(buf, len) == EOF) - { - ereport(COMMERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("incomplete startup packet"))); - return STATUS_ERROR; - } - pq_endmsgread(); - - /* - * The first field is either a protocol version number or a special - * request code. - */ - port->proto = proto = pg_ntoh32(*((ProtocolVersion *) buf)); - - if (proto == CANCEL_REQUEST_CODE) - { - if (len != sizeof(CancelRequestPacket)) - { - ereport(COMMERROR, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("invalid length of startup packet"))); - return STATUS_ERROR; - } - processCancelRequest(port, buf); - /* Not really an error, but we don't want to proceed further */ - return STATUS_ERROR; - } - - if (proto == NEGOTIATE_SSL_CODE && !ssl_done) - { - char SSLok; - -#ifdef USE_SSL - /* No SSL when disabled or on Unix sockets */ - if (!LoadedSSL || port->laddr.addr.ss_family == AF_UNIX) - SSLok = 'N'; - else - SSLok = 'S'; /* Support for SSL */ -#else - SSLok = 'N'; /* No support for SSL */ -#endif - -retry1: - if (send(port->sock, &SSLok, 1, 0) != 1) - { - if (errno == EINTR) - goto retry1; /* if interrupted, just retry */ - ereport(COMMERROR, - (errcode_for_socket_access(), - errmsg("failed to send SSL negotiation response: %m"))); - return STATUS_ERROR; /* close the connection */ - } - -#ifdef USE_SSL - if (SSLok == 'S' && secure_open_server(port) == -1) - return STATUS_ERROR; -#endif - - /* - * At this point we should have no data already buffered. If we do, - * it was received before we performed the SSL handshake, so it wasn't - * encrypted and indeed may have been injected by a man-in-the-middle. - * We report this case to the client. - */ - if (pq_buffer_has_data()) - ereport(FATAL, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("received unencrypted data after SSL request"), - errdetail("This could be either a client-software bug or evidence of an attempted man-in-the-middle attack."))); - - /* - * regular startup packet, cancel, etc packet should follow, but not - * another SSL negotiation request, and a GSS request should only - * follow if SSL was rejected (client may negotiate in either order) - */ - return ProcessStartupPacket(port, true, SSLok == 'S'); - } - else if (proto == NEGOTIATE_GSS_CODE && !gss_done) - { - char GSSok = 'N'; - -#ifdef ENABLE_GSS - /* No GSSAPI encryption when on Unix socket */ - if (port->laddr.addr.ss_family != AF_UNIX) - GSSok = 'G'; -#endif - - while (send(port->sock, &GSSok, 1, 0) != 1) - { - if (errno == EINTR) - continue; - ereport(COMMERROR, - (errcode_for_socket_access(), - errmsg("failed to send GSSAPI negotiation response: %m"))); - return STATUS_ERROR; /* close the connection */ - } - -#ifdef ENABLE_GSS - if (GSSok == 'G' && secure_open_gssapi(port) == -1) - return STATUS_ERROR; -#endif - - /* - * At this point we should have no data already buffered. If we do, - * it was received before we performed the GSS handshake, so it wasn't - * encrypted and indeed may have been injected by a man-in-the-middle. - * We report this case to the client. - */ - if (pq_buffer_has_data()) - ereport(FATAL, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("received unencrypted data after GSSAPI encryption request"), - errdetail("This could be either a client-software bug or evidence of an attempted man-in-the-middle attack."))); - - /* - * regular startup packet, cancel, etc packet should follow, but not - * another GSS negotiation request, and an SSL request should only - * follow if GSS was rejected (client may negotiate in either order) - */ - return ProcessStartupPacket(port, GSSok == 'G', true); - } - - /* Could add additional special packet types here */ - - /* - * Set FrontendProtocol now so that ereport() knows what format to send if - * we fail during startup. - */ - FrontendProtocol = proto; - - /* Check that the major protocol version is in range. */ - if (PG_PROTOCOL_MAJOR(proto) < PG_PROTOCOL_MAJOR(PG_PROTOCOL_EARLIEST) || - PG_PROTOCOL_MAJOR(proto) > PG_PROTOCOL_MAJOR(PG_PROTOCOL_LATEST)) - ereport(FATAL, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u", - PG_PROTOCOL_MAJOR(proto), PG_PROTOCOL_MINOR(proto), - PG_PROTOCOL_MAJOR(PG_PROTOCOL_EARLIEST), - PG_PROTOCOL_MAJOR(PG_PROTOCOL_LATEST), - PG_PROTOCOL_MINOR(PG_PROTOCOL_LATEST)))); - - /* - * Now fetch parameters out of startup packet and save them into the Port - * structure. All data structures attached to the Port struct must be - * allocated in TopMemoryContext so that they will remain available in a - * running backend (even after PostmasterContext is destroyed). We need - * not worry about leaking this storage on failure, since we aren't in the - * postmaster process anymore. - */ - oldcontext = MemoryContextSwitchTo(TopMemoryContext); - - /* Handle protocol version 3 startup packet */ - { - int32 offset = sizeof(ProtocolVersion); - List *unrecognized_protocol_options = NIL; - - /* - * Scan packet body for name/option pairs. We can assume any string - * beginning within the packet body is null-terminated, thanks to - * zeroing extra byte above. - */ - port->guc_options = NIL; - - while (offset < len) - { - char *nameptr = buf + offset; - int32 valoffset; - char *valptr; - - if (*nameptr == '\0') - break; /* found packet terminator */ - valoffset = offset + strlen(nameptr) + 1; - if (valoffset >= len) - break; /* missing value, will complain below */ - valptr = buf + valoffset; - - if (strcmp(nameptr, "database") == 0) - port->database_name = pstrdup(valptr); - else if (strcmp(nameptr, "user") == 0) - port->user_name = pstrdup(valptr); - else if (strcmp(nameptr, "options") == 0) - port->cmdline_options = pstrdup(valptr); - else if (strcmp(nameptr, "replication") == 0) - { - /* - * Due to backward compatibility concerns the replication - * parameter is a hybrid beast which allows the value to be - * either boolean or the string 'database'. The latter - * connects to a specific database which is e.g. required for - * logical decoding while. - */ - if (strcmp(valptr, "database") == 0) - { - am_walsender = true; - am_db_walsender = true; - } - else if (!parse_bool(valptr, &am_walsender)) - ereport(FATAL, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("invalid value for parameter \"%s\": \"%s\"", - "replication", - valptr), - errhint("Valid values are: \"false\", 0, \"true\", 1, \"database\"."))); - } - else if (strncmp(nameptr, "_pq_.", 5) == 0) - { - /* - * Any option beginning with _pq_. is reserved for use as a - * protocol-level option, but at present no such options are - * defined. - */ - unrecognized_protocol_options = - lappend(unrecognized_protocol_options, pstrdup(nameptr)); - } - else - { - /* Assume it's a generic GUC option */ - port->guc_options = lappend(port->guc_options, - pstrdup(nameptr)); - port->guc_options = lappend(port->guc_options, - pstrdup(valptr)); - - /* - * Copy application_name to port if we come across it. This - * is done so we can log the application_name in the - * connection authorization message. Note that the GUC would - * be used but we haven't gone through GUC setup yet. - */ - if (strcmp(nameptr, "application_name") == 0) - { - port->application_name = pg_clean_ascii(valptr, 0); - } - } - offset = valoffset + strlen(valptr) + 1; - } - - /* - * If we didn't find a packet terminator exactly at the end of the - * given packet length, complain. - */ - if (offset != len - 1) - ereport(FATAL, - (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("invalid startup packet layout: expected terminator as last byte"))); - - /* - * If the client requested a newer protocol version or if the client - * requested any protocol options we didn't recognize, let them know - * the newest minor protocol version we do support and the names of - * any unrecognized options. - */ - if (PG_PROTOCOL_MINOR(proto) > PG_PROTOCOL_MINOR(PG_PROTOCOL_LATEST) || - unrecognized_protocol_options != NIL) - SendNegotiateProtocolVersion(unrecognized_protocol_options); - } - - /* Check a user name was given. */ - if (port->user_name == NULL || port->user_name[0] == '\0') - ereport(FATAL, - (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION), - errmsg("no PostgreSQL user name specified in startup packet"))); - - /* The database defaults to the user name. */ - if (port->database_name == NULL || port->database_name[0] == '\0') - port->database_name = pstrdup(port->user_name); - - if (Db_user_namespace) - { - /* - * If user@, it is a global user, remove '@'. We only want to do this - * if there is an '@' at the end and no earlier in the user string or - * they may fake as a local user of another database attaching to this - * database. - */ - if (strchr(port->user_name, '@') == - port->user_name + strlen(port->user_name) - 1) - *strchr(port->user_name, '@') = '\0'; - else - { - /* Append '@' and dbname */ - port->user_name = psprintf("%s@%s", port->user_name, port->database_name); - } - } - - /* - * Truncate given database and user names to length of a Postgres name. - * This avoids lookup failures when overlength names are given. - */ - if (strlen(port->database_name) >= NAMEDATALEN) - port->database_name[NAMEDATALEN - 1] = '\0'; - if (strlen(port->user_name) >= NAMEDATALEN) - port->user_name[NAMEDATALEN - 1] = '\0'; - - if (am_walsender) - MyBackendType = B_WAL_SENDER; - else - MyBackendType = B_BACKEND; - - /* - * Normal walsender backends, e.g. for streaming replication, are not - * connected to a particular database. But walsenders used for logical - * replication need to connect to a specific database. We allow streaming - * replication commands to be issued even if connected to a database as it - * can make sense to first make a basebackup and then stream changes - * starting from that. - */ - if (am_walsender && !am_db_walsender) - port->database_name[0] = '\0'; - - /* - * Done putting stuff in TopMemoryContext. - */ - MemoryContextSwitchTo(oldcontext); - - /* - * If we're going to reject the connection due to database state, say so - * now instead of wasting cycles on an authentication exchange. (This also - * allows a pg_ping utility to be written.) - */ - switch (port->canAcceptConnections) - { - case CAC_STARTUP: - ereport(FATAL, - (errcode(ERRCODE_CANNOT_CONNECT_NOW), - errmsg("the database system is starting up"))); - break; - case CAC_NOTCONSISTENT: - if (EnableHotStandby) - ereport(FATAL, - (errcode(ERRCODE_CANNOT_CONNECT_NOW), - errmsg("the database system is not yet accepting connections"), - errdetail("Consistent recovery state has not been yet reached."))); - else - ereport(FATAL, - (errcode(ERRCODE_CANNOT_CONNECT_NOW), - errmsg("the database system is not accepting connections"), - errdetail("Hot standby mode is disabled."))); - break; - case CAC_SHUTDOWN: - ereport(FATAL, - (errcode(ERRCODE_CANNOT_CONNECT_NOW), - errmsg("the database system is shutting down"))); - break; - case CAC_RECOVERY: - ereport(FATAL, - (errcode(ERRCODE_CANNOT_CONNECT_NOW), - errmsg("the database system is in recovery mode"))); - break; - case CAC_TOOMANY: - ereport(FATAL, - (errcode(ERRCODE_TOO_MANY_CONNECTIONS), - errmsg("sorry, too many clients already"))); - break; - case CAC_OK: - break; - } - - return STATUS_OK; -} - -/* - * Send a NegotiateProtocolVersion to the client. This lets the client know - * that they have requested a newer minor protocol version than we are able - * to speak. We'll speak the highest version we know about; the client can, - * of course, abandon the connection if that's a problem. - * - * We also include in the response a list of protocol options we didn't - * understand. This allows clients to include optional parameters that might - * be present either in newer protocol versions or third-party protocol - * extensions without fear of having to reconnect if those options are not - * understood, while at the same time making certain that the client is aware - * of which options were actually accepted. - */ -static void -SendNegotiateProtocolVersion(List *unrecognized_protocol_options) -{ - StringInfoData buf; - ListCell *lc; - - pq_beginmessage(&buf, 'v'); /* NegotiateProtocolVersion */ - pq_sendint32(&buf, PG_PROTOCOL_LATEST); - pq_sendint32(&buf, list_length(unrecognized_protocol_options)); - foreach(lc, unrecognized_protocol_options) - pq_sendstring(&buf, lfirst(lc)); - pq_endmessage(&buf); - - /* no need to flush, some other message will follow */ -} - /* * The client has sent a cancel request packet, not a normal * start-a-new-connection packet. Perform the necessary processing. * Nothing is sent back to the client. */ -static void -processCancelRequest(Port *port, void *pkt) +void +processCancelRequest(int backendPID, int32 cancelAuthCode) { - CancelRequestPacket *canc = (CancelRequestPacket *) pkt; - int backendPID; - int32 cancelAuthCode; Backend *bp; #ifndef EXEC_BACKEND @@ -2414,9 +1844,6 @@ processCancelRequest(Port *port, void *pkt) int i; #endif - backendPID = (int) pg_ntoh32(canc->backendPID); - cancelAuthCode = (int32) pg_ntoh32(canc->cancelAuthCode); - /* * See if we have a matching backend. In the EXEC_BACKEND case, we can no * longer access the postmaster's own backend list, and must rely on the @@ -2516,50 +1943,6 @@ canAcceptConnections(int backend_type) return result; } - -/* - * ConnCreate -- create a local connection data structure - * - * Returns NULL on failure, other than out-of-memory which is fatal. - */ -static Port * -ConnCreate(int serverFd) -{ - Port *port; - - if (!(port = (Port *) calloc(1, sizeof(Port)))) - { - ereport(LOG, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("out of memory"))); - ExitPostmaster(1); - } - - if (StreamConnection(serverFd, port) != STATUS_OK) - { - if (port->sock != PGINVALID_SOCKET) - StreamClose(port->sock); - ConnFree(port); - return NULL; - } - - return port; -} - - -/* - * ConnFree -- free a local connection data structure - * - * Caller has already closed the socket if any, so there's not much - * to do here. - */ -static void -ConnFree(Port *port) -{ - free(port); -} - - /* * ClosePostmasterPorts -- close all the postmaster's open sockets * @@ -2573,8 +1956,6 @@ ConnFree(Port *port) void ClosePostmasterPorts(bool am_syslogger) { - int i; - /* Release resources held by the postmaster's WaitEventSet. */ if (pm_wait_set) { @@ -2601,15 +1982,23 @@ ClosePostmasterPorts(bool am_syslogger) /* * Close the postmaster's listen sockets. These aren't tracked by fd.c, * so we don't call ReleaseExternalFD() here. + * + * The listen sockets are marked as FD_CLOEXEC, so this isn't needed in + * EXEC_BACKEND mode. */ - for (i = 0; i < MAXLISTEN; i++) +#ifndef EXEC_BACKEND + if (ListenSockets) { - if (ListenSocket[i] != PGINVALID_SOCKET) + for (int i = 0; i < NumListenSockets; i++) { - StreamClose(ListenSocket[i]); - ListenSocket[i] = PGINVALID_SOCKET; + if (closesocket(ListenSockets[i]) != 0) + elog(LOG, "could not close listen socket: %m"); } + pfree(ListenSockets); } + NumListenSockets = 0; + ListenSockets = NULL; +#endif /* * If using syslogger, close the read side of the pipe. We don't bother @@ -2637,14 +2026,13 @@ ClosePostmasterPorts(bool am_syslogger) /* - * InitProcessGlobals -- set MyProcPid, MyStartTime[stamp], random seeds + * InitProcessGlobals -- set MyStartTime[stamp], random seeds * * Called early in the postmaster and every backend. */ void InitProcessGlobals(void) { - MyProcPid = getpid(); MyStartTimestamp = GetCurrentTimestamp(); MyStartTime = timestamptz_to_time_t(MyStartTimestamp); @@ -2687,12 +2075,8 @@ InitProcessGlobals(void) static void handle_pm_pmsignal_signal(SIGNAL_ARGS) { - int save_errno = errno; - pending_pm_pmsignal = true; SetLatch(MyLatch); - - errno = save_errno; } /* @@ -2701,12 +2085,8 @@ handle_pm_pmsignal_signal(SIGNAL_ARGS) static void handle_pm_reload_request_signal(SIGNAL_ARGS) { - int save_errno = errno; - pending_pm_reload_request = true; SetLatch(MyLatch); - - errno = save_errno; } /* @@ -2736,12 +2116,16 @@ process_pm_reload_request(void) signal_child(WalWriterPID, SIGHUP); if (WalReceiverPID != 0) signal_child(WalReceiverPID, SIGHUP); + if (WalSummarizerPID != 0) + signal_child(WalSummarizerPID, SIGHUP); if (AutoVacPID != 0) signal_child(AutoVacPID, SIGHUP); if (PgArchPID != 0) signal_child(PgArchPID, SIGHUP); if (SysLoggerPID != 0) signal_child(SysLoggerPID, SIGHUP); + if (SlotSyncWorkerPID != 0) + signal_child(SlotSyncWorkerPID, SIGHUP); /* Reload authentication config files too */ if (!load_hba()) @@ -2784,8 +2168,6 @@ process_pm_reload_request(void) static void handle_pm_shutdown_request_signal(SIGNAL_ARGS) { - int save_errno = errno; - switch (postgres_signal_arg) { case SIGTERM: @@ -2802,8 +2184,6 @@ handle_pm_shutdown_request_signal(SIGNAL_ARGS) break; } SetLatch(MyLatch); - - errno = save_errno; } /* @@ -2963,12 +2343,8 @@ process_pm_shutdown_request(void) static void handle_pm_child_exit_signal(SIGNAL_ARGS) { - int save_errno = errno; - pending_pm_child_exit = true; SetLatch(MyLatch); - - errno = save_errno; } /* @@ -3084,20 +2460,22 @@ process_pm_child_exit(void) * if this fails, we'll just try again later. */ if (CheckpointerPID == 0) - CheckpointerPID = StartCheckpointer(); + CheckpointerPID = StartChildProcess(B_CHECKPOINTER); if (BgWriterPID == 0) - BgWriterPID = StartBackgroundWriter(); + BgWriterPID = StartChildProcess(B_BG_WRITER); if (WalWriterPID == 0) - WalWriterPID = StartWalWriter(); + WalWriterPID = StartChildProcess(B_WAL_WRITER); + MaybeStartWalSummarizer(); /* * Likewise, start other special children as needed. In a restart * situation, some of them may be alive already. */ if (!IsBinaryUpgrade && AutoVacuumingActive() && AutoVacPID == 0) - AutoVacPID = StartAutoVacLauncher(); + AutoVacPID = StartChildProcess(B_AUTOVAC_LAUNCHER); if (PgArchStartupAllowed() && PgArchPID == 0) - PgArchPID = StartArchiver(); + PgArchPID = StartChildProcess(B_ARCHIVER); + MaybeStartSlotSyncWorker(); /* workers may be scheduled to start now */ maybe_start_bgworkers(); @@ -3207,6 +2585,20 @@ process_pm_child_exit(void) continue; } + /* + * Was it the wal summarizer? Normal exit can be ignored; we'll start + * a new one at the next iteration of the postmaster's main loop, if + * necessary. Any other exit condition is treated as a crash. + */ + if (pid == WalSummarizerPID) + { + WalSummarizerPID = 0; + if (!EXIT_STATUS_0(exitstatus)) + HandleChildCrash(pid, exitstatus, + _("WAL summarizer process")); + continue; + } + /* * Was it the autovacuum launcher? Normal exit can be ignored; we'll * start a new one at the next iteration of the postmaster's main @@ -3238,7 +2630,7 @@ process_pm_child_exit(void) HandleChildCrash(pid, exitstatus, _("archiver process")); if (PgArchStartupAllowed()) - PgArchPID = StartArchiver(); + PgArchPID = StartChildProcess(B_ARCHIVER); continue; } @@ -3254,6 +2646,22 @@ process_pm_child_exit(void) continue; } + /* + * Was it the slot sync worker? Normal exit or FATAL exit can be + * ignored (FATAL can be caused by libpqwalreceiver on receiving + * shutdown request by the startup process during promotion); we'll + * start a new one at the next iteration of the postmaster's main + * loop, if necessary. Any other exit condition is treated as a crash. + */ + if (pid == SlotSyncWorkerPID) + { + SlotSyncWorkerPID = 0; + if (!EXIT_STATUS_0(exitstatus) && !EXIT_STATUS_1(exitstatus)) + HandleChildCrash(pid, exitstatus, + _("slot sync worker process")); + continue; + } + /* Was it one of our background workers? */ if (CleanupBackgroundWorker(pid, exitstatus)) { @@ -3357,7 +2765,7 @@ CleanupBackgroundWorker(int pid, */ if (rw->rw_backend->bgworker_notify) BackgroundWorkerStopNotifications(rw->rw_pid); - free(rw->rw_backend); + pfree(rw->rw_backend); rw->rw_backend = NULL; rw->rw_pid = 0; rw->rw_child_slot = 0; @@ -3450,7 +2858,7 @@ CleanupBackend(int pid, BackgroundWorkerStopNotifications(bp->pid); } dlist_delete(iter.cur); - free(bp); + pfree(bp); break; } } @@ -3458,7 +2866,7 @@ CleanupBackend(int pid, /* * HandleChildCrash -- cleanup after failed backend, bgwriter, checkpointer, - * walwriter, autovacuum, archiver or background worker. + * walwriter, autovacuum, archiver, slot sync worker, or background worker. * * The objectives here are to clean up our local state about the child * process, and to signal all other remaining children to quickdie. @@ -3506,7 +2914,7 @@ HandleChildCrash(int pid, int exitstatus, const char *procname) #ifdef EXEC_BACKEND ShmemBackendArrayRemove(rw->rw_backend); #endif - free(rw->rw_backend); + pfree(rw->rw_backend); rw->rw_backend = NULL; rw->rw_pid = 0; rw->rw_child_slot = 0; @@ -3543,7 +2951,7 @@ HandleChildCrash(int pid, int exitstatus, const char *procname) #endif } dlist_delete(iter.cur); - free(bp); + pfree(bp); /* Keep looping so we can signal remaining backends */ } else @@ -3602,6 +3010,12 @@ HandleChildCrash(int pid, int exitstatus, const char *procname) else if (WalReceiverPID != 0 && take_action) sigquit_child(WalReceiverPID); + /* Take care of the walsummarizer too */ + if (pid == WalSummarizerPID) + WalSummarizerPID = 0; + else if (WalSummarizerPID != 0 && take_action) + sigquit_child(WalSummarizerPID); + /* Take care of the autovacuum launcher too */ if (pid == AutoVacPID) AutoVacPID = 0; @@ -3614,6 +3028,12 @@ HandleChildCrash(int pid, int exitstatus, const char *procname) else if (PgArchPID != 0 && take_action) sigquit_child(PgArchPID); + /* Take care of the slot sync worker too */ + if (pid == SlotSyncWorkerPID) + SlotSyncWorkerPID = 0; + else if (SlotSyncWorkerPID != 0 && take_action) + sigquit_child(SlotSyncWorkerPID); + /* We do NOT restart the syslogger */ if (Shutdown != ImmediateShutdown) @@ -3752,6 +3172,10 @@ PostmasterStateMachine(void) signal_child(StartupPID, SIGTERM); if (WalReceiverPID != 0) signal_child(WalReceiverPID, SIGTERM); + if (WalSummarizerPID != 0) + signal_child(WalSummarizerPID, SIGTERM); + if (SlotSyncWorkerPID != 0) + signal_child(SlotSyncWorkerPID, SIGTERM); /* checkpointer, archiver, stats, and syslogger may continue for now */ /* Now transition to PM_WAIT_BACKENDS state to wait for them to die */ @@ -3767,22 +3191,24 @@ PostmasterStateMachine(void) /* * PM_WAIT_BACKENDS state ends when we have no regular backends * (including autovac workers), no bgworkers (including unconnected - * ones), and no walwriter, autovac launcher or bgwriter. If we are - * doing crash recovery or an immediate shutdown then we expect the - * checkpointer to exit as well, otherwise not. The stats and - * syslogger processes are disregarded since they are not connected to - * shared memory; we also disregard dead_end children here. Walsenders - * and archiver are also disregarded, they will be terminated later - * after writing the checkpoint record. + * ones), and no walwriter, autovac launcher, bgwriter or slot sync + * worker. If we are doing crash recovery or an immediate shutdown + * then we expect the checkpointer to exit as well, otherwise not. The + * stats and syslogger processes are disregarded since they are not + * connected to shared memory; we also disregard dead_end children + * here. Walsenders and archiver are also disregarded, they will be + * terminated later after writing the checkpoint record. */ if (CountChildren(BACKEND_TYPE_ALL - BACKEND_TYPE_WALSND) == 0 && StartupPID == 0 && WalReceiverPID == 0 && + WalSummarizerPID == 0 && BgWriterPID == 0 && (CheckpointerPID == 0 || (!FatalError && Shutdown < ImmediateShutdown)) && WalWriterPID == 0 && - AutoVacPID == 0) + AutoVacPID == 0 && + SlotSyncWorkerPID == 0) { if (Shutdown >= ImmediateShutdown || FatalError) { @@ -3808,7 +3234,7 @@ PostmasterStateMachine(void) Assert(Shutdown > NoShutdown); /* Start the checkpointer if not running */ if (CheckpointerPID == 0) - CheckpointerPID = StartCheckpointer(); + CheckpointerPID = StartChildProcess(B_CHECKPOINTER); /* And tell it to shut down */ if (CheckpointerPID != 0) { @@ -3875,10 +3301,12 @@ PostmasterStateMachine(void) /* These other guys should be dead already */ Assert(StartupPID == 0); Assert(WalReceiverPID == 0); + Assert(WalSummarizerPID == 0); Assert(BgWriterPID == 0); Assert(CheckpointerPID == 0); Assert(WalWriterPID == 0); Assert(AutoVacPID == 0); + Assert(SlotSyncWorkerPID == 0); /* syslogger is not considered here */ pmState = PM_NO_CHILDREN; } @@ -3932,14 +3360,14 @@ PostmasterStateMachine(void) if (!restart_after_crash) { ereport(LOG, - (errmsg("shutting down because restart_after_crash is off"))); + (errmsg("shutting down because \"restart_after_crash\" is off"))); ExitPostmaster(1); } } /* * If we need to recover from a crash, wait for all non-syslogger children - * to exit, then reset shmem and StartupDataBase. + * to exit, then reset shmem and start the startup process. */ if (FatalError && pmState == PM_NO_CHILDREN) { @@ -3961,7 +3389,7 @@ PostmasterStateMachine(void) /* re-create shared memory and semaphores */ CreateSharedMemoryAndSemaphores(); - StartupPID = StartupDataBase(); + StartupPID = StartChildProcess(B_STARTUP); Assert(StartupPID != 0); StartupStatus = STARTUP_RUNNING; pmState = PM_STARTUP; @@ -4096,10 +3524,14 @@ TerminateChildren(int signal) signal_child(WalWriterPID, signal); if (WalReceiverPID != 0) signal_child(WalReceiverPID, signal); + if (WalSummarizerPID != 0) + signal_child(WalSummarizerPID, signal); if (AutoVacPID != 0) signal_child(AutoVacPID, signal); if (PgArchPID != 0) signal_child(PgArchPID, signal); + if (SlotSyncWorkerPID != 0) + signal_child(SlotSyncWorkerPID, signal); } /* @@ -4110,16 +3542,17 @@ TerminateChildren(int signal) * Note: if you change this code, also consider StartAutovacuumWorker. */ static int -BackendStartup(Port *port) +BackendStartup(ClientSocket *client_sock) { Backend *bn; /* for backend cleanup */ pid_t pid; + BackendStartupData startup_data; /* * Create backend data structure. Better before the fork() so we can * handle failure cleanly. */ - bn = (Backend *) malloc(sizeof(Backend)); + bn = (Backend *) palloc_extended(sizeof(Backend), MCXT_ALLOC_NO_OOM); if (!bn) { ereport(LOG, @@ -4135,18 +3568,17 @@ BackendStartup(Port *port) */ if (!RandomCancelKey(&MyCancelKey)) { - free(bn); + pfree(bn); ereport(LOG, (errcode(ERRCODE_INTERNAL_ERROR), errmsg("could not generate random cancel key"))); return STATUS_ERROR; } - bn->cancel_key = MyCancelKey; - /* Pass down canAcceptConnections state */ - port->canAcceptConnections = canAcceptConnections(BACKEND_TYPE_NORMAL); - bn->dead_end = (port->canAcceptConnections != CAC_OK); + startup_data.canAcceptConnections = canAcceptConnections(BACKEND_TYPE_NORMAL); + bn->dead_end = (startup_data.canAcceptConnections != CAC_OK); + bn->cancel_key = MyCancelKey; /* * Unless it's a dead_end child, assign it a child slot number @@ -4159,37 +3591,9 @@ BackendStartup(Port *port) /* Hasn't asked to be notified about any bgworkers yet */ bn->bgworker_notify = false; -#ifdef EXEC_BACKEND - pid = backend_forkexec(port); -#else /* !EXEC_BACKEND */ - pid = fork_process(); - if (pid == 0) /* child */ - { - free(bn); - - /* Detangle from postmaster */ - InitPostmasterChild(); - - /* Close the postmaster's sockets */ - ClosePostmasterPorts(false); - - /* Perform additional initialization and collect startup packet */ - BackendInitialize(port); - - /* - * Create a per-backend PGPROC struct in shared memory. We must do - * this before we can use LWLocks. In the !EXEC_BACKEND case (here) - * this could be delayed a bit further, but EXEC_BACKEND needs to do - * stuff with LWLocks before PostgresMain(), so we do it here as well - * for symmetry. - */ - InitProcess(); - - /* And run the backend */ - BackendRun(port); - } -#endif /* EXEC_BACKEND */ - + pid = postmaster_child_launch(B_BACKEND, + (char *) &startup_data, sizeof(startup_data), + client_sock); if (pid < 0) { /* in parent, fork failed */ @@ -4197,18 +3601,18 @@ BackendStartup(Port *port) if (!bn->dead_end) (void) ReleasePostmasterChildSlot(bn->child_slot); - free(bn); + pfree(bn); errno = save_errno; ereport(LOG, (errmsg("could not fork new process for connection: %m"))); - report_fork_failure_to_client(port, save_errno); + report_fork_failure_to_client(client_sock, save_errno); return STATUS_ERROR; } /* in parent, successful fork */ ereport(DEBUG2, (errmsg_internal("forked new backend, pid=%d socket=%d", - (int) pid, (int) port->sock))); + (int) pid, (int) client_sock->sock))); /* * Everything's been successful, it's safe to add this backend to our list @@ -4235,7 +3639,7 @@ BackendStartup(Port *port) * it's not up and running. */ static void -report_fork_failure_to_client(Port *port, int errnum) +report_fork_failure_to_client(ClientSocket *client_sock, int errnum) { char buffer[1000]; int rc; @@ -4246,950 +3650,173 @@ report_fork_failure_to_client(Port *port, int errnum) strerror(errnum)); /* Set port to non-blocking. Don't do send() if this fails */ - if (!pg_set_noblock(port->sock)) + if (!pg_set_noblock(client_sock->sock)) return; /* We'll retry after EINTR, but ignore all other failures */ do { - rc = send(port->sock, buffer, strlen(buffer) + 1, 0); + rc = send(client_sock->sock, buffer, strlen(buffer) + 1, 0); } while (rc < 0 && errno == EINTR); } - /* - * BackendInitialize -- initialize an interactive (postmaster-child) - * backend process, and collect the client's startup packet. - * - * returns: nothing. Will not return at all if there's any failure. + * ExitPostmaster -- cleanup * - * Note: this code does not depend on having any access to shared memory. - * Indeed, our approach to SIGTERM/timeout handling *requires* that - * shared memory not have been touched yet; see comments within. - * In the EXEC_BACKEND case, we are physically attached to shared memory - * but have not yet set up most of our local pointers to shmem structures. + * Do NOT call exit() directly --- always go through here! */ static void -BackendInitialize(Port *port) +ExitPostmaster(int status) { - int status; - int ret; - char remote_host[NI_MAXHOST]; - char remote_port[NI_MAXSERV]; - StringInfoData ps_data; - - /* Save port etc. for ps status */ - MyProcPort = port; - - /* Tell fd.c about the long-lived FD associated with the port */ - ReserveExternalFD(); - - /* - * PreAuthDelay is a debugging aid for investigating problems in the - * authentication cycle: it can be set in postgresql.conf to allow time to - * attach to the newly-forked backend with a debugger. (See also - * PostAuthDelay, which we allow clients to pass through PGOPTIONS, but it - * is not honored until after authentication.) - */ - if (PreAuthDelay > 0) - pg_usleep(PreAuthDelay * 1000000L); - - /* This flag will remain set until InitPostgres finishes authentication */ - ClientAuthInProgress = true; /* limit visibility of log messages */ - - /* set these to empty in case they are needed before we set them up */ - port->remote_host = ""; - port->remote_port = ""; - - /* - * Initialize libpq and enable reporting of ereport errors to the client. - * Must do this now because authentication uses libpq to send messages. - */ - pq_init(); /* initialize libpq to talk to client */ - whereToSendOutput = DestRemote; /* now safe to ereport to client */ - - /* - * We arrange to do _exit(1) if we receive SIGTERM or timeout while trying - * to collect the startup packet; while SIGQUIT results in _exit(2). - * Otherwise the postmaster cannot shutdown the database FAST or IMMED - * cleanly if a buggy client fails to send the packet promptly. - * - * Exiting with _exit(1) is only possible because we have not yet touched - * shared memory; therefore no outside-the-process state needs to get - * cleaned up. - */ - pqsignal(SIGTERM, process_startup_packet_die); - /* SIGQUIT handler was already set up by InitPostmasterChild */ - InitializeTimeouts(); /* establishes SIGALRM handler */ - sigprocmask(SIG_SETMASK, &StartupBlockSig, NULL); - - /* - * Get the remote host name and port for logging and status display. - */ - remote_host[0] = '\0'; - remote_port[0] = '\0'; - if ((ret = pg_getnameinfo_all(&port->raddr.addr, port->raddr.salen, - remote_host, sizeof(remote_host), - remote_port, sizeof(remote_port), - (log_hostname ? 0 : NI_NUMERICHOST) | NI_NUMERICSERV)) != 0) - ereport(WARNING, - (errmsg_internal("pg_getnameinfo_all() failed: %s", - gai_strerror(ret)))); +#ifdef HAVE_PTHREAD_IS_THREADED_NP /* - * Save remote_host and remote_port in port structure (after this, they - * will appear in log_line_prefix data for log messages). + * There is no known cause for a postmaster to become multithreaded after + * startup. However, we might reach here via an error exit before + * reaching the test in PostmasterMain, so provide the same hint as there. + * This message uses LOG level, because an unclean shutdown at this point + * would usually not look much different from a clean shutdown. */ - port->remote_host = strdup(remote_host); - port->remote_port = strdup(remote_port); - - /* And now we can issue the Log_connections message, if wanted */ - if (Log_connections) - { - if (remote_port[0]) - ereport(LOG, - (errmsg("connection received: host=%s port=%s", - remote_host, - remote_port))); - else - ereport(LOG, - (errmsg("connection received: host=%s", - remote_host))); - } + if (pthread_is_threaded_np() != 0) + ereport(LOG, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("postmaster became multithreaded"), + errhint("Set the LC_ALL environment variable to a valid locale."))); +#endif - /* - * If we did a reverse lookup to name, we might as well save the results - * rather than possibly repeating the lookup during authentication. - * - * Note that we don't want to specify NI_NAMEREQD above, because then we'd - * get nothing useful for a client without an rDNS entry. Therefore, we - * must check whether we got a numeric IPv4 or IPv6 address, and not save - * it into remote_hostname if so. (This test is conservative and might - * sometimes classify a hostname as numeric, but an error in that - * direction is safe; it only results in a possible extra lookup.) - */ - if (log_hostname && - ret == 0 && - strspn(remote_host, "0123456789.") < strlen(remote_host) && - strspn(remote_host, "0123456789ABCDEFabcdef:") < strlen(remote_host)) - port->remote_hostname = strdup(remote_host); + /* should cleanup shared memory and kill all backends */ /* - * Ready to begin client interaction. We will give up and _exit(1) after - * a time delay, so that a broken client can't hog a connection - * indefinitely. PreAuthDelay and any DNS interactions above don't count - * against the time limit. - * - * Note: AuthenticationTimeout is applied here while waiting for the - * startup packet, and then again in InitPostgres for the duration of any - * authentication operations. So a hostile client could tie up the - * process for nearly twice AuthenticationTimeout before we kick him off. + * Not sure of the semantics here. When the Postmaster dies, should the + * backends all be killed? probably not. * - * Note: because PostgresMain will call InitializeTimeouts again, the - * registration of STARTUP_PACKET_TIMEOUT will be lost. This is okay - * since we never use it again after this function. - */ - RegisterTimeout(STARTUP_PACKET_TIMEOUT, StartupPacketTimeoutHandler); - enable_timeout_after(STARTUP_PACKET_TIMEOUT, AuthenticationTimeout * 1000); - - /* - * Receive the startup packet (which might turn out to be a cancel request - * packet). - */ - status = ProcessStartupPacket(port, false, false); - - /* - * Disable the timeout, and prevent SIGTERM again. - */ - disable_timeout(STARTUP_PACKET_TIMEOUT, false); - sigprocmask(SIG_SETMASK, &BlockSig, NULL); - - /* - * As a safety check that nothing in startup has yet performed - * shared-memory modifications that would need to be undone if we had - * exited through SIGTERM or timeout above, check that no on_shmem_exit - * handlers have been registered yet. (This isn't terribly bulletproof, - * since someone might misuse an on_proc_exit handler for shmem cleanup, - * but it's a cheap and helpful check. We cannot disallow on_proc_exit - * handlers unfortunately, since pq_init() already registered one.) - */ - check_on_shmem_exit_lists_are_empty(); - - /* - * Stop here if it was bad or a cancel packet. ProcessStartupPacket - * already did any appropriate error reporting. + * MUST -- vadim 05-10-1999 */ - if (status != STATUS_OK) - proc_exit(0); - /* - * Now that we have the user and database name, we can set the process - * title for ps. It's good to do this as early as possible in startup. - */ - initStringInfo(&ps_data); - if (am_walsender) - appendStringInfo(&ps_data, "%s ", GetBackendTypeDesc(B_WAL_SENDER)); - appendStringInfo(&ps_data, "%s ", port->user_name); - if (port->database_name[0] != '\0') - appendStringInfo(&ps_data, "%s ", port->database_name); - appendStringInfoString(&ps_data, port->remote_host); - if (port->remote_port[0] != '\0') - appendStringInfo(&ps_data, "(%s)", port->remote_port); - - init_ps_display(ps_data.data); - pfree(ps_data.data); - - set_ps_display("initializing"); + proc_exit(status); } - /* - * BackendRun -- set up the backend's argument list and invoke PostgresMain() - * - * returns: - * Doesn't return at all. + * Handle pmsignal conditions representing requests from backends, + * and check for promote and logrotate requests from pg_ctl. */ static void -BackendRun(Port *port) -{ - /* - * Make sure we aren't in PostmasterContext anymore. (We can't delete it - * just yet, though, because InitPostgres will need the HBA data.) - */ - MemoryContextSwitchTo(TopMemoryContext); - - PostgresMain(port->database_name, port->user_name); -} - - -#ifdef EXEC_BACKEND - -/* - * postmaster_forkexec -- fork and exec a postmaster subprocess - * - * The caller must have set up the argv array already, except for argv[2] - * which will be filled with the name of the temp variable file. - * - * Returns the child process PID, or -1 on fork failure (a suitable error - * message has been logged on failure). - * - * All uses of this routine will dispatch to SubPostmasterMain in the - * child process. - */ -pid_t -postmaster_forkexec(int argc, char *argv[]) -{ - Port port; - - /* This entry point passes dummy values for the Port variables */ - memset(&port, 0, sizeof(port)); - return internal_forkexec(argc, argv, &port); -} - -/* - * backend_forkexec -- fork/exec off a backend process - * - * Some operating systems (WIN32) don't have fork() so we have to simulate - * it by storing parameters that need to be passed to the child and - * then create a new child process. - * - * returns the pid of the fork/exec'd process, or -1 on failure - */ -static pid_t -backend_forkexec(Port *port) -{ - char *av[4]; - int ac = 0; - - av[ac++] = "postgres"; - av[ac++] = "--forkbackend"; - av[ac++] = NULL; /* filled in by internal_forkexec */ - - av[ac] = NULL; - Assert(ac < lengthof(av)); - - return internal_forkexec(ac, av, port); -} - -#ifndef WIN32 - -/* - * internal_forkexec non-win32 implementation - * - * - writes out backend variables to the parameter file - * - fork():s, and then exec():s the child process - */ -static pid_t -internal_forkexec(int argc, char *argv[], Port *port) +process_pm_pmsignal(void) { - static unsigned long tmpBackendFileNum = 0; - pid_t pid; - char tmpfilename[MAXPGPATH]; - BackendParameters param; - FILE *fp; - - if (!save_backend_variables(¶m, port)) - return -1; /* log made by save_backend_variables */ + pending_pm_pmsignal = false; - /* Calculate name for temp file */ - snprintf(tmpfilename, MAXPGPATH, "%s/%s.backend_var.%d.%lu", - PG_TEMP_FILES_DIR, PG_TEMP_FILE_PREFIX, - MyProcPid, ++tmpBackendFileNum); + ereport(DEBUG2, + (errmsg_internal("postmaster received pmsignal signal"))); - /* Open file */ - fp = AllocateFile(tmpfilename, PG_BINARY_W); - if (!fp) + /* + * RECOVERY_STARTED and BEGIN_HOT_STANDBY signals are ignored in + * unexpected states. If the startup process quickly starts up, completes + * recovery, exits, we might process the death of the startup process + * first. We don't want to go back to recovery in that case. + */ + if (CheckPostmasterSignal(PMSIGNAL_RECOVERY_STARTED) && + pmState == PM_STARTUP && Shutdown == NoShutdown) { + /* WAL redo has started. We're out of reinitialization. */ + FatalError = false; + AbortStartTime = 0; + /* - * As in OpenTemporaryFileInTablespace, try to make the temp-file - * directory, ignoring errors. + * Start the archiver if we're responsible for (re-)archiving received + * files. */ - (void) MakePGDirectory(PG_TEMP_FILES_DIR); + Assert(PgArchPID == 0); + if (XLogArchivingAlways()) + PgArchPID = StartChildProcess(B_ARCHIVER); - fp = AllocateFile(tmpfilename, PG_BINARY_W); - if (!fp) + /* + * If we aren't planning to enter hot standby mode later, treat + * RECOVERY_STARTED as meaning we're out of startup, and report status + * accordingly. + */ + if (!EnableHotStandby) { - ereport(LOG, - (errcode_for_file_access(), - errmsg("could not create file \"%s\": %m", - tmpfilename))); - return -1; + AddToDataDirLockFile(LOCK_FILE_LINE_PM_STATUS, PM_STATUS_STANDBY); +#ifdef USE_SYSTEMD + sd_notify(0, "READY=1"); +#endif } + + pmState = PM_RECOVERY; } - if (fwrite(¶m, sizeof(param), 1, fp) != 1) + if (CheckPostmasterSignal(PMSIGNAL_BEGIN_HOT_STANDBY) && + pmState == PM_RECOVERY && Shutdown == NoShutdown) { ereport(LOG, - (errcode_for_file_access(), - errmsg("could not write to file \"%s\": %m", tmpfilename))); - FreeFile(fp); - return -1; + (errmsg("database system is ready to accept read-only connections"))); + + /* Report status */ + AddToDataDirLockFile(LOCK_FILE_LINE_PM_STATUS, PM_STATUS_READY); +#ifdef USE_SYSTEMD + sd_notify(0, "READY=1"); +#endif + + pmState = PM_HOT_STANDBY; + connsAllowed = true; + + /* Some workers may be scheduled to start now */ + StartWorkerNeeded = true; } - /* Release file */ - if (FreeFile(fp)) + /* Process background worker state changes. */ + if (CheckPostmasterSignal(PMSIGNAL_BACKGROUND_WORKER_CHANGE)) { - ereport(LOG, - (errcode_for_file_access(), - errmsg("could not write to file \"%s\": %m", tmpfilename))); - return -1; + /* Accept new worker requests only if not stopping. */ + BackgroundWorkerStateChange(pmState < PM_STOP_BACKENDS); + StartWorkerNeeded = true; } - /* Make sure caller set up argv properly */ - Assert(argc >= 3); - Assert(argv[argc] == NULL); - Assert(strncmp(argv[1], "--fork", 6) == 0); - Assert(argv[2] == NULL); - - /* Insert temp file name after --fork argument */ - argv[2] = tmpfilename; + if (StartWorkerNeeded || HaveCrashedWorker) + maybe_start_bgworkers(); - /* Fire off execv in child */ - if ((pid = fork_process()) == 0) + /* Tell syslogger to rotate logfile if requested */ + if (SysLoggerPID != 0) { - if (execv(postgres_exec_path, argv) < 0) + if (CheckLogrotateSignal()) { - ereport(LOG, - (errmsg("could not execute server process \"%s\": %m", - postgres_exec_path))); - /* We're already in the child process here, can't return */ - exit(1); + signal_child(SysLoggerPID, SIGUSR1); + RemoveLogrotateSignalFiles(); + } + else if (CheckPostmasterSignal(PMSIGNAL_ROTATE_LOGFILE)) + { + signal_child(SysLoggerPID, SIGUSR1); } } - return pid; /* Parent returns pid, or -1 on fork failure */ -} -#else /* WIN32 */ - -/* - * internal_forkexec win32 implementation - * - * - starts backend using CreateProcess(), in suspended state - * - writes out backend variables to the parameter file - * - during this, duplicates handles and sockets required for - * inheritance into the new process - * - resumes execution of the new process once the backend parameter - * file is complete. - */ -static pid_t -internal_forkexec(int argc, char *argv[], Port *port) -{ - int retry_count = 0; - STARTUPINFO si; - PROCESS_INFORMATION pi; - int i; - int j; - char cmdLine[MAXPGPATH * 2]; - HANDLE paramHandle; - BackendParameters *param; - SECURITY_ATTRIBUTES sa; - char paramHandleStr[32]; - win32_deadchild_waitinfo *childinfo; - - /* Make sure caller set up argv properly */ - Assert(argc >= 3); - Assert(argv[argc] == NULL); - Assert(strncmp(argv[1], "--fork", 6) == 0); - Assert(argv[2] == NULL); - - /* Resume here if we need to retry */ -retry: - - /* Set up shared memory for parameter passing */ - ZeroMemory(&sa, sizeof(sa)); - sa.nLength = sizeof(sa); - sa.bInheritHandle = TRUE; - paramHandle = CreateFileMapping(INVALID_HANDLE_VALUE, - &sa, - PAGE_READWRITE, - 0, - sizeof(BackendParameters), - NULL); - if (paramHandle == INVALID_HANDLE_VALUE) + if (CheckPostmasterSignal(PMSIGNAL_START_AUTOVAC_LAUNCHER) && + Shutdown <= SmartShutdown && pmState < PM_STOP_BACKENDS) { - ereport(LOG, - (errmsg("could not create backend parameter file mapping: error code %lu", - GetLastError()))); - return -1; + /* + * Start one iteration of the autovacuum daemon, even if autovacuuming + * is nominally not enabled. This is so we can have an active defense + * against transaction ID wraparound. We set a flag for the main loop + * to do it rather than trying to do it here --- this is because the + * autovac process itself may send the signal, and we want to handle + * that by launching another iteration as soon as the current one + * completes. + */ + start_autovac_launcher = true; } - param = MapViewOfFile(paramHandle, FILE_MAP_WRITE, 0, 0, sizeof(BackendParameters)); - if (!param) + if (CheckPostmasterSignal(PMSIGNAL_START_AUTOVAC_WORKER) && + Shutdown <= SmartShutdown && pmState < PM_STOP_BACKENDS) { - ereport(LOG, - (errmsg("could not map backend parameter memory: error code %lu", - GetLastError()))); - CloseHandle(paramHandle); - return -1; + /* The autovacuum launcher wants us to start a worker process. */ + StartAutovacuumWorker(); } - /* Insert temp file name after --fork argument */ -#ifdef _WIN64 - sprintf(paramHandleStr, "%llu", (LONG_PTR) paramHandle); -#else - sprintf(paramHandleStr, "%lu", (DWORD) paramHandle); -#endif - argv[2] = paramHandleStr; - - /* Format the cmd line */ - cmdLine[sizeof(cmdLine) - 1] = '\0'; - cmdLine[sizeof(cmdLine) - 2] = '\0'; - snprintf(cmdLine, sizeof(cmdLine) - 1, "\"%s\"", postgres_exec_path); - i = 0; - while (argv[++i] != NULL) + if (CheckPostmasterSignal(PMSIGNAL_START_WALRECEIVER)) { - j = strlen(cmdLine); - snprintf(cmdLine + j, sizeof(cmdLine) - 1 - j, " \"%s\"", argv[i]); - } - if (cmdLine[sizeof(cmdLine) - 2] != '\0') - { - ereport(LOG, - (errmsg("subprocess command line too long"))); - UnmapViewOfFile(param); - CloseHandle(paramHandle); - return -1; - } - - memset(&pi, 0, sizeof(pi)); - memset(&si, 0, sizeof(si)); - si.cb = sizeof(si); - - /* - * Create the subprocess in a suspended state. This will be resumed later, - * once we have written out the parameter file. - */ - if (!CreateProcess(NULL, cmdLine, NULL, NULL, TRUE, CREATE_SUSPENDED, - NULL, NULL, &si, &pi)) - { - ereport(LOG, - (errmsg("CreateProcess() call failed: %m (error code %lu)", - GetLastError()))); - UnmapViewOfFile(param); - CloseHandle(paramHandle); - return -1; - } - - if (!save_backend_variables(param, port, pi.hProcess, pi.dwProcessId)) - { - /* - * log made by save_backend_variables, but we have to clean up the - * mess with the half-started process - */ - if (!TerminateProcess(pi.hProcess, 255)) - ereport(LOG, - (errmsg_internal("could not terminate unstarted process: error code %lu", - GetLastError()))); - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - UnmapViewOfFile(param); - CloseHandle(paramHandle); - return -1; /* log made by save_backend_variables */ - } - - /* Drop the parameter shared memory that is now inherited to the backend */ - if (!UnmapViewOfFile(param)) - ereport(LOG, - (errmsg("could not unmap view of backend parameter file: error code %lu", - GetLastError()))); - if (!CloseHandle(paramHandle)) - ereport(LOG, - (errmsg("could not close handle to backend parameter file: error code %lu", - GetLastError()))); - - /* - * Reserve the memory region used by our main shared memory segment before - * we resume the child process. Normally this should succeed, but if ASLR - * is active then it might sometimes fail due to the stack or heap having - * gotten mapped into that range. In that case, just terminate the - * process and retry. - */ - if (!pgwin32_ReserveSharedMemoryRegion(pi.hProcess)) - { - /* pgwin32_ReserveSharedMemoryRegion already made a log entry */ - if (!TerminateProcess(pi.hProcess, 255)) - ereport(LOG, - (errmsg_internal("could not terminate process that failed to reserve memory: error code %lu", - GetLastError()))); - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - if (++retry_count < 100) - goto retry; - ereport(LOG, - (errmsg("giving up after too many tries to reserve shared memory"), - errhint("This might be caused by ASLR or antivirus software."))); - return -1; - } - - /* - * Now that the backend variables are written out, we start the child - * thread so it can start initializing while we set up the rest of the - * parent state. - */ - if (ResumeThread(pi.hThread) == -1) - { - if (!TerminateProcess(pi.hProcess, 255)) - { - ereport(LOG, - (errmsg_internal("could not terminate unstartable process: error code %lu", - GetLastError()))); - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - return -1; - } - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - ereport(LOG, - (errmsg_internal("could not resume thread of unstarted process: error code %lu", - GetLastError()))); - return -1; - } - - /* - * Queue a waiter to signal when this child dies. The wait will be handled - * automatically by an operating system thread pool. The memory will be - * freed by a later call to waitpid(). - */ - childinfo = palloc(sizeof(win32_deadchild_waitinfo)); - childinfo->procHandle = pi.hProcess; - childinfo->procId = pi.dwProcessId; - - if (!RegisterWaitForSingleObject(&childinfo->waitHandle, - pi.hProcess, - pgwin32_deadchild_callback, - childinfo, - INFINITE, - WT_EXECUTEONLYONCE | WT_EXECUTEINWAITTHREAD)) - ereport(FATAL, - (errmsg_internal("could not register process for wait: error code %lu", - GetLastError()))); - - /* Don't close pi.hProcess here - waitpid() needs access to it */ - - CloseHandle(pi.hThread); - - return pi.dwProcessId; -} -#endif /* WIN32 */ - - -/* - * SubPostmasterMain -- Get the fork/exec'd process into a state equivalent - * to what it would be if we'd simply forked on Unix, and then - * dispatch to the appropriate place. - * - * The first two command line arguments are expected to be "--forkFOO" - * (where FOO indicates which postmaster child we are to become), and - * the name of a variables file that we can read to load data that would - * have been inherited by fork() on Unix. Remaining arguments go to the - * subprocess FooMain() routine. - */ -void -SubPostmasterMain(int argc, char *argv[]) -{ - Port port; - - /* In EXEC_BACKEND case we will not have inherited these settings */ - IsPostmasterEnvironment = true; - whereToSendOutput = DestNone; - - /* Setup essential subsystems (to ensure elog() behaves sanely) */ - InitializeGUCOptions(); - - /* Check we got appropriate args */ - if (argc < 3) - elog(FATAL, "invalid subpostmaster invocation"); - - /* Read in the variables file */ - memset(&port, 0, sizeof(Port)); - read_backend_variables(argv[2], &port); - - /* Close the postmaster's sockets (as soon as we know them) */ - ClosePostmasterPorts(strcmp(argv[1], "--forklog") == 0); - - /* Setup as postmaster child */ - InitPostmasterChild(); - - /* - * If appropriate, physically re-attach to shared memory segment. We want - * to do this before going any further to ensure that we can attach at the - * same address the postmaster used. On the other hand, if we choose not - * to re-attach, we may have other cleanup to do. - * - * If testing EXEC_BACKEND on Linux, you should run this as root before - * starting the postmaster: - * - * sysctl -w kernel.randomize_va_space=0 - * - * This prevents using randomized stack and code addresses that cause the - * child process's memory map to be different from the parent's, making it - * sometimes impossible to attach to shared memory at the desired address. - * Return the setting to its old value (usually '1' or '2') when finished. - */ - if (strcmp(argv[1], "--forkbackend") == 0 || - strcmp(argv[1], "--forkavlauncher") == 0 || - strcmp(argv[1], "--forkavworker") == 0 || - strcmp(argv[1], "--forkaux") == 0 || - strncmp(argv[1], "--forkbgworker=", 15) == 0) - PGSharedMemoryReAttach(); - else - PGSharedMemoryNoReAttach(); - - /* autovacuum needs this set before calling InitProcess */ - if (strcmp(argv[1], "--forkavlauncher") == 0) - AutovacuumLauncherIAm(); - if (strcmp(argv[1], "--forkavworker") == 0) - AutovacuumWorkerIAm(); - - /* Read in remaining GUC variables */ - read_nondefault_variables(); - - /* - * Check that the data directory looks valid, which will also check the - * privileges on the data directory and update our umask and file/group - * variables for creating files later. Note: this should really be done - * before we create any files or directories. - */ - checkDataDir(); - - /* - * (re-)read control file, as it contains config. The postmaster will - * already have read this, but this process doesn't know about that. - */ - LocalProcessControlFile(false); - - /* - * Reload any libraries that were preloaded by the postmaster. Since we - * exec'd this process, those libraries didn't come along with us; but we - * should load them into all child processes to be consistent with the - * non-EXEC_BACKEND behavior. - */ - process_shared_preload_libraries(); - - /* Run backend or appropriate child */ - if (strcmp(argv[1], "--forkbackend") == 0) - { - Assert(argc == 3); /* shouldn't be any more args */ - - /* - * Need to reinitialize the SSL library in the backend, since the - * context structures contain function pointers and cannot be passed - * through the parameter file. - * - * If for some reason reload fails (maybe the user installed broken - * key files), soldier on without SSL; that's better than all - * connections becoming impossible. - * - * XXX should we do this in all child processes? For the moment it's - * enough to do it in backend children. - */ -#ifdef USE_SSL - if (EnableSSL) - { - if (secure_initialize(false) == 0) - LoadedSSL = true; - else - ereport(LOG, - (errmsg("SSL configuration could not be loaded in child process"))); - } -#endif - - /* - * Perform additional initialization and collect startup packet. - * - * We want to do this before InitProcess() for a couple of reasons: 1. - * so that we aren't eating up a PGPROC slot while waiting on the - * client. 2. so that if InitProcess() fails due to being out of - * PGPROC slots, we have already initialized libpq and are able to - * report the error to the client. - */ - BackendInitialize(&port); - - /* Restore basic shared memory pointers */ - InitShmemAccess(UsedShmemSegAddr); - - /* Need a PGPROC to run CreateSharedMemoryAndSemaphores */ - InitProcess(); - - /* Attach process to shared data structures */ - CreateSharedMemoryAndSemaphores(); - - /* And run the backend */ - BackendRun(&port); /* does not return */ - } - if (strcmp(argv[1], "--forkaux") == 0) - { - AuxProcType auxtype; - - Assert(argc == 4); - - /* Restore basic shared memory pointers */ - InitShmemAccess(UsedShmemSegAddr); - - /* Need a PGPROC to run CreateSharedMemoryAndSemaphores */ - InitAuxiliaryProcess(); - - /* Attach process to shared data structures */ - CreateSharedMemoryAndSemaphores(); - - auxtype = atoi(argv[3]); - AuxiliaryProcessMain(auxtype); /* does not return */ - } - if (strcmp(argv[1], "--forkavlauncher") == 0) - { - /* Restore basic shared memory pointers */ - InitShmemAccess(UsedShmemSegAddr); - - /* Need a PGPROC to run CreateSharedMemoryAndSemaphores */ - InitProcess(); - - /* Attach process to shared data structures */ - CreateSharedMemoryAndSemaphores(); - - AutoVacLauncherMain(argc - 2, argv + 2); /* does not return */ - } - if (strcmp(argv[1], "--forkavworker") == 0) - { - /* Restore basic shared memory pointers */ - InitShmemAccess(UsedShmemSegAddr); - - /* Need a PGPROC to run CreateSharedMemoryAndSemaphores */ - InitProcess(); - - /* Attach process to shared data structures */ - CreateSharedMemoryAndSemaphores(); - - AutoVacWorkerMain(argc - 2, argv + 2); /* does not return */ - } - if (strncmp(argv[1], "--forkbgworker=", 15) == 0) - { - int shmem_slot; - - /* do this as early as possible; in particular, before InitProcess() */ - IsBackgroundWorker = true; - - /* Restore basic shared memory pointers */ - InitShmemAccess(UsedShmemSegAddr); - - /* Need a PGPROC to run CreateSharedMemoryAndSemaphores */ - InitProcess(); - - /* Attach process to shared data structures */ - CreateSharedMemoryAndSemaphores(); - - /* Fetch MyBgworkerEntry from shared memory */ - shmem_slot = atoi(argv[1] + 15); - MyBgworkerEntry = BackgroundWorkerEntry(shmem_slot); - - StartBackgroundWorker(); - } - if (strcmp(argv[1], "--forklog") == 0) - { - /* Do not want to attach to shared memory */ - - SysLoggerMain(argc, argv); /* does not return */ - } - - abort(); /* shouldn't get here */ -} -#endif /* EXEC_BACKEND */ - - -/* - * ExitPostmaster -- cleanup - * - * Do NOT call exit() directly --- always go through here! - */ -static void -ExitPostmaster(int status) -{ -#ifdef HAVE_PTHREAD_IS_THREADED_NP - - /* - * There is no known cause for a postmaster to become multithreaded after - * startup. Recheck to account for the possibility of unknown causes. - * This message uses LOG level, because an unclean shutdown at this point - * would usually not look much different from a clean shutdown. - */ - if (pthread_is_threaded_np() != 0) - ereport(LOG, - (errcode(ERRCODE_INTERNAL_ERROR), - errmsg_internal("postmaster became multithreaded"), - errdetail("Please report this to <%s>.", PACKAGE_BUGREPORT))); -#endif - - /* should cleanup shared memory and kill all backends */ - - /* - * Not sure of the semantics here. When the Postmaster dies, should the - * backends all be killed? probably not. - * - * MUST -- vadim 05-10-1999 - */ - - proc_exit(status); -} - -/* - * Handle pmsignal conditions representing requests from backends, - * and check for promote and logrotate requests from pg_ctl. - */ -static void -process_pm_pmsignal(void) -{ - pending_pm_pmsignal = false; - - ereport(DEBUG2, - (errmsg_internal("postmaster received pmsignal signal"))); - - /* - * RECOVERY_STARTED and BEGIN_HOT_STANDBY signals are ignored in - * unexpected states. If the startup process quickly starts up, completes - * recovery, exits, we might process the death of the startup process - * first. We don't want to go back to recovery in that case. - */ - if (CheckPostmasterSignal(PMSIGNAL_RECOVERY_STARTED) && - pmState == PM_STARTUP && Shutdown == NoShutdown) - { - /* WAL redo has started. We're out of reinitialization. */ - FatalError = false; - AbortStartTime = 0; - - /* - * Start the archiver if we're responsible for (re-)archiving received - * files. - */ - Assert(PgArchPID == 0); - if (XLogArchivingAlways()) - PgArchPID = StartArchiver(); - - /* - * If we aren't planning to enter hot standby mode later, treat - * RECOVERY_STARTED as meaning we're out of startup, and report status - * accordingly. - */ - if (!EnableHotStandby) - { - AddToDataDirLockFile(LOCK_FILE_LINE_PM_STATUS, PM_STATUS_STANDBY); -#ifdef USE_SYSTEMD - sd_notify(0, "READY=1"); -#endif - } - - pmState = PM_RECOVERY; - } - - if (CheckPostmasterSignal(PMSIGNAL_BEGIN_HOT_STANDBY) && - pmState == PM_RECOVERY && Shutdown == NoShutdown) - { - ereport(LOG, - (errmsg("database system is ready to accept read-only connections"))); - - /* Report status */ - AddToDataDirLockFile(LOCK_FILE_LINE_PM_STATUS, PM_STATUS_READY); -#ifdef USE_SYSTEMD - sd_notify(0, "READY=1"); -#endif - - pmState = PM_HOT_STANDBY; - connsAllowed = true; - - /* Some workers may be scheduled to start now */ - StartWorkerNeeded = true; - } - - /* Process background worker state changes. */ - if (CheckPostmasterSignal(PMSIGNAL_BACKGROUND_WORKER_CHANGE)) - { - /* Accept new worker requests only if not stopping. */ - BackgroundWorkerStateChange(pmState < PM_STOP_BACKENDS); - StartWorkerNeeded = true; - } - - if (StartWorkerNeeded || HaveCrashedWorker) - maybe_start_bgworkers(); - - /* Tell syslogger to rotate logfile if requested */ - if (SysLoggerPID != 0) - { - if (CheckLogrotateSignal()) - { - signal_child(SysLoggerPID, SIGUSR1); - RemoveLogrotateSignalFiles(); - } - else if (CheckPostmasterSignal(PMSIGNAL_ROTATE_LOGFILE)) - { - signal_child(SysLoggerPID, SIGUSR1); - } - } - - if (CheckPostmasterSignal(PMSIGNAL_START_AUTOVAC_LAUNCHER) && - Shutdown <= SmartShutdown && pmState < PM_STOP_BACKENDS) - { - /* - * Start one iteration of the autovacuum daemon, even if autovacuuming - * is nominally not enabled. This is so we can have an active defense - * against transaction ID wraparound. We set a flag for the main loop - * to do it rather than trying to do it here --- this is because the - * autovac process itself may send the signal, and we want to handle - * that by launching another iteration as soon as the current one - * completes. - */ - start_autovac_launcher = true; - } - - if (CheckPostmasterSignal(PMSIGNAL_START_AUTOVAC_WORKER) && - Shutdown <= SmartShutdown && pmState < PM_STOP_BACKENDS) - { - /* The autovacuum launcher wants us to start a worker process. */ - StartAutovacuumWorker(); - } - - if (CheckPostmasterSignal(PMSIGNAL_START_WALRECEIVER)) - { - /* Startup Process wants us to start the walreceiver process. */ - /* Start immediately if possible, else remember request for later. */ - WalReceiverRequested = true; - MaybeStartWalReceiver(); + /* Startup Process wants us to start the walreceiver process. */ + /* Start immediately if possible, else remember request for later. */ + WalReceiverRequested = true; + MaybeStartWalReceiver(); } /* @@ -5222,50 +3849,20 @@ process_pm_pmsignal(void) } } -/* - * SIGTERM while processing startup packet. - * - * Running proc_exit() from a signal handler would be quite unsafe. - * However, since we have not yet touched shared memory, we can just - * pull the plug and exit without running any atexit handlers. - * - * One might be tempted to try to send a message, or log one, indicating - * why we are disconnecting. However, that would be quite unsafe in itself. - * Also, it seems undesirable to provide clues about the database's state - * to a client that has not yet completed authentication, or even sent us - * a startup packet. - */ -static void -process_startup_packet_die(SIGNAL_ARGS) -{ - _exit(1); -} - /* * Dummy signal handler * * We use this for signals that we don't actually use in the postmaster, * but we do use in backends. If we were to SIG_IGN such signals in the * postmaster, then a newly started backend might drop a signal that arrives - * before it's able to reconfigure its signal processing. (See notes in - * tcop/postgres.c.) - */ -static void -dummy_handler(SIGNAL_ARGS) -{ -} - -/* - * Timeout while processing startup packet. - * As for process_startup_packet_die(), we exit via _exit(1). + * before it's able to reconfigure its signal processing. (See notes in + * tcop/postgres.c.) */ static void -StartupPacketTimeoutHandler(void) +dummy_handler(SIGNAL_ARGS) { - _exit(1); } - /* * Generate a random cancel key. */ @@ -5326,93 +3923,22 @@ CountChildren(int target) * to start subprocess. */ static pid_t -StartChildProcess(AuxProcType type) +StartChildProcess(BackendType type) { pid_t pid; -#ifdef EXEC_BACKEND - { - char *av[10]; - int ac = 0; - char typebuf[32]; - - /* - * Set up command-line arguments for subprocess - */ - av[ac++] = "postgres"; - av[ac++] = "--forkaux"; - av[ac++] = NULL; /* filled in by postmaster_forkexec */ - - snprintf(typebuf, sizeof(typebuf), "%d", type); - av[ac++] = typebuf; - - av[ac] = NULL; - Assert(ac < lengthof(av)); - - pid = postmaster_forkexec(ac, av); - } -#else /* !EXEC_BACKEND */ - pid = fork_process(); - - if (pid == 0) /* child */ - { - InitPostmasterChild(); - - /* Close the postmaster's sockets */ - ClosePostmasterPorts(false); - - /* Release postmaster's working memory context */ - MemoryContextSwitchTo(TopMemoryContext); - MemoryContextDelete(PostmasterContext); - PostmasterContext = NULL; - - AuxiliaryProcessMain(type); /* does not return */ - } -#endif /* EXEC_BACKEND */ - + pid = postmaster_child_launch(type, NULL, 0, NULL); if (pid < 0) { /* in parent, fork failed */ - int save_errno = errno; - - errno = save_errno; - switch (type) - { - case StartupProcess: - ereport(LOG, - (errmsg("could not fork startup process: %m"))); - break; - case ArchiverProcess: - ereport(LOG, - (errmsg("could not fork archiver process: %m"))); - break; - case BgWriterProcess: - ereport(LOG, - (errmsg("could not fork background writer process: %m"))); - break; - case CheckpointerProcess: - ereport(LOG, - (errmsg("could not fork checkpointer process: %m"))); - break; - case WalWriterProcess: - ereport(LOG, - (errmsg("could not fork WAL writer process: %m"))); - break; - case WalReceiverProcess: - ereport(LOG, - (errmsg("could not fork WAL receiver process: %m"))); - break; - default: - ereport(LOG, - (errmsg("could not fork process: %m"))); - break; - } + ereport(LOG, + (errmsg("could not fork \"%s\" process: %m", PostmasterChildName(type)))); /* * fork failure is fatal during startup, but there's no need to choke * immediately if starting other child types fails. */ - if (type == StartupProcess) + if (type == B_STARTUP) ExitPostmaster(1); return 0; } @@ -5460,7 +3986,7 @@ StartAutovacuumWorker(void) return; } - bn = (Backend *) malloc(sizeof(Backend)); + bn = (Backend *) palloc_extended(sizeof(Backend), MCXT_ALLOC_NO_OOM); if (bn) { bn->cancel_key = MyCancelKey; @@ -5470,7 +3996,7 @@ StartAutovacuumWorker(void) bn->child_slot = MyPMChildSlot = AssignPostmasterChildSlot(); bn->bgworker_notify = false; - bn->pid = StartAutoVacWorker(); + bn->pid = StartChildProcess(B_AUTOVAC_WORKER); if (bn->pid > 0) { bn->bkend_type = BACKEND_TYPE_AUTOVAC; @@ -5484,10 +4010,10 @@ StartAutovacuumWorker(void) /* * fork failed, fall through to report -- actual error message was - * logged by StartAutoVacWorker + * logged by StartChildProcess */ (void) ReleasePostmasterChildSlot(bn->child_slot); - free(bn); + pfree(bn); } else ereport(LOG, @@ -5531,13 +4057,44 @@ MaybeStartWalReceiver(void) pmState == PM_HOT_STANDBY) && Shutdown <= SmartShutdown) { - WalReceiverPID = StartWalReceiver(); + WalReceiverPID = StartChildProcess(B_WAL_RECEIVER); if (WalReceiverPID != 0) WalReceiverRequested = false; /* else leave the flag set, so we'll try again later */ } } +/* + * MaybeStartWalSummarizer + * Start the WAL summarizer process, if not running and our state allows. + */ +static void +MaybeStartWalSummarizer(void) +{ + if (summarize_wal && WalSummarizerPID == 0 && + (pmState == PM_RUN || pmState == PM_HOT_STANDBY) && + Shutdown <= SmartShutdown) + WalSummarizerPID = StartChildProcess(B_WAL_SUMMARIZER); +} + + +/* + * MaybeStartSlotSyncWorker + * Start the slot sync worker, if not running and our state allows. + * + * We allow to start the slot sync worker when we are on a hot standby, + * fast or immediate shutdown is not in progress, slot sync parameters + * are configured correctly, and it is the first time of worker's launch, + * or enough time has passed since the worker was launched last. + */ +static void +MaybeStartSlotSyncWorker(void) +{ + if (SlotSyncWorkerPID == 0 && pmState == PM_HOT_STANDBY && + Shutdown <= SmartShutdown && sync_replication_slots && + ValidateSlotSyncParams(LOG) && SlotSyncWorkerCanRestart()) + SlotSyncWorkerPID = StartChildProcess(B_SLOTSYNC_WORKER); +} /* * Create the opts file @@ -5600,6 +4157,14 @@ void BackgroundWorkerInitializeConnection(const char *dbname, const char *username, uint32 flags) { BackgroundWorker *worker = MyBgworkerEntry; + bits32 init_flags = 0; /* never honor session_preload_libraries */ + + /* ignore datallowconn and ACL_CONNECT? */ + if (flags & BGWORKER_BYPASS_ALLOWCONN) + init_flags |= INIT_PG_OVERRIDE_ALLOW_CONNS; + /* ignore rolcanlogin? */ + if (flags & BGWORKER_BYPASS_ROLELOGINCHECK) + init_flags |= INIT_PG_OVERRIDE_ROLE_LOGIN; /* XXX is this the right errcode? */ if (!(worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION)) @@ -5609,8 +4174,7 @@ BackgroundWorkerInitializeConnection(const char *dbname, const char *username, u InitPostgres(dbname, InvalidOid, /* database to connect to */ username, InvalidOid, /* role to connect as */ - false, /* never honor session_preload_libraries */ - (flags & BGWORKER_BYPASS_ALLOWCONN) != 0, /* ignore datallowconn? */ + init_flags, NULL); /* no out_dbname */ /* it had better not gotten out of "init" mode yet */ @@ -5627,6 +4191,14 @@ void BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, uint32 flags) { BackgroundWorker *worker = MyBgworkerEntry; + bits32 init_flags = 0; /* never honor session_preload_libraries */ + + /* ignore datallowconn and ACL_CONNECT? */ + if (flags & BGWORKER_BYPASS_ALLOWCONN) + init_flags |= INIT_PG_OVERRIDE_ALLOW_CONNS; + /* ignore rolcanlogin? */ + if (flags & BGWORKER_BYPASS_ROLELOGINCHECK) + init_flags |= INIT_PG_OVERRIDE_ROLE_LOGIN; /* XXX is this the right errcode? */ if (!(worker->bgw_flags & BGWORKER_BACKEND_DATABASE_CONNECTION)) @@ -5636,8 +4208,7 @@ BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, uint32 flags) InitPostgres(NULL, dboid, /* database to connect to */ NULL, useroid, /* role to connect as */ - false, /* never honor session_preload_libraries */ - (flags & BGWORKER_BYPASS_ALLOWCONN) != 0, /* ignore datallowconn? */ + init_flags, NULL); /* no out_dbname */ /* it had better not gotten out of "init" mode yet */ @@ -5662,27 +4233,6 @@ BackgroundWorkerUnblockSignals(void) sigprocmask(SIG_SETMASK, &UnBlockSig, NULL); } -#ifdef EXEC_BACKEND -static pid_t -bgworker_forkexec(int shmem_slot) -{ - char *av[10]; - int ac = 0; - char forkav[MAXPGPATH]; - - snprintf(forkav, MAXPGPATH, "--forkbgworker=%d", shmem_slot); - - av[ac++] = "postgres"; - av[ac++] = forkav; - av[ac++] = NULL; /* filled in by postmaster_forkexec */ - av[ac] = NULL; - - Assert(ac < lengthof(av)); - - return postmaster_forkexec(ac, av); -} -#endif - /* * Start a new bgworker. * Starting time conditions must have been checked already. @@ -5719,65 +4269,32 @@ do_start_bgworker(RegisteredBgWorker *rw) (errmsg_internal("starting background worker process \"%s\"", rw->rw_worker.bgw_name))); -#ifdef EXEC_BACKEND - switch ((worker_pid = bgworker_forkexec(rw->rw_shmem_slot))) -#else - switch ((worker_pid = fork_process())) -#endif + worker_pid = postmaster_child_launch(B_BG_WORKER, (char *) &rw->rw_worker, sizeof(BackgroundWorker), NULL); + if (worker_pid == -1) { - case -1: - /* in postmaster, fork failed ... */ - ereport(LOG, - (errmsg("could not fork worker process: %m"))); - /* undo what assign_backendlist_entry did */ - ReleasePostmasterChildSlot(rw->rw_child_slot); - rw->rw_child_slot = 0; - free(rw->rw_backend); - rw->rw_backend = NULL; - /* mark entry as crashed, so we'll try again later */ - rw->rw_crashed_at = GetCurrentTimestamp(); - break; - -#ifndef EXEC_BACKEND - case 0: - /* in postmaster child ... */ - InitPostmasterChild(); - - /* Close the postmaster's sockets */ - ClosePostmasterPorts(false); - - /* - * Before blowing away PostmasterContext, save this bgworker's - * data where it can find it. - */ - MyBgworkerEntry = (BackgroundWorker *) - MemoryContextAlloc(TopMemoryContext, sizeof(BackgroundWorker)); - memcpy(MyBgworkerEntry, &rw->rw_worker, sizeof(BackgroundWorker)); - - /* Release postmaster's working memory context */ - MemoryContextSwitchTo(TopMemoryContext); - MemoryContextDelete(PostmasterContext); - PostmasterContext = NULL; - - StartBackgroundWorker(); + /* in postmaster, fork failed ... */ + ereport(LOG, + (errmsg("could not fork background worker process: %m"))); + /* undo what assign_backendlist_entry did */ + ReleasePostmasterChildSlot(rw->rw_child_slot); + rw->rw_child_slot = 0; + pfree(rw->rw_backend); + rw->rw_backend = NULL; + /* mark entry as crashed, so we'll try again later */ + rw->rw_crashed_at = GetCurrentTimestamp(); + return false; + } - exit(1); /* should not get here */ - break; -#endif - default: - /* in postmaster, fork successful ... */ - rw->rw_pid = worker_pid; - rw->rw_backend->pid = rw->rw_pid; - ReportBackgroundWorkerPID(rw); - /* add new worker to lists of backends */ - dlist_push_head(&BackendList, &rw->rw_backend->elem); + /* in postmaster, fork successful ... */ + rw->rw_pid = worker_pid; + rw->rw_backend->pid = rw->rw_pid; + ReportBackgroundWorkerPID(rw); + /* add new worker to lists of backends */ + dlist_push_head(&BackendList, &rw->rw_backend->elem); #ifdef EXEC_BACKEND - ShmemBackendArrayAdd(rw->rw_backend); + ShmemBackendArrayAdd(rw->rw_backend); #endif - return true; - } - - return false; + return true; } /* @@ -5840,7 +4357,7 @@ assign_backendlist_entry(RegisteredBgWorker *rw) { ereport(LOG, (errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED), - errmsg("no slot available for new worker process"))); + errmsg("no slot available for new background worker process"))); return false; } @@ -5858,7 +4375,7 @@ assign_backendlist_entry(RegisteredBgWorker *rw) return false; } - bn = malloc(sizeof(Backend)); + bn = palloc_extended(sizeof(Backend), MCXT_ALLOC_NO_OOM); if (bn == NULL) { ereport(LOG, @@ -6029,343 +4546,6 @@ PostmasterMarkPIDForWorkerNotify(int pid) #ifdef EXEC_BACKEND -/* - * The following need to be available to the save/restore_backend_variables - * functions. They are marked NON_EXEC_STATIC in their home modules. - */ -extern slock_t *ShmemLock; -extern slock_t *ProcStructLock; -extern PGPROC *AuxiliaryProcs; -extern PMSignalData *PMSignalState; -extern pg_time_t first_syslogger_file_time; - -#ifndef WIN32 -#define write_inheritable_socket(dest, src, childpid) ((*(dest) = (src)), true) -#define read_inheritable_socket(dest, src) (*(dest) = *(src)) -#else -static bool write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE child); -static bool write_inheritable_socket(InheritableSocket *dest, SOCKET src, - pid_t childPid); -static void read_inheritable_socket(SOCKET *dest, InheritableSocket *src); -#endif - - -/* Save critical backend variables into the BackendParameters struct */ -#ifndef WIN32 -static bool -save_backend_variables(BackendParameters *param, Port *port) -#else -static bool -save_backend_variables(BackendParameters *param, Port *port, - HANDLE childProcess, pid_t childPid) -#endif -{ - memcpy(¶m->port, port, sizeof(Port)); - if (!write_inheritable_socket(¶m->portsocket, port->sock, childPid)) - return false; - - strlcpy(param->DataDir, DataDir, MAXPGPATH); - - memcpy(¶m->ListenSocket, &ListenSocket, sizeof(ListenSocket)); - - param->MyCancelKey = MyCancelKey; - param->MyPMChildSlot = MyPMChildSlot; - -#ifdef WIN32 - param->ShmemProtectiveRegion = ShmemProtectiveRegion; -#endif - param->UsedShmemSegID = UsedShmemSegID; - param->UsedShmemSegAddr = UsedShmemSegAddr; - - param->ShmemLock = ShmemLock; - param->ShmemVariableCache = ShmemVariableCache; - param->ShmemBackendArray = ShmemBackendArray; - -#ifndef HAVE_SPINLOCKS - param->SpinlockSemaArray = SpinlockSemaArray; -#endif - param->NamedLWLockTrancheRequests = NamedLWLockTrancheRequests; - param->NamedLWLockTrancheArray = NamedLWLockTrancheArray; - param->MainLWLockArray = MainLWLockArray; - param->ProcStructLock = ProcStructLock; - param->ProcGlobal = ProcGlobal; - param->AuxiliaryProcs = AuxiliaryProcs; - param->PreparedXactProcs = PreparedXactProcs; - param->PMSignalState = PMSignalState; - - param->PostmasterPid = PostmasterPid; - param->PgStartTime = PgStartTime; - param->PgReloadTime = PgReloadTime; - param->first_syslogger_file_time = first_syslogger_file_time; - - param->redirection_done = redirection_done; - param->IsBinaryUpgrade = IsBinaryUpgrade; - param->query_id_enabled = query_id_enabled; - param->max_safe_fds = max_safe_fds; - - param->MaxBackends = MaxBackends; - -#ifdef WIN32 - param->PostmasterHandle = PostmasterHandle; - if (!write_duplicated_handle(¶m->initial_signal_pipe, - pgwin32_create_signal_listener(childPid), - childProcess)) - return false; -#else - memcpy(¶m->postmaster_alive_fds, &postmaster_alive_fds, - sizeof(postmaster_alive_fds)); -#endif - - memcpy(¶m->syslogPipe, &syslogPipe, sizeof(syslogPipe)); - - strlcpy(param->my_exec_path, my_exec_path, MAXPGPATH); - - strlcpy(param->pkglib_path, pkglib_path, MAXPGPATH); - - return true; -} - - -#ifdef WIN32 -/* - * Duplicate a handle for usage in a child process, and write the child - * process instance of the handle to the parameter file. - */ -static bool -write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE childProcess) -{ - HANDLE hChild = INVALID_HANDLE_VALUE; - - if (!DuplicateHandle(GetCurrentProcess(), - src, - childProcess, - &hChild, - 0, - TRUE, - DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) - { - ereport(LOG, - (errmsg_internal("could not duplicate handle to be written to backend parameter file: error code %lu", - GetLastError()))); - return false; - } - - *dest = hChild; - return true; -} - -/* - * Duplicate a socket for usage in a child process, and write the resulting - * structure to the parameter file. - * This is required because a number of LSPs (Layered Service Providers) very - * common on Windows (antivirus, firewalls, download managers etc) break - * straight socket inheritance. - */ -static bool -write_inheritable_socket(InheritableSocket *dest, SOCKET src, pid_t childpid) -{ - dest->origsocket = src; - if (src != 0 && src != PGINVALID_SOCKET) - { - /* Actual socket */ - if (WSADuplicateSocket(src, childpid, &dest->wsainfo) != 0) - { - ereport(LOG, - (errmsg("could not duplicate socket %d for use in backend: error code %d", - (int) src, WSAGetLastError()))); - return false; - } - } - return true; -} - -/* - * Read a duplicate socket structure back, and get the socket descriptor. - */ -static void -read_inheritable_socket(SOCKET *dest, InheritableSocket *src) -{ - SOCKET s; - - if (src->origsocket == PGINVALID_SOCKET || src->origsocket == 0) - { - /* Not a real socket! */ - *dest = src->origsocket; - } - else - { - /* Actual socket, so create from structure */ - s = WSASocket(FROM_PROTOCOL_INFO, - FROM_PROTOCOL_INFO, - FROM_PROTOCOL_INFO, - &src->wsainfo, - 0, - 0); - if (s == INVALID_SOCKET) - { - write_stderr("could not create inherited socket: error code %d\n", - WSAGetLastError()); - exit(1); - } - *dest = s; - - /* - * To make sure we don't get two references to the same socket, close - * the original one. (This would happen when inheritance actually - * works.. - */ - closesocket(src->origsocket); - } -} -#endif - -static void -read_backend_variables(char *id, Port *port) -{ - BackendParameters param; - -#ifndef WIN32 - /* Non-win32 implementation reads from file */ - FILE *fp; - - /* Open file */ - fp = AllocateFile(id, PG_BINARY_R); - if (!fp) - { - write_stderr("could not open backend variables file \"%s\": %s\n", - id, strerror(errno)); - exit(1); - } - - if (fread(¶m, sizeof(param), 1, fp) != 1) - { - write_stderr("could not read from backend variables file \"%s\": %s\n", - id, strerror(errno)); - exit(1); - } - - /* Release file */ - FreeFile(fp); - if (unlink(id) != 0) - { - write_stderr("could not remove file \"%s\": %s\n", - id, strerror(errno)); - exit(1); - } -#else - /* Win32 version uses mapped file */ - HANDLE paramHandle; - BackendParameters *paramp; - -#ifdef _WIN64 - paramHandle = (HANDLE) _atoi64(id); -#else - paramHandle = (HANDLE) atol(id); -#endif - paramp = MapViewOfFile(paramHandle, FILE_MAP_READ, 0, 0, 0); - if (!paramp) - { - write_stderr("could not map view of backend variables: error code %lu\n", - GetLastError()); - exit(1); - } - - memcpy(¶m, paramp, sizeof(BackendParameters)); - - if (!UnmapViewOfFile(paramp)) - { - write_stderr("could not unmap view of backend variables: error code %lu\n", - GetLastError()); - exit(1); - } - - if (!CloseHandle(paramHandle)) - { - write_stderr("could not close handle to backend parameter variables: error code %lu\n", - GetLastError()); - exit(1); - } -#endif - - restore_backend_variables(¶m, port); -} - -/* Restore critical backend variables from the BackendParameters struct */ -static void -restore_backend_variables(BackendParameters *param, Port *port) -{ - memcpy(port, ¶m->port, sizeof(Port)); - read_inheritable_socket(&port->sock, ¶m->portsocket); - - SetDataDir(param->DataDir); - - memcpy(&ListenSocket, ¶m->ListenSocket, sizeof(ListenSocket)); - - MyCancelKey = param->MyCancelKey; - MyPMChildSlot = param->MyPMChildSlot; - -#ifdef WIN32 - ShmemProtectiveRegion = param->ShmemProtectiveRegion; -#endif - UsedShmemSegID = param->UsedShmemSegID; - UsedShmemSegAddr = param->UsedShmemSegAddr; - - ShmemLock = param->ShmemLock; - ShmemVariableCache = param->ShmemVariableCache; - ShmemBackendArray = param->ShmemBackendArray; - -#ifndef HAVE_SPINLOCKS - SpinlockSemaArray = param->SpinlockSemaArray; -#endif - NamedLWLockTrancheRequests = param->NamedLWLockTrancheRequests; - NamedLWLockTrancheArray = param->NamedLWLockTrancheArray; - MainLWLockArray = param->MainLWLockArray; - ProcStructLock = param->ProcStructLock; - ProcGlobal = param->ProcGlobal; - AuxiliaryProcs = param->AuxiliaryProcs; - PreparedXactProcs = param->PreparedXactProcs; - PMSignalState = param->PMSignalState; - - PostmasterPid = param->PostmasterPid; - PgStartTime = param->PgStartTime; - PgReloadTime = param->PgReloadTime; - first_syslogger_file_time = param->first_syslogger_file_time; - - redirection_done = param->redirection_done; - IsBinaryUpgrade = param->IsBinaryUpgrade; - query_id_enabled = param->query_id_enabled; - max_safe_fds = param->max_safe_fds; - - MaxBackends = param->MaxBackends; - -#ifdef WIN32 - PostmasterHandle = param->PostmasterHandle; - pgwin32_initial_signal_pipe = param->initial_signal_pipe; -#else - memcpy(&postmaster_alive_fds, ¶m->postmaster_alive_fds, - sizeof(postmaster_alive_fds)); -#endif - - memcpy(&syslogPipe, ¶m->syslogPipe, sizeof(syslogPipe)); - - strlcpy(my_exec_path, param->my_exec_path, MAXPGPATH); - - strlcpy(pkglib_path, param->pkglib_path, MAXPGPATH); - - /* - * We need to restore fd.c's counts of externally-opened FDs; to avoid - * confusion, be sure to do this after restoring max_safe_fds. (Note: - * BackendInitialize will handle this for port->sock.) - */ -#ifndef WIN32 - if (postmaster_alive_fds[0] >= 0) - ReserveExternalFD(); - if (postmaster_alive_fds[1] >= 0) - ReserveExternalFD(); -#endif -} - - Size ShmemBackendArraySize(void) { @@ -6487,6 +4667,32 @@ pgwin32_deadchild_callback(PVOID lpParameter, BOOLEAN TimerOrWaitFired) /* Queue SIGCHLD signal. */ pg_queue_signal(SIGCHLD); } + +/* + * Queue a waiter to signal when this child dies. The wait will be handled + * automatically by an operating system thread pool. The memory and the + * process handle will be freed by a later call to waitpid(). + */ +void +pgwin32_register_deadchild_callback(HANDLE procHandle, DWORD procId) +{ + win32_deadchild_waitinfo *childinfo; + + childinfo = palloc(sizeof(win32_deadchild_waitinfo)); + childinfo->procHandle = procHandle; + childinfo->procId = procId; + + if (!RegisterWaitForSingleObject(&childinfo->waitHandle, + procHandle, + pgwin32_deadchild_callback, + childinfo, + INFINITE, + WT_EXECUTEONLYONCE | WT_EXECUTEINWAITTHREAD)) + ereport(FATAL, + (errmsg_internal("could not register process for wait: error code %lu", + GetLastError()))); +} + #endif /* WIN32 */ /* diff --git a/src/backend/postmaster/startup.c b/src/backend/postmaster/startup.c index efc2580536a66..ef6f98ebcd794 100644 --- a/src/backend/postmaster/startup.c +++ b/src/backend/postmaster/startup.c @@ -9,7 +9,7 @@ * though.) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -24,11 +24,9 @@ #include "access/xlogutils.h" #include "libpq/pqsignal.h" #include "miscadmin.h" -#include "pgstat.h" -#include "postmaster/interrupt.h" +#include "postmaster/auxprocess.h" #include "postmaster/startup.h" #include "storage/ipc.h" -#include "storage/latch.h" #include "storage/pmsignal.h" #include "storage/procsignal.h" #include "storage/standby.h" @@ -94,39 +92,27 @@ static void StartupProcExit(int code, Datum arg); static void StartupProcTriggerHandler(SIGNAL_ARGS) { - int save_errno = errno; - promote_signaled = true; WakeupRecovery(); - - errno = save_errno; } /* SIGHUP: set flag to re-read config file at next convenient time */ static void StartupProcSigHupHandler(SIGNAL_ARGS) { - int save_errno = errno; - got_SIGHUP = true; WakeupRecovery(); - - errno = save_errno; } /* SIGTERM: set flag to abort redo and exit */ static void StartupProcShutdownHandler(SIGNAL_ARGS) { - int save_errno = errno; - if (in_restore_command) proc_exit(1); else shutdown_requested = true; WakeupRecovery(); - - errno = save_errno; } /* @@ -227,8 +213,13 @@ StartupProcExit(int code, Datum arg) * ---------------------------------- */ void -StartupProcessMain(void) +StartupProcessMain(char *startup_data, size_t startup_data_len) { + Assert(startup_data_len == 0); + + MyBackendType = B_STARTUP; + AuxiliaryProcessMainCommon(); + /* Arrange to clean up at startup process exit */ on_shmem_exit(StartupProcExit, 0); diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c index 858a2f6b2b989..437947dbb9d66 100644 --- a/src/backend/postmaster/syslogger.c +++ b/src/backend/postmaster/syslogger.c @@ -13,7 +13,7 @@ * * Author: Andreas Pflug * - * Copyright (c) 2004-2023, PostgreSQL Global Development Group + * Copyright (c) 2004-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -39,7 +39,6 @@ #include "pgstat.h" #include "pgtime.h" #include "port/pg_bitutils.h" -#include "postmaster/fork_process.h" #include "postmaster/interrupt.h" #include "postmaster/postmaster.h" #include "postmaster/syslogger.h" @@ -50,8 +49,8 @@ #include "storage/pg_shmem.h" #include "tcop/tcopprot.h" #include "utils/guc.h" +#include "utils/memutils.h" #include "utils/ps_status.h" -#include "utils/timestamp.h" /* * We read() into a temp buffer twice as big as a chunk, so that any fragment @@ -134,10 +133,7 @@ static volatile sig_atomic_t rotation_requested = false; #ifdef EXEC_BACKEND static int syslogger_fdget(FILE *file); static FILE *syslogger_fdopen(int fd); -static pid_t syslogger_forkexec(void); -static void syslogger_parseArgs(int argc, char *argv[]); #endif -NON_EXEC_STATIC void SysLoggerMain(int argc, char *argv[]) pg_attribute_noreturn(); static void process_pipe_input(char *logbuffer, int *bytes_in_logbuffer); static void flush_pipe_input(char *logbuffer, int *bytes_in_logbuffer); static FILE *logfile_open(const char *filename, const char *mode, @@ -156,13 +152,19 @@ static void set_next_rotation_time(void); static void sigUsr1Handler(SIGNAL_ARGS); static void update_metainfo_datafile(void); +typedef struct +{ + int syslogFile; + int csvlogFile; + int jsonlogFile; +} SysloggerStartupData; /* * Main entry point for syslogger process * argc/argv parameters are valid only in EXEC_BACKEND case. */ -NON_EXEC_STATIC void -SysLoggerMain(int argc, char *argv[]) +void +SysLoggerMain(char *startup_data, size_t startup_data_len) { #ifndef WIN32 char logbuffer[READ_BUF_SIZE]; @@ -174,11 +176,37 @@ SysLoggerMain(int argc, char *argv[]) pg_time_t now; WaitEventSet *wes; - now = MyStartTime; - + /* + * Re-open the error output files that were opened by SysLogger_Start(). + * + * We expect this will always succeed, which is too optimistic, but if it + * fails there's not a lot we can do to report the problem anyway. As + * coded, we'll just crash on a null pointer dereference after failure... + */ #ifdef EXEC_BACKEND - syslogger_parseArgs(argc, argv); -#endif /* EXEC_BACKEND */ + { + SysloggerStartupData *slsdata = (SysloggerStartupData *) startup_data; + + Assert(startup_data_len == sizeof(*slsdata)); + syslogFile = syslogger_fdopen(slsdata->syslogFile); + csvlogFile = syslogger_fdopen(slsdata->csvlogFile); + jsonlogFile = syslogger_fdopen(slsdata->jsonlogFile); + } +#else + Assert(startup_data_len == 0); +#endif + + /* + * Now that we're done reading the startup data, release postmaster's + * working memory context. + */ + if (PostmasterContext) + { + MemoryContextDelete(PostmasterContext); + PostmasterContext = NULL; + } + + now = MyStartTime; MyBackendType = B_LOGGER; init_ps_display(NULL); @@ -311,7 +339,7 @@ SysLoggerMain(int argc, char *argv[]) * syslog pipe, which implies that all other backends have exited * (including the postmaster). */ - wes = CreateWaitEventSet(CurrentMemoryContext, 2); + wes = CreateWaitEventSet(NULL, 2); AddWaitEventToSet(wes, WL_LATCH_SET, PGINVALID_SOCKET, MyLatch, NULL); #ifndef WIN32 AddWaitEventToSet(wes, WL_SOCKET_READABLE, syslogPipe[0], NULL, NULL); @@ -568,6 +596,9 @@ SysLogger_Start(void) { pid_t sysloggerPid; char *filename; +#ifdef EXEC_BACKEND + SysloggerStartupData startup_data; +#endif /* EXEC_BACKEND */ if (!Logging_collector) return 0; @@ -667,112 +698,95 @@ SysLogger_Start(void) } #ifdef EXEC_BACKEND - switch ((sysloggerPid = syslogger_forkexec())) + startup_data.syslogFile = syslogger_fdget(syslogFile); + startup_data.csvlogFile = syslogger_fdget(csvlogFile); + startup_data.jsonlogFile = syslogger_fdget(jsonlogFile); + sysloggerPid = postmaster_child_launch(B_LOGGER, (char *) &startup_data, sizeof(startup_data), NULL); #else - switch ((sysloggerPid = fork_process())) -#endif - { - case -1: - ereport(LOG, - (errmsg("could not fork system logger: %m"))); - return 0; - -#ifndef EXEC_BACKEND - case 0: - /* in postmaster child ... */ - InitPostmasterChild(); - - /* Close the postmaster's sockets */ - ClosePostmasterPorts(true); - - /* Drop our connection to postmaster's shared memory, as well */ - dsm_detach_all(); - PGSharedMemoryDetach(); + sysloggerPid = postmaster_child_launch(B_LOGGER, NULL, 0, NULL); +#endif /* EXEC_BACKEND */ - /* do the work */ - SysLoggerMain(0, NULL); - break; -#endif + if (sysloggerPid == -1) + { + ereport(LOG, + (errmsg("could not fork system logger: %m"))); + return 0; + } - default: - /* success, in postmaster */ + /* success, in postmaster */ - /* now we redirect stderr, if not done already */ - if (!redirection_done) - { + /* now we redirect stderr, if not done already */ + if (!redirection_done) + { #ifdef WIN32 - int fd; + int fd; #endif - /* - * Leave a breadcrumb trail when redirecting, in case the user - * forgets that redirection is active and looks only at the - * original stderr target file. - */ - ereport(LOG, - (errmsg("redirecting log output to logging collector process"), - errhint("Future log output will appear in directory \"%s\".", - Log_directory))); + /* + * Leave a breadcrumb trail when redirecting, in case the user forgets + * that redirection is active and looks only at the original stderr + * target file. + */ + ereport(LOG, + (errmsg("redirecting log output to logging collector process"), + errhint("Future log output will appear in directory \"%s\".", + Log_directory))); #ifndef WIN32 - fflush(stdout); - if (dup2(syslogPipe[1], STDOUT_FILENO) < 0) - ereport(FATAL, - (errcode_for_file_access(), - errmsg("could not redirect stdout: %m"))); - fflush(stderr); - if (dup2(syslogPipe[1], STDERR_FILENO) < 0) - ereport(FATAL, - (errcode_for_file_access(), - errmsg("could not redirect stderr: %m"))); - /* Now we are done with the write end of the pipe. */ - close(syslogPipe[1]); - syslogPipe[1] = -1; + fflush(stdout); + if (dup2(syslogPipe[1], STDOUT_FILENO) < 0) + ereport(FATAL, + (errcode_for_file_access(), + errmsg("could not redirect stdout: %m"))); + fflush(stderr); + if (dup2(syslogPipe[1], STDERR_FILENO) < 0) + ereport(FATAL, + (errcode_for_file_access(), + errmsg("could not redirect stderr: %m"))); + /* Now we are done with the write end of the pipe. */ + close(syslogPipe[1]); + syslogPipe[1] = -1; #else - /* - * open the pipe in binary mode and make sure stderr is binary - * after it's been dup'ed into, to avoid disturbing the pipe - * chunking protocol. - */ - fflush(stderr); - fd = _open_osfhandle((intptr_t) syslogPipe[1], - _O_APPEND | _O_BINARY); - if (dup2(fd, STDERR_FILENO) < 0) - ereport(FATAL, - (errcode_for_file_access(), - errmsg("could not redirect stderr: %m"))); - close(fd); - _setmode(STDERR_FILENO, _O_BINARY); + /* + * open the pipe in binary mode and make sure stderr is binary after + * it's been dup'ed into, to avoid disturbing the pipe chunking + * protocol. + */ + fflush(stderr); + fd = _open_osfhandle((intptr_t) syslogPipe[1], + _O_APPEND | _O_BINARY); + if (dup2(fd, STDERR_FILENO) < 0) + ereport(FATAL, + (errcode_for_file_access(), + errmsg("could not redirect stderr: %m"))); + close(fd); + _setmode(STDERR_FILENO, _O_BINARY); - /* - * Now we are done with the write end of the pipe. - * CloseHandle() must not be called because the preceding - * close() closes the underlying handle. - */ - syslogPipe[1] = 0; + /* + * Now we are done with the write end of the pipe. CloseHandle() must + * not be called because the preceding close() closes the underlying + * handle. + */ + syslogPipe[1] = 0; #endif - redirection_done = true; - } - - /* postmaster will never write the file(s); close 'em */ - fclose(syslogFile); - syslogFile = NULL; - if (csvlogFile != NULL) - { - fclose(csvlogFile); - csvlogFile = NULL; - } - if (jsonlogFile != NULL) - { - fclose(jsonlogFile); - jsonlogFile = NULL; - } - return (int) sysloggerPid; + redirection_done = true; } - /* we should never reach here */ - return 0; + /* postmaster will never write the file(s); close 'em */ + fclose(syslogFile); + syslogFile = NULL; + if (csvlogFile != NULL) + { + fclose(csvlogFile); + csvlogFile = NULL; + } + if (jsonlogFile != NULL) + { + fclose(jsonlogFile); + jsonlogFile = NULL; + } + return (int) sysloggerPid; } @@ -831,69 +845,6 @@ syslogger_fdopen(int fd) return file; } - -/* - * syslogger_forkexec() - - * - * Format up the arglist for, then fork and exec, a syslogger process - */ -static pid_t -syslogger_forkexec(void) -{ - char *av[10]; - int ac = 0; - char filenobuf[32]; - char csvfilenobuf[32]; - char jsonfilenobuf[32]; - - av[ac++] = "postgres"; - av[ac++] = "--forklog"; - av[ac++] = NULL; /* filled in by postmaster_forkexec */ - - /* static variables (those not passed by write_backend_variables) */ - snprintf(filenobuf, sizeof(filenobuf), "%d", - syslogger_fdget(syslogFile)); - av[ac++] = filenobuf; - snprintf(csvfilenobuf, sizeof(csvfilenobuf), "%d", - syslogger_fdget(csvlogFile)); - av[ac++] = csvfilenobuf; - snprintf(jsonfilenobuf, sizeof(jsonfilenobuf), "%d", - syslogger_fdget(jsonlogFile)); - av[ac++] = jsonfilenobuf; - - av[ac] = NULL; - Assert(ac < lengthof(av)); - - return postmaster_forkexec(ac, av); -} - -/* - * syslogger_parseArgs() - - * - * Extract data from the arglist for exec'ed syslogger process - */ -static void -syslogger_parseArgs(int argc, char *argv[]) -{ - int fd; - - Assert(argc == 6); - argv += 3; - - /* - * Re-open the error output files that were opened by SysLogger_Start(). - * - * We expect this will always succeed, which is too optimistic, but if it - * fails there's not a lot we can do to report the problem anyway. As - * coded, we'll just crash on a null pointer dereference after failure... - */ - fd = atoi(*argv++); - syslogFile = syslogger_fdopen(fd); - fd = atoi(*argv++); - csvlogFile = syslogger_fdopen(fd); - fd = atoi(*argv++); - jsonlogFile = syslogger_fdopen(fd); -} #endif /* EXEC_BACKEND */ @@ -947,7 +898,7 @@ process_pipe_input(char *logbuffer, int *bytes_in_logbuffer) if (p.nuls[0] == '\0' && p.nuls[1] == '\0' && p.len > 0 && p.len <= PIPE_MAX_PAYLOAD && p.pid != 0 && - pg_popcount((char *) &dest_flags, 1) == 1) + pg_number_of_ones[dest_flags] == 1) { List *buffer_list; ListCell *cell; @@ -1174,7 +1125,7 @@ write_syslogger_file(const char *buffer, int count, int destination) * to our input pipe which would result in a different sort of looping. */ if (rc != count) - write_stderr("could not write to log file: %s\n", strerror(errno)); + write_stderr("could not write to log file: %m\n"); } #ifdef WIN32 @@ -1642,10 +1593,6 @@ RemoveLogrotateSignalFiles(void) static void sigUsr1Handler(SIGNAL_ARGS) { - int save_errno = errno; - rotation_requested = true; SetLatch(MyLatch); - - errno = save_errno; } diff --git a/src/backend/postmaster/walsummarizer.c b/src/backend/postmaster/walsummarizer.c new file mode 100644 index 0000000000000..c1bf4a70dd174 --- /dev/null +++ b/src/backend/postmaster/walsummarizer.c @@ -0,0 +1,1731 @@ +/*------------------------------------------------------------------------- + * + * walsummarizer.c + * + * Background process to perform WAL summarization, if it is enabled. + * It continuously scans the write-ahead log and periodically emits a + * summary file which indicates which blocks in which relation forks + * were modified by WAL records in the LSN range covered by the summary + * file. See walsummary.c and blkreftable.c for more details on the + * naming and contents of WAL summary files. + * + * If configured to do, this background process will also remove WAL + * summary files when the file timestamp is older than a configurable + * threshold (but only if the WAL has been removed first). + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/postmaster/walsummarizer.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/timeline.h" +#include "access/xlog.h" +#include "access/xlog_internal.h" +#include "access/xlogrecovery.h" +#include "access/xlogutils.h" +#include "backup/walsummary.h" +#include "catalog/storage_xlog.h" +#include "commands/dbcommands_xlog.h" +#include "common/blkreftable.h" +#include "libpq/pqsignal.h" +#include "miscadmin.h" +#include "postmaster/auxprocess.h" +#include "postmaster/interrupt.h" +#include "postmaster/walsummarizer.h" +#include "replication/walreceiver.h" +#include "storage/fd.h" +#include "storage/ipc.h" +#include "storage/latch.h" +#include "storage/lwlock.h" +#include "storage/proc.h" +#include "storage/procsignal.h" +#include "storage/shmem.h" +#include "utils/guc.h" +#include "utils/memutils.h" +#include "utils/wait_event.h" + +/* + * Data in shared memory related to WAL summarization. + */ +typedef struct +{ + /* + * These fields are protected by WALSummarizerLock. + * + * Until we've discovered what summary files already exist on disk and + * stored that information in shared memory, initialized is false and the + * other fields here contain no meaningful information. After that has + * been done, initialized is true. + * + * summarized_tli and summarized_lsn indicate the last LSN and TLI at + * which the next summary file will start. Normally, these are the LSN and + * TLI at which the last file ended; in such case, lsn_is_exact is true. + * If, however, the LSN is just an approximation, then lsn_is_exact is + * false. This can happen if, for example, there are no existing WAL + * summary files at startup. In that case, we have to derive the position + * at which to start summarizing from the WAL files that exist on disk, + * and so the LSN might point to the start of the next file even though + * that might happen to be in the middle of a WAL record. + * + * summarizer_pgprocno is the proc number of the summarizer process, if + * one is running, or else INVALID_PROC_NUMBER. + * + * pending_lsn is used by the summarizer to advertise the ending LSN of a + * record it has recently read. It shouldn't ever be less than + * summarized_lsn, but might be greater, because the summarizer buffers + * data for a range of LSNs in memory before writing out a new file. + */ + bool initialized; + TimeLineID summarized_tli; + XLogRecPtr summarized_lsn; + bool lsn_is_exact; + ProcNumber summarizer_pgprocno; + XLogRecPtr pending_lsn; + + /* + * This field handles its own synchronization. + */ + ConditionVariable summary_file_cv; +} WalSummarizerData; + +/* + * Private data for our xlogreader's page read callback. + */ +typedef struct +{ + TimeLineID tli; + bool historic; + XLogRecPtr read_upto; + bool end_of_wal; +} SummarizerReadLocalXLogPrivate; + +/* Pointer to shared memory state. */ +static WalSummarizerData *WalSummarizerCtl; + +/* + * When we reach end of WAL and need to read more, we sleep for a number of + * milliseconds that is an integer multiple of MS_PER_SLEEP_QUANTUM. This is + * the multiplier. It should vary between 1 and MAX_SLEEP_QUANTA, depending + * on system activity. See summarizer_wait_for_wal() for how we adjust this. + */ +static long sleep_quanta = 1; + +/* + * The sleep time will always be a multiple of 200ms and will not exceed + * thirty seconds (150 * 200 = 30 * 1000). Note that the timeout here needs + * to be substantially less than the maximum amount of time for which an + * incremental backup will wait for this process to catch up. Otherwise, an + * incremental backup might time out on an idle system just because we sleep + * for too long. + */ +#define MAX_SLEEP_QUANTA 150 +#define MS_PER_SLEEP_QUANTUM 200 + +/* + * This is a count of the number of pages of WAL that we've read since the + * last time we waited for more WAL to appear. + */ +static long pages_read_since_last_sleep = 0; + +/* + * Most recent RedoRecPtr value observed by MaybeRemoveOldWalSummaries. + */ +static XLogRecPtr redo_pointer_at_last_summary_removal = InvalidXLogRecPtr; + +/* + * GUC parameters + */ +bool summarize_wal = false; +int wal_summary_keep_time = 10 * HOURS_PER_DAY * MINS_PER_HOUR; + +static void WalSummarizerShutdown(int code, Datum arg); +static XLogRecPtr GetLatestLSN(TimeLineID *tli); +static void HandleWalSummarizerInterrupts(void); +static XLogRecPtr SummarizeWAL(TimeLineID tli, XLogRecPtr start_lsn, + bool exact, XLogRecPtr switch_lsn, + XLogRecPtr maximum_lsn); +static void SummarizeDbaseRecord(XLogReaderState *xlogreader, + BlockRefTable *brtab); +static void SummarizeSmgrRecord(XLogReaderState *xlogreader, + BlockRefTable *brtab); +static void SummarizeXactRecord(XLogReaderState *xlogreader, + BlockRefTable *brtab); +static bool SummarizeXlogRecord(XLogReaderState *xlogreader, + bool *new_fast_forward); +static int summarizer_read_local_xlog_page(XLogReaderState *state, + XLogRecPtr targetPagePtr, + int reqLen, + XLogRecPtr targetRecPtr, + char *cur_page); +static void summarizer_wait_for_wal(void); +static void MaybeRemoveOldWalSummaries(void); + +/* + * Amount of shared memory required for this module. + */ +Size +WalSummarizerShmemSize(void) +{ + return sizeof(WalSummarizerData); +} + +/* + * Create or attach to shared memory segment for this module. + */ +void +WalSummarizerShmemInit(void) +{ + bool found; + + WalSummarizerCtl = (WalSummarizerData *) + ShmemInitStruct("Wal Summarizer Ctl", WalSummarizerShmemSize(), + &found); + + if (!found) + { + /* + * First time through, so initialize. + * + * We're just filling in dummy values here -- the real initialization + * will happen when GetOldestUnsummarizedLSN() is called for the first + * time. + */ + WalSummarizerCtl->initialized = false; + WalSummarizerCtl->summarized_tli = 0; + WalSummarizerCtl->summarized_lsn = InvalidXLogRecPtr; + WalSummarizerCtl->lsn_is_exact = false; + WalSummarizerCtl->summarizer_pgprocno = INVALID_PROC_NUMBER; + WalSummarizerCtl->pending_lsn = InvalidXLogRecPtr; + ConditionVariableInit(&WalSummarizerCtl->summary_file_cv); + } +} + +/* + * Entry point for walsummarizer process. + */ +void +WalSummarizerMain(char *startup_data, size_t startup_data_len) +{ + sigjmp_buf local_sigjmp_buf; + MemoryContext context; + + /* + * Within this function, 'current_lsn' and 'current_tli' refer to the + * point from which the next WAL summary file should start. 'exact' is + * true if 'current_lsn' is known to be the start of a WAL record or WAL + * segment, and false if it might be in the middle of a record someplace. + * + * 'switch_lsn' and 'switch_tli', if set, are the LSN at which we need to + * switch to a new timeline and the timeline to which we need to switch. + * If not set, we either haven't figured out the answers yet or we're + * already on the latest timeline. + */ + XLogRecPtr current_lsn; + TimeLineID current_tli; + bool exact; + XLogRecPtr switch_lsn = InvalidXLogRecPtr; + TimeLineID switch_tli = 0; + + Assert(startup_data_len == 0); + + MyBackendType = B_WAL_SUMMARIZER; + AuxiliaryProcessMainCommon(); + + ereport(DEBUG1, + (errmsg_internal("WAL summarizer started"))); + + /* + * Properly accept or ignore signals the postmaster might send us + * + * We have no particular use for SIGINT at the moment, but seems + * reasonable to treat like SIGTERM. + */ + pqsignal(SIGHUP, SignalHandlerForConfigReload); + pqsignal(SIGINT, SignalHandlerForShutdownRequest); + pqsignal(SIGTERM, SignalHandlerForShutdownRequest); + /* SIGQUIT handler was already set up by InitPostmasterChild */ + pqsignal(SIGALRM, SIG_IGN); + pqsignal(SIGPIPE, SIG_IGN); + pqsignal(SIGUSR1, procsignal_sigusr1_handler); + pqsignal(SIGUSR2, SIG_IGN); /* not used */ + + /* Advertise ourselves. */ + on_shmem_exit(WalSummarizerShutdown, (Datum) 0); + LWLockAcquire(WALSummarizerLock, LW_EXCLUSIVE); + WalSummarizerCtl->summarizer_pgprocno = MyProcNumber; + LWLockRelease(WALSummarizerLock); + + /* Create and switch to a memory context that we can reset on error. */ + context = AllocSetContextCreate(TopMemoryContext, + "Wal Summarizer", + ALLOCSET_DEFAULT_SIZES); + MemoryContextSwitchTo(context); + + /* + * Reset some signals that are accepted by postmaster but not here + */ + pqsignal(SIGCHLD, SIG_DFL); + + /* + * If an exception is encountered, processing resumes here. + */ + if (sigsetjmp(local_sigjmp_buf, 1) != 0) + { + /* Since not using PG_TRY, must reset error stack by hand */ + error_context_stack = NULL; + + /* Prevent interrupts while cleaning up */ + HOLD_INTERRUPTS(); + + /* Report the error to the server log */ + EmitErrorReport(); + + /* Release resources we might have acquired. */ + LWLockReleaseAll(); + ConditionVariableCancelSleep(); + pgstat_report_wait_end(); + ReleaseAuxProcessResources(false); + AtEOXact_Files(false); + AtEOXact_HashTables(false); + + /* + * Now return to normal top-level context and clear ErrorContext for + * next time. + */ + MemoryContextSwitchTo(context); + FlushErrorState(); + + /* Flush any leaked data in the top-level context */ + MemoryContextReset(context); + + /* Now we can allow interrupts again */ + RESUME_INTERRUPTS(); + + /* + * Sleep for 10 seconds before attempting to resume operations in + * order to avoid excessive logging. + * + * Many of the likely error conditions are things that will repeat + * every time. For example, if the WAL can't be read or the summary + * can't be written, only administrator action will cure the problem. + * So a really fast retry time doesn't seem to be especially + * beneficial, and it will clutter the logs. + */ + (void) WaitLatch(MyLatch, + WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, + 10000, + WAIT_EVENT_WAL_SUMMARIZER_ERROR); + } + + /* We can now handle ereport(ERROR) */ + PG_exception_stack = &local_sigjmp_buf; + + /* + * Unblock signals (they were blocked when the postmaster forked us) + */ + sigprocmask(SIG_SETMASK, &UnBlockSig, NULL); + + /* + * Fetch information about previous progress from shared memory, and ask + * GetOldestUnsummarizedLSN to reset pending_lsn to summarized_lsn. We + * might be recovering from an error, and if so, pending_lsn might have + * advanced past summarized_lsn, but any WAL we read previously has been + * lost and will need to be reread. + * + * If we discover that WAL summarization is not enabled, just exit. + */ + current_lsn = GetOldestUnsummarizedLSN(¤t_tli, &exact); + if (XLogRecPtrIsInvalid(current_lsn)) + proc_exit(0); + + /* + * Loop forever + */ + for (;;) + { + XLogRecPtr latest_lsn; + TimeLineID latest_tli; + XLogRecPtr end_of_summary_lsn; + + /* Flush any leaked data in the top-level context */ + MemoryContextReset(context); + + /* Process any signals received recently. */ + HandleWalSummarizerInterrupts(); + + /* If it's time to remove any old WAL summaries, do that now. */ + MaybeRemoveOldWalSummaries(); + + /* Find the LSN and TLI up to which we can safely summarize. */ + latest_lsn = GetLatestLSN(&latest_tli); + + /* + * If we're summarizing a historic timeline and we haven't yet + * computed the point at which to switch to the next timeline, do that + * now. + * + * Note that if this is a standby, what was previously the current + * timeline could become historic at any time. + * + * We could try to make this more efficient by caching the results of + * readTimeLineHistory when latest_tli has not changed, but since we + * only have to do this once per timeline switch, we probably wouldn't + * save any significant amount of work in practice. + */ + if (current_tli != latest_tli && XLogRecPtrIsInvalid(switch_lsn)) + { + List *tles = readTimeLineHistory(latest_tli); + + switch_lsn = tliSwitchPoint(current_tli, tles, &switch_tli); + ereport(DEBUG1, + errmsg_internal("switch point from TLI %u to TLI %u is at %X/%X", + current_tli, switch_tli, LSN_FORMAT_ARGS(switch_lsn))); + } + + /* + * If we've reached the switch LSN, we can't summarize anything else + * on this timeline. Switch to the next timeline and go around again, + * backing up to the exact switch point if we passed it. + */ + if (!XLogRecPtrIsInvalid(switch_lsn) && current_lsn >= switch_lsn) + { + /* Restart summarization from switch point. */ + current_tli = switch_tli; + current_lsn = switch_lsn; + + /* Next timeline and switch point, if any, not yet known. */ + switch_lsn = InvalidXLogRecPtr; + switch_tli = 0; + + /* Update (really, rewind, if needed) state in shared memory. */ + LWLockAcquire(WALSummarizerLock, LW_EXCLUSIVE); + WalSummarizerCtl->summarized_lsn = current_lsn; + WalSummarizerCtl->summarized_tli = current_tli; + WalSummarizerCtl->lsn_is_exact = true; + WalSummarizerCtl->pending_lsn = current_lsn; + LWLockRelease(WALSummarizerLock); + + continue; + } + + /* Summarize WAL. */ + end_of_summary_lsn = SummarizeWAL(current_tli, + current_lsn, exact, + switch_lsn, latest_lsn); + Assert(!XLogRecPtrIsInvalid(end_of_summary_lsn)); + Assert(end_of_summary_lsn >= current_lsn); + + /* + * Update state for next loop iteration. + * + * Next summary file should start from exactly where this one ended. + */ + current_lsn = end_of_summary_lsn; + exact = true; + + /* Update state in shared memory. */ + LWLockAcquire(WALSummarizerLock, LW_EXCLUSIVE); + WalSummarizerCtl->summarized_lsn = end_of_summary_lsn; + WalSummarizerCtl->summarized_tli = current_tli; + WalSummarizerCtl->lsn_is_exact = true; + WalSummarizerCtl->pending_lsn = end_of_summary_lsn; + LWLockRelease(WALSummarizerLock); + + /* Wake up anyone waiting for more summary files to be written. */ + ConditionVariableBroadcast(&WalSummarizerCtl->summary_file_cv); + } +} + +/* + * Get information about the state of the WAL summarizer. + */ +void +GetWalSummarizerState(TimeLineID *summarized_tli, XLogRecPtr *summarized_lsn, + XLogRecPtr *pending_lsn, int *summarizer_pid) +{ + LWLockAcquire(WALSummarizerLock, LW_SHARED); + if (!WalSummarizerCtl->initialized) + { + /* + * If initialized is false, the rest of the structure contents are + * undefined. + */ + *summarized_tli = 0; + *summarized_lsn = InvalidXLogRecPtr; + *pending_lsn = InvalidXLogRecPtr; + *summarizer_pid = -1; + } + else + { + int summarizer_pgprocno = WalSummarizerCtl->summarizer_pgprocno; + + *summarized_tli = WalSummarizerCtl->summarized_tli; + *summarized_lsn = WalSummarizerCtl->summarized_lsn; + if (summarizer_pgprocno == INVALID_PROC_NUMBER) + { + /* + * If the summarizer has exited, the fact that it had processed + * beyond summarized_lsn is irrelevant now. + */ + *pending_lsn = WalSummarizerCtl->summarized_lsn; + *summarizer_pid = -1; + } + else + { + *pending_lsn = WalSummarizerCtl->pending_lsn; + + /* + * We're not fussed about inexact answers here, since they could + * become stale instantly, so we don't bother taking the lock, but + * make sure that invalid PID values are normalized to -1. + */ + *summarizer_pid = GetPGProcByNumber(summarizer_pgprocno)->pid; + if (*summarizer_pid <= 0) + *summarizer_pid = -1; + } + } + LWLockRelease(WALSummarizerLock); +} + +/* + * Get the oldest LSN in this server's timeline history that has not yet been + * summarized, and update shared memory state as appropriate. + * + * If *tli != NULL, it will be set to the TLI for the LSN that is returned. + * + * If *lsn_is_exact != NULL, it will be set to true if the returned LSN is + * necessarily the start of a WAL record and false if it's just the beginning + * of a WAL segment. + */ +XLogRecPtr +GetOldestUnsummarizedLSN(TimeLineID *tli, bool *lsn_is_exact) +{ + TimeLineID latest_tli; + int n; + List *tles; + XLogRecPtr unsummarized_lsn = InvalidXLogRecPtr; + TimeLineID unsummarized_tli = 0; + bool should_make_exact = false; + List *existing_summaries; + ListCell *lc; + bool am_wal_summarizer = AmWalSummarizerProcess(); + + /* If not summarizing WAL, do nothing. */ + if (!summarize_wal) + return InvalidXLogRecPtr; + + /* + * If we are not the WAL summarizer process, then we normally just want to + * read the values from shared memory. However, as an exception, if shared + * memory hasn't been initialized yet, then we need to do that so that we + * can read legal values and not remove any WAL too early. + */ + if (!am_wal_summarizer) + { + LWLockAcquire(WALSummarizerLock, LW_SHARED); + + if (WalSummarizerCtl->initialized) + { + unsummarized_lsn = WalSummarizerCtl->summarized_lsn; + if (tli != NULL) + *tli = WalSummarizerCtl->summarized_tli; + if (lsn_is_exact != NULL) + *lsn_is_exact = WalSummarizerCtl->lsn_is_exact; + LWLockRelease(WALSummarizerLock); + return unsummarized_lsn; + } + + LWLockRelease(WALSummarizerLock); + } + + /* + * Find the oldest timeline on which WAL still exists, and the earliest + * segment for which it exists. + * + * Note that we do this every time the WAL summarizer process restarts or + * recovers from an error, in case the contents of pg_wal have changed + * under us e.g. if some files were removed, either manually - which + * shouldn't really happen, but might - or by postgres itself, if + * summarize_wal was turned off and then back on again. + */ + (void) GetLatestLSN(&latest_tli); + tles = readTimeLineHistory(latest_tli); + for (n = list_length(tles) - 1; n >= 0; --n) + { + TimeLineHistoryEntry *tle = list_nth(tles, n); + XLogSegNo oldest_segno; + + oldest_segno = XLogGetOldestSegno(tle->tli); + if (oldest_segno != 0) + { + /* Compute oldest LSN that still exists on disk. */ + XLogSegNoOffsetToRecPtr(oldest_segno, 0, wal_segment_size, + unsummarized_lsn); + + unsummarized_tli = tle->tli; + break; + } + } + + /* + * Don't try to summarize anything older than the end LSN of the newest + * summary file that exists for this timeline. + */ + existing_summaries = + GetWalSummaries(unsummarized_tli, + InvalidXLogRecPtr, InvalidXLogRecPtr); + foreach(lc, existing_summaries) + { + WalSummaryFile *ws = lfirst(lc); + + if (ws->end_lsn > unsummarized_lsn) + { + unsummarized_lsn = ws->end_lsn; + should_make_exact = true; + } + } + + /* It really should not be possible for us to find no WAL. */ + if (unsummarized_tli == 0) + ereport(ERROR, + errcode(ERRCODE_INTERNAL_ERROR), + errmsg_internal("no WAL found on timeline %u", latest_tli)); + + /* + * If we're the WAL summarizer, we always want to store the values we just + * computed into shared memory, because those are the values we're going + * to use to drive our operation, and so they are the authoritative + * values. Otherwise, we only store values into shared memory if shared + * memory is uninitialized. Our values are not canonical in such a case, + * but it's better to have something than nothing, to guide WAL retention. + */ + LWLockAcquire(WALSummarizerLock, LW_EXCLUSIVE); + if (am_wal_summarizer || !WalSummarizerCtl->initialized) + { + WalSummarizerCtl->initialized = true; + WalSummarizerCtl->summarized_lsn = unsummarized_lsn; + WalSummarizerCtl->summarized_tli = unsummarized_tli; + WalSummarizerCtl->lsn_is_exact = should_make_exact; + WalSummarizerCtl->pending_lsn = unsummarized_lsn; + } + else + unsummarized_lsn = WalSummarizerCtl->summarized_lsn; + + /* Also return the to the caller as required. */ + if (tli != NULL) + *tli = WalSummarizerCtl->summarized_tli; + if (lsn_is_exact != NULL) + *lsn_is_exact = WalSummarizerCtl->lsn_is_exact; + LWLockRelease(WALSummarizerLock); + + return unsummarized_lsn; +} + +/* + * Attempt to set the WAL summarizer's latch. + * + * This might not work, because there's no guarantee that the WAL summarizer + * process was successfully started, and it also might have started but + * subsequently terminated. So, under normal circumstances, this will get the + * latch set, but there's no guarantee. + */ +void +SetWalSummarizerLatch(void) +{ + ProcNumber pgprocno; + + if (WalSummarizerCtl == NULL) + return; + + LWLockAcquire(WALSummarizerLock, LW_EXCLUSIVE); + pgprocno = WalSummarizerCtl->summarizer_pgprocno; + LWLockRelease(WALSummarizerLock); + + if (pgprocno != INVALID_PROC_NUMBER) + SetLatch(&ProcGlobal->allProcs[pgprocno].procLatch); +} + +/* + * Wait until WAL summarization reaches the given LSN, but time out with an + * error if the summarizer seems to be stick. + * + * Returns immediately if summarize_wal is turned off while we wait. Caller + * is expected to handle this case, if necessary. + */ +void +WaitForWalSummarization(XLogRecPtr lsn) +{ + TimestampTz initial_time, + cycle_time, + current_time; + XLogRecPtr prior_pending_lsn = InvalidXLogRecPtr; + int deadcycles = 0; + + initial_time = cycle_time = GetCurrentTimestamp(); + + while (1) + { + long timeout_in_ms = 10000; + XLogRecPtr summarized_lsn; + XLogRecPtr pending_lsn; + + CHECK_FOR_INTERRUPTS(); + + /* If WAL summarization is disabled while we're waiting, give up. */ + if (!summarize_wal) + return; + + /* + * If the LSN summarized on disk has reached the target value, stop. + */ + LWLockAcquire(WALSummarizerLock, LW_EXCLUSIVE); + summarized_lsn = WalSummarizerCtl->summarized_lsn; + pending_lsn = WalSummarizerCtl->pending_lsn; + LWLockRelease(WALSummarizerLock); + + /* If WAL summarization has progressed sufficiently, stop waiting. */ + if (summarized_lsn >= lsn) + break; + + /* Recheck current time. */ + current_time = GetCurrentTimestamp(); + + /* Have we finished the current cycle of waiting? */ + if (TimestampDifferenceMilliseconds(cycle_time, + current_time) >= timeout_in_ms) + { + long elapsed_seconds; + + /* Begin new wait cycle. */ + cycle_time = TimestampTzPlusMilliseconds(cycle_time, + timeout_in_ms); + + /* + * Keep track of the number of cycles during which there has been + * no progression of pending_lsn. If pending_lsn is not advancing, + * that means that not only are no new files appearing on disk, + * but we're not even incorporating new records into the in-memory + * state. + */ + if (pending_lsn > prior_pending_lsn) + { + prior_pending_lsn = pending_lsn; + deadcycles = 0; + } + else + ++deadcycles; + + /* + * If we've managed to wait for an entire minute without the WAL + * summarizer absorbing a single WAL record, error out; probably + * something is wrong. + * + * We could consider also erroring out if the summarizer is taking + * too long to catch up, but it's not clear what rate of progress + * would be acceptable and what would be too slow. So instead, we + * just try to error out in the case where there's no progress at + * all. That seems likely to catch a reasonable number of the + * things that can go wrong in practice (e.g. the summarizer + * process is completely hung, say because somebody hooked up a + * debugger to it or something) without giving up too quickly when + * the system is just slow. + */ + if (deadcycles >= 6) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("WAL summarization is not progressing"), + errdetail("Summarization is needed through %X/%X, but is stuck at %X/%X on disk and %X/%X in memory.", + LSN_FORMAT_ARGS(lsn), + LSN_FORMAT_ARGS(summarized_lsn), + LSN_FORMAT_ARGS(pending_lsn)))); + + + /* + * Otherwise, just let the user know what's happening. + */ + elapsed_seconds = + TimestampDifferenceMilliseconds(initial_time, + current_time) / 1000; + ereport(WARNING, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg_plural("still waiting for WAL summarization through %X/%X after %ld second", + "still waiting for WAL summarization through %X/%X after %ld seconds", + elapsed_seconds, + LSN_FORMAT_ARGS(lsn), + elapsed_seconds), + errdetail("Summarization has reached %X/%X on disk and %X/%X in memory.", + LSN_FORMAT_ARGS(summarized_lsn), + LSN_FORMAT_ARGS(pending_lsn)))); + } + + /* + * Align the wait time to prevent drift. This doesn't really matter, + * but we'd like the warnings about how long we've been waiting to say + * 10 seconds, 20 seconds, 30 seconds, 40 seconds ... without ever + * drifting to something that is not a multiple of ten. + */ + timeout_in_ms -= + TimestampDifferenceMilliseconds(cycle_time, current_time); + + /* Wait and see. */ + ConditionVariableTimedSleep(&WalSummarizerCtl->summary_file_cv, + timeout_in_ms, + WAIT_EVENT_WAL_SUMMARY_READY); + } + + ConditionVariableCancelSleep(); +} + +/* + * On exit, update shared memory to make it clear that we're no longer + * running. + */ +static void +WalSummarizerShutdown(int code, Datum arg) +{ + LWLockAcquire(WALSummarizerLock, LW_EXCLUSIVE); + WalSummarizerCtl->summarizer_pgprocno = INVALID_PROC_NUMBER; + LWLockRelease(WALSummarizerLock); +} + +/* + * Get the latest LSN that is eligible to be summarized, and set *tli to the + * corresponding timeline. + */ +static XLogRecPtr +GetLatestLSN(TimeLineID *tli) +{ + if (!RecoveryInProgress()) + { + /* Don't summarize WAL before it's flushed. */ + return GetFlushRecPtr(tli); + } + else + { + XLogRecPtr flush_lsn; + TimeLineID flush_tli; + XLogRecPtr replay_lsn; + TimeLineID replay_tli; + TimeLineID insert_tli; + + /* + * After the insert TLI has been set and before the control file has + * been updated to show the DB in production, RecoveryInProgress() + * will return true, because it's not yet safe for all backends to + * begin writing WAL. However, replay has already ceased, so from our + * point of view, recovery is already over. We should summarize up to + * where replay stopped and then prepare to resume at the start of the + * insert timeline. + */ + if ((insert_tli = GetWALInsertionTimeLineIfSet()) != 0) + { + *tli = insert_tli; + return GetXLogReplayRecPtr(NULL); + } + + /* + * What we really want to know is how much WAL has been flushed to + * disk, but the only flush position available is the one provided by + * the walreceiver, which may not be running, because this could be + * crash recovery or recovery via restore_command. So use either the + * WAL receiver's flush position or the replay position, whichever is + * further ahead, on the theory that if the WAL has been replayed then + * it must also have been flushed to disk. + */ + flush_lsn = GetWalRcvFlushRecPtr(NULL, &flush_tli); + replay_lsn = GetXLogReplayRecPtr(&replay_tli); + if (flush_lsn > replay_lsn) + { + *tli = flush_tli; + return flush_lsn; + } + else + { + *tli = replay_tli; + return replay_lsn; + } + } +} + +/* + * Interrupt handler for main loop of WAL summarizer process. + */ +static void +HandleWalSummarizerInterrupts(void) +{ + if (ProcSignalBarrierPending) + ProcessProcSignalBarrier(); + + if (ConfigReloadPending) + { + ConfigReloadPending = false; + ProcessConfigFile(PGC_SIGHUP); + } + + if (ShutdownRequestPending || !summarize_wal) + { + ereport(DEBUG1, + errmsg_internal("WAL summarizer shutting down")); + proc_exit(0); + } + + /* Perform logging of memory contexts of this process */ + if (LogMemoryContextPending) + ProcessLogMemoryContextInterrupt(); +} + +/* + * Summarize a range of WAL records on a single timeline. + * + * 'tli' is the timeline to be summarized. + * + * 'start_lsn' is the point at which we should start summarizing. If this + * value comes from the end LSN of the previous record as returned by the + * xlogreader machinery, 'exact' should be true; otherwise, 'exact' should + * be false, and this function will search forward for the start of a valid + * WAL record. + * + * 'switch_lsn' is the point at which we should switch to a later timeline, + * if we're summarizing a historic timeline. + * + * 'maximum_lsn' identifies the point beyond which we can't count on being + * able to read any more WAL. It should be the switch point when reading a + * historic timeline, or the most-recently-measured end of WAL when reading + * the current timeline. + * + * The return value is the LSN at which the WAL summary actually ends. Most + * often, a summary file ends because we notice that a checkpoint has + * occurred and reach the redo pointer of that checkpoint, but sometimes + * we stop for other reasons, such as a timeline switch. + */ +static XLogRecPtr +SummarizeWAL(TimeLineID tli, XLogRecPtr start_lsn, bool exact, + XLogRecPtr switch_lsn, XLogRecPtr maximum_lsn) +{ + SummarizerReadLocalXLogPrivate *private_data; + XLogReaderState *xlogreader; + XLogRecPtr summary_start_lsn; + XLogRecPtr summary_end_lsn = switch_lsn; + char temp_path[MAXPGPATH]; + char final_path[MAXPGPATH]; + WalSummaryIO io; + BlockRefTable *brtab = CreateEmptyBlockRefTable(); + bool fast_forward = true; + + /* Initialize private data for xlogreader. */ + private_data = (SummarizerReadLocalXLogPrivate *) + palloc0(sizeof(SummarizerReadLocalXLogPrivate)); + private_data->tli = tli; + private_data->historic = !XLogRecPtrIsInvalid(switch_lsn); + private_data->read_upto = maximum_lsn; + + /* Create xlogreader. */ + xlogreader = XLogReaderAllocate(wal_segment_size, NULL, + XL_ROUTINE(.page_read = &summarizer_read_local_xlog_page, + .segment_open = &wal_segment_open, + .segment_close = &wal_segment_close), + private_data); + if (xlogreader == NULL) + ereport(ERROR, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("out of memory"), + errdetail("Failed while allocating a WAL reading processor."))); + + /* + * When exact = false, we're starting from an arbitrary point in the WAL + * and must search forward for the start of the next record. + * + * When exact = true, start_lsn should be either the LSN where a record + * begins, or the LSN of a page where the page header is immediately + * followed by the start of a new record. XLogBeginRead should tolerate + * either case. + * + * We need to allow for both cases because the behavior of xlogreader + * varies. When a record spans two or more xlog pages, the ending LSN + * reported by xlogreader will be the starting LSN of the following + * record, but when an xlog page boundary falls between two records, the + * end LSN for the first will be reported as the first byte of the + * following page. We can't know until we read that page how large the + * header will be, but we'll have to skip over it to find the next record. + */ + if (exact) + { + /* + * Even if start_lsn is the beginning of a page rather than the + * beginning of the first record on that page, we should still use it + * as the start LSN for the summary file. That's because we detect + * missing summary files by looking for cases where the end LSN of one + * file is less than the start LSN of the next file. When only a page + * header is skipped, nothing has been missed. + */ + XLogBeginRead(xlogreader, start_lsn); + summary_start_lsn = start_lsn; + } + else + { + summary_start_lsn = XLogFindNextRecord(xlogreader, start_lsn); + if (XLogRecPtrIsInvalid(summary_start_lsn)) + { + /* + * If we hit end-of-WAL while trying to find the next valid + * record, we must be on a historic timeline that has no valid + * records that begin after start_lsn and before end of WAL. + */ + if (private_data->end_of_wal) + { + ereport(DEBUG1, + errmsg_internal("could not read WAL from timeline %u at %X/%X: end of WAL at %X/%X", + tli, + LSN_FORMAT_ARGS(start_lsn), + LSN_FORMAT_ARGS(private_data->read_upto))); + + /* + * The timeline ends at or after start_lsn, without containing + * any records. Thus, we must make sure the main loop does not + * iterate. If start_lsn is the end of the timeline, then we + * won't actually emit an empty summary file, but otherwise, + * we must, to capture the fact that the LSN range in question + * contains no interesting WAL records. + */ + summary_start_lsn = start_lsn; + summary_end_lsn = private_data->read_upto; + switch_lsn = xlogreader->EndRecPtr; + } + else + ereport(ERROR, + (errmsg("could not find a valid record after %X/%X", + LSN_FORMAT_ARGS(start_lsn)))); + } + + /* We shouldn't go backward. */ + Assert(summary_start_lsn >= start_lsn); + } + + /* + * Main loop: read xlog records one by one. + */ + while (1) + { + int block_id; + char *errormsg; + XLogRecord *record; + uint8 rmid; + + HandleWalSummarizerInterrupts(); + + /* We shouldn't go backward. */ + Assert(summary_start_lsn <= xlogreader->EndRecPtr); + + /* Now read the next record. */ + record = XLogReadRecord(xlogreader, &errormsg); + if (record == NULL) + { + if (private_data->end_of_wal) + { + /* + * This timeline must be historic and must end before we were + * able to read a complete record. + */ + ereport(DEBUG1, + errmsg_internal("could not read WAL from timeline %u at %X/%X: end of WAL at %X/%X", + tli, + LSN_FORMAT_ARGS(xlogreader->EndRecPtr), + LSN_FORMAT_ARGS(private_data->read_upto))); + /* Summary ends at end of WAL. */ + summary_end_lsn = private_data->read_upto; + break; + } + if (errormsg) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not read WAL from timeline %u at %X/%X: %s", + tli, LSN_FORMAT_ARGS(xlogreader->EndRecPtr), + errormsg))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not read WAL from timeline %u at %X/%X", + tli, LSN_FORMAT_ARGS(xlogreader->EndRecPtr)))); + } + + /* We shouldn't go backward. */ + Assert(summary_start_lsn <= xlogreader->EndRecPtr); + + if (!XLogRecPtrIsInvalid(switch_lsn) && + xlogreader->ReadRecPtr >= switch_lsn) + { + /* + * Whoops! We've read a record that *starts* after the switch LSN, + * contrary to our goal of reading only until we hit the first + * record that ends at or after the switch LSN. Pretend we didn't + * read it after all by bailing out of this loop right here, + * before we do anything with this record. + * + * This can happen because the last record before the switch LSN + * might be continued across multiple pages, and then we might + * come to a page with XLP_FIRST_IS_OVERWRITE_CONTRECORD set. In + * that case, the record that was continued across multiple pages + * is incomplete and will be disregarded, and the read will + * restart from the beginning of the page that is flagged + * XLP_FIRST_IS_OVERWRITE_CONTRECORD. + * + * If this case occurs, we can fairly say that the current summary + * file ends at the switch LSN exactly. The first record on the + * page marked XLP_FIRST_IS_OVERWRITE_CONTRECORD will be + * discovered when generating the next summary file. + */ + summary_end_lsn = switch_lsn; + break; + } + + /* + * Certain types of records require special handling. Redo points and + * shutdown checkpoints trigger creation of new summary files and can + * also cause us to enter or exit "fast forward" mode. Other types of + * records can require special updates to the block reference table. + */ + rmid = XLogRecGetRmid(xlogreader); + if (rmid == RM_XLOG_ID) + { + bool new_fast_forward; + + /* + * If we've already processed some WAL records when we hit a redo + * point or shutdown checkpoint, then we stop summarization before + * including this record in the current file, so that it will be + * the first record in the next file. + * + * When we hit one of those record types as the first record in a + * file, we adjust our notion of whether we're fast-forwarding. + * Any WAL generated with wal_level=minimal must be skipped + * without actually generating any summary file, because an + * incremental backup that crosses such WAL would be unsafe. + */ + if (SummarizeXlogRecord(xlogreader, &new_fast_forward)) + { + if (xlogreader->ReadRecPtr > summary_start_lsn) + { + summary_end_lsn = xlogreader->ReadRecPtr; + break; + } + else + fast_forward = new_fast_forward; + } + } + else if (!fast_forward) + { + /* + * This switch handles record types that require extra updates to + * the contents of the block reference table. + */ + switch (rmid) + { + case RM_DBASE_ID: + SummarizeDbaseRecord(xlogreader, brtab); + break; + case RM_SMGR_ID: + SummarizeSmgrRecord(xlogreader, brtab); + break; + case RM_XACT_ID: + SummarizeXactRecord(xlogreader, brtab); + break; + } + } + + /* + * If we're in fast-forward mode, we don't really need to do anything. + * Otherwise, feed block references from xlog record to block + * reference table. + */ + if (!fast_forward) + { + for (block_id = 0; block_id <= XLogRecMaxBlockId(xlogreader); + block_id++) + { + RelFileLocator rlocator; + ForkNumber forknum; + BlockNumber blocknum; + + if (!XLogRecGetBlockTagExtended(xlogreader, block_id, &rlocator, + &forknum, &blocknum, NULL)) + continue; + + /* + * As we do elsewhere, ignore the FSM fork, because it's not + * fully WAL-logged. + */ + if (forknum != FSM_FORKNUM) + BlockRefTableMarkBlockModified(brtab, &rlocator, forknum, + blocknum); + } + } + + /* Update our notion of where this summary file ends. */ + summary_end_lsn = xlogreader->EndRecPtr; + + /* Also update shared memory. */ + LWLockAcquire(WALSummarizerLock, LW_EXCLUSIVE); + Assert(summary_end_lsn >= WalSummarizerCtl->summarized_lsn); + WalSummarizerCtl->pending_lsn = summary_end_lsn; + LWLockRelease(WALSummarizerLock); + + /* + * If we have a switch LSN and have reached it, stop before reading + * the next record. + */ + if (!XLogRecPtrIsInvalid(switch_lsn) && + xlogreader->EndRecPtr >= switch_lsn) + break; + } + + /* Destroy xlogreader. */ + pfree(xlogreader->private_data); + XLogReaderFree(xlogreader); + + /* + * If a timeline switch occurs, we may fail to make any progress at all + * before exiting the loop above. If that happens, we don't write a WAL + * summary file at all. We can also skip writing a file if we're in + * fast-forward mode. + */ + if (summary_end_lsn > summary_start_lsn && !fast_forward) + { + /* Generate temporary and final path name. */ + snprintf(temp_path, MAXPGPATH, + XLOGDIR "/summaries/temp.summary"); + snprintf(final_path, MAXPGPATH, + XLOGDIR "/summaries/%08X%08X%08X%08X%08X.summary", + tli, + LSN_FORMAT_ARGS(summary_start_lsn), + LSN_FORMAT_ARGS(summary_end_lsn)); + + /* Open the temporary file for writing. */ + io.filepos = 0; + io.file = PathNameOpenFile(temp_path, O_WRONLY | O_CREAT | O_TRUNC); + if (io.file < 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not create file \"%s\": %m", temp_path))); + + /* Write the data. */ + WriteBlockRefTable(brtab, WriteWalSummary, &io); + + /* Close temporary file and shut down xlogreader. */ + FileClose(io.file); + + /* Tell the user what we did. */ + ereport(DEBUG1, + errmsg_internal("summarized WAL on TLI %u from %X/%X to %X/%X", + tli, + LSN_FORMAT_ARGS(summary_start_lsn), + LSN_FORMAT_ARGS(summary_end_lsn))); + + /* Durably rename the new summary into place. */ + durable_rename(temp_path, final_path, ERROR); + } + + /* If we skipped a non-zero amount of WAL, log a debug message. */ + if (summary_end_lsn > summary_start_lsn && fast_forward) + ereport(DEBUG1, + errmsg_internal("skipped summarizing WAL on TLI %u from %X/%X to %X/%X", + tli, + LSN_FORMAT_ARGS(summary_start_lsn), + LSN_FORMAT_ARGS(summary_end_lsn))); + + return summary_end_lsn; +} + +/* + * Special handling for WAL records with RM_DBASE_ID. + */ +static void +SummarizeDbaseRecord(XLogReaderState *xlogreader, BlockRefTable *brtab) +{ + uint8 info = XLogRecGetInfo(xlogreader) & ~XLR_INFO_MASK; + + /* + * We use relfilenode zero for a given database OID and tablespace OID to + * indicate that all relations with that pair of IDs have been recreated + * if they exist at all. Effectively, we're setting a limit block of 0 for + * all such relfilenodes. + * + * Technically, this special handling is only needed in the case of + * XLOG_DBASE_CREATE_FILE_COPY, because that can create a whole bunch of + * relation files in a directory without logging anything specific to each + * one. If we didn't mark the whole DB OID/TS OID combination in some way, + * then a tablespace that was dropped after the reference backup and + * recreated using the FILE_COPY method prior to the incremental backup + * would look just like one that was never touched at all, which would be + * catastrophic. + * + * But it seems best to adopt this treatment for all records that drop or + * create a DB OID/TS OID combination. That's similar to how we treat the + * limit block for individual relations, and it's an extra layer of safety + * here. We can never lose data by marking more stuff as needing to be + * backed up in full. + */ + if (info == XLOG_DBASE_CREATE_FILE_COPY) + { + xl_dbase_create_file_copy_rec *xlrec; + RelFileLocator rlocator; + + xlrec = + (xl_dbase_create_file_copy_rec *) XLogRecGetData(xlogreader); + rlocator.spcOid = xlrec->tablespace_id; + rlocator.dbOid = xlrec->db_id; + rlocator.relNumber = 0; + BlockRefTableSetLimitBlock(brtab, &rlocator, MAIN_FORKNUM, 0); + } + else if (info == XLOG_DBASE_CREATE_WAL_LOG) + { + xl_dbase_create_wal_log_rec *xlrec; + RelFileLocator rlocator; + + xlrec = (xl_dbase_create_wal_log_rec *) XLogRecGetData(xlogreader); + rlocator.spcOid = xlrec->tablespace_id; + rlocator.dbOid = xlrec->db_id; + rlocator.relNumber = 0; + BlockRefTableSetLimitBlock(brtab, &rlocator, MAIN_FORKNUM, 0); + } + else if (info == XLOG_DBASE_DROP) + { + xl_dbase_drop_rec *xlrec; + RelFileLocator rlocator; + int i; + + xlrec = (xl_dbase_drop_rec *) XLogRecGetData(xlogreader); + rlocator.dbOid = xlrec->db_id; + rlocator.relNumber = 0; + for (i = 0; i < xlrec->ntablespaces; ++i) + { + rlocator.spcOid = xlrec->tablespace_ids[i]; + BlockRefTableSetLimitBlock(brtab, &rlocator, MAIN_FORKNUM, 0); + } + } +} + +/* + * Special handling for WAL records with RM_SMGR_ID. + */ +static void +SummarizeSmgrRecord(XLogReaderState *xlogreader, BlockRefTable *brtab) +{ + uint8 info = XLogRecGetInfo(xlogreader) & ~XLR_INFO_MASK; + + if (info == XLOG_SMGR_CREATE) + { + xl_smgr_create *xlrec; + + /* + * If a new relation fork is created on disk, there is no point + * tracking anything about which blocks have been modified, because + * the whole thing will be new. Hence, set the limit block for this + * fork to 0. + * + * Ignore the FSM fork, which is not fully WAL-logged. + */ + xlrec = (xl_smgr_create *) XLogRecGetData(xlogreader); + + if (xlrec->forkNum != FSM_FORKNUM) + BlockRefTableSetLimitBlock(brtab, &xlrec->rlocator, + xlrec->forkNum, 0); + } + else if (info == XLOG_SMGR_TRUNCATE) + { + xl_smgr_truncate *xlrec; + + xlrec = (xl_smgr_truncate *) XLogRecGetData(xlogreader); + + /* + * If a relation fork is truncated on disk, there is no point in + * tracking anything about block modifications beyond the truncation + * point. + * + * We ignore SMGR_TRUNCATE_FSM here because the FSM isn't fully + * WAL-logged and thus we can't track modified blocks for it anyway. + */ + if ((xlrec->flags & SMGR_TRUNCATE_HEAP) != 0) + BlockRefTableSetLimitBlock(brtab, &xlrec->rlocator, + MAIN_FORKNUM, xlrec->blkno); + if ((xlrec->flags & SMGR_TRUNCATE_VM) != 0) + BlockRefTableSetLimitBlock(brtab, &xlrec->rlocator, + VISIBILITYMAP_FORKNUM, xlrec->blkno); + } +} + +/* + * Special handling for WAL records with RM_XACT_ID. + */ +static void +SummarizeXactRecord(XLogReaderState *xlogreader, BlockRefTable *brtab) +{ + uint8 info = XLogRecGetInfo(xlogreader) & ~XLR_INFO_MASK; + uint8 xact_info = info & XLOG_XACT_OPMASK; + + if (xact_info == XLOG_XACT_COMMIT || + xact_info == XLOG_XACT_COMMIT_PREPARED) + { + xl_xact_commit *xlrec = (xl_xact_commit *) XLogRecGetData(xlogreader); + xl_xact_parsed_commit parsed; + int i; + + /* + * Don't track modified blocks for any relations that were removed on + * commit. + */ + ParseCommitRecord(XLogRecGetInfo(xlogreader), xlrec, &parsed); + for (i = 0; i < parsed.nrels; ++i) + { + ForkNumber forknum; + + for (forknum = 0; forknum <= MAX_FORKNUM; ++forknum) + if (forknum != FSM_FORKNUM) + BlockRefTableSetLimitBlock(brtab, &parsed.xlocators[i], + forknum, 0); + } + } + else if (xact_info == XLOG_XACT_ABORT || + xact_info == XLOG_XACT_ABORT_PREPARED) + { + xl_xact_abort *xlrec = (xl_xact_abort *) XLogRecGetData(xlogreader); + xl_xact_parsed_abort parsed; + int i; + + /* + * Don't track modified blocks for any relations that were removed on + * abort. + */ + ParseAbortRecord(XLogRecGetInfo(xlogreader), xlrec, &parsed); + for (i = 0; i < parsed.nrels; ++i) + { + ForkNumber forknum; + + for (forknum = 0; forknum <= MAX_FORKNUM; ++forknum) + if (forknum != FSM_FORKNUM) + BlockRefTableSetLimitBlock(brtab, &parsed.xlocators[i], + forknum, 0); + } + } +} + +/* + * Special handling for WAL records with RM_XLOG_ID. + * + * The return value is true if WAL summarization should stop before this + * record and false otherwise. When the return value is true, + * *new_fast_forward indicates whether future processing should be done + * in fast forward mode (i.e. read WAL without emitting summaries) or not. + */ +static bool +SummarizeXlogRecord(XLogReaderState *xlogreader, bool *new_fast_forward) +{ + uint8 info = XLogRecGetInfo(xlogreader) & ~XLR_INFO_MASK; + int record_wal_level; + + if (info == XLOG_CHECKPOINT_REDO) + { + /* Payload is wal_level at the time record was written. */ + memcpy(&record_wal_level, XLogRecGetData(xlogreader), sizeof(int)); + } + else if (info == XLOG_CHECKPOINT_SHUTDOWN) + { + CheckPoint rec_ckpt; + + /* Extract wal_level at time record was written from payload. */ + memcpy(&rec_ckpt, XLogRecGetData(xlogreader), sizeof(CheckPoint)); + record_wal_level = rec_ckpt.wal_level; + } + else if (info == XLOG_PARAMETER_CHANGE) + { + xl_parameter_change xlrec; + + /* Extract wal_level at time record was written from payload. */ + memcpy(&xlrec, XLogRecGetData(xlogreader), + sizeof(xl_parameter_change)); + record_wal_level = xlrec.wal_level; + } + else if (info == XLOG_END_OF_RECOVERY) + { + xl_end_of_recovery xlrec; + + /* Extract wal_level at time record was written from payload. */ + memcpy(&xlrec, XLogRecGetData(xlogreader), sizeof(xl_end_of_recovery)); + record_wal_level = xlrec.wal_level; + } + else + { + /* No special handling required. Return false. */ + return false; + } + + /* + * Redo can only begin at an XLOG_CHECKPOINT_REDO or + * XLOG_CHECKPOINT_SHUTDOWN record, so we want WAL summarization to begin + * at those points. Hence, when those records are encountered, return + * true, so that we stop just before summarizing either of those records. + * + * We also reach here if we just saw XLOG_END_OF_RECOVERY or + * XLOG_PARAMETER_CHANGE. These are not places where recovery can start, + * but they're still relevant here. A new timeline can begin with + * XLOG_END_OF_RECOVERY, so we need to confirm the WAL level at that + * point; and a restart can provoke XLOG_PARAMETER_CHANGE after an + * intervening change to postgresql.conf, which might force us to stop + * summarizing. + */ + *new_fast_forward = (record_wal_level == WAL_LEVEL_MINIMAL); + return true; +} + +/* + * Similar to read_local_xlog_page, but limited to read from one particular + * timeline. If the end of WAL is reached, it will wait for more if reading + * from the current timeline, or give up if reading from a historic timeline. + * In the latter case, it will also set private_data->end_of_wal = true. + * + * Caller must set private_data->tli to the TLI of interest, + * private_data->read_upto to the lowest LSN that is not known to be safe + * to read on that timeline, and private_data->historic to true if and only + * if the timeline is not the current timeline. This function will update + * private_data->read_upto and private_data->historic if more WAL appears + * on the current timeline or if the current timeline becomes historic. + */ +static int +summarizer_read_local_xlog_page(XLogReaderState *state, + XLogRecPtr targetPagePtr, int reqLen, + XLogRecPtr targetRecPtr, char *cur_page) +{ + int count; + WALReadError errinfo; + SummarizerReadLocalXLogPrivate *private_data; + + HandleWalSummarizerInterrupts(); + + private_data = (SummarizerReadLocalXLogPrivate *) + state->private_data; + + while (1) + { + if (targetPagePtr + XLOG_BLCKSZ <= private_data->read_upto) + { + /* + * more than one block available; read only that block, have + * caller come back if they need more. + */ + count = XLOG_BLCKSZ; + break; + } + else if (targetPagePtr + reqLen > private_data->read_upto) + { + /* We don't seem to have enough data. */ + if (private_data->historic) + { + /* + * This is a historic timeline, so there will never be any + * more data than we have currently. + */ + private_data->end_of_wal = true; + return -1; + } + else + { + XLogRecPtr latest_lsn; + TimeLineID latest_tli; + + /* + * This is - or at least was up until very recently - the + * current timeline, so more data might show up. Delay here + * so we don't tight-loop. + */ + HandleWalSummarizerInterrupts(); + summarizer_wait_for_wal(); + + /* Recheck end-of-WAL. */ + latest_lsn = GetLatestLSN(&latest_tli); + if (private_data->tli == latest_tli) + { + /* Still the current timeline, update max LSN. */ + Assert(latest_lsn >= private_data->read_upto); + private_data->read_upto = latest_lsn; + } + else + { + List *tles = readTimeLineHistory(latest_tli); + XLogRecPtr switchpoint; + + /* + * The timeline we're scanning is no longer the latest + * one. Figure out when it ended. + */ + private_data->historic = true; + switchpoint = tliSwitchPoint(private_data->tli, tles, + NULL); + + /* + * Allow reads up to exactly the switch point. + * + * It's possible that this will cause read_upto to move + * backwards, because we might have been promoted before + * reaching the end of the previous timeline. In that + * case, the next loop iteration will likely conclude that + * we've reached end of WAL. + */ + private_data->read_upto = switchpoint; + + /* Debugging output. */ + ereport(DEBUG1, + errmsg_internal("timeline %u became historic, can read up to %X/%X", + private_data->tli, LSN_FORMAT_ARGS(private_data->read_upto))); + } + + /* Go around and try again. */ + } + } + else + { + /* enough bytes available to satisfy the request */ + count = private_data->read_upto - targetPagePtr; + break; + } + } + + if (!WALRead(state, cur_page, targetPagePtr, count, + private_data->tli, &errinfo)) + WALReadRaiseError(&errinfo); + + /* Track that we read a page, for sleep time calculation. */ + ++pages_read_since_last_sleep; + + /* number of valid bytes in the buffer */ + return count; +} + +/* + * Sleep for long enough that we believe it's likely that more WAL will + * be available afterwards. + */ +static void +summarizer_wait_for_wal(void) +{ + if (pages_read_since_last_sleep == 0) + { + /* + * No pages were read since the last sleep, so double the sleep time, + * but not beyond the maximum allowable value. + */ + sleep_quanta = Min(sleep_quanta * 2, MAX_SLEEP_QUANTA); + } + else if (pages_read_since_last_sleep > 1) + { + /* + * Multiple pages were read since the last sleep, so reduce the sleep + * time. + * + * A large burst of activity should be able to quickly reduce the + * sleep time to the minimum, but we don't want a handful of extra WAL + * records to provoke a strong reaction. We choose to reduce the sleep + * time by 1 quantum for each page read beyond the first, which is a + * fairly arbitrary way of trying to be reactive without overreacting. + */ + if (pages_read_since_last_sleep > sleep_quanta - 1) + sleep_quanta = 1; + else + sleep_quanta -= pages_read_since_last_sleep; + } + + /* OK, now sleep. */ + (void) WaitLatch(MyLatch, + WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, + sleep_quanta * MS_PER_SLEEP_QUANTUM, + WAIT_EVENT_WAL_SUMMARIZER_WAL); + ResetLatch(MyLatch); + + /* Reset count of pages read. */ + pages_read_since_last_sleep = 0; +} + +/* + * Remove WAL summaries whose mtimes are older than wal_summary_keep_time. + */ +static void +MaybeRemoveOldWalSummaries(void) +{ + XLogRecPtr redo_pointer = GetRedoRecPtr(); + List *wslist; + time_t cutoff_time; + + /* If WAL summary removal is disabled, don't do anything. */ + if (wal_summary_keep_time == 0) + return; + + /* + * If the redo pointer has not advanced, don't do anything. + * + * This has the effect that we only try to remove old WAL summary files + * once per checkpoint cycle. + */ + if (redo_pointer == redo_pointer_at_last_summary_removal) + return; + redo_pointer_at_last_summary_removal = redo_pointer; + + /* + * Files should only be removed if the last modification time precedes the + * cutoff time we compute here. + */ + cutoff_time = time(NULL) - wal_summary_keep_time * SECS_PER_MINUTE; + + /* Get all the summaries that currently exist. */ + wslist = GetWalSummaries(0, InvalidXLogRecPtr, InvalidXLogRecPtr); + + /* Loop until all summaries have been considered for removal. */ + while (wslist != NIL) + { + ListCell *lc; + XLogSegNo oldest_segno; + XLogRecPtr oldest_lsn = InvalidXLogRecPtr; + TimeLineID selected_tli; + + HandleWalSummarizerInterrupts(); + + /* + * Pick a timeline for which some summary files still exist on disk, + * and find the oldest LSN that still exists on disk for that + * timeline. + */ + selected_tli = ((WalSummaryFile *) linitial(wslist))->tli; + oldest_segno = XLogGetOldestSegno(selected_tli); + if (oldest_segno != 0) + XLogSegNoOffsetToRecPtr(oldest_segno, 0, wal_segment_size, + oldest_lsn); + + + /* Consider each WAL file on the selected timeline in turn. */ + foreach(lc, wslist) + { + WalSummaryFile *ws = lfirst(lc); + + HandleWalSummarizerInterrupts(); + + /* If it's not on this timeline, it's not time to consider it. */ + if (selected_tli != ws->tli) + continue; + + /* + * If the WAL doesn't exist any more, we can remove it if the file + * modification time is old enough. + */ + if (XLogRecPtrIsInvalid(oldest_lsn) || ws->end_lsn <= oldest_lsn) + RemoveWalSummaryIfOlderThan(ws, cutoff_time); + + /* + * Whether we removed the file or not, we need not consider it + * again. + */ + wslist = foreach_delete_current(wslist, lc); + pfree(ws); + } + } +} diff --git a/src/backend/postmaster/walwriter.c b/src/backend/postmaster/walwriter.c index 266fbc2339954..6e7918a78d478 100644 --- a/src/backend/postmaster/walwriter.c +++ b/src/backend/postmaster/walwriter.c @@ -31,7 +31,7 @@ * should be killed by SIGQUIT and then a recovery cycle started. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -48,6 +48,7 @@ #include "libpq/pqsignal.h" #include "miscadmin.h" #include "pgstat.h" +#include "postmaster/auxprocess.h" #include "postmaster/interrupt.h" #include "postmaster/walwriter.h" #include "storage/bufmgr.h" @@ -78,9 +79,6 @@ int WalWriterFlushAfter = DEFAULT_WAL_WRITER_FLUSH_AFTER; #define LOOPS_UNTIL_HIBERNATE 50 #define HIBERNATE_FACTOR 25 -/* Prototypes for private functions */ -static void HandleWalWriterInterrupts(void); - /* * Main entry point for walwriter process * @@ -88,13 +86,18 @@ static void HandleWalWriterInterrupts(void); * basic execution environment, but not enabled signals yet. */ void -WalWriterMain(void) +WalWriterMain(char *startup_data, size_t startup_data_len) { sigjmp_buf local_sigjmp_buf; MemoryContext walwriter_context; int left_till_hibernate; bool hibernating; + Assert(startup_data_len == 0); + + MyBackendType = B_WAL_WRITER; + AuxiliaryProcessMainCommon(); + /* * Properly accept or ignore signals the postmaster might send us * @@ -178,7 +181,7 @@ WalWriterMain(void) FlushErrorState(); /* Flush any leaked data in the top-level context */ - MemoryContextResetAndDeleteChildren(walwriter_context); + MemoryContextReset(walwriter_context); /* Now we can allow interrupts again */ RESUME_INTERRUPTS(); @@ -189,13 +192,6 @@ WalWriterMain(void) * fast as we can. */ pg_usleep(1000000L); - - /* - * Close all open files after any error. This is helpful on Windows, - * where holding deleted files open causes various strange errors. - * It's not clear we need it elsewhere, but shouldn't hurt. - */ - smgrcloseall(); } /* We can now handle ereport(ERROR) */ @@ -245,7 +241,7 @@ WalWriterMain(void) ResetLatch(MyLatch); /* Process any signals received recently */ - HandleWalWriterInterrupts(); + HandleMainLoopInterrupts(); /* * Do what we're here for; then, if XLogBackgroundFlush() found useful @@ -275,26 +271,3 @@ WalWriterMain(void) WAIT_EVENT_WAL_WRITER_MAIN); } } - -/* - * Interrupt handler for main loops of WAL writer process. - */ -static void -HandleWalWriterInterrupts(void) -{ - if (ProcSignalBarrierPending) - ProcessProcSignalBarrier(); - - if (ConfigReloadPending) - { - ConfigReloadPending = false; - ProcessConfigFile(PGC_SIGHUP); - } - - if (ShutdownRequestPending) - proc_exit(0); - - /* Perform logging of memory contexts of this process */ - if (LogMemoryContextPending) - ProcessLogMemoryContextInterrupt(); -} diff --git a/src/backend/regex/meson.build b/src/backend/regex/meson.build index 05077b255a2cf..1f7dcfb7a8ffa 100644 --- a/src/backend/regex/meson.build +++ b/src/backend/regex/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'regcomp.c', diff --git a/src/backend/regex/regc_color.c b/src/backend/regex/regc_color.c index 30bda0e5ad0ff..8ae788f519561 100644 --- a/src/backend/regex/regc_color.c +++ b/src/backend/regex/regc_color.c @@ -1075,9 +1075,19 @@ colorcomplement(struct nfa *nfa, assert(of != from); - /* A RAINBOW arc matches all colors, making the complement empty */ + /* + * A RAINBOW arc matches all colors, making the complement empty. But we + * can't just return without making any arcs, because that would leave the + * NFA disconnected which would break any future delsub(). Instead, make + * a CANTMATCH arc. Also set the HASCANTMATCH flag so we know we need to + * clean that up at the start of NFA optimization. + */ if (findarc(of, PLAIN, RAINBOW) != NULL) + { + newarc(nfa, CANTMATCH, 0, from, to); + nfa->flags |= HASCANTMATCH; return; + } /* Otherwise, transiently mark the colors that appear in of's out-arcs */ for (a = of->outs; a != NULL; a = a->outchain) @@ -1089,6 +1099,12 @@ colorcomplement(struct nfa *nfa, assert(!UNUSEDCOLOR(cd)); cd->flags |= COLMARK; } + + /* + * There's no syntax for re-complementing a color set, so we cannot + * see CANTMATCH arcs here. + */ + assert(a->type != CANTMATCH); } /* Scan colors, clear transient marks, add arcs for unmarked colors */ diff --git a/src/backend/regex/regc_nfa.c b/src/backend/regex/regc_nfa.c index f1819a24f6d32..acd2286defd50 100644 --- a/src/backend/regex/regc_nfa.c +++ b/src/backend/regex/regc_nfa.c @@ -1462,6 +1462,7 @@ removetraverse(struct nfa *nfa, { case PLAIN: case EMPTY: + case CANTMATCH: /* nothing to do */ break; case AHEAD: @@ -1599,6 +1600,12 @@ optimize(struct nfa *nfa, if (verbose) fprintf(f, "\ninitial cleanup:\n"); #endif + /* If we have any CANTMATCH arcs, drop them; but this is uncommon */ + if (nfa->flags & HASCANTMATCH) + { + removecantmatch(nfa); + nfa->flags &= ~HASCANTMATCH; + } cleanup(nfa); /* may simplify situation */ #ifdef REG_DEBUG if (verbose) @@ -2922,6 +2929,34 @@ clonesuccessorstates(struct nfa *nfa, } } +/* + * removecantmatch - remove CANTMATCH arcs, which are no longer useful + * once we are done with the parsing phase. (We need them only to + * preserve connectedness of NFA subgraphs during parsing.) + */ +static void +removecantmatch(struct nfa *nfa) +{ + struct state *s; + + for (s = nfa->states; s != NULL; s = s->next) + { + struct arc *a; + struct arc *nexta; + + for (a = s->outs; a != NULL; a = nexta) + { + nexta = a->outchain; + if (a->type == CANTMATCH) + { + freearc(nfa, a); + if (NISERR()) + return; + } + } + } +} + /* * cleanup - clean up NFA after optimizations */ @@ -3627,6 +3662,8 @@ dumpnfa(struct nfa *nfa, fprintf(f, ", eol [%ld]", (long) nfa->eos[1]); if (nfa->flags & HASLACONS) fprintf(f, ", haslacons"); + if (nfa->flags & HASCANTMATCH) + fprintf(f, ", hascantmatch"); if (nfa->flags & MATCHALL) { fprintf(f, ", minmatchall %d", nfa->minmatchall); @@ -3749,6 +3786,9 @@ dumparc(struct arc *a, break; case EMPTY: break; + case CANTMATCH: + fprintf(f, "X"); + break; default: fprintf(f, "0x%x/0%lo", a->type, (long) a->co); break; diff --git a/src/backend/regex/regc_pg_locale.c b/src/backend/regex/regc_pg_locale.c index 00ce735fdd871..85f3238eb071a 100644 --- a/src/backend/regex/regc_pg_locale.c +++ b/src/backend/regex/regc_pg_locale.c @@ -6,7 +6,7 @@ * * This file is #included by regcomp.c; it's not meant to compile standalone. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -16,6 +16,8 @@ */ #include "catalog/pg_collation.h" +#include "common/unicode_case.h" +#include "common/unicode_category.h" #include "utils/pg_locale.h" /* @@ -44,8 +46,7 @@ * the platform's wchar_t representation matches what we do in pg_wchar * conversions. * - * 3. Other collations are only supported on platforms that HAVE_LOCALE_T. - * Here, we use the locale_t-extended forms of the and + * 3. Here, we use the locale_t-extended forms of the and * functions, under exactly the same cases as #2. * * There is one notable difference between cases 2 and 3: in the "default" @@ -65,11 +66,12 @@ typedef enum { PG_REGEX_LOCALE_C, /* C locale (encoding independent) */ + PG_REGEX_BUILTIN, /* built-in Unicode semantics */ PG_REGEX_LOCALE_WIDE, /* Use functions */ PG_REGEX_LOCALE_1BYTE, /* Use functions */ PG_REGEX_LOCALE_WIDE_L, /* Use locale_t functions */ PG_REGEX_LOCALE_1BYTE_L, /* Use locale_t functions */ - PG_REGEX_LOCALE_ICU /* Use ICU uchar.h functions */ + PG_REGEX_LOCALE_ICU, /* Use ICU uchar.h functions */ } PG_Locale_Strategy; static PG_Locale_Strategy pg_regex_strategy; @@ -252,11 +254,6 @@ pg_set_regex_collation(Oid collation) } else { - /* - * NB: pg_newlocale_from_collation will fail if not HAVE_LOCALE_T; the - * case of pg_regex_locale != 0 but not HAVE_LOCALE_T does not have to - * be considered below. - */ pg_regex_locale = pg_newlocale_from_collation(collation); if (!pg_locale_deterministic(pg_regex_locale)) @@ -272,7 +269,12 @@ pg_set_regex_collation(Oid collation) if (GetDatabaseEncoding() == PG_UTF8) { if (pg_regex_locale) - pg_regex_strategy = PG_REGEX_LOCALE_WIDE_L; + { + if (pg_regex_locale->provider == COLLPROVIDER_BUILTIN) + pg_regex_strategy = PG_REGEX_BUILTIN; + else + pg_regex_strategy = PG_REGEX_LOCALE_WIDE_L; + } else pg_regex_strategy = PG_REGEX_LOCALE_WIDE; } @@ -296,6 +298,8 @@ pg_wc_isdigit(pg_wchar c) case PG_REGEX_LOCALE_C: return (c <= (pg_wchar) 127 && (pg_char_properties[c] & PG_ISDIGIT)); + case PG_REGEX_BUILTIN: + return pg_u_isdigit(c, true); case PG_REGEX_LOCALE_WIDE: if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswdigit((wint_t) c); @@ -304,16 +308,12 @@ pg_wc_isdigit(pg_wchar c) return (c <= (pg_wchar) UCHAR_MAX && isdigit((unsigned char) c)); case PG_REGEX_LOCALE_WIDE_L: -#ifdef HAVE_LOCALE_T if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswdigit_l((wint_t) c, pg_regex_locale->info.lt); -#endif /* FALL THRU */ case PG_REGEX_LOCALE_1BYTE_L: -#ifdef HAVE_LOCALE_T return (c <= (pg_wchar) UCHAR_MAX && isdigit_l((unsigned char) c, pg_regex_locale->info.lt)); -#endif break; case PG_REGEX_LOCALE_ICU: #ifdef USE_ICU @@ -332,6 +332,8 @@ pg_wc_isalpha(pg_wchar c) case PG_REGEX_LOCALE_C: return (c <= (pg_wchar) 127 && (pg_char_properties[c] & PG_ISALPHA)); + case PG_REGEX_BUILTIN: + return pg_u_isalpha(c); case PG_REGEX_LOCALE_WIDE: if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswalpha((wint_t) c); @@ -340,16 +342,12 @@ pg_wc_isalpha(pg_wchar c) return (c <= (pg_wchar) UCHAR_MAX && isalpha((unsigned char) c)); case PG_REGEX_LOCALE_WIDE_L: -#ifdef HAVE_LOCALE_T if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswalpha_l((wint_t) c, pg_regex_locale->info.lt); -#endif /* FALL THRU */ case PG_REGEX_LOCALE_1BYTE_L: -#ifdef HAVE_LOCALE_T return (c <= (pg_wchar) UCHAR_MAX && isalpha_l((unsigned char) c, pg_regex_locale->info.lt)); -#endif break; case PG_REGEX_LOCALE_ICU: #ifdef USE_ICU @@ -368,6 +366,8 @@ pg_wc_isalnum(pg_wchar c) case PG_REGEX_LOCALE_C: return (c <= (pg_wchar) 127 && (pg_char_properties[c] & PG_ISALNUM)); + case PG_REGEX_BUILTIN: + return pg_u_isalnum(c, true); case PG_REGEX_LOCALE_WIDE: if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswalnum((wint_t) c); @@ -376,16 +376,12 @@ pg_wc_isalnum(pg_wchar c) return (c <= (pg_wchar) UCHAR_MAX && isalnum((unsigned char) c)); case PG_REGEX_LOCALE_WIDE_L: -#ifdef HAVE_LOCALE_T if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswalnum_l((wint_t) c, pg_regex_locale->info.lt); -#endif /* FALL THRU */ case PG_REGEX_LOCALE_1BYTE_L: -#ifdef HAVE_LOCALE_T return (c <= (pg_wchar) UCHAR_MAX && isalnum_l((unsigned char) c, pg_regex_locale->info.lt)); -#endif break; case PG_REGEX_LOCALE_ICU: #ifdef USE_ICU @@ -413,6 +409,8 @@ pg_wc_isupper(pg_wchar c) case PG_REGEX_LOCALE_C: return (c <= (pg_wchar) 127 && (pg_char_properties[c] & PG_ISUPPER)); + case PG_REGEX_BUILTIN: + return pg_u_isupper(c); case PG_REGEX_LOCALE_WIDE: if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswupper((wint_t) c); @@ -421,16 +419,12 @@ pg_wc_isupper(pg_wchar c) return (c <= (pg_wchar) UCHAR_MAX && isupper((unsigned char) c)); case PG_REGEX_LOCALE_WIDE_L: -#ifdef HAVE_LOCALE_T if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswupper_l((wint_t) c, pg_regex_locale->info.lt); -#endif /* FALL THRU */ case PG_REGEX_LOCALE_1BYTE_L: -#ifdef HAVE_LOCALE_T return (c <= (pg_wchar) UCHAR_MAX && isupper_l((unsigned char) c, pg_regex_locale->info.lt)); -#endif break; case PG_REGEX_LOCALE_ICU: #ifdef USE_ICU @@ -449,6 +443,8 @@ pg_wc_islower(pg_wchar c) case PG_REGEX_LOCALE_C: return (c <= (pg_wchar) 127 && (pg_char_properties[c] & PG_ISLOWER)); + case PG_REGEX_BUILTIN: + return pg_u_islower(c); case PG_REGEX_LOCALE_WIDE: if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswlower((wint_t) c); @@ -457,16 +453,12 @@ pg_wc_islower(pg_wchar c) return (c <= (pg_wchar) UCHAR_MAX && islower((unsigned char) c)); case PG_REGEX_LOCALE_WIDE_L: -#ifdef HAVE_LOCALE_T if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswlower_l((wint_t) c, pg_regex_locale->info.lt); -#endif /* FALL THRU */ case PG_REGEX_LOCALE_1BYTE_L: -#ifdef HAVE_LOCALE_T return (c <= (pg_wchar) UCHAR_MAX && islower_l((unsigned char) c, pg_regex_locale->info.lt)); -#endif break; case PG_REGEX_LOCALE_ICU: #ifdef USE_ICU @@ -485,6 +477,8 @@ pg_wc_isgraph(pg_wchar c) case PG_REGEX_LOCALE_C: return (c <= (pg_wchar) 127 && (pg_char_properties[c] & PG_ISGRAPH)); + case PG_REGEX_BUILTIN: + return pg_u_isgraph(c); case PG_REGEX_LOCALE_WIDE: if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswgraph((wint_t) c); @@ -493,16 +487,12 @@ pg_wc_isgraph(pg_wchar c) return (c <= (pg_wchar) UCHAR_MAX && isgraph((unsigned char) c)); case PG_REGEX_LOCALE_WIDE_L: -#ifdef HAVE_LOCALE_T if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswgraph_l((wint_t) c, pg_regex_locale->info.lt); -#endif /* FALL THRU */ case PG_REGEX_LOCALE_1BYTE_L: -#ifdef HAVE_LOCALE_T return (c <= (pg_wchar) UCHAR_MAX && isgraph_l((unsigned char) c, pg_regex_locale->info.lt)); -#endif break; case PG_REGEX_LOCALE_ICU: #ifdef USE_ICU @@ -521,6 +511,8 @@ pg_wc_isprint(pg_wchar c) case PG_REGEX_LOCALE_C: return (c <= (pg_wchar) 127 && (pg_char_properties[c] & PG_ISPRINT)); + case PG_REGEX_BUILTIN: + return pg_u_isprint(c); case PG_REGEX_LOCALE_WIDE: if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswprint((wint_t) c); @@ -529,16 +521,12 @@ pg_wc_isprint(pg_wchar c) return (c <= (pg_wchar) UCHAR_MAX && isprint((unsigned char) c)); case PG_REGEX_LOCALE_WIDE_L: -#ifdef HAVE_LOCALE_T if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswprint_l((wint_t) c, pg_regex_locale->info.lt); -#endif /* FALL THRU */ case PG_REGEX_LOCALE_1BYTE_L: -#ifdef HAVE_LOCALE_T return (c <= (pg_wchar) UCHAR_MAX && isprint_l((unsigned char) c, pg_regex_locale->info.lt)); -#endif break; case PG_REGEX_LOCALE_ICU: #ifdef USE_ICU @@ -557,6 +545,8 @@ pg_wc_ispunct(pg_wchar c) case PG_REGEX_LOCALE_C: return (c <= (pg_wchar) 127 && (pg_char_properties[c] & PG_ISPUNCT)); + case PG_REGEX_BUILTIN: + return pg_u_ispunct(c, true); case PG_REGEX_LOCALE_WIDE: if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswpunct((wint_t) c); @@ -565,16 +555,12 @@ pg_wc_ispunct(pg_wchar c) return (c <= (pg_wchar) UCHAR_MAX && ispunct((unsigned char) c)); case PG_REGEX_LOCALE_WIDE_L: -#ifdef HAVE_LOCALE_T if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswpunct_l((wint_t) c, pg_regex_locale->info.lt); -#endif /* FALL THRU */ case PG_REGEX_LOCALE_1BYTE_L: -#ifdef HAVE_LOCALE_T return (c <= (pg_wchar) UCHAR_MAX && ispunct_l((unsigned char) c, pg_regex_locale->info.lt)); -#endif break; case PG_REGEX_LOCALE_ICU: #ifdef USE_ICU @@ -593,6 +579,8 @@ pg_wc_isspace(pg_wchar c) case PG_REGEX_LOCALE_C: return (c <= (pg_wchar) 127 && (pg_char_properties[c] & PG_ISSPACE)); + case PG_REGEX_BUILTIN: + return pg_u_isspace(c); case PG_REGEX_LOCALE_WIDE: if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswspace((wint_t) c); @@ -601,16 +589,12 @@ pg_wc_isspace(pg_wchar c) return (c <= (pg_wchar) UCHAR_MAX && isspace((unsigned char) c)); case PG_REGEX_LOCALE_WIDE_L: -#ifdef HAVE_LOCALE_T if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return iswspace_l((wint_t) c, pg_regex_locale->info.lt); -#endif /* FALL THRU */ case PG_REGEX_LOCALE_1BYTE_L: -#ifdef HAVE_LOCALE_T return (c <= (pg_wchar) UCHAR_MAX && isspace_l((unsigned char) c, pg_regex_locale->info.lt)); -#endif break; case PG_REGEX_LOCALE_ICU: #ifdef USE_ICU @@ -630,6 +614,8 @@ pg_wc_toupper(pg_wchar c) if (c <= (pg_wchar) 127) return pg_ascii_toupper((unsigned char) c); return c; + case PG_REGEX_BUILTIN: + return unicode_uppercase_simple(c); case PG_REGEX_LOCALE_WIDE: /* force C behavior for ASCII characters, per comments above */ if (c <= (pg_wchar) 127) @@ -645,16 +631,12 @@ pg_wc_toupper(pg_wchar c) return toupper((unsigned char) c); return c; case PG_REGEX_LOCALE_WIDE_L: -#ifdef HAVE_LOCALE_T if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return towupper_l((wint_t) c, pg_regex_locale->info.lt); -#endif /* FALL THRU */ case PG_REGEX_LOCALE_1BYTE_L: -#ifdef HAVE_LOCALE_T if (c <= (pg_wchar) UCHAR_MAX) return toupper_l((unsigned char) c, pg_regex_locale->info.lt); -#endif return c; case PG_REGEX_LOCALE_ICU: #ifdef USE_ICU @@ -674,6 +656,8 @@ pg_wc_tolower(pg_wchar c) if (c <= (pg_wchar) 127) return pg_ascii_tolower((unsigned char) c); return c; + case PG_REGEX_BUILTIN: + return unicode_lowercase_simple(c); case PG_REGEX_LOCALE_WIDE: /* force C behavior for ASCII characters, per comments above */ if (c <= (pg_wchar) 127) @@ -689,16 +673,12 @@ pg_wc_tolower(pg_wchar c) return tolower((unsigned char) c); return c; case PG_REGEX_LOCALE_WIDE_L: -#ifdef HAVE_LOCALE_T if (sizeof(wchar_t) >= 4 || c <= (pg_wchar) 0xFFFF) return towlower_l((wint_t) c, pg_regex_locale->info.lt); -#endif /* FALL THRU */ case PG_REGEX_LOCALE_1BYTE_L: -#ifdef HAVE_LOCALE_T if (c <= (pg_wchar) UCHAR_MAX) return tolower_l((unsigned char) c, pg_regex_locale->info.lt); -#endif return c; case PG_REGEX_LOCALE_ICU: #ifdef USE_ICU @@ -842,6 +822,9 @@ pg_ctype_get_cache(pg_wc_probefunc probefunc, int cclasscode) max_chr = (pg_wchar) MAX_SIMPLE_CHR; #endif break; + case PG_REGEX_BUILTIN: + max_chr = (pg_wchar) MAX_SIMPLE_CHR; + break; case PG_REGEX_LOCALE_WIDE: case PG_REGEX_LOCALE_WIDE_L: max_chr = (pg_wchar) MAX_SIMPLE_CHR; @@ -859,6 +842,7 @@ pg_ctype_get_cache(pg_wc_probefunc probefunc, int cclasscode) max_chr = (pg_wchar) MAX_SIMPLE_CHR; break; default: + Assert(false); max_chr = 0; /* can't get here, but keep compiler quiet */ break; } diff --git a/src/backend/regex/regcomp.c b/src/backend/regex/regcomp.c index 8a6cfb2973d8c..15b264e50f1a7 100644 --- a/src/backend/regex/regcomp.c +++ b/src/backend/regex/regcomp.c @@ -215,6 +215,7 @@ static void clonesuccessorstates(struct nfa *nfa, struct state *ssource, struct state *spredecessor, struct arc *refarc, char *curdonemap, char *outerdonemap, int nstates); +static void removecantmatch(struct nfa *nfa); static void cleanup(struct nfa *nfa); static void markreachable(struct nfa *nfa, struct state *s, struct state *okay, struct state *mark); @@ -342,6 +343,7 @@ struct vars #define BEHIND 'r' /* color-lookbehind arc */ #define WBDRY 'w' /* word boundary constraint */ #define NWBDRY 'W' /* non-word-boundary constraint */ +#define CANTMATCH 'x' /* arc that cannot match anything */ #define SBEGIN 'A' /* beginning of string (even if not BOL) */ #define SEND 'Z' /* end of string (even if not EOL) */ @@ -2368,6 +2370,7 @@ nfanode(struct vars *v, nfa = newnfa(v, v->cm, v->nfa); NOERRZ(); dupnfa(nfa, t->begin, t->end, nfa->init, nfa->final); + nfa->flags = v->nfa->flags; if (!ISERR()) specialcolors(nfa); if (!ISERR()) diff --git a/src/backend/regex/regexport.c b/src/backend/regex/regexport.c index c168b7233c167..1c9563284c8d5 100644 --- a/src/backend/regex/regexport.c +++ b/src/backend/regex/regexport.c @@ -15,7 +15,7 @@ * allows the caller to decide how big is too big to bother with. * * - * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1998, 1999 Henry Spencer * * IDENTIFICATION diff --git a/src/backend/regex/regprefix.c b/src/backend/regex/regprefix.c index c09b2a9778e62..47a8cebe075e2 100644 --- a/src/backend/regex/regprefix.c +++ b/src/backend/regex/regprefix.c @@ -4,7 +4,7 @@ * Extract a common prefix, if any, from a compiled regex. * * - * Portions Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1998, 1999 Henry Spencer * * IDENTIFICATION diff --git a/src/backend/replication/Makefile b/src/backend/replication/Makefile index 23f29ba545754..7f867ee91dda8 100644 --- a/src/backend/replication/Makefile +++ b/src/backend/replication/Makefile @@ -48,6 +48,10 @@ syncrep_gram.c: BISONFLAGS += -d # Force these dependencies to be known even without dependency info built: syncrep_gram.o syncrep_scanner.o: syncrep_gram.h -# repl_gram.c, repl_scanner.c, syncrep_gram.c and syncrep_scanner.c -# are in the distribution tarball, so they are not cleaned here. -# (Our parent Makefile takes care of them during maintainer-clean.) +clean: + rm -f repl_gram.c \ + repl_gram.h \ + repl_scanner.c \ + syncrep_gram.c \ + syncrep_gram.h \ + syncrep_scanner.c diff --git a/src/backend/replication/libpqwalreceiver/Makefile b/src/backend/replication/libpqwalreceiver/Makefile index f26daa135f3db..e882907350713 100644 --- a/src/backend/replication/libpqwalreceiver/Makefile +++ b/src/backend/replication/libpqwalreceiver/Makefile @@ -33,5 +33,5 @@ installdirs: installdirs-lib uninstall: uninstall-lib -clean distclean maintainer-clean: clean-lib +clean distclean: clean-lib rm -f $(OBJS) diff --git a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c index dc9c5c82d9401..02f12f2921939 100644 --- a/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c +++ b/src/backend/replication/libpqwalreceiver/libpqwalreceiver.c @@ -6,7 +6,10 @@ * loaded as a dynamic module to avoid linking the main server binary with * libpq. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Apart from walreceiver, the libpq-specific routines are now being used by + * logical replication workers and slot synchronization. + * + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -19,12 +22,9 @@ #include #include -#include "access/xlog.h" -#include "catalog/pg_type.h" #include "common/connect.h" #include "funcapi.h" #include "libpq-fe.h" -#include "libpq/libpq-be-fe-helpers.h" #include "mb/pg_wchar.h" #include "miscadmin.h" #include "pgstat.h" @@ -49,7 +49,8 @@ struct WalReceiverConn /* Prototypes for interface functions */ static WalReceiverConn *libpqrcv_connect(const char *conninfo, - bool logical, bool must_use_password, + bool replication, bool logical, + bool must_use_password, const char *appname, char **err); static void libpqrcv_check_conninfo(const char *conninfo, bool must_use_password); @@ -58,6 +59,7 @@ static void libpqrcv_get_senderinfo(WalReceiverConn *conn, char **sender_host, int *sender_port); static char *libpqrcv_identify_system(WalReceiverConn *conn, TimeLineID *primary_tli); +static char *libpqrcv_get_dbname_from_conninfo(const char *connInfo); static int libpqrcv_server_version(WalReceiverConn *conn); static void libpqrcv_readtimelinehistoryfile(WalReceiverConn *conn, TimeLineID tli, char **filename, @@ -74,8 +76,11 @@ static char *libpqrcv_create_slot(WalReceiverConn *conn, const char *slotname, bool temporary, bool two_phase, + bool failover, CRSSnapshotAction snapshot_action, XLogRecPtr *lsn); +static void libpqrcv_alter_slot(WalReceiverConn *conn, const char *slotname, + bool failover); static pid_t libpqrcv_get_backend_pid(WalReceiverConn *conn); static WalRcvExecResult *libpqrcv_exec(WalReceiverConn *conn, const char *query, @@ -96,6 +101,8 @@ static WalReceiverFunctionsType PQWalReceiverFunctions = { .walrcv_receive = libpqrcv_receive, .walrcv_send = libpqrcv_send, .walrcv_create_slot = libpqrcv_create_slot, + .walrcv_alter_slot = libpqrcv_alter_slot, + .walrcv_get_dbname_from_conninfo = libpqrcv_get_dbname_from_conninfo, .walrcv_get_backend_pid = libpqrcv_get_backend_pid, .walrcv_exec = libpqrcv_exec, .walrcv_disconnect = libpqrcv_disconnect @@ -118,7 +125,11 @@ _PG_init(void) } /* - * Establish the connection to the primary server for XLOG streaming + * Establish the connection to the primary server. + * + * This function can be used for both replication and regular connections. + * If it is a replication connection, it could be either logical or physical + * based on input argument 'logical'. * * If an error occurs, this function will normally return NULL and set *err * to a palloc'ed error message. However, if must_use_password is true and @@ -129,77 +140,140 @@ _PG_init(void) * case. */ static WalReceiverConn * -libpqrcv_connect(const char *conninfo, bool logical, bool must_use_password, - const char *appname, char **err) +libpqrcv_connect(const char *conninfo, bool replication, bool logical, + bool must_use_password, const char *appname, char **err) { WalReceiverConn *conn; + PostgresPollingStatusType status; const char *keys[6]; const char *vals[6]; int i = 0; + /* + * Re-validate connection string. The validation already happened at DDL + * time, but the subscription owner may have changed. If we don't recheck + * with the correct must_use_password, it's possible that the connection + * will obtain the password from a different source, such as PGPASSFILE or + * PGPASSWORD. + */ + libpqrcv_check_conninfo(conninfo, must_use_password); + /* * We use the expand_dbname parameter to process the connection string (or * URI), and pass some extra options. */ keys[i] = "dbname"; vals[i] = conninfo; - keys[++i] = "replication"; - vals[i] = logical ? "database" : "true"; - if (!logical) + + /* We can not have logical without replication */ + Assert(replication || !logical); + + if (replication) { - /* - * The database name is ignored by the server in replication mode, but - * specify "replication" for .pgpass lookup. - */ - keys[++i] = "dbname"; - vals[i] = "replication"; + keys[++i] = "replication"; + vals[i] = logical ? "database" : "true"; + + if (logical) + { + /* Tell the publisher to translate to our encoding */ + keys[++i] = "client_encoding"; + vals[i] = GetDatabaseEncodingName(); + + /* + * Force assorted GUC parameters to settings that ensure that the + * publisher will output data values in a form that is unambiguous + * to the subscriber. (We don't want to modify the subscriber's + * GUC settings, since that might surprise user-defined code + * running in the subscriber, such as triggers.) This should + * match what pg_dump does. + */ + keys[++i] = "options"; + vals[i] = "-c datestyle=ISO -c intervalstyle=postgres -c extra_float_digits=3"; + } + else + { + /* + * The database name is ignored by the server in replication mode, + * but specify "replication" for .pgpass lookup. + */ + keys[++i] = "dbname"; + vals[i] = "replication"; + } } + keys[++i] = "fallback_application_name"; vals[i] = appname; - if (logical) - { - /* Tell the publisher to translate to our encoding */ - keys[++i] = "client_encoding"; - vals[i] = GetDatabaseEncodingName(); - /* - * Force assorted GUC parameters to settings that ensure that the - * publisher will output data values in a form that is unambiguous to - * the subscriber. (We don't want to modify the subscriber's GUC - * settings, since that might surprise user-defined code running in - * the subscriber, such as triggers.) This should match what pg_dump - * does. - */ - keys[++i] = "options"; - vals[i] = "-c datestyle=ISO -c intervalstyle=postgres -c extra_float_digits=3"; - } keys[++i] = NULL; vals[i] = NULL; Assert(i < sizeof(keys)); conn = palloc0(sizeof(WalReceiverConn)); - conn->streamConn = - libpqsrv_connect_params(keys, vals, - /* expand_dbname = */ true, - WAIT_EVENT_LIBPQWALRECEIVER_CONNECT); + conn->streamConn = PQconnectStartParams(keys, vals, + /* expand_dbname = */ true); + if (PQstatus(conn->streamConn) == CONNECTION_BAD) + goto bad_connection_errmsg; + + /* + * Poll connection until we have OK or FAILED status. + * + * Per spec for PQconnectPoll, first wait till socket is write-ready. + */ + status = PGRES_POLLING_WRITING; + do + { + int io_flag; + int rc; + + if (status == PGRES_POLLING_READING) + io_flag = WL_SOCKET_READABLE; +#ifdef WIN32 + /* Windows needs a different test while waiting for connection-made */ + else if (PQstatus(conn->streamConn) == CONNECTION_STARTED) + io_flag = WL_SOCKET_CONNECTED; +#endif + else + io_flag = WL_SOCKET_WRITEABLE; + + rc = WaitLatchOrSocket(MyLatch, + WL_EXIT_ON_PM_DEATH | WL_LATCH_SET | io_flag, + PQsocket(conn->streamConn), + 0, + WAIT_EVENT_LIBPQWALRECEIVER_CONNECT); + + /* Interrupted? */ + if (rc & WL_LATCH_SET) + { + ResetLatch(MyLatch); + ProcessWalRcvInterrupts(); + } + + /* If socket is ready, advance the libpq state machine */ + if (rc & io_flag) + status = PQconnectPoll(conn->streamConn); + } while (status != PGRES_POLLING_OK && status != PGRES_POLLING_FAILED); if (PQstatus(conn->streamConn) != CONNECTION_OK) goto bad_connection_errmsg; if (must_use_password && !PQconnectionUsedPassword(conn->streamConn)) { - libpqsrv_disconnect(conn->streamConn); + PQfinish(conn->streamConn); pfree(conn); ereport(ERROR, (errcode(ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED), errmsg("password is required"), errdetail("Non-superuser cannot connect if the server does not request a password."), - errhint("Target server's authentication method must be changed. or set password_required=false in the subscription attributes."))); + errhint("Target server's authentication method must be changed, or set password_required=false in the subscription parameters."))); } - if (logical) + /* + * Set always-secure search path for the cases where the connection is + * used to run SQL queries, so malicious users can't get control. + */ + if (!replication || logical) { PGresult *res; @@ -225,7 +299,7 @@ libpqrcv_connect(const char *conninfo, bool logical, bool must_use_password, /* error path, error already set */ bad_connection: - libpqsrv_disconnect(conn->streamConn); + PQfinish(conn->streamConn); pfree(conn); return NULL; } @@ -275,10 +349,15 @@ libpqrcv_check_conninfo(const char *conninfo, bool must_use_password) } if (!uses_password) + { + /* malloc'd, so we must free it explicitly */ + PQconninfoFree(opts); + ereport(ERROR, (errcode(ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED), errmsg("password is required"), errdetail("Non-superusers must provide a password in the connection string."))); + } } PQconninfoFree(opts); @@ -381,6 +460,11 @@ libpqrcv_identify_system(WalReceiverConn *conn, TimeLineID *primary_tli) "the primary server: %s", pchomp(PQerrorMessage(conn->streamConn))))); } + + /* + * IDENTIFY_SYSTEM returns 3 columns in 9.3 and earlier, and 4 columns in + * 9.4 and onwards. + */ if (PQnfields(res) < 3 || PQntuples(res) != 1) { int ntuples = PQntuples(res); @@ -391,7 +475,7 @@ libpqrcv_identify_system(WalReceiverConn *conn, TimeLineID *primary_tli) (errcode(ERRCODE_PROTOCOL_VIOLATION), errmsg("invalid response from primary server"), errdetail("Could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields.", - ntuples, nfields, 3, 1))); + ntuples, nfields, 1, 3))); } primary_sysid = pstrdup(PQgetvalue(res, 0, 0)); *primary_tli = pg_strtoint32(PQgetvalue(res, 0, 1)); @@ -409,6 +493,50 @@ libpqrcv_server_version(WalReceiverConn *conn) return PQserverVersion(conn->streamConn); } +/* + * Get database name from the primary server's conninfo. + * + * If dbname is not found in connInfo, return NULL value. + */ +static char * +libpqrcv_get_dbname_from_conninfo(const char *connInfo) +{ + PQconninfoOption *opts; + char *dbname = NULL; + char *err = NULL; + + opts = PQconninfoParse(connInfo, &err); + if (opts == NULL) + { + /* The error string is malloc'd, so we must free it explicitly */ + char *errcopy = err ? pstrdup(err) : "out of memory"; + + PQfreemem(err); + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid connection string syntax: %s", errcopy))); + } + + for (PQconninfoOption *opt = opts; opt->keyword != NULL; ++opt) + { + /* + * If multiple dbnames are specified, then the last one will be + * returned + */ + if (strcmp(opt->keyword, "dbname") == 0 && opt->val && + *opt->val) + { + if (dbname) + pfree(dbname); + + dbname = pstrdup(opt->val); + } + } + + PQconninfoFree(opts); + return dbname; +} + /* * Start streaming WAL data from given streaming options. * @@ -648,12 +776,9 @@ libpqrcv_readtimelinehistoryfile(WalReceiverConn *conn, * Send a query and wait for the results by using the asynchronous libpq * functions and socket readiness events. * - * We must not use the regular blocking libpq functions like PQexec() - * since they are uninterruptible by signals on some platforms, such as - * Windows. - * - * The function is modeled on PQexec() in libpq, but only implements - * those parts that are in use in the walreceiver api. + * The function is modeled on libpqsrv_exec(), with the behavior difference + * being that it calls ProcessWalRcvInterrupts(). As an optimization, it + * skips try/catch, since all errors terminate the process. * * May return NULL, rather than an error result, on failure. */ @@ -754,7 +879,7 @@ libpqrcv_PQgetResult(PGconn *streamConn) static void libpqrcv_disconnect(WalReceiverConn *conn) { - libpqsrv_disconnect(conn->streamConn); + PQfinish(conn->streamConn); PQfreemem(conn->recvBuf); pfree(conn); } @@ -883,8 +1008,8 @@ libpqrcv_send(WalReceiverConn *conn, const char *buffer, int nbytes) */ static char * libpqrcv_create_slot(WalReceiverConn *conn, const char *slotname, - bool temporary, bool two_phase, CRSSnapshotAction snapshot_action, - XLogRecPtr *lsn) + bool temporary, bool two_phase, bool failover, + CRSSnapshotAction snapshot_action, XLogRecPtr *lsn) { PGresult *res; StringInfoData cmd; @@ -914,6 +1039,15 @@ libpqrcv_create_slot(WalReceiverConn *conn, const char *slotname, appendStringInfoChar(&cmd, ' '); } + if (failover) + { + appendStringInfoString(&cmd, "FAILOVER"); + if (use_new_options_syntax) + appendStringInfoString(&cmd, ", "); + else + appendStringInfoChar(&cmd, ' '); + } + if (use_new_options_syntax) { switch (snapshot_action) @@ -982,6 +1116,33 @@ libpqrcv_create_slot(WalReceiverConn *conn, const char *slotname, return snapshot; } +/* + * Change the definition of the replication slot. + */ +static void +libpqrcv_alter_slot(WalReceiverConn *conn, const char *slotname, + bool failover) +{ + StringInfoData cmd; + PGresult *res; + + initStringInfo(&cmd); + appendStringInfo(&cmd, "ALTER_REPLICATION_SLOT %s ( FAILOVER %s )", + quote_identifier(slotname), + failover ? "true" : "false"); + + res = libpqrcv_PQexec(conn->streamConn, cmd.data); + pfree(cmd.data); + + if (PQresultStatus(res) != PGRES_COMMAND_OK) + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("could not alter replication slot \"%s\": %s", + slotname, pchomp(PQerrorMessage(conn->streamConn))))); + + PQclear(res); +} + /* * Return PID of remote backend process. */ @@ -1087,8 +1248,9 @@ libpqrcv_exec(WalReceiverConn *conn, const char *query, switch (PQresultStatus(pgres)) { - case PGRES_SINGLE_TUPLE: case PGRES_TUPLES_OK: + case PGRES_SINGLE_TUPLE: + case PGRES_TUPLES_CHUNK: walres->status = WALRCV_OK_TUPLES; libpqrcv_processTuples(pgres, walres, nRetTypes, retTypes); break; diff --git a/src/backend/replication/libpqwalreceiver/meson.build b/src/backend/replication/libpqwalreceiver/meson.build index ec439fb553650..f833a997e1cf1 100644 --- a/src/backend/replication/libpqwalreceiver/meson.build +++ b/src/backend/replication/libpqwalreceiver/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group libpqwalreceiver_sources = files( 'libpqwalreceiver.c', diff --git a/src/backend/replication/logical/Makefile b/src/backend/replication/logical/Makefile index 2dc25e37bb89a..ba03eeff1c6ee 100644 --- a/src/backend/replication/logical/Makefile +++ b/src/backend/replication/logical/Makefile @@ -25,6 +25,7 @@ OBJS = \ proto.o \ relation.o \ reorderbuffer.o \ + slotsync.o \ snapbuild.o \ tablesync.o \ worker.o diff --git a/src/backend/replication/logical/applyparallelworker.c b/src/backend/replication/logical/applyparallelworker.c index 6fb96148f4ad5..e7f7d4c5e4bd3 100644 --- a/src/backend/replication/logical/applyparallelworker.c +++ b/src/backend/replication/logical/applyparallelworker.c @@ -2,7 +2,7 @@ * applyparallelworker.c * Support routines for applying xact by parallel apply worker * - * Copyright (c) 2023, PostgreSQL Global Development Group + * Copyright (c) 2023-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/applyparallelworker.c @@ -435,7 +435,8 @@ pa_launch_parallel_worker(void) return NULL; } - launched = logicalrep_worker_launch(MyLogicalRepWorker->dbid, + launched = logicalrep_worker_launch(WORKERTYPE_PARALLEL_APPLY, + MyLogicalRepWorker->dbid, MySubscription->oid, MySubscription->name, MyLogicalRepWorker->userid, @@ -508,7 +509,6 @@ pa_allocate_worker(TransactionId xid) winfo->in_use = true; winfo->serialize_changes = false; entry->winfo = winfo; - entry->xid = xid; } /* @@ -773,10 +773,7 @@ LogicalParallelApplyLoop(shm_mq_handle *mqh) if (len == 0) elog(ERROR, "invalid message length"); - s.cursor = 0; - s.maxlen = -1; - s.data = (char *) data; - s.len = len; + initReadOnlyStringInfo(&s, data, len); /* * The first byte of messages sent from leader apply worker to @@ -848,7 +845,7 @@ pa_shutdown(int code, Datum arg) { SendProcSignal(MyLogicalRepWorker->leader_pid, PROCSIG_PARALLEL_APPLY_MESSAGE, - InvalidBackendId); + INVALID_PROC_NUMBER); dsm_detach((dsm_segment *) DatumGetPointer(arg)); } @@ -937,12 +934,12 @@ ParallelApplyWorkerMain(Datum main_arg) pq_redirect_to_shm_mq(seg, error_mqh); pq_set_parallel_leader(MyLogicalRepWorker->leader_pid, - InvalidBackendId); + INVALID_PROC_NUMBER); MyLogicalRepWorker->last_send_time = MyLogicalRepWorker->last_recv_time = MyLogicalRepWorker->reply_time = 0; - InitializeApplyWorker(); + InitializeLogRepWorker(); InitializingApplyWorker = false; @@ -1159,7 +1156,7 @@ pa_send_data(ParallelApplyWorkerInfo *winfo, Size nbytes, const void *data) * We don't try to send data to parallel worker for 'immediate' mode. This * is primarily used for testing purposes. */ - if (unlikely(logical_replication_mode == LOGICAL_REP_MODE_IMMEDIATE)) + if (unlikely(debug_logical_replication_streaming == DEBUG_LOGICAL_REP_STREAMING_IMMEDIATE)) return false; /* diff --git a/src/backend/replication/logical/decode.c b/src/backend/replication/logical/decode.c index d91055a44091e..4911e98ec2d2e 100644 --- a/src/backend/replication/logical/decode.c +++ b/src/backend/replication/logical/decode.c @@ -16,7 +16,7 @@ * contents of records in here except turning them into a more usable * format. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -26,22 +26,19 @@ */ #include "postgres.h" -#include "access/heapam.h" #include "access/heapam_xlog.h" #include "access/transam.h" #include "access/xact.h" #include "access/xlog_internal.h" #include "access/xlogreader.h" #include "access/xlogrecord.h" -#include "access/xlogutils.h" #include "catalog/pg_control.h" #include "replication/decode.h" #include "replication/logical.h" #include "replication/message.h" -#include "replication/origin.h" #include "replication/reorderbuffer.h" #include "replication/snapbuild.h" -#include "storage/standby.h" +#include "storage/standbydefs.h" /* individual record(group)'s handlers */ static void DecodeInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf); @@ -62,7 +59,7 @@ static void DecodePrepare(LogicalDecodingContext *ctx, XLogRecordBuffer *buf, /* common function to decode tuples */ -static void DecodeXLogTuple(char *data, Size len, ReorderBufferTupleBuf *tuple); +static void DecodeXLogTuple(char *data, Size len, HeapTuple tuple); /* helper functions for decoding transactions */ static inline bool FilterPrepare(LogicalDecodingContext *ctx, @@ -177,7 +174,7 @@ xlog_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) Assert(RecoveryInProgress()); ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("logical decoding on standby requires wal_level >= logical on the primary"))); + errmsg("logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary"))); } break; } @@ -190,6 +187,7 @@ xlog_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) case XLOG_FPI_FOR_HINT: case XLOG_FPI: case XLOG_OVERWRITE_CONTRECORD: + case XLOG_CHECKPOINT_REDO: break; default: elog(ERROR, "unexpected RM_XLOG_ID record type: %u", info); @@ -413,20 +411,24 @@ heap2_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) /* * If we don't have snapshot or we are just fast-forwarding, there is no - * point in decoding changes. + * point in decoding data changes. However, it's crucial to build the base + * snapshot during fast-forward mode (as is done in + * SnapBuildProcessChange()) because we require the snapshot's xmin when + * determining the candidate catalog_xmin for the replication slot. See + * SnapBuildProcessRunningXacts(). */ - if (SnapBuildCurrentState(builder) < SNAPBUILD_FULL_SNAPSHOT || - ctx->fast_forward) + if (SnapBuildCurrentState(builder) < SNAPBUILD_FULL_SNAPSHOT) return; switch (info) { case XLOG_HEAP2_MULTI_INSERT: - if (!ctx->fast_forward && - SnapBuildProcessChange(builder, xid, buf->origptr)) + if (SnapBuildProcessChange(builder, xid, buf->origptr) && + !ctx->fast_forward) DecodeMultiInsert(ctx, buf); break; case XLOG_HEAP2_NEW_CID: + if (!ctx->fast_forward) { xl_heap_new_cid *xlrec; @@ -448,9 +450,9 @@ heap2_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) * Everything else here is just low level physical stuff we're not * interested in. */ - case XLOG_HEAP2_FREEZE_PAGE: - case XLOG_HEAP2_PRUNE: - case XLOG_HEAP2_VACUUM: + case XLOG_HEAP2_PRUNE_ON_ACCESS: + case XLOG_HEAP2_PRUNE_VACUUM_SCAN: + case XLOG_HEAP2_PRUNE_VACUUM_CLEANUP: case XLOG_HEAP2_VISIBLE: case XLOG_HEAP2_LOCK_UPDATED: break; @@ -473,16 +475,20 @@ heap_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) /* * If we don't have snapshot or we are just fast-forwarding, there is no - * point in decoding data changes. + * point in decoding data changes. However, it's crucial to build the base + * snapshot during fast-forward mode (as is done in + * SnapBuildProcessChange()) because we require the snapshot's xmin when + * determining the candidate catalog_xmin for the replication slot. See + * SnapBuildProcessRunningXacts(). */ - if (SnapBuildCurrentState(builder) < SNAPBUILD_FULL_SNAPSHOT || - ctx->fast_forward) + if (SnapBuildCurrentState(builder) < SNAPBUILD_FULL_SNAPSHOT) return; switch (info) { case XLOG_HEAP_INSERT: - if (SnapBuildProcessChange(builder, xid, buf->origptr)) + if (SnapBuildProcessChange(builder, xid, buf->origptr) && + !ctx->fast_forward) DecodeInsert(ctx, buf); break; @@ -493,17 +499,20 @@ heap_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) */ case XLOG_HEAP_HOT_UPDATE: case XLOG_HEAP_UPDATE: - if (SnapBuildProcessChange(builder, xid, buf->origptr)) + if (SnapBuildProcessChange(builder, xid, buf->origptr) && + !ctx->fast_forward) DecodeUpdate(ctx, buf); break; case XLOG_HEAP_DELETE: - if (SnapBuildProcessChange(builder, xid, buf->origptr)) + if (SnapBuildProcessChange(builder, xid, buf->origptr) && + !ctx->fast_forward) DecodeDelete(ctx, buf); break; case XLOG_HEAP_TRUNCATE: - if (SnapBuildProcessChange(builder, xid, buf->origptr)) + if (SnapBuildProcessChange(builder, xid, buf->origptr) && + !ctx->fast_forward) DecodeTruncate(ctx, buf); break; @@ -531,7 +540,8 @@ heap_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) break; case XLOG_HEAP_CONFIRM: - if (SnapBuildProcessChange(builder, xid, buf->origptr)) + if (SnapBuildProcessChange(builder, xid, buf->origptr) && + !ctx->fast_forward) DecodeSpecConfirm(ctx, buf); break; @@ -600,12 +610,8 @@ logicalmsg_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) ReorderBufferProcessXid(ctx->reorder, XLogRecGetXid(r), buf->origptr); - /* - * If we don't have snapshot or we are just fast-forwarding, there is no - * point in decoding messages. - */ - if (SnapBuildCurrentState(builder) < SNAPBUILD_FULL_SNAPSHOT || - ctx->fast_forward) + /* If we don't have snapshot, there is no point in decoding messages */ + if (SnapBuildCurrentState(builder) < SNAPBUILD_FULL_SNAPSHOT) return; message = (xl_logical_message *) XLogRecGetData(r); @@ -622,6 +628,26 @@ logicalmsg_decode(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) SnapBuildXactNeedsSkip(builder, buf->origptr))) return; + /* + * We also skip decoding in fast_forward mode. This check must be last + * because we don't want to set the processing_required flag unless we + * have a decodable message. + */ + if (ctx->fast_forward) + { + /* + * We need to set processing_required flag to notify the message's + * existence to the caller. Usually, the flag is set when either the + * COMMIT or ABORT records are decoded, but this must be turned on + * here because the non-transactional logical message is decoded + * without waiting for these records. + */ + if (!message->transactional) + ctx->processing_required = true; + + return; + } + /* * If this is a non-transactional change, get the snapshot we're expected * to use. We only get here when the snapshot is consistent, and the @@ -874,7 +900,7 @@ DecodeAbort(LogicalDecodingContext *ctx, XLogRecordBuffer *buf, /* * Parse XLOG_HEAP_INSERT (not MULTI_INSERT!) records into tuplebufs. * - * Deletes can contain the new tuple. + * Inserts can contain the new tuple. */ static void DecodeInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) @@ -1090,7 +1116,7 @@ DecodeTruncate(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) } /* - * Decode XLOG_HEAP2_MULTI_INSERT_insert record into multiple tuplebufs. + * Decode XLOG_HEAP2_MULTI_INSERT record into multiple tuplebufs. * * Currently MULTI_INSERT will always contain the full tuples. */ @@ -1136,7 +1162,7 @@ DecodeMultiInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) ReorderBufferChange *change; xl_multi_insert_tuple *xlhdr; int datalen; - ReorderBufferTupleBuf *tuple; + HeapTuple tuple; HeapTupleHeader header; change = ReorderBufferGetChange(ctx->reorder); @@ -1153,21 +1179,21 @@ DecodeMultiInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) ReorderBufferGetTupleBuf(ctx->reorder, datalen); tuple = change->data.tp.newtuple; - header = tuple->tuple.t_data; + header = tuple->t_data; /* not a disk based tuple */ - ItemPointerSetInvalid(&tuple->tuple.t_self); + ItemPointerSetInvalid(&tuple->t_self); /* * We can only figure this out after reassembling the transactions. */ - tuple->tuple.t_tableOid = InvalidOid; + tuple->t_tableOid = InvalidOid; - tuple->tuple.t_len = datalen + SizeofHeapTupleHeader; + tuple->t_len = datalen + SizeofHeapTupleHeader; memset(header, 0, SizeofHeapTupleHeader); - memcpy((char *) tuple->tuple.t_data + SizeofHeapTupleHeader, + memcpy((char *) tuple->t_data + SizeofHeapTupleHeader, (char *) data, datalen); header->t_infomask = xlhdr->t_infomask; @@ -1237,7 +1263,7 @@ DecodeSpecConfirm(LogicalDecodingContext *ctx, XLogRecordBuffer *buf) * computed outside as they are record specific. */ static void -DecodeXLogTuple(char *data, Size len, ReorderBufferTupleBuf *tuple) +DecodeXLogTuple(char *data, Size len, HeapTuple tuple) { xl_heap_header xlhdr; int datalen = len - SizeOfHeapHeader; @@ -1245,14 +1271,14 @@ DecodeXLogTuple(char *data, Size len, ReorderBufferTupleBuf *tuple) Assert(datalen >= 0); - tuple->tuple.t_len = datalen + SizeofHeapTupleHeader; - header = tuple->tuple.t_data; + tuple->t_len = datalen + SizeofHeapTupleHeader; + header = tuple->t_data; /* not a disk based tuple */ - ItemPointerSetInvalid(&tuple->tuple.t_self); + ItemPointerSetInvalid(&tuple->t_self); /* we can only figure this out after reassembling the transactions */ - tuple->tuple.t_tableOid = InvalidOid; + tuple->t_tableOid = InvalidOid; /* data is not stored aligned, copy to aligned storage */ memcpy((char *) &xlhdr, @@ -1261,7 +1287,7 @@ DecodeXLogTuple(char *data, Size len, ReorderBufferTupleBuf *tuple) memset(header, 0, SizeofHeapTupleHeader); - memcpy(((char *) tuple->tuple.t_data) + SizeofHeapTupleHeader, + memcpy(((char *) tuple->t_data) + SizeofHeapTupleHeader, data + SizeOfHeapHeader, datalen); @@ -1286,7 +1312,21 @@ static bool DecodeTXNNeedSkip(LogicalDecodingContext *ctx, XLogRecordBuffer *buf, Oid txn_dbid, RepOriginId origin_id) { - return (SnapBuildXactNeedsSkip(ctx->snapshot_builder, buf->origptr) || - (txn_dbid != InvalidOid && txn_dbid != ctx->slot->data.database) || - ctx->fast_forward || FilterByOrigin(ctx, origin_id)); + if (SnapBuildXactNeedsSkip(ctx->snapshot_builder, buf->origptr) || + (txn_dbid != InvalidOid && txn_dbid != ctx->slot->data.database) || + FilterByOrigin(ctx, origin_id)) + return true; + + /* + * We also skip decoding in fast_forward mode. In passing set the + * processing_required flag to indicate that if it were not for + * fast_forward mode, processing would have been required. + */ + if (ctx->fast_forward) + { + ctx->processing_required = true; + return true; + } + + return false; } diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c index 8395ae7b23ce3..27c3a91fb75ea 100644 --- a/src/backend/replication/logical/launcher.c +++ b/src/backend/replication/logical/launcher.c @@ -2,7 +2,7 @@ * launcher.c * PostgreSQL logical replication worker launcher process * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/launcher.c @@ -26,29 +26,22 @@ #include "catalog/pg_subscription_rel.h" #include "funcapi.h" #include "lib/dshash.h" -#include "libpq/pqsignal.h" #include "miscadmin.h" #include "pgstat.h" #include "postmaster/bgworker.h" -#include "postmaster/fork_process.h" #include "postmaster/interrupt.h" -#include "postmaster/postmaster.h" #include "replication/logicallauncher.h" -#include "replication/logicalworker.h" #include "replication/slot.h" #include "replication/walreceiver.h" #include "replication/worker_internal.h" #include "storage/ipc.h" #include "storage/proc.h" #include "storage/procarray.h" -#include "storage/procsignal.h" #include "tcop/tcopprot.h" #include "utils/builtins.h" #include "utils/memutils.h" #include "utils/pg_lsn.h" -#include "utils/ps_status.h" #include "utils/snapmgr.h" -#include "utils/timeout.h" /* max sleep time between cycles (3min) */ #define DEFAULT_NAPTIME_PER_CYCLE 180000L @@ -88,6 +81,7 @@ static const dshash_parameters dsh_params = { sizeof(LauncherLastStartTimesEntry), dshash_memcmp, dshash_memhash, + dshash_memcpy, LWTRANCHE_LAUNCHER_HASH }; @@ -303,7 +297,8 @@ logicalrep_workers_find(Oid subid, bool only_running) * Returns true on success, false on failure. */ bool -logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid, +logicalrep_worker_launch(LogicalRepWorkerType wtype, + Oid dbid, Oid subid, const char *subname, Oid userid, Oid relid, dsm_handle subworker_dsm) { BackgroundWorker bgw; @@ -315,10 +310,18 @@ logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid, int nsyncworkers; int nparallelapplyworkers; TimestampTz now; - bool is_parallel_apply_worker = (subworker_dsm != DSM_HANDLE_INVALID); - - /* Sanity check - tablesync worker cannot be a subworker */ - Assert(!(is_parallel_apply_worker && OidIsValid(relid))); + bool is_tablesync_worker = (wtype == WORKERTYPE_TABLESYNC); + bool is_parallel_apply_worker = (wtype == WORKERTYPE_PARALLEL_APPLY); + + /*---------- + * Sanity checks: + * - must be valid worker type + * - tablesync workers are only ones to have relid + * - parallel apply worker is the only kind of subworker + */ + Assert(wtype != WORKERTYPE_UNKNOWN); + Assert(is_tablesync_worker == OidIsValid(relid)); + Assert(is_parallel_apply_worker == (subworker_dsm != DSM_HANDLE_INVALID)); ereport(DEBUG1, (errmsg_internal("starting logical replication worker for subscription \"%s\"", @@ -393,7 +396,7 @@ logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid, * sync worker limit per subscription. So, just return silently as we * might get here because of an otherwise harmless race condition. */ - if (OidIsValid(relid) && nsyncworkers >= max_sync_workers_per_subscription) + if (is_tablesync_worker && nsyncworkers >= max_sync_workers_per_subscription) { LWLockRelease(LogicalRepWorkerLock); return false; @@ -422,11 +425,12 @@ logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid, ereport(WARNING, (errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED), errmsg("out of logical replication worker slots"), - errhint("You might need to increase %s.", "max_logical_replication_workers"))); + errhint("You might need to increase \"%s\".", "max_logical_replication_workers"))); return false; } /* Prepare the worker slot. */ + worker->type = wtype; worker->launch_time = now; worker->in_use = true; worker->generation++; @@ -456,35 +460,46 @@ logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid, bgw.bgw_flags = BGWORKER_SHMEM_ACCESS | BGWORKER_BACKEND_DATABASE_CONNECTION; bgw.bgw_start_time = BgWorkerStart_RecoveryFinished; - snprintf(bgw.bgw_library_name, BGW_MAXLEN, "postgres"); - - if (is_parallel_apply_worker) - snprintf(bgw.bgw_function_name, BGW_MAXLEN, "ParallelApplyWorkerMain"); - else - snprintf(bgw.bgw_function_name, BGW_MAXLEN, "ApplyWorkerMain"); - - if (OidIsValid(relid)) - snprintf(bgw.bgw_name, BGW_MAXLEN, - "logical replication worker for subscription %u sync %u", subid, relid); - else if (is_parallel_apply_worker) - snprintf(bgw.bgw_name, BGW_MAXLEN, - "logical replication parallel apply worker for subscription %u", subid); - else - snprintf(bgw.bgw_name, BGW_MAXLEN, - "logical replication apply worker for subscription %u", subid); - - if (is_parallel_apply_worker) - snprintf(bgw.bgw_type, BGW_MAXLEN, "logical replication parallel worker"); - else - snprintf(bgw.bgw_type, BGW_MAXLEN, "logical replication worker"); + snprintf(bgw.bgw_library_name, MAXPGPATH, "postgres"); + + switch (worker->type) + { + case WORKERTYPE_APPLY: + snprintf(bgw.bgw_function_name, BGW_MAXLEN, "ApplyWorkerMain"); + snprintf(bgw.bgw_name, BGW_MAXLEN, + "logical replication apply worker for subscription %u", + subid); + snprintf(bgw.bgw_type, BGW_MAXLEN, "logical replication apply worker"); + break; + + case WORKERTYPE_PARALLEL_APPLY: + snprintf(bgw.bgw_function_name, BGW_MAXLEN, "ParallelApplyWorkerMain"); + snprintf(bgw.bgw_name, BGW_MAXLEN, + "logical replication parallel apply worker for subscription %u", + subid); + snprintf(bgw.bgw_type, BGW_MAXLEN, "logical replication parallel worker"); + + memcpy(bgw.bgw_extra, &subworker_dsm, sizeof(dsm_handle)); + break; + + case WORKERTYPE_TABLESYNC: + snprintf(bgw.bgw_function_name, BGW_MAXLEN, "TablesyncWorkerMain"); + snprintf(bgw.bgw_name, BGW_MAXLEN, + "logical replication tablesync worker for subscription %u sync %u", + subid, + relid); + snprintf(bgw.bgw_type, BGW_MAXLEN, "logical replication tablesync worker"); + break; + + case WORKERTYPE_UNKNOWN: + /* Should never happen. */ + elog(ERROR, "unknown worker type"); + } bgw.bgw_restart_time = BGW_NEVER_RESTART; bgw.bgw_notify_pid = MyProcPid; bgw.bgw_main_arg = Int32GetDatum(slot); - if (is_parallel_apply_worker) - memcpy(bgw.bgw_extra, &subworker_dsm, sizeof(dsm_handle)); - if (!RegisterDynamicBackgroundWorker(&bgw, &bgw_handle)) { /* Failed to start worker, so clean up the worker slot. */ @@ -496,7 +511,7 @@ logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, Oid userid, ereport(WARNING, (errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED), errmsg("out of background worker slots"), - errhint("You might need to increase %s.", "max_worker_processes"))); + errhint("You might need to increase \"%s\".", "max_worker_processes"))); return false; } @@ -772,6 +787,7 @@ logicalrep_worker_cleanup(LogicalRepWorker *worker) { Assert(LWLockHeldByMeInMode(LogicalRepWorkerLock, LW_EXCLUSIVE)); + worker->type = WORKERTYPE_UNKNOWN; worker->in_use = false; worker->proc = NULL; worker->dbid = InvalidOid; @@ -841,7 +857,7 @@ logicalrep_sync_worker_count(Oid subid) { LogicalRepWorker *w = &LogicalRepCtx->workers[i]; - if (w->subid == subid && OidIsValid(w->relid)) + if (isTablesyncWorker(w) && w->subid == subid) res++; } @@ -868,7 +884,7 @@ logicalrep_pa_worker_count(Oid subid) { LogicalRepWorker *w = &LogicalRepCtx->workers[i]; - if (w->subid == subid && isParallelApplyWorker(w)) + if (isParallelApplyWorker(w) && w->subid == subid) res++; } @@ -903,14 +919,21 @@ ApplyLauncherRegister(void) { BackgroundWorker bgw; - if (max_logical_replication_workers == 0) + /* + * The logical replication launcher is disabled during binary upgrades, to + * prevent logical replication workers from running on the source cluster. + * That could cause replication origins to move forward after having been + * copied to the target cluster, potentially creating conflicts with the + * copied data files. + */ + if (max_logical_replication_workers == 0 || IsBinaryUpgrade) return; memset(&bgw, 0, sizeof(bgw)); bgw.bgw_flags = BGWORKER_SHMEM_ACCESS | BGWORKER_BACKEND_DATABASE_CONNECTION; bgw.bgw_start_time = BgWorkerStart_RecoveryFinished; - snprintf(bgw.bgw_library_name, BGW_MAXLEN, "postgres"); + snprintf(bgw.bgw_library_name, MAXPGPATH, "postgres"); snprintf(bgw.bgw_function_name, BGW_MAXLEN, "ApplyLauncherMain"); snprintf(bgw.bgw_name, BGW_MAXLEN, "logical replication launcher"); @@ -984,7 +1007,7 @@ logicalrep_launcher_attach_dshmem(void) last_start_times_dsa = dsa_create(LWTRANCHE_LAUNCHER_DSA); dsa_pin(last_start_times_dsa); dsa_pin_mapping(last_start_times_dsa); - last_start_times = dshash_create(last_start_times_dsa, &dsh_params, 0); + last_start_times = dshash_create(last_start_times_dsa, &dsh_params, NULL); /* Store handles in shared memory for other backends to use. */ LogicalRepCtx->last_start_dsa = dsa_get_handle(last_start_times_dsa); @@ -1174,7 +1197,8 @@ ApplyLauncherMain(Datum main_arg) (elapsed = TimestampDifferenceMilliseconds(last_start, now)) >= wal_retrieve_retry_interval) { ApplyLauncherSetWorkerStartTime(sub->oid, now); - logicalrep_worker_launch(sub->dbid, sub->oid, sub->name, + logicalrep_worker_launch(WORKERTYPE_APPLY, + sub->dbid, sub->oid, sub->name, sub->owner, InvalidOid, DSM_HANDLE_INVALID); } @@ -1255,7 +1279,7 @@ GetLeaderApplyWorkerPid(pid_t pid) Datum pg_stat_get_subscription(PG_FUNCTION_ARGS) { -#define PG_STAT_GET_SUBSCRIPTION_COLS 9 +#define PG_STAT_GET_SUBSCRIPTION_COLS 10 Oid subid = PG_ARGISNULL(0) ? InvalidOid : PG_GETARG_OID(0); int i; ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; @@ -1284,7 +1308,7 @@ pg_stat_get_subscription(PG_FUNCTION_ARGS) worker_pid = worker.proc->pid; values[0] = ObjectIdGetDatum(worker.subid); - if (OidIsValid(worker.relid)) + if (isTablesyncWorker(&worker)) values[1] = ObjectIdGetDatum(worker.relid); else nulls[1] = true; @@ -1316,6 +1340,22 @@ pg_stat_get_subscription(PG_FUNCTION_ARGS) else values[8] = TimestampTzGetDatum(worker.reply_time); + switch (worker.type) + { + case WORKERTYPE_APPLY: + values[9] = CStringGetTextDatum("apply"); + break; + case WORKERTYPE_PARALLEL_APPLY: + values[9] = CStringGetTextDatum("parallel apply"); + break; + case WORKERTYPE_TABLESYNC: + values[9] = CStringGetTextDatum("table synchronization"); + break; + case WORKERTYPE_UNKNOWN: + /* Should never happen. */ + elog(ERROR, "unknown worker type"); + } + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index 41243d0187aac..e941bb491d81d 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -2,7 +2,7 @@ * logical.c * PostgreSQL logical decoding coordination * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/logical.c @@ -29,18 +29,19 @@ #include "postgres.h" #include "access/xact.h" -#include "access/xlog_internal.h" +#include "access/xlogutils.h" #include "fmgr.h" #include "miscadmin.h" #include "pgstat.h" #include "replication/decode.h" #include "replication/logical.h" -#include "replication/origin.h" #include "replication/reorderbuffer.h" +#include "replication/slotsync.h" #include "replication/snapbuild.h" #include "storage/proc.h" #include "storage/procarray.h" #include "utils/builtins.h" +#include "utils/inval.h" #include "utils/memutils.h" /* data for errcontext callback */ @@ -117,7 +118,7 @@ CheckLogicalDecodingRequirements(void) if (wal_level < WAL_LEVEL_LOGICAL) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("logical decoding requires wal_level >= logical"))); + errmsg("logical decoding requires \"wal_level\" >= \"logical\""))); if (MyDatabaseId == InvalidOid) ereport(ERROR, @@ -137,7 +138,7 @@ CheckLogicalDecodingRequirements(void) if (GetActiveWalLevelOnStandby() < WAL_LEVEL_LOGICAL) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("logical decoding on standby requires wal_level >= logical on the primary"))); + errmsg("logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary"))); } } @@ -151,6 +152,7 @@ StartupDecodingContext(List *output_plugin_options, TransactionId xmin_horizon, bool need_full_snapshot, bool fast_forward, + bool in_create, XLogReaderRoutine *xl_routine, LogicalOutputPluginWriterPrepareWrite prepare_write, LogicalOutputPluginWriterWrite do_write, @@ -211,7 +213,7 @@ StartupDecodingContext(List *output_plugin_options, ctx->reorder = ReorderBufferAllocate(); ctx->snapshot_builder = AllocateSnapshotBuilder(ctx->reorder, xmin_horizon, start_lsn, - need_full_snapshot, slot->data.two_phase_at); + need_full_snapshot, in_create, slot->data.two_phase_at); ctx->reorder->private_data = ctx; @@ -437,7 +439,7 @@ CreateInitDecodingContext(const char *plugin, ReplicationSlotSave(); ctx = StartupDecodingContext(NIL, restart_lsn, xmin_horizon, - need_full_snapshot, false, + need_full_snapshot, false, true, xl_routine, prepare_write, do_write, update_progress); @@ -516,12 +518,30 @@ CreateDecodingContext(XLogRecPtr start_lsn, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("cannot use physical replication slot for logical decoding"))); - if (slot->data.database != MyDatabaseId) + /* + * We need to access the system tables during decoding to build the + * logical changes unless we are in fast_forward mode where no changes are + * generated. + */ + if (slot->data.database != MyDatabaseId && !fast_forward) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("replication slot \"%s\" was not created in this database", NameStr(slot->data.name)))); + /* + * The slots being synced from the primary can't be used for decoding as + * they are used after failover. However, we do allow advancing the LSNs + * during the synchronization of slots. See update_local_synced_slot. + */ + if (RecoveryInProgress() && slot->data.synced && !IsSyncingReplicationSlots()) + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot use replication slot \"%s\" for logical decoding", + NameStr(slot->data.name)), + errdetail("This replication slot is being synchronized from the primary server."), + errhint("Specify another replication slot.")); + /* * Check if slot has been invalidated due to max_slot_wal_keep_size. Avoid * "cannot get changes" wording in this errmsg because that'd be @@ -573,7 +593,7 @@ CreateDecodingContext(XLogRecPtr start_lsn, ctx = StartupDecodingContext(output_plugin_options, start_lsn, InvalidTransactionId, false, - fast_forward, xl_routine, prepare_write, + fast_forward, false, xl_routine, prepare_write, do_write, update_progress); /* call output plugin initialization callback */ @@ -1754,6 +1774,7 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr current_lsn, XLogRecPtr restart /* don't overwrite if have a newer restart lsn */ if (restart_lsn <= slot->data.restart_lsn) { + SpinLockRelease(&slot->mutex); } /* @@ -1764,6 +1785,7 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr current_lsn, XLogRecPtr restart { slot->candidate_restart_valid = current_lsn; slot->candidate_restart_lsn = restart_lsn; + SpinLockRelease(&slot->mutex); /* our candidate can directly be used */ updated_lsn = true; @@ -1774,7 +1796,7 @@ LogicalIncreaseRestartDecodingForSlot(XLogRecPtr current_lsn, XLogRecPtr restart * might never end up updating if the receiver acks too slowly. A missed * value here will just cause some extra effort after reconnecting. */ - if (slot->candidate_restart_valid == InvalidXLogRecPtr) + else if (slot->candidate_restart_valid == InvalidXLogRecPtr) { slot->candidate_restart_valid = current_lsn; slot->candidate_restart_lsn = restart_lsn; @@ -1949,3 +1971,208 @@ UpdateDecodingStats(LogicalDecodingContext *ctx) rb->totalTxns = 0; rb->totalBytes = 0; } + +/* + * Read up to the end of WAL starting from the decoding slot's restart_lsn. + * Return true if any meaningful/decodable WAL records are encountered, + * otherwise false. + */ +bool +LogicalReplicationSlotHasPendingWal(XLogRecPtr end_of_wal) +{ + bool has_pending_wal = false; + + Assert(MyReplicationSlot); + + PG_TRY(); + { + LogicalDecodingContext *ctx; + + /* + * Create our decoding context in fast_forward mode, passing start_lsn + * as InvalidXLogRecPtr, so that we start processing from the slot's + * confirmed_flush. + */ + ctx = CreateDecodingContext(InvalidXLogRecPtr, + NIL, + true, /* fast_forward */ + XL_ROUTINE(.page_read = read_local_xlog_page, + .segment_open = wal_segment_open, + .segment_close = wal_segment_close), + NULL, NULL, NULL); + + /* + * Start reading at the slot's restart_lsn, which we know points to a + * valid record. + */ + XLogBeginRead(ctx->reader, MyReplicationSlot->data.restart_lsn); + + /* Invalidate non-timetravel entries */ + InvalidateSystemCaches(); + + /* Loop until the end of WAL or some changes are processed */ + while (!has_pending_wal && ctx->reader->EndRecPtr < end_of_wal) + { + XLogRecord *record; + char *errm = NULL; + + record = XLogReadRecord(ctx->reader, &errm); + + if (errm) + elog(ERROR, "could not find record for logical decoding: %s", errm); + + if (record != NULL) + LogicalDecodingProcessRecord(ctx, ctx->reader); + + has_pending_wal = ctx->processing_required; + + CHECK_FOR_INTERRUPTS(); + } + + /* Clean up */ + FreeDecodingContext(ctx); + InvalidateSystemCaches(); + } + PG_CATCH(); + { + /* clear all timetravel entries */ + InvalidateSystemCaches(); + + PG_RE_THROW(); + } + PG_END_TRY(); + + return has_pending_wal; +} + +/* + * Helper function for advancing our logical replication slot forward. + * + * The slot's restart_lsn is used as start point for reading records, while + * confirmed_flush is used as base point for the decoding context. + * + * We cannot just do LogicalConfirmReceivedLocation to update confirmed_flush, + * because we need to digest WAL to advance restart_lsn allowing to recycle + * WAL and removal of old catalog tuples. As decoding is done in fast_forward + * mode, no changes are generated anyway. + * + * *found_consistent_snapshot will be true if the initial decoding snapshot has + * been built; Otherwise, it will be false. + */ +XLogRecPtr +LogicalSlotAdvanceAndCheckSnapState(XLogRecPtr moveto, + bool *found_consistent_snapshot) +{ + LogicalDecodingContext *ctx; + ResourceOwner old_resowner = CurrentResourceOwner; + XLogRecPtr retlsn; + + Assert(moveto != InvalidXLogRecPtr); + + if (found_consistent_snapshot) + *found_consistent_snapshot = false; + + PG_TRY(); + { + /* + * Create our decoding context in fast_forward mode, passing start_lsn + * as InvalidXLogRecPtr, so that we start processing from my slot's + * confirmed_flush. + */ + ctx = CreateDecodingContext(InvalidXLogRecPtr, + NIL, + true, /* fast_forward */ + XL_ROUTINE(.page_read = read_local_xlog_page, + .segment_open = wal_segment_open, + .segment_close = wal_segment_close), + NULL, NULL, NULL); + + /* + * Wait for specified streaming replication standby servers (if any) + * to confirm receipt of WAL up to moveto lsn. + */ + WaitForStandbyConfirmation(moveto); + + /* + * Start reading at the slot's restart_lsn, which we know to point to + * a valid record. + */ + XLogBeginRead(ctx->reader, MyReplicationSlot->data.restart_lsn); + + /* invalidate non-timetravel entries */ + InvalidateSystemCaches(); + + /* Decode records until we reach the requested target */ + while (ctx->reader->EndRecPtr < moveto) + { + char *errm = NULL; + XLogRecord *record; + + /* + * Read records. No changes are generated in fast_forward mode, + * but snapbuilder/slot statuses are updated properly. + */ + record = XLogReadRecord(ctx->reader, &errm); + if (errm) + elog(ERROR, "could not find record while advancing replication slot: %s", + errm); + + /* + * Process the record. Storage-level changes are ignored in + * fast_forward mode, but other modules (such as snapbuilder) + * might still have critical updates to do. + */ + if (record) + LogicalDecodingProcessRecord(ctx, ctx->reader); + + CHECK_FOR_INTERRUPTS(); + } + + if (found_consistent_snapshot && DecodingContextReady(ctx)) + *found_consistent_snapshot = true; + + /* + * Logical decoding could have clobbered CurrentResourceOwner during + * transaction management, so restore the executor's value. (This is + * a kluge, but it's not worth cleaning up right now.) + */ + CurrentResourceOwner = old_resowner; + + if (ctx->reader->EndRecPtr != InvalidXLogRecPtr) + { + LogicalConfirmReceivedLocation(moveto); + + /* + * If only the confirmed_flush LSN has changed the slot won't get + * marked as dirty by the above. Callers on the walsender + * interface are expected to keep track of their own progress and + * don't need it written out. But SQL-interface users cannot + * specify their own start positions and it's harder for them to + * keep track of their progress, so we should make more of an + * effort to save it for them. + * + * Dirty the slot so it is written out at the next checkpoint. The + * LSN position advanced to may still be lost on a crash but this + * makes the data consistent after a clean shutdown. + */ + ReplicationSlotMarkDirty(); + } + + retlsn = MyReplicationSlot->data.confirmed_flush; + + /* free context, call shutdown callback */ + FreeDecodingContext(ctx); + + InvalidateSystemCaches(); + } + PG_CATCH(); + { + /* clear all timetravel entries */ + InvalidateSystemCaches(); + + PG_RE_THROW(); + } + PG_END_TRY(); + + return retlsn; +} diff --git a/src/backend/replication/logical/logicalfuncs.c b/src/backend/replication/logical/logicalfuncs.c index 55a24c02c9480..b4dd5cce75ba5 100644 --- a/src/backend/replication/logical/logicalfuncs.c +++ b/src/backend/replication/logical/logicalfuncs.c @@ -6,7 +6,7 @@ * logical replication slots via SQL. * * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/logicalfuncs.c @@ -17,8 +17,6 @@ #include -#include "access/xact.h" -#include "access/xlog_internal.h" #include "access/xlogrecovery.h" #include "access/xlogutils.h" #include "catalog/pg_type.h" @@ -30,11 +28,9 @@ #include "replication/decode.h" #include "replication/logical.h" #include "replication/message.h" -#include "storage/fd.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/inval.h" -#include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/pg_lsn.h" #include "utils/regproc.h" @@ -109,6 +105,7 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin MemoryContext per_query_ctx; MemoryContext oldcontext; XLogRecPtr end_of_wal; + XLogRecPtr wait_for_wal_lsn; LogicalDecodingContext *ctx; ResourceOwner old_resowner = CurrentResourceOwner; ArrayType *arr; @@ -181,10 +178,10 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin for (i = 0; i < nelems; i += 2) { - char *name = TextDatumGetCString(datum_opts[i]); + char *optname = TextDatumGetCString(datum_opts[i]); char *opt = TextDatumGetCString(datum_opts[i + 1]); - options = lappend(options, makeDefElem(name, (Node *) makeString(opt), -1)); + options = lappend(options, makeDefElem(optname, (Node *) makeString(opt), -1)); } } @@ -228,6 +225,17 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin NameStr(MyReplicationSlot->data.plugin), format_procedure(fcinfo->flinfo->fn_oid)))); + /* + * Wait for specified streaming replication standby servers (if any) + * to confirm receipt of WAL up to wait_for_wal_lsn. + */ + if (XLogRecPtrIsInvalid(upto_lsn)) + wait_for_wal_lsn = end_of_wal; + else + wait_for_wal_lsn = Min(upto_lsn, end_of_wal); + + WaitForStandbyConfirmation(wait_for_wal_lsn); + ctx->output_writer_private = p; /* @@ -362,10 +370,11 @@ pg_logical_emit_message_bytea(PG_FUNCTION_ARGS) bool transactional = PG_GETARG_BOOL(0); char *prefix = text_to_cstring(PG_GETARG_TEXT_PP(1)); bytea *data = PG_GETARG_BYTEA_PP(2); + bool flush = PG_GETARG_BOOL(3); XLogRecPtr lsn; lsn = LogLogicalMessage(prefix, VARDATA_ANY(data), VARSIZE_ANY_EXHDR(data), - transactional); + transactional, flush); PG_RETURN_LSN(lsn); } diff --git a/src/backend/replication/logical/meson.build b/src/backend/replication/logical/meson.build index d48cd4c59019d..3dec36a6de5f5 100644 --- a/src/backend/replication/logical/meson.build +++ b/src/backend/replication/logical/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'applyparallelworker.c', @@ -11,6 +11,7 @@ backend_sources += files( 'proto.c', 'relation.c', 'reorderbuffer.c', + 'slotsync.c', 'snapbuild.c', 'tablesync.c', 'worker.c', diff --git a/src/backend/replication/logical/message.c b/src/backend/replication/logical/message.c index c5de14afc6569..9e41aac28130d 100644 --- a/src/backend/replication/logical/message.c +++ b/src/backend/replication/logical/message.c @@ -3,7 +3,7 @@ * message.c * Generic logical messages. * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/message.c @@ -34,19 +34,17 @@ #include "access/xact.h" #include "access/xloginsert.h" #include "miscadmin.h" -#include "nodes/execnodes.h" -#include "replication/logical.h" #include "replication/message.h" -#include "utils/memutils.h" /* * Write logical decoding message into XLog. */ XLogRecPtr LogLogicalMessage(const char *prefix, const char *message, size_t size, - bool transactional) + bool transactional, bool flush) { xl_logical_message xlrec; + XLogRecPtr lsn; /* * Force xid to be allocated if we're emitting a transactional message. @@ -71,7 +69,15 @@ LogLogicalMessage(const char *prefix, const char *message, size_t size, /* allow origin filtering */ XLogSetRecordFlags(XLOG_INCLUDE_ORIGIN); - return XLogInsert(RM_LOGICALMSG_ID, XLOG_LOGICAL_MESSAGE); + lsn = XLogInsert(RM_LOGICALMSG_ID, XLOG_LOGICAL_MESSAGE); + + /* + * Make sure that the message hits disk before leaving if emitting a + * non-transactional message when flush is requested. + */ + if (!transactional && flush) + XLogFlush(lsn); + return lsn; } /* diff --git a/src/backend/replication/logical/origin.c b/src/backend/replication/logical/origin.c index b0255ffd25a77..419e4814f0577 100644 --- a/src/backend/replication/logical/origin.c +++ b/src/backend/replication/logical/origin.c @@ -3,7 +3,7 @@ * origin.c * Logical replication progress tracking support. * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/origin.c @@ -82,10 +82,9 @@ #include "miscadmin.h" #include "nodes/execnodes.h" #include "pgstat.h" -#include "replication/logical.h" #include "replication/origin.h" +#include "replication/slot.h" #include "storage/condition_variable.h" -#include "storage/copydir.h" #include "storage/fd.h" #include "storage/ipc.h" #include "storage/lmgr.h" @@ -172,9 +171,10 @@ static ReplicationState *replication_states; static ReplicationStateCtl *replication_states_ctl; /* - * Backend-local, cached element from ReplicationState for use in a backend - * replaying remote commits, so we don't have to search ReplicationState for - * the backends current RepOriginId. + * We keep a pointer to this backend's ReplicationState to avoid having to + * search the replication_states array in replorigin_session_advance for each + * remote commit. (Ownership of a backend's own entry can only be changed by + * that backend.) */ static ReplicationState *session_replication_state = NULL; @@ -187,7 +187,7 @@ replorigin_check_prerequisites(bool check_slots, bool recoveryOK) if (check_slots && max_replication_slots == 0) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("cannot query or manipulate replication origin when max_replication_slots = 0"))); + errmsg("cannot query or manipulate replication origin when \"max_replication_slots\" is 0"))); if (!recoveryOK && RecoveryInProgress()) ereport(ERROR, @@ -795,7 +795,7 @@ StartupReplicationOrigin(void) if (last_state == max_replication_slots) ereport(PANIC, (errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED), - errmsg("could not find free replication state, increase max_replication_slots"))); + errmsg("could not find free replication state, increase \"max_replication_slots\""))); /* copy data to shared memory */ replication_states[last_state].roident = disk_state.roident; @@ -954,7 +954,7 @@ replorigin_advance(RepOriginId node, (errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED), errmsg("could not find free replication state slot for replication origin with ID %d", node), - errhint("Increase max_replication_slots and try again."))); + errhint("Increase \"max_replication_slots\" and try again."))); if (replication_state == NULL) { @@ -1056,10 +1056,12 @@ ReplicationOriginExitCleanup(int code, Datum arg) { ConditionVariable *cv = NULL; + if (session_replication_state == NULL) + return; + LWLockAcquire(ReplicationOriginLock, LW_EXCLUSIVE); - if (session_replication_state != NULL && - session_replication_state->acquired_by == MyProcPid) + if (session_replication_state->acquired_by == MyProcPid) { cv = &session_replication_state->origin_cv; @@ -1144,6 +1146,7 @@ replorigin_session_setup(RepOriginId node, int acquired_by) /* ok, found slot */ session_replication_state = curstate; + break; } @@ -1152,7 +1155,7 @@ replorigin_session_setup(RepOriginId node, int acquired_by) (errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED), errmsg("could not find free replication state slot for replication origin with ID %d", node), - errhint("Increase max_replication_slots and try again."))); + errhint("Increase \"max_replication_slots\" and try again."))); else if (session_replication_state == NULL) { /* initialize new slot */ diff --git a/src/backend/replication/logical/proto.c b/src/backend/replication/logical/proto.c index f3087132758f4..95c09c95167d0 100644 --- a/src/backend/replication/logical/proto.c +++ b/src/backend/replication/logical/proto.c @@ -3,7 +3,7 @@ * proto.c * logical replication protocol functions * - * Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Copyright (c) 2015-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/proto.c @@ -851,7 +851,7 @@ logicalrep_write_tuple(StringInfo out, Relation rel, TupleTableSlot *slot, pq_sendbyte(out, LOGICALREP_COLUMN_TEXT); outputstr = OidOutputFunctionCall(typclass->typoutput, values[i]); - pq_sendcountedtext(out, outputstr, strlen(outputstr), false); + pq_sendcountedtext(out, outputstr, strlen(outputstr)); pfree(outputstr); } @@ -879,6 +879,7 @@ logicalrep_read_tuple(StringInfo in, LogicalRepTupleData *tuple) /* Read the data */ for (i = 0; i < natts; i++) { + char *buff; char kind; int len; StringInfo value = &tuple->colvalues[i]; @@ -899,19 +900,18 @@ logicalrep_read_tuple(StringInfo in, LogicalRepTupleData *tuple) len = pq_getmsgint(in, 4); /* read length */ /* and data */ - value->data = palloc(len + 1); - pq_copymsgbytes(in, value->data, len); + buff = palloc(len + 1); + pq_copymsgbytes(in, buff, len); /* - * Not strictly necessary for LOGICALREP_COLUMN_BINARY, but - * per StringInfo practice. + * NUL termination is required for LOGICALREP_COLUMN_TEXT mode + * as input functions require that. For + * LOGICALREP_COLUMN_BINARY it's not technically required, but + * it's harmless. */ - value->data[len] = '\0'; + buff[len] = '\0'; - /* make StringInfo fully valid */ - value->len = len; - value->cursor = 0; - value->maxlen = len; + initStringInfoFromString(value, buff, len); break; default: elog(ERROR, "unrecognized data representation type '%c'", kind); @@ -1213,9 +1213,11 @@ logicalrep_read_stream_abort(StringInfo in, /* * Get string representing LogicalRepMsgType. */ -char * +const char * logicalrep_message_type(LogicalRepMsgType action) { + static char err_unknown[20]; + switch (action) { case LOGICAL_REP_MSG_BEGIN: @@ -1258,7 +1260,12 @@ logicalrep_message_type(LogicalRepMsgType action) return "STREAM PREPARE"; } - elog(ERROR, "invalid logical replication message type \"%c\"", action); + /* + * This message provides context in the error raised when applying a + * logical message. So we can't throw an error here. Return an unknown + * indicator value so that the original error is still reported. + */ + snprintf(err_unknown, sizeof(err_unknown), "??? (%d)", action); - return NULL; /* keep compiler quiet */ + return err_unknown; } diff --git a/src/backend/replication/logical/relation.c b/src/backend/replication/logical/relation.c index 57ad22b48a1bd..f139e7b01e9c1 100644 --- a/src/backend/replication/logical/relation.c +++ b/src/backend/replication/logical/relation.c @@ -2,7 +2,7 @@ * relation.c * PostgreSQL logical replication relation mapping cache * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/relation.c @@ -17,10 +17,12 @@ #include "postgres.h" +#ifdef USE_ASSERT_CHECKING +#include "access/amapi.h" +#endif #include "access/genam.h" #include "access/table.h" #include "catalog/namespace.h" -#include "catalog/pg_am_d.h" #include "catalog/pg_subscription_rel.h" #include "executor/executor.h" #include "nodes/makefuncs.h" @@ -654,7 +656,6 @@ logicalrep_partition_open(LogicalRepRelMapEntry *root, int i; /* Remote relation is copied as-is from the root entry. */ - entry = &part_entry->relmapentry; entry->remoterel.remoteid = remoterel->remoteid; entry->remoterel.nspname = pstrdup(remoterel->nspname); entry->remoterel.relname = pstrdup(remoterel->relname); @@ -731,74 +732,9 @@ logicalrep_partition_open(LogicalRepRelMapEntry *root, return entry; } -/* - * Returns true if the given index consists only of expressions such as: - * CREATE INDEX idx ON table(foo(col)); - * - * Returns false even if there is one column reference: - * CREATE INDEX idx ON table(foo(col), col_2); - */ -static bool -IsIndexOnlyOnExpression(IndexInfo *indexInfo) -{ - for (int i = 0; i < indexInfo->ii_NumIndexKeyAttrs; i++) - { - AttrNumber attnum = indexInfo->ii_IndexAttrNumbers[i]; - - if (AttributeNumberIsValid(attnum)) - return false; - } - - return true; -} - -/* - * Returns true if the attrmap contains the leftmost column of the index. - * Otherwise returns false. - * - * attrmap is a map of local attributes to remote ones. We can consult this - * map to check whether the local index attribute has a corresponding remote - * attribute. - */ -static bool -RemoteRelContainsLeftMostColumnOnIdx(IndexInfo *indexInfo, AttrMap *attrmap) -{ - AttrNumber keycol; - - Assert(indexInfo->ii_NumIndexAttrs >= 1); - - keycol = indexInfo->ii_IndexAttrNumbers[0]; - if (!AttributeNumberIsValid(keycol)) - return false; - - if (attrmap->maplen <= AttrNumberGetAttrOffset(keycol)) - return false; - - return attrmap->attnums[AttrNumberGetAttrOffset(keycol)] >= 0; -} - /* * Returns the oid of an index that can be used by the apply worker to scan - * the relation. The index must be btree, non-partial, and have at least - * one column reference (i.e. cannot consist of only expressions). These - * limitations help to keep the index scan similar to PK/RI index scans. - * - * Note that the limitations of index scans for replica identity full only - * adheres to a subset of the limitations of PK/RI. For example, we support - * columns that are marked as [NULL] or we are not interested in the [NOT - * DEFERRABLE] aspect of constraints here. It works for us because we always - * compare the tuples for non-PK/RI index scans. See - * RelationFindReplTupleByIndex(). - * - * XXX: There are no fundamental problems for supporting non-btree indexes. - * We mostly need to relax the limitations in RelationFindReplTupleByIndex(). - * For partial indexes, the required changes are likely to be larger. If - * none of the tuples satisfy the expression for the index scan, we fall-back - * to sequential execution, which might not be a good idea in some cases. - * - * We also skip indexes if the remote relation does not contain the leftmost - * column of the index. This is because in most such cases sequential scan is - * favorable over index scan. + * the relation. * * We expect to call this function when REPLICA IDENTITY FULL is defined for * the remote relation. @@ -809,25 +745,20 @@ static Oid FindUsableIndexForReplicaIdentityFull(Relation localrel, AttrMap *attrmap) { List *idxlist = RelationGetIndexList(localrel); - ListCell *lc; - foreach(lc, idxlist) + foreach_oid(idxoid, idxlist) { - Oid idxoid = lfirst_oid(lc); bool isUsableIdx; - bool containsLeftMostCol; Relation idxRel; IndexInfo *idxInfo; idxRel = index_open(idxoid, AccessShareLock); idxInfo = BuildIndexInfo(idxRel); - isUsableIdx = IsIndexUsableForReplicaIdentityFull(idxInfo); - containsLeftMostCol = - RemoteRelContainsLeftMostColumnOnIdx(idxInfo, attrmap); + isUsableIdx = IsIndexUsableForReplicaIdentityFull(idxInfo, attrmap); index_close(idxRel, AccessShareLock); /* Return the first eligible index found */ - if (isUsableIdx && containsLeftMostCol) + if (isUsableIdx) return idxoid; } @@ -835,23 +766,86 @@ FindUsableIndexForReplicaIdentityFull(Relation localrel, AttrMap *attrmap) } /* - * Returns true if the index is usable for replica identity full. For details, - * see FindUsableIndexForReplicaIdentityFull. + * Returns true if the index is usable for replica identity full. + * + * The index must be btree or hash, non-partial, and the leftmost field must be + * a column (not an expression) that references the remote relation column. These + * limitations help to keep the index scan similar to PK/RI index scans. + * + * attrmap is a map of local attributes to remote ones. We can consult this + * map to check whether the local index attribute has a corresponding remote + * attribute. + * + * Note that the limitations of index scans for replica identity full only + * adheres to a subset of the limitations of PK/RI. For example, we support + * columns that are marked as [NULL] or we are not interested in the [NOT + * DEFERRABLE] aspect of constraints here. It works for us because we always + * compare the tuples for non-PK/RI index scans. See + * RelationFindReplTupleByIndex(). + * + * The reasons why only Btree and Hash indexes can be considered as usable are: + * + * 1) Other index access methods don't have a fixed strategy for equality + * operation. Refer get_equal_strategy_number_for_am(). + * + * 2) For indexes other than PK and REPLICA IDENTITY, we need to match the + * local and remote tuples. The equality routine tuples_equal() cannot accept + * a datatype (e.g. point or box) that does not have a default operator class + * for Btree or Hash. + * + * XXX: Note that BRIN and GIN indexes do not implement "amgettuple" which + * will be used later to fetch the tuples. See RelationFindReplTupleByIndex(). + * + * XXX: To support partial indexes, the required changes are likely to be larger. + * If none of the tuples satisfy the expression for the index scan, we fall-back + * to sequential execution, which might not be a good idea in some cases. */ bool -IsIndexUsableForReplicaIdentityFull(IndexInfo *indexInfo) +IsIndexUsableForReplicaIdentityFull(IndexInfo *indexInfo, AttrMap *attrmap) { - bool is_btree = (indexInfo->ii_Am == BTREE_AM_OID); - bool is_partial = (indexInfo->ii_Predicate != NIL); - bool is_only_on_expression = IsIndexOnlyOnExpression(indexInfo); + AttrNumber keycol; - return is_btree && !is_partial && !is_only_on_expression; + /* Ensure that the index access method has a valid equal strategy */ + if (get_equal_strategy_number_for_am(indexInfo->ii_Am) == InvalidStrategy) + return false; + + /* The index must not be a partial index */ + if (indexInfo->ii_Predicate != NIL) + return false; + + Assert(indexInfo->ii_NumIndexAttrs >= 1); + + /* The leftmost index field must not be an expression */ + keycol = indexInfo->ii_IndexAttrNumbers[0]; + if (!AttributeNumberIsValid(keycol)) + return false; + + /* + * And the leftmost index field must reference the remote relation column. + * This is because if it doesn't, the sequential scan is favorable over + * index scan in most cases. + */ + if (attrmap->maplen <= AttrNumberGetAttrOffset(keycol) || + attrmap->attnums[AttrNumberGetAttrOffset(keycol)] < 0) + return false; + +#ifdef USE_ASSERT_CHECKING + { + IndexAmRoutine *amroutine; + + /* The given index access method must implement amgettuple. */ + amroutine = GetIndexAmRoutineByAmId(indexInfo->ii_Am, false); + Assert(amroutine->amgettuple != NULL); + } +#endif + + return true; } /* - * Get replica identity index or if it is not defined a primary key. - * - * If neither is defined, returns InvalidOid + * Return the OID of the replica identity index if one is defined; + * the OID of the PK if one exists and is not deferrable; + * otherwise, InvalidOid. */ Oid GetRelationIdentityOrPK(Relation rel) diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 26d252bd87571..03eb005c39d75 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -4,7 +4,7 @@ * PostgreSQL logical replay/reorder buffer management * * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -32,7 +32,7 @@ * * In order to cope with large transactions - which can be several times as * big as the available memory - this module supports spooling the contents - * of a large transactions to disk. When the transaction is replayed the + * of large transactions to disk. When the transaction is replayed the * contents of individual (sub-)transactions will be read from disk in * chunks. * @@ -67,6 +67,11 @@ * allocator, evicting the oldest changes would make it more likely the * memory gets actually freed. * + * We use a max-heap with transaction size as the key to efficiently find + * the largest transaction. We update the max-heap whenever the memory + * counter is updated; however transactions with size 0 are not stored in + * the heap, because they have no changes to evict. + * * We still rely on max_changes_in_memory when loading serialized changes * back into memory. At that point we can't use the memory limit directly * as we load the subxacts independently. One option to deal with this @@ -91,6 +96,7 @@ #include "access/xact.h" #include "access/xlog_internal.h" #include "catalog/catalog.h" +#include "common/int.h" #include "lib/binaryheap.h" #include "miscadmin.h" #include "pgstat.h" @@ -102,13 +108,10 @@ #include "storage/fd.h" #include "storage/sinval.h" #include "utils/builtins.h" -#include "utils/combocid.h" -#include "utils/memdebug.h" #include "utils/memutils.h" #include "utils/rel.h" #include "utils/relfilenumbermap.h" - /* entry for a hash table we use to map from xid to our transaction state */ typedef struct ReorderBufferTXNByIdEnt { @@ -210,7 +213,7 @@ int logical_decoding_work_mem; static const Size max_changes_in_memory = 4096; /* XXX for restore only */ /* GUC variable */ -int logical_replication_mode = LOGICAL_REP_MODE_BUFFERED; +int debug_logical_replication_streaming = DEBUG_LOGICAL_REP_STREAMING_BUFFERED; /* --------------------------------------- * primary reorderbuffer support routines @@ -260,6 +263,7 @@ static void ReorderBufferTruncateTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, static void ReorderBufferCleanupSerializedTXNs(const char *slotname); static void ReorderBufferSerializedPath(char *path, ReplicationSlot *slot, TransactionId xid, XLogSegNo segno); +static int ReorderBufferTXNSizeCompare(const pairingheap_node *a, const pairingheap_node *b, void *arg); static void ReorderBufferFreeSnap(ReorderBuffer *rb, Snapshot snap); static Snapshot ReorderBufferCopySnap(ReorderBuffer *rb, Snapshot orig_snap, @@ -294,6 +298,7 @@ static void ReorderBufferToastAppendChunk(ReorderBuffer *rb, ReorderBufferTXN *t static Size ReorderBufferChangeSize(ReorderBufferChange *change); static void ReorderBufferChangeMemoryUpdate(ReorderBuffer *rb, ReorderBufferChange *change, + ReorderBufferTXN *txn, bool addition, Size sz); /* @@ -332,15 +337,20 @@ ReorderBufferAllocate(void) sizeof(ReorderBufferTXN)); /* - * XXX the allocation sizes used below pre-date generation context's block - * growing code. These values should likely be benchmarked and set to - * more suitable values. + * To minimize memory fragmentation caused by long-running transactions + * with changes spanning multiple memory blocks, we use a single + * fixed-size memory block for decoded tuple storage. The performance + * testing showed that the default memory block size maintains logical + * decoding performance without causing fragmentation due to concurrent + * transactions. One might think that we can use the max size as + * SLAB_LARGE_BLOCK_SIZE but the test also showed it doesn't help resolve + * the memory fragmentation. */ buffer->tup_context = GenerationContextCreate(new_ctx, "Tuples", - SLAB_LARGE_BLOCK_SIZE, - SLAB_LARGE_BLOCK_SIZE, - SLAB_LARGE_BLOCK_SIZE); + SLAB_DEFAULT_BLOCK_SIZE, + SLAB_DEFAULT_BLOCK_SIZE, + SLAB_DEFAULT_BLOCK_SIZE); hash_ctl.keysize = sizeof(TransactionId); hash_ctl.entrysize = sizeof(ReorderBufferTXNByIdEnt); @@ -356,6 +366,9 @@ ReorderBufferAllocate(void) buffer->outbufsize = 0; buffer->size = 0; + /* txn_heap is ordered by transaction size */ + buffer->txn_heap = pairingheap_allocate(ReorderBufferTXNSizeCompare, NULL); + buffer->spillTxns = 0; buffer->spillCount = 0; buffer->spillBytes = 0; @@ -459,6 +472,9 @@ ReorderBufferReturnTXN(ReorderBuffer *rb, ReorderBufferTXN *txn) /* Reset the toast hash */ ReorderBufferToastReset(rb, txn); + /* All changes must be deallocated */ + Assert(txn->size == 0); + pfree(txn); } @@ -486,7 +502,7 @@ ReorderBufferReturnChange(ReorderBuffer *rb, ReorderBufferChange *change, { /* update memory accounting info */ if (upd_mem) - ReorderBufferChangeMemoryUpdate(rb, change, false, + ReorderBufferChangeMemoryUpdate(rb, change, NULL, false, ReorderBufferChangeSize(change)); /* free contained data */ @@ -498,13 +514,13 @@ ReorderBufferReturnChange(ReorderBuffer *rb, ReorderBufferChange *change, case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT: if (change->data.tp.newtuple) { - ReorderBufferReturnTupleBuf(rb, change->data.tp.newtuple); + ReorderBufferReturnTupleBuf(change->data.tp.newtuple); change->data.tp.newtuple = NULL; } if (change->data.tp.oldtuple) { - ReorderBufferReturnTupleBuf(rb, change->data.tp.oldtuple); + ReorderBufferReturnTupleBuf(change->data.tp.oldtuple); change->data.tp.oldtuple = NULL; } break; @@ -547,32 +563,29 @@ ReorderBufferReturnChange(ReorderBuffer *rb, ReorderBufferChange *change, } /* - * Get a fresh ReorderBufferTupleBuf fitting at least a tuple of size - * tuple_len (excluding header overhead). + * Get a fresh HeapTuple fitting a tuple of size tuple_len (excluding header + * overhead). */ -ReorderBufferTupleBuf * +HeapTuple ReorderBufferGetTupleBuf(ReorderBuffer *rb, Size tuple_len) { - ReorderBufferTupleBuf *tuple; + HeapTuple tuple; Size alloc_len; alloc_len = tuple_len + SizeofHeapTupleHeader; - tuple = (ReorderBufferTupleBuf *) - MemoryContextAlloc(rb->tup_context, - sizeof(ReorderBufferTupleBuf) + - MAXIMUM_ALIGNOF + alloc_len); - tuple->alloc_tuple_size = alloc_len; - tuple->tuple.t_data = ReorderBufferTupleBufData(tuple); + tuple = (HeapTuple) MemoryContextAlloc(rb->tup_context, + HEAPTUPLESIZE + alloc_len); + tuple->t_data = (HeapTupleHeader) ((char *) tuple + HEAPTUPLESIZE); return tuple; } /* - * Free a ReorderBufferTupleBuf. + * Free a HeapTuple returned by ReorderBufferGetTupleBuf(). */ void -ReorderBufferReturnTupleBuf(ReorderBuffer *rb, ReorderBufferTupleBuf *tuple) +ReorderBufferReturnTupleBuf(HeapTuple tuple) { pfree(tuple); } @@ -820,7 +833,7 @@ ReorderBufferQueueChange(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, txn->nentries_mem++; /* update memory accounting information */ - ReorderBufferChangeMemoryUpdate(rb, change, true, + ReorderBufferChangeMemoryUpdate(rb, change, NULL, true, ReorderBufferChangeSize(change)); /* process partial change */ @@ -1501,6 +1514,7 @@ ReorderBufferCleanupTXN(ReorderBuffer *rb, ReorderBufferTXN *txn) { bool found; dlist_mutable_iter iter; + Size mem_freed = 0; /* cleanup subtransactions & their changes */ dlist_foreach_modify(iter, &txn->subtxns) @@ -1530,9 +1544,20 @@ ReorderBufferCleanupTXN(ReorderBuffer *rb, ReorderBufferTXN *txn) /* Check we're not mixing changes from different transactions. */ Assert(change->txn == txn); - ReorderBufferReturnChange(rb, change, true); + /* + * Instead of updating the memory counter for individual changes, we + * sum up the size of memory to free so we can update the memory + * counter all together below. This saves costs of maintaining the + * max-heap. + */ + mem_freed += ReorderBufferChangeSize(change); + + ReorderBufferReturnChange(rb, change, false); } + /* Update the memory counter */ + ReorderBufferChangeMemoryUpdate(rb, NULL, txn, false, mem_freed); + /* * Cleanup the tuplecids we stored for decoding catalog snapshot access. * They are always stored in the toplevel transaction. @@ -1608,6 +1633,7 @@ static void ReorderBufferTruncateTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, bool txn_prepared) { dlist_mutable_iter iter; + Size mem_freed = 0; /* cleanup subtransactions & their changes */ dlist_foreach_modify(iter, &txn->subtxns) @@ -1640,9 +1666,20 @@ ReorderBufferTruncateTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, bool txn_prep /* remove the change from it's containing list */ dlist_delete(&change->node); - ReorderBufferReturnChange(rb, change, true); + /* + * Instead of updating the memory counter for individual changes, we + * sum up the size of memory to free so we can update the memory + * counter all together below. This saves costs of maintaining the + * max-heap. + */ + mem_freed += ReorderBufferChangeSize(change); + + ReorderBufferReturnChange(rb, change, false); } + /* Update the memory counter */ + ReorderBufferChangeMemoryUpdate(rb, NULL, txn, false, mem_freed); + /* * Mark the transaction as streamed. * @@ -2051,6 +2088,9 @@ ReorderBufferResetTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, rb->stream_stop(rb, txn, last_lsn); ReorderBufferSaveTXNSnapshot(rb, txn, snapshot_now, command_id); } + + /* All changes must be deallocated */ + Assert(txn->size == 0); } /* @@ -3082,10 +3122,10 @@ ReorderBufferImmediateInvalidation(ReorderBuffer *rb, uint32 ninvalidations, * least once for every xid in XLogRecord->xl_xid (other places in records * may, but do not have to be passed through here). * - * Reorderbuffer keeps some datastructures about transactions in LSN order, + * Reorderbuffer keeps some data structures about transactions in LSN order, * for efficiency. To do that it has to know about when transactions are seen * first in the WAL. As many types of records are not actually interesting for - * logical decoding, they do not necessarily pass though here. + * logical decoding, they do not necessarily pass through here. */ void ReorderBufferProcessXid(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn) @@ -3169,6 +3209,9 @@ ReorderBufferAddNewCommandId(ReorderBuffer *rb, TransactionId xid, * decide if we reached the memory limit, the transaction counter allows * us to quickly pick the largest transaction for eviction. * + * Either txn or change must be non-NULL at least. We update the memory + * counter of txn if it's non-NULL, otherwise change->txn. + * * When streaming is enabled, we need to update the toplevel transaction * counters instead - we don't really care about subtransactions as we * can't stream them individually anyway, and we only pick toplevel @@ -3177,22 +3220,27 @@ ReorderBufferAddNewCommandId(ReorderBuffer *rb, TransactionId xid, static void ReorderBufferChangeMemoryUpdate(ReorderBuffer *rb, ReorderBufferChange *change, + ReorderBufferTXN *txn, bool addition, Size sz) { - ReorderBufferTXN *txn; ReorderBufferTXN *toptxn; - Assert(change->txn); + Assert(txn || change); /* * Ignore tuple CID changes, because those are not evicted when reaching * memory limit. So we just don't count them, because it might easily * trigger a pointless attempt to spill. */ - if (change->action == REORDER_BUFFER_CHANGE_INTERNAL_TUPLECID) + if (change && change->action == REORDER_BUFFER_CHANGE_INTERNAL_TUPLECID) + return; + + if (sz == 0) return; - txn = change->txn; + if (txn == NULL) + txn = change->txn; + Assert(txn != NULL); /* * Update the total size in top level as well. This is later used to @@ -3202,11 +3250,18 @@ ReorderBufferChangeMemoryUpdate(ReorderBuffer *rb, if (addition) { + Size oldsize = txn->size; + txn->size += sz; rb->size += sz; /* Update the total size in the top transaction. */ toptxn->total_size += sz; + + /* Update the max-heap */ + if (oldsize != 0) + pairingheap_remove(rb->txn_heap, &txn->txn_node); + pairingheap_add(rb->txn_heap, &txn->txn_node); } else { @@ -3216,6 +3271,11 @@ ReorderBufferChangeMemoryUpdate(ReorderBuffer *rb, /* Update the total size in the top transaction. */ toptxn->total_size -= sz; + + /* Update the max-heap */ + pairingheap_remove(rb->txn_heap, &txn->txn_node); + if (txn->size != 0) + pairingheap_add(rb->txn_heap, &txn->txn_node); } Assert(txn->size <= rb->size); @@ -3471,33 +3531,32 @@ ReorderBufferSerializeReserve(ReorderBuffer *rb, Size sz) } } + +/* Compare two transactions by size */ +static int +ReorderBufferTXNSizeCompare(const pairingheap_node *a, const pairingheap_node *b, void *arg) +{ + const ReorderBufferTXN *ta = pairingheap_const_container(ReorderBufferTXN, txn_node, a); + const ReorderBufferTXN *tb = pairingheap_const_container(ReorderBufferTXN, txn_node, b); + + if (ta->size < tb->size) + return -1; + if (ta->size > tb->size) + return 1; + return 0; +} + /* * Find the largest transaction (toplevel or subxact) to evict (spill to disk). - * - * XXX With many subtransactions this might be quite slow, because we'll have - * to walk through all of them. There are some options how we could improve - * that: (a) maintain some secondary structure with transactions sorted by - * amount of changes, (b) not looking for the entirely largest transaction, - * but e.g. for transaction using at least some fraction of the memory limit, - * and (c) evicting multiple transactions at once, e.g. to free a given portion - * of the memory limit (e.g. 50%). */ static ReorderBufferTXN * ReorderBufferLargestTXN(ReorderBuffer *rb) { - HASH_SEQ_STATUS hash_seq; - ReorderBufferTXNByIdEnt *ent; - ReorderBufferTXN *largest = NULL; - - hash_seq_init(&hash_seq, rb->by_txn); - while ((ent = hash_seq_search(&hash_seq)) != NULL) - { - ReorderBufferTXN *txn = ent->txn; + ReorderBufferTXN *largest; - /* if the current transaction is larger, remember it */ - if ((!largest) || (txn->size > largest->size)) - largest = txn; - } + /* Get the largest transaction from the max-heap */ + largest = pairingheap_container(ReorderBufferTXN, txn_node, + pairingheap_first(rb->txn_heap)); Assert(largest); Assert(largest->size > 0); @@ -3517,11 +3576,11 @@ ReorderBufferLargestTXN(ReorderBuffer *rb) * snapshot because we don't decode such transactions. Also, we do not select * the transaction which doesn't have any streamable change. * - * Note that, we skip transactions that contains incomplete changes. There + * Note that, we skip transactions that contain incomplete changes. There * is a scope of optimization here such that we can select the largest * transaction which has incomplete changes. But that will make the code and * design quite complex and that might not be worth the benefit. If we plan to - * stream the transactions that contains incomplete changes then we need to + * stream the transactions that contain incomplete changes then we need to * find a way to partially stream/truncate the transaction changes in-memory * and build a mechanism to partially truncate the spilled files. * Additionally, whenever we partially stream the transaction we need to @@ -3566,8 +3625,8 @@ ReorderBufferLargestStreamableTopTXN(ReorderBuffer *rb) * pick the largest (sub)transaction at-a-time to evict and spill its changes to * disk or send to the output plugin until we reach under the memory limit. * - * If logical_replication_mode is set to "immediate", stream or serialize the - * changes immediately. + * If debug_logical_replication_streaming is set to "immediate", stream or + * serialize the changes immediately. * * XXX At this point we select the transactions until we reach under the memory * limit, but we might also adapt a more elaborate eviction strategy - for example @@ -3580,30 +3639,30 @@ ReorderBufferCheckMemoryLimit(ReorderBuffer *rb) ReorderBufferTXN *txn; /* - * Bail out if logical_replication_mode is buffered and we haven't - * exceeded the memory limit. + * Bail out if debug_logical_replication_streaming is buffered and we + * haven't exceeded the memory limit. */ - if (logical_replication_mode == LOGICAL_REP_MODE_BUFFERED && + if (debug_logical_replication_streaming == DEBUG_LOGICAL_REP_STREAMING_BUFFERED && rb->size < logical_decoding_work_mem * 1024L) return; /* - * If logical_replication_mode is immediate, loop until there's no change. - * Otherwise, loop until we reach under the memory limit. One might think - * that just by evicting the largest (sub)transaction we will come under - * the memory limit based on assumption that the selected transaction is - * at least as large as the most recent change (which caused us to go over - * the memory limit). However, that is not true because a user can reduce - * the logical_decoding_work_mem to a smaller value before the most recent - * change. + * If debug_logical_replication_streaming is immediate, loop until there's + * no change. Otherwise, loop until we reach under the memory limit. One + * might think that just by evicting the largest (sub)transaction we will + * come under the memory limit based on assumption that the selected + * transaction is at least as large as the most recent change (which + * caused us to go over the memory limit). However, that is not true + * because a user can reduce the logical_decoding_work_mem to a smaller + * value before the most recent change. */ while (rb->size >= logical_decoding_work_mem * 1024L || - (logical_replication_mode == LOGICAL_REP_MODE_IMMEDIATE && + (debug_logical_replication_streaming == DEBUG_LOGICAL_REP_STREAMING_IMMEDIATE && rb->size > 0)) { /* - * Pick the largest transaction (or subtransaction) and evict it from - * memory by streaming, if possible. Otherwise, spill to disk. + * Pick the largest transaction and evict it from memory by streaming, + * if possible. Otherwise, spill to disk. */ if (ReorderBufferCanStartStreaming(rb) && (txn = ReorderBufferLargestStreamableTopTXN(rb)) != NULL) @@ -3641,6 +3700,7 @@ ReorderBufferCheckMemoryLimit(ReorderBuffer *rb) /* We must be under the memory limit now. */ Assert(rb->size < logical_decoding_work_mem * 1024L); + } /* @@ -3708,11 +3768,14 @@ ReorderBufferSerializeTXN(ReorderBuffer *rb, ReorderBufferTXN *txn) ReorderBufferSerializeChange(rb, txn, fd, change); dlist_delete(&change->node); - ReorderBufferReturnChange(rb, change, true); + ReorderBufferReturnChange(rb, change, false); spilled++; } + /* Update the memory counter */ + ReorderBufferChangeMemoryUpdate(rb, NULL, txn, false, size); + /* update the statistics iff we have spilled anything */ if (spilled) { @@ -3759,8 +3822,8 @@ ReorderBufferSerializeChange(ReorderBuffer *rb, ReorderBufferTXN *txn, case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT: { char *data; - ReorderBufferTupleBuf *oldtup, - *newtup; + HeapTuple oldtup, + newtup; Size oldlen = 0; Size newlen = 0; @@ -3770,14 +3833,14 @@ ReorderBufferSerializeChange(ReorderBuffer *rb, ReorderBufferTXN *txn, if (oldtup) { sz += sizeof(HeapTupleData); - oldlen = oldtup->tuple.t_len; + oldlen = oldtup->t_len; sz += oldlen; } if (newtup) { sz += sizeof(HeapTupleData); - newlen = newtup->tuple.t_len; + newlen = newtup->t_len; sz += newlen; } @@ -3790,19 +3853,19 @@ ReorderBufferSerializeChange(ReorderBuffer *rb, ReorderBufferTXN *txn, if (oldlen) { - memcpy(data, &oldtup->tuple, sizeof(HeapTupleData)); + memcpy(data, oldtup, sizeof(HeapTupleData)); data += sizeof(HeapTupleData); - memcpy(data, oldtup->tuple.t_data, oldlen); + memcpy(data, oldtup->t_data, oldlen); data += oldlen; } if (newlen) { - memcpy(data, &newtup->tuple, sizeof(HeapTupleData)); + memcpy(data, newtup, sizeof(HeapTupleData)); data += sizeof(HeapTupleData); - memcpy(data, newtup->tuple.t_data, newlen); + memcpy(data, newtup->t_data, newlen); data += newlen; } break; @@ -4118,8 +4181,8 @@ ReorderBufferChangeSize(ReorderBufferChange *change) case REORDER_BUFFER_CHANGE_DELETE: case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT: { - ReorderBufferTupleBuf *oldtup, - *newtup; + HeapTuple oldtup, + newtup; Size oldlen = 0; Size newlen = 0; @@ -4129,14 +4192,14 @@ ReorderBufferChangeSize(ReorderBufferChange *change) if (oldtup) { sz += sizeof(HeapTupleData); - oldlen = oldtup->tuple.t_len; + oldlen = oldtup->t_len; sz += oldlen; } if (newtup) { sz += sizeof(HeapTupleData); - newlen = newtup->tuple.t_len; + newlen = newtup->t_len; sz += newlen; } @@ -4365,16 +4428,16 @@ ReorderBufferRestoreChange(ReorderBuffer *rb, ReorderBufferTXN *txn, ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader); /* restore ->tuple */ - memcpy(&change->data.tp.oldtuple->tuple, data, + memcpy(change->data.tp.oldtuple, data, sizeof(HeapTupleData)); data += sizeof(HeapTupleData); /* reset t_data pointer into the new tuplebuf */ - change->data.tp.oldtuple->tuple.t_data = - ReorderBufferTupleBufData(change->data.tp.oldtuple); + change->data.tp.oldtuple->t_data = + (HeapTupleHeader) ((char *) change->data.tp.oldtuple + HEAPTUPLESIZE); /* restore tuple data itself */ - memcpy(change->data.tp.oldtuple->tuple.t_data, data, tuplelen); + memcpy(change->data.tp.oldtuple->t_data, data, tuplelen); data += tuplelen; } @@ -4390,16 +4453,16 @@ ReorderBufferRestoreChange(ReorderBuffer *rb, ReorderBufferTXN *txn, ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader); /* restore ->tuple */ - memcpy(&change->data.tp.newtuple->tuple, data, + memcpy(change->data.tp.newtuple, data, sizeof(HeapTupleData)); data += sizeof(HeapTupleData); /* reset t_data pointer into the new tuplebuf */ - change->data.tp.newtuple->tuple.t_data = - ReorderBufferTupleBufData(change->data.tp.newtuple); + change->data.tp.newtuple->t_data = + (HeapTupleHeader) ((char *) change->data.tp.newtuple + HEAPTUPLESIZE); /* restore tuple data itself */ - memcpy(change->data.tp.newtuple->tuple.t_data, data, tuplelen); + memcpy(change->data.tp.newtuple->t_data, data, tuplelen); data += tuplelen; } @@ -4494,7 +4557,7 @@ ReorderBufferRestoreChange(ReorderBuffer *rb, ReorderBufferTXN *txn, * update the accounting too (subtracting the size from the counters). And * we don't want to underflow there. */ - ReorderBufferChangeMemoryUpdate(rb, change, true, + ReorderBufferChangeMemoryUpdate(rb, change, NULL, true, ReorderBufferChangeSize(change)); } @@ -4646,7 +4709,7 @@ ReorderBufferToastAppendChunk(ReorderBuffer *rb, ReorderBufferTXN *txn, Relation relation, ReorderBufferChange *change) { ReorderBufferToastEnt *ent; - ReorderBufferTupleBuf *newtup; + HeapTuple newtup; bool found; int32 chunksize; bool isnull; @@ -4661,9 +4724,9 @@ ReorderBufferToastAppendChunk(ReorderBuffer *rb, ReorderBufferTXN *txn, Assert(IsToastRelation(relation)); newtup = change->data.tp.newtuple; - chunk_id = DatumGetObjectId(fastgetattr(&newtup->tuple, 1, desc, &isnull)); + chunk_id = DatumGetObjectId(fastgetattr(newtup, 1, desc, &isnull)); Assert(!isnull); - chunk_seq = DatumGetInt32(fastgetattr(&newtup->tuple, 2, desc, &isnull)); + chunk_seq = DatumGetInt32(fastgetattr(newtup, 2, desc, &isnull)); Assert(!isnull); ent = (ReorderBufferToastEnt *) @@ -4686,7 +4749,7 @@ ReorderBufferToastAppendChunk(ReorderBuffer *rb, ReorderBufferTXN *txn, elog(ERROR, "got sequence entry %d for toast chunk %u instead of seq %d", chunk_seq, chunk_id, ent->last_chunk_seq + 1); - chunk = DatumGetPointer(fastgetattr(&newtup->tuple, 3, desc, &isnull)); + chunk = DatumGetPointer(fastgetattr(newtup, 3, desc, &isnull)); Assert(!isnull); /* calculate size so we can allocate the right size at once later */ @@ -4705,8 +4768,8 @@ ReorderBufferToastAppendChunk(ReorderBuffer *rb, ReorderBufferTXN *txn, } /* - * Rejigger change->newtuple to point to in-memory toast tuples instead to - * on-disk toast tuples that may not longer exist (think DROP TABLE or VACUUM). + * Rejigger change->newtuple to point to in-memory toast tuples instead of + * on-disk toast tuples that may no longer exist (think DROP TABLE or VACUUM). * * We cannot replace unchanged toast tuples though, so those will still point * to on-disk toast data. @@ -4717,7 +4780,7 @@ ReorderBufferToastAppendChunk(ReorderBuffer *rb, ReorderBufferTXN *txn, * at unexpected times. * * We simply subtract size of the change before rejiggering the tuple, and - * then adding the new size. This makes it look like the change was removed + * then add the new size. This makes it look like the change was removed * and then added back, except it only tweaks the accounting info. * * In particular it can't trigger serialization, which would be pointless @@ -4737,7 +4800,7 @@ ReorderBufferToastReplace(ReorderBuffer *rb, ReorderBufferTXN *txn, Relation toast_rel; TupleDesc toast_desc; MemoryContext oldcontext; - ReorderBufferTupleBuf *newtup; + HeapTuple newtup; Size old_size; /* no toast tuples changed */ @@ -4777,7 +4840,7 @@ ReorderBufferToastReplace(ReorderBuffer *rb, ReorderBufferTXN *txn, newtup = change->data.tp.newtuple; - heap_deform_tuple(&newtup->tuple, desc, attrs, isnull); + heap_deform_tuple(newtup, desc, attrs, isnull); for (natt = 0; natt < desc->natts; natt++) { @@ -4840,16 +4903,16 @@ ReorderBufferToastReplace(ReorderBuffer *rb, ReorderBufferTXN *txn, /* stitch toast tuple back together from its parts */ dlist_foreach(it, &ent->chunks) { - bool isnull; + bool cisnull; ReorderBufferChange *cchange; - ReorderBufferTupleBuf *ctup; + HeapTuple ctup; Pointer chunk; cchange = dlist_container(ReorderBufferChange, node, it.cur); ctup = cchange->data.tp.newtuple; - chunk = DatumGetPointer(fastgetattr(&ctup->tuple, 3, toast_desc, &isnull)); + chunk = DatumGetPointer(fastgetattr(ctup, 3, toast_desc, &cisnull)); - Assert(!isnull); + Assert(!cisnull); Assert(!VARATT_IS_EXTERNAL(chunk)); Assert(!VARATT_IS_SHORT(chunk)); @@ -4882,11 +4945,11 @@ ReorderBufferToastReplace(ReorderBuffer *rb, ReorderBufferTXN *txn, * the tuplebuf because attrs[] will point back into the current content. */ tmphtup = heap_form_tuple(desc, attrs, isnull); - Assert(newtup->tuple.t_len <= MaxHeapTupleSize); - Assert(ReorderBufferTupleBufData(newtup) == newtup->tuple.t_data); + Assert(newtup->t_len <= MaxHeapTupleSize); + Assert(newtup->t_data == (HeapTupleHeader) ((char *) newtup + HEAPTUPLESIZE)); - memcpy(newtup->tuple.t_data, tmphtup->t_data, tmphtup->t_len); - newtup->tuple.t_len = tmphtup->t_len; + memcpy(newtup->t_data, tmphtup->t_data, tmphtup->t_len); + newtup->t_len = tmphtup->t_len; /* * free resources we won't further need, more persistent stuff will be @@ -4906,9 +4969,9 @@ ReorderBufferToastReplace(ReorderBuffer *rb, ReorderBufferTXN *txn, MemoryContextSwitchTo(oldcontext); /* subtract the old change size */ - ReorderBufferChangeMemoryUpdate(rb, change, false, old_size); + ReorderBufferChangeMemoryUpdate(rb, change, NULL, false, old_size); /* now add the change back, with the correct size */ - ReorderBufferChangeMemoryUpdate(rb, change, true, + ReorderBufferChangeMemoryUpdate(rb, change, NULL, true, ReorderBufferChangeSize(change)); } @@ -5122,11 +5185,7 @@ file_sort_by_lsn(const ListCell *a_p, const ListCell *b_p) RewriteMappingFile *a = (RewriteMappingFile *) lfirst(a_p); RewriteMappingFile *b = (RewriteMappingFile *) lfirst(b_p); - if (a->lsn < b->lsn) - return -1; - else if (a->lsn > b->lsn) - return 1; - return 0; + return pg_cmp_u64(a->lsn, b->lsn); } /* @@ -5278,3 +5337,26 @@ ResolveCminCmaxDuringDecoding(HTAB *tuplecid_data, *cmax = ent->cmax; return true; } + +/* + * Count invalidation messages of specified transaction. + * + * Returns number of messages, and msgs is set to the pointer of the linked + * list for the messages. + */ +uint32 +ReorderBufferGetInvalidations(ReorderBuffer *rb, TransactionId xid, + SharedInvalidationMessage **msgs) +{ + ReorderBufferTXN *txn; + + txn = ReorderBufferTXNByXid(rb, xid, false, NULL, InvalidXLogRecPtr, + false); + + if (txn == NULL) + return 0; + + *msgs = txn->invalidations; + + return txn->ninvalidations; +} diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c new file mode 100644 index 0000000000000..73fe3f56af2b3 --- /dev/null +++ b/src/backend/replication/logical/slotsync.c @@ -0,0 +1,1742 @@ +/*------------------------------------------------------------------------- + * slotsync.c + * Functionality for synchronizing slots to a standby server from the + * primary server. + * + * Copyright (c) 2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/replication/logical/slotsync.c + * + * This file contains the code for slot synchronization on a physical standby + * to fetch logical failover slots information from the primary server, create + * the slots on the standby and synchronize them periodically. + * + * Slot synchronization can be performed either automatically by enabling slot + * sync worker or manually by calling SQL function pg_sync_replication_slots(). + * + * If the WAL corresponding to the remote's restart_lsn is not available on the + * physical standby or the remote's catalog_xmin precedes the oldest xid for + * which it is guaranteed that rows wouldn't have been removed then we cannot + * create the local standby slot because that would mean moving the local slot + * backward and decoding won't be possible via such a slot. In this case, the + * slot will be marked as RS_TEMPORARY. Once the primary server catches up, + * the slot will be marked as RS_PERSISTENT (which means sync-ready) after + * which slot sync worker can perform the sync periodically or user can call + * pg_sync_replication_slots() periodically to perform the syncs. + * + * If synchronized slots fail to build a consistent snapshot from the + * restart_lsn before reaching confirmed_flush_lsn, they would become + * unreliable after promotion due to potential data loss from changes + * before reaching a consistent point. This can happen because the slots can + * be synced at some random time and we may not reach the consistent point + * at the same WAL location as the primary. So, we mark such slots as + * RS_TEMPORARY. Once the decoding from corresponding LSNs can reach a + * consistent point, they will be marked as RS_PERSISTENT. + * + * The slot sync worker waits for some time before the next synchronization, + * with the duration varying based on whether any slots were updated during + * the last cycle. Refer to the comments above wait_for_slot_activity() for + * more details. + * + * Any standby synchronized slots will be dropped if they no longer need + * to be synchronized. See comment atop drop_local_obsolete_slots() for more + * details. + *--------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include + +#include "access/xlog_internal.h" +#include "access/xlogrecovery.h" +#include "catalog/pg_database.h" +#include "commands/dbcommands.h" +#include "libpq/pqsignal.h" +#include "pgstat.h" +#include "postmaster/fork_process.h" +#include "postmaster/interrupt.h" +#include "postmaster/postmaster.h" +#include "replication/logical.h" +#include "replication/slotsync.h" +#include "replication/snapbuild.h" +#include "storage/ipc.h" +#include "storage/lmgr.h" +#include "storage/proc.h" +#include "storage/procarray.h" +#include "tcop/tcopprot.h" +#include "utils/builtins.h" +#include "utils/pg_lsn.h" +#include "utils/ps_status.h" +#include "utils/timeout.h" + +/* + * Struct for sharing information to control slot synchronization. + * + * The slot sync worker's pid is needed by the startup process to shut it + * down during promotion. The startup process shuts down the slot sync worker + * and also sets stopSignaled=true to handle the race condition when the + * postmaster has not noticed the promotion yet and thus may end up restarting + * the slot sync worker. If stopSignaled is set, the worker will exit in such a + * case. The SQL function pg_sync_replication_slots() will also error out if + * this flag is set. Note that we don't need to reset this variable as after + * promotion the slot sync worker won't be restarted because the pmState + * changes to PM_RUN from PM_HOT_STANDBY and we don't support demoting + * primary without restarting the server. See MaybeStartSlotSyncWorker. + * + * The 'syncing' flag is needed to prevent concurrent slot syncs to avoid slot + * overwrites. + * + * The 'last_start_time' is needed by postmaster to start the slot sync worker + * once per SLOTSYNC_RESTART_INTERVAL_SEC. In cases where an immediate restart + * is expected (e.g., slot sync GUCs change), slot sync worker will reset + * last_start_time before exiting, so that postmaster can start the worker + * without waiting for SLOTSYNC_RESTART_INTERVAL_SEC. + */ +typedef struct SlotSyncCtxStruct +{ + pid_t pid; + bool stopSignaled; + bool syncing; + time_t last_start_time; + slock_t mutex; +} SlotSyncCtxStruct; + +SlotSyncCtxStruct *SlotSyncCtx = NULL; + +/* GUC variable */ +bool sync_replication_slots = false; + +/* + * The sleep time (ms) between slot-sync cycles varies dynamically + * (within a MIN/MAX range) according to slot activity. See + * wait_for_slot_activity() for details. + */ +#define MIN_SLOTSYNC_WORKER_NAPTIME_MS 200 +#define MAX_SLOTSYNC_WORKER_NAPTIME_MS 30000 /* 30s */ + +static long sleep_ms = MIN_SLOTSYNC_WORKER_NAPTIME_MS; + +/* The restart interval for slot sync work used by postmaster */ +#define SLOTSYNC_RESTART_INTERVAL_SEC 10 + +/* + * Flag to tell if we are syncing replication slots. Unlike the 'syncing' flag + * in SlotSyncCtxStruct, this flag is true only if the current process is + * performing slot synchronization. + */ +static bool syncing_slots = false; + +/* + * Structure to hold information fetched from the primary server about a logical + * replication slot. + */ +typedef struct RemoteSlot +{ + char *name; + char *plugin; + char *database; + bool two_phase; + bool failover; + XLogRecPtr restart_lsn; + XLogRecPtr confirmed_lsn; + TransactionId catalog_xmin; + + /* RS_INVAL_NONE if valid, or the reason of invalidation */ + ReplicationSlotInvalidationCause invalidated; +} RemoteSlot; + +static void slotsync_failure_callback(int code, Datum arg); +static void update_synced_slots_inactive_since(void); + +/* + * If necessary, update the local synced slot's metadata based on the data + * from the remote slot. + * + * If no update was needed (the data of the remote slot is the same as the + * local slot) return false, otherwise true. + * + * *found_consistent_snapshot will be true iff the remote slot's LSN or xmin is + * modified, and decoding from the corresponding LSN's can reach a + * consistent snapshot. + * + * *remote_slot_precedes will be true if the remote slot's LSN or xmin + * precedes locally reserved position. + */ +static bool +update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid, + bool *found_consistent_snapshot, + bool *remote_slot_precedes) +{ + ReplicationSlot *slot = MyReplicationSlot; + bool updated_xmin_or_lsn = false; + bool updated_config = false; + + Assert(slot->data.invalidated == RS_INVAL_NONE); + + if (found_consistent_snapshot) + *found_consistent_snapshot = false; + + if (remote_slot_precedes) + *remote_slot_precedes = false; + + /* + * Don't overwrite if we already have a newer catalog_xmin and + * restart_lsn. + */ + if (remote_slot->restart_lsn < slot->data.restart_lsn || + TransactionIdPrecedes(remote_slot->catalog_xmin, + slot->data.catalog_xmin)) + { + /* + * This can happen in following situations: + * + * If the slot is temporary, it means either the initial WAL location + * reserved for the local slot is ahead of the remote slot's + * restart_lsn or the initial xmin_horizon computed for the local slot + * is ahead of the remote slot. + * + * If the slot is persistent, restart_lsn of the synced slot could + * still be ahead of the remote slot. Since we use slot advance + * functionality to keep snapbuild/slot updated, it is possible that + * the restart_lsn is advanced to a later position than it has on the + * primary. This can happen when slot advancing machinery finds + * running xacts record after reaching the consistent state at a later + * point than the primary where it serializes the snapshot and updates + * the restart_lsn. + * + * We LOG the message if the slot is temporary as it can help the user + * to understand why the slot is not sync-ready. In the case of a + * persistent slot, it would be a more common case and won't directly + * impact the users, so we used DEBUG1 level to log the message. + */ + ereport(slot->data.persistency == RS_TEMPORARY ? LOG : DEBUG1, + errmsg("could not synchronize replication slot \"%s\" because remote slot precedes local slot", + remote_slot->name), + errdetail("The remote slot has LSN %X/%X and catalog xmin %u, but the local slot has LSN %X/%X and catalog xmin %u.", + LSN_FORMAT_ARGS(remote_slot->restart_lsn), + remote_slot->catalog_xmin, + LSN_FORMAT_ARGS(slot->data.restart_lsn), + slot->data.catalog_xmin)); + + if (remote_slot_precedes) + *remote_slot_precedes = true; + } + + /* + * Attempt to sync LSNs and xmins only if remote slot is ahead of local + * slot. + */ + else if (remote_slot->confirmed_lsn > slot->data.confirmed_flush || + remote_slot->restart_lsn > slot->data.restart_lsn || + TransactionIdFollows(remote_slot->catalog_xmin, + slot->data.catalog_xmin)) + { + /* + * We can't directly copy the remote slot's LSN or xmin unless there + * exists a consistent snapshot at that point. Otherwise, after + * promotion, the slots may not reach a consistent point before the + * confirmed_flush_lsn which can lead to a data loss. To avoid data + * loss, we let slot machinery advance the slot which ensures that + * snapbuilder/slot statuses are updated properly. + */ + if (SnapBuildSnapshotExists(remote_slot->restart_lsn)) + { + /* + * Update the slot info directly if there is a serialized snapshot + * at the restart_lsn, as the slot can quickly reach consistency + * at restart_lsn by restoring the snapshot. + */ + SpinLockAcquire(&slot->mutex); + slot->data.restart_lsn = remote_slot->restart_lsn; + slot->data.confirmed_flush = remote_slot->confirmed_lsn; + slot->data.catalog_xmin = remote_slot->catalog_xmin; + SpinLockRelease(&slot->mutex); + + if (found_consistent_snapshot) + *found_consistent_snapshot = true; + } + else + { + LogicalSlotAdvanceAndCheckSnapState(remote_slot->confirmed_lsn, + found_consistent_snapshot); + + /* Sanity check */ + if (slot->data.confirmed_flush != remote_slot->confirmed_lsn) + ereport(ERROR, + errmsg_internal("synchronized confirmed_flush for slot \"%s\" differs from remote slot", + remote_slot->name), + errdetail_internal("Remote slot has LSN %X/%X but local slot has LSN %X/%X.", + LSN_FORMAT_ARGS(remote_slot->confirmed_lsn), + LSN_FORMAT_ARGS(slot->data.confirmed_flush))); + } + + updated_xmin_or_lsn = true; + } + + if (remote_dbid != slot->data.database || + remote_slot->two_phase != slot->data.two_phase || + remote_slot->failover != slot->data.failover || + strcmp(remote_slot->plugin, NameStr(slot->data.plugin)) != 0) + { + NameData plugin_name; + + /* Avoid expensive operations while holding a spinlock. */ + namestrcpy(&plugin_name, remote_slot->plugin); + + SpinLockAcquire(&slot->mutex); + slot->data.plugin = plugin_name; + slot->data.database = remote_dbid; + slot->data.two_phase = remote_slot->two_phase; + slot->data.failover = remote_slot->failover; + SpinLockRelease(&slot->mutex); + + updated_config = true; + } + + /* + * We have to write the changed xmin to disk *before* we change the + * in-memory value, otherwise after a crash we wouldn't know that some + * catalog tuples might have been removed already. + */ + if (updated_config || updated_xmin_or_lsn) + { + ReplicationSlotMarkDirty(); + ReplicationSlotSave(); + } + + /* + * Now the new xmin is safely on disk, we can let the global value + * advance. We do not take ProcArrayLock or similar since we only advance + * xmin here and there's not much harm done by a concurrent computation + * missing that. + */ + if (updated_xmin_or_lsn) + { + SpinLockAcquire(&slot->mutex); + slot->effective_catalog_xmin = remote_slot->catalog_xmin; + SpinLockRelease(&slot->mutex); + + ReplicationSlotsComputeRequiredXmin(false); + ReplicationSlotsComputeRequiredLSN(); + } + + return updated_config || updated_xmin_or_lsn; +} + +/* + * Get the list of local logical slots that are synchronized from the + * primary server. + */ +static List * +get_local_synced_slots(void) +{ + List *local_slots = NIL; + + LWLockAcquire(ReplicationSlotControlLock, LW_SHARED); + + for (int i = 0; i < max_replication_slots; i++) + { + ReplicationSlot *s = &ReplicationSlotCtl->replication_slots[i]; + + /* Check if it is a synchronized slot */ + if (s->in_use && s->data.synced) + { + Assert(SlotIsLogical(s)); + local_slots = lappend(local_slots, s); + } + } + + LWLockRelease(ReplicationSlotControlLock); + + return local_slots; +} + +/* + * Helper function to check if local_slot is required to be retained. + * + * Return false either if local_slot does not exist in the remote_slots list + * or is invalidated while the corresponding remote slot is still valid, + * otherwise true. + */ +static bool +local_sync_slot_required(ReplicationSlot *local_slot, List *remote_slots) +{ + bool remote_exists = false; + bool locally_invalidated = false; + + foreach_ptr(RemoteSlot, remote_slot, remote_slots) + { + if (strcmp(remote_slot->name, NameStr(local_slot->data.name)) == 0) + { + remote_exists = true; + + /* + * If remote slot is not invalidated but local slot is marked as + * invalidated, then set locally_invalidated flag. + */ + SpinLockAcquire(&local_slot->mutex); + locally_invalidated = + (remote_slot->invalidated == RS_INVAL_NONE) && + (local_slot->data.invalidated != RS_INVAL_NONE); + SpinLockRelease(&local_slot->mutex); + + break; + } + } + + return (remote_exists && !locally_invalidated); +} + +/* + * Drop local obsolete slots. + * + * Drop the local slots that no longer need to be synced i.e. these either do + * not exist on the primary or are no longer enabled for failover. + * + * Additionally, drop any slots that are valid on the primary but got + * invalidated on the standby. This situation may occur due to the following + * reasons: + * - The 'max_slot_wal_keep_size' on the standby is insufficient to retain WAL + * records from the restart_lsn of the slot. + * - 'primary_slot_name' is temporarily reset to null and the physical slot is + * removed. + * These dropped slots will get recreated in next sync-cycle and it is okay to + * drop and recreate such slots as long as these are not consumable on the + * standby (which is the case currently). + * + * Note: Change of 'wal_level' on the primary server to a level lower than + * logical may also result in slot invalidation and removal on the standby. + * This is because such 'wal_level' change is only possible if the logical + * slots are removed on the primary server, so it's expected to see the + * slots being invalidated and removed on the standby too (and re-created + * if they are re-created on the primary server). + */ +static void +drop_local_obsolete_slots(List *remote_slot_list) +{ + List *local_slots = get_local_synced_slots(); + + foreach_ptr(ReplicationSlot, local_slot, local_slots) + { + /* Drop the local slot if it is not required to be retained. */ + if (!local_sync_slot_required(local_slot, remote_slot_list)) + { + bool synced_slot; + + /* + * Use shared lock to prevent a conflict with + * ReplicationSlotsDropDBSlots(), trying to drop the same slot + * during a drop-database operation. + */ + LockSharedObject(DatabaseRelationId, local_slot->data.database, + 0, AccessShareLock); + + /* + * In the small window between getting the slot to drop and + * locking the database, there is a possibility of a parallel + * database drop by the startup process and the creation of a new + * slot by the user. This new user-created slot may end up using + * the same shared memory as that of 'local_slot'. Thus check if + * local_slot is still the synced one before performing actual + * drop. + */ + SpinLockAcquire(&local_slot->mutex); + synced_slot = local_slot->in_use && local_slot->data.synced; + SpinLockRelease(&local_slot->mutex); + + if (synced_slot) + { + ReplicationSlotAcquire(NameStr(local_slot->data.name), true); + ReplicationSlotDropAcquired(); + } + + UnlockSharedObject(DatabaseRelationId, local_slot->data.database, + 0, AccessShareLock); + + ereport(LOG, + errmsg("dropped replication slot \"%s\" of database with OID %u", + NameStr(local_slot->data.name), + local_slot->data.database)); + } + } +} + +/* + * Reserve WAL for the currently active local slot using the specified WAL + * location (restart_lsn). + * + * If the given WAL location has been removed, reserve WAL using the oldest + * existing WAL segment. + */ +static void +reserve_wal_for_local_slot(XLogRecPtr restart_lsn) +{ + XLogSegNo oldest_segno; + XLogSegNo segno; + ReplicationSlot *slot = MyReplicationSlot; + + Assert(slot != NULL); + Assert(XLogRecPtrIsInvalid(slot->data.restart_lsn)); + + while (true) + { + SpinLockAcquire(&slot->mutex); + slot->data.restart_lsn = restart_lsn; + SpinLockRelease(&slot->mutex); + + /* Prevent WAL removal as fast as possible */ + ReplicationSlotsComputeRequiredLSN(); + + XLByteToSeg(slot->data.restart_lsn, segno, wal_segment_size); + + /* + * Find the oldest existing WAL segment file. + * + * Normally, we can determine it by using the last removed segment + * number. However, if no WAL segment files have been removed by a + * checkpoint since startup, we need to search for the oldest segment + * file from the current timeline existing in XLOGDIR. + * + * XXX: Currently, we are searching for the oldest segment in the + * current timeline as there is less chance of the slot's restart_lsn + * from being some prior timeline, and even if it happens, in the + * worst case, we will wait to sync till the slot's restart_lsn moved + * to the current timeline. + */ + oldest_segno = XLogGetLastRemovedSegno() + 1; + + if (oldest_segno == 1) + { + TimeLineID cur_timeline; + + GetWalRcvFlushRecPtr(NULL, &cur_timeline); + oldest_segno = XLogGetOldestSegno(cur_timeline); + } + + elog(DEBUG1, "segno: " UINT64_FORMAT " of purposed restart_lsn for the synced slot, oldest_segno: " UINT64_FORMAT " available", + segno, oldest_segno); + + /* + * If all required WAL is still there, great, otherwise retry. The + * slot should prevent further removal of WAL, unless there's a + * concurrent ReplicationSlotsComputeRequiredLSN() after we've written + * the new restart_lsn above, so normally we should never need to loop + * more than twice. + */ + if (segno >= oldest_segno) + break; + + /* Retry using the location of the oldest wal segment */ + XLogSegNoOffsetToRecPtr(oldest_segno, 0, wal_segment_size, restart_lsn); + } +} + +/* + * If the remote restart_lsn and catalog_xmin have caught up with the + * local ones, then update the LSNs and persist the local synced slot for + * future synchronization; otherwise, do nothing. + * + * Return true if the slot is marked as RS_PERSISTENT (sync-ready), otherwise + * false. + */ +static bool +update_and_persist_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid) +{ + ReplicationSlot *slot = MyReplicationSlot; + bool found_consistent_snapshot = false; + bool remote_slot_precedes = false; + + (void) update_local_synced_slot(remote_slot, remote_dbid, + &found_consistent_snapshot, + &remote_slot_precedes); + + /* + * Check if the primary server has caught up. Refer to the comment atop + * the file for details on this check. + */ + if (remote_slot_precedes) + { + /* + * The remote slot didn't catch up to locally reserved position. + * + * We do not drop the slot because the restart_lsn can be ahead of the + * current location when recreating the slot in the next cycle. It may + * take more time to create such a slot. Therefore, we keep this slot + * and attempt the synchronization in the next cycle. + */ + return false; + } + + /* + * Don't persist the slot if it cannot reach the consistent point from the + * restart_lsn. See comments atop this file. + */ + if (!found_consistent_snapshot) + { + ereport(LOG, + errmsg("could not synchronize replication slot \"%s\"", remote_slot->name), + errdetail("Logical decoding could not find consistent point from local slot's LSN %X/%X.", + LSN_FORMAT_ARGS(slot->data.restart_lsn))); + + return false; + } + + ReplicationSlotPersist(); + + ereport(LOG, + errmsg("newly created replication slot \"%s\" is sync-ready now", + remote_slot->name)); + + return true; +} + +/* + * Synchronize a single slot to the given position. + * + * This creates a new slot if there is no existing one and updates the + * metadata of the slot as per the data received from the primary server. + * + * The slot is created as a temporary slot and stays in the same state until the + * remote_slot catches up with locally reserved position and local slot is + * updated. The slot is then persisted and is considered as sync-ready for + * periodic syncs. + * + * Returns TRUE if the local slot is updated. + */ +static bool +synchronize_one_slot(RemoteSlot *remote_slot, Oid remote_dbid) +{ + ReplicationSlot *slot; + XLogRecPtr latestFlushPtr; + bool slot_updated = false; + + /* + * Make sure that concerned WAL is received and flushed before syncing + * slot to target lsn received from the primary server. + */ + latestFlushPtr = GetStandbyFlushRecPtr(NULL); + if (remote_slot->confirmed_lsn > latestFlushPtr) + { + /* + * Can get here only if GUC 'synchronized_standby_slots' on the + * primary server was not configured correctly. + */ + ereport(AmLogicalSlotSyncWorkerProcess() ? LOG : ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("skipping slot synchronization because the received slot sync" + " LSN %X/%X for slot \"%s\" is ahead of the standby position %X/%X", + LSN_FORMAT_ARGS(remote_slot->confirmed_lsn), + remote_slot->name, + LSN_FORMAT_ARGS(latestFlushPtr))); + + return false; + } + + /* Search for the named slot */ + if ((slot = SearchNamedReplicationSlot(remote_slot->name, true))) + { + bool synced; + + SpinLockAcquire(&slot->mutex); + synced = slot->data.synced; + SpinLockRelease(&slot->mutex); + + /* User-created slot with the same name exists, raise ERROR. */ + if (!synced) + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("exiting from slot synchronization because same" + " name slot \"%s\" already exists on the standby", + remote_slot->name)); + + /* + * The slot has been synchronized before. + * + * It is important to acquire the slot here before checking + * invalidation. If we don't acquire the slot first, there could be a + * race condition that the local slot could be invalidated just after + * checking the 'invalidated' flag here and we could end up + * overwriting 'invalidated' flag to remote_slot's value. See + * InvalidatePossiblyObsoleteSlot() where it invalidates slot directly + * if the slot is not acquired by other processes. + * + * XXX: If it ever turns out that slot acquire/release is costly for + * cases when none of the slot properties is changed then we can do a + * pre-check to ensure that at least one of the slot properties is + * changed before acquiring the slot. + */ + ReplicationSlotAcquire(remote_slot->name, true); + + Assert(slot == MyReplicationSlot); + + /* + * Copy the invalidation cause from remote only if local slot is not + * invalidated locally, we don't want to overwrite existing one. + */ + if (slot->data.invalidated == RS_INVAL_NONE && + remote_slot->invalidated != RS_INVAL_NONE) + { + SpinLockAcquire(&slot->mutex); + slot->data.invalidated = remote_slot->invalidated; + SpinLockRelease(&slot->mutex); + + /* Make sure the invalidated state persists across server restart */ + ReplicationSlotMarkDirty(); + ReplicationSlotSave(); + + slot_updated = true; + } + + /* Skip the sync of an invalidated slot */ + if (slot->data.invalidated != RS_INVAL_NONE) + { + ReplicationSlotRelease(); + return slot_updated; + } + + /* Slot not ready yet, let's attempt to make it sync-ready now. */ + if (slot->data.persistency == RS_TEMPORARY) + { + slot_updated = update_and_persist_local_synced_slot(remote_slot, + remote_dbid); + } + + /* Slot ready for sync, so sync it. */ + else + { + /* + * Sanity check: As long as the invalidations are handled + * appropriately as above, this should never happen. + * + * We don't need to check restart_lsn here. See the comments in + * update_local_synced_slot() for details. + */ + if (remote_slot->confirmed_lsn < slot->data.confirmed_flush) + ereport(ERROR, + errmsg_internal("cannot synchronize local slot \"%s\"", + remote_slot->name), + errdetail_internal("Local slot's start streaming location LSN(%X/%X) is ahead of remote slot's LSN(%X/%X).", + LSN_FORMAT_ARGS(slot->data.confirmed_flush), + LSN_FORMAT_ARGS(remote_slot->confirmed_lsn))); + + slot_updated = update_local_synced_slot(remote_slot, remote_dbid, + NULL, NULL); + } + } + /* Otherwise create the slot first. */ + else + { + NameData plugin_name; + TransactionId xmin_horizon = InvalidTransactionId; + + /* Skip creating the local slot if remote_slot is invalidated already */ + if (remote_slot->invalidated != RS_INVAL_NONE) + return false; + + /* + * We create temporary slots instead of ephemeral slots here because + * we want the slots to survive after releasing them. This is done to + * avoid dropping and re-creating the slots in each synchronization + * cycle if the restart_lsn or catalog_xmin of the remote slot has not + * caught up. + */ + ReplicationSlotCreate(remote_slot->name, true, RS_TEMPORARY, + remote_slot->two_phase, + remote_slot->failover, + true); + + /* For shorter lines. */ + slot = MyReplicationSlot; + + /* Avoid expensive operations while holding a spinlock. */ + namestrcpy(&plugin_name, remote_slot->plugin); + + SpinLockAcquire(&slot->mutex); + slot->data.database = remote_dbid; + slot->data.plugin = plugin_name; + SpinLockRelease(&slot->mutex); + + reserve_wal_for_local_slot(remote_slot->restart_lsn); + + LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); + xmin_horizon = GetOldestSafeDecodingTransactionId(true); + SpinLockAcquire(&slot->mutex); + slot->effective_catalog_xmin = xmin_horizon; + slot->data.catalog_xmin = xmin_horizon; + SpinLockRelease(&slot->mutex); + ReplicationSlotsComputeRequiredXmin(true); + LWLockRelease(ProcArrayLock); + + update_and_persist_local_synced_slot(remote_slot, remote_dbid); + + slot_updated = true; + } + + ReplicationSlotRelease(); + + return slot_updated; +} + +/* + * Synchronize slots. + * + * Gets the failover logical slots info from the primary server and updates + * the slots locally. Creates the slots if not present on the standby. + * + * Returns TRUE if any of the slots gets updated in this sync-cycle. + */ +static bool +synchronize_slots(WalReceiverConn *wrconn) +{ +#define SLOTSYNC_COLUMN_COUNT 9 + Oid slotRow[SLOTSYNC_COLUMN_COUNT] = {TEXTOID, TEXTOID, LSNOID, + LSNOID, XIDOID, BOOLOID, BOOLOID, TEXTOID, TEXTOID}; + + WalRcvExecResult *res; + TupleTableSlot *tupslot; + List *remote_slot_list = NIL; + bool some_slot_updated = false; + bool started_tx = false; + const char *query = "SELECT slot_name, plugin, confirmed_flush_lsn," + " restart_lsn, catalog_xmin, two_phase, failover," + " database, invalidation_reason" + " FROM pg_catalog.pg_replication_slots" + " WHERE failover and NOT temporary"; + + /* The syscache access in walrcv_exec() needs a transaction env. */ + if (!IsTransactionState()) + { + StartTransactionCommand(); + started_tx = true; + } + + /* Execute the query */ + res = walrcv_exec(wrconn, query, SLOTSYNC_COLUMN_COUNT, slotRow); + if (res->status != WALRCV_OK_TUPLES) + ereport(ERROR, + errmsg("could not fetch failover logical slots info from the primary server: %s", + res->err)); + + /* Construct the remote_slot tuple and synchronize each slot locally */ + tupslot = MakeSingleTupleTableSlot(res->tupledesc, &TTSOpsMinimalTuple); + while (tuplestore_gettupleslot(res->tuplestore, true, false, tupslot)) + { + bool isnull; + RemoteSlot *remote_slot = palloc0(sizeof(RemoteSlot)); + Datum d; + int col = 0; + + remote_slot->name = TextDatumGetCString(slot_getattr(tupslot, ++col, + &isnull)); + Assert(!isnull); + + remote_slot->plugin = TextDatumGetCString(slot_getattr(tupslot, ++col, + &isnull)); + Assert(!isnull); + + /* + * It is possible to get null values for LSN and Xmin if slot is + * invalidated on the primary server, so handle accordingly. + */ + d = slot_getattr(tupslot, ++col, &isnull); + remote_slot->confirmed_lsn = isnull ? InvalidXLogRecPtr : + DatumGetLSN(d); + + d = slot_getattr(tupslot, ++col, &isnull); + remote_slot->restart_lsn = isnull ? InvalidXLogRecPtr : DatumGetLSN(d); + + d = slot_getattr(tupslot, ++col, &isnull); + remote_slot->catalog_xmin = isnull ? InvalidTransactionId : + DatumGetTransactionId(d); + + remote_slot->two_phase = DatumGetBool(slot_getattr(tupslot, ++col, + &isnull)); + Assert(!isnull); + + remote_slot->failover = DatumGetBool(slot_getattr(tupslot, ++col, + &isnull)); + Assert(!isnull); + + remote_slot->database = TextDatumGetCString(slot_getattr(tupslot, + ++col, &isnull)); + Assert(!isnull); + + d = slot_getattr(tupslot, ++col, &isnull); + remote_slot->invalidated = isnull ? RS_INVAL_NONE : + GetSlotInvalidationCause(TextDatumGetCString(d)); + + /* Sanity check */ + Assert(col == SLOTSYNC_COLUMN_COUNT); + + /* + * If restart_lsn, confirmed_lsn or catalog_xmin is invalid but the + * slot is valid, that means we have fetched the remote_slot in its + * RS_EPHEMERAL state. In such a case, don't sync it; we can always + * sync it in the next sync cycle when the remote_slot is persisted + * and has valid lsn(s) and xmin values. + * + * XXX: In future, if we plan to expose 'slot->data.persistency' in + * pg_replication_slots view, then we can avoid fetching RS_EPHEMERAL + * slots in the first place. + */ + if ((XLogRecPtrIsInvalid(remote_slot->restart_lsn) || + XLogRecPtrIsInvalid(remote_slot->confirmed_lsn) || + !TransactionIdIsValid(remote_slot->catalog_xmin)) && + remote_slot->invalidated == RS_INVAL_NONE) + pfree(remote_slot); + else + /* Create list of remote slots */ + remote_slot_list = lappend(remote_slot_list, remote_slot); + + ExecClearTuple(tupslot); + } + + /* Drop local slots that no longer need to be synced. */ + drop_local_obsolete_slots(remote_slot_list); + + /* Now sync the slots locally */ + foreach_ptr(RemoteSlot, remote_slot, remote_slot_list) + { + Oid remote_dbid = get_database_oid(remote_slot->database, false); + + /* + * Use shared lock to prevent a conflict with + * ReplicationSlotsDropDBSlots(), trying to drop the same slot during + * a drop-database operation. + */ + LockSharedObject(DatabaseRelationId, remote_dbid, 0, AccessShareLock); + + some_slot_updated |= synchronize_one_slot(remote_slot, remote_dbid); + + UnlockSharedObject(DatabaseRelationId, remote_dbid, 0, AccessShareLock); + } + + /* We are done, free remote_slot_list elements */ + list_free_deep(remote_slot_list); + + walrcv_clear_result(res); + + if (started_tx) + CommitTransactionCommand(); + + return some_slot_updated; +} + +/* + * Checks the remote server info. + * + * We ensure that the 'primary_slot_name' exists on the remote server and the + * remote server is not a standby node. + */ +static void +validate_remote_info(WalReceiverConn *wrconn) +{ +#define PRIMARY_INFO_OUTPUT_COL_COUNT 2 + WalRcvExecResult *res; + Oid slotRow[PRIMARY_INFO_OUTPUT_COL_COUNT] = {BOOLOID, BOOLOID}; + StringInfoData cmd; + bool isnull; + TupleTableSlot *tupslot; + bool remote_in_recovery; + bool primary_slot_valid; + bool started_tx = false; + + initStringInfo(&cmd); + appendStringInfo(&cmd, + "SELECT pg_is_in_recovery(), count(*) = 1" + " FROM pg_catalog.pg_replication_slots" + " WHERE slot_type='physical' AND slot_name=%s", + quote_literal_cstr(PrimarySlotName)); + + /* The syscache access in walrcv_exec() needs a transaction env. */ + if (!IsTransactionState()) + { + StartTransactionCommand(); + started_tx = true; + } + + res = walrcv_exec(wrconn, cmd.data, PRIMARY_INFO_OUTPUT_COL_COUNT, slotRow); + pfree(cmd.data); + + if (res->status != WALRCV_OK_TUPLES) + ereport(ERROR, + errmsg("could not fetch primary_slot_name \"%s\" info from the primary server: %s", + PrimarySlotName, res->err), + errhint("Check if primary_slot_name is configured correctly.")); + + tupslot = MakeSingleTupleTableSlot(res->tupledesc, &TTSOpsMinimalTuple); + if (!tuplestore_gettupleslot(res->tuplestore, true, false, tupslot)) + elog(ERROR, + "failed to fetch tuple for the primary server slot specified by primary_slot_name"); + + remote_in_recovery = DatumGetBool(slot_getattr(tupslot, 1, &isnull)); + Assert(!isnull); + + /* + * Slot sync is currently not supported on a cascading standby. This is + * because if we allow it, the primary server needs to wait for all the + * cascading standbys, otherwise, logical subscribers can still be ahead + * of one of the cascading standbys which we plan to promote. Thus, to + * avoid this additional complexity, we restrict it for the time being. + */ + if (remote_in_recovery) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot synchronize replication slots from a standby server")); + + primary_slot_valid = DatumGetBool(slot_getattr(tupslot, 2, &isnull)); + Assert(!isnull); + + if (!primary_slot_valid) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + /* translator: second %s is a GUC variable name */ + errmsg("replication slot \"%s\" specified by \"%s\" does not exist on primary server", + PrimarySlotName, "primary_slot_name")); + + ExecClearTuple(tupslot); + walrcv_clear_result(res); + + if (started_tx) + CommitTransactionCommand(); +} + +/* + * Checks if dbname is specified in 'primary_conninfo'. + * + * Error out if not specified otherwise return it. + */ +char * +CheckAndGetDbnameFromConninfo(void) +{ + char *dbname; + + /* + * The slot synchronization needs a database connection for walrcv_exec to + * work. + */ + dbname = walrcv_get_dbname_from_conninfo(PrimaryConnInfo); + if (dbname == NULL) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + + /* + * translator: first %s is a connection option; second %s is a GUC + * variable name + */ + errmsg("replication slot synchronization requires \"%s\" to be specified in \"%s\"", + "dbname", "primary_conninfo")); + return dbname; +} + +/* + * Return true if all necessary GUCs for slot synchronization are set + * appropriately, otherwise, return false. + */ +bool +ValidateSlotSyncParams(int elevel) +{ + /* + * Logical slot sync/creation requires wal_level >= logical. + * + * Since altering the wal_level requires a server restart, so error out in + * this case regardless of elevel provided by caller. + */ + if (wal_level < WAL_LEVEL_LOGICAL) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("replication slot synchronization requires \"wal_level\" >= \"logical\"")); + + /* + * A physical replication slot(primary_slot_name) is required on the + * primary to ensure that the rows needed by the standby are not removed + * after restarting, so that the synchronized slot on the standby will not + * be invalidated. + */ + if (PrimarySlotName == NULL || *PrimarySlotName == '\0') + { + ereport(elevel, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + /* translator: %s is a GUC variable name */ + errmsg("replication slot synchronization requires \"%s\" to be set", "primary_slot_name")); + return false; + } + + /* + * hot_standby_feedback must be enabled to cooperate with the physical + * replication slot, which allows informing the primary about the xmin and + * catalog_xmin values on the standby. + */ + if (!hot_standby_feedback) + { + ereport(elevel, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + /* translator: %s is a GUC variable name */ + errmsg("replication slot synchronization requires \"%s\" to be enabled", + "hot_standby_feedback")); + return false; + } + + /* + * The primary_conninfo is required to make connection to primary for + * getting slots information. + */ + if (PrimaryConnInfo == NULL || *PrimaryConnInfo == '\0') + { + ereport(elevel, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + /* translator: %s is a GUC variable name */ + errmsg("replication slot synchronization requires \"%s\" to be set", + "primary_conninfo")); + return false; + } + + return true; +} + +/* + * Re-read the config file. + * + * Exit if any of the slot sync GUCs have changed. The postmaster will + * restart it. + */ +static void +slotsync_reread_config(void) +{ + char *old_primary_conninfo = pstrdup(PrimaryConnInfo); + char *old_primary_slotname = pstrdup(PrimarySlotName); + bool old_sync_replication_slots = sync_replication_slots; + bool old_hot_standby_feedback = hot_standby_feedback; + bool conninfo_changed; + bool primary_slotname_changed; + + Assert(sync_replication_slots); + + ConfigReloadPending = false; + ProcessConfigFile(PGC_SIGHUP); + + conninfo_changed = strcmp(old_primary_conninfo, PrimaryConnInfo) != 0; + primary_slotname_changed = strcmp(old_primary_slotname, PrimarySlotName) != 0; + pfree(old_primary_conninfo); + pfree(old_primary_slotname); + + if (old_sync_replication_slots != sync_replication_slots) + { + ereport(LOG, + /* translator: %s is a GUC variable name */ + errmsg("replication slot synchronization worker will shut down because \"%s\" is disabled", "sync_replication_slots")); + proc_exit(0); + } + + if (conninfo_changed || + primary_slotname_changed || + (old_hot_standby_feedback != hot_standby_feedback)) + { + ereport(LOG, + errmsg("replication slot synchronization worker will restart because of a parameter change")); + + /* + * Reset the last-start time for this worker so that the postmaster + * can restart it without waiting for SLOTSYNC_RESTART_INTERVAL_SEC. + */ + SlotSyncCtx->last_start_time = 0; + + proc_exit(0); + } + +} + +/* + * Interrupt handler for main loop of slot sync worker. + */ +static void +ProcessSlotSyncInterrupts(WalReceiverConn *wrconn) +{ + CHECK_FOR_INTERRUPTS(); + + if (ShutdownRequestPending) + { + ereport(LOG, + errmsg("replication slot synchronization worker is shutting down on receiving SIGINT")); + + proc_exit(0); + } + + if (ConfigReloadPending) + slotsync_reread_config(); +} + +/* + * Connection cleanup function for slotsync worker. + * + * Called on slotsync worker exit. + */ +static void +slotsync_worker_disconnect(int code, Datum arg) +{ + WalReceiverConn *wrconn = (WalReceiverConn *) DatumGetPointer(arg); + + walrcv_disconnect(wrconn); +} + +/* + * Cleanup function for slotsync worker. + * + * Called on slotsync worker exit. + */ +static void +slotsync_worker_onexit(int code, Datum arg) +{ + /* + * We need to do slots cleanup here just like WalSndErrorCleanup() does. + * + * The startup process during promotion invokes ShutDownSlotSync() which + * waits for slot sync to finish and it does that by checking the + * 'syncing' flag. Thus the slot sync worker must be done with slots' + * release and cleanup to avoid any dangling temporary slots or active + * slots before it marks itself as finished syncing. + */ + + /* Make sure active replication slots are released */ + if (MyReplicationSlot != NULL) + ReplicationSlotRelease(); + + /* Also cleanup the temporary slots. */ + ReplicationSlotCleanup(false); + + SpinLockAcquire(&SlotSyncCtx->mutex); + + SlotSyncCtx->pid = InvalidPid; + + /* + * If syncing_slots is true, it indicates that the process errored out + * without resetting the flag. So, we need to clean up shared memory and + * reset the flag here. + */ + if (syncing_slots) + { + SlotSyncCtx->syncing = false; + syncing_slots = false; + } + + SpinLockRelease(&SlotSyncCtx->mutex); +} + +/* + * Sleep for long enough that we believe it's likely that the slots on primary + * get updated. + * + * If there is no slot activity the wait time between sync-cycles will double + * (to a maximum of 30s). If there is some slot activity the wait time between + * sync-cycles is reset to the minimum (200ms). + */ +static void +wait_for_slot_activity(bool some_slot_updated) +{ + int rc; + + if (!some_slot_updated) + { + /* + * No slots were updated, so double the sleep time, but not beyond the + * maximum allowable value. + */ + sleep_ms = Min(sleep_ms * 2, MAX_SLOTSYNC_WORKER_NAPTIME_MS); + } + else + { + /* + * Some slots were updated since the last sleep, so reset the sleep + * time. + */ + sleep_ms = MIN_SLOTSYNC_WORKER_NAPTIME_MS; + } + + rc = WaitLatch(MyLatch, + WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, + sleep_ms, + WAIT_EVENT_REPLICATION_SLOTSYNC_MAIN); + + if (rc & WL_LATCH_SET) + ResetLatch(MyLatch); +} + +/* + * Emit an error if a promotion or a concurrent sync call is in progress. + * Otherwise, advertise that a sync is in progress. + */ +static void +check_and_set_sync_info(pid_t worker_pid) +{ + SpinLockAcquire(&SlotSyncCtx->mutex); + + /* The worker pid must not be already assigned in SlotSyncCtx */ + Assert(worker_pid == InvalidPid || SlotSyncCtx->pid == InvalidPid); + + /* + * Emit an error if startup process signaled the slot sync machinery to + * stop. See comments atop SlotSyncCtxStruct. + */ + if (SlotSyncCtx->stopSignaled) + { + SpinLockRelease(&SlotSyncCtx->mutex); + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot synchronize replication slots when standby promotion is ongoing")); + } + + if (SlotSyncCtx->syncing) + { + SpinLockRelease(&SlotSyncCtx->mutex); + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot synchronize replication slots concurrently")); + } + + SlotSyncCtx->syncing = true; + + /* + * Advertise the required PID so that the startup process can kill the + * slot sync worker on promotion. + */ + SlotSyncCtx->pid = worker_pid; + + SpinLockRelease(&SlotSyncCtx->mutex); + + syncing_slots = true; +} + +/* + * Reset syncing flag. + */ +static void +reset_syncing_flag() +{ + SpinLockAcquire(&SlotSyncCtx->mutex); + SlotSyncCtx->syncing = false; + SpinLockRelease(&SlotSyncCtx->mutex); + + syncing_slots = false; +}; + +/* + * The main loop of our worker process. + * + * It connects to the primary server, fetches logical failover slots + * information periodically in order to create and sync the slots. + */ +void +ReplSlotSyncWorkerMain(char *startup_data, size_t startup_data_len) +{ + WalReceiverConn *wrconn = NULL; + char *dbname; + char *err; + sigjmp_buf local_sigjmp_buf; + StringInfoData app_name; + + Assert(startup_data_len == 0); + + MyBackendType = B_SLOTSYNC_WORKER; + + init_ps_display(NULL); + + SetProcessingMode(InitProcessing); + + /* + * Create a per-backend PGPROC struct in shared memory. We must do this + * before we access any shared memory. + */ + InitProcess(); + + /* + * Early initialization. + */ + BaseInit(); + + Assert(SlotSyncCtx != NULL); + + /* + * If an exception is encountered, processing resumes here. + * + * We just need to clean up, report the error, and go away. + * + * If we do not have this handling here, then since this worker process + * operates at the bottom of the exception stack, ERRORs turn into FATALs. + * Therefore, we create our own exception handler to catch ERRORs. + */ + if (sigsetjmp(local_sigjmp_buf, 1) != 0) + { + /* since not using PG_TRY, must reset error stack by hand */ + error_context_stack = NULL; + + /* Prevents interrupts while cleaning up */ + HOLD_INTERRUPTS(); + + /* Report the error to the server log */ + EmitErrorReport(); + + /* + * We can now go away. Note that because we called InitProcess, a + * callback was registered to do ProcKill, which will clean up + * necessary state. + */ + proc_exit(0); + } + + /* We can now handle ereport(ERROR) */ + PG_exception_stack = &local_sigjmp_buf; + + /* Setup signal handling */ + pqsignal(SIGHUP, SignalHandlerForConfigReload); + pqsignal(SIGINT, SignalHandlerForShutdownRequest); + pqsignal(SIGTERM, die); + pqsignal(SIGFPE, FloatExceptionHandler); + pqsignal(SIGUSR1, procsignal_sigusr1_handler); + pqsignal(SIGUSR2, SIG_IGN); + pqsignal(SIGPIPE, SIG_IGN); + pqsignal(SIGCHLD, SIG_DFL); + + check_and_set_sync_info(MyProcPid); + + ereport(LOG, errmsg("slot sync worker started")); + + /* Register it as soon as SlotSyncCtx->pid is initialized. */ + before_shmem_exit(slotsync_worker_onexit, (Datum) 0); + + /* + * Establishes SIGALRM handler and initialize timeout module. It is needed + * by InitPostgres to register different timeouts. + */ + InitializeTimeouts(); + + /* Load the libpq-specific functions */ + load_file("libpqwalreceiver", false); + + /* + * Unblock signals (they were blocked when the postmaster forked us) + */ + sigprocmask(SIG_SETMASK, &UnBlockSig, NULL); + + /* + * Set always-secure search path, so malicious users can't redirect user + * code (e.g. operators). + * + * It's not strictly necessary since we won't be scanning or writing to + * any user table locally, but it's good to retain it here for added + * precaution. + */ + SetConfigOption("search_path", "", PGC_SUSET, PGC_S_OVERRIDE); + + dbname = CheckAndGetDbnameFromConninfo(); + + /* + * Connect to the database specified by the user in primary_conninfo. We + * need a database connection for walrcv_exec to work which we use to + * fetch slot information from the remote node. See comments atop + * libpqrcv_exec. + * + * We do not specify a specific user here since the slot sync worker will + * operate as a superuser. This is safe because the slot sync worker does + * not interact with user tables, eliminating the risk of executing + * arbitrary code within triggers. + */ + InitPostgres(dbname, InvalidOid, NULL, InvalidOid, 0, NULL); + + SetProcessingMode(NormalProcessing); + + initStringInfo(&app_name); + if (cluster_name[0]) + appendStringInfo(&app_name, "%s_%s", cluster_name, "slotsync worker"); + else + appendStringInfoString(&app_name, "slotsync worker"); + + /* + * Establish the connection to the primary server for slot + * synchronization. + */ + wrconn = walrcv_connect(PrimaryConnInfo, false, false, false, + app_name.data, &err); + pfree(app_name.data); + + if (!wrconn) + ereport(ERROR, + errcode(ERRCODE_CONNECTION_FAILURE), + errmsg("could not connect to the primary server: %s", err)); + + /* + * Register the disconnection callback. + * + * XXX: This can be combined with previous cleanup registration of + * slotsync_worker_onexit() but that will need the connection to be made + * global and we want to avoid introducing global for this purpose. + */ + before_shmem_exit(slotsync_worker_disconnect, PointerGetDatum(wrconn)); + + /* + * Using the specified primary server connection, check that we are not a + * cascading standby and slot configured in 'primary_slot_name' exists on + * the primary server. + */ + validate_remote_info(wrconn); + + /* Main loop to synchronize slots */ + for (;;) + { + bool some_slot_updated = false; + + ProcessSlotSyncInterrupts(wrconn); + + some_slot_updated = synchronize_slots(wrconn); + + wait_for_slot_activity(some_slot_updated); + } + + /* + * The slot sync worker can't get here because it will only stop when it + * receives a SIGINT from the startup process, or when there is an error. + */ + Assert(false); +} + +/* + * Update the inactive_since property for synced slots. + * + * Note that this function is currently called when we shutdown the slot + * sync machinery. + */ +static void +update_synced_slots_inactive_since(void) +{ + TimestampTz now = 0; + + /* + * We need to update inactive_since only when we are promoting standby to + * correctly interpret the inactive_since if the standby gets promoted + * without a restart. We don't want the slots to appear inactive for a + * long time after promotion if they haven't been synchronized recently. + * Whoever acquires the slot, i.e., makes the slot active, will reset it. + */ + if (!StandbyMode) + return; + + /* The slot sync worker or SQL function mustn't be running by now */ + Assert((SlotSyncCtx->pid == InvalidPid) && !SlotSyncCtx->syncing); + + LWLockAcquire(ReplicationSlotControlLock, LW_SHARED); + + for (int i = 0; i < max_replication_slots; i++) + { + ReplicationSlot *s = &ReplicationSlotCtl->replication_slots[i]; + + /* Check if it is a synchronized slot */ + if (s->in_use && s->data.synced) + { + Assert(SlotIsLogical(s)); + + /* The slot must not be acquired by any process */ + Assert(s->active_pid == 0); + + /* Use the same inactive_since time for all the slots. */ + if (now == 0) + now = GetCurrentTimestamp(); + + SpinLockAcquire(&s->mutex); + s->inactive_since = now; + SpinLockRelease(&s->mutex); + } + } + + LWLockRelease(ReplicationSlotControlLock); +} + +/* + * Shut down the slot sync worker. + * + * This function sends signal to shutdown slot sync worker, if required. It + * also waits till the slot sync worker has exited or + * pg_sync_replication_slots() has finished. + */ +void +ShutDownSlotSync(void) +{ + pid_t worker_pid; + + SpinLockAcquire(&SlotSyncCtx->mutex); + + SlotSyncCtx->stopSignaled = true; + + /* + * Return if neither the slot sync worker is running nor the function + * pg_sync_replication_slots() is executing. + */ + if (!SlotSyncCtx->syncing) + { + SpinLockRelease(&SlotSyncCtx->mutex); + update_synced_slots_inactive_since(); + return; + } + + worker_pid = SlotSyncCtx->pid; + + SpinLockRelease(&SlotSyncCtx->mutex); + + if (worker_pid != InvalidPid) + kill(worker_pid, SIGINT); + + /* Wait for slot sync to end */ + for (;;) + { + int rc; + + /* Wait a bit, we don't expect to have to wait long */ + rc = WaitLatch(MyLatch, + WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, + 10L, WAIT_EVENT_REPLICATION_SLOTSYNC_SHUTDOWN); + + if (rc & WL_LATCH_SET) + { + ResetLatch(MyLatch); + CHECK_FOR_INTERRUPTS(); + } + + SpinLockAcquire(&SlotSyncCtx->mutex); + + /* Ensure that no process is syncing the slots. */ + if (!SlotSyncCtx->syncing) + break; + + SpinLockRelease(&SlotSyncCtx->mutex); + } + + SpinLockRelease(&SlotSyncCtx->mutex); + + update_synced_slots_inactive_since(); +} + +/* + * SlotSyncWorkerCanRestart + * + * Returns true if enough time (SLOTSYNC_RESTART_INTERVAL_SEC) has passed + * since it was launched last. Otherwise returns false. + * + * This is a safety valve to protect against continuous respawn attempts if the + * worker is dying immediately at launch. Note that since we will retry to + * launch the worker from the postmaster main loop, we will get another + * chance later. + */ +bool +SlotSyncWorkerCanRestart(void) +{ + time_t curtime = time(NULL); + + /* Return false if too soon since last start. */ + if ((unsigned int) (curtime - SlotSyncCtx->last_start_time) < + (unsigned int) SLOTSYNC_RESTART_INTERVAL_SEC) + return false; + + SlotSyncCtx->last_start_time = curtime; + + return true; +} + +/* + * Is current process syncing replication slots? + * + * Could be either backend executing SQL function or slot sync worker. + */ +bool +IsSyncingReplicationSlots(void) +{ + return syncing_slots; +} + +/* + * Amount of shared memory required for slot synchronization. + */ +Size +SlotSyncShmemSize(void) +{ + return sizeof(SlotSyncCtxStruct); +} + +/* + * Allocate and initialize the shared memory of slot synchronization. + */ +void +SlotSyncShmemInit(void) +{ + Size size = SlotSyncShmemSize(); + bool found; + + SlotSyncCtx = (SlotSyncCtxStruct *) + ShmemInitStruct("Slot Sync Data", size, &found); + + if (!found) + { + memset(SlotSyncCtx, 0, size); + SlotSyncCtx->pid = InvalidPid; + SpinLockInit(&SlotSyncCtx->mutex); + } +} + +/* + * Error cleanup callback for slot sync SQL function. + */ +static void +slotsync_failure_callback(int code, Datum arg) +{ + WalReceiverConn *wrconn = (WalReceiverConn *) DatumGetPointer(arg); + + /* + * We need to do slots cleanup here just like WalSndErrorCleanup() does. + * + * The startup process during promotion invokes ShutDownSlotSync() which + * waits for slot sync to finish and it does that by checking the + * 'syncing' flag. Thus the SQL function must be done with slots' release + * and cleanup to avoid any dangling temporary slots or active slots + * before it marks itself as finished syncing. + */ + + /* Make sure active replication slots are released */ + if (MyReplicationSlot != NULL) + ReplicationSlotRelease(); + + /* Also cleanup the synced temporary slots. */ + ReplicationSlotCleanup(true); + + /* + * The set syncing_slots indicates that the process errored out without + * resetting the flag. So, we need to clean up shared memory and reset the + * flag here. + */ + if (syncing_slots) + reset_syncing_flag(); + + walrcv_disconnect(wrconn); +} + +/* + * Synchronize the failover enabled replication slots using the specified + * primary server connection. + */ +void +SyncReplicationSlots(WalReceiverConn *wrconn) +{ + PG_ENSURE_ERROR_CLEANUP(slotsync_failure_callback, PointerGetDatum(wrconn)); + { + check_and_set_sync_info(InvalidPid); + + validate_remote_info(wrconn); + + synchronize_slots(wrconn); + + /* Cleanup the synced temporary slots */ + ReplicationSlotCleanup(true); + + /* We are done with sync, so reset sync flag */ + reset_syncing_flag(); + } + PG_END_ENSURE_ERROR_CLEANUP(slotsync_failure_callback, PointerGetDatum(wrconn)); +} diff --git a/src/backend/replication/logical/snapbuild.c b/src/backend/replication/logical/snapbuild.c index 0786bb0ab7122..110e0b0a0449e 100644 --- a/src/backend/replication/logical/snapbuild.c +++ b/src/backend/replication/logical/snapbuild.c @@ -41,10 +41,15 @@ * transactions we need Snapshots that see intermediate versions of the * catalog in a transaction. During normal operation this is achieved by using * CommandIds/cmin/cmax. The problem with that however is that for space - * efficiency reasons only one value of that is stored - * (cf. combocid.c). Since combo CIDs are only available in memory we log - * additional information which allows us to get the original (cmin, cmax) - * pair during visibility checks. Check the reorderbuffer.c's comment above + * efficiency reasons, the cmin and cmax are not included in WAL records. We + * cannot read the cmin/cmax from the tuple itself, either, because it is + * reset on crash recovery. Even if we could, we could not decode combocids + * which are only tracked in the original backend's memory. To work around + * that, heapam writes an extra WAL record (XLOG_HEAP2_NEW_CID) every time a + * catalog row is modified, which includes the cmin and cmax of the + * tuple. During decoding, we insert the ctid->(cmin,cmax) mappings into the + * reorder buffer, and use them at visibility checks instead of the cmin/cmax + * on the tuple itself. Check the reorderbuffer.c's comment above * ResolveCminCmaxDuringDecoding() for details. * * To facilitate all this we need our own visibility routine, as the normal @@ -107,7 +112,7 @@ * is a convenient point to initialize replication from, which is why we * export a snapshot at that point, which *can* be used to read normal data. * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/snapbuild.c @@ -129,7 +134,6 @@ #include "replication/logical.h" #include "replication/reorderbuffer.h" #include "replication/snapbuild.h" -#include "storage/block.h" /* debugging output */ #include "storage/fd.h" #include "storage/lmgr.h" #include "storage/proc.h" @@ -185,6 +189,14 @@ struct SnapBuild /* Indicates if we are building full snapshot or just catalog one. */ bool building_full_snapshot; + /* + * Indicates if we are using the snapshot builder for the creation of a + * logical replication slot. If it's true, the start point for decoding + * changes is not determined yet. So we skip snapshot restores to properly + * find the start point. See SnapBuildFindSnapshot() for details. + */ + bool in_slot_creation; + /* * Snapshot that's valid to see the catalog state seen at this moment. */ @@ -288,7 +300,7 @@ static void SnapBuildFreeSnapshot(Snapshot snap); static void SnapBuildSnapIncRefcount(Snapshot snap); -static void SnapBuildDistributeNewCatalogSnapshot(SnapBuild *builder, XLogRecPtr lsn); +static void SnapBuildDistributeSnapshotAndInval(SnapBuild *builder, XLogRecPtr lsn, TransactionId xid); static inline bool SnapBuildXidHasCatalogChanges(SnapBuild *builder, TransactionId xid, uint32 xinfo); @@ -313,6 +325,7 @@ AllocateSnapshotBuilder(ReorderBuffer *reorder, TransactionId xmin_horizon, XLogRecPtr start_lsn, bool need_full_snapshot, + bool in_slot_creation, XLogRecPtr two_phase_at) { MemoryContext context; @@ -343,6 +356,7 @@ AllocateSnapshotBuilder(ReorderBuffer *reorder, builder->initial_xmin_horizon = xmin_horizon; builder->start_decoding_at = start_lsn; + builder->in_slot_creation = in_slot_creation; builder->building_full_snapshot = need_full_snapshot; builder->two_phase_at = two_phase_at; @@ -845,15 +859,15 @@ SnapBuildProcessNewCid(SnapBuild *builder, TransactionId xid, } /* - * Add a new Snapshot to all transactions we're decoding that currently are - * in-progress so they can see new catalog contents made by the transaction - * that just committed. This is necessary because those in-progress - * transactions will use the new catalog's contents from here on (at the very - * least everything they do needs to be compatible with newer catalog - * contents). + * Add a new Snapshot and invalidation messages to all transactions we're + * decoding that currently are in-progress so they can see new catalog contents + * made by the transaction that just committed. This is necessary because those + * in-progress transactions will use the new catalog's contents from here on + * (at the very least everything they do needs to be compatible with newer + * catalog contents). */ static void -SnapBuildDistributeNewCatalogSnapshot(SnapBuild *builder, XLogRecPtr lsn) +SnapBuildDistributeSnapshotAndInval(SnapBuild *builder, XLogRecPtr lsn, TransactionId xid) { dlist_iter txn_i; ReorderBufferTXN *txn; @@ -861,7 +875,8 @@ SnapBuildDistributeNewCatalogSnapshot(SnapBuild *builder, XLogRecPtr lsn) /* * Iterate through all toplevel transactions. This can include * subtransactions which we just don't yet know to be that, but that's - * fine, they will just get an unnecessary snapshot queued. + * fine, they will just get an unnecessary snapshot and invalidations + * queued. */ dlist_foreach(txn_i, &builder->reorder->toplevel_by_lsn) { @@ -874,6 +889,14 @@ SnapBuildDistributeNewCatalogSnapshot(SnapBuild *builder, XLogRecPtr lsn) * transaction which in turn implies we don't yet need a snapshot at * all. We'll add a snapshot when the first change gets queued. * + * Similarly, we don't need to add invalidations to a transaction whose + * base snapshot is not yet set. Once a base snapshot is built, it will + * include the xids of committed transactions that have modified the + * catalog, thus reflecting the new catalog contents. The existing + * catalog cache will have already been invalidated after processing + * the invalidations in the transaction that modified catalogs, + * ensuring that a fresh cache is constructed during decoding. + * * NB: This works correctly even for subtransactions because * ReorderBufferAssignChild() takes care to transfer the base snapshot * to the top-level transaction, and while iterating the changequeue @@ -883,13 +906,13 @@ SnapBuildDistributeNewCatalogSnapshot(SnapBuild *builder, XLogRecPtr lsn) continue; /* - * We don't need to add snapshot to prepared transactions as they - * should not see the new catalog contents. + * We don't need to add snapshot or invalidations to prepared + * transactions as they should not see the new catalog contents. */ if (rbtxn_prepared(txn) || rbtxn_skip_prepared(txn)) continue; - elog(DEBUG2, "adding a new snapshot to %u at %X/%X", + elog(DEBUG2, "adding a new snapshot and invalidations to %u at %X/%X", txn->xid, LSN_FORMAT_ARGS(lsn)); /* @@ -899,6 +922,33 @@ SnapBuildDistributeNewCatalogSnapshot(SnapBuild *builder, XLogRecPtr lsn) SnapBuildSnapIncRefcount(builder->snapshot); ReorderBufferAddSnapshot(builder->reorder, txn->xid, lsn, builder->snapshot); + + /* + * Add invalidation messages to the reorder buffer of in-progress + * transactions except the current committed transaction, for which we + * will execute invalidations at the end. + * + * It is required, otherwise, we will end up using the stale catcache + * contents built by the current transaction even after its decoding, + * which should have been invalidated due to concurrent catalog + * changing transaction. + */ + if (txn->xid != xid) + { + uint32 ninvalidations; + SharedInvalidationMessage *msgs = NULL; + + ninvalidations = ReorderBufferGetInvalidations(builder->reorder, + xid, &msgs); + + if (ninvalidations > 0) + { + Assert(msgs != NULL); + + ReorderBufferAddInvalidations(builder->reorder, txn->xid, lsn, + ninvalidations, msgs); + } + } } } @@ -1170,8 +1220,11 @@ SnapBuildCommitTxn(SnapBuild *builder, XLogRecPtr lsn, TransactionId xid, /* refcount of the snapshot builder for the new snapshot */ SnapBuildSnapIncRefcount(builder->snapshot); - /* add a new catalog snapshot to all currently running transactions */ - SnapBuildDistributeNewCatalogSnapshot(builder, lsn); + /* + * Add a new catalog snapshot and invalidations messages to all + * currently running transactions. + */ + SnapBuildDistributeSnapshotAndInval(builder, lsn, xid); } } @@ -1323,10 +1376,12 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, xl_running_xacts *runn * state while waiting on c)'s sub-states. * * b) This (in a previous run) or another decoding slot serialized a - * snapshot to disk that we can use. Can't use this method for the - * initial snapshot when slot is being created and needs full snapshot - * for export or direct use, as that snapshot will only contain catalog - * modifying transactions. + * snapshot to disk that we can use. Can't use this method while finding + * the start point for decoding changes as the restart LSN would be an + * arbitrary LSN but we need to find the start point to extract changes + * where we won't see the data for partial transactions. Also, we cannot + * use this method when a slot needs a full snapshot for export or direct + * use, as that snapshot will only contain catalog modifying transactions. * * c) First incrementally build a snapshot for catalog tuples * (BUILDING_SNAPSHOT), that requires all, already in-progress, @@ -1391,8 +1446,13 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, xl_running_xacts *runn return false; } - /* b) valid on disk state and not building full snapshot */ + + /* + * b) valid on disk state and while neither building full snapshot nor + * creating a slot. + */ else if (!builder->building_full_snapshot && + !builder->in_slot_creation && SnapBuildRestore(builder, lsn)) { /* there won't be any state to cleanup */ @@ -1576,7 +1636,7 @@ typedef struct SnapBuildOnDisk offsetof(SnapBuildOnDisk, version) #define SNAPBUILD_MAGIC 0x51A1E001 -#define SNAPBUILD_VERSION 5 +#define SNAPBUILD_VERSION 6 /* * Store/Load a snapshot from disk, depending on the snapshot builder's state. @@ -1950,8 +2010,12 @@ SnapBuildRestore(SnapBuild *builder, XLogRecPtr lsn) if (TransactionIdPrecedes(ondisk.builder.xmin, builder->initial_xmin_horizon)) goto snapshot_not_interesting; - /* consistent snapshots have no next phase */ + /* + * Consistent snapshots have no next phase. Reset next_phase_at as it is + * possible that an old value may remain. + */ Assert(ondisk.builder.next_phase_at == InvalidTransactionId); + builder->next_phase_at = InvalidTransactionId; /* ok, we think the snapshot is sensible, copy over everything important */ builder->xmin = ondisk.builder.xmin; @@ -2030,7 +2094,7 @@ SnapBuildRestoreContents(int fd, char *dest, Size size, const char *path) ereport(ERROR, (errcode(ERRCODE_DATA_CORRUPTED), errmsg("could not read file \"%s\": read %d of %zu", - path, readBytes, sizeof(SnapBuild)))); + path, readBytes, size))); } } @@ -2126,3 +2190,26 @@ CheckPointSnapBuild(void) } FreeDir(snap_dir); } + +/* + * Check if a logical snapshot at the specified point has been serialized. + */ +bool +SnapBuildSnapshotExists(XLogRecPtr lsn) +{ + char path[MAXPGPATH]; + int ret; + struct stat stat_buf; + + sprintf(path, "pg_logical/snapshots/%X-%X.snap", + LSN_FORMAT_ARGS(lsn)); + + ret = stat(path, &stat_buf); + + if (ret != 0 && errno != ENOENT) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not stat file \"%s\": %m", path))); + + return ret == 0; +} diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index 6d461654ab46d..b00267f042708 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -2,7 +2,7 @@ * tablesync.c * PostgreSQL logical replication: initial table data synchronization * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/tablesync.c @@ -106,10 +106,11 @@ #include "pgstat.h" #include "replication/logicallauncher.h" #include "replication/logicalrelation.h" +#include "replication/logicalworker.h" +#include "replication/origin.h" +#include "replication/slot.h" #include "replication/walreceiver.h" #include "replication/worker_internal.h" -#include "replication/slot.h" -#include "replication/origin.h" #include "storage/ipc.h" #include "storage/lmgr.h" #include "utils/acl.h" @@ -122,7 +123,14 @@ #include "utils/syscache.h" #include "utils/usercontext.h" -static bool table_states_valid = false; +typedef enum +{ + SYNC_TABLE_STATE_NEEDS_REBUILD, + SYNC_TABLE_STATE_REBUILD_STARTED, + SYNC_TABLE_STATE_VALID, +} SyncingTablesState; + +static SyncingTablesState table_states_validity = SYNC_TABLE_STATE_NEEDS_REBUILD; static List *table_states_not_ready = NIL; static bool FetchTableStates(bool *started_tx); @@ -272,7 +280,7 @@ wait_for_worker_state_change(char expected_state) void invalidate_syncing_table_states(Datum arg, int cacheid, uint32 hashvalue) { - table_states_valid = false; + table_states_validity = SYNC_TABLE_STATE_NEEDS_REBUILD; } /* @@ -540,15 +548,25 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) /* Now safe to release the LWLock */ LWLockRelease(LogicalRepWorkerLock); + if (started_tx) + { + /* + * We must commit the existing transaction to release + * the existing locks before entering a busy loop. + * This is required to avoid any undetected deadlocks + * due to any existing lock as deadlock detector won't + * be able to detect the waits on the latch. + */ + CommitTransactionCommand(); + pgstat_report_stat(false); + } + /* * Enter busy loop and wait for synchronization worker to * reach expected state (or die trying). */ - if (!started_tx) - { - StartTransactionCommand(); - started_tx = true; - } + StartTransactionCommand(); + started_tx = true; wait_for_relation_state_change(rstate->relid, SUBREL_STATE_SYNCDONE); @@ -586,7 +604,8 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) TimestampDifferenceExceeds(hentry->last_start_time, now, wal_retrieve_retry_interval)) { - logicalrep_worker_launch(MyLogicalRepWorker->dbid, + logicalrep_worker_launch(WORKERTYPE_TABLESYNC, + MyLogicalRepWorker->dbid, MySubscription->oid, MySubscription->name, MyLogicalRepWorker->userid, @@ -647,18 +666,29 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) void process_syncing_tables(XLogRecPtr current_lsn) { - /* - * Skip for parallel apply workers because they only operate on tables - * that are in a READY state. See pa_can_start() and - * should_apply_changes_for_rel(). - */ - if (am_parallel_apply_worker()) - return; + switch (MyLogicalRepWorker->type) + { + case WORKERTYPE_PARALLEL_APPLY: - if (am_tablesync_worker()) - process_syncing_tables_for_sync(current_lsn); - else - process_syncing_tables_for_apply(current_lsn); + /* + * Skip for parallel apply workers because they only operate on + * tables that are in a READY state. See pa_can_start() and + * should_apply_changes_for_rel(). + */ + break; + + case WORKERTYPE_TABLESYNC: + process_syncing_tables_for_sync(current_lsn); + break; + + case WORKERTYPE_APPLY: + process_syncing_tables_for_apply(current_lsn); + break; + + case WORKERTYPE_UNKNOWN: + /* Should never happen. */ + elog(ERROR, "Unknown worker type"); + } } /* @@ -1013,11 +1043,11 @@ fetch_remote_table_info(char *nspname, char *relname, /* Build the pubname list. */ initStringInfo(&pub_names); - foreach(lc, MySubscription->publications) + foreach_node(String, pubstr, MySubscription->publications) { - char *pubname = strVal(lfirst(lc)); + char *pubname = strVal(pubstr); - if (foreach_current_index(lc) > 0) + if (foreach_current_index(pubstr) > 0) appendStringInfoString(&pub_names, ", "); appendStringInfoString(&pub_names, quote_literal_cstr(pubname)); @@ -1111,22 +1141,30 @@ copy_table(Relation rel) /* Regular table with no row filter */ if (lrel.relkind == RELKIND_RELATION && qual == NIL) { - appendStringInfo(&cmd, "COPY %s (", + appendStringInfo(&cmd, "COPY %s", quote_qualified_identifier(lrel.nspname, lrel.relname)); - /* - * XXX Do we need to list the columns in all cases? Maybe we're - * replicating all columns? - */ - for (int i = 0; i < lrel.natts; i++) + /* If the table has columns, then specify the columns */ + if (lrel.natts) { - if (i > 0) - appendStringInfoString(&cmd, ", "); + appendStringInfoString(&cmd, " ("); - appendStringInfoString(&cmd, quote_identifier(lrel.attnames[i])); + /* + * XXX Do we need to list the columns in all cases? Maybe we're + * replicating all columns? + */ + for (int i = 0; i < lrel.natts; i++) + { + if (i > 0) + appendStringInfoString(&cmd, ", "); + + appendStringInfoString(&cmd, quote_identifier(lrel.attnames[i])); + } + + appendStringInfoChar(&cmd, ')'); } - appendStringInfoString(&cmd, ") TO STDOUT"); + appendStringInfoString(&cmd, " TO STDOUT"); } else { @@ -1241,7 +1279,7 @@ ReplicationSlotNameForTablesync(Oid suboid, Oid relid, * * The returned slot name is palloc'ed in current memory context. */ -char * +static char * LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) { char *slotname; @@ -1262,13 +1300,11 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) relstate = GetSubscriptionRelState(MyLogicalRepWorker->subid, MyLogicalRepWorker->relid, &relstate_lsn); + CommitTransactionCommand(); /* Is the use of a password mandatory? */ must_use_password = MySubscription->passwordrequired && - !superuser_arg(MySubscription->owner); - - /* Note that the superuser_arg call can access the DB */ - CommitTransactionCommand(); + !MySubscription->ownersuperuser; SpinLockAcquire(&MyLogicalRepWorker->relmutex); MyLogicalRepWorker->relstate = relstate; @@ -1300,7 +1336,7 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) * so that synchronous replication can distinguish them. */ LogRepWorkerWalRcvConn = - walrcv_connect(MySubscription->conninfo, true, + walrcv_connect(MySubscription->conninfo, true, true, must_use_password, slotname, &err); if (LogRepWorkerWalRcvConn == NULL) @@ -1401,6 +1437,7 @@ LogicalRepSyncTableStart(XLogRecPtr *origin_startpos) */ walrcv_create_slot(LogRepWorkerWalRcvConn, slotname, false /* permanent */ , false /* two_phase */ , + MySubscription->failover, CRS_USE_SNAPSHOT, origin_startpos); /* @@ -1538,13 +1575,15 @@ FetchTableStates(bool *started_tx) *started_tx = false; - if (!table_states_valid) + if (table_states_validity != SYNC_TABLE_STATE_VALID) { MemoryContext oldctx; List *rstates; ListCell *lc; SubscriptionRelState *rstate; + table_states_validity = SYNC_TABLE_STATE_REBUILD_STARTED; + /* Clean the old lists. */ list_free_deep(table_states_not_ready); table_states_not_ready = NIL; @@ -1578,12 +1617,108 @@ FetchTableStates(bool *started_tx) has_subrels = (table_states_not_ready != NIL) || HasSubscriptionRelations(MySubscription->oid); - table_states_valid = true; + /* + * If the subscription relation cache has been invalidated since we + * entered this routine, we still use and return the relations we just + * finished constructing, to avoid infinite loops, but we leave the + * table states marked as stale so that we'll rebuild it again on next + * access. Otherwise, we mark the table states as valid. + */ + if (table_states_validity == SYNC_TABLE_STATE_REBUILD_STARTED) + table_states_validity = SYNC_TABLE_STATE_VALID; } return has_subrels; } +/* + * Execute the initial sync with error handling. Disable the subscription, + * if it's required. + * + * Allocate the slot name in long-lived context on return. Note that we don't + * handle FATAL errors which are probably because of system resource error and + * are not repeatable. + */ +static void +start_table_sync(XLogRecPtr *origin_startpos, char **slotname) +{ + char *sync_slotname = NULL; + + Assert(am_tablesync_worker()); + + PG_TRY(); + { + /* Call initial sync. */ + sync_slotname = LogicalRepSyncTableStart(origin_startpos); + } + PG_CATCH(); + { + if (MySubscription->disableonerr) + DisableSubscriptionAndExit(); + else + { + /* + * Report the worker failed during table synchronization. Abort + * the current transaction so that the stats message is sent in an + * idle state. + */ + AbortOutOfAnyTransaction(); + pgstat_report_subscription_error(MySubscription->oid, false); + + PG_RE_THROW(); + } + } + PG_END_TRY(); + + /* allocate slot name in long-lived context */ + *slotname = MemoryContextStrdup(ApplyContext, sync_slotname); + pfree(sync_slotname); +} + +/* + * Runs the tablesync worker. + * + * It starts syncing tables. After a successful sync, sets streaming options + * and starts streaming to catchup with apply worker. + */ +static void +run_tablesync_worker() +{ + char originname[NAMEDATALEN]; + XLogRecPtr origin_startpos = InvalidXLogRecPtr; + char *slotname = NULL; + WalRcvStreamOptions options; + + start_table_sync(&origin_startpos, &slotname); + + ReplicationOriginNameForLogicalRep(MySubscription->oid, + MyLogicalRepWorker->relid, + originname, + sizeof(originname)); + + set_apply_error_context_origin(originname); + + set_stream_options(&options, slotname, &origin_startpos); + + walrcv_startstreaming(LogRepWorkerWalRcvConn, &options); + + /* Apply the changes till we catchup with the apply worker. */ + start_apply(origin_startpos); +} + +/* Logical Replication Tablesync worker entry point */ +void +TablesyncWorkerMain(Datum main_arg) +{ + int worker_slot = DatumGetInt32(main_arg); + + SetupApplyOrSyncWorker(worker_slot); + + run_tablesync_worker(); + + finish_sync_worker(); +} + /* * If the subscription has no tables then return false. * diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index 0ee764d68f1cb..db09978697f39 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -2,7 +2,7 @@ * worker.c * PostgreSQL logical replication worker (apply) * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/logical/worker.c @@ -132,6 +132,13 @@ * avoid such deadlocks, we generate a unique GID (consisting of the * subscription oid and the xid of the prepared transaction) for each prepare * transaction on the subscriber. + * + * FAILOVER + * ---------------------- + * The logical slot on the primary can be synced to the standby by specifying + * failover = true when creating the subscription. Enabling failover allows us + * to smoothly transition to the promoted standby, ensuring that we can + * subscribe to the new primary without losing any data. *------------------------------------------------------------------------- */ @@ -144,60 +151,36 @@ #include "access/tableam.h" #include "access/twophase.h" #include "access/xact.h" -#include "access/xlog_internal.h" -#include "catalog/catalog.h" #include "catalog/indexing.h" -#include "catalog/namespace.h" -#include "catalog/partition.h" #include "catalog/pg_inherits.h" #include "catalog/pg_subscription.h" #include "catalog/pg_subscription_rel.h" -#include "catalog/pg_tablespace.h" #include "commands/tablecmds.h" -#include "commands/tablespace.h" #include "commands/trigger.h" #include "executor/executor.h" #include "executor/execPartition.h" -#include "executor/nodeModifyTable.h" -#include "funcapi.h" #include "libpq/pqformat.h" -#include "libpq/pqsignal.h" -#include "mb/pg_wchar.h" #include "miscadmin.h" -#include "nodes/makefuncs.h" #include "optimizer/optimizer.h" #include "parser/parse_relation.h" #include "pgstat.h" #include "postmaster/bgworker.h" #include "postmaster/interrupt.h" -#include "postmaster/postmaster.h" #include "postmaster/walwriter.h" -#include "replication/decode.h" -#include "replication/logical.h" #include "replication/logicallauncher.h" #include "replication/logicalproto.h" #include "replication/logicalrelation.h" #include "replication/logicalworker.h" #include "replication/origin.h" -#include "replication/reorderbuffer.h" -#include "replication/snapbuild.h" #include "replication/walreceiver.h" #include "replication/worker_internal.h" #include "rewrite/rewriteHandler.h" #include "storage/buffile.h" -#include "storage/bufmgr.h" -#include "storage/fd.h" #include "storage/ipc.h" #include "storage/lmgr.h" -#include "storage/proc.h" -#include "storage/procarray.h" #include "tcop/tcopprot.h" #include "utils/acl.h" -#include "utils/builtins.h" -#include "utils/catcache.h" #include "utils/dynahash.h" -#include "utils/datum.h" -#include "utils/fmgroids.h" #include "utils/guc.h" #include "utils/inval.h" #include "utils/lsyscache.h" @@ -205,8 +188,8 @@ #include "utils/pg_lsn.h" #include "utils/rel.h" #include "utils/rls.h" +#include "utils/snapmgr.h" #include "utils/syscache.h" -#include "utils/timeout.h" #include "utils/usercontext.h" #define NAPTIME_PER_CYCLE 1000 /* max sleep time between cycles (1s) */ @@ -288,7 +271,7 @@ typedef enum TRANS_LEADER_SERIALIZE, TRANS_LEADER_SEND_TO_PARALLEL, TRANS_LEADER_PARTIAL_SERIALIZE, - TRANS_PARALLEL_APPLY + TRANS_PARALLEL_APPLY, } TransApplyAction; /* errcontext tracker */ @@ -331,7 +314,7 @@ static TransactionId stream_xid = InvalidTransactionId; */ static uint32 parallel_stream_nchanges = 0; -/* Are we initializing a apply worker? */ +/* Are we initializing an apply worker? */ bool InitializingApplyWorker = false; /* @@ -395,8 +378,6 @@ static void stream_close_file(void); static void send_feedback(XLogRecPtr recvpos, bool force, bool requestReply); -static void DisableSubscriptionAndExit(void); - static void apply_handle_commit_internal(LogicalRepCommitData *commit_data); static void apply_handle_insert_internal(ApplyExecutionData *edata, ResultRelInfo *relinfo, @@ -410,7 +391,7 @@ static void apply_handle_delete_internal(ApplyExecutionData *edata, ResultRelInfo *relinfo, TupleTableSlot *remoteslot, Oid localindexoid); -static bool FindReplTupleInLocalRel(EState *estate, Relation localrel, +static bool FindReplTupleInLocalRel(ApplyExecutionData *edata, Relation localrel, LogicalRepRelation *remoterel, Oid localidxoid, TupleTableSlot *remoteslot, @@ -435,19 +416,7 @@ static inline void reset_apply_error_context_info(void); static TransApplyAction get_transaction_apply_action(TransactionId xid, ParallelApplyWorkerInfo **winfo); -/* - * Return the name of the logical replication worker. - */ -static const char * -get_worker_name(void) -{ - if (am_tablesync_worker()) - return _("logical replication table synchronization worker"); - else if (am_parallel_apply_worker()) - return _("logical replication parallel apply worker"); - else - return _("logical replication apply worker"); -} +static void replorigin_reset(int code, Datum arg); /* * Form the origin name for the subscription. @@ -500,25 +469,34 @@ ReplicationOriginNameForLogicalRep(Oid suboid, Oid relid, static bool should_apply_changes_for_rel(LogicalRepRelMapEntry *rel) { - if (am_tablesync_worker()) - return MyLogicalRepWorker->relid == rel->localreloid; - else if (am_parallel_apply_worker()) + switch (MyLogicalRepWorker->type) { - /* We don't synchronize rel's that are in unknown state. */ - if (rel->state != SUBREL_STATE_READY && - rel->state != SUBREL_STATE_UNKNOWN) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("logical replication parallel apply worker for subscription \"%s\" will stop", - MySubscription->name), - errdetail("Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized."))); - - return rel->state == SUBREL_STATE_READY; + case WORKERTYPE_TABLESYNC: + return MyLogicalRepWorker->relid == rel->localreloid; + + case WORKERTYPE_PARALLEL_APPLY: + /* We don't synchronize rel's that are in unknown state. */ + if (rel->state != SUBREL_STATE_READY && + rel->state != SUBREL_STATE_UNKNOWN) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("logical replication parallel apply worker for subscription \"%s\" will stop", + MySubscription->name), + errdetail("Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized."))); + + return rel->state == SUBREL_STATE_READY; + + case WORKERTYPE_APPLY: + return (rel->state == SUBREL_STATE_READY || + (rel->state == SUBREL_STATE_SYNCDONE && + rel->statelsn <= remote_final_lsn)); + + case WORKERTYPE_UNKNOWN: + /* Should never happen. */ + elog(ERROR, "Unknown worker type"); } - else - return (rel->state == SUBREL_STATE_READY || - (rel->state == SUBREL_STATE_SYNCDONE && - rel->statelsn <= remote_final_lsn)); + + return false; /* dummy for compiler */ } /* @@ -2025,7 +2003,6 @@ void apply_spooled_messages(FileSet *stream_fileset, TransactionId xid, XLogRecPtr lsn) { - StringInfoData s2; int nchanges; char path[MAXPGPATH]; char *buffer = NULL; @@ -2063,7 +2040,6 @@ apply_spooled_messages(FileSet *stream_fileset, TransactionId xid, CurrentResourceOwner = oldowner; buffer = palloc(BLCKSZ); - initStringInfo(&s2); MemoryContextSwitchTo(oldcxt); @@ -2085,6 +2061,7 @@ apply_spooled_messages(FileSet *stream_fileset, TransactionId xid, nchanges = 0; while (true) { + StringInfoData s2; size_t nbytes; int len; @@ -2110,9 +2087,8 @@ apply_spooled_messages(FileSet *stream_fileset, TransactionId xid, BufFileTell(stream_fd, &fileno, &offset); - /* copy the buffer to the stringinfo and call apply_dispatch */ - resetStringInfo(&s2); - appendBinaryStringInfo(&s2, buffer, len); + /* init a stringinfo using the buffer and call apply_dispatch */ + initReadOnlyStringInfo(&s2, buffer, len); /* Ensure we are reading the data into our memory context. */ oldcxt = MemoryContextSwitchTo(ApplyMessageContext); @@ -2458,8 +2434,13 @@ apply_handle_insert(StringInfo s) apply_handle_tuple_routing(edata, remoteslot, NULL, CMD_INSERT); else - apply_handle_insert_internal(edata, edata->targetRelInfo, - remoteslot); + { + ResultRelInfo *relinfo = edata->targetRelInfo; + + ExecOpenIndices(relinfo, false); + apply_handle_insert_internal(edata, relinfo, remoteslot); + ExecCloseIndices(relinfo); + } finish_edata(edata); @@ -2486,15 +2467,14 @@ apply_handle_insert_internal(ApplyExecutionData *edata, { EState *estate = edata->estate; - /* We must open indexes here. */ - ExecOpenIndices(relinfo, false); + /* Caller should have opened indexes already. */ + Assert(relinfo->ri_IndexRelationDescs != NULL || + !relinfo->ri_RelationDesc->rd_rel->relhasindex || + RelationGetIndexList(relinfo->ri_RelationDesc) == NIL); /* Do the insert. */ TargetPrivilegesCheck(relinfo->ri_RelationDesc, ACL_INSERT); ExecSimpleRelationInsert(relinfo, estate, remoteslot); - - /* Cleanup. */ - ExecCloseIndices(relinfo); } /* @@ -2677,7 +2657,7 @@ apply_handle_update_internal(ApplyExecutionData *edata, EvalPlanQualInit(&epqstate, estate, NULL, NIL, -1, NIL); ExecOpenIndices(relinfo, false); - found = FindReplTupleInLocalRel(estate, localrel, + found = FindReplTupleInLocalRel(edata, localrel, &relmapentry->remoterel, localindexoid, remoteslot, &localslot); @@ -2793,8 +2773,14 @@ apply_handle_delete(StringInfo s) apply_handle_tuple_routing(edata, remoteslot, NULL, CMD_DELETE); else - apply_handle_delete_internal(edata, edata->targetRelInfo, + { + ResultRelInfo *relinfo = edata->targetRelInfo; + + ExecOpenIndices(relinfo, false); + apply_handle_delete_internal(edata, relinfo, remoteslot, rel->localindexoid); + ExecCloseIndices(relinfo); + } finish_edata(edata); @@ -2828,9 +2814,13 @@ apply_handle_delete_internal(ApplyExecutionData *edata, bool found; EvalPlanQualInit(&epqstate, estate, NULL, NIL, -1, NIL); - ExecOpenIndices(relinfo, false); - found = FindReplTupleInLocalRel(estate, localrel, remoterel, localindexoid, + /* Caller should have opened indexes already. */ + Assert(relinfo->ri_IndexRelationDescs != NULL || + !localrel->rd_rel->relhasindex || + RelationGetIndexList(localrel) == NIL); + + found = FindReplTupleInLocalRel(edata, localrel, remoterel, localindexoid, remoteslot, &localslot); /* If found delete it. */ @@ -2857,7 +2847,6 @@ apply_handle_delete_internal(ApplyExecutionData *edata, } /* Cleanup. */ - ExecCloseIndices(relinfo); EvalPlanQualEnd(&epqstate); } @@ -2869,12 +2858,13 @@ apply_handle_delete_internal(ApplyExecutionData *edata, * Local tuple, if found, is returned in '*localslot'. */ static bool -FindReplTupleInLocalRel(EState *estate, Relation localrel, +FindReplTupleInLocalRel(ApplyExecutionData *edata, Relation localrel, LogicalRepRelation *remoterel, Oid localidxoid, TupleTableSlot *remoteslot, TupleTableSlot **localslot) { + EState *estate = edata->estate; bool found; /* @@ -2889,9 +2879,21 @@ FindReplTupleInLocalRel(EState *estate, Relation localrel, (remoterel->replident == REPLICA_IDENTITY_FULL)); if (OidIsValid(localidxoid)) + { +#ifdef USE_ASSERT_CHECKING + Relation idxrel = index_open(localidxoid, AccessShareLock); + + /* Index must be PK, RI, or usable for REPLICA IDENTITY FULL tables */ + Assert(GetRelationIdentityOrPK(idxrel) == localidxoid || + IsIndexUsableForReplicaIdentityFull(BuildIndexInfo(idxrel), + edata->targetRel->attrmap)); + index_close(idxrel, AccessShareLock); +#endif + found = RelationFindReplTupleByIndex(localrel, localidxoid, LockTupleExclusive, remoteslot, *localslot); + } else found = RelationFindReplTupleSeq(localrel, LockTupleExclusive, remoteslot, *localslot); @@ -3009,7 +3011,7 @@ apply_handle_tuple_routing(ApplyExecutionData *edata, bool found; /* Get the matching local tuple from the partition. */ - found = FindReplTupleInLocalRel(estate, partrel, + found = FindReplTupleInLocalRel(edata, partrel, &part_entry->remoterel, part_entry->localindexoid, remoteslot_part, &localslot); @@ -3055,14 +3057,12 @@ apply_handle_tuple_routing(ApplyExecutionData *edata, EPQState epqstate; EvalPlanQualInit(&epqstate, estate, NULL, NIL, -1, NIL); - ExecOpenIndices(partrelinfo, false); EvalPlanQualSetSlot(&epqstate, remoteslot_part); TargetPrivilegesCheck(partrelinfo->ri_RelationDesc, ACL_UPDATE); ExecSimpleRelationUpdate(partrelinfo, estate, &epqstate, localslot, remoteslot_part); - ExecCloseIndices(partrelinfo); EvalPlanQualEnd(&epqstate); } else @@ -3381,7 +3381,7 @@ apply_dispatch(StringInfo s) default: ereport(ERROR, (errcode(ERRCODE_PROTOCOL_VIOLATION), - errmsg("invalid logical replication message type \"%c\"", action))); + errmsg("invalid logical replication message type \"??? (%d)\"", action))); } /* Reset the current command */ @@ -3575,10 +3575,7 @@ LogicalRepApplyLoop(XLogRecPtr last_received) /* Ensure we are reading the data into our memory context. */ MemoryContextSwitchTo(ApplyMessageContext); - s.data = buf; - s.len = len; - s.cursor = 0; - s.maxlen = -1; + initReadOnlyStringInfo(&s, buf, len); c = pq_getmsgbyte(&s); @@ -3645,7 +3642,7 @@ LogicalRepApplyLoop(XLogRecPtr last_received) } /* Cleanup the memory. */ - MemoryContextResetAndDeleteChildren(ApplyMessageContext); + MemoryContextReset(ApplyMessageContext); MemoryContextSwitchTo(TopMemoryContext); /* Check if we need to exit the streaming loop. */ @@ -3865,7 +3862,7 @@ apply_worker_exit(void) * subscription is still active, and so that we won't leak that hash table * entry if it isn't. */ - if (!am_tablesync_worker()) + if (am_leader_apply_worker()) ApplyLauncherForgetWorkerStartTime(MyLogicalRepWorker->subid); proc_exit(0); @@ -3904,13 +3901,13 @@ maybe_reread_subscription(void) if (!newsub) { ereport(LOG, - /* translator: first %s is the name of logical replication worker */ - (errmsg("%s for subscription \"%s\" will stop because the subscription was removed", - get_worker_name(), MySubscription->name))); + (errmsg("logical replication worker for subscription \"%s\" will stop because the subscription was removed", + MySubscription->name))); /* Ensure we remove no-longer-useful entry for worker's start time */ - if (!am_tablesync_worker() && !am_parallel_apply_worker()) + if (am_leader_apply_worker()) ApplyLauncherForgetWorkerStartTime(MyLogicalRepWorker->subid); + proc_exit(0); } @@ -3918,9 +3915,8 @@ maybe_reread_subscription(void) if (!newsub->enabled) { ereport(LOG, - /* translator: first %s is the name of logical replication worker */ - (errmsg("%s for subscription \"%s\" will stop because the subscription was disabled", - get_worker_name(), MySubscription->name))); + (errmsg("logical replication worker for subscription \"%s\" will stop because the subscription was disabled", + MySubscription->name))); apply_worker_exit(); } @@ -3954,9 +3950,26 @@ maybe_reread_subscription(void) MySubscription->name))); else ereport(LOG, - /* translator: first %s is the name of logical replication worker */ - (errmsg("%s for subscription \"%s\" will restart because of a parameter change", - get_worker_name(), MySubscription->name))); + (errmsg("logical replication worker for subscription \"%s\" will restart because of a parameter change", + MySubscription->name))); + + apply_worker_exit(); + } + + /* + * Exit if the subscription owner's superuser privileges have been + * revoked. + */ + if (!newsub->ownersuperuser && MySubscription->ownersuperuser) + { + if (am_parallel_apply_worker()) + ereport(LOG, + errmsg("logical replication parallel apply worker for subscription \"%s\" will stop because the subscription owner's superuser privileges have been revoked", + MySubscription->name)); + else + ereport(LOG, + errmsg("logical replication worker for subscription \"%s\" will restart because the subscription owner's superuser privileges have been revoked", + MySubscription->name)); apply_worker_exit(); } @@ -4330,6 +4343,57 @@ stream_open_and_write_change(TransactionId xid, char action, StringInfo s) stream_stop_internal(xid); } +/* + * Sets streaming options including replication slot name and origin start + * position. Workers need these options for logical replication. + */ +void +set_stream_options(WalRcvStreamOptions *options, + char *slotname, + XLogRecPtr *origin_startpos) +{ + int server_version; + + options->logical = true; + options->startpoint = *origin_startpos; + options->slotname = slotname; + + server_version = walrcv_server_version(LogRepWorkerWalRcvConn); + options->proto.logical.proto_version = + server_version >= 160000 ? LOGICALREP_PROTO_STREAM_PARALLEL_VERSION_NUM : + server_version >= 150000 ? LOGICALREP_PROTO_TWOPHASE_VERSION_NUM : + server_version >= 140000 ? LOGICALREP_PROTO_STREAM_VERSION_NUM : + LOGICALREP_PROTO_VERSION_NUM; + + options->proto.logical.publication_names = MySubscription->publications; + options->proto.logical.binary = MySubscription->binary; + + /* + * Assign the appropriate option value for streaming option according to + * the 'streaming' mode and the publisher's ability to support that mode. + */ + if (server_version >= 160000 && + MySubscription->stream == LOGICALREP_STREAM_PARALLEL) + { + options->proto.logical.streaming_str = "parallel"; + MyLogicalRepWorker->parallel_apply = true; + } + else if (server_version >= 140000 && + MySubscription->stream != LOGICALREP_STREAM_OFF) + { + options->proto.logical.streaming_str = "on"; + MyLogicalRepWorker->parallel_apply = false; + } + else + { + options->proto.logical.streaming_str = NULL; + MyLogicalRepWorker->parallel_apply = false; + } + + options->proto.logical.twophase = false; + options->proto.logical.origin = pstrdup(MySubscription->origin); +} + /* * Cleanup the memory for subxacts and reset the related variables. */ @@ -4364,91 +4428,158 @@ TwoPhaseTransactionGid(Oid subid, TransactionId xid, char *gid, int szgid) } /* - * Execute the initial sync with error handling. Disable the subscription, - * if it's required. + * Common function to run the apply loop with error handling. Disable the + * subscription, if necessary. * - * Allocate the slot name in long-lived context on return. Note that we don't - * handle FATAL errors which are probably because of system resource error and - * are not repeatable. + * Note that we don't handle FATAL errors which are probably because + * of system resource error and are not repeatable. */ -static void -start_table_sync(XLogRecPtr *origin_startpos, char **myslotname) +void +start_apply(XLogRecPtr origin_startpos) { - char *syncslotname = NULL; - - Assert(am_tablesync_worker()); - PG_TRY(); { - /* Call initial sync. */ - syncslotname = LogicalRepSyncTableStart(origin_startpos); + LogicalRepApplyLoop(origin_startpos); } PG_CATCH(); { + /* + * Reset the origin state to prevent the advancement of origin + * progress if we fail to apply. Otherwise, this will result in + * transaction loss as that transaction won't be sent again by the + * server. + */ + replorigin_reset(0, (Datum) 0); + if (MySubscription->disableonerr) DisableSubscriptionAndExit(); else { /* - * Report the worker failed during table synchronization. Abort - * the current transaction so that the stats message is sent in an + * Report the worker failed while applying changes. Abort the + * current transaction so that the stats message is sent in an * idle state. */ AbortOutOfAnyTransaction(); - pgstat_report_subscription_error(MySubscription->oid, false); + pgstat_report_subscription_error(MySubscription->oid, !am_tablesync_worker()); PG_RE_THROW(); } } PG_END_TRY(); - - /* allocate slot name in long-lived context */ - *myslotname = MemoryContextStrdup(ApplyContext, syncslotname); - pfree(syncslotname); } /* - * Run the apply loop with error handling. Disable the subscription, - * if necessary. + * Runs the leader apply worker. * - * Note that we don't handle FATAL errors which are probably because - * of system resource error and are not repeatable. + * It sets up replication origin, streaming options and then starts streaming. */ static void -start_apply(XLogRecPtr origin_startpos) +run_apply_worker() { - PG_TRY(); + char originname[NAMEDATALEN]; + XLogRecPtr origin_startpos = InvalidXLogRecPtr; + char *slotname = NULL; + WalRcvStreamOptions options; + RepOriginId originid; + TimeLineID startpointTLI; + char *err; + bool must_use_password; + + slotname = MySubscription->slotname; + + /* + * This shouldn't happen if the subscription is enabled, but guard against + * DDL bugs or manual catalog changes. (libpqwalreceiver will crash if + * slot is NULL.) + */ + if (!slotname) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("subscription has no replication slot set"))); + + /* Setup replication origin tracking. */ + ReplicationOriginNameForLogicalRep(MySubscription->oid, InvalidOid, + originname, sizeof(originname)); + StartTransactionCommand(); + originid = replorigin_by_name(originname, true); + if (!OidIsValid(originid)) + originid = replorigin_create(originname); + replorigin_session_setup(originid, 0); + replorigin_session_origin = originid; + origin_startpos = replorigin_session_get_progress(false); + CommitTransactionCommand(); + + /* Is the use of a password mandatory? */ + must_use_password = MySubscription->passwordrequired && + !MySubscription->ownersuperuser; + + LogRepWorkerWalRcvConn = walrcv_connect(MySubscription->conninfo, true, + true, must_use_password, + MySubscription->name, &err); + + if (LogRepWorkerWalRcvConn == NULL) + ereport(ERROR, + (errcode(ERRCODE_CONNECTION_FAILURE), + errmsg("could not connect to the publisher: %s", err))); + + /* + * We don't really use the output identify_system for anything but it does + * some initializations on the upstream so let's still call it. + */ + (void) walrcv_identify_system(LogRepWorkerWalRcvConn, &startpointTLI); + + set_apply_error_context_origin(originname); + + set_stream_options(&options, slotname, &origin_startpos); + + /* + * Even when the two_phase mode is requested by the user, it remains as + * the tri-state PENDING until all tablesyncs have reached READY state. + * Only then, can it become ENABLED. + * + * Note: If the subscription has no tables then leave the state as + * PENDING, which allows ALTER SUBSCRIPTION ... REFRESH PUBLICATION to + * work. + */ + if (MySubscription->twophasestate == LOGICALREP_TWOPHASE_STATE_PENDING && + AllTablesyncsReady()) { - LogicalRepApplyLoop(origin_startpos); + /* Start streaming with two_phase enabled */ + options.proto.logical.twophase = true; + walrcv_startstreaming(LogRepWorkerWalRcvConn, &options); + + StartTransactionCommand(); + UpdateTwoPhaseState(MySubscription->oid, LOGICALREP_TWOPHASE_STATE_ENABLED); + MySubscription->twophasestate = LOGICALREP_TWOPHASE_STATE_ENABLED; + CommitTransactionCommand(); } - PG_CATCH(); + else { - if (MySubscription->disableonerr) - DisableSubscriptionAndExit(); - else - { - /* - * Report the worker failed while applying changes. Abort the - * current transaction so that the stats message is sent in an - * idle state. - */ - AbortOutOfAnyTransaction(); - pgstat_report_subscription_error(MySubscription->oid, !am_tablesync_worker()); - - PG_RE_THROW(); - } + walrcv_startstreaming(LogRepWorkerWalRcvConn, &options); } - PG_END_TRY(); + + ereport(DEBUG1, + (errmsg_internal("logical replication apply worker for subscription \"%s\" two_phase is %s", + MySubscription->name, + MySubscription->twophasestate == LOGICALREP_TWOPHASE_STATE_DISABLED ? "DISABLED" : + MySubscription->twophasestate == LOGICALREP_TWOPHASE_STATE_PENDING ? "PENDING" : + MySubscription->twophasestate == LOGICALREP_TWOPHASE_STATE_ENABLED ? "ENABLED" : + "?"))); + + /* Run the main loop. */ + start_apply(origin_startpos); } /* - * Common initialization for leader apply worker and parallel apply worker. + * Common initialization for leader apply worker, parallel apply worker and + * tablesync worker. * * Initialize the database connection, in-memory subscription and necessary * config options. */ void -InitializeApplyWorker(void) +InitializeLogRepWorker(void) { MemoryContext oldctx; @@ -4478,13 +4609,13 @@ InitializeApplyWorker(void) if (!MySubscription) { ereport(LOG, - /* translator: %s is the name of logical replication worker */ - (errmsg("%s for subscription %u will not start because the subscription was removed during startup", - get_worker_name(), MyLogicalRepWorker->subid))); + (errmsg("logical replication worker for subscription %u will not start because the subscription was removed during startup", + MyLogicalRepWorker->subid))); /* Ensure we remove no-longer-useful entry for worker's start time */ - if (!am_tablesync_worker() && !am_parallel_apply_worker()) + if (am_leader_apply_worker()) ApplyLauncherForgetWorkerStartTime(MyLogicalRepWorker->subid); + proc_exit(0); } @@ -4494,9 +4625,8 @@ InitializeApplyWorker(void) if (!MySubscription->enabled) { ereport(LOG, - /* translator: first %s is the name of logical replication worker */ - (errmsg("%s for subscription \"%s\" will not start because the subscription was disabled during startup", - get_worker_name(), MySubscription->name))); + (errmsg("logical replication worker for subscription \"%s\" will not start because the subscription was disabled during startup", + MySubscription->name))); apply_worker_exit(); } @@ -4505,11 +4635,18 @@ InitializeApplyWorker(void) SetConfigOption("synchronous_commit", MySubscription->synccommit, PGC_BACKEND, PGC_S_OVERRIDE); - /* Keep us informed about subscription changes. */ + /* + * Keep us informed about subscription or role changes. Note that the + * role's superuser privilege can be revoked. + */ CacheRegisterSyscacheCallback(SUBSCRIPTIONOID, subscription_change_cb, (Datum) 0); + CacheRegisterSyscacheCallback(AUTHOID, + subscription_change_cb, + (Datum) 0); + if (am_tablesync_worker()) ereport(LOG, (errmsg("logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started", @@ -4517,29 +4654,32 @@ InitializeApplyWorker(void) get_rel_name(MyLogicalRepWorker->relid)))); else ereport(LOG, - /* translator: first %s is the name of logical replication worker */ - (errmsg("%s for subscription \"%s\" has started", - get_worker_name(), MySubscription->name))); + (errmsg("logical replication apply worker for subscription \"%s\" has started", + MySubscription->name))); CommitTransactionCommand(); } -/* Logical Replication Apply worker entry point */ -void -ApplyWorkerMain(Datum main_arg) +/* + * Reset the origin state. + */ +static void +replorigin_reset(int code, Datum arg) { - int worker_slot = DatumGetInt32(main_arg); - char originname[NAMEDATALEN]; - XLogRecPtr origin_startpos = InvalidXLogRecPtr; - char *myslotname = NULL; - WalRcvStreamOptions options; - int server_version; - - InitializingApplyWorker = true; + replorigin_session_origin = InvalidRepOriginId; + replorigin_session_origin_lsn = InvalidXLogRecPtr; + replorigin_session_origin_timestamp = 0; +} +/* Common function to setup the leader apply or tablesync worker. */ +void +SetupApplyOrSyncWorker(int worker_slot) +{ /* Attach to slot */ logicalrep_worker_attach(worker_slot); + Assert(am_tablesync_worker() || am_leader_apply_worker()); + /* Setup signal handling */ pqsignal(SIGHUP, SignalHandlerForConfigReload); pqsignal(SIGTERM, die); @@ -4557,79 +4697,25 @@ ApplyWorkerMain(Datum main_arg) /* Load the libpq-specific functions */ load_file("libpqwalreceiver", false); - InitializeApplyWorker(); + InitializeLogRepWorker(); - InitializingApplyWorker = false; + /* + * Register a callback to reset the origin state before aborting any + * pending transaction during shutdown (see ShutdownPostgres()). This will + * avoid origin advancement for an in-complete transaction which could + * otherwise lead to its loss as such a transaction won't be sent by the + * server again. + * + * Note that even a LOG or DEBUG statement placed after setting the origin + * state may process a shutdown signal before committing the current apply + * operation. So, it is important to register such a callback here. + */ + before_shmem_exit(replorigin_reset, (Datum) 0); /* Connect to the origin and start the replication. */ elog(DEBUG1, "connecting to publisher using connection string \"%s\"", MySubscription->conninfo); - if (am_tablesync_worker()) - { - start_table_sync(&origin_startpos, &myslotname); - - ReplicationOriginNameForLogicalRep(MySubscription->oid, - MyLogicalRepWorker->relid, - originname, - sizeof(originname)); - set_apply_error_context_origin(originname); - } - else - { - /* This is the leader apply worker */ - RepOriginId originid; - TimeLineID startpointTLI; - char *err; - bool must_use_password; - - myslotname = MySubscription->slotname; - - /* - * This shouldn't happen if the subscription is enabled, but guard - * against DDL bugs or manual catalog changes. (libpqwalreceiver will - * crash if slot is NULL.) - */ - if (!myslotname) - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("subscription has no replication slot set"))); - - /* Setup replication origin tracking. */ - StartTransactionCommand(); - ReplicationOriginNameForLogicalRep(MySubscription->oid, InvalidOid, - originname, sizeof(originname)); - originid = replorigin_by_name(originname, true); - if (!OidIsValid(originid)) - originid = replorigin_create(originname); - replorigin_session_setup(originid, 0); - replorigin_session_origin = originid; - origin_startpos = replorigin_session_get_progress(false); - - /* Is the use of a password mandatory? */ - must_use_password = MySubscription->passwordrequired && - !superuser_arg(MySubscription->owner); - - /* Note that the superuser_arg call can access the DB */ - CommitTransactionCommand(); - - LogRepWorkerWalRcvConn = walrcv_connect(MySubscription->conninfo, true, - must_use_password, - MySubscription->name, &err); - if (LogRepWorkerWalRcvConn == NULL) - ereport(ERROR, - (errcode(ERRCODE_CONNECTION_FAILURE), - errmsg("could not connect to the publisher: %s", err))); - - /* - * We don't really use the output identify_system for anything but it - * does some initializations on the upstream so let's still call it. - */ - (void) walrcv_identify_system(LogRepWorkerWalRcvConn, &startpointTLI); - - set_apply_error_context_origin(originname); - } - /* * Setup callback for syscache so that we know when something changes in * the subscription relation state. @@ -4637,91 +4723,21 @@ ApplyWorkerMain(Datum main_arg) CacheRegisterSyscacheCallback(SUBSCRIPTIONRELMAP, invalidate_syncing_table_states, (Datum) 0); +} - /* Build logical replication streaming options. */ - options.logical = true; - options.startpoint = origin_startpos; - options.slotname = myslotname; - - server_version = walrcv_server_version(LogRepWorkerWalRcvConn); - options.proto.logical.proto_version = - server_version >= 160000 ? LOGICALREP_PROTO_STREAM_PARALLEL_VERSION_NUM : - server_version >= 150000 ? LOGICALREP_PROTO_TWOPHASE_VERSION_NUM : - server_version >= 140000 ? LOGICALREP_PROTO_STREAM_VERSION_NUM : - LOGICALREP_PROTO_VERSION_NUM; - - options.proto.logical.publication_names = MySubscription->publications; - options.proto.logical.binary = MySubscription->binary; - - /* - * Assign the appropriate option value for streaming option according to - * the 'streaming' mode and the publisher's ability to support that mode. - */ - if (server_version >= 160000 && - MySubscription->stream == LOGICALREP_STREAM_PARALLEL) - { - options.proto.logical.streaming_str = "parallel"; - MyLogicalRepWorker->parallel_apply = true; - } - else if (server_version >= 140000 && - MySubscription->stream != LOGICALREP_STREAM_OFF) - { - options.proto.logical.streaming_str = "on"; - MyLogicalRepWorker->parallel_apply = false; - } - else - { - options.proto.logical.streaming_str = NULL; - MyLogicalRepWorker->parallel_apply = false; - } - - options.proto.logical.twophase = false; - options.proto.logical.origin = pstrdup(MySubscription->origin); +/* Logical Replication Apply worker entry point */ +void +ApplyWorkerMain(Datum main_arg) +{ + int worker_slot = DatumGetInt32(main_arg); - if (!am_tablesync_worker()) - { - /* - * Even when the two_phase mode is requested by the user, it remains - * as the tri-state PENDING until all tablesyncs have reached READY - * state. Only then, can it become ENABLED. - * - * Note: If the subscription has no tables then leave the state as - * PENDING, which allows ALTER SUBSCRIPTION ... REFRESH PUBLICATION to - * work. - */ - if (MySubscription->twophasestate == LOGICALREP_TWOPHASE_STATE_PENDING && - AllTablesyncsReady()) - { - /* Start streaming with two_phase enabled */ - options.proto.logical.twophase = true; - walrcv_startstreaming(LogRepWorkerWalRcvConn, &options); + InitializingApplyWorker = true; - StartTransactionCommand(); - UpdateTwoPhaseState(MySubscription->oid, LOGICALREP_TWOPHASE_STATE_ENABLED); - MySubscription->twophasestate = LOGICALREP_TWOPHASE_STATE_ENABLED; - CommitTransactionCommand(); - } - else - { - walrcv_startstreaming(LogRepWorkerWalRcvConn, &options); - } + SetupApplyOrSyncWorker(worker_slot); - ereport(DEBUG1, - (errmsg_internal("logical replication apply worker for subscription \"%s\" two_phase is %s", - MySubscription->name, - MySubscription->twophasestate == LOGICALREP_TWOPHASE_STATE_DISABLED ? "DISABLED" : - MySubscription->twophasestate == LOGICALREP_TWOPHASE_STATE_PENDING ? "PENDING" : - MySubscription->twophasestate == LOGICALREP_TWOPHASE_STATE_ENABLED ? "ENABLED" : - "?"))); - } - else - { - /* Start normal logical streaming replication. */ - walrcv_startstreaming(LogRepWorkerWalRcvConn, &options); - } + InitializingApplyWorker = false; - /* Run the main loop. */ - start_apply(origin_startpos); + run_apply_worker(); proc_exit(0); } @@ -4730,7 +4746,7 @@ ApplyWorkerMain(Datum main_arg) * After error recovery, disable the subscription in a new transaction * and exit cleanly. */ -static void +void DisableSubscriptionAndExit(void) { /* @@ -4755,7 +4771,7 @@ DisableSubscriptionAndExit(void) CommitTransactionCommand(); /* Ensure we remove no-longer-useful entry for worker's start time */ - if (!am_tablesync_worker() && !am_parallel_apply_worker()) + if (am_leader_apply_worker()) ApplyLauncherForgetWorkerStartTime(MyLogicalRepWorker->subid); /* Notify the subscription has been disabled and exit */ diff --git a/src/backend/replication/meson.build b/src/backend/replication/meson.build index c158a75147b13..c4f6c71a49e97 100644 --- a/src/backend/replication/meson.build +++ b/src/backend/replication/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'slot.c', diff --git a/src/backend/replication/pgoutput/Makefile b/src/backend/replication/pgoutput/Makefile index 3b41fbcfac244..d89d317fe7a27 100644 --- a/src/backend/replication/pgoutput/Makefile +++ b/src/backend/replication/pgoutput/Makefile @@ -28,5 +28,5 @@ installdirs: installdirs-lib uninstall: uninstall-lib -clean distclean maintainer-clean: clean-lib +clean distclean: clean-lib rm -f $(OBJS) diff --git a/src/backend/replication/pgoutput/meson.build b/src/backend/replication/pgoutput/meson.build index 243c92d04a9f9..c0c7fec267ed8 100644 --- a/src/backend/replication/pgoutput/meson.build +++ b/src/backend/replication/pgoutput/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pgoutput_sources = files( 'pgoutput.c', diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index b08ca55041750..99518c6b6dd1e 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -3,7 +3,7 @@ * pgoutput.c * Logical Replication output plugin * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/pgoutput/pgoutput.c @@ -22,7 +22,6 @@ #include "executor/executor.h" #include "fmgr.h" #include "nodes/makefuncs.h" -#include "optimizer/optimizer.h" #include "parser/parse_relation.h" #include "replication/logical.h" #include "replication/logicalproto.h" @@ -81,8 +80,13 @@ static void pgoutput_stream_prepare_txn(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr prepare_lsn); static bool publications_valid; -static bool in_streaming; -static bool publish_no_origin; + +/* + * Private memory context for publication data, created in + * PGOutputData->context when starting pgoutput, and set to NULL when its + * parent context is reset via a dedicated MemoryContextCallback. + */ +static MemoryContext pubctx = NULL; static List *LoadPublications(List *pubnames); static void publication_invalidation_cb(Datum arg, int cacheid, @@ -102,7 +106,7 @@ enum RowFilterPubAction { PUBACTION_INSERT, PUBACTION_UPDATE, - PUBACTION_DELETE + PUBACTION_DELETE, }; #define NUM_ROWFILTER_PUBACTIONS (PUBACTION_DELETE+1) @@ -381,25 +385,46 @@ parse_output_parameters(List *options, PGOutputData *data) } else if (strcmp(defel->defname, "origin") == 0) { + char *origin; + if (origin_option_given) ereport(ERROR, errcode(ERRCODE_SYNTAX_ERROR), errmsg("conflicting or redundant options")); origin_option_given = true; - data->origin = defGetString(defel); - if (pg_strcasecmp(data->origin, LOGICALREP_ORIGIN_NONE) == 0) - publish_no_origin = true; - else if (pg_strcasecmp(data->origin, LOGICALREP_ORIGIN_ANY) == 0) - publish_no_origin = false; + origin = defGetString(defel); + if (pg_strcasecmp(origin, LOGICALREP_ORIGIN_NONE) == 0) + data->publish_no_origin = true; + else if (pg_strcasecmp(origin, LOGICALREP_ORIGIN_ANY) == 0) + data->publish_no_origin = false; else ereport(ERROR, errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("unrecognized origin value: \"%s\"", data->origin)); + errmsg("unrecognized origin value: \"%s\"", origin)); } else elog(ERROR, "unrecognized pgoutput option: %s", defel->defname); } + + /* Check required options */ + if (!protocol_version_given) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("option \"%s\" missing", "proto_version")); + if (!publication_names_given) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("option \"%s\" missing", "publication_names")); +} + +/* + * Callback of PGOutputData->context in charge of cleaning pubctx. + */ +static void +pgoutput_pubctx_reset_callback(void *arg) +{ + pubctx = NULL; } /* @@ -411,6 +436,7 @@ pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt, { PGOutputData *data = palloc0(sizeof(PGOutputData)); static bool publication_callback_registered = false; + MemoryContextCallback *mcallback; /* Create our memory context for private allocations. */ data->context = AllocSetContextCreate(ctx->context, @@ -421,6 +447,15 @@ pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt, "logical replication cache context", ALLOCSET_DEFAULT_SIZES); + Assert(pubctx == NULL); + pubctx = AllocSetContextCreate(ctx->context, + "logical replication publication list context", + ALLOCSET_SMALL_SIZES); + + mcallback = palloc0(sizeof(MemoryContextCallback)); + mcallback->func = pgoutput_pubctx_reset_callback; + MemoryContextRegisterResetCallback(ctx->context, mcallback); + ctx->output_plugin_private = data; /* This plugin uses binary protocol. */ @@ -449,11 +484,6 @@ pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt, errmsg("client sent proto_version=%d but server only supports protocol %d or higher", data->protocol_version, LOGICALREP_PROTO_MIN_VERSION_NUM))); - if (data->publication_names == NIL) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("publication_names parameter missing"))); - /* * Decide whether to enable streaming. It is disabled by default, in * which case we just update the flag in decoding context. Otherwise @@ -479,9 +509,6 @@ pgoutput_startup(LogicalDecodingContext *ctx, OutputPluginOptions *opt, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("streaming requested, but not supported by output plugin"))); - /* Also remember we're currently not streaming any transaction. */ - in_streaming = false; - /* * Here, we just check whether the two-phase option is passed by * plugin and decide whether to enable it at later point of time. It @@ -679,6 +706,7 @@ maybe_send_schema(LogicalDecodingContext *ctx, ReorderBufferChange *change, Relation relation, RelationSyncEntry *relentry) { + PGOutputData *data = (PGOutputData *) ctx->output_plugin_private; bool schema_sent; TransactionId xid = InvalidTransactionId; TransactionId topxid = InvalidTransactionId; @@ -691,7 +719,7 @@ maybe_send_schema(LogicalDecodingContext *ctx, * If we're not in a streaming block, just use InvalidTransactionId and * the write methods will not include it. */ - if (in_streaming) + if (data->in_streaming) xid = change->txn->xid; if (rbtxn_is_subtxn(change->txn)) @@ -711,7 +739,7 @@ maybe_send_schema(LogicalDecodingContext *ctx, * doing that we need to study its impact on the case where we have a mix * of streaming and non-streaming transactions. */ - if (in_streaming) + if (data->in_streaming) schema_sent = get_schema_sent_in_streamed_txn(relentry, topxid); else schema_sent = relentry->schema_sent; @@ -735,7 +763,7 @@ maybe_send_schema(LogicalDecodingContext *ctx, send_relation_and_attrs(relation, xid, ctx, relentry->columns); - if (in_streaming) + if (data->in_streaming) set_schema_sent_in_streamed_txn(relentry, topxid); else relentry->schema_sent = true; @@ -1138,8 +1166,8 @@ init_tuple_slot(PGOutputData *data, Relation relation, * Create tuple table slots. Create a copy of the TupleDesc as it needs to * live as long as the cache remains. */ - oldtupdesc = CreateTupleDescCopy(RelationGetDescr(relation)); - newtupdesc = CreateTupleDescCopy(RelationGetDescr(relation)); + oldtupdesc = CreateTupleDescCopyConstr(RelationGetDescr(relation)); + newtupdesc = CreateTupleDescCopyConstr(RelationGetDescr(relation)); entry->old_slot = MakeSingleTupleTableSlot(oldtupdesc, &TTSOpsHeapTuple); entry->new_slot = MakeSingleTupleTableSlot(newtupdesc, &TTSOpsHeapTuple); @@ -1156,8 +1184,8 @@ init_tuple_slot(PGOutputData *data, Relation relation, TupleDesc indesc = RelationGetDescr(relation); TupleDesc outdesc = RelationGetDescr(ancestor); - /* Map must live as long as the session does. */ - oldctx = MemoryContextSwitchTo(CacheMemoryContext); + /* Map must live as long as the logical decoding context. */ + oldctx = MemoryContextSwitchTo(data->cachectx); entry->attrmap = build_attrmap_by_name_if_req(indesc, outdesc, false); @@ -1421,7 +1449,7 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, * their association and on aborts, it can discard the corresponding * changes. */ - if (in_streaming) + if (data->in_streaming) xid = change->txn->xid; relentry = get_rel_sync_entry(data, relation); @@ -1470,7 +1498,7 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, if (change->data.tp.oldtuple) { old_slot = relentry->old_slot; - ExecStoreHeapTuple(&change->data.tp.oldtuple->tuple, old_slot, false); + ExecStoreHeapTuple(change->data.tp.oldtuple, old_slot, false); /* Convert tuple if needed. */ if (relentry->attrmap) @@ -1485,7 +1513,7 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, if (change->data.tp.newtuple) { new_slot = relentry->new_slot; - ExecStoreHeapTuple(&change->data.tp.newtuple->tuple, new_slot, false); + ExecStoreHeapTuple(change->data.tp.newtuple, new_slot, false); /* Convert tuple if needed. */ if (relentry->attrmap) @@ -1552,6 +1580,16 @@ pgoutput_change(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, ancestor = NULL; } + /* Drop the new slots that were used to store the converted tuples. */ + if (relentry->attrmap) + { + if (old_slot) + ExecDropSingleTupleTableSlot(old_slot); + + if (new_slot) + ExecDropSingleTupleTableSlot(new_slot); + } + MemoryContextSwitchTo(old); MemoryContextReset(data->context); } @@ -1570,7 +1608,7 @@ pgoutput_truncate(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, TransactionId xid = InvalidTransactionId; /* Remember the xid for the change in streaming mode. See pgoutput_change. */ - if (in_streaming) + if (data->in_streaming) xid = change->txn->xid; old = MemoryContextSwitchTo(data->context); @@ -1639,7 +1677,7 @@ pgoutput_message(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, * Remember the xid for the message in streaming mode. See * pgoutput_change. */ - if (in_streaming) + if (data->in_streaming) xid = txn->xid; /* @@ -1673,7 +1711,9 @@ static bool pgoutput_origin_filter(LogicalDecodingContext *ctx, RepOriginId origin_id) { - if (publish_no_origin && origin_id != InvalidRepOriginId) + PGOutputData *data = (PGOutputData *) ctx->output_plugin_private; + + if (data->publish_no_origin && origin_id != InvalidRepOriginId) return true; return false; @@ -1682,9 +1722,9 @@ pgoutput_origin_filter(LogicalDecodingContext *ctx, /* * Shutdown the output plugin. * - * Note, we don't need to clean the data->context and data->cachectx as - * they are child contexts of the ctx->context so they will be cleaned up by - * logical decoding machinery. + * Note, we don't need to clean the data->context, data->cachectx and pubctx + * as they are child contexts of the ctx->context so they will be cleaned up + * by logical decoding machinery. */ static void pgoutput_shutdown(LogicalDecodingContext *ctx) @@ -1694,6 +1734,9 @@ pgoutput_shutdown(LogicalDecodingContext *ctx) hash_destroy(RelationSyncCache); RelationSyncCache = NULL; } + + /* Better safe than sorry */ + pubctx = NULL; } /* @@ -1740,10 +1783,11 @@ static void pgoutput_stream_start(struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn) { + PGOutputData *data = (PGOutputData *) ctx->output_plugin_private; bool send_replication_origin = txn->origin_id != InvalidRepOriginId; /* we can't nest streaming of transactions */ - Assert(!in_streaming); + Assert(!data->in_streaming); /* * If we already sent the first stream for this transaction then don't @@ -1761,7 +1805,7 @@ pgoutput_stream_start(struct LogicalDecodingContext *ctx, OutputPluginWrite(ctx, true); /* we're streaming a chunk of transaction now */ - in_streaming = true; + data->in_streaming = true; } /* @@ -1771,15 +1815,17 @@ static void pgoutput_stream_stop(struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn) { + PGOutputData *data = (PGOutputData *) ctx->output_plugin_private; + /* we should be streaming a transaction */ - Assert(in_streaming); + Assert(data->in_streaming); OutputPluginPrepareWrite(ctx, true); logicalrep_write_stream_stop(ctx->out); OutputPluginWrite(ctx, true); /* we've stopped streaming a transaction */ - in_streaming = false; + data->in_streaming = false; } /* @@ -1799,7 +1845,7 @@ pgoutput_stream_abort(struct LogicalDecodingContext *ctx, * The abort should happen outside streaming block, even for streamed * transactions. The transaction has to be marked as streamed, though. */ - Assert(!in_streaming); + Assert(!data->in_streaming); /* determine the toplevel transaction */ toptxn = rbtxn_get_toptxn(txn); @@ -1824,11 +1870,13 @@ pgoutput_stream_commit(struct LogicalDecodingContext *ctx, ReorderBufferTXN *txn, XLogRecPtr commit_lsn) { + PGOutputData *data PG_USED_FOR_ASSERTS_ONLY = (PGOutputData *) ctx->output_plugin_private; + /* * The commit should happen outside streaming block, even for streamed * transactions. The transaction has to be marked as streamed, though. */ - Assert(!in_streaming); + Assert(!data->in_streaming); Assert(rbtxn_is_streamed(txn)); OutputPluginUpdateProgress(ctx, false); @@ -2005,12 +2053,11 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) /* Reload publications if needed before use. */ if (!publications_valid) { - oldctx = MemoryContextSwitchTo(CacheMemoryContext); - if (data->publications) - { - list_free_deep(data->publications); - data->publications = NIL; - } + Assert(pubctx); + + MemoryContextReset(pubctx); + oldctx = MemoryContextSwitchTo(pubctx); + data->publications = LoadPublications(data->publication_names); MemoryContextSwitchTo(oldctx); publications_valid = true; @@ -2036,10 +2083,34 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) * Tuple slots cleanups. (Will be rebuilt later if needed). */ if (entry->old_slot) + { + TupleDesc desc = entry->old_slot->tts_tupleDescriptor; + + Assert(desc->tdrefcount == -1); + ExecDropSingleTupleTableSlot(entry->old_slot); + + /* + * ExecDropSingleTupleTableSlot() would not free the TupleDesc, so + * do it now to avoid any leaks. + */ + FreeTupleDesc(desc); + } if (entry->new_slot) + { + TupleDesc desc = entry->new_slot->tts_tupleDescriptor; + + Assert(desc->tdrefcount == -1); + ExecDropSingleTupleTableSlot(entry->new_slot); + /* + * ExecDropSingleTupleTableSlot() would not free the TupleDesc, so + * do it now to avoid any leaks. + */ + FreeTupleDesc(desc); + } + entry->old_slot = NULL; entry->new_slot = NULL; @@ -2224,7 +2295,6 @@ cleanup_rel_sync_cache(TransactionId xid, bool is_commit) { HASH_SEQ_STATUS hash_seq; RelationSyncEntry *entry; - ListCell *lc; Assert(RelationSyncCache != NULL); @@ -2237,15 +2307,15 @@ cleanup_rel_sync_cache(TransactionId xid, bool is_commit) * corresponding schema and we don't need to send it unless there is * any invalidation for that relation. */ - foreach(lc, entry->streamed_txns) + foreach_xid(streamed_txn, entry->streamed_txns) { - if (xid == lfirst_xid(lc)) + if (xid == streamed_txn) { if (is_commit) entry->schema_sent = true; entry->streamed_txns = - foreach_delete_current(entry->streamed_txns, lc); + foreach_delete_current(entry->streamed_txns, streamed_txn); break; } } @@ -2262,8 +2332,8 @@ rel_sync_cache_relation_cb(Datum arg, Oid relid) /* * We can get here if the plugin was used in SQL interface as the - * RelSchemaSyncCache is destroyed when the decoding finishes, but there - * is no way to unregister the relcache invalidation callback. + * RelationSyncCache is destroyed when the decoding finishes, but there is + * no way to unregister the relcache invalidation callback. */ if (RelationSyncCache == NULL) return; @@ -2314,8 +2384,8 @@ rel_sync_cache_publication_cb(Datum arg, int cacheid, uint32 hashvalue) /* * We can get here if the plugin was used in SQL interface as the - * RelSchemaSyncCache is destroyed when the decoding finishes, but there - * is no way to unregister the invalidation callbacks. + * RelationSyncCache is destroyed when the decoding finishes, but there is + * no way to unregister the invalidation callbacks. */ if (RelationSyncCache == NULL) return; diff --git a/src/backend/replication/repl_gram.y b/src/backend/replication/repl_gram.y index 0c874e33cf6ab..53780bbf29701 100644 --- a/src/backend/replication/repl_gram.y +++ b/src/backend/replication/repl_gram.y @@ -3,7 +3,7 @@ * * repl_gram.y - Parser for the replication commands * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -64,6 +64,7 @@ Node *replication_parse_result; %token K_START_REPLICATION %token K_CREATE_REPLICATION_SLOT %token K_DROP_REPLICATION_SLOT +%token K_ALTER_REPLICATION_SLOT %token K_TIMELINE_HISTORY %token K_WAIT %token K_TIMELINE @@ -76,11 +77,13 @@ Node *replication_parse_result; %token K_EXPORT_SNAPSHOT %token K_NOEXPORT_SNAPSHOT %token K_USE_SNAPSHOT +%token K_UPLOAD_MANIFEST %type command %type base_backup start_replication start_logical_replication - create_replication_slot drop_replication_slot identify_system - read_replication_slot timeline_history show + create_replication_slot drop_replication_slot + alter_replication_slot identify_system read_replication_slot + timeline_history show upload_manifest %type generic_option_list %type generic_option %type opt_timeline @@ -111,9 +114,11 @@ command: | start_logical_replication | create_replication_slot | drop_replication_slot + | alter_replication_slot | read_replication_slot | timeline_history | show + | upload_manifest ; /* @@ -257,8 +262,20 @@ drop_replication_slot: } ; +/* ALTER_REPLICATION_SLOT slot (options) */ +alter_replication_slot: + K_ALTER_REPLICATION_SLOT IDENT '(' generic_option_list ')' + { + AlterReplicationSlotCmd *cmd; + cmd = makeNode(AlterReplicationSlotCmd); + cmd->slotname = $2; + cmd->options = $4; + $$ = (Node *) cmd; + } + ; + /* - * START_REPLICATION [SLOT slot] [PHYSICAL] %X/%X [TIMELINE %d] + * START_REPLICATION [SLOT slot] [PHYSICAL] %X/%X [TIMELINE %u] */ start_replication: K_START_REPLICATION opt_slot opt_physical RECPTR opt_timeline @@ -288,7 +305,7 @@ start_logical_replication: } ; /* - * TIMELINE_HISTORY %d + * TIMELINE_HISTORY %u */ timeline_history: K_TIMELINE_HISTORY UCONST @@ -307,6 +324,15 @@ timeline_history: } ; +/* UPLOAD_MANIFEST doesn't currently accept any arguments */ +upload_manifest: + K_UPLOAD_MANIFEST + { + UploadManifestCmd *cmd = makeNode(UploadManifestCmd); + + $$ = (Node *) cmd; + } + opt_physical: K_PHYSICAL | /* EMPTY */ @@ -399,6 +425,7 @@ ident_or_keyword: | K_START_REPLICATION { $$ = "start_replication"; } | K_CREATE_REPLICATION_SLOT { $$ = "create_replication_slot"; } | K_DROP_REPLICATION_SLOT { $$ = "drop_replication_slot"; } + | K_ALTER_REPLICATION_SLOT { $$ = "alter_replication_slot"; } | K_TIMELINE_HISTORY { $$ = "timeline_history"; } | K_WAIT { $$ = "wait"; } | K_TIMELINE { $$ = "timeline"; } @@ -411,6 +438,7 @@ ident_or_keyword: | K_EXPORT_SNAPSHOT { $$ = "export_snapshot"; } | K_NOEXPORT_SNAPSHOT { $$ = "noexport_snapshot"; } | K_USE_SNAPSHOT { $$ = "use_snapshot"; } + | K_UPLOAD_MANIFEST { $$ = "upload_manifest"; } ; %% diff --git a/src/backend/replication/repl_scanner.l b/src/backend/replication/repl_scanner.l index cb467ca46f7f0..e7def800655f3 100644 --- a/src/backend/replication/repl_scanner.l +++ b/src/backend/replication/repl_scanner.l @@ -4,7 +4,7 @@ * repl_scanner.l * a lexical scanner for the replication commands * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -73,7 +73,7 @@ static void addlitchar(unsigned char ychar); %x xd %x xq -space [ \t\n\r\f] +space [ \t\n\r\f\v] quote ' quotestop {quote} @@ -125,6 +125,7 @@ TIMELINE { return K_TIMELINE; } START_REPLICATION { return K_START_REPLICATION; } CREATE_REPLICATION_SLOT { return K_CREATE_REPLICATION_SLOT; } DROP_REPLICATION_SLOT { return K_DROP_REPLICATION_SLOT; } +ALTER_REPLICATION_SLOT { return K_ALTER_REPLICATION_SLOT; } TIMELINE_HISTORY { return K_TIMELINE_HISTORY; } PHYSICAL { return K_PHYSICAL; } RESERVE_WAL { return K_RESERVE_WAL; } @@ -136,6 +137,7 @@ EXPORT_SNAPSHOT { return K_EXPORT_SNAPSHOT; } NOEXPORT_SNAPSHOT { return K_NOEXPORT_SNAPSHOT; } USE_SNAPSHOT { return K_USE_SNAPSHOT; } WAIT { return K_WAIT; } +UPLOAD_MANIFEST { return K_UPLOAD_MANIFEST; } {space}+ { /* do nothing */ } @@ -301,8 +303,10 @@ replication_scanner_is_replication_command(void) case K_START_REPLICATION: case K_CREATE_REPLICATION_SLOT: case K_DROP_REPLICATION_SLOT: + case K_ALTER_REPLICATION_SLOT: case K_READ_REPLICATION_SLOT: case K_TIMELINE_HISTORY: + case K_UPLOAD_MANIFEST: case K_SHOW: /* Yes; push back the first token so we can parse later. */ repl_pushed_back_token = first_token; diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 1dc27264f61ee..a1d4768623f55 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -4,7 +4,7 @@ * Replication slot management. * * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -46,12 +46,17 @@ #include "common/string.h" #include "miscadmin.h" #include "pgstat.h" +#include "postmaster/interrupt.h" +#include "replication/slotsync.h" #include "replication/slot.h" +#include "replication/walsender_private.h" #include "storage/fd.h" #include "storage/ipc.h" #include "storage/proc.h" #include "storage/procarray.h" #include "utils/builtins.h" +#include "utils/guc_hooks.h" +#include "utils/varlena.h" /* * Replication slot on-disk data structure. @@ -76,6 +81,40 @@ typedef struct ReplicationSlotOnDisk ReplicationSlotPersistentData slotdata; } ReplicationSlotOnDisk; +/* + * Struct for the configuration of synchronized_standby_slots. + * + * Note: this must be a flat representation that can be held in a single chunk + * of guc_malloc'd memory, so that it can be stored as the "extra" data for the + * synchronized_standby_slots GUC. + */ +typedef struct +{ + /* Number of slot names in the slot_names[] */ + int nslotnames; + + /* + * slot_names contains 'nslotnames' consecutive null-terminated C strings. + */ + char slot_names[FLEXIBLE_ARRAY_MEMBER]; +} SyncStandbySlotsConfigData; + +/* + * Lookup table for slot invalidation causes. + */ +const char *const SlotInvalidationCauses[] = { + [RS_INVAL_NONE] = "none", + [RS_INVAL_WAL_REMOVED] = "wal_removed", + [RS_INVAL_HORIZON] = "rows_removed", + [RS_INVAL_WAL_LEVEL] = "wal_level_insufficient", +}; + +/* Maximum number of invalidation causes */ +#define RS_INVAL_MAX_CAUSES RS_INVAL_WAL_LEVEL + +StaticAssertDecl(lengthof(SlotInvalidationCauses) == (RS_INVAL_MAX_CAUSES + 1), + "array length mismatch"); + /* size of version independent data */ #define ReplicationSlotOnDiskConstantSize \ offsetof(ReplicationSlotOnDisk, slotdata) @@ -90,7 +129,7 @@ typedef struct ReplicationSlotOnDisk sizeof(ReplicationSlotOnDisk) - ReplicationSlotOnDiskConstantSize #define SLOT_MAGIC 0x1051CA1 /* format identifier */ -#define SLOT_VERSION 3 /* version for new files */ +#define SLOT_VERSION 5 /* version for new files */ /* Control array for replication slot management */ ReplicationSlotCtlData *ReplicationSlotCtl = NULL; @@ -98,12 +137,26 @@ ReplicationSlotCtlData *ReplicationSlotCtl = NULL; /* My backend's replication slot in the shared memory array */ ReplicationSlot *MyReplicationSlot = NULL; -/* GUC variable */ +/* GUC variables */ int max_replication_slots = 10; /* the maximum number of replication * slots */ +/* + * This GUC lists streaming replication standby server slot names that + * logical WAL sender processes will wait for. + */ +char *synchronized_standby_slots; + +/* This is the parsed and cached configuration for synchronized_standby_slots */ +static SyncStandbySlotsConfigData *synchronized_standby_slots_config; + +/* + * Oldest LSN that has been confirmed to be flushed to the standbys + * corresponding to the physical slots specified in the synchronized_standby_slots GUC. + */ +static XLogRecPtr ss_oldest_flush_lsn = InvalidXLogRecPtr; + static void ReplicationSlotShmemExit(int code, Datum arg); -static void ReplicationSlotDropAcquired(void); static void ReplicationSlotDropPtr(ReplicationSlot *slot); /* internal persistency functions */ @@ -184,7 +237,7 @@ ReplicationSlotShmemExit(int code, Datum arg) ReplicationSlotRelease(); /* Also cleanup all the temporary slots. */ - ReplicationSlotCleanup(); + ReplicationSlotCleanup(false); } /* @@ -248,10 +301,14 @@ ReplicationSlotValidateName(const char *name, int elevel) * during getting changes, if the two_phase option is enabled it can skip * prepare because by that time start decoding point has been moved. So the * user will only get commit prepared. + * failover: If enabled, allows the slot to be synced to standbys so + * that logical replication can be resumed after failover. + * synced: True if the slot is synchronized from the primary server. */ void ReplicationSlotCreate(const char *name, bool db_specific, - ReplicationSlotPersistency persistency, bool two_phase) + ReplicationSlotPersistency persistency, + bool two_phase, bool failover, bool synced) { ReplicationSlot *slot = NULL; int i; @@ -260,6 +317,34 @@ ReplicationSlotCreate(const char *name, bool db_specific, ReplicationSlotValidateName(name, ERROR); + if (failover) + { + /* + * Do not allow users to create the failover enabled slots on the + * standby as we do not support sync to the cascading standby. + * + * However, failover enabled slots can be created during slot + * synchronization because we need to retain the same values as the + * remote slot. + */ + if (RecoveryInProgress() && !IsSyncingReplicationSlots()) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot enable failover for a replication slot created on the standby")); + + /* + * Do not allow users to create failover enabled temporary slots, + * because temporary slots will not be synced to the standby. + * + * However, failover enabled temporary slots can be created during + * slot synchronization. See the comments atop slotsync.c for details. + */ + if (persistency == RS_TEMPORARY && !IsSyncingReplicationSlots()) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot enable failover for a temporary replication slot")); + } + /* * If some other backend ran this code concurrently with us, we'd likely * both allocate the same slot, and that would be bad. We'd also be at @@ -293,7 +378,7 @@ ReplicationSlotCreate(const char *name, bool db_specific, ereport(ERROR, (errcode(ERRCODE_CONFIGURATION_LIMIT_EXCEEDED), errmsg("all replication slots are in use"), - errhint("Free one or increase max_replication_slots."))); + errhint("Free one or increase \"max_replication_slots\"."))); /* * Since this slot is not in use, nobody should be looking at any part of @@ -311,6 +396,8 @@ ReplicationSlotCreate(const char *name, bool db_specific, slot->data.persistency = persistency; slot->data.two_phase = two_phase; slot->data.two_phase_at = InvalidXLogRecPtr; + slot->data.failover = failover; + slot->data.synced = synced; /* and then data only present in shared memory */ slot->just_dirtied = false; @@ -321,6 +408,8 @@ ReplicationSlotCreate(const char *name, bool db_specific, slot->candidate_xmin_lsn = InvalidXLogRecPtr; slot->candidate_restart_valid = InvalidXLogRecPtr; slot->candidate_restart_lsn = InvalidXLogRecPtr; + slot->last_saved_confirmed_flush = InvalidXLogRecPtr; + slot->inactive_since = 0; /* * Create the slot on disk. We haven't actually marked the slot allocated @@ -460,10 +549,7 @@ ReplicationSlotAcquire(const char *name, bool nowait) LWLockAcquire(ReplicationSlotControlLock, LW_SHARED); - /* - * Search for the slot with the specified name if the slot to acquire is - * not given. If the slot is not found, we either return -1 or error out. - */ + /* Check if the slot exits with the given name. */ s = SearchNamedReplicationSlot(name, false); if (s == NULL || !s->in_use) { @@ -536,6 +622,24 @@ ReplicationSlotAcquire(const char *name, bool nowait) */ if (SlotIsLogical(s)) pgstat_acquire_replslot(s); + + /* + * Reset the time since the slot has become inactive as the slot is active + * now. + */ + SpinLockAcquire(&s->mutex); + s->inactive_since = 0; + SpinLockRelease(&s->mutex); + + if (am_walsender) + { + ereport(log_replication_commands ? LOG : DEBUG1, + SlotIsLogical(s) + ? errmsg("acquired logical replication slot \"%s\"", + NameStr(s->data.name)) + : errmsg("acquired physical replication slot \"%s\"", + NameStr(s->data.name))); + } } /* @@ -548,9 +652,18 @@ void ReplicationSlotRelease(void) { ReplicationSlot *slot = MyReplicationSlot; + char *slotname = NULL; /* keep compiler quiet */ + bool is_logical = false; /* keep compiler quiet */ + TimestampTz now = 0; Assert(slot != NULL && slot->active_pid != 0); + if (am_walsender) + { + slotname = pstrdup(NameStr(slot->data.name)); + is_logical = SlotIsLogical(slot); + } + if (slot->data.persistency == RS_EPHEMERAL) { /* @@ -576,6 +689,12 @@ ReplicationSlotRelease(void) ReplicationSlotsComputeRequiredXmin(false); } + /* + * Set the time since the slot has become inactive. We get the current + * time beforehand to avoid system call while holding the spinlock. + */ + now = GetCurrentTimestamp(); + if (slot->data.persistency == RS_PERSISTENT) { /* @@ -584,9 +703,16 @@ ReplicationSlotRelease(void) */ SpinLockAcquire(&slot->mutex); slot->active_pid = 0; + slot->inactive_since = now; SpinLockRelease(&slot->mutex); ConditionVariableBroadcast(&slot->active_cv); } + else + { + SpinLockAcquire(&slot->mutex); + slot->inactive_since = now; + SpinLockRelease(&slot->mutex); + } MyReplicationSlot = NULL; @@ -595,13 +721,28 @@ ReplicationSlotRelease(void) MyProc->statusFlags &= ~PROC_IN_LOGICAL_DECODING; ProcGlobal->statusFlags[MyProc->pgxactoff] = MyProc->statusFlags; LWLockRelease(ProcArrayLock); + + if (am_walsender) + { + ereport(log_replication_commands ? LOG : DEBUG1, + is_logical + ? errmsg("released logical replication slot \"%s\"", + slotname) + : errmsg("released physical replication slot \"%s\"", + slotname)); + + pfree(slotname); + } } /* - * Cleanup all temporary slots created in current session. + * Cleanup temporary slots created in current session. + * + * Cleanup only synced temporary slots if 'synced_only' is true, else + * cleanup all temporary slots. */ void -ReplicationSlotCleanup(void) +ReplicationSlotCleanup(bool synced_only) { int i; @@ -617,7 +758,8 @@ ReplicationSlotCleanup(void) continue; SpinLockAcquire(&s->mutex); - if (s->active_pid == MyProcPid) + if ((s->active_pid == MyProcPid && + (!synced_only || s->data.synced))) { Assert(s->data.persistency == RS_TEMPORARY); SpinLockRelease(&s->mutex); @@ -645,13 +787,84 @@ ReplicationSlotDrop(const char *name, bool nowait) ReplicationSlotAcquire(name, nowait); + /* + * Do not allow users to drop the slots which are currently being synced + * from the primary to the standby. + */ + if (RecoveryInProgress() && MyReplicationSlot->data.synced) + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot drop replication slot \"%s\"", name), + errdetail("This replication slot is being synchronized from the primary server.")); + ReplicationSlotDropAcquired(); } +/* + * Change the definition of the slot identified by the specified name. + */ +void +ReplicationSlotAlter(const char *name, bool failover) +{ + Assert(MyReplicationSlot == NULL); + + ReplicationSlotAcquire(name, false); + + if (SlotIsPhysical(MyReplicationSlot)) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot use %s with a physical replication slot", + "ALTER_REPLICATION_SLOT")); + + if (RecoveryInProgress()) + { + /* + * Do not allow users to alter the slots which are currently being + * synced from the primary to the standby. + */ + if (MyReplicationSlot->data.synced) + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot alter replication slot \"%s\"", name), + errdetail("This replication slot is being synchronized from the primary server.")); + + /* + * Do not allow users to enable failover on the standby as we do not + * support sync to the cascading standby. + */ + if (failover) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot enable failover for a replication slot" + " on the standby")); + } + + /* + * Do not allow users to enable failover for temporary slots as we do not + * support syncing temporary slots to the standby. + */ + if (failover && MyReplicationSlot->data.persistency == RS_TEMPORARY) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot enable failover for a temporary replication slot")); + + if (MyReplicationSlot->data.failover != failover) + { + SpinLockAcquire(&MyReplicationSlot->mutex); + MyReplicationSlot->data.failover = failover; + SpinLockRelease(&MyReplicationSlot->mutex); + + ReplicationSlotMarkDirty(); + ReplicationSlotSave(); + } + + ReplicationSlotRelease(); +} + /* * Permanently drop the currently acquired replication slot. */ -static void +void ReplicationSlotDropAcquired(void) { ReplicationSlot *slot = MyReplicationSlot; @@ -807,8 +1020,8 @@ ReplicationSlotMarkDirty(void) } /* - * Convert a slot that's marked as RS_EPHEMERAL to a RS_PERSISTENT slot, - * guaranteeing it will be there after an eventual crash. + * Convert a slot that's marked as RS_EPHEMERAL or RS_TEMPORARY to a + * RS_PERSISTENT slot, guaranteeing it will be there after an eventual crash. */ void ReplicationSlotPersist(void) @@ -1103,6 +1316,20 @@ ReplicationSlotsDropDBSlots(Oid dboid) * concurrently being dropped by a backend connected to another DB. * * That's fairly unlikely in practice, so we'll just bail out. + * + * The slot sync worker holds a shared lock on the database before + * operating on synced logical slots to avoid conflict with the drop + * happening here. The persistent synced slots are thus safe but there + * is a possibility that the slot sync worker has created a temporary + * slot (which stays active even on release) and we are trying to drop + * that here. In practice, the chances of hitting this scenario are + * less as during slot synchronization, the temporary slot is + * immediately converted to persistent and thus is safe due to the + * shared lock taken on the database. So, we'll just bail out in such + * a case. + * + * XXX: We can consider shutting down the slot sync worker before + * trying to drop synced temporary slots here. */ if (active_pid) ereport(ERROR, @@ -1142,12 +1369,12 @@ CheckSlotRequirements(void) if (max_replication_slots == 0) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("replication slots can only be used if max_replication_slots > 0"))); + errmsg("replication slots can only be used if \"max_replication_slots\" > 0"))); if (wal_level < WAL_LEVEL_REPLICA) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("replication slots can only be used if wal_level >= replica"))); + errmsg("replication slots can only be used if \"wal_level\" >= \"replica\""))); } /* @@ -1263,18 +1490,25 @@ ReportSlotInvalidation(ReplicationSlotInvalidationCause cause, switch (cause) { case RS_INVAL_WAL_REMOVED: - hint = true; - appendStringInfo(&err_detail, _("The slot's restart_lsn %X/%X exceeds the limit by %llu bytes."), - LSN_FORMAT_ARGS(restart_lsn), - (unsigned long long) (oldestLSN - restart_lsn)); - break; + { + unsigned long long ex = oldestLSN - restart_lsn; + + hint = true; + appendStringInfo(&err_detail, + ngettext("The slot's restart_lsn %X/%X exceeds the limit by %llu byte.", + "The slot's restart_lsn %X/%X exceeds the limit by %llu bytes.", + ex), + LSN_FORMAT_ARGS(restart_lsn), + ex); + break; + } case RS_INVAL_HORIZON: appendStringInfo(&err_detail, _("The slot conflicted with xid horizon %u."), snapshotConflictHorizon); break; case RS_INVAL_WAL_LEVEL: - appendStringInfo(&err_detail, _("Logical decoding on standby requires wal_level >= logical on the primary server.")); + appendStringInfoString(&err_detail, _("Logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary server.")); break; case RS_INVAL_NONE: pg_unreachable(); @@ -1287,7 +1521,7 @@ ReportSlotInvalidation(ReplicationSlotInvalidationCause cause, errmsg("invalidating obsolete replication slot \"%s\"", NameStr(slotname)), errdetail_internal("%s", err_detail.data), - hint ? errhint("You might need to increase %s.", "max_slot_wal_keep_size") : 0); + hint ? errhint("You might need to increase \"%s\".", "max_slot_wal_keep_size") : 0); pfree(err_detail.data); } @@ -1314,13 +1548,18 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlotInvalidationCause cause, { int last_signaled_pid = 0; bool released_lock = false; + bool terminated = false; + TransactionId initial_effective_xmin = InvalidTransactionId; + TransactionId initial_catalog_effective_xmin = InvalidTransactionId; + XLogRecPtr initial_restart_lsn = InvalidXLogRecPtr; + ReplicationSlotInvalidationCause invalidation_cause_prev PG_USED_FOR_ASSERTS_ONLY = RS_INVAL_NONE; for (;;) { XLogRecPtr restart_lsn; NameData slotname; int active_pid = 0; - ReplicationSlotInvalidationCause conflict = RS_INVAL_NONE; + ReplicationSlotInvalidationCause invalidation_cause = RS_INVAL_NONE; Assert(LWLockHeldByMeInMode(ReplicationSlotControlLock, LW_SHARED)); @@ -1342,18 +1581,28 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlotInvalidationCause cause, restart_lsn = s->data.restart_lsn; - /* - * If the slot is already invalid or is a non conflicting slot, we - * don't need to do anything. - */ + /* we do nothing if the slot is already invalid */ if (s->data.invalidated == RS_INVAL_NONE) { + /* + * The slot's mutex will be released soon, and it is possible that + * those values change since the process holding the slot has been + * terminated (if any), so record them here to ensure that we + * would report the correct invalidation cause. + */ + if (!terminated) + { + initial_restart_lsn = s->data.restart_lsn; + initial_effective_xmin = s->effective_xmin; + initial_catalog_effective_xmin = s->effective_catalog_xmin; + } + switch (cause) { case RS_INVAL_WAL_REMOVED: - if (s->data.restart_lsn != InvalidXLogRecPtr && - s->data.restart_lsn < oldestLSN) - conflict = cause; + if (initial_restart_lsn != InvalidXLogRecPtr && + initial_restart_lsn < oldestLSN) + invalidation_cause = cause; break; case RS_INVAL_HORIZON: if (!SlotIsLogical(s)) @@ -1361,26 +1610,33 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlotInvalidationCause cause, /* invalid DB oid signals a shared relation */ if (dboid != InvalidOid && dboid != s->data.database) break; - if (TransactionIdIsValid(s->effective_xmin) && - TransactionIdPrecedesOrEquals(s->effective_xmin, + if (TransactionIdIsValid(initial_effective_xmin) && + TransactionIdPrecedesOrEquals(initial_effective_xmin, snapshotConflictHorizon)) - conflict = cause; - else if (TransactionIdIsValid(s->effective_catalog_xmin) && - TransactionIdPrecedesOrEquals(s->effective_catalog_xmin, + invalidation_cause = cause; + else if (TransactionIdIsValid(initial_catalog_effective_xmin) && + TransactionIdPrecedesOrEquals(initial_catalog_effective_xmin, snapshotConflictHorizon)) - conflict = cause; + invalidation_cause = cause; break; case RS_INVAL_WAL_LEVEL: if (SlotIsLogical(s)) - conflict = cause; + invalidation_cause = cause; break; case RS_INVAL_NONE: pg_unreachable(); } } - /* if there's no conflict, we're done */ - if (conflict == RS_INVAL_NONE) + /* + * The invalidation cause recorded previously should not change while + * the process owning the slot (if any) has been terminated. + */ + Assert(!(invalidation_cause_prev != RS_INVAL_NONE && terminated && + invalidation_cause_prev != invalidation_cause)); + + /* if there's no invalidation, we're done */ + if (invalidation_cause == RS_INVAL_NONE) { SpinLockRelease(&s->mutex); if (released_lock) @@ -1400,13 +1656,13 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlotInvalidationCause cause, { MyReplicationSlot = s; s->active_pid = MyProcPid; - s->data.invalidated = conflict; + s->data.invalidated = invalidation_cause; /* * XXX: We should consider not overwriting restart_lsn and instead * just rely on .invalidated. */ - if (conflict == RS_INVAL_WAL_REMOVED) + if (invalidation_cause == RS_INVAL_WAL_REMOVED) s->data.restart_lsn = InvalidXLogRecPtr; /* Let caller know */ @@ -1415,6 +1671,14 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlotInvalidationCause cause, SpinLockRelease(&s->mutex); + /* + * The logical replication slots shouldn't be invalidated as GUC + * max_slot_wal_keep_size is set to -1 during the binary upgrade. See + * check_old_cluster_for_valid_slots() where we ensure that no + * invalidated before the upgrade. + */ + Assert(!(*invalidated && SlotIsLogical(s) && IsBinaryUpgrade)); + if (active_pid != 0) { /* @@ -1441,18 +1705,20 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlotInvalidationCause cause, */ if (last_signaled_pid != active_pid) { - ReportSlotInvalidation(conflict, true, active_pid, + ReportSlotInvalidation(invalidation_cause, true, active_pid, slotname, restart_lsn, oldestLSN, snapshotConflictHorizon); if (MyBackendType == B_STARTUP) (void) SendProcSignal(active_pid, PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT, - InvalidBackendId); + INVALID_PROC_NUMBER); else (void) kill(active_pid, SIGTERM); last_signaled_pid = active_pid; + terminated = true; + invalidation_cause_prev = invalidation_cause; } /* Wait until the slot is released. */ @@ -1484,9 +1750,8 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlotInvalidationCause cause, ReplicationSlotMarkDirty(); ReplicationSlotSave(); ReplicationSlotRelease(); - pgstat_drop_replslot(s); - ReportSlotInvalidation(conflict, false, active_pid, + ReportSlotInvalidation(invalidation_cause, false, active_pid, slotname, restart_lsn, oldestLSN, snapshotConflictHorizon); @@ -1565,11 +1830,13 @@ InvalidateObsoleteReplicationSlots(ReplicationSlotInvalidationCause cause, /* * Flush all replication slots to disk. * - * This needn't actually be part of a checkpoint, but it's a convenient - * location. + * It is convenient to flush dirty replication slots at the time of checkpoint. + * Additionally, in case of a shutdown checkpoint, we also identify the slots + * for which the confirmed_flush LSN has been updated since the last time it + * was saved and flush them. */ void -CheckPointReplicationSlots(void) +CheckPointReplicationSlots(bool is_shutdown) { int i; @@ -1594,6 +1861,28 @@ CheckPointReplicationSlots(void) /* save the slot to disk, locking is handled in SaveSlotToPath() */ sprintf(path, "pg_replslot/%s", NameStr(s->data.name)); + + /* + * Slot's data is not flushed each time the confirmed_flush LSN is + * updated as that could lead to frequent writes. However, we decide + * to force a flush of all logical slot's data at the time of shutdown + * if the confirmed_flush LSN is changed since we last flushed it to + * disk. This helps in avoiding an unnecessary retreat of the + * confirmed_flush LSN after restart. + */ + if (is_shutdown && SlotIsLogical(s)) + { + SpinLockAcquire(&s->mutex); + + if (s->data.invalidated == RS_INVAL_NONE && + s->data.confirmed_flush > s->last_saved_confirmed_flush) + { + s->just_dirtied = true; + s->dirty = true; + } + SpinLockRelease(&s->mutex); + } + SaveSlotToPath(s, path, LOG); } LWLockRelease(ReplicationSlotAllocationLock); @@ -1866,11 +2155,12 @@ SaveSlotToPath(ReplicationSlot *slot, const char *dir, int elevel) /* * Successfully wrote, unset dirty bit, unless somebody dirtied again - * already. + * already and remember the confirmed_flush LSN value. */ SpinLockAcquire(&slot->mutex); if (!slot->just_dirtied) slot->dirty = false; + slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush; SpinLockRelease(&slot->mutex); LWLockRelease(&slot->io_in_progress_lock); @@ -2037,18 +2327,35 @@ RestoreSlotFromDisk(const char *name) * NB: Changing the requirements here also requires adapting * CheckSlotRequirements() and CheckLogicalDecodingRequirements(). */ - if (cp.slotdata.database != InvalidOid && wal_level < WAL_LEVEL_LOGICAL) - ereport(FATAL, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("logical replication slot \"%s\" exists, but wal_level < logical", - NameStr(cp.slotdata.name)), - errhint("Change wal_level to be logical or higher."))); + if (cp.slotdata.database != InvalidOid) + { + if (wal_level < WAL_LEVEL_LOGICAL) + ereport(FATAL, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"", + NameStr(cp.slotdata.name)), + errhint("Change \"wal_level\" to be \"logical\" or higher."))); + + /* + * In standby mode, the hot standby must be enabled. This check is + * necessary to ensure logical slots are invalidated when they become + * incompatible due to insufficient wal_level. Otherwise, if the + * primary reduces wal_level < logical while hot standby is disabled, + * logical slots would remain valid even after promotion. + */ + if (StandbyMode && !EnableHotStandby) + ereport(FATAL, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("logical replication slot \"%s\" exists on the standby, but \"hot_standby\" = \"off\"", + NameStr(cp.slotdata.name)), + errhint("Change \"hot_standby\" to be \"on\"."))); + } else if (wal_level < WAL_LEVEL_REPLICA) ereport(FATAL, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("physical replication slot \"%s\" exists, but wal_level < replica", + errmsg("physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"", NameStr(cp.slotdata.name)), - errhint("Change wal_level to be replica or higher."))); + errhint("Change \"wal_level\" to be \"replica\" or higher."))); /* nothing can be active yet, don't lock anything */ for (i = 0; i < max_replication_slots; i++) @@ -2067,6 +2374,7 @@ RestoreSlotFromDisk(const char *name) /* initialize in memory state */ slot->effective_xmin = cp.slotdata.xmin; slot->effective_catalog_xmin = cp.slotdata.catalog_xmin; + slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush; slot->candidate_catalog_xmin = InvalidTransactionId; slot->candidate_xmin_lsn = InvalidXLogRecPtr; @@ -2076,6 +2384,13 @@ RestoreSlotFromDisk(const char *name) slot->in_use = true; slot->active_pid = 0; + /* + * Set the time since the slot has become inactive after loading the + * slot from the disk into memory. Whoever acquires the slot i.e. + * makes the slot active will reset it. + */ + slot->inactive_since = GetCurrentTimestamp(); + restored = true; break; } @@ -2083,5 +2398,389 @@ RestoreSlotFromDisk(const char *name) if (!restored) ereport(FATAL, (errmsg("too many replication slots active before shutdown"), - errhint("Increase max_replication_slots and try again."))); + errhint("Increase \"max_replication_slots\" and try again."))); +} + +/* + * Maps an invalidation reason for a replication slot to + * ReplicationSlotInvalidationCause. + */ +ReplicationSlotInvalidationCause +GetSlotInvalidationCause(const char *invalidation_reason) +{ + ReplicationSlotInvalidationCause cause; + ReplicationSlotInvalidationCause result = RS_INVAL_NONE; + bool found PG_USED_FOR_ASSERTS_ONLY = false; + + Assert(invalidation_reason); + + for (cause = RS_INVAL_NONE; cause <= RS_INVAL_MAX_CAUSES; cause++) + { + if (strcmp(SlotInvalidationCauses[cause], invalidation_reason) == 0) + { + found = true; + result = cause; + break; + } + } + + Assert(found); + return result; +} + +/* + * A helper function to validate slots specified in GUC synchronized_standby_slots. + * + * The rawname will be parsed, and the result will be saved into *elemlist. + */ +static bool +validate_sync_standby_slots(char *rawname, List **elemlist) +{ + bool ok; + + /* Verify syntax and parse string into a list of identifiers */ + ok = SplitIdentifierString(rawname, ',', elemlist); + + if (!ok) + { + GUC_check_errdetail("List syntax is invalid."); + } + else if (MyProc) + { + /* + * Check that each specified slot exist and is physical. + * + * Because we need an LWLock, we cannot do this on processes without a + * PGPROC, so we skip it there; but see comments in + * StandbySlotsHaveCaughtup() as to why that's not a problem. + */ + LWLockAcquire(ReplicationSlotControlLock, LW_SHARED); + + foreach_ptr(char, name, *elemlist) + { + ReplicationSlot *slot; + + slot = SearchNamedReplicationSlot(name, false); + + if (!slot) + { + GUC_check_errdetail("replication slot \"%s\" does not exist", + name); + ok = false; + break; + } + + if (!SlotIsPhysical(slot)) + { + GUC_check_errdetail("\"%s\" is not a physical replication slot", + name); + ok = false; + break; + } + } + + LWLockRelease(ReplicationSlotControlLock); + } + + return ok; +} + +/* + * GUC check_hook for synchronized_standby_slots + */ +bool +check_synchronized_standby_slots(char **newval, void **extra, GucSource source) +{ + char *rawname; + char *ptr; + List *elemlist; + int size; + bool ok; + SyncStandbySlotsConfigData *config; + + if ((*newval)[0] == '\0') + return true; + + /* Need a modifiable copy of the GUC string */ + rawname = pstrdup(*newval); + + /* Now verify if the specified slots exist and have correct type */ + ok = validate_sync_standby_slots(rawname, &elemlist); + + if (!ok || elemlist == NIL) + { + pfree(rawname); + list_free(elemlist); + return ok; + } + + /* Compute the size required for the SyncStandbySlotsConfigData struct */ + size = offsetof(SyncStandbySlotsConfigData, slot_names); + foreach_ptr(char, slot_name, elemlist) + size += strlen(slot_name) + 1; + + /* GUC extra value must be guc_malloc'd, not palloc'd */ + config = (SyncStandbySlotsConfigData *) guc_malloc(LOG, size); + if (!config) + return false; + + /* Transform the data into SyncStandbySlotsConfigData */ + config->nslotnames = list_length(elemlist); + + ptr = config->slot_names; + foreach_ptr(char, slot_name, elemlist) + { + strcpy(ptr, slot_name); + ptr += strlen(slot_name) + 1; + } + + *extra = (void *) config; + + pfree(rawname); + list_free(elemlist); + return true; +} + +/* + * GUC assign_hook for synchronized_standby_slots + */ +void +assign_synchronized_standby_slots(const char *newval, void *extra) +{ + /* + * The standby slots may have changed, so we must recompute the oldest + * LSN. + */ + ss_oldest_flush_lsn = InvalidXLogRecPtr; + + synchronized_standby_slots_config = (SyncStandbySlotsConfigData *) extra; +} + +/* + * Check if the passed slot_name is specified in the synchronized_standby_slots GUC. + */ +bool +SlotExistsInSyncStandbySlots(const char *slot_name) +{ + const char *standby_slot_name; + + /* Return false if there is no value in synchronized_standby_slots */ + if (synchronized_standby_slots_config == NULL) + return false; + + /* + * XXX: We are not expecting this list to be long so a linear search + * shouldn't hurt but if that turns out not to be true then we can cache + * this information for each WalSender as well. + */ + standby_slot_name = synchronized_standby_slots_config->slot_names; + for (int i = 0; i < synchronized_standby_slots_config->nslotnames; i++) + { + if (strcmp(standby_slot_name, slot_name) == 0) + return true; + + standby_slot_name += strlen(standby_slot_name) + 1; + } + + return false; +} + +/* + * Return true if the slots specified in synchronized_standby_slots have caught up to + * the given WAL location, false otherwise. + * + * The elevel parameter specifies the error level used for logging messages + * related to slots that do not exist, are invalidated, or are inactive. + */ +bool +StandbySlotsHaveCaughtup(XLogRecPtr wait_for_lsn, int elevel) +{ + const char *name; + int caught_up_slot_num = 0; + XLogRecPtr min_restart_lsn = InvalidXLogRecPtr; + + /* + * Don't need to wait for the standbys to catch up if there is no value in + * synchronized_standby_slots. + */ + if (synchronized_standby_slots_config == NULL) + return true; + + /* + * Don't need to wait for the standbys to catch up if we are on a standby + * server, since we do not support syncing slots to cascading standbys. + */ + if (RecoveryInProgress()) + return true; + + /* + * Don't need to wait for the standbys to catch up if they are already + * beyond the specified WAL location. + */ + if (!XLogRecPtrIsInvalid(ss_oldest_flush_lsn) && + ss_oldest_flush_lsn >= wait_for_lsn) + return true; + + /* + * To prevent concurrent slot dropping and creation while filtering the + * slots, take the ReplicationSlotControlLock outside of the loop. + */ + LWLockAcquire(ReplicationSlotControlLock, LW_SHARED); + + name = synchronized_standby_slots_config->slot_names; + for (int i = 0; i < synchronized_standby_slots_config->nslotnames; i++) + { + XLogRecPtr restart_lsn; + bool invalidated; + bool inactive; + ReplicationSlot *slot; + + slot = SearchNamedReplicationSlot(name, false); + + /* + * If a slot name provided in synchronized_standby_slots does not + * exist, report a message and exit the loop. + * + * Though validate_sync_standby_slots (the GUC check_hook) tries to + * avoid this, it can nonetheless happen because the user can specify + * a nonexistent slot name before server startup. That function cannot + * validate such a slot during startup, as ReplicationSlotCtl is not + * initialized by then. Also, the user might have dropped one slot. + */ + if (!slot) + { + ereport(elevel, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("replication slot \"%s\" specified in parameter \"%s\" does not exist", + name, "synchronized_standby_slots"), + errdetail("Logical replication is waiting on the standby associated with replication slot \"%s\".", + name), + errhint("Create the replication slot \"%s\" or amend parameter \"%s\".", + name, "synchronized_standby_slots")); + break; + } + + /* Same as above: if a slot is not physical, exit the loop. */ + if (SlotIsLogical(slot)) + { + ereport(elevel, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot specify logical replication slot \"%s\" in parameter \"%s\"", + name, "synchronized_standby_slots"), + errdetail("Logical replication is waiting for correction on replication slot \"%s\".", + name), + errhint("Remove the logical replication slot \"%s\" from parameter \"%s\".", + name, "synchronized_standby_slots")); + break; + } + + SpinLockAcquire(&slot->mutex); + restart_lsn = slot->data.restart_lsn; + invalidated = slot->data.invalidated != RS_INVAL_NONE; + inactive = slot->active_pid == 0; + SpinLockRelease(&slot->mutex); + + if (invalidated) + { + /* Specified physical slot has been invalidated */ + ereport(elevel, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("physical replication slot \"%s\" specified in parameter \"%s\" has been invalidated", + name, "synchronized_standby_slots"), + errdetail("Logical replication is waiting on the standby associated with replication slot \"%s\".", + name), + errhint("Drop and recreate the replication slot \"%s\", or amend parameter \"%s\".", + name, "synchronized_standby_slots")); + break; + } + + if (XLogRecPtrIsInvalid(restart_lsn) || restart_lsn < wait_for_lsn) + { + /* Log a message if no active_pid for this physical slot */ + if (inactive) + ereport(elevel, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("replication slot \"%s\" specified in parameter \"%s\" does not have active_pid", + name, "synchronized_standby_slots"), + errdetail("Logical replication is waiting on the standby associated with replication slot \"%s\".", + name), + errhint("Start the standby associated with the replication slot \"%s\", or amend parameter \"%s\".", + name, "synchronized_standby_slots")); + + /* Continue if the current slot hasn't caught up. */ + break; + } + + Assert(restart_lsn >= wait_for_lsn); + + if (XLogRecPtrIsInvalid(min_restart_lsn) || + min_restart_lsn > restart_lsn) + min_restart_lsn = restart_lsn; + + caught_up_slot_num++; + + name += strlen(name) + 1; + } + + LWLockRelease(ReplicationSlotControlLock); + + /* + * Return false if not all the standbys have caught up to the specified + * WAL location. + */ + if (caught_up_slot_num != synchronized_standby_slots_config->nslotnames) + return false; + + /* The ss_oldest_flush_lsn must not retreat. */ + Assert(XLogRecPtrIsInvalid(ss_oldest_flush_lsn) || + min_restart_lsn >= ss_oldest_flush_lsn); + + ss_oldest_flush_lsn = min_restart_lsn; + + return true; +} + +/* + * Wait for physical standbys to confirm receiving the given lsn. + * + * Used by logical decoding SQL functions. It waits for physical standbys + * corresponding to the physical slots specified in the synchronized_standby_slots GUC. + */ +void +WaitForStandbyConfirmation(XLogRecPtr wait_for_lsn) +{ + /* + * Don't need to wait for the standby to catch up if the current acquired + * slot is not a logical failover slot, or there is no value in + * synchronized_standby_slots. + */ + if (!MyReplicationSlot->data.failover || !synchronized_standby_slots_config) + return; + + ConditionVariablePrepareToSleep(&WalSndCtl->wal_confirm_rcv_cv); + + for (;;) + { + CHECK_FOR_INTERRUPTS(); + + if (ConfigReloadPending) + { + ConfigReloadPending = false; + ProcessConfigFile(PGC_SIGHUP); + } + + /* Exit if done waiting for every slot. */ + if (StandbySlotsHaveCaughtup(wait_for_lsn, WARNING)) + break; + + /* + * Wait for the slots in the synchronized_standby_slots to catch up, + * but use a timeout (1s) so we can also check if the + * synchronized_standby_slots has been changed. + */ + ConditionVariableTimedSleep(&WalSndCtl->wal_confirm_rcv_cv, 1000, + WAIT_EVENT_WAIT_FOR_STANDBY_CONFIRMATION); + } + + ConditionVariableCancelSleep(); } diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c index 6035cf481600a..01e98bc1ceff7 100644 --- a/src/backend/replication/slotfuncs.c +++ b/src/backend/replication/slotfuncs.c @@ -3,7 +3,7 @@ * slotfuncs.c * Support functions for replication slots * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/slotfuncs.c @@ -21,7 +21,9 @@ #include "replication/decode.h" #include "replication/logical.h" #include "replication/slot.h" +#include "replication/slotsync.h" #include "utils/builtins.h" +#include "utils/guc.h" #include "utils/inval.h" #include "utils/pg_lsn.h" #include "utils/resowner.h" @@ -42,7 +44,8 @@ create_physical_replication_slot(char *name, bool immediately_reserve, /* acquire replication slot, this will check for conflicting names */ ReplicationSlotCreate(name, false, - temporary ? RS_TEMPORARY : RS_PERSISTENT, false); + temporary ? RS_TEMPORARY : RS_PERSISTENT, false, + false, false); if (immediately_reserve) { @@ -117,6 +120,7 @@ pg_create_physical_replication_slot(PG_FUNCTION_ARGS) static void create_logical_replication_slot(char *name, char *plugin, bool temporary, bool two_phase, + bool failover, XLogRecPtr restart_lsn, bool find_startpoint) { @@ -133,7 +137,8 @@ create_logical_replication_slot(char *name, char *plugin, * error as well. */ ReplicationSlotCreate(name, true, - temporary ? RS_TEMPORARY : RS_EPHEMERAL, two_phase); + temporary ? RS_TEMPORARY : RS_EPHEMERAL, two_phase, + failover, false); /* * Create logical decoding context to find start point or, if we don't @@ -171,6 +176,7 @@ pg_create_logical_replication_slot(PG_FUNCTION_ARGS) Name plugin = PG_GETARG_NAME(1); bool temporary = PG_GETARG_BOOL(2); bool two_phase = PG_GETARG_BOOL(3); + bool failover = PG_GETARG_BOOL(4); Datum result; TupleDesc tupdesc; HeapTuple tuple; @@ -188,6 +194,7 @@ pg_create_logical_replication_slot(PG_FUNCTION_ARGS) NameStr(*plugin), temporary, two_phase, + failover, InvalidXLogRecPtr, true); @@ -232,7 +239,7 @@ pg_drop_replication_slot(PG_FUNCTION_ARGS) Datum pg_get_replication_slots(PG_FUNCTION_ARGS) { -#define PG_GET_REPLICATION_SLOTS_COLS 15 +#define PG_GET_REPLICATION_SLOTS_COLS 19 ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; XLogRecPtr currlsn; int slotno; @@ -256,6 +263,7 @@ pg_get_replication_slots(PG_FUNCTION_ARGS) bool nulls[PG_GET_REPLICATION_SLOTS_COLS]; WALAvailability walstate; int i; + ReplicationSlotInvalidationCause cause; if (!slot->in_use) continue; @@ -402,16 +410,37 @@ pg_get_replication_slots(PG_FUNCTION_ARGS) values[i++] = BoolGetDatum(slot_contents.data.two_phase); - if (slot_contents.data.database == InvalidOid) + if (slot_contents.inactive_since > 0) + values[i++] = TimestampTzGetDatum(slot_contents.inactive_since); + else + nulls[i++] = true; + + cause = slot_contents.data.invalidated; + + if (SlotIsPhysical(&slot_contents)) nulls[i++] = true; else { - if (slot_contents.data.invalidated != RS_INVAL_NONE) + /* + * rows_removed and wal_level_insufficient are the only two + * reasons for the logical slot's conflict with recovery. + */ + if (cause == RS_INVAL_HORIZON || + cause == RS_INVAL_WAL_LEVEL) values[i++] = BoolGetDatum(true); else values[i++] = BoolGetDatum(false); } + if (cause == RS_INVAL_NONE) + nulls[i++] = true; + else + values[i++] = CStringGetTextDatum(SlotInvalidationCauses[cause]); + + values[i++] = BoolGetDatum(slot_contents.data.failover); + + values[i++] = BoolGetDatum(slot_contents.data.synced); + Assert(i == PG_GET_REPLICATION_SLOTS_COLS); tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, @@ -451,129 +480,25 @@ pg_physical_replication_slot_advance(XLogRecPtr moveto) * crash, but this makes the data consistent after a clean shutdown. */ ReplicationSlotMarkDirty(); + + /* + * Wake up logical walsenders holding logical failover slots after + * updating the restart_lsn of the physical slot. + */ + PhysicalWakeupLogicalWalSnd(); } return retlsn; } /* - * Helper function for advancing our logical replication slot forward. - * - * The slot's restart_lsn is used as start point for reading records, while - * confirmed_flush is used as base point for the decoding context. - * - * We cannot just do LogicalConfirmReceivedLocation to update confirmed_flush, - * because we need to digest WAL to advance restart_lsn allowing to recycle - * WAL and removal of old catalog tuples. As decoding is done in fast_forward - * mode, no changes are generated anyway. + * Advance our logical replication slot forward. See + * LogicalSlotAdvanceAndCheckSnapState for details. */ static XLogRecPtr pg_logical_replication_slot_advance(XLogRecPtr moveto) { - LogicalDecodingContext *ctx; - ResourceOwner old_resowner = CurrentResourceOwner; - XLogRecPtr retlsn; - - Assert(moveto != InvalidXLogRecPtr); - - PG_TRY(); - { - /* - * Create our decoding context in fast_forward mode, passing start_lsn - * as InvalidXLogRecPtr, so that we start processing from my slot's - * confirmed_flush. - */ - ctx = CreateDecodingContext(InvalidXLogRecPtr, - NIL, - true, /* fast_forward */ - XL_ROUTINE(.page_read = read_local_xlog_page, - .segment_open = wal_segment_open, - .segment_close = wal_segment_close), - NULL, NULL, NULL); - - /* - * Start reading at the slot's restart_lsn, which we know to point to - * a valid record. - */ - XLogBeginRead(ctx->reader, MyReplicationSlot->data.restart_lsn); - - /* invalidate non-timetravel entries */ - InvalidateSystemCaches(); - - /* Decode at least one record, until we run out of records */ - while (ctx->reader->EndRecPtr < moveto) - { - char *errm = NULL; - XLogRecord *record; - - /* - * Read records. No changes are generated in fast_forward mode, - * but snapbuilder/slot statuses are updated properly. - */ - record = XLogReadRecord(ctx->reader, &errm); - if (errm) - elog(ERROR, "could not find record while advancing replication slot: %s", - errm); - - /* - * Process the record. Storage-level changes are ignored in - * fast_forward mode, but other modules (such as snapbuilder) - * might still have critical updates to do. - */ - if (record) - LogicalDecodingProcessRecord(ctx, ctx->reader); - - /* Stop once the requested target has been reached */ - if (moveto <= ctx->reader->EndRecPtr) - break; - - CHECK_FOR_INTERRUPTS(); - } - - /* - * Logical decoding could have clobbered CurrentResourceOwner during - * transaction management, so restore the executor's value. (This is - * a kluge, but it's not worth cleaning up right now.) - */ - CurrentResourceOwner = old_resowner; - - if (ctx->reader->EndRecPtr != InvalidXLogRecPtr) - { - LogicalConfirmReceivedLocation(moveto); - - /* - * If only the confirmed_flush LSN has changed the slot won't get - * marked as dirty by the above. Callers on the walsender - * interface are expected to keep track of their own progress and - * don't need it written out. But SQL-interface users cannot - * specify their own start positions and it's harder for them to - * keep track of their progress, so we should make more of an - * effort to save it for them. - * - * Dirty the slot so it is written out at the next checkpoint. The - * LSN position advanced to may still be lost on a crash but this - * makes the data consistent after a clean shutdown. - */ - ReplicationSlotMarkDirty(); - } - - retlsn = MyReplicationSlot->data.confirmed_flush; - - /* free context, call shutdown callback */ - FreeDecodingContext(ctx); - - InvalidateSystemCaches(); - } - PG_CATCH(); - { - /* clear all timetravel entries */ - InvalidateSystemCaches(); - - PG_RE_THROW(); - } - PG_END_TRY(); - - return retlsn; + return LogicalSlotAdvanceAndCheckSnapState(moveto, NULL); } /* @@ -756,6 +681,13 @@ copy_replication_slot(FunctionCallInfo fcinfo, bool logical_slot) (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), errmsg("cannot copy a replication slot that doesn't reserve WAL"))); + /* Cannot copy an invalidated replication slot */ + if (first_slot_contents.data.invalidated != RS_INVAL_NONE) + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot copy invalidated replication slot \"%s\"", + NameStr(*src_name))); + /* Overwrite params from optional arguments */ if (PG_NARGS() >= 3) temporary = PG_GETARG_BOOL(2); @@ -772,11 +704,25 @@ copy_replication_slot(FunctionCallInfo fcinfo, bool logical_slot) * We must not try to read WAL, since we haven't reserved it yet -- * hence pass find_startpoint false. confirmed_flush will be set * below, by copying from the source slot. + * + * We don't copy the failover option to prevent potential issues with + * slot synchronization. For instance, if a slot was synchronized to + * the standby, then dropped on the primary, and immediately recreated + * by copying from another existing slot with much earlier restart_lsn + * and confirmed_flush_lsn, the slot synchronization would only + * observe the LSN of the same slot moving backward. As slot + * synchronization does not copy the restart_lsn and + * confirmed_flush_lsn backward (see update_local_synced_slot() for + * details), if a failover happens before the primary's slot catches + * up, logical replication cannot continue using the synchronized slot + * on the promoted standby because the slot retains the restart_lsn + * and confirmed_flush_lsn that are much later than expected. */ create_logical_replication_slot(NameStr(*dst_name), plugin, temporary, false, + false, src_restart_lsn, false); } @@ -843,6 +789,20 @@ copy_replication_slot(FunctionCallInfo fcinfo, bool logical_slot) NameStr(*src_name)), errhint("Retry when the source replication slot's confirmed_flush_lsn is valid."))); + /* + * Copying an invalid slot doesn't make sense. Note that the source + * slot can become invalid after we create the new slot and copy the + * data of source slot. This is possible because the operations in + * InvalidateObsoleteReplicationSlots() are not serialized with this + * function. Even though we can't detect such a case here, the copied + * slot will become invalid in the next checkpoint cycle. + */ + if (second_slot_contents.data.invalidated != RS_INVAL_NONE) + ereport(ERROR, + errmsg("cannot copy replication slot \"%s\"", + NameStr(*src_name)), + errdetail("The source replication slot was invalidated during the copy operation.")); + /* Install copied values again */ SpinLockAcquire(&MyReplicationSlot->mutex); MyReplicationSlot->effective_xmin = copy_effective_xmin; @@ -923,3 +883,51 @@ pg_copy_physical_replication_slot_b(PG_FUNCTION_ARGS) { return copy_replication_slot(fcinfo, false); } + +/* + * Synchronize failover enabled replication slots to a standby server + * from the primary server. + */ +Datum +pg_sync_replication_slots(PG_FUNCTION_ARGS) +{ + WalReceiverConn *wrconn; + char *err; + StringInfoData app_name; + + CheckSlotPermissions(); + + if (!RecoveryInProgress()) + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("replication slots can only be synchronized to a standby server")); + + ValidateSlotSyncParams(ERROR); + + /* Load the libpq-specific functions */ + load_file("libpqwalreceiver", false); + + (void) CheckAndGetDbnameFromConninfo(); + + initStringInfo(&app_name); + if (cluster_name[0]) + appendStringInfo(&app_name, "%s_slotsync", cluster_name); + else + appendStringInfoString(&app_name, "slotsync"); + + /* Connect to the primary server. */ + wrconn = walrcv_connect(PrimaryConnInfo, false, false, false, + app_name.data, &err); + pfree(app_name.data); + + if (!wrconn) + ereport(ERROR, + errcode(ERRCODE_CONNECTION_FAILURE), + errmsg("could not connect to the primary server: %s", err)); + + SyncReplicationSlots(wrconn); + + walrcv_disconnect(wrconn); + + PG_RETURN_VOID(); +} diff --git a/src/backend/replication/syncrep.c b/src/backend/replication/syncrep.c index 0ea71b5c4348e..e6df5281289ec 100644 --- a/src/backend/replication/syncrep.c +++ b/src/backend/replication/syncrep.c @@ -63,7 +63,7 @@ * the standbys which are considered as synchronous at that moment * will release waiters from the queue. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/syncrep.c @@ -75,15 +75,14 @@ #include #include "access/xact.h" +#include "common/int.h" #include "miscadmin.h" #include "pgstat.h" #include "replication/syncrep.h" #include "replication/walsender.h" #include "replication/walsender_private.h" -#include "storage/pmsignal.h" #include "storage/proc.h" #include "tcop/tcopprot.h" -#include "utils/builtins.h" #include "utils/guc_hooks.h" #include "utils/ps_status.h" @@ -162,16 +161,23 @@ SyncRepWaitForLSN(XLogRecPtr lsn, bool commit) * sync replication standby names defined. * * Since this routine gets called every commit time, it's important to - * exit quickly if sync replication is not requested. So we check - * WalSndCtl->sync_standbys_defined flag without the lock and exit - * immediately if it's false. If it's true, we need to check it again - * later while holding the lock, to check the flag and operate the sync - * rep queue atomically. This is necessary to avoid the race condition - * described in SyncRepUpdateSyncStandbysDefined(). On the other hand, if - * it's false, the lock is not necessary because we don't touch the queue. + * exit quickly if sync replication is not requested. + * + * We check WalSndCtl->sync_standbys_status flag without the lock and exit + * immediately if SYNC_STANDBY_INIT is set (the checkpointer has + * initialized this data) but SYNC_STANDBY_DEFINED is missing (no sync + * replication requested). + * + * If SYNC_STANDBY_DEFINED is set, we need to check the status again later + * while holding the lock, to check the flag and operate the sync rep + * queue atomically. This is necessary to avoid the race condition + * described in SyncRepUpdateSyncStandbysDefined(). On the other hand, if + * SYNC_STANDBY_DEFINED is not set, the lock is not necessary because we + * don't touch the queue. */ if (!SyncRepRequested() || - !((volatile WalSndCtlData *) WalSndCtl)->sync_standbys_defined) + ((((volatile WalSndCtlData *) WalSndCtl)->sync_standbys_status) & + (SYNC_STANDBY_INIT | SYNC_STANDBY_DEFINED)) == SYNC_STANDBY_INIT) return; /* Cap the level for anything other than commit to remote flush only. */ @@ -187,16 +193,52 @@ SyncRepWaitForLSN(XLogRecPtr lsn, bool commit) Assert(MyProc->syncRepState == SYNC_REP_NOT_WAITING); /* - * We don't wait for sync rep if WalSndCtl->sync_standbys_defined is not - * set. See SyncRepUpdateSyncStandbysDefined. + * We don't wait for sync rep if SYNC_STANDBY_DEFINED is not set. See + * SyncRepUpdateSyncStandbysDefined(). * * Also check that the standby hasn't already replied. Unlikely race * condition but we'll be fetching that cache line anyway so it's likely * to be a low cost check. + * + * If the sync standby data has not been initialized yet + * (SYNC_STANDBY_INIT is not set), fall back to a check based on the LSN, + * then do a direct GUC check. */ - if (!WalSndCtl->sync_standbys_defined || - lsn <= WalSndCtl->lsn[mode]) + if (WalSndCtl->sync_standbys_status & SYNC_STANDBY_INIT) + { + if ((WalSndCtl->sync_standbys_status & SYNC_STANDBY_DEFINED) == 0 || + lsn <= WalSndCtl->lsn[mode]) + { + LWLockRelease(SyncRepLock); + return; + } + } + else if (lsn <= WalSndCtl->lsn[mode]) { + /* + * The LSN is older than what we need to wait for. The sync standby + * data has not been initialized yet, but we are OK to not wait + * because we know that there is no point in doing so based on the + * LSN. + */ + LWLockRelease(SyncRepLock); + return; + } + else if (!SyncStandbysDefined()) + { + /* + * If we are here, the sync standby data has not been initialized yet, + * and the LSN is newer than what need to wait for, so we have fallen + * back to the best thing we could do in this case: a check on + * SyncStandbysDefined() to see if the GUC is set or not. + * + * When the GUC has a value, we wait until the checkpointer updates + * the status data because we cannot be sure yet if we should wait or + * not. Here, the GUC has *no* value, we are sure that there is no + * point to wait; this matters for example when initializing a + * cluster, where we should never wait, and no sync standbys is the + * default behavior. + */ LWLockRelease(SyncRepLock); return; } @@ -416,7 +458,7 @@ SyncRepInitConfig(void) SpinLockRelease(&MyWalSnd->mutex); ereport(DEBUG1, - (errmsg_internal("standby \"%s\" now has synchronous standby priority %u", + (errmsg_internal("standby \"%s\" now has synchronous standby priority %d", application_name, priority))); } } @@ -483,7 +525,7 @@ SyncRepReleaseWaiters(void) if (SyncRepConfig->syncrep_method == SYNC_REP_PRIORITY) ereport(LOG, - (errmsg("standby \"%s\" is now a synchronous standby with priority %u", + (errmsg("standby \"%s\" is now a synchronous standby with priority %d", application_name, MyWalSnd->sync_standby_priority))); else ereport(LOG, @@ -698,12 +740,7 @@ cmp_lsn(const void *a, const void *b) XLogRecPtr lsn1 = *((const XLogRecPtr *) a); XLogRecPtr lsn2 = *((const XLogRecPtr *) b); - if (lsn1 > lsn2) - return -1; - else if (lsn1 == lsn2) - return 0; - else - return 1; + return pg_cmp_u64(lsn2, lsn1); } /* @@ -918,7 +955,7 @@ SyncRepWakeQueue(bool all, int mode) /* * The checkpointer calls this as needed to update the shared - * sync_standbys_defined flag, so that backends don't remain permanently wedged + * sync_standbys_status flag, so that backends don't remain permanently wedged * if synchronous_standby_names is unset. It's safe to check the current value * without the lock, because it's only ever updated by one process. But we * must take the lock to change it. @@ -928,7 +965,8 @@ SyncRepUpdateSyncStandbysDefined(void) { bool sync_standbys_defined = SyncStandbysDefined(); - if (sync_standbys_defined != WalSndCtl->sync_standbys_defined) + if (sync_standbys_defined != + ((WalSndCtl->sync_standbys_status & SYNC_STANDBY_DEFINED) != 0)) { LWLockAcquire(SyncRepLock, LW_EXCLUSIVE); @@ -952,7 +990,30 @@ SyncRepUpdateSyncStandbysDefined(void) * backend that hasn't yet reloaded its config might go to sleep on * the queue (and never wake up). This prevents that. */ - WalSndCtl->sync_standbys_defined = sync_standbys_defined; + WalSndCtl->sync_standbys_status = SYNC_STANDBY_INIT | + (sync_standbys_defined ? SYNC_STANDBY_DEFINED : 0); + + LWLockRelease(SyncRepLock); + } + else if ((WalSndCtl->sync_standbys_status & SYNC_STANDBY_INIT) == 0) + { + LWLockAcquire(SyncRepLock, LW_EXCLUSIVE); + + /* + * Note that there is no need to wake up the queues here. We would + * reach this path only if SyncStandbysDefined() returns false, or it + * would mean that some backends are waiting with the GUC set. See + * SyncRepWaitForLSN(). + */ + Assert(!SyncStandbysDefined()); + + /* + * Even if there is no sync standby defined, let the readers of this + * information know that the sync standby data has been initialized. + * This can just be done once, hence the previous check on + * SYNC_STANDBY_INIT to avoid useless work. + */ + WalSndCtl->sync_standbys_status |= SYNC_STANDBY_INIT; LWLockRelease(SyncRepLock); } @@ -1016,7 +1077,7 @@ check_synchronous_standby_names(char **newval, void **extra, GucSource source) if (syncrep_parse_error_msg) GUC_check_errdetail("%s", syncrep_parse_error_msg); else - GUC_check_errdetail("synchronous_standby_names parser failed"); + GUC_check_errdetail("\"synchronous_standby_names\" parser failed"); return false; } diff --git a/src/backend/replication/syncrep_gram.y b/src/backend/replication/syncrep_gram.y index 7f31d08c105c7..a14f63b6582c4 100644 --- a/src/backend/replication/syncrep_gram.y +++ b/src/backend/replication/syncrep_gram.y @@ -3,7 +3,7 @@ * * syncrep_gram.y - Parser for synchronous_standby_names * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/replication/syncrep_scanner.l b/src/backend/replication/syncrep_scanner.l index 97c88f8bf9b3b..6defb90f13bf0 100644 --- a/src/backend/replication/syncrep_scanner.l +++ b/src/backend/replication/syncrep_scanner.l @@ -4,7 +4,7 @@ * syncrep_scanner.l * a lexical scanner for synchronous_standby_names * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c index feff709435113..acda5f68d9a8b 100644 --- a/src/backend/replication/walreceiver.c +++ b/src/backend/replication/walreceiver.c @@ -39,7 +39,7 @@ * specific parts are in the libpqwalreceiver module. It's loaded * dynamically to avoid linking the server with libpq. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -58,18 +58,16 @@ #include "access/xlogarchive.h" #include "access/xlogrecovery.h" #include "catalog/pg_authid.h" -#include "catalog/pg_type.h" -#include "common/ip.h" #include "funcapi.h" #include "libpq/pqformat.h" #include "libpq/pqsignal.h" #include "miscadmin.h" #include "pgstat.h" +#include "postmaster/auxprocess.h" #include "postmaster/interrupt.h" #include "replication/walreceiver.h" #include "replication/walsender.h" #include "storage/ipc.h" -#include "storage/pmsignal.h" #include "storage/proc.h" #include "storage/procarray.h" #include "storage/procsignal.h" @@ -78,7 +76,6 @@ #include "utils/guc.h" #include "utils/pg_lsn.h" #include "utils/ps_status.h" -#include "utils/resowner.h" #include "utils/timestamp.h" @@ -122,7 +119,7 @@ typedef enum WalRcvWakeupReason WALRCV_WAKEUP_TERMINATE, WALRCV_WAKEUP_PING, WALRCV_WAKEUP_REPLY, - WALRCV_WAKEUP_HSFEEDBACK + WALRCV_WAKEUP_HSFEEDBACK, #define NUM_WALRCV_WAKEUPS (WALRCV_WAKEUP_HSFEEDBACK + 1) } WalRcvWakeupReason; @@ -132,7 +129,6 @@ typedef enum WalRcvWakeupReason static TimestampTz wakeup[NUM_WALRCV_WAKEUPS]; static StringInfoData reply_message; -static StringInfoData incoming_message; /* Prototypes for private functions */ static void WalRcvFetchTimeLineHistoryFiles(TimeLineID first, TimeLineID last); @@ -184,7 +180,7 @@ ProcessWalRcvInterrupts(void) /* Main entry point for walreceiver process */ void -WalReceiverMain(void) +WalReceiverMain(char *startup_data, size_t startup_data_len) { char conninfo[MAXCONNINFO]; char *tmp_conninfo; @@ -194,16 +190,22 @@ WalReceiverMain(void) TimeLineID startpointTLI; TimeLineID primaryTLI; bool first_stream; - WalRcvData *walrcv = WalRcv; + WalRcvData *walrcv; TimestampTz now; char *err; char *sender_host = NULL; int sender_port = 0; + Assert(startup_data_len == 0); + + MyBackendType = B_WAL_RECEIVER; + AuxiliaryProcessMainCommon(); + /* * WalRcv should be set up already (if we are a backend, we inherit this * by fork() or EXEC_BACKEND mechanism from the postmaster). */ + walrcv = WalRcv; Assert(walrcv != NULL); /* @@ -296,7 +298,7 @@ WalReceiverMain(void) sigprocmask(SIG_SETMASK, &UnBlockSig, NULL); /* Establish the connection to the primary for XLOG streaming */ - wrconn = walrcv_connect(conninfo, false, false, + wrconn = walrcv_connect(conninfo, true, false, false, cluster_name[0] ? cluster_name : "walreceiver", &err); if (!wrconn) @@ -387,7 +389,7 @@ WalReceiverMain(void) "pg_walreceiver_%lld", (long long int) walrcv_get_backend_pid(wrconn)); - walrcv_create_slot(wrconn, slotname, true, false, 0, NULL); + walrcv_create_slot(wrconn, slotname, true, false, false, 0, NULL); SpinLockAcquire(&walrcv->mutex); strlcpy(walrcv->slotname, slotname, NAMEDATALEN); @@ -425,7 +427,6 @@ WalReceiverMain(void) /* Initialize LogstreamResult and buffers for processing messages */ LogstreamResult.Write = LogstreamResult.Flush = GetXLogReplayRecPtr(NULL); initStringInfo(&reply_message); - initStringInfo(&incoming_message); /* Initialize nap wakeup times. */ now = GetCurrentTimestamp(); @@ -843,19 +844,20 @@ XLogWalRcvProcessMsg(unsigned char type, char *buf, Size len, TimeLineID tli) TimestampTz sendTime; bool replyRequested; - resetStringInfo(&incoming_message); - switch (type) { case 'w': /* WAL records */ { - /* copy message to StringInfo */ + StringInfoData incoming_message; + hdrlen = sizeof(int64) + sizeof(int64) + sizeof(int64); if (len < hdrlen) ereport(ERROR, (errcode(ERRCODE_PROTOCOL_VIOLATION), errmsg_internal("invalid WAL message received from primary"))); - appendBinaryStringInfo(&incoming_message, buf, hdrlen); + + /* initialize a StringInfo with the given buffer */ + initReadOnlyStringInfo(&incoming_message, buf, hdrlen); /* read the fields */ dataStart = pq_getmsgint64(&incoming_message); @@ -870,13 +872,16 @@ XLogWalRcvProcessMsg(unsigned char type, char *buf, Size len, TimeLineID tli) } case 'k': /* Keepalive */ { - /* copy message to StringInfo */ + StringInfoData incoming_message; + hdrlen = sizeof(int64) + sizeof(int64) + sizeof(char); if (len != hdrlen) ereport(ERROR, (errcode(ERRCODE_PROTOCOL_VIOLATION), errmsg_internal("invalid keepalive message received from primary"))); - appendBinaryStringInfo(&incoming_message, buf, hdrlen); + + /* initialize a StringInfo with the given buffer */ + initReadOnlyStringInfo(&incoming_message, buf, hdrlen); /* read the fields */ walEnd = pq_getmsgint64(&incoming_message); @@ -952,7 +957,7 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr, TimeLineID tli) ereport(PANIC, (errcode_for_file_access(), errmsg("could not write to WAL segment %s " - "at offset %u, length %lu: %m", + "at offset %d, length %lu: %m", xlogfname, startoff, (unsigned long) segbytes))); } diff --git a/src/backend/replication/walreceiverfuncs.c b/src/backend/replication/walreceiverfuncs.c index 8305022ce4d08..85a19cdfa5c63 100644 --- a/src/backend/replication/walreceiverfuncs.c +++ b/src/backend/replication/walreceiverfuncs.c @@ -6,7 +6,7 @@ * with the walreceiver process. Functions implementing walreceiver itself * are in walreceiver.c. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -25,7 +25,6 @@ #include "access/xlog_internal.h" #include "access/xlogrecovery.h" #include "pgstat.h" -#include "postmaster/startup.h" #include "replication/walreceiver.h" #include "storage/pmsignal.h" #include "storage/shmem.h" diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index d3a136b6f5546..e0257cc49b3ad 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -37,7 +37,7 @@ * record, wait for it to be replicated to the standby, and then exit. * * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/replication/walsender.c @@ -49,7 +49,6 @@ #include #include -#include "access/printtup.h" #include "access/timeline.h" #include "access/transam.h" #include "access/xact.h" @@ -58,6 +57,7 @@ #include "access/xlogrecovery.h" #include "access/xlogutils.h" #include "backup/basebackup.h" +#include "backup/basebackup_incremental.h" #include "catalog/pg_authid.h" #include "catalog/pg_type.h" #include "commands/dbcommands.h" @@ -71,6 +71,7 @@ #include "postmaster/interrupt.h" #include "replication/decode.h" #include "replication/logical.h" +#include "replication/slotsync.h" #include "replication/slot.h" #include "replication/snapbuild.h" #include "replication/syncrep.h" @@ -82,7 +83,6 @@ #include "storage/ipc.h" #include "storage/pmsignal.h" #include "storage/proc.h" -#include "storage/procarray.h" #include "tcop/dest.h" #include "tcop/tcopprot.h" #include "utils/acl.h" @@ -90,11 +90,14 @@ #include "utils/guc.h" #include "utils/memutils.h" #include "utils/pg_lsn.h" -#include "utils/portal.h" +#include "utils/pgstat_internal.h" #include "utils/ps_status.h" #include "utils/timeout.h" #include "utils/timestamp.h" +/* Minimum interval used by walsender for stats flushes, in ms */ +#define WALSENDER_STATS_FLUSH_INTERVAL 1000 + /* * Maximum data payload in a WAL data message. Must be >= XLOG_BLCKSZ. * @@ -137,6 +140,17 @@ bool wake_wal_senders = false; */ static XLogReaderState *xlogreader = NULL; +/* + * If the UPLOAD_MANIFEST command is used to provide a backup manifest in + * preparation for an incremental backup, uploaded_manifest will be point + * to an object containing information about its contexts, and + * uploaded_manifest_mcxt will point to the memory context that contains + * that object and all of its subordinate data. Otherwise, both values will + * be NULL. + */ +static IncrementalBackupInfo *uploaded_manifest = NULL; +static MemoryContext uploaded_manifest_mcxt = NULL; + /* * These variables keep track of the state of the timeline we're currently * sending. sendTimeLine identifies the timeline. If sendTimeLineIsHistoric, @@ -231,8 +245,10 @@ static void WalSndShutdown(void) pg_attribute_noreturn(); static void XLogSendPhysical(void); static void XLogSendLogical(void); static void WalSndDone(WalSndSendDataCallback send_data); -static XLogRecPtr GetStandbyFlushRecPtr(TimeLineID *tli); static void IdentifySystem(void); +static void UploadManifest(void); +static bool HandleUploadManifestPacket(StringInfo buf, off_t *offset, + IncrementalBackupInfo *ib); static void ReadReplicationSlot(ReadReplicationSlotCmd *cmd); static void CreateReplicationSlot(CreateReplicationSlotCmd *cmd); static void DropReplicationSlot(DropReplicationSlotCmd *cmd); @@ -324,7 +340,7 @@ WalSndErrorCleanup(void) if (MyReplicationSlot != NULL) ReplicationSlotRelease(); - ReplicationSlotCleanup(); + ReplicationSlotCleanup(false); replication_active = false; @@ -603,7 +619,7 @@ SendTimeLineHistory(TimeLineHistoryCmd *cmd) dest->rStartup(dest, CMD_SELECT, tupdesc); /* Send a DataRow message */ - pq_beginmessage(&buf, 'D'); + pq_beginmessage(&buf, PqMsg_DataRow); pq_sendint16(&buf, 2); /* # of columns */ len = strlen(histfname); pq_sendint32(&buf, len); /* col1 len */ @@ -660,6 +676,143 @@ SendTimeLineHistory(TimeLineHistoryCmd *cmd) pq_endmessage(&buf); } +/* + * Handle UPLOAD_MANIFEST command. + */ +static void +UploadManifest(void) +{ + MemoryContext mcxt; + IncrementalBackupInfo *ib; + off_t offset = 0; + StringInfoData buf; + + /* + * parsing the manifest will use the cryptohash stuff, which requires a + * resource owner + */ + Assert(CurrentResourceOwner == NULL); + CurrentResourceOwner = ResourceOwnerCreate(NULL, "base backup"); + + /* Prepare to read manifest data into a temporary context. */ + mcxt = AllocSetContextCreate(CurrentMemoryContext, + "incremental backup information", + ALLOCSET_DEFAULT_SIZES); + ib = CreateIncrementalBackupInfo(mcxt); + + /* Send a CopyInResponse message */ + pq_beginmessage(&buf, PqMsg_CopyInResponse); + pq_sendbyte(&buf, 0); + pq_sendint16(&buf, 0); + pq_endmessage_reuse(&buf); + pq_flush(); + + /* Receive packets from client until done. */ + while (HandleUploadManifestPacket(&buf, &offset, ib)) + ; + + /* Finish up manifest processing. */ + FinalizeIncrementalManifest(ib); + + /* + * Discard any old manifest information and arrange to preserve the new + * information we just got. + * + * We assume that MemoryContextDelete and MemoryContextSetParent won't + * fail, and thus we shouldn't end up bailing out of here in such a way as + * to leave dangling pointers. + */ + if (uploaded_manifest_mcxt != NULL) + MemoryContextDelete(uploaded_manifest_mcxt); + MemoryContextSetParent(mcxt, CacheMemoryContext); + uploaded_manifest = ib; + uploaded_manifest_mcxt = mcxt; + + /* clean up the resource owner we created */ + WalSndResourceCleanup(true); +} + +/* + * Process one packet received during the handling of an UPLOAD_MANIFEST + * operation. + * + * 'buf' is scratch space. This function expects it to be initialized, doesn't + * care what the current contents are, and may override them with completely + * new contents. + * + * The return value is true if the caller should continue processing + * additional packets and false if the UPLOAD_MANIFEST operation is complete. + */ +static bool +HandleUploadManifestPacket(StringInfo buf, off_t *offset, + IncrementalBackupInfo *ib) +{ + int mtype; + int maxmsglen; + + HOLD_CANCEL_INTERRUPTS(); + + pq_startmsgread(); + mtype = pq_getbyte(); + if (mtype == EOF) + ereport(ERROR, + (errcode(ERRCODE_CONNECTION_FAILURE), + errmsg("unexpected EOF on client connection with an open transaction"))); + + switch (mtype) + { + case 'd': /* CopyData */ + maxmsglen = PQ_LARGE_MESSAGE_LIMIT; + break; + case 'c': /* CopyDone */ + case 'f': /* CopyFail */ + case 'H': /* Flush */ + case 'S': /* Sync */ + maxmsglen = PQ_SMALL_MESSAGE_LIMIT; + break; + default: + ereport(ERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("unexpected message type 0x%02X during COPY from stdin", + mtype))); + maxmsglen = 0; /* keep compiler quiet */ + break; + } + + /* Now collect the message body */ + if (pq_getmessage(buf, maxmsglen)) + ereport(ERROR, + (errcode(ERRCODE_CONNECTION_FAILURE), + errmsg("unexpected EOF on client connection with an open transaction"))); + RESUME_CANCEL_INTERRUPTS(); + + /* Process the message */ + switch (mtype) + { + case 'd': /* CopyData */ + AppendIncrementalManifestData(ib, buf->data, buf->len); + return true; + + case 'c': /* CopyDone */ + return false; + + case 'H': /* Sync */ + case 'S': /* Flush */ + /* Ignore these while in CopyOut mode as we do elsewhere. */ + return true; + + case 'f': + ereport(ERROR, + (errcode(ERRCODE_QUERY_CANCELED), + errmsg("COPY from stdin failed: %s", + pq_getmsgstring(buf)))); + } + + /* Not reached. */ + Assert(false); + return false; +} + /* * Handle START_REPLICATION command. * @@ -801,7 +954,7 @@ StartReplication(StartReplicationCmd *cmd) WalSndSetState(WALSNDSTATE_CATCHUP); /* Send a CopyBothResponse message, and start streaming */ - pq_beginmessage(&buf, 'W'); + pq_beginmessage(&buf, PqMsg_CopyBothResponse); pq_sendbyte(&buf, 0); pq_sendint16(&buf, 0); pq_endmessage(&buf); @@ -947,7 +1100,7 @@ logical_read_xlog_page(XLogReaderState *state, XLogRecPtr targetPagePtr, int req if (!WALRead(state, cur_page, targetPagePtr, - XLOG_BLCKSZ, + count, currTLI, /* Pass the current TLI because only * WalSndSegmentOpen controls whether new TLI * is needed. */ @@ -974,12 +1127,13 @@ static void parseCreateReplSlotOptions(CreateReplicationSlotCmd *cmd, bool *reserve_wal, CRSSnapshotAction *snapshot_action, - bool *two_phase) + bool *two_phase, bool *failover) { ListCell *lc; bool snapshot_action_given = false; bool reserve_wal_given = false; bool two_phase_given = false; + bool failover_given = false; /* Parse options */ foreach(lc, cmd->options) @@ -1029,6 +1183,15 @@ parseCreateReplSlotOptions(CreateReplicationSlotCmd *cmd, two_phase_given = true; *two_phase = defGetBoolean(defel); } + else if (strcmp(defel->defname, "failover") == 0) + { + if (failover_given || cmd->kind != REPLICATION_KIND_LOGICAL) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("conflicting or redundant options"))); + failover_given = true; + *failover = defGetBoolean(defel); + } else elog(ERROR, "unrecognized option: %s", defel->defname); } @@ -1045,6 +1208,7 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd) char *slot_name; bool reserve_wal = false; bool two_phase = false; + bool failover = false; CRSSnapshotAction snapshot_action = CRS_EXPORT_SNAPSHOT; DestReceiver *dest; TupOutputState *tstate; @@ -1054,16 +1218,33 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd) Assert(!MyReplicationSlot); - parseCreateReplSlotOptions(cmd, &reserve_wal, &snapshot_action, &two_phase); + parseCreateReplSlotOptions(cmd, &reserve_wal, &snapshot_action, &two_phase, + &failover); if (cmd->kind == REPLICATION_KIND_PHYSICAL) { ReplicationSlotCreate(cmd->slotname, false, cmd->temporary ? RS_TEMPORARY : RS_PERSISTENT, - false); + false, false, false); + + if (reserve_wal) + { + ReplicationSlotReserveWal(); + + ReplicationSlotMarkDirty(); + + /* Write this slot to disk if it's a permanent one. */ + if (!cmd->temporary) + ReplicationSlotSave(); + } } else { + LogicalDecodingContext *ctx; + bool need_full_snapshot = false; + + Assert(cmd->kind == REPLICATION_KIND_LOGICAL); + CheckLogicalDecodingRequirements(); /* @@ -1075,13 +1256,7 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd) */ ReplicationSlotCreate(cmd->slotname, true, cmd->temporary ? RS_TEMPORARY : RS_EPHEMERAL, - two_phase); - } - - if (cmd->kind == REPLICATION_KIND_LOGICAL) - { - LogicalDecodingContext *ctx; - bool need_full_snapshot = false; + two_phase, failover, false); /* * Do options check early so that we can bail before calling the @@ -1113,7 +1288,7 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd) if (!XactReadOnly) ereport(ERROR, /*- translator: %s is a CREATE_REPLICATION_SLOT statement */ - (errmsg("%s must be called in a read only transaction", + (errmsg("%s must be called in a read-only transaction", "CREATE_REPLICATION_SLOT ... (SNAPSHOT 'use')"))); if (FirstSnapshotSet) @@ -1175,16 +1350,6 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd) if (!cmd->temporary) ReplicationSlotPersist(); } - else if (cmd->kind == REPLICATION_KIND_PHYSICAL && reserve_wal) - { - ReplicationSlotReserveWal(); - - ReplicationSlotMarkDirty(); - - /* Write this slot to disk if it's a permanent one. */ - if (!cmd->temporary) - ReplicationSlotSave(); - } snprintf(xloc, sizeof(xloc), "%X/%X", LSN_FORMAT_ARGS(MyReplicationSlot->data.confirmed_flush)); @@ -1197,7 +1362,6 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd) * - second field: LSN at which we became consistent * - third field: exported snapshot's name * - fourth field: output plugin - *---------- */ tupdesc = CreateTemplateTupleDesc(4); TupleDescInitBuiltinEntry(tupdesc, (AttrNumber) 1, "slot_name", @@ -1247,6 +1411,43 @@ DropReplicationSlot(DropReplicationSlotCmd *cmd) ReplicationSlotDrop(cmd->slotname, !cmd->wait); } +/* + * Process extra options given to ALTER_REPLICATION_SLOT. + */ +static void +ParseAlterReplSlotOptions(AlterReplicationSlotCmd *cmd, bool *failover) +{ + bool failover_given = false; + + /* Parse options */ + foreach_ptr(DefElem, defel, cmd->options) + { + if (strcmp(defel->defname, "failover") == 0) + { + if (failover_given) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("conflicting or redundant options"))); + failover_given = true; + *failover = defGetBoolean(defel); + } + else + elog(ERROR, "unrecognized option: %s", defel->defname); + } +} + +/* + * Change the definition of a replication slot. + */ +static void +AlterReplicationSlot(AlterReplicationSlotCmd *cmd) +{ + bool failover = false; + + ParseAlterReplSlotOptions(cmd, &failover); + ReplicationSlotAlter(cmd->slotname, failover); +} + /* * Load previously initiated logical slot and prepare for sending data (via * WalSndLoop). @@ -1295,7 +1496,7 @@ StartLogicalReplication(StartReplicationCmd *cmd) WalSndSetState(WALSNDSTATE_CATCHUP); /* Send a CopyBothResponse message, and start streaming */ - pq_beginmessage(&buf, 'W'); + pq_beginmessage(&buf, PqMsg_CopyBothResponse); pq_sendbyte(&buf, 0); pq_sendint16(&buf, 0); pq_endmessage(&buf); @@ -1496,13 +1697,13 @@ WalSndUpdateProgress(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId * When skipping empty transactions in synchronous replication, we send a * keepalive message to avoid delaying such transactions. * - * It is okay to check sync_standbys_defined flag without lock here as in - * the worst case we will just send an extra keepalive message when it is + * It is okay to check sync_standbys_status without lock here as in the + * worst case we will just send an extra keepalive message when it is * really not required. */ if (skipped_xact && SyncRepRequested() && - ((volatile WalSndCtlData *) WalSndCtl)->sync_standbys_defined) + (((volatile WalSndCtlData *) WalSndCtl)->sync_standbys_status & SYNC_STANDBY_DEFINED)) { WalSndKeepalive(false, lsn); @@ -1528,37 +1729,123 @@ WalSndUpdateProgress(LogicalDecodingContext *ctx, XLogRecPtr lsn, TransactionId ProcessPendingWrites(); } +/* + * Wake up the logical walsender processes with logical failover slots if the + * currently acquired physical slot is specified in synchronized_standby_slots GUC. + */ +void +PhysicalWakeupLogicalWalSnd(void) +{ + Assert(MyReplicationSlot && SlotIsPhysical(MyReplicationSlot)); + + /* + * If we are running in a standby, there is no need to wake up walsenders. + * This is because we do not support syncing slots to cascading standbys, + * so, there are no walsenders waiting for standbys to catch up. + */ + if (RecoveryInProgress()) + return; + + if (SlotExistsInSyncStandbySlots(NameStr(MyReplicationSlot->data.name))) + ConditionVariableBroadcast(&WalSndCtl->wal_confirm_rcv_cv); +} + +/* + * Returns true if not all standbys have caught up to the flushed position + * (flushed_lsn) when the current acquired slot is a logical failover + * slot and we are streaming; otherwise, returns false. + * + * If returning true, the function sets the appropriate wait event in + * wait_event; otherwise, wait_event is set to 0. + */ +static bool +NeedToWaitForStandbys(XLogRecPtr flushed_lsn, uint32 *wait_event) +{ + int elevel = got_STOPPING ? ERROR : WARNING; + bool failover_slot; + + failover_slot = (replication_active && MyReplicationSlot->data.failover); + + /* + * Note that after receiving the shutdown signal, an ERROR is reported if + * any slots are dropped, invalidated, or inactive. This measure is taken + * to prevent the walsender from waiting indefinitely. + */ + if (failover_slot && !StandbySlotsHaveCaughtup(flushed_lsn, elevel)) + { + *wait_event = WAIT_EVENT_WAIT_FOR_STANDBY_CONFIRMATION; + return true; + } + + *wait_event = 0; + return false; +} + +/* + * Returns true if we need to wait for WALs to be flushed to disk, or if not + * all standbys have caught up to the flushed position (flushed_lsn) when the + * current acquired slot is a logical failover slot and we are + * streaming; otherwise, returns false. + * + * If returning true, the function sets the appropriate wait event in + * wait_event; otherwise, wait_event is set to 0. + */ +static bool +NeedToWaitForWal(XLogRecPtr target_lsn, XLogRecPtr flushed_lsn, + uint32 *wait_event) +{ + /* Check if we need to wait for WALs to be flushed to disk */ + if (target_lsn > flushed_lsn) + { + *wait_event = WAIT_EVENT_WAL_SENDER_WAIT_FOR_WAL; + return true; + } + + /* Check if the standby slots have caught up to the flushed position */ + return NeedToWaitForStandbys(flushed_lsn, wait_event); +} + /* * Wait till WAL < loc is flushed to disk so it can be safely sent to client. * - * Returns end LSN of flushed WAL. Normally this will be >= loc, but - * if we detect a shutdown request (either from postmaster or client) - * we will return early, so caller must always check. + * If the walsender holds a logical failover slot, we also wait for all the + * specified streaming replication standby servers to confirm receipt of WAL + * up to RecentFlushPtr. It is beneficial to wait here for the confirmation + * up to RecentFlushPtr rather than waiting before transmitting each change + * to logical subscribers, which is already covered by RecentFlushPtr. + * + * Returns end LSN of flushed WAL. Normally this will be >= loc, but if we + * detect a shutdown request (either from postmaster or client) we will return + * early, so caller must always check. */ static XLogRecPtr WalSndWaitForWal(XLogRecPtr loc) { int wakeEvents; + uint32 wait_event = 0; static XLogRecPtr RecentFlushPtr = InvalidXLogRecPtr; + TimestampTz last_flush = 0; /* * Fast path to avoid acquiring the spinlock in case we already know we - * have enough WAL available. This is particularly interesting if we're - * far behind. + * have enough WAL available and all the standby servers have confirmed + * receipt of WAL up to RecentFlushPtr. This is particularly interesting + * if we're far behind. */ - if (RecentFlushPtr != InvalidXLogRecPtr && - loc <= RecentFlushPtr) + if (!XLogRecPtrIsInvalid(RecentFlushPtr) && + !NeedToWaitForWal(loc, RecentFlushPtr, &wait_event)) return RecentFlushPtr; - /* Get a more recent flush pointer. */ - if (!RecoveryInProgress()) - RecentFlushPtr = GetFlushRecPtr(NULL); - else - RecentFlushPtr = GetXLogReplayRecPtr(NULL); - + /* + * Within the loop, we wait for the necessary WALs to be flushed to disk + * first, followed by waiting for standbys to catch up if there are enough + * WALs (see NeedToWaitForWal()) or upon receiving the shutdown signal. + */ for (;;) { + bool wait_for_standby_at_stop = false; long sleeptime; + TimestampTz now; /* Clear any already-pending wakeups */ ResetLatch(MyLatch); @@ -1584,21 +1871,35 @@ WalSndWaitForWal(XLogRecPtr loc) if (got_STOPPING) XLogBackgroundFlush(); - /* Update our idea of the currently flushed position. */ - if (!RecoveryInProgress()) - RecentFlushPtr = GetFlushRecPtr(NULL); - else - RecentFlushPtr = GetXLogReplayRecPtr(NULL); + /* + * To avoid the scenario where standbys need to catch up to a newer + * WAL location in each iteration, we update our idea of the currently + * flushed position only if we are not waiting for standbys to catch + * up. + */ + if (wait_event != WAIT_EVENT_WAIT_FOR_STANDBY_CONFIRMATION) + { + if (!RecoveryInProgress()) + RecentFlushPtr = GetFlushRecPtr(NULL); + else + RecentFlushPtr = GetXLogReplayRecPtr(NULL); + } /* - * If postmaster asked us to stop, don't wait anymore. + * If postmaster asked us to stop and the standby slots have caught up + * to the flushed position, don't wait anymore. * * It's important to do this check after the recomputation of * RecentFlushPtr, so we can send all remaining data before shutting * down. */ if (got_STOPPING) - break; + { + if (NeedToWaitForStandbys(RecentFlushPtr, &wait_event)) + wait_for_standby_at_stop = true; + else + break; + } /* * We only send regular messages to the client for full decoded @@ -1613,11 +1914,18 @@ WalSndWaitForWal(XLogRecPtr loc) !waiting_for_ping_response) WalSndKeepalive(false, InvalidXLogRecPtr); - /* check whether we're done */ - if (loc <= RecentFlushPtr) + /* + * Exit the loop if already caught up and doesn't need to wait for + * standby slots. + */ + if (!wait_for_standby_at_stop && + !NeedToWaitForWal(loc, RecentFlushPtr, &wait_event)) break; - /* Waiting for new WAL. Since we need to wait, we're now caught up. */ + /* + * Waiting for new WAL or waiting for standbys to catch up. Since we + * need to wait, we're now caught up. + */ WalSndCaughtUp = true; /* @@ -1648,14 +1956,25 @@ WalSndWaitForWal(XLogRecPtr loc) * new WAL to be generated. (But if we have nothing to send, we don't * want to wake on socket-writable.) */ - sleeptime = WalSndComputeSleeptime(GetCurrentTimestamp()); + now = GetCurrentTimestamp(); + sleeptime = WalSndComputeSleeptime(now); wakeEvents = WL_SOCKET_READABLE; if (pq_is_send_pending()) wakeEvents |= WL_SOCKET_WRITEABLE; - WalSndWait(wakeEvents, sleeptime, WAIT_EVENT_WAL_SENDER_WAIT_WAL); + Assert(wait_event != 0); + + /* Report IO statistics, if needed */ + if (TimestampDifferenceExceeds(last_flush, now, + WALSENDER_STATS_FLUSH_INTERVAL)) + { + pgstat_flush_io(false); + last_flush = now; + } + + WalSndWait(wakeEvents, sleeptime, wait_event); } /* reactivate latch so WalSndLoop knows to continue */ @@ -1802,7 +2121,7 @@ exec_replication_command(const char *cmd_string) cmdtag = "BASE_BACKUP"; set_ps_display(cmdtag); PreventInTransactionBlock(true, cmdtag); - SendBaseBackup((BaseBackupCmd *) cmd_node); + SendBaseBackup((BaseBackupCmd *) cmd_node, uploaded_manifest); EndReplicationCommand(cmdtag); break; @@ -1820,6 +2139,13 @@ exec_replication_command(const char *cmd_string) EndReplicationCommand(cmdtag); break; + case T_AlterReplicationSlotCmd: + cmdtag = "ALTER_REPLICATION_SLOT"; + set_ps_display(cmdtag); + AlterReplicationSlot((AlterReplicationSlotCmd *) cmd_node); + EndReplicationCommand(cmdtag); + break; + case T_StartReplicationCmd: { StartReplicationCmd *cmd = (StartReplicationCmd *) cmd_node; @@ -1864,6 +2190,14 @@ exec_replication_command(const char *cmd_string) } break; + case T_UploadManifestCmd: + cmdtag = "UPLOAD_MANIFEST"; + set_ps_display(cmdtag); + PreventInTransactionBlock(true, cmdtag); + UploadManifest(); + EndReplicationCommand(cmdtag); + break; + default: elog(ERROR, "unrecognized replication command node tag: %u", cmd_node->type); @@ -1924,11 +2258,11 @@ ProcessRepliesIfAny(void) /* Validate message type and set packet size limit */ switch (firstchar) { - case 'd': + case PqMsg_CopyData: maxmsglen = PQ_LARGE_MESSAGE_LIMIT; break; - case 'c': - case 'X': + case PqMsg_CopyDone: + case PqMsg_Terminate: maxmsglen = PQ_SMALL_MESSAGE_LIMIT; break; default: @@ -1956,7 +2290,7 @@ ProcessRepliesIfAny(void) /* * 'd' means a standby reply wrapped in a CopyData packet. */ - case 'd': + case PqMsg_CopyData: ProcessStandbyMessage(); received = true; break; @@ -1965,7 +2299,7 @@ ProcessRepliesIfAny(void) * CopyDone means the standby requested to finish streaming. * Reply with CopyDone, if we had not sent that already. */ - case 'c': + case PqMsg_CopyDone: if (!streamingDoneSending) { pq_putmessage_noblock('c', NULL, 0); @@ -1979,7 +2313,7 @@ ProcessRepliesIfAny(void) /* * 'X' means that the standby is closing down the socket. */ - case 'X': + case PqMsg_Terminate: proc_exit(0); default: @@ -2050,6 +2384,7 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn) { ReplicationSlotMarkDirty(); ReplicationSlotsComputeRequiredLSN(); + PhysicalWakeupLogicalWalSnd(); } /* @@ -2446,6 +2781,8 @@ WalSndCheckTimeOut(void) static void WalSndLoop(WalSndSendDataCallback send_data) { + TimestampTz last_flush = 0; + /* * Initialize the last reply timestamp. That enables timeout processing * from hereon. @@ -2540,6 +2877,9 @@ WalSndLoop(WalSndSendDataCallback send_data) * WalSndWaitForWal() handle any other blocking; idle receivers need * its additional actions. For physical replication, also block if * caught up; its send_data does not block. + * + * The IO statistics are reported in WalSndWaitForWal() for the + * logical WAL senders. */ if ((WalSndCaughtUp && send_data != XLogSendLogical && !streamingDoneSending) || @@ -2547,6 +2887,7 @@ WalSndLoop(WalSndSendDataCallback send_data) { long sleeptime; int wakeEvents; + TimestampTz now; if (!streamingDoneReceiving) wakeEvents = WL_SOCKET_READABLE; @@ -2557,11 +2898,20 @@ WalSndLoop(WalSndSendDataCallback send_data) * Use fresh timestamp, not last_processing, to reduce the chance * of reaching wal_sender_timeout before sending a keepalive. */ - sleeptime = WalSndComputeSleeptime(GetCurrentTimestamp()); + now = GetCurrentTimestamp(); + sleeptime = WalSndComputeSleeptime(now); if (pq_is_send_pending()) wakeEvents |= WL_SOCKET_WRITEABLE; + /* Report IO statistics, if needed */ + if (TimestampDifferenceExceeds(last_flush, now, + WALSENDER_STATS_FLUSH_INTERVAL)) + { + pgstat_flush_io(false); + last_flush = now; + } + /* Sleep until something happens or we time out */ WalSndWait(wakeEvents, sleeptime, WAIT_EVENT_WAL_SENDER_MAIN); } @@ -2692,7 +3042,7 @@ WalSndSegmentOpen(XLogReaderState *state, XLogSegNo nextSegNo, * restored from the archive on this server, the file belonging to the old * timeline, 000000040000000000000013, might not exist. Their contents are * equal up to the switchpoint, because at a timeline switch, the used - * portion of the old segment is copied to the new file. ------- + * portion of the old segment is copied to the new file. */ *tli_p = sendTimeLine; if (sendTimeLineIsHistoric) @@ -2751,6 +3101,7 @@ XLogSendPhysical(void) Size nbytes; XLogSegNo segno; WALReadError errinfo; + Size rbytes; /* If requested switch the WAL sender to the stopping state. */ if (got_STOPPING) @@ -2966,7 +3317,16 @@ XLogSendPhysical(void) enlargeStringInfo(&output_message, nbytes); retry: - if (!WALRead(xlogreader, + /* attempt to read WAL from WAL buffers first */ + rbytes = WALReadFromBuffers(&output_message.data[output_message.len], + startptr, nbytes, xlogreader->seg.ws_tli); + output_message.len += rbytes; + startptr += rbytes; + nbytes -= rbytes; + + /* now read the remaining WAL from WAL file */ + if (nbytes > 0 && + !WALRead(xlogreader, &output_message.data[output_message.len], startptr, nbytes, @@ -3160,14 +3520,17 @@ WalSndDone(WalSndSendDataCallback send_data) } /* - * Returns the latest point in WAL that has been safely flushed to disk, and - * can be sent to the standby. This should only be called when in recovery, - * ie. we're streaming to a cascaded standby. + * Returns the latest point in WAL that has been safely flushed to disk. + * This should only be called when in recovery. + * + * This is called either by cascading walsender to find WAL position to be sent + * to a cascaded standby or by slot synchronization operation to validate remote + * slot's lsn before syncing it locally. * * As a side-effect, *tli is updated to the TLI of the last * replayed WAL record. */ -static XLogRecPtr +XLogRecPtr GetStandbyFlushRecPtr(TimeLineID *tli) { XLogRecPtr replayPtr; @@ -3176,6 +3539,8 @@ GetStandbyFlushRecPtr(TimeLineID *tli) TimeLineID receiveTLI; XLogRecPtr result; + Assert(am_cascading_walsender || IsSyncingReplicationSlots()); + /* * We can safely send what's already been replayed. Also, if walreceiver * is streaming WAL from the same timeline, we can send anything that it @@ -3246,12 +3611,8 @@ HandleWalSndInitStopping(void) static void WalSndLastCycleHandler(SIGNAL_ARGS) { - int save_errno = errno; - got_SIGUSR2 = true; SetLatch(MyLatch); - - errno = save_errno; } /* Set up signal handlers */ @@ -3312,6 +3673,7 @@ WalSndShmemInit(void) ConditionVariableInit(&WalSndCtl->wal_flush_cv); ConditionVariableInit(&WalSndCtl->wal_replay_cv); + ConditionVariableInit(&WalSndCtl->wal_confirm_rcv_cv); } } @@ -3381,8 +3743,14 @@ WalSndWait(uint32 socket_events, long timeout, uint32 wait_event) * * And, we use separate shared memory CVs for physical and logical * walsenders for selective wake ups, see WalSndWakeup() for more details. + * + * If the wait event is WAIT_FOR_STANDBY_CONFIRMATION, wait on another CV + * until awakened by physical walsenders after the walreceiver confirms + * the receipt of the LSN. */ - if (MyWalSnd->kind == REPLICATION_KIND_PHYSICAL) + if (wait_event == WAIT_EVENT_WAIT_FOR_STANDBY_CONFIRMATION) + ConditionVariablePrepareToSleep(&WalSndCtl->wal_confirm_rcv_cv); + else if (MyWalSnd->kind == REPLICATION_KIND_PHYSICAL) ConditionVariablePrepareToSleep(&WalSndCtl->wal_flush_cv); else if (MyWalSnd->kind == REPLICATION_KIND_LOGICAL) ConditionVariablePrepareToSleep(&WalSndCtl->wal_replay_cv); @@ -3420,7 +3788,7 @@ WalSndInitStopping(void) if (pid == 0) continue; - SendProcSignal(pid, PROCSIG_WALSND_INIT_STOPPING, InvalidBackendId); + SendProcSignal(pid, PROCSIG_WALSND_INIT_STOPPING, INVALID_PROC_NUMBER); } } @@ -3541,7 +3909,7 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS) for (i = 0; i < max_wal_senders; i++) { WalSnd *walsnd = &WalSndCtl->walsnds[i]; - XLogRecPtr sentPtr; + XLogRecPtr sent_ptr; XLogRecPtr write; XLogRecPtr flush; XLogRecPtr apply; @@ -3565,7 +3933,7 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS) continue; } pid = walsnd->pid; - sentPtr = walsnd->sentPtr; + sent_ptr = walsnd->sentPtr; state = walsnd->state; write = walsnd->write; flush = walsnd->flush; @@ -3608,9 +3976,9 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS) { values[1] = CStringGetTextDatum(WalSndGetStateString(state)); - if (XLogRecPtrIsInvalid(sentPtr)) + if (XLogRecPtrIsInvalid(sent_ptr)) nulls[2] = true; - values[2] = LSNGetDatum(sentPtr); + values[2] = LSNGetDatum(sent_ptr); if (XLogRecPtrIsInvalid(write)) nulls[3] = true; diff --git a/src/backend/rewrite/meson.build b/src/backend/rewrite/meson.build index 71d11810d698f..23043ca6e56d5 100644 --- a/src/backend/rewrite/meson.build +++ b/src/backend/rewrite/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'rewriteDefine.c', diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index e36fc72e1edbf..6cc9a8d8bfe90 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -3,7 +3,7 @@ * rewriteDefine.c * routines for defining a rewrite rule * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -14,21 +14,15 @@ */ #include "postgres.h" -#include "access/heapam.h" #include "access/htup_details.h" -#include "access/multixact.h" -#include "access/tableam.h" -#include "access/transam.h" -#include "access/xact.h" +#include "access/relation.h" +#include "access/table.h" #include "catalog/catalog.h" #include "catalog/dependency.h" -#include "catalog/heap.h" +#include "catalog/indexing.h" #include "catalog/namespace.h" #include "catalog/objectaccess.h" -#include "catalog/pg_inherits.h" #include "catalog/pg_rewrite.h" -#include "catalog/storage.h" -#include "commands/policy.h" #include "miscadmin.h" #include "nodes/nodeFuncs.h" #include "parser/parse_utilcmd.h" @@ -40,7 +34,6 @@ #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/rel.h" -#include "utils/snapmgr.h" #include "utils/syscache.h" diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index b486ab559a84c..beca0a9c74731 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -3,7 +3,7 @@ * rewriteHandler.c * Primary module of query rewriter. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -24,7 +24,6 @@ #include "access/sysattr.h" #include "access/table.h" #include "catalog/dependency.h" -#include "catalog/pg_type.h" #include "commands/trigger.h" #include "executor/executor.h" #include "foreign/fdwapi.h" @@ -41,6 +40,7 @@ #include "rewrite/rewriteManip.h" #include "rewrite/rewriteSearchCycle.h" #include "rewrite/rowsecurity.h" +#include "tcop/tcopprot.h" #include "utils/builtins.h" #include "utils/lsyscache.h" #include "utils/rel.h" @@ -58,6 +58,12 @@ typedef struct acquireLocksOnSubLinks_context bool for_execute; /* AcquireRewriteLocks' forExecute param */ } acquireLocksOnSubLinks_context; +typedef struct fireRIRonSubLink_context +{ + List *activeRIRs; + bool hasRowSecurity; +} fireRIRonSubLink_context; + static bool acquireLocksOnSubLinks(Node *node, acquireLocksOnSubLinks_context *context); static Query *rewriteRuleAction(Query *parsetree, @@ -86,10 +92,9 @@ static void rewriteValuesRTEToNulls(Query *parsetree, RangeTblEntry *rte); static void markQueryForLocking(Query *qry, Node *jtnode, LockClauseStrength strength, LockWaitPolicy waitPolicy, bool pushedDown); -static List *matchLocks(CmdType event, RuleLock *rulelocks, +static List *matchLocks(CmdType event, Relation relation, int varno, Query *parsetree, bool *hasUpdate); static Query *fireRIRrules(Query *parsetree, List *activeRIRs); -static bool view_has_instead_trigger(Relation view, CmdType event); static Bitmapset *adjust_view_column_set(Bitmapset *cols, List *targetlist); @@ -997,23 +1002,11 @@ rewriteTargetListIU(List *targetList, if (commandType == CMD_INSERT) new_tle = NULL; else - { - new_expr = (Node *) makeConst(att_tup->atttypid, - -1, - att_tup->attcollation, - att_tup->attlen, - (Datum) 0, - true, /* isnull */ - att_tup->attbyval); - /* this is to catch a NOT NULL domain constraint */ - new_expr = coerce_to_domain(new_expr, - InvalidOid, -1, - att_tup->atttypid, - COERCION_IMPLICIT, - COERCE_IMPLICIT_CAST, - -1, - false); - } + new_expr = coerce_null_to_domain(att_tup->atttypid, + att_tup->atttypmod, + att_tup->attcollation, + att_tup->attlen, + att_tup->attbyval); } if (new_expr) @@ -1087,9 +1080,9 @@ process_matched_tle(TargetEntry *src_tle, * resulting in each assignment containing a CoerceToDomain node over a * FieldStore or SubscriptingRef. These should have matching target * domains, so we strip them and reconstitute a single CoerceToDomain over - * the combined FieldStore/SubscriptingRef nodes. (Notice that this has the - * result that the domain's checks are applied only after we do all the - * field or element updates, not after each one. This is arguably desirable.) + * the combined FieldStore/SubscriptingRef nodes. (Notice that this has + * the result that the domain's checks are applied only after we do all + * the field or element updates, not after each one. This is desirable.) *---------- */ src_expr = (Node *) src_tle->expr; @@ -1235,7 +1228,7 @@ build_column_default(Relation rel, int attrno) { NextValueExpr *nve = makeNode(NextValueExpr); - nve->seqid = getIdentitySequence(RelationGetRelid(rel), attrno, false); + nve->seqid = getIdentitySequence(rel, attrno, false); nve->typeId = att_tup->atttypid; return (Node *) nve; @@ -1246,21 +1239,7 @@ build_column_default(Relation rel, int attrno) */ if (att_tup->atthasdef) { - if (rd_att->constr && rd_att->constr->num_defval > 0) - { - AttrDefault *defval = rd_att->constr->defval; - int ndef = rd_att->constr->num_defval; - - while (--ndef >= 0) - { - if (attrno == defval[ndef].adnum) - { - /* Found it, convert string representation to node tree. */ - expr = stringToNode(defval[ndef].adbin); - break; - } - } - } + expr = TupleDescGetDefault(rd_att, attrno); if (expr == NULL) elog(ERROR, "default expression not found for attribute %d of relation \"%s\"", attrno, RelationGetRelationName(rel)); @@ -1479,7 +1458,7 @@ rewriteValuesRTE(Query *parsetree, RangeTblEntry *rte, int rti, */ isAutoUpdatableView = false; if (target_relation->rd_rel->relkind == RELKIND_VIEW && - !view_has_instead_trigger(target_relation, CMD_INSERT)) + !view_has_instead_trigger(target_relation, CMD_INSERT, NIL)) { List *locks; bool hasUpdate; @@ -1487,7 +1466,7 @@ rewriteValuesRTE(Query *parsetree, RangeTblEntry *rte, int rti, ListCell *l; /* Look for an unconditional DO INSTEAD rule */ - locks = matchLocks(CMD_INSERT, target_relation->rd_rules, + locks = matchLocks(CMD_INSERT, target_relation, parsetree->resultRelation, parsetree, &hasUpdate); found = false; @@ -1575,21 +1554,11 @@ rewriteValuesRTE(Query *parsetree, RangeTblEntry *rte, int rti, continue; } - new_expr = (Node *) makeConst(att_tup->atttypid, - -1, - att_tup->attcollation, - att_tup->attlen, - (Datum) 0, - true, /* isnull */ - att_tup->attbyval); - /* this is to catch a NOT NULL domain constraint */ - new_expr = coerce_to_domain(new_expr, - InvalidOid, -1, - att_tup->atttypid, - COERCION_IMPLICIT, - COERCE_IMPLICIT_CAST, - -1, - false); + new_expr = coerce_null_to_domain(att_tup->atttypid, + att_tup->atttypmod, + att_tup->attcollation, + att_tup->attlen, + att_tup->attbyval); } newList = lappend(newList, new_expr); } @@ -1651,15 +1620,16 @@ rewriteValuesRTEToNulls(Query *parsetree, RangeTblEntry *rte) /* * matchLocks - - * match the list of locks and returns the matching rules + * match a relation's list of locks and returns the matching rules */ static List * matchLocks(CmdType event, - RuleLock *rulelocks, + Relation relation, int varno, Query *parsetree, bool *hasUpdate) { + RuleLock *rulelocks = relation->rd_rules; List *matching_locks = NIL; int nlocks; int i; @@ -1667,10 +1637,6 @@ matchLocks(CmdType event, if (rulelocks == NULL) return NIL; - /* No rule support for MERGE */ - if (parsetree->commandType == CMD_MERGE) - return NIL; - if (parsetree->commandType != CMD_SELECT) { if (parsetree->resultRelation != varno) @@ -1688,7 +1654,7 @@ matchLocks(CmdType event, /* * Suppress ON INSERT/UPDATE/DELETE rules that are disabled or - * configured to not fire during the current sessions replication + * configured to not fire during the current session's replication * role. ON SELECT rules will always be applied in order to keep views * working even in LOCAL or REPLICA role. */ @@ -1706,6 +1672,14 @@ matchLocks(CmdType event, oneLock->enabled == RULE_DISABLED) continue; } + + /* Non-SELECT rules are not supported for MERGE */ + if (parsetree->commandType == CMD_MERGE) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot execute MERGE on relation \"%s\"", + RelationGetRelationName(relation)), + errdetail("MERGE is not supported for relations with rules.")); } if (oneLock->event == event) @@ -1740,6 +1714,14 @@ ApplyRetrieveRule(Query *parsetree, if (rule->qual != NULL) elog(ERROR, "cannot handle qualified ON SELECT rule"); + /* Check if the expansion of non-system views are restricted */ + if (unlikely((restrict_nonsystem_relation_kind & RESTRICT_RELKIND_VIEW) != 0 && + RelationGetRelid(relation) >= FirstNormalObjectId)) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("access to non-system view \"%s\" is restricted", + RelationGetRelationName(relation)))); + if (rt_index == parsetree->resultRelation) { /* @@ -1752,9 +1734,9 @@ ApplyRetrieveRule(Query *parsetree, * For INSERT, we needn't do anything. The unmodified RTE will serve * fine as the result relation. * - * For UPDATE/DELETE, we need to expand the view so as to have source - * data for the operation. But we also need an unmodified RTE to - * serve as the target. So, copy the RTE and add the copy to the + * For UPDATE/DELETE/MERGE, we need to expand the view so as to have + * source data for the operation. But we also need an unmodified RTE + * to serve as the target. So, copy the RTE and add the copy to the * rangetable. Note that the copy does not get added to the jointree. * Also note that there's a hack in fireRIRrules to avoid calling this * function again when it arrives at the copied RTE. @@ -1762,7 +1744,8 @@ ApplyRetrieveRule(Query *parsetree, if (parsetree->commandType == CMD_INSERT) return parsetree; else if (parsetree->commandType == CMD_UPDATE || - parsetree->commandType == CMD_DELETE) + parsetree->commandType == CMD_DELETE || + parsetree->commandType == CMD_MERGE) { RangeTblEntry *newrte; Var *var; @@ -1772,6 +1755,7 @@ ApplyRetrieveRule(Query *parsetree, newrte = copyObject(rte); parsetree->rtable = lappend(parsetree->rtable, newrte); parsetree->resultRelation = list_length(parsetree->rtable); + /* parsetree->mergeTargetRelation unchanged (use expanded view) */ /* * For the most part, Vars referencing the view should remain as @@ -1839,6 +1823,12 @@ ApplyRetrieveRule(Query *parsetree, */ rule_action = fireRIRrules(rule_action, activeRIRs); + /* + * Make sure the query is marked as having row security if the view query + * does. + */ + parsetree->hasRowSecurity |= rule_action->hasRowSecurity; + /* * Now, plug the view query in as a subselect, converting the relation's * original RTE to a subquery RTE. @@ -1952,7 +1942,7 @@ markQueryForLocking(Query *qry, Node *jtnode, * the SubLink's subselect link with the possibly-rewritten subquery. */ static bool -fireRIRonSubLink(Node *node, List *activeRIRs) +fireRIRonSubLink(Node *node, fireRIRonSubLink_context *context) { if (node == NULL) return false; @@ -1962,7 +1952,13 @@ fireRIRonSubLink(Node *node, List *activeRIRs) /* Do what we came for */ sub->subselect = (Node *) fireRIRrules((Query *) sub->subselect, - activeRIRs); + context->activeRIRs); + + /* + * Remember if any of the sublinks have row security. + */ + context->hasRowSecurity |= ((Query *) sub->subselect)->hasRowSecurity; + /* Fall through to process lefthand args of SubLink */ } @@ -1971,7 +1967,7 @@ fireRIRonSubLink(Node *node, List *activeRIRs) * subselects of subselects for us. */ return expression_tree_walker(node, fireRIRonSubLink, - (void *) activeRIRs); + (void *) context); } @@ -2032,6 +2028,13 @@ fireRIRrules(Query *parsetree, List *activeRIRs) if (rte->rtekind == RTE_SUBQUERY) { rte->subquery = fireRIRrules(rte->subquery, activeRIRs); + + /* + * While we are here, make sure the query is marked as having row + * security if any of its subqueries do. + */ + parsetree->hasRowSecurity |= rte->subquery->hasRowSecurity; + continue; } @@ -2145,6 +2148,12 @@ fireRIRrules(Query *parsetree, List *activeRIRs) cte->ctequery = (Node *) fireRIRrules((Query *) cte->ctequery, activeRIRs); + + /* + * While we are here, make sure the query is marked as having row + * security if any of its CTEs do. + */ + parsetree->hasRowSecurity |= ((Query *) cte->ctequery)->hasRowSecurity; } /* @@ -2152,9 +2161,22 @@ fireRIRrules(Query *parsetree, List *activeRIRs) * the rtable and cteList. */ if (parsetree->hasSubLinks) - query_tree_walker(parsetree, fireRIRonSubLink, (void *) activeRIRs, + { + fireRIRonSubLink_context context; + + context.activeRIRs = activeRIRs; + context.hasRowSecurity = false; + + query_tree_walker(parsetree, fireRIRonSubLink, (void *) &context, QTW_IGNORE_RC_SUBQUERIES); + /* + * Make sure the query is marked as having row security if any of its + * sublinks do. + */ + parsetree->hasRowSecurity |= context.hasRowSecurity; + } + /* * Apply any row-level security policies. We do this last because it * requires special recursion detection if the new quals have sublink @@ -2193,6 +2215,7 @@ fireRIRrules(Query *parsetree, List *activeRIRs) if (hasSubLinks) { acquireLocksOnSubLinks_context context; + fireRIRonSubLink_context fire_context; /* * Recursively process the new quals, checking for infinite @@ -2223,11 +2246,21 @@ fireRIRrules(Query *parsetree, List *activeRIRs) * Now that we have the locks on anything added by * get_row_security_policies, fire any RIR rules for them. */ + fire_context.activeRIRs = activeRIRs; + fire_context.hasRowSecurity = false; + expression_tree_walker((Node *) securityQuals, - fireRIRonSubLink, (void *) activeRIRs); + fireRIRonSubLink, (void *) &fire_context); expression_tree_walker((Node *) withCheckOptions, - fireRIRonSubLink, (void *) activeRIRs); + fireRIRonSubLink, (void *) &fire_context); + + /* + * We can ignore the value of fire_context.hasRowSecurity + * since we only reach this code in cases where hasRowSecurity + * is already true. + */ + Assert(hasRowSecurity); activeRIRs = list_delete_last(activeRIRs); } @@ -2467,9 +2500,15 @@ get_view_query(Relation view) * If it does, we don't want to treat it as auto-updatable. This test can't * be folded into view_query_is_auto_updatable because it's not an error * condition. + * + * For MERGE, this will return true if there is an INSTEAD OF trigger for + * every action in mergeActionList, and false if there are any actions that + * lack an INSTEAD OF trigger. If there are no data-modifying MERGE actions + * (only DO NOTHING actions), true is returned so that the view is treated + * as trigger-updatable, rather than erroring out if it's not auto-updatable. */ -static bool -view_has_instead_trigger(Relation view, CmdType event) +bool +view_has_instead_trigger(Relation view, CmdType event, List *mergeActionList) { TriggerDesc *trigDesc = view->trigdesc; @@ -2487,6 +2526,32 @@ view_has_instead_trigger(Relation view, CmdType event) if (trigDesc && trigDesc->trig_delete_instead_row) return true; break; + case CMD_MERGE: + foreach_node(MergeAction, action, mergeActionList) + { + switch (action->commandType) + { + case CMD_INSERT: + if (!trigDesc || !trigDesc->trig_insert_instead_row) + return false; + break; + case CMD_UPDATE: + if (!trigDesc || !trigDesc->trig_update_instead_row) + return false; + break; + case CMD_DELETE: + if (!trigDesc || !trigDesc->trig_delete_instead_row) + return false; + break; + case CMD_NOTHING: + /* No trigger required */ + break; + default: + elog(ERROR, "unrecognized commandType: %d", action->commandType); + break; + } + } + return true; /* no actions without an INSTEAD OF trigger */ default: elog(ERROR, "unrecognized CmdType: %d", (int) event); break; @@ -2963,7 +3028,7 @@ relation_is_updatable(Oid reloid, * * This is used with simply-updatable views to map column-permissions sets for * the view columns onto the matching columns in the underlying base relation. - * The targetlist is expected to be a list of plain Vars of the underlying + * Relevant entries in the targetlist must be plain Vars of the underlying * relation (as per the checks above in view_query_is_auto_updatable). */ static Bitmapset * @@ -3027,6 +3092,105 @@ adjust_view_column_set(Bitmapset *cols, List *targetlist) } +/* + * error_view_not_updatable - + * Report an error due to an attempt to update a non-updatable view. + * + * Generally this is expected to be called from the rewriter, with suitable + * error detail explaining why the view is not updatable. Note, however, that + * the executor also performs a just-in-case check that the target view is + * updatable. That check is expected to never fail, but if it does, it will + * call this function with NULL error detail --- see CheckValidResultRel(). + * + * Note: for MERGE, at least one of the actions in mergeActionList is expected + * to lack a suitable INSTEAD OF trigger --- see view_has_instead_trigger(). + */ +void +error_view_not_updatable(Relation view, + CmdType command, + List *mergeActionList, + const char *detail) +{ + TriggerDesc *trigDesc = view->trigdesc; + + switch (command) + { + case CMD_INSERT: + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot insert into view \"%s\"", + RelationGetRelationName(view)), + detail ? errdetail_internal("%s", _(detail)) : 0, + errhint("To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule.")); + break; + case CMD_UPDATE: + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot update view \"%s\"", + RelationGetRelationName(view)), + detail ? errdetail_internal("%s", _(detail)) : 0, + errhint("To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule.")); + break; + case CMD_DELETE: + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot delete from view \"%s\"", + RelationGetRelationName(view)), + detail ? errdetail_internal("%s", _(detail)) : 0, + errhint("To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule.")); + break; + case CMD_MERGE: + + /* + * Note that the error hints here differ from above, since MERGE + * doesn't support rules. + */ + foreach_node(MergeAction, action, mergeActionList) + { + switch (action->commandType) + { + case CMD_INSERT: + if (!trigDesc || !trigDesc->trig_insert_instead_row) + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot insert into view \"%s\"", + RelationGetRelationName(view)), + detail ? errdetail_internal("%s", _(detail)) : 0, + errhint("To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT trigger.")); + break; + case CMD_UPDATE: + if (!trigDesc || !trigDesc->trig_update_instead_row) + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot update view \"%s\"", + RelationGetRelationName(view)), + detail ? errdetail_internal("%s", _(detail)) : 0, + errhint("To enable updating the view using MERGE, provide an INSTEAD OF UPDATE trigger.")); + break; + case CMD_DELETE: + if (!trigDesc || !trigDesc->trig_delete_instead_row) + ereport(ERROR, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot delete from view \"%s\"", + RelationGetRelationName(view)), + detail ? errdetail_internal("%s", _(detail)) : 0, + errhint("To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE trigger.")); + break; + case CMD_NOTHING: + break; + default: + elog(ERROR, "unrecognized commandType: %d", action->commandType); + break; + } + } + break; + default: + elog(ERROR, "unrecognized CmdType: %d", (int) command); + break; + } +} + + /* * rewriteTargetView - * Attempt to rewrite a query where the target relation is a view, so that @@ -3040,6 +3204,7 @@ static Query * rewriteTargetView(Query *parsetree, Relation view) { Query *viewquery; + bool insert_or_update; const char *auto_update_detail; RangeTblRef *rtr; int base_rt_index; @@ -3063,59 +3228,77 @@ rewriteTargetView(Query *parsetree, Relation view) */ viewquery = copyObject(get_view_query(view)); - /* The view must be updatable, else fail */ - auto_update_detail = - view_query_is_auto_updatable(viewquery, - parsetree->commandType != CMD_DELETE); + /* Locate RTE and perminfo describing the view in the outer query */ + view_rte = rt_fetch(parsetree->resultRelation, parsetree->rtable); + view_perminfo = getRTEPermissionInfo(parsetree->rteperminfos, view_rte); - if (auto_update_detail) + /* + * Are we doing INSERT/UPDATE, or MERGE containing INSERT/UPDATE? If so, + * various additional checks on the view columns need to be applied, and + * any view CHECK OPTIONs need to be enforced. + */ + insert_or_update = + (parsetree->commandType == CMD_INSERT || + parsetree->commandType == CMD_UPDATE); + + if (parsetree->commandType == CMD_MERGE) { - /* messages here should match execMain.c's CheckValidResultRel */ - switch (parsetree->commandType) + foreach_node(MergeAction, action, parsetree->mergeActionList) { - case CMD_INSERT: - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("cannot insert into view \"%s\"", - RelationGetRelationName(view)), - errdetail_internal("%s", _(auto_update_detail)), - errhint("To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule."))); - break; - case CMD_UPDATE: - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("cannot update view \"%s\"", - RelationGetRelationName(view)), - errdetail_internal("%s", _(auto_update_detail)), - errhint("To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule."))); - break; - case CMD_DELETE: - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("cannot delete from view \"%s\"", - RelationGetRelationName(view)), - errdetail_internal("%s", _(auto_update_detail)), - errhint("To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule."))); - break; - default: - elog(ERROR, "unrecognized CmdType: %d", - (int) parsetree->commandType); + if (action->commandType == CMD_INSERT || + action->commandType == CMD_UPDATE) + { + insert_or_update = true; break; + } } } + /* Check if the expansion of non-system views are restricted */ + if (unlikely((restrict_nonsystem_relation_kind & RESTRICT_RELKIND_VIEW) != 0 && + RelationGetRelid(view) >= FirstNormalObjectId)) + ereport(ERROR, + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("access to non-system view \"%s\" is restricted", + RelationGetRelationName(view)))); + /* - * For INSERT/UPDATE the modified columns must all be updatable. Note that - * we get the modified columns from the query's targetlist, not from the - * result RTE's insertedCols and/or updatedCols set, since - * rewriteTargetListIU may have added additional targetlist entries for - * view defaults, and these must also be updatable. + * The view must be updatable, else fail. + * + * If we are doing INSERT/UPDATE (or MERGE containing INSERT/UPDATE), we + * also check that there is at least one updatable column. */ - if (parsetree->commandType != CMD_DELETE) + auto_update_detail = + view_query_is_auto_updatable(viewquery, insert_or_update); + + if (auto_update_detail) + error_view_not_updatable(view, + parsetree->commandType, + parsetree->mergeActionList, + auto_update_detail); + + /* + * For INSERT/UPDATE (or MERGE containing INSERT/UPDATE) the modified + * columns must all be updatable. + */ + if (insert_or_update) { - Bitmapset *modified_cols = NULL; + Bitmapset *modified_cols; char *non_updatable_col; + /* + * Compute the set of modified columns as those listed in the result + * RTE's insertedCols and/or updatedCols sets plus those that are + * targets of the query's targetlist(s). We must consider the query's + * targetlist because rewriteTargetListIU may have added additional + * targetlist entries for view defaults, and these must also be + * updatable. But rewriteTargetListIU can also remove entries if they + * are DEFAULT markers and the column's default is NULL, so + * considering only the targetlist would also be wrong. + */ + modified_cols = bms_union(view_perminfo->insertedCols, + view_perminfo->updatedCols); + foreach(lc, parsetree->targetList) { TargetEntry *tle = (TargetEntry *) lfirst(lc); @@ -3137,6 +3320,20 @@ rewriteTargetView(Query *parsetree, Relation view) } } + foreach_node(MergeAction, action, parsetree->mergeActionList) + { + if (action->commandType == CMD_INSERT || + action->commandType == CMD_UPDATE) + { + foreach_node(TargetEntry, tle, action->targetList) + { + if (!tle->resjunk) + modified_cols = bms_add_member(modified_cols, + tle->resno - FirstLowInvalidHeapAttributeNumber); + } + } + } + auto_update_detail = view_cols_are_auto_updatable(viewquery, modified_cols, NULL, @@ -3165,6 +3362,14 @@ rewriteTargetView(Query *parsetree, Relation view) RelationGetRelationName(view)), errdetail_internal("%s", _(auto_update_detail)))); break; + case CMD_MERGE: + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot merge into column \"%s\" of view \"%s\"", + non_updatable_col, + RelationGetRelationName(view)), + errdetail_internal("%s", _(auto_update_detail)))); + break; default: elog(ERROR, "unrecognized CmdType: %d", (int) parsetree->commandType); @@ -3173,8 +3378,27 @@ rewriteTargetView(Query *parsetree, Relation view) } } - /* Locate RTE describing the view in the outer query */ - view_rte = rt_fetch(parsetree->resultRelation, parsetree->rtable); + /* + * For MERGE, there must not be any INSTEAD OF triggers on an otherwise + * updatable view. The caller already checked that there isn't a full set + * of INSTEAD OF triggers, so this is to guard against having a partial + * set (mixing auto-update and trigger-update actions in a single command + * isn't supported). + */ + if (parsetree->commandType == CMD_MERGE) + { + foreach_node(MergeAction, action, parsetree->mergeActionList) + { + if (action->commandType != CMD_NOTHING && + view_has_instead_trigger(view, action->commandType, NIL)) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot merge into view \"%s\"", + RelationGetRelationName(view)), + errdetail("MERGE is not supported for views with INSTEAD OF triggers for some actions but not all."), + errhint("To enable merging into the view, either provide a full set of INSTEAD OF triggers or drop the existing INSTEAD OF triggers.")); + } + } /* * If we get here, view_query_is_auto_updatable() has verified that the @@ -3236,8 +3460,8 @@ rewriteTargetView(Query *parsetree, Relation view) new_rt_index = list_length(parsetree->rtable); /* - * INSERTs never inherit. For UPDATE/DELETE, we use the view query's - * inheritance flag for the base relation. + * INSERTs never inherit. For UPDATE/DELETE/MERGE, we use the view + * query's inheritance flag for the base relation. */ if (parsetree->commandType == CMD_INSERT) new_rte->inh = false; @@ -3270,10 +3494,7 @@ rewriteTargetView(Query *parsetree, Relation view) * Note: the original view's RTEPermissionInfo remains in the query's * rteperminfos so that the executor still performs appropriate * permissions checks for the query caller's use of the view. - */ - view_perminfo = getRTEPermissionInfo(parsetree->rteperminfos, view_rte); - - /* + * * Disregard the perminfo in viewquery->rteperminfos that the base_rte * would currently be pointing at, because we'd like it to point now to a * new one that will be filled below. Must set perminfoindex to 0 to not @@ -3359,11 +3580,12 @@ rewriteTargetView(Query *parsetree, Relation view) /* * For INSERT/UPDATE we must also update resnos in the targetlist to refer * to columns of the base relation, since those indicate the target - * columns to be affected. + * columns to be affected. Similarly, for MERGE we must update the resnos + * in the merge action targetlists of any INSERT/UPDATE actions. * - * Note that this destroys the resno ordering of the targetlist, but that + * Note that this destroys the resno ordering of the targetlists, but that * will be fixed when we recurse through RewriteQuery, which will invoke - * rewriteTargetListIU again on the updated targetlist. + * rewriteTargetListIU again on the updated targetlists. */ if (parsetree->commandType != CMD_DELETE) { @@ -3382,6 +3604,28 @@ rewriteTargetView(Query *parsetree, Relation view) elog(ERROR, "attribute number %d not found in view targetlist", tle->resno); } + + foreach_node(MergeAction, action, parsetree->mergeActionList) + { + if (action->commandType == CMD_INSERT || + action->commandType == CMD_UPDATE) + { + foreach_node(TargetEntry, tle, action->targetList) + { + TargetEntry *view_tle; + + if (tle->resjunk) + continue; + + view_tle = get_tle_by_resno(view_targetlist, tle->resno); + if (view_tle != NULL && !view_tle->resjunk && IsA(view_tle->expr, Var)) + tle->resno = ((Var *) view_tle->expr)->varattno; + else + elog(ERROR, "attribute number %d not found in view targetlist", + tle->resno); + } + } + } } /* @@ -3474,10 +3718,10 @@ rewriteTargetView(Query *parsetree, Relation view) } /* - * For UPDATE/DELETE, pull up any WHERE quals from the view. We know that - * any Vars in the quals must reference the one base relation, so we need - * only adjust their varnos to reference the new target (just the same as - * we did with the view targetlist). + * For UPDATE/DELETE/MERGE, pull up any WHERE quals from the view. We + * know that any Vars in the quals must reference the one base relation, + * so we need only adjust their varnos to reference the new target (just + * the same as we did with the view targetlist). * * If it's a security-barrier view, its WHERE quals must be applied before * quals from the outer query, so we attach them to the RTE as security @@ -3529,11 +3773,12 @@ rewriteTargetView(Query *parsetree, Relation view) } /* - * For INSERT/UPDATE, if the view has the WITH CHECK OPTION, or any parent - * view specified WITH CASCADED CHECK OPTION, add the quals from the view - * to the query's withCheckOptions list. + * For INSERT/UPDATE (or MERGE containing INSERT/UPDATE), if the view has + * the WITH CHECK OPTION, or any parent view specified WITH CASCADED CHECK + * OPTION, add the quals from the view to the query's withCheckOptions + * list. */ - if (parsetree->commandType != CMD_DELETE) + if (insert_or_update) { bool has_wco = RelationHasCheckOption(view); bool cascaded = RelationHasCascadedCheckOption(view); @@ -3587,14 +3832,13 @@ rewriteTargetView(Query *parsetree, Relation view) ChangeVarNodes(wco->qual, base_rt_index, new_rt_index, 0); /* - * Make sure that the query is marked correctly if the added - * qual has sublinks. We can skip this check if the query is - * already marked, or if the command is an UPDATE, in which - * case the same qual will have already been added, and this - * check will already have been done. + * For INSERT, make sure that the query is marked correctly if + * the added qual has sublinks. This can be skipped for + * UPDATE/MERGE, since the same qual will have already been + * added above, and the check will already have been done. */ if (!parsetree->hasSubLinks && - parsetree->commandType != CMD_UPDATE) + parsetree->commandType == CMD_INSERT) parsetree->hasSubLinks = checkExprHasSubLink(wco->qual); } } @@ -3629,9 +3873,9 @@ RewriteQuery(Query *parsetree, List *rewrite_events, int orig_rt_length) ListCell *lc1; /* - * First, recursively process any insert/update/delete statements in WITH - * clauses. (We have to do this first because the WITH clauses may get - * copied into rule actions below.) + * First, recursively process any insert/update/delete/merge statements in + * WITH clauses. (We have to do this first because the WITH clauses may + * get copied into rule actions below.) */ foreach(lc1, parsetree->cteList) { @@ -3656,7 +3900,8 @@ RewriteQuery(Query *parsetree, List *rewrite_events, int orig_rt_length) if (!(ctequery->commandType == CMD_SELECT || ctequery->commandType == CMD_UPDATE || ctequery->commandType == CMD_INSERT || - ctequery->commandType == CMD_DELETE)) + ctequery->commandType == CMD_DELETE || + ctequery->commandType == CMD_MERGE)) { /* * Currently it could only be NOTIFY; this error message will @@ -3864,7 +4109,7 @@ RewriteQuery(Query *parsetree, List *rewrite_events, int orig_rt_length) /* * Collect and apply the appropriate rules. */ - locks = matchLocks(event, rt_entry_relation->rd_rules, + locks = matchLocks(event, rt_entry_relation, result_relation, parsetree, &hasUpdate); product_orig_rt_length = list_length(parsetree->rtable); @@ -3935,7 +4180,8 @@ RewriteQuery(Query *parsetree, List *rewrite_events, int orig_rt_length) * automatically updated. If so, we perform the necessary query * transformation here and add the resulting query to the * product_queries list, so that it gets recursively rewritten if - * necessary. + * necessary. For MERGE, the view must be automatically updatable if + * any of the merge actions lack a corresponding INSTEAD OF trigger. * * If the view cannot be automatically updated, we throw an error here * which is OK since the query would fail at runtime anyway. Throwing @@ -3945,51 +4191,19 @@ RewriteQuery(Query *parsetree, List *rewrite_events, int orig_rt_length) */ if (!instead && rt_entry_relation->rd_rel->relkind == RELKIND_VIEW && - !view_has_instead_trigger(rt_entry_relation, event)) + !view_has_instead_trigger(rt_entry_relation, event, + parsetree->mergeActionList)) { /* * If there were any qualified INSTEAD rules, don't allow the view * to be automatically updated (an unqualified INSTEAD rule or * INSTEAD OF trigger is required). - * - * The messages here should match execMain.c's CheckValidResultRel - * and in principle make those checks in executor unnecessary, but - * we keep them just in case. */ if (qual_product != NULL) - { - switch (parsetree->commandType) - { - case CMD_INSERT: - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("cannot insert into view \"%s\"", - RelationGetRelationName(rt_entry_relation)), - errdetail("Views with conditional DO INSTEAD rules are not automatically updatable."), - errhint("To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule."))); - break; - case CMD_UPDATE: - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("cannot update view \"%s\"", - RelationGetRelationName(rt_entry_relation)), - errdetail("Views with conditional DO INSTEAD rules are not automatically updatable."), - errhint("To enable updating the view, provide an INSTEAD OF UPDATE trigger or an unconditional ON UPDATE DO INSTEAD rule."))); - break; - case CMD_DELETE: - ereport(ERROR, - (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("cannot delete from view \"%s\"", - RelationGetRelationName(rt_entry_relation)), - errdetail("Views with conditional DO INSTEAD rules are not automatically updatable."), - errhint("To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule."))); - break; - default: - elog(ERROR, "unrecognized CmdType: %d", - (int) parsetree->commandType); - break; - } - } + error_view_not_updatable(rt_entry_relation, + parsetree->commandType, + parsetree->mergeActionList, + gettext_noop("Views with conditional DO INSTEAD rules are not automatically updatable.")); /* * Attempt to rewrite the query to automatically update the view. diff --git a/src/backend/rewrite/rewriteManip.c b/src/backend/rewrite/rewriteManip.c index 32bd2f1dc99f2..519c1a930b55f 100644 --- a/src/backend/rewrite/rewriteManip.c +++ b/src/backend/rewrite/rewriteManip.c @@ -2,7 +2,7 @@ * * rewriteManip.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,6 +22,7 @@ #include "parser/parse_relation.h" #include "parser/parsetree.h" #include "rewrite/rewriteManip.h" +#include "utils/lsyscache.h" typedef struct @@ -496,9 +497,10 @@ OffsetVarNodes(Node *node, int offset, int sublevels_up) /* * If we are starting at a Query, and sublevels_up is zero, then we * must also fix rangetable indexes in the Query itself --- namely - * resultRelation, exclRelIndex and rowMarks entries. sublevels_up - * cannot be zero when recursing into a subquery, so there's no need - * to have the same logic inside OffsetVarNodes_walker. + * resultRelation, mergeTargetRelation, exclRelIndex and rowMarks + * entries. sublevels_up cannot be zero when recursing into a + * subquery, so there's no need to have the same logic inside + * OffsetVarNodes_walker. */ if (sublevels_up == 0) { @@ -507,6 +509,9 @@ OffsetVarNodes(Node *node, int offset, int sublevels_up) if (qry->resultRelation) qry->resultRelation += offset; + if (qry->mergeTargetRelation) + qry->mergeTargetRelation += offset; + if (qry->onConflict && qry->onConflict->exclRelIndex) qry->onConflict->exclRelIndex += offset; @@ -687,9 +692,10 @@ ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up) /* * If we are starting at a Query, and sublevels_up is zero, then we * must also fix rangetable indexes in the Query itself --- namely - * resultRelation and rowMarks entries. sublevels_up cannot be zero - * when recursing into a subquery, so there's no need to have the same - * logic inside ChangeVarNodes_walker. + * resultRelation, mergeTargetRelation, exclRelIndex and rowMarks + * entries. sublevels_up cannot be zero when recursing into a + * subquery, so there's no need to have the same logic inside + * ChangeVarNodes_walker. */ if (sublevels_up == 0) { @@ -698,6 +704,9 @@ ChangeVarNodes(Node *node, int rt_index, int new_index, int sublevels_up) if (qry->resultRelation == rt_index) qry->resultRelation = new_index; + if (qry->mergeTargetRelation == rt_index) + qry->mergeTargetRelation = new_index; + /* this is unlikely to ever be used, but ... */ if (qry->onConflict && qry->onConflict->exclRelIndex == rt_index) qry->onConflict->exclRelIndex = new_index; @@ -1133,7 +1142,8 @@ AddInvertedQual(Query *parsetree, Node *qual) /* * add_nulling_relids() finds Vars and PlaceHolderVars that belong to any * of the target_relids, and adds added_relids to their varnullingrels - * and phnullingrels fields. + * and phnullingrels fields. If target_relids is NULL, all level-zero + * Vars and PHVs are modified. */ Node * add_nulling_relids(Node *node, @@ -1162,7 +1172,8 @@ add_nulling_relids_mutator(Node *node, Var *var = (Var *) node; if (var->varlevelsup == context->sublevels_up && - bms_is_member(var->varno, context->target_relids)) + (context->target_relids == NULL || + bms_is_member(var->varno, context->target_relids))) { Relids newnullingrels = bms_union(var->varnullingrels, context->added_relids); @@ -1180,7 +1191,8 @@ add_nulling_relids_mutator(Node *node, PlaceHolderVar *phv = (PlaceHolderVar *) node; if (phv->phlevelsup == context->sublevels_up && - bms_overlap(phv->phrels, context->target_relids)) + (context->target_relids == NULL || + bms_overlap(phv->phrels, context->target_relids))) { Relids newnullingrels = bms_union(phv->phnullingrels, context->added_relids); @@ -1710,20 +1722,21 @@ ReplaceVarsFromTargetList_callback(Var *var, return (Node *) var; case REPLACEVARS_SUBSTITUTE_NULL: - - /* - * If Var is of domain type, we should add a CoerceToDomain - * node, in case there is a NOT NULL domain constraint. - */ - return coerce_to_domain((Node *) makeNullConst(var->vartype, - var->vartypmod, - var->varcollid), - InvalidOid, -1, - var->vartype, - COERCION_IMPLICIT, - COERCE_IMPLICIT_CAST, - -1, - false); + { + /* + * If Var is of domain type, we must add a CoerceToDomain + * node, in case there is a NOT NULL domain constraint. + */ + int16 vartyplen; + bool vartypbyval; + + get_typlenbyval(var->vartype, &vartyplen, &vartypbyval); + return coerce_null_to_domain(var->vartype, + var->vartypmod, + var->varcollid, + vartyplen, + vartypbyval); + } } elog(ERROR, "could not find replacement targetlist entry for attno %d", var->varattno); diff --git a/src/backend/rewrite/rewriteRemove.c b/src/backend/rewrite/rewriteRemove.c index c0ac384998ebc..cfa0aa9279edc 100644 --- a/src/backend/rewrite/rewriteRemove.c +++ b/src/backend/rewrite/rewriteRemove.c @@ -3,7 +3,7 @@ * rewriteRemove.c * routines for removing rewrite rules * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -16,21 +16,15 @@ #include "access/genam.h" #include "access/htup_details.h" -#include "access/sysattr.h" #include "access/table.h" #include "catalog/catalog.h" -#include "catalog/dependency.h" #include "catalog/indexing.h" -#include "catalog/namespace.h" #include "catalog/pg_rewrite.h" #include "miscadmin.h" #include "rewrite/rewriteRemove.h" -#include "utils/acl.h" #include "utils/fmgroids.h" #include "utils/inval.h" -#include "utils/lsyscache.h" #include "utils/rel.h" -#include "utils/syscache.h" /* * Guts of rule deletion. diff --git a/src/backend/rewrite/rewriteSearchCycle.c b/src/backend/rewrite/rewriteSearchCycle.c index b7c8e06fa2db7..1c58003f9dc68 100644 --- a/src/backend/rewrite/rewriteSearchCycle.c +++ b/src/backend/rewrite/rewriteSearchCycle.c @@ -3,7 +3,7 @@ * rewriteSearchCycle.c * Support for rewriting SEARCH and CYCLE clauses. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -16,8 +16,8 @@ #include "catalog/pg_operator_d.h" #include "catalog/pg_type_d.h" #include "nodes/makefuncs.h" -#include "nodes/pg_list.h" #include "nodes/parsenodes.h" +#include "nodes/pg_list.h" #include "nodes/primnodes.h" #include "parser/analyze.h" #include "parser/parsetree.h" @@ -523,7 +523,7 @@ rewriteSearchAndCycle(CommonTableExpr *cte) fexpr = makeFuncExpr(F_INT8INC, INT8OID, list_make1(fs), InvalidOid, InvalidOid, COERCE_EXPLICIT_CALL); - lfirst(list_head(search_col_rowexpr->args)) = fexpr; + linitial(search_col_rowexpr->args) = fexpr; texpr = (Expr *) search_col_rowexpr; } diff --git a/src/backend/rewrite/rewriteSupport.c b/src/backend/rewrite/rewriteSupport.c index eed9f834ae55e..c13be02a9a782 100644 --- a/src/backend/rewrite/rewriteSupport.c +++ b/src/backend/rewrite/rewriteSupport.c @@ -3,7 +3,7 @@ * rewriteSupport.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -17,12 +17,11 @@ #include "access/htup_details.h" #include "access/table.h" #include "catalog/indexing.h" +#include "catalog/pg_class.h" #include "catalog/pg_rewrite.h" #include "rewrite/rewriteSupport.h" -#include "utils/fmgroids.h" #include "utils/inval.h" #include "utils/lsyscache.h" -#include "utils/rel.h" #include "utils/syscache.h" diff --git a/src/backend/rewrite/rowsecurity.c b/src/backend/rewrite/rowsecurity.c index 5c3fe4eda285f..59fd305dd7bed 100644 --- a/src/backend/rewrite/rowsecurity.c +++ b/src/backend/rewrite/rowsecurity.c @@ -29,35 +29,24 @@ * in the current environment, but that may change if the row_security GUC or * the current role changes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California */ #include "postgres.h" -#include "access/htup_details.h" -#include "access/sysattr.h" #include "access/table.h" #include "catalog/pg_class.h" -#include "catalog/pg_inherits.h" -#include "catalog/pg_policy.h" #include "catalog/pg_type.h" #include "miscadmin.h" #include "nodes/makefuncs.h" -#include "nodes/nodeFuncs.h" #include "nodes/pg_list.h" -#include "nodes/plannodes.h" -#include "parser/parsetree.h" #include "parser/parse_relation.h" #include "rewrite/rewriteDefine.h" -#include "rewrite/rewriteHandler.h" #include "rewrite/rewriteManip.h" #include "rewrite/rowsecurity.h" -#include "tcop/utility.h" #include "utils/acl.h" -#include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/rls.h" -#include "utils/syscache.h" static void get_policies_for_relation(Relation relation, CmdType cmd, Oid user_id, @@ -394,7 +383,11 @@ get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index, * and set them up so that we can enforce the appropriate policy depending * on the final action we take. * - * We already fetched the SELECT policies above. + * We already fetched the SELECT policies above, to check existing rows, + * but we must also check that new rows created by INSERT/UPDATE actions + * are visible, if SELECT rights are required. For INSERT actions, we only + * do this if RETURNING is specified, to be consistent with a plain INSERT + * command, which can only require SELECT rights when RETURNING is used. * * We don't push the UPDATE/DELETE USING quals to the RTE because we don't * really want to apply them while scanning the relation since we don't @@ -410,16 +403,22 @@ get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index, */ if (commandType == CMD_MERGE) { - List *merge_permissive_policies; - List *merge_restrictive_policies; + List *merge_update_permissive_policies; + List *merge_update_restrictive_policies; + List *merge_delete_permissive_policies; + List *merge_delete_restrictive_policies; + List *merge_insert_permissive_policies; + List *merge_insert_restrictive_policies; + List *merge_select_permissive_policies = NIL; + List *merge_select_restrictive_policies = NIL; /* * Fetch the UPDATE policies and set them up to execute on the * existing target row before doing UPDATE. */ get_policies_for_relation(rel, CMD_UPDATE, user_id, - &merge_permissive_policies, - &merge_restrictive_policies); + &merge_update_permissive_policies, + &merge_update_restrictive_policies); /* * WCO_RLS_MERGE_UPDATE_CHECK is used to check UPDATE USING quals on @@ -427,23 +426,56 @@ get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index, */ add_with_check_options(rel, rt_index, WCO_RLS_MERGE_UPDATE_CHECK, - merge_permissive_policies, - merge_restrictive_policies, + merge_update_permissive_policies, + merge_update_restrictive_policies, withCheckOptions, hasSubLinks, true); + /* Enforce the WITH CHECK clauses of the UPDATE policies */ + add_with_check_options(rel, rt_index, + WCO_RLS_UPDATE_CHECK, + merge_update_permissive_policies, + merge_update_restrictive_policies, + withCheckOptions, + hasSubLinks, + false); + + /* + * Add ALL/SELECT policies as WCO_RLS_UPDATE_CHECK WCOs, to ensure + * that the updated row is visible when executing an UPDATE action, if + * SELECT rights are required for this relation. + */ + if (perminfo->requiredPerms & ACL_SELECT) + { + get_policies_for_relation(rel, CMD_SELECT, user_id, + &merge_select_permissive_policies, + &merge_select_restrictive_policies); + add_with_check_options(rel, rt_index, + WCO_RLS_UPDATE_CHECK, + merge_select_permissive_policies, + merge_select_restrictive_policies, + withCheckOptions, + hasSubLinks, + true); + } + /* - * Same with DELETE policies. + * Fetch the DELETE policies and set them up to execute on the + * existing target row before doing DELETE. */ get_policies_for_relation(rel, CMD_DELETE, user_id, - &merge_permissive_policies, - &merge_restrictive_policies); + &merge_delete_permissive_policies, + &merge_delete_restrictive_policies); + /* + * WCO_RLS_MERGE_DELETE_CHECK is used to check DELETE USING quals on + * the existing target row. + */ add_with_check_options(rel, rt_index, WCO_RLS_MERGE_DELETE_CHECK, - merge_permissive_policies, - merge_restrictive_policies, + merge_delete_permissive_policies, + merge_delete_restrictive_policies, withCheckOptions, hasSubLinks, true); @@ -454,25 +486,31 @@ get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index, * withCheckOptions. */ get_policies_for_relation(rel, CMD_INSERT, user_id, - &merge_permissive_policies, - &merge_restrictive_policies); + &merge_insert_permissive_policies, + &merge_insert_restrictive_policies); add_with_check_options(rel, rt_index, WCO_RLS_INSERT_CHECK, - merge_permissive_policies, - merge_restrictive_policies, + merge_insert_permissive_policies, + merge_insert_restrictive_policies, withCheckOptions, hasSubLinks, false); - /* Enforce the WITH CHECK clauses of the UPDATE policies */ - add_with_check_options(rel, rt_index, - WCO_RLS_UPDATE_CHECK, - merge_permissive_policies, - merge_restrictive_policies, - withCheckOptions, - hasSubLinks, - false); + /* + * Add ALL/SELECT policies as WCO_RLS_INSERT_CHECK WCOs, to ensure + * that the inserted row is visible when executing an INSERT action, + * if RETURNING is specified and SELECT rights are required for this + * relation. + */ + if (perminfo->requiredPerms & ACL_SELECT && root->returningList) + add_with_check_options(rel, rt_index, + WCO_RLS_INSERT_CHECK, + merge_select_permissive_policies, + merge_select_restrictive_policies, + withCheckOptions, + hasSubLinks, + true); } table_close(rel, NoLock); diff --git a/src/backend/snowball/Makefile b/src/backend/snowball/Makefile index 4bebfa0250693..efc4300eb976d 100644 --- a/src/backend/snowball/Makefile +++ b/src/backend/snowball/Makefile @@ -104,8 +104,6 @@ include $(top_srcdir)/src/Makefile.shlib $(SQLSCRIPT): snowball_create.pl snowball_func.sql.in snowball.sql.in $(PERL) $< --input ${srcdir} --outdir . -distprep: $(SQLSCRIPT) - install: all installdirs install-lib install-script $(INSTALL_DATA) $(addprefix $(srcdir)/stopwords/,$(stop_files)) '$(DESTDIR)$(datadir)/$(DICTDIR)' @@ -122,6 +120,4 @@ uninstall: uninstall-lib clean distclean: clean-lib rm -f $(OBJS) - -maintainer-clean: distclean rm -f $(SQLSCRIPT) diff --git a/src/backend/snowball/dict_snowball.c b/src/backend/snowball/dict_snowball.c index 7bf3eeb8dca07..caf864906839a 100644 --- a/src/backend/snowball/dict_snowball.c +++ b/src/backend/snowball/dict_snowball.c @@ -3,7 +3,7 @@ * dict_snowball.c * Snowball dictionary * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/snowball/dict_snowball.c @@ -14,7 +14,7 @@ #include "commands/defrem.h" #include "tsearch/ts_locale.h" -#include "tsearch/ts_utils.h" +#include "tsearch/ts_public.h" /* Some platforms define MAXINT and/or MININT, causing conflicts */ #ifdef MAXINT diff --git a/src/backend/snowball/libstemmer/api.c b/src/backend/snowball/libstemmer/api.c index 375938e6d13fd..358f5633b28fe 100644 --- a/src/backend/snowball/libstemmer/api.c +++ b/src/backend/snowball/libstemmer/api.c @@ -34,7 +34,7 @@ extern struct SN_env * SN_create_env(int S_size, int I_size) extern void SN_close_env(struct SN_env * z, int S_size) { if (z == NULL) return; - if (S_size) + if (z->S) { int i; for (i = 0; i < S_size; i++) diff --git a/src/backend/snowball/meson.build b/src/backend/snowball/meson.build index 0f669c0bf3c99..02a94557e2885 100644 --- a/src/backend/snowball/meson.build +++ b/src/backend/snowball/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group dict_snowball_sources = files( 'libstemmer/api.c', diff --git a/src/backend/snowball/snowball.sql.in b/src/backend/snowball/snowball.sql.in index 4ab4955407aba..bc07a7cee6172 100644 --- a/src/backend/snowball/snowball.sql.in +++ b/src/backend/snowball/snowball.sql.in @@ -1,7 +1,7 @@ /* * text search configuration for _LANGNAME_ language * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * src/backend/snowball/snowball.sql.in * diff --git a/src/backend/snowball/snowball_create.pl b/src/backend/snowball/snowball_create.pl index 35d1cd9621b0d..95b38650db975 100644 --- a/src/backend/snowball/snowball_create.pl +++ b/src/backend/snowball/snowball_create.pl @@ -1,7 +1,9 @@ #!/usr/bin/perl +# Copyright (c) 2024, PostgreSQL Global Development Group + use strict; -use warnings; +use warnings FATAL => 'all'; use Getopt::Long; my $outdir_path = ''; diff --git a/src/backend/snowball/snowball_func.sql.in b/src/backend/snowball/snowball_func.sql.in index 0f4b3834490c4..de480ab9f91e6 100644 --- a/src/backend/snowball/snowball_func.sql.in +++ b/src/backend/snowball/snowball_func.sql.in @@ -1,7 +1,7 @@ /* * Create underlying C functions for Snowball stemmers * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * src/backend/snowball/snowball_func.sql.in * diff --git a/src/backend/statistics/dependencies.c b/src/backend/statistics/dependencies.c index edb2e5347d45f..8d01a93b30967 100644 --- a/src/backend/statistics/dependencies.c +++ b/src/backend/statistics/dependencies.c @@ -3,7 +3,7 @@ * dependencies.c * POSTGRES functional dependencies * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -14,8 +14,6 @@ #include "postgres.h" #include "access/htup_details.h" -#include "access/sysattr.h" -#include "catalog/pg_operator.h" #include "catalog/pg_statistic_ext.h" #include "catalog/pg_statistic_ext_data.h" #include "lib/stringinfo.h" @@ -27,7 +25,6 @@ #include "parser/parsetree.h" #include "statistics/extended_stats_internal.h" #include "statistics/statistics.h" -#include "utils/bytea.h" #include "utils/fmgroids.h" #include "utils/fmgrprotos.h" #include "utils/lsyscache.h" @@ -35,6 +32,7 @@ #include "utils/selfuncs.h" #include "utils/syscache.h" #include "utils/typcache.h" +#include "varatt.h" /* size of the struct header fields (magic, type, ndeps) */ #define SizeOfHeader (3 * sizeof(uint32)) @@ -796,7 +794,7 @@ dependency_is_compatible_clause(Node *clause, Index relid, AttrNumber *attnum) } else if (IsA(clause, ScalarArrayOpExpr)) { - /* If it's an scalar array operator, check for Var IN Const. */ + /* If it's a scalar array operator, check for Var IN Const. */ ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) clause; /* @@ -1224,7 +1222,7 @@ dependency_is_compatible_expression(Node *clause, Index relid, List *statlist, N } else if (IsA(clause, ScalarArrayOpExpr)) { - /* If it's an scalar array operator, check for Var IN Const. */ + /* If it's a scalar array operator, check for Var IN Const. */ ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) clause; /* diff --git a/src/backend/statistics/extended_stats.c b/src/backend/statistics/extended_stats.c index 28b52d8aa1f88..99fdf208dba1c 100644 --- a/src/backend/statistics/extended_stats.c +++ b/src/backend/statistics/extended_stats.c @@ -6,7 +6,7 @@ * Generic code supporting statistics objects created via CREATE STATISTICS. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -21,15 +21,13 @@ #include "access/htup_details.h" #include "access/table.h" #include "catalog/indexing.h" -#include "catalog/pg_collation.h" #include "catalog/pg_statistic_ext.h" #include "catalog/pg_statistic_ext_data.h" -#include "executor/executor.h" #include "commands/defrem.h" #include "commands/progress.h" +#include "executor/executor.h" #include "miscadmin.h" #include "nodes/nodeFuncs.h" -#include "optimizer/clauses.h" #include "optimizer/optimizer.h" #include "parser/parsetree.h" #include "pgstat.h" @@ -47,7 +45,6 @@ #include "utils/rel.h" #include "utils/selfuncs.h" #include "utils/syscache.h" -#include "utils/typcache.h" /* * To avoid consuming too much memory during analysis and/or too much space @@ -173,7 +170,7 @@ BuildRelationExtStatistics(Relation onerel, bool inh, double totalrows, natts, vacattrstats); if (!stats) { - if (!IsAutoVacuumWorkerProcess()) + if (!AmAutoVacuumWorkerProcess()) ereport(WARNING, (errcode(ERRCODE_INVALID_OBJECT_DEFINITION), errmsg("statistics object \"%s.%s\" could not be computed for relation \"%s.%s\"", @@ -366,8 +363,8 @@ statext_compute_stattarget(int stattarget, int nattrs, VacAttrStats **stats) for (i = 0; i < nattrs; i++) { /* keep the maximum statistics target */ - if (stats[i]->attr->attstattarget > stattarget) - stattarget = stats[i]->attr->attstattarget; + if (stats[i]->attstattarget > stattarget) + stattarget = stats[i]->attstattarget; } /* @@ -379,7 +376,7 @@ statext_compute_stattarget(int stattarget, int nattrs, VacAttrStats **stats) stattarget = default_statistics_target; /* As this point we should have a valid statistics target. */ - Assert((stattarget >= 0) && (stattarget <= 10000)); + Assert((stattarget >= 0) && (stattarget <= MAX_STATISTICS_TARGET)); return stattarget; } @@ -457,13 +454,15 @@ fetch_statentries_for_relation(Relation pg_statext, Oid relid) entry->statOid = staForm->oid; entry->schema = get_namespace_name(staForm->stxnamespace); entry->name = pstrdup(NameStr(staForm->stxname)); - entry->stattarget = staForm->stxstattarget; for (i = 0; i < staForm->stxkeys.dim1; i++) { entry->columns = bms_add_member(entry->columns, staForm->stxkeys.values[i]); } + datum = SysCacheGetAttr(STATEXTOID, htup, Anum_pg_statistic_ext_stxstattarget, &isnull); + entry->stattarget = isnull ? -1 : DatumGetInt16(datum); + /* decode the stxkind char array into a list of chars */ datum = SysCacheGetAttrNotNull(STATEXTOID, htup, Anum_pg_statistic_ext_stxkind); @@ -534,14 +533,10 @@ examine_attribute(Node *expr) bool ok; /* - * Create the VacAttrStats struct. Note that we only have a copy of the - * fixed fields of the pg_attribute tuple. + * Create the VacAttrStats struct. */ stats = (VacAttrStats *) palloc0(sizeof(VacAttrStats)); - - /* fake the attribute */ - stats->attr = (Form_pg_attribute) palloc0(ATTRIBUTE_FIXED_PART_SIZE); - stats->attr->attstattarget = -1; + stats->attstattarget = -1; /* * When analyzing an expression, believe the expression tree's type not @@ -595,7 +590,6 @@ examine_attribute(Node *expr) if (!ok || stats->compute_stats == NULL || stats->minrows <= 0) { heap_freetuple(typtuple); - pfree(stats->attr); pfree(stats); return NULL; } @@ -624,6 +618,13 @@ examine_expression(Node *expr, int stattarget) */ stats = (VacAttrStats *) palloc0(sizeof(VacAttrStats)); + /* + * We can't have statistics target specified for the expression, so we + * could use either the default_statistics_target, or the target computed + * for the extended statistics. The second option seems more reasonable. + */ + stats->attstattarget = stattarget; + /* * When analyzing an expression, believe the expression tree's type. */ @@ -638,25 +639,6 @@ examine_expression(Node *expr, int stattarget) */ stats->attrcollid = exprCollation(expr); - /* - * We don't have any pg_attribute for expressions, so let's fake something - * reasonable into attstattarget, which is the only thing std_typanalyze - * needs. - */ - stats->attr = (Form_pg_attribute) palloc(ATTRIBUTE_FIXED_PART_SIZE); - - /* - * We can't have statistics target specified for the expression, so we - * could use either the default_statistics_target, or the target computed - * for the extended statistics. The second option seems more reasonable. - */ - stats->attr->attstattarget = stattarget; - - /* initialize some basic fields */ - stats->attr->attrelid = InvalidOid; - stats->attr->attnum = InvalidAttrNumber; - stats->attr->atttypid = stats->attrtypid; - typtuple = SearchSysCacheCopy1(TYPEOID, ObjectIdGetDatum(stats->attrtypid)); if (!HeapTupleIsValid(typtuple)) @@ -747,12 +729,6 @@ lookup_var_attr_stats(Relation rel, Bitmapset *attrs, List *exprs, return NULL; } - /* - * Sanity check that the column is not dropped - stats should have - * been removed in this case. - */ - Assert(!stats[i]->attr->attisdropped); - i++; } @@ -2237,8 +2213,7 @@ compute_expr_stats(Relation onerel, double totalrows, if (tcnt > 0) { AttributeOpts *aopt = - get_attribute_options(stats->attr->attrelid, - stats->attr->attnum); + get_attribute_options(onerel->rd_id, stats->tupattnum); stats->exprvals = exprvals; stats->exprnulls = exprnulls; @@ -2261,7 +2236,7 @@ compute_expr_stats(Relation onerel, double totalrows, ExecDropSingleTupleTableSlot(slot); FreeExecutorState(estate); - MemoryContextResetAndDeleteChildren(expr_context); + MemoryContextReset(expr_context); } MemoryContextSwitchTo(old_context); @@ -2467,7 +2442,7 @@ statext_expressions_load(Oid stxoid, bool inh, int idx) if (isnull) elog(ERROR, "requested statistics kind \"%c\" is not yet built for statistics object %u", - STATS_EXT_DEPENDENCIES, stxoid); + STATS_EXT_EXPRESSIONS, stxoid); eah = DatumGetExpandedArray(value); diff --git a/src/backend/statistics/mcv.c b/src/backend/statistics/mcv.c index 03b9f04bb560c..b0e9aead84e97 100644 --- a/src/backend/statistics/mcv.c +++ b/src/backend/statistics/mcv.c @@ -4,7 +4,7 @@ * POSTGRES multivariate MCV lists * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -17,19 +17,15 @@ #include #include "access/htup_details.h" -#include "catalog/pg_collation.h" #include "catalog/pg_statistic_ext.h" #include "catalog/pg_statistic_ext_data.h" #include "fmgr.h" #include "funcapi.h" #include "nodes/nodeFuncs.h" -#include "optimizer/clauses.h" #include "statistics/extended_stats_internal.h" #include "statistics/statistics.h" #include "utils/array.h" #include "utils/builtins.h" -#include "utils/bytea.h" -#include "utils/fmgroids.h" #include "utils/fmgrprotos.h" #include "utils/lsyscache.h" #include "utils/selfuncs.h" @@ -576,7 +572,7 @@ statext_mcv_load(Oid mvoid, bool inh) if (isnull) elog(ERROR, "requested statistics kind \"%c\" is not yet built for statistics object %u", - STATS_EXT_DEPENDENCIES, mvoid); + STATS_EXT_MCV, mvoid); result = statext_mcv_deserialize(DatumGetByteaP(mcvlist)); diff --git a/src/backend/statistics/meson.build b/src/backend/statistics/meson.build index e12737b011eac..73b29a3d50aed 100644 --- a/src/backend/statistics/meson.build +++ b/src/backend/statistics/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'dependencies.c', diff --git a/src/backend/statistics/mvdistinct.c b/src/backend/statistics/mvdistinct.c index 6d25c14644a95..e8eb6a398fea3 100644 --- a/src/backend/statistics/mvdistinct.c +++ b/src/backend/statistics/mvdistinct.c @@ -13,7 +13,7 @@ * estimates are already available in pg_statistic. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -25,16 +25,15 @@ #include -#include "access/htup_details.h" #include "catalog/pg_statistic_ext.h" #include "catalog/pg_statistic_ext_data.h" #include "lib/stringinfo.h" #include "statistics/extended_stats_internal.h" #include "statistics/statistics.h" #include "utils/fmgrprotos.h" -#include "utils/lsyscache.h" #include "utils/syscache.h" #include "utils/typcache.h" +#include "varatt.h" static double ndistinct_for_combination(double totalrows, StatsBuildData *data, int k, int *combination); diff --git a/src/backend/storage/Makefile b/src/backend/storage/Makefile index 8376cdfca202b..eec03f6f2b4c5 100644 --- a/src/backend/storage/Makefile +++ b/src/backend/storage/Makefile @@ -8,6 +8,6 @@ subdir = src/backend/storage top_builddir = ../../.. include $(top_builddir)/src/Makefile.global -SUBDIRS = buffer file freespace ipc large_object lmgr page smgr sync +SUBDIRS = aio buffer file freespace ipc large_object lmgr page smgr sync include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/storage/aio/Makefile b/src/backend/storage/aio/Makefile new file mode 100644 index 0000000000000..2f29a9ec4d171 --- /dev/null +++ b/src/backend/storage/aio/Makefile @@ -0,0 +1,14 @@ +# +# Makefile for storage/aio +# +# src/backend/storage/aio/Makefile +# + +subdir = src/backend/storage/aio +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global + +OBJS = \ + read_stream.o + +include $(top_srcdir)/src/backend/common.mk diff --git a/src/backend/storage/aio/meson.build b/src/backend/storage/aio/meson.build new file mode 100644 index 0000000000000..10e1aa3b20b64 --- /dev/null +++ b/src/backend/storage/aio/meson.build @@ -0,0 +1,5 @@ +# Copyright (c) 2024, PostgreSQL Global Development Group + +backend_sources += files( + 'read_stream.c', +) diff --git a/src/backend/storage/aio/read_stream.c b/src/backend/storage/aio/read_stream.c new file mode 100644 index 0000000000000..da1753b6137d9 --- /dev/null +++ b/src/backend/storage/aio/read_stream.c @@ -0,0 +1,827 @@ +/*------------------------------------------------------------------------- + * + * read_stream.c + * Mechanism for accessing buffered relation data with look-ahead + * + * Code that needs to access relation data typically pins blocks one at a + * time, often in a predictable order that might be sequential or data-driven. + * Calling the simple ReadBuffer() function for each block is inefficient, + * because blocks that are not yet in the buffer pool require I/O operations + * that are small and might stall waiting for storage. This mechanism looks + * into the future and calls StartReadBuffers() and WaitReadBuffers() to read + * neighboring blocks together and ahead of time, with an adaptive look-ahead + * distance. + * + * A user-provided callback generates a stream of block numbers that is used + * to form reads of up to io_combine_limit, by attempting to merge them with a + * pending read. When that isn't possible, the existing pending read is sent + * to StartReadBuffers() so that a new one can begin to form. + * + * The algorithm for controlling the look-ahead distance tries to classify the + * stream into three ideal behaviors: + * + * A) No I/O is necessary, because the requested blocks are fully cached + * already. There is no benefit to looking ahead more than one block, so + * distance is 1. This is the default initial assumption. + * + * B) I/O is necessary, but fadvise is undesirable because the access is + * sequential, or impossible because direct I/O is enabled or the system + * doesn't support fadvise. There is no benefit in looking ahead more than + * io_combine_limit, because in this case the only goal is larger read system + * calls. Looking further ahead would pin many buffers and perform + * speculative work looking ahead for no benefit. + * + * C) I/O is necessary, it appears random, and this system supports fadvise. + * We'll look further ahead in order to reach the configured level of I/O + * concurrency. + * + * The distance increases rapidly and decays slowly, so that it moves towards + * those levels as different I/O patterns are discovered. For example, a + * sequential scan of fully cached data doesn't bother looking ahead, but a + * sequential scan that hits a region of uncached blocks will start issuing + * increasingly wide read calls until it plateaus at io_combine_limit. + * + * The main data structure is a circular queue of buffers of size + * max_pinned_buffers plus some extra space for technical reasons, ready to be + * returned by read_stream_next_buffer(). Each buffer also has an optional + * variable sized object that is passed from the callback to the consumer of + * buffers. + * + * Parallel to the queue of buffers, there is a circular queue of in-progress + * I/Os that have been started with StartReadBuffers(), and for which + * WaitReadBuffers() must be called before returning the buffer. + * + * For example, if the callback return block numbers 10, 42, 43, 60 in + * successive calls, then these data structures might appear as follows: + * + * buffers buf/data ios + * + * +----+ +-----+ +--------+ + * | | | | +----+ 42..44 | <- oldest_io_index + * +----+ +-----+ | +--------+ + * oldest_buffer_index -> | 10 | | ? | | +--+ 60..60 | + * +----+ +-----+ | | +--------+ + * | 42 | | ? |<-+ | | | <- next_io_index + * +----+ +-----+ | +--------+ + * | 43 | | ? | | | | + * +----+ +-----+ | +--------+ + * | 44 | | ? | | | | + * +----+ +-----+ | +--------+ + * | 60 | | ? |<---+ + * +----+ +-----+ + * next_buffer_index -> | | | | + * +----+ +-----+ + * + * In the example, 5 buffers are pinned, and the next buffer to be streamed to + * the client is block 10. Block 10 was a hit and has no associated I/O, but + * the range 42..44 requires an I/O wait before its buffers are returned, as + * does block 60. + * + * + * Portions Copyright (c) 2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/backend/storage/aio/read_stream.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "catalog/pg_tablespace.h" +#include "miscadmin.h" +#include "storage/fd.h" +#include "storage/smgr.h" +#include "storage/read_stream.h" +#include "utils/memdebug.h" +#include "utils/rel.h" +#include "utils/spccache.h" + +typedef struct InProgressIO +{ + int16 buffer_index; + ReadBuffersOperation op; +} InProgressIO; + +/* + * State for managing a stream of reads. + */ +struct ReadStream +{ + int16 max_ios; + int16 io_combine_limit; + int16 ios_in_progress; + int16 queue_size; + int16 max_pinned_buffers; + int16 pinned_buffers; + int16 distance; + bool advice_enabled; + + /* + * One-block buffer to support 'ungetting' a block number, to resolve flow + * control problems when I/Os are split. + */ + BlockNumber buffered_blocknum; + + /* + * The callback that will tell us which block numbers to read, and an + * opaque pointer that will be pass to it for its own purposes. + */ + ReadStreamBlockNumberCB callback; + void *callback_private_data; + + /* Next expected block, for detecting sequential access. */ + BlockNumber seq_blocknum; + + /* The read operation we are currently preparing. */ + BlockNumber pending_read_blocknum; + int16 pending_read_nblocks; + + /* Space for buffers and optional per-buffer private data. */ + size_t per_buffer_data_size; + void *per_buffer_data; + + /* Read operations that have been started but not waited for yet. */ + InProgressIO *ios; + int16 oldest_io_index; + int16 next_io_index; + + bool fast_path; + + /* Circular queue of buffers. */ + int16 oldest_buffer_index; /* Next pinned buffer to return */ + int16 next_buffer_index; /* Index of next buffer to pin */ + Buffer buffers[FLEXIBLE_ARRAY_MEMBER]; +}; + +/* + * Return a pointer to the per-buffer data by index. + */ +static inline void * +get_per_buffer_data(ReadStream *stream, int16 buffer_index) +{ + return (char *) stream->per_buffer_data + + stream->per_buffer_data_size * buffer_index; +} + +/* + * Ask the callback which block it would like us to read next, with a one block + * buffer in front to allow read_stream_unget_block() to work. + */ +static inline BlockNumber +read_stream_get_block(ReadStream *stream, void *per_buffer_data) +{ + BlockNumber blocknum; + + blocknum = stream->buffered_blocknum; + if (blocknum != InvalidBlockNumber) + stream->buffered_blocknum = InvalidBlockNumber; + else + { + /* + * Tell Valgrind that the per-buffer data is undefined. That replaces + * the "noaccess" state that was set when the consumer moved past this + * entry last time around the queue, and should also catch callbacks + * that fail to initialize data that the buffer consumer later + * accesses. On the first go around, it is undefined already. + */ + VALGRIND_MAKE_MEM_UNDEFINED(per_buffer_data, + stream->per_buffer_data_size); + blocknum = stream->callback(stream, + stream->callback_private_data, + per_buffer_data); + } + + return blocknum; +} + +/* + * In order to deal with short reads in StartReadBuffers(), we sometimes need + * to defer handling of a block until later. + */ +static inline void +read_stream_unget_block(ReadStream *stream, BlockNumber blocknum) +{ + /* We shouldn't ever unget more than one block. */ + Assert(stream->buffered_blocknum == InvalidBlockNumber); + Assert(blocknum != InvalidBlockNumber); + stream->buffered_blocknum = blocknum; +} + +static void +read_stream_start_pending_read(ReadStream *stream, bool suppress_advice) +{ + bool need_wait; + int nblocks; + int flags; + int16 io_index; + int16 overflow; + int16 buffer_index; + + /* This should only be called with a pending read. */ + Assert(stream->pending_read_nblocks > 0); + Assert(stream->pending_read_nblocks <= stream->io_combine_limit); + + /* We had better not exceed the pin limit by starting this read. */ + Assert(stream->pinned_buffers + stream->pending_read_nblocks <= + stream->max_pinned_buffers); + + /* We had better not be overwriting an existing pinned buffer. */ + if (stream->pinned_buffers > 0) + Assert(stream->next_buffer_index != stream->oldest_buffer_index); + else + Assert(stream->next_buffer_index == stream->oldest_buffer_index); + + /* + * If advice hasn't been suppressed, this system supports it, and this + * isn't a strictly sequential pattern, then we'll issue advice. + */ + if (!suppress_advice && + stream->advice_enabled && + stream->pending_read_blocknum != stream->seq_blocknum) + flags = READ_BUFFERS_ISSUE_ADVICE; + else + flags = 0; + + /* We say how many blocks we want to read, but may be smaller on return. */ + buffer_index = stream->next_buffer_index; + io_index = stream->next_io_index; + nblocks = stream->pending_read_nblocks; + need_wait = StartReadBuffers(&stream->ios[io_index].op, + &stream->buffers[buffer_index], + stream->pending_read_blocknum, + &nblocks, + flags); + stream->pinned_buffers += nblocks; + + /* Remember whether we need to wait before returning this buffer. */ + if (!need_wait) + { + /* Look-ahead distance decays, no I/O necessary (behavior A). */ + if (stream->distance > 1) + stream->distance--; + } + else + { + /* + * Remember to call WaitReadBuffers() before returning head buffer. + * Look-ahead distance will be adjusted after waiting. + */ + stream->ios[io_index].buffer_index = buffer_index; + if (++stream->next_io_index == stream->max_ios) + stream->next_io_index = 0; + Assert(stream->ios_in_progress < stream->max_ios); + stream->ios_in_progress++; + stream->seq_blocknum = stream->pending_read_blocknum + nblocks; + } + + /* + * We gave a contiguous range of buffer space to StartReadBuffers(), but + * we want it to wrap around at queue_size. Slide overflowing buffers to + * the front of the array. + */ + overflow = (buffer_index + nblocks) - stream->queue_size; + if (overflow > 0) + memmove(&stream->buffers[0], + &stream->buffers[stream->queue_size], + sizeof(stream->buffers[0]) * overflow); + + /* Compute location of start of next read, without using % operator. */ + buffer_index += nblocks; + if (buffer_index >= stream->queue_size) + buffer_index -= stream->queue_size; + Assert(buffer_index >= 0 && buffer_index < stream->queue_size); + stream->next_buffer_index = buffer_index; + + /* Adjust the pending read to cover the remaining portion, if any. */ + stream->pending_read_blocknum += nblocks; + stream->pending_read_nblocks -= nblocks; +} + +static void +read_stream_look_ahead(ReadStream *stream, bool suppress_advice) +{ + while (stream->ios_in_progress < stream->max_ios && + stream->pinned_buffers + stream->pending_read_nblocks < stream->distance) + { + BlockNumber blocknum; + int16 buffer_index; + void *per_buffer_data; + + if (stream->pending_read_nblocks == stream->io_combine_limit) + { + read_stream_start_pending_read(stream, suppress_advice); + suppress_advice = false; + continue; + } + + /* + * See which block the callback wants next in the stream. We need to + * compute the index of the Nth block of the pending read including + * wrap-around, but we don't want to use the expensive % operator. + */ + buffer_index = stream->next_buffer_index + stream->pending_read_nblocks; + if (buffer_index >= stream->queue_size) + buffer_index -= stream->queue_size; + Assert(buffer_index >= 0 && buffer_index < stream->queue_size); + per_buffer_data = get_per_buffer_data(stream, buffer_index); + blocknum = read_stream_get_block(stream, per_buffer_data); + if (blocknum == InvalidBlockNumber) + { + /* End of stream. */ + stream->distance = 0; + break; + } + + /* Can we merge it with the pending read? */ + if (stream->pending_read_nblocks > 0 && + stream->pending_read_blocknum + stream->pending_read_nblocks == blocknum) + { + stream->pending_read_nblocks++; + continue; + } + + /* We have to start the pending read before we can build another. */ + while (stream->pending_read_nblocks > 0) + { + read_stream_start_pending_read(stream, suppress_advice); + suppress_advice = false; + if (stream->ios_in_progress == stream->max_ios) + { + /* And we've hit the limit. Rewind, and stop here. */ + read_stream_unget_block(stream, blocknum); + return; + } + } + + /* This is the start of a new pending read. */ + stream->pending_read_blocknum = blocknum; + stream->pending_read_nblocks = 1; + } + + /* + * We don't start the pending read just because we've hit the distance + * limit, preferring to give it another chance to grow to full + * io_combine_limit size once more buffers have been consumed. However, + * if we've already reached io_combine_limit, or we've reached the + * distance limit and there isn't anything pinned yet, or the callback has + * signaled end-of-stream, we start the read immediately. + */ + if (stream->pending_read_nblocks > 0 && + (stream->pending_read_nblocks == stream->io_combine_limit || + (stream->pending_read_nblocks == stream->distance && + stream->pinned_buffers == 0) || + stream->distance == 0) && + stream->ios_in_progress < stream->max_ios) + read_stream_start_pending_read(stream, suppress_advice); +} + +/* + * Create a new read stream object that can be used to perform the equivalent + * of a series of ReadBuffer() calls for one fork of one relation. + * Internally, it generates larger vectored reads where possible by looking + * ahead. The callback should return block numbers or InvalidBlockNumber to + * signal end-of-stream, and if per_buffer_data_size is non-zero, it may also + * write extra data for each block into the space provided to it. It will + * also receive callback_private_data for its own purposes. + */ +ReadStream * +read_stream_begin_relation(int flags, + BufferAccessStrategy strategy, + Relation rel, + ForkNumber forknum, + ReadStreamBlockNumberCB callback, + void *callback_private_data, + size_t per_buffer_data_size) +{ + ReadStream *stream; + size_t size; + int16 queue_size; + int16 queue_overflow; + int max_ios; + int strategy_pin_limit; + uint32 max_pinned_buffers; + Oid tablespace_id; + SMgrRelation smgr; + + smgr = RelationGetSmgr(rel); + + /* + * Decide how many I/Os we will allow to run at the same time. That + * currently means advice to the kernel to tell it that we will soon read. + * This number also affects how far we look ahead for opportunities to + * start more I/Os. + */ + tablespace_id = smgr->smgr_rlocator.locator.spcOid; + if (!OidIsValid(MyDatabaseId) || + IsCatalogRelation(rel) || + IsCatalogRelationOid(smgr->smgr_rlocator.locator.relNumber)) + { + /* + * Avoid circularity while trying to look up tablespace settings or + * before spccache.c is ready. + */ + max_ios = effective_io_concurrency; + } + else if (flags & READ_STREAM_MAINTENANCE) + max_ios = get_tablespace_maintenance_io_concurrency(tablespace_id); + else + max_ios = get_tablespace_io_concurrency(tablespace_id); + + /* Cap to INT16_MAX to avoid overflowing below */ + max_ios = Min(max_ios, PG_INT16_MAX); + + /* + * If starting a multi-block I/O near the end of the queue, we might + * temporarily need extra space for overflowing buffers before they are + * moved to regular circular position. This is the maximum extra space we + * could need. + */ + queue_overflow = io_combine_limit - 1; + + /* + * Choose the maximum number of buffers we're prepared to pin. We try to + * pin fewer if we can, though. We clamp it to at least io_combine_limit + * so that we can have a chance to build up a full io_combine_limit sized + * read, even when max_ios is zero. Be careful not to allow int16 to + * overflow (even though that's not possible with the current GUC range + * limits), allowing also for the spare entry and the overflow space. + */ + max_pinned_buffers = Max(max_ios * 4, io_combine_limit); + max_pinned_buffers = Min(max_pinned_buffers, + PG_INT16_MAX - queue_overflow - 1); + + /* Give the strategy a chance to limit the number of buffers we pin. */ + strategy_pin_limit = GetAccessStrategyPinLimit(strategy); + max_pinned_buffers = Min(strategy_pin_limit, max_pinned_buffers); + + /* Don't allow this backend to pin more than its share of buffers. */ + if (SmgrIsTemp(smgr)) + LimitAdditionalLocalPins(&max_pinned_buffers); + else + LimitAdditionalPins(&max_pinned_buffers); + Assert(max_pinned_buffers > 0); + + /* + * We need one extra entry for buffers and per-buffer data, because users + * of per-buffer data have access to the object until the next call to + * read_stream_next_buffer(), so we need a gap between the head and tail + * of the queue so that we don't clobber it. + */ + queue_size = max_pinned_buffers + 1; + + /* + * Allocate the object, the buffers, the ios and per_data_data space in + * one big chunk. Though we have queue_size buffers, we want to be able + * to assume that all the buffers for a single read are contiguous (i.e. + * don't wrap around halfway through), so we allow temporary overflows of + * up to the maximum possible overflow size. + */ + size = offsetof(ReadStream, buffers); + size += sizeof(Buffer) * (queue_size + queue_overflow); + size += sizeof(InProgressIO) * Max(1, max_ios); + size += per_buffer_data_size * queue_size; + size += MAXIMUM_ALIGNOF * 2; + stream = (ReadStream *) palloc(size); + memset(stream, 0, offsetof(ReadStream, buffers)); + stream->ios = (InProgressIO *) + MAXALIGN(&stream->buffers[queue_size + queue_overflow]); + if (per_buffer_data_size > 0) + stream->per_buffer_data = (void *) + MAXALIGN(&stream->ios[Max(1, max_ios)]); + +#ifdef USE_PREFETCH + + /* + * This system supports prefetching advice. We can use it as long as + * direct I/O isn't enabled, the caller hasn't promised sequential access + * (overriding our detection heuristics), and max_ios hasn't been set to + * zero. + */ + if ((io_direct_flags & IO_DIRECT_DATA) == 0 && + (flags & READ_STREAM_SEQUENTIAL) == 0 && + max_ios > 0) + stream->advice_enabled = true; +#endif + + /* + * For now, max_ios = 0 is interpreted as max_ios = 1 with advice disabled + * above. If we had real asynchronous I/O we might need a slightly + * different definition. + */ + if (max_ios == 0) + max_ios = 1; + + /* + * Capture stable values for these two GUC-derived numbers for the + * lifetime of this stream, so we don't have to worry about the GUCs + * changing underneath us beyond this point. + */ + stream->max_ios = max_ios; + stream->io_combine_limit = io_combine_limit; + + stream->per_buffer_data_size = per_buffer_data_size; + stream->max_pinned_buffers = max_pinned_buffers; + stream->queue_size = queue_size; + stream->callback = callback; + stream->callback_private_data = callback_private_data; + stream->buffered_blocknum = InvalidBlockNumber; + + /* + * Skip the initial ramp-up phase if the caller says we're going to be + * reading the whole relation. This way we start out assuming we'll be + * doing full io_combine_limit sized reads (behavior B). + */ + if (flags & READ_STREAM_FULL) + stream->distance = Min(max_pinned_buffers, stream->io_combine_limit); + else + stream->distance = 1; + + /* + * Since we always access the same relation, we can initialize parts of + * the ReadBuffersOperation objects and leave them that way, to avoid + * wasting CPU cycles writing to them for each read. + */ + for (int i = 0; i < max_ios; ++i) + { + stream->ios[i].op.rel = rel; + stream->ios[i].op.smgr = RelationGetSmgr(rel); + stream->ios[i].op.smgr_persistence = 0; + stream->ios[i].op.forknum = forknum; + stream->ios[i].op.strategy = strategy; + } + + return stream; +} + +/* + * Pull one pinned buffer out of a stream. Each call returns successive + * blocks in the order specified by the callback. If per_buffer_data_size was + * set to a non-zero size, *per_buffer_data receives a pointer to the extra + * per-buffer data that the callback had a chance to populate, which remains + * valid until the next call to read_stream_next_buffer(). When the stream + * runs out of data, InvalidBuffer is returned. The caller may decide to end + * the stream early at any time by calling read_stream_end(). + */ +Buffer +read_stream_next_buffer(ReadStream *stream, void **per_buffer_data) +{ + Buffer buffer; + int16 oldest_buffer_index; + +#ifndef READ_STREAM_DISABLE_FAST_PATH + + /* + * A fast path for all-cached scans (behavior A). This is the same as the + * usual algorithm, but it is specialized for no I/O and no per-buffer + * data, so we can skip the queue management code, stay in the same buffer + * slot and use singular StartReadBuffer(). + */ + if (likely(stream->fast_path)) + { + BlockNumber next_blocknum; + + /* Fast path assumptions. */ + Assert(stream->ios_in_progress == 0); + Assert(stream->pinned_buffers == 1); + Assert(stream->distance == 1); + Assert(stream->pending_read_nblocks == 0); + Assert(stream->per_buffer_data_size == 0); + + /* We're going to return the buffer we pinned last time. */ + oldest_buffer_index = stream->oldest_buffer_index; + Assert((oldest_buffer_index + 1) % stream->queue_size == + stream->next_buffer_index); + buffer = stream->buffers[oldest_buffer_index]; + Assert(buffer != InvalidBuffer); + + /* Choose the next block to pin. */ + next_blocknum = read_stream_get_block(stream, NULL); + + if (likely(next_blocknum != InvalidBlockNumber)) + { + /* + * Pin a buffer for the next call. Same buffer entry, and + * arbitrary I/O entry (they're all free). We don't have to + * adjust pinned_buffers because we're transferring one to caller + * but pinning one more. + */ + if (likely(!StartReadBuffer(&stream->ios[0].op, + &stream->buffers[oldest_buffer_index], + next_blocknum, + stream->advice_enabled ? + READ_BUFFERS_ISSUE_ADVICE : 0))) + { + /* Fast return. */ + return buffer; + } + + /* Next call must wait for I/O for the newly pinned buffer. */ + stream->oldest_io_index = 0; + stream->next_io_index = stream->max_ios > 1 ? 1 : 0; + stream->ios_in_progress = 1; + stream->ios[0].buffer_index = oldest_buffer_index; + stream->seq_blocknum = next_blocknum + 1; + } + else + { + /* No more blocks, end of stream. */ + stream->distance = 0; + stream->oldest_buffer_index = stream->next_buffer_index; + stream->pinned_buffers = 0; + } + + stream->fast_path = false; + return buffer; + } +#endif + + if (unlikely(stream->pinned_buffers == 0)) + { + Assert(stream->oldest_buffer_index == stream->next_buffer_index); + + /* End of stream reached? */ + if (stream->distance == 0) + return InvalidBuffer; + + /* + * The usual order of operations is that we look ahead at the bottom + * of this function after potentially finishing an I/O and making + * space for more, but if we're just starting up we'll need to crank + * the handle to get started. + */ + read_stream_look_ahead(stream, true); + + /* End of stream reached? */ + if (stream->pinned_buffers == 0) + { + Assert(stream->distance == 0); + return InvalidBuffer; + } + } + + /* Grab the oldest pinned buffer and associated per-buffer data. */ + Assert(stream->pinned_buffers > 0); + oldest_buffer_index = stream->oldest_buffer_index; + Assert(oldest_buffer_index >= 0 && + oldest_buffer_index < stream->queue_size); + buffer = stream->buffers[oldest_buffer_index]; + if (per_buffer_data) + *per_buffer_data = get_per_buffer_data(stream, oldest_buffer_index); + + Assert(BufferIsValid(buffer)); + + /* Do we have to wait for an associated I/O first? */ + if (stream->ios_in_progress > 0 && + stream->ios[stream->oldest_io_index].buffer_index == oldest_buffer_index) + { + int16 io_index = stream->oldest_io_index; + int16 distance; + + /* Sanity check that we still agree on the buffers. */ + Assert(stream->ios[io_index].op.buffers == + &stream->buffers[oldest_buffer_index]); + + WaitReadBuffers(&stream->ios[io_index].op); + + Assert(stream->ios_in_progress > 0); + stream->ios_in_progress--; + if (++stream->oldest_io_index == stream->max_ios) + stream->oldest_io_index = 0; + + if (stream->ios[io_index].op.flags & READ_BUFFERS_ISSUE_ADVICE) + { + /* Distance ramps up fast (behavior C). */ + distance = stream->distance * 2; + distance = Min(distance, stream->max_pinned_buffers); + stream->distance = distance; + } + else + { + /* No advice; move towards io_combine_limit (behavior B). */ + if (stream->distance > stream->io_combine_limit) + { + stream->distance--; + } + else + { + distance = stream->distance * 2; + distance = Min(distance, stream->io_combine_limit); + distance = Min(distance, stream->max_pinned_buffers); + stream->distance = distance; + } + } + } + +#ifdef CLOBBER_FREED_MEMORY + /* Clobber old buffer for debugging purposes. */ + stream->buffers[oldest_buffer_index] = InvalidBuffer; +#endif + +#if defined(CLOBBER_FREED_MEMORY) || defined(USE_VALGRIND) + + /* + * The caller will get access to the per-buffer data, until the next call. + * We wipe the one before, which is never occupied because queue_size + * allowed one extra element. This will hopefully trip up client code + * that is holding a dangling pointer to it. + */ + if (stream->per_buffer_data) + { + void *per_buffer_data; + + per_buffer_data = get_per_buffer_data(stream, + oldest_buffer_index == 0 ? + stream->queue_size - 1 : + oldest_buffer_index - 1); + +#if defined(CLOBBER_FREED_MEMORY) + /* This also tells Valgrind the memory is "noaccess". */ + wipe_mem(per_buffer_data, stream->per_buffer_data_size); +#elif defined(USE_VALGRIND) + /* Tell it ourselves. */ + VALGRIND_MAKE_MEM_NOACCESS(per_buffer_data, + stream->per_buffer_data_size); +#endif + } +#endif + + /* Pin transferred to caller. */ + Assert(stream->pinned_buffers > 0); + stream->pinned_buffers--; + + /* Advance oldest buffer, with wrap-around. */ + stream->oldest_buffer_index++; + if (stream->oldest_buffer_index == stream->queue_size) + stream->oldest_buffer_index = 0; + + /* Prepare for the next call. */ + read_stream_look_ahead(stream, false); + +#ifndef READ_STREAM_DISABLE_FAST_PATH + /* See if we can take the fast path for all-cached scans next time. */ + if (stream->ios_in_progress == 0 && + stream->pinned_buffers == 1 && + stream->distance == 1 && + stream->pending_read_nblocks == 0 && + stream->per_buffer_data_size == 0) + { + stream->fast_path = true; + } +#endif + + return buffer; +} + +/* + * Transitional support for code that would like to perform or skip reads + * itself, without using the stream. Returns, and consumes, the next block + * number that would be read by the stream's look-ahead algorithm, or + * InvalidBlockNumber if the end of the stream is reached. Also reports the + * strategy that would be used to read it. + */ +BlockNumber +read_stream_next_block(ReadStream *stream, BufferAccessStrategy *strategy) +{ + *strategy = stream->ios[0].op.strategy; + return read_stream_get_block(stream, NULL); +} + +/* + * Reset a read stream by releasing any queued up buffers, allowing the stream + * to be used again for different blocks. This can be used to clear an + * end-of-stream condition and start again, or to throw away blocks that were + * speculatively read and read some different blocks instead. + */ +void +read_stream_reset(ReadStream *stream) +{ + Buffer buffer; + + /* Stop looking ahead. */ + stream->distance = 0; + + /* Forget buffered block number and fast path state. */ + stream->buffered_blocknum = InvalidBlockNumber; + stream->fast_path = false; + + /* Unpin anything that wasn't consumed. */ + while ((buffer = read_stream_next_buffer(stream, NULL)) != InvalidBuffer) + ReleaseBuffer(buffer); + + Assert(stream->pinned_buffers == 0); + Assert(stream->ios_in_progress == 0); + + /* Start off assuming data is cached. */ + stream->distance = 1; +} + +/* + * Release and free a read stream. + */ +void +read_stream_end(ReadStream *stream) +{ + read_stream_reset(stream); + pfree(stream); +} diff --git a/src/backend/storage/buffer/buf_init.c b/src/backend/storage/buffer/buf_init.c index 0057443f0c63b..46116a1f64be1 100644 --- a/src/backend/storage/buffer/buf_init.c +++ b/src/backend/storage/buffer/buf_init.c @@ -3,7 +3,7 @@ * buf_init.c * buffer manager initialization routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -122,7 +122,7 @@ InitBufferPool(void) ClearBufferTag(&buf->tag); pg_atomic_init_u32(&buf->state, 0); - buf->wait_backend_pgprocno = INVALID_PGPROCNO; + buf->wait_backend_pgprocno = INVALID_PROC_NUMBER; buf->buf_id = i; diff --git a/src/backend/storage/buffer/buf_table.c b/src/backend/storage/buffer/buf_table.c index 2b96639a5a5a5..0fa54689303a9 100644 --- a/src/backend/storage/buffer/buf_table.c +++ b/src/backend/storage/buffer/buf_table.c @@ -10,7 +10,7 @@ * before the lock is released (see notes in README). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,7 +22,6 @@ #include "postgres.h" #include "storage/buf_internals.h" -#include "storage/bufmgr.h" /* entry for buffer lookup hashtable */ typedef struct diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 3c59bbd04ea70..f8d30bf71e1a8 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -3,7 +3,7 @@ * bufmgr.c * buffer manager interface routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,6 +19,10 @@ * and pin it so that no one can destroy it while this process * is using it. * + * StartReadBuffer() -- as above, with separate wait step + * StartReadBuffers() -- multiple block version + * WaitReadBuffers() -- second step of above + * * ReleaseBuffer() -- unpin a buffer * * MarkBufferDirty() -- mark a pinned buffer's contents as "dirty". @@ -36,7 +40,6 @@ #include "access/tableam.h" #include "access/xloginsert.h" #include "access/xlogutils.h" -#include "catalog/catalog.h" #include "catalog/storage.h" #include "catalog/storage_xlog.h" #include "executor/instrument.h" @@ -47,6 +50,7 @@ #include "postmaster/bgwriter.h" #include "storage/buf_internals.h" #include "storage/bufmgr.h" +#include "storage/fd.h" #include "storage/ipc.h" #include "storage/lmgr.h" #include "storage/proc.h" @@ -55,7 +59,7 @@ #include "utils/memdebug.h" #include "utils/ps_status.h" #include "utils/rel.h" -#include "utils/resowner_private.h" +#include "utils/resowner.h" #include "utils/timestamp.h" @@ -152,6 +156,13 @@ int effective_io_concurrency = DEFAULT_EFFECTIVE_IO_CONCURRENCY; */ int maintenance_io_concurrency = DEFAULT_MAINTENANCE_IO_CONCURRENCY; +/* + * Limit on how many blocks should be handled in single I/O operations. + * StartReadBuffers() callers should respect it, as should other operations + * that call smgr APIs directly. + */ +int io_combine_limit = DEFAULT_IO_COMBINE_LIMIT; + /* * GUC variables about triggering kernel writeback for buffers written; OS * dependent defaults are set via the GUC mechanism. @@ -205,6 +216,30 @@ static PrivateRefCountEntry *GetPrivateRefCountEntry(Buffer buffer, bool do_move static inline int32 GetPrivateRefCount(Buffer buffer); static void ForgetPrivateRefCountEntry(PrivateRefCountEntry *ref); +/* ResourceOwner callbacks to hold in-progress I/Os and buffer pins */ +static void ResOwnerReleaseBufferIO(Datum res); +static char *ResOwnerPrintBufferIO(Datum res); +static void ResOwnerReleaseBufferPin(Datum res); +static char *ResOwnerPrintBufferPin(Datum res); + +const ResourceOwnerDesc buffer_io_resowner_desc = +{ + .name = "buffer io", + .release_phase = RESOURCE_RELEASE_BEFORE_LOCKS, + .release_priority = RELEASE_PRIO_BUFFER_IOS, + .ReleaseResource = ResOwnerReleaseBufferIO, + .DebugPrint = ResOwnerPrintBufferIO +}; + +const ResourceOwnerDesc buffer_pin_resowner_desc = +{ + .name = "buffer pin", + .release_phase = RESOURCE_RELEASE_BEFORE_LOCKS, + .release_priority = RELEASE_PRIO_BUFFER_PINS, + .ReleaseResource = ResOwnerReleaseBufferPin, + .DebugPrint = ResOwnerPrintBufferPin +}; + /* * Ensure that the PrivateRefCountArray has sufficient space to store one more * entry. This has to be called before using NewPrivateRefCountEntry() to fill @@ -447,11 +482,11 @@ ForgetPrivateRefCountEntry(PrivateRefCountEntry *ref) ) -static Buffer ReadBuffer_common(SMgrRelation smgr, char relpersistence, +static Buffer ReadBuffer_common(Relation rel, + SMgrRelation smgr, char smgr_persistence, ForkNumber forkNum, BlockNumber blockNum, - ReadBufferMode mode, BufferAccessStrategy strategy, - bool *hit); -static BlockNumber ExtendBufferedRelCommon(ExtendBufferedWhat eb, + ReadBufferMode mode, BufferAccessStrategy strategy); +static BlockNumber ExtendBufferedRelCommon(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, @@ -459,7 +494,7 @@ static BlockNumber ExtendBufferedRelCommon(ExtendBufferedWhat eb, BlockNumber extend_upto, Buffer *buffers, uint32 *extended_by); -static BlockNumber ExtendBufferedRelShared(ExtendBufferedWhat eb, +static BlockNumber ExtendBufferedRelShared(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, @@ -470,22 +505,24 @@ static BlockNumber ExtendBufferedRelShared(ExtendBufferedWhat eb, static bool PinBuffer(BufferDesc *buf, BufferAccessStrategy strategy); static void PinBuffer_Locked(BufferDesc *buf); static void UnpinBuffer(BufferDesc *buf); +static void UnpinBufferNoOwner(BufferDesc *buf); static void BufferSync(int flags); static uint32 WaitBufHdrUnlocked(BufferDesc *buf); static int SyncOneBuffer(int buf_id, bool skip_recently_used, WritebackContext *wb_context); static void WaitIO(BufferDesc *buf); -static bool StartBufferIO(BufferDesc *buf, bool forInput); +static bool StartBufferIO(BufferDesc *buf, bool forInput, bool nowait); static void TerminateBufferIO(BufferDesc *buf, bool clear_dirty, - uint32 set_flag_bits); + uint32 set_flag_bits, bool forget_owner); +static void AbortBufferIO(Buffer buffer); static void shared_buffer_write_error_callback(void *arg); static void local_buffer_write_error_callback(void *arg); -static BufferDesc *BufferAlloc(SMgrRelation smgr, - char relpersistence, - ForkNumber forkNum, - BlockNumber blockNum, - BufferAccessStrategy strategy, - bool *foundPtr, IOContext io_context); +static inline BufferDesc *BufferAlloc(SMgrRelation smgr, + char relpersistence, + ForkNumber forkNum, + BlockNumber blockNum, + BufferAccessStrategy strategy, + bool *foundPtr, IOContext io_context); static Buffer GetVictimBuffer(BufferAccessStrategy strategy, IOContext io_context); static void FlushBuffer(BufferDesc *buf, SMgrRelation reln, IOObject io_object, IOContext io_context); @@ -542,7 +579,7 @@ PrefetchSharedBuffer(SMgrRelation smgr_reln, * recovery if the relation file doesn't exist. */ if ((io_direct_flags & IO_DIRECT_DATA) == 0 && - smgrprefetch(smgr_reln, forkNum, blockNum)) + smgrprefetch(smgr_reln, forkNum, blockNum, 1)) { result.initiated_io = true; } @@ -639,7 +676,7 @@ ReadRecentBuffer(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber blockN Assert(BufferIsValid(recent_buffer)); - ResourceOwnerEnlargeBuffers(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); ReservePrivateRefCountEntry(); InitBufferTag(&tag, &rlocator, forkNum, blockNum); @@ -751,11 +788,10 @@ ReadBuffer(Relation reln, BlockNumber blockNum) * If strategy is not NULL, a nondefault buffer access strategy is used. * See buffer/README for details. */ -Buffer +inline Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy) { - bool hit; Buffer buf; /* @@ -772,11 +808,9 @@ ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, * Read the buffer, and update pgstat counters to reflect a cache hit or * miss. */ - pgstat_count_buffer_read(reln); - buf = ReadBuffer_common(RelationGetSmgr(reln), reln->rd_rel->relpersistence, - forkNum, blockNum, mode, strategy, &hit); - if (hit) - pgstat_count_buffer_hit(reln); + buf = ReadBuffer_common(reln, RelationGetSmgr(reln), 0, + forkNum, blockNum, mode, strategy); + return buf; } @@ -789,27 +823,26 @@ ReadBufferExtended(Relation reln, ForkNumber forkNum, BlockNumber blockNum, * permanent = false for a RELPERSISTENCE_UNLOGGED relation. This function * cannot be used for temporary relations (and making that work might be * difficult, unless we only want to read temporary relations for our own - * BackendId). + * ProcNumber). */ Buffer ReadBufferWithoutRelcache(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy, bool permanent) { - bool hit; + SMgrRelation smgr = smgropen(rlocator, INVALID_PROC_NUMBER); - SMgrRelation smgr = smgropen(rlocator, InvalidBackendId); - - return ReadBuffer_common(smgr, permanent ? RELPERSISTENCE_PERMANENT : - RELPERSISTENCE_UNLOGGED, forkNum, blockNum, - mode, strategy, &hit); + return ReadBuffer_common(NULL, smgr, + permanent ? RELPERSISTENCE_PERMANENT : RELPERSISTENCE_UNLOGGED, + forkNum, blockNum, + mode, strategy); } /* * Convenience wrapper around ExtendBufferedRelBy() extending by one block. */ Buffer -ExtendBufferedRel(ExtendBufferedWhat eb, +ExtendBufferedRel(BufferManagerRelation bmr, ForkNumber forkNum, BufferAccessStrategy strategy, uint32 flags) @@ -817,7 +850,7 @@ ExtendBufferedRel(ExtendBufferedWhat eb, Buffer buf; uint32 extend_by = 1; - ExtendBufferedRelBy(eb, forkNum, strategy, flags, extend_by, + ExtendBufferedRelBy(bmr, forkNum, strategy, flags, extend_by, &buf, &extend_by); return buf; @@ -841,7 +874,7 @@ ExtendBufferedRel(ExtendBufferedWhat eb, * be empty. */ BlockNumber -ExtendBufferedRelBy(ExtendBufferedWhat eb, +ExtendBufferedRelBy(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, @@ -849,17 +882,17 @@ ExtendBufferedRelBy(ExtendBufferedWhat eb, Buffer *buffers, uint32 *extended_by) { - Assert((eb.rel != NULL) != (eb.smgr != NULL)); - Assert(eb.smgr == NULL || eb.relpersistence != 0); + Assert((bmr.rel != NULL) != (bmr.smgr != NULL)); + Assert(bmr.smgr == NULL || bmr.relpersistence != 0); Assert(extend_by > 0); - if (eb.smgr == NULL) + if (bmr.smgr == NULL) { - eb.smgr = RelationGetSmgr(eb.rel); - eb.relpersistence = eb.rel->rd_rel->relpersistence; + bmr.smgr = RelationGetSmgr(bmr.rel); + bmr.relpersistence = bmr.rel->rd_rel->relpersistence; } - return ExtendBufferedRelCommon(eb, fork, strategy, flags, + return ExtendBufferedRelCommon(bmr, fork, strategy, flags, extend_by, InvalidBlockNumber, buffers, extended_by); } @@ -873,7 +906,7 @@ ExtendBufferedRelBy(ExtendBufferedWhat eb, * crash recovery). */ Buffer -ExtendBufferedRelTo(ExtendBufferedWhat eb, +ExtendBufferedRelTo(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, @@ -885,14 +918,14 @@ ExtendBufferedRelTo(ExtendBufferedWhat eb, Buffer buffer = InvalidBuffer; Buffer buffers[64]; - Assert((eb.rel != NULL) != (eb.smgr != NULL)); - Assert(eb.smgr == NULL || eb.relpersistence != 0); + Assert((bmr.rel != NULL) != (bmr.smgr != NULL)); + Assert(bmr.smgr == NULL || bmr.relpersistence != 0); Assert(extend_to != InvalidBlockNumber && extend_to > 0); - if (eb.smgr == NULL) + if (bmr.smgr == NULL) { - eb.smgr = RelationGetSmgr(eb.rel); - eb.relpersistence = eb.rel->rd_rel->relpersistence; + bmr.smgr = RelationGetSmgr(bmr.rel); + bmr.relpersistence = bmr.rel->rd_rel->relpersistence; } /* @@ -901,21 +934,17 @@ ExtendBufferedRelTo(ExtendBufferedWhat eb, * an smgrexists call. */ if ((flags & EB_CREATE_FORK_IF_NEEDED) && - (eb.smgr->smgr_cached_nblocks[fork] == 0 || - eb.smgr->smgr_cached_nblocks[fork] == InvalidBlockNumber) && - !smgrexists(eb.smgr, fork)) + (bmr.smgr->smgr_cached_nblocks[fork] == 0 || + bmr.smgr->smgr_cached_nblocks[fork] == InvalidBlockNumber) && + !smgrexists(bmr.smgr, fork)) { - LockRelationForExtension(eb.rel, ExclusiveLock); - - /* could have been closed while waiting for lock */ - if (eb.rel) - eb.smgr = RelationGetSmgr(eb.rel); + LockRelationForExtension(bmr.rel, ExclusiveLock); /* recheck, fork might have been created concurrently */ - if (!smgrexists(eb.smgr, fork)) - smgrcreate(eb.smgr, fork, flags & EB_PERFORMING_RECOVERY); + if (!smgrexists(bmr.smgr, fork)) + smgrcreate(bmr.smgr, fork, flags & EB_PERFORMING_RECOVERY); - UnlockRelationForExtension(eb.rel, ExclusiveLock); + UnlockRelationForExtension(bmr.rel, ExclusiveLock); } /* @@ -923,13 +952,13 @@ ExtendBufferedRelTo(ExtendBufferedWhat eb, * kernel. */ if (flags & EB_CLEAR_SIZE_CACHE) - eb.smgr->smgr_cached_nblocks[fork] = InvalidBlockNumber; + bmr.smgr->smgr_cached_nblocks[fork] = InvalidBlockNumber; /* * Estimate how many pages we'll need to extend by. This avoids acquiring * unnecessarily many victim buffers. */ - current_size = smgrnblocks(eb.smgr, fork); + current_size = smgrnblocks(bmr.smgr, fork); /* * Since no-one else can be looking at the page contents yet, there is no @@ -948,14 +977,14 @@ ExtendBufferedRelTo(ExtendBufferedWhat eb, if ((uint64) current_size + num_pages > extend_to) num_pages = extend_to - current_size; - first_block = ExtendBufferedRelCommon(eb, fork, strategy, flags, + first_block = ExtendBufferedRelCommon(bmr, fork, strategy, flags, num_pages, extend_to, buffers, &extended_by); current_size = first_block + extended_by; Assert(num_pages != 0 || current_size >= extend_to); - for (int i = 0; i < extended_by; i++) + for (uint32 i = 0; i < extended_by; i++) { if (first_block + i != extend_to - 1) ReleaseBuffer(buffers[i]); @@ -972,59 +1001,145 @@ ExtendBufferedRelTo(ExtendBufferedWhat eb, */ if (buffer == InvalidBuffer) { - bool hit; - Assert(extended_by == 0); - buffer = ReadBuffer_common(eb.smgr, eb.relpersistence, - fork, extend_to - 1, mode, strategy, - &hit); + buffer = ReadBuffer_common(bmr.rel, bmr.smgr, 0, + fork, extend_to - 1, mode, strategy); } return buffer; } /* - * ReadBuffer_common -- common logic for all ReadBuffer variants - * - * *hit is set to true if the request was satisfied from shared buffer cache. + * Lock and optionally zero a buffer, as part of the implementation of + * RBM_ZERO_AND_LOCK or RBM_ZERO_AND_CLEANUP_LOCK. The buffer must be already + * pinned. If the buffer is not already valid, it is zeroed and made valid. */ -static Buffer -ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, - BlockNumber blockNum, ReadBufferMode mode, - BufferAccessStrategy strategy, bool *hit) +static void +ZeroAndLockBuffer(Buffer buffer, ReadBufferMode mode, bool already_valid) { BufferDesc *bufHdr; - Block bufBlock; - bool found; - IOContext io_context; - IOObject io_object; - bool isLocalBuf = SmgrIsTemp(smgr); + bool need_to_zero; + bool isLocalBuf = BufferIsLocal(buffer); - *hit = false; + Assert(mode == RBM_ZERO_AND_LOCK || mode == RBM_ZERO_AND_CLEANUP_LOCK); - /* - * Backward compatibility path, most code should use ExtendBufferedRel() - * instead, as acquiring the extension lock inside ExtendBufferedRel() - * scales a lot better. - */ - if (unlikely(blockNum == P_NEW)) + if (already_valid) { - uint32 flags = EB_SKIP_EXTENSION_LOCK; + /* + * If the caller already knew the buffer was valid, we can skip some + * header interaction. The caller just wants to lock the buffer. + */ + need_to_zero = false; + } + else if (isLocalBuf) + { + /* Simple case for non-shared buffers. */ + bufHdr = GetLocalBufferDescriptor(-buffer - 1); + need_to_zero = (pg_atomic_read_u32(&bufHdr->state) & BM_VALID) == 0; + } + else + { + /* + * Take BM_IO_IN_PROGRESS, or discover that BM_VALID has been set + * concurrently. Even though we aren't doing I/O, that ensures that + * we don't zero a page that someone else has pinned. An exclusive + * content lock wouldn't be enough, because readers are allowed to + * drop the content lock after determining that a tuple is visible + * (see buffer access rules in README). + */ + bufHdr = GetBufferDescriptor(buffer - 1); + need_to_zero = StartBufferIO(bufHdr, true, false); + } + + if (need_to_zero) + { + memset(BufferGetPage(buffer), 0, BLCKSZ); /* + * Grab the buffer content lock before marking the page as valid, to + * make sure that no other backend sees the zeroed page before the + * caller has had a chance to initialize it. + * * Since no-one else can be looking at the page contents yet, there is * no difference between an exclusive lock and a cleanup-strength - * lock. + * lock. (Note that we cannot use LockBuffer() or + * LockBufferForCleanup() here, because they assert that the buffer is + * already valid.) */ - if (mode == RBM_ZERO_AND_LOCK || mode == RBM_ZERO_AND_CLEANUP_LOCK) - flags |= EB_LOCK_FIRST; + if (!isLocalBuf) + LWLockAcquire(BufferDescriptorGetContentLock(bufHdr), LW_EXCLUSIVE); + + if (isLocalBuf) + { + /* Only need to adjust flags */ + uint32 buf_state = pg_atomic_read_u32(&bufHdr->state); - return ExtendBufferedRel(EB_SMGR(smgr, relpersistence), - forkNum, strategy, flags); + buf_state |= BM_VALID; + pg_atomic_unlocked_write_u32(&bufHdr->state, buf_state); + } + else + { + /* Set BM_VALID, terminate IO, and wake up any waiters */ + TerminateBufferIO(bufHdr, false, BM_VALID, true); + } + } + else if (!isLocalBuf) + { + /* + * The buffer is valid, so we can't zero it. The caller still expects + * the page to be locked on return. + */ + if (mode == RBM_ZERO_AND_LOCK) + LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); + else + LockBufferForCleanup(buffer); } +} - /* Make sure we will have room to remember the buffer pin */ - ResourceOwnerEnlargeBuffers(CurrentResourceOwner); +/* + * Pin a buffer for a given block. *foundPtr is set to true if the block was + * already present, or false if more work is required to either read it in or + * zero it. + */ +static pg_attribute_always_inline Buffer +PinBufferForBlock(Relation rel, + SMgrRelation smgr, + char smgr_persistence, + ForkNumber forkNum, + BlockNumber blockNum, + BufferAccessStrategy strategy, + bool *foundPtr) +{ + BufferDesc *bufHdr; + IOContext io_context; + IOObject io_object; + char persistence; + + Assert(blockNum != P_NEW); + + /* + * If there is no Relation it usually implies recovery and thus permanent, + * but we take an argument because CreateAndCopyRelationData can reach us + * with only an SMgrRelation for an unlogged relation that we don't want + * to flag with BM_PERMANENT. + */ + if (rel) + persistence = rel->rd_rel->relpersistence; + else if (smgr_persistence == 0) + persistence = RELPERSISTENCE_PERMANENT; + else + persistence = smgr_persistence; + + if (persistence == RELPERSISTENCE_TEMP) + { + io_context = IOCONTEXT_NORMAL; + io_object = IOOBJECT_TEMP_RELATION; + } + else + { + io_context = IOContextForStrategy(strategy); + io_object = IOOBJECT_RELATION; + } TRACE_POSTGRESQL_BUFFER_READ_START(forkNum, blockNum, smgr->smgr_rlocator.locator.spcOid, @@ -1032,50 +1147,34 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, smgr->smgr_rlocator.locator.relNumber, smgr->smgr_rlocator.backend); - if (isLocalBuf) + if (persistence == RELPERSISTENCE_TEMP) { - /* - * We do not use a BufferAccessStrategy for I/O of temporary tables. - * However, in some cases, the "strategy" may not be NULL, so we can't - * rely on IOContextForStrategy() to set the right IOContext for us. - * This may happen in cases like CREATE TEMPORARY TABLE AS... - */ - io_context = IOCONTEXT_NORMAL; - io_object = IOOBJECT_TEMP_RELATION; - bufHdr = LocalBufferAlloc(smgr, forkNum, blockNum, &found); - if (found) + bufHdr = LocalBufferAlloc(smgr, forkNum, blockNum, foundPtr); + if (*foundPtr) pgBufferUsage.local_blks_hit++; - else if (mode == RBM_NORMAL || mode == RBM_NORMAL_NO_LOG || - mode == RBM_ZERO_ON_ERROR) - pgBufferUsage.local_blks_read++; } else + { + bufHdr = BufferAlloc(smgr, persistence, forkNum, blockNum, + strategy, foundPtr, io_context); + if (*foundPtr) + pgBufferUsage.shared_blks_hit++; + } + if (rel) { /* - * lookup the buffer. IO_IN_PROGRESS is set if the requested block is - * not currently in memory. + * While pgBufferUsage's "read" counter isn't bumped unless we reach + * WaitReadBuffers() (so, not for hits, and not for buffers that are + * zeroed instead), the per-relation stats always count them. */ - io_context = IOContextForStrategy(strategy); - io_object = IOOBJECT_RELATION; - bufHdr = BufferAlloc(smgr, relpersistence, forkNum, blockNum, - strategy, &found, io_context); - if (found) - pgBufferUsage.shared_blks_hit++; - else if (mode == RBM_NORMAL || mode == RBM_NORMAL_NO_LOG || - mode == RBM_ZERO_ON_ERROR) - pgBufferUsage.shared_blks_read++; + pgstat_count_buffer_read(rel); + if (*foundPtr) + pgstat_count_buffer_hit(rel); } - - /* At this point we do NOT hold any locks. */ - - /* if it was already in the buffer pool, we're done */ - if (found) + if (*foundPtr) { - /* Just need to update stats before we exit */ - *hit = true; VacuumPageHit++; pgstat_count_io_op(io_object, io_context, IOOP_HIT); - if (VacuumCostActive) VacuumCostBalance += VacuumCostPageHit; @@ -1084,119 +1183,398 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, smgr->smgr_rlocator.locator.dbOid, smgr->smgr_rlocator.locator.relNumber, smgr->smgr_rlocator.backend, - found); + true); + } + + return BufferDescriptorGetBuffer(bufHdr); +} + +/* + * ReadBuffer_common -- common logic for all ReadBuffer variants + * + * smgr is required, rel is optional unless using P_NEW. + */ +static pg_attribute_always_inline Buffer +ReadBuffer_common(Relation rel, SMgrRelation smgr, char smgr_persistence, + ForkNumber forkNum, + BlockNumber blockNum, ReadBufferMode mode, + BufferAccessStrategy strategy) +{ + ReadBuffersOperation operation; + Buffer buffer; + int flags; + + /* + * Backward compatibility path, most code should use ExtendBufferedRel() + * instead, as acquiring the extension lock inside ExtendBufferedRel() + * scales a lot better. + */ + if (unlikely(blockNum == P_NEW)) + { + uint32 flags = EB_SKIP_EXTENSION_LOCK; /* - * In RBM_ZERO_AND_LOCK mode the caller expects the page to be locked - * on return. + * Since no-one else can be looking at the page contents yet, there is + * no difference between an exclusive lock and a cleanup-strength + * lock. */ - if (!isLocalBuf) - { - if (mode == RBM_ZERO_AND_LOCK) - LWLockAcquire(BufferDescriptorGetContentLock(bufHdr), - LW_EXCLUSIVE); - else if (mode == RBM_ZERO_AND_CLEANUP_LOCK) - LockBufferForCleanup(BufferDescriptorGetBuffer(bufHdr)); - } + if (mode == RBM_ZERO_AND_LOCK || mode == RBM_ZERO_AND_CLEANUP_LOCK) + flags |= EB_LOCK_FIRST; - return BufferDescriptorGetBuffer(bufHdr); + return ExtendBufferedRel(BMR_REL(rel), forkNum, strategy, flags); } - /* - * if we have gotten to this point, we have allocated a buffer for the - * page but its contents are not yet valid. IO_IN_PROGRESS is set for it, - * if it's a shared buffer. - */ - Assert(!(pg_atomic_read_u32(&bufHdr->state) & BM_VALID)); /* spinlock not needed */ + if (unlikely(mode == RBM_ZERO_AND_CLEANUP_LOCK || + mode == RBM_ZERO_AND_LOCK)) + { + bool found; - bufBlock = isLocalBuf ? LocalBufHdrGetBlock(bufHdr) : BufHdrGetBlock(bufHdr); + buffer = PinBufferForBlock(rel, smgr, smgr_persistence, + forkNum, blockNum, strategy, &found); + ZeroAndLockBuffer(buffer, mode, found); + return buffer; + } - /* - * Read in the page, unless the caller intends to overwrite it and just - * wants us to allocate a buffer. - */ - if (mode == RBM_ZERO_AND_LOCK || mode == RBM_ZERO_AND_CLEANUP_LOCK) - MemSet((char *) bufBlock, 0, BLCKSZ); + if (mode == RBM_ZERO_ON_ERROR) + flags = READ_BUFFERS_ZERO_ON_ERROR; else - { - instr_time io_start = pgstat_prepare_io_time(); + flags = 0; + operation.smgr = smgr; + operation.rel = rel; + operation.smgr_persistence = smgr_persistence; + operation.forknum = forkNum; + operation.strategy = strategy; + if (StartReadBuffer(&operation, + &buffer, + blockNum, + flags)) + WaitReadBuffers(&operation); - smgrread(smgr, forkNum, blockNum, bufBlock); + return buffer; +} - pgstat_count_io_op_time(io_object, io_context, - IOOP_READ, io_start, 1); +static pg_attribute_always_inline bool +StartReadBuffersImpl(ReadBuffersOperation *operation, + Buffer *buffers, + BlockNumber blockNum, + int *nblocks, + int flags) +{ + int actual_nblocks = *nblocks; + int io_buffers_len = 0; - /* check for garbage data */ - if (!PageIsVerifiedExtended((Page) bufBlock, blockNum, - PIV_LOG_WARNING | PIV_REPORT_STAT)) + Assert(*nblocks > 0); + Assert(*nblocks <= MAX_IO_COMBINE_LIMIT); + + for (int i = 0; i < actual_nblocks; ++i) + { + bool found; + + buffers[i] = PinBufferForBlock(operation->rel, + operation->smgr, + operation->smgr_persistence, + operation->forknum, + blockNum + i, + operation->strategy, + &found); + + if (found) { - if (mode == RBM_ZERO_ON_ERROR || zero_damaged_pages) - { - ereport(WARNING, - (errcode(ERRCODE_DATA_CORRUPTED), - errmsg("invalid page in block %u of relation %s; zeroing out page", - blockNum, - relpath(smgr->smgr_rlocator, forkNum)))); - MemSet((char *) bufBlock, 0, BLCKSZ); - } - else - ereport(ERROR, - (errcode(ERRCODE_DATA_CORRUPTED), - errmsg("invalid page in block %u of relation %s", - blockNum, - relpath(smgr->smgr_rlocator, forkNum)))); + /* + * Terminate the read as soon as we get a hit. It could be a + * single buffer hit, or it could be a hit that follows a readable + * range. We don't want to create more than one readable range, + * so we stop here. + */ + actual_nblocks = i + 1; + break; + } + else + { + /* Extend the readable range to cover this block. */ + io_buffers_len++; } } + *nblocks = actual_nblocks; - /* - * In RBM_ZERO_AND_LOCK / RBM_ZERO_AND_CLEANUP_LOCK mode, grab the buffer - * content lock before marking the page as valid, to make sure that no - * other backend sees the zeroed page before the caller has had a chance - * to initialize it. - * - * Since no-one else can be looking at the page contents yet, there is no - * difference between an exclusive lock and a cleanup-strength lock. (Note - * that we cannot use LockBuffer() or LockBufferForCleanup() here, because - * they assert that the buffer is already valid.) - */ - if ((mode == RBM_ZERO_AND_LOCK || mode == RBM_ZERO_AND_CLEANUP_LOCK) && - !isLocalBuf) + if (likely(io_buffers_len == 0)) + return false; + + /* Populate information needed for I/O. */ + operation->buffers = buffers; + operation->blocknum = blockNum; + operation->flags = flags; + operation->nblocks = actual_nblocks; + operation->io_buffers_len = io_buffers_len; + + if (flags & READ_BUFFERS_ISSUE_ADVICE) { - LWLockAcquire(BufferDescriptorGetContentLock(bufHdr), LW_EXCLUSIVE); + /* + * In theory we should only do this if PinBufferForBlock() had to + * allocate new buffers above. That way, if two calls to + * StartReadBuffers() were made for the same blocks before + * WaitReadBuffers(), only the first would issue the advice. That'd be + * a better simulation of true asynchronous I/O, which would only + * start the I/O once, but isn't done here for simplicity. Note also + * that the following call might actually issue two advice calls if we + * cross a segment boundary; in a true asynchronous version we might + * choose to process only one real I/O at a time in that case. + */ + smgrprefetch(operation->smgr, + operation->forknum, + blockNum, + operation->io_buffers_len); } - if (isLocalBuf) + /* Indicate that WaitReadBuffers() should be called. */ + return true; +} + +/* + * Begin reading a range of blocks beginning at blockNum and extending for + * *nblocks. On return, up to *nblocks pinned buffers holding those blocks + * are written into the buffers array, and *nblocks is updated to contain the + * actual number, which may be fewer than requested. Caller sets some of the + * members of operation; see struct definition. + * + * If false is returned, no I/O is necessary. If true is returned, one I/O + * has been started, and WaitReadBuffers() must be called with the same + * operation object before the buffers are accessed. Along with the operation + * object, the caller-supplied array of buffers must remain valid until + * WaitReadBuffers() is called. + * + * Currently the I/O is only started with optional operating system advice if + * requested by the caller with READ_BUFFERS_ISSUE_ADVICE, and the real I/O + * happens synchronously in WaitReadBuffers(). In future work, true I/O could + * be initiated here. + */ +bool +StartReadBuffers(ReadBuffersOperation *operation, + Buffer *buffers, + BlockNumber blockNum, + int *nblocks, + int flags) +{ + return StartReadBuffersImpl(operation, buffers, blockNum, nblocks, flags); +} + +/* + * Single block version of the StartReadBuffers(). This might save a few + * instructions when called from another translation unit, because it is + * specialized for nblocks == 1. + */ +bool +StartReadBuffer(ReadBuffersOperation *operation, + Buffer *buffer, + BlockNumber blocknum, + int flags) +{ + int nblocks = 1; + bool result; + + result = StartReadBuffersImpl(operation, buffer, blocknum, &nblocks, flags); + Assert(nblocks == 1); /* single block can't be short */ + + return result; +} + +static inline bool +WaitReadBuffersCanStartIO(Buffer buffer, bool nowait) +{ + if (BufferIsLocal(buffer)) { - /* Only need to adjust flags */ - uint32 buf_state = pg_atomic_read_u32(&bufHdr->state); + BufferDesc *bufHdr = GetLocalBufferDescriptor(-buffer - 1); + + return (pg_atomic_read_u32(&bufHdr->state) & BM_VALID) == 0; + } + else + return StartBufferIO(GetBufferDescriptor(buffer - 1), true, nowait); +} + +void +WaitReadBuffers(ReadBuffersOperation *operation) +{ + Buffer *buffers; + int nblocks; + BlockNumber blocknum; + ForkNumber forknum; + IOContext io_context; + IOObject io_object; + char persistence; + + /* + * Currently operations are only allowed to include a read of some range, + * with an optional extra buffer that is already pinned at the end. So + * nblocks can be at most one more than io_buffers_len. + */ + Assert((operation->nblocks == operation->io_buffers_len) || + (operation->nblocks == operation->io_buffers_len + 1)); + + /* Find the range of the physical read we need to perform. */ + nblocks = operation->io_buffers_len; + if (nblocks == 0) + return; /* nothing to do */ + + buffers = &operation->buffers[0]; + blocknum = operation->blocknum; + forknum = operation->forknum; - buf_state |= BM_VALID; - pg_atomic_unlocked_write_u32(&bufHdr->state, buf_state); + persistence = operation->rel + ? operation->rel->rd_rel->relpersistence + : RELPERSISTENCE_PERMANENT; + if (persistence == RELPERSISTENCE_TEMP) + { + io_context = IOCONTEXT_NORMAL; + io_object = IOOBJECT_TEMP_RELATION; } else { - /* Set BM_VALID, terminate IO, and wake up any waiters */ - TerminateBufferIO(bufHdr, false, BM_VALID); + io_context = IOContextForStrategy(operation->strategy); + io_object = IOOBJECT_RELATION; } - VacuumPageMiss++; - if (VacuumCostActive) - VacuumCostBalance += VacuumCostPageMiss; + /* + * We count all these blocks as read by this backend. This is traditional + * behavior, but might turn out to be not true if we find that someone + * else has beaten us and completed the read of some of these blocks. In + * that case the system globally double-counts, but we traditionally don't + * count this as a "hit", and we don't have a separate counter for "miss, + * but another backend completed the read". + */ + if (persistence == RELPERSISTENCE_TEMP) + pgBufferUsage.local_blks_read += nblocks; + else + pgBufferUsage.shared_blks_read += nblocks; - TRACE_POSTGRESQL_BUFFER_READ_DONE(forkNum, blockNum, - smgr->smgr_rlocator.locator.spcOid, - smgr->smgr_rlocator.locator.dbOid, - smgr->smgr_rlocator.locator.relNumber, - smgr->smgr_rlocator.backend, - found); + for (int i = 0; i < nblocks; ++i) + { + int io_buffers_len; + Buffer io_buffers[MAX_IO_COMBINE_LIMIT]; + void *io_pages[MAX_IO_COMBINE_LIMIT]; + instr_time io_start; + BlockNumber io_first_block; - return BufferDescriptorGetBuffer(bufHdr); + /* + * Skip this block if someone else has already completed it. If an + * I/O is already in progress in another backend, this will wait for + * the outcome: either done, or something went wrong and we will + * retry. + */ + if (!WaitReadBuffersCanStartIO(buffers[i], false)) + { + /* + * Report this as a 'hit' for this backend, even though it must + * have started out as a miss in PinBufferForBlock(). + */ + TRACE_POSTGRESQL_BUFFER_READ_DONE(forknum, blocknum + i, + operation->smgr->smgr_rlocator.locator.spcOid, + operation->smgr->smgr_rlocator.locator.dbOid, + operation->smgr->smgr_rlocator.locator.relNumber, + operation->smgr->smgr_rlocator.backend, + true); + continue; + } + + /* We found a buffer that we need to read in. */ + io_buffers[0] = buffers[i]; + io_pages[0] = BufferGetBlock(buffers[i]); + io_first_block = blocknum + i; + io_buffers_len = 1; + + /* + * How many neighboring-on-disk blocks can we can scatter-read into + * other buffers at the same time? In this case we don't wait if we + * see an I/O already in progress. We already hold BM_IO_IN_PROGRESS + * for the head block, so we should get on with that I/O as soon as + * possible. We'll come back to this block again, above. + */ + while ((i + 1) < nblocks && + WaitReadBuffersCanStartIO(buffers[i + 1], true)) + { + /* Must be consecutive block numbers. */ + Assert(BufferGetBlockNumber(buffers[i + 1]) == + BufferGetBlockNumber(buffers[i]) + 1); + + io_buffers[io_buffers_len] = buffers[++i]; + io_pages[io_buffers_len++] = BufferGetBlock(buffers[i]); + } + + io_start = pgstat_prepare_io_time(track_io_timing); + smgrreadv(operation->smgr, forknum, io_first_block, io_pages, io_buffers_len); + pgstat_count_io_op_time(io_object, io_context, IOOP_READ, io_start, + io_buffers_len); + + /* Verify each block we read, and terminate the I/O. */ + for (int j = 0; j < io_buffers_len; ++j) + { + BufferDesc *bufHdr; + Block bufBlock; + + if (persistence == RELPERSISTENCE_TEMP) + { + bufHdr = GetLocalBufferDescriptor(-io_buffers[j] - 1); + bufBlock = LocalBufHdrGetBlock(bufHdr); + } + else + { + bufHdr = GetBufferDescriptor(io_buffers[j] - 1); + bufBlock = BufHdrGetBlock(bufHdr); + } + + /* check for garbage data */ + if (!PageIsVerifiedExtended((Page) bufBlock, io_first_block + j, + PIV_LOG_WARNING | PIV_REPORT_STAT)) + { + if ((operation->flags & READ_BUFFERS_ZERO_ON_ERROR) || zero_damaged_pages) + { + ereport(WARNING, + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("invalid page in block %u of relation %s; zeroing out page", + io_first_block + j, + relpath(operation->smgr->smgr_rlocator, forknum)))); + memset(bufBlock, 0, BLCKSZ); + } + else + ereport(ERROR, + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("invalid page in block %u of relation %s", + io_first_block + j, + relpath(operation->smgr->smgr_rlocator, forknum)))); + } + + /* Terminate I/O and set BM_VALID. */ + if (persistence == RELPERSISTENCE_TEMP) + { + uint32 buf_state = pg_atomic_read_u32(&bufHdr->state); + + buf_state |= BM_VALID; + pg_atomic_unlocked_write_u32(&bufHdr->state, buf_state); + } + else + { + /* Set BM_VALID, terminate IO, and wake up any waiters */ + TerminateBufferIO(bufHdr, false, BM_VALID, true); + } + + /* Report I/Os as completing individually. */ + TRACE_POSTGRESQL_BUFFER_READ_DONE(forknum, io_first_block + j, + operation->smgr->smgr_rlocator.locator.spcOid, + operation->smgr->smgr_rlocator.locator.dbOid, + operation->smgr->smgr_rlocator.locator.relNumber, + operation->smgr->smgr_rlocator.backend, + false); + } + + VacuumPageMiss += io_buffers_len; + if (VacuumCostActive) + VacuumCostBalance += VacuumCostPageMiss * io_buffers_len; + } } /* - * BufferAlloc -- subroutine for ReadBuffer. Handles lookup of a shared - * buffer. If no buffer exists already, selects a replacement - * victim and evicts the old page, but does NOT read in new page. + * BufferAlloc -- subroutine for PinBufferForBlock. Handles lookup of a shared + * buffer. If no buffer exists already, selects a replacement victim and + * evicts the old page, but does NOT read in new page. * * "strategy" can be a buffer replacement strategy object, or NULL for * the default strategy. The selected buffer's usage_count is advanced when @@ -1204,11 +1582,7 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, * * The returned buffer is pinned and is already marked as holding the * desired page. If it already did have the desired page, *foundPtr is - * set true. Otherwise, *foundPtr is set false and the buffer is marked - * as IO_IN_PROGRESS; ReadBuffer will now need to do I/O to fill it. - * - * *foundPtr is actually redundant with the buffer's BM_VALID flag, but - * we keep it for simplicity in ReadBuffer. + * set true. Otherwise, *foundPtr is set false. * * io_context is passed as an output parameter to avoid calling * IOContextForStrategy() when there is a shared buffers hit and no IO @@ -1216,7 +1590,7 @@ ReadBuffer_common(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, * * No locks are held either at entry or exit. */ -static BufferDesc * +static pg_attribute_always_inline BufferDesc * BufferAlloc(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, BlockNumber blockNum, BufferAccessStrategy strategy, @@ -1230,6 +1604,10 @@ BufferAlloc(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, BufferDesc *victim_buf_hdr; uint32 victim_buf_state; + /* Make sure we will have room to remember the buffer pin */ + ResourceOwnerEnlarge(CurrentResourceOwner); + ReservePrivateRefCountEntry(); + /* create a tag so we can lookup the buffer */ InitBufferTag(&newTag, &smgr->smgr_rlocator.locator, forkNum, blockNum); @@ -1263,19 +1641,10 @@ BufferAlloc(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, { /* * We can only get here if (a) someone else is still reading in - * the page, or (b) a previous read attempt failed. We have to - * wait for any active read attempt to finish, and then set up our - * own read attempt if the page is still not BM_VALID. - * StartBufferIO does it all. + * the page, (b) a previous read attempt failed, or (c) someone + * called StartReadBuffers() but not yet WaitReadBuffers(). */ - if (StartBufferIO(buf, true)) - { - /* - * If we get here, previous attempts to read the buffer must - * have failed ... but we shall bravely try again. - */ - *foundPtr = false; - } + *foundPtr = false; } return buf; @@ -1314,15 +1683,14 @@ BufferAlloc(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, * use. * * We could do this after releasing the partition lock, but then we'd - * have to call ResourceOwnerEnlargeBuffers() & - * ReservePrivateRefCountEntry() before acquiring the lock, for the - * rare case of such a collision. + * have to call ResourceOwnerEnlarge() & ReservePrivateRefCountEntry() + * before acquiring the lock, for the rare case of such a collision. */ UnpinBuffer(victim_buf_hdr); /* - * The victim buffer we acquired peviously is clean and unused, let it - * be found again quickly + * The victim buffer we acquired previously is clean and unused, let + * it be found again quickly */ StrategyFreeBuffer(victim_buf_hdr); @@ -1341,19 +1709,10 @@ BufferAlloc(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, { /* * We can only get here if (a) someone else is still reading in - * the page, or (b) a previous read attempt failed. We have to - * wait for any active read attempt to finish, and then set up our - * own read attempt if the page is still not BM_VALID. - * StartBufferIO does it all. + * the page, (b) a previous read attempt failed, or (c) someone + * called StartReadBuffers() but not yet WaitReadBuffers(). */ - if (StartBufferIO(existing_buf_hdr, true)) - { - /* - * If we get here, previous attempts to read the buffer must - * have failed ... but we shall bravely try again. - */ - *foundPtr = false; - } + *foundPtr = false; } return existing_buf_hdr; @@ -1385,15 +1744,9 @@ BufferAlloc(SMgrRelation smgr, char relpersistence, ForkNumber forkNum, LWLockRelease(newPartitionLock); /* - * Buffer contents are currently invalid. Try to obtain the right to - * start I/O. If StartBufferIO returns false, then someone else managed - * to read it before we did, so there's nothing left for BufferAlloc() to - * do. + * Buffer contents are currently invalid. */ - if (StartBufferIO(victim_buf_hdr, true)) - *foundPtr = false; - else - *foundPtr = true; + *foundPtr = false; return victim_buf_hdr; } @@ -1591,10 +1944,10 @@ GetVictimBuffer(BufferAccessStrategy strategy, IOContext io_context) /* * Ensure, while the spinlock's not yet held, that there's a free refcount - * entry. + * entry, and a resource owner slot for the pin. */ ReservePrivateRefCountEntry(); - ResourceOwnerEnlargeBuffers(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); /* we return here if a prospective victim buffer gets used concurrently */ again: @@ -1747,7 +2100,7 @@ GetVictimBuffer(BufferAccessStrategy strategy, IOContext io_context) * pessimistic, but outside of toy-sized shared_buffers it should allow * sufficient pins. */ -static void +void LimitAdditionalPins(uint32 *additional_pins) { uint32 max_backends; @@ -1767,7 +2120,7 @@ LimitAdditionalPins(uint32 *additional_pins) */ max_proportional_pins -= PrivateRefCountOverflowed + REFCOUNT_ARRAY_ENTRIES; - if (max_proportional_pins < 0) + if (max_proportional_pins <= 0) max_proportional_pins = 1; if (*additional_pins > max_proportional_pins) @@ -1779,7 +2132,7 @@ LimitAdditionalPins(uint32 *additional_pins) * avoid duplicating the tracing and relpersistence related logic. */ static BlockNumber -ExtendBufferedRelCommon(ExtendBufferedWhat eb, +ExtendBufferedRelCommon(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, @@ -1791,27 +2144,27 @@ ExtendBufferedRelCommon(ExtendBufferedWhat eb, BlockNumber first_block; TRACE_POSTGRESQL_BUFFER_EXTEND_START(fork, - eb.smgr->smgr_rlocator.locator.spcOid, - eb.smgr->smgr_rlocator.locator.dbOid, - eb.smgr->smgr_rlocator.locator.relNumber, - eb.smgr->smgr_rlocator.backend, + bmr.smgr->smgr_rlocator.locator.spcOid, + bmr.smgr->smgr_rlocator.locator.dbOid, + bmr.smgr->smgr_rlocator.locator.relNumber, + bmr.smgr->smgr_rlocator.backend, extend_by); - if (eb.relpersistence == RELPERSISTENCE_TEMP) - first_block = ExtendBufferedRelLocal(eb, fork, flags, + if (bmr.relpersistence == RELPERSISTENCE_TEMP) + first_block = ExtendBufferedRelLocal(bmr, fork, flags, extend_by, extend_upto, buffers, &extend_by); else - first_block = ExtendBufferedRelShared(eb, fork, strategy, flags, + first_block = ExtendBufferedRelShared(bmr, fork, strategy, flags, extend_by, extend_upto, buffers, &extend_by); *extended_by = extend_by; TRACE_POSTGRESQL_BUFFER_EXTEND_DONE(fork, - eb.smgr->smgr_rlocator.locator.spcOid, - eb.smgr->smgr_rlocator.locator.dbOid, - eb.smgr->smgr_rlocator.locator.relNumber, - eb.smgr->smgr_rlocator.backend, + bmr.smgr->smgr_rlocator.locator.spcOid, + bmr.smgr->smgr_rlocator.locator.dbOid, + bmr.smgr->smgr_rlocator.locator.relNumber, + bmr.smgr->smgr_rlocator.backend, *extended_by, first_block); @@ -1823,7 +2176,7 @@ ExtendBufferedRelCommon(ExtendBufferedWhat eb, * shared buffers. */ static BlockNumber -ExtendBufferedRelShared(ExtendBufferedWhat eb, +ExtendBufferedRelShared(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, @@ -1859,9 +2212,6 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, MemSet((char *) buf_block, 0, BLCKSZ); } - /* in case we need to pin an existing buffer below */ - ResourceOwnerEnlargeBuffers(CurrentResourceOwner); - /* * Lock relation against concurrent extensions, unless requested not to. * @@ -1873,20 +2223,16 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, * we get the lock. */ if (!(flags & EB_SKIP_EXTENSION_LOCK)) - { - LockRelationForExtension(eb.rel, ExclusiveLock); - if (eb.rel) - eb.smgr = RelationGetSmgr(eb.rel); - } + LockRelationForExtension(bmr.rel, ExclusiveLock); /* * If requested, invalidate size cache, so that smgrnblocks asks the * kernel. */ if (flags & EB_CLEAR_SIZE_CACHE) - eb.smgr->smgr_cached_nblocks[fork] = InvalidBlockNumber; + bmr.smgr->smgr_cached_nblocks[fork] = InvalidBlockNumber; - first_block = smgrnblocks(eb.smgr, fork); + first_block = smgrnblocks(bmr.smgr, fork); /* * Now that we have the accurate relation size, check if the caller wants @@ -1908,7 +2254,7 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, BufferDesc *buf_hdr = GetBufferDescriptor(buffers[i] - 1); /* - * The victim buffer we acquired peviously is clean and unused, + * The victim buffer we acquired previously is clean and unused, * let it be found again quickly */ StrategyFreeBuffer(buf_hdr); @@ -1918,7 +2264,7 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, if (extend_by == 0) { if (!(flags & EB_SKIP_EXTENSION_LOCK)) - UnlockRelationForExtension(eb.rel, ExclusiveLock); + UnlockRelationForExtension(bmr.rel, ExclusiveLock); *extended_by = extend_by; return first_block; } @@ -1929,7 +2275,7 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("cannot extend relation %s beyond %u blocks", - relpath(eb.smgr->smgr_rlocator, fork), + relpath(bmr.smgr->smgr_rlocator, fork), MaxBlockNumber))); /* @@ -1938,7 +2284,7 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, * This needs to happen before we extend the relation, because as soon as * we do, other backends can start to read in those pages. */ - for (int i = 0; i < extend_by; i++) + for (uint32 i = 0; i < extend_by; i++) { Buffer victim_buf = buffers[i]; BufferDesc *victim_buf_hdr = GetBufferDescriptor(victim_buf - 1); @@ -1947,7 +2293,11 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, LWLock *partition_lock; int existing_id; - InitBufferTag(&tag, &eb.smgr->smgr_rlocator.locator, fork, first_block + i); + /* in case we need to pin an existing buffer below */ + ResourceOwnerEnlarge(CurrentResourceOwner); + ReservePrivateRefCountEntry(); + + InitBufferTag(&tag, &bmr.smgr->smgr_rlocator.locator, fork, first_block + i); hash = BufTableHashCode(&tag); partition_lock = BufMappingPartitionLock(hash); @@ -1984,7 +2334,7 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, LWLockRelease(partition_lock); /* - * The victim buffer we acquired peviously is clean and unused, + * The victim buffer we acquired previously is clean and unused, * let it be found again quickly */ StrategyFreeBuffer(victim_buf_hdr); @@ -1996,7 +2346,7 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, if (valid && !PageIsNew((Page) buf_block)) ereport(ERROR, (errmsg("unexpected data beyond EOF in block %u of relation %s", - existing_hdr->tag.blockNum, relpath(eb.smgr->smgr_rlocator, fork)), + existing_hdr->tag.blockNum, relpath(bmr.smgr->smgr_rlocator, fork)), errhint("This has been seen to occur with buggy kernels; consider updating your system."))); /* @@ -2015,7 +2365,7 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, buf_state &= ~BM_VALID; UnlockBufHdr(existing_hdr, buf_state); - } while (!StartBufferIO(existing_hdr, true)); + } while (!StartBufferIO(existing_hdr, true, false)); } else { @@ -2030,7 +2380,7 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, victim_buf_hdr->tag = tag; buf_state |= BM_TAG_VALID | BUF_USAGECOUNT_ONE; - if (eb.relpersistence == RELPERSISTENCE_PERMANENT || fork == INIT_FORKNUM) + if (bmr.relpersistence == RELPERSISTENCE_PERMANENT || fork == INIT_FORKNUM) buf_state |= BM_PERMANENT; UnlockBufHdr(victim_buf_hdr, buf_state); @@ -2038,11 +2388,11 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, LWLockRelease(partition_lock); /* XXX: could combine the locked operations in it with the above */ - StartBufferIO(victim_buf_hdr, true); + StartBufferIO(victim_buf_hdr, true, false); } } - io_start = pgstat_prepare_io_time(); + io_start = pgstat_prepare_io_time(track_io_timing); /* * Note: if smgrzeroextend fails, we will end up with buffers that are @@ -2054,7 +2404,7 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, * * We don't need to set checksum for all-zero pages. */ - smgrzeroextend(eb.smgr, fork, first_block, extend_by, false); + smgrzeroextend(bmr.smgr, fork, first_block, extend_by, false); /* * Release the file-extension lock; it's now OK for someone else to extend @@ -2064,13 +2414,13 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, * take noticeable time. */ if (!(flags & EB_SKIP_EXTENSION_LOCK)) - UnlockRelationForExtension(eb.rel, ExclusiveLock); + UnlockRelationForExtension(bmr.rel, ExclusiveLock); pgstat_count_io_op_time(IOOBJECT_RELATION, io_context, IOOP_EXTEND, io_start, extend_by); /* Set BM_VALID, terminate IO, and wake up any waiters */ - for (int i = 0; i < extend_by; i++) + for (uint32 i = 0; i < extend_by; i++) { Buffer buf = buffers[i]; BufferDesc *buf_hdr = GetBufferDescriptor(buf - 1); @@ -2088,7 +2438,7 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, if (lock) LWLockAcquire(BufferDescriptorGetContentLock(buf_hdr), LW_EXCLUSIVE); - TerminateBufferIO(buf_hdr, false, BM_VALID); + TerminateBufferIO(buf_hdr, false, BM_VALID, true); } pgBufferUsage.shared_blks_written += extend_by; @@ -2098,6 +2448,65 @@ ExtendBufferedRelShared(ExtendBufferedWhat eb, return first_block; } +/* + * BufferIsExclusiveLocked + * + * Checks if buffer is exclusive-locked. + * + * Buffer must be pinned. + */ +bool +BufferIsExclusiveLocked(Buffer buffer) +{ + BufferDesc *bufHdr; + + if (BufferIsLocal(buffer)) + { + int bufid = -buffer - 1; + + bufHdr = GetLocalBufferDescriptor(bufid); + } + else + { + bufHdr = GetBufferDescriptor(buffer - 1); + } + + Assert(BufferIsPinned(buffer)); + return LWLockHeldByMeInMode(BufferDescriptorGetContentLock(bufHdr), + LW_EXCLUSIVE); +} + +/* + * BufferIsDirty + * + * Checks if buffer is already dirty. + * + * Buffer must be pinned and exclusive-locked. (Without an exclusive lock, + * the result may be stale before it's returned.) + */ +bool +BufferIsDirty(Buffer buffer) +{ + BufferDesc *bufHdr; + + if (BufferIsLocal(buffer)) + { + int bufid = -buffer - 1; + + bufHdr = GetLocalBufferDescriptor(bufid); + } + else + { + bufHdr = GetBufferDescriptor(buffer - 1); + } + + Assert(BufferIsPinned(buffer)); + Assert(LWLockHeldByMeInMode(BufferDescriptorGetContentLock(bufHdr), + LW_EXCLUSIVE)); + + return pg_atomic_read_u32(&bufHdr->state) & BM_DIRTY; +} + /* * MarkBufferDirty * @@ -2222,7 +2631,8 @@ ReleaseAndReadBuffer(Buffer buffer, * taking the buffer header lock; instead update the state variable in loop of * CAS operations. Hopefully it's just a single CAS. * - * Note that ResourceOwnerEnlargeBuffers must have been done already. + * Note that ResourceOwnerEnlarge() and ReservePrivateRefCountEntry() + * must have been done already. * * Returns true if buffer is BM_VALID, else false. This provision allows * some callers to avoid an extra spinlock cycle. @@ -2235,6 +2645,7 @@ PinBuffer(BufferDesc *buf, BufferAccessStrategy strategy) PrivateRefCountEntry *ref; Assert(!BufferIsLocal(b)); + Assert(ReservedRefCountEntry != NULL); ref = GetPrivateRefCountEntry(b, true); @@ -2243,7 +2654,6 @@ PinBuffer(BufferDesc *buf, BufferAccessStrategy strategy) uint32 buf_state; uint32 old_buf_state; - ReservePrivateRefCountEntry(); ref = NewPrivateRefCountEntry(b); old_buf_state = pg_atomic_read_u32(&buf->state); @@ -2293,7 +2703,12 @@ PinBuffer(BufferDesc *buf, BufferAccessStrategy strategy) else { /* - * If we previously pinned the buffer, it must surely be valid. + * If we previously pinned the buffer, it is likely to be valid, but + * it may not be if StartReadBuffers() was called and + * WaitReadBuffers() hasn't been called yet. We'll check by loading + * the flags without locking. This is racy, but it's OK to return + * false spuriously: when WaitReadBuffers() calls StartBufferIO(), + * it'll see that it's now valid. * * Note: We deliberately avoid a Valgrind client request here. * Individual access methods can optionally superimpose buffer page @@ -2302,7 +2717,7 @@ PinBuffer(BufferDesc *buf, BufferAccessStrategy strategy) * that the buffer page is legitimately non-accessible here. We * cannot meddle with that. */ - result = true; + result = (pg_atomic_read_u32(&buf->state) & BM_VALID) != 0; } ref->refcount++; @@ -2316,7 +2731,8 @@ PinBuffer(BufferDesc *buf, BufferAccessStrategy strategy) * The spinlock is released before return. * * As this function is called with the spinlock held, the caller has to - * previously call ReservePrivateRefCountEntry(). + * previously call ReservePrivateRefCountEntry() and + * ResourceOwnerEnlarge(CurrentResourceOwner); * * Currently, no callers of this function want to modify the buffer's * usage_count at all, so there's no need for a strategy parameter. @@ -2377,6 +2793,15 @@ PinBuffer_Locked(BufferDesc *buf) */ static void UnpinBuffer(BufferDesc *buf) +{ + Buffer b = BufferDescriptorGetBuffer(buf); + + ResourceOwnerForgetBuffer(CurrentResourceOwner, b); + UnpinBufferNoOwner(buf); +} + +static void +UnpinBufferNoOwner(BufferDesc *buf) { PrivateRefCountEntry *ref; Buffer b = BufferDescriptorGetBuffer(buf); @@ -2386,9 +2811,6 @@ UnpinBuffer(BufferDesc *buf) /* not moving as we're likely deleting it soon anyway */ ref = GetPrivateRefCountEntry(b, false); Assert(ref != NULL); - - ResourceOwnerForgetBuffer(CurrentResourceOwner, b); - Assert(ref->refcount > 0); ref->refcount--; if (ref->refcount == 0) @@ -2491,9 +2913,6 @@ BufferSync(int flags) int mask = BM_DIRTY; WritebackContext wb_context; - /* Make sure we can handle the pin inside SyncOneBuffer */ - ResourceOwnerEnlargeBuffers(CurrentResourceOwner); - /* * Unless this is a shutdown checkpoint or we have been explicitly told, * we write only permanent, dirty buffers. But at shutdown or end of @@ -2692,7 +3111,7 @@ BufferSync(int flags) if (SyncOneBuffer(buf_id, false, &wb_context) & BUF_WRITTEN) { TRACE_POSTGRESQL_BUFFER_SYNC_WRITTEN(buf_id); - PendingCheckpointerStats.buf_written_checkpoints++; + PendingCheckpointerStats.buffers_written++; num_written++; } } @@ -2970,9 +3389,6 @@ BgBufferSync(WritebackContext *wb_context) * requirements, or hit the bgwriter_lru_maxpages limit. */ - /* Make sure we can handle the pin inside SyncOneBuffer */ - ResourceOwnerEnlargeBuffers(CurrentResourceOwner); - num_to_scan = bufs_to_lap; num_written = 0; reusable_buffers = reusable_buffers_est; @@ -3054,8 +3470,6 @@ BgBufferSync(WritebackContext *wb_context) * * (BUF_WRITTEN could be set in error if FlushBuffer finds the buffer clean * after locking it, but we don't care all that much.) - * - * Note: caller must have done ResourceOwnerEnlargeBuffers. */ static int SyncOneBuffer(int buf_id, bool skip_recently_used, WritebackContext *wb_context) @@ -3065,7 +3479,9 @@ SyncOneBuffer(int buf_id, bool skip_recently_used, WritebackContext *wb_context) uint32 buf_state; BufferTag tag; + /* Make sure we can handle the pin */ ReservePrivateRefCountEntry(); + ResourceOwnerEnlarge(CurrentResourceOwner); /* * Check whether buffer needs writing. @@ -3195,6 +3611,7 @@ CheckForBufferLeaks(void) int RefCountErrors = 0; PrivateRefCountEntry *res; int i; + char *s; /* check the array */ for (i = 0; i < REFCOUNT_ARRAY_ENTRIES; i++) @@ -3203,7 +3620,10 @@ CheckForBufferLeaks(void) if (res->buffer != InvalidBuffer) { - PrintBufferLeakWarning(res->buffer); + s = DebugPrintBufferRefcount(res->buffer); + elog(WARNING, "buffer refcount leak: %s", s); + pfree(s); + RefCountErrors++; } } @@ -3216,7 +3636,9 @@ CheckForBufferLeaks(void) hash_seq_init(&hstat, PrivateRefCountHash); while ((res = (PrivateRefCountEntry *) hash_seq_search(&hstat)) != NULL) { - PrintBufferLeakWarning(res->buffer); + s = DebugPrintBufferRefcount(res->buffer); + elog(WARNING, "buffer refcount leak: %s", s); + pfree(s); RefCountErrors++; } } @@ -3228,13 +3650,14 @@ CheckForBufferLeaks(void) /* * Helper routine to issue warnings when a buffer is unexpectedly pinned */ -void -PrintBufferLeakWarning(Buffer buffer) +char * +DebugPrintBufferRefcount(Buffer buffer) { BufferDesc *buf; int32 loccount; char *path; - BackendId backend; + char *result; + ProcNumber backend; uint32 buf_state; Assert(BufferIsValid(buffer)); @@ -3242,26 +3665,26 @@ PrintBufferLeakWarning(Buffer buffer) { buf = GetLocalBufferDescriptor(-buffer - 1); loccount = LocalRefCount[-buffer - 1]; - backend = MyBackendId; + backend = MyProcNumber; } else { buf = GetBufferDescriptor(buffer - 1); loccount = GetPrivateRefCount(buffer); - backend = InvalidBackendId; + backend = INVALID_PROC_NUMBER; } /* theoretically we should lock the bufhdr here */ path = relpathbackend(BufTagGetRelFileLocator(&buf->tag), backend, BufTagGetForkNum(&buf->tag)); buf_state = pg_atomic_read_u32(&buf->state); - elog(WARNING, - "buffer refcount leak: [%03d] " - "(rel=%s, blockNum=%u, flags=0x%x, refcount=%u %d)", - buffer, path, - buf->tag.blockNum, buf_state & BUF_FLAG_MASK, - BUF_STATE_GET_REFCOUNT(buf_state), loccount); + + result = psprintf("[%03d] (rel=%s, blockNum=%u, flags=0x%x, refcount=%u %d)", + buffer, path, + buf->tag.blockNum, buf_state & BUF_FLAG_MASK, + BUF_STATE_GET_REFCOUNT(buf_state), loccount); pfree(path); + return result; } /* @@ -3362,7 +3785,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln, IOObject io_object, * someone else flushed the buffer before we could, so we need not do * anything. */ - if (!StartBufferIO(buf, false)) + if (!StartBufferIO(buf, false, false)) return; /* Setup error traceback support for ereport() */ @@ -3373,7 +3796,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln, IOObject io_object, /* Find smgr relation for buffer */ if (reln == NULL) - reln = smgropen(BufTagGetRelFileLocator(&buf->tag), InvalidBackendId); + reln = smgropen(BufTagGetRelFileLocator(&buf->tag), INVALID_PROC_NUMBER); TRACE_POSTGRESQL_BUFFER_FLUSH_START(BufTagGetForkNum(&buf->tag), buf->tag.blockNum, @@ -3427,7 +3850,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln, IOObject io_object, */ bufToWrite = PageSetChecksumCopy((Page) bufBlock, buf->tag.blockNum); - io_start = pgstat_prepare_io_time(); + io_start = pgstat_prepare_io_time(track_io_timing); /* * bufToWrite is either the shared buffer or a copy, as appropriate. @@ -3465,7 +3888,7 @@ FlushBuffer(BufferDesc *buf, SMgrRelation reln, IOObject io_object, * Mark the buffer as clean (unless BM_JUST_DIRTIED has become set) and * end the BM_IO_IN_PROGRESS state. */ - TerminateBufferIO(buf, true, 0); + TerminateBufferIO(buf, true, 0, true); TRACE_POSTGRESQL_BUFFER_FLUSH_DONE(BufTagGetForkNum(&buf->tag), buf->tag.blockNum, @@ -3550,8 +3973,8 @@ BufferIsPermanent(Buffer buffer) XLogRecPtr BufferGetLSNAtomic(Buffer buffer) { - BufferDesc *bufHdr = GetBufferDescriptor(buffer - 1); char *page = BufferGetPage(buffer); + BufferDesc *bufHdr; XLogRecPtr lsn; uint32 buf_state; @@ -3565,6 +3988,7 @@ BufferGetLSNAtomic(Buffer buffer) Assert(BufferIsValid(buffer)); Assert(BufferIsPinned(buffer)); + bufHdr = GetBufferDescriptor(buffer - 1); buf_state = LockBufHdr(bufHdr); lsn = PageGetLSN(page); UnlockBufHdr(bufHdr, buf_state); @@ -3608,7 +4032,7 @@ DropRelationBuffers(SMgrRelation smgr_reln, ForkNumber *forkNum, /* If it's a local relation, it's localbuf.c's problem. */ if (RelFileLocatorBackendIsTemp(rlocator)) { - if (rlocator.backend == MyBackendId) + if (rlocator.backend == MyProcNumber) { for (j = 0; j < nforks; j++) DropRelationLocalBuffers(rlocator.locator, forkNum[j], @@ -3738,7 +4162,7 @@ DropRelationsAllBuffers(SMgrRelation *smgr_reln, int nlocators) { if (RelFileLocatorBackendIsTemp(smgr_reln[i]->smgr_rlocator)) { - if (smgr_reln[i]->smgr_rlocator.backend == MyBackendId) + if (smgr_reln[i]->smgr_rlocator.backend == MyProcNumber) DropRelationAllLocalBuffers(smgr_reln[i]->smgr_rlocator.locator); } else @@ -3827,7 +4251,7 @@ DropRelationsAllBuffers(SMgrRelation *smgr_reln, int nlocators) /* sort the list of rlocators if necessary */ if (use_bsearch) - pg_qsort(locators, n, sizeof(RelFileLocator), rlocator_comparator); + qsort(locators, n, sizeof(RelFileLocator), rlocator_comparator); for (i = 0; i < NBuffers; i++) { @@ -4002,7 +4426,7 @@ PrintBufferDescs(void) "blockNum=%u, flags=0x%x, refcount=%u %d)", i, buf->freeNext, relpathbackend(BufTagGetRelFileLocator(&buf->tag), - InvalidBackendId, BufTagGetForkNum(&buf->tag)), + INVALID_PROC_NUMBER, BufTagGetForkNum(&buf->tag)), buf->tag.blockNum, buf->flags, buf->refcount, GetPrivateRefCount(b)); } @@ -4059,6 +4483,7 @@ FlushRelationBuffers(Relation rel) { int i; BufferDesc *bufHdr; + SMgrRelation srel = RelationGetSmgr(rel); if (RelationUsesLocalBuffers(rel)) { @@ -4085,9 +4510,9 @@ FlushRelationBuffers(Relation rel) PageSetChecksumInplace(localpage, bufHdr->tag.blockNum); - io_start = pgstat_prepare_io_time(); + io_start = pgstat_prepare_io_time(track_io_timing); - smgrwrite(RelationGetSmgr(rel), + smgrwrite(srel, BufTagGetForkNum(&bufHdr->tag), bufHdr->tag.blockNum, localpage, @@ -4110,9 +4535,6 @@ FlushRelationBuffers(Relation rel) return; } - /* Make sure we can handle the pin inside the loop */ - ResourceOwnerEnlargeBuffers(CurrentResourceOwner); - for (i = 0; i < NBuffers; i++) { uint32 buf_state; @@ -4126,7 +4548,9 @@ FlushRelationBuffers(Relation rel) if (!BufTagMatchesRelFileLocator(&bufHdr->tag, &rel->rd_locator)) continue; + /* Make sure we can handle the pin */ ReservePrivateRefCountEntry(); + ResourceOwnerEnlarge(CurrentResourceOwner); buf_state = LockBufHdr(bufHdr); if (BufTagMatchesRelFileLocator(&bufHdr->tag, &rel->rd_locator) && @@ -4134,7 +4558,7 @@ FlushRelationBuffers(Relation rel) { PinBuffer_Locked(bufHdr); LWLockAcquire(BufferDescriptorGetContentLock(bufHdr), LW_SHARED); - FlushBuffer(bufHdr, RelationGetSmgr(rel), IOOBJECT_RELATION, IOCONTEXT_NORMAL); + FlushBuffer(bufHdr, srel, IOOBJECT_RELATION, IOCONTEXT_NORMAL); LWLockRelease(BufferDescriptorGetContentLock(bufHdr)); UnpinBuffer(bufHdr); } @@ -4181,10 +4605,7 @@ FlushRelationsAllBuffers(SMgrRelation *smgrs, int nrels) /* sort the list of SMgrRelations if necessary */ if (use_bsearch) - pg_qsort(srels, nrels, sizeof(SMgrSortArray), rlocator_comparator); - - /* Make sure we can handle the pin inside the loop */ - ResourceOwnerEnlargeBuffers(CurrentResourceOwner); + qsort(srels, nrels, sizeof(SMgrSortArray), rlocator_comparator); for (i = 0; i < NBuffers; i++) { @@ -4224,7 +4645,9 @@ FlushRelationsAllBuffers(SMgrRelation *smgrs, int nrels) if (srelent == NULL) continue; + /* Make sure we can handle the pin */ ReservePrivateRefCountEntry(); + ResourceOwnerEnlarge(CurrentResourceOwner); buf_state = LockBufHdr(bufHdr); if (BufTagMatchesRelFileLocator(&bufHdr->tag, &srelent->rlocator) && @@ -4277,7 +4700,7 @@ RelationCopyStorageUsingBuffer(RelFileLocator srclocator, use_wal = XLogIsNeeded() && (permanent || forkNum == INIT_FORKNUM); /* Get number of blocks in the source relation. */ - nblocks = smgrnblocks(smgropen(srclocator, InvalidBackendId), + nblocks = smgrnblocks(smgropen(srclocator, INVALID_PROC_NUMBER), forkNum); /* Nothing to copy; just return. */ @@ -4289,7 +4712,7 @@ RelationCopyStorageUsingBuffer(RelFileLocator srclocator, * relation before starting to copy block by block. */ memset(buf.data, 0, BLCKSZ); - smgrextend(smgropen(dstlocator, InvalidBackendId), forkNum, nblocks - 1, + smgrextend(smgropen(dstlocator, INVALID_PROC_NUMBER), forkNum, nblocks - 1, buf.data, true); /* This is a bulk operation, so use buffer access strategies. */ @@ -4348,13 +4771,17 @@ void CreateAndCopyRelationData(RelFileLocator src_rlocator, RelFileLocator dst_rlocator, bool permanent) { - RelFileLocatorBackend rlocator; char relpersistence; + SMgrRelation src_rel; + SMgrRelation dst_rel; /* Set the relpersistence. */ relpersistence = permanent ? RELPERSISTENCE_PERMANENT : RELPERSISTENCE_UNLOGGED; + src_rel = smgropen(src_rlocator, INVALID_PROC_NUMBER); + dst_rel = smgropen(dst_rlocator, INVALID_PROC_NUMBER); + /* * Create and copy all forks of the relation. During create database we * have a separate cleanup mechanism which deletes complete database @@ -4371,9 +4798,9 @@ CreateAndCopyRelationData(RelFileLocator src_rlocator, for (ForkNumber forkNum = MAIN_FORKNUM + 1; forkNum <= MAX_FORKNUM; forkNum++) { - if (smgrexists(smgropen(src_rlocator, InvalidBackendId), forkNum)) + if (smgrexists(src_rel, forkNum)) { - smgrcreate(smgropen(dst_rlocator, InvalidBackendId), forkNum, false); + smgrcreate(dst_rel, forkNum, false); /* * WAL log creation if the relation is persistent, or this is the @@ -4387,15 +4814,6 @@ CreateAndCopyRelationData(RelFileLocator src_rlocator, permanent); } } - - /* close source and destination smgr if exists. */ - rlocator.backend = InvalidBackendId; - - rlocator.locator = src_rlocator; - smgrcloserellocator(rlocator); - - rlocator.locator = dst_rlocator; - smgrcloserellocator(rlocator); } /* --------------------------------------------------------------------- @@ -4419,9 +4837,6 @@ FlushDatabaseBuffers(Oid dbid) int i; BufferDesc *bufHdr; - /* Make sure we can handle the pin inside the loop */ - ResourceOwnerEnlargeBuffers(CurrentResourceOwner); - for (i = 0; i < NBuffers; i++) { uint32 buf_state; @@ -4435,7 +4850,9 @@ FlushDatabaseBuffers(Oid dbid) if (bufHdr->tag.dbOid != dbid) continue; + /* Make sure we can handle the pin */ ReservePrivateRefCountEntry(); + ResourceOwnerEnlarge(CurrentResourceOwner); buf_state = LockBufHdr(bufHdr); if (bufHdr->tag.dbOid == dbid && @@ -4512,7 +4929,7 @@ void IncrBufferRefCount(Buffer buffer) { Assert(BufferIsPinned(buffer)); - ResourceOwnerEnlargeBuffers(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); if (BufferIsLocal(buffer)) LocalRefCount[-buffer - 1]++; else @@ -4699,7 +5116,7 @@ UnlockBuffers(void) * got a cancel/die interrupt before getting the signal. */ if ((buf_state & BM_PIN_COUNT_WAITER) != 0 && - buf->wait_backend_pgprocno == MyProc->pgprocno) + buf->wait_backend_pgprocno == MyProcNumber) buf_state &= ~BM_PIN_COUNT_WAITER; UnlockBufHdr(buf, buf_state); @@ -4849,7 +5266,7 @@ LockBufferForCleanup(Buffer buffer) LockBuffer(buffer, BUFFER_LOCK_UNLOCK); elog(ERROR, "multiple backends attempting to wait for pincount 1"); } - bufHdr->wait_backend_pgprocno = MyProc->pgprocno; + bufHdr->wait_backend_pgprocno = MyProcNumber; PinCountWaitBuf = bufHdr; buf_state |= BM_PIN_COUNT_WAITER; UnlockBufHdr(bufHdr, buf_state); @@ -4901,7 +5318,7 @@ LockBufferForCleanup(Buffer buffer) SetStartupBufferPinWaitBufId(-1); } else - ProcWaitForSignal(PG_WAIT_BUFFER_PIN); + ProcWaitForSignal(WAIT_EVENT_BUFFER_PIN); /* * Remove flag marking us as waiter. Normally this will not be set @@ -4913,7 +5330,7 @@ LockBufferForCleanup(Buffer buffer) */ buf_state = LockBufHdr(bufHdr); if ((buf_state & BM_PIN_COUNT_WAITER) != 0 && - bufHdr->wait_backend_pgprocno == MyProc->pgprocno) + bufHdr->wait_backend_pgprocno == MyProcNumber) buf_state &= ~BM_PIN_COUNT_WAITER; UnlockBufHdr(bufHdr, buf_state); @@ -4923,8 +5340,8 @@ LockBufferForCleanup(Buffer buffer) } /* - * Check called from RecoveryConflictInterrupt handler when Startup - * process requests cancellation of all pin holders that are blocking it. + * Check called from ProcessRecoveryConflictInterrupts() when Startup process + * requests cancellation of all pin holders that are blocking it. */ bool HoldingBufferPinThatDelaysRecovery(void) @@ -5104,13 +5521,19 @@ WaitIO(BufferDesc *buf) * * Returns true if we successfully marked the buffer as I/O busy, * false if someone else already did the work. + * + * If nowait is true, then we don't wait for an I/O to be finished by another + * backend. In that case, false indicates either that the I/O was already + * finished, or is still in progress. This is useful for callers that want to + * find out if they can perform the I/O as part of a larger operation, without + * waiting for the answer or distinguishing the reasons why not. */ static bool -StartBufferIO(BufferDesc *buf, bool forInput) +StartBufferIO(BufferDesc *buf, bool forInput, bool nowait) { uint32 buf_state; - ResourceOwnerEnlargeBufferIOs(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); for (;;) { @@ -5119,6 +5542,8 @@ StartBufferIO(BufferDesc *buf, bool forInput) if (!(buf_state & BM_IO_IN_PROGRESS)) break; UnlockBufHdr(buf, buf_state); + if (nowait) + return false; WaitIO(buf); } @@ -5155,9 +5580,14 @@ StartBufferIO(BufferDesc *buf, bool forInput) * set_flag_bits gets ORed into the buffer's flags. It must include * BM_IO_ERROR in a failure case. For successful completion it could * be 0, or BM_VALID if we just finished reading in the page. + * + * If forget_owner is true, we release the buffer I/O from the current + * resource owner. (forget_owner=false is used when the resource owner itself + * is being released) */ static void -TerminateBufferIO(BufferDesc *buf, bool clear_dirty, uint32 set_flag_bits) +TerminateBufferIO(BufferDesc *buf, bool clear_dirty, uint32 set_flag_bits, + bool forget_owner) { uint32 buf_state; @@ -5172,8 +5602,9 @@ TerminateBufferIO(BufferDesc *buf, bool clear_dirty, uint32 set_flag_bits) buf_state |= set_flag_bits; UnlockBufHdr(buf, buf_state); - ResourceOwnerForgetBufferIO(CurrentResourceOwner, - BufferDescriptorGetBuffer(buf)); + if (forget_owner) + ResourceOwnerForgetBufferIO(CurrentResourceOwner, + BufferDescriptorGetBuffer(buf)); ConditionVariableBroadcast(BufferDescriptorGetIOCV(buf)); } @@ -5186,8 +5617,12 @@ TerminateBufferIO(BufferDesc *buf, bool clear_dirty, uint32 set_flag_bits) * * If I/O was in progress, we always set BM_IO_ERROR, even though it's * possible the error condition wasn't related to the I/O. + * + * Note: this does not remove the buffer I/O from the resource owner. + * That's correct when we're releasing the whole resource owner, but + * beware if you use this in other contexts. */ -void +static void AbortBufferIO(Buffer buffer) { BufferDesc *buf_hdr = GetBufferDescriptor(buffer - 1); @@ -5223,7 +5658,7 @@ AbortBufferIO(Buffer buffer) } } - TerminateBufferIO(buf_hdr, false, BM_IO_ERROR); + TerminateBufferIO(buf_hdr, false, BM_IO_ERROR, false); } /* @@ -5257,7 +5692,7 @@ local_buffer_write_error_callback(void *arg) if (bufHdr != NULL) { char *path = relpathbackend(BufTagGetRelFileLocator(&bufHdr->tag), - MyBackendId, + MyProcNumber, BufTagGetForkNum(&bufHdr->tag)); errcontext("writing block %u of relation %s", @@ -5511,7 +5946,7 @@ IssuePendingWritebacks(WritebackContext *wb_context, IOContext io_context) sort_pending_writebacks(wb_context->pending_writebacks, wb_context->nr_pending); - io_start = pgstat_prepare_io_time(); + io_start = pgstat_prepare_io_time(track_io_timing); /* * Coalesce neighbouring writes, but nothing else. For that we iterate @@ -5562,7 +5997,7 @@ IssuePendingWritebacks(WritebackContext *wb_context, IOContext io_context) i += ahead; /* and finally tell the kernel to write the data to storage */ - reln = smgropen(currlocator, InvalidBackendId); + reln = smgropen(currlocator, INVALID_PROC_NUMBER); smgrwriteback(reln, BufTagGetForkNum(&tag), tag.blockNum, nblocks); } @@ -5576,19 +6011,104 @@ IssuePendingWritebacks(WritebackContext *wb_context, IOContext io_context) wb_context->nr_pending = 0; } +/* ResourceOwner callbacks */ + +static void +ResOwnerReleaseBufferIO(Datum res) +{ + Buffer buffer = DatumGetInt32(res); + + AbortBufferIO(buffer); +} + +static char * +ResOwnerPrintBufferIO(Datum res) +{ + Buffer buffer = DatumGetInt32(res); + + return psprintf("lost track of buffer IO on buffer %d", buffer); +} + +static void +ResOwnerReleaseBufferPin(Datum res) +{ + Buffer buffer = DatumGetInt32(res); + + /* Like ReleaseBuffer, but don't call ResourceOwnerForgetBuffer */ + if (!BufferIsValid(buffer)) + elog(ERROR, "bad buffer ID: %d", buffer); + + if (BufferIsLocal(buffer)) + UnpinLocalBufferNoOwner(buffer); + else + UnpinBufferNoOwner(GetBufferDescriptor(buffer - 1)); +} + +static char * +ResOwnerPrintBufferPin(Datum res) +{ + return DebugPrintBufferRefcount(DatumGetInt32(res)); +} /* - * Implement slower/larger portions of TestForOldSnapshot + * Try to evict the current block in a shared buffer. + * + * This function is intended for testing/development use only! + * + * To succeed, the buffer must not be pinned on entry, so if the caller had a + * particular block in mind, it might already have been replaced by some other + * block by the time this function runs. It's also unpinned on return, so the + * buffer might be occupied again by the time control is returned, potentially + * even by the same block. This inherent raciness without other interlocking + * makes the function unsuitable for non-testing usage. * - * Smaller/faster portions are put inline, but the entire set of logic is too - * big for that. + * Returns true if the buffer was valid and it has now been made invalid. + * Returns false if it wasn't valid, if it couldn't be evicted due to a pin, + * or if the buffer becomes dirty again while we're trying to write it out. */ -void -TestForOldSnapshot_impl(Snapshot snapshot, Relation relation) +bool +EvictUnpinnedBuffer(Buffer buf) { - if (RelationAllowsEarlyPruning(relation) - && (snapshot)->whenTaken < GetOldSnapshotThresholdTimestamp()) - ereport(ERROR, - (errcode(ERRCODE_SNAPSHOT_TOO_OLD), - errmsg("snapshot too old"))); + BufferDesc *desc; + uint32 buf_state; + bool result; + + /* Make sure we can pin the buffer. */ + ResourceOwnerEnlarge(CurrentResourceOwner); + ReservePrivateRefCountEntry(); + + Assert(!BufferIsLocal(buf)); + desc = GetBufferDescriptor(buf - 1); + + /* Lock the header and check if it's valid. */ + buf_state = LockBufHdr(desc); + if ((buf_state & BM_VALID) == 0) + { + UnlockBufHdr(desc, buf_state); + return false; + } + + /* Check that it's not pinned already. */ + if (BUF_STATE_GET_REFCOUNT(buf_state) > 0) + { + UnlockBufHdr(desc, buf_state); + return false; + } + + PinBuffer_Locked(desc); /* releases spinlock */ + + /* If it was dirty, try to clean it once. */ + if (buf_state & BM_DIRTY) + { + LWLockAcquire(BufferDescriptorGetContentLock(desc), LW_SHARED); + FlushBuffer(desc, NULL, IOOBJECT_RELATION, IOCONTEXT_NORMAL); + LWLockRelease(BufferDescriptorGetContentLock(desc)); + } + + /* This will return false if it becomes dirty or someone else pins it. */ + result = InvalidateVictimBuffer(desc); + + UnpinBuffer(desc); + + return result; } diff --git a/src/backend/storage/buffer/freelist.c b/src/backend/storage/buffer/freelist.c index 1c804fd2f5973..13bf87c74cab7 100644 --- a/src/backend/storage/buffer/freelist.c +++ b/src/backend/storage/buffer/freelist.c @@ -4,7 +4,7 @@ * routines for managing the buffer pool's replacement strategy. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -380,10 +380,10 @@ StrategyFreeBuffer(BufferDesc *buf) } /* - * StrategySyncStart -- tell BufferSync where to start syncing + * StrategySyncStart -- tell BgBufferSync where to start syncing * * The result is the buffer index of the best buffer to sync first. - * BufferSync() will proceed circularly around the buffer array from there. + * BgBufferSync() will proceed circularly around the buffer array from there. * * In addition, we return the completed-pass count (which is effectively * the higher-order bits of nextVictimBuffer) and the count of recent buffer @@ -561,7 +561,7 @@ GetAccessStrategy(BufferAccessStrategyType btype) ring_size_kb = 16 * 1024; break; case BAS_VACUUM: - ring_size_kb = 256; + ring_size_kb = 2048; break; default: @@ -629,6 +629,48 @@ GetAccessStrategyBufferCount(BufferAccessStrategy strategy) return strategy->nbuffers; } +/* + * GetAccessStrategyPinLimit -- get cap of number of buffers that should be pinned + * + * When pinning extra buffers to look ahead, users of a ring-based strategy are + * in danger of pinning too much of the ring at once while performing look-ahead. + * For some strategies, that means "escaping" from the ring, and in others it + * means forcing dirty data to disk very frequently with associated WAL + * flushing. Since external code has no insight into any of that, allow + * individual strategy types to expose a clamp that should be applied when + * deciding on a maximum number of buffers to pin at once. + * + * Callers should combine this number with other relevant limits and take the + * minimum. + */ +int +GetAccessStrategyPinLimit(BufferAccessStrategy strategy) +{ + if (strategy == NULL) + return NBuffers; + + switch (strategy->btype) + { + case BAS_BULKREAD: + + /* + * Since BAS_BULKREAD uses StrategyRejectBuffer(), dirty buffers + * shouldn't be a problem and the caller is free to pin up to the + * entire ring at once. + */ + return strategy->nbuffers; + + default: + + /* + * Tell caller not to pin more than half the buffers in the ring. + * This is a trade-off between look ahead distance and deferring + * writeback and associated WAL traffic. + */ + return strategy->nbuffers / 2; + } +} + /* * FreeAccessStrategy -- release a BufferAccessStrategy object * diff --git a/src/backend/storage/buffer/localbuf.c b/src/backend/storage/buffer/localbuf.c index f684862d98c08..8da7dd6c98ae4 100644 --- a/src/backend/storage/buffer/localbuf.c +++ b/src/backend/storage/buffer/localbuf.c @@ -4,7 +4,7 @@ * local buffer manager. Fast buffer manager for temporary tables, * which never need to be WAL-logged or checkpointed, etc. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * @@ -16,14 +16,14 @@ #include "postgres.h" #include "access/parallel.h" -#include "catalog/catalog.h" #include "executor/instrument.h" #include "pgstat.h" #include "storage/buf_internals.h" #include "storage/bufmgr.h" +#include "storage/fd.h" #include "utils/guc_hooks.h" #include "utils/memutils.h" -#include "utils/resowner_private.h" +#include "utils/resowner.h" /*#define LBDEBUG*/ @@ -93,7 +93,7 @@ PrefetchLocalBuffer(SMgrRelation smgr, ForkNumber forkNum, #ifdef USE_PREFETCH /* Not in buffers, so initiate prefetch */ if ((io_direct_flags & IO_DIRECT_DATA) == 0 && - smgrprefetch(smgr, forkNum, blockNum)) + smgrprefetch(smgr, forkNum, blockNum, 1)) { result.initiated_io = true; } @@ -108,10 +108,9 @@ PrefetchLocalBuffer(SMgrRelation smgr, ForkNumber forkNum, * LocalBufferAlloc - * Find or create a local buffer for the given page of the given relation. * - * API is similar to bufmgr.c's BufferAlloc, except that we do not need - * to do any locking since this is all local. Also, IO_IN_PROGRESS - * does not get set. Lastly, we support only default access strategy - * (hence, usage_count is always advanced). + * API is similar to bufmgr.c's BufferAlloc, except that we do not need to do + * any locking since this is all local. We support only default access + * strategy (hence, usage_count is always advanced). */ BufferDesc * LocalBufferAlloc(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum, @@ -130,6 +129,8 @@ LocalBufferAlloc(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum, if (LocalBufHash == NULL) InitLocalBuffers(); + ResourceOwnerEnlarge(CurrentResourceOwner); + /* See if the desired buffer already exists */ hresult = (LocalBufferLookupEnt *) hash_search(LocalBufHash, &newTag, HASH_FIND, NULL); @@ -180,7 +181,7 @@ GetLocalVictimBuffer(void) uint32 buf_state; BufferDesc *bufHdr; - ResourceOwnerEnlargeBuffers(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); /* * Need to get a new buffer. We use a clock sweep algorithm (essentially @@ -239,11 +240,11 @@ GetLocalVictimBuffer(void) Page localpage = (char *) LocalBufHdrGetBlock(bufHdr); /* Find smgr relation for buffer */ - oreln = smgropen(BufTagGetRelFileLocator(&bufHdr->tag), MyBackendId); + oreln = smgropen(BufTagGetRelFileLocator(&bufHdr->tag), MyProcNumber); PageSetChecksumInplace(localpage, bufHdr->tag.blockNum); - io_start = pgstat_prepare_io_time(); + io_start = pgstat_prepare_io_time(track_io_timing); /* And write... */ smgrwrite(oreln, @@ -285,7 +286,7 @@ GetLocalVictimBuffer(void) } /* see LimitAdditionalPins() */ -static void +void LimitAdditionalLocalPins(uint32 *additional_pins) { uint32 max_pins; @@ -295,9 +296,10 @@ LimitAdditionalLocalPins(uint32 *additional_pins) /* * In contrast to LimitAdditionalPins() other backends don't play a role - * here. We can allow up to NLocBuffer pins in total. + * here. We can allow up to NLocBuffer pins in total, but it might not be + * initialized yet so read num_temp_buffers. */ - max_pins = (NLocBuffer - NLocalPinnedBuffers); + max_pins = (num_temp_buffers - NLocalPinnedBuffers); if (*additional_pins >= max_pins) *additional_pins = max_pins; @@ -308,7 +310,7 @@ LimitAdditionalLocalPins(uint32 *additional_pins) * temporary buffers. */ BlockNumber -ExtendBufferedRelLocal(ExtendBufferedWhat eb, +ExtendBufferedRelLocal(BufferManagerRelation bmr, ForkNumber fork, uint32 flags, uint32 extend_by, @@ -338,7 +340,7 @@ ExtendBufferedRelLocal(ExtendBufferedWhat eb, MemSet((char *) buf_block, 0, BLCKSZ); } - first_block = smgrnblocks(eb.smgr, fork); + first_block = smgrnblocks(bmr.smgr, fork); if (extend_upto != InvalidBlockNumber) { @@ -357,10 +359,10 @@ ExtendBufferedRelLocal(ExtendBufferedWhat eb, ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), errmsg("cannot extend relation %s beyond %u blocks", - relpath(eb.smgr->smgr_rlocator, fork), + relpath(bmr.smgr->smgr_rlocator, fork), MaxBlockNumber))); - for (int i = 0; i < extend_by; i++) + for (uint32 i = 0; i < extend_by; i++) { int victim_buf_id; BufferDesc *victim_buf_hdr; @@ -371,13 +373,16 @@ ExtendBufferedRelLocal(ExtendBufferedWhat eb, victim_buf_id = -buffers[i] - 1; victim_buf_hdr = GetLocalBufferDescriptor(victim_buf_id); - InitBufferTag(&tag, &eb.smgr->smgr_rlocator.locator, fork, first_block + i); + /* in case we need to pin an existing buffer below */ + ResourceOwnerEnlarge(CurrentResourceOwner); + + InitBufferTag(&tag, &bmr.smgr->smgr_rlocator.locator, fork, first_block + i); hresult = (LocalBufferLookupEnt *) hash_search(LocalBufHash, (void *) &tag, HASH_ENTER, &found); if (found) { - BufferDesc *existing_hdr = GetLocalBufferDescriptor(hresult->id); + BufferDesc *existing_hdr; uint32 buf_state; UnpinLocalBuffer(BufferDescriptorGetBuffer(victim_buf_hdr)); @@ -389,7 +394,7 @@ ExtendBufferedRelLocal(ExtendBufferedWhat eb, buf_state = pg_atomic_read_u32(&existing_hdr->state); Assert(buf_state & BM_TAG_VALID); Assert(!(buf_state & BM_DIRTY)); - buf_state &= BM_VALID; + buf_state &= ~BM_VALID; pg_atomic_unlocked_write_u32(&existing_hdr->state, buf_state); } else @@ -408,15 +413,15 @@ ExtendBufferedRelLocal(ExtendBufferedWhat eb, } } - io_start = pgstat_prepare_io_time(); + io_start = pgstat_prepare_io_time(track_io_timing); /* actually extend relation */ - smgrzeroextend(eb.smgr, fork, first_block, extend_by, false); + smgrzeroextend(bmr.smgr, fork, first_block, extend_by, false); pgstat_count_io_op_time(IOOBJECT_TEMP_RELATION, IOCONTEXT_NORMAL, IOOP_EXTEND, io_start, extend_by); - for (int i = 0; i < extend_by; i++) + for (uint32 i = 0; i < extend_by; i++) { Buffer buf = buffers[i]; BufferDesc *buf_hdr; @@ -431,7 +436,7 @@ ExtendBufferedRelLocal(ExtendBufferedWhat eb, *extended_by = extend_by; - pgBufferUsage.temp_blks_written += extend_by; + pgBufferUsage.local_blks_written += extend_by; return first_block; } @@ -503,7 +508,7 @@ DropRelationLocalBuffers(RelFileLocator rlocator, ForkNumber forkNum, elog(ERROR, "block %u of %s is still referenced (local %u)", bufHdr->tag.blockNum, relpathbackend(BufTagGetRelFileLocator(&bufHdr->tag), - MyBackendId, + MyProcNumber, BufTagGetForkNum(&bufHdr->tag)), LocalRefCount[i]); @@ -548,7 +553,7 @@ DropRelationAllLocalBuffers(RelFileLocator rlocator) elog(ERROR, "block %u of %s is still referenced (local %u)", bufHdr->tag.blockNum, relpathbackend(BufTagGetRelFileLocator(&bufHdr->tag), - MyBackendId, + MyProcNumber, BufTagGetForkNum(&bufHdr->tag)), LocalRefCount[i]); /* Remove entry from hashtable */ @@ -643,6 +648,8 @@ InitLocalBuffers(void) * XXX: We could have a slightly more efficient version of PinLocalBuffer() * that does not support adjusting the usagecount - but so far it does not * seem worth the trouble. + * + * Note that ResourceOwnerEnlarge() must have been done already. */ bool PinLocalBuffer(BufferDesc *buf_hdr, bool adjust_usagecount) @@ -672,6 +679,13 @@ PinLocalBuffer(BufferDesc *buf_hdr, bool adjust_usagecount) void UnpinLocalBuffer(Buffer buffer) +{ + UnpinLocalBufferNoOwner(buffer); + ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer); +} + +void +UnpinLocalBufferNoOwner(Buffer buffer) { int buffid = -buffer - 1; @@ -679,7 +693,6 @@ UnpinLocalBuffer(Buffer buffer) Assert(LocalRefCount[buffid] > 0); Assert(NLocalPinnedBuffers > 0); - ResourceOwnerForgetBuffer(CurrentResourceOwner, buffer); if (--LocalRefCount[buffid] == 0) NLocalPinnedBuffers--; } @@ -783,8 +796,12 @@ CheckForLocalBufferLeaks(void) if (LocalRefCount[i] != 0) { Buffer b = -i - 1; + char *s; + + s = DebugPrintBufferRefcount(b); + elog(WARNING, "local buffer refcount leak: %s", s); + pfree(s); - PrintBufferLeakWarning(b); RefCountErrors++; } } diff --git a/src/backend/storage/buffer/meson.build b/src/backend/storage/buffer/meson.build index ea2f9c045a072..f152dbb0702e3 100644 --- a/src/backend/storage/buffer/meson.build +++ b/src/backend/storage/buffer/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'buf_init.c', diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c index 41ab64100e3b2..a44a34eeae180 100644 --- a/src/backend/storage/file/buffile.c +++ b/src/backend/storage/file/buffile.c @@ -3,7 +3,7 @@ * buffile.c * Management of large buffered temporary files. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -49,8 +49,8 @@ #include "executor/instrument.h" #include "miscadmin.h" #include "pgstat.h" -#include "storage/buf_internals.h" #include "storage/buffile.h" +#include "storage/bufmgr.h" #include "storage/fd.h" #include "utils/resowner.h" @@ -459,7 +459,7 @@ BufFileLoadBuffer(BufFile *file) */ file->nbytes = FileRead(thisfile, file->buffer.data, - sizeof(file->buffer), + sizeof(file->buffer.data), file->curOffset, WAIT_EVENT_BUFFILE_READ); if (file->nbytes < 0) @@ -841,14 +841,14 @@ BufFileTell(BufFile *file, int *fileno, off_t *offset) * * Performs absolute seek to the start of the n'th BLCKSZ-sized block of * the file. Note that users of this interface will fail if their files - * exceed BLCKSZ * LONG_MAX bytes, but that is quite a lot; we don't work - * with tables bigger than that, either... + * exceed BLCKSZ * PG_INT64_MAX bytes, but that is quite a lot; we don't + * work with tables bigger than that, either... * * Result is 0 if OK, EOF if not. Logical position is not moved if an * impossible seek is attempted. */ int -BufFileSeekBlock(BufFile *file, long blknum) +BufFileSeekBlock(BufFile *file, int64 blknum) { return BufFileSeek(file, (int) (blknum / BUFFILE_SEG_SIZE), @@ -856,24 +856,6 @@ BufFileSeekBlock(BufFile *file, long blknum) SEEK_SET); } -#ifdef NOT_USED -/* - * BufFileTellBlock --- block-oriented tell - * - * Any fractional part of a block in the current seek position is ignored. - */ -long -BufFileTellBlock(BufFile *file) -{ - long blknum; - - blknum = (file->curOffset + file->pos) / BLCKSZ; - blknum += file->curFile * BUFFILE_SEG_SIZE; - return blknum; -} - -#endif - /* * Return the current fileset based BufFile size. * @@ -919,10 +901,10 @@ BufFileSize(BufFile *file) * begins. Caller should apply this as an offset when working off block * positions that are in terms of the original BufFile space. */ -long +int64 BufFileAppend(BufFile *target, BufFile *source) { - long startBlock = target->numFiles * BUFFILE_SEG_SIZE; + int64 startBlock = (int64) target->numFiles * BUFFILE_SEG_SIZE; int newNumFiles = target->numFiles + source->numFiles; int i; diff --git a/src/backend/storage/file/copydir.c b/src/backend/storage/file/copydir.c index e04bc3941ae24..d4fbe542077f1 100644 --- a/src/backend/storage/file/copydir.c +++ b/src/backend/storage/file/copydir.c @@ -3,7 +3,7 @@ * copydir.c * copies a directory * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * While "xcopy /e /i /q" works fine for copying directories, on Windows XP diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index 3c2a2fbef7318..a7c05b0a6fd86 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -3,7 +3,7 @@ * fd.c * Virtual file descriptor code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -99,7 +99,7 @@ #include "storage/ipc.h" #include "utils/guc.h" #include "utils/guc_hooks.h" -#include "utils/resowner_private.h" +#include "utils/resowner.h" #include "utils/varlena.h" /* Define PG_FLUSH_DATA_WORKS if we have an implementation for pg_flush_data */ @@ -162,7 +162,7 @@ int max_safe_fds = FD_MINFREE; /* default if not changed */ bool data_sync_retry = false; /* How SyncDataDirectory() should do its job. */ -int recovery_init_sync_method = RECOVERY_INIT_SYNC_METHOD_FSYNC; +int recovery_init_sync_method = DATA_DIR_SYNC_METHOD_FSYNC; /* Which kinds of files should be opened with PG_O_DIRECT. */ int io_direct_flags; @@ -249,7 +249,7 @@ typedef enum AllocateDescFile, AllocateDescPipe, AllocateDescDir, - AllocateDescRawFD + AllocateDescRawFD, } AllocateDescKind; typedef struct @@ -354,6 +354,31 @@ static void unlink_if_exists_fname(const char *fname, bool isdir, int elevel); static int fsync_parent_path(const char *fname, int elevel); +/* ResourceOwner callbacks to hold virtual file descriptors */ +static void ResOwnerReleaseFile(Datum res); +static char *ResOwnerPrintFile(Datum res); + +static const ResourceOwnerDesc file_resowner_desc = +{ + .name = "File", + .release_phase = RESOURCE_RELEASE_AFTER_LOCKS, + .release_priority = RELEASE_PRIO_FILES, + .ReleaseResource = ResOwnerReleaseFile, + .DebugPrint = ResOwnerPrintFile +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberFile(ResourceOwner owner, File file) +{ + ResourceOwnerRemember(owner, Int32GetDatum(file), &file_resowner_desc); +} +static inline void +ResourceOwnerForgetFile(ResourceOwner owner, File file) +{ + ResourceOwnerForget(owner, Int32GetDatum(file), &file_resowner_desc); +} + /* * pg_fsync --- do fsync with or without writethrough */ @@ -398,9 +423,9 @@ pg_fsync(int fd) errno = 0; #endif - /* #if is to skip the sync_method test if there's no need for it */ -#if defined(HAVE_FSYNC_WRITETHROUGH) && !defined(FSYNC_WRITETHROUGH_IS_FSYNC) - if (sync_method == SYNC_METHOD_FSYNC_WRITETHROUGH) + /* #if is to skip the wal_sync_method test if there's no need for it */ +#if defined(HAVE_FSYNC_WRITETHROUGH) + if (wal_sync_method == WAL_SYNC_METHOD_FSYNC_WRITETHROUGH) return pg_fsync_writethrough(fd); else #endif @@ -437,9 +462,7 @@ pg_fsync_writethrough(int fd) { if (enableFsync) { -#ifdef WIN32 - return _commit(fd); -#elif defined(F_FULLFSYNC) +#if defined(F_FULLFSYNC) return (fcntl(fd, F_FULLFSYNC, 0) == -1) ? -1 : 0; #else errno = ENOSYS; @@ -470,6 +493,29 @@ pg_fdatasync(int fd) return rc; } +/* + * pg_file_exists -- check that a file exists. + * + * This requires an absolute path to the file. Returns true if the file is + * not a directory, false otherwise. + */ +bool +pg_file_exists(const char *name) +{ + struct stat st; + + Assert(name != NULL); + + if (stat(name, &st) == 0) + return !S_ISDIR(st.st_mode); + else if (!(errno == ENOENT || errno == ENOTDIR || errno == EACCES)) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not access file \"%s\": %m", name))); + + return false; +} + /* * pg_flush_data --- advise OS that the described dirty data should be flushed * @@ -1494,7 +1540,7 @@ ReportTemporaryFileUsage(const char *path, off_t size) /* * Called to register a temporary file for automatic close. - * ResourceOwnerEnlargeFiles(CurrentResourceOwner) must have been called + * ResourceOwnerEnlarge(CurrentResourceOwner) must have been called * before the file was opened. */ static void @@ -1686,7 +1732,7 @@ OpenTemporaryFile(bool interXact) * open it, if we'll be registering it below. */ if (!interXact) - ResourceOwnerEnlargeFiles(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); /* * If some temp tablespace(s) have been given to us, try to use the next @@ -1818,7 +1864,7 @@ PathNameCreateTemporaryFile(const char *path, bool error_on_failure) Assert(temporary_files_allowed); /* check temp file access is up */ - ResourceOwnerEnlargeFiles(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); /* * Open the file. Note: we don't use O_EXCL, in case there is an orphaned @@ -1858,7 +1904,7 @@ PathNameOpenTemporaryFile(const char *path, int mode) Assert(temporary_files_allowed); /* check temp file access is up */ - ResourceOwnerEnlargeFiles(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); file = PathNameOpenFile(path, mode | PG_BINARY); @@ -2086,19 +2132,19 @@ FileWriteback(File file, off_t offset, off_t nbytes, uint32 wait_event_info) pgstat_report_wait_end(); } -int -FileRead(File file, void *buffer, size_t amount, off_t offset, - uint32 wait_event_info) +ssize_t +FileReadV(File file, const struct iovec *iov, int iovcnt, off_t offset, + uint32 wait_event_info) { - int returnCode; + ssize_t returnCode; Vfd *vfdP; Assert(FileIsValid(file)); - DO_DB(elog(LOG, "FileRead: %d (%s) " INT64_FORMAT " %zu %p", + DO_DB(elog(LOG, "FileReadV: %d (%s) " INT64_FORMAT " %d", file, VfdCache[file].fileName, (int64) offset, - amount, buffer)); + iovcnt)); returnCode = FileAccess(file); if (returnCode < 0) @@ -2108,7 +2154,7 @@ FileRead(File file, void *buffer, size_t amount, off_t offset, retry: pgstat_report_wait_start(wait_event_info); - returnCode = pg_pread(vfdP->fd, buffer, amount, offset); + returnCode = pg_preadv(vfdP->fd, iov, iovcnt, offset); pgstat_report_wait_end(); if (returnCode < 0) @@ -2142,19 +2188,19 @@ FileRead(File file, void *buffer, size_t amount, off_t offset, return returnCode; } -int -FileWrite(File file, const void *buffer, size_t amount, off_t offset, - uint32 wait_event_info) +ssize_t +FileWriteV(File file, const struct iovec *iov, int iovcnt, off_t offset, + uint32 wait_event_info) { - int returnCode; + ssize_t returnCode; Vfd *vfdP; Assert(FileIsValid(file)); - DO_DB(elog(LOG, "FileWrite: %d (%s) " INT64_FORMAT " %zu %p", + DO_DB(elog(LOG, "FileWriteV: %d (%s) " INT64_FORMAT " %d", file, VfdCache[file].fileName, (int64) offset, - amount, buffer)); + iovcnt)); returnCode = FileAccess(file); if (returnCode < 0) @@ -2172,7 +2218,10 @@ FileWrite(File file, const void *buffer, size_t amount, off_t offset, */ if (temp_file_limit >= 0 && (vfdP->fdstate & FD_TEMP_FILE_LIMIT)) { - off_t past_write = offset + amount; + off_t past_write = offset; + + for (int i = 0; i < iovcnt; ++i) + past_write += iov[i].iov_len; if (past_write > vfdP->fileSize) { @@ -2188,23 +2237,27 @@ FileWrite(File file, const void *buffer, size_t amount, off_t offset, } retry: - errno = 0; pgstat_report_wait_start(wait_event_info); - returnCode = pg_pwrite(VfdCache[file].fd, buffer, amount, offset); + returnCode = pg_pwritev(vfdP->fd, iov, iovcnt, offset); pgstat_report_wait_end(); - /* if write didn't set errno, assume problem is no disk space */ - if (returnCode != amount && errno == 0) - errno = ENOSPC; - if (returnCode >= 0) { + /* + * Some callers expect short writes to set errno, and traditionally we + * have assumed that they imply disk space shortage. We don't want to + * waste CPU cycles adding up the total size here, so we'll just set + * it for all successful writes in case such a caller determines that + * the write was short and ereports "%m". + */ + errno = ENOSPC; + /* * Maintain fileSize and temporary_files_size if it's a temp file. */ if (vfdP->fdstate & FD_TEMP_FILE_LIMIT) { - off_t past_write = offset + amount; + off_t past_write = offset + returnCode; if (past_write > vfdP->fileSize) { @@ -2216,7 +2269,7 @@ FileWrite(File file, const void *buffer, size_t amount, off_t offset, else { /* - * See comments in FileRead() + * See comments in FileReadV() */ #ifdef WIN32 DWORD error = GetLastError(); @@ -3515,7 +3568,7 @@ SyncDataDirectory(void) } #ifdef HAVE_SYNCFS - if (recovery_init_sync_method == RECOVERY_INIT_SYNC_METHOD_SYNCFS) + if (recovery_init_sync_method == DATA_DIR_SYNC_METHOD_SYNCFS) { DIR *dir; struct dirent *de; @@ -3886,7 +3939,7 @@ data_sync_elevel(int elevel) } bool -check_io_direct(char **newval, void **extra, GucSource source) +check_debug_io_direct(char **newval, void **extra, GucSource source) { bool result = true; int flags; @@ -3894,7 +3947,7 @@ check_io_direct(char **newval, void **extra, GucSource source) #if PG_O_DIRECT == 0 if (strcmp(*newval, "") != 0) { - GUC_check_errdetail("debug_io_direct is not supported on this platform."); + GUC_check_errdetail("\"debug_io_direct\" is not supported on this platform."); result = false; } flags = 0; @@ -3908,7 +3961,7 @@ check_io_direct(char **newval, void **extra, GucSource source) if (!SplitGUCList(rawstring, ',', &elemlist)) { - GUC_check_errdetail("invalid list syntax in parameter \"%s\"", + GUC_check_errdetail("Invalid list syntax in parameter \"%s\"", "debug_io_direct"); pfree(rawstring); list_free(elemlist); @@ -3928,7 +3981,7 @@ check_io_direct(char **newval, void **extra, GucSource source) flags |= IO_DIRECT_WAL_INIT; else { - GUC_check_errdetail("invalid option \"%s\"", item); + GUC_check_errdetail("Invalid option \"%s\"", item); result = false; break; } @@ -3941,14 +3994,14 @@ check_io_direct(char **newval, void **extra, GucSource source) #if XLOG_BLCKSZ < PG_IO_ALIGN_SIZE if (result && (flags & (IO_DIRECT_WAL | IO_DIRECT_WAL_INIT))) { - GUC_check_errdetail("debug_io_direct is not supported for WAL because XLOG_BLCKSZ is too small"); + GUC_check_errdetail("\"debug_io_direct\" is not supported for WAL because XLOG_BLCKSZ is too small"); result = false; } #endif #if BLCKSZ < PG_IO_ALIGN_SIZE if (result && (flags & IO_DIRECT_DATA)) { - GUC_check_errdetail("debug_io_direct is not supported for data because BLCKSZ is too small"); + GUC_check_errdetail("\"debug_io_direct\" is not supported for data because BLCKSZ is too small"); result = false; } #endif @@ -3960,7 +4013,7 @@ check_io_direct(char **newval, void **extra, GucSource source) if (!result) return result; - /* Save the flags in *extra, for use by assign_io_direct */ + /* Save the flags in *extra, for use by assign_debug_io_direct */ *extra = guc_malloc(ERROR, sizeof(int)); *((int *) *extra) = flags; @@ -3968,9 +4021,31 @@ check_io_direct(char **newval, void **extra, GucSource source) } extern void -assign_io_direct(const char *newval, void *extra) +assign_debug_io_direct(const char *newval, void *extra) { int *flags = (int *) extra; io_direct_flags = *flags; } + +/* ResourceOwner callbacks */ + +static void +ResOwnerReleaseFile(Datum res) +{ + File file = (File) DatumGetInt32(res); + Vfd *vfdP; + + Assert(FileIsValid(file)); + + vfdP = &VfdCache[file]; + vfdP->resowner = NULL; + + FileClose(file); +} + +static char * +ResOwnerPrintFile(Datum res) +{ + return psprintf("File %d", DatumGetInt32(res)); +} diff --git a/src/backend/storage/file/fileset.c b/src/backend/storage/file/fileset.c index e9951b0269419..5746b8f935f9b 100644 --- a/src/backend/storage/file/fileset.c +++ b/src/backend/storage/file/fileset.c @@ -3,7 +3,7 @@ * fileset.c * Management of named temporary files. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -23,13 +23,11 @@ #include -#include "catalog/pg_tablespace.h" #include "commands/tablespace.h" +#include "common/file_utils.h" #include "common/hashfn.h" #include "miscadmin.h" -#include "storage/ipc.h" #include "storage/fileset.h" -#include "utils/builtins.h" static void FileSetPath(char *path, FileSet *fileset, Oid tablespace); static void FilePath(char *path, FileSet *fileset, const char *name); diff --git a/src/backend/storage/file/meson.build b/src/backend/storage/file/meson.build index e7fe850ccbed7..662bb1f4d372c 100644 --- a/src/backend/storage/file/meson.build +++ b/src/backend/storage/file/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'buffile.c', diff --git a/src/backend/storage/file/reinit.c b/src/backend/storage/file/reinit.c index fb55371b1b51d..f1cd1a38d95d4 100644 --- a/src/backend/storage/file/reinit.c +++ b/src/backend/storage/file/reinit.c @@ -3,7 +3,7 @@ * reinit.c * Reinitialization of unlogged relations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -31,7 +31,7 @@ static void ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, typedef struct { - Oid reloid; /* hash key */ + RelFileNumber relnumber; /* hash key */ } unlogged_relation_entry; /* @@ -195,12 +195,13 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) while ((de = ReadDir(dbspace_dir, dbspacedirname)) != NULL) { ForkNumber forkNum; - int relnumchars; + unsigned segno; unlogged_relation_entry ent; /* Skip anything that doesn't look like a relation data file. */ - if (!parse_filename_for_nontemp_relation(de->d_name, &relnumchars, - &forkNum)) + if (!parse_filename_for_nontemp_relation(de->d_name, + &ent.relnumber, + &forkNum, &segno)) continue; /* Also skip it unless this is the init fork. */ @@ -208,10 +209,8 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) continue; /* - * Put the OID portion of the name into the hash table, if it - * isn't already. + * Put the RelFileNumber into the hash table, if it isn't already. */ - ent.reloid = atooid(de->d_name); (void) hash_search(hash, &ent, HASH_ENTER, NULL); } @@ -235,12 +234,13 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) while ((de = ReadDir(dbspace_dir, dbspacedirname)) != NULL) { ForkNumber forkNum; - int relnumchars; + unsigned segno; unlogged_relation_entry ent; /* Skip anything that doesn't look like a relation data file. */ - if (!parse_filename_for_nontemp_relation(de->d_name, &relnumchars, - &forkNum)) + if (!parse_filename_for_nontemp_relation(de->d_name, + &ent.relnumber, + &forkNum, &segno)) continue; /* We never remove the init fork. */ @@ -251,7 +251,6 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) * See whether the OID portion of the name shows up in the hash * table. If so, nuke it! */ - ent.reloid = atooid(de->d_name); if (hash_search(hash, &ent, HASH_FIND, NULL)) { snprintf(rm_path, sizeof(rm_path), "%s/%s", @@ -285,14 +284,14 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) while ((de = ReadDir(dbspace_dir, dbspacedirname)) != NULL) { ForkNumber forkNum; - int relnumchars; - char relnumbuf[OIDCHARS + 1]; + RelFileNumber relNumber; + unsigned segno; char srcpath[MAXPGPATH * 2]; char dstpath[MAXPGPATH]; /* Skip anything that doesn't look like a relation data file. */ - if (!parse_filename_for_nontemp_relation(de->d_name, &relnumchars, - &forkNum)) + if (!parse_filename_for_nontemp_relation(de->d_name, &relNumber, + &forkNum, &segno)) continue; /* Also skip it unless this is the init fork. */ @@ -304,11 +303,12 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) dbspacedirname, de->d_name); /* Construct destination pathname. */ - memcpy(relnumbuf, de->d_name, relnumchars); - relnumbuf[relnumchars] = '\0'; - snprintf(dstpath, sizeof(dstpath), "%s/%s%s", - dbspacedirname, relnumbuf, de->d_name + relnumchars + 1 + - strlen(forkNames[INIT_FORKNUM])); + if (segno == 0) + snprintf(dstpath, sizeof(dstpath), "%s/%u", + dbspacedirname, relNumber); + else + snprintf(dstpath, sizeof(dstpath), "%s/%u.%u", + dbspacedirname, relNumber, segno); /* OK, we're ready to perform the actual copy. */ elog(DEBUG2, "copying %s to %s", srcpath, dstpath); @@ -327,14 +327,14 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) dbspace_dir = AllocateDir(dbspacedirname); while ((de = ReadDir(dbspace_dir, dbspacedirname)) != NULL) { + RelFileNumber relNumber; ForkNumber forkNum; - int relnumchars; - char relnumbuf[OIDCHARS + 1]; + unsigned segno; char mainpath[MAXPGPATH]; /* Skip anything that doesn't look like a relation data file. */ - if (!parse_filename_for_nontemp_relation(de->d_name, &relnumchars, - &forkNum)) + if (!parse_filename_for_nontemp_relation(de->d_name, &relNumber, + &forkNum, &segno)) continue; /* Also skip it unless this is the init fork. */ @@ -342,11 +342,12 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) continue; /* Construct main fork pathname. */ - memcpy(relnumbuf, de->d_name, relnumchars); - relnumbuf[relnumchars] = '\0'; - snprintf(mainpath, sizeof(mainpath), "%s/%s%s", - dbspacedirname, relnumbuf, de->d_name + relnumchars + 1 + - strlen(forkNames[INIT_FORKNUM])); + if (segno == 0) + snprintf(mainpath, sizeof(mainpath), "%s/%u", + dbspacedirname, relNumber); + else + snprintf(mainpath, sizeof(mainpath), "%s/%u.%u", + dbspacedirname, relNumber, segno); fsync_fname(mainpath, false); } @@ -371,52 +372,82 @@ ResetUnloggedRelationsInDbspaceDir(const char *dbspacedirname, int op) * This function returns true if the file appears to be in the correct format * for a non-temporary relation and false otherwise. * - * NB: If this function returns true, the caller is entitled to assume that - * *relnumchars has been set to a value no more than OIDCHARS, and thus - * that a buffer of OIDCHARS+1 characters is sufficient to hold the - * RelFileNumber portion of the filename. This is critical to protect against - * a possible buffer overrun. + * If it returns true, it sets *relnumber, *fork, and *segno to the values + * extracted from the filename. If it returns false, these values are set to + * InvalidRelFileNumber, InvalidForkNumber, and 0, respectively. */ bool -parse_filename_for_nontemp_relation(const char *name, int *relnumchars, - ForkNumber *fork) +parse_filename_for_nontemp_relation(const char *name, RelFileNumber *relnumber, + ForkNumber *fork, unsigned *segno) { - int pos; + unsigned long n, + s; + ForkNumber f; + char *endp; - /* Look for a non-empty string of digits (that isn't too long). */ - for (pos = 0; isdigit((unsigned char) name[pos]); ++pos) - ; - if (pos == 0 || pos > OIDCHARS) + *relnumber = InvalidRelFileNumber; + *fork = InvalidForkNumber; + *segno = 0; + + /* + * Relation filenames should begin with a digit that is not a zero. By + * rejecting cases involving leading zeroes, the caller can assume that + * there's only one possible string of characters that could have produced + * any given value for *relnumber. + * + * (To be clear, we don't expect files with names like 0017.3 to exist at + * all -- but if 0017.3 does exist, it's a non-relation file, not part of + * the main fork for relfilenode 17.) + */ + if (name[0] < '1' || name[0] > '9') + return false; + + /* + * Parse the leading digit string. If the value is out of range, we + * conclude that this isn't a relation file at all. + */ + errno = 0; + n = strtoul(name, &endp, 10); + if (errno || name == endp || n <= 0 || n > PG_UINT32_MAX) return false; - *relnumchars = pos; + name = endp; /* Check for a fork name. */ - if (name[pos] != '_') - *fork = MAIN_FORKNUM; + if (*name != '_') + f = MAIN_FORKNUM; else { int forkchar; - forkchar = forkname_chars(&name[pos + 1], fork); + forkchar = forkname_chars(name + 1, &f); if (forkchar <= 0) return false; - pos += forkchar + 1; + name += forkchar + 1; } /* Check for a segment number. */ - if (name[pos] == '.') + if (*name != '.') + s = 0; + else { - int segchar; + /* Reject leading zeroes, just like we do for RelFileNumber. */ + if (name[1] < '1' || name[1] > '9') + return false; - for (segchar = 1; isdigit((unsigned char) name[pos + segchar]); ++segchar) - ; - if (segchar <= 1) + errno = 0; + s = strtoul(name + 1, &endp, 10); + if (errno || name + 1 == endp || s <= 0 || s > PG_UINT32_MAX) return false; - pos += segchar; + name = endp; } /* Now we should be at the end. */ - if (name[pos] != '\0') + if (*name != '\0') return false; + + /* Set out parameters and return. */ + *relnumber = (RelFileNumber) n; + *fork = f; + *segno = (unsigned) s; return true; } diff --git a/src/backend/storage/file/sharedfileset.c b/src/backend/storage/file/sharedfileset.c index a13c8ed8a9f33..00bdbc726071f 100644 --- a/src/backend/storage/file/sharedfileset.c +++ b/src/backend/storage/file/sharedfileset.c @@ -3,7 +3,7 @@ * sharedfileset.c * Shared temporary file management. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -20,14 +20,8 @@ #include -#include "catalog/pg_tablespace.h" -#include "commands/tablespace.h" -#include "common/hashfn.h" -#include "miscadmin.h" #include "storage/dsm.h" -#include "storage/ipc.h" #include "storage/sharedfileset.h" -#include "utils/builtins.h" static void SharedFileSetOnDetach(dsm_segment *segment, Datum datum); diff --git a/src/backend/storage/freespace/README b/src/backend/storage/freespace/README index e7ff23b76f794..dc2a63a137bdc 100644 --- a/src/backend/storage/freespace/README +++ b/src/backend/storage/freespace/README @@ -169,9 +169,7 @@ Recovery -------- The FSM is not explicitly WAL-logged. Instead, we rely on a bunch of -self-correcting measures to repair possible corruption. As a result when -we write to the FSM we treat that as a hint and thus use MarkBufferDirtyHint() -rather than MarkBufferDirty(). +self-correcting measures to repair possible corruption. First of all, whenever a value is set on an FSM page, the root node of the page is compared against the new value after bubbling up the change is @@ -188,6 +186,18 @@ goes through fsm_set_avail(), so that the upper nodes on those pages are immediately updated. Periodically, VACUUM calls FreeSpaceMapVacuum[Range] to propagate the new free-space info into the upper pages of the FSM tree. +As a result when we write to the FSM we treat that as a hint and thus use +MarkBufferDirtyHint() rather than MarkBufferDirty(). Every read here uses +RBM_ZERO_ON_ERROR to bypass checksum mismatches and other verification +failures. We'd operate correctly without the full page images that +MarkBufferDirtyHint() provides, but they do decrease the chance of losing slot +knowledge to RBM_ZERO_ON_ERROR. + +Relation extension is not WAL-logged. Hence, after WAL replay, an on-disk FSM +slot may indicate free space in PageIsNew() blocks that never reached disk. +We detect this case by comparing against the actual relation size, and we mark +the block as full in that case. + TODO ---- diff --git a/src/backend/storage/freespace/freespace.c b/src/backend/storage/freespace/freespace.c index 2face615d07fa..b1262ac3b69dd 100644 --- a/src/backend/storage/freespace/freespace.c +++ b/src/backend/storage/freespace/freespace.c @@ -4,7 +4,7 @@ * POSTGRES free space map for quickly finding free space in relations * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -29,8 +29,8 @@ #include "miscadmin.h" #include "storage/freespace.h" #include "storage/fsm_internals.h" -#include "storage/lmgr.h" #include "storage/smgr.h" +#include "utils/rel.h" /* @@ -112,6 +112,7 @@ static BlockNumber fsm_search(Relation rel, uint8 min_cat); static uint8 fsm_vacuum_page(Relation rel, FSMAddress addr, BlockNumber start, BlockNumber end, bool *eof_p); +static bool fsm_does_block_exist(Relation rel, BlockNumber blknumber); /******** Public API ********/ @@ -128,6 +129,9 @@ static uint8 fsm_vacuum_page(Relation rel, FSMAddress addr, * amount of free space available on that page and then try again (see * RecordAndGetPageWithFreeSpace). If InvalidBlockNumber is returned, * extend the relation. + * + * This can trigger FSM updates if any FSM entry is found to point to a block + * past the end of the relation. */ BlockNumber GetPageWithFreeSpace(Relation rel, Size spaceNeeded) @@ -166,9 +170,17 @@ RecordAndGetPageWithFreeSpace(Relation rel, BlockNumber oldPage, * Otherwise, search as usual. */ if (search_slot != -1) - return fsm_get_heap_blk(addr, search_slot); - else - return fsm_search(rel, search_cat); + { + BlockNumber blknum = fsm_get_heap_blk(addr, search_slot); + + /* + * Check that the blknum is actually in the relation. Don't try to + * update the FSM in that case, just fall back to the other case + */ + if (fsm_does_block_exist(rel, blknum)) + return blknum; + } + return fsm_search(rel, search_cat); } /* @@ -297,14 +309,25 @@ FreeSpaceMapPrepareTruncateRel(Relation rel, BlockNumber nblocks) fsm_truncate_avail(BufferGetPage(buf), first_removed_slot); /* - * Truncation of a relation is WAL-logged at a higher-level, and we - * will be called at WAL replay. But if checksums are enabled, we need - * to still write a WAL record to protect against a torn page, if the - * page is flushed to disk before the truncation WAL record. We cannot - * use MarkBufferDirtyHint here, because that will not dirty the page - * during recovery. + * This change is non-critical, because fsm_does_block_exist() would + * stop us from returning a truncated-away block. However, since this + * may remove up to SlotsPerFSMPage slots, it's nice to avoid the cost + * of that many fsm_does_block_exist() rejections. Use a full + * MarkBufferDirty(), not MarkBufferDirtyHint(). */ MarkBufferDirty(buf); + + /* + * WAL-log like MarkBufferDirtyHint() might have done, just to avoid + * differing from the rest of the file in this respect. This is + * optional; see README mention of full page images. XXX consider + * XLogSaveBufferForHint() for even closer similarity. + * + * A higher-level operation calls us at WAL replay. If we crash + * before the XLOG_SMGR_TRUNCATE flushes to disk, main fork length has + * not changed, and our fork remains valid. If we crash after that + * flush, redo will return here. + */ if (!InRecovery && RelationNeedsWAL(rel) && XLogHintBitIsNeeded()) log_newpage_buffer(buf, false); @@ -532,14 +555,7 @@ fsm_readbuf(Relation rel, FSMAddress addr, bool extend) { BlockNumber blkno = fsm_logical_to_physical(addr); Buffer buf; - SMgrRelation reln; - - /* - * Caution: re-using this smgr pointer could fail if the relcache entry - * gets closed. It's safe as long as we only do smgr-level operations - * between here and the last use of the pointer. - */ - reln = RelationGetSmgr(rel); + SMgrRelation reln = RelationGetSmgr(rel); /* * If we haven't cached the size of the FSM yet, check it first. Also @@ -612,7 +628,7 @@ fsm_readbuf(Relation rel, FSMAddress addr, bool extend) static Buffer fsm_extend(Relation rel, BlockNumber fsm_nblocks) { - return ExtendBufferedRelTo(EB_REL(rel), FSM_FORKNUM, NULL, + return ExtendBufferedRelTo(BMR_REL(rel), FSM_FORKNUM, NULL, EB_CREATE_FORK_IF_NEEDED | EB_CLEAR_SIZE_CACHE, fsm_nblocks, @@ -681,8 +697,15 @@ fsm_search(Relation rel, uint8 min_cat) (addr.level == FSM_BOTTOM_LEVEL), false); if (slot == -1) + { max_avail = fsm_get_max_avail(BufferGetPage(buf)); - UnlockReleaseBuffer(buf); + UnlockReleaseBuffer(buf); + } + else + { + /* Keep the pin for possible update below */ + LockBuffer(buf, BUFFER_LOCK_UNLOCK); + } } else slot = -1; @@ -694,8 +717,37 @@ fsm_search(Relation rel, uint8 min_cat) * bottom. */ if (addr.level == FSM_BOTTOM_LEVEL) - return fsm_get_heap_blk(addr, slot); - + { + BlockNumber blkno = fsm_get_heap_blk(addr, slot); + Page page; + + if (fsm_does_block_exist(rel, blkno)) + { + ReleaseBuffer(buf); + return blkno; + } + + /* + * Block is past the end of the relation. Update FSM, and + * restart from root. The usual "advancenext" behavior is + * pessimal for this rare scenario, since every later slot is + * unusable in the same way. We could zero all affected slots + * on the same FSM page, but don't bet on the benefits of that + * optimization justifying its compiled code bulk. + */ + page = BufferGetPage(buf); + LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); + fsm_set_avail(page, slot, 0); + MarkBufferDirtyHint(buf, false); + UnlockReleaseBuffer(buf); + if (restarts++ > 10000) /* same rationale as below */ + return InvalidBlockNumber; + addr = FSM_ROOT_ADDRESS; + } + else + { + ReleaseBuffer(buf); + } addr = fsm_get_child(addr, slot); } else if (addr.level == FSM_ROOT_LEVEL) @@ -863,3 +915,26 @@ fsm_vacuum_page(Relation rel, FSMAddress addr, return max_avail; } + + +/* + * Check whether a block number is past the end of the relation. This can + * happen after WAL replay, if the FSM reached disk but newly-extended pages + * it refers to did not. + */ +static bool +fsm_does_block_exist(Relation rel, BlockNumber blknumber) +{ + SMgrRelation smgr = RelationGetSmgr(rel); + + /* + * If below the cached nblocks, the block surely exists. Otherwise, we + * face a trade-off. We opt to compare to a fresh nblocks, incurring + * lseek() overhead. The alternative would be to assume the block does + * not exist, but that would cause FSM to set zero space available for + * blocks that main fork extension just recorded. + */ + return ((BlockNumberIsValid(smgr->smgr_cached_nblocks[MAIN_FORKNUM]) && + blknumber < smgr->smgr_cached_nblocks[MAIN_FORKNUM]) || + blknumber < RelationGetNumberOfBlocks(rel)); +} diff --git a/src/backend/storage/freespace/fsmpage.c b/src/backend/storage/freespace/fsmpage.c index 0cfb2aed39300..ba85cad0697f5 100644 --- a/src/backend/storage/freespace/fsmpage.c +++ b/src/backend/storage/freespace/fsmpage.c @@ -4,7 +4,7 @@ * routines to search and manipulate one FSM page. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/storage/freespace/indexfsm.c b/src/backend/storage/freespace/indexfsm.c index fff8f4fbfbcac..ea0557801c1de 100644 --- a/src/backend/storage/freespace/indexfsm.c +++ b/src/backend/storage/freespace/indexfsm.c @@ -4,7 +4,7 @@ * POSTGRES free space map for quickly finding free pages in relations * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -16,7 +16,7 @@ * This is similar to the FSM used for heap, in freespace.c, but instead * of tracking the amount of free space on pages, we only track whether * pages are completely free or in-use. We use the same FSM implementation - * as for heaps, using BLCKSZ - 1 to denote used pages, and 0 for unused. + * as for heaps, using 0 to denote used pages, and (BLCKSZ - 1) for unused. * *------------------------------------------------------------------------- */ diff --git a/src/backend/storage/freespace/meson.build b/src/backend/storage/freespace/meson.build index 4dd8602a67292..db1c33a82886d 100644 --- a/src/backend/storage/freespace/meson.build +++ b/src/backend/storage/freespace/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'freespace.c', diff --git a/src/backend/storage/ipc/Makefile b/src/backend/storage/ipc/Makefile index 6d5b921038c1b..d8a1653eb6a62 100644 --- a/src/backend/storage/ipc/Makefile +++ b/src/backend/storage/ipc/Makefile @@ -12,6 +12,7 @@ OBJS = \ barrier.o \ dsm.o \ dsm_impl.o \ + dsm_registry.o \ ipc.o \ ipci.o \ latch.o \ diff --git a/src/backend/storage/ipc/barrier.c b/src/backend/storage/ipc/barrier.c index 4734dc6858ca5..5b52e060bae9e 100644 --- a/src/backend/storage/ipc/barrier.c +++ b/src/backend/storage/ipc/barrier.c @@ -3,7 +3,7 @@ * barrier.c * Barriers for synchronizing cooperating processes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * From Wikipedia[1]: "In parallel computing, a barrier is a type of diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c index 10b029bb162a1..c2e33a7e43305 100644 --- a/src/backend/storage/ipc/dsm.c +++ b/src/backend/storage/ipc/dsm.c @@ -14,7 +14,7 @@ * hard postmaster crash, remaining segments will be removed, if they * still exist, at the next postmaster startup. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -38,13 +38,14 @@ #include "miscadmin.h" #include "port/pg_bitutils.h" #include "storage/dsm.h" +#include "storage/fd.h" #include "storage/ipc.h" #include "storage/lwlock.h" #include "storage/pg_shmem.h" +#include "storage/shmem.h" #include "utils/freepage.h" -#include "utils/guc.h" #include "utils/memutils.h" -#include "utils/resowner_private.h" +#include "utils/resowner.h" #define PG_DYNSHMEM_CONTROL_MAGIC 0x9a503d32 @@ -140,6 +141,32 @@ static dsm_control_header *dsm_control; static Size dsm_control_mapped_size = 0; static void *dsm_control_impl_private = NULL; + +/* ResourceOwner callbacks to hold DSM segments */ +static void ResOwnerReleaseDSM(Datum res); +static char *ResOwnerPrintDSM(Datum res); + +static const ResourceOwnerDesc dsm_resowner_desc = +{ + .name = "dynamic shared memory segment", + .release_phase = RESOURCE_RELEASE_BEFORE_LOCKS, + .release_priority = RELEASE_PRIO_DSMS, + .ReleaseResource = ResOwnerReleaseDSM, + .DebugPrint = ResOwnerPrintDSM +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberDSM(ResourceOwner owner, dsm_segment *seg) +{ + ResourceOwnerRemember(owner, PointerGetDatum(seg), &dsm_resowner_desc); +} +static inline void +ResourceOwnerForgetDSM(ResourceOwner owner, dsm_segment *seg) +{ + ResourceOwnerForget(owner, PointerGetDatum(seg), &dsm_resowner_desc); +} + /* * Start up the dynamic shared memory system. * @@ -907,7 +934,7 @@ void dsm_unpin_mapping(dsm_segment *seg) { Assert(seg->resowner == NULL); - ResourceOwnerEnlargeDSMs(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); seg->resowner = CurrentResourceOwner; ResourceOwnerRememberDSM(seg->resowner, seg); } @@ -927,7 +954,7 @@ dsm_unpin_mapping(dsm_segment *seg) void dsm_pin_segment(dsm_segment *seg) { - void *handle; + void *handle = NULL; /* * Bump reference count for this segment in shared memory. This will @@ -938,7 +965,8 @@ dsm_pin_segment(dsm_segment *seg) LWLockAcquire(DynamicSharedMemoryControlLock, LW_EXCLUSIVE); if (dsm_control->item[seg->control_slot].pinned) elog(ERROR, "cannot pin a segment that is already pinned"); - dsm_impl_pin_segment(seg->handle, seg->impl_private, &handle); + if (!is_main_region_dsm_handle(seg->handle)) + dsm_impl_pin_segment(seg->handle, seg->impl_private, &handle); dsm_control->item[seg->control_slot].pinned = true; dsm_control->item[seg->control_slot].refcnt++; dsm_control->item[seg->control_slot].impl_private_pm_handle = handle; @@ -995,8 +1023,9 @@ dsm_unpin_segment(dsm_handle handle) * releasing the lock, because impl_private_pm_handle may get modified by * dsm_impl_unpin_segment. */ - dsm_impl_unpin_segment(handle, - &dsm_control->item[control_slot].impl_private_pm_handle); + if (!is_main_region_dsm_handle(handle)) + dsm_impl_unpin_segment(handle, + &dsm_control->item[control_slot].impl_private_pm_handle); /* Note that 1 means no references (0 means unused slot). */ if (--dsm_control->item[control_slot].refcnt == 1) @@ -1174,7 +1203,7 @@ dsm_create_descriptor(void) dsm_segment *seg; if (CurrentResourceOwner) - ResourceOwnerEnlargeDSMs(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); seg = MemoryContextAlloc(TopMemoryContext, sizeof(dsm_segment)); dlist_push_head(&dsm_segment_list, &seg->node); @@ -1253,3 +1282,22 @@ is_main_region_dsm_handle(dsm_handle handle) { return handle & 1; } + +/* ResourceOwner callbacks */ + +static void +ResOwnerReleaseDSM(Datum res) +{ + dsm_segment *seg = (dsm_segment *) DatumGetPointer(res); + + seg->resowner = NULL; + dsm_detach(seg); +} +static char * +ResOwnerPrintDSM(Datum res) +{ + dsm_segment *seg = (dsm_segment *) DatumGetPointer(res); + + return psprintf("dynamic shared memory segment %u", + dsm_segment_handle(seg)); +} diff --git a/src/backend/storage/ipc/dsm_impl.c b/src/backend/storage/ipc/dsm_impl.c index 6399fa2ad5142..8dd669e0ce943 100644 --- a/src/backend/storage/ipc/dsm_impl.c +++ b/src/backend/storage/ipc/dsm_impl.c @@ -36,7 +36,7 @@ * * As ever, Windows requires its own implementation. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -137,7 +137,7 @@ int min_dynamic_shared_memory; * Arguments: * op: The operation to be performed. * handle: The handle of an existing object, or for DSM_OP_CREATE, the - * a new handle the caller wants created. + * identifier for the new handle the caller wants created. * request_size: For DSM_OP_CREATE, the requested size. Otherwise, 0. * impl_private: Private, implementation-specific data. Will be a pointer * to NULL for the first operation on a shared memory segment within this @@ -873,7 +873,7 @@ dsm_impl_mmap(dsm_op op, dsm_handle handle, Size request_size, * transferring data to the kernel. */ char *zbuffer = (char *) palloc0(ZBUFFER_SIZE); - uint32 remaining = request_size; + Size remaining = request_size; bool success = true; /* diff --git a/src/backend/storage/ipc/dsm_registry.c b/src/backend/storage/ipc/dsm_registry.c new file mode 100644 index 0000000000000..9f58ea611b913 --- /dev/null +++ b/src/backend/storage/ipc/dsm_registry.c @@ -0,0 +1,200 @@ +/*------------------------------------------------------------------------- + * + * dsm_registry.c + * Functions for interfacing with the dynamic shared memory registry. + * + * This provides a way for libraries to use shared memory without needing + * to request it at startup time via a shmem_request_hook. The registry + * stores dynamic shared memory (DSM) segment handles keyed by a + * library-specified string. + * + * The registry is accessed by calling GetNamedDSMSegment(). If a segment + * with the provided name does not yet exist, it is created and initialized + * with the provided init_callback callback function. Otherwise, + * GetNamedDSMSegment() simply ensures that the segment is attached to the + * current backend. This function guarantees that only one backend + * initializes the segment and that all other backends just attach it. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/backend/storage/ipc/dsm_registry.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "lib/dshash.h" +#include "storage/dsm_registry.h" +#include "storage/lwlock.h" +#include "storage/shmem.h" +#include "utils/memutils.h" + +typedef struct DSMRegistryCtxStruct +{ + dsa_handle dsah; + dshash_table_handle dshh; +} DSMRegistryCtxStruct; + +static DSMRegistryCtxStruct *DSMRegistryCtx; + +typedef struct DSMRegistryEntry +{ + char name[64]; + dsm_handle handle; + size_t size; +} DSMRegistryEntry; + +static const dshash_parameters dsh_params = { + offsetof(DSMRegistryEntry, handle), + sizeof(DSMRegistryEntry), + dshash_strcmp, + dshash_strhash, + dshash_strcpy, + LWTRANCHE_DSM_REGISTRY_HASH +}; + +static dsa_area *dsm_registry_dsa; +static dshash_table *dsm_registry_table; + +Size +DSMRegistryShmemSize(void) +{ + return MAXALIGN(sizeof(DSMRegistryCtxStruct)); +} + +void +DSMRegistryShmemInit(void) +{ + bool found; + + DSMRegistryCtx = (DSMRegistryCtxStruct *) + ShmemInitStruct("DSM Registry Data", + DSMRegistryShmemSize(), + &found); + + if (!found) + { + DSMRegistryCtx->dsah = DSA_HANDLE_INVALID; + DSMRegistryCtx->dshh = DSHASH_HANDLE_INVALID; + } +} + +/* + * Initialize or attach to the dynamic shared hash table that stores the DSM + * registry entries, if not already done. This must be called before accessing + * the table. + */ +static void +init_dsm_registry(void) +{ + /* Quick exit if we already did this. */ + if (dsm_registry_table) + return; + + /* Otherwise, use a lock to ensure only one process creates the table. */ + LWLockAcquire(DSMRegistryLock, LW_EXCLUSIVE); + + if (DSMRegistryCtx->dshh == DSHASH_HANDLE_INVALID) + { + /* Initialize dynamic shared hash table for registry. */ + dsm_registry_dsa = dsa_create(LWTRANCHE_DSM_REGISTRY_DSA); + dsa_pin(dsm_registry_dsa); + dsa_pin_mapping(dsm_registry_dsa); + dsm_registry_table = dshash_create(dsm_registry_dsa, &dsh_params, NULL); + + /* Store handles in shared memory for other backends to use. */ + DSMRegistryCtx->dsah = dsa_get_handle(dsm_registry_dsa); + DSMRegistryCtx->dshh = dshash_get_hash_table_handle(dsm_registry_table); + } + else + { + /* Attach to existing dynamic shared hash table. */ + dsm_registry_dsa = dsa_attach(DSMRegistryCtx->dsah); + dsa_pin_mapping(dsm_registry_dsa); + dsm_registry_table = dshash_attach(dsm_registry_dsa, &dsh_params, + DSMRegistryCtx->dshh, NULL); + } + + LWLockRelease(DSMRegistryLock); +} + +/* + * Initialize or attach a named DSM segment. + * + * This routine returns the address of the segment. init_callback is called to + * initialize the segment when it is first created. + */ +void * +GetNamedDSMSegment(const char *name, size_t size, + void (*init_callback) (void *ptr), bool *found) +{ + DSMRegistryEntry *entry; + MemoryContext oldcontext; + void *ret; + + Assert(found); + + if (!name || *name == '\0') + ereport(ERROR, + (errmsg("DSM segment name cannot be empty"))); + + if (strlen(name) >= offsetof(DSMRegistryEntry, handle)) + ereport(ERROR, + (errmsg("DSM segment name too long"))); + + if (size == 0) + ereport(ERROR, + (errmsg("DSM segment size must be nonzero"))); + + /* Be sure any local memory allocated by DSM/DSA routines is persistent. */ + oldcontext = MemoryContextSwitchTo(TopMemoryContext); + + /* Connect to the registry. */ + init_dsm_registry(); + + entry = dshash_find_or_insert(dsm_registry_table, name, found); + if (!(*found)) + { + /* Initialize the segment. */ + dsm_segment *seg = dsm_create(size, 0); + + dsm_pin_segment(seg); + dsm_pin_mapping(seg); + entry->handle = dsm_segment_handle(seg); + entry->size = size; + ret = dsm_segment_address(seg); + + if (init_callback) + (*init_callback) (ret); + } + else if (entry->size != size) + { + ereport(ERROR, + (errmsg("requested DSM segment size does not match size of " + "existing segment"))); + } + else + { + dsm_segment *seg = dsm_find_mapping(entry->handle); + + /* If the existing segment is not already attached, attach it now. */ + if (seg == NULL) + { + seg = dsm_attach(entry->handle); + if (seg == NULL) + elog(ERROR, "could not map dynamic shared memory segment"); + + dsm_pin_mapping(seg); + } + + ret = dsm_segment_address(seg); + } + + dshash_release_lock(dsm_registry_table, entry); + MemoryContextSwitchTo(oldcontext); + + return ret; +} diff --git a/src/backend/storage/ipc/ipc.c b/src/backend/storage/ipc/ipc.c index 1904d21795ffc..b06e4b845288e 100644 --- a/src/backend/storage/ipc/ipc.c +++ b/src/backend/storage/ipc/ipc.c @@ -8,7 +8,7 @@ * exit-time cleanup for either a postmaster or a backend. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -103,6 +103,10 @@ static int on_proc_exit_index, void proc_exit(int code) { + /* not safe if forked by system(), etc. */ + if (MyProcPid != (int) getpid()) + elog(PANIC, "proc_exit() called in child process"); + /* Clean up everything that must be cleaned up */ proc_exit_prepare(code); @@ -132,7 +136,7 @@ proc_exit(int code) */ char gprofDirName[32]; - if (IsAutoVacuumWorkerProcess()) + if (AmAutoVacuumWorkerProcess()) snprintf(gprofDirName, 32, "gprof/avworker"); else snprintf(gprofDirName, 32, "gprof/%d", (int) getpid()); diff --git a/src/backend/storage/ipc/ipci.c b/src/backend/storage/ipc/ipci.c index 8f1ded7338f83..2100150f01cd4 100644 --- a/src/backend/storage/ipc/ipci.c +++ b/src/backend/storage/ipc/ipci.c @@ -3,7 +3,7 @@ * ipci.c * POSTGRES inter-process communication initialization code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -16,11 +16,11 @@ #include "access/clog.h" #include "access/commit_ts.h" -#include "access/heapam.h" #include "access/multixact.h" #include "access/nbtree.h" #include "access/subtrans.h" #include "access/syncscan.h" +#include "access/transam.h" #include "access/twophase.h" #include "access/xlogprefetcher.h" #include "access/xlogrecovery.h" @@ -31,13 +31,16 @@ #include "postmaster/bgworker_internals.h" #include "postmaster/bgwriter.h" #include "postmaster/postmaster.h" +#include "postmaster/walsummarizer.h" #include "replication/logicallauncher.h" #include "replication/origin.h" #include "replication/slot.h" +#include "replication/slotsync.h" #include "replication/walreceiver.h" #include "replication/walsender.h" #include "storage/bufmgr.h" #include "storage/dsm.h" +#include "storage/dsm_registry.h" #include "storage/ipc.h" #include "storage/pg_shmem.h" #include "storage/pmsignal.h" @@ -48,7 +51,7 @@ #include "storage/sinvaladt.h" #include "storage/spin.h" #include "utils/guc.h" -#include "utils/snapmgr.h" +#include "utils/injection_point.h" /* GUCs */ int shared_memory_type = DEFAULT_SHARED_MEMORY_TYPE; @@ -57,6 +60,8 @@ shmem_startup_hook_type shmem_startup_hook = NULL; static Size total_addin_request = 0; +static void CreateOrAttachShmemStructs(void); + /* * RequestAddinShmemSpace * Request that extra shmem space be allocated for use by @@ -110,11 +115,13 @@ CalculateShmemSize(int *num_semaphores) size = add_size(size, hash_estimate_size(SHMEM_INDEX_SIZE, sizeof(ShmemIndexEnt))); size = add_size(size, dsm_estimate_size()); + size = add_size(size, DSMRegistryShmemSize()); size = add_size(size, BufferShmemSize()); size = add_size(size, LockShmemSize()); size = add_size(size, PredicateLockShmemSize()); size = add_size(size, ProcGlobalShmemSize()); size = add_size(size, XLogPrefetchShmemSize()); + size = add_size(size, VarsupShmemSize()); size = add_size(size, XLOGShmemSize()); size = add_size(size, XLogRecoveryShmemSize()); size = add_size(size, CLOGShmemSize()); @@ -135,13 +142,16 @@ CalculateShmemSize(int *num_semaphores) size = add_size(size, ReplicationOriginShmemSize()); size = add_size(size, WalSndShmemSize()); size = add_size(size, WalRcvShmemSize()); + size = add_size(size, WalSummarizerShmemSize()); size = add_size(size, PgArchShmemSize()); size = add_size(size, ApplyLauncherShmemSize()); - size = add_size(size, SnapMgrShmemSize()); size = add_size(size, BTreeShmemSize()); size = add_size(size, SyncScanShmemSize()); size = add_size(size, AsyncShmemSize()); size = add_size(size, StatsShmemSize()); + size = add_size(size, WaitEventCustomShmemSize()); + size = add_size(size, InjectionPointShmemSize()); + size = add_size(size, SlotSyncShmemSize()); #ifdef EXEC_BACKEND size = add_size(size, ShmemBackendArraySize()); #endif @@ -155,9 +165,106 @@ CalculateShmemSize(int *num_semaphores) return size; } +#ifdef EXEC_BACKEND +/* + * AttachSharedMemoryStructs + * Initialize a postmaster child process's access to shared memory + * structures. + * + * In !EXEC_BACKEND mode, we inherit everything through the fork, and this + * isn't needed. + */ +void +AttachSharedMemoryStructs(void) +{ + /* InitProcess must've been called already */ + Assert(MyProc != NULL); + Assert(IsUnderPostmaster); + + CreateOrAttachShmemStructs(); + + /* + * Now give loadable modules a chance to set up their shmem allocations + */ + if (shmem_startup_hook) + shmem_startup_hook(); +} +#endif + /* * CreateSharedMemoryAndSemaphores * Creates and initializes shared memory and semaphores. + */ +void +CreateSharedMemoryAndSemaphores(void) +{ + PGShmemHeader *shim; + PGShmemHeader *seghdr; + Size size; + int numSemas; + + Assert(!IsUnderPostmaster); + + /* Compute the size of the shared-memory block */ + size = CalculateShmemSize(&numSemas); + elog(DEBUG3, "invoking IpcMemoryCreate(size=%zu)", size); + + /* + * Create the shmem segment + */ + seghdr = PGSharedMemoryCreate(size, &shim); + + /* + * Make sure that huge pages are never reported as "unknown" while the + * server is running. + */ + Assert(strcmp("unknown", + GetConfigOption("huge_pages_status", false, false)) != 0); + + InitShmemAccess(seghdr); + + /* + * Create semaphores + */ + PGReserveSemaphores(numSemas); + + /* + * If spinlocks are disabled, initialize emulation layer (which depends on + * semaphores, so the order is important here). + */ +#ifndef HAVE_SPINLOCKS + SpinlockSemaInit(); +#endif + + /* + * Set up shared memory allocation mechanism + */ + InitShmemAllocation(); + + /* Initialize subsystems */ + CreateOrAttachShmemStructs(); + +#ifdef EXEC_BACKEND + + /* + * Alloc the win32 shared backend array + */ + ShmemBackendArrayAllocation(); +#endif + + /* Initialize dynamic shared memory facilities. */ + dsm_postmaster_startup(shim); + + /* + * Now give loadable modules a chance to set up their shmem allocations + */ + if (shmem_startup_hook) + shmem_startup_hook(); +} + +/* + * Initialize various subsystems, setting up their data structures in + * shared memory. * * This is called by the postmaster or by a standalone backend. * It is also called by a backend forked from the postmaster in the @@ -170,58 +277,9 @@ CalculateShmemSize(int *num_semaphores) * check IsUnderPostmaster, rather than EXEC_BACKEND, to detect this case. * This is a bit code-wasteful and could be cleaned up.) */ -void -CreateSharedMemoryAndSemaphores(void) +static void +CreateOrAttachShmemStructs(void) { - PGShmemHeader *shim = NULL; - - if (!IsUnderPostmaster) - { - PGShmemHeader *seghdr; - Size size; - int numSemas; - - /* Compute the size of the shared-memory block */ - size = CalculateShmemSize(&numSemas); - elog(DEBUG3, "invoking IpcMemoryCreate(size=%zu)", size); - - /* - * Create the shmem segment - */ - seghdr = PGSharedMemoryCreate(size, &shim); - - InitShmemAccess(seghdr); - - /* - * Create semaphores - */ - PGReserveSemaphores(numSemas); - - /* - * If spinlocks are disabled, initialize emulation layer (which - * depends on semaphores, so the order is important here). - */ -#ifndef HAVE_SPINLOCKS - SpinlockSemaInit(); -#endif - } - else - { - /* - * We are reattaching to an existing shared memory segment. This - * should only be reached in the EXEC_BACKEND case. - */ -#ifndef EXEC_BACKEND - elog(PANIC, "should be attached to shared memory already"); -#endif - } - - /* - * Set up shared memory allocation mechanism - */ - if (!IsUnderPostmaster) - InitShmemAllocation(); - /* * Now initialize LWLocks, which do shared memory allocation and are * needed for InitShmemIndex. @@ -234,10 +292,12 @@ CreateSharedMemoryAndSemaphores(void) InitShmemIndex(); dsm_shmem_init(); + DSMRegistryShmemInit(); /* * Set up xlog, clog, and buffers */ + VarsupShmemInit(); XLOGShmemInit(); XLogPrefetchShmemInit(); XLogRecoveryShmemInit(); @@ -283,36 +343,20 @@ CreateSharedMemoryAndSemaphores(void) ReplicationOriginShmemInit(); WalSndShmemInit(); WalRcvShmemInit(); + WalSummarizerShmemInit(); PgArchShmemInit(); ApplyLauncherShmemInit(); + SlotSyncShmemInit(); /* * Set up other modules that need some shared memory space */ - SnapMgrInit(); BTreeShmemInit(); SyncScanShmemInit(); AsyncShmemInit(); StatsShmemInit(); - -#ifdef EXEC_BACKEND - - /* - * Alloc the win32 shared backend array - */ - if (!IsUnderPostmaster) - ShmemBackendArrayAllocation(); -#endif - - /* Initialize dynamic shared memory facilities. */ - if (!IsUnderPostmaster) - dsm_postmaster_startup(shim); - - /* - * Now give loadable modules a chance to set up their shmem allocations - */ - if (shmem_startup_hook) - shmem_startup_hook(); + WaitEventCustomShmemInit(); + InjectionPointShmemInit(); } /* diff --git a/src/backend/storage/ipc/latch.c b/src/backend/storage/ipc/latch.c index cdb95c1931add..2b4ded38893af 100644 --- a/src/backend/storage/ipc/latch.c +++ b/src/backend/storage/ipc/latch.c @@ -23,7 +23,7 @@ * The Windows implementation uses Windows events that are inherited by all * postmaster child processes. There's no need for the self-pipe trick there. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -60,8 +60,8 @@ #include "storage/ipc.h" #include "storage/latch.h" #include "storage/pmsignal.h" -#include "storage/shmem.h" #include "utils/memutils.h" +#include "utils/resowner.h" /* * Select the fd readiness primitive to use. Normally the "most modern" @@ -86,14 +86,12 @@ /* * By default, we use a self-pipe with poll() and a signalfd with epoll(), if - * available. We avoid signalfd on illumos for now based on problem reports. - * For testing the choice can also be manually specified. + * available. For testing the choice can also be manually specified. */ #if defined(WAIT_USE_POLL) || defined(WAIT_USE_EPOLL) #if defined(WAIT_USE_SELF_PIPE) || defined(WAIT_USE_SIGNALFD) /* don't overwrite manual choice */ -#elif defined(WAIT_USE_EPOLL) && defined(HAVE_SYS_SIGNALFD_H) && \ - !defined(__illumos__) +#elif defined(WAIT_USE_EPOLL) && defined(HAVE_SYS_SIGNALFD_H) #define WAIT_USE_SIGNALFD #else #define WAIT_USE_SELF_PIPE @@ -103,6 +101,8 @@ /* typedef in latch.h */ struct WaitEventSet { + ResourceOwner owner; + int nevents; /* number of registered events */ int nevents_space; /* maximum number of events in this set */ @@ -197,6 +197,31 @@ static void WaitEventAdjustWin32(WaitEventSet *set, WaitEvent *event); static inline int WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout, WaitEvent *occurred_events, int nevents); +/* ResourceOwner support to hold WaitEventSets */ +static void ResOwnerReleaseWaitEventSet(Datum res); + +static const ResourceOwnerDesc wait_event_set_resowner_desc = +{ + .name = "WaitEventSet", + .release_phase = RESOURCE_RELEASE_AFTER_LOCKS, + .release_priority = RELEASE_PRIO_WAITEVENTSETS, + .ReleaseResource = ResOwnerReleaseWaitEventSet, + .DebugPrint = NULL +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberWaitEventSet(ResourceOwner owner, WaitEventSet *set) +{ + ResourceOwnerRemember(owner, PointerGetDatum(set), &wait_event_set_resowner_desc); +} +static inline void +ResourceOwnerForgetWaitEventSet(ResourceOwner owner, WaitEventSet *set) +{ + ResourceOwnerForget(owner, PointerGetDatum(set), &wait_event_set_resowner_desc); +} + + /* * Initialize the process-local latch infrastructure. * @@ -325,7 +350,7 @@ InitializeLatchWaitSet(void) Assert(LatchWaitSet == NULL); /* Set up the WaitEventSet used by WaitLatch(). */ - LatchWaitSet = CreateWaitEventSet(TopMemoryContext, 2); + LatchWaitSet = CreateWaitEventSet(NULL, 2); latch_pos = AddWaitEventToSet(LatchWaitSet, WL_LATCH_SET, PGINVALID_SOCKET, MyLatch, NULL); if (IsUnderPostmaster) @@ -543,7 +568,7 @@ WaitLatchOrSocket(Latch *latch, int wakeEvents, pgsocket sock, int ret = 0; int rc; WaitEvent event; - WaitEventSet *set = CreateWaitEventSet(CurrentMemoryContext, 3); + WaitEventSet *set = CreateWaitEventSet(CurrentResourceOwner, 3); if (wakeEvents & WL_TIMEOUT) Assert(timeout >= 0); @@ -718,9 +743,12 @@ ResetLatch(Latch *latch) * * These events can then be efficiently waited upon together, using * WaitEventSetWait(). + * + * The WaitEventSet is tracked by the given 'resowner'. Use NULL for session + * lifetime. */ WaitEventSet * -CreateWaitEventSet(MemoryContext context, int nevents) +CreateWaitEventSet(ResourceOwner resowner, int nevents) { WaitEventSet *set; char *data; @@ -746,7 +774,10 @@ CreateWaitEventSet(MemoryContext context, int nevents) sz += MAXALIGN(sizeof(HANDLE) * (nevents + 1)); #endif - data = (char *) MemoryContextAllocZero(context, sz); + if (resowner != NULL) + ResourceOwnerEnlarge(resowner); + + data = (char *) MemoryContextAllocZero(TopMemoryContext, sz); set = (WaitEventSet *) data; data += MAXALIGN(sizeof(WaitEventSet)); @@ -772,6 +803,12 @@ CreateWaitEventSet(MemoryContext context, int nevents) set->nevents_space = nevents; set->exit_on_postmaster_death = false; + if (resowner != NULL) + { + ResourceOwnerRememberWaitEventSet(resowner, set); + set->owner = resowner; + } + #if defined(WAIT_USE_EPOLL) if (!AcquireExternalFD()) { @@ -836,6 +873,12 @@ CreateWaitEventSet(MemoryContext context, int nevents) void FreeWaitEventSet(WaitEventSet *set) { + if (set->owner) + { + ResourceOwnerForgetWaitEventSet(set->owner, set); + set->owner = NULL; + } + #if defined(WAIT_USE_EPOLL) close(set->epoll_fd); ReleaseExternalFD(); @@ -843,9 +886,7 @@ FreeWaitEventSet(WaitEventSet *set) close(set->kqueue_fd); ReleaseExternalFD(); #elif defined(WAIT_USE_WIN32) - WaitEvent *cur_event; - - for (cur_event = set->events; + for (WaitEvent *cur_event = set->events; cur_event < (set->events + set->nevents); cur_event++) { @@ -1417,9 +1458,9 @@ WaitEventSetWait(WaitEventSet *set, long timeout, int rc; /* - * Check if the latch is set already. If so, leave the loop - * immediately, avoid blocking again. We don't attempt to report any - * other events that might also be satisfied. + * Check if the latch is set already first. If so, we either exit + * immediately or ask the kernel for further events available right + * now without waiting, depending on how many events the caller wants. * * If someone sets the latch between this and the * WaitEventSetWaitBlock() below, the setter will write a byte to the @@ -1464,7 +1505,16 @@ WaitEventSetWait(WaitEventSet *set, long timeout, /* could have been set above */ set->latch->maybe_sleeping = false; - break; + if (returned_events == nevents) + break; /* output buffer full already */ + + /* + * Even though we already have an event, we'll poll just once with + * zero timeout to see what non-latch events we can fit into the + * output buffer at the same time. + */ + cur_timeout = 0; + timeout = 0; } /* @@ -1473,18 +1523,16 @@ WaitEventSetWait(WaitEventSet *set, long timeout, * to retry, everything >= 1 is the number of returned events. */ rc = WaitEventSetWaitBlock(set, cur_timeout, - occurred_events, nevents); + occurred_events, nevents - returned_events); - if (set->latch) - { - Assert(set->latch->maybe_sleeping); + if (set->latch && + set->latch->maybe_sleeping) set->latch->maybe_sleeping = false; - } if (rc == -1) break; /* timeout occurred */ else - returned_events = rc; + returned_events += rc; /* If we're not done, update cur_timeout for next iteration */ if (returned_events == 0 && timeout >= 0) @@ -1572,7 +1620,7 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout, /* Drain the signalfd. */ drain(); - if (set->latch && set->latch->is_set) + if (set->latch && set->latch->maybe_sleeping && set->latch->is_set) { occurred_events->fd = PGINVALID_SOCKET; occurred_events->events = WL_LATCH_SET; @@ -1731,7 +1779,7 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout, if (cur_event->events == WL_LATCH_SET && cur_kqueue_event->filter == EVFILT_SIGNAL) { - if (set->latch && set->latch->is_set) + if (set->latch && set->latch->maybe_sleeping && set->latch->is_set) { occurred_events->fd = PGINVALID_SOCKET; occurred_events->events = WL_LATCH_SET; @@ -1856,7 +1904,7 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout, /* There's data in the self-pipe, clear it. */ drain(); - if (set->latch && set->latch->is_set) + if (set->latch && set->latch->maybe_sleeping && set->latch->is_set) { occurred_events->fd = PGINVALID_SOCKET; occurred_events->events = WL_LATCH_SET; @@ -1933,14 +1981,11 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout, #elif defined(WAIT_USE_WIN32) /* - * Wait using Windows' WaitForMultipleObjects(). + * Wait using Windows' WaitForMultipleObjects(). Each call only "consumes" one + * event, so we keep calling until we've filled up our output buffer to match + * the behavior of the other implementations. * - * Unfortunately this will only ever return a single readiness notification at - * a time. Note that while the official documentation for - * WaitForMultipleObjects is ambiguous about multiple events being "consumed" - * with a single bWaitAll = FALSE call, - * https://blogs.msdn.microsoft.com/oldnewthing/20150409-00/?p=44273 confirms - * that only one event is "consumed". + * https://blogs.msdn.microsoft.com/oldnewthing/20150409-00/?p=44273 */ static inline int WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout, @@ -1961,6 +2006,38 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout, cur_event->reset = false; } + /* + * We associate the socket with a new event handle for each + * WaitEventSet. FD_CLOSE is only generated once if the other end + * closes gracefully. Therefore we might miss the FD_CLOSE + * notification, if it was delivered to another event after we stopped + * waiting for it. Close that race by peeking for EOF after setting + * up this handle to receive notifications, and before entering the + * sleep. + * + * XXX If we had one event handle for the lifetime of a socket, we + * wouldn't need this. + */ + if (cur_event->events & WL_SOCKET_READABLE) + { + char c; + WSABUF buf; + DWORD received; + DWORD flags; + + buf.buf = &c; + buf.len = 1; + flags = MSG_PEEK; + if (WSARecv(cur_event->fd, &buf, 1, &received, &flags, NULL, NULL) == 0) + { + occurred_events->pos = cur_event->pos; + occurred_events->user_data = cur_event->user_data; + occurred_events->events = WL_SOCKET_READABLE; + occurred_events->fd = cur_event->fd; + return 1; + } + } + /* * Windows does not guarantee to log an FD_WRITE network event * indicating that more data can be sent unless the previous send() @@ -2025,106 +2102,145 @@ WaitEventSetWaitBlock(WaitEventSet *set, int cur_timeout, */ cur_event = (WaitEvent *) &set->events[rc - WAIT_OBJECT_0 - 1]; - occurred_events->pos = cur_event->pos; - occurred_events->user_data = cur_event->user_data; - occurred_events->events = 0; - - if (cur_event->events == WL_LATCH_SET) - { - /* - * We cannot use set->latch->event to reset the fired event if we - * aren't waiting on this latch now. - */ - if (!ResetEvent(set->handles[cur_event->pos + 1])) - elog(ERROR, "ResetEvent failed: error code %lu", GetLastError()); - - if (set->latch && set->latch->is_set) - { - occurred_events->fd = PGINVALID_SOCKET; - occurred_events->events = WL_LATCH_SET; - occurred_events++; - returned_events++; - } - } - else if (cur_event->events == WL_POSTMASTER_DEATH) - { - /* - * Postmaster apparently died. Since the consequences of falsely - * returning WL_POSTMASTER_DEATH could be pretty unpleasant, we take - * the trouble to positively verify this with PostmasterIsAlive(), - * even though there is no known reason to think that the event could - * be falsely set on Windows. - */ - if (!PostmasterIsAliveInternal()) - { - if (set->exit_on_postmaster_death) - proc_exit(1); - occurred_events->fd = PGINVALID_SOCKET; - occurred_events->events = WL_POSTMASTER_DEATH; - occurred_events++; - returned_events++; - } - } - else if (cur_event->events & WL_SOCKET_MASK) + for (;;) { - WSANETWORKEVENTS resEvents; - HANDLE handle = set->handles[cur_event->pos + 1]; + int next_pos; + int count; - Assert(cur_event->fd); - - occurred_events->fd = cur_event->fd; + occurred_events->pos = cur_event->pos; + occurred_events->user_data = cur_event->user_data; + occurred_events->events = 0; - ZeroMemory(&resEvents, sizeof(resEvents)); - if (WSAEnumNetworkEvents(cur_event->fd, handle, &resEvents) != 0) - elog(ERROR, "failed to enumerate network events: error code %d", - WSAGetLastError()); - if ((cur_event->events & WL_SOCKET_READABLE) && - (resEvents.lNetworkEvents & FD_READ)) + if (cur_event->events == WL_LATCH_SET) { - /* data available in socket */ - occurred_events->events |= WL_SOCKET_READABLE; - - /*------ - * WaitForMultipleObjects doesn't guarantee that a read event will - * be returned if the latch is set at the same time. Even if it - * did, the caller might drop that event expecting it to reoccur - * on next call. So, we must force the event to be reset if this - * WaitEventSet is used again in order to avoid an indefinite - * hang. Refer https://msdn.microsoft.com/en-us/library/windows/desktop/ms741576(v=vs.85).aspx - * for the behavior of socket events. - *------ + /* + * We cannot use set->latch->event to reset the fired event if we + * aren't waiting on this latch now. */ - cur_event->reset = true; - } - if ((cur_event->events & WL_SOCKET_WRITEABLE) && - (resEvents.lNetworkEvents & FD_WRITE)) - { - /* writeable */ - occurred_events->events |= WL_SOCKET_WRITEABLE; - } - if ((cur_event->events & WL_SOCKET_CONNECTED) && - (resEvents.lNetworkEvents & FD_CONNECT)) - { - /* connected */ - occurred_events->events |= WL_SOCKET_CONNECTED; + if (!ResetEvent(set->handles[cur_event->pos + 1])) + elog(ERROR, "ResetEvent failed: error code %lu", GetLastError()); + + if (set->latch && set->latch->maybe_sleeping && set->latch->is_set) + { + occurred_events->fd = PGINVALID_SOCKET; + occurred_events->events = WL_LATCH_SET; + occurred_events++; + returned_events++; + } } - if ((cur_event->events & WL_SOCKET_ACCEPT) && - (resEvents.lNetworkEvents & FD_ACCEPT)) + else if (cur_event->events == WL_POSTMASTER_DEATH) { - /* incoming connection could be accepted */ - occurred_events->events |= WL_SOCKET_ACCEPT; + /* + * Postmaster apparently died. Since the consequences of falsely + * returning WL_POSTMASTER_DEATH could be pretty unpleasant, we + * take the trouble to positively verify this with + * PostmasterIsAlive(), even though there is no known reason to + * think that the event could be falsely set on Windows. + */ + if (!PostmasterIsAliveInternal()) + { + if (set->exit_on_postmaster_death) + proc_exit(1); + occurred_events->fd = PGINVALID_SOCKET; + occurred_events->events = WL_POSTMASTER_DEATH; + occurred_events++; + returned_events++; + } } - if (resEvents.lNetworkEvents & FD_CLOSE) + else if (cur_event->events & WL_SOCKET_MASK) { - /* EOF/error, so signal all caller-requested socket flags */ - occurred_events->events |= (cur_event->events & WL_SOCKET_MASK); - } + WSANETWORKEVENTS resEvents; + HANDLE handle = set->handles[cur_event->pos + 1]; - if (occurred_events->events != 0) - { - occurred_events++; - returned_events++; + Assert(cur_event->fd); + + occurred_events->fd = cur_event->fd; + + ZeroMemory(&resEvents, sizeof(resEvents)); + if (WSAEnumNetworkEvents(cur_event->fd, handle, &resEvents) != 0) + elog(ERROR, "failed to enumerate network events: error code %d", + WSAGetLastError()); + if ((cur_event->events & WL_SOCKET_READABLE) && + (resEvents.lNetworkEvents & FD_READ)) + { + /* data available in socket */ + occurred_events->events |= WL_SOCKET_READABLE; + + /*------ + * WaitForMultipleObjects doesn't guarantee that a read event + * will be returned if the latch is set at the same time. Even + * if it did, the caller might drop that event expecting it to + * reoccur on next call. So, we must force the event to be + * reset if this WaitEventSet is used again in order to avoid + * an indefinite hang. + * + * Refer + * https://msdn.microsoft.com/en-us/library/windows/desktop/ms741576(v=vs.85).aspx + * for the behavior of socket events. + *------ + */ + cur_event->reset = true; + } + if ((cur_event->events & WL_SOCKET_WRITEABLE) && + (resEvents.lNetworkEvents & FD_WRITE)) + { + /* writeable */ + occurred_events->events |= WL_SOCKET_WRITEABLE; + } + if ((cur_event->events & WL_SOCKET_CONNECTED) && + (resEvents.lNetworkEvents & FD_CONNECT)) + { + /* connected */ + occurred_events->events |= WL_SOCKET_CONNECTED; + } + if ((cur_event->events & WL_SOCKET_ACCEPT) && + (resEvents.lNetworkEvents & FD_ACCEPT)) + { + /* incoming connection could be accepted */ + occurred_events->events |= WL_SOCKET_ACCEPT; + } + if (resEvents.lNetworkEvents & FD_CLOSE) + { + /* EOF/error, so signal all caller-requested socket flags */ + occurred_events->events |= (cur_event->events & WL_SOCKET_MASK); + } + + if (occurred_events->events != 0) + { + occurred_events++; + returned_events++; + } } + + /* Is the output buffer full? */ + if (returned_events == nevents) + break; + + /* Have we run out of possible events? */ + next_pos = cur_event->pos + 1; + if (next_pos == set->nevents) + break; + + /* + * Poll the rest of the event handles in the array starting at + * next_pos being careful to skip over the initial signal handle too. + * This time we use a zero timeout. + */ + count = set->nevents - next_pos; + rc = WaitForMultipleObjects(count, + set->handles + 1 + next_pos, + false, + 0); + + /* + * We don't distinguish between errors and WAIT_TIMEOUT here because + * we already have events to report. + */ + if (rc < WAIT_OBJECT_0 || rc >= WAIT_OBJECT_0 + count) + break; + + /* We have another event to decode. */ + cur_event = &set->events[next_pos + (rc - WAIT_OBJECT_0)]; } return returned_events; @@ -2165,12 +2281,8 @@ GetNumRegisteredWaitEvents(WaitEventSet *set) static void latch_sigurg_handler(SIGNAL_ARGS) { - int save_errno = errno; - if (waiting) sendSelfPipeByte(); - - errno = save_errno; } /* Send one byte to the self-pipe, to wake up WaitLatch */ @@ -2266,3 +2378,13 @@ drain(void) } #endif + +static void +ResOwnerReleaseWaitEventSet(Datum res) +{ + WaitEventSet *set = (WaitEventSet *) DatumGetPointer(res); + + Assert(set->owner != NULL); + set->owner = NULL; + FreeWaitEventSet(set); +} diff --git a/src/backend/storage/ipc/meson.build b/src/backend/storage/ipc/meson.build index 79a16d077f517..5a936171f7341 100644 --- a/src/backend/storage/ipc/meson.build +++ b/src/backend/storage/ipc/meson.build @@ -1,9 +1,10 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'barrier.c', 'dsm.c', 'dsm_impl.c', + 'dsm_registry.c', 'ipc.c', 'ipci.c', 'latch.c', diff --git a/src/backend/storage/ipc/pmsignal.c b/src/backend/storage/ipc/pmsignal.c index 5dc2da6c00006..27844b46a2b1e 100644 --- a/src/backend/storage/ipc/pmsignal.c +++ b/src/backend/storage/ipc/pmsignal.c @@ -4,7 +4,7 @@ * routines for signaling between the postmaster and its child processes * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index 8c8d728ba8554..7b931f028e924 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -34,7 +34,7 @@ * happen, it would tie up KnownAssignedXids indefinitely, so we protect * ourselves by pruning the array when a valid list of running XIDs arrives. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -47,7 +47,6 @@ #include -#include "access/clog.h" #include "access/subtrans.h" #include "access/transam.h" #include "access/twophase.h" @@ -61,7 +60,6 @@ #include "port/pg_lfind.h" #include "storage/proc.h" #include "storage/procarray.h" -#include "storage/spin.h" #include "utils/acl.h" #include "utils/builtins.h" #include "utils/rel.h" @@ -82,7 +80,6 @@ typedef struct ProcArrayStruct int numKnownAssignedXids; /* current # of valid entries */ int tailKnownAssignedXids; /* index of oldest valid element */ int headKnownAssignedXids; /* index of newest element, + 1 */ - slock_t known_assigned_xids_lck; /* protects head/tail pointers */ /* * Highest subxid that has been removed from KnownAssignedXids array to @@ -182,7 +179,7 @@ struct GlobalVisState typedef struct ComputeXidHorizonsResult { /* - * The value of ShmemVariableCache->latestCompletedXid when + * The value of TransamVariables->latestCompletedXid when * ComputeXidHorizons() held ProcArrayLock. */ FullTransactionId latest_completed; @@ -254,7 +251,7 @@ typedef enum GlobalVisHorizonKind VISHORIZON_SHARED, VISHORIZON_CATALOG, VISHORIZON_DATA, - VISHORIZON_TEMP + VISHORIZON_TEMP, } GlobalVisHorizonKind; /* @@ -265,7 +262,7 @@ typedef enum KAXCompressReason KAX_NO_SPACE, /* need to free up space at array end */ KAX_PRUNE, /* we just pruned old entries */ KAX_TRANSACTION_END, /* we just committed/removed some XIDs */ - KAX_STARTUP_PROCESS_IDLE /* startup process is about to sleep */ + KAX_STARTUP_PROCESS_IDLE, /* startup process is about to sleep */ } KAXCompressReason; @@ -441,11 +438,10 @@ CreateSharedProcArray(void) procArray->numKnownAssignedXids = 0; procArray->tailKnownAssignedXids = 0; procArray->headKnownAssignedXids = 0; - SpinLockInit(&procArray->known_assigned_xids_lck); procArray->lastOverflowedXid = InvalidTransactionId; procArray->replication_slot_xmin = InvalidTransactionId; procArray->replication_slot_catalog_xmin = InvalidTransactionId; - ShmemVariableCache->xactCompletionCount = 1; + TransamVariables->xactCompletionCount = 1; } allProcs = ProcGlobal->allProcs; @@ -471,6 +467,7 @@ CreateSharedProcArray(void) void ProcArrayAdd(PGPROC *proc) { + int pgprocno = GetNumberFromPGProc(proc); ProcArrayStruct *arrayP = procArray; int index; int movecount; @@ -502,13 +499,13 @@ ProcArrayAdd(PGPROC *proc) */ for (index = 0; index < arrayP->numProcs; index++) { - int procno PG_USED_FOR_ASSERTS_ONLY = arrayP->pgprocnos[index]; + int this_procno = arrayP->pgprocnos[index]; - Assert(procno >= 0 && procno < (arrayP->maxProcs + NUM_AUXILIARY_PROCS)); - Assert(allProcs[procno].pgxactoff == index); + Assert(this_procno >= 0 && this_procno < (arrayP->maxProcs + NUM_AUXILIARY_PROCS)); + Assert(allProcs[this_procno].pgxactoff == index); /* If we have found our right position in the array, break */ - if (arrayP->pgprocnos[index] > proc->pgprocno) + if (this_procno > pgprocno) break; } @@ -526,7 +523,7 @@ ProcArrayAdd(PGPROC *proc) &ProcGlobal->statusFlags[index], movecount * sizeof(*ProcGlobal->statusFlags)); - arrayP->pgprocnos[index] = proc->pgprocno; + arrayP->pgprocnos[index] = GetNumberFromPGProc(proc); proc->pgxactoff = index; ProcGlobal->xids[index] = proc->xid; ProcGlobal->subxidStates[index] = proc->subxidStatus; @@ -594,7 +591,7 @@ ProcArrayRemove(PGPROC *proc, TransactionId latestXid) MaintainLatestCompletedXid(latestXid); /* Same with xactCompletionCount */ - ShmemVariableCache->xactCompletionCount++; + TransamVariables->xactCompletionCount++; ProcGlobal->xids[myoff] = InvalidTransactionId; ProcGlobal->subxidStates[myoff].overflowed = false; @@ -703,7 +700,7 @@ ProcArrayEndTransaction(PGPROC *proc, TransactionId latestXid) Assert(proc->subxidStatus.count == 0); Assert(!proc->subxidStatus.overflowed); - proc->lxid = InvalidLocalTransactionId; + proc->vxid.lxid = InvalidLocalTransactionId; proc->xmin = InvalidTransactionId; /* be sure this is cleared in abort */ @@ -745,7 +742,7 @@ ProcArrayEndTransactionInternal(PGPROC *proc, TransactionId latestXid) ProcGlobal->xids[pgxactoff] = InvalidTransactionId; proc->xid = InvalidTransactionId; - proc->lxid = InvalidLocalTransactionId; + proc->vxid.lxid = InvalidLocalTransactionId; proc->xmin = InvalidTransactionId; /* be sure this is cleared in abort */ @@ -776,7 +773,7 @@ ProcArrayEndTransactionInternal(PGPROC *proc, TransactionId latestXid) MaintainLatestCompletedXid(latestXid); /* Same with xactCompletionCount */ - ShmemVariableCache->xactCompletionCount++; + TransamVariables->xactCompletionCount++; } /* @@ -794,6 +791,7 @@ ProcArrayEndTransactionInternal(PGPROC *proc, TransactionId latestXid) static void ProcArrayGroupClearXid(PGPROC *proc, TransactionId latestXid) { + int pgprocno = GetNumberFromPGProc(proc); PROC_HDR *procglobal = ProcGlobal; uint32 nextidx; uint32 wakeidx; @@ -811,7 +809,7 @@ ProcArrayGroupClearXid(PGPROC *proc, TransactionId latestXid) if (pg_atomic_compare_exchange_u32(&procglobal->procArrayGroupFirst, &nextidx, - (uint32) proc->pgprocno)) + (uint32) pgprocno)) break; } @@ -819,9 +817,9 @@ ProcArrayGroupClearXid(PGPROC *proc, TransactionId latestXid) * If the list was not empty, the leader will clear our XID. It is * impossible to have followers without a leader because the first process * that has added itself to the list will always have nextidx as - * INVALID_PGPROCNO. + * INVALID_PROC_NUMBER. */ - if (nextidx != INVALID_PGPROCNO) + if (nextidx != INVALID_PROC_NUMBER) { int extraWaits = 0; @@ -837,7 +835,7 @@ ProcArrayGroupClearXid(PGPROC *proc, TransactionId latestXid) } pgstat_report_wait_end(); - Assert(pg_atomic_read_u32(&proc->procArrayGroupNext) == INVALID_PGPROCNO); + Assert(pg_atomic_read_u32(&proc->procArrayGroupNext) == INVALID_PROC_NUMBER); /* Fix semaphore count for any absorbed wakeups */ while (extraWaits-- > 0) @@ -854,13 +852,13 @@ ProcArrayGroupClearXid(PGPROC *proc, TransactionId latestXid) * to pop elements one at a time could lead to an ABA problem. */ nextidx = pg_atomic_exchange_u32(&procglobal->procArrayGroupFirst, - INVALID_PGPROCNO); + INVALID_PROC_NUMBER); /* Remember head of list so we can perform wakeups after dropping lock. */ wakeidx = nextidx; /* Walk the list and clear all XIDs. */ - while (nextidx != INVALID_PGPROCNO) + while (nextidx != INVALID_PROC_NUMBER) { PGPROC *nextproc = &allProcs[nextidx]; @@ -880,12 +878,12 @@ ProcArrayGroupClearXid(PGPROC *proc, TransactionId latestXid) * up are probably much slower than the simple memory writes we did while * holding the lock. */ - while (wakeidx != INVALID_PGPROCNO) + while (wakeidx != INVALID_PROC_NUMBER) { PGPROC *nextproc = &allProcs[wakeidx]; wakeidx = pg_atomic_read_u32(&nextproc->procArrayGroupNext); - pg_atomic_write_u32(&nextproc->procArrayGroupNext, INVALID_PGPROCNO); + pg_atomic_write_u32(&nextproc->procArrayGroupNext, INVALID_PROC_NUMBER); /* ensure all previous writes are visible before follower continues. */ pg_write_barrier(); @@ -931,7 +929,7 @@ ProcArrayClearTransaction(PGPROC *proc) ProcGlobal->xids[pgxactoff] = InvalidTransactionId; proc->xid = InvalidTransactionId; - proc->lxid = InvalidLocalTransactionId; + proc->vxid.lxid = InvalidLocalTransactionId; proc->xmin = InvalidTransactionId; proc->recoveryConflictPending = false; @@ -945,7 +943,7 @@ ProcArrayClearTransaction(PGPROC *proc) * otherwise could end up reusing the snapshot later. Which would be bad, * because it might not count the prepared transaction as running. */ - ShmemVariableCache->xactCompletionCount++; + TransamVariables->xactCompletionCount++; /* Clear the subtransaction-XID cache too */ Assert(ProcGlobal->subxidStates[pgxactoff].count == proc->subxidStatus.count && @@ -962,13 +960,13 @@ ProcArrayClearTransaction(PGPROC *proc) } /* - * Update ShmemVariableCache->latestCompletedXid to point to latestXid if + * Update TransamVariables->latestCompletedXid to point to latestXid if * currently older. */ static void MaintainLatestCompletedXid(TransactionId latestXid) { - FullTransactionId cur_latest = ShmemVariableCache->latestCompletedXid; + FullTransactionId cur_latest = TransamVariables->latestCompletedXid; Assert(FullTransactionIdIsValid(cur_latest)); Assert(!RecoveryInProgress()); @@ -976,12 +974,12 @@ MaintainLatestCompletedXid(TransactionId latestXid) if (TransactionIdPrecedes(XidFromFullTransactionId(cur_latest), latestXid)) { - ShmemVariableCache->latestCompletedXid = + TransamVariables->latestCompletedXid = FullXidRelativeTo(cur_latest, latestXid); } Assert(IsBootstrapProcessingMode() || - FullTransactionIdIsNormal(ShmemVariableCache->latestCompletedXid)); + FullTransactionIdIsNormal(TransamVariables->latestCompletedXid)); } /* @@ -990,7 +988,7 @@ MaintainLatestCompletedXid(TransactionId latestXid) static void MaintainLatestCompletedXidRecovery(TransactionId latestXid) { - FullTransactionId cur_latest = ShmemVariableCache->latestCompletedXid; + FullTransactionId cur_latest = TransamVariables->latestCompletedXid; FullTransactionId rel; Assert(AmStartupProcess() || !IsUnderPostmaster); @@ -1001,17 +999,17 @@ MaintainLatestCompletedXidRecovery(TransactionId latestXid) * latestCompletedXid to be initialized in recovery. But in recovery it's * safe to access nextXid without a lock for the startup process. */ - rel = ShmemVariableCache->nextXid; - Assert(FullTransactionIdIsValid(ShmemVariableCache->nextXid)); + rel = TransamVariables->nextXid; + Assert(FullTransactionIdIsValid(TransamVariables->nextXid)); if (!FullTransactionIdIsValid(cur_latest) || TransactionIdPrecedes(XidFromFullTransactionId(cur_latest), latestXid)) { - ShmemVariableCache->latestCompletedXid = + TransamVariables->latestCompletedXid = FullXidRelativeTo(rel, latestXid); } - Assert(FullTransactionIdIsNormal(ShmemVariableCache->latestCompletedXid)); + Assert(FullTransactionIdIsNormal(TransamVariables->latestCompletedXid)); } /* @@ -1056,6 +1054,7 @@ void ProcArrayApplyRecoveryInfo(RunningTransactions running) { TransactionId *xids; + TransactionId advanceNextXid; int nxids; int i; @@ -1069,6 +1068,16 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running) */ ExpireOldKnownAssignedTransactionIds(running->oldestRunningXid); + /* + * Adjust TransamVariables->nextXid before StandbyReleaseOldLocks(), + * because we will need it up to date for accessing two-phase transactions + * in StandbyReleaseOldLocks(). + */ + advanceNextXid = running->nextXid; + TransactionIdRetreat(advanceNextXid); + AdvanceNextFullTransactionIdPastXid(advanceNextXid); + Assert(FullTransactionIdIsValid(TransamVariables->nextXid)); + /* * Remove stale locks, if any. */ @@ -1097,7 +1106,7 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running) * If the snapshot isn't overflowed or if its empty we can reset our * pending state and use this snapshot instead. */ - if (!running->subxid_overflow || running->xcnt == 0) + if (running->subxid_status != SUBXIDS_MISSING || running->xcnt == 0) { /* * If we have already collected known assigned xids, we need to @@ -1112,11 +1121,11 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running) running->oldestRunningXid)) { standbyState = STANDBY_SNAPSHOT_READY; - elog(trace_recovery(DEBUG1), + elog(DEBUG1, "recovery snapshots are now enabled"); } else - elog(trace_recovery(DEBUG1), + elog(DEBUG1, "recovery snapshot waiting for non-overflowed snapshot or " "until oldest active xid on standby is at least %u (now %u)", standbySnapshotPendingXmin, @@ -1211,7 +1220,7 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running) KnownAssignedXidsAdd(xids[i], xids[i], true); } - KnownAssignedXidsDisplay(trace_recovery(DEBUG3)); + KnownAssignedXidsDisplay(DEBUG3); } pfree(xids); @@ -1249,7 +1258,7 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running) * missing, so conservatively assume the last one is latestObservedXid. * ---------- */ - if (running->subxid_overflow) + if (running->subxid_status == SUBXIDS_MISSING) { standbyState = STANDBY_SNAPSHOT_PENDING; @@ -1261,6 +1270,18 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running) standbyState = STANDBY_SNAPSHOT_READY; standbySnapshotPendingXmin = InvalidTransactionId; + + /* + * If the 'xids' array didn't include all subtransactions, we have to + * mark any snapshots taken as overflowed. + */ + if (running->subxid_status == SUBXIDS_IN_SUBTRANS) + procArray->lastOverflowedXid = latestObservedXid; + else + { + Assert(running->subxid_status == SUBXIDS_IN_ARRAY); + procArray->lastOverflowedXid = InvalidTransactionId; + } } /* @@ -1272,22 +1293,17 @@ ProcArrayApplyRecoveryInfo(RunningTransactions running) MaintainLatestCompletedXidRecovery(running->latestCompletedXid); /* - * NB: No need to increment ShmemVariableCache->xactCompletionCount here, + * NB: No need to increment TransamVariables->xactCompletionCount here, * nobody can see it yet. */ LWLockRelease(ProcArrayLock); - /* ShmemVariableCache->nextXid must be beyond any observed xid. */ - AdvanceNextFullTransactionIdPastXid(latestObservedXid); - - Assert(FullTransactionIdIsValid(ShmemVariableCache->nextXid)); - - KnownAssignedXidsDisplay(trace_recovery(DEBUG3)); + KnownAssignedXidsDisplay(DEBUG3); if (standbyState == STANDBY_SNAPSHOT_READY) - elog(trace_recovery(DEBUG1), "recovery snapshots are now enabled"); + elog(DEBUG1, "recovery snapshots are now enabled"); else - elog(trace_recovery(DEBUG1), + elog(DEBUG1, "recovery snapshot waiting for non-overflowed snapshot or " "until oldest active xid on standby is at least %u (now %u)", standbySnapshotPendingXmin, @@ -1459,7 +1475,7 @@ TransactionIdIsInProgress(TransactionId xid) * target Xid is after that, it's surely still running. */ latestCompletedXid = - XidFromFullTransactionId(ShmemVariableCache->latestCompletedXid); + XidFromFullTransactionId(TransamVariables->latestCompletedXid); if (TransactionIdPrecedes(latestCompletedXid, xid)) { LWLockRelease(ProcArrayLock); @@ -1711,9 +1727,9 @@ TransactionIdIsActive(TransactionId xid) * Note: the approximate horizons (see definition of GlobalVisState) are * updated by the computations done here. That's currently required for * correctness and a small optimization. Without doing so it's possible that - * heap vacuum's call to heap_page_prune() uses a more conservative horizon - * than later when deciding which tuples can be removed - which the code - * doesn't expect (breaking HOT). + * heap vacuum's call to heap_page_prune_and_freeze() uses a more conservative + * horizon than later when deciding which tuples can be removed - which the + * code doesn't expect (breaking HOT). */ static void ComputeXidHorizons(ComputeXidHorizonsResult *h) @@ -1728,7 +1744,7 @@ ComputeXidHorizons(ComputeXidHorizonsResult *h) LWLockAcquire(ProcArrayLock, LW_SHARED); - h->latest_completed = ShmemVariableCache->latestCompletedXid; + h->latest_completed = TransamVariables->latestCompletedXid; /* * We initialize the MIN() calculation with latestCompletedXid + 1. This @@ -2066,34 +2082,6 @@ GetMaxSnapshotSubxidCount(void) return TOTAL_MAX_CACHED_SUBXIDS; } -/* - * Initialize old_snapshot_threshold specific parts of a newly build snapshot. - */ -static void -GetSnapshotDataInitOldSnapshot(Snapshot snapshot) -{ - if (!OldSnapshotThresholdActive()) - { - /* - * If not using "snapshot too old" feature, fill related fields with - * dummy values that don't require any locking. - */ - snapshot->lsn = InvalidXLogRecPtr; - snapshot->whenTaken = 0; - } - else - { - /* - * Capture the current time and WAL stream location in case this - * snapshot becomes old enough to need to fall back on the special - * "old snapshot" logic. - */ - snapshot->lsn = GetXLogInsertRecPtr(); - snapshot->whenTaken = GetSnapshotCurrentTimestamp(); - MaintainOldSnapshotTimeMapping(snapshot->whenTaken, snapshot->xmin); - } -} - /* * Helper function for GetSnapshotData() that checks if the bulk of the * visibility information in the snapshot is still valid. If so, it updates @@ -2113,7 +2101,7 @@ GetSnapshotDataReuse(Snapshot snapshot) if (unlikely(snapshot->snapXactCompletionCount == 0)) return false; - curXactCompletionCount = ShmemVariableCache->xactCompletionCount; + curXactCompletionCount = TransamVariables->xactCompletionCount; if (curXactCompletionCount != snapshot->snapXactCompletionCount) return false; @@ -2127,7 +2115,7 @@ GetSnapshotDataReuse(Snapshot snapshot) * GetSnapshotData() cannot change while ProcArrayLock is held. Snapshot * contents only depend on transactions with xids and xactCompletionCount * is incremented whenever a transaction with an xid finishes (while - * holding ProcArrayLock) exclusively). Thus the xactCompletionCount check + * holding ProcArrayLock exclusively). Thus the xactCompletionCount check * ensures we would detect if the snapshot would have changed. * * As the snapshot contents are the same as it was before, it is safe to @@ -2147,8 +2135,8 @@ GetSnapshotDataReuse(Snapshot snapshot) snapshot->active_count = 0; snapshot->regd_count = 0; snapshot->copied = false; - - GetSnapshotDataInitOldSnapshot(snapshot); + snapshot->lsn = InvalidXLogRecPtr; + snapshot->whenTaken = 0; return true; } @@ -2171,8 +2159,7 @@ GetSnapshotDataReuse(Snapshot snapshot) * but since PGPROC has only a limited cache area for subxact XIDs, full * information may not be available. If we find any overflowed subxid arrays, * we have to mark the snapshot's subxid data as overflowed, and extra work - * *may* need to be done to determine what's running (see XidInMVCCSnapshot() - * in heapam_visibility.c). + * *may* need to be done to determine what's running (see XidInMVCCSnapshot()). * * We also update the following backend-global variables: * TransactionXmin: the oldest xmin of any snapshot in use in the @@ -2251,13 +2238,13 @@ GetSnapshotData(Snapshot snapshot) return snapshot; } - latest_completed = ShmemVariableCache->latestCompletedXid; + latest_completed = TransamVariables->latestCompletedXid; mypgxactoff = MyProc->pgxactoff; myxid = other_xids[mypgxactoff]; Assert(myxid == MyProc->xid); - oldestxid = ShmemVariableCache->oldestXid; - curXactCompletionCount = ShmemVariableCache->xactCompletionCount; + oldestxid = TransamVariables->oldestXid; + curXactCompletionCount = TransamVariables->xactCompletionCount; /* xmax is always latestCompletedXid + 1 */ xmax = XidFromFullTransactionId(latest_completed); @@ -2492,10 +2479,10 @@ GetSnapshotData(Snapshot snapshot) /* * Check if we know that we can initialize or increase the lower * bound. Currently the only cheap way to do so is to use - * ShmemVariableCache->oldestXid as input. + * TransamVariables->oldestXid as input. * * We should definitely be able to do better. We could e.g. put a - * global lower bound value into ShmemVariableCache. + * global lower bound value into TransamVariables. */ GlobalVisSharedRels.maybe_needed = FullTransactionIdNewer(GlobalVisSharedRels.maybe_needed, @@ -2529,8 +2516,8 @@ GetSnapshotData(Snapshot snapshot) snapshot->active_count = 0; snapshot->regd_count = 0; snapshot->copied = false; - - GetSnapshotDataInitOldSnapshot(snapshot); + snapshot->lsn = InvalidXLogRecPtr; + snapshot->whenTaken = 0; return snapshot; } @@ -2560,6 +2547,11 @@ ProcArrayInstallImportedXmin(TransactionId xmin, /* Get lock so source xact can't end while we're doing this */ LWLockAcquire(ProcArrayLock, LW_SHARED); + /* + * Find the PGPROC entry of the source transaction. (This could use + * GetPGProcByNumber(), unless it's a prepared xact. But this isn't + * performance critical.) + */ for (index = 0; index < arrayP->numProcs; index++) { int pgprocno = arrayP->pgprocnos[index]; @@ -2572,9 +2564,9 @@ ProcArrayInstallImportedXmin(TransactionId xmin, continue; /* We are only interested in the specific virtual transaction. */ - if (proc->backendId != sourcevxid->backendId) + if (proc->vxid.procNumber != sourcevxid->procNumber) continue; - if (proc->lxid != sourcevxid->localTransactionId) + if (proc->vxid.lxid != sourcevxid->localTransactionId) continue; /* @@ -2708,6 +2700,7 @@ GetRunningTransactionData(void) RunningTransactions CurrentRunningXacts = &CurrentRunningXactsData; TransactionId latestCompletedXid; TransactionId oldestRunningXid; + TransactionId oldestDatabaseRunningXid; TransactionId *xids; int index; int count; @@ -2751,15 +2744,17 @@ GetRunningTransactionData(void) LWLockAcquire(XidGenLock, LW_SHARED); latestCompletedXid = - XidFromFullTransactionId(ShmemVariableCache->latestCompletedXid); - oldestRunningXid = - XidFromFullTransactionId(ShmemVariableCache->nextXid); + XidFromFullTransactionId(TransamVariables->latestCompletedXid); + oldestDatabaseRunningXid = oldestRunningXid = + XidFromFullTransactionId(TransamVariables->nextXid); /* * Spin over procArray collecting all xids */ for (index = 0; index < arrayP->numProcs; index++) { + int pgprocno = arrayP->pgprocnos[index]; + PGPROC *proc = &allProcs[pgprocno]; TransactionId xid; /* Fetch xid just once - see GetNewTransactionId */ @@ -2780,6 +2775,13 @@ GetRunningTransactionData(void) if (TransactionIdPrecedes(xid, oldestRunningXid)) oldestRunningXid = xid; + /* + * Also, update the oldest running xid within the current database. + */ + if (proc->databaseId == MyDatabaseId && + TransactionIdPrecedes(xid, oldestDatabaseRunningXid)) + oldestDatabaseRunningXid = xid; + if (ProcGlobal->subxidStates[index].overflowed) suboverflowed = true; @@ -2843,9 +2845,10 @@ GetRunningTransactionData(void) CurrentRunningXacts->xcnt = count - subcount; CurrentRunningXacts->subxcnt = subcount; - CurrentRunningXacts->subxid_overflow = suboverflowed; - CurrentRunningXacts->nextXid = XidFromFullTransactionId(ShmemVariableCache->nextXid); + CurrentRunningXacts->subxid_status = suboverflowed ? SUBXIDS_IN_SUBTRANS : SUBXIDS_IN_ARRAY; + CurrentRunningXacts->nextXid = XidFromFullTransactionId(TransamVariables->nextXid); CurrentRunningXacts->oldestRunningXid = oldestRunningXid; + CurrentRunningXacts->oldestDatabaseRunningXid = oldestDatabaseRunningXid; CurrentRunningXacts->latestCompletedXid = latestCompletedXid; Assert(TransactionIdIsValid(CurrentRunningXacts->nextXid)); @@ -2890,7 +2893,7 @@ GetOldestActiveTransactionId(void) * have already completed), when we spin over it. */ LWLockAcquire(XidGenLock, LW_SHARED); - oldestRunningXid = XidFromFullTransactionId(ShmemVariableCache->nextXid); + oldestRunningXid = XidFromFullTransactionId(TransamVariables->nextXid); LWLockRelease(XidGenLock); /* @@ -2956,7 +2959,7 @@ GetOldestSafeDecodingTransactionId(bool catalogOnly) * a safe, albeit pessimal, value. */ LWLockAcquire(XidGenLock, LW_SHARED); - oldestSafeXid = XidFromFullTransactionId(ShmemVariableCache->nextXid); + oldestSafeXid = XidFromFullTransactionId(TransamVariables->nextXid); /* * If there's already a slot pegging the xmin horizon, we can start with @@ -3123,6 +3126,64 @@ HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids, int nvxids, int type) return result; } +/* + * ProcNumberGetProc -- get a backend's PGPROC given its proc number + * + * The result may be out of date arbitrarily quickly, so the caller + * must be careful about how this information is used. NULL is + * returned if the backend is not active. + */ +PGPROC * +ProcNumberGetProc(ProcNumber procNumber) +{ + PGPROC *result; + + if (procNumber < 0 || procNumber >= ProcGlobal->allProcCount) + return NULL; + result = GetPGProcByNumber(procNumber); + + if (result->pid == 0) + return NULL; + + return result; +} + +/* + * ProcNumberGetTransactionIds -- get a backend's transaction status + * + * Get the xid, xmin, nsubxid and overflow status of the backend. The + * result may be out of date arbitrarily quickly, so the caller must be + * careful about how this information is used. + */ +void +ProcNumberGetTransactionIds(ProcNumber procNumber, TransactionId *xid, + TransactionId *xmin, int *nsubxid, bool *overflowed) +{ + PGPROC *proc; + + *xid = InvalidTransactionId; + *xmin = InvalidTransactionId; + *nsubxid = 0; + *overflowed = false; + + if (procNumber < 0 || procNumber >= ProcGlobal->allProcCount) + return; + proc = GetPGProcByNumber(procNumber); + + /* Need to lock out additions/removals of backends */ + LWLockAcquire(ProcArrayLock, LW_SHARED); + + if (proc->pid != 0) + { + *xid = proc->xid; + *xmin = proc->xmin; + *nsubxid = proc->subxidStatus.count; + *overflowed = proc->subxidStatus.overflowed; + } + + LWLockRelease(ProcArrayLock); +} + /* * BackendPidGetProc -- get a backend's PGPROC given its PID * @@ -3205,11 +3266,11 @@ BackendXidGetPid(TransactionId xid) for (index = 0; index < arrayP->numProcs; index++) { - int pgprocno = arrayP->pgprocnos[index]; - PGPROC *proc = &allProcs[pgprocno]; - if (other_xids[index] == xid) { + int pgprocno = arrayP->pgprocnos[index]; + PGPROC *proc = &allProcs[pgprocno]; + result = proc->pid; break; } @@ -3414,7 +3475,7 @@ GetConflictingVirtualXIDs(TransactionId limitXmin, Oid dbOid) LWLockRelease(ProcArrayLock); /* add the terminator */ - vxids[count].backendId = InvalidBackendId; + vxids[count].procNumber = INVALID_PROC_NUMBER; vxids[count].localTransactionId = InvalidLocalTransactionId; return vxids; @@ -3449,7 +3510,7 @@ SignalVirtualTransaction(VirtualTransactionId vxid, ProcSignalReason sigmode, GET_VXID_FROM_PGPROC(procvxid, *proc); - if (procvxid.backendId == vxid.backendId && + if (procvxid.procNumber == vxid.procNumber && procvxid.localTransactionId == vxid.localTransactionId) { proc->recoveryConflictPending = conflictPending; @@ -3460,7 +3521,7 @@ SignalVirtualTransaction(VirtualTransactionId vxid, ProcSignalReason sigmode, * Kill the pid if it's still here. If not, that's what we * wanted so ignore any errors. */ - (void) SendProcSignal(pid, sigmode, vxid.backendId); + (void) SendProcSignal(pid, sigmode, vxid.procNumber); } break; } @@ -3560,8 +3621,7 @@ CountDBBackends(Oid databaseid) } /* - * CountDBConnections --- counts database backends ignoring any background - * worker processes + * CountDBConnections --- counts database backends (only regular backends) */ int CountDBConnections(Oid databaseid) @@ -3623,7 +3683,7 @@ CancelDBBackends(Oid databaseid, ProcSignalReason sigmode, bool conflictPending) * Kill the pid if it's still here. If not, that's what we * wanted so ignore any errors. */ - (void) SendProcSignal(pid, sigmode, procvxid.backendId); + (void) SendProcSignal(pid, sigmode, procvxid.procNumber); } } } @@ -3633,6 +3693,7 @@ CancelDBBackends(Oid databaseid, ProcSignalReason sigmode, bool conflictPending) /* * CountUserBackends --- count backends that are used by specified user + * (only regular backends, not any type of background worker) */ int CountUserBackends(Oid roleid) @@ -3759,8 +3820,8 @@ CountOtherDBBackends(Oid databaseId, int *nbackends, int *nprepared) * The current backend is always ignored; it is caller's responsibility to * check whether the current backend uses the given DB, if it's important. * - * It doesn't allow to terminate the connections even if there is a one - * backend with the prepared transaction in the target database. + * If the target database has a prepared transaction or permissions checks + * fail for a connection, this fails without terminating anything. */ void TerminateOtherDBBackends(Oid databaseId) @@ -3805,14 +3866,19 @@ TerminateOtherDBBackends(Oid databaseId) ListCell *lc; /* - * Check whether we have the necessary rights to terminate other - * sessions. We don't terminate any session until we ensure that we - * have rights on all the sessions to be terminated. These checks are - * the same as we do in pg_terminate_backend. + * Permissions checks relax the pg_terminate_backend checks in two + * ways, both by omitting the !OidIsValid(proc->roleId) check: + * + * - Accept terminating autovacuum workers, since DROP DATABASE + * without FORCE terminates them. * - * In this case we don't raise some warnings - like "PID %d is not a - * PostgreSQL server process", because for us already finished session - * is not a problem. + * - Accept terminating bgworkers. For bgworker authors, it's + * convenient to be able to recommend FORCE if a worker is blocking + * DROP DATABASE unexpectedly. + * + * Unlike pg_terminate_backend, we don't raise some warnings - like + * "PID %d is not a PostgreSQL server process", because for us already + * finished session is not a problem. */ foreach(lc, pids) { @@ -3821,13 +3887,13 @@ TerminateOtherDBBackends(Oid databaseId) if (proc != NULL) { - /* Only allow superusers to signal superuser-owned backends. */ if (superuser_arg(proc->roleId) && !superuser()) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be a superuser to terminate superuser process"))); + errmsg("permission denied to terminate process"), + errdetail("Only roles with the %s attribute may terminate processes of roles with the %s attribute.", + "SUPERUSER", "SUPERUSER"))); - /* Users can signal backends they have role membership in. */ if (!has_privs_of_role(GetUserId(), proc->roleId) && !has_privs_of_role(GetUserId(), ROLE_PG_SIGNAL_BACKEND)) ereport(ERROR, @@ -3998,7 +4064,7 @@ XidCacheRemoveRunningXids(TransactionId xid, MaintainLatestCompletedXid(latestXid); /* ... and xactCompletionCount */ - ShmemVariableCache->xactCompletionCount++; + TransamVariables->xactCompletionCount++; LWLockRelease(ProcArrayLock); } @@ -4211,36 +4277,6 @@ GlobalVisTestIsRemovableXid(GlobalVisState *state, TransactionId xid) return GlobalVisTestIsRemovableFullXid(state, fxid); } -/* - * Return FullTransactionId below which all transactions are not considered - * running anymore. - * - * Note: This is less efficient than testing with - * GlobalVisTestIsRemovableFullXid as it likely requires building an accurate - * cutoff, even in the case all the XIDs compared with the cutoff are outside - * [maybe_needed, definitely_needed). - */ -FullTransactionId -GlobalVisTestNonRemovableFullHorizon(GlobalVisState *state) -{ - /* acquire accurate horizon if not already done */ - if (GlobalVisTestShouldUpdate(state)) - GlobalVisUpdate(); - - return state->maybe_needed; -} - -/* Convenience wrapper around GlobalVisTestNonRemovableFullHorizon */ -TransactionId -GlobalVisTestNonRemovableHorizon(GlobalVisState *state) -{ - FullTransactionId cutoff; - - cutoff = GlobalVisTestNonRemovableFullHorizon(state); - - return XidFromFullTransactionId(cutoff); -} - /* * Convenience wrapper around GlobalVisTestFor() and * GlobalVisTestIsRemovableFullXid(), see their comments. @@ -4369,7 +4405,7 @@ RecordKnownAssignedTransactionIds(TransactionId xid) Assert(TransactionIdIsValid(xid)); Assert(TransactionIdIsValid(latestObservedXid)); - elog(trace_recovery(DEBUG4), "record known xact %u latestObservedXid %u", + elog(DEBUG4, "record known xact %u latestObservedXid %u", xid, latestObservedXid); /* @@ -4420,7 +4456,7 @@ RecordKnownAssignedTransactionIds(TransactionId xid) */ latestObservedXid = xid; - /* ShmemVariableCache->nextXid must be beyond any observed xid */ + /* TransamVariables->nextXid must be beyond any observed xid */ AdvanceNextFullTransactionIdPastXid(latestObservedXid); } } @@ -4448,7 +4484,7 @@ ExpireTreeKnownAssignedTransactionIds(TransactionId xid, int nsubxids, MaintainLatestCompletedXidRecovery(max_xid); /* ... and xactCompletionCount */ - ShmemVariableCache->xactCompletionCount++; + TransamVariables->xactCompletionCount++; LWLockRelease(ProcArrayLock); } @@ -4460,9 +4496,23 @@ ExpireTreeKnownAssignedTransactionIds(TransactionId xid, int nsubxids, void ExpireAllKnownAssignedTransactionIds(void) { + FullTransactionId latestXid; + LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); KnownAssignedXidsRemovePreceding(InvalidTransactionId); + /* Reset latestCompletedXid to nextXid - 1 */ + Assert(FullTransactionIdIsValid(TransamVariables->nextXid)); + latestXid = TransamVariables->nextXid; + FullTransactionIdRetreat(&latestXid); + TransamVariables->latestCompletedXid = latestXid; + + /* + * Any transactions that were in-progress were effectively aborted, so + * advance xactCompletionCount. + */ + TransamVariables->xactCompletionCount++; + /* * Reset lastOverflowedXid. Currently, lastOverflowedXid has no use after * the call of this function. But do this for unification with what @@ -4480,8 +4530,18 @@ ExpireAllKnownAssignedTransactionIds(void) void ExpireOldKnownAssignedTransactionIds(TransactionId xid) { + TransactionId latestXid; + LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); + /* As in ProcArrayEndTransaction, advance latestCompletedXid */ + latestXid = xid; + TransactionIdRetreat(latestXid); + MaintainLatestCompletedXidRecovery(latestXid); + + /* ... and xactCompletionCount */ + TransamVariables->xactCompletionCount++; + /* * Reset lastOverflowedXid if we know all transactions that have been * possibly running are being gone. Not doing so could cause an incorrect @@ -4559,22 +4619,19 @@ KnownAssignedTransactionIdsIdleMaintenance(void) * during normal running). Compressing unused entries out of the array * likewise requires exclusive lock. To add XIDs to the array, we just insert * them into slots to the right of the head pointer and then advance the head - * pointer. This wouldn't require any lock at all, except that on machines - * with weak memory ordering we need to be careful that other processors - * see the array element changes before they see the head pointer change. - * We handle this by using a spinlock to protect reads and writes of the - * head/tail pointers. (We could dispense with the spinlock if we were to - * create suitable memory access barrier primitives and use those instead.) - * The spinlock must be taken to read or write the head/tail pointers unless - * the caller holds ProcArrayLock exclusively. + * pointer. This doesn't require any lock at all, but on machines with weak + * memory ordering, we need to be careful that other processors see the array + * element changes before they see the head pointer change. We handle this by + * using memory barriers when reading or writing the head/tail pointers (unless + * the caller holds ProcArrayLock exclusively). * * Algorithmic analysis: * * If we have a maximum of M slots, with N XIDs currently spread across * S elements then we have N <= S <= M always. * - * * Adding a new XID is O(1) and needs little locking (unless compression - * must happen) + * * Adding a new XID is O(1) and needs no lock (unless compression must + * happen) * * Compressing the array is O(S) and requires exclusive lock * * Removing an XID is O(logS) and requires exclusive lock * * Taking a snapshot is O(S) and requires shared lock @@ -4804,22 +4861,15 @@ KnownAssignedXidsAdd(TransactionId from_xid, TransactionId to_xid, pArray->numKnownAssignedXids += nxids; /* - * Now update the head pointer. We use a spinlock to protect this - * pointer, not because the update is likely to be non-atomic, but to - * ensure that other processors see the above array updates before they - * see the head pointer change. - * - * If we're holding ProcArrayLock exclusively, there's no need to take the - * spinlock. + * Now update the head pointer. We use a write barrier to ensure that + * other processors see the above array updates before they see the head + * pointer change. The barrier isn't required if we're holding + * ProcArrayLock exclusively. */ - if (exclusive_lock) - pArray->headKnownAssignedXids = head; - else - { - SpinLockAcquire(&pArray->known_assigned_xids_lck); - pArray->headKnownAssignedXids = head; - SpinLockRelease(&pArray->known_assigned_xids_lck); - } + if (!exclusive_lock) + pg_write_barrier(); + + pArray->headKnownAssignedXids = head; } /* @@ -4841,20 +4891,15 @@ KnownAssignedXidsSearch(TransactionId xid, bool remove) int tail; int result_index = -1; - if (remove) - { - /* we hold ProcArrayLock exclusively, so no need for spinlock */ - tail = pArray->tailKnownAssignedXids; - head = pArray->headKnownAssignedXids; - } - else - { - /* take spinlock to ensure we see up-to-date array contents */ - SpinLockAcquire(&pArray->known_assigned_xids_lck); - tail = pArray->tailKnownAssignedXids; - head = pArray->headKnownAssignedXids; - SpinLockRelease(&pArray->known_assigned_xids_lck); - } + tail = pArray->tailKnownAssignedXids; + head = pArray->headKnownAssignedXids; + + /* + * Only the startup process removes entries, so we don't need the read + * barrier in that case. + */ + if (!remove) + pg_read_barrier(); /* pairs with KnownAssignedXidsAdd */ /* * Standard binary search. Note we can ignore the KnownAssignedXidsValid @@ -4942,7 +4987,7 @@ KnownAssignedXidsRemove(TransactionId xid) { Assert(TransactionIdIsValid(xid)); - elog(trace_recovery(DEBUG4), "remove KnownAssignedXid %u", xid); + elog(DEBUG4, "remove KnownAssignedXid %u", xid); /* * Note: we cannot consider it an error to remove an XID that's not @@ -4996,13 +5041,13 @@ KnownAssignedXidsRemovePreceding(TransactionId removeXid) if (!TransactionIdIsValid(removeXid)) { - elog(trace_recovery(DEBUG4), "removing all KnownAssignedXids"); + elog(DEBUG4, "removing all KnownAssignedXids"); pArray->numKnownAssignedXids = 0; pArray->headKnownAssignedXids = pArray->tailKnownAssignedXids = 0; return; } - elog(trace_recovery(DEBUG4), "prune KnownAssignedXids to %u", removeXid); + elog(DEBUG4, "prune KnownAssignedXids to %u", removeXid); /* * Mark entries invalid starting at the tail. Since array is sorted, we @@ -5092,13 +5137,11 @@ KnownAssignedXidsGetAndSetXmin(TransactionId *xarray, TransactionId *xmin, * cannot enter and then leave the array while we hold ProcArrayLock. We * might miss newly-added xids, but they should be >= xmax so irrelevant * anyway. - * - * Must take spinlock to ensure we see up-to-date array contents. */ - SpinLockAcquire(&procArray->known_assigned_xids_lck); tail = procArray->tailKnownAssignedXids; head = procArray->headKnownAssignedXids; - SpinLockRelease(&procArray->known_assigned_xids_lck); + + pg_read_barrier(); /* pairs with KnownAssignedXidsAdd */ for (i = tail; i < head; i++) { @@ -5145,10 +5188,10 @@ KnownAssignedXidsGetOldestXmin(void) /* * Fetch head just once, since it may change while we loop. */ - SpinLockAcquire(&procArray->known_assigned_xids_lck); tail = procArray->tailKnownAssignedXids; head = procArray->headKnownAssignedXids; - SpinLockRelease(&procArray->known_assigned_xids_lck); + + pg_read_barrier(); /* pairs with KnownAssignedXidsAdd */ for (i = tail; i < head; i++) { diff --git a/src/backend/storage/ipc/procsignal.c b/src/backend/storage/ipc/procsignal.c index c85cb5cc18dbb..4ed9cedcdd4e5 100644 --- a/src/backend/storage/ipc/procsignal.c +++ b/src/backend/storage/ipc/procsignal.c @@ -4,7 +4,7 @@ * Routines for interprocess signaling * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -18,19 +18,18 @@ #include #include "access/parallel.h" -#include "port/pg_bitutils.h" #include "commands/async.h" #include "miscadmin.h" #include "pgstat.h" +#include "port/pg_bitutils.h" #include "replication/logicalworker.h" #include "replication/walsender.h" #include "storage/condition_variable.h" #include "storage/ipc.h" #include "storage/latch.h" -#include "storage/proc.h" #include "storage/shmem.h" -#include "storage/smgr.h" #include "storage/sinval.h" +#include "storage/smgr.h" #include "tcop/tcopprot.h" #include "utils/memutils.h" @@ -43,10 +42,10 @@ * observe it only once.) * * Each process that wants to receive signals registers its process ID - * in the ProcSignalSlots array. The array is indexed by backend ID to make + * in the ProcSignalSlots array. The array is indexed by ProcNumber to make * slot allocation simple, and to avoid having to search the array when you - * know the backend ID of the process you're signaling. (We do support - * signaling without backend ID, but it's a bit less efficient.) + * know the ProcNumber of the process you're signaling. (We do support + * signaling without ProcNumber, but it's a bit less efficient.) * * The flags are actually declared as "volatile sig_atomic_t" for maximum * portability. This should ensure that loads and stores of the flag @@ -83,11 +82,11 @@ typedef struct } ProcSignalHeader; /* - * We reserve a slot for each possible BackendId, plus one for each + * We reserve a slot for each possible ProcNumber, plus one for each * possible auxiliary process type. (This scheme assumes there is not * more than one of any auxiliary process type at a time.) */ -#define NumProcSignalSlots (MaxBackends + NUM_AUXPROCTYPES) +#define NumProcSignalSlots (MaxBackends + NUM_AUXILIARY_PROCS) /* Check whether the relevant type bit is set in the flags. */ #define BARRIER_SHOULD_CHECK(flags, type) \ @@ -154,24 +153,23 @@ ProcSignalShmemInit(void) /* * ProcSignalInit * Register the current process in the ProcSignal array - * - * The passed index should be my BackendId if the process has one, - * or MaxBackends + aux process type if not. */ void -ProcSignalInit(int pss_idx) +ProcSignalInit(void) { ProcSignalSlot *slot; uint64 barrier_generation; - Assert(pss_idx >= 1 && pss_idx <= NumProcSignalSlots); - - slot = &ProcSignal->psh_slot[pss_idx - 1]; + if (MyProcNumber < 0) + elog(ERROR, "MyProcNumber not set"); + if (MyProcNumber >= NumProcSignalSlots) + elog(ERROR, "unexpected MyProcNumber %d in ProcSignalInit (max %d)", MyProcNumber, NumProcSignalSlots); + slot = &ProcSignal->psh_slot[MyProcNumber]; /* sanity check */ if (slot->pss_pid != 0) elog(LOG, "process %d taking over ProcSignal slot %d, but it's not empty", - MyProcPid, pss_idx); + MyProcPid, MyProcNumber); /* Clear out any leftover signal reasons */ MemSet(slot->pss_signalFlags, 0, NUM_PROCSIGNALS * sizeof(sig_atomic_t)); @@ -200,7 +198,7 @@ ProcSignalInit(int pss_idx) MyProcSignalSlot = slot; /* Set up to release the slot on process exit */ - on_shmem_exit(CleanupProcSignalState, Int32GetDatum(pss_idx)); + on_shmem_exit(CleanupProcSignalState, (Datum) 0); } /* @@ -212,17 +210,14 @@ ProcSignalInit(int pss_idx) static void CleanupProcSignalState(int status, Datum arg) { - int pss_idx = DatumGetInt32(arg); - ProcSignalSlot *slot; - - slot = &ProcSignal->psh_slot[pss_idx - 1]; - Assert(slot == MyProcSignalSlot); + ProcSignalSlot *slot = MyProcSignalSlot; /* * Clear MyProcSignalSlot, so that a SIGUSR1 received after this point * won't try to access it after it's no longer ours (and perhaps even * after we've unmapped the shared memory segment). */ + Assert(MyProcSignalSlot != NULL); MyProcSignalSlot = NULL; /* sanity check */ @@ -233,7 +228,7 @@ CleanupProcSignalState(int status, Datum arg) * infinite loop trying to exit */ elog(LOG, "process %d releasing ProcSignal slot %d, but it contains %d", - MyProcPid, pss_idx, (int) slot->pss_pid); + MyProcPid, (int) (slot - ProcSignal->psh_slot), (int) slot->pss_pid); return; /* XXX better to zero the slot anyway? */ } @@ -251,7 +246,7 @@ CleanupProcSignalState(int status, Datum arg) * SendProcSignal * Send a signal to a Postgres process * - * Providing backendId is optional, but it will speed up the operation. + * Providing procNumber is optional, but it will speed up the operation. * * On success (a signal was sent), zero is returned. * On error, -1 is returned, and errno is set (typically to ESRCH or EPERM). @@ -259,13 +254,13 @@ CleanupProcSignalState(int status, Datum arg) * Not to be confused with ProcSendSignal */ int -SendProcSignal(pid_t pid, ProcSignalReason reason, BackendId backendId) +SendProcSignal(pid_t pid, ProcSignalReason reason, ProcNumber procNumber) { volatile ProcSignalSlot *slot; - if (backendId != InvalidBackendId) + if (procNumber != INVALID_PROC_NUMBER) { - slot = &ProcSignal->psh_slot[backendId - 1]; + slot = &ProcSignal->psh_slot[procNumber]; /* * Note: Since there's no locking, it's possible that the target @@ -286,10 +281,11 @@ SendProcSignal(pid_t pid, ProcSignalReason reason, BackendId backendId) else { /* - * BackendId not provided, so search the array using pid. We search + * Pronumber not provided, so search the array using pid. We search * the array back to front so as to reduce search overhead. Passing - * InvalidBackendId means that the target is most likely an auxiliary - * process, which will have a slot near the end of the array. + * INVALID_PROC_NUMBER means that the target is most likely an + * auxiliary process, which will have a slot near the end of the + * array. */ int i; @@ -638,8 +634,6 @@ CheckProcSignal(ProcSignalReason reason) void procsignal_sigusr1_handler(SIGNAL_ARGS) { - int save_errno = errno; - if (CheckProcSignal(PROCSIG_CATCHUP_INTERRUPT)) HandleCatchupInterrupt(); @@ -662,27 +656,25 @@ procsignal_sigusr1_handler(SIGNAL_ARGS) HandleParallelApplyMessageInterrupt(); if (CheckProcSignal(PROCSIG_RECOVERY_CONFLICT_DATABASE)) - RecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_DATABASE); + HandleRecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_DATABASE); if (CheckProcSignal(PROCSIG_RECOVERY_CONFLICT_TABLESPACE)) - RecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_TABLESPACE); + HandleRecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_TABLESPACE); if (CheckProcSignal(PROCSIG_RECOVERY_CONFLICT_LOCK)) - RecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_LOCK); + HandleRecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_LOCK); if (CheckProcSignal(PROCSIG_RECOVERY_CONFLICT_SNAPSHOT)) - RecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_SNAPSHOT); + HandleRecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_SNAPSHOT); if (CheckProcSignal(PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT)) - RecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT); + HandleRecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT); if (CheckProcSignal(PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK)) - RecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK); + HandleRecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK); if (CheckProcSignal(PROCSIG_RECOVERY_CONFLICT_BUFFERPIN)) - RecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_BUFFERPIN); + HandleRecoveryConflictInterrupt(PROCSIG_RECOVERY_CONFLICT_BUFFERPIN); SetLatch(MyLatch); - - errno = save_errno; } diff --git a/src/backend/storage/ipc/shm_mq.c b/src/backend/storage/ipc/shm_mq.c index d134a09a197b5..9235fcd08ec21 100644 --- a/src/backend/storage/ipc/shm_mq.c +++ b/src/backend/storage/ipc/shm_mq.c @@ -8,7 +8,7 @@ * and only the receiver may receive. This is intended to allow a user * backend to communicate with worker backends that it has registered. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/storage/ipc/shm_mq.c @@ -22,7 +22,6 @@ #include "pgstat.h" #include "port/pg_bitutils.h" #include "postmaster/bgworker.h" -#include "storage/procsignal.h" #include "storage/shm_mq.h" #include "storage/spin.h" #include "utils/memutils.h" @@ -1017,7 +1016,7 @@ shm_mq_send_bytes(shm_mq_handle *mqh, Size nbytes, const void *data, * cheaper than setting one that has been reset. */ (void) WaitLatch(MyLatch, WL_LATCH_SET | WL_EXIT_ON_PM_DEATH, 0, - WAIT_EVENT_MQ_SEND); + WAIT_EVENT_MESSAGE_QUEUE_SEND); /* Reset the latch so we don't spin. */ ResetLatch(MyLatch); @@ -1163,7 +1162,7 @@ shm_mq_receive_bytes(shm_mq_handle *mqh, Size bytes_needed, bool nowait, * setting one that has been reset. */ (void) WaitLatch(MyLatch, WL_LATCH_SET | WL_EXIT_ON_PM_DEATH, 0, - WAIT_EVENT_MQ_RECEIVE); + WAIT_EVENT_MESSAGE_QUEUE_RECEIVE); /* Reset the latch so we don't spin. */ ResetLatch(MyLatch); @@ -1252,7 +1251,7 @@ shm_mq_wait_internal(shm_mq *mq, PGPROC **ptr, BackgroundWorkerHandle *handle) /* Wait to be signaled. */ (void) WaitLatch(MyLatch, WL_LATCH_SET | WL_EXIT_ON_PM_DEATH, 0, - WAIT_EVENT_MQ_INTERNAL); + WAIT_EVENT_MESSAGE_QUEUE_INTERNAL); /* Reset the latch so we don't spin. */ ResetLatch(MyLatch); diff --git a/src/backend/storage/ipc/shm_toc.c b/src/backend/storage/ipc/shm_toc.c index 0cd824400f009..8db9d25aac241 100644 --- a/src/backend/storage/ipc/shm_toc.c +++ b/src/backend/storage/ipc/shm_toc.c @@ -3,7 +3,7 @@ * shm_toc.c * shared memory segment table of contents * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/storage/ipc/shm_toc.c diff --git a/src/backend/storage/ipc/shmem.c b/src/backend/storage/ipc/shmem.c index 5465fa19646a8..6d5f08398641c 100644 --- a/src/backend/storage/ipc/shmem.c +++ b/src/backend/storage/ipc/shmem.c @@ -3,7 +3,7 @@ * shmem.c * create shared memory and initialize shared memory data structures. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -65,7 +65,6 @@ #include "postgres.h" -#include "access/transam.h" #include "fmgr.h" #include "funcapi.h" #include "miscadmin.h" @@ -140,14 +139,6 @@ InitShmemAllocation(void) /* ShmemIndex can't be set up yet (need LWLocks first) */ shmhdr->index = NULL; ShmemIndex = (HTAB *) NULL; - - /* - * Initialize ShmemVariableCache for transaction manager. (This doesn't - * really belong here, but not worth moving.) - */ - ShmemVariableCache = (VariableCache) - ShmemAlloc(sizeof(*ShmemVariableCache)); - memset(ShmemVariableCache, 0, sizeof(*ShmemVariableCache)); } /* diff --git a/src/backend/storage/ipc/signalfuncs.c b/src/backend/storage/ipc/signalfuncs.c index 94ae553b94618..88e9bf8125d11 100644 --- a/src/backend/storage/ipc/signalfuncs.c +++ b/src/backend/storage/ipc/signalfuncs.c @@ -3,7 +3,7 @@ * signalfuncs.c * Functions for signaling backends * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -24,7 +24,7 @@ #include "storage/proc.h" #include "storage/procarray.h" #include "utils/acl.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" /* @@ -74,8 +74,13 @@ pg_signal_backend(int pid, int sig) return SIGNAL_BACKEND_ERROR; } - /* Only allow superusers to signal superuser-owned backends. */ - if (superuser_arg(proc->roleId) && !superuser()) + /* + * Only allow superusers to signal superuser-owned backends. Any process + * not advertising a role might have the importance of a superuser-owned + * backend, so treat it that way. + */ + if ((!OidIsValid(proc->roleId) || superuser_arg(proc->roleId)) && + !superuser()) return SIGNAL_BACKEND_NOSUPERUSER; /* Users can signal backends they have role membership in. */ @@ -265,33 +270,6 @@ pg_reload_conf(PG_FUNCTION_ARGS) } -/* - * Rotate log file - * - * This function is kept to support adminpack 1.0. - */ -Datum -pg_rotate_logfile(PG_FUNCTION_ARGS) -{ - if (!superuser()) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser to rotate log files with adminpack 1.0"), - /* translator: %s is a SQL function name */ - errhint("Consider using %s, which is part of core, instead.", - "pg_logfile_rotate()"))); - - if (!Logging_collector) - { - ereport(WARNING, - (errmsg("rotation not possible because log collection not active"))); - PG_RETURN_BOOL(false); - } - - SendPostmasterSignal(PMSIGNAL_ROTATE_LOGFILE); - PG_RETURN_BOOL(true); -} - /* * Rotate log file * @@ -299,7 +277,7 @@ pg_rotate_logfile(PG_FUNCTION_ARGS) * GRANT system. */ Datum -pg_rotate_logfile_v2(PG_FUNCTION_ARGS) +pg_rotate_logfile(PG_FUNCTION_ARGS) { if (!Logging_collector) { diff --git a/src/backend/storage/ipc/sinval.c b/src/backend/storage/ipc/sinval.c index b405f08313a36..4e69015fe4d15 100644 --- a/src/backend/storage/ipc/sinval.c +++ b/src/backend/storage/ipc/sinval.c @@ -3,7 +3,7 @@ * sinval.c * POSTGRES shared cache invalidation communication code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -15,10 +15,9 @@ #include "postgres.h" #include "access/xact.h" -#include "commands/async.h" #include "miscadmin.h" -#include "storage/ipc.h" -#include "storage/proc.h" +#include "nodes/memnodes.h" +#include "storage/latch.h" #include "storage/sinvaladt.h" #include "utils/inval.h" @@ -184,6 +183,7 @@ ProcessCatchupInterrupt(void) * can just call AcceptInvalidationMessages() to do this. If we * aren't, we start and immediately end a transaction; the call to * AcceptInvalidationMessages() happens down inside transaction start. + * Be sure to preserve caller's memory context when we do that. * * It is awfully tempting to just call AcceptInvalidationMessages() * without the rest of the xact start/stop overhead, and I think that @@ -197,9 +197,14 @@ ProcessCatchupInterrupt(void) } else { + MemoryContext oldcontext = CurrentMemoryContext; + elog(DEBUG4, "ProcessCatchupEvent outside transaction"); StartTransactionCommand(); CommitTransactionCommand(); + /* Caller's context had better not have been transaction-local */ + Assert(MemoryContextIsValid(oldcontext)); + MemoryContextSwitchTo(oldcontext); } } } diff --git a/src/backend/storage/ipc/sinvaladt.c b/src/backend/storage/ipc/sinvaladt.c index 3d97c75bf102e..271212987e0ce 100644 --- a/src/backend/storage/ipc/sinvaladt.c +++ b/src/backend/storage/ipc/sinvaladt.c @@ -3,7 +3,7 @@ * sinvaladt.c * POSTGRES shared cache invalidation data manager. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,9 +19,9 @@ #include "access/transam.h" #include "miscadmin.h" -#include "storage/backendid.h" #include "storage/ipc.h" #include "storage/proc.h" +#include "storage/procnumber.h" #include "storage/procsignal.h" #include "storage/shmem.h" #include "storage/sinvaladt.h" @@ -139,7 +139,6 @@ typedef struct ProcState { /* procPid is zero in an inactive ProcState array entry. */ pid_t procPid; /* PID of backend, for signaling */ - PGPROC *proc; /* PGPROC of backend */ /* nextMsgNum is meaningless if procPid == 0 or resetState is true. */ int nextMsgNum; /* next message number to read */ bool resetState; /* backend needs to reset its state */ @@ -156,8 +155,8 @@ typedef struct ProcState /* * Next LocalTransactionId to use for each idle backend slot. We keep - * this here because it is indexed by BackendId and it is convenient to - * copy the value to and from local memory when MyBackendId is set. It's + * this here because it is indexed by ProcNumber and it is convenient to + * copy the value to and from local memory when MyProcNumber is set. It's * meaningless in an active ProcState entry. */ LocalTransactionId nextLXID; @@ -172,8 +171,6 @@ typedef struct SISeg int minMsgNum; /* oldest message still needed */ int maxMsgNum; /* next message number to be assigned */ int nextThreshold; /* # of messages to call SICleanupQueue */ - int lastBackend; /* index of last active procState entry, +1 */ - int maxBackends; /* size of procState array */ slock_t msgnumLock; /* spinlock protecting maxMsgNum */ @@ -183,11 +180,29 @@ typedef struct SISeg SharedInvalidationMessage buffer[MAXNUMMESSAGES]; /* - * Per-backend invalidation state info (has MaxBackends entries). + * Per-backend invalidation state info. + * + * 'procState' has NumProcStateSlots entries, and is indexed by pgprocno. + * 'numProcs' is the number of slots currently in use, and 'pgprocnos' is + * a dense array of their indexes, to speed up scanning all in-use slots. + * + * 'pgprocnos' is largely redundant with ProcArrayStruct->pgprocnos, but + * having our separate copy avoids contention on ProcArrayLock, and allows + * us to track only the processes that participate in shared cache + * invalidations. */ + int numProcs; + int *pgprocnos; ProcState procState[FLEXIBLE_ARRAY_MEMBER]; } SISeg; +/* + * We reserve a slot for each possible ProcNumber, plus one for each + * possible auxiliary process type. (This scheme assumes there is not + * more than one of any auxiliary process type at a time.) + */ +#define NumProcStateSlots (MaxBackends + NUM_AUXILIARY_PROCS) + static SISeg *shmInvalBuffer; /* pointer to the shared inval buffer */ @@ -205,16 +220,8 @@ SInvalShmemSize(void) Size size; size = offsetof(SISeg, procState); - - /* - * In Hot Standby mode, the startup process requests a procState array - * slot using InitRecoveryTransactionEnvironment(). Even though - * MaxBackends doesn't account for the startup process, it is guaranteed - * to get a free slot. This is because the autovacuum launcher and worker - * processes, which are included in MaxBackends, are not started in Hot - * Standby mode. - */ - size = add_size(size, mul_size(sizeof(ProcState), MaxBackends)); + size = add_size(size, mul_size(sizeof(ProcState), NumProcStateSlots)); /* procState */ + size = add_size(size, mul_size(sizeof(int), NumProcStateSlots)); /* pgprocnos */ return size; } @@ -239,23 +246,22 @@ CreateSharedInvalidationState(void) shmInvalBuffer->minMsgNum = 0; shmInvalBuffer->maxMsgNum = 0; shmInvalBuffer->nextThreshold = CLEANUP_MIN; - shmInvalBuffer->lastBackend = 0; - shmInvalBuffer->maxBackends = MaxBackends; SpinLockInit(&shmInvalBuffer->msgnumLock); /* The buffer[] array is initially all unused, so we need not fill it */ /* Mark all backends inactive, and initialize nextLXID */ - for (i = 0; i < shmInvalBuffer->maxBackends; i++) + for (i = 0; i < NumProcStateSlots; i++) { shmInvalBuffer->procState[i].procPid = 0; /* inactive */ - shmInvalBuffer->procState[i].proc = NULL; shmInvalBuffer->procState[i].nextMsgNum = 0; /* meaningless */ shmInvalBuffer->procState[i].resetState = false; shmInvalBuffer->procState[i].signaled = false; shmInvalBuffer->procState[i].hasMessages = false; shmInvalBuffer->procState[i].nextLXID = InvalidLocalTransactionId; } + shmInvalBuffer->numProcs = 0; + shmInvalBuffer->pgprocnos = (int *) &shmInvalBuffer->procState[i]; } /* @@ -265,59 +271,39 @@ CreateSharedInvalidationState(void) void SharedInvalBackendInit(bool sendOnly) { - int index; - ProcState *stateP = NULL; + ProcState *stateP; + pid_t oldPid; SISeg *segP = shmInvalBuffer; + if (MyProcNumber < 0) + elog(ERROR, "MyProcNumber not set"); + if (MyProcNumber >= NumProcStateSlots) + elog(PANIC, "unexpected MyProcNumber %d in SharedInvalBackendInit (max %d)", + MyProcNumber, NumProcStateSlots); + stateP = &segP->procState[MyProcNumber]; + /* * This can run in parallel with read operations, but not with write - * operations, since SIInsertDataEntries relies on lastBackend to set - * hasMessages appropriately. + * operations, since SIInsertDataEntries relies on the pgprocnos array to + * set hasMessages appropriately. */ LWLockAcquire(SInvalWriteLock, LW_EXCLUSIVE); - /* Look for a free entry in the procState array */ - for (index = 0; index < segP->lastBackend; index++) + oldPid = stateP->procPid; + if (oldPid != 0) { - if (segP->procState[index].procPid == 0) /* inactive slot? */ - { - stateP = &segP->procState[index]; - break; - } - } - - if (stateP == NULL) - { - if (segP->lastBackend < segP->maxBackends) - { - stateP = &segP->procState[segP->lastBackend]; - Assert(stateP->procPid == 0); - segP->lastBackend++; - } - else - { - /* - * out of procState slots: MaxBackends exceeded -- report normally - */ - MyBackendId = InvalidBackendId; - LWLockRelease(SInvalWriteLock); - ereport(FATAL, - (errcode(ERRCODE_TOO_MANY_CONNECTIONS), - errmsg("sorry, too many clients already"))); - } + LWLockRelease(SInvalWriteLock); + elog(ERROR, "sinval slot for backend %d is already in use by process %d", + MyProcNumber, (int) oldPid); } - MyBackendId = (stateP - &segP->procState[0]) + 1; - - /* Advertise assigned backend ID in MyProc */ - MyProc->backendId = MyBackendId; + shmInvalBuffer->pgprocnos[shmInvalBuffer->numProcs++] = MyProcNumber; /* Fetch next local transaction ID into local memory */ nextLocalTransactionId = stateP->nextLXID; /* mark myself active, with all extant messages already read */ stateP->procPid = MyProcPid; - stateP->proc = MyProc; stateP->nextMsgNum = segP->maxMsgNum; stateP->resetState = false; stateP->signaled = false; @@ -328,8 +314,6 @@ SharedInvalBackendInit(bool sendOnly) /* register exit routine to mark my entry inactive at exit */ on_shmem_exit(CleanupInvalidationState, PointerGetDatum(segP)); - - elog(DEBUG4, "my backend ID is %d", MyBackendId); } /* @@ -351,90 +335,29 @@ CleanupInvalidationState(int status, Datum arg) LWLockAcquire(SInvalWriteLock, LW_EXCLUSIVE); - stateP = &segP->procState[MyBackendId - 1]; + stateP = &segP->procState[MyProcNumber]; - /* Update next local transaction ID for next holder of this backendID */ + /* Update next local transaction ID for next holder of this proc number */ stateP->nextLXID = nextLocalTransactionId; /* Mark myself inactive */ stateP->procPid = 0; - stateP->proc = NULL; stateP->nextMsgNum = 0; stateP->resetState = false; stateP->signaled = false; - /* Recompute index of last active backend */ - for (i = segP->lastBackend; i > 0; i--) - { - if (segP->procState[i - 1].procPid != 0) - break; - } - segP->lastBackend = i; - - LWLockRelease(SInvalWriteLock); -} - -/* - * BackendIdGetProc - * Get the PGPROC structure for a backend, given the backend ID. - * The result may be out of date arbitrarily quickly, so the caller - * must be careful about how this information is used. NULL is - * returned if the backend is not active. - */ -PGPROC * -BackendIdGetProc(int backendID) -{ - PGPROC *result = NULL; - SISeg *segP = shmInvalBuffer; - - /* Need to lock out additions/removals of backends */ - LWLockAcquire(SInvalWriteLock, LW_SHARED); - - if (backendID > 0 && backendID <= segP->lastBackend) - { - ProcState *stateP = &segP->procState[backendID - 1]; - - result = stateP->proc; - } - - LWLockRelease(SInvalWriteLock); - - return result; -} - -/* - * BackendIdGetTransactionIds - * Get the xid, xmin, nsubxid and overflow status of the backend. The - * result may be out of date arbitrarily quickly, so the caller must be - * careful about how this information is used. - */ -void -BackendIdGetTransactionIds(int backendID, TransactionId *xid, - TransactionId *xmin, int *nsubxid, bool *overflowed) -{ - SISeg *segP = shmInvalBuffer; - - *xid = InvalidTransactionId; - *xmin = InvalidTransactionId; - *nsubxid = 0; - *overflowed = false; - - /* Need to lock out additions/removals of backends */ - LWLockAcquire(SInvalWriteLock, LW_SHARED); - - if (backendID > 0 && backendID <= segP->lastBackend) + for (i = segP->numProcs - 1; i >= 0; i--) { - ProcState *stateP = &segP->procState[backendID - 1]; - PGPROC *proc = stateP->proc; - - if (proc != NULL) + if (segP->pgprocnos[i] == MyProcNumber) { - *xid = proc->xid; - *xmin = proc->xmin; - *nsubxid = proc->subxidStatus.count; - *overflowed = proc->subxidStatus.overflowed; + if (i != segP->numProcs - 1) + segP->pgprocnos[i] = segP->pgprocnos[segP->numProcs - 1]; + break; } } + if (i < 0) + elog(PANIC, "could not find entry in sinval array"); + segP->numProcs--; LWLockRelease(SInvalWriteLock); } @@ -507,9 +430,9 @@ SIInsertDataEntries(const SharedInvalidationMessage *data, int n) * these (unlocked) changes will be committed to memory before we exit * the function. */ - for (i = 0; i < segP->lastBackend; i++) + for (i = 0; i < segP->numProcs; i++) { - ProcState *stateP = &segP->procState[i]; + ProcState *stateP = &segP->procState[segP->pgprocnos[i]]; stateP->hasMessages = true; } @@ -555,7 +478,7 @@ SIGetDataEntries(SharedInvalidationMessage *data, int datasize) int n; segP = shmInvalBuffer; - stateP = &segP->procState[MyBackendId - 1]; + stateP = &segP->procState[MyProcNumber]; /* * Before starting to take locks, do a quick, unlocked test to see whether @@ -677,13 +600,14 @@ SICleanupQueue(bool callerHasWriteLock, int minFree) minsig = min - SIG_THRESHOLD; lowbound = min - MAXNUMMESSAGES + minFree; - for (i = 0; i < segP->lastBackend; i++) + for (i = 0; i < segP->numProcs; i++) { - ProcState *stateP = &segP->procState[i]; + ProcState *stateP = &segP->procState[segP->pgprocnos[i]]; int n = stateP->nextMsgNum; - /* Ignore if inactive or already in reset state */ - if (stateP->procPid == 0 || stateP->resetState || stateP->sendOnly) + /* Ignore if already in reset state */ + Assert(stateP->procPid != 0); + if (stateP->resetState || stateP->sendOnly) continue; /* @@ -719,11 +643,8 @@ SICleanupQueue(bool callerHasWriteLock, int minFree) { segP->minMsgNum -= MSGNUMWRAPAROUND; segP->maxMsgNum -= MSGNUMWRAPAROUND; - for (i = 0; i < segP->lastBackend; i++) - { - /* we don't bother skipping inactive entries here */ - segP->procState[i].nextMsgNum -= MSGNUMWRAPAROUND; - } + for (i = 0; i < segP->numProcs; i++) + segP->procState[segP->pgprocnos[i]].nextMsgNum -= MSGNUMWRAPAROUND; } /* @@ -744,13 +665,13 @@ SICleanupQueue(bool callerHasWriteLock, int minFree) if (needSig) { pid_t his_pid = needSig->procPid; - BackendId his_backendId = (needSig - &segP->procState[0]) + 1; + ProcNumber his_procNumber = (needSig - &segP->procState[0]); needSig->signaled = true; LWLockRelease(SInvalReadLock); LWLockRelease(SInvalWriteLock); elog(DEBUG4, "sending sinval catchup signal to PID %d", (int) his_pid); - SendProcSignal(his_pid, PROCSIG_CATCHUP_INTERRUPT, his_backendId); + SendProcSignal(his_pid, PROCSIG_CATCHUP_INTERRUPT, his_procNumber); if (callerHasWriteLock) LWLockAcquire(SInvalWriteLock, LW_EXCLUSIVE); } @@ -762,6 +683,48 @@ SICleanupQueue(bool callerHasWriteLock, int minFree) } } +/* + * SIResetAll + * Mark all active backends as "reset" + * + * Use this when we don't know what needs to be invalidated. It's a + * cluster-wide InvalidateSystemCaches(). This was a back-branch-only remedy + * to avoid a WAL format change. + * + * The implementation is like SICleanupQueue(false, MAXNUMMESSAGES + 1), with + * one addition. SICleanupQueue() assumes minFree << MAXNUMMESSAGES, so it + * assumes hasMessages==true for any backend it resets. We're resetting even + * fully-caught-up backends, so we set hasMessages. + */ +void +SIResetAll(void) +{ + SISeg *segP = shmInvalBuffer; + int i; + + LWLockAcquire(SInvalWriteLock, LW_EXCLUSIVE); + LWLockAcquire(SInvalReadLock, LW_EXCLUSIVE); + + for (i = 0; i < segP->numProcs; i++) + { + ProcState *stateP = &segP->procState[segP->pgprocnos[i]]; + + Assert(stateP->procPid != 0); + if (stateP->sendOnly) + continue; + + /* Consuming the reset will update "nextMsgNum" and "signaled". */ + stateP->resetState = true; + stateP->hasMessages = true; + } + + segP->minMsgNum = segP->maxMsgNum; + segP->nextThreshold = CLEANUP_MIN; + + LWLockRelease(SInvalReadLock); + LWLockRelease(SInvalWriteLock); +} + /* * GetNextLocalTransactionId --- allocate a new LocalTransactionId @@ -769,11 +732,11 @@ SICleanupQueue(bool callerHasWriteLock, int minFree) * We split VirtualTransactionIds into two parts so that it is possible * to allocate a new one without any contention for shared memory, except * for a bit of additional overhead during backend startup/shutdown. - * The high-order part of a VirtualTransactionId is a BackendId, and the + * The high-order part of a VirtualTransactionId is a ProcNumber, and the * low-order part is a LocalTransactionId, which we assign from a local * counter. To avoid the risk of a VirtualTransactionId being reused - * within a short interval, successive procs occupying the same backend ID - * slot should use a consecutive sequence of local IDs, which is implemented + * within a short interval, successive procs occupying the same PGPROC slot + * should use a consecutive sequence of local IDs, which is implemented * by copying nextLocalTransactionId as seen above. */ LocalTransactionId diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index 4c06741a69fd9..872679ca44788 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -7,7 +7,7 @@ * AccessExclusiveLocks and starting snapshots for Hot Standby mode. * Plus conflict recovery processing. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -26,13 +26,11 @@ #include "pgstat.h" #include "replication/slot.h" #include "storage/bufmgr.h" -#include "storage/lmgr.h" #include "storage/proc.h" #include "storage/procarray.h" #include "storage/sinvaladt.h" #include "storage/standby.h" #include "utils/hsearch.h" -#include "utils/memutils.h" #include "utils/ps_status.h" #include "utils/timeout.h" #include "utils/timestamp.h" @@ -137,7 +135,8 @@ InitRecoveryTransactionEnvironment(void) * are held by vxids and row level locks are held by xids. All queries * hold AccessShareLocks so never block while we write or lock new rows. */ - vxid.backendId = MyBackendId; + MyProc->vxid.procNumber = MyProcNumber; + vxid.procNumber = MyProcNumber; vxid.localTransactionId = GetNextLocalTransactionId(); VirtualXactLockTableInsert(vxid); @@ -299,7 +298,7 @@ LogRecoveryConflict(ProcSignalReason reason, TimestampTz wait_start, vxids = wait_list; while (VirtualTransactionIdIsValid(*vxids)) { - PGPROC *proc = BackendIdGetProc(vxids->backendId); + PGPROC *proc = ProcNumberGetProc(vxids->procNumber); /* proc can be NULL if the target backend is not active */ if (proc) @@ -840,7 +839,7 @@ ResolveRecoveryConflictWithBufferPin(void) * SIGHUP signal handler, etc cannot do that because it uses the different * latch from that ProcWaitForSignal() waits on. */ - ProcWaitForSignal(PG_WAIT_BUFFER_PIN); + ProcWaitForSignal(WAIT_EVENT_BUFFER_PIN); if (got_standby_delay_timeout) SendRecoveryConflictWithBufferPin(PROCSIG_RECOVERY_CONFLICT_BUFFERPIN); @@ -997,8 +996,7 @@ StandbyAcquireAccessExclusiveLock(TransactionId xid, Oid dbOid, Oid relOid) TransactionIdDidAbort(xid)) return; - elog(trace_recovery(DEBUG4), - "adding recovery lock: db %u rel %u", dbOid, relOid); + elog(DEBUG4, "adding recovery lock: db %u rel %u", dbOid, relOid); /* dbOid is InvalidOid when we are locking a shared relation. */ Assert(OidIsValid(relOid)); @@ -1042,7 +1040,7 @@ StandbyReleaseXidEntryLocks(RecoveryLockXidEntry *xidentry) { LOCKTAG locktag; - elog(trace_recovery(DEBUG4), + elog(DEBUG4, "releasing recovery lock: xid %u db %u rel %u", entry->key.xid, entry->key.dbOid, entry->key.relOid); /* Release the lock ... */ @@ -1109,7 +1107,7 @@ StandbyReleaseAllLocks(void) HASH_SEQ_STATUS status; RecoveryLockXidEntry *entry; - elog(trace_recovery(DEBUG2), "release all standby locks"); + elog(DEBUG2, "release all standby locks"); hash_seq_init(&status, RecoveryLockXidHash); while ((entry = hash_seq_search(&status))) @@ -1186,7 +1184,7 @@ standby_redo(XLogReaderState *record) running.xcnt = xlrec->xcnt; running.subxcnt = xlrec->subxcnt; - running.subxid_overflow = xlrec->subxid_overflow; + running.subxid_status = xlrec->subxid_overflow ? SUBXIDS_MISSING : SUBXIDS_IN_ARRAY; running.nextXid = xlrec->nextXid; running.latestCompletedXid = xlrec->latestCompletedXid; running.oldestRunningXid = xlrec->oldestRunningXid; @@ -1351,7 +1349,7 @@ LogCurrentRunningXacts(RunningTransactions CurrRunningXacts) xlrec.xcnt = CurrRunningXacts->xcnt; xlrec.subxcnt = CurrRunningXacts->subxcnt; - xlrec.subxid_overflow = CurrRunningXacts->subxid_overflow; + xlrec.subxid_overflow = (CurrRunningXacts->subxid_status != SUBXIDS_IN_ARRAY); xlrec.nextXid = CurrRunningXacts->nextXid; xlrec.oldestRunningXid = CurrRunningXacts->oldestRunningXid; xlrec.latestCompletedXid = CurrRunningXacts->latestCompletedXid; @@ -1368,8 +1366,8 @@ LogCurrentRunningXacts(RunningTransactions CurrRunningXacts) recptr = XLogInsert(RM_STANDBY_ID, XLOG_RUNNING_XACTS); - if (CurrRunningXacts->subxid_overflow) - elog(trace_recovery(DEBUG2), + if (xlrec.subxid_overflow) + elog(DEBUG2, "snapshot of %d running transactions overflowed (lsn %X/%X oldest xid %u latest complete %u next xid %u)", CurrRunningXacts->xcnt, LSN_FORMAT_ARGS(recptr), @@ -1377,7 +1375,7 @@ LogCurrentRunningXacts(RunningTransactions CurrRunningXacts) CurrRunningXacts->latestCompletedXid, CurrRunningXacts->nextXid); else - elog(trace_recovery(DEBUG2), + elog(DEBUG2, "snapshot of %d+%d running transaction ids (lsn %X/%X oldest xid %u latest complete %u next xid %u)", CurrRunningXacts->xcnt, CurrRunningXacts->subxcnt, LSN_FORMAT_ARGS(recptr), diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c index 84e543e731091..f9510833241bb 100644 --- a/src/backend/storage/large_object/inv_api.c +++ b/src/backend/storage/large_object/inv_api.c @@ -19,7 +19,7 @@ * memory context given to inv_open (for LargeObjectDesc structs). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -35,7 +35,6 @@ #include "access/detoast.h" #include "access/genam.h" #include "access/htup_details.h" -#include "access/sysattr.h" #include "access/table.h" #include "access/xact.h" #include "catalog/dependency.h" @@ -58,11 +57,11 @@ bool lo_compat_privileges; /* - * All accesses to pg_largeobject and its index make use of a single Relation - * reference, so that we only need to open pg_relation once per transaction. - * To avoid problems when the first such reference occurs inside a - * subtransaction, we execute a slightly klugy maneuver to assign ownership of - * the Relation reference to TopTransactionResourceOwner. + * All accesses to pg_largeobject and its index make use of a single + * Relation reference. To guarantee that the relcache entry remains + * in the cache, on the first reference inside a subtransaction, we + * execute a slightly klugy maneuver to assign ownership of the + * Relation reference to TopTransactionResourceOwner. */ static Relation lo_heap_r = NULL; static Relation lo_index_r = NULL; @@ -221,11 +220,10 @@ inv_create(Oid lobjId) /* * dependency on the owner of largeobject * - * The reason why we use LargeObjectRelationId instead of - * LargeObjectMetadataRelationId here is to provide backward compatibility - * to the applications which utilize a knowledge about internal layout of - * system catalogs. OID of pg_largeobject_metadata and loid of - * pg_largeobject are same value, so there are no actual differences here. + * Note that LO dependencies are recorded using classId + * LargeObjectRelationId for backwards-compatibility reasons. Using + * LargeObjectMetadataRelationId instead would simplify matters for the + * backend, but it'd complicate pg_dump and possibly break other clients. */ recordDependencyOnOwner(LargeObjectRelationId, lobjId_new, GetUserId()); diff --git a/src/backend/storage/large_object/meson.build b/src/backend/storage/large_object/meson.build index 4d9d89348893a..0440af4f88282 100644 --- a/src/backend/storage/large_object/meson.build +++ b/src/backend/storage/large_object/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'inv_api.c', diff --git a/src/backend/storage/lmgr/.gitignore b/src/backend/storage/lmgr/.gitignore index dab4c3f580611..8e5b734f15296 100644 --- a/src/backend/storage/lmgr/.gitignore +++ b/src/backend/storage/lmgr/.gitignore @@ -1,3 +1,2 @@ -/lwlocknames.c /lwlocknames.h /s_lock_test diff --git a/src/backend/storage/lmgr/Makefile b/src/backend/storage/lmgr/Makefile index b25b7ee421d34..3f89548bde68d 100644 --- a/src/backend/storage/lmgr/Makefile +++ b/src/backend/storage/lmgr/Makefile @@ -18,7 +18,6 @@ OBJS = \ lmgr.o \ lock.o \ lwlock.o \ - lwlocknames.o \ predicate.o \ proc.o \ s_lock.o \ @@ -33,20 +32,14 @@ endif s_lock_test: s_lock.c $(top_builddir)/src/common/libpgcommon.a $(top_builddir)/src/port/libpgport.a $(CC) $(CPPFLAGS) $(CFLAGS) -DS_LOCK_TEST=1 $(srcdir)/s_lock.c \ $(TASPATH) -L $(top_builddir)/src/common -lpgcommon \ - -L $(top_builddir)/src/port -lpgport -o s_lock_test + -L $(top_builddir)/src/port -lpgport -lm -o s_lock_test -# see notes in src/backend/parser/Makefile -lwlocknames.c: lwlocknames.h - touch $@ - -lwlocknames.h: $(top_srcdir)/src/backend/storage/lmgr/lwlocknames.txt generate-lwlocknames.pl - $(PERL) $(srcdir)/generate-lwlocknames.pl $< +lwlocknames.h: ../../../include/storage/lwlocklist.h ../../utils/activity/wait_event_names.txt generate-lwlocknames.pl + $(PERL) $(srcdir)/generate-lwlocknames.pl $^ check: s_lock_test ./s_lock_test -clean distclean: +clean: rm -f s_lock_test - -maintainer-clean: clean - rm -f lwlocknames.h lwlocknames.c + rm -f lwlocknames.h diff --git a/src/backend/storage/lmgr/README b/src/backend/storage/lmgr/README index d08ec6c402646..45de0fd2bd6f0 100644 --- a/src/backend/storage/lmgr/README +++ b/src/backend/storage/lmgr/README @@ -597,10 +597,10 @@ deadlock detection algorithm very much, but it makes the bookkeeping more complicated. We choose to regard locks held by processes in the same parallel group as -non-conflicting with the exception of relation extension and page locks. This -means that two processes in a parallel group can hold a self-exclusive lock on -the same relation at the same time, or one process can acquire an AccessShareLock -while the other already holds AccessExclusiveLock. This might seem dangerous and +non-conflicting with the exception of relation extension lock. This means that +two processes in a parallel group can hold a self-exclusive lock on the same +relation at the same time, or one process can acquire an AccessShareLock while +the other already holds AccessExclusiveLock. This might seem dangerous and could be in some cases (more on that below), but if we didn't do this then parallel query would be extremely prone to self-deadlock. For example, a parallel query against a relation on which the leader already had @@ -638,23 +638,15 @@ the other is safe enough. Problems would occur if the leader initiated parallelism from a point in the code at which it had some backend-private state that made table access from another process unsafe, for example after calling SetReindexProcessing and before calling ResetReindexProcessing, -catastrophe could ensue, because the worker won't have that state. - -To allow parallel inserts and parallel copy, we have ensured that relation -extension and page locks don't participate in group locking which means such -locks can conflict among the same group members. This is required as it is no -safer for two related processes to extend the same relation or perform clean up -in gin indexes at a time than for unrelated processes to do the same. We don't -acquire a heavyweight lock on any other object after relation extension lock -which means such a lock can never participate in the deadlock cycle. After -acquiring page locks, we can acquire relation extension lock but reverse never -happens, so those will also not participate in deadlock. To allow for other -parallel writes like parallel update or parallel delete, we'll either need to -(1) further enhance the deadlock detector to handle those tuple locks in a -different way than other types; or (2) have parallel workers use some other -mutual exclusion method for such cases. Currently, the parallel mode is -strictly read-only, but now we have the infrastructure to allow parallel -inserts and parallel copy. +catastrophe could ensue, because the worker won't have that state. Similarly, +problems could occur with certain kinds of non-relation locks, such as +GIN page locks. It's no safer for two related processes to perform GIN clean +up at the same time than for unrelated processes to do the same. +However, since parallel mode is strictly read-only at present, neither this +nor most of the similar cases can arise at present. To allow parallel writes, +we'll either need to (1) further enhance the deadlock detector to handle those +types of locks in a different way than other types; or (2) have parallel +workers use some other mutual exclusion method for such cases. Group locking adds three new members to each PGPROC: lockGroupLeader, lockGroupMembers, and lockGroupLink. A PGPROC's lockGroupLeader is NULL for diff --git a/src/backend/storage/lmgr/condition_variable.c b/src/backend/storage/lmgr/condition_variable.c index 7e2bbf46d9d02..112a518bae072 100644 --- a/src/backend/storage/lmgr/condition_variable.c +++ b/src/backend/storage/lmgr/condition_variable.c @@ -8,7 +8,7 @@ * interrupted, unlike LWLock waits. Condition variables are safe * to use within dynamic shared memory segments. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/storage/lmgr/condition_variable.c @@ -21,11 +21,9 @@ #include "miscadmin.h" #include "portability/instr_time.h" #include "storage/condition_variable.h" -#include "storage/ipc.h" #include "storage/proc.h" #include "storage/proclist.h" #include "storage/spin.h" -#include "utils/memutils.h" /* Initially, we are not prepared to sleep on any condition variable. */ static ConditionVariable *cv_sleep_target = NULL; @@ -57,7 +55,7 @@ ConditionVariableInit(ConditionVariable *cv) void ConditionVariablePrepareToSleep(ConditionVariable *cv) { - int pgprocno = MyProc->pgprocno; + int pgprocno = MyProcNumber; /* * If some other sleep is already prepared, cancel it; this is necessary @@ -104,6 +102,8 @@ ConditionVariableSleep(ConditionVariable *cv, uint32 wait_event_info) /* * Wait for a condition variable to be signaled or a timeout to be reached. * + * The "timeout" is given in milliseconds. + * * Returns true when timeout expires, otherwise returns false. * * See ConditionVariableSleep() for general usage. @@ -181,10 +181,10 @@ ConditionVariableTimedSleep(ConditionVariable *cv, long timeout, * guarantee not to return spuriously, we'll avoid this obvious case. */ SpinLockAcquire(&cv->mutex); - if (!proclist_contains(&cv->wakeup, MyProc->pgprocno, cvWaitLink)) + if (!proclist_contains(&cv->wakeup, MyProcNumber, cvWaitLink)) { done = true; - proclist_push_tail(&cv->wakeup, MyProc->pgprocno, cvWaitLink); + proclist_push_tail(&cv->wakeup, MyProcNumber, cvWaitLink); } SpinLockRelease(&cv->mutex); @@ -223,32 +223,28 @@ ConditionVariableTimedSleep(ConditionVariable *cv, long timeout, * * Do nothing if nothing is pending; this allows this function to be called * during transaction abort to clean up any unfinished CV sleep. + * + * Return true if we've been signaled. */ -void +bool ConditionVariableCancelSleep(void) { ConditionVariable *cv = cv_sleep_target; bool signaled = false; if (cv == NULL) - return; + return false; SpinLockAcquire(&cv->mutex); - if (proclist_contains(&cv->wakeup, MyProc->pgprocno, cvWaitLink)) - proclist_delete(&cv->wakeup, MyProc->pgprocno, cvWaitLink); + if (proclist_contains(&cv->wakeup, MyProcNumber, cvWaitLink)) + proclist_delete(&cv->wakeup, MyProcNumber, cvWaitLink); else signaled = true; SpinLockRelease(&cv->mutex); - /* - * If we've received a signal, pass it on to another waiting process, if - * there is one. Otherwise a call to ConditionVariableSignal() might get - * lost, despite there being another process ready to handle it. - */ - if (signaled) - ConditionVariableSignal(cv); - cv_sleep_target = NULL; + + return signaled; } /* @@ -285,7 +281,7 @@ ConditionVariableSignal(ConditionVariable *cv) void ConditionVariableBroadcast(ConditionVariable *cv) { - int pgprocno = MyProc->pgprocno; + int pgprocno = MyProcNumber; PGPROC *proc = NULL; bool have_sentinel = false; diff --git a/src/backend/storage/lmgr/deadlock.c b/src/backend/storage/lmgr/deadlock.c index 617ebacdd4c75..fcb874d234f01 100644 --- a/src/backend/storage/lmgr/deadlock.c +++ b/src/backend/storage/lmgr/deadlock.c @@ -7,7 +7,7 @@ * detection and resolution algorithms. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -546,12 +546,11 @@ FindLockCycleRecurseMember(PGPROC *checkProc, lm; /* - * The relation extension or page lock can never participate in actual - * deadlock cycle. See Asserts in LockAcquireExtended. So, there is no - * advantage in checking wait edges from them. + * The relation extension lock can never participate in actual deadlock + * cycle. See Assert in LockAcquireExtended. So, there is no advantage + * in checking wait edges from it. */ - if (LOCK_LOCKTAG(*lock) == LOCKTAG_RELATION_EXTEND || - (LOCK_LOCKTAG(*lock) == LOCKTAG_PAGE)) + if (LOCK_LOCKTAG(*lock) == LOCKTAG_RELATION_EXTEND) return false; lockMethodTable = GetLocksMethodTable(lock); diff --git a/src/backend/storage/lmgr/generate-lwlocknames.pl b/src/backend/storage/lmgr/generate-lwlocknames.pl index 863c88252b2ce..4eee6b47f1533 100644 --- a/src/backend/storage/lmgr/generate-lwlocknames.pl +++ b/src/backend/storage/lmgr/generate-lwlocknames.pl @@ -1,10 +1,10 @@ #!/usr/bin/perl # -# Generate lwlocknames.h and lwlocknames.c from lwlocknames.txt -# Copyright (c) 2000-2023, PostgreSQL Global Development Group +# Generate lwlocknames.h from lwlocklist.h +# Copyright (c) 2000-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use Getopt::Long; my $output_path = '.'; @@ -14,64 +14,114 @@ GetOptions('outdir:s' => \$output_path); -open my $lwlocknames, '<', $ARGV[0] or die; +open my $lwlocklist, '<', $ARGV[0] or die; +open my $wait_event_names, '<', $ARGV[1] or die; # Include PID in suffix in case parallel make runs this multiple times. my $htmp = "$output_path/lwlocknames.h.tmp$$"; -my $ctmp = "$output_path/lwlocknames.c.tmp$$"; open my $h, '>', $htmp or die "Could not open $htmp: $!"; -open my $c, '>', $ctmp or die "Could not open $ctmp: $!"; my $autogen = - "/* autogenerated from src/backend/storage/lmgr/lwlocknames.txt, do not edit */\n"; + "/* autogenerated from src/include/storage/lwlocklist.h, do not edit */\n"; print $h $autogen; print $h "/* there is deliberately not an #ifndef LWLOCKNAMES_H here */\n\n"; -print $c $autogen, "\n"; -print $c "const char *const IndividualLWLockNames[] = {"; -while (<$lwlocknames>) +# +# First, record the predefined LWLocks listed in wait_event_names.txt. We'll +# cross-check those with the ones in lwlocklist.h. +# +my @wait_event_lwlocks; +my $record_lwlocks = 0; + +while (<$wait_event_names>) { chomp; - # Skip comments + # Check for end marker. + last if /^# END OF PREDEFINED LWLOCKS/; + + # Skip comments and empty lines. next if /^#/; next if /^\s*$/; - die "unable to parse lwlocknames.txt" - unless /^(\w+)\s+(\d+)$/; + # Start recording LWLocks when we find the WaitEventLWLock section. + if (/^Section: ClassName - WaitEventLWLock$/) + { + $record_lwlocks = 1; + next; + } - (my $lockname, my $lockidx) = ($1, $2); + # Go to the next line if we are not yet recording LWLocks. + next if not $record_lwlocks; - my $trimmedlockname = $lockname; - $trimmedlockname =~ s/Lock$//; - die "lock names must end with 'Lock'" if $trimmedlockname eq $lockname; + # Record the LWLock. + (my $waiteventname, my $waitevendocsentence) = split(/\t/, $_); + push(@wait_event_lwlocks, $waiteventname); +} - die "lwlocknames.txt not in order" if $lockidx < $lastlockidx; - die "lwlocknames.txt has duplicates" if $lockidx == $lastlockidx; +my $in_comment = 0; +my $i = 0; +while (<$lwlocklist>) +{ + chomp; + + # Skip single-line C comments and empty lines + next if m{^\s*/\*.*\*/$}; + next if /^\s*$/; + + # skip multiline C comments + if ($in_comment == 1) + { + $in_comment = 0 if m{\*/}; + next; + } + elsif (m{^\s*/\*}) + { + $in_comment = 1; + next; + } + + die "unable to parse lwlocklist.h line \"$_\"" + unless /^PG_LWLOCK\((\d+),\s+(\w+)\)$/; + + (my $lockidx, my $lockname) = ($1, $2); + + die "lwlocklist.h not in order" if $lockidx < $lastlockidx; + die "lwlocklist.h has duplicates" if $lockidx == $lastlockidx; + + die "$lockname defined in lwlocklist.h but missing from " + . "wait_event_names.txt" + if $i >= scalar @wait_event_lwlocks; + die "lists of predefined LWLocks do not match (first mismatch at " + . "$wait_event_lwlocks[$i] in wait_event_names.txt and $lockname in " + . "lwlocklist.h)" + if $wait_event_lwlocks[$i] ne $lockname; + $i++; while ($lastlockidx < $lockidx - 1) { ++$lastlockidx; - printf $c "%s \"\"", $continue, $lastlockidx; $continue = ",\n"; } - printf $c "%s \"%s\"", $continue, $trimmedlockname; $lastlockidx = $lockidx; $continue = ",\n"; - print $h "#define $lockname (&MainLWLockArray[$lockidx].lock)\n"; + # Add a "Lock" suffix to each lock name, as the C code depends on that + print $h "#define ${lockname}Lock (&MainLWLockArray[$lockidx].lock)\n"; } -printf $c "\n};\n"; +die + "$wait_event_lwlocks[$i] defined in wait_event_names.txt but missing from " + . "lwlocklist.h" + if $i < scalar @wait_event_lwlocks; + print $h "\n"; printf $h "#define NUM_INDIVIDUAL_LWLOCKS %s\n", $lastlockidx + 1; close $h; -close $c; rename($htmp, "$output_path/lwlocknames.h") || die "rename: $htmp to $output_path/lwlocknames.h: $!"; -rename($ctmp, "$output_path/lwlocknames.c") || die "rename: $ctmp: $!"; -close $lwlocknames; +close $lwlocklist; diff --git a/src/backend/storage/lmgr/lmgr.c b/src/backend/storage/lmgr/lmgr.c index ee9b89a672621..094522acb414d 100644 --- a/src/backend/storage/lmgr/lmgr.c +++ b/src/backend/storage/lmgr/lmgr.c @@ -3,7 +3,7 @@ * lmgr.c * POSTGRES lock manager code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -16,7 +16,6 @@ #include "postgres.h" #include "access/subtrans.h" -#include "access/transam.h" #include "access/xact.h" #include "catalog/catalog.h" #include "commands/progress.h" @@ -336,32 +335,22 @@ CheckRelationLockedByMe(Relation relation, LOCKMODE lockmode, bool orstronger) relation->rd_lockInfo.lockRelId.dbId, relation->rd_lockInfo.lockRelId.relId); - if (LockHeldByMe(&tag, lockmode)) - return true; + return LockHeldByMe(&tag, lockmode, orstronger); +} - if (orstronger) - { - LOCKMODE slockmode; +/* + * CheckRelationOidLockedByMe + * + * Like the above, but takes an OID as argument. + */ +bool +CheckRelationOidLockedByMe(Oid relid, LOCKMODE lockmode, bool orstronger) +{ + LOCKTAG tag; - for (slockmode = lockmode + 1; - slockmode <= MaxLockMode; - slockmode++) - { - if (LockHeldByMe(&tag, slockmode)) - { -#ifdef NOT_USED - /* Sometimes this might be useful for debugging purposes */ - elog(WARNING, "lock mode %s substituted for %s on relation %s", - GetLockmodeName(tag.locktag_lockmethodid, slockmode), - GetLockmodeName(tag.locktag_lockmethodid, lockmode), - RelationGetRelationName(relation)); -#endif - return true; - } - } - } + SetLocktagRelationOid(&tag, relid); - return false; + return LockHeldByMe(&tag, lockmode, orstronger); } /* @@ -947,7 +936,7 @@ WaitForLockersMultiple(List *locktags, LOCKMODE lockmode, bool progress) /* If requested, publish who we're going to wait for. */ if (progress) { - PGPROC *holder = BackendIdGetProc(lockholders->backendId); + PGPROC *holder = ProcNumberGetProc(lockholders->procNumber); if (holder) pgstat_progress_update_param(PROGRESS_WAITFOR_CURRENT_PID, @@ -1019,6 +1008,44 @@ LockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, AcceptInvalidationMessages(); } +/* + * ConditionalLockDatabaseObject + * + * As above, but only lock if we can get the lock without blocking. + * Returns true iff the lock was acquired. + */ +bool +ConditionalLockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, + LOCKMODE lockmode) +{ + LOCKTAG tag; + LOCALLOCK *locallock; + LockAcquireResult res; + + SET_LOCKTAG_OBJECT(tag, + MyDatabaseId, + classid, + objid, + objsubid); + + res = LockAcquireExtended(&tag, lockmode, false, true, true, &locallock); + + if (res == LOCKACQUIRE_NOT_AVAIL) + return false; + + /* + * Now that we have the lock, check for invalidation messages; see notes + * in LockRelationOid. + */ + if (res != LOCKACQUIRE_ALREADY_CLEAR) + { + AcceptInvalidationMessages(); + MarkLockClear(locallock); + } + + return true; +} + /* * UnlockDatabaseObject */ @@ -1060,6 +1087,44 @@ LockSharedObject(Oid classid, Oid objid, uint16 objsubid, AcceptInvalidationMessages(); } +/* + * ConditionalLockSharedObject + * + * As above, but only lock if we can get the lock without blocking. + * Returns true iff the lock was acquired. + */ +bool +ConditionalLockSharedObject(Oid classid, Oid objid, uint16 objsubid, + LOCKMODE lockmode) +{ + LOCKTAG tag; + LOCALLOCK *locallock; + LockAcquireResult res; + + SET_LOCKTAG_OBJECT(tag, + InvalidOid, + classid, + objid, + objsubid); + + res = LockAcquireExtended(&tag, lockmode, false, true, true, &locallock); + + if (res == LOCKACQUIRE_NOT_AVAIL) + return false; + + /* + * Now that we have the lock, check for invalidation messages; see notes + * in LockRelationOid. + */ + if (res != LOCKACQUIRE_ALREADY_CLEAR) + { + AcceptInvalidationMessages(); + MarkLockClear(locallock); + } + + return true; +} + /* * UnlockSharedObject */ diff --git a/src/backend/storage/lmgr/lock.c b/src/backend/storage/lmgr/lock.c index 0a692ee0a6d91..e5e7ab55716a3 100644 --- a/src/backend/storage/lmgr/lock.c +++ b/src/backend/storage/lmgr/lock.c @@ -3,7 +3,7 @@ * lock.c * POSTGRES primary lock mechanism * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -35,12 +35,10 @@ #include "access/transam.h" #include "access/twophase.h" #include "access/twophase_rmgr.h" -#include "access/xact.h" #include "access/xlog.h" #include "access/xlogutils.h" #include "miscadmin.h" #include "pg_trace.h" -#include "pgstat.h" #include "storage/proc.h" #include "storage/procarray.h" #include "storage/sinvaladt.h" @@ -48,7 +46,7 @@ #include "storage/standby.h" #include "utils/memutils.h" #include "utils/ps_status.h" -#include "utils/resowner_private.h" +#include "utils/resowner.h" /* This configuration variable is used to set the lock table size */ @@ -186,18 +184,6 @@ static int FastPathLocalUseCount = 0; */ static bool IsRelationExtensionLockHeld PG_USED_FOR_ASSERTS_ONLY = false; -/* - * Flag to indicate if the page lock is held by this backend. We don't - * acquire any other heavyweight lock while holding the page lock except for - * relation extension. However, these locks are never taken in reverse order - * which implies that page locks will also never participate in the deadlock - * cycle. - * - * Similar to relation extension, page locks are also held for a short - * duration, so imposing such a restriction won't hurt. - */ -static bool IsPageLockHeld PG_USED_FOR_ASSERTS_ONLY = false; - /* Macros for manipulating proc->fpLockBits */ #define FAST_PATH_BITS_PER_SLOT 3 #define FAST_PATH_LOCKNUMBER_OFFSET 1 @@ -374,7 +360,8 @@ static PROCLOCK *SetupLockInTable(LockMethod lockMethodTable, PGPROC *proc, static void GrantLockLocal(LOCALLOCK *locallock, ResourceOwner owner); static void BeginStrongLockAcquire(LOCALLOCK *locallock, uint32 fasthashcode); static void FinishStrongLockAcquire(void); -static void WaitOnLock(LOCALLOCK *locallock, ResourceOwner owner); +static void WaitOnLock(LOCALLOCK *locallock, ResourceOwner owner, + bool dontWait); static void ReleaseLockIfHeld(LOCALLOCK *locallock, bool sessionLock); static void LockReassignOwner(LOCALLOCK *locallock, ResourceOwner parent); static bool UnGrantLock(LOCK *lock, LOCKMODE lockmode, @@ -591,11 +578,17 @@ DoLockModesConflict(LOCKMODE mode1, LOCKMODE mode2) } /* - * LockHeldByMe -- test whether lock 'locktag' is held with mode 'lockmode' - * by the current transaction + * LockHeldByMe -- test whether lock 'locktag' is held by the current + * transaction + * + * Returns true if current transaction holds a lock on 'tag' of mode + * 'lockmode'. If 'orstronger' is true, a stronger lockmode is also OK. + * ("Stronger" is defined as "numerically higher", which is a bit + * semantically dubious but is OK for the purposes we use this for.) */ bool -LockHeldByMe(const LOCKTAG *locktag, LOCKMODE lockmode) +LockHeldByMe(const LOCKTAG *locktag, + LOCKMODE lockmode, bool orstronger) { LOCALLOCKTAG localtag; LOCALLOCK *locallock; @@ -611,7 +604,23 @@ LockHeldByMe(const LOCKTAG *locktag, LOCKMODE lockmode) &localtag, HASH_FIND, NULL); - return (locallock && locallock->nLocks > 0); + if (locallock && locallock->nLocks > 0) + return true; + + if (orstronger) + { + LOCKMODE slockmode; + + for (slockmode = lockmode + 1; + slockmode <= MaxLockMode; + slockmode++) + { + if (LockHeldByMe(locktag, slockmode, false)) + return true; + } + } + + return false; } #ifdef USE_ASSERT_CHECKING @@ -886,13 +895,6 @@ LockAcquireExtended(const LOCKTAG *locktag, */ Assert(!IsRelationExtensionLockHeld); - /* - * We don't acquire any other heavyweight lock while holding the page lock - * except for relation extension. - */ - Assert(!IsPageLockHeld || - (locktag->locktag_type == LOCKTAG_RELATION_EXTEND)); - /* * Prepare to emit a WAL record if acquisition of this lock needs to be * replayed in a standby server. @@ -980,7 +982,7 @@ LockAcquireExtended(const LOCKTAG *locktag, ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of shared memory"), - errhint("You might need to increase %s.", "max_locks_per_transaction"))); + errhint("You might need to increase \"%s\".", "max_locks_per_transaction"))); else return LOCKACQUIRE_NOT_AVAIL; } @@ -1018,7 +1020,7 @@ LockAcquireExtended(const LOCKTAG *locktag, ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of shared memory"), - errhint("You might need to increase %s.", "max_locks_per_transaction"))); + errhint("You might need to increase \"%s\".", "max_locks_per_transaction"))); else return LOCKACQUIRE_NOT_AVAIL; } @@ -1045,50 +1047,15 @@ LockAcquireExtended(const LOCKTAG *locktag, } else { - /* - * We can't acquire the lock immediately. If caller specified no - * blocking, remove useless table entries and return - * LOCKACQUIRE_NOT_AVAIL without waiting. - */ - if (dontWait) - { - AbortStrongLockAcquire(); - if (proclock->holdMask == 0) - { - uint32 proclock_hashcode; - - proclock_hashcode = ProcLockHashCode(&proclock->tag, hashcode); - dlist_delete(&proclock->lockLink); - dlist_delete(&proclock->procLink); - if (!hash_search_with_hash_value(LockMethodProcLockHash, - &(proclock->tag), - proclock_hashcode, - HASH_REMOVE, - NULL)) - elog(PANIC, "proclock table corrupted"); - } - else - PROCLOCK_PRINT("LockAcquire: NOWAIT", proclock); - lock->nRequested--; - lock->requested[lockmode]--; - LOCK_PRINT("LockAcquire: conditional lock failed", lock, lockmode); - Assert((lock->nRequested > 0) && (lock->requested[lockmode] >= 0)); - Assert(lock->nGranted <= lock->nRequested); - LWLockRelease(partitionLock); - if (locallock->nLocks == 0) - RemoveLocalLock(locallock); - if (locallockp) - *locallockp = NULL; - return LOCKACQUIRE_NOT_AVAIL; - } - /* * Set bitmask of locks this process already holds on this object. */ MyProc->heldLocks = proclock->holdMask; /* - * Sleep till someone wakes me up. + * Sleep till someone wakes me up. We do this even in the dontWait + * case, because while trying to go to sleep, we may discover that we + * can acquire the lock immediately after all. */ TRACE_POSTGRESQL_LOCK_WAIT_START(locktag->locktag_field1, @@ -1098,7 +1065,7 @@ LockAcquireExtended(const LOCKTAG *locktag, locktag->locktag_type, lockmode); - WaitOnLock(locallock, owner); + WaitOnLock(locallock, owner, dontWait); TRACE_POSTGRESQL_LOCK_WAIT_DONE(locktag->locktag_field1, locktag->locktag_field2, @@ -1114,17 +1081,63 @@ LockAcquireExtended(const LOCKTAG *locktag, */ /* - * Check the proclock entry status, in case something in the ipc - * communication doesn't work correctly. + * Check the proclock entry status. If dontWait = true, this is an + * expected case; otherwise, it will only happen if something in the + * ipc communication doesn't work correctly. */ if (!(proclock->holdMask & LOCKBIT_ON(lockmode))) { AbortStrongLockAcquire(); - PROCLOCK_PRINT("LockAcquire: INCONSISTENT", proclock); - LOCK_PRINT("LockAcquire: INCONSISTENT", lock, lockmode); - /* Should we retry ? */ - LWLockRelease(partitionLock); - elog(ERROR, "LockAcquire failed"); + + if (dontWait) + { + /* + * We can't acquire the lock immediately. If caller specified + * no blocking, remove useless table entries and return + * LOCKACQUIRE_NOT_AVAIL without waiting. + */ + if (proclock->holdMask == 0) + { + uint32 proclock_hashcode; + + proclock_hashcode = ProcLockHashCode(&proclock->tag, + hashcode); + dlist_delete(&proclock->lockLink); + dlist_delete(&proclock->procLink); + if (!hash_search_with_hash_value(LockMethodProcLockHash, + &(proclock->tag), + proclock_hashcode, + HASH_REMOVE, + NULL)) + elog(PANIC, "proclock table corrupted"); + } + else + PROCLOCK_PRINT("LockAcquire: NOWAIT", proclock); + lock->nRequested--; + lock->requested[lockmode]--; + LOCK_PRINT("LockAcquire: conditional lock failed", + lock, lockmode); + Assert((lock->nRequested > 0) && + (lock->requested[lockmode] >= 0)); + Assert(lock->nGranted <= lock->nRequested); + LWLockRelease(partitionLock); + if (locallock->nLocks == 0) + RemoveLocalLock(locallock); + if (locallockp) + *locallockp = NULL; + return LOCKACQUIRE_NOT_AVAIL; + } + else + { + /* + * We should have gotten the lock, but somehow that didn't + * happen. If we get here, it's a bug. + */ + PROCLOCK_PRINT("LockAcquire: INCONSISTENT", proclock); + LOCK_PRINT("LockAcquire: INCONSISTENT", lock, lockmode); + LWLockRelease(partitionLock); + elog(ERROR, "LockAcquire failed"); + } } PROCLOCK_PRINT("LockAcquire: granted", proclock); LOCK_PRINT("LockAcquire: granted", lock, lockmode); @@ -1340,10 +1353,10 @@ SetupLockInTable(LockMethod lockMethodTable, PGPROC *proc, } /* - * Check and set/reset the flag that we hold the relation extension/page lock. + * Check and set/reset the flag that we hold the relation extension lock. * * It is callers responsibility that this function is called after - * acquiring/releasing the relation extension/page lock. + * acquiring/releasing the relation extension lock. * * Pass acquired as true if lock is acquired, false otherwise. */ @@ -1353,9 +1366,6 @@ CheckAndSetLockHeld(LOCALLOCK *locallock, bool acquired) #ifdef USE_ASSERT_CHECKING if (LOCALLOCK_LOCKTAG(*locallock) == LOCKTAG_RELATION_EXTEND) IsRelationExtensionLockHeld = acquired; - else if (LOCALLOCK_LOCKTAG(*locallock) == LOCKTAG_PAGE) - IsPageLockHeld = acquired; - #endif } @@ -1480,11 +1490,9 @@ LockCheckConflicts(LockMethod lockMethodTable, } /* - * The relation extension or page lock conflict even between the group - * members. + * The relation extension lock conflict even between the group members. */ - if (LOCK_LOCKTAG(*lock) == LOCKTAG_RELATION_EXTEND || - (LOCK_LOCKTAG(*lock) == LOCKTAG_PAGE)) + if (LOCK_LOCKTAG(*lock) == LOCKTAG_RELATION_EXTEND) { PROCLOCK_PRINT("LockCheckConflicts: conflicting (group)", proclock); @@ -1803,10 +1811,11 @@ MarkLockClear(LOCALLOCK *locallock) * Caller must have set MyProc->heldLocks to reflect locks already held * on the lockable object by this process. * - * The appropriate partition lock must be held at entry. + * The appropriate partition lock must be held at entry, and will still be + * held at exit. */ static void -WaitOnLock(LOCALLOCK *locallock, ResourceOwner owner) +WaitOnLock(LOCALLOCK *locallock, ResourceOwner owner, bool dontWait) { LOCKMETHODID lockmethodid = LOCALLOCK_LOCKMETHOD(*locallock); LockMethod lockMethodTable = LockMethods[lockmethodid]; @@ -1839,8 +1848,14 @@ WaitOnLock(LOCALLOCK *locallock, ResourceOwner owner) */ PG_TRY(); { - if (ProcSleep(locallock, lockMethodTable) != PROC_WAIT_STATUS_OK) + /* + * If dontWait = true, we handle success and failure in the same way + * here. The caller will be able to sort out what has happened. + */ + if (ProcSleep(locallock, lockMethodTable, dontWait) != PROC_WAIT_STATUS_OK + && !dontWait) { + /* * We failed as a result of a deadlock, see CheckDeadLock(). Quit * now. @@ -1905,7 +1920,7 @@ RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode) Assert(0 < lockmethodid && lockmethodid < lengthof(LockMethods)); /* Remove proc from lock's wait queue */ - dclist_delete_from(&waitLock->waitProcs, &proc->links); + dclist_delete_from_thoroughly(&waitLock->waitProcs, &proc->links); /* Undo increments of request counts by waiting process */ Assert(waitLock->nRequested > 0); @@ -2241,6 +2256,16 @@ LockReleaseAll(LOCKMETHODID lockmethodid, bool allLocks) locallock->numLockOwners = 0; } +#ifdef USE_ASSERT_CHECKING + + /* + * Tuple locks are currently held only for short durations within a + * transaction. Check that we didn't forget to release one. + */ + if (LOCALLOCK_LOCKTAG(*locallock) == LOCKTAG_TUPLE && !allLocks) + elog(WARNING, "tuple lock held at commit"); +#endif + /* * If the lock or proclock pointers are NULL, this lock was taken via * the relation fast-path (and is not known to have been transferred). @@ -2808,7 +2833,7 @@ FastPathGetRelationLockEntry(LOCALLOCK *locallock) ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of shared memory"), - errhint("You might need to increase %s.", "max_locks_per_transaction"))); + errhint("You might need to increase \"%s\".", "max_locks_per_transaction"))); } GrantLock(proclock->tag.myLock, proclock, lockmode); FAST_PATH_CLEAR_LOCKMODE(MyProc, f, lockmode); @@ -3019,7 +3044,7 @@ GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode, int *countp) * on this lockable object. */ LWLockRelease(partitionLock); - vxids[count].backendId = InvalidBackendId; + vxids[count].procNumber = INVALID_PROC_NUMBER; vxids[count].localTransactionId = InvalidLocalTransactionId; if (countp) *countp = count; @@ -3065,7 +3090,7 @@ GetLockConflicts(const LOCKTAG *locktag, LOCKMODE lockmode, int *countp) if (count > MaxBackends + max_prepared_xacts) /* should never happen */ elog(PANIC, "too many conflicting locks found"); - vxids[count].backendId = InvalidBackendId; + vxids[count].procNumber = INVALID_PROC_NUMBER; vxids[count].localTransactionId = InvalidLocalTransactionId; if (countp) *countp = count; @@ -3649,8 +3674,8 @@ GetLockStatusData(void) proc->fpRelId[f]); instance->holdMask = lockbits << FAST_PATH_LOCKNUMBER_OFFSET; instance->waitLockMode = NoLock; - instance->backend = proc->backendId; - instance->lxid = proc->lxid; + instance->vxid.procNumber = proc->vxid.procNumber; + instance->vxid.localTransactionId = proc->vxid.lxid; instance->pid = proc->pid; instance->leaderPid = proc->pid; instance->fastpath = true; @@ -3676,15 +3701,15 @@ GetLockStatusData(void) repalloc(data->locks, sizeof(LockInstanceData) * els); } - vxid.backendId = proc->backendId; + vxid.procNumber = proc->vxid.procNumber; vxid.localTransactionId = proc->fpLocalTransactionId; instance = &data->locks[el]; SET_LOCKTAG_VIRTUALTRANSACTION(instance->locktag, vxid); instance->holdMask = LOCKBIT_ON(ExclusiveLock); instance->waitLockMode = NoLock; - instance->backend = proc->backendId; - instance->lxid = proc->lxid; + instance->vxid.procNumber = proc->vxid.procNumber; + instance->vxid.localTransactionId = proc->vxid.lxid; instance->pid = proc->pid; instance->leaderPid = proc->pid; instance->fastpath = true; @@ -3736,8 +3761,8 @@ GetLockStatusData(void) instance->waitLockMode = proc->waitLockMode; else instance->waitLockMode = NoLock; - instance->backend = proc->backendId; - instance->lxid = proc->lxid; + instance->vxid.procNumber = proc->vxid.procNumber; + instance->vxid.localTransactionId = proc->vxid.lxid; instance->pid = proc->pid; instance->leaderPid = proclock->groupLeader->pid; instance->fastpath = false; @@ -3912,8 +3937,8 @@ GetSingleProcBlockerStatusData(PGPROC *blocked_proc, BlockedProcsData *data) instance->waitLockMode = proc->waitLockMode; else instance->waitLockMode = NoLock; - instance->backend = proc->backendId; - instance->lxid = proc->lxid; + instance->vxid.procNumber = proc->vxid.procNumber; + instance->vxid.localTransactionId = proc->vxid.lxid; instance->pid = proc->pid; instance->leaderPid = proclock->groupLeader->pid; instance->fastpath = false; @@ -4193,7 +4218,7 @@ lock_twophase_recover(TransactionId xid, uint16 info, ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of shared memory"), - errhint("You might need to increase %s.", "max_locks_per_transaction"))); + errhint("You might need to increase \"%s\".", "max_locks_per_transaction"))); } /* @@ -4258,7 +4283,7 @@ lock_twophase_recover(TransactionId xid, uint16 info, ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of shared memory"), - errhint("You might need to increase %s.", "max_locks_per_transaction"))); + errhint("You might need to increase \"%s\".", "max_locks_per_transaction"))); } /* @@ -4398,8 +4423,8 @@ lock_twophase_postabort(TransactionId xid, uint16 info, * lockers, as we haven't advertised this vxid via the ProcArray yet. * * Since MyProc->fpLocalTransactionId will normally contain the same data - * as MyProc->lxid, you might wonder if we really need both. The - * difference is that MyProc->lxid is set and cleared unlocked, and + * as MyProc->vxid.lxid, you might wonder if we really need both. The + * difference is that MyProc->vxid.lxid is set and cleared unlocked, and * examined by procarray.c, while fpLocalTransactionId is protected by * fpInfoLock and is used only by the locking subsystem. Doing it this * way makes it easier to verify that there are no funny race conditions. @@ -4415,7 +4440,7 @@ VirtualXactLockTableInsert(VirtualTransactionId vxid) LWLockAcquire(&MyProc->fpInfoLock, LW_EXCLUSIVE); - Assert(MyProc->backendId == vxid.backendId); + Assert(MyProc->vxid.procNumber == vxid.procNumber); Assert(MyProc->fpLocalTransactionId == InvalidLocalTransactionId); Assert(MyProc->fpVXIDLock == false); @@ -4437,7 +4462,7 @@ VirtualXactLockTableCleanup(void) bool fastpath; LocalTransactionId lxid; - Assert(MyProc->backendId != InvalidBackendId); + Assert(MyProc->vxid.procNumber != INVALID_PROC_NUMBER); /* * Clean up shared memory state. @@ -4460,7 +4485,7 @@ VirtualXactLockTableCleanup(void) VirtualTransactionId vxid; LOCKTAG locktag; - vxid.backendId = MyBackendId; + vxid.procNumber = MyProcNumber; vxid.localTransactionId = lxid; SET_LOCKTAG_VIRTUALTRANSACTION(locktag, vxid); @@ -4554,18 +4579,18 @@ VirtualXactLock(VirtualTransactionId vxid, bool wait) * relevant lxid is no longer running here, that's enough to prove that * it's no longer running anywhere. */ - proc = BackendIdGetProc(vxid.backendId); + proc = ProcNumberGetProc(vxid.procNumber); if (proc == NULL) return XactLockForVirtualXact(vxid, InvalidTransactionId, wait); /* - * We must acquire this lock before checking the backendId and lxid + * We must acquire this lock before checking the procNumber and lxid * against the ones we're waiting for. The target backend will only set * or clear lxid while holding this lock. */ LWLockAcquire(&proc->fpInfoLock, LW_EXCLUSIVE); - if (proc->backendId != vxid.backendId + if (proc->vxid.procNumber != vxid.procNumber || proc->fpLocalTransactionId != vxid.localTransactionId) { /* VXID ended */ @@ -4608,7 +4633,7 @@ VirtualXactLock(VirtualTransactionId vxid, bool wait) ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of shared memory"), - errhint("You might need to increase %s.", "max_locks_per_transaction"))); + errhint("You might need to increase \"%s\".", "max_locks_per_transaction"))); } GrantLock(proclock->tag.myLock, proclock, ExclusiveLock); diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 01d738f306bb8..5df62fafbfbae 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -20,7 +20,7 @@ * appropriate value for a free lock. The meaning of the variable is up to * the caller, the lightweight lock code just assigns and compares it. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -81,9 +81,6 @@ #include "pgstat.h" #include "port/pg_bitutils.h" #include "postmaster/postmaster.h" -#include "replication/slot.h" -#include "storage/ipc.h" -#include "storage/predicate.h" #include "storage/proc.h" #include "storage/proclist.h" #include "storage/spin.h" @@ -114,9 +111,9 @@ StaticAssertDecl(LW_VAL_EXCLUSIVE > (uint32) MAX_BACKENDS, /* * There are three sorts of LWLock "tranches": * - * 1. The individually-named locks defined in lwlocknames.h each have their - * own tranche. The names of these tranches appear in IndividualLWLockNames[] - * in lwlocknames.c. + * 1. The individually-named locks defined in lwlocklist.h each have their + * own tranche. We absorb the names of these tranches from there into + * BuiltinTrancheNames here. * * 2. There are some predefined tranches for built-in groups of locks. * These are listed in enum BuiltinTrancheIds in lwlock.h, and their names @@ -129,71 +126,53 @@ StaticAssertDecl(LW_VAL_EXCLUSIVE > (uint32) MAX_BACKENDS, * All these names are user-visible as wait event names, so choose with care * ... and do not forget to update the documentation's list of wait events. */ -extern const char *const IndividualLWLockNames[]; /* in lwlocknames.c */ - static const char *const BuiltinTrancheNames[] = { - /* LWTRANCHE_XACT_BUFFER: */ - "XactBuffer", - /* LWTRANCHE_COMMITTS_BUFFER: */ - "CommitTsBuffer", - /* LWTRANCHE_SUBTRANS_BUFFER: */ - "SubtransBuffer", - /* LWTRANCHE_MULTIXACTOFFSET_BUFFER: */ - "MultiXactOffsetBuffer", - /* LWTRANCHE_MULTIXACTMEMBER_BUFFER: */ - "MultiXactMemberBuffer", - /* LWTRANCHE_NOTIFY_BUFFER: */ - "NotifyBuffer", - /* LWTRANCHE_SERIAL_BUFFER: */ - "SerialBuffer", - /* LWTRANCHE_WAL_INSERT: */ - "WALInsert", - /* LWTRANCHE_BUFFER_CONTENT: */ - "BufferContent", - /* LWTRANCHE_REPLICATION_ORIGIN_STATE: */ - "ReplicationOriginState", - /* LWTRANCHE_REPLICATION_SLOT_IO: */ - "ReplicationSlotIO", - /* LWTRANCHE_LOCK_FASTPATH: */ - "LockFastPath", - /* LWTRANCHE_BUFFER_MAPPING: */ - "BufferMapping", - /* LWTRANCHE_LOCK_MANAGER: */ - "LockManager", - /* LWTRANCHE_PREDICATE_LOCK_MANAGER: */ - "PredicateLockManager", - /* LWTRANCHE_PARALLEL_HASH_JOIN: */ - "ParallelHashJoin", - /* LWTRANCHE_PARALLEL_QUERY_DSA: */ - "ParallelQueryDSA", - /* LWTRANCHE_PER_SESSION_DSA: */ - "PerSessionDSA", - /* LWTRANCHE_PER_SESSION_RECORD_TYPE: */ - "PerSessionRecordType", - /* LWTRANCHE_PER_SESSION_RECORD_TYPMOD: */ - "PerSessionRecordTypmod", - /* LWTRANCHE_SHARED_TUPLESTORE: */ - "SharedTupleStore", - /* LWTRANCHE_SHARED_TIDBITMAP: */ - "SharedTidBitmap", - /* LWTRANCHE_PARALLEL_APPEND: */ - "ParallelAppend", - /* LWTRANCHE_PER_XACT_PREDICATE_LIST: */ - "PerXactPredicateList", - /* LWTRANCHE_PGSTATS_DSA: */ - "PgStatsDSA", - /* LWTRANCHE_PGSTATS_HASH: */ - "PgStatsHash", - /* LWTRANCHE_PGSTATS_DATA: */ - "PgStatsData", - /* LWTRANCHE_LAUNCHER_DSA: */ - "LogicalRepLauncherDSA", - /* LWTRANCHE_LAUNCHER_HASH: */ - "LogicalRepLauncherHash", +#define PG_LWLOCK(id, lockname) [id] = CppAsString(lockname), +#include "storage/lwlocklist.h" +#undef PG_LWLOCK + [LWTRANCHE_XACT_BUFFER] = "XactBuffer", + [LWTRANCHE_COMMITTS_BUFFER] = "CommitTsBuffer", + [LWTRANCHE_SUBTRANS_BUFFER] = "SubtransBuffer", + [LWTRANCHE_MULTIXACTOFFSET_BUFFER] = "MultiXactOffsetBuffer", + [LWTRANCHE_MULTIXACTMEMBER_BUFFER] = "MultiXactMemberBuffer", + [LWTRANCHE_NOTIFY_BUFFER] = "NotifyBuffer", + [LWTRANCHE_SERIAL_BUFFER] = "SerialBuffer", + [LWTRANCHE_WAL_INSERT] = "WALInsert", + [LWTRANCHE_BUFFER_CONTENT] = "BufferContent", + [LWTRANCHE_REPLICATION_ORIGIN_STATE] = "ReplicationOriginState", + [LWTRANCHE_REPLICATION_SLOT_IO] = "ReplicationSlotIO", + [LWTRANCHE_LOCK_FASTPATH] = "LockFastPath", + [LWTRANCHE_BUFFER_MAPPING] = "BufferMapping", + [LWTRANCHE_LOCK_MANAGER] = "LockManager", + [LWTRANCHE_PREDICATE_LOCK_MANAGER] = "PredicateLockManager", + [LWTRANCHE_PARALLEL_HASH_JOIN] = "ParallelHashJoin", + [LWTRANCHE_PARALLEL_QUERY_DSA] = "ParallelQueryDSA", + [LWTRANCHE_PER_SESSION_DSA] = "PerSessionDSA", + [LWTRANCHE_PER_SESSION_RECORD_TYPE] = "PerSessionRecordType", + [LWTRANCHE_PER_SESSION_RECORD_TYPMOD] = "PerSessionRecordTypmod", + [LWTRANCHE_SHARED_TUPLESTORE] = "SharedTupleStore", + [LWTRANCHE_SHARED_TIDBITMAP] = "SharedTidBitmap", + [LWTRANCHE_PARALLEL_APPEND] = "ParallelAppend", + [LWTRANCHE_PER_XACT_PREDICATE_LIST] = "PerXactPredicateList", + [LWTRANCHE_PGSTATS_DSA] = "PgStatsDSA", + [LWTRANCHE_PGSTATS_HASH] = "PgStatsHash", + [LWTRANCHE_PGSTATS_DATA] = "PgStatsData", + [LWTRANCHE_LAUNCHER_DSA] = "LogicalRepLauncherDSA", + [LWTRANCHE_LAUNCHER_HASH] = "LogicalRepLauncherHash", + [LWTRANCHE_DSM_REGISTRY_DSA] = "DSMRegistryDSA", + [LWTRANCHE_DSM_REGISTRY_HASH] = "DSMRegistryHash", + [LWTRANCHE_COMMITTS_SLRU] = "CommitTsSLRU", + [LWTRANCHE_MULTIXACTOFFSET_SLRU] = "MultixactOffsetSLRU", + [LWTRANCHE_MULTIXACTMEMBER_SLRU] = "MultixactMemberSLRU", + [LWTRANCHE_NOTIFY_SLRU] = "NotifySLRU", + [LWTRANCHE_SERIAL_SLRU] = "SerialSLRU", + [LWTRANCHE_SUBTRANS_SLRU] = "SubtransSLRU", + [LWTRANCHE_XACT_SLRU] = "XactSLRU", + [LWTRANCHE_PARALLEL_VACUUM_DSA] = "ParallelVacuumDSA", }; StaticAssertDecl(lengthof(BuiltinTrancheNames) == - LWTRANCHE_FIRST_USER_DEFINED - NUM_INDIVIDUAL_LWLOCKS, + LWTRANCHE_FIRST_USER_DEFINED, "missing entries in BuiltinTrancheNames[]"); /* @@ -765,13 +744,9 @@ LWLockReportWaitEnd(void) static const char * GetLWTrancheName(uint16 trancheId) { - /* Individual LWLock? */ - if (trancheId < NUM_INDIVIDUAL_LWLOCKS) - return IndividualLWLockNames[trancheId]; - - /* Built-in tranche? */ + /* Built-in tranche or individual LWLock? */ if (trancheId < LWTRANCHE_FIRST_USER_DEFINED) - return BuiltinTrancheNames[trancheId - NUM_INDIVIDUAL_LWLOCKS]; + return BuiltinTrancheNames[trancheId]; /* * It's an extension tranche, so look in LWLockTrancheNames[]. However, @@ -803,7 +778,7 @@ GetLWLockIdentifier(uint32 classId, uint16 eventId) * in mode. * * This function will not block waiting for a lock to become free - that's the - * callers job. + * caller's job. * * Returns true if the lock isn't free and we need to wait. */ @@ -1083,9 +1058,9 @@ LWLockQueueSelf(LWLock *lock, LWLockMode mode) /* LW_WAIT_UNTIL_FREE waiters are always at the front of the queue */ if (mode == LW_WAIT_UNTIL_FREE) - proclist_push_head(&lock->waiters, MyProc->pgprocno, lwWaitLink); + proclist_push_head(&lock->waiters, MyProcNumber, lwWaitLink); else - proclist_push_tail(&lock->waiters, MyProc->pgprocno, lwWaitLink); + proclist_push_tail(&lock->waiters, MyProcNumber, lwWaitLink); /* Can release the mutex now */ LWLockWaitListUnlock(lock); @@ -1124,7 +1099,7 @@ LWLockDequeueSelf(LWLock *lock) */ on_waitlist = MyProc->lwWaiting == LW_WS_WAITING; if (on_waitlist) - proclist_delete(&lock->waiters, MyProc->pgprocno, lwWaitLink); + proclist_delete(&lock->waiters, MyProcNumber, lwWaitLink); if (proclist_is_empty(&lock->waiters) && (pg_atomic_read_u32(&lock->state) & LW_FLAG_HAS_WAITERS) != 0) @@ -1547,9 +1522,8 @@ LWLockAcquireOrWait(LWLock *lock, LWLockMode mode) * *result is set to true if the lock was free, and false otherwise. */ static bool -LWLockConflictsWithVar(LWLock *lock, - uint64 *valptr, uint64 oldval, uint64 *newval, - bool *result) +LWLockConflictsWithVar(LWLock *lock, pg_atomic_uint64 *valptr, uint64 oldval, + uint64 *newval, bool *result) { bool mustwait; uint64 value; @@ -1557,9 +1531,10 @@ LWLockConflictsWithVar(LWLock *lock, /* * Test first to see if it the slot is free right now. * - * XXX: the caller uses a spinlock before this, so we don't need a memory - * barrier here as far as the current usage is concerned. But that might - * not be safe in general. + * XXX: the unique caller of this routine, WaitXLogInsertionsToFinish() + * via LWLockWaitForVar(), uses an implied barrier with a spinlock before + * this, so we don't need a memory barrier here as far as the current + * usage is concerned. But that might not be safe in general. */ mustwait = (pg_atomic_read_u32(&lock->state) & LW_VAL_EXCLUSIVE) != 0; @@ -1572,13 +1547,10 @@ LWLockConflictsWithVar(LWLock *lock, *result = false; /* - * Read value using the lwlock's wait list lock, as we can't generally - * rely on atomic 64 bit reads/stores. TODO: On platforms with a way to - * do atomic 64 bit reads/writes the spinlock should be optimized away. + * Reading this value atomically is safe even on platforms where uint64 + * cannot be read without observing a torn value. */ - LWLockWaitListLock(lock); - value = *valptr; - LWLockWaitListUnlock(lock); + value = pg_atomic_read_u64(valptr); if (value != oldval) { @@ -1605,9 +1577,14 @@ LWLockConflictsWithVar(LWLock *lock, * * Note: this function ignores shared lock holders; if the lock is held * in shared mode, returns 'true'. + * + * Be aware that LWLockConflictsWithVar() does not include a memory barrier, + * hence the caller of this function may want to rely on an explicit barrier or + * an implied barrier via spinlock or LWLock to avoid memory ordering issues. */ bool -LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval) +LWLockWaitForVar(LWLock *lock, pg_atomic_uint64 *valptr, uint64 oldval, + uint64 *newval) { PGPROC *proc = MyProc; int extraWaits = 0; @@ -1735,29 +1712,32 @@ LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval) * LWLockUpdateVar - Update a variable and wake up waiters atomically * * Sets *valptr to 'val', and wakes up all processes waiting for us with - * LWLockWaitForVar(). Setting the value and waking up the processes happen - * atomically so that any process calling LWLockWaitForVar() on the same lock - * is guaranteed to see the new value, and act accordingly. + * LWLockWaitForVar(). It first sets the value atomically and then wakes up + * waiting processes so that any process calling LWLockWaitForVar() on the same + * lock is guaranteed to see the new value, and act accordingly. * * The caller must be holding the lock in exclusive mode. */ void -LWLockUpdateVar(LWLock *lock, uint64 *valptr, uint64 val) +LWLockUpdateVar(LWLock *lock, pg_atomic_uint64 *valptr, uint64 val) { proclist_head wakeup; proclist_mutable_iter iter; PRINT_LWDEBUG("LWLockUpdateVar", lock, LW_EXCLUSIVE); + /* + * Note that pg_atomic_exchange_u64 is a full barrier, so we're guaranteed + * that the variable is updated before waking up waiters. + */ + pg_atomic_exchange_u64(valptr, val); + proclist_init(&wakeup); LWLockWaitListLock(lock); Assert(pg_atomic_read_u32(&lock->state) & LW_VAL_EXCLUSIVE); - /* Update the lock's value */ - *valptr = val; - /* * See if there are any LW_WAIT_UNTIL_FREE waiters that need to be woken * up. They are always in the front of the queue. @@ -1873,17 +1853,13 @@ LWLockRelease(LWLock *lock) * LWLockReleaseClearVar - release a previously acquired lock, reset variable */ void -LWLockReleaseClearVar(LWLock *lock, uint64 *valptr, uint64 val) +LWLockReleaseClearVar(LWLock *lock, pg_atomic_uint64 *valptr, uint64 val) { - LWLockWaitListLock(lock); - /* - * Set the variable's value before releasing the lock, that prevents race - * a race condition wherein a new locker acquires the lock, but hasn't yet - * set the variables value. + * Note that pg_atomic_exchange_u64 is a full barrier, so we're guaranteed + * that the variable is updated before releasing the lock. */ - *valptr = val; - LWLockWaitListUnlock(lock); + pg_atomic_exchange_u64(valptr, val); LWLockRelease(lock); } @@ -1929,7 +1905,7 @@ LWLockHeldByMe(LWLock *lock) } /* - * LWLockHeldByMe - test whether my process holds any of an array of locks + * LWLockAnyHeldByMe - test whether my process holds any of an array of locks * * This is meant as debug support only. */ diff --git a/src/backend/storage/lmgr/lwlocknames.txt b/src/backend/storage/lmgr/lwlocknames.txt deleted file mode 100644 index 6c7cf6c295661..0000000000000 --- a/src/backend/storage/lmgr/lwlocknames.txt +++ /dev/null @@ -1,55 +0,0 @@ -# Some commonly-used locks have predefined positions within MainLWLockArray; -# these are defined here. If you add a lock, add it to the end to avoid -# renumbering the existing locks; if you remove a lock, consider leaving a gap -# in the numbering sequence for the benefit of DTrace and other external -# debugging scripts. Also, do not forget to update the list of wait events -# in the user documentation. - -# 0 is available; was formerly BufFreelistLock -ShmemIndexLock 1 -OidGenLock 2 -XidGenLock 3 -ProcArrayLock 4 -SInvalReadLock 5 -SInvalWriteLock 6 -WALBufMappingLock 7 -WALWriteLock 8 -ControlFileLock 9 -# 10 was CheckpointLock -XactSLRULock 11 -SubtransSLRULock 12 -MultiXactGenLock 13 -MultiXactOffsetSLRULock 14 -MultiXactMemberSLRULock 15 -RelCacheInitLock 16 -CheckpointerCommLock 17 -TwoPhaseStateLock 18 -TablespaceCreateLock 19 -BtreeVacuumLock 20 -AddinShmemInitLock 21 -AutovacuumLock 22 -AutovacuumScheduleLock 23 -SyncScanLock 24 -RelationMappingLock 25 -NotifySLRULock 26 -NotifyQueueLock 27 -SerializableXactHashLock 28 -SerializableFinishedListLock 29 -SerializablePredicateListLock 30 -SerialSLRULock 31 -SyncRepLock 32 -BackgroundWorkerLock 33 -DynamicSharedMemoryControlLock 34 -AutoFileLock 35 -ReplicationSlotAllocationLock 36 -ReplicationSlotControlLock 37 -CommitTsSLRULock 38 -CommitTsLock 39 -ReplicationOriginLock 40 -MultiXactTruncationLock 41 -OldSnapshotTimeMapLock 42 -LogicalRepWorkerLock 43 -XactTruncationLock 44 -# 45 was XactTruncationLock until removal of BackendRandomLock -WrapLimitsVacuumLock 46 -NotifyQueueTailLock 47 diff --git a/src/backend/storage/lmgr/meson.build b/src/backend/storage/lmgr/meson.build index 0b2c93df9a485..05ac41e809a81 100644 --- a/src/backend/storage/lmgr/meson.build +++ b/src/backend/storage/lmgr/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'condition_variable.c', @@ -11,5 +11,3 @@ backend_sources += files( 's_lock.c', 'spin.c', ) - -generated_backend_sources += lwlocknames[1] diff --git a/src/backend/storage/lmgr/predicate.c b/src/backend/storage/lmgr/predicate.c index 1af41213b41be..2c87273e17e0d 100644 --- a/src/backend/storage/lmgr/predicate.c +++ b/src/backend/storage/lmgr/predicate.c @@ -134,8 +134,13 @@ * SerializableXactHashLock * - Protects both PredXact and SerializableXidHash. * + * SerialControlLock + * - Protects SerialControlData members * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * SLRU per-bank locks + * - Protects SerialSlruCtl + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -194,7 +199,6 @@ #include "access/parallel.h" #include "access/slru.h" -#include "access/subtrans.h" #include "access/transam.h" #include "access/twophase.h" #include "access/twophase_rmgr.h" @@ -203,11 +207,11 @@ #include "miscadmin.h" #include "pgstat.h" #include "port/pg_lfind.h" -#include "storage/bufmgr.h" #include "storage/predicate.h" #include "storage/predicate_internals.h" #include "storage/proc.h" #include "storage/procarray.h" +#include "utils/guc_hooks.h" #include "utils/rel.h" #include "utils/snapmgr.h" @@ -340,7 +344,7 @@ static SlruCtlData SerialSlruCtlData; typedef struct SerialControlData { - int headPage; /* newest initialized page */ + int64 headPage; /* newest initialized page */ TransactionId headXid; /* newest valid Xid in the SLRU */ TransactionId tailXid; /* oldest xmin we might be interested in */ } SerialControlData; @@ -437,7 +441,7 @@ static void SetPossibleUnsafeConflict(SERIALIZABLEXACT *roXact, SERIALIZABLEXACT static void ReleaseRWConflict(RWConflict conflict); static void FlagSxactUnsafe(SERIALIZABLEXACT *sxact); -static bool SerialPagePrecedesLogically(int page1, int page2); +static bool SerialPagePrecedesLogically(int64 page1, int64 page2); static void SerialInit(void); static void SerialAdd(TransactionId xid, SerCommitSeqNo minConflictCommitSeqNo); static SerCommitSeqNo SerialGetMinConflictCommitSeqNo(TransactionId xid); @@ -647,7 +651,7 @@ SetRWConflict(SERIALIZABLEXACT *reader, SERIALIZABLEXACT *writer) ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("not enough elements in RWConflictPool to record a read/write conflict"), - errhint("You might need to run fewer transactions at a time or increase max_connections."))); + errhint("You might need to run fewer transactions at a time or increase \"max_connections\"."))); conflict = dlist_head_element(RWConflictData, outLink, &RWConflictPool->availableList); dlist_delete(&conflict->outLink); @@ -672,7 +676,7 @@ SetPossibleUnsafeConflict(SERIALIZABLEXACT *roXact, ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("not enough elements in RWConflictPool to record a potential read/write conflict"), - errhint("You might need to run fewer transactions at a time or increase max_connections."))); + errhint("You might need to run fewer transactions at a time or increase \"max_connections\"."))); conflict = dlist_head_element(RWConflictData, outLink, &RWConflictPool->availableList); dlist_delete(&conflict->outLink); @@ -724,7 +728,7 @@ FlagSxactUnsafe(SERIALIZABLEXACT *sxact) * Analogous to CLOGPagePrecedes(). */ static bool -SerialPagePrecedesLogically(int page1, int page2) +SerialPagePrecedesLogically(int64 page1, int64 page2) { TransactionId xid1; TransactionId xid2; @@ -744,7 +748,7 @@ SerialPagePrecedesLogicallyUnitTests(void) { int per_page = SERIAL_ENTRIESPERPAGE, offset = per_page / 2; - int newestPage, + int64 newestPage, oldestPage, headPage, targetPage; @@ -807,9 +811,10 @@ SerialInit(void) * Set up SLRU management of the pg_serial data. */ SerialSlruCtl->PagePrecedes = SerialPagePrecedesLogically; - SimpleLruInit(SerialSlruCtl, "Serial", - NUM_SERIAL_BUFFERS, 0, SerialSLRULock, "pg_serial", - LWTRANCHE_SERIAL_BUFFER, SYNC_HANDLER_NONE); + SimpleLruInit(SerialSlruCtl, "serializable", + serializable_buffers, 0, "pg_serial", + LWTRANCHE_SERIAL_BUFFER, LWTRANCHE_SERIAL_SLRU, + SYNC_HANDLER_NONE, false); #ifdef USE_ASSERT_CHECKING SerialPagePrecedesLogicallyUnitTests(); #endif @@ -827,12 +832,23 @@ SerialInit(void) /* * Set control information to reflect empty SLRU. */ + LWLockAcquire(SerialControlLock, LW_EXCLUSIVE); serialControl->headPage = -1; serialControl->headXid = InvalidTransactionId; serialControl->tailXid = InvalidTransactionId; + LWLockRelease(SerialControlLock); } } +/* + * GUC check_hook for serializable_buffers + */ +bool +check_serial_buffers(int *newval, void **extra, GucSource source) +{ + return check_slru_buffers("serializable_buffers", newval); +} + /* * Record a committed read write serializable xid and the minimum * commitSeqNo of any transactions to which this xid had a rw-conflict out. @@ -842,24 +858,36 @@ static void SerialAdd(TransactionId xid, SerCommitSeqNo minConflictCommitSeqNo) { TransactionId tailXid; - int targetPage; + int64 targetPage; int slotno; - int firstZeroPage; + int64 firstZeroPage; bool isNewPage; + LWLock *lock; Assert(TransactionIdIsValid(xid)); targetPage = SerialPage(xid); + lock = SimpleLruGetBankLock(SerialSlruCtl, targetPage); - LWLockAcquire(SerialSLRULock, LW_EXCLUSIVE); + /* + * In this routine, we must hold both SerialControlLock and the SLRU bank + * lock simultaneously while making the SLRU data catch up with the new + * state that we determine. + */ + LWLockAcquire(SerialControlLock, LW_EXCLUSIVE); /* - * If no serializable transactions are active, there shouldn't be anything - * to push out to the SLRU. Hitting this assert would mean there's - * something wrong with the earlier cleanup logic. + * If 'xid' is older than the global xmin (== tailXid), there's no need to + * store it, after all. This can happen if the oldest transaction holding + * back the global xmin just finished, making 'xid' uninteresting, but + * ClearOldPredicateLocks() has not yet run. */ tailXid = serialControl->tailXid; - Assert(TransactionIdIsValid(tailXid)); + if (!TransactionIdIsValid(tailXid) || TransactionIdPrecedes(xid, tailXid)) + { + LWLockRelease(SerialControlLock); + return; + } /* * If the SLRU is currently unused, zero out the whole active region from @@ -887,21 +915,29 @@ SerialAdd(TransactionId xid, SerCommitSeqNo minConflictCommitSeqNo) if (isNewPage) { - /* Initialize intervening pages. */ - while (firstZeroPage != targetPage) + /* Initialize intervening pages; might involve trading locks */ + for (;;) { - (void) SimpleLruZeroPage(SerialSlruCtl, firstZeroPage); + lock = SimpleLruGetBankLock(SerialSlruCtl, firstZeroPage); + LWLockAcquire(lock, LW_EXCLUSIVE); + slotno = SimpleLruZeroPage(SerialSlruCtl, firstZeroPage); + if (firstZeroPage == targetPage) + break; firstZeroPage = SerialNextPage(firstZeroPage); + LWLockRelease(lock); } - slotno = SimpleLruZeroPage(SerialSlruCtl, targetPage); } else + { + LWLockAcquire(lock, LW_EXCLUSIVE); slotno = SimpleLruReadPage(SerialSlruCtl, targetPage, true, xid); + } SerialValue(slotno, xid) = minConflictCommitSeqNo; SerialSlruCtl->shared->page_dirty[slotno] = true; - LWLockRelease(SerialSLRULock); + LWLockRelease(lock); + LWLockRelease(SerialControlLock); } /* @@ -919,10 +955,10 @@ SerialGetMinConflictCommitSeqNo(TransactionId xid) Assert(TransactionIdIsValid(xid)); - LWLockAcquire(SerialSLRULock, LW_SHARED); + LWLockAcquire(SerialControlLock, LW_SHARED); headXid = serialControl->headXid; tailXid = serialControl->tailXid; - LWLockRelease(SerialSLRULock); + LWLockRelease(SerialControlLock); if (!TransactionIdIsValid(headXid)) return 0; @@ -934,13 +970,13 @@ SerialGetMinConflictCommitSeqNo(TransactionId xid) return 0; /* - * The following function must be called without holding SerialSLRULock, + * The following function must be called without holding SLRU bank lock, * but will return with that lock held, which must then be released. */ slotno = SimpleLruReadPage_ReadOnly(SerialSlruCtl, SerialPage(xid), xid); val = SerialValue(slotno, xid); - LWLockRelease(SerialSLRULock); + LWLockRelease(SimpleLruGetBankLock(SerialSlruCtl, SerialPage(xid))); return val; } @@ -953,7 +989,7 @@ SerialGetMinConflictCommitSeqNo(TransactionId xid) static void SerialSetActiveSerXmin(TransactionId xid) { - LWLockAcquire(SerialSLRULock, LW_EXCLUSIVE); + LWLockAcquire(SerialControlLock, LW_EXCLUSIVE); /* * When no sxacts are active, nothing overlaps, set the xid values to @@ -965,7 +1001,7 @@ SerialSetActiveSerXmin(TransactionId xid) { serialControl->tailXid = InvalidTransactionId; serialControl->headXid = InvalidTransactionId; - LWLockRelease(SerialSLRULock); + LWLockRelease(SerialControlLock); return; } @@ -983,7 +1019,7 @@ SerialSetActiveSerXmin(TransactionId xid) { serialControl->tailXid = xid; } - LWLockRelease(SerialSLRULock); + LWLockRelease(SerialControlLock); return; } @@ -992,7 +1028,7 @@ SerialSetActiveSerXmin(TransactionId xid) serialControl->tailXid = xid; - LWLockRelease(SerialSLRULock); + LWLockRelease(SerialControlLock); } /* @@ -1004,21 +1040,37 @@ SerialSetActiveSerXmin(TransactionId xid) void CheckPointPredicate(void) { - int tailPage; + int64 truncateCutoffPage; - LWLockAcquire(SerialSLRULock, LW_EXCLUSIVE); + LWLockAcquire(SerialControlLock, LW_EXCLUSIVE); /* Exit quickly if the SLRU is currently not in use. */ if (serialControl->headPage < 0) { - LWLockRelease(SerialSLRULock); + LWLockRelease(SerialControlLock); return; } if (TransactionIdIsValid(serialControl->tailXid)) { - /* We can truncate the SLRU up to the page containing tailXid */ + int64 tailPage; + tailPage = SerialPage(serialControl->tailXid); + + /* + * It is possible for the tailXid to be ahead of the headXid. This + * occurs if we checkpoint while there are in-progress serializable + * transaction(s) advancing the tail but we are yet to summarize the + * transactions. In this case, we cutoff up to the headPage and the + * next summary will advance the headXid. + */ + if (SerialPagePrecedesLogically(tailPage, serialControl->headPage)) + { + /* We can truncate the SLRU up to the page containing tailXid */ + truncateCutoffPage = tailPage; + } + else + truncateCutoffPage = serialControl->headPage; } else { @@ -1051,14 +1103,18 @@ CheckPointPredicate(void) * transaction instigating the summarize fails in * SimpleLruReadPage(). */ - tailPage = serialControl->headPage; + truncateCutoffPage = serialControl->headPage; serialControl->headPage = -1; } - LWLockRelease(SerialSLRULock); + LWLockRelease(SerialControlLock); - /* Truncate away pages that are no longer required */ - SimpleLruTruncate(SerialSlruCtl, tailPage); + /* + * Truncate away pages that are no longer required. Note that no + * additional locking is required, because this is only called as part of + * a checkpoint, and the validity limits have already been determined. + */ + SimpleLruTruncate(SerialSlruCtl, truncateCutoffPage); /* * Write dirty SLRU pages to disk @@ -1212,7 +1268,7 @@ InitPredicateLocks(void) PredXact->OldCommittedSxact->xmin = InvalidTransactionId; PredXact->OldCommittedSxact->flags = SXACT_FLAG_COMMITTED; PredXact->OldCommittedSxact->pid = 0; - PredXact->OldCommittedSxact->pgprocno = INVALID_PGPROCNO; + PredXact->OldCommittedSxact->pgprocno = INVALID_PROC_NUMBER; } /* This never changes, so let's keep a local copy. */ OldCommittedSxact = PredXact->OldCommittedSxact; @@ -1331,7 +1387,7 @@ PredicateLockShmemSize(void) /* Shared memory structures for SLRU tracking of old committed xids. */ size = add_size(size, sizeof(SerialControlData)); - size = add_size(size, SimpleLruShmemSize(NUM_SERIAL_BUFFERS, 0)); + size = add_size(size, SimpleLruShmemSize(serializable_buffers, 0)); return size; } @@ -1794,7 +1850,7 @@ GetSerializableTransactionSnapshotInt(Snapshot snapshot, sxact->finishedBefore = InvalidTransactionId; sxact->xmin = snapshot->xmin; sxact->pid = MyProcPid; - sxact->pgprocno = MyProc->pgprocno; + sxact->pgprocno = MyProcNumber; dlist_init(&sxact->predicateLocks); dlist_node_init(&sxact->finishedLink); sxact->flags = 0; @@ -2410,7 +2466,7 @@ CreatePredicateLock(const PREDICATELOCKTARGETTAG *targettag, ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of shared memory"), - errhint("You might need to increase %s.", "max_pred_locks_per_transaction"))); + errhint("You might need to increase \"%s\".", "max_pred_locks_per_transaction"))); if (!found) dlist_init(&target->predicateLocks); @@ -2425,7 +2481,7 @@ CreatePredicateLock(const PREDICATELOCKTARGETTAG *targettag, ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of shared memory"), - errhint("You might need to increase %s.", "max_pred_locks_per_transaction"))); + errhint("You might need to increase \"%s\".", "max_pred_locks_per_transaction"))); if (!found) { @@ -3373,7 +3429,7 @@ ReleasePredicateLocks(bool isCommit, bool isReadOnlySafe) * transaction to complete before freeing some RAM; correctness of visible * behavior is not affected. */ - MySerializableXact->finishedBefore = XidFromFullTransactionId(ShmemVariableCache->nextXid); + MySerializableXact->finishedBefore = XidFromFullTransactionId(TransamVariables->nextXid); /* * If it's not a commit it's either a rollback or a read-only transaction @@ -3822,7 +3878,7 @@ ReleaseOneSerializableXact(SERIALIZABLEXACT *sxact, bool partial, ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of shared memory"), - errhint("You might need to increase %s.", "max_pred_locks_per_transaction"))); + errhint("You might need to increase \"%s\".", "max_pred_locks_per_transaction"))); if (found) { Assert(predlock->commitSeqNo != 0); @@ -4798,7 +4854,7 @@ PostPrepare_PredicateLocks(TransactionId xid) Assert(SxactIsPrepared(MySerializableXact)); MySerializableXact->pid = 0; - MySerializableXact->pgprocno = INVALID_PGPROCNO; + MySerializableXact->pgprocno = INVALID_PROC_NUMBER; hash_destroy(LocalPredicateLockHash); LocalPredicateLockHash = NULL; @@ -4870,11 +4926,11 @@ predicatelock_twophase_recover(TransactionId xid, uint16 info, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of shared memory"))); - /* vxid for a prepared xact is InvalidBackendId/xid; no pid */ - sxact->vxid.backendId = InvalidBackendId; + /* vxid for a prepared xact is INVALID_PROC_NUMBER/xid; no pid */ + sxact->vxid.procNumber = INVALID_PROC_NUMBER; sxact->vxid.localTransactionId = (LocalTransactionId) xid; sxact->pid = 0; - sxact->pgprocno = INVALID_PGPROCNO; + sxact->pgprocno = INVALID_PROC_NUMBER; /* a prepared xact hasn't committed yet */ sxact->prepareSeqNo = RecoverySerCommitSeqNo; diff --git a/src/backend/storage/lmgr/proc.c b/src/backend/storage/lmgr/proc.c index dac921219fae2..b50e2eff21877 100644 --- a/src/backend/storage/lmgr/proc.c +++ b/src/backend/storage/lmgr/proc.c @@ -3,7 +3,7 @@ * proc.c * routines to manage per-process shared memory data structure * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -39,9 +39,8 @@ #include "miscadmin.h" #include "pgstat.h" #include "postmaster/autovacuum.h" -#include "replication/slot.h" +#include "replication/slotsync.h" #include "replication/syncrep.h" -#include "replication/walsender.h" #include "storage/condition_variable.h" #include "storage/ipc.h" #include "storage/lmgr.h" @@ -59,6 +58,7 @@ int DeadlockTimeout = 1000; int StatementTimeout = 0; int LockTimeout = 0; int IdleInTransactionSessionTimeout = 0; +int TransactionTimeout = 0; int IdleSessionTimeout = 0; bool log_lock_waits = false; @@ -178,16 +178,17 @@ InitProcGlobal(void) ProcGlobal->startupBufferPinWaitBufId = -1; ProcGlobal->walwriterLatch = NULL; ProcGlobal->checkpointerLatch = NULL; - pg_atomic_init_u32(&ProcGlobal->procArrayGroupFirst, INVALID_PGPROCNO); - pg_atomic_init_u32(&ProcGlobal->clogGroupFirst, INVALID_PGPROCNO); + pg_atomic_init_u32(&ProcGlobal->procArrayGroupFirst, INVALID_PROC_NUMBER); + pg_atomic_init_u32(&ProcGlobal->clogGroupFirst, INVALID_PROC_NUMBER); /* * Create and initialize all the PGPROC structures we'll need. There are - * five separate consumers: (1) normal backends, (2) autovacuum workers - * and the autovacuum launcher, (3) background workers, (4) auxiliary - * processes, and (5) prepared transactions. Each PGPROC structure is - * dedicated to exactly one of these purposes, and they do not move - * between groups. + * six separate consumers: (1) normal backends, (2) autovacuum workers and + * special workers, (3) background workers, (4) walsenders, (5) auxiliary + * processes, and (6) prepared transactions. (For largely-historical + * reasons, we combine autovacuum and special workers into one category + * with a single freelist.) Each PGPROC structure is dedicated to exactly + * one of these purposes, and they do not move between groups. */ procs = (PGPROC *) ShmemAlloc(TotalProcs * sizeof(PGPROC)); MemSet(procs, 0, TotalProcs * sizeof(PGPROC)); @@ -227,38 +228,38 @@ InitProcGlobal(void) InitSharedLatch(&(proc->procLatch)); LWLockInitialize(&(proc->fpInfoLock), LWTRANCHE_LOCK_FASTPATH); } - proc->pgprocno = i; /* - * Newly created PGPROCs for normal backends, autovacuum and bgworkers - * must be queued up on the appropriate free list. Because there can - * only ever be a small, fixed number of auxiliary processes, no free - * list is used in that case; InitAuxiliaryProcess() instead uses a - * linear search. PGPROCs for prepared transactions are added to a - * free list by TwoPhaseShmemInit(). + * Newly created PGPROCs for normal backends, autovacuum workers, + * special workers, bgworkers, and walsenders must be queued up on the + * appropriate free list. Because there can only ever be a small, + * fixed number of auxiliary processes, no free list is used in that + * case; InitAuxiliaryProcess() instead uses a linear search. PGPROCs + * for prepared transactions are added to a free list by + * TwoPhaseShmemInit(). */ if (i < MaxConnections) { /* PGPROC for normal backend, add to freeProcs list */ - dlist_push_head(&ProcGlobal->freeProcs, &proc->links); + dlist_push_tail(&ProcGlobal->freeProcs, &proc->links); proc->procgloballist = &ProcGlobal->freeProcs; } - else if (i < MaxConnections + autovacuum_max_workers + 1) + else if (i < MaxConnections + autovacuum_max_workers + NUM_SPECIAL_WORKER_PROCS) { - /* PGPROC for AV launcher/worker, add to autovacFreeProcs list */ - dlist_push_head(&ProcGlobal->autovacFreeProcs, &proc->links); + /* PGPROC for AV or special worker, add to autovacFreeProcs list */ + dlist_push_tail(&ProcGlobal->autovacFreeProcs, &proc->links); proc->procgloballist = &ProcGlobal->autovacFreeProcs; } - else if (i < MaxConnections + autovacuum_max_workers + 1 + max_worker_processes) + else if (i < MaxConnections + autovacuum_max_workers + NUM_SPECIAL_WORKER_PROCS + max_worker_processes) { /* PGPROC for bgworker, add to bgworkerFreeProcs list */ - dlist_push_head(&ProcGlobal->bgworkerFreeProcs, &proc->links); + dlist_push_tail(&ProcGlobal->bgworkerFreeProcs, &proc->links); proc->procgloballist = &ProcGlobal->bgworkerFreeProcs; } else if (i < MaxBackends) { /* PGPROC for walsender, add to walsenderFreeProcs list */ - dlist_push_head(&ProcGlobal->walsenderFreeProcs, &proc->links); + dlist_push_tail(&ProcGlobal->walsenderFreeProcs, &proc->links); proc->procgloballist = &ProcGlobal->walsenderFreeProcs; } @@ -273,8 +274,8 @@ InitProcGlobal(void) * Initialize the atomic variables, otherwise, it won't be safe to * access them for backends that aren't currently in use. */ - pg_atomic_init_u32(&(proc->procArrayGroupNext), INVALID_PGPROCNO); - pg_atomic_init_u32(&(proc->clogGroupNext), INVALID_PGPROCNO); + pg_atomic_init_u32(&(proc->procArrayGroupNext), INVALID_PROC_NUMBER); + pg_atomic_init_u32(&(proc->clogGroupNext), INVALID_PROC_NUMBER); pg_atomic_init_u64(&(proc->waitStart), 0); } @@ -291,7 +292,7 @@ InitProcGlobal(void) } /* - * InitProcess -- initialize a per-process data structure for this backend + * InitProcess -- initialize a per-process PGPROC entry for this backend */ void InitProcess(void) @@ -308,12 +309,15 @@ InitProcess(void) if (MyProc != NULL) elog(ERROR, "you already exist"); - /* Decide which list should supply our PGPROC. */ - if (IsAnyAutoVacuumProcess()) + /* + * Decide which list should supply our PGPROC. This logic must match the + * way the freelists were constructed in InitProcGlobal(). + */ + if (AmAutoVacuumWorkerProcess() || AmSpecialWorkerProcess()) procgloballist = &ProcGlobal->autovacFreeProcs; - else if (IsBackgroundWorker) + else if (AmBackgroundWorkerProcess()) procgloballist = &ProcGlobal->bgworkerFreeProcs; - else if (am_walsender) + else if (AmWalSenderProcess()) procgloballist = &ProcGlobal->walsenderFreeProcs; else procgloballist = &ProcGlobal->freeProcs; @@ -343,15 +347,16 @@ InitProcess(void) * in the autovacuum case? */ SpinLockRelease(ProcStructLock); - if (am_walsender) + if (AmWalSenderProcess()) ereport(FATAL, (errcode(ERRCODE_TOO_MANY_CONNECTIONS), - errmsg("number of requested standby connections exceeds max_wal_senders (currently %d)", + errmsg("number of requested standby connections exceeds \"max_wal_senders\" (currently %d)", max_wal_senders))); ereport(FATAL, (errcode(ERRCODE_TOO_MANY_CONNECTIONS), errmsg("sorry, too many clients already"))); } + MyProcNumber = GetNumberFromPGProc(MyProc); /* * Cross-check that the PGPROC is of the type we expect; if this were not @@ -364,8 +369,12 @@ InitProcess(void) * child; this is so that the postmaster can detect it if we exit without * cleaning up. (XXX autovac launcher currently doesn't participate in * this; it probably should.) + * + * Slot sync worker also does not participate in it, see comments atop + * 'struct bkend' in postmaster.c. */ - if (IsUnderPostmaster && !IsAutoVacuumLauncherProcess()) + if (IsUnderPostmaster && !AmAutoVacuumLauncherProcess() && + !AmLogicalSlotSyncWorkerProcess()) MarkPostmasterChildActive(); /* @@ -374,22 +383,22 @@ InitProcess(void) */ dlist_node_init(&MyProc->links); MyProc->waitStatus = PROC_WAIT_STATUS_OK; - MyProc->lxid = InvalidLocalTransactionId; MyProc->fpVXIDLock = false; MyProc->fpLocalTransactionId = InvalidLocalTransactionId; MyProc->xid = InvalidTransactionId; MyProc->xmin = InvalidTransactionId; MyProc->pid = MyProcPid; - /* backendId, databaseId and roleId will be filled in later */ - MyProc->backendId = InvalidBackendId; + MyProc->vxid.procNumber = MyProcNumber; + MyProc->vxid.lxid = InvalidLocalTransactionId; + /* databaseId and roleId will be filled in later */ MyProc->databaseId = InvalidOid; MyProc->roleId = InvalidOid; MyProc->tempNamespaceId = InvalidOid; - MyProc->isBackgroundWorker = IsBackgroundWorker; + MyProc->isBackgroundWorker = !AmRegularBackendProcess(); MyProc->delayChkptFlags = 0; MyProc->statusFlags = 0; /* NB -- autovac launcher intentionally does not set IS_AUTOVACUUM */ - if (IsAutoVacuumWorkerProcess()) + if (AmAutoVacuumWorkerProcess()) MyProc->statusFlags |= PROC_IS_AUTOVACUUM; MyProc->lwWaiting = LW_WS_NOT_WAITING; MyProc->lwWaitMode = 0; @@ -415,7 +424,7 @@ InitProcess(void) /* Initialize fields for group XID clearing. */ MyProc->procArrayGroupMember = false; MyProc->procArrayGroupMemberXid = InvalidTransactionId; - Assert(pg_atomic_read_u32(&MyProc->procArrayGroupNext) == INVALID_PGPROCNO); + Assert(pg_atomic_read_u32(&MyProc->procArrayGroupNext) == INVALID_PROC_NUMBER); /* Check that group locking fields are in a proper initial state. */ Assert(MyProc->lockGroupLeader == NULL); @@ -430,7 +439,7 @@ InitProcess(void) MyProc->clogGroupMemberXidStatus = TRANSACTION_STATUS_IN_PROGRESS; MyProc->clogGroupMemberPage = -1; MyProc->clogGroupMemberLsn = InvalidXLogRecPtr; - Assert(pg_atomic_read_u32(&MyProc->clogGroupNext) == INVALID_PGPROCNO); + Assert(pg_atomic_read_u32(&MyProc->clogGroupNext) == INVALID_PROC_NUMBER); /* * Acquire ownership of the PGPROC's latch, so that we can use WaitLatch @@ -461,6 +470,16 @@ InitProcess(void) */ InitLWLockAccess(); InitDeadLockChecking(); + +#ifdef EXEC_BACKEND + + /* + * Initialize backend-local pointers to all the shared data structures. + * (We couldn't do this until now because it needs LWLocks.) + */ + if (IsUnderPostmaster) + AttachSharedMemoryStructs(); +#endif } /* @@ -468,7 +487,7 @@ InitProcess(void) * * This is separate from InitProcess because we can't acquire LWLocks until * we've created a PGPROC, but in the EXEC_BACKEND case ProcArrayAdd won't - * work until after we've done CreateSharedMemoryAndSemaphores. + * work until after we've done AttachSharedMemoryStructs. */ void InitProcessPhase2(void) @@ -487,7 +506,7 @@ InitProcessPhase2(void) } /* - * InitAuxiliaryProcess -- create a per-auxiliary-process data structure + * InitAuxiliaryProcess -- create a PGPROC entry for an auxiliary process * * This is called by bgwriter and similar processes so that they will have a * MyProc value that's real enough to let them wait for LWLocks. The PGPROC @@ -551,26 +570,27 @@ InitAuxiliaryProcess(void) /* use volatile pointer to prevent code rearrangement */ ((volatile PGPROC *) auxproc)->pid = MyProcPid; - MyProc = auxproc; - SpinLockRelease(ProcStructLock); + MyProc = auxproc; + MyProcNumber = GetNumberFromPGProc(MyProc); + /* * Initialize all fields of MyProc, except for those previously * initialized by InitProcGlobal. */ dlist_node_init(&MyProc->links); MyProc->waitStatus = PROC_WAIT_STATUS_OK; - MyProc->lxid = InvalidLocalTransactionId; MyProc->fpVXIDLock = false; MyProc->fpLocalTransactionId = InvalidLocalTransactionId; MyProc->xid = InvalidTransactionId; MyProc->xmin = InvalidTransactionId; - MyProc->backendId = InvalidBackendId; + MyProc->vxid.procNumber = INVALID_PROC_NUMBER; + MyProc->vxid.lxid = InvalidLocalTransactionId; MyProc->databaseId = InvalidOid; MyProc->roleId = InvalidOid; MyProc->tempNamespaceId = InvalidOid; - MyProc->isBackgroundWorker = IsBackgroundWorker; + MyProc->isBackgroundWorker = true; MyProc->delayChkptFlags = 0; MyProc->statusFlags = 0; MyProc->lwWaiting = LW_WS_NOT_WAITING; @@ -614,6 +634,23 @@ InitAuxiliaryProcess(void) * Arrange to clean up at process exit. */ on_shmem_exit(AuxiliaryProcKill, Int32GetDatum(proctype)); + + /* + * Now that we have a PGPROC, we could try to acquire lightweight locks. + * Initialize local state needed for them. (Heavyweight locks cannot be + * acquired in aux processes.) + */ + InitLWLockAccess(); + +#ifdef EXEC_BACKEND + + /* + * Initialize backend-local pointers to all the shared data structures. + * (We couldn't do this until now because it needs LWLocks.) + */ + if (IsUnderPostmaster) + AttachSharedMemoryStructs(); +#endif } /* @@ -806,6 +843,10 @@ ProcKill(int code, Datum arg) Assert(MyProc != NULL); + /* not safe if forked by system(), etc. */ + if (MyProc->pid != (int) getpid()) + elog(PANIC, "ProcKill() called in child process"); + /* Make sure we're out of the sync rep lists */ SyncRepCleanupAtProcExit(); @@ -875,8 +916,14 @@ ProcKill(int code, Datum arg) proc = MyProc; MyProc = NULL; + MyProcNumber = INVALID_PROC_NUMBER; DisownLatch(&proc->procLatch); + /* Mark the proc no longer in use */ + proc->pid = 0; + proc->vxid.procNumber = INVALID_PROC_NUMBER; + proc->vxid.lxid = InvalidTransactionId; + procgloballist = proc->procgloballist; SpinLockAcquire(ProcStructLock); @@ -903,8 +950,12 @@ ProcKill(int code, Datum arg) * This process is no longer present in shared memory in any meaningful * way, so tell the postmaster we've cleaned up acceptably well. (XXX * autovac launcher should be included here someday) + * + * Slot sync worker is also not a postmaster child, so skip this shared + * memory related processing here. */ - if (IsUnderPostmaster && !IsAutoVacuumLauncherProcess()) + if (IsUnderPostmaster && !AmAutoVacuumLauncherProcess() && + !AmLogicalSlotSyncWorkerProcess()) MarkPostmasterChildInactive(); /* wake autovac launcher if needed -- see comments in FreeWorkerInfo */ @@ -926,6 +977,10 @@ AuxiliaryProcKill(int code, Datum arg) Assert(proctype >= 0 && proctype < NUM_AUXILIARY_PROCS); + /* not safe if forked by system(), etc. */ + if (MyProc->pid != (int) getpid()) + elog(PANIC, "AuxiliaryProcKill() called in child process"); + auxproc = &AuxiliaryProcs[proctype]; Assert(MyProc == auxproc); @@ -942,12 +997,15 @@ AuxiliaryProcKill(int code, Datum arg) proc = MyProc; MyProc = NULL; + MyProcNumber = INVALID_PROC_NUMBER; DisownLatch(&proc->procLatch); SpinLockAcquire(ProcStructLock); /* Mark auxiliary proc no longer in use */ proc->pid = 0; + proc->vxid.procNumber = INVALID_PROC_NUMBER; + proc->vxid.lxid = InvalidTransactionId; /* Update shared estimate of spins_per_delay */ ProcGlobal->spins_per_delay = update_spins_per_delay(ProcGlobal->spins_per_delay); @@ -990,10 +1048,19 @@ AuxiliaryPidGetProc(int pid) * Caller must have set MyProc->heldLocks to reflect locks already held * on the lockable object by this process (under all XIDs). * + * It's not actually guaranteed that we need to wait when this function is + * called, because it could be that when we try to find a position at which + * to insert ourself into the wait queue, we discover that we must be inserted + * ahead of everyone who wants a lock that conflict with ours. In that case, + * we get the lock immediately. Because of this, it's sensible for this function + * to have a dontWait argument, despite the name. + * * The lock table's partition lock must be held at entry, and will be held * at exit. * - * Result: PROC_WAIT_STATUS_OK if we acquired the lock, PROC_WAIT_STATUS_ERROR if not (deadlock). + * Result: PROC_WAIT_STATUS_OK if we acquired the lock, PROC_WAIT_STATUS_ERROR + * if not (if dontWait = true, we would have had to wait; if dontWait = false, + * this is a deadlock). * * ASSUME: that no one will fiddle with the queue until after * we release the partition lock. @@ -1001,7 +1068,7 @@ AuxiliaryPidGetProc(int pid) * NOTES: The process queue is now a priority queue for locking. */ ProcWaitStatus -ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable) +ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable, bool dontWait) { LOCKMODE lockmode = locallock->tag.mode; LOCK *lock = locallock->lock; @@ -1021,12 +1088,12 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable) /* * If group locking is in use, locks held by members of my locking group * need to be included in myHeldLocks. This is not required for relation - * extension or page locks which conflict among group members. However, - * including them in myHeldLocks will give group members the priority to - * get those locks as compared to other backends which are also trying to - * acquire those locks. OTOH, we can avoid giving priority to group - * members for that kind of locks, but there doesn't appear to be a clear - * advantage of the same. + * extension lock which conflict among group members. However, including + * them in myHeldLocks will give group members the priority to get those + * locks as compared to other backends which are also trying to acquire + * those locks. OTOH, we can avoid giving priority to group members for + * that kind of locks, but there doesn't appear to be a clear advantage of + * the same. */ if (leader != NULL) { @@ -1114,6 +1181,13 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable) } } + /* + * At this point we know that we'd really need to sleep. If we've been + * commanded not to do that, bail out. + */ + if (dontWait) + return PROC_WAIT_STATUS_ERROR; + /* * Insert self into queue, at the position determined above. */ @@ -1318,7 +1392,7 @@ ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable) * coding means that there is a tiny chance that the process * terminates its current transaction and starts a different one * before we have a change to send the signal; the worst possible - * consequence is that a for-wraparound vacuum is cancelled. But + * consequence is that a for-wraparound vacuum is canceled. But * that could happen in any case unless we were to do kill() with * the lock held, which is much more undesirable. */ @@ -1803,15 +1877,15 @@ ProcWaitForSignal(uint32 wait_event_info) } /* - * ProcSendSignal - set the latch of a backend identified by pgprocno + * ProcSendSignal - set the latch of a backend identified by ProcNumber */ void -ProcSendSignal(int pgprocno) +ProcSendSignal(ProcNumber procNumber) { - if (pgprocno < 0 || pgprocno >= ProcGlobal->allProcCount) - elog(ERROR, "pgprocno out of range"); + if (procNumber < 0 || procNumber >= ProcGlobal->allProcCount) + elog(ERROR, "procNumber out of range"); - SetLatch(&ProcGlobal->allProcs[pgprocno].procLatch); + SetLatch(&ProcGlobal->allProcs[procNumber].procLatch); } /* @@ -1867,10 +1941,9 @@ BecomeLockGroupMember(PGPROC *leader, int pid) /* * Get lock protecting the group fields. Note LockHashPartitionLockByProc - * accesses leader->pgprocno in a PGPROC that might be free. This is safe - * because all PGPROCs' pgprocno fields are set during shared memory - * initialization and never change thereafter; so we will acquire the - * correct lock even if the leader PGPROC is in process of being recycled. + * calculates the proc number based on the PGPROC slot without looking at + * its contents, so we will acquire the correct lock even if the leader + * PGPROC is in process of being recycled. */ leader_lwlock = LockHashPartitionLockByProc(leader); LWLockAcquire(leader_lwlock, LW_EXCLUSIVE); diff --git a/src/backend/storage/lmgr/s_lock.c b/src/backend/storage/lmgr/s_lock.c index 327ac64f7c20b..9b389d9951248 100644 --- a/src/backend/storage/lmgr/s_lock.c +++ b/src/backend/storage/lmgr/s_lock.c @@ -36,7 +36,7 @@ * the probability of unintended failure) than to fix the total time * spent. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -61,8 +61,14 @@ #define MIN_DELAY_USEC 1000L #define MAX_DELAY_USEC 1000000L - -slock_t dummy_spinlock; +#ifdef S_LOCK_TEST +/* + * These are needed by pgstat_report_wait_start in the standalone compile of + * s_lock_test. + */ +static uint32 local_my_wait_event_info; +uint32 *my_wait_event_info = &local_my_wait_event_info; +#endif static int spins_per_delay = DEFAULT_SPINS_PER_DELAY; diff --git a/src/backend/storage/lmgr/spin.c b/src/backend/storage/lmgr/spin.c index 6052779d9cc8b..50cb99cd3b67f 100644 --- a/src/backend/storage/lmgr/spin.c +++ b/src/backend/storage/lmgr/spin.c @@ -11,7 +11,7 @@ * is too slow to be very useful :-( * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/storage/meson.build b/src/backend/storage/meson.build index 6ea9faa4399eb..739d13293fb0e 100644 --- a/src/backend/storage/meson.build +++ b/src/backend/storage/meson.build @@ -1,5 +1,6 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group +subdir('aio') subdir('buffer') subdir('file') subdir('freespace') diff --git a/src/backend/storage/page/bufpage.c b/src/backend/storage/page/bufpage.c index 9a302ddc30e55..be6f1f62d292f 100644 --- a/src/backend/storage/page/bufpage.c +++ b/src/backend/storage/page/bufpage.c @@ -3,7 +3,7 @@ * bufpage.c * POSTGRES standard buffer page code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/storage/page/checksum.c b/src/backend/storage/page/checksum.c index 81fd51929e345..243878fe9e06f 100644 --- a/src/backend/storage/page/checksum.c +++ b/src/backend/storage/page/checksum.c @@ -3,7 +3,7 @@ * checksum.c * Checksum implementation for data pages. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/storage/page/itemptr.c b/src/backend/storage/page/itemptr.c index 2c25ad52d4e5f..af21170307934 100644 --- a/src/backend/storage/page/itemptr.c +++ b/src/backend/storage/page/itemptr.c @@ -3,7 +3,7 @@ * itemptr.c * POSTGRES disk item pointer code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/storage/page/meson.build b/src/backend/storage/page/meson.build index 2160a3732b1fd..8caba30bad7aa 100644 --- a/src/backend/storage/page/meson.build +++ b/src/backend/storage/page/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'bufpage.c', diff --git a/src/backend/storage/smgr/Makefile b/src/backend/storage/smgr/Makefile index 596b564656fa2..1d0b98764f9b0 100644 --- a/src/backend/storage/smgr/Makefile +++ b/src/backend/storage/smgr/Makefile @@ -13,6 +13,7 @@ top_builddir = ../../../.. include $(top_builddir)/src/Makefile.global OBJS = \ + bulk_write.o \ md.o \ smgr.o diff --git a/src/backend/storage/smgr/bulk_write.c b/src/backend/storage/smgr/bulk_write.c new file mode 100644 index 0000000000000..ce7a62c580d0a --- /dev/null +++ b/src/backend/storage/smgr/bulk_write.c @@ -0,0 +1,351 @@ +/*------------------------------------------------------------------------- + * + * bulk_write.c + * Efficiently and reliably populate a new relation + * + * The assumption is that no other backends access the relation while we are + * loading it, so we can take some shortcuts. Pages already present in the + * indicated fork when the bulk write operation is started are not modified + * unless explicitly written to. Do not mix operations through the regular + * buffer manager and the bulk loading interface! + * + * We bypass the buffer manager to avoid the locking overhead, and call + * smgrextend() directly. A downside is that the pages will need to be + * re-read into shared buffers on first use after the build finishes. That's + * usually a good tradeoff for large relations, and for small relations, the + * overhead isn't very significant compared to creating the relation in the + * first place. + * + * The pages are WAL-logged if needed. To save on WAL header overhead, we + * WAL-log several pages in one record. + * + * One tricky point is that because we bypass the buffer manager, we need to + * register the relation for fsyncing at the next checkpoint ourselves, and + * make sure that the relation is correctly fsync'd by us or the checkpointer + * even if a checkpoint happens concurrently. + * + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/storage/smgr/bulk_write.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/xloginsert.h" +#include "access/xlogrecord.h" +#include "storage/bufmgr.h" +#include "storage/bufpage.h" +#include "storage/bulk_write.h" +#include "storage/proc.h" +#include "storage/smgr.h" +#include "utils/rel.h" + +#define MAX_PENDING_WRITES XLR_MAX_BLOCK_ID + +static const PGIOAlignedBlock zero_buffer = {{0}}; /* worth BLCKSZ */ + +typedef struct PendingWrite +{ + BulkWriteBuffer buf; + BlockNumber blkno; + bool page_std; +} PendingWrite; + +/* + * Bulk writer state for one relation fork. + */ +struct BulkWriteState +{ + /* Information about the target relation we're writing */ + SMgrRelation smgr; + ForkNumber forknum; + bool use_wal; + + /* We keep several writes queued, and WAL-log them in batches */ + int npending; + PendingWrite pending_writes[MAX_PENDING_WRITES]; + + /* Current size of the relation */ + BlockNumber relsize; + + /* The RedoRecPtr at the time that the bulk operation started */ + XLogRecPtr start_RedoRecPtr; + + MemoryContext memcxt; +}; + +static void smgr_bulk_flush(BulkWriteState *bulkstate); + +/* + * Start a bulk write operation on a relation fork. + */ +BulkWriteState * +smgr_bulk_start_rel(Relation rel, ForkNumber forknum) +{ + return smgr_bulk_start_smgr(RelationGetSmgr(rel), + forknum, + RelationNeedsWAL(rel) || forknum == INIT_FORKNUM); +} + +/* + * Start a bulk write operation on a relation fork. + * + * This is like smgr_bulk_start_rel, but can be used without a relcache entry. + */ +BulkWriteState * +smgr_bulk_start_smgr(SMgrRelation smgr, ForkNumber forknum, bool use_wal) +{ + BulkWriteState *state; + + state = palloc(sizeof(BulkWriteState)); + state->smgr = smgr; + state->forknum = forknum; + state->use_wal = use_wal; + + state->npending = 0; + state->relsize = smgrnblocks(smgr, forknum); + + state->start_RedoRecPtr = GetRedoRecPtr(); + + /* + * Remember the memory context. We will use it to allocate all the + * buffers later. + */ + state->memcxt = CurrentMemoryContext; + + return state; +} + +/* + * Finish bulk write operation. + * + * This WAL-logs and flushes any remaining pending writes to disk, and fsyncs + * the relation if needed. + */ +void +smgr_bulk_finish(BulkWriteState *bulkstate) +{ + /* WAL-log and flush any remaining pages */ + smgr_bulk_flush(bulkstate); + + /* + * Fsync the relation, or register it for the next checkpoint, if + * necessary. + */ + if (SmgrIsTemp(bulkstate->smgr)) + { + /* Temporary relations don't need to be fsync'd, ever */ + } + else if (!bulkstate->use_wal) + { + /*---------- + * This is either an unlogged relation, or a permanent relation but we + * skipped WAL-logging because wal_level=minimal: + * + * A) Unlogged relation + * + * Unlogged relations will go away on crash, but they need to be + * fsync'd on a clean shutdown. It's sufficient to call + * smgrregistersync(), that ensures that the checkpointer will + * flush it at the shutdown checkpoint. (It will flush it on the + * next online checkpoint too, which is not strictly necessary.) + * + * Note that the init-fork of an unlogged relation is not + * considered unlogged for our purposes. It's treated like a + * regular permanent relation. The callers will pass use_wal=true + * for the init fork. + * + * B) Permanent relation, WAL-logging skipped because wal_level=minimal + * + * This is a new relation, and we didn't WAL-log the pages as we + * wrote, but they need to be fsync'd before commit. + * + * We don't need to do that here, however. The fsync() is done at + * commit, by smgrDoPendingSyncs() (*). + * + * (*) smgrDoPendingSyncs() might decide to WAL-log the whole + * relation at commit instead of fsyncing it, if the relation was + * very small, but it's smgrDoPendingSyncs() responsibility in any + * case. + * + * We cannot distinguish the two here, so conservatively assume it's + * an unlogged relation. A permanent relation with wal_level=minimal + * would require no actions, see above. + */ + smgrregistersync(bulkstate->smgr, bulkstate->forknum); + } + else + { + /* + * Permanent relation, WAL-logged normally. + * + * We already WAL-logged all the pages, so they will be replayed from + * WAL on crash. However, when we wrote out the pages, we passed + * skipFsync=true to avoid the overhead of registering all the writes + * with the checkpointer. Register the whole relation now. + * + * There is one hole in that idea: If a checkpoint occurred while we + * were writing the pages, it already missed fsyncing the pages we had + * written before the checkpoint started. A crash later on would + * replay the WAL starting from the checkpoint, therefore it wouldn't + * replay our earlier WAL records. So if a checkpoint started after + * the bulk write, fsync the files now. + */ + + /* + * Prevent a checkpoint from starting between the GetRedoRecPtr() and + * smgrregistersync() calls. + */ + Assert((MyProc->delayChkptFlags & DELAY_CHKPT_START) == 0); + MyProc->delayChkptFlags |= DELAY_CHKPT_START; + + if (bulkstate->start_RedoRecPtr != GetRedoRecPtr()) + { + /* + * A checkpoint occurred and it didn't know about our writes, so + * fsync() the relation ourselves. + */ + MyProc->delayChkptFlags &= ~DELAY_CHKPT_START; + smgrimmedsync(bulkstate->smgr, bulkstate->forknum); + elog(DEBUG1, "flushed relation because a checkpoint occurred concurrently"); + } + else + { + smgrregistersync(bulkstate->smgr, bulkstate->forknum); + MyProc->delayChkptFlags &= ~DELAY_CHKPT_START; + } + } +} + +static int +buffer_cmp(const void *a, const void *b) +{ + const PendingWrite *bufa = (const PendingWrite *) a; + const PendingWrite *bufb = (const PendingWrite *) b; + + /* We should not see duplicated writes for the same block */ + Assert(bufa->blkno != bufb->blkno); + if (bufa->blkno > bufb->blkno) + return 1; + else + return -1; +} + +/* + * Finish all the pending writes. + */ +static void +smgr_bulk_flush(BulkWriteState *bulkstate) +{ + int npending = bulkstate->npending; + PendingWrite *pending_writes = bulkstate->pending_writes; + + if (npending == 0) + return; + + if (npending > 1) + qsort(pending_writes, npending, sizeof(PendingWrite), buffer_cmp); + + if (bulkstate->use_wal) + { + BlockNumber blknos[MAX_PENDING_WRITES]; + Page pages[MAX_PENDING_WRITES]; + bool page_std = true; + + for (int i = 0; i < npending; i++) + { + blknos[i] = pending_writes[i].blkno; + pages[i] = pending_writes[i].buf->data; + + /* + * If any of the pages use !page_std, we log them all as such. + * That's a bit wasteful, but in practice, a mix of standard and + * non-standard page layout is rare. None of the built-in AMs do + * that. + */ + if (!pending_writes[i].page_std) + page_std = false; + } + log_newpages(&bulkstate->smgr->smgr_rlocator.locator, bulkstate->forknum, + npending, blknos, pages, page_std); + } + + for (int i = 0; i < npending; i++) + { + BlockNumber blkno = pending_writes[i].blkno; + Page page = pending_writes[i].buf->data; + + PageSetChecksumInplace(page, blkno); + + if (blkno >= bulkstate->relsize) + { + /* + * If we have to write pages nonsequentially, fill in the space + * with zeroes until we come back and overwrite. This is not + * logically necessary on standard Unix filesystems (unwritten + * space will read as zeroes anyway), but it should help to avoid + * fragmentation. The dummy pages aren't WAL-logged though. + */ + while (blkno > bulkstate->relsize) + { + /* don't set checksum for all-zero page */ + smgrextend(bulkstate->smgr, bulkstate->forknum, + bulkstate->relsize, + &zero_buffer, + true); + bulkstate->relsize++; + } + + smgrextend(bulkstate->smgr, bulkstate->forknum, blkno, page, true); + bulkstate->relsize++; + } + else + smgrwrite(bulkstate->smgr, bulkstate->forknum, blkno, page, true); + pfree(page); + } + + bulkstate->npending = 0; +} + +/* + * Queue write of 'buf'. + * + * NB: this takes ownership of 'buf'! + * + * You are only allowed to write a given block once as part of one bulk write + * operation. + */ +void +smgr_bulk_write(BulkWriteState *bulkstate, BlockNumber blocknum, BulkWriteBuffer buf, bool page_std) +{ + PendingWrite *w; + + w = &bulkstate->pending_writes[bulkstate->npending++]; + w->buf = buf; + w->blkno = blocknum; + w->page_std = page_std; + + if (bulkstate->npending == MAX_PENDING_WRITES) + smgr_bulk_flush(bulkstate); +} + +/* + * Allocate a new buffer which can later be written with smgr_bulk_write(). + * + * There is no function to free the buffer. When you pass it to + * smgr_bulk_write(), it takes ownership and frees it when it's no longer + * needed. + * + * This is currently implemented as a simple palloc, but could be implemented + * using a ring buffer or larger chunks in the future, so don't rely on it. + */ +BulkWriteBuffer +smgr_bulk_get_buf(BulkWriteState *bulkstate) +{ + return MemoryContextAllocAligned(bulkstate->memcxt, BLCKSZ, PG_IO_ALIGN_SIZE, 0); +} diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index 30dbc02f823ac..8011f4add7ad6 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -10,7 +10,7 @@ * It doesn't matter whether the bits are on spinning rust or some other * storage technology. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,20 +25,18 @@ #include #include -#include "access/xlog.h" #include "access/xlogutils.h" #include "commands/tablespace.h" +#include "common/file_utils.h" #include "miscadmin.h" #include "pg_trace.h" #include "pgstat.h" -#include "postmaster/bgwriter.h" #include "storage/bufmgr.h" #include "storage/fd.h" #include "storage/md.h" #include "storage/relfilelocator.h" #include "storage/smgr.h" #include "storage/sync.h" -#include "utils/hsearch.h" #include "utils/memutils.h" /* @@ -239,6 +237,9 @@ mdcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo) mdfd = &reln->md_seg_fds[forknum][0]; mdfd->mdfd_vfd = fd; mdfd->mdfd_segno = 0; + + if (!SmgrIsTemp(reln)) + register_dirty_segment(reln, forknum, mdfd); } /* @@ -707,165 +708,318 @@ mdclose(SMgrRelation reln, ForkNumber forknum) } /* - * mdprefetch() -- Initiate asynchronous read of the specified block of a relation + * mdprefetch() -- Initiate asynchronous read of the specified blocks of a relation */ bool -mdprefetch(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum) +mdprefetch(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, + int nblocks) { #ifdef USE_PREFETCH - off_t seekpos; - MdfdVec *v; Assert((io_direct_flags & IO_DIRECT_DATA) == 0); - v = _mdfd_getseg(reln, forknum, blocknum, false, - InRecovery ? EXTENSION_RETURN_NULL : EXTENSION_FAIL); - if (v == NULL) + if ((uint64) blocknum + nblocks > (uint64) MaxBlockNumber + 1) return false; - seekpos = (off_t) BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE)); + while (nblocks > 0) + { + off_t seekpos; + MdfdVec *v; + int nblocks_this_segment; - Assert(seekpos < (off_t) BLCKSZ * RELSEG_SIZE); + v = _mdfd_getseg(reln, forknum, blocknum, false, + InRecovery ? EXTENSION_RETURN_NULL : EXTENSION_FAIL); + if (v == NULL) + return false; - (void) FilePrefetch(v->mdfd_vfd, seekpos, BLCKSZ, WAIT_EVENT_DATA_FILE_PREFETCH); + seekpos = (off_t) BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE)); + + Assert(seekpos < (off_t) BLCKSZ * RELSEG_SIZE); + + nblocks_this_segment = + Min(nblocks, + RELSEG_SIZE - (blocknum % ((BlockNumber) RELSEG_SIZE))); + + (void) FilePrefetch(v->mdfd_vfd, seekpos, BLCKSZ * nblocks_this_segment, + WAIT_EVENT_DATA_FILE_PREFETCH); + + blocknum += nblocks_this_segment; + nblocks -= nblocks_this_segment; + } #endif /* USE_PREFETCH */ return true; } /* - * mdread() -- Read the specified block from a relation. + * Convert an array of buffer address into an array of iovec objects, and + * return the number that were required. 'iov' must have enough space for up + * to 'nblocks' elements, but the number used may be less depending on + * merging. In the case of a run of fully contiguous buffers, a single iovec + * will be populated that can be handled as a plain non-vectored I/O. */ -void -mdread(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, - void *buffer) +static int +buffers_to_iovec(struct iovec *iov, void **buffers, int nblocks) { - off_t seekpos; - int nbytes; - MdfdVec *v; + struct iovec *iovp; + int iovcnt; - /* If this build supports direct I/O, the buffer must be I/O aligned. */ - if (PG_O_DIRECT != 0 && PG_IO_ALIGN_SIZE <= BLCKSZ) - Assert((uintptr_t) buffer == TYPEALIGN(PG_IO_ALIGN_SIZE, buffer)); + Assert(nblocks >= 1); - TRACE_POSTGRESQL_SMGR_MD_READ_START(forknum, blocknum, - reln->smgr_rlocator.locator.spcOid, - reln->smgr_rlocator.locator.dbOid, - reln->smgr_rlocator.locator.relNumber, - reln->smgr_rlocator.backend); + /* If this build supports direct I/O, buffers must be I/O aligned. */ + for (int i = 0; i < nblocks; ++i) + { + if (PG_O_DIRECT != 0 && PG_IO_ALIGN_SIZE <= BLCKSZ) + Assert((uintptr_t) buffers[i] == + TYPEALIGN(PG_IO_ALIGN_SIZE, buffers[i])); + } - v = _mdfd_getseg(reln, forknum, blocknum, false, - EXTENSION_FAIL | EXTENSION_CREATE_RECOVERY); + /* Start the first iovec off with the first buffer. */ + iovp = &iov[0]; + iovp->iov_base = buffers[0]; + iovp->iov_len = BLCKSZ; + iovcnt = 1; - seekpos = (off_t) BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE)); - - Assert(seekpos < (off_t) BLCKSZ * RELSEG_SIZE); + /* Try to merge the rest. */ + for (int i = 1; i < nblocks; ++i) + { + void *buffer = buffers[i]; - nbytes = FileRead(v->mdfd_vfd, buffer, BLCKSZ, seekpos, WAIT_EVENT_DATA_FILE_READ); + if (((char *) iovp->iov_base + iovp->iov_len) == buffer) + { + /* Contiguous with the last iovec. */ + iovp->iov_len += BLCKSZ; + } + else + { + /* Need a new iovec. */ + iovp++; + iovp->iov_base = buffer; + iovp->iov_len = BLCKSZ; + iovcnt++; + } + } - TRACE_POSTGRESQL_SMGR_MD_READ_DONE(forknum, blocknum, - reln->smgr_rlocator.locator.spcOid, - reln->smgr_rlocator.locator.dbOid, - reln->smgr_rlocator.locator.relNumber, - reln->smgr_rlocator.backend, - nbytes, - BLCKSZ); + return iovcnt; +} - if (nbytes != BLCKSZ) +/* + * mdreadv() -- Read the specified blocks from a relation. + */ +void +mdreadv(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, + void **buffers, BlockNumber nblocks) +{ + while (nblocks > 0) { - if (nbytes < 0) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not read block %u in file \"%s\": %m", - blocknum, FilePathName(v->mdfd_vfd)))); + struct iovec iov[PG_IOV_MAX]; + int iovcnt; + off_t seekpos; + int nbytes; + MdfdVec *v; + BlockNumber nblocks_this_segment; + size_t transferred_this_segment; + size_t size_this_segment; + + v = _mdfd_getseg(reln, forknum, blocknum, false, + EXTENSION_FAIL | EXTENSION_CREATE_RECOVERY); + + seekpos = (off_t) BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE)); + + Assert(seekpos < (off_t) BLCKSZ * RELSEG_SIZE); + + nblocks_this_segment = + Min(nblocks, + RELSEG_SIZE - (blocknum % ((BlockNumber) RELSEG_SIZE))); + nblocks_this_segment = Min(nblocks_this_segment, lengthof(iov)); + + iovcnt = buffers_to_iovec(iov, buffers, nblocks_this_segment); + size_this_segment = nblocks_this_segment * BLCKSZ; + transferred_this_segment = 0; /* - * Short read: we are at or past EOF, or we read a partial block at - * EOF. Normally this is an error; upper levels should never try to - * read a nonexistent block. However, if zero_damaged_pages is ON or - * we are InRecovery, we should instead return zeroes without - * complaining. This allows, for example, the case of trying to - * update a block that was later truncated away. + * Inner loop to continue after a short read. We'll keep going until + * we hit EOF rather than assuming that a short read means we hit the + * end. */ - if (zero_damaged_pages || InRecovery) - MemSet(buffer, 0, BLCKSZ); - else - ereport(ERROR, - (errcode(ERRCODE_DATA_CORRUPTED), - errmsg("could not read block %u in file \"%s\": read only %d of %d bytes", - blocknum, FilePathName(v->mdfd_vfd), - nbytes, BLCKSZ))); + for (;;) + { + TRACE_POSTGRESQL_SMGR_MD_READ_START(forknum, blocknum, + reln->smgr_rlocator.locator.spcOid, + reln->smgr_rlocator.locator.dbOid, + reln->smgr_rlocator.locator.relNumber, + reln->smgr_rlocator.backend); + nbytes = FileReadV(v->mdfd_vfd, iov, iovcnt, seekpos, + WAIT_EVENT_DATA_FILE_READ); + TRACE_POSTGRESQL_SMGR_MD_READ_DONE(forknum, blocknum, + reln->smgr_rlocator.locator.spcOid, + reln->smgr_rlocator.locator.dbOid, + reln->smgr_rlocator.locator.relNumber, + reln->smgr_rlocator.backend, + nbytes, + size_this_segment - transferred_this_segment); + +#ifdef SIMULATE_SHORT_READ + nbytes = Min(nbytes, 4096); +#endif + + if (nbytes < 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not read blocks %u..%u in file \"%s\": %m", + blocknum, + blocknum + nblocks_this_segment - 1, + FilePathName(v->mdfd_vfd)))); + + if (nbytes == 0) + { + /* + * We are at or past EOF, or we read a partial block at EOF. + * Normally this is an error; upper levels should never try to + * read a nonexistent block. However, if zero_damaged_pages + * is ON or we are InRecovery, we should instead return zeroes + * without complaining. This allows, for example, the case of + * trying to update a block that was later truncated away. + */ + if (zero_damaged_pages || InRecovery) + { + for (BlockNumber i = transferred_this_segment / BLCKSZ; + i < nblocks_this_segment; + ++i) + memset(buffers[i], 0, BLCKSZ); + break; + } + else + ereport(ERROR, + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read blocks %u..%u in file \"%s\": read only %zu of %zu bytes", + blocknum, + blocknum + nblocks_this_segment - 1, + FilePathName(v->mdfd_vfd), + transferred_this_segment, + size_this_segment))); + } + + /* One loop should usually be enough. */ + transferred_this_segment += nbytes; + Assert(transferred_this_segment <= size_this_segment); + if (transferred_this_segment == size_this_segment) + break; + + /* Adjust position and vectors after a short read. */ + seekpos += nbytes; + iovcnt = compute_remaining_iovec(iov, iov, iovcnt, nbytes); + } + + nblocks -= nblocks_this_segment; + buffers += nblocks_this_segment; + blocknum += nblocks_this_segment; } } /* - * mdwrite() -- Write the supplied block at the appropriate location. + * mdwritev() -- Write the supplied blocks at the appropriate location. * * This is to be used only for updating already-existing blocks of a * relation (ie, those before the current EOF). To extend a relation, * use mdextend(). */ void -mdwrite(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, - const void *buffer, bool skipFsync) +mdwritev(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, + const void **buffers, BlockNumber nblocks, bool skipFsync) { - off_t seekpos; - int nbytes; - MdfdVec *v; - - /* If this build supports direct I/O, the buffer must be I/O aligned. */ - if (PG_O_DIRECT != 0 && PG_IO_ALIGN_SIZE <= BLCKSZ) - Assert((uintptr_t) buffer == TYPEALIGN(PG_IO_ALIGN_SIZE, buffer)); - /* This assert is too expensive to have on normally ... */ #ifdef CHECK_WRITE_VS_EXTEND - Assert(blocknum < mdnblocks(reln, forknum)); + Assert((uint64) blocknum + (uint64) nblocks <= (uint64) mdnblocks(reln, forknum)); #endif - TRACE_POSTGRESQL_SMGR_MD_WRITE_START(forknum, blocknum, - reln->smgr_rlocator.locator.spcOid, - reln->smgr_rlocator.locator.dbOid, - reln->smgr_rlocator.locator.relNumber, - reln->smgr_rlocator.backend); + while (nblocks > 0) + { + struct iovec iov[PG_IOV_MAX]; + int iovcnt; + off_t seekpos; + int nbytes; + MdfdVec *v; + BlockNumber nblocks_this_segment; + size_t transferred_this_segment; + size_t size_this_segment; - v = _mdfd_getseg(reln, forknum, blocknum, skipFsync, - EXTENSION_FAIL | EXTENSION_CREATE_RECOVERY); + v = _mdfd_getseg(reln, forknum, blocknum, skipFsync, + EXTENSION_FAIL | EXTENSION_CREATE_RECOVERY); - seekpos = (off_t) BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE)); + seekpos = (off_t) BLCKSZ * (blocknum % ((BlockNumber) RELSEG_SIZE)); - Assert(seekpos < (off_t) BLCKSZ * RELSEG_SIZE); + Assert(seekpos < (off_t) BLCKSZ * RELSEG_SIZE); - nbytes = FileWrite(v->mdfd_vfd, buffer, BLCKSZ, seekpos, WAIT_EVENT_DATA_FILE_WRITE); + nblocks_this_segment = + Min(nblocks, + RELSEG_SIZE - (blocknum % ((BlockNumber) RELSEG_SIZE))); + nblocks_this_segment = Min(nblocks_this_segment, lengthof(iov)); - TRACE_POSTGRESQL_SMGR_MD_WRITE_DONE(forknum, blocknum, - reln->smgr_rlocator.locator.spcOid, - reln->smgr_rlocator.locator.dbOid, - reln->smgr_rlocator.locator.relNumber, - reln->smgr_rlocator.backend, - nbytes, - BLCKSZ); + iovcnt = buffers_to_iovec(iov, (void **) buffers, nblocks_this_segment); + size_this_segment = nblocks_this_segment * BLCKSZ; + transferred_this_segment = 0; - if (nbytes != BLCKSZ) - { - if (nbytes < 0) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not write block %u in file \"%s\": %m", - blocknum, FilePathName(v->mdfd_vfd)))); - /* short write: complain appropriately */ - ereport(ERROR, - (errcode(ERRCODE_DISK_FULL), - errmsg("could not write block %u in file \"%s\": wrote only %d of %d bytes", - blocknum, - FilePathName(v->mdfd_vfd), - nbytes, BLCKSZ), - errhint("Check free disk space."))); - } + /* + * Inner loop to continue after a short write. If the reason is that + * we're out of disk space, a future attempt should get an ENOSPC + * error from the kernel. + */ + for (;;) + { + TRACE_POSTGRESQL_SMGR_MD_WRITE_START(forknum, blocknum, + reln->smgr_rlocator.locator.spcOid, + reln->smgr_rlocator.locator.dbOid, + reln->smgr_rlocator.locator.relNumber, + reln->smgr_rlocator.backend); + nbytes = FileWriteV(v->mdfd_vfd, iov, iovcnt, seekpos, + WAIT_EVENT_DATA_FILE_WRITE); + TRACE_POSTGRESQL_SMGR_MD_WRITE_DONE(forknum, blocknum, + reln->smgr_rlocator.locator.spcOid, + reln->smgr_rlocator.locator.dbOid, + reln->smgr_rlocator.locator.relNumber, + reln->smgr_rlocator.backend, + nbytes, + size_this_segment - transferred_this_segment); + +#ifdef SIMULATE_SHORT_WRITE + nbytes = Min(nbytes, 4096); +#endif - if (!skipFsync && !SmgrIsTemp(reln)) - register_dirty_segment(reln, forknum, v); + if (nbytes < 0) + { + bool enospc = errno == ENOSPC; + + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not write blocks %u..%u in file \"%s\": %m", + blocknum, + blocknum + nblocks_this_segment - 1, + FilePathName(v->mdfd_vfd)), + enospc ? errhint("Check free disk space.") : 0)); + } + + /* One loop should usually be enough. */ + transferred_this_segment += nbytes; + Assert(transferred_this_segment <= size_this_segment); + if (transferred_this_segment == size_this_segment) + break; + + /* Adjust position and iovecs after a short write. */ + seekpos += nbytes; + iovcnt = compute_remaining_iovec(iov, iov, iovcnt, nbytes); + } + + if (!skipFsync && !SmgrIsTemp(reln)) + register_dirty_segment(reln, forknum, v); + + nblocks -= nblocks_this_segment; + buffers += nblocks_this_segment; + blocknum += nblocks_this_segment; + } } + /* * mdwriteback() -- Tell the kernel to write pages back to storage. * @@ -987,19 +1141,21 @@ mdnblocks(SMgrRelation reln, ForkNumber forknum) /* * mdtruncate() -- Truncate relation to specified number of blocks. + * + * Guaranteed not to allocate memory, so it can be used in a critical section. + * Caller must have called smgrnblocks() to obtain curnblk while holding a + * sufficient lock to prevent a change in relation size, and not used any smgr + * functions for this relation or handled interrupts in between. This makes + * sure we have opened all active segments, so that truncate loop will get + * them all! */ void -mdtruncate(SMgrRelation reln, ForkNumber forknum, BlockNumber nblocks) +mdtruncate(SMgrRelation reln, ForkNumber forknum, + BlockNumber curnblk, BlockNumber nblocks) { - BlockNumber curnblk; BlockNumber priorblocks; int curopensegs; - /* - * NOTE: mdnblocks makes sure we have opened all active segments, so that - * truncation loop will get them all! - */ - curnblk = mdnblocks(reln, forknum); if (nblocks > curnblk) { /* Bogus request ... but no complaint if InRecovery */ @@ -1079,6 +1235,49 @@ mdtruncate(SMgrRelation reln, ForkNumber forknum, BlockNumber nblocks) } } +/* + * mdregistersync() -- Mark whole relation as needing fsync + */ +void +mdregistersync(SMgrRelation reln, ForkNumber forknum) +{ + int segno; + int min_inactive_seg; + + /* + * NOTE: mdnblocks makes sure we have opened all active segments, so that + * the loop below will get them all! + */ + mdnblocks(reln, forknum); + + min_inactive_seg = segno = reln->md_num_open_segs[forknum]; + + /* + * Temporarily open inactive segments, then close them after sync. There + * may be some inactive segments left opened after error, but that is + * harmless. We don't bother to clean them up and take a risk of further + * trouble. The next mdclose() will soon close them. + */ + while (_mdfd_openseg(reln, forknum, segno, 0) != NULL) + segno++; + + while (segno > 0) + { + MdfdVec *v = &reln->md_seg_fds[forknum][segno - 1]; + + register_dirty_segment(reln, forknum, v); + + /* Close inactive segments immediately */ + if (segno > min_inactive_seg) + { + FileClose(v->mdfd_vfd); + _fdvec_resize(reln, forknum, segno - 1); + } + + segno--; + } +} + /* * mdimmedsync() -- Immediately sync a relation to stable storage. * @@ -1098,7 +1297,7 @@ mdimmedsync(SMgrRelation reln, ForkNumber forknum) /* * NOTE: mdnblocks makes sure we have opened all active segments, so that - * fsync loop will get them all! + * the loop below will get them all! */ mdnblocks(reln, forknum); @@ -1169,7 +1368,7 @@ register_dirty_segment(SMgrRelation reln, ForkNumber forknum, MdfdVec *seg) ereport(DEBUG1, (errmsg_internal("could not forward fsync request because request queue is full"))); - io_start = pgstat_prepare_io_time(); + io_start = pgstat_prepare_io_time(track_io_timing); if (FileSync(seg->mdfd_vfd, WAIT_EVENT_DATA_FILE_SYNC) < 0) ereport(data_sync_elevel(ERROR), @@ -1254,7 +1453,7 @@ DropRelationFiles(RelFileLocator *delrels, int ndelrels, bool isRedo) srels = palloc(sizeof(SMgrRelation) * ndelrels); for (i = 0; i < ndelrels; i++) { - SMgrRelation srel = smgropen(delrels[i], InvalidBackendId); + SMgrRelation srel = smgropen(delrels[i], INVALID_PROC_NUMBER); if (isRedo) { @@ -1295,7 +1494,7 @@ _fdvec_resize(SMgrRelation reln, reln->md_seg_fds[forknum] = MemoryContextAlloc(MdCxt, sizeof(MdfdVec) * nseg); } - else + else if (nseg > reln->md_num_open_segs[forknum]) { /* * It doesn't seem worthwhile complicating the code to amortize @@ -1307,6 +1506,16 @@ _fdvec_resize(SMgrRelation reln, repalloc(reln->md_seg_fds[forknum], sizeof(MdfdVec) * nseg); } + else + { + /* + * We don't reallocate a smaller array, because we want mdtruncate() + * to be able to promise that it won't allocate memory, so that it is + * allowed in a critical section. This means that a bit of space in + * the array is now wasted, until the next time we add a segment and + * reallocate. + */ + } reln->md_num_open_segs[forknum] = nseg; } @@ -1538,7 +1747,7 @@ _mdnblocks(SMgrRelation reln, ForkNumber forknum, MdfdVec *seg) int mdsyncfiletag(const FileTag *ftag, char *path) { - SMgrRelation reln = smgropen(ftag->rlocator, InvalidBackendId); + SMgrRelation reln = smgropen(ftag->rlocator, INVALID_PROC_NUMBER); File file; instr_time io_start; bool need_to_close; @@ -1566,7 +1775,7 @@ mdsyncfiletag(const FileTag *ftag, char *path) need_to_close = true; } - io_start = pgstat_prepare_io_time(); + io_start = pgstat_prepare_io_time(track_io_timing); /* Sync the file. */ result = FileSync(file, WAIT_EVENT_DATA_FILE_SYNC); diff --git a/src/backend/storage/smgr/meson.build b/src/backend/storage/smgr/meson.build index e1ba6ed74b80c..6d91b18fe6792 100644 --- a/src/backend/storage/smgr/meson.build +++ b/src/backend/storage/smgr/meson.build @@ -1,6 +1,7 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( + 'bulk_write.c', 'md.c', 'smgr.c', ) diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index f76c4605dbbe3..bfdaac4721d28 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -3,10 +3,44 @@ * smgr.c * public interface routines to storage manager switch. * - * All file system operations in POSTGRES dispatch through these - * routines. - * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * All file system operations on relations dispatch through these routines. + * An SMgrRelation represents physical on-disk relation files that are open + * for reading and writing. + * + * When a relation is first accessed through the relation cache, the + * corresponding SMgrRelation entry is opened by calling smgropen(), and the + * reference is stored in the relation cache entry. + * + * Accesses that don't go through the relation cache open the SMgrRelation + * directly. That includes flushing buffers from the buffer cache, as well as + * all accesses in auxiliary processes like the checkpointer or the WAL redo + * in the startup process. + * + * Operations like CREATE, DROP, ALTER TABLE also hold SMgrRelation references + * independent of the relation cache. They need to prepare the physical files + * before updating the relation cache. + * + * There is a hash table that holds all the SMgrRelation entries in the + * backend. If you call smgropen() twice for the same rel locator, you get a + * reference to the same SMgrRelation. The reference is valid until the end of + * transaction. This makes repeated access to the same relation efficient, + * and allows caching things like the relation size in the SMgrRelation entry. + * + * At end of transaction, all SMgrRelation entries that haven't been pinned + * are removed. An SMgrRelation can hold kernel file system descriptors for + * the underlying files, and we'd like to close those reasonably soon if the + * file gets deleted. The SMgrRelations references held by the relcache are + * pinned to prevent them from being closed. + * + * There is another mechanism to close file descriptors early: + * PROCSIGNAL_BARRIER_SMGRRELEASE. It is a request to immediately close all + * file descriptors. Upon receiving that signal, the backend closes all file + * descriptors held open by SMgrRelations, but because it can happen in the + * middle of a transaction, we cannot destroy the SMgrRelation objects + * themselves, as there could pointers to them in active use. See + * smgrrelease() and smgrreleaseall(). + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -20,7 +54,6 @@ #include "access/xlogutils.h" #include "lib/ilist.h" #include "storage/bufmgr.h" -#include "storage/fd.h" #include "storage/ipc.h" #include "storage/md.h" #include "storage/smgr.h" @@ -54,17 +87,21 @@ typedef struct f_smgr void (*smgr_zeroextend) (SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, int nblocks, bool skipFsync); bool (*smgr_prefetch) (SMgrRelation reln, ForkNumber forknum, - BlockNumber blocknum); - void (*smgr_read) (SMgrRelation reln, ForkNumber forknum, - BlockNumber blocknum, void *buffer); - void (*smgr_write) (SMgrRelation reln, ForkNumber forknum, - BlockNumber blocknum, const void *buffer, bool skipFsync); + BlockNumber blocknum, int nblocks); + void (*smgr_readv) (SMgrRelation reln, ForkNumber forknum, + BlockNumber blocknum, + void **buffers, BlockNumber nblocks); + void (*smgr_writev) (SMgrRelation reln, ForkNumber forknum, + BlockNumber blocknum, + const void **buffers, BlockNumber nblocks, + bool skipFsync); void (*smgr_writeback) (SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, BlockNumber nblocks); BlockNumber (*smgr_nblocks) (SMgrRelation reln, ForkNumber forknum); void (*smgr_truncate) (SMgrRelation reln, ForkNumber forknum, - BlockNumber nblocks); + BlockNumber old_blocks, BlockNumber nblocks); void (*smgr_immedsync) (SMgrRelation reln, ForkNumber forknum); + void (*smgr_registersync) (SMgrRelation reln, ForkNumber forknum); } f_smgr; static const f_smgr smgrsw[] = { @@ -80,12 +117,13 @@ static const f_smgr smgrsw[] = { .smgr_extend = mdextend, .smgr_zeroextend = mdzeroextend, .smgr_prefetch = mdprefetch, - .smgr_read = mdread, - .smgr_write = mdwrite, + .smgr_readv = mdreadv, + .smgr_writev = mdwritev, .smgr_writeback = mdwriteback, .smgr_nblocks = mdnblocks, .smgr_truncate = mdtruncate, .smgr_immedsync = mdimmedsync, + .smgr_registersync = mdregistersync, } }; @@ -93,14 +131,15 @@ static const int NSmgr = lengthof(smgrsw); /* * Each backend has a hashtable that stores all extant SMgrRelation objects. - * In addition, "unowned" SMgrRelation objects are chained together in a list. + * In addition, "unpinned" SMgrRelation objects are chained together in a list. */ static HTAB *SMgrRelationHash = NULL; -static dlist_head unowned_relns; +static dlist_head unpinned_relns; /* local function prototypes */ static void smgrshutdown(int code, Datum arg); +static void smgrdestroy(SMgrRelation reln); /* @@ -144,15 +183,26 @@ smgrshutdown(int code, Datum arg) /* * smgropen() -- Return an SMgrRelation object, creating it if need be. * - * This does not attempt to actually open the underlying file. + * In versions of PostgreSQL prior to 17, this function returned an object + * with no defined lifetime. Now, however, the object remains valid for the + * lifetime of the transaction, up to the point where AtEOXact_SMgr() is + * called, making it much easier for callers to know for how long they can + * hold on to a pointer to the returned object. If this function is called + * outside of a transaction, the object remains valid until smgrdestroy() or + * smgrdestroyall() is called. Background processes that use smgr but not + * transactions typically do this once per checkpoint cycle. + * + * This does not attempt to actually open the underlying files. */ SMgrRelation -smgropen(RelFileLocator rlocator, BackendId backend) +smgropen(RelFileLocator rlocator, ProcNumber backend) { RelFileLocatorBackend brlocator; SMgrRelation reln; bool found; + Assert(RelFileNumberIsValid(rlocator.relNumber)); + if (SMgrRelationHash == NULL) { /* First time through: initialize the hash table */ @@ -162,7 +212,7 @@ smgropen(RelFileLocator rlocator, BackendId backend) ctl.entrysize = sizeof(SMgrRelationData); SMgrRelationHash = hash_create("smgr relation table", 400, &ctl, HASH_ELEM | HASH_BLOBS); - dlist_init(&unowned_relns); + dlist_init(&unpinned_relns); } /* Look up or create an entry */ @@ -176,111 +226,69 @@ smgropen(RelFileLocator rlocator, BackendId backend) if (!found) { /* hash_search already filled in the lookup key */ - reln->smgr_owner = NULL; reln->smgr_targblock = InvalidBlockNumber; for (int i = 0; i <= MAX_FORKNUM; ++i) reln->smgr_cached_nblocks[i] = InvalidBlockNumber; reln->smgr_which = 0; /* we only have md.c at present */ + /* it is not pinned yet */ + reln->pincount = 0; + dlist_push_tail(&unpinned_relns, &reln->node); + /* implementation-specific initialization */ smgrsw[reln->smgr_which].smgr_open(reln); - - /* it has no owner yet */ - dlist_push_tail(&unowned_relns, &reln->node); } return reln; } /* - * smgrsetowner() -- Establish a long-lived reference to an SMgrRelation object - * - * There can be only one owner at a time; this is sufficient since currently - * the only such owners exist in the relcache. + * smgrpin() -- Prevent an SMgrRelation object from being destroyed at end of + * transaction */ void -smgrsetowner(SMgrRelation *owner, SMgrRelation reln) +smgrpin(SMgrRelation reln) { - /* We don't support "disowning" an SMgrRelation here, use smgrclearowner */ - Assert(owner != NULL); - - /* - * First, unhook any old owner. (Normally there shouldn't be any, but it - * seems possible that this can happen during swap_relation_files() - * depending on the order of processing. It's ok to close the old - * relcache entry early in that case.) - * - * If there isn't an old owner, then the reln should be in the unowned - * list, and we need to remove it. - */ - if (reln->smgr_owner) - *(reln->smgr_owner) = NULL; - else + if (reln->pincount == 0) dlist_delete(&reln->node); - - /* Now establish the ownership relationship. */ - reln->smgr_owner = owner; - *owner = reln; + reln->pincount++; } /* - * smgrclearowner() -- Remove long-lived reference to an SMgrRelation object - * if one exists + * smgrunpin() -- Allow an SMgrRelation object to be destroyed at end of + * transaction + * + * The object remains valid, but if there are no other pins on it, it is moved + * to the unpinned list where it will be destroyed by AtEOXact_SMgr(). */ void -smgrclearowner(SMgrRelation *owner, SMgrRelation reln) +smgrunpin(SMgrRelation reln) { - /* Do nothing if the SMgrRelation object is not owned by the owner */ - if (reln->smgr_owner != owner) - return; - - /* unset the owner's reference */ - *owner = NULL; - - /* unset our reference to the owner */ - reln->smgr_owner = NULL; - - /* add to list of unowned relations */ - dlist_push_tail(&unowned_relns, &reln->node); -} - -/* - * smgrexists() -- Does the underlying file for a fork exist? - */ -bool -smgrexists(SMgrRelation reln, ForkNumber forknum) -{ - return smgrsw[reln->smgr_which].smgr_exists(reln, forknum); + Assert(reln->pincount > 0); + reln->pincount--; + if (reln->pincount == 0) + dlist_push_tail(&unpinned_relns, &reln->node); } /* - * smgrclose() -- Close and delete an SMgrRelation object. + * smgrdestroy() -- Delete an SMgrRelation object. */ -void -smgrclose(SMgrRelation reln) +static void +smgrdestroy(SMgrRelation reln) { - SMgrRelation *owner; ForkNumber forknum; + Assert(reln->pincount == 0); + for (forknum = 0; forknum <= MAX_FORKNUM; forknum++) smgrsw[reln->smgr_which].smgr_close(reln, forknum); - owner = reln->smgr_owner; - - if (!owner) - dlist_delete(&reln->node); + dlist_delete(&reln->node); if (hash_search(SMgrRelationHash, &(reln->smgr_rlocator), HASH_REMOVE, NULL) == NULL) elog(ERROR, "SMgrRelation hashtable corrupted"); - - /* - * Unhook the owner pointer, if any. We do this last since in the remote - * possibility of failure above, the SMgrRelation object will still exist. - */ - if (owner) - *owner = NULL; } /* @@ -296,34 +304,53 @@ smgrrelease(SMgrRelation reln) smgrsw[reln->smgr_which].smgr_close(reln, forknum); reln->smgr_cached_nblocks[forknum] = InvalidBlockNumber; } + reln->smgr_targblock = InvalidBlockNumber; } /* - * smgrreleaseall() -- Release resources used by all objects. + * smgrclose() -- Close an SMgrRelation object. * - * This is called for PROCSIGNAL_BARRIER_SMGRRELEASE. + * The SMgrRelation reference should not be used after this call. However, + * because we don't keep track of the references returned by smgropen(), we + * don't know if there are other references still pointing to the same object, + * so we cannot remove the SMgrRelation object yet. Therefore, this is just a + * synonym for smgrrelease() at the moment. */ void -smgrreleaseall(void) +smgrclose(SMgrRelation reln) { - HASH_SEQ_STATUS status; - SMgrRelation reln; + smgrrelease(reln); +} - /* Nothing to do if hashtable not set up */ - if (SMgrRelationHash == NULL) - return; +/* + * smgrdestroyall() -- Release resources used by all unpinned objects. + * + * It must be known that there are no pointers to SMgrRelations, other than + * those pinned with smgrpin(). + */ +void +smgrdestroyall(void) +{ + dlist_mutable_iter iter; - hash_seq_init(&status, SMgrRelationHash); + /* + * Zap all unpinned SMgrRelations. We rely on smgrdestroy() to remove + * each one from the list. + */ + dlist_foreach_modify(iter, &unpinned_relns) + { + SMgrRelation rel = dlist_container(SMgrRelationData, node, + iter.cur); - while ((reln = (SMgrRelation) hash_seq_search(&status)) != NULL) - smgrrelease(reln); + smgrdestroy(rel); + } } /* - * smgrcloseall() -- Close all existing SMgrRelation objects. + * smgrreleaseall() -- Release resources used by all objects. */ void -smgrcloseall(void) +smgrreleaseall(void) { HASH_SEQ_STATUS status; SMgrRelation reln; @@ -335,19 +362,21 @@ smgrcloseall(void) hash_seq_init(&status, SMgrRelationHash); while ((reln = (SMgrRelation) hash_seq_search(&status)) != NULL) - smgrclose(reln); + { + smgrrelease(reln); + } } /* - * smgrcloserellocator() -- Close SMgrRelation object for given RelFileLocator, - * if one exists. + * smgrreleaserellocator() -- Release resources for given RelFileLocator, if + * it's open. * - * This has the same effects as smgrclose(smgropen(rlocator)), but it avoids + * This has the same effects as smgrrelease(smgropen(rlocator)), but avoids * uselessly creating a hashtable entry only to drop it again when no * such entry exists already. */ void -smgrcloserellocator(RelFileLocatorBackend rlocator) +smgrreleaserellocator(RelFileLocatorBackend rlocator) { SMgrRelation reln; @@ -359,7 +388,16 @@ smgrcloserellocator(RelFileLocatorBackend rlocator) &rlocator, HASH_FIND, NULL); if (reln != NULL) - smgrclose(reln); + smgrrelease(reln); +} + +/* + * smgrexists() -- Does the underlying file for a fork exist? + */ +bool +smgrexists(SMgrRelation reln, ForkNumber forknum) +{ + return smgrsw[reln->smgr_which].smgr_exists(reln, forknum); } /* @@ -544,28 +582,30 @@ smgrzeroextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, * record). */ bool -smgrprefetch(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum) +smgrprefetch(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, + int nblocks) { - return smgrsw[reln->smgr_which].smgr_prefetch(reln, forknum, blocknum); + return smgrsw[reln->smgr_which].smgr_prefetch(reln, forknum, blocknum, nblocks); } /* - * smgrread() -- read a particular block from a relation into the supplied - * buffer. + * smgrreadv() -- read a particular block range from a relation into the + * supplied buffers. * * This routine is called from the buffer manager in order to * instantiate pages in the shared buffer cache. All storage managers * return pages in the format that POSTGRES expects. */ void -smgrread(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, - void *buffer) +smgrreadv(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, + void **buffers, BlockNumber nblocks) { - smgrsw[reln->smgr_which].smgr_read(reln, forknum, blocknum, buffer); + smgrsw[reln->smgr_which].smgr_readv(reln, forknum, blocknum, buffers, + nblocks); } /* - * smgrwrite() -- Write the supplied buffer out. + * smgrwritev() -- Write the supplied buffers out. * * This is to be used only for updating already-existing blocks of a * relation (ie, those before the current EOF). To extend a relation, @@ -575,19 +615,26 @@ smgrread(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, * on disk at return, only dumped out to the kernel. However, * provisions will be made to fsync the write before the next checkpoint. * + * NB: The mechanism to ensure fsync at next checkpoint assumes that there is + * something that prevents a concurrent checkpoint from "racing ahead" of the + * write. One way to prevent that is by holding a lock on the buffer; the + * buffer manager's writes are protected by that. The bulk writer facility + * in bulk_write.c checks the redo pointer and calls smgrimmedsync() if a + * checkpoint happened; that relies on the fact that no other backend can be + * concurrently modifying the page. + * * skipFsync indicates that the caller will make other provisions to * fsync the relation, so we needn't bother. Temporary relations also * do not require fsync. */ void -smgrwrite(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, - const void *buffer, bool skipFsync) +smgrwritev(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, + const void **buffers, BlockNumber nblocks, bool skipFsync) { - smgrsw[reln->smgr_which].smgr_write(reln, forknum, blocknum, - buffer, skipFsync); + smgrsw[reln->smgr_which].smgr_writev(reln, forknum, blocknum, + buffers, nblocks, skipFsync); } - /* * smgrwriteback() -- Trigger kernel writeback for the supplied range of * blocks. @@ -632,8 +679,9 @@ BlockNumber smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum) { /* - * For now, we only use cached values in recovery due to lack of a shared - * invalidation mechanism for changes in file size. + * For now, this function uses cached values only in recovery due to lack + * of a shared invalidation mechanism for changes in file size. Code + * elsewhere reads smgr_cached_nblocks and copes with stale data. */ if (InRecovery && reln->smgr_cached_nblocks[forknum] != InvalidBlockNumber) return reln->smgr_cached_nblocks[forknum]; @@ -645,14 +693,39 @@ smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum) * smgrtruncate() -- Truncate the given forks of supplied relation to * each specified numbers of blocks * + * Backward-compatible version of smgrtruncate2() for the benefit of external + * callers. This version isn't used in PostgreSQL core code, and can't be + * used in a critical section. + */ +void +smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, + BlockNumber *nblocks) +{ + BlockNumber old_nblocks[MAX_FORKNUM + 1]; + + for (int i = 0; i < nforks; ++i) + old_nblocks[i] = smgrnblocks(reln, forknum[i]); + + smgrtruncate2(reln, forknum, nforks, old_nblocks, nblocks); +} + +/* + * smgrtruncate2() -- Truncate the given forks of supplied relation to + * each specified numbers of blocks + * * The truncation is done immediately, so this can't be rolled back. * * The caller must hold AccessExclusiveLock on the relation, to ensure that * other backends receive the smgr invalidation event that this function sends - * before they access any forks of the relation again. + * before they access any forks of the relation again. The current size of + * the forks should be provided in old_nblocks. This function should normally + * be called in a critical section, but the current size must be checked + * outside the critical section, and no interrupts or smgr functions relating + * to this relation should be called in between. */ void -smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, BlockNumber *nblocks) +smgrtruncate2(SMgrRelation reln, ForkNumber *forknum, int nforks, + BlockNumber *old_nblocks, BlockNumber *nblocks) { int i; @@ -680,7 +753,8 @@ smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, BlockNumber *nb /* Make the cached size is invalid if we encounter an error. */ reln->smgr_cached_nblocks[forknum[i]] = InvalidBlockNumber; - smgrsw[reln->smgr_which].smgr_truncate(reln, forknum[i], nblocks[i]); + smgrsw[reln->smgr_which].smgr_truncate(reln, forknum[i], + old_nblocks[i], nblocks[i]); /* * We might as well update the local smgr_cached_nblocks values. The @@ -693,6 +767,24 @@ smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, BlockNumber *nb } } +/* + * smgrregistersync() -- Request a relation to be sync'd at next checkpoint + * + * This can be used after calling smgrwrite() or smgrextend() with skipFsync = + * true, to register the fsyncs that were skipped earlier. + * + * Note: be mindful that a checkpoint could already have happened between the + * smgrwrite or smgrextend calls and this! In that case, the checkpoint + * already missed fsyncing this relation, and you should use smgrimmedsync + * instead. Most callers should use the bulk loading facility in bulk_write.c + * which handles all that. + */ +void +smgrregistersync(SMgrRelation reln, ForkNumber forknum) +{ + smgrsw[reln->smgr_which].smgr_registersync(reln, forknum); +} + /* * smgrimmedsync() -- Force the specified relation to stable storage. * @@ -715,6 +807,9 @@ smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, BlockNumber *nb * Note that you need to do FlushRelationBuffers() first if there is * any possibility that there are dirty buffers for the relation; * otherwise the sync is not very meaningful. + * + * Most callers should use the bulk loading facility in bulk_write.c + * instead of calling this directly. */ void smgrimmedsync(SMgrRelation reln, ForkNumber forknum) @@ -726,7 +821,7 @@ smgrimmedsync(SMgrRelation reln, ForkNumber forknum) * AtEOXact_SMgr * * This routine is called during transaction commit or abort (it doesn't - * particularly care which). All transient SMgrRelation objects are closed. + * particularly care which). All unpinned SMgrRelation objects are destroyed. * * We do this as a compromise between wanting transient SMgrRelations to * live awhile (to amortize the costs of blind writes of multiple blocks) @@ -737,21 +832,7 @@ smgrimmedsync(SMgrRelation reln, ForkNumber forknum) void AtEOXact_SMgr(void) { - dlist_mutable_iter iter; - - /* - * Zap all unowned SMgrRelations. We rely on smgrclose() to remove each - * one from the list. - */ - dlist_foreach_modify(iter, &unowned_relns) - { - SMgrRelation rel = dlist_container(SMgrRelationData, node, - iter.cur); - - Assert(rel->smgr_owner == NULL); - - smgrclose(rel); - } + smgrdestroyall(); } /* diff --git a/src/backend/storage/sync/meson.build b/src/backend/storage/sync/meson.build index 1b49f169c0ebc..299dd63e3d428 100644 --- a/src/backend/storage/sync/meson.build +++ b/src/backend/storage/sync/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'sync.c', diff --git a/src/backend/storage/sync/sync.c b/src/backend/storage/sync/sync.c index 04fcb06056d59..ab7137d0fffcc 100644 --- a/src/backend/storage/sync/sync.c +++ b/src/backend/storage/sync/sync.c @@ -3,7 +3,7 @@ * sync.c * File synchronization management code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,23 +18,18 @@ #include #include -#include "access/commit_ts.h" #include "access/clog.h" +#include "access/commit_ts.h" #include "access/multixact.h" #include "access/xlog.h" -#include "access/xlogutils.h" -#include "commands/tablespace.h" #include "miscadmin.h" #include "pgstat.h" #include "portability/instr_time.h" #include "postmaster/bgwriter.h" -#include "storage/bufmgr.h" #include "storage/fd.h" -#include "storage/ipc.h" #include "storage/latch.h" #include "storage/md.h" #include "utils/hsearch.h" -#include "utils/inval.h" #include "utils/memutils.h" /* diff --git a/src/backend/tcop/Makefile b/src/backend/tcop/Makefile index f662a7dd1cfd1..9119667345aee 100644 --- a/src/backend/tcop/Makefile +++ b/src/backend/tcop/Makefile @@ -13,6 +13,7 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global OBJS = \ + backend_startup.o \ cmdtag.o \ dest.o \ fastpath.o \ diff --git a/src/backend/tcop/backend_startup.c b/src/backend/tcop/backend_startup.c new file mode 100644 index 0000000000000..ce1275bccfee7 --- /dev/null +++ b/src/backend/tcop/backend_startup.c @@ -0,0 +1,898 @@ +/*------------------------------------------------------------------------- + * + * backend_startup.c + * Backend startup code + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/tcop/backend_startup.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include + +#include "access/xlog.h" +#include "common/ip.h" +#include "common/string.h" +#include "libpq/libpq.h" +#include "libpq/libpq-be.h" +#include "libpq/pqformat.h" +#include "libpq/pqsignal.h" +#include "miscadmin.h" +#include "postmaster/postmaster.h" +#include "replication/walsender.h" +#include "storage/fd.h" +#include "storage/ipc.h" +#include "storage/proc.h" +#include "tcop/backend_startup.h" +#include "tcop/tcopprot.h" +#include "utils/builtins.h" +#include "utils/memutils.h" +#include "utils/ps_status.h" +#include "utils/timeout.h" + +/* GUCs */ +bool Trace_connection_negotiation = false; + +static void BackendInitialize(ClientSocket *client_sock, CAC_state cac); +static int ProcessSSLStartup(Port *port); +static int ProcessStartupPacket(Port *port, bool ssl_done, bool gss_done); +static void SendNegotiateProtocolVersion(List *unrecognized_protocol_options); +static void process_startup_packet_die(SIGNAL_ARGS); +static void StartupPacketTimeoutHandler(void); + +/* + * Entry point for a new backend process. + * + * Initialize the connection, read the startup packet, authenticate the + * client, and start the main processing loop. + */ +void +BackendMain(char *startup_data, size_t startup_data_len) +{ + BackendStartupData *bsdata = (BackendStartupData *) startup_data; + + Assert(startup_data_len == sizeof(BackendStartupData)); + Assert(MyClientSocket != NULL); + +#ifdef EXEC_BACKEND + + /* + * Need to reinitialize the SSL library in the backend, since the context + * structures contain function pointers and cannot be passed through the + * parameter file. + * + * If for some reason reload fails (maybe the user installed broken key + * files), soldier on without SSL; that's better than all connections + * becoming impossible. + * + * XXX should we do this in all child processes? For the moment it's + * enough to do it in backend children. + */ +#ifdef USE_SSL + if (EnableSSL) + { + if (secure_initialize(false) == 0) + LoadedSSL = true; + else + ereport(LOG, + (errmsg("SSL configuration could not be loaded in child process"))); + } +#endif +#endif + + /* Perform additional initialization and collect startup packet */ + BackendInitialize(MyClientSocket, bsdata->canAcceptConnections); + + /* + * Create a per-backend PGPROC struct in shared memory. We must do this + * before we can use LWLocks or access any shared memory. + */ + InitProcess(); + + /* + * Make sure we aren't in PostmasterContext anymore. (We can't delete it + * just yet, though, because InitPostgres will need the HBA data.) + */ + MemoryContextSwitchTo(TopMemoryContext); + + PostgresMain(MyProcPort->database_name, MyProcPort->user_name); +} + + +/* + * BackendInitialize -- initialize an interactive (postmaster-child) + * backend process, and collect the client's startup packet. + * + * returns: nothing. Will not return at all if there's any failure. + * + * Note: this code does not depend on having any access to shared memory. + * Indeed, our approach to SIGTERM/timeout handling *requires* that + * shared memory not have been touched yet; see comments within. + * In the EXEC_BACKEND case, we are physically attached to shared memory + * but have not yet set up most of our local pointers to shmem structures. + */ +static void +BackendInitialize(ClientSocket *client_sock, CAC_state cac) +{ + int status; + int ret; + Port *port; + char remote_host[NI_MAXHOST]; + char remote_port[NI_MAXSERV]; + StringInfoData ps_data; + MemoryContext oldcontext; + + /* Tell fd.c about the long-lived FD associated with the client_sock */ + ReserveExternalFD(); + + /* + * PreAuthDelay is a debugging aid for investigating problems in the + * authentication cycle: it can be set in postgresql.conf to allow time to + * attach to the newly-forked backend with a debugger. (See also + * PostAuthDelay, which we allow clients to pass through PGOPTIONS, but it + * is not honored until after authentication.) + */ + if (PreAuthDelay > 0) + pg_usleep(PreAuthDelay * 1000000L); + + /* This flag will remain set until InitPostgres finishes authentication */ + ClientAuthInProgress = true; /* limit visibility of log messages */ + + /* + * Initialize libpq and enable reporting of ereport errors to the client. + * Must do this now because authentication uses libpq to send messages. + * + * The Port structure and all data structures attached to it are allocated + * in TopMemoryContext, so that they survive into PostgresMain execution. + * We need not worry about leaking this storage on failure, since we + * aren't in the postmaster process anymore. + */ + oldcontext = MemoryContextSwitchTo(TopMemoryContext); + port = MyProcPort = pq_init(client_sock); + MemoryContextSwitchTo(oldcontext); + + whereToSendOutput = DestRemote; /* now safe to ereport to client */ + + /* set these to empty in case they are needed before we set them up */ + port->remote_host = ""; + port->remote_port = ""; + + /* + * We arrange to do _exit(1) if we receive SIGTERM or timeout while trying + * to collect the startup packet; while SIGQUIT results in _exit(2). + * Otherwise the postmaster cannot shutdown the database FAST or IMMED + * cleanly if a buggy client fails to send the packet promptly. + * + * Exiting with _exit(1) is only possible because we have not yet touched + * shared memory; therefore no outside-the-process state needs to get + * cleaned up. + */ + pqsignal(SIGTERM, process_startup_packet_die); + /* SIGQUIT handler was already set up by InitPostmasterChild */ + InitializeTimeouts(); /* establishes SIGALRM handler */ + sigprocmask(SIG_SETMASK, &StartupBlockSig, NULL); + + /* + * Get the remote host name and port for logging and status display. + */ + remote_host[0] = '\0'; + remote_port[0] = '\0'; + if ((ret = pg_getnameinfo_all(&port->raddr.addr, port->raddr.salen, + remote_host, sizeof(remote_host), + remote_port, sizeof(remote_port), + (log_hostname ? 0 : NI_NUMERICHOST) | NI_NUMERICSERV)) != 0) + ereport(WARNING, + (errmsg_internal("pg_getnameinfo_all() failed: %s", + gai_strerror(ret)))); + + /* + * Save remote_host and remote_port in port structure (after this, they + * will appear in log_line_prefix data for log messages). + */ + oldcontext = MemoryContextSwitchTo(TopMemoryContext); + port->remote_host = pstrdup(remote_host); + port->remote_port = pstrdup(remote_port); + + /* And now we can issue the Log_connections message, if wanted */ + if (Log_connections) + { + if (remote_port[0]) + ereport(LOG, + (errmsg("connection received: host=%s port=%s", + remote_host, + remote_port))); + else + ereport(LOG, + (errmsg("connection received: host=%s", + remote_host))); + } + + /* + * If we did a reverse lookup to name, we might as well save the results + * rather than possibly repeating the lookup during authentication. + * + * Note that we don't want to specify NI_NAMEREQD above, because then we'd + * get nothing useful for a client without an rDNS entry. Therefore, we + * must check whether we got a numeric IPv4 or IPv6 address, and not save + * it into remote_hostname if so. (This test is conservative and might + * sometimes classify a hostname as numeric, but an error in that + * direction is safe; it only results in a possible extra lookup.) + */ + if (log_hostname && + ret == 0 && + strspn(remote_host, "0123456789.") < strlen(remote_host) && + strspn(remote_host, "0123456789ABCDEFabcdef:") < strlen(remote_host)) + { + port->remote_hostname = pstrdup(remote_host); + } + MemoryContextSwitchTo(oldcontext); + + /* + * Ready to begin client interaction. We will give up and _exit(1) after + * a time delay, so that a broken client can't hog a connection + * indefinitely. PreAuthDelay and any DNS interactions above don't count + * against the time limit. + * + * Note: AuthenticationTimeout is applied here while waiting for the + * startup packet, and then again in InitPostgres for the duration of any + * authentication operations. So a hostile client could tie up the + * process for nearly twice AuthenticationTimeout before we kick him off. + * + * Note: because PostgresMain will call InitializeTimeouts again, the + * registration of STARTUP_PACKET_TIMEOUT will be lost. This is okay + * since we never use it again after this function. + */ + RegisterTimeout(STARTUP_PACKET_TIMEOUT, StartupPacketTimeoutHandler); + enable_timeout_after(STARTUP_PACKET_TIMEOUT, AuthenticationTimeout * 1000); + + /* Handle direct SSL handshake */ + status = ProcessSSLStartup(port); + + /* + * Receive the startup packet (which might turn out to be a cancel request + * packet). + */ + if (status == STATUS_OK) + status = ProcessStartupPacket(port, false, false); + + /* + * If we're going to reject the connection due to database state, say so + * now instead of wasting cycles on an authentication exchange. (This also + * allows a pg_ping utility to be written.) + */ + if (status == STATUS_OK) + { + switch (cac) + { + case CAC_STARTUP: + ereport(FATAL, + (errcode(ERRCODE_CANNOT_CONNECT_NOW), + errmsg("the database system is starting up"))); + break; + case CAC_NOTCONSISTENT: + if (EnableHotStandby) + ereport(FATAL, + (errcode(ERRCODE_CANNOT_CONNECT_NOW), + errmsg("the database system is not yet accepting connections"), + errdetail("Consistent recovery state has not been yet reached."))); + else + ereport(FATAL, + (errcode(ERRCODE_CANNOT_CONNECT_NOW), + errmsg("the database system is not accepting connections"), + errdetail("Hot standby mode is disabled."))); + break; + case CAC_SHUTDOWN: + ereport(FATAL, + (errcode(ERRCODE_CANNOT_CONNECT_NOW), + errmsg("the database system is shutting down"))); + break; + case CAC_RECOVERY: + ereport(FATAL, + (errcode(ERRCODE_CANNOT_CONNECT_NOW), + errmsg("the database system is in recovery mode"))); + break; + case CAC_TOOMANY: + ereport(FATAL, + (errcode(ERRCODE_TOO_MANY_CONNECTIONS), + errmsg("sorry, too many clients already"))); + break; + case CAC_OK: + break; + } + } + + /* + * Disable the timeout, and prevent SIGTERM again. + */ + disable_timeout(STARTUP_PACKET_TIMEOUT, false); + sigprocmask(SIG_SETMASK, &BlockSig, NULL); + + /* + * As a safety check that nothing in startup has yet performed + * shared-memory modifications that would need to be undone if we had + * exited through SIGTERM or timeout above, check that no on_shmem_exit + * handlers have been registered yet. (This isn't terribly bulletproof, + * since someone might misuse an on_proc_exit handler for shmem cleanup, + * but it's a cheap and helpful check. We cannot disallow on_proc_exit + * handlers unfortunately, since pq_init() already registered one.) + */ + check_on_shmem_exit_lists_are_empty(); + + /* + * Stop here if it was bad or a cancel packet. ProcessStartupPacket + * already did any appropriate error reporting. + */ + if (status != STATUS_OK) + proc_exit(0); + + /* + * Now that we have the user and database name, we can set the process + * title for ps. It's good to do this as early as possible in startup. + */ + initStringInfo(&ps_data); + if (am_walsender) + appendStringInfo(&ps_data, "%s ", GetBackendTypeDesc(B_WAL_SENDER)); + appendStringInfo(&ps_data, "%s ", port->user_name); + if (port->database_name[0] != '\0') + appendStringInfo(&ps_data, "%s ", port->database_name); + appendStringInfoString(&ps_data, port->remote_host); + if (port->remote_port[0] != '\0') + appendStringInfo(&ps_data, "(%s)", port->remote_port); + + init_ps_display(ps_data.data); + pfree(ps_data.data); + + set_ps_display("initializing"); +} + +/* + * Check for a direct SSL connection. + * + * This happens before the startup packet so we are careful not to actually + * read any bytes from the stream if it's not a direct SSL connection. + */ +static int +ProcessSSLStartup(Port *port) +{ + int firstbyte; + + Assert(!port->ssl_in_use); + + pq_startmsgread(); + firstbyte = pq_peekbyte(); + pq_endmsgread(); + if (firstbyte == EOF) + { + /* + * Like in ProcessStartupPacket, if we get no data at all, don't + * clutter the log with a complaint. + */ + return STATUS_ERROR; + } + + if (firstbyte != 0x16) + { + /* Not an SSL handshake message */ + return STATUS_OK; + } + + /* + * First byte indicates standard SSL handshake message + * + * (It can't be a Postgres startup length because in network byte order + * that would be a startup packet hundreds of megabytes long) + */ + +#ifdef USE_SSL + if (!LoadedSSL || port->laddr.addr.ss_family == AF_UNIX) + { + /* SSL not supported */ + goto reject; + } + + if (secure_open_server(port) == -1) + { + /* + * we assume secure_open_server() sent an appropriate TLS alert + * already + */ + goto reject; + } + Assert(port->ssl_in_use); + + if (!port->alpn_used) + { + ereport(COMMERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("received direct SSL connection request without ALPN protocol negotiation extension"))); + goto reject; + } + + if (Trace_connection_negotiation) + ereport(LOG, + (errmsg("direct SSL connection accepted"))); + return STATUS_OK; +#else + /* SSL not supported by this build */ + goto reject; +#endif + +reject: + if (Trace_connection_negotiation) + ereport(LOG, + (errmsg("direct SSL connection rejected"))); + return STATUS_ERROR; +} + +/* + * Read a client's startup packet and do something according to it. + * + * Returns STATUS_OK or STATUS_ERROR, or might call ereport(FATAL) and + * not return at all. + * + * (Note that ereport(FATAL) stuff is sent to the client, so only use it + * if that's what you want. Return STATUS_ERROR if you don't want to + * send anything to the client, which would typically be appropriate + * if we detect a communications failure.) + * + * Set ssl_done and/or gss_done when negotiation of an encrypted layer + * (currently, TLS or GSSAPI) is completed. A successful negotiation of either + * encryption layer sets both flags, but a rejected negotiation sets only the + * flag for that layer, since the client may wish to try the other one. We + * should make no assumption here about the order in which the client may make + * requests. + */ +static int +ProcessStartupPacket(Port *port, bool ssl_done, bool gss_done) +{ + int32 len; + char *buf; + ProtocolVersion proto; + MemoryContext oldcontext; + + pq_startmsgread(); + + /* + * Grab the first byte of the length word separately, so that we can tell + * whether we have no data at all or an incomplete packet. (This might + * sound inefficient, but it's not really, because of buffering in + * pqcomm.c.) + */ + if (pq_getbytes((char *) &len, 1) == EOF) + { + /* + * If we get no data at all, don't clutter the log with a complaint; + * such cases often occur for legitimate reasons. An example is that + * we might be here after responding to NEGOTIATE_SSL_CODE, and if the + * client didn't like our response, it'll probably just drop the + * connection. Service-monitoring software also often just opens and + * closes a connection without sending anything. (So do port + * scanners, which may be less benign, but it's not really our job to + * notice those.) + */ + return STATUS_ERROR; + } + + if (pq_getbytes(((char *) &len) + 1, 3) == EOF) + { + /* Got a partial length word, so bleat about that */ + if (!ssl_done && !gss_done) + ereport(COMMERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("incomplete startup packet"))); + return STATUS_ERROR; + } + + len = pg_ntoh32(len); + len -= 4; + + if (len < (int32) sizeof(ProtocolVersion) || + len > MAX_STARTUP_PACKET_LENGTH) + { + ereport(COMMERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("invalid length of startup packet"))); + return STATUS_ERROR; + } + + /* + * Allocate space to hold the startup packet, plus one extra byte that's + * initialized to be zero. This ensures we will have null termination of + * all strings inside the packet. + */ + buf = palloc(len + 1); + buf[len] = '\0'; + + if (pq_getbytes(buf, len) == EOF) + { + ereport(COMMERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("incomplete startup packet"))); + return STATUS_ERROR; + } + pq_endmsgread(); + + /* + * The first field is either a protocol version number or a special + * request code. + */ + port->proto = proto = pg_ntoh32(*((ProtocolVersion *) buf)); + + if (proto == CANCEL_REQUEST_CODE) + { + CancelRequestPacket *canc; + int backendPID; + int32 cancelAuthCode; + + if (len != sizeof(CancelRequestPacket)) + { + ereport(COMMERROR, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("invalid length of startup packet"))); + return STATUS_ERROR; + } + canc = (CancelRequestPacket *) buf; + backendPID = (int) pg_ntoh32(canc->backendPID); + cancelAuthCode = (int32) pg_ntoh32(canc->cancelAuthCode); + + processCancelRequest(backendPID, cancelAuthCode); + /* Not really an error, but we don't want to proceed further */ + return STATUS_ERROR; + } + + if (proto == NEGOTIATE_SSL_CODE && !ssl_done) + { + char SSLok; + +#ifdef USE_SSL + + /* + * No SSL when disabled or on Unix sockets. + * + * Also no SSL negotiation if we already have a direct SSL connection + */ + if (!LoadedSSL || port->laddr.addr.ss_family == AF_UNIX || port->ssl_in_use) + SSLok = 'N'; + else + SSLok = 'S'; /* Support for SSL */ +#else + SSLok = 'N'; /* No support for SSL */ +#endif + + if (Trace_connection_negotiation) + { + if (SSLok == 'S') + ereport(LOG, + (errmsg("SSLRequest accepted"))); + else + ereport(LOG, + (errmsg("SSLRequest rejected"))); + } + + while (secure_write(port, &SSLok, 1) != 1) + { + if (errno == EINTR) + continue; /* if interrupted, just retry */ + ereport(COMMERROR, + (errcode_for_socket_access(), + errmsg("failed to send SSL negotiation response: %m"))); + return STATUS_ERROR; /* close the connection */ + } + +#ifdef USE_SSL + if (SSLok == 'S' && secure_open_server(port) == -1) + return STATUS_ERROR; +#endif + + /* + * At this point we should have no data already buffered. If we do, + * it was received before we performed the SSL handshake, so it wasn't + * encrypted and indeed may have been injected by a man-in-the-middle. + * We report this case to the client. + */ + if (pq_buffer_remaining_data() > 0) + ereport(FATAL, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("received unencrypted data after SSL request"), + errdetail("This could be either a client-software bug or evidence of an attempted man-in-the-middle attack."))); + + /* + * regular startup packet, cancel, etc packet should follow, but not + * another SSL negotiation request, and a GSS request should only + * follow if SSL was rejected (client may negotiate in either order) + */ + return ProcessStartupPacket(port, true, SSLok == 'S'); + } + else if (proto == NEGOTIATE_GSS_CODE && !gss_done) + { + char GSSok = 'N'; + +#ifdef ENABLE_GSS + /* No GSSAPI encryption when on Unix socket */ + if (port->laddr.addr.ss_family != AF_UNIX) + GSSok = 'G'; +#endif + + if (Trace_connection_negotiation) + { + if (GSSok == 'G') + ereport(LOG, + (errmsg("GSSENCRequest accepted"))); + else + ereport(LOG, + (errmsg("GSSENCRequest rejected"))); + } + + while (secure_write(port, &GSSok, 1) != 1) + { + if (errno == EINTR) + continue; + ereport(COMMERROR, + (errcode_for_socket_access(), + errmsg("failed to send GSSAPI negotiation response: %m"))); + return STATUS_ERROR; /* close the connection */ + } + +#ifdef ENABLE_GSS + if (GSSok == 'G' && secure_open_gssapi(port) == -1) + return STATUS_ERROR; +#endif + + /* + * At this point we should have no data already buffered. If we do, + * it was received before we performed the GSS handshake, so it wasn't + * encrypted and indeed may have been injected by a man-in-the-middle. + * We report this case to the client. + */ + if (pq_buffer_remaining_data() > 0) + ereport(FATAL, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("received unencrypted data after GSSAPI encryption request"), + errdetail("This could be either a client-software bug or evidence of an attempted man-in-the-middle attack."))); + + /* + * regular startup packet, cancel, etc packet should follow, but not + * another GSS negotiation request, and an SSL request should only + * follow if GSS was rejected (client may negotiate in either order) + */ + return ProcessStartupPacket(port, GSSok == 'G', true); + } + + /* Could add additional special packet types here */ + + /* + * Set FrontendProtocol now so that ereport() knows what format to send if + * we fail during startup. + */ + FrontendProtocol = proto; + + /* Check that the major protocol version is in range. */ + if (PG_PROTOCOL_MAJOR(proto) < PG_PROTOCOL_MAJOR(PG_PROTOCOL_EARLIEST) || + PG_PROTOCOL_MAJOR(proto) > PG_PROTOCOL_MAJOR(PG_PROTOCOL_LATEST)) + ereport(FATAL, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("unsupported frontend protocol %u.%u: server supports %u.0 to %u.%u", + PG_PROTOCOL_MAJOR(proto), PG_PROTOCOL_MINOR(proto), + PG_PROTOCOL_MAJOR(PG_PROTOCOL_EARLIEST), + PG_PROTOCOL_MAJOR(PG_PROTOCOL_LATEST), + PG_PROTOCOL_MINOR(PG_PROTOCOL_LATEST)))); + + /* + * Now fetch parameters out of startup packet and save them into the Port + * structure. + */ + oldcontext = MemoryContextSwitchTo(TopMemoryContext); + + /* Handle protocol version 3 startup packet */ + { + int32 offset = sizeof(ProtocolVersion); + List *unrecognized_protocol_options = NIL; + + /* + * Scan packet body for name/option pairs. We can assume any string + * beginning within the packet body is null-terminated, thanks to + * zeroing extra byte above. + */ + port->guc_options = NIL; + + while (offset < len) + { + char *nameptr = buf + offset; + int32 valoffset; + char *valptr; + + if (*nameptr == '\0') + break; /* found packet terminator */ + valoffset = offset + strlen(nameptr) + 1; + if (valoffset >= len) + break; /* missing value, will complain below */ + valptr = buf + valoffset; + + if (strcmp(nameptr, "database") == 0) + port->database_name = pstrdup(valptr); + else if (strcmp(nameptr, "user") == 0) + port->user_name = pstrdup(valptr); + else if (strcmp(nameptr, "options") == 0) + port->cmdline_options = pstrdup(valptr); + else if (strcmp(nameptr, "replication") == 0) + { + /* + * Due to backward compatibility concerns the replication + * parameter is a hybrid beast which allows the value to be + * either boolean or the string 'database'. The latter + * connects to a specific database which is e.g. required for + * logical decoding while. + */ + if (strcmp(valptr, "database") == 0) + { + am_walsender = true; + am_db_walsender = true; + } + else if (!parse_bool(valptr, &am_walsender)) + ereport(FATAL, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid value for parameter \"%s\": \"%s\"", + "replication", + valptr), + errhint("Valid values are: \"false\", 0, \"true\", 1, \"database\"."))); + } + else if (strncmp(nameptr, "_pq_.", 5) == 0) + { + /* + * Any option beginning with _pq_. is reserved for use as a + * protocol-level option, but at present no such options are + * defined. + */ + unrecognized_protocol_options = + lappend(unrecognized_protocol_options, pstrdup(nameptr)); + } + else + { + /* Assume it's a generic GUC option */ + port->guc_options = lappend(port->guc_options, + pstrdup(nameptr)); + port->guc_options = lappend(port->guc_options, + pstrdup(valptr)); + + /* + * Copy application_name to port if we come across it. This + * is done so we can log the application_name in the + * connection authorization message. Note that the GUC would + * be used but we haven't gone through GUC setup yet. + */ + if (strcmp(nameptr, "application_name") == 0) + { + port->application_name = pg_clean_ascii(valptr, 0); + } + } + offset = valoffset + strlen(valptr) + 1; + } + + /* + * If we didn't find a packet terminator exactly at the end of the + * given packet length, complain. + */ + if (offset != len - 1) + ereport(FATAL, + (errcode(ERRCODE_PROTOCOL_VIOLATION), + errmsg("invalid startup packet layout: expected terminator as last byte"))); + + /* + * If the client requested a newer protocol version or if the client + * requested any protocol options we didn't recognize, let them know + * the newest minor protocol version we do support and the names of + * any unrecognized options. + */ + if (PG_PROTOCOL_MINOR(proto) > PG_PROTOCOL_MINOR(PG_PROTOCOL_LATEST) || + unrecognized_protocol_options != NIL) + SendNegotiateProtocolVersion(unrecognized_protocol_options); + } + + /* Check a user name was given. */ + if (port->user_name == NULL || port->user_name[0] == '\0') + ereport(FATAL, + (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION), + errmsg("no PostgreSQL user name specified in startup packet"))); + + /* The database defaults to the user name. */ + if (port->database_name == NULL || port->database_name[0] == '\0') + port->database_name = pstrdup(port->user_name); + + /* + * Truncate given database and user names to length of a Postgres name. + * This avoids lookup failures when overlength names are given. + */ + if (strlen(port->database_name) >= NAMEDATALEN) + port->database_name[NAMEDATALEN - 1] = '\0'; + if (strlen(port->user_name) >= NAMEDATALEN) + port->user_name[NAMEDATALEN - 1] = '\0'; + + if (am_walsender) + MyBackendType = B_WAL_SENDER; + else + MyBackendType = B_BACKEND; + + /* + * Normal walsender backends, e.g. for streaming replication, are not + * connected to a particular database. But walsenders used for logical + * replication need to connect to a specific database. We allow streaming + * replication commands to be issued even if connected to a database as it + * can make sense to first make a basebackup and then stream changes + * starting from that. + */ + if (am_walsender && !am_db_walsender) + port->database_name[0] = '\0'; + + /* + * Done filling the Port structure + */ + MemoryContextSwitchTo(oldcontext); + + return STATUS_OK; +} + +/* + * Send a NegotiateProtocolVersion to the client. This lets the client know + * that they have requested a newer minor protocol version than we are able + * to speak. We'll speak the highest version we know about; the client can, + * of course, abandon the connection if that's a problem. + * + * We also include in the response a list of protocol options we didn't + * understand. This allows clients to include optional parameters that might + * be present either in newer protocol versions or third-party protocol + * extensions without fear of having to reconnect if those options are not + * understood, while at the same time making certain that the client is aware + * of which options were actually accepted. + */ +static void +SendNegotiateProtocolVersion(List *unrecognized_protocol_options) +{ + StringInfoData buf; + ListCell *lc; + + pq_beginmessage(&buf, PqMsg_NegotiateProtocolVersion); + pq_sendint32(&buf, PG_PROTOCOL_LATEST); + pq_sendint32(&buf, list_length(unrecognized_protocol_options)); + foreach(lc, unrecognized_protocol_options) + pq_sendstring(&buf, lfirst(lc)); + pq_endmessage(&buf); + + /* no need to flush, some other message will follow */ +} + + +/* + * SIGTERM while processing startup packet. + * + * Running proc_exit() from a signal handler would be quite unsafe. + * However, since we have not yet touched shared memory, we can just + * pull the plug and exit without running any atexit handlers. + * + * One might be tempted to try to send a message, or log one, indicating + * why we are disconnecting. However, that would be quite unsafe in itself. + * Also, it seems undesirable to provide clues about the database's state + * to a client that has not yet completed authentication, or even sent us + * a startup packet. + */ +static void +process_startup_packet_die(SIGNAL_ARGS) +{ + _exit(1); +} + +/* + * Timeout while processing startup packet. + * As for process_startup_packet_die(), we exit via _exit(1). + */ +static void +StartupPacketTimeoutHandler(void) +{ + _exit(1); +} diff --git a/src/backend/tcop/cmdtag.c b/src/backend/tcop/cmdtag.c index 4bd713a0b4a58..0870064fdd83b 100644 --- a/src/backend/tcop/cmdtag.c +++ b/src/backend/tcop/cmdtag.c @@ -3,7 +3,7 @@ * cmdtag.c * Data and routines for commandtag names and enumeration. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -13,7 +13,6 @@ */ #include "postgres.h" -#include "miscadmin.h" #include "tcop/cmdtag.h" #include "utils/builtins.h" @@ -31,7 +30,7 @@ typedef struct CommandTagBehavior #define PG_CMDTAG(tag, name, evtrgok, rwrok, rowcnt) \ { name, (uint8) (sizeof(name) - 1), evtrgok, rwrok, rowcnt }, -static const CommandTagBehavior tag_behavior[COMMAND_TAG_NEXTTAG] = { +static const CommandTagBehavior tag_behavior[] = { #include "tcop/cmdtaglist.h" }; diff --git a/src/backend/tcop/dest.c b/src/backend/tcop/dest.c index c0406e2ee5502..96f80b3046346 100644 --- a/src/backend/tcop/dest.c +++ b/src/backend/tcop/dest.c @@ -4,7 +4,7 @@ * support for communication destinations * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -33,13 +33,13 @@ #include "access/xact.h" #include "commands/copy.h" #include "commands/createas.h" +#include "commands/explain.h" #include "commands/matview.h" #include "executor/functions.h" #include "executor/tqueue.h" #include "executor/tstoreReceiver.h" #include "libpq/libpq.h" #include "libpq/pqformat.h" -#include "utils/portal.h" /* ---------------- @@ -152,6 +152,9 @@ CreateDestReceiver(CommandDest dest) case DestTupleQueue: return CreateTupleQueueDestReceiver(NULL); + + case DestExplainSerialize: + return CreateExplainSerializeDestReceiver(NULL); } /* should never get here */ @@ -176,7 +179,7 @@ EndCommand(const QueryCompletion *qc, CommandDest dest, bool force_undecorated_o len = BuildQueryCompletionString(completionTag, qc, force_undecorated_output); - pq_putmessage('C', completionTag, len + 1); + pq_putmessage(PqMsg_CommandComplete, completionTag, len + 1); case DestNone: case DestDebug: @@ -187,6 +190,7 @@ EndCommand(const QueryCompletion *qc, CommandDest dest, bool force_undecorated_o case DestSQLFunction: case DestTransientRel: case DestTupleQueue: + case DestExplainSerialize: break; } } @@ -200,7 +204,7 @@ EndCommand(const QueryCompletion *qc, CommandDest dest, bool force_undecorated_o void EndReplicationCommand(const char *commandTag) { - pq_putmessage('C', commandTag, strlen(commandTag) + 1); + pq_putmessage(PqMsg_CommandComplete, commandTag, strlen(commandTag) + 1); } /* ---------------- @@ -220,7 +224,7 @@ NullCommand(CommandDest dest) case DestRemoteSimple: /* Tell the FE that we saw an empty query string */ - pq_putemptymessage('I'); + pq_putemptymessage(PqMsg_EmptyQueryResponse); break; case DestNone: @@ -232,6 +236,7 @@ NullCommand(CommandDest dest) case DestSQLFunction: case DestTransientRel: case DestTupleQueue: + case DestExplainSerialize: break; } } @@ -258,7 +263,7 @@ ReadyForQuery(CommandDest dest) { StringInfoData buf; - pq_beginmessage(&buf, 'Z'); + pq_beginmessage(&buf, PqMsg_ReadyForQuery); pq_sendbyte(&buf, TransactionBlockStatusCode()); pq_endmessage(&buf); } @@ -275,6 +280,7 @@ ReadyForQuery(CommandDest dest) case DestSQLFunction: case DestTransientRel: case DestTupleQueue: + case DestExplainSerialize: break; } } diff --git a/src/backend/tcop/fastpath.c b/src/backend/tcop/fastpath.c index 2f70ebd5fae62..deac71335c2ef 100644 --- a/src/backend/tcop/fastpath.c +++ b/src/backend/tcop/fastpath.c @@ -3,7 +3,7 @@ * fastpath.c * routines to handle function requests from the frontend * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,8 +22,8 @@ #include "catalog/objectaccess.h" #include "catalog/pg_namespace.h" #include "catalog/pg_proc.h" -#include "libpq/libpq.h" #include "libpq/pqformat.h" +#include "libpq/protocol.h" #include "mb/pg_wchar.h" #include "miscadmin.h" #include "port/pg_bswap.h" @@ -69,7 +69,7 @@ SendFunctionResult(Datum retval, bool isnull, Oid rettype, int16 format) { StringInfoData buf; - pq_beginmessage(&buf, 'V'); + pq_beginmessage(&buf, PqMsg_FunctionCallResponse); if (isnull) { @@ -85,7 +85,7 @@ SendFunctionResult(Datum retval, bool isnull, Oid rettype, int16 format) getTypeOutputInfo(rettype, &typoutput, &typisvarlena); outputstr = OidOutputFunctionCall(typoutput, retval); - pq_sendcountedtext(&buf, outputstr, strlen(outputstr), false); + pq_sendcountedtext(&buf, outputstr, strlen(outputstr)); pfree(outputstr); } else if (format == 1) diff --git a/src/backend/tcop/meson.build b/src/backend/tcop/meson.build index 55c49809fe8ed..19a97bbf55ea7 100644 --- a/src/backend/tcop/meson.build +++ b/src/backend/tcop/meson.build @@ -1,6 +1,7 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( + 'backend_startup.c', 'cmdtag.c', 'dest.c', 'fastpath.c', diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 01b6cc1f7d357..9cd1d0abe35fb 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -3,7 +3,7 @@ * postgres.c * POSTGRES C Backend Interface * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -36,6 +36,7 @@ #include "access/xact.h" #include "catalog/pg_type.h" #include "commands/async.h" +#include "commands/event_trigger.h" #include "commands/prepare.h" #include "common/pg_prng.h" #include "jit/jit.h" @@ -71,12 +72,14 @@ #include "tcop/tcopprot.h" #include "tcop/utility.h" #include "utils/guc_hooks.h" +#include "utils/injection_point.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/ps_status.h" #include "utils/snapmgr.h" #include "utils/timeout.h" #include "utils/timestamp.h" +#include "utils/varlena.h" /* ---------------- * global variables @@ -101,6 +104,9 @@ int PostAuthDelay = 0; /* Time between checks that the client is still connected. */ int client_connection_check_interval = 0; +/* flags for non-system relation kinds to restrict use */ +int restrict_nonsystem_relation_kind; + /* ---------------- * private typedefs etc * ---------------- @@ -161,9 +167,8 @@ static bool EchoQuery = false; /* -E switch */ static bool UseSemiNewlineNewline = false; /* -j switch */ /* whether or not, and why, we were canceled by conflict with recovery */ -static bool RecoveryConflictPending = false; -static bool RecoveryConflictRetryable = true; -static ProcSignalReason RecoveryConflictReason; +static volatile sig_atomic_t RecoveryConflictPending = false; +static volatile sig_atomic_t RecoveryConflictPendingReasons[NUM_PROCSIGNALS]; /* reused buffer to pass to SendRowDescriptionMessage() */ static MemoryContext row_description_context = NULL; @@ -182,7 +187,6 @@ static bool check_log_statement(List *stmt_list); static int errdetail_execute(List *raw_parsetree_list); static int errdetail_params(ParamListInfo params); static int errdetail_abort(void); -static int errdetail_recovery_conflict(void); static void bind_param_error_callback(void *arg); static void start_xact_command(void); static void finish_xact_command(void); @@ -319,7 +323,7 @@ InteractiveBackend(StringInfo inBuf) printf("statement: %s\n", inBuf->data); fflush(stdout); - return 'Q'; + return PqMsg_Query; } /* @@ -402,37 +406,37 @@ SocketBackend(StringInfo inBuf) */ switch (qtype) { - case 'Q': /* simple query */ + case PqMsg_Query: maxmsglen = PQ_LARGE_MESSAGE_LIMIT; doing_extended_query_message = false; break; - case 'F': /* fastpath function call */ + case PqMsg_FunctionCall: maxmsglen = PQ_LARGE_MESSAGE_LIMIT; doing_extended_query_message = false; break; - case 'X': /* terminate */ + case PqMsg_Terminate: maxmsglen = PQ_SMALL_MESSAGE_LIMIT; doing_extended_query_message = false; ignore_till_sync = false; break; - case 'B': /* bind */ - case 'P': /* parse */ + case PqMsg_Bind: + case PqMsg_Parse: maxmsglen = PQ_LARGE_MESSAGE_LIMIT; doing_extended_query_message = true; break; - case 'C': /* close */ - case 'D': /* describe */ - case 'E': /* execute */ - case 'H': /* flush */ + case PqMsg_Close: + case PqMsg_Describe: + case PqMsg_Execute: + case PqMsg_Flush: maxmsglen = PQ_SMALL_MESSAGE_LIMIT; doing_extended_query_message = true; break; - case 'S': /* sync */ + case PqMsg_Sync: maxmsglen = PQ_SMALL_MESSAGE_LIMIT; /* stop any active skip-till-Sync */ ignore_till_sync = false; @@ -440,13 +444,13 @@ SocketBackend(StringInfo inBuf) doing_extended_query_message = false; break; - case 'd': /* copy data */ + case PqMsg_CopyData: maxmsglen = PQ_LARGE_MESSAGE_LIMIT; doing_extended_query_message = false; break; - case 'c': /* copy done */ - case 'f': /* copy fail */ + case PqMsg_CopyDone: + case PqMsg_CopyFail: maxmsglen = PQ_SMALL_MESSAGE_LIMIT; doing_extended_query_message = false; break; @@ -641,7 +645,7 @@ pg_parse_query(const char *query_string) */ #ifdef WRITE_READ_PARSE_PLAN_TREES { - char *str = nodeToString(raw_parsetree_list); + char *str = nodeToStringWithLocations(raw_parsetree_list); List *new_list = stringToNodeWithLocations(str); pfree(str); @@ -849,7 +853,7 @@ pg_rewrite_query(Query *query) foreach(lc, querytree_list) { Query *curr_query = lfirst_node(Query, lc); - char *str = nodeToString(curr_query); + char *str = nodeToStringWithLocations(curr_query); Query *new_query = stringToNodeWithLocations(str); /* @@ -931,7 +935,7 @@ pg_plan_query(Query *querytree, const char *query_string, int cursorOptions, char *str; PlannedStmt *new_plan; - str = nodeToString(plan); + str = nodeToStringWithLocations(plan); new_plan = stringToNodeWithLocations(str); pfree(str); @@ -1274,7 +1278,7 @@ exec_simple_query(const char *query_string) (void) PortalRun(portal, FETCH_ALL, true, /* always top level */ - true, + true, /* ignored */ receiver, receiver, &qc); @@ -1589,7 +1593,7 @@ exec_parse_message(const char *query_string, /* string to execute */ * Send ParseComplete. */ if (whereToSendOutput == DestRemote) - pq_putemptymessage('1'); + pq_putemptymessage(PqMsg_ParseComplete); /* * Emit duration logging if appropriate. @@ -1644,6 +1648,7 @@ exec_bind_message(StringInfo input_message) char msec_str[32]; ParamsErrorCbData params_data; ErrorContextCallback params_errcxt; + ListCell *lc; /* Get the fixed part of the message */ portal_name = pq_getmsgstring(input_message); @@ -1679,6 +1684,17 @@ exec_bind_message(StringInfo input_message) pgstat_report_activity(STATE_RUNNING, psrc->query_string); + foreach(lc, psrc->query_list) + { + Query *query = lfirst_node(Query, lc); + + if (query->queryId != UINT64CONST(0)) + { + pgstat_report_query_id(query->queryId, false); + break; + } + } + set_ps_display("BIND"); if (save_log_statement_stats) @@ -1818,23 +1834,19 @@ exec_bind_message(StringInfo input_message) if (!isNull) { - const char *pvalue = pq_getmsgbytes(input_message, plength); + char *pvalue; /* - * Rather than copying data around, we just set up a phony + * Rather than copying data around, we just initialize a * StringInfo pointing to the correct portion of the message - * buffer. We assume we can scribble on the message buffer so - * as to maintain the convention that StringInfos have a - * trailing null. This is grotty but is a big win when - * dealing with very large parameter strings. + * buffer. We assume we can scribble on the message buffer to + * add a trailing NUL which is required for the input function + * call. */ - pbuf.data = unconstify(char *, pvalue); - pbuf.maxlen = plength + 1; - pbuf.len = plength; - pbuf.cursor = 0; - - csave = pbuf.data[plength]; - pbuf.data[plength] = '\0'; + pvalue = unconstify(char *, pq_getmsgbytes(input_message, plength)); + csave = pvalue[plength]; + pvalue[plength] = '\0'; + initReadOnlyStringInfo(&pbuf, pvalue, plength); } else { @@ -2047,7 +2059,7 @@ exec_bind_message(StringInfo input_message) * Send BindComplete. */ if (whereToSendOutput == DestRemote) - pq_putemptymessage('2'); + pq_putemptymessage(PqMsg_BindComplete); /* * Emit duration logging if appropriate. @@ -2105,6 +2117,7 @@ exec_execute_message(const char *portal_name, long max_rows) ErrorContextCallback params_errcxt; const char *cmdtagname; size_t cmdtaglen; + ListCell *lc; /* Adjust destination to tell printtup.c what to do */ dest = whereToSendOutput; @@ -2151,6 +2164,17 @@ exec_execute_message(const char *portal_name, long max_rows) pgstat_report_activity(STATE_RUNNING, sourceText); + foreach(lc, portal->stmts) + { + PlannedStmt *stmt = lfirst_node(PlannedStmt, lc); + + if (stmt->queryId != UINT64CONST(0)) + { + pgstat_report_query_id(stmt->queryId, false); + break; + } + } + cmdtagname = GetCommandTagNameAndLen(portal->commandTag, &cmdtaglen); set_ps_display_with_len(cmdtagname, cmdtaglen); @@ -2231,7 +2255,7 @@ exec_execute_message(const char *portal_name, long max_rows) completed = PortalRun(portal, max_rows, true, /* always top level */ - !execute_is_fetch && max_rows == FETCH_ALL, + true, /* ignored */ receiver, receiver, &qc); @@ -2290,7 +2314,7 @@ exec_execute_message(const char *portal_name, long max_rows) { /* Portal run not complete, so send PortalSuspended */ if (whereToSendOutput == DestRemote) - pq_putemptymessage('s'); + pq_putemptymessage(PqMsg_PortalSuspended); /* * Set XACT_FLAGS_PIPELINING whenever we suspend an Execute message, @@ -2484,7 +2508,7 @@ errdetail_params(ParamListInfo params) str = BuildParamLogString(params, NULL, log_parameter_max_length); if (str && str[0] != '\0') - errdetail("parameters: %s", str); + errdetail("Parameters: %s", str); } return 0; @@ -2499,7 +2523,7 @@ static int errdetail_abort(void) { if (MyProc->recoveryConflictPending) - errdetail("abort reason: recovery conflict"); + errdetail("Abort reason: recovery conflict"); return 0; } @@ -2510,9 +2534,9 @@ errdetail_abort(void) * Add an errdetail() line showing conflict source. */ static int -errdetail_recovery_conflict(void) +errdetail_recovery_conflict(ProcSignalReason reason) { - switch (RecoveryConflictReason) + switch (reason) { case PROCSIG_RECOVERY_CONFLICT_BUFFERPIN: errdetail("User was holding shared buffer pin for too long."); @@ -2527,7 +2551,7 @@ errdetail_recovery_conflict(void) errdetail("User query might have needed to see row versions that must be removed."); break; case PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT: - errdetail("User was using a logical slot that must be invalidated."); + errdetail("User was using a logical replication slot that must be invalidated."); break; case PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK: errdetail("User transaction caused buffer deadlock with recovery."); @@ -2655,8 +2679,7 @@ exec_describe_statement_message(const char *stmt_name) /* * First describe the parameters... */ - pq_beginmessage_reuse(&row_description_buf, 't'); /* parameter description - * message type */ + pq_beginmessage_reuse(&row_description_buf, PqMsg_ParameterDescription); pq_sendint16(&row_description_buf, psrc->num_params); for (int i = 0; i < psrc->num_params; i++) @@ -2683,7 +2706,7 @@ exec_describe_statement_message(const char *stmt_name) NULL); } else - pq_putemptymessage('n'); /* NoData */ + pq_putemptymessage(PqMsg_NoData); } /* @@ -2736,7 +2759,7 @@ exec_describe_portal_message(const char *portal_name) FetchPortalTargetList(portal), portal->formats); else - pq_putemptymessage('n'); /* NoData */ + pq_putemptymessage(PqMsg_NoData); } @@ -2975,8 +2998,6 @@ quickdie(SIGNAL_ARGS) void die(SIGNAL_ARGS) { - int save_errno = errno; - /* Don't joggle the elbow of proc_exit */ if (!proc_exit_inprogress) { @@ -2998,8 +3019,6 @@ die(SIGNAL_ARGS) */ if (DoingCommandRead && whereToSendOutput != DestRemote) ProcessInterrupts(); - - errno = save_errno; } /* @@ -3009,8 +3028,6 @@ die(SIGNAL_ARGS) void StatementCancelHandler(SIGNAL_ARGS) { - int save_errno = errno; - /* * Don't joggle the elbow of proc_exit */ @@ -3022,8 +3039,6 @@ StatementCancelHandler(SIGNAL_ARGS) /* If we're still here, waken anything waiting on the process latch */ SetLatch(MyLatch); - - errno = save_errno; } /* signal handler for floating point exception */ @@ -3040,143 +3055,203 @@ FloatExceptionHandler(SIGNAL_ARGS) } /* - * RecoveryConflictInterrupt: out-of-line portion of recovery conflict - * handling following receipt of SIGUSR1. Designed to be similar to die() - * and StatementCancelHandler(). Called only by a normal user backend - * that begins a transaction during recovery. + * Tell the next CHECK_FOR_INTERRUPTS() to check for a particular type of + * recovery conflict. Runs in a SIGUSR1 handler. */ void -RecoveryConflictInterrupt(ProcSignalReason reason) +HandleRecoveryConflictInterrupt(ProcSignalReason reason) { - int save_errno = errno; + RecoveryConflictPendingReasons[reason] = true; + RecoveryConflictPending = true; + InterruptPending = true; + /* latch will be set by procsignal_sigusr1_handler */ +} - /* - * Don't joggle the elbow of proc_exit - */ - if (!proc_exit_inprogress) +/* + * Check one individual conflict reason. + */ +static void +ProcessRecoveryConflictInterrupt(ProcSignalReason reason) +{ + switch (reason) { - RecoveryConflictReason = reason; - switch (reason) - { - case PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK: + case PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK: - /* - * If we aren't waiting for a lock we can never deadlock. - */ - if (!IsWaitingForLock()) - return; + /* + * If we aren't waiting for a lock we can never deadlock. + */ + if (!IsWaitingForLock()) + return; - /* Intentional fall through to check wait for pin */ - /* FALLTHROUGH */ + /* Intentional fall through to check wait for pin */ + /* FALLTHROUGH */ - case PROCSIG_RECOVERY_CONFLICT_BUFFERPIN: + case PROCSIG_RECOVERY_CONFLICT_BUFFERPIN: - /* - * If PROCSIG_RECOVERY_CONFLICT_BUFFERPIN is requested but we - * aren't blocking the Startup process there is nothing more - * to do. - * - * When PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK is - * requested, if we're waiting for locks and the startup - * process is not waiting for buffer pin (i.e., also waiting - * for locks), we set the flag so that ProcSleep() will check - * for deadlocks. - */ - if (!HoldingBufferPinThatDelaysRecovery()) - { - if (reason == PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK && - GetStartupBufferPinWaitBufId() < 0) - CheckDeadLockAlert(); - return; - } + /* + * If PROCSIG_RECOVERY_CONFLICT_BUFFERPIN is requested but we + * aren't blocking the Startup process there is nothing more to + * do. + * + * When PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK is requested, + * if we're waiting for locks and the startup process is not + * waiting for buffer pin (i.e., also waiting for locks), we set + * the flag so that ProcSleep() will check for deadlocks. + */ + if (!HoldingBufferPinThatDelaysRecovery()) + { + if (reason == PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK && + GetStartupBufferPinWaitBufId() < 0) + CheckDeadLockAlert(); + return; + } - MyProc->recoveryConflictPending = true; + MyProc->recoveryConflictPending = true; - /* Intentional fall through to error handling */ - /* FALLTHROUGH */ + /* Intentional fall through to error handling */ + /* FALLTHROUGH */ + + case PROCSIG_RECOVERY_CONFLICT_LOCK: + case PROCSIG_RECOVERY_CONFLICT_TABLESPACE: + case PROCSIG_RECOVERY_CONFLICT_SNAPSHOT: + + /* + * If we aren't in a transaction any longer then ignore. + */ + if (!IsTransactionOrTransactionBlock()) + return; + + /* FALLTHROUGH */ - case PROCSIG_RECOVERY_CONFLICT_LOCK: - case PROCSIG_RECOVERY_CONFLICT_TABLESPACE: - case PROCSIG_RECOVERY_CONFLICT_SNAPSHOT: + case PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT: + /* + * If we're not in a subtransaction then we are OK to throw an + * ERROR to resolve the conflict. Otherwise drop through to the + * FATAL case. + * + * PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT is a special case that + * always throws an ERROR (ie never promotes to FATAL), though it + * still has to respect QueryCancelHoldoffCount, so it shares this + * code path. Logical decoding slots are only acquired while + * performing logical decoding. During logical decoding no user + * controlled code is run. During [sub]transaction abort, the + * slot is released. Therefore user controlled code cannot + * intercept an error before the replication slot is released. + * + * XXX other times that we can throw just an ERROR *may* be + * PROCSIG_RECOVERY_CONFLICT_LOCK if no locks are held in parent + * transactions + * + * PROCSIG_RECOVERY_CONFLICT_SNAPSHOT if no snapshots are held by + * parent transactions and the transaction is not + * transaction-snapshot mode + * + * PROCSIG_RECOVERY_CONFLICT_TABLESPACE if no temp files or + * cursors open in parent transactions + */ + if (reason == PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT || + !IsSubTransaction()) + { /* - * If we aren't in a transaction any longer then ignore. + * If we already aborted then we no longer need to cancel. We + * do this here since we do not wish to ignore aborted + * subtransactions, which must cause FATAL, currently. */ - if (!IsTransactionOrTransactionBlock()) + if (IsAbortedTransactionBlockState()) return; /* - * If we can abort just the current subtransaction then we are - * OK to throw an ERROR to resolve the conflict. Otherwise - * drop through to the FATAL case. - * - * XXX other times that we can throw just an ERROR *may* be - * PROCSIG_RECOVERY_CONFLICT_LOCK if no locks are held in - * parent transactions - * - * PROCSIG_RECOVERY_CONFLICT_SNAPSHOT if no snapshots are held - * by parent transactions and the transaction is not - * transaction-snapshot mode - * - * PROCSIG_RECOVERY_CONFLICT_TABLESPACE if no temp files or - * cursors open in parent transactions + * If a recovery conflict happens while we are waiting for + * input from the client, the client is presumably just + * sitting idle in a transaction, preventing recovery from + * making progress. We'll drop through to the FATAL case + * below to dislodge it, in that case. */ - if (!IsSubTransaction()) + if (!DoingCommandRead) { - /* - * If we already aborted then we no longer need to cancel. - * We do this here since we do not wish to ignore aborted - * subtransactions, which must cause FATAL, currently. - */ - if (IsAbortedTransactionBlockState()) + /* Avoid losing sync in the FE/BE protocol. */ + if (QueryCancelHoldoffCount != 0) + { + /* + * Re-arm and defer this interrupt until later. See + * similar code in ProcessInterrupts(). + */ + RecoveryConflictPendingReasons[reason] = true; + RecoveryConflictPending = true; + InterruptPending = true; return; + } - RecoveryConflictPending = true; - QueryCancelPending = true; - InterruptPending = true; + /* + * We are cleared to throw an ERROR. Either it's the + * logical slot case, or we have a top-level transaction + * that we can abort and a conflict that isn't inherently + * non-retryable. + */ + LockErrorCleanup(); + pgstat_report_recovery_conflict(reason); + ereport(ERROR, + (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), + errmsg("canceling statement due to conflict with recovery"), + errdetail_recovery_conflict(reason))); break; } + } - /* Intentional fall through to session cancel */ - /* FALLTHROUGH */ - - case PROCSIG_RECOVERY_CONFLICT_DATABASE: - RecoveryConflictPending = true; - ProcDiePending = true; - InterruptPending = true; - break; - - case PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT: - RecoveryConflictPending = true; - QueryCancelPending = true; - InterruptPending = true; - break; + /* Intentional fall through to session cancel */ + /* FALLTHROUGH */ - default: - elog(FATAL, "unrecognized conflict mode: %d", - (int) reason); - } + case PROCSIG_RECOVERY_CONFLICT_DATABASE: - Assert(RecoveryConflictPending && (QueryCancelPending || ProcDiePending)); + /* + * Retrying is not possible because the database is dropped, or we + * decided above that we couldn't resolve the conflict with an + * ERROR and fell through. Terminate the session. + */ + pgstat_report_recovery_conflict(reason); + ereport(FATAL, + (errcode(reason == PROCSIG_RECOVERY_CONFLICT_DATABASE ? + ERRCODE_DATABASE_DROPPED : + ERRCODE_T_R_SERIALIZATION_FAILURE), + errmsg("terminating connection due to conflict with recovery"), + errdetail_recovery_conflict(reason), + errhint("In a moment you should be able to reconnect to the" + " database and repeat your command."))); + break; - /* - * All conflicts apart from database cause dynamic errors where the - * command or transaction can be retried at a later point with some - * potential for success. No need to reset this, since non-retryable - * conflict errors are currently FATAL. - */ - if (reason == PROCSIG_RECOVERY_CONFLICT_DATABASE) - RecoveryConflictRetryable = false; + default: + elog(FATAL, "unrecognized conflict mode: %d", (int) reason); } +} +/* + * Check each possible recovery conflict reason. + */ +static void +ProcessRecoveryConflictInterrupts(void) +{ /* - * Set the process latch. This function essentially emulates signal - * handlers like die() and StatementCancelHandler() and it seems prudent - * to behave similarly as they do. + * We don't need to worry about joggling the elbow of proc_exit, because + * proc_exit_prepare() holds interrupts, so ProcessInterrupts() won't call + * us. */ - SetLatch(MyLatch); + Assert(!proc_exit_inprogress); + Assert(InterruptHoldoffCount == 0); + Assert(RecoveryConflictPending); - errno = save_errno; + RecoveryConflictPending = false; + + for (ProcSignalReason reason = PROCSIG_RECOVERY_CONFLICT_FIRST; + reason <= PROCSIG_RECOVERY_CONFLICT_LAST; + reason++) + { + if (RecoveryConflictPendingReasons[reason]) + { + RecoveryConflictPendingReasons[reason] = false; + ProcessRecoveryConflictInterrupt(reason); + } + } } /* @@ -3212,7 +3287,7 @@ ProcessInterrupts(void) ereport(FATAL, (errcode(ERRCODE_QUERY_CANCELED), errmsg("canceling authentication due to timeout"))); - else if (IsAutoVacuumWorkerProcess()) + else if (AmAutoVacuumWorkerProcess()) ereport(FATAL, (errcode(ERRCODE_ADMIN_SHUTDOWN), errmsg("terminating autovacuum process due to administrator command"))); @@ -3231,25 +3306,7 @@ ProcessInterrupts(void) */ proc_exit(1); } - else if (RecoveryConflictPending && RecoveryConflictRetryable) - { - pgstat_report_recovery_conflict(RecoveryConflictReason); - ereport(FATAL, - (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), - errmsg("terminating connection due to conflict with recovery"), - errdetail_recovery_conflict())); - } - else if (RecoveryConflictPending) - { - /* Currently there is only one non-retryable recovery conflict */ - Assert(RecoveryConflictReason == PROCSIG_RECOVERY_CONFLICT_DATABASE); - pgstat_report_recovery_conflict(RecoveryConflictReason); - ereport(FATAL, - (errcode(ERRCODE_DATABASE_DROPPED), - errmsg("terminating connection due to conflict with recovery"), - errdetail_recovery_conflict())); - } - else if (IsBackgroundWorker) + else if (AmBackgroundWorkerProcess()) ereport(FATAL, (errcode(ERRCODE_ADMIN_SHUTDOWN), errmsg("terminating background worker \"%s\" due to administrator command", @@ -3291,31 +3348,13 @@ ProcessInterrupts(void) errmsg("connection to client lost"))); } - /* - * If a recovery conflict happens while we are waiting for input from the - * client, the client is presumably just sitting idle in a transaction, - * preventing recovery from making progress. Terminate the connection to - * dislodge it. - */ - if (RecoveryConflictPending && DoingCommandRead) - { - QueryCancelPending = false; /* this trumps QueryCancel */ - RecoveryConflictPending = false; - LockErrorCleanup(); - pgstat_report_recovery_conflict(RecoveryConflictReason); - ereport(FATAL, - (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), - errmsg("terminating connection due to conflict with recovery"), - errdetail_recovery_conflict(), - errhint("In a moment you should be able to reconnect to the" - " database and repeat your command."))); - } - /* * Don't allow query cancel interrupts while reading input from the * client, because we might lose sync in the FE/BE protocol. (Die * interrupts are OK, because we won't read any further messages from the * client in that case.) + * + * See similar logic in ProcessRecoveryConflictInterrupts(). */ if (QueryCancelPending && QueryCancelHoldoffCount != 0) { @@ -3367,23 +3406,13 @@ ProcessInterrupts(void) (errcode(ERRCODE_QUERY_CANCELED), errmsg("canceling statement due to statement timeout"))); } - if (IsAutoVacuumWorkerProcess()) + if (AmAutoVacuumWorkerProcess()) { LockErrorCleanup(); ereport(ERROR, (errcode(ERRCODE_QUERY_CANCELED), errmsg("canceling autovacuum task"))); } - if (RecoveryConflictPending) - { - RecoveryConflictPending = false; - LockErrorCleanup(); - pgstat_report_recovery_conflict(RecoveryConflictReason); - ereport(ERROR, - (errcode(ERRCODE_T_R_SERIALIZATION_FAILURE), - errmsg("canceling statement due to conflict with recovery"), - errdetail_recovery_conflict())); - } /* * If we are reading a command from the client, just ignore the cancel @@ -3399,30 +3428,51 @@ ProcessInterrupts(void) } } + if (RecoveryConflictPending) + ProcessRecoveryConflictInterrupts(); + if (IdleInTransactionSessionTimeoutPending) { /* * If the GUC has been reset to zero, ignore the signal. This is * important because the GUC update itself won't disable any pending - * interrupt. + * interrupt. We need to unset the flag before the injection point, + * otherwise we could loop in interrupts checking. */ + IdleInTransactionSessionTimeoutPending = false; if (IdleInTransactionSessionTimeout > 0) + { + INJECTION_POINT("idle-in-transaction-session-timeout"); ereport(FATAL, (errcode(ERRCODE_IDLE_IN_TRANSACTION_SESSION_TIMEOUT), errmsg("terminating connection due to idle-in-transaction timeout"))); - else - IdleInTransactionSessionTimeoutPending = false; + } + } + + if (TransactionTimeoutPending) + { + /* As above, ignore the signal if the GUC has been reset to zero. */ + TransactionTimeoutPending = false; + if (TransactionTimeout > 0) + { + INJECTION_POINT("transaction-timeout"); + ereport(FATAL, + (errcode(ERRCODE_TRANSACTION_TIMEOUT), + errmsg("terminating connection due to transaction timeout"))); + } } if (IdleSessionTimeoutPending) { /* As above, ignore the signal if the GUC has been reset to zero. */ + IdleSessionTimeoutPending = false; if (IdleSessionTimeout > 0) + { + INJECTION_POINT("idle-session-timeout"); ereport(FATAL, (errcode(ERRCODE_IDLE_SESSION_TIMEOUT), errmsg("terminating connection due to idle-session timeout"))); - else - IdleSessionTimeoutPending = false; + } } /* @@ -3584,7 +3634,7 @@ check_client_connection_check_interval(int *newval, void **extra, GucSource sour { if (!WaitEventSetCanReportClosed() && *newval != 0) { - GUC_check_errdetail("client_connection_check_interval must be set to 0 on this platform."); + GUC_check_errdetail("\"client_connection_check_interval\" must be set to 0 on this platform."); return false; } return true; @@ -3628,6 +3678,83 @@ check_log_stats(bool *newval, void **extra, GucSource source) return true; } +/* GUC assign hook for transaction_timeout */ +void +assign_transaction_timeout(int newval, void *extra) +{ + if (IsTransactionState()) + { + /* + * If transaction_timeout GUC has changed within the transaction block + * enable or disable the timer correspondingly. + */ + if (newval > 0 && !get_timeout_active(TRANSACTION_TIMEOUT)) + enable_timeout_after(TRANSACTION_TIMEOUT, newval); + else if (newval <= 0 && get_timeout_active(TRANSACTION_TIMEOUT)) + disable_timeout(TRANSACTION_TIMEOUT, false); + } +} + +/* + * GUC check_hook for restrict_nonsystem_relation_kind + */ +bool +check_restrict_nonsystem_relation_kind(char **newval, void **extra, GucSource source) +{ + char *rawstring; + List *elemlist; + ListCell *l; + int flags = 0; + + /* Need a modifiable copy of string */ + rawstring = pstrdup(*newval); + + if (!SplitIdentifierString(rawstring, ',', &elemlist)) + { + /* syntax error in list */ + GUC_check_errdetail("List syntax is invalid."); + pfree(rawstring); + list_free(elemlist); + return false; + } + + foreach(l, elemlist) + { + char *tok = (char *) lfirst(l); + + if (pg_strcasecmp(tok, "view") == 0) + flags |= RESTRICT_RELKIND_VIEW; + else if (pg_strcasecmp(tok, "foreign-table") == 0) + flags |= RESTRICT_RELKIND_FOREIGN_TABLE; + else + { + GUC_check_errdetail("Unrecognized key word: \"%s\".", tok); + pfree(rawstring); + list_free(elemlist); + return false; + } + } + + pfree(rawstring); + list_free(elemlist); + + /* Save the flags in *extra, for use by the assign function */ + *extra = guc_malloc(ERROR, sizeof(int)); + *((int *) *extra) = flags; + + return true; +} + +/* + * GUC assign_hook for restrict_nonsystem_relation_kind + */ +void +assign_restrict_nonsystem_relation_kind(const char *newval, void *extra) +{ + int *flags = (int *) extra; + + restrict_nonsystem_relation_kind = *flags; +} /* * set_debug_options --- apply "-d N" command line option @@ -4111,12 +4238,12 @@ PostgresSingleUserMain(int argc, char *argv[], void PostgresMain(const char *dbname, const char *username) { - int firstchar; - StringInfoData input_message; sigjmp_buf local_sigjmp_buf; + + /* these must be volatile to ensure state is preserved across longjmp: */ volatile bool send_ready_for_query = true; - bool idle_in_transaction_timeout_enabled = false; - bool idle_session_timeout_enabled = false; + volatile bool idle_in_transaction_timeout_enabled = false; + volatile bool idle_session_timeout_enabled = false; Assert(dbname != NULL); Assert(username != NULL); @@ -4191,19 +4318,17 @@ PostgresMain(const char *dbname, const char *username) * NOTE: if you are tempted to add code in this vicinity, consider putting * it inside InitPostgres() instead. In particular, anything that * involves database access should be there, not here. + * + * Honor session_preload_libraries if not dealing with a WAL sender. */ InitPostgres(dbname, InvalidOid, /* database to connect to */ username, InvalidOid, /* role to connect as */ - !am_walsender, /* honor session_preload_libraries? */ - false, /* don't ignore datallowconn */ + (!am_walsender) ? INIT_PG_LOAD_SESSION_LIBS : 0, NULL); /* no out_dbname */ /* * If the PostmasterContext is still around, recycle the space; we don't - * need it anymore after InitPostgres completes. Note this does not trash - * *MyProcPort, because ConnCreate() allocated that space with malloc() - * ... else we'd need to copy the Port data first. Also, subsidiary data - * such as the username isn't lost either; see ProcessStartupPacket(). + * need it anymore after InitPostgres completes. */ if (PostmasterContext) { @@ -4239,7 +4364,7 @@ PostgresMain(const char *dbname, const char *username) { StringInfoData buf; - pq_beginmessage(&buf, 'K'); + pq_beginmessage(&buf, PqMsg_BackendKeyData); pq_sendint32(&buf, (int32) MyProcPid); pq_sendint32(&buf, (int32) MyCancelKey); pq_endmessage(&buf); @@ -4273,6 +4398,9 @@ PostgresMain(const char *dbname, const char *username) initStringInfo(&row_description_buf); MemoryContextSwitchTo(TopMemoryContext); + /* Fire any defined login event triggers, if appropriate */ + EventTriggerOnLogin(); + /* * POSTGRES main processing loop begins here * @@ -4322,8 +4450,10 @@ PostgresMain(const char *dbname, const char *username) * query cancels from being misreported as timeouts in case we're * forgetting a timeout cancel. */ - disable_all_timeouts(false); - QueryCancelPending = false; /* second to avoid race condition */ + disable_all_timeouts(false); /* do first to avoid race condition */ + QueryCancelPending = false; + idle_in_transaction_timeout_enabled = false; + idle_session_timeout_enabled = false; /* Not reading from the client anymore. */ DoingCommandRead = false; @@ -4367,7 +4497,7 @@ PostgresMain(const char *dbname, const char *username) ReplicationSlotRelease(); /* We also want to cleanup temporary slots on error. */ - ReplicationSlotCleanup(); + ReplicationSlotCleanup(false); jit_reset_after_error(); @@ -4418,6 +4548,9 @@ PostgresMain(const char *dbname, const char *username) for (;;) { + int firstchar; + StringInfoData input_message; + /* * At top of loop, reset extended-query-message flag, so that any * errors encountered in "idle" state don't provoke skip. @@ -4436,7 +4569,7 @@ PostgresMain(const char *dbname, const char *username) * query input buffer in the cleared MessageContext. */ MemoryContextSwitchTo(MessageContext); - MemoryContextResetAndDeleteChildren(MessageContext); + MemoryContextReset(MessageContext); initStringInfo(&input_message); @@ -4470,7 +4603,8 @@ PostgresMain(const char *dbname, const char *username) pgstat_report_activity(STATE_IDLEINTRANSACTION_ABORTED, NULL); /* Start the idle-in-transaction timer */ - if (IdleInTransactionSessionTimeout > 0) + if (IdleInTransactionSessionTimeout > 0 + && (IdleInTransactionSessionTimeout < TransactionTimeout || TransactionTimeout == 0)) { idle_in_transaction_timeout_enabled = true; enable_timeout_after(IDLE_IN_TRANSACTION_SESSION_TIMEOUT, @@ -4483,7 +4617,8 @@ PostgresMain(const char *dbname, const char *username) pgstat_report_activity(STATE_IDLEINTRANSACTION, NULL); /* Start the idle-in-transaction timer */ - if (IdleInTransactionSessionTimeout > 0) + if (IdleInTransactionSessionTimeout > 0 + && (IdleInTransactionSessionTimeout < TransactionTimeout || TransactionTimeout == 0)) { idle_in_transaction_timeout_enabled = true; enable_timeout_after(IDLE_IN_TRANSACTION_SESSION_TIMEOUT, @@ -4613,7 +4748,7 @@ PostgresMain(const char *dbname, const char *username) switch (firstchar) { - case 'Q': /* simple query */ + case PqMsg_Query: { const char *query_string; @@ -4637,7 +4772,7 @@ PostgresMain(const char *dbname, const char *username) } break; - case 'P': /* parse */ + case PqMsg_Parse: { const char *stmt_name; const char *query_string; @@ -4667,7 +4802,7 @@ PostgresMain(const char *dbname, const char *username) } break; - case 'B': /* bind */ + case PqMsg_Bind: forbidden_in_wal_sender(firstchar); /* Set statement_timestamp() */ @@ -4682,7 +4817,7 @@ PostgresMain(const char *dbname, const char *username) /* exec_bind_message does valgrind_report_error_query */ break; - case 'E': /* execute */ + case PqMsg_Execute: { const char *portal_name; int max_rows; @@ -4702,7 +4837,7 @@ PostgresMain(const char *dbname, const char *username) } break; - case 'F': /* fastpath function call */ + case PqMsg_FunctionCall: forbidden_in_wal_sender(firstchar); /* Set statement_timestamp() */ @@ -4737,7 +4872,7 @@ PostgresMain(const char *dbname, const char *username) send_ready_for_query = true; break; - case 'C': /* close */ + case PqMsg_Close: { int close_type; const char *close_target; @@ -4777,13 +4912,13 @@ PostgresMain(const char *dbname, const char *username) } if (whereToSendOutput == DestRemote) - pq_putemptymessage('3'); /* CloseComplete */ + pq_putemptymessage(PqMsg_CloseComplete); valgrind_report_error_query("CLOSE message"); } break; - case 'D': /* describe */ + case PqMsg_Describe: { int describe_type; const char *describe_target; @@ -4817,13 +4952,13 @@ PostgresMain(const char *dbname, const char *username) } break; - case 'H': /* flush */ + case PqMsg_Flush: pq_getmsgend(&input_message); if (whereToSendOutput == DestRemote) pq_flush(); break; - case 'S': /* sync */ + case PqMsg_Sync: pq_getmsgend(&input_message); finish_xact_command(); valgrind_report_error_query("SYNC message"); @@ -4831,9 +4966,9 @@ PostgresMain(const char *dbname, const char *username) break; /* - * 'X' means that the frontend is closing down the socket. EOF - * means unexpected loss of frontend connection. Either way, - * perform normal shutdown. + * PqMsg_Terminate means that the frontend is closing down the + * socket. EOF means unexpected loss of frontend connection. + * Either way, perform normal shutdown. */ case EOF: @@ -4842,7 +4977,7 @@ PostgresMain(const char *dbname, const char *username) /* FALLTHROUGH */ - case 'X': + case PqMsg_Terminate: /* * Reset whereToSendOutput to prevent ereport from attempting @@ -4860,9 +4995,9 @@ PostgresMain(const char *dbname, const char *username) */ proc_exit(0); - case 'd': /* copy data */ - case 'c': /* copy done */ - case 'f': /* copy fail */ + case PqMsg_CopyData: + case PqMsg_CopyDone: + case PqMsg_CopyFail: /* * Accept but ignore these messages, per protocol spec; we @@ -4892,7 +5027,7 @@ forbidden_in_wal_sender(char firstchar) { if (am_walsender) { - if (firstchar == 'F') + if (firstchar == PqMsg_FunctionCall) ereport(ERROR, (errcode(ERRCODE_PROTOCOL_VIOLATION), errmsg("fastpath function calls not supported in a replication connection"))); @@ -5099,7 +5234,8 @@ enable_statement_timeout(void) /* must be within an xact */ Assert(xact_started); - if (StatementTimeout > 0) + if (StatementTimeout > 0 + && (StatementTimeout < TransactionTimeout || TransactionTimeout == 0)) { if (!get_timeout_active(STATEMENT_TIMEOUT)) enable_timeout_after(STATEMENT_TIMEOUT, StatementTimeout); diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index 5565f200c3dd6..0a7200682399e 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -3,7 +3,7 @@ * pquery.c * POSTGRES process query command code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -670,6 +670,8 @@ PortalSetResultFormat(Portal portal, int nFormats, int16 *formats) * isTopLevel: true if query is being executed at backend "top level" * (that is, directly from a client command message) * + * run_once: ignored, present only to avoid an API break in stable branches. + * * dest: where to send output of primary (canSetTag) query * * altdest: where to send output of non-primary queries @@ -714,10 +716,6 @@ PortalRun(Portal portal, long count, bool isTopLevel, bool run_once, */ MarkPortalActive(portal); - /* Set run_once flag. Shouldn't be clear if previously set. */ - Assert(!portal->run_once || run_once); - portal->run_once = run_once; - /* * Set up global portal context pointers. * @@ -922,7 +920,7 @@ PortalRunSelect(Portal portal, { PushActiveSnapshot(queryDesc->snapshot); ExecutorRun(queryDesc, direction, (uint64) count, - portal->run_once); + false); nprocessed = queryDesc->estate->es_processed; PopActiveSnapshot(); } @@ -962,7 +960,7 @@ PortalRunSelect(Portal portal, { PushActiveSnapshot(queryDesc->snapshot); ExecutorRun(queryDesc, direction, (uint64) count, - portal->run_once); + false); nprocessed = queryDesc->estate->es_processed; PopActiveSnapshot(); } @@ -1406,9 +1404,6 @@ PortalRunFetch(Portal portal, */ MarkPortalActive(portal); - /* If supporting FETCH, portal can't be run-once. */ - Assert(!portal->run_once); - /* * Set up global portal context pointers. */ diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 30b51bf4d30b0..fa66b8017edea 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -5,7 +5,7 @@ * commands. At one time acted as an interface between the Lisp and C * systems. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -16,13 +16,10 @@ */ #include "postgres.h" -#include "access/htup_details.h" #include "access/reloptions.h" #include "access/twophase.h" #include "access/xact.h" #include "access/xlog.h" -#include "catalog/catalog.h" -#include "catalog/index.h" #include "catalog/namespace.h" #include "catalog/pg_authid.h" #include "catalog/pg_inherits.h" @@ -63,15 +60,11 @@ #include "parser/parse_utilcmd.h" #include "postmaster/bgwriter.h" #include "rewrite/rewriteDefine.h" -#include "rewrite/rewriteRemove.h" #include "storage/fd.h" -#include "tcop/pquery.h" #include "tcop/utility.h" #include "utils/acl.h" #include "utils/guc.h" #include "utils/lsyscache.h" -#include "utils/rel.h" -#include "utils/syscache.h" /* Hook for plugins to get control in ProcessUtility() */ ProcessUtility_hook_type ProcessUtility_hook = NULL; @@ -950,6 +943,7 @@ standard_ProcessUtility(PlannedStmt *pstmt, if (!has_privs_of_role(GetUserId(), ROLE_PG_CHECKPOINT)) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + /* translator: %s is name of a SQL command, eg CHECKPOINT */ errmsg("permission denied to execute %s command", "CHECKPOINT"), errdetail("Only roles with privileges of the \"%s\" role may execute this command.", @@ -959,10 +953,6 @@ standard_ProcessUtility(PlannedStmt *pstmt, (RecoveryInProgress() ? 0 : CHECKPOINT_FORCE)); break; - case T_ReindexStmt: - ExecReindex(pstate, (ReindexStmt *) parsetree, isTopLevel); - break; - /* * The following statements are supported by Event Triggers only * in some cases, so we "fast path" them in the other cases. @@ -1573,6 +1563,13 @@ ProcessUtilitySlow(ParseState *pstate, } break; + case T_ReindexStmt: + ExecReindex(pstate, (ReindexStmt *) parsetree, isTopLevel); + + /* EventTriggerCollectSimpleCommand is called directly */ + commandCollected = true; + break; + case T_CreateExtensionStmt: address = CreateExtension(pstate, (CreateExtensionStmt *) parsetree); break; @@ -2141,11 +2138,10 @@ QueryReturnsTuples(Query *parsetree) case CMD_SELECT: /* returns tuples */ return true; - case CMD_MERGE: - return false; case CMD_INSERT: case CMD_UPDATE: case CMD_DELETE: + case CMD_MERGE: /* the forms with RETURNING return tuples */ if (parsetree->returningList) return true; diff --git a/src/backend/tsearch/Makefile b/src/backend/tsearch/Makefile index 2bc8b2668d720..2e4286dd50cb5 100644 --- a/src/backend/tsearch/Makefile +++ b/src/backend/tsearch/Makefile @@ -2,7 +2,7 @@ # # Makefile for backend/tsearch # -# Copyright (c) 2006-2023, PostgreSQL Global Development Group +# Copyright (c) 2006-2024, PostgreSQL Global Development Group # # src/backend/tsearch/Makefile # diff --git a/src/backend/tsearch/dict.c b/src/backend/tsearch/dict.c index d484c9d9a26d2..e89f508213918 100644 --- a/src/backend/tsearch/dict.c +++ b/src/backend/tsearch/dict.c @@ -3,7 +3,7 @@ * dict.c * Standard interface to dictionary * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -15,7 +15,7 @@ #include "catalog/pg_type.h" #include "tsearch/ts_cache.h" -#include "tsearch/ts_utils.h" +#include "tsearch/ts_public.h" #include "utils/array.h" #include "utils/builtins.h" diff --git a/src/backend/tsearch/dict_ispell.c b/src/backend/tsearch/dict_ispell.c index 3ef8d294aff56..07b9ad794de08 100644 --- a/src/backend/tsearch/dict_ispell.c +++ b/src/backend/tsearch/dict_ispell.c @@ -3,7 +3,7 @@ * dict_ispell.c * Ispell dictionary interface * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -16,8 +16,8 @@ #include "commands/defrem.h" #include "tsearch/dicts/spell.h" #include "tsearch/ts_locale.h" -#include "tsearch/ts_utils.h" -#include "utils/builtins.h" +#include "tsearch/ts_public.h" +#include "utils/fmgrprotos.h" typedef struct diff --git a/src/backend/tsearch/dict_simple.c b/src/backend/tsearch/dict_simple.c index a0149a0d5eb72..b0c9fd7946fc0 100644 --- a/src/backend/tsearch/dict_simple.c +++ b/src/backend/tsearch/dict_simple.c @@ -3,7 +3,7 @@ * dict_simple.c * Simple dictionary: just lowercase and check for stopword * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -15,8 +15,8 @@ #include "commands/defrem.h" #include "tsearch/ts_locale.h" -#include "tsearch/ts_utils.h" -#include "utils/builtins.h" +#include "tsearch/ts_public.h" +#include "utils/fmgrprotos.h" typedef struct diff --git a/src/backend/tsearch/dict_synonym.c b/src/backend/tsearch/dict_synonym.c index c7cf7c04b6035..77cd511ee51ec 100644 --- a/src/backend/tsearch/dict_synonym.c +++ b/src/backend/tsearch/dict_synonym.c @@ -3,7 +3,7 @@ * dict_synonym.c * Synonym dictionary: replace word by its synonym * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -15,8 +15,8 @@ #include "commands/defrem.h" #include "tsearch/ts_locale.h" -#include "tsearch/ts_utils.h" -#include "utils/builtins.h" +#include "tsearch/ts_public.h" +#include "utils/fmgrprotos.h" typedef struct { diff --git a/src/backend/tsearch/dict_thesaurus.c b/src/backend/tsearch/dict_thesaurus.c index 80402e99375a1..259f2e9901d85 100644 --- a/src/backend/tsearch/dict_thesaurus.c +++ b/src/backend/tsearch/dict_thesaurus.c @@ -3,7 +3,7 @@ * dict_thesaurus.c * Thesaurus dictionary: phrase to phrase substitution * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -17,8 +17,8 @@ #include "commands/defrem.h" #include "tsearch/ts_cache.h" #include "tsearch/ts_locale.h" -#include "tsearch/ts_utils.h" -#include "utils/builtins.h" +#include "tsearch/ts_public.h" +#include "utils/fmgrprotos.h" #include "utils/regproc.h" diff --git a/src/backend/tsearch/meson.build b/src/backend/tsearch/meson.build index fb612f94d5506..1df7f6fcdae62 100644 --- a/src/backend/tsearch/meson.build +++ b/src/backend/tsearch/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'dict.c', diff --git a/src/backend/tsearch/regis.c b/src/backend/tsearch/regis.c index 0c74c6d0c1c5f..0390a097004c6 100644 --- a/src/backend/tsearch/regis.c +++ b/src/backend/tsearch/regis.c @@ -3,7 +3,7 @@ * regis.c * Fast regex subset * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/tsearch/spell.c b/src/backend/tsearch/spell.c index 8a2cb55876921..b6918a3984a8e 100644 --- a/src/backend/tsearch/spell.c +++ b/src/backend/tsearch/spell.c @@ -3,7 +3,7 @@ * spell.c * Normalizing word with ISpell * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * Ispell dictionary * ----------------- @@ -374,6 +374,7 @@ getNextFlagFromString(IspellDict *Conf, char **sflagset, char *sflag) stop = (maxstep == 0); break; case FM_NUM: + errno = 0; s = strtol(*sflagset, &next, 10); if (*sflagset == next || errno == ERANGE) ereport(ERROR, @@ -1036,6 +1037,7 @@ setCompoundAffixFlagValue(IspellDict *Conf, CompoundAffixFlag *entry, char *next; int i; + errno = 0; i = strtol(s, &next, 10); if (s == next || errno == ERANGE) ereport(ERROR, @@ -1163,6 +1165,7 @@ getAffixFlagSet(IspellDict *Conf, char *s) int curaffix; char *end; + errno = 0; curaffix = strtol(s, &end, 10); if (s == end || errno == ERANGE) ereport(ERROR, @@ -1735,6 +1738,7 @@ NISortDictionary(IspellDict *Conf) if (*Conf->Spell[i]->p.flag != '\0') { + errno = 0; curaffix = strtol(Conf->Spell[i]->p.flag, &end, 10); if (Conf->Spell[i]->p.flag == end || errno == ERANGE) ereport(ERROR, diff --git a/src/backend/tsearch/to_tsany.c b/src/backend/tsearch/to_tsany.c index 3b6d41f9e8ed3..88cba58cbab09 100644 --- a/src/backend/tsearch/to_tsany.c +++ b/src/backend/tsearch/to_tsany.c @@ -3,7 +3,7 @@ * to_tsany.c * to_ts* function definitions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -13,7 +13,6 @@ */ #include "postgres.h" -#include "common/jsonapi.h" #include "tsearch/ts_cache.h" #include "tsearch/ts_utils.h" #include "utils/builtins.h" @@ -252,6 +251,8 @@ to_tsvector_byid(PG_FUNCTION_ARGS) * number */ if (prs.lenwords < 2) prs.lenwords = 2; + else if (prs.lenwords > MaxAllocSize / sizeof(ParsedWord)) + prs.lenwords = MaxAllocSize / sizeof(ParsedWord); prs.curwords = 0; prs.pos = 0; prs.words = (ParsedWord *) palloc(sizeof(ParsedWord) * prs.lenwords); diff --git a/src/backend/tsearch/ts_locale.c b/src/backend/tsearch/ts_locale.c index f1150d30b71d1..bc44599de6aa5 100644 --- a/src/backend/tsearch/ts_locale.c +++ b/src/backend/tsearch/ts_locale.c @@ -3,7 +3,7 @@ * ts_locale.c * locale compatibility layer for tsearch * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -13,11 +13,9 @@ */ #include "postgres.h" -#include "catalog/pg_collation.h" #include "common/string.h" #include "storage/fd.h" #include "tsearch/ts_locale.h" -#include "tsearch/ts_public.h" static void tsearch_readline_callback(void *arg); diff --git a/src/backend/tsearch/ts_parse.c b/src/backend/tsearch/ts_parse.c index c347129009e62..517f200a9b451 100644 --- a/src/backend/tsearch/ts_parse.c +++ b/src/backend/tsearch/ts_parse.c @@ -3,7 +3,7 @@ * ts_parse.c * main parse functions for tsearch * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/tsearch/ts_selfuncs.c b/src/backend/tsearch/ts_selfuncs.c index 92afc67a5c4e3..c549231dc617a 100644 --- a/src/backend/tsearch/ts_selfuncs.c +++ b/src/backend/tsearch/ts_selfuncs.c @@ -3,7 +3,7 @@ * ts_selfuncs.c * Selectivity estimation functions for text search operators. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -19,10 +19,9 @@ #include "miscadmin.h" #include "nodes/nodes.h" #include "tsearch/ts_type.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/lsyscache.h" #include "utils/selfuncs.h" -#include "utils/syscache.h" /* diff --git a/src/backend/tsearch/ts_typanalyze.c b/src/backend/tsearch/ts_typanalyze.c index 75ecd72efe1e8..ccafe42729764 100644 --- a/src/backend/tsearch/ts_typanalyze.c +++ b/src/backend/tsearch/ts_typanalyze.c @@ -3,7 +3,7 @@ * ts_typanalyze.c * functions for gathering statistics from tsvector columns * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -58,16 +58,14 @@ Datum ts_typanalyze(PG_FUNCTION_ARGS) { VacAttrStats *stats = (VacAttrStats *) PG_GETARG_POINTER(0); - Form_pg_attribute attr = stats->attr; /* If the attstattarget column is negative, use the default value */ - /* NB: it is okay to scribble on stats->attr since it's a copy */ - if (attr->attstattarget < 0) - attr->attstattarget = default_statistics_target; + if (stats->attstattarget < 0) + stats->attstattarget = default_statistics_target; stats->compute_stats = compute_tsvector_stats; /* see comment about the choice of minrows in commands/analyze.c */ - stats->minrows = 300 * attr->attstattarget; + stats->minrows = 300 * stats->attstattarget; PG_RETURN_BOOL(true); } @@ -169,7 +167,7 @@ compute_tsvector_stats(VacAttrStats *stats, * the number of individual lexeme values tracked in pg_statistic ought to * be more than the number of values for a simple scalar column. */ - num_mcelem = stats->attr->attstattarget * 10; + num_mcelem = stats->attstattarget * 10; /* * We set bucket width equal to (num_mcelem + 10) / 0.007 as per the diff --git a/src/backend/tsearch/ts_utils.c b/src/backend/tsearch/ts_utils.c index 7c4c2a91123d5..81967d29e9aad 100644 --- a/src/backend/tsearch/ts_utils.c +++ b/src/backend/tsearch/ts_utils.c @@ -3,7 +3,7 @@ * ts_utils.c * various support functions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -18,7 +18,7 @@ #include "miscadmin.h" #include "tsearch/ts_locale.h" -#include "tsearch/ts_utils.h" +#include "tsearch/ts_public.h" /* diff --git a/src/backend/tsearch/wparser.c b/src/backend/tsearch/wparser.c index ca9dd4ae2dfa2..bc9fb38426c66 100644 --- a/src/backend/tsearch/wparser.c +++ b/src/backend/tsearch/wparser.c @@ -3,7 +3,7 @@ * wparser.c * Standard interface to word parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -14,13 +14,11 @@ #include "postgres.h" #include "catalog/namespace.h" -#include "catalog/pg_type.h" #include "commands/defrem.h" -#include "common/jsonapi.h" #include "funcapi.h" #include "tsearch/ts_cache.h" #include "tsearch/ts_utils.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/jsonfuncs.h" #include "utils/varlena.h" diff --git a/src/backend/tsearch/wparser_def.c b/src/backend/tsearch/wparser_def.c index fb80fdd63f237..d445c623c5ac1 100644 --- a/src/backend/tsearch/wparser_def.c +++ b/src/backend/tsearch/wparser_def.c @@ -3,7 +3,7 @@ * wparser_def.c * Default text search parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -15,15 +15,16 @@ #include "postgres.h" #include +#include -#include "catalog/pg_collation.h" #include "commands/defrem.h" +#include "mb/pg_wchar.h" #include "miscadmin.h" -#include "tsearch/ts_locale.h" #include "tsearch/ts_public.h" #include "tsearch/ts_type.h" #include "tsearch/ts_utils.h" #include "utils/builtins.h" +#include "utils/pg_locale.h" /* Define me to enable tracing of parser behavior */ @@ -2670,19 +2671,19 @@ prsd_headline(PG_FUNCTION_ARGS) if (min_words >= max_words) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("MinWords should be less than MaxWords"))); + errmsg("%s must be less than %s", "MinWords", "MaxWords"))); if (min_words <= 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("MinWords should be positive"))); + errmsg("%s must be positive", "MinWords"))); if (shortword < 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("ShortWord should be >= 0"))); + errmsg("%s must be >= 0", "ShortWord"))); if (max_fragments < 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("MaxFragments should be >= 0"))); + errmsg("%s must be >= 0", "MaxFragments"))); } /* Locate words and phrases matching the query */ diff --git a/src/backend/utils/Gen_dummy_probes.pl b/src/backend/utils/Gen_dummy_probes.pl index f289b19344bee..137f58b85b628 100644 --- a/src/backend/utils/Gen_dummy_probes.pl +++ b/src/backend/utils/Gen_dummy_probes.pl @@ -1,259 +1,28 @@ -#! /usr/bin/perl -w #------------------------------------------------------------------------- +# Perl script to create dummy probes.h file when dtrace is not available # -# Gen_dummy_probes.pl -# Perl script that generates probes.h file when dtrace is not available -# -# Portions Copyright (c) 2008-2023, PostgreSQL Global Development Group -# -# -# IDENTIFICATION -# src/backend/utils/Gen_dummy_probes.pl -# -# This program was generated by running perl's s2p over Gen_dummy_probes.sed +# Copyright (c) 2008-2024, PostgreSQL Global Development Group # +# src/backend/utils/Gen_dummy_probes.pl #------------------------------------------------------------------------- -# turn off perlcritic for autogenerated code -## no critic - -$0 =~ s/^.*?(\w+)[\.\w+]*$/$1/; - use strict; -use Symbol; -use vars qw{ $isEOF $Hold %wFiles @Q $CondReg - $doAutoPrint $doOpenWrite $doPrint }; -$doAutoPrint = 1; -$doOpenWrite = 1; - -# prototypes -sub openARGV(); -sub getsARGV(;\$); -sub eofARGV(); -sub printQ(); - -# Run: the sed loop reading input and applying the script -# -sub Run() -{ - my ($h, $icnt, $s, $n); - - # hack (not unbreakable :-/) to avoid // matching an empty string - my $z = "\000"; - $z =~ /$z/; - - # Initialize. - openARGV(); - $Hold = ''; - $CondReg = 0; - $doPrint = $doAutoPrint; - CYCLE: - while (getsARGV()) - { - chomp(); - $CondReg = 0; # cleared on t - BOS:; - - # /^[ ]*probe /!d - unless (m /^[ \t]*probe /s) - { - $doPrint = 0; - goto EOS; - } - - # s/^[ ]*probe \([^(]*\)\(.*\);/\1\2/ - { - $s = s /^[ \t]*probe ([^(]*)(.*);/${1}${2}/s; - $CondReg ||= $s; - } - - # s/__/_/g - { - $s = s /__/_/sg; - $CondReg ||= $s; - } - - # y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ - { y{abcdefghijklmnopqrstuvwxyz}{ABCDEFGHIJKLMNOPQRSTUVWXYZ}; } - - # s/^/#define TRACE_POSTGRESQL_/ - { - $s = s /^/#define TRACE_POSTGRESQL_/s; - $CondReg ||= $s; - } - - # s/([^,)]\{1,\})/(INT1)/ - { - $s = s /\([^,)]+\)/(INT1)/s; - $CondReg ||= $s; - } - - # s/([^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2)/ - { - $s = s /\([^,)]+, [^,)]+\)/(INT1, INT2)/s; - $CondReg ||= $s; - } - - # s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3)/ - { - $s = s /\([^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3)/s; - $CondReg ||= $s; - } - - # s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4)/ - { - $s = - s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4)/s; - $CondReg ||= $s; - } - - # s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5)/ - { - $s = - s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4, INT5)/s; - $CondReg ||= $s; - } - - # s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6)/ - { - $s = - s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4, INT5, INT6)/s; - $CondReg ||= $s; - } - - # s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6, INT7)/ - { - $s = - s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4, INT5, INT6, INT7)/s; - $CondReg ||= $s; - } - - # s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6, INT7, INT8)/ - { - $s = - s /\([^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+, [^,)]+\)/(INT1, INT2, INT3, INT4, INT5, INT6, INT7, INT8)/s; - $CondReg ||= $s; - } - - # s/$/ do {} while (0)/ - { - $s = s /$/ do {} while (0)/s; - $CondReg ||= $s; - } - - # P - { - if (/^(.*)/) { print $1, "\n"; } - } - - # s/(.*$/_ENABLED() (0)/ - { - $s = s /\(.*$/_ENABLED() (0)/s; - $CondReg ||= $s; - } - EOS: if ($doPrint) - { - print $_, "\n"; - } - else - { - $doPrint = $doAutoPrint; - } - printQ() if @Q; - } - - exit(0); -} -Run(); - -# openARGV: open 1st input file -# -sub openARGV() -{ - unshift(@ARGV, '-') unless @ARGV; - my $file = shift(@ARGV); - open(ARG, "<$file") - || die("$0: can't open $file for reading ($!)\n"); - $isEOF = 0; -} - -# getsARGV: Read another input line into argument (default: $_). -# Move on to next input file, and reset EOF flag $isEOF. -sub getsARGV(;\$) -{ - my $argref = @_ ? shift() : \$_; - while ($isEOF || !defined($$argref = )) - { - close(ARG); - return 0 unless @ARGV; - my $file = shift(@ARGV); - open(ARG, "<$file") - || die("$0: can't open $file for reading ($!)\n"); - $isEOF = 0; - } - 1; -} - -# eofARGV: end-of-file test -# -sub eofARGV() -{ - return @ARGV == 0 && ($isEOF = eof(ARG)); -} - -# makeHandle: Generates another file handle for some file (given by its path) -# to be written due to a w command or an s command's w flag. -sub makeHandle($) -{ - my ($path) = @_; - my $handle; - if (!exists($wFiles{$path}) || $wFiles{$path} eq '') - { - $handle = $wFiles{$path} = gensym(); - if ($doOpenWrite) - { - if (!open($handle, ">$path")) - { - die("$0: can't open $path for writing: ($!)\n"); - } - } - } - else - { - $handle = $wFiles{$path}; - } - return $handle; -} - -# printQ: Print queued output which is either a string or a reference -# to a pathname. -sub printQ() -{ - for my $q (@Q) - { - if (ref($q)) - { - - # flush open w files so that reading this file gets it all - if (exists($wFiles{$$q}) && $wFiles{$$q} ne '') - { - open($wFiles{$$q}, ">>$$q"); - } - - # copy file to stdout: slow, but safe - if (open(RF, "<$$q")) - { - while (defined(my $line = )) - { - print $line; - } - close(RF); - } - } - else - { - print $q; - } - } - undef(@Q); -} +use warnings FATAL => 'all'; + +m/^\s*probe / || next; +s/^\s*probe ([^(]*)(.*);/$1$2/; +s/__/_/g; +y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/; +s/^/#define TRACE_POSTGRESQL_/; +s/\([^,)]{1,}\)/(INT1)/; +s/\([^,)]{1,}, [^,)]{1,}\)/(INT1, INT2)/; +s/\([^,)]{1,}, [^,)]{1,}, [^,)]{1,}\)/(INT1, INT2, INT3)/; +s/\([^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}\)/(INT1, INT2, INT3, INT4)/; +s/\([^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}\)/(INT1, INT2, INT3, INT4, INT5)/; +s/\([^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}\)/(INT1, INT2, INT3, INT4, INT5, INT6)/; +s/\([^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}\)/(INT1, INT2, INT3, INT4, INT5, INT6, INT7)/; +s/\([^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}, [^,)]{1,}\)/(INT1, INT2, INT3, INT4, INT5, INT6, INT7, INT8)/; +s/$/ do {} while (0)/; +print; +s/\(.*$/_ENABLED() (0)/; +print; diff --git a/src/backend/utils/Gen_dummy_probes.pl.prolog b/src/backend/utils/Gen_dummy_probes.pl.prolog deleted file mode 100644 index f5210d684c0ac..0000000000000 --- a/src/backend/utils/Gen_dummy_probes.pl.prolog +++ /dev/null @@ -1,19 +0,0 @@ -#! /usr/bin/perl -w -#------------------------------------------------------------------------- -# -# Gen_dummy_probes.pl -# Perl script that generates probes.h file when dtrace is not available -# -# Portions Copyright (c) 2008-2023, PostgreSQL Global Development Group -# -# -# IDENTIFICATION -# src/backend/utils/Gen_dummy_probes.pl -# -# This program was generated by running perl's s2p over Gen_dummy_probes.sed -# -#------------------------------------------------------------------------- - -# turn off perlcritic for autogenerated code -## no critic - diff --git a/src/backend/utils/Gen_dummy_probes.sed b/src/backend/utils/Gen_dummy_probes.sed deleted file mode 100644 index bfc6630628dea..0000000000000 --- a/src/backend/utils/Gen_dummy_probes.sed +++ /dev/null @@ -1,24 +0,0 @@ -#------------------------------------------------------------------------- -# sed script to create dummy probes.h file when dtrace is not available -# -# Copyright (c) 2008-2023, PostgreSQL Global Development Group -# -# src/backend/utils/Gen_dummy_probes.sed -#------------------------------------------------------------------------- - -/^[ ]*probe /!d -s/^[ ]*probe \([^(]*\)\(.*\);/\1\2/ -s/__/_/g -y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ -s/^/#define TRACE_POSTGRESQL_/ -s/([^,)]\{1,\})/(INT1)/ -s/([^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2)/ -s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3)/ -s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4)/ -s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5)/ -s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6)/ -s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6, INT7)/ -s/([^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\}, [^,)]\{1,\})/(INT1, INT2, INT3, INT4, INT5, INT6, INT7, INT8)/ -s/$/ do {} while (0)/ -P -s/(.*$/_ENABLED() (0)/ diff --git a/src/backend/utils/Gen_fmgrtab.pl b/src/backend/utils/Gen_fmgrtab.pl index 764216c56dd39..37628a85c73c3 100644 --- a/src/backend/utils/Gen_fmgrtab.pl +++ b/src/backend/utils/Gen_fmgrtab.pl @@ -5,7 +5,7 @@ # Perl script that generates fmgroids.h, fmgrprotos.h, and fmgrtab.c # from pg_proc.dat # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # @@ -17,7 +17,7 @@ use Catalog; use strict; -use warnings; +use warnings FATAL => 'all'; use Getopt::Long; my $output_path = ''; @@ -109,7 +109,7 @@ * These macros can be used to avoid a catalog lookup when a specific * fmgr-callable function needs to be referenced. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * NOTES @@ -140,7 +140,7 @@ * fmgrprotos.h * Prototypes for built-in functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * NOTES @@ -166,7 +166,7 @@ * fmgrtab.c * The function manager's table of internal functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * NOTES diff --git a/src/backend/utils/Makefile b/src/backend/utils/Makefile index deb901609f65a..394c130d64fcd 100644 --- a/src/backend/utils/Makefile +++ b/src/backend/utils/Makefile @@ -2,7 +2,7 @@ # # Makefile for backend/utils # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/backend/utils/Makefile @@ -34,13 +34,14 @@ catalogdir = $(top_srcdir)/src/backend/catalog include $(top_srcdir)/src/backend/common.mk -all: distprep probes.h generated-header-symlinks +all: probes.h generated-header-symlinks -distprep: fmgr-stamp errcodes.h +.PHONY: generated-header-symlinks submake-adt-headers -.PHONY: generated-header-symlinks +generated-header-symlinks: $(top_builddir)/src/include/utils/header-stamp submake-adt-headers -generated-header-symlinks: $(top_builddir)/src/include/utils/header-stamp $(top_builddir)/src/include/utils/probes.h +submake-adt-headers: + $(MAKE) -C adt jsonpath_gram.h $(SUBDIRS:%=%-recursive): fmgr-stamp errcodes.h @@ -62,37 +63,19 @@ probes.h: postprocess_dtrace.sed probes.h.tmp probes.h.tmp: probes.d $(DTRACE) -C -h -s $< -o $@ else -probes.h: Gen_dummy_probes.sed probes.d - sed -f $^ >$@ +probes.h: Gen_dummy_probes.pl probes.d + $(PERL) -n $^ >$@ endif -# These generated headers must be symlinked into builddir/src/include/, -# using absolute links for the reasons explained in src/backend/Makefile. +# These generated headers must be symlinked into src/include/. # We use header-stamp to record that we've done this because the symlinks # themselves may appear older than fmgr-stamp. -$(top_builddir)/src/include/utils/header-stamp: fmgr-stamp errcodes.h - prereqdir=`cd '$(dir $<)' >/dev/null && pwd` && \ - cd '$(dir $@)' && for file in fmgroids.h fmgrprotos.h errcodes.h; do \ - rm -f $$file && $(LN_S) "$$prereqdir/$$file" . ; \ +$(top_builddir)/src/include/utils/header-stamp: fmgr-stamp errcodes.h probes.h + cd '$(dir $@)' && for file in fmgroids.h fmgrprotos.h errcodes.h probes.h; do \ + rm -f $$file && $(LN_S) "../../../$(subdir)/$$file" . ; \ done touch $@ -# probes.h is handled differently because it's not in the distribution tarball. -$(top_builddir)/src/include/utils/probes.h: probes.h - cd '$(dir $@)' && rm -f $(notdir $@) && \ - $(LN_S) "../../../$(subdir)/probes.h" . - -# Recipe for rebuilding the Perl version of Gen_dummy_probes -# Nothing depends on it, so it will never be called unless explicitly requested -# The last two lines of the recipe format the script according to our -# standard and put back some blank lines for improved readability. -Gen_dummy_probes.pl: Gen_dummy_probes.sed Gen_dummy_probes.pl.prolog - cp $(srcdir)/Gen_dummy_probes.pl.prolog $@ - s2p -f $< | sed -e 1,3d -e '/# #/ d' -e '$$d' >> $@ - perltidy --profile=$(srcdir)/../../tools/pgindent/perltidyrc $@ - perl -pi -e '!$$lb && ( /^\t+#/ || /^# prototypes/ ) && print qq{\n};'\ - -e '$$lb = m/^\n/; ' $@ - .PHONY: install-data install-data: errcodes.txt installdirs $(INSTALL_DATA) $(srcdir)/errcodes.txt '$(DESTDIR)$(datadir)/errcodes.txt' @@ -104,10 +87,6 @@ installdirs: uninstall-data: rm -f $(addprefix '$(DESTDIR)$(datadir)'/, errcodes.txt) -# fmgroids.h, fmgrprotos.h, fmgrtab.c, fmgr-stamp, and errcodes.h are in the -# distribution tarball, so they are not cleaned here. clean: rm -f probes.h probes.h.tmp - -maintainer-clean: clean rm -f fmgroids.h fmgrprotos.h fmgrtab.c fmgr-stamp errcodes.h diff --git a/src/backend/utils/README.Gen_dummy_probes b/src/backend/utils/README.Gen_dummy_probes deleted file mode 100644 index e17060ef24804..0000000000000 --- a/src/backend/utils/README.Gen_dummy_probes +++ /dev/null @@ -1,27 +0,0 @@ -# Generating dummy probes - -If Postgres isn't configured with dtrace enabled, we need to generate -dummy probes for the entries in probes.d, that do nothing. - -This is accomplished in Unix via the sed script `Gen_dummy_probes.sed`. We -used to use this in MSVC builds using the perl utility `psed`, which mimicked -sed. However, that utility disappeared from Windows perl distributions and so -we converted the sed script to a perl script to be used in MSVC builds. - -We still keep the sed script as the authoritative source for generating -these dummy probes because except on Windows perl is not a hard requirement -when building from a tarball. - -So, if you need to change the way dummy probes are generated, first change -the sed script, and when it's working generate the perl script. This can -be accomplished by using the perl utility s2p. - -s2p is no longer part of the perl core, so it might not be on your system, -but it is available on CPAN and also in many package systems. e.g. -on Fedora it can be installed using `cpan App::s2p` or -`dnf install perl-App-s2p`. - -The Makefile contains a recipe for regenerating Gen_dummy_probes.pl, so all -you need to do is once you have s2p installed is `make Gen_dummy_probes.pl` -Note that in a VPATH build this will generate the file in the vpath tree, -not the source tree. diff --git a/src/backend/utils/activity/.gitignore b/src/backend/utils/activity/.gitignore new file mode 100644 index 0000000000000..bd0c0c7772984 --- /dev/null +++ b/src/backend/utils/activity/.gitignore @@ -0,0 +1,3 @@ +/pgstat_wait_event.c +/wait_event_types.h +/wait_event_funcs_data.c diff --git a/src/backend/utils/activity/Makefile b/src/backend/utils/activity/Makefile index 7d7482dde0275..b9fd66ea17cea 100644 --- a/src/backend/utils/activity/Makefile +++ b/src/backend/utils/activity/Makefile @@ -2,7 +2,7 @@ # # Makefile for backend/utils/activity # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/backend/utils/activity/Makefile @@ -13,6 +13,8 @@ subdir = src/backend/utils/activity top_builddir = ../../../.. include $(top_builddir)/src/Makefile.global +override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) + OBJS = \ backend_progress.o \ backend_status.o \ @@ -30,6 +32,20 @@ OBJS = \ pgstat_subscription.o \ pgstat_wal.o \ pgstat_xact.o \ - wait_event.o + wait_event.o \ + wait_event_funcs.o include $(top_srcdir)/src/backend/common.mk + +wait_event_funcs.o: wait_event_funcs_data.c +wait_event_funcs_data.c: wait_event_types.h + +wait_event.o: pgstat_wait_event.c +pgstat_wait_event.c: wait_event_types.h + touch $@ + +wait_event_types.h: $(top_srcdir)/src/backend/utils/activity/wait_event_names.txt generate-wait_event_types.pl + $(PERL) $(srcdir)/generate-wait_event_types.pl --code $< + +clean: + rm -f wait_event_types.h pgstat_wait_event.c wait_event_funcs_data.c diff --git a/src/backend/utils/activity/backend_progress.c b/src/backend/utils/activity/backend_progress.c index fb48eafef9a54..c78c5eb507642 100644 --- a/src/backend/utils/activity/backend_progress.c +++ b/src/backend/utils/activity/backend_progress.c @@ -3,13 +3,15 @@ * * Command progress reporting infrastructure. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * src/backend/utils/activity/backend_progress.c * ---------- */ #include "postgres.h" +#include "access/parallel.h" +#include "libpq/pqformat.h" #include "port/atomics.h" /* for memory barriers */ #include "utils/backend_progress.h" #include "utils/backend_status.h" @@ -79,6 +81,36 @@ pgstat_progress_incr_param(int index, int64 incr) PGSTAT_END_WRITE_ACTIVITY(beentry); } +/*----------- + * pgstat_progress_parallel_incr_param() - + * + * A variant of pgstat_progress_incr_param to allow a worker to poke at + * a leader to do an incremental progress update. + *----------- + */ +void +pgstat_progress_parallel_incr_param(int index, int64 incr) +{ + /* + * Parallel workers notify a leader through a PqMsg_Progress message to + * update progress, passing the progress index and incremented value. + * Leaders can just call pgstat_progress_incr_param directly. + */ + if (IsParallelWorker()) + { + static StringInfoData progress_message; + + initStringInfo(&progress_message); + + pq_beginmessage(&progress_message, PqMsg_Progress); + pq_sendint32(&progress_message, index); + pq_sendint64(&progress_message, incr); + pq_endmessage(&progress_message); + } + else + pgstat_progress_incr_param(index, incr); +} + /*----------- * pgstat_progress_update_multi_param() - * diff --git a/src/backend/utils/activity/backend_status.c b/src/backend/utils/activity/backend_status.c index 38f91a495b8ea..1ccf4c6d839e1 100644 --- a/src/backend/utils/activity/backend_status.c +++ b/src/backend/utils/activity/backend_status.c @@ -2,7 +2,7 @@ * backend_status.c * Backend status reporting infrastructure. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -12,16 +12,16 @@ #include "postgres.h" #include "access/xact.h" -#include "libpq/libpq.h" +#include "libpq/libpq-be.h" #include "miscadmin.h" #include "pg_trace.h" #include "pgstat.h" #include "port/atomics.h" /* for memory barriers */ #include "storage/ipc.h" #include "storage/proc.h" /* for MyProc */ +#include "storage/procarray.h" #include "storage/sinvaladt.h" #include "utils/ascii.h" -#include "utils/backend_status.h" #include "utils/guc.h" /* for application_name */ #include "utils/memutils.h" @@ -29,13 +29,12 @@ /* ---------- * Total number of backends including auxiliary * - * We reserve a slot for each possible BackendId, plus one for each - * possible auxiliary process type. (This scheme assumes there is not - * more than one of any auxiliary process type at a time.) MaxBackends - * includes autovacuum workers and background workers as well. + * We reserve a slot for each possible PGPROC entry, including aux processes. + * (But not including PGPROC entries reserved for prepared xacts; they are not + * real processes.) * ---------- */ -#define NumBackendStatSlots (MaxBackends + NUM_AUXPROCTYPES) +#define NumBackendStatSlots (MaxBackends + NUM_AUXILIARY_PROCS) /* ---------- @@ -238,10 +237,9 @@ CreateSharedBackendStatus(void) /* * Initialize pgstats backend activity state, and set up our on-proc-exit - * hook. Called from InitPostgres and AuxiliaryProcessMain. For auxiliary - * process, MyBackendId is invalid. Otherwise, MyBackendId must be set, but we - * must not have started any transaction yet (since the exit hook must run - * after the last transaction exit). + * hook. Called from InitPostgres and AuxiliaryProcessMain. MyProcNumber must + * be set, but we must not have started any transaction yet (since the exit + * hook must run after the last transaction exit). * * NOTE: MyDatabaseId isn't set yet; so the shutdown hook has to be careful. */ @@ -249,26 +247,9 @@ void pgstat_beinit(void) { /* Initialize MyBEEntry */ - if (MyBackendId != InvalidBackendId) - { - Assert(MyBackendId >= 1 && MyBackendId <= MaxBackends); - MyBEEntry = &BackendStatusArray[MyBackendId - 1]; - } - else - { - /* Must be an auxiliary process */ - Assert(MyAuxProcType != NotAnAuxProcess); - - /* - * Assign the MyBEEntry for an auxiliary process. Since it doesn't - * have a BackendId, the slot is statically allocated based on the - * auxiliary process type (MyAuxProcType). Backends use slots indexed - * in the range from 1 to MaxBackends (inclusive), so we use - * MaxBackends + AuxBackendType + 1 as the index of the slot for an - * auxiliary process. - */ - MyBEEntry = &BackendStatusArray[MaxBackends + MyAuxProcType]; - } + Assert(MyProcNumber != INVALID_PROC_NUMBER); + Assert(MyProcNumber >= 0 && MyProcNumber < NumBackendStatSlots); + MyBEEntry = &BackendStatusArray[MyProcNumber]; /* Set up a process-exit hook to clean up */ on_shmem_exit(pgstat_beshutdown_hook, 0); @@ -281,12 +262,12 @@ pgstat_beinit(void) * Initialize this backend's entry in the PgBackendStatus array. * Called from InitPostgres. * - * Apart from auxiliary processes, MyBackendId, MyDatabaseId, - * session userid, and application_name must be set for a - * backend (hence, this cannot be combined with pgstat_beinit). - * Note also that we must be inside a transaction if this isn't an aux - * process, as we may need to do encoding conversion on some strings. - * ---------- + * Apart from auxiliary processes, MyDatabaseId, session userid, and + * application_name must already be set (hence, this cannot be combined + * with pgstat_beinit). Note also that we must be inside a transaction + * if this isn't an aux process, as we may need to do encoding conversion + * on some strings. + *---------- */ void pgstat_bestart(void) @@ -739,7 +720,7 @@ pgstat_read_current_status(void) #ifdef ENABLE_GSS PgBackendGSSStatus *localgssstatus; #endif - int i; + ProcNumber procNumber; if (localBackendStatusTable) return; /* already done */ @@ -765,7 +746,8 @@ pgstat_read_current_status(void) NAMEDATALEN * NumBackendStatSlots); localactivity = (char *) MemoryContextAllocHuge(backendStatusSnapContext, - pgstat_track_activity_query_size * NumBackendStatSlots); + (Size) pgstat_track_activity_query_size * + (Size) NumBackendStatSlots); #ifdef USE_SSL localsslstatus = (PgBackendSSLStatus *) MemoryContextAlloc(backendStatusSnapContext, @@ -781,7 +763,7 @@ pgstat_read_current_status(void) beentry = BackendStatusArray; localentry = localtable; - for (i = 1; i <= NumBackendStatSlots; i++) + for (procNumber = 0; procNumber < NumBackendStatSlots; procNumber++) { /* * Follow the protocol of retrying if st_changecount changes while we @@ -847,17 +829,17 @@ pgstat_read_current_status(void) if (localentry->backendStatus.st_procpid > 0) { /* - * The BackendStatusArray index is exactly the BackendId of the + * The BackendStatusArray index is exactly the ProcNumber of the * source backend. Note that this means localBackendStatusTable - * is in order by backend_id. pgstat_fetch_stat_beentry() depends - * on that. + * is in order by proc_number. pgstat_get_beentry_by_proc_number() + * depends on that. */ - localentry->backend_id = i; - BackendIdGetTransactionIds(i, - &localentry->backend_xid, - &localentry->backend_xmin, - &localentry->backend_subxact_count, - &localentry->backend_subxact_overflowed); + localentry->proc_number = procNumber; + ProcNumberGetTransactionIds(procNumber, + &localentry->backend_xid, + &localentry->backend_xmin, + &localentry->backend_subxact_count, + &localentry->backend_subxact_overflowed); localentry++; localappname += NAMEDATALEN; @@ -1060,7 +1042,7 @@ pgstat_get_my_query_id(void) * cmp_lbestatus * * Comparison function for bsearch() on an array of LocalPgBackendStatus. - * The backend_id field is used to compare the arguments. + * The proc_number field is used to compare the arguments. * ---------- */ static int @@ -1069,55 +1051,73 @@ cmp_lbestatus(const void *a, const void *b) const LocalPgBackendStatus *lbestatus1 = (const LocalPgBackendStatus *) a; const LocalPgBackendStatus *lbestatus2 = (const LocalPgBackendStatus *) b; - return lbestatus1->backend_id - lbestatus2->backend_id; + return lbestatus1->proc_number - lbestatus2->proc_number; } /* ---------- - * pgstat_fetch_stat_beentry() - + * pgstat_get_beentry_by_proc_number() - * * Support function for the SQL-callable pgstat* functions. Returns * our local copy of the current-activity entry for one backend, * or NULL if the given beid doesn't identify any known session. * - * The beid argument is the BackendId of the desired session - * (note that this is unlike pgstat_fetch_stat_local_beentry()). + * The argument is the ProcNumber of the desired session + * (note that this is unlike pgstat_get_local_beentry_by_index()). * * NB: caller is responsible for a check if the user is permitted to see * this info (especially the querystring). * ---------- */ PgBackendStatus * -pgstat_fetch_stat_beentry(BackendId beid) +pgstat_get_beentry_by_proc_number(ProcNumber procNumber) +{ + LocalPgBackendStatus *ret = pgstat_get_local_beentry_by_proc_number(procNumber); + + if (ret) + return &ret->backendStatus; + + return NULL; +} + + +/* ---------- + * pgstat_get_local_beentry_by_proc_number() - + * + * Like pgstat_get_beentry_by_proc_number() but with locally computed additions + * (like xid and xmin values of the backend) + * + * The argument is the ProcNumber of the desired session + * (note that this is unlike pgstat_get_local_beentry_by_index()). + * + * NB: caller is responsible for checking if the user is permitted to see this + * info (especially the querystring). + * ---------- + */ +LocalPgBackendStatus * +pgstat_get_local_beentry_by_proc_number(ProcNumber procNumber) { LocalPgBackendStatus key; - LocalPgBackendStatus *ret; pgstat_read_current_status(); /* - * Since the localBackendStatusTable is in order by backend_id, we can use - * bsearch() to search it efficiently. + * Since the localBackendStatusTable is in order by proc_number, we can + * use bsearch() to search it efficiently. */ - key.backend_id = beid; - ret = (LocalPgBackendStatus *) bsearch(&key, localBackendStatusTable, - localNumBackends, - sizeof(LocalPgBackendStatus), - cmp_lbestatus); - if (ret) - return &ret->backendStatus; - - return NULL; + key.proc_number = procNumber; + return bsearch(&key, localBackendStatusTable, localNumBackends, + sizeof(LocalPgBackendStatus), cmp_lbestatus); } /* ---------- - * pgstat_fetch_stat_local_beentry() - + * pgstat_get_local_beentry_by_index() - * - * Like pgstat_fetch_stat_beentry() but with locally computed additions (like - * xid and xmin values of the backend) + * Like pgstat_get_beentry_by_proc_number() but with locally computed + * additions (like xid and xmin values of the backend) * - * The beid argument is a 1-based index in the localBackendStatusTable - * (note that this is unlike pgstat_fetch_stat_beentry()). + * The idx argument is a 1-based index in the localBackendStatusTable + * (note that this is unlike pgstat_get_beentry_by_proc_number()). * Returns NULL if the argument is out of range (no current caller does that). * * NB: caller is responsible for a check if the user is permitted to see @@ -1125,14 +1125,14 @@ pgstat_fetch_stat_beentry(BackendId beid) * ---------- */ LocalPgBackendStatus * -pgstat_fetch_stat_local_beentry(int beid) +pgstat_get_local_beentry_by_index(int idx) { pgstat_read_current_status(); - if (beid < 1 || beid > localNumBackends) + if (idx < 1 || idx > localNumBackends) return NULL; - return &localBackendStatusTable[beid - 1]; + return &localBackendStatusTable[idx - 1]; } @@ -1141,7 +1141,7 @@ pgstat_fetch_stat_local_beentry(int beid) * * Support function for the SQL-callable pgstat* functions. Returns * the number of sessions known in the localBackendStatusTable, i.e. - * the maximum 1-based index to pass to pgstat_fetch_stat_local_beentry(). + * the maximum 1-based index to pass to pgstat_get_local_beentry_by_index(). * ---------- */ int diff --git a/src/backend/utils/activity/generate-wait_event_types.pl b/src/backend/utils/activity/generate-wait_event_types.pl new file mode 100644 index 0000000000000..6a9c0a5d34711 --- /dev/null +++ b/src/backend/utils/activity/generate-wait_event_types.pl @@ -0,0 +1,352 @@ +#!/usr/bin/perl +#---------------------------------------------------------------------- +# +# Generate wait events support files from wait_event_names.txt: +# - wait_event_types.h (if --code is passed) +# - pgstat_wait_event.c (if --code is passed) +# - wait_event_funcs_data.c (if --code is passed) +# - wait_event_types.sgml (if --docs is passed) +# +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group +# Portions Copyright (c) 1994, Regents of the University of California +# +# src/backend/utils/activity/generate-wait_event_types.pl +# +#---------------------------------------------------------------------- + +use strict; +use warnings FATAL => 'all'; +use Getopt::Long; + +my $output_path = '.'; +my $gen_docs = 0; +my $gen_code = 0; + +my $continue = "\n"; +my %hashwe; + +GetOptions( + 'outdir:s' => \$output_path, + 'docs' => \$gen_docs, + 'code' => \$gen_code) || usage(); + +die "Needs to specify --docs or --code" + if (!$gen_docs && !$gen_code); + +die "Not possible to specify --docs and --code simultaneously" + if ($gen_docs && $gen_code); + +open my $wait_event_names, '<', $ARGV[0] or die; + +my @abi_compatibility_lines; +my @lines; +my $abi_compatibility = 0; +my $section_name; +my $note; +my $note_name; + +# Remove comments and empty lines and add waitclassname based on the section +while (<$wait_event_names>) +{ + chomp; + + # Skip comments + next if /^#/; + + # Skip empty lines + next if /^\s*$/; + + # Get waitclassname based on the section + if (/^Section: ClassName(.*)/) + { + $section_name = $_; + $section_name =~ s/^.*- //; + $abi_compatibility = 0; + next; + } + + # ABI_compatibility region, preserving ABI compatibility of the code + # generated. Any wait events listed in this part of the file will + # not be sorted during the code generation. + if (/^ABI_compatibility:$/) + { + $abi_compatibility = 1; + next; + } + + if ($gen_code && $abi_compatibility) + { + push(@abi_compatibility_lines, $section_name . "\t" . $_); + } + else + { + push(@lines, $section_name . "\t" . $_); + } +} + +# Sort the lines based on the second column. +# uc() is being used to force the comparison to be case-insensitive. +my @lines_sorted = + sort { uc((split(/\t/, $a))[1]) cmp uc((split(/\t/, $b))[1]) } @lines; + +# If we are generating code, concat @lines_sorted and then +# @abi_compatibility_lines. +if ($gen_code) +{ + push(@lines_sorted, @abi_compatibility_lines); +} + +# Read the sorted lines and populate the hash table +foreach my $line (@lines_sorted) +{ + die "unable to parse wait_event_names.txt for line $line\n" + unless $line =~ /^(\w+)\t+(\w+)\t+("\w.*\.")$/; + + (my $waitclassname, my $waiteventname, my $waitevendocsentence) = + split(/\t/, $line); + + # Generate the element name for the enums based on the + # description. The C symbols are prefixed with "WAIT_EVENT_". + my $waiteventenumname = "WAIT_EVENT_$waiteventname"; + + # Build the descriptions. These are in camel-case. + # LWLock and Lock classes do not need any modifications. + my $waiteventdescription = ''; + if ( $waitclassname eq 'WaitEventLWLock' + || $waitclassname eq 'WaitEventLock') + { + $waiteventdescription = $waiteventname; + } + else + { + my @waiteventparts = split("_", $waiteventname); + foreach my $waiteventpart (@waiteventparts) + { + $waiteventdescription .= substr($waiteventpart, 0, 1) + . lc(substr($waiteventpart, 1, length($waiteventpart))); + } + } + + # Store the event into the list for each class. + my @waiteventlist = + [ $waiteventenumname, $waiteventdescription, $waitevendocsentence ]; + push(@{ $hashwe{$waitclassname} }, @waiteventlist); +} + + +# Generate the .c and .h files. +if ($gen_code) +{ + # Include PID in suffix in case parallel make runs this script + # multiple times. + my $htmp = "$output_path/wait_event_types.h.tmp$$"; + my $ctmp = "$output_path/pgstat_wait_event.c.tmp$$"; + my $wctmp = "$output_path/wait_event_funcs_data.c.tmp$$"; + open my $h, '>', $htmp or die "Could not open $htmp: $!"; + open my $c, '>', $ctmp or die "Could not open $ctmp: $!"; + open my $wc, '>', $wctmp or die "Could not open $wctmp: $!"; + + my $header_comment = + '/*------------------------------------------------------------------------- + * + * %s + * Generated wait events infrastructure code + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * NOTES + * ****************************** + * *** DO NOT EDIT THIS FILE! *** + * ****************************** + * + * It has been GENERATED by src/backend/utils/activity/generate-wait_event_types.pl + * + *------------------------------------------------------------------------- + */ + +'; + + printf $h $header_comment, 'wait_event_types.h'; + printf $h "#ifndef WAIT_EVENT_TYPES_H\n"; + printf $h "#define WAIT_EVENT_TYPES_H\n\n"; + printf $h "#include \"utils/wait_event.h\"\n\n"; + + printf $c $header_comment, 'pgstat_wait_event.c'; + + printf $wc $header_comment, 'wait_event_funcs_data.c'; + + # Generate the pgstat_wait_event.c and wait_event_types.h files + # uc() is being used to force the comparison to be case-insensitive. + foreach my $waitclass (sort { uc($a) cmp uc($b) } keys %hashwe) + { + # Don't generate the pgstat_wait_event.c and wait_event_types.h files + # for types handled independently. + next + if ( $waitclass eq 'WaitEventExtension' + || $waitclass eq 'WaitEventInjectionPoint' + || $waitclass eq 'WaitEventLWLock' + || $waitclass eq 'WaitEventLock'); + + my $last = $waitclass; + $last =~ s/^WaitEvent//; + my $lastuc = uc $last; + my $lastlc = lc $last; + my $firstpass = 1; + my $pg_wait_class; + + printf $c + "static const char *\npgstat_get_wait_$lastlc($waitclass w)\n{\n"; + printf $c "\tconst char *event_name = \"unknown wait event\";\n\n"; + printf $c "\tswitch (w)\n\t{\n"; + + foreach my $wev (@{ $hashwe{$waitclass} }) + { + if ($firstpass) + { + printf $h "typedef enum\n{\n"; + $pg_wait_class = "PG_WAIT_" . $lastuc; + printf $h "\t%s = %s", $wev->[0], $pg_wait_class; + $continue = ",\n"; + } + else + { + printf $h "%s\t%s", $continue, $wev->[0]; + $continue = ",\n"; + } + $firstpass = 0; + + printf $c "\t\t case %s:\n", $wev->[0]; + # Apply quotes to the wait event name string. + printf $c "\t\t\t event_name = \"%s\";\n\t\t\t break;\n", + $wev->[1]; + } + + printf $h "\n} $waitclass;\n\n"; + + printf $c + "\t\t\t /* no default case, so that compiler will warn */\n"; + printf $c "\t}\n\n"; + printf $c "\treturn event_name;\n"; + printf $c "}\n\n"; + } + + # Generate wait_event_funcs_data.c, building the contents of a static + # C structure holding all the information about the wait events. + # uc() is being used to force the comparison to be case-insensitive, + # even though it is not required here. + foreach my $waitclass (sort { uc($a) cmp uc($b) } keys %hashwe) + { + my $last = $waitclass; + $last =~ s/^WaitEvent//; + + foreach my $wev (@{ $hashwe{$waitclass} }) + { + my $new_desc = substr $wev->[2], 1, -2; + # Escape single quotes. + $new_desc =~ s/'/\\'/g; + + # Replace the "quote" markups by real ones. + $new_desc =~ s/(.*?)<\/quote>/\\"$1\\"/g; + + # Remove SGML markups. + $new_desc =~ s/<.*?>(.*?)<.*?>/$1/g; + + # Tweak contents about links + # on GUCs, + while (my ($capture) = + $new_desc =~ m//g) + { + $capture =~ s/-/_/g; + $new_desc =~ s//$capture/g; + } + # Then remove any reference to + # "see ". + $new_desc =~ s/; see.*$//; + + # Build one element of the C structure holding the + # wait event info, as of (type, name, description). + printf $wc "\t{\"%s\", \"%s\", \"%s\"},\n", $last, $wev->[1], + $new_desc; + } + } + + printf $h "#endif /* WAIT_EVENT_TYPES_H */\n"; + close $h; + close $c; + close $wc; + + rename($htmp, "$output_path/wait_event_types.h") + || die "rename: $htmp to $output_path/wait_event_types.h: $!"; + rename($ctmp, "$output_path/pgstat_wait_event.c") + || die "rename: $ctmp to $output_path/pgstat_wait_event.c: $!"; + rename($wctmp, "$output_path/wait_event_funcs_data.c") + || die "rename: $wctmp to $output_path/wait_event_funcs_data.c: $!"; +} +# Generate the .sgml file. +elsif ($gen_docs) +{ + # Include PID in suffix in case parallel make runs this multiple times. + my $stmp = "$output_path/wait_event_names.s.tmp$$"; + open my $s, '>', $stmp or die "Could not open $stmp: $!"; + + # uc() is being used to force the comparison to be case-insensitive. + foreach my $waitclass (sort { uc($a) cmp uc($b) } keys %hashwe) + { + my $last = $waitclass; + $last =~ s/^WaitEvent//; + my $lastlc = lc $last; + + printf $s "
\n", $lastlc; + printf $s + " Wait Events of Type <literal>%s</literal>\n", + ucfirst($lastlc); + printf $s " \n"; + printf $s " \n"; + printf $s " \n"; + printf $s + " $last Wait Event\n"; + printf $s " Description\n"; + printf $s " \n"; + printf $s " \n\n"; + printf $s " \n"; + + foreach my $wev (@{ $hashwe{$waitclass} }) + { + printf $s " \n"; + printf $s " %s\n", + $wev->[1]; + printf $s " %s\n", substr $wev->[2], 1, -1; + printf $s " \n"; + } + + printf $s " \n"; + printf $s " \n"; + printf $s "
\n\n"; + } + + close $s; + + rename($stmp, "$output_path/wait_event_types.sgml") + || die "rename: $stmp to $output_path/wait_event_types.sgml: $!"; +} + +close $wait_event_names; + +sub usage +{ + die <] [--code ] [ --sgml ] input_file + +Options: + --outdir Output directory (default '.') + --code Generate C and header files. + --sgml Generate wait_event_types.sgml. + +generate-wait_event_types.pl generates the SGML documentation and code +related to wait events. This should use wait_event_names.txt in input, or +an input file with a compatible format. + +Report bugs to . +EOM +} diff --git a/src/backend/utils/activity/meson.build b/src/backend/utils/activity/meson.build index 518ee3f798e2b..f73c22905c272 100644 --- a/src/backend/utils/activity/meson.build +++ b/src/backend/utils/activity/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'backend_progress.c', @@ -17,5 +17,20 @@ backend_sources += files( 'pgstat_subscription.c', 'pgstat_wal.c', 'pgstat_xact.c', +) + +# this includes a .c file with contents generated in ../../../include/activity, +# seems nicer to not add that as an include path for the whole backend. +waitevent_sources = files( 'wait_event.c', + 'wait_event_funcs.c', ) + +wait_event = static_library('wait_event_names', + waitevent_sources, + dependencies: [backend_code], + include_directories: include_directories('../../../include/utils'), + kwargs: internal_lib_args, +) + +backend_link_with += wait_event diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index d743fc0b289e4..c79d6db3dac9b 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -83,7 +83,7 @@ * specific kinds of stats. * * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat.c @@ -93,7 +93,6 @@ #include -#include "access/transam.h" #include "access/xact.h" #include "lib/dshash.h" #include "pgstat.h" @@ -101,8 +100,6 @@ #include "storage/fd.h" #include "storage/ipc.h" #include "storage/lwlock.h" -#include "storage/pg_shmem.h" -#include "storage/shmem.h" #include "utils/guc_hooks.h" #include "utils/memutils.h" #include "utils/pgstat_internal.h" @@ -603,7 +600,6 @@ pgstat_report_stat(bool force) !have_slrustats && !pgstat_have_pending_wal()) { - Assert(pending_since == 0); return 0; } @@ -825,6 +821,9 @@ pgstat_fetch_entry(PgStat_Kind kind, Oid dboid, Oid objoid) pgstat_prep_snapshot(); + /* clear padding */ + memset(&key, 0, sizeof(struct PgStat_HashKey)); + key.kind = kind; key.dboid = dboid; key.objoid = objoid; @@ -943,6 +942,9 @@ pgstat_snapshot_fixed(PgStat_Kind kind) Assert(pgstat_is_kind_valid(kind)); Assert(pgstat_get_kind_info(kind)->fixed_amount); + if (force_stats_snapshot_clear) + pgstat_clear_snapshot(); + if (pgstat_fetch_consistency == PGSTAT_FETCH_CONSISTENCY_SNAPSHOT) pgstat_build_snapshot(); else @@ -1393,7 +1395,15 @@ pgstat_write_statsfile(void) CHECK_FOR_INTERRUPTS(); - /* we may have some "dropped" entries not yet removed, skip them */ + /* + * We should not see any "dropped" entries when writing the stats + * file, as all backends and auxiliary processes should have cleaned + * up their references before they terminated. + * + * However, since we are already shutting down, it is not worth + * crashing the server over any potential cleanup issues, so we simply + * skip such entries if encountered. + */ Assert(!ps->dropped); if (ps->dropped) continue; diff --git a/src/backend/utils/activity/pgstat_archiver.c b/src/backend/utils/activity/pgstat_archiver.c index f6af36e60cd00..66398b20e5e3e 100644 --- a/src/backend/utils/activity/pgstat_archiver.c +++ b/src/backend/utils/activity/pgstat_archiver.c @@ -8,7 +8,7 @@ * storage implementation and the details about individual types of * statistics. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat_archiver.c diff --git a/src/backend/utils/activity/pgstat_bgwriter.c b/src/backend/utils/activity/pgstat_bgwriter.c index 92be384b0d0ad..7d2432e4fa8ba 100644 --- a/src/backend/utils/activity/pgstat_bgwriter.c +++ b/src/backend/utils/activity/pgstat_bgwriter.c @@ -8,7 +8,7 @@ * storage implementation and the details about individual types of * statistics. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat_bgwriter.c diff --git a/src/backend/utils/activity/pgstat_checkpointer.c b/src/backend/utils/activity/pgstat_checkpointer.c index 26dec112f6cd6..30a8110e38187 100644 --- a/src/backend/utils/activity/pgstat_checkpointer.c +++ b/src/backend/utils/activity/pgstat_checkpointer.c @@ -8,7 +8,7 @@ * storage implementation and the details about individual types of * statistics. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat_checkpointer.c @@ -47,13 +47,14 @@ pgstat_report_checkpointer(void) pgstat_begin_changecount_write(&stats_shmem->changecount); #define CHECKPOINTER_ACC(fld) stats_shmem->stats.fld += PendingCheckpointerStats.fld - CHECKPOINTER_ACC(timed_checkpoints); - CHECKPOINTER_ACC(requested_checkpoints); - CHECKPOINTER_ACC(checkpoint_write_time); - CHECKPOINTER_ACC(checkpoint_sync_time); - CHECKPOINTER_ACC(buf_written_checkpoints); - CHECKPOINTER_ACC(buf_written_backend); - CHECKPOINTER_ACC(buf_fsync_backend); + CHECKPOINTER_ACC(num_timed); + CHECKPOINTER_ACC(num_requested); + CHECKPOINTER_ACC(restartpoints_timed); + CHECKPOINTER_ACC(restartpoints_requested); + CHECKPOINTER_ACC(restartpoints_performed); + CHECKPOINTER_ACC(write_time); + CHECKPOINTER_ACC(sync_time); + CHECKPOINTER_ACC(buffers_written); #undef CHECKPOINTER_ACC pgstat_end_changecount_write(&stats_shmem->changecount); @@ -94,6 +95,7 @@ pgstat_checkpointer_reset_all_cb(TimestampTz ts) &stats_shmem->stats, sizeof(stats_shmem->stats), &stats_shmem->changecount); + stats_shmem->stats.stat_reset_timestamp = ts; LWLockRelease(&stats_shmem->lock); } @@ -115,12 +117,13 @@ pgstat_checkpointer_snapshot_cb(void) /* compensate by reset offsets */ #define CHECKPOINTER_COMP(fld) pgStatLocal.snapshot.checkpointer.fld -= reset.fld; - CHECKPOINTER_COMP(timed_checkpoints); - CHECKPOINTER_COMP(requested_checkpoints); - CHECKPOINTER_COMP(checkpoint_write_time); - CHECKPOINTER_COMP(checkpoint_sync_time); - CHECKPOINTER_COMP(buf_written_checkpoints); - CHECKPOINTER_COMP(buf_written_backend); - CHECKPOINTER_COMP(buf_fsync_backend); + CHECKPOINTER_COMP(num_timed); + CHECKPOINTER_COMP(num_requested); + CHECKPOINTER_COMP(restartpoints_timed); + CHECKPOINTER_COMP(restartpoints_requested); + CHECKPOINTER_COMP(restartpoints_performed); + CHECKPOINTER_COMP(write_time); + CHECKPOINTER_COMP(sync_time); + CHECKPOINTER_COMP(buffers_written); #undef CHECKPOINTER_COMP } diff --git a/src/backend/utils/activity/pgstat_database.c b/src/backend/utils/activity/pgstat_database.c index 7149f22f72954..10ee3e57a89a3 100644 --- a/src/backend/utils/activity/pgstat_database.c +++ b/src/backend/utils/activity/pgstat_database.c @@ -8,7 +8,7 @@ * storage implementation and the details about individual types of * statistics. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat_database.c @@ -17,9 +17,9 @@ #include "postgres.h" +#include "storage/procsignal.h" #include "utils/pgstat_internal.h" #include "utils/timestamp.h" -#include "storage/procsignal.h" static bool pgstat_should_report_connstat(void); @@ -271,6 +271,13 @@ pgstat_update_dbstats(TimestampTz ts) { PgStat_StatDBEntry *dbentry; + /* + * If not connected to a database yet, don't attribute time to "shared + * state" (InvalidOid is used to track stats for shared relations, etc.). + */ + if (!OidIsValid(MyDatabaseId)) + return; + dbentry = pgstat_prep_database_pending(MyDatabaseId); /* @@ -327,6 +334,12 @@ pgstat_prep_database_pending(Oid dboid) { PgStat_EntryRef *entry_ref; + /* + * This should not report stats on database objects before having + * connected to a database. + */ + Assert(!OidIsValid(dboid) || OidIsValid(MyDatabaseId)); + entry_ref = pgstat_prep_pending_entry(PGSTAT_KIND_DATABASE, dboid, InvalidOid, NULL); @@ -355,8 +368,8 @@ pgstat_reset_database_timestamp(Oid dboid, TimestampTz ts) /* * Flush out pending stats for the entry * - * If nowait is true, this function returns false if lock could not - * immediately acquired, otherwise true is returned. + * If nowait is true and the lock could not be immediately acquired, returns + * false without flushing the entry. Otherwise returns true. */ bool pgstat_database_flush_cb(PgStat_EntryRef *entry_ref, bool nowait) diff --git a/src/backend/utils/activity/pgstat_function.c b/src/backend/utils/activity/pgstat_function.c index 79e781167b0fc..709b8e6726e75 100644 --- a/src/backend/utils/activity/pgstat_function.c +++ b/src/backend/utils/activity/pgstat_function.c @@ -8,7 +8,7 @@ * storage implementation and the details about individual types of * statistics. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat_function.c @@ -186,8 +186,8 @@ pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu, bool finalize) /* * Flush out pending stats for the entry * - * If nowait is true, this function returns false if lock could not - * immediately acquired, otherwise true is returned. + * If nowait is true and the lock could not be immediately acquired, returns + * false without flushing the entry. Otherwise returns true. */ bool pgstat_function_flush_cb(PgStat_EntryRef *entry_ref, bool nowait) diff --git a/src/backend/utils/activity/pgstat_io.c b/src/backend/utils/activity/pgstat_io.c index eb7d35d4225a6..9d6e067382778 100644 --- a/src/backend/utils/activity/pgstat_io.c +++ b/src/backend/utils/activity/pgstat_io.c @@ -7,7 +7,7 @@ * from pgstat.c to enforce the line between the statistics access / storage * implementation and the details about individual types of statistics. * - * Copyright (c) 2021-2023, PostgreSQL Global Development Group + * Copyright (c) 2021-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat_io.c @@ -92,15 +92,25 @@ pgstat_count_io_op_n(IOObject io_object, IOContext io_context, IOOp io_op, uint3 have_iostats = true; } +/* + * Initialize the internal timing for an IO operation, depending on an + * IO timing GUC. + */ instr_time -pgstat_prepare_io_time(void) +pgstat_prepare_io_time(bool track_io_guc) { instr_time io_start; - if (track_io_timing) + if (track_io_guc) INSTR_TIME_SET_CURRENT(io_start); else + { + /* + * There is no need to set io_start when an IO timing GUC is disabled, + * still initialize it to zero to avoid compiler warnings. + */ INSTR_TIME_SET_ZERO(io_start); + } return io_start; } @@ -119,17 +129,21 @@ pgstat_count_io_op_time(IOObject io_object, IOContext io_context, IOOp io_op, INSTR_TIME_SET_CURRENT(io_time); INSTR_TIME_SUBTRACT(io_time, start_time); - if (io_op == IOOP_WRITE) + if (io_op == IOOP_WRITE || io_op == IOOP_EXTEND) { pgstat_count_buffer_write_time(INSTR_TIME_GET_MICROSEC(io_time)); if (io_object == IOOBJECT_RELATION) - INSTR_TIME_ADD(pgBufferUsage.blk_write_time, io_time); + INSTR_TIME_ADD(pgBufferUsage.shared_blk_write_time, io_time); + else if (io_object == IOOBJECT_TEMP_RELATION) + INSTR_TIME_ADD(pgBufferUsage.local_blk_write_time, io_time); } else if (io_op == IOOP_READ) { pgstat_count_buffer_read_time(INSTR_TIME_GET_MICROSEC(io_time)); if (io_object == IOOBJECT_RELATION) - INSTR_TIME_ADD(pgBufferUsage.blk_read_time, io_time); + INSTR_TIME_ADD(pgBufferUsage.shared_blk_read_time, io_time); + else if (io_object == IOOBJECT_TEMP_RELATION) + INSTR_TIME_ADD(pgBufferUsage.local_blk_read_time, io_time); } INSTR_TIME_ADD(PendingIOStats.pending_times[io_object][io_context][io_op], @@ -292,7 +306,8 @@ pgstat_io_snapshot_cb(void) * - Syslogger because it is not connected to shared memory * - Archiver because most relevant archiving IO is delegated to a * specialized command or module -* - WAL Receiver and WAL Writer IO is not tracked in pg_stat_io for now +* - WAL Receiver, WAL Writer, and WAL Summarizer IO are not tracked in +* pg_stat_io for now * * Function returns true if BackendType participates in the cumulative stats * subsystem for IO and false if it does not. @@ -314,6 +329,7 @@ pgstat_tracks_io_bktype(BackendType bktype) case B_LOGGER: case B_WAL_RECEIVER: case B_WAL_WRITER: + case B_WAL_SUMMARIZER: return false; case B_AUTOVAC_LAUNCHER: @@ -322,6 +338,7 @@ pgstat_tracks_io_bktype(BackendType bktype) case B_BG_WORKER: case B_BG_WRITER: case B_CHECKPOINTER: + case B_SLOTSYNC_WORKER: case B_STANDALONE_BACKEND: case B_STARTUP: case B_WAL_SENDER: diff --git a/src/backend/utils/activity/pgstat_relation.c b/src/backend/utils/activity/pgstat_relation.c index 9876e0c1e8226..383b2dbe3e895 100644 --- a/src/backend/utils/activity/pgstat_relation.c +++ b/src/backend/utils/activity/pgstat_relation.c @@ -8,7 +8,7 @@ * storage implementation and the details about individual types of * statistics. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat_relation.c @@ -19,13 +19,12 @@ #include "access/twophase_rmgr.h" #include "access/xact.h" -#include "catalog/partition.h" +#include "catalog/catalog.h" #include "postmaster/autovacuum.h" #include "utils/memutils.h" #include "utils/pgstat_internal.h" #include "utils/rel.h" #include "utils/timestamp.h" -#include "catalog/catalog.h" /* Record that's written to 2PC state file when pgstat state is persisted */ @@ -246,7 +245,7 @@ pgstat_report_vacuum(Oid tableoid, bool shared, */ tabentry->ins_since_vacuum = 0; - if (IsAutoVacuumWorkerProcess()) + if (AmAutoVacuumWorkerProcess()) { tabentry->last_autovacuum_time = ts; tabentry->autovacuum_count++; @@ -337,7 +336,7 @@ pgstat_report_analyze(Relation rel, if (resetcounter) tabentry->mod_since_analyze = 0; - if (IsAutoVacuumWorkerProcess()) + if (AmAutoVacuumWorkerProcess()) { tabentry->last_autoanalyze_time = GetCurrentTimestamp(); tabentry->autoanalyze_count++; @@ -478,20 +477,52 @@ pgstat_fetch_stat_tabentry_ext(bool shared, Oid reloid) * Find any existing PgStat_TableStatus entry for rel_id in the current * database. If not found, try finding from shared tables. * - * If no entry found, return NULL, don't create a new one + * If an entry is found, copy it and increment the copy's counters with their + * subtransaction counterparts, then return the copy. The caller may need to + * pfree() the copy. + * + * If no entry found, return NULL, don't create a new one. */ PgStat_TableStatus * find_tabstat_entry(Oid rel_id) { PgStat_EntryRef *entry_ref; + PgStat_TableXactStatus *trans; + PgStat_TableStatus *tabentry = NULL; + PgStat_TableStatus *tablestatus = NULL; entry_ref = pgstat_fetch_pending_entry(PGSTAT_KIND_RELATION, MyDatabaseId, rel_id); if (!entry_ref) + { entry_ref = pgstat_fetch_pending_entry(PGSTAT_KIND_RELATION, InvalidOid, rel_id); + if (!entry_ref) + return tablestatus; + } + + tabentry = (PgStat_TableStatus *) entry_ref->pending; + tablestatus = palloc(sizeof(PgStat_TableStatus)); + *tablestatus = *tabentry; + + /* + * Reset tablestatus->trans in the copy of PgStat_TableStatus as it may + * point to a shared memory area. Its data is saved below, so removing it + * does not matter. + */ + tablestatus->trans = NULL; + + /* + * Live subtransaction counts are not included yet. This is not a hot + * code path so reconcile tuples_inserted, tuples_updated and + * tuples_deleted even if the caller may not be interested in this data. + */ + for (trans = tabentry->trans; trans != NULL; trans = trans->upper) + { + tablestatus->counts.tuples_inserted += trans->tuples_inserted; + tablestatus->counts.tuples_updated += trans->tuples_updated; + tablestatus->counts.tuples_deleted += trans->tuples_deleted; + } - if (entry_ref) - return entry_ref->pending; - return NULL; + return tablestatus; } /* @@ -761,8 +792,8 @@ pgstat_twophase_postabort(TransactionId xid, uint16 info, /* * Flush out pending stats for the entry * - * If nowait is true, this function returns false if lock could not - * immediately acquired, otherwise true is returned. + * If nowait is true and the lock could not be immediately acquired, returns + * false without flushing the entry. Otherwise returns true. * * Some of the stats are copied to the corresponding pending database stats * entry when successfully flushing. diff --git a/src/backend/utils/activity/pgstat_replslot.c b/src/backend/utils/activity/pgstat_replslot.c index f08abad49451d..da11b86744595 100644 --- a/src/backend/utils/activity/pgstat_replslot.c +++ b/src/backend/utils/activity/pgstat_replslot.c @@ -16,7 +16,7 @@ * dropped while shut down, which is addressed by not restoring stats for * slots that cannot be found by name when starting up. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat_replslot.c @@ -26,11 +26,10 @@ #include "postgres.h" #include "replication/slot.h" -#include "utils/builtins.h" /* for namestrcpy() */ #include "utils/pgstat_internal.h" -static int get_replslot_index(const char *name); +static int get_replslot_index(const char *name, bool need_lock); /* @@ -46,8 +45,10 @@ pgstat_reset_replslot(const char *name) Assert(name != NULL); + LWLockAcquire(ReplicationSlotControlLock, LW_SHARED); + /* Check if the slot exits with the given name. */ - slot = SearchNamedReplicationSlot(name, true); + slot = SearchNamedReplicationSlot(name, false); if (!slot) ereport(ERROR, @@ -56,15 +57,14 @@ pgstat_reset_replslot(const char *name) name))); /* - * Nothing to do for physical slots as we collect stats only for logical - * slots. + * Reset stats if it is a logical slot. Nothing to do for physical slots + * as we collect stats only for logical slots. */ - if (SlotIsPhysical(slot)) - return; + if (SlotIsLogical(slot)) + pgstat_reset(PGSTAT_KIND_REPLSLOT, InvalidOid, + ReplicationSlotIndex(slot)); - /* reset this one entry */ - pgstat_reset(PGSTAT_KIND_REPLSLOT, InvalidOid, - ReplicationSlotIndex(slot)); + LWLockRelease(ReplicationSlotControlLock); } /* @@ -113,6 +113,8 @@ pgstat_create_replslot(ReplicationSlot *slot) PgStat_EntryRef *entry_ref; PgStatShared_ReplSlot *shstatent; + Assert(LWLockHeldByMeInMode(ReplicationSlotAllocationLock, LW_EXCLUSIVE)); + entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_REPLSLOT, InvalidOid, ReplicationSlotIndex(slot), false); shstatent = (PgStatShared_ReplSlot *) entry_ref->shared_stats; @@ -153,8 +155,11 @@ pgstat_acquire_replslot(ReplicationSlot *slot) void pgstat_drop_replslot(ReplicationSlot *slot) { - pgstat_drop_entry(PGSTAT_KIND_REPLSLOT, InvalidOid, - ReplicationSlotIndex(slot)); + Assert(LWLockHeldByMeInMode(ReplicationSlotAllocationLock, LW_EXCLUSIVE)); + + if (!pgstat_drop_entry(PGSTAT_KIND_REPLSLOT, InvalidOid, + ReplicationSlotIndex(slot))) + pgstat_request_entry_refs_gc(); } /* @@ -164,13 +169,20 @@ pgstat_drop_replslot(ReplicationSlot *slot) PgStat_StatReplSlotEntry * pgstat_fetch_replslot(NameData slotname) { - int idx = get_replslot_index(NameStr(slotname)); + int idx; + PgStat_StatReplSlotEntry *slotentry = NULL; - if (idx == -1) - return NULL; + LWLockAcquire(ReplicationSlotControlLock, LW_SHARED); + + idx = get_replslot_index(NameStr(slotname), false); + + if (idx != -1) + slotentry = (PgStat_StatReplSlotEntry *) pgstat_fetch_entry(PGSTAT_KIND_REPLSLOT, + InvalidOid, idx); + + LWLockRelease(ReplicationSlotControlLock); - return (PgStat_StatReplSlotEntry *) - pgstat_fetch_entry(PGSTAT_KIND_REPLSLOT, InvalidOid, idx); + return slotentry; } void @@ -189,7 +201,7 @@ pgstat_replslot_to_serialized_name_cb(const PgStat_HashKey *key, const PgStatSha bool pgstat_replslot_from_serialized_name_cb(const NameData *name, PgStat_HashKey *key) { - int idx = get_replslot_index(NameStr(*name)); + int idx = get_replslot_index(NameStr(*name), true); /* slot might have been deleted */ if (idx == -1) @@ -209,13 +221,13 @@ pgstat_replslot_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts) } static int -get_replslot_index(const char *name) +get_replslot_index(const char *name, bool need_lock) { ReplicationSlot *slot; Assert(name != NULL); - slot = SearchNamedReplicationSlot(name, true); + slot = SearchNamedReplicationSlot(name, need_lock); if (!slot) return -1; diff --git a/src/backend/utils/activity/pgstat_shmem.c b/src/backend/utils/activity/pgstat_shmem.c index d1149adf70272..6ede0f4a6e100 100644 --- a/src/backend/utils/activity/pgstat_shmem.c +++ b/src/backend/utils/activity/pgstat_shmem.c @@ -3,7 +3,7 @@ * pgstat_shmem.c * Storage of stats entries in shared memory * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat_shmem.c @@ -64,6 +64,7 @@ static const dshash_parameters dsh_params = { sizeof(PgStatShared_HashEntry), pgstat_cmp_hash_key, pgstat_hash_hash_key, + dshash_memcpy, LWTRANCHE_PGSTATS_HASH }; @@ -180,7 +181,7 @@ StatsShmemInit(void) * With the limit in place, create the dshash table. XXX: It'd be nice * if there were dshash_create_in_place(). */ - dsh = dshash_create(dsa, &dsh_params, 0); + dsh = dshash_create(dsa, &dsh_params, NULL); ctl->hash_handle = dshash_get_hash_table_handle(dsh); /* lift limit set above */ @@ -245,6 +246,14 @@ pgstat_detach_shmem(void) pgStatLocal.shared_hash = NULL; dsa_detach(pgStatLocal.dsa); + + /* + * dsa_detach() does not decrement the DSA reference count as no segment + * was provided to dsa_attach_in_place(), causing no cleanup callbacks to + * be registered. Hence, release it manually now. + */ + dsa_release_in_place(pgStatLocal.shmem->raw_dsa_area); + pgStatLocal.dsa = NULL; } @@ -269,6 +278,11 @@ pgstat_init_entry(PgStat_Kind kind, * further if a longer lived reference is needed. */ pg_atomic_init_u32(&shhashent->refcount, 1); + + /* + * Initialize "generation" to 0, as freshly created. + */ + pg_atomic_init_u32(&shhashent->generation, 0); shhashent->dropped = false; chunk = dsa_allocate0(pgStatLocal.dsa, pgstat_get_kind_info(kind)->shared_size); @@ -292,6 +306,12 @@ pgstat_reinit_entry(PgStat_Kind kind, PgStatShared_HashEntry *shhashent) /* mark as not dropped anymore */ pg_atomic_fetch_add_u32(&shhashent->refcount, 1); + + /* + * Increment "generation", to let any backend with local references know + * that what they point to is outdated. + */ + pg_atomic_fetch_add_u32(&shhashent->generation, 1); shhashent->dropped = false; /* reinitialize content */ @@ -332,6 +352,7 @@ pgstat_acquire_entry_ref(PgStat_EntryRef *entry_ref, entry_ref->shared_stats = shheader; entry_ref->shared_entry = shhashent; + entry_ref->generation = pg_atomic_read_u32(&shhashent->generation); } /* @@ -397,11 +418,18 @@ PgStat_EntryRef * pgstat_get_entry_ref(PgStat_Kind kind, Oid dboid, Oid objoid, bool create, bool *created_entry) { - PgStat_HashKey key = {.kind = kind,.dboid = dboid,.objoid = objoid}; + PgStat_HashKey key; PgStatShared_HashEntry *shhashent; PgStatShared_Common *shheader = NULL; PgStat_EntryRef *entry_ref; + /* clear padding */ + memset(&key, 0, sizeof(struct PgStat_HashKey)); + + key.kind = kind; + key.dboid = dboid; + key.objoid = objoid; + /* * passing in created_entry only makes sense if we possibly could create * entry. @@ -490,7 +518,8 @@ pgstat_get_entry_ref(PgStat_Kind kind, Oid dboid, Oid objoid, bool create, * case are replication slot stats, where a new slot can be * created with the same index just after dropping. But oid * wraparound can lead to other cases as well. We just reset the - * stats to their plain state. + * stats to their plain state, while incrementing its "generation" + * in the shared entry for any remaining local references. */ shheader = pgstat_reinit_entry(kind, shhashent); pgstat_acquire_entry_ref(entry_ref, shhashent, shheader); @@ -557,10 +586,27 @@ pgstat_release_entry_ref(PgStat_HashKey key, PgStat_EntryRef *entry_ref, if (!shent) elog(ERROR, "could not find just referenced shared stats entry"); - Assert(pg_atomic_read_u32(&entry_ref->shared_entry->refcount) == 0); - Assert(entry_ref->shared_entry == shent); - - pgstat_free_entry(shent, NULL); + /* + * This entry may have been reinitialized while trying to release + * it, so double-check that it has not been reused while holding a + * lock on its shared entry. + */ + if (pg_atomic_read_u32(&entry_ref->shared_entry->generation) == + entry_ref->generation) + { + /* Same "generation", so we're OK with the removal */ + Assert(pg_atomic_read_u32(&entry_ref->shared_entry->refcount) == 0); + Assert(entry_ref->shared_entry == shent); + pgstat_free_entry(shent, NULL); + } + else + { + /* + * Shared stats entry has been reinitialized, so do not drop + * its shared entry, only release its lock. + */ + dshash_release_lock(pgStatLocal.shared_hash, shent); + } } } @@ -657,7 +703,8 @@ pgstat_gc_entry_refs(void) Assert(curage != 0); /* - * Some entries have been dropped. Invalidate cache pointer to them. + * Some entries have been dropped or reinitialized. Invalidate cache + * pointer to them. */ pgstat_entry_ref_hash_start_iterate(pgStatEntryRefHash, &i); while ((ent = pgstat_entry_ref_hash_iterate(pgStatEntryRefHash, &i)) != NULL) @@ -667,7 +714,13 @@ pgstat_gc_entry_refs(void) Assert(!entry_ref->shared_stats || entry_ref->shared_stats->magic == 0xdeadbeef); - if (!entry_ref->shared_entry->dropped) + /* + * "generation" checks for the case of entries being reinitialized, + * and "dropped" for the case where these are.. dropped. + */ + if (!entry_ref->shared_entry->dropped && + pg_atomic_read_u32(&entry_ref->shared_entry->generation) == + entry_ref->generation) continue; /* cannot gc shared ref that has pending data */ @@ -784,7 +837,11 @@ pgstat_drop_entry_internal(PgStatShared_HashEntry *shent, * backends to release their references. */ if (shent->dropped) - elog(ERROR, "can only drop stats once"); + elog(ERROR, + "trying to drop stats entry already dropped: kind=%s dboid=%u objoid=%u refcount=%u", + pgstat_get_kind_info(shent->key.kind)->name, + shent->key.dboid, shent->key.objoid, + pg_atomic_read_u32(&shent->refcount)); shent->dropped = true; /* release refcount marking entry as not dropped */ @@ -854,13 +911,31 @@ pgstat_drop_database_and_contents(Oid dboid) pgstat_request_entry_refs_gc(); } +/* + * Drop a single stats entry. + * + * This routine returns false if the stats entry of the dropped object could + * not be freed, true otherwise. + * + * The callers of this function should call pgstat_request_entry_refs_gc() + * if the stats entry could not be freed, to ensure that this entry's memory + * can be reclaimed later by a different backend calling + * pgstat_gc_entry_refs(). + */ bool pgstat_drop_entry(PgStat_Kind kind, Oid dboid, Oid objoid) { - PgStat_HashKey key = {.kind = kind,.dboid = dboid,.objoid = objoid}; + PgStat_HashKey key; PgStatShared_HashEntry *shent; bool freed = true; + /* clear padding */ + memset(&key, 0, sizeof(struct PgStat_HashKey)); + + key.kind = kind; + key.dboid = dboid; + key.objoid = objoid; + /* delete local reference */ if (pgStatEntryRefHash) { diff --git a/src/backend/utils/activity/pgstat_slru.c b/src/backend/utils/activity/pgstat_slru.c index 1b16740f396aa..56ea1c3378575 100644 --- a/src/backend/utils/activity/pgstat_slru.c +++ b/src/backend/utils/activity/pgstat_slru.c @@ -8,7 +8,7 @@ * storage implementation and the details about individual types of * statistics. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat_slru.c diff --git a/src/backend/utils/activity/pgstat_subscription.c b/src/backend/utils/activity/pgstat_subscription.c index 084d89c147642..fdfe92ad95874 100644 --- a/src/backend/utils/activity/pgstat_subscription.c +++ b/src/backend/utils/activity/pgstat_subscription.c @@ -8,7 +8,7 @@ * storage implementation and the details about individual types of * statistics. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat_subscription.c @@ -81,8 +81,8 @@ pgstat_fetch_stat_subscription(Oid subid) /* * Flush out pending stats for the entry * - * If nowait is true, this function returns false if lock could not - * immediately acquired, otherwise true is returned. + * If nowait is true and the lock could not be immediately acquired, returns + * false without flushing the entry. Otherwise returns true. */ bool pgstat_subscription_flush_cb(PgStat_EntryRef *entry_ref, bool nowait) diff --git a/src/backend/utils/activity/pgstat_wal.c b/src/backend/utils/activity/pgstat_wal.c index bcaed14d02ebc..0e374f133a904 100644 --- a/src/backend/utils/activity/pgstat_wal.c +++ b/src/backend/utils/activity/pgstat_wal.c @@ -8,7 +8,7 @@ * storage implementation and the details about individual types of * statistics. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat_wal.c @@ -17,8 +17,8 @@ #include "postgres.h" -#include "utils/pgstat_internal.h" #include "executor/instrument.h" +#include "utils/pgstat_internal.h" PgStat_PendingWalStats PendingWalStats = {0}; @@ -38,13 +38,25 @@ static WalUsage prevWalUsage; * * Must be called by processes that generate WAL, that do not call * pgstat_report_stat(), like walwriter. + * + * "force" set to true ensures that the statistics are flushed; note that + * this needs to acquire the pgstat shmem LWLock, waiting on it. When + * set to false, the statistics may not be flushed if the lock could not + * be acquired. */ void pgstat_report_wal(bool force) { - pgstat_flush_wal(force); + bool nowait; + + /* like in pgstat.c, don't wait for lock acquisition when !force */ + nowait = !force; + + /* flush wal stats */ + pgstat_flush_wal(nowait); - pgstat_flush_io(force); + /* flush IO stats */ + pgstat_flush_io(nowait); } /* diff --git a/src/backend/utils/activity/pgstat_xact.c b/src/backend/utils/activity/pgstat_xact.c index 369239d5014c5..1877d22f146bc 100644 --- a/src/backend/utils/activity/pgstat_xact.c +++ b/src/backend/utils/activity/pgstat_xact.c @@ -3,7 +3,7 @@ * pgstat_xact.c * Transactional integration for the cumulative statistics system. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/activity/pgstat_xact.c @@ -12,7 +12,6 @@ #include "postgres.h" -#include "access/transam.h" #include "access/xact.h" #include "pgstat.h" #include "utils/memutils.h" diff --git a/src/backend/utils/activity/wait_event.c b/src/backend/utils/activity/wait_event.c index 7940d646392b3..bbf59482be196 100644 --- a/src/backend/utils/activity/wait_event.c +++ b/src/backend/utils/activity/wait_event.c @@ -2,7 +2,7 @@ * wait_event.c * Wait event reporting infrastructure. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -22,12 +22,15 @@ */ #include "postgres.h" +#include "port/pg_bitutils.h" #include "storage/lmgr.h" /* for GetLockNameFromTagType */ #include "storage/lwlock.h" /* for GetLWLockIdentifier */ +#include "storage/spin.h" #include "utils/wait_event.h" static const char *pgstat_get_wait_activity(WaitEventActivity w); +static const char *pgstat_get_wait_bufferpin(WaitEventBufferPin w); static const char *pgstat_get_wait_client(WaitEventClient w); static const char *pgstat_get_wait_ipc(WaitEventIPC w); static const char *pgstat_get_wait_timeout(WaitEventTimeout w); @@ -37,6 +40,303 @@ static const char *pgstat_get_wait_io(WaitEventIO w); static uint32 local_my_wait_event_info; uint32 *my_wait_event_info = &local_my_wait_event_info; +#define WAIT_EVENT_CLASS_MASK 0xFF000000 +#define WAIT_EVENT_ID_MASK 0x0000FFFF + +/* + * Hash tables for storing custom wait event ids and their names in + * shared memory. + * + * WaitEventCustomHashByInfo is used to find the name from wait event + * information. Any backend can search it to find custom wait events. + * + * WaitEventCustomHashByName is used to find the wait event information from a + * name. It is used to ensure that no duplicated entries are registered. + * + * For simplicity, we use the same ID counter across types of custom events. + * We could end that anytime the need arises. + * + * The size of the hash table is based on the assumption that + * WAIT_EVENT_CUSTOM_HASH_INIT_SIZE is enough for most cases, and it seems + * unlikely that the number of entries will reach + * WAIT_EVENT_CUSTOM_HASH_MAX_SIZE. + */ +static HTAB *WaitEventCustomHashByInfo; /* find names from infos */ +static HTAB *WaitEventCustomHashByName; /* find infos from names */ + +#define WAIT_EVENT_CUSTOM_HASH_INIT_SIZE 16 +#define WAIT_EVENT_CUSTOM_HASH_MAX_SIZE 128 + +/* hash table entries */ +typedef struct WaitEventCustomEntryByInfo +{ + uint32 wait_event_info; /* hash key */ + char wait_event_name[NAMEDATALEN]; /* custom wait event name */ +} WaitEventCustomEntryByInfo; + +typedef struct WaitEventCustomEntryByName +{ + char wait_event_name[NAMEDATALEN]; /* hash key */ + uint32 wait_event_info; +} WaitEventCustomEntryByName; + + +/* dynamic allocation counter for custom wait events */ +typedef struct WaitEventCustomCounterData +{ + int nextId; /* next ID to assign */ + slock_t mutex; /* protects the counter */ +} WaitEventCustomCounterData; + +/* pointer to the shared memory */ +static WaitEventCustomCounterData *WaitEventCustomCounter; + +/* first event ID of custom wait events */ +#define WAIT_EVENT_CUSTOM_INITIAL_ID 1 + +static uint32 WaitEventCustomNew(uint32 classId, const char *wait_event_name); +static const char *GetWaitEventCustomIdentifier(uint32 wait_event_info); + +/* + * Return the space for dynamic shared hash tables and dynamic allocation counter. + */ +Size +WaitEventCustomShmemSize(void) +{ + Size sz; + + sz = MAXALIGN(sizeof(WaitEventCustomCounterData)); + sz = add_size(sz, hash_estimate_size(WAIT_EVENT_CUSTOM_HASH_MAX_SIZE, + sizeof(WaitEventCustomEntryByInfo))); + sz = add_size(sz, hash_estimate_size(WAIT_EVENT_CUSTOM_HASH_MAX_SIZE, + sizeof(WaitEventCustomEntryByName))); + return sz; +} + +/* + * Allocate shmem space for dynamic shared hash and dynamic allocation counter. + */ +void +WaitEventCustomShmemInit(void) +{ + bool found; + HASHCTL info; + + WaitEventCustomCounter = (WaitEventCustomCounterData *) + ShmemInitStruct("WaitEventCustomCounterData", + sizeof(WaitEventCustomCounterData), &found); + + if (!found) + { + /* initialize the allocation counter and its spinlock. */ + WaitEventCustomCounter->nextId = WAIT_EVENT_CUSTOM_INITIAL_ID; + SpinLockInit(&WaitEventCustomCounter->mutex); + } + + /* initialize or attach the hash tables to store custom wait events */ + info.keysize = sizeof(uint32); + info.entrysize = sizeof(WaitEventCustomEntryByInfo); + WaitEventCustomHashByInfo = + ShmemInitHash("WaitEventCustom hash by wait event information", + WAIT_EVENT_CUSTOM_HASH_INIT_SIZE, + WAIT_EVENT_CUSTOM_HASH_MAX_SIZE, + &info, + HASH_ELEM | HASH_BLOBS); + + /* key is a NULL-terminated string */ + info.keysize = sizeof(char[NAMEDATALEN]); + info.entrysize = sizeof(WaitEventCustomEntryByName); + WaitEventCustomHashByName = + ShmemInitHash("WaitEventCustom hash by name", + WAIT_EVENT_CUSTOM_HASH_INIT_SIZE, + WAIT_EVENT_CUSTOM_HASH_MAX_SIZE, + &info, + HASH_ELEM | HASH_STRINGS); +} + +/* + * Allocate a new event ID and return the wait event info. + * + * If the wait event name is already defined, this does not allocate a new + * entry; it returns the wait event information associated to the name. + */ +uint32 +WaitEventExtensionNew(const char *wait_event_name) +{ + return WaitEventCustomNew(PG_WAIT_EXTENSION, wait_event_name); +} + +uint32 +WaitEventInjectionPointNew(const char *wait_event_name) +{ + return WaitEventCustomNew(PG_WAIT_INJECTIONPOINT, wait_event_name); +} + +static uint32 +WaitEventCustomNew(uint32 classId, const char *wait_event_name) +{ + uint16 eventId; + bool found; + WaitEventCustomEntryByName *entry_by_name; + WaitEventCustomEntryByInfo *entry_by_info; + uint32 wait_event_info; + + /* Check the limit of the length of the event name */ + if (strlen(wait_event_name) >= NAMEDATALEN) + elog(ERROR, + "cannot use custom wait event string longer than %u characters", + NAMEDATALEN - 1); + + /* + * Check if the wait event info associated to the name is already defined, + * and return it if so. + */ + LWLockAcquire(WaitEventCustomLock, LW_SHARED); + entry_by_name = (WaitEventCustomEntryByName *) + hash_search(WaitEventCustomHashByName, wait_event_name, + HASH_FIND, &found); + LWLockRelease(WaitEventCustomLock); + if (found) + { + uint32 oldClassId; + + oldClassId = entry_by_name->wait_event_info & WAIT_EVENT_CLASS_MASK; + if (oldClassId != classId) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("wait event \"%s\" already exists in type \"%s\"", + wait_event_name, + pgstat_get_wait_event_type(entry_by_name->wait_event_info)))); + return entry_by_name->wait_event_info; + } + + /* + * Allocate and register a new wait event. Recheck if the event name + * exists, as it could be possible that a concurrent process has inserted + * one with the same name since the LWLock acquired again here was + * previously released. + */ + LWLockAcquire(WaitEventCustomLock, LW_EXCLUSIVE); + entry_by_name = (WaitEventCustomEntryByName *) + hash_search(WaitEventCustomHashByName, wait_event_name, + HASH_FIND, &found); + if (found) + { + uint32 oldClassId; + + LWLockRelease(WaitEventCustomLock); + oldClassId = entry_by_name->wait_event_info & WAIT_EVENT_CLASS_MASK; + if (oldClassId != classId) + ereport(ERROR, + (errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("wait event \"%s\" already exists in type \"%s\"", + wait_event_name, + pgstat_get_wait_event_type(entry_by_name->wait_event_info)))); + return entry_by_name->wait_event_info; + } + + /* Allocate a new event Id */ + SpinLockAcquire(&WaitEventCustomCounter->mutex); + + if (WaitEventCustomCounter->nextId >= WAIT_EVENT_CUSTOM_HASH_MAX_SIZE) + { + SpinLockRelease(&WaitEventCustomCounter->mutex); + ereport(ERROR, + errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("too many custom wait events")); + } + + eventId = WaitEventCustomCounter->nextId++; + + SpinLockRelease(&WaitEventCustomCounter->mutex); + + /* Register the new wait event */ + wait_event_info = classId | eventId; + entry_by_info = (WaitEventCustomEntryByInfo *) + hash_search(WaitEventCustomHashByInfo, &wait_event_info, + HASH_ENTER, &found); + Assert(!found); + strlcpy(entry_by_info->wait_event_name, wait_event_name, + sizeof(entry_by_info->wait_event_name)); + + entry_by_name = (WaitEventCustomEntryByName *) + hash_search(WaitEventCustomHashByName, wait_event_name, + HASH_ENTER, &found); + Assert(!found); + entry_by_name->wait_event_info = wait_event_info; + + LWLockRelease(WaitEventCustomLock); + + return wait_event_info; +} + +/* + * Return the name of a custom wait event information. + */ +static const char * +GetWaitEventCustomIdentifier(uint32 wait_event_info) +{ + bool found; + WaitEventCustomEntryByInfo *entry; + + /* Built-in event? */ + if (wait_event_info == PG_WAIT_EXTENSION) + return "Extension"; + + /* It is a user-defined wait event, so lookup hash table. */ + LWLockAcquire(WaitEventCustomLock, LW_SHARED); + entry = (WaitEventCustomEntryByInfo *) + hash_search(WaitEventCustomHashByInfo, &wait_event_info, + HASH_FIND, &found); + LWLockRelease(WaitEventCustomLock); + + if (!entry) + elog(ERROR, + "could not find custom name for wait event information %u", + wait_event_info); + + return entry->wait_event_name; +} + + +/* + * Returns a list of currently defined custom wait event names. The result is + * a palloc'd array, with the number of elements saved in *nwaitevents. + */ +char ** +GetWaitEventCustomNames(uint32 classId, int *nwaitevents) +{ + char **waiteventnames; + WaitEventCustomEntryByName *hentry; + HASH_SEQ_STATUS hash_seq; + int index; + int els; + + LWLockAcquire(WaitEventCustomLock, LW_SHARED); + + /* Now we can safely count the number of entries */ + els = hash_get_num_entries(WaitEventCustomHashByName); + + /* Allocate enough space for all entries */ + waiteventnames = palloc(els * sizeof(char *)); + + /* Now scan the hash table to copy the data */ + hash_seq_init(&hash_seq, WaitEventCustomHashByName); + + index = 0; + while ((hentry = (WaitEventCustomEntryByName *) hash_seq_search(&hash_seq)) != NULL) + { + if ((hentry->wait_event_info & WAIT_EVENT_CLASS_MASK) != classId) + continue; + waiteventnames[index] = pstrdup(hentry->wait_event_name); + index++; + } + + LWLockRelease(WaitEventCustomLock); + + *nwaitevents = index; + return waiteventnames; +} /* * Configure wait event reporting to report wait events to *wait_event_info. @@ -80,7 +380,7 @@ pgstat_get_wait_event_type(uint32 wait_event_info) if (wait_event_info == 0) return NULL; - classId = wait_event_info & 0xFF000000; + classId = wait_event_info & WAIT_EVENT_CLASS_MASK; switch (classId) { @@ -90,7 +390,7 @@ pgstat_get_wait_event_type(uint32 wait_event_info) case PG_WAIT_LOCK: event_type = "Lock"; break; - case PG_WAIT_BUFFER_PIN: + case PG_WAIT_BUFFERPIN: event_type = "BufferPin"; break; case PG_WAIT_ACTIVITY: @@ -111,6 +411,9 @@ pgstat_get_wait_event_type(uint32 wait_event_info) case PG_WAIT_IO: event_type = "IO"; break; + case PG_WAIT_INJECTIONPOINT: + event_type = "InjectionPoint"; + break; default: event_type = "???"; break; @@ -136,8 +439,8 @@ pgstat_get_wait_event(uint32 wait_event_info) if (wait_event_info == 0) return NULL; - classId = wait_event_info & 0xFF000000; - eventId = wait_event_info & 0x0000FFFF; + classId = wait_event_info & WAIT_EVENT_CLASS_MASK; + eventId = wait_event_info & WAIT_EVENT_ID_MASK; switch (classId) { @@ -147,9 +450,17 @@ pgstat_get_wait_event(uint32 wait_event_info) case PG_WAIT_LOCK: event_name = GetLockNameFromTagType(eventId); break; - case PG_WAIT_BUFFER_PIN: - event_name = "BufferPin"; + case PG_WAIT_EXTENSION: + case PG_WAIT_INJECTIONPOINT: + event_name = GetWaitEventCustomIdentifier(wait_event_info); break; + case PG_WAIT_BUFFERPIN: + { + WaitEventBufferPin w = (WaitEventBufferPin) wait_event_info; + + event_name = pgstat_get_wait_bufferpin(w); + break; + } case PG_WAIT_ACTIVITY: { WaitEventActivity w = (WaitEventActivity) wait_event_info; @@ -164,9 +475,6 @@ pgstat_get_wait_event(uint32 wait_event_info) event_name = pgstat_get_wait_client(w); break; } - case PG_WAIT_EXTENSION: - event_name = "Extension"; - break; case PG_WAIT_IPC: { WaitEventIPC w = (WaitEventIPC) wait_event_info; @@ -196,569 +504,4 @@ pgstat_get_wait_event(uint32 wait_event_info) return event_name; } -/* ---------- - * pgstat_get_wait_activity() - - * - * Convert WaitEventActivity to string. - * ---------- - */ -static const char * -pgstat_get_wait_activity(WaitEventActivity w) -{ - const char *event_name = "unknown wait event"; - - switch (w) - { - case WAIT_EVENT_ARCHIVER_MAIN: - event_name = "ArchiverMain"; - break; - case WAIT_EVENT_AUTOVACUUM_MAIN: - event_name = "AutoVacuumMain"; - break; - case WAIT_EVENT_BGWRITER_HIBERNATE: - event_name = "BgWriterHibernate"; - break; - case WAIT_EVENT_BGWRITER_MAIN: - event_name = "BgWriterMain"; - break; - case WAIT_EVENT_CHECKPOINTER_MAIN: - event_name = "CheckpointerMain"; - break; - case WAIT_EVENT_LOGICAL_APPLY_MAIN: - event_name = "LogicalApplyMain"; - break; - case WAIT_EVENT_LOGICAL_LAUNCHER_MAIN: - event_name = "LogicalLauncherMain"; - break; - case WAIT_EVENT_LOGICAL_PARALLEL_APPLY_MAIN: - event_name = "LogicalParallelApplyMain"; - break; - case WAIT_EVENT_RECOVERY_WAL_STREAM: - event_name = "RecoveryWalStream"; - break; - case WAIT_EVENT_SYSLOGGER_MAIN: - event_name = "SysLoggerMain"; - break; - case WAIT_EVENT_WAL_RECEIVER_MAIN: - event_name = "WalReceiverMain"; - break; - case WAIT_EVENT_WAL_SENDER_MAIN: - event_name = "WalSenderMain"; - break; - case WAIT_EVENT_WAL_WRITER_MAIN: - event_name = "WalWriterMain"; - break; - /* no default case, so that compiler will warn */ - } - - return event_name; -} - -/* ---------- - * pgstat_get_wait_client() - - * - * Convert WaitEventClient to string. - * ---------- - */ -static const char * -pgstat_get_wait_client(WaitEventClient w) -{ - const char *event_name = "unknown wait event"; - - switch (w) - { - case WAIT_EVENT_CLIENT_READ: - event_name = "ClientRead"; - break; - case WAIT_EVENT_CLIENT_WRITE: - event_name = "ClientWrite"; - break; - case WAIT_EVENT_GSS_OPEN_SERVER: - event_name = "GSSOpenServer"; - break; - case WAIT_EVENT_LIBPQWALRECEIVER_CONNECT: - event_name = "LibPQWalReceiverConnect"; - break; - case WAIT_EVENT_LIBPQWALRECEIVER_RECEIVE: - event_name = "LibPQWalReceiverReceive"; - break; - case WAIT_EVENT_SSL_OPEN_SERVER: - event_name = "SSLOpenServer"; - break; - case WAIT_EVENT_WAL_SENDER_WAIT_WAL: - event_name = "WalSenderWaitForWAL"; - break; - case WAIT_EVENT_WAL_SENDER_WRITE_DATA: - event_name = "WalSenderWriteData"; - break; - /* no default case, so that compiler will warn */ - } - - return event_name; -} - -/* ---------- - * pgstat_get_wait_ipc() - - * - * Convert WaitEventIPC to string. - * ---------- - */ -static const char * -pgstat_get_wait_ipc(WaitEventIPC w) -{ - const char *event_name = "unknown wait event"; - - switch (w) - { - case WAIT_EVENT_APPEND_READY: - event_name = "AppendReady"; - break; - case WAIT_EVENT_ARCHIVE_CLEANUP_COMMAND: - event_name = "ArchiveCleanupCommand"; - break; - case WAIT_EVENT_ARCHIVE_COMMAND: - event_name = "ArchiveCommand"; - break; - case WAIT_EVENT_BACKEND_TERMINATION: - event_name = "BackendTermination"; - break; - case WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE: - event_name = "BackupWaitWalArchive"; - break; - case WAIT_EVENT_BGWORKER_SHUTDOWN: - event_name = "BgWorkerShutdown"; - break; - case WAIT_EVENT_BGWORKER_STARTUP: - event_name = "BgWorkerStartup"; - break; - case WAIT_EVENT_BTREE_PAGE: - event_name = "BtreePage"; - break; - case WAIT_EVENT_BUFFER_IO: - event_name = "BufferIO"; - break; - case WAIT_EVENT_CHECKPOINT_DONE: - event_name = "CheckpointDone"; - break; - case WAIT_EVENT_CHECKPOINT_START: - event_name = "CheckpointStart"; - break; - case WAIT_EVENT_EXECUTE_GATHER: - event_name = "ExecuteGather"; - break; - case WAIT_EVENT_HASH_BATCH_ALLOCATE: - event_name = "HashBatchAllocate"; - break; - case WAIT_EVENT_HASH_BATCH_ELECT: - event_name = "HashBatchElect"; - break; - case WAIT_EVENT_HASH_BATCH_LOAD: - event_name = "HashBatchLoad"; - break; - case WAIT_EVENT_HASH_BUILD_ALLOCATE: - event_name = "HashBuildAllocate"; - break; - case WAIT_EVENT_HASH_BUILD_ELECT: - event_name = "HashBuildElect"; - break; - case WAIT_EVENT_HASH_BUILD_HASH_INNER: - event_name = "HashBuildHashInner"; - break; - case WAIT_EVENT_HASH_BUILD_HASH_OUTER: - event_name = "HashBuildHashOuter"; - break; - case WAIT_EVENT_HASH_GROW_BATCHES_DECIDE: - event_name = "HashGrowBatchesDecide"; - break; - case WAIT_EVENT_HASH_GROW_BATCHES_ELECT: - event_name = "HashGrowBatchesElect"; - break; - case WAIT_EVENT_HASH_GROW_BATCHES_FINISH: - event_name = "HashGrowBatchesFinish"; - break; - case WAIT_EVENT_HASH_GROW_BATCHES_REALLOCATE: - event_name = "HashGrowBatchesReallocate"; - break; - case WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION: - event_name = "HashGrowBatchesRepartition"; - break; - case WAIT_EVENT_HASH_GROW_BUCKETS_ELECT: - event_name = "HashGrowBucketsElect"; - break; - case WAIT_EVENT_HASH_GROW_BUCKETS_REALLOCATE: - event_name = "HashGrowBucketsReallocate"; - break; - case WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT: - event_name = "HashGrowBucketsReinsert"; - break; - case WAIT_EVENT_LOGICAL_APPLY_SEND_DATA: - event_name = "LogicalApplySendData"; - break; - case WAIT_EVENT_LOGICAL_PARALLEL_APPLY_STATE_CHANGE: - event_name = "LogicalParallelApplyStateChange"; - break; - case WAIT_EVENT_LOGICAL_SYNC_DATA: - event_name = "LogicalSyncData"; - break; - case WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE: - event_name = "LogicalSyncStateChange"; - break; - case WAIT_EVENT_MQ_INTERNAL: - event_name = "MessageQueueInternal"; - break; - case WAIT_EVENT_MQ_PUT_MESSAGE: - event_name = "MessageQueuePutMessage"; - break; - case WAIT_EVENT_MQ_RECEIVE: - event_name = "MessageQueueReceive"; - break; - case WAIT_EVENT_MQ_SEND: - event_name = "MessageQueueSend"; - break; - case WAIT_EVENT_PARALLEL_BITMAP_SCAN: - event_name = "ParallelBitmapScan"; - break; - case WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN: - event_name = "ParallelCreateIndexScan"; - break; - case WAIT_EVENT_PARALLEL_FINISH: - event_name = "ParallelFinish"; - break; - case WAIT_EVENT_PROCARRAY_GROUP_UPDATE: - event_name = "ProcArrayGroupUpdate"; - break; - case WAIT_EVENT_PROC_SIGNAL_BARRIER: - event_name = "ProcSignalBarrier"; - break; - case WAIT_EVENT_PROMOTE: - event_name = "Promote"; - break; - case WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT: - event_name = "RecoveryConflictSnapshot"; - break; - case WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE: - event_name = "RecoveryConflictTablespace"; - break; - case WAIT_EVENT_RECOVERY_END_COMMAND: - event_name = "RecoveryEndCommand"; - break; - case WAIT_EVENT_RECOVERY_PAUSE: - event_name = "RecoveryPause"; - break; - case WAIT_EVENT_REPLICATION_ORIGIN_DROP: - event_name = "ReplicationOriginDrop"; - break; - case WAIT_EVENT_REPLICATION_SLOT_DROP: - event_name = "ReplicationSlotDrop"; - break; - case WAIT_EVENT_RESTORE_COMMAND: - event_name = "RestoreCommand"; - break; - case WAIT_EVENT_SAFE_SNAPSHOT: - event_name = "SafeSnapshot"; - break; - case WAIT_EVENT_SYNC_REP: - event_name = "SyncRep"; - break; - case WAIT_EVENT_WAL_RECEIVER_EXIT: - event_name = "WalReceiverExit"; - break; - case WAIT_EVENT_WAL_RECEIVER_WAIT_START: - event_name = "WalReceiverWaitStart"; - break; - case WAIT_EVENT_XACT_GROUP_UPDATE: - event_name = "XactGroupUpdate"; - break; - /* no default case, so that compiler will warn */ - } - - return event_name; -} - -/* ---------- - * pgstat_get_wait_timeout() - - * - * Convert WaitEventTimeout to string. - * ---------- - */ -static const char * -pgstat_get_wait_timeout(WaitEventTimeout w) -{ - const char *event_name = "unknown wait event"; - - switch (w) - { - case WAIT_EVENT_BASE_BACKUP_THROTTLE: - event_name = "BaseBackupThrottle"; - break; - case WAIT_EVENT_CHECKPOINT_WRITE_DELAY: - event_name = "CheckpointWriteDelay"; - break; - case WAIT_EVENT_PG_SLEEP: - event_name = "PgSleep"; - break; - case WAIT_EVENT_RECOVERY_APPLY_DELAY: - event_name = "RecoveryApplyDelay"; - break; - case WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL: - event_name = "RecoveryRetrieveRetryInterval"; - break; - case WAIT_EVENT_REGISTER_SYNC_REQUEST: - event_name = "RegisterSyncRequest"; - break; - case WAIT_EVENT_SPIN_DELAY: - event_name = "SpinDelay"; - break; - case WAIT_EVENT_VACUUM_DELAY: - event_name = "VacuumDelay"; - break; - case WAIT_EVENT_VACUUM_TRUNCATE: - event_name = "VacuumTruncate"; - break; - /* no default case, so that compiler will warn */ - } - - return event_name; -} - -/* ---------- - * pgstat_get_wait_io() - - * - * Convert WaitEventIO to string. - * ---------- - */ -static const char * -pgstat_get_wait_io(WaitEventIO w) -{ - const char *event_name = "unknown wait event"; - - switch (w) - { - case WAIT_EVENT_BASEBACKUP_READ: - event_name = "BaseBackupRead"; - break; - case WAIT_EVENT_BASEBACKUP_SYNC: - event_name = "BaseBackupSync"; - break; - case WAIT_EVENT_BASEBACKUP_WRITE: - event_name = "BaseBackupWrite"; - break; - case WAIT_EVENT_BUFFILE_READ: - event_name = "BufFileRead"; - break; - case WAIT_EVENT_BUFFILE_WRITE: - event_name = "BufFileWrite"; - break; - case WAIT_EVENT_BUFFILE_TRUNCATE: - event_name = "BufFileTruncate"; - break; - case WAIT_EVENT_CONTROL_FILE_READ: - event_name = "ControlFileRead"; - break; - case WAIT_EVENT_CONTROL_FILE_SYNC: - event_name = "ControlFileSync"; - break; - case WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE: - event_name = "ControlFileSyncUpdate"; - break; - case WAIT_EVENT_CONTROL_FILE_WRITE: - event_name = "ControlFileWrite"; - break; - case WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE: - event_name = "ControlFileWriteUpdate"; - break; - case WAIT_EVENT_COPY_FILE_READ: - event_name = "CopyFileRead"; - break; - case WAIT_EVENT_COPY_FILE_WRITE: - event_name = "CopyFileWrite"; - break; - case WAIT_EVENT_DATA_FILE_EXTEND: - event_name = "DataFileExtend"; - break; - case WAIT_EVENT_DATA_FILE_FLUSH: - event_name = "DataFileFlush"; - break; - case WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC: - event_name = "DataFileImmediateSync"; - break; - case WAIT_EVENT_DATA_FILE_PREFETCH: - event_name = "DataFilePrefetch"; - break; - case WAIT_EVENT_DATA_FILE_READ: - event_name = "DataFileRead"; - break; - case WAIT_EVENT_DATA_FILE_SYNC: - event_name = "DataFileSync"; - break; - case WAIT_EVENT_DATA_FILE_TRUNCATE: - event_name = "DataFileTruncate"; - break; - case WAIT_EVENT_DATA_FILE_WRITE: - event_name = "DataFileWrite"; - break; - case WAIT_EVENT_DSM_ALLOCATE: - event_name = "DSMAllocate"; - break; - case WAIT_EVENT_DSM_FILL_ZERO_WRITE: - event_name = "DSMFillZeroWrite"; - break; - case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ: - event_name = "LockFileAddToDataDirRead"; - break; - case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC: - event_name = "LockFileAddToDataDirSync"; - break; - case WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE: - event_name = "LockFileAddToDataDirWrite"; - break; - case WAIT_EVENT_LOCK_FILE_CREATE_READ: - event_name = "LockFileCreateRead"; - break; - case WAIT_EVENT_LOCK_FILE_CREATE_SYNC: - event_name = "LockFileCreateSync"; - break; - case WAIT_EVENT_LOCK_FILE_CREATE_WRITE: - event_name = "LockFileCreateWrite"; - break; - case WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ: - event_name = "LockFileReCheckDataDirRead"; - break; - case WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC: - event_name = "LogicalRewriteCheckpointSync"; - break; - case WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC: - event_name = "LogicalRewriteMappingSync"; - break; - case WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE: - event_name = "LogicalRewriteMappingWrite"; - break; - case WAIT_EVENT_LOGICAL_REWRITE_SYNC: - event_name = "LogicalRewriteSync"; - break; - case WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE: - event_name = "LogicalRewriteTruncate"; - break; - case WAIT_EVENT_LOGICAL_REWRITE_WRITE: - event_name = "LogicalRewriteWrite"; - break; - case WAIT_EVENT_RELATION_MAP_READ: - event_name = "RelationMapRead"; - break; - case WAIT_EVENT_RELATION_MAP_REPLACE: - event_name = "RelationMapReplace"; - break; - case WAIT_EVENT_RELATION_MAP_WRITE: - event_name = "RelationMapWrite"; - break; - case WAIT_EVENT_REORDER_BUFFER_READ: - event_name = "ReorderBufferRead"; - break; - case WAIT_EVENT_REORDER_BUFFER_WRITE: - event_name = "ReorderBufferWrite"; - break; - case WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ: - event_name = "ReorderLogicalMappingRead"; - break; - case WAIT_EVENT_REPLICATION_SLOT_READ: - event_name = "ReplicationSlotRead"; - break; - case WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC: - event_name = "ReplicationSlotRestoreSync"; - break; - case WAIT_EVENT_REPLICATION_SLOT_SYNC: - event_name = "ReplicationSlotSync"; - break; - case WAIT_EVENT_REPLICATION_SLOT_WRITE: - event_name = "ReplicationSlotWrite"; - break; - case WAIT_EVENT_SLRU_FLUSH_SYNC: - event_name = "SLRUFlushSync"; - break; - case WAIT_EVENT_SLRU_READ: - event_name = "SLRURead"; - break; - case WAIT_EVENT_SLRU_SYNC: - event_name = "SLRUSync"; - break; - case WAIT_EVENT_SLRU_WRITE: - event_name = "SLRUWrite"; - break; - case WAIT_EVENT_SNAPBUILD_READ: - event_name = "SnapbuildRead"; - break; - case WAIT_EVENT_SNAPBUILD_SYNC: - event_name = "SnapbuildSync"; - break; - case WAIT_EVENT_SNAPBUILD_WRITE: - event_name = "SnapbuildWrite"; - break; - case WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC: - event_name = "TimelineHistoryFileSync"; - break; - case WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE: - event_name = "TimelineHistoryFileWrite"; - break; - case WAIT_EVENT_TIMELINE_HISTORY_READ: - event_name = "TimelineHistoryRead"; - break; - case WAIT_EVENT_TIMELINE_HISTORY_SYNC: - event_name = "TimelineHistorySync"; - break; - case WAIT_EVENT_TIMELINE_HISTORY_WRITE: - event_name = "TimelineHistoryWrite"; - break; - case WAIT_EVENT_TWOPHASE_FILE_READ: - event_name = "TwophaseFileRead"; - break; - case WAIT_EVENT_TWOPHASE_FILE_SYNC: - event_name = "TwophaseFileSync"; - break; - case WAIT_EVENT_TWOPHASE_FILE_WRITE: - event_name = "TwophaseFileWrite"; - break; - case WAIT_EVENT_VERSION_FILE_WRITE: - event_name = "VersionFileWrite"; - break; - case WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ: - event_name = "WALSenderTimelineHistoryRead"; - break; - case WAIT_EVENT_WAL_BOOTSTRAP_SYNC: - event_name = "WALBootstrapSync"; - break; - case WAIT_EVENT_WAL_BOOTSTRAP_WRITE: - event_name = "WALBootstrapWrite"; - break; - case WAIT_EVENT_WAL_COPY_READ: - event_name = "WALCopyRead"; - break; - case WAIT_EVENT_WAL_COPY_SYNC: - event_name = "WALCopySync"; - break; - case WAIT_EVENT_WAL_COPY_WRITE: - event_name = "WALCopyWrite"; - break; - case WAIT_EVENT_WAL_INIT_SYNC: - event_name = "WALInitSync"; - break; - case WAIT_EVENT_WAL_INIT_WRITE: - event_name = "WALInitWrite"; - break; - case WAIT_EVENT_WAL_READ: - event_name = "WALRead"; - break; - case WAIT_EVENT_WAL_SYNC: - event_name = "WALSync"; - break; - case WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN: - event_name = "WALSyncMethodAssign"; - break; - case WAIT_EVENT_WAL_WRITE: - event_name = "WALWrite"; - break; - - /* no default case, so that compiler will warn */ - } - - return event_name; -} +#include "pgstat_wait_event.c" diff --git a/src/backend/utils/activity/wait_event_funcs.c b/src/backend/utils/activity/wait_event_funcs.c new file mode 100644 index 0000000000000..fa8bc05c0c73f --- /dev/null +++ b/src/backend/utils/activity/wait_event_funcs.c @@ -0,0 +1,118 @@ +/*------------------------------------------------------------------------ + * + * wait_event_funcs.c + * Functions for accessing wait event data. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/utils/activity/wait_event_funcs.c + * + *------------------------------------------------------------------------ + */ +#include "postgres.h" + +#include "funcapi.h" +#include "utils/builtins.h" +#include "utils/wait_event.h" + +/* + * Each wait event has one corresponding entry in this structure, fed to + * the SQL function of this file. + */ +static const struct +{ + const char *type; + const char *name; + const char *description; +} + + waitEventData[] = +{ +#include "wait_event_funcs_data.c" + /* end of list */ + {NULL, NULL, NULL} +}; + + +/* + * pg_get_wait_events + * + * List information about wait events (type, name and description). + */ +Datum +pg_get_wait_events(PG_FUNCTION_ARGS) +{ +#define PG_GET_WAIT_EVENTS_COLS 3 + ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo; + char **waiteventnames; + int nbwaitevents; + + /* Build tuplestore to hold the result rows */ + InitMaterializedSRF(fcinfo, 0); + + /* Iterate over the list of wait events */ + for (int idx = 0; waitEventData[idx].type != NULL; idx++) + { + Datum values[PG_GET_WAIT_EVENTS_COLS] = {0}; + bool nulls[PG_GET_WAIT_EVENTS_COLS] = {0}; + + values[0] = CStringGetTextDatum(waitEventData[idx].type); + values[1] = CStringGetTextDatum(waitEventData[idx].name); + values[2] = CStringGetTextDatum(waitEventData[idx].description); + + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); + } + + /* Handle custom wait events for extensions */ + waiteventnames = GetWaitEventCustomNames(PG_WAIT_EXTENSION, + &nbwaitevents); + + for (int idx = 0; idx < nbwaitevents; idx++) + { + StringInfoData buf; + Datum values[PG_GET_WAIT_EVENTS_COLS] = {0}; + bool nulls[PG_GET_WAIT_EVENTS_COLS] = {0}; + + + values[0] = CStringGetTextDatum("Extension"); + values[1] = CStringGetTextDatum(waiteventnames[idx]); + + initStringInfo(&buf); + appendStringInfo(&buf, + "Waiting for custom wait event \"%s\" defined by extension module", + waiteventnames[idx]); + + values[2] = CStringGetTextDatum(buf.data); + + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); + } + + /* Likewise for injection points */ + waiteventnames = GetWaitEventCustomNames(PG_WAIT_INJECTIONPOINT, + &nbwaitevents); + + for (int idx = 0; idx < nbwaitevents; idx++) + { + StringInfoData buf; + Datum values[PG_GET_WAIT_EVENTS_COLS] = {0}; + bool nulls[PG_GET_WAIT_EVENTS_COLS] = {0}; + + + values[0] = CStringGetTextDatum("InjectionPoint"); + values[1] = CStringGetTextDatum(waiteventnames[idx]); + + initStringInfo(&buf); + appendStringInfo(&buf, + "Waiting for injection point \"%s\"", + waiteventnames[idx]); + + values[2] = CStringGetTextDatum(buf.data); + + tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls); + } + + return (Datum) 0; +} diff --git a/src/backend/utils/activity/wait_event_names.txt b/src/backend/utils/activity/wait_event_names.txt new file mode 100644 index 0000000000000..16144c2b72d28 --- /dev/null +++ b/src/backend/utils/activity/wait_event_names.txt @@ -0,0 +1,421 @@ +# +# wait_event_names.txt +# PostgreSQL wait events +# +# Copyright (c) 2023-2024, PostgreSQL Global Development Group +# +# This list serves as the basis for generating source and documentation files +# related to wait events. +# +# This file defines one wait event per line, with the following +# tab-separated fields: +# +# "Typedef enum definitions" "description in the docs" +# +# The files generated from this one are: +# +# src/backend/utils/activity/wait_event_types.h +# typedef enum definitions for wait events. +# +# src/backend/utils/activity/pgstat_wait_event.c +# C functions to get the wait event name based on the enum. +# +# src/backend/utils/activity/wait_event_types.sgml +# SGML tables of wait events for inclusion in the documentation. +# +# When adding a new wait event, make sure it is placed in the appropriate +# ClassName section. +# +# Wait events added in stable branches should be appended to the lists in +# the "ABI_compatibility:" region of their related ClassName section to +# preserve ABI compatibility of the C code generated from this file's data, +# respecting the order of any wait event already listed there. The +# "ABI_compatibility:" regions should remain empty on the master branch and +# on unreleased branches. +# +# WaitEventLWLock and WaitEventLock have their own C code for their wait event +# enums and function names. Hence, for these, only the SGML documentation is +# generated. +# +# This file is fed to src/backend/utils/activity/generate-wait_event_types.pl. +# + + +# +# Wait Events - Activity +# +# Use this category when a process is waiting because it has no work to do, +# unless the "Client" or "Timeout" category describes the situation better. +# Typically, this should only be used for background processes. +# + +Section: ClassName - WaitEventActivity + +ARCHIVER_MAIN "Waiting in main loop of archiver process." +AUTOVACUUM_MAIN "Waiting in main loop of autovacuum launcher process." +BGWRITER_HIBERNATE "Waiting in background writer process, hibernating." +BGWRITER_MAIN "Waiting in main loop of background writer process." +CHECKPOINTER_MAIN "Waiting in main loop of checkpointer process." +LOGICAL_APPLY_MAIN "Waiting in main loop of logical replication apply process." +LOGICAL_LAUNCHER_MAIN "Waiting in main loop of logical replication launcher process." +LOGICAL_PARALLEL_APPLY_MAIN "Waiting in main loop of logical replication parallel apply process." +RECOVERY_WAL_STREAM "Waiting in main loop of startup process for WAL to arrive, during streaming recovery." +REPLICATION_SLOTSYNC_MAIN "Waiting in main loop of slot sync worker." +REPLICATION_SLOTSYNC_SHUTDOWN "Waiting for slot sync worker to shut down." +SYSLOGGER_MAIN "Waiting in main loop of syslogger process." +WAL_RECEIVER_MAIN "Waiting in main loop of WAL receiver process." +WAL_SENDER_MAIN "Waiting in main loop of WAL sender process." +WAL_SUMMARIZER_WAL "Waiting in WAL summarizer for more WAL to be generated." +WAL_WRITER_MAIN "Waiting in main loop of WAL writer process." + +ABI_compatibility: + +# +# Wait Events - Client +# +# Use this category when a process is waiting to send data to or receive data +# from the frontend process to which it is connected. This is never used for +# a background process, which has no client connection. +# + +Section: ClassName - WaitEventClient + +CLIENT_READ "Waiting to read data from the client." +CLIENT_WRITE "Waiting to write data to the client." +GSS_OPEN_SERVER "Waiting to read data from the client while establishing a GSSAPI session." +LIBPQWALRECEIVER_CONNECT "Waiting in WAL receiver to establish connection to remote server." +LIBPQWALRECEIVER_RECEIVE "Waiting in WAL receiver to receive data from remote server." +SSL_OPEN_SERVER "Waiting for SSL while attempting connection." +WAIT_FOR_STANDBY_CONFIRMATION "Waiting for WAL to be received and flushed by the physical standby." +WAL_SENDER_WAIT_FOR_WAL "Waiting for WAL to be flushed in WAL sender process." +WAL_SENDER_WRITE_DATA "Waiting for any activity when processing replies from WAL receiver in WAL sender process." + +ABI_compatibility: + +# +# Wait Events - IPC +# +# Use this category when a process cannot complete the work it is doing because +# it is waiting for a notification from another process. +# + +Section: ClassName - WaitEventIPC + +APPEND_READY "Waiting for subplan nodes of an Append plan node to be ready." +ARCHIVE_CLEANUP_COMMAND "Waiting for to complete." +ARCHIVE_COMMAND "Waiting for to complete." +BACKEND_TERMINATION "Waiting for the termination of another backend." +BACKUP_WAIT_WAL_ARCHIVE "Waiting for WAL files required for a backup to be successfully archived." +BGWORKER_SHUTDOWN "Waiting for background worker to shut down." +BGWORKER_STARTUP "Waiting for background worker to start up." +BTREE_PAGE "Waiting for the page number needed to continue a parallel B-tree scan to become available." +BUFFER_IO "Waiting for buffer I/O to complete." +CHECKPOINT_DELAY_COMPLETE "Waiting for a backend that blocks a checkpoint from completing." +CHECKPOINT_DELAY_START "Waiting for a backend that blocks a checkpoint from starting." +CHECKPOINT_DONE "Waiting for a checkpoint to complete." +CHECKPOINT_START "Waiting for a checkpoint to start." +EXECUTE_GATHER "Waiting for activity from a child process while executing a Gather plan node." +HASH_BATCH_ALLOCATE "Waiting for an elected Parallel Hash participant to allocate a hash table." +HASH_BATCH_ELECT "Waiting to elect a Parallel Hash participant to allocate a hash table." +HASH_BATCH_LOAD "Waiting for other Parallel Hash participants to finish loading a hash table." +HASH_BUILD_ALLOCATE "Waiting for an elected Parallel Hash participant to allocate the initial hash table." +HASH_BUILD_ELECT "Waiting to elect a Parallel Hash participant to allocate the initial hash table." +HASH_BUILD_HASH_INNER "Waiting for other Parallel Hash participants to finish hashing the inner relation." +HASH_BUILD_HASH_OUTER "Waiting for other Parallel Hash participants to finish partitioning the outer relation." +HASH_GROW_BATCHES_DECIDE "Waiting to elect a Parallel Hash participant to decide on future batch growth." +HASH_GROW_BATCHES_ELECT "Waiting to elect a Parallel Hash participant to allocate more batches." +HASH_GROW_BATCHES_FINISH "Waiting for an elected Parallel Hash participant to decide on future batch growth." +HASH_GROW_BATCHES_REALLOCATE "Waiting for an elected Parallel Hash participant to allocate more batches." +HASH_GROW_BATCHES_REPARTITION "Waiting for other Parallel Hash participants to finish repartitioning." +HASH_GROW_BUCKETS_ELECT "Waiting to elect a Parallel Hash participant to allocate more buckets." +HASH_GROW_BUCKETS_REALLOCATE "Waiting for an elected Parallel Hash participant to finish allocating more buckets." +HASH_GROW_BUCKETS_REINSERT "Waiting for other Parallel Hash participants to finish inserting tuples into new buckets." +LOGICAL_APPLY_SEND_DATA "Waiting for a logical replication leader apply process to send data to a parallel apply process." +LOGICAL_PARALLEL_APPLY_STATE_CHANGE "Waiting for a logical replication parallel apply process to change state." +LOGICAL_SYNC_DATA "Waiting for a logical replication remote server to send data for initial table synchronization." +LOGICAL_SYNC_STATE_CHANGE "Waiting for a logical replication remote server to change state." +MESSAGE_QUEUE_INTERNAL "Waiting for another process to be attached to a shared message queue." +MESSAGE_QUEUE_PUT_MESSAGE "Waiting to write a protocol message to a shared message queue." +MESSAGE_QUEUE_RECEIVE "Waiting to receive bytes from a shared message queue." +MESSAGE_QUEUE_SEND "Waiting to send bytes to a shared message queue." +MULTIXACT_CREATION "Waiting for a multixact creation to complete." +PARALLEL_BITMAP_SCAN "Waiting for parallel bitmap scan to become initialized." +PARALLEL_CREATE_INDEX_SCAN "Waiting for parallel CREATE INDEX workers to finish heap scan." +PARALLEL_FINISH "Waiting for parallel workers to finish computing." +PROCARRAY_GROUP_UPDATE "Waiting for the group leader to clear the transaction ID at transaction end." +PROC_SIGNAL_BARRIER "Waiting for a barrier event to be processed by all backends." +PROMOTE "Waiting for standby promotion." +RECOVERY_CONFLICT_SNAPSHOT "Waiting for recovery conflict resolution for a vacuum cleanup." +RECOVERY_CONFLICT_TABLESPACE "Waiting for recovery conflict resolution for dropping a tablespace." +RECOVERY_END_COMMAND "Waiting for to complete." +RECOVERY_PAUSE "Waiting for recovery to be resumed." +REPLICATION_ORIGIN_DROP "Waiting for a replication origin to become inactive so it can be dropped." +REPLICATION_SLOT_DROP "Waiting for a replication slot to become inactive so it can be dropped." +RESTORE_COMMAND "Waiting for to complete." +SAFE_SNAPSHOT "Waiting to obtain a valid snapshot for a READ ONLY DEFERRABLE transaction." +SYNC_REP "Waiting for confirmation from a remote server during synchronous replication." +WAL_RECEIVER_EXIT "Waiting for the WAL receiver to exit." +WAL_RECEIVER_WAIT_START "Waiting for startup process to send initial data for streaming replication." +WAL_SUMMARY_READY "Waiting for a new WAL summary to be generated." +XACT_GROUP_UPDATE "Waiting for the group leader to update transaction status at transaction end." + +ABI_compatibility: + +# +# Wait Events - Timeout +# +# Use this category when a process is waiting for a timeout to expire. +# + +Section: ClassName - WaitEventTimeout + +BASE_BACKUP_THROTTLE "Waiting during base backup when throttling activity." +CHECKPOINT_WRITE_DELAY "Waiting between writes while performing a checkpoint." +PG_SLEEP "Waiting due to a call to pg_sleep or a sibling function." +RECOVERY_APPLY_DELAY "Waiting to apply WAL during recovery because of a delay setting." +RECOVERY_RETRIEVE_RETRY_INTERVAL "Waiting during recovery when WAL data is not available from any source (pg_wal, archive or stream)." +REGISTER_SYNC_REQUEST "Waiting while sending synchronization requests to the checkpointer, because the request queue is full." +SPIN_DELAY "Waiting while acquiring a contended spinlock." +VACUUM_DELAY "Waiting in a cost-based vacuum delay point." +VACUUM_TRUNCATE "Waiting to acquire an exclusive lock to truncate off any empty pages at the end of a table vacuumed." +WAL_SUMMARIZER_ERROR "Waiting after a WAL summarizer error." + +ABI_compatibility: + +# +# Wait Events - IO +# +# Use this category when a process is waiting for a IO. +# + +Section: ClassName - WaitEventIO + +BASEBACKUP_READ "Waiting for base backup to read from a file." +BASEBACKUP_SYNC "Waiting for data written by a base backup to reach durable storage." +BASEBACKUP_WRITE "Waiting for base backup to write to a file." +BUFFILE_READ "Waiting for a read from a buffered file." +BUFFILE_WRITE "Waiting for a write to a buffered file." +BUFFILE_TRUNCATE "Waiting for a buffered file to be truncated." +CONTROL_FILE_READ "Waiting for a read from the pg_control file." +CONTROL_FILE_SYNC "Waiting for the pg_control file to reach durable storage." +CONTROL_FILE_SYNC_UPDATE "Waiting for an update to the pg_control file to reach durable storage." +CONTROL_FILE_WRITE "Waiting for a write to the pg_control file." +CONTROL_FILE_WRITE_UPDATE "Waiting for a write to update the pg_control file." +COPY_FILE_READ "Waiting for a read during a file copy operation." +COPY_FILE_WRITE "Waiting for a write during a file copy operation." +DATA_FILE_EXTEND "Waiting for a relation data file to be extended." +DATA_FILE_FLUSH "Waiting for a relation data file to reach durable storage." +DATA_FILE_IMMEDIATE_SYNC "Waiting for an immediate synchronization of a relation data file to durable storage." +DATA_FILE_PREFETCH "Waiting for an asynchronous prefetch from a relation data file." +DATA_FILE_READ "Waiting for a read from a relation data file." +DATA_FILE_SYNC "Waiting for changes to a relation data file to reach durable storage." +DATA_FILE_TRUNCATE "Waiting for a relation data file to be truncated." +DATA_FILE_WRITE "Waiting for a write to a relation data file." +DSM_ALLOCATE "Waiting for a dynamic shared memory segment to be allocated." +DSM_FILL_ZERO_WRITE "Waiting to fill a dynamic shared memory backing file with zeroes." +LOCK_FILE_ADDTODATADIR_READ "Waiting for a read while adding a line to the data directory lock file." +LOCK_FILE_ADDTODATADIR_SYNC "Waiting for data to reach durable storage while adding a line to the data directory lock file." +LOCK_FILE_ADDTODATADIR_WRITE "Waiting for a write while adding a line to the data directory lock file." +LOCK_FILE_CREATE_READ "Waiting to read while creating the data directory lock file." +LOCK_FILE_CREATE_SYNC "Waiting for data to reach durable storage while creating the data directory lock file." +LOCK_FILE_CREATE_WRITE "Waiting for a write while creating the data directory lock file." +LOCK_FILE_RECHECKDATADIR_READ "Waiting for a read during recheck of the data directory lock file." +LOGICAL_REWRITE_CHECKPOINT_SYNC "Waiting for logical rewrite mappings to reach durable storage during a checkpoint." +LOGICAL_REWRITE_MAPPING_SYNC "Waiting for mapping data to reach durable storage during a logical rewrite." +LOGICAL_REWRITE_MAPPING_WRITE "Waiting for a write of mapping data during a logical rewrite." +LOGICAL_REWRITE_SYNC "Waiting for logical rewrite mappings to reach durable storage." +LOGICAL_REWRITE_TRUNCATE "Waiting for truncate of mapping data during a logical rewrite." +LOGICAL_REWRITE_WRITE "Waiting for a write of logical rewrite mappings." +RELATION_MAP_READ "Waiting for a read of the relation map file." +RELATION_MAP_REPLACE "Waiting for durable replacement of a relation map file." +RELATION_MAP_WRITE "Waiting for a write to the relation map file." +REORDER_BUFFER_READ "Waiting for a read during reorder buffer management." +REORDER_BUFFER_WRITE "Waiting for a write during reorder buffer management." +REORDER_LOGICAL_MAPPING_READ "Waiting for a read of a logical mapping during reorder buffer management." +REPLICATION_SLOT_READ "Waiting for a read from a replication slot control file." +REPLICATION_SLOT_RESTORE_SYNC "Waiting for a replication slot control file to reach durable storage while restoring it to memory." +REPLICATION_SLOT_SYNC "Waiting for a replication slot control file to reach durable storage." +REPLICATION_SLOT_WRITE "Waiting for a write to a replication slot control file." +SLRU_FLUSH_SYNC "Waiting for SLRU data to reach durable storage during a checkpoint or database shutdown." +SLRU_READ "Waiting for a read of an SLRU page." +SLRU_SYNC "Waiting for SLRU data to reach durable storage following a page write." +SLRU_WRITE "Waiting for a write of an SLRU page." +SNAPBUILD_READ "Waiting for a read of a serialized historical catalog snapshot." +SNAPBUILD_SYNC "Waiting for a serialized historical catalog snapshot to reach durable storage." +SNAPBUILD_WRITE "Waiting for a write of a serialized historical catalog snapshot." +TIMELINE_HISTORY_FILE_SYNC "Waiting for a timeline history file received via streaming replication to reach durable storage." +TIMELINE_HISTORY_FILE_WRITE "Waiting for a write of a timeline history file received via streaming replication." +TIMELINE_HISTORY_READ "Waiting for a read of a timeline history file." +TIMELINE_HISTORY_SYNC "Waiting for a newly created timeline history file to reach durable storage." +TIMELINE_HISTORY_WRITE "Waiting for a write of a newly created timeline history file." +TWOPHASE_FILE_READ "Waiting for a read of a two phase state file." +TWOPHASE_FILE_SYNC "Waiting for a two phase state file to reach durable storage." +TWOPHASE_FILE_WRITE "Waiting for a write of a two phase state file." +VERSION_FILE_SYNC "Waiting for the version file to reach durable storage while creating a database." +VERSION_FILE_WRITE "Waiting for the version file to be written while creating a database." +WALSENDER_TIMELINE_HISTORY_READ "Waiting for a read from a timeline history file during a walsender timeline command." +WAL_BOOTSTRAP_SYNC "Waiting for WAL to reach durable storage during bootstrapping." +WAL_BOOTSTRAP_WRITE "Waiting for a write of a WAL page during bootstrapping." +WAL_COPY_READ "Waiting for a read when creating a new WAL segment by copying an existing one." +WAL_COPY_SYNC "Waiting for a new WAL segment created by copying an existing one to reach durable storage." +WAL_COPY_WRITE "Waiting for a write when creating a new WAL segment by copying an existing one." +WAL_INIT_SYNC "Waiting for a newly initialized WAL file to reach durable storage." +WAL_INIT_WRITE "Waiting for a write while initializing a new WAL file." +WAL_READ "Waiting for a read from a WAL file." +WAL_SUMMARY_READ "Waiting for a read from a WAL summary file." +WAL_SUMMARY_WRITE "Waiting for a write to a WAL summary file." +WAL_SYNC "Waiting for a WAL file to reach durable storage." +WAL_SYNC_METHOD_ASSIGN "Waiting for data to reach durable storage while assigning a new WAL sync method." +WAL_WRITE "Waiting for a write to a WAL file." + +ABI_compatibility: + +# +# Wait Events - Buffer Pin +# + +Section: ClassName - WaitEventBufferPin + +BUFFER_PIN "Waiting to acquire an exclusive pin on a buffer." + +ABI_compatibility: + +# +# Wait Events - Extension +# + +Section: ClassName - WaitEventExtension + +Extension "Waiting in an extension." + +ABI_compatibility: + +# +# Wait Events - LWLock +# +# This class of wait events has its own set of C structure, so these are +# only used for the documentation. +# +# NB: Predefined LWLocks (i.e., those declared in lwlocklist.h) must be +# listed in the top section of locks and must be listed in the same order as in +# lwlocklist.h. +# + +Section: ClassName - WaitEventLWLock + +ShmemIndex "Waiting to find or allocate space in shared memory." +OidGen "Waiting to allocate a new OID." +XidGen "Waiting to allocate a new transaction ID." +ProcArray "Waiting to access the shared per-process data structures (typically, to get a snapshot or report a session's transaction ID)." +SInvalRead "Waiting to retrieve messages from the shared catalog invalidation queue." +SInvalWrite "Waiting to add a message to the shared catalog invalidation queue." +WALBufMapping "Waiting to replace a page in WAL buffers." +WALWrite "Waiting for WAL buffers to be written to disk." +ControlFile "Waiting to read or update the pg_control file or create a new WAL file." +MultiXactGen "Waiting to read or update shared multixact state." +RelCacheInit "Waiting to read or update a pg_internal.init relation cache initialization file." +CheckpointerComm "Waiting to manage fsync requests." +TwoPhaseState "Waiting to read or update the state of prepared transactions." +TablespaceCreate "Waiting to create or drop a tablespace." +BtreeVacuum "Waiting to read or update vacuum-related information for a B-tree index." +AddinShmemInit "Waiting to manage an extension's space allocation in shared memory." +Autovacuum "Waiting to read or update the current state of autovacuum workers." +AutovacuumSchedule "Waiting to ensure that a table selected for autovacuum still needs vacuuming." +SyncScan "Waiting to select the starting location of a synchronized table scan." +RelationMapping "Waiting to read or update a pg_filenode.map file (used to track the filenode assignments of certain system catalogs)." +NotifyQueue "Waiting to read or update NOTIFY messages." +SerializableXactHash "Waiting to read or update information about serializable transactions." +SerializableFinishedList "Waiting to access the list of finished serializable transactions." +SerializablePredicateList "Waiting to access the list of predicate locks held by serializable transactions." +SyncRep "Waiting to read or update information about the state of synchronous replication." +BackgroundWorker "Waiting to read or update background worker state." +DynamicSharedMemoryControl "Waiting to read or update dynamic shared memory allocation information." +AutoFile "Waiting to update the postgresql.auto.conf file." +ReplicationSlotAllocation "Waiting to allocate or free a replication slot." +ReplicationSlotControl "Waiting to read or update replication slot state." +CommitTs "Waiting to read or update the last value set for a transaction commit timestamp." +ReplicationOrigin "Waiting to create, drop or use a replication origin." +MultiXactTruncation "Waiting to read or truncate multixact information." +LogicalRepWorker "Waiting to read or update the state of logical replication workers." +XactTruncation "Waiting to execute pg_xact_status or update the oldest transaction ID available to it." +WrapLimitsVacuum "Waiting to update limits on transaction id and multixact consumption." +NotifyQueueTail "Waiting to update limit on NOTIFY message storage." +WaitEventCustom "Waiting to read or update custom wait events information." +WALSummarizer "Waiting to read or update WAL summarization state." +DSMRegistry "Waiting to read or update the dynamic shared memory registry." +InjectionPoint "Waiting to read or update information related to injection points." +SerialControl "Waiting to read or update shared pg_serial state." + +# +# END OF PREDEFINED LWLOCKS (DO NOT CHANGE THIS LINE) +# +# Predefined LWLocks (i.e., those declared in lwlocknames.h) must be listed +# in the section above and must be listed in the same order as in +# lwlocknames.h. Other LWLocks must be listed in the section below. +# + +XactBuffer "Waiting for I/O on a transaction status SLRU buffer." +CommitTsBuffer "Waiting for I/O on a commit timestamp SLRU buffer." +SubtransBuffer "Waiting for I/O on a sub-transaction SLRU buffer." +MultiXactOffsetBuffer "Waiting for I/O on a multixact offset SLRU buffer." +MultiXactMemberBuffer "Waiting for I/O on a multixact member SLRU buffer." +NotifyBuffer "Waiting for I/O on a NOTIFY message SLRU buffer." +SerialBuffer "Waiting for I/O on a serializable transaction conflict SLRU buffer." +WALInsert "Waiting to insert WAL data into a memory buffer." +BufferContent "Waiting to access a data page in memory." +ReplicationOriginState "Waiting to read or update the progress of one replication origin." +ReplicationSlotIO "Waiting for I/O on a replication slot." +LockFastPath "Waiting to read or update a process' fast-path lock information." +BufferMapping "Waiting to associate a data block with a buffer in the buffer pool." +LockManager "Waiting to read or update information about heavyweight locks." +PredicateLockManager "Waiting to access predicate lock information used by serializable transactions." +ParallelHashJoin "Waiting to synchronize workers during Parallel Hash Join plan execution." +ParallelQueryDSA "Waiting for parallel query dynamic shared memory allocation." +PerSessionDSA "Waiting for parallel query dynamic shared memory allocation." +PerSessionRecordType "Waiting to access a parallel query's information about composite types." +PerSessionRecordTypmod "Waiting to access a parallel query's information about type modifiers that identify anonymous record types." +SharedTupleStore "Waiting to access a shared tuple store during parallel query." +SharedTidBitmap "Waiting to access a shared TID bitmap during a parallel bitmap index scan." +ParallelAppend "Waiting to choose the next subplan during Parallel Append plan execution." +PerXactPredicateList "Waiting to access the list of predicate locks held by the current serializable transaction during a parallel query." +PgStatsDSA "Waiting for stats dynamic shared memory allocator access." +PgStatsHash "Waiting for stats shared memory hash table access." +PgStatsData "Waiting for shared memory stats data access." +LogicalRepLauncherDSA "Waiting to access logical replication launcher's dynamic shared memory allocator." +LogicalRepLauncherHash "Waiting to access logical replication launcher's shared hash table." +DSMRegistryDSA "Waiting to access dynamic shared memory registry's dynamic shared memory allocator." +DSMRegistryHash "Waiting to access dynamic shared memory registry's shared hash table." +CommitTsSLRU "Waiting to access the commit timestamp SLRU cache." +MultiXactOffsetSLRU "Waiting to access the multixact offset SLRU cache." +MultiXactMemberSLRU "Waiting to access the multixact member SLRU cache." +NotifySLRU "Waiting to access the NOTIFY message SLRU cache." +SerialSLRU "Waiting to access the serializable transaction conflict SLRU cache." +SubtransSLRU "Waiting to access the sub-transaction SLRU cache." +XactSLRU "Waiting to access the transaction status SLRU cache." +ParallelVacuumDSA "Waiting for parallel vacuum dynamic shared memory allocation." + +# No "ABI_compatibility" region here as WaitEventLWLock has its own C code. + +# +# Wait Events - Lock +# +# This class of wait events has its own set of C structure, so these are +# only used for the documentation. +# + +Section: ClassName - WaitEventLock + +relation "Waiting to acquire a lock on a relation." +extend "Waiting to extend a relation." +frozenid "Waiting to update pg_database.datfrozenxid and pg_database.datminmxid." +page "Waiting to acquire a lock on a page of a relation." +tuple "Waiting to acquire a lock on a tuple." +transactionid "Waiting for a transaction to finish." +virtualxid "Waiting to acquire a virtual transaction ID lock; see ." +spectoken "Waiting to acquire a speculative insertion lock." +object "Waiting to acquire a lock on a non-relation database object." +userlock "Waiting to acquire a user lock." +advisory "Waiting to acquire an advisory user lock." +applytransaction "Waiting to acquire a lock on a remote transaction being applied by a logical replication subscriber." + +# No "ABI_compatibility" region here as WaitEventLock has its own C code. diff --git a/src/backend/utils/adt/Makefile b/src/backend/utils/adt/Makefile index 0de0bbb1b8ac7..edb09d4e35622 100644 --- a/src/backend/utils/adt/Makefile +++ b/src/backend/utils/adt/Makefile @@ -82,6 +82,7 @@ OBJS = \ pg_lsn.o \ pg_upgrade_support.o \ pgstatfuncs.o \ + pseudorandomfuncs.o \ pseudotypes.o \ quote.o \ rangetypes.o \ @@ -115,6 +116,7 @@ OBJS = \ varchar.o \ varlena.o \ version.o \ + waitfuncs.o \ windowfuncs.o \ xid.o \ xid8funcs.o \ @@ -132,10 +134,9 @@ jsonpath_scan.c: FLEX_NO_BACKUP=yes # Force these dependencies to be known even without dependency info built: jsonpath_gram.o jsonpath_scan.o: jsonpath_gram.h -# jsonpath_gram.c and jsonpath_scan.c are in the distribution tarball, -# so they are not cleaned here. -clean distclean maintainer-clean: +clean: rm -f lex.backup + rm -f jsonpath_gram.c jsonpath_gram.h jsonpath_scan.c like.o: like.c like_match.c diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index c660fd3e7018e..d7b39140b3d22 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -3,7 +3,7 @@ * acl.c * Basic access control list data structures manipulation routines. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -27,7 +27,6 @@ #include "catalog/pg_foreign_server.h" #include "catalog/pg_language.h" #include "catalog/pg_namespace.h" -#include "catalog/pg_parameter_acl.h" #include "catalog/pg_proc.h" #include "catalog/pg_tablespace.h" #include "catalog/pg_type.h" @@ -37,13 +36,13 @@ #include "common/hashfn.h" #include "foreign/foreign.h" #include "funcapi.h" +#include "lib/bloomfilter.h" #include "lib/qunique.h" #include "miscadmin.h" #include "utils/acl.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/catcache.h" -#include "utils/guc.h" #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/memutils.h" @@ -80,6 +79,13 @@ static Oid cached_role[] = {InvalidOid, InvalidOid, InvalidOid}; static List *cached_roles[] = {NIL, NIL, NIL}; static uint32 cached_db_hash; +/* + * If the list of roles gathered by roles_is_member_of() grows larger than the + * below threshold, a Bloom filter is created to speed up list membership + * checks. This threshold is set arbitrarily high to avoid the overhead of + * creating the Bloom filter until it seems likely to provide a net benefit. + */ +#define ROLES_LIST_BLOOM_THRESHOLD 1024 static const char *getid(const char *s, char *n, Node *escontext); static void putid(char *p, const char *s); @@ -1085,6 +1091,12 @@ aclupdate(const Acl *old_acl, const AclItem *mod_aip, * The result is a modified copy; the input object is not changed. * * NB: caller is responsible for having detoasted the input ACL, if needed. + * + * Note: the name of this function is a bit of a misnomer, since it will + * happily make the specified role substitution whether the old role is + * really the owner of the parent object or merely mentioned in its ACL. + * But the vast majority of callers use it in connection with ALTER OWNER + * operations, so we'll keep the name. */ Acl * aclnewowner(const Acl *old_acl, Oid oldOwnerId, Oid newOwnerId) @@ -1921,14 +1933,15 @@ has_table_privilege_name_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = get_role_oid_or_public(NameStr(*username)); mode = convert_table_priv_string(priv_type_text); - if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid))) - PG_RETURN_NULL(); + aclresult = pg_class_aclcheck_ext(tableoid, roleid, mode, &is_missing); - aclresult = pg_class_aclcheck(tableoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -1947,14 +1960,15 @@ has_table_privilege_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = GetUserId(); mode = convert_table_priv_string(priv_type_text); - if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid))) - PG_RETURN_NULL(); + aclresult = pg_class_aclcheck_ext(tableoid, roleid, mode, &is_missing); - aclresult = pg_class_aclcheck(tableoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -1995,13 +2009,14 @@ has_table_privilege_id_id(PG_FUNCTION_ARGS) text *priv_type_text = PG_GETARG_TEXT_PP(2); AclMode mode; AclResult aclresult; + bool is_missing = false; mode = convert_table_priv_string(priv_type_text); - if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid))) - PG_RETURN_NULL(); + aclresult = pg_class_aclcheck_ext(tableoid, roleid, mode, &is_missing); - aclresult = pg_class_aclcheck(tableoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -2142,6 +2157,7 @@ has_sequence_privilege_name_id(PG_FUNCTION_ARGS) AclMode mode; AclResult aclresult; char relkind; + bool is_missing = false; roleid = get_role_oid_or_public(NameStr(*username)); mode = convert_sequence_priv_string(priv_type_text); @@ -2154,7 +2170,10 @@ has_sequence_privilege_name_id(PG_FUNCTION_ARGS) errmsg("\"%s\" is not a sequence", get_rel_name(sequenceoid)))); - aclresult = pg_class_aclcheck(sequenceoid, roleid, mode); + aclresult = pg_class_aclcheck_ext(sequenceoid, roleid, mode, &is_missing); + + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -2174,6 +2193,7 @@ has_sequence_privilege_id(PG_FUNCTION_ARGS) AclMode mode; AclResult aclresult; char relkind; + bool is_missing = false; roleid = GetUserId(); mode = convert_sequence_priv_string(priv_type_text); @@ -2186,7 +2206,10 @@ has_sequence_privilege_id(PG_FUNCTION_ARGS) errmsg("\"%s\" is not a sequence", get_rel_name(sequenceoid)))); - aclresult = pg_class_aclcheck(sequenceoid, roleid, mode); + aclresult = pg_class_aclcheck_ext(sequenceoid, roleid, mode, &is_missing); + + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -2233,6 +2256,7 @@ has_sequence_privilege_id_id(PG_FUNCTION_ARGS) AclMode mode; AclResult aclresult; char relkind; + bool is_missing = false; mode = convert_sequence_priv_string(priv_type_text); relkind = get_rel_relkind(sequenceoid); @@ -2244,7 +2268,10 @@ has_sequence_privilege_id_id(PG_FUNCTION_ARGS) errmsg("\"%s\" is not a sequence", get_rel_name(sequenceoid)))); - aclresult = pg_class_aclcheck(sequenceoid, roleid, mode); + aclresult = pg_class_aclcheck_ext(sequenceoid, roleid, mode, &is_missing); + + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -2353,18 +2380,22 @@ has_any_column_privilege_name_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = get_role_oid_or_public(NameStr(*username)); mode = convert_column_priv_string(priv_type_text); - if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid))) - PG_RETURN_NULL(); - /* First check at table level, then examine each column if needed */ - aclresult = pg_class_aclcheck(tableoid, roleid, mode); + aclresult = pg_class_aclcheck_ext(tableoid, roleid, mode, &is_missing); if (aclresult != ACLCHECK_OK) - aclresult = pg_attribute_aclcheck_all(tableoid, roleid, mode, - ACLMASK_ANY); + { + if (is_missing) + PG_RETURN_NULL(); + aclresult = pg_attribute_aclcheck_all_ext(tableoid, roleid, mode, + ACLMASK_ANY, &is_missing); + if (is_missing) + PG_RETURN_NULL(); + } PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -2383,18 +2414,22 @@ has_any_column_privilege_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = GetUserId(); mode = convert_column_priv_string(priv_type_text); - if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid))) - PG_RETURN_NULL(); - /* First check at table level, then examine each column if needed */ - aclresult = pg_class_aclcheck(tableoid, roleid, mode); + aclresult = pg_class_aclcheck_ext(tableoid, roleid, mode, &is_missing); if (aclresult != ACLCHECK_OK) - aclresult = pg_attribute_aclcheck_all(tableoid, roleid, mode, - ACLMASK_ANY); + { + if (is_missing) + PG_RETURN_NULL(); + aclresult = pg_attribute_aclcheck_all_ext(tableoid, roleid, mode, + ACLMASK_ANY, &is_missing); + if (is_missing) + PG_RETURN_NULL(); + } PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -2439,17 +2474,21 @@ has_any_column_privilege_id_id(PG_FUNCTION_ARGS) text *priv_type_text = PG_GETARG_TEXT_PP(2); AclMode mode; AclResult aclresult; + bool is_missing = false; mode = convert_column_priv_string(priv_type_text); - if (!SearchSysCacheExists1(RELOID, ObjectIdGetDatum(tableoid))) - PG_RETURN_NULL(); - /* First check at table level, then examine each column if needed */ - aclresult = pg_class_aclcheck(tableoid, roleid, mode); + aclresult = pg_class_aclcheck_ext(tableoid, roleid, mode, &is_missing); if (aclresult != ACLCHECK_OK) - aclresult = pg_attribute_aclcheck_all(tableoid, roleid, mode, - ACLMASK_ANY); + { + if (is_missing) + PG_RETURN_NULL(); + aclresult = pg_attribute_aclcheck_all_ext(tableoid, roleid, mode, + ACLMASK_ANY, &is_missing); + if (is_missing) + PG_RETURN_NULL(); + } PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -2989,14 +3028,17 @@ has_database_privilege_name_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = get_role_oid_or_public(NameStr(*username)); mode = convert_database_priv_string(priv_type_text); - if (!SearchSysCacheExists1(DATABASEOID, ObjectIdGetDatum(databaseoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(DatabaseRelationId, databaseoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(DatabaseRelationId, databaseoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3015,14 +3057,17 @@ has_database_privilege_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = GetUserId(); mode = convert_database_priv_string(priv_type_text); - if (!SearchSysCacheExists1(DATABASEOID, ObjectIdGetDatum(databaseoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(DatabaseRelationId, databaseoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(DatabaseRelationId, databaseoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3063,13 +3108,16 @@ has_database_privilege_id_id(PG_FUNCTION_ARGS) text *priv_type_text = PG_GETARG_TEXT_PP(2); AclMode mode; AclResult aclresult; + bool is_missing = false; mode = convert_database_priv_string(priv_type_text); - if (!SearchSysCacheExists1(DATABASEOID, ObjectIdGetDatum(databaseoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(DatabaseRelationId, databaseoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(DatabaseRelationId, databaseoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3186,14 +3234,17 @@ has_foreign_data_wrapper_privilege_name_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = get_role_oid_or_public(NameStr(*username)); mode = convert_foreign_data_wrapper_priv_string(priv_type_text); - if (!SearchSysCacheExists1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdwid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(ForeignDataWrapperRelationId, fdwid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(ForeignDataWrapperRelationId, fdwid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3212,14 +3263,17 @@ has_foreign_data_wrapper_privilege_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = GetUserId(); mode = convert_foreign_data_wrapper_priv_string(priv_type_text); - if (!SearchSysCacheExists1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdwid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(ForeignDataWrapperRelationId, fdwid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(ForeignDataWrapperRelationId, fdwid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3260,13 +3314,16 @@ has_foreign_data_wrapper_privilege_id_id(PG_FUNCTION_ARGS) text *priv_type_text = PG_GETARG_TEXT_PP(2); AclMode mode; AclResult aclresult; + bool is_missing = false; mode = convert_foreign_data_wrapper_priv_string(priv_type_text); - if (!SearchSysCacheExists1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdwid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(ForeignDataWrapperRelationId, fdwid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(ForeignDataWrapperRelationId, fdwid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3377,14 +3434,17 @@ has_function_privilege_name_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = get_role_oid_or_public(NameStr(*username)); mode = convert_function_priv_string(priv_type_text); - if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(functionoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(ProcedureRelationId, functionoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(ProcedureRelationId, functionoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3403,14 +3463,17 @@ has_function_privilege_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = GetUserId(); mode = convert_function_priv_string(priv_type_text); - if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(functionoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(ProcedureRelationId, functionoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(ProcedureRelationId, functionoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3451,13 +3514,16 @@ has_function_privilege_id_id(PG_FUNCTION_ARGS) text *priv_type_text = PG_GETARG_TEXT_PP(2); AclMode mode; AclResult aclresult; + bool is_missing = false; mode = convert_function_priv_string(priv_type_text); - if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(functionoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(ProcedureRelationId, functionoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(ProcedureRelationId, functionoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3577,14 +3643,17 @@ has_language_privilege_name_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = get_role_oid_or_public(NameStr(*username)); mode = convert_language_priv_string(priv_type_text); - if (!SearchSysCacheExists1(LANGOID, ObjectIdGetDatum(languageoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(LanguageRelationId, languageoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(LanguageRelationId, languageoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3603,14 +3672,17 @@ has_language_privilege_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = GetUserId(); mode = convert_language_priv_string(priv_type_text); - if (!SearchSysCacheExists1(LANGOID, ObjectIdGetDatum(languageoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(LanguageRelationId, languageoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(LanguageRelationId, languageoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3651,13 +3723,16 @@ has_language_privilege_id_id(PG_FUNCTION_ARGS) text *priv_type_text = PG_GETARG_TEXT_PP(2); AclMode mode; AclResult aclresult; + bool is_missing = false; mode = convert_language_priv_string(priv_type_text); - if (!SearchSysCacheExists1(LANGOID, ObjectIdGetDatum(languageoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(LanguageRelationId, languageoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(LanguageRelationId, languageoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3768,14 +3843,17 @@ has_schema_privilege_name_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = get_role_oid_or_public(NameStr(*username)); mode = convert_schema_priv_string(priv_type_text); - if (!SearchSysCacheExists1(NAMESPACEOID, ObjectIdGetDatum(schemaoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(NamespaceRelationId, schemaoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(NamespaceRelationId, schemaoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3794,14 +3872,17 @@ has_schema_privilege_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = GetUserId(); mode = convert_schema_priv_string(priv_type_text); - if (!SearchSysCacheExists1(NAMESPACEOID, ObjectIdGetDatum(schemaoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(NamespaceRelationId, schemaoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(NamespaceRelationId, schemaoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3842,13 +3923,16 @@ has_schema_privilege_id_id(PG_FUNCTION_ARGS) text *priv_type_text = PG_GETARG_TEXT_PP(2); AclMode mode; AclResult aclresult; + bool is_missing = false; mode = convert_schema_priv_string(priv_type_text); - if (!SearchSysCacheExists1(NAMESPACEOID, ObjectIdGetDatum(schemaoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(NamespaceRelationId, schemaoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(NamespaceRelationId, schemaoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3961,14 +4045,17 @@ has_server_privilege_name_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = get_role_oid_or_public(NameStr(*username)); mode = convert_server_priv_string(priv_type_text); - if (!SearchSysCacheExists1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(ForeignServerRelationId, serverid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(ForeignServerRelationId, serverid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -3987,14 +4074,17 @@ has_server_privilege_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = GetUserId(); mode = convert_server_priv_string(priv_type_text); - if (!SearchSysCacheExists1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(ForeignServerRelationId, serverid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(ForeignServerRelationId, serverid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -4035,13 +4125,16 @@ has_server_privilege_id_id(PG_FUNCTION_ARGS) text *priv_type_text = PG_GETARG_TEXT_PP(2); AclMode mode; AclResult aclresult; + bool is_missing = false; mode = convert_server_priv_string(priv_type_text); - if (!SearchSysCacheExists1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(ForeignServerRelationId, serverid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(ForeignServerRelationId, serverid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -4152,14 +4245,17 @@ has_tablespace_privilege_name_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = get_role_oid_or_public(NameStr(*username)); mode = convert_tablespace_priv_string(priv_type_text); - if (!SearchSysCacheExists1(TABLESPACEOID, ObjectIdGetDatum(tablespaceoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(TableSpaceRelationId, tablespaceoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(TableSpaceRelationId, tablespaceoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -4178,14 +4274,17 @@ has_tablespace_privilege_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = GetUserId(); mode = convert_tablespace_priv_string(priv_type_text); - if (!SearchSysCacheExists1(TABLESPACEOID, ObjectIdGetDatum(tablespaceoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(TableSpaceRelationId, tablespaceoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(TableSpaceRelationId, tablespaceoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -4226,13 +4325,16 @@ has_tablespace_privilege_id_id(PG_FUNCTION_ARGS) text *priv_type_text = PG_GETARG_TEXT_PP(2); AclMode mode; AclResult aclresult; + bool is_missing = false; mode = convert_tablespace_priv_string(priv_type_text); - if (!SearchSysCacheExists1(TABLESPACEOID, ObjectIdGetDatum(tablespaceoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(TableSpaceRelationId, tablespaceoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(TableSpaceRelationId, tablespaceoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -4342,14 +4444,17 @@ has_type_privilege_name_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = get_role_oid_or_public(NameStr(*username)); mode = convert_type_priv_string(priv_type_text); - if (!SearchSysCacheExists1(TYPEOID, ObjectIdGetDatum(typeoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(TypeRelationId, typeoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(TypeRelationId, typeoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -4368,14 +4473,17 @@ has_type_privilege_id(PG_FUNCTION_ARGS) Oid roleid; AclMode mode; AclResult aclresult; + bool is_missing = false; roleid = GetUserId(); mode = convert_type_priv_string(priv_type_text); - if (!SearchSysCacheExists1(TYPEOID, ObjectIdGetDatum(typeoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(TypeRelationId, typeoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(TypeRelationId, typeoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -4416,13 +4524,16 @@ has_type_privilege_id_id(PG_FUNCTION_ARGS) text *priv_type_text = PG_GETARG_TEXT_PP(2); AclMode mode; AclResult aclresult; + bool is_missing = false; mode = convert_type_priv_string(priv_type_text); - if (!SearchSysCacheExists1(TYPEOID, ObjectIdGetDatum(typeoid))) - PG_RETURN_NULL(); + aclresult = object_aclcheck_ext(TypeRelationId, typeoid, + roleid, mode, + &is_missing); - aclresult = object_aclcheck(TypeRelationId, typeoid, roleid, mode); + if (is_missing) + PG_RETURN_NULL(); PG_RETURN_BOOL(aclresult == ACLCHECK_OK); } @@ -4821,6 +4932,53 @@ RoleMembershipCacheCallback(Datum arg, int cacheid, uint32 hashvalue) cached_role[ROLERECURSE_SETROLE] = InvalidOid; } +/* + * A helper function for roles_is_member_of() that provides an optimized + * implementation of list_append_unique_oid() via a Bloom filter. The caller + * (i.e., roles_is_member_of()) is responsible for freeing bf once it is done + * using this function. + */ +static inline List * +roles_list_append(List *roles_list, bloom_filter **bf, Oid role) +{ + unsigned char *roleptr = (unsigned char *) &role; + + /* + * If there is a previously-created Bloom filter, use it to try to + * determine whether the role is missing from the list. If it says yes, + * that's a hard fact and we can go ahead and add the role. If it says + * no, that's only probabilistic and we'd better search the list. Without + * a filter, we must always do an ordinary linear search through the + * existing list. + */ + if ((*bf && bloom_lacks_element(*bf, roleptr, sizeof(Oid))) || + !list_member_oid(roles_list, role)) + { + /* + * If the list is large, we take on the overhead of creating and + * populating a Bloom filter to speed up future calls to this + * function. + */ + if (*bf == NULL && + list_length(roles_list) > ROLES_LIST_BLOOM_THRESHOLD) + { + *bf = bloom_create(ROLES_LIST_BLOOM_THRESHOLD * 10, work_mem, 0); + foreach_oid(roleid, roles_list) + bloom_add_element(*bf, (unsigned char *) &roleid, sizeof(Oid)); + } + + /* + * Finally, add the role to the list and the Bloom filter, if it + * exists. + */ + roles_list = lappend_oid(roles_list, role); + if (*bf) + bloom_add_element(*bf, roleptr, sizeof(Oid)); + } + + return roles_list; +} + /* * Get a list of roles that the specified roleid is a member of * @@ -4849,6 +5007,7 @@ roles_is_member_of(Oid roleid, enum RoleRecurseType type, ListCell *l; List *new_cached_roles; MemoryContext oldctx; + bloom_filter *bf = NULL; Assert(OidIsValid(admin_of) == PointerIsValid(admin_role)); if (admin_role != NULL) @@ -4926,16 +5085,22 @@ roles_is_member_of(Oid roleid, enum RoleRecurseType type, * graph, we must test for having already seen this role. It is * legal for instance to have both A->B and A->C->B. */ - roles_list = list_append_unique_oid(roles_list, otherid); + roles_list = roles_list_append(roles_list, &bf, otherid); } ReleaseSysCacheList(memlist); /* implement pg_database_owner implicit membership */ if (memberid == dba && OidIsValid(dba)) - roles_list = list_append_unique_oid(roles_list, - ROLE_PG_DATABASE_OWNER); + roles_list = roles_list_append(roles_list, &bf, + ROLE_PG_DATABASE_OWNER); } + /* + * Free the Bloom filter created by roles_list_append(), if there is one. + */ + if (bf) + bloom_free(bf); + /* * Copy the completed list into TopMemoryContext so it will persist. */ @@ -5342,13 +5507,13 @@ get_rolespec_tuple(const RoleSpec *role) case ROLESPEC_CURRENT_ROLE: case ROLESPEC_CURRENT_USER: - tuple = SearchSysCache1(AUTHOID, GetUserId()); + tuple = SearchSysCache1(AUTHOID, ObjectIdGetDatum(GetUserId())); if (!HeapTupleIsValid(tuple)) elog(ERROR, "cache lookup failed for role %u", GetUserId()); break; case ROLESPEC_SESSION_USER: - tuple = SearchSysCache1(AUTHOID, GetSessionUserId()); + tuple = SearchSysCache1(AUTHOID, ObjectIdGetDatum(GetSessionUserId())); if (!HeapTupleIsValid(tuple)) elog(ERROR, "cache lookup failed for role %u", GetSessionUserId()); break; diff --git a/src/backend/utils/adt/amutils.c b/src/backend/utils/adt/amutils.c index 48852bf79e24d..dd39a994c8df0 100644 --- a/src/backend/utils/adt/amutils.c +++ b/src/backend/utils/adt/amutils.c @@ -3,7 +3,7 @@ * amutils.c * SQL-level APIs related to index access methods. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/utils/adt/array_expanded.c b/src/backend/utils/adt/array_expanded.c index 4509fddeb9148..cc3713b97b71e 100644 --- a/src/backend/utils/adt/array_expanded.c +++ b/src/backend/utils/adt/array_expanded.c @@ -3,7 +3,7 @@ * array_expanded.c * Basic functions for manipulating expanded arrays. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/utils/adt/array_selfuncs.c b/src/backend/utils/adt/array_selfuncs.c index 9207a5ed193f6..e2af89f5cc557 100644 --- a/src/backend/utils/adt/array_selfuncs.c +++ b/src/backend/utils/adt/array_selfuncs.c @@ -3,7 +3,7 @@ * array_selfuncs.c * Functions for selectivity estimation of array operators * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -17,11 +17,10 @@ #include #include "access/htup_details.h" -#include "catalog/pg_collation.h" #include "catalog/pg_operator.h" #include "catalog/pg_statistic.h" #include "utils/array.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/lsyscache.h" #include "utils/selfuncs.h" #include "utils/typcache.h" diff --git a/src/backend/utils/adt/array_typanalyze.c b/src/backend/utils/adt/array_typanalyze.c index 52e160d6bbb20..2c633bee6b1c6 100644 --- a/src/backend/utils/adt/array_typanalyze.c +++ b/src/backend/utils/adt/array_typanalyze.c @@ -3,7 +3,7 @@ * array_typanalyze.c * Functions for gathering statistics from array columns * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -17,8 +17,8 @@ #include "access/detoast.h" #include "commands/vacuum.h" #include "utils/array.h" -#include "utils/builtins.h" #include "utils/datum.h" +#include "utils/fmgrprotos.h" #include "utils/lsyscache.h" #include "utils/typcache.h" @@ -263,7 +263,7 @@ compute_array_stats(VacAttrStats *stats, AnalyzeAttrFetchFunc fetchfunc, * the number of individual elements tracked in pg_statistic ought to be * more than the number of values for a simple scalar column. */ - num_mcelem = stats->attr->attstattarget * 10; + num_mcelem = stats->attstattarget * 10; /* * We set bucket width equal to num_mcelem / 0.007 as per the comment @@ -575,7 +575,7 @@ compute_array_stats(VacAttrStats *stats, AnalyzeAttrFetchFunc fetchfunc, count_items_count = hash_get_num_entries(count_tab); if (count_items_count > 0) { - int num_hist = stats->attr->attstattarget; + int num_hist = stats->attstattarget; DECountItem **sorted_count_items; int j; int delta; diff --git a/src/backend/utils/adt/array_userfuncs.c b/src/backend/utils/adt/array_userfuncs.c index 5c4fdcfba4693..6599be2ec5e88 100644 --- a/src/backend/utils/adt/array_userfuncs.c +++ b/src/backend/utils/adt/array_userfuncs.c @@ -3,7 +3,7 @@ * array_userfuncs.c * Misc user-visible array support functions * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/array_userfuncs.c @@ -13,13 +13,13 @@ #include "postgres.h" #include "catalog/pg_type.h" -#include "libpq/pqformat.h" #include "common/int.h" #include "common/pg_prng.h" +#include "libpq/pqformat.h" #include "port/pg_bitutils.h" #include "utils/array.h" -#include "utils/datum.h" #include "utils/builtins.h" +#include "utils/datum.h" #include "utils/lsyscache.h" #include "utils/typcache.h" @@ -723,12 +723,11 @@ array_agg_deserialize(PG_FUNCTION_ARGS) sstate = PG_GETARG_BYTEA_PP(0); /* - * Copy the bytea into a StringInfo so that we can "receive" it using the - * standard recv-function infrastructure. + * Initialize a StringInfo so that we can "receive" it using the standard + * recv-function infrastructure. */ - initStringInfo(&buf); - appendBinaryStringInfo(&buf, - VARDATA_ANY(sstate), VARSIZE_ANY_EXHDR(sstate)); + initReadOnlyStringInfo(&buf, VARDATA_ANY(sstate), + VARSIZE_ANY_EXHDR(sstate)); /* element_type */ element_type = pq_getmsgint(&buf, 4); @@ -784,7 +783,6 @@ array_agg_deserialize(PG_FUNCTION_ARGS) { int itemlen; StringInfoData elem_buf; - char csave; if (result->dnulls[i]) { @@ -799,33 +797,23 @@ array_agg_deserialize(PG_FUNCTION_ARGS) errmsg("insufficient data left in message"))); /* - * Rather than copying data around, we just set up a phony - * StringInfo pointing to the correct portion of the input buffer. - * We assume we can scribble on the input buffer so as to maintain - * the convention that StringInfos have a trailing null. + * Rather than copying data around, we just initialize a + * StringInfo pointing to the correct portion of the message + * buffer. */ - elem_buf.data = &buf.data[buf.cursor]; - elem_buf.maxlen = itemlen + 1; - elem_buf.len = itemlen; - elem_buf.cursor = 0; + initReadOnlyStringInfo(&elem_buf, &buf.data[buf.cursor], itemlen); buf.cursor += itemlen; - csave = buf.data[buf.cursor]; - buf.data[buf.cursor] = '\0'; - /* Now call the element's receiveproc */ result->dvalues[i] = ReceiveFunctionCall(&iodata->typreceive, &elem_buf, iodata->typioparam, -1); - - buf.data[buf.cursor] = csave; } } pq_getmsgend(&buf); - pfree(buf.data); PG_RETURN_POINTER(result); } @@ -1134,12 +1122,11 @@ array_agg_array_deserialize(PG_FUNCTION_ARGS) sstate = PG_GETARG_BYTEA_PP(0); /* - * Copy the bytea into a StringInfo so that we can "receive" it using the - * standard recv-function infrastructure. + * Initialize a StringInfo so that we can "receive" it using the standard + * recv-function infrastructure. */ - initStringInfo(&buf); - appendBinaryStringInfo(&buf, - VARDATA_ANY(sstate), VARSIZE_ANY_EXHDR(sstate)); + initReadOnlyStringInfo(&buf, VARDATA_ANY(sstate), + VARSIZE_ANY_EXHDR(sstate)); /* element_type */ element_type = pq_getmsgint(&buf, 4); @@ -1197,7 +1184,6 @@ array_agg_array_deserialize(PG_FUNCTION_ARGS) memcpy(result->lbs, temp, sizeof(result->lbs)); pq_getmsgend(&buf); - pfree(buf.data); PG_RETURN_POINTER(result); } diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c index 9000f83a8366d..2fbd1972d7220 100644 --- a/src/backend/utils/adt/arrayfuncs.c +++ b/src/backend/utils/adt/arrayfuncs.c @@ -3,7 +3,7 @@ * arrayfuncs.c * Support functions for arrays. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -17,13 +17,14 @@ #include #include -#include "access/htup_details.h" #include "catalog/pg_type.h" +#include "common/int.h" #include "funcapi.h" #include "libpq/pqformat.h" #include "nodes/nodeFuncs.h" #include "nodes/supportnodes.h" #include "optimizer/optimizer.h" +#include "parser/scansup.h" #include "port/pg_bitutils.h" #include "utils/array.h" #include "utils/arrayaccess.h" @@ -52,18 +53,16 @@ bool Array_nulls = true; PG_FREE_IF_COPY(array, n); \ } while (0) +/* ReadArrayToken return type */ typedef enum { - ARRAY_NO_LEVEL, - ARRAY_LEVEL_STARTED, - ARRAY_ELEM_STARTED, - ARRAY_ELEM_COMPLETED, - ARRAY_QUOTED_ELEM_STARTED, - ARRAY_QUOTED_ELEM_COMPLETED, - ARRAY_ELEM_DELIMITED, - ARRAY_LEVEL_COMPLETED, - ARRAY_LEVEL_DELIMITED -} ArrayParseState; + ATOK_LEVEL_START, + ATOK_LEVEL_END, + ATOK_DELIM, + ATOK_ELEM, + ATOK_ELEM_NULL, + ATOK_ERROR, +} ArrayToken; /* Working state for array_iterate() */ typedef struct ArrayIteratorData @@ -89,16 +88,21 @@ typedef struct ArrayIteratorData int current_item; /* the item # we're at in the array */ } ArrayIteratorData; -static bool array_isspace(char ch); -static int ArrayCount(const char *str, int *dim, char typdelim, - Node *escontext); -static bool ReadArrayStr(char *arrayStr, const char *origStr, - int nitems, int ndim, int *dim, +static bool ReadArrayDimensions(char **srcptr, int *ndim_p, + int *dim, int *lBound, + const char *origStr, Node *escontext); +static bool ReadDimensionInt(char **srcptr, int *result, + const char *origStr, Node *escontext); +static bool ReadArrayStr(char **srcptr, FmgrInfo *inputproc, Oid typioparam, int32 typmod, char typdelim, int typlen, bool typbyval, char typalign, - Datum *values, bool *nulls, - bool *hasnulls, int32 *nbytes, Node *escontext); + int *ndim_p, int *dim, + int *nitems_p, + Datum **values_p, bool **nulls_p, + const char *origStr, Node *escontext); +static ArrayToken ReadArrayToken(char **srcptr, StringInfo elembuf, char typdelim, + const char *origStr, Node *escontext); static void ReadArrayBinary(StringInfo buf, int nitems, FmgrInfo *receiveproc, Oid typioparam, int32 typmod, int typlen, bool typbyval, char typalign, @@ -184,12 +188,10 @@ array_in(PG_FUNCTION_ARGS) char typalign; char typdelim; Oid typioparam; - char *string_save, - *p; - int i, - nitems; - Datum *dataPtr; - bool *nullsPtr; + char *p; + int nitems; + Datum *values; + bool *nulls; bool hasnulls; int32 nbytes; int32 dataoffset; @@ -232,104 +234,38 @@ array_in(PG_FUNCTION_ARGS) typdelim = my_extra->typdelim; typioparam = my_extra->typioparam; - /* Make a modifiable copy of the input */ - string_save = pstrdup(string); - /* - * If the input string starts with dimension info, read and use that. - * Otherwise, we require the input to be in curly-brace style, and we - * prescan the input to determine dimensions. - * - * Dimension info takes the form of one or more [n] or [m:n] items. The - * outer loop iterates once per dimension item. + * Initialize dim[] and lBound[] for ReadArrayStr, in case there is no + * explicit dimension info. (If there is, ReadArrayDimensions will + * overwrite this.) */ - p = string_save; - ndim = 0; - for (;;) + for (int i = 0; i < MAXDIM; i++) { - char *q; - int ub; - - /* - * Note: we currently allow whitespace between, but not within, - * dimension items. - */ - while (array_isspace(*p)) - p++; - if (*p != '[') - break; /* no more dimension items */ - p++; - if (ndim >= MAXDIM) - ereturn(escontext, (Datum) 0, - (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)", - ndim + 1, MAXDIM))); - - for (q = p; isdigit((unsigned char) *q) || (*q == '-') || (*q == '+'); q++) - /* skip */ ; - if (q == p) /* no digits? */ - ereturn(escontext, (Datum) 0, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", string), - errdetail("\"[\" must introduce explicitly-specified array dimensions."))); - - if (*q == ':') - { - /* [m:n] format */ - *q = '\0'; - lBound[ndim] = atoi(p); - p = q + 1; - for (q = p; isdigit((unsigned char) *q) || (*q == '-') || (*q == '+'); q++) - /* skip */ ; - if (q == p) /* no digits? */ - ereturn(escontext, (Datum) 0, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", string), - errdetail("Missing array dimension value."))); - } - else - { - /* [n] format */ - lBound[ndim] = 1; - } - if (*q != ']') - ereturn(escontext, (Datum) 0, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", string), - errdetail("Missing \"%s\" after array dimensions.", - "]"))); - - *q = '\0'; - ub = atoi(p); - p = q + 1; - if (ub < lBound[ndim]) - ereturn(escontext, (Datum) 0, - (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), - errmsg("upper bound cannot be less than lower bound"))); - - dim[ndim] = ub - lBound[ndim] + 1; - ndim++; + dim[i] = -1; /* indicates "not yet known" */ + lBound[i] = 1; /* default lower bound */ } + /* + * Start processing the input string. + * + * If the input string starts with dimension info, read and use that. + * Otherwise, we'll determine the dimensions during ReadArrayStr. + */ + p = string; + if (!ReadArrayDimensions(&p, &ndim, dim, lBound, string, escontext)) + return (Datum) 0; + if (ndim == 0) { - /* No array dimensions, so intuit dimensions from brace structure */ + /* No array dimensions, so next character should be a left brace */ if (*p != '{') ereturn(escontext, (Datum) 0, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("malformed array literal: \"%s\"", string), errdetail("Array value must start with \"{\" or dimension information."))); - ndim = ArrayCount(p, dim, typdelim, escontext); - if (ndim < 0) - PG_RETURN_NULL(); - for (i = 0; i < ndim; i++) - lBound[i] = 1; } else { - int ndim_braces, - dim_braces[MAXDIM]; - /* If array dimensions are given, expect '=' operator */ if (strncmp(p, ASSGN, strlen(ASSGN)) != 0) ereturn(escontext, (Datum) 0, @@ -338,66 +274,68 @@ array_in(PG_FUNCTION_ARGS) errdetail("Missing \"%s\" after array dimensions.", ASSGN))); p += strlen(ASSGN); - while (array_isspace(*p)) + /* Allow whitespace after it */ + while (scanner_isspace(*p)) p++; - /* - * intuit dimensions from brace structure -- it better match what we - * were given - */ if (*p != '{') ereturn(escontext, (Datum) 0, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("malformed array literal: \"%s\"", string), errdetail("Array contents must start with \"{\"."))); - ndim_braces = ArrayCount(p, dim_braces, typdelim, escontext); - if (ndim_braces < 0) - PG_RETURN_NULL(); - if (ndim_braces != ndim) + } + + /* Parse the value part, in the curly braces: { ... } */ + if (!ReadArrayStr(&p, + &my_extra->proc, typioparam, typmod, + typdelim, + typlen, typbyval, typalign, + &ndim, + dim, + &nitems, + &values, &nulls, + string, + escontext)) + return (Datum) 0; + + /* only whitespace is allowed after the closing brace */ + while (*p) + { + if (!scanner_isspace(*p++)) ereturn(escontext, (Datum) 0, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("malformed array literal: \"%s\"", string), - errdetail("Specified array dimensions do not match array contents."))); - for (i = 0; i < ndim; ++i) - { - if (dim[i] != dim_braces[i]) - ereturn(escontext, (Datum) 0, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", string), - errdetail("Specified array dimensions do not match array contents."))); - } + errdetail("Junk after closing right brace."))); } -#ifdef ARRAYDEBUG - printf("array_in- ndim %d (", ndim); - for (i = 0; i < ndim; i++) - { - printf(" %d", dim[i]); - }; - printf(") for %s\n", string); -#endif - - /* This checks for overflow of the array dimensions */ - nitems = ArrayGetNItemsSafe(ndim, dim, escontext); - if (nitems < 0) - PG_RETURN_NULL(); - if (!ArrayCheckBoundsSafe(ndim, dim, lBound, escontext)) - PG_RETURN_NULL(); - /* Empty array? */ if (nitems == 0) PG_RETURN_ARRAYTYPE_P(construct_empty_array(element_type)); - dataPtr = (Datum *) palloc(nitems * sizeof(Datum)); - nullsPtr = (bool *) palloc(nitems * sizeof(bool)); - if (!ReadArrayStr(p, string, - nitems, ndim, dim, - &my_extra->proc, typioparam, typmod, - typdelim, - typlen, typbyval, typalign, - dataPtr, nullsPtr, - &hasnulls, &nbytes, escontext)) - PG_RETURN_NULL(); + /* + * Check for nulls, compute total data space needed + */ + hasnulls = false; + nbytes = 0; + for (int i = 0; i < nitems; i++) + { + if (nulls[i]) + hasnulls = true; + else + { + /* let's just make sure data is not toasted */ + if (typlen == -1) + values[i] = PointerGetDatum(PG_DETOAST_DATUM(values[i])); + nbytes = att_addlength_datum(nbytes, typlen, values[i]); + nbytes = att_align_nominal(nbytes, typalign); + /* check for overflow of total request */ + if (!AllocSizeIsValid(nbytes)) + ereturn(escontext, (Datum) 0, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array size exceeds the maximum allowed (%d)", + (int) MaxAllocSize))); + } + } if (hasnulls) { dataoffset = ARR_OVERHEAD_WITHNULLS(ndim, nitems); @@ -408,6 +346,10 @@ array_in(PG_FUNCTION_ARGS) dataoffset = 0; /* marker for no null bitmap */ nbytes += ARR_OVERHEAD_NONULLS(ndim); } + + /* + * Construct the final array datum + */ retval = (ArrayType *) palloc0(nbytes); SET_VARSIZE(retval, nbytes); retval->ndim = ndim; @@ -423,323 +365,218 @@ array_in(PG_FUNCTION_ARGS) memcpy(ARR_LBOUND(retval), lBound, ndim * sizeof(int)); CopyArrayEls(retval, - dataPtr, nullsPtr, nitems, + values, nulls, nitems, typlen, typbyval, typalign, true); - pfree(dataPtr); - pfree(nullsPtr); - pfree(string_save); + pfree(values); + pfree(nulls); PG_RETURN_ARRAYTYPE_P(retval); } /* - * array_isspace() --- a non-locale-dependent isspace() + * ReadArrayDimensions + * parses the array dimensions part of the input and converts the values + * to internal format. * - * We used to use isspace() for parsing array values, but that has - * undesirable results: an array value might be silently interpreted - * differently depending on the locale setting. Now we just hard-wire - * the traditional ASCII definition of isspace(). - */ -static bool -array_isspace(char ch) -{ - if (ch == ' ' || - ch == '\t' || - ch == '\n' || - ch == '\r' || - ch == '\v' || - ch == '\f') - return true; - return false; -} - -/* - * ArrayCount - * Determines the dimensions for an array string. + * On entry, *srcptr points to the string to parse. It is advanced to point + * after whitespace (if any) and dimension info (if any). + * + * *ndim_p, dim[], and lBound[] are output variables. They are filled with the + * number of dimensions (<= MAXDIM), the lengths of each dimension, and the + * lower subscript bounds, respectively. If no dimension info appears, + * *ndim_p will be set to zero, and dim[] and lBound[] are unchanged. * - * Returns number of dimensions as function result. The axis lengths are - * returned in dim[], which must be of size MAXDIM. + * 'origStr' is the original input string, used only in error messages. + * If *escontext points to an ErrorSaveContext, details of any error are + * reported there. + * + * Result: + * true for success, false for failure (if escontext is provided). * - * If we detect an error, fill *escontext with error details and return -1 - * (unless escontext isn't provided, in which case errors will be thrown). + * Note that dim[] and lBound[] are allocated by the caller, and must have + * MAXDIM elements. */ -static int -ArrayCount(const char *str, int *dim, char typdelim, Node *escontext) +static bool +ReadArrayDimensions(char **srcptr, int *ndim_p, int *dim, int *lBound, + const char *origStr, Node *escontext) { - int nest_level = 0, - i; - int ndim = 1, - temp[MAXDIM], - nelems[MAXDIM], - nelems_last[MAXDIM]; - bool in_quotes = false; - bool eoArray = false; - bool empty_array = true; - const char *ptr; - ArrayParseState parse_state = ARRAY_NO_LEVEL; + char *p = *srcptr; + int ndim; - for (i = 0; i < MAXDIM; ++i) + /* + * Dimension info takes the form of one or more [n] or [m:n] items. This + * loop iterates once per dimension item. + */ + ndim = 0; + for (;;) { - temp[i] = dim[i] = nelems_last[i] = 0; - nelems[i] = 1; - } + char *q; + int ub; + int i; - ptr = str; - while (!eoArray) - { - bool itemdone = false; + /* + * Note: we currently allow whitespace between, but not within, + * dimension items. + */ + while (scanner_isspace(*p)) + p++; + if (*p != '[') + break; /* no more dimension items */ + p++; + if (ndim >= MAXDIM) + ereturn(escontext, false, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("number of array dimensions exceeds the maximum allowed (%d)", + MAXDIM))); - while (!itemdone) - { - if (parse_state == ARRAY_ELEM_STARTED || - parse_state == ARRAY_QUOTED_ELEM_STARTED) - empty_array = false; + q = p; + if (!ReadDimensionInt(&p, &i, origStr, escontext)) + return false; + if (p == q) /* no digits? */ + ereturn(escontext, false, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", origStr), + errdetail("\"[\" must introduce explicitly-specified array dimensions."))); - switch (*ptr) - { - case '\0': - /* Signal a premature end of the string */ - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Unexpected end of input."))); - case '\\': - - /* - * An escape must be after a level start, after an element - * start, or after an element delimiter. In any case we - * now must be past an element start. - */ - if (parse_state != ARRAY_LEVEL_STARTED && - parse_state != ARRAY_ELEM_STARTED && - parse_state != ARRAY_QUOTED_ELEM_STARTED && - parse_state != ARRAY_ELEM_DELIMITED) - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Unexpected \"%c\" character.", - '\\'))); - if (parse_state != ARRAY_QUOTED_ELEM_STARTED) - parse_state = ARRAY_ELEM_STARTED; - /* skip the escaped character */ - if (*(ptr + 1)) - ptr++; - else - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Unexpected end of input."))); - break; - case '"': - - /* - * A quote must be after a level start, after a quoted - * element start, or after an element delimiter. In any - * case we now must be past an element start. - */ - if (parse_state != ARRAY_LEVEL_STARTED && - parse_state != ARRAY_QUOTED_ELEM_STARTED && - parse_state != ARRAY_ELEM_DELIMITED) - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Unexpected array element."))); - in_quotes = !in_quotes; - if (in_quotes) - parse_state = ARRAY_QUOTED_ELEM_STARTED; - else - parse_state = ARRAY_QUOTED_ELEM_COMPLETED; - break; - case '{': - if (!in_quotes) - { - /* - * A left brace can occur if no nesting has occurred - * yet, after a level start, or after a level - * delimiter. - */ - if (parse_state != ARRAY_NO_LEVEL && - parse_state != ARRAY_LEVEL_STARTED && - parse_state != ARRAY_LEVEL_DELIMITED) - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Unexpected \"%c\" character.", - '{'))); - parse_state = ARRAY_LEVEL_STARTED; - if (nest_level >= MAXDIM) - ereturn(escontext, -1, - (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)", - nest_level + 1, MAXDIM))); - temp[nest_level] = 0; - nest_level++; - if (ndim < nest_level) - ndim = nest_level; - } - break; - case '}': - if (!in_quotes) - { - /* - * A right brace can occur after an element start, an - * element completion, a quoted element completion, or - * a level completion. - */ - if (parse_state != ARRAY_ELEM_STARTED && - parse_state != ARRAY_ELEM_COMPLETED && - parse_state != ARRAY_QUOTED_ELEM_COMPLETED && - parse_state != ARRAY_LEVEL_COMPLETED && - !(nest_level == 1 && parse_state == ARRAY_LEVEL_STARTED)) - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Unexpected \"%c\" character.", - '}'))); - parse_state = ARRAY_LEVEL_COMPLETED; - if (nest_level == 0) - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Unmatched \"%c\" character.", '}'))); - nest_level--; - - if (nelems_last[nest_level] != 0 && - nelems[nest_level] != nelems_last[nest_level]) - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Multidimensional arrays must have " - "sub-arrays with matching " - "dimensions."))); - nelems_last[nest_level] = nelems[nest_level]; - nelems[nest_level] = 1; - if (nest_level == 0) - eoArray = itemdone = true; - else - { - /* - * We don't set itemdone here; see comments in - * ReadArrayStr - */ - temp[nest_level - 1]++; - } - } - break; - default: - if (!in_quotes) - { - if (*ptr == typdelim) - { - /* - * Delimiters can occur after an element start, an - * element completion, a quoted element - * completion, or a level completion. - */ - if (parse_state != ARRAY_ELEM_STARTED && - parse_state != ARRAY_ELEM_COMPLETED && - parse_state != ARRAY_QUOTED_ELEM_COMPLETED && - parse_state != ARRAY_LEVEL_COMPLETED) - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Unexpected \"%c\" character.", - typdelim))); - if (parse_state == ARRAY_LEVEL_COMPLETED) - parse_state = ARRAY_LEVEL_DELIMITED; - else - parse_state = ARRAY_ELEM_DELIMITED; - itemdone = true; - nelems[nest_level - 1]++; - } - else if (!array_isspace(*ptr)) - { - /* - * Other non-space characters must be after a - * level start, after an element start, or after - * an element delimiter. In any case we now must - * be past an element start. - */ - if (parse_state != ARRAY_LEVEL_STARTED && - parse_state != ARRAY_ELEM_STARTED && - parse_state != ARRAY_ELEM_DELIMITED) - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Unexpected array element."))); - parse_state = ARRAY_ELEM_STARTED; - } - } - break; - } - if (!itemdone) - ptr++; + if (*p == ':') + { + /* [m:n] format */ + lBound[ndim] = i; + p++; + q = p; + if (!ReadDimensionInt(&p, &ub, origStr, escontext)) + return false; + if (p == q) /* no digits? */ + ereturn(escontext, false, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", origStr), + errdetail("Missing array dimension value."))); } - temp[ndim - 1]++; - ptr++; + else + { + /* [n] format */ + lBound[ndim] = 1; + ub = i; + } + if (*p != ']') + ereturn(escontext, false, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", origStr), + errdetail("Missing \"%s\" after array dimensions.", + "]"))); + p++; + + /* + * Note: we could accept ub = lb-1 to represent a zero-length + * dimension. However, that would result in an empty array, for which + * we don't keep any dimension data, so that e.g. [1:0] and [101:100] + * would be equivalent. Given the lack of field demand, there seems + * little point in allowing such cases. + */ + if (ub < lBound[ndim]) + ereturn(escontext, false, + (errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR), + errmsg("upper bound cannot be less than lower bound"))); + + /* Upper bound of INT_MAX must be disallowed, cf ArrayCheckBounds() */ + if (ub == INT_MAX) + ereturn(escontext, false, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array upper bound is too large: %d", ub))); + + /* Compute "ub - lBound[ndim] + 1", detecting overflow */ + if (pg_sub_s32_overflow(ub, lBound[ndim], &ub) || + pg_add_s32_overflow(ub, 1, &ub)) + ereturn(escontext, false, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array size exceeds the maximum allowed (%d)", + (int) MaxArraySize))); + + dim[ndim] = ub; + ndim++; } - /* only whitespace is allowed after the closing brace */ - while (*ptr) + *srcptr = p; + *ndim_p = ndim; + return true; +} + +/* + * ReadDimensionInt + * parse an integer, for the array dimensions + * + * On entry, *srcptr points to the string to parse. It is advanced past the + * digits of the integer. If there are no digits, returns true and leaves + * *srcptr unchanged. + * + * Result: + * true for success, false for failure (if escontext is provided). + * On success, the parsed integer is returned in *result. + */ +static bool +ReadDimensionInt(char **srcptr, int *result, + const char *origStr, Node *escontext) +{ + char *p = *srcptr; + long l; + + /* don't accept leading whitespace */ + if (!isdigit((unsigned char) *p) && *p != '-' && *p != '+') { - if (!array_isspace(*ptr++)) - ereturn(escontext, -1, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", str), - errdetail("Junk after closing right brace."))); + *result = 0; + return true; } - /* special case for an empty array */ - if (empty_array) - return 0; + errno = 0; + l = strtol(p, srcptr, 10); - for (i = 0; i < ndim; ++i) - dim[i] = temp[i]; + if (errno == ERANGE || l > PG_INT32_MAX || l < PG_INT32_MIN) + ereturn(escontext, false, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array bound is out of integer range"))); - return ndim; + *result = (int) l; + return true; } /* * ReadArrayStr : - * parses the array string pointed to by "arrayStr" and converts the values - * to internal format. Unspecified elements are initialized to nulls. - * The array dimensions must already have been determined. + * parses the array string pointed to by *srcptr and converts the values + * to internal format. Determines the array dimensions as it goes. * - * Inputs: - * arrayStr: the string to parse. - * CAUTION: the contents of "arrayStr" will be modified! - * origStr: the unmodified input string, used only in error messages. - * nitems: total number of array elements, as already determined. - * ndim: number of array dimensions - * dim[]: array axis lengths + * On entry, *srcptr points to the string to parse (it must point to a '{'). + * On successful return, it is advanced to point past the closing '}'. + * + * If dimensions were specified explicitly, they are passed in *ndim_p and + * dim[]. This function will check that the array values match the specified + * dimensions. If dimensions were not given, caller must pass *ndim_p == 0 + * and initialize all elements of dim[] to -1. Then this function will + * deduce the dimensions from the structure of the input and store them in + * *ndim_p and the dim[] array. + * + * Element type information: * inputproc: type-specific input procedure for element datatype. * typioparam, typmod: auxiliary values to pass to inputproc. * typdelim: the value delimiter (type-specific). * typlen, typbyval, typalign: storage parameters of element datatype. * * Outputs: - * values[]: filled with converted data values. - * nulls[]: filled with is-null markers. - * *hasnulls: set true iff there are any null elements. - * *nbytes: set to total size of data area needed (including alignment - * padding but not including array header overhead). - * *escontext: if this points to an ErrorSaveContext, details of - * any error are reported there. + * *ndim_p, dim: dimensions deduced from the input structure. + * *nitems_p: total number of elements. + * *values_p[]: palloc'd array, filled with converted data values. + * *nulls_p[]: palloc'd array, filled with is-null markers. + * + * 'origStr' is the original input string, used only in error messages. + * If *escontext points to an ErrorSaveContext, details of any error are + * reported there. * * Result: * true for success, false for failure (if escontext is provided). - * - * Note that values[] and nulls[] are allocated by the caller, and must have - * nitems elements. */ static bool -ReadArrayStr(char *arrayStr, - const char *origStr, - int nitems, - int ndim, - int *dim, +ReadArrayStr(char **srcptr, FmgrInfo *inputproc, Oid typioparam, int32 typmod, @@ -747,224 +584,363 @@ ReadArrayStr(char *arrayStr, int typlen, bool typbyval, char typalign, - Datum *values, - bool *nulls, - bool *hasnulls, - int32 *nbytes, + int *ndim_p, + int *dim, + int *nitems_p, + Datum **values_p, + bool **nulls_p, + const char *origStr, Node *escontext) { - int i, - nest_level = 0; - char *srcptr; - bool in_quotes = false; - bool eoArray = false; - bool hasnull; - int32 totbytes; - int indx[MAXDIM] = {0}, - prod[MAXDIM]; + int ndim = *ndim_p; + bool dimensions_specified = (ndim != 0); + int maxitems; + Datum *values; + bool *nulls; + StringInfoData elembuf; + int nest_level; + int nitems; + bool ndim_frozen; + bool expect_delim; + int nelems[MAXDIM]; + + /* Allocate some starting output workspace; we'll enlarge as needed */ + maxitems = 16; + values = palloc_array(Datum, maxitems); + nulls = palloc_array(bool, maxitems); + + /* Allocate workspace to hold (string representation of) one element */ + initStringInfo(&elembuf); + + /* Loop below assumes first token is ATOK_LEVEL_START */ + Assert(**srcptr == '{'); + + /* Parse tokens until we reach the matching right brace */ + nest_level = 0; + nitems = 0; + ndim_frozen = dimensions_specified; + expect_delim = false; + do + { + ArrayToken tok; - mda_get_prod(ndim, dim, prod); + tok = ReadArrayToken(srcptr, &elembuf, typdelim, origStr, escontext); - /* Initialize is-null markers to true */ - memset(nulls, true, nitems * sizeof(bool)); + switch (tok) + { + case ATOK_LEVEL_START: + /* Can't write left brace where delim is expected */ + if (expect_delim) + ereturn(escontext, false, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", origStr), + errdetail("Unexpected \"%c\" character.", '{'))); - /* - * We have to remove " and \ characters to create a clean item value to - * pass to the datatype input routine. We overwrite each item value - * in-place within arrayStr to do this. srcptr is the current scan point, - * and dstptr is where we are copying to. - * - * We also want to suppress leading and trailing unquoted whitespace. We - * use the leadingspace flag to suppress leading space. Trailing space is - * tracked by using dstendptr to point to the last significant output - * character. - * - * The error checking in this routine is mostly pro-forma, since we expect - * that ArrayCount() already validated the string. So we don't bother - * with errdetail messages. - */ - srcptr = arrayStr; - while (!eoArray) - { - bool itemdone = false; - bool leadingspace = true; - bool hasquoting = false; - char *itemstart; - char *dstptr; - char *dstendptr; + /* Initialize element counting in the new level */ + if (nest_level >= MAXDIM) + ereturn(escontext, false, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("number of array dimensions exceeds the maximum allowed (%d)", + MAXDIM))); + + nelems[nest_level] = 0; + nest_level++; + if (nest_level > ndim) + { + /* Can't increase ndim once it's frozen */ + if (ndim_frozen) + goto dimension_error; + ndim = nest_level; + } + break; - i = -1; - itemstart = dstptr = dstendptr = srcptr; + case ATOK_LEVEL_END: + /* Can't get here with nest_level == 0 */ + Assert(nest_level > 0); - while (!itemdone) - { - switch (*srcptr) - { - case '\0': - /* Signal a premature end of the string */ + /* + * We allow a right brace to terminate an empty sub-array, + * otherwise it must occur where we expect a delimiter. + */ + if (nelems[nest_level - 1] > 0 && !expect_delim) ereturn(escontext, false, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", - origStr))); - break; - case '\\': - /* Skip backslash, copy next character as-is. */ - srcptr++; - if (*srcptr == '\0') + errmsg("malformed array literal: \"%s\"", origStr), + errdetail("Unexpected \"%c\" character.", + '}'))); + nest_level--; + /* Nested sub-arrays count as elements of outer level */ + if (nest_level > 0) + nelems[nest_level - 1]++; + + /* + * Note: if we had dimensionality info, then dim[nest_level] + * is initially non-negative, and we'll check each sub-array's + * length against that. + */ + if (dim[nest_level] < 0) + { + /* Save length of first sub-array of this level */ + dim[nest_level] = nelems[nest_level]; + } + else if (nelems[nest_level] != dim[nest_level]) + { + /* Subsequent sub-arrays must have same length */ + goto dimension_error; + } + + /* + * Must have a delim or another right brace following, unless + * we have reached nest_level 0, where this won't matter. + */ + expect_delim = true; + break; + + case ATOK_DELIM: + if (!expect_delim) + ereturn(escontext, false, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", origStr), + errdetail("Unexpected \"%c\" character.", + typdelim))); + expect_delim = false; + break; + + case ATOK_ELEM: + case ATOK_ELEM_NULL: + /* Can't get here with nest_level == 0 */ + Assert(nest_level > 0); + + /* Disallow consecutive ELEM tokens */ + if (expect_delim) + ereturn(escontext, false, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", origStr), + errdetail("Unexpected array element."))); + + /* Enlarge the values/nulls arrays if needed */ + if (nitems >= maxitems) + { + if (maxitems >= MaxArraySize) ereturn(escontext, false, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", - origStr))); - *dstptr++ = *srcptr++; - /* Treat the escaped character as non-whitespace */ - leadingspace = false; - dstendptr = dstptr; - hasquoting = true; /* can't be a NULL marker */ - break; - case '"': - in_quotes = !in_quotes; - if (in_quotes) - leadingspace = false; - else - { - /* - * Advance dstendptr when we exit in_quotes; this - * saves having to do it in all the other in_quotes - * cases. - */ - dstendptr = dstptr; - } - hasquoting = true; /* can't be a NULL marker */ - srcptr++; - break; - case '{': - if (!in_quotes) - { - if (nest_level >= ndim) - ereturn(escontext, false, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", - origStr))); - nest_level++; - indx[nest_level - 1] = 0; - srcptr++; - } - else - *dstptr++ = *srcptr++; - break; - case '}': - if (!in_quotes) - { - if (nest_level == 0) - ereturn(escontext, false, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", - origStr))); - if (i == -1) - i = ArrayGetOffset0(ndim, indx, prod); - indx[nest_level - 1] = 0; - nest_level--; - if (nest_level == 0) - eoArray = itemdone = true; - else - indx[nest_level - 1]++; - srcptr++; - } - else - *dstptr++ = *srcptr++; - break; - default: - if (in_quotes) - *dstptr++ = *srcptr++; - else if (*srcptr == typdelim) - { - if (i == -1) - i = ArrayGetOffset0(ndim, indx, prod); - itemdone = true; - indx[ndim - 1]++; - srcptr++; - } - else if (array_isspace(*srcptr)) - { - /* - * If leading space, drop it immediately. Else, copy - * but don't advance dstendptr. - */ - if (leadingspace) - srcptr++; - else - *dstptr++ = *srcptr++; - } - else - { - *dstptr++ = *srcptr++; - leadingspace = false; - dstendptr = dstptr; - } - break; - } + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array size exceeds the maximum allowed (%d)", + (int) MaxArraySize))); + maxitems = Min(maxitems * 2, MaxArraySize); + values = repalloc_array(values, Datum, maxitems); + nulls = repalloc_array(nulls, bool, maxitems); + } + + /* Read the element's value, or check that NULL is allowed */ + if (!InputFunctionCallSafe(inputproc, + (tok == ATOK_ELEM_NULL) ? NULL : elembuf.data, + typioparam, typmod, + escontext, + &values[nitems])) + return false; + nulls[nitems] = (tok == ATOK_ELEM_NULL); + nitems++; + + /* + * Once we have found an element, the number of dimensions can + * no longer increase, and subsequent elements must all be at + * the same nesting depth. + */ + ndim_frozen = true; + if (nest_level != ndim) + goto dimension_error; + /* Count the new element */ + nelems[nest_level - 1]++; + + /* Must have a delim or a right brace following */ + expect_delim = true; + break; + + case ATOK_ERROR: + return false; } + } while (nest_level > 0); - Assert(dstptr < srcptr); - *dstendptr = '\0'; + /* Clean up and return results */ + pfree(elembuf.data); - if (i < 0 || i >= nitems) - ereturn(escontext, false, - (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), - errmsg("malformed array literal: \"%s\"", - origStr))); + *ndim_p = ndim; + *nitems_p = nitems; + *values_p = values; + *nulls_p = nulls; + return true; + +dimension_error: + if (dimensions_specified) + ereturn(escontext, false, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", origStr), + errdetail("Specified array dimensions do not match array contents."))); + else + ereturn(escontext, false, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", origStr), + errdetail("Multidimensional arrays must have sub-arrays with matching dimensions."))); +} + +/* + * ReadArrayToken + * read one token from an array value string + * + * Starts scanning from *srcptr. On non-error return, *srcptr is + * advanced past the token. + * + * If the token is ATOK_ELEM, the de-escaped string is returned in elembuf. + */ +static ArrayToken +ReadArrayToken(char **srcptr, StringInfo elembuf, char typdelim, + const char *origStr, Node *escontext) +{ + char *p = *srcptr; + int dstlen; + bool has_escapes; + + resetStringInfo(elembuf); - if (Array_nulls && !hasquoting && - pg_strcasecmp(itemstart, "NULL") == 0) + /* Identify token type. Loop advances over leading whitespace. */ + for (;;) + { + switch (*p) { - /* it's a NULL item */ - if (!InputFunctionCallSafe(inputproc, NULL, - typioparam, typmod, - escontext, - &values[i])) - return false; - nulls[i] = true; + case '\0': + goto ending_error; + case '{': + *srcptr = p + 1; + return ATOK_LEVEL_START; + case '}': + *srcptr = p + 1; + return ATOK_LEVEL_END; + case '"': + p++; + goto quoted_element; + default: + if (*p == typdelim) + { + *srcptr = p + 1; + return ATOK_DELIM; + } + if (scanner_isspace(*p)) + { + p++; + continue; + } + goto unquoted_element; } - else + } + +quoted_element: + for (;;) + { + switch (*p) { - if (!InputFunctionCallSafe(inputproc, itemstart, - typioparam, typmod, - escontext, - &values[i])) - return false; - nulls[i] = false; + case '\0': + goto ending_error; + case '\\': + /* Skip backslash, copy next character as-is. */ + p++; + if (*p == '\0') + goto ending_error; + appendStringInfoChar(elembuf, *p++); + break; + case '"': + + /* + * If next non-whitespace isn't typdelim or a brace, complain + * about incorrect quoting. While we could leave such cases + * to be detected as incorrect token sequences, the resulting + * message wouldn't be as helpful. (We could also give the + * incorrect-quoting error when next is '{', but treating that + * as a token sequence error seems better.) + */ + while (*(++p) != '\0') + { + if (*p == typdelim || *p == '}' || *p == '{') + { + *srcptr = p; + return ATOK_ELEM; + } + if (!scanner_isspace(*p)) + ereturn(escontext, ATOK_ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", origStr), + errdetail("Incorrectly quoted array element."))); + } + goto ending_error; + default: + appendStringInfoChar(elembuf, *p++); + break; } } +unquoted_element: + /* - * Check for nulls, compute total data space needed + * We don't include trailing whitespace in the result. dstlen tracks how + * much of the output string is known to not be trailing whitespace. */ - hasnull = false; - totbytes = 0; - for (i = 0; i < nitems; i++) + dstlen = 0; + has_escapes = false; + for (;;) { - if (nulls[i]) - hasnull = true; - else + switch (*p) { - /* let's just make sure data is not toasted */ - if (typlen == -1) - values[i] = PointerGetDatum(PG_DETOAST_DATUM(values[i])); - totbytes = att_addlength_datum(totbytes, typlen, values[i]); - totbytes = att_align_nominal(totbytes, typalign); - /* check for overflow of total request */ - if (!AllocSizeIsValid(totbytes)) - ereturn(escontext, false, - (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("array size exceeds the maximum allowed (%d)", - (int) MaxAllocSize))); + case '\0': + goto ending_error; + case '{': + ereturn(escontext, ATOK_ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", origStr), + errdetail("Unexpected \"%c\" character.", + '{'))); + case '"': + /* Must double-quote all or none of an element. */ + ereturn(escontext, ATOK_ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", origStr), + errdetail("Incorrectly quoted array element."))); + case '\\': + /* Skip backslash, copy next character as-is. */ + p++; + if (*p == '\0') + goto ending_error; + appendStringInfoChar(elembuf, *p++); + dstlen = elembuf->len; /* treat it as non-whitespace */ + has_escapes = true; + break; + default: + /* End of elem? */ + if (*p == typdelim || *p == '}') + { + /* hack: truncate the output string to dstlen */ + elembuf->data[dstlen] = '\0'; + elembuf->len = dstlen; + *srcptr = p; + /* Check if it's unquoted "NULL" */ + if (Array_nulls && !has_escapes && + pg_strcasecmp(elembuf->data, "NULL") == 0) + return ATOK_ELEM_NULL; + else + return ATOK_ELEM; + } + appendStringInfoChar(elembuf, *p); + if (!scanner_isspace(*p)) + dstlen = elembuf->len; + p++; + break; } } - *hasnulls = hasnull; - *nbytes = totbytes; - return true; -} +ending_error: + ereturn(escontext, ATOK_ERROR, + (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), + errmsg("malformed array literal: \"%s\"", origStr), + errdetail("Unexpected end of input."))); +} /* * Copy data into an array object from a temporary array of Datums. @@ -1176,7 +1152,7 @@ array_out(PG_FUNCTION_ARGS) overall_length += 1; } else if (ch == '{' || ch == '}' || ch == typdelim || - array_isspace(ch)) + scanner_isspace(ch)) needquote = true; } } @@ -1496,7 +1472,6 @@ ReadArrayBinary(StringInfo buf, { int itemlen; StringInfoData elem_buf; - char csave; /* Get and check the item length */ itemlen = pq_getmsgint(buf, 4); @@ -1515,21 +1490,13 @@ ReadArrayBinary(StringInfo buf, } /* - * Rather than copying data around, we just set up a phony StringInfo - * pointing to the correct portion of the input buffer. We assume we - * can scribble on the input buffer so as to maintain the convention - * that StringInfos have a trailing null. + * Rather than copying data around, we just initialize a StringInfo + * pointing to the correct portion of the message buffer. */ - elem_buf.data = &buf->data[buf->cursor]; - elem_buf.maxlen = itemlen + 1; - elem_buf.len = itemlen; - elem_buf.cursor = 0; + initReadOnlyStringInfo(&elem_buf, &buf->data[buf->cursor], itemlen); buf->cursor += itemlen; - csave = buf->data[buf->cursor]; - buf->data[buf->cursor] = '\0'; - /* Now call the element's receiveproc */ values[i] = ReceiveFunctionCall(receiveproc, &elem_buf, typioparam, typmod); @@ -1541,8 +1508,6 @@ ReadArrayBinary(StringInfo buf, (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("improper binary format in array element %d", i + 1))); - - buf->data[buf->cursor] = csave; } /* @@ -2358,22 +2323,38 @@ array_set_element(Datum arraydatum, addedbefore = addedafter = 0; /* - * Check subscripts + * Check subscripts. We assume the existing subscripts passed + * ArrayCheckBounds, so that dim[i] + lb[i] can be computed without + * overflow. But we must beware of other overflows in our calculations of + * new dim[] values. */ if (ndim == 1) { if (indx[0] < lb[0]) { - addedbefore = lb[0] - indx[0]; - dim[0] += addedbefore; + /* addedbefore = lb[0] - indx[0]; */ + /* dim[0] += addedbefore; */ + if (pg_sub_s32_overflow(lb[0], indx[0], &addedbefore) || + pg_add_s32_overflow(dim[0], addedbefore, &dim[0])) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array size exceeds the maximum allowed (%d)", + (int) MaxArraySize))); lb[0] = indx[0]; if (addedbefore > 1) newhasnulls = true; /* will insert nulls */ } if (indx[0] >= (dim[0] + lb[0])) { - addedafter = indx[0] - (dim[0] + lb[0]) + 1; - dim[0] += addedafter; + /* addedafter = indx[0] - (dim[0] + lb[0]) + 1; */ + /* dim[0] += addedafter; */ + if (pg_sub_s32_overflow(indx[0], dim[0] + lb[0], &addedafter) || + pg_add_s32_overflow(addedafter, 1, &addedafter) || + pg_add_s32_overflow(dim[0], addedafter, &dim[0])) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array size exceeds the maximum allowed (%d)", + (int) MaxArraySize))); if (addedafter > 1) newhasnulls = true; /* will insert nulls */ } @@ -2619,14 +2600,23 @@ array_set_element_expanded(Datum arraydatum, addedbefore = addedafter = 0; /* - * Check subscripts (this logic matches original array_set_element) + * Check subscripts (this logic must match array_set_element). We assume + * the existing subscripts passed ArrayCheckBounds, so that dim[i] + lb[i] + * can be computed without overflow. But we must beware of other + * overflows in our calculations of new dim[] values. */ if (ndim == 1) { if (indx[0] < lb[0]) { - addedbefore = lb[0] - indx[0]; - dim[0] += addedbefore; + /* addedbefore = lb[0] - indx[0]; */ + /* dim[0] += addedbefore; */ + if (pg_sub_s32_overflow(lb[0], indx[0], &addedbefore) || + pg_add_s32_overflow(dim[0], addedbefore, &dim[0])) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array size exceeds the maximum allowed (%d)", + (int) MaxArraySize))); lb[0] = indx[0]; dimschanged = true; if (addedbefore > 1) @@ -2634,8 +2624,15 @@ array_set_element_expanded(Datum arraydatum, } if (indx[0] >= (dim[0] + lb[0])) { - addedafter = indx[0] - (dim[0] + lb[0]) + 1; - dim[0] += addedafter; + /* addedafter = indx[0] - (dim[0] + lb[0]) + 1; */ + /* dim[0] += addedafter; */ + if (pg_sub_s32_overflow(indx[0], dim[0] + lb[0], &addedafter) || + pg_add_s32_overflow(addedafter, 1, &addedafter) || + pg_add_s32_overflow(dim[0], addedafter, &dim[0])) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array size exceeds the maximum allowed (%d)", + (int) MaxArraySize))); dimschanged = true; if (addedafter > 1) newhasnulls = true; /* will insert nulls */ @@ -2890,7 +2887,14 @@ array_set_slice(Datum arraydatum, errdetail("When assigning to a slice of an empty array value," " slice boundaries must be fully specified."))); - dim[i] = 1 + upperIndx[i] - lowerIndx[i]; + /* compute "upperIndx[i] - lowerIndx[i] + 1", detecting overflow */ + if (pg_sub_s32_overflow(upperIndx[i], lowerIndx[i], &dim[i]) || + pg_add_s32_overflow(dim[i], 1, &dim[i])) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array size exceeds the maximum allowed (%d)", + (int) MaxArraySize))); + lb[i] = lowerIndx[i]; } @@ -2918,7 +2922,10 @@ array_set_slice(Datum arraydatum, addedbefore = addedafter = 0; /* - * Check subscripts + * Check subscripts. We assume the existing subscripts passed + * ArrayCheckBounds, so that dim[i] + lb[i] can be computed without + * overflow. But we must beware of other overflows in our calculations of + * new dim[] values. */ if (ndim == 1) { @@ -2933,18 +2940,31 @@ array_set_slice(Datum arraydatum, errmsg("upper bound cannot be less than lower bound"))); if (lowerIndx[0] < lb[0]) { - if (upperIndx[0] < lb[0] - 1) - newhasnulls = true; /* will insert nulls */ - addedbefore = lb[0] - lowerIndx[0]; - dim[0] += addedbefore; + /* addedbefore = lb[0] - lowerIndx[0]; */ + /* dim[0] += addedbefore; */ + if (pg_sub_s32_overflow(lb[0], lowerIndx[0], &addedbefore) || + pg_add_s32_overflow(dim[0], addedbefore, &dim[0])) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array size exceeds the maximum allowed (%d)", + (int) MaxArraySize))); lb[0] = lowerIndx[0]; + if (addedbefore > 1) + newhasnulls = true; /* will insert nulls */ } if (upperIndx[0] >= (dim[0] + lb[0])) { - if (lowerIndx[0] > (dim[0] + lb[0])) + /* addedafter = upperIndx[0] - (dim[0] + lb[0]) + 1; */ + /* dim[0] += addedafter; */ + if (pg_sub_s32_overflow(upperIndx[0], dim[0] + lb[0], &addedafter) || + pg_add_s32_overflow(addedafter, 1, &addedafter) || + pg_add_s32_overflow(dim[0], addedafter, &dim[0])) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array size exceeds the maximum allowed (%d)", + (int) MaxArraySize))); + if (addedafter > 1) newhasnulls = true; /* will insert nulls */ - addedafter = upperIndx[0] - (dim[0] + lb[0]) + 1; - dim[0] += addedafter; } } else @@ -5338,6 +5358,12 @@ accumArrayResult(ArrayBuildState *astate, if (astate->nelems >= astate->alen) { astate->alen *= 2; + /* give an array-related error if we go past MaxAllocSize */ + if (!AllocSizeIsValid(astate->alen * sizeof(Datum))) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("array size exceeds the maximum allowed (%d)", + (int) MaxAllocSize))); astate->dvalues = (Datum *) repalloc(astate->dvalues, astate->alen * sizeof(Datum)); astate->dnulls = (bool *) @@ -5744,9 +5770,14 @@ ArrayBuildStateAny * initArrayResultAny(Oid input_type, MemoryContext rcontext, bool subcontext) { ArrayBuildStateAny *astate; - Oid element_type = get_element_type(input_type); - if (OidIsValid(element_type)) + /* + * int2vector and oidvector will satisfy both get_element_type and + * get_array_type. We prefer to treat them as scalars, to be consistent + * with get_promoted_array_type. Hence, check get_array_type not + * get_element_type. + */ + if (!OidIsValid(get_array_type(input_type))) { /* Array case */ ArrayBuildStateArr *arraystate; @@ -5763,9 +5794,6 @@ initArrayResultAny(Oid input_type, MemoryContext rcontext, bool subcontext) /* Scalar case */ ArrayBuildState *scalarstate; - /* Let's just check that we have a type that can be put into arrays */ - Assert(OidIsValid(get_array_type(input_type))); - scalarstate = initArrayResult(input_type, rcontext, subcontext); astate = (ArrayBuildStateAny *) MemoryContextAlloc(scalarstate->mcontext, @@ -6297,6 +6325,9 @@ array_unnest(PG_FUNCTION_ARGS) /* * Planner support function for array_unnest(anyarray) + * + * Note: this is now also used for information_schema._pg_expandarray(), + * which is simply a wrapper around array_unnest(). */ Datum array_unnest_support(PG_FUNCTION_ARGS) @@ -6317,7 +6348,7 @@ array_unnest_support(PG_FUNCTION_ARGS) /* We can use estimated argument values here */ arg1 = estimate_expression_value(req->root, linitial(args)); - req->rows = estimate_array_length(arg1); + req->rows = estimate_array_length(req->root, arg1); ret = (Node *) req; } } diff --git a/src/backend/utils/adt/arraysubs.c b/src/backend/utils/adt/arraysubs.c index 66666fea98ee8..6f68dfa5b23f9 100644 --- a/src/backend/utils/adt/arraysubs.c +++ b/src/backend/utils/adt/arraysubs.c @@ -3,7 +3,7 @@ * arraysubs.c * Subscripting support functions for arrays. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -21,7 +21,7 @@ #include "parser/parse_coerce.h" #include "parser/parse_expr.h" #include "utils/array.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/lsyscache.h" diff --git a/src/backend/utils/adt/arrayutils.c b/src/backend/utils/adt/arrayutils.c index 62152f79f5326..8c3a637cdb788 100644 --- a/src/backend/utils/adt/arrayutils.c +++ b/src/backend/utils/adt/arrayutils.c @@ -3,7 +3,7 @@ * arrayutils.c * This file contains some support routines required for array functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -43,31 +43,12 @@ ArrayGetOffset(int n, const int *dim, const int *lb, const int *indx) return offset; } -/* - * Same, but subscripts are assumed 0-based, and use a scale array - * instead of raw dimension data (see mda_get_prod to create scale array) - */ -int -ArrayGetOffset0(int n, const int *tup, const int *scale) -{ - int i, - lin = 0; - - for (i = 0; i < n; i++) - lin += tup[i] * scale[i]; - return lin; -} - /* * Convert array dimensions into number of elements * * This must do overflow checking, since it is used to validate that a user * dimensionality request doesn't overflow what we can handle. * - * We limit array sizes to at most about a quarter billion elements, - * so that it's not necessary to check for overflow in quite so many - * places --- for instance when palloc'ing Datum arrays. - * * The multiplication overflow check only works on machines that have int64 * arithmetic, but that is nearly all platforms these days, and doing check * divides for those that don't seems way too expensive. @@ -88,8 +69,6 @@ ArrayGetNItemsSafe(int ndim, const int *dims, struct Node *escontext) int32 ret; int i; -#define MaxArraySize ((Size) (MaxAllocSize / sizeof(Datum))) - if (ndim <= 0) return 0; ret = 1; diff --git a/src/backend/utils/adt/ascii.c b/src/backend/utils/adt/ascii.c index b6944d80934d8..40887e3699245 100644 --- a/src/backend/utils/adt/ascii.c +++ b/src/backend/utils/adt/ascii.c @@ -2,7 +2,7 @@ * ascii.c * The PostgreSQL routine for string to ascii conversion. * - * Portions Copyright (c) 1999-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1999-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/ascii.c @@ -13,7 +13,7 @@ #include "mb/pg_wchar.h" #include "utils/ascii.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "varatt.h" static void pg_to_ascii(unsigned char *src, unsigned char *src_end, diff --git a/src/backend/utils/adt/bool.c b/src/backend/utils/adt/bool.c index cc4bd55035441..85e6786563e79 100644 --- a/src/backend/utils/adt/bool.c +++ b/src/backend/utils/adt/bool.c @@ -3,7 +3,7 @@ * bool.c * Functions for the built-in type "bool". * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -35,6 +35,7 @@ parse_bool(const char *value, bool *result) bool parse_bool_with_len(const char *value, size_t len, bool *result) { + /* Check the most-used possibilities first. */ switch (*value) { case 't': @@ -119,12 +120,7 @@ parse_bool_with_len(const char *value, size_t len, bool *result) *****************************************************************************/ /* - * boolin - converts "t" or "f" to 1 or 0 - * - * Check explicitly for "true/false" and TRUE/FALSE, 1/0, YES/NO, ON/OFF. - * Reject other values. - * - * In the switch statement, check the most-used possibilities first. + * boolin - input function for type boolean */ Datum boolin(PG_FUNCTION_ARGS) diff --git a/src/backend/utils/adt/cash.c b/src/backend/utils/adt/cash.c index 32fbad2f57d63..b20c358486dc2 100644 --- a/src/backend/utils/adt/cash.c +++ b/src/backend/utils/adt/cash.c @@ -26,6 +26,7 @@ #include "libpq/pqformat.h" #include "utils/builtins.h" #include "utils/cash.h" +#include "utils/float.h" #include "utils/numeric.h" #include "utils/pg_locale.h" @@ -86,6 +87,82 @@ num_word(Cash value) return buf; } /* num_word() */ +static inline Cash +cash_pl_cash(Cash c1, Cash c2) +{ + Cash res; + + if (unlikely(pg_add_s64_overflow(c1, c2, &res))) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("money out of range"))); + + return res; +} + +static inline Cash +cash_mi_cash(Cash c1, Cash c2) +{ + Cash res; + + if (unlikely(pg_sub_s64_overflow(c1, c2, &res))) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("money out of range"))); + + return res; +} + +static inline Cash +cash_mul_float8(Cash c, float8 f) +{ + float8 res = rint(float8_mul((float8) c, f)); + + if (unlikely(isnan(res) || !FLOAT8_FITS_IN_INT64(res))) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("money out of range"))); + + return (Cash) res; +} + +static inline Cash +cash_div_float8(Cash c, float8 f) +{ + float8 res = rint(float8_div((float8) c, f)); + + if (unlikely(isnan(res) || !FLOAT8_FITS_IN_INT64(res))) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("money out of range"))); + + return (Cash) res; +} + +static inline Cash +cash_mul_int64(Cash c, int64 i) +{ + Cash res; + + if (unlikely(pg_mul_s64_overflow(c, i, &res))) + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("money out of range"))); + + return res; +} + +static inline Cash +cash_div_int64(Cash c, int64 i) +{ + if (unlikely(i == 0)) + ereport(ERROR, + (errcode(ERRCODE_DIVISION_BY_ZERO), + errmsg("division by zero"))); + + return c / i; +} + /* cash_in() * Convert a string to a cash data type. * Format is [$]###[,]###[.##] @@ -612,11 +689,8 @@ cash_pl(PG_FUNCTION_ARGS) { Cash c1 = PG_GETARG_CASH(0); Cash c2 = PG_GETARG_CASH(1); - Cash result; - - result = c1 + c2; - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_pl_cash(c1, c2)); } @@ -628,11 +702,8 @@ cash_mi(PG_FUNCTION_ARGS) { Cash c1 = PG_GETARG_CASH(0); Cash c2 = PG_GETARG_CASH(1); - Cash result; - - result = c1 - c2; - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_mi_cash(c1, c2)); } @@ -664,10 +735,8 @@ cash_mul_flt8(PG_FUNCTION_ARGS) { Cash c = PG_GETARG_CASH(0); float8 f = PG_GETARG_FLOAT8(1); - Cash result; - result = rint(c * f); - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_mul_float8(c, f)); } @@ -679,10 +748,8 @@ flt8_mul_cash(PG_FUNCTION_ARGS) { float8 f = PG_GETARG_FLOAT8(0); Cash c = PG_GETARG_CASH(1); - Cash result; - result = rint(f * c); - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_mul_float8(c, f)); } @@ -694,15 +761,8 @@ cash_div_flt8(PG_FUNCTION_ARGS) { Cash c = PG_GETARG_CASH(0); float8 f = PG_GETARG_FLOAT8(1); - Cash result; - if (f == 0.0) - ereport(ERROR, - (errcode(ERRCODE_DIVISION_BY_ZERO), - errmsg("division by zero"))); - - result = rint(c / f); - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_div_float8(c, f)); } @@ -714,10 +774,8 @@ cash_mul_flt4(PG_FUNCTION_ARGS) { Cash c = PG_GETARG_CASH(0); float4 f = PG_GETARG_FLOAT4(1); - Cash result; - result = rint(c * (float8) f); - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_mul_float8(c, (float8) f)); } @@ -729,10 +787,8 @@ flt4_mul_cash(PG_FUNCTION_ARGS) { float4 f = PG_GETARG_FLOAT4(0); Cash c = PG_GETARG_CASH(1); - Cash result; - result = rint((float8) f * c); - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_mul_float8(c, (float8) f)); } @@ -745,15 +801,8 @@ cash_div_flt4(PG_FUNCTION_ARGS) { Cash c = PG_GETARG_CASH(0); float4 f = PG_GETARG_FLOAT4(1); - Cash result; - - if (f == 0.0) - ereport(ERROR, - (errcode(ERRCODE_DIVISION_BY_ZERO), - errmsg("division by zero"))); - result = rint(c / (float8) f); - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_div_float8(c, (float8) f)); } @@ -765,10 +814,8 @@ cash_mul_int8(PG_FUNCTION_ARGS) { Cash c = PG_GETARG_CASH(0); int64 i = PG_GETARG_INT64(1); - Cash result; - result = c * i; - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_mul_int64(c, i)); } @@ -780,10 +827,8 @@ int8_mul_cash(PG_FUNCTION_ARGS) { int64 i = PG_GETARG_INT64(0); Cash c = PG_GETARG_CASH(1); - Cash result; - result = i * c; - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_mul_int64(c, i)); } /* cash_div_int8() @@ -794,16 +839,8 @@ cash_div_int8(PG_FUNCTION_ARGS) { Cash c = PG_GETARG_CASH(0); int64 i = PG_GETARG_INT64(1); - Cash result; - - if (i == 0) - ereport(ERROR, - (errcode(ERRCODE_DIVISION_BY_ZERO), - errmsg("division by zero"))); - result = c / i; - - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_div_int64(c, i)); } @@ -815,10 +852,8 @@ cash_mul_int4(PG_FUNCTION_ARGS) { Cash c = PG_GETARG_CASH(0); int32 i = PG_GETARG_INT32(1); - Cash result; - result = c * i; - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_mul_int64(c, (int64) i)); } @@ -830,10 +865,8 @@ int4_mul_cash(PG_FUNCTION_ARGS) { int32 i = PG_GETARG_INT32(0); Cash c = PG_GETARG_CASH(1); - Cash result; - result = i * c; - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_mul_int64(c, (int64) i)); } @@ -846,16 +879,8 @@ cash_div_int4(PG_FUNCTION_ARGS) { Cash c = PG_GETARG_CASH(0); int32 i = PG_GETARG_INT32(1); - Cash result; - - if (i == 0) - ereport(ERROR, - (errcode(ERRCODE_DIVISION_BY_ZERO), - errmsg("division by zero"))); - - result = c / i; - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_div_int64(c, (int64) i)); } @@ -867,10 +892,8 @@ cash_mul_int2(PG_FUNCTION_ARGS) { Cash c = PG_GETARG_CASH(0); int16 s = PG_GETARG_INT16(1); - Cash result; - result = c * s; - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_mul_int64(c, (int64) s)); } /* int2_mul_cash() @@ -881,10 +904,8 @@ int2_mul_cash(PG_FUNCTION_ARGS) { int16 s = PG_GETARG_INT16(0); Cash c = PG_GETARG_CASH(1); - Cash result; - result = s * c; - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_mul_int64(c, (int64) s)); } /* cash_div_int2() @@ -896,15 +917,8 @@ cash_div_int2(PG_FUNCTION_ARGS) { Cash c = PG_GETARG_CASH(0); int16 s = PG_GETARG_INT16(1); - Cash result; - if (s == 0) - ereport(ERROR, - (errcode(ERRCODE_DIVISION_BY_ZERO), - errmsg("division by zero"))); - - result = c / s; - PG_RETURN_CASH(result); + PG_RETURN_CASH(cash_div_int64(c, (int64) s)); } /* cashlarger() diff --git a/src/backend/utils/adt/char.c b/src/backend/utils/adt/char.c index 33662595398bf..5ee94be0d1e96 100644 --- a/src/backend/utils/adt/char.c +++ b/src/backend/utils/adt/char.c @@ -4,7 +4,7 @@ * Functions for the built-in type "char" (not to be confused with * bpchar, which is the SQL CHAR(n) type). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,7 +18,7 @@ #include #include "libpq/pqformat.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "varatt.h" #define ISOCTAL(c) (((c) >= '0') && ((c) <= '7')) diff --git a/src/backend/utils/adt/cryptohashfuncs.c b/src/backend/utils/adt/cryptohashfuncs.c index f9603279581d1..cc8bc96ad6fc3 100644 --- a/src/backend/utils/adt/cryptohashfuncs.c +++ b/src/backend/utils/adt/cryptohashfuncs.c @@ -3,7 +3,7 @@ * cryptohashfuncs.c * Cryptographic hash functions * - * Portions Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c index ae0f24de2c3c5..9c854e0e5c35a 100644 --- a/src/backend/utils/adt/date.c +++ b/src/backend/utils/adt/date.c @@ -3,7 +3,7 @@ * date.c * implements DATE and TIME data types specified in SQL standard * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * @@ -24,6 +24,7 @@ #include "access/xact.h" #include "catalog/pg_type.h" #include "common/hashfn.h" +#include "common/int.h" #include "libpq/pqformat.h" #include "miscadmin.h" #include "nodes/supportnodes.h" @@ -2012,19 +2013,15 @@ interval_time(PG_FUNCTION_ARGS) { Interval *span = PG_GETARG_INTERVAL_P(0); TimeADT result; - int64 days; - result = span->time; - if (result >= USECS_PER_DAY) - { - days = result / USECS_PER_DAY; - result -= days * USECS_PER_DAY; - } - else if (result < 0) - { - days = (-result + USECS_PER_DAY - 1) / USECS_PER_DAY; - result += days * USECS_PER_DAY; - } + if (INTERVAL_NOT_FINITE(span)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("cannot convert infinite interval to time"))); + + result = span->time % USECS_PER_DAY; + if (result < 0) + result += USECS_PER_DAY; PG_RETURN_TIMEADT(result); } @@ -2058,6 +2055,11 @@ time_pl_interval(PG_FUNCTION_ARGS) Interval *span = PG_GETARG_INTERVAL_P(1); TimeADT result; + if (INTERVAL_NOT_FINITE(span)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("cannot add infinite interval to time"))); + result = time + span->time; result -= result / USECS_PER_DAY * USECS_PER_DAY; if (result < INT64CONST(0)) @@ -2076,6 +2078,11 @@ time_mi_interval(PG_FUNCTION_ARGS) Interval *span = PG_GETARG_INTERVAL_P(1); TimeADT result; + if (INTERVAL_NOT_FINITE(span)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("cannot subtract infinite interval from time"))); + result = time - span->time; result -= result / USECS_PER_DAY * USECS_PER_DAY; if (result < INT64CONST(0)) @@ -2099,7 +2106,8 @@ in_range_time_interval(PG_FUNCTION_ARGS) /* * Like time_pl_interval/time_mi_interval, we disregard the month and day - * fields of the offset. So our test for negative should too. + * fields of the offset. So our test for negative should too. This also + * catches -infinity, so we only need worry about +infinity below. */ if (offset->time < 0) ereport(ERROR, @@ -2109,13 +2117,14 @@ in_range_time_interval(PG_FUNCTION_ARGS) /* * We can't use time_pl_interval/time_mi_interval here, because their * wraparound behavior would give wrong (or at least undesirable) answers. - * Fortunately the equivalent non-wrapping behavior is trivial, especially - * since we don't worry about integer overflow. + * Fortunately the equivalent non-wrapping behavior is trivial, except + * that adding an infinite (or very large) interval might cause integer + * overflow. Subtraction cannot overflow here. */ if (sub) sum = base - offset->time; - else - sum = base + offset->time; + else if (pg_add_s64_overflow(base, offset->time, &sum)) + PG_RETURN_BOOL(less); if (less) PG_RETURN_BOOL(val <= sum); @@ -2590,6 +2599,11 @@ timetz_pl_interval(PG_FUNCTION_ARGS) Interval *span = PG_GETARG_INTERVAL_P(1); TimeTzADT *result; + if (INTERVAL_NOT_FINITE(span)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("cannot add infinite interval to time"))); + result = (TimeTzADT *) palloc(sizeof(TimeTzADT)); result->time = time->time + span->time; @@ -2612,6 +2626,11 @@ timetz_mi_interval(PG_FUNCTION_ARGS) Interval *span = PG_GETARG_INTERVAL_P(1); TimeTzADT *result; + if (INTERVAL_NOT_FINITE(span)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("cannot subtract infinite interval from time"))); + result = (TimeTzADT *) palloc(sizeof(TimeTzADT)); result->time = time->time - span->time; @@ -2639,7 +2658,8 @@ in_range_timetz_interval(PG_FUNCTION_ARGS) /* * Like timetz_pl_interval/timetz_mi_interval, we disregard the month and - * day fields of the offset. So our test for negative should too. + * day fields of the offset. So our test for negative should too. This + * also catches -infinity, so we only need worry about +infinity below. */ if (offset->time < 0) ereport(ERROR, @@ -2649,13 +2669,14 @@ in_range_timetz_interval(PG_FUNCTION_ARGS) /* * We can't use timetz_pl_interval/timetz_mi_interval here, because their * wraparound behavior would give wrong (or at least undesirable) answers. - * Fortunately the equivalent non-wrapping behavior is trivial, especially - * since we don't worry about integer overflow. + * Fortunately the equivalent non-wrapping behavior is trivial, except + * that adding an infinite (or very large) interval might cause integer + * overflow. Subtraction cannot overflow here. */ if (sub) sum.time = base->time - offset->time; - else - sum.time = base->time + offset->time; + else if (pg_add_s64_overflow(base->time, offset->time, &sum.time)) + PG_RETURN_BOOL(less); sum.zone = base->zone; if (less) @@ -3083,10 +3104,11 @@ timetz_zone(PG_FUNCTION_ARGS) result = (TimeTzADT *) palloc(sizeof(TimeTzADT)); result->time = t->time + (t->zone - tz) * USECS_PER_SEC; + /* C99 modulo has the wrong sign convention for negative input */ while (result->time < INT64CONST(0)) result->time += USECS_PER_DAY; - while (result->time >= USECS_PER_DAY) - result->time -= USECS_PER_DAY; + if (result->time >= USECS_PER_DAY) + result->time %= USECS_PER_DAY; result->zone = tz; @@ -3104,6 +3126,13 @@ timetz_izone(PG_FUNCTION_ARGS) TimeTzADT *result; int tz; + if (INTERVAL_NOT_FINITE(zone)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("interval time zone \"%s\" must be finite", + DatumGetCString(DirectFunctionCall1(interval_out, + PointerGetDatum(zone)))))); + if (zone->month != 0 || zone->day != 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -3116,12 +3145,28 @@ timetz_izone(PG_FUNCTION_ARGS) result = (TimeTzADT *) palloc(sizeof(TimeTzADT)); result->time = time->time + (time->zone - tz) * USECS_PER_SEC; + /* C99 modulo has the wrong sign convention for negative input */ while (result->time < INT64CONST(0)) result->time += USECS_PER_DAY; - while (result->time >= USECS_PER_DAY) - result->time -= USECS_PER_DAY; + if (result->time >= USECS_PER_DAY) + result->time %= USECS_PER_DAY; result->zone = tz; PG_RETURN_TIMETZADT_P(result); } + +/* timetz_at_local() + * + * Unlike for timestamp[tz]_at_local, the type for timetz does not flip between + * time with/without time zone, so we cannot just call the conversion function. + */ +Datum +timetz_at_local(PG_FUNCTION_ARGS) +{ + Datum time = PG_GETARG_DATUM(0); + const char *tzn = pg_get_timezone_name(session_timezone); + Datum zone = PointerGetDatum(cstring_to_text(tzn)); + + return DirectFunctionCall2(timetz_zone, zone, time); +} diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c index 5d8d583ddcb7b..7abdc62f41df7 100644 --- a/src/backend/utils/adt/datetime.c +++ b/src/backend/utils/adt/datetime.c @@ -3,7 +3,7 @@ * datetime.c * Support functions for date/time types. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -20,7 +20,6 @@ #include "access/htup_details.h" #include "access/xact.h" -#include "catalog/pg_type.h" #include "common/int.h" #include "common/string.h" #include "funcapi.h" @@ -31,7 +30,6 @@ #include "utils/date.h" #include "utils/datetime.h" #include "utils/guc.h" -#include "utils/memutils.h" #include "utils/tzparser.h" static int DecodeNumber(int flen, char *str, bool haveTextMonth, @@ -1972,6 +1970,17 @@ DecodeTimeOnly(char **field, int *ftype, int nf, break; case DTK_TIME: + + /* + * This might be an ISO time following a "t" field. + */ + if (ptype != 0) + { + if (ptype != DTK_TIME) + return DTERR_BAD_FORMAT; + ptype = 0; + } + dterr = DecodeTime(field[i], (fmask | DTK_DATE_M), INTERVAL_FULL_RANGE, &tmask, tm, fsec); @@ -3246,6 +3255,82 @@ DecodeTimezoneNameToTz(const char *tzname) return result; } +/* DecodeTimezoneAbbrevPrefix() + * Interpret prefix of string as a timezone abbreviation, if possible. + * + * This has roughly the same functionality as DecodeTimezoneAbbrev(), + * but the API is adapted to the needs of formatting.c. Notably, + * we will match the longest possible prefix of the given string + * rather than insisting on a complete match, and downcasing is applied + * here rather than in the caller. + * + * Returns the length of the timezone abbreviation, or -1 if not recognized. + * On success, sets *offset to the GMT offset for the abbreviation if it + * is a fixed-offset abbreviation, or sets *tz to the pg_tz struct for + * a dynamic abbreviation. + */ +int +DecodeTimezoneAbbrevPrefix(const char *str, int *offset, pg_tz **tz) +{ + char lowtoken[TOKMAXLEN + 1]; + int len; + + *offset = 0; /* avoid uninitialized vars on failure */ + *tz = NULL; + + if (!zoneabbrevtbl) + return -1; /* no abbrevs known, so fail immediately */ + + /* Downcase as much of the string as we could need */ + for (len = 0; len < TOKMAXLEN; len++) + { + if (*str == '\0' || !isalpha((unsigned char) *str)) + break; + lowtoken[len] = pg_tolower((unsigned char) *str++); + } + lowtoken[len] = '\0'; + + /* + * We could avoid doing repeated binary searches if we cared to duplicate + * datebsearch here, but it's not clear that such an optimization would be + * worth the trouble. In common cases there's probably not anything after + * the zone abbrev anyway. So just search with successively truncated + * strings. + */ + while (len > 0) + { + const datetkn *tp = datebsearch(lowtoken, zoneabbrevtbl->abbrevs, + zoneabbrevtbl->numabbrevs); + + if (tp != NULL) + { + if (tp->type == DYNTZ) + { + DateTimeErrorExtra extra; + pg_tz *tzp = FetchDynamicTimeZone(zoneabbrevtbl, tp, + &extra); + + if (tzp != NULL) + { + /* Caller must resolve the abbrev's current meaning */ + *tz = tzp; + return len; + } + } + else + { + /* Fixed-offset zone abbrev, so it's easy */ + *offset = tp->value; + return len; + } + } + lowtoken[--len] = '\0'; + } + + /* Did not find a match */ + return -1; +} + /* ClearPgItmIn * @@ -3271,6 +3356,9 @@ ClearPgItmIn(struct pg_itm_in *itm_in) * * Allow ISO-style time span, with implicit units on number of days * preceding an hh:mm:ss field. - thomas 1998-04-30 + * + * itm_in remains undefined for infinite interval values for which dtype alone + * suffices. */ int DecodeInterval(char **field, int *ftype, int nf, int range, @@ -3278,6 +3366,7 @@ DecodeInterval(char **field, int *ftype, int nf, int range, { bool force_negative = false; bool is_before = false; + bool parsing_unit_val = false; char *cp; int fmask = 0, tmask, @@ -3336,6 +3425,7 @@ DecodeInterval(char **field, int *ftype, int nf, int range, itm_in->tm_usec > 0) itm_in->tm_usec = -itm_in->tm_usec; type = DTK_DAY; + parsing_unit_val = false; break; case DTK_TZ: @@ -3373,6 +3463,7 @@ DecodeInterval(char **field, int *ftype, int nf, int range, * are reading right to left. */ type = DTK_DAY; + parsing_unit_val = false; break; } @@ -3562,11 +3653,17 @@ DecodeInterval(char **field, int *ftype, int nf, int range, default: return DTERR_BAD_FORMAT; } + parsing_unit_val = false; break; case DTK_STRING: case DTK_SPECIAL: + /* reject consecutive unhandled units */ + if (parsing_unit_val) + return DTERR_BAD_FORMAT; type = DecodeUnits(i, field[i], &uval); + if (type == UNKNOWN_FIELD) + type = DecodeSpecial(i, field[i], &uval); if (type == IGNORE_DTF) continue; @@ -3575,15 +3672,39 @@ DecodeInterval(char **field, int *ftype, int nf, int range, { case UNITS: type = uval; + parsing_unit_val = true; break; case AGO: + + /* + * "ago" is only allowed to appear at the end of the + * interval. + */ + if (i != nf - 1) + return DTERR_BAD_FORMAT; is_before = true; type = uval; break; case RESERV: tmask = (DTK_DATE_M | DTK_TIME_M); + + /* + * Only reserved words corresponding to infinite + * intervals are accepted. + */ + if (uval != DTK_LATE && uval != DTK_EARLY) + return DTERR_BAD_FORMAT; + + /* + * Infinity cannot be followed by anything else. We + * could allow "ago" to reverse the sign of infinity + * but using signed infinity is more intuitive. + */ + if (i != nf - 1) + return DTERR_BAD_FORMAT; + *dtype = uval; break; @@ -3605,6 +3726,10 @@ DecodeInterval(char **field, int *ftype, int nf, int range, if (fmask == 0) return DTERR_BAD_FORMAT; + /* reject if unit appeared and was never handled */ + if (parsing_unit_val) + return DTERR_BAD_FORMAT; + /* finally, AGO negates everything */ if (is_before) { diff --git a/src/backend/utils/adt/datum.c b/src/backend/utils/adt/datum.c index 9f06ee7626f7d..45b854a0ae737 100644 --- a/src/backend/utils/adt/datum.c +++ b/src/backend/utils/adt/datum.c @@ -3,7 +3,7 @@ * datum.c * POSTGRES Datum (abstract data type) manipulation routines. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -45,9 +45,9 @@ #include "access/detoast.h" #include "common/hashfn.h" #include "fmgr.h" -#include "utils/builtins.h" #include "utils/datum.h" #include "utils/expandeddatum.h" +#include "utils/fmgrprotos.h" /*------------------------------------------------------------------------- diff --git a/src/backend/utils/adt/dbsize.c b/src/backend/utils/adt/dbsize.c index e5c0f1c45b67c..b2d9cc2792925 100644 --- a/src/backend/utils/adt/dbsize.c +++ b/src/backend/utils/adt/dbsize.c @@ -2,7 +2,7 @@ * dbsize.c * Database object size functions, and related inquiries * - * Copyright (c) 2002-2023, PostgreSQL Global Development Group + * Copyright (c) 2002-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/dbsize.c @@ -15,7 +15,6 @@ #include "access/htup_details.h" #include "access/relation.h" -#include "catalog/catalog.h" #include "catalog/namespace.h" #include "catalog/pg_authid.h" #include "catalog/pg_database.h" @@ -306,7 +305,7 @@ pg_tablespace_size_name(PG_FUNCTION_ARGS) * is no check here or at the call sites for that. */ static int64 -calculate_relation_size(RelFileLocator *rfn, BackendId backend, ForkNumber forknum) +calculate_relation_size(RelFileLocator *rfn, ProcNumber backend, ForkNumber forknum) { int64 totalsize = 0; char *relationpath; @@ -576,9 +575,13 @@ pg_size_pretty(PG_FUNCTION_ARGS) for (unit = size_pretty_units; unit->name != NULL; unit++) { uint8 bits; + uint64 abs_size = size < 0 ? 0 - (uint64) size : (uint64) size; - /* use this unit if there are no more units or we're below the limit */ - if (unit[1].name == NULL || i64abs(size) < unit->limit) + /* + * Use this unit if there are no more units or the absolute size is + * below the limit for the current unit. + */ + if (unit[1].name == NULL || abs_size < unit->limit) { if (unit->round) size = half_rounded(size); @@ -951,7 +954,7 @@ pg_relation_filepath(PG_FUNCTION_ARGS) HeapTuple tuple; Form_pg_class relform; RelFileLocator rlocator; - BackendId backend; + ProcNumber backend; char *path; tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid)); @@ -996,21 +999,21 @@ pg_relation_filepath(PG_FUNCTION_ARGS) { case RELPERSISTENCE_UNLOGGED: case RELPERSISTENCE_PERMANENT: - backend = InvalidBackendId; + backend = INVALID_PROC_NUMBER; break; case RELPERSISTENCE_TEMP: if (isTempOrTempToastNamespace(relform->relnamespace)) - backend = BackendIdForTempRelations(); + backend = ProcNumberForTempRelations(); else { /* Do it the hard way. */ - backend = GetTempNamespaceBackendId(relform->relnamespace); - Assert(backend != InvalidBackendId); + backend = GetTempNamespaceProcNumber(relform->relnamespace); + Assert(backend != INVALID_PROC_NUMBER); } break; default: elog(ERROR, "invalid relpersistence: %c", relform->relpersistence); - backend = InvalidBackendId; /* placate compiler */ + backend = INVALID_PROC_NUMBER; /* placate compiler */ break; } diff --git a/src/backend/utils/adt/domains.c b/src/backend/utils/adt/domains.c index 8d766f68e3143..21791105da877 100644 --- a/src/backend/utils/adt/domains.c +++ b/src/backend/utils/adt/domains.c @@ -19,7 +19,7 @@ * to evaluate them in. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -40,6 +40,9 @@ #include "utils/syscache.h" #include "utils/typcache.h" +static bool domain_check_internal(Datum value, bool isnull, Oid domainType, + void **extra, MemoryContext mcxt, + Node *escontext); /* * structure to cache state across multiple calls @@ -342,6 +345,32 @@ domain_recv(PG_FUNCTION_ARGS) void domain_check(Datum value, bool isnull, Oid domainType, void **extra, MemoryContext mcxt) +{ + (void) domain_check_internal(value, isnull, domainType, extra, mcxt, + NULL); +} + +/* Error-safe variant of domain_check(). */ +bool +domain_check_safe(Datum value, bool isnull, Oid domainType, + void **extra, MemoryContext mcxt, + Node *escontext) +{ + return domain_check_internal(value, isnull, domainType, extra, mcxt, + escontext); +} + +/* + * domain_check_internal + * Workhorse for domain_check() and domain_check_safe() + * + * Returns false if an error occurred in domain_check_input() and 'escontext' + * points to an ErrorSaveContext, true otherwise. + */ +static bool +domain_check_internal(Datum value, bool isnull, Oid domainType, + void **extra, MemoryContext mcxt, + Node *escontext) { DomainIOData *my_extra = NULL; @@ -365,7 +394,9 @@ domain_check(Datum value, bool isnull, Oid domainType, /* * Do the necessary checks to ensure it's a valid domain value. */ - domain_check_input(value, isnull, my_extra, NULL); + domain_check_input(value, isnull, my_extra, escontext); + + return !SOFT_ERROR_OCCURRED(escontext); } /* diff --git a/src/backend/utils/adt/encode.c b/src/backend/utils/adt/encode.c index e5ac3ad23dfc6..d1a6358b951c7 100644 --- a/src/backend/utils/adt/encode.c +++ b/src/backend/utils/adt/encode.c @@ -3,7 +3,7 @@ * encode.c * Various data encoding/decoding things. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/utils/adt/enum.c b/src/backend/utils/adt/enum.c index fdfdf7d0d2c05..814c7fb4e3e21 100644 --- a/src/backend/utils/adt/enum.c +++ b/src/backend/utils/adt/enum.c @@ -3,7 +3,7 @@ * enum.c * I/O functions, operators, aggregates etc for enum types * - * Copyright (c) 2006-2023, PostgreSQL Global Development Group + * Copyright (c) 2006-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -22,7 +22,6 @@ #include "utils/array.h" #include "utils/builtins.h" #include "utils/fmgroids.h" -#include "utils/snapmgr.h" #include "utils/syscache.h" #include "utils/typcache.h" @@ -50,11 +49,12 @@ static ArrayType *enum_range_internal(Oid enumtypoid, Oid lower, Oid upper); * We don't implement that fully right now, but we do allow free use of enum * values created during CREATE TYPE AS ENUM, which are surely of the same * lifespan as the enum type. (This case is required by "pg_restore -1".) - * Values added by ALTER TYPE ADD VALUE are currently restricted, but could - * be allowed if the enum type could be proven to have been created earlier - * in the same transaction. (Note that comparing tuple xmins would not work - * for that, because the type tuple might have been updated in the current - * transaction. Subtransactions also create hazards to be accounted for.) + * Values added by ALTER TYPE ADD VALUE are also allowed if the enum type + * is known to have been created earlier in the same transaction. (Note that + * we have to track that explicitly; comparing tuple xmins is insufficient, + * because the type tuple might have been updated in the current transaction. + * Subtransactions also create hazards to be accounted for; currently, + * pg_enum.c only handles ADD VALUE at the outermost transaction level.) * * This function needs to be called (directly or indirectly) in any of the * functions below that could return an enum value to SQL operations. @@ -82,10 +82,10 @@ check_safe_enum_use(HeapTuple enumval_tup) return; /* - * Check if the enum value is uncommitted. If not, it's safe, because it - * was made during CREATE TYPE AS ENUM and can't be shorter-lived than its - * owning type. (This'd also be false for values made by other - * transactions; but the previous tests should have handled all of those.) + * Check if the enum value is listed as uncommitted. If not, it's safe, + * because it can't be shorter-lived than its owning type. (This'd also + * be false for values made by other transactions; but the previous tests + * should have handled all of those.) */ if (!EnumUncommitted(en->oid)) return; diff --git a/src/backend/utils/adt/expandeddatum.c b/src/backend/utils/adt/expandeddatum.c index 24dc9473b4293..2cf7e001094a8 100644 --- a/src/backend/utils/adt/expandeddatum.c +++ b/src/backend/utils/adt/expandeddatum.c @@ -3,7 +3,7 @@ * expandeddatum.c * Support functions for "expanded" value representations. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/utils/adt/expandedrecord.c b/src/backend/utils/adt/expandedrecord.c index c46e5aa36f241..7e85ae3825eea 100644 --- a/src/backend/utils/adt/expandedrecord.c +++ b/src/backend/utils/adt/expandedrecord.c @@ -7,7 +7,7 @@ * store values of named composite types, domains over named composite types, * and record types (registered or anonymous). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index dfa90a04fb2b1..cbbb8aecafcc7 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -3,7 +3,7 @@ * float.c * Functions for the built-in floating-point types. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -21,10 +21,8 @@ #include "catalog/pg_type.h" #include "common/int.h" -#include "common/pg_prng.h" #include "common/shortest_dec.h" #include "libpq/pqformat.h" -#include "miscadmin.h" #include "utils/array.h" #include "utils/float.h" #include "utils/fmgrprotos.h" @@ -64,10 +62,6 @@ float8 degree_c_sixty = 60.0; float8 degree_c_one_half = 0.5; float8 degree_c_one = 1.0; -/* State for drandom() and setseed() */ -static bool drandom_seed_set = false; -static pg_prng_state drandom_seed; - /* Local function prototypes */ static double sind_q1(double x); static double cosd_q1(double x); @@ -2785,95 +2779,6 @@ derfc(PG_FUNCTION_ARGS) } -/* ========== RANDOM FUNCTIONS ========== */ - - -/* - * initialize_drandom_seed - initialize drandom_seed if not yet done - */ -static void -initialize_drandom_seed(void) -{ - /* Initialize random seed, if not done yet in this process */ - if (unlikely(!drandom_seed_set)) - { - /* - * If possible, initialize the seed using high-quality random bits. - * Should that fail for some reason, we fall back on a lower-quality - * seed based on current time and PID. - */ - if (unlikely(!pg_prng_strong_seed(&drandom_seed))) - { - TimestampTz now = GetCurrentTimestamp(); - uint64 iseed; - - /* Mix the PID with the most predictable bits of the timestamp */ - iseed = (uint64) now ^ ((uint64) MyProcPid << 32); - pg_prng_seed(&drandom_seed, iseed); - } - drandom_seed_set = true; - } -} - -/* - * drandom - returns a random number - */ -Datum -drandom(PG_FUNCTION_ARGS) -{ - float8 result; - - initialize_drandom_seed(); - - /* pg_prng_double produces desired result range [0.0 - 1.0) */ - result = pg_prng_double(&drandom_seed); - - PG_RETURN_FLOAT8(result); -} - -/* - * drandom_normal - returns a random number from a normal distribution - */ -Datum -drandom_normal(PG_FUNCTION_ARGS) -{ - float8 mean = PG_GETARG_FLOAT8(0); - float8 stddev = PG_GETARG_FLOAT8(1); - float8 result, - z; - - initialize_drandom_seed(); - - /* Get random value from standard normal(mean = 0.0, stddev = 1.0) */ - z = pg_prng_double_normal(&drandom_seed); - /* Transform the normal standard variable (z) */ - /* using the target normal distribution parameters */ - result = (stddev * z) + mean; - - PG_RETURN_FLOAT8(result); -} - -/* - * setseed - set seed for the random number generator - */ -Datum -setseed(PG_FUNCTION_ARGS) -{ - float8 seed = PG_GETARG_FLOAT8(0); - - if (seed < -1 || seed > 1 || isnan(seed)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("setseed parameter %g is out of allowed range [-1,1]", - seed))); - - pg_prng_fseed(&drandom_seed, seed); - drandom_seed_set = true; - - PG_RETURN_VOID(); -} - - /* * ========================= diff --git a/src/backend/utils/adt/format_type.c b/src/backend/utils/adt/format_type.c index 12402a0637909..28ba0fbd1929a 100644 --- a/src/backend/utils/adt/format_type.c +++ b/src/backend/utils/adt/format_type.c @@ -4,7 +4,7 @@ * Display type names "nicely". * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -294,6 +294,10 @@ format_type_extended(Oid type_oid, int32 typemod, bits16 flags) else buf = pstrdup("character varying"); break; + + case JSONOID: + buf = pstrdup("json"); + break; } if (buf == NULL) diff --git a/src/backend/utils/adt/formatting.c b/src/backend/utils/adt/formatting.c index e6246dc44bdfc..5f4b37abad2e1 100644 --- a/src/backend/utils/adt/formatting.c +++ b/src/backend/utils/adt/formatting.c @@ -4,7 +4,7 @@ * src/backend/utils/adt/formatting.c * * - * Portions Copyright (c) 1999-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1999-2024, PostgreSQL Global Development Group * * * TO_CHAR(); TO_TIMESTAMP(); TO_DATE(); TO_NUMBER(); @@ -77,13 +77,14 @@ #include "catalog/pg_collation.h" #include "catalog/pg_type.h" +#include "common/unicode_case.h" +#include "common/unicode_category.h" #include "mb/pg_wchar.h" #include "nodes/miscnodes.h" #include "parser/scansup.h" #include "utils/builtins.h" #include "utils/date.h" #include "utils/datetime.h" -#include "utils/float.h" #include "utils/formatting.h" #include "utils/memutils.h" #include "utils/numeric.h" @@ -137,7 +138,7 @@ typedef enum { FROM_CHAR_DATE_NONE = 0, /* Value does not affect date mode. */ FROM_CHAR_DATE_GREGORIAN, /* Gregorian (day, month, year) style date */ - FROM_CHAR_DATE_ISOWEEK /* ISO 8601 week date */ + FROM_CHAR_DATE_ISOWEEK, /* ISO 8601 week date */ } FromCharDateMode; typedef struct @@ -418,14 +419,24 @@ typedef struct us, yysz, /* is it YY or YYYY ? */ clock, /* 12 or 24 hour clock? */ - tzsign, /* +1, -1 or 0 if timezone info is absent */ + tzsign, /* +1, -1, or 0 if no TZH/TZM fields */ tzh, tzm, ff; /* fractional precision */ + bool has_tz; /* was there a TZ field? */ + int gmtoffset; /* GMT offset of fixed-offset zone abbrev */ + pg_tz *tzp; /* pg_tz for dynamic abbrev */ + char *abbrev; /* dynamic abbrev */ } TmFromChar; #define ZERO_tmfc(_X) memset(_X, 0, sizeof(TmFromChar)) +struct fmt_tz /* do_to_timestamp's timezone info output */ +{ + bool has_tz; /* was there any TZ/TZH/TZM field? */ + int gmtoffset; /* GMT offset in seconds */ +}; + /* ---------- * Debug * ---------- @@ -611,7 +622,7 @@ typedef enum DCH_Day, DCH_Dy, DCH_D, - DCH_FF1, + DCH_FF1, /* FFn codes must be consecutive */ DCH_FF2, DCH_FF3, DCH_FF4, @@ -777,12 +788,12 @@ static const KeyWord DCH_keywords[] = { {"Day", 3, DCH_Day, false, FROM_CHAR_DATE_NONE}, {"Dy", 2, DCH_Dy, false, FROM_CHAR_DATE_NONE}, {"D", 1, DCH_D, true, FROM_CHAR_DATE_GREGORIAN}, - {"FF1", 3, DCH_FF1, false, FROM_CHAR_DATE_NONE}, /* F */ - {"FF2", 3, DCH_FF2, false, FROM_CHAR_DATE_NONE}, - {"FF3", 3, DCH_FF3, false, FROM_CHAR_DATE_NONE}, - {"FF4", 3, DCH_FF4, false, FROM_CHAR_DATE_NONE}, - {"FF5", 3, DCH_FF5, false, FROM_CHAR_DATE_NONE}, - {"FF6", 3, DCH_FF6, false, FROM_CHAR_DATE_NONE}, + {"FF1", 3, DCH_FF1, true, FROM_CHAR_DATE_NONE}, /* F */ + {"FF2", 3, DCH_FF2, true, FROM_CHAR_DATE_NONE}, + {"FF3", 3, DCH_FF3, true, FROM_CHAR_DATE_NONE}, + {"FF4", 3, DCH_FF4, true, FROM_CHAR_DATE_NONE}, + {"FF5", 3, DCH_FF5, true, FROM_CHAR_DATE_NONE}, + {"FF6", 3, DCH_FF6, true, FROM_CHAR_DATE_NONE}, {"FX", 2, DCH_FX, false, FROM_CHAR_DATE_NONE}, {"HH24", 4, DCH_HH24, true, FROM_CHAR_DATE_NONE}, /* H */ {"HH12", 4, DCH_HH12, true, FROM_CHAR_DATE_NONE}, @@ -833,12 +844,12 @@ static const KeyWord DCH_keywords[] = { {"dd", 2, DCH_DD, true, FROM_CHAR_DATE_GREGORIAN}, {"dy", 2, DCH_dy, false, FROM_CHAR_DATE_NONE}, {"d", 1, DCH_D, true, FROM_CHAR_DATE_GREGORIAN}, - {"ff1", 3, DCH_FF1, false, FROM_CHAR_DATE_NONE}, /* f */ - {"ff2", 3, DCH_FF2, false, FROM_CHAR_DATE_NONE}, - {"ff3", 3, DCH_FF3, false, FROM_CHAR_DATE_NONE}, - {"ff4", 3, DCH_FF4, false, FROM_CHAR_DATE_NONE}, - {"ff5", 3, DCH_FF5, false, FROM_CHAR_DATE_NONE}, - {"ff6", 3, DCH_FF6, false, FROM_CHAR_DATE_NONE}, + {"ff1", 3, DCH_FF1, true, FROM_CHAR_DATE_NONE}, /* f */ + {"ff2", 3, DCH_FF2, true, FROM_CHAR_DATE_NONE}, + {"ff3", 3, DCH_FF3, true, FROM_CHAR_DATE_NONE}, + {"ff4", 3, DCH_FF4, true, FROM_CHAR_DATE_NONE}, + {"ff5", 3, DCH_FF5, true, FROM_CHAR_DATE_NONE}, + {"ff6", 3, DCH_FF6, true, FROM_CHAR_DATE_NONE}, {"fx", 2, DCH_FX, false, FROM_CHAR_DATE_NONE}, {"hh24", 4, DCH_HH24, true, FROM_CHAR_DATE_NONE}, /* h */ {"hh12", 4, DCH_HH12, true, FROM_CHAR_DATE_NONE}, @@ -1058,8 +1069,8 @@ static bool from_char_seq_search(int *dest, const char **src, char **localized_array, Oid collid, FormatNode *node, Node *escontext); static bool do_to_timestamp(text *date_txt, text *fmt, Oid collid, bool std, - struct pg_tm *tm, fsec_t *fsec, int *fprec, - uint32 *flags, Node *escontext); + struct pg_tm *tm, fsec_t *fsec, struct fmt_tz *tz, + int *fprec, uint32 *flags, Node *escontext); static char *fill_str(char *str, int c, int max); static FormatNode *NUM_cache(int len, NUMDesc *Num, text *pars_str, bool *shouldFree); static char *int_to_roman(int number); @@ -1613,12 +1624,6 @@ u_strToTitle_default_BI(UChar *dest, int32_t destCapacity, * in multibyte character sets. Note that in either case we are effectively * assuming that the database character encoding matches the encoding implied * by LC_CTYPE. - * - * If the system provides locale_t and associated functions (which are - * standardized by Open Group's XBD), we can support collations that are - * neither default nor C. The code is written to handle both combinations - * of have-wide-characters and have-locale_t, though it's rather unlikely - * a platform would have the latter without the former. */ /* @@ -1676,7 +1681,37 @@ str_tolower(const char *buff, size_t nbytes, Oid collid) } else #endif + if (mylocale && mylocale->provider == COLLPROVIDER_BUILTIN) + { + const char *src = buff; + size_t srclen = nbytes; + size_t dstsize; + char *dst; + size_t needed; + + Assert(GetDatabaseEncoding() == PG_UTF8); + + /* first try buffer of equal size plus terminating NUL */ + dstsize = srclen + 1; + dst = palloc(dstsize); + + needed = unicode_strlower(dst, dstsize, src, srclen); + if (needed + 1 > dstsize) + { + /* grow buffer if needed and retry */ + dstsize = needed + 1; + dst = repalloc(dst, dstsize); + needed = unicode_strlower(dst, dstsize, src, srclen); + Assert(needed + 1 == dstsize); + } + + Assert(dst[needed] == '\0'); + result = dst; + } + else { + Assert(!mylocale || mylocale->provider == COLLPROVIDER_LIBC); + if (pg_database_encoding_max_length() > 1) { wchar_t *workspace; @@ -1696,11 +1731,9 @@ str_tolower(const char *buff, size_t nbytes, Oid collid) for (curr_char = 0; workspace[curr_char] != 0; curr_char++) { -#ifdef HAVE_LOCALE_T if (mylocale) workspace[curr_char] = towlower_l(workspace[curr_char], mylocale->info.lt); else -#endif workspace[curr_char] = towlower(workspace[curr_char]); } @@ -1729,11 +1762,9 @@ str_tolower(const char *buff, size_t nbytes, Oid collid) */ for (p = result; *p; p++) { -#ifdef HAVE_LOCALE_T if (mylocale) *p = tolower_l((unsigned char) *p, mylocale->info.lt); else -#endif *p = pg_tolower((unsigned char) *p); } } @@ -1798,7 +1829,37 @@ str_toupper(const char *buff, size_t nbytes, Oid collid) } else #endif + if (mylocale && mylocale->provider == COLLPROVIDER_BUILTIN) + { + const char *src = buff; + size_t srclen = nbytes; + size_t dstsize; + char *dst; + size_t needed; + + Assert(GetDatabaseEncoding() == PG_UTF8); + + /* first try buffer of equal size plus terminating NUL */ + dstsize = srclen + 1; + dst = palloc(dstsize); + + needed = unicode_strupper(dst, dstsize, src, srclen); + if (needed + 1 > dstsize) + { + /* grow buffer if needed and retry */ + dstsize = needed + 1; + dst = repalloc(dst, dstsize); + needed = unicode_strupper(dst, dstsize, src, srclen); + Assert(needed + 1 == dstsize); + } + + Assert(dst[needed] == '\0'); + result = dst; + } + else { + Assert(!mylocale || mylocale->provider == COLLPROVIDER_LIBC); + if (pg_database_encoding_max_length() > 1) { wchar_t *workspace; @@ -1818,11 +1879,9 @@ str_toupper(const char *buff, size_t nbytes, Oid collid) for (curr_char = 0; workspace[curr_char] != 0; curr_char++) { -#ifdef HAVE_LOCALE_T if (mylocale) workspace[curr_char] = towupper_l(workspace[curr_char], mylocale->info.lt); else -#endif workspace[curr_char] = towupper(workspace[curr_char]); } @@ -1851,11 +1910,9 @@ str_toupper(const char *buff, size_t nbytes, Oid collid) */ for (p = result; *p; p++) { -#ifdef HAVE_LOCALE_T if (mylocale) *p = toupper_l((unsigned char) *p, mylocale->info.lt); else -#endif *p = pg_toupper((unsigned char) *p); } } @@ -1865,6 +1922,47 @@ str_toupper(const char *buff, size_t nbytes, Oid collid) return result; } +struct WordBoundaryState +{ + const char *str; + size_t len; + size_t offset; + bool init; + bool prev_alnum; +}; + +/* + * Simple word boundary iterator that draws boundaries each time the result of + * pg_u_isalnum() changes. + */ +static size_t +initcap_wbnext(void *state) +{ + struct WordBoundaryState *wbstate = (struct WordBoundaryState *) state; + + while (wbstate->offset < wbstate->len && + wbstate->str[wbstate->offset] != '\0') + { + pg_wchar u = utf8_to_unicode((unsigned char *) wbstate->str + + wbstate->offset); + bool curr_alnum = pg_u_isalnum(u, true); + + if (!wbstate->init || curr_alnum != wbstate->prev_alnum) + { + size_t prev_offset = wbstate->offset; + + wbstate->init = true; + wbstate->offset += unicode_utf8len(u); + wbstate->prev_alnum = curr_alnum; + return prev_offset; + } + + wbstate->offset += unicode_utf8len(u); + } + + return wbstate->len; +} + /* * collation-aware, wide-character-aware initcap function * @@ -1921,7 +2019,49 @@ str_initcap(const char *buff, size_t nbytes, Oid collid) } else #endif + if (mylocale && mylocale->provider == COLLPROVIDER_BUILTIN) { + const char *src = buff; + size_t srclen = nbytes; + size_t dstsize; + char *dst; + size_t needed; + struct WordBoundaryState wbstate = { + .str = src, + .len = srclen, + .offset = 0, + .init = false, + .prev_alnum = false, + }; + + Assert(GetDatabaseEncoding() == PG_UTF8); + + /* first try buffer of equal size plus terminating NUL */ + dstsize = srclen + 1; + dst = palloc(dstsize); + + needed = unicode_strtitle(dst, dstsize, src, srclen, + initcap_wbnext, &wbstate); + if (needed + 1 > dstsize) + { + /* reset iterator */ + wbstate.offset = 0; + wbstate.init = false; + + /* grow buffer if needed and retry */ + dstsize = needed + 1; + dst = repalloc(dst, dstsize); + needed = unicode_strtitle(dst, dstsize, src, srclen, + initcap_wbnext, &wbstate); + Assert(needed + 1 == dstsize); + } + + result = dst; + } + else + { + Assert(!mylocale || mylocale->provider == COLLPROVIDER_LIBC); + if (pg_database_encoding_max_length() > 1) { wchar_t *workspace; @@ -1941,7 +2081,6 @@ str_initcap(const char *buff, size_t nbytes, Oid collid) for (curr_char = 0; workspace[curr_char] != 0; curr_char++) { -#ifdef HAVE_LOCALE_T if (mylocale) { if (wasalnum) @@ -1951,7 +2090,6 @@ str_initcap(const char *buff, size_t nbytes, Oid collid) wasalnum = iswalnum_l(workspace[curr_char], mylocale->info.lt); } else -#endif { if (wasalnum) workspace[curr_char] = towlower(workspace[curr_char]); @@ -1986,7 +2124,6 @@ str_initcap(const char *buff, size_t nbytes, Oid collid) */ for (p = result; *p; p++) { -#ifdef HAVE_LOCALE_T if (mylocale) { if (wasalnum) @@ -1996,7 +2133,6 @@ str_initcap(const char *buff, size_t nbytes, Oid collid) wasalnum = isalnum_l((unsigned char) *p, mylocale->info.lt); } else -#endif { if (wasalnum) *p = pg_tolower((unsigned char) *p); @@ -3462,7 +3598,7 @@ DCH_from_char(FormatNode *node, const char *in, TmFromChar *out, case DCH_FF5: case DCH_FF6: out->ff = n->key->id - DCH_FF1 + 1; - /* fall through */ + /* FALLTHROUGH */ case DCH_US: /* microsecond */ len = from_char_parse_int_len(&out->us, &s, n->key->id == DCH_US ? 6 : @@ -3485,11 +3621,63 @@ DCH_from_char(FormatNode *node, const char *in, TmFromChar *out, break; case DCH_tz: case DCH_TZ: + { + int tzlen; + + tzlen = DecodeTimezoneAbbrevPrefix(s, + &out->gmtoffset, + &out->tzp); + if (tzlen > 0) + { + out->has_tz = true; + /* we only need the zone abbrev for DYNTZ case */ + if (out->tzp) + out->abbrev = pnstrdup(s, tzlen); + out->tzsign = 0; /* drop any earlier TZH/TZM info */ + s += tzlen; + break; + } + else if (isalpha((unsigned char) *s)) + { + /* + * It doesn't match any abbreviation, but it starts + * with a letter. OF format certainly won't succeed; + * assume it's a misspelled abbreviation and complain + * accordingly. + */ + ereturn(escontext,, + (errcode(ERRCODE_INVALID_DATETIME_FORMAT), + errmsg("invalid value \"%s\" for \"%s\"", + s, n->key->name), + errdetail("Time zone abbreviation is not recognized."))); + } + /* otherwise parse it like OF */ + } + /* FALLTHROUGH */ case DCH_OF: - ereturn(escontext,, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("formatting field \"%s\" is only supported in to_char", - n->key->name))); + /* OF is equivalent to TZH or TZH:TZM */ + /* see TZH comments below */ + if (*s == '+' || *s == '-' || *s == ' ') + { + out->tzsign = *s == '-' ? -1 : +1; + s++; + } + else + { + if (extra_skip > 0 && *(s - 1) == '-') + out->tzsign = -1; + else + out->tzsign = +1; + } + if (from_char_parse_int_len(&out->tzh, &s, 2, n, escontext) < 0) + return; + if (*s == ':') + { + s++; + if (from_char_parse_int_len(&out->tzm, &s, 2, n, + escontext) < 0) + return; + } break; case DCH_TZH: @@ -4145,7 +4333,7 @@ interval_to_char(PG_FUNCTION_ARGS) struct pg_itm tt, *itm = &tt; - if (VARSIZE_ANY_EXHDR(fmt) <= 0) + if (VARSIZE_ANY_EXHDR(fmt) <= 0 || INTERVAL_NOT_FINITE(it)) PG_RETURN_NULL(); ZERO_tmtc(&tmtc); @@ -4185,22 +4373,16 @@ to_timestamp(PG_FUNCTION_ARGS) Timestamp result; int tz; struct pg_tm tm; + struct fmt_tz ftz; fsec_t fsec; int fprec; do_to_timestamp(date_txt, fmt, collid, false, - &tm, &fsec, &fprec, NULL, NULL); + &tm, &fsec, &ftz, &fprec, NULL, NULL); /* Use the specified time zone, if any. */ - if (tm.tm_zone) - { - DateTimeErrorExtra extra; - int dterr = DecodeTimezone(tm.tm_zone, &tz); - - if (dterr) - DateTimeParseError(dterr, &extra, text_to_cstring(date_txt), - "timestamptz", NULL); - } + if (ftz.has_tz) + tz = ftz.gmtoffset; else tz = DetermineTimeZoneOffset(&tm, session_timezone); @@ -4229,10 +4411,11 @@ to_date(PG_FUNCTION_ARGS) Oid collid = PG_GET_COLLATION(); DateADT result; struct pg_tm tm; + struct fmt_tz ftz; fsec_t fsec; do_to_timestamp(date_txt, fmt, collid, false, - &tm, &fsec, NULL, NULL, NULL); + &tm, &fsec, &ftz, NULL, NULL, NULL); /* Prevent overflow in Julian-day routines */ if (!IS_VALID_JULIAN(tm.tm_year, tm.tm_mon, tm.tm_mday)) @@ -4274,12 +4457,13 @@ parse_datetime(text *date_txt, text *fmt, Oid collid, bool strict, Node *escontext) { struct pg_tm tm; + struct fmt_tz ftz; fsec_t fsec; int fprec; uint32 flags; if (!do_to_timestamp(date_txt, fmt, collid, strict, - &tm, &fsec, &fprec, &flags, escontext)) + &tm, &fsec, &ftz, &fprec, &flags, escontext)) return (Datum) 0; *typmod = fprec ? fprec : -1; /* fractional part precision */ @@ -4292,18 +4476,9 @@ parse_datetime(text *date_txt, text *fmt, Oid collid, bool strict, { TimestampTz result; - if (tm.tm_zone) + if (ftz.has_tz) { - DateTimeErrorExtra extra; - int dterr = DecodeTimezone(tm.tm_zone, tz); - - if (dterr) - { - DateTimeParseError(dterr, &extra, - text_to_cstring(date_txt), - "timestamptz", escontext); - return (Datum) 0; - } + *tz = ftz.gmtoffset; } else { @@ -4384,18 +4559,9 @@ parse_datetime(text *date_txt, text *fmt, Oid collid, bool strict, { TimeTzADT *result = palloc(sizeof(TimeTzADT)); - if (tm.tm_zone) + if (ftz.has_tz) { - DateTimeErrorExtra extra; - int dterr = DecodeTimezone(tm.tm_zone, tz); - - if (dterr) - { - DateTimeParseError(dterr, &extra, - text_to_cstring(date_txt), - "timetz", escontext); - return (Datum) 0; - } + *tz = ftz.gmtoffset; } else { @@ -4444,11 +4610,55 @@ parse_datetime(text *date_txt, text *fmt, Oid collid, bool strict, } } +/* + * Parses the datetime format string in 'fmt_str' and returns true if it + * contains a timezone specifier, false if not. + */ +bool +datetime_format_has_tz(const char *fmt_str) +{ + bool incache; + int fmt_len = strlen(fmt_str); + int result; + FormatNode *format; + + if (fmt_len > DCH_CACHE_SIZE) + { + /* + * Allocate new memory if format picture is bigger than static cache + * and do not use cache (call parser always) + */ + incache = false; + + format = (FormatNode *) palloc((fmt_len + 1) * sizeof(FormatNode)); + + parse_format(format, fmt_str, DCH_keywords, + DCH_suff, DCH_index, DCH_FLAG, NULL); + } + else + { + /* + * Use cache buffers + */ + DCHCacheEntry *ent = DCH_cache_fetch(fmt_str, false); + + incache = true; + format = ent->format; + } + + result = DCH_datetime_type(format); + + if (!incache) + pfree(format); + + return result & DCH_ZONED; +} + /* * do_to_timestamp: shared code for to_timestamp and to_date * * Parse the 'date_txt' according to 'fmt', return results as a struct pg_tm, - * fractional seconds, and fractional precision. + * fractional seconds, struct fmt_tz, and fractional precision. * * 'collid' identifies the collation to use, if needed. * 'std' specifies standard parsing mode. @@ -4465,12 +4675,12 @@ parse_datetime(text *date_txt, text *fmt, Oid collid, bool strict, * 'date_txt'. * * The TmFromChar is then analysed and converted into the final results in - * struct 'tm', 'fsec', and 'fprec'. + * struct 'tm', 'fsec', struct 'tz', and 'fprec'. */ static bool do_to_timestamp(text *date_txt, text *fmt, Oid collid, bool std, - struct pg_tm *tm, fsec_t *fsec, int *fprec, - uint32 *flags, Node *escontext) + struct pg_tm *tm, fsec_t *fsec, struct fmt_tz *tz, + int *fprec, uint32 *flags, Node *escontext) { FormatNode *format = NULL; TmFromChar tmfc; @@ -4487,6 +4697,7 @@ do_to_timestamp(text *date_txt, text *fmt, Oid collid, bool std, ZERO_tmfc(&tmfc); ZERO_tm(tm); *fsec = 0; + tz->has_tz = false; if (fprec) *fprec = 0; if (flags) @@ -4762,11 +4973,14 @@ do_to_timestamp(text *date_txt, text *fmt, Oid collid, bool std, goto fail; } - /* Save parsed time-zone into tm->tm_zone if it was specified */ + /* + * If timezone info was present, reduce it to a GMT offset. (We cannot do + * this until we've filled all of the tm struct, since the zone's offset + * might be time-varying.) + */ if (tmfc.tzsign) { - char *tz; - + /* TZH and/or TZM fields */ if (tmfc.tzh < 0 || tmfc.tzh > MAX_TZDISP_HOUR || tmfc.tzm < 0 || tmfc.tzm >= MINS_PER_HOUR) { @@ -4775,10 +4989,27 @@ do_to_timestamp(text *date_txt, text *fmt, Oid collid, bool std, goto fail; } - tz = psprintf("%c%02d:%02d", - tmfc.tzsign > 0 ? '+' : '-', tmfc.tzh, tmfc.tzm); - - tm->tm_zone = tz; + tz->has_tz = true; + tz->gmtoffset = (tmfc.tzh * MINS_PER_HOUR + tmfc.tzm) * SECS_PER_MINUTE; + /* note we are flipping the sign convention here */ + if (tmfc.tzsign > 0) + tz->gmtoffset = -tz->gmtoffset; + } + else if (tmfc.has_tz) + { + /* TZ field */ + tz->has_tz = true; + if (tmfc.tzp == NULL) + { + /* fixed-offset abbreviation; flip the sign convention */ + tz->gmtoffset = -tmfc.gmtoffset; + } + else + { + /* dynamic-offset abbreviation, resolve using specified time */ + tz->gmtoffset = DetermineTimeZoneAbbrevOffset(tm, tmfc.abbrev, + tmfc.tzp); + } } DEBUG_TM(tm); diff --git a/src/backend/utils/adt/genfile.c b/src/backend/utils/adt/genfile.c index f281ce98068d3..0d82557417991 100644 --- a/src/backend/utils/adt/genfile.c +++ b/src/backend/utils/adt/genfile.c @@ -4,7 +4,7 @@ * Functions for direct access to files * * - * Copyright (c) 2004-2023, PostgreSQL Global Development Group + * Copyright (c) 2004-2024, PostgreSQL Global Development Group * * Author: Andreas Pflug * @@ -227,52 +227,6 @@ read_text_file(const char *filename, int64 seek_offset, int64 bytes_to_read, return NULL; } -/* - * Read a section of a file, returning it as text - * - * This function is kept to support adminpack 1.0. - */ -Datum -pg_read_file(PG_FUNCTION_ARGS) -{ - text *filename_t = PG_GETARG_TEXT_PP(0); - int64 seek_offset = 0; - int64 bytes_to_read = -1; - bool missing_ok = false; - char *filename; - text *result; - - if (!superuser()) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("must be superuser to read files with adminpack 1.0"), - /* translator: %s is a SQL function name */ - errhint("Consider using %s, which is part of core, instead.", - "pg_read_file()"))); - - /* handle optional arguments */ - if (PG_NARGS() >= 3) - { - seek_offset = PG_GETARG_INT64(1); - bytes_to_read = PG_GETARG_INT64(2); - - if (bytes_to_read < 0) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("requested length cannot be negative"))); - } - if (PG_NARGS() >= 4) - missing_ok = PG_GETARG_BOOL(3); - - filename = convert_and_check_filename(filename_t); - - result = read_text_file(filename, seek_offset, bytes_to_read, missing_ok); - if (result) - PG_RETURN_TEXT_P(result); - else - PG_RETURN_NULL(); -} - /* * Read a section of a file, returning it as text * diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c index 53ee4b6f9cb6e..07d1649c7b659 100644 --- a/src/backend/utils/adt/geo_ops.c +++ b/src/backend/utils/adt/geo_ops.c @@ -13,7 +13,7 @@ * - circle * - polygon * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/utils/adt/geo_selfuncs.c b/src/backend/utils/adt/geo_selfuncs.c index f9f40922e0387..340d3065f838c 100644 --- a/src/backend/utils/adt/geo_selfuncs.c +++ b/src/backend/utils/adt/geo_selfuncs.c @@ -4,7 +4,7 @@ * Selectivity routines registered in the operator catalog in the * "oprrest" and "oprjoin" attributes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,8 +18,7 @@ */ #include "postgres.h" -#include "utils/builtins.h" -#include "utils/geo_decls.h" +#include "utils/fmgrprotos.h" /* diff --git a/src/backend/utils/adt/geo_spgist.c b/src/backend/utils/adt/geo_spgist.c index b708a805477f3..51378dca5baa6 100644 --- a/src/backend/utils/adt/geo_spgist.c +++ b/src/backend/utils/adt/geo_spgist.c @@ -62,7 +62,7 @@ * except the root. For the root node, we are setting the boundaries * that we don't yet have as infinity. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/adt/hbafuncs.c b/src/backend/utils/adt/hbafuncs.c index 73d3ad1dadca0..600b5af902620 100644 --- a/src/backend/utils/adt/hbafuncs.c +++ b/src/backend/utils/adt/hbafuncs.c @@ -3,7 +3,7 @@ * hbafuncs.c * Support functions for SQL views of authentication files. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,7 +18,6 @@ #include "common/ip.h" #include "funcapi.h" #include "libpq/hba.h" -#include "miscadmin.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/guc.h" @@ -38,12 +37,12 @@ static void fill_ident_view(Tuplestorestate *tuple_store, TupleDesc tupdesc); /* * This macro specifies the maximum number of authentication options * that are possible with any given authentication method that is supported. - * Currently LDAP supports 11, and there are 3 that are not dependent on + * Currently LDAP supports 12, and there are 3 that are not dependent on * the auth method here. It may not actually be possible to set all of them * at the same time, but we'll set the macro value high enough to be * conservative and avoid warnings from static analysis tools. */ -#define MAX_HBA_OPTIONS 14 +#define MAX_HBA_OPTIONS 15 /* * Create a text array listing the options specified in the HBA line. @@ -90,6 +89,10 @@ get_hba_options(HbaLine *hba) options[noptions++] = CStringGetTextDatum(psprintf("ldapport=%d", hba->ldapport)); + if (hba->ldapscheme) + options[noptions++] = + CStringGetTextDatum(psprintf("ldapscheme=%s", hba->ldapscheme)); + if (hba->ldaptls) options[noptions++] = CStringGetTextDatum("ldaptls=true"); diff --git a/src/backend/utils/adt/int.c b/src/backend/utils/adt/int.c index 44d1c7ad0c4d7..234f20796b761 100644 --- a/src/backend/utils/adt/int.c +++ b/src/backend/utils/adt/int.c @@ -3,7 +3,7 @@ * int.c * Functions for the built-in integer types (except int8). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c index 123b4eb6bfbb6..54fa3bc379999 100644 --- a/src/backend/utils/adt/int8.c +++ b/src/backend/utils/adt/int8.c @@ -3,7 +3,7 @@ * int8.c * Internal 64-bit integer operations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -24,7 +24,6 @@ #include "nodes/supportnodes.h" #include "optimizer/optimizer.h" #include "utils/builtins.h" -#include "utils/lsyscache.h" typedef struct diff --git a/src/backend/utils/adt/json.c b/src/backend/utils/adt/json.c index 49080e5fbfffd..30ea4c491275f 100644 --- a/src/backend/utils/adt/json.c +++ b/src/backend/utils/adt/json.c @@ -3,7 +3,7 @@ * json.c * JSON data type support. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -19,7 +19,6 @@ #include "funcapi.h" #include "libpq/pqformat.h" #include "miscadmin.h" -#include "parser/parse_coerce.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/date.h" @@ -29,21 +28,6 @@ #include "utils/lsyscache.h" #include "utils/typcache.h" -typedef enum /* type categories for datum_to_json */ -{ - JSONTYPE_NULL, /* null, so we didn't bother to identify */ - JSONTYPE_BOOL, /* boolean (built-in types only) */ - JSONTYPE_NUMERIC, /* numeric (ditto) */ - JSONTYPE_DATE, /* we use special formatting for datetimes */ - JSONTYPE_TIMESTAMP, - JSONTYPE_TIMESTAMPTZ, - JSONTYPE_JSON, /* JSON itself (and JSONB) */ - JSONTYPE_ARRAY, /* array */ - JSONTYPE_COMPOSITE, /* composite */ - JSONTYPE_CAST, /* something with an explicit cast to JSON */ - JSONTYPE_OTHER /* all else */ -} JsonTypeCategory; - /* * Support for fast key uniqueness checking. @@ -107,12 +91,9 @@ static void array_dim_to_json(StringInfo result, int dim, int ndims, int *dims, bool use_line_feeds); static void array_to_json_internal(Datum array, StringInfo result, bool use_line_feeds); -static void json_categorize_type(Oid typoid, - JsonTypeCategory *tcategory, - Oid *outfuncoid); -static void datum_to_json(Datum val, bool is_null, StringInfo result, - JsonTypeCategory tcategory, Oid outfuncoid, - bool key_scalar); +static void datum_to_json_internal(Datum val, bool is_null, StringInfo result, + JsonTypeCategory tcategory, Oid outfuncoid, + bool key_scalar); static void add_json(Datum val, bool is_null, StringInfo result, Oid val_type, bool key_scalar); static text *catenate_stringinfo_string(StringInfo buffer, const char *addon); @@ -125,11 +106,11 @@ json_in(PG_FUNCTION_ARGS) { char *json = PG_GETARG_CSTRING(0); text *result = cstring_to_text(json); - JsonLexContext *lex; + JsonLexContext lex; /* validate it */ - lex = makeJsonLexContext(result, false); - if (!pg_parse_json_or_errsave(lex, &nullSemAction, fcinfo->context)) + makeJsonLexContext(&lex, result, false); + if (!pg_parse_json_or_errsave(&lex, &nullSemAction, fcinfo->context)) PG_RETURN_NULL(); /* Internal representation is the same as text */ @@ -171,117 +152,18 @@ json_recv(PG_FUNCTION_ARGS) StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); char *str; int nbytes; - JsonLexContext *lex; + JsonLexContext lex; str = pq_getmsgtext(buf, buf->len - buf->cursor, &nbytes); /* Validate it. */ - lex = makeJsonLexContextCstringLen(str, nbytes, GetDatabaseEncoding(), false); - pg_parse_json_or_ereport(lex, &nullSemAction); + makeJsonLexContextCstringLen(&lex, str, nbytes, GetDatabaseEncoding(), + false); + pg_parse_json_or_ereport(&lex, &nullSemAction); PG_RETURN_TEXT_P(cstring_to_text_with_len(str, nbytes)); } -/* - * Determine how we want to print values of a given type in datum_to_json. - * - * Given the datatype OID, return its JsonTypeCategory, as well as the type's - * output function OID. If the returned category is JSONTYPE_CAST, we - * return the OID of the type->JSON cast function instead. - */ -static void -json_categorize_type(Oid typoid, - JsonTypeCategory *tcategory, - Oid *outfuncoid) -{ - bool typisvarlena; - - /* Look through any domain */ - typoid = getBaseType(typoid); - - *outfuncoid = InvalidOid; - - /* - * We need to get the output function for everything except date and - * timestamp types, array and composite types, booleans, and non-builtin - * types where there's a cast to json. - */ - - switch (typoid) - { - case BOOLOID: - *tcategory = JSONTYPE_BOOL; - break; - - case INT2OID: - case INT4OID: - case INT8OID: - case FLOAT4OID: - case FLOAT8OID: - case NUMERICOID: - getTypeOutputInfo(typoid, outfuncoid, &typisvarlena); - *tcategory = JSONTYPE_NUMERIC; - break; - - case DATEOID: - *tcategory = JSONTYPE_DATE; - break; - - case TIMESTAMPOID: - *tcategory = JSONTYPE_TIMESTAMP; - break; - - case TIMESTAMPTZOID: - *tcategory = JSONTYPE_TIMESTAMPTZ; - break; - - case JSONOID: - case JSONBOID: - getTypeOutputInfo(typoid, outfuncoid, &typisvarlena); - *tcategory = JSONTYPE_JSON; - break; - - default: - /* Check for arrays and composites */ - if (OidIsValid(get_element_type(typoid)) || typoid == ANYARRAYOID - || typoid == ANYCOMPATIBLEARRAYOID || typoid == RECORDARRAYOID) - *tcategory = JSONTYPE_ARRAY; - else if (type_is_rowtype(typoid)) /* includes RECORDOID */ - *tcategory = JSONTYPE_COMPOSITE; - else - { - /* It's probably the general case ... */ - *tcategory = JSONTYPE_OTHER; - /* but let's look for a cast to json, if it's not built-in */ - if (typoid >= FirstNormalObjectId) - { - Oid castfunc; - CoercionPathType ctype; - - ctype = find_coercion_pathway(JSONOID, typoid, - COERCION_EXPLICIT, - &castfunc); - if (ctype == COERCION_PATH_FUNC && OidIsValid(castfunc)) - { - *tcategory = JSONTYPE_CAST; - *outfuncoid = castfunc; - } - else - { - /* non builtin type with no cast */ - getTypeOutputInfo(typoid, outfuncoid, &typisvarlena); - } - } - else - { - /* any other builtin type */ - getTypeOutputInfo(typoid, outfuncoid, &typisvarlena); - } - } - break; - } -} - /* * Turn a Datum into JSON text, appending the string to "result". * @@ -292,9 +174,9 @@ json_categorize_type(Oid typoid, * it's of an acceptable type, and force it to be quoted. */ static void -datum_to_json(Datum val, bool is_null, StringInfo result, - JsonTypeCategory tcategory, Oid outfuncoid, - bool key_scalar) +datum_to_json_internal(Datum val, bool is_null, StringInfo result, + JsonTypeCategory tcategory, Oid outfuncoid, + bool key_scalar) { char *outputstr; text *jsontext; @@ -306,7 +188,7 @@ datum_to_json(Datum val, bool is_null, StringInfo result, if (is_null) { - appendStringInfoString(result, "null"); + appendBinaryStringInfo(result, "null", strlen("null")); return; } @@ -328,23 +210,35 @@ datum_to_json(Datum val, bool is_null, StringInfo result, composite_to_json(val, result, false); break; case JSONTYPE_BOOL: - outputstr = DatumGetBool(val) ? "true" : "false"; if (key_scalar) - escape_json(result, outputstr); + appendStringInfoChar(result, '"'); + if (DatumGetBool(val)) + appendBinaryStringInfo(result, "true", strlen("true")); else - appendStringInfoString(result, outputstr); + appendBinaryStringInfo(result, "false", strlen("false")); + if (key_scalar) + appendStringInfoChar(result, '"'); break; case JSONTYPE_NUMERIC: outputstr = OidOutputFunctionCall(outfuncoid, val); /* - * Don't call escape_json for a non-key if it's a valid JSON - * number. + * Don't quote a non-key if it's a valid JSON number (i.e., not + * "Infinity", "-Infinity", or "NaN"). Since we know this is a + * numeric data type's output, we simplify and open-code the + * validation for better performance. */ - if (!key_scalar && IsValidJsonNumber(outputstr, strlen(outputstr))) + if (!key_scalar && + ((*outputstr >= '0' && *outputstr <= '9') || + (*outputstr == '-' && + (outputstr[1] >= '0' && outputstr[1] <= '9')))) appendStringInfoString(result, outputstr); else - escape_json(result, outputstr); + { + appendStringInfoChar(result, '"'); + appendStringInfoString(result, outputstr); + appendStringInfoChar(result, '"'); + } pfree(outputstr); break; case JSONTYPE_DATE: @@ -352,7 +246,9 @@ datum_to_json(Datum val, bool is_null, StringInfo result, char buf[MAXDATELEN + 1]; JsonEncodeDateTime(buf, val, DATEOID, NULL); - appendStringInfo(result, "\"%s\"", buf); + appendStringInfoChar(result, '"'); + appendStringInfoString(result, buf); + appendStringInfoChar(result, '"'); } break; case JSONTYPE_TIMESTAMP: @@ -360,7 +256,9 @@ datum_to_json(Datum val, bool is_null, StringInfo result, char buf[MAXDATELEN + 1]; JsonEncodeDateTime(buf, val, TIMESTAMPOID, NULL); - appendStringInfo(result, "\"%s\"", buf); + appendStringInfoChar(result, '"'); + appendStringInfoString(result, buf); + appendStringInfoChar(result, '"'); } break; case JSONTYPE_TIMESTAMPTZ: @@ -368,7 +266,9 @@ datum_to_json(Datum val, bool is_null, StringInfo result, char buf[MAXDATELEN + 1]; JsonEncodeDateTime(buf, val, TIMESTAMPTZOID, NULL); - appendStringInfo(result, "\"%s\"", buf); + appendStringInfoChar(result, '"'); + appendStringInfoString(result, buf); + appendStringInfoChar(result, '"'); } break; case JSONTYPE_JSON: @@ -380,9 +280,8 @@ datum_to_json(Datum val, bool is_null, StringInfo result, case JSONTYPE_CAST: /* outfuncoid refers to a cast function, not an output function */ jsontext = DatumGetTextPP(OidFunctionCall1(outfuncoid, val)); - outputstr = text_to_cstring(jsontext); - appendStringInfoString(result, outputstr); - pfree(outputstr); + appendBinaryStringInfo(result, VARDATA_ANY(jsontext), + VARSIZE_ANY_EXHDR(jsontext)); pfree(jsontext); break; default: @@ -540,8 +439,9 @@ array_dim_to_json(StringInfo result, int dim, int ndims, int *dims, Datum *vals, if (dim + 1 == ndims) { - datum_to_json(vals[*valcount], nulls[*valcount], result, tcategory, - outfuncoid, false); + datum_to_json_internal(vals[*valcount], nulls[*valcount], + result, tcategory, + outfuncoid, false); (*valcount)++; } else @@ -591,7 +491,7 @@ array_to_json_internal(Datum array, StringInfo result, bool use_line_feeds) get_typlenbyvalalign(element_type, &typlen, &typbyval, &typalign); - json_categorize_type(element_type, + json_categorize_type(element_type, false, &tcategory, &outfuncoid); deconstruct_array(v, element_type, typlen, typbyval, @@ -620,8 +520,14 @@ composite_to_json(Datum composite, StringInfo result, bool use_line_feeds) int i; bool needsep = false; const char *sep; + int seplen; + /* + * We can avoid expensive strlen() calls by precalculating the separator + * length. + */ sep = use_line_feeds ? ",\n " : ","; + seplen = use_line_feeds ? strlen(",\n ") : strlen(","); td = DatumGetHeapTupleHeader(composite); @@ -650,7 +556,7 @@ composite_to_json(Datum composite, StringInfo result, bool use_line_feeds) continue; if (needsep) - appendStringInfoString(result, sep); + appendBinaryStringInfo(result, sep, seplen); needsep = true; attname = NameStr(att->attname); @@ -665,9 +571,11 @@ composite_to_json(Datum composite, StringInfo result, bool use_line_feeds) outfuncoid = InvalidOid; } else - json_categorize_type(att->atttypid, &tcategory, &outfuncoid); + json_categorize_type(att->atttypid, false, &tcategory, + &outfuncoid); - datum_to_json(val, isnull, result, tcategory, outfuncoid, false); + datum_to_json_internal(val, isnull, result, tcategory, outfuncoid, + false); } appendStringInfoChar(result, '}'); @@ -699,10 +607,11 @@ add_json(Datum val, bool is_null, StringInfo result, outfuncoid = InvalidOid; } else - json_categorize_type(val_type, + json_categorize_type(val_type, false, &tcategory, &outfuncoid); - datum_to_json(val, is_null, result, tcategory, outfuncoid, key_scalar); + datum_to_json_internal(val, is_null, result, tcategory, outfuncoid, + key_scalar); } /* @@ -784,12 +693,13 @@ to_json_is_immutable(Oid typoid) JsonTypeCategory tcategory; Oid outfuncoid; - json_categorize_type(typoid, &tcategory, &outfuncoid); + json_categorize_type(typoid, false, &tcategory, &outfuncoid); switch (tcategory) { case JSONTYPE_BOOL: case JSONTYPE_JSON: + case JSONTYPE_JSONB: case JSONTYPE_NULL: return true; @@ -821,7 +731,6 @@ to_json(PG_FUNCTION_ARGS) { Datum val = PG_GETARG_DATUM(0); Oid val_type = get_fn_expr_argtype(fcinfo->flinfo, 0); - StringInfo result; JsonTypeCategory tcategory; Oid outfuncoid; @@ -830,14 +739,26 @@ to_json(PG_FUNCTION_ARGS) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("could not determine input data type"))); - json_categorize_type(val_type, + json_categorize_type(val_type, false, &tcategory, &outfuncoid); - result = makeStringInfo(); + PG_RETURN_DATUM(datum_to_json(val, tcategory, outfuncoid)); +} - datum_to_json(val, false, result, tcategory, outfuncoid, false); +/* + * Turn a Datum into JSON text. + * + * tcategory and outfuncoid are from a previous call to json_categorize_type. + */ +Datum +datum_to_json(Datum val, JsonTypeCategory tcategory, Oid outfuncoid) +{ + StringInfo result = makeStringInfo(); - PG_RETURN_TEXT_P(cstring_to_text_with_len(result->data, result->len)); + datum_to_json_internal(val, false, result, tcategory, outfuncoid, + false); + + return PointerGetDatum(cstring_to_text_with_len(result->data, result->len)); } /* @@ -880,7 +801,7 @@ json_agg_transfn_worker(FunctionCallInfo fcinfo, bool absent_on_null) MemoryContextSwitchTo(oldcontext); appendStringInfoChar(state->str, '['); - json_categorize_type(arg_type, &state->val_category, + json_categorize_type(arg_type, false, &state->val_category, &state->val_output_func); } else @@ -897,8 +818,8 @@ json_agg_transfn_worker(FunctionCallInfo fcinfo, bool absent_on_null) /* fast path for NULLs */ if (PG_ARGISNULL(1)) { - datum_to_json((Datum) 0, true, state->str, JSONTYPE_NULL, - InvalidOid, false); + datum_to_json_internal((Datum) 0, true, state->str, JSONTYPE_NULL, + InvalidOid, false); PG_RETURN_POINTER(state); } @@ -912,8 +833,8 @@ json_agg_transfn_worker(FunctionCallInfo fcinfo, bool absent_on_null) appendStringInfoString(state->str, "\n "); } - datum_to_json(val, false, state->str, state->val_category, - state->val_output_func, false); + datum_to_json_internal(val, false, state->str, state->val_category, + state->val_output_func, false); /* * The transition type for json_agg() is declared to be "internal", which @@ -1112,7 +1033,7 @@ json_object_agg_transfn_worker(FunctionCallInfo fcinfo, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("could not determine data type for argument %d", 1))); - json_categorize_type(arg_type, &state->key_category, + json_categorize_type(arg_type, false, &state->key_category, &state->key_output_func); arg_type = get_fn_expr_argtype(fcinfo->flinfo, 2); @@ -1122,7 +1043,7 @@ json_object_agg_transfn_worker(FunctionCallInfo fcinfo, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("could not determine data type for argument %d", 2))); - json_categorize_type(arg_type, &state->val_category, + json_categorize_type(arg_type, false, &state->val_category, &state->val_output_func); appendStringInfoString(state->str, "{ "); @@ -1176,17 +1097,24 @@ json_object_agg_transfn_worker(FunctionCallInfo fcinfo, key_offset = out->len; - datum_to_json(arg, false, out, state->key_category, - state->key_output_func, true); + datum_to_json_internal(arg, false, out, state->key_category, + state->key_output_func, true); if (unique_keys) { - const char *key = &out->data[key_offset]; + /* + * Copy the key first, instead of pointing into the buffer. It will be + * added to the hash table, but the buffer may get reallocated as + * we're appending more data to it. That would invalidate pointers to + * keys in the current buffer. + */ + const char *key = MemoryContextStrdup(aggcontext, + &out->data[key_offset]); if (!json_unique_check_key(&state->unique_check.check, key, 0)) ereport(ERROR, errcode(ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE), - errmsg("duplicate JSON key %s", key)); + errmsg("duplicate JSON object key value: %s", key)); if (skip) PG_RETURN_POINTER(state); @@ -1199,8 +1127,9 @@ json_object_agg_transfn_worker(FunctionCallInfo fcinfo, else arg = PG_GETARG_DATUM(2); - datum_to_json(arg, PG_ARGISNULL(2), state->str, state->val_category, - state->val_output_func, false); + datum_to_json_internal(arg, PG_ARGISNULL(2), state->str, + state->val_category, + state->val_output_func, false); PG_RETURN_POINTER(state); } @@ -1283,7 +1212,7 @@ catenate_stringinfo_string(StringInfo buffer, const char *addon) } Datum -json_build_object_worker(int nargs, Datum *args, bool *nulls, Oid *types, +json_build_object_worker(int nargs, const Datum *args, const bool *nulls, const Oid *types, bool absent_on_null, bool unique_keys) { int i; @@ -1343,13 +1272,20 @@ json_build_object_worker(int nargs, Datum *args, bool *nulls, Oid *types, if (unique_keys) { - /* check key uniqueness after key appending */ - const char *key = &out->data[key_offset]; + /* + * check key uniqueness after key appending + * + * Copy the key first, instead of pointing into the buffer. It + * will be added to the hash table, but the buffer may get + * reallocated as we're appending more data to it. That would + * invalidate pointers to keys in the current buffer. + */ + const char *key = pstrdup(&out->data[key_offset]); if (!json_unique_check_key(&unique_check.check, key, 0)) ereport(ERROR, errcode(ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE), - errmsg("duplicate JSON key %s", key)); + errmsg("duplicate JSON object key value: %s", key)); if (skip) continue; @@ -1396,7 +1332,7 @@ json_build_object_noargs(PG_FUNCTION_ARGS) } Datum -json_build_array_worker(int nargs, Datum *args, bool *nulls, Oid *types, +json_build_array_worker(int nargs, const Datum *args, const bool *nulls, const Oid *types, bool absent_on_null) { int i; @@ -1727,14 +1663,16 @@ json_unique_object_field_start(void *_state, char *field, bool isnull) bool json_validate(text *json, bool check_unique_keys, bool throw_error) { - JsonLexContext *lex = makeJsonLexContext(json, check_unique_keys); + JsonLexContext lex; JsonSemAction uniqueSemAction = {0}; JsonUniqueParsingState state; JsonParseErrorType result; + makeJsonLexContext(&lex, json, check_unique_keys); + if (check_unique_keys) { - state.lex = lex; + state.lex = &lex; state.stack = NULL; state.id_counter = 0; state.unique = true; @@ -1746,12 +1684,12 @@ json_validate(text *json, bool check_unique_keys, bool throw_error) uniqueSemAction.object_end = json_unique_object_end; } - result = pg_parse_json(lex, check_unique_keys ? &uniqueSemAction : &nullSemAction); + result = pg_parse_json(&lex, check_unique_keys ? &uniqueSemAction : &nullSemAction); if (result != JSON_SUCCESS) { if (throw_error) - json_errsave_error(result, lex, NULL); + json_errsave_error(result, &lex, NULL); return false; /* invalid json */ } @@ -1766,6 +1704,9 @@ json_validate(text *json, bool check_unique_keys, bool throw_error) return false; /* not unique keys */ } + if (check_unique_keys) + freeJsonLexContext(&lex); + return true; /* ok */ } @@ -1785,18 +1726,17 @@ Datum json_typeof(PG_FUNCTION_ARGS) { text *json = PG_GETARG_TEXT_PP(0); - JsonLexContext *lex = makeJsonLexContext(json, false); + JsonLexContext lex; char *type; - JsonTokenType tok; JsonParseErrorType result; /* Lex exactly one token from the input and check its type. */ - result = json_lex(lex); + makeJsonLexContext(&lex, json, false); + result = json_lex(&lex); if (result != JSON_SUCCESS) - json_errsave_error(result, lex, NULL); - tok = lex->token_type; + json_errsave_error(result, &lex, NULL); - switch (tok) + switch (lex.token_type) { case JSON_TOKEN_OBJECT_START: type = "object"; @@ -1818,7 +1758,7 @@ json_typeof(PG_FUNCTION_ARGS) type = "null"; break; default: - elog(ERROR, "unexpected json token: %d", tok); + elog(ERROR, "unexpected json token: %d", lex.token_type); } PG_RETURN_TEXT_P(cstring_to_text(type)); diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c index cf43c3f2ded19..b6110abaa52fe 100644 --- a/src/backend/utils/adt/jsonb.c +++ b/src/backend/utils/adt/jsonb.c @@ -3,7 +3,7 @@ * jsonb.c * I/O routines for jsonb type * - * Copyright (c) 2014-2023, PostgreSQL Global Development Group + * Copyright (c) 2014-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/jsonb.c @@ -13,57 +13,37 @@ #include "postgres.h" #include "access/htup_details.h" -#include "access/transam.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" #include "funcapi.h" #include "libpq/pqformat.h" #include "miscadmin.h" -#include "parser/parse_coerce.h" #include "utils/builtins.h" -#include "utils/date.h" -#include "utils/datetime.h" #include "utils/json.h" #include "utils/jsonb.h" #include "utils/jsonfuncs.h" #include "utils/lsyscache.h" -#include "utils/syscache.h" #include "utils/typcache.h" typedef struct JsonbInState { JsonbParseState *parseState; JsonbValue *res; + bool unique_keys; Node *escontext; } JsonbInState; -/* unlike with json categories, we need to treat json and jsonb differently */ -typedef enum /* type categories for datum_to_jsonb */ -{ - JSONBTYPE_NULL, /* null, so we didn't bother to identify */ - JSONBTYPE_BOOL, /* boolean (built-in types only) */ - JSONBTYPE_NUMERIC, /* numeric (ditto) */ - JSONBTYPE_DATE, /* we use special formatting for datetimes */ - JSONBTYPE_TIMESTAMP, /* we use special formatting for timestamp */ - JSONBTYPE_TIMESTAMPTZ, /* ... and timestamptz */ - JSONBTYPE_JSON, /* JSON */ - JSONBTYPE_JSONB, /* JSONB */ - JSONBTYPE_ARRAY, /* array */ - JSONBTYPE_COMPOSITE, /* composite */ - JSONBTYPE_JSONCAST, /* something with an explicit cast to JSON */ - JSONBTYPE_OTHER /* all else */ -} JsonbTypeCategory; - typedef struct JsonbAggState { JsonbInState *res; - JsonbTypeCategory key_category; + JsonTypeCategory key_category; Oid key_output_func; - JsonbTypeCategory val_category; + JsonTypeCategory val_category; Oid val_output_func; } JsonbAggState; -static inline Datum jsonb_from_cstring(char *json, int len, Node *escontext); +static inline Datum jsonb_from_cstring(char *json, int len, bool unique_keys, + Node *escontext); static bool checkStringLen(size_t len, Node *escontext); static JsonParseErrorType jsonb_in_object_start(void *pstate); static JsonParseErrorType jsonb_in_object_end(void *pstate); @@ -72,20 +52,14 @@ static JsonParseErrorType jsonb_in_array_end(void *pstate); static JsonParseErrorType jsonb_in_object_field_start(void *pstate, char *fname, bool isnull); static void jsonb_put_escaped_value(StringInfo out, JsonbValue *scalarVal); static JsonParseErrorType jsonb_in_scalar(void *pstate, char *token, JsonTokenType tokentype); -static void jsonb_categorize_type(Oid typoid, - JsonbTypeCategory *tcategory, - Oid *outfuncoid); static void composite_to_jsonb(Datum composite, JsonbInState *result); static void array_dim_to_jsonb(JsonbInState *result, int dim, int ndims, int *dims, - Datum *vals, bool *nulls, int *valcount, - JsonbTypeCategory tcategory, Oid outfuncoid); + const Datum *vals, const bool *nulls, int *valcount, + JsonTypeCategory tcategory, Oid outfuncoid); static void array_to_jsonb_internal(Datum array, JsonbInState *result); -static void jsonb_categorize_type(Oid typoid, - JsonbTypeCategory *tcategory, - Oid *outfuncoid); -static void datum_to_jsonb(Datum val, bool is_null, JsonbInState *result, - JsonbTypeCategory tcategory, Oid outfuncoid, - bool key_scalar); +static void datum_to_jsonb_internal(Datum val, bool is_null, JsonbInState *result, + JsonTypeCategory tcategory, Oid outfuncoid, + bool key_scalar); static void add_jsonb(Datum val, bool is_null, JsonbInState *result, Oid val_type, bool key_scalar); static JsonbParseState *clone_parse_state(JsonbParseState *state); @@ -100,7 +74,7 @@ jsonb_in(PG_FUNCTION_ARGS) { char *json = PG_GETARG_CSTRING(0); - return jsonb_from_cstring(json, strlen(json), fcinfo->context); + return jsonb_from_cstring(json, strlen(json), false, fcinfo->context); } /* @@ -124,7 +98,7 @@ jsonb_recv(PG_FUNCTION_ARGS) else elog(ERROR, "unsupported jsonb version number %d", version); - return jsonb_from_cstring(str, nbytes, NULL); + return jsonb_from_cstring(str, nbytes, false, NULL); } /* @@ -159,12 +133,25 @@ jsonb_send(PG_FUNCTION_ARGS) pq_begintypsend(&buf); pq_sendint8(&buf, version); pq_sendtext(&buf, jtext->data, jtext->len); - pfree(jtext->data); - pfree(jtext); + destroyStringInfo(jtext); PG_RETURN_BYTEA_P(pq_endtypsend(&buf)); } +/* + * jsonb_from_text + * + * Turns json text string into a jsonb Datum. + */ +Datum +jsonb_from_text(text *js, bool unique_keys) +{ + return jsonb_from_cstring(VARDATA_ANY(js), + VARSIZE_ANY_EXHDR(js), + unique_keys, + NULL); +} + /* * Get the type name of a jsonb container. */ @@ -258,16 +245,17 @@ jsonb_typeof(PG_FUNCTION_ARGS) * instead of being thrown. */ static inline Datum -jsonb_from_cstring(char *json, int len, Node *escontext) +jsonb_from_cstring(char *json, int len, bool unique_keys, Node *escontext) { - JsonLexContext *lex; + JsonLexContext lex; JsonbInState state; JsonSemAction sem; memset(&state, 0, sizeof(state)); memset(&sem, 0, sizeof(sem)); - lex = makeJsonLexContextCstringLen(json, len, GetDatabaseEncoding(), true); + makeJsonLexContextCstringLen(&lex, json, len, GetDatabaseEncoding(), true); + state.unique_keys = unique_keys; state.escontext = escontext; sem.semstate = (void *) &state; @@ -278,7 +266,7 @@ jsonb_from_cstring(char *json, int len, Node *escontext) sem.scalar = jsonb_in_scalar; sem.object_field_start = jsonb_in_object_field_start; - if (!pg_parse_json_or_errsave(lex, &sem, escontext)) + if (!pg_parse_json_or_errsave(&lex, &sem, escontext)) return (Datum) 0; /* after parsing, the item member has the composed jsonb structure */ @@ -304,6 +292,7 @@ jsonb_in_object_start(void *pstate) JsonbInState *_state = (JsonbInState *) pstate; _state->res = pushJsonbValue(&_state->parseState, WJB_BEGIN_OBJECT, NULL); + _state->parseState->unique_keys = _state->unique_keys; return JSON_SUCCESS; } @@ -633,112 +622,6 @@ add_indent(StringInfo out, bool indent, int level) } -/* - * Determine how we want to render values of a given type in datum_to_jsonb. - * - * Given the datatype OID, return its JsonbTypeCategory, as well as the type's - * output function OID. If the returned category is JSONBTYPE_JSONCAST, - * we return the OID of the relevant cast function instead. - */ -static void -jsonb_categorize_type(Oid typoid, - JsonbTypeCategory *tcategory, - Oid *outfuncoid) -{ - bool typisvarlena; - - /* Look through any domain */ - typoid = getBaseType(typoid); - - *outfuncoid = InvalidOid; - - /* - * We need to get the output function for everything except date and - * timestamp types, booleans, array and composite types, json and jsonb, - * and non-builtin types where there's a cast to json. In this last case - * we return the oid of the cast function instead. - */ - - switch (typoid) - { - case BOOLOID: - *tcategory = JSONBTYPE_BOOL; - break; - - case INT2OID: - case INT4OID: - case INT8OID: - case FLOAT4OID: - case FLOAT8OID: - case NUMERICOID: - getTypeOutputInfo(typoid, outfuncoid, &typisvarlena); - *tcategory = JSONBTYPE_NUMERIC; - break; - - case DATEOID: - *tcategory = JSONBTYPE_DATE; - break; - - case TIMESTAMPOID: - *tcategory = JSONBTYPE_TIMESTAMP; - break; - - case TIMESTAMPTZOID: - *tcategory = JSONBTYPE_TIMESTAMPTZ; - break; - - case JSONBOID: - *tcategory = JSONBTYPE_JSONB; - break; - - case JSONOID: - *tcategory = JSONBTYPE_JSON; - break; - - default: - /* Check for arrays and composites */ - if (OidIsValid(get_element_type(typoid)) || typoid == ANYARRAYOID - || typoid == ANYCOMPATIBLEARRAYOID || typoid == RECORDARRAYOID) - *tcategory = JSONBTYPE_ARRAY; - else if (type_is_rowtype(typoid)) /* includes RECORDOID */ - *tcategory = JSONBTYPE_COMPOSITE; - else - { - /* It's probably the general case ... */ - *tcategory = JSONBTYPE_OTHER; - - /* - * but first let's look for a cast to json (note: not to - * jsonb) if it's not built-in. - */ - if (typoid >= FirstNormalObjectId) - { - Oid castfunc; - CoercionPathType ctype; - - ctype = find_coercion_pathway(JSONOID, typoid, - COERCION_EXPLICIT, &castfunc); - if (ctype == COERCION_PATH_FUNC && OidIsValid(castfunc)) - { - *tcategory = JSONBTYPE_JSONCAST; - *outfuncoid = castfunc; - } - else - { - /* not a cast type, so just get the usual output func */ - getTypeOutputInfo(typoid, outfuncoid, &typisvarlena); - } - } - else - { - /* any other builtin type */ - getTypeOutputInfo(typoid, outfuncoid, &typisvarlena); - } - break; - } - } -} - /* * Turn a Datum into jsonb, adding it to the result JsonbInState. * @@ -752,9 +635,9 @@ jsonb_categorize_type(Oid typoid, * will be thrown. */ static void -datum_to_jsonb(Datum val, bool is_null, JsonbInState *result, - JsonbTypeCategory tcategory, Oid outfuncoid, - bool key_scalar) +datum_to_jsonb_internal(Datum val, bool is_null, JsonbInState *result, + JsonTypeCategory tcategory, Oid outfuncoid, + bool key_scalar) { char *outputstr; bool numeric_error; @@ -770,11 +653,11 @@ datum_to_jsonb(Datum val, bool is_null, JsonbInState *result, jb.type = jbvNull; } else if (key_scalar && - (tcategory == JSONBTYPE_ARRAY || - tcategory == JSONBTYPE_COMPOSITE || - tcategory == JSONBTYPE_JSON || - tcategory == JSONBTYPE_JSONB || - tcategory == JSONBTYPE_JSONCAST)) + (tcategory == JSONTYPE_ARRAY || + tcategory == JSONTYPE_COMPOSITE || + tcategory == JSONTYPE_JSON || + tcategory == JSONTYPE_JSONB || + tcategory == JSONTYPE_CAST)) { ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -782,18 +665,18 @@ datum_to_jsonb(Datum val, bool is_null, JsonbInState *result, } else { - if (tcategory == JSONBTYPE_JSONCAST) + if (tcategory == JSONTYPE_CAST) val = OidFunctionCall1(outfuncoid, val); switch (tcategory) { - case JSONBTYPE_ARRAY: + case JSONTYPE_ARRAY: array_to_jsonb_internal(val, result); break; - case JSONBTYPE_COMPOSITE: + case JSONTYPE_COMPOSITE: composite_to_jsonb(val, result); break; - case JSONBTYPE_BOOL: + case JSONTYPE_BOOL: if (key_scalar) { outputstr = DatumGetBool(val) ? "true" : "false"; @@ -807,7 +690,7 @@ datum_to_jsonb(Datum val, bool is_null, JsonbInState *result, jb.val.boolean = DatumGetBool(val); } break; - case JSONBTYPE_NUMERIC: + case JSONTYPE_NUMERIC: outputstr = OidOutputFunctionCall(outfuncoid, val); if (key_scalar) { @@ -845,33 +728,33 @@ datum_to_jsonb(Datum val, bool is_null, JsonbInState *result, } } break; - case JSONBTYPE_DATE: + case JSONTYPE_DATE: jb.type = jbvString; jb.val.string.val = JsonEncodeDateTime(NULL, val, DATEOID, NULL); jb.val.string.len = strlen(jb.val.string.val); break; - case JSONBTYPE_TIMESTAMP: + case JSONTYPE_TIMESTAMP: jb.type = jbvString; jb.val.string.val = JsonEncodeDateTime(NULL, val, TIMESTAMPOID, NULL); jb.val.string.len = strlen(jb.val.string.val); break; - case JSONBTYPE_TIMESTAMPTZ: + case JSONTYPE_TIMESTAMPTZ: jb.type = jbvString; jb.val.string.val = JsonEncodeDateTime(NULL, val, TIMESTAMPTZOID, NULL); jb.val.string.len = strlen(jb.val.string.val); break; - case JSONBTYPE_JSONCAST: - case JSONBTYPE_JSON: + case JSONTYPE_CAST: + case JSONTYPE_JSON: { /* parse the json right into the existing result object */ - JsonLexContext *lex; + JsonLexContext lex; JsonSemAction sem; text *json = DatumGetTextPP(val); - lex = makeJsonLexContext(json, true); + makeJsonLexContext(&lex, json, true); memset(&sem, 0, sizeof(sem)); @@ -884,10 +767,11 @@ datum_to_jsonb(Datum val, bool is_null, JsonbInState *result, sem.scalar = jsonb_in_scalar; sem.object_field_start = jsonb_in_object_field_start; - pg_parse_json_or_ereport(lex, &sem); + pg_parse_json_or_ereport(&lex, &sem); + freeJsonLexContext(&lex); } break; - case JSONBTYPE_JSONB: + case JSONTYPE_JSONB: { Jsonb *jsonb = DatumGetJsonbP(val); JsonbIterator *it; @@ -931,7 +815,7 @@ datum_to_jsonb(Datum val, bool is_null, JsonbInState *result, /* Now insert jb into result, unless we did it recursively */ if (!is_null && !scalar_jsonb && - tcategory >= JSONBTYPE_JSON && tcategory <= JSONBTYPE_JSONCAST) + tcategory >= JSONTYPE_JSON && tcategory <= JSONTYPE_CAST) { /* work has been done recursively */ return; @@ -975,8 +859,8 @@ datum_to_jsonb(Datum val, bool is_null, JsonbInState *result, * ourselves recursively to process the next dimension. */ static void -array_dim_to_jsonb(JsonbInState *result, int dim, int ndims, int *dims, Datum *vals, - bool *nulls, int *valcount, JsonbTypeCategory tcategory, +array_dim_to_jsonb(JsonbInState *result, int dim, int ndims, int *dims, const Datum *vals, + const bool *nulls, int *valcount, JsonTypeCategory tcategory, Oid outfuncoid) { int i; @@ -989,8 +873,8 @@ array_dim_to_jsonb(JsonbInState *result, int dim, int ndims, int *dims, Datum *v { if (dim + 1 == ndims) { - datum_to_jsonb(vals[*valcount], nulls[*valcount], result, tcategory, - outfuncoid, false); + datum_to_jsonb_internal(vals[*valcount], nulls[*valcount], result, tcategory, + outfuncoid, false); (*valcount)++; } else @@ -1020,7 +904,7 @@ array_to_jsonb_internal(Datum array, JsonbInState *result) int16 typlen; bool typbyval; char typalign; - JsonbTypeCategory tcategory; + JsonTypeCategory tcategory; Oid outfuncoid; ndim = ARR_NDIM(v); @@ -1037,8 +921,8 @@ array_to_jsonb_internal(Datum array, JsonbInState *result) get_typlenbyvalalign(element_type, &typlen, &typbyval, &typalign); - jsonb_categorize_type(element_type, - &tcategory, &outfuncoid); + json_categorize_type(element_type, true, + &tcategory, &outfuncoid); deconstruct_array(v, element_type, typlen, typbyval, typalign, &elements, &nulls, @@ -1084,7 +968,7 @@ composite_to_jsonb(Datum composite, JsonbInState *result) Datum val; bool isnull; char *attname; - JsonbTypeCategory tcategory; + JsonTypeCategory tcategory; Oid outfuncoid; JsonbValue v; Form_pg_attribute att = TupleDescAttr(tupdesc, i); @@ -1105,13 +989,15 @@ composite_to_jsonb(Datum composite, JsonbInState *result) if (isnull) { - tcategory = JSONBTYPE_NULL; + tcategory = JSONTYPE_NULL; outfuncoid = InvalidOid; } else - jsonb_categorize_type(att->atttypid, &tcategory, &outfuncoid); + json_categorize_type(att->atttypid, true, &tcategory, + &outfuncoid); - datum_to_jsonb(val, isnull, result, tcategory, outfuncoid, false); + datum_to_jsonb_internal(val, isnull, result, tcategory, outfuncoid, + false); } result->res = pushJsonbValue(&result->parseState, WJB_END_OBJECT, NULL); @@ -1122,7 +1008,7 @@ composite_to_jsonb(Datum composite, JsonbInState *result) * Append JSON text for "val" to "result". * * This is just a thin wrapper around datum_to_jsonb. If the same type will be - * printed many times, avoid using this; better to do the jsonb_categorize_type + * printed many times, avoid using this; better to do the json_categorize_type * lookups only once. */ @@ -1130,7 +1016,7 @@ static void add_jsonb(Datum val, bool is_null, JsonbInState *result, Oid val_type, bool key_scalar) { - JsonbTypeCategory tcategory; + JsonTypeCategory tcategory; Oid outfuncoid; if (val_type == InvalidOid) @@ -1140,16 +1026,18 @@ add_jsonb(Datum val, bool is_null, JsonbInState *result, if (is_null) { - tcategory = JSONBTYPE_NULL; + tcategory = JSONTYPE_NULL; outfuncoid = InvalidOid; } else - jsonb_categorize_type(val_type, - &tcategory, &outfuncoid); + json_categorize_type(val_type, true, + &tcategory, &outfuncoid); - datum_to_jsonb(val, is_null, result, tcategory, outfuncoid, key_scalar); + datum_to_jsonb_internal(val, is_null, result, tcategory, outfuncoid, + key_scalar); } + /* * Is the given type immutable when coming out of a JSONB context? * @@ -1160,33 +1048,33 @@ add_jsonb(Datum val, bool is_null, JsonbInState *result, bool to_jsonb_is_immutable(Oid typoid) { - JsonbTypeCategory tcategory; + JsonTypeCategory tcategory; Oid outfuncoid; - jsonb_categorize_type(typoid, &tcategory, &outfuncoid); + json_categorize_type(typoid, true, &tcategory, &outfuncoid); switch (tcategory) { - case JSONBTYPE_NULL: - case JSONBTYPE_BOOL: - case JSONBTYPE_JSON: - case JSONBTYPE_JSONB: + case JSONTYPE_NULL: + case JSONTYPE_BOOL: + case JSONTYPE_JSON: + case JSONTYPE_JSONB: return true; - case JSONBTYPE_DATE: - case JSONBTYPE_TIMESTAMP: - case JSONBTYPE_TIMESTAMPTZ: + case JSONTYPE_DATE: + case JSONTYPE_TIMESTAMP: + case JSONTYPE_TIMESTAMPTZ: return false; - case JSONBTYPE_ARRAY: + case JSONTYPE_ARRAY: return false; /* TODO recurse into elements */ - case JSONBTYPE_COMPOSITE: + case JSONTYPE_COMPOSITE: return false; /* TODO recurse into fields */ - case JSONBTYPE_NUMERIC: - case JSONBTYPE_JSONCAST: - case JSONBTYPE_OTHER: + case JSONTYPE_NUMERIC: + case JSONTYPE_CAST: + case JSONTYPE_OTHER: return func_volatile(outfuncoid) == PROVOLATILE_IMMUTABLE; } @@ -1201,8 +1089,7 @@ to_jsonb(PG_FUNCTION_ARGS) { Datum val = PG_GETARG_DATUM(0); Oid val_type = get_fn_expr_argtype(fcinfo->flinfo, 0); - JsonbInState result; - JsonbTypeCategory tcategory; + JsonTypeCategory tcategory; Oid outfuncoid; if (val_type == InvalidOid) @@ -1210,18 +1097,32 @@ to_jsonb(PG_FUNCTION_ARGS) (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("could not determine input data type"))); - jsonb_categorize_type(val_type, - &tcategory, &outfuncoid); + json_categorize_type(val_type, true, + &tcategory, &outfuncoid); + + PG_RETURN_DATUM(datum_to_jsonb(val, tcategory, outfuncoid)); +} + +/* + * Turn a Datum into jsonb. + * + * tcategory and outfuncoid are from a previous call to json_categorize_type. + */ +Datum +datum_to_jsonb(Datum val, JsonTypeCategory tcategory, Oid outfuncoid) +{ + JsonbInState result; memset(&result, 0, sizeof(JsonbInState)); - datum_to_jsonb(val, false, &result, tcategory, outfuncoid, false); + datum_to_jsonb_internal(val, false, &result, tcategory, outfuncoid, + false); - PG_RETURN_POINTER(JsonbValueToJsonb(result.res)); + return JsonbPGetDatum(JsonbValueToJsonb(result.res)); } Datum -jsonb_build_object_worker(int nargs, Datum *args, bool *nulls, Oid *types, +jsonb_build_object_worker(int nargs, const Datum *args, const bool *nulls, const Oid *types, bool absent_on_null, bool unique_keys) { int i; @@ -1306,7 +1207,7 @@ jsonb_build_object_noargs(PG_FUNCTION_ARGS) } Datum -jsonb_build_array_worker(int nargs, Datum *args, bool *nulls, Oid *types, +jsonb_build_array_worker(int nargs, const Datum *args, const bool *nulls, const Oid *types, bool absent_on_null) { int i; @@ -1636,8 +1537,8 @@ jsonb_agg_transfn_worker(FunctionCallInfo fcinfo, bool absent_on_null) WJB_BEGIN_ARRAY, NULL); MemoryContextSwitchTo(oldcontext); - jsonb_categorize_type(arg_type, &state->val_category, - &state->val_output_func); + json_categorize_type(arg_type, true, &state->val_category, + &state->val_output_func); } else { @@ -1654,8 +1555,8 @@ jsonb_agg_transfn_worker(FunctionCallInfo fcinfo, bool absent_on_null) memset(&elem, 0, sizeof(JsonbInState)); - datum_to_jsonb(val, PG_ARGISNULL(1), &elem, state->val_category, - state->val_output_func, false); + datum_to_jsonb_internal(val, PG_ARGISNULL(1), &elem, state->val_category, + state->val_output_func, false); jbelem = JsonbValueToJsonb(elem.res); @@ -1816,8 +1717,8 @@ jsonb_object_agg_transfn_worker(FunctionCallInfo fcinfo, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("could not determine input data type"))); - jsonb_categorize_type(arg_type, &state->key_category, - &state->key_output_func); + json_categorize_type(arg_type, true, &state->key_category, + &state->key_output_func); arg_type = get_fn_expr_argtype(fcinfo->flinfo, 2); @@ -1826,8 +1727,8 @@ jsonb_object_agg_transfn_worker(FunctionCallInfo fcinfo, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("could not determine input data type"))); - jsonb_categorize_type(arg_type, &state->val_category, - &state->val_output_func); + json_categorize_type(arg_type, true, &state->val_category, + &state->val_output_func); } else { @@ -1855,8 +1756,8 @@ jsonb_object_agg_transfn_worker(FunctionCallInfo fcinfo, memset(&elem, 0, sizeof(JsonbInState)); - datum_to_jsonb(val, false, &elem, state->key_category, - state->key_output_func, true); + datum_to_jsonb_internal(val, false, &elem, state->key_category, + state->key_output_func, true); jbkey = JsonbValueToJsonb(elem.res); @@ -1864,8 +1765,8 @@ jsonb_object_agg_transfn_worker(FunctionCallInfo fcinfo, memset(&elem, 0, sizeof(JsonbInState)); - datum_to_jsonb(val, PG_ARGISNULL(2), &elem, state->val_category, - state->val_output_func, false); + datum_to_jsonb_internal(val, PG_ARGISNULL(2), &elem, state->val_category, + state->val_output_func, false); jbval = JsonbValueToJsonb(elem.res); @@ -2257,3 +2158,34 @@ jsonb_float8(PG_FUNCTION_ARGS) PG_RETURN_DATUM(retValue); } + +/* + * Convert jsonb to a C-string stripping quotes from scalar strings. + */ +char * +JsonbUnquote(Jsonb *jb) +{ + if (JB_ROOT_IS_SCALAR(jb)) + { + JsonbValue v; + + (void) JsonbExtractScalar(&jb->root, &v); + + if (v.type == jbvString) + return pnstrdup(v.val.string.val, v.val.string.len); + else if (v.type == jbvBool) + return pstrdup(v.val.boolean ? "true" : "false"); + else if (v.type == jbvNumeric) + return DatumGetCString(DirectFunctionCall1(numeric_out, + PointerGetDatum(v.val.numeric))); + else if (v.type == jbvNull) + return pstrdup("null"); + else + { + elog(ERROR, "unrecognized jsonb value type %d", v.type); + return NULL; + } + } + else + return JsonbToCString(NULL, &jb->root, VARSIZE(jb)); +} diff --git a/src/backend/utils/adt/jsonb_gin.c b/src/backend/utils/adt/jsonb_gin.c index e941439d74933..b03d94f82b8e2 100644 --- a/src/backend/utils/adt/jsonb_gin.c +++ b/src/backend/utils/adt/jsonb_gin.c @@ -3,7 +3,7 @@ * jsonb_gin.c * GIN support functions for jsonb * - * Copyright (c) 2014-2023, PostgreSQL Global Development Group + * Copyright (c) 2014-2024, PostgreSQL Global Development Group * * We provide two opclasses for jsonb indexing: jsonb_ops and jsonb_path_ops. * For their description see json.sgml and comments in jsonb.h. @@ -65,7 +65,7 @@ #include "catalog/pg_type.h" #include "common/hashfn.h" #include "miscadmin.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/jsonb.h" #include "utils/jsonpath.h" #include "utils/varlena.h" @@ -88,7 +88,7 @@ typedef enum JsonPathGinNodeType { JSP_GIN_OR, JSP_GIN_AND, - JSP_GIN_ENTRY + JSP_GIN_ENTRY, } JsonPathGinNodeType; typedef struct JsonPathGinNode JsonPathGinNode; diff --git a/src/backend/utils/adt/jsonb_op.c b/src/backend/utils/adt/jsonb_op.c index 054351f0a31e7..da0d13992ca0a 100644 --- a/src/backend/utils/adt/jsonb_op.c +++ b/src/backend/utils/adt/jsonb_op.c @@ -3,7 +3,7 @@ * jsonb_op.c * Special operators for jsonb only, used by various index access methods * - * Copyright (c) 2014-2023, PostgreSQL Global Development Group + * Copyright (c) 2014-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -14,8 +14,7 @@ #include "postgres.h" #include "catalog/pg_type.h" -#include "miscadmin.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/jsonb.h" Datum diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c index eefa429b9c35c..9941daad2bc0b 100644 --- a/src/backend/utils/adt/jsonb_util.c +++ b/src/backend/utils/adt/jsonb_util.c @@ -3,7 +3,7 @@ * jsonb_util.c * converting between Jsonb and JsonbValues, and iterating. * - * Copyright (c) 2014-2023, PostgreSQL Global Development Group + * Copyright (c) 2014-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -14,13 +14,11 @@ #include "postgres.h" #include "catalog/pg_collation.h" -#include "catalog/pg_type.h" #include "common/hashfn.h" -#include "common/jsonapi.h" #include "miscadmin.h" #include "port/pg_bitutils.h" -#include "utils/builtins.h" #include "utils/datetime.h" +#include "utils/fmgrprotos.h" #include "utils/json.h" #include "utils/jsonb.h" #include "utils/memutils.h" @@ -1955,7 +1953,7 @@ uniqueifyJsonbObject(JsonbValue *object, bool unique_keys, bool skip_nulls) if (hasNonUniq && unique_keys) ereport(ERROR, errcode(ERRCODE_DUPLICATE_JSON_OBJECT_KEY_VALUE), - errmsg("duplicate JSON object key")); + errmsg("duplicate JSON object key value")); if (hasNonUniq || skip_nulls) { diff --git a/src/backend/utils/adt/jsonbsubs.c b/src/backend/utils/adt/jsonbsubs.c index de0ae3604ffbf..2b037131c9115 100644 --- a/src/backend/utils/adt/jsonbsubs.c +++ b/src/backend/utils/adt/jsonbsubs.c @@ -3,7 +3,7 @@ * jsonbsubs.c * Subscripting support functions for jsonb. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -15,15 +15,12 @@ #include "postgres.h" #include "executor/execExpr.h" -#include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "nodes/subscripting.h" #include "parser/parse_coerce.h" #include "parser/parse_expr.h" -#include "utils/jsonb.h" -#include "utils/jsonfuncs.h" #include "utils/builtins.h" -#include "utils/lsyscache.h" +#include "utils/jsonb.h" /* SubscriptingRefState.workspace for jsonb subscripting execution */ diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index 70cb922e6b7aa..1b681eff5f1c0 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -3,7 +3,7 @@ * jsonfuncs.c * Functions to process JSON data types. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -26,6 +26,7 @@ #include "mb/pg_wchar.h" #include "miscadmin.h" #include "nodes/miscnodes.h" +#include "parser/parse_coerce.h" #include "utils/array.h" #include "utils/builtins.h" #include "utils/fmgroids.h" @@ -85,7 +86,7 @@ typedef struct GetState { JsonLexContext *lex; text *tresult; - char *result_start; + const char *result_start; bool normalize_results; bool next_scalar; int npath; /* length of each path-related array */ @@ -110,7 +111,7 @@ typedef struct EachState Tuplestorestate *tuple_store; TupleDesc ret_tdesc; MemoryContext tmp_cxt; - char *result_start; + const char *result_start; bool normalize_results; bool next_scalar; char *normalized_scalar; @@ -124,7 +125,7 @@ typedef struct ElementsState Tuplestorestate *tuple_store; TupleDesc ret_tdesc; MemoryContext tmp_cxt; - char *result_start; + const char *result_start; bool normalize_results; bool next_scalar; char *normalized_scalar; @@ -137,7 +138,7 @@ typedef struct JHashState const char *function_name; HTAB *hash; char *saved_scalar; - char *save_json_start; + const char *save_json_start; JsonTokenType saved_token_type; } JHashState; @@ -200,7 +201,7 @@ typedef enum TypeCat TYPECAT_ARRAY = 'a', TYPECAT_COMPOSITE = 'c', TYPECAT_COMPOSITE_DOMAIN = 'C', - TYPECAT_DOMAIN = 'd' + TYPECAT_DOMAIN = 'd', } TypeCat; /* these two are stolen from hstore / record_out, used in populate_record* */ @@ -246,7 +247,7 @@ typedef struct PopulateRecordsetState const char *function_name; HTAB *json_hash; char *saved_scalar; - char *save_json_start; + const char *save_json_start; JsonTokenType saved_token_type; Tuplestorestate *tuple_store; HeapTupleHeader rec; @@ -264,6 +265,7 @@ typedef struct PopulateArrayContext int *dims; /* dimensions */ int *sizes; /* current dimension counters */ int ndims; /* number of dimensions */ + Node *escontext; /* For soft-error handling */ } PopulateArrayContext; /* state for populate_array_json() */ @@ -271,7 +273,7 @@ typedef struct PopulateArrayState { JsonLexContext *lex; /* json lexer */ PopulateArrayContext *ctx; /* context */ - char *element_start; /* start of the current array element */ + const char *element_start; /* start of the current array element */ char *element_scalar; /* current array element token if it is a * scalar */ JsonTokenType element_type; /* current array element type */ @@ -293,7 +295,7 @@ typedef struct JsValue { struct { - char *str; /* json string */ + const char *str; /* json string */ int len; /* json string length or -1 if null-terminated */ JsonTokenType type; /* json type */ } json; /* json value */ @@ -388,7 +390,8 @@ static JsonParseErrorType elements_array_element_end(void *state, bool isnull); static JsonParseErrorType elements_scalar(void *state, char *token, JsonTokenType tokentype); /* turn a json object into a hash table */ -static HTAB *get_json_object_as_hash(char *json, int len, const char *funcname); +static HTAB *get_json_object_as_hash(const char *json, int len, const char *funcname, + Node *escontext); /* semantic actions for populate_array_json */ static JsonParseErrorType populate_array_object_start(void *_state); @@ -425,42 +428,49 @@ static JsonParseErrorType sn_scalar(void *state, char *token, JsonTokenType toke static Datum populate_recordset_worker(FunctionCallInfo fcinfo, const char *funcname, bool is_json, bool have_record_arg); static Datum populate_record_worker(FunctionCallInfo fcinfo, const char *funcname, - bool is_json, bool have_record_arg); + bool is_json, bool have_record_arg, + Node *escontext); /* helper functions for populate_record[set] */ static HeapTupleHeader populate_record(TupleDesc tupdesc, RecordIOData **record_p, HeapTupleHeader defaultval, MemoryContext mcxt, - JsObject *obj); + JsObject *obj, Node *escontext); static void get_record_type_from_argument(FunctionCallInfo fcinfo, const char *funcname, PopulateRecordCache *cache); static void get_record_type_from_query(FunctionCallInfo fcinfo, const char *funcname, PopulateRecordCache *cache); -static void JsValueToJsObject(JsValue *jsv, JsObject *jso); +static bool JsValueToJsObject(JsValue *jsv, JsObject *jso, Node *escontext); static Datum populate_composite(CompositeIOData *io, Oid typid, const char *colname, MemoryContext mcxt, - HeapTupleHeader defaultval, JsValue *jsv, bool isnull); -static Datum populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv); + HeapTupleHeader defaultval, JsValue *jsv, bool *isnull, + Node *escontext); +static Datum populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv, + bool *isnull, Node *escontext, bool omit_quotes); static void prepare_column_cache(ColumnIOData *column, Oid typid, int32 typmod, MemoryContext mcxt, bool need_scalar); static Datum populate_record_field(ColumnIOData *col, Oid typid, int32 typmod, const char *colname, MemoryContext mcxt, Datum defaultval, - JsValue *jsv, bool *isnull); + JsValue *jsv, bool *isnull, Node *escontext, + bool omit_scalar_quotes); static RecordIOData *allocate_record_info(MemoryContext mcxt, int ncolumns); static bool JsObjectGetField(JsObject *obj, char *field, JsValue *jsv); static void populate_recordset_record(PopulateRecordsetState *state, JsObject *obj); -static void populate_array_json(PopulateArrayContext *ctx, char *json, int len); -static void populate_array_dim_jsonb(PopulateArrayContext *ctx, JsonbValue *jbv, +static bool populate_array_json(PopulateArrayContext *ctx, const char *json, int len); +static bool populate_array_dim_jsonb(PopulateArrayContext *ctx, JsonbValue *jbv, int ndim); static void populate_array_report_expected_array(PopulateArrayContext *ctx, int ndim); -static void populate_array_assign_ndims(PopulateArrayContext *ctx, int ndims); -static void populate_array_check_dimension(PopulateArrayContext *ctx, int ndim); -static void populate_array_element(PopulateArrayContext *ctx, int ndim, JsValue *jsv); +static bool populate_array_assign_ndims(PopulateArrayContext *ctx, int ndims); +static bool populate_array_check_dimension(PopulateArrayContext *ctx, int ndim); +static bool populate_array_element(PopulateArrayContext *ctx, int ndim, JsValue *jsv); static Datum populate_array(ArrayIOData *aio, const char *colname, - MemoryContext mcxt, JsValue *jsv); + MemoryContext mcxt, JsValue *jsv, + bool *isnull, + Node *escontext); static Datum populate_domain(DomainIOData *io, Oid typid, const char *colname, - MemoryContext mcxt, JsValue *jsv, bool isnull); + MemoryContext mcxt, JsValue *jsv, bool *isnull, + Node *escontext, bool omit_quotes); /* functions supporting jsonb_delete, jsonb_set and jsonb_concat */ static JsonbValue *IteratorConcat(JsonbIterator **it1, JsonbIterator **it2, @@ -525,7 +535,7 @@ pg_parse_json_or_errsave(JsonLexContext *lex, JsonSemAction *sem, * directly. */ JsonLexContext * -makeJsonLexContext(text *json, bool need_escapes) +makeJsonLexContext(JsonLexContext *lex, text *json, bool need_escapes) { /* * Most callers pass a detoasted datum, but it's not clear that they all @@ -533,7 +543,8 @@ makeJsonLexContext(text *json, bool need_escapes) */ json = pg_detoast_datum_packed(json); - return makeJsonLexContextCstringLen(VARDATA_ANY(json), + return makeJsonLexContextCstringLen(lex, + VARDATA_ANY(json), VARSIZE_ANY_EXHDR(json), GetDatabaseEncoding(), need_escapes); @@ -724,7 +735,7 @@ json_object_keys(PG_FUNCTION_ARGS) if (SRF_IS_FIRSTCALL()) { text *json = PG_GETARG_TEXT_PP(0); - JsonLexContext *lex = makeJsonLexContext(json, true); + JsonLexContext lex; JsonSemAction *sem; MemoryContext oldcontext; @@ -734,7 +745,7 @@ json_object_keys(PG_FUNCTION_ARGS) state = palloc(sizeof(OkeysState)); sem = palloc0(sizeof(JsonSemAction)); - state->lex = lex; + state->lex = makeJsonLexContext(&lex, json, true); state->result_size = 256; state->result_count = 0; state->sent_count = 0; @@ -746,12 +757,10 @@ json_object_keys(PG_FUNCTION_ARGS) sem->object_field_start = okeys_object_field_start; /* remainder are all NULL, courtesy of palloc0 above */ - pg_parse_json_or_ereport(lex, sem); + pg_parse_json_or_ereport(&lex, sem); /* keys are now in state->result */ - pfree(lex->strval->data); - pfree(lex->strval); - pfree(lex); + freeJsonLexContext(&lex); pfree(sem); MemoryContextSwitchTo(oldcontext); @@ -1095,13 +1104,13 @@ get_worker(text *json, int npath, bool normalize_results) { - JsonLexContext *lex = makeJsonLexContext(json, true); JsonSemAction *sem = palloc0(sizeof(JsonSemAction)); GetState *state = palloc0(sizeof(GetState)); Assert(npath >= 0); - state->lex = lex; + state->lex = makeJsonLexContext(NULL, json, true); + /* is it "_as_text" variant? */ state->normalize_results = normalize_results; state->npath = npath; @@ -1139,7 +1148,8 @@ get_worker(text *json, sem->array_element_end = get_array_element_end; } - pg_parse_json_or_ereport(lex, sem); + pg_parse_json_or_ereport(state->lex, sem); + freeJsonLexContext(state->lex); return state->tresult; } @@ -1172,7 +1182,7 @@ get_object_end(void *state) if (lex_level == 0 && _state->npath == 0) { /* Special case: return the entire object */ - char *start = _state->result_start; + const char *start = _state->result_start; int len = _state->lex->prev_token_terminator - start; _state->tresult = cstring_to_text_with_len(start, len); @@ -1266,7 +1276,7 @@ get_object_field_end(void *state, char *fname, bool isnull) _state->tresult = (text *) NULL; else { - char *start = _state->result_start; + const char *start = _state->result_start; int len = _state->lex->prev_token_terminator - start; _state->tresult = cstring_to_text_with_len(start, len); @@ -1328,7 +1338,7 @@ get_array_end(void *state) if (lex_level == 0 && _state->npath == 0) { /* Special case: return the entire array */ - char *start = _state->result_start; + const char *start = _state->result_start; int len = _state->lex->prev_token_terminator - start; _state->tresult = cstring_to_text_with_len(start, len); @@ -1417,7 +1427,7 @@ get_array_element_end(void *state, bool isnull) _state->tresult = (text *) NULL; else { - char *start = _state->result_start; + const char *start = _state->result_start; int len = _state->lex->prev_token_terminator - start; _state->tresult = cstring_to_text_with_len(start, len); @@ -1454,7 +1464,7 @@ get_scalar(void *state, char *token, JsonTokenType tokentype) * scalar token, but not whitespace before it. Probably not worth * doing our own space-skipping to avoid that. */ - char *start = _state->lex->input; + const char *start = _state->lex->input; int len = _state->lex->prev_token_terminator - start; _state->tresult = cstring_to_text_with_len(start, len); @@ -1841,25 +1851,23 @@ json_array_length(PG_FUNCTION_ARGS) { text *json = PG_GETARG_TEXT_PP(0); AlenState *state; - JsonLexContext *lex; + JsonLexContext lex; JsonSemAction *sem; - lex = makeJsonLexContext(json, false); state = palloc0(sizeof(AlenState)); - sem = palloc0(sizeof(JsonSemAction)); - + state->lex = makeJsonLexContext(&lex, json, false); /* palloc0 does this for us */ #if 0 state->count = 0; #endif - state->lex = lex; + sem = palloc0(sizeof(JsonSemAction)); sem->semstate = (void *) state; sem->object_start = alen_object_start; sem->scalar = alen_scalar; sem->array_element_start = alen_array_element_start; - pg_parse_json_or_ereport(lex, sem); + pg_parse_json_or_ereport(state->lex, sem); PG_RETURN_INT32(state->count); } @@ -2048,12 +2056,11 @@ static Datum each_worker(FunctionCallInfo fcinfo, bool as_text) { text *json = PG_GETARG_TEXT_PP(0); - JsonLexContext *lex; + JsonLexContext lex; JsonSemAction *sem; ReturnSetInfo *rsi; EachState *state; - lex = makeJsonLexContext(json, true); state = palloc0(sizeof(EachState)); sem = palloc0(sizeof(JsonSemAction)); @@ -2071,14 +2078,15 @@ each_worker(FunctionCallInfo fcinfo, bool as_text) state->normalize_results = as_text; state->next_scalar = false; - state->lex = lex; + state->lex = makeJsonLexContext(&lex, json, true); state->tmp_cxt = AllocSetContextCreate(CurrentMemoryContext, "json_each temporary cxt", ALLOCSET_DEFAULT_SIZES); - pg_parse_json_or_ereport(lex, sem); + pg_parse_json_or_ereport(&lex, sem); MemoryContextDelete(state->tmp_cxt); + freeJsonLexContext(&lex); PG_RETURN_NULL(); } @@ -2298,13 +2306,14 @@ static Datum elements_worker(FunctionCallInfo fcinfo, const char *funcname, bool as_text) { text *json = PG_GETARG_TEXT_PP(0); - - /* elements only needs escaped strings when as_text */ - JsonLexContext *lex = makeJsonLexContext(json, as_text); + JsonLexContext lex; JsonSemAction *sem; ReturnSetInfo *rsi; ElementsState *state; + /* elements only needs escaped strings when as_text */ + makeJsonLexContext(&lex, json, as_text); + state = palloc0(sizeof(ElementsState)); sem = palloc0(sizeof(JsonSemAction)); @@ -2322,14 +2331,15 @@ elements_worker(FunctionCallInfo fcinfo, const char *funcname, bool as_text) state->function_name = funcname; state->normalize_results = as_text; state->next_scalar = false; - state->lex = lex; + state->lex = &lex; state->tmp_cxt = AllocSetContextCreate(CurrentMemoryContext, "json_array_elements temporary cxt", ALLOCSET_DEFAULT_SIZES); - pg_parse_json_or_ereport(lex, sem); + pg_parse_json_or_ereport(&lex, sem); MemoryContextDelete(state->tmp_cxt); + freeJsonLexContext(&lex); PG_RETURN_NULL(); } @@ -2452,28 +2462,45 @@ Datum jsonb_populate_record(PG_FUNCTION_ARGS) { return populate_record_worker(fcinfo, "jsonb_populate_record", - false, true); + false, true, NULL); +} + +/* + * SQL function that can be used for testing json_populate_record(). + * + * Returns false if json_populate_record() encounters an error for the + * provided input JSON object, true otherwise. + */ +Datum +jsonb_populate_record_valid(PG_FUNCTION_ARGS) +{ + ErrorSaveContext escontext = {T_ErrorSaveContext}; + + (void) populate_record_worker(fcinfo, "jsonb_populate_record", + false, true, (Node *) &escontext); + + return BoolGetDatum(!escontext.error_occurred); } Datum jsonb_to_record(PG_FUNCTION_ARGS) { return populate_record_worker(fcinfo, "jsonb_to_record", - false, false); + false, false, NULL); } Datum json_populate_record(PG_FUNCTION_ARGS) { return populate_record_worker(fcinfo, "json_populate_record", - true, true); + true, true, NULL); } Datum json_to_record(PG_FUNCTION_ARGS) { return populate_record_worker(fcinfo, "json_to_record", - true, false); + true, false, NULL); } /* helper function for diagnostics */ @@ -2483,14 +2510,15 @@ populate_array_report_expected_array(PopulateArrayContext *ctx, int ndim) if (ndim <= 0) { if (ctx->colname) - ereport(ERROR, + errsave(ctx->escontext, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("expected JSON array"), errhint("See the value of key \"%s\".", ctx->colname))); else - ereport(ERROR, + errsave(ctx->escontext, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("expected JSON array"))); + return; } else { @@ -2505,22 +2533,28 @@ populate_array_report_expected_array(PopulateArrayContext *ctx, int ndim) appendStringInfo(&indices, "[%d]", ctx->sizes[i]); if (ctx->colname) - ereport(ERROR, + errsave(ctx->escontext, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("expected JSON array"), errhint("See the array element %s of key \"%s\".", indices.data, ctx->colname))); else - ereport(ERROR, + errsave(ctx->escontext, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("expected JSON array"), errhint("See the array element %s.", indices.data))); + return; } } -/* set the number of dimensions of the populated array when it becomes known */ -static void +/* + * Validate and set ndims for populating an array with some + * populate_array_*() function. + * + * Returns false if the input (ndims) is erroneous. + */ +static bool populate_array_assign_ndims(PopulateArrayContext *ctx, int ndims) { int i; @@ -2528,7 +2562,12 @@ populate_array_assign_ndims(PopulateArrayContext *ctx, int ndims) Assert(ctx->ndims <= 0); if (ndims <= 0) + { populate_array_report_expected_array(ctx, ndims); + /* Getting here means the error was reported softly. */ + Assert(SOFT_ERROR_OCCURRED(ctx->escontext)); + return false; + } ctx->ndims = ndims; ctx->dims = palloc(sizeof(int) * ndims); @@ -2536,10 +2575,16 @@ populate_array_assign_ndims(PopulateArrayContext *ctx, int ndims) for (i = 0; i < ndims; i++) ctx->dims[i] = -1; /* dimensions are unknown yet */ + + return true; } -/* check the populated subarray dimension */ -static void +/* + * Check the populated subarray dimension + * + * Returns false if the input (ndims) is erroneous. + */ +static bool populate_array_check_dimension(PopulateArrayContext *ctx, int ndim) { int dim = ctx->sizes[ndim]; /* current dimension counter */ @@ -2547,7 +2592,7 @@ populate_array_check_dimension(PopulateArrayContext *ctx, int ndim) if (ctx->dims[ndim] == -1) ctx->dims[ndim] = dim; /* assign dimension if not yet known */ else if (ctx->dims[ndim] != dim) - ereport(ERROR, + ereturn(ctx->escontext, false, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("malformed JSON array"), errdetail("Multidimensional arrays must have " @@ -2559,9 +2604,15 @@ populate_array_check_dimension(PopulateArrayContext *ctx, int ndim) /* increment the parent dimension counter if it is a nested sub-array */ if (ndim > 0) ctx->sizes[ndim - 1]++; + + return true; } -static void +/* + * Returns true if the array element value was successfully extracted from jsv + * and added to ctx->astate. False if an error occurred when doing so. + */ +static bool populate_array_element(PopulateArrayContext *ctx, int ndim, JsValue *jsv) { Datum element; @@ -2572,13 +2623,19 @@ populate_array_element(PopulateArrayContext *ctx, int ndim, JsValue *jsv) ctx->aio->element_type, ctx->aio->element_typmod, NULL, ctx->mcxt, PointerGetDatum(NULL), - jsv, &element_isnull); + jsv, &element_isnull, ctx->escontext, + false); + /* Nothing to do on an error. */ + if (SOFT_ERROR_OCCURRED(ctx->escontext)) + return false; accumArrayResult(ctx->astate, element, element_isnull, ctx->aio->element_type, ctx->acxt); Assert(ndim > 0); ctx->sizes[ndim - 1]++; /* increment current dimension counter */ + + return true; } /* json object start handler for populate_array_json() */ @@ -2589,9 +2646,17 @@ populate_array_object_start(void *_state) int ndim = state->lex->lex_level; if (state->ctx->ndims <= 0) - populate_array_assign_ndims(state->ctx, ndim); + { + if (!populate_array_assign_ndims(state->ctx, ndim)) + return JSON_SEM_ACTION_FAILED; + } else if (ndim < state->ctx->ndims) + { populate_array_report_expected_array(state->ctx, ndim); + /* Getting here means the error was reported softly. */ + Assert(SOFT_ERROR_OCCURRED(state->ctx->escontext)); + return JSON_SEM_ACTION_FAILED; + } return JSON_SUCCESS; } @@ -2605,10 +2670,17 @@ populate_array_array_end(void *_state) int ndim = state->lex->lex_level; if (ctx->ndims <= 0) - populate_array_assign_ndims(ctx, ndim + 1); + { + if (!populate_array_assign_ndims(ctx, ndim + 1)) + return JSON_SEM_ACTION_FAILED; + } if (ndim < ctx->ndims) - populate_array_check_dimension(ctx, ndim); + { + /* Report if an error occurred. */ + if (!populate_array_check_dimension(ctx, ndim)) + return JSON_SEM_ACTION_FAILED; + } return JSON_SUCCESS; } @@ -2666,7 +2738,9 @@ populate_array_element_end(void *_state, bool isnull) state->element_start) * sizeof(char); } - populate_array_element(ctx, ndim, &jsv); + /* Report if an error occurred. */ + if (!populate_array_element(ctx, ndim, &jsv)) + return JSON_SEM_ACTION_FAILED; } return JSON_SUCCESS; @@ -2681,9 +2755,17 @@ populate_array_scalar(void *_state, char *token, JsonTokenType tokentype) int ndim = state->lex->lex_level; if (ctx->ndims <= 0) - populate_array_assign_ndims(ctx, ndim); + { + if (!populate_array_assign_ndims(ctx, ndim)) + return JSON_SEM_ACTION_FAILED; + } else if (ndim < ctx->ndims) + { populate_array_report_expected_array(ctx, ndim); + /* Getting here means the error was reported softly. */ + Assert(SOFT_ERROR_OCCURRED(ctx->escontext)); + return JSON_SEM_ACTION_FAILED; + } if (ndim == ctx->ndims) { @@ -2696,14 +2778,19 @@ populate_array_scalar(void *_state, char *token, JsonTokenType tokentype) return JSON_SUCCESS; } -/* parse a json array and populate array */ -static void -populate_array_json(PopulateArrayContext *ctx, char *json, int len) +/* + * Parse a json array and populate array + * + * Returns false if an error occurs when parsing. + */ +static bool +populate_array_json(PopulateArrayContext *ctx, const char *json, int len) { PopulateArrayState state; JsonSemAction sem; - state.lex = makeJsonLexContextCstringLen(json, len, GetDatabaseEncoding(), true); + state.lex = makeJsonLexContextCstringLen(NULL, json, len, + GetDatabaseEncoding(), true); state.ctx = ctx; memset(&sem, 0, sizeof(sem)); @@ -2714,19 +2801,25 @@ populate_array_json(PopulateArrayContext *ctx, char *json, int len) sem.array_element_end = populate_array_element_end; sem.scalar = populate_array_scalar; - pg_parse_json_or_ereport(state.lex, &sem); + if (pg_parse_json_or_errsave(state.lex, &sem, ctx->escontext)) + { + /* number of dimensions should be already known */ + Assert(ctx->ndims > 0 && ctx->dims); + } - /* number of dimensions should be already known */ - Assert(ctx->ndims > 0 && ctx->dims); + freeJsonLexContext(state.lex); - pfree(state.lex); + return !SOFT_ERROR_OCCURRED(ctx->escontext); } /* * populate_array_dim_jsonb() -- Iterate recursively through jsonb sub-array * elements and accumulate result using given ArrayBuildState. + * + * Returns false if we return partway through because of an error in a + * subroutine. */ -static void +static bool populate_array_dim_jsonb(PopulateArrayContext *ctx, /* context */ JsonbValue *jbv, /* jsonb sub-array */ int ndim) /* current dimension */ @@ -2739,10 +2832,15 @@ populate_array_dim_jsonb(PopulateArrayContext *ctx, /* context */ check_stack_depth(); - if (jbv->type != jbvBinary || !JsonContainerIsArray(jbc)) + /* Even scalars can end up here thanks to ExecEvalJsonCoercion(). */ + if (jbv->type != jbvBinary || !JsonContainerIsArray(jbc) || + JsonContainerIsScalar(jbc)) + { populate_array_report_expected_array(ctx, ndim - 1); - - Assert(!JsonContainerIsScalar(jbc)); + /* Getting here means the error was reported softly. */ + Assert(SOFT_ERROR_OCCURRED(ctx->escontext)); + return false; + } it = JsonbIteratorInit(jbc); @@ -2761,7 +2859,10 @@ populate_array_dim_jsonb(PopulateArrayContext *ctx, /* context */ (tok == WJB_ELEM && (val.type != jbvBinary || !JsonContainerIsArray(val.val.binary.data))))) - populate_array_assign_ndims(ctx, ndim); + { + if (!populate_array_assign_ndims(ctx, ndim)) + return false; + } jsv.is_json = false; jsv.val.jsonb = &val; @@ -2774,16 +2875,21 @@ populate_array_dim_jsonb(PopulateArrayContext *ctx, /* context */ * it is not the innermost dimension. */ if (ctx->ndims > 0 && ndim >= ctx->ndims) - populate_array_element(ctx, ndim, &jsv); + { + if (!populate_array_element(ctx, ndim, &jsv)) + return false; + } else { /* populate child sub-array */ - populate_array_dim_jsonb(ctx, &val, ndim + 1); + if (!populate_array_dim_jsonb(ctx, &val, ndim + 1)) + return false; /* number of dimensions should be already known */ Assert(ctx->ndims > 0 && ctx->dims); - populate_array_check_dimension(ctx, ndim); + if (!populate_array_check_dimension(ctx, ndim)) + return false; } tok = JsonbIteratorNext(&it, &val, true); @@ -2794,14 +2900,22 @@ populate_array_dim_jsonb(PopulateArrayContext *ctx, /* context */ /* free iterator, iterating until WJB_DONE */ tok = JsonbIteratorNext(&it, &val, true); Assert(tok == WJB_DONE && !it); + + return true; } -/* recursively populate an array from json/jsonb */ +/* + * Recursively populate an array from json/jsonb + * + * *isnull is set to true if an error is reported during parsing. + */ static Datum populate_array(ArrayIOData *aio, const char *colname, MemoryContext mcxt, - JsValue *jsv) + JsValue *jsv, + bool *isnull, + Node *escontext) { PopulateArrayContext ctx; Datum result; @@ -2816,14 +2930,27 @@ populate_array(ArrayIOData *aio, ctx.ndims = 0; /* unknown yet */ ctx.dims = NULL; ctx.sizes = NULL; + ctx.escontext = escontext; if (jsv->is_json) - populate_array_json(&ctx, jsv->val.json.str, - jsv->val.json.len >= 0 ? jsv->val.json.len - : strlen(jsv->val.json.str)); + { + /* Return null if an error was found. */ + if (!populate_array_json(&ctx, jsv->val.json.str, + jsv->val.json.len >= 0 ? jsv->val.json.len + : strlen(jsv->val.json.str))) + { + *isnull = true; + return (Datum) 0; + } + } else { - populate_array_dim_jsonb(&ctx, jsv->val.jsonb, 1); + /* Return null if an error was found. */ + if (!populate_array_dim_jsonb(&ctx, jsv->val.jsonb, 1)) + { + *isnull = true; + return (Datum) 0; + } ctx.dims[0] = ctx.sizes[0]; } @@ -2841,11 +2968,16 @@ populate_array(ArrayIOData *aio, pfree(ctx.sizes); pfree(lbs); + *isnull = false; return result; } -static void -JsValueToJsObject(JsValue *jsv, JsObject *jso) +/* + * Returns false if an error occurs, provided escontext points to an + * ErrorSaveContext. + */ +static bool +JsValueToJsObject(JsValue *jsv, JsObject *jso, Node *escontext) { jso->is_json = jsv->is_json; @@ -2857,7 +2989,9 @@ JsValueToJsObject(JsValue *jsv, JsObject *jso) jsv->val.json.len >= 0 ? jsv->val.json.len : strlen(jsv->val.json.str), - "populate_composite"); + "populate_composite", + escontext); + Assert(jso->val.json_hash != NULL || SOFT_ERROR_OCCURRED(escontext)); } else { @@ -2875,7 +3009,7 @@ JsValueToJsObject(JsValue *jsv, JsObject *jso) is_scalar = IsAJsonbScalar(jbv) || (jbv->type == jbvBinary && JsonContainerIsScalar(jbv->val.binary.data)); - ereport(ERROR, + errsave(escontext, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), is_scalar ? errmsg("cannot call %s on a scalar", @@ -2884,6 +3018,8 @@ JsValueToJsObject(JsValue *jsv, JsObject *jso) "populate_composite"))); } } + + return !SOFT_ERROR_OCCURRED(escontext); } /* acquire or update cached tuple descriptor for a composite type */ @@ -2910,7 +3046,12 @@ update_cached_tupdesc(CompositeIOData *io, MemoryContext mcxt) } } -/* recursively populate a composite (row type) value from json/jsonb */ +/* + * Recursively populate a composite (row type) value from json/jsonb + * + * Returns null if an error occurs in a subroutine, provided escontext points + * to an ErrorSaveContext. + */ static Datum populate_composite(CompositeIOData *io, Oid typid, @@ -2918,14 +3059,15 @@ populate_composite(CompositeIOData *io, MemoryContext mcxt, HeapTupleHeader defaultval, JsValue *jsv, - bool isnull) + bool *isnull, + Node *escontext) { Datum result; /* acquire/update cached tuple descriptor */ update_cached_tupdesc(io, mcxt); - if (isnull) + if (*isnull) result = (Datum) 0; else { @@ -2933,11 +3075,21 @@ populate_composite(CompositeIOData *io, JsObject jso; /* prepare input value */ - JsValueToJsObject(jsv, &jso); + if (!JsValueToJsObject(jsv, &jso, escontext)) + { + *isnull = true; + return (Datum) 0; + } /* populate resulting record tuple */ tuple = populate_record(io->tupdesc, &io->record_io, - defaultval, mcxt, &jso); + defaultval, mcxt, &jso, escontext); + + if (SOFT_ERROR_OCCURRED(escontext)) + { + *isnull = true; + return (Datum) 0; + } result = HeapTupleHeaderGetDatum(tuple); JsObjectFree(&jso); @@ -2949,18 +3101,31 @@ populate_composite(CompositeIOData *io, * now, we can tell by comparing typid to base_typid.) */ if (typid != io->base_typid && typid != RECORDOID) - domain_check(result, isnull, typid, &io->domain_info, mcxt); + { + if (!domain_check_safe(result, *isnull, typid, &io->domain_info, mcxt, + escontext)) + { + *isnull = true; + return (Datum) 0; + } + } return result; } -/* populate non-null scalar value from json/jsonb value */ +/* + * Populate non-null scalar value from json/jsonb value. + * + * Returns null if an error occurs during the call to type input function, + * provided escontext is valid. + */ static Datum -populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv) +populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv, + bool *isnull, Node *escontext, bool omit_quotes) { Datum res; char *str = NULL; - char *json = NULL; + const char *json = NULL; if (jsv->is_json) { @@ -2976,7 +3141,10 @@ populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv) str[len] = '\0'; } else - str = json; /* string is already null-terminated */ + { + /* string is already null-terminated */ + str = unconstify(char *, json); + } /* If converting to json/jsonb, make string into valid JSON literal */ if ((typid == JSONOID || typid == JSONBOID) && @@ -2996,7 +3164,9 @@ populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv) { JsonbValue *jbv = jsv->val.jsonb; - if (typid == JSONBOID) + if (jbv->type == jbvString && omit_quotes) + str = pnstrdup(jbv->val.string.val, jbv->val.string.len); + else if (typid == JSONBOID) { Jsonb *jsonb = JsonbValueToJsonb(jbv); /* directly use jsonb */ @@ -3027,7 +3197,12 @@ populate_scalar(ScalarIOData *io, Oid typid, int32 typmod, JsValue *jsv) elog(ERROR, "unrecognized jsonb type: %d", (int) jbv->type); } - res = InputFunctionCall(&io->typiofunc, str, io->typioparam, typmod); + if (!InputFunctionCallSafe(&io->typiofunc, str, io->typioparam, typmod, + escontext, &res)) + { + res = (Datum) 0; + *isnull = true; + } /* free temporary buffer */ if (str != json) @@ -3042,22 +3217,29 @@ populate_domain(DomainIOData *io, const char *colname, MemoryContext mcxt, JsValue *jsv, - bool isnull) + bool *isnull, + Node *escontext, + bool omit_quotes) { Datum res; - if (isnull) + if (*isnull) res = (Datum) 0; else { res = populate_record_field(io->base_io, io->base_typid, io->base_typmod, colname, mcxt, PointerGetDatum(NULL), - jsv, &isnull); - Assert(!isnull); + jsv, isnull, escontext, omit_quotes); + Assert(!*isnull || SOFT_ERROR_OCCURRED(escontext)); } - domain_check(res, isnull, typid, &io->domain_info, mcxt); + if (!domain_check_safe(res, *isnull, typid, &io->domain_info, mcxt, + escontext)) + { + *isnull = true; + return (Datum) 0; + } return res; } @@ -3149,6 +3331,74 @@ prepare_column_cache(ColumnIOData *column, ReleaseSysCache(tup); } +/* + * Populate and return the value of specified type from a given json/jsonb + * value 'json_val'. 'cache' is caller-specified pointer to save the + * ColumnIOData that will be initialized on the 1st call and then reused + * during any subsequent calls. 'mcxt' gives the memory context to allocate + * the ColumnIOData and any other subsidiary memory in. 'escontext', + * if not NULL, tells that any errors that occur should be handled softly. + */ +Datum +json_populate_type(Datum json_val, Oid json_type, + Oid typid, int32 typmod, + void **cache, MemoryContext mcxt, + bool *isnull, bool omit_quotes, + Node *escontext) +{ + JsValue jsv = {0}; + JsonbValue jbv; + + jsv.is_json = json_type == JSONOID; + + if (*isnull) + { + if (jsv.is_json) + jsv.val.json.str = NULL; + else + jsv.val.jsonb = NULL; + } + else if (jsv.is_json) + { + text *json = DatumGetTextPP(json_val); + + jsv.val.json.str = VARDATA_ANY(json); + jsv.val.json.len = VARSIZE_ANY_EXHDR(json); + jsv.val.json.type = JSON_TOKEN_INVALID; /* not used in + * populate_composite() */ + } + else + { + Jsonb *jsonb = DatumGetJsonbP(json_val); + + jsv.val.jsonb = &jbv; + + if (omit_quotes) + { + char *str = JsonbUnquote(DatumGetJsonbP(json_val)); + + /* fill the quote-stripped string */ + jbv.type = jbvString; + jbv.val.string.len = strlen(str); + jbv.val.string.val = str; + } + else + { + /* fill binary jsonb value pointing to jb */ + jbv.type = jbvBinary; + jbv.val.binary.data = &jsonb->root; + jbv.val.binary.len = VARSIZE(jsonb) - VARHDRSZ; + } + } + + if (*cache == NULL) + *cache = MemoryContextAllocZero(mcxt, sizeof(ColumnIOData)); + + return populate_record_field(*cache, typid, typmod, NULL, mcxt, + PointerGetDatum(NULL), &jsv, isnull, + escontext, omit_quotes); +} + /* recursively populate a record field or an array element from a json/jsonb value */ static Datum populate_record_field(ColumnIOData *col, @@ -3158,7 +3408,9 @@ populate_record_field(ColumnIOData *col, MemoryContext mcxt, Datum defaultval, JsValue *jsv, - bool *isnull) + bool *isnull, + Node *escontext, + bool omit_scalar_quotes) { TypeCat typcat; @@ -3191,10 +3443,12 @@ populate_record_field(ColumnIOData *col, switch (typcat) { case TYPECAT_SCALAR: - return populate_scalar(&col->scalar_io, typid, typmod, jsv); + return populate_scalar(&col->scalar_io, typid, typmod, jsv, + isnull, escontext, omit_scalar_quotes); case TYPECAT_ARRAY: - return populate_array(&col->io.array, colname, mcxt, jsv); + return populate_array(&col->io.array, colname, mcxt, jsv, + isnull, escontext); case TYPECAT_COMPOSITE: case TYPECAT_COMPOSITE_DOMAIN: @@ -3203,11 +3457,12 @@ populate_record_field(ColumnIOData *col, DatumGetPointer(defaultval) ? DatumGetHeapTupleHeader(defaultval) : NULL, - jsv, *isnull); + jsv, isnull, + escontext); case TYPECAT_DOMAIN: return populate_domain(&col->io.domain, typid, colname, mcxt, - jsv, *isnull); + jsv, isnull, escontext, omit_scalar_quotes); default: elog(ERROR, "unrecognized type category '%c'", typcat); @@ -3264,7 +3519,8 @@ populate_record(TupleDesc tupdesc, RecordIOData **record_p, HeapTupleHeader defaultval, MemoryContext mcxt, - JsObject *obj) + JsObject *obj, + Node *escontext) { RecordIOData *record = *record_p; Datum *values; @@ -3356,7 +3612,9 @@ populate_record(TupleDesc tupdesc, mcxt, nulls[i] ? (Datum) 0 : values[i], &field, - &nulls[i]); + &nulls[i], + escontext, + false); } res = heap_form_tuple(tupdesc, values, nulls); @@ -3437,12 +3695,14 @@ get_record_type_from_query(FunctionCallInfo fcinfo, */ static Datum populate_record_worker(FunctionCallInfo fcinfo, const char *funcname, - bool is_json, bool have_record_arg) + bool is_json, bool have_record_arg, + Node *escontext) { int json_arg_num = have_record_arg ? 1 : 0; JsValue jsv = {0}; HeapTupleHeader rec; Datum rettuple; + bool isnull; JsonbValue jbv; MemoryContext fnmcxt = fcinfo->flinfo->fn_mcxt; PopulateRecordCache *cache = fcinfo->flinfo->fn_extra; @@ -3529,8 +3789,11 @@ populate_record_worker(FunctionCallInfo fcinfo, const char *funcname, jbv.val.binary.len = VARSIZE(jb) - VARHDRSZ; } + isnull = false; rettuple = populate_composite(&cache->c.io.composite, cache->argtype, - NULL, fnmcxt, rec, &jsv, false); + NULL, fnmcxt, rec, &jsv, &isnull, + escontext); + Assert(!isnull || SOFT_ERROR_OCCURRED(escontext)); PG_RETURN_DATUM(rettuple); } @@ -3538,15 +3801,17 @@ populate_record_worker(FunctionCallInfo fcinfo, const char *funcname, /* * get_json_object_as_hash * - * decompose a json object into a hash table. + * Decomposes a json object into a hash table. + * + * Returns the hash table if the json is parsed successfully, NULL otherwise. */ static HTAB * -get_json_object_as_hash(char *json, int len, const char *funcname) +get_json_object_as_hash(const char *json, int len, const char *funcname, + Node *escontext) { HASHCTL ctl; HTAB *tab; JHashState *state; - JsonLexContext *lex = makeJsonLexContextCstringLen(json, len, GetDatabaseEncoding(), true); JsonSemAction *sem; ctl.keysize = NAMEDATALEN; @@ -3562,7 +3827,8 @@ get_json_object_as_hash(char *json, int len, const char *funcname) state->function_name = funcname; state->hash = tab; - state->lex = lex; + state->lex = makeJsonLexContextCstringLen(NULL, json, len, + GetDatabaseEncoding(), true); sem->semstate = (void *) state; sem->array_start = hash_array_start; @@ -3570,7 +3836,13 @@ get_json_object_as_hash(char *json, int len, const char *funcname) sem->object_field_start = hash_object_field_start; sem->object_field_end = hash_object_field_end; - pg_parse_json_or_ereport(lex, sem); + if (!pg_parse_json_or_errsave(state->lex, sem, escontext)) + { + hash_destroy(state->hash); + tab = NULL; + } + + freeJsonLexContext(state->lex); return tab; } @@ -3739,14 +4011,16 @@ populate_recordset_record(PopulateRecordsetState *state, JsObject *obj) &cache->c.io.composite.record_io, state->rec, cache->fn_mcxt, - obj); + obj, + NULL); /* if it's domain over composite, check domain constraints */ if (cache->c.typcat == TYPECAT_COMPOSITE_DOMAIN) - domain_check(HeapTupleHeaderGetDatum(tuphead), false, - cache->argtype, - &cache->c.io.composite.domain_info, - cache->fn_mcxt); + (void) domain_check_safe(HeapTupleHeaderGetDatum(tuphead), false, + cache->argtype, + &cache->c.io.composite.domain_info, + cache->fn_mcxt, + NULL); /* ok, save into tuplestore */ tuple.t_len = HeapTupleHeaderGetDatumLength(tuphead); @@ -3862,12 +4136,12 @@ populate_recordset_worker(FunctionCallInfo fcinfo, const char *funcname, if (is_json) { text *json = PG_GETARG_TEXT_PP(json_arg_num); - JsonLexContext *lex; + JsonLexContext lex; JsonSemAction *sem; sem = palloc0(sizeof(JsonSemAction)); - lex = makeJsonLexContext(json, true); + makeJsonLexContext(&lex, json, true); sem->semstate = (void *) state; sem->array_start = populate_recordset_array_start; @@ -3878,9 +4152,12 @@ populate_recordset_worker(FunctionCallInfo fcinfo, const char *funcname, sem->object_start = populate_recordset_object_start; sem->object_end = populate_recordset_object_end; - state->lex = lex; + state->lex = &lex; - pg_parse_json_or_ereport(lex, sem); + pg_parse_json_or_ereport(&lex, sem); + + freeJsonLexContext(&lex); + state->lex = NULL; } else { @@ -4216,16 +4493,15 @@ json_strip_nulls(PG_FUNCTION_ARGS) { text *json = PG_GETARG_TEXT_PP(0); StripnullState *state; - JsonLexContext *lex; + JsonLexContext lex; JsonSemAction *sem; - lex = makeJsonLexContext(json, true); state = palloc0(sizeof(StripnullState)); sem = palloc0(sizeof(JsonSemAction)); + state->lex = makeJsonLexContext(&lex, json, true); state->strval = makeStringInfo(); state->skip_next_null = false; - state->lex = lex; sem->semstate = (void *) state; sem->object_start = sn_object_start; @@ -4236,7 +4512,7 @@ json_strip_nulls(PG_FUNCTION_ARGS) sem->array_element_start = sn_array_element_start; sem->object_field_start = sn_object_field_start; - pg_parse_json_or_ereport(lex, sem); + pg_parse_json_or_ereport(&lex, sem); PG_RETURN_TEXT_P(cstring_to_text_with_len(state->strval->data, state->strval->len)); @@ -5432,11 +5708,11 @@ void iterate_json_values(text *json, uint32 flags, void *action_state, JsonIterateStringValuesAction action) { - JsonLexContext *lex = makeJsonLexContext(json, true); + JsonLexContext lex; JsonSemAction *sem = palloc0(sizeof(JsonSemAction)); IterateJsonStringValuesState *state = palloc0(sizeof(IterateJsonStringValuesState)); - state->lex = lex; + state->lex = makeJsonLexContext(&lex, json, true); state->action = action; state->action_state = action_state; state->flags = flags; @@ -5445,7 +5721,8 @@ iterate_json_values(text *json, uint32 flags, void *action_state, sem->scalar = iterate_values_scalar; sem->object_field_start = iterate_values_object_field_start; - pg_parse_json_or_ereport(lex, sem); + pg_parse_json_or_ereport(&lex, sem); + freeJsonLexContext(&lex); } /* @@ -5552,11 +5829,11 @@ text * transform_json_string_values(text *json, void *action_state, JsonTransformStringValuesAction transform_action) { - JsonLexContext *lex = makeJsonLexContext(json, true); + JsonLexContext lex; JsonSemAction *sem = palloc0(sizeof(JsonSemAction)); TransformJsonStringValuesState *state = palloc0(sizeof(TransformJsonStringValuesState)); - state->lex = lex; + state->lex = makeJsonLexContext(&lex, json, true); state->strval = makeStringInfo(); state->action = transform_action; state->action_state = action_state; @@ -5570,7 +5847,8 @@ transform_json_string_values(text *json, void *action_state, sem->array_element_start = transform_string_values_array_element_start; sem->object_field_start = transform_string_values_object_field_start; - pg_parse_json_or_ereport(lex, sem); + pg_parse_json_or_ereport(&lex, sem); + freeJsonLexContext(&lex); return cstring_to_text_with_len(state->strval->data, state->strval->len); } @@ -5669,19 +5947,129 @@ transform_string_values_scalar(void *state, char *token, JsonTokenType tokentype JsonTokenType json_get_first_token(text *json, bool throw_error) { - JsonLexContext *lex; + JsonLexContext lex; JsonParseErrorType result; - lex = makeJsonLexContext(json, false); + makeJsonLexContext(&lex, json, false); /* Lex exactly one token from the input and check its type. */ - result = json_lex(lex); + result = json_lex(&lex); if (result == JSON_SUCCESS) - return lex->token_type; + return lex.token_type; if (throw_error) - json_errsave_error(result, lex, NULL); + json_errsave_error(result, &lex, NULL); return JSON_TOKEN_INVALID; /* invalid json */ } + +/* + * Determine how we want to print values of a given type in datum_to_json(b). + * + * Given the datatype OID, return its JsonTypeCategory, as well as the type's + * output function OID. If the returned category is JSONTYPE_CAST, we return + * the OID of the type->JSON cast function instead. + */ +void +json_categorize_type(Oid typoid, bool is_jsonb, + JsonTypeCategory *tcategory, Oid *outfuncoid) +{ + bool typisvarlena; + + /* Look through any domain */ + typoid = getBaseType(typoid); + + *outfuncoid = InvalidOid; + + switch (typoid) + { + case BOOLOID: + *outfuncoid = F_BOOLOUT; + *tcategory = JSONTYPE_BOOL; + break; + + case INT2OID: + case INT4OID: + case INT8OID: + case FLOAT4OID: + case FLOAT8OID: + case NUMERICOID: + getTypeOutputInfo(typoid, outfuncoid, &typisvarlena); + *tcategory = JSONTYPE_NUMERIC; + break; + + case DATEOID: + *outfuncoid = F_DATE_OUT; + *tcategory = JSONTYPE_DATE; + break; + + case TIMESTAMPOID: + *outfuncoid = F_TIMESTAMP_OUT; + *tcategory = JSONTYPE_TIMESTAMP; + break; + + case TIMESTAMPTZOID: + *outfuncoid = F_TIMESTAMPTZ_OUT; + *tcategory = JSONTYPE_TIMESTAMPTZ; + break; + + case JSONOID: + getTypeOutputInfo(typoid, outfuncoid, &typisvarlena); + *tcategory = JSONTYPE_JSON; + break; + + case JSONBOID: + getTypeOutputInfo(typoid, outfuncoid, &typisvarlena); + *tcategory = is_jsonb ? JSONTYPE_JSONB : JSONTYPE_JSON; + break; + + default: + /* Check for arrays and composites */ + if (OidIsValid(get_element_type(typoid)) || typoid == ANYARRAYOID + || typoid == ANYCOMPATIBLEARRAYOID || typoid == RECORDARRAYOID) + { + *outfuncoid = F_ARRAY_OUT; + *tcategory = JSONTYPE_ARRAY; + } + else if (type_is_rowtype(typoid)) /* includes RECORDOID */ + { + *outfuncoid = F_RECORD_OUT; + *tcategory = JSONTYPE_COMPOSITE; + } + else + { + /* + * It's probably the general case. But let's look for a cast + * to json (note: not to jsonb even if is_jsonb is true), if + * it's not built-in. + */ + *tcategory = JSONTYPE_OTHER; + if (typoid >= FirstNormalObjectId) + { + Oid castfunc; + CoercionPathType ctype; + + ctype = find_coercion_pathway(JSONOID, typoid, + COERCION_EXPLICIT, + &castfunc); + if (ctype == COERCION_PATH_FUNC && OidIsValid(castfunc)) + { + *outfuncoid = castfunc; + *tcategory = JSONTYPE_CAST; + } + else + { + /* non builtin type with no cast */ + getTypeOutputInfo(typoid, outfuncoid, &typisvarlena); + } + } + else + { + /* any other builtin type */ + getTypeOutputInfo(typoid, outfuncoid, &typisvarlena); + } + } + break; + } +} diff --git a/src/backend/utils/adt/jsonpath.c b/src/backend/utils/adt/jsonpath.c index 7891fde3105a5..11e6193e96473 100644 --- a/src/backend/utils/adt/jsonpath.c +++ b/src/backend/utils/adt/jsonpath.c @@ -53,7 +53,7 @@ * | |__| |__||________________________||___________________| | * |_______________________________________________________________________| * - * Copyright (c) 2019-2023, PostgreSQL Global Development Group + * Copyright (c) 2019-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/jsonpath.c @@ -63,12 +63,14 @@ #include "postgres.h" -#include "funcapi.h" +#include "catalog/pg_type.h" #include "lib/stringinfo.h" #include "libpq/pqformat.h" -#include "nodes/miscnodes.h" #include "miscadmin.h" -#include "utils/builtins.h" +#include "nodes/miscnodes.h" +#include "nodes/nodeFuncs.h" +#include "utils/fmgrprotos.h" +#include "utils/formatting.h" #include "utils/json.h" #include "utils/jsonpath.h" @@ -295,6 +297,7 @@ flattenJsonPathParseItem(StringInfo buf, int *result, struct Node *escontext, case jpiDiv: case jpiMod: case jpiStartsWith: + case jpiDecimal: { /* * First, reserve place for left/right arg's positions, then @@ -355,6 +358,10 @@ flattenJsonPathParseItem(StringInfo buf, int *result, struct Node *escontext, case jpiMinus: case jpiExists: case jpiDatetime: + case jpiTime: + case jpiTimeTz: + case jpiTimestamp: + case jpiTimestampTz: { int32 arg = reserveSpaceForItemPointer(buf); @@ -444,6 +451,12 @@ flattenJsonPathParseItem(StringInfo buf, int *result, struct Node *escontext, case jpiCeiling: case jpiDouble: case jpiKeyValue: + case jpiBigint: + case jpiBoolean: + case jpiDate: + case jpiInteger: + case jpiNumber: + case jpiStringFunc: break; default: elog(ERROR, "unrecognized jsonpath item type: %d", item->type); @@ -519,18 +532,9 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, case jpiNull: appendStringInfoString(buf, "null"); break; - case jpiKey: - if (inKey) - appendStringInfoChar(buf, '.'); - escape_json(buf, jspGetString(v, NULL)); - break; case jpiString: escape_json(buf, jspGetString(v, NULL)); break; - case jpiVariable: - appendStringInfoChar(buf, '$'); - escape_json(buf, jspGetString(v, NULL)); - break; case jpiNumeric: if (jspHasNext(v)) appendStringInfoChar(buf, '('); @@ -576,58 +580,6 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, if (printBracketes) appendStringInfoChar(buf, ')'); break; - case jpiLikeRegex: - if (printBracketes) - appendStringInfoChar(buf, '('); - - jspInitByBuffer(&elem, v->base, v->content.like_regex.expr); - printJsonPathItem(buf, &elem, false, - operationPriority(elem.type) <= - operationPriority(v->type)); - - appendStringInfoString(buf, " like_regex "); - - escape_json(buf, v->content.like_regex.pattern); - - if (v->content.like_regex.flags) - { - appendStringInfoString(buf, " flag \""); - - if (v->content.like_regex.flags & JSP_REGEX_ICASE) - appendStringInfoChar(buf, 'i'); - if (v->content.like_regex.flags & JSP_REGEX_DOTALL) - appendStringInfoChar(buf, 's'); - if (v->content.like_regex.flags & JSP_REGEX_MLINE) - appendStringInfoChar(buf, 'm'); - if (v->content.like_regex.flags & JSP_REGEX_WSPACE) - appendStringInfoChar(buf, 'x'); - if (v->content.like_regex.flags & JSP_REGEX_QUOTE) - appendStringInfoChar(buf, 'q'); - - appendStringInfoChar(buf, '"'); - } - - if (printBracketes) - appendStringInfoChar(buf, ')'); - break; - case jpiPlus: - case jpiMinus: - if (printBracketes) - appendStringInfoChar(buf, '('); - appendStringInfoChar(buf, v->type == jpiPlus ? '+' : '-'); - jspGetArg(v, &elem); - printJsonPathItem(buf, &elem, false, - operationPriority(elem.type) <= - operationPriority(v->type)); - if (printBracketes) - appendStringInfoChar(buf, ')'); - break; - case jpiFilter: - appendStringInfoString(buf, "?("); - jspGetArg(v, &elem); - printJsonPathItem(buf, &elem, false, false); - appendStringInfoChar(buf, ')'); - break; case jpiNot: appendStringInfoString(buf, "!("); jspGetArg(v, &elem); @@ -640,22 +592,17 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, printJsonPathItem(buf, &elem, false, false); appendStringInfoString(buf, ") is unknown"); break; - case jpiExists: - appendStringInfoString(buf, "exists ("); + case jpiPlus: + case jpiMinus: + if (printBracketes) + appendStringInfoChar(buf, '('); + appendStringInfoChar(buf, v->type == jpiPlus ? '+' : '-'); jspGetArg(v, &elem); - printJsonPathItem(buf, &elem, false, false); - appendStringInfoChar(buf, ')'); - break; - case jpiCurrent: - Assert(!inKey); - appendStringInfoChar(buf, '@'); - break; - case jpiRoot: - Assert(!inKey); - appendStringInfoChar(buf, '$'); - break; - case jpiLast: - appendStringInfoString(buf, "last"); + printJsonPathItem(buf, &elem, false, + operationPriority(elem.type) <= + operationPriority(v->type)); + if (printBracketes) + appendStringInfoChar(buf, ')'); break; case jpiAnyArray: appendStringInfoString(buf, "[*]"); @@ -712,6 +659,35 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, v->content.anybounds.first, v->content.anybounds.last); break; + case jpiKey: + if (inKey) + appendStringInfoChar(buf, '.'); + escape_json(buf, jspGetString(v, NULL)); + break; + case jpiCurrent: + Assert(!inKey); + appendStringInfoChar(buf, '@'); + break; + case jpiRoot: + Assert(!inKey); + appendStringInfoChar(buf, '$'); + break; + case jpiVariable: + appendStringInfoChar(buf, '$'); + escape_json(buf, jspGetString(v, NULL)); + break; + case jpiFilter: + appendStringInfoString(buf, "?("); + jspGetArg(v, &elem); + printJsonPathItem(buf, &elem, false, false); + appendStringInfoChar(buf, ')'); + break; + case jpiExists: + appendStringInfoString(buf, "exists ("); + jspGetArg(v, &elem); + printJsonPathItem(buf, &elem, false, false); + appendStringInfoChar(buf, ')'); + break; case jpiType: appendStringInfoString(buf, ".type()"); break; @@ -742,6 +718,112 @@ printJsonPathItem(StringInfo buf, JsonPathItem *v, bool inKey, case jpiKeyValue: appendStringInfoString(buf, ".keyvalue()"); break; + case jpiLast: + appendStringInfoString(buf, "last"); + break; + case jpiLikeRegex: + if (printBracketes) + appendStringInfoChar(buf, '('); + + jspInitByBuffer(&elem, v->base, v->content.like_regex.expr); + printJsonPathItem(buf, &elem, false, + operationPriority(elem.type) <= + operationPriority(v->type)); + + appendStringInfoString(buf, " like_regex "); + + escape_json(buf, v->content.like_regex.pattern); + + if (v->content.like_regex.flags) + { + appendStringInfoString(buf, " flag \""); + + if (v->content.like_regex.flags & JSP_REGEX_ICASE) + appendStringInfoChar(buf, 'i'); + if (v->content.like_regex.flags & JSP_REGEX_DOTALL) + appendStringInfoChar(buf, 's'); + if (v->content.like_regex.flags & JSP_REGEX_MLINE) + appendStringInfoChar(buf, 'm'); + if (v->content.like_regex.flags & JSP_REGEX_WSPACE) + appendStringInfoChar(buf, 'x'); + if (v->content.like_regex.flags & JSP_REGEX_QUOTE) + appendStringInfoChar(buf, 'q'); + + appendStringInfoChar(buf, '"'); + } + + if (printBracketes) + appendStringInfoChar(buf, ')'); + break; + case jpiBigint: + appendStringInfoString(buf, ".bigint()"); + break; + case jpiBoolean: + appendStringInfoString(buf, ".boolean()"); + break; + case jpiDate: + appendStringInfoString(buf, ".date()"); + break; + case jpiDecimal: + appendStringInfoString(buf, ".decimal("); + if (v->content.args.left) + { + jspGetLeftArg(v, &elem); + printJsonPathItem(buf, &elem, false, false); + } + if (v->content.args.right) + { + appendStringInfoChar(buf, ','); + jspGetRightArg(v, &elem); + printJsonPathItem(buf, &elem, false, false); + } + appendStringInfoChar(buf, ')'); + break; + case jpiInteger: + appendStringInfoString(buf, ".integer()"); + break; + case jpiNumber: + appendStringInfoString(buf, ".number()"); + break; + case jpiStringFunc: + appendStringInfoString(buf, ".string()"); + break; + case jpiTime: + appendStringInfoString(buf, ".time("); + if (v->content.arg) + { + jspGetArg(v, &elem); + printJsonPathItem(buf, &elem, false, false); + } + appendStringInfoChar(buf, ')'); + break; + case jpiTimeTz: + appendStringInfoString(buf, ".time_tz("); + if (v->content.arg) + { + jspGetArg(v, &elem); + printJsonPathItem(buf, &elem, false, false); + } + appendStringInfoChar(buf, ')'); + break; + case jpiTimestamp: + appendStringInfoString(buf, ".timestamp("); + if (v->content.arg) + { + jspGetArg(v, &elem); + printJsonPathItem(buf, &elem, false, false); + } + appendStringInfoChar(buf, ')'); + break; + case jpiTimestampTz: + appendStringInfoString(buf, ".timestamp_tz("); + if (v->content.arg) + { + jspGetArg(v, &elem); + printJsonPathItem(buf, &elem, false, false); + } + appendStringInfoChar(buf, ')'); + break; default: elog(ERROR, "unrecognized jsonpath item type: %d", v->type); } @@ -771,11 +853,11 @@ jspOperationName(JsonPathItemType type) return "<="; case jpiGreaterOrEqual: return ">="; - case jpiPlus: case jpiAdd: + case jpiPlus: return "+"; - case jpiMinus: case jpiSub: + case jpiMinus: return "-"; case jpiMul: return "*"; @@ -783,26 +865,48 @@ jspOperationName(JsonPathItemType type) return "/"; case jpiMod: return "%"; - case jpiStartsWith: - return "starts with"; - case jpiLikeRegex: - return "like_regex"; case jpiType: return "type"; case jpiSize: return "size"; - case jpiKeyValue: - return "keyvalue"; - case jpiDouble: - return "double"; case jpiAbs: return "abs"; case jpiFloor: return "floor"; case jpiCeiling: return "ceiling"; + case jpiDouble: + return "double"; case jpiDatetime: return "datetime"; + case jpiKeyValue: + return "keyvalue"; + case jpiStartsWith: + return "starts with"; + case jpiLikeRegex: + return "like_regex"; + case jpiBigint: + return "bigint"; + case jpiBoolean: + return "boolean"; + case jpiDate: + return "date"; + case jpiDecimal: + return "decimal"; + case jpiInteger: + return "integer"; + case jpiNumber: + return "number"; + case jpiStringFunc: + return "string"; + case jpiTime: + return "time"; + case jpiTimeTz: + return "time_tz"; + case jpiTimestamp: + return "timestamp"; + case jpiTimestampTz: + return "timestamp_tz"; default: elog(ERROR, "unrecognized jsonpath item type: %d", type); return NULL; @@ -899,9 +1003,15 @@ jspInitByBuffer(JsonPathItem *v, char *base, int32 pos) case jpiDouble: case jpiKeyValue: case jpiLast: + case jpiBigint: + case jpiBoolean: + case jpiDate: + case jpiInteger: + case jpiNumber: + case jpiStringFunc: break; - case jpiKey: case jpiString: + case jpiKey: case jpiVariable: read_int32(v->content.value.datalen, base, pos); /* FALLTHROUGH */ @@ -911,34 +1021,33 @@ jspInitByBuffer(JsonPathItem *v, char *base, int32 pos) break; case jpiAnd: case jpiOr: - case jpiAdd: - case jpiSub: - case jpiMul: - case jpiDiv: - case jpiMod: case jpiEqual: case jpiNotEqual: case jpiLess: case jpiGreater: case jpiLessOrEqual: case jpiGreaterOrEqual: + case jpiAdd: + case jpiSub: + case jpiMul: + case jpiDiv: + case jpiMod: case jpiStartsWith: + case jpiDecimal: read_int32(v->content.args.left, base, pos); read_int32(v->content.args.right, base, pos); break; - case jpiLikeRegex: - read_int32(v->content.like_regex.flags, base, pos); - read_int32(v->content.like_regex.expr, base, pos); - read_int32(v->content.like_regex.patternlen, base, pos); - v->content.like_regex.pattern = base + pos; - break; case jpiNot: - case jpiExists: case jpiIsUnknown: + case jpiExists: case jpiPlus: case jpiMinus: case jpiFilter: case jpiDatetime: + case jpiTime: + case jpiTimeTz: + case jpiTimestamp: + case jpiTimestampTz: read_int32(v->content.arg, base, pos); break; case jpiIndexArray: @@ -950,6 +1059,12 @@ jspInitByBuffer(JsonPathItem *v, char *base, int32 pos) read_int32(v->content.anybounds.first, base, pos); read_int32(v->content.anybounds.last, base, pos); break; + case jpiLikeRegex: + read_int32(v->content.like_regex.flags, base, pos); + read_int32(v->content.like_regex.expr, base, pos); + read_int32(v->content.like_regex.patternlen, base, pos); + v->content.like_regex.pattern = base + pos; + break; default: elog(ERROR, "unrecognized jsonpath item type: %d", v->type); } @@ -958,13 +1073,17 @@ jspInitByBuffer(JsonPathItem *v, char *base, int32 pos) void jspGetArg(JsonPathItem *v, JsonPathItem *a) { - Assert(v->type == jpiFilter || - v->type == jpiNot || + Assert(v->type == jpiNot || v->type == jpiIsUnknown || - v->type == jpiExists || v->type == jpiPlus || v->type == jpiMinus || - v->type == jpiDatetime); + v->type == jpiFilter || + v->type == jpiExists || + v->type == jpiDatetime || + v->type == jpiTime || + v->type == jpiTimeTz || + v->type == jpiTimestamp || + v->type == jpiTimestampTz); jspInitByBuffer(a, v->base, v->content.arg); } @@ -974,21 +1093,20 @@ jspGetNext(JsonPathItem *v, JsonPathItem *a) { if (jspHasNext(v)) { - Assert(v->type == jpiString || + Assert(v->type == jpiNull || + v->type == jpiString || v->type == jpiNumeric || v->type == jpiBool || - v->type == jpiNull || - v->type == jpiKey || - v->type == jpiAny || - v->type == jpiAnyArray || - v->type == jpiAnyKey || - v->type == jpiIndexArray || - v->type == jpiFilter || - v->type == jpiCurrent || - v->type == jpiExists || - v->type == jpiRoot || - v->type == jpiVariable || - v->type == jpiLast || + v->type == jpiAnd || + v->type == jpiOr || + v->type == jpiNot || + v->type == jpiIsUnknown || + v->type == jpiEqual || + v->type == jpiNotEqual || + v->type == jpiLess || + v->type == jpiGreater || + v->type == jpiLessOrEqual || + v->type == jpiGreaterOrEqual || v->type == jpiAdd || v->type == jpiSub || v->type == jpiMul || @@ -996,16 +1114,16 @@ jspGetNext(JsonPathItem *v, JsonPathItem *a) v->type == jpiMod || v->type == jpiPlus || v->type == jpiMinus || - v->type == jpiEqual || - v->type == jpiNotEqual || - v->type == jpiGreater || - v->type == jpiGreaterOrEqual || - v->type == jpiLess || - v->type == jpiLessOrEqual || - v->type == jpiAnd || - v->type == jpiOr || - v->type == jpiNot || - v->type == jpiIsUnknown || + v->type == jpiAnyArray || + v->type == jpiAnyKey || + v->type == jpiIndexArray || + v->type == jpiAny || + v->type == jpiKey || + v->type == jpiCurrent || + v->type == jpiRoot || + v->type == jpiVariable || + v->type == jpiFilter || + v->type == jpiExists || v->type == jpiType || v->type == jpiSize || v->type == jpiAbs || @@ -1014,7 +1132,20 @@ jspGetNext(JsonPathItem *v, JsonPathItem *a) v->type == jpiDouble || v->type == jpiDatetime || v->type == jpiKeyValue || - v->type == jpiStartsWith); + v->type == jpiLast || + v->type == jpiStartsWith || + v->type == jpiLikeRegex || + v->type == jpiBigint || + v->type == jpiBoolean || + v->type == jpiDate || + v->type == jpiDecimal || + v->type == jpiInteger || + v->type == jpiNumber || + v->type == jpiStringFunc || + v->type == jpiTime || + v->type == jpiTimeTz || + v->type == jpiTimestamp || + v->type == jpiTimestampTz); if (a) jspInitByBuffer(a, v->base, v->nextPos); @@ -1040,7 +1171,8 @@ jspGetLeftArg(JsonPathItem *v, JsonPathItem *a) v->type == jpiMul || v->type == jpiDiv || v->type == jpiMod || - v->type == jpiStartsWith); + v->type == jpiStartsWith || + v->type == jpiDecimal); jspInitByBuffer(a, v->base, v->content.args.left); } @@ -1061,7 +1193,8 @@ jspGetRightArg(JsonPathItem *v, JsonPathItem *a) v->type == jpiMul || v->type == jpiDiv || v->type == jpiMod || - v->type == jpiStartsWith); + v->type == jpiStartsWith || + v->type == jpiDecimal); jspInitByBuffer(a, v->base, v->content.args.right); } @@ -1109,3 +1242,281 @@ jspGetArraySubscript(JsonPathItem *v, JsonPathItem *from, JsonPathItem *to, return true; } + +/* SQL/JSON datatype status: */ +enum JsonPathDatatypeStatus +{ + jpdsNonDateTime, /* null, bool, numeric, string, array, object */ + jpdsUnknownDateTime, /* unknown datetime type */ + jpdsDateTimeZoned, /* timetz, timestamptz */ + jpdsDateTimeNonZoned, /* time, timestamp, date */ +}; + +/* Context for jspIsMutableWalker() */ +struct JsonPathMutableContext +{ + List *varnames; /* list of variable names */ + List *varexprs; /* list of variable expressions */ + enum JsonPathDatatypeStatus current; /* status of @ item */ + bool lax; /* jsonpath is lax or strict */ + bool mutable; /* resulting mutability status */ +}; + +static enum JsonPathDatatypeStatus jspIsMutableWalker(JsonPathItem *jpi, + struct JsonPathMutableContext *cxt); + +/* + * Function to check whether jsonpath expression is mutable to be used in the + * planner function contain_mutable_functions(). + */ +bool +jspIsMutable(JsonPath *path, List *varnames, List *varexprs) +{ + struct JsonPathMutableContext cxt; + JsonPathItem jpi; + + cxt.varnames = varnames; + cxt.varexprs = varexprs; + cxt.current = jpdsNonDateTime; + cxt.lax = (path->header & JSONPATH_LAX) != 0; + cxt.mutable = false; + + jspInit(&jpi, path); + (void) jspIsMutableWalker(&jpi, &cxt); + + return cxt.mutable; +} + +/* + * Recursive walker for jspIsMutable() + */ +static enum JsonPathDatatypeStatus +jspIsMutableWalker(JsonPathItem *jpi, struct JsonPathMutableContext *cxt) +{ + JsonPathItem next; + enum JsonPathDatatypeStatus status = jpdsNonDateTime; + + while (!cxt->mutable) + { + JsonPathItem arg; + enum JsonPathDatatypeStatus leftStatus; + enum JsonPathDatatypeStatus rightStatus; + + switch (jpi->type) + { + case jpiRoot: + Assert(status == jpdsNonDateTime); + break; + + case jpiCurrent: + Assert(status == jpdsNonDateTime); + status = cxt->current; + break; + + case jpiFilter: + { + enum JsonPathDatatypeStatus prevStatus = cxt->current; + + cxt->current = status; + jspGetArg(jpi, &arg); + jspIsMutableWalker(&arg, cxt); + + cxt->current = prevStatus; + break; + } + + case jpiVariable: + { + int32 len; + const char *name = jspGetString(jpi, &len); + ListCell *lc1; + ListCell *lc2; + + Assert(status == jpdsNonDateTime); + + forboth(lc1, cxt->varnames, lc2, cxt->varexprs) + { + String *varname = lfirst_node(String, lc1); + Node *varexpr = lfirst(lc2); + + if (strncmp(varname->sval, name, len)) + continue; + + switch (exprType(varexpr)) + { + case DATEOID: + case TIMEOID: + case TIMESTAMPOID: + status = jpdsDateTimeNonZoned; + break; + + case TIMETZOID: + case TIMESTAMPTZOID: + status = jpdsDateTimeZoned; + break; + + default: + status = jpdsNonDateTime; + break; + } + + break; + } + break; + } + + case jpiEqual: + case jpiNotEqual: + case jpiLess: + case jpiGreater: + case jpiLessOrEqual: + case jpiGreaterOrEqual: + Assert(status == jpdsNonDateTime); + jspGetLeftArg(jpi, &arg); + leftStatus = jspIsMutableWalker(&arg, cxt); + + jspGetRightArg(jpi, &arg); + rightStatus = jspIsMutableWalker(&arg, cxt); + + /* + * Comparison of datetime type with different timezone status + * is mutable. + */ + if (leftStatus != jpdsNonDateTime && + rightStatus != jpdsNonDateTime && + (leftStatus == jpdsUnknownDateTime || + rightStatus == jpdsUnknownDateTime || + leftStatus != rightStatus)) + cxt->mutable = true; + break; + + case jpiNot: + case jpiIsUnknown: + case jpiExists: + case jpiPlus: + case jpiMinus: + Assert(status == jpdsNonDateTime); + jspGetArg(jpi, &arg); + jspIsMutableWalker(&arg, cxt); + break; + + case jpiAnd: + case jpiOr: + case jpiAdd: + case jpiSub: + case jpiMul: + case jpiDiv: + case jpiMod: + case jpiStartsWith: + Assert(status == jpdsNonDateTime); + jspGetLeftArg(jpi, &arg); + jspIsMutableWalker(&arg, cxt); + jspGetRightArg(jpi, &arg); + jspIsMutableWalker(&arg, cxt); + break; + + case jpiIndexArray: + for (int i = 0; i < jpi->content.array.nelems; i++) + { + JsonPathItem from; + JsonPathItem to; + + if (jspGetArraySubscript(jpi, &from, &to, i)) + jspIsMutableWalker(&to, cxt); + + jspIsMutableWalker(&from, cxt); + } + /* FALLTHROUGH */ + + case jpiAnyArray: + if (!cxt->lax) + status = jpdsNonDateTime; + break; + + case jpiAny: + if (jpi->content.anybounds.first > 0) + status = jpdsNonDateTime; + break; + + case jpiDatetime: + if (jpi->content.arg) + { + char *template; + + jspGetArg(jpi, &arg); + if (arg.type != jpiString) + { + status = jpdsNonDateTime; + break; /* there will be runtime error */ + } + + template = jspGetString(&arg, NULL); + if (datetime_format_has_tz(template)) + status = jpdsDateTimeZoned; + else + status = jpdsDateTimeNonZoned; + } + else + { + status = jpdsUnknownDateTime; + } + break; + + case jpiLikeRegex: + Assert(status == jpdsNonDateTime); + jspInitByBuffer(&arg, jpi->base, jpi->content.like_regex.expr); + jspIsMutableWalker(&arg, cxt); + break; + + /* literals */ + case jpiNull: + case jpiString: + case jpiNumeric: + case jpiBool: + break; + /* accessors */ + case jpiKey: + case jpiAnyKey: + /* special items */ + case jpiSubscript: + case jpiLast: + /* item methods */ + case jpiType: + case jpiSize: + case jpiAbs: + case jpiFloor: + case jpiCeiling: + case jpiDouble: + case jpiKeyValue: + case jpiBigint: + case jpiBoolean: + case jpiDecimal: + case jpiInteger: + case jpiNumber: + case jpiStringFunc: + status = jpdsNonDateTime; + break; + + case jpiTime: + case jpiDate: + case jpiTimestamp: + status = jpdsDateTimeNonZoned; + cxt->mutable = true; + break; + + case jpiTimeTz: + case jpiTimestampTz: + status = jpdsDateTimeNonZoned; + cxt->mutable = true; + break; + + } + + if (!jspGetNext(jpi, &next)) + break; + + jpi = &next; + } + + return status; +} diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c index 2d0599b4aaae3..accadff6d8ac3 100644 --- a/src/backend/utils/adt/jsonpath_exec.c +++ b/src/backend/utils/adt/jsonpath_exec.c @@ -49,7 +49,7 @@ * we calculate operands first. Then we check that results are numeric * singleton lists, calculate the result and pass it to the next path item. * - * Copyright (c) 2019-2023, PostgreSQL Global Development Group + * Copyright (c) 2019-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/jsonpath_exec.c @@ -61,22 +61,22 @@ #include "catalog/pg_collation.h" #include "catalog/pg_type.h" +#include "executor/execExpr.h" #include "funcapi.h" -#include "lib/stringinfo.h" #include "miscadmin.h" #include "nodes/miscnodes.h" +#include "nodes/nodeFuncs.h" #include "regex/regex.h" #include "utils/builtins.h" #include "utils/date.h" #include "utils/datetime.h" -#include "utils/datum.h" #include "utils/float.h" #include "utils/formatting.h" -#include "utils/guc.h" #include "utils/json.h" #include "utils/jsonpath.h" +#include "utils/lsyscache.h" +#include "utils/memutils.h" #include "utils/timestamp.h" -#include "utils/varlena.h" /* * Represents "base object" and it's "id" for .keyvalue() evaluation. @@ -87,12 +87,19 @@ typedef struct JsonBaseObjectInfo int id; } JsonBaseObjectInfo; +/* Callbacks for executeJsonPath() */ +typedef JsonbValue *(*JsonPathGetVarCallback) (void *vars, char *varName, int varNameLen, + JsonbValue *baseObject, int *baseObjectId); +typedef int (*JsonPathCountVarsCallback) (void *vars); + /* * Context of jsonpath execution. */ typedef struct JsonPathExecContext { - Jsonb *vars; /* variables to substitute into jsonpath */ + void *vars; /* variables to substitute into jsonpath */ + JsonPathGetVarCallback getVar; /* callback to extract a given variable + * from 'vars' */ JsonbValue *root; /* for $ evaluation */ JsonbValue *current; /* for @ evaluation */ JsonBaseObjectInfo baseObject; /* "base object" for .keyvalue() @@ -152,8 +159,83 @@ typedef struct JsonValueListIterator ListCell *next; } JsonValueListIterator; +/* Structures for JSON_TABLE execution */ + +/* + * Struct holding the result of jsonpath evaluation, to be used as source row + * for JsonTableGetValue() which in turn computes the values of individual + * JSON_TABLE columns. + */ +typedef struct JsonTablePlanRowSource +{ + Datum value; + bool isnull; +} JsonTablePlanRowSource; + +/* + * State of evaluation of row pattern derived by applying jsonpath given in + * a JsonTablePlan to an input document given in the parent TableFunc. + */ +typedef struct JsonTablePlanState +{ + /* Original plan */ + JsonTablePlan *plan; + + /* The following fields are only valid for JsonTablePathScan plans */ + + /* jsonpath to evaluate against the input doc to get the row pattern */ + JsonPath *path; + + /* + * Memory context to use when evaluating the row pattern from the jsonpath + */ + MemoryContext mcxt; + + /* PASSING arguments passed to jsonpath executor */ + List *args; + + /* List and iterator of jsonpath result values */ + JsonValueList found; + JsonValueListIterator iter; + + /* Currently selected row for JsonTableGetValue() to use */ + JsonTablePlanRowSource current; + + /* Counter for ORDINAL columns */ + int ordinal; + + /* Nested plan, if any */ + struct JsonTablePlanState *nested; + + /* Left sibling, if any */ + struct JsonTablePlanState *left; + + /* Right sibling, if any */ + struct JsonTablePlanState *right; + + /* Parent plan, if this is a nested plan */ + struct JsonTablePlanState *parent; +} JsonTablePlanState; + +/* Random number to identify JsonTableExecContext for sanity checking */ +#define JSON_TABLE_EXEC_CONTEXT_MAGIC 418352867 + +typedef struct JsonTableExecContext +{ + int magic; + + /* State of the plan providing a row evaluated from "root" jsonpath */ + JsonTablePlanState *rootplanstate; + + /* + * Per-column JsonTablePlanStates for all columns including the nested + * ones. + */ + JsonTablePlanState **colplanstates; +} JsonTableExecContext; + /* strict/lax flags is decomposed into four [un]wrap/error flags */ -#define jspStrictAbsenseOfErrors(cxt) (!(cxt)->laxMode) +#define jspStrictAbsenceOfErrors(cxt) (!(cxt)->laxMode) #define jspAutoUnwrap(cxt) ((cxt)->laxMode) #define jspAutoWrap(cxt) ((cxt)->laxMode) #define jspIgnoreStructuralErrors(cxt) ((cxt)->ignoreStructuralErrors) @@ -174,7 +256,9 @@ typedef JsonPathBool (*JsonPathPredicateCallback) (JsonPathItem *jsp, void *param); typedef Numeric (*BinaryArithmFunc) (Numeric num1, Numeric num2, bool *error); -static JsonPathExecResult executeJsonPath(JsonPath *path, Jsonb *vars, +static JsonPathExecResult executeJsonPath(JsonPath *path, void *vars, + JsonPathGetVarCallback getVar, + JsonPathCountVarsCallback countVars, Jsonb *json, bool throwErrors, JsonValueList *result, bool useTz); static JsonPathExecResult executeItem(JsonPathExecContext *cxt, @@ -225,8 +309,19 @@ static JsonPathExecResult appendBoolResult(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonValueList *found, JsonPathBool res); static void getJsonPathItem(JsonPathExecContext *cxt, JsonPathItem *item, JsonbValue *value); +static JsonbValue *GetJsonPathVar(void *cxt, char *varName, int varNameLen, + JsonbValue *baseObject, int *baseObjectId); +static int CountJsonPathVars(void *cxt); +static void JsonItemFromDatum(Datum val, Oid typid, int32 typmod, + JsonbValue *res); +static void JsonbValueInitNumericDatum(JsonbValue *jbv, Datum num); static void getJsonPathVariable(JsonPathExecContext *cxt, - JsonPathItem *variable, Jsonb *vars, JsonbValue *value); + JsonPathItem *variable, JsonbValue *value); +static int countVariablesFromJsonb(void *varsJsonb); +static JsonbValue *getJsonPathVariableFromJsonb(void *varsJsonb, char *varName, + int varNameLength, + JsonbValue *baseObject, + int *baseObjectId); static int JsonbArraySize(JsonbValue *jb); static JsonPathBool executeComparison(JsonPathItem *cmp, JsonbValue *lv, JsonbValue *rv, void *p); @@ -238,6 +333,7 @@ static JsonPathExecResult getArrayIndex(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonbValue *jb, int32 *index); static JsonBaseObjectInfo setBaseObject(JsonPathExecContext *cxt, JsonbValue *jbv, int32 id); +static void JsonValueListClear(JsonValueList *jvl); static void JsonValueListAppend(JsonValueList *jvl, JsonbValue *jbv); static int JsonValueListLength(const JsonValueList *jvl); static bool JsonValueListIsEmpty(JsonValueList *jvl); @@ -247,13 +343,43 @@ static void JsonValueListInitIterator(const JsonValueList *jvl, JsonValueListIterator *it); static JsonbValue *JsonValueListNext(const JsonValueList *jvl, JsonValueListIterator *it); -static int JsonbType(JsonbValue *jb); static JsonbValue *JsonbInitBinary(JsonbValue *jbv, Jsonb *jb); static int JsonbType(JsonbValue *jb); static JsonbValue *getScalar(JsonbValue *scalar, enum jbvType type); static JsonbValue *wrapItemsInArray(const JsonValueList *items); static int compareDatetime(Datum val1, Oid typid1, Datum val2, Oid typid2, bool useTz, bool *cast_error); +static void checkTimezoneIsUsedForCast(bool useTz, const char *type1, + const char *type2); + +static void JsonTableInitOpaque(TableFuncScanState *state, int natts); +static JsonTablePlanState *JsonTableInitPlan(JsonTableExecContext *cxt, + JsonTablePlan *plan, + JsonTablePlanState *parentstate, + List *args, + MemoryContext mcxt); +static void JsonTableSetDocument(TableFuncScanState *state, Datum value); +static void JsonTableResetRowPattern(JsonTablePlanState *planstate, Datum item); +static bool JsonTableFetchRow(TableFuncScanState *state); +static Datum JsonTableGetValue(TableFuncScanState *state, int colnum, + Oid typid, int32 typmod, bool *isnull); +static void JsonTableDestroyOpaque(TableFuncScanState *state); +static bool JsonTablePlanScanNextRow(JsonTablePlanState *planstate); +static void JsonTableResetNestedPlan(JsonTablePlanState *planstate); +static bool JsonTablePlanJoinNextRow(JsonTablePlanState *planstate); +static bool JsonTablePlanNextRow(JsonTablePlanState *planstate); + +const TableFuncRoutine JsonbTableRoutine = +{ + .InitOpaque = JsonTableInitOpaque, + .SetDocument = JsonTableSetDocument, + .SetNamespace = NULL, + .SetRowFilter = NULL, + .SetColumnFilter = NULL, + .FetchRow = JsonTableFetchRow, + .GetValue = JsonTableGetValue, + .DestroyOpaque = JsonTableDestroyOpaque +}; /****************** User interface to JsonPath executor ********************/ @@ -284,7 +410,9 @@ jsonb_path_exists_internal(FunctionCallInfo fcinfo, bool tz) silent = PG_GETARG_BOOL(3); } - res = executeJsonPath(jp, vars, jb, !silent, NULL, tz); + res = executeJsonPath(jp, vars, getJsonPathVariableFromJsonb, + countVariablesFromJsonb, + jb, !silent, NULL, tz); PG_FREE_IF_COPY(jb, 0); PG_FREE_IF_COPY(jp, 1); @@ -339,7 +467,9 @@ jsonb_path_match_internal(FunctionCallInfo fcinfo, bool tz) silent = PG_GETARG_BOOL(3); } - (void) executeJsonPath(jp, vars, jb, !silent, &found, tz); + (void) executeJsonPath(jp, vars, getJsonPathVariableFromJsonb, + countVariablesFromJsonb, + jb, !silent, &found, tz); PG_FREE_IF_COPY(jb, 0); PG_FREE_IF_COPY(jp, 1); @@ -417,7 +547,9 @@ jsonb_path_query_internal(FunctionCallInfo fcinfo, bool tz) vars = PG_GETARG_JSONB_P_COPY(2); silent = PG_GETARG_BOOL(3); - (void) executeJsonPath(jp, vars, jb, !silent, &found, tz); + (void) executeJsonPath(jp, vars, getJsonPathVariableFromJsonb, + countVariablesFromJsonb, + jb, !silent, &found, tz); funcctx->user_fctx = JsonValueListGetList(&found); @@ -464,7 +596,9 @@ jsonb_path_query_array_internal(FunctionCallInfo fcinfo, bool tz) Jsonb *vars = PG_GETARG_JSONB_P(2); bool silent = PG_GETARG_BOOL(3); - (void) executeJsonPath(jp, vars, jb, !silent, &found, tz); + (void) executeJsonPath(jp, vars, getJsonPathVariableFromJsonb, + countVariablesFromJsonb, + jb, !silent, &found, tz); PG_RETURN_JSONB_P(JsonbValueToJsonb(wrapItemsInArray(&found))); } @@ -495,7 +629,9 @@ jsonb_path_query_first_internal(FunctionCallInfo fcinfo, bool tz) Jsonb *vars = PG_GETARG_JSONB_P(2); bool silent = PG_GETARG_BOOL(3); - (void) executeJsonPath(jp, vars, jb, !silent, &found, tz); + (void) executeJsonPath(jp, vars, getJsonPathVariableFromJsonb, + countVariablesFromJsonb, + jb, !silent, &found, tz); if (JsonValueListLength(&found) >= 1) PG_RETURN_JSONB_P(JsonbValueToJsonb(JsonValueListHead(&found))); @@ -522,6 +658,9 @@ jsonb_path_query_first_tz(PG_FUNCTION_ARGS) * * 'path' - jsonpath to be executed * 'vars' - variables to be substituted to jsonpath + * 'getVar' - callback used by getJsonPathVariable() to extract variables from + * 'vars' + * 'countVars' - callback to count the number of jsonpath variables in 'vars' * 'json' - target document for jsonpath evaluation * 'throwErrors' - whether we should throw suppressible errors * 'result' - list to store result items into @@ -537,8 +676,10 @@ jsonb_path_query_first_tz(PG_FUNCTION_ARGS) * In other case it tries to find all the satisfied result items. */ static JsonPathExecResult -executeJsonPath(JsonPath *path, Jsonb *vars, Jsonb *json, bool throwErrors, - JsonValueList *result, bool useTz) +executeJsonPath(JsonPath *path, void *vars, JsonPathGetVarCallback getVar, + JsonPathCountVarsCallback countVars, + Jsonb *json, bool throwErrors, JsonValueList *result, + bool useTz) { JsonPathExecContext cxt; JsonPathExecResult res; @@ -550,27 +691,21 @@ executeJsonPath(JsonPath *path, Jsonb *vars, Jsonb *json, bool throwErrors, if (!JsonbExtractScalar(&json->root, &jbv)) JsonbInitBinary(&jbv, json); - if (vars && !JsonContainerIsObject(&vars->root)) - { - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("\"vars\" argument is not an object"), - errdetail("Jsonpath parameters should be encoded as key-value pairs of \"vars\" object."))); - } - cxt.vars = vars; + cxt.getVar = getVar; cxt.laxMode = (path->header & JSONPATH_LAX) != 0; cxt.ignoreStructuralErrors = cxt.laxMode; cxt.root = &jbv; cxt.current = &jbv; cxt.baseObject.jbc = NULL; cxt.baseObject.id = 0; - cxt.lastGeneratedObjectId = vars ? 2 : 1; + /* 1 + number of base objects in vars */ + cxt.lastGeneratedObjectId = 1 + countVars(vars); cxt.innermostArraySize = -1; cxt.throwErrors = throwErrors; cxt.useTz = useTz; - if (jspStrictAbsenseOfErrors(&cxt) && !result) + if (jspStrictAbsenceOfErrors(&cxt) && !result) { /* * In strict mode we must get a complete list of values to check that @@ -621,6 +756,37 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, switch (jsp->type) { + case jpiNull: + case jpiBool: + case jpiNumeric: + case jpiString: + case jpiVariable: + { + JsonbValue vbuf; + JsonbValue *v; + bool hasNext = jspGetNext(jsp, &elem); + + if (!hasNext && !found && jsp->type != jpiVariable) + { + /* + * Skip evaluation, but not for variables. We must + * trigger an error for the missing variable. + */ + res = jperOk; + break; + } + + v = hasNext ? &vbuf : palloc(sizeof(*v)); + + baseObject = cxt->baseObject; + getJsonPathItem(cxt, jsp, v); + + res = executeNextItem(cxt, jsp, &elem, + v, found, hasNext); + cxt->baseObject = baseObject; + } + break; + /* all boolean item types: */ case jpiAnd: case jpiOr: @@ -642,63 +808,32 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, break; } - case jpiKey: - if (JsonbType(jb) == jbvObject) - { - JsonbValue *v; - JsonbValue key; - - key.type = jbvString; - key.val.string.val = jspGetString(jsp, &key.val.string.len); - - v = findJsonbValueFromContainer(jb->val.binary.data, - JB_FOBJECT, &key); + case jpiAdd: + return executeBinaryArithmExpr(cxt, jsp, jb, + numeric_add_opt_error, found); - if (v != NULL) - { - res = executeNextItem(cxt, jsp, NULL, - v, found, false); + case jpiSub: + return executeBinaryArithmExpr(cxt, jsp, jb, + numeric_sub_opt_error, found); - /* free value if it was not added to found list */ - if (jspHasNext(jsp) || !found) - pfree(v); - } - else if (!jspIgnoreStructuralErrors(cxt)) - { - Assert(found); + case jpiMul: + return executeBinaryArithmExpr(cxt, jsp, jb, + numeric_mul_opt_error, found); - if (!jspThrowErrors(cxt)) - return jperError; + case jpiDiv: + return executeBinaryArithmExpr(cxt, jsp, jb, + numeric_div_opt_error, found); - ereport(ERROR, - (errcode(ERRCODE_SQL_JSON_MEMBER_NOT_FOUND), \ - errmsg("JSON object does not contain key \"%s\"", - pnstrdup(key.val.string.val, - key.val.string.len)))); - } - } - else if (unwrap && JsonbType(jb) == jbvArray) - return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false); - else if (!jspIgnoreStructuralErrors(cxt)) - { - Assert(found); - RETURN_ERROR(ereport(ERROR, - (errcode(ERRCODE_SQL_JSON_MEMBER_NOT_FOUND), - errmsg("jsonpath member accessor can only be applied to an object")))); - } - break; + case jpiMod: + return executeBinaryArithmExpr(cxt, jsp, jb, + numeric_mod_opt_error, found); - case jpiRoot: - jb = cxt->root; - baseObject = setBaseObject(cxt, jb, 0); - res = executeNextItem(cxt, jsp, NULL, jb, found, true); - cxt->baseObject = baseObject; - break; + case jpiPlus: + return executeUnaryArithmExpr(cxt, jsp, jb, NULL, found); - case jpiCurrent: - res = executeNextItem(cxt, jsp, NULL, cxt->current, - found, true); - break; + case jpiMinus: + return executeUnaryArithmExpr(cxt, jsp, jb, numeric_uminus, + found); case jpiAnyArray: if (JsonbType(jb) == jbvArray) @@ -716,6 +851,30 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, errmsg("jsonpath wildcard array accessor can only be applied to an array")))); break; + case jpiAnyKey: + if (JsonbType(jb) == jbvObject) + { + bool hasNext = jspGetNext(jsp, &elem); + + if (jb->type != jbvBinary) + elog(ERROR, "invalid jsonb object type: %d", jb->type); + + return executeAnyItem + (cxt, hasNext ? &elem : NULL, + jb->val.binary.data, found, 1, 1, 1, + false, jspAutoUnwrap(cxt)); + } + else if (unwrap && JsonbType(jb) == jbvArray) + return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false); + else if (!jspIgnoreStructuralErrors(cxt)) + { + Assert(found); + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_SQL_JSON_OBJECT_NOT_FOUND), + errmsg("jsonpath wildcard member accessor can only be applied to an object")))); + } + break; + case jpiIndexArray: if (JsonbType(jb) == jbvArray || jspAutoWrap(cxt)) { @@ -822,46 +981,70 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, } break; - case jpiLast: + case jpiAny: { - JsonbValue tmpjbv; - JsonbValue *lastjbv; - int last; bool hasNext = jspGetNext(jsp, &elem); - if (cxt->innermostArraySize < 0) - elog(ERROR, "evaluating jsonpath LAST outside of array subscript"); - - if (!hasNext && !found) + /* first try without any intermediate steps */ + if (jsp->content.anybounds.first == 0) { - res = jperOk; - break; - } - - last = cxt->innermostArraySize - 1; + bool savedIgnoreStructuralErrors; - lastjbv = hasNext ? &tmpjbv : palloc(sizeof(*lastjbv)); + savedIgnoreStructuralErrors = cxt->ignoreStructuralErrors; + cxt->ignoreStructuralErrors = true; + res = executeNextItem(cxt, jsp, &elem, + jb, found, true); + cxt->ignoreStructuralErrors = savedIgnoreStructuralErrors; - lastjbv->type = jbvNumeric; - lastjbv->val.numeric = int64_to_numeric(last); + if (res == jperOk && !found) + break; + } - res = executeNextItem(cxt, jsp, &elem, - lastjbv, found, hasNext); + if (jb->type == jbvBinary) + res = executeAnyItem + (cxt, hasNext ? &elem : NULL, + jb->val.binary.data, found, + 1, + jsp->content.anybounds.first, + jsp->content.anybounds.last, + true, jspAutoUnwrap(cxt)); + break; } - break; - case jpiAnyKey: + case jpiKey: if (JsonbType(jb) == jbvObject) { - bool hasNext = jspGetNext(jsp, &elem); + JsonbValue *v; + JsonbValue key; - if (jb->type != jbvBinary) - elog(ERROR, "invalid jsonb object type: %d", jb->type); + key.type = jbvString; + key.val.string.val = jspGetString(jsp, &key.val.string.len); - return executeAnyItem - (cxt, hasNext ? &elem : NULL, - jb->val.binary.data, found, 1, 1, 1, - false, jspAutoUnwrap(cxt)); + v = findJsonbValueFromContainer(jb->val.binary.data, + JB_FOBJECT, &key); + + if (v != NULL) + { + res = executeNextItem(cxt, jsp, NULL, + v, found, false); + + /* free value if it was not added to found list */ + if (jspHasNext(jsp) || !found) + pfree(v); + } + else if (!jspIgnoreStructuralErrors(cxt)) + { + Assert(found); + + if (!jspThrowErrors(cxt)) + return jperError; + + ereport(ERROR, + (errcode(ERRCODE_SQL_JSON_MEMBER_NOT_FOUND), \ + errmsg("JSON object does not contain key \"%s\"", + pnstrdup(key.val.string.val, + key.val.string.len)))); + } } else if (unwrap && JsonbType(jb) == jbvArray) return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false); @@ -869,37 +1052,22 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, { Assert(found); RETURN_ERROR(ereport(ERROR, - (errcode(ERRCODE_SQL_JSON_OBJECT_NOT_FOUND), - errmsg("jsonpath wildcard member accessor can only be applied to an object")))); + (errcode(ERRCODE_SQL_JSON_MEMBER_NOT_FOUND), + errmsg("jsonpath member accessor can only be applied to an object")))); } break; - case jpiAdd: - return executeBinaryArithmExpr(cxt, jsp, jb, - numeric_add_opt_error, found); + case jpiCurrent: + res = executeNextItem(cxt, jsp, NULL, cxt->current, + found, true); + break; - case jpiSub: - return executeBinaryArithmExpr(cxt, jsp, jb, - numeric_sub_opt_error, found); - - case jpiMul: - return executeBinaryArithmExpr(cxt, jsp, jb, - numeric_mul_opt_error, found); - - case jpiDiv: - return executeBinaryArithmExpr(cxt, jsp, jb, - numeric_div_opt_error, found); - - case jpiMod: - return executeBinaryArithmExpr(cxt, jsp, jb, - numeric_mod_opt_error, found); - - case jpiPlus: - return executeUnaryArithmExpr(cxt, jsp, jb, NULL, found); - - case jpiMinus: - return executeUnaryArithmExpr(cxt, jsp, jb, numeric_uminus, - found); + case jpiRoot: + jb = cxt->root; + baseObject = setBaseObject(cxt, jb, 0); + res = executeNextItem(cxt, jsp, NULL, jb, found, true); + cxt->baseObject = baseObject; + break; case jpiFilter: { @@ -919,67 +1087,6 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, break; } - case jpiAny: - { - bool hasNext = jspGetNext(jsp, &elem); - - /* first try without any intermediate steps */ - if (jsp->content.anybounds.first == 0) - { - bool savedIgnoreStructuralErrors; - - savedIgnoreStructuralErrors = cxt->ignoreStructuralErrors; - cxt->ignoreStructuralErrors = true; - res = executeNextItem(cxt, jsp, &elem, - jb, found, true); - cxt->ignoreStructuralErrors = savedIgnoreStructuralErrors; - - if (res == jperOk && !found) - break; - } - - if (jb->type == jbvBinary) - res = executeAnyItem - (cxt, hasNext ? &elem : NULL, - jb->val.binary.data, found, - 1, - jsp->content.anybounds.first, - jsp->content.anybounds.last, - true, jspAutoUnwrap(cxt)); - break; - } - - case jpiNull: - case jpiBool: - case jpiNumeric: - case jpiString: - case jpiVariable: - { - JsonbValue vbuf; - JsonbValue *v; - bool hasNext = jspGetNext(jsp, &elem); - - if (!hasNext && !found && jsp->type != jpiVariable) - { - /* - * Skip evaluation, but not for variables. We must - * trigger an error for the missing variable. - */ - res = jperOk; - break; - } - - v = hasNext ? &vbuf : palloc(sizeof(*v)); - - baseObject = cxt->baseObject; - getJsonPathItem(cxt, jsp, v); - - res = executeNextItem(cxt, jsp, &elem, - v, found, hasNext); - cxt->baseObject = baseObject; - } - break; - case jpiType: { JsonbValue *jbv = palloc(sizeof(*jbv)); @@ -1054,10 +1161,15 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, tmp, (Node *) &escontext); - if (escontext.error_occurred || isinf(val) || isnan(val)) + if (escontext.error_occurred) RETURN_ERROR(ereport(ERROR, (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), - errmsg("numeric argument of jsonpath item method .%s() is out of range for type double precision", + errmsg("argument \"%s\" of jsonpath item method .%s() is invalid for type double precision", + tmp, jspOperationName(jsp->type))))); + if (isinf(val) || isnan(val)) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("NaN or Infinity is not allowed for jsonpath item method .%s()", jspOperationName(jsp->type))))); res = jperOk; } @@ -1075,10 +1187,15 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, tmp, (Node *) &escontext); - if (escontext.error_occurred || isinf(val) || isnan(val)) + if (escontext.error_occurred) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("argument \"%s\" of jsonpath item method .%s() is invalid for type double precision", + tmp, jspOperationName(jsp->type))))); + if (isinf(val) || isnan(val)) RETURN_ERROR(ereport(ERROR, (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), - errmsg("string argument of jsonpath item method .%s() is not a valid representation of a double precision number", + errmsg("NaN or Infinity is not allowed for jsonpath item method .%s()", jspOperationName(jsp->type))))); jb = &jbv; @@ -1098,17 +1215,450 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, } break; - case jpiDatetime: - if (unwrap && JsonbType(jb) == jbvArray) - return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false); + case jpiDatetime: + case jpiDate: + case jpiTime: + case jpiTimeTz: + case jpiTimestamp: + case jpiTimestampTz: + if (unwrap && JsonbType(jb) == jbvArray) + return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false); + + return executeDateTimeMethod(cxt, jsp, jb, found); + + case jpiKeyValue: + if (unwrap && JsonbType(jb) == jbvArray) + return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false); + + return executeKeyValueMethod(cxt, jsp, jb, found); + + case jpiLast: + { + JsonbValue tmpjbv; + JsonbValue *lastjbv; + int last; + bool hasNext = jspGetNext(jsp, &elem); + + if (cxt->innermostArraySize < 0) + elog(ERROR, "evaluating jsonpath LAST outside of array subscript"); + + if (!hasNext && !found) + { + res = jperOk; + break; + } + + last = cxt->innermostArraySize - 1; + + lastjbv = hasNext ? &tmpjbv : palloc(sizeof(*lastjbv)); + + lastjbv->type = jbvNumeric; + lastjbv->val.numeric = int64_to_numeric(last); + + res = executeNextItem(cxt, jsp, &elem, + lastjbv, found, hasNext); + } + break; + + case jpiBigint: + { + JsonbValue jbv; + Datum datum; + + if (unwrap && JsonbType(jb) == jbvArray) + return executeItemUnwrapTargetArray(cxt, jsp, jb, found, + false); + + if (jb->type == jbvNumeric) + { + bool have_error; + int64 val; + + val = numeric_int8_opt_error(jb->val.numeric, &have_error); + if (have_error) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("argument \"%s\" of jsonpath item method .%s() is invalid for type bigint", + DatumGetCString(DirectFunctionCall1(numeric_out, + NumericGetDatum(jb->val.numeric))), + jspOperationName(jsp->type))))); + + datum = Int64GetDatum(val); + res = jperOk; + } + else if (jb->type == jbvString) + { + /* cast string as bigint */ + char *tmp = pnstrdup(jb->val.string.val, + jb->val.string.len); + ErrorSaveContext escontext = {T_ErrorSaveContext}; + bool noerr; + + noerr = DirectInputFunctionCallSafe(int8in, tmp, + InvalidOid, -1, + (Node *) &escontext, + &datum); + + if (!noerr || escontext.error_occurred) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("argument \"%s\" of jsonpath item method .%s() is invalid for type bigint", + tmp, jspOperationName(jsp->type))))); + res = jperOk; + } + + if (res == jperNotFound) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("jsonpath item method .%s() can only be applied to a string or numeric value", + jspOperationName(jsp->type))))); + + jb = &jbv; + jb->type = jbvNumeric; + jb->val.numeric = DatumGetNumeric(DirectFunctionCall1(int8_numeric, + datum)); + + res = executeNextItem(cxt, jsp, NULL, jb, found, true); + } + break; + + case jpiBoolean: + { + JsonbValue jbv; + bool bval; + + if (unwrap && JsonbType(jb) == jbvArray) + return executeItemUnwrapTargetArray(cxt, jsp, jb, found, + false); + + if (jb->type == jbvBool) + { + bval = jb->val.boolean; + + res = jperOk; + } + else if (jb->type == jbvNumeric) + { + int ival; + Datum datum; + bool noerr; + char *tmp = DatumGetCString(DirectFunctionCall1(numeric_out, + NumericGetDatum(jb->val.numeric))); + ErrorSaveContext escontext = {T_ErrorSaveContext}; + + noerr = DirectInputFunctionCallSafe(int4in, tmp, + InvalidOid, -1, + (Node *) &escontext, + &datum); + + if (!noerr || escontext.error_occurred) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("argument \"%s\" of jsonpath item method .%s() is invalid for type boolean", + tmp, jspOperationName(jsp->type))))); + + ival = DatumGetInt32(datum); + if (ival == 0) + bval = false; + else + bval = true; + + res = jperOk; + } + else if (jb->type == jbvString) + { + /* cast string as boolean */ + char *tmp = pnstrdup(jb->val.string.val, + jb->val.string.len); + + if (!parse_bool(tmp, &bval)) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("argument \"%s\" of jsonpath item method .%s() is invalid for type boolean", + tmp, jspOperationName(jsp->type))))); + + res = jperOk; + } + + if (res == jperNotFound) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("jsonpath item method .%s() can only be applied to a boolean, string, or numeric value", + jspOperationName(jsp->type))))); + + jb = &jbv; + jb->type = jbvBool; + jb->val.boolean = bval; + + res = executeNextItem(cxt, jsp, NULL, jb, found, true); + } + break; + + case jpiDecimal: + case jpiNumber: + { + JsonbValue jbv; + Numeric num; + char *numstr = NULL; + + if (unwrap && JsonbType(jb) == jbvArray) + return executeItemUnwrapTargetArray(cxt, jsp, jb, found, + false); + + if (jb->type == jbvNumeric) + { + num = jb->val.numeric; + if (numeric_is_nan(num) || numeric_is_inf(num)) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("NaN or Infinity is not allowed for jsonpath item method .%s()", + jspOperationName(jsp->type))))); + + if (jsp->type == jpiDecimal) + numstr = DatumGetCString(DirectFunctionCall1(numeric_out, + NumericGetDatum(num))); + res = jperOk; + } + else if (jb->type == jbvString) + { + /* cast string as number */ + Datum datum; + bool noerr; + ErrorSaveContext escontext = {T_ErrorSaveContext}; + + numstr = pnstrdup(jb->val.string.val, jb->val.string.len); + + noerr = DirectInputFunctionCallSafe(numeric_in, numstr, + InvalidOid, -1, + (Node *) &escontext, + &datum); + + if (!noerr || escontext.error_occurred) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("argument \"%s\" of jsonpath item method .%s() is invalid for type numeric", + numstr, jspOperationName(jsp->type))))); + + num = DatumGetNumeric(datum); + if (numeric_is_nan(num) || numeric_is_inf(num)) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("NaN or Infinity is not allowed for jsonpath item method .%s()", + jspOperationName(jsp->type))))); + + res = jperOk; + } + + if (res == jperNotFound) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("jsonpath item method .%s() can only be applied to a string or numeric value", + jspOperationName(jsp->type))))); + + /* + * If we have arguments, then they must be the precision and + * optional scale used in .decimal(). Convert them to the + * typmod equivalent and then truncate the numeric value per + * this typmod details. + */ + if (jsp->type == jpiDecimal && jsp->content.args.left) + { + Datum numdatum; + Datum dtypmod; + int32 precision; + int32 scale = 0; + bool have_error; + bool noerr; + ArrayType *arrtypmod; + Datum datums[2]; + char pstr[12]; /* sign, 10 digits and '\0' */ + char sstr[12]; /* sign, 10 digits and '\0' */ + ErrorSaveContext escontext = {T_ErrorSaveContext}; + + jspGetLeftArg(jsp, &elem); + if (elem.type != jpiNumeric) + elog(ERROR, "invalid jsonpath item type for .decimal() precision"); + + precision = numeric_int4_opt_error(jspGetNumeric(&elem), + &have_error); + if (have_error) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("precision of jsonpath item method .%s() is out of range for type integer", + jspOperationName(jsp->type))))); + + if (jsp->content.args.right) + { + jspGetRightArg(jsp, &elem); + if (elem.type != jpiNumeric) + elog(ERROR, "invalid jsonpath item type for .decimal() scale"); + + scale = numeric_int4_opt_error(jspGetNumeric(&elem), + &have_error); + if (have_error) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("scale of jsonpath item method .%s() is out of range for type integer", + jspOperationName(jsp->type))))); + } + + /* + * numerictypmodin() takes the precision and scale in the + * form of CString arrays. + */ + pg_ltoa(precision, pstr); + datums[0] = CStringGetDatum(pstr); + pg_ltoa(scale, sstr); + datums[1] = CStringGetDatum(sstr); + arrtypmod = construct_array_builtin(datums, 2, CSTRINGOID); + + dtypmod = DirectFunctionCall1(numerictypmodin, + PointerGetDatum(arrtypmod)); + + /* Convert numstr to Numeric with typmod */ + Assert(numstr != NULL); + noerr = DirectInputFunctionCallSafe(numeric_in, numstr, + InvalidOid, dtypmod, + (Node *) &escontext, + &numdatum); + + if (!noerr || escontext.error_occurred) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("argument \"%s\" of jsonpath item method .%s() is invalid for type numeric", + numstr, jspOperationName(jsp->type))))); + + num = DatumGetNumeric(numdatum); + pfree(arrtypmod); + } + + jb = &jbv; + jb->type = jbvNumeric; + jb->val.numeric = num; + + res = executeNextItem(cxt, jsp, NULL, jb, found, true); + } + break; + + case jpiInteger: + { + JsonbValue jbv; + Datum datum; + + if (unwrap && JsonbType(jb) == jbvArray) + return executeItemUnwrapTargetArray(cxt, jsp, jb, found, + false); + + if (jb->type == jbvNumeric) + { + bool have_error; + int32 val; + + val = numeric_int4_opt_error(jb->val.numeric, &have_error); + if (have_error) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("argument \"%s\" of jsonpath item method .%s() is invalid for type integer", + DatumGetCString(DirectFunctionCall1(numeric_out, + NumericGetDatum(jb->val.numeric))), + jspOperationName(jsp->type))))); + + datum = Int32GetDatum(val); + res = jperOk; + } + else if (jb->type == jbvString) + { + /* cast string as integer */ + char *tmp = pnstrdup(jb->val.string.val, + jb->val.string.len); + ErrorSaveContext escontext = {T_ErrorSaveContext}; + bool noerr; + + noerr = DirectInputFunctionCallSafe(int4in, tmp, + InvalidOid, -1, + (Node *) &escontext, + &datum); + + if (!noerr || escontext.error_occurred) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("argument \"%s\" of jsonpath item method .%s() is invalid for type integer", + tmp, jspOperationName(jsp->type))))); + res = jperOk; + } + + if (res == jperNotFound) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("jsonpath item method .%s() can only be applied to a string or numeric value", + jspOperationName(jsp->type))))); + + jb = &jbv; + jb->type = jbvNumeric; + jb->val.numeric = DatumGetNumeric(DirectFunctionCall1(int4_numeric, + datum)); + + res = executeNextItem(cxt, jsp, NULL, jb, found, true); + } + break; + + case jpiStringFunc: + { + JsonbValue jbv; + char *tmp = NULL; - return executeDateTimeMethod(cxt, jsp, jb, found); + if (unwrap && JsonbType(jb) == jbvArray) + return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false); - case jpiKeyValue: - if (unwrap && JsonbType(jb) == jbvArray) - return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false); + switch (JsonbType(jb)) + { + case jbvString: + + /* + * Value is not necessarily null-terminated, so we do + * pnstrdup() here. + */ + tmp = pnstrdup(jb->val.string.val, + jb->val.string.len); + break; + case jbvNumeric: + tmp = DatumGetCString(DirectFunctionCall1(numeric_out, + NumericGetDatum(jb->val.numeric))); + break; + case jbvBool: + tmp = (jb->val.boolean) ? "true" : "false"; + break; + case jbvDatetime: + { + char buf[MAXDATELEN + 1]; - return executeKeyValueMethod(cxt, jsp, jb, found); + JsonEncodeDateTime(buf, + jb->val.datetime.value, + jb->val.datetime.typid, + &jb->val.datetime.tz); + tmp = pstrdup(buf); + } + break; + case jbvNull: + case jbvArray: + case jbvObject: + case jbvBinary: + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_NON_NUMERIC_SQL_JSON_ITEM), + errmsg("jsonpath item method .%s() can only be applied to a boolean, string, numeric, or datetime value", + jspOperationName(jsp->type))))); + break; + } + + jb = &jbv; + Assert(tmp != NULL); /* We must have set tmp above */ + jb->val.string.val = tmp; + jb->val.string.len = strlen(jb->val.string.val); + jb->type = jbvString; + + res = executeNextItem(cxt, jsp, NULL, jb, found, true); + } + break; default: elog(ERROR, "unrecognized jsonpath item type: %d", jsp->type); @@ -1232,6 +1782,9 @@ executeBoolItem(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonPathBool res; JsonPathBool res2; + /* since this function recurses, it could be driven to stack overflow */ + check_stack_depth(); + if (!canHaveNext && jspHasNext(jsp)) elog(ERROR, "boolean jsonpath item cannot have next item"); @@ -1318,7 +1871,7 @@ executeBoolItem(JsonPathExecContext *cxt, JsonPathItem *jsp, case jpiExists: jspGetArg(jsp, &larg); - if (jspStrictAbsenseOfErrors(cxt)) + if (jspStrictAbsenceOfErrors(cxt)) { /* * In strict mode we must get a complete list of values to @@ -1516,14 +2069,14 @@ executePredicate(JsonPathExecContext *cxt, JsonPathItem *pred, if (res == jpbUnknown) { - if (jspStrictAbsenseOfErrors(cxt)) + if (jspStrictAbsenceOfErrors(cxt)) return jpbUnknown; error = true; } else if (res == jpbTrue) { - if (!jspStrictAbsenseOfErrors(cxt)) + if (!jspStrictAbsenceOfErrors(cxt)) return jpbTrue; found = true; @@ -1771,11 +2324,16 @@ executeNumericItemMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, } /* - * Implementation of the .datetime() method. + * Implementation of the .datetime() and related methods. * - * Converts a string into a date/time value. The actual type is determined at run time. + * Converts a string into a date/time value. The actual type is determined at + * run time. * If an argument is provided, this argument is used as a template string. * Otherwise, the first fitting ISO format is selected. + * + * .date(), .time(), .time_tz(), .timestamp(), .timestamp_tz() methods don't + * have a format, so ISO format is used. However, except for .date(), they all + * take an optional time precision. */ static JsonPathExecResult executeDateTimeMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, @@ -1791,6 +2349,7 @@ executeDateTimeMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, bool hasNext; JsonPathExecResult res = jperNotFound; JsonPathItem elem; + int32 time_precision = -1; if (!(jb = getScalar(jb, jbvString))) RETURN_ERROR(ereport(ERROR, @@ -1808,7 +2367,11 @@ executeDateTimeMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, */ collid = DEFAULT_COLLATION_OID; - if (jsp->content.arg) + /* + * .datetime(template) has an argument, the rest of the methods don't have + * an argument. So we handle that separately. + */ + if (jsp->type == jpiDatetime && jsp->content.arg) { text *template; char *template_str; @@ -1846,20 +2409,14 @@ executeDateTimeMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, static const char *fmt_str[] = { "yyyy-mm-dd", /* date */ - "HH24:MI:SS.USTZH:TZM", /* timetz */ - "HH24:MI:SS.USTZH", - "HH24:MI:SSTZH:TZM", - "HH24:MI:SSTZH", + "HH24:MI:SS.USTZ", /* timetz */ + "HH24:MI:SSTZ", "HH24:MI:SS.US", /* time without tz */ "HH24:MI:SS", - "yyyy-mm-dd HH24:MI:SS.USTZH:TZM", /* timestamptz */ - "yyyy-mm-dd HH24:MI:SS.USTZH", - "yyyy-mm-dd HH24:MI:SSTZH:TZM", - "yyyy-mm-dd HH24:MI:SSTZH", - "yyyy-mm-dd\"T\"HH24:MI:SS.USTZH:TZM", - "yyyy-mm-dd\"T\"HH24:MI:SS.USTZH", - "yyyy-mm-dd\"T\"HH24:MI:SSTZH:TZM", - "yyyy-mm-dd\"T\"HH24:MI:SSTZH", + "yyyy-mm-dd HH24:MI:SS.USTZ", /* timestamptz */ + "yyyy-mm-dd HH24:MI:SSTZ", + "yyyy-mm-dd\"T\"HH24:MI:SS.USTZ", + "yyyy-mm-dd\"T\"HH24:MI:SSTZ", "yyyy-mm-dd HH24:MI:SS.US", /* timestamp without tz */ "yyyy-mm-dd HH24:MI:SS", "yyyy-mm-dd\"T\"HH24:MI:SS.US", @@ -1870,6 +2427,30 @@ executeDateTimeMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, static text *fmt_txt[lengthof(fmt_str)] = {0}; int i; + /* + * Check for optional precision for methods other than .datetime() and + * .date() + */ + if (jsp->type != jpiDatetime && jsp->type != jpiDate && + jsp->content.arg) + { + bool have_error; + + jspGetArg(jsp, &elem); + + if (elem.type != jpiNumeric) + elog(ERROR, "invalid jsonpath item type for %s argument", + jspOperationName(jsp->type)); + + time_precision = numeric_int4_opt_error(jspGetNumeric(&elem), + &have_error); + if (have_error) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION), + errmsg("time precision of jsonpath item method .%s() is out of range for type integer", + jspOperationName(jsp->type))))); + } + /* loop until datetime format fits */ for (i = 0; i < lengthof(fmt_str); i++) { @@ -1896,11 +2477,299 @@ executeDateTimeMethod(JsonPathExecContext *cxt, JsonPathItem *jsp, } if (res == jperNotFound) - RETURN_ERROR(ereport(ERROR, - (errcode(ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION), - errmsg("datetime format is not recognized: \"%s\"", - text_to_cstring(datetime)), - errhint("Use a datetime template argument to specify the input data format.")))); + { + if (jsp->type == jpiDatetime) + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION), + errmsg("%s format is not recognized: \"%s\"", + "datetime", text_to_cstring(datetime)), + errhint("Use a datetime template argument to specify the input data format.")))); + else + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION), + errmsg("%s format is not recognized: \"%s\"", + jspOperationName(jsp->type), text_to_cstring(datetime))))); + + } + } + + /* + * parse_datetime() processes the entire input string per the template or + * ISO format and returns the Datum in best fitted datetime type. So, if + * this call is for a specific datatype, then we do the conversion here. + * Throw an error for incompatible types. + */ + switch (jsp->type) + { + case jpiDatetime: /* Nothing to do for DATETIME */ + break; + case jpiDate: + { + /* Convert result type to date */ + switch (typid) + { + case DATEOID: /* Nothing to do for DATE */ + break; + case TIMEOID: + case TIMETZOID: + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION), + errmsg("%s format is not recognized: \"%s\"", + "date", text_to_cstring(datetime))))); + break; + case TIMESTAMPOID: + value = DirectFunctionCall1(timestamp_date, + value); + break; + case TIMESTAMPTZOID: + checkTimezoneIsUsedForCast(cxt->useTz, + "timestamptz", "date"); + value = DirectFunctionCall1(timestamptz_date, + value); + break; + default: + elog(ERROR, "type with oid %u not supported", typid); + } + + typid = DATEOID; + } + break; + case jpiTime: + { + /* Convert result type to time without time zone */ + switch (typid) + { + case DATEOID: + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION), + errmsg("%s format is not recognized: \"%s\"", + "time", text_to_cstring(datetime))))); + break; + case TIMEOID: /* Nothing to do for TIME */ + break; + case TIMETZOID: + checkTimezoneIsUsedForCast(cxt->useTz, + "timetz", "time"); + value = DirectFunctionCall1(timetz_time, + value); + break; + case TIMESTAMPOID: + value = DirectFunctionCall1(timestamp_time, + value); + break; + case TIMESTAMPTZOID: + checkTimezoneIsUsedForCast(cxt->useTz, + "timestamptz", "time"); + value = DirectFunctionCall1(timestamptz_time, + value); + break; + default: + elog(ERROR, "type with oid %u not supported", typid); + } + + /* Force the user-given time precision, if any */ + if (time_precision != -1) + { + TimeADT result; + + /* Get a warning when precision is reduced */ + time_precision = anytime_typmod_check(false, + time_precision); + result = DatumGetTimeADT(value); + AdjustTimeForTypmod(&result, time_precision); + value = TimeADTGetDatum(result); + + /* Update the typmod value with the user-given precision */ + typmod = time_precision; + } + + typid = TIMEOID; + } + break; + case jpiTimeTz: + { + /* Convert result type to time with time zone */ + switch (typid) + { + case DATEOID: + case TIMESTAMPOID: + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION), + errmsg("%s format is not recognized: \"%s\"", + "time_tz", text_to_cstring(datetime))))); + break; + case TIMEOID: + checkTimezoneIsUsedForCast(cxt->useTz, + "time", "timetz"); + value = DirectFunctionCall1(time_timetz, + value); + break; + case TIMETZOID: /* Nothing to do for TIMETZ */ + break; + case TIMESTAMPTZOID: + value = DirectFunctionCall1(timestamptz_timetz, + value); + break; + default: + elog(ERROR, "type with oid %u not supported", typid); + } + + /* Force the user-given time precision, if any */ + if (time_precision != -1) + { + TimeTzADT *result; + + /* Get a warning when precision is reduced */ + time_precision = anytime_typmod_check(true, + time_precision); + result = DatumGetTimeTzADTP(value); + AdjustTimeForTypmod(&result->time, time_precision); + value = TimeTzADTPGetDatum(result); + + /* Update the typmod value with the user-given precision */ + typmod = time_precision; + } + + typid = TIMETZOID; + } + break; + case jpiTimestamp: + { + /* Convert result type to timestamp without time zone */ + switch (typid) + { + case DATEOID: + value = DirectFunctionCall1(date_timestamp, + value); + break; + case TIMEOID: + case TIMETZOID: + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION), + errmsg("%s format is not recognized: \"%s\"", + "timestamp", text_to_cstring(datetime))))); + break; + case TIMESTAMPOID: /* Nothing to do for TIMESTAMP */ + break; + case TIMESTAMPTZOID: + checkTimezoneIsUsedForCast(cxt->useTz, + "timestamptz", "timestamp"); + value = DirectFunctionCall1(timestamptz_timestamp, + value); + break; + default: + elog(ERROR, "type with oid %u not supported", typid); + } + + /* Force the user-given time precision, if any */ + if (time_precision != -1) + { + Timestamp result; + ErrorSaveContext escontext = {T_ErrorSaveContext}; + + /* Get a warning when precision is reduced */ + time_precision = anytimestamp_typmod_check(false, + time_precision); + result = DatumGetTimestamp(value); + AdjustTimestampForTypmod(&result, time_precision, + (Node *) &escontext); + if (escontext.error_occurred) /* should not happen */ + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION), + errmsg("time precision of jsonpath item method .%s() is invalid", + jspOperationName(jsp->type))))); + value = TimestampGetDatum(result); + + /* Update the typmod value with the user-given precision */ + typmod = time_precision; + } + + typid = TIMESTAMPOID; + } + break; + case jpiTimestampTz: + { + struct pg_tm tm; + fsec_t fsec; + + /* Convert result type to timestamp with time zone */ + switch (typid) + { + case DATEOID: + checkTimezoneIsUsedForCast(cxt->useTz, + "date", "timestamptz"); + + /* + * Get the timezone value explicitly since JsonbValue + * keeps that separate. + */ + j2date(DatumGetDateADT(value) + POSTGRES_EPOCH_JDATE, + &(tm.tm_year), &(tm.tm_mon), &(tm.tm_mday)); + tm.tm_hour = 0; + tm.tm_min = 0; + tm.tm_sec = 0; + tz = DetermineTimeZoneOffset(&tm, session_timezone); + + value = DirectFunctionCall1(date_timestamptz, + value); + break; + case TIMEOID: + case TIMETZOID: + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION), + errmsg("%s format is not recognized: \"%s\"", + "timestamp_tz", text_to_cstring(datetime))))); + break; + case TIMESTAMPOID: + checkTimezoneIsUsedForCast(cxt->useTz, + "timestamp", "timestamptz"); + + /* + * Get the timezone value explicitly since JsonbValue + * keeps that separate. + */ + if (timestamp2tm(DatumGetTimestamp(value), NULL, &tm, + &fsec, NULL, NULL) == 0) + tz = DetermineTimeZoneOffset(&tm, + session_timezone); + + value = DirectFunctionCall1(timestamp_timestamptz, + value); + break; + case TIMESTAMPTZOID: /* Nothing to do for TIMESTAMPTZ */ + break; + default: + elog(ERROR, "type with oid %u not supported", typid); + } + + /* Force the user-given time precision, if any */ + if (time_precision != -1) + { + Timestamp result; + ErrorSaveContext escontext = {T_ErrorSaveContext}; + + /* Get a warning when precision is reduced */ + time_precision = anytimestamp_typmod_check(true, + time_precision); + result = DatumGetTimestampTz(value); + AdjustTimestampForTypmod(&result, time_precision, + (Node *) &escontext); + if (escontext.error_occurred) /* should not happen */ + RETURN_ERROR(ereport(ERROR, + (errcode(ERRCODE_INVALID_ARGUMENT_FOR_SQL_JSON_DATETIME_FUNCTION), + errmsg("time precision of jsonpath item method .%s() is invalid", + jspOperationName(jsp->type))))); + value = TimestampTzGetDatum(result); + + /* Update the typmod value with the user-given precision */ + typmod = time_precision; + } + + typid = TIMESTAMPTZOID; + } + break; + default: + elog(ERROR, "unrecognized jsonpath item type: %d", jsp->type); } pfree(datetime); @@ -2108,54 +2977,243 @@ getJsonPathItem(JsonPathExecContext *cxt, JsonPathItem *item, &value->val.string.len); break; case jpiVariable: - getJsonPathVariable(cxt, item, cxt->vars, value); + getJsonPathVariable(cxt, item, value); return; default: elog(ERROR, "unexpected jsonpath item type"); } } +/* + * Returns the computed value of a JSON path variable with given name. + */ +static JsonbValue * +GetJsonPathVar(void *cxt, char *varName, int varNameLen, + JsonbValue *baseObject, int *baseObjectId) +{ + JsonPathVariable *var = NULL; + List *vars = cxt; + ListCell *lc; + JsonbValue *result; + int id = 1; + + foreach(lc, vars) + { + JsonPathVariable *curvar = lfirst(lc); + + if (curvar->namelen == varNameLen && + strncmp(curvar->name, varName, varNameLen) == 0) + { + var = curvar; + break; + } + + id++; + } + + if (var == NULL) + { + *baseObjectId = -1; + return NULL; + } + + result = palloc(sizeof(JsonbValue)); + if (var->isnull) + { + *baseObjectId = 0; + result->type = jbvNull; + } + else + JsonItemFromDatum(var->value, var->typid, var->typmod, result); + + *baseObject = *result; + *baseObjectId = id; + + return result; +} + +static int +CountJsonPathVars(void *cxt) +{ + List *vars = (List *) cxt; + + return list_length(vars); +} + + +/* + * Initialize JsonbValue to pass to jsonpath executor from given + * datum value of the specified type. + */ +static void +JsonItemFromDatum(Datum val, Oid typid, int32 typmod, JsonbValue *res) +{ + switch (typid) + { + case BOOLOID: + res->type = jbvBool; + res->val.boolean = DatumGetBool(val); + break; + case NUMERICOID: + JsonbValueInitNumericDatum(res, val); + break; + case INT2OID: + JsonbValueInitNumericDatum(res, DirectFunctionCall1(int2_numeric, val)); + break; + case INT4OID: + JsonbValueInitNumericDatum(res, DirectFunctionCall1(int4_numeric, val)); + break; + case INT8OID: + JsonbValueInitNumericDatum(res, DirectFunctionCall1(int8_numeric, val)); + break; + case FLOAT4OID: + JsonbValueInitNumericDatum(res, DirectFunctionCall1(float4_numeric, val)); + break; + case FLOAT8OID: + JsonbValueInitNumericDatum(res, DirectFunctionCall1(float8_numeric, val)); + break; + case TEXTOID: + case VARCHAROID: + res->type = jbvString; + res->val.string.val = VARDATA_ANY(val); + res->val.string.len = VARSIZE_ANY_EXHDR(val); + break; + case DATEOID: + case TIMEOID: + case TIMETZOID: + case TIMESTAMPOID: + case TIMESTAMPTZOID: + res->type = jbvDatetime; + res->val.datetime.value = val; + res->val.datetime.typid = typid; + res->val.datetime.typmod = typmod; + res->val.datetime.tz = 0; + break; + case JSONBOID: + { + JsonbValue *jbv = res; + Jsonb *jb = DatumGetJsonbP(val); + + if (JsonContainerIsScalar(&jb->root)) + { + bool result PG_USED_FOR_ASSERTS_ONLY; + + result = JsonbExtractScalar(&jb->root, jbv); + Assert(result); + } + else + JsonbInitBinary(jbv, jb); + break; + } + case JSONOID: + { + text *txt = DatumGetTextP(val); + char *str = text_to_cstring(txt); + Jsonb *jb; + + jb = DatumGetJsonbP(DirectFunctionCall1(jsonb_in, + CStringGetDatum(str))); + pfree(str); + + JsonItemFromDatum(JsonbPGetDatum(jb), JSONBOID, -1, res); + break; + } + default: + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("could not convert value of type %s to jsonpath", + format_type_be(typid))); + } +} + +/* Initialize numeric value from the given datum */ +static void +JsonbValueInitNumericDatum(JsonbValue *jbv, Datum num) +{ + jbv->type = jbvNumeric; + jbv->val.numeric = DatumGetNumeric(num); +} + /* * Get the value of variable passed to jsonpath executor */ static void getJsonPathVariable(JsonPathExecContext *cxt, JsonPathItem *variable, - Jsonb *vars, JsonbValue *value) + JsonbValue *value) { char *varName; int varNameLength; - JsonbValue tmp; + JsonbValue baseObject; + int baseObjectId; JsonbValue *v; - if (!vars) + Assert(variable->type == jpiVariable); + varName = jspGetString(variable, &varNameLength); + + if (cxt->vars == NULL || + (v = cxt->getVar(cxt->vars, varName, varNameLength, + &baseObject, &baseObjectId)) == NULL) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("could not find jsonpath variable \"%s\"", + pnstrdup(varName, varNameLength)))); + + if (baseObjectId > 0) { - value->type = jbvNull; - return; + *value = *v; + setBaseObject(cxt, &baseObject, baseObjectId); } +} + +/* + * Definition of JsonPathGetVarCallback for when JsonPathExecContext.vars + * is specified as a jsonb value. + */ +static JsonbValue * +getJsonPathVariableFromJsonb(void *varsJsonb, char *varName, int varNameLength, + JsonbValue *baseObject, int *baseObjectId) +{ + Jsonb *vars = varsJsonb; + JsonbValue tmp; + JsonbValue *result; - Assert(variable->type == jpiVariable); - varName = jspGetString(variable, &varNameLength); tmp.type = jbvString; tmp.val.string.val = varName; tmp.val.string.len = varNameLength; - v = findJsonbValueFromContainer(&vars->root, JB_FOBJECT, &tmp); + result = findJsonbValueFromContainer(&vars->root, JB_FOBJECT, &tmp); - if (v) + if (result == NULL) { - *value = *v; - pfree(v); + *baseObjectId = -1; + return NULL; } - else + + *baseObjectId = 1; + JsonbInitBinary(baseObject, vars); + + return result; +} + +/* + * Definition of JsonPathCountVarsCallback for when JsonPathExecContext.vars + * is specified as a jsonb value. + */ +static int +countVariablesFromJsonb(void *varsJsonb) +{ + Jsonb *vars = varsJsonb; + + if (vars && !JsonContainerIsObject(&vars->root)) { ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("could not find jsonpath variable \"%s\"", - pnstrdup(varName, varNameLength)))); + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("\"vars\" argument is not an object"), + errdetail("Jsonpath parameters should be encoded as key-value pairs of \"vars\" object.")); } - JsonbInitBinary(&tmp, vars); - setBaseObject(cxt, &tmp, 1); + /* count of base objects */ + return vars != NULL ? 1 : 0; } /**************** Support functions for JsonPath execution *****************/ @@ -2444,6 +3502,13 @@ setBaseObject(JsonPathExecContext *cxt, JsonbValue *jbv, int32 id) return baseObject; } +static void +JsonValueListClear(JsonValueList *jvl) +{ + jvl->singleton = NULL; + jvl->list = NIL; +} + static void JsonValueListAppend(JsonValueList *jvl, JsonbValue *jbv) { @@ -2812,3 +3877,618 @@ compareDatetime(Datum val1, Oid typid1, Datum val2, Oid typid2, return DatumGetInt32(DirectFunctionCall2(cmpfunc, val1, val2)); } + +/* + * Executor-callable JSON_EXISTS implementation + * + * Returns NULL instead of throwing errors if 'error' is not NULL, setting + * *error to true. + */ +bool +JsonPathExists(Datum jb, JsonPath *jp, bool *error, List *vars) +{ + JsonPathExecResult res; + + res = executeJsonPath(jp, vars, + GetJsonPathVar, CountJsonPathVars, + DatumGetJsonbP(jb), !error, NULL, true); + + Assert(error || !jperIsError(res)); + + if (error && jperIsError(res)) + *error = true; + + return res == jperOk; +} + +/* + * Executor-callable JSON_QUERY implementation + * + * Returns NULL instead of throwing errors if 'error' is not NULL, setting + * *error to true. *empty is set to true if no match is found. + */ +Datum +JsonPathQuery(Datum jb, JsonPath *jp, JsonWrapper wrapper, bool *empty, + bool *error, List *vars, + const char *column_name) +{ + JsonbValue *singleton; + bool wrap; + JsonValueList found = {0}; + JsonPathExecResult res; + int count; + + res = executeJsonPath(jp, vars, + GetJsonPathVar, CountJsonPathVars, + DatumGetJsonbP(jb), !error, &found, true); + Assert(error || !jperIsError(res)); + if (error && jperIsError(res)) + { + *error = true; + *empty = false; + return (Datum) 0; + } + + /* + * Determine whether to wrap the result in a JSON array or not. + * + * First, count the number of SQL/JSON items in the returned + * JsonValueList. If the list is empty (singleton == NULL), no wrapping is + * necessary. + * + * If the wrapper mode is JSW_NONE or JSW_UNSPEC, wrapping is explicitly + * disabled. This enforces a WITHOUT WRAPPER clause, which is also the + * default when no WRAPPER clause is specified. + * + * If the mode is JSW_UNCONDITIONAL, wrapping is enforced regardless of + * the number of SQL/JSON items, enforcing a WITH WRAPPER or WITH + * UNCONDITIONAL WRAPPER clause. + * + * For JSW_CONDITIONAL, wrapping occurs only if there is more than one + * SQL/JSON item in the list, enforcing a WITH CONDITIONAL WRAPPER clause. + */ + count = JsonValueListLength(&found); + singleton = count > 0 ? JsonValueListHead(&found) : NULL; + if (singleton == NULL) + wrap = false; + else if (wrapper == JSW_NONE || wrapper == JSW_UNSPEC) + wrap = false; + else if (wrapper == JSW_UNCONDITIONAL) + wrap = true; + else if (wrapper == JSW_CONDITIONAL) + wrap = count > 1; + else + { + elog(ERROR, "unrecognized json wrapper %d", (int) wrapper); + wrap = false; + } + + if (wrap) + return JsonbPGetDatum(JsonbValueToJsonb(wrapItemsInArray(&found))); + + /* No wrapping means only one item is expected. */ + if (count > 1) + { + if (error) + { + *error = true; + return (Datum) 0; + } + + if (column_name) + ereport(ERROR, + (errcode(ERRCODE_MORE_THAN_ONE_SQL_JSON_ITEM), + errmsg("JSON path expression for column \"%s\" must return single item when no wrapper is requested", + column_name), + errhint("Use the WITH WRAPPER clause to wrap SQL/JSON items into an array."))); + else + ereport(ERROR, + (errcode(ERRCODE_MORE_THAN_ONE_SQL_JSON_ITEM), + errmsg("JSON path expression in JSON_QUERY must return single item when no wrapper is requested"), + errhint("Use the WITH WRAPPER clause to wrap SQL/JSON items into an array."))); + } + + if (singleton) + return JsonbPGetDatum(JsonbValueToJsonb(singleton)); + + *empty = true; + return PointerGetDatum(NULL); +} + +/* + * Executor-callable JSON_VALUE implementation + * + * Returns NULL instead of throwing errors if 'error' is not NULL, setting + * *error to true. *empty is set to true if no match is found. + */ +JsonbValue * +JsonPathValue(Datum jb, JsonPath *jp, bool *empty, bool *error, List *vars, + const char *column_name) +{ + JsonbValue *res; + JsonValueList found = {0}; + JsonPathExecResult jper PG_USED_FOR_ASSERTS_ONLY; + int count; + + jper = executeJsonPath(jp, vars, GetJsonPathVar, CountJsonPathVars, + DatumGetJsonbP(jb), + !error, &found, true); + + Assert(error || !jperIsError(jper)); + + if (error && jperIsError(jper)) + { + *error = true; + *empty = false; + return NULL; + } + + count = JsonValueListLength(&found); + + *empty = (count == 0); + + if (*empty) + return NULL; + + /* JSON_VALUE expects to get only singletons. */ + if (count > 1) + { + if (error) + { + *error = true; + return NULL; + } + + if (column_name) + ereport(ERROR, + (errcode(ERRCODE_MORE_THAN_ONE_SQL_JSON_ITEM), + errmsg("JSON path expression for column \"%s\" must return single scalar item", + column_name))); + else + ereport(ERROR, + (errcode(ERRCODE_MORE_THAN_ONE_SQL_JSON_ITEM), + errmsg("JSON path expression in JSON_VALUE must return single scalar item"))); + } + + res = JsonValueListHead(&found); + if (res->type == jbvBinary && JsonContainerIsScalar(res->val.binary.data)) + JsonbExtractScalar(res->val.binary.data, res); + + /* JSON_VALUE expects to get only scalars. */ + if (!IsAJsonbScalar(res)) + { + if (error) + { + *error = true; + return NULL; + } + + if (column_name) + ereport(ERROR, + (errcode(ERRCODE_SQL_JSON_SCALAR_REQUIRED), + errmsg("JSON path expression for column \"%s\" must return single scalar item", + column_name))); + else + ereport(ERROR, + (errcode(ERRCODE_SQL_JSON_SCALAR_REQUIRED), + errmsg("JSON path expression in JSON_VALUE must return single scalar item"))); + } + + if (res->type == jbvNull) + return NULL; + + return res; +} + +/************************ JSON_TABLE functions ***************************/ + +/* + * Sanity-checks and returns the opaque JsonTableExecContext from the + * given executor state struct. + */ +static inline JsonTableExecContext * +GetJsonTableExecContext(TableFuncScanState *state, const char *fname) +{ + JsonTableExecContext *result; + + if (!IsA(state, TableFuncScanState)) + elog(ERROR, "%s called with invalid TableFuncScanState", fname); + result = (JsonTableExecContext *) state->opaque; + if (result->magic != JSON_TABLE_EXEC_CONTEXT_MAGIC) + elog(ERROR, "%s called with invalid TableFuncScanState", fname); + + return result; +} + +/* + * JsonTableInitOpaque + * Fill in TableFuncScanState->opaque for processing JSON_TABLE + * + * This initializes the PASSING arguments and the JsonTablePlanState for + * JsonTablePlan given in TableFunc. + */ +static void +JsonTableInitOpaque(TableFuncScanState *state, int natts) +{ + JsonTableExecContext *cxt; + PlanState *ps = &state->ss.ps; + TableFuncScan *tfs = castNode(TableFuncScan, ps->plan); + TableFunc *tf = tfs->tablefunc; + JsonTablePlan *rootplan = (JsonTablePlan *) tf->plan; + JsonExpr *je = castNode(JsonExpr, tf->docexpr); + List *args = NIL; + + cxt = palloc0(sizeof(JsonTableExecContext)); + cxt->magic = JSON_TABLE_EXEC_CONTEXT_MAGIC; + + /* + * Evaluate JSON_TABLE() PASSING arguments to be passed to the jsonpath + * executor via JsonPathVariables. + */ + if (state->passingvalexprs) + { + ListCell *exprlc; + ListCell *namelc; + + Assert(list_length(state->passingvalexprs) == + list_length(je->passing_names)); + forboth(exprlc, state->passingvalexprs, + namelc, je->passing_names) + { + ExprState *state = lfirst_node(ExprState, exprlc); + String *name = lfirst_node(String, namelc); + JsonPathVariable *var = palloc(sizeof(*var)); + + var->name = pstrdup(name->sval); + var->namelen = strlen(var->name); + var->typid = exprType((Node *) state->expr); + var->typmod = exprTypmod((Node *) state->expr); + + /* + * Evaluate the expression and save the value to be returned by + * GetJsonPathVar(). + */ + var->value = ExecEvalExpr(state, ps->ps_ExprContext, + &var->isnull); + + args = lappend(args, var); + } + } + + cxt->colplanstates = palloc(sizeof(JsonTablePlanState *) * + list_length(tf->colvalexprs)); + + /* + * Initialize plan for the root path and, recursively, also any child + * plans that compute the NESTED paths. + */ + cxt->rootplanstate = JsonTableInitPlan(cxt, rootplan, NULL, args, + CurrentMemoryContext); + + state->opaque = cxt; +} + +/* + * JsonTableDestroyOpaque + * Resets state->opaque + */ +static void +JsonTableDestroyOpaque(TableFuncScanState *state) +{ + JsonTableExecContext *cxt = + GetJsonTableExecContext(state, "JsonTableDestroyOpaque"); + + /* not valid anymore */ + cxt->magic = 0; + + state->opaque = NULL; +} + +/* + * JsonTableInitPlan + * Initialize information for evaluating jsonpath in the given + * JsonTablePlan and, recursively, in any child plans + */ +static JsonTablePlanState * +JsonTableInitPlan(JsonTableExecContext *cxt, JsonTablePlan *plan, + JsonTablePlanState *parentstate, + List *args, MemoryContext mcxt) +{ + JsonTablePlanState *planstate = palloc0(sizeof(*planstate)); + + planstate->plan = plan; + planstate->parent = parentstate; + + if (IsA(plan, JsonTablePathScan)) + { + JsonTablePathScan *scan = (JsonTablePathScan *) plan; + int i; + + planstate->path = DatumGetJsonPathP(scan->path->value->constvalue); + planstate->args = args; + planstate->mcxt = AllocSetContextCreate(mcxt, "JsonTableExecContext", + ALLOCSET_DEFAULT_SIZES); + + /* No row pattern evaluated yet. */ + planstate->current.value = PointerGetDatum(NULL); + planstate->current.isnull = true; + + for (i = scan->colMin; i >= 0 && i <= scan->colMax; i++) + cxt->colplanstates[i] = planstate; + + planstate->nested = scan->child ? + JsonTableInitPlan(cxt, scan->child, planstate, args, mcxt) : NULL; + } + else if (IsA(plan, JsonTableSiblingJoin)) + { + JsonTableSiblingJoin *join = (JsonTableSiblingJoin *) plan; + + planstate->left = JsonTableInitPlan(cxt, join->lplan, parentstate, + args, mcxt); + planstate->right = JsonTableInitPlan(cxt, join->rplan, parentstate, + args, mcxt); + } + + return planstate; +} + +/* + * JsonTableSetDocument + * Install the input document and evaluate the row pattern + */ +static void +JsonTableSetDocument(TableFuncScanState *state, Datum value) +{ + JsonTableExecContext *cxt = + GetJsonTableExecContext(state, "JsonTableSetDocument"); + + JsonTableResetRowPattern(cxt->rootplanstate, value); +} + +/* + * Evaluate a JsonTablePlan's jsonpath to get a new row pattern from + * the given context item + */ +static void +JsonTableResetRowPattern(JsonTablePlanState *planstate, Datum item) +{ + JsonTablePathScan *scan = castNode(JsonTablePathScan, planstate->plan); + MemoryContext oldcxt; + JsonPathExecResult res; + Jsonb *js = (Jsonb *) DatumGetJsonbP(item); + + JsonValueListClear(&planstate->found); + + MemoryContextResetOnly(planstate->mcxt); + + oldcxt = MemoryContextSwitchTo(planstate->mcxt); + + res = executeJsonPath(planstate->path, planstate->args, + GetJsonPathVar, CountJsonPathVars, + js, scan->errorOnError, + &planstate->found, + true); + + MemoryContextSwitchTo(oldcxt); + + if (jperIsError(res)) + { + Assert(!scan->errorOnError); + JsonValueListClear(&planstate->found); + } + + /* Reset plan iterator to the beginning of the item list */ + JsonValueListInitIterator(&planstate->found, &planstate->iter); + planstate->current.value = PointerGetDatum(NULL); + planstate->current.isnull = true; + planstate->ordinal = 0; +} + +/* + * Fetch next row from a JsonTablePlan. + * + * Returns false if the plan has run out of rows, true otherwise. + */ +static bool +JsonTablePlanNextRow(JsonTablePlanState *planstate) +{ + if (IsA(planstate->plan, JsonTablePathScan)) + return JsonTablePlanScanNextRow(planstate); + else if (IsA(planstate->plan, JsonTableSiblingJoin)) + return JsonTablePlanJoinNextRow(planstate); + else + elog(ERROR, "invalid JsonTablePlan %d", (int) planstate->plan->type); + + Assert(false); + /* Appease compiler */ + return false; +} + +/* + * Fetch next row from a JsonTablePlan's path evaluation result and from + * any child nested path(s). + * + * Returns true if any of the paths (this or the nested) has more rows to + * return. + * + * By fetching the nested path(s)'s rows based on the parent row at each + * level, this essentially joins the rows of different levels. If a nested + * path at a given level has no matching rows, the columns of that level will + * compute to NULL, making it an OUTER join. + */ +static bool +JsonTablePlanScanNextRow(JsonTablePlanState *planstate) +{ + JsonbValue *jbv; + MemoryContext oldcxt; + + /* + * If planstate already has an active row and there is a nested plan, + * check if it has an active row to join with the former. + */ + if (!planstate->current.isnull) + { + if (planstate->nested && JsonTablePlanNextRow(planstate->nested)) + return true; + } + + /* Fetch new row from the list of found values to set as active. */ + jbv = JsonValueListNext(&planstate->found, &planstate->iter); + + /* End of list? */ + if (jbv == NULL) + { + planstate->current.value = PointerGetDatum(NULL); + planstate->current.isnull = true; + return false; + } + + /* + * Set current row item for subsequent JsonTableGetValue() calls for + * evaluating individual columns. + */ + oldcxt = MemoryContextSwitchTo(planstate->mcxt); + planstate->current.value = JsonbPGetDatum(JsonbValueToJsonb(jbv)); + planstate->current.isnull = false; + MemoryContextSwitchTo(oldcxt); + + /* Next row! */ + planstate->ordinal++; + + /* Process nested plan(s), if any. */ + if (planstate->nested) + { + /* Re-evaluate the nested path using the above parent row. */ + JsonTableResetNestedPlan(planstate->nested); + + /* + * Now fetch the nested plan's current row to be joined against the + * parent row. Any further nested plans' paths will be re-evaluated + * recursively, level at a time, after setting each nested plan's + * current row. + */ + (void) JsonTablePlanNextRow(planstate->nested); + } + + /* There are more rows. */ + return true; +} + +/* + * Re-evaluate the row pattern of a nested plan using the new parent row + * pattern. + */ +static void +JsonTableResetNestedPlan(JsonTablePlanState *planstate) +{ + /* This better be a child plan. */ + Assert(planstate->parent != NULL); + if (IsA(planstate->plan, JsonTablePathScan)) + { + JsonTablePlanState *parent = planstate->parent; + + if (!parent->current.isnull) + JsonTableResetRowPattern(planstate, parent->current.value); + + /* + * If this plan itself has a child nested plan, it will be reset when + * the caller calls JsonTablePlanNextRow() on this plan. + */ + } + else if (IsA(planstate->plan, JsonTableSiblingJoin)) + { + JsonTableResetNestedPlan(planstate->left); + JsonTableResetNestedPlan(planstate->right); + } +} + +/* + * Fetch the next row from a JsonTableSiblingJoin. + * + * This is essentially a UNION between the rows from left and right siblings. + */ +static bool +JsonTablePlanJoinNextRow(JsonTablePlanState *planstate) +{ + + /* Fetch row from left sibling. */ + if (!JsonTablePlanNextRow(planstate->left)) + { + /* + * Left sibling ran out of rows, so start fetching from the right + * sibling. + */ + if (!JsonTablePlanNextRow(planstate->right)) + { + /* Right sibling ran out of row, so there are more rows. */ + return false; + } + } + + return true; +} + +/* + * JsonTableFetchRow + * Prepare the next "current" row for upcoming GetValue calls. + * + * Returns false if no more rows can be returned. + */ +static bool +JsonTableFetchRow(TableFuncScanState *state) +{ + JsonTableExecContext *cxt = + GetJsonTableExecContext(state, "JsonTableFetchRow"); + + return JsonTablePlanNextRow(cxt->rootplanstate); +} + +/* + * JsonTableGetValue + * Return the value for column number 'colnum' for the current row. + * + * This leaks memory, so be sure to reset often the context in which it's + * called. + */ +static Datum +JsonTableGetValue(TableFuncScanState *state, int colnum, + Oid typid, int32 typmod, bool *isnull) +{ + JsonTableExecContext *cxt = + GetJsonTableExecContext(state, "JsonTableGetValue"); + ExprContext *econtext = state->ss.ps.ps_ExprContext; + ExprState *estate = list_nth(state->colvalexprs, colnum); + JsonTablePlanState *planstate = cxt->colplanstates[colnum]; + JsonTablePlanRowSource *current = &planstate->current; + Datum result; + + /* Row pattern value is NULL */ + if (current->isnull) + { + result = (Datum) 0; + *isnull = true; + } + /* Evaluate JsonExpr. */ + else if (estate) + { + Datum saved_caseValue = econtext->caseValue_datum; + bool saved_caseIsNull = econtext->caseValue_isNull; + + /* Pass the row pattern value via CaseTestExpr. */ + econtext->caseValue_datum = current->value; + econtext->caseValue_isNull = false; + + result = ExecEvalExpr(estate, econtext, isnull); + + econtext->caseValue_datum = saved_caseValue; + econtext->caseValue_isNull = saved_caseIsNull; + } + /* ORDINAL column */ + else + { + result = Int32GetDatum(planstate->ordinal); + *isnull = false; + } + + return result; +} diff --git a/src/backend/utils/adt/jsonpath_gram.y b/src/backend/utils/adt/jsonpath_gram.y index adc259d5bf88c..8733a0eac6605 100644 --- a/src/backend/utils/adt/jsonpath_gram.y +++ b/src/backend/utils/adt/jsonpath_gram.y @@ -6,7 +6,7 @@ * * Transforms tokenized jsonpath into tree of JsonPathParseItem structs. * - * Copyright (c) 2019-2023, PostgreSQL Global Development Group + * Copyright (c) 2019-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/jsonpath_gram.y @@ -82,15 +82,18 @@ static bool makeItemLikeRegex(JsonPathParseItem *expr, %token ANY_P STRICT_P LAX_P LAST_P STARTS_P WITH_P LIKE_REGEX_P FLAG_P %token ABS_P SIZE_P TYPE_P FLOOR_P DOUBLE_P CEILING_P KEYVALUE_P %token DATETIME_P +%token BIGINT_P BOOLEAN_P DATE_P DECIMAL_P INTEGER_P NUMBER_P +%token STRINGFUNC_P TIME_P TIME_TZ_P TIMESTAMP_P TIMESTAMP_TZ_P %type result %type scalar_value path_primary expr array_accessor any_path accessor_op key predicate delimited_predicate index_elem starts_with_initial expr_or_predicate - datetime_template opt_datetime_template + datetime_template opt_datetime_template csv_elem + datetime_precision opt_datetime_precision -%type accessor_expr +%type accessor_expr csv_list opt_csv_list %type index_list @@ -248,9 +251,59 @@ accessor_op: | array_accessor { $$ = $1; } | '.' any_path { $$ = $2; } | '.' method '(' ')' { $$ = makeItemType($2); } - | '.' DATETIME_P '(' opt_datetime_template ')' - { $$ = makeItemUnary(jpiDatetime, $4); } | '?' '(' predicate ')' { $$ = makeItemUnary(jpiFilter, $3); } + | '.' DECIMAL_P '(' opt_csv_list ')' + { + if (list_length($4) == 0) + $$ = makeItemBinary(jpiDecimal, NULL, NULL); + else if (list_length($4) == 1) + $$ = makeItemBinary(jpiDecimal, linitial($4), NULL); + else if (list_length($4) == 2) + $$ = makeItemBinary(jpiDecimal, linitial($4), lsecond($4)); + else + ereturn(escontext, false, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid input syntax for type %s", "jsonpath"), + errdetail(".decimal() can only have an optional precision[,scale]."))); + } + | '.' DATETIME_P '(' opt_datetime_template ')' + { $$ = makeItemUnary(jpiDatetime, $4); } + | '.' TIME_P '(' opt_datetime_precision ')' + { $$ = makeItemUnary(jpiTime, $4); } + | '.' TIME_TZ_P '(' opt_datetime_precision ')' + { $$ = makeItemUnary(jpiTimeTz, $4); } + | '.' TIMESTAMP_P '(' opt_datetime_precision ')' + { $$ = makeItemUnary(jpiTimestamp, $4); } + | '.' TIMESTAMP_TZ_P '(' opt_datetime_precision ')' + { $$ = makeItemUnary(jpiTimestampTz, $4); } + ; + +csv_elem: + INT_P + { $$ = makeItemNumeric(&$1); } + | '+' INT_P %prec UMINUS + { $$ = makeItemUnary(jpiPlus, makeItemNumeric(&$2)); } + | '-' INT_P %prec UMINUS + { $$ = makeItemUnary(jpiMinus, makeItemNumeric(&$2)); } + ; + +csv_list: + csv_elem { $$ = list_make1($1); } + | csv_list ',' csv_elem { $$ = lappend($1, $3); } + ; + +opt_csv_list: + csv_list { $$ = $1; } + | /* EMPTY */ { $$ = NULL; } + ; + +datetime_precision: + INT_P { $$ = makeItemNumeric(&$1); } + ; + +opt_datetime_precision: + datetime_precision { $$ = $1; } + | /* EMPTY */ { $$ = NULL; } ; datetime_template: @@ -291,6 +344,17 @@ key_name: | WITH_P | LIKE_REGEX_P | FLAG_P + | BIGINT_P + | BOOLEAN_P + | DATE_P + | DECIMAL_P + | INTEGER_P + | NUMBER_P + | STRINGFUNC_P + | TIME_P + | TIME_TZ_P + | TIMESTAMP_P + | TIMESTAMP_TZ_P ; method: @@ -301,6 +365,12 @@ method: | DOUBLE_P { $$ = jpiDouble; } | CEILING_P { $$ = jpiCeiling; } | KEYVALUE_P { $$ = jpiKeyValue; } + | BIGINT_P { $$ = jpiBigint; } + | BOOLEAN_P { $$ = jpiBoolean; } + | DATE_P { $$ = jpiDate; } + | INTEGER_P { $$ = jpiInteger; } + | NUMBER_P { $$ = jpiNumber; } + | STRINGFUNC_P { $$ = jpiStringFunc; } ; %% diff --git a/src/backend/utils/adt/jsonpath_internal.h b/src/backend/utils/adt/jsonpath_internal.h index 90eea6e96162b..6cd6d8b652da4 100644 --- a/src/backend/utils/adt/jsonpath_internal.h +++ b/src/backend/utils/adt/jsonpath_internal.h @@ -3,7 +3,7 @@ * jsonpath_internal.h * Private definitions for jsonpath scanner & parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/utils/adt/jsonpath_internal.h diff --git a/src/backend/utils/adt/jsonpath_scan.l b/src/backend/utils/adt/jsonpath_scan.l index 0916fc102751b..7acda7783752a 100644 --- a/src/backend/utils/adt/jsonpath_scan.l +++ b/src/backend/utils/adt/jsonpath_scan.l @@ -7,7 +7,7 @@ * Splits jsonpath string into tokens represented as JsonPathString structs. * Decodes unicode and hex escaped strings. * - * Copyright (c) 2019-2023, PostgreSQL Global Development Group + * Copyright (c) 2019-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/jsonpath_scan.l @@ -171,13 +171,13 @@ hex_fail \\x{hexdigit}{0,1} {unicode}*{unicodefail} { jsonpath_yyerror(NULL, escontext, - "invalid unicode sequence"); + "invalid Unicode escape sequence"); yyterminate(); } {hex_fail} { jsonpath_yyerror(NULL, escontext, - "invalid hex character sequence"); + "invalid hexadecimal character sequence"); yyterminate(); } @@ -198,7 +198,7 @@ hex_fail \\x{hexdigit}{0,1} <> { jsonpath_yyerror(NULL, escontext, - "unexpected end of quoted string"); + "unterminated quoted string"); yyterminate(); } @@ -401,24 +401,35 @@ static const JsonPathKeyword keywords[] = { { 2, false, TO_P, "to"}, { 3, false, ABS_P, "abs"}, { 3, false, LAX_P, "lax"}, + { 4, false, DATE_P, "date"}, { 4, false, FLAG_P, "flag"}, { 4, false, LAST_P, "last"}, { 4, true, NULL_P, "null"}, { 4, false, SIZE_P, "size"}, + { 4, false, TIME_P, "time"}, { 4, true, TRUE_P, "true"}, { 4, false, TYPE_P, "type"}, { 4, false, WITH_P, "with"}, { 5, true, FALSE_P, "false"}, { 5, false, FLOOR_P, "floor"}, + { 6, false, BIGINT_P, "bigint"}, { 6, false, DOUBLE_P, "double"}, { 6, false, EXISTS_P, "exists"}, + { 6, false, NUMBER_P, "number"}, { 6, false, STARTS_P, "starts"}, { 6, false, STRICT_P, "strict"}, + { 6, false, STRINGFUNC_P, "string"}, + { 7, false, BOOLEAN_P, "boolean"}, { 7, false, CEILING_P, "ceiling"}, + { 7, false, DECIMAL_P, "decimal"}, + { 7, false, INTEGER_P, "integer"}, + { 7, false, TIME_TZ_P, "time_tz"}, { 7, false, UNKNOWN_P, "unknown"}, { 8, false, DATETIME_P, "datetime"}, { 8, false, KEYVALUE_P, "keyvalue"}, + { 9, false, TIMESTAMP_P, "timestamp"}, { 10,false, LIKE_REGEX_P, "like_regex"}, + { 12,false, TIMESTAMP_TZ_P, "timestamp_tz"}, }; /* Check if current scanstring value is a keyword */ @@ -554,7 +565,7 @@ parsejsonpath(const char *str, int len, struct Node *escontext) jsonpath_scanner_init(str, len); if (jsonpath_yyparse((void *) &parseresult, escontext) != 0) - jsonpath_yyerror(NULL, escontext, "bogus input"); /* shouldn't happen */ + jsonpath_yyerror(NULL, escontext, "invalid input"); /* shouldn't happen */ jsonpath_scanner_finish(); @@ -611,7 +622,7 @@ addUnicodeChar(int ch, struct Node *escontext) else if (!pg_unicode_to_server_noerror(ch, (unsigned char *) cbuf)) ereturn(escontext, false, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("could not convert unicode to server encoding"))); + errmsg("could not convert Unicode to server encoding"))); addstring(false, cbuf, strlen(cbuf)); } return true; diff --git a/src/backend/utils/adt/levenshtein.c b/src/backend/utils/adt/levenshtein.c index 0763daf0e836a..91ffdc0042230 100644 --- a/src/backend/utils/adt/levenshtein.c +++ b/src/backend/utils/adt/levenshtein.c @@ -16,7 +16,7 @@ * PHP 4.0.6 distribution for inspiration. Configurable penalty costs * extension is introduced by Volkan YAZICI (7/95). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -22,7 +22,7 @@ #include "catalog/pg_collation.h" #include "mb/pg_wchar.h" #include "miscadmin.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/pg_locale.h" #include "varatt.h" @@ -95,10 +95,8 @@ SB_lower_char(unsigned char c, pg_locale_t locale, bool locale_is_c) { if (locale_is_c) return pg_ascii_tolower(c); -#ifdef HAVE_LOCALE_T else if (locale) return tolower_l(c, locale->info.lt); -#endif else return pg_tolower(c); } diff --git a/src/backend/utils/adt/like_match.c b/src/backend/utils/adt/like_match.c index 8b2dff6d6e2bc..f2990edff7ed3 100644 --- a/src/backend/utils/adt/like_match.c +++ b/src/backend/utils/adt/like_match.c @@ -16,7 +16,7 @@ * do_like_escape - name of function if wanted - needs CHAREQ and CopyAdvChar * MATCH_LOWER - define for case (4) to specify case folding for 1-byte chars * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/like_match.c diff --git a/src/backend/utils/adt/like_support.c b/src/backend/utils/adt/like_support.c index 9b603d42f3d74..6cd21ba8fede4 100644 --- a/src/backend/utils/adt/like_support.c +++ b/src/backend/utils/adt/like_support.c @@ -23,7 +23,7 @@ * from LIKE to indexscan limits rather harder than one might think ... * but that's the basic idea.) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -37,7 +37,6 @@ #include #include "access/htup_details.h" -#include "access/stratnum.h" #include "catalog/pg_collation.h" #include "catalog/pg_operator.h" #include "catalog/pg_opfamily.h" @@ -62,12 +61,12 @@ typedef enum Pattern_Type_Like_IC, Pattern_Type_Regex, Pattern_Type_Regex_IC, - Pattern_Type_Prefix + Pattern_Type_Prefix, } Pattern_Type; typedef enum { - Pattern_Prefix_None, Pattern_Prefix_Partial, Pattern_Prefix_Exact + Pattern_Prefix_None, Pattern_Prefix_Partial, Pattern_Prefix_Exact, } Pattern_Prefix_Status; static Node *like_regex_support(Node *rawreq, Pattern_Type ptype); @@ -1506,13 +1505,11 @@ pattern_char_isalpha(char c, bool is_multibyte, return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); else if (is_multibyte && IS_HIGHBIT_SET(c)) return true; - else if (locale && locale->provider == COLLPROVIDER_ICU) + else if (locale && locale->provider != COLLPROVIDER_LIBC) return IS_HIGHBIT_SET(c) || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'); -#ifdef HAVE_LOCALE_T else if (locale && locale->provider == COLLPROVIDER_LIBC) return isalpha_l((unsigned char) c, locale->info.lt); -#endif else return isalpha((unsigned char) c); } diff --git a/src/backend/utils/adt/lockfuncs.c b/src/backend/utils/adt/lockfuncs.c index f9b9590997b92..e790f856ab370 100644 --- a/src/backend/utils/adt/lockfuncs.c +++ b/src/backend/utils/adt/lockfuncs.c @@ -3,7 +3,7 @@ * lockfuncs.c * Functions for SQL access to various lock-manager capabilities. * - * Copyright (c) 2002-2023, PostgreSQL Global Development Group + * Copyright (c) 2002-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/lockfuncs.c @@ -13,8 +13,6 @@ #include "postgres.h" #include "access/htup_details.h" -#include "access/xact.h" -#include "catalog/pg_type.h" #include "funcapi.h" #include "miscadmin.h" #include "storage/predicate_internals.h" @@ -24,7 +22,8 @@ /* * This must match enum LockTagType! Also, be sure to document any changes - * in the docs for the pg_locks view and for wait event types. + * in the docs for the pg_locks view and update the WaitEventLOCK section in + * src/backend/utils/activity/wait_event_names.txt. */ const char *const LockTagTypeNames[] = { "relation", @@ -72,15 +71,16 @@ typedef struct * This is currently only used in pg_lock_status, so we put it here. */ static Datum -VXIDGetDatum(BackendId bid, LocalTransactionId lxid) +VXIDGetDatum(ProcNumber procNumber, LocalTransactionId lxid) { /* - * The representation is "/", decimal and unsigned decimal - * respectively. Note that elog.c also knows how to format a vxid. + * The representation is "/", decimal and unsigned + * decimal respectively. Note that elog.c also knows how to format a + * vxid. */ char vxidstr[32]; - snprintf(vxidstr, sizeof(vxidstr), "%d/%u", bid, lxid); + snprintf(vxidstr, sizeof(vxidstr), "%d/%u", procNumber, lxid); return CStringGetTextDatum(vxidstr); } @@ -352,7 +352,7 @@ pg_lock_status(PG_FUNCTION_ARGS) break; } - values[10] = VXIDGetDatum(instance->backend, instance->lxid); + values[10] = VXIDGetDatum(instance->vxid.procNumber, instance->vxid.localTransactionId); if (instance->pid != 0) values[11] = Int32GetDatum(instance->pid); else @@ -418,7 +418,7 @@ pg_lock_status(PG_FUNCTION_ARGS) nulls[9] = true; /* objsubid */ /* lock holder */ - values[10] = VXIDGetDatum(xact->vxid.backendId, + values[10] = VXIDGetDatum(xact->vxid.procNumber, xact->vxid.localTransactionId); if (xact->pid != 0) values[11] = Int32GetDatum(xact->pid); @@ -600,84 +600,6 @@ pg_safe_snapshot_blocking_pids(PG_FUNCTION_ARGS) } -/* - * pg_isolation_test_session_is_blocked - support function for isolationtester - * - * Check if specified PID is blocked by any of the PIDs listed in the second - * argument. Currently, this looks for blocking caused by waiting for - * heavyweight locks or safe snapshots. We ignore blockage caused by PIDs - * not directly under the isolationtester's control, eg autovacuum. - * - * This is an undocumented function intended for use by the isolation tester, - * and may change in future releases as required for testing purposes. - */ -Datum -pg_isolation_test_session_is_blocked(PG_FUNCTION_ARGS) -{ - int blocked_pid = PG_GETARG_INT32(0); - ArrayType *interesting_pids_a = PG_GETARG_ARRAYTYPE_P(1); - ArrayType *blocking_pids_a; - int32 *interesting_pids; - int32 *blocking_pids; - int num_interesting_pids; - int num_blocking_pids; - int dummy; - int i, - j; - - /* Validate the passed-in array */ - Assert(ARR_ELEMTYPE(interesting_pids_a) == INT4OID); - if (array_contains_nulls(interesting_pids_a)) - elog(ERROR, "array must not contain nulls"); - interesting_pids = (int32 *) ARR_DATA_PTR(interesting_pids_a); - num_interesting_pids = ArrayGetNItems(ARR_NDIM(interesting_pids_a), - ARR_DIMS(interesting_pids_a)); - - /* - * Get the PIDs of all sessions blocking the given session's attempt to - * acquire heavyweight locks. - */ - blocking_pids_a = - DatumGetArrayTypeP(DirectFunctionCall1(pg_blocking_pids, blocked_pid)); - - Assert(ARR_ELEMTYPE(blocking_pids_a) == INT4OID); - Assert(!array_contains_nulls(blocking_pids_a)); - blocking_pids = (int32 *) ARR_DATA_PTR(blocking_pids_a); - num_blocking_pids = ArrayGetNItems(ARR_NDIM(blocking_pids_a), - ARR_DIMS(blocking_pids_a)); - - /* - * Check if any of these are in the list of interesting PIDs, that being - * the sessions that the isolation tester is running. We don't use - * "arrayoverlaps" here, because it would lead to cache lookups and one of - * our goals is to run quickly with debug_discard_caches > 0. We expect - * blocking_pids to be usually empty and otherwise a very small number in - * isolation tester cases, so make that the outer loop of a naive search - * for a match. - */ - for (i = 0; i < num_blocking_pids; i++) - for (j = 0; j < num_interesting_pids; j++) - { - if (blocking_pids[i] == interesting_pids[j]) - PG_RETURN_BOOL(true); - } - - /* - * Check if blocked_pid is waiting for a safe snapshot. We could in - * theory check the resulting array of blocker PIDs against the - * interesting PIDs list, but since there is no danger of autovacuum - * blocking GetSafeSnapshot there seems to be no point in expending cycles - * on allocating a buffer and searching for overlap; so it's presently - * sufficient for the isolation tester's purposes to use a single element - * buffer and check if the number of safe snapshot blockers is non-zero. - */ - if (GetSafeSnapshotBlockingPids(blocked_pid, &dummy, 1) > 0) - PG_RETURN_BOOL(true); - - PG_RETURN_BOOL(false); -} - - /* * Functions for manipulating advisory locks * diff --git a/src/backend/utils/adt/mac.c b/src/backend/utils/adt/mac.c index 6abf9485af2fc..ae4caedef5054 100644 --- a/src/backend/utils/adt/mac.c +++ b/src/backend/utils/adt/mac.c @@ -3,7 +3,7 @@ * mac.c * PostgreSQL type definitions for 6 byte, EUI-48, MAC addresses. * - * Portions Copyright (c) 1998-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1998-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/mac.c @@ -17,7 +17,7 @@ #include "lib/hyperloglog.h" #include "libpq/pqformat.h" #include "port/pg_bswap.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/guc.h" #include "utils/inet.h" #include "utils/sortsupport.h" diff --git a/src/backend/utils/adt/mac8.c b/src/backend/utils/adt/mac8.c index 25bb6c16666ca..996d912e8d06c 100644 --- a/src/backend/utils/adt/mac8.c +++ b/src/backend/utils/adt/mac8.c @@ -11,7 +11,7 @@ * The following code is written with the assumption that the OUI field * size is 24 bits. * - * Portions Copyright (c) 1998-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1998-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/mac8.c @@ -23,7 +23,8 @@ #include "common/hashfn.h" #include "libpq/pqformat.h" -#include "utils/builtins.h" +#include "nodes/nodes.h" +#include "utils/fmgrprotos.h" #include "utils/inet.h" /* diff --git a/src/backend/utils/adt/mcxtfuncs.c b/src/backend/utils/adt/mcxtfuncs.c index 92ca5b2f728ce..4d4a70915bb3a 100644 --- a/src/backend/utils/adt/mcxtfuncs.c +++ b/src/backend/utils/adt/mcxtfuncs.c @@ -3,7 +3,7 @@ * mcxtfuncs.c * Functions to show backend memory context. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -16,7 +16,6 @@ #include "postgres.h" #include "funcapi.h" -#include "miscadmin.h" #include "mb/pg_wchar.h" #include "storage/proc.h" #include "storage/procarray.h" @@ -146,21 +145,13 @@ pg_log_backend_memory_contexts(PG_FUNCTION_ARGS) { int pid = PG_GETARG_INT32(0); PGPROC *proc; - BackendId backendId = InvalidBackendId; - - proc = BackendPidGetProc(pid); + ProcNumber procNumber = INVALID_PROC_NUMBER; /* * See if the process with given pid is a backend or an auxiliary process. - * - * If the given process is a backend, use its backend id in - * SendProcSignal() later to speed up the operation. Otherwise, don't do - * that because auxiliary processes (except the startup process) don't - * have a valid backend id. */ - if (proc != NULL) - backendId = proc->backendId; - else + proc = BackendPidGetProc(pid); + if (proc == NULL) proc = AuxiliaryPidGetProc(pid); /* @@ -183,7 +174,8 @@ pg_log_backend_memory_contexts(PG_FUNCTION_ARGS) PG_RETURN_BOOL(false); } - if (SendProcSignal(pid, PROCSIG_LOG_MEMORY_CONTEXT, backendId) < 0) + procNumber = GetNumberFromPGProc(proc); + if (SendProcSignal(pid, PROCSIG_LOG_MEMORY_CONTEXT, procNumber) < 0) { /* Again, just a warning to allow loops */ ereport(WARNING, diff --git a/src/backend/utils/adt/meson.build b/src/backend/utils/adt/meson.build index 8515cd9365049..8c6fc80c373b2 100644 --- a/src/backend/utils/adt/meson.build +++ b/src/backend/utils/adt/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'acl.c', @@ -69,6 +69,7 @@ backend_sources += files( 'pg_lsn.c', 'pg_upgrade_support.c', 'pgstatfuncs.c', + 'pseudorandomfuncs.c', 'pseudotypes.c', 'quote.c', 'rangetypes.c', @@ -102,6 +103,7 @@ backend_sources += files( 'varchar.c', 'varlena.c', 'version.c', + 'waitfuncs.c', 'windowfuncs.c', 'xid.c', 'xid8funcs.c', diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c index 5d78d6dc060e6..0e6c45807a1ec 100644 --- a/src/backend/utils/adt/misc.c +++ b/src/backend/utils/adt/misc.c @@ -3,7 +3,7 @@ * misc.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,7 +23,6 @@ #include "access/sysattr.h" #include "access/table.h" -#include "catalog/catalog.h" #include "catalog/pg_tablespace.h" #include "catalog/pg_type.h" #include "catalog/system_fk_info.h" @@ -45,6 +44,7 @@ #include "utils/fmgroids.h" #include "utils/lsyscache.h" #include "utils/ruleutils.h" +#include "utils/syscache.h" #include "utils/timestamp.h" @@ -567,6 +567,50 @@ pg_typeof(PG_FUNCTION_ARGS) } +/* + * Return the base type of the argument. + * If the given type is a domain, return its base type; + * otherwise return the type's own OID. + * Return NULL if the type OID doesn't exist or points to a + * non-existent base type. + * + * This is a SQL-callable version of getBaseType(). Unlike that function, + * we don't want to fail for a bogus type OID; this is helpful to keep race + * conditions from turning into query failures when scanning the catalogs. + * Hence we need our own implementation. + */ +Datum +pg_basetype(PG_FUNCTION_ARGS) +{ + Oid typid = PG_GETARG_OID(0); + + /* + * We loop to find the bottom base type in a stack of domains. + */ + for (;;) + { + HeapTuple tup; + Form_pg_type typTup; + + tup = SearchSysCache1(TYPEOID, ObjectIdGetDatum(typid)); + if (!HeapTupleIsValid(tup)) + PG_RETURN_NULL(); /* return NULL for bogus OID */ + typTup = (Form_pg_type) GETSTRUCT(tup); + if (typTup->typtype != TYPTYPE_DOMAIN) + { + /* Not a domain, so done */ + ReleaseSysCache(tup); + break; + } + + typid = typTup->typbasetype; + ReleaseSysCache(tup); + } + + PG_RETURN_OID(typid); +} + + /* * Implementation of the COLLATE FOR expression; returns the collation * of the argument. diff --git a/src/backend/utils/adt/multirangetypes.c b/src/backend/utils/adt/multirangetypes.c index 9443c2b884a04..558c6c18c3466 100644 --- a/src/backend/utils/adt/multirangetypes.c +++ b/src/backend/utils/adt/multirangetypes.c @@ -21,7 +21,7 @@ * for a particular range index. Offsets are counted starting from the end of * flags aligned to the bound type. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -37,14 +37,13 @@ #include "funcapi.h" #include "lib/stringinfo.h" #include "libpq/pqformat.h" -#include "miscadmin.h" +#include "nodes/nodes.h" #include "port/pg_bitutils.h" +#include "utils/array.h" #include "utils/builtins.h" #include "utils/lsyscache.h" -#include "utils/rangetypes.h" #include "utils/multirangetypes.h" -#include "utils/array.h" -#include "utils/memutils.h" +#include "utils/rangetypes.h" /* fn_extra cache entry for one of the range I/O functions */ typedef struct MultirangeIOData @@ -331,7 +330,7 @@ multirange_out(PG_FUNCTION_ARGS) } /* - * Binary representation: First a int32-sized count of ranges, followed by + * Binary representation: First an int32-sized count of ranges, followed by * ranges in their native binary representation. */ Datum diff --git a/src/backend/utils/adt/multirangetypes_selfuncs.c b/src/backend/utils/adt/multirangetypes_selfuncs.c index cefc4710fd473..9e8558b599288 100644 --- a/src/backend/utils/adt/multirangetypes_selfuncs.c +++ b/src/backend/utils/adt/multirangetypes_selfuncs.c @@ -6,7 +6,7 @@ * Estimates are based on histograms of lower and upper bounds, and the * fraction of empty multiranges. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,12 +22,11 @@ #include "access/htup_details.h" #include "catalog/pg_operator.h" #include "catalog/pg_statistic.h" -#include "catalog/pg_type.h" #include "utils/float.h" #include "utils/fmgrprotos.h" #include "utils/lsyscache.h" -#include "utils/rangetypes.h" #include "utils/multirangetypes.h" +#include "utils/rangetypes.h" #include "utils/selfuncs.h" #include "utils/typcache.h" diff --git a/src/backend/utils/adt/name.c b/src/backend/utils/adt/name.c index c136eabdbc90e..85c9db85f3123 100644 --- a/src/backend/utils/adt/name.c +++ b/src/backend/utils/adt/name.c @@ -9,7 +9,7 @@ * always use NAMEDATALEN as the symbolic constant! - jolly 8/21/95 * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/utils/adt/network_gist.c b/src/backend/utils/adt/network_gist.c index 32cde28f00ea6..15feb449b554e 100644 --- a/src/backend/utils/adt/network_gist.c +++ b/src/backend/utils/adt/network_gist.c @@ -34,7 +34,7 @@ * twice as fast as for a simpler design in which a single field doubles as * the common prefix length and the minimum ip_bits value. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -49,7 +49,7 @@ #include "access/gist.h" #include "access/stratnum.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/inet.h" #include "varatt.h" diff --git a/src/backend/utils/adt/network_selfuncs.c b/src/backend/utils/adt/network_selfuncs.c index 315985215c339..98eec81b09c0a 100644 --- a/src/backend/utils/adt/network_selfuncs.c +++ b/src/backend/utils/adt/network_selfuncs.c @@ -7,7 +7,7 @@ * operators. Estimates are based on null fraction, most common values, * and histogram of inet/cidr columns. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,7 +23,7 @@ #include "access/htup_details.h" #include "catalog/pg_operator.h" #include "catalog/pg_statistic.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/inet.h" #include "utils/lsyscache.h" #include "utils/selfuncs.h" diff --git a/src/backend/utils/adt/network_spgist.c b/src/backend/utils/adt/network_spgist.c index 5d3697306c04c..d18cf64c341d3 100644 --- a/src/backend/utils/adt/network_spgist.c +++ b/src/backend/utils/adt/network_spgist.c @@ -21,7 +21,7 @@ * the address family, everything goes into node 0 (which will probably * lead to creating an allTheSame tuple). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -35,7 +35,7 @@ #include "access/spgist.h" #include "catalog/pg_type.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/inet.h" #include "varatt.h" diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index 3c3184f15b569..57386aabdfed9 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -11,7 +11,7 @@ * Transactions on Mathematical Software, Vol. 24, No. 4, December 1998, * pages 359-367. * - * Copyright (c) 1998-2023, PostgreSQL Global Development Group + * Copyright (c) 1998-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/numeric.c @@ -26,7 +26,6 @@ #include #include -#include "catalog/pg_type.h" #include "common/hashfn.h" #include "common/int.h" #include "funcapi.h" @@ -250,6 +249,13 @@ struct NumericData | ((n)->choice.n_short.n_header & NUMERIC_SHORT_WEIGHT_MASK)) \ : ((n)->choice.n_long.n_weight)) +/* + * Maximum weight of a stored Numeric value (based on the use of int16 for the + * weight in NumericLong). Note that intermediate values held in NumericVar + * and NumericSumAccum variables may have much larger weights. + */ +#define NUMERIC_WEIGHT_MAX PG_INT16_MAX + /* ---------- * NumericVar is the format we use for arithmetic. The digit-array part * is the same as the NumericData storage format, but the header is more @@ -584,6 +590,8 @@ static void power_var(const NumericVar *base, const NumericVar *exp, static void power_var_int(const NumericVar *base, int exp, int exp_dscale, NumericVar *result); static void power_ten_int(int exp, NumericVar *result); +static void random_var(pg_prng_state *state, const NumericVar *rmin, + const NumericVar *rmax, NumericVar *result); static int cmp_abs(const NumericVar *var1, const NumericVar *var2); static int cmp_abs_common(const NumericDigit *var1digits, int var1ndigits, @@ -1544,10 +1552,15 @@ numeric_round(PG_FUNCTION_ARGS) PG_RETURN_NUMERIC(duplicate_numeric(num)); /* - * Limit the scale value to avoid possible overflow in calculations + * Limit the scale value to avoid possible overflow in calculations. + * + * These limits are based on the maximum number of digits a Numeric value + * can have before and after the decimal point, but we must allow for one + * extra digit before the decimal point, in case the most significant + * digit rounds up; we must check if that causes Numeric overflow. */ - scale = Max(scale, -NUMERIC_MAX_RESULT_SCALE); - scale = Min(scale, NUMERIC_MAX_RESULT_SCALE); + scale = Max(scale, -(NUMERIC_WEIGHT_MAX + 1) * DEC_DIGITS - 1); + scale = Min(scale, NUMERIC_DSCALE_MAX); /* * Unpack the argument and round it at the proper digit position @@ -1593,10 +1606,13 @@ numeric_trunc(PG_FUNCTION_ARGS) PG_RETURN_NUMERIC(duplicate_numeric(num)); /* - * Limit the scale value to avoid possible overflow in calculations + * Limit the scale value to avoid possible overflow in calculations. + * + * These limits are based on the maximum number of digits a Numeric value + * can have before and after the decimal point. */ - scale = Max(scale, -NUMERIC_MAX_RESULT_SCALE); - scale = Min(scale, NUMERIC_MAX_RESULT_SCALE); + scale = Max(scale, -(NUMERIC_WEIGHT_MAX + 1) * DEC_DIGITS); + scale = Min(scale, NUMERIC_DSCALE_MAX); /* * Unpack the argument and truncate it at the proper digit position @@ -4220,6 +4236,56 @@ numeric_trim_scale(PG_FUNCTION_ARGS) PG_RETURN_NUMERIC(res); } +/* + * Return a random numeric value in the range [rmin, rmax]. + */ +Numeric +random_numeric(pg_prng_state *state, Numeric rmin, Numeric rmax) +{ + NumericVar rmin_var; + NumericVar rmax_var; + NumericVar result; + Numeric res; + + /* Range bounds must not be NaN/infinity */ + if (NUMERIC_IS_SPECIAL(rmin)) + { + if (NUMERIC_IS_NAN(rmin)) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("lower bound cannot be NaN")); + else + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("lower bound cannot be infinity")); + } + if (NUMERIC_IS_SPECIAL(rmax)) + { + if (NUMERIC_IS_NAN(rmax)) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("upper bound cannot be NaN")); + else + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("upper bound cannot be infinity")); + } + + /* Return a random value in the range [rmin, rmax] */ + init_var_from_num(rmin, &rmin_var); + init_var_from_num(rmax, &rmax_var); + + init_var(&result); + + random_var(state, &rmin_var, &rmax_var, &result); + + res = make_result(&result); + + free_var(&result); + + return res; +} + /* ---------------------------------------------------------------------- * @@ -4430,35 +4496,62 @@ int8_numeric(PG_FUNCTION_ARGS) PG_RETURN_NUMERIC(int64_to_numeric(val)); } - -Datum -numeric_int8(PG_FUNCTION_ARGS) +int64 +numeric_int8_opt_error(Numeric num, bool *have_error) { - Numeric num = PG_GETARG_NUMERIC(0); NumericVar x; int64 result; + if (have_error) + *have_error = false; + if (NUMERIC_IS_SPECIAL(num)) { - if (NUMERIC_IS_NAN(num)) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot convert NaN to %s", "bigint"))); + if (have_error) + { + *have_error = true; + return 0; + } else - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("cannot convert infinity to %s", "bigint"))); + { + if (NUMERIC_IS_NAN(num)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot convert NaN to %s", "bigint"))); + else + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot convert infinity to %s", "bigint"))); + } } - /* Convert to variable format and thence to int8 */ + /* Convert to variable format, then convert to int8 */ init_var_from_num(num, &x); if (!numericvar_to_int64(&x, &result)) - ereport(ERROR, - (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), - errmsg("bigint out of range"))); + { + if (have_error) + { + *have_error = true; + return 0; + } + else + { + ereport(ERROR, + (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("bigint out of range"))); + } + } - PG_RETURN_INT64(result); + return result; +} + +Datum +numeric_int8(PG_FUNCTION_ARGS) +{ + Numeric num = PG_GETARG_NUMERIC(0); + + PG_RETURN_INT64(numeric_int8_opt_error(num, NULL)); } @@ -5190,12 +5283,11 @@ numeric_avg_deserialize(PG_FUNCTION_ARGS) init_var(&tmp_var); /* - * Copy the bytea into a StringInfo so that we can "receive" it using the - * standard recv-function infrastructure. + * Initialize a StringInfo so that we can "receive" it using the standard + * recv-function infrastructure. */ - initStringInfo(&buf); - appendBinaryStringInfo(&buf, - VARDATA_ANY(sstate), VARSIZE_ANY_EXHDR(sstate)); + initReadOnlyStringInfo(&buf, VARDATA_ANY(sstate), + VARSIZE_ANY_EXHDR(sstate)); result = makeNumericAggStateCurrentContext(false); @@ -5222,7 +5314,6 @@ numeric_avg_deserialize(PG_FUNCTION_ARGS) result->nInfcount = pq_getmsgint64(&buf); pq_getmsgend(&buf); - pfree(buf.data); free_var(&tmp_var); @@ -5306,12 +5397,11 @@ numeric_deserialize(PG_FUNCTION_ARGS) init_var(&tmp_var); /* - * Copy the bytea into a StringInfo so that we can "receive" it using the - * standard recv-function infrastructure. + * Initialize a StringInfo so that we can "receive" it using the standard + * recv-function infrastructure. */ - initStringInfo(&buf); - appendBinaryStringInfo(&buf, - VARDATA_ANY(sstate), VARSIZE_ANY_EXHDR(sstate)); + initReadOnlyStringInfo(&buf, VARDATA_ANY(sstate), + VARSIZE_ANY_EXHDR(sstate)); result = makeNumericAggStateCurrentContext(false); @@ -5342,7 +5432,6 @@ numeric_deserialize(PG_FUNCTION_ARGS) result->nInfcount = pq_getmsgint64(&buf); pq_getmsgend(&buf); - pfree(buf.data); free_var(&tmp_var); @@ -5677,12 +5766,11 @@ numeric_poly_deserialize(PG_FUNCTION_ARGS) init_var(&tmp_var); /* - * Copy the bytea into a StringInfo so that we can "receive" it using the - * standard recv-function infrastructure. + * Initialize a StringInfo so that we can "receive" it using the standard + * recv-function infrastructure. */ - initStringInfo(&buf); - appendBinaryStringInfo(&buf, - VARDATA_ANY(sstate), VARSIZE_ANY_EXHDR(sstate)); + initReadOnlyStringInfo(&buf, VARDATA_ANY(sstate), + VARSIZE_ANY_EXHDR(sstate)); result = makePolyNumAggStateCurrentContext(false); @@ -5706,7 +5794,6 @@ numeric_poly_deserialize(PG_FUNCTION_ARGS) #endif pq_getmsgend(&buf); - pfree(buf.data); free_var(&tmp_var); @@ -5868,12 +5955,11 @@ int8_avg_deserialize(PG_FUNCTION_ARGS) init_var(&tmp_var); /* - * Copy the bytea into a StringInfo so that we can "receive" it using the - * standard recv-function infrastructure. + * Initialize a StringInfo so that we can "receive" it using the standard + * recv-function infrastructure. */ - initStringInfo(&buf); - appendBinaryStringInfo(&buf, - VARDATA_ANY(sstate), VARSIZE_ANY_EXHDR(sstate)); + initReadOnlyStringInfo(&buf, VARDATA_ANY(sstate), + VARSIZE_ANY_EXHDR(sstate)); result = makePolyNumAggStateCurrentContext(false); @@ -5889,7 +5975,6 @@ int8_avg_deserialize(PG_FUNCTION_ARGS) #endif pq_getmsgend(&buf); - pfree(buf.data); free_var(&tmp_var); @@ -7206,7 +7291,7 @@ set_var_from_non_decimal_integer_str(const char *str, const char *cp, int sign, add_var(dest, &tmp_var, dest); /* Result will overflow if weight overflows int16 */ - if (dest->weight > SHRT_MAX) + if (dest->weight > NUMERIC_WEIGHT_MAX) goto out_of_range; /* Begin a new group */ @@ -7243,7 +7328,7 @@ set_var_from_non_decimal_integer_str(const char *str, const char *cp, int sign, add_var(dest, &tmp_var, dest); /* Result will overflow if weight overflows int16 */ - if (dest->weight > SHRT_MAX) + if (dest->weight > NUMERIC_WEIGHT_MAX) goto out_of_range; /* Begin a new group */ @@ -7280,7 +7365,7 @@ set_var_from_non_decimal_integer_str(const char *str, const char *cp, int sign, add_var(dest, &tmp_var, dest); /* Result will overflow if weight overflows int16 */ - if (dest->weight > SHRT_MAX) + if (dest->weight > NUMERIC_WEIGHT_MAX) goto out_of_range; /* Begin a new group */ @@ -7316,7 +7401,7 @@ set_var_from_non_decimal_integer_str(const char *str, const char *cp, int sign, int64_to_numericvar(tmp, &tmp_var); add_var(dest, &tmp_var, dest); - if (dest->weight > SHRT_MAX) + if (dest->weight > NUMERIC_WEIGHT_MAX) goto out_of_range; dest->sign = sign; @@ -10955,7 +11040,8 @@ power_var(const NumericVar *base, const NumericVar *exp, NumericVar *result) /* * Set the scale for the low-precision calculation, computing ln(base) to * around 8 significant digits. Note that ln_dweight may be as small as - * -SHRT_MAX, so the scale may exceed NUMERIC_MAX_DISPLAY_SCALE here. + * -NUMERIC_DSCALE_MAX, so the scale may exceed NUMERIC_MAX_DISPLAY_SCALE + * here. */ local_rscale = 8 - ln_dweight; local_rscale = Max(local_rscale, NUMERIC_MIN_DISPLAY_SCALE); @@ -11063,7 +11149,7 @@ power_var_int(const NumericVar *base, int exp, int exp_dscale, f = 0; /* result is 0 or 1 (weight 0), or error */ /* overflow/underflow tests with fuzz factors */ - if (f > (SHRT_MAX + 1) * DEC_DIGITS) + if (f > (NUMERIC_WEIGHT_MAX + 1) * DEC_DIGITS) ereport(ERROR, (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), errmsg("value overflows numeric format"))); @@ -11194,7 +11280,8 @@ power_var_int(const NumericVar *base, int exp, int exp_dscale, * int16, the final result is guaranteed to overflow (or underflow, if * exp < 0), so we can give up before wasting too many cycles. */ - if (base_prod.weight > SHRT_MAX || result->weight > SHRT_MAX) + if (base_prod.weight > NUMERIC_WEIGHT_MAX || + result->weight > NUMERIC_WEIGHT_MAX) { /* overflow, unless neg, in which case result should be 0 */ if (!neg) @@ -11244,6 +11331,173 @@ power_ten_int(int exp, NumericVar *result) result->digits[0] *= 10; } +/* + * random_var() - return a random value in the range [rmin, rmax]. + */ +static void +random_var(pg_prng_state *state, const NumericVar *rmin, + const NumericVar *rmax, NumericVar *result) +{ + int rscale; + NumericVar rlen; + int res_ndigits; + int n; + int pow10; + int i; + uint64 rlen64; + int rlen64_ndigits; + + rscale = Max(rmin->dscale, rmax->dscale); + + /* Compute rlen = rmax - rmin and check the range bounds */ + init_var(&rlen); + sub_var(rmax, rmin, &rlen); + + if (rlen.sign == NUMERIC_NEG) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("lower bound must be less than or equal to upper bound")); + + /* Special case for an empty range */ + if (rlen.ndigits == 0) + { + set_var_from_var(rmin, result); + result->dscale = rscale; + free_var(&rlen); + return; + } + + /* + * Otherwise, select a random value in the range [0, rlen = rmax - rmin], + * and shift it to the required range by adding rmin. + */ + + /* Required result digits */ + res_ndigits = rlen.weight + 1 + (rscale + DEC_DIGITS - 1) / DEC_DIGITS; + + /* + * To get the required rscale, the final result digit must be a multiple + * of pow10 = 10^n, where n = (-rscale) mod DEC_DIGITS. + */ + n = ((rscale + DEC_DIGITS - 1) / DEC_DIGITS) * DEC_DIGITS - rscale; + pow10 = 1; + for (i = 0; i < n; i++) + pow10 *= 10; + + /* + * To choose a random value uniformly from the range [0, rlen], we choose + * from the slightly larger range [0, rlen2], where rlen2 is formed from + * rlen by copying the first 4 NBASE digits, and setting all remaining + * decimal digits to "9". + * + * Without loss of generality, we can ignore the weight of rlen2 and treat + * it as a pure integer for the purposes of this discussion. The process + * above gives rlen2 + 1 = rlen64 * 10^N, for some integer N, where rlen64 + * is a 64-bit integer formed from the first 4 NBASE digits copied from + * rlen. Since this trivially factors into smaller pieces that fit in + * 64-bit integers, the task of choosing a random value uniformly from the + * rlen2 + 1 possible values in [0, rlen2] is much simpler. + * + * If the random value selected is too large, it is rejected, and we try + * again until we get a result <= rlen, ensuring that the overall result + * is uniform (no particular value is any more likely than any other). + * + * Since rlen64 holds 4 NBASE digits from rlen, it contains at least + * DEC_DIGITS * 3 + 1 decimal digits (i.e., at least 13 decimal digits, + * when DEC_DIGITS is 4). Therefore the probability of needing to reject + * the value chosen and retry is less than 1e-13. + */ + rlen64 = (uint64) rlen.digits[0]; + rlen64_ndigits = 1; + while (rlen64_ndigits < res_ndigits && rlen64_ndigits < 4) + { + rlen64 *= NBASE; + if (rlen64_ndigits < rlen.ndigits) + rlen64 += rlen.digits[rlen64_ndigits]; + rlen64_ndigits++; + } + + /* Loop until we get a result <= rlen */ + do + { + NumericDigit *res_digits; + uint64 rand; + int whole_ndigits; + + alloc_var(result, res_ndigits); + result->sign = NUMERIC_POS; + result->weight = rlen.weight; + result->dscale = rscale; + res_digits = result->digits; + + /* + * Set the first rlen64_ndigits using a random value in [0, rlen64]. + * + * If this is the whole result, and rscale is not a multiple of + * DEC_DIGITS (pow10 from above is not 1), then we need this to be a + * multiple of pow10. + */ + if (rlen64_ndigits == res_ndigits && pow10 != 1) + rand = pg_prng_uint64_range(state, 0, rlen64 / pow10) * pow10; + else + rand = pg_prng_uint64_range(state, 0, rlen64); + + for (i = rlen64_ndigits - 1; i >= 0; i--) + { + res_digits[i] = (NumericDigit) (rand % NBASE); + rand = rand / NBASE; + } + + /* + * Set the remaining digits to random values in range [0, NBASE), + * noting that the last digit needs to be a multiple of pow10. + */ + whole_ndigits = res_ndigits; + if (pow10 != 1) + whole_ndigits--; + + /* Set whole digits in groups of 4 for best performance */ + i = rlen64_ndigits; + while (i < whole_ndigits - 3) + { + rand = pg_prng_uint64_range(state, 0, + (uint64) NBASE * NBASE * NBASE * NBASE - 1); + res_digits[i++] = (NumericDigit) (rand % NBASE); + rand = rand / NBASE; + res_digits[i++] = (NumericDigit) (rand % NBASE); + rand = rand / NBASE; + res_digits[i++] = (NumericDigit) (rand % NBASE); + rand = rand / NBASE; + res_digits[i++] = (NumericDigit) rand; + } + + /* Remaining whole digits */ + while (i < whole_ndigits) + { + rand = pg_prng_uint64_range(state, 0, NBASE - 1); + res_digits[i++] = (NumericDigit) rand; + } + + /* Final partial digit (multiple of pow10) */ + if (i < res_ndigits) + { + rand = pg_prng_uint64_range(state, 0, NBASE / pow10 - 1) * pow10; + res_digits[i] = (NumericDigit) rand; + } + + /* Remove leading/trailing zeroes */ + strip_var(result); + + /* If result > rlen, try again */ + + } while (cmp_var(result, &rlen) > 0); + + /* Offset the result to the required range */ + add_var(result, rmin, result); + + free_var(&rlen); +} + /* ---------------------------------------------------------------------- * diff --git a/src/backend/utils/adt/numutils.c b/src/backend/utils/adt/numutils.c index 471fbb7ee63e6..adc1e8a4cba20 100644 --- a/src/backend/utils/adt/numutils.c +++ b/src/backend/utils/adt/numutils.c @@ -3,7 +3,7 @@ * numutils.c * utility functions for I/O of built-in numeric types. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,9 +18,8 @@ #include #include -#include "common/int.h" -#include "utils/builtins.h" #include "port/pg_bitutils.h" +#include "utils/builtins.h" /* * A table of all two-digit numbers. This is used to speed up decimal digit @@ -97,9 +96,18 @@ static const int8 hexlookup[128] = { }; /* - * Convert input string to a signed 16 bit integer. + * Convert input string to a signed 16 bit integer. Input strings may be + * expressed in base-10, hexadecimal, octal, or binary format, all of which + * can be prefixed by an optional sign character, either '+' (the default) or + * '-' for negative numbers. Hex strings are recognized by the digits being + * prefixed by 0x or 0X while octal strings are recognized by the 0o or 0O + * prefix. The binary representation is recognized by the 0b or 0B prefix. * - * Allows any number of leading or trailing whitespace characters. + * Allows any number of leading or trailing whitespace characters. Digits may + * optionally be separated by a single underscore character. These can only + * come between digits and not before or after the digits. Underscores have + * no effect on the return value and are supported only to assist in improving + * the human readability of the input strings. * * pg_strtoint16() will throw ereport() upon bad input format or overflow; * while pg_strtoint16_safe() instead returns such complaints in *escontext, @@ -122,9 +130,84 @@ pg_strtoint16_safe(const char *s, Node *escontext) const char *firstdigit; uint16 tmp = 0; bool neg = false; + unsigned char digit; + + /* + * The majority of cases are likely to be base-10 digits without any + * underscore separator characters. We'll first try to parse the string + * with the assumption that's the case and only fallback on a slower + * implementation which handles hex, octal and binary strings and + * underscores if the fastpath version cannot parse the string. + */ + + /* leave it up to the slow path to look for leading spaces */ + + if (*ptr == '-') + { + ptr++; + neg = true; + } + + /* a leading '+' is uncommon so leave that for the slow path */ + + /* process the first digit */ + digit = (*ptr - '0'); + + /* + * Exploit unsigned arithmetic to save having to check both the upper and + * lower bounds of the digit. + */ + if (likely(digit < 10)) + { + ptr++; + tmp = digit; + } + else + { + /* we need at least one digit */ + goto slow; + } + + /* process remaining digits */ + for (;;) + { + digit = (*ptr - '0'); + + if (digit >= 10) + break; + + ptr++; + + if (unlikely(tmp > -(PG_INT16_MIN / 10))) + goto out_of_range; + + tmp = tmp * 10 + digit; + } + + /* when the string does not end in a digit, let the slow path handle it */ + if (unlikely(*ptr != '\0')) + goto slow; + + if (neg) + { + /* check the negative equivalent will fit without overflowing */ + if (unlikely(tmp > (uint16) (-(PG_INT16_MIN + 1)) + 1)) + goto out_of_range; + return -((int16) tmp); + } + + if (unlikely(tmp > PG_INT16_MAX)) + goto out_of_range; + + return (int16) tmp; + +slow: + tmp = 0; + ptr = s; + /* no need to reset neg */ /* skip leading spaces */ - while (likely(*ptr) && isspace((unsigned char) *ptr)) + while (isspace((unsigned char) *ptr)) ptr++; /* handle sign */ @@ -141,7 +224,7 @@ pg_strtoint16_safe(const char *s, Node *escontext) { firstdigit = ptr += 2; - while (*ptr) + for (;;) { if (isxdigit((unsigned char) *ptr)) { @@ -165,7 +248,7 @@ pg_strtoint16_safe(const char *s, Node *escontext) { firstdigit = ptr += 2; - while (*ptr) + for (;;) { if (*ptr >= '0' && *ptr <= '7') { @@ -189,7 +272,7 @@ pg_strtoint16_safe(const char *s, Node *escontext) { firstdigit = ptr += 2; - while (*ptr) + for (;;) { if (*ptr >= '0' && *ptr <= '1') { @@ -213,9 +296,9 @@ pg_strtoint16_safe(const char *s, Node *escontext) { firstdigit = ptr; - while (*ptr) + for (;;) { - if (isdigit((unsigned char) *ptr)) + if (*ptr >= '0' && *ptr <= '9') { if (unlikely(tmp > -(PG_INT16_MIN / 10))) goto out_of_range; @@ -242,7 +325,7 @@ pg_strtoint16_safe(const char *s, Node *escontext) goto invalid_syntax; /* allow trailing whitespace, but not other trailing chars */ - while (*ptr != '\0' && isspace((unsigned char) *ptr)) + while (isspace((unsigned char) *ptr)) ptr++; if (unlikely(*ptr != '\0')) @@ -275,9 +358,18 @@ pg_strtoint16_safe(const char *s, Node *escontext) } /* - * Convert input string to a signed 32 bit integer. + * Convert input string to a signed 32 bit integer. Input strings may be + * expressed in base-10, hexadecimal, octal, or binary format, all of which + * can be prefixed by an optional sign character, either '+' (the default) or + * '-' for negative numbers. Hex strings are recognized by the digits being + * prefixed by 0x or 0X while octal strings are recognized by the 0o or 0O + * prefix. The binary representation is recognized by the 0b or 0B prefix. * - * Allows any number of leading or trailing whitespace characters. + * Allows any number of leading or trailing whitespace characters. Digits may + * optionally be separated by a single underscore character. These can only + * come between digits and not before or after the digits. Underscores have + * no effect on the return value and are supported only to assist in improving + * the human readability of the input strings. * * pg_strtoint32() will throw ereport() upon bad input format or overflow; * while pg_strtoint32_safe() instead returns such complaints in *escontext, @@ -300,9 +392,84 @@ pg_strtoint32_safe(const char *s, Node *escontext) const char *firstdigit; uint32 tmp = 0; bool neg = false; + unsigned char digit; + + /* + * The majority of cases are likely to be base-10 digits without any + * underscore separator characters. We'll first try to parse the string + * with the assumption that's the case and only fallback on a slower + * implementation which handles hex, octal and binary strings and + * underscores if the fastpath version cannot parse the string. + */ + + /* leave it up to the slow path to look for leading spaces */ + + if (*ptr == '-') + { + ptr++; + neg = true; + } + + /* a leading '+' is uncommon so leave that for the slow path */ + + /* process the first digit */ + digit = (*ptr - '0'); + + /* + * Exploit unsigned arithmetic to save having to check both the upper and + * lower bounds of the digit. + */ + if (likely(digit < 10)) + { + ptr++; + tmp = digit; + } + else + { + /* we need at least one digit */ + goto slow; + } + + /* process remaining digits */ + for (;;) + { + digit = (*ptr - '0'); + + if (digit >= 10) + break; + + ptr++; + + if (unlikely(tmp > -(PG_INT32_MIN / 10))) + goto out_of_range; + + tmp = tmp * 10 + digit; + } + + /* when the string does not end in a digit, let the slow path handle it */ + if (unlikely(*ptr != '\0')) + goto slow; + + if (neg) + { + /* check the negative equivalent will fit without overflowing */ + if (unlikely(tmp > (uint32) (-(PG_INT32_MIN + 1)) + 1)) + goto out_of_range; + return -((int32) tmp); + } + + if (unlikely(tmp > PG_INT32_MAX)) + goto out_of_range; + + return (int32) tmp; + +slow: + tmp = 0; + ptr = s; + /* no need to reset neg */ /* skip leading spaces */ - while (likely(*ptr) && isspace((unsigned char) *ptr)) + while (isspace((unsigned char) *ptr)) ptr++; /* handle sign */ @@ -319,7 +486,7 @@ pg_strtoint32_safe(const char *s, Node *escontext) { firstdigit = ptr += 2; - while (*ptr) + for (;;) { if (isxdigit((unsigned char) *ptr)) { @@ -343,7 +510,7 @@ pg_strtoint32_safe(const char *s, Node *escontext) { firstdigit = ptr += 2; - while (*ptr) + for (;;) { if (*ptr >= '0' && *ptr <= '7') { @@ -367,7 +534,7 @@ pg_strtoint32_safe(const char *s, Node *escontext) { firstdigit = ptr += 2; - while (*ptr) + for (;;) { if (*ptr >= '0' && *ptr <= '1') { @@ -391,9 +558,9 @@ pg_strtoint32_safe(const char *s, Node *escontext) { firstdigit = ptr; - while (*ptr) + for (;;) { - if (isdigit((unsigned char) *ptr)) + if (*ptr >= '0' && *ptr <= '9') { if (unlikely(tmp > -(PG_INT32_MIN / 10))) goto out_of_range; @@ -420,7 +587,7 @@ pg_strtoint32_safe(const char *s, Node *escontext) goto invalid_syntax; /* allow trailing whitespace, but not other trailing chars */ - while (*ptr != '\0' && isspace((unsigned char) *ptr)) + while (isspace((unsigned char) *ptr)) ptr++; if (unlikely(*ptr != '\0')) @@ -453,9 +620,18 @@ pg_strtoint32_safe(const char *s, Node *escontext) } /* - * Convert input string to a signed 64 bit integer. + * Convert input string to a signed 64 bit integer. Input strings may be + * expressed in base-10, hexadecimal, octal, or binary format, all of which + * can be prefixed by an optional sign character, either '+' (the default) or + * '-' for negative numbers. Hex strings are recognized by the digits being + * prefixed by 0x or 0X while octal strings are recognized by the 0o or 0O + * prefix. The binary representation is recognized by the 0b or 0B prefix. * - * Allows any number of leading or trailing whitespace characters. + * Allows any number of leading or trailing whitespace characters. Digits may + * optionally be separated by a single underscore character. These can only + * come between digits and not before or after the digits. Underscores have + * no effect on the return value and are supported only to assist in improving + * the human readability of the input strings. * * pg_strtoint64() will throw ereport() upon bad input format or overflow; * while pg_strtoint64_safe() instead returns such complaints in *escontext, @@ -478,9 +654,84 @@ pg_strtoint64_safe(const char *s, Node *escontext) const char *firstdigit; uint64 tmp = 0; bool neg = false; + unsigned char digit; + + /* + * The majority of cases are likely to be base-10 digits without any + * underscore separator characters. We'll first try to parse the string + * with the assumption that's the case and only fallback on a slower + * implementation which handles hex, octal and binary strings and + * underscores if the fastpath version cannot parse the string. + */ + + /* leave it up to the slow path to look for leading spaces */ + + if (*ptr == '-') + { + ptr++; + neg = true; + } + + /* a leading '+' is uncommon so leave that for the slow path */ + + /* process the first digit */ + digit = (*ptr - '0'); + + /* + * Exploit unsigned arithmetic to save having to check both the upper and + * lower bounds of the digit. + */ + if (likely(digit < 10)) + { + ptr++; + tmp = digit; + } + else + { + /* we need at least one digit */ + goto slow; + } + + /* process remaining digits */ + for (;;) + { + digit = (*ptr - '0'); + + if (digit >= 10) + break; + + ptr++; + + if (unlikely(tmp > -(PG_INT64_MIN / 10))) + goto out_of_range; + + tmp = tmp * 10 + digit; + } + + /* when the string does not end in a digit, let the slow path handle it */ + if (unlikely(*ptr != '\0')) + goto slow; + + if (neg) + { + /* check the negative equivalent will fit without overflowing */ + if (unlikely(tmp > (uint64) (-(PG_INT64_MIN + 1)) + 1)) + goto out_of_range; + return -((int64) tmp); + } + + if (unlikely(tmp > PG_INT64_MAX)) + goto out_of_range; + + return (int64) tmp; + +slow: + tmp = 0; + ptr = s; + /* no need to reset neg */ /* skip leading spaces */ - while (*ptr && isspace((unsigned char) *ptr)) + while (isspace((unsigned char) *ptr)) ptr++; /* handle sign */ @@ -497,7 +748,7 @@ pg_strtoint64_safe(const char *s, Node *escontext) { firstdigit = ptr += 2; - while (*ptr) + for (;;) { if (isxdigit((unsigned char) *ptr)) { @@ -521,7 +772,7 @@ pg_strtoint64_safe(const char *s, Node *escontext) { firstdigit = ptr += 2; - while (*ptr) + for (;;) { if (*ptr >= '0' && *ptr <= '7') { @@ -545,7 +796,7 @@ pg_strtoint64_safe(const char *s, Node *escontext) { firstdigit = ptr += 2; - while (*ptr) + for (;;) { if (*ptr >= '0' && *ptr <= '1') { @@ -569,9 +820,9 @@ pg_strtoint64_safe(const char *s, Node *escontext) { firstdigit = ptr; - while (*ptr) + for (;;) { - if (isdigit((unsigned char) *ptr)) + if (*ptr >= '0' && *ptr <= '9') { if (unlikely(tmp > -(PG_INT64_MIN / 10))) goto out_of_range; @@ -598,7 +849,7 @@ pg_strtoint64_safe(const char *s, Node *escontext) goto invalid_syntax; /* allow trailing whitespace, but not other trailing chars */ - while (*ptr != '\0' && isspace((unsigned char) *ptr)) + while (isspace((unsigned char) *ptr)) ptr++; if (unlikely(*ptr != '\0')) @@ -639,7 +890,7 @@ pg_strtoint64_safe(const char *s, Node *escontext) * so that caller can parse the rest. Otherwise, it's an error if anything * but whitespace follows. * - * typname is what is reported in error messges. + * typname is what is reported in error messages. * * If escontext points to an ErrorSaveContext node, that is filled instead * of throwing an error; the caller must check SOFT_ERROR_OCCURRED() @@ -726,7 +977,7 @@ uint32in_subr(const char *s, char **endloc, * so that caller can parse the rest. Otherwise, it's an error if anything * but whitespace follows. * - * typname is what is reported in error messges. + * typname is what is reported in error messages. * * If escontext points to an ErrorSaveContext node, that is filled instead * of throwing an error; the caller must check SOFT_ERROR_OCCURRED() diff --git a/src/backend/utils/adt/oid.c b/src/backend/utils/adt/oid.c index 3f7af5b3a0661..56fb1fd77cee5 100644 --- a/src/backend/utils/adt/oid.c +++ b/src/backend/utils/adt/oid.c @@ -3,7 +3,7 @@ * oid.c * Functions for the built-in type Oid ... also oidvector. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -18,6 +18,7 @@ #include #include "catalog/pg_type.h" +#include "common/int.h" #include "libpq/pqformat.h" #include "nodes/miscnodes.h" #include "nodes/value.h" @@ -259,11 +260,7 @@ oid_cmp(const void *p1, const void *p2) Oid v1 = *((const Oid *) p1); Oid v2 = *((const Oid *) p2); - if (v1 < v2) - return -1; - if (v1 > v2) - return 1; - return 0; + return pg_cmp_u32(v1, v2); } diff --git a/src/backend/utils/adt/oracle_compat.c b/src/backend/utils/adt/oracle_compat.c index 3b5b794afb389..b126a7d460dc3 100644 --- a/src/backend/utils/adt/oracle_compat.c +++ b/src/backend/utils/adt/oracle_compat.c @@ -2,7 +2,7 @@ * oracle_compat.c * Oracle compatible functions. * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * Author: Edmund Mergl * Multibyte enhancement: Tatsuo Ishii diff --git a/src/backend/utils/adt/orderedsetaggs.c b/src/backend/utils/adt/orderedsetaggs.c index 2582a5cf459db..04b3f31827e53 100644 --- a/src/backend/utils/adt/orderedsetaggs.c +++ b/src/backend/utils/adt/orderedsetaggs.c @@ -3,7 +3,7 @@ * orderedsetaggs.c * Ordered-set aggregate functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -24,10 +24,8 @@ #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" #include "utils/array.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/lsyscache.h" -#include "utils/memutils.h" -#include "utils/timestamp.h" #include "utils/tuplesort.h" diff --git a/src/backend/utils/adt/partitionfuncs.c b/src/backend/utils/adt/partitionfuncs.c index 70e4c1308c93e..fe19007970d28 100644 --- a/src/backend/utils/adt/partitionfuncs.c +++ b/src/backend/utils/adt/partitionfuncs.c @@ -3,7 +3,7 @@ * partitionfuncs.c * Functions for accessing partition-related metadata * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,7 +19,6 @@ #include "catalog/partition.h" #include "catalog/pg_class.h" #include "catalog/pg_inherits.h" -#include "catalog/pg_type.h" #include "funcapi.h" #include "utils/fmgrprotos.h" #include "utils/lsyscache.h" diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c index c8b36f3af2f15..4c85a01b28479 100644 --- a/src/backend/utils/adt/pg_locale.c +++ b/src/backend/utils/adt/pg_locale.c @@ -2,7 +2,7 @@ * * PostgreSQL locale utilities * - * Portions Copyright (c) 2002-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2002-2024, PostgreSQL Global Development Group * * src/backend/utils/adt/pg_locale.c * @@ -56,7 +56,7 @@ #include "access/htup_details.h" #include "catalog/pg_collation.h" -#include "catalog/pg_control.h" +#include "common/string.h" #include "mb/pg_wchar.h" #include "miscadmin.h" #include "utils/builtins.h" @@ -81,6 +81,10 @@ #include #endif +/* Error triggered for locale-sensitive subroutines */ +#define PGLOCALE_SUPPORT_ERROR(provider) \ + elog(ERROR, "unsupported collprovider for %s: %c", __func__, provider) + /* * This should be large enough that most strings will fit, but small enough * that we feel comfortable putting it on the stack @@ -154,6 +158,43 @@ static void icu_set_collation_attributes(UCollator *collator, const char *loc, UErrorCode *status); #endif +/* + * POSIX doesn't define _l-variants of these functions, but several systems + * have them. We provide our own replacements here. + */ +#ifndef HAVE_MBSTOWCS_L +static size_t +mbstowcs_l(wchar_t *dest, const char *src, size_t n, locale_t loc) +{ +#ifdef WIN32 + return _mbstowcs_l(dest, src, n, loc); +#else + size_t result; + locale_t save_locale = uselocale(loc); + + result = mbstowcs(dest, src, n); + uselocale(save_locale); + return result; +#endif +} +#endif +#ifndef HAVE_WCSTOMBS_L +static size_t +wcstombs_l(char *dest, const wchar_t *src, size_t n, locale_t loc) +{ +#ifdef WIN32 + return _wcstombs_l(dest, src, n, loc); +#else + size_t result; + locale_t save_locale = uselocale(loc); + + result = wcstombs(dest, src, n); + uselocale(save_locale); + return result; +#endif +} +#endif + /* * pg_perm_setlocale * @@ -277,6 +318,16 @@ check_locale(int category, const char *locale, char **canonname) char *save; char *res; + /* Don't let Windows' non-ASCII locale names in. */ + if (!pg_is_ascii(locale)) + { + ereport(WARNING, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("locale name \"%s\" contains non-ASCII characters", + locale))); + return false; + } + if (canonname) *canonname = NULL; /* in case of failure */ @@ -299,6 +350,18 @@ check_locale(int category, const char *locale, char **canonname) elog(WARNING, "failed to restore old locale \"%s\"", save); pfree(save); + /* Don't let Windows' non-ASCII locale names out. */ + if (canonname && *canonname && !pg_is_ascii(*canonname)) + { + ereport(WARNING, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("locale name \"%s\" contains non-ASCII characters", + *canonname))); + pfree(*canonname); + *canonname = NULL; + return false; + } + return (res != NULL); } @@ -1228,7 +1291,18 @@ lookup_collation_cache(Oid collation, bool set_flags) elog(ERROR, "cache lookup failed for collation %u", collation); collform = (Form_pg_collation) GETSTRUCT(tp); - if (collform->collprovider == COLLPROVIDER_LIBC) + if (collform->collprovider == COLLPROVIDER_BUILTIN) + { + Datum datum; + const char *colllocale; + + datum = SysCacheGetAttrNotNull(COLLOID, tp, Anum_pg_collation_colllocale); + colllocale = TextDatumGetCString(datum); + + cache_entry->collate_is_c = true; + cache_entry->ctype_is_c = (strcmp(colllocale, "C") == 0); + } + else if (collform->collprovider == COLLPROVIDER_LIBC) { Datum datum; const char *collcollate; @@ -1279,16 +1353,30 @@ lc_collate_is_c(Oid collation) if (collation == DEFAULT_COLLATION_OID) { static int result = -1; - char *localeptr; - - if (default_locale.provider == COLLPROVIDER_ICU) - return false; + const char *localeptr; if (result >= 0) return (bool) result; - localeptr = setlocale(LC_COLLATE, NULL); - if (!localeptr) - elog(ERROR, "invalid LC_COLLATE setting"); + + if (default_locale.provider == COLLPROVIDER_BUILTIN) + { + result = true; + return (bool) result; + } + else if (default_locale.provider == COLLPROVIDER_ICU) + { + result = false; + return (bool) result; + } + else if (default_locale.provider == COLLPROVIDER_LIBC) + { + localeptr = setlocale(LC_COLLATE, NULL); + if (!localeptr) + elog(ERROR, "invalid LC_COLLATE setting"); + } + else + elog(ERROR, "unexpected collation provider '%c'", + default_locale.provider); if (strcmp(localeptr, "C") == 0) result = true; @@ -1332,16 +1420,29 @@ lc_ctype_is_c(Oid collation) if (collation == DEFAULT_COLLATION_OID) { static int result = -1; - char *localeptr; - - if (default_locale.provider == COLLPROVIDER_ICU) - return false; + const char *localeptr; if (result >= 0) return (bool) result; - localeptr = setlocale(LC_CTYPE, NULL); - if (!localeptr) - elog(ERROR, "invalid LC_CTYPE setting"); + + if (default_locale.provider == COLLPROVIDER_BUILTIN) + { + localeptr = default_locale.info.builtin.locale; + } + else if (default_locale.provider == COLLPROVIDER_ICU) + { + result = false; + return (bool) result; + } + else if (default_locale.provider == COLLPROVIDER_LIBC) + { + localeptr = setlocale(LC_CTYPE, NULL); + if (!localeptr) + elog(ERROR, "invalid LC_CTYPE setting"); + } + else + elog(ERROR, "unexpected collation provider '%c'", + default_locale.provider); if (strcmp(localeptr, "C") == 0) result = true; @@ -1420,7 +1521,6 @@ make_icu_collator(const char *iculocstr, /* simple subroutine for reporting errors from newlocale() */ -#ifdef HAVE_LOCALE_T static void report_newlocale_failure(const char *localename) { @@ -1449,7 +1549,6 @@ report_newlocale_failure(const char *localename) errdetail("The operating system could not find any locale data for the locale name \"%s\".", localename) : 0))); } -#endif /* HAVE_LOCALE_T */ bool pg_locale_deterministic(pg_locale_t locale) @@ -1466,10 +1565,6 @@ pg_locale_deterministic(pg_locale_t locale) * lifetime of the backend. Thus, do not free the result with freelocale(). * * As a special optimization, the default/database collation returns 0. - * Callers should then revert to the non-locale_t-enabled code path. - * Also, callers should avoid calling this before going down a C/POSIX - * fastpath, because such a fastpath should work even on platforms without - * locale_t support in the C library. * * For simplicity, we always generate COLLATE + CTYPE even though we * might only need one of them. Since this is called only once per session, @@ -1485,10 +1580,10 @@ pg_newlocale_from_collation(Oid collid) if (collid == DEFAULT_COLLATION_OID) { - if (default_locale.provider == COLLPROVIDER_ICU) - return &default_locale; - else + if (default_locale.provider == COLLPROVIDER_LIBC) return (pg_locale_t) 0; + else + return &default_locale; } cache_entry = lookup_collation_cache(collid, false); @@ -1513,9 +1608,20 @@ pg_newlocale_from_collation(Oid collid) result.provider = collform->collprovider; result.deterministic = collform->collisdeterministic; - if (collform->collprovider == COLLPROVIDER_LIBC) + if (collform->collprovider == COLLPROVIDER_BUILTIN) + { + const char *locstr; + + datum = SysCacheGetAttrNotNull(COLLOID, tp, Anum_pg_collation_colllocale); + locstr = TextDatumGetCString(datum); + + builtin_validate_locale(GetDatabaseEncoding(), locstr); + + result.info.builtin.locale = MemoryContextStrdup(TopMemoryContext, + locstr); + } + else if (collform->collprovider == COLLPROVIDER_LIBC) { -#ifdef HAVE_LOCALE_T const char *collcollate; const char *collctype pg_attribute_unused(); locale_t loc; @@ -1566,19 +1672,13 @@ pg_newlocale_from_collation(Oid collid) } result.info.lt = loc; -#else /* not HAVE_LOCALE_T */ - /* platform that doesn't support locale_t */ - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("collation provider LIBC is not supported on this platform"))); -#endif /* not HAVE_LOCALE_T */ } else if (collform->collprovider == COLLPROVIDER_ICU) { const char *iculocstr; const char *icurules; - datum = SysCacheGetAttrNotNull(COLLOID, tp, Anum_pg_collation_colliculocale); + datum = SysCacheGetAttrNotNull(COLLOID, tp, Anum_pg_collation_colllocale); iculocstr = TextDatumGetCString(datum); datum = SysCacheGetAttr(COLLOID, tp, Anum_pg_collation_collicurules, &isnull); @@ -1599,7 +1699,10 @@ pg_newlocale_from_collation(Oid collid) collversionstr = TextDatumGetCString(datum); - datum = SysCacheGetAttrNotNull(COLLOID, tp, collform->collprovider == COLLPROVIDER_ICU ? Anum_pg_collation_colliculocale : Anum_pg_collation_collcollate); + if (collform->collprovider == COLLPROVIDER_LIBC) + datum = SysCacheGetAttrNotNull(COLLOID, tp, Anum_pg_collation_collcollate); + else + datum = SysCacheGetAttrNotNull(COLLOID, tp, Anum_pg_collation_colllocale); actual_versionstr = get_collation_actual_version(collform->collprovider, TextDatumGetCString(datum)); @@ -1650,6 +1753,26 @@ get_collation_actual_version(char collprovider, const char *collcollate) { char *collversion = NULL; + /* + * The only two supported locales (C and C.UTF-8) are both based on memcmp + * and are not expected to change, but track the version anyway. + * + * Note that the character semantics may change for some locales, but the + * collation version only tracks changes to sort order. + */ + if (collprovider == COLLPROVIDER_BUILTIN) + { + if (strcmp(collcollate, "C") == 0) + return "1"; + else if (strcmp(collcollate, "C.UTF-8") == 0) + return "1"; + else + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("invalid locale name \"%s\" for builtin provider", + collcollate))); + } + #ifdef USE_ICU if (collprovider == COLLPROVIDER_ICU) { @@ -1679,7 +1802,7 @@ get_collation_actual_version(char collprovider, const char *collcollate) locale_t loc; /* Look up FreeBSD collation version. */ - loc = newlocale(LC_COLLATE, collcollate, NULL); + loc = newlocale(LC_COLLATE_MASK, collcollate, NULL); if (loc) { collversion = @@ -1788,11 +1911,9 @@ pg_strncoll_libc_win32_utf8(const char *arg1, size_t len1, const char *arg2, ((LPWSTR) a2p)[r] = 0; errno = 0; -#ifdef HAVE_LOCALE_T if (locale) result = wcscoll_l((LPWSTR) a1p, (LPWSTR) a2p, locale->info.lt); else -#endif result = wcscoll((LPWSTR) a1p, (LPWSTR) a2p); if (result == 2147483647) /* _NLSCMPERROR; missing from mingw headers */ ereport(ERROR, @@ -1831,14 +1952,7 @@ pg_strcoll_libc(const char *arg1, const char *arg2, pg_locale_t locale) else #endif /* WIN32 */ if (locale) - { -#ifdef HAVE_LOCALE_T result = strcoll_l(arg1, arg2, locale->info.lt); -#else - /* shouldn't happen */ - elog(ERROR, "unsupported collprovider: %c", locale->provider); -#endif - } else result = strcoll(arg1, arg2); @@ -2016,7 +2130,7 @@ pg_strcoll(const char *arg1, const char *arg2, pg_locale_t locale) #endif else /* shouldn't happen */ - elog(ERROR, "unsupported collprovider: %c", locale->provider); + PGLOCALE_SUPPORT_ERROR(locale->provider); return result; } @@ -2052,7 +2166,7 @@ pg_strncoll(const char *arg1, size_t len1, const char *arg2, size_t len2, #endif else /* shouldn't happen */ - elog(ERROR, "unsupported collprovider: %c", locale->provider); + PGLOCALE_SUPPORT_ERROR(locale->provider); return result; } @@ -2065,15 +2179,13 @@ pg_strxfrm_libc(char *dest, const char *src, size_t destsize, Assert(!locale || locale->provider == COLLPROVIDER_LIBC); #ifdef TRUST_STRXFRM -#ifdef HAVE_LOCALE_T if (locale) return strxfrm_l(dest, src, destsize, locale->info.lt); else -#endif return strxfrm(dest, src, destsize); #else /* shouldn't happen */ - elog(ERROR, "unsupported collprovider: %c", locale->provider); + PGLOCALE_SUPPORT_ERROR(locale->provider); return 0; /* keep compiler quiet */ #endif } @@ -2269,7 +2381,7 @@ pg_strxfrm_enabled(pg_locale_t locale) return true; else /* shouldn't happen */ - elog(ERROR, "unsupported collprovider: %c", locale->provider); + PGLOCALE_SUPPORT_ERROR(locale->provider); return false; /* keep compiler quiet */ } @@ -2284,9 +2396,9 @@ pg_strxfrm_enabled(pg_locale_t locale) * The provided 'src' must be nul-terminated. If 'destsize' is zero, 'dest' * may be NULL. * - * Returns the number of bytes needed to store the transformed string, - * excluding the terminating nul byte. If the value returned is 'destsize' or - * greater, the resulting contents of 'dest' are undefined. + * Returns the number of bytes needed (or more) to store the transformed + * string, excluding the terminating nul byte. If the value returned is + * 'destsize' or greater, the resulting contents of 'dest' are undefined. */ size_t pg_strxfrm(char *dest, const char *src, size_t destsize, pg_locale_t locale) @@ -2301,7 +2413,7 @@ pg_strxfrm(char *dest, const char *src, size_t destsize, pg_locale_t locale) #endif else /* shouldn't happen */ - elog(ERROR, "unsupported collprovider: %c", locale->provider); + PGLOCALE_SUPPORT_ERROR(locale->provider); return result; } @@ -2316,9 +2428,9 @@ pg_strxfrm(char *dest, const char *src, size_t destsize, pg_locale_t locale) * 'src' does not need to be nul-terminated. If 'destsize' is zero, 'dest' may * be NULL. * - * Returns the number of bytes needed to store the transformed string, - * excluding the terminating nul byte. If the value returned is 'destsize' or - * greater, the resulting contents of 'dest' are undefined. + * Returns the number of bytes needed (or more) to store the transformed + * string, excluding the terminating nul byte. If the value returned is + * 'destsize' or greater, the resulting contents of 'dest' are undefined. * * This function may need to nul-terminate the argument for libc functions; * so if the caller already has a nul-terminated string, it should call @@ -2338,7 +2450,7 @@ pg_strnxfrm(char *dest, size_t destsize, const char *src, size_t srclen, #endif else /* shouldn't happen */ - elog(ERROR, "unsupported collprovider: %c", locale->provider); + PGLOCALE_SUPPORT_ERROR(locale->provider); return result; } @@ -2356,7 +2468,7 @@ pg_strxfrm_prefix_enabled(pg_locale_t locale) return true; else /* shouldn't happen */ - elog(ERROR, "unsupported collprovider: %c", locale->provider); + PGLOCALE_SUPPORT_ERROR(locale->provider); return false; /* keep compiler quiet */ } @@ -2380,16 +2492,14 @@ pg_strxfrm_prefix(char *dest, const char *src, size_t destsize, { size_t result = 0; /* keep compiler quiet */ - if (!locale || locale->provider == COLLPROVIDER_LIBC) - elog(ERROR, "collprovider '%c' does not support pg_strxfrm_prefix()", - locale->provider); + if (!locale) + PGLOCALE_SUPPORT_ERROR(COLLPROVIDER_LIBC); #ifdef USE_ICU else if (locale->provider == COLLPROVIDER_ICU) result = pg_strnxfrm_prefix_icu(dest, src, -1, destsize, locale); #endif else - /* shouldn't happen */ - elog(ERROR, "unsupported collprovider: %c", locale->provider); + PGLOCALE_SUPPORT_ERROR(locale->provider); return result; } @@ -2417,20 +2527,71 @@ pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src, { size_t result = 0; /* keep compiler quiet */ - if (!locale || locale->provider == COLLPROVIDER_LIBC) - elog(ERROR, "collprovider '%c' does not support pg_strnxfrm_prefix()", - locale->provider); + if (!locale) + PGLOCALE_SUPPORT_ERROR(COLLPROVIDER_LIBC); #ifdef USE_ICU else if (locale->provider == COLLPROVIDER_ICU) result = pg_strnxfrm_prefix_icu(dest, src, -1, destsize, locale); #endif else - /* shouldn't happen */ - elog(ERROR, "unsupported collprovider: %c", locale->provider); + PGLOCALE_SUPPORT_ERROR(locale->provider); return result; } +/* + * Return required encoding ID for the given locale, or -1 if any encoding is + * valid for the locale. + */ +int +builtin_locale_encoding(const char *locale) +{ + if (strcmp(locale, "C") == 0) + return -1; + if (strcmp(locale, "C.UTF-8") == 0) + return PG_UTF8; + + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("invalid locale name \"%s\" for builtin provider", + locale))); + + return 0; /* keep compiler quiet */ +} + + +/* + * Validate the locale and encoding combination, and return the canonical form + * of the locale name. + */ +const char * +builtin_validate_locale(int encoding, const char *locale) +{ + const char *canonical_name = NULL; + int required_encoding; + + if (strcmp(locale, "C") == 0) + canonical_name = "C"; + else if (strcmp(locale, "C.UTF-8") == 0 || strcmp(locale, "C.UTF8") == 0) + canonical_name = "C.UTF-8"; + + if (!canonical_name) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("invalid locale name \"%s\" for builtin provider", + locale))); + + required_encoding = builtin_locale_encoding(canonical_name); + if (required_encoding >= 0 && encoding != required_encoding) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("encoding \"%s\" does not match locale \"%s\"", + pg_encoding_to_char(encoding), locale))); + + return canonical_name; +} + + #ifdef USE_ICU /* @@ -2862,7 +3023,8 @@ icu_validate_locale(const char *loc_str) ereport(elevel, (errmsg("could not get language from ICU locale \"%s\": %s", loc_str, u_errorName(status)), - errhint("To disable ICU locale validation, set parameter icu_validation_level to DISABLED."))); + errhint("To disable ICU locale validation, set the parameter \"%s\" to \"%s\".", + "icu_validation_level", "disabled"))); return; } @@ -2890,7 +3052,8 @@ icu_validate_locale(const char *loc_str) ereport(elevel, (errmsg("ICU locale \"%s\" has unknown language \"%s\"", loc_str, lang), - errhint("To disable ICU locale validation, set parameter icu_validation_level to DISABLED."))); + errhint("To disable ICU locale validation, set the parameter \"%s\" to \"%s\".", + "icu_validation_level", "disabled"))); /* check that it can be opened */ collator = pg_ucol_open(loc_str); @@ -2955,23 +3118,8 @@ wchar2char(char *to, const wchar_t *from, size_t tolen, pg_locale_t locale) } else { -#ifdef HAVE_LOCALE_T -#ifdef HAVE_WCSTOMBS_L /* Use wcstombs_l for nondefault locales */ result = wcstombs_l(to, from, tolen, locale->info.lt); -#else /* !HAVE_WCSTOMBS_L */ - /* We have to temporarily set the locale as current ... ugh */ - locale_t save_locale = uselocale(locale->info.lt); - - result = wcstombs(to, from, tolen); - - uselocale(save_locale); -#endif /* HAVE_WCSTOMBS_L */ -#else /* !HAVE_LOCALE_T */ - /* Can't have locale != 0 without HAVE_LOCALE_T */ - elog(ERROR, "wcstombs_l is not available"); - result = 0; /* keep compiler quiet */ -#endif /* HAVE_LOCALE_T */ } return result; @@ -3032,23 +3180,8 @@ char2wchar(wchar_t *to, size_t tolen, const char *from, size_t fromlen, } else { -#ifdef HAVE_LOCALE_T -#ifdef HAVE_MBSTOWCS_L /* Use mbstowcs_l for nondefault locales */ result = mbstowcs_l(to, str, tolen, locale->info.lt); -#else /* !HAVE_MBSTOWCS_L */ - /* We have to temporarily set the locale as current ... ugh */ - locale_t save_locale = uselocale(locale->info.lt); - - result = mbstowcs(to, str, tolen); - - uselocale(save_locale); -#endif /* HAVE_MBSTOWCS_L */ -#else /* !HAVE_LOCALE_T */ - /* Can't have locale != 0 without HAVE_LOCALE_T */ - elog(ERROR, "mbstowcs_l is not available"); - result = 0; /* keep compiler quiet */ -#endif /* HAVE_LOCALE_T */ } pfree(str); diff --git a/src/backend/utils/adt/pg_lsn.c b/src/backend/utils/adt/pg_lsn.c index 613c3722b945a..e8b68ef156a32 100644 --- a/src/backend/utils/adt/pg_lsn.c +++ b/src/backend/utils/adt/pg_lsn.c @@ -3,7 +3,7 @@ * pg_lsn.c * Operations for the pg_lsn datatype. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -13,9 +13,8 @@ */ #include "postgres.h" -#include "funcapi.h" #include "libpq/pqformat.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/numeric.h" #include "utils/pg_lsn.h" diff --git a/src/backend/utils/adt/pg_upgrade_support.c b/src/backend/utils/adt/pg_upgrade_support.c index 0186636d9f89c..c54b08fe180ba 100644 --- a/src/backend/utils/adt/pg_upgrade_support.c +++ b/src/backend/utils/adt/pg_upgrade_support.c @@ -5,20 +5,30 @@ * to control oid and relfilenumber assignment, and do other special * hacks needed for pg_upgrade. * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/backend/utils/adt/pg_upgrade_support.c */ #include "postgres.h" +#include "access/relation.h" +#include "access/table.h" #include "catalog/binary_upgrade.h" #include "catalog/heap.h" #include "catalog/namespace.h" +#include "catalog/pg_subscription_rel.h" #include "catalog/pg_type.h" #include "commands/extension.h" #include "miscadmin.h" +#include "replication/logical.h" +#include "replication/origin.h" +#include "replication/worker_internal.h" +#include "storage/lmgr.h" #include "utils/array.h" #include "utils/builtins.h" +#include "utils/lsyscache.h" +#include "utils/pg_lsn.h" +#include "utils/syscache.h" #define CHECK_IS_BINARY_UPGRADE \ @@ -261,3 +271,143 @@ binary_upgrade_set_missing_value(PG_FUNCTION_ARGS) PG_RETURN_VOID(); } + +/* + * Verify the given slot has already consumed all the WAL changes. + * + * Returns true if there are no decodable WAL records after the + * confirmed_flush_lsn. Otherwise false. + * + * This is a special purpose function to ensure that the given slot can be + * upgraded without data loss. + */ +Datum +binary_upgrade_logical_slot_has_caught_up(PG_FUNCTION_ARGS) +{ + Name slot_name; + XLogRecPtr end_of_wal; + bool found_pending_wal; + + CHECK_IS_BINARY_UPGRADE; + + /* + * Binary upgrades only allowed super-user connections so we must have + * permission to use replication slots. + */ + Assert(has_rolreplication(GetUserId())); + + slot_name = PG_GETARG_NAME(0); + + /* Acquire the given slot */ + ReplicationSlotAcquire(NameStr(*slot_name), true); + + Assert(SlotIsLogical(MyReplicationSlot)); + + /* Slots must be valid as otherwise we won't be able to scan the WAL */ + Assert(MyReplicationSlot->data.invalidated == RS_INVAL_NONE); + + end_of_wal = GetFlushRecPtr(NULL); + found_pending_wal = LogicalReplicationSlotHasPendingWal(end_of_wal); + + /* Clean up */ + ReplicationSlotRelease(); + + PG_RETURN_BOOL(!found_pending_wal); +} + +/* + * binary_upgrade_add_sub_rel_state + * + * Add the relation with the specified relation state to pg_subscription_rel + * catalog. + */ +Datum +binary_upgrade_add_sub_rel_state(PG_FUNCTION_ARGS) +{ + Relation subrel; + Relation rel; + Oid subid; + char *subname; + Oid relid; + char relstate; + XLogRecPtr sublsn; + + CHECK_IS_BINARY_UPGRADE; + + /* We must check these things before dereferencing the arguments */ + if (PG_ARGISNULL(0) || PG_ARGISNULL(1) || PG_ARGISNULL(2)) + elog(ERROR, "null argument to binary_upgrade_add_sub_rel_state is not allowed"); + + subname = text_to_cstring(PG_GETARG_TEXT_PP(0)); + relid = PG_GETARG_OID(1); + relstate = PG_GETARG_CHAR(2); + sublsn = PG_ARGISNULL(3) ? InvalidXLogRecPtr : PG_GETARG_LSN(3); + + subrel = table_open(SubscriptionRelationId, RowExclusiveLock); + subid = get_subscription_oid(subname, false); + rel = relation_open(relid, AccessShareLock); + + /* + * Since there are no concurrent ALTER/DROP SUBSCRIPTION commands during + * the upgrade process, and the apply worker (which builds cache based on + * the subscription catalog) is not running, the locks can be released + * immediately. + */ + AddSubscriptionRelState(subid, relid, relstate, sublsn, false); + relation_close(rel, AccessShareLock); + table_close(subrel, RowExclusiveLock); + + PG_RETURN_VOID(); +} + +/* + * binary_upgrade_replorigin_advance + * + * Update the remote_lsn for the subscriber's replication origin. + */ +Datum +binary_upgrade_replorigin_advance(PG_FUNCTION_ARGS) +{ + Relation rel; + Oid subid; + char *subname; + char originname[NAMEDATALEN]; + RepOriginId node; + XLogRecPtr remote_commit; + + CHECK_IS_BINARY_UPGRADE; + + /* + * We must ensure a non-NULL subscription name before dereferencing the + * arguments. + */ + if (PG_ARGISNULL(0)) + elog(ERROR, "null argument to binary_upgrade_replorigin_advance is not allowed"); + + subname = text_to_cstring(PG_GETARG_TEXT_PP(0)); + remote_commit = PG_ARGISNULL(1) ? InvalidXLogRecPtr : PG_GETARG_LSN(1); + + rel = table_open(SubscriptionRelationId, RowExclusiveLock); + subid = get_subscription_oid(subname, false); + + ReplicationOriginNameForLogicalRep(subid, InvalidOid, originname, sizeof(originname)); + + /* Lock to prevent the replication origin from vanishing */ + LockRelationOid(ReplicationOriginRelationId, RowExclusiveLock); + node = replorigin_by_name(originname, false); + + /* + * The server will be stopped after setting up the objects in the new + * cluster and the origins will be flushed during the shutdown checkpoint. + * This will ensure that the latest LSN values for origin will be + * available after the upgrade. + */ + replorigin_advance(node, remote_commit, InvalidXLogRecPtr, + false /* backward */ , + false /* WAL log */ ); + + UnlockRelationOid(ReplicationOriginRelationId, RowExclusiveLock); + table_close(rel, RowExclusiveLock); + + PG_RETURN_VOID(); +} diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 2a4c8ef87ff4e..2575dba87b9d2 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -3,7 +3,7 @@ * pgstatfuncs.c * Functions for accessing various forms of statistics data * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -17,20 +17,19 @@ #include "access/htup_details.h" #include "access/xlog.h" #include "access/xlogprefetcher.h" +#include "catalog/catalog.h" #include "catalog/pg_authid.h" #include "catalog/pg_type.h" #include "common/ip.h" #include "funcapi.h" #include "miscadmin.h" #include "pgstat.h" -#include "postmaster/bgworker_internals.h" -#include "postmaster/postmaster.h" +#include "postmaster/bgworker.h" #include "replication/logicallauncher.h" #include "storage/proc.h" #include "storage/procarray.h" #include "utils/acl.h" #include "utils/builtins.h" -#include "utils/inet.h" #include "utils/timestamp.h" #define UINT32_ACCESS_ONCE(var) ((uint32)(*((volatile uint32 *)&(var)))) @@ -77,7 +76,7 @@ PG_STAT_GET_RELENTRY_INT64(ins_since_vacuum) /* pg_stat_get_live_tuples */ PG_STAT_GET_RELENTRY_INT64(live_tuples) -/* pg_stat_get_mods_since_analyze */ +/* pg_stat_get_mod_since_analyze */ PG_STAT_GET_RELENTRY_INT64(mod_since_analyze) /* pg_stat_get_numscans */ @@ -210,9 +209,9 @@ pg_stat_get_backend_idset(PG_FUNCTION_ARGS) if (fctx[0] <= pgstat_fetch_stat_numbackends()) { /* do when there is more left to send */ - LocalPgBackendStatus *local_beentry = pgstat_fetch_stat_local_beentry(fctx[0]); + LocalPgBackendStatus *local_beentry = pgstat_get_local_beentry_by_index(fctx[0]); - SRF_RETURN_NEXT(funcctx, Int32GetDatum(local_beentry->backend_id)); + SRF_RETURN_NEXT(funcctx, Int32GetDatum(local_beentry->proc_number)); } else { @@ -263,7 +262,7 @@ pg_stat_get_progress_info(PG_FUNCTION_ARGS) bool nulls[PG_STAT_GET_PROGRESS_COLS] = {0}; int i; - local_beentry = pgstat_fetch_stat_local_beentry(curr_backend); + local_beentry = pgstat_get_local_beentry_by_index(curr_backend); beentry = &local_beentry->backendStatus; /* @@ -324,7 +323,7 @@ pg_stat_get_activity(PG_FUNCTION_ARGS) const char *wait_event = NULL; /* Get the next one in the list */ - local_beentry = pgstat_fetch_stat_local_beentry(curr_backend); + local_beentry = pgstat_get_local_beentry_by_index(curr_backend); beentry = &local_beentry->backendStatus; /* If looking for specific PID, ignore all the others */ @@ -668,10 +667,10 @@ pg_backend_pid(PG_FUNCTION_ARGS) Datum pg_stat_get_backend_pid(PG_FUNCTION_ARGS) { - int32 beid = PG_GETARG_INT32(0); + int32 procNumber = PG_GETARG_INT32(0); PgBackendStatus *beentry; - if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) + if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL) PG_RETURN_NULL(); PG_RETURN_INT32(beentry->st_procpid); @@ -681,10 +680,10 @@ pg_stat_get_backend_pid(PG_FUNCTION_ARGS) Datum pg_stat_get_backend_dbid(PG_FUNCTION_ARGS) { - int32 beid = PG_GETARG_INT32(0); + int32 procNumber = PG_GETARG_INT32(0); PgBackendStatus *beentry; - if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) + if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL) PG_RETURN_NULL(); PG_RETURN_OID(beentry->st_databaseid); @@ -694,10 +693,10 @@ pg_stat_get_backend_dbid(PG_FUNCTION_ARGS) Datum pg_stat_get_backend_userid(PG_FUNCTION_ARGS) { - int32 beid = PG_GETARG_INT32(0); + int32 procNumber = PG_GETARG_INT32(0); PgBackendStatus *beentry; - if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) + if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL) PG_RETURN_NULL(); PG_RETURN_OID(beentry->st_userid); @@ -708,15 +707,11 @@ pg_stat_get_backend_subxact(PG_FUNCTION_ARGS) { #define PG_STAT_GET_SUBXACT_COLS 2 TupleDesc tupdesc; - Datum values[PG_STAT_GET_SUBXACT_COLS]; - bool nulls[PG_STAT_GET_SUBXACT_COLS]; - int32 beid = PG_GETARG_INT32(0); + Datum values[PG_STAT_GET_SUBXACT_COLS] = {0}; + bool nulls[PG_STAT_GET_SUBXACT_COLS] = {0}; + int32 procNumber = PG_GETARG_INT32(0); LocalPgBackendStatus *local_beentry; - /* Initialise values and NULL flags arrays */ - MemSet(values, 0, sizeof(values)); - MemSet(nulls, 0, sizeof(nulls)); - /* Initialise attributes information in the tuple descriptor */ tupdesc = CreateTemplateTupleDesc(PG_STAT_GET_SUBXACT_COLS); TupleDescInitEntry(tupdesc, (AttrNumber) 1, "subxact_count", @@ -726,7 +721,7 @@ pg_stat_get_backend_subxact(PG_FUNCTION_ARGS) BlessTupleDesc(tupdesc); - if ((local_beentry = pgstat_fetch_stat_local_beentry(beid)) != NULL) + if ((local_beentry = pgstat_get_local_beentry_by_proc_number(procNumber)) != NULL) { /* Fill values and NULLs */ values[0] = Int32GetDatum(local_beentry->backend_subxact_count); @@ -745,13 +740,13 @@ pg_stat_get_backend_subxact(PG_FUNCTION_ARGS) Datum pg_stat_get_backend_activity(PG_FUNCTION_ARGS) { - int32 beid = PG_GETARG_INT32(0); + int32 procNumber = PG_GETARG_INT32(0); PgBackendStatus *beentry; const char *activity; char *clipped_activity; text *ret; - if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) + if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL) activity = ""; else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid)) activity = ""; @@ -770,12 +765,12 @@ pg_stat_get_backend_activity(PG_FUNCTION_ARGS) Datum pg_stat_get_backend_wait_event_type(PG_FUNCTION_ARGS) { - int32 beid = PG_GETARG_INT32(0); + int32 procNumber = PG_GETARG_INT32(0); PgBackendStatus *beentry; PGPROC *proc; const char *wait_event_type = NULL; - if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) + if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL) wait_event_type = ""; else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid)) wait_event_type = ""; @@ -791,12 +786,12 @@ pg_stat_get_backend_wait_event_type(PG_FUNCTION_ARGS) Datum pg_stat_get_backend_wait_event(PG_FUNCTION_ARGS) { - int32 beid = PG_GETARG_INT32(0); + int32 procNumber = PG_GETARG_INT32(0); PgBackendStatus *beentry; PGPROC *proc; const char *wait_event = NULL; - if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) + if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL) wait_event = ""; else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid)) wait_event = ""; @@ -813,11 +808,11 @@ pg_stat_get_backend_wait_event(PG_FUNCTION_ARGS) Datum pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS) { - int32 beid = PG_GETARG_INT32(0); + int32 procNumber = PG_GETARG_INT32(0); TimestampTz result; PgBackendStatus *beentry; - if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) + if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL) PG_RETURN_NULL(); else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid)) @@ -839,11 +834,11 @@ pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS) Datum pg_stat_get_backend_xact_start(PG_FUNCTION_ARGS) { - int32 beid = PG_GETARG_INT32(0); + int32 procNumber = PG_GETARG_INT32(0); TimestampTz result; PgBackendStatus *beentry; - if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) + if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL) PG_RETURN_NULL(); else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid)) @@ -861,11 +856,11 @@ pg_stat_get_backend_xact_start(PG_FUNCTION_ARGS) Datum pg_stat_get_backend_start(PG_FUNCTION_ARGS) { - int32 beid = PG_GETARG_INT32(0); + int32 procNumber = PG_GETARG_INT32(0); TimestampTz result; PgBackendStatus *beentry; - if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) + if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL) PG_RETURN_NULL(); else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid)) @@ -883,13 +878,13 @@ pg_stat_get_backend_start(PG_FUNCTION_ARGS) Datum pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS) { - int32 beid = PG_GETARG_INT32(0); + int32 procNumber = PG_GETARG_INT32(0); PgBackendStatus *beentry; SockAddr zero_clientaddr; char remote_host[NI_MAXHOST]; int ret; - if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) + if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL) PG_RETURN_NULL(); else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid)) @@ -928,13 +923,13 @@ pg_stat_get_backend_client_addr(PG_FUNCTION_ARGS) Datum pg_stat_get_backend_client_port(PG_FUNCTION_ARGS) { - int32 beid = PG_GETARG_INT32(0); + int32 procNumber = PG_GETARG_INT32(0); PgBackendStatus *beentry; SockAddr zero_clientaddr; char remote_port[NI_MAXSERV]; int ret; - if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL) + if ((beentry = pgstat_get_beentry_by_proc_number(procNumber)) == NULL) PG_RETURN_NULL(); else if (!HAS_PGSTAT_PERMISSIONS(beentry->st_userid)) @@ -977,12 +972,12 @@ pg_stat_get_db_numbackends(PG_FUNCTION_ARGS) Oid dbid = PG_GETARG_OID(0); int32 result; int tot_backends = pgstat_fetch_stat_numbackends(); - int beid; + int idx; result = 0; - for (beid = 1; beid <= tot_backends; beid++) + for (idx = 1; idx <= tot_backends; idx++) { - LocalPgBackendStatus *local_beentry = pgstat_fetch_stat_local_beentry(beid); + LocalPgBackendStatus *local_beentry = pgstat_get_local_beentry_by_index(idx); if (local_beentry->backendStatus.st_databaseid == dbid) result++; @@ -1185,21 +1180,39 @@ PG_STAT_GET_DBENTRY_FLOAT8_MS(idle_in_transaction_time) PG_STAT_GET_DBENTRY_FLOAT8_MS(session_time) Datum -pg_stat_get_bgwriter_timed_checkpoints(PG_FUNCTION_ARGS) +pg_stat_get_checkpointer_num_timed(PG_FUNCTION_ARGS) +{ + PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->num_timed); +} + +Datum +pg_stat_get_checkpointer_num_requested(PG_FUNCTION_ARGS) { - PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->timed_checkpoints); + PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->num_requested); } Datum -pg_stat_get_bgwriter_requested_checkpoints(PG_FUNCTION_ARGS) +pg_stat_get_checkpointer_restartpoints_timed(PG_FUNCTION_ARGS) { - PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->requested_checkpoints); + PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->restartpoints_timed); } Datum -pg_stat_get_bgwriter_buf_written_checkpoints(PG_FUNCTION_ARGS) +pg_stat_get_checkpointer_restartpoints_requested(PG_FUNCTION_ARGS) { - PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->buf_written_checkpoints); + PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->restartpoints_requested); +} + +Datum +pg_stat_get_checkpointer_restartpoints_performed(PG_FUNCTION_ARGS) +{ + PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->restartpoints_performed); +} + +Datum +pg_stat_get_checkpointer_buffers_written(PG_FUNCTION_ARGS) +{ + PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->buffers_written); } Datum @@ -1215,37 +1228,31 @@ pg_stat_get_bgwriter_maxwritten_clean(PG_FUNCTION_ARGS) } Datum -pg_stat_get_checkpoint_write_time(PG_FUNCTION_ARGS) +pg_stat_get_checkpointer_write_time(PG_FUNCTION_ARGS) { /* time is already in msec, just convert to double for presentation */ PG_RETURN_FLOAT8((double) - pgstat_fetch_stat_checkpointer()->checkpoint_write_time); + pgstat_fetch_stat_checkpointer()->write_time); } Datum -pg_stat_get_checkpoint_sync_time(PG_FUNCTION_ARGS) +pg_stat_get_checkpointer_sync_time(PG_FUNCTION_ARGS) { /* time is already in msec, just convert to double for presentation */ PG_RETURN_FLOAT8((double) - pgstat_fetch_stat_checkpointer()->checkpoint_sync_time); -} - -Datum -pg_stat_get_bgwriter_stat_reset_time(PG_FUNCTION_ARGS) -{ - PG_RETURN_TIMESTAMPTZ(pgstat_fetch_stat_bgwriter()->stat_reset_timestamp); + pgstat_fetch_stat_checkpointer()->sync_time); } Datum -pg_stat_get_buf_written_backend(PG_FUNCTION_ARGS) +pg_stat_get_checkpointer_stat_reset_time(PG_FUNCTION_ARGS) { - PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->buf_written_backend); + PG_RETURN_TIMESTAMPTZ(pgstat_fetch_stat_checkpointer()->stat_reset_timestamp); } Datum -pg_stat_get_buf_fsync_backend(PG_FUNCTION_ARGS) +pg_stat_get_bgwriter_stat_reset_time(PG_FUNCTION_ARGS) { - PG_RETURN_INT64(pgstat_fetch_stat_checkpointer()->buf_fsync_backend); + PG_RETURN_TIMESTAMPTZ(pgstat_fetch_stat_bgwriter()->stat_reset_timestamp); } Datum @@ -1401,7 +1408,7 @@ pg_stat_get_io(PG_FUNCTION_ARGS) values[IO_COL_BACKEND_TYPE] = bktype_desc; values[IO_COL_CONTEXT] = CStringGetTextDatum(context_name); values[IO_COL_OBJECT] = CStringGetTextDatum(obj_name); - values[IO_COL_RESET_TIME] = TimestampTzGetDatum(reset_time); + values[IO_COL_RESET_TIME] = reset_time; /* * Hard-code this to the value of BLCKSZ for now. Future @@ -1603,68 +1610,14 @@ PG_STAT_GET_XACT_RELENTRY_INT64(blocks_fetched) /* pg_stat_get_xact_blocks_hit */ PG_STAT_GET_XACT_RELENTRY_INT64(blocks_hit) -Datum -pg_stat_get_xact_tuples_inserted(PG_FUNCTION_ARGS) -{ - Oid relid = PG_GETARG_OID(0); - int64 result; - PgStat_TableStatus *tabentry; - PgStat_TableXactStatus *trans; +/* pg_stat_get_xact_tuples_inserted */ +PG_STAT_GET_XACT_RELENTRY_INT64(tuples_inserted) - if ((tabentry = find_tabstat_entry(relid)) == NULL) - result = 0; - else - { - result = tabentry->counts.tuples_inserted; - /* live subtransactions' counts aren't in tuples_inserted yet */ - for (trans = tabentry->trans; trans != NULL; trans = trans->upper) - result += trans->tuples_inserted; - } +/* pg_stat_get_xact_tuples_updated */ +PG_STAT_GET_XACT_RELENTRY_INT64(tuples_updated) - PG_RETURN_INT64(result); -} - -Datum -pg_stat_get_xact_tuples_updated(PG_FUNCTION_ARGS) -{ - Oid relid = PG_GETARG_OID(0); - int64 result; - PgStat_TableStatus *tabentry; - PgStat_TableXactStatus *trans; - - if ((tabentry = find_tabstat_entry(relid)) == NULL) - result = 0; - else - { - result = tabentry->counts.tuples_updated; - /* live subtransactions' counts aren't in tuples_updated yet */ - for (trans = tabentry->trans; trans != NULL; trans = trans->upper) - result += trans->tuples_updated; - } - - PG_RETURN_INT64(result); -} - -Datum -pg_stat_get_xact_tuples_deleted(PG_FUNCTION_ARGS) -{ - Oid relid = PG_GETARG_OID(0); - int64 result; - PgStat_TableStatus *tabentry; - PgStat_TableXactStatus *trans; - - if ((tabentry = find_tabstat_entry(relid)) == NULL) - result = 0; - else - { - result = tabentry->counts.tuples_deleted; - /* live subtransactions' counts aren't in tuples_deleted yet */ - for (trans = tabentry->trans; trans != NULL; trans = trans->upper) - result += trans->tuples_deleted; - } - - PG_RETURN_INT64(result); -} +/* pg_stat_get_xact_tuples_deleted */ +PG_STAT_GET_XACT_RELENTRY_INT64(tuples_deleted) Datum pg_stat_get_xact_function_calls(PG_FUNCTION_ARGS) @@ -1748,41 +1701,58 @@ pg_stat_reset(PG_FUNCTION_ARGS) Datum pg_stat_reset_shared(PG_FUNCTION_ARGS) { - char *target = text_to_cstring(PG_GETARG_TEXT_PP(0)); + char *target = NULL; + + if (PG_ARGISNULL(0)) + { + /* Reset all the statistics when nothing is specified */ + pgstat_reset_of_kind(PGSTAT_KIND_ARCHIVER); + pgstat_reset_of_kind(PGSTAT_KIND_BGWRITER); + pgstat_reset_of_kind(PGSTAT_KIND_CHECKPOINTER); + pgstat_reset_of_kind(PGSTAT_KIND_IO); + XLogPrefetchResetStats(); + pgstat_reset_of_kind(PGSTAT_KIND_SLRU); + pgstat_reset_of_kind(PGSTAT_KIND_WAL); + + PG_RETURN_VOID(); + } + + target = text_to_cstring(PG_GETARG_TEXT_PP(0)); if (strcmp(target, "archiver") == 0) pgstat_reset_of_kind(PGSTAT_KIND_ARCHIVER); else if (strcmp(target, "bgwriter") == 0) - { - /* - * Historically checkpointer was part of bgwriter, continue to reset - * both for now. - */ pgstat_reset_of_kind(PGSTAT_KIND_BGWRITER); + else if (strcmp(target, "checkpointer") == 0) pgstat_reset_of_kind(PGSTAT_KIND_CHECKPOINTER); - } else if (strcmp(target, "io") == 0) pgstat_reset_of_kind(PGSTAT_KIND_IO); else if (strcmp(target, "recovery_prefetch") == 0) XLogPrefetchResetStats(); + else if (strcmp(target, "slru") == 0) + pgstat_reset_of_kind(PGSTAT_KIND_SLRU); else if (strcmp(target, "wal") == 0) pgstat_reset_of_kind(PGSTAT_KIND_WAL); else ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("unrecognized reset target: \"%s\"", target), - errhint("Target must be \"archiver\", \"bgwriter\", \"io\", \"recovery_prefetch\", or \"wal\"."))); + errhint("Target must be \"archiver\", \"bgwriter\", \"checkpointer\", \"io\", \"recovery_prefetch\", \"slru\", or \"wal\"."))); PG_RETURN_VOID(); } -/* Reset a single counter in the current database */ +/* + * Reset a statistics for a single object, which may be of current + * database or shared across all databases in the cluster. + */ Datum pg_stat_reset_single_table_counters(PG_FUNCTION_ARGS) { Oid taboid = PG_GETARG_OID(0); + Oid dboid = (IsSharedRelation(taboid) ? InvalidOid : MyDatabaseId); - pgstat_reset(PGSTAT_KIND_RELATION, MyDatabaseId, taboid); + pgstat_reset(PGSTAT_KIND_RELATION, dboid, taboid); PG_RETURN_VOID(); } diff --git a/src/backend/utils/adt/pseudorandomfuncs.c b/src/backend/utils/adt/pseudorandomfuncs.c new file mode 100644 index 0000000000000..8e82c7078c5df --- /dev/null +++ b/src/backend/utils/adt/pseudorandomfuncs.c @@ -0,0 +1,185 @@ +/*------------------------------------------------------------------------- + * + * pseudorandomfuncs.c + * Functions giving SQL access to a pseudorandom number generator. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/backend/utils/adt/pseudorandomfuncs.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include + +#include "common/pg_prng.h" +#include "miscadmin.h" +#include "utils/fmgrprotos.h" +#include "utils/numeric.h" +#include "utils/timestamp.h" + +/* Shared PRNG state used by all the random functions */ +static pg_prng_state prng_state; +static bool prng_seed_set = false; + +/* + * initialize_prng() - + * + * Initialize (seed) the PRNG, if not done yet in this process. + */ +static void +initialize_prng(void) +{ + if (unlikely(!prng_seed_set)) + { + /* + * If possible, seed the PRNG using high-quality random bits. Should + * that fail for some reason, we fall back on a lower-quality seed + * based on current time and PID. + */ + if (unlikely(!pg_prng_strong_seed(&prng_state))) + { + TimestampTz now = GetCurrentTimestamp(); + uint64 iseed; + + /* Mix the PID with the most predictable bits of the timestamp */ + iseed = (uint64) now ^ ((uint64) MyProcPid << 32); + pg_prng_seed(&prng_state, iseed); + } + prng_seed_set = true; + } +} + +/* + * setseed() - + * + * Seed the PRNG from a specified value in the range [-1.0, 1.0]. + */ +Datum +setseed(PG_FUNCTION_ARGS) +{ + float8 seed = PG_GETARG_FLOAT8(0); + + if (seed < -1 || seed > 1 || isnan(seed)) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("setseed parameter %g is out of allowed range [-1,1]", + seed)); + + pg_prng_fseed(&prng_state, seed); + prng_seed_set = true; + + PG_RETURN_VOID(); +} + +/* + * drandom() - + * + * Returns a random number chosen uniformly in the range [0.0, 1.0). + */ +Datum +drandom(PG_FUNCTION_ARGS) +{ + float8 result; + + initialize_prng(); + + /* pg_prng_double produces desired result range [0.0, 1.0) */ + result = pg_prng_double(&prng_state); + + PG_RETURN_FLOAT8(result); +} + +/* + * drandom_normal() - + * + * Returns a random number from a normal distribution. + */ +Datum +drandom_normal(PG_FUNCTION_ARGS) +{ + float8 mean = PG_GETARG_FLOAT8(0); + float8 stddev = PG_GETARG_FLOAT8(1); + float8 result, + z; + + initialize_prng(); + + /* Get random value from standard normal(mean = 0.0, stddev = 1.0) */ + z = pg_prng_double_normal(&prng_state); + /* Transform the normal standard variable (z) */ + /* using the target normal distribution parameters */ + result = (stddev * z) + mean; + + PG_RETURN_FLOAT8(result); +} + +/* + * int4random() - + * + * Returns a random 32-bit integer chosen uniformly in the specified range. + */ +Datum +int4random(PG_FUNCTION_ARGS) +{ + int32 rmin = PG_GETARG_INT32(0); + int32 rmax = PG_GETARG_INT32(1); + int32 result; + + if (rmin > rmax) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("lower bound must be less than or equal to upper bound")); + + initialize_prng(); + + result = (int32) pg_prng_int64_range(&prng_state, rmin, rmax); + + PG_RETURN_INT32(result); +} + +/* + * int8random() - + * + * Returns a random 64-bit integer chosen uniformly in the specified range. + */ +Datum +int8random(PG_FUNCTION_ARGS) +{ + int64 rmin = PG_GETARG_INT64(0); + int64 rmax = PG_GETARG_INT64(1); + int64 result; + + if (rmin > rmax) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("lower bound must be less than or equal to upper bound")); + + initialize_prng(); + + result = pg_prng_int64_range(&prng_state, rmin, rmax); + + PG_RETURN_INT64(result); +} + +/* + * numeric_random() - + * + * Returns a random numeric value chosen uniformly in the specified range. + */ +Datum +numeric_random(PG_FUNCTION_ARGS) +{ + Numeric rmin = PG_GETARG_NUMERIC(0); + Numeric rmax = PG_GETARG_NUMERIC(1); + Numeric result; + + initialize_prng(); + + result = random_numeric(&prng_state, rmin, rmax); + + PG_RETURN_NUMERIC(result); +} diff --git a/src/backend/utils/adt/pseudotypes.c b/src/backend/utils/adt/pseudotypes.c index 3ba8cb192ca26..e189e9b79d297 100644 --- a/src/backend/utils/adt/pseudotypes.c +++ b/src/backend/utils/adt/pseudotypes.c @@ -11,7 +11,7 @@ * we do better?) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,10 +23,7 @@ #include "postgres.h" #include "libpq/pqformat.h" -#include "utils/array.h" -#include "utils/builtins.h" -#include "utils/rangetypes.h" -#include "utils/multirangetypes.h" +#include "utils/fmgrprotos.h" /* diff --git a/src/backend/utils/adt/quote.c b/src/backend/utils/adt/quote.c index f2f633befac7b..7cf18b93cd9e9 100644 --- a/src/backend/utils/adt/quote.c +++ b/src/backend/utils/adt/quote.c @@ -3,7 +3,7 @@ * quote.c * Functions for quoting identifiers and literals * - * Portions Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2000-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/utils/adt/rangetypes.c b/src/backend/utils/adt/rangetypes.c index d65e5625c739a..2d94a6b877456 100644 --- a/src/backend/utils/adt/rangetypes.c +++ b/src/backend/utils/adt/rangetypes.c @@ -19,7 +19,7 @@ * value; we must detoast it first. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -30,19 +30,20 @@ */ #include "postgres.h" -#include "access/tupmacs.h" #include "common/hashfn.h" -#include "lib/stringinfo.h" #include "libpq/pqformat.h" #include "miscadmin.h" +#include "nodes/makefuncs.h" #include "nodes/miscnodes.h" -#include "port/pg_bitutils.h" +#include "nodes/supportnodes.h" +#include "optimizer/clauses.h" +#include "optimizer/cost.h" +#include "optimizer/optimizer.h" #include "utils/builtins.h" #include "utils/date.h" #include "utils/lsyscache.h" #include "utils/rangetypes.h" #include "utils/timestamp.h" -#include "varatt.h" /* fn_extra cache entry for one of the range I/O functions */ @@ -69,6 +70,12 @@ static Size datum_compute_size(Size data_length, Datum val, bool typbyval, char typalign, int16 typlen, char typstorage); static Pointer datum_write(Pointer ptr, Datum datum, bool typbyval, char typalign, int16 typlen, char typstorage); +static Node *find_simplified_clause(PlannerInfo *root, + Expr *rangeExpr, Expr *elemExpr); +static Expr *build_bound_expr(Expr *elemExpr, Datum val, + bool isLowerBound, bool isInclusive, + TypeCacheEntry *typeCache, + Oid opfamily, Oid rng_collation); /* @@ -2173,6 +2180,58 @@ make_empty_range(TypeCacheEntry *typcache) return make_range(typcache, &lower, &upper, true, NULL); } +/* + * Planner support function for elem_contained_by_range (<@ operator). + */ +Datum +elem_contained_by_range_support(PG_FUNCTION_ARGS) +{ + Node *rawreq = (Node *) PG_GETARG_POINTER(0); + Node *ret = NULL; + + if (IsA(rawreq, SupportRequestSimplify)) + { + SupportRequestSimplify *req = (SupportRequestSimplify *) rawreq; + FuncExpr *fexpr = req->fcall; + Expr *leftop, + *rightop; + + Assert(list_length(fexpr->args) == 2); + leftop = linitial(fexpr->args); + rightop = lsecond(fexpr->args); + + ret = find_simplified_clause(req->root, rightop, leftop); + } + + PG_RETURN_POINTER(ret); +} + +/* + * Planner support function for range_contains_elem (@> operator). + */ +Datum +range_contains_elem_support(PG_FUNCTION_ARGS) +{ + Node *rawreq = (Node *) PG_GETARG_POINTER(0); + Node *ret = NULL; + + if (IsA(rawreq, SupportRequestSimplify)) + { + SupportRequestSimplify *req = (SupportRequestSimplify *) rawreq; + FuncExpr *fexpr = req->fcall; + Expr *leftop, + *rightop; + + Assert(list_length(fexpr->args) == 2); + leftop = linitial(fexpr->args); + rightop = lsecond(fexpr->args); + + ret = find_simplified_clause(req->root, leftop, rightop); + } + + PG_RETURN_POINTER(ret); +} + /* *---------------------------------------------------------- @@ -2608,7 +2667,8 @@ range_contains_elem_internal(TypeCacheEntry *typcache, const RangeType *r, Datum * values into a range object. They are modeled after heaptuple.c's * heap_compute_data_size() and heap_fill_tuple(), but we need not handle * null values here. TYPE_IS_PACKABLE must test the same conditions as - * heaptuple.c's ATT_IS_PACKABLE macro. + * heaptuple.c's ATT_IS_PACKABLE macro. See the comments there for more + * details. */ /* Does datatype allow packing into the 1-byte-header varlena format? */ @@ -2714,3 +2774,180 @@ datum_write(Pointer ptr, Datum datum, bool typbyval, char typalign, return ptr; } + +/* + * Common code for the elem_contained_by_range and range_contains_elem + * support functions. The caller has extracted the function argument + * expressions, and swapped them if necessary to pass the range first. + * + * Returns a simplified replacement expression, or NULL if we can't simplify. + */ +static Node * +find_simplified_clause(PlannerInfo *root, Expr *rangeExpr, Expr *elemExpr) +{ + RangeType *range; + TypeCacheEntry *rangetypcache; + RangeBound lower; + RangeBound upper; + bool empty; + + /* can't do anything unless the range is a non-null constant */ + if (!IsA(rangeExpr, Const) || ((Const *) rangeExpr)->constisnull) + return NULL; + range = DatumGetRangeTypeP(((Const *) rangeExpr)->constvalue); + + rangetypcache = lookup_type_cache(RangeTypeGetOid(range), + TYPECACHE_RANGE_INFO); + if (rangetypcache->rngelemtype == NULL) + elog(ERROR, "type %u is not a range type", RangeTypeGetOid(range)); + + range_deserialize(rangetypcache, range, &lower, &upper, &empty); + + if (empty) + { + /* if the range is empty, then there can be no matches */ + return makeBoolConst(false, false); + } + else if (lower.infinite && upper.infinite) + { + /* the range has infinite bounds, so it matches everything */ + return makeBoolConst(true, false); + } + else + { + /* at least one bound is available, we have something to work with */ + TypeCacheEntry *elemTypcache = rangetypcache->rngelemtype; + Oid opfamily = rangetypcache->rng_opfamily; + Oid rng_collation = rangetypcache->rng_collation; + Expr *lowerExpr = NULL; + Expr *upperExpr = NULL; + + if (!lower.infinite && !upper.infinite) + { + /* + * When both bounds are present, we have a problem: the + * "simplified" clause would need to evaluate the elemExpr twice. + * That's definitely not okay if the elemExpr is volatile, and + * it's also unattractive if the elemExpr is expensive. + */ + QualCost eval_cost; + + if (contain_volatile_functions((Node *) elemExpr)) + return NULL; + + /* + * We define "expensive" as "contains any subplan or more than 10 + * operators". Note that the subplan search has to be done + * explicitly, since cost_qual_eval() will barf on unplanned + * subselects. + */ + if (contain_subplans((Node *) elemExpr)) + return NULL; + cost_qual_eval_node(&eval_cost, (Node *) elemExpr, root); + if (eval_cost.startup + eval_cost.per_tuple > + 10 * cpu_operator_cost) + return NULL; + } + + /* Okay, try to build boundary comparison expressions */ + if (!lower.infinite) + { + lowerExpr = build_bound_expr(elemExpr, + lower.val, + true, + lower.inclusive, + elemTypcache, + opfamily, + rng_collation); + if (lowerExpr == NULL) + return NULL; + } + + if (!upper.infinite) + { + /* Copy the elemExpr if we need two copies */ + if (!lower.infinite) + elemExpr = copyObject(elemExpr); + upperExpr = build_bound_expr(elemExpr, + upper.val, + false, + upper.inclusive, + elemTypcache, + opfamily, + rng_collation); + if (upperExpr == NULL) + return NULL; + } + + if (lowerExpr != NULL && upperExpr != NULL) + return (Node *) make_andclause(list_make2(lowerExpr, upperExpr)); + else if (lowerExpr != NULL) + return (Node *) lowerExpr; + else if (upperExpr != NULL) + return (Node *) upperExpr; + else + { + Assert(false); + return NULL; + } + } +} + +/* + * Helper function for find_simplified_clause(). + * + * Build the expression (elemExpr Operator val), where the operator is + * the appropriate member of the given opfamily depending on + * isLowerBound and isInclusive. typeCache is the typcache entry for + * the "val" value (presently, this will be the same type as elemExpr). + * rng_collation is the collation to use in the comparison. + * + * Return NULL on failure (if, for some reason, we can't find the operator). + */ +static Expr * +build_bound_expr(Expr *elemExpr, Datum val, + bool isLowerBound, bool isInclusive, + TypeCacheEntry *typeCache, + Oid opfamily, Oid rng_collation) +{ + Oid elemType = typeCache->type_id; + int16 elemTypeLen = typeCache->typlen; + bool elemByValue = typeCache->typbyval; + Oid elemCollation = typeCache->typcollation; + int16 strategy; + Oid oproid; + Expr *constExpr; + + /* Identify the comparison operator to use */ + if (isLowerBound) + strategy = isInclusive ? BTGreaterEqualStrategyNumber : BTGreaterStrategyNumber; + else + strategy = isInclusive ? BTLessEqualStrategyNumber : BTLessStrategyNumber; + + /* + * We could use exprType(elemExpr) here, if it ever becomes possible that + * elemExpr is not the exact same type as the range elements. + */ + oproid = get_opfamily_member(opfamily, elemType, elemType, strategy); + + /* We don't really expect failure here, but just in case ... */ + if (!OidIsValid(oproid)) + return NULL; + + /* OK, convert "val" to a full-fledged Const node, and make the OpExpr */ + constExpr = (Expr *) makeConst(elemType, + -1, + elemCollation, + elemTypeLen, + val, + false, + elemByValue); + + return make_opclause(oproid, + BOOLOID, + false, + elemExpr, + constExpr, + InvalidOid, + rng_collation); +} diff --git a/src/backend/utils/adt/rangetypes_gist.c b/src/backend/utils/adt/rangetypes_gist.c index 08846783818ef..cb28e9859abb4 100644 --- a/src/backend/utils/adt/rangetypes_gist.c +++ b/src/backend/utils/adt/rangetypes_gist.c @@ -3,7 +3,7 @@ * rangetypes_gist.c * GiST support for range types. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -62,7 +62,7 @@ typedef struct typedef enum { SPLIT_LEFT = 0, /* makes initialization to SPLIT_LEFT easier */ - SPLIT_RIGHT + SPLIT_RIGHT, } SplitLR; /* diff --git a/src/backend/utils/adt/rangetypes_selfuncs.c b/src/backend/utils/adt/rangetypes_selfuncs.c index fbabb3e18ce8e..6d35ecd33d0e4 100644 --- a/src/backend/utils/adt/rangetypes_selfuncs.c +++ b/src/backend/utils/adt/rangetypes_selfuncs.c @@ -6,7 +6,7 @@ * Estimates are based on histograms of lower and upper bounds, and the * fraction of empty ranges. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,7 +22,6 @@ #include "access/htup_details.h" #include "catalog/pg_operator.h" #include "catalog/pg_statistic.h" -#include "catalog/pg_type.h" #include "utils/float.h" #include "utils/fmgrprotos.h" #include "utils/lsyscache.h" @@ -196,9 +195,10 @@ rangesel(PG_FUNCTION_ARGS) else if (operator == OID_RANGE_ELEM_CONTAINED_OP) { /* - * Here, the Var is the elem, not the range. For now we just punt and - * return the default estimate. In future we could disassemble the - * range constant and apply scalarineqsel ... + * Here, the Var is the elem, not the range. In typical cases + * elem_contained_by_range_support will have simplified this case, so + * that we won't get here. If we do get here we'll fall back on a + * default estimate. */ } else if (((Const *) other)->consttype == vardata.vartype) diff --git a/src/backend/utils/adt/rangetypes_spgist.c b/src/backend/utils/adt/rangetypes_spgist.c index 834ee0bbd05c6..5121835f6b5da 100644 --- a/src/backend/utils/adt/rangetypes_spgist.c +++ b/src/backend/utils/adt/rangetypes_spgist.c @@ -25,7 +25,7 @@ * This implementation only uses the comparison function of the range element * datatype, therefore it works for any range type. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -39,8 +39,8 @@ #include "access/spgist.h" #include "access/stratnum.h" #include "catalog/pg_type.h" -#include "utils/builtins.h" #include "utils/datum.h" +#include "utils/fmgrprotos.h" #include "utils/rangetypes.h" static int16 getQuadrant(TypeCacheEntry *typcache, const RangeType *centroid, diff --git a/src/backend/utils/adt/rangetypes_typanalyze.c b/src/backend/utils/adt/rangetypes_typanalyze.c index 86810a1a6e615..3773f98115287 100644 --- a/src/backend/utils/adt/rangetypes_typanalyze.c +++ b/src/backend/utils/adt/rangetypes_typanalyze.c @@ -13,7 +13,7 @@ * come from different tuples. In theory, the standard scalar selectivity * functions could be used with the combined histogram. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -29,8 +29,8 @@ #include "utils/float.h" #include "utils/fmgrprotos.h" #include "utils/lsyscache.h" -#include "utils/rangetypes.h" #include "utils/multirangetypes.h" +#include "utils/rangetypes.h" #include "varatt.h" static int float8_qsort_cmp(const void *a1, const void *a2, void *arg); @@ -47,18 +47,17 @@ range_typanalyze(PG_FUNCTION_ARGS) { VacAttrStats *stats = (VacAttrStats *) PG_GETARG_POINTER(0); TypeCacheEntry *typcache; - Form_pg_attribute attr = stats->attr; /* Get information about range type; note column might be a domain */ typcache = range_get_typcache(fcinfo, getBaseType(stats->attrtypid)); - if (attr->attstattarget < 0) - attr->attstattarget = default_statistics_target; + if (stats->attstattarget < 0) + stats->attstattarget = default_statistics_target; stats->compute_stats = compute_range_stats; stats->extra_data = typcache; /* same as in std_typanalyze */ - stats->minrows = 300 * attr->attstattarget; + stats->minrows = 300 * stats->attstattarget; PG_RETURN_BOOL(true); } @@ -74,18 +73,17 @@ multirange_typanalyze(PG_FUNCTION_ARGS) { VacAttrStats *stats = (VacAttrStats *) PG_GETARG_POINTER(0); TypeCacheEntry *typcache; - Form_pg_attribute attr = stats->attr; /* Get information about multirange type; note column might be a domain */ typcache = multirange_get_typcache(fcinfo, getBaseType(stats->attrtypid)); - if (attr->attstattarget < 0) - attr->attstattarget = default_statistics_target; + if (stats->attstattarget < 0) + stats->attstattarget = default_statistics_target; stats->compute_stats = compute_range_stats; stats->extra_data = typcache; /* same as in std_typanalyze */ - stats->minrows = 300 * attr->attstattarget; + stats->minrows = 300 * stats->attstattarget; PG_RETURN_BOOL(true); } @@ -136,7 +134,7 @@ compute_range_stats(VacAttrStats *stats, AnalyzeAttrFetchFunc fetchfunc, int empty_cnt = 0; int range_no; int slot_idx; - int num_bins = stats->attr->attstattarget; + int num_bins = stats->attstattarget; int num_hist; float8 *lengths; RangeBound *lowers, diff --git a/src/backend/utils/adt/regexp.c b/src/backend/utils/adt/regexp.c index 702cd52b6d429..0e2519bfd5772 100644 --- a/src/backend/utils/adt/regexp.c +++ b/src/backend/utils/adt/regexp.c @@ -3,7 +3,7 @@ * regexp.c * Postgres' interface to the regular expression package. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -31,7 +31,6 @@ #include "catalog/pg_type.h" #include "funcapi.h" -#include "miscadmin.h" #include "regex/regex.h" #include "utils/array.h" #include "utils/builtins.h" diff --git a/src/backend/utils/adt/regproc.c b/src/backend/utils/adt/regproc.c index 296930eb3bca7..18d5b7d166c48 100644 --- a/src/backend/utils/adt/regproc.c +++ b/src/backend/utils/adt/regproc.c @@ -8,7 +8,7 @@ * special I/O conversion routines. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -1220,6 +1220,26 @@ to_regtype(PG_FUNCTION_ARGS) PG_RETURN_DATUM(result); } +/* + * to_regtypemod - converts "typename" to type modifier + * + * If the name is not found, we return NULL. + */ +Datum +to_regtypemod(PG_FUNCTION_ARGS) +{ + char *typ_name = text_to_cstring(PG_GETARG_TEXT_PP(0)); + Oid typid; + int32 typmod; + ErrorSaveContext escontext = {T_ErrorSaveContext}; + + /* We rely on parseTypeString to parse the input. */ + if (!parseTypeString(typ_name, &typid, &typmod, (Node *) &escontext)) + PG_RETURN_NULL(); + + PG_RETURN_INT32(typmod); +} + /* * regtypeout - converts type OID to "typ_name" */ diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c index 6945d99b3d5f2..62601a6d80c7b 100644 --- a/src/backend/utils/adt/ri_triggers.c +++ b/src/backend/utils/adt/ri_triggers.c @@ -14,7 +14,7 @@ * plan --- consider improving this someday. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/backend/utils/adt/ri_triggers.c * @@ -30,8 +30,6 @@ #include "access/xact.h" #include "catalog/pg_collation.h" #include "catalog/pg_constraint.h" -#include "catalog/pg_operator.h" -#include "catalog/pg_type.h" #include "commands/trigger.h" #include "executor/executor.h" #include "executor/spi.h" @@ -39,7 +37,6 @@ #include "miscadmin.h" #include "parser/parse_coerce.h" #include "parser/parse_relation.h" -#include "storage/bufmgr.h" #include "utils/acl.h" #include "utils/builtins.h" #include "utils/datum.h" @@ -1263,9 +1260,6 @@ RI_FKey_fk_upd_check_required(Trigger *trigger, Relation fk_rel, { const RI_ConstraintInfo *riinfo; int ri_nullcheck; - Datum xminDatum; - TransactionId xmin; - bool isnull; /* * AfterTriggerSaveEvent() handles things such that this function is never @@ -1333,10 +1327,7 @@ RI_FKey_fk_upd_check_required(Trigger *trigger, Relation fk_rel, * this if we knew the INSERT trigger already fired, but there is no easy * way to know that.) */ - xminDatum = slot_getsysattr(oldslot, MinTransactionIdAttributeNumber, &isnull); - Assert(!isnull); - xmin = DatumGetTransactionId(xminDatum); - if (TransactionIdIsCurrentTransactionId(xmin)) + if (slot_is_current_xact_tuple(oldslot)) return true; /* If all old and new key values are equal, no check is needed */ diff --git a/src/backend/utils/adt/rowtypes.c b/src/backend/utils/adt/rowtypes.c index ad176651d8584..0214c23a1d454 100644 --- a/src/backend/utils/adt/rowtypes.c +++ b/src/backend/utils/adt/rowtypes.c @@ -3,7 +3,7 @@ * rowtypes.c * I/O and comparison functions for generic composite types. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,7 +19,6 @@ #include "access/detoast.h" #include "access/htup_details.h" #include "catalog/pg_type.h" -#include "common/hashfn.h" #include "funcapi.h" #include "libpq/pqformat.h" #include "miscadmin.h" @@ -569,7 +568,6 @@ record_recv(PG_FUNCTION_ARGS) int itemlen; StringInfoData item_buf; StringInfo bufptr; - char csave; /* Ignore dropped columns in datatype, but fill with nulls */ if (att->attisdropped) @@ -619,25 +617,19 @@ record_recv(PG_FUNCTION_ARGS) /* -1 length means NULL */ bufptr = NULL; nulls[i] = true; - csave = 0; /* keep compiler quiet */ } else { + char *strbuff; + /* - * Rather than copying data around, we just set up a phony - * StringInfo pointing to the correct portion of the input buffer. - * We assume we can scribble on the input buffer so as to maintain - * the convention that StringInfos have a trailing null. + * Rather than copying data around, we just initialize a + * StringInfo pointing to the correct portion of the message + * buffer. */ - item_buf.data = &buf->data[buf->cursor]; - item_buf.maxlen = itemlen + 1; - item_buf.len = itemlen; - item_buf.cursor = 0; - + strbuff = &buf->data[buf->cursor]; buf->cursor += itemlen; - - csave = buf->data[buf->cursor]; - buf->data[buf->cursor] = '\0'; + initReadOnlyStringInfo(&item_buf, strbuff, itemlen); bufptr = &item_buf; nulls[i] = false; @@ -667,8 +659,6 @@ record_recv(PG_FUNCTION_ARGS) (errcode(ERRCODE_INVALID_BINARY_REPRESENTATION), errmsg("improper binary format in record column %d", i + 1))); - - buf->data[buf->cursor] = csave; } } diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index d3a973d86b761..c6293b20cfeaf 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -4,7 +4,7 @@ * Functions to convert stored expressions/querytrees back to * source text * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,7 +22,6 @@ #include "access/amapi.h" #include "access/htup_details.h" #include "access/relation.h" -#include "access/sysattr.h" #include "access/table.h" #include "catalog/pg_aggregate.h" #include "catalog/pg_am.h" @@ -51,7 +50,6 @@ #include "optimizer/optimizer.h" #include "parser/parse_agg.h" #include "parser/parse_func.h" -#include "parser/parse_node.h" #include "parser/parse_oper.h" #include "parser/parse_relation.h" #include "parser/parser.h" @@ -115,14 +113,16 @@ typedef struct { StringInfo buf; /* output buffer to append to */ List *namespaces; /* List of deparse_namespace nodes */ + TupleDesc resultDesc; /* if top level of a view, the view's tupdesc */ + List *targetList; /* Current query level's SELECT targetlist */ List *windowClause; /* Current query level's WINDOW clause */ - List *windowTList; /* targetlist for resolving WINDOW clause */ int prettyFlags; /* enabling of pretty-print functions */ int wrapColumn; /* max line length, or -1 for no limit */ int indentLevel; /* current indent level for pretty-print */ bool varprefix; /* true to print prefixes on Vars */ - ParseExprKind special_exprkind; /* set only for exprkinds needing special - * handling */ + bool colNamesVisible; /* do we care about output column names? */ + bool inGroupBy; /* deparsing GROUP BY clause? */ + bool varInOrderBy; /* deparsing simple Var in ORDER BY? */ Bitmapset *appendparents; /* if not null, map child Vars of these relids * back to the parent rel */ } deparse_context; @@ -316,9 +316,9 @@ typedef void (*rsv_callback) (Node *node, deparse_context *context, * ---------- */ static SPIPlanPtr plan_getrulebyoid = NULL; -static const char *query_getrulebyoid = "SELECT * FROM pg_catalog.pg_rewrite WHERE oid = $1"; +static const char *const query_getrulebyoid = "SELECT * FROM pg_catalog.pg_rewrite WHERE oid = $1"; static SPIPlanPtr plan_getviewrule = NULL; -static const char *query_getviewrule = "SELECT * FROM pg_catalog.pg_rewrite WHERE ev_class = $1 AND rulename = $2"; +static const char *const query_getviewrule = "SELECT * FROM pg_catalog.pg_rewrite WHERE ev_class = $1 AND rulename = $2"; /* GUC parameters */ bool quote_all_identifiers = false; @@ -352,8 +352,7 @@ static char *pg_get_partkeydef_worker(Oid relid, int prettyFlags, bool attrsOnly, bool missing_ok); static char *pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, int prettyFlags, bool missing_ok); -static text *pg_get_expr_worker(text *expr, Oid relid, const char *relname, - int prettyFlags); +static text *pg_get_expr_worker(text *expr, Oid relid, int prettyFlags); static int print_function_arguments(StringInfo buf, HeapTuple proctup, bool print_table_args, bool print_defaults); static void print_function_rettype(StringInfo buf, HeapTuple proctup); @@ -400,27 +399,19 @@ static void get_query_def(Query *query, StringInfo buf, List *parentnamespace, int prettyFlags, int wrapColumn, int startIndent); static void get_values_def(List *values_lists, deparse_context *context); static void get_with_clause(Query *query, deparse_context *context); -static void get_select_query_def(Query *query, deparse_context *context, - TupleDesc resultDesc, bool colNamesVisible); -static void get_insert_query_def(Query *query, deparse_context *context, - bool colNamesVisible); -static void get_update_query_def(Query *query, deparse_context *context, - bool colNamesVisible); +static void get_select_query_def(Query *query, deparse_context *context); +static void get_insert_query_def(Query *query, deparse_context *context); +static void get_update_query_def(Query *query, deparse_context *context); static void get_update_query_targetlist_def(Query *query, List *targetList, deparse_context *context, RangeTblEntry *rte); -static void get_delete_query_def(Query *query, deparse_context *context, - bool colNamesVisible); -static void get_merge_query_def(Query *query, deparse_context *context, - bool colNamesVisible); +static void get_delete_query_def(Query *query, deparse_context *context); +static void get_merge_query_def(Query *query, deparse_context *context); static void get_utility_query_def(Query *query, deparse_context *context); -static void get_basic_select_query(Query *query, deparse_context *context, - TupleDesc resultDesc, bool colNamesVisible); -static void get_target_list(List *targetList, deparse_context *context, - TupleDesc resultDesc, bool colNamesVisible); +static void get_basic_select_query(Query *query, deparse_context *context); +static void get_target_list(List *targetList, deparse_context *context); static void get_setop_query(Node *setOp, Query *query, - deparse_context *context, - TupleDesc resultDesc, bool colNamesVisible); + deparse_context *context); static Node *get_rule_sortgroupclause(Index ref, List *tlist, bool force_colno, deparse_context *context); @@ -439,6 +430,10 @@ static void resolve_special_varno(Node *node, deparse_context *context, rsv_callback callback, void *callback_arg); static Node *find_param_referent(Param *param, deparse_context *context, deparse_namespace **dpns_p, ListCell **ancestor_cell_p); +static SubPlan *find_param_generator(Param *param, deparse_context *context, + int *column_p); +static SubPlan *find_param_generator_initplan(Param *param, Plan *plan, + int *column_p); static void get_parameter(Param *param, deparse_context *context); static const char *get_simple_binary_op_name(OpExpr *expr); static bool isSimpleNode(Node *node, Node *parentNode, int prettyFlags); @@ -476,6 +471,8 @@ static void get_const_expr(Const *constval, deparse_context *context, int showtype); static void get_const_collation(Const *constval, deparse_context *context); static void get_json_format(JsonFormat *format, StringInfo buf); +static void get_json_returning(JsonReturning *returning, StringInfo buf, + bool json_format_by_default); static void get_json_constructor(JsonConstructorExpr *ctor, deparse_context *context, bool showimplicit); static void get_json_constructor_options(JsonConstructorExpr *ctor, @@ -511,13 +508,22 @@ static char *generate_qualified_relation_name(Oid relid); static char *generate_function_name(Oid funcid, int nargs, List *argnames, Oid *argtypes, bool has_variadic, bool *use_variadic_p, - ParseExprKind special_exprkind); + bool inGroupBy); static char *generate_operator_name(Oid operid, Oid arg1, Oid arg2); static void add_cast_to(StringInfo buf, Oid typid); static char *generate_qualified_type_name(Oid typid); static text *string_to_text(char *str); static char *flatten_reloptions(Oid relid); static void get_reloptions(StringInfo buf, Datum reloptions); +static void get_json_path_spec(Node *path_spec, deparse_context *context, + bool showimplicit); +static void get_json_table_columns(TableFunc *tf, JsonTablePathScan *scan, + deparse_context *context, + bool showimplicit); +static void get_json_table_nested_columns(TableFunc *tf, JsonTablePlan *plan, + deparse_context *context, + bool showimplicit, + bool needcomma); #define only_marker(rte) ((rte)->inh ? "" : "ONLY ") @@ -1081,13 +1087,16 @@ pg_get_triggerdef_worker(Oid trigid, bool pretty) /* Set up context with one-deep namespace stack */ context.buf = &buf; context.namespaces = list_make1(&dpns); + context.resultDesc = NULL; + context.targetList = NIL; context.windowClause = NIL; - context.windowTList = NIL; context.varprefix = true; context.prettyFlags = GET_PRETTY_FLAGS(pretty); context.wrapColumn = WRAP_COLUMN_DEFAULT; context.indentLevel = PRETTYINDENT_STD; - context.special_exprkind = EXPR_KIND_NONE; + context.colNamesVisible = true; + context.inGroupBy = false; + context.varInOrderBy = false; context.appendparents = NULL; get_rule_expr(qual, &context, false); @@ -1098,7 +1107,7 @@ pg_get_triggerdef_worker(Oid trigid, bool pretty) appendStringInfo(&buf, "EXECUTE FUNCTION %s(", generate_function_name(trigrec->tgfoid, 0, NIL, NULL, - false, NULL, EXPR_KIND_NONE)); + false, NULL, false)); if (trigrec->tgnargs > 0) { @@ -2490,6 +2499,11 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand, conForm->connoinherit ? " NO INHERIT" : ""); break; } + + case CONSTRAINT_NOTNULL: + appendStringInfoString(&buf, "NOT NULL"); + break; + case CONSTRAINT_TRIGGER: /* @@ -2599,6 +2613,11 @@ decompile_column_index_array(Datum column_index_array, Oid relId, * partial indexes, column default expressions, etc. We also support * Var-free expressions, for which the OID can be InvalidOid. * + * If the OID is nonzero but not actually valid, don't throw an error, + * just return NULL. This is a bit questionable, but it's what we've + * done historically, and it can help avoid unwanted failures when + * examining catalog entries for just-deleted relations. + * * We expect this function to work, or throw a reasonably clean error, * for any node tree that can appear in a catalog pg_node_tree column. * Query trees, such as those appearing in pg_rewrite.ev_action, are @@ -2611,29 +2630,16 @@ pg_get_expr(PG_FUNCTION_ARGS) { text *expr = PG_GETARG_TEXT_PP(0); Oid relid = PG_GETARG_OID(1); + text *result; int prettyFlags; - char *relname; prettyFlags = PRETTYFLAG_INDENT; - if (OidIsValid(relid)) - { - /* Get the name for the relation */ - relname = get_rel_name(relid); - - /* - * If the OID isn't actually valid, don't throw an error, just return - * NULL. This is a bit questionable, but it's what we've done - * historically, and it can help avoid unwanted failures when - * examining catalog entries for just-deleted relations. - */ - if (relname == NULL) - PG_RETURN_NULL(); - } + result = pg_get_expr_worker(expr, relid, prettyFlags); + if (result) + PG_RETURN_TEXT_P(result); else - relname = NULL; - - PG_RETURN_TEXT_P(pg_get_expr_worker(expr, relid, relname, prettyFlags)); + PG_RETURN_NULL(); } Datum @@ -2642,33 +2648,27 @@ pg_get_expr_ext(PG_FUNCTION_ARGS) text *expr = PG_GETARG_TEXT_PP(0); Oid relid = PG_GETARG_OID(1); bool pretty = PG_GETARG_BOOL(2); + text *result; int prettyFlags; - char *relname; prettyFlags = GET_PRETTY_FLAGS(pretty); - if (OidIsValid(relid)) - { - /* Get the name for the relation */ - relname = get_rel_name(relid); - /* See notes above */ - if (relname == NULL) - PG_RETURN_NULL(); - } + result = pg_get_expr_worker(expr, relid, prettyFlags); + if (result) + PG_RETURN_TEXT_P(result); else - relname = NULL; - - PG_RETURN_TEXT_P(pg_get_expr_worker(expr, relid, relname, prettyFlags)); + PG_RETURN_NULL(); } static text * -pg_get_expr_worker(text *expr, Oid relid, const char *relname, int prettyFlags) +pg_get_expr_worker(text *expr, Oid relid, int prettyFlags) { Node *node; Node *tst; Relids relids; List *context; char *exprstr; + Relation rel = NULL; char *str; /* Convert input pg_node_tree (really TEXT) object to C string */ @@ -2713,9 +2713,19 @@ pg_get_expr_worker(text *expr, Oid relid, const char *relname, int prettyFlags) errmsg("expression contains variables"))); } - /* Prepare deparse context if needed */ + /* + * Prepare deparse context if needed. If we are deparsing with a relid, + * we need to transiently open and lock the rel, to make sure it won't go + * away underneath us. (set_relation_column_names would lock it anyway, + * so this isn't really introducing any new behavior.) + */ if (OidIsValid(relid)) - context = deparse_context_for(relname, relid); + { + rel = try_relation_open(relid, AccessShareLock); + if (rel == NULL) + return NULL; + context = deparse_context_for(RelationGetRelationName(rel), relid); + } else context = NIL; @@ -2723,6 +2733,9 @@ pg_get_expr_worker(text *expr, Oid relid, const char *relname, int prettyFlags) str = deparse_expression_pretty(node, context, false, false, prettyFlags, 0); + if (rel != NULL) + relation_close(rel, AccessShareLock); + return string_to_text(str); } @@ -2980,7 +2993,7 @@ pg_get_functiondef(PG_FUNCTION_ARGS) appendStringInfo(&buf, " SUPPORT %s", generate_function_name(proc->prosupport, 1, NIL, argtypes, - false, NULL, EXPR_KIND_NONE)); + false, NULL, false)); } if (oldlen != buf.len) @@ -3283,7 +3296,7 @@ print_function_arguments(StringInfo buf, HeapTuple proctup, HeapTuple aggtup; Form_pg_aggregate agg; - aggtup = SearchSysCache1(AGGFNOID, proc->oid); + aggtup = SearchSysCache1(AGGFNOID, ObjectIdGetDatum(proc->oid)); if (!HeapTupleIsValid(aggtup)) elog(ERROR, "cache lookup failed for aggregate %u", proc->oid); @@ -3620,13 +3633,16 @@ deparse_expression_pretty(Node *expr, List *dpcontext, initStringInfo(&buf); context.buf = &buf; context.namespaces = dpcontext; + context.resultDesc = NULL; + context.targetList = NIL; context.windowClause = NIL; - context.windowTList = NIL; context.varprefix = forceprefix; context.prettyFlags = prettyFlags; context.wrapColumn = WRAP_COLUMN_DEFAULT; context.indentLevel = startIndent; - context.special_exprkind = EXPR_KIND_NONE; + context.colNamesVisible = true; + context.inGroupBy = false; + context.varInOrderBy = false; context.appendparents = NULL; get_rule_expr(expr, &context, showimplicit); @@ -4975,8 +4991,11 @@ set_deparse_plan(deparse_namespace *dpns, Plan *plan) * For a WorkTableScan, locate the parent RecursiveUnion plan node and use * that as INNER referent. * - * For MERGE, make the inner tlist point to the merge source tlist, which - * is same as the targetlist that the ModifyTable's source plan provides. + * For MERGE, pretend the ModifyTable's source plan (its outer plan) is + * INNER referent. This is the join from the target relation to the data + * source, and all INNER_VAR Vars in other parts of the query refer to its + * targetlist. + * * For ON CONFLICT .. UPDATE we just need the inner tlist to point to the * excluded expression's tlist. (Similar to the SubqueryScan we don't want * to reuse OUTER, it's used for RETURNING in some modify table cases, @@ -4991,17 +5010,17 @@ set_deparse_plan(deparse_namespace *dpns, Plan *plan) dpns->inner_plan = find_recursive_union(dpns, (WorkTableScan *) plan); else if (IsA(plan, ModifyTable)) - dpns->inner_plan = plan; - else - dpns->inner_plan = innerPlan(plan); - - if (IsA(plan, ModifyTable)) { if (((ModifyTable *) plan)->operation == CMD_MERGE) - dpns->inner_tlist = dpns->outer_tlist; + dpns->inner_plan = outerPlan(plan); else - dpns->inner_tlist = ((ModifyTable *) plan)->exclRelTlist; + dpns->inner_plan = plan; } + else + dpns->inner_plan = innerPlan(plan); + + if (IsA(plan, ModifyTable) && ((ModifyTable *) plan)->operation == CMD_INSERT) + dpns->inner_tlist = ((ModifyTable *) plan)->exclRelTlist; else if (dpns->inner_plan) dpns->inner_tlist = dpns->inner_plan->targetlist; else @@ -5268,13 +5287,16 @@ make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc, context.buf = buf; context.namespaces = list_make1(&dpns); + context.resultDesc = NULL; + context.targetList = NIL; context.windowClause = NIL; - context.windowTList = NIL; context.varprefix = (list_length(query->rtable) != 1); context.prettyFlags = prettyFlags; context.wrapColumn = WRAP_COLUMN_DEFAULT; context.indentLevel = PRETTYINDENT_STD; - context.special_exprkind = EXPR_KIND_NONE; + context.colNamesVisible = true; + context.inGroupBy = false; + context.varInOrderBy = false; context.appendparents = NULL; set_deparse_for_query(&dpns, query, NIL); @@ -5436,14 +5458,17 @@ get_query_def(Query *query, StringInfo buf, List *parentnamespace, context.buf = buf; context.namespaces = lcons(&dpns, list_copy(parentnamespace)); + context.resultDesc = NULL; + context.targetList = NIL; context.windowClause = NIL; - context.windowTList = NIL; context.varprefix = (parentnamespace != NIL || list_length(query->rtable) != 1); context.prettyFlags = prettyFlags; context.wrapColumn = wrapColumn; context.indentLevel = startIndent; - context.special_exprkind = EXPR_KIND_NONE; + context.colNamesVisible = colNamesVisible; + context.inGroupBy = false; + context.varInOrderBy = false; context.appendparents = NULL; set_deparse_for_query(&dpns, query, parentnamespace); @@ -5451,23 +5476,25 @@ get_query_def(Query *query, StringInfo buf, List *parentnamespace, switch (query->commandType) { case CMD_SELECT: - get_select_query_def(query, &context, resultDesc, colNamesVisible); + /* We set context.resultDesc only if it's a SELECT */ + context.resultDesc = resultDesc; + get_select_query_def(query, &context); break; case CMD_UPDATE: - get_update_query_def(query, &context, colNamesVisible); + get_update_query_def(query, &context); break; case CMD_INSERT: - get_insert_query_def(query, &context, colNamesVisible); + get_insert_query_def(query, &context); break; case CMD_DELETE: - get_delete_query_def(query, &context, colNamesVisible); + get_delete_query_def(query, &context); break; case CMD_MERGE: - get_merge_query_def(query, &context, colNamesVisible); + get_merge_query_def(query, &context); break; case CMD_NOTHING: @@ -5672,23 +5699,18 @@ get_with_clause(Query *query, deparse_context *context) * ---------- */ static void -get_select_query_def(Query *query, deparse_context *context, - TupleDesc resultDesc, bool colNamesVisible) +get_select_query_def(Query *query, deparse_context *context) { StringInfo buf = context->buf; - List *save_windowclause; - List *save_windowtlist; bool force_colno; ListCell *l; /* Insert the WITH clause if given */ get_with_clause(query, context); - /* Set up context for possible window functions */ - save_windowclause = context->windowClause; + /* Subroutines may need to consult the SELECT targetlist and windowClause */ + context->targetList = query->targetList; context->windowClause = query->windowClause; - save_windowtlist = context->windowTList; - context->windowTList = query->targetList; /* * If the Query node has a setOperations tree, then it's the top level of @@ -5697,14 +5719,13 @@ get_select_query_def(Query *query, deparse_context *context, */ if (query->setOperations) { - get_setop_query(query->setOperations, query, context, resultDesc, - colNamesVisible); + get_setop_query(query->setOperations, query, context); /* ORDER BY clauses must be simple in this case */ force_colno = true; } else { - get_basic_select_query(query, context, resultDesc, colNamesVisible); + get_basic_select_query(query, context); force_colno = false; } @@ -5793,9 +5814,6 @@ get_select_query_def(Query *query, deparse_context *context, appendStringInfoString(buf, " SKIP LOCKED"); } } - - context->windowClause = save_windowclause; - context->windowTList = save_windowtlist; } /* @@ -5873,8 +5891,7 @@ get_simple_values_rte(Query *query, TupleDesc resultDesc) } static void -get_basic_select_query(Query *query, deparse_context *context, - TupleDesc resultDesc, bool colNamesVisible) +get_basic_select_query(Query *query, deparse_context *context) { StringInfo buf = context->buf; RangeTblEntry *values_rte; @@ -5892,7 +5909,7 @@ get_basic_select_query(Query *query, deparse_context *context, * VALUES part. This reverses what transformValuesClause() did at parse * time. */ - values_rte = get_simple_values_rte(query, resultDesc); + values_rte = get_simple_values_rte(query, context->resultDesc); if (values_rte) { get_values_def(values_rte->values_lists, context); @@ -5930,7 +5947,7 @@ get_basic_select_query(Query *query, deparse_context *context, } /* Then we tell what to select (the targetlist) */ - get_target_list(query->targetList, context, resultDesc, colNamesVisible); + get_target_list(query->targetList, context); /* Add the FROM clause if needed */ get_from_clause(query, " FROM ", context); @@ -5946,15 +5963,15 @@ get_basic_select_query(Query *query, deparse_context *context, /* Add the GROUP BY clause if given */ if (query->groupClause != NULL || query->groupingSets != NULL) { - ParseExprKind save_exprkind; + bool save_ingroupby; appendContextKeyword(context, " GROUP BY ", -PRETTYINDENT_STD, PRETTYINDENT_STD, 1); if (query->groupDistinct) appendStringInfoString(buf, "DISTINCT "); - save_exprkind = context->special_exprkind; - context->special_exprkind = EXPR_KIND_GROUP_BY; + save_ingroupby = context->inGroupBy; + context->inGroupBy = true; if (query->groupingSets == NIL) { @@ -5982,7 +5999,7 @@ get_basic_select_query(Query *query, deparse_context *context, } } - context->special_exprkind = save_exprkind; + context->inGroupBy = save_ingroupby; } /* Add the HAVING clause if given */ @@ -6001,14 +6018,11 @@ get_basic_select_query(Query *query, deparse_context *context, /* ---------- * get_target_list - Parse back a SELECT target list * - * This is also used for RETURNING lists in INSERT/UPDATE/DELETE. - * - * resultDesc and colNamesVisible are as for get_query_def() + * This is also used for RETURNING lists in INSERT/UPDATE/DELETE/MERGE. * ---------- */ static void -get_target_list(List *targetList, deparse_context *context, - TupleDesc resultDesc, bool colNamesVisible) +get_target_list(List *targetList, deparse_context *context) { StringInfo buf = context->buf; StringInfoData targetbuf; @@ -6065,7 +6079,7 @@ get_target_list(List *targetList, deparse_context *context, * assigned column name explicitly. Otherwise, show it only if * it's not FigureColname's fallback. */ - attname = colNamesVisible ? NULL : "?column?"; + attname = context->colNamesVisible ? NULL : "?column?"; } /* @@ -6074,8 +6088,9 @@ get_target_list(List *targetList, deparse_context *context, * effects of any column RENAME that's been done on the view). * Otherwise, just use what we can find in the TLE. */ - if (resultDesc && colno <= resultDesc->natts) - colname = NameStr(TupleDescAttr(resultDesc, colno - 1)->attname); + if (context->resultDesc && colno <= context->resultDesc->natts) + colname = NameStr(TupleDescAttr(context->resultDesc, + colno - 1)->attname); else colname = tle->resname; @@ -6143,8 +6158,7 @@ get_target_list(List *targetList, deparse_context *context, } static void -get_setop_query(Node *setOp, Query *query, deparse_context *context, - TupleDesc resultDesc, bool colNamesVisible) +get_setop_query(Node *setOp, Query *query, deparse_context *context) { StringInfo buf = context->buf; bool need_paren; @@ -6160,17 +6174,23 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context, Query *subquery = rte->subquery; Assert(subquery != NULL); - Assert(subquery->setOperations == NULL); - /* Need parens if WITH, ORDER BY, FOR UPDATE, or LIMIT; see gram.y */ + + /* + * We need parens if WITH, ORDER BY, FOR UPDATE, or LIMIT; see gram.y. + * Also add parens if the leaf query contains its own set operations. + * (That shouldn't happen unless one of the other clauses is also + * present, see transformSetOperationTree; but let's be safe.) + */ need_paren = (subquery->cteList || subquery->sortClause || subquery->rowMarks || subquery->limitOffset || - subquery->limitCount); + subquery->limitCount || + subquery->setOperations); if (need_paren) appendStringInfoChar(buf, '('); - get_query_def(subquery, buf, context->namespaces, resultDesc, - colNamesVisible, + get_query_def(subquery, buf, context->namespaces, + context->resultDesc, context->colNamesVisible, context->prettyFlags, context->wrapColumn, context->indentLevel); if (need_paren) @@ -6180,6 +6200,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context, { SetOperationStmt *op = (SetOperationStmt *) setOp; int subindent; + bool save_colnamesvisible; /* * We force parens when nesting two SetOperationStmts, except when the @@ -6213,7 +6234,7 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context, else subindent = 0; - get_setop_query(op->larg, query, context, resultDesc, colNamesVisible); + get_setop_query(op->larg, query, context); if (need_paren) appendContextKeyword(context, ") ", -subindent, 0, 0); @@ -6257,7 +6278,15 @@ get_setop_query(Node *setOp, Query *query, deparse_context *context, subindent = 0; appendContextKeyword(context, "", subindent, 0, 0); - get_setop_query(op->rarg, query, context, resultDesc, false); + /* + * The output column names of the RHS sub-select don't matter. + */ + save_colnamesvisible = context->colNamesVisible; + context->colNamesVisible = false; + + get_setop_query(op->rarg, query, context); + + context->colNamesVisible = save_colnamesvisible; if (PRETTY_INDENT(context)) context->indentLevel -= subindent; @@ -6291,20 +6320,32 @@ get_rule_sortgroupclause(Index ref, List *tlist, bool force_colno, * Use column-number form if requested by caller. Otherwise, if * expression is a constant, force it to be dumped with an explicit cast * as decoration --- this is because a simple integer constant is - * ambiguous (and will be misinterpreted by findTargetlistEntry()) if we - * dump it without any decoration. If it's anything more complex than a - * simple Var, then force extra parens around it, to ensure it can't be - * misinterpreted as a cube() or rollup() construct. + * ambiguous (and will be misinterpreted by findTargetlistEntrySQL92()) if + * we dump it without any decoration. Similarly, if it's just a Var, + * there is risk of misinterpretation if the column name is reassigned in + * the SELECT list, so we may need to force table qualification. And, if + * it's anything more complex than a simple Var, then force extra parens + * around it, to ensure it can't be misinterpreted as a cube() or rollup() + * construct. */ if (force_colno) { Assert(!tle->resjunk); appendStringInfo(buf, "%d", tle->resno); } - else if (expr && IsA(expr, Const)) + else if (!expr) + /* do nothing, probably can't happen */ ; + else if (IsA(expr, Const)) get_const_expr((Const *) expr, context, 1); - else if (!expr || IsA(expr, Var)) - get_rule_expr(expr, context, true); + else if (IsA(expr, Var)) + { + /* Tell get_variable to check for name conflict */ + bool save_varinorderby = context->varInOrderBy; + + context->varInOrderBy = true; + (void) get_variable((Var *) expr, 0, false, context); + context->varInOrderBy = save_varinorderby; + } else { /* @@ -6593,8 +6634,7 @@ get_rule_windowspec(WindowClause *wc, List *targetList, * ---------- */ static void -get_insert_query_def(Query *query, deparse_context *context, - bool colNamesVisible) +get_insert_query_def(Query *query, deparse_context *context) { StringInfo buf = context->buf; RangeTblEntry *select_rte = NULL; @@ -6800,7 +6840,7 @@ get_insert_query_def(Query *query, deparse_context *context, { appendContextKeyword(context, " RETURNING", -PRETTYINDENT_STD, PRETTYINDENT_STD, 1); - get_target_list(query->returningList, context, NULL, colNamesVisible); + get_target_list(query->returningList, context); } } @@ -6810,8 +6850,7 @@ get_insert_query_def(Query *query, deparse_context *context, * ---------- */ static void -get_update_query_def(Query *query, deparse_context *context, - bool colNamesVisible) +get_update_query_def(Query *query, deparse_context *context) { StringInfo buf = context->buf; RangeTblEntry *rte; @@ -6857,7 +6896,7 @@ get_update_query_def(Query *query, deparse_context *context, { appendContextKeyword(context, " RETURNING", -PRETTYINDENT_STD, PRETTYINDENT_STD, 1); - get_target_list(query->returningList, context, NULL, colNamesVisible); + get_target_list(query->returningList, context); } } @@ -7019,8 +7058,7 @@ get_update_query_targetlist_def(Query *query, List *targetList, * ---------- */ static void -get_delete_query_def(Query *query, deparse_context *context, - bool colNamesVisible) +get_delete_query_def(Query *query, deparse_context *context) { StringInfo buf = context->buf; RangeTblEntry *rte; @@ -7061,7 +7099,7 @@ get_delete_query_def(Query *query, deparse_context *context, { appendContextKeyword(context, " RETURNING", -PRETTYINDENT_STD, PRETTYINDENT_STD, 1); - get_target_list(query->returningList, context, NULL, colNamesVisible); + get_target_list(query->returningList, context); } } @@ -7071,12 +7109,12 @@ get_delete_query_def(Query *query, deparse_context *context, * ---------- */ static void -get_merge_query_def(Query *query, deparse_context *context, - bool colNamesVisible) +get_merge_query_def(Query *query, deparse_context *context) { StringInfo buf = context->buf; RangeTblEntry *rte; ListCell *lc; + bool haveNotMatchedBySource; /* Insert the WITH clause if given */ get_with_clause(query, context); @@ -7102,7 +7140,26 @@ get_merge_query_def(Query *query, deparse_context *context, get_from_clause(query, " USING ", context); appendContextKeyword(context, " ON ", -PRETTYINDENT_STD, PRETTYINDENT_STD, 2); - get_rule_expr(query->jointree->quals, context, false); + get_rule_expr(query->mergeJoinCondition, context, false); + + /* + * Test for any NOT MATCHED BY SOURCE actions. If there are none, then + * any NOT MATCHED BY TARGET actions are output as "WHEN NOT MATCHED", per + * SQL standard. Otherwise, we have a non-SQL-standard query, so output + * "BY SOURCE" / "BY TARGET" qualifiers for all NOT MATCHED actions, to be + * more explicit. + */ + haveNotMatchedBySource = false; + foreach(lc, query->mergeActionList) + { + MergeAction *action = lfirst_node(MergeAction, lc); + + if (action->matchKind == MERGE_WHEN_NOT_MATCHED_BY_SOURCE) + { + haveNotMatchedBySource = true; + break; + } + } /* Print each merge action */ foreach(lc, query->mergeActionList) @@ -7111,7 +7168,24 @@ get_merge_query_def(Query *query, deparse_context *context, appendContextKeyword(context, " WHEN ", -PRETTYINDENT_STD, PRETTYINDENT_STD, 2); - appendStringInfo(buf, "%sMATCHED", action->matched ? "" : "NOT "); + switch (action->matchKind) + { + case MERGE_WHEN_MATCHED: + appendStringInfoString(buf, "MATCHED"); + break; + case MERGE_WHEN_NOT_MATCHED_BY_SOURCE: + appendStringInfoString(buf, "NOT MATCHED BY SOURCE"); + break; + case MERGE_WHEN_NOT_MATCHED_BY_TARGET: + if (haveNotMatchedBySource) + appendStringInfoString(buf, "NOT MATCHED BY TARGET"); + else + appendStringInfoString(buf, "NOT MATCHED"); + break; + default: + elog(ERROR, "unrecognized matchKind: %d", + (int) action->matchKind); + } if (action->qual) { @@ -7183,8 +7257,13 @@ get_merge_query_def(Query *query, deparse_context *context, appendStringInfoString(buf, "DO NOTHING"); } - /* No RETURNING support in MERGE yet */ - Assert(query->returningList == NIL); + /* Add RETURNING if present */ + if (query->returningList) + { + appendContextKeyword(context, " RETURNING", + -PRETTYINDENT_STD, PRETTYINDENT_STD, 1); + get_target_list(query->returningList, context); + } } @@ -7250,6 +7329,7 @@ get_variable(Var *var, int levelsup, bool istoplevel, deparse_context *context) deparse_columns *colinfo; char *refname; char *attname; + bool need_prefix; /* Find appropriate nesting depth */ netlevelsup = var->varlevelsup + levelsup; @@ -7445,7 +7525,45 @@ get_variable(Var *var, int levelsup, bool istoplevel, deparse_context *context) attname = get_rte_attribute_name(rte, attnum); } - if (refname && (context->varprefix || attname == NULL)) + need_prefix = (context->varprefix || attname == NULL); + + /* + * If we're considering a plain Var in an ORDER BY (but not GROUP BY) + * clause, we may need to add a table-name prefix to prevent + * findTargetlistEntrySQL92 from misinterpreting the name as an + * output-column name. To avoid cluttering the output with unnecessary + * prefixes, do so only if there is a name match to a SELECT tlist item + * that is different from the Var. + */ + if (context->varInOrderBy && !context->inGroupBy && !need_prefix) + { + int colno = 0; + + foreach_node(TargetEntry, tle, context->targetList) + { + char *colname; + + if (tle->resjunk) + continue; /* ignore junk entries */ + colno++; + + /* This must match colname-choosing logic in get_target_list() */ + if (context->resultDesc && colno <= context->resultDesc->natts) + colname = NameStr(TupleDescAttr(context->resultDesc, + colno - 1)->attname); + else + colname = tle->resname; + + if (colname && strcmp(colname, attname) == 0 && + !equal(var, tle->expr)) + { + need_prefix = true; + break; + } + } + } + + if (refname && need_prefix) { appendStringInfoString(buf, quote_identifier(refname)); appendStringInfoChar(buf, '.'); @@ -7806,22 +7924,28 @@ get_name_for_var_field(Var *var, int fieldno, * Recurse into the sub-select to see what its Var * refers to. We have to build an additional level of * namespace to keep in step with varlevelsup in the - * subselect. + * subselect; furthermore, the subquery RTE might be + * from an outer query level, in which case the + * namespace for the subselect must have that outer + * level as parent namespace. */ + List *save_nslist = context->namespaces; + List *parent_namespaces; deparse_namespace mydpns; const char *result; + parent_namespaces = list_copy_tail(context->namespaces, + netlevelsup); + set_deparse_for_query(&mydpns, rte->subquery, - context->namespaces); + parent_namespaces); - context->namespaces = lcons(&mydpns, - context->namespaces); + context->namespaces = lcons(&mydpns, parent_namespaces); result = get_name_for_var_field((Var *) expr, fieldno, 0, context); - context->namespaces = - list_delete_first(context->namespaces); + context->namespaces = save_nslist; return result; } @@ -7832,17 +7956,31 @@ get_name_for_var_field(Var *var, int fieldno, /* * We're deparsing a Plan tree so we don't have complete * RTE entries (in particular, rte->subquery is NULL). But - * the only place we'd see a Var directly referencing a - * SUBQUERY RTE is in a SubqueryScan plan node, and we can - * look into the child plan's tlist instead. + * the only place we'd normally see a Var directly + * referencing a SUBQUERY RTE is in a SubqueryScan plan + * node, and we can look into the child plan's tlist + * instead. An exception occurs if the subquery was + * proven empty and optimized away: then we'd find such a + * Var in a childless Result node, and there's nothing in + * the plan tree that would let us figure out what it had + * originally referenced. In that case, fall back on + * printing "fN", analogously to the default column names + * for RowExprs. */ TargetEntry *tle; deparse_namespace save_dpns; const char *result; if (!dpns->inner_plan) - elog(ERROR, "failed to find plan for subquery %s", - rte->eref->aliasname); + { + char *dummy_name = palloc(32); + + Assert(dpns->plan && IsA(dpns->plan, Result)); + snprintf(dummy_name, 32, "f%d", fieldno); + return dummy_name; + } + Assert(dpns->plan && IsA(dpns->plan, SubqueryScan)); + tle = get_tle_by_resno(dpns->inner_tlist, attnum); if (!tle) elog(ERROR, "bogus varattno for subquery var: %d", @@ -7913,7 +8051,7 @@ get_name_for_var_field(Var *var, int fieldno, attnum); if (ste == NULL || ste->resjunk) - elog(ERROR, "subquery %s does not have attribute %d", + elog(ERROR, "CTE %s does not have attribute %d", rte->eref->aliasname, attnum); expr = (Node *) ste->expr; if (IsA(expr, Var)) @@ -7921,21 +8059,22 @@ get_name_for_var_field(Var *var, int fieldno, /* * Recurse into the CTE to see what its Var refers to. * We have to build an additional level of namespace - * to keep in step with varlevelsup in the CTE. - * Furthermore it could be an outer CTE, so we may - * have to delete some levels of namespace. + * to keep in step with varlevelsup in the CTE; + * furthermore it could be an outer CTE (compare + * SUBQUERY case above). */ List *save_nslist = context->namespaces; - List *new_nslist; + List *parent_namespaces; deparse_namespace mydpns; const char *result; + parent_namespaces = list_copy_tail(context->namespaces, + ctelevelsup); + set_deparse_for_query(&mydpns, ctequery, - context->namespaces); + parent_namespaces); - new_nslist = list_copy_tail(context->namespaces, - ctelevelsup); - context->namespaces = lcons(&mydpns, new_nslist); + context->namespaces = lcons(&mydpns, parent_namespaces); result = get_name_for_var_field((Var *) expr, fieldno, 0, context); @@ -7950,20 +8089,30 @@ get_name_for_var_field(Var *var, int fieldno, { /* * We're deparsing a Plan tree so we don't have a CTE - * list. But the only places we'd see a Var directly - * referencing a CTE RTE are in CteScan or WorkTableScan - * plan nodes. For those cases, set_deparse_plan arranged - * for dpns->inner_plan to be the plan node that emits the - * CTE or RecursiveUnion result, and we can look at its - * tlist instead. + * list. But the only places we'd normally see a Var + * directly referencing a CTE RTE are in CteScan or + * WorkTableScan plan nodes. For those cases, + * set_deparse_plan arranged for dpns->inner_plan to be + * the plan node that emits the CTE or RecursiveUnion + * result, and we can look at its tlist instead. As + * above, this can fail if the CTE has been proven empty, + * in which case fall back to "fN". */ TargetEntry *tle; deparse_namespace save_dpns; const char *result; if (!dpns->inner_plan) - elog(ERROR, "failed to find plan for CTE %s", - rte->eref->aliasname); + { + char *dummy_name = palloc(32); + + Assert(dpns->plan && IsA(dpns->plan, Result)); + snprintf(dummy_name, 32, "f%d", fieldno); + return dummy_name; + } + Assert(dpns->plan && (IsA(dpns->plan, CteScan) || + IsA(dpns->plan, WorkTableScan))); + tle = get_tle_by_resno(dpns->inner_tlist, attnum); if (!tle) elog(ERROR, "bogus varattno for subquery var: %d", @@ -8106,6 +8255,128 @@ find_param_referent(Param *param, deparse_context *context, return NULL; } +/* + * Try to find a subplan/initplan that emits the value for a PARAM_EXEC Param. + * + * If successful, return the generating subplan/initplan and set *column_p + * to the subplan's 0-based output column number. + * Otherwise, return NULL. + */ +static SubPlan * +find_param_generator(Param *param, deparse_context *context, int *column_p) +{ + /* Initialize output parameter to prevent compiler warnings */ + *column_p = 0; + + /* + * If it's a PARAM_EXEC parameter, search the current plan node as well as + * ancestor nodes looking for a subplan or initplan that emits the value + * for the Param. It could appear in the setParams of an initplan or + * MULTIEXPR_SUBLINK subplan, or in the paramIds of an ancestral SubPlan. + */ + if (param->paramkind == PARAM_EXEC) + { + SubPlan *result; + deparse_namespace *dpns; + ListCell *lc; + + dpns = (deparse_namespace *) linitial(context->namespaces); + + /* First check the innermost plan node's initplans */ + result = find_param_generator_initplan(param, dpns->plan, column_p); + if (result) + return result; + + /* + * The plan's targetlist might contain MULTIEXPR_SUBLINK SubPlans, + * which can be referenced by Params elsewhere in the targetlist. + * (Such Params should always be in the same targetlist, so there's no + * need to do this work at upper plan nodes.) + */ + foreach_node(TargetEntry, tle, dpns->plan->targetlist) + { + if (tle->expr && IsA(tle->expr, SubPlan)) + { + SubPlan *subplan = (SubPlan *) tle->expr; + + if (subplan->subLinkType == MULTIEXPR_SUBLINK) + { + foreach_int(paramid, subplan->setParam) + { + if (paramid == param->paramid) + { + /* Found a match, so return it. */ + *column_p = foreach_current_index(paramid); + return subplan; + } + } + } + } + } + + /* No luck, so check the ancestor nodes */ + foreach(lc, dpns->ancestors) + { + Node *ancestor = (Node *) lfirst(lc); + + /* + * If ancestor is a SubPlan, check the paramIds it provides. + */ + if (IsA(ancestor, SubPlan)) + { + SubPlan *subplan = (SubPlan *) ancestor; + + foreach_int(paramid, subplan->paramIds) + { + if (paramid == param->paramid) + { + /* Found a match, so return it. */ + *column_p = foreach_current_index(paramid); + return subplan; + } + } + + /* SubPlan isn't a kind of Plan, so skip the rest */ + continue; + } + + /* + * Otherwise, it's some kind of Plan node, so check its initplans. + */ + result = find_param_generator_initplan(param, (Plan *) ancestor, + column_p); + if (result) + return result; + + /* No luck, crawl up to next ancestor */ + } + } + + /* No generator found */ + return NULL; +} + +/* + * Subroutine for find_param_generator: search one Plan node's initplans + */ +static SubPlan * +find_param_generator_initplan(Param *param, Plan *plan, int *column_p) +{ + foreach_node(SubPlan, subplan, plan->initPlan) + { + foreach_int(paramid, subplan->setParam) + { + if (paramid == param->paramid) + { + /* Found a match, so return it. */ + *column_p = foreach_current_index(paramid); + return subplan; + } + } + } + return NULL; +} + /* * Display a Param appropriately. */ @@ -8115,12 +8386,13 @@ get_parameter(Param *param, deparse_context *context) Node *expr; deparse_namespace *dpns; ListCell *ancestor_cell; + SubPlan *subplan; + int column; /* * If it's a PARAM_EXEC parameter, try to locate the expression from which - * the parameter was computed. Note that failing to find a referent isn't - * an error, since the Param might well be a subplan output rather than an - * input. + * the parameter was computed. This stanza handles only cases in which + * the Param represents an input to the subplan we are currently in. */ expr = find_param_referent(param, context, &dpns, &ancestor_cell); if (expr) @@ -8164,6 +8436,24 @@ get_parameter(Param *param, deparse_context *context) return; } + /* + * Alternatively, maybe it's a subplan output, which we print as a + * reference to the subplan. (We could drill down into the subplan and + * print the relevant targetlist expression, but that has been deemed too + * confusing since it would violate normal SQL scope rules. Also, we're + * relying on this reference to show that the testexpr containing the + * Param has anything to do with that subplan at all.) + */ + subplan = find_param_generator(param, context, &column); + if (subplan) + { + appendStringInfo(context->buf, "(%s%s).col%d", + subplan->useHashTable ? "hashed " : "", + subplan->plan_name, column + 1); + + return; + } + /* * If it's an external parameter, see if the outermost namespace provides * function argument names. @@ -8212,7 +8502,12 @@ get_parameter(Param *param, deparse_context *context) /* * Not PARAM_EXEC, or couldn't find referent: just print $N. + * + * It's a bug if we get here for anything except PARAM_EXTERN Params, but + * in production builds printing $N seems more useful than failing. */ + Assert(param->paramkind == PARAM_EXTERN); + appendStringInfo(context->buf, "$%d", param->paramid); } @@ -8277,8 +8572,10 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) case T_Aggref: case T_GroupingFunc: case T_WindowFunc: + case T_MergeSupportFunc: case T_FuncExpr: case T_JsonConstructorExpr: + case T_JsonExpr: /* function-like: name(..) or name[..] */ return true; @@ -8450,6 +8747,7 @@ isSimpleNode(Node *node, Node *parentNode, int prettyFlags) case T_GroupingFunc: /* own parentheses */ case T_WindowFunc: /* own parentheses */ case T_CaseExpr: /* other separators */ + case T_JsonExpr: /* own parentheses */ return true; default: return false; @@ -8565,6 +8863,71 @@ get_rule_expr_paren(Node *node, deparse_context *context, appendStringInfoChar(context->buf, ')'); } +static void +get_json_behavior(JsonBehavior *behavior, deparse_context *context, + const char *on) +{ + /* + * The order of array elements must correspond to the order of + * JsonBehaviorType members. + */ + const char *behavior_names[] = + { + " NULL", + " ERROR", + " EMPTY", + " TRUE", + " FALSE", + " UNKNOWN", + " EMPTY ARRAY", + " EMPTY OBJECT", + " DEFAULT " + }; + + if ((int) behavior->btype < 0 || behavior->btype >= lengthof(behavior_names)) + elog(ERROR, "invalid json behavior type: %d", behavior->btype); + + appendStringInfoString(context->buf, behavior_names[behavior->btype]); + + if (behavior->btype == JSON_BEHAVIOR_DEFAULT) + get_rule_expr(behavior->expr, context, false); + + appendStringInfo(context->buf, " ON %s", on); +} + +/* + * get_json_expr_options + * + * Parse back common options for JSON_QUERY, JSON_VALUE, JSON_EXISTS and + * JSON_TABLE columns. + */ +static void +get_json_expr_options(JsonExpr *jsexpr, deparse_context *context, + JsonBehaviorType default_behavior) +{ + if (jsexpr->op == JSON_QUERY_OP) + { + if (jsexpr->wrapper == JSW_CONDITIONAL) + appendStringInfoString(context->buf, " WITH CONDITIONAL WRAPPER"); + else if (jsexpr->wrapper == JSW_UNCONDITIONAL) + appendStringInfoString(context->buf, " WITH UNCONDITIONAL WRAPPER"); + /* The default */ + else if (jsexpr->wrapper == JSW_NONE || jsexpr->wrapper == JSW_UNSPEC) + appendStringInfoString(context->buf, " WITHOUT WRAPPER"); + + if (jsexpr->omit_quotes) + appendStringInfoString(context->buf, " OMIT QUOTES"); + /* The default */ + else + appendStringInfoString(context->buf, " KEEP QUOTES"); + } + + if (jsexpr->on_empty && jsexpr->on_empty->btype != default_behavior) + get_json_behavior(jsexpr->on_empty, context, "EMPTY"); + + if (jsexpr->on_error && jsexpr->on_error->btype != default_behavior) + get_json_behavior(jsexpr->on_error, context, "ERROR"); +} /* ---------- * get_rule_expr - Parse back an expression @@ -8631,6 +8994,10 @@ get_rule_expr(Node *node, deparse_context *context, get_windowfunc_expr((WindowFunc *) node, context); break; + case T_MergeSupportFunc: + appendStringInfoString(buf, "MERGE_ACTION()"); + break; + case T_SubscriptingRef: { SubscriptingRef *sbsref = (SubscriptingRef *) node; @@ -8848,12 +9215,79 @@ get_rule_expr(Node *node, deparse_context *context, * We cannot see an already-planned subplan in rule deparsing, * only while EXPLAINing a query plan. We don't try to * reconstruct the original SQL, just reference the subplan - * that appears elsewhere in EXPLAIN's result. + * that appears elsewhere in EXPLAIN's result. It does seem + * useful to show the subLinkType and testexpr (if any), and + * we also note whether the subplan will be hashed. */ - if (subplan->useHashTable) - appendStringInfo(buf, "(hashed %s)", subplan->plan_name); + switch (subplan->subLinkType) + { + case EXISTS_SUBLINK: + appendStringInfoString(buf, "EXISTS("); + Assert(subplan->testexpr == NULL); + break; + case ALL_SUBLINK: + appendStringInfoString(buf, "(ALL "); + Assert(subplan->testexpr != NULL); + break; + case ANY_SUBLINK: + appendStringInfoString(buf, "(ANY "); + Assert(subplan->testexpr != NULL); + break; + case ROWCOMPARE_SUBLINK: + /* Parenthesizing the testexpr seems sufficient */ + appendStringInfoChar(buf, '('); + Assert(subplan->testexpr != NULL); + break; + case EXPR_SUBLINK: + /* No need to decorate these subplan references */ + appendStringInfoChar(buf, '('); + Assert(subplan->testexpr == NULL); + break; + case MULTIEXPR_SUBLINK: + /* MULTIEXPR isn't executed in the normal way */ + appendStringInfoString(buf, "(rescan "); + Assert(subplan->testexpr == NULL); + break; + case ARRAY_SUBLINK: + appendStringInfoString(buf, "ARRAY("); + Assert(subplan->testexpr == NULL); + break; + case CTE_SUBLINK: + /* This case is unreachable within expressions */ + appendStringInfoString(buf, "CTE("); + Assert(subplan->testexpr == NULL); + break; + } + + if (subplan->testexpr != NULL) + { + deparse_namespace *dpns; + + /* + * Push SubPlan into ancestors list while deparsing + * testexpr, so that we can handle PARAM_EXEC references + * to the SubPlan's paramIds. (This makes it look like + * the SubPlan is an "ancestor" of the current plan node, + * which is a little weird, but it does no harm.) In this + * path, we don't need to mention the SubPlan explicitly, + * because the referencing Params will show its existence. + */ + dpns = (deparse_namespace *) linitial(context->namespaces); + dpns->ancestors = lcons(subplan, dpns->ancestors); + + get_rule_expr(subplan->testexpr, context, showimplicit); + appendStringInfoChar(buf, ')'); + + dpns->ancestors = list_delete_first(dpns->ancestors); + } else - appendStringInfo(buf, "(%s)", subplan->plan_name); + { + /* No referencing Params, so show the SubPlan's name */ + if (subplan->useHashTable) + appendStringInfo(buf, "hashed %s)", subplan->plan_name); + else + appendStringInfo(buf, "%s)", subplan->plan_name); + } } break; @@ -9464,9 +9898,16 @@ get_rule_expr(Node *node, deparse_context *context, } } if (xexpr->op == IS_XMLSERIALIZE) + { appendStringInfo(buf, " AS %s", format_type_with_typemod(xexpr->type, xexpr->typmod)); + if (xexpr->indent) + appendStringInfoString(buf, " INDENT"); + else + appendStringInfoString(buf, " NO INDENT"); + } + if (xexpr->op == IS_DOCUMENT) appendStringInfoString(buf, " IS DOCUMENT"); else @@ -9773,6 +10214,67 @@ get_rule_expr(Node *node, deparse_context *context, } break; + case T_JsonExpr: + { + JsonExpr *jexpr = (JsonExpr *) node; + + switch (jexpr->op) + { + case JSON_EXISTS_OP: + appendStringInfoString(buf, "JSON_EXISTS("); + break; + case JSON_QUERY_OP: + appendStringInfoString(buf, "JSON_QUERY("); + break; + case JSON_VALUE_OP: + appendStringInfoString(buf, "JSON_VALUE("); + break; + default: + elog(ERROR, "unrecognized JsonExpr op: %d", + (int) jexpr->op); + } + + get_rule_expr(jexpr->formatted_expr, context, showimplicit); + + appendStringInfoString(buf, ", "); + + get_json_path_spec(jexpr->path_spec, context, showimplicit); + + if (jexpr->passing_values) + { + ListCell *lc1, + *lc2; + bool needcomma = false; + + appendStringInfoString(buf, " PASSING "); + + forboth(lc1, jexpr->passing_names, + lc2, jexpr->passing_values) + { + if (needcomma) + appendStringInfoString(buf, ", "); + needcomma = true; + + get_rule_expr((Node *) lfirst(lc2), context, showimplicit); + appendStringInfo(buf, " AS %s", + quote_identifier(lfirst_node(String, lc1)->sval)); + } + } + + if (jexpr->op != JSON_EXISTS_OP || + jexpr->returning->typid != BOOLOID) + get_json_returning(jexpr->returning, context->buf, + jexpr->op == JSON_QUERY_OP); + + get_json_expr_options(jexpr, context, + jexpr->op != JSON_EXISTS_OP ? + JSON_BEHAVIOR_NULL : + JSON_BEHAVIOR_FALSE); + + appendStringInfoChar(buf, ')'); + } + break; + case T_List: { char *sep; @@ -9896,6 +10398,7 @@ looks_like_function(Node *node) case T_MinMaxExpr: case T_SQLValueFunction: case T_XmlExpr: + case T_JsonExpr: /* these are all accepted by func_expr_common_subexpr */ return true; default: @@ -10028,7 +10531,7 @@ get_func_expr(FuncExpr *expr, deparse_context *context, argnames, argtypes, expr->funcvariadic, &use_variadic, - context->special_exprkind)); + context->inGroupBy)); nargs = 0; foreach(l, expr->args) { @@ -10098,7 +10601,7 @@ get_agg_expr_helper(Aggref *aggref, deparse_context *context, funcname = generate_function_name(aggref->aggfnoid, nargs, NIL, argtypes, aggref->aggvariadic, &use_variadic, - context->special_exprkind); + context->inGroupBy); /* Print the aggregate name, schema-qualified if needed */ appendStringInfo(buf, "%s(%s", funcname, @@ -10239,7 +10742,7 @@ get_windowfunc_expr_helper(WindowFunc *wfunc, deparse_context *context, if (!funcname) funcname = generate_function_name(wfunc->winfnoid, nargs, argnames, argtypes, false, NULL, - context->special_exprkind); + context->inGroupBy); appendStringInfo(buf, "%s(", funcname); @@ -10278,7 +10781,7 @@ get_windowfunc_expr_helper(WindowFunc *wfunc, deparse_context *context, if (wc->name) appendStringInfoString(buf, quote_identifier(wc->name)); else - get_rule_windowspec(wc, context->windowTList, context); + get_rule_windowspec(wc, context->targetList, context); break; } } @@ -10326,6 +10829,16 @@ get_func_sql_syntax(FuncExpr *expr, deparse_context *context) appendStringInfoChar(buf, ')'); return true; + case F_TIMEZONE_TIMESTAMP: + case F_TIMEZONE_TIMESTAMPTZ: + case F_TIMEZONE_TIMETZ: + /* AT LOCAL */ + appendStringInfoChar(buf, '('); + get_rule_expr_paren((Node *) linitial(expr->args), context, false, + (Node *) expr); + appendStringInfoString(buf, " AT LOCAL)"); + return true; + case F_OVERLAPS_TIMESTAMPTZ_INTERVAL_TIMESTAMPTZ_INTERVAL: case F_OVERLAPS_TIMESTAMPTZ_INTERVAL_TIMESTAMPTZ_TIMESTAMPTZ: case F_OVERLAPS_TIMESTAMPTZ_TIMESTAMPTZ_TIMESTAMPTZ_INTERVAL: @@ -10374,7 +10887,7 @@ get_func_sql_syntax(FuncExpr *expr, deparse_context *context) case F_IS_NORMALIZED: /* IS xxx NORMALIZED */ - appendStringInfoString(buf, "("); + appendStringInfoChar(buf, '('); get_rule_expr_paren((Node *) linitial(expr->args), context, false, (Node *) expr); appendStringInfoString(buf, " IS"); @@ -10755,6 +11268,18 @@ get_const_collation(Const *constval, deparse_context *context) } } +/* + * get_json_path_spec - Parse back a JSON path specification + */ +static void +get_json_path_spec(Node *path_spec, deparse_context *context, bool showimplicit) +{ + if (IsA(path_spec, Const)) + get_const_expr((Const *) path_spec, context, -1); + else + get_rule_expr(path_spec, context, showimplicit); +} + /* * get_json_format - Parse back a JsonFormat node */ @@ -10832,6 +11357,15 @@ get_json_constructor(JsonConstructorExpr *ctor, deparse_context *context, case JSCTOR_JSON_ARRAY: funcname = "JSON_ARRAY"; break; + case JSCTOR_JSON_PARSE: + funcname = "JSON"; + break; + case JSCTOR_JSON_SCALAR: + funcname = "JSON_SCALAR"; + break; + case JSCTOR_JSON_SERIALIZE: + funcname = "JSON_SERIALIZE"; + break; default: elog(ERROR, "invalid JsonConstructorType %d", ctor->type); } @@ -10854,7 +11388,7 @@ get_json_constructor(JsonConstructorExpr *ctor, deparse_context *context, } get_json_constructor_options(ctor, buf); - appendStringInfo(buf, ")"); + appendStringInfoChar(buf, ')'); } /* @@ -10879,7 +11413,12 @@ get_json_constructor_options(JsonConstructorExpr *ctor, StringInfo buf) if (ctor->unique) appendStringInfoString(buf, " WITH UNIQUE KEYS"); - get_json_returning(ctor->returning, buf, true); + /* + * Append RETURNING clause if needed; JSON() and JSON_SCALAR() don't + * support one. + */ + if (ctor->type != JSCTOR_JSON_PARSE && ctor->type != JSCTOR_JSON_SCALAR) + get_json_returning(ctor->returning, buf, true); } /* @@ -11059,16 +11598,14 @@ get_sublink_expr(SubLink *sublink, deparse_context *context) /* ---------- - * get_tablefunc - Parse back a table function + * get_xmltable - Parse back a XMLTABLE function * ---------- */ static void -get_tablefunc(TableFunc *tf, deparse_context *context, bool showimplicit) +get_xmltable(TableFunc *tf, deparse_context *context, bool showimplicit) { StringInfo buf = context->buf; - /* XMLTABLE is the only existing implementation. */ - appendStringInfoString(buf, "XMLTABLE("); if (tf->ns_uris != NIL) @@ -11091,7 +11628,8 @@ get_tablefunc(TableFunc *tf, deparse_context *context, bool showimplicit) if (ns_node != NULL) { get_rule_expr(expr, context, showimplicit); - appendStringInfo(buf, " AS %s", strVal(ns_node)); + appendStringInfo(buf, " AS %s", + quote_identifier(strVal(ns_node))); } else { @@ -11159,6 +11697,227 @@ get_tablefunc(TableFunc *tf, deparse_context *context, bool showimplicit) appendStringInfoChar(buf, ')'); } +/* + * get_json_table_nested_columns - Parse back nested JSON_TABLE columns + */ +static void +get_json_table_nested_columns(TableFunc *tf, JsonTablePlan *plan, + deparse_context *context, bool showimplicit, + bool needcomma) +{ + if (IsA(plan, JsonTablePathScan)) + { + JsonTablePathScan *scan = castNode(JsonTablePathScan, plan); + + if (needcomma) + appendStringInfoChar(context->buf, ','); + + appendStringInfoChar(context->buf, ' '); + appendContextKeyword(context, "NESTED PATH ", 0, 0, 0); + get_const_expr(scan->path->value, context, -1); + appendStringInfo(context->buf, " AS %s", quote_identifier(scan->path->name)); + get_json_table_columns(tf, scan, context, showimplicit); + } + else if (IsA(plan, JsonTableSiblingJoin)) + { + JsonTableSiblingJoin *join = (JsonTableSiblingJoin *) plan; + + get_json_table_nested_columns(tf, join->lplan, context, showimplicit, + needcomma); + get_json_table_nested_columns(tf, join->rplan, context, showimplicit, + true); + } +} + +/* + * get_json_table_columns - Parse back JSON_TABLE columns + */ +static void +get_json_table_columns(TableFunc *tf, JsonTablePathScan *scan, + deparse_context *context, + bool showimplicit) +{ + StringInfo buf = context->buf; + ListCell *lc_colname; + ListCell *lc_coltype; + ListCell *lc_coltypmod; + ListCell *lc_colvalexpr; + int colnum = 0; + + appendStringInfoChar(buf, ' '); + appendContextKeyword(context, "COLUMNS (", 0, 0, 0); + + if (PRETTY_INDENT(context)) + context->indentLevel += PRETTYINDENT_VAR; + + forfour(lc_colname, tf->colnames, + lc_coltype, tf->coltypes, + lc_coltypmod, tf->coltypmods, + lc_colvalexpr, tf->colvalexprs) + { + char *colname = strVal(lfirst(lc_colname)); + JsonExpr *colexpr; + Oid typid; + int32 typmod; + bool ordinality; + JsonBehaviorType default_behavior; + + typid = lfirst_oid(lc_coltype); + typmod = lfirst_int(lc_coltypmod); + colexpr = castNode(JsonExpr, lfirst(lc_colvalexpr)); + + /* Skip columns that don't belong to this scan. */ + if (scan->colMin < 0 || colnum < scan->colMin) + { + colnum++; + continue; + } + if (colnum > scan->colMax) + break; + + if (colnum > scan->colMin) + appendStringInfoString(buf, ", "); + + colnum++; + + ordinality = !colexpr; + + appendContextKeyword(context, "", 0, 0, 0); + + appendStringInfo(buf, "%s %s", quote_identifier(colname), + ordinality ? "FOR ORDINALITY" : + format_type_with_typemod(typid, typmod)); + if (ordinality) + continue; + + /* + * Set default_behavior to guide get_json_expr_options() on whether to + * to emit the ON ERROR / EMPTY clauses. + */ + if (colexpr->op == JSON_EXISTS_OP) + { + appendStringInfoString(buf, " EXISTS"); + default_behavior = JSON_BEHAVIOR_FALSE; + } + else + { + if (colexpr->op == JSON_QUERY_OP) + { + char typcategory; + bool typispreferred; + + get_type_category_preferred(typid, &typcategory, &typispreferred); + + if (typcategory == TYPCATEGORY_STRING) + appendStringInfoString(buf, + colexpr->format->format_type == JS_FORMAT_JSONB ? + " FORMAT JSONB" : " FORMAT JSON"); + } + + default_behavior = JSON_BEHAVIOR_NULL; + } + + appendStringInfoString(buf, " PATH "); + + get_json_path_spec(colexpr->path_spec, context, showimplicit); + + get_json_expr_options(colexpr, context, default_behavior); + } + + if (scan->child) + get_json_table_nested_columns(tf, scan->child, context, showimplicit, + scan->colMin >= 0); + + if (PRETTY_INDENT(context)) + context->indentLevel -= PRETTYINDENT_VAR; + + appendContextKeyword(context, ")", 0, 0, 0); +} + +/* ---------- + * get_json_table - Parse back a JSON_TABLE function + * ---------- + */ +static void +get_json_table(TableFunc *tf, deparse_context *context, bool showimplicit) +{ + StringInfo buf = context->buf; + JsonExpr *jexpr = castNode(JsonExpr, tf->docexpr); + JsonTablePathScan *root = castNode(JsonTablePathScan, tf->plan); + + appendStringInfoString(buf, "JSON_TABLE("); + + if (PRETTY_INDENT(context)) + context->indentLevel += PRETTYINDENT_VAR; + + appendContextKeyword(context, "", 0, 0, 0); + + get_rule_expr(jexpr->formatted_expr, context, showimplicit); + + appendStringInfoString(buf, ", "); + + get_const_expr(root->path->value, context, -1); + + appendStringInfo(buf, " AS %s", quote_identifier(root->path->name)); + + if (jexpr->passing_values) + { + ListCell *lc1, + *lc2; + bool needcomma = false; + + appendStringInfoChar(buf, ' '); + appendContextKeyword(context, "PASSING ", 0, 0, 0); + + if (PRETTY_INDENT(context)) + context->indentLevel += PRETTYINDENT_VAR; + + forboth(lc1, jexpr->passing_names, + lc2, jexpr->passing_values) + { + if (needcomma) + appendStringInfoString(buf, ", "); + needcomma = true; + + appendContextKeyword(context, "", 0, 0, 0); + + get_rule_expr((Node *) lfirst(lc2), context, false); + appendStringInfo(buf, " AS %s", + quote_identifier((lfirst_node(String, lc1))->sval) + ); + } + + if (PRETTY_INDENT(context)) + context->indentLevel -= PRETTYINDENT_VAR; + } + + get_json_table_columns(tf, castNode(JsonTablePathScan, tf->plan), context, + showimplicit); + + if (jexpr->on_error->btype != JSON_BEHAVIOR_EMPTY_ARRAY) + get_json_behavior(jexpr->on_error, context, "ERROR"); + + if (PRETTY_INDENT(context)) + context->indentLevel -= PRETTYINDENT_VAR; + + appendContextKeyword(context, ")", 0, 0, 0); +} + +/* ---------- + * get_tablefunc - Parse back a table function + * ---------- + */ +static void +get_tablefunc(TableFunc *tf, deparse_context *context, bool showimplicit) +{ + /* XMLTABLE and JSON_TABLE are the only existing implementations. */ + + if (tf->functype == TFT_XMLTABLE) + get_xmltable(tf, context, showimplicit); + else if (tf->functype == TFT_JSON_TABLE) + get_json_table(tf, context, showimplicit); +} + /* ---------- * get_from_clause - Parse back a FROM clause * @@ -11730,7 +12489,7 @@ get_tablesample_def(TableSampleClause *tablesample, deparse_context *context) appendStringInfo(buf, " TABLESAMPLE %s (", generate_function_name(tablesample->tsmhandler, 1, NIL, argtypes, - false, NULL, EXPR_KIND_NONE)); + false, NULL, false)); nargs = 0; foreach(l, tablesample->args) @@ -12150,12 +12909,14 @@ generate_qualified_relation_name(Oid relid) * the output. For non-FuncExpr cases, has_variadic should be false and * use_variadic_p can be NULL. * + * inGroupBy must be true if we're deparsing a GROUP BY clause. + * * The result includes all necessary quoting and schema-prefixing. */ static char * generate_function_name(Oid funcid, int nargs, List *argnames, Oid *argtypes, bool has_variadic, bool *use_variadic_p, - ParseExprKind special_exprkind) + bool inGroupBy) { char *result; HeapTuple proctup; @@ -12180,9 +12941,9 @@ generate_function_name(Oid funcid, int nargs, List *argnames, Oid *argtypes, /* * Due to parser hacks to avoid needing to reserve CUBE, we need to force - * qualification in some special cases. + * qualification of some function names within GROUP BY. */ - if (special_exprkind == EXPR_KIND_GROUP_BY) + if (inGroupBy) { if (strcmp(proname, "cube") == 0 || strcmp(proname, "rollup") == 0) force_qualify = true; diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index c4fcd0076eac0..f420517961f01 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -10,7 +10,7 @@ * Index cost functions are located via the index AM's API struct, * which is obtained from the handler function registered in pg_am. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -119,7 +119,9 @@ #include "optimizer/paths.h" #include "optimizer/plancat.h" #include "parser/parse_clause.h" +#include "parser/parse_relation.h" #include "parser/parsetree.h" +#include "rewrite/rewriteManip.h" #include "statistics/statistics.h" #include "storage/bufmgr.h" #include "utils/acl.h" @@ -2128,10 +2130,14 @@ scalararraysel(PlannerInfo *root, /* * Estimate number of elements in the array yielded by an expression. * - * It's important that this agree with scalararraysel. + * Note: the result is integral, but we use "double" to avoid overflow + * concerns. Most callers will use it in double-type expressions anyway. + * + * Note: in some code paths root can be passed as NULL, resulting in + * slightly worse estimates. */ -int -estimate_array_length(Node *arrayexpr) +double +estimate_array_length(PlannerInfo *root, Node *arrayexpr) { /* look through any binary-compatible relabeling of arrayexpr */ arrayexpr = strip_array_coercion(arrayexpr); @@ -2152,11 +2158,39 @@ estimate_array_length(Node *arrayexpr) { return list_length(((ArrayExpr *) arrayexpr)->elements); } - else + else if (arrayexpr && root) { - /* default guess --- see also scalararraysel */ - return 10; + /* See if we can find any statistics about it */ + VariableStatData vardata; + AttStatsSlot sslot; + double nelem = 0; + + examine_variable(root, arrayexpr, 0, &vardata); + if (HeapTupleIsValid(vardata.statsTuple)) + { + /* + * Found stats, so use the average element count, which is stored + * in the last stanumbers element of the DECHIST statistics. + * Actually that is the average count of *distinct* elements; + * perhaps we should scale it up somewhat? + */ + if (get_attstatsslot(&sslot, vardata.statsTuple, + STATISTIC_KIND_DECHIST, InvalidOid, + ATTSTATSSLOT_NUMBERS)) + { + if (sslot.nnumbers > 0) + nelem = clamp_row_est(sslot.numbers[sslot.nnumbers - 1]); + free_attstatsslot(&sslot); + } + } + ReleaseVariableStats(vardata); + + if (nelem > 0) + return nelem; } + + /* Else use a default guess --- this should match scalararraysel */ + return 10; } /* @@ -3273,6 +3307,15 @@ add_unique_group_var(PlannerInfo *root, List *varinfos, ndistinct = get_variable_numdistinct(vardata, &isdefault); + /* + * The nullingrels bits within the var could cause the same var to be + * counted multiple times if it's marked with different nullingrels. They + * could also prevent us from matching the var to the expressions in + * extended statistics (see estimate_multivariate_ndistinct). So strip + * them out first. + */ + var = remove_nulling_relids(var, root->outer_join_rels, NULL); + foreach(lc, varinfos) { varinfo = (GroupVarInfo *) lfirst(lc); @@ -4802,6 +4845,10 @@ convert_timevalue_to_scalar(Datum value, Oid typid, bool *failure) * Convert the month part of Interval to days using assumed * average month length of 365.25/12.0 days. Not too * accurate, but plenty good enough for our purposes. + * + * This also works for infinite intervals, which just have all + * fields set to INT_MIN/INT_MAX, and so will produce a result + * smaller/larger than any finite interval. */ return interval->time + interval->day * (double) USECS_PER_DAY + interval->month * ((DAYS_PER_YEAR / (double) MONTHS_PER_YEAR) * USECS_PER_DAY); @@ -4980,6 +5027,7 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, { Node *basenode; Relids varnos; + Relids basevarnos; RelOptInfo *onerel; /* Make sure we don't return dangling pointers in vardata */ @@ -5021,25 +5069,32 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, * relation are considered "real" vars. */ varnos = pull_varnos(root, basenode); + basevarnos = bms_difference(varnos, root->outer_join_rels); onerel = NULL; - switch (bms_membership(varnos)) + if (bms_is_empty(basevarnos)) { - case BMS_EMPTY_SET: - /* No Vars at all ... must be pseudo-constant clause */ - break; - case BMS_SINGLETON: - if (varRelid == 0 || bms_is_member(varRelid, varnos)) + /* No Vars at all ... must be pseudo-constant clause */ + } + else + { + int relid; + + /* Check if the expression is in vars of a single base relation */ + if (bms_get_singleton_member(basevarnos, &relid)) + { + if (varRelid == 0 || varRelid == relid) { - onerel = find_base_rel(root, - (varRelid ? varRelid : bms_singleton_member(varnos))); + onerel = find_base_rel(root, relid); vardata->rel = onerel; node = basenode; /* strip any relabeling */ } /* else treat it as a constant */ - break; - case BMS_MULTIPLE: + } + else + { + /* varnos has multiple relids */ if (varRelid == 0) { /* treat it as a variable of a join relation */ @@ -5054,10 +5109,10 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, /* note: no point in expressional-index search here */ } /* else treat it as a constant */ - break; + } } - bms_free(varnos); + bms_free(basevarnos); vardata->var = node; vardata->atttype = exprType(node); @@ -5082,6 +5137,14 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, ListCell *slist; Oid userid; + /* + * The nullingrels bits within the expression could prevent us from + * matching it to expressional index columns or to the expressions in + * extended statistics. So strip them out first. + */ + if (bms_overlap(varnos, root->outer_join_rels)) + node = remove_nulling_relids(node, root->outer_join_rels, NULL); + /* * Determine the user ID to use for privilege checks: either * onerel->userid if it's set (e.g., in case we're accessing the table @@ -5352,6 +5415,8 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, } } } + + bms_free(varnos); } /* @@ -5359,7 +5424,7 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, * Handle a simple Var for examine_variable * * This is split out as a subroutine so that we can recurse to deal with - * Vars referencing subqueries. + * Vars referencing subqueries (either sub-SELECT-in-FROM or CTE style). * * We already filled in all the fields of *vardata except for the stats tuple. */ @@ -5396,17 +5461,30 @@ examine_simple_variable(PlannerInfo *root, Var *var, if (HeapTupleIsValid(vardata->statsTuple)) { - RelOptInfo *onerel = find_base_rel(root, var->varno); + RelOptInfo *onerel = find_base_rel_noerr(root, var->varno); Oid userid; /* * Check if user has permission to read this column. We require * all rows to be accessible, so there must be no securityQuals - * from security barrier views or RLS policies. Use - * onerel->userid if it's set, in case we're accessing the table - * via a view. + * from security barrier views or RLS policies. + * + * Normally the Var will have an associated RelOptInfo from which + * we can find out which userid to do the check as; but it might + * not if it's a RETURNING Var for an INSERT target relation. In + * that case use the RTEPermissionInfo associated with the RTE. */ - userid = OidIsValid(onerel->userid) ? onerel->userid : GetUserId(); + if (onerel) + userid = onerel->userid; + else + { + RTEPermissionInfo *perminfo; + + perminfo = getRTEPermissionInfo(root->parse->rteperminfos, rte); + userid = perminfo->checkAsUser; + } + if (!OidIsValid(userid)) + userid = GetUserId(); vardata->acl_ok = rte->securityQuals == NIL && @@ -5493,13 +5571,19 @@ examine_simple_variable(PlannerInfo *root, Var *var, vardata->acl_ok = true; } } - else if (rte->rtekind == RTE_SUBQUERY && !rte->inh) + else if ((rte->rtekind == RTE_SUBQUERY && !rte->inh) || + (rte->rtekind == RTE_CTE && !rte->self_reference)) { /* - * Plain subquery (not one that was converted to an appendrel). + * Plain subquery (not one that was converted to an appendrel) or + * non-recursive CTE. In either case, we can try to find out what the + * Var refers to within the subquery. We skip this for appendrel and + * recursive-CTE cases because any column stats we did find would + * likely not be very relevant. */ - Query *subquery = rte->subquery; - RelOptInfo *rel; + PlannerInfo *subroot; + Query *subquery; + List *subtlist; TargetEntry *ste; /* @@ -5508,6 +5592,85 @@ examine_simple_variable(PlannerInfo *root, Var *var, if (var->varattno == InvalidAttrNumber) return; + /* + * Otherwise, find the subquery's planner subroot. + */ + if (rte->rtekind == RTE_SUBQUERY) + { + RelOptInfo *rel; + + /* + * Fetch RelOptInfo for subquery. Note that we don't change the + * rel returned in vardata, since caller expects it to be a rel of + * the caller's query level. Because we might already be + * recursing, we can't use that rel pointer either, but have to + * look up the Var's rel afresh. + */ + rel = find_base_rel(root, var->varno); + + subroot = rel->subroot; + } + else + { + /* CTE case is more difficult */ + PlannerInfo *cteroot; + Index levelsup; + int ndx; + int plan_id; + ListCell *lc; + + /* + * Find the referenced CTE, and locate the subroot previously made + * for it. + */ + levelsup = rte->ctelevelsup; + cteroot = root; + while (levelsup-- > 0) + { + cteroot = cteroot->parent_root; + if (!cteroot) /* shouldn't happen */ + elog(ERROR, "bad levelsup for CTE \"%s\"", rte->ctename); + } + + /* + * Note: cte_plan_ids can be shorter than cteList, if we are still + * working on planning the CTEs (ie, this is a side-reference from + * another CTE). So we mustn't use forboth here. + */ + ndx = 0; + foreach(lc, cteroot->parse->cteList) + { + CommonTableExpr *cte = (CommonTableExpr *) lfirst(lc); + + if (strcmp(cte->ctename, rte->ctename) == 0) + break; + ndx++; + } + if (lc == NULL) /* shouldn't happen */ + elog(ERROR, "could not find CTE \"%s\"", rte->ctename); + if (ndx >= list_length(cteroot->cte_plan_ids)) + elog(ERROR, "could not find plan for CTE \"%s\"", rte->ctename); + plan_id = list_nth_int(cteroot->cte_plan_ids, ndx); + if (plan_id <= 0) + elog(ERROR, "no plan was made for CTE \"%s\"", rte->ctename); + subroot = list_nth(root->glob->subroots, plan_id - 1); + } + + /* If the subquery hasn't been planned yet, we have to punt */ + if (subroot == NULL) + return; + Assert(IsA(subroot, PlannerInfo)); + + /* + * We must use the subquery parsetree as mangled by the planner, not + * the raw version from the RTE, because we need a Var that will refer + * to the subroot's live RelOptInfos. For instance, if any subquery + * pullup happened during planning, Vars in the targetlist might have + * gotten replaced, and we need to see the replacement expressions. + */ + subquery = subroot->parse; + Assert(IsA(subquery, Query)); + /* * Punt if subquery uses set operations or GROUP BY, as these will * mash underlying columns' stats beyond recognition. (Set ops are @@ -5521,33 +5684,12 @@ examine_simple_variable(PlannerInfo *root, Var *var, subquery->groupingSets) return; - /* - * OK, fetch RelOptInfo for subquery. Note that we don't change the - * rel returned in vardata, since caller expects it to be a rel of the - * caller's query level. Because we might already be recursing, we - * can't use that rel pointer either, but have to look up the Var's - * rel afresh. - */ - rel = find_base_rel(root, var->varno); - - /* If the subquery hasn't been planned yet, we have to punt */ - if (rel->subroot == NULL) - return; - Assert(IsA(rel->subroot, PlannerInfo)); - - /* - * Switch our attention to the subquery as mangled by the planner. It - * was okay to look at the pre-planning version for the tests above, - * but now we need a Var that will refer to the subroot's live - * RelOptInfos. For instance, if any subquery pullup happened during - * planning, Vars in the targetlist might have gotten replaced, and we - * need to see the replacement expressions. - */ - subquery = rel->subroot->parse; - Assert(IsA(subquery, Query)); - /* Get the subquery output expression referenced by the upper Var */ - ste = get_tle_by_resno(subquery->targetList, var->varattno); + if (subquery->returningList) + subtlist = subquery->returningList; + else + subtlist = subquery->targetList; + ste = get_tle_by_resno(subtlist, var->varattno); if (ste == NULL || ste->resjunk) elog(ERROR, "subquery %s does not have attribute %d", rte->eref->aliasname, var->varattno); @@ -5595,16 +5737,16 @@ examine_simple_variable(PlannerInfo *root, Var *var, * if the underlying column is unique, the subquery may have * joined to other tables in a way that creates duplicates. */ - examine_simple_variable(rel->subroot, var, vardata); + examine_simple_variable(subroot, var, vardata); } } else { /* - * Otherwise, the Var comes from a FUNCTION, VALUES, or CTE RTE. (We - * won't see RTE_JOIN here because join alias Vars have already been + * Otherwise, the Var comes from a FUNCTION or VALUES RTE. (We won't + * see RTE_JOIN here because join alias Vars have already been * flattened.) There's not much we can do with function outputs, but - * maybe someday try to be smarter about VALUES and/or CTEs. + * maybe someday try to be smarter about VALUES. */ } } @@ -6313,17 +6455,14 @@ find_join_input_rel(PlannerInfo *root, Relids relids) { RelOptInfo *rel = NULL; - switch (bms_membership(relids)) + if (!bms_is_empty(relids)) { - case BMS_EMPTY_SET: - /* should not happen */ - break; - case BMS_SINGLETON: - rel = find_base_rel(root, bms_singleton_member(relids)); - break; - case BMS_MULTIPLE: + int relid; + + if (bms_get_singleton_member(relids, &relid)) + rel = find_base_rel(root, relid); + else rel = find_join_rel(root, relids); - break; } if (rel == NULL) @@ -6459,21 +6598,26 @@ genericcostestimate(PlannerInfo *root, selectivityQuals = add_predicate_to_index_quals(index, indexQuals); /* - * Check for ScalarArrayOpExpr index quals, and estimate the number of - * index scans that will be performed. + * If caller didn't give us an estimate for ScalarArrayOpExpr index scans, + * just assume that the number of index descents is the number of distinct + * combinations of array elements from all of the scan's SAOP clauses. */ - num_sa_scans = 1; - foreach(l, indexQuals) + num_sa_scans = costs->num_sa_scans; + if (num_sa_scans < 1) { - RestrictInfo *rinfo = (RestrictInfo *) lfirst(l); - - if (IsA(rinfo->clause, ScalarArrayOpExpr)) + num_sa_scans = 1; + foreach(l, indexQuals) { - ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) rinfo->clause; - int alength = estimate_array_length(lsecond(saop->args)); + RestrictInfo *rinfo = (RestrictInfo *) lfirst(l); + + if (IsA(rinfo->clause, ScalarArrayOpExpr)) + { + ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) rinfo->clause; + double alength = estimate_array_length(root, lsecond(saop->args)); - if (alength > 1) - num_sa_scans *= alength; + if (alength > 1) + num_sa_scans *= alength; + } } } @@ -6700,9 +6844,9 @@ btcostestimate(PlannerInfo *root, IndexPath *path, double loop_count, * For a RowCompareExpr, we consider only the first column, just as * rowcomparesel() does. * - * If there's a ScalarArrayOpExpr in the quals, we'll actually perform N - * index scans not one, but the ScalarArrayOpExpr's operator can be - * considered to act the same as it normally does. + * If there's a ScalarArrayOpExpr in the quals, we'll actually perform up + * to N index descents (not just one), but the ScalarArrayOpExpr's + * operator can be considered to act the same as it normally does. */ indexBoundQuals = NIL; indexcol = 0; @@ -6750,11 +6894,11 @@ btcostestimate(PlannerInfo *root, IndexPath *path, double loop_count, { ScalarArrayOpExpr *saop = (ScalarArrayOpExpr *) clause; Node *other_operand = (Node *) lsecond(saop->args); - int alength = estimate_array_length(other_operand); + double alength = estimate_array_length(root, other_operand); clause_op = saop->opno; found_saop = true; - /* count number of SA scans induced by indexBoundQuals only */ + /* estimate SA descents by indexBoundQuals only */ if (alength > 1) num_sa_scans *= alength; } @@ -6817,10 +6961,48 @@ btcostestimate(PlannerInfo *root, IndexPath *path, double loop_count, NULL); numIndexTuples = btreeSelectivity * index->rel->tuples; + /* + * btree automatically combines individual ScalarArrayOpExpr primitive + * index scans whenever the tuples covered by the next set of array + * keys are close to tuples covered by the current set. That puts a + * natural ceiling on the worst case number of descents -- there + * cannot possibly be more than one descent per leaf page scanned. + * + * Clamp the number of descents to at most 1/3 the number of index + * pages. This avoids implausibly high estimates with low selectivity + * paths, where scans usually require only one or two descents. This + * is most likely to help when there are several SAOP clauses, where + * naively accepting the total number of distinct combinations of + * array elements as the number of descents would frequently lead to + * wild overestimates. + * + * We somewhat arbitrarily don't just make the cutoff the total number + * of leaf pages (we make it 1/3 the total number of pages instead) to + * give the btree code credit for its ability to continue on the leaf + * level with low selectivity scans. + */ + num_sa_scans = Min(num_sa_scans, ceil(index->pages * 0.3333333)); + num_sa_scans = Max(num_sa_scans, 1); + /* * As in genericcostestimate(), we have to adjust for any * ScalarArrayOpExpr quals included in indexBoundQuals, and then round * to integer. + * + * It is tempting to make genericcostestimate behave as if SAOP + * clauses work in almost the same way as scalar operators during + * btree scans, making the top-level scan look like a continuous scan + * (as opposed to num_sa_scans-many primitive index scans). After + * all, btree scans mostly work like that at runtime. However, such a + * scheme would badly bias genericcostestimate's simplistic approach + * to calculating numIndexPages through prorating. + * + * Stick with the approach taken by non-native SAOP scans for now. + * genericcostestimate will use the Mackert-Lohman formula to + * compensate for repeat page fetches, even though that definitely + * won't happen during btree scans (not for leaf pages, at least). + * We're usually very pessimistic about the number of primitive index + * scans that will be required, but it's not clear how to do better. */ numIndexTuples = rint(numIndexTuples / num_sa_scans); } @@ -6829,6 +7011,7 @@ btcostestimate(PlannerInfo *root, IndexPath *path, double loop_count, * Now do generic index cost estimation. */ costs.numIndexTuples = numIndexTuples; + costs.num_sa_scans = num_sa_scans; genericcostestimate(root, path, loop_count, &costs); @@ -6839,9 +7022,9 @@ btcostestimate(PlannerInfo *root, IndexPath *path, double loop_count, * comparisons to descend a btree of N leaf tuples. We charge one * cpu_operator_cost per comparison. * - * If there are ScalarArrayOpExprs, charge this once per SA scan. The - * ones after the first one are not startup cost so far as the overall - * plan is concerned, so add them only to "total" cost. + * If there are ScalarArrayOpExprs, charge this once per estimated SA + * index descent. The ones after the first one are not startup cost so + * far as the overall plan goes, so just add them to "total" cost. */ if (index->tuples > 1) /* avoid computing log(0) */ { @@ -6858,7 +7041,8 @@ btcostestimate(PlannerInfo *root, IndexPath *path, double loop_count, * in cases where only a single leaf page is expected to be visited. This * cost is somewhat arbitrarily set at 50x cpu_operator_cost per page * touched. The number of such pages is btree tree height plus one (ie, - * we charge for the leaf page too). As above, charge once per SA scan. + * we charge for the leaf page too). As above, charge once per estimated + * SA index descent. */ descentCost = (index->tree_height + 1) * DEFAULT_PAGE_CPU_MULTIPLIER * cpu_operator_cost; costs.indexStartupCost += descentCost; @@ -7344,7 +7528,7 @@ gincost_scalararrayopexpr(PlannerInfo *root, { counts->exactEntries++; counts->searchEntries++; - counts->arrayScans *= estimate_array_length(rightop); + counts->arrayScans *= estimate_array_length(root, rightop); return true; } diff --git a/src/backend/utils/adt/tid.c b/src/backend/utils/adt/tid.c index 77fb74ab0c167..8cff1e7a12e80 100644 --- a/src/backend/utils/adt/tid.c +++ b/src/backend/utils/adt/tid.c @@ -3,7 +3,7 @@ * tid.c * Functions for the built-in type tuple id * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -20,8 +20,8 @@ #include #include -#include "access/heapam.h" #include "access/sysattr.h" +#include "access/table.h" #include "access/tableam.h" #include "catalog/namespace.h" #include "catalog/pg_type.h" @@ -30,7 +30,7 @@ #include "miscadmin.h" #include "parser/parsetree.h" #include "utils/acl.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/snapmgr.h" diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 0e50aaec5a526..cdc7e43b93043 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -3,7 +3,7 @@ * timestamp.c * Functions for the built-in SQL types "timestamp" and "interval". * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -27,7 +27,6 @@ #include "funcapi.h" #include "libpq/pqformat.h" #include "miscadmin.h" -#include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" #include "nodes/supportnodes.h" #include "parser/scansup.h" @@ -72,6 +71,21 @@ typedef struct pg_tz *attimezone; } generate_series_timestamptz_fctx; +/* + * The transition datatype for interval aggregates is declared as internal. + * It's a pointer to an IntervalAggState allocated in the aggregate context. + */ +typedef struct IntervalAggState +{ + int64 N; /* count of finite intervals processed */ + Interval sumX; /* sum of finite intervals processed */ + /* These counts are *not* included in N! Use IA_TOTAL_COUNT() as needed */ + int64 pInfcount; /* count of +infinity intervals */ + int64 nInfcount; /* count of -infinity intervals */ +} IntervalAggState; + +#define IA_TOTAL_COUNT(ia) \ + ((ia)->N + (ia)->pInfcount + (ia)->nInfcount) static TimeOffset time2t(const int hour, const int min, const int sec, const fsec_t fsec); static Timestamp dt2local(Timestamp dt, int timezone); @@ -80,6 +94,8 @@ static bool AdjustIntervalForTypmod(Interval *interval, int32 typmod, static TimestampTz timestamp2timestamptz(Timestamp timestamp); static Timestamp timestamptz2timestamp(TimestampTz timestamp); +static void EncodeSpecialInterval(const Interval *interval, char *str); +static void interval_um_internal(const Interval *interval, Interval *result); /* common code for timestamptypmodin and timestamptztypmodin */ static int32 @@ -941,6 +957,14 @@ interval_in(PG_FUNCTION_ARGS) errmsg("interval out of range"))); break; + case DTK_LATE: + INTERVAL_NOEND(result); + break; + + case DTK_EARLY: + INTERVAL_NOBEGIN(result); + break; + default: elog(ERROR, "unexpected dtype %d while parsing interval \"%s\"", dtype, str); @@ -963,8 +987,13 @@ interval_out(PG_FUNCTION_ARGS) *itm = &tt; char buf[MAXDATELEN + 1]; - interval2itm(*span, itm); - EncodeInterval(itm, IntervalStyle, buf); + if (INTERVAL_NOT_FINITE(span)) + EncodeSpecialInterval(span, buf); + else + { + interval2itm(*span, itm); + EncodeInterval(itm, IntervalStyle, buf); + } result = pstrdup(buf); PG_RETURN_CSTRING(result); @@ -1350,6 +1379,10 @@ AdjustIntervalForTypmod(Interval *interval, int32 typmod, INT64CONST(0) }; + /* Typmod has no effect on infinite intervals */ + if (INTERVAL_NOT_FINITE(interval)) + return true; + /* * Unspecified range and precision? Then not necessary to adjust. Setting * typmod to -1 is the convention for all data types. @@ -1475,17 +1508,23 @@ AdjustIntervalForTypmod(Interval *interval, int32 typmod, if (interval->time >= INT64CONST(0)) { - interval->time = ((interval->time + - IntervalOffsets[precision]) / - IntervalScales[precision]) * - IntervalScales[precision]; + if (pg_add_s64_overflow(interval->time, + IntervalOffsets[precision], + &interval->time)) + ereturn(escontext, false, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + interval->time -= interval->time % IntervalScales[precision]; } else { - interval->time = -(((-interval->time + - IntervalOffsets[precision]) / - IntervalScales[precision]) * - IntervalScales[precision]); + if (pg_sub_s64_overflow(interval->time, + IntervalOffsets[precision], + &interval->time)) + ereturn(escontext, false, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + interval->time -= interval->time % IntervalScales[precision]; } } } @@ -1509,24 +1548,45 @@ make_interval(PG_FUNCTION_ARGS) Interval *result; /* - * Reject out-of-range inputs. We really ought to check the integer - * inputs as well, but it's not entirely clear what limits to apply. + * Reject out-of-range inputs. We reject any input values that cause + * integer overflow of the corresponding interval fields. */ if (isinf(secs) || isnan(secs)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); + goto out_of_range; result = (Interval *) palloc(sizeof(Interval)); - result->month = years * MONTHS_PER_YEAR + months; - result->day = weeks * 7 + days; - secs = rint(secs * USECS_PER_SEC); - result->time = hours * ((int64) SECS_PER_HOUR * USECS_PER_SEC) + - mins * ((int64) SECS_PER_MINUTE * USECS_PER_SEC) + - (int64) secs; + /* years and months -> months */ + if (pg_mul_s32_overflow(years, MONTHS_PER_YEAR, &result->month) || + pg_add_s32_overflow(result->month, months, &result->month)) + goto out_of_range; + + /* weeks and days -> days */ + if (pg_mul_s32_overflow(weeks, DAYS_PER_WEEK, &result->day) || + pg_add_s32_overflow(result->day, days, &result->day)) + goto out_of_range; + + /* hours and mins -> usecs (cannot overflow 64-bit) */ + result->time = hours * USECS_PER_HOUR + mins * USECS_PER_MINUTE; + + /* secs -> usecs */ + secs = rint(float8_mul(secs, USECS_PER_SEC)); + if (!FLOAT8_FITS_IN_INT64(secs) || + pg_add_s64_overflow(result->time, (int64) secs, &result->time)) + goto out_of_range; + + /* make sure that the result is finite */ + if (INTERVAL_NOT_FINITE(result)) + goto out_of_range; PG_RETURN_INTERVAL_P(result); + +out_of_range: + ereport(ERROR, + errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range")); + + PG_RETURN_NULL(); /* keep compiler quiet */ } /* EncodeSpecialTimestamp() @@ -1543,6 +1603,17 @@ EncodeSpecialTimestamp(Timestamp dt, char *str) elog(ERROR, "invalid argument for EncodeSpecialTimestamp"); } +static void +EncodeSpecialInterval(const Interval *interval, char *str) +{ + if (INTERVAL_IS_NOBEGIN(interval)) + strcpy(str, EARLY); + else if (INTERVAL_IS_NOEND(interval)) + strcpy(str, LATE); + else /* shouldn't happen */ + elog(ERROR, "invalid argument for EncodeSpecialInterval"); +} + Datum now(PG_FUNCTION_ARGS) { @@ -1998,6 +2069,9 @@ interval2itm(Interval span, struct pg_itm *itm) /* itm2interval() * Convert a pg_itm structure to an Interval. * Returns 0 if OK, -1 on overflow. + * + * This is for use in computations expected to produce finite results. Any + * inputs that lead to infinite results are treated as overflows. */ int itm2interval(struct pg_itm *itm, Interval *span) @@ -2021,12 +2095,21 @@ itm2interval(struct pg_itm *itm, Interval *span) if (pg_add_s64_overflow(span->time, itm->tm_usec, &span->time)) return -1; + if (INTERVAL_NOT_FINITE(span)) + return -1; return 0; } /* itmin2interval() * Convert a pg_itm_in structure to an Interval. * Returns 0 if OK, -1 on overflow. + * + * Note: if the result is infinite, it is not treated as an overflow. This + * avoids any dump/reload hazards from pre-17 databases that do not support + * infinite intervals, but do allow finite intervals with all fields set to + * INT_MIN/INT_MAX (outside the documented range). Such intervals will be + * silently converted to +/-infinity. This may not be ideal, but seems + * preferable to failure, and ought to be pretty unlikely in practice. */ int itmin2interval(struct pg_itm_in *itm_in, Interval *span) @@ -2071,7 +2154,9 @@ timestamp_finite(PG_FUNCTION_ARGS) Datum interval_finite(PG_FUNCTION_ARGS) { - PG_RETURN_BOOL(true); + Interval *interval = PG_GETARG_INTERVAL_P(0); + + PG_RETURN_BOOL(!INTERVAL_NOT_FINITE(interval)); } @@ -2425,6 +2510,15 @@ interval_cmp_internal(const Interval *interval1, const Interval *interval2) return int128_compare(span1, span2); } +static int +interval_sign(const Interval *interval) +{ + INT128 span = interval_cmp_value(interval); + INT128 zero = int64_to_int128(0); + + return int128_compare(span, zero); +} + Datum interval_eq(PG_FUNCTION_ARGS) { @@ -2697,10 +2791,39 @@ timestamp_mi(PG_FUNCTION_ARGS) result = (Interval *) palloc(sizeof(Interval)); + /* + * Handle infinities. + * + * We treat anything that amounts to "infinity - infinity" as an error, + * since the interval type has nothing equivalent to NaN. + */ if (TIMESTAMP_NOT_FINITE(dt1) || TIMESTAMP_NOT_FINITE(dt2)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("cannot subtract infinite timestamps"))); + { + if (TIMESTAMP_IS_NOBEGIN(dt1)) + { + if (TIMESTAMP_IS_NOBEGIN(dt2)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + else + INTERVAL_NOBEGIN(result); + } + else if (TIMESTAMP_IS_NOEND(dt1)) + { + if (TIMESTAMP_IS_NOEND(dt2)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + else + INTERVAL_NOEND(result); + } + else if (TIMESTAMP_IS_NOBEGIN(dt2)) + INTERVAL_NOEND(result); + else /* TIMESTAMP_IS_NOEND(dt2) */ + INTERVAL_NOBEGIN(result); + + PG_RETURN_INTERVAL_P(result); + } if (unlikely(pg_sub_s64_overflow(dt1, dt2, &result->time))) ereport(ERROR, @@ -2766,6 +2889,10 @@ interval_justify_interval(PG_FUNCTION_ARGS) result->day = span->day; result->time = span->time; + /* do nothing for infinite intervals */ + if (INTERVAL_NOT_FINITE(result)) + PG_RETURN_INTERVAL_P(result); + /* pre-justify days if it might prevent overflow */ if ((result->day > 0 && result->time > 0) || (result->day < 0 && result->time < 0)) @@ -2841,6 +2968,10 @@ interval_justify_hours(PG_FUNCTION_ARGS) result->day = span->day; result->time = span->time; + /* do nothing for infinite intervals */ + if (INTERVAL_NOT_FINITE(result)) + PG_RETURN_INTERVAL_P(result); + TMODULO(result->time, wholeday, USECS_PER_DAY); if (pg_add_s32_overflow(result->day, wholeday, &result->day)) ereport(ERROR, @@ -2879,6 +3010,10 @@ interval_justify_days(PG_FUNCTION_ARGS) result->day = span->day; result->time = span->time; + /* do nothing for infinite intervals */ + if (INTERVAL_NOT_FINITE(result)) + PG_RETURN_INTERVAL_P(result); + wholemonth = result->day / DAYS_PER_MONTH; result->day -= wholemonth * DAYS_PER_MONTH; if (pg_add_s32_overflow(result->month, wholemonth, &result->month)) @@ -2917,7 +3052,31 @@ timestamp_pl_interval(PG_FUNCTION_ARGS) Interval *span = PG_GETARG_INTERVAL_P(1); Timestamp result; - if (TIMESTAMP_NOT_FINITE(timestamp)) + /* + * Handle infinities. + * + * We treat anything that amounts to "infinity - infinity" as an error, + * since the timestamp type has nothing equivalent to NaN. + */ + if (INTERVAL_IS_NOBEGIN(span)) + { + if (TIMESTAMP_IS_NOEND(timestamp)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range"))); + else + TIMESTAMP_NOBEGIN(result); + } + else if (INTERVAL_IS_NOEND(span)) + { + if (TIMESTAMP_IS_NOBEGIN(timestamp)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range"))); + else + TIMESTAMP_NOEND(result); + } + else if (TIMESTAMP_NOT_FINITE(timestamp)) result = timestamp; else { @@ -2932,7 +3091,10 @@ timestamp_pl_interval(PG_FUNCTION_ARGS) (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("timestamp out of range"))); - tm->tm_mon += span->month; + if (pg_add_s32_overflow(tm->tm_mon, span->month, &tm->tm_mon)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range"))); if (tm->tm_mon > MONTHS_PER_YEAR) { tm->tm_year += (tm->tm_mon - 1) / MONTHS_PER_YEAR; @@ -2966,8 +3128,16 @@ timestamp_pl_interval(PG_FUNCTION_ARGS) (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("timestamp out of range"))); - /* Add days by converting to and from Julian */ - julian = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) + span->day; + /* + * Add days by converting to and from Julian. We need an overflow + * check here since j2date expects a non-negative integer input. + */ + julian = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday); + if (pg_add_s32_overflow(julian, span->day, &julian) || + julian < 0) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range"))); j2date(julian, &tm->tm_year, &tm->tm_mon, &tm->tm_mday); if (tm2timestamp(tm, fsec, NULL, ×tamp) != 0) @@ -2976,7 +3146,10 @@ timestamp_pl_interval(PG_FUNCTION_ARGS) errmsg("timestamp out of range"))); } - timestamp += span->time; + if (pg_add_s64_overflow(timestamp, span->time, ×tamp)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range"))); if (!IS_VALID_TIMESTAMP(timestamp)) ereport(ERROR, @@ -2996,9 +3169,7 @@ timestamp_mi_interval(PG_FUNCTION_ARGS) Interval *span = PG_GETARG_INTERVAL_P(1); Interval tspan; - tspan.month = -span->month; - tspan.day = -span->day; - tspan.time = -span->time; + interval_um_internal(span, &tspan); return DirectFunctionCall2(timestamp_pl_interval, TimestampGetDatum(timestamp), @@ -3025,7 +3196,31 @@ timestamptz_pl_interval_internal(TimestampTz timestamp, TimestampTz result; int tz; - if (TIMESTAMP_NOT_FINITE(timestamp)) + /* + * Handle infinities. + * + * We treat anything that amounts to "infinity - infinity" as an error, + * since the timestamptz type has nothing equivalent to NaN. + */ + if (INTERVAL_IS_NOBEGIN(span)) + { + if (TIMESTAMP_IS_NOEND(timestamp)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range"))); + else + TIMESTAMP_NOBEGIN(result); + } + else if (INTERVAL_IS_NOEND(span)) + { + if (TIMESTAMP_IS_NOBEGIN(timestamp)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range"))); + else + TIMESTAMP_NOEND(result); + } + else if (TIMESTAMP_NOT_FINITE(timestamp)) result = timestamp; else { @@ -3044,7 +3239,10 @@ timestamptz_pl_interval_internal(TimestampTz timestamp, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("timestamp out of range"))); - tm->tm_mon += span->month; + if (pg_add_s32_overflow(tm->tm_mon, span->month, &tm->tm_mon)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range"))); if (tm->tm_mon > MONTHS_PER_YEAR) { tm->tm_year += (tm->tm_mon - 1) / MONTHS_PER_YEAR; @@ -3080,8 +3278,19 @@ timestamptz_pl_interval_internal(TimestampTz timestamp, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("timestamp out of range"))); - /* Add days by converting to and from Julian */ - julian = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) + span->day; + /* + * Add days by converting to and from Julian. We need an overflow + * check here since j2date expects a non-negative integer input. + * In practice though, it will give correct answers for small + * negative Julian dates; we should allow -1 to avoid + * timezone-dependent failures, as discussed in timestamp.h. + */ + julian = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday); + if (pg_add_s32_overflow(julian, span->day, &julian) || + julian < -1) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range"))); j2date(julian, &tm->tm_year, &tm->tm_mon, &tm->tm_mday); tz = DetermineTimeZoneOffset(tm, attimezone); @@ -3092,7 +3301,10 @@ timestamptz_pl_interval_internal(TimestampTz timestamp, errmsg("timestamp out of range"))); } - timestamp += span->time; + if (pg_add_s64_overflow(timestamp, span->time, ×tamp)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range"))); if (!IS_VALID_TIMESTAMP(timestamp)) ereport(ERROR, @@ -3115,9 +3327,7 @@ timestamptz_mi_interval_internal(TimestampTz timestamp, { Interval tspan; - tspan.month = -span->month; - tspan.day = -span->day; - tspan.time = -span->time; + interval_um_internal(span, &tspan); return timestamptz_pl_interval_internal(timestamp, &tspan, attimezone); } @@ -3168,6 +3378,29 @@ timestamptz_mi_interval_at_zone(PG_FUNCTION_ARGS) PG_RETURN_TIMESTAMP(timestamptz_mi_interval_internal(timestamp, span, attimezone)); } +/* interval_um_internal() + * Negate an interval. + */ +static void +interval_um_internal(const Interval *interval, Interval *result) +{ + if (INTERVAL_IS_NOBEGIN(interval)) + INTERVAL_NOEND(result); + else if (INTERVAL_IS_NOEND(interval)) + INTERVAL_NOBEGIN(result); + else + { + /* Negate each field, guarding against overflow */ + if (pg_sub_s64_overflow(INT64CONST(0), interval->time, &result->time) || + pg_sub_s32_overflow(0, interval->day, &result->day) || + pg_sub_s32_overflow(0, interval->month, &result->month) || + INTERVAL_NOT_FINITE(result)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + } +} + Datum interval_um(PG_FUNCTION_ARGS) { @@ -3175,23 +3408,7 @@ interval_um(PG_FUNCTION_ARGS) Interval *result; result = (Interval *) palloc(sizeof(Interval)); - - result->time = -interval->time; - /* overflow check copied from int4um */ - if (interval->time != 0 && SAMESIGN(result->time, interval->time)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); - result->day = -interval->day; - if (interval->day != 0 && SAMESIGN(result->day, interval->day)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); - result->month = -interval->month; - if (interval->month != 0 && SAMESIGN(result->month, interval->month)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); + interval_um_internal(interval, result); PG_RETURN_INTERVAL_P(result); } @@ -3226,6 +3443,21 @@ interval_larger(PG_FUNCTION_ARGS) PG_RETURN_INTERVAL_P(result); } +static void +finite_interval_pl(const Interval *span1, const Interval *span2, Interval *result) +{ + Assert(!INTERVAL_NOT_FINITE(span1)); + Assert(!INTERVAL_NOT_FINITE(span2)); + + if (pg_add_s32_overflow(span1->month, span2->month, &result->month) || + pg_add_s32_overflow(span1->day, span2->day, &result->day) || + pg_add_s64_overflow(span1->time, span2->time, &result->time) || + INTERVAL_NOT_FINITE(result)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); +} + Datum interval_pl(PG_FUNCTION_ARGS) { @@ -3235,29 +3467,51 @@ interval_pl(PG_FUNCTION_ARGS) result = (Interval *) palloc(sizeof(Interval)); - result->month = span1->month + span2->month; - /* overflow check copied from int4pl */ - if (SAMESIGN(span1->month, span2->month) && - !SAMESIGN(result->month, span1->month)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); + /* + * Handle infinities. + * + * We treat anything that amounts to "infinity - infinity" as an error, + * since the interval type has nothing equivalent to NaN. + */ + if (INTERVAL_IS_NOBEGIN(span1)) + { + if (INTERVAL_IS_NOEND(span2)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + else + INTERVAL_NOBEGIN(result); + } + else if (INTERVAL_IS_NOEND(span1)) + { + if (INTERVAL_IS_NOBEGIN(span2)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + else + INTERVAL_NOEND(result); + } + else if (INTERVAL_NOT_FINITE(span2)) + memcpy(result, span2, sizeof(Interval)); + else + finite_interval_pl(span1, span2, result); - result->day = span1->day + span2->day; - if (SAMESIGN(span1->day, span2->day) && - !SAMESIGN(result->day, span1->day)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); + PG_RETURN_INTERVAL_P(result); +} + +static void +finite_interval_mi(const Interval *span1, const Interval *span2, Interval *result) +{ + Assert(!INTERVAL_NOT_FINITE(span1)); + Assert(!INTERVAL_NOT_FINITE(span2)); - result->time = span1->time + span2->time; - if (SAMESIGN(span1->time, span2->time) && - !SAMESIGN(result->time, span1->time)) + if (pg_sub_s32_overflow(span1->month, span2->month, &result->month) || + pg_sub_s32_overflow(span1->day, span2->day, &result->day) || + pg_sub_s64_overflow(span1->time, span2->time, &result->time) || + INTERVAL_NOT_FINITE(result)) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("interval out of range"))); - - PG_RETURN_INTERVAL_P(result); } Datum @@ -3269,27 +3523,36 @@ interval_mi(PG_FUNCTION_ARGS) result = (Interval *) palloc(sizeof(Interval)); - result->month = span1->month - span2->month; - /* overflow check copied from int4mi */ - if (!SAMESIGN(span1->month, span2->month) && - !SAMESIGN(result->month, span1->month)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); - - result->day = span1->day - span2->day; - if (!SAMESIGN(span1->day, span2->day) && - !SAMESIGN(result->day, span1->day)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); - - result->time = span1->time - span2->time; - if (!SAMESIGN(span1->time, span2->time) && - !SAMESIGN(result->time, span1->time)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); + /* + * Handle infinities. + * + * We treat anything that amounts to "infinity - infinity" as an error, + * since the interval type has nothing equivalent to NaN. + */ + if (INTERVAL_IS_NOBEGIN(span1)) + { + if (INTERVAL_IS_NOBEGIN(span2)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + else + INTERVAL_NOBEGIN(result); + } + else if (INTERVAL_IS_NOEND(span1)) + { + if (INTERVAL_IS_NOEND(span2)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + else + INTERVAL_NOEND(result); + } + else if (INTERVAL_IS_NOBEGIN(span2)) + INTERVAL_NOEND(result); + else if (INTERVAL_IS_NOEND(span2)) + INTERVAL_NOBEGIN(result); + else + finite_interval_mi(span1, span2, result); PG_RETURN_INTERVAL_P(result); } @@ -3314,20 +3577,50 @@ interval_mul(PG_FUNCTION_ARGS) result = (Interval *) palloc(sizeof(Interval)); + /* + * Handle NaN and infinities. + * + * We treat "0 * infinity" and "infinity * 0" as errors, since the + * interval type has nothing equivalent to NaN. + */ + if (isnan(factor)) + goto out_of_range; + + if (INTERVAL_NOT_FINITE(span)) + { + if (factor == 0.0) + goto out_of_range; + + if (factor < 0.0) + interval_um_internal(span, result); + else + memcpy(result, span, sizeof(Interval)); + + PG_RETURN_INTERVAL_P(result); + } + if (isinf(factor)) + { + int isign = interval_sign(span); + + if (isign == 0) + goto out_of_range; + + if (factor * isign < 0) + INTERVAL_NOBEGIN(result); + else + INTERVAL_NOEND(result); + + PG_RETURN_INTERVAL_P(result); + } + result_double = span->month * factor; - if (isnan(result_double) || - result_double > INT_MAX || result_double < INT_MIN) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); + if (isnan(result_double) || !FLOAT8_FITS_IN_INT32(result_double)) + goto out_of_range; result->month = (int32) result_double; result_double = span->day * factor; - if (isnan(result_double) || - result_double > INT_MAX || result_double < INT_MIN) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); + if (isnan(result_double) || !FLOAT8_FITS_IN_INT32(result_double)) + goto out_of_range; result->day = (int32) result_double; /* @@ -3361,20 +3654,33 @@ interval_mul(PG_FUNCTION_ARGS) */ if (fabs(sec_remainder) >= SECS_PER_DAY) { - result->day += (int) (sec_remainder / SECS_PER_DAY); + if (pg_add_s32_overflow(result->day, + (int) (sec_remainder / SECS_PER_DAY), + &result->day)) + goto out_of_range; sec_remainder -= (int) (sec_remainder / SECS_PER_DAY) * SECS_PER_DAY; } /* cascade units down */ - result->day += (int32) month_remainder_days; + if (pg_add_s32_overflow(result->day, (int32) month_remainder_days, + &result->day)) + goto out_of_range; result_double = rint(span->time * factor + sec_remainder * USECS_PER_SEC); if (isnan(result_double) || !FLOAT8_FITS_IN_INT64(result_double)) - ereport(ERROR, - (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), - errmsg("interval out of range"))); + goto out_of_range; result->time = (int64) result_double; + if (INTERVAL_NOT_FINITE(result)) + goto out_of_range; + PG_RETURN_INTERVAL_P(result); + +out_of_range: + ereport(ERROR, + errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range")); + + PG_RETURN_NULL(); /* keep compiler quiet */ } Datum @@ -3393,7 +3699,8 @@ interval_div(PG_FUNCTION_ARGS) Interval *span = PG_GETARG_INTERVAL_P(0); float8 factor = PG_GETARG_FLOAT8(1); double month_remainder_days, - sec_remainder; + sec_remainder, + result_double; int32 orig_month = span->month, orig_day = span->day; Interval *result; @@ -3405,8 +3712,38 @@ interval_div(PG_FUNCTION_ARGS) (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); - result->month = (int32) (span->month / factor); - result->day = (int32) (span->day / factor); + /* + * Handle NaN and infinities. + * + * We treat "infinity / infinity" as an error, since the interval type has + * nothing equivalent to NaN. Otherwise, dividing by infinity is handled + * by the regular division code, causing all fields to be set to zero. + */ + if (isnan(factor)) + goto out_of_range; + + if (INTERVAL_NOT_FINITE(span)) + { + if (isinf(factor)) + goto out_of_range; + + if (factor < 0.0) + interval_um_internal(span, result); + else + memcpy(result, span, sizeof(Interval)); + + PG_RETURN_INTERVAL_P(result); + } + + result_double = span->month / factor; + if (isnan(result_double) || !FLOAT8_FITS_IN_INT32(result_double)) + goto out_of_range; + result->month = (int32) result_double; + + result_double = span->day / factor; + if (isnan(result_double) || !FLOAT8_FITS_IN_INT32(result_double)) + goto out_of_range; + result->day = (int32) result_double; /* * Fractional months full days into days. See comment in interval_mul(). @@ -3418,15 +3755,33 @@ interval_div(PG_FUNCTION_ARGS) sec_remainder = TSROUND(sec_remainder); if (fabs(sec_remainder) >= SECS_PER_DAY) { - result->day += (int) (sec_remainder / SECS_PER_DAY); + if (pg_add_s32_overflow(result->day, + (int) (sec_remainder / SECS_PER_DAY), + &result->day)) + goto out_of_range; sec_remainder -= (int) (sec_remainder / SECS_PER_DAY) * SECS_PER_DAY; } /* cascade units down */ - result->day += (int32) month_remainder_days; - result->time = rint(span->time / factor + sec_remainder * USECS_PER_SEC); + if (pg_add_s32_overflow(result->day, (int32) month_remainder_days, + &result->day)) + goto out_of_range; + result_double = rint(span->time / factor + sec_remainder * USECS_PER_SEC); + if (isnan(result_double) || !FLOAT8_FITS_IN_INT64(result_double)) + goto out_of_range; + result->time = (int64) result_double; + + if (INTERVAL_NOT_FINITE(result)) + goto out_of_range; PG_RETURN_INTERVAL_P(result); + +out_of_range: + ereport(ERROR, + errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range")); + + PG_RETURN_NULL(); /* keep compiler quiet */ } @@ -3449,13 +3804,23 @@ in_range_timestamptz_interval(PG_FUNCTION_ARGS) bool less = PG_GETARG_BOOL(4); TimestampTz sum; - if (int128_compare(interval_cmp_value(offset), int64_to_int128(0)) < 0) + if (interval_sign(offset) < 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE), errmsg("invalid preceding or following size in window function"))); - /* We don't currently bother to avoid overflow hazards here */ - if (sub) + /* + * Deal with cases where both base and offset are infinite, and computing + * base +/- offset would cause an error. As for float and numeric types, + * we assume that all values infinitely precede +infinity and infinitely + * follow -infinity. See in_range_float8_float8() for reasoning. + */ + if (INTERVAL_IS_NOEND(offset) && + (sub ? TIMESTAMP_IS_NOEND(base) : TIMESTAMP_IS_NOBEGIN(base))) + PG_RETURN_BOOL(true); + + /* We don't currently bother to avoid overflow hazards here */ + if (sub) sum = timestamptz_mi_interval_internal(base, offset, NULL); else sum = timestamptz_pl_interval_internal(base, offset, NULL); @@ -3476,11 +3841,21 @@ in_range_timestamp_interval(PG_FUNCTION_ARGS) bool less = PG_GETARG_BOOL(4); Timestamp sum; - if (int128_compare(interval_cmp_value(offset), int64_to_int128(0)) < 0) + if (interval_sign(offset) < 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE), errmsg("invalid preceding or following size in window function"))); + /* + * Deal with cases where both base and offset are infinite, and computing + * base +/- offset would cause an error. As for float and numeric types, + * we assume that all values infinitely precede +infinity and infinitely + * follow -infinity. See in_range_float8_float8() for reasoning. + */ + if (INTERVAL_IS_NOEND(offset) && + (sub ? TIMESTAMP_IS_NOEND(base) : TIMESTAMP_IS_NOBEGIN(base))) + PG_RETURN_BOOL(true); + /* We don't currently bother to avoid overflow hazards here */ if (sub) sum = DatumGetTimestamp(DirectFunctionCall2(timestamp_mi_interval, @@ -3507,11 +3882,21 @@ in_range_interval_interval(PG_FUNCTION_ARGS) bool less = PG_GETARG_BOOL(4); Interval *sum; - if (int128_compare(interval_cmp_value(offset), int64_to_int128(0)) < 0) + if (interval_sign(offset) < 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PRECEDING_OR_FOLLOWING_SIZE), errmsg("invalid preceding or following size in window function"))); + /* + * Deal with cases where both base and offset are infinite, and computing + * base +/- offset would cause an error. As for float and numeric types, + * we assume that all values infinitely precede +infinity and infinitely + * follow -infinity. See in_range_float8_float8() for reasoning. + */ + if (INTERVAL_IS_NOEND(offset) && + (sub ? INTERVAL_IS_NOEND(base) : INTERVAL_IS_NOBEGIN(base))) + PG_RETURN_BOOL(true); + /* We don't currently bother to avoid overflow hazards here */ if (sub) sum = DatumGetIntervalP(DirectFunctionCall2(interval_mi, @@ -3530,161 +3915,327 @@ in_range_interval_interval(PG_FUNCTION_ARGS) /* - * interval_accum, interval_accum_inv, and interval_avg implement the - * AVG(interval) aggregate. + * Prepare state data for an interval aggregate function, that needs to compute + * sum and count, in the aggregate's memory context. * - * The transition datatype for this aggregate is a 2-element array of - * intervals, where the first is the running sum and the second contains - * the number of values so far in its 'time' field. This is a bit ugly - * but it beats inventing a specialized datatype for the purpose. + * The function is used when the state data needs to be allocated in aggregate's + * context. When the state data needs to be allocated in the current memory + * context, we use palloc0 directly e.g. interval_avg_deserialize(). + */ +static IntervalAggState * +makeIntervalAggState(FunctionCallInfo fcinfo) +{ + IntervalAggState *state; + MemoryContext agg_context; + MemoryContext old_context; + + if (!AggCheckCallContext(fcinfo, &agg_context)) + elog(ERROR, "aggregate function called in non-aggregate context"); + + old_context = MemoryContextSwitchTo(agg_context); + + state = (IntervalAggState *) palloc0(sizeof(IntervalAggState)); + + MemoryContextSwitchTo(old_context); + + return state; +} + +/* + * Accumulate a new input value for interval aggregate functions. + */ +static void +do_interval_accum(IntervalAggState *state, Interval *newval) +{ + /* Infinite inputs are counted separately, and do not affect "N" */ + if (INTERVAL_IS_NOBEGIN(newval)) + { + state->nInfcount++; + return; + } + + if (INTERVAL_IS_NOEND(newval)) + { + state->pInfcount++; + return; + } + + finite_interval_pl(&state->sumX, newval, &state->sumX); + state->N++; +} + +/* + * Remove the given interval value from the aggregated state. + */ +static void +do_interval_discard(IntervalAggState *state, Interval *newval) +{ + /* Infinite inputs are counted separately, and do not affect "N" */ + if (INTERVAL_IS_NOBEGIN(newval)) + { + state->nInfcount--; + return; + } + + if (INTERVAL_IS_NOEND(newval)) + { + state->pInfcount--; + return; + } + + /* Handle the to-be-discarded finite value. */ + state->N--; + if (state->N > 0) + finite_interval_mi(&state->sumX, newval, &state->sumX); + else + { + /* All values discarded, reset the state */ + Assert(state->N == 0); + memset(&state->sumX, 0, sizeof(state->sumX)); + } +} + +/* + * Transition function for sum() and avg() interval aggregates. */ +Datum +interval_avg_accum(PG_FUNCTION_ARGS) +{ + IntervalAggState *state; + + state = PG_ARGISNULL(0) ? NULL : (IntervalAggState *) PG_GETARG_POINTER(0); + + /* Create the state data on the first call */ + if (state == NULL) + state = makeIntervalAggState(fcinfo); + + if (!PG_ARGISNULL(1)) + do_interval_accum(state, PG_GETARG_INTERVAL_P(1)); + PG_RETURN_POINTER(state); +} + +/* + * Combine function for sum() and avg() interval aggregates. + * + * Combine the given internal aggregate states and place the combination in + * the first argument. + */ Datum -interval_accum(PG_FUNCTION_ARGS) +interval_avg_combine(PG_FUNCTION_ARGS) { - ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0); - Interval *newval = PG_GETARG_INTERVAL_P(1); - Datum *transdatums; - int ndatums; - Interval sumX, - N; - Interval *newsum; - ArrayType *result; + IntervalAggState *state1; + IntervalAggState *state2; + + state1 = PG_ARGISNULL(0) ? NULL : (IntervalAggState *) PG_GETARG_POINTER(0); + state2 = PG_ARGISNULL(1) ? NULL : (IntervalAggState *) PG_GETARG_POINTER(1); + + if (state2 == NULL) + PG_RETURN_POINTER(state1); + + if (state1 == NULL) + { + /* manually copy all fields from state2 to state1 */ + state1 = makeIntervalAggState(fcinfo); - deconstruct_array(transarray, - INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE, - &transdatums, NULL, &ndatums); - if (ndatums != 2) - elog(ERROR, "expected 2-element interval array"); + state1->N = state2->N; + state1->pInfcount = state2->pInfcount; + state1->nInfcount = state2->nInfcount; - sumX = *(DatumGetIntervalP(transdatums[0])); - N = *(DatumGetIntervalP(transdatums[1])); + state1->sumX.day = state2->sumX.day; + state1->sumX.month = state2->sumX.month; + state1->sumX.time = state2->sumX.time; - newsum = DatumGetIntervalP(DirectFunctionCall2(interval_pl, - IntervalPGetDatum(&sumX), - IntervalPGetDatum(newval))); - N.time += 1; + PG_RETURN_POINTER(state1); + } - transdatums[0] = IntervalPGetDatum(newsum); - transdatums[1] = IntervalPGetDatum(&N); + state1->N += state2->N; + state1->pInfcount += state2->pInfcount; + state1->nInfcount += state2->nInfcount; - result = construct_array(transdatums, 2, - INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE); + /* Accumulate finite interval values, if any. */ + if (state2->N > 0) + finite_interval_pl(&state1->sumX, &state2->sumX, &state1->sumX); - PG_RETURN_ARRAYTYPE_P(result); + PG_RETURN_POINTER(state1); } +/* + * interval_avg_serialize + * Serialize IntervalAggState for interval aggregates. + */ Datum -interval_combine(PG_FUNCTION_ARGS) +interval_avg_serialize(PG_FUNCTION_ARGS) { - ArrayType *transarray1 = PG_GETARG_ARRAYTYPE_P(0); - ArrayType *transarray2 = PG_GETARG_ARRAYTYPE_P(1); - Datum *transdatums1; - Datum *transdatums2; - int ndatums1; - int ndatums2; - Interval sum1, - N1; - Interval sum2, - N2; + IntervalAggState *state; + StringInfoData buf; + bytea *result; - Interval *newsum; - ArrayType *result; + /* Ensure we disallow calling when not in aggregate context */ + if (!AggCheckCallContext(fcinfo, NULL)) + elog(ERROR, "aggregate function called in non-aggregate context"); - deconstruct_array(transarray1, - INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE, - &transdatums1, NULL, &ndatums1); - if (ndatums1 != 2) - elog(ERROR, "expected 2-element interval array"); + state = (IntervalAggState *) PG_GETARG_POINTER(0); - sum1 = *(DatumGetIntervalP(transdatums1[0])); - N1 = *(DatumGetIntervalP(transdatums1[1])); + pq_begintypsend(&buf); - deconstruct_array(transarray2, - INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE, - &transdatums2, NULL, &ndatums2); - if (ndatums2 != 2) - elog(ERROR, "expected 2-element interval array"); + /* N */ + pq_sendint64(&buf, state->N); - sum2 = *(DatumGetIntervalP(transdatums2[0])); - N2 = *(DatumGetIntervalP(transdatums2[1])); + /* sumX */ + pq_sendint64(&buf, state->sumX.time); + pq_sendint32(&buf, state->sumX.day); + pq_sendint32(&buf, state->sumX.month); - newsum = DatumGetIntervalP(DirectFunctionCall2(interval_pl, - IntervalPGetDatum(&sum1), - IntervalPGetDatum(&sum2))); - N1.time += N2.time; + /* pInfcount */ + pq_sendint64(&buf, state->pInfcount); - transdatums1[0] = IntervalPGetDatum(newsum); - transdatums1[1] = IntervalPGetDatum(&N1); + /* nInfcount */ + pq_sendint64(&buf, state->nInfcount); - result = construct_array(transdatums1, 2, - INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE); + result = pq_endtypsend(&buf); - PG_RETURN_ARRAYTYPE_P(result); + PG_RETURN_BYTEA_P(result); } +/* + * interval_avg_deserialize + * Deserialize bytea into IntervalAggState for interval aggregates. + */ Datum -interval_accum_inv(PG_FUNCTION_ARGS) +interval_avg_deserialize(PG_FUNCTION_ARGS) { - ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0); - Interval *newval = PG_GETARG_INTERVAL_P(1); - Datum *transdatums; - int ndatums; - Interval sumX, - N; - Interval *newsum; - ArrayType *result; + bytea *sstate; + IntervalAggState *result; + StringInfoData buf; - deconstruct_array(transarray, - INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE, - &transdatums, NULL, &ndatums); - if (ndatums != 2) - elog(ERROR, "expected 2-element interval array"); + if (!AggCheckCallContext(fcinfo, NULL)) + elog(ERROR, "aggregate function called in non-aggregate context"); - sumX = *(DatumGetIntervalP(transdatums[0])); - N = *(DatumGetIntervalP(transdatums[1])); + sstate = PG_GETARG_BYTEA_PP(0); - newsum = DatumGetIntervalP(DirectFunctionCall2(interval_mi, - IntervalPGetDatum(&sumX), - IntervalPGetDatum(newval))); - N.time -= 1; + /* + * Initialize a StringInfo so that we can "receive" it using the standard + * recv-function infrastructure. + */ + initReadOnlyStringInfo(&buf, VARDATA_ANY(sstate), + VARSIZE_ANY_EXHDR(sstate)); + + result = (IntervalAggState *) palloc0(sizeof(IntervalAggState)); + + /* N */ + result->N = pq_getmsgint64(&buf); + + /* sumX */ + result->sumX.time = pq_getmsgint64(&buf); + result->sumX.day = pq_getmsgint(&buf, 4); + result->sumX.month = pq_getmsgint(&buf, 4); + + /* pInfcount */ + result->pInfcount = pq_getmsgint64(&buf); - transdatums[0] = IntervalPGetDatum(newsum); - transdatums[1] = IntervalPGetDatum(&N); + /* nInfcount */ + result->nInfcount = pq_getmsgint64(&buf); - result = construct_array(transdatums, 2, - INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE); + pq_getmsgend(&buf); - PG_RETURN_ARRAYTYPE_P(result); + PG_RETURN_POINTER(result); } +/* + * Inverse transition function for sum() and avg() interval aggregates. + */ Datum -interval_avg(PG_FUNCTION_ARGS) +interval_avg_accum_inv(PG_FUNCTION_ARGS) { - ArrayType *transarray = PG_GETARG_ARRAYTYPE_P(0); - Datum *transdatums; - int ndatums; - Interval sumX, - N; + IntervalAggState *state; + + state = PG_ARGISNULL(0) ? NULL : (IntervalAggState *) PG_GETARG_POINTER(0); - deconstruct_array(transarray, - INTERVALOID, sizeof(Interval), false, TYPALIGN_DOUBLE, - &transdatums, NULL, &ndatums); - if (ndatums != 2) - elog(ERROR, "expected 2-element interval array"); + /* Should not get here with no state */ + if (state == NULL) + elog(ERROR, "interval_avg_accum_inv called with NULL state"); - sumX = *(DatumGetIntervalP(transdatums[0])); - N = *(DatumGetIntervalP(transdatums[1])); + if (!PG_ARGISNULL(1)) + do_interval_discard(state, PG_GETARG_INTERVAL_P(1)); - /* SQL defines AVG of no values to be NULL */ - if (N.time == 0) + PG_RETURN_POINTER(state); +} + +/* avg(interval) aggregate final function */ +Datum +interval_avg(PG_FUNCTION_ARGS) +{ + IntervalAggState *state; + + state = PG_ARGISNULL(0) ? NULL : (IntervalAggState *) PG_GETARG_POINTER(0); + + /* If there were no non-null inputs, return NULL */ + if (state == NULL || IA_TOTAL_COUNT(state) == 0) PG_RETURN_NULL(); + /* + * Aggregating infinities that all have the same sign produces infinity + * with that sign. Aggregating infinities with different signs results in + * an error. + */ + if (state->pInfcount > 0 || state->nInfcount > 0) + { + Interval *result; + + if (state->pInfcount > 0 && state->nInfcount > 0) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + + result = (Interval *) palloc(sizeof(Interval)); + if (state->pInfcount > 0) + INTERVAL_NOEND(result); + else + INTERVAL_NOBEGIN(result); + + PG_RETURN_INTERVAL_P(result); + } + return DirectFunctionCall2(interval_div, - IntervalPGetDatum(&sumX), - Float8GetDatum((double) N.time)); + IntervalPGetDatum(&state->sumX), + Float8GetDatum((double) state->N)); } +/* sum(interval) aggregate final function */ +Datum +interval_sum(PG_FUNCTION_ARGS) +{ + IntervalAggState *state; + Interval *result; + + state = PG_ARGISNULL(0) ? NULL : (IntervalAggState *) PG_GETARG_POINTER(0); + + /* If there were no non-null inputs, return NULL */ + if (state == NULL || IA_TOTAL_COUNT(state) == 0) + PG_RETURN_NULL(); + + /* + * Aggregating infinities that all have the same sign produces infinity + * with that sign. Aggregating infinities with different signs results in + * an error. + */ + if (state->pInfcount > 0 && state->nInfcount > 0) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + + result = (Interval *) palloc(sizeof(Interval)); + + if (state->pInfcount > 0) + INTERVAL_NOEND(result); + else if (state->nInfcount > 0) + INTERVAL_NOBEGIN(result); + else + memcpy(result, &state->sumX, sizeof(Interval)); + + PG_RETURN_INTERVAL_P(result); +} /* timestamp_age() * Calculate time difference while retaining year/month fields. @@ -3709,8 +4260,36 @@ timestamp_age(PG_FUNCTION_ARGS) result = (Interval *) palloc(sizeof(Interval)); - if (timestamp2tm(dt1, NULL, tm1, &fsec1, NULL, NULL) == 0 && - timestamp2tm(dt2, NULL, tm2, &fsec2, NULL, NULL) == 0) + /* + * Handle infinities. + * + * We treat anything that amounts to "infinity - infinity" as an error, + * since the interval type has nothing equivalent to NaN. + */ + if (TIMESTAMP_IS_NOBEGIN(dt1)) + { + if (TIMESTAMP_IS_NOBEGIN(dt2)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + else + INTERVAL_NOBEGIN(result); + } + else if (TIMESTAMP_IS_NOEND(dt1)) + { + if (TIMESTAMP_IS_NOEND(dt2)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + else + INTERVAL_NOEND(result); + } + else if (TIMESTAMP_IS_NOBEGIN(dt2)) + INTERVAL_NOEND(result); + else if (TIMESTAMP_IS_NOEND(dt2)) + INTERVAL_NOBEGIN(result); + else if (timestamp2tm(dt1, NULL, tm1, &fsec1, NULL, NULL) == 0 && + timestamp2tm(dt2, NULL, tm2, &fsec2, NULL, NULL) == 0) { /* form the symbolic difference */ tm->tm_usec = fsec1 - fsec2; @@ -3829,8 +4408,36 @@ timestamptz_age(PG_FUNCTION_ARGS) result = (Interval *) palloc(sizeof(Interval)); - if (timestamp2tm(dt1, &tz1, tm1, &fsec1, NULL, NULL) == 0 && - timestamp2tm(dt2, &tz2, tm2, &fsec2, NULL, NULL) == 0) + /* + * Handle infinities. + * + * We treat anything that amounts to "infinity - infinity" as an error, + * since the interval type has nothing equivalent to NaN. + */ + if (TIMESTAMP_IS_NOBEGIN(dt1)) + { + if (TIMESTAMP_IS_NOBEGIN(dt2)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + else + INTERVAL_NOBEGIN(result); + } + else if (TIMESTAMP_IS_NOEND(dt1)) + { + if (TIMESTAMP_IS_NOEND(dt2)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + else + INTERVAL_NOEND(result); + } + else if (TIMESTAMP_IS_NOBEGIN(dt2)) + INTERVAL_NOEND(result); + else if (TIMESTAMP_IS_NOEND(dt2)) + INTERVAL_NOBEGIN(result); + else if (timestamp2tm(dt1, &tz1, tm1, &fsec1, NULL, NULL) == 0 && + timestamp2tm(dt2, &tz2, tm2, &fsec2, NULL, NULL) == 0) { /* form the symbolic difference */ tm->tm_usec = fsec1 - fsec2; @@ -3943,8 +4550,9 @@ timestamp_bin(PG_FUNCTION_ARGS) Timestamp timestamp = PG_GETARG_TIMESTAMP(1); Timestamp origin = PG_GETARG_TIMESTAMP(2); Timestamp result, - tm_diff, stride_usecs, + tm_diff, + tm_modulo, tm_delta; if (TIMESTAMP_NOT_FINITE(timestamp)) @@ -3955,29 +4563,50 @@ timestamp_bin(PG_FUNCTION_ARGS) (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("origin out of range"))); + if (INTERVAL_NOT_FINITE(stride)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamps cannot be binned into infinite intervals"))); + if (stride->month != 0) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("timestamps cannot be binned into intervals containing months or years"))); - stride_usecs = stride->day * USECS_PER_DAY + stride->time; + if (unlikely(pg_mul_s64_overflow(stride->day, USECS_PER_DAY, &stride_usecs)) || + unlikely(pg_add_s64_overflow(stride_usecs, stride->time, &stride_usecs))) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); if (stride_usecs <= 0) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("stride must be greater than zero"))); - tm_diff = timestamp - origin; - tm_delta = tm_diff - tm_diff % stride_usecs; + if (unlikely(pg_sub_s64_overflow(timestamp, origin, &tm_diff))) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + + /* These calculations cannot overflow */ + tm_modulo = tm_diff % stride_usecs; + tm_delta = tm_diff - tm_modulo; + result = origin + tm_delta; /* - * Make sure the returned timestamp is at the start of the bin, even if - * the origin is in the future. + * We want to round towards -infinity, not 0, when tm_diff is negative and + * not a multiple of stride_usecs. This adjustment *can* cause overflow, + * since the result might now be out of the range origin .. timestamp. */ - if (origin > timestamp && stride_usecs > 1) - tm_delta -= stride_usecs; - - result = origin + tm_delta; + if (tm_modulo < 0) + { + if (unlikely(pg_sub_s64_overflow(result, stride_usecs, &result)) || + !IS_VALID_TIMESTAMP(result)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range"))); + } PG_RETURN_TIMESTAMP(result); } @@ -4128,6 +4757,7 @@ timestamptz_bin(PG_FUNCTION_ARGS) TimestampTz result, stride_usecs, tm_diff, + tm_modulo, tm_delta; if (TIMESTAMP_NOT_FINITE(timestamp)) @@ -4138,29 +4768,50 @@ timestamptz_bin(PG_FUNCTION_ARGS) (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("origin out of range"))); + if (INTERVAL_NOT_FINITE(stride)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamps cannot be binned into infinite intervals"))); + if (stride->month != 0) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("timestamps cannot be binned into intervals containing months or years"))); - stride_usecs = stride->day * USECS_PER_DAY + stride->time; + if (unlikely(pg_mul_s64_overflow(stride->day, USECS_PER_DAY, &stride_usecs)) || + unlikely(pg_add_s64_overflow(stride_usecs, stride->time, &stride_usecs))) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); if (stride_usecs <= 0) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("stride must be greater than zero"))); - tm_diff = timestamp - origin; - tm_delta = tm_diff - tm_diff % stride_usecs; + if (unlikely(pg_sub_s64_overflow(timestamp, origin, &tm_diff))) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("interval out of range"))); + + /* These calculations cannot overflow */ + tm_modulo = tm_diff % stride_usecs; + tm_delta = tm_diff - tm_modulo; + result = origin + tm_delta; /* - * Make sure the returned timestamp is at the start of the bin, even if - * the origin is in the future. + * We want to round towards -infinity, not 0, when tm_diff is negative and + * not a multiple of stride_usecs. This adjustment *can* cause overflow, + * since the result might now be out of the range origin .. timestamp. */ - if (origin > timestamp && stride_usecs > 1) - tm_delta -= stride_usecs; - - result = origin + tm_delta; + if (tm_modulo < 0) + { + if (unlikely(pg_sub_s64_overflow(result, stride_usecs, &result)) || + !IS_VALID_TIMESTAMP(result)) + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("timestamp out of range"))); + } PG_RETURN_TIMESTAMPTZ(result); } @@ -4376,6 +5027,12 @@ interval_trunc(PG_FUNCTION_ARGS) result = (Interval *) palloc(sizeof(Interval)); + if (INTERVAL_NOT_FINITE(interval)) + { + memcpy(result, interval, sizeof(Interval)); + PG_RETURN_INTERVAL_P(result); + } + lowunits = downcase_truncate_identifier(VARDATA_ANY(units), VARSIZE_ANY_EXHDR(units), false); @@ -4720,7 +5377,7 @@ timestamp_part_common(PG_FUNCTION_ARGS, bool retnumeric) TIMESTAMP_IS_NOBEGIN(timestamp), false); - if (r) + if (r != 0.0) { if (retnumeric) { @@ -4994,7 +5651,7 @@ timestamptz_part_common(PG_FUNCTION_ARGS, bool retnumeric) TIMESTAMP_IS_NOBEGIN(timestamp), true); - if (r) + if (r != 0.0) { if (retnumeric) { @@ -5234,6 +5891,58 @@ extract_timestamptz(PG_FUNCTION_ARGS) return timestamptz_part_common(fcinfo, true); } +/* + * NonFiniteIntervalPart + * + * Used by interval_part when extracting from infinite interval. Returns + * +/-Infinity if that is the appropriate result, otherwise returns zero + * (which should be taken as meaning to return NULL). + * + * Errors thrown here for invalid units should exactly match those that + * would be thrown in the calling functions, else there will be unexpected + * discrepancies between finite- and infinite-input cases. + */ +static float8 +NonFiniteIntervalPart(int type, int unit, char *lowunits, bool isNegative) +{ + if ((type != UNITS) && (type != RESERV)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unit \"%s\" not recognized for type %s", + lowunits, format_type_be(INTERVALOID)))); + + switch (unit) + { + /* Oscillating units */ + case DTK_MICROSEC: + case DTK_MILLISEC: + case DTK_SECOND: + case DTK_MINUTE: + case DTK_MONTH: + case DTK_QUARTER: + return 0.0; + + /* Monotonically-increasing units */ + case DTK_HOUR: + case DTK_DAY: + case DTK_YEAR: + case DTK_DECADE: + case DTK_CENTURY: + case DTK_MILLENNIUM: + case DTK_EPOCH: + if (isNegative) + return -get_float8_infinity(); + else + return get_float8_infinity(); + + default: + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("unit \"%s\" not supported for type %s", + lowunits, format_type_be(INTERVALOID)))); + return 0.0; /* keep compiler quiet */ + } +} /* interval_part() and extract_interval() * Extract specified field from interval. @@ -5258,6 +5967,33 @@ interval_part_common(PG_FUNCTION_ARGS, bool retnumeric) if (type == UNKNOWN_FIELD) type = DecodeSpecial(0, lowunits, &val); + if (INTERVAL_NOT_FINITE(interval)) + { + double r = NonFiniteIntervalPart(type, val, lowunits, + INTERVAL_IS_NOBEGIN(interval)); + + if (r != 0.0) + { + if (retnumeric) + { + if (r < 0) + return DirectFunctionCall3(numeric_in, + CStringGetDatum("-Infinity"), + ObjectIdGetDatum(InvalidOid), + Int32GetDatum(-1)); + else if (r > 0) + return DirectFunctionCall3(numeric_in, + CStringGetDatum("Infinity"), + ObjectIdGetDatum(InvalidOid), + Int32GetDatum(-1)); + } + else + PG_RETURN_FLOAT8(r); + } + else + PG_RETURN_NULL(); + } + if (type == UNITS) { interval2itm(*interval, tm); @@ -5500,6 +6236,13 @@ timestamp_izone(PG_FUNCTION_ARGS) if (TIMESTAMP_NOT_FINITE(timestamp)) PG_RETURN_TIMESTAMPTZ(timestamp); + if (INTERVAL_NOT_FINITE(zone)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("interval time zone \"%s\" must be finite", + DatumGetCString(DirectFunctionCall1(interval_out, + PointerGetDatum(zone)))))); + if (zone->month != 0 || zone->day != 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -5730,6 +6473,13 @@ timestamptz_izone(PG_FUNCTION_ARGS) if (TIMESTAMP_NOT_FINITE(timestamp)) PG_RETURN_TIMESTAMP(timestamp); + if (INTERVAL_NOT_FINITE(zone)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("interval time zone \"%s\" must be finite", + DatumGetCString(DirectFunctionCall1(interval_out, + PointerGetDatum(zone)))))); + if (zone->month != 0 || zone->day != 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), @@ -5766,7 +6516,6 @@ generate_series_timestamp(PG_FUNCTION_ARGS) Timestamp finish = PG_GETARG_TIMESTAMP(1); Interval *step = PG_GETARG_INTERVAL_P(2); MemoryContext oldcontext; - const Interval interval_zero = {0}; /* create a function context for cross-call persistence */ funcctx = SRF_FIRSTCALL_INIT(); @@ -5789,13 +6538,18 @@ generate_series_timestamp(PG_FUNCTION_ARGS) fctx->step = *step; /* Determine sign of the interval */ - fctx->step_sign = interval_cmp_internal(&fctx->step, &interval_zero); + fctx->step_sign = interval_sign(&fctx->step); if (fctx->step_sign == 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("step size cannot equal zero"))); + if (INTERVAL_NOT_FINITE((&fctx->step))) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("step size cannot be infinite"))); + funcctx->user_fctx = fctx; MemoryContextSwitchTo(oldcontext); } @@ -5847,7 +6601,6 @@ generate_series_timestamptz_internal(FunctionCallInfo fcinfo) Interval *step = PG_GETARG_INTERVAL_P(2); text *zone = (PG_NARGS() == 4) ? PG_GETARG_TEXT_PP(3) : NULL; MemoryContext oldcontext; - const Interval interval_zero = {0}; /* create a function context for cross-call persistence */ funcctx = SRF_FIRSTCALL_INIT(); @@ -5871,13 +6624,18 @@ generate_series_timestamptz_internal(FunctionCallInfo fcinfo) fctx->attimezone = zone ? lookup_timezone(zone) : session_timezone; /* Determine sign of the interval */ - fctx->step_sign = interval_cmp_internal(&fctx->step, &interval_zero); + fctx->step_sign = interval_sign(&fctx->step); if (fctx->step_sign == 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("step size cannot equal zero"))); + if (INTERVAL_NOT_FINITE((&fctx->step))) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("step size cannot be infinite"))); + funcctx->user_fctx = fctx; MemoryContextSwitchTo(oldcontext); } @@ -5921,3 +6679,23 @@ generate_series_timestamptz_at_zone(PG_FUNCTION_ARGS) { return generate_series_timestamptz_internal(fcinfo); } + +/* timestamp_at_local() + * timestamptz_at_local() + * + * The regression tests do not like two functions with the same proargs and + * prosrc but different proname, but the grammar for AT LOCAL needs an + * overloaded name to handle both types of timestamp, so we make simple + * wrappers for it. + */ +Datum +timestamp_at_local(PG_FUNCTION_ARGS) +{ + return timestamp_timestamptz(fcinfo); +} + +Datum +timestamptz_at_local(PG_FUNCTION_ARGS) +{ + return timestamptz_timestamp(fcinfo); +} diff --git a/src/backend/utils/adt/trigfuncs.c b/src/backend/utils/adt/trigfuncs.c index d9a616f603d83..a132082722366 100644 --- a/src/backend/utils/adt/trigfuncs.c +++ b/src/backend/utils/adt/trigfuncs.c @@ -4,7 +4,7 @@ * Builtin functions for useful trigger support. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/utils/adt/trigfuncs.c @@ -15,8 +15,7 @@ #include "access/htup_details.h" #include "commands/trigger.h" -#include "utils/builtins.h" -#include "utils/rel.h" +#include "utils/fmgrprotos.h" /* diff --git a/src/backend/utils/adt/tsginidx.c b/src/backend/utils/adt/tsginidx.c index 484a003827d82..0d9b0d590137d 100644 --- a/src/backend/utils/adt/tsginidx.c +++ b/src/backend/utils/adt/tsginidx.c @@ -3,7 +3,7 @@ * tsginidx.c * GIN support functions for tsvector_ops * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -14,8 +14,6 @@ #include "postgres.h" #include "access/gin.h" -#include "access/stratnum.h" -#include "miscadmin.h" #include "tsearch/ts_type.h" #include "tsearch/ts_utils.h" #include "utils/builtins.h" diff --git a/src/backend/utils/adt/tsgistidx.c b/src/backend/utils/adt/tsgistidx.c index f0cd2866ff5a8..5698ee5502b00 100644 --- a/src/backend/utils/adt/tsgistidx.c +++ b/src/backend/utils/adt/tsgistidx.c @@ -3,7 +3,7 @@ * tsgistidx.c * GiST support functions for tsvector_ops * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -17,10 +17,11 @@ #include "access/gist.h" #include "access/heaptoast.h" #include "access/reloptions.h" +#include "common/int.h" #include "lib/qunique.h" #include "port/pg_bitutils.h" #include "tsearch/ts_utils.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/pg_crc.h" @@ -115,10 +116,15 @@ gtsvectorout(PG_FUNCTION_ARGS) sprintf(outbuf, ARROUTSTR, (int) ARRNELEM(key)); else { - int siglen = GETSIGLEN(key); - int cnttrue = (ISALLTRUE(key)) ? SIGLENBIT(siglen) : sizebitvec(GETSIGN(key), siglen); + if (ISALLTRUE(key)) + sprintf(outbuf, "all true bits"); + else + { + int siglen = GETSIGLEN(key); + int cnttrue = sizebitvec(GETSIGN(key), siglen); - sprintf(outbuf, SINGOUTSTR, cnttrue, (int) SIGLENBIT(siglen) - cnttrue); + sprintf(outbuf, SINGOUTSTR, cnttrue, (int) SIGLENBIT(siglen) - cnttrue); + } } PG_FREE_IF_COPY(key, 0); @@ -131,9 +137,7 @@ compareint(const void *va, const void *vb) int32 a = *((const int32 *) va); int32 b = *((const int32 *) vb); - if (a == b) - return 0; - return (a > b) ? 1 : -1; + return pg_cmp_s32(a, b); } static void @@ -593,10 +597,7 @@ comparecost(const void *va, const void *vb) const SPLITCOST *a = (const SPLITCOST *) va; const SPLITCOST *b = (const SPLITCOST *) vb; - if (a->cost == b->cost) - return 0; - else - return (a->cost > b->cost) ? 1 : -1; + return pg_cmp_s32(a->cost, b->cost); } @@ -730,7 +731,7 @@ gtsvector_picksplit(PG_FUNCTION_ARGS) size_alpha = SIGLENBIT(siglen) - sizebitvec((cache[j].allistrue) ? GETSIGN(datum_l) : - GETSIGN(cache[j].sign), + cache[j].sign, siglen); } else @@ -744,7 +745,7 @@ gtsvector_picksplit(PG_FUNCTION_ARGS) size_beta = SIGLENBIT(siglen) - sizebitvec((cache[j].allistrue) ? GETSIGN(datum_r) : - GETSIGN(cache[j].sign), + cache[j].sign, siglen); } else diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c index 67ad876a27c6a..6f532188392d3 100644 --- a/src/backend/utils/adt/tsquery.c +++ b/src/backend/utils/adt/tsquery.c @@ -3,7 +3,7 @@ * tsquery.c * I/O functions for tsquery * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -41,7 +41,7 @@ typedef enum { WAITOPERAND = 1, WAITOPERATOR = 2, - WAITFIRSTOPERAND = 3 + WAITFIRSTOPERAND = 3, } ts_parserstate; /* @@ -54,7 +54,7 @@ typedef enum PT_VAL = 2, PT_OPR = 3, PT_OPEN = 4, - PT_CLOSE = 5 + PT_CLOSE = 5, } ts_tokentype; /* @@ -439,7 +439,7 @@ gettoken_query_websearch(TSQueryParserState state, int8 *operator, } else if (ISOPERATOR(state->buf)) { - /* or else gettoken_tsvector() will raise an error */ + /* ignore, else gettoken_tsvector() will raise an error */ state->buf++; state->state = WAITOPERAND; continue; @@ -476,15 +476,9 @@ gettoken_query_websearch(TSQueryParserState state, int8 *operator, break; case WAITOPERATOR: - if (t_iseq(state->buf, '"')) + if (*state->buf == '\0') { - /* - * put implicit AND after an operand and handle this quote - * in WAITOPERAND - */ - state->state = WAITOPERAND; - *operator = OP_AND; - return PT_OPR; + return PT_END; } else if (parse_or_operator(state)) { @@ -492,15 +486,17 @@ gettoken_query_websearch(TSQueryParserState state, int8 *operator, *operator = OP_OR; return PT_OPR; } - else if (*state->buf == '\0') + else if (ISOPERATOR(state->buf)) { - return PT_END; + /* ignore other operators in this state too */ + state->buf++; + continue; } else if (!t_isspace(state->buf)) { - /* put implicit AND after an operand */ - *operator = OP_AND; + /* insert implicit AND between operands */ state->state = WAITOPERAND; + *operator = OP_AND; return PT_OPR; } break; diff --git a/src/backend/utils/adt/tsquery_cleanup.c b/src/backend/utils/adt/tsquery_cleanup.c index dc31665770618..aa46be701ee23 100644 --- a/src/backend/utils/adt/tsquery_cleanup.c +++ b/src/backend/utils/adt/tsquery_cleanup.c @@ -4,7 +4,7 @@ * Cleanup query from NOT values and/or stopword * Utility functions to correct work. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/utils/adt/tsquery_gist.c b/src/backend/utils/adt/tsquery_gist.c index 7c99348d44c80..a19ed4cf37600 100644 --- a/src/backend/utils/adt/tsquery_gist.c +++ b/src/backend/utils/adt/tsquery_gist.c @@ -3,7 +3,7 @@ * tsquery_gist.c * GiST index support for tsquery * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -16,8 +16,9 @@ #include "access/gist.h" #include "access/stratnum.h" +#include "common/int.h" #include "tsearch/ts_utils.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #define GETENTRY(vec,pos) DatumGetTSQuerySign((vec)->vector[pos].key) @@ -156,10 +157,8 @@ typedef struct static int comparecost(const void *a, const void *b) { - if (((const SPLITCOST *) a)->cost == ((const SPLITCOST *) b)->cost) - return 0; - else - return (((const SPLITCOST *) a)->cost > ((const SPLITCOST *) b)->cost) ? 1 : -1; + return pg_cmp_s32(((const SPLITCOST *) a)->cost, + ((const SPLITCOST *) b)->cost); } #define WISH_F(a,b,c) (double)( -(double)(((a)-(b))*((a)-(b))*((a)-(b)))*(c) ) diff --git a/src/backend/utils/adt/tsquery_op.c b/src/backend/utils/adt/tsquery_op.c index 2bc4ec904fe48..6f6dc12a118e4 100644 --- a/src/backend/utils/adt/tsquery_op.c +++ b/src/backend/utils/adt/tsquery_op.c @@ -3,7 +3,7 @@ * tsquery_op.c * Various operations with tsquery * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -16,7 +16,7 @@ #include "lib/qunique.h" #include "tsearch/ts_utils.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "varatt.h" Datum diff --git a/src/backend/utils/adt/tsquery_rewrite.c b/src/backend/utils/adt/tsquery_rewrite.c index 7e736351628d7..8a587be929661 100644 --- a/src/backend/utils/adt/tsquery_rewrite.c +++ b/src/backend/utils/adt/tsquery_rewrite.c @@ -3,7 +3,7 @@ * tsquery_rewrite.c * Utilities for reconstructing tsquery * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -281,7 +281,7 @@ tsquery_rewrite_query(PG_FUNCTION_ARGS) { TSQuery query = PG_GETARG_TSQUERY_COPY(0); text *in = PG_GETARG_TEXT_PP(1); - TSQuery rewrited = query; + TSQuery rewritten = query; MemoryContext outercontext = CurrentMemoryContext; MemoryContext oldcontext; QTNode *tree; @@ -293,7 +293,7 @@ tsquery_rewrite_query(PG_FUNCTION_ARGS) if (query->size == 0) { PG_FREE_IF_COPY(in, 1); - PG_RETURN_POINTER(rewrited); + PG_RETURN_POINTER(rewritten); } tree = QT2QTN(GETQUERY(query), GETOPERAND(query)); @@ -391,19 +391,19 @@ tsquery_rewrite_query(PG_FUNCTION_ARGS) if (tree) { QTNBinary(tree); - rewrited = QTN2QT(tree); + rewritten = QTN2QT(tree); QTNFree(tree); PG_FREE_IF_COPY(query, 0); } else { - SET_VARSIZE(rewrited, HDRSIZETQ); - rewrited->size = 0; + SET_VARSIZE(rewritten, HDRSIZETQ); + rewritten->size = 0; } pfree(buf); PG_FREE_IF_COPY(in, 1); - PG_RETURN_POINTER(rewrited); + PG_RETURN_POINTER(rewritten); } Datum @@ -412,7 +412,7 @@ tsquery_rewrite(PG_FUNCTION_ARGS) TSQuery query = PG_GETARG_TSQUERY_COPY(0); TSQuery ex = PG_GETARG_TSQUERY(1); TSQuery subst = PG_GETARG_TSQUERY(2); - TSQuery rewrited = query; + TSQuery rewritten = query; QTNode *tree, *qex, *subs = NULL; @@ -421,7 +421,7 @@ tsquery_rewrite(PG_FUNCTION_ARGS) { PG_FREE_IF_COPY(ex, 1); PG_FREE_IF_COPY(subst, 2); - PG_RETURN_POINTER(rewrited); + PG_RETURN_POINTER(rewritten); } tree = QT2QTN(GETQUERY(query), GETOPERAND(query)); @@ -442,21 +442,21 @@ tsquery_rewrite(PG_FUNCTION_ARGS) if (!tree) { - SET_VARSIZE(rewrited, HDRSIZETQ); - rewrited->size = 0; + SET_VARSIZE(rewritten, HDRSIZETQ); + rewritten->size = 0; PG_FREE_IF_COPY(ex, 1); PG_FREE_IF_COPY(subst, 2); - PG_RETURN_POINTER(rewrited); + PG_RETURN_POINTER(rewritten); } else { QTNBinary(tree); - rewrited = QTN2QT(tree); + rewritten = QTN2QT(tree); QTNFree(tree); } PG_FREE_IF_COPY(query, 0); PG_FREE_IF_COPY(ex, 1); PG_FREE_IF_COPY(subst, 2); - PG_RETURN_POINTER(rewrited); + PG_RETURN_POINTER(rewritten); } diff --git a/src/backend/utils/adt/tsquery_util.c b/src/backend/utils/adt/tsquery_util.c index 7b6970a6f82ae..63760080b2671 100644 --- a/src/backend/utils/adt/tsquery_util.c +++ b/src/backend/utils/adt/tsquery_util.c @@ -3,7 +3,7 @@ * tsquery_util.c * Utilities for tsquery datatype * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/utils/adt/tsrank.c b/src/backend/utils/adt/tsrank.c index e5b850ea8ef42..c2285cf27e9fd 100644 --- a/src/backend/utils/adt/tsrank.c +++ b/src/backend/utils/adt/tsrank.c @@ -3,7 +3,7 @@ * tsrank.c * rank tsvector by tsquery * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -19,7 +19,7 @@ #include "miscadmin.h" #include "tsearch/ts_utils.h" #include "utils/array.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" static const float weights[] = {0.1f, 0.2f, 0.4f, 1.0f}; diff --git a/src/backend/utils/adt/tsvector.c b/src/backend/utils/adt/tsvector.c index 0e66f362c306c..638c4dc097def 100644 --- a/src/backend/utils/adt/tsvector.c +++ b/src/backend/utils/adt/tsvector.c @@ -3,7 +3,7 @@ * tsvector.c * I/O functions for tsvector * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -14,17 +14,18 @@ #include "postgres.h" +#include "common/int.h" #include "libpq/pqformat.h" #include "nodes/miscnodes.h" #include "tsearch/ts_locale.h" #include "tsearch/ts_utils.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/memutils.h" #include "varatt.h" typedef struct { - WordEntry entry; /* must be first! */ + WordEntry entry; /* must be first, see compareentry */ WordEntryPos *pos; int poslen; /* number of elements in pos */ } WordEntryIN; @@ -37,9 +38,7 @@ compareWordEntryPos(const void *a, const void *b) int apos = WEP_GETPOS(*(const WordEntryPos *) a); int bpos = WEP_GETPOS(*(const WordEntryPos *) b); - if (apos == bpos) - return 0; - return (apos > bpos) ? 1 : -1; + return pg_cmp_s32(apos, bpos); } /* @@ -80,16 +79,19 @@ uniquePos(WordEntryPos *a, int l) return res + 1 - a; } -/* Compare two WordEntryIN values for qsort */ +/* + * Compare two WordEntry structs for qsort_arg. This can also be used on + * WordEntryIN structs, since those have WordEntry as their first field. + */ static int compareentry(const void *va, const void *vb, void *arg) { - const WordEntryIN *a = (const WordEntryIN *) va; - const WordEntryIN *b = (const WordEntryIN *) vb; + const WordEntry *a = (const WordEntry *) va; + const WordEntry *b = (const WordEntry *) vb; char *BufferStr = (char *) arg; - return tsCompareString(&BufferStr[a->entry.pos], a->entry.len, - &BufferStr[b->entry.pos], b->entry.len, + return tsCompareString(&BufferStr[a->pos], a->len, + &BufferStr[b->pos], b->len, false); } @@ -168,12 +170,6 @@ uniqueentry(WordEntryIN *a, int l, char *buf, int *outbuflen) return res + 1 - a; } -static int -WordEntryCMP(WordEntry *a, WordEntry *b, char *buf) -{ - return compareentry(a, b, buf); -} - Datum tsvectorin(PG_FUNCTION_ARGS) @@ -498,7 +494,7 @@ tsvectorrecv(PG_FUNCTION_ARGS) * But make sure the buffer is large enough first. */ while (hdrlen + SHORTALIGN(datalen + lex_len) + - (npos + 1) * sizeof(WordEntryPos) >= len) + sizeof(uint16) + npos * sizeof(WordEntryPos) >= len) { len *= 2; vec = (TSVector) repalloc(vec, len); @@ -512,7 +508,7 @@ tsvectorrecv(PG_FUNCTION_ARGS) datalen += lex_len; - if (i > 0 && WordEntryCMP(&vec->entries[i], + if (i > 0 && compareentry(&vec->entries[i], &vec->entries[i - 1], STRPTR(vec)) <= 0) needSort = true; @@ -544,7 +540,7 @@ tsvectorrecv(PG_FUNCTION_ARGS) elog(ERROR, "position information is misordered"); } - datalen += (npos + 1) * sizeof(WordEntry); + datalen += sizeof(uint16) + npos * sizeof(WordEntryPos); } } diff --git a/src/backend/utils/adt/tsvector_op.c b/src/backend/utils/adt/tsvector_op.c index 4457c5d4f9faf..687adcbd69f30 100644 --- a/src/backend/utils/adt/tsvector_op.c +++ b/src/backend/utils/adt/tsvector_op.c @@ -3,7 +3,7 @@ * tsvector_op.c * operations over tsvector * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -19,6 +19,7 @@ #include "catalog/namespace.h" #include "catalog/pg_type.h" #include "commands/trigger.h" +#include "common/int.h" #include "executor/spi.h" #include "funcapi.h" #include "lib/qunique.h" @@ -28,7 +29,6 @@ #include "tsearch/ts_utils.h" #include "utils/array.h" #include "utils/builtins.h" -#include "utils/lsyscache.h" #include "utils/regproc.h" #include "utils/rel.h" @@ -435,9 +435,7 @@ compare_int(const void *va, const void *vb) int a = *((const int *) va); int b = *((const int *) vb); - if (a == b) - return 0; - return (a > b) ? 1 : -1; + return pg_cmp_s32(a, b); } static int diff --git a/src/backend/utils/adt/tsvector_parser.c b/src/backend/utils/adt/tsvector_parser.c index 13e075831fe49..ea961bb8a4a71 100644 --- a/src/backend/utils/adt/tsvector_parser.c +++ b/src/backend/utils/adt/tsvector_parser.c @@ -3,7 +3,7 @@ * tsvector_parser.c * Parser for tsvector * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/utils/adt/uuid.c b/src/backend/utils/adt/uuid.c index 4f7aa768fda4d..45eb1b2fea9f8 100644 --- a/src/backend/utils/adt/uuid.c +++ b/src/backend/utils/adt/uuid.c @@ -3,7 +3,7 @@ * uuid.c * Functions for the built-in type "uuid". * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/adt/uuid.c @@ -17,9 +17,10 @@ #include "lib/hyperloglog.h" #include "libpq/pqformat.h" #include "port/pg_bswap.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/guc.h" #include "utils/sortsupport.h" +#include "utils/timestamp.h" #include "utils/uuid.h" /* sortsupport for uuid */ @@ -53,10 +54,13 @@ uuid_out(PG_FUNCTION_ARGS) { pg_uuid_t *uuid = PG_GETARG_UUID_P(0); static const char hex_chars[] = "0123456789abcdef"; - StringInfoData buf; + char *buf, + *p; int i; - initStringInfo(&buf); + /* counts for the four hyphens and the zero-terminator */ + buf = palloc(2 * UUID_LEN + 5); + p = buf; for (i = 0; i < UUID_LEN; i++) { int hi; @@ -68,16 +72,17 @@ uuid_out(PG_FUNCTION_ARGS) * ("-"). Therefore, add the hyphens at the appropriate places here. */ if (i == 4 || i == 6 || i == 8 || i == 10) - appendStringInfoChar(&buf, '-'); + *p++ = '-'; hi = uuid->data[i] >> 4; lo = uuid->data[i] & 0x0F; - appendStringInfoChar(&buf, hex_chars[hi]); - appendStringInfoChar(&buf, hex_chars[lo]); + *p++ = hex_chars[hi]; + *p++ = hex_chars[lo]; } + *p = '\0'; - PG_RETURN_CSTRING(buf.data); + PG_RETURN_CSTRING(buf); } /* @@ -421,3 +426,66 @@ gen_random_uuid(PG_FUNCTION_ARGS) PG_RETURN_UUID_P(uuid); } + +#define UUIDV1_EPOCH_JDATE 2299161 /* == date2j(1582,10,15) */ + +/* + * Extract timestamp from UUID. + * + * Returns null if not RFC 4122 variant or not a version that has a timestamp. + */ +Datum +uuid_extract_timestamp(PG_FUNCTION_ARGS) +{ + pg_uuid_t *uuid = PG_GETARG_UUID_P(0); + int version; + uint64 tms; + TimestampTz ts; + + /* check if RFC 4122 variant */ + if ((uuid->data[8] & 0xc0) != 0x80) + PG_RETURN_NULL(); + + version = uuid->data[6] >> 4; + + if (version == 1) + { + tms = ((uint64) uuid->data[0] << 24) + + ((uint64) uuid->data[1] << 16) + + ((uint64) uuid->data[2] << 8) + + ((uint64) uuid->data[3]) + + ((uint64) uuid->data[4] << 40) + + ((uint64) uuid->data[5] << 32) + + (((uint64) uuid->data[6] & 0xf) << 56) + + ((uint64) uuid->data[7] << 48); + + /* convert 100-ns intervals to us, then adjust */ + ts = (TimestampTz) (tms / 10) - + ((uint64) POSTGRES_EPOCH_JDATE - UUIDV1_EPOCH_JDATE) * SECS_PER_DAY * USECS_PER_SEC; + + PG_RETURN_TIMESTAMPTZ(ts); + } + + /* not a timestamp-containing UUID version */ + PG_RETURN_NULL(); +} + +/* + * Extract UUID version. + * + * Returns null if not RFC 4122 variant. + */ +Datum +uuid_extract_version(PG_FUNCTION_ARGS) +{ + pg_uuid_t *uuid = PG_GETARG_UUID_P(0); + uint16 version; + + /* check if RFC 4122 variant */ + if ((uuid->data[8] & 0xc0) != 0x80) + PG_RETURN_NULL(); + + version = uuid->data[6] >> 4; + + PG_RETURN_UINT16(version); +} diff --git a/src/backend/utils/adt/varbit.c b/src/backend/utils/adt/varbit.c index 3dbbd1207f9dd..8fcf3fb731e55 100644 --- a/src/backend/utils/adt/varbit.c +++ b/src/backend/utils/adt/varbit.c @@ -20,7 +20,7 @@ * * Code originally contributed by Adriaan Joubert. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -38,7 +38,7 @@ #include "nodes/supportnodes.h" #include "port/pg_bitutils.h" #include "utils/array.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/varbit.h" #define HEXDIG(z) ((z)<10 ? ((z)+'0') : ((z)-10+'A')) diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index b92ff4d266e26..1ba5f9d9f6c87 100644 --- a/src/backend/utils/adt/varchar.c +++ b/src/backend/utils/adt/varchar.c @@ -3,7 +3,7 @@ * varchar.c * Functions for the built-in types char(n) and varchar(n). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -25,7 +25,6 @@ #include "nodes/supportnodes.h" #include "utils/array.h" #include "utils/builtins.h" -#include "utils/lsyscache.h" #include "utils/pg_locale.h" #include "utils/varlena.h" @@ -1029,7 +1028,9 @@ hashbpchar(PG_FUNCTION_ARGS) buf = palloc(bsize + 1); rsize = pg_strnxfrm(buf, bsize + 1, keydata, keylen, mylocale); - if (rsize != bsize) + + /* the second call may return a smaller value than the first */ + if (rsize > bsize) elog(ERROR, "pg_strnxfrm() returned unexpected result"); /* @@ -1085,7 +1086,9 @@ hashbpcharextended(PG_FUNCTION_ARGS) buf = palloc(bsize + 1); rsize = pg_strnxfrm(buf, bsize + 1, keydata, keylen, mylocale); - if (rsize != bsize) + + /* the second call may return a smaller value than the first */ + if (rsize > bsize) elog(ERROR, "pg_strnxfrm() returned unexpected result"); /* diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index b1ec5c32cede2..d2e2e9bbba0b3 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -3,7 +3,7 @@ * varlena.c * Functions for the variable-length built-in types. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,7 +23,9 @@ #include "catalog/pg_type.h" #include "common/hashfn.h" #include "common/int.h" +#include "common/unicode_category.h" #include "common/unicode_norm.h" +#include "common/unicode_version.h" #include "funcapi.h" #include "lib/hyperloglog.h" #include "libpq/pqformat.h" @@ -454,7 +456,7 @@ byteaout(PG_FUNCTION_ARGS) } else { - elog(ERROR, "unrecognized bytea_output setting: %d", + elog(ERROR, "unrecognized \"bytea_output\" setting: %d", bytea_output); rp = result = NULL; /* keep compiler quiet */ } @@ -889,8 +891,9 @@ text_substring(Datum str, int32 start, int32 length, bool length_not_specified) int32 E; /* end position */ /* - * SQL99 says S can be zero or negative, but we still must fetch from the - * start of the string. + * SQL99 says S can be zero or negative (which we don't document), but we + * still must fetch from the start of the string. + * https://www.postgresql.org/message-id/170905442373.643.11536838320909376197%40wrigleys.postgresql.org */ S1 = Max(S, 1); @@ -4919,53 +4922,87 @@ array_to_text_internal(FunctionCallInfo fcinfo, ArrayType *v, return result; } -#define HEXBASE 16 /* - * Convert an int32 to a string containing a base 16 (hex) representation of - * the number. + * Workhorse for to_bin, to_oct, and to_hex. Note that base must be > 1 and <= + * 16. */ -Datum -to_hex32(PG_FUNCTION_ARGS) +static inline text * +convert_to_base(uint64 value, int base) { - uint32 value = (uint32) PG_GETARG_INT32(0); - char *ptr; const char *digits = "0123456789abcdef"; - char buf[32]; /* bigger than needed, but reasonable */ - ptr = buf + sizeof(buf) - 1; - *ptr = '\0'; + /* We size the buffer for to_bin's longest possible return value. */ + char buf[sizeof(uint64) * BITS_PER_BYTE]; + char *const end = buf + sizeof(buf); + char *ptr = end; + + Assert(base > 1); + Assert(base <= 16); do { - *--ptr = digits[value % HEXBASE]; - value /= HEXBASE; + *--ptr = digits[value % base]; + value /= base; } while (ptr > buf && value); - PG_RETURN_TEXT_P(cstring_to_text(ptr)); + return cstring_to_text_with_len(ptr, end - ptr); +} + +/* + * Convert an integer to a string containing a base-2 (binary) representation + * of the number. + */ +Datum +to_bin32(PG_FUNCTION_ARGS) +{ + uint64 value = (uint32) PG_GETARG_INT32(0); + + PG_RETURN_TEXT_P(convert_to_base(value, 2)); +} +Datum +to_bin64(PG_FUNCTION_ARGS) +{ + uint64 value = (uint64) PG_GETARG_INT64(0); + + PG_RETURN_TEXT_P(convert_to_base(value, 2)); } /* - * Convert an int64 to a string containing a base 16 (hex) representation of + * Convert an integer to a string containing a base-8 (oct) representation of * the number. */ Datum -to_hex64(PG_FUNCTION_ARGS) +to_oct32(PG_FUNCTION_ARGS) +{ + uint64 value = (uint32) PG_GETARG_INT32(0); + + PG_RETURN_TEXT_P(convert_to_base(value, 8)); +} +Datum +to_oct64(PG_FUNCTION_ARGS) { uint64 value = (uint64) PG_GETARG_INT64(0); - char *ptr; - const char *digits = "0123456789abcdef"; - char buf[32]; /* bigger than needed, but reasonable */ - ptr = buf + sizeof(buf) - 1; - *ptr = '\0'; + PG_RETURN_TEXT_P(convert_to_base(value, 8)); +} - do - { - *--ptr = digits[value % HEXBASE]; - value /= HEXBASE; - } while (ptr > buf && value); +/* + * Convert an integer to a string containing a base-16 (hex) representation of + * the number. + */ +Datum +to_hex32(PG_FUNCTION_ARGS) +{ + uint64 value = (uint32) PG_GETARG_INT32(0); + + PG_RETURN_TEXT_P(convert_to_base(value, 16)); +} +Datum +to_hex64(PG_FUNCTION_ARGS) +{ + uint64 value = (uint64) PG_GETARG_INT64(0); - PG_RETURN_TEXT_P(cstring_to_text(ptr)); + PG_RETURN_TEXT_P(convert_to_base(value, 16)); } /* @@ -5069,6 +5106,47 @@ pg_column_compression(PG_FUNCTION_ARGS) PG_RETURN_TEXT_P(cstring_to_text(result)); } +/* + * Return the chunk_id of the on-disk TOASTed value. Return NULL if the value + * is un-TOASTed or not on-disk. + */ +Datum +pg_column_toast_chunk_id(PG_FUNCTION_ARGS) +{ + int typlen; + struct varlena *attr; + struct varatt_external toast_pointer; + + /* On first call, get the input type's typlen, and save at *fn_extra */ + if (fcinfo->flinfo->fn_extra == NULL) + { + /* Lookup the datatype of the supplied argument */ + Oid argtypeid = get_fn_expr_argtype(fcinfo->flinfo, 0); + + typlen = get_typlen(argtypeid); + if (typlen == 0) /* should not happen */ + elog(ERROR, "cache lookup failed for type %u", argtypeid); + + fcinfo->flinfo->fn_extra = MemoryContextAlloc(fcinfo->flinfo->fn_mcxt, + sizeof(int)); + *((int *) fcinfo->flinfo->fn_extra) = typlen; + } + else + typlen = *((int *) fcinfo->flinfo->fn_extra); + + if (typlen != -1) + PG_RETURN_NULL(); + + attr = (struct varlena *) DatumGetPointer(PG_GETARG_DATUM(0)); + + if (!VARATT_IS_EXTERNAL_ONDISK(attr)) + PG_RETURN_NULL(); + + VARATT_EXTERNAL_GET_POINTER(toast_pointer, attr); + + PG_RETURN_OID(toast_pointer.va_valueid); +} + /* * string_agg - Concatenates values and returns string. * @@ -5255,12 +5333,11 @@ string_agg_deserialize(PG_FUNCTION_ARGS) sstate = PG_GETARG_BYTEA_PP(0); /* - * Copy the bytea into a StringInfo so that we can "receive" it using the - * standard recv-function infrastructure. + * Initialize a StringInfo so that we can "receive" it using the standard + * recv-function infrastructure. */ - initStringInfo(&buf); - appendBinaryStringInfo(&buf, - VARDATA_ANY(sstate), VARSIZE_ANY_EXHDR(sstate)); + initReadOnlyStringInfo(&buf, VARDATA_ANY(sstate), + VARSIZE_ANY_EXHDR(sstate)); result = makeStringAggState(fcinfo); @@ -5273,7 +5350,6 @@ string_agg_deserialize(PG_FUNCTION_ARGS) appendBinaryStringInfo(result, data, datalen); pq_getmsgend(&buf); - pfree(buf.data); PG_RETURN_POINTER(result); } @@ -6205,6 +6281,65 @@ unicode_norm_form_from_string(const char *formstr) return form; } +/* + * Returns version of Unicode used by Postgres in "major.minor" format (the + * same format as the Unicode version reported by ICU). The third component + * ("update version") never involves additions to the character repertoire and + * is unimportant for most purposes. + * + * See: https://unicode.org/versions/ + */ +Datum +unicode_version(PG_FUNCTION_ARGS) +{ + PG_RETURN_TEXT_P(cstring_to_text(PG_UNICODE_VERSION)); +} + +/* + * Returns version of Unicode used by ICU, if enabled; otherwise NULL. + */ +Datum +icu_unicode_version(PG_FUNCTION_ARGS) +{ +#ifdef USE_ICU + PG_RETURN_TEXT_P(cstring_to_text(U_UNICODE_VERSION)); +#else + PG_RETURN_NULL(); +#endif +} + +/* + * Check whether the string contains only assigned Unicode code + * points. Requires that the database encoding is UTF-8. + */ +Datum +unicode_assigned(PG_FUNCTION_ARGS) +{ + text *input = PG_GETARG_TEXT_PP(0); + unsigned char *p; + int size; + + if (GetDatabaseEncoding() != PG_UTF8) + ereport(ERROR, + (errmsg("Unicode categorization can only be performed if server encoding is UTF8"))); + + /* convert to pg_wchar */ + size = pg_mbstrlen_with_len(VARDATA_ANY(input), VARSIZE_ANY_EXHDR(input)); + p = (unsigned char *) VARDATA_ANY(input); + for (int i = 0; i < size; i++) + { + pg_wchar uchar = utf8_to_unicode(p); + int category = unicode_category(uchar); + + if (category == PG_U_UNASSIGNED) + PG_RETURN_BOOL(false); + + p += pg_utf_mblen(p); + } + + PG_RETURN_BOOL(true); +} + Datum unicode_normalize_func(PG_FUNCTION_ARGS) { diff --git a/src/backend/utils/adt/version.c b/src/backend/utils/adt/version.c index 30edac593028f..28db1f636a12f 100644 --- a/src/backend/utils/adt/version.c +++ b/src/backend/utils/adt/version.c @@ -3,7 +3,7 @@ * version.c * Returns the PostgreSQL version string * - * Copyright (c) 1998-2023, PostgreSQL Global Development Group + * Copyright (c) 1998-2024, PostgreSQL Global Development Group * * IDENTIFICATION * diff --git a/src/backend/utils/adt/waitfuncs.c b/src/backend/utils/adt/waitfuncs.c new file mode 100644 index 0000000000000..e135c9e5e45f9 --- /dev/null +++ b/src/backend/utils/adt/waitfuncs.c @@ -0,0 +1,113 @@ +/*------------------------------------------------------------------------- + * + * waitfuncs.c + * Functions for SQL access to syntheses of multiple contention types. + * + * Copyright (c) 2002-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/adt/waitfuncs.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "catalog/pg_type.h" +#include "storage/predicate_internals.h" +#include "storage/proc.h" +#include "storage/procarray.h" +#include "utils/array.h" +#include "utils/builtins.h" +#include "utils/wait_event.h" + +#define UINT32_ACCESS_ONCE(var) ((uint32)(*((volatile uint32 *)&(var)))) + + +/* + * pg_isolation_test_session_is_blocked - support function for isolationtester + * + * Check if specified PID is blocked by any of the PIDs listed in the second + * argument. Currently, this looks for blocking caused by waiting for + * injection points, heavyweight locks, or safe snapshots. We ignore blockage + * caused by PIDs not directly under the isolationtester's control, eg + * autovacuum. + * + * This is an undocumented function intended for use by the isolation tester, + * and may change in future releases as required for testing purposes. + */ +Datum +pg_isolation_test_session_is_blocked(PG_FUNCTION_ARGS) +{ + int blocked_pid = PG_GETARG_INT32(0); + ArrayType *interesting_pids_a = PG_GETARG_ARRAYTYPE_P(1); + PGPROC *proc; + const char *wait_event_type; + ArrayType *blocking_pids_a; + int32 *interesting_pids; + int32 *blocking_pids; + int num_interesting_pids; + int num_blocking_pids; + int dummy; + int i, + j; + + /* Check if blocked_pid is in an injection point. */ + proc = BackendPidGetProc(blocked_pid); + if (proc == NULL) + PG_RETURN_BOOL(false); /* session gone: definitely unblocked */ + wait_event_type = + pgstat_get_wait_event_type(UINT32_ACCESS_ONCE(proc->wait_event_info)); + if (wait_event_type && strcmp("InjectionPoint", wait_event_type) == 0) + PG_RETURN_BOOL(true); + + /* Validate the passed-in array */ + Assert(ARR_ELEMTYPE(interesting_pids_a) == INT4OID); + if (array_contains_nulls(interesting_pids_a)) + elog(ERROR, "array must not contain nulls"); + interesting_pids = (int32 *) ARR_DATA_PTR(interesting_pids_a); + num_interesting_pids = ArrayGetNItems(ARR_NDIM(interesting_pids_a), + ARR_DIMS(interesting_pids_a)); + + /* + * Get the PIDs of all sessions blocking the given session's attempt to + * acquire heavyweight locks. + */ + blocking_pids_a = + DatumGetArrayTypeP(DirectFunctionCall1(pg_blocking_pids, blocked_pid)); + + Assert(ARR_ELEMTYPE(blocking_pids_a) == INT4OID); + Assert(!array_contains_nulls(blocking_pids_a)); + blocking_pids = (int32 *) ARR_DATA_PTR(blocking_pids_a); + num_blocking_pids = ArrayGetNItems(ARR_NDIM(blocking_pids_a), + ARR_DIMS(blocking_pids_a)); + + /* + * Check if any of these are in the list of interesting PIDs, that being + * the sessions that the isolation tester is running. We don't use + * "arrayoverlaps" here, because it would lead to cache lookups and one of + * our goals is to run quickly with debug_discard_caches > 0. We expect + * blocking_pids to be usually empty and otherwise a very small number in + * isolation tester cases, so make that the outer loop of a naive search + * for a match. + */ + for (i = 0; i < num_blocking_pids; i++) + for (j = 0; j < num_interesting_pids; j++) + { + if (blocking_pids[i] == interesting_pids[j]) + PG_RETURN_BOOL(true); + } + + /* + * Check if blocked_pid is waiting for a safe snapshot. We could in + * theory check the resulting array of blocker PIDs against the + * interesting PIDs list, but since there is no danger of autovacuum + * blocking GetSafeSnapshot there seems to be no point in expending cycles + * on allocating a buffer and searching for overlap; so it's presently + * sufficient for the isolation tester's purposes to use a single element + * buffer and check if the number of safe snapshot blockers is non-zero. + */ + if (GetSafeSnapshotBlockingPids(blocked_pid, &dummy, 1) > 0) + PG_RETURN_BOOL(true); + + PG_RETURN_BOOL(false); +} diff --git a/src/backend/utils/adt/windowfuncs.c b/src/backend/utils/adt/windowfuncs.c index b87a624fb2fc5..473c61569f5d8 100644 --- a/src/backend/utils/adt/windowfuncs.c +++ b/src/backend/utils/adt/windowfuncs.c @@ -3,7 +3,7 @@ * windowfuncs.c * Standard window functions defined in SQL spec. * - * Portions Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2000-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -13,8 +13,9 @@ */ #include "postgres.h" +#include "nodes/parsenodes.h" #include "nodes/supportnodes.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "windowapi.h" /* diff --git a/src/backend/utils/adt/xid.c b/src/backend/utils/adt/xid.c index 8ac1679c38109..ae273b1961074 100644 --- a/src/backend/utils/adt/xid.c +++ b/src/backend/utils/adt/xid.c @@ -3,7 +3,7 @@ * xid.c * POSTGRES transaction identifier and command identifier datatypes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,6 +19,7 @@ #include "access/multixact.h" #include "access/transam.h" #include "access/xact.h" +#include "common/int.h" #include "libpq/pqformat.h" #include "utils/builtins.h" #include "utils/xid8.h" @@ -140,11 +141,7 @@ xidComparator(const void *arg1, const void *arg2) TransactionId xid1 = *(const TransactionId *) arg1; TransactionId xid2 = *(const TransactionId *) arg2; - if (xid1 > xid2) - return 1; - if (xid1 < xid2) - return -1; - return 0; + return pg_cmp_u32(xid1, xid2); } /* diff --git a/src/backend/utils/adt/xid8funcs.c b/src/backend/utils/adt/xid8funcs.c index 06ae940df6fe4..25f28ed8cecc2 100644 --- a/src/backend/utils/adt/xid8funcs.c +++ b/src/backend/utils/adt/xid8funcs.c @@ -15,7 +15,7 @@ * to users. The txid_XXX variants should eventually be dropped. * * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * Author: Jan Wieck, Afilias USA INC. * 64-bit txids: Marko Kreen, Skype Technologies * @@ -26,10 +26,8 @@ #include "postgres.h" -#include "access/clog.h" #include "access/transam.h" #include "access/xact.h" -#include "access/xlog.h" #include "funcapi.h" #include "lib/qunique.h" #include "libpq/pqformat.h" @@ -98,15 +96,12 @@ StaticAssertDecl(MAX_BACKENDS * 2 <= PG_SNAPSHOT_MAX_NXIP, static bool TransactionIdInRecentPast(FullTransactionId fxid, TransactionId *extracted_xid) { - uint32 xid_epoch = EpochFromFullTransactionId(fxid); TransactionId xid = XidFromFullTransactionId(fxid); - uint32 now_epoch; - TransactionId now_epoch_next_xid; FullTransactionId now_fullxid; + TransactionId oldest_clog_xid; + FullTransactionId oldest_clog_fxid; now_fullxid = ReadNextFullTransactionId(); - now_epoch_next_xid = XidFromFullTransactionId(now_fullxid); - now_epoch = EpochFromFullTransactionId(now_fullxid); if (extracted_xid != NULL) *extracted_xid = xid; @@ -126,8 +121,8 @@ TransactionIdInRecentPast(FullTransactionId fxid, TransactionId *extracted_xid) (unsigned long long) U64FromFullTransactionId(fxid)))); /* - * ShmemVariableCache->oldestClogXid is protected by XactTruncationLock, - * but we don't acquire that lock here. Instead, we require the caller to + * TransamVariables->oldestClogXid is protected by XactTruncationLock, but + * we don't acquire that lock here. Instead, we require the caller to * acquire it, because the caller is presumably going to look up the * returned XID. If we took and released the lock within this function, a * CLOG truncation could occur before the caller finished with the XID. @@ -135,46 +130,20 @@ TransactionIdInRecentPast(FullTransactionId fxid, TransactionId *extracted_xid) Assert(LWLockHeldByMe(XactTruncationLock)); /* - * If the transaction ID has wrapped around, it's definitely too old to - * determine the commit status. Otherwise, we can compare it to - * ShmemVariableCache->oldestClogXid to determine whether the relevant + * If fxid is not older than TransamVariables->oldestClogXid, the relevant * CLOG entry is guaranteed to still exist. + * + * TransamVariables->oldestXid governs allowable XIDs. Usually, + * oldestClogXid==oldestXid. It's also possible for oldestClogXid to + * follow oldestXid, in which case oldestXid might advance after our + * ReadNextFullTransactionId() call. If oldestXid has advanced, that + * advancement reinstated the usual oldestClogXid==oldestXid. Whether or + * not that happened, oldestClogXid is allowable relative to now_fullxid. */ - if (xid_epoch + 1 < now_epoch - || (xid_epoch + 1 == now_epoch && xid < now_epoch_next_xid) - || TransactionIdPrecedes(xid, ShmemVariableCache->oldestClogXid)) - return false; - - return true; -} - -/* - * Convert a TransactionId obtained from a snapshot held by the caller to a - * FullTransactionId. Use next_fxid as a reference FullTransactionId, so that - * we can compute the high order bits. It must have been obtained by the - * caller with ReadNextFullTransactionId() after the snapshot was created. - */ -static FullTransactionId -widen_snapshot_xid(TransactionId xid, FullTransactionId next_fxid) -{ - TransactionId next_xid = XidFromFullTransactionId(next_fxid); - uint32 epoch = EpochFromFullTransactionId(next_fxid); - - /* Special transaction ID. */ - if (!TransactionIdIsNormal(xid)) - return FullTransactionIdFromEpochAndXid(0, xid); - - /* - * The 64 bit result must be <= next_fxid, since next_fxid hadn't been - * issued yet when the snapshot was created. Every TransactionId in the - * snapshot must therefore be from the same epoch as next_fxid, or the - * epoch before. We know this because next_fxid is never allow to get - * more than one epoch ahead of the TransactionIds in any snapshot. - */ - if (xid > next_xid) - epoch--; - - return FullTransactionIdFromEpochAndXid(epoch, xid); + oldest_clog_xid = TransamVariables->oldestClogXid; + oldest_clog_fxid = + FullTransactionIdFromAllowableAt(now_fullxid, oldest_clog_xid); + return !FullTransactionIdPrecedes(fxid, oldest_clog_fxid); } /* @@ -414,12 +383,18 @@ pg_current_snapshot(PG_FUNCTION_ARGS) nxip = cur->xcnt; snap = palloc(PG_SNAPSHOT_SIZE(nxip)); - /* fill */ - snap->xmin = widen_snapshot_xid(cur->xmin, next_fxid); - snap->xmax = widen_snapshot_xid(cur->xmax, next_fxid); + /* + * Fill. This is the current backend's active snapshot, so MyProc->xmin + * is <= all these XIDs. As long as that remains so, oldestXid can't + * advance past any of these XIDs. Hence, these XIDs remain allowable + * relative to next_fxid. + */ + snap->xmin = FullTransactionIdFromAllowableAt(next_fxid, cur->xmin); + snap->xmax = FullTransactionIdFromAllowableAt(next_fxid, cur->xmax); snap->nxip = nxip; for (i = 0; i < nxip; i++) - snap->xip[i] = widen_snapshot_xid(cur->xip[i], next_fxid); + snap->xip[i] = + FullTransactionIdFromAllowableAt(next_fxid, cur->xip[i]); /* * We want them guaranteed to be in ascending order. This also removes diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 866d0d649a4a2..41b1a5c6b0bf5 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -4,7 +4,7 @@ * XML data type support. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/utils/adt/xml.c @@ -47,6 +47,7 @@ #ifdef USE_LIBXML #include +#include #include #include #include @@ -66,6 +67,16 @@ #if LIBXML_VERSION >= 20704 #define HAVE_XMLSTRUCTUREDERRORCONTEXT 1 #endif + +/* + * libxml2 2.12 decided to insert "const" into the error handler API. + */ +#if LIBXML_VERSION >= 21200 +#define PgXmlErrorPtr const xmlError * +#else +#define PgXmlErrorPtr xmlErrorPtr +#endif + #endif /* USE_LIBXML */ #include "access/htup_details.h" @@ -89,7 +100,6 @@ #include "utils/date.h" #include "utils/datetime.h" #include "utils/lsyscache.h" -#include "utils/memutils.h" #include "utils/rel.h" #include "utils/syscache.h" #include "utils/xml.h" @@ -123,7 +133,7 @@ static xmlParserInputPtr xmlPgEntityLoader(const char *URL, const char *ID, xmlParserCtxtPtr ctxt); static void xml_errsave(Node *escontext, PgXmlErrorContext *errcxt, int sqlcode, const char *msg); -static void xml_errorHandler(void *data, xmlErrorPtr error); +static void xml_errorHandler(void *data, PgXmlErrorPtr error); static int errdetail_for_xml_code(int code); static void chopStringInfoNewlines(StringInfo str); static void appendStringInfoLineSeparator(StringInfo str); @@ -212,14 +222,14 @@ static void XmlTableDestroyOpaque(struct TableFuncScanState *state); const TableFuncRoutine XmlTableRoutine = { - XmlTableInitOpaque, - XmlTableSetDocument, - XmlTableSetNamespace, - XmlTableSetRowFilter, - XmlTableSetColumnFilter, - XmlTableFetchRow, - XmlTableGetValue, - XmlTableDestroyOpaque + .InitOpaque = XmlTableInitOpaque, + .SetDocument = XmlTableSetDocument, + .SetNamespace = XmlTableSetNamespace, + .SetRowFilter = XmlTableSetRowFilter, + .SetColumnFilter = XmlTableSetColumnFilter, + .FetchRow = XmlTableFetchRow, + .GetValue = XmlTableGetValue, + .DestroyOpaque = XmlTableDestroyOpaque }; #define NO_XML_SUPPORT() \ @@ -513,6 +523,27 @@ xmlcomment(PG_FUNCTION_ARGS) } +Datum +xmltext(PG_FUNCTION_ARGS) +{ +#ifdef USE_LIBXML + text *arg = PG_GETARG_TEXT_PP(0); + text *result; + xmlChar *xmlbuf = NULL; + + xmlbuf = xmlEncodeSpecialChars(NULL, xml_text2xmlChar(arg)); + + Assert(xmlbuf); + + result = cstring_to_text_with_len((const char *) xmlbuf, xmlStrlen(xmlbuf)); + xmlFree(xmlbuf); + PG_RETURN_XML_P(result); +#else + NO_XML_SUPPORT(); + return 0; +#endif /* not USE_LIBXML */ +} + /* * TODO: xmlconcat needs to merge the notations and unparsed entities @@ -646,8 +677,14 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) } #ifdef USE_LIBXML - /* Parse the input according to the xmloption */ - doc = xml_parse(data, xmloption_arg, true, GetDatabaseEncoding(), + + /* + * Parse the input according to the xmloption. + * + * preserve_whitespace is set to false in case we are indenting, otherwise + * libxml2 will fail to indent elements that have whitespace between them. + */ + doc = xml_parse(data, xmloption_arg, !indent, GetDatabaseEncoding(), &parsed_xmloptiontype, &content_nodes, (Node *) &escontext); if (doc == NULL || escontext.error_occurred) @@ -726,7 +763,7 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) /* This attaches root to doc, so we need not free it separately. */ xmlDocSetRootElement(doc, root); - xmlAddChild(root, content_nodes); + xmlAddChildList(root, content_nodes); /* * We use this node to insert newlines in the dump. Note: in at @@ -771,7 +808,22 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) "could not close xmlSaveCtxtPtr"); } - result = (text *) xmlBuffer_to_xmltype(buf); + /* + * xmlDocContentDumpOutput may add a trailing newline, so remove that. + */ + if (xmloption_arg == XMLOPTION_DOCUMENT) + { + const char *str = (const char *) xmlBufferContent(buf); + int len = xmlBufferLength(buf); + + while (len > 0 && (str[len - 1] == '\n' || + str[len - 1] == '\r')) + len--; + + result = cstring_to_text_with_len(str, len); + } + else + result = (text *) xmlBuffer_to_xmltype(buf); } PG_CATCH(); { @@ -1665,9 +1717,9 @@ xml_doctype_in_content(const xmlChar *str) * XmlOptionType actually used to parse the input (typically the same as * xmloption_arg, but a DOCTYPE node in the input can force DOCUMENT mode). * - * If parsed_nodes isn't NULL and the input is not an XML document, the list - * of parsed nodes from the xmlParseBalancedChunkMemory call will be returned - * to *parsed_nodes. + * If parsed_nodes isn't NULL and we parse in CONTENT mode, the list + * of parsed nodes from the xmlParseInNodeContext call will be returned + * to *parsed_nodes. (It is caller's responsibility to free that.) * * Errors normally result in ereport(ERROR), but if escontext is an * ErrorSaveContext, then "safe" errors are reported there instead, and the @@ -1719,6 +1771,7 @@ xml_parse(text *data, XmlOptionType xmloption_arg, PG_TRY(); { bool parse_as_document = false; + int options; int res_code; size_t count = 0; xmlChar *version = NULL; @@ -1727,11 +1780,6 @@ xml_parse(text *data, XmlOptionType xmloption_arg, /* Any errors here are reported as hard ereport's */ xmlInitParser(); - ctxt = xmlNewParserCtxt(); - if (ctxt == NULL || xmlerrcxt->err_occurred) - xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, - "could not allocate parser context"); - /* Decide whether to parse as document or content */ if (xmloption_arg == XMLOPTION_DOCUMENT) parse_as_document = true; @@ -1754,6 +1802,18 @@ xml_parse(text *data, XmlOptionType xmloption_arg, parse_as_document = true; } + /* + * Select parse options. + * + * Note that here we try to apply DTD defaults (XML_PARSE_DTDATTR) + * according to SQL/XML:2008 GR 10.16.7.d: 'Default values defined by + * internal DTD are applied'. As for external DTDs, we try to support + * them too (see SQL/XML:2008 GR 10.16.7.e), but that doesn't really + * happen because xmlPgEntityLoader prevents it. + */ + options = XML_PARSE_NOENT | XML_PARSE_DTDATTR + | (preserve_whitespace ? 0 : XML_PARSE_NOBLANKS); + /* initialize output parameters */ if (parsed_xmloptiontype != NULL) *parsed_xmloptiontype = parse_as_document ? XMLOPTION_DOCUMENT : @@ -1763,18 +1823,16 @@ xml_parse(text *data, XmlOptionType xmloption_arg, if (parse_as_document) { - /* - * Note, that here we try to apply DTD defaults - * (XML_PARSE_DTDATTR) according to SQL/XML:2008 GR 10.16.7.d: - * 'Default values defined by internal DTD are applied'. As for - * external DTDs, we try to support them too, (see SQL/XML:2008 GR - * 10.16.7.e) - */ + ctxt = xmlNewParserCtxt(); + if (ctxt == NULL || xmlerrcxt->err_occurred) + xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, + "could not allocate parser context"); + doc = xmlCtxtReadDoc(ctxt, utf8string, - NULL, + NULL, /* no URL */ "UTF-8", - XML_PARSE_NOENT | XML_PARSE_DTDATTR - | (preserve_whitespace ? 0 : XML_PARSE_NOBLANKS)); + options); + if (doc == NULL || xmlerrcxt->err_occurred) { /* Use original option to decide which error code to report */ @@ -1791,6 +1849,9 @@ xml_parse(text *data, XmlOptionType xmloption_arg, } else { + xmlNodePtr root; + + /* set up document with empty root node to be the context node */ doc = xmlNewDoc(version); if (doc == NULL || xmlerrcxt->err_occurred) xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, @@ -1803,19 +1864,38 @@ xml_parse(text *data, XmlOptionType xmloption_arg, "could not allocate XML document"); doc->standalone = standalone; + root = xmlNewNode(NULL, (const xmlChar *) "content-root"); + if (root == NULL || xmlerrcxt->err_occurred) + xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, + "could not allocate xml node"); + /* This attaches root to doc, so we need not free it separately. */ + xmlDocSetRootElement(doc, root); + /* allow empty content */ if (*(utf8string + count)) { - res_code = xmlParseBalancedChunkMemory(doc, NULL, NULL, 0, - utf8string + count, - parsed_nodes); - if (res_code != 0 || xmlerrcxt->err_occurred) + xmlNodePtr node_list = NULL; + xmlParserErrors res; + + res = xmlParseInNodeContext(root, + (char *) utf8string + count, + strlen((char *) utf8string + count), + options, + &node_list); + + if (res != XML_ERR_OK || xmlerrcxt->err_occurred) { + xmlFreeNodeList(node_list); xml_errsave(escontext, xmlerrcxt, ERRCODE_INVALID_XML_CONTENT, "invalid XML content"); goto fail; } + + if (parsed_nodes != NULL) + *parsed_nodes = node_list; + else + xmlFreeNodeList(node_list); } } @@ -1835,7 +1915,8 @@ xml_parse(text *data, XmlOptionType xmloption_arg, } PG_END_TRY(); - xmlFreeParserCtxt(ctxt); + if (ctxt != NULL) + xmlFreeParserCtxt(ctxt); pg_xml_done(xmlerrcxt, false); @@ -2002,7 +2083,7 @@ xml_errsave(Node *escontext, PgXmlErrorContext *errcxt, * Error handler for libxml errors and warnings */ static void -xml_errorHandler(void *data, xmlErrorPtr error) +xml_errorHandler(void *data, PgXmlErrorPtr error) { PgXmlErrorContext *xmlerrcxt = (PgXmlErrorContext *) data; xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) error->ctxt; @@ -2054,6 +2135,19 @@ xml_errorHandler(void *data, xmlErrorPtr error) switch (domain) { case XML_FROM_PARSER: + + /* + * XML_ERR_NOT_WELL_BALANCED is typically reported after some + * other, more on-point error. Furthermore, libxml2 2.13 reports + * it under a completely different set of rules than prior + * versions. To avoid cross-version behavioral differences, + * suppress it so long as we already logged some error. + */ + if (error->code == XML_ERR_NOT_WELL_BALANCED && + xmlerrcxt->err_occurred) + return; + /* fall through */ + case XML_FROM_NONE: case XML_FROM_MEMORY: case XML_FROM_IO: @@ -2132,8 +2226,7 @@ xml_errorHandler(void *data, xmlErrorPtr error) appendBinaryStringInfo(&xmlerrcxt->err_buf, errorBuf->data, errorBuf->len); - pfree(errorBuf->data); - pfree(errorBuf); + destroyStringInfo(errorBuf); return; } @@ -2164,8 +2257,7 @@ xml_errorHandler(void *data, xmlErrorPtr error) (errmsg_internal("%s", errorBuf->data))); } - pfree(errorBuf->data); - pfree(errorBuf); + destroyStringInfo(errorBuf); } @@ -3012,6 +3104,10 @@ cursor_to_xmlschema(PG_FUNCTION_ARGS) ereport(ERROR, (errcode(ERRCODE_UNDEFINED_CURSOR), errmsg("cursor \"%s\" does not exist", name))); + if (portal->tupDesc == NULL) + ereport(ERROR, + (errcode(ERRCODE_INVALID_CURSOR_STATE), + errmsg("portal \"%s\" does not return tuples", name))); xmlschema = _SPI_strdup(map_sql_table_to_xmlschema(portal->tupDesc, InvalidOid, nulls, @@ -4352,7 +4448,13 @@ xpath_internal(text *xpath_expr_text, xmltype *data, ArrayType *namespaces, } } - xpathcomp = xmlXPathCompile(xpath_expr); + /* + * Note: here and elsewhere, be careful to use xmlXPathCtxtCompile not + * xmlXPathCompile. In libxml2 2.13.3 and older, the latter function + * fails to defend itself against recursion-to-stack-overflow. See + * https://gitlab.gnome.org/GNOME/libxml2/-/issues/799 + */ + xpathcomp = xmlXPathCtxtCompile(xpathctx, xpath_expr); if (xpathcomp == NULL || xmlerrcxt->err_occurred) xml_ereport(xmlerrcxt, ERROR, ERRCODE_INTERNAL_ERROR, "invalid XPath expression"); @@ -4723,7 +4825,10 @@ XmlTableSetRowFilter(TableFuncScanState *state, const char *path) xstr = pg_xmlCharStrndup(path, strlen(path)); - xtCxt->xpathcomp = xmlXPathCompile(xstr); + /* We require XmlTableSetDocument to have been done already */ + Assert(xtCxt->xpathcxt != NULL); + + xtCxt->xpathcomp = xmlXPathCtxtCompile(xtCxt->xpathcxt, xstr); if (xtCxt->xpathcomp == NULL || xtCxt->xmlerrcxt->err_occurred) xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_SYNTAX_ERROR, "invalid XPath expression"); @@ -4754,7 +4859,10 @@ XmlTableSetColumnFilter(TableFuncScanState *state, const char *path, int colnum) xstr = pg_xmlCharStrndup(path, strlen(path)); - xtCxt->xpathscomp[colnum] = xmlXPathCompile(xstr); + /* We require XmlTableSetDocument to have been done already */ + Assert(xtCxt->xpathcxt != NULL); + + xtCxt->xpathscomp[colnum] = xmlXPathCtxtCompile(xtCxt->xpathcxt, xstr); if (xtCxt->xpathscomp[colnum] == NULL || xtCxt->xmlerrcxt->err_occurred) xml_ereport(xtCxt->xmlerrcxt, ERROR, ERRCODE_DATA_EXCEPTION, "invalid XPath expression"); diff --git a/src/backend/utils/cache/attoptcache.c b/src/backend/utils/cache/attoptcache.c index 6769d4765b16e..af978ccd4b1ef 100644 --- a/src/backend/utils/cache/attoptcache.c +++ b/src/backend/utils/cache/attoptcache.c @@ -6,7 +6,7 @@ * Attribute options are cached separately from the fixed-size portion of * pg_attribute entries, which are handled by the relcache. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c index 4510031fe6950..59d625b244c72 100644 --- a/src/backend/utils/cache/catcache.c +++ b/src/backend/utils/cache/catcache.c @@ -3,7 +3,7 @@ * catcache.c * System catalog cache for tuples matching a key. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -17,13 +17,13 @@ #include "access/genam.h" #include "access/heaptoast.h" #include "access/relscan.h" -#include "access/sysattr.h" #include "access/table.h" #include "access/xact.h" +#include "catalog/catalog.h" #include "catalog/pg_collation.h" -#include "catalog/pg_operator.h" #include "catalog/pg_type.h" #include "common/hashfn.h" +#include "common/pg_prng.h" #include "miscadmin.h" #include "port/pg_bitutils.h" #ifdef CATCACHE_STATS @@ -31,14 +31,34 @@ #endif #include "storage/lmgr.h" #include "utils/builtins.h" +#include "utils/catcache.h" #include "utils/datum.h" #include "utils/fmgroids.h" +#include "utils/injection_point.h" #include "utils/inval.h" #include "utils/memutils.h" #include "utils/rel.h" -#include "utils/resowner_private.h" +#include "utils/resowner.h" #include "utils/syscache.h" +/* + * If a catcache invalidation is processed while we are in the middle of + * creating a catcache entry (or list), it might apply to the entry we're + * creating, making it invalid before it's been inserted to the catcache. To + * catch such cases, we have a stack of "create-in-progress" entries. Cache + * invalidation marks any matching entries in the stack as dead, in addition + * to the actual CatCTup and CatCList entries. + */ +typedef struct CatCInProgress +{ + CatCache *cache; /* cache that the entry belongs to */ + uint32 hash_value; /* hash of the entry; ignored for lists */ + bool list; /* is it a list entry? */ + bool dead; /* set when the entry is invalidated */ + struct CatCInProgress *next; +} CatCInProgress; + +static CatCInProgress *catcache_in_progress_stack = NULL; /* #define CACHEDEBUG */ /* turns DEBUG elogs on */ @@ -88,12 +108,15 @@ static void CatCachePrintStats(int code, Datum arg); #endif static void CatCacheRemoveCTup(CatCache *cache, CatCTup *ct); static void CatCacheRemoveCList(CatCache *cache, CatCList *cl); +static void RehashCatCache(CatCache *cp); +static void RehashCatCacheLists(CatCache *cp); static void CatalogCacheInitializeCache(CatCache *cache); static CatCTup *CatalogCacheCreateEntry(CatCache *cache, HeapTuple ntp, Datum *arguments, - uint32 hashValue, Index hashIndex, - bool negative); + uint32 hashValue, Index hashIndex); +static void ReleaseCatCacheWithOwner(HeapTuple tuple, ResourceOwner resowner); +static void ReleaseCatCacheListWithOwner(CatCList *list, ResourceOwner resowner); static void CatCacheFreeKeys(TupleDesc tupdesc, int nkeys, int *attnos, Datum *keys); static void CatCacheCopyKeys(TupleDesc tupdesc, int nkeys, int *attnos, @@ -104,6 +127,56 @@ static void CatCacheCopyKeys(TupleDesc tupdesc, int nkeys, int *attnos, * internal support functions */ +/* ResourceOwner callbacks to hold catcache references */ + +static void ResOwnerReleaseCatCache(Datum res); +static char *ResOwnerPrintCatCache(Datum res); +static void ResOwnerReleaseCatCacheList(Datum res); +static char *ResOwnerPrintCatCacheList(Datum res); + +static const ResourceOwnerDesc catcache_resowner_desc = +{ + /* catcache references */ + .name = "catcache reference", + .release_phase = RESOURCE_RELEASE_AFTER_LOCKS, + .release_priority = RELEASE_PRIO_CATCACHE_REFS, + .ReleaseResource = ResOwnerReleaseCatCache, + .DebugPrint = ResOwnerPrintCatCache +}; + +static const ResourceOwnerDesc catlistref_resowner_desc = +{ + /* catcache-list pins */ + .name = "catcache list reference", + .release_phase = RESOURCE_RELEASE_AFTER_LOCKS, + .release_priority = RELEASE_PRIO_CATCACHE_LIST_REFS, + .ReleaseResource = ResOwnerReleaseCatCacheList, + .DebugPrint = ResOwnerPrintCatCacheList +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberCatCacheRef(ResourceOwner owner, HeapTuple tuple) +{ + ResourceOwnerRemember(owner, PointerGetDatum(tuple), &catcache_resowner_desc); +} +static inline void +ResourceOwnerForgetCatCacheRef(ResourceOwner owner, HeapTuple tuple) +{ + ResourceOwnerForget(owner, PointerGetDatum(tuple), &catcache_resowner_desc); +} +static inline void +ResourceOwnerRememberCatCacheListRef(ResourceOwner owner, CatCList *list) +{ + ResourceOwnerRemember(owner, PointerGetDatum(list), &catlistref_resowner_desc); +} +static inline void +ResourceOwnerForgetCatCacheListRef(ResourceOwner owner, CatCList *list) +{ + ResourceOwnerForget(owner, PointerGetDatum(list), &catlistref_resowner_desc); +} + + /* * Hash and equality functions for system types that are used as cache key * fields. In some cases, we just call the regular SQL-callable functions for @@ -392,6 +465,7 @@ CatCachePrintStats(int code, Datum arg) long cc_neg_hits = 0; long cc_newloads = 0; long cc_invals = 0; + long cc_nlists = 0; long cc_lsearches = 0; long cc_lhits = 0; @@ -401,7 +475,7 @@ CatCachePrintStats(int code, Datum arg) if (cache->cc_ntup == 0 && cache->cc_searches == 0) continue; /* don't print unused caches */ - elog(DEBUG2, "catcache %s/%u: %d tup, %ld srch, %ld+%ld=%ld hits, %ld+%ld=%ld loads, %ld invals, %ld lsrch, %ld lhits", + elog(DEBUG2, "catcache %s/%u: %d tup, %ld srch, %ld+%ld=%ld hits, %ld+%ld=%ld loads, %ld invals, %d lists, %ld lsrch, %ld lhits", cache->cc_relname, cache->cc_indexoid, cache->cc_ntup, @@ -413,6 +487,7 @@ CatCachePrintStats(int code, Datum arg) cache->cc_searches - cache->cc_hits - cache->cc_neg_hits - cache->cc_newloads, cache->cc_searches - cache->cc_hits - cache->cc_neg_hits, cache->cc_invals, + cache->cc_nlist, cache->cc_lsearches, cache->cc_lhits); cc_searches += cache->cc_searches; @@ -420,10 +495,11 @@ CatCachePrintStats(int code, Datum arg) cc_neg_hits += cache->cc_neg_hits; cc_newloads += cache->cc_newloads; cc_invals += cache->cc_invals; + cc_nlists += cache->cc_nlist; cc_lsearches += cache->cc_lsearches; cc_lhits += cache->cc_lhits; } - elog(DEBUG2, "catcache totals: %d tup, %ld srch, %ld+%ld=%ld hits, %ld+%ld=%ld loads, %ld invals, %ld lsrch, %ld lhits", + elog(DEBUG2, "catcache totals: %d tup, %ld srch, %ld+%ld=%ld hits, %ld+%ld=%ld loads, %ld invals, %ld lists, %ld lsrch, %ld lhits", CacheHdr->ch_ntup, cc_searches, cc_hits, @@ -433,6 +509,7 @@ CatCachePrintStats(int code, Datum arg) cc_searches - cc_hits - cc_neg_hits - cc_newloads, cc_searches - cc_hits - cc_neg_hits, cc_invals, + cc_nlists, cc_lsearches, cc_lhits); } @@ -521,6 +598,8 @@ CatCacheRemoveCList(CatCache *cache, CatCList *cl) cache->cc_keyno, cl->keys); pfree(cl); + + --cache->cc_nlist; } @@ -559,14 +638,19 @@ CatCacheInvalidate(CatCache *cache, uint32 hashValue) * Invalidate *all* CatCLists in this cache; it's too hard to tell which * searches might still be correct, so just zap 'em all. */ - dlist_foreach_modify(iter, &cache->cc_lists) + for (int i = 0; i < cache->cc_nlbuckets; i++) { - CatCList *cl = dlist_container(CatCList, cache_elem, iter.cur); + dlist_head *bucket = &cache->cc_lbucket[i]; - if (cl->refcount > 0) - cl->dead = true; - else - CatCacheRemoveCList(cache, cl); + dlist_foreach_modify(iter, bucket) + { + CatCList *cl = dlist_container(CatCList, cache_elem, iter.cur); + + if (cl->refcount > 0) + cl->dead = true; + else + CatCacheRemoveCList(cache, cl); + } } /* @@ -595,6 +679,16 @@ CatCacheInvalidate(CatCache *cache, uint32 hashValue) /* could be multiple matches, so keep looking! */ } } + + /* Also invalidate any entries that are being built */ + for (CatCInProgress *e = catcache_in_progress_stack; e != NULL; e = e->next) + { + if (e->cache == cache) + { + if (e->list || e->hash_value == hashValue) + e->dead = true; + } + } } /* ---------------------------------------------------------------- @@ -631,22 +725,33 @@ CreateCacheMemoryContext(void) * * This is not very efficient if the target cache is nearly empty. * However, it shouldn't need to be efficient; we don't invoke it often. + * + * If 'debug_discard' is true, we are being called as part of + * debug_discard_caches. In that case, the cache is not reset for + * correctness, but just to get more testing of cache invalidation. We skip + * resetting in-progress build entries in that case, or we'd never make any + * progress. */ static void -ResetCatalogCache(CatCache *cache) +ResetCatalogCache(CatCache *cache, bool debug_discard) { dlist_mutable_iter iter; int i; /* Remove each list in this cache, or at least mark it dead */ - dlist_foreach_modify(iter, &cache->cc_lists) + for (i = 0; i < cache->cc_nlbuckets; i++) { - CatCList *cl = dlist_container(CatCList, cache_elem, iter.cur); + dlist_head *bucket = &cache->cc_lbucket[i]; - if (cl->refcount > 0) - cl->dead = true; - else - CatCacheRemoveCList(cache, cl); + dlist_foreach_modify(iter, bucket) + { + CatCList *cl = dlist_container(CatCList, cache_elem, iter.cur); + + if (cl->refcount > 0) + cl->dead = true; + else + CatCacheRemoveCList(cache, cl); + } } /* Remove each tuple in this cache, or at least mark it dead */ @@ -672,6 +777,16 @@ ResetCatalogCache(CatCache *cache) #endif } } + + /* Also invalidate any entries that are being built */ + if (!debug_discard) + { + for (CatCInProgress *e = catcache_in_progress_stack; e != NULL; e = e->next) + { + if (e->cache == cache) + e->dead = true; + } + } } /* @@ -681,6 +796,12 @@ ResetCatalogCache(CatCache *cache) */ void ResetCatalogCaches(void) +{ + ResetCatalogCachesExt(false); +} + +void +ResetCatalogCachesExt(bool debug_discard) { slist_iter iter; @@ -690,7 +811,7 @@ ResetCatalogCaches(void) { CatCache *cache = slist_container(CatCache, cc_next, iter.cur); - ResetCatalogCache(cache); + ResetCatalogCache(cache, debug_discard); } CACHE_elog(DEBUG2, "end of ResetCatalogCaches call"); @@ -724,7 +845,7 @@ CatalogCacheFlushCatalog(Oid catId) if (cache->cc_reloid == catId) { /* Yes, so flush all its contents */ - ResetCatalogCache(cache); + ResetCatalogCache(cache, false); /* Tell inval.c to call syscache callbacks for this cache */ CallSyscacheCallbacks(cache->id, 0); @@ -810,6 +931,12 @@ InitCatCache(int id, MCXT_ALLOC_ZERO); cp->cc_bucket = palloc0(nbuckets * sizeof(dlist_head)); + /* + * Many catcaches never receive any list searches. Therefore, we don't + * allocate the cc_lbuckets till we get a list search. + */ + cp->cc_lbucket = NULL; + /* * initialize the cache's relation information for the relation * corresponding to this cache, and initialize some of the new cache's @@ -822,10 +949,15 @@ InitCatCache(int id, cp->cc_relisshared = false; /* temporary */ cp->cc_tupdesc = (TupleDesc) NULL; cp->cc_ntup = 0; + cp->cc_nlist = 0; cp->cc_nbuckets = nbuckets; + cp->cc_nlbuckets = 0; cp->cc_nkeys = nkeys; for (i = 0; i < nkeys; ++i) + { + Assert(AttributeNumberIsValid(key[i])); cp->cc_keyno[i] = key[i]; + } /* * new cache is initialized as far as we can go for now. print some @@ -884,6 +1016,44 @@ RehashCatCache(CatCache *cp) cp->cc_bucket = newbucket; } +/* + * Enlarge a catcache's list storage, doubling the number of buckets. + */ +static void +RehashCatCacheLists(CatCache *cp) +{ + dlist_head *newbucket; + int newnbuckets; + int i; + + elog(DEBUG1, "rehashing catalog cache id %d for %s; %d lists, %d buckets", + cp->id, cp->cc_relname, cp->cc_nlist, cp->cc_nlbuckets); + + /* Allocate a new, larger, hash table. */ + newnbuckets = cp->cc_nlbuckets * 2; + newbucket = (dlist_head *) MemoryContextAllocZero(CacheMemoryContext, newnbuckets * sizeof(dlist_head)); + + /* Move all entries from old hash table to new. */ + for (i = 0; i < cp->cc_nlbuckets; i++) + { + dlist_mutable_iter iter; + + dlist_foreach_modify(iter, &cp->cc_lbucket[i]) + { + CatCList *cl = dlist_container(CatCList, cache_elem, iter.cur); + int hashIndex = HASH_INDEX(cl->hash_value, newnbuckets); + + dlist_delete(iter.cur); + dlist_push_head(&newbucket[hashIndex], &cl->cache_elem); + } + } + + /* Switch to the new array. */ + pfree(cp->cc_lbucket); + cp->cc_nlbuckets = newnbuckets; + cp->cc_lbucket = newbucket; +} + /* * CatalogCacheInitializeCache * @@ -1265,7 +1435,7 @@ SearchCatCacheInternal(CatCache *cache, */ if (!ct->negative) { - ResourceOwnerEnlargeCatCacheRefs(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); ct->refcount++; ResourceOwnerRememberCatCacheRef(CurrentResourceOwner, &ct->tuple); @@ -1316,6 +1486,7 @@ SearchCatCacheMiss(CatCache *cache, SysScanDesc scandesc; HeapTuple ntp; CatCTup *ct; + bool stale; Datum arguments[CATCACHE_MAXKEYS]; /* Initialize local parameter array */ @@ -1324,16 +1495,6 @@ SearchCatCacheMiss(CatCache *cache, arguments[2] = v3; arguments[3] = v4; - /* - * Ok, need to make a lookup in the relation, copy the scankey and fill - * out any per-call fields. - */ - memcpy(cur_skey, cache->cc_skey, sizeof(ScanKeyData) * nkeys); - cur_skey[0].sk_argument = v1; - cur_skey[1].sk_argument = v2; - cur_skey[2].sk_argument = v3; - cur_skey[3].sk_argument = v4; - /* * Tuple was not found in cache, so we have to try to retrieve it directly * from the relation. If found, we will add it to the cache; if not @@ -1348,31 +1509,57 @@ SearchCatCacheMiss(CatCache *cache, * will eventually age out of the cache, so there's no functional problem. * This case is rare enough that it's not worth expending extra cycles to * detect. + * + * Another case, which we *must* handle, is that the tuple could become + * outdated during CatalogCacheCreateEntry's attempt to detoast it (since + * AcceptInvalidationMessages can run during TOAST table access). We do + * not want to return already-stale catcache entries, so we loop around + * and do the table scan again if that happens. */ relation = table_open(cache->cc_reloid, AccessShareLock); - scandesc = systable_beginscan(relation, - cache->cc_indexoid, - IndexScanOK(cache, cur_skey), - NULL, - nkeys, - cur_skey); + do + { + /* + * Ok, need to make a lookup in the relation, copy the scankey and + * fill out any per-call fields. (We must re-do this when retrying, + * because systable_beginscan scribbles on the scankey.) + */ + memcpy(cur_skey, cache->cc_skey, sizeof(ScanKeyData) * nkeys); + cur_skey[0].sk_argument = v1; + cur_skey[1].sk_argument = v2; + cur_skey[2].sk_argument = v3; + cur_skey[3].sk_argument = v4; - ct = NULL; + scandesc = systable_beginscan(relation, + cache->cc_indexoid, + IndexScanOK(cache, cur_skey), + NULL, + nkeys, + cur_skey); - while (HeapTupleIsValid(ntp = systable_getnext(scandesc))) - { - ct = CatalogCacheCreateEntry(cache, ntp, arguments, - hashValue, hashIndex, - false); - /* immediately set the refcount to 1 */ - ResourceOwnerEnlargeCatCacheRefs(CurrentResourceOwner); - ct->refcount++; - ResourceOwnerRememberCatCacheRef(CurrentResourceOwner, &ct->tuple); - break; /* assume only one match */ - } + ct = NULL; + stale = false; + + while (HeapTupleIsValid(ntp = systable_getnext(scandesc))) + { + ct = CatalogCacheCreateEntry(cache, ntp, NULL, + hashValue, hashIndex); + /* upon failure, we must start the scan over */ + if (ct == NULL) + { + stale = true; + break; + } + /* immediately set the refcount to 1 */ + ResourceOwnerEnlarge(CurrentResourceOwner); + ct->refcount++; + ResourceOwnerRememberCatCacheRef(CurrentResourceOwner, &ct->tuple); + break; /* assume only one match */ + } - systable_endscan(scandesc); + systable_endscan(scandesc); + } while (stale); table_close(relation, AccessShareLock); @@ -1392,8 +1579,10 @@ SearchCatCacheMiss(CatCache *cache, return NULL; ct = CatalogCacheCreateEntry(cache, NULL, arguments, - hashValue, hashIndex, - true); + hashValue, hashIndex); + + /* Creating a negative cache entry shouldn't fail */ + Assert(ct != NULL); CACHE_elog(DEBUG2, "SearchCatCache(%s): Contains %d/%d tuples", cache->cc_relname, cache->cc_ntup, CacheHdr->ch_ntup); @@ -1433,6 +1622,12 @@ SearchCatCacheMiss(CatCache *cache, */ void ReleaseCatCache(HeapTuple tuple) +{ + ReleaseCatCacheWithOwner(tuple, CurrentResourceOwner); +} + +static void +ReleaseCatCacheWithOwner(HeapTuple tuple, ResourceOwner resowner) { CatCTup *ct = (CatCTup *) (((char *) tuple) - offsetof(CatCTup, tuple)); @@ -1442,7 +1637,8 @@ ReleaseCatCache(HeapTuple tuple) Assert(ct->refcount > 0); ct->refcount--; - ResourceOwnerForgetCatCacheRef(CurrentResourceOwner, &ct->tuple); + if (resowner) + ResourceOwnerForgetCatCacheRef(CurrentResourceOwner, &ct->tuple); if ( #ifndef CATCACHE_FORCE_RELEASE @@ -1507,7 +1703,9 @@ SearchCatCacheList(CatCache *cache, Datum v4 = 0; /* dummy last-column value */ Datum arguments[CATCACHE_MAXKEYS]; uint32 lHashValue; + Index lHashIndex; dlist_iter iter; + dlist_head *lbucket; CatCList *cl; CatCTup *ct; List *volatile ctlist; @@ -1517,11 +1715,13 @@ SearchCatCacheList(CatCache *cache, HeapTuple ntp; MemoryContext oldcxt; int i; + CatCInProgress *save_in_progress; + CatCInProgress in_progress_ent; /* * one-time startup overhead for each cache */ - if (cache->cc_tupdesc == NULL) + if (unlikely(cache->cc_tupdesc == NULL)) CatalogCacheInitializeCache(cache); Assert(nkeys > 0 && nkeys < cache->cc_nkeys); @@ -1537,11 +1737,36 @@ SearchCatCacheList(CatCache *cache, arguments[3] = v4; /* - * compute a hash value of the given keys for faster search. We don't - * presently divide the CatCList items into buckets, but this still lets - * us skip non-matching items quickly most of the time. + * If we haven't previously done a list search in this cache, create the + * bucket header array; otherwise, consider whether it's time to enlarge + * it. + */ + if (cache->cc_lbucket == NULL) + { + /* Arbitrary initial size --- must be a power of 2 */ + int nbuckets = 16; + + cache->cc_lbucket = (dlist_head *) + MemoryContextAllocZero(CacheMemoryContext, + nbuckets * sizeof(dlist_head)); + /* Don't set cc_nlbuckets if we get OOM allocating cc_lbucket */ + cache->cc_nlbuckets = nbuckets; + } + else + { + /* + * If the hash table has become too full, enlarge the buckets array. + * Quite arbitrarily, we enlarge when fill factor > 2. + */ + if (cache->cc_nlist > cache->cc_nlbuckets * 2) + RehashCatCacheLists(cache); + } + + /* + * Find the hash bucket in which to look for the CatCList. */ lHashValue = CatalogCacheComputeHashValue(cache, nkeys, v1, v2, v3, v4); + lHashIndex = HASH_INDEX(lHashValue, cache->cc_nlbuckets); /* * scan the items until we find a match or exhaust our list @@ -1549,7 +1774,8 @@ SearchCatCacheList(CatCache *cache, * Note: it's okay to use dlist_foreach here, even though we modify the * dlist within the loop, because we don't continue the loop afterwards. */ - dlist_foreach(iter, &cache->cc_lists) + lbucket = &cache->cc_lbucket[lHashIndex]; + dlist_foreach(iter, lbucket) { cl = dlist_container(CatCList, cache_elem, iter.cur); @@ -1569,16 +1795,16 @@ SearchCatCacheList(CatCache *cache, continue; /* - * We found a matching list. Move the list to the front of the - * cache's list-of-lists, to speed subsequent searches. (We do not + * We found a matching list. Move the list to the front of the list + * for its hashbucket, so as to speed subsequent searches. (We do not * move the members to the fronts of their hashbucket lists, however, * since there's no point in that unless they are searched for * individually.) */ - dlist_move_head(&cache->cc_lists, &cl->cache_elem); + dlist_move_head(lbucket, &cl->cache_elem); /* Bump the list's refcount and return it */ - ResourceOwnerEnlargeCatCacheListRefs(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); cl->refcount++; ResourceOwnerRememberCatCacheListRef(CurrentResourceOwner, cl); @@ -1600,97 +1826,158 @@ SearchCatCacheList(CatCache *cache, * We have to bump the member refcounts temporarily to ensure they won't * get dropped from the cache while loading other members. We use a PG_TRY * block to ensure we can undo those refcounts if we get an error before - * we finish constructing the CatCList. + * we finish constructing the CatCList. ctlist must be valid throughout + * the PG_TRY block. */ - ResourceOwnerEnlargeCatCacheListRefs(CurrentResourceOwner); - ctlist = NIL; + /* + * Cache invalidation can happen while we're building the list. + * CatalogCacheCreateEntry() handles concurrent invalidation of individual + * tuples, but it's also possible that a new entry is concurrently added + * that should be part of the list we're building. Register an + * "in-progress" entry that will receive the invalidation, until we have + * built the final list entry. + */ + save_in_progress = catcache_in_progress_stack; + in_progress_ent.next = catcache_in_progress_stack; + in_progress_ent.cache = cache; + in_progress_ent.hash_value = lHashValue; + in_progress_ent.list = true; + in_progress_ent.dead = false; + catcache_in_progress_stack = &in_progress_ent; + PG_TRY(); { ScanKeyData cur_skey[CATCACHE_MAXKEYS]; Relation relation; SysScanDesc scandesc; - - /* - * Ok, need to make a lookup in the relation, copy the scankey and - * fill out any per-call fields. - */ - memcpy(cur_skey, cache->cc_skey, sizeof(ScanKeyData) * cache->cc_nkeys); - cur_skey[0].sk_argument = v1; - cur_skey[1].sk_argument = v2; - cur_skey[2].sk_argument = v3; - cur_skey[3].sk_argument = v4; + bool first_iter = true; relation = table_open(cache->cc_reloid, AccessShareLock); - scandesc = systable_beginscan(relation, - cache->cc_indexoid, - IndexScanOK(cache, cur_skey), - NULL, - nkeys, - cur_skey); - - /* The list will be ordered iff we are doing an index scan */ - ordered = (scandesc->irel != NULL); - - while (HeapTupleIsValid(ntp = systable_getnext(scandesc))) + /* + * Scan the table for matching entries. If an invalidation arrives + * mid-build, we will loop back here to retry. + */ + do { - uint32 hashValue; - Index hashIndex; - bool found = false; - dlist_head *bucket; - /* - * See if there's an entry for this tuple already. + * If we are retrying, release refcounts on any items created on + * the previous iteration. We dare not try to free them if + * they're now unreferenced, since an error while doing that would + * result in the PG_CATCH below doing extra refcount decrements. + * Besides, we'll likely re-adopt those items in the next + * iteration, so it's not worth complicating matters to try to get + * rid of them. */ - ct = NULL; - hashValue = CatalogCacheComputeTupleHashValue(cache, cache->cc_nkeys, ntp); - hashIndex = HASH_INDEX(hashValue, cache->cc_nbuckets); - - bucket = &cache->cc_bucket[hashIndex]; - dlist_foreach(iter, bucket) + foreach(ctlist_item, ctlist) { - ct = dlist_container(CatCTup, cache_elem, iter.cur); - - if (ct->dead || ct->negative) - continue; /* ignore dead and negative entries */ + ct = (CatCTup *) lfirst(ctlist_item); + Assert(ct->c_list == NULL); + Assert(ct->refcount > 0); + ct->refcount--; + } + /* Reset ctlist in preparation for new try */ + ctlist = NIL; + in_progress_ent.dead = false; - if (ct->hash_value != hashValue) - continue; /* quickly skip entry if wrong hash val */ + /* + * Copy the scankey and fill out any per-call fields. (We must + * re-do this when retrying, because systable_beginscan scribbles + * on the scankey.) + */ + memcpy(cur_skey, cache->cc_skey, sizeof(ScanKeyData) * cache->cc_nkeys); + cur_skey[0].sk_argument = v1; + cur_skey[1].sk_argument = v2; + cur_skey[2].sk_argument = v3; + cur_skey[3].sk_argument = v4; + + scandesc = systable_beginscan(relation, + cache->cc_indexoid, + IndexScanOK(cache, cur_skey), + NULL, + nkeys, + cur_skey); + + /* The list will be ordered iff we are doing an index scan */ + ordered = (scandesc->irel != NULL); + + /* Injection point to help testing the recursive invalidation case */ + if (first_iter) + { + INJECTION_POINT("catcache-list-miss-systable-scan-started"); + first_iter = false; + } - if (!ItemPointerEquals(&(ct->tuple.t_self), &(ntp->t_self))) - continue; /* not same tuple */ + while (HeapTupleIsValid(ntp = systable_getnext(scandesc)) && + !in_progress_ent.dead) + { + uint32 hashValue; + Index hashIndex; + bool found = false; + dlist_head *bucket; /* - * Found a match, but can't use it if it belongs to another - * list already + * See if there's an entry for this tuple already. */ - if (ct->c_list) - continue; - - found = true; - break; /* A-OK */ + ct = NULL; + hashValue = CatalogCacheComputeTupleHashValue(cache, cache->cc_nkeys, ntp); + hashIndex = HASH_INDEX(hashValue, cache->cc_nbuckets); + + bucket = &cache->cc_bucket[hashIndex]; + dlist_foreach(iter, bucket) + { + ct = dlist_container(CatCTup, cache_elem, iter.cur); + + if (ct->dead || ct->negative) + continue; /* ignore dead and negative entries */ + + if (ct->hash_value != hashValue) + continue; /* quickly skip entry if wrong hash val */ + + if (!ItemPointerEquals(&(ct->tuple.t_self), &(ntp->t_self))) + continue; /* not same tuple */ + + /* + * Found a match, but can't use it if it belongs to + * another list already + */ + if (ct->c_list) + continue; + + found = true; + break; /* A-OK */ + } + + if (!found) + { + /* We didn't find a usable entry, so make a new one */ + ct = CatalogCacheCreateEntry(cache, ntp, NULL, + hashValue, hashIndex); + + /* upon failure, we must start the scan over */ + if (ct == NULL) + { + in_progress_ent.dead = true; + break; + } + } + + /* Careful here: add entry to ctlist, then bump its refcount */ + /* This way leaves state correct if lappend runs out of memory */ + ctlist = lappend(ctlist, ct); + ct->refcount++; } - if (!found) - { - /* We didn't find a usable entry, so make a new one */ - ct = CatalogCacheCreateEntry(cache, ntp, arguments, - hashValue, hashIndex, - false); - } - - /* Careful here: add entry to ctlist, then bump its refcount */ - /* This way leaves state correct if lappend runs out of memory */ - ctlist = lappend(ctlist, ct); - ct->refcount++; - } - - systable_endscan(scandesc); + systable_endscan(scandesc); + } while (in_progress_ent.dead); table_close(relation, AccessShareLock); + /* Make sure the resource owner has room to remember this entry. */ + ResourceOwnerEnlarge(CurrentResourceOwner); + /* Now we can build the CatCList entry. */ oldcxt = MemoryContextSwitchTo(CacheMemoryContext); nmembers = list_length(ctlist); @@ -1712,6 +1999,9 @@ SearchCatCacheList(CatCache *cache, } PG_CATCH(); { + Assert(catcache_in_progress_stack == &in_progress_ent); + catcache_in_progress_stack = save_in_progress; + foreach(ctlist_item, ctlist) { ct = (CatCTup *) lfirst(ctlist_item); @@ -1730,6 +2020,8 @@ SearchCatCacheList(CatCache *cache, PG_RE_THROW(); } PG_END_TRY(); + Assert(catcache_in_progress_stack == &in_progress_ent); + catcache_in_progress_stack = save_in_progress; cl->cl_magic = CL_MAGIC; cl->my_cache = cache; @@ -1755,7 +2047,12 @@ SearchCatCacheList(CatCache *cache, } Assert(i == nmembers); - dlist_push_head(&cache->cc_lists, &cl->cache_elem); + /* + * Add the CatCList to the appropriate bucket, and count it. + */ + dlist_push_head(lbucket, &cl->cache_elem); + + cache->cc_nlist++; /* Finally, bump the list's refcount and return it */ cl->refcount++; @@ -1774,12 +2071,19 @@ SearchCatCacheList(CatCache *cache, */ void ReleaseCatCacheList(CatCList *list) +{ + ReleaseCatCacheListWithOwner(list, CurrentResourceOwner); +} + +static void +ReleaseCatCacheListWithOwner(CatCList *list, ResourceOwner resowner) { /* Safety checks to ensure we were handed a cache entry */ Assert(list->cl_magic == CL_MAGIC); Assert(list->refcount > 0); list->refcount--; - ResourceOwnerForgetCatCacheListRef(CurrentResourceOwner, list); + if (resowner) + ResourceOwnerForgetCatCacheListRef(CurrentResourceOwner, list); if ( #ifndef CATCACHE_FORCE_RELEASE @@ -1794,22 +2098,41 @@ ReleaseCatCacheList(CatCList *list) * CatalogCacheCreateEntry * Create a new CatCTup entry, copying the given HeapTuple and other * supplied data into it. The new entry initially has refcount 0. + * + * To create a normal cache entry, ntp must be the HeapTuple just fetched + * from scandesc, and "arguments" is not used. To create a negative cache + * entry, pass NULL for ntp; then "arguments" is the cache keys to use. + * In either case, hashValue/hashIndex are the hash values computed from + * the cache keys. + * + * Returns NULL if we attempt to detoast the tuple and observe that it + * became stale. (This cannot happen for a negative entry.) Caller must + * retry the tuple lookup in that case. */ static CatCTup * CatalogCacheCreateEntry(CatCache *cache, HeapTuple ntp, Datum *arguments, - uint32 hashValue, Index hashIndex, - bool negative) + uint32 hashValue, Index hashIndex) { CatCTup *ct; - HeapTuple dtp; MemoryContext oldcxt; - /* negative entries have no tuple associated */ if (ntp) { int i; + HeapTuple dtp = NULL; - Assert(!negative); + /* + * The invalidation of the in-progress entry essentially never happens + * during our regression tests, and there's no easy way to force it to + * fail for testing purposes. To ensure we have test coverage for the + * retry paths in our callers, make debug builds randomly fail about + * 0.1% of the times through this code path, even when there's no + * toasted fields. + */ +#ifdef USE_ASSERT_CHECKING + if (pg_prng_uint32(&pg_global_prng_state) <= (PG_UINT32_MAX / 1000)) + return NULL; +#endif /* * If there are any out-of-line toasted fields in the tuple, expand @@ -1819,7 +2142,40 @@ CatalogCacheCreateEntry(CatCache *cache, HeapTuple ntp, Datum *arguments, * something using a slightly stale catcache entry. */ if (HeapTupleHasExternal(ntp)) - dtp = toast_flatten_tuple(ntp, cache->cc_tupdesc); + { + CatCInProgress *save_in_progress; + CatCInProgress in_progress_ent; + + /* + * The tuple could become stale while we are doing toast table + * access (since AcceptInvalidationMessages can run then). The + * invalidation will mark our in-progress entry as dead. + */ + save_in_progress = catcache_in_progress_stack; + in_progress_ent.next = catcache_in_progress_stack; + in_progress_ent.cache = cache; + in_progress_ent.hash_value = hashValue; + in_progress_ent.list = false; + in_progress_ent.dead = false; + catcache_in_progress_stack = &in_progress_ent; + + PG_TRY(); + { + dtp = toast_flatten_tuple(ntp, cache->cc_tupdesc); + } + PG_FINALLY(); + { + Assert(catcache_in_progress_stack == &in_progress_ent); + catcache_in_progress_stack = save_in_progress; + } + PG_END_TRY(); + + if (in_progress_ent.dead) + { + heap_freetuple(dtp); + return NULL; + } + } else dtp = ntp; @@ -1858,7 +2214,7 @@ CatalogCacheCreateEntry(CatCache *cache, HeapTuple ntp, Datum *arguments, } else { - Assert(negative); + /* Set up keys for a negative cache entry */ oldcxt = MemoryContextSwitchTo(CacheMemoryContext); ct = (CatCTup *) palloc(sizeof(CatCTup)); @@ -1880,7 +2236,7 @@ CatalogCacheCreateEntry(CatCache *cache, HeapTuple ntp, Datum *arguments, ct->c_list = NULL; ct->refcount = 0; /* for the moment */ ct->dead = false; - ct->negative = negative; + ct->negative = (ntp == NULL); ct->hash_value = hashValue; dlist_push_head(&cache->cc_bucket[hashIndex], &ct->cache_elem); @@ -2055,31 +2411,43 @@ PrepareToInvalidateCacheTuple(Relation relation, } } +/* ResourceOwner callbacks */ -/* - * Subroutines for warning about reference leaks. These are exported so - * that resowner.c can call them. - */ -void -PrintCatCacheLeakWarning(HeapTuple tuple) +static void +ResOwnerReleaseCatCache(Datum res) +{ + ReleaseCatCacheWithOwner((HeapTuple) DatumGetPointer(res), NULL); +} + +static char * +ResOwnerPrintCatCache(Datum res) { + HeapTuple tuple = (HeapTuple) DatumGetPointer(res); CatCTup *ct = (CatCTup *) (((char *) tuple) - offsetof(CatCTup, tuple)); /* Safety check to ensure we were handed a cache entry */ Assert(ct->ct_magic == CT_MAGIC); - elog(WARNING, "cache reference leak: cache %s (%d), tuple %u/%u has count %d", - ct->my_cache->cc_relname, ct->my_cache->id, - ItemPointerGetBlockNumber(&(tuple->t_self)), - ItemPointerGetOffsetNumber(&(tuple->t_self)), - ct->refcount); + return psprintf("cache %s (%d), tuple %u/%u has count %d", + ct->my_cache->cc_relname, ct->my_cache->id, + ItemPointerGetBlockNumber(&(tuple->t_self)), + ItemPointerGetOffsetNumber(&(tuple->t_self)), + ct->refcount); } -void -PrintCatCacheListLeakWarning(CatCList *list) +static void +ResOwnerReleaseCatCacheList(Datum res) +{ + ReleaseCatCacheListWithOwner((CatCList *) DatumGetPointer(res), NULL); +} + +static char * +ResOwnerPrintCatCacheList(Datum res) { - elog(WARNING, "cache reference leak: cache %s (%d), list %p has count %d", - list->my_cache->cc_relname, list->my_cache->id, - list, list->refcount); + CatCList *list = (CatCList *) DatumGetPointer(res); + + return psprintf("cache %s (%d), list %p has count %d", + list->my_cache->cc_relname, list->my_cache->id, + list, list->refcount); } diff --git a/src/backend/utils/cache/evtcache.c b/src/backend/utils/cache/evtcache.c index 1f5e7eb4c6d10..185b52e669dea 100644 --- a/src/backend/utils/cache/evtcache.c +++ b/src/backend/utils/cache/evtcache.c @@ -3,7 +3,7 @@ * evtcache.c * Special-purpose cache for event trigger data. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -28,14 +28,13 @@ #include "utils/inval.h" #include "utils/memutils.h" #include "utils/rel.h" -#include "utils/snapmgr.h" #include "utils/syscache.h" typedef enum { ETCS_NEEDS_REBUILD, ETCS_REBUILD_STARTED, - ETCS_VALID + ETCS_VALID, } EventTriggerCacheStateType; typedef struct @@ -91,7 +90,7 @@ BuildEventTriggerCache(void) * This can happen either because a previous rebuild failed, or * because an invalidation happened before the rebuild was complete. */ - MemoryContextResetAndDeleteChildren(EventTriggerCacheContext); + MemoryContextReset(EventTriggerCacheContext); } else { @@ -121,7 +120,7 @@ BuildEventTriggerCache(void) ctl.keysize = sizeof(EventTriggerEvent); ctl.entrysize = sizeof(EventTriggerCacheEntry); ctl.hcxt = EventTriggerCacheContext; - cache = hash_create("Event Trigger Cache", 32, &ctl, + cache = hash_create("EventTriggerCacheHash", 32, &ctl, HASH_ELEM | HASH_BLOBS | HASH_CONTEXT); /* @@ -167,6 +166,8 @@ BuildEventTriggerCache(void) event = EVT_SQLDrop; else if (strcmp(evtevent, "table_rewrite") == 0) event = EVT_TableRewrite; + else if (strcmp(evtevent, "login") == 0) + event = EVT_Login; else continue; @@ -260,7 +261,7 @@ InvalidateEventCacheCallback(Datum arg, int cacheid, uint32 hashvalue) */ if (EventTriggerCacheState == ETCS_VALID) { - MemoryContextResetAndDeleteChildren(EventTriggerCacheContext); + MemoryContextReset(EventTriggerCacheContext); EventTriggerCache = NULL; } diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c index 0008826f67c79..66e04f973f675 100644 --- a/src/backend/utils/cache/inval.c +++ b/src/backend/utils/cache/inval.c @@ -98,7 +98,7 @@ * support the decoding of the in-progress transactions. See * CommandEndInvalidationMessages. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -119,7 +119,7 @@ #include "storage/sinval.h" #include "storage/smgr.h" #include "utils/catcache.h" -#include "utils/guc.h" +#include "utils/injection_point.h" #include "utils/inval.h" #include "utils/memdebug.h" #include "utils/memutils.h" @@ -604,6 +604,97 @@ RegisterSnapshotInvalidation(Oid dbId, Oid relId) dbId, relId); } +/* + * PrepareInvalidationState + * Initialize inval data for the current (sub)transaction. + */ +static void +PrepareInvalidationState(void) +{ + TransInvalidationInfo *myInfo; + + if (transInvalInfo != NULL && + transInvalInfo->my_level == GetCurrentTransactionNestLevel()) + return; + + myInfo = (TransInvalidationInfo *) + MemoryContextAllocZero(TopTransactionContext, + sizeof(TransInvalidationInfo)); + myInfo->parent = transInvalInfo; + myInfo->my_level = GetCurrentTransactionNestLevel(); + + /* Now, do we have a previous stack entry? */ + if (transInvalInfo != NULL) + { + /* Yes; this one should be for a deeper nesting level. */ + Assert(myInfo->my_level > transInvalInfo->my_level); + + /* + * The parent (sub)transaction must not have any current (i.e., + * not-yet-locally-processed) messages. If it did, we'd have a + * semantic problem: the new subtransaction presumably ought not be + * able to see those events yet, but since the CommandCounter is + * linear, that can't work once the subtransaction advances the + * counter. This is a convenient place to check for that, as well as + * being important to keep management of the message arrays simple. + */ + if (NumMessagesInGroup(&transInvalInfo->CurrentCmdInvalidMsgs) != 0) + elog(ERROR, "cannot start a subtransaction when there are unprocessed inval messages"); + + /* + * MemoryContextAllocZero set firstmsg = nextmsg = 0 in each group, + * which is fine for the first (sub)transaction, but otherwise we need + * to update them to follow whatever is already in the arrays. + */ + SetGroupToFollow(&myInfo->PriorCmdInvalidMsgs, + &transInvalInfo->CurrentCmdInvalidMsgs); + SetGroupToFollow(&myInfo->CurrentCmdInvalidMsgs, + &myInfo->PriorCmdInvalidMsgs); + } + else + { + /* + * Here, we need only clear any array pointers left over from a prior + * transaction. + */ + InvalMessageArrays[CatCacheMsgs].msgs = NULL; + InvalMessageArrays[CatCacheMsgs].maxmsgs = 0; + InvalMessageArrays[RelCacheMsgs].msgs = NULL; + InvalMessageArrays[RelCacheMsgs].maxmsgs = 0; + } + + transInvalInfo = myInfo; +} + +/* ---------------------------------------------------------------- + * public functions + * ---------------------------------------------------------------- + */ + +void +InvalidateSystemCachesExtended(bool debug_discard) +{ + int i; + + InvalidateCatalogSnapshot(); + ResetCatalogCachesExt(debug_discard); + RelationCacheInvalidate(debug_discard); /* gets smgr and relmap too */ + + for (i = 0; i < syscache_callback_count; i++) + { + struct SYSCACHECALLBACK *ccitem = syscache_callback_list + i; + + ccitem->function(ccitem->arg, ccitem->id, 0); + } + + for (i = 0; i < relcache_callback_count; i++) + { + struct RELCACHECALLBACK *ccitem = relcache_callback_list + i; + + ccitem->function(ccitem->arg, InvalidOid); + } +} + /* * LocalExecuteInvalidationMessage * @@ -665,7 +756,7 @@ LocalExecuteInvalidationMessage(SharedInvalidationMessage *msg) rlocator.locator = msg->sm.rlocator; rlocator.backend = (msg->sm.backend_hi << 16) | (int) msg->sm.backend_lo; - smgrcloserellocator(rlocator); + smgrreleaserellocator(rlocator); } else if (msg->id == SHAREDINVALRELMAP_ID) { @@ -704,36 +795,6 @@ InvalidateSystemCaches(void) InvalidateSystemCachesExtended(false); } -void -InvalidateSystemCachesExtended(bool debug_discard) -{ - int i; - - InvalidateCatalogSnapshot(); - ResetCatalogCaches(); - RelationCacheInvalidate(debug_discard); /* gets smgr and relmap too */ - - for (i = 0; i < syscache_callback_count; i++) - { - struct SYSCACHECALLBACK *ccitem = syscache_callback_list + i; - - ccitem->function(ccitem->arg, ccitem->id, 0); - } - - for (i = 0; i < relcache_callback_count; i++) - { - struct RELCACHECALLBACK *ccitem = relcache_callback_list + i; - - ccitem->function(ccitem->arg, InvalidOid); - } -} - - -/* ---------------------------------------------------------------- - * public functions - * ---------------------------------------------------------------- - */ - /* * AcceptInvalidationMessages * Read and process invalidation messages from the shared invalidation @@ -787,68 +848,6 @@ AcceptInvalidationMessages(void) #endif } -/* - * PrepareInvalidationState - * Initialize inval data for the current (sub)transaction. - */ -static void -PrepareInvalidationState(void) -{ - TransInvalidationInfo *myInfo; - - if (transInvalInfo != NULL && - transInvalInfo->my_level == GetCurrentTransactionNestLevel()) - return; - - myInfo = (TransInvalidationInfo *) - MemoryContextAllocZero(TopTransactionContext, - sizeof(TransInvalidationInfo)); - myInfo->parent = transInvalInfo; - myInfo->my_level = GetCurrentTransactionNestLevel(); - - /* Now, do we have a previous stack entry? */ - if (transInvalInfo != NULL) - { - /* Yes; this one should be for a deeper nesting level. */ - Assert(myInfo->my_level > transInvalInfo->my_level); - - /* - * The parent (sub)transaction must not have any current (i.e., - * not-yet-locally-processed) messages. If it did, we'd have a - * semantic problem: the new subtransaction presumably ought not be - * able to see those events yet, but since the CommandCounter is - * linear, that can't work once the subtransaction advances the - * counter. This is a convenient place to check for that, as well as - * being important to keep management of the message arrays simple. - */ - if (NumMessagesInGroup(&transInvalInfo->CurrentCmdInvalidMsgs) != 0) - elog(ERROR, "cannot start a subtransaction when there are unprocessed inval messages"); - - /* - * MemoryContextAllocZero set firstmsg = nextmsg = 0 in each group, - * which is fine for the first (sub)transaction, but otherwise we need - * to update them to follow whatever is already in the arrays. - */ - SetGroupToFollow(&myInfo->PriorCmdInvalidMsgs, - &transInvalInfo->CurrentCmdInvalidMsgs); - SetGroupToFollow(&myInfo->CurrentCmdInvalidMsgs, - &myInfo->PriorCmdInvalidMsgs); - } - else - { - /* - * Here, we need only clear any array pointers left over from a prior - * transaction. - */ - InvalMessageArrays[CatCacheMsgs].msgs = NULL; - InvalMessageArrays[CatCacheMsgs].maxmsgs = 0; - InvalMessageArrays[RelCacheMsgs].msgs = NULL; - InvalMessageArrays[RelCacheMsgs].maxmsgs = 0; - } - - transInvalInfo = myInfo; -} - /* * PostPrepare_Inval * Clean up after successful PREPARE. @@ -967,13 +966,12 @@ ProcessCommittedInvalidationMessages(SharedInvalidationMessage *msgs, if (nmsgs <= 0) return; - elog(trace_recovery(DEBUG4), "replaying commit with %d messages%s", nmsgs, + elog(DEBUG4, "replaying commit with %d messages%s", nmsgs, (RelcacheInitFileInval ? " and relcache file invalidation" : "")); if (RelcacheInitFileInval) { - elog(trace_recovery(DEBUG4), "removing relcache init files for database %u", - dbid); + elog(DEBUG4, "removing relcache init files for database %u", dbid); /* * RelationCacheInitFilePreInvalidate, when the invalidation message @@ -1034,6 +1032,8 @@ AtEOXact_Inval(bool isCommit) /* Must be at top of stack */ Assert(transInvalInfo->my_level == 1 && transInvalInfo->parent == NULL); + INJECTION_POINT("transaction-end-process-inval"); + if (isCommit) { /* @@ -1455,8 +1455,8 @@ CacheInvalidateRelcacheByRelid(Oid relid) * replaying WAL as well as when creating it. * * Note: In order to avoid bloating SharedInvalidationMessage, we store only - * three bytes of the backend ID using what would otherwise be padding space. - * Thus, the maximum possible backend ID is 2^23-1. + * three bytes of the ProcNumber using what would otherwise be padding space. + * Thus, the maximum possible ProcNumber is 2^23-1. */ void CacheInvalidateSmgr(RelFileLocatorBackend rlocator) diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index 60978f9415b33..48a280d089b70 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -3,7 +3,7 @@ * lsyscache.c * Convenience routines for common queries in the system catalog cache. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -17,20 +17,22 @@ #include "access/hash.h" #include "access/htup_details.h" -#include "access/nbtree.h" #include "bootstrap/bootstrap.h" #include "catalog/namespace.h" #include "catalog/pg_am.h" #include "catalog/pg_amop.h" #include "catalog/pg_amproc.h" #include "catalog/pg_cast.h" +#include "catalog/pg_class.h" #include "catalog/pg_collation.h" #include "catalog/pg_constraint.h" +#include "catalog/pg_index.h" #include "catalog/pg_language.h" #include "catalog/pg_namespace.h" #include "catalog/pg_opclass.h" #include "catalog/pg_operator.h" #include "catalog/pg_proc.h" +#include "catalog/pg_publication.h" #include "catalog/pg_range.h" #include "catalog/pg_statistic.h" #include "catalog/pg_subscription.h" @@ -44,7 +46,6 @@ #include "utils/datum.h" #include "utils/fmgroids.h" #include "utils/lsyscache.h" -#include "utils/rel.h" #include "utils/syscache.h" #include "utils/typcache.h" @@ -872,33 +873,6 @@ get_attnum(Oid relid, const char *attname) return InvalidAttrNumber; } -/* - * get_attstattarget - * - * Given the relation id and the attribute number, - * return the "attstattarget" field from the attribute relation. - * - * Errors if not found. - */ -int -get_attstattarget(Oid relid, AttrNumber attnum) -{ - HeapTuple tp; - Form_pg_attribute att_tup; - int result; - - tp = SearchSysCache2(ATTNUM, - ObjectIdGetDatum(relid), - Int16GetDatum(attnum)); - if (!HeapTupleIsValid(tp)) - elog(ERROR, "cache lookup failed for attribute %d of relation %u", - attnum, relid); - att_tup = (Form_pg_attribute) GETSTRUCT(tp); - result = att_tup->attstattarget; - ReleaseSysCache(tp); - return result; -} - /* * get_attgenerated * @@ -1159,6 +1133,28 @@ get_constraint_index(Oid conoid) return InvalidOid; } +/* + * get_constraint_type + * Return the pg_constraint.contype value for the given constraint. + * + * No frills. + */ +char +get_constraint_type(Oid conoid) +{ + HeapTuple tp; + char contype; + + tp = SearchSysCache1(CONSTROID, ObjectIdGetDatum(conoid)); + if (!HeapTupleIsValid(tp)) + elog(ERROR, "cache lookup failed for constraint %u", conoid); + + contype = ((Form_pg_constraint) GETSTRUCT(tp))->contype; + ReleaseSysCache(tp); + + return contype; +} + /* ---------- LANGUAGE CACHE ---------- */ char * @@ -1255,6 +1251,28 @@ get_opclass_opfamily_and_input_type(Oid opclass, Oid *opfamily, Oid *opcintype) return true; } +/* + * get_opclass_method + * + * Returns the OID of the index access method the opclass belongs to. + */ +Oid +get_opclass_method(Oid opclass) +{ + HeapTuple tp; + Form_pg_opclass cla_tup; + Oid result; + + tp = SearchSysCache1(CLAOID, ObjectIdGetDatum(opclass)); + if (!HeapTupleIsValid(tp)) + elog(ERROR, "cache lookup failed for opclass %u", opclass); + cla_tup = (Form_pg_opclass) GETSTRUCT(tp); + + result = cla_tup->opcmethod; + ReleaseSysCache(tp); + return result; +} + /* ---------- OPERATOR CACHE ---------- */ /* @@ -2073,6 +2091,28 @@ get_rel_persistence(Oid relid) return result; } +/* + * get_rel_relam + * + * Returns the relam associated with a given relation. + */ +Oid +get_rel_relam(Oid relid) +{ + HeapTuple tp; + Form_pg_class reltup; + Oid result; + + tp = SearchSysCache1(RELOID, ObjectIdGetDatum(relid)); + if (!HeapTupleIsValid(tp)) + elog(ERROR, "cache lookup failed for relation %u", relid); + reltup = (Form_pg_class) GETSTRUCT(tp); + result = reltup->relam; + ReleaseSysCache(tp); + + return result; +} + /* ---------- TRANSFORM CACHE ---------- */ @@ -2084,7 +2124,8 @@ get_transform_fromsql(Oid typid, Oid langid, List *trftypes) if (!list_member_oid(trftypes, typid)) return InvalidOid; - tup = SearchSysCache2(TRFTYPELANG, typid, langid); + tup = SearchSysCache2(TRFTYPELANG, ObjectIdGetDatum(typid), + ObjectIdGetDatum(langid)); if (HeapTupleIsValid(tup)) { Oid funcid; @@ -2105,7 +2146,8 @@ get_transform_tosql(Oid typid, Oid langid, List *trftypes) if (!list_member_oid(trftypes, typid)) return InvalidOid; - tup = SearchSysCache2(TRFTYPELANG, typid, langid); + tup = SearchSysCache2(TRFTYPELANG, ObjectIdGetDatum(typid), + ObjectIdGetDatum(langid)); if (HeapTupleIsValid(tup)) { Oid funcid; diff --git a/src/backend/utils/cache/meson.build b/src/backend/utils/cache/meson.build index e0f54063e676c..a4c5074b32caf 100644 --- a/src/backend/utils/cache/meson.build +++ b/src/backend/utils/cache/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'attoptcache.c', diff --git a/src/backend/utils/cache/partcache.c b/src/backend/utils/cache/partcache.c index 5f3516ad0c245..beec6cddbc44f 100644 --- a/src/backend/utils/cache/partcache.c +++ b/src/backend/utils/cache/partcache.c @@ -4,7 +4,7 @@ * Support routines for manipulating partition information cached in * relcache * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -19,7 +19,6 @@ #include "access/nbtree.h" #include "access/relation.h" #include "catalog/partition.h" -#include "catalog/pg_inherits.h" #include "catalog/pg_opclass.h" #include "catalog/pg_partitioned_table.h" #include "miscadmin.h" @@ -27,9 +26,7 @@ #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" #include "partitioning/partbounds.h" -#include "rewrite/rewriteHandler.h" #include "utils/builtins.h" -#include "utils/datum.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/partcache.h" @@ -365,7 +362,8 @@ generate_partition_qual(Relation rel) parent = relation_open(parentrelid, AccessShareLock); /* Get pg_class.relpartbound */ - tuple = SearchSysCache1(RELOID, RelationGetRelid(rel)); + tuple = SearchSysCache1(RELOID, + ObjectIdGetDatum(RelationGetRelid(rel))); if (!HeapTupleIsValid(tuple)) elog(ERROR, "cache lookup failed for relation %u", RelationGetRelid(rel)); diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c index 3d3f7a9beaeba..5af1a168ec2f7 100644 --- a/src/backend/utils/cache/plancache.c +++ b/src/backend/utils/cache/plancache.c @@ -44,7 +44,7 @@ * if the old one gets invalidated. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -63,13 +63,12 @@ #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" #include "parser/analyze.h" -#include "parser/parsetree.h" #include "storage/lmgr.h" #include "tcop/pquery.h" #include "tcop/utility.h" #include "utils/inval.h" #include "utils/memutils.h" -#include "utils/resowner_private.h" +#include "utils/resowner.h" #include "utils/rls.h" #include "utils/snapmgr.h" #include "utils/syscache.h" @@ -77,13 +76,15 @@ /* * We must skip "overhead" operations that involve database access when the - * cached plan's subject statement is a transaction control command. - * For the convenience of postgres.c, treat empty statements as control - * commands too. + * cached plan's subject statement is a transaction control command or one + * that requires a snapshot not to be set yet (such as SET or LOCK). More + * generally, statements that do not require parse analysis/rewrite/plan + * activity never need to be revalidated, so we can treat them all like that. + * For the convenience of postgres.c, treat empty statements that way too. */ -#define IsTransactionStmtPlan(plansource) \ - ((plansource)->raw_parse_tree == NULL || \ - IsA((plansource)->raw_parse_tree->stmt, TransactionStmt)) +#define StmtPlanRequiresRevalidation(plansource) \ + ((plansource)->raw_parse_tree != NULL && \ + stmt_requires_parse_analysis((plansource)->raw_parse_tree)) /* * This is the head of the backend's list of "saved" CachedPlanSources (i.e., @@ -117,6 +118,31 @@ static void PlanCacheRelCallback(Datum arg, Oid relid); static void PlanCacheObjectCallback(Datum arg, int cacheid, uint32 hashvalue); static void PlanCacheSysCallback(Datum arg, int cacheid, uint32 hashvalue); +/* ResourceOwner callbacks to track plancache references */ +static void ResOwnerReleaseCachedPlan(Datum res); + +static const ResourceOwnerDesc planref_resowner_desc = +{ + .name = "plancache reference", + .release_phase = RESOURCE_RELEASE_AFTER_LOCKS, + .release_priority = RELEASE_PRIO_PLANCACHE_REFS, + .ReleaseResource = ResOwnerReleaseCachedPlan, + .DebugPrint = NULL /* the default message is fine */ +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberPlanCacheRef(ResourceOwner owner, CachedPlan *plan) +{ + ResourceOwnerRemember(owner, PointerGetDatum(plan), &planref_resowner_desc); +} +static inline void +ResourceOwnerForgetPlanCacheRef(ResourceOwner owner, CachedPlan *plan) +{ + ResourceOwnerForget(owner, PointerGetDatum(plan), &planref_resowner_desc); +} + + /* GUC parameter */ int plan_cache_mode = PLAN_CACHE_MODE_AUTO; @@ -383,13 +409,13 @@ CompleteCachedPlan(CachedPlanSource *plansource, plansource->query_context = querytree_context; plansource->query_list = querytree_list; - if (!plansource->is_oneshot && !IsTransactionStmtPlan(plansource)) + if (!plansource->is_oneshot && StmtPlanRequiresRevalidation(plansource)) { /* * Use the planner machinery to extract dependencies. Data is saved * in query_context. (We assume that not a lot of extra cruft is * created by this call.) We can skip this for one-shot plans, and - * transaction control commands have no such dependencies anyway. + * plans not needing revalidation have no such dependencies anyway. */ extract_query_dependencies((Node *) querytree_list, &plansource->relationOids, @@ -407,7 +433,7 @@ CompleteCachedPlan(CachedPlanSource *plansource, * one-shot plans; and we *must* skip this for transaction control * commands, because this could result in catalog accesses. */ - plansource->search_path = GetOverrideSearchPath(querytree_context); + plansource->search_path = GetSearchPathMatcher(querytree_context); } /* @@ -568,11 +594,11 @@ RevalidateCachedQuery(CachedPlanSource *plansource, /* * For one-shot plans, we do not support revalidation checking; it's * assumed the query is parsed, planned, and executed in one transaction, - * so that no lock re-acquisition is necessary. Also, there is never any - * need to revalidate plans for transaction control commands (and we - * mustn't risk any catalog accesses when handling those). + * so that no lock re-acquisition is necessary. Also, if the statement + * type can't require revalidation, we needn't do anything (and we mustn't + * risk catalog accesses when handling, eg, transaction control commands). */ - if (plansource->is_oneshot || IsTransactionStmtPlan(plansource)) + if (plansource->is_oneshot || !StmtPlanRequiresRevalidation(plansource)) { Assert(plansource->is_valid); return NIL; @@ -586,7 +612,7 @@ RevalidateCachedQuery(CachedPlanSource *plansource, if (plansource->is_valid) { Assert(plansource->search_path != NULL); - if (!OverrideSearchPathMatchesCurrent(plansource->search_path)) + if (!SearchPathMatchesCurrentEnvironment(plansource->search_path)) { /* Invalidate the querytree and generic plan */ plansource->is_valid = false; @@ -701,8 +727,7 @@ RevalidateCachedQuery(CachedPlanSource *plansource, PopActiveSnapshot(); /* - * Check or update the result tupdesc. XXX should we use a weaker - * condition than equalTupleDescs() here? + * Check or update the result tupdesc. * * We assume the parameter types didn't change from the first time, so no * need to update that. @@ -713,7 +738,7 @@ RevalidateCachedQuery(CachedPlanSource *plansource, /* OK, doesn't return tuples */ } else if (resultDesc == NULL || plansource->resultDesc == NULL || - !equalTupleDescs(resultDesc, plansource->resultDesc)) + !equalRowTypes(resultDesc, plansource->resultDesc)) { /* can we give a better error message? */ if (plansource->fixed_result) @@ -759,7 +784,7 @@ RevalidateCachedQuery(CachedPlanSource *plansource, * not generate much extra cruft either, since almost certainly the path * is already valid.) */ - plansource->search_path = GetOverrideSearchPath(querytree_context); + plansource->search_path = GetSearchPathMatcher(querytree_context); MemoryContextSwitchTo(oldcxt); @@ -1029,8 +1054,8 @@ choose_custom_plan(CachedPlanSource *plansource, ParamListInfo boundParams) /* Otherwise, never any point in a custom plan if there's no parameters */ if (boundParams == NULL) return false; - /* ... nor for transaction control statements */ - if (IsTransactionStmtPlan(plansource)) + /* ... nor when planning would be a no-op */ + if (!StmtPlanRequiresRevalidation(plansource)) return false; /* Let settings force the decision */ @@ -1231,7 +1256,7 @@ GetCachedPlan(CachedPlanSource *plansource, ParamListInfo boundParams, /* Flag the plan as in use by caller */ if (owner) - ResourceOwnerEnlargePlanCacheRefs(owner); + ResourceOwnerEnlarge(owner); plan->refcount++; if (owner) ResourceOwnerRememberPlanCacheRef(owner, plan); @@ -1326,7 +1351,7 @@ CachedPlanAllowsSimpleValidityCheck(CachedPlanSource *plansource, Assert(plan->is_valid); Assert(plan == plansource->gplan); Assert(plansource->search_path != NULL); - Assert(OverrideSearchPathMatchesCurrent(plansource->search_path)); + Assert(SearchPathMatchesCurrentEnvironment(plansource->search_path)); /* We don't support oneshot plans here. */ if (plansource->is_oneshot) @@ -1394,7 +1419,7 @@ CachedPlanAllowsSimpleValidityCheck(CachedPlanSource *plansource, /* Bump refcount if requested. */ if (owner) { - ResourceOwnerEnlargePlanCacheRefs(owner); + ResourceOwnerEnlarge(owner); plan->refcount++; ResourceOwnerRememberPlanCacheRef(owner, plan); } @@ -1440,20 +1465,22 @@ CachedPlanIsSimplyValid(CachedPlanSource *plansource, CachedPlan *plan, * that here we *do* check plansource->is_valid, so as to force plan * rebuild if that's become false. */ - if (!plansource->is_valid || plan != plansource->gplan || !plan->is_valid) + if (!plansource->is_valid || + plan == NULL || plan != plansource->gplan || + !plan->is_valid) return false; Assert(plan->magic == CACHEDPLAN_MAGIC); /* Is the search_path still the same as when we made it? */ Assert(plansource->search_path != NULL); - if (!OverrideSearchPathMatchesCurrent(plansource->search_path)) + if (!SearchPathMatchesCurrentEnvironment(plansource->search_path)) return false; /* It's still good. Bump refcount if requested. */ if (owner) { - ResourceOwnerEnlargePlanCacheRefs(owner); + ResourceOwnerEnlarge(owner); plan->refcount++; ResourceOwnerRememberPlanCacheRef(owner, plan); } @@ -1563,7 +1590,7 @@ CopyCachedPlan(CachedPlanSource *plansource) newsource->relationOids = copyObject(plansource->relationOids); newsource->invalItems = copyObject(plansource->invalItems); if (plansource->search_path) - newsource->search_path = CopyOverrideSearchPath(plansource->search_path); + newsource->search_path = CopySearchPathMatcher(plansource->search_path); newsource->query_context = querytree_context; newsource->rewriteRoleId = plansource->rewriteRoleId; newsource->rewriteRowSecurity = plansource->rewriteRowSecurity; @@ -1970,8 +1997,8 @@ PlanCacheRelCallback(Datum arg, Oid relid) if (!plansource->is_valid) continue; - /* Never invalidate transaction control commands */ - if (IsTransactionStmtPlan(plansource)) + /* Never invalidate if parse/plan would be a no-op anyway */ + if (!StmtPlanRequiresRevalidation(plansource)) continue; /* @@ -2055,8 +2082,8 @@ PlanCacheObjectCallback(Datum arg, int cacheid, uint32 hashvalue) if (!plansource->is_valid) continue; - /* Never invalidate transaction control commands */ - if (IsTransactionStmtPlan(plansource)) + /* Never invalidate if parse/plan would be a no-op anyway */ + if (!StmtPlanRequiresRevalidation(plansource)) continue; /* @@ -2165,7 +2192,6 @@ ResetPlanCache(void) { CachedPlanSource *plansource = dlist_container(CachedPlanSource, node, iter.cur); - ListCell *lc; Assert(plansource->magic == CACHEDPLANSOURCE_MAGIC); @@ -2177,32 +2203,16 @@ ResetPlanCache(void) * We *must not* mark transaction control statements as invalid, * particularly not ROLLBACK, because they may need to be executed in * aborted transactions when we can't revalidate them (cf bug #5269). + * In general there's no point in invalidating statements for which a + * new parse analysis/rewrite/plan cycle would certainly give the same + * results. */ - if (IsTransactionStmtPlan(plansource)) + if (!StmtPlanRequiresRevalidation(plansource)) continue; - /* - * In general there is no point in invalidating utility statements - * since they have no plans anyway. So invalidate it only if it - * contains at least one non-utility statement, or contains a utility - * statement that contains a pre-analyzed query (which could have - * dependencies.) - */ - foreach(lc, plansource->query_list) - { - Query *query = lfirst_node(Query, lc); - - if (query->commandType != CMD_UTILITY || - UtilityContainsQuery(query->utilityStmt)) - { - /* non-utility statement, so invalidate */ - plansource->is_valid = false; - if (plansource->gplan) - plansource->gplan->is_valid = false; - /* no need to look further */ - break; - } - } + plansource->is_valid = false; + if (plansource->gplan) + plansource->gplan->is_valid = false; } /* Likewise invalidate cached expressions */ @@ -2216,3 +2226,20 @@ ResetPlanCache(void) cexpr->is_valid = false; } } + +/* + * Release all CachedPlans remembered by 'owner' + */ +void +ReleaseAllPlanCacheRefsInOwner(ResourceOwner owner) +{ + ResourceOwnerReleaseAllOfKind(owner, &planref_resowner_desc); +} + +/* ResourceOwner callbacks */ + +static void +ResOwnerReleaseCachedPlan(Datum res) +{ + ReleaseCachedPlan((CachedPlan *) DatumGetPointer(res), NULL); +} diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 8a08463c2b7c0..3f1e8ce1f5f62 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -3,7 +3,7 @@ * relcache.c * POSTGRES relation descriptor cache code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -32,7 +32,6 @@ #include "access/htup_details.h" #include "access/multixact.h" -#include "access/nbtree.h" #include "access/parallel.h" #include "access/reloptions.h" #include "access/sysattr.h" @@ -40,7 +39,6 @@ #include "access/tableam.h" #include "access/tupdesc_details.h" #include "access/xact.h" -#include "access/xlog.h" #include "catalog/binary_upgrade.h" #include "catalog/catalog.h" #include "catalog/indexing.h" @@ -69,6 +67,7 @@ #include "commands/policy.h" #include "commands/publicationcmds.h" #include "commands/trigger.h" +#include "common/int.h" #include "miscadmin.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" @@ -80,13 +79,14 @@ #include "storage/smgr.h" #include "utils/array.h" #include "utils/builtins.h" +#include "utils/catcache.h" #include "utils/datum.h" #include "utils/fmgroids.h" #include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/relmapper.h" -#include "utils/resowner_private.h" +#include "utils/resowner.h" #include "utils/snapmgr.h" #include "utils/syscache.h" @@ -273,7 +273,9 @@ static HTAB *OpClassCache = NULL; /* non-export function prototypes */ +static void RelationCloseCleanup(Relation relation); static void RelationDestroyRelation(Relation relation, bool remember_tupdesc); +static void RelationInvalidateRelation(Relation relation); static void RelationClearRelation(Relation relation, bool rebuild); static void RelationReloadIndexInfo(Relation relation); @@ -1141,13 +1143,13 @@ RelationBuildDesc(Oid targetRelId, bool insertIt) { case RELPERSISTENCE_UNLOGGED: case RELPERSISTENCE_PERMANENT: - relation->rd_backend = InvalidBackendId; + relation->rd_backend = INVALID_PROC_NUMBER; relation->rd_islocaltemp = false; break; case RELPERSISTENCE_TEMP: if (isTempOrTempToastNamespace(relation->rd_rel->relnamespace)) { - relation->rd_backend = BackendIdForTempRelations(); + relation->rd_backend = ProcNumberForTempRelations(); relation->rd_islocaltemp = true; } else @@ -1156,18 +1158,18 @@ RelationBuildDesc(Oid targetRelId, bool insertIt) * If it's a temp table, but not one of ours, we have to use * the slow, grotty method to figure out the owning backend. * - * Note: it's possible that rd_backend gets set to MyBackendId - * here, in case we are looking at a pg_class entry left over - * from a crashed backend that coincidentally had the same - * BackendId we're using. We should *not* consider such a - * table to be "ours"; this is why we need the separate - * rd_islocaltemp flag. The pg_class entry will get flushed - * if/when we clean out the corresponding temp table namespace - * in preparation for using it. + * Note: it's possible that rd_backend gets set to + * MyProcNumber here, in case we are looking at a pg_class + * entry left over from a crashed backend that coincidentally + * had the same ProcNumber we're using. We should *not* + * consider such a table to be "ours"; this is why we need the + * separate rd_islocaltemp flag. The pg_class entry will get + * flushed if/when we clean out the corresponding temp table + * namespace in preparation for using it. */ relation->rd_backend = - GetTempNamespaceBackendId(relation->rd_rel->relnamespace); - Assert(relation->rd_backend != InvalidBackendId); + GetTempNamespaceProcNumber(relation->rd_rel->relnamespace); + Assert(relation->rd_backend != INVALID_PROC_NUMBER); relation->rd_islocaltemp = false; } break; @@ -1207,6 +1209,13 @@ RelationBuildDesc(Oid targetRelId, bool insertIt) else if (RELKIND_HAS_TABLE_AM(relation->rd_rel->relkind) || relation->rd_rel->relkind == RELKIND_SEQUENCE) RelationInitTableAccessMethod(relation); + else if (relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + { + /* + * Do nothing: access methods are a setting that partitions can + * inherit. + */ + } else Assert(relation->rd_rel->relam == InvalidOid); @@ -1893,7 +1902,7 @@ formrdesc(const char *relationName, Oid relationReltype, relation->rd_newRelfilelocatorSubid = InvalidSubTransactionId; relation->rd_firstRelfilelocatorSubid = InvalidSubTransactionId; relation->rd_droppedSubid = InvalidSubTransactionId; - relation->rd_backend = InvalidBackendId; + relation->rd_backend = INVALID_PROC_NUMBER; relation->rd_islocaltemp = false; /* @@ -2115,6 +2124,31 @@ RelationIdGetRelation(Oid relationId) * ---------------------------------------------------------------- */ +/* ResourceOwner callbacks to track relcache references */ +static void ResOwnerReleaseRelation(Datum res); +static char *ResOwnerPrintRelCache(Datum res); + +static const ResourceOwnerDesc relref_resowner_desc = +{ + .name = "relcache reference", + .release_phase = RESOURCE_RELEASE_BEFORE_LOCKS, + .release_priority = RELEASE_PRIO_RELCACHE_REFS, + .ReleaseResource = ResOwnerReleaseRelation, + .DebugPrint = ResOwnerPrintRelCache +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberRelationRef(ResourceOwner owner, Relation rel) +{ + ResourceOwnerRemember(owner, PointerGetDatum(rel), &relref_resowner_desc); +} +static inline void +ResourceOwnerForgetRelationRef(ResourceOwner owner, Relation rel) +{ + ResourceOwnerForget(owner, PointerGetDatum(rel), &relref_resowner_desc); +} + /* * RelationIncrementReferenceCount * Increments relation reference count. @@ -2126,7 +2160,7 @@ RelationIdGetRelation(Oid relationId) void RelationIncrementReferenceCount(Relation rel) { - ResourceOwnerEnlargeRelationRefs(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); rel->rd_refcnt += 1; if (!IsBootstrapProcessingMode()) ResourceOwnerRememberRelationRef(CurrentResourceOwner, rel); @@ -2162,6 +2196,12 @@ RelationClose(Relation relation) /* Note: no locking manipulations needed */ RelationDecrementReferenceCount(relation); + RelationCloseCleanup(relation); +} + +static void +RelationCloseCleanup(Relation relation) +{ /* * If the relation is no longer open in this session, we can clean up any * stale partition descriptors it has. This is unlikely, so check to see @@ -2305,6 +2345,7 @@ RelationReloadIndexInfo(Relation relation) relation->rd_index->indcheckxmin = index->indcheckxmin; relation->rd_index->indisready = index->indisready; relation->rd_index->indislive = index->indislive; + relation->rd_index->indisreplident = index->indisreplident; /* Copy xmin too, as that is needed to make sense of indcheckxmin */ HeapTupleHeaderSetXmin(relation->rd_indextuple->t_data, @@ -2472,6 +2513,31 @@ RelationDestroyRelation(Relation relation, bool remember_tupdesc) pfree(relation); } +/* + * RelationInvalidateRelation - mark a relation cache entry as invalid + * + * An entry that's marked as invalid will be reloaded on next access. + */ +static void +RelationInvalidateRelation(Relation relation) +{ + /* + * Make sure smgr and lower levels close the relation's files, if they + * weren't closed already. If the relation is not getting deleted, the + * next smgr access should reopen the files automatically. This ensures + * that the low-level file access state is updated after, say, a vacuum + * truncation. + */ + RelationCloseSmgr(relation); + + /* Free AM cached data, if any */ + if (relation->rd_amcache) + pfree(relation->rd_amcache); + relation->rd_amcache = NULL; + + relation->rd_isvalid = false; +} + /* * RelationClearRelation * @@ -2806,14 +2872,28 @@ RelationFlushRelation(Relation relation) * New relcache entries are always rebuilt, not flushed; else we'd * forget the "new" status of the relation. Ditto for the * new-relfilenumber status. - * - * The rel could have zero refcnt here, so temporarily increment the - * refcnt to ensure it's safe to rebuild it. We can assume that the - * current transaction has some lock on the rel already. */ - RelationIncrementReferenceCount(relation); - RelationClearRelation(relation, true); - RelationDecrementReferenceCount(relation); + if (IsTransactionState() && relation->rd_droppedSubid == InvalidSubTransactionId) + { + /* + * The rel could have zero refcnt here, so temporarily increment + * the refcnt to ensure it's safe to rebuild it. We can assume + * that the current transaction has some lock on the rel already. + */ + RelationIncrementReferenceCount(relation); + RelationClearRelation(relation, true); + RelationDecrementReferenceCount(relation); + } + else + { + /* + * During abort processing, the current resource owner is not + * valid and we cannot hold a refcnt. Without a valid + * transaction, RelationClearRelation() would just mark the rel as + * invalid anyway, so we can do the same directly. + */ + RelationInvalidateRelation(relation); + } } else { @@ -2952,9 +3032,6 @@ RelationCacheInvalidate(bool debug_discard) { relation = idhentry->reldesc; - /* Must close all smgr references to avoid leaving dangling ptrs */ - RelationCloseSmgr(relation); - /* * Ignore new relations; no other backend will manipulate them before * we commit. Likewise, before replacing a relation's relfilelocator, @@ -2983,7 +3060,10 @@ RelationCacheInvalidate(bool debug_discard) * map doesn't involve any access to relcache entries. */ if (RelationIsMapped(relation)) + { + RelationCloseSmgr(relation); RelationInitPhysicalAddr(relation); + } /* * Add this entry to list of stuff to rebuild in second pass. @@ -3006,11 +3086,10 @@ RelationCacheInvalidate(bool debug_discard) } /* - * Now zap any remaining smgr cache entries. This must happen before we - * start to rebuild entries, since that may involve catalog fetches which - * will re-open catalog files. + * We cannot destroy the SMgrRelations as there might still be references + * to them, but close the underlying file descriptors. */ - smgrcloseall(); + smgrreleaseall(); /* Phase 2: rebuild the items found to need rebuild in phase 1 */ foreach(l, rebuildFirstList) @@ -3032,25 +3111,6 @@ RelationCacheInvalidate(bool debug_discard) in_progress_list[i].invalidated = true; } -/* - * RelationCloseSmgrByOid - close a relcache entry's smgr link - * - * Needed in some cases where we are changing a relation's physical mapping. - * The link will be automatically reopened on next use. - */ -void -RelationCloseSmgrByOid(Oid relationId) -{ - Relation relation; - - RelationIdCacheLookup(relationId, relation); - - if (!PointerIsValid(relation)) - return; /* not in cache, nothing to do */ - - RelationCloseSmgr(relation); -} - static void RememberToFreeTupleDescAtEOX(TupleDesc td) { @@ -3595,12 +3655,12 @@ RelationBuildLocalRelation(const char *relname, { case RELPERSISTENCE_UNLOGGED: case RELPERSISTENCE_PERMANENT: - rel->rd_backend = InvalidBackendId; + rel->rd_backend = INVALID_PROC_NUMBER; rel->rd_islocaltemp = false; break; case RELPERSISTENCE_TEMP: Assert(isTempOrTempToastNamespace(relnamespace)); - rel->rd_backend = BackendIdForTempRelations(); + rel->rd_backend = ProcNumberForTempRelations(); rel->rd_islocaltemp = true; break; default: @@ -3710,6 +3770,7 @@ RelationSetNewRelfilenumber(Relation relation, char persistence) { RelFileNumber newrelfilenumber; Relation pg_class; + ItemPointerData otid; HeapTuple tuple; Form_pg_class classform; MultiXactId minmulti = InvalidMultiXactId; @@ -3752,11 +3813,12 @@ RelationSetNewRelfilenumber(Relation relation, char persistence) */ pg_class = table_open(RelationRelationId, RowExclusiveLock); - tuple = SearchSysCacheCopy1(RELOID, - ObjectIdGetDatum(RelationGetRelid(relation))); + tuple = SearchSysCacheLockedCopy1(RELOID, + ObjectIdGetDatum(RelationGetRelid(relation))); if (!HeapTupleIsValid(tuple)) elog(ERROR, "could not find tuple for relation %u", RelationGetRelid(relation)); + otid = tuple->t_self; classform = (Form_pg_class) GETSTRUCT(tuple); /* @@ -3876,9 +3938,10 @@ RelationSetNewRelfilenumber(Relation relation, char persistence) classform->relminmxid = minmulti; classform->relpersistence = persistence; - CatalogTupleUpdate(pg_class, &tuple->t_self, tuple); + CatalogTupleUpdate(pg_class, &otid, tuple); } + UnlockTuple(pg_class, &otid, InplaceUpdateTupleLock); heap_freetuple(tuple); table_close(pg_class, RowExclusiveLock); @@ -4199,8 +4262,10 @@ RelationCacheInitializePhase3(void) htup = SearchSysCache1(RELOID, ObjectIdGetDatum(RelationGetRelid(relation))); if (!HeapTupleIsValid(htup)) - elog(FATAL, "cache lookup failed for relation %u", - RelationGetRelid(relation)); + ereport(FATAL, + errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg_internal("cache lookup failed for relation %u", + RelationGetRelid(relation))); relp = (Form_pg_class) GETSTRUCT(htup); /* @@ -4333,7 +4398,9 @@ load_critical_index(Oid indexoid, Oid heapoid) LockRelationOid(indexoid, AccessShareLock); ird = RelationBuildDesc(indexoid, true); if (ird == NULL) - elog(PANIC, "could not open critical system index %u", indexoid); + ereport(PANIC, + errcode(ERRCODE_DATA_CORRUPTED), + errmsg_internal("could not open critical system index %u", indexoid)); ird->rd_isnailed = true; ird->rd_refcnt = 1; UnlockRelationOid(indexoid, AccessShareLock); @@ -4505,7 +4572,7 @@ AttrDefaultCmp(const void *a, const void *b) const AttrDefault *ada = (const AttrDefault *) a; const AttrDefault *adb = (const AttrDefault *) b; - return ada->adnum - adb->adnum; + return pg_cmp_s16(ada->adnum, adb->adnum); } /* @@ -4747,6 +4814,7 @@ RelationGetIndexList(Relation relation) char replident = relation->rd_rel->relreplident; Oid pkeyIndex = InvalidOid; Oid candidateIndex = InvalidOid; + bool pkdeferrable = false; MemoryContext oldcxt; /* Quick exit if we already computed the list. */ @@ -4818,7 +4886,8 @@ RelationGetIndexList(Relation relation) oldlist = relation->rd_indexlist; relation->rd_indexlist = list_copy(result); relation->rd_pkindex = pkeyIndex; - if (replident == REPLICA_IDENTITY_DEFAULT && OidIsValid(pkeyIndex)) + relation->rd_ispkdeferrable = pkdeferrable; + if (replident == REPLICA_IDENTITY_DEFAULT && OidIsValid(pkeyIndex) && !pkdeferrable) relation->rd_replidindex = pkeyIndex; else if (replident == REPLICA_IDENTITY_INDEX && OidIsValid(candidateIndex)) relation->rd_replidindex = candidateIndex; @@ -4921,7 +4990,8 @@ RelationGetStatExtList(Relation relation) /* * RelationGetPrimaryKeyIndex -- get OID of the relation's primary key index * - * Returns InvalidOid if there is no such index. + * Returns InvalidOid if there is no such index, or if the primary key is + * DEFERRABLE. */ Oid RelationGetPrimaryKeyIndex(Relation relation) @@ -4936,7 +5006,7 @@ RelationGetPrimaryKeyIndex(Relation relation) Assert(relation->rd_indexvalid); } - return relation->rd_pkindex; + return relation->rd_ispkdeferrable ? InvalidOid : relation->rd_pkindex; } /* @@ -5149,13 +5219,23 @@ RelationGetIndexPredicate(Relation relation) * simple index keys, but attributes used in expressions and partial-index * predicates.) * - * Depending on attrKind, a bitmap covering the attnums for all index columns, - * for all potential foreign key columns, or for all columns in the configured - * replica identity index is returned. + * Depending on attrKind, a bitmap covering attnums for certain columns is + * returned: + * INDEX_ATTR_BITMAP_KEY Columns in non-partial unique indexes not + * in expressions (i.e., usable for FKs) + * INDEX_ATTR_BITMAP_PRIMARY_KEY Columns in the table's primary key + * (beware: even if PK is deferrable!) + * INDEX_ATTR_BITMAP_IDENTITY_KEY Columns in the table's replica identity + * index (empty if FULL) + * INDEX_ATTR_BITMAP_HOT_BLOCKING Columns that block updates from being HOT + * INDEX_ATTR_BITMAP_SUMMARIZED Columns included in summarizing indexes * * Attribute numbers are offset by FirstLowInvalidHeapAttributeNumber so that * we can include system attributes (e.g., OID) in the bitmap representation. * + * Deferred indexes are considered for the primary key, but not for replica + * identity. + * * Caller had better hold at least RowExclusiveLock on the target relation * to ensure it is safe (deadlock-free) for us to take locks on the relation's * indexes. Note that since the introduction of CREATE INDEX CONCURRENTLY, @@ -5792,35 +5872,6 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) MemoryContextSwitchTo(oldcxt); } -/* - * RelationGetIndexRawAttOptions -- get AM/opclass-specific options for the index - */ -Datum * -RelationGetIndexRawAttOptions(Relation indexrel) -{ - Oid indexrelid = RelationGetRelid(indexrel); - int16 natts = RelationGetNumberOfAttributes(indexrel); - Datum *options = NULL; - int16 attnum; - - for (attnum = 1; attnum <= natts; attnum++) - { - if (indexrel->rd_indam->amoptsprocnum == 0) - continue; - - if (!OidIsValid(index_getprocid(indexrel, attnum, - indexrel->rd_indam->amoptsprocnum))) - continue; - - if (!options) - options = palloc0(sizeof(Datum) * natts); - - options[attnum - 1] = get_attoptions(indexrelid, attnum); - } - - return options; -} - static bytea ** CopyIndexAttOptions(bytea **srcopts, int natts) { @@ -6497,7 +6548,9 @@ write_relcache_init_file(bool shared) */ magic = RELCACHE_INIT_FILEMAGIC; if (fwrite(&magic, 1, sizeof(magic), fp) != sizeof(magic)) - elog(FATAL, "could not write init file"); + ereport(FATAL, + errcode_for_file_access(), + errmsg_internal("could not write init file: %m")); /* * Write all the appropriate reldescs (in no particular order). @@ -6598,7 +6651,9 @@ write_relcache_init_file(bool shared) } if (FreeFile(fp)) - elog(FATAL, "could not write init file"); + ereport(FATAL, + errcode_for_file_access(), + errmsg_internal("could not write init file: %m")); /* * Now we have to check whether the data we've so painstakingly @@ -6648,9 +6703,13 @@ static void write_item(const void *data, Size len, FILE *fp) { if (fwrite(&len, 1, sizeof(len), fp) != sizeof(len)) - elog(FATAL, "could not write init file"); + ereport(FATAL, + errcode_for_file_access(), + errmsg_internal("could not write init file: %m")); if (len > 0 && fwrite(data, 1, len, fp) != len) - elog(FATAL, "could not write init file"); + ereport(FATAL, + errcode_for_file_access(), + errmsg_internal("could not write init file: %m")); } /* @@ -6813,3 +6872,30 @@ unlink_initfile(const char *initfilename, int elevel) initfilename))); } } + +/* + * ResourceOwner callbacks + */ +static char * +ResOwnerPrintRelCache(Datum res) +{ + Relation rel = (Relation) DatumGetPointer(res); + + return psprintf("relation \"%s\"", RelationGetRelationName(rel)); +} + +static void +ResOwnerReleaseRelation(Datum res) +{ + Relation rel = (Relation) DatumGetPointer(res); + + /* + * This reference has already been removed from the resource owner, so + * just decrement reference count without calling + * ResourceOwnerForgetRelationRef. + */ + Assert(rel->rd_refcnt > 0); + rel->rd_refcnt -= 1; + + RelationCloseCleanup((Relation) res); +} diff --git a/src/backend/utils/cache/relfilenumbermap.c b/src/backend/utils/cache/relfilenumbermap.c index 220f33d43f5ab..9e76f74529713 100644 --- a/src/backend/utils/cache/relfilenumbermap.c +++ b/src/backend/utils/cache/relfilenumbermap.c @@ -3,7 +3,7 @@ * relfilenumbermap.c * relfilenumber to oid mapping cache. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -19,12 +19,10 @@ #include "catalog/pg_class.h" #include "catalog/pg_tablespace.h" #include "miscadmin.h" -#include "utils/builtins.h" #include "utils/catcache.h" #include "utils/fmgroids.h" #include "utils/hsearch.h" #include "utils/inval.h" -#include "utils/rel.h" #include "utils/relfilenumbermap.h" #include "utils/relmapper.h" diff --git a/src/backend/utils/cache/relmapper.c b/src/backend/utils/cache/relmapper.c index 26575cae6c9b3..48d344ae3ff82 100644 --- a/src/backend/utils/cache/relmapper.c +++ b/src/backend/utils/cache/relmapper.c @@ -28,7 +28,7 @@ * all these files commit in a single map file update rather than being tied * to transaction commit. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -46,7 +46,6 @@ #include "access/xact.h" #include "access/xlog.h" #include "access/xloginsert.h" -#include "catalog/catalog.h" #include "catalog/pg_tablespace.h" #include "catalog/storage.h" #include "miscadmin.h" @@ -303,14 +302,15 @@ RelationMapCopy(Oid dbid, Oid tsid, char *srcdbpath, char *dstdbpath) * Write the same data into the destination database's relmap file. * * No sinval is needed because no one can be connected to the destination - * database yet. For the same reason, there is no need to acquire - * RelationMappingLock. + * database yet. * * There's no point in trying to preserve files here. The new database * isn't usable yet anyway, and won't ever be if we can't install a relmap * file. */ + LWLockAcquire(RelationMappingLock, LW_EXCLUSIVE); write_relmap_file(&map, true, false, false, dbid, tsid, dstdbpath); + LWLockRelease(RelationMappingLock); } /* @@ -633,10 +633,12 @@ RelationMapFinishBootstrap(void) Assert(pending_local_updates.num_mappings == 0); /* Write the files; no WAL or sinval needed */ + LWLockAcquire(RelationMappingLock, LW_EXCLUSIVE); write_relmap_file(&shared_map, false, false, false, InvalidOid, GLOBALTABLESPACE_OID, "global"); write_relmap_file(&local_map, false, false, false, MyDatabaseId, MyDatabaseTableSpace, DatabasePath); + LWLockRelease(RelationMappingLock); } /* @@ -891,6 +893,15 @@ write_relmap_file(RelMapFile *newmap, bool write_wal, bool send_sinval, char mapfilename[MAXPGPATH]; char maptempfilename[MAXPGPATH]; + /* + * Even without concurrent use of this map, CheckPointRelationMap() relies + * on this locking. Without it, a restore of a base backup taken after + * this function's XLogInsert() and before its durable_rename() would not + * have the changes. wal_level=minimal doesn't need the lock, but this + * isn't performance-critical enough for such a micro-optimization. + */ + Assert(LWLockHeldByMeInMode(RelationMappingLock, LW_EXCLUSIVE)); + /* * Fill in the overhead fields and update CRC. */ diff --git a/src/backend/utils/cache/spccache.c b/src/backend/utils/cache/spccache.c index 136fd737d3757..ec63cdc8e52a6 100644 --- a/src/backend/utils/cache/spccache.c +++ b/src/backend/utils/cache/spccache.c @@ -8,7 +8,7 @@ * be a measurable performance gain from doing this, but that might change * in the future as we add more options. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c index 4e4a34bde8003..88c47a9996505 100644 --- a/src/backend/utils/cache/syscache.c +++ b/src/backend/utils/cache/syscache.c @@ -3,7 +3,7 @@ * syscache.c * System cache management routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -21,62 +21,19 @@ #include "postgres.h" #include "access/htup_details.h" -#include "access/sysattr.h" -#include "catalog/pg_aggregate.h" -#include "catalog/pg_am.h" -#include "catalog/pg_amop.h" -#include "catalog/pg_amproc.h" -#include "catalog/pg_auth_members.h" -#include "catalog/pg_authid.h" -#include "catalog/pg_cast.h" -#include "catalog/pg_collation.h" -#include "catalog/pg_constraint.h" -#include "catalog/pg_conversion.h" -#include "catalog/pg_database.h" -#include "catalog/pg_db_role_setting.h" -#include "catalog/pg_default_acl.h" -#include "catalog/pg_depend.h" -#include "catalog/pg_description.h" -#include "catalog/pg_enum.h" -#include "catalog/pg_event_trigger.h" -#include "catalog/pg_foreign_data_wrapper.h" -#include "catalog/pg_foreign_server.h" -#include "catalog/pg_foreign_table.h" -#include "catalog/pg_language.h" -#include "catalog/pg_namespace.h" -#include "catalog/pg_opclass.h" -#include "catalog/pg_operator.h" -#include "catalog/pg_opfamily.h" -#include "catalog/pg_parameter_acl.h" -#include "catalog/pg_partitioned_table.h" -#include "catalog/pg_proc.h" -#include "catalog/pg_publication.h" -#include "catalog/pg_publication_namespace.h" -#include "catalog/pg_publication_rel.h" -#include "catalog/pg_range.h" -#include "catalog/pg_replication_origin.h" -#include "catalog/pg_rewrite.h" -#include "catalog/pg_seclabel.h" -#include "catalog/pg_sequence.h" -#include "catalog/pg_shdepend.h" -#include "catalog/pg_shdescription.h" -#include "catalog/pg_shseclabel.h" -#include "catalog/pg_statistic.h" -#include "catalog/pg_statistic_ext.h" -#include "catalog/pg_statistic_ext_data.h" -#include "catalog/pg_subscription.h" -#include "catalog/pg_subscription_rel.h" -#include "catalog/pg_tablespace.h" -#include "catalog/pg_transform.h" -#include "catalog/pg_ts_config.h" -#include "catalog/pg_ts_config_map.h" -#include "catalog/pg_ts_dict.h" -#include "catalog/pg_ts_parser.h" -#include "catalog/pg_ts_template.h" -#include "catalog/pg_type.h" -#include "catalog/pg_user_mapping.h" +#include "catalog/pg_db_role_setting_d.h" +#include "catalog/pg_depend_d.h" +#include "catalog/pg_description_d.h" +#include "catalog/pg_seclabel_d.h" +#include "catalog/pg_shdepend_d.h" +#include "catalog/pg_shdescription_d.h" +#include "catalog/pg_shseclabel_d.h" +#include "common/int.h" #include "lib/qunique.h" +#include "miscadmin.h" +#include "storage/lmgr.h" #include "utils/catcache.h" +#include "utils/inval.h" #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/syscache.h" @@ -85,18 +42,6 @@ Adding system caches: - Add your new cache to the list in include/utils/syscache.h. - Keep the list sorted alphabetically. - - Add your entry to the cacheinfo[] array below. All cache lists are - alphabetical, so add it in the proper place. Specify the relation OID, - index OID, number of keys, key attribute numbers, and initial number of - hash buckets. - - The number of hash buckets must be a power of 2. It's reasonable to - set this to the number of entries that might be in the particular cache - in a medium-size database. - There must be a unique index underlying each syscache (ie, an index whose key is the same as that of the cache). If there is not one already, add the definition for it to include/catalog/pg_*.h using @@ -104,6 +49,13 @@ (Adding an index requires a catversion.h update, while simply adding/deleting caches only requires a recompile.) + Add a MAKE_SYSCACHE call to the same pg_*.h file specifying the name of + your cache, the underlying index, and the initial number of hash buckets. + + The number of hash buckets must be a power of 2. It's reasonable to + set this to the number of entries that might be in the particular cache + in a medium-size database. + Finally, any place your relation gets heap_insert() or heap_update() calls, use CatalogTupleInsert() or CatalogTupleUpdate() instead, which also update indexes. The heap_* calls do not do that. @@ -126,558 +78,7 @@ struct cachedesc /* Macro to provide nkeys and key array with convenient syntax. */ #define KEY(...) VA_ARGS_NARGS(__VA_ARGS__), { __VA_ARGS__ } -static const struct cachedesc cacheinfo[] = { - [AGGFNOID] = { - AggregateRelationId, - AggregateFnoidIndexId, - KEY(Anum_pg_aggregate_aggfnoid), - 16 - }, - [AMNAME] = { - AccessMethodRelationId, - AmNameIndexId, - KEY(Anum_pg_am_amname), - 4 - }, - [AMOID] = { - AccessMethodRelationId, - AmOidIndexId, - KEY(Anum_pg_am_oid), - 4 - }, - [AMOPOPID] = { - AccessMethodOperatorRelationId, - AccessMethodOperatorIndexId, - KEY(Anum_pg_amop_amopopr, - Anum_pg_amop_amoppurpose, - Anum_pg_amop_amopfamily), - 64 - }, - [AMOPSTRATEGY] = { - AccessMethodOperatorRelationId, - AccessMethodStrategyIndexId, - KEY(Anum_pg_amop_amopfamily, - Anum_pg_amop_amoplefttype, - Anum_pg_amop_amoprighttype, - Anum_pg_amop_amopstrategy), - 64 - }, - [AMPROCNUM] = { - AccessMethodProcedureRelationId, - AccessMethodProcedureIndexId, - KEY(Anum_pg_amproc_amprocfamily, - Anum_pg_amproc_amproclefttype, - Anum_pg_amproc_amprocrighttype, - Anum_pg_amproc_amprocnum), - 16 - }, - [ATTNAME] = { - AttributeRelationId, - AttributeRelidNameIndexId, - KEY(Anum_pg_attribute_attrelid, - Anum_pg_attribute_attname), - 32 - }, - [ATTNUM] = { - AttributeRelationId, - AttributeRelidNumIndexId, - KEY(Anum_pg_attribute_attrelid, - Anum_pg_attribute_attnum), - 128 - }, - [AUTHMEMMEMROLE] = { - AuthMemRelationId, - AuthMemMemRoleIndexId, - KEY(Anum_pg_auth_members_member, - Anum_pg_auth_members_roleid, - Anum_pg_auth_members_grantor), - 8 - }, - [AUTHMEMROLEMEM] = { - AuthMemRelationId, - AuthMemRoleMemIndexId, - KEY(Anum_pg_auth_members_roleid, - Anum_pg_auth_members_member, - Anum_pg_auth_members_grantor), - 8 - }, - [AUTHNAME] = { - AuthIdRelationId, - AuthIdRolnameIndexId, - KEY(Anum_pg_authid_rolname), - 8 - }, - [AUTHOID] = { - AuthIdRelationId, - AuthIdOidIndexId, - KEY(Anum_pg_authid_oid), - 8 - }, - [CASTSOURCETARGET] = { - CastRelationId, - CastSourceTargetIndexId, - KEY(Anum_pg_cast_castsource, - Anum_pg_cast_casttarget), - 256 - }, - [CLAAMNAMENSP] = { - OperatorClassRelationId, - OpclassAmNameNspIndexId, - KEY(Anum_pg_opclass_opcmethod, - Anum_pg_opclass_opcname, - Anum_pg_opclass_opcnamespace), - 8 - }, - [CLAOID] = { - OperatorClassRelationId, - OpclassOidIndexId, - KEY(Anum_pg_opclass_oid), - 8 - }, - [COLLNAMEENCNSP] = { - CollationRelationId, - CollationNameEncNspIndexId, - KEY(Anum_pg_collation_collname, - Anum_pg_collation_collencoding, - Anum_pg_collation_collnamespace), - 8 - }, - [COLLOID] = { - CollationRelationId, - CollationOidIndexId, - KEY(Anum_pg_collation_oid), - 8 - }, - [CONDEFAULT] = { - ConversionRelationId, - ConversionDefaultIndexId, - KEY(Anum_pg_conversion_connamespace, - Anum_pg_conversion_conforencoding, - Anum_pg_conversion_contoencoding, - Anum_pg_conversion_oid), - 8 - }, - [CONNAMENSP] = { - ConversionRelationId, - ConversionNameNspIndexId, - KEY(Anum_pg_conversion_conname, - Anum_pg_conversion_connamespace), - 8 - }, - [CONSTROID] = { - ConstraintRelationId, - ConstraintOidIndexId, - KEY(Anum_pg_constraint_oid), - 16 - }, - [CONVOID] = { - ConversionRelationId, - ConversionOidIndexId, - KEY(Anum_pg_conversion_oid), - 8 - }, - [DATABASEOID] = { - DatabaseRelationId, - DatabaseOidIndexId, - KEY(Anum_pg_database_oid), - 4 - }, - [DEFACLROLENSPOBJ] = { - DefaultAclRelationId, - DefaultAclRoleNspObjIndexId, - KEY(Anum_pg_default_acl_defaclrole, - Anum_pg_default_acl_defaclnamespace, - Anum_pg_default_acl_defaclobjtype), - 8 - }, - [ENUMOID] = { - EnumRelationId, - EnumOidIndexId, - KEY(Anum_pg_enum_oid), - 8 - }, - [ENUMTYPOIDNAME] = { - EnumRelationId, - EnumTypIdLabelIndexId, - KEY(Anum_pg_enum_enumtypid, - Anum_pg_enum_enumlabel), - 8 - }, - [EVENTTRIGGERNAME] = { - EventTriggerRelationId, - EventTriggerNameIndexId, - KEY(Anum_pg_event_trigger_evtname), - 8 - }, - [EVENTTRIGGEROID] = { - EventTriggerRelationId, - EventTriggerOidIndexId, - KEY(Anum_pg_event_trigger_oid), - 8 - }, - [FOREIGNDATAWRAPPERNAME] = { - ForeignDataWrapperRelationId, - ForeignDataWrapperNameIndexId, - KEY(Anum_pg_foreign_data_wrapper_fdwname), - 2 - }, - [FOREIGNDATAWRAPPEROID] = { - ForeignDataWrapperRelationId, - ForeignDataWrapperOidIndexId, - KEY(Anum_pg_foreign_data_wrapper_oid), - 2 - }, - [FOREIGNSERVERNAME] = { - ForeignServerRelationId, - ForeignServerNameIndexId, - KEY(Anum_pg_foreign_server_srvname), - 2 - }, - [FOREIGNSERVEROID] = { - ForeignServerRelationId, - ForeignServerOidIndexId, - KEY(Anum_pg_foreign_server_oid), - 2 - }, - [FOREIGNTABLEREL] = { - ForeignTableRelationId, - ForeignTableRelidIndexId, - KEY(Anum_pg_foreign_table_ftrelid), - 4 - }, - [INDEXRELID] = { - IndexRelationId, - IndexRelidIndexId, - KEY(Anum_pg_index_indexrelid), - 64 - }, - [LANGNAME] = { - LanguageRelationId, - LanguageNameIndexId, - KEY(Anum_pg_language_lanname), - 4 - }, - [LANGOID] = { - LanguageRelationId, - LanguageOidIndexId, - KEY(Anum_pg_language_oid), - 4 - }, - [NAMESPACENAME] = { - NamespaceRelationId, - NamespaceNameIndexId, - KEY(Anum_pg_namespace_nspname), - 4 - }, - [NAMESPACEOID] = { - NamespaceRelationId, - NamespaceOidIndexId, - KEY(Anum_pg_namespace_oid), - 16 - }, - [OPERNAMENSP] = { - OperatorRelationId, - OperatorNameNspIndexId, - KEY(Anum_pg_operator_oprname, - Anum_pg_operator_oprleft, - Anum_pg_operator_oprright, - Anum_pg_operator_oprnamespace), - 256 - }, - [OPEROID] = { - OperatorRelationId, - OperatorOidIndexId, - KEY(Anum_pg_operator_oid), - 32 - }, - [OPFAMILYAMNAMENSP] = { - OperatorFamilyRelationId, - OpfamilyAmNameNspIndexId, - KEY(Anum_pg_opfamily_opfmethod, - Anum_pg_opfamily_opfname, - Anum_pg_opfamily_opfnamespace), - 8 - }, - [OPFAMILYOID] = { - OperatorFamilyRelationId, - OpfamilyOidIndexId, - KEY(Anum_pg_opfamily_oid), - 8 - }, - [PARAMETERACLNAME] = { - ParameterAclRelationId, - ParameterAclParnameIndexId, - KEY(Anum_pg_parameter_acl_parname), - 4 - }, - [PARAMETERACLOID] = { - ParameterAclRelationId, - ParameterAclOidIndexId, - KEY(Anum_pg_parameter_acl_oid), - 4 - }, - [PARTRELID] = { - PartitionedRelationId, - PartitionedRelidIndexId, - KEY(Anum_pg_partitioned_table_partrelid), - 32 - }, - [PROCNAMEARGSNSP] = { - ProcedureRelationId, - ProcedureNameArgsNspIndexId, - KEY(Anum_pg_proc_proname, - Anum_pg_proc_proargtypes, - Anum_pg_proc_pronamespace), - 128 - }, - [PROCOID] = { - ProcedureRelationId, - ProcedureOidIndexId, - KEY(Anum_pg_proc_oid), - 128 - }, - [PUBLICATIONNAME] = { - PublicationRelationId, - PublicationNameIndexId, - KEY(Anum_pg_publication_pubname), - 8 - }, - [PUBLICATIONNAMESPACE] = { - PublicationNamespaceRelationId, - PublicationNamespaceObjectIndexId, - KEY(Anum_pg_publication_namespace_oid), - 64 - }, - [PUBLICATIONNAMESPACEMAP] = { - PublicationNamespaceRelationId, - PublicationNamespacePnnspidPnpubidIndexId, - KEY(Anum_pg_publication_namespace_pnnspid, - Anum_pg_publication_namespace_pnpubid), - 64 - }, - [PUBLICATIONOID] = { - PublicationRelationId, - PublicationObjectIndexId, - KEY(Anum_pg_publication_oid), - 8 - }, - [PUBLICATIONREL] = { - PublicationRelRelationId, - PublicationRelObjectIndexId, - KEY(Anum_pg_publication_rel_oid), - 64 - }, - [PUBLICATIONRELMAP] = { - PublicationRelRelationId, - PublicationRelPrrelidPrpubidIndexId, - KEY(Anum_pg_publication_rel_prrelid, - Anum_pg_publication_rel_prpubid), - 64 - }, - [RANGEMULTIRANGE] = { - RangeRelationId, - RangeMultirangeTypidIndexId, - KEY(Anum_pg_range_rngmultitypid), - 4 - }, - [RANGETYPE] = { - RangeRelationId, - RangeTypidIndexId, - KEY(Anum_pg_range_rngtypid), - 4 - }, - [RELNAMENSP] = { - RelationRelationId, - ClassNameNspIndexId, - KEY(Anum_pg_class_relname, - Anum_pg_class_relnamespace), - 128 - }, - [RELOID] = { - RelationRelationId, - ClassOidIndexId, - KEY(Anum_pg_class_oid), - 128 - }, - [REPLORIGIDENT] = { - ReplicationOriginRelationId, - ReplicationOriginIdentIndex, - KEY(Anum_pg_replication_origin_roident), - 16 - }, - [REPLORIGNAME] = { - ReplicationOriginRelationId, - ReplicationOriginNameIndex, - KEY(Anum_pg_replication_origin_roname), - 16 - }, - [RULERELNAME] = { - RewriteRelationId, - RewriteRelRulenameIndexId, - KEY(Anum_pg_rewrite_ev_class, - Anum_pg_rewrite_rulename), - 8 - }, - [SEQRELID] = { - SequenceRelationId, - SequenceRelidIndexId, - KEY(Anum_pg_sequence_seqrelid), - 32 - }, - [STATEXTDATASTXOID] = { - StatisticExtDataRelationId, - StatisticExtDataStxoidInhIndexId, - KEY(Anum_pg_statistic_ext_data_stxoid, - Anum_pg_statistic_ext_data_stxdinherit), - 4 - }, - [STATEXTNAMENSP] = { - StatisticExtRelationId, - StatisticExtNameIndexId, - KEY(Anum_pg_statistic_ext_stxname, - Anum_pg_statistic_ext_stxnamespace), - 4 - }, - [STATEXTOID] = { - StatisticExtRelationId, - StatisticExtOidIndexId, - KEY(Anum_pg_statistic_ext_oid), - 4 - }, - [STATRELATTINH] = { - StatisticRelationId, - StatisticRelidAttnumInhIndexId, - KEY(Anum_pg_statistic_starelid, - Anum_pg_statistic_staattnum, - Anum_pg_statistic_stainherit), - 128 - }, - [SUBSCRIPTIONNAME] = { - SubscriptionRelationId, - SubscriptionNameIndexId, - KEY(Anum_pg_subscription_subdbid, - Anum_pg_subscription_subname), - 4 - }, - [SUBSCRIPTIONOID] = { - SubscriptionRelationId, - SubscriptionObjectIndexId, - KEY(Anum_pg_subscription_oid), - 4 - }, - [SUBSCRIPTIONRELMAP] = { - SubscriptionRelRelationId, - SubscriptionRelSrrelidSrsubidIndexId, - KEY(Anum_pg_subscription_rel_srrelid, - Anum_pg_subscription_rel_srsubid), - 64 - }, - [TABLESPACEOID] = { - TableSpaceRelationId, - TablespaceOidIndexId, - KEY(Anum_pg_tablespace_oid), - 4 - }, - [TRFOID] = { - TransformRelationId, - TransformOidIndexId, - KEY(Anum_pg_transform_oid), - 16 - }, - [TRFTYPELANG] = { - TransformRelationId, - TransformTypeLangIndexId, - KEY(Anum_pg_transform_trftype, - Anum_pg_transform_trflang), - 16 - }, - [TSCONFIGMAP] = { - TSConfigMapRelationId, - TSConfigMapIndexId, - KEY(Anum_pg_ts_config_map_mapcfg, - Anum_pg_ts_config_map_maptokentype, - Anum_pg_ts_config_map_mapseqno), - 2 - }, - [TSCONFIGNAMENSP] = { - TSConfigRelationId, - TSConfigNameNspIndexId, - KEY(Anum_pg_ts_config_cfgname, - Anum_pg_ts_config_cfgnamespace), - 2 - }, - [TSCONFIGOID] = { - TSConfigRelationId, - TSConfigOidIndexId, - KEY(Anum_pg_ts_config_oid), - 2 - }, - [TSDICTNAMENSP] = { - TSDictionaryRelationId, - TSDictionaryNameNspIndexId, - KEY(Anum_pg_ts_dict_dictname, - Anum_pg_ts_dict_dictnamespace), - 2 - }, - [TSDICTOID] = { - TSDictionaryRelationId, - TSDictionaryOidIndexId, - KEY(Anum_pg_ts_dict_oid), - 2 - }, - [TSPARSERNAMENSP] = { - TSParserRelationId, - TSParserNameNspIndexId, - KEY(Anum_pg_ts_parser_prsname, - Anum_pg_ts_parser_prsnamespace), - 2 - }, - [TSPARSEROID] = { - TSParserRelationId, - TSParserOidIndexId, - KEY(Anum_pg_ts_parser_oid), - 2 - }, - [TSTEMPLATENAMENSP] = { - TSTemplateRelationId, - TSTemplateNameNspIndexId, - KEY(Anum_pg_ts_template_tmplname, - Anum_pg_ts_template_tmplnamespace), - 2 - }, - [TSTEMPLATEOID] = { - TSTemplateRelationId, - TSTemplateOidIndexId, - KEY(Anum_pg_ts_template_oid), - 2 - }, - [TYPENAMENSP] = { - TypeRelationId, - TypeNameNspIndexId, - KEY(Anum_pg_type_typname, - Anum_pg_type_typnamespace), - 64 - }, - [TYPEOID] = { - TypeRelationId, - TypeOidIndexId, - KEY(Anum_pg_type_oid), - 64 - }, - [USERMAPPINGOID] = { - UserMappingRelationId, - UserMappingOidIndexId, - KEY(Anum_pg_user_mapping_oid), - 2 - }, - [USERMAPPINGUSERSERVER] = { - UserMappingRelationId, - UserMappingUserServerIndexId, - KEY(Anum_pg_user_mapping_umuser, - Anum_pg_user_mapping_umserver), - 2 - } -}; +#include "catalog/syscache_info.h" StaticAssertDecl(lengthof(cacheinfo) == SysCacheSize, "SysCacheSize does not match syscache.c's array"); @@ -720,7 +121,9 @@ InitCatalogCache(void) * Assert that every enumeration value defined in syscache.h has been * populated in the cacheinfo array. */ - Assert(cacheinfo[cacheId].reloid != 0); + Assert(OidIsValid(cacheinfo[cacheId].reloid)); + Assert(OidIsValid(cacheinfo[cacheId].indoid)); + /* .nbuckets and .key[] are checked by InitCatCache() */ SysCache[cacheId] = InitCatCache(cacheId, cacheinfo[cacheId].reloid, @@ -746,14 +149,14 @@ InitCatalogCache(void) Assert(SysCacheSupportingRelOidSize <= lengthof(SysCacheSupportingRelOid)); /* Sort and de-dup OID arrays, so we can use binary search. */ - pg_qsort(SysCacheRelationOid, SysCacheRelationOidSize, - sizeof(Oid), oid_compare); + qsort(SysCacheRelationOid, SysCacheRelationOidSize, + sizeof(Oid), oid_compare); SysCacheRelationOidSize = qunique(SysCacheRelationOid, SysCacheRelationOidSize, sizeof(Oid), oid_compare); - pg_qsort(SysCacheSupportingRelOid, SysCacheSupportingRelOidSize, - sizeof(Oid), oid_compare); + qsort(SysCacheSupportingRelOid, SysCacheSupportingRelOidSize, + sizeof(Oid), oid_compare); SysCacheSupportingRelOidSize = qunique(SysCacheSupportingRelOid, SysCacheSupportingRelOidSize, sizeof(Oid), oid_compare); @@ -868,6 +271,103 @@ ReleaseSysCache(HeapTuple tuple) ReleaseCatCache(tuple); } +/* + * SearchSysCacheLocked1 + * + * Combine SearchSysCache1() with acquiring a LOCKTAG_TUPLE at mode + * InplaceUpdateTupleLock. This is a tool for complying with the + * README.tuplock section "Locking to write inplace-updated tables". After + * the caller's heap_update(), it should UnlockTuple(InplaceUpdateTupleLock) + * and ReleaseSysCache(). + * + * The returned tuple may be the subject of an uncommitted update, so this + * doesn't prevent the "tuple concurrently updated" error. + */ +HeapTuple +SearchSysCacheLocked1(int cacheId, + Datum key1) +{ + CatCache *cache = SysCache[cacheId]; + ItemPointerData tid; + LOCKTAG tag; + + /*---------- + * Since inplace updates may happen just before our LockTuple(), we must + * return content acquired after LockTuple() of the TID we return. If we + * just fetched twice instead of looping, the following sequence would + * defeat our locking: + * + * GRANT: SearchSysCache1() = TID (1,5) + * GRANT: LockTuple(pg_class, (1,5)) + * [no more inplace update of (1,5) until we release the lock] + * CLUSTER: SearchSysCache1() = TID (1,5) + * CLUSTER: heap_update() = TID (1,8) + * CLUSTER: COMMIT + * GRANT: SearchSysCache1() = TID (1,8) + * GRANT: return (1,8) from SearchSysCacheLocked1() + * VACUUM: SearchSysCache1() = TID (1,8) + * VACUUM: LockTuple(pg_class, (1,8)) # two TIDs now locked for one rel + * VACUUM: inplace update + * GRANT: heap_update() = (1,9) # lose inplace update + * + * In the happy case, this takes two fetches, one to determine the TID to + * lock and another to get the content and confirm the TID didn't change. + * + * This is valid even if the row gets updated to a new TID, the old TID + * becomes LP_UNUSED, and the row gets updated back to its old TID. We'd + * still hold the right LOCKTAG_TUPLE and a copy of the row captured after + * the LOCKTAG_TUPLE. + */ + ItemPointerSetInvalid(&tid); + for (;;) + { + HeapTuple tuple; + LOCKMODE lockmode = InplaceUpdateTupleLock; + + tuple = SearchSysCache1(cacheId, key1); + if (ItemPointerIsValid(&tid)) + { + if (!HeapTupleIsValid(tuple)) + { + LockRelease(&tag, lockmode, false); + return tuple; + } + if (ItemPointerEquals(&tid, &tuple->t_self)) + return tuple; + LockRelease(&tag, lockmode, false); + } + else if (!HeapTupleIsValid(tuple)) + return tuple; + + tid = tuple->t_self; + ReleaseSysCache(tuple); + + /* + * Do like LockTuple(rel, &tid, lockmode). While cc_relisshared won't + * change from one iteration to another, it may have been a temporary + * "false" until our first SearchSysCache1(). + */ + SET_LOCKTAG_TUPLE(tag, + cache->cc_relisshared ? InvalidOid : MyDatabaseId, + cache->cc_reloid, + ItemPointerGetBlockNumber(&tid), + ItemPointerGetOffsetNumber(&tid)); + (void) LockAcquire(&tag, lockmode, false, false); + + /* + * If an inplace update just finished, ensure we process the syscache + * inval. XXX this is insufficient: the inplace updater may not yet + * have reached AtEOXact_Inval(). See test at inplace-inval.spec. + * + * If a heap_update() call just released its LOCKTAG_TUPLE, we'll + * probably find the old tuple and reach "tuple concurrently updated". + * If that heap_update() aborts, our LOCKTAG_TUPLE blocks inplace + * updates while our caller works. + */ + AcceptInvalidationMessages(); + } +} + /* * SearchSysCacheCopy * @@ -894,6 +394,28 @@ SearchSysCacheCopy(int cacheId, return newtuple; } +/* + * SearchSysCacheLockedCopy1 + * + * Meld SearchSysCacheLockedCopy1 with SearchSysCacheCopy(). After the + * caller's heap_update(), it should UnlockTuple(InplaceUpdateTupleLock) and + * heap_freetuple(). + */ +HeapTuple +SearchSysCacheLockedCopy1(int cacheId, + Datum key1) +{ + HeapTuple tuple, + newtuple; + + tuple = SearchSysCacheLocked1(cacheId, key1); + if (!HeapTupleIsValid(tuple)) + return tuple; + newtuple = heap_copytuple(tuple); + ReleaseSysCache(tuple); + return newtuple; +} + /* * SearchSysCacheExists * @@ -1268,7 +790,7 @@ RelationSupportsSysCache(Oid relid) /* - * OID comparator for pg_qsort + * OID comparator for qsort */ static int oid_compare(const void *a, const void *b) @@ -1276,7 +798,5 @@ oid_compare(const void *a, const void *b) Oid oa = *((const Oid *) a); Oid ob = *((const Oid *) b); - if (oa == ob) - return 0; - return (oa > ob) ? 1 : -1; + return pg_cmp_u32(oa, ob); } diff --git a/src/backend/utils/cache/ts_cache.c b/src/backend/utils/cache/ts_cache.c index 7760ad764ea54..54de33eadd27f 100644 --- a/src/backend/utils/cache/ts_cache.c +++ b/src/backend/utils/cache/ts_cache.c @@ -17,7 +17,7 @@ * any database access. * * - * Copyright (c) 2006-2023, PostgreSQL Global Development Group + * Copyright (c) 2006-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/cache/ts_cache.c diff --git a/src/backend/utils/cache/typcache.c b/src/backend/utils/cache/typcache.c index ed6360ce2b94d..aa4720cb5985c 100644 --- a/src/backend/utils/cache/typcache.c +++ b/src/backend/utils/cache/typcache.c @@ -31,7 +31,7 @@ * constraint changes are also tracked properly. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -57,6 +57,7 @@ #include "catalog/pg_range.h" #include "catalog/pg_type.h" #include "commands/defrem.h" +#include "common/int.h" #include "executor/executor.h" #include "lib/dshash.h" #include "optimizer/optimizer.h" @@ -69,7 +70,6 @@ #include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/rel.h" -#include "utils/snapmgr.h" #include "utils/syscache.h" #include "utils/typcache.h" @@ -147,7 +147,7 @@ typedef struct TypeCacheEnumData * We use a separate table for storing the definitions of non-anonymous * record types. Once defined, a record type will be remembered for the * life of the backend. Subsequent uses of the "same" record type (where - * sameness means equalTupleDescs) will refer to the existing table entry. + * sameness means equalRowTypes) will refer to the existing table entry. * * Stored record types are remembered in a linear array of TupleDescs, * which can be indexed quickly with the assigned typmod. There is also @@ -231,7 +231,7 @@ shared_record_table_compare(const void *a, const void *b, size_t size, else t2 = k2->u.local_tupdesc; - return equalTupleDescs(t1, t2) ? 0 : 1; + return equalRowTypes(t1, t2) ? 0 : 1; } /* @@ -249,7 +249,7 @@ shared_record_table_hash(const void *a, size_t size, void *arg) else t = k->u.local_tupdesc; - return hashTupleDesc(t); + return hashRowType(t); } /* Parameters for SharedRecordTypmodRegistry's TupleDesc table. */ @@ -258,6 +258,7 @@ static const dshash_parameters srtr_record_table_params = { sizeof(SharedRecordTableEntry), shared_record_table_compare, shared_record_table_hash, + dshash_memcpy, LWTRANCHE_PER_SESSION_RECORD_TYPE }; @@ -267,16 +268,22 @@ static const dshash_parameters srtr_typmod_table_params = { sizeof(SharedTypmodTableEntry), dshash_memcmp, dshash_memhash, + dshash_memcpy, LWTRANCHE_PER_SESSION_RECORD_TYPMOD }; /* hashtable for recognizing registered record types */ static HTAB *RecordCacheHash = NULL; -/* arrays of info about registered record types, indexed by assigned typmod */ -static TupleDesc *RecordCacheArray = NULL; -static uint64 *RecordIdentifierArray = NULL; -static int32 RecordCacheArrayLen = 0; /* allocated length of above arrays */ +typedef struct RecordCacheArrayEntry +{ + uint64 id; + TupleDesc tupdesc; +} RecordCacheArrayEntry; + +/* array of info about registered record types, indexed by assigned typmod */ +static RecordCacheArrayEntry *RecordCacheArray = NULL; +static int32 RecordCacheArrayLen = 0; /* allocated length of above array */ static int32 NextRecordTypmod = 0; /* number of entries used */ /* @@ -935,6 +942,7 @@ load_rangetype_info(TypeCacheEntry *typentry) /* get opclass properties and look up the comparison function */ opfamilyOid = get_opclass_family(opclassOid); opcintype = get_opclass_input_type(opclassOid); + typentry->rng_opfamily = opfamilyOid; cmpFnOid = get_opfamily_proc(opfamilyOid, opcintype, opcintype, BTORDER_PROC); @@ -1063,7 +1071,7 @@ load_domaintype_info(TypeCacheEntry *typentry) Expr *check_expr; DomainConstraintState *r; - /* Ignore non-CHECK constraints (presently, shouldn't be any) */ + /* Ignore non-CHECK constraints */ if (c->contype != CONSTRAINT_CHECK) continue; @@ -1703,10 +1711,9 @@ ensure_record_cache_typmod_slot_exists(int32 typmod) { if (RecordCacheArray == NULL) { - RecordCacheArray = (TupleDesc *) - MemoryContextAllocZero(CacheMemoryContext, 64 * sizeof(TupleDesc)); - RecordIdentifierArray = (uint64 *) - MemoryContextAllocZero(CacheMemoryContext, 64 * sizeof(uint64)); + RecordCacheArray = (RecordCacheArrayEntry *) + MemoryContextAllocZero(CacheMemoryContext, + 64 * sizeof(RecordCacheArrayEntry)); RecordCacheArrayLen = 64; } @@ -1714,8 +1721,10 @@ ensure_record_cache_typmod_slot_exists(int32 typmod) { int32 newlen = pg_nextpower2_32(typmod + 1); - RecordCacheArray = repalloc0_array(RecordCacheArray, TupleDesc, RecordCacheArrayLen, newlen); - RecordIdentifierArray = repalloc0_array(RecordIdentifierArray, uint64, RecordCacheArrayLen, newlen); + RecordCacheArray = repalloc0_array(RecordCacheArray, + RecordCacheArrayEntry, + RecordCacheArrayLen, + newlen); RecordCacheArrayLen = newlen; } } @@ -1753,8 +1762,8 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError) { /* It is already in our local cache? */ if (typmod < RecordCacheArrayLen && - RecordCacheArray[typmod] != NULL) - return RecordCacheArray[typmod]; + RecordCacheArray[typmod].tupdesc != NULL) + return RecordCacheArray[typmod].tupdesc; /* Are we attached to a shared record typmod registry? */ if (CurrentSession->shared_typmod_registry != NULL) @@ -1780,19 +1789,19 @@ lookup_rowtype_tupdesc_internal(Oid type_id, int32 typmod, bool noError) * Our local array can now point directly to the TupleDesc * in shared memory, which is non-reference-counted. */ - RecordCacheArray[typmod] = tupdesc; + RecordCacheArray[typmod].tupdesc = tupdesc; Assert(tupdesc->tdrefcount == -1); /* * We don't share tupdesc identifiers across processes, so * assign one locally. */ - RecordIdentifierArray[typmod] = ++tupledesc_id_counter; + RecordCacheArray[typmod].id = ++tupledesc_id_counter; dshash_release_lock(CurrentSession->shared_typmod_table, entry); - return RecordCacheArray[typmod]; + return RecordCacheArray[typmod].tupdesc; } } } @@ -1918,7 +1927,7 @@ record_type_typmod_hash(const void *data, size_t size) { RecordCacheEntry *entry = (RecordCacheEntry *) data; - return hashTupleDesc(entry->tupdesc); + return hashRowType(entry->tupdesc); } /* @@ -1930,7 +1939,7 @@ record_type_typmod_compare(const void *a, const void *b, size_t size) RecordCacheEntry *left = (RecordCacheEntry *) a; RecordCacheEntry *right = (RecordCacheEntry *) b; - return equalTupleDescs(left->tupdesc, right->tupdesc) ? 0 : 1; + return equalRowTypes(left->tupdesc, right->tupdesc) ? 0 : 1; } /* @@ -2005,10 +2014,10 @@ assign_record_type_typmod(TupleDesc tupDesc) ensure_record_cache_typmod_slot_exists(entDesc->tdtypmod); } - RecordCacheArray[entDesc->tdtypmod] = entDesc; + RecordCacheArray[entDesc->tdtypmod].tupdesc = entDesc; /* Assign a unique tupdesc identifier, too. */ - RecordIdentifierArray[entDesc->tdtypmod] = ++tupledesc_id_counter; + RecordCacheArray[entDesc->tdtypmod].id = ++tupledesc_id_counter; /* Fully initialized; create the hash table entry */ recentry = (RecordCacheEntry *) hash_search(RecordCacheHash, @@ -2057,10 +2066,10 @@ assign_record_type_identifier(Oid type_id, int32 typmod) * It's a transient record type, so look in our record-type table. */ if (typmod >= 0 && typmod < RecordCacheArrayLen && - RecordCacheArray[typmod] != NULL) + RecordCacheArray[typmod].tupdesc != NULL) { - Assert(RecordIdentifierArray[typmod] != 0); - return RecordIdentifierArray[typmod]; + Assert(RecordCacheArray[typmod].id != 0); + return RecordCacheArray[typmod].id; } /* For anonymous or unrecognized record type, generate a new ID */ @@ -2140,7 +2149,7 @@ SharedRecordTypmodRegistryInit(SharedRecordTypmodRegistry *registry, TupleDesc tupdesc; bool found; - tupdesc = RecordCacheArray[typmod]; + tupdesc = RecordCacheArray[typmod].tupdesc; if (tupdesc == NULL) continue; @@ -2715,12 +2724,7 @@ enum_oid_cmp(const void *left, const void *right) const EnumItem *l = (const EnumItem *) left; const EnumItem *r = (const EnumItem *) right; - if (l->enum_oid < r->enum_oid) - return -1; - else if (l->enum_oid > r->enum_oid) - return 1; - else - return 0; + return pg_cmp_u32(l->enum_oid, r->enum_oid); } /* diff --git a/src/backend/utils/errcodes.txt b/src/backend/utils/errcodes.txt index 3d244af130a74..3250d539e1c46 100644 --- a/src/backend/utils/errcodes.txt +++ b/src/backend/utils/errcodes.txt @@ -2,7 +2,7 @@ # errcodes.txt # PostgreSQL error codes # -# Copyright (c) 2003-2023, PostgreSQL Global Development Group +# Copyright (c) 2003-2024, PostgreSQL Global Development Group # # This list serves as the basis for generating source files containing error # codes. It is kept in a common format to make sure all these source files have @@ -252,6 +252,7 @@ Section: Class 25 - Invalid Transaction State 25P01 E ERRCODE_NO_ACTIVE_SQL_TRANSACTION no_active_sql_transaction 25P02 E ERRCODE_IN_FAILED_SQL_TRANSACTION in_failed_sql_transaction 25P03 E ERRCODE_IDLE_IN_TRANSACTION_SESSION_TIMEOUT idle_in_transaction_session_timeout +25P04 E ERRCODE_TRANSACTION_TIMEOUT transaction_timeout Section: Class 26 - Invalid SQL Statement Name @@ -439,10 +440,6 @@ Section: Class 58 - System Error (errors external to PostgreSQL itself) 58P01 E ERRCODE_UNDEFINED_FILE undefined_file 58P02 E ERRCODE_DUPLICATE_FILE duplicate_file -Section: Class 72 - Snapshot Failure -# (class borrowed from Oracle) -72000 E ERRCODE_SNAPSHOT_TOO_OLD snapshot_too_old - Section: Class F0 - Configuration File Error # (PostgreSQL-specific error class) diff --git a/src/backend/utils/error/assert.c b/src/backend/utils/error/assert.c index 719dd7b309299..d312ba032e3a0 100644 --- a/src/backend/utils/error/assert.c +++ b/src/backend/utils/error/assert.c @@ -3,7 +3,7 @@ * assert.c * Assert support code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/utils/error/csvlog.c b/src/backend/utils/error/csvlog.c index 29c83a7ee4489..eab8df3fcc3ff 100644 --- a/src/backend/utils/error/csvlog.c +++ b/src/backend/utils/error/csvlog.c @@ -3,7 +3,7 @@ * csvlog.c * CSV logging * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -16,16 +16,14 @@ #include "postgres.h" #include "access/xact.h" -#include "libpq/libpq.h" #include "lib/stringinfo.h" +#include "libpq/libpq-be.h" #include "miscadmin.h" -#include "postmaster/bgworker.h" #include "postmaster/syslogger.h" #include "storage/lock.h" #include "storage/proc.h" #include "tcop/tcopprot.h" #include "utils/backend_status.h" -#include "utils/elog.h" #include "utils/guc.h" #include "utils/ps_status.h" @@ -122,7 +120,7 @@ write_csvlog(ErrorData *edata) appendStringInfoChar(&buf, ','); /* session id */ - appendStringInfo(&buf, "%lx.%x", (long) MyStartTime, MyProcPid); + appendStringInfo(&buf, "%" INT64_MODIFIER "x.%x", MyStartTime, MyProcPid); appendStringInfoChar(&buf, ','); /* Line number */ @@ -152,8 +150,8 @@ write_csvlog(ErrorData *edata) /* Virtual transaction id */ /* keep VXID format in sync with lockfuncs.c */ - if (MyProc != NULL && MyProc->backendId != InvalidBackendId) - appendStringInfo(&buf, "%d/%u", MyProc->backendId, MyProc->lxid); + if (MyProc != NULL && MyProc->vxid.procNumber != INVALID_PROC_NUMBER) + appendStringInfo(&buf, "%d/%u", MyProc->vxid.procNumber, MyProc->vxid.lxid); appendStringInfoChar(&buf, ','); /* Transaction id */ diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 5898100acb6be..948bec886a228 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -43,7 +43,7 @@ * overflow.) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -66,13 +66,12 @@ #include #endif -#include "access/transam.h" #include "access/xact.h" #include "libpq/libpq.h" #include "libpq/pqformat.h" #include "mb/pg_wchar.h" -#include "nodes/miscnodes.h" #include "miscadmin.h" +#include "nodes/miscnodes.h" #include "pgstat.h" #include "postmaster/bgworker.h" #include "postmaster/postmaster.h" @@ -115,8 +114,8 @@ char *Log_destination_string = NULL; bool syslog_sequence_numbers = true; bool syslog_split_messages = true; -/* Processed form of backtrace_symbols GUC */ -static char *backtrace_symbol_list; +/* Processed form of backtrace_functions GUC */ +static char *backtrace_function_list; #ifdef HAVE_SYSLOG @@ -155,7 +154,7 @@ static int recursion_depth = 0; /* to detect actual recursion */ /* * Saved timeval and buffers for formatted timestamps that might be used by - * both log_line_prefix and csv logs. + * log_line_prefix, csv logs and JSON logs. */ static struct timeval saved_timeval; static bool saved_timeval_set = false; @@ -831,13 +830,13 @@ matches_backtrace_functions(const char *funcname) { const char *p; - if (!backtrace_symbol_list || funcname == NULL || funcname[0] == '\0') + if (!backtrace_function_list || funcname == NULL || funcname[0] == '\0') return false; - p = backtrace_symbol_list; + p = backtrace_function_list; for (;;) { - if (*p == '\0') /* end of backtrace_symbol_list */ + if (*p == '\0') /* end of backtrace_function_list */ break; if (strcmp(funcname, p) == 0) @@ -909,9 +908,7 @@ errcode_for_file_access(void) /* Wrong object type or state */ case ENOTDIR: /* Not a directory */ case EISDIR: /* Is a directory */ -#if defined(ENOTEMPTY) && (ENOTEMPTY != EEXIST) /* same code on AIX */ case ENOTEMPTY: /* Directory not empty */ -#endif edata->sqlerrcode = ERRCODE_WRONG_OBJECT_TYPE; break; @@ -920,6 +917,10 @@ errcode_for_file_access(void) edata->sqlerrcode = ERRCODE_DISK_FULL; break; + case ENOMEM: /* Out of memory */ + edata->sqlerrcode = ERRCODE_OUT_OF_MEMORY; + break; + case ENFILE: /* File table overflow */ case EMFILE: /* Too many open files */ edata->sqlerrcode = ERRCODE_INSUFFICIENT_RESOURCES; @@ -1567,6 +1568,23 @@ geterrcode(void) return edata->sqlerrcode; } +/* + * geterrlevel --- return the currently set error level + * + * This is only intended for use in error callback subroutines, since there + * is no other place outside elog.c where the concept is meaningful. + */ +int +geterrlevel(void) +{ + ErrorData *edata = &errordata[errordata_stack_depth]; + + /* we don't bother incrementing recursion_depth */ + CHECK_STACK_DEPTH(); + + return edata->elevel; +} + /* * geterrposition --- return the currently set error position (0 if none) * @@ -1675,6 +1693,14 @@ EmitErrorReport(void) CHECK_STACK_DEPTH(); oldcontext = MemoryContextSwitchTo(edata->assoc_context); + /* + * Reset the formatted timestamp fields before emitting any logs. This + * includes all the log destinations and emit_log_hook, as the latter + * could use log_line_prefix or the formatted timestamps. + */ + saved_timeval_set = false; + formatted_log_time[0] = '\0'; + /* * Call hook before sending message to log. The hook function is allowed * to turn off edata->output_to_server, so we must recheck that afterward. @@ -1734,7 +1760,21 @@ CopyErrorData(void) newedata = (ErrorData *) palloc(sizeof(ErrorData)); memcpy(newedata, edata, sizeof(ErrorData)); - /* Make copies of separately-allocated fields */ + /* + * Make copies of separately-allocated strings. Note that we copy even + * theoretically-constant strings such as filename. This is because those + * could point into JIT-created code segments that might get unloaded at + * transaction cleanup. In some cases we need the copied ErrorData to + * survive transaction boundaries, so we'd better copy those strings too. + */ + if (newedata->filename) + newedata->filename = pstrdup(newedata->filename); + if (newedata->funcname) + newedata->funcname = pstrdup(newedata->funcname); + if (newedata->domain) + newedata->domain = pstrdup(newedata->domain); + if (newedata->context_domain) + newedata->context_domain = pstrdup(newedata->context_domain); if (newedata->message) newedata->message = pstrdup(newedata->message); if (newedata->detail) @@ -1747,6 +1787,8 @@ CopyErrorData(void) newedata->context = pstrdup(newedata->context); if (newedata->backtrace) newedata->backtrace = pstrdup(newedata->backtrace); + if (newedata->message_id) + newedata->message_id = pstrdup(newedata->message_id); if (newedata->schema_name) newedata->schema_name = pstrdup(newedata->schema_name); if (newedata->table_name) @@ -1833,7 +1875,7 @@ FlushErrorState(void) errordata_stack_depth = -1; recursion_depth = 0; /* Delete all data in ErrorContext */ - MemoryContextResetAndDeleteChildren(ErrorContext); + MemoryContextReset(ErrorContext); } /* @@ -2138,7 +2180,7 @@ check_backtrace_functions(char **newval, void **extra, GucSource source) ", \n\t"); if (validlen != newvallen) { - GUC_check_errdetail("invalid character"); + GUC_check_errdetail("Invalid character"); return false; } @@ -2180,7 +2222,7 @@ check_backtrace_functions(char **newval, void **extra, GucSource source) void assign_backtrace_functions(const char *newval, void *extra) { - backtrace_symbol_list = (char *) extra; + backtrace_function_list = (char *) extra; } /* @@ -2629,7 +2671,7 @@ get_formatted_log_time(void) /* * Note: we expect that guc.c will ensure that log_timezone is set up (at * least with a minimal GMT value) before Log_line_prefix can become - * nonempty or CSV mode can be selected. + * nonempty or CSV/JSON mode can be selected. */ pg_strftime(formatted_log_time, FORMATTED_TS_LEN, /* leave room for milliseconds... */ @@ -2670,7 +2712,7 @@ get_formatted_start_time(void) /* * Note: we expect that guc.c will ensure that log_timezone is set up (at * least with a minimal GMT value) before Log_line_prefix can become - * nonempty or CSV mode can be selected. + * nonempty or CSV/JSON mode can be selected. */ pg_strftime(formatted_start_time, FORMATTED_TS_LEN, "%Y-%m-%d %H:%M:%S %Z", @@ -2902,12 +2944,12 @@ log_status_format(StringInfo buf, const char *format, ErrorData *edata) { char strfbuf[128]; - snprintf(strfbuf, sizeof(strfbuf) - 1, "%lx.%x", - (long) (MyStartTime), MyProcPid); + snprintf(strfbuf, sizeof(strfbuf) - 1, "%" INT64_MODIFIER "x.%x", + MyStartTime, MyProcPid); appendStringInfo(buf, "%*s", padding, strfbuf); } else - appendStringInfo(buf, "%lx.%x", (long) (MyStartTime), MyProcPid); + appendStringInfo(buf, "%" INT64_MODIFIER "x.%x", MyStartTime, MyProcPid); break; case 'p': if (padding != 0) @@ -3072,18 +3114,18 @@ log_status_format(StringInfo buf, const char *format, ErrorData *edata) break; case 'v': /* keep VXID format in sync with lockfuncs.c */ - if (MyProc != NULL && MyProc->backendId != InvalidBackendId) + if (MyProc != NULL && MyProc->vxid.procNumber != INVALID_PROC_NUMBER) { if (padding != 0) { char strfbuf[128]; snprintf(strfbuf, sizeof(strfbuf) - 1, "%d/%u", - MyProc->backendId, MyProc->lxid); + MyProc->vxid.procNumber, MyProc->vxid.lxid); appendStringInfo(buf, "%*s", padding, strfbuf); } else - appendStringInfo(buf, "%d/%u", MyProc->backendId, MyProc->lxid); + appendStringInfo(buf, "%d/%u", MyProc->vxid.procNumber, MyProc->vxid.lxid); } else if (padding != 0) appendStringInfoSpaces(buf, @@ -3148,9 +3190,6 @@ send_message_to_server_log(ErrorData *edata) initStringInfo(&buf); - saved_timeval_set = false; - formatted_log_time[0] = '\0'; - log_line_prefix(&buf, edata); appendStringInfo(&buf, "%s: ", _(error_severity(edata->elevel))); @@ -3465,7 +3504,10 @@ send_message_to_frontend(ErrorData *edata) char tbuf[12]; /* 'N' (Notice) is for nonfatal conditions, 'E' is for errors */ - pq_beginmessage(&msgbuf, (edata->elevel < ERROR) ? 'N' : 'E'); + if (edata->elevel < ERROR) + pq_beginmessage(&msgbuf, PqMsg_NoticeResponse); + else + pq_beginmessage(&msgbuf, PqMsg_ErrorResponse); sev = error_severity(edata->elevel); pq_sendbyte(&msgbuf, PG_DIAG_SEVERITY); @@ -3728,29 +3770,3 @@ write_stderr(const char *fmt,...) #endif va_end(ap); } - - -/* - * Adjust the level of a recovery-related message per trace_recovery_messages. - * - * The argument is the default log level of the message, eg, DEBUG2. (This - * should only be applied to DEBUGn log messages, otherwise it's a no-op.) - * If the level is >= trace_recovery_messages, we return LOG, causing the - * message to be logged unconditionally (for most settings of - * log_min_messages). Otherwise, we return the argument unchanged. - * The message will then be shown based on the setting of log_min_messages. - * - * Intention is to keep this for at least the whole of the 9.0 production - * release, so we can more easily diagnose production problems in the field. - * It should go away eventually, though, because it's an ugly and - * hard-to-explain kluge. - */ -int -trace_recovery(int trace_level) -{ - if (trace_level < LOG && - trace_level >= trace_recovery_messages) - return LOG; - - return trace_level; -} diff --git a/src/backend/utils/error/jsonlog.c b/src/backend/utils/error/jsonlog.c index e327774ef7968..2c7b14cacb14b 100644 --- a/src/backend/utils/error/jsonlog.c +++ b/src/backend/utils/error/jsonlog.c @@ -3,7 +3,7 @@ * jsonlog.c * JSON logging * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -16,16 +16,14 @@ #include "postgres.h" #include "access/xact.h" -#include "libpq/libpq.h" +#include "libpq/libpq-be.h" #include "lib/stringinfo.h" #include "miscadmin.h" -#include "postmaster/bgworker.h" #include "postmaster/syslogger.h" #include "storage/lock.h" #include "storage/proc.h" #include "tcop/tcopprot.h" #include "utils/backend_status.h" -#include "utils/elog.h" #include "utils/guc.h" #include "utils/json.h" #include "utils/ps_status.h" @@ -170,8 +168,8 @@ write_jsonlog(ErrorData *edata) } /* Session id */ - appendJSONKeyValueFmt(&buf, "session_id", true, "%lx.%x", - (long) MyStartTime, MyProcPid); + appendJSONKeyValueFmt(&buf, "session_id", true, "%" INT64_MODIFIER "x.%x", + MyStartTime, MyProcPid); /* Line number */ appendJSONKeyValueFmt(&buf, "line_num", false, "%ld", log_line_number); @@ -197,9 +195,9 @@ write_jsonlog(ErrorData *edata) /* Virtual transaction id */ /* keep VXID format in sync with lockfuncs.c */ - if (MyProc != NULL && MyProc->backendId != InvalidBackendId) - appendJSONKeyValueFmt(&buf, "vxid", true, "%d/%u", MyProc->backendId, - MyProc->lxid); + if (MyProc != NULL && MyProc->vxid.procNumber != INVALID_PROC_NUMBER) + appendJSONKeyValueFmt(&buf, "vxid", true, "%d/%u", + MyProc->vxid.procNumber, MyProc->vxid.lxid); /* Transaction id */ appendJSONKeyValueFmt(&buf, "txid", false, "%u", diff --git a/src/backend/utils/error/meson.build b/src/backend/utils/error/meson.build index 86b7075159428..1079d1de5483c 100644 --- a/src/backend/utils/error/meson.build +++ b/src/backend/utils/error/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'assert.c', diff --git a/src/backend/utils/fmgr/dfmgr.c b/src/backend/utils/fmgr/dfmgr.c index b85d52c913c3a..092004dcf3b3f 100644 --- a/src/backend/utils/fmgr/dfmgr.c +++ b/src/backend/utils/fmgr/dfmgr.c @@ -3,7 +3,7 @@ * dfmgr.c * Dynamic function manager code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -33,6 +33,7 @@ #include "fmgr.h" #include "lib/stringinfo.h" #include "miscadmin.h" +#include "storage/fd.h" #include "storage/shmem.h" #include "utils/hsearch.h" @@ -78,7 +79,6 @@ char *Dynamic_library_path; static void *internal_load_library(const char *libname); static void incompatible_module_error(const char *libname, const Pg_magic_struct *module_magic_data) pg_attribute_noreturn(); -static bool file_exists(const char *name); static char *expand_dynamic_library_name(const char *name); static void check_restricted_library_name(const char *name); static char *substitute_libpath_macro(const char *name); @@ -400,23 +400,6 @@ incompatible_module_error(const char *libname, errdetail_internal("%s", details.data))); } -static bool -file_exists(const char *name) -{ - struct stat st; - - Assert(name != NULL); - - if (stat(name, &st) == 0) - return !S_ISDIR(st.st_mode); - else if (!(errno == ENOENT || errno == ENOTDIR || errno == EACCES)) - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not access file \"%s\": %m", name))); - - return false; -} - /* * If name contains a slash, check if the file exists, if so return @@ -447,7 +430,7 @@ expand_dynamic_library_name(const char *name) else { full = substitute_libpath_macro(name); - if (file_exists(full)) + if (pg_file_exists(full)) return full; pfree(full); } @@ -465,7 +448,7 @@ expand_dynamic_library_name(const char *name) { full = substitute_libpath_macro(new); pfree(new); - if (file_exists(full)) + if (pg_file_exists(full)) return full; pfree(full); } @@ -582,7 +565,7 @@ find_in_dynamic_libpath(const char *basename) elog(DEBUG3, "find_in_dynamic_libpath: trying \"%s\"", full); - if (file_exists(full)) + if (pg_file_exists(full)) return full; pfree(full); diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c index 9208c31fe06ad..e48a86be54b0d 100644 --- a/src/backend/utils/fmgr/fmgr.c +++ b/src/backend/utils/fmgr/fmgr.c @@ -3,7 +3,7 @@ * fmgr.c * The Postgres function manager. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -612,7 +612,9 @@ struct fmgr_security_definer_cache { FmgrInfo flinfo; /* lookup info for target function */ Oid userid; /* userid to set, or InvalidOid */ - ArrayType *proconfig; /* GUC values to set, or NULL */ + List *configNames; /* GUC names to set, or NIL */ + List *configHandles; /* GUC handles to set, or NIL */ + List *configValues; /* GUC values to set, or NIL */ Datum arg; /* passthrough argument for plugin modules */ }; @@ -634,6 +636,9 @@ fmgr_security_definer(PG_FUNCTION_ARGS) FmgrInfo *save_flinfo; Oid save_userid; int save_sec_context; + ListCell *lc1, + *lc2, + *lc3; volatile int save_nestlevel; PgStat_FunctionCallUsage fcusage; @@ -666,8 +671,24 @@ fmgr_security_definer(PG_FUNCTION_ARGS) &isnull); if (!isnull) { + ArrayType *array; + ListCell *lc; + oldcxt = MemoryContextSwitchTo(fcinfo->flinfo->fn_mcxt); - fcache->proconfig = DatumGetArrayTypePCopy(datum); + array = DatumGetArrayTypeP(datum); + TransformGUCArray(array, &fcache->configNames, + &fcache->configValues); + + /* transform names to config handles to avoid lookup cost */ + fcache->configHandles = NIL; + foreach(lc, fcache->configNames) + { + char *name = (char *) lfirst(lc); + + fcache->configHandles = lappend(fcache->configHandles, + get_config_handle(name)); + } + MemoryContextSwitchTo(oldcxt); } @@ -680,7 +701,7 @@ fmgr_security_definer(PG_FUNCTION_ARGS) /* GetUserIdAndSecContext is cheap enough that no harm in a wasted call */ GetUserIdAndSecContext(&save_userid, &save_sec_context); - if (fcache->proconfig) /* Need a new GUC nesting level */ + if (fcache->configNames != NIL) /* Need a new GUC nesting level */ save_nestlevel = NewGUCNestLevel(); else save_nestlevel = 0; /* keep compiler quiet */ @@ -689,12 +710,20 @@ fmgr_security_definer(PG_FUNCTION_ARGS) SetUserIdAndSecContext(fcache->userid, save_sec_context | SECURITY_LOCAL_USERID_CHANGE); - if (fcache->proconfig) + forthree(lc1, fcache->configNames, + lc2, fcache->configHandles, + lc3, fcache->configValues) { - ProcessGUCArray(fcache->proconfig, - (superuser() ? PGC_SUSET : PGC_USERSET), - PGC_S_SESSION, - GUC_ACTION_SAVE); + GucContext context = superuser() ? PGC_SUSET : PGC_USERSET; + GucSource source = PGC_S_SESSION; + GucAction action = GUC_ACTION_SAVE; + char *name = lfirst(lc1); + config_handle *handle = lfirst(lc2); + char *value = lfirst(lc3); + + (void) set_config_with_handle(name, handle, value, + context, source, GetUserId(), + action, true, 0, false); } /* function manager hook */ @@ -737,7 +766,7 @@ fmgr_security_definer(PG_FUNCTION_ARGS) fcinfo->flinfo = save_flinfo; - if (fcache->proconfig) + if (fcache->configNames != NIL) AtEOXact_GUC(true, save_nestlevel); if (OidIsValid(fcache->userid)) SetUserIdAndSecContext(save_userid, save_sec_context); diff --git a/src/backend/utils/fmgr/funcapi.c b/src/backend/utils/fmgr/funcapi.c index 24683bb608e6f..05d763fa06e4c 100644 --- a/src/backend/utils/fmgr/funcapi.c +++ b/src/backend/utils/fmgr/funcapi.c @@ -4,7 +4,7 @@ * Utility and convenience functions for fmgr functions that return * sets and/or composite types, or deal with VARIADIC inputs. * - * Copyright (c) 2002-2023, PostgreSQL Global Development Group + * Copyright (c) 2002-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/fmgr/funcapi.c @@ -287,6 +287,13 @@ get_call_result_type(FunctionCallInfo fcinfo, /* * get_expr_result_type * As above, but work from a calling expression node tree + * + * Beware of using this on the funcexpr of a RTE that has a coldeflist. + * The correct conclusion in such cases is always that the function returns + * RECORD with the columns defined by the coldeflist fields (funccolnames etc). + * If it does not, it's the executor's responsibility to catch the discrepancy + * at runtime; but code processing the query in advance of that point might + * come to inconsistent conclusions if it checks the actual expression. */ TypeFuncClass get_expr_result_type(Node *expr, @@ -537,7 +544,8 @@ internal_get_result_type(Oid funcid, * if noError is true, else throws error. * * This is a simpler version of get_expr_result_type() for use when the caller - * is only interested in determinate rowtype results. + * is only interested in determinate rowtype results. As with that function, + * beware of using this on the funcexpr of a RTE that has a coldeflist. */ TupleDesc get_expr_result_tupdesc(Node *expr, bool noError) diff --git a/src/backend/utils/fmgr/meson.build b/src/backend/utils/fmgr/meson.build index a00e168566581..42afa9c4a848e 100644 --- a/src/backend/utils/fmgr/meson.build +++ b/src/backend/utils/fmgr/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'dfmgr.c', diff --git a/src/backend/utils/generate-errcodes.pl b/src/backend/utils/generate-errcodes.pl index 34d0f25c2335d..68fb2f3f28796 100644 --- a/src/backend/utils/generate-errcodes.pl +++ b/src/backend/utils/generate-errcodes.pl @@ -1,10 +1,10 @@ #!/usr/bin/perl # # Generate the errcodes.h header from errcodes.txt -# Copyright (c) 2000-2023, PostgreSQL Global Development Group +# Copyright (c) 2000-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use Getopt::Long; my $outfile = ''; diff --git a/src/backend/utils/hash/dynahash.c b/src/backend/utils/hash/dynahash.c index 012d4a0b1fdc9..45b8e8e919ebb 100644 --- a/src/backend/utils/hash/dynahash.c +++ b/src/backend/utils/hash/dynahash.c @@ -52,7 +52,7 @@ * dynahash has better performance for large entries. * - Guarantees stable pointers to entries. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -272,7 +272,9 @@ static HASHBUCKET get_hash_entry(HTAB *hashp, int freelist_idx); static void hdefault(HTAB *hashp); static int choose_nelem_alloc(Size entrysize); static bool init_htab(HTAB *hashp, long nelem); -static void hash_corrupted(HTAB *hashp); +static void hash_corrupted(HTAB *hashp) pg_attribute_noreturn(); +static uint32 hash_initial_lookup(HTAB *hashp, uint32 hashvalue, + HASHBUCKET **bucketptr); static long next_pow2_long(long num); static int next_pow2_int(long num); static void register_seq_scan(HTAB *hashp); @@ -388,7 +390,8 @@ hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags) } /* Initialize the hash header, plus a copy of the table name */ - hashp = (HTAB *) DynaHashAlloc(sizeof(HTAB) + strlen(tabname) + 1); + hashp = (HTAB *) MemoryContextAlloc(CurrentDynaHashCxt, + sizeof(HTAB) + strlen(tabname) + 1); MemSet(hashp, 0, sizeof(HTAB)); hashp->tabname = (char *) (hashp + 1); @@ -972,10 +975,6 @@ hash_search_with_hash_value(HTAB *hashp, HASHHDR *hctl = hashp->hctl; int freelist_idx = FREELIST_IDX(hctl, hashvalue); Size keysize; - uint32 bucket; - long segment_num; - long segment_ndx; - HASHSEGMENT segp; HASHBUCKET currBucket; HASHBUCKET *prevBucketPtr; HashCompareFunc match; @@ -1008,17 +1007,7 @@ hash_search_with_hash_value(HTAB *hashp, /* * Do the initial lookup */ - bucket = calc_bucket(hctl, hashvalue); - - segment_num = bucket >> hashp->sshift; - segment_ndx = MOD(bucket, hashp->ssize); - - segp = hashp->dir[segment_num]; - - if (segp == NULL) - hash_corrupted(hashp); - - prevBucketPtr = &segp[segment_ndx]; + (void) hash_initial_lookup(hashp, hashvalue, &prevBucketPtr); currBucket = *prevBucketPtr; /* @@ -1159,14 +1148,10 @@ hash_update_hash_key(HTAB *hashp, const void *newKeyPtr) { HASHELEMENT *existingElement = ELEMENT_FROM_KEY(existingEntry); - HASHHDR *hctl = hashp->hctl; uint32 newhashvalue; Size keysize; uint32 bucket; uint32 newbucket; - long segment_num; - long segment_ndx; - HASHSEGMENT segp; HASHBUCKET currBucket; HASHBUCKET *prevBucketPtr; HASHBUCKET *oldPrevPtr; @@ -1187,17 +1172,8 @@ hash_update_hash_key(HTAB *hashp, * this to be able to unlink it from its hash chain, but as a side benefit * we can verify the validity of the passed existingEntry pointer. */ - bucket = calc_bucket(hctl, existingElement->hashvalue); - - segment_num = bucket >> hashp->sshift; - segment_ndx = MOD(bucket, hashp->ssize); - - segp = hashp->dir[segment_num]; - - if (segp == NULL) - hash_corrupted(hashp); - - prevBucketPtr = &segp[segment_ndx]; + bucket = hash_initial_lookup(hashp, existingElement->hashvalue, + &prevBucketPtr); currBucket = *prevBucketPtr; while (currBucket != NULL) @@ -1219,18 +1195,7 @@ hash_update_hash_key(HTAB *hashp, * chain we want to put the entry into. */ newhashvalue = hashp->hash(newKeyPtr, hashp->keysize); - - newbucket = calc_bucket(hctl, newhashvalue); - - segment_num = newbucket >> hashp->sshift; - segment_ndx = MOD(newbucket, hashp->ssize); - - segp = hashp->dir[segment_num]; - - if (segp == NULL) - hash_corrupted(hashp); - - prevBucketPtr = &segp[segment_ndx]; + newbucket = hash_initial_lookup(hashp, newhashvalue, &prevBucketPtr); currBucket = *prevBucketPtr; /* @@ -1741,6 +1706,33 @@ element_alloc(HTAB *hashp, int nelem, int freelist_idx) return true; } +/* + * Do initial lookup of a bucket for the given hash value, retrieving its + * bucket number and its hash bucket. + */ +static inline uint32 +hash_initial_lookup(HTAB *hashp, uint32 hashvalue, HASHBUCKET **bucketptr) +{ + HASHHDR *hctl = hashp->hctl; + HASHSEGMENT segp; + long segment_num; + long segment_ndx; + uint32 bucket; + + bucket = calc_bucket(hctl, hashvalue); + + segment_num = bucket >> hashp->sshift; + segment_ndx = MOD(bucket, hashp->ssize); + + segp = hashp->dir[segment_num]; + + if (segp == NULL) + hash_corrupted(hashp); + + *bucketptr = &segp[segment_ndx]; + return bucket; +} + /* complain when we have detected a corrupted hashtable */ static void hash_corrupted(HTAB *hashp) diff --git a/src/backend/utils/hash/meson.build b/src/backend/utils/hash/meson.build index 30ae26cae7773..5fefb9aaedf27 100644 --- a/src/backend/utils/hash/meson.build +++ b/src/backend/utils/hash/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'dynahash.c', diff --git a/src/backend/utils/hash/pg_crc.c b/src/backend/utils/hash/pg_crc.c index 123ff62c47697..3595938dc4fb2 100644 --- a/src/backend/utils/hash/pg_crc.c +++ b/src/backend/utils/hash/pg_crc.c @@ -7,7 +7,7 @@ * A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS, available from * http://ross.net/crc/download/crc_v3.txt or several other net sites. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c index 011ec18015a2c..cc61937eef749 100644 --- a/src/backend/utils/init/globals.c +++ b/src/backend/utils/init/globals.c @@ -3,7 +3,7 @@ * globals.c * global variable declarations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -22,7 +22,7 @@ #include "libpq/libpq-be.h" #include "libpq/pqcomm.h" #include "miscadmin.h" -#include "storage/backendid.h" +#include "storage/procnumber.h" ProtocolVersion FrontendProtocol; @@ -33,6 +33,7 @@ volatile sig_atomic_t ProcDiePending = false; volatile sig_atomic_t CheckClientConnectionPending = false; volatile sig_atomic_t ClientConnectionLost = false; volatile sig_atomic_t IdleInTransactionSessionTimeoutPending = false; +volatile sig_atomic_t TransactionTimeoutPending = false; volatile sig_atomic_t IdleSessionTimeoutPending = false; volatile sig_atomic_t ProcSignalBarrierPending = false; volatile sig_atomic_t LogMemoryContextPending = false; @@ -44,6 +45,7 @@ volatile uint32 CritSectionCount = 0; int MyProcPid; pg_time_t MyStartTime; TimestampTz MyStartTimestamp; +struct ClientSocket *MyClientSocket; struct Port *MyProcPort; int32 MyCancelKey; int MyPMChildSlot; @@ -82,14 +84,16 @@ char postgres_exec_path[MAXPGPATH]; /* full path to backend */ /* note: currently this is not valid in backend processes */ #endif -BackendId MyBackendId = InvalidBackendId; +ProcNumber MyProcNumber = INVALID_PROC_NUMBER; -BackendId ParallelLeaderBackendId = InvalidBackendId; +ProcNumber ParallelLeaderProcNumber = INVALID_PROC_NUMBER; Oid MyDatabaseId = InvalidOid; Oid MyDatabaseTableSpace = InvalidOid; +bool MyDatabaseHasLoginEventTriggers = false; + /* * DatabasePath is the path (relative to DataDir) of my database's * primary directory, ie, its directory in the default tablespace. @@ -112,7 +116,6 @@ pid_t PostmasterPid = 0; bool IsPostmasterEnvironment = false; bool IsUnderPostmaster = false; bool IsBinaryUpgrade = false; -bool IsBackgroundWorker = false; bool ExitOnAnyError = false; @@ -140,7 +143,7 @@ int max_parallel_workers = 8; int MaxBackends = 0; /* GUC parameters for vacuum */ -int VacuumBufferUsageLimit = 256; +int VacuumBufferUsageLimit = 2048; int VacuumCostPageHit = 1; int VacuumCostPageMiss = 2; @@ -154,3 +157,12 @@ int64 VacuumPageDirty = 0; int VacuumCostBalance = 0; /* working state for vacuum */ bool VacuumCostActive = false; + +/* configurable SLRU buffer sizes */ +int commit_timestamp_buffers = 0; +int multixact_member_buffers = 32; +int multixact_offset_buffers = 16; +int notify_buffers = 16; +int serializable_buffers = 32; +int subtransaction_buffers = 0; +int transaction_buffers = 0; diff --git a/src/backend/utils/init/meson.build b/src/backend/utils/init/meson.build index 186be1381d85e..e8af32861f511 100644 --- a/src/backend/utils/init/meson.build +++ b/src/backend/utils/init/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'globals.c', diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index a604432126c82..8ac8ecc0dbb9d 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -3,7 +3,7 @@ * miscinit.c * miscellaneous initialization support stuff * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -29,6 +29,7 @@ #include #include "access/htup_details.h" +#include "access/parallel.h" #include "catalog/pg_authid.h" #include "common/file_perm.h" #include "libpq/libpq.h" @@ -38,8 +39,8 @@ #include "pgstat.h" #include "postmaster/autovacuum.h" #include "postmaster/interrupt.h" -#include "postmaster/pgarch.h" #include "postmaster/postmaster.h" +#include "replication/slotsync.h" #include "storage/fd.h" #include "storage/ipc.h" #include "storage/latch.h" @@ -107,9 +108,8 @@ InitPostmasterChild(void) /* * Set reference point for stack-depth checking. This might seem - * redundant in !EXEC_BACKEND builds; but it's not because the postmaster - * launches its children from signal handlers, so we might be running on - * an alternative stack. + * redundant in !EXEC_BACKEND builds, but it's better to keep the depth + * logic the same with and without that build option. */ (void) set_stack_base(); @@ -294,6 +294,9 @@ GetBackendTypeDesc(BackendType backendType) case B_LOGGER: backendDesc = "logger"; break; + case B_SLOTSYNC_WORKER: + backendDesc = "slotsync worker"; + break; case B_STANDALONE_BACKEND: backendDesc = "standalone backend"; break; @@ -306,6 +309,9 @@ GetBackendTypeDesc(BackendType backendType) case B_WAL_SENDER: backendDesc = "walsender"; break; + case B_WAL_SUMMARIZER: + backendDesc = "walsummarizer"; + break; case B_WAL_WRITER: backendDesc = "walwriter"; break; @@ -467,8 +473,8 @@ ChangeToDataDir(void) * AuthenticatedUserId is determined at connection start and never changes. * * SessionUserId is initially the same as AuthenticatedUserId, but can be - * changed by SET SESSION AUTHORIZATION (if AuthenticatedUserIsSuperuser). - * This is the ID reported by the SESSION_USER SQL function. + * changed by SET SESSION AUTHORIZATION (if AuthenticatedUserId is a + * superuser). This is the ID reported by the SESSION_USER SQL function. * * OuterUserId is the current user ID in effect at the "outer level" (outside * any transaction or function). This is initially the same as SessionUserId, @@ -492,8 +498,7 @@ static Oid OuterUserId = InvalidOid; static Oid CurrentUserId = InvalidOid; static const char *SystemUser = NULL; -/* We also have to remember the superuser state of some of these levels */ -static bool AuthenticatedUserIsSuperuser = false; +/* We also have to remember the superuser state of the session user */ static bool SessionUserIsSuperuser = false; static int SecurityRestrictionContext = 0; @@ -526,7 +531,7 @@ GetOuterUserId(void) static void -SetOuterUserId(Oid userid) +SetOuterUserId(Oid userid, bool is_superuser) { Assert(SecurityRestrictionContext == 0); Assert(OidIsValid(userid)); @@ -534,6 +539,11 @@ SetOuterUserId(Oid userid) /* We force the effective user ID to match, too */ CurrentUserId = userid; + + /* Also update the is_superuser GUC to match OuterUserId's property */ + SetConfigOption("is_superuser", + is_superuser ? "on" : "off", + PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); } @@ -547,6 +557,12 @@ GetSessionUserId(void) return SessionUserId; } +bool +GetSessionUserIsSuperuser(void) +{ + Assert(OidIsValid(SessionUserId)); + return SessionUserIsSuperuser; +} static void SetSessionUserId(Oid userid, bool is_superuser) @@ -555,11 +571,6 @@ SetSessionUserId(Oid userid, bool is_superuser) Assert(OidIsValid(userid)); SessionUserId = userid; SessionUserIsSuperuser = is_superuser; - SetRoleIsActive = false; - - /* We force the effective user IDs to match, too */ - OuterUserId = userid; - CurrentUserId = userid; } /* @@ -573,7 +584,8 @@ GetSystemUser(void) } /* - * GetAuthenticatedUserId - get the authenticated user ID + * GetAuthenticatedUserId/SetAuthenticatedUserId - get/set the authenticated + * user ID */ Oid GetAuthenticatedUserId(void) @@ -582,6 +594,21 @@ GetAuthenticatedUserId(void) return AuthenticatedUserId; } +void +SetAuthenticatedUserId(Oid userid) +{ + Assert(OidIsValid(userid)); + + /* call only once */ + Assert(!OidIsValid(AuthenticatedUserId)); + + AuthenticatedUserId = userid; + + /* Also mark our PGPROC entry with the authenticated user id */ + /* (We assume this is an atomic store so no lock is needed) */ + MyProc->roleId = userid; +} + /* * GetUserIdAndSecContext/SetUserIdAndSecContext - get/set the current user ID @@ -726,11 +753,26 @@ has_rolreplication(Oid roleid) * Initialize user identity during normal backend startup */ void -InitializeSessionUserId(const char *rolename, Oid roleid) +InitializeSessionUserId(const char *rolename, Oid roleid, + bool bypass_login_check) { HeapTuple roleTup; Form_pg_authid rform; char *rname; + bool is_superuser; + + /* + * In a parallel worker, we don't have to do anything here. + * ParallelWorkerMain already set our output variables, and we aren't + * going to enforce either rolcanlogin or rolconnlimit. Furthermore, we + * don't really want to perform a catalog lookup for the role: we don't + * want to fail if it's been dropped. + */ + if (InitializingParallelWorker) + { + Assert(bypass_login_check); + return; + } /* * Don't do scans if we're bootstrapping, none of the system catalogs @@ -738,9 +780,6 @@ InitializeSessionUserId(const char *rolename, Oid roleid) */ Assert(!IsBootstrapProcessingMode()); - /* call only once */ - Assert(!OidIsValid(AuthenticatedUserId)); - /* * Make sure syscache entries are flushed for recent catalog changes. This * allows us to find roles that were created on-the-fly during @@ -748,6 +787,9 @@ InitializeSessionUserId(const char *rolename, Oid roleid) */ AcceptInvalidationMessages(); + /* + * Look up the role, either by name if that's given or by OID if not. + */ if (rolename != NULL) { roleTup = SearchSysCache1(AUTHNAME, PointerGetDatum(rolename)); @@ -768,16 +810,31 @@ InitializeSessionUserId(const char *rolename, Oid roleid) rform = (Form_pg_authid) GETSTRUCT(roleTup); roleid = rform->oid; rname = NameStr(rform->rolname); + is_superuser = rform->rolsuper; - AuthenticatedUserId = roleid; - AuthenticatedUserIsSuperuser = rform->rolsuper; + SetAuthenticatedUserId(roleid); - /* This sets OuterUserId/CurrentUserId too */ - SetSessionUserId(roleid, AuthenticatedUserIsSuperuser); - - /* Also mark our PGPROC entry with the authenticated user id */ - /* (We assume this is an atomic store so no lock is needed) */ - MyProc->roleId = roleid; + /* + * Set SessionUserId and related variables, including "role", via the GUC + * mechanisms. + * + * Note: ideally we would use PGC_S_DYNAMIC_DEFAULT here, so that + * session_authorization could subsequently be changed from + * pg_db_role_setting entries. Instead, session_authorization in + * pg_db_role_setting has no effect. Changing that would require solving + * two problems: + * + * 1. If pg_db_role_setting has values for both session_authorization and + * role, we could not be sure which order those would be applied in, and + * it would matter. + * + * 2. Sites may have years-old session_authorization entries. There's not + * been any particular reason to remove them. Ending the dormancy of + * those entries could seriously change application behavior, so only a + * major release should do that. + */ + SetConfigOption("session_authorization", rname, + PGC_BACKEND, PGC_S_OVERRIDE); /* * These next checks are not enforced when in standalone mode, so that @@ -787,16 +844,19 @@ InitializeSessionUserId(const char *rolename, Oid roleid) if (IsUnderPostmaster) { /* - * Is role allowed to login at all? + * Is role allowed to login at all? (But background workers can + * override this by setting bypass_login_check.) */ - if (!rform->rolcanlogin) + if (!bypass_login_check && !rform->rolcanlogin) ereport(FATAL, (errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION), errmsg("role \"%s\" is not permitted to log in", rname))); /* - * Check connection limit for this role. + * Check connection limit for this role. We enforce the limit only + * for regular backends, since other process types have their own + * PGPROC pools. * * There is a race condition here --- we create our PGPROC before * checking for other PGPROCs. If two backends did this at about the @@ -806,7 +866,8 @@ InitializeSessionUserId(const char *rolename, Oid roleid) * just document that the connection limit is approximate. */ if (rform->rolconnlimit >= 0 && - !AuthenticatedUserIsSuperuser && + AmRegularBackendProcess() && + !is_superuser && CountUserBackends(roleid) > rform->rolconnlimit) ereport(FATAL, (errcode(ERRCODE_TOO_MANY_CONNECTIONS), @@ -814,13 +875,6 @@ InitializeSessionUserId(const char *rolename, Oid roleid) rname))); } - /* Record username and superuser status as GUC settings too */ - SetConfigOption("session_authorization", rname, - PGC_BACKEND, PGC_S_OVERRIDE); - SetConfigOption("is_superuser", - AuthenticatedUserIsSuperuser ? "on" : "off", - PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); - ReleaseSysCache(roleTup); } @@ -833,17 +887,28 @@ InitializeSessionUserIdStandalone(void) { /* * This function should only be called in single-user mode, in autovacuum - * workers, and in background workers. + * workers, in slot sync worker and in background workers. */ - Assert(!IsUnderPostmaster || IsAutoVacuumWorkerProcess() || IsBackgroundWorker); + Assert(!IsUnderPostmaster || AmAutoVacuumWorkerProcess() || + AmLogicalSlotSyncWorkerProcess() || AmBackgroundWorkerProcess()); /* call only once */ Assert(!OidIsValid(AuthenticatedUserId)); AuthenticatedUserId = BOOTSTRAP_SUPERUSERID; - AuthenticatedUserIsSuperuser = true; - SetSessionUserId(BOOTSTRAP_SUPERUSERID, true); + /* + * XXX Ideally we'd do this via SetConfigOption("session_authorization"), + * but we lack the role name needed to do that, and we can't fetch it + * because one reason for this special case is to be able to start up even + * if something's happened to the BOOTSTRAP_SUPERUSERID's pg_authid row. + * Since we don't set the GUC itself, C code will see the value as NULL, + * and current_setting() will report an empty string within this session. + */ + SetSessionAuthorization(BOOTSTRAP_SUPERUSERID, true); + + /* We could do SetConfigOption("role"), but let's be consistent */ + SetCurrentRoleId(InvalidOid, false); } /* @@ -889,33 +954,21 @@ system_user(PG_FUNCTION_ARGS) /* * Change session auth ID while running * - * Only a superuser may set auth ID to something other than himself. Note - * that in case of multiple SETs in a single session, the original userid's - * superuserness is what matters. But we set the GUC variable is_superuser - * to indicate whether the *current* session userid is a superuser. - * - * Note: this is not an especially clean place to do the permission check. - * It's OK because the check does not require catalog access and can't - * fail during an end-of-transaction GUC reversion, but we may someday - * have to push it up into assign_session_authorization. + * The SQL standard says that SET SESSION AUTHORIZATION implies SET ROLE NONE. + * We mechanize that at higher levels not here, because this is the GUC + * assign hook for "session_authorization", and it must be commutative with + * SetCurrentRoleId (the hook for "role") because guc.c provides no guarantees + * which will run first during cases such as transaction rollback. Therefore, + * we update derived state (OuterUserId/CurrentUserId/is_superuser) only if + * !SetRoleIsActive. */ void SetSessionAuthorization(Oid userid, bool is_superuser) { - /* Must have authenticated already, else can't make permission check */ - Assert(OidIsValid(AuthenticatedUserId)); - - if (userid != AuthenticatedUserId && - !AuthenticatedUserIsSuperuser) - ereport(ERROR, - (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), - errmsg("permission denied to set session authorization"))); - SetSessionUserId(userid, is_superuser); - SetConfigOption("is_superuser", - is_superuser ? "on" : "off", - PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); + if (!SetRoleIsActive) + SetOuterUserId(userid, is_superuser); } /* @@ -951,28 +1004,25 @@ SetCurrentRoleId(Oid roleid, bool is_superuser) /* * Get correct info if it's SET ROLE NONE * - * If SessionUserId hasn't been set yet, just do nothing --- the eventual - * SetSessionUserId call will fix everything. This is needed since we - * will get called during GUC initialization. + * If SessionUserId hasn't been set yet, do nothing beyond updating + * SetRoleIsActive --- the eventual SetSessionAuthorization call will + * update the derived state. This is needed since we will get called + * during GUC initialization. */ if (!OidIsValid(roleid)) { + SetRoleIsActive = false; + if (!OidIsValid(SessionUserId)) return; roleid = SessionUserId; is_superuser = SessionUserIsSuperuser; - - SetRoleIsActive = false; } else SetRoleIsActive = true; - SetOuterUserId(roleid); - - SetConfigOption("is_superuser", - is_superuser ? "on" : "off", - PGC_INTERNAL, PGC_S_DYNAMIC_DEFAULT); + SetOuterUserId(roleid, is_superuser); } @@ -1376,10 +1426,10 @@ CreateLockFile(const char *filename, bool amPostmaster, * both datadir and socket lockfiles; although more stuff may get added to * the datadir lockfile later. */ - snprintf(buffer, sizeof(buffer), "%d\n%s\n%ld\n%d\n%s\n", + snprintf(buffer, sizeof(buffer), "%d\n%s\n" INT64_FORMAT "\n%d\n%s\n", amPostmaster ? (int) my_pid : -((int) my_pid), DataDir, - (long) MyStartTime, + MyStartTime, PostPortNumber, socketDir); diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index 0f9b92b32ebdd..2ed7c7c02dbce 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -3,7 +3,7 @@ * postinit.c * postgres initialization utilities * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,12 +23,10 @@ #include "access/heapam.h" #include "access/htup_details.h" #include "access/session.h" -#include "access/sysattr.h" #include "access/tableam.h" #include "access/xact.h" #include "access/xlog.h" #include "access/xloginsert.h" -#include "catalog/catalog.h" #include "catalog/namespace.h" #include "catalog/pg_authid.h" #include "catalog/pg_collation.h" @@ -43,6 +41,7 @@ #include "postmaster/autovacuum.h" #include "postmaster/postmaster.h" #include "replication/slot.h" +#include "replication/slotsync.h" #include "replication/walsender.h" #include "storage/bufmgr.h" #include "storage/fd.h" @@ -75,6 +74,7 @@ static void ShutdownPostgres(int code, Datum arg); static void StatementTimeoutHandler(void); static void LockTimeoutHandler(void); static void IdleInTransactionSessionTimeoutHandler(void); +static void TransactionTimeoutHandler(void); static void IdleSessionTimeoutHandler(void); static void IdleStatsUpdateTimeoutHandler(void); static void ClientCheckTimeoutHandler(void); @@ -318,7 +318,7 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect bool isnull; char *collate; char *ctype; - char *iculocale; + char *datlocale; /* Fetch our pg_database row normally, via syscache */ tup = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(MyDatabaseId)); @@ -341,13 +341,13 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect * These checks are not enforced when in standalone mode, so that there is * a way to recover from disabling all access to all databases, for * example "UPDATE pg_database SET datallowconn = false;". - * - * We do not enforce them for autovacuum worker processes either. */ - if (IsUnderPostmaster && !IsAutoVacuumWorkerProcess()) + if (IsUnderPostmaster) { /* * Check that the database is currently allowing connections. + * (Background processes can override this test and the next one by + * setting override_allow_connections.) */ if (!dbform->datallowconn && !override_allow_connections) ereport(FATAL, @@ -360,7 +360,7 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect * is redundant, but since we have the flag, might as well check it * and save a few cycles.) */ - if (!am_superuser && + if (!am_superuser && !override_allow_connections && object_aclcheck(DatabaseRelationId, MyDatabaseId, GetUserId(), ACL_CONNECT) != ACLCHECK_OK) ereport(FATAL, @@ -369,7 +369,9 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect errdetail("User does not have CONNECT privilege."))); /* - * Check connection limit for this database. + * Check connection limit for this database. We enforce the limit + * only for regular backends, since other process types have their own + * PGPROC pools. * * There is a race condition here --- we create our PGPROC before * checking for other PGPROCs. If two backends did this at about the @@ -379,6 +381,7 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect * just document that the connection limit is approximate. */ if (dbform->datconnlimit >= 0 && + AmRegularBackendProcess() && !am_superuser && CountDBConnections(MyDatabaseId) > dbform->datconnlimit) ereport(FATAL, @@ -423,12 +426,21 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect strcmp(ctype, "POSIX") == 0) database_ctype_is_c = true; - if (dbform->datlocprovider == COLLPROVIDER_ICU) + if (dbform->datlocprovider == COLLPROVIDER_BUILTIN) + { + datum = SysCacheGetAttrNotNull(DATABASEOID, tup, Anum_pg_database_datlocale); + datlocale = TextDatumGetCString(datum); + + builtin_validate_locale(dbform->encoding, datlocale); + + default_locale.info.builtin.locale = MemoryContextStrdup(TopMemoryContext, datlocale); + } + else if (dbform->datlocprovider == COLLPROVIDER_ICU) { char *icurules; - datum = SysCacheGetAttrNotNull(DATABASEOID, tup, Anum_pg_database_daticulocale); - iculocale = TextDatumGetCString(datum); + datum = SysCacheGetAttrNotNull(DATABASEOID, tup, Anum_pg_database_datlocale); + datlocale = TextDatumGetCString(datum); datum = SysCacheGetAttr(DATABASEOID, tup, Anum_pg_database_daticurules, &isnull); if (!isnull) @@ -436,10 +448,10 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect else icurules = NULL; - make_icu_collator(iculocale, icurules, &default_locale); + make_icu_collator(datlocale, icurules, &default_locale); } else - iculocale = NULL; + datlocale = NULL; default_locale.provider = dbform->datlocprovider; @@ -461,10 +473,16 @@ CheckMyDatabase(const char *name, bool am_superuser, bool override_allow_connect { char *actual_versionstr; char *collversionstr; + char *locale; collversionstr = TextDatumGetCString(datum); - actual_versionstr = get_collation_actual_version(dbform->datlocprovider, dbform->datlocprovider == COLLPROVIDER_ICU ? iculocale : collate); + if (dbform->datlocprovider == COLLPROVIDER_LIBC) + locale = collate; + else + locale = datlocale; + + actual_versionstr = get_collation_actual_version(dbform->datlocprovider, locale); if (!actual_versionstr) /* should not happen */ elog(WARNING, @@ -560,9 +578,9 @@ InitializeMaxBackends(void) { Assert(MaxBackends == 0); - /* the extra unit accounts for the autovacuum launcher */ - MaxBackends = MaxConnections + autovacuum_max_workers + 1 + - max_worker_processes + max_wal_senders; + /* Note that this does not include "auxiliary" processes */ + MaxBackends = MaxConnections + autovacuum_max_workers + + max_worker_processes + max_wal_senders + NUM_SPECIAL_WORKER_PROCS; /* internal error because the values were all checked previously */ if (MaxBackends > MAX_BACKENDS) @@ -681,8 +699,10 @@ BaseInit(void) * Parameters: * in_dbname, dboid: specify database to connect to, as described below * username, useroid: specify role to connect as, as described below - * load_session_libraries: TRUE to honor [session|local]_preload_libraries - * override_allow_connections: TRUE to connect despite !datallowconn + * flags: + * - INIT_PG_LOAD_SESSION_LIBS to honor [session|local]_preload_libraries. + * - INIT_PG_OVERRIDE_ALLOW_CONNS to connect despite !datallowconn. + * - INIT_PG_OVERRIDE_ROLE_LOGIN to connect despite !rolcanlogin. * out_dbname: optional output parameter, see below; pass NULL if not used * * The database can be specified by name, using the in_dbname parameter, or by @@ -701,8 +721,8 @@ BaseInit(void) * database but not a username; conversely, a physical walsender specifies * username but not database. * - * By convention, load_session_libraries should be passed as true in - * "interactive" sessions (including standalone backends), but false in + * By convention, INIT_PG_LOAD_SESSION_LIBS should be passed in "flags" in + * "interactive" sessions (including standalone backends), but not in * background processes such as autovacuum. Note in particular that it * shouldn't be true in parallel worker processes; those have another * mechanism for replicating their leader's set of loaded libraries. @@ -717,8 +737,7 @@ BaseInit(void) void InitPostgres(const char *in_dbname, Oid dboid, const char *username, Oid useroid, - bool load_session_libraries, - bool override_allow_connections, + bits32 flags, char *out_dbname) { bool bootstrap = IsBootstrapProcessingMode(); @@ -739,18 +758,10 @@ InitPostgres(const char *in_dbname, Oid dboid, /* * Initialize my entry in the shared-invalidation manager's array of * per-backend data. - * - * Sets up MyBackendId, a unique backend identifier. */ - MyBackendId = InvalidBackendId; - SharedInvalBackendInit(false); - if (MyBackendId > MaxBackends || MyBackendId <= 0) - elog(FATAL, "bad backend ID: %d", MyBackendId); - - /* Now that we have a BackendId, we can participate in ProcSignal */ - ProcSignalInit(MyBackendId); + ProcSignalInit(); /* * Also set up timeout handlers needed for backend operation. We need @@ -763,6 +774,7 @@ InitPostgres(const char *in_dbname, Oid dboid, RegisterTimeout(LOCK_TIMEOUT, LockTimeoutHandler); RegisterTimeout(IDLE_IN_TRANSACTION_SESSION_TIMEOUT, IdleInTransactionSessionTimeoutHandler); + RegisterTimeout(TRANSACTION_TIMEOUT, TransactionTimeoutHandler); RegisterTimeout(IDLE_SESSION_TIMEOUT, IdleSessionTimeoutHandler); RegisterTimeout(CLIENT_CONNECTION_CHECK_TIMEOUT, ClientCheckTimeoutHandler); RegisterTimeout(IDLE_STATS_UPDATE_TIMEOUT, @@ -832,7 +844,7 @@ InitPostgres(const char *in_dbname, Oid dboid, before_shmem_exit(ShutdownPostgres, 0); /* The autovacuum launcher is done here */ - if (IsAutoVacuumLauncherProcess()) + if (AmAutoVacuumLauncherProcess()) { /* report this backend in the PgBackendStatus array */ pgstat_bestart(); @@ -873,10 +885,11 @@ InitPostgres(const char *in_dbname, Oid dboid, * Perform client authentication if necessary, then figure out our * postgres user ID, and see if we are a superuser. * - * In standalone mode and in autovacuum worker processes, we use a fixed - * ID, otherwise we figure it out from the authenticated user name. + * In standalone mode, autovacuum worker processes and slot sync worker + * process, we use a fixed ID, otherwise we figure it out from the + * authenticated user name. */ - if (bootstrap || IsAutoVacuumWorkerProcess()) + if (bootstrap || AmAutoVacuumWorkerProcess() || AmLogicalSlotSyncWorkerProcess()) { InitializeSessionUserIdStandalone(); am_superuser = true; @@ -892,7 +905,7 @@ InitPostgres(const char *in_dbname, Oid dboid, errhint("You should immediately run CREATE USER \"%s\" SUPERUSER;.", username != NULL ? username : "postgres"))); } - else if (IsBackgroundWorker) + else if (AmBackgroundWorkerProcess()) { if (username == NULL && !OidIsValid(useroid)) { @@ -901,7 +914,8 @@ InitPostgres(const char *in_dbname, Oid dboid, } else { - InitializeSessionUserId(username, useroid); + InitializeSessionUserId(username, useroid, + (flags & INIT_PG_OVERRIDE_ROLE_LOGIN) != 0); am_superuser = superuser(); } } @@ -910,7 +924,7 @@ InitPostgres(const char *in_dbname, Oid dboid, /* normal multiuser case */ Assert(MyProcPort != NULL); PerformAuthentication(MyProcPort); - InitializeSessionUserId(username, useroid); + InitializeSessionUserId(username, useroid, false); /* ensure that auth_method is actually valid, aka authn_id is not NULL */ if (MyClientConnectionInfo.authn_id) InitializeSystemUser(MyClientConnectionInfo.authn_id, @@ -929,17 +943,16 @@ InitPostgres(const char *in_dbname, Oid dboid, } /* - * The last few connection slots are reserved for superusers and roles - * with privileges of pg_use_reserved_connections. Replication - * connections are drawn from slots reserved with max_wal_senders and are - * not limited by max_connections, superuser_reserved_connections, or - * reserved_connections. + * The last few regular connection slots are reserved for superusers and + * roles with privileges of pg_use_reserved_connections. We do not apply + * these limits to background processes, since they all have their own + * pools of PGPROC slots. * * Note: At this point, the new backend has already claimed a proc struct, * so we must check whether the number of free slots is strictly less than * the reserved connection limits. */ - if (!am_superuser && !am_walsender && + if (AmRegularBackendProcess() && !am_superuser && (SuperuserReservedConnections + ReservedConnections) > 0 && !HaveNFreeProcs(SuperuserReservedConnections + ReservedConnections, &nfree)) { @@ -1006,7 +1019,7 @@ InitPostgres(const char *in_dbname, Oid dboid, */ if (bootstrap) { - MyDatabaseId = Template1DbOid; + dboid = Template1DbOid; MyDatabaseTableSpace = DEFAULTTABLESPACE_OID; } else if (in_dbname != NULL) @@ -1020,32 +1033,9 @@ InitPostgres(const char *in_dbname, Oid dboid, (errcode(ERRCODE_UNDEFINED_DATABASE), errmsg("database \"%s\" does not exist", in_dbname))); dbform = (Form_pg_database) GETSTRUCT(tuple); - MyDatabaseId = dbform->oid; - MyDatabaseTableSpace = dbform->dattablespace; - /* take database name from the caller, just for paranoia */ - strlcpy(dbname, in_dbname, sizeof(dbname)); + dboid = dbform->oid; } - else if (OidIsValid(dboid)) - { - /* caller specified database by OID */ - HeapTuple tuple; - Form_pg_database dbform; - - tuple = GetDatabaseTupleByOid(dboid); - if (!HeapTupleIsValid(tuple)) - ereport(FATAL, - (errcode(ERRCODE_UNDEFINED_DATABASE), - errmsg("database %u does not exist", dboid))); - dbform = (Form_pg_database) GETSTRUCT(tuple); - MyDatabaseId = dbform->oid; - MyDatabaseTableSpace = dbform->dattablespace; - Assert(MyDatabaseId == dboid); - strlcpy(dbname, NameStr(dbform->datname), sizeof(dbname)); - /* pass the database name back to the caller */ - if (out_dbname) - strcpy(out_dbname, dbname); - } - else + else if (!OidIsValid(dboid)) { /* * If this is a background worker not bound to any particular @@ -1083,8 +1073,65 @@ InitPostgres(const char *in_dbname, Oid dboid, * CREATE DATABASE. */ if (!bootstrap) - LockSharedObject(DatabaseRelationId, MyDatabaseId, 0, - RowExclusiveLock); + LockSharedObject(DatabaseRelationId, dboid, 0, RowExclusiveLock); + + /* + * Recheck pg_database to make sure the target database hasn't gone away. + * If there was a concurrent DROP DATABASE, this ensures we will die + * cleanly without creating a mess. + */ + if (!bootstrap) + { + HeapTuple tuple; + Form_pg_database datform; + + tuple = GetDatabaseTupleByOid(dboid); + if (HeapTupleIsValid(tuple)) + datform = (Form_pg_database) GETSTRUCT(tuple); + + if (!HeapTupleIsValid(tuple) || + (in_dbname && namestrcmp(&datform->datname, in_dbname))) + { + if (in_dbname) + ereport(FATAL, + (errcode(ERRCODE_UNDEFINED_DATABASE), + errmsg("database \"%s\" does not exist", in_dbname), + errdetail("It seems to have just been dropped or renamed."))); + else + ereport(FATAL, + (errcode(ERRCODE_UNDEFINED_DATABASE), + errmsg("database %u does not exist", dboid))); + } + + strlcpy(dbname, NameStr(datform->datname), sizeof(dbname)); + + if (database_is_invalid_form(datform)) + { + ereport(FATAL, + errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("cannot connect to invalid database \"%s\"", dbname), + errhint("Use DROP DATABASE to drop invalid databases.")); + } + + MyDatabaseTableSpace = datform->dattablespace; + MyDatabaseHasLoginEventTriggers = datform->dathasloginevt; + /* pass the database name back to the caller */ + if (out_dbname) + strcpy(out_dbname, dbname); + } + + /* + * Now that we rechecked, we are certain to be connected to a database and + * thus can set MyDatabaseId. + * + * It is important that MyDatabaseId only be set once we are sure that the + * target database can no longer be concurrently dropped or renamed. For + * example, without this guarantee, pgstat_update_dbstats() could create + * entries for databases that were just dropped in the pgstat shutdown + * callback, which could confuse other code paths like the autovacuum + * scheduler. + */ + MyDatabaseId = dboid; /* * Now we can mark our PGPROC entry with the database ID. @@ -1108,25 +1155,6 @@ InitPostgres(const char *in_dbname, Oid dboid, */ InvalidateCatalogSnapshot(); - /* - * Recheck pg_database to make sure the target database hasn't gone away. - * If there was a concurrent DROP DATABASE, this ensures we will die - * cleanly without creating a mess. - */ - if (!bootstrap) - { - HeapTuple tuple; - - tuple = GetDatabaseTuple(dbname); - if (!HeapTupleIsValid(tuple) || - MyDatabaseId != ((Form_pg_database) GETSTRUCT(tuple))->oid || - MyDatabaseTableSpace != ((Form_pg_database) GETSTRUCT(tuple))->dattablespace) - ereport(FATAL, - (errcode(ERRCODE_UNDEFINED_DATABASE), - errmsg("database \"%s\" does not exist", dbname), - errdetail("It seems to have just been dropped or renamed."))); - } - /* * Now we should be able to access the database directory safely. Verify * it's there and looks reasonable. @@ -1175,7 +1203,8 @@ InitPostgres(const char *in_dbname, Oid dboid, * user is a superuser, so the above stuff has to happen first.) */ if (!bootstrap) - CheckMyDatabase(dbname, am_superuser, override_allow_connections); + CheckMyDatabase(dbname, am_superuser, + (flags & INIT_PG_OVERRIDE_ALLOW_CONNS) != 0); /* * Now process any command-line switches and any additional GUC variable @@ -1213,7 +1242,7 @@ InitPostgres(const char *in_dbname, Oid dboid, * during the initial transaction in case anything that requires database * access needs to be done. */ - if (load_session_libraries) + if ((flags & INIT_PG_LOAD_SESSION_LIBS) != 0) process_session_preload_libraries(); /* report this backend in the PgBackendStatus array */ @@ -1377,6 +1406,14 @@ LockTimeoutHandler(void) kill(MyProcPid, SIGINT); } +static void +TransactionTimeoutHandler(void) +{ + TransactionTimeoutPending = true; + InterruptPending = true; + SetLatch(MyLatch); +} + static void IdleInTransactionSessionTimeoutHandler(void) { diff --git a/src/backend/utils/init/usercontext.c b/src/backend/utils/init/usercontext.c index dd9a0dd6a83f3..9772420e3c237 100644 --- a/src/backend/utils/init/usercontext.c +++ b/src/backend/utils/init/usercontext.c @@ -3,7 +3,7 @@ * usercontext.c * Convenience functions for running code as a different database user. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/utils/mb/Makefile b/src/backend/utils/mb/Makefile index b19a125fa2f32..bbde71b5aaa80 100644 --- a/src/backend/utils/mb/Makefile +++ b/src/backend/utils/mb/Makefile @@ -21,5 +21,5 @@ OBJS = \ include $(top_srcdir)/src/backend/common.mk -clean distclean maintainer-clean: +clean distclean: $(MAKE) -C conversion_procs $@ diff --git a/src/backend/utils/mb/Unicode/Makefile b/src/backend/utils/mb/Unicode/Makefile index 728ccb99c248f..266bc118dc41a 100644 --- a/src/backend/utils/mb/Unicode/Makefile +++ b/src/backend/utils/mb/Unicode/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/backend/utils/mb/Unicode # -# Copyright (c) 2001-2023, PostgreSQL Global Development Group +# Copyright (c) 2001-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/Makefile # @@ -25,8 +25,8 @@ include $(top_builddir)/src/Makefile.global # define the build and clean rules below. # # Note that while each script call produces two output files, to be -# parallel-make safe we need to split this into two rules. (See for -# example gram.y for more explanation.) +# parallel-make safe we need to split this into two rules. (See notes +# in src/backend/parser/Makefile about rules with multiple outputs.) # define map_rule MAPS += $(1)_to_utf8.map utf8_to_$(1).map @@ -66,8 +66,6 @@ all: $(MAPS) distclean: clean rm -f $(TEXTS) - -maintainer-clean: distclean rm -f $(MAPS) diff --git a/src/backend/utils/mb/Unicode/UCS_to_BIG5.pl b/src/backend/utils/mb/Unicode/UCS_to_BIG5.pl index 4c5724b8b7502..6c99f726a8f80 100755 --- a/src/backend/utils/mb/Unicode/UCS_to_BIG5.pl +++ b/src/backend/utils/mb/Unicode/UCS_to_BIG5.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl # -# Copyright (c) 2001-2023, PostgreSQL Global Development Group +# Copyright (c) 2001-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/UCS_to_BIG5.pl # @@ -25,7 +25,7 @@ # # and Unicode name (not used in this script) use strict; -use warnings; +use warnings FATAL => 'all'; use convutils; diff --git a/src/backend/utils/mb/Unicode/UCS_to_EUC_CN.pl b/src/backend/utils/mb/Unicode/UCS_to_EUC_CN.pl index f9ff2bd3d2a79..c3b5bef55aea7 100755 --- a/src/backend/utils/mb/Unicode/UCS_to_EUC_CN.pl +++ b/src/backend/utils/mb/Unicode/UCS_to_EUC_CN.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl # -# Copyright (c) 2007-2023, PostgreSQL Global Development Group +# Copyright (c) 2007-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/UCS_to_GB18030.pl # @@ -14,7 +14,7 @@ # and the "b" field is the hex byte sequence for GB18030 use strict; -use warnings; +use warnings FATAL => 'all'; use convutils; diff --git a/src/backend/utils/mb/Unicode/UCS_to_EUC_JIS_2004.pl b/src/backend/utils/mb/Unicode/UCS_to_EUC_JIS_2004.pl index 2d0e05fb79417..53c5370ace75e 100755 --- a/src/backend/utils/mb/Unicode/UCS_to_EUC_JIS_2004.pl +++ b/src/backend/utils/mb/Unicode/UCS_to_EUC_JIS_2004.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl # -# Copyright (c) 2007-2023, PostgreSQL Global Development Group +# Copyright (c) 2007-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/UCS_to_EUC_JIS_2004.pl # @@ -8,7 +8,7 @@ # "euc-jis-2004-std.txt" (http://x0213.org) use strict; -use warnings; +use warnings FATAL => 'all'; use convutils; diff --git a/src/backend/utils/mb/Unicode/UCS_to_EUC_JP.pl b/src/backend/utils/mb/Unicode/UCS_to_EUC_JP.pl index 4073578027eba..561d355379b94 100755 --- a/src/backend/utils/mb/Unicode/UCS_to_EUC_JP.pl +++ b/src/backend/utils/mb/Unicode/UCS_to_EUC_JP.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl # -# Copyright (c) 2001-2023, PostgreSQL Global Development Group +# Copyright (c) 2001-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/UCS_to_EUC_JP.pl # @@ -12,7 +12,7 @@ # organization's ftp site. use strict; -use warnings; +use warnings FATAL => 'all'; use convutils; diff --git a/src/backend/utils/mb/Unicode/UCS_to_EUC_KR.pl b/src/backend/utils/mb/Unicode/UCS_to_EUC_KR.pl index 9112e1cfe9bf5..32f544f59cddb 100755 --- a/src/backend/utils/mb/Unicode/UCS_to_EUC_KR.pl +++ b/src/backend/utils/mb/Unicode/UCS_to_EUC_KR.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl # -# Copyright (c) 2001-2023, PostgreSQL Global Development Group +# Copyright (c) 2001-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/UCS_to_EUC_KR.pl # @@ -17,7 +17,7 @@ # # and Unicode name (not used in this script) use strict; -use warnings; +use warnings FATAL => 'all'; use convutils; diff --git a/src/backend/utils/mb/Unicode/UCS_to_EUC_TW.pl b/src/backend/utils/mb/Unicode/UCS_to_EUC_TW.pl index 4ad17064abc22..cd54a8f4ec7ca 100755 --- a/src/backend/utils/mb/Unicode/UCS_to_EUC_TW.pl +++ b/src/backend/utils/mb/Unicode/UCS_to_EUC_TW.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl # -# Copyright (c) 2001-2023, PostgreSQL Global Development Group +# Copyright (c) 2001-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/UCS_to_EUC_TW.pl # @@ -18,7 +18,7 @@ # # and Unicode name (not used in this script) use strict; -use warnings; +use warnings FATAL => 'all'; use convutils; diff --git a/src/backend/utils/mb/Unicode/UCS_to_GB18030.pl b/src/backend/utils/mb/Unicode/UCS_to_GB18030.pl index 9c8a983bf7103..68308133b29fb 100755 --- a/src/backend/utils/mb/Unicode/UCS_to_GB18030.pl +++ b/src/backend/utils/mb/Unicode/UCS_to_GB18030.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl # -# Copyright (c) 2007-2023, PostgreSQL Global Development Group +# Copyright (c) 2007-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/UCS_to_GB18030.pl # @@ -14,7 +14,7 @@ # and the "b" field is the hex byte sequence for GB18030 use strict; -use warnings; +use warnings FATAL => 'all'; use convutils; diff --git a/src/backend/utils/mb/Unicode/UCS_to_JOHAB.pl b/src/backend/utils/mb/Unicode/UCS_to_JOHAB.pl index f50baa8f1f423..07ca11d164705 100755 --- a/src/backend/utils/mb/Unicode/UCS_to_JOHAB.pl +++ b/src/backend/utils/mb/Unicode/UCS_to_JOHAB.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl # -# Copyright (c) 2001-2023, PostgreSQL Global Development Group +# Copyright (c) 2001-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/UCS_to_JOHAB.pl # @@ -16,7 +16,7 @@ # # and Unicode name (not used in this script) use strict; -use warnings; +use warnings FATAL => 'all'; use convutils; diff --git a/src/backend/utils/mb/Unicode/UCS_to_SHIFT_JIS_2004.pl b/src/backend/utils/mb/Unicode/UCS_to_SHIFT_JIS_2004.pl index ed010a58facf0..e8e7914cdb521 100755 --- a/src/backend/utils/mb/Unicode/UCS_to_SHIFT_JIS_2004.pl +++ b/src/backend/utils/mb/Unicode/UCS_to_SHIFT_JIS_2004.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl # -# Copyright (c) 2007-2023, PostgreSQL Global Development Group +# Copyright (c) 2007-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/UCS_to_SHIFT_JIS_2004.pl # @@ -8,7 +8,7 @@ # "sjis-0213-2004-std.txt" (http://x0213.org) use strict; -use warnings; +use warnings FATAL => 'all'; use convutils; diff --git a/src/backend/utils/mb/Unicode/UCS_to_SJIS.pl b/src/backend/utils/mb/Unicode/UCS_to_SJIS.pl index 0808c6836b3a1..9b5ab429afaed 100755 --- a/src/backend/utils/mb/Unicode/UCS_to_SJIS.pl +++ b/src/backend/utils/mb/Unicode/UCS_to_SJIS.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl # -# Copyright (c) 2001-2023, PostgreSQL Global Development Group +# Copyright (c) 2001-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/UCS_to_SJIS.pl # @@ -11,7 +11,7 @@ # ftp site. use strict; -use warnings; +use warnings FATAL => 'all'; use convutils; diff --git a/src/backend/utils/mb/Unicode/UCS_to_UHC.pl b/src/backend/utils/mb/Unicode/UCS_to_UHC.pl index 207677d76dc22..37ca3fcace7ae 100755 --- a/src/backend/utils/mb/Unicode/UCS_to_UHC.pl +++ b/src/backend/utils/mb/Unicode/UCS_to_UHC.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl # -# Copyright (c) 2007-2023, PostgreSQL Global Development Group +# Copyright (c) 2007-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/UCS_to_GB18030.pl # @@ -14,7 +14,7 @@ # and the "b" field is the hex byte sequence for UHC use strict; -use warnings; +use warnings FATAL => 'all'; use convutils; diff --git a/src/backend/utils/mb/Unicode/UCS_to_most.pl b/src/backend/utils/mb/Unicode/UCS_to_most.pl index a1947308ffa3a..50f54d6832e9a 100755 --- a/src/backend/utils/mb/Unicode/UCS_to_most.pl +++ b/src/backend/utils/mb/Unicode/UCS_to_most.pl @@ -1,6 +1,6 @@ #! /usr/bin/perl # -# Copyright (c) 2001-2023, PostgreSQL Global Development Group +# Copyright (c) 2001-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/UCS_to_most.pl # @@ -16,7 +16,7 @@ # # and Unicode name (not used in this script) use strict; -use warnings; +use warnings FATAL => 'all'; use convutils; diff --git a/src/backend/utils/mb/Unicode/convutils.pm b/src/backend/utils/mb/Unicode/convutils.pm index 77de7b1a4d746..ee780acbe386f 100644 --- a/src/backend/utils/mb/Unicode/convutils.pm +++ b/src/backend/utils/mb/Unicode/convutils.pm @@ -1,12 +1,12 @@ # -# Copyright (c) 2001-2023, PostgreSQL Global Development Group +# Copyright (c) 2001-2024, PostgreSQL Global Development Group # # src/backend/utils/mb/Unicode/convutils.pm package convutils; use strict; -use warnings; +use warnings FATAL => 'all'; use Carp; use Exporter 'import'; diff --git a/src/backend/utils/mb/conv.c b/src/backend/utils/mb/conv.c index 82bc1ac6af37e..cc539bf439c17 100644 --- a/src/backend/utils/mb/conv.c +++ b/src/backend/utils/mb/conv.c @@ -2,7 +2,7 @@ * * Utility functions for conversion procs. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/Makefile b/src/backend/utils/mb/conversion_procs/Makefile index 5d34f3def4738..8ee4642a179ea 100644 --- a/src/backend/utils/mb/conversion_procs/Makefile +++ b/src/backend/utils/mb/conversion_procs/Makefile @@ -2,7 +2,7 @@ # # Makefile for backend/utils/mb/conversion_procs # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/backend/utils/mb/conversion_procs/Makefile diff --git a/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c b/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c index 7df3725a8bad4..aa61902a82588 100644 --- a/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c +++ b/src/backend/utils/mb/conversion_procs/cyrillic_and_mic/cyrillic_and_mic.c @@ -2,7 +2,7 @@ * * Cyrillic and MULE_INTERNAL * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/euc2004_sjis2004/euc2004_sjis2004.c b/src/backend/utils/mb/conversion_procs/euc2004_sjis2004/euc2004_sjis2004.c index bae2468166815..8f5fa90070731 100644 --- a/src/backend/utils/mb/conversion_procs/euc2004_sjis2004/euc2004_sjis2004.c +++ b/src/backend/utils/mb/conversion_procs/euc2004_sjis2004/euc2004_sjis2004.c @@ -2,7 +2,7 @@ * * EUC_JIS_2004, SHIFT_JIS_2004 * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/mb/conversion_procs/euc2004_sjis2004/euc2004_sjis2004.c diff --git a/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c b/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c index ab3c5150dcfd5..9551761a7570a 100644 --- a/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c +++ b/src/backend/utils/mb/conversion_procs/euc_cn_and_mic/euc_cn_and_mic.c @@ -2,7 +2,7 @@ * * EUC_CN and MULE_INTERNAL * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c b/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c index bd2ed0a66adb6..daf6eac97498f 100644 --- a/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c +++ b/src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/euc_jp_and_sjis.c @@ -2,7 +2,7 @@ * * EUC_JP, SJIS and MULE_INTERNAL * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c b/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c index a15c6de23a3d7..631766898f734 100644 --- a/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c +++ b/src/backend/utils/mb/conversion_procs/euc_kr_and_mic/euc_kr_and_mic.c @@ -2,7 +2,7 @@ * * EUC_KR and MULE_INTERNAL * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c b/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c index 89ab5d1157199..ed71678c989a4 100644 --- a/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c +++ b/src/backend/utils/mb/conversion_procs/euc_tw_and_big5/euc_tw_and_big5.c @@ -2,7 +2,7 @@ * * EUC_TW, BIG5 and MULE_INTERNAL * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -15,8 +15,6 @@ #include "fmgr.h" #include "mb/pg_wchar.h" -#define ENCODING_GROWTH_RATE 4 - PG_MODULE_MAGIC; PG_FUNCTION_INFO_V1(euc_tw_to_big5); diff --git a/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c b/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c index 9c33a1e085ed9..a2f6c3f7236fe 100644 --- a/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c +++ b/src/backend/utils/mb/conversion_procs/latin2_and_win1250/latin2_and_win1250.c @@ -2,7 +2,7 @@ * * LATIN2 and WIN1250 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c b/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c index 22c3b5d97aa79..e00aa382284d8 100644 --- a/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c +++ b/src/backend/utils/mb/conversion_procs/latin_and_mic/latin_and_mic.c @@ -2,7 +2,7 @@ * * LATINn and MULE_INTERNAL * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/meson.build b/src/backend/utils/mb/conversion_procs/meson.build index b79b97ad51379..df2db81e51bf8 100644 --- a/src/backend/utils/mb/conversion_procs/meson.build +++ b/src/backend/utils/mb/conversion_procs/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group encodings = { 'cyrillic_and_mic': ['cyrillic_and_mic/cyrillic_and_mic.c'], diff --git a/src/backend/utils/mb/conversion_procs/proc.mk b/src/backend/utils/mb/conversion_procs/proc.mk index e0a3b74b25efa..2eeae28240987 100644 --- a/src/backend/utils/mb/conversion_procs/proc.mk +++ b/src/backend/utils/mb/conversion_procs/proc.mk @@ -13,5 +13,5 @@ installdirs: installdirs-lib uninstall: uninstall-lib -clean distclean maintainer-clean: clean-lib +clean distclean: clean-lib rm -f $(OBJS) diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c b/src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c index f73f90569eca8..62643aaa296d5 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_big5/utf8_and_big5.c @@ -2,7 +2,7 @@ * * BIG5 <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c b/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c index 8276e9aabfa43..9672954c8b944 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/utf8_and_cyrillic.c @@ -2,7 +2,7 @@ * * UTF8 and Cyrillic * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc2004/utf8_and_euc2004.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc2004/utf8_and_euc2004.c index eb4ff2c4132f7..25bc45cf378a2 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_euc2004/utf8_and_euc2004.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc2004/utf8_and_euc2004.c @@ -2,7 +2,7 @@ * * EUC_JIS_2004 <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c index 59fc41db34a51..3f5d2f3cb7344 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/utf8_and_euc_cn.c @@ -2,7 +2,7 @@ * * EUC_CN <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c index 2629c42cfe816..837e7e98e918a 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/utf8_and_euc_jp.c @@ -2,7 +2,7 @@ * * EUC_JP <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c index be8acc5706fc8..7ad7f26397749 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/utf8_and_euc_kr.c @@ -2,7 +2,7 @@ * * EUC_KR <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c b/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c index 3fc0ef28b5695..9e56f1fe249f9 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/utf8_and_euc_tw.c @@ -2,7 +2,7 @@ * * EUC_TW <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c b/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c index f24afa0eaeaf4..c64c6d2b313e3 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_gb18030/utf8_and_gb18030.c @@ -2,7 +2,7 @@ * * GB18030 <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c b/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c index fb77622d76b3c..696d741e91aff 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_gbk/utf8_and_gbk.c @@ -2,7 +2,7 @@ * * GBK <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c index 6dbfec792ed7e..20558de029eb4 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859/utf8_and_iso8859.c @@ -2,7 +2,7 @@ * * ISO 8859 2-16 <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/utf8_and_iso8859_1.c b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/utf8_and_iso8859_1.c index 37b00db3cd46b..45d1504098285 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/utf8_and_iso8859_1.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/utf8_and_iso8859_1.c @@ -2,7 +2,7 @@ * * ISO8859_1 <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c b/src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c index 74606d9b44820..a0c13ae228b46 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_johab/utf8_and_johab.c @@ -2,7 +2,7 @@ * * JOHAB <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c b/src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c index 0a25df86e081b..e619fd932d4b3 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_sjis/utf8_and_sjis.c @@ -2,7 +2,7 @@ * * SJIS <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/utf8_and_sjis2004.c b/src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/utf8_and_sjis2004.c index ce81f60eed896..5078475762ccf 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/utf8_and_sjis2004.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_sjis2004/utf8_and_sjis2004.c @@ -2,7 +2,7 @@ * * SHIFT_JIS_2004 <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c b/src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c index 352cac96c874f..d6475c2197baa 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_uhc/utf8_and_uhc.c @@ -2,7 +2,7 @@ * * UHC <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c b/src/backend/utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c index 7dc71da4dfb0d..e813d894f96c8 100644 --- a/src/backend/utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c +++ b/src/backend/utils/mb/conversion_procs/utf8_and_win/utf8_and_win.c @@ -2,7 +2,7 @@ * * WIN <--> UTF8 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c index 67a1ab2ab23b7..97a4d6951598d 100644 --- a/src/backend/utils/mb/mbutils.c +++ b/src/backend/utils/mb/mbutils.c @@ -23,7 +23,7 @@ * the result is validly encoded according to the destination encoding. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -37,9 +37,8 @@ #include "access/xact.h" #include "catalog/namespace.h" #include "mb/pg_wchar.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/memutils.h" -#include "utils/syscache.h" #include "varatt.h" /* @@ -585,19 +584,19 @@ pg_convert(PG_FUNCTION_ARGS) src_encoding, dest_encoding); - /* update len if conversion actually happened */ - if (dest_str != src_str) - len = strlen(dest_str); + + /* return source string if no conversion happened */ + if (dest_str == src_str) + PG_RETURN_BYTEA_P(string); /* * build bytea data type structure. */ + len = strlen(dest_str); retval = (bytea *) palloc(len + VARHDRSZ); SET_VARSIZE(retval, len + VARHDRSZ); memcpy(VARDATA(retval), dest_str, len); - - if (dest_str != src_str) - pfree(dest_str); + pfree(dest_str); /* free memory if allocated by the toaster */ PG_FREE_IF_COPY(string, 0); @@ -1088,7 +1087,7 @@ pg_mbcliplen(const char *mbstr, int len, int limit) } /* - * pg_mbcliplen with specified encoding + * pg_mbcliplen with specified encoding; string must be valid in encoding */ int pg_encoding_mbcliplen(int encoding, const char *mbstr, @@ -1188,24 +1187,18 @@ static bool raw_pg_bind_textdomain_codeset(const char *domainname, int encoding) { bool elog_ok = (CurrentMemoryContext != NULL); - int i; - for (i = 0; pg_enc2gettext_tbl[i].name != NULL; i++) - { - if (pg_enc2gettext_tbl[i].encoding == encoding) - { - if (bind_textdomain_codeset(domainname, - pg_enc2gettext_tbl[i].name) != NULL) - return true; + if (!PG_VALID_ENCODING(encoding) || pg_enc2gettext_tbl[encoding] == NULL) + return false; - if (elog_ok) - elog(LOG, "bind_textdomain_codeset failed"); - else - write_stderr("bind_textdomain_codeset failed"); + if (bind_textdomain_codeset(domainname, + pg_enc2gettext_tbl[encoding]) != NULL) + return true; - break; - } - } + if (elog_ok) + elog(LOG, "bind_textdomain_codeset failed"); + else + write_stderr("bind_textdomain_codeset failed"); return false; } @@ -1699,12 +1692,12 @@ check_encoding_conversion_args(int src_encoding, * report_invalid_encoding: complain about invalid multibyte character * * note: len is remaining length of string, not length of character; - * len must be greater than zero, as we always examine the first byte. + * len must be greater than zero (or we'd neglect initializing "buf"). */ void report_invalid_encoding(int encoding, const char *mbstr, int len) { - int l = pg_encoding_mblen(encoding, mbstr); + int l = pg_encoding_mblen_or_incomplete(encoding, mbstr, len); char buf[8 * 5 + 1]; char *p = buf; int j, @@ -1731,18 +1724,26 @@ report_invalid_encoding(int encoding, const char *mbstr, int len) * report_untranslatable_char: complain about untranslatable character * * note: len is remaining length of string, not length of character; - * len must be greater than zero, as we always examine the first byte. + * len must be greater than zero (or we'd neglect initializing "buf"). */ void report_untranslatable_char(int src_encoding, int dest_encoding, const char *mbstr, int len) { - int l = pg_encoding_mblen(src_encoding, mbstr); + int l; char buf[8 * 5 + 1]; char *p = buf; int j, jlimit; + /* + * We probably could use plain pg_encoding_mblen(), because + * gb18030_to_utf8() verifies before it converts. All conversions should. + * For src_encoding!=GB18030, len>0 meets pg_encoding_mblen() needs. Even + * so, be defensive, since a buggy conversion might pass invalid data. + * This is not a performance-critical path. + */ + l = pg_encoding_mblen_or_incomplete(src_encoding, mbstr, len); jlimit = Min(l, len); jlimit = Min(jlimit, 8); /* prevent buffer overrun */ diff --git a/src/backend/utils/mb/meson.build b/src/backend/utils/mb/meson.build index fd6d168a53026..700b705901743 100644 --- a/src/backend/utils/mb/meson.build +++ b/src/backend/utils/mb/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'conv.c', diff --git a/src/backend/utils/mb/stringinfo_mb.c b/src/backend/utils/mb/stringinfo_mb.c index 67a958d72bee1..241a6c2562cef 100644 --- a/src/backend/utils/mb/stringinfo_mb.c +++ b/src/backend/utils/mb/stringinfo_mb.c @@ -8,7 +8,7 @@ * code. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,8 +19,8 @@ */ #include "postgres.h" -#include "mb/stringinfo_mb.h" #include "mb/pg_wchar.h" +#include "mb/stringinfo_mb.h" /* diff --git a/src/backend/utils/meson.build b/src/backend/utils/meson.build index 6239d6cddffd2..98db199c8cdf0 100644 --- a/src/backend/utils/meson.build +++ b/src/backend/utils/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group install_data('errcodes.txt', install_dir: dir_data, diff --git a/src/backend/utils/misc/Makefile b/src/backend/utils/misc/Makefile index 2910032930032..d9f59785b9824 100644 --- a/src/backend/utils/misc/Makefile +++ b/src/backend/utils/misc/Makefile @@ -21,6 +21,7 @@ OBJS = \ guc_funcs.o \ guc_tables.o \ help_config.o \ + injection_point.o \ pg_config.o \ pg_controldata.o \ pg_rusage.o \ @@ -40,6 +41,5 @@ endif include $(top_srcdir)/src/backend/common.mk -# Note: guc-file.c is not deleted by 'make clean', -# since we want to ship it in distribution tarballs. clean: + rm -f guc-file.c diff --git a/src/backend/utils/misc/conffiles.c b/src/backend/utils/misc/conffiles.c index 376a5c885bbcb..be38f938610c0 100644 --- a/src/backend/utils/misc/conffiles.c +++ b/src/backend/utils/misc/conffiles.c @@ -7,7 +7,7 @@ * used by PostgreSQL, be they related to GUCs or authentication. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/misc/guc-file.l b/src/backend/utils/misc/guc-file.l index 41d62a9f23308..73be80076da73 100644 --- a/src/backend/utils/misc/guc-file.l +++ b/src/backend/utils/misc/guc-file.l @@ -2,7 +2,7 @@ /* * Scanner for the configuration file * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/backend/utils/misc/guc-file.l */ diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 5308896c87fbd..0831d45aba3ac 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -14,7 +14,7 @@ * See src/backend/utils/misc/README for more information. * * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * Written by Peter Eisentraut . * * IDENTIFICATION @@ -25,6 +25,7 @@ #include "postgres.h" #include +#include #include #include @@ -35,6 +36,8 @@ #include "catalog/pg_parameter_acl.h" #include "guc_internal.h" #include "libpq/pqformat.h" +#include "libpq/protocol.h" +#include "miscadmin.h" #include "parser/scansup.h" #include "port/pg_bitutils.h" #include "storage/fd.h" @@ -42,10 +45,8 @@ #include "storage/shmem.h" #include "tcop/tcopprot.h" #include "utils/acl.h" -#include "utils/backend_status.h" #include "utils/builtins.h" #include "utils/conffiles.h" -#include "utils/float.h" #include "utils/guc_tables.h" #include "utils/memutils.h" #include "utils/timestamp.h" @@ -66,6 +67,12 @@ */ #define REALTYPE_PRECISION 17 +/* + * Safe search path when executing code as the table owner, such as during + * maintenance operations. + */ +#define GUC_SAFE_SEARCH_PATH "pg_catalog, pg_temp" + static int GUC_check_errcode_value; static List *reserved_class_prefix = NIL; @@ -112,7 +119,7 @@ typedef struct #error XLOG_BLCKSZ must be between 1KB and 1MB #endif -static const char *memory_units_hint = gettext_noop("Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"."); +static const char *const memory_units_hint = gettext_noop("Valid units for this parameter are \"B\", \"kB\", \"MB\", \"GB\", and \"TB\"."); static const unit_conversion memory_unit_conversion_table[] = { @@ -149,7 +156,7 @@ static const unit_conversion memory_unit_conversion_table[] = {""} /* end of table marker */ }; -static const char *time_units_hint = gettext_noop("Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"."); +static const char *const time_units_hint = gettext_noop("Valid units for this parameter are \"us\", \"ms\", \"s\", \"min\", \"h\", and \"d\"."); static const unit_conversion time_unit_conversion_table[] = { @@ -250,6 +257,8 @@ static void write_auto_conf_file(int fd, const char *filename, ConfigVariable *h static void replace_auto_config_value(ConfigVariable **head_p, ConfigVariable **tail_p, const char *name, const char *value); static bool valid_custom_variable_name(const char *name); +static bool assignable_custom_variable_name(const char *name, bool skip_errors, + int elevel); static void do_serialize(char **destptr, Size *maxbytes, const char *fmt,...) pg_attribute_printf(3, 4); static bool call_bool_check_hook(struct config_bool *conf, bool *newval, @@ -1063,7 +1072,7 @@ add_guc_variable(struct config_generic *var, int elevel) * * It must be two or more identifiers separated by dots, where the rules * for what is an identifier agree with scan.l. (If you change this rule, - * adjust the errdetail in find_option().) + * adjust the errdetail in assignable_custom_variable_name().) */ static bool valid_custom_variable_name(const char *name) @@ -1098,6 +1107,71 @@ valid_custom_variable_name(const char *name) return saw_sep; } +/* + * Decide whether an unrecognized variable name is allowed to be SET. + * + * It must pass the syntactic rules of valid_custom_variable_name(), + * and it must not be in any namespace already reserved by an extension. + * (We make this separate from valid_custom_variable_name() because we don't + * apply the reserved-namespace test when reading configuration files.) + * + * If valid, return true. Otherwise, return false if skip_errors is true, + * else throw a suitable error at the specified elevel (and return false + * if that's less than ERROR). + */ +static bool +assignable_custom_variable_name(const char *name, bool skip_errors, int elevel) +{ + /* If there's no separator, it can't be a custom variable */ + const char *sep = strchr(name, GUC_QUALIFIER_SEPARATOR); + + if (sep != NULL) + { + size_t classLen = sep - name; + ListCell *lc; + + /* The name must be syntactically acceptable ... */ + if (!valid_custom_variable_name(name)) + { + if (!skip_errors) + ereport(elevel, + (errcode(ERRCODE_INVALID_NAME), + errmsg("invalid configuration parameter name \"%s\"", + name), + errdetail("Custom parameter names must be two or more simple identifiers separated by dots."))); + return false; + } + /* ... and it must not match any previously-reserved prefix */ + foreach(lc, reserved_class_prefix) + { + const char *rcprefix = lfirst(lc); + + if (strlen(rcprefix) == classLen && + strncmp(name, rcprefix, classLen) == 0) + { + if (!skip_errors) + ereport(elevel, + (errcode(ERRCODE_INVALID_NAME), + errmsg("invalid configuration parameter name \"%s\"", + name), + errdetail("\"%s\" is a reserved prefix.", + rcprefix))); + return false; + } + } + /* OK to create it */ + return true; + } + + /* Unrecognized single-part name */ + if (!skip_errors) + ereport(elevel, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("unrecognized configuration parameter \"%s\"", + name))); + return false; +} + /* * Create and add a placeholder variable for a custom variable name. */ @@ -1191,52 +1265,15 @@ find_option(const char *name, bool create_placeholders, bool skip_errors, if (create_placeholders) { /* - * Check if the name is valid, and if so, add a placeholder. If it - * doesn't contain a separator, don't assume that it was meant to be a - * placeholder. + * Check if the name is valid, and if so, add a placeholder. */ - const char *sep = strchr(name, GUC_QUALIFIER_SEPARATOR); - - if (sep != NULL) - { - size_t classLen = sep - name; - ListCell *lc; - - /* The name must be syntactically acceptable ... */ - if (!valid_custom_variable_name(name)) - { - if (!skip_errors) - ereport(elevel, - (errcode(ERRCODE_INVALID_NAME), - errmsg("invalid configuration parameter name \"%s\"", - name), - errdetail("Custom parameter names must be two or more simple identifiers separated by dots."))); - return NULL; - } - /* ... and it must not match any previously-reserved prefix */ - foreach(lc, reserved_class_prefix) - { - const char *rcprefix = lfirst(lc); - - if (strlen(rcprefix) == classLen && - strncmp(name, rcprefix, classLen) == 0) - { - if (!skip_errors) - ereport(elevel, - (errcode(ERRCODE_INVALID_NAME), - errmsg("invalid configuration parameter name \"%s\"", - name), - errdetail("\"%s\" is a reserved prefix.", - rcprefix))); - return NULL; - } - } - /* OK, create it */ + if (assignable_custom_variable_name(name, skip_errors, elevel)) return add_placeholder_variable(name, elevel); - } + else + return NULL; /* error message, if any, already emitted */ } - /* Unknown name */ + /* Unknown name and we're not supposed to make a placeholder */ if (!skip_errors) ereport(elevel, (errcode(ERRCODE_UNDEFINED_OBJECT), @@ -1252,10 +1289,10 @@ find_option(const char *name, bool create_placeholders, bool skip_errors, static int guc_var_compare(const void *a, const void *b) { - const struct config_generic *confa = *(struct config_generic *const *) a; - const struct config_generic *confb = *(struct config_generic *const *) b; + const char *namea = **(const char **const *) a; + const char *nameb = **(const char **const *) b; - return guc_name_compare(confa->name, confb->name); + return guc_name_compare(namea, nameb); } /* @@ -1369,18 +1406,16 @@ convert_GUC_name_for_parameter_acl(const char *name) /* * Check whether we should allow creation of a pg_parameter_acl entry * for the given name. (This can be applied either before or after - * canonicalizing it.) + * canonicalizing it.) Throws error if not. */ -bool +void check_GUC_name_for_parameter_acl(const char *name) { /* OK if the GUC exists. */ - if (find_option(name, false, true, DEBUG1) != NULL) - return true; + if (find_option(name, false, true, DEBUG5) != NULL) + return; /* Otherwise, it'd better be a valid custom GUC name. */ - if (valid_custom_variable_name(name)) - return true; - return false; + (void) assignable_custom_variable_name(name, false, ERROR); } /* @@ -1445,7 +1480,9 @@ check_GUC_init(struct config_generic *gconf) { struct config_string *conf = (struct config_string *) gconf; - if (*conf->variable != NULL && strcmp(*conf->variable, conf->boot_val) != 0) + if (*conf->variable != NULL && + (conf->boot_val == NULL || + strcmp(*conf->variable, conf->boot_val) != 0)) { elog(LOG, "GUC (PGC_STRING) %s, boot_val=%s, C-var=%s", conf->gen.name, conf->boot_val ? conf->boot_val : "", *conf->variable); @@ -1762,10 +1799,9 @@ SelectConfigFiles(const char *userDoption, const char *progname) if (configdir && stat(configdir, &stat_buf) != 0) { - write_stderr("%s: could not access directory \"%s\": %s\n", + write_stderr("%s: could not access directory \"%s\": %m\n", progname, - configdir, - strerror(errno)); + configdir); if (errno == ENOENT) write_stderr("Run initdb or pg_basebackup to initialize a PostgreSQL data directory.\n"); return false; @@ -1814,8 +1850,8 @@ SelectConfigFiles(const char *userDoption, const char *progname) */ if (stat(ConfigFileName, &stat_buf) != 0) { - write_stderr("%s: could not access the server configuration file \"%s\": %s\n", - progname, ConfigFileName, strerror(errno)); + write_stderr("%s: could not access the server configuration file \"%s\": %m\n", + progname, ConfigFileName); free(configdir); return false; } @@ -2203,6 +2239,19 @@ NewGUCNestLevel(void) return ++GUCNestLevel; } +/* + * Set search_path to a fixed value for maintenance operations. No effect + * during bootstrap, when the search_path is already set to a fixed value and + * cannot be changed. + */ +void +RestrictSearchPath(void) +{ + if (!IsBootstrapProcessingMode()) + set_config_option("search_path", GUC_SAFE_SEARCH_PATH, PGC_USERSET, + PGC_S_SESSION, GUC_ACTION_SAVE, true, 0, false); +} + /* * Do GUC processing at transaction or subtransaction commit or abort, or * when exiting a function that has proconfig settings, or when undoing a @@ -2593,7 +2642,7 @@ ReportGUCOption(struct config_generic *record) { StringInfoData msgbuf; - pq_beginmessage(&msgbuf, 'S'); + pq_beginmessage(&msgbuf, PqMsg_ParameterStatus); pq_sendstring(&msgbuf, record->name); pq_sendstring(&msgbuf, val); pq_endmessage(&msgbuf); @@ -3124,15 +3173,20 @@ parse_and_validate_value(struct config_generic *record, if (newval->intval < conf->min || newval->intval > conf->max) { const char *unit = get_config_unit_name(conf->gen.flags); + const char *unitspace; + + if (unit) + unitspace = " "; + else + unit = unitspace = ""; ereport(elevel, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("%d%s%s is outside the valid range for parameter \"%s\" (%d .. %d)", - newval->intval, - unit ? " " : "", - unit ? unit : "", + errmsg("%d%s%s is outside the valid range for parameter \"%s\" (%d%s%s .. %d%s%s)", + newval->intval, unitspace, unit, name, - conf->min, conf->max))); + conf->min, unitspace, unit, + conf->max, unitspace, unit))); return false; } @@ -3160,15 +3214,20 @@ parse_and_validate_value(struct config_generic *record, if (newval->realval < conf->min || newval->realval > conf->max) { const char *unit = get_config_unit_name(conf->gen.flags); + const char *unitspace; + + if (unit) + unitspace = " "; + else + unit = unitspace = ""; ereport(elevel, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("%g%s%s is outside the valid range for parameter \"%s\" (%g .. %g)", - newval->realval, - unit ? " " : "", - unit ? unit : "", + errmsg("%g%s%s is outside the valid range for parameter \"%s\" (%g%s%s .. %g%s%s)", + newval->realval, unitspace, unit, name, - conf->min, conf->max))); + conf->min, unitspace, unit, + conf->max, unitspace, unit))); return false; } @@ -3268,10 +3327,12 @@ parse_and_validate_value(struct config_generic *record, * * Return value: * +1: the value is valid and was successfully applied. - * 0: the name or value is invalid (but see below). - * -1: the value was not applied because of context, priority, or changeVal. + * 0: the name or value is invalid, or it's invalid to try to set + * this GUC now; but elevel was less than ERROR (see below). + * -1: no error detected, but the value was not applied, either + * because changeVal is false or there is some overriding setting. * - * If there is an error (non-existing option, invalid value) then an + * If there is an error (non-existing option, invalid value, etc) then an * ereport(ERROR) is thrown *unless* this is called for a source for which * we don't want an ERROR (currently, those are defaults, the config file, * and per-database or per-user settings, as well as callers who specify @@ -3299,10 +3360,10 @@ set_config_option(const char *name, const char *value, else srole = BOOTSTRAP_SUPERUSERID; - return set_config_option_ext(name, value, - context, source, srole, - action, changeVal, elevel, - is_reload); + return set_config_with_handle(name, NULL, value, + context, source, srole, + action, changeVal, elevel, + is_reload); } /* @@ -3325,6 +3386,30 @@ set_config_option_ext(const char *name, const char *value, GucContext context, GucSource source, Oid srole, GucAction action, bool changeVal, int elevel, bool is_reload) +{ + return set_config_with_handle(name, NULL, value, + context, source, srole, + action, changeVal, elevel, + is_reload); +} + + +/* + * set_config_with_handle: sets option `name' to given value. + * + * This API adds the ability to pass a 'handle' argument, which can be + * obtained by the caller from get_config_handle(). NULL has no effect, + * but a non-null value avoids the need to search the GUC tables. + * + * This should be used by callers which repeatedly set the same config + * option(s), and want to avoid the overhead of a hash lookup each time. + */ +int +set_config_with_handle(const char *name, config_handle *handle, + const char *value, + GucContext context, GucSource source, Oid srole, + GucAction action, bool changeVal, int elevel, + bool is_reload) { struct config_generic *record; union config_var_val newval_union; @@ -3351,6 +3436,16 @@ set_config_option_ext(const char *name, const char *value, elevel = ERROR; } + /* if handle is specified, no need to look up option */ + if (!handle) + { + record = find_option(name, true, false, elevel); + if (record == NULL) + return 0; + } + else + record = handle; + /* * GUC_ACTION_SAVE changes are acceptable during a parallel operation, * because the current worker will also pop the change. We're probably @@ -3358,16 +3453,19 @@ set_config_option_ext(const char *name, const char *value, * body should observe the change, and peer workers do not share in the * execution of a function call started by this worker. * + * Also allow normal setting if the GUC is marked GUC_ALLOW_IN_PARALLEL. + * * Other changes might need to affect other workers, so forbid them. */ - if (IsInParallelMode() && changeVal && action != GUC_ACTION_SAVE) + if (IsInParallelMode() && changeVal && action != GUC_ACTION_SAVE && + (record->flags & GUC_ALLOW_IN_PARALLEL) == 0) + { ereport(elevel, (errcode(ERRCODE_INVALID_TRANSACTION_STATE), - errmsg("cannot set parameters during a parallel operation"))); - - record = find_option(name, true, false, elevel); - if (record == NULL) + errmsg("parameter \"%s\" cannot be set during a parallel operation", + name))); return 0; + } /* * Check if the option can be set at this time. See guc.h for the precise @@ -3458,6 +3556,10 @@ set_config_option_ext(const char *name, const char *value, * backends. This is a tad klugy, but necessary because we * don't re-read the config file during backend start. * + * However, if changeVal is false then plow ahead anyway since + * we are trying to find out if the value is potentially good, + * not actually use it. + * * In EXEC_BACKEND builds, this works differently: we load all * non-default settings from the CONFIG_EXEC_PARAMS file * during backend start. In that case we must accept @@ -3468,7 +3570,7 @@ set_config_option_ext(const char *name, const char *value, * started it. is_reload will be true when either situation * applies. */ - if (IsUnderPostmaster && !is_reload) + if (IsUnderPostmaster && changeVal && !is_reload) return -1; } else if (context != PGC_POSTMASTER && @@ -3900,6 +4002,9 @@ set_config_option_ext(const char *name, const char *value, case PGC_STRING: { struct config_string *conf = (struct config_string *) record; + GucContext orig_context = context; + GucSource orig_source = source; + Oid orig_srole = srole; #define newval (newval_union.stringval) @@ -3985,6 +4090,44 @@ set_config_option_ext(const char *name, const char *value, set_guc_source(&conf->gen, source); conf->gen.scontext = context; conf->gen.srole = srole; + + /* + * Ugly hack: during SET session_authorization, forcibly + * do SET ROLE NONE with the same context/source/etc, so + * that the effects will have identical lifespan. This is + * required by the SQL spec, and it's not possible to do + * it within the variable's check hook or assign hook + * because our APIs for those don't pass enough info. + * However, don't do it if is_reload: in that case we + * expect that if "role" isn't supposed to be default, it + * has been or will be set by a separate reload action. + * + * Also, for the call from InitializeSessionUserId with + * source == PGC_S_OVERRIDE, use PGC_S_DYNAMIC_DEFAULT for + * "role"'s source, so that it's still possible to set + * "role" from pg_db_role_setting entries. (See notes in + * InitializeSessionUserId before changing this.) + * + * A fine point: for RESET session_authorization, we do + * "RESET role" not "SET ROLE NONE" (by passing down NULL + * rather than "none" for the value). This would have the + * same effects in typical cases, but if the reset value + * of "role" is not "none" it seems better to revert to + * that. + */ + if (!is_reload && + strcmp(conf->gen.name, "session_authorization") == 0) + (void) set_config_with_handle("role", NULL, + value ? "none" : NULL, + orig_context, + (orig_source == PGC_S_OVERRIDE) + ? PGC_S_DYNAMIC_DEFAULT + : orig_source, + orig_srole, + action, + true, + elevel, + false); } if (makeDefault) @@ -4136,6 +4279,22 @@ set_config_option_ext(const char *name, const char *value, } +/* + * Retrieve a config_handle for the given name, suitable for calling + * set_config_with_handle(). Only return handle to permanent GUC. + */ +config_handle * +get_config_handle(const char *name) +{ + struct config_generic *gen = find_option(name, false, false, 0); + + if (gen && ((gen->flags & GUC_CUSTOM_PLACEHOLDER) == 0)) + return gen; + + return NULL; +} + + /* * Set the fields for source file and line number the setting came from. */ @@ -4185,8 +4344,7 @@ SetConfigOption(const char *name, const char *value, /* * Fetch the current value of the option `name', as a string. * - * If the option doesn't exist, return NULL if missing_ok is true (NOTE that - * this cannot be distinguished from a string variable with a NULL value!), + * If the option doesn't exist, return NULL if missing_ok is true, * otherwise throw an ereport and don't return. * * If restrict_privileged is true, we also enforce that only superusers and @@ -4229,7 +4387,8 @@ GetConfigOption(const char *name, bool missing_ok, bool restrict_privileged) return buffer; case PGC_STRING: - return *((struct config_string *) record)->variable; + return *((struct config_string *) record)->variable ? + *((struct config_string *) record)->variable : ""; case PGC_ENUM: return config_enum_lookup_by_value((struct config_enum *) record, @@ -4276,7 +4435,8 @@ GetConfigOptionResetString(const char *name) return buffer; case PGC_STRING: - return ((struct config_string *) record)->reset_val; + return ((struct config_string *) record)->reset_val ? + ((struct config_string *) record)->reset_val : ""; case PGC_ENUM: return config_enum_lookup_by_value((struct config_enum *) record, @@ -4463,6 +4623,11 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt) */ name = altersysstmt->setstmt->name; + if (!AllowAlterSystem) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("ALTER SYSTEM is not allowed in this environment"))); + switch (altersysstmt->setstmt->kind) { case VAR_SET_VALUE: @@ -4515,52 +4680,64 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt) { struct config_generic *record; - record = find_option(name, false, false, ERROR); - Assert(record != NULL); - - /* - * Don't allow parameters that can't be set in configuration files to - * be set in PG_AUTOCONF_FILENAME file. - */ - if ((record->context == PGC_INTERNAL) || - (record->flags & GUC_DISALLOW_IN_FILE) || - (record->flags & GUC_DISALLOW_IN_AUTO_FILE)) - ereport(ERROR, - (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM), - errmsg("parameter \"%s\" cannot be changed", - name))); - - /* - * If a value is specified, verify that it's sane. - */ - if (value) + /* We don't want to create a placeholder if there's not one already */ + record = find_option(name, false, true, DEBUG5); + if (record != NULL) { - union config_var_val newval; - void *newextra = NULL; - - /* Check that it's acceptable for the indicated parameter */ - if (!parse_and_validate_value(record, name, value, - PGC_S_FILE, ERROR, - &newval, &newextra)) + /* + * Don't allow parameters that can't be set in configuration files + * to be set in PG_AUTOCONF_FILENAME file. + */ + if ((record->context == PGC_INTERNAL) || + (record->flags & GUC_DISALLOW_IN_FILE) || + (record->flags & GUC_DISALLOW_IN_AUTO_FILE)) ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("invalid value for parameter \"%s\": \"%s\"", - name, value))); + (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM), + errmsg("parameter \"%s\" cannot be changed", + name))); + + /* + * If a value is specified, verify that it's sane. + */ + if (value) + { + union config_var_val newval; + void *newextra = NULL; - if (record->vartype == PGC_STRING && newval.stringval != NULL) - guc_free(newval.stringval); - guc_free(newextra); + if (!parse_and_validate_value(record, name, value, + PGC_S_FILE, ERROR, + &newval, &newextra)) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid value for parameter \"%s\": \"%s\"", + name, value))); + if (record->vartype == PGC_STRING && newval.stringval != NULL) + guc_free(newval.stringval); + guc_free(newextra); + } + } + else + { /* - * We must also reject values containing newlines, because the - * grammar for config files doesn't support embedded newlines in - * string literals. + * Variable not known; check we'd be allowed to create it. (We + * cannot validate the value, but that's fine. A non-core GUC in + * the config file cannot cause postmaster start to fail, so we + * don't have to be too tense about possibly installing a bad + * value.) */ - if (strchr(value, '\n')) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("parameter value for ALTER SYSTEM must not contain a newline"))); + (void) assignable_custom_variable_name(name, false, ERROR); } + + /* + * We must also reject values containing newlines, because the grammar + * for config files doesn't support embedded newlines in string + * literals. + */ + if (value && strchr(value, '\n')) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("parameter value for ALTER SYSTEM must not contain a newline"))); } /* @@ -5215,7 +5392,14 @@ get_explain_guc_options(int *num) { struct config_string *lconf = (struct config_string *) conf; - modified = (strcmp(lconf->boot_val, *(lconf->variable)) != 0); + if (lconf->boot_val == NULL && + *lconf->variable == NULL) + modified = false; + else if (lconf->boot_val == NULL || + *lconf->variable == NULL) + modified = true; + else + modified = (strcmp(lconf->boot_val, *(lconf->variable)) != 0); } break; @@ -5442,7 +5626,8 @@ write_one_nondefault_variable(FILE *fp, struct config_generic *gconf) { struct config_string *conf = (struct config_string *) gconf; - fprintf(fp, "%s", *conf->variable); + if (*conf->variable) + fprintf(fp, "%s", *conf->variable); } break; @@ -5644,12 +5829,6 @@ can_skip_gucvar(struct config_generic *gconf) * mechanisms (if indeed they aren't compile-time constants). So we may * always skip these. * - * Role must be handled specially because its current value can be an - * invalid value (for instance, if someone dropped the role since we set - * it). So if we tried to serialize it normally, we might get a failure. - * We skip it here, and use another mechanism to ensure the worker has the - * right value. - * * For all other GUCs, we skip if the GUC has its compiled-in default * value (i.e., source == PGC_S_DEFAULT). On the leader side, this means * we don't send GUCs that have their default values, which typically @@ -5658,8 +5837,8 @@ can_skip_gucvar(struct config_generic *gconf) * comments in RestoreGUCState for more info. */ return gconf->context == PGC_POSTMASTER || - gconf->context == PGC_INTERNAL || gconf->source == PGC_S_DEFAULT || - strcmp(gconf->name, "role") == 0; + gconf->context == PGC_INTERNAL || + gconf->source == PGC_S_DEFAULT; } /* @@ -6215,14 +6394,12 @@ ParseLongOption(const char *string, char **name, char **value) /* - * Handle options fetched from pg_db_role_setting.setconfig, - * pg_proc.proconfig, etc. Caller must specify proper context/source/action. - * - * The array parameter must be an array of TEXT (it must not be NULL). + * Transform array of GUC settings into lists of names and values. The lists + * are faster to process in cases where the settings must be applied + * repeatedly (e.g. for each function invocation). */ void -ProcessGUCArray(ArrayType *array, - GucContext context, GucSource source, GucAction action) +TransformGUCArray(ArrayType *array, List **names, List **values) { int i; @@ -6231,6 +6408,8 @@ ProcessGUCArray(ArrayType *array, Assert(ARR_NDIM(array) == 1); Assert(ARR_LBOUND(array)[0] == 1); + *names = NIL; + *values = NIL; for (i = 1; i <= ARR_DIMS(array)[0]; i++) { Datum d; @@ -6262,14 +6441,45 @@ ProcessGUCArray(ArrayType *array, continue; } + *names = lappend(*names, name); + *values = lappend(*values, value); + + pfree(s); + } +} + + +/* + * Handle options fetched from pg_db_role_setting.setconfig, + * pg_proc.proconfig, etc. Caller must specify proper context/source/action. + * + * The array parameter must be an array of TEXT (it must not be NULL). + */ +void +ProcessGUCArray(ArrayType *array, + GucContext context, GucSource source, GucAction action) +{ + List *gucNames; + List *gucValues; + ListCell *lc1; + ListCell *lc2; + + TransformGUCArray(array, &gucNames, &gucValues); + forboth(lc1, gucNames, lc2, gucValues) + { + char *name = lfirst(lc1); + char *value = lfirst(lc2); + (void) set_config_option(name, value, context, source, action, true, 0, false); pfree(name); pfree(value); - pfree(s); } + + list_free(gucNames); + list_free(gucValues); } diff --git a/src/backend/utils/misc/guc_funcs.c b/src/backend/utils/misc/guc_funcs.c index 0903ba43a96e2..9c9edd3d2f500 100644 --- a/src/backend/utils/misc/guc_funcs.c +++ b/src/backend/utils/misc/guc_funcs.c @@ -5,7 +5,7 @@ * SQL commands and SQL-accessible functions related to GUC variables. * * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * Written by Peter Eisentraut . * * IDENTIFICATION @@ -24,9 +24,9 @@ #include "catalog/pg_parameter_acl.h" #include "funcapi.h" #include "guc_internal.h" +#include "miscadmin.h" #include "parser/parse_type.h" #include "utils/acl.h" -#include "utils/backend_status.h" #include "utils/builtins.h" #include "utils/guc_tables.h" #include "utils/snapmgr.h" diff --git a/src/backend/utils/misc/guc_internal.h b/src/backend/utils/misc/guc_internal.h index 608c8ae47846c..9695dcd5b7dde 100644 --- a/src/backend/utils/misc/guc_internal.h +++ b/src/backend/utils/misc/guc_internal.h @@ -4,7 +4,7 @@ * Declarations shared between backend/utils/misc/guc.c and * backend/utils/misc/guc-file.l * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/include/utils/guc_internal.h *-------------------------------------------------------------------- diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index 71e27f8eb051c..c42fccf3fe74d 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -10,7 +10,7 @@ * their fields are intended to be constant, some fields change at runtime. * * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * Written by Peter Eisentraut . * * IDENTIFICATION @@ -28,6 +28,7 @@ #include "access/commit_ts.h" #include "access/gin.h" +#include "access/slru.h" #include "access/toast_compression.h" #include "access/twophase.h" #include "access/xlog_internal.h" @@ -37,10 +38,12 @@ #include "catalog/namespace.h" #include "catalog/storage.h" #include "commands/async.h" +#include "commands/event_trigger.h" #include "commands/tablespace.h" #include "commands/trigger.h" #include "commands/user.h" #include "commands/vacuum.h" +#include "common/file_utils.h" #include "common/scram-common.h" #include "jit/jit.h" #include "libpq/auth.h" @@ -61,9 +64,11 @@ #include "postmaster/postmaster.h" #include "postmaster/startup.h" #include "postmaster/syslogger.h" +#include "postmaster/walsummarizer.h" #include "postmaster/walwriter.h" #include "replication/logicallauncher.h" #include "replication/slot.h" +#include "replication/slotsync.h" #include "replication/syncrep.h" #include "storage/bufmgr.h" #include "storage/large_object.h" @@ -77,11 +82,11 @@ #include "utils/float.h" #include "utils/guc_hooks.h" #include "utils/guc_tables.h" +#include "utils/inval.h" #include "utils/memutils.h" #include "utils/pg_locale.h" -#include "utils/portal.h" +#include "utils/plancache.h" #include "utils/ps_status.h" -#include "utils/inval.h" #include "utils/xml.h" /* This value is normally passed in from the Makefile */ @@ -91,6 +96,7 @@ /* XXX these should appear in other modules' header files */ extern bool Log_disconnections; +extern bool Trace_connection_negotiation; extern int CommitDelay; extern int CommitSiblings; extern char *default_tablespace; @@ -365,6 +371,13 @@ static const struct config_enum_entry huge_pages_options[] = { {NULL, 0, false} }; +static const struct config_enum_entry huge_pages_status_options[] = { + {"off", HUGE_PAGES_OFF, false}, + {"on", HUGE_PAGES_ON, false}, + {"unknown", HUGE_PAGES_UNKNOWN, false}, + {NULL, 0, false} +}; + static const struct config_enum_entry recovery_prefetch_options[] = { {"off", RECOVERY_PREFETCH_OFF, false}, {"on", RECOVERY_PREFETCH_ON, false}, @@ -413,9 +426,9 @@ static const struct config_enum_entry ssl_protocol_versions_info[] = { {NULL, 0, false} }; -static const struct config_enum_entry logical_replication_mode_options[] = { - {"buffered", LOGICAL_REP_MODE_BUFFERED, false}, - {"immediate", LOGICAL_REP_MODE_IMMEDIATE, false}, +static const struct config_enum_entry debug_logical_replication_streaming_options[] = { + {"buffered", DEBUG_LOGICAL_REP_STREAMING_BUFFERED, false}, + {"immediate", DEBUG_LOGICAL_REP_STREAMING_IMMEDIATE, false}, {NULL, 0, false} }; @@ -423,9 +436,9 @@ StaticAssertDecl(lengthof(ssl_protocol_versions_info) == (PG_TLS1_3_VERSION + 2) "array length mismatch"); static const struct config_enum_entry recovery_init_sync_method_options[] = { - {"fsync", RECOVERY_INIT_SYNC_METHOD_FSYNC, false}, + {"fsync", DATA_DIR_SYNC_METHOD_FSYNC, false}, #ifdef HAVE_SYNCFS - {"syncfs", RECOVERY_INIT_SYNC_METHOD_SYNCFS, false}, + {"syncfs", DATA_DIR_SYNC_METHOD_SYNCFS, false}, #endif {NULL, 0, false} }; @@ -476,12 +489,13 @@ static const struct config_enum_entry wal_compression_options[] = { extern const struct config_enum_entry wal_level_options[]; extern const struct config_enum_entry archive_mode_options[]; extern const struct config_enum_entry recovery_target_action_options[]; -extern const struct config_enum_entry sync_method_options[]; +extern const struct config_enum_entry wal_sync_method_options[]; extern const struct config_enum_entry dynamic_shared_memory_options[]; /* * GUC option variables that are exported from this module */ +bool AllowAlterSystem = true; bool log_duration = false; bool Debug_print_plan = false; bool Debug_print_parse = false; @@ -504,7 +518,7 @@ bool check_function_bodies = true; * details. */ bool default_with_oids = false; -bool session_auth_is_superuser; +bool current_role_is_superuser; int log_min_error_statement = ERROR; int log_min_messages = WARNING; @@ -516,7 +530,6 @@ int log_parameter_max_length_on_error = 0; int log_temp_files = -1; double log_statement_sample_rate = 1.0; double log_xact_sample_rate = 0; -int trace_recovery_messages = LOG; char *backtrace_functions; int temp_file_limit = -1; @@ -550,6 +563,7 @@ int ssl_renegotiation_limit; */ int huge_pages = HUGE_PAGES_TRY; int huge_page_size; +int huge_pages_status = HUGE_PAGES_UNKNOWN; /* * These variables are all dummies that don't do anything, except in some @@ -563,7 +577,8 @@ static char *datestyle_string; static char *server_encoding_string; static char *server_version_string; static int server_version_num; -static char *io_direct_string; +static char *debug_io_direct_string; +static char *restrict_nonsystem_relation_kind_string; #ifdef HAVE_SYSLOG #define DEFAULT_SYSLOG_FACILITY LOG_LOCAL0 @@ -615,13 +630,13 @@ bool in_hot_standby_guc; */ const char *const GucContext_Names[] = { - /* PGC_INTERNAL */ "internal", - /* PGC_POSTMASTER */ "postmaster", - /* PGC_SIGHUP */ "sighup", - /* PGC_SU_BACKEND */ "superuser-backend", - /* PGC_BACKEND */ "backend", - /* PGC_SUSET */ "superuser", - /* PGC_USERSET */ "user" + [PGC_INTERNAL] = "internal", + [PGC_POSTMASTER] = "postmaster", + [PGC_SIGHUP] = "sighup", + [PGC_SU_BACKEND] = "superuser-backend", + [PGC_BACKEND] = "backend", + [PGC_SUSET] = "superuser", + [PGC_USERSET] = "user", }; StaticAssertDecl(lengthof(GucContext_Names) == (PGC_USERSET + 1), @@ -634,20 +649,20 @@ StaticAssertDecl(lengthof(GucContext_Names) == (PGC_USERSET + 1), */ const char *const GucSource_Names[] = { - /* PGC_S_DEFAULT */ "default", - /* PGC_S_DYNAMIC_DEFAULT */ "default", - /* PGC_S_ENV_VAR */ "environment variable", - /* PGC_S_FILE */ "configuration file", - /* PGC_S_ARGV */ "command line", - /* PGC_S_GLOBAL */ "global", - /* PGC_S_DATABASE */ "database", - /* PGC_S_USER */ "user", - /* PGC_S_DATABASE_USER */ "database user", - /* PGC_S_CLIENT */ "client", - /* PGC_S_OVERRIDE */ "override", - /* PGC_S_INTERACTIVE */ "interactive", - /* PGC_S_TEST */ "test", - /* PGC_S_SESSION */ "session" + [PGC_S_DEFAULT] = "default", + [PGC_S_DYNAMIC_DEFAULT] = "default", + [PGC_S_ENV_VAR] = "environment variable", + [PGC_S_FILE] = "configuration file", + [PGC_S_ARGV] = "command line", + [PGC_S_GLOBAL] = "global", + [PGC_S_DATABASE] = "database", + [PGC_S_USER] = "user", + [PGC_S_DATABASE_USER] = "database user", + [PGC_S_CLIENT] = "client", + [PGC_S_OVERRIDE] = "override", + [PGC_S_INTERACTIVE] = "interactive", + [PGC_S_TEST] = "test", + [PGC_S_SESSION] = "session", }; StaticAssertDecl(lengthof(GucSource_Names) == (PGC_S_SESSION + 1), @@ -658,99 +673,54 @@ StaticAssertDecl(lengthof(GucSource_Names) == (PGC_S_SESSION + 1), */ const char *const config_group_names[] = { - /* UNGROUPED */ - gettext_noop("Ungrouped"), - /* FILE_LOCATIONS */ - gettext_noop("File Locations"), - /* CONN_AUTH_SETTINGS */ - gettext_noop("Connections and Authentication / Connection Settings"), - /* CONN_AUTH_TCP */ - gettext_noop("Connections and Authentication / TCP Settings"), - /* CONN_AUTH_AUTH */ - gettext_noop("Connections and Authentication / Authentication"), - /* CONN_AUTH_SSL */ - gettext_noop("Connections and Authentication / SSL"), - /* RESOURCES_MEM */ - gettext_noop("Resource Usage / Memory"), - /* RESOURCES_DISK */ - gettext_noop("Resource Usage / Disk"), - /* RESOURCES_KERNEL */ - gettext_noop("Resource Usage / Kernel Resources"), - /* RESOURCES_VACUUM_DELAY */ - gettext_noop("Resource Usage / Cost-Based Vacuum Delay"), - /* RESOURCES_BGWRITER */ - gettext_noop("Resource Usage / Background Writer"), - /* RESOURCES_ASYNCHRONOUS */ - gettext_noop("Resource Usage / Asynchronous Behavior"), - /* WAL_SETTINGS */ - gettext_noop("Write-Ahead Log / Settings"), - /* WAL_CHECKPOINTS */ - gettext_noop("Write-Ahead Log / Checkpoints"), - /* WAL_ARCHIVING */ - gettext_noop("Write-Ahead Log / Archiving"), - /* WAL_RECOVERY */ - gettext_noop("Write-Ahead Log / Recovery"), - /* WAL_ARCHIVE_RECOVERY */ - gettext_noop("Write-Ahead Log / Archive Recovery"), - /* WAL_RECOVERY_TARGET */ - gettext_noop("Write-Ahead Log / Recovery Target"), - /* REPLICATION_SENDING */ - gettext_noop("Replication / Sending Servers"), - /* REPLICATION_PRIMARY */ - gettext_noop("Replication / Primary Server"), - /* REPLICATION_STANDBY */ - gettext_noop("Replication / Standby Servers"), - /* REPLICATION_SUBSCRIBERS */ - gettext_noop("Replication / Subscribers"), - /* QUERY_TUNING_METHOD */ - gettext_noop("Query Tuning / Planner Method Configuration"), - /* QUERY_TUNING_COST */ - gettext_noop("Query Tuning / Planner Cost Constants"), - /* QUERY_TUNING_GEQO */ - gettext_noop("Query Tuning / Genetic Query Optimizer"), - /* QUERY_TUNING_OTHER */ - gettext_noop("Query Tuning / Other Planner Options"), - /* LOGGING_WHERE */ - gettext_noop("Reporting and Logging / Where to Log"), - /* LOGGING_WHEN */ - gettext_noop("Reporting and Logging / When to Log"), - /* LOGGING_WHAT */ - gettext_noop("Reporting and Logging / What to Log"), - /* PROCESS_TITLE */ - gettext_noop("Reporting and Logging / Process Title"), - /* STATS_MONITORING */ - gettext_noop("Statistics / Monitoring"), - /* STATS_CUMULATIVE */ - gettext_noop("Statistics / Cumulative Query and Index Statistics"), - /* AUTOVACUUM */ - gettext_noop("Autovacuum"), - /* CLIENT_CONN_STATEMENT */ - gettext_noop("Client Connection Defaults / Statement Behavior"), - /* CLIENT_CONN_LOCALE */ - gettext_noop("Client Connection Defaults / Locale and Formatting"), - /* CLIENT_CONN_PRELOAD */ - gettext_noop("Client Connection Defaults / Shared Library Preloading"), - /* CLIENT_CONN_OTHER */ - gettext_noop("Client Connection Defaults / Other Defaults"), - /* LOCK_MANAGEMENT */ - gettext_noop("Lock Management"), - /* COMPAT_OPTIONS_PREVIOUS */ - gettext_noop("Version and Platform Compatibility / Previous PostgreSQL Versions"), - /* COMPAT_OPTIONS_CLIENT */ - gettext_noop("Version and Platform Compatibility / Other Platforms and Clients"), - /* ERROR_HANDLING_OPTIONS */ - gettext_noop("Error Handling"), - /* PRESET_OPTIONS */ - gettext_noop("Preset Options"), - /* CUSTOM_OPTIONS */ - gettext_noop("Customized Options"), - /* DEVELOPER_OPTIONS */ - gettext_noop("Developer Options"), - /* help_config wants this array to be null-terminated */ - NULL + [UNGROUPED] = gettext_noop("Ungrouped"), + [FILE_LOCATIONS] = gettext_noop("File Locations"), + [CONN_AUTH_SETTINGS] = gettext_noop("Connections and Authentication / Connection Settings"), + [CONN_AUTH_TCP] = gettext_noop("Connections and Authentication / TCP Settings"), + [CONN_AUTH_AUTH] = gettext_noop("Connections and Authentication / Authentication"), + [CONN_AUTH_SSL] = gettext_noop("Connections and Authentication / SSL"), + [RESOURCES_MEM] = gettext_noop("Resource Usage / Memory"), + [RESOURCES_DISK] = gettext_noop("Resource Usage / Disk"), + [RESOURCES_KERNEL] = gettext_noop("Resource Usage / Kernel Resources"), + [RESOURCES_VACUUM_DELAY] = gettext_noop("Resource Usage / Cost-Based Vacuum Delay"), + [RESOURCES_BGWRITER] = gettext_noop("Resource Usage / Background Writer"), + [RESOURCES_ASYNCHRONOUS] = gettext_noop("Resource Usage / Asynchronous Behavior"), + [WAL_SETTINGS] = gettext_noop("Write-Ahead Log / Settings"), + [WAL_CHECKPOINTS] = gettext_noop("Write-Ahead Log / Checkpoints"), + [WAL_ARCHIVING] = gettext_noop("Write-Ahead Log / Archiving"), + [WAL_RECOVERY] = gettext_noop("Write-Ahead Log / Recovery"), + [WAL_ARCHIVE_RECOVERY] = gettext_noop("Write-Ahead Log / Archive Recovery"), + [WAL_RECOVERY_TARGET] = gettext_noop("Write-Ahead Log / Recovery Target"), + [WAL_SUMMARIZATION] = gettext_noop("Write-Ahead Log / Summarization"), + [REPLICATION_SENDING] = gettext_noop("Replication / Sending Servers"), + [REPLICATION_PRIMARY] = gettext_noop("Replication / Primary Server"), + [REPLICATION_STANDBY] = gettext_noop("Replication / Standby Servers"), + [REPLICATION_SUBSCRIBERS] = gettext_noop("Replication / Subscribers"), + [QUERY_TUNING_METHOD] = gettext_noop("Query Tuning / Planner Method Configuration"), + [QUERY_TUNING_COST] = gettext_noop("Query Tuning / Planner Cost Constants"), + [QUERY_TUNING_GEQO] = gettext_noop("Query Tuning / Genetic Query Optimizer"), + [QUERY_TUNING_OTHER] = gettext_noop("Query Tuning / Other Planner Options"), + [LOGGING_WHERE] = gettext_noop("Reporting and Logging / Where to Log"), + [LOGGING_WHEN] = gettext_noop("Reporting and Logging / When to Log"), + [LOGGING_WHAT] = gettext_noop("Reporting and Logging / What to Log"), + [PROCESS_TITLE] = gettext_noop("Reporting and Logging / Process Title"), + [STATS_MONITORING] = gettext_noop("Statistics / Monitoring"), + [STATS_CUMULATIVE] = gettext_noop("Statistics / Cumulative Query and Index Statistics"), + [AUTOVACUUM] = gettext_noop("Autovacuum"), + [CLIENT_CONN_STATEMENT] = gettext_noop("Client Connection Defaults / Statement Behavior"), + [CLIENT_CONN_LOCALE] = gettext_noop("Client Connection Defaults / Locale and Formatting"), + [CLIENT_CONN_PRELOAD] = gettext_noop("Client Connection Defaults / Shared Library Preloading"), + [CLIENT_CONN_OTHER] = gettext_noop("Client Connection Defaults / Other Defaults"), + [LOCK_MANAGEMENT] = gettext_noop("Lock Management"), + [COMPAT_OPTIONS_PREVIOUS] = gettext_noop("Version and Platform Compatibility / Previous PostgreSQL Versions"), + [COMPAT_OPTIONS_OTHER] = gettext_noop("Version and Platform Compatibility / Other Platforms and Clients"), + [ERROR_HANDLING_OPTIONS] = gettext_noop("Error Handling"), + [PRESET_OPTIONS] = gettext_noop("Preset Options"), + [CUSTOM_OPTIONS] = gettext_noop("Customized Options"), + [DEVELOPER_OPTIONS] = gettext_noop("Developer Options"), }; -StaticAssertDecl(lengthof(config_group_names) == (DEVELOPER_OPTIONS + 2), +StaticAssertDecl(lengthof(config_group_names) == (DEVELOPER_OPTIONS + 1), "array length mismatch"); /* @@ -760,11 +730,11 @@ StaticAssertDecl(lengthof(config_group_names) == (DEVELOPER_OPTIONS + 2), */ const char *const config_type_names[] = { - /* PGC_BOOL */ "bool", - /* PGC_INT */ "integer", - /* PGC_REAL */ "real", - /* PGC_STRING */ "string", - /* PGC_ENUM */ "enum" + [PGC_BOOL] = "bool", + [PGC_INT] = "integer", + [PGC_REAL] = "real", + [PGC_STRING] = "string", + [PGC_ENUM] = "enum", }; StaticAssertDecl(lengthof(config_type_names) == (PGC_ENUM + 1), @@ -994,10 +964,10 @@ struct config_bool ConfigureNamesBool[] = }, { {"enable_presorted_aggregate", PGC_USERSET, QUERY_TUNING_METHOD, - gettext_noop("Enables the planner's ability to produce plans which " + gettext_noop("Enables the planner's ability to produce plans that " "provide presorted input for ORDER BY / DISTINCT aggregate " "functions."), - gettext_noop("Allows the query planner to build plans which provide " + gettext_noop("Allows the query planner to build plans that provide " "presorted input for aggregate functions with an ORDER BY / " "DISTINCT clause. When disabled, implicit sorts are always " "performed during execution."), @@ -1017,6 +987,16 @@ struct config_bool ConfigureNamesBool[] = true, NULL, NULL, NULL }, + { + {"enable_group_by_reordering", PGC_USERSET, QUERY_TUNING_METHOD, + gettext_noop("Enables reordering of GROUP BY keys."), + NULL, + GUC_EXPLAIN + }, + &enable_group_by_reordering, + true, + NULL, NULL, NULL + }, { {"geqo", PGC_USERSET, QUERY_TUNING_GEQO, gettext_noop("Enables genetic query optimization."), @@ -1029,16 +1009,35 @@ struct config_bool ConfigureNamesBool[] = NULL, NULL, NULL }, { - /* Not for general use --- used by SET SESSION AUTHORIZATION */ + /* + * Not for general use --- used by SET SESSION AUTHORIZATION and SET + * ROLE + */ {"is_superuser", PGC_INTERNAL, UNGROUPED, gettext_noop("Shows whether the current user is a superuser."), NULL, - GUC_REPORT | GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE + GUC_REPORT | GUC_NO_SHOW_ALL | GUC_NO_RESET_ALL | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_ALLOW_IN_PARALLEL }, - &session_auth_is_superuser, + ¤t_role_is_superuser, false, NULL, NULL, NULL }, + { + /* + * This setting itself cannot be set by ALTER SYSTEM to avoid an + * operator turning this setting off by using ALTER SYSTEM, without a + * way to turn it back on. + */ + {"allow_alter_system", PGC_SIGHUP, COMPAT_OPTIONS_OTHER, + gettext_noop("Allows running the ALTER SYSTEM command."), + gettext_noop("Can be set to off for environments where global configuration " + "changes should be made using a different method."), + GUC_DISALLOW_IN_AUTO_FILE + }, + &AllowAlterSystem, + true, + NULL, NULL, NULL + }, { {"bonjour", PGC_POSTMASTER, CONN_AUTH_SETTINGS, gettext_noop("Enables advertising the server via Bonjour."), @@ -1068,7 +1067,7 @@ struct config_bool ConfigureNamesBool[] = }, { {"ssl_passphrase_command_supports_reload", PGC_SIGHUP, CONN_AUTH_SSL, - gettext_noop("Controls whether ssl_passphrase_command is called during server reload."), + gettext_noop("Controls whether \"ssl_passphrase_command\" is called during server reload."), NULL }, &ssl_passphrase_command_supports_reload, @@ -1088,7 +1087,7 @@ struct config_bool ConfigureNamesBool[] = {"fsync", PGC_SIGHUP, WAL_SETTINGS, gettext_noop("Forces synchronization of updates to disk."), gettext_noop("The server will use the fsync() system call in several places to make " - "sure that updates are physically written to disk. This insures " + "sure that updates are physically written to disk. This ensures " "that a database cluster will recover to a consistent state after " "an operating system or hardware crash.") }, @@ -1116,7 +1115,7 @@ struct config_bool ConfigureNamesBool[] = gettext_noop("Continues processing past damaged page headers."), gettext_noop("Detection of a damaged page header normally causes PostgreSQL to " "report an error, aborting the current transaction. Setting " - "zero_damaged_pages to true causes the system to instead report a " + "\"zero_damaged_pages\" to true causes the system to instead report a " "warning, zero out the damaged page, and continue processing. This " "behavior will destroy data, namely all the rows on the damaged page."), GUC_NOT_IN_SAMPLE @@ -1131,7 +1130,7 @@ struct config_bool ConfigureNamesBool[] = gettext_noop("Detection of WAL records having references to " "invalid pages during recovery causes PostgreSQL to " "raise a PANIC-level error, aborting the recovery. " - "Setting ignore_invalid_pages to true causes " + "Setting \"ignore_invalid_pages\" to true causes " "the system to ignore invalid page references " "in WAL records (but still report a warning), " "and continue recovery. This behavior may cause " @@ -1206,6 +1205,16 @@ struct config_bool ConfigureNamesBool[] = false, NULL, NULL, NULL }, + { + {"trace_connection_negotiation", PGC_POSTMASTER, DEVELOPER_OPTIONS, + gettext_noop("Logs details of pre-authentication connection handshake."), + NULL, + GUC_NOT_IN_SAMPLE + }, + &Trace_connection_negotiation, + false, + NULL, NULL, NULL + }, { {"log_disconnections", PGC_SU_BACKEND, LOGGING_WHAT, gettext_noop("Logs end of a session, including duration."), @@ -1522,7 +1531,7 @@ struct config_bool ConfigureNamesBool[] = NULL, NULL, NULL }, { - {"transform_null_equals", PGC_USERSET, COMPAT_OPTIONS_CLIENT, + {"transform_null_equals", PGC_USERSET, COMPAT_OPTIONS_OTHER, gettext_noop("Treats \"expr=NULL\" as \"expr IS NULL\"."), gettext_noop("When turned on, expressions of the form expr = NULL " "(or NULL = expr) are treated as expr IS NULL, that is, they " @@ -1534,15 +1543,6 @@ struct config_bool ConfigureNamesBool[] = false, NULL, NULL, NULL }, - { - {"db_user_namespace", PGC_SIGHUP, CONN_AUTH_AUTH, - gettext_noop("Enables per-database user names."), - NULL - }, - &Db_user_namespace, - false, - NULL, NULL, NULL - }, { {"default_transaction_read_only", PGC_USERSET, CLIENT_CONN_STATEMENT, gettext_noop("Sets the default read-only status of new transactions."), @@ -1629,7 +1629,7 @@ struct config_bool ConfigureNamesBool[] = }, { {"logging_collector", PGC_POSTMASTER, LOGGING_WHERE, - gettext_noop("Start a subprocess to capture stderr output and/or csvlogs into log files."), + gettext_noop("Start a subprocess to capture stderr, csvlog and/or jsonlog into log files."), NULL }, &Logging_collector, @@ -1773,6 +1773,16 @@ struct config_bool ConfigureNamesBool[] = NULL, NULL, NULL }, + { + {"summarize_wal", PGC_SIGHUP, WAL_SUMMARIZATION, + gettext_noop("Starts the WAL summarizer process to enable incremental backup."), + NULL + }, + &summarize_wal, + false, + NULL, NULL, NULL + }, + { {"hot_standby", PGC_POSTMASTER, REPLICATION_STANDBY, gettext_noop("Allows connections and queries during recovery."), @@ -1997,6 +2007,25 @@ struct config_bool ConfigureNamesBool[] = NULL, NULL, NULL }, + { + {"event_triggers", PGC_SUSET, CLIENT_CONN_STATEMENT, + gettext_noop("Enables event triggers."), + gettext_noop("When enabled, event triggers will fire for all applicable statements."), + }, + &event_triggers, + true, + NULL, NULL, NULL + }, + + { + {"sync_replication_slots", PGC_SIGHUP, REPLICATION_STANDBY, + gettext_noop("Enables a physical standby to synchronize logical failover replication slots from the primary server."), + }, + &sync_replication_slots, + false, + NULL, NULL, NULL + }, + /* End-of-list marker */ { {NULL, 0, 0, NULL, NULL}, NULL, false, NULL, NULL, NULL @@ -2035,7 +2064,7 @@ struct config_int ConfigureNamesInt[] = "column-specific target set via ALTER TABLE SET STATISTICS.") }, &default_statistics_target, - 100, 1, 10000, + 100, 1, MAX_STATISTICS_TARGET, NULL, NULL, NULL }, { @@ -2237,7 +2266,7 @@ struct config_int ConfigureNamesInt[] = GUC_UNIT_KB }, &VacuumBufferUsageLimit, - 256, 0, MAX_BAS_VAC_RING_SIZE_KB, + 2048, 0, MAX_BAS_VAC_RING_SIZE_KB, check_vacuum_buffer_usage_limit, NULL, NULL }, @@ -2263,6 +2292,83 @@ struct config_int ConfigureNamesInt[] = NULL, NULL, NULL }, + { + {"commit_timestamp_buffers", PGC_POSTMASTER, RESOURCES_MEM, + gettext_noop("Sets the size of the dedicated buffer pool used for the commit timestamp cache."), + gettext_noop("Specify 0 to have this value determined as a fraction of shared_buffers."), + GUC_UNIT_BLOCKS + }, + &commit_timestamp_buffers, + 0, 0, SLRU_MAX_ALLOWED_BUFFERS, + check_commit_ts_buffers, NULL, NULL + }, + + { + {"multixact_member_buffers", PGC_POSTMASTER, RESOURCES_MEM, + gettext_noop("Sets the size of the dedicated buffer pool used for the MultiXact member cache."), + NULL, + GUC_UNIT_BLOCKS + }, + &multixact_member_buffers, + 32, 16, SLRU_MAX_ALLOWED_BUFFERS, + check_multixact_member_buffers, NULL, NULL + }, + + { + {"multixact_offset_buffers", PGC_POSTMASTER, RESOURCES_MEM, + gettext_noop("Sets the size of the dedicated buffer pool used for the MultiXact offset cache."), + NULL, + GUC_UNIT_BLOCKS + }, + &multixact_offset_buffers, + 16, 16, SLRU_MAX_ALLOWED_BUFFERS, + check_multixact_offset_buffers, NULL, NULL + }, + + { + {"notify_buffers", PGC_POSTMASTER, RESOURCES_MEM, + gettext_noop("Sets the size of the dedicated buffer pool used for the LISTEN/NOTIFY message cache."), + NULL, + GUC_UNIT_BLOCKS + }, + ¬ify_buffers, + 16, 16, SLRU_MAX_ALLOWED_BUFFERS, + check_notify_buffers, NULL, NULL + }, + + { + {"serializable_buffers", PGC_POSTMASTER, RESOURCES_MEM, + gettext_noop("Sets the size of the dedicated buffer pool used for the serializable transaction cache."), + NULL, + GUC_UNIT_BLOCKS + }, + &serializable_buffers, + 32, 16, SLRU_MAX_ALLOWED_BUFFERS, + check_serial_buffers, NULL, NULL + }, + + { + {"subtransaction_buffers", PGC_POSTMASTER, RESOURCES_MEM, + gettext_noop("Sets the size of the dedicated buffer pool used for the subtransaction cache."), + gettext_noop("Specify 0 to have this value determined as a fraction of shared_buffers."), + GUC_UNIT_BLOCKS + }, + &subtransaction_buffers, + 0, 0, SLRU_MAX_ALLOWED_BUFFERS, + check_subtrans_buffers, NULL, NULL + }, + + { + {"transaction_buffers", PGC_POSTMASTER, RESOURCES_MEM, + gettext_noop("Sets the size of the dedicated buffer pool used for the transaction status cache."), + gettext_noop("Specify 0 to have this value determined as a fraction of shared_buffers."), + GUC_UNIT_BLOCKS + }, + &transaction_buffers, + 0, 0, SLRU_MAX_ALLOWED_BUFFERS, + check_transaction_buffers, NULL, NULL + }, + { {"temp_buffers", PGC_USERSET, RESOURCES_MEM, gettext_noop("Sets the maximum number of temporary buffers used by each session."), @@ -2341,6 +2447,11 @@ struct config_int ConfigureNamesInt[] = NULL, NULL, NULL }, + /* + * Dynamic shared memory has a higher overhead than local memory contexts, + * so when testing low-memory scenarios that could use shared memory, the + * recommended minimum is 1MB. + */ { {"maintenance_work_mem", PGC_USERSET, RESOURCES_MEM, gettext_noop("Sets the maximum memory to be used for maintenance operations."), @@ -2348,7 +2459,7 @@ struct config_int ConfigureNamesInt[] = GUC_UNIT_KB }, &maintenance_work_mem, - 65536, 1024, MAX_KILOBYTES, + 65536, 64, MAX_KILOBYTES, NULL, NULL, NULL }, @@ -2520,6 +2631,17 @@ struct config_int ConfigureNamesInt[] = NULL, NULL, NULL }, + { + {"transaction_timeout", PGC_USERSET, CLIENT_CONN_STATEMENT, + gettext_noop("Sets the maximum allowed duration of any transaction within a session (not a prepared transaction)."), + gettext_noop("A value of 0 turns off the timeout."), + GUC_UNIT_MS + }, + &TransactionTimeout, + 0, 0, INT_MAX, + NULL, assign_transaction_timeout, NULL + }, + { {"idle_session_timeout", PGC_USERSET, CLIENT_CONN_STATEMENT, gettext_noop("Sets the maximum allowed idle time between queries, when not in a transaction."), @@ -2597,7 +2719,7 @@ struct config_int ConfigureNamesInt[] = {"max_locks_per_transaction", PGC_POSTMASTER, LOCK_MANAGEMENT, gettext_noop("Sets the maximum number of locks per transaction."), gettext_noop("The shared lock table is sized on the assumption that at most " - "max_locks_per_transaction objects per server process or prepared " + "\"max_locks_per_transaction\" objects per server process or prepared " "transaction will need to be locked at any one time.") }, &max_locks_per_xact, @@ -2609,7 +2731,7 @@ struct config_int ConfigureNamesInt[] = {"max_pred_locks_per_transaction", PGC_POSTMASTER, LOCK_MANAGEMENT, gettext_noop("Sets the maximum number of predicate locks per transaction."), gettext_noop("The shared predicate lock table is sized on the assumption that " - "at most max_pred_locks_per_transaction objects per server process " + "at most \"max_pred_locks_per_transaction\" objects per server process " "or prepared transaction will need to be locked at any one time.") }, &max_predicate_locks_per_xact, @@ -2663,6 +2785,16 @@ struct config_int ConfigureNamesInt[] = NULL, NULL, NULL }, + { + {"max_notify_queue_pages", PGC_POSTMASTER, RESOURCES_DISK, + gettext_noop("Sets the maximum number of allocated pages for NOTIFY / LISTEN queue."), + NULL, + }, + &max_notify_queue_pages, + 1048576, 64, INT_MAX, + NULL, NULL, NULL + }, + { {"wal_decode_buffer_size", PGC_POSTMASTER, WAL_RECOVERY, gettext_noop("Buffer size for reading ahead in the WAL during recovery."), @@ -2749,7 +2881,7 @@ struct config_int ConfigureNamesInt[] = { {"wal_buffers", PGC_POSTMASTER, WAL_SETTINGS, gettext_noop("Sets the number of disk-page buffers in shared memory for WAL."), - NULL, + gettext_noop("Specify -1 to have this value determined as a fraction of shared_buffers."), GUC_UNIT_XBLOCKS }, &XLOGbuffers, @@ -2821,7 +2953,7 @@ struct config_int ConfigureNamesInt[] = }, &max_slot_wal_keep_size_mb, -1, -1, MAX_KILOBYTES, - NULL, NULL, NULL + check_max_slot_wal_keep_size, NULL, NULL }, { @@ -2850,7 +2982,7 @@ struct config_int ConfigureNamesInt[] = { {"commit_siblings", PGC_USERSET, WAL_SETTINGS, gettext_noop("Sets the minimum number of concurrent open transactions " - "required before performing commit_delay."), + "required before performing \"commit_delay\"."), NULL }, &CommitSiblings, @@ -2982,7 +3114,7 @@ struct config_int ConfigureNamesInt[] = {"maintenance_io_concurrency", PGC_USERSET, RESOURCES_ASYNCHRONOUS, - gettext_noop("A variant of effective_io_concurrency that is used for maintenance work."), + gettext_noop("A variant of \"effective_io_concurrency\" that is used for maintenance work."), NULL, GUC_EXPLAIN }, @@ -2993,6 +3125,20 @@ struct config_int ConfigureNamesInt[] = NULL }, + { + {"io_combine_limit", + PGC_USERSET, + RESOURCES_ASYNCHRONOUS, + gettext_noop("Limit on the size of data reads and writes."), + NULL, + GUC_UNIT_BLOCKS + }, + &io_combine_limit, + DEFAULT_IO_COMBINE_LIMIT, + 1, MAX_IO_COMBINE_LIMIT, + NULL, NULL, NULL + }, + { {"backend_flush_after", PGC_USERSET, RESOURCES_ASYNCHRONOUS, gettext_noop("Number of pages after which previously performed writes are flushed to disk."), @@ -3164,6 +3310,19 @@ struct config_int ConfigureNamesInt[] = DEFAULT_XLOG_SEG_SIZE, WalSegMinSize, WalSegMaxSize, + check_wal_segment_size, NULL, NULL + }, + + { + {"wal_summary_keep_time", PGC_SIGHUP, WAL_SUMMARIZATION, + gettext_noop("Time for which WAL summary files should be kept."), + NULL, + GUC_UNIT_MIN, + }, + &wal_summary_keep_time, + 10 * HOURS_PER_DAY * MINS_PER_HOUR, /* 10 days */ + 0, + INT_MAX / SECS_PER_MINUTE, NULL, NULL, NULL }, @@ -3280,17 +3439,6 @@ struct config_int ConfigureNamesInt[] = check_autovacuum_work_mem, NULL, NULL }, - { - {"old_snapshot_threshold", PGC_POSTMASTER, RESOURCES_ASYNCHRONOUS, - gettext_noop("Time before a snapshot is too old to read pages changed after the snapshot was taken."), - gettext_noop("A value of -1 disables this feature."), - GUC_UNIT_MIN - }, - &old_snapshot_threshold, - -1, -1, MINS_PER_HOUR * HOURS_PER_DAY * 60, - NULL, NULL, NULL - }, - { {"tcp_keepalives_idle", PGC_USERSET, CONN_AUTH_TCP, gettext_noop("Time between issuing TCP keepalives."), @@ -3673,7 +3821,7 @@ struct config_real ConfigureNamesReal[] = { {"hash_mem_multiplier", PGC_USERSET, RESOURCES_MEM, - gettext_noop("Multiple of work_mem to use for hash tables."), + gettext_noop("Multiple of \"work_mem\" to use for hash tables."), NULL, GUC_EXPLAIN }, @@ -3767,7 +3915,7 @@ struct config_real ConfigureNamesReal[] = { {"log_statement_sample_rate", PGC_SUSET, LOGGING_WHEN, - gettext_noop("Fraction of statements exceeding log_min_duration_sample to be logged."), + gettext_noop("Fraction of statements exceeding \"log_min_duration_sample\" to be logged."), gettext_noop("Use a value between 0.0 (never log) and 1.0 (always log).") }, &log_statement_sample_rate, @@ -4544,9 +4692,34 @@ struct config_string ConfigureNamesString[] = NULL, GUC_LIST_INPUT | GUC_NOT_IN_SAMPLE }, - &io_direct_string, + &debug_io_direct_string, + "", + check_debug_io_direct, assign_debug_io_direct, NULL + }, + + { + {"synchronized_standby_slots", PGC_SIGHUP, REPLICATION_PRIMARY, + gettext_noop("Lists streaming replication standby server replication slot " + "names that logical WAL sender processes will wait for."), + gettext_noop("Logical WAL sender processes will send decoded " + "changes to output plugins only after the specified " + "replication slots have confirmed receiving WAL."), + GUC_LIST_INPUT + }, + &synchronized_standby_slots, + "", + check_synchronized_standby_slots, assign_synchronized_standby_slots, NULL + }, + + { + {"restrict_nonsystem_relation_kind", PGC_USERSET, CLIENT_CONN_STATEMENT, + gettext_noop("Prohibits access to non-system relations of specified kinds."), + NULL, + GUC_LIST_INPUT | GUC_NOT_IN_SAMPLE + }, + &restrict_nonsystem_relation_kind_string, "", - check_io_direct, assign_io_direct, NULL + check_restrict_nonsystem_relation_kind, assign_restrict_nonsystem_relation_kind, NULL }, /* End-of-list marker */ @@ -4739,7 +4912,7 @@ struct config_enum ConfigureNamesEnum[] = { {"archive_mode", PGC_POSTMASTER, WAL_ARCHIVING, - gettext_noop("Allows archiving of WAL files using archive_command."), + gettext_noop("Allows archiving of WAL files using \"archive_command\"."), NULL }, &XLogArchiveMode, @@ -4757,23 +4930,6 @@ struct config_enum ConfigureNamesEnum[] = NULL, NULL, NULL }, - { - {"trace_recovery_messages", PGC_SIGHUP, DEVELOPER_OPTIONS, - gettext_noop("Enables logging of recovery-related debugging information."), - gettext_noop("Each level includes all the levels that follow it. The later" - " the level, the fewer messages are sent."), - GUC_NOT_IN_SAMPLE, - }, - &trace_recovery_messages, - - /* - * client_message_level_options allows too many values, really, but - * it's not worth having a separate options array for this. - */ - LOG, client_message_level_options, - NULL, NULL, NULL - }, - { {"track_functions", PGC_SUSET, STATS_CUMULATIVE, gettext_noop("Collects function-level statistics on database activity."), @@ -4840,9 +4996,9 @@ struct config_enum ConfigureNamesEnum[] = gettext_noop("Selects the method used for forcing WAL updates to disk."), NULL }, - &sync_method, - DEFAULT_SYNC_METHOD, sync_method_options, - NULL, assign_xlog_sync_method, NULL + &wal_sync_method, + DEFAULT_WAL_SYNC_METHOD, wal_sync_method_options, + NULL, assign_wal_sync_method, NULL }, { @@ -4876,6 +5032,17 @@ struct config_enum ConfigureNamesEnum[] = NULL, NULL, NULL }, + { + {"huge_pages_status", PGC_INTERNAL, PRESET_OPTIONS, + gettext_noop("Indicates the status of huge pages."), + NULL, + GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE + }, + &huge_pages_status, + HUGE_PAGES_UNKNOWN, huge_pages_status_options, + NULL, NULL, NULL + }, + { {"recovery_prefetch", PGC_SIGHUP, WAL_RECOVERY, gettext_noop("Prefetch referenced blocks during recovery."), @@ -4890,8 +5057,8 @@ struct config_enum ConfigureNamesEnum[] = {"debug_parallel_query", PGC_USERSET, DEVELOPER_OPTIONS, gettext_noop("Forces the planner's use parallel query nodes."), gettext_noop("This can be useful for testing the parallel query infrastructure " - "by forcing the planner to generate plans which contains nodes " - "which perform tuple communication between workers and the main process."), + "by forcing the planner to generate plans that contain nodes " + "that perform tuple communication between workers and the main process."), GUC_NOT_IN_SAMPLE | GUC_EXPLAIN }, &debug_parallel_query, @@ -4951,20 +5118,20 @@ struct config_enum ConfigureNamesEnum[] = gettext_noop("Sets the method for synchronizing the data directory before crash recovery."), }, &recovery_init_sync_method, - RECOVERY_INIT_SYNC_METHOD_FSYNC, recovery_init_sync_method_options, + DATA_DIR_SYNC_METHOD_FSYNC, recovery_init_sync_method_options, NULL, NULL, NULL }, { - {"logical_replication_mode", PGC_USERSET, DEVELOPER_OPTIONS, - gettext_noop("Controls when to replicate or apply each change."), + {"debug_logical_replication_streaming", PGC_USERSET, DEVELOPER_OPTIONS, + gettext_noop("Forces immediate streaming or serialization of changes in large transactions."), gettext_noop("On the publisher, it allows streaming or serializing each change in logical decoding. " "On the subscriber, it allows serialization of all changes to files and notifies the " "parallel apply workers to read and apply them at the end of the transaction."), GUC_NOT_IN_SAMPLE }, - &logical_replication_mode, - LOGICAL_REP_MODE_BUFFERED, logical_replication_mode_options, + &debug_logical_replication_streaming, + DEBUG_LOGICAL_REP_STREAMING_BUFFERED, debug_logical_replication_streaming_options, NULL, NULL, NULL }, diff --git a/src/backend/utils/misc/help_config.c b/src/backend/utils/misc/help_config.c index 94c8a16ac1eee..4729a19a132f6 100644 --- a/src/backend/utils/misc/help_config.c +++ b/src/backend/utils/misc/help_config.c @@ -7,7 +7,7 @@ * or GUC_DISALLOW_IN_FILE are not displayed, unless the user specifically * requests that variable by name * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/misc/help_config.c diff --git a/src/backend/utils/misc/injection_point.c b/src/backend/utils/misc/injection_point.c new file mode 100644 index 0000000000000..b33cddefabc31 --- /dev/null +++ b/src/backend/utils/misc/injection_point.c @@ -0,0 +1,537 @@ +/*------------------------------------------------------------------------- + * + * injection_point.c + * Routines to control and run injection points in the code. + * + * Injection points can be used to run arbitrary code by attaching callbacks + * that would be executed in place of the named injection point. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/backend/utils/misc/injection_point.c + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include + +#include "fmgr.h" +#include "miscadmin.h" +#include "storage/fd.h" +#include "storage/lwlock.h" +#include "storage/shmem.h" +#include "utils/hsearch.h" +#include "utils/injection_point.h" +#include "utils/memutils.h" + +#ifdef USE_INJECTION_POINTS + +/* Field sizes */ +#define INJ_NAME_MAXLEN 64 +#define INJ_LIB_MAXLEN 128 +#define INJ_FUNC_MAXLEN 128 +#define INJ_PRIVATE_MAXLEN 1024 + +/* Single injection point stored in shared memory */ +typedef struct InjectionPointEntry +{ + /* + * Because injection points need to be usable without LWLocks, we use a + * generation counter on each entry to allow safe, lock-free reading. + * + * To read an entry, first read the current 'generation' value. If it's + * even, then the slot is currently unused, and odd means it's in use. + * When reading the other fields, beware that they may change while + * reading them, if the entry is released and reused! After reading the + * other fields, read 'generation' again: if its value hasn't changed, you + * can be certain that the other fields you read are valid. Otherwise, + * the slot was concurrently recycled, and you should ignore it. + * + * When adding an entry, you must store all the other fields first, and + * then update the generation number, with an appropriate memory barrier + * in between. In addition to that protocol, you must also hold + * InjectionPointLock, to prevent two backends from modifying the array at + * the same time. + */ + pg_atomic_uint64 generation; + + char name[INJ_NAME_MAXLEN]; /* point name */ + char library[INJ_LIB_MAXLEN]; /* library */ + char function[INJ_FUNC_MAXLEN]; /* function */ + + /* + * Opaque data area that modules can use to pass some custom data to + * callbacks, registered when attached. + */ + char private_data[INJ_PRIVATE_MAXLEN]; +} InjectionPointEntry; + +#define MAX_INJECTION_POINTS 128 + +/* + * Shared memory array of active injection points. + * + * 'max_inuse' is the highest index currently in use, plus one. It's just an + * optimization to avoid scanning through the whole entry, in the common case + * that there are no injection points, or only a few. + */ +typedef struct InjectionPointsCtl +{ + pg_atomic_uint32 max_inuse; + InjectionPointEntry entries[MAX_INJECTION_POINTS]; +} InjectionPointsCtl; + +NON_EXEC_STATIC InjectionPointsCtl *ActiveInjectionPoints; + +/* + * Backend local cache of injection callbacks already loaded, stored in + * TopMemoryContext. + */ +typedef struct InjectionPointCacheEntry +{ + char name[INJ_NAME_MAXLEN]; + char private_data[INJ_PRIVATE_MAXLEN]; + InjectionPointCallback callback; + + /* + * Shmem slot and copy of its generation number when this cache entry was + * created. They can be used to validate if the cached entry is still + * valid. + */ + int slot_idx; + uint64 generation; +} InjectionPointCacheEntry; + +static HTAB *InjectionPointCache = NULL; + +/* + * injection_point_cache_add + * + * Add an injection point to the local cache. + */ +static InjectionPointCacheEntry * +injection_point_cache_add(const char *name, + int slot_idx, + uint64 generation, + InjectionPointCallback callback, + const void *private_data) +{ + InjectionPointCacheEntry *entry; + bool found; + + /* If first time, initialize */ + if (InjectionPointCache == NULL) + { + HASHCTL hash_ctl; + + hash_ctl.keysize = sizeof(char[INJ_NAME_MAXLEN]); + hash_ctl.entrysize = sizeof(InjectionPointCacheEntry); + hash_ctl.hcxt = TopMemoryContext; + + InjectionPointCache = hash_create("InjectionPoint cache hash", + MAX_INJECTION_POINTS, + &hash_ctl, + HASH_ELEM | HASH_STRINGS | HASH_CONTEXT); + } + + entry = (InjectionPointCacheEntry *) + hash_search(InjectionPointCache, name, HASH_ENTER, &found); + + Assert(!found); + strlcpy(entry->name, name, sizeof(entry->name)); + entry->slot_idx = slot_idx; + entry->generation = generation; + entry->callback = callback; + memcpy(entry->private_data, private_data, INJ_PRIVATE_MAXLEN); + + return entry; +} + +/* + * injection_point_cache_remove + * + * Remove entry from the local cache. Note that this leaks a callback + * loaded but removed later on, which should have no consequence from + * a testing perspective. + */ +static void +injection_point_cache_remove(const char *name) +{ + bool found PG_USED_FOR_ASSERTS_ONLY; + + (void) hash_search(InjectionPointCache, name, HASH_REMOVE, &found); + Assert(found); +} + +/* + * injection_point_cache_load + * + * Load an injection point into the local cache. + */ +static InjectionPointCacheEntry * +injection_point_cache_load(InjectionPointEntry *entry, int slot_idx, uint64 generation) +{ + char path[MAXPGPATH]; + void *injection_callback_local; + + snprintf(path, MAXPGPATH, "%s/%s%s", pkglib_path, + entry->library, DLSUFFIX); + + if (!pg_file_exists(path)) + elog(ERROR, "could not find library \"%s\" for injection point \"%s\"", + path, entry->name); + + injection_callback_local = (void *) + load_external_function(path, entry->function, false, NULL); + + if (injection_callback_local == NULL) + elog(ERROR, "could not find function \"%s\" in library \"%s\" for injection point \"%s\"", + entry->function, path, entry->name); + + /* add it to the local cache */ + return injection_point_cache_add(entry->name, + slot_idx, + generation, + injection_callback_local, + entry->private_data); +} + +/* + * injection_point_cache_get + * + * Retrieve an injection point from the local cache, if any. + */ +static InjectionPointCacheEntry * +injection_point_cache_get(const char *name) +{ + bool found; + InjectionPointCacheEntry *entry; + + /* no callback if no cache yet */ + if (InjectionPointCache == NULL) + return NULL; + + entry = (InjectionPointCacheEntry *) + hash_search(InjectionPointCache, name, HASH_FIND, &found); + + if (found) + return entry; + + return NULL; +} +#endif /* USE_INJECTION_POINTS */ + +/* + * Return the space for dynamic shared hash table. + */ +Size +InjectionPointShmemSize(void) +{ +#ifdef USE_INJECTION_POINTS + Size sz = 0; + + sz = add_size(sz, sizeof(InjectionPointsCtl)); + return sz; +#else + return 0; +#endif +} + +/* + * Allocate shmem space for dynamic shared hash. + */ +void +InjectionPointShmemInit(void) +{ +#ifdef USE_INJECTION_POINTS + bool found; + + ActiveInjectionPoints = ShmemInitStruct("InjectionPoint hash", + sizeof(InjectionPointsCtl), + &found); + if (!IsUnderPostmaster) + { + Assert(!found); + pg_atomic_init_u32(&ActiveInjectionPoints->max_inuse, 0); + for (int i = 0; i < MAX_INJECTION_POINTS; i++) + pg_atomic_init_u64(&ActiveInjectionPoints->entries[i].generation, 0); + } + else + Assert(found); +#endif +} + +/* + * Attach a new injection point. + */ +void +InjectionPointAttach(const char *name, + const char *library, + const char *function, + const void *private_data, + int private_data_size) +{ +#ifdef USE_INJECTION_POINTS + InjectionPointEntry *entry; + uint64 generation; + uint32 max_inuse; + int free_idx; + + if (strlen(name) >= INJ_NAME_MAXLEN) + elog(ERROR, "injection point name %s too long (maximum of %u)", + name, INJ_NAME_MAXLEN); + if (strlen(library) >= INJ_LIB_MAXLEN) + elog(ERROR, "injection point library %s too long (maximum of %u)", + library, INJ_LIB_MAXLEN); + if (strlen(function) >= INJ_FUNC_MAXLEN) + elog(ERROR, "injection point function %s too long (maximum of %u)", + function, INJ_FUNC_MAXLEN); + if (private_data_size >= INJ_PRIVATE_MAXLEN) + elog(ERROR, "injection point data too long (maximum of %u)", + INJ_PRIVATE_MAXLEN); + + /* + * Allocate and register a new injection point. A new point should not + * exist. For testing purposes this should be fine. + */ + LWLockAcquire(InjectionPointLock, LW_EXCLUSIVE); + max_inuse = pg_atomic_read_u32(&ActiveInjectionPoints->max_inuse); + free_idx = -1; + + for (int idx = 0; idx < max_inuse; idx++) + { + entry = &ActiveInjectionPoints->entries[idx]; + generation = pg_atomic_read_u64(&entry->generation); + if (generation % 2 == 0) + { + /* + * Found a free slot where we can add the new entry, but keep + * going so that we will find out if the entry already exists. + */ + if (free_idx == -1) + free_idx = idx; + } + else if (strcmp(entry->name, name) == 0) + elog(ERROR, "injection point \"%s\" already defined", name); + } + if (free_idx == -1) + { + if (max_inuse == MAX_INJECTION_POINTS) + elog(ERROR, "too many injection points"); + free_idx = max_inuse; + } + entry = &ActiveInjectionPoints->entries[free_idx]; + generation = pg_atomic_read_u64(&entry->generation); + Assert(generation % 2 == 0); + + /* Save the entry */ + strlcpy(entry->name, name, sizeof(entry->name)); + entry->name[INJ_NAME_MAXLEN - 1] = '\0'; + strlcpy(entry->library, library, sizeof(entry->library)); + entry->library[INJ_LIB_MAXLEN - 1] = '\0'; + strlcpy(entry->function, function, sizeof(entry->function)); + entry->function[INJ_FUNC_MAXLEN - 1] = '\0'; + if (private_data != NULL) + memcpy(entry->private_data, private_data, private_data_size); + + pg_write_barrier(); + pg_atomic_write_u64(&entry->generation, generation + 1); + + if (free_idx + 1 > max_inuse) + pg_atomic_write_u32(&ActiveInjectionPoints->max_inuse, free_idx + 1); + + LWLockRelease(InjectionPointLock); + +#else + elog(ERROR, "injection points are not supported by this build"); +#endif +} + +/* + * Detach an existing injection point. + * + * Returns true if the injection point was detached, false otherwise. + */ +bool +InjectionPointDetach(const char *name) +{ +#ifdef USE_INJECTION_POINTS + bool found = false; + int idx; + int max_inuse; + + LWLockAcquire(InjectionPointLock, LW_EXCLUSIVE); + + /* Find it in the shmem array, and mark the slot as unused */ + max_inuse = (int) pg_atomic_read_u32(&ActiveInjectionPoints->max_inuse); + for (idx = max_inuse - 1; idx >= 0; --idx) + { + InjectionPointEntry *entry = &ActiveInjectionPoints->entries[idx]; + uint64 generation; + + generation = pg_atomic_read_u64(&entry->generation); + if (generation % 2 == 0) + continue; /* empty slot */ + + if (strcmp(entry->name, name) == 0) + { + Assert(!found); + found = true; + pg_atomic_write_u64(&entry->generation, generation + 1); + break; + } + } + + /* If we just removed the highest-numbered entry, update 'max_inuse' */ + if (found && idx == max_inuse - 1) + { + for (; idx >= 0; --idx) + { + InjectionPointEntry *entry = &ActiveInjectionPoints->entries[idx]; + uint64 generation; + + generation = pg_atomic_read_u64(&entry->generation); + if (generation % 2 != 0) + break; + } + pg_atomic_write_u32(&ActiveInjectionPoints->max_inuse, idx + 1); + } + LWLockRelease(InjectionPointLock); + + return found; +#else + elog(ERROR, "Injection points are not supported by this build"); + return true; /* silence compiler */ +#endif +} + +#ifdef USE_INJECTION_POINTS +/* + * Common workhorse of InjectionPointRun() and InjectionPointLoad() + * + * Checks if an injection point exists in shared memory, and update + * the local cache entry accordingly. + */ +static InjectionPointCacheEntry * +InjectionPointCacheRefresh(const char *name) +{ + uint32 max_inuse; + int namelen; + InjectionPointEntry local_copy; + InjectionPointCacheEntry *cached; + + /* + * First read the number of in-use slots. More entries can be added or + * existing ones can be removed while we're reading them. If the entry + * we're looking for is concurrently added or removed, we might or might + * not see it. That's OK. + */ + max_inuse = pg_atomic_read_u32(&ActiveInjectionPoints->max_inuse); + if (max_inuse == 0) + { + if (InjectionPointCache) + { + hash_destroy(InjectionPointCache); + InjectionPointCache = NULL; + } + return NULL; + } + + /* + * If we have this entry in the local cache already, check if the cached + * entry is still valid. + */ + cached = injection_point_cache_get(name); + if (cached) + { + int idx = cached->slot_idx; + InjectionPointEntry *entry = &ActiveInjectionPoints->entries[idx]; + + if (pg_atomic_read_u64(&entry->generation) == cached->generation) + { + /* still good */ + return cached; + } + injection_point_cache_remove(name); + cached = NULL; + } + + /* + * Search the shared memory array. + * + * It's possible that the entry we're looking for is concurrently detached + * or attached. Or detached *and* re-attached, to the same slot or a + * different slot. Detach and re-attach is not an atomic operation, so + * it's OK for us to return the old value, NULL, or the new value in such + * cases. + */ + namelen = strlen(name); + for (int idx = 0; idx < max_inuse; idx++) + { + InjectionPointEntry *entry = &ActiveInjectionPoints->entries[idx]; + uint64 generation; + + /* + * Read the generation number so that we can detect concurrent + * modifications. The read barrier ensures that the generation number + * is loaded before any of the other fields. + */ + generation = pg_atomic_read_u64(&entry->generation); + if (generation % 2 == 0) + continue; /* empty slot */ + pg_read_barrier(); + + /* Is this the injection point we're looking for? */ + if (memcmp(entry->name, name, namelen + 1) != 0) + continue; + + /* + * The entry can change at any time, if the injection point is + * concurrently detached. Copy it to local memory, and re-check the + * generation. If the generation hasn't changed, we know our local + * copy is coherent. + */ + memcpy(&local_copy, entry, sizeof(InjectionPointEntry)); + + pg_read_barrier(); + if (pg_atomic_read_u64(&entry->generation) != generation) + { + /* + * The entry was concurrently detached. + * + * Continue the search, because if the generation number changed, + * we cannot trust the result of the name comparison we did above. + * It's theoretically possible that it falsely matched a mixed-up + * state of the old and new name, if the slot was recycled with a + * different name. + */ + continue; + } + + /* Success! Load it into the cache and return it */ + return injection_point_cache_load(&local_copy, idx, generation); + } + return NULL; +} +#endif + +/* + * Execute an injection point, if defined. + */ +void +InjectionPointRun(const char *name) +{ +#ifdef USE_INJECTION_POINTS + InjectionPointCacheEntry *cache_entry; + + cache_entry = InjectionPointCacheRefresh(name); + if (cache_entry) + cache_entry->callback(name, cache_entry->private_data); +#else + elog(ERROR, "Injection points are not supported by this build"); +#endif +} diff --git a/src/backend/utils/misc/meson.build b/src/backend/utils/misc/meson.build index f719c97c05118..6669502205224 100644 --- a/src/backend/utils/misc/meson.build +++ b/src/backend/utils/misc/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'conffiles.c', @@ -6,6 +6,7 @@ backend_sources += files( 'guc_funcs.c', 'guc_tables.c', 'help_config.c', + 'injection_point.c', 'pg_config.c', 'pg_controldata.c', 'pg_rusage.c', diff --git a/src/backend/utils/misc/pg_config.c b/src/backend/utils/misc/pg_config.c index 5ca8445a4cfd3..2af47e1244faa 100644 --- a/src/backend/utils/misc/pg_config.c +++ b/src/backend/utils/misc/pg_config.c @@ -3,7 +3,7 @@ * pg_config.c * Expose same output as pg_config except as an SRF * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -14,7 +14,6 @@ #include "postgres.h" -#include "catalog/pg_type.h" #include "common/config_info.h" #include "funcapi.h" #include "miscadmin.h" diff --git a/src/backend/utils/misc/pg_controldata.c b/src/backend/utils/misc/pg_controldata.c index f2c1084797b0d..98c932dc7bd64 100644 --- a/src/backend/utils/misc/pg_controldata.c +++ b/src/backend/utils/misc/pg_controldata.c @@ -5,7 +5,7 @@ * Routines to expose the contents of the control data file via * a set of SQL functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -20,10 +20,10 @@ #include "access/xlog.h" #include "access/xlog_internal.h" #include "catalog/pg_control.h" -#include "catalog/pg_type.h" #include "common/controldata_utils.h" #include "funcapi.h" #include "miscadmin.h" +#include "storage/lwlock.h" #include "utils/builtins.h" #include "utils/pg_lsn.h" #include "utils/timestamp.h" @@ -42,7 +42,9 @@ pg_control_system(PG_FUNCTION_ARGS) elog(ERROR, "return type must be a row type"); /* read the control file */ + LWLockAcquire(ControlFileLock, LW_SHARED); ControlFile = get_controlfile(DataDir, &crc_ok); + LWLockRelease(ControlFileLock); if (!crc_ok) ereport(ERROR, (errmsg("calculated CRC checksum does not match value stored in file"))); @@ -80,7 +82,9 @@ pg_control_checkpoint(PG_FUNCTION_ARGS) elog(ERROR, "return type must be a row type"); /* Read the control file. */ + LWLockAcquire(ControlFileLock, LW_SHARED); ControlFile = get_controlfile(DataDir, &crc_ok); + LWLockRelease(ControlFileLock); if (!crc_ok) ereport(ERROR, (errmsg("calculated CRC checksum does not match value stored in file"))); @@ -169,7 +173,9 @@ pg_control_recovery(PG_FUNCTION_ARGS) elog(ERROR, "return type must be a row type"); /* read the control file */ + LWLockAcquire(ControlFileLock, LW_SHARED); ControlFile = get_controlfile(DataDir, &crc_ok); + LWLockRelease(ControlFileLock); if (!crc_ok) ereport(ERROR, (errmsg("calculated CRC checksum does not match value stored in file"))); @@ -208,7 +214,9 @@ pg_control_init(PG_FUNCTION_ARGS) elog(ERROR, "return type must be a row type"); /* read the control file */ + LWLockAcquire(ControlFileLock, LW_SHARED); ControlFile = get_controlfile(DataDir, &crc_ok); + LWLockRelease(ControlFileLock); if (!crc_ok) ereport(ERROR, (errmsg("calculated CRC checksum does not match value stored in file"))); diff --git a/src/backend/utils/misc/pg_rusage.c b/src/backend/utils/misc/pg_rusage.c index 20bf1c681a3a3..d3810cce0694e 100644 --- a/src/backend/utils/misc/pg_rusage.c +++ b/src/backend/utils/misc/pg_rusage.c @@ -4,7 +4,7 @@ * Resource usage measurement support routines. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample index e4c0269fa3d75..667e0dc40a24f 100644 --- a/src/backend/utils/misc/postgresql.conf.sample +++ b/src/backend/utils/misc/postgresql.conf.sample @@ -96,7 +96,6 @@ #authentication_timeout = 1min # 1s-600s #password_encryption = scram-sha-256 # scram-sha-256 or md5 #scram_iterations = 4096 -#db_user_namespace = off # GSSAPI using Kerberos #krb_server_keyfile = 'FILE:${sysconfdir}/krb5.keytab' @@ -111,7 +110,7 @@ #ssl_crl_file = '' #ssl_crl_dir = '' #ssl_key_file = 'server.key' -#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers +#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers #ssl_prefer_server_ciphers = on #ssl_ecdh_curve = 'prime256v1' #ssl_min_protocol_version = 'TLSv1.2' @@ -140,8 +139,8 @@ # 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 1MB -#autovacuum_work_mem = -1 # min 1MB, or -1 to use maintenance_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 @@ -158,15 +157,27 @@ # mmap # (change requires restart) #min_dynamic_shared_memory = 0MB # (change requires restart) -#vacuum_buffer_usage_limit = 256kB # size of vacuum and analyze buffer access strategy ring; +#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) + # - Disk - #temp_file_limit = -1 # limits per-process temp file space # in kilobytes, or -1 for no limit +#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 @@ -192,14 +203,13 @@ #backend_flush_after = 0 # measured in pages, 0 disables #effective_io_concurrency = 1 # 1-1000; 0 disables prefetching #maintenance_io_concurrency = 10 # 1-1000; 0 disables prefetching +#io_combine_limit = 128kB # usually 1-32 blocks (depends on OS) #max_worker_processes = 8 # (change requires restart) -#max_parallel_workers_per_gather = 2 # taken from max_parallel_workers -#max_parallel_maintenance_workers = 2 # taken from max_parallel_workers -#max_parallel_workers = 8 # maximum number of max_worker_processes that +#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 -#old_snapshot_threshold = -1 # 1min-60d; -1 disables; 0 is immediate - # (change requires restart) #------------------------------------------------------------------------------ @@ -249,9 +259,9 @@ # - 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 - @@ -283,7 +293,7 @@ # Set these only when performing a targeted recovery. #recovery_target = '' # 'immediate' to end recovery as soon as a - # consistent state is reached + # consistent state is reached # (change requires restart) #recovery_target_name = '' # the named restore point to which recovery will proceed # (change requires restart) @@ -293,14 +303,19 @@ # (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: +#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) + # (change requires restart) #recovery_target_action = 'pause' # 'pause', 'promote', 'shutdown' - # (change requires restart) + # (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 #------------------------------------------------------------------------------ @@ -329,6 +344,8 @@ # 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 - @@ -356,6 +373,7 @@ #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 - @@ -394,6 +412,7 @@ #enable_seqscan = on #enable_sort = on #enable_tidscan = on +#enable_group_by_reordering = on # - Planner Cost Constants - @@ -402,7 +421,7 @@ #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_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 @@ -463,7 +482,7 @@ #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 + # 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 @@ -645,19 +664,19 @@ #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 + # 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 inserts over table - # size before insert vacuum + # size before insert vacuum #autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze #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) + # 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 @@ -694,10 +713,11 @@ #default_transaction_read_only = off #default_transaction_deferrable = off #session_replication_role = 'origin' -#statement_timeout = 0 # in milliseconds, 0 is disabled -#lock_timeout = 0 # in milliseconds, 0 is disabled +#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 +#idle_session_timeout = 0 # in milliseconds, 0 is disabled #vacuum_freeze_table_age = 150000000 #vacuum_freeze_min_age = 50000000 #vacuum_failsafe_age = 1600000000 @@ -709,13 +729,14 @@ #xmloption = 'content' #gin_pending_list_limit = 4MB #createrole_self_grant = '' # set and/or inherit +#event_triggers = on # - Locale and Formatting - #datestyle = 'iso, mdy' #intervalstyle = 'postgres' #timezone = 'GMT' -#timezone_abbreviations = 'Default' # Select the set of available time zone +#timezone_abbreviations = 'Default' # Select the set of available time zone # abbreviations. Currently, there are # Default # Australia (historical usage) @@ -728,7 +749,7 @@ # encoding # These settings are initialized by initdb, but they can be changed. -#lc_messages = 'C' # locale for system error message +#lc_messages = '' # locale for system error message # strings #lc_monetary = 'C' # locale for monetary formatting #lc_numeric = 'C' # locale for number formatting @@ -744,7 +765,7 @@ #local_preload_libraries = '' #session_preload_libraries = '' -#shared_preload_libraries = '' # (change requires restart) +#shared_preload_libraries = '' # (change requires restart) #jit_provider = 'llvmjit' # JIT library to use # - Other Defaults - @@ -765,7 +786,7 @@ #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_pred_locks_per_page = 2 # min 0 #------------------------------------------------------------------------------ @@ -785,6 +806,7 @@ # - Other Platforms and Clients - #transform_null_equals = off +#allow_alter_system = on #------------------------------------------------------------------------------ diff --git a/src/backend/utils/misc/ps_status.c b/src/backend/utils/misc/ps_status.c index 104c01d96668a..9da6377402024 100644 --- a/src/backend/utils/misc/ps_status.c +++ b/src/backend/utils/misc/ps_status.c @@ -7,7 +7,7 @@ * * src/backend/utils/misc/ps_status.c * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * various details abducted from various places *-------------------------------------------------------------------- */ @@ -19,9 +19,7 @@ #include #endif -#include "libpq/libpq.h" #include "miscadmin.h" -#include "pgstat.h" #include "utils/guc.h" #include "utils/ps_status.h" @@ -52,7 +50,7 @@ bool update_process_title = DEFAULT_UPDATE_PROCESS_TITLE; #define PS_USE_SETPROCTITLE_FAST #elif defined(HAVE_SETPROCTITLE) #define PS_USE_SETPROCTITLE -#elif defined(__linux__) || defined(_AIX) || defined(__sun) || defined(__darwin__) +#elif defined(__linux__) || defined(__sun) || defined(__darwin__) #define PS_USE_CLOBBER_ARGV #elif defined(WIN32) #define PS_USE_WIN32 @@ -62,7 +60,7 @@ bool update_process_title = DEFAULT_UPDATE_PROCESS_TITLE; /* Different systems want the buffer padded differently */ -#if defined(_AIX) || defined(__linux__) || defined(__darwin__) +#if defined(__linux__) || defined(__darwin__) #define PS_PADDING '\0' #else #define PS_PADDING ' ' @@ -109,7 +107,8 @@ static char **save_argv; * (The original argv[] will not be overwritten by this routine, but may be * overwritten during init_ps_display. Also, the physical location of the * environment strings may be moved, so this should be called before any code - * that might try to hang onto a getenv() result.) + * that might try to hang onto a getenv() result. But see hack for musl + * within.) * * Note that in case of failure this cannot call elog() as that is not * initialized yet. We rely on write_stderr() instead. @@ -124,7 +123,7 @@ save_ps_display_args(int argc, char **argv) /* * If we're going to overwrite the argv area, count the available space. - * Also move the environment to make additional room. + * Also move the environment strings to make additional room. */ { char *end_of_area = NULL; @@ -153,7 +152,33 @@ save_ps_display_args(int argc, char **argv) for (i = 0; environ[i] != NULL; i++) { if (end_of_area + 1 == environ[i]) - end_of_area = environ[i] + strlen(environ[i]); + { + /* + * The musl dynamic linker keeps a static pointer to the + * initial value of LD_LIBRARY_PATH, if that is defined in the + * process's environment. Therefore, we must not overwrite the + * value of that setting and thus cannot advance end_of_area + * beyond it. Musl does not define any identifying compiler + * symbol, so we have to do this unless we see a symbol + * identifying a Linux libc we know is safe. + */ +#if defined(__linux__) && (!defined(__GLIBC__) && !defined(__UCLIBC__)) + if (strncmp(environ[i], "LD_LIBRARY_PATH=", 16) == 0) + { + /* + * We can overwrite the name, but stop at the equals sign. + * Future loop iterations will not find any more + * contiguous space, but we don't break early because we + * need to count the total number of environ[] entries. + */ + end_of_area = environ[i] + 15; + } + else +#endif + { + end_of_area = environ[i] + strlen(environ[i]); + } + } } ps_buffer = argv[0]; @@ -185,7 +210,7 @@ save_ps_display_args(int argc, char **argv) * If we're going to change the original argv[] then make a copy for * argument parsing purposes. * - * (NB: do NOT think to remove the copying of argv[], even though + * NB: do NOT think to remove the copying of argv[], even though * postmaster.c finishes looking at argv[] long before we ever consider * changing the ps display. On some platforms, getopt() keeps pointers * into the argv array, and will get horribly confused when it is diff --git a/src/backend/utils/misc/queryenvironment.c b/src/backend/utils/misc/queryenvironment.c index 430a587948bab..2b16e7a8c3c75 100644 --- a/src/backend/utils/misc/queryenvironment.c +++ b/src/backend/utils/misc/queryenvironment.c @@ -11,7 +11,7 @@ * on callers, since this is an opaque structure. This is the reason to * require a create function. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/utils/misc/rls.c b/src/backend/utils/misc/rls.c index b8c9a133a8be5..9947e3c2469ba 100644 --- a/src/backend/utils/misc/rls.c +++ b/src/backend/utils/misc/rls.c @@ -3,7 +3,7 @@ * rls.c * RLS-related utility functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -21,7 +21,7 @@ #include "catalog/pg_class.h" #include "miscadmin.h" #include "utils/acl.h" -#include "utils/builtins.h" +#include "utils/fmgrprotos.h" #include "utils/lsyscache.h" #include "utils/rls.h" #include "utils/syscache.h" diff --git a/src/backend/utils/misc/sampling.c b/src/backend/utils/misc/sampling.c index dae0ae71d7694..933db06702ccd 100644 --- a/src/backend/utils/misc/sampling.c +++ b/src/backend/utils/misc/sampling.c @@ -3,7 +3,7 @@ * sampling.c * Relation block sampling routines. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/utils/misc/superuser.c b/src/backend/utils/misc/superuser.c index 71c0e725a6675..1490326a1580a 100644 --- a/src/backend/utils/misc/superuser.c +++ b/src/backend/utils/misc/superuser.c @@ -9,7 +9,7 @@ * the single-user case works. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/backend/utils/misc/timeout.c b/src/backend/utils/misc/timeout.c index 8ab755d363d47..ec7e570920a5d 100644 --- a/src/backend/utils/misc/timeout.c +++ b/src/backend/utils/misc/timeout.c @@ -3,7 +3,7 @@ * timeout.c * Routines to multiplex SIGALRM interrupts for multiple timeout reasons. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -17,7 +17,7 @@ #include #include "miscadmin.h" -#include "storage/proc.h" +#include "storage/latch.h" #include "utils/timeout.h" #include "utils/timestamp.h" @@ -363,8 +363,6 @@ schedule_alarm(TimestampTz now) static void handle_sig_alarm(SIGNAL_ARGS) { - int save_errno = errno; - /* * Bump the holdoff counter, to make sure nothing we call will process * interrupts directly. No timeout handler should do that, but these @@ -452,8 +450,6 @@ handle_sig_alarm(SIGNAL_ARGS) } RESUME_INTERRUPTS(); - - errno = save_errno; } diff --git a/src/backend/utils/misc/tzparser.c b/src/backend/utils/misc/tzparser.c index dfb0253150e1c..21fd866d6d639 100644 --- a/src/backend/utils/misc/tzparser.c +++ b/src/backend/utils/misc/tzparser.c @@ -11,7 +11,7 @@ * PG_TRY if necessary. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -26,6 +26,7 @@ #include "miscadmin.h" #include "storage/fd.h" +#include "utils/datetime.h" #include "utils/guc.h" #include "utils/memutils.h" #include "utils/tzparser.h" @@ -66,8 +67,8 @@ validateTzEntry(tzEntry *tzentry) /* * Sanity-check the offset: shouldn't exceed 14 hours */ - if (tzentry->offset > 14 * 60 * 60 || - tzentry->offset < -14 * 60 * 60) + if (tzentry->offset > 14 * SECS_PER_HOUR || + tzentry->offset < -14 * SECS_PER_HOUR) { GUC_check_errmsg("time zone offset %d is out of range in time zone file \"%s\", line %d", tzentry->offset, @@ -155,7 +156,7 @@ splitTzLine(const char *filename, int lineno, char *line, tzEntry *tzentry) * zones that probably will never be used in the current session. */ tzentry->zone = pstrdup(offset); - tzentry->offset = 0; + tzentry->offset = 0 * SECS_PER_HOUR; tzentry->is_dst = false; remain = strtok(NULL, WHITESPACE); } diff --git a/src/backend/utils/mmgr/Makefile b/src/backend/utils/mmgr/Makefile index dae3432c98af5..01a1fb8527022 100644 --- a/src/backend/utils/mmgr/Makefile +++ b/src/backend/utils/mmgr/Makefile @@ -15,6 +15,7 @@ include $(top_builddir)/src/Makefile.global OBJS = \ alignedalloc.o \ aset.o \ + bump.o \ dsa.o \ freepage.o \ generation.o \ diff --git a/src/backend/utils/mmgr/README b/src/backend/utils/mmgr/README index b20b9d48526b7..695088bb66dae 100644 --- a/src/backend/utils/mmgr/README +++ b/src/backend/utils/mmgr/README @@ -395,14 +395,14 @@ relevant MemoryContext as a parameter, operations like free and realloc are trickier. To make those work, we require all memory context types to produce allocated chunks that are immediately, without any padding, preceded by a uint64 value of which the least -significant 3 bits are set to the owning context's MemoryContextMethodID. +significant 4 bits are set to the owning context's MemoryContextMethodID. This allows the code to determine the correct MemoryContextMethods to -use by looking up the mcxt_methods[] array using the 3 bits as an index +use by looking up the mcxt_methods[] array using the 4 bits as an index into that array. If a type of allocator needs additional information about its chunks, like e.g. the size of the allocation, that information can in turn -either be encoded into the remaining 61 bits of the preceding uint64 value +either be encoded into the remaining 60 bits of the preceding uint64 value or if more space is required, additional values may be stored directly prior to the uint64 value. It is up to the context implementation to manage this. @@ -420,13 +420,20 @@ pfree(void *pointer) All of the current memory contexts make use of the MemoryChunk header type which is defined in memutils_memorychunk.h. This suits all of the existing -context types well as it makes use of the remaining 61-bits of the uint64 +context types well as it makes use of the remaining 60-bits of the uint64 header to efficiently encode the size of the chunk of memory (or freelist index, in the case of aset.c) and the number of bytes which must be subtracted from the chunk in order to obtain a reference to the block that the chunk -belongs to. 30 bits are used for each of these. If more than 30 bits are -required then the memory context must manage that itself. This can be done by -calling the MemoryChunkSetHdrMaskExternal() function on the given chunk. +belongs to. 30 bits are used for each of these, but only a total of 59 bits +as the lowest bit for the chunk to block offset is the same bit as the highest +bit of the chunk size. This overlapping is possible as the relative offset +between the block and the chunk is expected to be a MAXALIGNed value which +guarantees the lowest bit is always 0. If more than 30 bits are required for +each of these fields then the memory context must manage that itself. This +can be done by calling the MemoryChunkSetHdrMaskExternal() function on the +given chunk. Whether a chunk is an external chunk can be determined by the 1 +remaining bit from the 64-bit MemoryChunk. + Currently, each memory context type stores large allocations on dedicated blocks (which always contain only a single chunk). For these, finding the block is simple as we know that the chunk must be the first on the given @@ -464,25 +471,32 @@ thrashing. Alternative Memory Context Implementations ------------------------------------------ -aset.c is our default general-purpose implementation, working fine -in most situations. We also have two implementations optimized for -special use cases, providing either better performance or lower memory -usage compared to aset.c (or both). - -* slab.c (SlabContext) is designed for allocations of fixed-length - chunks, and does not allow allocations of chunks with different size. - -* generation.c (GenerationContext) is designed for cases when chunks - are allocated in groups with similar lifespan (generations), or - roughly in FIFO order. - -Both memory contexts aim to free memory back to the operating system -(unlike aset.c, which keeps the freed chunks in a freelist, and only -returns the memory when reset/deleted). - -These memory contexts were initially developed for ReorderBuffer, but -may be useful elsewhere as long as the allocation patterns match. - +aset.c (AllocSetContext) is our default general-purpose allocator. Three other +allocator types also exist which are special-purpose: + +* slab.c (SlabContext) is designed for allocations of fixed-sized + chunks. The fixed chunk size must be specified when creating the context. + New chunks are allocated to the fullest block, keeping used chunks densely + packed together to avoid memory fragmentation. This also increases the + chances that pfree'ing a chunk will result in a block becoming empty of all + chunks and allow it to be free'd back to the operating system. + +* generation.c (GenerationContext) is best suited for cases when chunks are + allocated in groups with similar lifespan (generations), or roughly in FIFO + order. No attempt is made to reuse space left by pfree'd chunks. Blocks + are returned to the operating system when all chunks on them have been + pfree'd. + +* bump.c (BumpContext) is best suited for use cases that require densely + allocated chunks of memory that never need to be individually pfree'd or + repalloc'd. These operations are unsupported due to BumpContext chunks + having no chunk header. No chunk header means more densely packed chunks, + which is especially useful for workloads that perform lots of small + allocations. Blocks are only free'd back to the operating system when the + context is reset or deleted. + +For further details, please read the header comment in the corresponding .c +file. Memory Accounting ----------------- diff --git a/src/backend/utils/mmgr/alignedalloc.c b/src/backend/utils/mmgr/alignedalloc.c index 627e988852b75..c266fb3dbb148 100644 --- a/src/backend/utils/mmgr/alignedalloc.c +++ b/src/backend/utils/mmgr/alignedalloc.c @@ -8,7 +8,7 @@ * operations such as pfree() and repalloc() to work correctly on a memory * chunk that was allocated by palloc_aligned(). * - * Portions Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2022-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/mmgr/alignedalloc.c @@ -57,7 +57,7 @@ AlignedAllocFree(void *pointer) * memory will be uninitialized. */ void * -AlignedAllocRealloc(void *pointer, Size size) +AlignedAllocRealloc(void *pointer, Size size, int flags) { MemoryChunk *redirchunk = PointerGetMemoryChunk(pointer); Size alignto; @@ -97,14 +97,17 @@ AlignedAllocRealloc(void *pointer, Size size) #endif ctx = GetMemoryChunkContext(unaligned); - newptr = MemoryContextAllocAligned(ctx, size, alignto, 0); + newptr = MemoryContextAllocAligned(ctx, size, alignto, flags); /* * We may memcpy beyond the end of the original allocation request size, * so we must mark the entire allocation as defined. */ - VALGRIND_MAKE_MEM_DEFINED(pointer, old_size); - memcpy(newptr, pointer, Min(size, old_size)); + if (likely(newptr != NULL)) + { + VALGRIND_MAKE_MEM_DEFINED(pointer, old_size); + memcpy(newptr, pointer, Min(size, old_size)); + } pfree(unaligned); return newptr; diff --git a/src/backend/utils/mmgr/aset.c b/src/backend/utils/mmgr/aset.c index 0bbbf93672eb2..dede30dd86a94 100644 --- a/src/backend/utils/mmgr/aset.c +++ b/src/backend/utils/mmgr/aset.c @@ -7,7 +7,7 @@ * type. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -49,8 +49,8 @@ #include "port/pg_bitutils.h" #include "utils/memdebug.h" #include "utils/memutils.h" -#include "utils/memutils_memorychunk.h" #include "utils/memutils_internal.h" +#include "utils/memutils_memorychunk.h" /*-------------------- * Chunk freelist k holds chunks of size 1 << (k + ALLOC_MINBITS), @@ -156,11 +156,10 @@ typedef struct AllocSetContext AllocBlock blocks; /* head of list of blocks in this set */ MemoryChunk *freelist[ALLOCSET_NUM_FREELISTS]; /* free chunk lists */ /* Allocation parameters for this context: */ - Size initBlockSize; /* initial block size */ - Size maxBlockSize; /* maximum block size */ - Size nextBlockSize; /* next block size to allocate */ - Size allocChunkLimit; /* effective chunk size limit */ - AllocBlock keeper; /* keep this block over resets */ + uint32 initBlockSize; /* initial block size */ + uint32 maxBlockSize; /* maximum block size */ + uint32 nextBlockSize; /* next block size to allocate */ + uint32 allocChunkLimit; /* effective chunk size limit */ /* freelist this context could be put in, or -1 if not a candidate: */ int freeListIndex; /* index in context_freelists[], or -1 */ } AllocSetContext; @@ -241,6 +240,13 @@ typedef struct AllocBlockData */ #define MAX_FREE_CONTEXTS 100 /* arbitrary limit on freelist length */ +/* Obtain the keeper block for an allocation set */ +#define KeeperBlock(set) \ + ((AllocBlock) (((char *) set) + MAXALIGN(sizeof(AllocSetContext)))) + +/* Check if the block is the keeper block of the given allocation set */ +#define IsKeeperBlock(set, block) ((block) == (KeeperBlock(set))) + typedef struct AllocSetFreeList { int num_free; /* current list length */ @@ -417,7 +423,7 @@ AllocSetContextCreateInternal(MemoryContext parent, name); ((MemoryContext) set)->mem_allocated = - set->keeper->endptr - ((char *) set); + KeeperBlock(set)->endptr - ((char *) set); return (MemoryContext) set; } @@ -453,7 +459,7 @@ AllocSetContextCreateInternal(MemoryContext parent, */ /* Fill in the initial block's block header */ - block = (AllocBlock) (((char *) set) + MAXALIGN(sizeof(AllocSetContext))); + block = KeeperBlock(set); block->aset = set; block->freeptr = ((char *) block) + ALLOC_BLOCKHDRSZ; block->endptr = ((char *) set) + firstBlockSize; @@ -465,15 +471,13 @@ AllocSetContextCreateInternal(MemoryContext parent, /* Remember block as part of block list */ set->blocks = block; - /* Mark block as not to be released at reset time */ - set->keeper = block; /* Finish filling in aset-specific parts of the context header */ MemSetAligned(set->freelist, 0, sizeof(set->freelist)); - set->initBlockSize = initBlockSize; - set->maxBlockSize = maxBlockSize; - set->nextBlockSize = initBlockSize; + set->initBlockSize = (uint32) initBlockSize; + set->maxBlockSize = (uint32) maxBlockSize; + set->nextBlockSize = (uint32) initBlockSize; set->freeListIndex = freeListIndex; /* @@ -544,7 +548,7 @@ AllocSetReset(MemoryContext context) #endif /* Remember keeper block size for Assert below */ - keepersize = set->keeper->endptr - ((char *) set); + keepersize = KeeperBlock(set)->endptr - ((char *) set); /* Clear chunk freelists */ MemSetAligned(set->freelist, 0, sizeof(set->freelist)); @@ -552,13 +556,13 @@ AllocSetReset(MemoryContext context) block = set->blocks; /* New blocks list will be just the keeper block */ - set->blocks = set->keeper; + set->blocks = KeeperBlock(set); while (block != NULL) { AllocBlock next = block->next; - if (block == set->keeper) + if (IsKeeperBlock(set, block)) { /* Reset the block, but don't return it to malloc */ char *datastart = ((char *) block) + ALLOC_BLOCKHDRSZ; @@ -614,7 +618,7 @@ AllocSetDelete(MemoryContext context) #endif /* Remember keeper block size for Assert below */ - keepersize = set->keeper->endptr - ((char *) set); + keepersize = KeeperBlock(set)->endptr - ((char *) set); /* * If the context is a candidate for a freelist, put it into that freelist @@ -663,14 +667,14 @@ AllocSetDelete(MemoryContext context) { AllocBlock next = block->next; - if (block != set->keeper) + if (!IsKeeperBlock(set, block)) context->mem_allocated -= block->endptr - ((char *) block); #ifdef CLOBBER_FREED_MEMORY wipe_mem(block, block->freeptr - ((char *) block)); #endif - if (block != set->keeper) + if (!IsKeeperBlock(set, block)) free(block); block = next; @@ -683,98 +687,304 @@ AllocSetDelete(MemoryContext context) } /* - * AllocSetAlloc - * Returns pointer to allocated memory of given size or NULL if - * request could not be completed; memory is added to the set. - * - * No request may exceed: - * MAXALIGN_DOWN(SIZE_MAX) - ALLOC_BLOCKHDRSZ - ALLOC_CHUNKHDRSZ - * All callers use a much-lower limit. + * Helper for AllocSetAlloc() that allocates an entire block for the chunk. * - * Note: when using valgrind, it doesn't matter how the returned allocation - * is marked, as mcxt.c will set it to UNDEFINED. In some paths we will - * return space that is marked NOACCESS - AllocSetRealloc has to beware! + * AllocSetAlloc()'s comment explains why this is separate. */ -void * -AllocSetAlloc(MemoryContext context, Size size) +pg_noinline +static void * +AllocSetAllocLarge(MemoryContext context, Size size, int flags) { AllocSet set = (AllocSet) context; AllocBlock block; MemoryChunk *chunk; - int fidx; Size chunk_size; Size blksize; - Assert(AllocSetIsValid(set)); + /* validate 'size' is within the limits for the given 'flags' */ + MemoryContextCheckSize(context, size, flags); - /* - * If requested size exceeds maximum for chunks, allocate an entire block - * for this request. - */ - if (size > set->allocChunkLimit) - { #ifdef MEMORY_CONTEXT_CHECKING - /* ensure there's always space for the sentinel byte */ - chunk_size = MAXALIGN(size + 1); + /* ensure there's always space for the sentinel byte */ + chunk_size = MAXALIGN(size + 1); #else - chunk_size = MAXALIGN(size); + chunk_size = MAXALIGN(size); #endif - blksize = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ; - block = (AllocBlock) malloc(blksize); - if (block == NULL) - return NULL; + blksize = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ; + block = (AllocBlock) malloc(blksize); + if (block == NULL) + return MemoryContextAllocationFailure(context, size, flags); - context->mem_allocated += blksize; + context->mem_allocated += blksize; - block->aset = set; - block->freeptr = block->endptr = ((char *) block) + blksize; + block->aset = set; + block->freeptr = block->endptr = ((char *) block) + blksize; - chunk = (MemoryChunk *) (((char *) block) + ALLOC_BLOCKHDRSZ); + chunk = (MemoryChunk *) (((char *) block) + ALLOC_BLOCKHDRSZ); - /* mark the MemoryChunk as externally managed */ - MemoryChunkSetHdrMaskExternal(chunk, MCTX_ASET_ID); + /* mark the MemoryChunk as externally managed */ + MemoryChunkSetHdrMaskExternal(chunk, MCTX_ASET_ID); #ifdef MEMORY_CONTEXT_CHECKING - chunk->requested_size = size; - /* set mark to catch clobber of "unused" space */ - Assert(size < chunk_size); + chunk->requested_size = size; + /* set mark to catch clobber of "unused" space */ + Assert(size < chunk_size); + set_sentinel(MemoryChunkGetPointer(chunk), size); +#endif +#ifdef RANDOMIZE_ALLOCATED_MEMORY + /* fill the allocated space with junk */ + randomize_mem((char *) MemoryChunkGetPointer(chunk), size); +#endif + + /* + * Stick the new block underneath the active allocation block, if any, so + * that we don't lose the use of the space remaining therein. + */ + if (set->blocks != NULL) + { + block->prev = set->blocks; + block->next = set->blocks->next; + if (block->next) + block->next->prev = block; + set->blocks->next = block; + } + else + { + block->prev = NULL; + block->next = NULL; + set->blocks = block; + } + + /* Ensure any padding bytes are marked NOACCESS. */ + VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size, + chunk_size - size); + + /* Disallow access to the chunk header. */ + VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOC_CHUNKHDRSZ); + + return MemoryChunkGetPointer(chunk); +} + +/* + * Small helper for allocating a new chunk from a chunk, to avoid duplicating + * the code between AllocSetAlloc() and AllocSetAllocFromNewBlock(). + */ +static inline void * +AllocSetAllocChunkFromBlock(MemoryContext context, AllocBlock block, + Size size, Size chunk_size, int fidx) +{ + MemoryChunk *chunk; + + chunk = (MemoryChunk *) (block->freeptr); + + /* Prepare to initialize the chunk header. */ + VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNKHDRSZ); + + block->freeptr += (chunk_size + ALLOC_CHUNKHDRSZ); + Assert(block->freeptr <= block->endptr); + + /* store the free list index in the value field */ + MemoryChunkSetHdrMask(chunk, block, fidx, MCTX_ASET_ID); + +#ifdef MEMORY_CONTEXT_CHECKING + chunk->requested_size = size; + /* set mark to catch clobber of "unused" space */ + if (size < chunk_size) set_sentinel(MemoryChunkGetPointer(chunk), size); #endif #ifdef RANDOMIZE_ALLOCATED_MEMORY - /* fill the allocated space with junk */ - randomize_mem((char *) MemoryChunkGetPointer(chunk), size); + /* fill the allocated space with junk */ + randomize_mem((char *) MemoryChunkGetPointer(chunk), size); #endif + /* Ensure any padding bytes are marked NOACCESS. */ + VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size, + chunk_size - size); + + /* Disallow access to the chunk header. */ + VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOC_CHUNKHDRSZ); + + return MemoryChunkGetPointer(chunk); +} + +/* + * Helper for AllocSetAlloc() that allocates a new block and returns a chunk + * allocated from it. + * + * AllocSetAlloc()'s comment explains why this is separate. + */ +pg_noinline +static void * +AllocSetAllocFromNewBlock(MemoryContext context, Size size, int flags, + int fidx) +{ + AllocSet set = (AllocSet) context; + AllocBlock block; + Size availspace; + Size blksize; + Size required_size; + Size chunk_size; + + /* due to the keeper block set->blocks should always be valid */ + Assert(set->blocks != NULL); + block = set->blocks; + availspace = block->endptr - block->freeptr; + + /* + * The existing active (top) block does not have enough room for the + * requested allocation, but it might still have a useful amount of space + * in it. Once we push it down in the block list, we'll never try to + * allocate more space from it. So, before we do that, carve up its free + * space into chunks that we can put on the set's freelists. + * + * Because we can only get here when there's less than ALLOC_CHUNK_LIMIT + * left in the block, this loop cannot iterate more than + * ALLOCSET_NUM_FREELISTS-1 times. + */ + while (availspace >= ((1 << ALLOC_MINBITS) + ALLOC_CHUNKHDRSZ)) + { + AllocFreeListLink *link; + MemoryChunk *chunk; + Size availchunk = availspace - ALLOC_CHUNKHDRSZ; + int a_fidx = AllocSetFreeIndex(availchunk); + /* - * Stick the new block underneath the active allocation block, if any, - * so that we don't lose the use of the space remaining therein. + * In most cases, we'll get back the index of the next larger freelist + * than the one we need to put this chunk on. The exception is when + * availchunk is exactly a power of 2. */ - if (set->blocks != NULL) - { - block->prev = set->blocks; - block->next = set->blocks->next; - if (block->next) - block->next->prev = block; - set->blocks->next = block; - } - else + if (availchunk != GetChunkSizeFromFreeListIdx(a_fidx)) { - block->prev = NULL; - block->next = NULL; - set->blocks = block; + a_fidx--; + Assert(a_fidx >= 0); + availchunk = GetChunkSizeFromFreeListIdx(a_fidx); } - /* Ensure any padding bytes are marked NOACCESS. */ - VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size, - chunk_size - size); + chunk = (MemoryChunk *) (block->freeptr); - /* Disallow access to the chunk header. */ - VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOC_CHUNKHDRSZ); + /* Prepare to initialize the chunk header. */ + VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNKHDRSZ); + block->freeptr += (availchunk + ALLOC_CHUNKHDRSZ); + availspace -= (availchunk + ALLOC_CHUNKHDRSZ); - return MemoryChunkGetPointer(chunk); + /* store the freelist index in the value field */ + MemoryChunkSetHdrMask(chunk, block, a_fidx, MCTX_ASET_ID); +#ifdef MEMORY_CONTEXT_CHECKING + chunk->requested_size = InvalidAllocSize; /* mark it free */ +#endif + /* push this chunk onto the free list */ + link = GetFreeListLink(chunk); + + VALGRIND_MAKE_MEM_DEFINED(link, sizeof(AllocFreeListLink)); + link->next = set->freelist[a_fidx]; + VALGRIND_MAKE_MEM_NOACCESS(link, sizeof(AllocFreeListLink)); + + set->freelist[a_fidx] = chunk; + } + + /* + * The first such block has size initBlockSize, and we double the space in + * each succeeding block, but not more than maxBlockSize. + */ + blksize = set->nextBlockSize; + set->nextBlockSize <<= 1; + if (set->nextBlockSize > set->maxBlockSize) + set->nextBlockSize = set->maxBlockSize; + + /* Choose the actual chunk size to allocate */ + chunk_size = GetChunkSizeFromFreeListIdx(fidx); + Assert(chunk_size >= size); + + /* + * If initBlockSize is less than ALLOC_CHUNK_LIMIT, we could need more + * space... but try to keep it a power of 2. + */ + required_size = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ; + while (blksize < required_size) + blksize <<= 1; + + /* Try to allocate it */ + block = (AllocBlock) malloc(blksize); + + /* + * We could be asking for pretty big blocks here, so cope if malloc fails. + * But give up if there's less than 1 MB or so available... + */ + while (block == NULL && blksize > 1024 * 1024) + { + blksize >>= 1; + if (blksize < required_size) + break; + block = (AllocBlock) malloc(blksize); } + if (block == NULL) + return MemoryContextAllocationFailure(context, size, flags); + + context->mem_allocated += blksize; + + block->aset = set; + block->freeptr = ((char *) block) + ALLOC_BLOCKHDRSZ; + block->endptr = ((char *) block) + blksize; + + /* Mark unallocated space NOACCESS. */ + VALGRIND_MAKE_MEM_NOACCESS(block->freeptr, + blksize - ALLOC_BLOCKHDRSZ); + + block->prev = NULL; + block->next = set->blocks; + if (block->next) + block->next->prev = block; + set->blocks = block; + + return AllocSetAllocChunkFromBlock(context, block, size, chunk_size, fidx); +} + +/* + * AllocSetAlloc + * Returns a pointer to allocated memory of given size or raises an ERROR + * on allocation failure, or returns NULL when flags contains + * MCXT_ALLOC_NO_OOM. + * + * No request may exceed: + * MAXALIGN_DOWN(SIZE_MAX) - ALLOC_BLOCKHDRSZ - ALLOC_CHUNKHDRSZ + * All callers use a much-lower limit. + * + * Note: when using valgrind, it doesn't matter how the returned allocation + * is marked, as mcxt.c will set it to UNDEFINED. In some paths we will + * return space that is marked NOACCESS - AllocSetRealloc has to beware! + * + * This function should only contain the most common code paths. Everything + * else should be in pg_noinline helper functions, thus avoiding the overhead + * of creating a stack frame for the common cases. Allocating memory is often + * a bottleneck in many workloads, so avoiding stack frame setup is + * worthwhile. Helper functions should always directly return the newly + * allocated memory so that we can just return that address directly as a tail + * call. + */ +void * +AllocSetAlloc(MemoryContext context, Size size, int flags) +{ + AllocSet set = (AllocSet) context; + AllocBlock block; + MemoryChunk *chunk; + int fidx; + Size chunk_size; + Size availspace; + + Assert(AllocSetIsValid(set)); + + /* due to the keeper block set->blocks should never be NULL */ + Assert(set->blocks != NULL); + + /* + * If requested size exceeds maximum for chunks we hand the request off to + * AllocSetAllocLarge(). + */ + if (size > set->allocChunkLimit) + return AllocSetAllocLarge(context, size, flags); + /* * Request is small enough to be treated as a chunk. Look in the * corresponding free list to see if there is a free chunk we could reuse. @@ -830,164 +1040,18 @@ AllocSetAlloc(MemoryContext context, Size size) chunk_size = GetChunkSizeFromFreeListIdx(fidx); Assert(chunk_size >= size); + block = set->blocks; + availspace = block->endptr - block->freeptr; + /* * If there is enough room in the active allocation block, we will put the * chunk into that block. Else must start a new one. */ - if ((block = set->blocks) != NULL) - { - Size availspace = block->endptr - block->freeptr; - - if (availspace < (chunk_size + ALLOC_CHUNKHDRSZ)) - { - /* - * The existing active (top) block does not have enough room for - * the requested allocation, but it might still have a useful - * amount of space in it. Once we push it down in the block list, - * we'll never try to allocate more space from it. So, before we - * do that, carve up its free space into chunks that we can put on - * the set's freelists. - * - * Because we can only get here when there's less than - * ALLOC_CHUNK_LIMIT left in the block, this loop cannot iterate - * more than ALLOCSET_NUM_FREELISTS-1 times. - */ - while (availspace >= ((1 << ALLOC_MINBITS) + ALLOC_CHUNKHDRSZ)) - { - AllocFreeListLink *link; - Size availchunk = availspace - ALLOC_CHUNKHDRSZ; - int a_fidx = AllocSetFreeIndex(availchunk); - - /* - * In most cases, we'll get back the index of the next larger - * freelist than the one we need to put this chunk on. The - * exception is when availchunk is exactly a power of 2. - */ - if (availchunk != GetChunkSizeFromFreeListIdx(a_fidx)) - { - a_fidx--; - Assert(a_fidx >= 0); - availchunk = GetChunkSizeFromFreeListIdx(a_fidx); - } - - chunk = (MemoryChunk *) (block->freeptr); - - /* Prepare to initialize the chunk header. */ - VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNKHDRSZ); - block->freeptr += (availchunk + ALLOC_CHUNKHDRSZ); - availspace -= (availchunk + ALLOC_CHUNKHDRSZ); - - /* store the freelist index in the value field */ - MemoryChunkSetHdrMask(chunk, block, a_fidx, MCTX_ASET_ID); -#ifdef MEMORY_CONTEXT_CHECKING - chunk->requested_size = InvalidAllocSize; /* mark it free */ -#endif - /* push this chunk onto the free list */ - link = GetFreeListLink(chunk); + if (unlikely(availspace < (chunk_size + ALLOC_CHUNKHDRSZ))) + return AllocSetAllocFromNewBlock(context, size, flags, fidx); - VALGRIND_MAKE_MEM_DEFINED(link, sizeof(AllocFreeListLink)); - link->next = set->freelist[a_fidx]; - VALGRIND_MAKE_MEM_NOACCESS(link, sizeof(AllocFreeListLink)); - - set->freelist[a_fidx] = chunk; - } - /* Mark that we need to create a new block */ - block = NULL; - } - } - - /* - * Time to create a new regular (multi-chunk) block? - */ - if (block == NULL) - { - Size required_size; - - /* - * The first such block has size initBlockSize, and we double the - * space in each succeeding block, but not more than maxBlockSize. - */ - blksize = set->nextBlockSize; - set->nextBlockSize <<= 1; - if (set->nextBlockSize > set->maxBlockSize) - set->nextBlockSize = set->maxBlockSize; - - /* - * If initBlockSize is less than ALLOC_CHUNK_LIMIT, we could need more - * space... but try to keep it a power of 2. - */ - required_size = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ; - while (blksize < required_size) - blksize <<= 1; - - /* Try to allocate it */ - block = (AllocBlock) malloc(blksize); - - /* - * We could be asking for pretty big blocks here, so cope if malloc - * fails. But give up if there's less than 1 MB or so available... - */ - while (block == NULL && blksize > 1024 * 1024) - { - blksize >>= 1; - if (blksize < required_size) - break; - block = (AllocBlock) malloc(blksize); - } - - if (block == NULL) - return NULL; - - context->mem_allocated += blksize; - - block->aset = set; - block->freeptr = ((char *) block) + ALLOC_BLOCKHDRSZ; - block->endptr = ((char *) block) + blksize; - - /* Mark unallocated space NOACCESS. */ - VALGRIND_MAKE_MEM_NOACCESS(block->freeptr, - blksize - ALLOC_BLOCKHDRSZ); - - block->prev = NULL; - block->next = set->blocks; - if (block->next) - block->next->prev = block; - set->blocks = block; - } - - /* - * OK, do the allocation - */ - chunk = (MemoryChunk *) (block->freeptr); - - /* Prepare to initialize the chunk header. */ - VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNKHDRSZ); - - block->freeptr += (chunk_size + ALLOC_CHUNKHDRSZ); - Assert(block->freeptr <= block->endptr); - - /* store the free list index in the value field */ - MemoryChunkSetHdrMask(chunk, block, fidx, MCTX_ASET_ID); - -#ifdef MEMORY_CONTEXT_CHECKING - chunk->requested_size = size; - /* set mark to catch clobber of "unused" space */ - if (size < chunk_size) - set_sentinel(MemoryChunkGetPointer(chunk), size); -#endif -#ifdef RANDOMIZE_ALLOCATED_MEMORY - /* fill the allocated space with junk */ - randomize_mem((char *) MemoryChunkGetPointer(chunk), size); -#endif - - /* Ensure any padding bytes are marked NOACCESS. */ - VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size, - chunk_size - size); - - /* Disallow access to the chunk header. */ - VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOC_CHUNKHDRSZ); - - return MemoryChunkGetPointer(chunk); + /* There's enough space on the current block, so allocate from that */ + return AllocSetAllocChunkFromBlock(context, block, size, chunk_size, fidx); } /* @@ -1102,7 +1166,7 @@ AllocSetFree(void *pointer) * request size.) */ void * -AllocSetRealloc(void *pointer, Size size) +AllocSetRealloc(void *pointer, Size size, int flags) { AllocBlock block; AllocSet set; @@ -1135,6 +1199,9 @@ AllocSetRealloc(void *pointer, Size size) set = block->aset; + /* only check size in paths where the limits could be hit */ + MemoryContextCheckSize((MemoryContext) set, size, flags); + oldchksize = block->endptr - (char *) pointer; #ifdef MEMORY_CONTEXT_CHECKING @@ -1161,7 +1228,7 @@ AllocSetRealloc(void *pointer, Size size) { /* Disallow access to the chunk header. */ VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOC_CHUNKHDRSZ); - return NULL; + return MemoryContextAllocationFailure(&set->header, size, flags); } /* updated separately, not to underflow when (oldblksize > blksize) */ @@ -1321,15 +1388,15 @@ AllocSetRealloc(void *pointer, Size size) AllocPointer newPointer; Size oldsize; - /* allocate new chunk */ - newPointer = AllocSetAlloc((MemoryContext) set, size); + /* allocate new chunk (this also checks size is valid) */ + newPointer = AllocSetAlloc((MemoryContext) set, size, flags); /* leave immediately if request was not completed */ if (newPointer == NULL) { /* Disallow access to the chunk header. */ VALGRIND_MAKE_MEM_NOACCESS(chunk, ALLOC_CHUNKHDRSZ); - return NULL; + return MemoryContextAllocationFailure((MemoryContext) set, size, flags); } /* @@ -1547,7 +1614,7 @@ AllocSetCheck(MemoryContext context) long nchunks = 0; bool has_external_chunk = false; - if (set->keeper == block) + if (IsKeeperBlock(set, block)) total_allocated += block->endptr - ((char *) set); else total_allocated += block->endptr - ((char *) block); @@ -1557,7 +1624,7 @@ AllocSetCheck(MemoryContext context) */ if (!blk_used) { - if (set->keeper != block) + if (!IsKeeperBlock(set, block)) elog(WARNING, "problem in alloc set %s: empty block %p", name, block); } diff --git a/src/backend/utils/mmgr/bump.c b/src/backend/utils/mmgr/bump.c new file mode 100644 index 0000000000000..c60c9c131e395 --- /dev/null +++ b/src/backend/utils/mmgr/bump.c @@ -0,0 +1,808 @@ +/*------------------------------------------------------------------------- + * + * bump.c + * Bump allocator definitions. + * + * Bump is a MemoryContext implementation designed for memory usages which + * require allocating a large number of chunks, none of which ever need to be + * pfree'd or realloc'd. Chunks allocated by this context have no chunk header + * and operations which ordinarily require looking at the chunk header cannot + * be performed. For example, pfree, realloc, GetMemoryChunkSpace and + * GetMemoryChunkContext are all not possible with bump allocated chunks. The + * only way to release memory allocated by this context type is to reset or + * delete the context. + * + * Portions Copyright (c) 2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/mmgr/bump.c + * + * + * Bump is best suited to cases which require a large number of short-lived + * chunks where performance matters. Because bump allocated chunks don't + * have a chunk header, it can fit more chunks on each block. This means we + * can do more with less memory and fewer cache lines. The reason it's best + * suited for short-lived usages of memory is that ideally, pointers to bump + * allocated chunks won't be visible to a large amount of code. The more + * code that operates on memory allocated by this allocator, the more chances + * that some code will try to perform a pfree or one of the other operations + * which are made impossible due to the lack of chunk header. In order to + * detect accidental usage of the various disallowed operations, we do add a + * MemoryChunk chunk header in MEMORY_CONTEXT_CHECKING builds and have the + * various disallowed functions raise an ERROR. + * + * Allocations are MAXALIGNed. + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "lib/ilist.h" +#include "port/pg_bitutils.h" +#include "utils/memdebug.h" +#include "utils/memutils.h" +#include "utils/memutils_memorychunk.h" +#include "utils/memutils_internal.h" + +#define Bump_BLOCKHDRSZ MAXALIGN(sizeof(BumpBlock)) + +/* No chunk header unless built with MEMORY_CONTEXT_CHECKING */ +#ifdef MEMORY_CONTEXT_CHECKING +#define Bump_CHUNKHDRSZ sizeof(MemoryChunk) +#else +#define Bump_CHUNKHDRSZ 0 +#endif + +#define Bump_CHUNK_FRACTION 8 + +/* The keeper block is allocated in the same allocation as the set */ +#define KeeperBlock(set) ((BumpBlock *) ((char *) (set) + \ + MAXALIGN(sizeof(BumpContext)))) +#define IsKeeperBlock(set, blk) (KeeperBlock(set) == (blk)) + +typedef struct BumpBlock BumpBlock; /* forward reference */ + +typedef struct BumpContext +{ + MemoryContextData header; /* Standard memory-context fields */ + + /* Bump context parameters */ + uint32 initBlockSize; /* initial block size */ + uint32 maxBlockSize; /* maximum block size */ + uint32 nextBlockSize; /* next block size to allocate */ + uint32 allocChunkLimit; /* effective chunk size limit */ + + dlist_head blocks; /* list of blocks with the block currently + * being filled at the head */ +} BumpContext; + +/* + * BumpBlock + * BumpBlock is the unit of memory that is obtained by bump.c from + * malloc(). It contains zero or more allocations, which are the + * units requested by palloc(). + */ +struct BumpBlock +{ + dlist_node node; /* doubly-linked list of blocks */ +#ifdef MEMORY_CONTEXT_CHECKING + BumpContext *context; /* pointer back to the owning context */ +#endif + char *freeptr; /* start of free space in this block */ + char *endptr; /* end of space in this block */ +}; + +/* + * BumpIsValid + * True iff set is valid bump context. + */ +#define BumpIsValid(set) \ + (PointerIsValid(set) && IsA(set, BumpContext)) + +/* + * We always store external chunks on a dedicated block. This makes fetching + * the block from an external chunk easy since it's always the first and only + * chunk on the block. + */ +#define ExternalChunkGetBlock(chunk) \ + (BumpBlock *) ((char *) chunk - Bump_BLOCKHDRSZ) + +/* Inlined helper functions */ +static inline void BumpBlockInit(BumpContext *context, BumpBlock *block, + Size blksize); +static inline bool BumpBlockIsEmpty(BumpBlock *block); +static inline void BumpBlockMarkEmpty(BumpBlock *block); +static inline Size BumpBlockFreeBytes(BumpBlock *block); +static inline void BumpBlockFree(BumpContext *set, BumpBlock *block); + + +/* +* BumpContextCreate +* Create a new Bump context. +* +* parent: parent context, or NULL if top-level context +* name: name of context (must be statically allocated) +* minContextSize: minimum context size +* initBlockSize: initial allocation block size +* maxBlockSize: maximum allocation block size +*/ +MemoryContext +BumpContextCreate(MemoryContext parent, const char *name, Size minContextSize, + Size initBlockSize, Size maxBlockSize) +{ + Size firstBlockSize; + Size allocSize; + BumpContext *set; + BumpBlock *block; + + /* ensure MemoryChunk's size is properly maxaligned */ + StaticAssertDecl(Bump_CHUNKHDRSZ == MAXALIGN(Bump_CHUNKHDRSZ), + "sizeof(MemoryChunk) is not maxaligned"); + + /* + * First, validate allocation parameters. Asserts seem sufficient because + * nobody varies their parameters at runtime. We somewhat arbitrarily + * enforce a minimum 1K block size. We restrict the maximum block size to + * MEMORYCHUNK_MAX_BLOCKOFFSET as MemoryChunks are limited to this in + * regards to addressing the offset between the chunk and the block that + * the chunk is stored on. We would be unable to store the offset between + * the chunk and block for any chunks that were beyond + * MEMORYCHUNK_MAX_BLOCKOFFSET bytes into the block if the block was to be + * larger than this. + */ + Assert(initBlockSize == MAXALIGN(initBlockSize) && + initBlockSize >= 1024); + Assert(maxBlockSize == MAXALIGN(maxBlockSize) && + maxBlockSize >= initBlockSize && + AllocHugeSizeIsValid(maxBlockSize)); /* must be safe to double */ + Assert(minContextSize == 0 || + (minContextSize == MAXALIGN(minContextSize) && + minContextSize >= 1024 && + minContextSize <= maxBlockSize)); + Assert(maxBlockSize <= MEMORYCHUNK_MAX_BLOCKOFFSET); + + /* Determine size of initial block */ + allocSize = MAXALIGN(sizeof(BumpContext)) + Bump_BLOCKHDRSZ + + Bump_CHUNKHDRSZ; + if (minContextSize != 0) + allocSize = Max(allocSize, minContextSize); + else + allocSize = Max(allocSize, initBlockSize); + + /* + * Allocate the initial block. Unlike other bump.c blocks, it starts with + * the context header and its block header follows that. + */ + set = (BumpContext *) malloc(allocSize); + if (set == NULL) + { + MemoryContextStats(TopMemoryContext); + ereport(ERROR, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("out of memory"), + errdetail("Failed while creating memory context \"%s\".", + name))); + } + + /* + * Avoid writing code that can fail between here and MemoryContextCreate; + * we'd leak the header and initial block if we ereport in this stretch. + */ + dlist_init(&set->blocks); + + /* Fill in the initial block's block header */ + block = KeeperBlock(set); + /* determine the block size and initialize it */ + firstBlockSize = allocSize - MAXALIGN(sizeof(BumpContext)); + BumpBlockInit(set, block, firstBlockSize); + + /* add it to the doubly-linked list of blocks */ + dlist_push_head(&set->blocks, &block->node); + + /* + * Fill in BumpContext-specific header fields. The Asserts above should + * ensure that these all fit inside a uint32. + */ + set->initBlockSize = (uint32) initBlockSize; + set->maxBlockSize = (uint32) maxBlockSize; + set->nextBlockSize = (uint32) initBlockSize; + + /* + * Compute the allocation chunk size limit for this context. + * + * Limit the maximum size a non-dedicated chunk can be so that we can fit + * at least Bump_CHUNK_FRACTION of chunks this big onto the maximum sized + * block. We must further limit this value so that it's no more than + * MEMORYCHUNK_MAX_VALUE. We're unable to have non-external chunks larger + * than that value as we store the chunk size in the MemoryChunk 'value' + * field in the call to MemoryChunkSetHdrMask(). + */ + set->allocChunkLimit = Min(maxBlockSize, MEMORYCHUNK_MAX_VALUE); + while ((Size) (set->allocChunkLimit + Bump_CHUNKHDRSZ) > + (Size) ((Size) (maxBlockSize - Bump_BLOCKHDRSZ) / Bump_CHUNK_FRACTION)) + set->allocChunkLimit >>= 1; + + /* Finally, do the type-independent part of context creation */ + MemoryContextCreate((MemoryContext) set, T_BumpContext, MCTX_BUMP_ID, + parent, name); + + ((MemoryContext) set)->mem_allocated = allocSize; + + return (MemoryContext) set; +} + +/* + * BumpReset + * Frees all memory which is allocated in the given set. + * + * The code simply frees all the blocks in the context apart from the keeper + * block. + */ +void +BumpReset(MemoryContext context) +{ + BumpContext *set = (BumpContext *) context; + dlist_mutable_iter miter; + + Assert(BumpIsValid(set)); + +#ifdef MEMORY_CONTEXT_CHECKING + /* Check for corruption and leaks before freeing */ + BumpCheck(context); +#endif + + dlist_foreach_modify(miter, &set->blocks) + { + BumpBlock *block = dlist_container(BumpBlock, node, miter.cur); + + if (IsKeeperBlock(set, block)) + BumpBlockMarkEmpty(block); + else + BumpBlockFree(set, block); + } + + /* Reset block size allocation sequence, too */ + set->nextBlockSize = set->initBlockSize; + + /* Ensure there is only 1 item in the dlist */ + Assert(!dlist_is_empty(&set->blocks)); + Assert(!dlist_has_next(&set->blocks, dlist_head_node(&set->blocks))); +} + +/* + * BumpDelete + * Free all memory which is allocated in the given context. + */ +void +BumpDelete(MemoryContext context) +{ + /* Reset to release all releasable BumpBlocks */ + BumpReset(context); + /* And free the context header and keeper block */ + free(context); +} + +/* + * Helper for BumpAlloc() that allocates an entire block for the chunk. + * + * BumpAlloc()'s comment explains why this is separate. + */ +pg_noinline +static void * +BumpAllocLarge(MemoryContext context, Size size, int flags) +{ + BumpContext *set = (BumpContext *) context; + BumpBlock *block; +#ifdef MEMORY_CONTEXT_CHECKING + MemoryChunk *chunk; +#endif + Size chunk_size; + Size required_size; + Size blksize; + + /* validate 'size' is within the limits for the given 'flags' */ + MemoryContextCheckSize(context, size, flags); + +#ifdef MEMORY_CONTEXT_CHECKING + /* ensure there's always space for the sentinel byte */ + chunk_size = MAXALIGN(size + 1); +#else + chunk_size = MAXALIGN(size); +#endif + + required_size = chunk_size + Bump_CHUNKHDRSZ; + blksize = required_size + Bump_BLOCKHDRSZ; + + block = (BumpBlock *) malloc(blksize); + if (block == NULL) + return NULL; + + context->mem_allocated += blksize; + + /* the block is completely full */ + block->freeptr = block->endptr = ((char *) block) + blksize; + +#ifdef MEMORY_CONTEXT_CHECKING + /* block with a single (used) chunk */ + block->context = set; + + chunk = (MemoryChunk *) (((char *) block) + Bump_BLOCKHDRSZ); + + /* mark the MemoryChunk as externally managed */ + MemoryChunkSetHdrMaskExternal(chunk, MCTX_BUMP_ID); + + chunk->requested_size = size; + /* set mark to catch clobber of "unused" space */ + Assert(size < chunk_size); + set_sentinel(MemoryChunkGetPointer(chunk), size); +#endif +#ifdef RANDOMIZE_ALLOCATED_MEMORY + /* fill the allocated space with junk */ + randomize_mem((char *) MemoryChunkGetPointer(chunk), size); +#endif + + /* + * Add the block to the tail of allocated blocks list. The current block + * is left at the head of the list as it may still have space for + * non-large allocations. + */ + dlist_push_tail(&set->blocks, &block->node); + +#ifdef MEMORY_CONTEXT_CHECKING + /* Ensure any padding bytes are marked NOACCESS. */ + VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size, + chunk_size - size); + + /* Disallow access to the chunk header. */ + VALGRIND_MAKE_MEM_NOACCESS(chunk, Bump_CHUNKHDRSZ); + + return MemoryChunkGetPointer(chunk); +#else + return (void *) (((char *) block) + Bump_BLOCKHDRSZ); +#endif +} + +/* + * Small helper for allocating a new chunk from a chunk, to avoid duplicating + * the code between BumpAlloc() and BumpAllocFromNewBlock(). + */ +static inline void * +BumpAllocChunkFromBlock(MemoryContext context, BumpBlock *block, Size size, + Size chunk_size) +{ +#ifdef MEMORY_CONTEXT_CHECKING + MemoryChunk *chunk; +#else + void *ptr; +#endif + + /* validate we've been given a block with enough free space */ + Assert(block != NULL); + Assert((block->endptr - block->freeptr) >= Bump_CHUNKHDRSZ + chunk_size); + +#ifdef MEMORY_CONTEXT_CHECKING + chunk = (MemoryChunk *) block->freeptr; +#else + ptr = (void *) block->freeptr; +#endif + + /* point the freeptr beyond this chunk */ + block->freeptr += (Bump_CHUNKHDRSZ + chunk_size); + Assert(block->freeptr <= block->endptr); + +#ifdef MEMORY_CONTEXT_CHECKING + /* Prepare to initialize the chunk header. */ + VALGRIND_MAKE_MEM_UNDEFINED(chunk, Bump_CHUNKHDRSZ); + + MemoryChunkSetHdrMask(chunk, block, chunk_size, MCTX_BUMP_ID); + chunk->requested_size = size; + /* set mark to catch clobber of "unused" space */ + Assert(size < chunk_size); + set_sentinel(MemoryChunkGetPointer(chunk), size); + +#ifdef RANDOMIZE_ALLOCATED_MEMORY + /* fill the allocated space with junk */ + randomize_mem((char *) MemoryChunkGetPointer(chunk), size); +#endif + + /* Ensure any padding bytes are marked NOACCESS. */ + VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size, + chunk_size - size); + + /* Disallow access to the chunk header. */ + VALGRIND_MAKE_MEM_NOACCESS(chunk, Bump_CHUNKHDRSZ); + + return MemoryChunkGetPointer(chunk); +#else + return ptr; +#endif /* MEMORY_CONTEXT_CHECKING */ +} + +/* + * Helper for BumpAlloc() that allocates a new block and returns a chunk + * allocated from it. + * + * BumpAlloc()'s comment explains why this is separate. + */ +pg_noinline +static void * +BumpAllocFromNewBlock(MemoryContext context, Size size, int flags, + Size chunk_size) +{ + BumpContext *set = (BumpContext *) context; + BumpBlock *block; + Size blksize; + Size required_size; + + /* + * The first such block has size initBlockSize, and we double the space in + * each succeeding block, but not more than maxBlockSize. + */ + blksize = set->nextBlockSize; + set->nextBlockSize <<= 1; + if (set->nextBlockSize > set->maxBlockSize) + set->nextBlockSize = set->maxBlockSize; + + /* we'll need space for the chunk, chunk hdr and block hdr */ + required_size = chunk_size + Bump_CHUNKHDRSZ + Bump_BLOCKHDRSZ; + /* round the size up to the next power of 2 */ + if (blksize < required_size) + blksize = pg_nextpower2_size_t(required_size); + + block = (BumpBlock *) malloc(blksize); + + if (block == NULL) + return MemoryContextAllocationFailure(context, size, flags); + + context->mem_allocated += blksize; + + /* initialize the new block */ + BumpBlockInit(set, block, blksize); + + /* add it to the doubly-linked list of blocks */ + dlist_push_head(&set->blocks, &block->node); + + return BumpAllocChunkFromBlock(context, block, size, chunk_size); +} + +/* + * BumpAlloc + * Returns a pointer to allocated memory of given size or raises an ERROR + * on allocation failure, or returns NULL when flags contains + * MCXT_ALLOC_NO_OOM. + * + * No request may exceed: + * MAXALIGN_DOWN(SIZE_MAX) - Bump_BLOCKHDRSZ - Bump_CHUNKHDRSZ + * All callers use a much-lower limit. + * + * + * Note: when using valgrind, it doesn't matter how the returned allocation + * is marked, as mcxt.c will set it to UNDEFINED. + * This function should only contain the most common code paths. Everything + * else should be in pg_noinline helper functions, thus avoiding the overhead + * of creating a stack frame for the common cases. Allocating memory is often + * a bottleneck in many workloads, so avoiding stack frame setup is + * worthwhile. Helper functions should always directly return the newly + * allocated memory so that we can just return that address directly as a tail + * call. + */ +void * +BumpAlloc(MemoryContext context, Size size, int flags) +{ + BumpContext *set = (BumpContext *) context; + BumpBlock *block; + Size chunk_size; + Size required_size; + + Assert(BumpIsValid(set)); + +#ifdef MEMORY_CONTEXT_CHECKING + /* ensure there's always space for the sentinel byte */ + chunk_size = MAXALIGN(size + 1); +#else + chunk_size = MAXALIGN(size); +#endif + + /* + * If requested size exceeds maximum for chunks we hand the request off to + * BumpAllocLarge(). + */ + if (chunk_size > set->allocChunkLimit) + return BumpAllocLarge(context, size, flags); + + required_size = chunk_size + Bump_CHUNKHDRSZ; + + /* + * Not an oversized chunk. We try to first make use of the latest block, + * but if there's not enough space in it we must allocate a new block. + */ + block = dlist_container(BumpBlock, node, dlist_head_node(&set->blocks)); + + if (BumpBlockFreeBytes(block) < required_size) + return BumpAllocFromNewBlock(context, size, flags, chunk_size); + + /* The current block has space, so just allocate chunk there. */ + return BumpAllocChunkFromBlock(context, block, size, chunk_size); +} + +/* + * BumpBlockInit + * Initializes 'block' assuming 'blksize'. Does not update the context's + * mem_allocated field. + */ +static inline void +BumpBlockInit(BumpContext *context, BumpBlock *block, Size blksize) +{ +#ifdef MEMORY_CONTEXT_CHECKING + block->context = context; +#endif + block->freeptr = ((char *) block) + Bump_BLOCKHDRSZ; + block->endptr = ((char *) block) + blksize; + + /* Mark unallocated space NOACCESS. */ + VALGRIND_MAKE_MEM_NOACCESS(block->freeptr, blksize - Bump_BLOCKHDRSZ); +} + +/* + * BumpBlockIsEmpty + * Returns true iff 'block' contains no chunks + */ +static inline bool +BumpBlockIsEmpty(BumpBlock *block) +{ + /* it's empty if the freeptr has not moved */ + return (block->freeptr == ((char *) block + Bump_BLOCKHDRSZ)); +} + +/* + * BumpBlockMarkEmpty + * Set a block as empty. Does not free the block. + */ +static inline void +BumpBlockMarkEmpty(BumpBlock *block) +{ +#if defined(USE_VALGRIND) || defined(CLOBBER_FREED_MEMORY) + char *datastart = ((char *) block) + Bump_BLOCKHDRSZ; +#endif + +#ifdef CLOBBER_FREED_MEMORY + wipe_mem(datastart, block->freeptr - datastart); +#else + /* wipe_mem() would have done this */ + VALGRIND_MAKE_MEM_NOACCESS(datastart, block->freeptr - datastart); +#endif + + /* Reset the block, but don't return it to malloc */ + block->freeptr = ((char *) block) + Bump_BLOCKHDRSZ; +} + +/* + * BumpBlockFreeBytes + * Returns the number of bytes free in 'block' + */ +static inline Size +BumpBlockFreeBytes(BumpBlock *block) +{ + return (block->endptr - block->freeptr); +} + +/* + * BumpBlockFree + * Remove 'block' from 'set' and release the memory consumed by it. + */ +static inline void +BumpBlockFree(BumpContext *set, BumpBlock *block) +{ + /* Make sure nobody tries to free the keeper block */ + Assert(!IsKeeperBlock(set, block)); + + /* release the block from the list of blocks */ + dlist_delete(&block->node); + + ((MemoryContext) set)->mem_allocated -= ((char *) block->endptr - (char *) block); + +#ifdef CLOBBER_FREED_MEMORY + wipe_mem(block, ((char *) block->endptr - (char *) block)); +#endif + + free(block); +} + +/* + * BumpFree + * Unsupported. + */ +void +BumpFree(void *pointer) +{ + elog(ERROR, "%s is not supported by the bump memory allocator", "pfree"); +} + +/* + * BumpRealloc + * Unsupported. + */ +void * +BumpRealloc(void *pointer, Size size, int flags) +{ + elog(ERROR, "%s is not supported by the bump memory allocator", "realloc"); + return NULL; /* keep compiler quiet */ +} + +/* + * BumpGetChunkContext + * Unsupported. + */ +MemoryContext +BumpGetChunkContext(void *pointer) +{ + elog(ERROR, "%s is not supported by the bump memory allocator", "GetMemoryChunkContext"); + return NULL; /* keep compiler quiet */ +} + +/* + * BumpGetChunkSpace + * Unsupported. + */ +Size +BumpGetChunkSpace(void *pointer) +{ + elog(ERROR, "%s is not supported by the bump memory allocator", "GetMemoryChunkSpace"); + return 0; /* keep compiler quiet */ +} + +/* + * BumpIsEmpty + * Is a BumpContext empty of any allocated space? + */ +bool +BumpIsEmpty(MemoryContext context) +{ + BumpContext *set = (BumpContext *) context; + dlist_iter iter; + + Assert(BumpIsValid(set)); + + dlist_foreach(iter, &set->blocks) + { + BumpBlock *block = dlist_container(BumpBlock, node, iter.cur); + + if (!BumpBlockIsEmpty(block)) + return false; + } + + return true; +} + +/* + * BumpStats + * Compute stats about memory consumption of a Bump context. + * + * printfunc: if not NULL, pass a human-readable stats string to this. + * passthru: pass this pointer through to printfunc. + * totals: if not NULL, add stats about this context into *totals. + * print_to_stderr: print stats to stderr if true, elog otherwise. + */ +void +BumpStats(MemoryContext context, MemoryStatsPrintFunc printfunc, + void *passthru, MemoryContextCounters *totals, bool print_to_stderr) +{ + BumpContext *set = (BumpContext *) context; + Size nblocks = 0; + Size totalspace = 0; + Size freespace = 0; + dlist_iter iter; + + Assert(BumpIsValid(set)); + + dlist_foreach(iter, &set->blocks) + { + BumpBlock *block = dlist_container(BumpBlock, node, iter.cur); + + nblocks++; + totalspace += (block->endptr - (char *) block); + freespace += (block->endptr - block->freeptr); + } + + if (printfunc) + { + char stats_string[200]; + + snprintf(stats_string, sizeof(stats_string), + "%zu total in %zu blocks; %zu free; %zu used", + totalspace, nblocks, freespace, totalspace - freespace); + printfunc(context, passthru, stats_string, print_to_stderr); + } + + if (totals) + { + totals->nblocks += nblocks; + totals->totalspace += totalspace; + totals->freespace += freespace; + } +} + + +#ifdef MEMORY_CONTEXT_CHECKING + +/* + * BumpCheck + * Walk through chunks and check consistency of memory. + * + * NOTE: report errors as WARNING, *not* ERROR or FATAL. Otherwise you'll + * find yourself in an infinite loop when trouble occurs, because this + * routine will be entered again when elog cleanup tries to release memory! + */ +void +BumpCheck(MemoryContext context) +{ + BumpContext *bump = (BumpContext *) context; + const char *name = context->name; + dlist_iter iter; + Size total_allocated = 0; + + /* walk all blocks in this context */ + dlist_foreach(iter, &bump->blocks) + { + BumpBlock *block = dlist_container(BumpBlock, node, iter.cur); + int nchunks; + char *ptr; + bool has_external_chunk = false; + + if (IsKeeperBlock(bump, block)) + total_allocated += block->endptr - (char *) bump; + else + total_allocated += block->endptr - (char *) block; + + /* check block belongs to the correct context */ + if (block->context != bump) + elog(WARNING, "problem in Bump %s: bogus context link in block %p", + name, block); + + /* now walk through the chunks and count them */ + nchunks = 0; + ptr = ((char *) block) + Bump_BLOCKHDRSZ; + + while (ptr < block->freeptr) + { + MemoryChunk *chunk = (MemoryChunk *) ptr; + BumpBlock *chunkblock; + Size chunksize; + + /* allow access to the chunk header */ + VALGRIND_MAKE_MEM_DEFINED(chunk, Bump_CHUNKHDRSZ); + + if (MemoryChunkIsExternal(chunk)) + { + chunkblock = ExternalChunkGetBlock(chunk); + chunksize = block->endptr - (char *) MemoryChunkGetPointer(chunk); + has_external_chunk = true; + } + else + { + chunkblock = MemoryChunkGetBlock(chunk); + chunksize = MemoryChunkGetValue(chunk); + } + + /* move to the next chunk */ + ptr += (chunksize + Bump_CHUNKHDRSZ); + + nchunks += 1; + + /* chunks have both block and context pointers, so check both */ + if (chunkblock != block) + elog(WARNING, "problem in Bump %s: bogus block link in block %p, chunk %p", + name, block, chunk); + } + + if (has_external_chunk && nchunks > 1) + elog(WARNING, "problem in Bump %s: external chunk on non-dedicated block %p", + name, block); + + } + + Assert(total_allocated == context->mem_allocated); +} + +#endif /* MEMORY_CONTEXT_CHECKING */ diff --git a/src/backend/utils/mmgr/dsa.c b/src/backend/utils/mmgr/dsa.c index 7a3781466ed9e..2d4639a63622f 100644 --- a/src/backend/utils/mmgr/dsa.c +++ b/src/backend/utils/mmgr/dsa.c @@ -39,7 +39,7 @@ * empty and be returned to the free page manager, and whole segments can * become empty and be returned to the operating system. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -53,20 +53,11 @@ #include "port/atomics.h" #include "port/pg_bitutils.h" #include "storage/dsm.h" -#include "storage/ipc.h" #include "storage/lwlock.h" -#include "storage/shmem.h" #include "utils/dsa.h" #include "utils/freepage.h" #include "utils/memutils.h" - -/* - * The size of the initial DSM segment that backs a dsa_area created by - * dsa_create. After creating some number of segments of this size we'll - * double this size, and so on. Larger segments may be created if necessary - * to satisfy large requests. - */ -#define DSA_INITIAL_SEGMENT_SIZE ((size_t) (1 * 1024 * 1024)) +#include "utils/resowner.h" /* * How many segments to create before we double the segment size. If this is @@ -77,17 +68,6 @@ */ #define DSA_NUM_SEGMENTS_AT_EACH_SIZE 2 -/* - * The number of bits used to represent the offset part of a dsa_pointer. - * This controls the maximum size of a segment, the maximum possible - * allocation size and also the maximum number of segments per area. - */ -#if SIZEOF_DSA_POINTER == 4 -#define DSA_OFFSET_WIDTH 27 /* 32 segments of size up to 128MB */ -#else -#define DSA_OFFSET_WIDTH 40 /* 1024 segments of size up to 1TB */ -#endif - /* * The maximum number of DSM segments that an area can own, determined by * the number of bits remaining (but capped at 1024). @@ -98,9 +78,6 @@ /* The bitmask for extracting the offset from a dsa_pointer. */ #define DSA_OFFSET_BITMASK (((dsa_pointer) 1 << DSA_OFFSET_WIDTH) - 1) -/* The maximum size of a DSM segment. */ -#define DSA_MAX_SEGMENT_SIZE ((size_t) 1 << DSA_OFFSET_WIDTH) - /* Number of pages (see FPM_PAGE_SIZE) per regular superblock. */ #define DSA_PAGES_PER_SUPERBLOCK 16 @@ -319,6 +296,10 @@ typedef struct dsa_segment_index segment_bins[DSA_NUM_SEGMENT_BINS]; /* The object pools for each size class. */ dsa_area_pool pools[DSA_NUM_SIZE_CLASSES]; + /* initial allocation segment size */ + size_t init_segment_size; + /* maximum allocation segment size */ + size_t max_segment_size; /* The total size of all active segments. */ size_t total_segment_size; /* The maximum total size of backing storage we are allowed. */ @@ -368,8 +349,13 @@ struct dsa_area /* Pointer to the control object in shared memory. */ dsa_area_control *control; - /* Has the mapping been pinned? */ - bool mapping_pinned; + /* + * All the mappings are owned by this. The dsa_area itself is not + * directly tracked by the ResourceOwner, but the effect is the same. NULL + * if the attachment has session lifespan, i.e if dsa_pin_mapping() has + * been called. + */ + ResourceOwner resowner; /* * This backend's array of segment maps, ordered by segment index @@ -413,11 +399,14 @@ static dsa_segment_map *make_new_segment(dsa_area *area, size_t requested_pages) static dsa_area *create_internal(void *place, size_t size, int tranche_id, dsm_handle control_handle, - dsm_segment *control_segment); + dsm_segment *control_segment, + size_t init_segment_size, + size_t max_segment_size); static dsa_area *attach_internal(void *place, dsm_segment *segment, dsa_handle handle); static void check_for_freed_segments(dsa_area *area); static void check_for_freed_segments_locked(dsa_area *area); +static void rebin_segment(dsa_area *area, dsa_segment_map *segment_map); /* * Create a new shared area in a new DSM segment. Further DSM segments will @@ -429,7 +418,7 @@ static void check_for_freed_segments_locked(dsa_area *area); * we require the caller to provide one. */ dsa_area * -dsa_create(int tranche_id) +dsa_create_ext(int tranche_id, size_t init_segment_size, size_t max_segment_size) { dsm_segment *segment; dsa_area *area; @@ -438,7 +427,7 @@ dsa_create(int tranche_id) * Create the DSM segment that will hold the shared control object and the * first segment of usable space. */ - segment = dsm_create(DSA_INITIAL_SEGMENT_SIZE, 0); + segment = dsm_create(init_segment_size, 0); /* * All segments backing this area are pinned, so that DSA can explicitly @@ -450,9 +439,10 @@ dsa_create(int tranche_id) /* Create a new DSA area with the control object in this segment. */ area = create_internal(dsm_segment_address(segment), - DSA_INITIAL_SEGMENT_SIZE, + init_segment_size, tranche_id, - dsm_segment_handle(segment), segment); + dsm_segment_handle(segment), segment, + init_segment_size, max_segment_size); /* Clean up when the control segment detaches. */ on_dsm_detach(segment, &dsa_on_dsm_detach_release_in_place, @@ -478,13 +468,15 @@ dsa_create(int tranche_id) * See dsa_create() for a note about the tranche arguments. */ dsa_area * -dsa_create_in_place(void *place, size_t size, - int tranche_id, dsm_segment *segment) +dsa_create_in_place_ext(void *place, size_t size, + int tranche_id, dsm_segment *segment, + size_t init_segment_size, size_t max_segment_size) { dsa_area *area; area = create_internal(place, size, tranche_id, - DSM_HANDLE_INVALID, NULL); + DSM_HANDLE_INVALID, NULL, + init_segment_size, max_segment_size); /* * Clean up when the control segment detaches, if a containing DSM segment @@ -644,12 +636,14 @@ dsa_pin_mapping(dsa_area *area) { int i; - Assert(!area->mapping_pinned); - area->mapping_pinned = true; + if (area->resowner != NULL) + { + area->resowner = NULL; - for (i = 0; i <= area->high_segment_index; ++i) - if (area->segment_maps[i].segment != NULL) - dsm_pin_mapping(area->segment_maps[i].segment); + for (i = 0; i <= area->high_segment_index; ++i) + if (area->segment_maps[i].segment != NULL) + dsm_pin_mapping(area->segment_maps[i].segment); + } } /* @@ -869,7 +863,11 @@ dsa_free(dsa_area *area, dsa_pointer dp) FreePageManagerPut(segment_map->fpm, DSA_EXTRACT_OFFSET(span->start) / FPM_PAGE_SIZE, span->npages); + + /* Move segment to appropriate bin if necessary. */ + rebin_segment(area, segment_map); LWLockRelease(DSA_AREA_LOCK(area)); + /* Unlink span. */ LWLockAcquire(DSA_SCLASS_LOCK(area, DSA_SCLASS_SPAN_LARGE), LW_EXCLUSIVE); @@ -1024,6 +1022,19 @@ dsa_set_size_limit(dsa_area *area, size_t limit) LWLockRelease(DSA_AREA_LOCK(area)); } +/* Return the total size of all active segments */ +size_t +dsa_get_total_size(dsa_area *area) +{ + size_t size; + + LWLockAcquire(DSA_AREA_LOCK(area), LW_EXCLUSIVE); + size = area->control->total_segment_size; + LWLockRelease(DSA_AREA_LOCK(area)); + + return size; +} + /* * Aggressively free all spare memory in the hope of returning DSM segments to * the operating system. @@ -1100,9 +1111,13 @@ dsa_dump(dsa_area *area) { dsa_segment_index segment_index; - fprintf(stderr, - " segment bin %zu (at least %d contiguous pages free):\n", - i, 1 << (i - 1)); + if (i == 0) + fprintf(stderr, + " segment bin %zu (no contiguous free pages):\n", i); + else + fprintf(stderr, + " segment bin %zu (at least %d contiguous pages free):\n", + i, 1 << (i - 1)); segment_index = area->control->segment_bins[i]; while (segment_index != DSA_SEGMENT_INDEX_NONE) { @@ -1203,7 +1218,8 @@ static dsa_area * create_internal(void *place, size_t size, int tranche_id, dsm_handle control_handle, - dsm_segment *control_segment) + dsm_segment *control_segment, + size_t init_segment_size, size_t max_segment_size) { dsa_area_control *control; dsa_area *area; @@ -1213,6 +1229,11 @@ create_internal(void *place, size_t size, size_t metadata_bytes; int i; + /* Check the initial and maximum block sizes */ + Assert(init_segment_size >= DSA_MIN_SEGMENT_SIZE); + Assert(max_segment_size >= init_segment_size); + Assert(max_segment_size <= DSA_MAX_SEGMENT_SIZE); + /* Sanity check on the space we have to work in. */ if (size < dsa_minimum_size()) elog(ERROR, "dsa_area space must be at least %zu, but %zu provided", @@ -1242,8 +1263,10 @@ create_internal(void *place, size_t size, control->segment_header.prev = DSA_SEGMENT_INDEX_NONE; control->segment_header.usable_pages = usable_pages; control->segment_header.freed = false; - control->segment_header.size = DSA_INITIAL_SEGMENT_SIZE; + control->segment_header.size = size; control->handle = control_handle; + control->init_segment_size = init_segment_size; + control->max_segment_size = max_segment_size; control->max_total_segment_size = (size_t) -1; control->total_segment_size = size; control->segment_handles[0] = control_handle; @@ -1259,7 +1282,7 @@ create_internal(void *place, size_t size, */ area = palloc(sizeof(dsa_area)); area->control = control; - area->mapping_pinned = false; + area->resowner = CurrentResourceOwner; memset(area->segment_maps, 0, sizeof(dsa_segment_map) * DSA_MAX_SEGMENTS); area->high_segment_index = 0; area->freed_segment_counter = 0; @@ -1315,7 +1338,7 @@ attach_internal(void *place, dsm_segment *segment, dsa_handle handle) /* Build the backend-local area object. */ area = palloc(sizeof(dsa_area)); area->control = control; - area->mapping_pinned = false; + area->resowner = CurrentResourceOwner; memset(&area->segment_maps[0], 0, sizeof(dsa_segment_map) * DSA_MAX_SEGMENTS); area->high_segment_index = 0; @@ -1738,6 +1761,7 @@ get_segment_by_index(dsa_area *area, dsa_segment_index index) dsm_handle handle; dsm_segment *segment; dsa_segment_map *segment_map; + ResourceOwner oldowner; /* * If we are reached by dsa_free or dsa_get_address, there must be at @@ -1756,11 +1780,12 @@ get_segment_by_index(dsa_area *area, dsa_segment_index index) elog(ERROR, "dsa_area could not attach to a segment that has been freed"); + oldowner = CurrentResourceOwner; + CurrentResourceOwner = area->resowner; segment = dsm_attach(handle); + CurrentResourceOwner = oldowner; if (segment == NULL) elog(ERROR, "dsa_area could not attach to segment"); - if (area->mapping_pinned) - dsm_pin_mapping(segment); segment_map = &area->segment_maps[index]; segment_map->segment = segment; segment_map->mapped_address = dsm_segment_address(segment); @@ -1858,6 +1883,11 @@ destroy_superblock(dsa_area *area, dsa_pointer span_pointer) segment_map->mapped_address = NULL; } } + + /* Move segment to appropriate bin if necessary. */ + if (segment_map->header != NULL) + rebin_segment(area, segment_map); + LWLockRelease(DSA_AREA_LOCK(area)); /* @@ -2021,28 +2051,7 @@ get_best_segment(dsa_area *area, size_t npages) /* Re-bin it if it's no longer in the appropriate bin. */ if (contiguous_pages < threshold) { - size_t new_bin; - - new_bin = contiguous_pages_to_segment_bin(contiguous_pages); - - /* Remove it from its current bin. */ - unlink_segment(area, segment_map); - - /* Push it onto the front of its new bin. */ - segment_map->header->prev = DSA_SEGMENT_INDEX_NONE; - segment_map->header->next = - area->control->segment_bins[new_bin]; - segment_map->header->bin = new_bin; - area->control->segment_bins[new_bin] = segment_index; - if (segment_map->header->next != DSA_SEGMENT_INDEX_NONE) - { - dsa_segment_map *next; - - next = get_segment_by_index(area, - segment_map->header->next); - Assert(next->header->bin == new_bin); - next->header->prev = segment_index; - } + rebin_segment(area, segment_map); /* * But fall through to see if it's enough to satisfy this @@ -2078,6 +2087,7 @@ make_new_segment(dsa_area *area, size_t requested_pages) size_t usable_pages; dsa_segment_map *segment_map; dsm_segment *segment; + ResourceOwner oldowner; Assert(LWLockHeldByMe(DSA_AREA_LOCK(area))); @@ -2112,9 +2122,9 @@ make_new_segment(dsa_area *area, size_t requested_pages) * move to huge pages in the future. Then we work back to the number of * pages we can fit. */ - total_size = DSA_INITIAL_SEGMENT_SIZE * + total_size = area->control->init_segment_size * ((size_t) 1 << (new_index / DSA_NUM_SEGMENTS_AT_EACH_SIZE)); - total_size = Min(total_size, DSA_MAX_SEGMENT_SIZE); + total_size = Min(total_size, area->control->max_segment_size); total_size = Min(total_size, area->control->max_total_segment_size - area->control->total_segment_size); @@ -2162,12 +2172,13 @@ make_new_segment(dsa_area *area, size_t requested_pages) } /* Create the segment. */ + oldowner = CurrentResourceOwner; + CurrentResourceOwner = area->resowner; segment = dsm_create(total_size, 0); + CurrentResourceOwner = oldowner; if (segment == NULL) return NULL; dsm_pin_segment(segment); - if (area->mapping_pinned) - dsm_pin_mapping(segment); /* Store the handle in shared memory to be found by index. */ area->control->segment_handles[new_index] = @@ -2297,3 +2308,35 @@ check_for_freed_segments_locked(dsa_area *area) area->freed_segment_counter = freed_segment_counter; } } + +/* + * Re-bin segment if it's no longer in the appropriate bin. + */ +static void +rebin_segment(dsa_area *area, dsa_segment_map *segment_map) +{ + size_t new_bin; + dsa_segment_index segment_index; + + new_bin = contiguous_pages_to_segment_bin(fpm_largest(segment_map->fpm)); + if (segment_map->header->bin == new_bin) + return; + + /* Remove it from its current bin. */ + unlink_segment(area, segment_map); + + /* Push it onto the front of its new bin. */ + segment_index = get_segment_index(area, segment_map); + segment_map->header->prev = DSA_SEGMENT_INDEX_NONE; + segment_map->header->next = area->control->segment_bins[new_bin]; + segment_map->header->bin = new_bin; + area->control->segment_bins[new_bin] = segment_index; + if (segment_map->header->next != DSA_SEGMENT_INDEX_NONE) + { + dsa_segment_map *next; + + next = get_segment_by_index(area, segment_map->header->next); + Assert(next->header->bin == new_bin); + next->header->prev = segment_index; + } +} diff --git a/src/backend/utils/mmgr/freepage.c b/src/backend/utils/mmgr/freepage.c index 8f9ea090faa0b..294280256771f 100644 --- a/src/backend/utils/mmgr/freepage.c +++ b/src/backend/utils/mmgr/freepage.c @@ -42,7 +42,7 @@ * where memory fragmentation is very severe, only a tiny fraction of * the pages under management are consumed by this btree. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/mmgr/generation.c b/src/backend/utils/mmgr/generation.c index 4fb8663cd6b1d..0238c111d2fa9 100644 --- a/src/backend/utils/mmgr/generation.c +++ b/src/backend/utils/mmgr/generation.c @@ -6,7 +6,7 @@ * Generation is a custom MemoryContext implementation designed for cases of * chunks with similar lifespan. * - * Portions Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2017-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/mmgr/generation.c @@ -39,8 +39,8 @@ #include "port/pg_bitutils.h" #include "utils/memdebug.h" #include "utils/memutils.h" -#include "utils/memutils_memorychunk.h" #include "utils/memutils_internal.h" +#include "utils/memutils_memorychunk.h" #define Generation_BLOCKHDRSZ MAXALIGN(sizeof(GenerationBlock)) @@ -61,17 +61,14 @@ typedef struct GenerationContext MemoryContextData header; /* Standard memory-context fields */ /* Generational context parameters */ - Size initBlockSize; /* initial block size */ - Size maxBlockSize; /* maximum block size */ - Size nextBlockSize; /* next block size to allocate */ - Size allocChunkLimit; /* effective chunk size limit */ - - GenerationBlock *block; /* current (most recently allocated) block, or - * NULL if we've just freed the most recent - * block */ - GenerationBlock *freeblock; /* pointer to a block that's being recycled, - * or NULL if there's no such block. */ - GenerationBlock *keeper; /* keep this block over resets */ + uint32 initBlockSize; /* initial block size */ + uint32 maxBlockSize; /* maximum block size */ + uint32 nextBlockSize; /* next block size to allocate */ + uint32 allocChunkLimit; /* effective chunk size limit */ + + GenerationBlock *block; /* current (most recently allocated) block */ + GenerationBlock *freeblock; /* pointer to an empty block that's being + * recycled, or NULL if there's no such block. */ dlist_head blocks; /* list of blocks */ } GenerationContext; @@ -112,6 +109,12 @@ struct GenerationBlock #define GenerationBlockIsValid(block) \ (PointerIsValid(block) && GenerationIsValid((block)->context)) +/* + * GenerationBlockIsEmpty + * True iff block contains no chunks + */ +#define GenerationBlockIsEmpty(b) ((b)->nchunks == 0) + /* * We always store external chunks on a dedicated block. This makes fetching * the block from an external chunk easy since it's always the first and only @@ -120,11 +123,18 @@ struct GenerationBlock #define ExternalChunkGetBlock(chunk) \ (GenerationBlock *) ((char *) chunk - Generation_BLOCKHDRSZ) +/* Obtain the keeper block for a generation context */ +#define KeeperBlock(set) \ + ((GenerationBlock *) (((char *) set) + \ + MAXALIGN(sizeof(GenerationContext)))) + +/* Check if the block is the keeper block of the given generation context */ +#define IsKeeperBlock(set, block) ((block) == (KeeperBlock(set))) + /* Inlined helper functions */ static inline void GenerationBlockInit(GenerationContext *context, GenerationBlock *block, Size blksize); -static inline bool GenerationBlockIsEmpty(GenerationBlock *block); static inline void GenerationBlockMarkEmpty(GenerationBlock *block); static inline Size GenerationBlockFreeBytes(GenerationBlock *block); static inline void GenerationBlockFree(GenerationContext *set, @@ -214,7 +224,7 @@ GenerationContextCreate(MemoryContext parent, dlist_init(&set->blocks); /* Fill in the initial block's block header */ - block = (GenerationBlock *) (((char *) set) + MAXALIGN(sizeof(GenerationContext))); + block = KeeperBlock(set); /* determine the block size and initialize it */ firstBlockSize = allocSize - MAXALIGN(sizeof(GenerationContext)); GenerationBlockInit(set, block, firstBlockSize); @@ -228,13 +238,10 @@ GenerationContextCreate(MemoryContext parent, /* No free block, yet */ set->freeblock = NULL; - /* Mark block as not to be released at reset time */ - set->keeper = block; - /* Fill in GenerationContext-specific header fields */ - set->initBlockSize = initBlockSize; - set->maxBlockSize = maxBlockSize; - set->nextBlockSize = initBlockSize; + set->initBlockSize = (uint32) initBlockSize; + set->maxBlockSize = (uint32) maxBlockSize; + set->nextBlockSize = (uint32) initBlockSize; /* * Compute the allocation chunk size limit for this context. @@ -267,8 +274,10 @@ GenerationContextCreate(MemoryContext parent, * GenerationReset * Frees all memory which is allocated in the given set. * - * The code simply frees all the blocks in the context - we don't keep any - * keeper blocks or anything like that. + * The initial "keeper" block (which shares a malloc chunk with the context + * header) is not given back to the operating system though. In this way, we + * don't thrash malloc() when a context is repeatedly reset after small + * allocations. */ void GenerationReset(MemoryContext context) @@ -294,14 +303,14 @@ GenerationReset(MemoryContext context) { GenerationBlock *block = dlist_container(GenerationBlock, node, miter.cur); - if (block == set->keeper) + if (IsKeeperBlock(set, block)) GenerationBlockMarkEmpty(block); else GenerationBlockFree(set, block); } /* set it so new allocations to make use of the keeper block */ - set->block = set->keeper; + set->block = KeeperBlock(set); /* Reset block size allocation sequence, too */ set->nextBlockSize = set->initBlockSize; @@ -325,28 +334,23 @@ GenerationDelete(MemoryContext context) } /* - * GenerationAlloc - * Returns pointer to allocated memory of given size or NULL if - * request could not be completed; memory is added to the set. + * Helper for GenerationAlloc() that allocates an entire block for the chunk. * - * No request may exceed: - * MAXALIGN_DOWN(SIZE_MAX) - Generation_BLOCKHDRSZ - Generation_CHUNKHDRSZ - * All callers use a much-lower limit. - * - * Note: when using valgrind, it doesn't matter how the returned allocation - * is marked, as mcxt.c will set it to UNDEFINED. In some paths we will - * return space that is marked NOACCESS - GenerationRealloc has to beware! + * GenerationAlloc()'s comment explains why this is separate. */ -void * -GenerationAlloc(MemoryContext context, Size size) +pg_noinline +static void * +GenerationAllocLarge(MemoryContext context, Size size, int flags) { GenerationContext *set = (GenerationContext *) context; GenerationBlock *block; MemoryChunk *chunk; Size chunk_size; Size required_size; + Size blksize; - Assert(GenerationIsValid(set)); + /* validate 'size' is within the limits for the given 'flags' */ + MemoryContextCheckSize(context, size, flags); #ifdef MEMORY_CONTEXT_CHECKING /* ensure there's always space for the sentinel byte */ @@ -355,140 +359,66 @@ GenerationAlloc(MemoryContext context, Size size) chunk_size = MAXALIGN(size); #endif required_size = chunk_size + Generation_CHUNKHDRSZ; + blksize = required_size + Generation_BLOCKHDRSZ; - /* is it an over-sized chunk? if yes, allocate special block */ - if (chunk_size > set->allocChunkLimit) - { - Size blksize = required_size + Generation_BLOCKHDRSZ; - - block = (GenerationBlock *) malloc(blksize); - if (block == NULL) - return NULL; + block = (GenerationBlock *) malloc(blksize); + if (block == NULL) + return MemoryContextAllocationFailure(context, size, flags); - context->mem_allocated += blksize; + context->mem_allocated += blksize; - /* block with a single (used) chunk */ - block->context = set; - block->blksize = blksize; - block->nchunks = 1; - block->nfree = 0; + /* block with a single (used) chunk */ + block->context = set; + block->blksize = blksize; + block->nchunks = 1; + block->nfree = 0; - /* the block is completely full */ - block->freeptr = block->endptr = ((char *) block) + blksize; + /* the block is completely full */ + block->freeptr = block->endptr = ((char *) block) + blksize; - chunk = (MemoryChunk *) (((char *) block) + Generation_BLOCKHDRSZ); + chunk = (MemoryChunk *) (((char *) block) + Generation_BLOCKHDRSZ); - /* mark the MemoryChunk as externally managed */ - MemoryChunkSetHdrMaskExternal(chunk, MCTX_GENERATION_ID); + /* mark the MemoryChunk as externally managed */ + MemoryChunkSetHdrMaskExternal(chunk, MCTX_GENERATION_ID); #ifdef MEMORY_CONTEXT_CHECKING - chunk->requested_size = size; - /* set mark to catch clobber of "unused" space */ - Assert(size < chunk_size); - set_sentinel(MemoryChunkGetPointer(chunk), size); + chunk->requested_size = size; + /* set mark to catch clobber of "unused" space */ + Assert(size < chunk_size); + set_sentinel(MemoryChunkGetPointer(chunk), size); #endif #ifdef RANDOMIZE_ALLOCATED_MEMORY - /* fill the allocated space with junk */ - randomize_mem((char *) MemoryChunkGetPointer(chunk), size); + /* fill the allocated space with junk */ + randomize_mem((char *) MemoryChunkGetPointer(chunk), size); #endif - /* add the block to the list of allocated blocks */ - dlist_push_head(&set->blocks, &block->node); - - /* Ensure any padding bytes are marked NOACCESS. */ - VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size, - chunk_size - size); - - /* Disallow access to the chunk header. */ - VALGRIND_MAKE_MEM_NOACCESS(chunk, Generation_CHUNKHDRSZ); - - return MemoryChunkGetPointer(chunk); - } - - /* - * Not an oversized chunk. We try to first make use of the current block, - * but if there's not enough space in it, instead of allocating a new - * block, we look to see if the freeblock is empty and has enough space. - * If not, we'll also try the same using the keeper block. The keeper - * block may have become empty and we have no other way to reuse it again - * if we don't try to use it explicitly here. - * - * We don't want to start filling the freeblock before the current block - * is full, otherwise we may cause fragmentation in FIFO type workloads. - * We only switch to using the freeblock or keeper block if those blocks - * are completely empty. If we didn't do that we could end up fragmenting - * consecutive allocations over multiple blocks which would be a problem - * that would compound over time. - */ - block = set->block; - - if (block == NULL || - GenerationBlockFreeBytes(block) < required_size) - { - Size blksize; - GenerationBlock *freeblock = set->freeblock; - - if (freeblock != NULL && - GenerationBlockIsEmpty(freeblock) && - GenerationBlockFreeBytes(freeblock) >= required_size) - { - block = freeblock; - - /* - * Zero out the freeblock as we'll set this to the current block - * below - */ - set->freeblock = NULL; - } - else if (GenerationBlockIsEmpty(set->keeper) && - GenerationBlockFreeBytes(set->keeper) >= required_size) - { - block = set->keeper; - } - else - { - /* - * The first such block has size initBlockSize, and we double the - * space in each succeeding block, but not more than maxBlockSize. - */ - blksize = set->nextBlockSize; - set->nextBlockSize <<= 1; - if (set->nextBlockSize > set->maxBlockSize) - set->nextBlockSize = set->maxBlockSize; - - /* we'll need a block hdr too, so add that to the required size */ - required_size += Generation_BLOCKHDRSZ; - - /* round the size up to the next power of 2 */ - if (blksize < required_size) - blksize = pg_nextpower2_size_t(required_size); - - block = (GenerationBlock *) malloc(blksize); - - if (block == NULL) - return NULL; - - context->mem_allocated += blksize; + /* add the block to the list of allocated blocks */ + dlist_push_head(&set->blocks, &block->node); - /* initialize the new block */ - GenerationBlockInit(set, block, blksize); + /* Ensure any padding bytes are marked NOACCESS. */ + VALGRIND_MAKE_MEM_NOACCESS((char *) MemoryChunkGetPointer(chunk) + size, + chunk_size - size); - /* add it to the doubly-linked list of blocks */ - dlist_push_head(&set->blocks, &block->node); + /* Disallow access to the chunk header. */ + VALGRIND_MAKE_MEM_NOACCESS(chunk, Generation_CHUNKHDRSZ); - /* Zero out the freeblock in case it's become full */ - set->freeblock = NULL; - } + return MemoryChunkGetPointer(chunk); +} - /* and also use it as the current allocation block */ - set->block = block; - } +/* + * Small helper for allocating a new chunk from a chunk, to avoid duplicating + * the code between GenerationAlloc() and GenerationAllocFromNewBlock(). + */ +static inline void * +GenerationAllocChunkFromBlock(MemoryContext context, GenerationBlock *block, + Size size, Size chunk_size) +{ + MemoryChunk *chunk = (MemoryChunk *) (block->freeptr); - /* we're supposed to have a block with enough free space now */ + /* validate we've been given a block with enough free space */ Assert(block != NULL); - Assert((block->endptr - block->freeptr) >= Generation_CHUNKHDRSZ + chunk_size); - - chunk = (MemoryChunk *) block->freeptr; + Assert((block->endptr - block->freeptr) >= + Generation_CHUNKHDRSZ + chunk_size); /* Prepare to initialize the chunk header. */ VALGRIND_MAKE_MEM_UNDEFINED(chunk, Generation_CHUNKHDRSZ); @@ -520,6 +450,156 @@ GenerationAlloc(MemoryContext context, Size size) return MemoryChunkGetPointer(chunk); } +/* + * Helper for GenerationAlloc() that allocates a new block and returns a chunk + * allocated from it. + * + * GenerationAlloc()'s comment explains why this is separate. + */ +pg_noinline +static void * +GenerationAllocFromNewBlock(MemoryContext context, Size size, int flags, + Size chunk_size) +{ + GenerationContext *set = (GenerationContext *) context; + GenerationBlock *block; + Size blksize; + Size required_size; + + /* + * The first such block has size initBlockSize, and we double the space in + * each succeeding block, but not more than maxBlockSize. + */ + blksize = set->nextBlockSize; + set->nextBlockSize <<= 1; + if (set->nextBlockSize > set->maxBlockSize) + set->nextBlockSize = set->maxBlockSize; + + /* we'll need space for the chunk, chunk hdr and block hdr */ + required_size = chunk_size + Generation_CHUNKHDRSZ + Generation_BLOCKHDRSZ; + + /* round the size up to the next power of 2 */ + if (blksize < required_size) + blksize = pg_nextpower2_size_t(required_size); + + block = (GenerationBlock *) malloc(blksize); + + if (block == NULL) + return MemoryContextAllocationFailure(context, size, flags); + + context->mem_allocated += blksize; + + /* initialize the new block */ + GenerationBlockInit(set, block, blksize); + + /* add it to the doubly-linked list of blocks */ + dlist_push_head(&set->blocks, &block->node); + + /* make this the current block */ + set->block = block; + + return GenerationAllocChunkFromBlock(context, block, size, chunk_size); +} + +/* + * GenerationAlloc + * Returns a pointer to allocated memory of given size or raises an ERROR + * on allocation failure, or returns NULL when flags contains + * MCXT_ALLOC_NO_OOM. + * + * No request may exceed: + * MAXALIGN_DOWN(SIZE_MAX) - Generation_BLOCKHDRSZ - Generation_CHUNKHDRSZ + * All callers use a much-lower limit. + * + * Note: when using valgrind, it doesn't matter how the returned allocation + * is marked, as mcxt.c will set it to UNDEFINED. In some paths we will + * return space that is marked NOACCESS - GenerationRealloc has to beware! + * + * This function should only contain the most common code paths. Everything + * else should be in pg_noinline helper functions, thus avoiding the overhead + * of creating a stack frame for the common cases. Allocating memory is often + * a bottleneck in many workloads, so avoiding stack frame setup is + * worthwhile. Helper functions should always directly return the newly + * allocated memory so that we can just return that address directly as a tail + * call. + */ +void * +GenerationAlloc(MemoryContext context, Size size, int flags) +{ + GenerationContext *set = (GenerationContext *) context; + GenerationBlock *block; + Size chunk_size; + Size required_size; + + Assert(GenerationIsValid(set)); + +#ifdef MEMORY_CONTEXT_CHECKING + /* ensure there's always space for the sentinel byte */ + chunk_size = MAXALIGN(size + 1); +#else + chunk_size = MAXALIGN(size); +#endif + + /* + * If requested size exceeds maximum for chunks we hand the request off to + * GenerationAllocLarge(). + */ + if (chunk_size > set->allocChunkLimit) + return GenerationAllocLarge(context, size, flags); + + required_size = chunk_size + Generation_CHUNKHDRSZ; + + /* + * Not an oversized chunk. We try to first make use of the current block, + * but if there's not enough space in it, instead of allocating a new + * block, we look to see if the empty freeblock has enough space. We + * don't try reusing the keeper block. If it's become empty we'll reuse + * that again only if the context is reset. + * + * We only try reusing the freeblock if we've no space for this allocation + * on the current block. When a freeblock exists, we'll switch to it once + * the first time we can't fit an allocation in the current block. We + * avoid ping-ponging between the two as we need to be careful not to + * fragment differently sized consecutive allocations between several + * blocks. Going between the two could cause fragmentation for FIFO + * workloads, which generation is meant to be good at. + */ + block = set->block; + + if (unlikely(GenerationBlockFreeBytes(block) < required_size)) + { + GenerationBlock *freeblock = set->freeblock; + + /* freeblock, if set, must be empty */ + Assert(freeblock == NULL || GenerationBlockIsEmpty(freeblock)); + + /* check if we have a freeblock and if it's big enough */ + if (freeblock != NULL && + GenerationBlockFreeBytes(freeblock) >= required_size) + { + /* make the freeblock the current block */ + set->freeblock = NULL; + set->block = freeblock; + + return GenerationAllocChunkFromBlock(context, + freeblock, + size, + chunk_size); + } + else + { + /* + * No freeblock, or it's not big enough for this allocation. Make + * a new block. + */ + return GenerationAllocFromNewBlock(context, size, flags, chunk_size); + } + } + + /* The current block has space, so just allocate chunk there. */ + return GenerationAllocChunkFromBlock(context, block, size, chunk_size); +} + /* * GenerationBlockInit * Initializes 'block' assuming 'blksize'. Does not update the context's @@ -542,16 +622,6 @@ GenerationBlockInit(GenerationContext *context, GenerationBlock *block, blksize - Generation_BLOCKHDRSZ); } -/* - * GenerationBlockIsEmpty - * Returns true iff 'block' contains no chunks - */ -static inline bool -GenerationBlockIsEmpty(GenerationBlock *block) -{ - return (block->nchunks == 0); -} - /* * GenerationBlockMarkEmpty * Set a block as empty. Does not free the block. @@ -594,7 +664,7 @@ static inline void GenerationBlockFree(GenerationContext *set, GenerationBlock *block) { /* Make sure nobody tries to free the keeper block */ - Assert(block != set->keeper); + Assert(!IsKeeperBlock(set, block)); /* We shouldn't be freeing the freeblock either */ Assert(block != set->freeblock); @@ -612,8 +682,8 @@ GenerationBlockFree(GenerationContext *set, GenerationBlock *block) /* * GenerationFree - * Update number of chunks in the block, and if all chunks in the block - * are now free then discard the block. + * Update number of chunks in the block, and consider freeing the block + * if it's become empty. */ void GenerationFree(void *pointer) @@ -683,45 +753,41 @@ GenerationFree(void *pointer) Assert(block->nchunks > 0); Assert(block->nfree <= block->nchunks); + Assert(block != block->context->freeblock); /* If there are still allocated chunks in the block, we're done. */ - if (block->nfree < block->nchunks) + if (likely(block->nfree < block->nchunks)) return; set = block->context; - /* Don't try to free the keeper block, just mark it empty */ - if (block == set->keeper) - { - GenerationBlockMarkEmpty(block); - return; - } - - /* - * If there is no freeblock set or if this is the freeblock then instead - * of freeing this memory, we keep it around so that new allocations have - * the option of recycling it. + /*----------------------- + * The block this allocation was on has now become completely empty of + * chunks. In the general case, we can now return the memory for this + * block back to malloc. However, there are cases where we don't want to + * do that: + * + * 1) If it's the keeper block. This block was malloc'd in the same + * allocation as the context itself and can't be free'd without + * freeing the context. + * 2) If it's the current block. We could free this, but doing so would + * leave us nothing to set the current block to, so we just mark the + * block as empty so new allocations can reuse it again. + * 3) If we have no "freeblock" set, then we save a single block for + * future allocations to avoid having to malloc a new block again. + * This is useful for FIFO workloads as it avoids continual + * free/malloc cycles. */ - if (set->freeblock == NULL || set->freeblock == block) + if (IsKeeperBlock(set, block) || set->block == block) + GenerationBlockMarkEmpty(block); /* case 1 and 2 */ + else if (set->freeblock == NULL) { - /* XXX should we only recycle maxBlockSize sized blocks? */ - set->freeblock = block; + /* case 3 */ GenerationBlockMarkEmpty(block); - return; + set->freeblock = block; } - - /* Also make sure the block is not marked as the current block. */ - if (set->block == block) - set->block = NULL; - - /* - * The block is empty, so let's get rid of it. First remove it from the - * list of blocks, then return it to malloc(). - */ - dlist_delete(&block->node); - - set->header.mem_allocated -= block->blksize; - free(block); + else + GenerationBlockFree(set, block); /* Otherwise, free it */ } /* @@ -731,7 +797,7 @@ GenerationFree(void *pointer) * into the old chunk - in that case we just update chunk header. */ void * -GenerationRealloc(void *pointer, Size size) +GenerationRealloc(void *pointer, Size size, int flags) { MemoryChunk *chunk = PointerGetMemoryChunk(pointer); GenerationContext *set; @@ -780,8 +846,8 @@ GenerationRealloc(void *pointer, Size size) #endif /* - * Maybe the allocated area already is >= the new size. (In particular, - * we always fall out here if the requested size is a decrease.) + * Maybe the allocated area already big enough. (In particular, we always + * fall out here if the requested size is a decrease.) * * This memory context does not use power-of-2 chunk sizing and instead * carves the chunks to be as small as possible, so most repalloc() calls @@ -789,7 +855,12 @@ GenerationRealloc(void *pointer, Size size) * * XXX Perhaps we should annotate this condition with unlikely()? */ +#ifdef MEMORY_CONTEXT_CHECKING + /* With MEMORY_CONTEXT_CHECKING, we need an extra byte for the sentinel */ + if (oldsize > size) +#else if (oldsize >= size) +#endif { #ifdef MEMORY_CONTEXT_CHECKING Size oldrequest = chunk->requested_size; @@ -833,15 +904,15 @@ GenerationRealloc(void *pointer, Size size) return pointer; } - /* allocate new chunk */ - newPointer = GenerationAlloc((MemoryContext) set, size); + /* allocate new chunk (this also checks size is valid) */ + newPointer = GenerationAlloc((MemoryContext) set, size, flags); /* leave immediately if request was not completed */ if (newPointer == NULL) { /* Disallow access to the chunk header. */ VALGRIND_MAKE_MEM_NOACCESS(chunk, Generation_CHUNKHDRSZ); - return NULL; + return MemoryContextAllocationFailure((MemoryContext) set, size, flags); } /* diff --git a/src/backend/utils/mmgr/mcxt.c b/src/backend/utils/mmgr/mcxt.c index 9fc83f11f6f1f..b42ececbe78f4 100644 --- a/src/backend/utils/mmgr/mcxt.c +++ b/src/backend/utils/mmgr/mcxt.c @@ -9,7 +9,7 @@ * context's MemoryContextMethods struct. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -23,10 +23,6 @@ #include "mb/pg_wchar.h" #include "miscadmin.h" -#include "storage/proc.h" -#include "storage/procarray.h" -#include "storage/procsignal.h" -#include "utils/fmgrprotos.h" #include "utils/memdebug.h" #include "utils/memutils.h" #include "utils/memutils_internal.h" @@ -34,13 +30,18 @@ static void BogusFree(void *pointer); -static void *BogusRealloc(void *pointer, Size size); +static void *BogusRealloc(void *pointer, Size size, int flags); static MemoryContext BogusGetChunkContext(void *pointer); static Size BogusGetChunkSpace(void *pointer); /***************************************************************************** * GLOBAL MEMORY * *****************************************************************************/ +#define BOGUS_MCTX(id) \ + [id].free_p = BogusFree, \ + [id].realloc = BogusRealloc, \ + [id].get_chunk_context = BogusGetChunkContext, \ + [id].get_chunk_space = BogusGetChunkSpace static const MemoryContextMethods mcxt_methods[] = { /* aset.c */ @@ -99,35 +100,42 @@ static const MemoryContextMethods mcxt_methods[] = { [MCTX_ALIGNED_REDIRECT_ID].check = NULL, /* not required */ #endif + /* bump.c */ + [MCTX_BUMP_ID].alloc = BumpAlloc, + [MCTX_BUMP_ID].free_p = BumpFree, + [MCTX_BUMP_ID].realloc = BumpRealloc, + [MCTX_BUMP_ID].reset = BumpReset, + [MCTX_BUMP_ID].delete_context = BumpDelete, + [MCTX_BUMP_ID].get_chunk_context = BumpGetChunkContext, + [MCTX_BUMP_ID].get_chunk_space = BumpGetChunkSpace, + [MCTX_BUMP_ID].is_empty = BumpIsEmpty, + [MCTX_BUMP_ID].stats = BumpStats, +#ifdef MEMORY_CONTEXT_CHECKING + [MCTX_BUMP_ID].check = BumpCheck, +#endif + /* - * Unused (as yet) IDs should have dummy entries here. This allows us to - * fail cleanly if a bogus pointer is passed to pfree or the like. It + * Reserved and unused IDs should have dummy entries here. This allows us + * to fail cleanly if a bogus pointer is passed to pfree or the like. It * seems sufficient to provide routines for the methods that might get * invoked from inspection of a chunk (see MCXT_METHOD calls below). */ - - [MCTX_UNUSED1_ID].free_p = BogusFree, - [MCTX_UNUSED1_ID].realloc = BogusRealloc, - [MCTX_UNUSED1_ID].get_chunk_context = BogusGetChunkContext, - [MCTX_UNUSED1_ID].get_chunk_space = BogusGetChunkSpace, - - [MCTX_UNUSED2_ID].free_p = BogusFree, - [MCTX_UNUSED2_ID].realloc = BogusRealloc, - [MCTX_UNUSED2_ID].get_chunk_context = BogusGetChunkContext, - [MCTX_UNUSED2_ID].get_chunk_space = BogusGetChunkSpace, - - [MCTX_UNUSED3_ID].free_p = BogusFree, - [MCTX_UNUSED3_ID].realloc = BogusRealloc, - [MCTX_UNUSED3_ID].get_chunk_context = BogusGetChunkContext, - [MCTX_UNUSED3_ID].get_chunk_space = BogusGetChunkSpace, - - [MCTX_UNUSED4_ID].free_p = BogusFree, - [MCTX_UNUSED4_ID].realloc = BogusRealloc, - [MCTX_UNUSED4_ID].get_chunk_context = BogusGetChunkContext, - [MCTX_UNUSED4_ID].get_chunk_space = BogusGetChunkSpace, + BOGUS_MCTX(MCTX_1_RESERVED_GLIBC_ID), + BOGUS_MCTX(MCTX_2_RESERVED_GLIBC_ID), + BOGUS_MCTX(MCTX_8_UNUSED_ID), + BOGUS_MCTX(MCTX_9_UNUSED_ID), + BOGUS_MCTX(MCTX_10_UNUSED_ID), + BOGUS_MCTX(MCTX_11_UNUSED_ID), + BOGUS_MCTX(MCTX_12_UNUSED_ID), + BOGUS_MCTX(MCTX_13_UNUSED_ID), + BOGUS_MCTX(MCTX_14_UNUSED_ID), + BOGUS_MCTX(MCTX_0_RESERVED_UNUSEDMEM_ID), + BOGUS_MCTX(MCTX_15_RESERVED_WIPEDMEM_ID) }; +#undef BOGUS_MCTX + /* * CurrentMemoryContext * Default memory context for allocations. @@ -149,9 +157,10 @@ MemoryContext CurTransactionContext = NULL; /* This is a transient link to the active portal's memory context: */ MemoryContext PortalContext = NULL; +static void MemoryContextDeleteOnly(MemoryContext context); static void MemoryContextCallResetCallbacks(MemoryContext context); static void MemoryContextStatsInternal(MemoryContext context, int level, - bool print, int max_children, + int max_level, int max_children, MemoryContextCounters *totals, bool print_to_stderr); static void MemoryContextStatsPrint(MemoryContext context, void *passthru, @@ -223,6 +232,50 @@ GetMemoryChunkHeader(const void *pointer) return header; } +/* + * MemoryContextTraverseNext + * Helper function to traverse all descendants of a memory context + * without recursion. + * + * Recursion could lead to out-of-stack errors with deep context hierarchies, + * which would be unpleasant in error cleanup code paths. + * + * To process 'context' and all its descendants, use a loop like this: + * + * + * for (MemoryContext curr = context->firstchild; + * curr != NULL; + * curr = MemoryContextTraverseNext(curr, context)) + * { + * + * } + * + * This visits all the contexts in pre-order, that is a node is visited + * before its children. + */ +static MemoryContext +MemoryContextTraverseNext(MemoryContext curr, MemoryContext top) +{ + /* After processing a node, traverse to its first child if any */ + if (curr->firstchild != NULL) + return curr->firstchild; + + /* + * After processing a childless node, traverse to its next sibling if + * there is one. If there isn't, traverse back up to the parent (which + * has already been visited, and now so have all its descendants). We're + * done if that is "top", otherwise traverse to its next sibling if any, + * otherwise repeat moving up. + */ + while (curr->nextchild == NULL) + { + curr = curr->parent; + if (curr == top) + return NULL; + } + return curr->nextchild; +} + /* * Support routines to trap use of invalid memory context method IDs * (from calling pfree or the like on a bogus pointer). As a possible @@ -237,7 +290,7 @@ BogusFree(void *pointer) } static void * -BogusRealloc(void *pointer, Size size) +BogusRealloc(void *pointer, Size size, int flags) { elog(ERROR, "repalloc called with invalid pointer %p (header 0x%016llx)", pointer, (unsigned long long) GetMemoryChunkHeader(pointer)); @@ -379,14 +432,13 @@ MemoryContextResetOnly(MemoryContext context) void MemoryContextResetChildren(MemoryContext context) { - MemoryContext child; - Assert(MemoryContextIsValid(context)); - for (child = context->firstchild; child != NULL; child = child->nextchild) + for (MemoryContext curr = context->firstchild; + curr != NULL; + curr = MemoryContextTraverseNext(curr, context)) { - MemoryContextResetChildren(child); - MemoryContextResetOnly(child); + MemoryContextResetOnly(curr); } } @@ -396,21 +448,60 @@ MemoryContextResetChildren(MemoryContext context) * allocated therein. * * The type-specific delete routine removes all storage for the context, - * but we have to recurse to handle the children. - * We must also delink the context from its parent, if it has one. + * but we have to deal with descendant nodes here. */ void MemoryContextDelete(MemoryContext context) +{ + MemoryContext curr; + + Assert(MemoryContextIsValid(context)); + + /* + * Delete subcontexts from the bottom up. + * + * Note: Do not use recursion here. A "stack depth limit exceeded" error + * would be unpleasant if we're already in the process of cleaning up from + * transaction abort. We also cannot use MemoryContextTraverseNext() here + * because we modify the tree as we go. + */ + curr = context; + for (;;) + { + MemoryContext parent; + + /* Descend down until we find a leaf context with no children */ + while (curr->firstchild != NULL) + curr = curr->firstchild; + + /* + * We're now at a leaf with no children. Free it and continue from the + * parent. Or if this was the original node, we're all done. + */ + parent = curr->parent; + MemoryContextDeleteOnly(curr); + + if (curr == context) + break; + curr = parent; + } +} + +/* + * Subroutine of MemoryContextDelete, + * to delete a context that has no children. + * We must also delink the context from its parent, if it has one. + */ +static void +MemoryContextDeleteOnly(MemoryContext context) { Assert(MemoryContextIsValid(context)); /* We had better not be deleting TopMemoryContext ... */ Assert(context != TopMemoryContext); /* And not CurrentMemoryContext, either */ Assert(context != CurrentMemoryContext); - - /* save a function call in common case where there are no children */ - if (context->firstchild != NULL) - MemoryContextDeleteChildren(context); + /* All the children should've been deleted already */ + Assert(context->firstchild == NULL); /* * It's not entirely clear whether 'tis better to do this before or after @@ -676,17 +767,41 @@ MemoryContextMemAllocated(MemoryContext context, bool recurse) if (recurse) { - MemoryContext child; - - for (child = context->firstchild; - child != NULL; - child = child->nextchild) - total += MemoryContextMemAllocated(child, true); + for (MemoryContext curr = context->firstchild; + curr != NULL; + curr = MemoryContextTraverseNext(curr, context)) + { + total += curr->mem_allocated; + } } return total; } +/* + * Return the memory consumption statistics about the given context and its + * children. + */ +void +MemoryContextMemConsumed(MemoryContext context, + MemoryContextCounters *consumed) +{ + Assert(MemoryContextIsValid(context)); + + memset(consumed, 0, sizeof(*consumed)); + + /* Examine the context itself */ + context->methods->stats(context, NULL, NULL, consumed, false); + + /* Examine children, using iteration not recursion */ + for (MemoryContext curr = context->firstchild; + curr != NULL; + curr = MemoryContextTraverseNext(curr, context)) + { + curr->methods->stats(curr, NULL, NULL, consumed, false); + } +} + /* * MemoryContextStats * Print statistics about the named context and all its descendants. @@ -698,8 +813,8 @@ MemoryContextMemAllocated(MemoryContext context, bool recurse) void MemoryContextStats(MemoryContext context) { - /* A hard-wired limit on the number of children is usually good enough */ - MemoryContextStatsDetail(context, 100, true); + /* Hard-wired limits are usually good enough */ + MemoryContextStatsDetail(context, 100, 100, true); } /* @@ -711,14 +826,16 @@ MemoryContextStats(MemoryContext context) * with fprintf(stderr), otherwise use ereport(). */ void -MemoryContextStatsDetail(MemoryContext context, int max_children, +MemoryContextStatsDetail(MemoryContext context, + int max_level, int max_children, bool print_to_stderr) { MemoryContextCounters grand_totals; memset(&grand_totals, 0, sizeof(grand_totals)); - MemoryContextStatsInternal(context, 0, true, max_children, &grand_totals, print_to_stderr); + MemoryContextStatsInternal(context, 0, max_level, max_children, + &grand_totals, print_to_stderr); if (print_to_stderr) fprintf(stderr, @@ -727,7 +844,7 @@ MemoryContextStatsDetail(MemoryContext context, int max_children, grand_totals.freespace, grand_totals.freechunks, grand_totals.totalspace - grand_totals.freespace); else - + { /* * Use LOG_SERVER_ONLY to prevent the memory contexts from being sent * to the connected client. @@ -745,22 +862,22 @@ MemoryContextStatsDetail(MemoryContext context, int max_children, grand_totals.totalspace, grand_totals.nblocks, grand_totals.freespace, grand_totals.freechunks, grand_totals.totalspace - grand_totals.freespace))); + } } /* * MemoryContextStatsInternal * One recursion level for MemoryContextStats * - * Print this context if print is true, but in any case accumulate counts into - * *totals (if given). + * Print stats for this context if possible, but in any case accumulate counts + * into *totals (if not NULL). */ static void MemoryContextStatsInternal(MemoryContext context, int level, - bool print, int max_children, + int max_level, int max_children, MemoryContextCounters *totals, bool print_to_stderr) { - MemoryContextCounters local_totals; MemoryContext child; int ichild; @@ -768,65 +885,72 @@ MemoryContextStatsInternal(MemoryContext context, int level, /* Examine the context itself */ context->methods->stats(context, - print ? MemoryContextStatsPrint : NULL, + MemoryContextStatsPrint, (void *) &level, totals, print_to_stderr); /* - * Examine children. If there are more than max_children of them, we do - * not print the rest explicitly, but just summarize them. + * Examine children. + * + * If we are past the recursion depth limit or already running low on + * stack, do not print them explicitly but just summarize them. Similarly, + * if there are more than max_children of them, we do not print the rest + * explicitly, but just summarize them. */ - memset(&local_totals, 0, sizeof(local_totals)); - - for (child = context->firstchild, ichild = 0; - child != NULL; - child = child->nextchild, ichild++) + child = context->firstchild; + ichild = 0; + if (level < max_level && !stack_is_too_deep()) { - if (ichild < max_children) + for (; child != NULL && ichild < max_children; + child = child->nextchild, ichild++) + { MemoryContextStatsInternal(child, level + 1, - print, max_children, + max_level, max_children, totals, print_to_stderr); - else - MemoryContextStatsInternal(child, level + 1, - false, max_children, - &local_totals, - print_to_stderr); + } } - /* Deal with excess children */ - if (ichild > max_children) + if (child != NULL) { - if (print) + /* Summarize the rest of the children, avoiding recursion. */ + MemoryContextCounters local_totals; + + memset(&local_totals, 0, sizeof(local_totals)); + + ichild = 0; + while (child != NULL) + { + child->methods->stats(child, NULL, NULL, &local_totals, false); + ichild++; + child = MemoryContextTraverseNext(child, context); + } + + if (print_to_stderr) { - if (print_to_stderr) - { - int i; - - for (i = 0; i <= level; i++) - fprintf(stderr, " "); - fprintf(stderr, - "%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n", - ichild - max_children, - local_totals.totalspace, - local_totals.nblocks, - local_totals.freespace, - local_totals.freechunks, - local_totals.totalspace - local_totals.freespace); - } - else - ereport(LOG_SERVER_ONLY, - (errhidestmt(true), - errhidecontext(true), - errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used", - level, - ichild - max_children, - local_totals.totalspace, - local_totals.nblocks, - local_totals.freespace, - local_totals.freechunks, - local_totals.totalspace - local_totals.freespace))); + for (int i = 0; i <= level; i++) + fprintf(stderr, " "); + fprintf(stderr, + "%d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used\n", + ichild, + local_totals.totalspace, + local_totals.nblocks, + local_totals.freespace, + local_totals.freechunks, + local_totals.totalspace - local_totals.freespace); } + else + ereport(LOG_SERVER_ONLY, + (errhidestmt(true), + errhidecontext(true), + errmsg_internal("level: %d; %d more child contexts containing %zu total in %zu blocks; %zu free (%zu chunks); %zu used", + level, + ichild, + local_totals.totalspace, + local_totals.nblocks, + local_totals.freespace, + local_totals.freechunks, + local_totals.totalspace - local_totals.freespace))); if (totals) { @@ -919,7 +1043,7 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru, /* * MemoryContextCheck - * Check all chunks in the named context. + * Check all chunks in the named context and its children. * * This is just a debugging utility, so it's not fancy. */ @@ -927,13 +1051,16 @@ MemoryContextStatsPrint(MemoryContext context, void *passthru, void MemoryContextCheck(MemoryContext context) { - MemoryContext child; - Assert(MemoryContextIsValid(context)); - context->methods->check(context); - for (child = context->firstchild; child != NULL; child = child->nextchild) - MemoryContextCheck(child); + + for (MemoryContext curr = context->firstchild; + curr != NULL; + curr = MemoryContextTraverseNext(curr, context)) + { + Assert(MemoryContextIsValid(curr)); + curr->methods->check(curr); + } } #endif @@ -1011,120 +1138,93 @@ MemoryContextCreate(MemoryContext node, } /* - * MemoryContextAlloc - * Allocate space within the specified context. - * - * This could be turned into a macro, but we'd have to import - * nodes/memnodes.h into postgres.h which seems a bad idea. + * MemoryContextAllocationFailure + * For use by MemoryContextMethods implementations to handle when malloc + * returns NULL. The behavior is specific to whether MCXT_ALLOC_NO_OOM + * is in 'flags'. */ void * -MemoryContextAlloc(MemoryContext context, Size size) +MemoryContextAllocationFailure(MemoryContext context, Size size, int flags) { - void *ret; - - Assert(MemoryContextIsValid(context)); - AssertNotInCriticalSection(context); - - if (!AllocSizeIsValid(size)) - elog(ERROR, "invalid memory alloc request size %zu", size); - - context->isReset = false; - - ret = context->methods->alloc(context, size); - if (unlikely(ret == NULL)) + if ((flags & MCXT_ALLOC_NO_OOM) == 0) { MemoryContextStats(TopMemoryContext); - - /* - * Here, and elsewhere in this module, we show the target context's - * "name" but not its "ident" (if any) in user-visible error messages. - * The "ident" string might contain security-sensitive data, such as - * values in SQL commands. - */ ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of memory"), errdetail("Failed on request of size %zu in memory context \"%s\".", size, context->name))); } + return NULL; +} - VALGRIND_MEMPOOL_ALLOC(context, ret, size); - - return ret; +/* + * MemoryContextSizeFailure + * For use by MemoryContextMethods implementations to handle invalid + * memory allocation request sizes. + */ +void +MemoryContextSizeFailure(MemoryContext context, Size size, int flags) +{ + elog(ERROR, "invalid memory alloc request size %zu", size); } /* - * MemoryContextAllocZero - * Like MemoryContextAlloc, but clears allocated memory + * MemoryContextAlloc + * Allocate space within the specified context. * - * We could just call MemoryContextAlloc then clear the memory, but this - * is a very common combination, so we provide the combined operation. + * This could be turned into a macro, but we'd have to import + * nodes/memnodes.h into postgres.h which seems a bad idea. */ void * -MemoryContextAllocZero(MemoryContext context, Size size) +MemoryContextAlloc(MemoryContext context, Size size) { void *ret; Assert(MemoryContextIsValid(context)); AssertNotInCriticalSection(context); - if (!AllocSizeIsValid(size)) - elog(ERROR, "invalid memory alloc request size %zu", size); - context->isReset = false; - ret = context->methods->alloc(context, size); - if (unlikely(ret == NULL)) - { - MemoryContextStats(TopMemoryContext); - ereport(ERROR, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("out of memory"), - errdetail("Failed on request of size %zu in memory context \"%s\".", - size, context->name))); - } + /* + * For efficiency reasons, we purposefully offload the handling of + * allocation failures to the MemoryContextMethods implementation as this + * allows these checks to be performed only when an actual malloc needs to + * be done to request more memory from the OS. Additionally, not having + * to execute any instructions after this call allows the compiler to use + * the sibling call optimization. If you're considering adding code after + * this call, consider making it the responsibility of the 'alloc' + * function instead. + */ + ret = context->methods->alloc(context, size, 0); VALGRIND_MEMPOOL_ALLOC(context, ret, size); - MemSetAligned(ret, 0, size); - return ret; } /* - * MemoryContextAllocZeroAligned - * MemoryContextAllocZero where length is suitable for MemSetLoop + * MemoryContextAllocZero + * Like MemoryContextAlloc, but clears allocated memory * - * This might seem overly specialized, but it's not because newNode() - * is so often called with compile-time-constant sizes. + * We could just call MemoryContextAlloc then clear the memory, but this + * is a very common combination, so we provide the combined operation. */ void * -MemoryContextAllocZeroAligned(MemoryContext context, Size size) +MemoryContextAllocZero(MemoryContext context, Size size) { void *ret; Assert(MemoryContextIsValid(context)); AssertNotInCriticalSection(context); - if (!AllocSizeIsValid(size)) - elog(ERROR, "invalid memory alloc request size %zu", size); - context->isReset = false; - ret = context->methods->alloc(context, size); - if (unlikely(ret == NULL)) - { - MemoryContextStats(TopMemoryContext); - ereport(ERROR, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("out of memory"), - errdetail("Failed on request of size %zu in memory context \"%s\".", - size, context->name))); - } + ret = context->methods->alloc(context, size, 0); VALGRIND_MEMPOOL_ALLOC(context, ret, size); - MemSetLoop(ret, 0, size); + MemSetAligned(ret, 0, size); return ret; } @@ -1147,20 +1247,9 @@ MemoryContextAllocExtended(MemoryContext context, Size size, int flags) context->isReset = false; - ret = context->methods->alloc(context, size); + ret = context->methods->alloc(context, size, flags); if (unlikely(ret == NULL)) - { - if ((flags & MCXT_ALLOC_NO_OOM) == 0) - { - MemoryContextStats(TopMemoryContext); - ereport(ERROR, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("out of memory"), - errdetail("Failed on request of size %zu in memory context \"%s\".", - size, context->name))); - } return NULL; - } VALGRIND_MEMPOOL_ALLOC(context, ret, size); @@ -1212,14 +1301,15 @@ ProcessLogMemoryContextInterrupt(void) /* * When a backend process is consuming huge memory, logging all its memory * contexts might overrun available disk space. To prevent this, we limit - * the number of child contexts to log per parent to 100. + * the depth of the hierarchy, as well as the number of child contexts to + * log per parent to 100. * * As with MemoryContextStats(), we suppose that practical cases where the * dump gets long will typically be huge numbers of siblings under the * same parent context; while the additional debugging value from seeing * details about individual siblings beyond 100 will not be large. */ - MemoryContextStatsDetail(TopMemoryContext, 100, false); + MemoryContextStatsDetail(TopMemoryContext, 100, 100, false); } void * @@ -1232,22 +1322,21 @@ palloc(Size size) Assert(MemoryContextIsValid(context)); AssertNotInCriticalSection(context); - if (!AllocSizeIsValid(size)) - elog(ERROR, "invalid memory alloc request size %zu", size); - context->isReset = false; - ret = context->methods->alloc(context, size); - if (unlikely(ret == NULL)) - { - MemoryContextStats(TopMemoryContext); - ereport(ERROR, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("out of memory"), - errdetail("Failed on request of size %zu in memory context \"%s\".", - size, context->name))); - } - + /* + * For efficiency reasons, we purposefully offload the handling of + * allocation failures to the MemoryContextMethods implementation as this + * allows these checks to be performed only when an actual malloc needs to + * be done to request more memory from the OS. Additionally, not having + * to execute any instructions after this call allows the compiler to use + * the sibling call optimization. If you're considering adding code after + * this call, consider making it the responsibility of the 'alloc' + * function instead. + */ + ret = context->methods->alloc(context, size, 0); + /* We expect OOM to be handled by the alloc function */ + Assert(ret != NULL); VALGRIND_MEMPOOL_ALLOC(context, ret, size); return ret; @@ -1263,21 +1352,9 @@ palloc0(Size size) Assert(MemoryContextIsValid(context)); AssertNotInCriticalSection(context); - if (!AllocSizeIsValid(size)) - elog(ERROR, "invalid memory alloc request size %zu", size); - context->isReset = false; - ret = context->methods->alloc(context, size); - if (unlikely(ret == NULL)) - { - MemoryContextStats(TopMemoryContext); - ereport(ERROR, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("out of memory"), - errdetail("Failed on request of size %zu in memory context \"%s\".", - size, context->name))); - } + ret = context->methods->alloc(context, size, 0); VALGRIND_MEMPOOL_ALLOC(context, ret, size); @@ -1296,24 +1373,11 @@ palloc_extended(Size size, int flags) Assert(MemoryContextIsValid(context)); AssertNotInCriticalSection(context); - if (!((flags & MCXT_ALLOC_HUGE) != 0 ? AllocHugeSizeIsValid(size) : - AllocSizeIsValid(size))) - elog(ERROR, "invalid memory alloc request size %zu", size); - context->isReset = false; - ret = context->methods->alloc(context, size); + ret = context->methods->alloc(context, size, flags); if (unlikely(ret == NULL)) { - if ((flags & MCXT_ALLOC_NO_OOM) == 0) - { - MemoryContextStats(TopMemoryContext); - ereport(ERROR, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("out of memory"), - errdetail("Failed on request of size %zu in memory context \"%s\".", - size, context->name))); - } return NULL; } @@ -1483,26 +1547,22 @@ repalloc(void *pointer, Size size) #endif void *ret; - if (!AllocSizeIsValid(size)) - elog(ERROR, "invalid memory alloc request size %zu", size); - AssertNotInCriticalSection(context); /* isReset must be false already */ Assert(!context->isReset); - ret = MCXT_METHOD(pointer, realloc) (pointer, size); - if (unlikely(ret == NULL)) - { - MemoryContext cxt = GetMemoryChunkContext(pointer); - - MemoryContextStats(TopMemoryContext); - ereport(ERROR, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("out of memory"), - errdetail("Failed on request of size %zu in memory context \"%s\".", - size, cxt->name))); - } + /* + * For efficiency reasons, we purposefully offload the handling of + * allocation failures to the MemoryContextMethods implementation as this + * allows these checks to be performed only when an actual malloc needs to + * be done to request more memory from the OS. Additionally, not having + * to execute any instructions after this call allows the compiler to use + * the sibling call optimization. If you're considering adding code after + * this call, consider making it the responsibility of the 'realloc' + * function instead. + */ + ret = MCXT_METHOD(pointer, realloc) (pointer, size, 0); #ifdef USE_VALGRIND if (method != MCTX_ALIGNED_REDIRECT_ID) @@ -1525,31 +1585,24 @@ repalloc_extended(void *pointer, Size size, int flags) #endif void *ret; - if (!((flags & MCXT_ALLOC_HUGE) != 0 ? AllocHugeSizeIsValid(size) : - AllocSizeIsValid(size))) - elog(ERROR, "invalid memory alloc request size %zu", size); - AssertNotInCriticalSection(context); /* isReset must be false already */ Assert(!context->isReset); - ret = MCXT_METHOD(pointer, realloc) (pointer, size); + /* + * For efficiency reasons, we purposefully offload the handling of + * allocation failures to the MemoryContextMethods implementation as this + * allows these checks to be performed only when an actual malloc needs to + * be done to request more memory from the OS. Additionally, not having + * to execute any instructions after this call allows the compiler to use + * the sibling call optimization. If you're considering adding code after + * this call, consider making it the responsibility of the 'realloc' + * function instead. + */ + ret = MCXT_METHOD(pointer, realloc) (pointer, size, flags); if (unlikely(ret == NULL)) - { - if ((flags & MCXT_ALLOC_NO_OOM) == 0) - { - MemoryContext cxt = GetMemoryChunkContext(pointer); - - MemoryContextStats(TopMemoryContext); - ereport(ERROR, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("out of memory"), - errdetail("Failed on request of size %zu in memory context \"%s\".", - size, cxt->name))); - } return NULL; - } VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size); @@ -1590,21 +1643,19 @@ MemoryContextAllocHuge(MemoryContext context, Size size) Assert(MemoryContextIsValid(context)); AssertNotInCriticalSection(context); - if (!AllocHugeSizeIsValid(size)) - elog(ERROR, "invalid memory alloc request size %zu", size); - context->isReset = false; - ret = context->methods->alloc(context, size); - if (unlikely(ret == NULL)) - { - MemoryContextStats(TopMemoryContext); - ereport(ERROR, - (errcode(ERRCODE_OUT_OF_MEMORY), - errmsg("out of memory"), - errdetail("Failed on request of size %zu in memory context \"%s\".", - size, context->name))); - } + /* + * For efficiency reasons, we purposefully offload the handling of + * allocation failures to the MemoryContextMethods implementation as this + * allows these checks to be performed only when an actual malloc needs to + * be done to request more memory from the OS. Additionally, not having + * to execute any instructions after this call allows the compiler to use + * the sibling call optimization. If you're considering adding code after + * this call, consider making it the responsibility of the 'alloc' + * function instead. + */ + ret = context->methods->alloc(context, size, MCXT_ALLOC_HUGE); VALGRIND_MEMPOOL_ALLOC(context, ret, size); diff --git a/src/backend/utils/mmgr/memdebug.c b/src/backend/utils/mmgr/memdebug.c index ec50a30d5f748..1d30c01c7fb15 100644 --- a/src/backend/utils/mmgr/memdebug.c +++ b/src/backend/utils/mmgr/memdebug.c @@ -5,7 +5,7 @@ * public API of the memory management subsystem. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/backend/utils/mmgr/memdebug.c diff --git a/src/backend/utils/mmgr/meson.build b/src/backend/utils/mmgr/meson.build index e6ebe145eab6c..dd43a6844c7c9 100644 --- a/src/backend/utils/mmgr/meson.build +++ b/src/backend/utils/mmgr/meson.build @@ -1,8 +1,9 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'alignedalloc.c', 'aset.c', + 'bump.c', 'dsa.c', 'freepage.c', 'generation.c', diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c index 06dfa85f04d8c..93137820ac311 100644 --- a/src/backend/utils/mmgr/portalmem.c +++ b/src/backend/utils/mmgr/portalmem.c @@ -8,7 +8,7 @@ * doesn't actually run the executor for them. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -19,7 +19,6 @@ #include "postgres.h" #include "access/xact.h" -#include "catalog/pg_type.h" #include "commands/portalcmds.h" #include "funcapi.h" #include "miscadmin.h" @@ -1151,6 +1150,9 @@ pg_cursor(PG_FUNCTION_ARGS) /* report only "visible" entries */ if (!portal->visible) continue; + /* also ignore it if PortalDefineQuery hasn't been called yet */ + if (!portal->sourceText) + continue; values[0] = CStringGetTextDatum(portal->name); values[1] = CStringGetTextDatum(portal->sourceText); diff --git a/src/backend/utils/mmgr/slab.c b/src/backend/utils/mmgr/slab.c index 718dd2ba03c52..3e15d59683f86 100644 --- a/src/backend/utils/mmgr/slab.c +++ b/src/backend/utils/mmgr/slab.c @@ -8,7 +8,7 @@ * with minimal memory wastage and fragmentation. * * - * Portions Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2017-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/mmgr/slab.c @@ -71,8 +71,8 @@ #include "lib/ilist.h" #include "utils/memdebug.h" #include "utils/memutils.h" -#include "utils/memutils_memorychunk.h" #include "utils/memutils_internal.h" +#include "utils/memutils_memorychunk.h" #define Slab_BLOCKHDRSZ MAXALIGN(sizeof(SlabBlock)) @@ -104,9 +104,9 @@ typedef struct SlabContext { MemoryContextData header; /* Standard memory-context fields */ /* Allocation parameters for this context: */ - Size chunkSize; /* the requested (non-aligned) chunk size */ - Size fullChunkSize; /* chunk size with chunk header and alignment */ - Size blockSize; /* the size to make each block of chunks */ + uint32 chunkSize; /* the requested (non-aligned) chunk size */ + uint32 fullChunkSize; /* chunk size with chunk header and alignment */ + uint32 blockSize; /* the size to make each block of chunks */ int32 chunksPerBlock; /* number of chunks that fit in 1 block */ int32 curBlocklistIndex; /* index into the blocklist[] element * containing the fullest, blocks */ @@ -314,7 +314,9 @@ SlabGetNextFreeChunk(SlabContext *slab, SlabBlock *block) * blockSize: allocation block size * chunkSize: allocation chunk size * - * The MAXALIGN(chunkSize) may not exceed MEMORYCHUNK_MAX_VALUE + * The Slab_CHUNKHDRSZ + MAXALIGN(chunkSize + 1) may not exceed + * MEMORYCHUNK_MAX_VALUE. + * 'blockSize' may not exceed MEMORYCHUNK_MAX_BLOCKOFFSET. */ MemoryContext SlabContextCreate(MemoryContext parent, @@ -330,7 +332,7 @@ SlabContextCreate(MemoryContext parent, /* ensure MemoryChunk's size is properly maxaligned */ StaticAssertDecl(Slab_CHUNKHDRSZ == MAXALIGN(Slab_CHUNKHDRSZ), "sizeof(MemoryChunk) is not maxaligned"); - Assert(MAXALIGN(chunkSize) <= MEMORYCHUNK_MAX_VALUE); + Assert(blockSize <= MEMORYCHUNK_MAX_BLOCKOFFSET); /* * Ensure there's enough space to store the pointer to the next free chunk @@ -347,6 +349,8 @@ SlabContextCreate(MemoryContext parent, fullChunkSize = Slab_CHUNKHDRSZ + MAXALIGN(chunkSize); #endif + Assert(fullChunkSize <= MEMORYCHUNK_MAX_VALUE); + /* compute the number of chunks that will fit on each block */ chunksPerBlock = (blockSize - Slab_BLOCKHDRSZ) / fullChunkSize; @@ -374,9 +378,9 @@ SlabContextCreate(MemoryContext parent, */ /* Fill in SlabContext-specific header fields */ - slab->chunkSize = chunkSize; - slab->fullChunkSize = fullChunkSize; - slab->blockSize = blockSize; + slab->chunkSize = (uint32) chunkSize; + slab->fullChunkSize = (uint32) fullChunkSize; + slab->blockSize = (uint32) blockSize; slab->chunksPerBlock = chunksPerBlock; slab->curBlocklistIndex = 0; @@ -487,85 +491,169 @@ SlabDelete(MemoryContext context) } /* - * SlabAlloc - * Returns a pointer to allocated memory of given size or NULL if - * request could not be completed; memory is added to the slab. + * Small helper for allocating a new chunk from a chunk, to avoid duplicating + * the code between SlabAlloc() and SlabAllocFromNewBlock(). */ -void * -SlabAlloc(MemoryContext context, Size size) +static inline void * +SlabAllocSetupNewChunk(MemoryContext context, SlabBlock *block, + MemoryChunk *chunk, Size size) +{ + SlabContext *slab = (SlabContext *) context; + + /* + * Check that the chunk pointer is actually somewhere on the block and is + * aligned as expected. + */ + Assert(chunk >= SlabBlockGetChunk(slab, block, 0)); + Assert(chunk <= SlabBlockGetChunk(slab, block, slab->chunksPerBlock - 1)); + Assert(SlabChunkMod(slab, block, chunk) == 0); + + /* Prepare to initialize the chunk header. */ + VALGRIND_MAKE_MEM_UNDEFINED(chunk, Slab_CHUNKHDRSZ); + + MemoryChunkSetHdrMask(chunk, block, MAXALIGN(slab->chunkSize), MCTX_SLAB_ID); + +#ifdef MEMORY_CONTEXT_CHECKING + /* slab mark to catch clobber of "unused" space */ + Assert(slab->chunkSize < (slab->fullChunkSize - Slab_CHUNKHDRSZ)); + set_sentinel(MemoryChunkGetPointer(chunk), size); + VALGRIND_MAKE_MEM_NOACCESS(((char *) chunk) + Slab_CHUNKHDRSZ + + slab->chunkSize, + slab->fullChunkSize - + (slab->chunkSize + Slab_CHUNKHDRSZ)); +#endif + +#ifdef RANDOMIZE_ALLOCATED_MEMORY + /* fill the allocated space with junk */ + randomize_mem((char *) MemoryChunkGetPointer(chunk), size); +#endif + + /* Disallow access to the chunk header. */ + VALGRIND_MAKE_MEM_NOACCESS(chunk, Slab_CHUNKHDRSZ); + + return MemoryChunkGetPointer(chunk); +} + +pg_noinline +static void * +SlabAllocFromNewBlock(MemoryContext context, Size size, int flags) { SlabContext *slab = (SlabContext *) context; SlabBlock *block; MemoryChunk *chunk; + dlist_head *blocklist; + int blocklist_idx; - Assert(SlabIsValid(slab)); + /* to save allocating a new one, first check the empty blocks list */ + if (dclist_count(&slab->emptyblocks) > 0) + { + dlist_node *node = dclist_pop_head_node(&slab->emptyblocks); - /* sanity check that this is pointing to a valid blocklist */ - Assert(slab->curBlocklistIndex >= 0); - Assert(slab->curBlocklistIndex <= SlabBlocklistIndex(slab, slab->chunksPerBlock)); + block = dlist_container(SlabBlock, node, node); - /* make sure we only allow correct request size */ - if (unlikely(size != slab->chunkSize)) - elog(ERROR, "unexpected alloc chunk size %zu (expected %zu)", - size, slab->chunkSize); + /* + * SlabFree() should have left this block in a valid state with all + * chunks free. Ensure that's the case. + */ + Assert(block->nfree == slab->chunksPerBlock); - /* - * Handle the case when there are no partially filled blocks available. - * SlabFree() will have updated the curBlocklistIndex setting it to zero - * to indicate that it has freed the final block. Also later in - * SlabAlloc() we will set the curBlocklistIndex to zero if we end up - * filling the final block. - */ - if (unlikely(slab->curBlocklistIndex == 0)) + /* fetch the next chunk from this block */ + chunk = SlabGetNextFreeChunk(slab, block); + } + else { - dlist_head *blocklist; - int blocklist_idx; + block = (SlabBlock *) malloc(slab->blockSize); - /* to save allocating a new one, first check the empty blocks list */ - if (dclist_count(&slab->emptyblocks) > 0) - { - dlist_node *node = dclist_pop_head_node(&slab->emptyblocks); + if (unlikely(block == NULL)) + return MemoryContextAllocationFailure(context, size, flags); - block = dlist_container(SlabBlock, node, node); + block->slab = slab; + context->mem_allocated += slab->blockSize; - /* - * SlabFree() should have left this block in a valid state with - * all chunks free. Ensure that's the case. - */ - Assert(block->nfree == slab->chunksPerBlock); + /* use the first chunk in the new block */ + chunk = SlabBlockGetChunk(slab, block, 0); - /* fetch the next chunk from this block */ - chunk = SlabGetNextFreeChunk(slab, block); - } - else - { - block = (SlabBlock *) malloc(slab->blockSize); + block->nfree = slab->chunksPerBlock - 1; + block->unused = SlabBlockGetChunk(slab, block, 1); + block->freehead = NULL; + block->nunused = slab->chunksPerBlock - 1; + } - if (unlikely(block == NULL)) - return NULL; + /* find the blocklist element for storing blocks with 1 used chunk */ + blocklist_idx = SlabBlocklistIndex(slab, block->nfree); + blocklist = &slab->blocklist[blocklist_idx]; - block->slab = slab; - context->mem_allocated += slab->blockSize; + /* this better be empty. We just added a block thinking it was */ + Assert(dlist_is_empty(blocklist)); - /* use the first chunk in the new block */ - chunk = SlabBlockGetChunk(slab, block, 0); + dlist_push_head(blocklist, &block->node); - block->nfree = slab->chunksPerBlock - 1; - block->unused = SlabBlockGetChunk(slab, block, 1); - block->freehead = NULL; - block->nunused = slab->chunksPerBlock - 1; - } + slab->curBlocklistIndex = blocklist_idx; + + return SlabAllocSetupNewChunk(context, block, chunk, size); +} + +/* + * SlabAllocInvalidSize + * Handle raising an ERROR for an invalid size request. We don't do this + * in slab alloc as calling the elog functions would force the compiler + * to setup the stack frame in SlabAlloc. For performance reasons, we + * want to avoid that. + */ +pg_noinline +static void +pg_attribute_noreturn() +SlabAllocInvalidSize(MemoryContext context, Size size) +{ + SlabContext *slab = (SlabContext *) context; + + elog(ERROR, "unexpected alloc chunk size %zu (expected %u)", size, + slab->chunkSize); +} + +/* + * SlabAlloc + * Returns a pointer to a newly allocated memory chunk or raises an ERROR + * on allocation failure, or returns NULL when flags contains + * MCXT_ALLOC_NO_OOM. 'size' must be the same size as was specified + * during SlabContextCreate(). + * + * This function should only contain the most common code paths. Everything + * else should be in pg_noinline helper functions, thus avoiding the overhead + * of creating a stack frame for the common cases. Allocating memory is often + * a bottleneck in many workloads, so avoiding stack frame setup is + * worthwhile. Helper functions should always directly return the newly + * allocated memory so that we can just return that address directly as a tail + * call. + */ +void * +SlabAlloc(MemoryContext context, Size size, int flags) +{ + SlabContext *slab = (SlabContext *) context; + SlabBlock *block; + MemoryChunk *chunk; - /* find the blocklist element for storing blocks with 1 used chunk */ - blocklist_idx = SlabBlocklistIndex(slab, block->nfree); - blocklist = &slab->blocklist[blocklist_idx]; + Assert(SlabIsValid(slab)); - /* this better be empty. We just added a block thinking it was */ - Assert(dlist_is_empty(blocklist)); + /* sanity check that this is pointing to a valid blocklist */ + Assert(slab->curBlocklistIndex >= 0); + Assert(slab->curBlocklistIndex <= SlabBlocklistIndex(slab, slab->chunksPerBlock)); - dlist_push_head(blocklist, &block->node); + /* + * Make sure we only allow correct request size. This doubles as the + * MemoryContextCheckSize check. + */ + if (unlikely(size != slab->chunkSize)) + SlabAllocInvalidSize(context, size); - slab->curBlocklistIndex = blocklist_idx; + if (unlikely(slab->curBlocklistIndex == 0)) + { + /* + * Handle the case when there are no partially filled blocks + * available. This happens either when the last allocation took the + * last chunk in the block, or when SlabFree() free'd the final block. + */ + return SlabAllocFromNewBlock(context, size, flags); } else { @@ -602,38 +690,7 @@ SlabAlloc(MemoryContext context, Size size) } } - /* - * Check that the chunk pointer is actually somewhere on the block and is - * aligned as expected. - */ - Assert(chunk >= SlabBlockGetChunk(slab, block, 0)); - Assert(chunk <= SlabBlockGetChunk(slab, block, slab->chunksPerBlock - 1)); - Assert(SlabChunkMod(slab, block, chunk) == 0); - - /* Prepare to initialize the chunk header. */ - VALGRIND_MAKE_MEM_UNDEFINED(chunk, Slab_CHUNKHDRSZ); - - MemoryChunkSetHdrMask(chunk, block, MAXALIGN(slab->chunkSize), - MCTX_SLAB_ID); -#ifdef MEMORY_CONTEXT_CHECKING - /* slab mark to catch clobber of "unused" space */ - Assert(slab->chunkSize < (slab->fullChunkSize - Slab_CHUNKHDRSZ)); - set_sentinel(MemoryChunkGetPointer(chunk), size); - VALGRIND_MAKE_MEM_NOACCESS(((char *) chunk) + - Slab_CHUNKHDRSZ + slab->chunkSize, - slab->fullChunkSize - - (slab->chunkSize + Slab_CHUNKHDRSZ)); -#endif - -#ifdef RANDOMIZE_ALLOCATED_MEMORY - /* fill the allocated space with junk */ - randomize_mem((char *) MemoryChunkGetPointer(chunk), size); -#endif - - /* Disallow access to the chunk header. */ - VALGRIND_MAKE_MEM_NOACCESS(chunk, Slab_CHUNKHDRSZ); - - return MemoryChunkGetPointer(chunk); + return SlabAllocSetupNewChunk(context, block, chunk, size); } /* @@ -766,7 +823,7 @@ SlabFree(void *pointer) * realloc is usually used to enlarge the chunk. */ void * -SlabRealloc(void *pointer, Size size) +SlabRealloc(void *pointer, Size size, int flags) { MemoryChunk *chunk = PointerGetMemoryChunk(pointer); SlabBlock *block; diff --git a/src/backend/utils/postprocess_dtrace.sed b/src/backend/utils/postprocess_dtrace.sed index 892fe2b2fb718..193a10454a544 100644 --- a/src/backend/utils/postprocess_dtrace.sed +++ b/src/backend/utils/postprocess_dtrace.sed @@ -1,7 +1,7 @@ #------------------------------------------------------------------------- # sed script to postprocess dtrace output # -# Copyright (c) 2008-2023, PostgreSQL Global Development Group +# Copyright (c) 2008-2024, PostgreSQL Global Development Group # # src/backend/utils/postprocess_dtrace.sed #------------------------------------------------------------------------- diff --git a/src/backend/utils/probes.d b/src/backend/utils/probes.d index 0af275587b702..d7725443774c1 100644 --- a/src/backend/utils/probes.d +++ b/src/backend/utils/probes.d @@ -1,7 +1,7 @@ /* ---------- * DTrace probes for PostgreSQL backend * - * Copyright (c) 2006-2023, PostgreSQL Global Development Group + * Copyright (c) 2006-2024, PostgreSQL Global Development Group * * src/backend/utils/probes.d * ---------- diff --git a/src/backend/utils/resowner/README b/src/backend/utils/resowner/README index f94c9700df406..cbf34e0b5646a 100644 --- a/src/backend/utils/resowner/README +++ b/src/backend/utils/resowner/README @@ -39,8 +39,8 @@ because transactions may initiate operations that require resources (such as query parsing) when no associated Portal exists yet. -API Overview ------------- +Usage +----- The basic operations on a ResourceOwner are: @@ -54,13 +54,6 @@ The basic operations on a ResourceOwner are: * delete a ResourceOwner (including child owner objects); all resources must have been released beforehand -This API directly supports the resource types listed in the definition of -ResourceOwnerData struct in src/backend/utils/resowner/resowner.c. -Other objects can be associated with a ResourceOwner by recording the address -of the owning ResourceOwner in such an object. There is an API for other -modules to get control during ResourceOwner release, so that they can scan -their own data structures to find the objects that need to be deleted. - Locks are handled specially because in non-error situations a lock should be held until end of transaction, even if it was originally taken by a subtransaction or portal. Therefore, the "release" operation on a child @@ -79,3 +72,106 @@ CurrentResourceOwner must point to the same resource owner that was current when the buffer, lock, or cache reference was acquired. It would be possible to relax this restriction given additional bookkeeping effort, but at present there seems no need. + +Adding a new resource type +-------------------------- + +ResourceOwner can track ownership of many different kinds of resources. In +core PostgreSQL it is used for buffer pins, lmgr locks, and catalog cache +references, to name a few examples. + +To add a new kind of resource, define a ResourceOwnerDesc to describe it. +For example: + +static const ResourceOwnerDesc myresource_desc = { + .name = "My fancy resource", + .release_phase = RESOURCE_RELEASE_AFTER_LOCKS, + .release_priority = RELEASE_PRIO_FIRST, + .ReleaseResource = ReleaseMyResource, + .DebugPrint = PrintMyResource +}; + +ResourceOwnerRemember() and ResourceOwnerForget() functions take a pointer +to that struct, along with a Datum to represent the resource. The meaning +of the Datum depends on the resource type. Most resource types use it to +store a pointer to some struct, but it can also be a file descriptor or +library handle, for example. + +The ReleaseResource callback is called when a resource owner is released or +deleted. It should release any resources (e.g. close files, free memory) +associated with the resource. Because the callback is called during +transaction abort, it must perform only low-level cleanup with no user +visible effects. The callback should not perform operations that could +fail, like allocate memory. + +The optional DebugPrint callback is used in the warning at transaction +commit, if any resources are leaked. If not specified, a generic +implementation that prints the resource name and the resource as a pointer +is used. + +There is another API for other modules to get control during ResourceOwner +release, so that they can scan their own data structures to find the objects +that need to be deleted. See RegisterResourceReleaseCallback function. +This used to be the only way for extensions to use the resource owner +mechanism with new kinds of objects; nowadays it is easier to define a custom +ResourceOwnerDesc struct. + + +Releasing +--------- + +Releasing the resources of a ResourceOwner happens in three phases: + +1. "Before-locks" resources + +2. Locks + +3. "After-locks" resources + +Each resource type specifies whether it needs to be released before or after +locks. Each resource type also has a priority, which determines the order +that the resources are released in. Note that the phases are performed fully +for the whole tree of resource owners, before moving to the next phase, but +the priority within each phase only determines the order within that +ResourceOwner. Child resource owners are always handled before the parent, +within each phase. + +For example, imagine that you have two ResourceOwners, parent and child, +as follows: + +Parent + parent resource BEFORE_LOCKS priority 1 + parent resource BEFORE_LOCKS priority 2 + parent resource AFTER_LOCKS priority 10001 + parent resource AFTER_LOCKS priority 10002 + Child + child resource BEFORE_LOCKS priority 1 + child resource BEFORE_LOCKS priority 2 + child resource AFTER_LOCKS priority 10001 + child resource AFTER_LOCKS priority 10002 + +These resources would be released in the following order: + +child resource BEFORE_LOCKS priority 1 +child resource BEFORE_LOCKS priority 2 +parent resource BEFORE_LOCKS priority 1 +parent resource BEFORE_LOCKS priority 2 +(locks) +child resource AFTER_LOCKS priority 10001 +child resource AFTER_LOCKS priority 10002 +parent resource AFTER_LOCKS priority 10001 +parent resource AFTER_LOCKS priority 10002 + +To release all the resources, you need to call ResourceOwnerRelease() three +times, once for each phase. You may perform additional tasks between the +phases, but after the first call to ResourceOwnerRelease(), you cannot use +the ResourceOwner to remember any more resources. You also cannot call +ResourceOwnerForget on the resource owner to release any previously +remembered resources "in retail", after you have started the release process. + +Normally, you are expected to call ResourceOwnerForget on every resource so +that at commit, the ResourceOwner is empty (locks are an exception). If there +are any resources still held at commit, ResourceOwnerRelease will print a +WARNING on each such resource. At abort, however, we truly rely on the +ResourceOwner mechanism and it is normal that there are resources to be +released. diff --git a/src/backend/utils/resowner/meson.build b/src/backend/utils/resowner/meson.build index 1957565f64719..6eda7044adc8a 100644 --- a/src/backend/utils/resowner/meson.build +++ b/src/backend/utils/resowner/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'resowner.c' diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c index f926f1faad388..505534ee8d336 100644 --- a/src/backend/utils/resowner/resowner.c +++ b/src/backend/utils/resowner/resowner.c @@ -6,10 +6,35 @@ * Query-lifespan resources are tracked by associating them with * ResourceOwner objects. This provides a simple mechanism for ensuring * that such resources are freed at the right time. - * See utils/resowner/README for more info. + * See utils/resowner/README for more info on how to use it. * + * The implementation consists of a small fixed-size array and a hash table. + * New entries are inserted to the fixed-size array, and when the array + * fills up, all the entries are moved to the hash table. This way, the + * array always contains a few most recently remembered references. To find + * a particular reference, you need to search both the array and the hash + * table. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * The most frequent usage is that a resource is remembered, and forgotten + * shortly thereafter. For example, pin a buffer, read one tuple from it, + * release the pin. Linearly scanning the small array handles that case + * efficiently. However, some resources are held for a longer time, and + * sometimes a lot of resources need to be held simultaneously. The hash + * table handles those cases. + * + * When it's time to release the resources, we sort them according to the + * release-priority of each resource, and release them in that order. + * + * Local lock references are special, they are not stored in the array or + * the hash table. Instead, each resource owner has a separate small cache + * of locks it owns. The lock manager has the same information in its local + * lock hash table, and we fall back on that if the cache overflows, but + * traversing the hash table is slower when there are a lot of locks + * belonging to other resource owners. This is to speed up bulk releasing + * or reassigning locks from a resource owner to its parent. + * + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -20,85 +45,55 @@ */ #include "postgres.h" -#include "common/cryptohash.h" #include "common/hashfn.h" -#include "common/hmac.h" -#include "jit/jit.h" -#include "storage/bufmgr.h" +#include "common/int.h" #include "storage/ipc.h" #include "storage/predicate.h" #include "storage/proc.h" #include "utils/memutils.h" -#include "utils/rel.h" -#include "utils/resowner_private.h" -#include "utils/snapmgr.h" - - -/* - * All resource IDs managed by this code are required to fit into a Datum, - * which is fine since they are generally pointers or integers. - * - * Provide Datum conversion macros for a couple of things that are really - * just "int". - */ -#define FileGetDatum(file) Int32GetDatum(file) -#define DatumGetFile(datum) ((File) DatumGetInt32(datum)) -#define BufferGetDatum(buffer) Int32GetDatum(buffer) -#define DatumGetBuffer(datum) ((Buffer) DatumGetInt32(datum)) +#include "utils/resowner.h" /* - * ResourceArray is a common structure for storing all types of resource IDs. - * - * We manage small sets of resource IDs by keeping them in a simple array: - * itemsarr[k] holds an ID, for 0 <= k < nitems <= maxitems = capacity. - * - * If a set grows large, we switch over to using open-addressing hashing. - * Then, itemsarr[] is a hash table of "capacity" slots, with each - * slot holding either an ID or "invalidval". nitems is the number of valid - * items present; if it would exceed maxitems, we enlarge the array and - * re-hash. In this mode, maxitems should be rather less than capacity so - * that we don't waste too much time searching for empty slots. + * ResourceElem represents a reference associated with a resource owner. * - * In either mode, lastidx remembers the location of the last item inserted - * or returned by GetAny; this speeds up searches in ResourceArrayRemove. + * All objects managed by this code are required to fit into a Datum, + * which is fine since they are generally pointers or integers. */ -typedef struct ResourceArray +typedef struct ResourceElem { - Datum *itemsarr; /* buffer for storing values */ - Datum invalidval; /* value that is considered invalid */ - uint32 capacity; /* allocated length of itemsarr[] */ - uint32 nitems; /* how many items are stored in items array */ - uint32 maxitems; /* current limit on nitems before enlarging */ - uint32 lastidx; /* index of last item returned by GetAny */ -} ResourceArray; + Datum item; + const ResourceOwnerDesc *kind; /* NULL indicates a free hash table slot */ +} ResourceElem; /* - * Initially allocated size of a ResourceArray. Must be power of two since - * we'll use (arraysize - 1) as mask for hashing. + * Size of the fixed-size array to hold most-recently remembered resources. */ -#define RESARRAY_INIT_SIZE 16 +#define RESOWNER_ARRAY_SIZE 32 /* - * When to switch to hashing vs. simple array logic in a ResourceArray. + * Initially allocated size of a ResourceOwner's hash table. Must be power of + * two because we use (capacity - 1) as mask for hashing. */ -#define RESARRAY_MAX_ARRAY 64 -#define RESARRAY_IS_ARRAY(resarr) ((resarr)->capacity <= RESARRAY_MAX_ARRAY) +#define RESOWNER_HASH_INIT_SIZE 64 /* - * How many items may be stored in a resource array of given capacity. - * When this number is reached, we must resize. + * How many items may be stored in a hash table of given capacity. When this + * number is reached, we must resize. + * + * The hash table must always have enough free space that we can copy the + * entries from the array to it, in ResourceOwnerSort. We also insist that + * the initial size is large enough that we don't hit the max size immediately + * when it's created. Aside from those limitations, 0.75 is a reasonable fill + * factor. */ -#define RESARRAY_MAX_ITEMS(capacity) \ - ((capacity) <= RESARRAY_MAX_ARRAY ? (capacity) : (capacity)/4 * 3) +#define RESOWNER_HASH_MAX_ITEMS(capacity) \ + Min(capacity - RESOWNER_ARRAY_SIZE, (capacity)/4 * 3) + +StaticAssertDecl(RESOWNER_HASH_MAX_ITEMS(RESOWNER_HASH_INIT_SIZE) >= RESOWNER_ARRAY_SIZE, + "initial hash size too small compared to array size"); /* - * To speed up bulk releasing or reassigning locks from a resource owner to - * its parent, each resource owner has a small cache of locks it owns. The - * lock manager has the same information in its local lock hash table, and - * we fall back on that if cache overflows, but traversing the hash table - * is slower when there are a lot of locks belonging to other resource owners. - * - * MAX_RESOWNER_LOCKS is the size of the per-resource owner cache. It's + * MAX_RESOWNER_LOCKS is the size of the per-resource owner locks cache. It's * chosen based on some testing with pg_dump with a large schema. When the * tests were done (on 9.2), resource owners in a pg_dump run contained up * to 9 locks, regardless of the schema size, except for the top resource @@ -112,32 +107,55 @@ typedef struct ResourceArray /* * ResourceOwner objects look like this */ -typedef struct ResourceOwnerData +struct ResourceOwnerData { ResourceOwner parent; /* NULL if no parent (toplevel owner) */ ResourceOwner firstchild; /* head of linked list of children */ ResourceOwner nextchild; /* next child of same parent */ const char *name; /* name (just for debugging) */ - /* We have built-in support for remembering: */ - ResourceArray bufferarr; /* owned buffers */ - ResourceArray bufferioarr; /* in-progress buffer IO */ - ResourceArray catrefarr; /* catcache references */ - ResourceArray catlistrefarr; /* catcache-list pins */ - ResourceArray relrefarr; /* relcache references */ - ResourceArray planrefarr; /* plancache references */ - ResourceArray tupdescarr; /* tupdesc references */ - ResourceArray snapshotarr; /* snapshot references */ - ResourceArray filearr; /* open temporary files */ - ResourceArray dsmarr; /* dynamic shmem segments */ - ResourceArray jitarr; /* JIT contexts */ - ResourceArray cryptohasharr; /* cryptohash contexts */ - ResourceArray hmacarr; /* HMAC contexts */ - - /* We can remember up to MAX_RESOWNER_LOCKS references to local locks. */ - int nlocks; /* number of owned locks */ + /* + * When ResourceOwnerRelease is called, we sort the 'hash' and 'arr' by + * the release priority. After that, no new resources can be remembered + * or forgotten in retail. We have separate flags because + * ResourceOwnerReleaseAllOfKind() temporarily sets 'releasing' without + * sorting the arrays. + */ + bool releasing; + bool sorted; /* are 'hash' and 'arr' sorted by priority? */ + + /* + * Number of items in the locks cache, array, and hash table respectively. + * (These are packed together to avoid padding in the struct.) + */ + uint8 nlocks; /* number of owned locks */ + uint8 narr; /* how many items are stored in the array */ + uint32 nhash; /* how many items are stored in the hash */ + + /* + * The fixed-size array for recent resources. + * + * If 'sorted' is set, the contents are sorted by release priority. + */ + ResourceElem arr[RESOWNER_ARRAY_SIZE]; + + /* + * The hash table. Uses open-addressing. 'nhash' is the number of items + * present; if it would exceed 'grow_at', we enlarge it and re-hash. + * 'grow_at' should be rather less than 'capacity' so that we don't waste + * too much time searching for empty slots. + * + * If 'sorted' is set, the contents are no longer hashed, but sorted by + * release priority. The first 'nhash' elements are occupied, the rest + * are empty. + */ + ResourceElem *hash; + uint32 capacity; /* allocated length of hash[] */ + uint32 grow_at; /* grow hash when reach this */ + + /* The local locks cache. */ LOCALLOCK *locks[MAX_RESOWNER_LOCKS]; /* list of owned locks */ -} ResourceOwnerData; +}; /***************************************************************************** @@ -149,6 +167,13 @@ ResourceOwner CurTransactionResourceOwner = NULL; ResourceOwner TopTransactionResourceOwner = NULL; ResourceOwner AuxProcessResourceOwner = NULL; +/* #define RESOWNER_STATS */ + +#ifdef RESOWNER_STATS +static int narray_lookups = 0; +static int nhash_lookups = 0; +#endif + /* * List of add-on callbacks for resource releasing */ @@ -163,253 +188,212 @@ static ResourceReleaseCallbackItem *ResourceRelease_callbacks = NULL; /* Internal routines */ -static void ResourceArrayInit(ResourceArray *resarr, Datum invalidval); -static void ResourceArrayEnlarge(ResourceArray *resarr); -static void ResourceArrayAdd(ResourceArray *resarr, Datum value); -static bool ResourceArrayRemove(ResourceArray *resarr, Datum value); -static bool ResourceArrayGetAny(ResourceArray *resarr, Datum *value); -static void ResourceArrayFree(ResourceArray *resarr); +static inline uint32 hash_resource_elem(Datum value, const ResourceOwnerDesc *kind); +static void ResourceOwnerAddToHash(ResourceOwner owner, Datum value, + const ResourceOwnerDesc *kind); +static int resource_priority_cmp(const void *a, const void *b); +static void ResourceOwnerSort(ResourceOwner owner); +static void ResourceOwnerReleaseAll(ResourceOwner owner, + ResourceReleasePhase phase, + bool printLeakWarnings); static void ResourceOwnerReleaseInternal(ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel); static void ReleaseAuxProcessResourcesCallback(int code, Datum arg); -static void PrintRelCacheLeakWarning(Relation rel); -static void PrintPlanCacheLeakWarning(CachedPlan *plan); -static void PrintTupleDescLeakWarning(TupleDesc tupdesc); -static void PrintSnapshotLeakWarning(Snapshot snapshot); -static void PrintFileLeakWarning(File file); -static void PrintDSMLeakWarning(dsm_segment *seg); -static void PrintCryptoHashLeakWarning(Datum handle); -static void PrintHMACLeakWarning(Datum handle); /***************************************************************************** * INTERNAL ROUTINES * *****************************************************************************/ - /* - * Initialize a ResourceArray + * Hash function for value+kind combination. */ -static void -ResourceArrayInit(ResourceArray *resarr, Datum invalidval) +static inline uint32 +hash_resource_elem(Datum value, const ResourceOwnerDesc *kind) { - /* Assert it's empty */ - Assert(resarr->itemsarr == NULL); - Assert(resarr->capacity == 0); - Assert(resarr->nitems == 0); - Assert(resarr->maxitems == 0); - /* Remember the appropriate "invalid" value */ - resarr->invalidval = invalidval; - /* We don't allocate any storage until needed */ + /* + * Most resource kinds store a pointer in 'value', and pointers are unique + * all on their own. But some resources store plain integers (Files and + * Buffers as of this writing), so we want to incorporate the 'kind' in + * the hash too, otherwise those resources will collide a lot. But + * because there are only a few resource kinds like that - and only a few + * resource kinds to begin with - we don't need to work too hard to mix + * 'kind' into the hash. Just add it with hash_combine(), it perturbs the + * result enough for our purposes. + */ +#if SIZEOF_DATUM == 8 + return hash_combine64(murmurhash64((uint64) value), (uint64) kind); +#else + return hash_combine(murmurhash32((uint32) value), (uint32) kind); +#endif } /* - * Make sure there is room for at least one more resource in an array. - * - * This is separate from actually inserting a resource because if we run out - * of memory, it's critical to do so *before* acquiring the resource. + * Adds 'value' of given 'kind' to the ResourceOwner's hash table */ static void -ResourceArrayEnlarge(ResourceArray *resarr) +ResourceOwnerAddToHash(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind) { - uint32 i, - oldcap, - newcap; - Datum *olditemsarr; - Datum *newitemsarr; - - if (resarr->nitems < resarr->maxitems) - return; /* no work needed */ - - olditemsarr = resarr->itemsarr; - oldcap = resarr->capacity; - - /* Double the capacity of the array (capacity must stay a power of 2!) */ - newcap = (oldcap > 0) ? oldcap * 2 : RESARRAY_INIT_SIZE; - newitemsarr = (Datum *) MemoryContextAlloc(TopMemoryContext, - newcap * sizeof(Datum)); - for (i = 0; i < newcap; i++) - newitemsarr[i] = resarr->invalidval; + uint32 mask = owner->capacity - 1; + uint32 idx; - /* We assume we can't fail below this point, so OK to scribble on resarr */ - resarr->itemsarr = newitemsarr; - resarr->capacity = newcap; - resarr->maxitems = RESARRAY_MAX_ITEMS(newcap); - resarr->nitems = 0; + Assert(kind != NULL); - if (olditemsarr != NULL) + /* Insert into first free slot at or after hash location. */ + idx = hash_resource_elem(value, kind) & mask; + for (;;) { - /* - * Transfer any pre-existing entries into the new array; they don't - * necessarily go where they were before, so this simple logic is the - * best way. Note that if we were managing the set as a simple array, - * the entries after nitems are garbage, but that shouldn't matter - * because we won't get here unless nitems was equal to oldcap. - */ - for (i = 0; i < oldcap; i++) - { - if (olditemsarr[i] != resarr->invalidval) - ResourceArrayAdd(resarr, olditemsarr[i]); - } - - /* And release old array. */ - pfree(olditemsarr); + if (owner->hash[idx].kind == NULL) + break; /* found a free slot */ + idx = (idx + 1) & mask; } - - Assert(resarr->nitems < resarr->maxitems); + owner->hash[idx].item = value; + owner->hash[idx].kind = kind; + owner->nhash++; } /* - * Add a resource to ResourceArray - * - * Caller must have previously done ResourceArrayEnlarge() + * Comparison function to sort by release phase and priority */ -static void -ResourceArrayAdd(ResourceArray *resarr, Datum value) +static int +resource_priority_cmp(const void *a, const void *b) { - uint32 idx; + const ResourceElem *ra = (const ResourceElem *) a; + const ResourceElem *rb = (const ResourceElem *) b; - Assert(value != resarr->invalidval); - Assert(resarr->nitems < resarr->maxitems); - - if (RESARRAY_IS_ARRAY(resarr)) - { - /* Append to linear array. */ - idx = resarr->nitems; - } + /* Note: reverse order */ + if (ra->kind->release_phase == rb->kind->release_phase) + return pg_cmp_u32(rb->kind->release_priority, ra->kind->release_priority); + else if (ra->kind->release_phase > rb->kind->release_phase) + return -1; else - { - /* Insert into first free slot at or after hash location. */ - uint32 mask = resarr->capacity - 1; - - idx = DatumGetUInt32(hash_any((void *) &value, sizeof(value))) & mask; - for (;;) - { - if (resarr->itemsarr[idx] == resarr->invalidval) - break; - idx = (idx + 1) & mask; - } - } - resarr->lastidx = idx; - resarr->itemsarr[idx] = value; - resarr->nitems++; + return 1; } /* - * Remove a resource from ResourceArray - * - * Returns true on success, false if resource was not found. + * Sort resources in reverse release priority. * - * Note: if same resource ID appears more than once, one instance is removed. + * If the hash table is in use, all the elements from the fixed-size array are + * moved to the hash table, and then the hash table is sorted. If there is no + * hash table, then the fixed-size array is sorted directly. In either case, + * the result is one sorted array that contains all the resources. */ -static bool -ResourceArrayRemove(ResourceArray *resarr, Datum value) +static void +ResourceOwnerSort(ResourceOwner owner) { - uint32 i, - idx, - lastidx = resarr->lastidx; - - Assert(value != resarr->invalidval); + ResourceElem *items; + uint32 nitems; - /* Search through all items, but try lastidx first. */ - if (RESARRAY_IS_ARRAY(resarr)) + if (owner->nhash == 0) { - if (lastidx < resarr->nitems && - resarr->itemsarr[lastidx] == value) - { - resarr->itemsarr[lastidx] = resarr->itemsarr[resarr->nitems - 1]; - resarr->nitems--; - /* Update lastidx to make reverse-order removals fast. */ - resarr->lastidx = resarr->nitems - 1; - return true; - } - for (i = 0; i < resarr->nitems; i++) - { - if (resarr->itemsarr[i] == value) - { - resarr->itemsarr[i] = resarr->itemsarr[resarr->nitems - 1]; - resarr->nitems--; - /* Update lastidx to make reverse-order removals fast. */ - resarr->lastidx = resarr->nitems - 1; - return true; - } - } + items = owner->arr; + nitems = owner->narr; } else { - uint32 mask = resarr->capacity - 1; + /* + * Compact the hash table, so that all the elements are in the + * beginning of the 'hash' array, with no empty elements. + */ + uint32 dst = 0; - if (lastidx < resarr->capacity && - resarr->itemsarr[lastidx] == value) + for (int idx = 0; idx < owner->capacity; idx++) { - resarr->itemsarr[lastidx] = resarr->invalidval; - resarr->nitems--; - return true; - } - idx = DatumGetUInt32(hash_any((void *) &value, sizeof(value))) & mask; - for (i = 0; i < resarr->capacity; i++) - { - if (resarr->itemsarr[idx] == value) + if (owner->hash[idx].kind != NULL) { - resarr->itemsarr[idx] = resarr->invalidval; - resarr->nitems--; - return true; + if (dst != idx) + owner->hash[dst] = owner->hash[idx]; + dst++; } - idx = (idx + 1) & mask; } + + /* + * Move all entries from the fixed-size array to 'hash'. + * + * RESOWNER_HASH_MAX_ITEMS is defined so that there is always enough + * free space to move all the elements from the fixed-size array to + * the hash. + */ + Assert(dst + owner->narr <= owner->capacity); + for (int idx = 0; idx < owner->narr; idx++) + { + owner->hash[dst] = owner->arr[idx]; + dst++; + } + Assert(dst == owner->nhash + owner->narr); + owner->narr = 0; + owner->nhash = dst; + + items = owner->hash; + nitems = owner->nhash; } - return false; + qsort(items, nitems, sizeof(ResourceElem), resource_priority_cmp); } /* - * Get any convenient entry in a ResourceArray. - * - * "Convenient" is defined as "easy for ResourceArrayRemove to remove"; - * we help that along by setting lastidx to match. This avoids O(N^2) cost - * when removing all ResourceArray items during ResourceOwner destruction. - * - * Returns true if we found an element, or false if the array is empty. + * Call the ReleaseResource callback on entries with given 'phase'. */ -static bool -ResourceArrayGetAny(ResourceArray *resarr, Datum *value) +static void +ResourceOwnerReleaseAll(ResourceOwner owner, ResourceReleasePhase phase, + bool printLeakWarnings) { - if (resarr->nitems == 0) - return false; + ResourceElem *items; + uint32 nitems; - if (RESARRAY_IS_ARRAY(resarr)) + /* + * ResourceOwnerSort must've been called already. All the resources are + * either in the array or the hash. + */ + Assert(owner->releasing); + Assert(owner->sorted); + if (owner->nhash == 0) { - /* Linear array: just return the first element. */ - resarr->lastidx = 0; + items = owner->arr; + nitems = owner->narr; } else { - /* Hash: search forward from wherever we were last. */ - uint32 mask = resarr->capacity - 1; + Assert(owner->narr == 0); + items = owner->hash; + nitems = owner->nhash; + } + + /* + * The resources are sorted in reverse priority order. Release them + * starting from the end, until we hit the end of the phase that we are + * releasing now. We will continue from there when called again for the + * next phase. + */ + while (nitems > 0) + { + uint32 idx = nitems - 1; + Datum value = items[idx].item; + const ResourceOwnerDesc *kind = items[idx].kind; - for (;;) + if (kind->release_phase > phase) + break; + Assert(kind->release_phase == phase); + + if (printLeakWarnings) { - resarr->lastidx &= mask; - if (resarr->itemsarr[resarr->lastidx] != resarr->invalidval) - break; - resarr->lastidx++; + char *res_str; + + res_str = kind->DebugPrint ? + kind->DebugPrint(value) + : psprintf("%s %p", kind->name, DatumGetPointer(value)); + elog(WARNING, "resource was not closed: %s", res_str); + pfree(res_str); } + kind->ReleaseResource(value); + nitems--; } - - *value = resarr->itemsarr[resarr->lastidx]; - return true; -} - -/* - * Trash a ResourceArray (we don't care about its state after this) - */ -static void -ResourceArrayFree(ResourceArray *resarr) -{ - if (resarr->itemsarr) - pfree(resarr->itemsarr); + if (owner->nhash == 0) + owner->narr = nitems; + else + owner->nhash = nitems; } @@ -431,7 +415,7 @@ ResourceOwnerCreate(ResourceOwner parent, const char *name) ResourceOwner owner; owner = (ResourceOwner) MemoryContextAllocZero(TopMemoryContext, - sizeof(ResourceOwnerData)); + sizeof(struct ResourceOwnerData)); owner->name = name; if (parent) @@ -441,23 +425,193 @@ ResourceOwnerCreate(ResourceOwner parent, const char *name) parent->firstchild = owner; } - ResourceArrayInit(&(owner->bufferarr), BufferGetDatum(InvalidBuffer)); - ResourceArrayInit(&(owner->bufferioarr), BufferGetDatum(InvalidBuffer)); - ResourceArrayInit(&(owner->catrefarr), PointerGetDatum(NULL)); - ResourceArrayInit(&(owner->catlistrefarr), PointerGetDatum(NULL)); - ResourceArrayInit(&(owner->relrefarr), PointerGetDatum(NULL)); - ResourceArrayInit(&(owner->planrefarr), PointerGetDatum(NULL)); - ResourceArrayInit(&(owner->tupdescarr), PointerGetDatum(NULL)); - ResourceArrayInit(&(owner->snapshotarr), PointerGetDatum(NULL)); - ResourceArrayInit(&(owner->filearr), FileGetDatum(-1)); - ResourceArrayInit(&(owner->dsmarr), PointerGetDatum(NULL)); - ResourceArrayInit(&(owner->jitarr), PointerGetDatum(NULL)); - ResourceArrayInit(&(owner->cryptohasharr), PointerGetDatum(NULL)); - ResourceArrayInit(&(owner->hmacarr), PointerGetDatum(NULL)); - return owner; } +/* + * Make sure there is room for at least one more resource in an array. + * + * This is separate from actually inserting a resource because if we run out + * of memory, it's critical to do so *before* acquiring the resource. + * + * NB: Make sure there are no unrelated ResourceOwnerRemember() calls between + * your ResourceOwnerEnlarge() call and the ResourceOwnerRemember() call that + * you reserved the space for! + */ +void +ResourceOwnerEnlarge(ResourceOwner owner) +{ + /* + * Mustn't try to remember more resources after we have already started + * releasing + */ + if (owner->releasing) + elog(ERROR, "ResourceOwnerEnlarge called after release started"); + + if (owner->narr < RESOWNER_ARRAY_SIZE) + return; /* no work needed */ + + /* + * Is there space in the hash? If not, enlarge it. + */ + if (owner->narr + owner->nhash >= owner->grow_at) + { + uint32 i, + oldcap, + newcap; + ResourceElem *oldhash; + ResourceElem *newhash; + + oldhash = owner->hash; + oldcap = owner->capacity; + + /* Double the capacity (it must stay a power of 2!) */ + newcap = (oldcap > 0) ? oldcap * 2 : RESOWNER_HASH_INIT_SIZE; + newhash = (ResourceElem *) MemoryContextAllocZero(TopMemoryContext, + newcap * sizeof(ResourceElem)); + + /* + * We assume we can't fail below this point, so OK to scribble on the + * owner + */ + owner->hash = newhash; + owner->capacity = newcap; + owner->grow_at = RESOWNER_HASH_MAX_ITEMS(newcap); + owner->nhash = 0; + + if (oldhash != NULL) + { + /* + * Transfer any pre-existing entries into the new hash table; they + * don't necessarily go where they were before, so this simple + * logic is the best way. + */ + for (i = 0; i < oldcap; i++) + { + if (oldhash[i].kind != NULL) + ResourceOwnerAddToHash(owner, oldhash[i].item, oldhash[i].kind); + } + + /* And release old hash table. */ + pfree(oldhash); + } + } + + /* Move items from the array to the hash */ + for (int i = 0; i < owner->narr; i++) + ResourceOwnerAddToHash(owner, owner->arr[i].item, owner->arr[i].kind); + owner->narr = 0; + + Assert(owner->nhash <= owner->grow_at); +} + +/* + * Remember that an object is owned by a ResourceOwner + * + * Caller must have previously done ResourceOwnerEnlarge() + */ +void +ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind) +{ + uint32 idx; + + /* sanity check the ResourceOwnerDesc */ + Assert(kind->release_phase != 0); + Assert(kind->release_priority != 0); + + /* + * Mustn't try to remember more resources after we have already started + * releasing. We already checked this in ResourceOwnerEnlarge. + */ + Assert(!owner->releasing); + Assert(!owner->sorted); + + if (owner->narr >= RESOWNER_ARRAY_SIZE) + { + /* forgot to call ResourceOwnerEnlarge? */ + elog(ERROR, "ResourceOwnerRemember called but array was full"); + } + + /* Append to the array. */ + idx = owner->narr; + owner->arr[idx].item = value; + owner->arr[idx].kind = kind; + owner->narr++; +} + +/* + * Forget that an object is owned by a ResourceOwner + * + * Note: If same resource ID is associated with the ResourceOwner more than + * once, one instance is removed. + * + * Note: Forgetting a resource does not guarantee that there is room to + * remember a new resource. One exception is when you forget the most + * recently remembered resource; that does make room for a new remember call. + * Some code callers rely on that exception. + */ +void +ResourceOwnerForget(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind) +{ + /* + * Mustn't call this after we have already started releasing resources. + * (Release callback functions are not allowed to release additional + * resources.) + */ + if (owner->releasing) + elog(ERROR, "ResourceOwnerForget called for %s after release started", kind->name); + Assert(!owner->sorted); + + /* Search through all items in the array first. */ + for (int i = owner->narr - 1; i >= 0; i--) + { + if (owner->arr[i].item == value && + owner->arr[i].kind == kind) + { + owner->arr[i] = owner->arr[owner->narr - 1]; + owner->narr--; + +#ifdef RESOWNER_STATS + narray_lookups++; +#endif + return; + } + } + + /* Search hash */ + if (owner->nhash > 0) + { + uint32 mask = owner->capacity - 1; + uint32 idx; + + idx = hash_resource_elem(value, kind) & mask; + for (uint32 i = 0; i < owner->capacity; i++) + { + if (owner->hash[idx].item == value && + owner->hash[idx].kind == kind) + { + owner->hash[idx].item = (Datum) 0; + owner->hash[idx].kind = NULL; + owner->nhash--; + +#ifdef RESOWNER_STATS + nhash_lookups++; +#endif + return; + } + idx = (idx + 1) & mask; + } + } + + /* + * Use %p to print the reference, since most objects tracked by a resource + * owner are pointers. It's a bit misleading if it's not a pointer, but + * this is a programmer error, anyway. + */ + elog(ERROR, "%s %p is not owned by resource owner %s", + kind->name, DatumGetPointer(value), owner->name); +} + /* * ResourceOwnerRelease * Release all resources owned by a ResourceOwner and its descendants, @@ -483,6 +637,12 @@ ResourceOwnerCreate(ResourceOwner parent, const char *name) * isTopLevel is passed when we are releasing TopTransactionResourceOwner * at completion of a main transaction. This generally means that *all* * resources will be released, and so we can optimize things a bit. + * + * NOTE: After starting the release process, by calling this function, no new + * resources can be remembered in the resource owner. You also cannot call + * ResourceOwnerForget on any previously remembered resources to release + * resources "in retail" after that, you must let the bulk release take care + * of them. */ void ResourceOwnerRelease(ResourceOwner owner, @@ -492,6 +652,16 @@ ResourceOwnerRelease(ResourceOwner owner, { /* There's not currently any setup needed before recursing */ ResourceOwnerReleaseInternal(owner, phase, isCommit, isTopLevel); + +#ifdef RESOWNER_STATS + if (isTopLevel) + { + elog(LOG, "RESOWNER STATS: lookups: array %d, hash %d", + narray_lookups, nhash_lookups); + narray_lookups = 0; + nhash_lookups = 0; + } +#endif } static void @@ -504,105 +674,57 @@ ResourceOwnerReleaseInternal(ResourceOwner owner, ResourceOwner save; ResourceReleaseCallbackItem *item; ResourceReleaseCallbackItem *next; - Datum foundres; /* Recurse to handle descendants */ for (child = owner->firstchild; child != NULL; child = child->nextchild) ResourceOwnerReleaseInternal(child, phase, isCommit, isTopLevel); /* - * Make CurrentResourceOwner point to me, so that ReleaseBuffer etc don't - * get confused. + * To release the resources in the right order, sort them by phase and + * priority. + * + * The ReleaseResource callback functions are not allowed to remember or + * forget any other resources after this. Otherwise we lose track of where + * we are in processing the hash/array. */ - save = CurrentResourceOwner; - CurrentResourceOwner = owner; - - if (phase == RESOURCE_RELEASE_BEFORE_LOCKS) + if (!owner->releasing) + { + Assert(phase == RESOURCE_RELEASE_BEFORE_LOCKS); + Assert(!owner->sorted); + owner->releasing = true; + } + else { /* - * Abort failed buffer IO. AbortBufferIO()->TerminateBufferIO() calls - * ResourceOwnerForgetBufferIO(), so we just have to iterate till - * there are none. - * - * Needs to be before we release buffer pins. - * - * During a commit, there shouldn't be any in-progress IO. + * Phase is normally > RESOURCE_RELEASE_BEFORE_LOCKS, if this is not + * the first call to ResourceOwnerRelease. But if an error happens + * between the release phases, we might get called again for the same + * ResourceOwner from AbortTransaction. */ - while (ResourceArrayGetAny(&(owner->bufferioarr), &foundres)) - { - Buffer res = DatumGetBuffer(foundres); + } + if (!owner->sorted) + { + ResourceOwnerSort(owner); + owner->sorted = true; + } - if (isCommit) - elog(PANIC, "lost track of buffer IO on buffer %d", res); - AbortBufferIO(res); - } + /* + * Make CurrentResourceOwner point to me, so that the release callback + * functions know which resource owner is been released. + */ + save = CurrentResourceOwner; + CurrentResourceOwner = owner; + if (phase == RESOURCE_RELEASE_BEFORE_LOCKS) + { /* - * Release buffer pins. Note that ReleaseBuffer will remove the - * buffer entry from our array, so we just have to iterate till there - * are none. + * Release all resources that need to be released before the locks. * - * During a commit, there shouldn't be any remaining pins --- that - * would indicate failure to clean up the executor correctly --- so - * issue warnings. In the abort case, just clean up quietly. + * During a commit, there shouldn't be any remaining resources --- + * that would indicate failure to clean up the executor correctly --- + * so issue warnings. In the abort case, just clean up quietly. */ - while (ResourceArrayGetAny(&(owner->bufferarr), &foundres)) - { - Buffer res = DatumGetBuffer(foundres); - - if (isCommit) - PrintBufferLeakWarning(res); - ReleaseBuffer(res); - } - - /* Ditto for relcache references */ - while (ResourceArrayGetAny(&(owner->relrefarr), &foundres)) - { - Relation res = (Relation) DatumGetPointer(foundres); - - if (isCommit) - PrintRelCacheLeakWarning(res); - RelationClose(res); - } - - /* Ditto for dynamic shared memory segments */ - while (ResourceArrayGetAny(&(owner->dsmarr), &foundres)) - { - dsm_segment *res = (dsm_segment *) DatumGetPointer(foundres); - - if (isCommit) - PrintDSMLeakWarning(res); - dsm_detach(res); - } - - /* Ditto for JIT contexts */ - while (ResourceArrayGetAny(&(owner->jitarr), &foundres)) - { - JitContext *context = (JitContext *) DatumGetPointer(foundres); - - jit_release_context(context); - } - - /* Ditto for cryptohash contexts */ - while (ResourceArrayGetAny(&(owner->cryptohasharr), &foundres)) - { - pg_cryptohash_ctx *context = - (pg_cryptohash_ctx *) DatumGetPointer(foundres); - - if (isCommit) - PrintCryptoHashLeakWarning(foundres); - pg_cryptohash_free(context); - } - - /* Ditto for HMAC contexts */ - while (ResourceArrayGetAny(&(owner->hmacarr), &foundres)) - { - pg_hmac_ctx *context = (pg_hmac_ctx *) DatumGetPointer(foundres); - - if (isCommit) - PrintHMACLeakWarning(foundres); - pg_hmac_free(context); - } + ResourceOwnerReleaseAll(owner, phase, isCommit); } else if (phase == RESOURCE_RELEASE_LOCKS) { @@ -655,101 +777,71 @@ ResourceOwnerReleaseInternal(ResourceOwner owner, else if (phase == RESOURCE_RELEASE_AFTER_LOCKS) { /* - * Release catcache references. Note that ReleaseCatCache will remove - * the catref entry from our array, so we just have to iterate till - * there are none. - * - * As with buffer pins, warn if any are left at commit time. + * Release all resources that need to be released after the locks. */ - while (ResourceArrayGetAny(&(owner->catrefarr), &foundres)) - { - HeapTuple res = (HeapTuple) DatumGetPointer(foundres); - - if (isCommit) - PrintCatCacheLeakWarning(res); - ReleaseCatCache(res); - } + ResourceOwnerReleaseAll(owner, phase, isCommit); + } - /* Ditto for catcache lists */ - while (ResourceArrayGetAny(&(owner->catlistrefarr), &foundres)) - { - CatCList *res = (CatCList *) DatumGetPointer(foundres); + /* Let add-on modules get a chance too */ + for (item = ResourceRelease_callbacks; item; item = next) + { + /* allow callbacks to unregister themselves when called */ + next = item->next; + item->callback(phase, isCommit, isTopLevel, item->arg); + } - if (isCommit) - PrintCatCacheListLeakWarning(res); - ReleaseCatCacheList(res); - } + CurrentResourceOwner = save; +} - /* Ditto for plancache references */ - while (ResourceArrayGetAny(&(owner->planrefarr), &foundres)) - { - CachedPlan *res = (CachedPlan *) DatumGetPointer(foundres); - - if (isCommit) - PrintPlanCacheLeakWarning(res); - ReleaseCachedPlan(res, owner); - } - - /* Ditto for tupdesc references */ - while (ResourceArrayGetAny(&(owner->tupdescarr), &foundres)) - { - TupleDesc res = (TupleDesc) DatumGetPointer(foundres); +/* + * ResourceOwnerReleaseAllOfKind + * Release all resources of a certain type held by this owner. + */ +void +ResourceOwnerReleaseAllOfKind(ResourceOwner owner, const ResourceOwnerDesc *kind) +{ + /* Mustn't call this after we have already started releasing resources. */ + if (owner->releasing) + elog(ERROR, "ResourceOwnerForget called for %s after release started", kind->name); + Assert(!owner->sorted); - if (isCommit) - PrintTupleDescLeakWarning(res); - DecrTupleDescRefCount(res); - } + /* + * Temporarily set 'releasing', to prevent calls to ResourceOwnerRemember + * while we're scanning the owner. Enlarging the hash would cause us to + * lose track of the point we're scanning. + */ + owner->releasing = true; - /* Ditto for snapshot references */ - while (ResourceArrayGetAny(&(owner->snapshotarr), &foundres)) + /* Array first */ + for (int i = 0; i < owner->narr; i++) + { + if (owner->arr[i].kind == kind) { - Snapshot res = (Snapshot) DatumGetPointer(foundres); - - if (isCommit) - PrintSnapshotLeakWarning(res); - UnregisterSnapshot(res); - } + Datum value = owner->arr[i].item; - /* Ditto for temporary files */ - while (ResourceArrayGetAny(&(owner->filearr), &foundres)) - { - File res = DatumGetFile(foundres); + owner->arr[i] = owner->arr[owner->narr - 1]; + owner->narr--; + i--; - if (isCommit) - PrintFileLeakWarning(res); - FileClose(res); + kind->ReleaseResource(value); } } - /* Let add-on modules get a chance too */ - for (item = ResourceRelease_callbacks; item; item = next) + /* Then hash */ + for (int i = 0; i < owner->capacity; i++) { - /* allow callbacks to unregister themselves when called */ - next = item->next; - item->callback(phase, isCommit, isTopLevel, item->arg); - } - - CurrentResourceOwner = save; -} - -/* - * ResourceOwnerReleaseAllPlanCacheRefs - * Release the plancache references (only) held by this owner. - * - * We might eventually add similar functions for other resource types, - * but for now, only this is needed. - */ -void -ResourceOwnerReleaseAllPlanCacheRefs(ResourceOwner owner) -{ - Datum foundres; + if (owner->hash[i].kind == kind) + { + Datum value = owner->hash[i].item; - while (ResourceArrayGetAny(&(owner->planrefarr), &foundres)) - { - CachedPlan *res = (CachedPlan *) DatumGetPointer(foundres); + owner->hash[i].item = (Datum) 0; + owner->hash[i].kind = NULL; + owner->nhash--; - ReleaseCachedPlan(res, owner); + kind->ReleaseResource(value); + } } + owner->releasing = false; } /* @@ -765,19 +857,8 @@ ResourceOwnerDelete(ResourceOwner owner) Assert(owner != CurrentResourceOwner); /* And it better not own any resources, either */ - Assert(owner->bufferarr.nitems == 0); - Assert(owner->bufferioarr.nitems == 0); - Assert(owner->catrefarr.nitems == 0); - Assert(owner->catlistrefarr.nitems == 0); - Assert(owner->relrefarr.nitems == 0); - Assert(owner->planrefarr.nitems == 0); - Assert(owner->tupdescarr.nitems == 0); - Assert(owner->snapshotarr.nitems == 0); - Assert(owner->filearr.nitems == 0); - Assert(owner->dsmarr.nitems == 0); - Assert(owner->jitarr.nitems == 0); - Assert(owner->cryptohasharr.nitems == 0); - Assert(owner->hmacarr.nitems == 0); + Assert(owner->narr == 0); + Assert(owner->nhash == 0); Assert(owner->nlocks == 0 || owner->nlocks == MAX_RESOWNER_LOCKS + 1); /* @@ -795,20 +876,8 @@ ResourceOwnerDelete(ResourceOwner owner) ResourceOwnerNewParent(owner, NULL); /* And free the object. */ - ResourceArrayFree(&(owner->bufferarr)); - ResourceArrayFree(&(owner->bufferioarr)); - ResourceArrayFree(&(owner->catrefarr)); - ResourceArrayFree(&(owner->catlistrefarr)); - ResourceArrayFree(&(owner->relrefarr)); - ResourceArrayFree(&(owner->planrefarr)); - ResourceArrayFree(&(owner->tupdescarr)); - ResourceArrayFree(&(owner->snapshotarr)); - ResourceArrayFree(&(owner->filearr)); - ResourceArrayFree(&(owner->dsmarr)); - ResourceArrayFree(&(owner->jitarr)); - ResourceArrayFree(&(owner->cryptohasharr)); - ResourceArrayFree(&(owner->hmacarr)); - + if (owner->hash) + pfree(owner->hash); pfree(owner); } @@ -866,11 +935,10 @@ ResourceOwnerNewParent(ResourceOwner owner, /* * Register or deregister callback functions for resource cleanup * - * These functions are intended for use by dynamically loaded modules. - * For built-in modules we generally just hardwire the appropriate calls. - * - * Note that the callback occurs post-commit or post-abort, so the callback - * functions can only do noncritical cleanup. + * These functions can be used by dynamically loaded modules. These used + * to be the only way for an extension to register custom resource types + * with a resource owner, but nowadays it is easier to define a new + * ResourceOwnerDesc with custom callbacks. */ void RegisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg) @@ -946,6 +1014,9 @@ ReleaseAuxProcessResources(bool isCommit) ResourceOwnerRelease(AuxProcessResourceOwner, RESOURCE_RELEASE_AFTER_LOCKS, isCommit, true); + /* allow it to be reused */ + AuxProcessResourceOwner->releasing = false; + AuxProcessResourceOwner->sorted = false; } /* @@ -960,88 +1031,12 @@ ReleaseAuxProcessResourcesCallback(int code, Datum arg) ReleaseAuxProcessResources(isCommit); } - -/* - * Make sure there is room for at least one more entry in a ResourceOwner's - * buffer array. - * - * This is separate from actually inserting an entry because if we run out - * of memory, it's critical to do so *before* acquiring the resource. - */ -void -ResourceOwnerEnlargeBuffers(ResourceOwner owner) -{ - /* We used to allow pinning buffers without a resowner, but no more */ - Assert(owner != NULL); - ResourceArrayEnlarge(&(owner->bufferarr)); -} - -/* - * Remember that a buffer pin is owned by a ResourceOwner - * - * Caller must have previously done ResourceOwnerEnlargeBuffers() - */ -void -ResourceOwnerRememberBuffer(ResourceOwner owner, Buffer buffer) -{ - ResourceArrayAdd(&(owner->bufferarr), BufferGetDatum(buffer)); -} - -/* - * Forget that a buffer pin is owned by a ResourceOwner - */ -void -ResourceOwnerForgetBuffer(ResourceOwner owner, Buffer buffer) -{ - if (!ResourceArrayRemove(&(owner->bufferarr), BufferGetDatum(buffer))) - elog(ERROR, "buffer %d is not owned by resource owner %s", - buffer, owner->name); -} - - -/* - * Make sure there is room for at least one more entry in a ResourceOwner's - * buffer array. - * - * This is separate from actually inserting an entry because if we run out - * of memory, it's critical to do so *before* acquiring the resource. - */ -void -ResourceOwnerEnlargeBufferIOs(ResourceOwner owner) -{ - /* We used to allow pinning buffers without a resowner, but no more */ - Assert(owner != NULL); - ResourceArrayEnlarge(&(owner->bufferioarr)); -} - -/* - * Remember that a buffer IO is owned by a ResourceOwner - * - * Caller must have previously done ResourceOwnerEnlargeBufferIOs() - */ -void -ResourceOwnerRememberBufferIO(ResourceOwner owner, Buffer buffer) -{ - ResourceArrayAdd(&(owner->bufferioarr), BufferGetDatum(buffer)); -} - -/* - * Forget that a buffer IO is owned by a ResourceOwner - */ -void -ResourceOwnerForgetBufferIO(ResourceOwner owner, Buffer buffer) -{ - if (!ResourceArrayRemove(&(owner->bufferioarr), BufferGetDatum(buffer))) - elog(PANIC, "buffer IO %d is not owned by resource owner %s", - buffer, owner->name); -} - /* * Remember that a Local Lock is owned by a ResourceOwner * - * This is different from the other Remember functions in that the list of - * locks is only a lossy cache. It can hold up to MAX_RESOWNER_LOCKS entries, - * and when it overflows, we stop tracking locks. The point of only remembering + * This is different from the generic ResourceOwnerRemember in that the list of + * locks is only a lossy cache. It can hold up to MAX_RESOWNER_LOCKS entries, + * and when it overflows, we stop tracking locks. The point of only remembering * only up to MAX_RESOWNER_LOCKS entries is that if a lot of locks are held, * ResourceOwnerForgetLock doesn't need to scan through a large array to find * the entry. @@ -1087,469 +1082,3 @@ ResourceOwnerForgetLock(ResourceOwner owner, LOCALLOCK *locallock) elog(ERROR, "lock reference %p is not owned by resource owner %s", locallock, owner->name); } - -/* - * Make sure there is room for at least one more entry in a ResourceOwner's - * catcache reference array. - * - * This is separate from actually inserting an entry because if we run out - * of memory, it's critical to do so *before* acquiring the resource. - */ -void -ResourceOwnerEnlargeCatCacheRefs(ResourceOwner owner) -{ - ResourceArrayEnlarge(&(owner->catrefarr)); -} - -/* - * Remember that a catcache reference is owned by a ResourceOwner - * - * Caller must have previously done ResourceOwnerEnlargeCatCacheRefs() - */ -void -ResourceOwnerRememberCatCacheRef(ResourceOwner owner, HeapTuple tuple) -{ - ResourceArrayAdd(&(owner->catrefarr), PointerGetDatum(tuple)); -} - -/* - * Forget that a catcache reference is owned by a ResourceOwner - */ -void -ResourceOwnerForgetCatCacheRef(ResourceOwner owner, HeapTuple tuple) -{ - if (!ResourceArrayRemove(&(owner->catrefarr), PointerGetDatum(tuple))) - elog(ERROR, "catcache reference %p is not owned by resource owner %s", - tuple, owner->name); -} - -/* - * Make sure there is room for at least one more entry in a ResourceOwner's - * catcache-list reference array. - * - * This is separate from actually inserting an entry because if we run out - * of memory, it's critical to do so *before* acquiring the resource. - */ -void -ResourceOwnerEnlargeCatCacheListRefs(ResourceOwner owner) -{ - ResourceArrayEnlarge(&(owner->catlistrefarr)); -} - -/* - * Remember that a catcache-list reference is owned by a ResourceOwner - * - * Caller must have previously done ResourceOwnerEnlargeCatCacheListRefs() - */ -void -ResourceOwnerRememberCatCacheListRef(ResourceOwner owner, CatCList *list) -{ - ResourceArrayAdd(&(owner->catlistrefarr), PointerGetDatum(list)); -} - -/* - * Forget that a catcache-list reference is owned by a ResourceOwner - */ -void -ResourceOwnerForgetCatCacheListRef(ResourceOwner owner, CatCList *list) -{ - if (!ResourceArrayRemove(&(owner->catlistrefarr), PointerGetDatum(list))) - elog(ERROR, "catcache list reference %p is not owned by resource owner %s", - list, owner->name); -} - -/* - * Make sure there is room for at least one more entry in a ResourceOwner's - * relcache reference array. - * - * This is separate from actually inserting an entry because if we run out - * of memory, it's critical to do so *before* acquiring the resource. - */ -void -ResourceOwnerEnlargeRelationRefs(ResourceOwner owner) -{ - ResourceArrayEnlarge(&(owner->relrefarr)); -} - -/* - * Remember that a relcache reference is owned by a ResourceOwner - * - * Caller must have previously done ResourceOwnerEnlargeRelationRefs() - */ -void -ResourceOwnerRememberRelationRef(ResourceOwner owner, Relation rel) -{ - ResourceArrayAdd(&(owner->relrefarr), PointerGetDatum(rel)); -} - -/* - * Forget that a relcache reference is owned by a ResourceOwner - */ -void -ResourceOwnerForgetRelationRef(ResourceOwner owner, Relation rel) -{ - if (!ResourceArrayRemove(&(owner->relrefarr), PointerGetDatum(rel))) - elog(ERROR, "relcache reference %s is not owned by resource owner %s", - RelationGetRelationName(rel), owner->name); -} - -/* - * Debugging subroutine - */ -static void -PrintRelCacheLeakWarning(Relation rel) -{ - elog(WARNING, "relcache reference leak: relation \"%s\" not closed", - RelationGetRelationName(rel)); -} - -/* - * Make sure there is room for at least one more entry in a ResourceOwner's - * plancache reference array. - * - * This is separate from actually inserting an entry because if we run out - * of memory, it's critical to do so *before* acquiring the resource. - */ -void -ResourceOwnerEnlargePlanCacheRefs(ResourceOwner owner) -{ - ResourceArrayEnlarge(&(owner->planrefarr)); -} - -/* - * Remember that a plancache reference is owned by a ResourceOwner - * - * Caller must have previously done ResourceOwnerEnlargePlanCacheRefs() - */ -void -ResourceOwnerRememberPlanCacheRef(ResourceOwner owner, CachedPlan *plan) -{ - ResourceArrayAdd(&(owner->planrefarr), PointerGetDatum(plan)); -} - -/* - * Forget that a plancache reference is owned by a ResourceOwner - */ -void -ResourceOwnerForgetPlanCacheRef(ResourceOwner owner, CachedPlan *plan) -{ - if (!ResourceArrayRemove(&(owner->planrefarr), PointerGetDatum(plan))) - elog(ERROR, "plancache reference %p is not owned by resource owner %s", - plan, owner->name); -} - -/* - * Debugging subroutine - */ -static void -PrintPlanCacheLeakWarning(CachedPlan *plan) -{ - elog(WARNING, "plancache reference leak: plan %p not closed", plan); -} - -/* - * Make sure there is room for at least one more entry in a ResourceOwner's - * tupdesc reference array. - * - * This is separate from actually inserting an entry because if we run out - * of memory, it's critical to do so *before* acquiring the resource. - */ -void -ResourceOwnerEnlargeTupleDescs(ResourceOwner owner) -{ - ResourceArrayEnlarge(&(owner->tupdescarr)); -} - -/* - * Remember that a tupdesc reference is owned by a ResourceOwner - * - * Caller must have previously done ResourceOwnerEnlargeTupleDescs() - */ -void -ResourceOwnerRememberTupleDesc(ResourceOwner owner, TupleDesc tupdesc) -{ - ResourceArrayAdd(&(owner->tupdescarr), PointerGetDatum(tupdesc)); -} - -/* - * Forget that a tupdesc reference is owned by a ResourceOwner - */ -void -ResourceOwnerForgetTupleDesc(ResourceOwner owner, TupleDesc tupdesc) -{ - if (!ResourceArrayRemove(&(owner->tupdescarr), PointerGetDatum(tupdesc))) - elog(ERROR, "tupdesc reference %p is not owned by resource owner %s", - tupdesc, owner->name); -} - -/* - * Debugging subroutine - */ -static void -PrintTupleDescLeakWarning(TupleDesc tupdesc) -{ - elog(WARNING, - "TupleDesc reference leak: TupleDesc %p (%u,%d) still referenced", - tupdesc, tupdesc->tdtypeid, tupdesc->tdtypmod); -} - -/* - * Make sure there is room for at least one more entry in a ResourceOwner's - * snapshot reference array. - * - * This is separate from actually inserting an entry because if we run out - * of memory, it's critical to do so *before* acquiring the resource. - */ -void -ResourceOwnerEnlargeSnapshots(ResourceOwner owner) -{ - ResourceArrayEnlarge(&(owner->snapshotarr)); -} - -/* - * Remember that a snapshot reference is owned by a ResourceOwner - * - * Caller must have previously done ResourceOwnerEnlargeSnapshots() - */ -void -ResourceOwnerRememberSnapshot(ResourceOwner owner, Snapshot snapshot) -{ - ResourceArrayAdd(&(owner->snapshotarr), PointerGetDatum(snapshot)); -} - -/* - * Forget that a snapshot reference is owned by a ResourceOwner - */ -void -ResourceOwnerForgetSnapshot(ResourceOwner owner, Snapshot snapshot) -{ - if (!ResourceArrayRemove(&(owner->snapshotarr), PointerGetDatum(snapshot))) - elog(ERROR, "snapshot reference %p is not owned by resource owner %s", - snapshot, owner->name); -} - -/* - * Debugging subroutine - */ -static void -PrintSnapshotLeakWarning(Snapshot snapshot) -{ - elog(WARNING, "Snapshot reference leak: Snapshot %p still referenced", - snapshot); -} - - -/* - * Make sure there is room for at least one more entry in a ResourceOwner's - * files reference array. - * - * This is separate from actually inserting an entry because if we run out - * of memory, it's critical to do so *before* acquiring the resource. - */ -void -ResourceOwnerEnlargeFiles(ResourceOwner owner) -{ - ResourceArrayEnlarge(&(owner->filearr)); -} - -/* - * Remember that a temporary file is owned by a ResourceOwner - * - * Caller must have previously done ResourceOwnerEnlargeFiles() - */ -void -ResourceOwnerRememberFile(ResourceOwner owner, File file) -{ - ResourceArrayAdd(&(owner->filearr), FileGetDatum(file)); -} - -/* - * Forget that a temporary file is owned by a ResourceOwner - */ -void -ResourceOwnerForgetFile(ResourceOwner owner, File file) -{ - if (!ResourceArrayRemove(&(owner->filearr), FileGetDatum(file))) - elog(ERROR, "temporary file %d is not owned by resource owner %s", - file, owner->name); -} - -/* - * Debugging subroutine - */ -static void -PrintFileLeakWarning(File file) -{ - elog(WARNING, "temporary file leak: File %d still referenced", - file); -} - -/* - * Make sure there is room for at least one more entry in a ResourceOwner's - * dynamic shmem segment reference array. - * - * This is separate from actually inserting an entry because if we run out - * of memory, it's critical to do so *before* acquiring the resource. - */ -void -ResourceOwnerEnlargeDSMs(ResourceOwner owner) -{ - ResourceArrayEnlarge(&(owner->dsmarr)); -} - -/* - * Remember that a dynamic shmem segment is owned by a ResourceOwner - * - * Caller must have previously done ResourceOwnerEnlargeDSMs() - */ -void -ResourceOwnerRememberDSM(ResourceOwner owner, dsm_segment *seg) -{ - ResourceArrayAdd(&(owner->dsmarr), PointerGetDatum(seg)); -} - -/* - * Forget that a dynamic shmem segment is owned by a ResourceOwner - */ -void -ResourceOwnerForgetDSM(ResourceOwner owner, dsm_segment *seg) -{ - if (!ResourceArrayRemove(&(owner->dsmarr), PointerGetDatum(seg))) - elog(ERROR, "dynamic shared memory segment %u is not owned by resource owner %s", - dsm_segment_handle(seg), owner->name); -} - -/* - * Debugging subroutine - */ -static void -PrintDSMLeakWarning(dsm_segment *seg) -{ - elog(WARNING, "dynamic shared memory leak: segment %u still referenced", - dsm_segment_handle(seg)); -} - -/* - * Make sure there is room for at least one more entry in a ResourceOwner's - * JIT context reference array. - * - * This is separate from actually inserting an entry because if we run out of - * memory, it's critical to do so *before* acquiring the resource. - */ -void -ResourceOwnerEnlargeJIT(ResourceOwner owner) -{ - ResourceArrayEnlarge(&(owner->jitarr)); -} - -/* - * Remember that a JIT context is owned by a ResourceOwner - * - * Caller must have previously done ResourceOwnerEnlargeJIT() - */ -void -ResourceOwnerRememberJIT(ResourceOwner owner, Datum handle) -{ - ResourceArrayAdd(&(owner->jitarr), handle); -} - -/* - * Forget that a JIT context is owned by a ResourceOwner - */ -void -ResourceOwnerForgetJIT(ResourceOwner owner, Datum handle) -{ - if (!ResourceArrayRemove(&(owner->jitarr), handle)) - elog(ERROR, "JIT context %p is not owned by resource owner %s", - DatumGetPointer(handle), owner->name); -} - -/* - * Make sure there is room for at least one more entry in a ResourceOwner's - * cryptohash context reference array. - * - * This is separate from actually inserting an entry because if we run out of - * memory, it's critical to do so *before* acquiring the resource. - */ -void -ResourceOwnerEnlargeCryptoHash(ResourceOwner owner) -{ - ResourceArrayEnlarge(&(owner->cryptohasharr)); -} - -/* - * Remember that a cryptohash context is owned by a ResourceOwner - * - * Caller must have previously done ResourceOwnerEnlargeCryptoHash() - */ -void -ResourceOwnerRememberCryptoHash(ResourceOwner owner, Datum handle) -{ - ResourceArrayAdd(&(owner->cryptohasharr), handle); -} - -/* - * Forget that a cryptohash context is owned by a ResourceOwner - */ -void -ResourceOwnerForgetCryptoHash(ResourceOwner owner, Datum handle) -{ - if (!ResourceArrayRemove(&(owner->cryptohasharr), handle)) - elog(ERROR, "cryptohash context %p is not owned by resource owner %s", - DatumGetPointer(handle), owner->name); -} - -/* - * Debugging subroutine - */ -static void -PrintCryptoHashLeakWarning(Datum handle) -{ - elog(WARNING, "cryptohash context reference leak: context %p still referenced", - DatumGetPointer(handle)); -} - -/* - * Make sure there is room for at least one more entry in a ResourceOwner's - * hmac context reference array. - * - * This is separate from actually inserting an entry because if we run out of - * memory, it's critical to do so *before* acquiring the resource. - */ -void -ResourceOwnerEnlargeHMAC(ResourceOwner owner) -{ - ResourceArrayEnlarge(&(owner->hmacarr)); -} - -/* - * Remember that a HMAC context is owned by a ResourceOwner - * - * Caller must have previously done ResourceOwnerEnlargeHMAC() - */ -void -ResourceOwnerRememberHMAC(ResourceOwner owner, Datum handle) -{ - ResourceArrayAdd(&(owner->hmacarr), handle); -} - -/* - * Forget that a HMAC context is owned by a ResourceOwner - */ -void -ResourceOwnerForgetHMAC(ResourceOwner owner, Datum handle) -{ - if (!ResourceArrayRemove(&(owner->hmacarr), handle)) - elog(ERROR, "HMAC context %p is not owned by resource owner %s", - DatumGetPointer(handle), owner->name); -} - -/* - * Debugging subroutine - */ -static void -PrintHMACLeakWarning(Datum handle) -{ - elog(WARNING, "HMAC context reference leak: context %p still referenced", - DatumGetPointer(handle)); -} diff --git a/src/backend/utils/sort/logtape.c b/src/backend/utils/sort/logtape.c index 52b8898d5edb4..44b30e86adf47 100644 --- a/src/backend/utils/sort/logtape.c +++ b/src/backend/utils/sort/logtape.c @@ -66,7 +66,7 @@ * There will always be the same number of runs as input tapes, and the same * number of input tapes as participants (worker Tuplesortstates). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -94,9 +94,9 @@ */ typedef struct TapeBlockTrailer { - long prev; /* previous block on this tape, or -1 on first + int64 prev; /* previous block on this tape, or -1 on first * block */ - long next; /* next block on this tape, or # of valid + int64 next; /* next block on this tape, or # of valid * bytes on last block (if < 0) */ } TapeBlockTrailer; @@ -153,10 +153,10 @@ struct LogicalTape * When concatenation of worker tape BufFiles is performed, an offset to * the first block in the unified BufFile space is applied during reads. */ - long firstBlockNumber; - long curBlockNumber; - long nextBlockNumber; - long offsetBlockNumber; + int64 firstBlockNumber; + int64 curBlockNumber; + int64 nextBlockNumber; + int64 offsetBlockNumber; /* * Buffer for current data block(s). @@ -172,7 +172,7 @@ struct LogicalTape * order; blocks are consumed from the end of the array (lowest block * numbers first). */ - long *prealloc; + int64 *prealloc; int nprealloc; /* number of elements in list */ int prealloc_size; /* number of elements list can hold */ }; @@ -200,9 +200,9 @@ struct LogicalTapeSet * blocks that are in unused holes between worker spaces following BufFile * concatenation. */ - long nBlocksAllocated; /* # of blocks allocated */ - long nBlocksWritten; /* # of blocks used in underlying file */ - long nHoleBlocks; /* # of "hole" blocks left */ + int64 nBlocksAllocated; /* # of blocks allocated */ + int64 nBlocksWritten; /* # of blocks used in underlying file */ + int64 nHoleBlocks; /* # of "hole" blocks left */ /* * We store the numbers of recycled-and-available blocks in freeBlocks[]. @@ -213,19 +213,19 @@ struct LogicalTapeSet * LogicalTapeSetForgetFreeSpace(). */ bool forgetFreeSpace; /* are we remembering free blocks? */ - long *freeBlocks; /* resizable array holding minheap */ - long nFreeBlocks; /* # of currently free blocks */ + int64 *freeBlocks; /* resizable array holding minheap */ + int64 nFreeBlocks; /* # of currently free blocks */ Size freeBlocksLen; /* current allocated length of freeBlocks[] */ bool enable_prealloc; /* preallocate write blocks? */ }; static LogicalTape *ltsCreateTape(LogicalTapeSet *lts); -static void ltsWriteBlock(LogicalTapeSet *lts, long blocknum, const void *buffer); -static void ltsReadBlock(LogicalTapeSet *lts, long blocknum, void *buffer); -static long ltsGetBlock(LogicalTapeSet *lts, LogicalTape *lt); -static long ltsGetFreeBlock(LogicalTapeSet *lts); -static long ltsGetPreallocBlock(LogicalTapeSet *lts, LogicalTape *lt); -static void ltsReleaseBlock(LogicalTapeSet *lts, long blocknum); +static void ltsWriteBlock(LogicalTapeSet *lts, int64 blocknum, const void *buffer); +static void ltsReadBlock(LogicalTapeSet *lts, int64 blocknum, void *buffer); +static int64 ltsGetBlock(LogicalTapeSet *lts, LogicalTape *lt); +static int64 ltsGetFreeBlock(LogicalTapeSet *lts); +static int64 ltsGetPreallocBlock(LogicalTapeSet *lts, LogicalTape *lt); +static void ltsReleaseBlock(LogicalTapeSet *lts, int64 blocknum); static void ltsInitReadBuffer(LogicalTape *lt); @@ -235,7 +235,7 @@ static void ltsInitReadBuffer(LogicalTape *lt); * No need for an error return convention; we ereport() on any error. */ static void -ltsWriteBlock(LogicalTapeSet *lts, long blocknum, const void *buffer) +ltsWriteBlock(LogicalTapeSet *lts, int64 blocknum, const void *buffer) { /* * BufFile does not support "holes", so if we're about to write a block @@ -263,8 +263,8 @@ ltsWriteBlock(LogicalTapeSet *lts, long blocknum, const void *buffer) if (BufFileSeekBlock(lts->pfile, blocknum) != 0) ereport(ERROR, (errcode_for_file_access(), - errmsg("could not seek to block %ld of temporary file", - blocknum))); + errmsg("could not seek to block %lld of temporary file", + (long long) blocknum))); BufFileWrite(lts->pfile, buffer, BLCKSZ); /* Update nBlocksWritten, if we extended the file */ @@ -279,13 +279,13 @@ ltsWriteBlock(LogicalTapeSet *lts, long blocknum, const void *buffer) * module should never attempt to read a block it doesn't know is there. */ static void -ltsReadBlock(LogicalTapeSet *lts, long blocknum, void *buffer) +ltsReadBlock(LogicalTapeSet *lts, int64 blocknum, void *buffer) { if (BufFileSeekBlock(lts->pfile, blocknum) != 0) ereport(ERROR, (errcode_for_file_access(), - errmsg("could not seek to block %ld of temporary file", - blocknum))); + errmsg("could not seek to block %lld of temporary file", + (long long) blocknum))); BufFileReadExact(lts->pfile, buffer, BLCKSZ); } @@ -303,7 +303,7 @@ ltsReadFillBuffer(LogicalTape *lt) do { char *thisbuf = lt->buffer + lt->nbytes; - long datablocknum = lt->nextBlockNumber; + int64 datablocknum = lt->nextBlockNumber; /* Fetch next block number */ if (datablocknum == -1L) @@ -333,20 +333,20 @@ ltsReadFillBuffer(LogicalTape *lt) return (lt->nbytes > 0); } -static inline unsigned long -left_offset(unsigned long i) +static inline uint64 +left_offset(uint64 i) { return 2 * i + 1; } -static inline unsigned long -right_offset(unsigned long i) +static inline uint64 +right_offset(uint64 i) { return 2 * i + 2; } -static inline unsigned long -parent_offset(unsigned long i) +static inline uint64 +parent_offset(uint64 i) { return (i - 1) / 2; } @@ -354,7 +354,7 @@ parent_offset(unsigned long i) /* * Get the next block for writing. */ -static long +static int64 ltsGetBlock(LogicalTapeSet *lts, LogicalTape *lt) { if (lts->enable_prealloc) @@ -367,14 +367,14 @@ ltsGetBlock(LogicalTapeSet *lts, LogicalTape *lt) * Select the lowest currently unused block from the tape set's global free * list min heap. */ -static long +static int64 ltsGetFreeBlock(LogicalTapeSet *lts) { - long *heap = lts->freeBlocks; - long blocknum; - int heapsize; - long holeval; - unsigned long holepos; + int64 *heap = lts->freeBlocks; + int64 blocknum; + int64 heapsize; + int64 holeval; + uint64 holepos; /* freelist empty; allocate a new block */ if (lts->nFreeBlocks == 0) @@ -398,9 +398,9 @@ ltsGetFreeBlock(LogicalTapeSet *lts) heapsize = lts->nFreeBlocks; while (true) { - unsigned long left = left_offset(holepos); - unsigned long right = right_offset(holepos); - unsigned long min_child; + uint64 left = left_offset(holepos); + uint64 right = right_offset(holepos); + uint64 min_child; if (left < heapsize && right < heapsize) min_child = (heap[left] < heap[right]) ? left : right; @@ -427,7 +427,7 @@ ltsGetFreeBlock(LogicalTapeSet *lts) * Refill the preallocation list with blocks from the tape set's free list if * necessary. */ -static long +static int64 ltsGetPreallocBlock(LogicalTapeSet *lts, LogicalTape *lt) { /* sorted in descending order, so return the last element */ @@ -437,7 +437,7 @@ ltsGetPreallocBlock(LogicalTapeSet *lts, LogicalTape *lt) if (lt->prealloc == NULL) { lt->prealloc_size = TAPE_WRITE_PREALLOC_MIN; - lt->prealloc = (long *) palloc(sizeof(long) * lt->prealloc_size); + lt->prealloc = (int64 *) palloc(sizeof(int64) * lt->prealloc_size); } else if (lt->prealloc_size < TAPE_WRITE_PREALLOC_MAX) { @@ -445,8 +445,8 @@ ltsGetPreallocBlock(LogicalTapeSet *lts, LogicalTape *lt) lt->prealloc_size *= 2; if (lt->prealloc_size > TAPE_WRITE_PREALLOC_MAX) lt->prealloc_size = TAPE_WRITE_PREALLOC_MAX; - lt->prealloc = (long *) repalloc(lt->prealloc, - sizeof(long) * lt->prealloc_size); + lt->prealloc = (int64 *) repalloc(lt->prealloc, + sizeof(int64) * lt->prealloc_size); } /* refill preallocation list */ @@ -466,10 +466,10 @@ ltsGetPreallocBlock(LogicalTapeSet *lts, LogicalTape *lt) * Return a block# to the freelist. */ static void -ltsReleaseBlock(LogicalTapeSet *lts, long blocknum) +ltsReleaseBlock(LogicalTapeSet *lts, int64 blocknum) { - long *heap; - unsigned long holepos; + int64 *heap; + uint64 holepos; /* * Do nothing if we're no longer interested in remembering free space. @@ -486,12 +486,12 @@ ltsReleaseBlock(LogicalTapeSet *lts, long blocknum) * If the freelist becomes very large, just return and leak this free * block. */ - if (lts->freeBlocksLen * 2 * sizeof(long) > MaxAllocSize) + if (lts->freeBlocksLen * 2 * sizeof(int64) > MaxAllocSize) return; lts->freeBlocksLen *= 2; - lts->freeBlocks = (long *) repalloc(lts->freeBlocks, - lts->freeBlocksLen * sizeof(long)); + lts->freeBlocks = (int64 *) repalloc(lts->freeBlocks, + lts->freeBlocksLen * sizeof(int64)); } /* create a "hole" at end of minheap array */ @@ -502,7 +502,7 @@ ltsReleaseBlock(LogicalTapeSet *lts, long blocknum) /* sift up to insert blocknum */ while (holepos != 0) { - unsigned long parent = parent_offset(holepos); + uint64 parent = parent_offset(holepos); if (heap[parent] < blocknum) break; @@ -566,7 +566,7 @@ LogicalTapeSetCreate(bool preallocate, SharedFileSet *fileset, int worker) lts->nHoleBlocks = 0L; lts->forgetFreeSpace = false; lts->freeBlocksLen = 32; /* reasonable initial guess */ - lts->freeBlocks = (long *) palloc(lts->freeBlocksLen * sizeof(long)); + lts->freeBlocks = (int64 *) palloc(lts->freeBlocksLen * sizeof(int64)); lts->nFreeBlocks = 0; lts->enable_prealloc = preallocate; @@ -609,7 +609,7 @@ LogicalTape * LogicalTapeImport(LogicalTapeSet *lts, int worker, TapeShare *shared) { LogicalTape *lt; - long tapeblocks; + int64 tapeblocks; char filename[MAXPGPATH]; BufFile *file; int64 filesize; @@ -789,7 +789,7 @@ LogicalTapeWrite(LogicalTape *lt, const void *ptr, size_t size) if (lt->pos >= (int) TapeBlockPayloadSize) { /* Buffer full, dump it out */ - long nextBlockNumber; + int64 nextBlockNumber; if (!lt->dirty) { @@ -1086,7 +1086,7 @@ LogicalTapeBackspace(LogicalTape *lt, size_t size) seekpos = (size_t) lt->pos; /* part within this block */ while (size > seekpos) { - long prev = TapeBlockGetTrailer(lt->buffer)->prev; + int64 prev = TapeBlockGetTrailer(lt->buffer)->prev; if (prev == -1L) { @@ -1100,10 +1100,10 @@ LogicalTapeBackspace(LogicalTape *lt, size_t size) ltsReadBlock(lt->tapeSet, prev, lt->buffer); if (TapeBlockGetTrailer(lt->buffer)->next != lt->curBlockNumber) - elog(ERROR, "broken tape, next of block %ld is %ld, expected %ld", - prev, - TapeBlockGetTrailer(lt->buffer)->next, - lt->curBlockNumber); + elog(ERROR, "broken tape, next of block %lld is %lld, expected %lld", + (long long) prev, + (long long) (TapeBlockGetTrailer(lt->buffer)->next), + (long long) lt->curBlockNumber); lt->nbytes = TapeBlockPayloadSize; lt->curBlockNumber = prev; @@ -1130,7 +1130,7 @@ LogicalTapeBackspace(LogicalTape *lt, size_t size) * LogicalTapeTell(). */ void -LogicalTapeSeek(LogicalTape *lt, long blocknum, int offset) +LogicalTapeSeek(LogicalTape *lt, int64 blocknum, int offset) { Assert(lt->frozen); Assert(offset >= 0 && offset <= TapeBlockPayloadSize); @@ -1159,7 +1159,7 @@ LogicalTapeSeek(LogicalTape *lt, long blocknum, int offset) * the position for a seek after freezing. Not clear if anyone needs that. */ void -LogicalTapeTell(LogicalTape *lt, long *blocknum, int *offset) +LogicalTapeTell(LogicalTape *lt, int64 *blocknum, int *offset) { if (lt->buffer == NULL) ltsInitReadBuffer(lt); @@ -1174,12 +1174,10 @@ LogicalTapeTell(LogicalTape *lt, long *blocknum, int *offset) } /* - * Obtain total disk space currently used by a LogicalTapeSet, in blocks. - * - * This should not be called while there are open write buffers; otherwise it - * may not account for buffered data. + * Obtain total disk space currently used by a LogicalTapeSet, in blocks. Does + * not account for open write buffer, if any. */ -long +int64 LogicalTapeSetBlocks(LogicalTapeSet *lts) { return lts->nBlocksWritten - lts->nHoleBlocks; diff --git a/src/backend/utils/sort/meson.build b/src/backend/utils/sort/meson.build index b7eb9c2764b49..f1ae189693613 100644 --- a/src/backend/utils/sort/meson.build +++ b/src/backend/utils/sort/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'logtape.c', diff --git a/src/backend/utils/sort/sharedtuplestore.c b/src/backend/utils/sort/sharedtuplestore.c index 236be65f22176..137476a7a7783 100644 --- a/src/backend/utils/sort/sharedtuplestore.c +++ b/src/backend/utils/sort/sharedtuplestore.c @@ -10,7 +10,7 @@ * scan where each backend reads an arbitrary subset of the tuples that were * written. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -23,7 +23,6 @@ #include "access/htup.h" #include "access/htup_details.h" -#include "miscadmin.h" #include "storage/buffile.h" #include "storage/lwlock.h" #include "storage/sharedfileset.h" diff --git a/src/backend/utils/sort/sortsupport.c b/src/backend/utils/sort/sortsupport.c index 670e6ec10113f..c8a75487a3a9f 100644 --- a/src/backend/utils/sort/sortsupport.c +++ b/src/backend/utils/sort/sortsupport.c @@ -4,7 +4,7 @@ * Support routines for accelerated sorting. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -17,7 +17,6 @@ #include "access/gist.h" #include "access/nbtree.h" -#include "catalog/pg_am.h" #include "fmgr.h" #include "utils/lsyscache.h" #include "utils/rel.h" diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c index e5a4e5b371e35..7c4d6dc106bff 100644 --- a/src/backend/utils/sort/tuplesort.c +++ b/src/backend/utils/sort/tuplesort.c @@ -88,7 +88,7 @@ * produce exactly one output run from their partial input. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -101,15 +101,12 @@ #include -#include "catalog/pg_am.h" #include "commands/tablespace.h" -#include "executor/executor.h" #include "miscadmin.h" #include "pg_trace.h" #include "storage/shmem.h" #include "utils/memutils.h" #include "utils/pg_rusage.h" -#include "utils/rel.h" #include "utils/tuplesort.h" /* @@ -162,7 +159,7 @@ typedef enum TSS_BUILDRUNS, /* Loading tuples; writing to tape */ TSS_SORTEDINMEM, /* Sort completed entirely in memory */ TSS_SORTEDONTAPE, /* Sort completed, final run is on tape */ - TSS_FINALMERGE /* Performing final merge on-the-fly */ + TSS_FINALMERGE, /* Performing final merge on-the-fly */ } TupSortStatus; /* @@ -194,6 +191,11 @@ struct Tuplesortstate * tuples to return? */ bool boundUsed; /* true if we made use of a bounded heap */ int bound; /* if bounded, the maximum number of tuples */ + int64 tupleMem; /* memory consumed by individual tuples. + * storing this separately from what we track + * in availMem allows us to subtract the + * memory consumed by all tuples when dumping + * tuples to tape */ int64 availMem; /* remaining memory available, in bytes */ int64 allowedMem; /* total memory allowed, in bytes */ int maxTapes; /* max number of input tapes to merge in each @@ -296,7 +298,7 @@ struct Tuplesortstate bool eof_reached; /* reached EOF (needed for cursors) */ /* markpos_xxx holds marked position for mark and restore */ - long markpos_block; /* tape block# (only used if SORTEDONTAPE) */ + int64 markpos_block; /* tape block# (only used if SORTEDONTAPE) */ int markpos_offset; /* saved "current", or offset in tape block */ bool markpos_eof; /* saved "eof_reached" */ @@ -485,9 +487,6 @@ static void tuplesort_updatemax(Tuplesortstate *state); * is to try to sort two tuples without having to follow the pointers to the * comparator or the tuple. * - * XXX: For now, these fall back to comparator functions that will compare the - * leading datum a second time. - * * XXX: For now, there is no specialization for cases where datum1 is * authoritative and we don't even need to fall back to a callback at all (that * would be true for types like int4/int8/timestamp/date, but not true for @@ -513,7 +512,7 @@ qsort_tuple_unsigned_compare(SortTuple *a, SortTuple *b, Tuplesortstate *state) if (state->base.onlyKey != NULL) return 0; - return state->base.comparetup(a, b, state); + return state->base.comparetup_tiebreak(a, b, state); } #if SIZEOF_DATUM >= 8 @@ -537,7 +536,7 @@ qsort_tuple_signed_compare(SortTuple *a, SortTuple *b, Tuplesortstate *state) if (state->base.onlyKey != NULL) return 0; - return state->base.comparetup(a, b, state); + return state->base.comparetup_tiebreak(a, b, state); } #endif @@ -561,7 +560,7 @@ qsort_tuple_int32_compare(SortTuple *a, SortTuple *b, Tuplesortstate *state) if (state->base.onlyKey != NULL) return 0; - return state->base.comparetup(a, b, state); + return state->base.comparetup_tiebreak(a, b, state); } /* @@ -770,18 +769,18 @@ tuplesort_begin_batch(Tuplesortstate *state) * in the parent context, not this context, because there is no need to * free memtuples early. For bounded sorts, tuples may be pfreed in any * order, so we use a regular aset.c context so that it can make use of - * free'd memory. When the sort is not bounded, we make use of a - * generation.c context as this keeps allocations more compact with less - * wastage. Allocations are also slightly more CPU efficient. - */ - if (state->base.sortopt & TUPLESORT_ALLOWBOUNDED) + * free'd memory. When the sort is not bounded, we make use of a bump.c + * context as this keeps allocations more compact with less wastage. + * Allocations are also slightly more CPU efficient. + */ + if (TupleSortUseBumpTupleCxt(state->base.sortopt)) + state->base.tuplecontext = BumpContextCreate(state->base.sortcontext, + "Caller tuples", + ALLOCSET_DEFAULT_SIZES); + else state->base.tuplecontext = AllocSetContextCreate(state->base.sortcontext, "Caller tuples", ALLOCSET_DEFAULT_SIZES); - else - state->base.tuplecontext = GenerationContextCreate(state->base.sortcontext, - "Caller tuples", - ALLOCSET_DEFAULT_SIZES); state->status = TSS_INITIAL; @@ -906,7 +905,7 @@ tuplesort_free(Tuplesortstate *state) MemoryContext oldcontext = MemoryContextSwitchTo(state->base.sortcontext); #ifdef TRACE_SORT - long spaceUsed; + int64 spaceUsed; if (state->tapeset) spaceUsed = LogicalTapeSetBlocks(state->tapeset); @@ -931,13 +930,13 @@ tuplesort_free(Tuplesortstate *state) if (trace_sort) { if (state->tapeset) - elog(LOG, "%s of worker %d ended, %ld disk blocks used: %s", + elog(LOG, "%s of worker %d ended, %lld disk blocks used: %s", SERIAL(state) ? "external sort" : "parallel external sort", - state->worker, spaceUsed, pg_rusage_show(&state->ru_start)); + state->worker, (long long) spaceUsed, pg_rusage_show(&state->ru_start)); else - elog(LOG, "%s of worker %d ended, %ld KB used: %s", + elog(LOG, "%s of worker %d ended, %lld KB used: %s", SERIAL(state) ? "internal sort" : "unperformed parallel sort", - state->worker, spaceUsed, pg_rusage_show(&state->ru_start)); + state->worker, (long long) spaceUsed, pg_rusage_show(&state->ru_start)); } TRACE_POSTGRESQL_SORT_DONE(state->tapeset != NULL, spaceUsed); @@ -1187,15 +1186,16 @@ grow_memtuples(Tuplesortstate *state) * Shared code for tuple and datum cases. */ void -tuplesort_puttuple_common(Tuplesortstate *state, SortTuple *tuple, bool useAbbrev) +tuplesort_puttuple_common(Tuplesortstate *state, SortTuple *tuple, + bool useAbbrev, Size tuplen) { MemoryContext oldcontext = MemoryContextSwitchTo(state->base.sortcontext); Assert(!LEADER(state)); - /* Count the size of the out-of-line data */ - if (tuple->tuple != NULL) - USEMEM(state, GetMemoryChunkSpace(tuple->tuple)); + /* account for the memory used for this tuple */ + USEMEM(state, tuplen); + state->tupleMem += tuplen; if (!useAbbrev) { @@ -2403,13 +2403,6 @@ dumptuples(Tuplesortstate *state, bool alltuples) SortTuple *stup = &state->memtuples[i]; WRITETUP(state, state->destTape, stup); - - /* - * Account for freeing the tuple, but no need to do the actual pfree - * since the tuplecontext is being reset after the loop. - */ - if (stup->tuple != NULL) - FREEMEM(state, GetMemoryChunkSpace(stup->tuple)); } state->memtupcount = 0; @@ -2417,12 +2410,19 @@ dumptuples(Tuplesortstate *state, bool alltuples) /* * Reset tuple memory. We've freed all of the tuples that we previously * allocated. It's important to avoid fragmentation when there is a stark - * change in the sizes of incoming tuples. Fragmentation due to - * AllocSetFree's bucketing by size class might be particularly bad if - * this step wasn't taken. + * change in the sizes of incoming tuples. In bounded sorts, + * fragmentation due to AllocSetFree's bucketing by size class might be + * particularly bad if this step wasn't taken. */ MemoryContextReset(state->base.tuplecontext); + /* + * Now update the memory accounting to subtract the memory used by the + * tuple. + */ + FREEMEM(state, state->tupleMem); + state->tupleMem = 0; + markrunend(state->destTape); #ifdef TRACE_SORT diff --git a/src/backend/utils/sort/tuplesortvariants.c b/src/backend/utils/sort/tuplesortvariants.c index eb6cfcfd00213..05a853caa3610 100644 --- a/src/backend/utils/sort/tuplesortvariants.c +++ b/src/backend/utils/sort/tuplesortvariants.c @@ -9,7 +9,7 @@ * could be easily added here, another module, or even an extension. * * - * Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/backend/utils/sort/tuplesortvariants.c @@ -19,6 +19,7 @@ #include "postgres.h" +#include "access/brin_tuple.h" #include "access/hash.h" #include "access/htup_details.h" #include "access/nbtree.h" @@ -26,8 +27,8 @@ #include "executor/executor.h" #include "pg_trace.h" #include "utils/datum.h" -#include "utils/lsyscache.h" #include "utils/guc.h" +#include "utils/lsyscache.h" #include "utils/tuplesort.h" @@ -43,30 +44,48 @@ static void removeabbrev_cluster(Tuplesortstate *state, SortTuple *stups, int count); static void removeabbrev_index(Tuplesortstate *state, SortTuple *stups, int count); +static void removeabbrev_index_brin(Tuplesortstate *state, SortTuple *stups, + int count); static void removeabbrev_datum(Tuplesortstate *state, SortTuple *stups, int count); static int comparetup_heap(const SortTuple *a, const SortTuple *b, Tuplesortstate *state); +static int comparetup_heap_tiebreak(const SortTuple *a, const SortTuple *b, + Tuplesortstate *state); static void writetup_heap(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup); static void readtup_heap(Tuplesortstate *state, SortTuple *stup, LogicalTape *tape, unsigned int len); static int comparetup_cluster(const SortTuple *a, const SortTuple *b, Tuplesortstate *state); +static int comparetup_cluster_tiebreak(const SortTuple *a, const SortTuple *b, + Tuplesortstate *state); static void writetup_cluster(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup); static void readtup_cluster(Tuplesortstate *state, SortTuple *stup, LogicalTape *tape, unsigned int tuplen); static int comparetup_index_btree(const SortTuple *a, const SortTuple *b, Tuplesortstate *state); +static int comparetup_index_btree_tiebreak(const SortTuple *a, const SortTuple *b, + Tuplesortstate *state); static int comparetup_index_hash(const SortTuple *a, const SortTuple *b, Tuplesortstate *state); +static int comparetup_index_hash_tiebreak(const SortTuple *a, const SortTuple *b, + Tuplesortstate *state); +static int comparetup_index_brin(const SortTuple *a, const SortTuple *b, + Tuplesortstate *state); static void writetup_index(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup); static void readtup_index(Tuplesortstate *state, SortTuple *stup, LogicalTape *tape, unsigned int len); +static void writetup_index_brin(Tuplesortstate *state, LogicalTape *tape, + SortTuple *stup); +static void readtup_index_brin(Tuplesortstate *state, SortTuple *stup, + LogicalTape *tape, unsigned int len); static int comparetup_datum(const SortTuple *a, const SortTuple *b, Tuplesortstate *state); +static int comparetup_datum_tiebreak(const SortTuple *a, const SortTuple *b, + Tuplesortstate *state); static void writetup_datum(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup); static void readtup_datum(Tuplesortstate *state, SortTuple *stup, @@ -74,7 +93,7 @@ static void readtup_datum(Tuplesortstate *state, SortTuple *stup, static void freestate_cluster(Tuplesortstate *state); /* - * Data struture pointed by "TuplesortPublic.arg" for the CLUSTER case. Set by + * Data structure pointed by "TuplesortPublic.arg" for the CLUSTER case. Set by * the tuplesort_begin_cluster. */ typedef struct @@ -86,7 +105,7 @@ typedef struct } TuplesortClusterArg; /* - * Data struture pointed by "TuplesortPublic.arg" for the IndexTuple case. + * Data structure pointed by "TuplesortPublic.arg" for the IndexTuple case. * Set by tuplesort_begin_index_xxx and used only by the IndexTuple routines. */ typedef struct @@ -96,7 +115,7 @@ typedef struct } TuplesortIndexArg; /* - * Data struture pointed by "TuplesortPublic.arg" for the index_btree subcase. + * Data structure pointed by "TuplesortPublic.arg" for the index_btree subcase. */ typedef struct { @@ -107,7 +126,7 @@ typedef struct } TuplesortIndexBTreeArg; /* - * Data struture pointed by "TuplesortPublic.arg" for the index_hash subcase. + * Data structure pointed by "TuplesortPublic.arg" for the index_hash subcase. */ typedef struct { @@ -119,7 +138,7 @@ typedef struct } TuplesortIndexHashArg; /* - * Data struture pointed by "TuplesortPublic.arg" for the Datum case. + * Data structure pointed by "TuplesortPublic.arg" for the Datum case. * Set by tuplesort_begin_datum and used only by the DatumTuple routines. */ typedef struct @@ -130,6 +149,21 @@ typedef struct int datumTypeLen; } TuplesortDatumArg; +/* + * Computing BrinTuple size with only the tuple is difficult, so we want to track + * the length referenced by the SortTuple. That's what BrinSortTuple is meant + * to do - it's essentially a BrinTuple prefixed by its length. + */ +typedef struct BrinSortTuple +{ + Size tuplen; + BrinTuple tuple; +} BrinSortTuple; + +/* Size of the BrinSortTuple, given length of the BrinTuple. */ +#define BRINSORTTUPLE_SIZE(len) (offsetof(BrinSortTuple, tuple) + (len)) + + Tuplesortstate * tuplesort_begin_heap(TupleDesc tupDesc, int nkeys, AttrNumber *attNums, @@ -165,6 +199,7 @@ tuplesort_begin_heap(TupleDesc tupDesc, base->removeabbrev = removeabbrev_heap; base->comparetup = comparetup_heap; + base->comparetup_tiebreak = comparetup_heap_tiebreak; base->writetup = writetup_heap; base->readtup = readtup_heap; base->haveDatum1 = true; @@ -242,6 +277,7 @@ tuplesort_begin_cluster(TupleDesc tupDesc, base->removeabbrev = removeabbrev_cluster; base->comparetup = comparetup_cluster; + base->comparetup_tiebreak = comparetup_cluster_tiebreak; base->writetup = writetup_cluster; base->readtup = readtup_cluster; base->freestate = freestate_cluster; @@ -351,6 +387,7 @@ tuplesort_begin_index_btree(Relation heapRel, base->removeabbrev = removeabbrev_index; base->comparetup = comparetup_index_btree; + base->comparetup_tiebreak = comparetup_index_btree_tiebreak; base->writetup = writetup_index; base->readtup = readtup_index; base->haveDatum1 = true; @@ -431,6 +468,7 @@ tuplesort_begin_index_hash(Relation heapRel, base->removeabbrev = removeabbrev_index; base->comparetup = comparetup_index_hash; + base->comparetup_tiebreak = comparetup_index_hash_tiebreak; base->writetup = writetup_index; base->readtup = readtup_index; base->haveDatum1 = true; @@ -476,6 +514,7 @@ tuplesort_begin_index_gist(Relation heapRel, base->removeabbrev = removeabbrev_index; base->comparetup = comparetup_index_btree; + base->comparetup_tiebreak = comparetup_index_btree_tiebreak; base->writetup = writetup_index; base->readtup = readtup_index; base->haveDatum1 = true; @@ -512,6 +551,35 @@ tuplesort_begin_index_gist(Relation heapRel, return state; } +Tuplesortstate * +tuplesort_begin_index_brin(int workMem, + SortCoordinate coordinate, + int sortopt) +{ + Tuplesortstate *state = tuplesort_begin_common(workMem, coordinate, + sortopt); + TuplesortPublic *base = TuplesortstateGetPublic(state); + +#ifdef TRACE_SORT + if (trace_sort) + elog(LOG, + "begin index sort: workMem = %d, randomAccess = %c", + workMem, + sortopt & TUPLESORT_RANDOMACCESS ? 't' : 'f'); +#endif + + base->nKeys = 1; /* Only one sort column, the block number */ + + base->removeabbrev = removeabbrev_index_brin; + base->comparetup = comparetup_index_brin; + base->writetup = writetup_index_brin; + base->readtup = readtup_index_brin; + base->haveDatum1 = true; + base->arg = NULL; + + return state; +} + Tuplesortstate * tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation, bool nullsFirstFlag, int workMem, @@ -546,6 +614,7 @@ tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation, base->removeabbrev = removeabbrev_datum; base->comparetup = comparetup_datum; + base->comparetup_tiebreak = comparetup_datum_tiebreak; base->writetup = writetup_datum; base->readtup = readtup_datum; base->haveDatum1 = true; @@ -605,6 +674,7 @@ tuplesort_puttupleslot(Tuplesortstate *state, TupleTableSlot *slot) SortTuple stup; MinimalTuple tuple; HeapTupleData htup; + Size tuplen; /* copy the tuple into sort storage */ tuple = ExecCopySlotMinimalTuple(slot); @@ -617,9 +687,15 @@ tuplesort_puttupleslot(Tuplesortstate *state, TupleTableSlot *slot) tupDesc, &stup.isnull1); + /* GetMemoryChunkSpace is not supported for bump contexts */ + if (TupleSortUseBumpTupleCxt(base->sortopt)) + tuplen = MAXALIGN(tuple->t_len); + else + tuplen = GetMemoryChunkSpace(tuple); + tuplesort_puttuple_common(state, &stup, base->sortKeys->abbrev_converter && - !stup.isnull1); + !stup.isnull1, tuplen); MemoryContextSwitchTo(oldcontext); } @@ -636,6 +712,7 @@ tuplesort_putheaptuple(Tuplesortstate *state, HeapTuple tup) TuplesortPublic *base = TuplesortstateGetPublic(state); MemoryContext oldcontext = MemoryContextSwitchTo(base->tuplecontext); TuplesortClusterArg *arg = (TuplesortClusterArg *) base->arg; + Size tuplen; /* copy the tuple into sort storage */ tup = heap_copytuple(tup); @@ -653,10 +730,16 @@ tuplesort_putheaptuple(Tuplesortstate *state, HeapTuple tup) &stup.isnull1); } + /* GetMemoryChunkSpace is not supported for bump contexts */ + if (TupleSortUseBumpTupleCxt(base->sortopt)) + tuplen = MAXALIGN(HEAPTUPLESIZE + tup->t_len); + else + tuplen = GetMemoryChunkSpace(tup); + tuplesort_puttuple_common(state, &stup, base->haveDatum1 && base->sortKeys->abbrev_converter && - !stup.isnull1); + !stup.isnull1, tuplen); MemoryContextSwitchTo(oldcontext); } @@ -667,13 +750,14 @@ tuplesort_putheaptuple(Tuplesortstate *state, HeapTuple tup) */ void tuplesort_putindextuplevalues(Tuplesortstate *state, Relation rel, - ItemPointer self, Datum *values, - bool *isnull) + ItemPointer self, const Datum *values, + const bool *isnull) { SortTuple stup; IndexTuple tuple; TuplesortPublic *base = TuplesortstateGetPublic(state); TuplesortIndexArg *arg = (TuplesortIndexArg *) base->arg; + Size tuplen; stup.tuple = index_form_tuple_context(RelationGetDescr(rel), values, isnull, base->tuplecontext); @@ -685,10 +769,52 @@ tuplesort_putindextuplevalues(Tuplesortstate *state, Relation rel, RelationGetDescr(arg->indexRel), &stup.isnull1); + /* GetMemoryChunkSpace is not supported for bump contexts */ + if (TupleSortUseBumpTupleCxt(base->sortopt)) + tuplen = MAXALIGN(tuple->t_info & INDEX_SIZE_MASK); + else + tuplen = GetMemoryChunkSpace(tuple); + tuplesort_puttuple_common(state, &stup, base->sortKeys && base->sortKeys->abbrev_converter && - !stup.isnull1); + !stup.isnull1, tuplen); +} + +/* + * Collect one BRIN tuple while collecting input data for sort. + */ +void +tuplesort_putbrintuple(Tuplesortstate *state, BrinTuple *tuple, Size size) +{ + SortTuple stup; + BrinSortTuple *bstup; + TuplesortPublic *base = TuplesortstateGetPublic(state); + MemoryContext oldcontext = MemoryContextSwitchTo(base->tuplecontext); + Size tuplen; + + /* allocate space for the whole BRIN sort tuple */ + bstup = palloc(BRINSORTTUPLE_SIZE(size)); + + bstup->tuplen = size; + memcpy(&bstup->tuple, tuple, size); + + stup.tuple = bstup; + stup.datum1 = tuple->bt_blkno; + stup.isnull1 = false; + + /* GetMemoryChunkSpace is not supported for bump contexts */ + if (TupleSortUseBumpTupleCxt(base->sortopt)) + tuplen = MAXALIGN(BRINSORTTUPLE_SIZE(size)); + else + tuplen = GetMemoryChunkSpace(bstup); + + tuplesort_puttuple_common(state, &stup, + base->sortKeys && + base->sortKeys->abbrev_converter && + !stup.isnull1, tuplen); + + MemoryContextSwitchTo(oldcontext); } /* @@ -735,7 +861,7 @@ tuplesort_putdatum(Tuplesortstate *state, Datum val, bool isNull) tuplesort_puttuple_common(state, &stup, base->tuples && - base->sortKeys->abbrev_converter && !isNull); + base->sortKeys->abbrev_converter && !isNull, 0); MemoryContextSwitchTo(oldcontext); } @@ -834,6 +960,35 @@ tuplesort_getindextuple(Tuplesortstate *state, bool forward) return (IndexTuple) stup.tuple; } +/* + * Fetch the next BRIN tuple in either forward or back direction. + * Returns NULL if no more tuples. Returned tuple belongs to tuplesort memory + * context, and must not be freed by caller. Caller may not rely on tuple + * remaining valid after any further manipulation of tuplesort. + */ +BrinTuple * +tuplesort_getbrintuple(Tuplesortstate *state, Size *len, bool forward) +{ + TuplesortPublic *base = TuplesortstateGetPublic(state); + MemoryContext oldcontext = MemoryContextSwitchTo(base->sortcontext); + SortTuple stup; + BrinSortTuple *btup; + + if (!tuplesort_gettuple_common(state, forward, &stup)) + stup.tuple = NULL; + + MemoryContextSwitchTo(oldcontext); + + if (!stup.tuple) + return NULL; + + btup = (BrinSortTuple *) stup.tuple; + + *len = btup->tuplen; + + return &btup->tuple; +} + /* * Fetch the next Datum in either forward or back direction. * Returns false if no more datums. @@ -931,16 +1086,7 @@ comparetup_heap(const SortTuple *a, const SortTuple *b, Tuplesortstate *state) { TuplesortPublic *base = TuplesortstateGetPublic(state); SortSupport sortKey = base->sortKeys; - HeapTupleData ltup; - HeapTupleData rtup; - TupleDesc tupDesc; - int nkey; int32 compare; - AttrNumber attno; - Datum datum1, - datum2; - bool isnull1, - isnull2; /* Compare the leading sort key */ @@ -951,6 +1097,25 @@ comparetup_heap(const SortTuple *a, const SortTuple *b, Tuplesortstate *state) return compare; /* Compare additional sort keys */ + return comparetup_heap_tiebreak(a, b, state); +} + +static int +comparetup_heap_tiebreak(const SortTuple *a, const SortTuple *b, Tuplesortstate *state) +{ + TuplesortPublic *base = TuplesortstateGetPublic(state); + SortSupport sortKey = base->sortKeys; + HeapTupleData ltup; + HeapTupleData rtup; + TupleDesc tupDesc; + int nkey; + int32 compare; + AttrNumber attno; + Datum datum1, + datum2; + bool isnull1, + isnull2; + ltup.t_len = ((MinimalTuple) a->tuple)->t_len + MINIMAL_TUPLE_OFFSET; ltup.t_data = (HeapTupleHeader) ((char *) a->tuple - MINIMAL_TUPLE_OFFSET); rtup.t_len = ((MinimalTuple) b->tuple)->t_len + MINIMAL_TUPLE_OFFSET; @@ -1061,6 +1226,27 @@ removeabbrev_cluster(Tuplesortstate *state, SortTuple *stups, int count) static int comparetup_cluster(const SortTuple *a, const SortTuple *b, Tuplesortstate *state) +{ + TuplesortPublic *base = TuplesortstateGetPublic(state); + SortSupport sortKey = base->sortKeys; + int32 compare; + + /* Compare the leading sort key, if it's simple */ + if (base->haveDatum1) + { + compare = ApplySortComparator(a->datum1, a->isnull1, + b->datum1, b->isnull1, + sortKey); + if (compare != 0) + return compare; + } + + return comparetup_cluster_tiebreak(a, b, state); +} + +static int +comparetup_cluster_tiebreak(const SortTuple *a, const SortTuple *b, + Tuplesortstate *state) { TuplesortPublic *base = TuplesortstateGetPublic(state); TuplesortClusterArg *arg = (TuplesortClusterArg *) base->arg; @@ -1069,13 +1255,12 @@ comparetup_cluster(const SortTuple *a, const SortTuple *b, HeapTuple rtup; TupleDesc tupDesc; int nkey; - int32 compare; + int32 compare = 0; Datum datum1, datum2; bool isnull1, isnull2; - /* Be prepared to compare additional sort keys */ ltup = (HeapTuple) a->tuple; rtup = (HeapTuple) b->tuple; tupDesc = arg->tupDesc; @@ -1083,12 +1268,6 @@ comparetup_cluster(const SortTuple *a, const SortTuple *b, /* Compare the leading sort key, if it's simple */ if (base->haveDatum1) { - compare = ApplySortComparator(a->datum1, a->isnull1, - b->datum1, b->isnull1, - sortKey); - if (compare != 0) - return compare; - if (sortKey->abbrev_converter) { AttrNumber leading = arg->indexInfo->ii_IndexAttrNumbers[0]; @@ -1269,6 +1448,25 @@ comparetup_index_btree(const SortTuple *a, const SortTuple *b, * treatment for equal keys at the end. */ TuplesortPublic *base = TuplesortstateGetPublic(state); + SortSupport sortKey = base->sortKeys; + int32 compare; + + /* Compare the leading sort key */ + compare = ApplySortComparator(a->datum1, a->isnull1, + b->datum1, b->isnull1, + sortKey); + if (compare != 0) + return compare; + + /* Compare additional sort keys */ + return comparetup_index_btree_tiebreak(a, b, state); +} + +static int +comparetup_index_btree_tiebreak(const SortTuple *a, const SortTuple *b, + Tuplesortstate *state) +{ + TuplesortPublic *base = TuplesortstateGetPublic(state); TuplesortIndexBTreeArg *arg = (TuplesortIndexBTreeArg *) base->arg; SortSupport sortKey = base->sortKeys; IndexTuple tuple1; @@ -1283,15 +1481,6 @@ comparetup_index_btree(const SortTuple *a, const SortTuple *b, bool isnull1, isnull2; - - /* Compare the leading sort key */ - compare = ApplySortComparator(a->datum1, a->isnull1, - b->datum1, b->isnull1, - sortKey); - if (compare != 0) - return compare; - - /* Compare additional sort keys */ tuple1 = (IndexTuple) a->tuple; tuple2 = (IndexTuple) b->tuple; keysz = base->nKeys; @@ -1467,6 +1656,19 @@ comparetup_index_hash(const SortTuple *a, const SortTuple *b, return 0; } +/* + * Sorting for hash indexes only uses one sort key, so this shouldn't ever be + * called. It's only here for consistency. + */ +static int +comparetup_index_hash_tiebreak(const SortTuple *a, const SortTuple *b, + Tuplesortstate *state) +{ + Assert(false); + + return 0; +} + static void writetup_index(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup) { @@ -1501,6 +1703,80 @@ readtup_index(Tuplesortstate *state, SortTuple *stup, &stup->isnull1); } +/* + * Routines specialized for BrinTuple case + */ + +static void +removeabbrev_index_brin(Tuplesortstate *state, SortTuple *stups, int count) +{ + int i; + + for (i = 0; i < count; i++) + { + BrinSortTuple *tuple; + + tuple = stups[i].tuple; + stups[i].datum1 = tuple->tuple.bt_blkno; + } +} + +static int +comparetup_index_brin(const SortTuple *a, const SortTuple *b, + Tuplesortstate *state) +{ + Assert(TuplesortstateGetPublic(state)->haveDatum1); + + if (DatumGetUInt32(a->datum1) > DatumGetUInt32(b->datum1)) + return 1; + + if (DatumGetUInt32(a->datum1) < DatumGetUInt32(b->datum1)) + return -1; + + /* silence compilers */ + return 0; +} + +static void +writetup_index_brin(Tuplesortstate *state, LogicalTape *tape, SortTuple *stup) +{ + TuplesortPublic *base = TuplesortstateGetPublic(state); + BrinSortTuple *tuple = (BrinSortTuple *) stup->tuple; + unsigned int tuplen = tuple->tuplen; + + tuplen = tuplen + sizeof(tuplen); + LogicalTapeWrite(tape, &tuplen, sizeof(tuplen)); + LogicalTapeWrite(tape, &tuple->tuple, tuple->tuplen); + if (base->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length word? */ + LogicalTapeWrite(tape, &tuplen, sizeof(tuplen)); +} + +static void +readtup_index_brin(Tuplesortstate *state, SortTuple *stup, + LogicalTape *tape, unsigned int len) +{ + BrinSortTuple *tuple; + TuplesortPublic *base = TuplesortstateGetPublic(state); + unsigned int tuplen = len - sizeof(unsigned int); + + /* + * Allocate space for the BRIN sort tuple, which is BrinTuple with an + * extra length field. + */ + tuple = (BrinSortTuple *) tuplesort_readtup_alloc(state, + BRINSORTTUPLE_SIZE(tuplen)); + + tuple->tuplen = tuplen; + + LogicalTapeReadExact(tape, &tuple->tuple, tuplen); + if (base->sortopt & TUPLESORT_RANDOMACCESS) /* need trailing length word? */ + LogicalTapeReadExact(tape, &tuplen, sizeof(tuplen)); + stup->tuple = (void *) tuple; + + /* set up first-column key value, which is block number */ + stup->datum1 = tuple->tuple.bt_blkno; +} + /* * Routines specialized for DatumTuple case */ @@ -1526,8 +1802,16 @@ comparetup_datum(const SortTuple *a, const SortTuple *b, Tuplesortstate *state) if (compare != 0) return compare; - /* if we have abbreviations, then "tuple" has the original value */ + return comparetup_datum_tiebreak(a, b, state); +} + +static int +comparetup_datum_tiebreak(const SortTuple *a, const SortTuple *b, Tuplesortstate *state) +{ + TuplesortPublic *base = TuplesortstateGetPublic(state); + int32 compare = 0; + /* if we have abbreviations, then "tuple" has the original value */ if (base->sortKeys->abbrev_converter) compare = ApplySortAbbrevFullComparator(PointerGetDatum(a->tuple), a->isnull1, PointerGetDatum(b->tuple), b->isnull1, diff --git a/src/backend/utils/sort/tuplestore.c b/src/backend/utils/sort/tuplestore.c index f60633df241b0..947a868e569ce 100644 --- a/src/backend/utils/sort/tuplestore.c +++ b/src/backend/utils/sort/tuplestore.c @@ -43,7 +43,7 @@ * before switching to the other state or activating a different read pointer. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -73,7 +73,7 @@ typedef enum { TSS_INMEM, /* Tuples still fit in memory */ TSS_WRITEFILE, /* Writing to temp file */ - TSS_READFILE /* Reading from temp file */ + TSS_READFILE, /* Reading from temp file */ } TupStoreStatus; /* @@ -748,7 +748,7 @@ tuplestore_puttuple(Tuplestorestate *state, HeapTuple tuple) */ void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, - Datum *values, bool *isnull) + const Datum *values, const bool *isnull) { MinimalTuple tuple; MemoryContext oldcxt = MemoryContextSwitchTo(state->context); diff --git a/src/backend/utils/time/combocid.c b/src/backend/utils/time/combocid.c index 0e94bc93f748d..f85510b74ff1c 100644 --- a/src/backend/utils/time/combocid.c +++ b/src/backend/utils/time/combocid.c @@ -4,7 +4,7 @@ * Combo command ID support routines * * Before version 8.3, HeapTupleHeaderData had separate fields for cmin - * and cmax. To reduce the header size, cmin and cmax are now overlayed + * and cmax. To reduce the header size, cmin and cmax are now overlaid * in the same field in the header. That usually works because you rarely * insert and delete a tuple in the same transaction, and we don't need * either field to remain valid after the originating transaction exits. @@ -30,7 +30,7 @@ * destroyed at the end of each transaction. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/backend/utils/time/meson.build b/src/backend/utils/time/meson.build index 36166b20bfa45..ea8943f70d4fa 100644 --- a/src/backend/utils/time/meson.build +++ b/src/backend/utils/time/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group backend_sources += files( 'combocid.c', diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c index 3a419e348fa18..b41c307237f09 100644 --- a/src/backend/utils/time/snapmgr.c +++ b/src/backend/utils/time/snapmgr.c @@ -35,7 +35,7 @@ * stack is empty. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -51,34 +51,19 @@ #include "access/subtrans.h" #include "access/transam.h" #include "access/xact.h" -#include "access/xlog.h" -#include "catalog/catalog.h" #include "datatype/timestamp.h" #include "lib/pairingheap.h" #include "miscadmin.h" #include "port/pg_lfind.h" +#include "storage/fd.h" #include "storage/predicate.h" #include "storage/proc.h" #include "storage/procarray.h" -#include "storage/sinval.h" -#include "storage/sinvaladt.h" -#include "storage/spin.h" #include "utils/builtins.h" #include "utils/memutils.h" -#include "utils/old_snapshot.h" -#include "utils/rel.h" -#include "utils/resowner_private.h" +#include "utils/resowner.h" #include "utils/snapmgr.h" #include "utils/syscache.h" -#include "utils/timestamp.h" - - -/* - * GUC parameters - */ -int old_snapshot_threshold; /* number of minutes, -1 disables */ - -volatile OldSnapshotControlData *oldSnapshotControl; /* @@ -170,11 +155,35 @@ typedef struct ExportedSnapshot static List *exportedSnapshots = NIL; /* Prototypes for local functions */ -static TimestampTz AlignTimestampToMinuteBoundary(TimestampTz ts); static Snapshot CopySnapshot(Snapshot snapshot); +static void UnregisterSnapshotNoOwner(Snapshot snapshot); static void FreeSnapshot(Snapshot snapshot); static void SnapshotResetXmin(void); +/* ResourceOwner callbacks to track snapshot references */ +static void ResOwnerReleaseSnapshot(Datum res); + +static const ResourceOwnerDesc snapshot_resowner_desc = +{ + .name = "snapshot reference", + .release_phase = RESOURCE_RELEASE_AFTER_LOCKS, + .release_priority = RELEASE_PRIO_SNAPSHOT_REFS, + .ReleaseResource = ResOwnerReleaseSnapshot, + .DebugPrint = NULL /* the default message is fine */ +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberSnapshot(ResourceOwner owner, Snapshot snap) +{ + ResourceOwnerRemember(owner, PointerGetDatum(snap), &snapshot_resowner_desc); +} +static inline void +ResourceOwnerForgetSnapshot(ResourceOwner owner, Snapshot snap) +{ + ResourceOwnerForget(owner, PointerGetDatum(snap), &snapshot_resowner_desc); +} + /* * Snapshot fields to be serialized. * @@ -194,50 +203,6 @@ typedef struct SerializedSnapshotData XLogRecPtr lsn; } SerializedSnapshotData; -Size -SnapMgrShmemSize(void) -{ - Size size; - - size = offsetof(OldSnapshotControlData, xid_by_minute); - if (old_snapshot_threshold > 0) - size = add_size(size, mul_size(sizeof(TransactionId), - OLD_SNAPSHOT_TIME_MAP_ENTRIES)); - - return size; -} - -/* - * Initialize for managing old snapshot detection. - */ -void -SnapMgrInit(void) -{ - bool found; - - /* - * Create or attach to the OldSnapshotControlData structure. - */ - oldSnapshotControl = (volatile OldSnapshotControlData *) - ShmemInitStruct("OldSnapshotControlData", - SnapMgrShmemSize(), &found); - - if (!found) - { - SpinLockInit(&oldSnapshotControl->mutex_current); - oldSnapshotControl->current_timestamp = 0; - SpinLockInit(&oldSnapshotControl->mutex_latest_xmin); - oldSnapshotControl->latest_xmin = InvalidTransactionId; - oldSnapshotControl->next_map_update = 0; - SpinLockInit(&oldSnapshotControl->mutex_threshold); - oldSnapshotControl->threshold_timestamp = 0; - oldSnapshotControl->threshold_xid = InvalidTransactionId; - oldSnapshotControl->head_offset = 0; - oldSnapshotControl->head_timestamp = 0; - oldSnapshotControl->count_used = 0; - } -} - /* * GetTransactionSnapshot * Get the appropriate snapshot for a new query in a transaction. @@ -850,7 +815,7 @@ RegisterSnapshotOnOwner(Snapshot snapshot, ResourceOwner owner) snap = snapshot->copied ? snapshot : CopySnapshot(snapshot); /* and tell resowner.c about it */ - ResourceOwnerEnlargeSnapshots(owner); + ResourceOwnerEnlarge(owner); snap->regd_count++; ResourceOwnerRememberSnapshot(owner, snap); @@ -886,11 +851,16 @@ UnregisterSnapshotFromOwner(Snapshot snapshot, ResourceOwner owner) if (snapshot == NULL) return; + ResourceOwnerForgetSnapshot(owner, snapshot); + UnregisterSnapshotNoOwner(snapshot); +} + +static void +UnregisterSnapshotNoOwner(Snapshot snapshot) +{ Assert(snapshot->regd_count > 0); Assert(!pairingheap_is_empty(&RegisteredSnapshots)); - ResourceOwnerForgetSnapshot(owner, snapshot); - snapshot->regd_count--; if (snapshot->regd_count == 0) pairingheap_remove(&RegisteredSnapshots, &snapshot->ph_node); @@ -950,7 +920,7 @@ SnapshotResetXmin(void) if (pairingheap_is_empty(&RegisteredSnapshots)) { - MyProc->xmin = InvalidTransactionId; + MyProc->xmin = TransactionXmin = InvalidTransactionId; return; } @@ -958,7 +928,7 @@ SnapshotResetXmin(void) pairingheap_first(&RegisteredSnapshots)); if (TransactionIdPrecedes(MyProc->xmin, minSnapshot->xmin)) - MyProc->xmin = minSnapshot->xmin; + MyProc->xmin = TransactionXmin = minSnapshot->xmin; } /* @@ -1177,7 +1147,8 @@ ExportSnapshot(Snapshot snapshot) * inside the transaction from 1. */ snprintf(path, sizeof(path), SNAPSHOT_EXPORT_DIR "/%08X-%08X-%d", - MyProc->backendId, MyProc->lxid, list_length(exportedSnapshots) + 1); + MyProc->vxid.procNumber, MyProc->vxid.lxid, + list_length(exportedSnapshots) + 1); /* * Copy the snapshot into TopTransactionContext, add it to the @@ -1204,7 +1175,7 @@ ExportSnapshot(Snapshot snapshot) */ initStringInfo(&buf); - appendStringInfo(&buf, "vxid:%d/%u\n", MyProc->backendId, MyProc->lxid); + appendStringInfo(&buf, "vxid:%d/%u\n", MyProc->vxid.procNumber, MyProc->vxid.lxid); appendStringInfo(&buf, "pid:%d\n", MyProcPid); appendStringInfo(&buf, "dbid:%u\n", MyDatabaseId); appendStringInfo(&buf, "iso:%d\n", XactIsoLevel); @@ -1374,7 +1345,7 @@ parseVxidFromText(const char *prefix, char **s, const char *filename, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid snapshot data in file \"%s\"", filename))); ptr += prefixlen; - if (sscanf(ptr, "%d/%u", &vxid->backendId, &vxid->localTransactionId) != 2) + if (sscanf(ptr, "%d/%u", &vxid->procNumber, &vxid->localTransactionId) != 2) ereport(ERROR, (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION), errmsg("invalid snapshot data in file \"%s\"", filename))); @@ -1444,9 +1415,21 @@ ImportSnapshot(const char *idstr) f = AllocateFile(path, PG_BINARY_R); if (!f) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("invalid snapshot identifier: \"%s\"", idstr))); + { + /* + * If file is missing while identifier has a correct format, avoid + * system errors. + */ + if (errno == ENOENT) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("snapshot \"%s\" does not exist", idstr))); + else + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\" for reading: %m", + path))); + } /* get the size of the file so that we know how much memory we need */ if (fstat(fileno(f), &stat_buf)) @@ -1656,420 +1639,6 @@ HaveRegisteredOrActiveSnapshot(void) } -/* - * Return a timestamp that is exactly on a minute boundary. - * - * If the argument is already aligned, return that value, otherwise move to - * the next minute boundary following the given time. - */ -static TimestampTz -AlignTimestampToMinuteBoundary(TimestampTz ts) -{ - TimestampTz retval = ts + (USECS_PER_MINUTE - 1); - - return retval - (retval % USECS_PER_MINUTE); -} - -/* - * Get current timestamp for snapshots - * - * This is basically GetCurrentTimestamp(), but with a guarantee that - * the result never moves backward. - */ -TimestampTz -GetSnapshotCurrentTimestamp(void) -{ - TimestampTz now = GetCurrentTimestamp(); - - /* - * Don't let time move backward; if it hasn't advanced, use the old value. - */ - SpinLockAcquire(&oldSnapshotControl->mutex_current); - if (now <= oldSnapshotControl->current_timestamp) - now = oldSnapshotControl->current_timestamp; - else - oldSnapshotControl->current_timestamp = now; - SpinLockRelease(&oldSnapshotControl->mutex_current); - - return now; -} - -/* - * Get timestamp through which vacuum may have processed based on last stored - * value for threshold_timestamp. - * - * XXX: So far, we never trust that a 64-bit value can be read atomically; if - * that ever changes, we could get rid of the spinlock here. - */ -TimestampTz -GetOldSnapshotThresholdTimestamp(void) -{ - TimestampTz threshold_timestamp; - - SpinLockAcquire(&oldSnapshotControl->mutex_threshold); - threshold_timestamp = oldSnapshotControl->threshold_timestamp; - SpinLockRelease(&oldSnapshotControl->mutex_threshold); - - return threshold_timestamp; -} - -void -SetOldSnapshotThresholdTimestamp(TimestampTz ts, TransactionId xlimit) -{ - SpinLockAcquire(&oldSnapshotControl->mutex_threshold); - Assert(oldSnapshotControl->threshold_timestamp <= ts); - Assert(TransactionIdPrecedesOrEquals(oldSnapshotControl->threshold_xid, xlimit)); - oldSnapshotControl->threshold_timestamp = ts; - oldSnapshotControl->threshold_xid = xlimit; - SpinLockRelease(&oldSnapshotControl->mutex_threshold); -} - -/* - * XXX: Magic to keep old_snapshot_threshold tests appear "working". They - * currently are broken, and discussion of what to do about them is - * ongoing. See - * https://www.postgresql.org/message-id/20200403001235.e6jfdll3gh2ygbuc%40alap3.anarazel.de - */ -void -SnapshotTooOldMagicForTest(void) -{ - TimestampTz ts = GetSnapshotCurrentTimestamp(); - - Assert(old_snapshot_threshold == 0); - - ts -= 5 * USECS_PER_SEC; - - SpinLockAcquire(&oldSnapshotControl->mutex_threshold); - oldSnapshotControl->threshold_timestamp = ts; - SpinLockRelease(&oldSnapshotControl->mutex_threshold); -} - -/* - * If there is a valid mapping for the timestamp, set *xlimitp to - * that. Returns whether there is such a mapping. - */ -static bool -GetOldSnapshotFromTimeMapping(TimestampTz ts, TransactionId *xlimitp) -{ - bool in_mapping = false; - - Assert(ts == AlignTimestampToMinuteBoundary(ts)); - - LWLockAcquire(OldSnapshotTimeMapLock, LW_SHARED); - - if (oldSnapshotControl->count_used > 0 - && ts >= oldSnapshotControl->head_timestamp) - { - int offset; - - offset = ((ts - oldSnapshotControl->head_timestamp) - / USECS_PER_MINUTE); - if (offset > oldSnapshotControl->count_used - 1) - offset = oldSnapshotControl->count_used - 1; - offset = (oldSnapshotControl->head_offset + offset) - % OLD_SNAPSHOT_TIME_MAP_ENTRIES; - - *xlimitp = oldSnapshotControl->xid_by_minute[offset]; - - in_mapping = true; - } - - LWLockRelease(OldSnapshotTimeMapLock); - - return in_mapping; -} - -/* - * TransactionIdLimitedForOldSnapshots - * - * Apply old snapshot limit. This is intended to be called for page pruning - * and table vacuuming, to allow old_snapshot_threshold to override the normal - * global xmin value. Actual testing for snapshot too old will be based on - * whether a snapshot timestamp is prior to the threshold timestamp set in - * this function. - * - * If the limited horizon allows a cleanup action that otherwise would not be - * possible, SetOldSnapshotThresholdTimestamp(*limit_ts, *limit_xid) needs to - * be called before that cleanup action. - */ -bool -TransactionIdLimitedForOldSnapshots(TransactionId recentXmin, - Relation relation, - TransactionId *limit_xid, - TimestampTz *limit_ts) -{ - TimestampTz ts; - TransactionId xlimit = recentXmin; - TransactionId latest_xmin; - TimestampTz next_map_update_ts; - TransactionId threshold_timestamp; - TransactionId threshold_xid; - - Assert(TransactionIdIsNormal(recentXmin)); - Assert(OldSnapshotThresholdActive()); - Assert(limit_ts != NULL && limit_xid != NULL); - - /* - * TestForOldSnapshot() assumes early pruning advances the page LSN, so we - * can't prune early when skipping WAL. - */ - if (!RelationAllowsEarlyPruning(relation) || !RelationNeedsWAL(relation)) - return false; - - ts = GetSnapshotCurrentTimestamp(); - - SpinLockAcquire(&oldSnapshotControl->mutex_latest_xmin); - latest_xmin = oldSnapshotControl->latest_xmin; - next_map_update_ts = oldSnapshotControl->next_map_update; - SpinLockRelease(&oldSnapshotControl->mutex_latest_xmin); - - /* - * Zero threshold always overrides to latest xmin, if valid. Without some - * heuristic it will find its own snapshot too old on, for example, a - * simple UPDATE -- which would make it useless for most testing, but - * there is no principled way to ensure that it doesn't fail in this way. - * Use a five-second delay to try to get useful testing behavior, but this - * may need adjustment. - */ - if (old_snapshot_threshold == 0) - { - if (TransactionIdPrecedes(latest_xmin, MyProc->xmin) - && TransactionIdFollows(latest_xmin, xlimit)) - xlimit = latest_xmin; - - ts -= 5 * USECS_PER_SEC; - } - else - { - ts = AlignTimestampToMinuteBoundary(ts) - - (old_snapshot_threshold * USECS_PER_MINUTE); - - /* Check for fast exit without LW locking. */ - SpinLockAcquire(&oldSnapshotControl->mutex_threshold); - threshold_timestamp = oldSnapshotControl->threshold_timestamp; - threshold_xid = oldSnapshotControl->threshold_xid; - SpinLockRelease(&oldSnapshotControl->mutex_threshold); - - if (ts == threshold_timestamp) - { - /* - * Current timestamp is in same bucket as the last limit that was - * applied. Reuse. - */ - xlimit = threshold_xid; - } - else if (ts == next_map_update_ts) - { - /* - * FIXME: This branch is super iffy - but that should probably - * fixed separately. - */ - xlimit = latest_xmin; - } - else if (GetOldSnapshotFromTimeMapping(ts, &xlimit)) - { - } - - /* - * Failsafe protection against vacuuming work of active transaction. - * - * This is not an assertion because we avoid the spinlock for - * performance, leaving open the possibility that xlimit could advance - * and be more current; but it seems prudent to apply this limit. It - * might make pruning a tiny bit less aggressive than it could be, but - * protects against data loss bugs. - */ - if (TransactionIdIsNormal(latest_xmin) - && TransactionIdPrecedes(latest_xmin, xlimit)) - xlimit = latest_xmin; - } - - if (TransactionIdIsValid(xlimit) && - TransactionIdFollowsOrEquals(xlimit, recentXmin)) - { - *limit_ts = ts; - *limit_xid = xlimit; - - return true; - } - - return false; -} - -/* - * Take care of the circular buffer that maps time to xid. - */ -void -MaintainOldSnapshotTimeMapping(TimestampTz whenTaken, TransactionId xmin) -{ - TimestampTz ts; - TransactionId latest_xmin; - TimestampTz update_ts; - bool map_update_required = false; - - /* Never call this function when old snapshot checking is disabled. */ - Assert(old_snapshot_threshold >= 0); - - ts = AlignTimestampToMinuteBoundary(whenTaken); - - /* - * Keep track of the latest xmin seen by any process. Update mapping with - * a new value when we have crossed a bucket boundary. - */ - SpinLockAcquire(&oldSnapshotControl->mutex_latest_xmin); - latest_xmin = oldSnapshotControl->latest_xmin; - update_ts = oldSnapshotControl->next_map_update; - if (ts > update_ts) - { - oldSnapshotControl->next_map_update = ts; - map_update_required = true; - } - if (TransactionIdFollows(xmin, latest_xmin)) - oldSnapshotControl->latest_xmin = xmin; - SpinLockRelease(&oldSnapshotControl->mutex_latest_xmin); - - /* We only needed to update the most recent xmin value. */ - if (!map_update_required) - return; - - /* No further tracking needed for 0 (used for testing). */ - if (old_snapshot_threshold == 0) - return; - - /* - * We don't want to do something stupid with unusual values, but we don't - * want to litter the log with warnings or break otherwise normal - * processing for this feature; so if something seems unreasonable, just - * log at DEBUG level and return without doing anything. - */ - if (whenTaken < 0) - { - elog(DEBUG1, - "MaintainOldSnapshotTimeMapping called with negative whenTaken = %ld", - (long) whenTaken); - return; - } - if (!TransactionIdIsNormal(xmin)) - { - elog(DEBUG1, - "MaintainOldSnapshotTimeMapping called with xmin = %lu", - (unsigned long) xmin); - return; - } - - LWLockAcquire(OldSnapshotTimeMapLock, LW_EXCLUSIVE); - - Assert(oldSnapshotControl->head_offset >= 0); - Assert(oldSnapshotControl->head_offset < OLD_SNAPSHOT_TIME_MAP_ENTRIES); - Assert((oldSnapshotControl->head_timestamp % USECS_PER_MINUTE) == 0); - Assert(oldSnapshotControl->count_used >= 0); - Assert(oldSnapshotControl->count_used <= OLD_SNAPSHOT_TIME_MAP_ENTRIES); - - if (oldSnapshotControl->count_used == 0) - { - /* set up first entry for empty mapping */ - oldSnapshotControl->head_offset = 0; - oldSnapshotControl->head_timestamp = ts; - oldSnapshotControl->count_used = 1; - oldSnapshotControl->xid_by_minute[0] = xmin; - } - else if (ts < oldSnapshotControl->head_timestamp) - { - /* old ts; log it at DEBUG */ - LWLockRelease(OldSnapshotTimeMapLock); - elog(DEBUG1, - "MaintainOldSnapshotTimeMapping called with old whenTaken = %ld", - (long) whenTaken); - return; - } - else if (ts <= (oldSnapshotControl->head_timestamp + - ((oldSnapshotControl->count_used - 1) - * USECS_PER_MINUTE))) - { - /* existing mapping; advance xid if possible */ - int bucket = (oldSnapshotControl->head_offset - + ((ts - oldSnapshotControl->head_timestamp) - / USECS_PER_MINUTE)) - % OLD_SNAPSHOT_TIME_MAP_ENTRIES; - - if (TransactionIdPrecedes(oldSnapshotControl->xid_by_minute[bucket], xmin)) - oldSnapshotControl->xid_by_minute[bucket] = xmin; - } - else - { - /* We need a new bucket, but it might not be the very next one. */ - int distance_to_new_tail; - int distance_to_current_tail; - int advance; - - /* - * Our goal is for the new "tail" of the mapping, that is, the entry - * which is newest and thus furthest from the "head" entry, to - * correspond to "ts". Since there's one entry per minute, the - * distance between the current head and the new tail is just the - * number of minutes of difference between ts and the current - * head_timestamp. - * - * The distance from the current head to the current tail is one less - * than the number of entries in the mapping, because the entry at the - * head_offset is for 0 minutes after head_timestamp. - * - * The difference between these two values is the number of minutes by - * which we need to advance the mapping, either adding new entries or - * rotating old ones out. - */ - distance_to_new_tail = - (ts - oldSnapshotControl->head_timestamp) / USECS_PER_MINUTE; - distance_to_current_tail = - oldSnapshotControl->count_used - 1; - advance = distance_to_new_tail - distance_to_current_tail; - Assert(advance > 0); - - if (advance >= OLD_SNAPSHOT_TIME_MAP_ENTRIES) - { - /* Advance is so far that all old data is junk; start over. */ - oldSnapshotControl->head_offset = 0; - oldSnapshotControl->count_used = 1; - oldSnapshotControl->xid_by_minute[0] = xmin; - oldSnapshotControl->head_timestamp = ts; - } - else - { - /* Store the new value in one or more buckets. */ - int i; - - for (i = 0; i < advance; i++) - { - if (oldSnapshotControl->count_used == OLD_SNAPSHOT_TIME_MAP_ENTRIES) - { - /* Map full and new value replaces old head. */ - int old_head = oldSnapshotControl->head_offset; - - if (old_head == (OLD_SNAPSHOT_TIME_MAP_ENTRIES - 1)) - oldSnapshotControl->head_offset = 0; - else - oldSnapshotControl->head_offset = old_head + 1; - oldSnapshotControl->xid_by_minute[old_head] = xmin; - oldSnapshotControl->head_timestamp += USECS_PER_MINUTE; - } - else - { - /* Extend map to unused entry. */ - int new_tail = (oldSnapshotControl->head_offset - + oldSnapshotControl->count_used) - % OLD_SNAPSHOT_TIME_MAP_ENTRIES; - - oldSnapshotControl->count_used++; - oldSnapshotControl->xid_by_minute[new_tail] = xmin; - } - } - } - } - - LWLockRelease(OldSnapshotTimeMapLock); -} - - /* * Setup a snapshot that replaces normal catalog snapshots that allows catalog * access to behave just like it did at a certain point in the past. @@ -2379,3 +1948,11 @@ XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot) return false; } + +/* ResourceOwner callbacks */ + +static void +ResOwnerReleaseSnapshot(Datum res) +{ + UnregisterSnapshotNoOwner((Snapshot) DatumGetPointer(res)); +} diff --git a/src/bin/Makefile b/src/bin/Makefile index 373077bf52b2e..fc789da17bb5a 100644 --- a/src/bin/Makefile +++ b/src/bin/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin (client programs) # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/bin/Makefile @@ -19,6 +19,7 @@ SUBDIRS = \ pg_archivecleanup \ pg_basebackup \ pg_checksums \ + pg_combinebackup \ pg_config \ pg_controldata \ pg_ctl \ @@ -30,6 +31,7 @@ SUBDIRS = \ pg_upgrade \ pg_verifybackup \ pg_waldump \ + pg_walsummary \ pgbench \ psql \ scripts diff --git a/src/bin/initdb/Makefile b/src/bin/initdb/Makefile index d69bd89572ad7..031cc77c9d61b 100644 --- a/src/bin/initdb/Makefile +++ b/src/bin/initdb/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/initdb # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/bin/initdb/Makefile @@ -16,13 +16,12 @@ subdir = src/bin/initdb top_builddir = ../../.. include $(top_builddir)/src/Makefile.global -override CPPFLAGS := -I$(libpq_srcdir) -I$(top_srcdir)/src/timezone $(ICU_CFLAGS) $(CPPFLAGS) - # Note: it's important that we link to encnames.o from libpgcommon, not # from libpq, else we have risks of version skew if we run with a libpq -# shared library from a different PG version. The libpq_pgport macro -# should ensure that that happens. -# +# shared library from a different PG version. Define +# USE_PRIVATE_ENCODING_FUNCS to ensure that that happens. +override CPPFLAGS := -DUSE_PRIVATE_ENCODING_FUNCS -I$(libpq_srcdir) -I$(top_srcdir)/src/timezone $(ICU_CFLAGS) $(CPPFLAGS) + # We need libpq only because fe_utils does. LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) $(ICU_LIBS) @@ -55,7 +54,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/initdb$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f initdb$(X) $(OBJS) localtime.c rm -rf tmp_check diff --git a/src/bin/initdb/findtimezone.c b/src/bin/initdb/findtimezone.c index 5bf2a307a02a3..95204e482be0a 100644 --- a/src/bin/initdb/findtimezone.c +++ b/src/bin/initdb/findtimezone.c @@ -3,7 +3,7 @@ * findtimezone.c * Functions for determining the default timezone to use. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/initdb/findtimezone.c @@ -680,8 +680,8 @@ scan_available_timezones(char *tzdir, char *tzdirsub, struct tztry *tt, if (stat(tzdir, &statbuf) != 0) { #ifdef DEBUG_IDENTIFY_TIMEZONE - fprintf(stderr, "could not stat \"%s\": %s\n", - tzdir, strerror(errno)); + fprintf(stderr, "could not stat \"%s\": %m\n", + tzdir); #endif tzdir[tzdir_orig_len] = '\0'; continue; diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index fc1fb363e745b..f2c61bc56377c 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -38,7 +38,7 @@ * * This code is released under the terms of the PostgreSQL License. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/initdb/initdb.c @@ -76,6 +76,7 @@ #include "common/restricted_token.h" #include "common/string.h" #include "common/username.h" +#include "fe_utils/option_utils.h" #include "fe_utils/string_utils.h" #include "getopt_long.h" #include "mb/pg_wchar.h" @@ -101,7 +102,7 @@ static const char *const auth_methods_host[] = { "sspi", #endif #ifdef USE_PAM - "pam", "pam ", + "pam", #endif #ifdef USE_BSD_AUTH "bsd", @@ -117,7 +118,7 @@ static const char *const auth_methods_host[] = { static const char *const auth_methods_local[] = { "trust", "reject", "scram-sha-256", "md5", "password", "peer", "radius", #ifdef USE_PAM - "pam", "pam ", + "pam", #endif #ifdef USE_BSD_AUTH "bsd", @@ -144,7 +145,9 @@ static char *lc_numeric = NULL; static char *lc_time = NULL; static char *lc_messages = NULL; static char locale_provider = COLLPROVIDER_LIBC; -static char *icu_locale = NULL; +static bool builtin_locale_specified = false; +static char *datlocale = NULL; +static bool icu_locale_specified = false; static char *icu_rules = NULL; static const char *default_text_search_config = NULL; static char *username = NULL; @@ -163,8 +166,8 @@ static bool sync_only = false; static bool show_setting = false; static bool data_checksums = false; static char *xlog_dir = NULL; -static char *str_wal_segment_size_mb = NULL; -static int wal_segment_size_mb; +static int wal_segment_size_mb = (DEFAULT_XLOG_SEG_SIZE) / (1024 * 1024); +static DataDirSyncMethod sync_method = DATA_DIR_SYNC_METHOD_FSYNC; /* internal vars */ @@ -217,8 +220,8 @@ static bool authwarning = false; * but here it is more convenient to pass it as an environment variable * (no quoting to worry about). */ -static const char *boot_options = "-F -c log_checkpoints=false"; -static const char *backend_options = "--single -F -O -j -c search_path=pg_catalog -c exit_on_error=true -c log_checkpoints=false"; +static const char *const boot_options = "-F -c log_checkpoints=false"; +static const char *const backend_options = "--single -F -O -j -c search_path=pg_catalog -c exit_on_error=true -c log_checkpoints=false"; /* Additional switches to pass to backend (either boot or standalone) */ static char *extra_options = ""; @@ -226,6 +229,7 @@ static char *extra_options = ""; static const char *const subdirs[] = { "global", "pg_wal/archive_status", + "pg_wal/summaries", "pg_commit_ts", "pg_dynshmem", "pg_notify", @@ -309,16 +313,16 @@ void initialize_data_directory(void); /* * macros for running pipes to postgres */ -#define PG_CMD_DECL char cmd[MAXPGPATH]; FILE *cmdfd +#define PG_CMD_DECL FILE *cmdfd -#define PG_CMD_OPEN \ +#define PG_CMD_OPEN(cmd) \ do { \ cmdfd = popen_check(cmd, "w"); \ if (cmdfd == NULL) \ exit(1); /* message already printed by popen_check */ \ } while (0) -#define PG_CMD_CLOSE \ +#define PG_CMD_CLOSE() \ do { \ if (pclose_check(cmdfd)) \ exit(1); /* message already printed by pclose_check */ \ @@ -336,6 +340,61 @@ do { \ output_failed = true, output_errno = errno; \ } while (0) +#ifdef WIN32 +typedef wchar_t *save_locale_t; +#else +typedef char *save_locale_t; +#endif + +/* + * Save a copy of the current global locale's name, for the given category. + * The returned value must be passed to restore_global_locale(). + * + * Since names from the environment haven't been vetted for non-ASCII + * characters, we use the wchar_t variant of setlocale() on Windows. Otherwise + * they might not survive a save-restore round trip: when restoring, the name + * itself might be interpreted with a different encoding by plain setlocale(), + * after we switch to another locale in between. (This is a problem only in + * initdb, not in similar backend code where the global locale's name should + * already have been verified as ASCII-only.) + */ +static save_locale_t +save_global_locale(int category) +{ + save_locale_t save; + +#ifdef WIN32 + save = _wsetlocale(category, NULL); + if (!save) + pg_fatal("_wsetlocale() failed"); + save = wcsdup(save); + if (!save) + pg_fatal("out of memory"); +#else + save = setlocale(category, NULL); + if (!save) + pg_fatal("setlocale() failed"); + save = pg_strdup(save); +#endif + return save; +} + +/* + * Restore the global locale returned by save_global_locale(). + */ +static void +restore_global_locale(int category, save_locale_t save) +{ +#ifdef WIN32 + if (!_wsetlocale(category, save)) + pg_fatal("failed to restore old locale"); +#else + if (!setlocale(category, save)) + pg_fatal("failed to restore old locale \"%s\"", save); +#endif + free(save); +} + /* * Escape single quotes and backslashes, suitably for insertions into * configuration files or SQL E'' strings. @@ -482,6 +541,7 @@ replace_guc_value(char **lines, const char *guc_name, const char *guc_value, for (i = 0; lines[i]; i++) { const char *where; + const char *namestart; /* * Look for a line assigning to guc_name. Typically it will be @@ -492,15 +552,19 @@ replace_guc_value(char **lines, const char *guc_name, const char *guc_value, where = lines[i]; while (*where == '#' || isspace((unsigned char) *where)) where++; - if (strncmp(where, guc_name, namelen) != 0) + if (pg_strncasecmp(where, guc_name, namelen) != 0) continue; + namestart = where; where += namelen; while (isspace((unsigned char) *where)) where++; if (*where != '=') continue; - /* found it -- append the original comment if any */ + /* found it -- let's use the canonical casing shown in the file */ + memcpy(&newline->data[mark_as_comment ? 1 : 0], namestart, namelen); + + /* now append the original comment if any */ where = strrchr(where, '#'); if (where) { @@ -1055,7 +1119,7 @@ test_config_settings(void) #define MIN_BUFS_FOR_CONNS(nconns) ((nconns) * 10) static const int trial_conns[] = { - 100, 50, 40, 30, 20 + 100, 50, 40, 30, 25 }; static const int trial_bufs[] = { 16384, 8192, 4096, 3584, 3072, 2560, 2048, 1536, @@ -1083,7 +1147,7 @@ test_config_settings(void) * Probe for max_connections before shared_buffers, since it is subject to * more constraints than shared_buffers. */ - printf(_("selecting default max_connections ... ")); + printf(_("selecting default \"max_connections\" ... ")); fflush(stdout); for (i = 0; i < connslen; i++) @@ -1103,7 +1167,7 @@ test_config_settings(void) printf("%d\n", n_connections); - printf(_("selecting default shared_buffers ... ")); + printf(_("selecting default \"shared_buffers\" ... ")); fflush(stdout); for (i = 0; i < bufslen; i++) @@ -1138,13 +1202,15 @@ test_config_settings(void) static bool test_specific_config_settings(int test_conns, int test_buffs) { - PQExpBuffer cmd = createPQExpBuffer(); + PQExpBufferData cmd; _stringlist *gnames, *gvalues; int status; + initPQExpBuffer(&cmd); + /* Set up the test postmaster invocation */ - printfPQExpBuffer(cmd, + printfPQExpBuffer(&cmd, "\"%s\" --check %s %s " "-c max_connections=%d " "-c shared_buffers=%d " @@ -1158,18 +1224,18 @@ test_specific_config_settings(int test_conns, int test_buffs) gnames != NULL; /* assume lists have the same length */ gnames = gnames->next, gvalues = gvalues->next) { - appendPQExpBuffer(cmd, " -c %s=", gnames->str); - appendShellString(cmd, gvalues->str); + appendPQExpBuffer(&cmd, " -c %s=", gnames->str); + appendShellString(&cmd, gvalues->str); } - appendPQExpBuffer(cmd, + appendPQExpBuffer(&cmd, " < \"%s\" > \"%s\" 2>&1", DEVNULL, DEVNULL); fflush(NULL); - status = system(cmd->data); + status = system(cmd.data); - destroyPQExpBuffer(cmd); + termPQExpBuffer(&cmd); return (status == 0); } @@ -1223,25 +1289,17 @@ setup_config(void) conflines = replace_guc_value(conflines, "shared_buffers", repltok, false); - /* - * Hack: don't replace the LC_XXX GUCs when their value is 'C', because - * replace_guc_value will decide not to quote that, which looks strange. - */ - if (strcmp(lc_messages, "C") != 0) - conflines = replace_guc_value(conflines, "lc_messages", - lc_messages, false); + conflines = replace_guc_value(conflines, "lc_messages", + lc_messages, false); - if (strcmp(lc_monetary, "C") != 0) - conflines = replace_guc_value(conflines, "lc_monetary", - lc_monetary, false); + conflines = replace_guc_value(conflines, "lc_monetary", + lc_monetary, false); - if (strcmp(lc_numeric, "C") != 0) - conflines = replace_guc_value(conflines, "lc_numeric", - lc_numeric, false); + conflines = replace_guc_value(conflines, "lc_numeric", + lc_numeric, false); - if (strcmp(lc_time, "C") != 0) - conflines = replace_guc_value(conflines, "lc_time", - lc_time, false); + conflines = replace_guc_value(conflines, "lc_time", + lc_time, false); switch (locale_date_order(lc_time)) { @@ -1469,6 +1527,7 @@ static void bootstrap_template1(void) { PG_CMD_DECL; + PQExpBufferData cmd; char **line; char **bki_lines; char headerline[MAXPGPATH]; @@ -1518,8 +1577,8 @@ bootstrap_template1(void) bki_lines = replace_token(bki_lines, "LC_CTYPE", escape_quotes_bki(lc_ctype)); - bki_lines = replace_token(bki_lines, "ICU_LOCALE", - icu_locale ? escape_quotes_bki(icu_locale) : "_null_"); + bki_lines = replace_token(bki_lines, "DATLOCALE", + datlocale ? escape_quotes_bki(datlocale) : "_null_"); bki_lines = replace_token(bki_lines, "ICU_RULES", icu_rules ? escape_quotes_bki(icu_rules) : "_null_"); @@ -1530,16 +1589,17 @@ bootstrap_template1(void) /* Also ensure backend isn't confused by this environment var: */ unsetenv("PGCLIENTENCODING"); - snprintf(cmd, sizeof(cmd), - "\"%s\" --boot -X %d %s %s %s %s", - backend_exec, - wal_segment_size_mb * (1024 * 1024), - data_checksums ? "-k" : "", - boot_options, extra_options, - debug ? "-d 5" : ""); + initPQExpBuffer(&cmd); + + printfPQExpBuffer(&cmd, "\"%s\" --boot %s %s", backend_exec, boot_options, extra_options); + appendPQExpBuffer(&cmd, " -X %d", wal_segment_size_mb * (1024 * 1024)); + if (data_checksums) + appendPQExpBuffer(&cmd, " -k"); + if (debug) + appendPQExpBuffer(&cmd, " -d 5"); - PG_CMD_OPEN; + PG_CMD_OPEN(cmd.data); for (line = bki_lines; *line != NULL; line++) { @@ -1547,8 +1607,9 @@ bootstrap_template1(void) free(*line); } - PG_CMD_CLOSE; + PG_CMD_CLOSE(); + termPQExpBuffer(&cmd); free(bki_lines); check_ok(); @@ -2068,16 +2129,13 @@ locale_date_order(const char *locale) char *posD; char *posM; char *posY; - char *save; + save_locale_t save; size_t res; int result; result = DATEORDER_MDY; /* default */ - save = setlocale(LC_TIME, NULL); - if (!save) - return result; - save = pg_strdup(save); + save = save_global_locale(LC_TIME); setlocale(LC_TIME, locale); @@ -2088,8 +2146,7 @@ locale_date_order(const char *locale) res = my_strftime(buf, sizeof(buf), "%x", &testtime); - setlocale(LC_TIME, save); - free(save); + restore_global_locale(LC_TIME, save); if (res == 0) return result; @@ -2126,18 +2183,17 @@ locale_date_order(const char *locale) static void check_locale_name(int category, const char *locale, char **canonname) { - char *save; + save_locale_t save; char *res; + /* Don't let Windows' non-ASCII locale names in. */ + if (locale && !pg_is_ascii(locale)) + pg_fatal("locale name \"%s\" contains non-ASCII characters", locale); + if (canonname) *canonname = NULL; /* in case of failure */ - save = setlocale(category, NULL); - if (!save) - pg_fatal("setlocale() failed"); - - /* save may be pointing at a modifiable scratch variable, so copy it. */ - save = pg_strdup(save); + save = save_global_locale(category); /* for setlocale() call */ if (!locale) @@ -2151,9 +2207,7 @@ check_locale_name(int category, const char *locale, char **canonname) *canonname = pg_strdup(res); /* restore old value. */ - if (!setlocale(category, save)) - pg_fatal("failed to restore old locale \"%s\"", save); - free(save); + restore_global_locale(category, save); /* complain if locale wasn't valid */ if (res == NULL) @@ -2177,6 +2231,11 @@ check_locale_name(int category, const char *locale, char **canonname) pg_fatal("invalid locale settings; check LANG and LC_* environment variables"); } } + + /* Don't let Windows' non-ASCII locale names out. */ + if (canonname && !pg_is_ascii(*canonname)) + pg_fatal("locale name \"%s\" contains non-ASCII characters", + *canonname); } /* @@ -2348,7 +2407,7 @@ setlocales(void) { char *canonname; - /* set empty lc_* and iculocale values to locale config if set */ + /* set empty lc_* and datlocale values to locale config if set */ if (locale) { @@ -2364,8 +2423,8 @@ setlocales(void) lc_monetary = locale; if (!lc_messages) lc_messages = locale; - if (!icu_locale && locale_provider == COLLPROVIDER_ICU) - icu_locale = locale; + if (!datlocale && locale_provider != COLLPROVIDER_LIBC) + datlocale = locale; } /* @@ -2391,22 +2450,35 @@ setlocales(void) lc_messages = canonname; #endif - if (locale_provider == COLLPROVIDER_ICU) + if (locale_provider != COLLPROVIDER_LIBC && datlocale == NULL) + pg_fatal("locale must be specified if provider is %s", + collprovider_name(locale_provider)); + + if (locale_provider == COLLPROVIDER_BUILTIN) { - char *langtag; + if (strcmp(datlocale, "C") == 0) + canonname = "C"; + else if (strcmp(datlocale, "C.UTF-8") == 0 || + strcmp(datlocale, "C.UTF8") == 0) + canonname = "C.UTF-8"; + else + pg_fatal("invalid locale name \"%s\" for builtin provider", + datlocale); - /* acquire default locale from the environment, if not specified */ - if (icu_locale == NULL) - pg_fatal("ICU locale must be specified"); + datlocale = canonname; + } + else if (locale_provider == COLLPROVIDER_ICU) + { + char *langtag; /* canonicalize to a language tag */ - langtag = icu_language_tag(icu_locale); + langtag = icu_language_tag(datlocale); printf(_("Using language tag \"%s\" for ICU locale \"%s\".\n"), - langtag, icu_locale); - pg_free(icu_locale); - icu_locale = langtag; + langtag, datlocale); + pg_free(datlocale); + datlocale = langtag; - icu_validate_locale(icu_locale); + icu_validate_locale(datlocale); /* * In supported builds, the ICU locale ID will be opened during @@ -2443,7 +2515,9 @@ usage(const char *progname) " set default locale in the respective category for\n" " new databases (default taken from environment)\n")); printf(_(" --no-locale equivalent to --locale=C\n")); - printf(_(" --locale-provider={libc|icu}\n" + printf(_(" --builtin-locale=LOCALE\n" + " set builtin locale name for new databases\n")); + printf(_(" --locale-provider={builtin|libc|icu}\n" " set default locale provider for new databases\n")); printf(_(" --pwfile=FILE read password for the new superuser from file\n")); printf(_(" -T, --text-search-config=CFG\n" @@ -2460,7 +2534,8 @@ usage(const char *progname) printf(_(" -n, --no-clean do not clean up after errors\n")); printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n")); printf(_(" --no-instructions do not print instructions for next steps\n")); - printf(_(" -s, --show show internal settings\n")); + printf(_(" -s, --show show internal settings, then exit\n")); + printf(_(" --sync-method=METHOD set method for syncing files to disk\n")); printf(_(" -S, --sync-only only sync database files to disk, then exit\n")); printf(_("\nOther options:\n")); printf(_(" -V, --version output version information, then exit\n")); @@ -2490,10 +2565,6 @@ check_authmethod_valid(const char *authmethod, const char *const *valid_methods, { if (strcmp(authmethod, *p) == 0) return; - /* with space = param */ - if (strchr(authmethod, ' ')) - if (strncmp(authmethod, *p, (authmethod - strchr(authmethod, ' '))) == 0) - return; } pg_fatal("invalid authentication method \"%s\" for \"%s\" connections", @@ -2599,14 +2670,14 @@ setup_locale_encoding(void) strcmp(lc_ctype, lc_numeric) == 0 && strcmp(lc_ctype, lc_monetary) == 0 && strcmp(lc_ctype, lc_messages) == 0 && - (!icu_locale || strcmp(lc_ctype, icu_locale) == 0)) + (!datlocale || strcmp(lc_ctype, datlocale) == 0)) printf(_("The database cluster will be initialized with locale \"%s\".\n"), lc_ctype); else { printf(_("The database cluster will be initialized with this locale configuration:\n")); - printf(_(" provider: %s\n"), collprovider_name(locale_provider)); - if (icu_locale) - printf(_(" ICU locale: %s\n"), icu_locale); + printf(_(" locale provider: %s\n"), collprovider_name(locale_provider)); + if (locale_provider != COLLPROVIDER_LIBC) + printf(_(" default collation: %s\n"), datlocale); printf(_(" LC_COLLATE: %s\n" " LC_CTYPE: %s\n" " LC_MESSAGES: %s\n" @@ -2680,6 +2751,13 @@ setup_locale_encoding(void) !check_locale_encoding(lc_collate, encodingid)) exit(1); /* check_locale_encoding printed the error */ + if (locale_provider == COLLPROVIDER_BUILTIN) + { + if (strcmp(datlocale, "C.UTF-8") == 0 && encodingid != PG_UTF8) + pg_fatal("builtin provider locale \"%s\" requires encoding \"%s\"", + datlocale, "UTF-8"); + } + if (locale_provider == COLLPROVIDER_ICU && !check_icu_locale_encoding(encodingid)) exit(1); @@ -2951,6 +3029,7 @@ void initialize_data_directory(void) { PG_CMD_DECL; + PQExpBufferData cmd; int i; setup_signals(); @@ -3014,12 +3093,11 @@ initialize_data_directory(void) fputs(_("performing post-bootstrap initialization ... "), stdout); fflush(stdout); - snprintf(cmd, sizeof(cmd), - "\"%s\" %s %s template1 >%s", - backend_exec, backend_options, extra_options, - DEVNULL); + initPQExpBuffer(&cmd); + printfPQExpBuffer(&cmd, "\"%s\" %s %s template1 >%s", + backend_exec, backend_options, extra_options, DEVNULL); - PG_CMD_OPEN; + PG_CMD_OPEN(cmd.data); setup_auth(cmdfd); @@ -3054,7 +3132,8 @@ initialize_data_directory(void) make_postgres(cmdfd); - PG_CMD_CLOSE; + PG_CMD_CLOSE(); + termPQExpBuffer(&cmd); check_ok(); } @@ -3098,8 +3177,10 @@ main(int argc, char *argv[]) {"allow-group-access", no_argument, NULL, 'g'}, {"discard-caches", no_argument, NULL, 14}, {"locale-provider", required_argument, NULL, 15}, - {"icu-locale", required_argument, NULL, 16}, - {"icu-rules", required_argument, NULL, 17}, + {"builtin-locale", required_argument, NULL, 16}, + {"icu-locale", required_argument, NULL, 17}, + {"icu-rules", required_argument, NULL, 18}, + {"sync-method", required_argument, NULL, 19}, {NULL, 0, NULL, 0} }; @@ -3252,7 +3333,8 @@ main(int argc, char *argv[]) xlog_dir = pg_strdup(optarg); break; case 12: - str_wal_segment_size_mb = pg_strdup(optarg); + if (!option_parse_int(optarg, "--wal-segsize", 1, 1024, &wal_segment_size_mb)) + exit(1); break; case 13: noinstructions = true; @@ -3266,7 +3348,9 @@ main(int argc, char *argv[]) "-c debug_discard_caches=1"); break; case 15: - if (strcmp(optarg, "icu") == 0) + if (strcmp(optarg, "builtin") == 0) + locale_provider = COLLPROVIDER_BUILTIN; + else if (strcmp(optarg, "icu") == 0) locale_provider = COLLPROVIDER_ICU; else if (strcmp(optarg, "libc") == 0) locale_provider = COLLPROVIDER_LIBC; @@ -3274,11 +3358,20 @@ main(int argc, char *argv[]) pg_fatal("unrecognized locale provider: %s", optarg); break; case 16: - icu_locale = pg_strdup(optarg); + datlocale = pg_strdup(optarg); + builtin_locale_specified = true; break; case 17: + datlocale = pg_strdup(optarg); + icu_locale_specified = true; + break; + case 18: icu_rules = pg_strdup(optarg); break; + case 19: + if (!parse_sync_method(optarg, &sync_method)) + exit(1); + break; default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -3305,7 +3398,11 @@ main(int argc, char *argv[]) exit(1); } - if (icu_locale && locale_provider != COLLPROVIDER_ICU) + if (builtin_locale_specified && locale_provider != COLLPROVIDER_BUILTIN) + pg_fatal("%s cannot be specified unless locale provider \"%s\" is chosen", + "--builtin-locale", "builtin"); + + if (icu_locale_specified && locale_provider != COLLPROVIDER_ICU) pg_fatal("%s cannot be specified unless locale provider \"%s\" is chosen", "--icu-locale", "icu"); @@ -3315,7 +3412,7 @@ main(int argc, char *argv[]) atexit(cleanup_directories_atexit); - /* If we only need to fsync, just do it and exit */ + /* If we only need to sync, just do it and exit */ if (sync_only) { setup_pgdata(); @@ -3326,7 +3423,7 @@ main(int argc, char *argv[]) fputs(_("syncing data to disk ... "), stdout); fflush(stdout); - fsync_pgdata(pg_data, PG_VERSION_NUM); + sync_pgdata(pg_data, PG_VERSION_NUM, sync_method); check_ok(); return 0; } @@ -3342,22 +3439,8 @@ main(int argc, char *argv[]) check_need_password(authmethodlocal, authmethodhost); - /* set wal segment size */ - if (str_wal_segment_size_mb == NULL) - wal_segment_size_mb = (DEFAULT_XLOG_SEG_SIZE) / (1024 * 1024); - else - { - char *endptr; - - /* check that the argument is a number */ - wal_segment_size_mb = strtol(str_wal_segment_size_mb, &endptr, 10); - - /* verify that wal segment size is valid */ - if (endptr == str_wal_segment_size_mb || *endptr != '\0') - pg_fatal("argument of --wal-segsize must be a number"); - if (!IsValidWalSegSize(wal_segment_size_mb * 1024 * 1024)) - pg_fatal("argument of --wal-segsize must be a power of 2 between 1 and 1024"); - } + if (!IsValidWalSegSize(wal_segment_size_mb * 1024 * 1024)) + pg_fatal("argument of %s must be a power of two between 1 and 1024", "--wal-segsize"); get_restricted_token(); @@ -3403,7 +3486,7 @@ main(int argc, char *argv[]) { fputs(_("syncing data to disk ... "), stdout); fflush(stdout); - fsync_pgdata(pg_data, PG_VERSION_NUM); + sync_pgdata(pg_data, PG_VERSION_NUM, sync_method); check_ok(); } else diff --git a/src/bin/initdb/meson.build b/src/bin/initdb/meson.build index 49743630aadc0..7dc5ed6e77e4e 100644 --- a/src/bin/initdb/meson.build +++ b/src/bin/initdb/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group initdb_sources = files( 'findtimezone.c', @@ -7,8 +7,6 @@ initdb_sources = files( initdb_sources += timezone_localtime_source -#fixme: reimplement libpq_pgport logic - if host_system == 'windows' initdb_sources += rc_bin_gen.process(win32ver_rc, extra_args: [ '--NAME', 'initdb', @@ -18,6 +16,11 @@ endif initdb = executable('initdb', initdb_sources, include_directories: [timezone_inc], + # Note: it's important that we link to encnames.o from libpgcommon, not + # from libpq, else we have risks of version skew if we run with a libpq + # shared library from a different PG version. Define + # USE_PRIVATE_ENCODING_FUNCS to ensure that that happens. + c_args: ['-DUSE_PRIVATE_ENCODING_FUNCS'], dependencies: [frontend_code, libpq, icu, icu_i18n], kwargs: default_bin_args, ) diff --git a/src/bin/initdb/nls.mk b/src/bin/initdb/nls.mk index 80af642dbf9ff..acbfdb3418cba 100644 --- a/src/bin/initdb/nls.mk +++ b/src/bin/initdb/nls.mk @@ -11,6 +11,8 @@ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ ../../common/rmtree.c \ ../../common/username.c \ ../../common/wait_error.c \ + ../../fe_utils/option_utils.c \ + ../../fe_utils/string_utils.c \ ../../port/dirmod.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/initdb/po/LINGUAS b/src/bin/initdb/po/LINGUAS index f17de4be41dfb..fb4e1cad83a17 100644 --- a/src/bin/initdb/po/LINGUAS +++ b/src/bin/initdb/po/LINGUAS @@ -1 +1 @@ -cs de el es fr he it ja ka ko pl pt_BR ru sv tr uk vi zh_CN +cs de el es fr he it ja ka ko pl pt_BR ru sv tr uk vi zh_CN zh_TW diff --git a/src/bin/initdb/po/de.po b/src/bin/initdb/po/de.po index dd083dcbd5609..66a87caaf7eb5 100644 --- a/src/bin/initdb/po/de.po +++ b/src/bin/initdb/po/de.po @@ -1,14 +1,14 @@ # German message translation file for initdb. -# Peter Eisentraut , 2003 - 2023. +# Peter Eisentraut , 2003 - 2024. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 16\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-06-24 21:50+0000\n" -"PO-Revision-Date: 2023-06-26 09:43+0200\n" +"POT-Creation-Date: 2024-10-30 10:51+0000\n" +"PO-Revision-Date: 2024-10-30 16:07+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -36,33 +36,48 @@ msgstr "Detail: " msgid "hint: " msgstr "Tipp: " -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "ungültige Programmdatei »%s«: %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "konnte Programmdatei »%s« nicht lesen: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "konnte kein »%s« zum Ausführen finden" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "konnte Pfad »%s« nicht in absolute Form auflösen: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 initdb.c:750 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "konnte Befehl »%s« nicht ausführen: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "konnte nicht von Befehl »%s« lesen: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "Befehl »%s« gab keine Daten zurück" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 -#: initdb.c:349 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: initdb.c:372 initdb.c:408 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" @@ -78,35 +93,46 @@ msgstr "Speicher aufgebraucht\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:447 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "konnte Datei »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" -#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48 -#: ../../common/rmtree.c:63 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: ../../common/pgfnames.c:48 ../../common/rmtree.c:63 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69 -#: ../../common/rmtree.c:104 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: ../../common/pgfnames.c:69 ../../common/rmtree.c:106 #, c-format msgid "could not read directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht lesen: %m" -#: ../../common/file_utils.c:228 ../../common/file_utils.c:287 -#: ../../common/file_utils.c:361 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "konnte Datei »%s« nicht öffnen: %m" - -#: ../../common/file_utils.c:299 ../../common/file_utils.c:369 +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" -#: ../../common/file_utils.c:379 +#: ../../common/file_utils.c:498 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" @@ -146,12 +172,12 @@ msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu msgid "could not get exit code from subprocess: error code %lu" msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu" -#: ../../common/rmtree.c:95 +#: ../../common/rmtree.c:97 #, c-format msgid "could not remove file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" -#: ../../common/rmtree.c:122 +#: ../../common/rmtree.c:124 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht löschen: %m" @@ -200,6 +226,31 @@ msgstr "Kindprozess wurde von Signal %d beendet: %s" msgid "child process exited with unrecognized status %d" msgstr "Kindprozess hat mit unbekanntem Status %d beendet" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ungültiger Wert »%s« für Option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s muss im Bereich %d..%d sein" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "unbekannte Sync-Methode: %s" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s«\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "Datenbankname enthält Newline oder Carriage Return: »%s«\n" + #: ../../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" @@ -210,274 +261,289 @@ msgstr "konnte Junction für »%s« nicht erzeugen: %s\n" msgid "could not get junction for \"%s\": %s\n" msgstr "konnte Junction für »%s« nicht ermitteln: %s\n" -#: initdb.c:618 initdb.c:1613 +#: initdb.c:369 +#, c-format +msgid "_wsetlocale() failed" +msgstr "_wsetlocale() fehlgeschlagen" + +#: initdb.c:376 +#, c-format +msgid "setlocale() failed" +msgstr "setlocale() fehlgeschlagen" + +#: initdb.c:390 +#, c-format +msgid "failed to restore old locale" +msgstr "konnte alte Locale nicht wiederherstellen" + +#: initdb.c:393 +#, c-format +msgid "failed to restore old locale \"%s\"" +msgstr "konnte alte Locale »%s« nicht wiederherstellen" + +#: initdb.c:682 initdb.c:1674 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" -#: initdb.c:662 initdb.c:966 initdb.c:986 +#: initdb.c:726 initdb.c:1030 initdb.c:1050 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "konnte Datei »%s« nicht zum Schreiben öffnen: %m" -#: initdb.c:666 initdb.c:969 initdb.c:988 +#: initdb.c:730 initdb.c:1033 initdb.c:1052 #, c-format msgid "could not write file \"%s\": %m" msgstr "konnte Datei »%s« nicht schreiben: %m" -#: initdb.c:670 +#: initdb.c:734 #, c-format msgid "could not close file \"%s\": %m" msgstr "konnte Datei »%s« nicht schließen: %m" -#: initdb.c:686 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "konnte Befehl »%s« nicht ausführen: %m" - -#: initdb.c:704 +#: initdb.c:768 #, c-format msgid "removing data directory \"%s\"" msgstr "entferne Datenverzeichnis »%s«" -#: initdb.c:706 +#: initdb.c:770 #, c-format msgid "failed to remove data directory" msgstr "konnte Datenverzeichnis nicht entfernen" -#: initdb.c:710 +#: initdb.c:774 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "entferne Inhalt des Datenverzeichnisses »%s«" -#: initdb.c:713 +#: initdb.c:777 #, c-format msgid "failed to remove contents of data directory" msgstr "konnte Inhalt des Datenverzeichnisses nicht entfernen" -#: initdb.c:718 +#: initdb.c:782 #, c-format msgid "removing WAL directory \"%s\"" msgstr "entferne WAL-Verzeichnis »%s«" -#: initdb.c:720 +#: initdb.c:784 #, c-format msgid "failed to remove WAL directory" msgstr "konnte WAL-Verzeichnis nicht entfernen" -#: initdb.c:724 +#: initdb.c:788 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "entferne Inhalt des WAL-Verzeichnisses »%s«" -#: initdb.c:726 +#: initdb.c:790 #, c-format msgid "failed to remove contents of WAL directory" msgstr "konnte Inhalt des WAL-Verzeichnisses nicht entfernen" -#: initdb.c:733 +#: initdb.c:797 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "Datenverzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt" -#: initdb.c:737 +#: initdb.c:801 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "WAL-Verzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt" -#: initdb.c:755 +#: initdb.c:819 #, c-format msgid "cannot be run as root" msgstr "kann nicht als root ausgeführt werden" -#: initdb.c:756 +#: initdb.c:820 #, c-format msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." msgstr "Bitte loggen Sie sich (z.B. mit »su«) als der (unprivilegierte) Benutzer ein, der Eigentümer des Serverprozesses sein soll." -#: initdb.c:788 +#: initdb.c:852 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "»%s« ist keine gültige Serverkodierung" -#: initdb.c:932 +#: initdb.c:996 #, c-format msgid "file \"%s\" does not exist" msgstr "Datei »%s« existiert nicht" -#: initdb.c:933 initdb.c:938 initdb.c:945 +#: initdb.c:997 initdb.c:1002 initdb.c:1009 #, c-format msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." msgstr "Das könnte bedeuten, dass Ihre Installation fehlerhaft ist oder dass Sie das falsche Verzeichnis mit der Kommandozeilenoption -L angegeben haben." -#: initdb.c:937 +#: initdb.c:1001 #, c-format msgid "could not access file \"%s\": %m" msgstr "konnte nicht auf Datei »%s« zugreifen: %m" -#: initdb.c:944 +#: initdb.c:1008 #, c-format msgid "file \"%s\" is not a regular file" msgstr "Datei »%s« ist keine normale Datei" -#: initdb.c:1077 +#: initdb.c:1141 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "wähle Implementierung von dynamischem Shared Memory ... " -#: initdb.c:1086 +#: initdb.c:1150 #, c-format -msgid "selecting default max_connections ... " -msgstr "wähle Vorgabewert für max_connections ... " +msgid "selecting default \"max_connections\" ... " +msgstr "wähle Vorgabewert für »max_connections« ... " -#: initdb.c:1106 +#: initdb.c:1170 #, c-format -msgid "selecting default shared_buffers ... " -msgstr "wähle Vorgabewert für shared_buffers ... " +msgid "selecting default \"shared_buffers\" ... " +msgstr "wähle Vorgabewert für »shared_buffers« ... " -#: initdb.c:1129 +#: initdb.c:1193 #, c-format msgid "selecting default time zone ... " msgstr "wähle Vorgabewert für Zeitzone ... " -#: initdb.c:1206 +#: initdb.c:1272 msgid "creating configuration files ... " msgstr "erzeuge Konfigurationsdateien ... " -#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459 +#: initdb.c:1425 initdb.c:1439 initdb.c:1506 initdb.c:1517 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "konnte Zugriffsrechte von »%s« nicht ändern: %m" -#: initdb.c:1477 +#: initdb.c:1536 #, c-format msgid "running bootstrap script ... " msgstr "führe Bootstrap-Skript aus ... " -#: initdb.c:1489 +#: initdb.c:1548 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "Eingabedatei »%s« gehört nicht zu PostgreSQL %s" -#: initdb.c:1491 +#: initdb.c:1550 #, c-format msgid "Specify the correct path using the option -L." msgstr "Geben Sie den korrekten Pfad mit der Option -L an." -#: initdb.c:1591 +#: initdb.c:1652 msgid "Enter new superuser password: " msgstr "Geben Sie das neue Superuser-Passwort ein: " -#: initdb.c:1592 +#: initdb.c:1653 msgid "Enter it again: " msgstr "Geben Sie es noch einmal ein: " -#: initdb.c:1595 +#: initdb.c:1656 #, c-format msgid "Passwords didn't match.\n" msgstr "Passwörter stimmten nicht überein.\n" -#: initdb.c:1619 +#: initdb.c:1680 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "konnte Passwort nicht aus Datei »%s« lesen: %m" -#: initdb.c:1622 +#: initdb.c:1683 #, c-format msgid "password file \"%s\" is empty" msgstr "Passwortdatei »%s« ist leer" -#: initdb.c:2034 +#: initdb.c:2095 #, c-format msgid "caught signal\n" msgstr "Signal abgefangen\n" -#: initdb.c:2040 +#: initdb.c:2101 #, c-format msgid "could not write to child process: %s\n" msgstr "konnte nicht an Kindprozess schreiben: %s\n" -#: initdb.c:2048 +#: initdb.c:2109 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2137 +#: initdb.c:2191 initdb.c:2237 #, c-format -msgid "setlocale() failed" -msgstr "setlocale() fehlgeschlagen" +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "Locale-Name »%s« enthält Nicht-ASCII-Zeichen" -#: initdb.c:2155 -#, c-format -msgid "failed to restore old locale \"%s\"" -msgstr "konnte alte Locale »%s« nicht wiederherstellen" - -#: initdb.c:2163 +#: initdb.c:2217 #, c-format msgid "invalid locale name \"%s\"" msgstr "ungültiger Locale-Name: »%s«" -#: initdb.c:2164 +#: initdb.c:2218 #, c-format msgid "If the locale name is specific to ICU, use --icu-locale." msgstr "Wenn der Locale-Name nur für ICU gültig ist, verwenden Sie --icu-locale." -#: initdb.c:2177 +#: initdb.c:2231 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "ungültige Locale-Einstellungen; prüfen Sie die Umgebungsvariablen LANG und LC_*" -#: initdb.c:2203 initdb.c:2227 +#: initdb.c:2262 initdb.c:2286 #, c-format msgid "encoding mismatch" msgstr "unpassende Kodierungen" -#: initdb.c:2204 +#: initdb.c:2263 #, c-format msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." msgstr "Die von Ihnen gewählte Kodierung (%s) und die von der gewählten Locale verwendete Kodierung (%s) passen nicht zu einander. Das würde in verschiedenen Zeichenkettenfunktionen zu Fehlverhalten führen." -#: initdb.c:2209 initdb.c:2230 +#: initdb.c:2268 initdb.c:2289 #, c-format msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." msgstr "Starten Sie %s erneut und geben Sie entweder keine Kodierung explizit an oder wählen Sie eine passende Kombination." -#: initdb.c:2228 +#: initdb.c:2287 #, c-format msgid "The encoding you selected (%s) is not supported with the ICU provider." msgstr "Die von Ihnen gewählte Kodierung (%s) wird vom ICU-Provider nicht unterstützt." -#: initdb.c:2279 +#: initdb.c:2338 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "konnte Locale-Namen »%s« nicht in Sprach-Tag umwandeln: %s" -#: initdb.c:2285 initdb.c:2337 initdb.c:2416 +#: initdb.c:2344 initdb.c:2396 initdb.c:2488 #, c-format msgid "ICU is not supported in this build" msgstr "ICU wird in dieser Installation nicht unterstützt" -#: initdb.c:2308 +#: initdb.c:2367 #, c-format msgid "could not get language from locale \"%s\": %s" msgstr "konnte Sprache nicht aus Locale »%s« ermitteln: %s" -#: initdb.c:2334 +#: initdb.c:2393 #, c-format msgid "locale \"%s\" has unknown language \"%s\"" msgstr "Locale »%s« hat unbekannte Sprache »%s«" -#: initdb.c:2400 +#: initdb.c:2454 +#, c-format +msgid "locale must be specified if provider is %s" +msgstr "Locale muss angegeben werden, wenn der Provider %s ist" + +#: initdb.c:2465 #, c-format -msgid "ICU locale must be specified" -msgstr "ICU-Locale muss angegeben werden" +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "ungültiger Locale-Name »%s« für Provider »builtin«" -#: initdb.c:2404 +#: initdb.c:2476 #, c-format msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" msgstr "Verwende Sprach-Tag »%s« für ICU-Locale »%s«.\n" -#: initdb.c:2427 +#: initdb.c:2499 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -486,17 +552,17 @@ msgstr "" "%s initialisiert einen PostgreSQL-Datenbankcluster.\n" "\n" -#: initdb.c:2428 +#: initdb.c:2500 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: initdb.c:2429 +#: initdb.c:2501 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATENVERZEICHNIS]\n" -#: initdb.c:2430 +#: initdb.c:2502 #, c-format msgid "" "\n" @@ -505,65 +571,65 @@ msgstr "" "\n" "Optionen:\n" -#: initdb.c:2431 +#: initdb.c:2503 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, --auth=METHODE vorgegebene Authentifizierungsmethode für lokale Verbindungen\n" -#: initdb.c:2432 +#: initdb.c:2504 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr "" " --auth-host=METHODE vorgegebene Authentifizierungsmethode für lokale\n" " TCP/IP-Verbindungen\n" -#: initdb.c:2433 +#: initdb.c:2505 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr "" " --auth-local=METHODE vorgegebene Authentifizierungsmethode für Verbindungen\n" " auf lokalen Sockets\n" -#: initdb.c:2434 +#: initdb.c:2506 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATENVERZ Datenverzeichnis für diesen Datenbankcluster\n" -#: initdb.c:2435 +#: initdb.c:2507 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=KODIERUNG setze Standardkodierung für neue Datenbanken\n" -#: initdb.c:2436 +#: initdb.c:2508 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr "" " -g, --allow-group-access Lese- und Ausführungsrechte am Datenverzeichnis\n" " für Gruppe setzen\n" -#: initdb.c:2437 +#: initdb.c:2509 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" msgstr " --icu-locale=LOCALE setze ICU-Locale-ID für neue Datenbanken\n" -#: initdb.c:2438 +#: initdb.c:2510 #, c-format msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" msgstr "" " --icu-rules=REGELN setze zusätzliche ICU-Sortierfolgenregeln für neue\n" " Datenbanken\n" -#: initdb.c:2439 +#: initdb.c:2511 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums Datenseitenprüfsummen verwenden\n" -#: initdb.c:2440 +#: initdb.c:2512 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE setze Standardlocale für neue Datenbanken\n" -#: initdb.c:2441 +#: initdb.c:2513 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -577,26 +643,35 @@ msgstr "" " für neue Datenbanken (Voreinstellung aus der\n" " Umgebung entnommen)\n" -#: initdb.c:2445 +#: initdb.c:2517 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale entspricht --locale=C\n" -#: initdb.c:2446 +#: initdb.c:2518 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --builtin-locale=LOCALE\n" +" set builtin locale name for new databases\n" +msgstr "" +" --builtin-locale=LOCALE\n" +" setze Locale für Provider »builtin« für neue Datenbanken\n" + +#: initdb.c:2520 +#, c-format +msgid "" +" --locale-provider={builtin|libc|icu}\n" " set default locale provider for new databases\n" msgstr "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " setze Standard-Locale-Provider für neue Datenbanken\n" -#: initdb.c:2448 +#: initdb.c:2522 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=DATEI lese Passwort des neuen Superusers aus Datei\n" -#: initdb.c:2449 +#: initdb.c:2523 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -605,27 +680,27 @@ msgstr "" " -T, --text-search-config=KFG\n" " Standardtextsuchekonfiguration\n" -#: initdb.c:2451 +#: initdb.c:2525 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NAME Datenbank-Superusername\n" -#: initdb.c:2452 +#: initdb.c:2526 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt frage nach Passwort für neuen Superuser\n" -#: initdb.c:2453 +#: initdb.c:2527 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALVERZ Verzeichnis für das Write-Ahead-Log\n" -#: initdb.c:2454 +#: initdb.c:2528 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=ZAHL Größe eines WAL-Segments, in Megabyte\n" -#: initdb.c:2455 +#: initdb.c:2529 #, c-format msgid "" "\n" @@ -634,56 +709,63 @@ msgstr "" "\n" "Weniger häufig verwendete Optionen:\n" -#: initdb.c:2456 +#: initdb.c:2530 #, c-format msgid " -c, --set NAME=VALUE override default setting for server parameter\n" msgstr " -c, --set NAME=WERT Voreinstellung für Serverparameter setzen\n" -#: initdb.c:2457 +#: initdb.c:2531 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug erzeuge eine Menge Debug-Ausgaben\n" -#: initdb.c:2458 +#: initdb.c:2532 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches debug_discard_caches=1 setzen\n" -#: initdb.c:2459 +#: initdb.c:2533 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L VERZEICHNIS wo sind die Eingabedateien zu finden\n" -#: initdb.c:2460 +#: initdb.c:2534 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean nach Fehlern nicht aufräumen\n" -#: initdb.c:2461 +#: initdb.c:2535 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" " geschrieben sind\n" -#: initdb.c:2462 +#: initdb.c:2536 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions Anleitung für nächste Schritte nicht ausgeben\n" -#: initdb.c:2463 +#: initdb.c:2537 +#, c-format +msgid " -s, --show show internal settings, then exit\n" +msgstr " -s, --show interne Einstellungen zeigen, dann beenden\n" + +#: initdb.c:2538 #, c-format -msgid " -s, --show show internal settings\n" -msgstr " -s, --show zeige interne Einstellungen\n" +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr "" +" --sync-method=METHODE Methode zum Synchronisieren vond Dateien auf\n" +" Festplatte setzen\n" -#: initdb.c:2464 +#: initdb.c:2539 #, c-format msgid " -S, --sync-only only sync database files to disk, then exit\n" msgstr "" " -S, --sync-only nur Datenbankdateien auf Festplatte synchronisieren,\n" " dann beenden\n" -#: initdb.c:2465 +#: initdb.c:2540 #, c-format msgid "" "\n" @@ -692,17 +774,17 @@ msgstr "" "\n" "Weitere Optionen:\n" -#: initdb.c:2466 +#: initdb.c:2541 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: initdb.c:2467 +#: initdb.c:2542 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: initdb.c:2468 +#: initdb.c:2543 #, c-format msgid "" "\n" @@ -713,7 +795,7 @@ msgstr "" "Wenn kein Datenverzeichnis angegeben ist, dann wird die Umgebungsvariable\n" "PGDATA verwendet.\n" -#: initdb.c:2470 +#: initdb.c:2545 #, c-format msgid "" "\n" @@ -722,72 +804,72 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: initdb.c:2471 +#: initdb.c:2546 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: initdb.c:2499 +#: initdb.c:2570 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "ungültige Authentifizierungsmethode »%s« für »%s«-Verbindungen" -#: initdb.c:2513 +#: initdb.c:2584 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "Superuser-Passwort muss angegeben werden um Passwortauthentifizierung einzuschalten" -#: initdb.c:2532 +#: initdb.c:2603 #, c-format msgid "no data directory specified" msgstr "kein Datenverzeichnis angegeben" -#: initdb.c:2533 +#: initdb.c:2604 #, c-format msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." msgstr "Sie müssen das Verzeichnis angeben, wo dieses Datenbanksystem abgelegt werden soll. Machen Sie dies entweder mit der Kommandozeilenoption -D oder mit der Umgebungsvariable PGDATA." -#: initdb.c:2550 +#: initdb.c:2621 #, c-format msgid "could not set environment" msgstr "konnte Umgebung nicht setzen" -#: initdb.c:2568 +#: initdb.c:2639 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden" -#: initdb.c:2571 +#: initdb.c:2642 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s" -#: initdb.c:2586 +#: initdb.c:2657 #, c-format msgid "input file location must be an absolute path" msgstr "Eingabedatei muss absoluten Pfad haben" -#: initdb.c:2603 +#: initdb.c:2674 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "Der Datenbankcluster wird mit der Locale »%s« initialisiert werden.\n" -#: initdb.c:2606 +#: initdb.c:2677 #, c-format msgid "The database cluster will be initialized with this locale configuration:\n" msgstr "Der Datenbankcluster wird mit dieser Locale-Konfiguration initialisiert werden:\n" -#: initdb.c:2607 +#: initdb.c:2678 #, c-format -msgid " provider: %s\n" -msgstr " Provider: %s\n" +msgid " locale provider: %s\n" +msgstr " Locale-Provider: %s\n" -#: initdb.c:2609 +#: initdb.c:2680 #, c-format -msgid " ICU locale: %s\n" -msgstr " ICU-Locale: %s\n" +msgid " default collation: %s\n" +msgstr " Standardsortierfolge: %s\n" -#: initdb.c:2610 +#: initdb.c:2681 #, c-format msgid "" " LC_COLLATE: %s\n" @@ -804,22 +886,22 @@ msgstr "" " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2640 +#: initdb.c:2711 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "konnte keine passende Kodierung für Locale »%s« finden" -#: initdb.c:2642 +#: initdb.c:2713 #, c-format msgid "Rerun %s with the -E option." msgstr "Führen Sie %s erneut mit der Option -E aus." -#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304 +#: initdb.c:2714 initdb.c:3257 initdb.c:3377 initdb.c:3397 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: initdb.c:2655 +#: initdb.c:2726 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -828,107 +910,112 @@ msgstr "" "Die von der Locale gesetzte Kodierung »%s« ist nicht als serverseitige Kodierung erlaubt.\n" "Die Standarddatenbankkodierung wird stattdessen auf »%s« gesetzt.\n" -#: initdb.c:2660 +#: initdb.c:2731 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "Locale »%s« benötigt nicht unterstützte Kodierung »%s«" -#: initdb.c:2662 +#: initdb.c:2733 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "Kodierung »%s« ist nicht als serverseitige Kodierung erlaubt." -#: initdb.c:2664 +#: initdb.c:2735 #, c-format msgid "Rerun %s with a different locale selection." msgstr "Starten Sie %s erneut mit einer anderen Locale-Wahl." -#: initdb.c:2672 +#: initdb.c:2743 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "Die Standarddatenbankkodierung wurde entsprechend auf »%s« gesetzt.\n" -#: initdb.c:2741 +#: initdb.c:2757 +#, c-format +msgid "builtin provider locale \"%s\" requires encoding \"%s\"" +msgstr "Locale »%s« vom Provider »builtin« benötigt Kodierung »%s«" + +#: initdb.c:2819 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "konnte keine passende Textsuchekonfiguration für Locale »%s« finden" -#: initdb.c:2752 +#: initdb.c:2830 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "passende Textsuchekonfiguration für Locale »%s« ist unbekannt" -#: initdb.c:2757 +#: initdb.c:2835 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "angegebene Textsuchekonfiguration »%s« passt möglicherweise nicht zur Locale »%s«" -#: initdb.c:2762 +#: initdb.c:2840 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "Die Standardtextsuchekonfiguration wird auf »%s« gesetzt.\n" -#: initdb.c:2805 initdb.c:2876 +#: initdb.c:2883 initdb.c:2954 #, c-format msgid "creating directory %s ... " msgstr "erzeuge Verzeichnis %s ... " -#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985 +#: initdb.c:2888 initdb.c:2959 initdb.c:3007 initdb.c:3064 #, c-format msgid "could not create directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" -#: initdb.c:2819 initdb.c:2891 +#: initdb.c:2897 initdb.c:2969 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "berichtige Zugriffsrechte des bestehenden Verzeichnisses %s ... " -#: initdb.c:2824 initdb.c:2896 +#: initdb.c:2902 initdb.c:2974 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "konnte Rechte des Verzeichnisses »%s« nicht ändern: %m" -#: initdb.c:2836 initdb.c:2908 +#: initdb.c:2914 initdb.c:2986 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "Verzeichnis »%s« existiert aber ist nicht leer" -#: initdb.c:2840 +#: initdb.c:2918 #, c-format msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." msgstr "Wenn Sie ein neues Datenbanksystem erzeugen wollen, entfernen oder leeren Sie das Verzeichnis »%s« or führen Sie %s mit einem anderen Argument als »%s« aus." -#: initdb.c:2848 initdb.c:2918 initdb.c:3325 +#: initdb.c:2926 initdb.c:2996 initdb.c:3422 #, c-format msgid "could not access directory \"%s\": %m" msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" -#: initdb.c:2869 +#: initdb.c:2947 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL-Verzeichnis muss absoluten Pfad haben" -#: initdb.c:2912 +#: initdb.c:2990 #, c-format msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." msgstr "Wenn Sie dort den WAL ablegen wollen, entfernen oder leeren Sie das Verzeichnis »%s«." -#: initdb.c:2922 +#: initdb.c:3000 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m" -#: initdb.c:2941 +#: initdb.c:3019 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." msgstr "Es enthält eine unsichtbare Datei (beginnt mit Punkt), vielleicht weil es ein Einhängepunkt ist." -#: initdb.c:2943 +#: initdb.c:3021 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point." msgstr "Es enthält ein Verzeichnis »lost+found«, vielleicht weil es ein Einhängepunkt ist." -#: initdb.c:2945 +#: initdb.c:3023 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -937,70 +1024,65 @@ msgstr "" "Einen Einhängepunkt direkt als Datenverzeichnis zu verwenden wird nicht empfohlen.\n" "Erzeugen Sie ein Unterverzeichnis unter dem Einhängepunkt." -#: initdb.c:2971 +#: initdb.c:3050 #, c-format msgid "creating subdirectories ... " msgstr "erzeuge Unterverzeichnisse ... " -#: initdb.c:3014 +#: initdb.c:3093 msgid "performing post-bootstrap initialization ... " msgstr "führe Post-Bootstrap-Initialisierung durch ... " -#: initdb.c:3175 +#: initdb.c:3256 #, c-format msgid "-c %s requires a value" msgstr "-c %s benötigt einen Wert" -#: initdb.c:3200 +#: initdb.c:3281 #, c-format msgid "Running in debug mode.\n" msgstr "Debug-Modus ist an.\n" -#: initdb.c:3204 +#: initdb.c:3285 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "No-Clean-Modus ist an. Bei Fehlern wird nicht aufgeräumt.\n" -#: initdb.c:3274 +#: initdb.c:3358 #, c-format msgid "unrecognized locale provider: %s" msgstr "unbekannter Locale-Provider: %s" -#: initdb.c:3302 +#: initdb.c:3395 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: initdb.c:3309 initdb.c:3313 +#: initdb.c:3402 initdb.c:3406 initdb.c:3410 #, c-format msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgstr "%s kann nur angegeben werden, wenn Locale-Provider »%s« gewählt ist" -#: initdb.c:3327 initdb.c:3404 +#: initdb.c:3424 initdb.c:3487 msgid "syncing data to disk ... " msgstr "synchronisiere Daten auf Festplatte ... " -#: initdb.c:3335 +#: initdb.c:3432 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "Passwortprompt und Passwortdatei können nicht zusammen angegeben werden" -#: initdb.c:3357 -#, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "Argument von --wal-segsize muss eine Zahl sein" - -#: initdb.c:3359 +#: initdb.c:3443 #, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "Argument von --wal-segsize muss eine Zweierpotenz zwischen 1 und 1024 sein" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "Argument von %s muss eine Zweierpotenz zwischen 1 und 1024 sein" -#: initdb.c:3373 +#: initdb.c:3456 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "Superuser-Name »%s« nicht erlaubt; Rollennamen können nicht mit »pg_« anfangen" -#: initdb.c:3375 +#: initdb.c:3458 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -1011,17 +1093,17 @@ msgstr "" "»%s« gehören. Diesem Benutzer muss auch der Serverprozess gehören.\n" "\n" -#: initdb.c:3391 +#: initdb.c:3474 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Datenseitenprüfsummen sind eingeschaltet.\n" -#: initdb.c:3393 +#: initdb.c:3476 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Datenseitenprüfsummen sind ausgeschaltet.\n" -#: initdb.c:3410 +#: initdb.c:3493 #, c-format msgid "" "\n" @@ -1032,22 +1114,22 @@ msgstr "" "Synchronisation auf Festplatte übersprungen.\n" "Das Datenverzeichnis könnte verfälscht werden, falls das Betriebssystem abstürzt.\n" -#: initdb.c:3415 +#: initdb.c:3498 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "Authentifizierung für lokale Verbindungen auf »trust« gesetzt" -#: initdb.c:3416 +#: initdb.c:3499 #, c-format msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." msgstr "Sie können dies ändern, indem Sie pg_hba.conf bearbeiten oder beim nächsten Aufruf von initdb die Option -A, oder --auth-local und --auth-host, verwenden." #. translator: This is a placeholder in a shell command. -#: initdb.c:3446 +#: initdb.c:3529 msgid "logfile" msgstr "logdatei" -#: initdb.c:3448 +#: initdb.c:3531 #, c-format msgid "" "\n" diff --git a/src/bin/initdb/po/el.po b/src/bin/initdb/po/el.po index 7c1c32a090b25..d162d6bab04a7 100644 --- a/src/bin/initdb/po/el.po +++ b/src/bin/initdb/po/el.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: initdb (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-12 08:19+0000\n" -"PO-Revision-Date: 2023-04-12 11:22+0200\n" +"POT-Creation-Date: 2023-08-14 23:19+0000\n" +"PO-Revision-Date: 2023-08-15 11:59+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -40,85 +40,77 @@ msgstr "λεπτομέÏεια: " msgid "hint: " msgstr "υπόδειξη: " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:172 #, c-format -msgid "could not identify current directory: %m" -msgstr "δεν ήταν δυνατή η αναγνώÏιση του Ï„Ïέχοντος καταλόγου: %m" +msgid "invalid binary \"%s\": %m" +msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»: %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:215 #, c-format -msgid "invalid binary \"%s\"" -msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»" +msgid "could not read binary \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»: %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:223 #, c-format msgid "could not find a \"%s\" to execute" msgstr "δεν βÏέθηκε το αÏχείο «%s» για να εκτελεστεί" -#: ../../common/exec.c:282 ../../common/exec.c:321 -#, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" - -#: ../../common/exec.c:299 +#: ../../common/exec.c:250 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "δεν δÏναται η επίλυση διαδÏομής «%s» σε απόλυτη μοÏφή: %m" -#: ../../common/exec.c:422 +#: ../../common/exec.c:412 #, c-format msgid "%s() failed: %m" msgstr "%s() απέτυχε: %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: initdb.c:334 +#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: initdb.c:349 #, c-format msgid "out of memory" msgstr "έλλειψη μνήμης" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "έλλειψη μνήμης\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 +#: ../../common/file_utils.c:87 ../../common/file_utils.c:447 #, c-format msgid "could not stat file \"%s\": %m" msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο «%s»: %m" -#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48 +#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48 +#: ../../common/rmtree.c:63 #, c-format msgid "could not open directory \"%s\": %m" msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m" -#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69 +#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69 +#: ../../common/rmtree.c:104 #, c-format msgid "could not read directory \"%s\": %m" msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m" -#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 -#: ../../common/file_utils.c:365 +#: ../../common/file_utils.c:228 ../../common/file_utils.c:287 +#: ../../common/file_utils.c:361 #, c-format msgid "could not open file \"%s\": %m" msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»: %m" -#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 +#: ../../common/file_utils.c:299 ../../common/file_utils.c:369 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής fsync στο αÏχείο «%s»: %m" -#: ../../common/file_utils.c:383 +#: ../../common/file_utils.c:379 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "δεν ήταν δυνατή η μετονομασία του αÏχείου «%s» σε «%s»: %m" @@ -128,55 +120,45 @@ msgstr "δεν ήταν δυνατή η μετονομασία του αÏχεί msgid "could not close directory \"%s\": %m" msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m" -#: ../../common/restricted_token.c:64 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "δεν ήταν δυνατή η φόÏτωση της βιβλιοθήκης «%s»: κωδικός σφάλματος %lu" - -#: ../../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "δεν ήταν δυνατή η δημιουÏγία διακÏιτικών πεÏιοÏÎ¹ÏƒÎ¼Î¿Ï ÏƒÏ„Î·Î½ παÏοÏσα πλατφόÏμα: κωδικός σφάλματος %lu" - -#: ../../common/restricted_token.c:82 +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "δεν ήταν δυνατό το άνοιγμα διακÏÎ¹Ï„Î¹ÎºÎ¿Ï Î´Î¹ÎµÏγασίας: κωδικός σφάλματος %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "δεν ήταν δυνατή η εκχώÏηση SID: κωδικός σφάλματος %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "δεν ήταν δυνατή η δημιουÏγία διακÏÎ¹Ï„Î¹ÎºÎ¿Ï Î´Î¹ÎµÏγασίας: κωδικός σφάλματος %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "δεν ήταν δυνατή η εκκίνηση διεÏγασίας για την εντολή «%s»: κωδικός σφάλματος %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "δεν ήταν δυνατή η επανεκκίνηση με διακÏιτικό πεÏιοÏισμοÏ: κωδικός σφάλματος %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "δεν ήταν δυνατή η απόκτηση ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎµÎ¾ÏŒÎ´Î¿Ï… από την υποδιεÏγασία: κωδικός σφάλματος %lu" -#: ../../common/rmtree.c:79 +#: ../../common/rmtree.c:95 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο ή κατάλογο «%s»: %m" +msgid "could not remove file \"%s\": %m" +msgstr "δεν ήταν δυνατή η αφαίÏεση του αÏχείου «%s»: %m" -#: ../../common/rmtree.c:101 ../../common/rmtree.c:113 +#: ../../common/rmtree.c:122 #, c-format -msgid "could not remove file or directory \"%s\": %m" -msgstr "δεν ήταν δυνατή η αφαίÏεση αÏχείου ή καταλόγου «%s»: %m" +msgid "could not remove directory \"%s\": %m" +msgstr "δεν ήταν δυνατή η αφαίÏεση του καταλόγου «%s»: %m" #: ../../common/username.c:43 #, c-format @@ -192,289 +174,314 @@ msgstr "ο χÏήστης δεν υπάÏχει" msgid "user name lookup failure: error code %lu" msgstr "αποτυχία αναζήτησης ονόματος χÏήστη: κωδικός σφάλματος %lu" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "εντολή μη εκτελέσιμη" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "εντολή δεν βÏέθηκε" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "απόγονος διεÏγασίας τεÏμάτισε με κωδικό εξόδου %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "απόγονος διεÏγασίας τεÏματίστηκε με εξαίÏεση 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "απόγονος διεÏγασίας τεÏματίστηκε με σήμα %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "απόγονος διεÏγασίας τεÏμάτισε με μη αναγνωÏίσιμη κατάσταση %d" -#: ../../port/dirmod.c:221 +#: ../../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" msgstr "δεν ήταν δυνατός ο οÏισμός διασταÏÏωσης για «%s»: %s\n" -#: ../../port/dirmod.c:298 +#: ../../port/dirmod.c:367 #, c-format msgid "could not get junction for \"%s\": %s\n" msgstr "δεν ήταν δυνατή η απόκτηση διασταÏÏωσης για «%s»: %s\n" -#: initdb.c:464 initdb.c:1459 +#: initdb.c:618 initdb.c:1613 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου «%s» για ανάγνωση: %m" -#: initdb.c:505 initdb.c:809 initdb.c:829 +#: initdb.c:662 initdb.c:966 initdb.c:986 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου «%s» για εγγÏαφή: %m" -#: initdb.c:509 initdb.c:812 initdb.c:831 +#: initdb.c:666 initdb.c:969 initdb.c:988 #, c-format msgid "could not write file \"%s\": %m" msgstr "δεν ήταν δυνατή η εγγÏαφή αÏχείου «%s»: %m" -#: initdb.c:513 +#: initdb.c:670 #, c-format msgid "could not close file \"%s\": %m" msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου «%s»: %m" -#: initdb.c:529 +#: initdb.c:686 #, c-format msgid "could not execute command \"%s\": %m" msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής «%s»: %m" -#: initdb.c:547 +#: initdb.c:704 #, c-format msgid "removing data directory \"%s\"" msgstr "αφαιÏείται ο κατάλογος δεδομένων «%s»" -#: initdb.c:549 +#: initdb.c:706 #, c-format msgid "failed to remove data directory" msgstr "απέτυχε η αφαίÏεση καταλόγου δεδομένων" -#: initdb.c:553 +#: initdb.c:710 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "αφαιÏοÏνται πεÏιεχόμενα του καταλόγου δεδομένων «%s»" -#: initdb.c:556 +#: initdb.c:713 #, c-format msgid "failed to remove contents of data directory" msgstr "απέτυχε η αφαίÏεση πεÏιεχομένων του καταλόγου δεδομένων" -#: initdb.c:561 +#: initdb.c:718 #, c-format msgid "removing WAL directory \"%s\"" msgstr "αφαίÏεση καταλόγου WAL «%s»" -#: initdb.c:563 +#: initdb.c:720 #, c-format msgid "failed to remove WAL directory" msgstr "απέτυχε η αφαίÏεση καταλόγου WAL" -#: initdb.c:567 +#: initdb.c:724 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "αφαιÏοÏνται τα πεÏιεχόμενα του καταλόγου WAL «%s»" -#: initdb.c:569 +#: initdb.c:726 #, c-format msgid "failed to remove contents of WAL directory" msgstr "απέτυχε η αφαίÏεση πεÏιεχόμενων του καταλόγου WAL" -#: initdb.c:576 +#: initdb.c:733 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "ο κατάλογος δεδομένων «%s» δεν αφαιÏείται κατα απαίτηση του χÏήστη" -#: initdb.c:580 +#: initdb.c:737 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "ο κατάλογος WAL «%s» δεν αφαιÏέθηκε κατά απαίτηση του χÏήστη" -#: initdb.c:598 +#: initdb.c:755 #, c-format msgid "cannot be run as root" msgstr "δεν δÏναται η εκτέλεση ως υπεÏχÏήστης" -#: initdb.c:599 +#: initdb.c:756 #, c-format msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." msgstr "ΠαÏακαλώ συνδεθείτε (χÏησιμοποιώντας, Ï€.χ. την εντολή «su») ως ο (μη Ï€ÏονομιοÏχος) χÏήστης που θα είναι κάτοχος της διεÏγασίας του διακομιστή." -#: initdb.c:631 +#: initdb.c:788 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "«%s» δεν είναι έγκυÏο όνομα κωδικοποίησης διακομιστή" -#: initdb.c:775 +#: initdb.c:932 #, c-format msgid "file \"%s\" does not exist" msgstr "το αÏχείο «%s» δεν υπάÏχει" -#: initdb.c:776 initdb.c:781 initdb.c:788 +#: initdb.c:933 initdb.c:938 initdb.c:945 #, c-format msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." msgstr "Αυτό μποÏεί να σημαίνει ότι έχετε μια κατεστÏαμμένη εγκατάσταση ή οÏίσατε λάθος κατάλογο με την επιλογή επίκλησης -L." -#: initdb.c:780 +#: initdb.c:937 #, c-format msgid "could not access file \"%s\": %m" msgstr "δεν ήταν δυνατή η Ï€Ïόσβαση του αÏχείο «%s»: %m" -#: initdb.c:787 +#: initdb.c:944 #, c-format msgid "file \"%s\" is not a regular file" msgstr "το αÏχείο «%s» δεν είναι ένα κανονικό αÏχείο" -#: initdb.c:922 +#: initdb.c:1077 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "επιλογή εφαÏμογής δυναμικής κοινόχÏηστης μνήμης ... " -#: initdb.c:931 +#: initdb.c:1086 #, c-format msgid "selecting default max_connections ... " msgstr "επιλογή Ï€ÏοκαθοÏισμένης τιμής max_connections ... " -#: initdb.c:962 +#: initdb.c:1106 #, c-format msgid "selecting default shared_buffers ... " msgstr "επιλογή Ï€ÏοκαθοÏισμένης τιμής shared_buffers ... " -#: initdb.c:996 +#: initdb.c:1129 #, c-format msgid "selecting default time zone ... " msgstr "επιλογή Ï€ÏοκαθοÏισμένης ζώνης ÏŽÏας ... " -#: initdb.c:1030 +#: initdb.c:1206 msgid "creating configuration files ... " msgstr "δημιουÏγία αÏχείων ÏÏθμισης ... " -#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299 +#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "δεν ήταν δυνατή η αλλαγή δικαιωμάτων του «%s»: %m" -#: initdb.c:1319 +#: initdb.c:1477 #, c-format msgid "running bootstrap script ... " msgstr "εκτέλεση σεναÏίου bootstrap ... " -#: initdb.c:1331 +#: initdb.c:1489 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "το αÏχείο εισόδου «%s» δεν ανήκει στην PostgreSQL %s" -#: initdb.c:1333 +#: initdb.c:1491 #, c-format msgid "Specify the correct path using the option -L." msgstr "ΚαθοÏίστε τη σωστή διαδÏομή χÏησιμοποιώντας την επιλογή -L." -#: initdb.c:1437 +#: initdb.c:1591 msgid "Enter new superuser password: " msgstr "Εισάγετε νέο κωδικό Ï€Ïόσβασης υπεÏχÏήστη: " -#: initdb.c:1438 +#: initdb.c:1592 msgid "Enter it again: " msgstr "Εισάγετε ξανά: " -#: initdb.c:1441 +#: initdb.c:1595 #, c-format msgid "Passwords didn't match.\n" msgstr "Οι κωδικοί Ï€Ïόσβασης δεν είναι ίδιοι.\n" -#: initdb.c:1465 +#: initdb.c:1619 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "δεν ήταν δυνατή η ανάγνωση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης από το αÏχείο «%s»: %m" -#: initdb.c:1468 +#: initdb.c:1622 #, c-format msgid "password file \"%s\" is empty" msgstr "αÏχείο κωδικών Ï€Ïόσβασης «%s» είναι άδειο" -#: initdb.c:1915 +#: initdb.c:2034 #, c-format msgid "caught signal\n" msgstr "συνελήφθει σήμα\n" -#: initdb.c:1921 +#: initdb.c:2040 #, c-format msgid "could not write to child process: %s\n" msgstr "δεν ήταν δυνατή η εγγÏαφή στην απογονική διεÏγασία: %s\n" -#: initdb.c:1929 +#: initdb.c:2048 #, c-format msgid "ok\n" msgstr "εντάξει\n" -#: initdb.c:2018 +#: initdb.c:2137 #, c-format msgid "setlocale() failed" msgstr "setlocale() απέτυχε" -#: initdb.c:2036 +#: initdb.c:2155 #, c-format msgid "failed to restore old locale \"%s\"" msgstr "απέτυχε να επαναφέÏει την παλαιά εντοπιότητα «%s»" -#: initdb.c:2043 +#: initdb.c:2163 #, c-format msgid "invalid locale name \"%s\"" msgstr "άκυÏη ονομασία εντοπιότητας «%s»" -#: initdb.c:2054 +#: initdb.c:2164 +#, c-format +msgid "If the locale name is specific to ICU, use --icu-locale." +msgstr "Αν το όνομα της εντοπιότητας είναι συγκεκÏιμένο για το ICU, χÏησιμοποιήστε --icu-locale." + +#: initdb.c:2177 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "μη έγκυÏες Ïυθμίσεις εντοπιότητας, ελέγξτε τις μεταβλητές πεÏιβάλλοντος LANG και LC_*" -#: initdb.c:2080 initdb.c:2104 +#: initdb.c:2203 initdb.c:2227 #, c-format msgid "encoding mismatch" msgstr "αναντιστοιχία κωδικοποίησης" -#: initdb.c:2081 +#: initdb.c:2204 #, c-format msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." msgstr "Η κωδικοποίηση που επιλέξατε (%s) και η κωδικοποίηση που χÏησιμοποιεί η επιλεγμένη τοπική γλώσσα (%s) δεν ταιÏιάζουν. Αυτό θα οδηγοÏσε σε κακή συμπεÏιφοÏά σε διάφοÏες λειτουÏγίες επεξεÏγασίας συμβολοσειÏών χαÏακτήÏων." -#: initdb.c:2086 initdb.c:2107 +#: initdb.c:2209 initdb.c:2230 #, c-format msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." msgstr "Επανεκτελέστε %s και είτε μην καθοÏίσετε Ïητά μια κωδικοποίηση, είτε επιλέξτε ταιÏιαστό συνδυασμό." -#: initdb.c:2105 +#: initdb.c:2228 #, c-format msgid "The encoding you selected (%s) is not supported with the ICU provider." msgstr "Η κωδικοποίηση που επιλέξατε (%s) δεν υποστηÏίζεται από τον πάÏοχο ICU." -#: initdb.c:2169 +#: initdb.c:2279 #, c-format -msgid "ICU locale must be specified" -msgstr "ICU εντοπιότητα Ï€Ïέπει να έχει καθοÏιστεί" +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "δεν δÏναται η μετατÏοπή ονόματος locale «%s» σε ετικέτα γλώσσας: %s" -#: initdb.c:2176 +#: initdb.c:2285 initdb.c:2337 initdb.c:2416 #, c-format msgid "ICU is not supported in this build" msgstr "ICU δεν υποστηÏίζεται σε αυτήν την πλατφόÏμα" -#: initdb.c:2187 +#: initdb.c:2308 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "δεν δÏναται ο οÏισμός της γλώσσας από το locale «%s»: %s" + +#: initdb.c:2334 +#, c-format +msgid "locale \"%s\" has unknown language \"%s\"" +msgstr "εντοπιότητα «%s» έχει άγνωστη γλώσσα «%s»" + +#: initdb.c:2400 +#, c-format +msgid "ICU locale must be specified" +msgstr "ICU εντοπιότητα Ï€Ïέπει να έχει καθοÏιστεί" + +#: initdb.c:2404 +#, c-format +msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" +msgstr "ΧÏήση ετικέτας γλώσσας «%s» για την εντοπιότητα ICU «%s».\n" + +#: initdb.c:2427 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -483,17 +490,17 @@ msgstr "" "%s αÏχικοποιεί μία συστάδα PostgreSQL βάσης δεδομένων.\n" "\n" -#: initdb.c:2188 +#: initdb.c:2428 #, c-format msgid "Usage:\n" msgstr "ΧÏήση:\n" -#: initdb.c:2189 +#: initdb.c:2429 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [ΕΠΙΛΟΓH]... [DATADIR]\n" -#: initdb.c:2190 +#: initdb.c:2430 #, c-format msgid "" "\n" @@ -502,52 +509,57 @@ msgstr "" "\n" "Επιλογές:\n" -#: initdb.c:2191 +#: initdb.c:2431 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, --auth=METHOD Ï€ÏοκαθοÏισμένη μέθοδος ταυτοποίησης για τοπικές συνδέσεις\n" -#: initdb.c:2192 +#: initdb.c:2432 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr " --auth-host=METHOD Ï€ÏοκαθοÏισμένη μέθοδος ταυτοποίησης για τοπικές συνδέσεις Ï€Ïωτοκόλλου TCP/IP\n" -#: initdb.c:2193 +#: initdb.c:2433 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr " --auth-local=METHOD Ï€ÏοκαθοÏισμένη μέθοδος ταυτοποίησης για συνδέσεις τοπικής υποδοχής\n" -#: initdb.c:2194 +#: initdb.c:2434 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATADIR τοποθεσία για αυτή τη συστάδα βάσης δεδομένων\n" -#: initdb.c:2195 +#: initdb.c:2435 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=ENCODING ÏŒÏισε την Ï€ÏοκαθοÏισμένη κωδικοποίηση για καινοÏÏιες βάσεις δεδομένων\n" -#: initdb.c:2196 +#: initdb.c:2436 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr " -g, --allow-group-access επέτÏεψε εγγÏαφή/ανάγνωση για την ομάδα στο κατάλογο δεδομένων\n" -#: initdb.c:2197 +#: initdb.c:2437 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" -msgstr " --locale=LOCALE ÏŒÏισε την ICU εντοπιότητα για καινοÏÏιες βάσεις δεδομένων\n" +msgstr " --icu-locale=LOCALE ÏŒÏισε την ICU εντοπιότητα για καινοÏÏιες βάσεις δεδομένων\n" -#: initdb.c:2198 +#: initdb.c:2438 +#, c-format +msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" +msgstr " --icu-rules=RULES ÏŒÏισε Ï€Ïόσθετους κανόνες ταξινόμησης ICU για νέες βάσεις δεδομένων\n" + +#: initdb.c:2439 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums χÏησιμοποίησε αθÏοίσματα ελέγχου σελίδων δεδομένων\n" -#: initdb.c:2199 +#: initdb.c:2440 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE ÏŒÏισε την Ï€ÏοκαθοÏισμένη εντοπιότητα για καινοÏÏιες βάσεις δεδομένων\n" -#: initdb.c:2200 +#: initdb.c:2441 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -560,12 +572,12 @@ msgstr "" " ÏŒÏισε την Ï€ÏοκαθοÏισμένη εντοπιότητα για τις σχετικές κατηγοÏίες\n" " καινοÏÏιων βάσεων δεδομένων (Ï€ÏοκαθοÏισμένη τιμή διαβάζεται από το πεÏιβάλλον)\n" -#: initdb.c:2204 +#: initdb.c:2445 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale ισοδÏναμο με --locale=C\n" -#: initdb.c:2205 +#: initdb.c:2446 #, c-format msgid "" " --locale-provider={libc|icu}\n" @@ -574,12 +586,12 @@ msgstr "" " --locale-provider={libc|icu}\n" " ÏŒÏισε τον Ï€ÏοκαθοÏισμένο πάÏοχο εντοπιότητας για νέες βάσεις δεδομένων\n" -#: initdb.c:2207 +#: initdb.c:2448 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=FILE διάβασε τον κωδικό Ï€Ïόσβασης για τον νέο υπεÏχÏήστη από το αÏχείο\n" -#: initdb.c:2208 +#: initdb.c:2449 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -588,27 +600,27 @@ msgstr "" " -T, --text-search-config=CFG\n" " Ï€ÏοκαθοÏισμένη ÏÏθμιση αναζήτησης κειμένου\n" -#: initdb.c:2210 +#: initdb.c:2451 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NAME όνομα υπεÏχÏήστη βάσης δεδομένων\n" -#: initdb.c:2211 +#: initdb.c:2452 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt Ï€ÏοτÏοπή για κωδικό Ï€Ïόσβασης για τον νέο υπεÏχÏήστη\n" -#: initdb.c:2212 +#: initdb.c:2453 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR τοποθεσία για τον κατάλογο write-ahead log\n" -#: initdb.c:2213 +#: initdb.c:2454 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=SIZE μέγεθος των τμημάτων WAL, σε megabytes\n" -#: initdb.c:2214 +#: initdb.c:2455 #, c-format msgid "" "\n" @@ -617,47 +629,52 @@ msgstr "" "\n" "ΛιγότεÏο συχνά χÏησιμοποιοÏμενες επιλογές:\n" -#: initdb.c:2215 +#: initdb.c:2456 +#, c-format +msgid " -c, --set NAME=VALUE override default setting for server parameter\n" +msgstr " -c, --set NAME=VALUE παÏάκαμψε την Ï€Ïοεπιλεγμένη ÏÏθμιση για την παÏάμετÏο του διακομιστή\n" + +#: initdb.c:2457 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug δημιοÏÏγησε πολλές καταγÏαφές αποσφαλμάτωσης\n" -#: initdb.c:2216 +#: initdb.c:2458 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches ÏŒÏισε debug_discard_caches=1\n" -#: initdb.c:2217 +#: initdb.c:2459 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORY τοποθεσία εÏÏεσης αÏχείων εισόδου\n" -#: initdb.c:2218 +#: initdb.c:2460 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean να μην καθαÏιστοÏν σφάλματα\n" -#: initdb.c:2219 +#: initdb.c:2461 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync να μην αναμένει την ασφαλή εγγÏαφή αλλαγών στον δίσκο\n" -#: initdb.c:2220 +#: initdb.c:2462 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions να μην εκτυπώσει οδηγίες για τα επόμενα βήματα\n" -#: initdb.c:2221 +#: initdb.c:2463 #, c-format msgid " -s, --show show internal settings\n" msgstr " -s, --show δείξε τις εσωτεÏικές Ïυθμίσεις\n" -#: initdb.c:2222 +#: initdb.c:2464 #, c-format msgid " -S, --sync-only only sync database files to disk, then exit\n" msgstr " -S, --sync-only συγχÏόνισε μόνο αÏχεία της βάσης δεδομένων στον δίσκο, στη συνέχεια έξοδος\n" -#: initdb.c:2223 +#: initdb.c:2465 #, c-format msgid "" "\n" @@ -666,17 +683,17 @@ msgstr "" "\n" "Άλλες επιλογές:\n" -#: initdb.c:2224 +#: initdb.c:2466 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n" -#: initdb.c:2225 +#: initdb.c:2467 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" -#: initdb.c:2226 +#: initdb.c:2468 #, c-format msgid "" "\n" @@ -687,7 +704,7 @@ msgstr "" "Εάν δεν έχει καθοÏιστεί ο κατάλογος δεδομένων, χÏησιμοποιείται η\n" "μεταβλητή πεÏιβάλλοντος PGDATA.\n" -#: initdb.c:2228 +#: initdb.c:2470 #, c-format msgid "" "\n" @@ -696,72 +713,72 @@ msgstr "" "\n" "Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n" -#: initdb.c:2229 +#: initdb.c:2471 #, c-format msgid "%s home page: <%s>\n" msgstr "%s αÏχική σελίδα: <%s>\n" -#: initdb.c:2257 +#: initdb.c:2499 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "μη έγκυÏη μέθοδος ταυτοποίησης «%s» για συνδέσεις «%s»" -#: initdb.c:2271 +#: initdb.c:2513 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "απαιτείται ο καθοÏισμός ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης για τον υπεÏχÏήστη για να την ενεÏγοποίηση του ελέγχου ταυτότητας ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" -#: initdb.c:2290 +#: initdb.c:2532 #, c-format msgid "no data directory specified" msgstr "δεν οÏίστηκε κατάλογος δεδομένων" -#: initdb.c:2291 +#: initdb.c:2533 #, c-format msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." msgstr "ΠÏέπει να Ï€ÏοσδιοÏίσετε τον κατάλογο όπου θα αποθηκεÏονται τα δεδομένα. Κάντε το είτε με την επιλογή κλήσης -D ή με τη μεταβλητή πεÏιβάλλοντος PGDATA." -#: initdb.c:2308 +#: initdb.c:2550 #, c-format msgid "could not set environment" msgstr "δεν ήταν δυνατή η ÏÏθμιση πεÏιβάλλοντος" -#: initdb.c:2326 +#: initdb.c:2568 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "το Ï€ÏόγÏαμμα «%s» απαιτείται από το %s αλλά δεν βÏέθηκε στον ίδιο κατάλογο με το «%s»." -#: initdb.c:2329 +#: initdb.c:2571 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "το Ï€ÏόγÏαμμα «%s» βÏέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s" -#: initdb.c:2344 +#: initdb.c:2586 #, c-format msgid "input file location must be an absolute path" msgstr "η τοποθεσία του αÏχείου εισόδου Ï€Ïέπει να είναι μία πλήÏης διαδÏομή" -#: initdb.c:2361 +#: initdb.c:2603 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "Η συστάδα βάσης δεδομένων θα αÏχικοποιηθεί με εντοπιότητα «%s».\n" -#: initdb.c:2364 +#: initdb.c:2606 #, c-format msgid "The database cluster will be initialized with this locale configuration:\n" msgstr "Η συστάδα βάσης δεδομένων θα αÏχικοποιηθεί με αυτή τη ÏÏθμιση εντοπιότητας:\n" -#: initdb.c:2365 +#: initdb.c:2607 #, c-format msgid " provider: %s\n" msgstr " πάÏοχος: %s\n" -#: initdb.c:2367 +#: initdb.c:2609 #, c-format msgid " ICU locale: %s\n" msgstr " ICU εντοπιότητα: %s\n" -#: initdb.c:2368 +#: initdb.c:2610 #, c-format msgid "" " LC_COLLATE: %s\n" @@ -778,27 +795,22 @@ msgstr "" " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2385 -#, c-format -msgid "The default database encoding has been set to \"%s\".\n" -msgstr "Η Ï€Ïοεπιλεγμένη κωδικοποίηση βάσης δεδομένων έχει οÏιστεί ως «%s».\n" - -#: initdb.c:2397 +#: initdb.c:2640 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "δεν μπόÏεσε να βÏεθεί κατάλληλη κωδικοποίηση για την εντοπιότητα «%s»" -#: initdb.c:2399 +#: initdb.c:2642 #, c-format msgid "Rerun %s with the -E option." msgstr "Επανεκτελέστε %s με την επιλογή -E." -#: initdb.c:2400 initdb.c:3021 initdb.c:3041 +#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες." -#: initdb.c:2412 +#: initdb.c:2655 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -807,112 +819,107 @@ msgstr "" "Η κωδικοποίηση «%s» που υπονοείται από τις τοπικές Ïυθμίσεις δεν επιτÏέπεται ως κωδικοποίηση από την πλευÏά του διακομιστή.\n" "Η Ï€Ïοεπιλεγμένη κωδικοποίηση βάσης δεδομένων θα οÏιστεί σε «%s».\n" -#: initdb.c:2417 +#: initdb.c:2660 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "εντοπιότητα «%s» Ï€Ïοαπαιτεί τη μην υποστηÏιζόμενη κωδικοποίηση«%s»" -#: initdb.c:2419 +#: initdb.c:2662 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "Η κωδικοποίηση «%s» δεν επιτÏέπεται ως κωδικοποίηση από την πλευÏά του διακομιστή." -#: initdb.c:2421 +#: initdb.c:2664 #, c-format msgid "Rerun %s with a different locale selection." msgstr "Επανεκτελέστε %s με διαφοÏετική επιλογή εντοπιότητας." -#: initdb.c:2429 +#: initdb.c:2672 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "Η Ï€Ïοεπιλεγμένη κωδικοποίηση βάσης δεδομένων έχει οÏιστεί ως «%s».\n" -#: initdb.c:2498 +#: initdb.c:2741 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "δεν ήταν δυνατή η εÏÏεση κατάλληλων Ïυθμίσεων για την μηχανή αναζήτησης για την εντοπιότητα «%s»" -#: initdb.c:2509 +#: initdb.c:2752 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "οι κατάλληλες Ïυθμίσεις για την μηχανή αναζήτησης για την εντοπιότητα «%s» δεν είναι γνωστές" -#: initdb.c:2514 +#: initdb.c:2757 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "η οÏισμένη ÏÏθμιση μηχανής αναζήτησης «%s» μποÏεί να μην ταιÏιάζει με την εντοπιότητα «%s»" -#: initdb.c:2519 +#: initdb.c:2762 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "Η Ï€ÏοκαθοÏισμένη ÏÏθμιση μηχανής αναζήτησης θα οÏιστεί ως «%s».\n" -#: initdb.c:2562 initdb.c:2633 +#: initdb.c:2805 initdb.c:2876 #, c-format msgid "creating directory %s ... " msgstr "δημιουÏγία καταλόγου %s ... " -#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746 +#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985 #, c-format msgid "could not create directory \"%s\": %m" msgstr "δεν ήταν δυνατή η δημιουÏγία του καταλόγου «%s»: %m" -#: initdb.c:2576 initdb.c:2648 +#: initdb.c:2819 initdb.c:2891 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "διοÏθώνονται τα δικαιώματα του υπάÏχοντος καταλόγου %s ... " -#: initdb.c:2581 initdb.c:2653 +#: initdb.c:2824 initdb.c:2896 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "δεν ήταν δυνατή η αλλαγή δικαιωμάτων του καταλόγου «%s»: %m" -#: initdb.c:2593 initdb.c:2665 +#: initdb.c:2836 initdb.c:2908 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "ο κατάλογος «%s» υπάÏχει και δεν είναι άδειος" -#: initdb.c:2597 +#: initdb.c:2840 #, c-format msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." msgstr "Αν θέλετε να δημιουÏγήσετε ένα νέο σÏστημα βάσεων δεδομένων, είτε αφαιÏέστε ή αδειάστε τον κατάλογο «%s» είτε εκτελέστε το %s με ένα άλλο ÏŒÏισμα εκτός από το «%s» ." -#: initdb.c:2605 initdb.c:2675 initdb.c:3058 +#: initdb.c:2848 initdb.c:2918 initdb.c:3325 #, c-format msgid "could not access directory \"%s\": %m" msgstr "δεν ήταν δυνατή η Ï€Ïόσβαση του καταλόγου «%s»: %m" -#: initdb.c:2626 +#: initdb.c:2869 #, c-format msgid "WAL directory location must be an absolute path" msgstr "η τοποθεσία του καταλόγου WAL Ï€Ïέπει να είναι μία πλήÏης διαδÏομή" -#: initdb.c:2669 +#: initdb.c:2912 #, c-format msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." msgstr "Εάν θέλετε να αποθηκεÏσετε το WAL εκεί, είτε αφαιÏέστε ή αδειάστε τον κατάλογο «%s»." -#: initdb.c:2680 +#: initdb.c:2922 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "δεν ήταν δυνατή η δημιουÏγία του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m" -#: initdb.c:2683 -#, c-format -msgid "symlinks are not supported on this platform" -msgstr "συμβολικοί σÏνδεσμοι δεν υποστηÏίζονται στην παÏοÏσα πλατφόÏμα" - -#: initdb.c:2702 +#: initdb.c:2941 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." msgstr "ΠεÏιέχει ένα αÏχείο με Ï€Ïόθεμα κουκκίδας/αόÏατο, ίσως επειδή είναι ένα σημείο Ï€ÏοσάÏτησης." -#: initdb.c:2704 +#: initdb.c:2943 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point." msgstr "ΠεÏιέχει έναν κατάλογο lost+found, ίσως επειδή είναι ένα σημείο Ï€ÏοσάÏτησης." -#: initdb.c:2706 +#: initdb.c:2945 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -921,65 +928,70 @@ msgstr "" "Δεν Ï€Ïοτείνεται η άμεση χÏήση ενός σημείου Ï€ÏοσάÏτησης ως καταλόγου δεδομένων.\n" "ΔημιουÏγείστε έναν υποκατάλογο υπό του σημείου Ï€ÏοσάÏτησης." -#: initdb.c:2732 +#: initdb.c:2971 #, c-format msgid "creating subdirectories ... " msgstr "δημιουÏγία υποκαταλόγων ... " -#: initdb.c:2775 +#: initdb.c:3014 msgid "performing post-bootstrap initialization ... " msgstr "Ï€Ïαγματοποίηση σταδίου αÏχικοποίησης post-bootstrap ... " -#: initdb.c:2940 +#: initdb.c:3175 +#, c-format +msgid "-c %s requires a value" +msgstr "-c %s απαιτεί μια τιμή" + +#: initdb.c:3200 #, c-format msgid "Running in debug mode.\n" msgstr "Εκτέλεση σε λειτουÏγία αποσφαλμάτωσης.\n" -#: initdb.c:2944 +#: initdb.c:3204 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "Εκτέλεση σε λειτουÏγία μη καθαÏισμοÏ. Τα σφάλματα δεν θα καθαÏιστοÏν.\n" -#: initdb.c:3014 +#: initdb.c:3274 #, c-format msgid "unrecognized locale provider: %s" msgstr "μη αναγνωÏίσιμος πάÏοχος εντοπιότητας: %s" -#: initdb.c:3039 +#: initdb.c:3302 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)" -#: initdb.c:3046 +#: initdb.c:3309 initdb.c:3313 #, c-format msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgstr "%s δεν είναι δυνατό να καθοÏιστεί, εκτός εάν επιλεγεί «%s» ως πάÏοχος εντοπιότητας" -#: initdb.c:3060 initdb.c:3137 +#: initdb.c:3327 initdb.c:3404 msgid "syncing data to disk ... " msgstr "συγχÏονίζονται δεδομένα στο δίσκο ... " -#: initdb.c:3068 +#: initdb.c:3335 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "η Ï€ÏοτÏοπή ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎµÎ¹ÏƒÏŒÎ´Î¿Ï… και το αÏχείο ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎµÎ¹ÏƒÏŒÎ´Î¿Ï… δεν δÏναται να οÏιστοÏν ταυτόχÏονα" -#: initdb.c:3090 +#: initdb.c:3357 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "η παÏάμετÏος --wal-segsize Ï€Ïέπει να είναι αÏιθμός" -#: initdb.c:3092 +#: initdb.c:3359 #, c-format msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" msgstr "η παÏάμετÏος --wal-segsize Ï€Ïέπει να έχει τιμή δÏναμης 2 Î¼ÎµÏ„Î±Î¾Ï 1 και 1024" -#: initdb.c:3106 +#: initdb.c:3373 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "το όνομα υπεÏχÏήστη «%s» δεν επιτÏέπεται, τα ονόματα Ïόλων δεν δÏναται να αÏχίζουν με «pg_»" -#: initdb.c:3108 +#: initdb.c:3375 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -990,17 +1002,17 @@ msgstr "" "Αυτός ο χÏήστης Ï€Ïέπει επίσης να κατέχει τη διαδικασία διακομιστή.\n" "\n" -#: initdb.c:3124 +#: initdb.c:3391 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Τα αθÏοίσματα ελέγχου σελίδων δεδομένων είναι ενεÏγοποιημένα.\n" -#: initdb.c:3126 +#: initdb.c:3393 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Τα αθÏοίσματα ελέγχου των σελίδων δεδομένων είναι απενεÏγοποιημένα.\n" -#: initdb.c:3143 +#: initdb.c:3410 #, c-format msgid "" "\n" @@ -1011,22 +1023,22 @@ msgstr "" "Ο συγχÏονισμός με το δίσκο παÏαλείφθηκε.\n" "Ο κατάλογος δεδομένων ενδέχεται να αλλοιωθεί εάν καταÏÏεÏσει το λειτουÏÎ³Î¹ÎºÎ¿Ï ÏƒÏ…ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚.\n" -#: initdb.c:3148 +#: initdb.c:3415 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "ενεÏγοποιείται η μέθοδος ταυτοποίησης «trust» για τοπικές συνδέσεις" -#: initdb.c:3149 +#: initdb.c:3416 #, c-format msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." msgstr "ΜποÏείτε να το αλλάξετε αυτό Ï„Ïοποποιώντας το pg_hba.conf ή χÏησιμοποιώντας την επιλογή -A ή --auth-local και --auth-host, την επόμενη φοÏά που θα εκτελέσετε το initdb." #. translator: This is a placeholder in a shell command. -#: initdb.c:3179 +#: initdb.c:3446 msgid "logfile" msgstr "logfile" -#: initdb.c:3181 +#: initdb.c:3448 #, c-format msgid "" "\n" @@ -1044,8 +1056,41 @@ msgstr "" #~ msgid " --clobber-cache use cache-clobbering debug option\n" #~ msgstr " --clobber-cache χÏησιμοποίησε την επιλογή ÎµÎ½Ï„Î¿Ï€Î¹ÏƒÎ¼Î¿Ï ÏƒÏ†Î±Î»Î¼Î¬Ï„Ï‰Î½ cache-clobbering\n" +#~ msgid "The default database encoding has been set to \"%s\".\n" +#~ msgstr "Η Ï€Ïοεπιλεγμένη κωδικοποίηση βάσης δεδομένων έχει οÏιστεί ως «%s».\n" + +#~ msgid "cannot create restricted tokens on this platform: error code %lu" +#~ msgstr "δεν ήταν δυνατή η δημιουÏγία διακÏιτικών πεÏιοÏÎ¹ÏƒÎ¼Î¿Ï ÏƒÏ„Î·Î½ παÏοÏσα πλατφόÏμα: κωδικός σφάλματος %lu" + +#~ msgid "could not change directory to \"%s\": %m" +#~ msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" + +#~ msgid "could not identify current directory: %m" +#~ msgstr "δεν ήταν δυνατή η αναγνώÏιση του Ï„Ïέχοντος καταλόγου: %m" + +#~ msgid "could not load library \"%s\": error code %lu" +#~ msgstr "δεν ήταν δυνατή η φόÏτωση της βιβλιοθήκης «%s»: κωδικός σφάλματος %lu" + +#~ msgid "could not read binary \"%s\"" +#~ msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»" + +#~ msgid "could not read symbolic link \"%s\": %m" +#~ msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m" + +#~ msgid "could not remove file or directory \"%s\": %m" +#~ msgstr "δεν ήταν δυνατή η αφαίÏεση αÏχείου ή καταλόγου «%s»: %m" + +#~ msgid "could not stat file or directory \"%s\": %m" +#~ msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο ή κατάλογο «%s»: %m" + #~ msgid "fatal: " #~ msgstr "κÏίσιμο: " +#~ msgid "invalid binary \"%s\"" +#~ msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»" + #~ msgid "pclose failed: %m" #~ msgstr "απέτυχε η εντολή pclose: %m" + +#~ msgid "symlinks are not supported on this platform" +#~ msgstr "συμβολικοί σÏνδεσμοι δεν υποστηÏίζονται στην παÏοÏσα πλατφόÏμα" diff --git a/src/bin/initdb/po/es.po b/src/bin/initdb/po/es.po index c649754b36b59..1c12d9c641771 100644 --- a/src/bin/initdb/po/es.po +++ b/src/bin/initdb/po/es.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: initdb (PostgreSQL) 16\n" +"Project-Id-Version: initdb (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:20+0000\n" -"PO-Revision-Date: 2023-05-24 19:22+0200\n" +"POT-Creation-Date: 2025-02-16 19:50+0000\n" +"PO-Revision-Date: 2024-11-16 14:23+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -40,33 +40,48 @@ msgstr "detalle: " msgid "hint: " msgstr "consejo: " -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "binario «%s» no válido: %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "no se pudo leer el binario «%s»: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "no se pudo encontrar un «%s» para ejecutar" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "no se pudo resolver la ruta «%s» a forma absoluta: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 initdb.c:750 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "no se pudo ejecutar la orden «%s»: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "no se pudo leer desde la orden «%s»: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "la orden «%s» no retornó datos" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() falló: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 -#: initdb.c:353 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: initdb.c:372 initdb.c:408 #, c-format msgid "out of memory" msgstr "memoria agotada" @@ -82,35 +97,46 @@ msgstr "memoria agotada\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "no se puede duplicar un puntero nulo (error interno)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:447 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "no se pudo abrir el archivo «%s»: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 #, c-format msgid "could not stat file \"%s\": %m" msgstr "no se pudo hacer stat al archivo «%s»: %m" -#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48 -#: ../../common/rmtree.c:63 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "esta instalación no soporta el método de sync «%s»" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: ../../common/pgfnames.c:48 ../../common/rmtree.c:63 #, c-format msgid "could not open directory \"%s\": %m" msgstr "no se pudo abrir el directorio «%s»: %m" -#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69 -#: ../../common/rmtree.c:104 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: ../../common/pgfnames.c:69 ../../common/rmtree.c:106 #, c-format msgid "could not read directory \"%s\": %m" msgstr "no se pudo leer el directorio «%s»: %m" -#: ../../common/file_utils.c:228 ../../common/file_utils.c:287 -#: ../../common/file_utils.c:361 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "no se pudo abrir el archivo «%s»: %m" - -#: ../../common/file_utils.c:299 ../../common/file_utils.c:369 +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" -#: ../../common/file_utils.c:379 +#: ../../common/file_utils.c:498 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" @@ -148,14 +174,14 @@ msgstr "no se pudo re-ejecutar con el token restringido: código de error %lu" #: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" -msgstr "no se pudo obtener el código de salida del subproceso»: código de error %lu" +msgstr "no se pudo obtener el código de salida del subproceso: código de error %lu" -#: ../../common/rmtree.c:95 +#: ../../common/rmtree.c:97 #, c-format msgid "could not remove file \"%s\": %m" msgstr "no se pudo eliminar el archivo «%s»: %m" -#: ../../common/rmtree.c:122 +#: ../../common/rmtree.c:124 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "no se pudo eliminar el directorio «%s»: %m" @@ -204,6 +230,31 @@ msgstr "el proceso hijo fue terminado por una señal %d: %s" msgid "child process exited with unrecognized status %d" msgstr "el proceso hijo terminó con código no reconocido %d" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "el valor «%s» no es válido para la opción %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s debe estar en el rango %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "método sync no reconocido: %s" + +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "el argumento de la orden de shell contiene un salto de línea o retorno de carro: «%s»\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "el nombre de base de datos contiene un salto de línea o retorno de carro: «%s»\n" + #: ../../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" @@ -214,281 +265,291 @@ msgstr "no se pudo definir un junction para «%s»: %s\n" msgid "could not get junction for \"%s\": %s\n" msgstr "no se pudo obtener junction para «%s»: %s\n" -#: initdb.c:622 initdb.c:1617 +#: initdb.c:369 +#, c-format +msgid "_wsetlocale() failed" +msgstr "_wsetlocale() falló" + +#: initdb.c:376 +#, c-format +msgid "setlocale() failed" +msgstr "setlocale() falló" + +#: initdb.c:390 +#, c-format +msgid "failed to restore old locale" +msgstr "no se pudo restaurar la configuración regional anterior" + +#: initdb.c:393 +#, c-format +msgid "failed to restore old locale \"%s\"" +msgstr "no se pudo restaurar la configuración regional anterior «%s»" + +#: initdb.c:682 initdb.c:1674 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "no se pudo abrir archivo «%s» para lectura: %m" -#: initdb.c:666 initdb.c:970 initdb.c:990 +#: initdb.c:726 initdb.c:1030 initdb.c:1050 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "no se pudo abrir el archivo «%s» para escritura: %m" -#: initdb.c:670 initdb.c:973 initdb.c:992 +#: initdb.c:730 initdb.c:1033 initdb.c:1052 #, c-format msgid "could not write file \"%s\": %m" msgstr "no se pudo escribir el archivo «%s»: %m" -#: initdb.c:674 +#: initdb.c:734 #, c-format msgid "could not close file \"%s\": %m" msgstr "no se pudo cerrar el archivo «%s»: %m" -#: initdb.c:690 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "no se pudo ejecutar la orden «%s»: %m" - -#: initdb.c:708 +#: initdb.c:768 #, c-format msgid "removing data directory \"%s\"" msgstr "eliminando el directorio de datos «%s»" -#: initdb.c:710 +#: initdb.c:770 #, c-format msgid "failed to remove data directory" msgstr "no se pudo eliminar el directorio de datos" -#: initdb.c:714 +#: initdb.c:774 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "eliminando el contenido del directorio «%s»" -#: initdb.c:717 +#: initdb.c:777 #, c-format msgid "failed to remove contents of data directory" msgstr "no se pudo eliminar el contenido del directorio de datos" -#: initdb.c:722 +#: initdb.c:782 #, c-format msgid "removing WAL directory \"%s\"" msgstr "eliminando el directorio de WAL «%s»" -#: initdb.c:724 +#: initdb.c:784 #, c-format msgid "failed to remove WAL directory" msgstr "no se pudo eliminar el directorio de WAL" -#: initdb.c:728 +#: initdb.c:788 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "eliminando el contenido del directorio de WAL «%s»" -#: initdb.c:730 +#: initdb.c:790 #, c-format msgid "failed to remove contents of WAL directory" msgstr "no se pudo eliminar el contenido del directorio de WAL" -#: initdb.c:737 +#: initdb.c:797 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "directorio de datos «%s» no eliminado a petición del usuario" -#: initdb.c:741 +#: initdb.c:801 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "directorio de WAL «%s» no eliminado a petición del usuario" -#: initdb.c:759 +#: initdb.c:819 #, c-format msgid "cannot be run as root" msgstr "no se puede ejecutar como «root»" -#: initdb.c:760 +#: initdb.c:820 #, c-format msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." msgstr "Por favor conéctese (usando, por ejemplo, «su») con un usuario no privilegiado, quien ejecutará el proceso servidor." -#: initdb.c:792 +#: initdb.c:852 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "«%s» no es un nombre válido de codificación" -#: initdb.c:936 +#: initdb.c:996 #, c-format msgid "file \"%s\" does not exist" msgstr "el archivo «%s» no existe" -#: initdb.c:937 initdb.c:942 initdb.c:949 +#: initdb.c:997 initdb.c:1002 initdb.c:1009 #, c-format msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." msgstr "Esto puede significar que tiene una instalación corrupta o ha identificado el directorio equivocado con la opción -L." -#: initdb.c:941 +#: initdb.c:1001 #, c-format msgid "could not access file \"%s\": %m" msgstr "no se pudo acceder al archivo «%s»: %m" -#: initdb.c:948 +#: initdb.c:1008 #, c-format msgid "file \"%s\" is not a regular file" msgstr "el archivo «%s» no es un archivo regular" -#: initdb.c:1081 +#: initdb.c:1141 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "seleccionando implementación de memoria compartida dinámica ... " -#: initdb.c:1090 +#: initdb.c:1150 #, c-format -msgid "selecting default max_connections ... " -msgstr "seleccionando el valor para max_connections ... " +msgid "selecting default \"max_connections\" ... " +msgstr "seleccionando el valor para «max_connections» ... " -#: initdb.c:1110 +#: initdb.c:1170 #, c-format -msgid "selecting default shared_buffers ... " -msgstr "seleccionando el valor para shared_buffers ... " +msgid "selecting default \"shared_buffers\" ... " +msgstr "seleccionando el valor para «shared_buffers» ... " -#: initdb.c:1133 +#: initdb.c:1193 #, c-format msgid "selecting default time zone ... " msgstr "seleccionando el huso horario por omisión ... " -#: initdb.c:1210 +#: initdb.c:1272 msgid "creating configuration files ... " msgstr "creando archivos de configuración ... " -#: initdb.c:1371 initdb.c:1385 initdb.c:1452 initdb.c:1463 +#: initdb.c:1425 initdb.c:1439 initdb.c:1506 initdb.c:1517 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "no se pudo cambiar los permisos de «%s»: %m" -#: initdb.c:1481 +#: initdb.c:1536 #, c-format msgid "running bootstrap script ... " msgstr "ejecutando script de inicio (bootstrap) ... " -#: initdb.c:1493 +#: initdb.c:1548 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "el archivo de entrada «%s» no pertenece a PostgreSQL %s" -#: initdb.c:1495 +#: initdb.c:1550 #, c-format msgid "Specify the correct path using the option -L." msgstr "Especifique la ruta correcta usando la opción -L." -#: initdb.c:1595 +#: initdb.c:1652 msgid "Enter new superuser password: " msgstr "Ingrese la nueva contraseña del superusuario: " -#: initdb.c:1596 +#: initdb.c:1653 msgid "Enter it again: " msgstr "Ingrésela nuevamente: " -#: initdb.c:1599 +#: initdb.c:1656 #, c-format msgid "Passwords didn't match.\n" -msgstr "Las constraseñas no coinciden.\n" +msgstr "Las contraseñas no coinciden.\n" -#: initdb.c:1623 +#: initdb.c:1680 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "no se pudo leer la contraseña desde el archivo «%s»: %m" -#: initdb.c:1626 +#: initdb.c:1683 #, c-format msgid "password file \"%s\" is empty" msgstr "el archivo de contraseña «%s» está vacío" -#: initdb.c:2038 +#: initdb.c:2095 #, c-format msgid "caught signal\n" msgstr "se ha capturado una señal\n" -#: initdb.c:2044 +#: initdb.c:2101 #, c-format msgid "could not write to child process: %s\n" msgstr "no se pudo escribir al proceso hijo: %s\n" -#: initdb.c:2052 +#: initdb.c:2109 #, c-format msgid "ok\n" msgstr "hecho\n" -#: initdb.c:2141 +#: initdb.c:2191 initdb.c:2237 #, c-format -msgid "setlocale() failed" -msgstr "setlocale() falló" - -#: initdb.c:2159 -#, c-format -msgid "failed to restore old locale \"%s\"" -msgstr "no se pudo restaurar la configuración regional anterior «%s»" +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "el nombre de configuración regional «%s» contiene caracteres no ASCII" -#: initdb.c:2166 +#: initdb.c:2217 #, c-format msgid "invalid locale name \"%s\"" msgstr "nombre de configuración regional «%s» no es válido" -#: initdb.c:2177 +#: initdb.c:2218 +#, c-format +msgid "If the locale name is specific to ICU, use --icu-locale." +msgstr "Si el nombre de configuración regional es específico a ICU, utilice --icu-locale." + +#: initdb.c:2231 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "configuración regional inválida; revise las variables de entorno LANG y LC_*" -#: initdb.c:2203 initdb.c:2227 +#: initdb.c:2262 initdb.c:2286 #, c-format msgid "encoding mismatch" msgstr "codificaciones no coinciden" -#: initdb.c:2204 +#: initdb.c:2263 #, c-format msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." msgstr "La codificación que seleccionó (%s) y la codificación de la configuración regional elegida (%s) no coinciden. Esto llevaría a comportamientos erráticos en ciertas funciones de procesamiento de cadenas de caracteres." -#: initdb.c:2209 initdb.c:2230 +#: initdb.c:2268 initdb.c:2289 #, c-format msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." msgstr "" "Vuelva a ejecutar %s sin escoger explícitamente una codificación, o bien\n" "escoja una combinación coincidente." -#: initdb.c:2228 +#: initdb.c:2287 #, c-format msgid "The encoding you selected (%s) is not supported with the ICU provider." msgstr "La codificación que seleccionó (%s) no está soportada con el proveedor ICU." -#: initdb.c:2256 initdb.c:2322 -#, c-format -msgid "could not get language from locale \"%s\": %s" -msgstr "no se pudo el lenguaje de la configuración regional «%s»: %s" - -#: initdb.c:2293 +#: initdb.c:2338 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "no se pudo convertir el nombre de configuración regional «%s» a etiqueta de lenguaje: %s" -#: initdb.c:2299 initdb.c:2352 initdb.c:2394 initdb.c:2474 +#: initdb.c:2344 initdb.c:2396 initdb.c:2488 #, c-format msgid "ICU is not supported in this build" msgstr "ICU no está soportado en este servidor" -#: initdb.c:2349 +#: initdb.c:2367 #, c-format -msgid "locale \"%s\" has unknown language \"%s\"" -msgstr "la configuración regional «%s» tiene lenguaje «%s» desconocido" +msgid "could not get language from locale \"%s\": %s" +msgstr "no se pudo el lenguaje de la configuración regional «%s»: %s" -#: initdb.c:2376 +#: initdb.c:2393 #, c-format -msgid "could not open collator for default locale: %s" -msgstr "no se pudo abrir el «collator» para la configuración regional por omisión: %s" +msgid "locale \"%s\" has unknown language \"%s\"" +msgstr "la configuración regional «%s» no idioma desconocido «%s»" -#: initdb.c:2385 +#: initdb.c:2454 #, c-format -msgid "could not determine default ICU locale" -msgstr "no se pudo determinar la configuración regional ICU por omisión" +msgid "locale must be specified if provider is %s" +msgstr "la configuración regional debe especificarse si el proveedor es %s" -#: initdb.c:2457 +#: initdb.c:2465 #, c-format -msgid "Using default ICU locale \"%s\".\n" -msgstr "Usando la configuración regional ICU por omisión «%s».\n" +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "nombre de configuración regional «%s» no válido para el proveedor builtin" -#: initdb.c:2462 +#: initdb.c:2476 #, c-format msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" -msgstr "Usando la marca de lenguaje «%s» para la configuración regional ICU «%s».\n" +msgstr "Usando la etiqueta de idioma «%s» para la configuración regional ICU «%s».\n" -#: initdb.c:2485 +#: initdb.c:2499 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -497,17 +558,17 @@ msgstr "" "%s inicializa un cluster de base de datos PostgreSQL.\n" "\n" -#: initdb.c:2486 +#: initdb.c:2500 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: initdb.c:2487 +#: initdb.c:2501 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPCIÓN]... [DATADIR]\n" -#: initdb.c:2488 +#: initdb.c:2502 #, c-format msgid "" "\n" @@ -516,69 +577,69 @@ msgstr "" "\n" "Opciones:\n" -#: initdb.c:2489 +#: initdb.c:2503 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr "" " -A, --auth=MÉTODO método de autentificación por omisión para\n" " conexiones locales\n" -#: initdb.c:2490 +#: initdb.c:2504 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr "" " --auth-host=MÉTODO método de autentificación por omisión para\n" " conexiones locales TCP/IP\n" -#: initdb.c:2491 +#: initdb.c:2505 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr "" " --auth-local=MÉTODO método de autentificación por omisión para\n" " conexiones de socket local\n" -#: initdb.c:2492 +#: initdb.c:2506 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATADIR ubicación para este cluster de bases de datos\n" -#: initdb.c:2493 +#: initdb.c:2507 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=CODIF codificación por omisión para nuevas bases de datos\n" -#: initdb.c:2494 +#: initdb.c:2508 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr "" " -g, --allow-group-access dar al grupo permisos de lectura/ejecución sobre\n" " el directorio de datos\n" -#: initdb.c:2495 +#: initdb.c:2509 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" msgstr "" " --icu-locale=LOCALE definir el ID de configuración regional ICU para\n" " nuevas bases de datos\n" -#: initdb.c:2496 +#: initdb.c:2510 #, c-format msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" -msgstr " --icu-rules=REGLAS reglas adicionales ICU en nuevas bases de datos\n" +msgstr " --icu-rules=REGLAS reglas de ordenamiento ICU adicionales para nuevas bases de datos\n" -#: initdb.c:2497 +#: initdb.c:2511 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums activar sumas de verificación en páginas de datos\n" -#: initdb.c:2498 +#: initdb.c:2512 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr "" " --locale=LOCALE configuración regional por omisión para \n" " nuevas bases de datos\n" -#: initdb.c:2499 +#: initdb.c:2513 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -592,27 +653,37 @@ msgstr "" " en la categoría respectiva (el valor por omisión\n" " es tomado de variables de ambiente)\n" -#: initdb.c:2503 +#: initdb.c:2517 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale equivalente a --locale=C\n" -#: initdb.c:2504 +#: initdb.c:2518 +#, c-format +msgid "" +" --builtin-locale=LOCALE\n" +" set builtin locale name for new databases\n" +msgstr "" +" --builtin-locale=LOCALE\n" +" define el nombre de configuración regional builtin\n" +" para nuevas bases de datos\n" + +#: initdb.c:2520 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " set default locale provider for new databases\n" msgstr "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " define el proveedor de configuración regional\n" " para nuevas bases de datos\n" -#: initdb.c:2506 +#: initdb.c:2522 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=ARCHIVO leer contraseña del nuevo superusuario del archivo\n" -#: initdb.c:2507 +#: initdb.c:2523 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -621,27 +692,27 @@ msgstr "" " -T, --text-search-config=CONF\n" " configuración de búsqueda en texto por omisión\n" -#: initdb.c:2509 +#: initdb.c:2525 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=USUARIO nombre del superusuario del cluster\n" -#: initdb.c:2510 +#: initdb.c:2526 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt pedir una contraseña para el nuevo superusuario\n" -#: initdb.c:2511 +#: initdb.c:2527 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR ubicación del directorio WAL\n" -#: initdb.c:2512 +#: initdb.c:2528 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=TAMAÑO tamaño de los segmentos de WAL, en megabytes\n" -#: initdb.c:2513 +#: initdb.c:2529 #, c-format msgid "" "\n" @@ -650,52 +721,57 @@ msgstr "" "\n" "Opciones menos usadas:\n" -#: initdb.c:2514 +#: initdb.c:2530 #, c-format msgid " -c, --set NAME=VALUE override default setting for server parameter\n" -msgstr " -c, --set NOMBRE=VALOR sobreescribe valor por omisión de parámetro de servidor\n" +msgstr " -c, --set VAR=VALOR sobreescribir el valor por omisión del parámetro\n" -#: initdb.c:2515 +#: initdb.c:2531 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug genera mucha salida de depuración\n" -#: initdb.c:2516 +#: initdb.c:2532 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches establece debug_discard_caches=1\n" -#: initdb.c:2517 +#: initdb.c:2533 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORIO donde encontrar los archivos de entrada\n" -#: initdb.c:2518 +#: initdb.c:2534 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean no limpiar después de errores\n" -#: initdb.c:2519 +#: initdb.c:2535 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n" -#: initdb.c:2520 +#: initdb.c:2536 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions no mostrar instrucciones para los siguientes pasos\n" -#: initdb.c:2521 +#: initdb.c:2537 #, c-format -msgid " -s, --show show internal settings\n" -msgstr " -s, --show muestra variables internas\n" +msgid " -s, --show show internal settings, then exit\n" +msgstr " -s, --show muestra variables internas y salir\n" -#: initdb.c:2522 +#: initdb.c:2538 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=MÉTODO definir método para sincronizar archivos a disco\n" + +#: initdb.c:2539 #, c-format msgid " -S, --sync-only only sync database files to disk, then exit\n" msgstr " -S, --sync-only sólo sincronizar el directorio de datos y salir\n" -#: initdb.c:2523 +#: initdb.c:2540 #, c-format msgid "" "\n" @@ -704,17 +780,17 @@ msgstr "" "\n" "Otras opciones:\n" -#: initdb.c:2524 +#: initdb.c:2541 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de version y salir\n" -#: initdb.c:2525 +#: initdb.c:2542 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: initdb.c:2526 +#: initdb.c:2543 #, c-format msgid "" "\n" @@ -725,7 +801,7 @@ msgstr "" "Si el directorio de datos no es especificado, se usa la variable de\n" "ambiente PGDATA.\n" -#: initdb.c:2528 +#: initdb.c:2545 #, c-format msgid "" "\n" @@ -734,72 +810,72 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: initdb.c:2529 +#: initdb.c:2546 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: initdb.c:2557 +#: initdb.c:2570 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "método de autentificación «%s» no válido para conexiones «%s»" -#: initdb.c:2571 +#: initdb.c:2584 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "debe especificar una contraseña al superusuario para activar autentificación mediante contraseña" -#: initdb.c:2590 +#: initdb.c:2603 #, c-format msgid "no data directory specified" msgstr "no se especificó un directorio de datos" -#: initdb.c:2591 +#: initdb.c:2604 #, c-format msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." msgstr "Debe especificar el directorio donde residirán los datos para este clúster. Hágalo usando la opción -D o la variable de ambiente PGDATA." -#: initdb.c:2608 +#: initdb.c:2621 #, c-format msgid "could not set environment" msgstr "no se pudo establecer el ambiente" -#: initdb.c:2626 +#: initdb.c:2639 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "el programa «%s» es requerido por %s pero se encontró en el mismo directorio que «%s»" -#: initdb.c:2629 +#: initdb.c:2642 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "El programa «%s» fue encontrado por «%s», pero no es de la misma versión que %s" -#: initdb.c:2644 +#: initdb.c:2657 #, c-format msgid "input file location must be an absolute path" msgstr "la ubicación de archivos de entrada debe ser una ruta absoluta" -#: initdb.c:2661 +#: initdb.c:2674 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "El cluster será inicializado con configuración regional «%s».\n" -#: initdb.c:2664 +#: initdb.c:2677 #, c-format msgid "The database cluster will be initialized with this locale configuration:\n" msgstr "El cluster será inicializado con esta configuración regional:\n" -#: initdb.c:2665 +#: initdb.c:2678 #, c-format -msgid " provider: %s\n" -msgstr " proveedor: %s\n" +msgid " locale provider: %s\n" +msgstr " proveedor de configuración regional: %s\n" -#: initdb.c:2667 +#: initdb.c:2680 #, c-format -msgid " ICU locale: %s\n" -msgstr " Locale ICU: %s\n" +msgid " default collation: %s\n" +msgstr " ordenamiento por omisión: %s\n" -#: initdb.c:2668 +#: initdb.c:2681 #, c-format msgid "" " LC_COLLATE: %s\n" @@ -816,22 +892,22 @@ msgstr "" " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2698 +#: initdb.c:2711 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "no se pudo encontrar una codificación apropiada para la configuración regional «%s»" -#: initdb.c:2700 +#: initdb.c:2713 #, c-format msgid "Rerun %s with the -E option." msgstr "Ejecute %s nuevamente con la opción -E." -#: initdb.c:2701 initdb.c:3234 initdb.c:3343 initdb.c:3363 +#: initdb.c:2714 initdb.c:3257 initdb.c:3377 initdb.c:3397 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: initdb.c:2713 +#: initdb.c:2726 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -841,109 +917,114 @@ msgstr "" "no puede ser usada como codificación del lado del servidor.\n" "La codificación por omisión será «%s».\n" -#: initdb.c:2718 +#: initdb.c:2731 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "la configuración regional «%s» requiere la codificación no soportada «%s»" -#: initdb.c:2720 +#: initdb.c:2733 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "La codificación «%s» no puede ser usada como codificación del lado del servidor." -#: initdb.c:2722 +#: initdb.c:2735 #, c-format msgid "Rerun %s with a different locale selection." msgstr "Ejecute %s nuevamente con opciones de configuración regional diferente." -#: initdb.c:2730 +#: initdb.c:2743 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "La codificación por omisión ha sido por lo tanto definida a «%s».\n" -#: initdb.c:2799 +#: initdb.c:2757 +#, c-format +msgid "builtin provider locale \"%s\" requires encoding \"%s\"" +msgstr "la configuración regional «%s» del proveedor builtin requiere la codificación «%s»" + +#: initdb.c:2819 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "" "no se pudo encontrar una configuración para búsqueda en texto apropiada\n" "para la configuración regional «%s»" -#: initdb.c:2810 +#: initdb.c:2830 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "la configuración de búsqueda en texto apropiada para la configuración regional «%s» es desconocida" -#: initdb.c:2815 +#: initdb.c:2835 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "la configuración de búsqueda en texto «%s» especificada podría no coincidir con la configuración regional «%s»" -#: initdb.c:2820 +#: initdb.c:2840 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "La configuración de búsqueda en texto ha sido definida a «%s».\n" -#: initdb.c:2863 initdb.c:2934 +#: initdb.c:2883 initdb.c:2954 #, c-format msgid "creating directory %s ... " msgstr "creando el directorio %s ... " -#: initdb.c:2868 initdb.c:2939 initdb.c:2987 initdb.c:3043 +#: initdb.c:2888 initdb.c:2959 initdb.c:3007 initdb.c:3064 #, c-format msgid "could not create directory \"%s\": %m" msgstr "no se pudo crear el directorio «%s»: %m" -#: initdb.c:2877 initdb.c:2949 +#: initdb.c:2897 initdb.c:2969 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "corrigiendo permisos en el directorio existente %s ... " -#: initdb.c:2882 initdb.c:2954 +#: initdb.c:2902 initdb.c:2974 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "no se pudo cambiar los permisos del directorio «%s»: %m" -#: initdb.c:2894 initdb.c:2966 +#: initdb.c:2914 initdb.c:2986 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "el directorio «%s» existe pero no está vacío" -#: initdb.c:2898 +#: initdb.c:2918 #, c-format msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." msgstr "Si quiere crear un nuevo cluster de bases de datos, elimine o vacíe el directorio «%s», o ejecute %s con un argumento distinto de «%s»." -#: initdb.c:2906 initdb.c:2976 initdb.c:3384 +#: initdb.c:2926 initdb.c:2996 initdb.c:3422 #, c-format msgid "could not access directory \"%s\": %m" msgstr "no se pudo acceder al directorio «%s»: %m" -#: initdb.c:2927 +#: initdb.c:2947 #, c-format msgid "WAL directory location must be an absolute path" msgstr "la ubicación del directorio de WAL debe ser una ruta absoluta" -#: initdb.c:2970 +#: initdb.c:2990 #, c-format msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." msgstr "Si quiere almacenar el WAL ahí, elimine o vacíe el directorio «%s»." -#: initdb.c:2980 +#: initdb.c:3000 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "no se pudo crear el enlace simbólico «%s»: %m" -#: initdb.c:2999 +#: initdb.c:3019 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." msgstr "Contiene un archivo invisible o que empieza con un punto (.), quizás por ser un punto de montaje." -#: initdb.c:3001 +#: initdb.c:3021 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point." msgstr "Contiene un directorio lost+found, quizás por ser un punto de montaje." -#: initdb.c:3003 +#: initdb.c:3023 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -952,72 +1033,67 @@ msgstr "" "Usar un punto de montaje directamente como directorio de datos no es recomendado.\n" "Cree un subdirectorio bajo el punto de montaje." -#: initdb.c:3029 +#: initdb.c:3050 #, c-format msgid "creating subdirectories ... " msgstr "creando subdirectorios ... " -#: initdb.c:3072 +#: initdb.c:3093 msgid "performing post-bootstrap initialization ... " msgstr "realizando inicialización post-bootstrap ... " -#: initdb.c:3233 +#: initdb.c:3256 #, c-format msgid "-c %s requires a value" msgstr "-c %s requiere un valor" -#: initdb.c:3258 +#: initdb.c:3281 #, c-format msgid "Running in debug mode.\n" msgstr "Ejecutando en modo de depuración.\n" -#: initdb.c:3262 +#: initdb.c:3285 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "Ejecutando en modo no-clean. Los errores no serán limpiados.\n" -#: initdb.c:3333 +#: initdb.c:3358 #, c-format msgid "unrecognized locale provider: %s" msgstr "proveedor de ordenamiento no reconocido: %s" -#: initdb.c:3361 +#: initdb.c:3395 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: initdb.c:3368 initdb.c:3372 +#: initdb.c:3402 initdb.c:3406 initdb.c:3410 #, c-format msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgstr "%s no puede especificarse a menos que el proveedor de locale «%s» sea escogido" -#: initdb.c:3386 initdb.c:3463 +#: initdb.c:3424 initdb.c:3487 msgid "syncing data to disk ... " msgstr "sincronizando los datos a disco ... " -#: initdb.c:3394 +#: initdb.c:3432 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "" "la petición de contraseña y el archivo de contraseña no pueden\n" "ser especificados simultáneamente" -#: initdb.c:3416 +#: initdb.c:3443 #, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "el argumento de --wal-segsize debe ser un número" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "el argumento de %s debe ser una potencia de dos entre 1 y 1024" -#: initdb.c:3418 -#, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "el argumento de --wal-segsize debe ser una potencia de 2 entre 1 y 1024" - -#: initdb.c:3432 +#: initdb.c:3456 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "nombre de superusuario «%s» no permitido; los nombres de rol no pueden comenzar con «pg_»" -#: initdb.c:3434 +#: initdb.c:3458 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -1028,17 +1104,17 @@ msgstr "" "Este usuario también debe ser quien ejecute el proceso servidor.\n" "\n" -#: initdb.c:3450 +#: initdb.c:3474 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Las sumas de verificación en páginas de datos han sido activadas.\n" -#: initdb.c:3452 +#: initdb.c:3476 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Las sumas de verificación en páginas de datos han sido desactivadas.\n" -#: initdb.c:3469 +#: initdb.c:3493 #, c-format msgid "" "\n" @@ -1050,22 +1126,22 @@ msgstr "" "El directorio de datos podría corromperse si el sistema operativo sufre\n" "una caída.\n" -#: initdb.c:3474 +#: initdb.c:3498 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "activando el método de autentificación «trust» para conexiones locales" -#: initdb.c:3475 +#: initdb.c:3499 #, c-format msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." msgstr "Puede cambiar esto editando pg_hba.conf o usando el parámetro -A, o --auth-local y --auth-host la próxima vez que ejecute initdb." #. translator: This is a placeholder in a shell command. -#: initdb.c:3505 +#: initdb.c:3529 msgid "logfile" msgstr "archivo_de_registro" -#: initdb.c:3507 +#: initdb.c:3531 #, c-format msgid "" "\n" diff --git a/src/bin/initdb/po/fr.po b/src/bin/initdb/po/fr.po index 7d2097e08b2a7..c8a155a62bbeb 100644 --- a/src/bin/initdb/po/fr.po +++ b/src/bin/initdb/po/fr.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-26 08:19+0000\n" -"PO-Revision-Date: 2022-09-26 14:05+0200\n" +"POT-Creation-Date: 2024-10-29 18:21+0000\n" +"PO-Revision-Date: 2024-10-30 07:41+0100\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -21,7 +21,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.1.1\n" +"X-Generator: Poedit 3.5\n" #: ../../../src/common/logging.c:276 #, c-format @@ -43,85 +43,103 @@ msgstr "détail : " msgid "hint: " msgstr "astuce : " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "n'a pas pu identifier le répertoire courant : %m" +msgid "invalid binary \"%s\": %m" +msgstr "binaire « %s » invalide : %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "binaire « %s » invalide" +msgid "could not read binary \"%s\": %m" +msgstr "n'a pas pu lire le binaire « %s » : %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "n'a pas pu lire le binaire « %s »" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "n'a pas pu trouver un « %s » à exécuter" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "n'a pas pu résoudre le chemin « %s » en sa forme absolue : %m" + +#: ../../common/exec.c:382 initdb.c:750 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "n'a pas pu modifier le répertoire par « %s » : %m" +msgid "could not execute command \"%s\": %m" +msgstr "n'a pas pu exécuter la commande « %s » : %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:394 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "n'a pas pu lire le lien symbolique « %s » : %m" +msgid "could not read from command \"%s\": %m" +msgstr "n'a pas pu lire à partir de la commande « %s » : %m" -#: ../../common/exec.c:422 +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "aucune donnée n'a été renvoyée par la commande « %s »" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "échec de %s() : %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: initdb.c:334 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: initdb.c:372 initdb.c:408 #, c-format msgid "out of memory" msgstr "mémoire épuisée" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "mémoire épuisée\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier « %s » : %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 #, c-format msgid "could not stat file \"%s\": %m" msgstr "n'a pas pu tester le fichier « %s » : %m" -#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "cette construction ne supporte pas la méthode de synchronisation « %s »" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: ../../common/pgfnames.c:48 ../../common/rmtree.c:63 #, c-format msgid "could not open directory \"%s\": %m" msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" -#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: ../../common/pgfnames.c:69 ../../common/rmtree.c:106 #, c-format msgid "could not read directory \"%s\": %m" msgstr "n'a pas pu lire le répertoire « %s » : %m" -#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 -#: ../../common/file_utils.c:365 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "n'a pas pu ouvrir le fichier « %s » : %m" - -#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" -#: ../../common/file_utils.c:383 +#: ../../common/file_utils.c:498 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" @@ -131,57 +149,45 @@ msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" msgid "could not close directory \"%s\": %m" msgstr "n'a pas pu fermer le répertoire « %s » : %m" -#: ../../common/restricted_token.c:64 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "n'a pas pu charger la bibliothèque « %s » : code d'erreur %lu" - -#: ../../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "ne peut pas créer les jetons restreints sur cette plateforme : code d'erreur %lu" - -#: ../../common/restricted_token.c:82 +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "n'a pas pu ouvrir le jeton du processus : code d'erreur %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "n'a pas pu allouer les SID : code d'erreur %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "n'a pas pu créer le jeton restreint : code d'erreur %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu" -#: ../../common/rmtree.c:79 +#: ../../common/rmtree.c:97 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "" -"n'a pas pu récupérer les informations sur le fichier ou répertoire\n" -"« %s » : %m" +msgid "could not remove file \"%s\": %m" +msgstr "n'a pas pu supprimer le fichier « %s » : %m" -#: ../../common/rmtree.c:101 ../../common/rmtree.c:113 +#: ../../common/rmtree.c:124 #, c-format -msgid "could not remove file or directory \"%s\": %m" -msgstr "n'a pas pu supprimer le fichier ou répertoire « %s » : %m" +msgid "could not remove directory \"%s\": %m" +msgstr "n'a pas pu supprimer le répertoire « %s » : %m" #: ../../common/username.c:43 #, c-format @@ -197,289 +203,354 @@ msgstr "l'utilisateur n'existe pas" msgid "user name lookup failure: error code %lu" msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "commande non exécutable" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "commande introuvable" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "le processus fils a quitté avec le code de sortie %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "le processus fils a été terminé par l'exception 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "le processus fils a été terminé par le signal %d : %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "le processus fils a quitté avec un statut %d non reconnu" -#: ../../port/dirmod.c:221 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "valeur « %s » invalide pour l'option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s doit être compris entre %d et %d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "méthode de synchronisation non reconnu : %s" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "l'argument de la commande shell contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "le nom de la base contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: ../../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" msgstr "n'a pas pu configurer la jonction pour « %s » : %s\n" -#: ../../port/dirmod.c:298 +#: ../../port/dirmod.c:367 #, c-format msgid "could not get junction for \"%s\": %s\n" msgstr "n'a pas pu obtenir la jonction pour « %s » : %s\n" -#: initdb.c:464 initdb.c:1459 +#: initdb.c:369 +#, c-format +msgid "_wsetlocale() failed" +msgstr "échec de _wsetlocale()" + +#: initdb.c:376 +#, c-format +msgid "setlocale() failed" +msgstr "échec de setlocale()" + +#: initdb.c:390 +#, c-format +msgid "failed to restore old locale" +msgstr "a échoué pour restaurer l'ancienne locale" + +#: initdb.c:393 +#, c-format +msgid "failed to restore old locale \"%s\"" +msgstr "a échoué pour restaurer l'ancienne locale « %s »" + +#: initdb.c:682 initdb.c:1674 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" -#: initdb.c:505 initdb.c:809 initdb.c:829 +#: initdb.c:726 initdb.c:1030 initdb.c:1050 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "n'a pas pu ouvrir le fichier « %s » en écriture : %m" -#: initdb.c:509 initdb.c:812 initdb.c:831 +#: initdb.c:730 initdb.c:1033 initdb.c:1052 #, c-format msgid "could not write file \"%s\": %m" msgstr "impossible d'écrire le fichier « %s » : %m" -#: initdb.c:513 +#: initdb.c:734 #, c-format msgid "could not close file \"%s\": %m" msgstr "n'a pas pu fermer le fichier « %s » : %m" -#: initdb.c:529 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "n'a pas pu exécuter la commande « %s » : %m" - -#: initdb.c:547 +#: initdb.c:768 #, c-format msgid "removing data directory \"%s\"" msgstr "suppression du répertoire des données « %s »" -#: initdb.c:549 +#: initdb.c:770 #, c-format msgid "failed to remove data directory" msgstr "échec de la suppression du répertoire des données" -#: initdb.c:553 +#: initdb.c:774 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "suppression du contenu du répertoire des données « %s »" -#: initdb.c:556 +#: initdb.c:777 #, c-format msgid "failed to remove contents of data directory" msgstr "échec de la suppression du contenu du répertoire des données" -#: initdb.c:561 +#: initdb.c:782 #, c-format msgid "removing WAL directory \"%s\"" msgstr "suppression du répertoire des journaux de transactions « %s »" -#: initdb.c:563 +#: initdb.c:784 #, c-format msgid "failed to remove WAL directory" msgstr "échec de la suppression du répertoire des journaux de transactions" -#: initdb.c:567 +#: initdb.c:788 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "suppression du contenu du répertoire des journaux de transactions « %s »" -#: initdb.c:569 +#: initdb.c:790 #, c-format msgid "failed to remove contents of WAL directory" msgstr "échec de la suppression du contenu du répertoire des journaux de transactions" -#: initdb.c:576 +#: initdb.c:797 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "répertoire des données « %s » non supprimé à la demande de l'utilisateur" -#: initdb.c:580 +#: initdb.c:801 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "répertoire des journaux de transactions « %s » non supprimé à la demande de l'utilisateur" -#: initdb.c:598 +#: initdb.c:819 #, c-format msgid "cannot be run as root" msgstr "ne peut pas être exécuté en tant que root" -#: initdb.c:599 +#: initdb.c:820 #, c-format msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." msgstr "Connectez-vous (par exemple en utilisant « su ») sous l'utilisateur (non privilégié) qui sera propriétaire du processus serveur." -#: initdb.c:631 +#: initdb.c:852 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "« %s » n'est pas un nom d'encodage serveur valide" -#: initdb.c:775 +#: initdb.c:996 #, c-format msgid "file \"%s\" does not exist" msgstr "le rôle « %s » n'existe pas" -#: initdb.c:776 initdb.c:781 initdb.c:788 +#: initdb.c:997 initdb.c:1002 initdb.c:1009 #, c-format msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." msgstr "Cela peut signifier que votre installation est corrompue ou que vous avez identifié le mauvais répertoire avec l'option -L." -#: initdb.c:780 +#: initdb.c:1001 #, c-format msgid "could not access file \"%s\": %m" msgstr "n'a pas pu accéder au fichier « %s » : %m" -#: initdb.c:787 +#: initdb.c:1008 #, c-format msgid "file \"%s\" is not a regular file" msgstr "le fichier « %s » n'est pas un fichier standard" -#: initdb.c:922 +#: initdb.c:1141 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "sélection de l'implémentation de la mémoire partagée dynamique..." -#: initdb.c:931 +#: initdb.c:1150 #, c-format -msgid "selecting default max_connections ... " -msgstr "sélection de la valeur par défaut pour max_connections... " +msgid "selecting default \"max_connections\" ... " +msgstr "sélection de la valeur par défaut pour « max_connections »... " -#: initdb.c:962 +#: initdb.c:1170 #, c-format -msgid "selecting default shared_buffers ... " -msgstr "sélection de la valeur par défaut pour shared_buffers... " +msgid "selecting default \"shared_buffers\" ... " +msgstr "sélection de la valeur par défaut pour « shared_buffers »... " -#: initdb.c:996 +#: initdb.c:1193 #, c-format msgid "selecting default time zone ... " msgstr "sélection du fuseau horaire par défaut... " -#: initdb.c:1030 +#: initdb.c:1272 msgid "creating configuration files ... " msgstr "création des fichiers de configuration... " -#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299 +#: initdb.c:1425 initdb.c:1439 initdb.c:1506 initdb.c:1517 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "n'a pas pu modifier les droits de « %s » : %m" -#: initdb.c:1319 +#: initdb.c:1536 #, c-format msgid "running bootstrap script ... " msgstr "lancement du script bootstrap..." -#: initdb.c:1331 +#: initdb.c:1548 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "le fichier en entrée « %s » n'appartient pas à PostgreSQL %s" -#: initdb.c:1333 +#: initdb.c:1550 #, c-format msgid "Specify the correct path using the option -L." msgstr "Indiquez le bon chemin avec l'option -L." -#: initdb.c:1437 +#: initdb.c:1652 msgid "Enter new superuser password: " msgstr "Saisir le nouveau mot de passe du super-utilisateur : " -#: initdb.c:1438 +#: initdb.c:1653 msgid "Enter it again: " msgstr "Saisir le mot de passe à nouveau : " -#: initdb.c:1441 +#: initdb.c:1656 #, c-format msgid "Passwords didn't match.\n" msgstr "Les mots de passe ne sont pas identiques.\n" -#: initdb.c:1465 +#: initdb.c:1680 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "n'a pas pu lire le mot de passe à partir du fichier « %s » : %m" -#: initdb.c:1468 +#: initdb.c:1683 #, c-format msgid "password file \"%s\" is empty" msgstr "le fichier de mots de passe « %s » est vide" -#: initdb.c:1915 +#: initdb.c:2095 #, c-format msgid "caught signal\n" msgstr "signal reçu\n" -#: initdb.c:1921 +#: initdb.c:2101 #, c-format msgid "could not write to child process: %s\n" msgstr "n'a pas pu écrire au processus fils : %s\n" -#: initdb.c:1929 +#: initdb.c:2109 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2018 -#, c-format -msgid "setlocale() failed" -msgstr "échec de setlocale()" - -#: initdb.c:2036 +#: initdb.c:2191 initdb.c:2237 #, c-format -msgid "failed to restore old locale \"%s\"" -msgstr "a échoué pour restaurer l'ancienne locale « %s »" +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "le nom de la locale « %s » contient des caractères non ASCII" -#: initdb.c:2043 +#: initdb.c:2217 #, c-format msgid "invalid locale name \"%s\"" msgstr "nom de locale « %s » invalide" -#: initdb.c:2054 +#: initdb.c:2218 +#, c-format +msgid "If the locale name is specific to ICU, use --icu-locale." +msgstr "Si le nom de la locale est spécifique à ICU, utilisez --icu-locale." + +#: initdb.c:2231 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "configuration invalide de la locale ; vérifiez les variables d'environnement LANG et LC_*" -#: initdb.c:2080 initdb.c:2104 +#: initdb.c:2262 initdb.c:2286 #, c-format msgid "encoding mismatch" msgstr "différence d'encodage" -#: initdb.c:2081 +#: initdb.c:2263 #, c-format msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." msgstr "L'encodage que vous avez sélectionné (%s) et celui que la locale sélectionnée utilise (%s) ne sont pas compatibles. Cela peut conduire à des erreurs dans les fonctions de manipulation de chaînes de caractères." -#: initdb.c:2086 initdb.c:2107 +#: initdb.c:2268 initdb.c:2289 #, c-format msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." msgstr "Relancez %s et soit vous ne spécifiez pas explicitement d'encodage, soit vous choisissez une combinaison compatible." -#: initdb.c:2105 +#: initdb.c:2287 #, c-format msgid "The encoding you selected (%s) is not supported with the ICU provider." msgstr "L'encodage que vous avez sélectionné (%s) n'est pas supporté avec le fournisseur ICU." -#: initdb.c:2169 +#: initdb.c:2338 #, c-format -msgid "ICU locale must be specified" -msgstr "la locale ICU doit être précisée" +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "n'a pas pu convertir le nom de locale « %s » en balise de langage : %s" -#: initdb.c:2176 +#: initdb.c:2344 initdb.c:2396 initdb.c:2488 #, c-format msgid "ICU is not supported in this build" msgstr "ICU n'est pas supporté dans cette installation" -#: initdb.c:2187 +#: initdb.c:2367 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "n'a pas pu obtenir la langue à partir de la locale « %s » : %s" + +#: initdb.c:2393 +#, c-format +msgid "locale \"%s\" has unknown language \"%s\"" +msgstr "la locale « %s » a le langage inconnu « %s »" + +#: initdb.c:2454 +#, c-format +msgid "locale must be specified if provider is %s" +msgstr "la locale doit être spécifiée si le fournisseur est %s" + +#: initdb.c:2465 +#, c-format +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "nom de locale « %s » invalide pour le fournisseur natif" + +#: initdb.c:2476 +#, c-format +msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" +msgstr "Utilisation de la balise de langage « %s » pour la locale ICU « %s ».\n" + +#: initdb.c:2499 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -488,17 +559,17 @@ msgstr "" "%s initialise une instance PostgreSQL.\n" "\n" -#: initdb.c:2188 +#: initdb.c:2500 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: initdb.c:2189 +#: initdb.c:2501 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [RÉP_DONNÉES]\n" -#: initdb.c:2190 +#: initdb.c:2502 #, c-format msgid "" "\n" @@ -507,66 +578,71 @@ msgstr "" "\n" "Options :\n" -#: initdb.c:2191 +#: initdb.c:2503 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr "" " -A, --auth=MÉTHODE méthode d'authentification par défaut pour les\n" " connexions locales\n" -#: initdb.c:2192 +#: initdb.c:2504 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr "" " --auth-host=MÉTHODE méthode d'authentification par défaut pour les\n" " connexions locales TCP/IP\n" -#: initdb.c:2193 +#: initdb.c:2505 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr "" " --auth-local=MÉTHODE méthode d'authentification par défaut pour les\n" " connexions locales socket\n" -#: initdb.c:2194 +#: initdb.c:2506 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]RÉP_DONNÉES emplacement du répertoire principal des données\n" -#: initdb.c:2195 +#: initdb.c:2507 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr "" " -E, --encoding=ENCODAGE initialise l'encodage par défaut des nouvelles\n" " bases de données\n" -#: initdb.c:2196 +#: initdb.c:2508 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr "" " -g, --allow-group-access autorise la lecture/écriture pour le groupe sur\n" " le répertoire des données\n" -#: initdb.c:2197 +#: initdb.c:2509 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" msgstr " --icu-locale=LOCALE initialise l'identifiant de locale ICU pour les nouvelles bases de données\n" -#: initdb.c:2198 +#: initdb.c:2510 +#, c-format +msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" +msgstr " --icu-rules=REGLES initialise les règles supplémentaires de la locale ICU pour les nouvelles bases de données\n" + +#: initdb.c:2511 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr "" " -k, --data-checksums active les sommes de contrôle pour les blocs des\n" " fichiers de données\n" -#: initdb.c:2199 +#: initdb.c:2512 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr "" " --locale=LOCALE initialise la locale par défaut pour les\n" " nouvelles bases de données\n" -#: initdb.c:2200 +#: initdb.c:2513 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -581,29 +657,39 @@ msgstr "" " (les valeurs par défaut sont prises dans\n" " l'environnement)\n" -#: initdb.c:2204 +#: initdb.c:2517 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale équivalent à --locale=C\n" -#: initdb.c:2205 +#: initdb.c:2518 +#, c-format +msgid "" +" --builtin-locale=LOCALE\n" +" set builtin locale name for new databases\n" +msgstr "" +" --builtin-provider=LOCALE\n" +" initialise le fournisseur de locale natif pour\n" +" les nouvelles bases de données\n" + +#: initdb.c:2520 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " set default locale provider for new databases\n" msgstr "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " initialise le fournisseur de locale par défaut pour\n" " les nouvelles bases de données\n" -#: initdb.c:2207 +#: initdb.c:2522 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr "" " --pwfile=FICHIER lit le mot de passe du nouveau super-utilisateur\n" " à partir de ce fichier\n" -#: initdb.c:2208 +#: initdb.c:2523 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -612,31 +698,31 @@ msgstr "" " -T, --text-search-config=CFG configuration par défaut de la recherche plein\n" " texte\n" -#: initdb.c:2210 +#: initdb.c:2525 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NOM nom du super-utilisateur de la base de données\n" -#: initdb.c:2211 +#: initdb.c:2526 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr "" " -W, --pwprompt demande un mot de passe pour le nouveau\n" " super-utilisateur\n" -#: initdb.c:2212 +#: initdb.c:2527 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr "" " -X, --waldir=RÉP_WAL emplacement du répertoire des journaux de\n" " transactions\n" -#: initdb.c:2213 +#: initdb.c:2528 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=TAILLE configure la taille des segments WAL, en Mo\n" -#: initdb.c:2214 +#: initdb.c:2529 #, c-format msgid "" "\n" @@ -645,53 +731,63 @@ msgstr "" "\n" "Options moins utilisées :\n" -#: initdb.c:2215 +#: initdb.c:2530 +#, c-format +msgid " -c, --set NAME=VALUE override default setting for server parameter\n" +msgstr " -c NOM=VALEUR surcharge la configuration par défaut d'un paramètre serveur\n" + +#: initdb.c:2531 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug engendre un grand nombre de traces de débogage\n" -#: initdb.c:2216 +#: initdb.c:2532 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches initialise debug_discard_caches à 1\n" -#: initdb.c:2217 +#: initdb.c:2533 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr "" " -L RÉPERTOIRE indique où trouver les fichiers servant à la\n" " création de l'instance\n" -#: initdb.c:2218 +#: initdb.c:2534 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --noclean ne nettoie pas après des erreurs\n" -#: initdb.c:2219 +#: initdb.c:2535 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " -N, --nosync n'attend pas que les modifications soient\n" " proprement écrites sur disque\n" -#: initdb.c:2220 +#: initdb.c:2536 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr "" " --no-instructions n'affiche pas les instructions des prochaines\n" " étapes\n" -#: initdb.c:2221 +#: initdb.c:2537 #, c-format -msgid " -s, --show show internal settings\n" -msgstr " -s, --show affiche la configuration interne\n" +msgid " -s, --show show internal settings, then exit\n" +msgstr " -s, --show affiche la configuration interne, puis quitte\n" -#: initdb.c:2222 +#: initdb.c:2538 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHODE configure la méthode pour synchroniser les fichiers sur disque\n" + +#: initdb.c:2539 #, c-format msgid " -S, --sync-only only sync database files to disk, then exit\n" msgstr " -S, --sync-only synchronise uniquement le répertoire des données, puis quitte\n" -#: initdb.c:2223 +#: initdb.c:2540 #, c-format msgid "" "\n" @@ -700,17 +796,17 @@ msgstr "" "\n" "Autres options :\n" -#: initdb.c:2224 +#: initdb.c:2541 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: initdb.c:2225 +#: initdb.c:2542 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: initdb.c:2226 +#: initdb.c:2543 #, c-format msgid "" "\n" @@ -721,7 +817,7 @@ msgstr "" "Si le répertoire des données n'est pas indiqué, la variable d'environnement\n" "PGDATA est utilisée.\n" -#: initdb.c:2228 +#: initdb.c:2545 #, c-format msgid "" "\n" @@ -730,72 +826,72 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: initdb.c:2229 +#: initdb.c:2546 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" -#: initdb.c:2257 +#: initdb.c:2570 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "méthode d'authentification « %s » invalide pour « %s » connexions" -#: initdb.c:2271 +#: initdb.c:2584 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "doit indiquer un mot de passe pour le super-utilisateur afin d'activer l'authentification par mot de passe" -#: initdb.c:2290 +#: initdb.c:2603 #, c-format msgid "no data directory specified" msgstr "aucun répertoire de données indiqué" -#: initdb.c:2291 +#: initdb.c:2604 #, c-format msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." msgstr "Vous devez identifier le répertoire où résideront les données pour ce système de bases de données. Faites-le soit avec l'option -D soit avec la variable d'environnement PGDATA." -#: initdb.c:2308 +#: initdb.c:2621 #, c-format msgid "could not set environment" msgstr "n'a pas pu configurer l'environnement" -#: initdb.c:2326 +#: initdb.c:2639 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »" -#: initdb.c:2329 +#: initdb.c:2642 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s" -#: initdb.c:2344 +#: initdb.c:2657 #, c-format msgid "input file location must be an absolute path" msgstr "l'emplacement du fichier d'entrée doit être indiqué avec un chemin absolu" -#: initdb.c:2361 +#: initdb.c:2674 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "L'instance sera initialisée avec la locale « %s ».\n" -#: initdb.c:2364 +#: initdb.c:2677 #, c-format msgid "The database cluster will be initialized with this locale configuration:\n" msgstr "L'instance sera initialisée avec cette configuration de locale :\n" -#: initdb.c:2365 +#: initdb.c:2678 #, c-format -msgid " provider: %s\n" -msgstr " fournisseur: %s\n" +msgid " locale provider: %s\n" +msgstr " fournisseur de locale : %s\n" -#: initdb.c:2367 +#: initdb.c:2680 #, c-format -msgid " ICU locale: %s\n" -msgstr " locale ICU : %s\n" +msgid " default collation: %s\n" +msgstr "collation par défaut : %s\n" -#: initdb.c:2368 +#: initdb.c:2681 #, c-format msgid "" " LC_COLLATE: %s\n" @@ -812,27 +908,22 @@ msgstr "" " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2385 -#, c-format -msgid "The default database encoding has been set to \"%s\".\n" -msgstr "L'encodage par défaut des bases de données a été configuré à « %s ».\n" - -#: initdb.c:2397 +#: initdb.c:2711 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "n'a pas pu trouver un encodage adéquat pour la locale « %s »" -#: initdb.c:2399 +#: initdb.c:2713 #, c-format msgid "Rerun %s with the -E option." msgstr "Relancez %s avec l'option -E." -#: initdb.c:2400 initdb.c:3021 initdb.c:3041 +#: initdb.c:2714 initdb.c:3257 initdb.c:3377 initdb.c:3397 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." -#: initdb.c:2412 +#: initdb.c:2726 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -841,114 +932,114 @@ msgstr "" "L'encodage « %s » a été déduit de la locale mais n'est pas autorisé en tant qu'encodage serveur.\n" "L'encodage par défaut des bases de données sera configuré à « %s ».\n" -#: initdb.c:2417 +#: initdb.c:2731 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "la locale « %s » nécessite l'encodage « %s » non supporté" -#: initdb.c:2419 +#: initdb.c:2733 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "L'encodage « %s » n'est pas autorisé en tant qu'encodage serveur." -#: initdb.c:2421 +#: initdb.c:2735 #, c-format msgid "Rerun %s with a different locale selection." msgstr "Relancez %s avec une locale différente." -#: initdb.c:2429 +#: initdb.c:2743 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "" "L'encodage par défaut des bases de données a été configuré en conséquence\n" "avec « %s ».\n" -#: initdb.c:2498 +#: initdb.c:2757 +#, c-format +msgid "builtin provider locale \"%s\" requires encoding \"%s\"" +msgstr "la locale du fournisseur natif « %s » nécessite l'encodage « %s »" + +#: initdb.c:2819 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "n'a pas pu trouver la configuration de la recherche plein texte en adéquation avec la locale « %s »" -#: initdb.c:2509 +#: initdb.c:2830 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "la configuration de la recherche plein texte convenable pour la locale « %s » est inconnue" -#: initdb.c:2514 +#: initdb.c:2835 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "la configuration indiquée pour la recherche plein texte, « %s », pourrait ne pas correspondre à la locale « %s »" -#: initdb.c:2519 +#: initdb.c:2840 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "La configuration de la recherche plein texte a été initialisée à « %s ».\n" -#: initdb.c:2562 initdb.c:2633 +#: initdb.c:2883 initdb.c:2954 #, c-format msgid "creating directory %s ... " msgstr "création du répertoire %s... " -#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746 +#: initdb.c:2888 initdb.c:2959 initdb.c:3007 initdb.c:3064 #, c-format msgid "could not create directory \"%s\": %m" msgstr "n'a pas pu créer le répertoire « %s » : %m" -#: initdb.c:2576 initdb.c:2648 +#: initdb.c:2897 initdb.c:2969 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "correction des droits sur le répertoire existant %s... " -#: initdb.c:2581 initdb.c:2653 +#: initdb.c:2902 initdb.c:2974 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "n'a pas pu modifier les droits du répertoire « %s » : %m" -#: initdb.c:2593 initdb.c:2665 +#: initdb.c:2914 initdb.c:2986 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "le répertoire « %s » existe mais n'est pas vide" -#: initdb.c:2597 +#: initdb.c:2918 #, c-format msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." msgstr "Si vous voulez créer un nouveau système de bases de données, supprimez ou videz le répertoire « %s ». Vous pouvez aussi exécuter %s avec un argument autre que « %s »." -#: initdb.c:2605 initdb.c:2675 initdb.c:3058 +#: initdb.c:2926 initdb.c:2996 initdb.c:3422 #, c-format msgid "could not access directory \"%s\": %m" msgstr "n'a pas pu accéder au répertoire « %s » : %m" -#: initdb.c:2626 +#: initdb.c:2947 #, c-format msgid "WAL directory location must be an absolute path" msgstr "l'emplacement du répertoire des journaux de transactions doit être indiqué avec un chemin absolu" -#: initdb.c:2669 +#: initdb.c:2990 #, c-format msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." msgstr "Si vous voulez enregistrer ici les WAL, supprimez ou videz le répertoire « %s »." -#: initdb.c:2680 +#: initdb.c:3000 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "n'a pas pu créer le lien symbolique « %s » : %m" -#: initdb.c:2683 -#, c-format -msgid "symlinks are not supported on this platform" -msgstr "les liens symboliques ne sont pas supportés sur cette plateforme" - -#: initdb.c:2702 +#: initdb.c:3019 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." msgstr "Il contient un fichier invisible, peut-être parce qu'il s'agit d'un point de montage." -#: initdb.c:2704 +#: initdb.c:3021 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point." msgstr "Il contient un répertoire lost+found, peut-être parce qu'il s'agit d'un point de montage.\\" -#: initdb.c:2706 +#: initdb.c:3023 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -957,67 +1048,67 @@ msgstr "" "Utiliser un point de montage comme répertoire des données n'est pas recommandé.\n" "Créez un sous-répertoire sous le point de montage." -#: initdb.c:2732 +#: initdb.c:3050 #, c-format msgid "creating subdirectories ... " msgstr "création des sous-répertoires... " -#: initdb.c:2775 +#: initdb.c:3093 msgid "performing post-bootstrap initialization ... " msgstr "exécution de l'initialisation après bootstrap... " -#: initdb.c:2940 +#: initdb.c:3256 +#, c-format +msgid "-c %s requires a value" +msgstr "-c %s requiert une valeur" + +#: initdb.c:3281 #, c-format msgid "Running in debug mode.\n" msgstr "Lancé en mode débogage.\n" -#: initdb.c:2944 +#: initdb.c:3285 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "Lancé en mode « sans nettoyage ». Les erreurs ne seront pas nettoyées.\n" -#: initdb.c:3014 +#: initdb.c:3358 #, c-format msgid "unrecognized locale provider: %s" msgstr "fournisseur de locale non reconnu : %s" -#: initdb.c:3039 +#: initdb.c:3395 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: initdb.c:3046 +#: initdb.c:3402 initdb.c:3406 initdb.c:3410 #, c-format msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgstr "%s ne peut pas être spécifié sauf si le fournisseur de locale « %s » est choisi" -#: initdb.c:3060 initdb.c:3137 +#: initdb.c:3424 initdb.c:3487 msgid "syncing data to disk ... " msgstr "synchronisation des données sur disque... " -#: initdb.c:3068 +#: initdb.c:3432 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "" "les options d'invite du mot de passe et de fichier de mots de passe ne\n" "peuvent pas être indiquées simultanément" -#: initdb.c:3090 +#: initdb.c:3443 #, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "l'argument de --wal-segsize doit être un nombre" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "l'argument de %s doit être une puissance de 2 comprise entre 1 et 1024" -#: initdb.c:3092 -#, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "l'argument de --wal-segsize doit être une puissance de 2 comprise entre 1 et 1024" - -#: initdb.c:3106 +#: initdb.c:3456 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "le nom de superutilisateur « %s » n'est pas autorisé ; les noms de rôle ne peuvent pas commencer par « pg_ »" -#: initdb.c:3108 +#: initdb.c:3458 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -1028,17 +1119,17 @@ msgstr "" "Le processus serveur doit également lui appartenir.\n" "\n" -#: initdb.c:3124 +#: initdb.c:3474 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Les sommes de contrôle des pages de données sont activées.\n" -#: initdb.c:3126 +#: initdb.c:3476 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Les sommes de contrôle des pages de données sont désactivées.\n" -#: initdb.c:3143 +#: initdb.c:3493 #, c-format msgid "" "\n" @@ -1049,22 +1140,22 @@ msgstr "" "Synchronisation sur disque ignorée.\n" "Le répertoire des données pourrait être corrompu si le système d'exploitation s'arrêtait brutalement.\n" -#: initdb.c:3148 +#: initdb.c:3498 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "activation de l'authentification « trust » pour les connexions locales" -#: initdb.c:3149 +#: initdb.c:3499 #, c-format msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." msgstr "Vous pouvez changer cette configuration en éditant le fichier pg_hba.conf ou en utilisant l'option -A, ou --auth-local et --auth-host, à la prochaine exécution d'initdb." #. translator: This is a placeholder in a shell command. -#: initdb.c:3179 +#: initdb.c:3529 msgid "logfile" msgstr "fichier_de_trace" -#: initdb.c:3181 +#: initdb.c:3531 #, c-format msgid "" "\n" @@ -1078,219 +1169,3 @@ msgstr "" "\n" " %s\n" "\n" - -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" - -#~ msgid "%s: The password file was not generated. Please report this problem.\n" -#~ msgstr "" -#~ "%s : le fichier de mots de passe n'a pas été créé.\n" -#~ "Merci de rapporter ce problème.\n" - -#~ msgid "%s: could not access directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n" - -#~ msgid "%s: could not access file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu accéder au fichier « %s » : %s\n" - -#~ msgid "%s: could not close directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n" - -#~ msgid "%s: could not create directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le répertoire « %s » : %s\n" - -#~ msgid "%s: could not create symbolic link \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le lien symbolique « %s » : %s\n" - -#~ msgid "%s: could not determine valid short version string\n" -#~ msgstr "%s : n'a pas pu déterminer une chaîne de version courte valide\n" - -#~ msgid "%s: could not execute command \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu exécuter la commande « %s » : %s\n" - -#~ msgid "%s: could not fsync file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n" - -#~ msgid "%s: could not get current user name: %s\n" -#~ msgstr "%s : n'a pas pu obtenir le nom de l'utilisateur courant : %s\n" - -#~ msgid "%s: could not obtain information about current user: %s\n" -#~ msgstr "%s : n'a pas pu obtenir d'informations sur l'utilisateur courant : %s\n" - -#~ msgid "%s: could not open directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" - -#~ msgid "%s: could not open file \"%s\" for reading: %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n" - -#~ msgid "%s: could not open file \"%s\" for writing: %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en écriture : %s\n" - -#~ msgid "%s: could not open file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" - -#~ msgid "%s: could not read directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" - -#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu renommer le fichier « %s » en « %s » : %s\n" - -#~ msgid "%s: could not stat file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n" - -#~ msgid "%s: could not to allocate SIDs: error code %lu\n" -#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n" - -#~ msgid "%s: could not write file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu écrire le fichier « %s » : %s\n" - -#~ msgid "%s: failed to remove contents of transaction log directory\n" -#~ msgstr "%s : échec de la suppression du contenu du répertoire des journaux de transaction\n" - -#~ msgid "%s: failed to remove transaction log directory\n" -#~ msgstr "%s : échec de la suppression du répertoire des journaux de transaction\n" - -#~ msgid "%s: failed to restore old locale \"%s\"\n" -#~ msgstr "%s : n'a pas pu restaurer l'ancienne locale « %s »\n" - -#~ msgid "%s: file \"%s\" does not exist\n" -#~ msgstr "%s : le fichier « %s » n'existe pas\n" - -#~ msgid "%s: invalid locale name \"%s\"\n" -#~ msgstr "%s : nom de locale invalide (« %s »)\n" - -#~ msgid "%s: locale name has non-ASCII characters, skipped: \"%s\"\n" -#~ msgstr "%s : le nom de la locale contient des caractères non ASCII, ignoré : « %s »\n" - -#~ msgid "%s: locale name too long, skipped: \"%s\"\n" -#~ msgstr "%s : nom de locale trop long, ignoré : « %s »\n" - -#~ msgid "%s: out of memory\n" -#~ msgstr "%s : mémoire épuisée\n" - -#~ msgid "%s: removing contents of transaction log directory \"%s\"\n" -#~ msgstr "%s : suppression du contenu du répertoire des journaux de transaction « %s »\n" - -#~ msgid "%s: removing transaction log directory \"%s\"\n" -#~ msgstr "%s : suppression du répertoire des journaux de transaction « %s »\n" - -#~ msgid "%s: symlinks are not supported on this platform\n" -#~ msgstr "%s : les liens symboliques ne sont pas supportés sur cette plateforme\n" - -#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n" -#~ msgstr "" -#~ "%s : répertoire des journaux de transaction « %s » non supprimé à la demande\n" -#~ "de l'utilisateur\n" - -#~ msgid "%s: unrecognized authentication method \"%s\"\n" -#~ msgstr "%s : méthode d'authentification « %s » inconnue.\n" - -#~ msgid "No usable system locales were found.\n" -#~ msgstr "Aucune locale système utilisable n'a été trouvée.\n" - -#~ msgid "" -#~ "The program \"postgres\" is needed by %s but was not found in the\n" -#~ "same directory as \"%s\".\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « postgres » est nécessaire à %s mais n'a pas été trouvé dans\n" -#~ "le même répertoire que « %s ».\n" -#~ "Vérifiez votre installation." - -#~ msgid "" -#~ "The program \"postgres\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « postgres » a été trouvé par « %s » mais n'est pas de la même\n" -#~ "version que « %s ».\n" -#~ "Vérifiez votre installation." - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayer « %s --help » pour plus d'informations.\n" - -#~ msgid "Use the option \"--debug\" to see details.\n" -#~ msgstr "Utilisez l'option « --debug » pour voir le détail.\n" - -#~ msgid "child process was terminated by signal %s" -#~ msgstr "le processus fils a été terminé par le signal %s" - -#~ msgid "copying template1 to postgres ... " -#~ msgstr "copie de template1 vers postgres... " - -#~ msgid "copying template1 to template0 ... " -#~ msgstr "copie de template1 vers template0... " - -#~ msgid "could not change directory to \"%s\"" -#~ msgstr "n'a pas pu accéder au répertoire « %s »" - -#~ msgid "could not change directory to \"%s\": %s" -#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %s" - -#~ msgid "could not open directory \"%s\": %s\n" -#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s\n" - -#~ msgid "could not read directory \"%s\": %s\n" -#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n" - -#~ msgid "could not read symbolic link \"%s\"" -#~ msgstr "n'a pas pu lire le lien symbolique « %s »" - -#~ msgid "could not stat file or directory \"%s\": %s\n" -#~ msgstr "" -#~ "n'a pas pu récupérer les informations sur le fichier ou répertoire\n" -#~ "« %s » : %s\n" - -#~ msgid "creating collations ... " -#~ msgstr "création des collationnements... " - -#~ msgid "creating conversions ... " -#~ msgstr "création des conversions... " - -#~ msgid "creating dictionaries ... " -#~ msgstr "création des dictionnaires... " - -#~ msgid "creating information schema ... " -#~ msgstr "création du schéma d'informations... " - -#~ msgid "creating system views ... " -#~ msgstr "création des vues système... " - -#~ msgid "creating template1 database in %s/base/1 ... " -#~ msgstr "création de la base de données template1 dans %s/base/1... " - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatal : " - -#~ msgid "initializing dependencies ... " -#~ msgstr "initialisation des dépendances... " - -#~ msgid "initializing pg_authid ... " -#~ msgstr "initialisation de pg_authid... " - -#~ msgid "loading PL/pgSQL server-side language ... " -#~ msgstr "chargement du langage PL/pgSQL... " - -#~ msgid "loading system objects' descriptions ... " -#~ msgstr "chargement de la description des objets système... " - -#~ msgid "not supported on this platform\n" -#~ msgstr "non supporté sur cette plateforme\n" - -#~ msgid "pclose failed: %m" -#~ msgstr "échec de pclose : %m" - -#~ msgid "setting password ... " -#~ msgstr "initialisation du mot de passe... " - -#~ msgid "setting privileges on built-in objects ... " -#~ msgstr "initialisation des droits sur les objets internes... " - -#~ msgid "vacuuming database template1 ... " -#~ msgstr "lancement du vacuum sur la base de données template1... " diff --git a/src/bin/initdb/po/it.po b/src/bin/initdb/po/it.po index 93ce7ec689dac..3a3b764cff34b 100644 --- a/src/bin/initdb/po/it.po +++ b/src/bin/initdb/po/it.po @@ -20,7 +20,7 @@ msgstr "" "Project-Id-Version: initdb (PostgreSQL) 11\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-09-26 08:19+0000\n" -"PO-Revision-Date: 2022-10-02 18:31+0200\n" +"PO-Revision-Date: 2023-09-05 07:54+0200\n" "Last-Translator: Daniele Varrazzo \n" "Language-Team: https://github.com/dvarrazzo/postgresql-it\n" "Language: it\n" @@ -554,7 +554,7 @@ msgstr " -g, --allow-group-access permette read/execute di gruppo sulla direct #: initdb.c:2197 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" -msgstr " --icu-locale=LOCALE imposta l'ID locale ICU per i nuovi database\n" +msgstr " --icu-locale=LOCALE imposta l'ID locale ICU per i nuovi database\n" #: initdb.c:2198 #, c-format diff --git a/src/bin/initdb/po/ja.po b/src/bin/initdb/po/ja.po index f21f1ce7799f9..8f6e6bf5c0416 100644 --- a/src/bin/initdb/po/ja.po +++ b/src/bin/initdb/po/ja.po @@ -1,13 +1,13 @@ # Japanese message translation file for initdb -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: initdb (PostgreSQL 16)\n" +"Project-Id-Version: initdb (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-06-19 09:32+0900\n" -"PO-Revision-Date: 2023-06-19 09:58+0900\n" +"POT-Creation-Date: 2025-01-10 14:11+0900\n" +"PO-Revision-Date: 2025-01-10 15:02+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -17,53 +17,68 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:276 +#: ../../../src/common/logging.c:279 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:283 +#: ../../../src/common/logging.c:286 #, c-format msgid "warning: " msgstr "警告: " -#: ../../../src/common/logging.c:294 +#: ../../../src/common/logging.c:297 #, c-format msgid "detail: " msgstr "詳細: " -#: ../../../src/common/logging.c:301 +#: ../../../src/common/logging.c:304 #, c-format msgid "hint: " msgstr "ヒント: " -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "䏿­£ãªãƒã‚¤ãƒŠãƒª\"%s\": %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "ãƒã‚¤ãƒŠãƒª\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "実行ã™ã‚‹\"%s\"ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "パス\"%s\"を絶対パス形å¼ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:363 initdb.c:752 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "コマンド\"%s\"を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/exec.c:375 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "コマンド\"%s\"ã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/exec.c:378 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "コマンド\"%s\"ãŒãƒ‡ãƒ¼ã‚¿ã‚’è¿”å´ã—ã¾ã›ã‚“ã§ã—ãŸ" + +#: ../../common/exec.c:405 #, c-format msgid "%s() failed: %m" msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 -#: initdb.c:353 +#: ../../common/exec.c:543 ../../common/exec.c:588 ../../common/exec.c:680 +#: initdb.c:374 initdb.c:410 #, c-format msgid "out of memory" msgstr "メモリä¸è¶³ã§ã™" @@ -79,35 +94,46 @@ msgstr "メモリä¸è¶³ã§ã™\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ãƒã‚¤ãƒ³ã‚¿ã‚’複製ã§ãã¾ã›ã‚“(内部エラー)。\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:447 +#: ../../common/file_utils.c:71 ../../common/file_utils.c:348 +#: ../../common/file_utils.c:407 ../../common/file_utils.c:481 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:77 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "ファイル\"%s\"ã«å¯¾ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã‚’åŒæœŸã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:121 ../../common/file_utils.c:567 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48 -#: ../../common/rmtree.c:63 +#: ../../common/file_utils.c:131 ../../common/file_utils.c:228 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ã“ã®ãƒ“ルドã§ã¯åŒæœŸæ–¹å¼\"%s\"をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" + +#: ../../common/file_utils.c:152 ../../common/file_utils.c:282 +#: ../../common/pgfnames.c:48 ../../common/rmtree.c:63 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69 -#: ../../common/rmtree.c:104 +#: ../../common/file_utils.c:170 ../../common/file_utils.c:316 +#: ../../common/pgfnames.c:69 ../../common/rmtree.c:106 #, c-format msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/file_utils.c:228 ../../common/file_utils.c:287 -#: ../../common/file_utils.c:361 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: ../../common/file_utils.c:299 ../../common/file_utils.c:369 +#: ../../common/file_utils.c:419 ../../common/file_utils.c:489 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/file_utils.c:379 +#: ../../common/file_utils.c:499 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" @@ -147,12 +173,12 @@ msgstr "制é™ä»˜ãトークンã§å†å®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—ãŸ: %lu" msgid "could not get exit code from subprocess: error code %lu" msgstr "サブプロセスã®çµ‚了コードをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" -#: ../../common/rmtree.c:95 +#: ../../common/rmtree.c:97 #, c-format msgid "could not remove file \"%s\": %m" msgstr "ファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/rmtree.c:122 +#: ../../common/rmtree.c:124 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" @@ -201,6 +227,31 @@ msgstr "å­ãƒ—ロセスã¯ã‚·ã‚°ãƒŠãƒ«%dã«ã‚ˆã‚Šçµ‚了ã—ã¾ã—ãŸ: %s" msgid "child process exited with unrecognized status %d" msgstr "å­ãƒ—ãƒ­ã‚»ã‚¹ãŒæœªçŸ¥ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹%dã§çµ‚了ã—ã¾ã—ãŸ" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "オプション%2$sã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%sã¯%d..%dã®ç¯„囲ã«ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "èªè­˜ã§ããªã„åŒæœŸæ–¹å¼: %s" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "シェルコマンドã®å¼•æ•°ã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "データベースåã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + #: ../../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" @@ -211,291 +262,311 @@ msgstr "\"%s\"ã®junctionを設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" msgid "could not get junction for \"%s\": %s\n" msgstr "\"%s\"ã®junctionを入手ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" -#: initdb.c:622 initdb.c:1617 +#: initdb.c:371 +#, c-format +msgid "_wsetlocale() failed" +msgstr "_wsetlocale()ãŒå¤±æ•—ã—ã¾ã—ãŸ" + +#: initdb.c:378 +#, c-format +msgid "setlocale() failed" +msgstr "setlocale()ãŒå¤±æ•—ã—ã¾ã—ãŸ" + +#: initdb.c:392 +#, c-format +msgid "failed to restore old locale" +msgstr "å¤ã„ロケールã®å¾©å…ƒã«å¤±æ•—ã—ã¾ã—ãŸ" + +#: initdb.c:395 +#, c-format +msgid "failed to restore old locale \"%s\"" +msgstr "å¤ã„ロケール\"%s\"を復元ã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: initdb.c:684 initdb.c:1702 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読ã¿å–り用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: initdb.c:666 initdb.c:970 initdb.c:990 +#: initdb.c:728 initdb.c:1032 initdb.c:1052 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "ファイル\"%s\"を書ãè¾¼ã¿ç”¨ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: initdb.c:670 initdb.c:973 initdb.c:992 +#: initdb.c:732 initdb.c:1035 initdb.c:1054 #, c-format msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: initdb.c:674 +#: initdb.c:736 #, c-format msgid "could not close file \"%s\": %m" msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: initdb.c:690 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "コマンド\"%s\"を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: initdb.c:708 +#: initdb.c:770 #, c-format msgid "removing data directory \"%s\"" msgstr "データディレクトリ\"%s\"を削除ã—ã¦ã„ã¾ã™" -#: initdb.c:710 +#: initdb.c:772 #, c-format msgid "failed to remove data directory" msgstr "データディレクトリã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: initdb.c:714 +#: initdb.c:776 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "データディレクトリ\"%s\"ã®å†…容を削除ã—ã¦ã„ã¾ã™" -#: initdb.c:717 +#: initdb.c:779 #, c-format msgid "failed to remove contents of data directory" msgstr "データディレクトリã®å†…容ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: initdb.c:722 +#: initdb.c:784 #, c-format msgid "removing WAL directory \"%s\"" msgstr "WAL ディレクトリ\"%s\"を削除ã—ã¦ã„ã¾ã™" -#: initdb.c:724 +#: initdb.c:786 #, c-format msgid "failed to remove WAL directory" msgstr "WAL ディレクトリã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: initdb.c:728 +#: initdb.c:790 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "WAL ディレクトリ\"%s\"ã®ä¸­èº«ã‚’削除ã—ã¦ã„ã¾ã™" -#: initdb.c:730 +#: initdb.c:792 #, c-format msgid "failed to remove contents of WAL directory" msgstr "WAL ディレクトリã®ä¸­èº«ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: initdb.c:737 +#: initdb.c:799 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "ユーザーã®è¦æ±‚ã«ã‚ˆã‚Šãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"を削除ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: initdb.c:741 +#: initdb.c:803 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "ユーザーã®è¦æ±‚ã«ã‚ˆã‚Š WAL ディレクトリ\"%s\"を削除ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: initdb.c:759 +#: initdb.c:821 #, c-format msgid "cannot be run as root" msgstr "root ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: initdb.c:760 +#: initdb.c:822 #, c-format msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." msgstr "サーãƒãƒ¼ãƒ—ãƒ­ã‚»ã‚¹ã®æ‰€æœ‰è€…ã¨ãªã‚‹(éžç‰¹æ¨©)ユーザーã¨ã—ã¦(例ãˆã°\"su\"を使用ã—ã¦)ログインã—ã¦ãã ã•ã„。" -#: initdb.c:792 +#: initdb.c:854 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "\"%s\"ã¯æœ‰åйãªã‚µãƒ¼ãƒãƒ¼ç¬¦å·åŒ–æ–¹å¼åã§ã¯ã‚りã¾ã›ã‚“" -#: initdb.c:936 +#: initdb.c:998 #, c-format msgid "file \"%s\" does not exist" msgstr "ファイル\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: initdb.c:937 initdb.c:942 initdb.c:949 +#: initdb.c:999 initdb.c:1004 initdb.c:1011 #, c-format msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." msgstr "インストール先ãŒç ´æã—ã¦ã„ã‚‹ã‹å®Ÿè¡Œæ™‚オプション-Lã§é–“é•ã£ãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’指定ã—ãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" -#: initdb.c:941 +#: initdb.c:1003 #, c-format msgid "could not access file \"%s\": %m" msgstr "ファイル\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: initdb.c:948 +#: initdb.c:1010 #, c-format msgid "file \"%s\" is not a regular file" msgstr "ファイル\"%s\"ã¯é€šå¸¸ã®ãƒ•ァイルã§ã¯ã‚りã¾ã›ã‚“" -#: initdb.c:1081 +#: initdb.c:1155 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "動的共有メモリã®å®Ÿè£…ã‚’é¸æŠžã—ã¦ã„ã¾ã™ ... " -#: initdb.c:1090 +#: initdb.c:1165 +#, c-format +msgid "selecting default \"max_connections\" ... " +msgstr "デフォルトã®\"max_connections\"ã‚’é¸æŠžã—ã¦ã„ã¾ã™ ... " + +#: initdb.c:1190 #, c-format -msgid "selecting default max_connections ... " -msgstr "デフォルトã®max_connectionsã‚’é¸æŠžã—ã¦ã„ã¾ã™ ... " +msgid "selecting default \"autovacuum_worker_slots\" ... %d\n" +msgstr "デフォルトã®\"autovacuum_worker_slots\"ã‚’é¸æŠžã—ã¦ã„ã¾ã™ ... %d\n" -#: initdb.c:1110 +#: initdb.c:1193 #, c-format -msgid "selecting default shared_buffers ... " -msgstr "デフォルトã®shared_buffersã‚’é¸æŠžã—ã¦ã„ã¾ã™ ... " +msgid "selecting default \"shared_buffers\" ... " +msgstr "デフォルトã®\"shared_buffers\"ã‚’é¸æŠžã—ã¦ã„ã¾ã™ ... " -#: initdb.c:1133 +#: initdb.c:1216 #, c-format msgid "selecting default time zone ... " msgstr "ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ™‚é–“å¸¯ã‚’é¸æŠžã—ã¦ã„ã¾ã™ ... " -#: initdb.c:1210 +#: initdb.c:1296 msgid "creating configuration files ... " msgstr "設定ファイルを作æˆã—ã¦ã„ã¾ã™ ... " -#: initdb.c:1371 initdb.c:1385 initdb.c:1452 initdb.c:1463 +#: initdb.c:1453 initdb.c:1467 initdb.c:1534 initdb.c:1545 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "\"%s\"ã®æ¨©é™ã‚’変更ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: initdb.c:1481 +#: initdb.c:1564 #, c-format msgid "running bootstrap script ... " msgstr "ブートストラップスクリプトを実行ã—ã¦ã„ã¾ã™ ... " -#: initdb.c:1493 +#: initdb.c:1576 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "入力ファイル\"%s\"㯠PostgreSQL %s ã®ã‚‚ã®ã§ã¯ã‚りã¾ã›ã‚“" -#: initdb.c:1495 +#: initdb.c:1578 #, c-format msgid "Specify the correct path using the option -L." msgstr "-Lオプションを使用ã—ã¦æ­£ã—ã„パスを指定ã—ã¦ãã ã•ã„。" -#: initdb.c:1595 +#: initdb.c:1680 msgid "Enter new superuser password: " msgstr "æ–°ã—ã„スーパーユーザーã®ãƒ‘スワードを入力ã—ã¦ãã ã•ã„:" -#: initdb.c:1596 +#: initdb.c:1681 msgid "Enter it again: " msgstr "å†å…¥åŠ›ã—ã¦ãã ã•ã„:" -#: initdb.c:1599 +#: initdb.c:1684 #, c-format msgid "Passwords didn't match.\n" msgstr "パスワードãŒä¸€è‡´ã—ã¾ã›ã‚“。\n" -#: initdb.c:1623 +#: initdb.c:1708 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "ファイル\"%s\"ã‹ã‚‰ãƒ‘スワードを読ã¿å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: initdb.c:1626 +#: initdb.c:1711 #, c-format msgid "password file \"%s\" is empty" msgstr "パスワードファイル\"%s\"ãŒç©ºã§ã™" -#: initdb.c:2038 +#: initdb.c:2123 #, c-format msgid "caught signal\n" msgstr "シグナルãŒç™ºç”Ÿã—ã¾ã—ãŸ\n" -#: initdb.c:2044 +#: initdb.c:2129 #, c-format msgid "could not write to child process: %s\n" msgstr "å­ãƒ—ロセスã¸ã®æ›¸ãè¾¼ã¿ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" -#: initdb.c:2052 +#: initdb.c:2137 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2141 -#, c-format -msgid "setlocale() failed" -msgstr "setlocale()ãŒå¤±æ•—ã—ã¾ã—ãŸ" - -#: initdb.c:2159 +#: initdb.c:2219 initdb.c:2265 #, c-format -msgid "failed to restore old locale \"%s\"" -msgstr "å¤ã„ロケール\"%s\"を復元ã§ãã¾ã›ã‚“ã§ã—ãŸ" +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "ロケールå\"%s\"ã¯ä¸æ­£ãªéžASCII文字をå«ã‚“ã§ã„ã¾ã™" -#: initdb.c:2167 +#: initdb.c:2245 #, c-format msgid "invalid locale name \"%s\"" msgstr "ロケールå\"%s\"ã¯ä¸æ­£ã§ã™" -#: initdb.c:2168 +#: initdb.c:2246 #, c-format msgid "If the locale name is specific to ICU, use --icu-locale." msgstr "ロケールåãŒICU特有ã®ã‚‚ã®ã§ã‚ã‚‹å ´åˆã¯ã€--icu-localeを使用ã—ã¦ãã ã•ã„。" -#: initdb.c:2181 +#: initdb.c:2259 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "䏿­£ãªãƒ­ã‚±ãƒ¼ãƒ«è¨­å®š; 環境変数LANGãŠã‚ˆã³LC_* を確èªã—ã¦ãã ã•ã„" -#: initdb.c:2207 initdb.c:2231 +#: initdb.c:2290 initdb.c:2314 #, c-format msgid "encoding mismatch" msgstr "符å·åŒ–æ–¹å¼ãŒåˆã„ã¾ã›ã‚“" -#: initdb.c:2208 +#: initdb.c:2291 #, c-format msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." msgstr "é¸æŠžã—ãŸç¬¦å·åŒ–æ–¹å¼(%s)ã¨é¸æŠžã—ãŸãƒ­ã‚±ãƒ¼ãƒ«ãŒä½¿ç”¨ã™ã‚‹ç¬¦å·åŒ–æ–¹å¼(%s)ãŒåˆã£ã¦ã„ã¾ã›ã‚“。ã“れã«ã‚ˆã‚Šå„ç¨®ã®æ–‡å­—列処ç†é–¢æ•°ãŒé–“é•ã£ãŸå‹•作をã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚" -#: initdb.c:2213 initdb.c:2234 +#: initdb.c:2296 initdb.c:2317 #, c-format msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." msgstr "%sã‚’å†åº¦å®Ÿè¡Œã—ã¦ãã ã•ã„ã€ãã®éš›ã«ã¯ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’æ˜Žç¤ºçš„ã«æŒ‡å®šã—ãªã„ã‹ã€é©åˆã™ã‚‹çµ„ã¿åˆã‚ã›ã‚’é¸æŠžã—ã¦ãã ã•ã„。" -#: initdb.c:2232 +#: initdb.c:2315 #, c-format msgid "The encoding you selected (%s) is not supported with the ICU provider." msgstr "指定ã•れãŸç¬¦å·åŒ–æ–¹å¼(%s)ã¯ICUプロãƒã‚¤ãƒ€ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。" -#: initdb.c:2260 initdb.c:2326 -#, c-format -msgid "could not get language from locale \"%s\": %s" -msgstr "ロケール\"%s\"ã‹ã‚‰è¨€èªžã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" - -#: initdb.c:2297 +#: initdb.c:2366 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "ロケールå\"%s\"ã‚’ã€è¨€èªžã‚¿ã‚°ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: initdb.c:2303 initdb.c:2356 initdb.c:2369 initdb.c:2451 +#: initdb.c:2372 initdb.c:2424 initdb.c:2516 #, c-format msgid "ICU is not supported in this build" msgstr "ã“ã®ãƒ“ルドã§ã¯ICUã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: initdb.c:2353 +#: initdb.c:2395 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "ロケール\"%s\"ã‹ã‚‰è¨€èªžã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: initdb.c:2421 #, c-format msgid "locale \"%s\" has unknown language \"%s\"" msgstr "ロケール\"%s\"ã¯æœªçŸ¥ã®è¨€èªž\"%s\"ã‚’å«ã‚“ã§ã„ã¾ã™" -#: initdb.c:2434 +#: initdb.c:2482 +#, c-format +msgid "locale must be specified if provider is %s" +msgstr "ロケールプロãƒã‚¤ãƒ€ãŒ%sã®å ´åˆã¯ãƒ­ã‚±ãƒ¼ãƒ«ã®æŒ‡å®šãŒå¿…é ˆã§ã™" + +#: initdb.c:2493 #, c-format -msgid "Using default ICU locale \"%s\".\n" -msgstr "デフォルトã®ICUロケール\"%s\"を使用ã—ã¾ã™ã€‚\n" +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "ロケールå\"%s\"ã¯çµ„ã¿è¾¼ã¿ãƒ—ロãƒã‚¤ãƒ€ã§ã¯ä¸æ­£ã§ã™" -#: initdb.c:2439 +#: initdb.c:2504 #, c-format msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" msgstr "ICUロケール\"%s\"ã«å¯¾ã—ã¦è¨€èªžã‚¿ã‚°\"%s\"を使用ã—ã¾ã™ã€‚\n" -#: initdb.c:2462 +#: initdb.c:2527 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" "\n" msgstr "%sã¯PostgreSQLãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¯ãƒ©ã‚¹ã‚¿ã‚’åˆæœŸåŒ–ã—ã¾ã™ã€‚\n" -#: initdb.c:2463 +#: initdb.c:2528 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: initdb.c:2464 +#: initdb.c:2529 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATADIR]\n" -#: initdb.c:2465 +#: initdb.c:2530 #, c-format msgid "" "\n" @@ -504,57 +575,57 @@ msgstr "" "\n" "オプション:\n" -#: initdb.c:2466 +#: initdb.c:2531 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, --auth=METHOD ローカル接続ã®ãƒ‡ãƒ•ォルトèªè¨¼æ–¹å¼\n" -#: initdb.c:2467 +#: initdb.c:2532 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr " --auth-host=METHOD ローカルTCP/IP接続ã®ãƒ‡ãƒ•ォルトèªè¨¼æ–¹å¼\n" -#: initdb.c:2468 +#: initdb.c:2533 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr " --auth-local=METHOD ローカルソケット接続ã®ãƒ‡ãƒ•ォルトèªè¨¼æ–¹å¼\n" -#: initdb.c:2469 +#: initdb.c:2534 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATADIR データベースクラスタã®å ´æ‰€\n" -#: initdb.c:2470 +#: initdb.c:2535 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=ENCODING æ–°è¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ãƒ‡ãƒ•ォルト符å·åŒ–æ–¹å¼\n" -#: initdb.c:2471 +#: initdb.c:2536 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr " -g, --allow-group-access データディレクトリã®ã‚°ãƒ«ãƒ¼ãƒ—読ã¿å–り/実行を許å¯\n" -#: initdb.c:2472 +#: initdb.c:2537 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" msgstr " --icu-locale=LOCALE æ–°ã—ã„データベースã®ICUロケールIDを設定\n" -#: initdb.c:2473 +#: initdb.c:2538 #, c-format msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" msgstr " --icu-rules=RULES æ–°ã—ã„データベースã«è¿½åŠ ã™ã‚‹ICUç…§åˆé †åºãƒ«ãƒ¼ãƒ«(群)\n" -#: initdb.c:2474 +#: initdb.c:2539 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums データページã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’使用\n" -#: initdb.c:2475 +#: initdb.c:2540 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE æ–°ã—ã„データベースã®ãƒ‡ãƒ•ォルトロケールをセット\n" -#: initdb.c:2476 +#: initdb.c:2541 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -568,29 +639,43 @@ msgstr "" " デフォルトロケールを設定(デフォルト値ã¯ç’°å¢ƒå¤‰æ•°ã‹ã‚‰\n" " å–å¾—)\n" -#: initdb.c:2480 +#: initdb.c:2545 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale --locale=C ã¨åŒã˜\n" -#: initdb.c:2481 +#: initdb.c:2546 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --builtin-locale=LOCALE\n" +" set builtin locale name for new databases\n" +msgstr "" +" --builtin-locale=LOCALE\n" +" æ–°ã—ã„データベースã®çµ„ã¿è¾¼ã¿ãƒ­ã‚±ãƒ¼ãƒ«ã‚’指定\n" + +#: initdb.c:2548 +#, c-format +msgid "" +" --locale-provider={builtin|libc|icu}\n" " set default locale provider for new databases\n" msgstr "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " æ–°ã—ã„データベースã«ãŠã‘るデフォルトã®ãƒ­ã‚±ãƒ¼ãƒ«\n" " プロãƒã‚¤ãƒ€ã‚’設定\n" -#: initdb.c:2483 +#: initdb.c:2550 +#, c-format +msgid " --no-data-checksums do not use data page checksums\n" +msgstr " --no-data-checksums データページã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’使用ã—ãªã„\n" + +#: initdb.c:2551 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr "" " --pwfile=ãƒ•ã‚¡ã‚¤ãƒ«å æ–°ã—ã„スーパーユーザーã®ãƒ‘スワードをファイルã‹ã‚‰\n" " 読ã¿è¾¼ã‚€\n" -#: initdb.c:2484 +#: initdb.c:2552 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -599,27 +684,27 @@ msgstr "" " -T, --text-search-config=CFG\\\n" " デフォルトã®ãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢è¨­å®š\n" -#: initdb.c:2486 +#: initdb.c:2554 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NAME データベースã®ã‚¹ãƒ¼ãƒ‘ーユーザーã®åå‰\n" -#: initdb.c:2487 +#: initdb.c:2555 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt æ–°è¦ã‚¹ãƒ¼ãƒ‘ーユーザーã«å¯¾ã—ã¦ãƒ‘スワード入力を促ã™\n" -#: initdb.c:2488 +#: initdb.c:2556 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR 先行書ãè¾¼ã¿ãƒ­ã‚°ç”¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä½ç½®\n" -#: initdb.c:2489 +#: initdb.c:2557 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=SIZE WALセグメントã®ã‚µã‚¤ã‚ºã€ãƒ¡ã‚¬ãƒã‚¤ãƒˆå˜ä½\n" -#: initdb.c:2490 +#: initdb.c:2558 #, c-format msgid "" "\n" @@ -628,52 +713,57 @@ msgstr "" "\n" "使用頻度ã®ä½Žã„オプション:\n" -#: initdb.c:2491 +#: initdb.c:2559 #, c-format msgid " -c, --set NAME=VALUE override default setting for server parameter\n" msgstr " -c, --set NAME=VALUE サーãƒãƒ¼ãƒ‘ラメータã®ãƒ‡ãƒ•ォルト値を上書ã設定\n" -#: initdb.c:2492 +#: initdb.c:2560 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug 多ãã®ãƒ‡ãƒãƒƒã‚°ç”¨ã®å‡ºåŠ›ã‚’ç”Ÿæˆ\n" -#: initdb.c:2493 +#: initdb.c:2561 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches debug_discard_cachesã‚’1ã«è¨­å®šã™ã‚‹\n" -#: initdb.c:2494 +#: initdb.c:2562 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORY 入力ファイルã®å ´æ‰€ã‚’指定\n" -#: initdb.c:2495 +#: initdb.c:2563 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean エラー発生後ã®ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—を行ã‚ãªã„\n" -#: initdb.c:2496 +#: initdb.c:2564 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync 変更ã®å®‰å…¨ãªãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®æ›¸ã出ã—を待機ã—ãªã„\n" -#: initdb.c:2497 +#: initdb.c:2565 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions æ¬¡ã®æ‰‹é †ã®æŒ‡ç¤ºã‚’表示ã—ãªã„\n" -#: initdb.c:2498 +#: initdb.c:2566 +#, c-format +msgid " -s, --show show internal settings, then exit\n" +msgstr " -s, --show 内部設定を表示ã—ã¦çµ‚了\n" + +#: initdb.c:2567 #, c-format -msgid " -s, --show show internal settings\n" -msgstr " -s, --show 内部設定を表示\n" +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD ファイルをディスクã«åŒæœŸã•ã›ã‚‹æ–¹æ³•を指定\n" -#: initdb.c:2499 +#: initdb.c:2568 #, c-format msgid " -S, --sync-only only sync database files to disk, then exit\n" msgstr " -S, --sync-only データベースファイルã®syncã®ã¿ã‚’実行ã—ã¦çµ‚了\n" -#: initdb.c:2500 +#: initdb.c:2569 #, c-format msgid "" "\n" @@ -682,17 +772,17 @@ msgstr "" "\n" "ãã®ä»–ã®ã‚ªãƒ—ション:\n" -#: initdb.c:2501 +#: initdb.c:2570 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: initdb.c:2502 +#: initdb.c:2571 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: initdb.c:2503 +#: initdb.c:2572 #, c-format msgid "" "\n" @@ -702,7 +792,7 @@ msgstr "" "\n" "ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæŒ‡å®šã•れãªã„å ´åˆã€PGDATA環境変数ãŒä½¿ç”¨ã•れã¾ã™ã€‚\n" -#: initdb.c:2505 +#: initdb.c:2574 #, c-format msgid "" "\n" @@ -711,72 +801,72 @@ msgstr "" "\n" "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: initdb.c:2506 +#: initdb.c:2575 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: initdb.c:2534 +#: initdb.c:2599 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "\"%2$s\"接続ã§ã¯èªè¨¼æ–¹å¼\"%1$s\"ã¯ç„¡åйã§ã™" -#: initdb.c:2548 +#: initdb.c:2613 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "パスワードèªè¨¼ã‚’有効ã«ã™ã‚‹ã«ã¯ã‚¹ãƒ¼ãƒ‘ーユーザーã®ãƒ‘スワードを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: initdb.c:2567 +#: initdb.c:2632 #, c-format msgid "no data directory specified" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: initdb.c:2568 +#: initdb.c:2633 #, c-format msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." msgstr "データベースシステムã®ãƒ‡ãƒ¼ã‚¿ã‚’æ ¼ç´ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚実行時オプション -Dã€ã‚‚ã—ãã¯ã€PGDATAç’°å¢ƒå¤‰æ•°ã§æŒ‡å®šã—ã¦ãã ã•ã„。" -#: initdb.c:2585 +#: initdb.c:2650 #, c-format msgid "could not set environment" msgstr "環境を設定ã§ãã¾ã›ã‚“" -#: initdb.c:2603 +#: initdb.c:2668 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "%2$sã«ã¯ãƒ—ログラム\"%1$s\"ãŒå¿…è¦ã§ã™ãŒã€\"%3$s\"ã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚" -#: initdb.c:2606 +#: initdb.c:2671 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "\"%2$s\"ãŒãƒ—ログラム\"%1$s\"を見ã¤ã‘ã¾ã—ãŸãŒã€ã“れã¯%3$sã¨åŒã˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚" -#: initdb.c:2621 +#: initdb.c:2686 #, c-format msgid "input file location must be an absolute path" msgstr "入力ファイルã®å ´æ‰€ã¯çµ¶å¯¾ãƒ‘スã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: initdb.c:2638 +#: initdb.c:2703 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "データベースクラスタã¯ãƒ­ã‚±ãƒ¼ãƒ«\"%s\"ã§åˆæœŸåŒ–ã•れã¾ã™ã€‚\n" -#: initdb.c:2641 +#: initdb.c:2706 #, c-format msgid "The database cluster will be initialized with this locale configuration:\n" msgstr "データベースクラスタã¯ä»¥ä¸‹ã®ãƒ­ã‚±ãƒ¼ãƒ«æ§‹æˆã§åˆæœŸåŒ–ã•れã¾ã™ã€‚\n" -#: initdb.c:2642 +#: initdb.c:2707 #, c-format -msgid " provider: %s\n" -msgstr " プロãƒã‚¤ãƒ€: %s\n" +msgid " locale provider: %s\n" +msgstr " ロケールプロãƒã‚¤ãƒ€:%s\n" -#: initdb.c:2644 +#: initdb.c:2709 #, c-format -msgid " ICU locale: %s\n" -msgstr " ICUロケール: %s\n" +msgid " default collation: %s\n" +msgstr " デフォルト照åˆé †åº:%s\n" -#: initdb.c:2645 +#: initdb.c:2710 #, c-format msgid "" " LC_COLLATE: %s\n" @@ -793,22 +883,22 @@ msgstr "" " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2675 +#: initdb.c:2740 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "ロケール\"%s\"ã«å¯¾ã—ã¦é©åˆ‡ãªç¬¦å·åŒ–æ–¹å¼ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: initdb.c:2677 +#: initdb.c:2742 #, c-format msgid "Rerun %s with the -E option." msgstr "-Eオプションを付ã‘ã¦%sã‚’å†å®Ÿè¡Œã—ã¦ãã ã•ã„。" -#: initdb.c:2678 initdb.c:3211 initdb.c:3320 initdb.c:3340 +#: initdb.c:2743 initdb.c:3287 initdb.c:3410 initdb.c:3430 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" -#: initdb.c:2690 +#: initdb.c:2755 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -818,107 +908,112 @@ msgstr "" "符å·åŒ–æ–¹å¼ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“。\n" "デフォルトã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç¬¦å·åŒ–æ–¹å¼ã¯ä»£ã‚りã«\"%s\"ã«è¨­å®šã•れã¾ã™ã€‚\n" -#: initdb.c:2695 +#: initdb.c:2760 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "ロケール\"%s\"ã¯éžã‚µãƒãƒ¼ãƒˆã®ç¬¦å·åŒ–æ–¹å¼\"%s\"ã‚’å¿…è¦ã¨ã—ã¾ã™" -#: initdb.c:2697 +#: initdb.c:2762 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "符å·åŒ–æ–¹å¼\"%s\"ã¯ã‚µãƒ¼ãƒãƒ¼å´ã®ç¬¦å·åŒ–æ–¹å¼ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“。" -#: initdb.c:2699 +#: initdb.c:2764 #, c-format msgid "Rerun %s with a different locale selection." msgstr "別ã®ãƒ­ãƒ¼ã‚±ãƒ«ã‚’é¸æŠžã—ã¦%sã‚’å†å®Ÿè¡Œã—ã¦ãã ã•ã„。" -#: initdb.c:2707 +#: initdb.c:2772 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "デフォルトã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç¬¦å·åŒ–æ–¹å¼ã¯ãれã«å¯¾å¿œã—ã¦%sã«è¨­å®šã•れã¾ã—ãŸã€‚\n" -#: initdb.c:2776 +#: initdb.c:2786 +#, c-format +msgid "builtin provider locale \"%s\" requires encoding \"%s\"" +msgstr "組ã¿è¾¼ã¿ãƒ—ロãƒã‚¤ãƒ€ãƒ­ã‚±ãƒ¼ãƒ«\"%s\"ã¯ç¬¦å·åŒ–æ–¹å¼\"%s\"ã‚’å¿…è¦ã¨ã—ã¾ã™" + +#: initdb.c:2848 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "ロケール\"%s\"用ã®é©åˆ‡ãªãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢è¨­å®šãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: initdb.c:2787 +#: initdb.c:2859 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "ロケール\"%s\"ã«é©ã—ãŸãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢è¨­å®šãŒä¸æ˜Žã§ã™" -#: initdb.c:2792 +#: initdb.c:2864 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "指定ã—ãŸãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢è¨­å®š\"%s\"ãŒãƒ­ã‚±ãƒ¼ãƒ«\"%s\"ã«åˆã‚ãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™" -#: initdb.c:2797 +#: initdb.c:2869 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "デフォルトã®ãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢æ§‹æˆã¯ %s ã«è¨­å®šã•れã¾ã™ã€‚\n" -#: initdb.c:2840 initdb.c:2911 +#: initdb.c:2912 initdb.c:2983 #, c-format msgid "creating directory %s ... " msgstr "ディレクトリ%sを作æˆã—ã¦ã„ã¾ã™ ... " -#: initdb.c:2845 initdb.c:2916 initdb.c:2964 initdb.c:3020 +#: initdb.c:2917 initdb.c:2988 initdb.c:3036 initdb.c:3093 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: initdb.c:2854 initdb.c:2926 +#: initdb.c:2926 initdb.c:2998 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "ディレクトリ%sã®æ¨©é™ã‚’設定ã—ã¦ã„ã¾ã™ ... " -#: initdb.c:2859 initdb.c:2931 +#: initdb.c:2931 initdb.c:3003 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"ã®æ¨©é™ã‚’変更ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: initdb.c:2871 initdb.c:2943 +#: initdb.c:2943 initdb.c:3015 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "ディレクトリ\"%s\"ã¯å­˜åœ¨ã—ã¾ã™ãŒã€ç©ºã§ã¯ã‚りã¾ã›ã‚“" -#: initdb.c:2875 +#: initdb.c:2947 #, c-format msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." msgstr "æ–°è¦ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ã‚’作æˆã—ãŸã„ã®ã§ã‚れã°ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"を削除ã‚ã‚‹ã„ã¯ç©ºã«ã™ã‚‹ã€ã¾ãŸã¯%sã‚’\"%s\"以外ã®å¼•æ•°ã§å®Ÿè¡Œã—ã¦ãã ã•ã„。" -#: initdb.c:2883 initdb.c:2953 initdb.c:3361 +#: initdb.c:2955 initdb.c:3025 initdb.c:3455 #, c-format msgid "could not access directory \"%s\": %m" msgstr "ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: initdb.c:2904 +#: initdb.c:2976 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL ディレクトリã®ä½ç½®ã¯ã€çµ¶å¯¾ãƒ‘スã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: initdb.c:2947 +#: initdb.c:3019 #, c-format msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." msgstr "ãã“ã«WALã‚’æ ¼ç´ã—ãŸã„å ´åˆã¯ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"を削除ã™ã‚‹ã‹ç©ºã«ã—ã¦ãã ã•ã„。" -#: initdb.c:2957 +#: initdb.c:3029 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: initdb.c:2976 +#: initdb.c:3048 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." msgstr "ãŠãらãマウントãƒã‚¤ãƒ³ãƒˆã§ã‚ã‚‹ã“ã¨ã«èµ·å› ã—ãŸå…ˆé ­ãŒãƒ‰ãƒƒãƒˆã§ã‚るファイルã€ã¾ãŸã¯ä¸å¯è¦–ãªãƒ•ァイルãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚" -#: initdb.c:2978 +#: initdb.c:3050 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point." msgstr "ãŠãらãマウントãƒã‚¤ãƒ³ãƒˆã§ã‚ã‚‹ã“ã¨ã«èµ·å› ã—ãŸlost+foundディレクトリãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚" -#: initdb.c:2980 +#: initdb.c:3052 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -927,70 +1022,65 @@ msgstr "" "マウントãƒã‚¤ãƒ³ãƒˆã§ã‚るディレクトリをデータディレクトリã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ãŠå‹§ã‚ã—ã¾ã›ã‚“。\n" "ã“ã®ä¸‹ã«ã‚µãƒ–ディレクトリを作æˆã—ã¦ãã ã•ã„。" -#: initdb.c:3006 +#: initdb.c:3079 #, c-format msgid "creating subdirectories ... " msgstr "サブディレクトリを作æˆã—ã¦ã„ã¾ã™ ... " -#: initdb.c:3049 +#: initdb.c:3122 msgid "performing post-bootstrap initialization ... " msgstr "ブートストラップ後ã®åˆæœŸåŒ–を実行ã—ã¦ã„ã¾ã™ ... " -#: initdb.c:3210 +#: initdb.c:3286 #, c-format msgid "-c %s requires a value" msgstr "-c %sã¯å€¤ãŒå¿…è¦ã§ã™" -#: initdb.c:3235 +#: initdb.c:3311 #, c-format msgid "Running in debug mode.\n" msgstr "デãƒãƒƒã‚°ãƒ¢ãƒ¼ãƒ‰ã§å®Ÿè¡Œã—ã¦ã„ã¾ã™ã€‚\n" -#: initdb.c:3239 +#: initdb.c:3315 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "no-clean モードã§å®Ÿè¡Œã—ã¦ã„ã¾ã™ã€‚失敗ã—ãŸçжæ³ã¯å‰Šé™¤ã•れã¾ã›ã‚“。\n" -#: initdb.c:3310 +#: initdb.c:3388 #, c-format msgid "unrecognized locale provider: %s" msgstr "èªè­˜ã§ããªã„ç…§åˆé †åºãƒ—ロãƒã‚¤ãƒ€: %s" -#: initdb.c:3338 +#: initdb.c:3428 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")" -#: initdb.c:3345 initdb.c:3349 +#: initdb.c:3435 initdb.c:3439 initdb.c:3443 #, c-format msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgstr "ロケールプロãƒã‚¤ãƒ€\"%2$s\"ãŒé¸æŠžã•れã¦ã„ãªã‘れã°%1$sã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: initdb.c:3363 initdb.c:3440 +#: initdb.c:3457 initdb.c:3520 msgid "syncing data to disk ... " msgstr "データをディスクã«åŒæœŸã—ã¦ã„ã¾ã™ ... " -#: initdb.c:3371 +#: initdb.c:3465 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "パスワードプロンプトã¨ãƒ‘スワードファイルã¯åŒæ™‚ã«æŒ‡å®šã§ãã¾ã›ã‚“" -#: initdb.c:3393 -#, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "--wal-segsize ã®å¼•æ•°ã¯æ•°å€¤ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" - -#: initdb.c:3395 +#: initdb.c:3476 #, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "--wal-segsize ã®ãƒ‘ラメータã¯1ã‹ã‚‰1024ã®é–“ã®2ã®å€æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "%sã®å¼•æ•°ã¯1ã‹ã‚‰1024ã¾ã§ã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: initdb.c:3409 +#: initdb.c:3489 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "スーパーユーザーå\"%s\"ã¯è¨±å¯ã•れã¾ã›ã‚“; ロールåã¯\"pg_\"ã§å§‹ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: initdb.c:3411 +#: initdb.c:3491 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -1001,17 +1091,17 @@ msgstr "" "ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’サーãƒãƒ¼ãƒ—ãƒ­ã‚»ã‚¹ã®æ‰€æœ‰è€…ã¨ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚\n" "\n" -#: initdb.c:3427 +#: initdb.c:3507 #, c-format msgid "Data page checksums are enabled.\n" msgstr "データページã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯æœ‰åйã§ã™ã€‚\n" -#: initdb.c:3429 +#: initdb.c:3509 #, c-format msgid "Data page checksums are disabled.\n" msgstr "データベージã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯ç„¡åйã§ã™ã€‚\n" -#: initdb.c:3446 +#: initdb.c:3526 #, c-format msgid "" "\n" @@ -1022,22 +1112,22 @@ msgstr "" "ディスクã¸ã®åŒæœŸãŒã‚¹ã‚­ãƒƒãƒ—ã•れã¾ã—ãŸã€‚\n" "オペレーティングシステムãŒã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ãŸå ´åˆãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ç ´æã•れるã‹ã‚‚ã—れã¾ã›ã‚“。\n" -#: initdb.c:3451 +#: initdb.c:3531 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "ローカル接続ã«å¯¾ã—ã¦\"trust\"èªè¨¼ã‚’有効ã«ã—ã¾ã™ " -#: initdb.c:3452 +#: initdb.c:3532 #, c-format msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." msgstr "pg_hba.confを編集ã™ã‚‹ã€ã‚‚ã—ãã¯ã€æ¬¡å›žinitdbを実行ã™ã‚‹æ™‚ã« -A オプションã€ã‚ã‚‹ã„㯠--auth-local ãŠã‚ˆã³ --auth-host オプションを使用ã™ã‚‹ã“ã¨ã§å¤‰æ›´ã§ãã¾ã™ã€‚" #. translator: This is a placeholder in a shell command. -#: initdb.c:3482 +#: initdb.c:3562 msgid "logfile" msgstr "ログファイル" -#: initdb.c:3484 +#: initdb.c:3564 #, c-format msgid "" "\n" diff --git a/src/bin/initdb/po/ka.po b/src/bin/initdb/po/ka.po index 7acb7491f9c0c..8efacb48219cf 100644 --- a/src/bin/initdb/po/ka.po +++ b/src/bin/initdb/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: initdb (PostgreSQL) 16\n" +"Project-Id-Version: initdb (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-06-07 04:20+0000\n" -"PO-Revision-Date: 2023-06-07 09:07+0200\n" +"POT-Creation-Date: 2024-10-12 00:21+0000\n" +"PO-Revision-Date: 2024-10-12 06:49+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.5\n" #: ../../../src/common/logging.c:276 #, c-format @@ -38,33 +38,48 @@ msgstr "დეტáƒáƒšáƒ”ბი: " msgid "hint: " msgstr "მინიშნებáƒ: " -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ \"%s\": %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "გáƒáƒ¡áƒáƒ¨áƒ•ებáƒáƒ“ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" პáƒáƒ•ნრშეუძლებელიáƒ" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "ბილიკის (\"%s\") áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ  ფáƒáƒ áƒ›áƒáƒ¨áƒ˜ áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 initdb.c:750 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "ბრძáƒáƒœáƒ”ბის (\"%s\") შესრულების შეცდáƒáƒ›áƒ: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "ბრძáƒáƒœáƒ”ბიდáƒáƒœ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "ბრძáƒáƒœáƒ”ბáƒáƒ› \"%s\" მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  დáƒáƒáƒ‘რუნáƒ" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 -#: initdb.c:353 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: initdb.c:372 initdb.c:408 #, c-format msgid "out of memory" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" @@ -80,35 +95,46 @@ msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:447 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" -#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48 -#: ../../common/rmtree.c:63 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: ../../common/pgfnames.c:48 ../../common/rmtree.c:63 #, c-format msgid "could not open directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69 -#: ../../common/rmtree.c:104 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: ../../common/pgfnames.c:69 ../../common/rmtree.c:106 #, c-format msgid "could not read directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: ../../common/file_utils.c:228 ../../common/file_utils.c:287 -#: ../../common/file_utils.c:361 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" - -#: ../../common/file_utils.c:299 ../../common/file_utils.c:369 +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" -#: ../../common/file_utils.c:379 +#: ../../common/file_utils.c:498 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" @@ -148,12 +174,12 @@ msgstr "შეზღუდულ კáƒáƒ“ის ხელáƒáƒ®áƒšáƒ შეს msgid "could not get exit code from subprocess: error code %lu" msgstr "ქვეპრáƒáƒªáƒ”სიდáƒáƒœ გáƒáƒ¡áƒáƒ¡áƒ•ლელი კáƒáƒ“ი ვერ მივიღე: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" -#: ../../common/rmtree.c:95 +#: ../../common/rmtree.c:97 #, c-format msgid "could not remove file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m" -#: ../../common/rmtree.c:122 +#: ../../common/rmtree.c:124 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" @@ -202,6 +228,31 @@ msgstr "პრáƒáƒªáƒ”სი გáƒáƒ©áƒ”რდრსიგნáƒáƒšáƒ˜áƒ—: %d msgid "child process exited with unrecognized status %d" msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რუცნáƒáƒ‘ი სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრისთვის %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "უცნáƒáƒ‘ი სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი: \"%s\"" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის áƒáƒ áƒ’უმენტი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + #: ../../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" @@ -212,269 +263,290 @@ msgstr "\"%s\"-ისთვის შეერთების დáƒáƒ§áƒ”ნე msgid "could not get junction for \"%s\": %s\n" msgstr "\"%s\"-ისთვის შეერთების მიღებრვერ მáƒáƒ®áƒ”რხდáƒ: %s\n" -#: initdb.c:622 initdb.c:1617 +#: initdb.c:369 +#, c-format +#| msgid "setlocale() failed" +msgid "_wsetlocale() failed" +msgstr "_wsetlocale() ჩáƒáƒ•áƒáƒ áƒ“áƒ" + +#: initdb.c:376 +#, c-format +msgid "setlocale() failed" +msgstr "setlocale() ჩáƒáƒ•áƒáƒ áƒ“áƒ" + +#: initdb.c:390 +#, c-format +msgid "failed to restore old locale" +msgstr "ძველი ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრჩáƒáƒ•áƒáƒ áƒ“áƒ" + +#: initdb.c:393 +#, c-format +msgid "failed to restore old locale \"%s\"" +msgstr "ძველი ენის (\"%s\") áƒáƒ¦áƒ“გენის შეცდáƒáƒ›áƒ" + +#: initdb.c:682 initdb.c:1674 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: initdb.c:666 initdb.c:970 initdb.c:990 +#: initdb.c:726 initdb.c:1030 initdb.c:1050 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") ჩáƒáƒ¡áƒáƒ¬áƒ”რáƒáƒ“ გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %m" -#: initdb.c:670 initdb.c:973 initdb.c:992 +#: initdb.c:730 initdb.c:1033 initdb.c:1052 #, c-format msgid "could not write file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" -#: initdb.c:674 +#: initdb.c:734 #, c-format msgid "could not close file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: initdb.c:690 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "ბრძáƒáƒœáƒ”ბის (\"%s\") შესრულების შეცდáƒáƒ›áƒ: %m" - -#: initdb.c:708 +#: initdb.c:768 #, c-format msgid "removing data directory \"%s\"" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ \"%s\"" -#: initdb.c:710 +#: initdb.c:770 #, c-format msgid "failed to remove data directory" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: initdb.c:714 +#: initdb.c:774 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ \"%s\"" -#: initdb.c:717 +#: initdb.c:777 #, c-format msgid "failed to remove contents of data directory" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: initdb.c:722 +#: initdb.c:782 #, c-format msgid "removing WAL directory \"%s\"" msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ \"%s\"" -#: initdb.c:724 +#: initdb.c:784 #, c-format msgid "failed to remove WAL directory" msgstr "შეცდáƒáƒ›áƒ WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ˜áƒ¡áƒáƒ¡" -#: initdb.c:728 +#: initdb.c:788 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ" -#: initdb.c:730 +#: initdb.c:790 #, c-format msgid "failed to remove contents of WAL directory" msgstr "შეცდáƒáƒ›áƒ WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ˜áƒ¡áƒáƒ¡" -#: initdb.c:737 +#: initdb.c:797 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მáƒáƒ—ხáƒáƒ•ნისáƒáƒ¡ áƒáƒ  წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ" -#: initdb.c:741 +#: initdb.c:801 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მáƒáƒ—ხáƒáƒ•ნისáƒáƒ¡ áƒáƒ  წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ" -#: initdb.c:759 +#: initdb.c:819 #, c-format msgid "cannot be run as root" msgstr "root-ით ვერ გáƒáƒ”შვებáƒ" -#: initdb.c:760 +#: initdb.c:820 #, c-format msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." msgstr "შედით (áƒáƒœ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \"su\") áƒáƒ áƒáƒžáƒ áƒ˜áƒ•ილეგირებული მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლით, რáƒáƒ›áƒ”ლიც სერვერს პრáƒáƒªáƒ”სის მფლáƒáƒ‘ელი იქნებáƒ." -#: initdb.c:792 +#: initdb.c:852 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "\"%s\" კáƒáƒ“ირების სწáƒáƒ  სáƒáƒ®áƒ”ლს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" -#: initdb.c:936 +#: initdb.c:996 #, c-format msgid "file \"%s\" does not exist" msgstr "ფáƒáƒ˜áƒšáƒ˜ %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: initdb.c:937 initdb.c:942 initdb.c:949 +#: initdb.c:997 initdb.c:1002 initdb.c:1009 #, c-format msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." msgstr "შეიძლებრნიშნáƒáƒ•დეს, რáƒáƒ› თქვენი დáƒáƒ§áƒ”ნებული ვერსირგáƒáƒ¤áƒ£áƒ­áƒ”ბულირáƒáƒœ -L -ს áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მიუთითეთ." -#: initdb.c:941 +#: initdb.c:1001 #, c-format msgid "could not access file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: initdb.c:948 +#: initdb.c:1008 #, c-format msgid "file \"%s\" is not a regular file" msgstr "ფáƒáƒ˜áƒš \"%s\" ჩვეულებრივი ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒáƒ" -#: initdb.c:1081 +#: initdb.c:1141 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "დინáƒáƒ›áƒ˜áƒ™áƒ£áƒ áƒ˜ გáƒáƒ–იáƒáƒ áƒ”ბული მეხსიერების იმპლემენტáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ვრ... " -#: initdb.c:1090 +#: initdb.c:1150 #, c-format -msgid "selecting default max_connections ... " -msgstr "ნáƒáƒ’ულისხმები max_connections-ის áƒáƒ áƒ©áƒ”ვრ… " +msgid "selecting default \"max_connections\" ... " +msgstr "ნáƒáƒ’ულისხმევი \"max_connections\"-ის áƒáƒ áƒ©áƒ”ვრ… " -#: initdb.c:1110 +#: initdb.c:1170 #, c-format -msgid "selecting default shared_buffers ... " -msgstr "ნáƒáƒ’ულისხმები shared_buffers-ის áƒáƒ áƒ©áƒ”ვრ… " +msgid "selecting default \"shared_buffers\" ... " +msgstr "ნáƒáƒ’ულისხმევი \"shared_buffers\"-ის áƒáƒ áƒ©áƒ”ვრ… " -#: initdb.c:1133 +#: initdb.c:1193 #, c-format msgid "selecting default time zone ... " -msgstr "დრáƒáƒ˜áƒ¡ ნáƒáƒ’ულისხმები სáƒáƒ áƒ¢áƒ§áƒšáƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ვრ… " +msgstr "დრáƒáƒ˜áƒ¡ ნáƒáƒ’ულისხმევი სáƒáƒ áƒ¢áƒ§áƒšáƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ვრ… " -#: initdb.c:1210 +#: initdb.c:1272 msgid "creating configuration files ... " msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის შექმნრ… " -#: initdb.c:1371 initdb.c:1385 initdb.c:1452 initdb.c:1463 +#: initdb.c:1425 initdb.c:1439 initdb.c:1506 initdb.c:1517 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "\"%s\"-ის წვდáƒáƒ›áƒ”ბის შეცვლის შეცდáƒáƒ›áƒ: %m" -#: initdb.c:1481 +#: initdb.c:1536 #, c-format msgid "running bootstrap script ... " msgstr "მáƒáƒ¡áƒáƒ›áƒ–áƒáƒ“ებელი სკრიპტის გáƒáƒ¨áƒ•ებრ... " -#: initdb.c:1493 +#: initdb.c:1548 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "შეყვáƒáƒœáƒ˜áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ \"%s\" PostgreSQL %s -ს áƒáƒ  ეკუთვნის" -#: initdb.c:1495 +#: initdb.c:1550 #, c-format msgid "Specify the correct path using the option -L." msgstr "მიუთითეთ სწáƒáƒ áƒ˜ ბილიკი -L პáƒáƒ áƒáƒ›áƒ”ტრით." -#: initdb.c:1595 +#: initdb.c:1652 msgid "Enter new superuser password: " msgstr "შეიყვáƒáƒœáƒ”თ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის áƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒáƒšáƒ˜: " -#: initdb.c:1596 +#: initdb.c:1653 msgid "Enter it again: " msgstr "შეიყვáƒáƒœáƒ”თ კდევ ერთხელ: " -#: initdb.c:1599 +#: initdb.c:1656 #, c-format msgid "Passwords didn't match.\n" msgstr "პáƒáƒ áƒáƒšáƒ”ბი áƒáƒ  ემთხვევáƒ.\n" -#: initdb.c:1623 +#: initdb.c:1680 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: initdb.c:1626 +#: initdb.c:1683 #, c-format msgid "password file \"%s\" is empty" msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ (\"%s\") ცáƒáƒ áƒ˜áƒ”ლიáƒ" -#: initdb.c:2038 +#: initdb.c:2095 #, c-format msgid "caught signal\n" msgstr "მიღებულირსიგნáƒáƒšáƒ˜\n" -#: initdb.c:2044 +#: initdb.c:2101 #, c-format msgid "could not write to child process: %s\n" msgstr "შვილáƒáƒ‘ილი პრáƒáƒªáƒ”სისთვის ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %s\n" -#: initdb.c:2052 +#: initdb.c:2109 #, c-format msgid "ok\n" msgstr "დიáƒáƒ®\n" -#: initdb.c:2141 -#, c-format -msgid "setlocale() failed" -msgstr "setlocale()-ის შეცდáƒáƒ›áƒ" - -#: initdb.c:2159 +#: initdb.c:2191 initdb.c:2237 #, c-format -msgid "failed to restore old locale \"%s\"" -msgstr "ძველი ენის (\"%s\") áƒáƒ¦áƒ“გენის შეცდáƒáƒ›áƒ" +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი \"%s\" áƒáƒ áƒ-ASCII სიმბáƒáƒšáƒáƒ”ბს შეიცáƒáƒ•ს" -#: initdb.c:2166 +#: initdb.c:2217 #, c-format msgid "invalid locale name \"%s\"" msgstr "ენის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\"" -#: initdb.c:2177 +#: initdb.c:2218 +#, c-format +msgid "If the locale name is specific to ICU, use --icu-locale." +msgstr "თუ ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი მხáƒáƒšáƒáƒ“ მითითებული ICU-სთვისრხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ --icu-locale." + +#: initdb.c:2231 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "ენის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები; გáƒáƒ“áƒáƒáƒ›áƒáƒ¬áƒ›áƒ”თ გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ები: LANG დრLC_*" -#: initdb.c:2203 initdb.c:2227 +#: initdb.c:2262 initdb.c:2286 #, c-format msgid "encoding mismatch" msgstr "კáƒáƒ“ირებრáƒáƒ  ემთხვევáƒ" -#: initdb.c:2204 +#: initdb.c:2263 #, c-format msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." msgstr "თქვენ მიერ áƒáƒ áƒ©áƒ”ული კáƒáƒ“ირებრ(%s) დრკáƒáƒ“ირებáƒ, რáƒáƒ›áƒ”ლსáƒáƒª áƒáƒ áƒ©áƒ”ული ენრიყენებს (%s) áƒáƒ  ემთხვევáƒ. ეს სიმბáƒáƒšáƒáƒ”ბის სტრიქáƒáƒœáƒ”ბის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რფუნქციების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  ქცევáƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ¬áƒ•ევს." -#: initdb.c:2209 initdb.c:2230 +#: initdb.c:2268 initdb.c:2289 #, c-format msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." msgstr "თáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•ით %s დრკáƒáƒ“ირებრáƒáƒœ áƒáƒ  მიუთითáƒáƒ—, áƒáƒœ სწáƒáƒ áƒáƒ“ მიუთითეთ." -#: initdb.c:2228 +#: initdb.c:2287 #, c-format msgid "The encoding you selected (%s) is not supported with the ICU provider." msgstr "თქვენს მიერ შერჩეული კáƒáƒ“ირებრ(%s) ICU -ის მáƒáƒ›áƒ¬áƒáƒ“ებელთáƒáƒœ ერთáƒáƒ“ მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ." -#: initdb.c:2256 initdb.c:2322 -#, c-format -msgid "could not get language from locale \"%s\": %s" -msgstr "ლáƒáƒ™áƒáƒšáƒ˜áƒ“áƒáƒœ \"%s\" ენის მიღების შეცდáƒáƒ›áƒ: %s" - -#: initdb.c:2293 +#: initdb.c:2338 #, c-format msgid "could not convert locale name \"%s\" to language tag: %s" msgstr "მდებáƒáƒ áƒ”áƒáƒ‘ის კáƒáƒ“ის \"%s\" ენის ჭდეში (%s) გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: initdb.c:2299 initdb.c:2352 initdb.c:2365 initdb.c:2445 +#: initdb.c:2344 initdb.c:2396 initdb.c:2488 #, c-format msgid "ICU is not supported in this build" msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ ICU-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბბს" -#: initdb.c:2349 +#: initdb.c:2367 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "ლáƒáƒ™áƒáƒšáƒ˜áƒ“áƒáƒœ \"%s\" ენის მიღების შეცდáƒáƒ›áƒ: %s" + +#: initdb.c:2393 #, c-format msgid "locale \"%s\" has unknown language \"%s\"" msgstr "ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ \"%s\" ენრ\"%s\" უცნáƒáƒ‘იáƒ" -#: initdb.c:2428 +#: initdb.c:2454 +#, c-format +msgid "locale must be specified if provider is %s" +msgstr "ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ, თუ მáƒáƒ›áƒ¬áƒáƒ“ებელირ%s" + +#: initdb.c:2465 #, c-format -msgid "Using default ICU locale \"%s\".\n" -msgstr "ვიყენებ ნáƒáƒ’ულისხმებ ICU ლáƒáƒ™áƒáƒšáƒ¡ \"%s\".\n" +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი \"%s\" ჩáƒáƒ¨áƒ”ნებული მáƒáƒ›áƒ¬áƒáƒ“ებლისთვის" -#: initdb.c:2433 +#: initdb.c:2476 #, c-format msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" msgstr "ვიყენებ ენის ჭდეს \"%s\" ICU ლáƒáƒ™áƒáƒšáƒ˜áƒ¡áƒ—ვის \"%s\".\n" -#: initdb.c:2456 +#: initdb.c:2499 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -483,17 +555,17 @@ msgstr "" "%s PostgreSQL ბáƒáƒ–ის კლáƒáƒ¡áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒáƒ¡ áƒáƒ®áƒ“ენს.\n" "\n" -#: initdb.c:2457 +#: initdb.c:2500 #, c-format msgid "Usage:\n" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" -#: initdb.c:2458 +#: initdb.c:2501 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე]\n" -#: initdb.c:2459 +#: initdb.c:2502 #, c-format msgid "" "\n" @@ -502,57 +574,57 @@ msgstr "" "\n" "პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: initdb.c:2460 +#: initdb.c:2503 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" -msgstr " -A, --auth=მეთáƒáƒ“ი áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ’ულისხმები მეთáƒáƒ“ი ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ შეერთებებისთვის\n" +msgstr " -A, --auth=მეთáƒáƒ“ი áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ’ულისხმევი მეთáƒáƒ“ი ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ შეერთებებისთვის\n" -#: initdb.c:2461 +#: initdb.c:2504 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" -msgstr " --auth-host=მეთáƒáƒ“ი ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ TCP/IP შეერთების áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ’ულისხმები მეთáƒáƒ“ი\n" +msgstr " --auth-host=მეთáƒáƒ“ი ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ TCP/IP შეერთების áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ’ულისხმევი მეთáƒáƒ“ი\n" -#: initdb.c:2462 +#: initdb.c:2505 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" -msgstr " --auth-local=მეთáƒáƒ“ი ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ სáƒáƒ™áƒ”ტის შეერთების áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ’ულისხმები მეთáƒáƒ“ი\n" +msgstr " --auth-local=მეთáƒáƒ“ი ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ სáƒáƒ™áƒ”ტის შეერთების áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ’ულისხმევი მეთáƒáƒ“ი\n" -#: initdb.c:2463 +#: initdb.c:2506 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATADIR ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n" -#: initdb.c:2464 +#: initdb.c:2507 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" -msgstr " -E, --encoding=კáƒáƒ“ირებრáƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ების ნáƒáƒ’ულისხმები კáƒáƒ“ირებáƒ\n" +msgstr " -E, --encoding=კáƒáƒ“ირებრáƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ების ნáƒáƒ’ულისხმევი კáƒáƒ“ირებáƒ\n" -#: initdb.c:2465 +#: initdb.c:2508 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr " -g, --allow-group-access მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეზე ჯგუფის კითხვáƒ/გáƒáƒ¨áƒ•ების წვდáƒáƒ›áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ\n" -#: initdb.c:2466 +#: initdb.c:2509 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" msgstr " --icu-locale=კáƒáƒ“ირებრICU ენის ID áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ებისთვის\n" -#: initdb.c:2467 +#: initdb.c:2510 #, c-format msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" msgstr " --icu-rules=წესები áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ებისთვის დáƒáƒ›áƒáƒ¢áƒ”ბითი ICUკáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ წესების დáƒáƒ§áƒ”ნებáƒ\n" -#: initdb.c:2468 +#: initdb.c:2511 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums მáƒáƒœáƒáƒªáƒ”მების გვერდის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" -#: initdb.c:2469 +#: initdb.c:2512 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" -msgstr " --locale=ენრáƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ების ნáƒáƒ’ულისხმები ენის დáƒáƒ§áƒ”ნებáƒ\n" +msgstr " --locale=ენრáƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ების ნáƒáƒ’ულისხმევი ენის დáƒáƒ§áƒ”ნებáƒ\n" -#: initdb.c:2470 +#: initdb.c:2513 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -562,58 +634,67 @@ msgid "" msgstr "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" " --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n" -" დáƒáƒáƒ§áƒ”ნეთ ნáƒáƒ’ულისხმები ენრშესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡ კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒáƒ¨áƒ˜\n" -" áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ებისთვის (ნáƒáƒ’ულისხმები áƒáƒ¦áƒ”ბულირგáƒáƒ áƒ”მáƒáƒ“áƒáƒœ)\n" +" დáƒáƒáƒ§áƒ”ნეთ ნáƒáƒ’ულისხმევი ენრშესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡ კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒáƒ¨áƒ˜\n" +" áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ებისთვის (ნáƒáƒ’ულისხმევი áƒáƒ¦áƒ”ბულირგáƒáƒ áƒ”მáƒáƒ“áƒáƒœ)\n" -#: initdb.c:2474 +#: initdb.c:2517 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale იგივე, რáƒáƒª --locale=C\n" -#: initdb.c:2475 +#: initdb.c:2518 +#, c-format +msgid "" +" --builtin-locale=LOCALE\n" +" set builtin locale name for new databases\n" +msgstr "" +" --builtin-locale=ლáƒáƒ™áƒáƒšáƒ˜\n" +" ჩáƒáƒ¨áƒ”ნებული ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის დáƒáƒ§áƒ”ნებრáƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ებისთვის\n" + +#: initdb.c:2520 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " set default locale provider for new databases\n" msgstr "" -" --locale-provider={libc|icu}\n" -" áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ებისთვის ენის ნáƒáƒ’ულისხმები მიმწáƒáƒ“ებლის დáƒáƒ§áƒ”ნებáƒ\n" +" --locale-provider={builtin|libc|icu}\n" +" áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ებისთვის ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ ნáƒáƒ’ულისხმევი მიმწáƒáƒ“ებლის დáƒáƒ§áƒ”ნებáƒ\n" -#: initdb.c:2477 +#: initdb.c:2522 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=FILE áƒáƒ®áƒáƒšáƒ˜ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვáƒ\n" -#: initdb.c:2478 +#: initdb.c:2523 #, c-format msgid "" " -T, --text-search-config=CFG\n" " default text search configuration\n" msgstr "" " -T, --text-search-config=CFG\n" -" ტექსტის ძებნის ნáƒáƒ’ულისხმები კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ\n" +" ტექსტის ძებნის ნáƒáƒ’ულისხმევი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ\n" -#: initdb.c:2480 +#: initdb.c:2525 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=სáƒáƒ®áƒ”ლი ბáƒáƒ–ის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: initdb.c:2481 +#: initdb.c:2526 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒšáƒ˜áƒ¡ კითხვáƒ\n" -#: initdb.c:2482 +#: initdb.c:2527 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR წინáƒáƒ¡áƒ¬áƒáƒ  ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ (WAL) სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n" -#: initdb.c:2483 +#: initdb.c:2528 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=ზáƒáƒ›áƒ WAL სეგმენტების ზáƒáƒ›áƒ, მეგáƒáƒ‘áƒáƒ˜áƒ¢áƒ”ბში\n" -#: initdb.c:2484 +#: initdb.c:2529 #, c-format msgid "" "\n" @@ -622,52 +703,57 @@ msgstr "" "\n" "იშვიáƒáƒ—áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: initdb.c:2485 +#: initdb.c:2530 #, c-format msgid " -c, --set NAME=VALUE override default setting for server parameter\n" -msgstr " -c, --set NAME=VALUE სერვერის ნáƒáƒ’ულისხმები პáƒáƒ áƒáƒ›áƒ”ტრის გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•áƒ\n" +msgstr " -c, --set NAME=VALUE სერვერის ნáƒáƒ’ულისხმევი პáƒáƒ áƒáƒ›áƒ”ტრის გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•áƒ\n" -#: initdb.c:2486 +#: initdb.c:2531 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug გáƒáƒ¡áƒáƒ›áƒáƒ áƒ—ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ\n" -#: initdb.c:2487 +#: initdb.c:2532 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches debug_discard_caches=1 დáƒáƒ§áƒ”ნებáƒ\n" -#: initdb.c:2488 +#: initdb.c:2533 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის შემცველი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: initdb.c:2489 +#: initdb.c:2534 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean შეცდáƒáƒ›áƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜ áƒáƒ  გáƒáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ\n" -#: initdb.c:2490 +#: initdb.c:2535 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync áƒáƒ  დáƒáƒ•ელáƒáƒ“რცვლილებების დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡\n" -#: initdb.c:2491 +#: initdb.c:2536 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions შემდეგი ნáƒáƒ‘იჯის ინსტრუქციები ნáƒáƒ©áƒ•ენები áƒáƒ  იქნებáƒ\n" -#: initdb.c:2492 +#: initdb.c:2537 #, c-format -msgid " -s, --show show internal settings\n" -msgstr " -s, --show შიდრპáƒáƒ áƒáƒ›áƒ”ტრების ჩვენებáƒ\n" +msgid " -s, --show show internal settings, then exit\n" +msgstr " -s, --show შიდრპáƒáƒ áƒáƒ›áƒ”ტრების ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: initdb.c:2493 +#: initdb.c:2538 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=მეთáƒáƒ“ი ფáƒáƒ˜áƒšáƒ”ბის დისკზე სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის დáƒáƒ§áƒ”ნებáƒ\n" + +#: initdb.c:2539 #, c-format msgid " -S, --sync-only only sync database files to disk, then exit\n" msgstr " -S, --sync-only ბáƒáƒ–ის ფáƒáƒ˜áƒšáƒ”ბის დისკზე სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: initdb.c:2494 +#: initdb.c:2540 #, c-format msgid "" "\n" @@ -676,17 +762,17 @@ msgstr "" "\n" "სხვრპáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: initdb.c:2495 +#: initdb.c:2541 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: initdb.c:2496 +#: initdb.c:2542 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: initdb.c:2497 +#: initdb.c:2543 #, c-format msgid "" "\n" @@ -697,7 +783,7 @@ msgstr "" "თუ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ, გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრ\n" "გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი PGDATA.\n" -#: initdb.c:2499 +#: initdb.c:2545 #, c-format msgid "" "\n" @@ -706,72 +792,72 @@ msgstr "" "\n" "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n" -#: initdb.c:2500 +#: initdb.c:2546 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" -#: initdb.c:2528 +#: initdb.c:2570 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი (\"%s\") áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ \"%s\" შეერთებებისთვის" -#: initdb.c:2542 +#: initdb.c:2584 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ— áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¡áƒáƒ áƒ—áƒáƒ•áƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒáƒ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒšáƒ˜áƒ¡ მითითებáƒ" -#: initdb.c:2561 +#: initdb.c:2603 #, c-format msgid "no data directory specified" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ" -#: initdb.c:2562 +#: initdb.c:2604 #, c-format msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." msgstr "უნდრდáƒáƒáƒ“გინáƒáƒ— სáƒáƒ¥áƒáƒ¦áƒšáƒ“ე, სáƒáƒ“áƒáƒª ბáƒáƒ–ის áƒáƒ› სისტემის მáƒáƒœáƒáƒªáƒ”მები იქნებრგáƒáƒœáƒ—áƒáƒ•სებული . გáƒáƒáƒ™áƒ”თეთ ეს áƒáƒœ გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრით -D áƒáƒœ გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ით PGDATA." -#: initdb.c:2579 +#: initdb.c:2621 #, c-format msgid "could not set environment" msgstr "გáƒáƒ áƒ”მáƒáƒ¡ დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ" -#: initdb.c:2597 +#: initdb.c:2639 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "პრáƒáƒ’რáƒáƒ›áƒ \"%s\" სჭირდებრ\"%s\"-ს, მáƒáƒ’რáƒáƒ› იგივე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში, სáƒáƒ“áƒáƒª \"%s\", ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" -#: initdb.c:2600 +#: initdb.c:2642 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "პრáƒáƒ’რáƒáƒ›áƒ „%s“ ნáƒáƒžáƒáƒ•ნირ„%s“-ის მიერ, მáƒáƒ’რáƒáƒ› ვერსიáƒ, იგივერáƒáƒ áƒáƒ, რáƒáƒª %s" -#: initdb.c:2615 +#: initdb.c:2657 #, c-format msgid "input file location must be an absolute path" msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘რáƒáƒ‘სტáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ ბილიკი უნდრიყáƒáƒ¡" -#: initdb.c:2632 +#: initdb.c:2674 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ ენით \"%s\".\n" -#: initdb.c:2635 +#: initdb.c:2677 #, c-format msgid "The database cluster will be initialized with this locale configuration:\n" msgstr "ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ ენის áƒáƒ› კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ— მáƒáƒ®áƒ“ებáƒ:\n" -#: initdb.c:2636 +#: initdb.c:2678 #, c-format -msgid " provider: %s\n" -msgstr " მáƒáƒ›áƒ¬áƒáƒ“ებელი: %s\n" +msgid " locale provider: %s\n" +msgstr " ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ მáƒáƒ›áƒ¬áƒáƒ“ებელი: %s\n" -#: initdb.c:2638 +#: initdb.c:2680 #, c-format -msgid " ICU locale: %s\n" -msgstr " ICU ენáƒ: %s\n" +msgid " default collation: %s\n" +msgstr " ნáƒáƒ’ულიხმევი კáƒáƒšáƒáƒªáƒ˜áƒ: %s\n" -#: initdb.c:2639 +#: initdb.c:2681 #, c-format msgid "" " LC_COLLATE: %s\n" @@ -788,131 +874,136 @@ msgstr "" " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2669 +#: initdb.c:2711 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "ენისთვის (\"%s\") შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ კáƒáƒ“ირებრვერ ვიპáƒáƒ•ე" -#: initdb.c:2671 +#: initdb.c:2713 #, c-format msgid "Rerun %s with the -E option." msgstr "გáƒáƒ£áƒ¨áƒ•ით %s თáƒáƒ•იდáƒáƒœ -E პáƒáƒ áƒáƒ›áƒ”ტრით." -#: initdb.c:2672 initdb.c:3205 initdb.c:3314 initdb.c:3334 +#: initdb.c:2714 initdb.c:3257 initdb.c:3377 initdb.c:3397 #, c-format msgid "Try \"%s --help\" for more information." msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." -#: initdb.c:2684 +#: initdb.c:2726 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" "The default database encoding will be set to \"%s\" instead.\n" msgstr "" -"ენის ნáƒáƒ’ულისხმები „%s“ კáƒáƒ“ირების დáƒáƒ§áƒ”ნებáƒ, სერვერის დáƒáƒ¡áƒáƒ¨áƒ˜áƒ¤áƒ áƒáƒ“ შეუძლებელიáƒ.\n" +"ენის ნáƒáƒ’ულისხმევი „%s“ კáƒáƒ“ირების დáƒáƒ§áƒ”ნებáƒ, სერვერის დáƒáƒ¡áƒáƒ¨áƒ˜áƒ¤áƒ áƒáƒ“ შეუძლებელიáƒ.\n" "სáƒáƒœáƒáƒªáƒ•ლáƒáƒ“, ბáƒáƒ–ის ნáƒáƒ’ულისხმევი კáƒáƒ“ირებრდáƒáƒ§áƒ”ნდებრ„%s“.\n" -#: initdb.c:2689 +#: initdb.c:2731 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "ენáƒáƒ¡ (\"%s\") მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი კáƒáƒ“ირებრ(\"%s\") სჭირდებáƒ" -#: initdb.c:2691 +#: initdb.c:2733 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "%s სერვერის მხáƒáƒ áƒ”ს კáƒáƒ“ირებრვერ იქნებáƒ." -#: initdb.c:2693 +#: initdb.c:2735 #, c-format msgid "Rerun %s with a different locale selection." msgstr "%s-ის თáƒáƒ•იდáƒáƒœ გáƒáƒ¨áƒ•ებრენის სხვრáƒáƒ áƒ©áƒ”ვáƒáƒœáƒ˜áƒ—." -#: initdb.c:2701 +#: initdb.c:2743 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" -msgstr "ბáƒáƒ–ის ნáƒáƒ’ულისხმები კáƒáƒ“ირებრშესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒáƒ“ დáƒáƒ§áƒ”ნებულირ„%s“-ზე.\n" +msgstr "ბáƒáƒ–ის ნáƒáƒ’ულისხმევი კáƒáƒ“ირებრშესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒáƒ“ დáƒáƒ§áƒ”ნებულირ„%s“-ზე.\n" -#: initdb.c:2770 +#: initdb.c:2757 +#, c-format +msgid "builtin provider locale \"%s\" requires encoding \"%s\"" +msgstr "ჩáƒáƒ¨áƒ”ნებულ მáƒáƒ›áƒ¬áƒáƒ“ებელს ლáƒáƒ™áƒáƒšáƒ˜áƒ¡áƒ—ვის \"%s\" ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბრკáƒáƒ“ირებრ\"%s\"" + +#: initdb.c:2819 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "ტექსტის ძებნის ენისთვის შესáƒáƒ¤áƒ”რისი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ«áƒ”ბნრშეუძლებელიáƒ: \"%s\"" -#: initdb.c:2781 +#: initdb.c:2830 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "ტექსტის ძებნის ენისთვის შესáƒáƒ¤áƒ”რისი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" -#: initdb.c:2786 +#: initdb.c:2835 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "ტექსტის ძებნის მითითებული კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ \"%s\" ენáƒáƒ¡ (\"%s\") áƒáƒ  ემთხვევáƒ" -#: initdb.c:2791 +#: initdb.c:2840 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" -msgstr "ტექსტის ძებნის ნáƒáƒ’ულისხმები კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ \"%s\" იქნებáƒ.\n" +msgstr "ტექსტის ძებნის ნáƒáƒ’ულისხმევი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ \"%s\" იქნებáƒ.\n" -#: initdb.c:2834 initdb.c:2905 +#: initdb.c:2883 initdb.c:2954 #, c-format msgid "creating directory %s ... " msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") შექმნრ.... " -#: initdb.c:2839 initdb.c:2910 initdb.c:2958 initdb.c:3014 +#: initdb.c:2888 initdb.c:2959 initdb.c:3007 initdb.c:3064 #, c-format msgid "could not create directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m" -#: initdb.c:2848 initdb.c:2920 +#: initdb.c:2897 initdb.c:2969 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "áƒáƒ áƒ¡áƒ”ბულ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეზე (\"%s\") წვდáƒáƒ›áƒ”ბის ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბრ... " -#: initdb.c:2853 initdb.c:2925 +#: initdb.c:2902 initdb.c:2974 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წვდáƒáƒ›áƒ”ბის შეცვლრშეუძლებელირ\"%s\": %m" -#: initdb.c:2865 initdb.c:2937 +#: initdb.c:2914 initdb.c:2986 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ áƒáƒ" -#: initdb.c:2869 +#: initdb.c:2918 #, c-format msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." msgstr "თუ გსურთ ბáƒáƒ–ის áƒáƒ®áƒáƒšáƒ˜ სისტემის შექმნáƒ, წáƒáƒ¨áƒáƒšáƒ”თ áƒáƒœ დáƒáƒáƒªáƒáƒ áƒ˜áƒ”ლეთ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე, %s áƒáƒœ %s „%s“-ის გáƒáƒ áƒ“რáƒáƒ áƒ’უმენტით გáƒáƒ£áƒ¨áƒ•ით." -#: initdb.c:2877 initdb.c:2947 initdb.c:3355 +#: initdb.c:2926 initdb.c:2996 initdb.c:3422 #, c-format msgid "could not access directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: initdb.c:2898 +#: initdb.c:2947 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘რáƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ ბილიკი უნდრიყáƒáƒ¡" -#: initdb.c:2941 +#: initdb.c:2990 #, c-format msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." msgstr "თუ გსურთ WAL-ის იქ შენáƒáƒ®áƒ•áƒ, წáƒáƒ¨áƒáƒšáƒ”თ áƒáƒœ დáƒáƒáƒªáƒáƒ áƒ˜áƒ”ლეთ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე „%s“." -#: initdb.c:2951 +#: initdb.c:3000 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "სიმბმულის შექმნის შეცდáƒáƒ›áƒ %s: %m" -#: initdb.c:2970 +#: initdb.c:3019 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." msgstr "ის შეიცáƒáƒ•ს წერტილით დáƒáƒ¬áƒ§áƒ”ბულ/უხილáƒáƒ• ფáƒáƒ˜áƒšáƒ¡, შესáƒáƒ«áƒšáƒáƒ იმის გáƒáƒ›áƒ, რáƒáƒ› ის მიმáƒáƒ’რების წერტილიáƒ." -#: initdb.c:2972 +#: initdb.c:3021 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point." msgstr "ის შეიცáƒáƒ•ს lost+found სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეს. áƒáƒšáƒ‘áƒáƒ— იმის გáƒáƒ›áƒ, რáƒáƒ› ის მიმáƒáƒ’რების წერტილიáƒ." -#: initdb.c:2974 +#: initdb.c:3023 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -921,70 +1012,65 @@ msgstr "" "მიმáƒáƒ’რების წერტილის პირდáƒáƒžáƒ˜áƒ  მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ედ გáƒáƒ›áƒáƒ§áƒ”ნებრრეკáƒáƒ›áƒ”ნდებული áƒáƒ áƒáƒ.\n" "შექმენით ქვესáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მიმáƒáƒ’რების წერტილის ქვეშ." -#: initdb.c:3000 +#: initdb.c:3050 #, c-format msgid "creating subdirectories ... " msgstr "ქვესáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეების შექმნრ... " -#: initdb.c:3043 +#: initdb.c:3093 msgid "performing post-bootstrap initialization ... " msgstr "პირველáƒáƒ“ი მáƒáƒ›áƒ–áƒáƒ“ების შემდგáƒáƒ›áƒ˜ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შესრულებრ... " -#: initdb.c:3204 +#: initdb.c:3256 #, c-format msgid "-c %s requires a value" msgstr "-c %s მნიშვნელáƒáƒ‘რსჭირდებáƒ" -#: initdb.c:3229 +#: initdb.c:3281 #, c-format msgid "Running in debug mode.\n" msgstr "გáƒáƒ¨áƒ•ებულირგáƒáƒ›áƒáƒ áƒ—ვის რეჟიმში.\n" -#: initdb.c:3233 +#: initdb.c:3285 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "გáƒáƒ¨áƒ•ებულირმáƒáƒ£áƒ¬áƒ›áƒ”ნდáƒáƒ• რეჟიმში. შეცდáƒáƒ›áƒ”ბი áƒáƒ  გáƒáƒ˜áƒ¬áƒ›áƒ˜áƒœáƒ“ებáƒ.\n" -#: initdb.c:3304 +#: initdb.c:3358 #, c-format msgid "unrecognized locale provider: %s" msgstr "ენის უცნáƒáƒ‘ი მáƒáƒ›áƒ¬áƒáƒ“ებელი: %s" -#: initdb.c:3332 +#: initdb.c:3395 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")" -#: initdb.c:3339 initdb.c:3343 +#: initdb.c:3402 initdb.c:3406 initdb.c:3410 #, c-format msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgstr "%s ვერ იქნებრმითითებული, თუ ენის მáƒáƒ›áƒ¬áƒáƒ“ებლáƒáƒ“ „%s“ áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒ©áƒ”ული" -#: initdb.c:3357 initdb.c:3434 +#: initdb.c:3424 initdb.c:3487 msgid "syncing data to disk ... " msgstr "მáƒáƒœáƒáƒªáƒ”მების სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ დისკზე ... " -#: initdb.c:3365 +#: initdb.c:3432 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•ნისრდრპáƒáƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ერთდრáƒáƒ£áƒšáƒáƒ“ მითითებრშეუძებელიáƒ" -#: initdb.c:3387 -#, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "--wal-segisze -ის áƒáƒ áƒ’უმენტი რიცხვი უნდრიყáƒáƒ¡" - -#: initdb.c:3389 +#: initdb.c:3443 #, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "--wal-segsize -ის áƒáƒ áƒ’უმენტი 2-ის ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡ 1-1024 დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ“áƒáƒœ" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "%s-ის áƒáƒ áƒ’უმენტი 2-ის ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡ 1-1024 შუáƒáƒšáƒ”დიდáƒáƒœ" -#: initdb.c:3403 +#: initdb.c:3456 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი \"%s\" უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒšáƒ˜áƒ. რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლებირ\"pg_\"-ით ვერ დáƒáƒ˜áƒ¬áƒ§áƒ”ბáƒ" -#: initdb.c:3405 +#: initdb.c:3458 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -995,17 +1081,17 @@ msgstr "" "ეს მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი სერვერის პრáƒáƒªáƒ”სსáƒáƒª უნდრფლáƒáƒ‘დეს.\n" "\n" -#: initdb.c:3421 +#: initdb.c:3474 #, c-format msgid "Data page checksums are enabled.\n" msgstr "მáƒáƒœáƒáƒªáƒ”მების გვერდის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი ჩáƒáƒ áƒ—ულიáƒ.\n" -#: initdb.c:3423 +#: initdb.c:3476 #, c-format msgid "Data page checksums are disabled.\n" msgstr "მáƒáƒœáƒáƒªáƒ”მების გვერდის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი გáƒáƒ›áƒáƒ áƒ—ულიáƒ.\n" -#: initdb.c:3440 +#: initdb.c:3493 #, c-format msgid "" "\n" @@ -1016,22 +1102,22 @@ msgstr "" "დისკთáƒáƒœ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ გáƒáƒ›áƒáƒ¢áƒáƒ•ებულიáƒ.\n" "áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒšáƒ˜ სისტემის სიკვდილის შემთხვევáƒáƒ¨áƒ˜ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე შეიძლებრდáƒáƒ–იáƒáƒœáƒ“ეს.\n" -#: initdb.c:3445 +#: initdb.c:3498 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ შეერთებებისთვის \"trust\" áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ áƒ—ვáƒ" -#: initdb.c:3446 +#: initdb.c:3499 #, c-format msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." msgstr "შეცვლრშეგიძლიáƒáƒ— pg_hba.conf-ის რედáƒáƒ¥áƒ¢áƒ˜áƒ áƒ”ბით áƒáƒœ რáƒáƒªáƒ შემდეგ ჯერზე გáƒáƒ£áƒ¨áƒ•ებთ initdb-ს, -A, áƒáƒœ --auth-local დრ--auth-host-ის გáƒáƒ›áƒáƒ§áƒ”ნებით." #. translator: This is a placeholder in a shell command. -#: initdb.c:3476 +#: initdb.c:3529 msgid "logfile" msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜" -#: initdb.c:3478 +#: initdb.c:3531 #, c-format msgid "" "\n" @@ -1045,3 +1131,15 @@ msgstr "" "\n" " %s\n" "\n" + +#, c-format +#~ msgid " ICU locale: %s\n" +#~ msgstr " ICU ენáƒ: %s\n" + +#, c-format +#~ msgid "ICU locale must be specified" +#~ msgstr "სáƒáƒ­áƒ áƒáƒ ICU ენის მითითებáƒ" + +#, c-format +#~ msgid "argument of --wal-segsize must be a number" +#~ msgstr "--wal-segisze -ის áƒáƒ áƒ’უმენტი რიცხვი უნდრიყáƒáƒ¡" diff --git a/src/bin/initdb/po/ko.po b/src/bin/initdb/po/ko.po index 72f9db7f21e39..cc204fa046df1 100644 --- a/src/bin/initdb/po/ko.po +++ b/src/bin/initdb/po/ko.po @@ -3,10 +3,10 @@ # msgid "" msgstr "" -"Project-Id-Version: initdb (PostgreSQL) 13\n" +"Project-Id-Version: initdb (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 01:16+0000\n" -"PO-Revision-Date: 2020-10-05 17:52+0900\n" +"POT-Creation-Date: 2025-01-17 04:51+0000\n" +"PO-Revision-Date: 2025-01-16 11:33+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -15,100 +15,123 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "심ê°: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 #, c-format -msgid "could not identify current directory: %m" -msgstr "현재 디렉터리를 알 수 ì—†ìŒ: %m" +msgid "hint: " +msgstr "힌트: " -#: ../../common/exec.c:156 +#: ../../common/exec.c:174 #, c-format -msgid "invalid binary \"%s\"" -msgstr "\"%s\" 파ì¼ì€ ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼ìž…니다" +msgid "invalid binary \"%s\": %m" +msgstr "\"%s\" 파ì¼ì€ ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼ìž„: %m" -#: ../../common/exec.c:206 +#: ../../common/exec.c:217 #, c-format -msgid "could not read binary \"%s\"" -msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ" +msgid "could not read binary \"%s\": %m" +msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: ../../common/exec.c:214 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "\"%s\" 실행 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:252 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "\"%s\" ì´ë¦„ì˜ ë””ë ‰í„°ë¦¬ë¡œ ì´ë™í•  수 없습니다: %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "\"%s\" 경로를 절대 경로로 바꿀 수 ì—†ìŒ: %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:382 initdb.c:750 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "\"%s\" 심볼릭 ë§í¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" +msgid "could not execute command \"%s\": %m" +msgstr "\"%s\" ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ: %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:394 #, c-format -msgid "pclose failed: %m" -msgstr "pclose 실패: %m" +msgid "could not read from command \"%s\": %m" +msgstr "\"%s\" 명령ì—서 ì½ì„ 수 ì—†ìŒ: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 -#: initdb.c:325 +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "\"%s\" ëª…ë ¹ì´ ì•„ë¬´ ë°ì´í„°ë„ 반환하지 않ìŒ" + +#: ../../common/exec.c:424 +#, c-format +msgid "%s() failed: %m" +msgstr "%s() 실패: %m" + +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: initdb.c:372 initdb.c:408 #, c-format msgid "out of memory" msgstr "메모리 부족" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "메모리 부족\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "null í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" -#: ../../common/file_utils.c:79 ../../common/file_utils.c:181 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ fsync 실패: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 #, c-format msgid "could not stat file \"%s\": %m" msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m" -#: ../../common/file_utils.c:158 ../../common/pgfnames.c:48 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ì´ ë¹Œë“œëŠ” \"%s\" ë™ê¸°í™” ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: ../../common/pgfnames.c:48 ../../common/rmtree.c:63 #, c-format msgid "could not open directory \"%s\": %m" msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m" -#: ../../common/file_utils.c:192 ../../common/pgfnames.c:69 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: ../../common/pgfnames.c:69 ../../common/rmtree.c:106 #, c-format msgid "could not read directory \"%s\": %m" msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" -#: ../../common/file_utils.c:224 ../../common/file_utils.c:283 -#: ../../common/file_utils.c:357 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" - -#: ../../common/file_utils.c:295 ../../common/file_utils.c:365 +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "\"%s\" íŒŒì¼ fsync 실패: %m" -#: ../../common/file_utils.c:375 +#: ../../common/file_utils.c:498 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" @@ -118,55 +141,45 @@ msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" msgid "could not close directory \"%s\": %m" msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: ../../common/restricted_token.c:64 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "\"%s\" ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 불러 올 수 ì—†ìŒ: 오류 코드 %lu" - -#: ../../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "ì´ ìš´ì˜ì²´ì œì—서 restricted tokenì„ ë§Œë“¤ 수 ì—†ìŒ: 오류 코드 %lu" - -#: ../../common/restricted_token.c:82 +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "프로세스 토í°ì„ ì—´ 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "SID를 할당할 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "ì œí•œëœ í† í°ì„ 만들 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "\"%s\" 명령용 프로세스를 시작할 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "ì œí•œëœ í† í°ìœ¼ë¡œ 재실행할 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "하위 í”„ë¡œì„¸ìŠ¤ì˜ ì¢…ë£Œ 코드를 구할 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/rmtree.c:79 +#: ../../common/rmtree.c:97 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "íŒŒì¼ ë˜ëŠ” 디렉터리 \"%s\"ì˜ ìƒíƒœë¥¼ 확ì¸í•  수 ì—†ìŒ: %m" +msgid "could not remove file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 지울 수 ì—†ìŒ: %m" -#: ../../common/rmtree.c:101 ../../common/rmtree.c:113 +#: ../../common/rmtree.c:124 #, c-format -msgid "could not remove file or directory \"%s\": %m" -msgstr "\"%s\" íŒŒì¼ ë˜ëŠ” 디렉터리를 지울 수 ì—†ìŒ: %m" +msgid "could not remove directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 지울 수 ì—†ìŒ: %m" #: ../../common/username.c:43 #, c-format @@ -182,285 +195,375 @@ msgstr "ì‚¬ìš©ìž ì—†ìŒ" msgid "user name lookup failure: error code %lu" msgstr "ì‚¬ìš©ìž ì´ë¦„ 찾기 실패: 오류 코드 %lu" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "해당 명령어 ì—†ìŒ" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, 종료 코드 %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "0x%X 예외로 하위 프로세스가 종료ë˜ì—ˆìŒ." -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, ì‹œê·¸ë„ %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, 알수 없는 ìƒíƒœ %d" -#: ../../port/dirmod.c:221 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "\"%s\" ê°’ì€ %s 옵션 값으로 쓸 수 ì—†ìŒ" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s ê°’ì€ %d..%d 범위여야 함" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "알 수 없는 ë™ê¸°í™” 방법: %s" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "쉘 ëª…ë ¹ì˜ ì¸ìžì— 줄바꿈 문ìžê°€ í¬í•¨ë˜ì–´ 있ìŒ: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "ë°ì´í„°ë² ì´ìФ ì´ë¦„ì— ì¤„ë°”ê¿ˆ 문ìžê°€ 있ìŒ: \"%s\"\n" + +#: ../../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" msgstr "\"%s\" 파ì¼ì˜ ì—°ê²°ì„ ì„¤ì •í•  수 ì—†ìŒ: %s\n" -#: ../../port/dirmod.c:298 +#: ../../port/dirmod.c:367 #, c-format msgid "could not get junction for \"%s\": %s\n" msgstr "\"%s\" 파ì¼ì˜ ì •ì…˜ì„ êµ¬í•  수 ì—†ìŒ: %s\n" -#: initdb.c:481 initdb.c:1505 +# # search5 ë +# # advance 부분 +#: initdb.c:369 +#, c-format +msgid "_wsetlocale() failed" +msgstr "_wsetlocale() 실패" + +# # search5 ë +# # advance 부분 +#: initdb.c:376 +#, c-format +msgid "setlocale() failed" +msgstr "setlocale() 실패" + +#: initdb.c:390 +#, c-format +msgid "failed to restore old locale" +msgstr "옛 로케ì¼ì„ ë³µì›í•  수 ì—†ìŒ" + +#: initdb.c:393 +#, c-format +msgid "failed to restore old locale \"%s\"" +msgstr "\"%s\" 옛 로케ì¼ì„ ë³µì›í•  수 ì—†ìŒ" + +#: initdb.c:682 initdb.c:1674 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "\"%s\" íŒŒì¼ ì¼ê¸° 모드로 열기 실패: %m" -#: initdb.c:536 initdb.c:846 initdb.c:872 +#: initdb.c:726 initdb.c:1030 initdb.c:1050 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "\"%s\" íŒŒì¼ ì—´ê¸° 실패: %m" -#: initdb.c:543 initdb.c:550 initdb.c:852 initdb.c:877 +#: initdb.c:730 initdb.c:1033 initdb.c:1052 #, c-format msgid "could not write file \"%s\": %m" msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m" -#: initdb.c:568 +#: initdb.c:734 #, c-format -msgid "could not execute command \"%s\": %m" -msgstr "\"%s\" ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ: %m" +msgid "could not close file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: initdb.c:586 +#: initdb.c:768 #, c-format msgid "removing data directory \"%s\"" msgstr "\"%s\" ë°ì´í„° 디렉터리를 지우는 중" -#: initdb.c:588 +#: initdb.c:770 #, c-format msgid "failed to remove data directory" msgstr "ë°ì´í„° 디렉터리를 ì§€ìš°ëŠ”ë° ì‹¤íŒ¨" -#: initdb.c:592 +#: initdb.c:774 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "\"%s\" ë°ì´í„° 디렉터리 ì•ˆì˜ ë‚´ìš©ì„ ì§€ìš°ëŠ” 중" -#: initdb.c:595 +#: initdb.c:777 #, c-format msgid "failed to remove contents of data directory" msgstr "ë°ì´í„° 디렉터리 ë‚´ìš©ì„ ì§€ìš°ëŠ”ë° ì‹¤íŒ¨" -#: initdb.c:600 +#: initdb.c:782 #, c-format msgid "removing WAL directory \"%s\"" msgstr "\"%s\" WAL 디렉터리를 지우는 중" -#: initdb.c:602 +#: initdb.c:784 #, c-format msgid "failed to remove WAL directory" msgstr "WAL 디렉터리를 ì§€ìš°ëŠ”ë° ì‹¤íŒ¨" -#: initdb.c:606 +#: initdb.c:788 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "\"%s\" WAL 디렉터리 ì•ˆì˜ ë‚´ìš©ì„ ì§€ìš°ëŠ” 중" -#: initdb.c:608 +#: initdb.c:790 #, c-format msgid "failed to remove contents of WAL directory" msgstr "WAL 디렉터리 ë‚´ìš©ì„ ì§€ìš°ëŠ”ë° ì‹¤íŒ¨" -#: initdb.c:615 +#: initdb.c:797 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "\"%s\" ë°ì´í„° 디렉터리가 사용ìžì˜ 요청으로 ì‚­ì œë˜ì§€ 않았ìŒ" -#: initdb.c:619 +#: initdb.c:801 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "\"%s\" WAL 디렉터리가 사용ìžì˜ 요청으로 ì‚­ì œë˜ì§€ 않았ìŒ" -#: initdb.c:637 +#: initdb.c:819 #, c-format msgid "cannot be run as root" msgstr "root 권한으로 실행할 수 ì—†ìŒ" -#: initdb.c:639 +#: initdb.c:820 #, c-format msgid "" -"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" -"own the server process.\n" +"Please log in (using, e.g., \"su\") as the (unprivileged) user that will own " +"the server process." msgstr "" -"ì‹œìŠ¤í…œê´€ë¦¬ìž ê¶Œí•œì´ ì—†ëŠ”, ì„œë²„í”„ë¡œì„¸ìŠ¤ì˜ ì†Œìœ ì£¼ê°€ ë  ì¼ë°˜ 사용ìžë¡œ\n" -"ë¡œê·¸ì¸ í•´ì„œ(\"su\" ê°™ì€ ëª…ë ¹ ì´ìš©) 실행하십시오.\n" +"ì‹œìŠ¤í…œê´€ë¦¬ìž ê¶Œí•œì´ ì—†ëŠ”, ì„œë²„í”„ë¡œì„¸ìŠ¤ì˜ ì†Œìœ ì£¼ê°€ ë  ì¼ë°˜ 사용ìžë¡œ ë¡œê·¸ì¸ í•´" +"서(\"su\" ê°™ì€ ëª…ë ¹ ì´ìš©) 실행하십시오." -#: initdb.c:672 +#: initdb.c:852 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "\"%s\" ì¸ì½”ë”©ì€ ì„œë²„ ì¸ì½”딩 ì´ë¦„ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: initdb.c:805 +#: initdb.c:996 #, c-format msgid "file \"%s\" does not exist" msgstr "\"%s\" íŒŒì¼ ì—†ìŒ" -#: initdb.c:807 initdb.c:814 initdb.c:823 +#: initdb.c:997 initdb.c:1002 initdb.c:1009 #, c-format msgid "" -"This might mean you have a corrupted installation or identified\n" -"the wrong directory with the invocation option -L.\n" +"This might mean you have a corrupted installation or identified the wrong " +"directory with the invocation option -L." msgstr "" -"설치가 잘못ë˜ì—ˆê±°ë‚˜ –L 호출 옵션으로 ì‹ë³„한 디렉터리가\n" -"잘못ë˜ì—ˆì„ 수 있습니다.\n" +"설치가 잘못ë˜ì—ˆê±°ë‚˜ -L 호출 옵션으로 지정한 디렉터리가 잘못ë˜ì—ˆì„ 수 있습니" +"다." -#: initdb.c:812 +#: initdb.c:1001 #, c-format msgid "could not access file \"%s\": %m" msgstr "\"%s\" 파ì¼ì— 액세스할 수 ì—†ìŒ: %m" -#: initdb.c:821 +#: initdb.c:1008 #, c-format msgid "file \"%s\" is not a regular file" msgstr "\"%s\" 파ì¼ì€ ì¼ë°˜ 파ì¼ì´ 아님" -#: initdb.c:966 +#: initdb.c:1141 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "사용할 ë™ì  공유 메모리 관리방ì‹ì„ ì„ íƒí•˜ëŠ” 중 ... " -#: initdb.c:975 +#: initdb.c:1150 #, c-format -msgid "selecting default max_connections ... " -msgstr "max_connections ì´ˆê¸°ê°’ì„ ì„ íƒí•˜ëŠ” 중 ..." +msgid "selecting default \"max_connections\" ... " +msgstr "\"max_connections\" ì´ˆê¸°ê°’ì„ ì„ íƒ ì¤‘ ..." -#: initdb.c:1006 +#: initdb.c:1170 #, c-format -msgid "selecting default shared_buffers ... " -msgstr "기본 shared_buffers를 ì„ íƒí•˜ëŠ” 중... " +msgid "selecting default \"shared_buffers\" ... " +msgstr "\"shared_buffers\" ì´ˆê¸°ê°’ì„ ì„ íƒ ì¤‘... " -#: initdb.c:1040 +#: initdb.c:1193 #, c-format msgid "selecting default time zone ... " msgstr "기본 지역 시간대를 ì„ íƒ ì¤‘ ... " -#: initdb.c:1074 +#: initdb.c:1272 msgid "creating configuration files ... " msgstr "환경설정 파ì¼ì„ 만드는 중 ..." -#: initdb.c:1227 initdb.c:1246 initdb.c:1332 initdb.c:1347 +#: initdb.c:1425 initdb.c:1439 initdb.c:1506 initdb.c:1517 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "\"%s\" ì ‘ê·¼ ê¶Œí•œì„ ë°”ê¿€ 수 ì—†ìŒ: %m" -#: initdb.c:1369 +#: initdb.c:1536 #, c-format msgid "running bootstrap script ... " msgstr "부트스트랩 스í¬ë¦½íЏ 실행 중 ... " -#: initdb.c:1381 +#: initdb.c:1548 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "\"%s\" ìž…ë ¥ 파ì¼ì´ PostgreSQL %s ìš©ì´ ì•„ë‹˜" -#: initdb.c:1384 +#: initdb.c:1550 #, c-format -msgid "" -"Check your installation or specify the correct path using the option -L.\n" -msgstr "설치ìƒíƒœë¥¼ 확ì¸í•´ ë³´ê³ , -L 옵션으로 바른 경로를 지정하십시오.\n" +msgid "Specify the correct path using the option -L." +msgstr "-L 옵션으로 바른 경로를 지정하십시오." -#: initdb.c:1482 +#: initdb.c:1652 msgid "Enter new superuser password: " msgstr "새 superuser 암호를 입력하십시오:" -#: initdb.c:1483 +#: initdb.c:1653 msgid "Enter it again: " msgstr "암호 확ì¸:" -#: initdb.c:1486 +#: initdb.c:1656 #, c-format msgid "Passwords didn't match.\n" msgstr "암호가 서로 틀립니다.\n" -#: initdb.c:1512 +#: initdb.c:1680 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "\"%s\" 파ì¼ì—서 암호를 ì½ì„ 수 ì—†ìŒ: %m" -#: initdb.c:1515 +#: initdb.c:1683 #, c-format msgid "password file \"%s\" is empty" msgstr "\"%s\" 패스워드 파ì¼ì´ 비어있ìŒ" -#: initdb.c:2043 +#: initdb.c:2095 #, c-format msgid "caught signal\n" msgstr "ì‹œìŠ¤í…œì˜ ê°„ì„­ 신호(signal) 받았ìŒ\n" -#: initdb.c:2049 +#: initdb.c:2101 #, c-format msgid "could not write to child process: %s\n" msgstr "하위 í”„ë¡œì„¸ìŠ¤ì— ì“¸ 수 ì—†ìŒ: %s\n" -#: initdb.c:2057 +#: initdb.c:2109 #, c-format msgid "ok\n" msgstr "완료\n" -# # search5 ë -# # advance 부분 -#: initdb.c:2147 +#: initdb.c:2191 initdb.c:2237 #, c-format -msgid "setlocale() failed" -msgstr "setlocale() 실패" +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "\"%s\" ë¡œì¼€ì¼ ì´ë¦„ì— ASCII 문ìžê°€ 아닌 ê²ƒì´ ìžˆìŒ" -#: initdb.c:2168 -#, c-format -msgid "failed to restore old locale \"%s\"" -msgstr "\"%s\" 옛 로케ì¼ì„ ë³µì›í•  수 ì—†ìŒ" - -#: initdb.c:2177 +#: initdb.c:2217 #, c-format msgid "invalid locale name \"%s\"" msgstr "\"%s\" ë¡œì¼€ì¼ ì´ë¦„ì´ ìž˜ëª»ë¨" -#: initdb.c:2188 +#: initdb.c:2218 +#, c-format +msgid "If the locale name is specific to ICU, use --icu-locale." +msgstr "ICU ë¡œì¼€ì¼ ì´ë¦„ì„ ì‚¬ìš©í•˜ë ¤ë©´, --icu-locale ì˜µì…˜ì„ ì‚¬ìš©í•˜ì„¸ìš”." + +#: initdb.c:2231 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "ìž˜ëª»ëœ ë¡œì¼€ì¼ ì„¤ì •; LANG ë˜ëŠ” LC_* OS 환경 변수를 확ì¸í•˜ì„¸ìš”" -#: initdb.c:2215 +#: initdb.c:2262 initdb.c:2286 #, c-format msgid "encoding mismatch" msgstr "ì¸ì½”딩 불ì¼ì¹˜" -#: initdb.c:2217 +#: initdb.c:2263 #, c-format msgid "" -"The encoding you selected (%s) and the encoding that the\n" -"selected locale uses (%s) do not match. This would lead to\n" -"misbehavior in various character string processing functions.\n" -"Rerun %s and either do not specify an encoding explicitly,\n" -"or choose a matching combination.\n" +"The encoding you selected (%s) and the encoding that the selected locale " +"uses (%s) do not match. This would lead to misbehavior in various character " +"string processing functions." msgstr "" -"ì„ íƒí•œ ì¸ì½”딩(%s)ê³¼ ì„ íƒí•œ 로케ì¼ì—서 사용하는\n" -"ì¸ì½”딩(%s)ì´ ì¼ì¹˜í•˜ì§€ 않습니다. ì´ë¡œ ì¸í•´\n" -"여러 문ìžì—´ 처리 í•¨ìˆ˜ì— ì˜¤ìž‘ë™ì´ ë°œìƒí•  수 있습니다.\n" -"%sì„(를) 다시 실행하고 ì¸ì½”ë”©ì„ ëª…ì‹œì ìœ¼ë¡œ 지정하지 않거나\n" -"ì¼ì¹˜í•˜ëŠ” ì¡°í•©ì„ ì„ íƒí•˜ì‹­ì‹œì˜¤.\n" +"ì„ íƒí•œ ì¸ì½”딩(%s)ê³¼ ì„ íƒí•œ 로케ì¼ì—서 사용하는 ì¸ì½”딩(%s)ì´ ì¼ì¹˜í•˜ì§€ 않습니" +"다. ì´ë¡œ ì¸í•´ 여러 문ìžì—´ 처리 í•¨ìˆ˜ì— ì˜¤ìž‘ë™ì´ ë°œìƒí•  수 있습니다." + +#: initdb.c:2268 initdb.c:2289 +#, c-format +msgid "" +"Rerun %s and either do not specify an encoding explicitly, or choose a " +"matching combination." +msgstr "" +"암묵ì ìœ¼ë¡œ ì§€ì •ëœ ì¸ì½”ë”©ì´ ë§ˆìŒì— 들지 않으면 지정할 수 있는 ì¸ì½”ë”©ì„ ì§€ì •í•´" +"서 %s ìž‘ì—…ì„ ë‹¤ì‹œ 하세요." + +#: initdb.c:2287 +#, c-format +msgid "The encoding you selected (%s) is not supported with the ICU provider." +msgstr "지정한 %s ì¸ì½”ë”©ì„ ICU 제공ìžê°€ ì§€ì›í•˜ì§€ 않습니다." + +#: initdb.c:2338 +#, c-format +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "\"%s\" ë¡œì¼€ì¼ ì´ë¦„ì„ ë¡œì¼€ì¼ íƒœê·¸ë¡œ 바꿀 수 ì—†ìŒ: %s" + +#: initdb.c:2344 initdb.c:2396 initdb.c:2488 +#, c-format +msgid "ICU is not supported in this build" +msgstr "ICU ì§€ì› ê¸°ëŠ¥ì„ ëº€ 채로 서버가 만들어졌습니다." + +#: initdb.c:2367 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "\"%s\" 로케ì¼ì—서 언어를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" + +#: initdb.c:2393 +#, c-format +msgid "locale \"%s\" has unknown language \"%s\"" +msgstr "\"%s\" 로케ì¼ì€ \"%s\" ë¼ëŠ” 알 수 없는 언어를 사용함" + +#: initdb.c:2454 +#, c-format +msgid "locale must be specified if provider is %s" +msgstr "제공ìžê°€ %s ì¸ê²½ìš° 로케ì¼ì„ 지정해야 함" -#: initdb.c:2289 +#: initdb.c:2465 +#, c-format +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "내장 제공ìžìš© \"%s\" ë¡œì¼€ì¼ ì´ë¦„ì´ ìž˜ëª»ë¨" + +#: initdb.c:2476 +#, c-format +msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" +msgstr "\"%s\" ë¡œì¼€ì¼ íƒœê·¸ë¥¼ 사용함, 해당 ICU 로케ì¼: \"%s\"\n" + +#: initdb.c:2499 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -469,17 +572,17 @@ msgstr "" "%s PostgreSQL ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ë¥¼ 초기화 하는 프로그램.\n" "\n" -#: initdb.c:2290 +#: initdb.c:2500 #, c-format msgid "Usage:\n" msgstr "사용법:\n" -#: initdb.c:2291 +#: initdb.c:2501 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [옵션]... [DATADIR]\n" -#: initdb.c:2292 +#: initdb.c:2502 #, c-format msgid "" "\n" @@ -488,50 +591,69 @@ msgstr "" "\n" "옵션들:\n" -#: initdb.c:2293 +#: initdb.c:2503 #, c-format msgid "" " -A, --auth=METHOD default authentication method for local " "connections\n" msgstr " -A, --auth=METHOD 로컬 ì—°ê²°ì˜ ê¸°ë³¸ ì¸ì¦ 방법\n" -#: initdb.c:2294 +#: initdb.c:2504 #, c-format msgid "" " --auth-host=METHOD default authentication method for local TCP/IP " "connections\n" msgstr " --auth-host=METHOD local TCP/IP ì—°ê²°ì— ëŒ€í•œ 기본 ì¸ì¦ 방법\n" -#: initdb.c:2295 +#: initdb.c:2505 #, c-format msgid "" " --auth-local=METHOD default authentication method for local-socket " "connections\n" msgstr " --auth-local=METHOD local-socket ì—°ê²°ì— ëŒ€í•œ 기본 ì¸ì¦ 방법\n" -#: initdb.c:2296 +#: initdb.c:2506 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATADIR 새 ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ë¥¼ 만들 디렉터리\n" -#: initdb.c:2297 +#: initdb.c:2507 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=ENCODING 새 ë°ì´í„°ë² ì´ìŠ¤ì˜ ê¸°ë³¸ ì¸ì½”딩\n" -#: initdb.c:2298 +#: initdb.c:2508 #, c-format msgid "" " -g, --allow-group-access allow group read/execute on data directory\n" msgstr "" " -g, --allow-group-access ë°ì´í„° 디렉터리를 ê·¸ë£¹ì´ ì½ê³  접근할 있게 함\n" -#: initdb.c:2299 +#: initdb.c:2509 +#, c-format +msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" +msgstr " --icu-locale=LOCALE 새 ë°ì´í„°ë² ì´ìŠ¤ì˜ ICU ë¡œì¼€ì¼ ID 지정\n" + +#: initdb.c:2510 +#, c-format +msgid "" +" --icu-rules=RULES set additional ICU collation rules for new " +"databases\n" +msgstr "" +" --icu-rules=RULES 새 ë°ì´í„°ë² ì´ìŠ¤ì˜ ì¶”ê°€ ICU 문ìžì—´ ì •ë ¬ ê·œì¹™ì„ ì§€" +"ì •\n" + +#: initdb.c:2511 +#, c-format +msgid " -k, --data-checksums use data page checksums\n" +msgstr " -k, --data-checksums ìžë£Œ 페ì´ì§€ ì²´í¬ì„¬ 사용\n" + +#: initdb.c:2512 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE 새 ë°ì´í„°ë² ì´ìŠ¤ì˜ ê¸°ë³¸ ë¡œì¼€ì¼ ì„¤ì •\n" -#: initdb.c:2300 +#: initdb.c:2513 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -545,18 +667,36 @@ msgstr "" " 새 ë°ì´í„°ë² ì´ìŠ¤ì˜ ê° ë²”ì£¼ì— ê¸°ë³¸ ë¡œì¼€ì¼ ì„¤ì •\n" " (환경ì—서 가져온 기본 ê°’)\n" -#: initdb.c:2304 +#: initdb.c:2517 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale -locale=C와 ê°™ìŒ\n" -#: initdb.c:2305 +#: initdb.c:2518 +#, c-format +msgid "" +" --builtin-locale=LOCALE\n" +" set builtin locale name for new databases\n" +msgstr "" +" --builtin-locale=LOCALE\n" +" 새 ë°ì´í„°ë² ì´ìŠ¤ìš© 내장 ë¡œì¼€ì¼ ì´ë¦„ 지정\n" + +#: initdb.c:2520 +#, c-format +msgid "" +" --locale-provider={builtin|libc|icu}\n" +" set default locale provider for new databases\n" +msgstr "" +" --locale-provider={builtin|libc|icu}\n" +" 새 ë°ì´í„°ë² ì´ìŠ¤ì˜ ë¡œì¼€ì¼ ì œê³µìž ì§€ì •\n" + +#: initdb.c:2522 #, c-format msgid "" " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=FILE 파ì¼ì—서 새 superuserì˜ ì•”í˜¸ ì½ê¸°\n" -#: initdb.c:2306 +#: initdb.c:2523 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -565,29 +705,29 @@ msgstr "" " -T, --text-search-config=CFG\n" " 기본 í…스트 검색 구성\n" -#: initdb.c:2308 +#: initdb.c:2525 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NAME ë°ì´í„°ë² ì´ìФ superuser ì´ë¦„\n" -#: initdb.c:2309 +#: initdb.c:2526 #, c-format msgid "" " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt 새 superuser 암호를 ìž…ë ¥ ë°›ìŒ\n" -#: initdb.c:2310 +#: initdb.c:2527 #, c-format msgid "" " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR 트랜잭션 로그 디렉터리 위치\n" -#: initdb.c:2311 +#: initdb.c:2528 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=SIZE WAL ì¡°ê° íŒŒì¼ í¬ê¸°, MB단위\n" -#: initdb.c:2312 +#: initdb.c:2529 #, c-format msgid "" "\n" @@ -596,27 +736,33 @@ msgstr "" "\n" "ëœ ì¼ë°˜ì ìœ¼ë¡œ 사용ë˜ëŠ” 옵션들:\n" -#: initdb.c:2313 +#: initdb.c:2530 +#, c-format +msgid "" +" -c, --set NAME=VALUE override default setting for server parameter\n" +msgstr " -c, --set NAME=VALUE 서버 매개 변수 기본 ì„¤ì •ì„ ë°”ê¿ˆ\n" + +#: initdb.c:2531 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug ë””ë²„ê¹…ì— í•„ìš”í•œ ì •ë³´ë“¤ë„ í•¨ê»˜ 출력함\n" -#: initdb.c:2314 +#: initdb.c:2532 #, c-format -msgid " -k, --data-checksums use data page checksums\n" -msgstr " -k, --data-checksums ìžë£Œ 페ì´ì§€ ì²´í¬ì„¬ 사용\n" +msgid " --discard-caches set debug_discard_caches=1\n" +msgstr " --discard-caches debug_discard_caches=1 지정\n" -#: initdb.c:2315 +#: initdb.c:2533 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORY 입력파ì¼ë“¤ì´ 있는 디렉터리\n" -#: initdb.c:2316 +#: initdb.c:2534 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean 오류가 ë°œìƒë˜ì—ˆì„ 경우 그대로 ë‘ \n" -#: initdb.c:2317 +#: initdb.c:2535 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written safely to " @@ -624,17 +770,28 @@ msgid "" msgstr "" " -N, --no-sync 작업 완료 ë’¤ ë””ìŠ¤í¬ ë™ê¸°í™” ìž‘ì—…ì„ í•˜ì§€ 않ìŒ\n" -#: initdb.c:2318 +#: initdb.c:2536 #, c-format -msgid " -s, --show show internal settings\n" -msgstr " -s, --show ë‚´ë¶€ ì„¤ì •ê°’ë“¤ì„ ë³´ì—¬ì¤Œ\n" +msgid " --no-instructions do not print instructions for next steps\n" +msgstr " --no-instructions ë‹¤ìŒ ìž‘ì—…ì„ ìœ„í•´ 구성 정보를 출력 안함\n" -#: initdb.c:2319 +#: initdb.c:2537 #, c-format -msgid " -S, --sync-only only sync data directory\n" -msgstr " -S, --sync-only ë°ì´í„° 디렉터리만 ë™ê¸°í™”\n" +msgid " -s, --show show internal settings, then exit\n" +msgstr " -s, --show ë‚´ë¶€ ì„¤ì •ê°’ë“¤ì„ ë³´ì—¬ì£¼ê³  마침\n" -#: initdb.c:2320 +#: initdb.c:2538 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD 파ì¼ì„ 디스í¬ì— ë™ê¸°í™” 하는 방법 지정\n" + +#: initdb.c:2539 +#, c-format +msgid "" +" -S, --sync-only only sync database files to disk, then exit\n" +msgstr " -S, --sync-only ë°ì´í„° 디렉터리만 ë™ê¸°í™”하고 마침\n" + +#: initdb.c:2540 #, c-format msgid "" "\n" @@ -643,17 +800,17 @@ msgstr "" "\n" "기타 옵션:\n" -#: initdb.c:2321 +#: initdb.c:2541 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: initdb.c:2322 +#: initdb.c:2542 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: initdb.c:2323 +#: initdb.c:2543 #, c-format msgid "" "\n" @@ -663,7 +820,7 @@ msgstr "" "\n" "ë°ì´í„° 디렉터리를 지정하지 않으면, PGDATA 환경 ë³€ìˆ˜ê°’ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.\n" -#: initdb.c:2325 +#: initdb.c:2545 #, c-format msgid "" "\n" @@ -672,104 +829,117 @@ msgstr "" "\n" "ë¬¸ì œì  ë³´ê³  주소: <%s>\n" -#: initdb.c:2326 +#: initdb.c:2546 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페ì´ì§€: <%s>\n" -#: initdb.c:2354 +#: initdb.c:2570 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "\"%s\" ì¸ì¦ ë°©ë²•ì€ \"%s\" ì—°ê²°ì—서는 사용할 수 ì—†ìŒ" -#: initdb.c:2370 +#: initdb.c:2584 #, c-format -msgid "must specify a password for the superuser to enable %s authentication" -msgstr "%s ì¸ì¦ë°©ì‹ì„ 사용하려면, 반드시 superuserì˜ ì•”í˜¸ë¥¼ 지정해야함" +msgid "" +"must specify a password for the superuser to enable password authentication" +msgstr "비밀번호 ì¸ì¦ë°©ì‹ì„ 사용하려면, 반드시 superuserì˜ ì•”í˜¸ë¥¼ 지정해야함" -#: initdb.c:2397 +#: initdb.c:2603 #, c-format msgid "no data directory specified" msgstr "ë°ì´í„° 디렉터리를 지정하지 않았ìŒ" -#: initdb.c:2399 +#: initdb.c:2604 #, c-format msgid "" -"You must identify the directory where the data for this database system\n" -"will reside. Do this with either the invocation option -D or the\n" -"environment variable PGDATA.\n" +"You must identify the directory where the data for this database system will " +"reside. Do this with either the invocation option -D or the environment " +"variable PGDATA." msgstr "" -"ì´ ìž‘ì—…ì„ ì§„í–‰í•˜ë ¤ë©´, 반드시 ì´ ë°ì´í„° 디렉터리를 지정해 주어야합니다.\n" -"지정하는 ë°©ë²•ì€ -D ì˜µì…˜ì˜ ê°’ì´ë‚˜, PGDATA 환경 변수값으로 지정해 주면 ë©ë‹ˆ" -"다.\n" +"ì´ ìž‘ì—…ì„ ì§„í–‰í•˜ë ¤ë©´, 반드시 ì´ ë°ì´í„° 디렉터리를 지정해 주어야합니다. 지정하" +"는 ë°©ë²•ì€ -D ì˜µì…˜ì˜ ê°’ì´ë‚˜, PGDATA 환경 변수값으로 지정해 주면 ë©ë‹ˆ 다." + +#: initdb.c:2621 +#, c-format +msgid "could not set environment" +msgstr "환경 변수를 지정할 수 ì—†ìŒ" -#: initdb.c:2434 +#: initdb.c:2639 #, c-format msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." +"program \"%s\" is needed by %s but was not found in the same directory as " +"\"%s\"" msgstr "" -"\"%s\" í”„ë¡œê·¸ëž¨ì´ %s 작업ì—서 필요합니다. 그런ë°, ì´ íŒŒì¼ì´\n" -"\"%s\" 파ì¼ì´ 있는 ë””ë ‰í„°ë¦¬ì•ˆì— ì—†ìŠµë‹ˆë‹¤.\n" -"설치 ìƒíƒœë¥¼ 확ì¸í•´ 주십시오." +"\"%s\" í”„ë¡œê·¸ëž¨ì´ %s 작업ì—서 필요합니다. 그런ë°, ì´ íŒŒì¼ì´ \"%s\" 파ì¼ì´ 있" +"는 ë””ë ‰í„°ë¦¬ì•ˆì— ì—†ìŠµë‹ˆë‹¤." -#: initdb.c:2439 +#: initdb.c:2642 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "" -"\"%s\" í”„ë¡œê·¸ëž¨ì„ \"%s\" 작업 ë•Œë¬¸ì— ì°¾ì•˜ì§€ë§Œ ì´ íŒŒì¼ì€\n" -"%s í”„ë¡œê·¸ëž¨ì˜ ë²„ì „ê³¼ 다릅니다.\n" -"설치 ìƒíƒœë¥¼ 확ì¸í•´ 주십시오." +"\"%s\" í”„ë¡œê·¸ëž¨ì„ \"%s\" 작업 ë•Œë¬¸ì— ì°¾ì•˜ì§€ë§Œ ì´ íŒŒì¼ì€ %s í”„ë¡œê·¸ëž¨ì˜ ë²„ì „ê³¼ " +"다릅니다." -#: initdb.c:2458 +#: initdb.c:2657 #, c-format msgid "input file location must be an absolute path" msgstr "ìž…ë ¥ íŒŒì¼ ìœ„ì¹˜ëŠ” 반드시 절대경로여야함" -#: initdb.c:2475 +#: initdb.c:2674 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” \"%s\" 로케ì¼ìœ¼ë¡œ ì´ˆê¸°í™”ë  ê²ƒìž…ë‹ˆë‹¤.\n" -#: initdb.c:2478 +#: initdb.c:2677 +#, c-format +msgid "" +"The database cluster will be initialized with this locale configuration:\n" +msgstr "ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” 아래 ë¡œì¼€ì¼ í™˜ê²½ìœ¼ë¡œ ì´ˆê¸°í™”ë  ê²ƒìž…ë‹ˆë‹¤:\n" + +#: initdb.c:2678 +#, c-format +msgid " locale provider: %s\n" +msgstr " ë¡œì¼€ì¼ ì œê³µìž: %s\n" + +#: initdb.c:2680 +#, c-format +msgid " default collation: %s\n" +msgstr " 기본 문ìžì •ë ¬: %s\n" + +#: initdb.c:2681 #, c-format msgid "" -"The database cluster will be initialized with locales\n" -" COLLATE: %s\n" -" CTYPE: %s\n" -" MESSAGES: %s\n" -" MONETARY: %s\n" -" NUMERIC: %s\n" -" TIME: %s\n" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" msgstr "" -"ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” ë‹¤ìŒ ë¡œì¼€ì¼ìœ¼ë¡œ ì´ˆê¸°í™”ë  ê²ƒìž…ë‹ˆë‹¤.\n" -" COLLATE: %s\n" -" CTYPE: %s\n" -" MESSAGES: %s\n" -" MONETARY: %s\n" -" NUMERIC: %s\n" -" TIME: %s\n" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" -#: initdb.c:2502 +#: initdb.c:2711 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "\"%s\" 로케ì¼ì— ì•Œë§žì€ ì¸ì½”ë”©ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: initdb.c:2504 +#: initdb.c:2713 #, c-format -msgid "Rerun %s with the -E option.\n" -msgstr "-E 옵션으로 %s 지정해 주십시오.\n" +msgid "Rerun %s with the -E option." +msgstr "-E 옵션 지정해서 %s ìž‘ì—…ì„ ë‹¤ì‹œ 하세요." -#: initdb.c:2505 initdb.c:3127 initdb.c:3148 +#: initdb.c:2714 initdb.c:3257 initdb.c:3377 initdb.c:3397 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "보다 ìžì„¸í•œ 정보를 보려면 \"%s --help\" ì˜µì…˜ì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤.\n" +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." -#: initdb.c:2518 +#: initdb.c:2726 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -778,180 +948,189 @@ msgstr "" "\"%s\" ì¸ì½”ë”©ì„ ì„œë²„ì¸¡ ì¸ì½”딩으로 사용할 수 없습니다.\n" "기본 ë°ì´í„°ë² ì´ìŠ¤ëŠ” \"%s\" ì¸ì½”딩으로 지정ë©ë‹ˆë‹¤.\n" -#: initdb.c:2523 +#: initdb.c:2731 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "\"%s\" 로케ì¼ì€ ì§€ì›í•˜ì§€ 않는 \"%s\" ì¸ì½”ë”©ì„ í•„ìš”ë¡œ 함" -#: initdb.c:2526 +#: initdb.c:2733 #, c-format -msgid "" -"Encoding \"%s\" is not allowed as a server-side encoding.\n" -"Rerun %s with a different locale selection.\n" -msgstr "" -"\"%s\" ì¸ì½”ë”©ì„ ì„œë²„ì¸¡ ì¸ì½”딩으로 사용할 수 없습니다.\n" -"다른 로케ì¼ì„ ì„ íƒí•˜ê³  %sì„(를) 다시 실행하십시오.\n" +msgid "Encoding \"%s\" is not allowed as a server-side encoding." +msgstr "\"%s\" ì¸ì½”ë”©ì„ ì„œë²„ì¸¡ ì¸ì½”딩으로 사용할 수 없습니다." -#: initdb.c:2535 +#: initdb.c:2735 +#, c-format +msgid "Rerun %s with a different locale selection." +msgstr "다른 로케ì¼ì„ 지정해서 %s ìž‘ì—…ì„ ë‹¤ì‹œ 하세요." + +#: initdb.c:2743 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "기본 ë°ì´í„°ë² ì´ìФ ì¸ì½”ë”©ì€ \"%s\" ì¸ì½”딩으로 설정ë˜ì—ˆìŠµë‹ˆë‹¤.\n" -#: initdb.c:2597 +#: initdb.c:2757 +#, c-format +msgid "builtin provider locale \"%s\" requires encoding \"%s\"" +msgstr "\"%s\" 내장 ì œê³µìž ë¡œì¼€ì¼ì€ \"%s\" ì¸ì½”ë”©ì„ í•„ìš”ë¡œ 함" + +#: initdb.c:2819 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "\"%s\" 로케ì¼ì— ì•Œë§žì€ ì „ë¬¸ê²€ìƒ‰ ì„¤ì •ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: initdb.c:2608 +#: initdb.c:2830 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "\"%s\" 로케ì¼ì— ì•Œë§žì€ ì „ë¬¸ê²€ìƒ‰ ì„¤ì •ì„ ì•Œ 수 ì—†ìŒ" -#: initdb.c:2613 +#: initdb.c:2835 #, c-format msgid "" "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "지정한 \"%s\" 전문검색 ì„¤ì •ì€ \"%s\" 로케ì¼ê³¼ ì¼ì¹˜í•˜ì§€ 않ìŒ" -#: initdb.c:2618 +#: initdb.c:2840 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "기본 í…스트 검색 êµ¬ì„±ì´ \"%s\"(으)로 설정ë©ë‹ˆë‹¤.\n" -#: initdb.c:2662 initdb.c:2744 +#: initdb.c:2883 initdb.c:2954 #, c-format msgid "creating directory %s ... " msgstr "%s 디렉터리 만드는 중 ..." -#: initdb.c:2668 initdb.c:2750 initdb.c:2815 initdb.c:2877 +#: initdb.c:2888 initdb.c:2959 initdb.c:3007 initdb.c:3064 #, c-format msgid "could not create directory \"%s\": %m" msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m" -#: initdb.c:2679 initdb.c:2762 +#: initdb.c:2897 initdb.c:2969 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "ì´ë¯¸ 있는 %s ë””ë ‰í„°ë¦¬ì˜ ì•¡ì„¸ìŠ¤ ê¶Œí•œì„ ê³ ì¹˜ëŠ” 중 ..." -#: initdb.c:2685 initdb.c:2768 +#: initdb.c:2902 initdb.c:2974 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "\"%s\" ë””ë ‰í„°ë¦¬ì˜ ì•¡ì„¸ìŠ¤ ê¶Œí•œì„ ë°”ê¿€ 수 없습니다: %m" -#: initdb.c:2699 initdb.c:2782 +#: initdb.c:2914 initdb.c:2986 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "\"%s\" 디렉터리가 있지만 비어 있지 않ìŒ" -#: initdb.c:2704 +#: initdb.c:2918 #, c-format msgid "" -"If you want to create a new database system, either remove or empty\n" -"the directory \"%s\" or run %s\n" -"with an argument other than \"%s\".\n" +"If you want to create a new database system, either remove or empty the " +"directory \"%s\" or run %s with an argument other than \"%s\"." msgstr "" -"새로운 ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì„ ë§Œë“¤ë ¤ë©´\n" -"\"%s\" 디렉터리를 제거하거나 비우십시오. ë˜ëŠ” %sì„(를)\n" -"\"%s\" ì´ì™¸ì˜ ì¸ìˆ˜ë¥¼ 사용하여 실행하십시오.\n" +"새로운 ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì„ ë§Œë“¤ë ¤ë©´ \"%s\" 디렉터리를 제거하거나 비우십시" +"오. ë˜ëŠ” %s ìž‘ì—…ì„ \"%s\" 디렉터리가 아닌 것으로 지정해서 하세요." -#: initdb.c:2712 initdb.c:2794 initdb.c:3163 +#: initdb.c:2926 initdb.c:2996 initdb.c:3422 #, c-format msgid "could not access directory \"%s\": %m" msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m" -#: initdb.c:2735 +#: initdb.c:2947 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL 디렉터리 위치는 절대 경로여야 함" -#: initdb.c:2787 +#: initdb.c:2990 #, c-format msgid "" -"If you want to store the WAL there, either remove or empty the directory\n" -"\"%s\".\n" +"If you want to store the WAL there, either remove or empty the directory " +"\"%s\"." msgstr "" -"트랜잭션 로그를 해당 ìœ„ì¹˜ì— ì €ìž¥í•˜ë ¤ë©´\n" -"\"%s\" 디렉터리를 제거하거나 비우십시오.\n" +"트랜잭션 로그를 해당 ìœ„ì¹˜ì— ì €ìž¥í•˜ë ¤ë©´ \"%s\" 디렉터리를 제거하거나 비우십시" +"오." -#: initdb.c:2801 +#: initdb.c:3000 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "\"%s\" 심벌릭 ë§í¬ë¥¼ 만들 수 ì—†ìŒ: %m" -#: initdb.c:2806 -#, c-format -msgid "symlinks are not supported on this platform" -msgstr "ì´ í”Œëž«í¼ì—서는 심볼 ë§í¬ê°€ ì§€ì›ë˜ì§€ 않ìŒ" - -#: initdb.c:2830 +#: initdb.c:3019 #, c-format msgid "" "It contains a dot-prefixed/invisible file, perhaps due to it being a mount " -"point.\n" +"point." msgstr "" "ì (.)으로 시작하는 ìˆ¨ì€ íŒŒì¼ì´ í¬í•¨ë˜ì–´ 있습니다. 마운트 최ìƒìœ„ 디렉터리 같습" -"니다.\n" +"니다." -#: initdb.c:2833 +#: initdb.c:3021 #, c-format msgid "" -"It contains a lost+found directory, perhaps due to it being a mount point.\n" -msgstr "lost-found 디렉터리가 있습니다. 마운트 최ìƒìœ„ 디렉터리 같습니다.\n" +"It contains a lost+found directory, perhaps due to it being a mount point." +msgstr "lost-found 디렉터리가 있습니다. 마운트 최ìƒìœ„ 디렉터리 같습니다." -#: initdb.c:2836 +#: initdb.c:3023 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" -"Create a subdirectory under the mount point.\n" +"Create a subdirectory under the mount point." msgstr "" "마운트 최ìƒìœ„ 디렉터리를 ë°ì´í„° 디렉터리로 사용하는 ê²ƒì€ ê¶Œìž¥í•˜ì§€ 않습니다.\n" -"하위 디렉터리를 만들어서 ê·¸ê²ƒì„ ë°ì´í„° 디렉터리로 사용하세요.\n" +"하위 디렉터리를 만들어서 ê·¸ê²ƒì„ ë°ì´í„° 디렉터리로 사용하세요." -#: initdb.c:2862 +#: initdb.c:3050 #, c-format msgid "creating subdirectories ... " msgstr "하위 디렉터리 만드는 중 ..." -#: initdb.c:2908 +#: initdb.c:3093 msgid "performing post-bootstrap initialization ... " msgstr "부트스트랩 ë‹¤ìŒ ì´ˆê¸°í™” 작업 중 ... " -#: initdb.c:3065 +#: initdb.c:3256 +#, c-format +msgid "-c %s requires a value" +msgstr "-c %s ì„¤ì •ì€ ê°’ì„ í•„ìš”ë¡œ 합니다." + +#: initdb.c:3281 #, c-format msgid "Running in debug mode.\n" msgstr "디버그 모드로 실행 중.\n" -#: initdb.c:3069 +#: initdb.c:3285 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "지저분 모드로 실행 중. 오류가 ë°œìƒë˜ì–´ë„ 뒷정리를 안합니다.\n" -#: initdb.c:3146 +#: initdb.c:3358 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "알 수 없는 ë¡œì¼€ì¼ ì œê³µìž ì´ë¦„: %s" + +#: initdb.c:3395 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")" -#: initdb.c:3167 initdb.c:3256 +#: initdb.c:3402 initdb.c:3406 initdb.c:3410 +#, c-format +msgid "%s cannot be specified unless locale provider \"%s\" is chosen" +msgstr "%s ì˜µì…˜ì€ \"%s\" ë¡œì¼€ì¼ ì œê³µìžë¥¼ 사용할 때만 사용할 수 있습니다." + +#: initdb.c:3424 initdb.c:3487 msgid "syncing data to disk ... " msgstr "ìžë£Œë¥¼ 디스í¬ì— ë™ê¸°í™” 하는 중 ... " -#: initdb.c:3176 +#: initdb.c:3432 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "" "암호를 입력받는 옵션과 암호를 파ì¼ì—서 가져오는 ì˜µì…˜ì€ ë™ì‹œì— ì‚¬ìš©ë  ìˆ˜ ì—†ìŒ" -#: initdb.c:3201 -#, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "--wal-segsize 옵션 ê°’ì€ ìˆ«ìžì—¬ì•¼ 함" - -#: initdb.c:3206 +#: initdb.c:3443 #, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "--wal-segsize ì˜µì…˜ê°’ì€ 1ì—서 1024ì‚¬ì´ 2^n ê°’ì´ì—¬ì•¼ 함" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "%s ì˜µì…˜ê°’ì€ 1ì—서 1024ì‚¬ì´ 2^n ê°’ì´ì—¬ì•¼ 함" -#: initdb.c:3223 +#: initdb.c:3456 #, c-format msgid "" "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" @@ -959,7 +1138,7 @@ msgstr "" "\"%s\" 사용ìžëŠ” 슈í¼ìœ ì € ì´ë¦„으로 쓸 수 없습니다. \"pg_\"로 시작하는롤 ì´ë¦„" "ì€ í—ˆìš©í•˜ì§€ 않ìŒ" -#: initdb.c:3227 +#: initdb.c:3458 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -970,17 +1149,17 @@ msgstr "" "ì§€ì •ë  ê²ƒìž…ë‹ˆë‹¤. ë˜í•œ ì´ ì‚¬ìš©ìžëŠ” 서버 í”„ë¡œì„¸ìŠ¤ì˜ ì†Œìœ ì£¼ê°€ ë©ë‹ˆë‹¤.\n" "\n" -#: initdb.c:3243 +#: initdb.c:3474 #, c-format msgid "Data page checksums are enabled.\n" msgstr "ìžë£Œ 페ì´ì§€ ì²´í¬ì„¬ 기능 사용함.\n" -#: initdb.c:3245 +#: initdb.c:3476 #, c-format msgid "Data page checksums are disabled.\n" msgstr "ìžë£Œ 페ì´ì§€ ì²´í¬ì„¬ 기능 사용 하지 않ìŒ\n" -#: initdb.c:3262 +#: initdb.c:3493 #, c-format msgid "" "\n" @@ -992,27 +1171,27 @@ msgstr "" "ì´ ìƒíƒœì—서 OSê°€ ê°‘ìžê¸° 중지 ë˜ë©´ ë°ì´í„° 디렉토리 ì•ˆì— ìžˆëŠ” ìžë£Œê°€ 깨질 수 있" "습니다.\n" -#: initdb.c:3267 +#: initdb.c:3498 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "로컬 ì ‘ì†ìš© \"trust\" ì¸ì¦ì„ 설정 함" -#: initdb.c:3268 +#: initdb.c:3499 #, c-format msgid "" -"You can change this by editing pg_hba.conf or using the option -A, or\n" -"--auth-local and --auth-host, the next time you run initdb.\n" +"You can change this by editing pg_hba.conf or using the option -A, or --auth-" +"local and --auth-host, the next time you run initdb." msgstr "" -"ì´ ê°’ì„ ë°”ê¾¸ë ¤ë©´, pg_hba.conf 파ì¼ì„ 수정하든지,\n" -"다ìŒë²ˆ initdb ëª…ë ¹ì„ ì‚¬ìš©í•  때, -A 옵션 ë˜ëŠ” --auth-local,\n" -"--auth-host ì˜µì…˜ì„ ì‚¬ìš©í•´ì„œ ì¸ì¦ ë°©ë²•ì„ ì§€ì •í•  수 있습니다.\n" +"ì´ ê°’ì„ ë°”ê¾¸ë ¤ë©´, pg_hba.conf 파ì¼ì„ 수정하든지, 다ìŒë²ˆ initdb ëª…ë ¹ì„ ì‚¬ìš©í•  " +"때, -A 옵션 ë˜ëŠ” --auth-local, --auth-host ì˜µì…˜ì„ ì‚¬ìš©í•´ì„œ initdb ìž‘ì—…ì„ í•˜ì„¸" +"ìš”." #. translator: This is a placeholder in a shell command. -#: initdb.c:3293 +#: initdb.c:3529 msgid "logfile" msgstr "로그파ì¼" -#: initdb.c:3295 +#: initdb.c:3531 #, c-format msgid "" "\n" @@ -1026,3 +1205,23 @@ msgstr "" "\n" " %s\n" "\n" + +#, c-format +#~ msgid " ICU locale: %s\n" +#~ msgstr " ICU 로케ì¼: %s\n" + +#, c-format +#~ msgid "argument of --wal-segsize must be a number" +#~ msgstr "--wal-segsize 옵션 ê°’ì€ ìˆ«ìžì—¬ì•¼ 함" + +#, c-format +#~ msgid "Using default ICU locale \"%s\".\n" +#~ msgstr "기본 ICU 로케ì¼ë¡œ \"%s\" 사용함.\n" + +#, c-format +#~ msgid "could not determine default ICU locale" +#~ msgstr "기본 ICU 로케ì¼ì„ ê²°ì •í•  수 ì—†ìŒ" + +#, c-format +#~ msgid "could not open collator for default locale: %s" +#~ msgstr "기본 로케ì¼ìš© 문ìžì—´ ì •ë ¬ ê·œì¹™ì„ ì—´ 수 ì—†ìŒ: %s" diff --git a/src/bin/initdb/po/meson.build b/src/bin/initdb/po/meson.build index ad193984175b9..23d43d64baf1e 100644 --- a/src/bin/initdb/po/meson.build +++ b/src/bin/initdb/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('initdb-' + pg_version_major.to_string())] diff --git a/src/bin/initdb/po/pt_BR.po b/src/bin/initdb/po/pt_BR.po index acb4cbb1dffb7..8911b29572209 100644 --- a/src/bin/initdb/po/pt_BR.po +++ b/src/bin/initdb/po/pt_BR.po @@ -1,16 +1,16 @@ # Brazilian Portuguese message translation file for initdb # -# Copyright (C) 2003-2022 PostgreSQL Global Development Group +# Copyright (C) 2003-2023 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # -# Euler Taveira , 2003-2022. +# Euler Taveira , 2003-2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-27 13:15-0300\n" -"PO-Revision-Date: 2010-09-25 00:45-0300\n" +"POT-Creation-Date: 2024-01-02 12:54-0300\n" +"PO-Revision-Date: 2024-07-02 00:07+0200\n" "Last-Translator: Euler Taveira \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" @@ -38,85 +38,77 @@ msgstr "detalhe: " msgid "hint: " msgstr "dica: " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:172 #, c-format -msgid "could not identify current directory: %m" -msgstr "não pôde identificar diretório atual: %m" +msgid "invalid binary \"%s\": %m" +msgstr "binário \"%s\" é inválido: %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:215 #, c-format -msgid "invalid binary \"%s\"" -msgstr "binário \"%s\" é inválido" +msgid "could not read binary \"%s\": %m" +msgstr "não pôde ler o binário \"%s\": %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "não pôde ler o binário \"%s\"" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:223 #, c-format msgid "could not find a \"%s\" to execute" msgstr "não pôde encontrar o \"%s\" para executá-lo" -#: ../../common/exec.c:282 ../../common/exec.c:321 -#, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "não pôde mudar diretório para \"%s\": %m" - -#: ../../common/exec.c:299 +#: ../../common/exec.c:250 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "não pôde ler link simbólico \"%s\": %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "não pôde resolver caminho \"%s\" para forma absoluta: %m" -#: ../../common/exec.c:422 +#: ../../common/exec.c:412 #, c-format msgid "%s() failed: %m" msgstr "%s() falhou: %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: initdb.c:334 +#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: initdb.c:349 #, c-format msgid "out of memory" msgstr "sem memória" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "sem memória\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "não pode duplicar ponteiro nulo (erro interno)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 +#: ../../common/file_utils.c:87 ../../common/file_utils.c:447 #, c-format msgid "could not stat file \"%s\": %m" msgstr "não pôde executar stat no arquivo \"%s\": %m" -#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48 +#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48 +#: ../../common/rmtree.c:63 #, c-format msgid "could not open directory \"%s\": %m" msgstr "não pôde abrir diretório \"%s\": %m" -#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69 +#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69 +#: ../../common/rmtree.c:104 #, c-format msgid "could not read directory \"%s\": %m" msgstr "não pôde ler diretório \"%s\": %m" -#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 -#: ../../common/file_utils.c:365 +#: ../../common/file_utils.c:228 ../../common/file_utils.c:287 +#: ../../common/file_utils.c:361 #, c-format msgid "could not open file \"%s\": %m" msgstr "não pôde abrir arquivo \"%s\": %m" -#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 +#: ../../common/file_utils.c:299 ../../common/file_utils.c:369 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "não pôde executar fsync no arquivo \"%s\": %m" -#: ../../common/file_utils.c:383 +#: ../../common/file_utils.c:379 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "não pôde renomear arquivo \"%s\" para \"%s\": %m" @@ -126,55 +118,45 @@ msgstr "não pôde renomear arquivo \"%s\" para \"%s\": %m" msgid "could not close directory \"%s\": %m" msgstr "não pôde fechar diretório \"%s\": %m" -#: ../../common/restricted_token.c:64 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "não pôde carregar biblioteca \"%s\": código de erro %lu" - -#: ../../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "não pode criar informações restritas nessa plataforma: código de erro %lu" - -#: ../../common/restricted_token.c:82 +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "não pôde abrir informação sobre processo: código de erro %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "não pôde alocar SIDs: código de erro %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "não pôde criar informação restrita: código de erro %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "não pôde iniciar processo para comando \"%s\": código de erro %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "não pôde executar novamente com informação restrita: código de erro %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "não pôde obter código de saída de subprocesso: código de erro %lu" -#: ../../common/rmtree.c:79 +#: ../../common/rmtree.c:95 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "não pôde executar stat no arquivo ou diretório \"%s\": %m" +msgid "could not remove file \"%s\": %m" +msgstr "não pôde remover arquivo \"%s\": %m" -#: ../../common/rmtree.c:101 ../../common/rmtree.c:113 +#: ../../common/rmtree.c:122 #, c-format -msgid "could not remove file or directory \"%s\": %m" -msgstr "não pôde remover arquivo ou diretório \"%s\": %m" +msgid "could not remove directory \"%s\": %m" +msgstr "não pôde remover diretório \"%s\": %m" #: ../../common/username.c:43 #, c-format @@ -190,289 +172,314 @@ msgstr "usuário não existe" msgid "user name lookup failure: error code %lu" msgstr "falhou ao pesquisar nome de usuário: código de erro %lu" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "comando não é executável" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "comando não encontrado" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "processo filho terminou com código de saída %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "processo filho foi terminado pela exceção 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "processo filho foi terminado pelo sinal %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "processo filho terminou com status desconhecido %d" -#: ../../port/dirmod.c:221 +#: ../../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" msgstr "não pôde definir junção para \"%s\": %s\n" -#: ../../port/dirmod.c:298 +#: ../../port/dirmod.c:367 #, c-format msgid "could not get junction for \"%s\": %s\n" msgstr "não pôde obter junção para \"%s\": %s\n" -#: initdb.c:464 initdb.c:1459 +#: initdb.c:618 initdb.c:1613 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "não pôde abrir arquivo \"%s\" para leitura: %m" -#: initdb.c:505 initdb.c:809 initdb.c:829 +#: initdb.c:662 initdb.c:966 initdb.c:986 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "não pôde abrir arquivo \"%s\" para escrita: %m" -#: initdb.c:509 initdb.c:812 initdb.c:831 +#: initdb.c:666 initdb.c:969 initdb.c:988 #, c-format msgid "could not write file \"%s\": %m" msgstr "não pôde escrever no arquivo \"%s\": %m" -#: initdb.c:513 +#: initdb.c:670 #, c-format msgid "could not close file \"%s\": %m" msgstr "não pôde fechar arquivo \"%s\": %m" -#: initdb.c:529 +#: initdb.c:686 #, c-format msgid "could not execute command \"%s\": %m" msgstr "não pôde executar comando \"%s\": %m" -#: initdb.c:547 +#: initdb.c:704 #, c-format msgid "removing data directory \"%s\"" msgstr "removendo diretório de dados \"%s\"" -#: initdb.c:549 +#: initdb.c:706 #, c-format msgid "failed to remove data directory" msgstr "falhou ao remover diretório de dados" -#: initdb.c:553 +#: initdb.c:710 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "removendo conteúdo do diretório de dados \"%s\"" -#: initdb.c:556 +#: initdb.c:713 #, c-format msgid "failed to remove contents of data directory" msgstr "falhou ao remover conteúdo do diretório de dados" -#: initdb.c:561 +#: initdb.c:718 #, c-format msgid "removing WAL directory \"%s\"" msgstr "removendo diretório do WAL \"%s\"" -#: initdb.c:563 +#: initdb.c:720 #, c-format msgid "failed to remove WAL directory" msgstr "falhou ao remover diretório do WAL" -#: initdb.c:567 +#: initdb.c:724 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "removendo conteúdo do diretório do WAL \"%s\"" -#: initdb.c:569 +#: initdb.c:726 #, c-format msgid "failed to remove contents of WAL directory" msgstr "falhou ao remover conteúdo do diretório do WAL" -#: initdb.c:576 +#: initdb.c:733 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "diretório de dados \"%s\" não foi removido a pedido do usuário" -#: initdb.c:580 +#: initdb.c:737 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "diretório do WAL \"%s\" não foi removido a pedido do usuário" -#: initdb.c:598 +#: initdb.c:755 #, c-format msgid "cannot be run as root" msgstr "não pode ser executado como root" -#: initdb.c:599 +#: initdb.c:756 #, c-format msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." msgstr "Por favor entre (utilizando, e.g., \"su\") como usuário (sem privilégios) que será o dono do processo do servidor." -#: initdb.c:631 +#: initdb.c:788 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "\"%s\" não é um nome de codificação do servidor válido" -#: initdb.c:775 +#: initdb.c:932 #, c-format msgid "file \"%s\" does not exist" msgstr "arquivo \"%s\" não existe" -#: initdb.c:776 initdb.c:781 initdb.c:788 +#: initdb.c:933 initdb.c:938 initdb.c:945 #, c-format msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." msgstr "Isso significa que você tem uma instalação corrompida ou especificou o diretório errado com a invocação da opção -L." -#: initdb.c:780 +#: initdb.c:937 #, c-format msgid "could not access file \"%s\": %m" msgstr "não pôde acessar arquivo \"%s\": %m" -#: initdb.c:787 +#: initdb.c:944 #, c-format msgid "file \"%s\" is not a regular file" msgstr "arquivo \"%s\" não é um arquivo regular" -#: initdb.c:922 +#: initdb.c:1077 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "selecionando implementação de memória compartilhada dinâmica ... " -#: initdb.c:931 +#: initdb.c:1086 #, c-format msgid "selecting default max_connections ... " msgstr "selecionando max_connections padrão ... " -#: initdb.c:962 +#: initdb.c:1106 #, c-format msgid "selecting default shared_buffers ... " msgstr "selecionando shared_buffers padrão ... " -#: initdb.c:996 +#: initdb.c:1129 #, c-format msgid "selecting default time zone ... " msgstr "selecionando fuso horário padrão ... " -#: initdb.c:1030 +#: initdb.c:1206 msgid "creating configuration files ... " msgstr "criando arquivos de configuração ... " -#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299 +#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "não pôde mudar permissões de \"%s\": %m" -#: initdb.c:1319 +#: initdb.c:1477 #, c-format msgid "running bootstrap script ... " msgstr "executando script de inicialização ... " -#: initdb.c:1331 +#: initdb.c:1489 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "arquivo de entrada \"%s\" não pertence ao PostgreSQL %s" -#: initdb.c:1333 +#: initdb.c:1491 #, c-format msgid "Specify the correct path using the option -L." msgstr "Especifique o caminho correto utilizando a opção -L." -#: initdb.c:1437 +#: initdb.c:1591 msgid "Enter new superuser password: " msgstr "Digite nova senha de super-usuário: " -#: initdb.c:1438 +#: initdb.c:1592 msgid "Enter it again: " msgstr "Digite-a novamente: " -#: initdb.c:1441 +#: initdb.c:1595 #, c-format msgid "Passwords didn't match.\n" msgstr "Senhas não correspondem.\n" -#: initdb.c:1465 +#: initdb.c:1619 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "não pôde ler senha do arquivo \"%s\": %m" -#: initdb.c:1468 +#: initdb.c:1622 #, c-format msgid "password file \"%s\" is empty" msgstr "arquivo de senhas \"%s\" está vazio" -#: initdb.c:1915 +#: initdb.c:2034 #, c-format msgid "caught signal\n" msgstr "sinal foi recebido\n" -#: initdb.c:1921 +#: initdb.c:2040 #, c-format msgid "could not write to child process: %s\n" msgstr "não pôde escrever em processo filho: %s\n" -#: initdb.c:1929 +#: initdb.c:2048 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2018 +#: initdb.c:2137 #, c-format msgid "setlocale() failed" msgstr "setlocale() falhou" -#: initdb.c:2036 +#: initdb.c:2155 #, c-format msgid "failed to restore old locale \"%s\"" msgstr "falhou ao restaurar configuração regional antiga \"%s\"" -#: initdb.c:2043 +#: initdb.c:2163 #, c-format msgid "invalid locale name \"%s\"" msgstr "nome de configuração regional \"%s\" é inválido" -#: initdb.c:2054 +#: initdb.c:2164 +#, c-format +msgid "If the locale name is specific to ICU, use --icu-locale." +msgstr "Se o nome da configuração regional é específico do ICU, utilize --icu-locale." + +#: initdb.c:2177 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "definições de configuração regional inválidas; verifique as variáveis de ambiente LANG e LC_*" -#: initdb.c:2080 initdb.c:2104 +#: initdb.c:2203 initdb.c:2227 #, c-format msgid "encoding mismatch" msgstr "codificação não corresponde" -#: initdb.c:2081 +#: initdb.c:2204 #, c-format msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." msgstr "A codificação que você escolheu (%s) e a codificação que a configuração regional selecionada utiliza (%s) não tem correspondência. Isto pode conduzir a um comportamento inesperado em funções de processamento de cadeia de caracteres." -#: initdb.c:2086 initdb.c:2107 +#: initdb.c:2209 initdb.c:2230 #, c-format msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." msgstr "Execute %s novamente e não especifique uma codificação explicitamente ou escolha uma outra combinação." -#: initdb.c:2105 +#: initdb.c:2228 #, c-format msgid "The encoding you selected (%s) is not supported with the ICU provider." msgstr "A codificação que você selecionou (%s) não é suportada com o provedor ICU." -#: initdb.c:2169 -#, c-format -msgid "ICU locale must be specified" -msgstr "configuração regional ICU deve ser especificado" +#: initdb.c:2279 +#, fuzzy, c-format +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "não pôde converter nome de configuração regional \"%s\" para tag da língua: %s" -#: initdb.c:2176 +#: initdb.c:2285 initdb.c:2337 initdb.c:2416 #, c-format msgid "ICU is not supported in this build" msgstr "ICU não é suportado por essa construção" -#: initdb.c:2187 +#: initdb.c:2308 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "não pôde obter língua de configuração regional \"%s\": %s" + +#: initdb.c:2334 +#, c-format +msgid "locale \"%s\" has unknown language \"%s\"" +msgstr "configuração regional \"%s\" tem língua desconhecida \"%s\"" + +#: initdb.c:2400 +#, c-format +msgid "ICU locale must be specified" +msgstr "configuração regional ICU deve ser especificado" + +#: initdb.c:2404 +#, fuzzy, c-format +msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" +msgstr "Utilizando tag da língua \"%s\" para configuração regional ICU \"%s\".\n" + +#: initdb.c:2427 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -481,17 +488,17 @@ msgstr "" "%s inicializa um agrupamento de banco de dados PostgreSQL.\n" "\n" -#: initdb.c:2188 +#: initdb.c:2428 #, c-format msgid "Usage:\n" msgstr "Uso:\n" -#: initdb.c:2189 +#: initdb.c:2429 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPÇÃO]... [DIRDADOS]\n" -#: initdb.c:2190 +#: initdb.c:2430 #, c-format msgid "" "\n" @@ -500,52 +507,57 @@ msgstr "" "\n" "Opções:\n" -#: initdb.c:2191 +#: initdb.c:2431 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, --auth=MÉTODO método de autenticação padrão para conexões locais\n" -#: initdb.c:2192 +#: initdb.c:2432 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr " --auth-host=MÉTODO método de autenticação padrão para conexões TCP/IP locais\n" -#: initdb.c:2193 +#: initdb.c:2433 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr " --auth-local=MÉTODO método de autenticação padrão para conexões de soquete locais\n" -#: initdb.c:2194 +#: initdb.c:2434 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DIRDADOS local do agrupamento de banco de dados\n" -#: initdb.c:2195 +#: initdb.c:2435 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=CODIFICAÇÃO ajusta a codificação padrão para novos bancos de dados\n" -#: initdb.c:2196 +#: initdb.c:2436 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" -msgstr " -g, --allow-group-access permite leitura/execução do grupo no diretório de dados\n" +msgstr " -g, --allow-group-access permite leitura/execução do grupo no diretório de dados\n" -#: initdb.c:2197 +#: initdb.c:2437 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" -msgstr " --icu-locale=LOCALE ajusta ID de configuração regional ICU para novos bancos de dados\n" +msgstr " --icu-locale=LOCALE ajusta ID de configuração regional ICU para novos bancos de dados\n" -#: initdb.c:2198 +#: initdb.c:2438 +#, fuzzy, c-format +msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" +msgstr " --icu-rules=REGRAS ajusta regras adicionais de agregação ICU para novos bancos de dados\n" + +#: initdb.c:2439 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums verificações de páginas de dados\n" -#: initdb.c:2199 +#: initdb.c:2440 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE ajusta configuração regional padrão para novos bancos de dados\n" -#: initdb.c:2200 +#: initdb.c:2441 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -558,26 +570,26 @@ msgstr "" " ajusta configuração regional padrão na respectiva categoria\n" " para novos bancos de dados (o ambiente é assumido como padrão)\n" -#: initdb.c:2204 +#: initdb.c:2445 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale equivalente a --locale=C\n" -#: initdb.c:2205 +#: initdb.c:2446 #, c-format msgid "" " --locale-provider={libc|icu}\n" " set default locale provider for new databases\n" msgstr "" " --locale-provider={libc|icu}\n" -" ajusta provedor de configuração regional padrão para novos bancos de dados\n" +" ajusta provedor de configuração regional padrão para novos bancos de dados\n" -#: initdb.c:2207 +#: initdb.c:2448 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=ARQUIVO lê senha do novo super-usuário a partir do arquivo\n" -#: initdb.c:2208 +#: initdb.c:2449 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -586,27 +598,27 @@ msgstr "" " -T, --text-search-config=CFG\n" " configuração de busca textual padrão\n" -#: initdb.c:2210 +#: initdb.c:2451 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NOME nome do super-usuário do banco de dados\n" -#: initdb.c:2211 +#: initdb.c:2452 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt pergunta senha do novo super-usuário\n" -#: initdb.c:2212 +#: initdb.c:2453 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" -msgstr " -X, --waldir=DIRWAL local do diretório do log de transação\n" +msgstr " -X, --waldir=DIRWAL local do diretório do log de transação\n" -#: initdb.c:2213 +#: initdb.c:2454 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " --wal-segsize=TAMANHO tamanho dos segmentos do WAL, em megabytes\n" +msgstr " --wal-segsize=TAMANHO tamanho dos segmentos do WAL, em megabytes\n" -#: initdb.c:2214 +#: initdb.c:2455 #, c-format msgid "" "\n" @@ -615,47 +627,52 @@ msgstr "" "\n" "Opções utilizadas com menos frequência:\n" -#: initdb.c:2215 +#: initdb.c:2456 +#, fuzzy, c-format +msgid " -c, --set NAME=VALUE override default setting for server parameter\n" +msgstr " -c, --set NOME=VALOR sobrescreve o valor padrão para parâmetro do servidor\n" + +#: initdb.c:2457 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug mostra saída da depuração\n" -#: initdb.c:2216 +#: initdb.c:2458 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches define debug_discard_caches=1\n" -#: initdb.c:2217 +#: initdb.c:2459 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRETÓRIO onde encontrar os arquivos de entrada\n" -#: initdb.c:2218 +#: initdb.c:2460 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean não remove após erros\n" -#: initdb.c:2219 +#: initdb.c:2461 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync não espera mudanças serem escritas com segurança no disco\n" -#: initdb.c:2220 +#: initdb.c:2462 #, c-format msgid " --no-instructions do not print instructions for next steps\n" -msgstr " --no-instructions não mostra instruções para próximos passos\n" +msgstr " --no-instructions não mostra instruções para próximos passos\n" -#: initdb.c:2221 +#: initdb.c:2463 #, c-format msgid " -s, --show show internal settings\n" msgstr " -s, --show mostra definições internas\n" -#: initdb.c:2222 +#: initdb.c:2464 #, c-format msgid " -S, --sync-only only sync database files to disk, then exit\n" msgstr " -S, --sync-only sincroniza somente os arquivos de banco de dados no disco e termina\n" -#: initdb.c:2223 +#: initdb.c:2465 #, c-format msgid "" "\n" @@ -664,17 +681,17 @@ msgstr "" "\n" "Outras opções:\n" -#: initdb.c:2224 +#: initdb.c:2466 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostra informação sobre a versão e termina\n" -#: initdb.c:2225 +#: initdb.c:2467 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostra essa ajuda e termina\n" -#: initdb.c:2226 +#: initdb.c:2468 #, c-format msgid "" "\n" @@ -685,7 +702,7 @@ msgstr "" "Se o diretório de dados não for especificado, a variável de ambiente PGDATA\n" "é utilizada.\n" -#: initdb.c:2228 +#: initdb.c:2470 #, c-format msgid "" "\n" @@ -694,72 +711,72 @@ msgstr "" "\n" "Relate erros a <%s>.\n" -#: initdb.c:2229 +#: initdb.c:2471 #, c-format msgid "%s home page: <%s>\n" msgstr "página web do %s: <%s>\n" -#: initdb.c:2257 +#: initdb.c:2499 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "método de autenticação \"%s\" é inválido para conexões \"%s\"" -#: initdb.c:2271 +#: initdb.c:2513 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "você precisa especificar uma senha para o super-usuário para habilitar a autenticação password" -#: initdb.c:2290 +#: initdb.c:2532 #, c-format msgid "no data directory specified" msgstr "nenhum diretório de dados foi especificado" -#: initdb.c:2291 +#: initdb.c:2533 #, c-format msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." msgstr "Você deve identificar o diretório onde os dados para esse sistema de banco de dados irá residir. Faça isso especificando a opção -D ou definindo a variável de ambiente PGDATA." -#: initdb.c:2308 +#: initdb.c:2550 #, c-format msgid "could not set environment" msgstr "não pôde definir variável de ambiente" -#: initdb.c:2326 +#: initdb.c:2568 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "O programa \"%s\" é requerido pelo %s mas não foi encontrado no mesmo diretório que \"%s\"" -#: initdb.c:2329 +#: initdb.c:2571 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "O programa \"%s\" foi encontrado pelo \"%s\" mas não tem a mesma versão que %s" -#: initdb.c:2344 +#: initdb.c:2586 #, c-format msgid "input file location must be an absolute path" msgstr "local do arquivo de entrada deve ser um caminho absoluto" -#: initdb.c:2361 +#: initdb.c:2603 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "O agrupamento de banco de dados será inicializado com configuração regional \"%s\".\n" -#: initdb.c:2364 +#: initdb.c:2606 #, c-format msgid "The database cluster will be initialized with this locale configuration:\n" msgstr "O agrupamento de banco de dados será inicializado com essa configuração regional:\n" -#: initdb.c:2365 +#: initdb.c:2607 #, c-format msgid " provider: %s\n" msgstr " provedor: %s\n" -#: initdb.c:2367 +#: initdb.c:2609 #, c-format msgid " ICU locale: %s\n" msgstr " configuração regional ICU: %s\n" -#: initdb.c:2368 +#: initdb.c:2610 #, c-format msgid "" " LC_COLLATE: %s\n" @@ -776,27 +793,22 @@ msgstr "" " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2385 -#, c-format -msgid "The default database encoding has been set to \"%s\".\n" -msgstr "A codificação padrão do banco de dados foi definida para \"%s\".\n" - -#: initdb.c:2397 +#: initdb.c:2640 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "não pôde encontrar codificação ideal para configuração regional \"%s\"" -#: initdb.c:2399 +#: initdb.c:2642 #, c-format msgid "Rerun %s with the -E option." msgstr "Execute novamente %s com a opção -E." -#: initdb.c:2400 initdb.c:3021 initdb.c:3041 +#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Tente \"%s --help\" para obter informações adicionais." -#: initdb.c:2412 +#: initdb.c:2655 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -805,112 +817,107 @@ msgstr "" "Codificação \"%s\" sugerida pela configuração regional não é permitida como uma codificação do servidor.\n" "A codificação do banco de dados padrão será definida como \"%s\".\n" -#: initdb.c:2417 +#: initdb.c:2660 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "configuração regional \"%s\" requer codificação \"%s\" que não é suportada" -#: initdb.c:2419 +#: initdb.c:2662 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "Codificação \"%s\" não é permitida como uma codificação do servidor." -#: initdb.c:2421 +#: initdb.c:2664 #, c-format msgid "Rerun %s with a different locale selection." msgstr "Execute novamente %s com uma seleção de configuração regional diferente." -#: initdb.c:2429 +#: initdb.c:2672 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "A codificação padrão do banco de dados foi definida para \"%s\".\n" -#: initdb.c:2498 +#: initdb.c:2741 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "não pôde encontrar configuração de busca textual ideal para configuração regional \"%s\"" -#: initdb.c:2509 +#: initdb.c:2752 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "configuração de busca textual ideal para configuração regional \"%s\" é desconhecida" -#: initdb.c:2514 +#: initdb.c:2757 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "configuração de busca textual especificada \"%s\" pode não corresponder a configuração regional \"%s\"" -#: initdb.c:2519 +#: initdb.c:2762 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "A configuração de busca textual padrão será definida como \"%s\".\n" -#: initdb.c:2562 initdb.c:2633 +#: initdb.c:2805 initdb.c:2876 #, c-format msgid "creating directory %s ... " msgstr "criando diretório %s ... " -#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746 +#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985 #, c-format msgid "could not create directory \"%s\": %m" msgstr "não pôde criar diretório \"%s\": %m" -#: initdb.c:2576 initdb.c:2648 +#: initdb.c:2819 initdb.c:2891 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "alterando permissões no diretório existente %s ... " -#: initdb.c:2581 initdb.c:2653 +#: initdb.c:2824 initdb.c:2896 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "não pôde mudar permissões do diretório \"%s\": %m" -#: initdb.c:2593 initdb.c:2665 +#: initdb.c:2836 initdb.c:2908 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "diretório \"%s\" existe mas não está vazio" -#: initdb.c:2597 +#: initdb.c:2840 #, c-format msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." msgstr "Se você quer criar um novo sistema de banco de dados, remova ou esvazie o diretório \"%s\" ou execute %s com um argumento ao invés de \"%s\"." -#: initdb.c:2605 initdb.c:2675 initdb.c:3058 +#: initdb.c:2848 initdb.c:2918 initdb.c:3325 #, c-format msgid "could not access directory \"%s\": %m" msgstr "não pôde acessar diretório \"%s\": %m" -#: initdb.c:2626 +#: initdb.c:2869 #, c-format msgid "WAL directory location must be an absolute path" msgstr "local do diretório do WAL deve ser um caminho absoluto" -#: initdb.c:2669 +#: initdb.c:2912 #, c-format msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." msgstr "Se você quer armazenar o WAL no mesmo, remova ou esvazie o diretório \"%s\"." -#: initdb.c:2680 +#: initdb.c:2922 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "não pôde criar link simbólico \"%s\": %m" -#: initdb.c:2683 -#, c-format -msgid "symlinks are not supported on this platform" -msgstr "links simbólicos não são suportados nesta plataforma" - -#: initdb.c:2702 +#: initdb.c:2941 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." msgstr "Ele contém um arquivo iniciado por ponto/invisível, talvez por ser um ponto de montagem." -#: initdb.c:2704 +#: initdb.c:2943 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point." msgstr "Ele contém um diretório lost+found, talvez por ser um ponto de montagem." -#: initdb.c:2706 +#: initdb.c:2945 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -919,65 +926,71 @@ msgstr "" "Utilizar um ponto de montagem diretamente como diretório de dados não é recomendado.\n" "Crie um subdiretório no ponto de montagem." -#: initdb.c:2732 +#: initdb.c:2971 #, c-format msgid "creating subdirectories ... " msgstr "criando subdiretórios ... " -#: initdb.c:2775 +#: initdb.c:3014 msgid "performing post-bootstrap initialization ... " msgstr "executando pós-inicialização ... " -#: initdb.c:2940 +#: initdb.c:3175 +#, c-format +msgid "-c %s requires a value" +msgstr "-c %s requer um valor" + +#: initdb.c:3200 #, c-format msgid "Running in debug mode.\n" msgstr "Executando no modo de depuração.\n" -#: initdb.c:2944 +#: initdb.c:3204 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "Executando no modo sem limpeza. Erros não serão removidos.\n" -#: initdb.c:3014 +#: initdb.c:3274 #, c-format msgid "unrecognized locale provider: %s" msgstr "provedor de configuração regional é desconhecido: %s" -#: initdb.c:3039 +#: initdb.c:3302 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")" -#: initdb.c:3046 +#: initdb.c:3309 initdb.c:3313 #, c-format msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgstr "%s não pode ser especificado a não ser que o provedor de configuração regional \"%s\" seja escolhido" -#: initdb.c:3060 initdb.c:3137 +#: initdb.c:3327 initdb.c:3404 msgid "syncing data to disk ... " msgstr "sincronizando dados no disco ... " -#: initdb.c:3068 +#: initdb.c:3335 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "opção para perguntar a senha e um arquivo de senhas não podem ser especificados juntos" -#: initdb.c:3090 +#: initdb.c:3357 #, c-format msgid "argument of --wal-segsize must be a number" msgstr "argumento de --wal-segsize deve ser um número" -#: initdb.c:3092 -#, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" +#: initdb.c:3359 +#, fuzzy, c-format +#| msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" +msgid "argument of --wal-segsize must be a power of two between 1 and 1024" msgstr "argumento de --wal-segsize deve ser uma potência de 2 entre 1 e 1024" -#: initdb.c:3106 +#: initdb.c:3373 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "nome de super-usuário \"%s\" não é permitido; nomes de roles não podem começar com \"pg_\"" -#: initdb.c:3108 +#: initdb.c:3375 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -988,17 +1001,17 @@ msgstr "" "Esse usuário deve ser o dono do processo do servidor também.\n" "\n" -#: initdb.c:3124 +#: initdb.c:3391 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Verificações de páginas de dados estão habilitadas.\n" -#: initdb.c:3126 +#: initdb.c:3393 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Verificações de páginas de dados estão desabilitadas.\n" -#: initdb.c:3143 +#: initdb.c:3410 #, c-format msgid "" "\n" @@ -1009,22 +1022,22 @@ msgstr "" "Sincronização com o disco foi ignorada.\n" "O diretório de dados pode ser danificado se houver uma queda do sistema operacional.\n" -#: initdb.c:3148 +#: initdb.c:3415 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "habilitando autenticação \"trust\" para conexões locais" -#: initdb.c:3149 +#: initdb.c:3416 #, c-format msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." msgstr "Você pode mudá-lo editando o pg_hba.conf ou utilizando a opção -A, ou --auth-local e --auth-host, na próxima vez que você executar o initdb." #. translator: This is a placeholder in a shell command. -#: initdb.c:3179 +#: initdb.c:3446 msgid "logfile" msgstr "arquivolog" -#: initdb.c:3181 +#: initdb.c:3448 #, c-format msgid "" "\n" diff --git a/src/bin/initdb/po/ru.po b/src/bin/initdb/po/ru.po index aa95735279853..bac896a8fe0ce 100644 --- a/src/bin/initdb/po/ru.po +++ b/src/bin/initdb/po/ru.po @@ -6,21 +6,21 @@ # Sergey Burladyan , 2009. # Andrey Sudnik , 2010. # Dmitriy Olshevskiy , 2014. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: initdb (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-29 10:17+0300\n" -"PO-Revision-Date: 2022-09-29 11:39+0300\n" +"POT-Creation-Date: 2025-05-03 16:06+0300\n" +"PO-Revision-Date: 2024-11-02 08:27+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../../../src/common/logging.c:276 #, c-format @@ -42,85 +42,103 @@ msgstr "подробноÑти: " msgid "hint: " msgstr "подÑказка: " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "не удалоÑÑŒ определить текущий каталог: %m" +msgid "invalid binary \"%s\": %m" +msgstr "неверный иÑполнÑемый файл \"%s\": %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "неверный иÑполнÑемый файл \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\": %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\"" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "не удалоÑÑŒ найти запуÑкаемый файл \"%s\"" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "не удалоÑÑŒ преобразовать отноÑительный путь \"%s\" в абÑолютный: %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:382 initdb.c:750 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m" +msgid "could not execute command \"%s\": %m" +msgstr "не удалоÑÑŒ выполнить команду \"%s\": %m" -#: ../../common/exec.c:422 +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать вывод команды \"%s\": %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "команда \"%s\" не выдала данные" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: initdb.c:334 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: initdb.c:372 initdb.c:408 #, c-format msgid "out of memory" msgstr "нехватка памÑти" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "нехватка памÑти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" -#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñта Ñборка программы не поддерживает метод Ñинхронизации \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: ../../common/pgfnames.c:48 ../../common/rmtree.c:63 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" -#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: ../../common/pgfnames.c:69 ../../common/rmtree.c:106 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" -#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 -#: ../../common/file_utils.c:365 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" - -#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" -#: ../../common/file_utils.c:383 +#: ../../common/file_utils.c:498 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" @@ -130,55 +148,45 @@ msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\" msgid "could not close directory \"%s\": %m" msgstr "не удалоÑÑŒ закрыть каталог \"%s\": %m" -#: ../../common/restricted_token.c:64 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "не удалоÑÑŒ загрузить библиотеку \"%s\" (код ошибки: %lu)" - -#: ../../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры (код ошибки: %lu)" - -#: ../../common/restricted_token.c:82 +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "не удалоÑÑŒ открыть маркер процеÑÑа (код ошибки: %lu)" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "не удалоÑÑŒ подготовить Ñтруктуры SID (код ошибки: %lu)" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "не удалоÑÑŒ Ñоздать ограниченный маркер (код ошибки: %lu)" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "не удалоÑÑŒ запуÑтить процеÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ \"%s\" (код ошибки: %lu)" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "не удалоÑÑŒ перезапуÑтитьÑÑ Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ маркером (код ошибки: %lu)" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "не удалоÑÑŒ получить код выхода от подпроцеÑÑа (код ошибки: %lu)" -#: ../../common/rmtree.c:79 +#: ../../common/rmtree.c:97 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "не удалоÑÑŒ получить информацию о файле или каталоге \"%s\": %m" +msgid "could not remove file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñтереть файл \"%s\": %m" -#: ../../common/rmtree.c:101 ../../common/rmtree.c:113 +#: ../../common/rmtree.c:124 #, c-format -msgid "could not remove file or directory \"%s\": %m" -msgstr "ошибка при удалении файла или каталога \"%s\": %m" +msgid "could not remove directory \"%s\": %m" +msgstr "ошибка при удалении каталога \"%s\": %m" #: ../../common/username.c:43 #, c-format @@ -194,127 +202,170 @@ msgstr "пользователь не ÑущеÑтвует" msgid "user name lookup failure: error code %lu" msgstr "раÑпознать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалоÑÑŒ (код ошибки: %lu)" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "неиÑполнÑÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "команда не найдена" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ возврата %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "дочерний процеÑÑ Ð¿Ñ€ÐµÑ€Ð²Ð°Ð½ иÑключением 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" -msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным ÑоÑтоÑнием %d" +msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным кодом ÑоÑтоÑÐ½Ð¸Ñ %d" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "значение %s должно быть в диапазоне %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нераÑпознанный метод Ñинхронизации: %s" -#: ../../port/dirmod.c:221 +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "" +"аргумент команды оболочки Ñодержит Ñимвол новой Ñтроки или перевода каретки: " +"\"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "" +"Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ñодержит Ñимвол новой Ñтроки или перевода каретки: \"%s\"\n" + +#: ../../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" msgstr "не удалоÑÑŒ Ñоздать ÑвÑзь Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° \"%s\": %s\n" -#: ../../port/dirmod.c:298 +#: ../../port/dirmod.c:367 #, c-format msgid "could not get junction for \"%s\": %s\n" msgstr "не удалоÑÑŒ получить ÑвÑзь Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° \"%s\": %s\n" -#: initdb.c:464 initdb.c:1459 +#: initdb.c:369 +#, c-format +msgid "_wsetlocale() failed" +msgstr "ошибка в _wsetlocale()" + +#: initdb.c:376 +#, c-format +msgid "setlocale() failed" +msgstr "ошибка в setlocale()" + +#: initdb.c:390 +#, c-format +msgid "failed to restore old locale" +msgstr "не удалоÑÑŒ воÑÑтановить Ñтарую локаль" + +#: initdb.c:393 +#, c-format +msgid "failed to restore old locale \"%s\"" +msgstr "не удалоÑÑŒ воÑÑтановить Ñтарую локаль \"%s\"" + +#: initdb.c:682 initdb.c:1674 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m" -#: initdb.c:505 initdb.c:809 initdb.c:829 +#: initdb.c:726 initdb.c:1030 initdb.c:1050 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи: %m" -#: initdb.c:509 initdb.c:812 initdb.c:831 +#: initdb.c:730 initdb.c:1033 initdb.c:1052 #, c-format msgid "could not write file \"%s\": %m" msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m" -#: initdb.c:513 +#: initdb.c:734 #, c-format msgid "could not close file \"%s\": %m" msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m" -#: initdb.c:529 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "не удалоÑÑŒ выполнить команду \"%s\": %m" - -#: initdb.c:547 +#: initdb.c:768 #, c-format msgid "removing data directory \"%s\"" msgstr "удаление каталога данных \"%s\"" -#: initdb.c:549 +#: initdb.c:770 #, c-format msgid "failed to remove data directory" msgstr "ошибка при удалении каталога данных" -#: initdb.c:553 +#: initdb.c:774 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "удаление Ñодержимого каталога данных \"%s\"" -#: initdb.c:556 +#: initdb.c:777 #, c-format msgid "failed to remove contents of data directory" msgstr "ошибка при удалении Ñодержимого каталога данных" -#: initdb.c:561 +#: initdb.c:782 #, c-format msgid "removing WAL directory \"%s\"" msgstr "удаление каталога WAL \"%s\"" -#: initdb.c:563 +#: initdb.c:784 #, c-format msgid "failed to remove WAL directory" msgstr "ошибка при удалении каталога WAL" -#: initdb.c:567 +#: initdb.c:788 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "удаление Ñодержимого каталога WAL \"%s\"" -#: initdb.c:569 +#: initdb.c:790 #, c-format msgid "failed to remove contents of WAL directory" msgstr "ошибка при удалении Ñодержимого каталога WAL" -#: initdb.c:576 +#: initdb.c:797 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "каталог данных \"%s\" не был удалён по запроÑу пользователÑ" -#: initdb.c:580 +#: initdb.c:801 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "каталог WAL \"%s\" не был удалён по запроÑу пользователÑ" -#: initdb.c:598 +#: initdb.c:819 #, c-format msgid "cannot be run as root" msgstr "программу не должен запуÑкать root" -#: initdb.c:599 +#: initdb.c:820 #, c-format msgid "" "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own " @@ -323,17 +374,17 @@ msgstr "" "ПожалуйÑта, переключитеÑÑŒ на обычного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (например, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ " "\"su\"), которому будет принадлежать Ñерверный процеÑÑ." -#: initdb.c:631 +#: initdb.c:852 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "\"%s\" — некорректное Ð¸Ð¼Ñ Ñерверной кодировки" -#: initdb.c:775 +#: initdb.c:996 #, c-format msgid "file \"%s\" does not exist" msgstr "файл \"%s\" не ÑущеÑтвует" -#: initdb.c:776 initdb.c:781 initdb.c:788 +#: initdb.c:997 initdb.c:1002 initdb.c:1009 #, c-format msgid "" "This might mean you have a corrupted installation or identified the wrong " @@ -342,124 +393,124 @@ msgstr "" "Это означает, что ваша уÑтановка PostgreSQL иÑпорчена или в параметре -L " "задан неправильный каталог." -#: initdb.c:780 +#: initdb.c:1001 #, c-format msgid "could not access file \"%s\": %m" -msgstr "нет доÑтупа к файлу \"%s\": %m" +msgstr "ошибка при обращении к файлу \"%s\": %m" -#: initdb.c:787 +#: initdb.c:1008 #, c-format msgid "file \"%s\" is not a regular file" msgstr "\"%s\" — не обычный файл" -#: initdb.c:922 +#: initdb.c:1141 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "выбираетÑÑ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸Ñ‡ÐµÑкой разделÑемой памÑти... " -#: initdb.c:931 +#: initdb.c:1150 #, c-format -msgid "selecting default max_connections ... " -msgstr "выбираетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ max_connections по умолчанию... " +msgid "selecting default \"max_connections\" ... " +msgstr "выбираетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ \"max_connections\" по умолчанию... " -#: initdb.c:962 +#: initdb.c:1170 #, c-format -msgid "selecting default shared_buffers ... " -msgstr "выбираетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ shared_buffers по умолчанию... " +msgid "selecting default \"shared_buffers\" ... " +msgstr "выбираетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ \"shared_buffers\" по умолчанию... " -#: initdb.c:996 +#: initdb.c:1193 #, c-format msgid "selecting default time zone ... " msgstr "выбираетÑÑ Ñ‡Ð°Ñовой поÑÑ Ð¿Ð¾ умолчанию... " -#: initdb.c:1030 +#: initdb.c:1272 msgid "creating configuration files ... " msgstr "Ñоздание конфигурационных файлов... " -#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299 +#: initdb.c:1425 initdb.c:1439 initdb.c:1506 initdb.c:1517 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "не удалоÑÑŒ поменÑть права Ð´Ð»Ñ \"%s\": %m" -#: initdb.c:1319 +#: initdb.c:1536 #, c-format msgid "running bootstrap script ... " msgstr "выполнÑетÑÑ Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¹ Ñкрипт... " -#: initdb.c:1331 +#: initdb.c:1548 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "входной файл \"%s\" не принадлежит PostgreSQL %s" -#: initdb.c:1333 +#: initdb.c:1550 #, c-format msgid "Specify the correct path using the option -L." msgstr "Укажите корректный путь в параметре -L." -#: initdb.c:1437 +#: initdb.c:1652 msgid "Enter new superuser password: " msgstr "Введите новый пароль ÑуперпользователÑ: " -#: initdb.c:1438 +#: initdb.c:1653 msgid "Enter it again: " msgstr "Повторите его: " -#: initdb.c:1441 +#: initdb.c:1656 #, c-format msgid "Passwords didn't match.\n" msgstr "Пароли не Ñовпадают.\n" -#: initdb.c:1465 +#: initdb.c:1680 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "не удалоÑÑŒ прочитать пароль из файла \"%s\": %m" -#: initdb.c:1468 +#: initdb.c:1683 #, c-format msgid "password file \"%s\" is empty" msgstr "файл Ð¿Ð°Ñ€Ð¾Ð»Ñ \"%s\" пуÑÑ‚" -#: initdb.c:1915 +#: initdb.c:2095 #, c-format msgid "caught signal\n" msgstr "получен Ñигнал\n" -#: initdb.c:1921 +#: initdb.c:2101 #, c-format msgid "could not write to child process: %s\n" msgstr "не удалоÑÑŒ запиÑать в поток дочернего процеÑÑа: %s\n" -#: initdb.c:1929 +#: initdb.c:2109 #, c-format msgid "ok\n" msgstr "ок\n" -#: initdb.c:2018 -#, c-format -msgid "setlocale() failed" -msgstr "ошибка в setlocale()" - -#: initdb.c:2036 +#: initdb.c:2191 initdb.c:2237 #, c-format -msgid "failed to restore old locale \"%s\"" -msgstr "не удалоÑÑŒ воÑÑтановить Ñтарую локаль \"%s\"" +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" Ñодержит не-ASCII Ñимволы" -#: initdb.c:2043 +#: initdb.c:2217 #, c-format msgid "invalid locale name \"%s\"" msgstr "ошибочное Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\"" -#: initdb.c:2054 +#: initdb.c:2218 +#, c-format +msgid "If the locale name is specific to ICU, use --icu-locale." +msgstr "ЕÑли Ñта локаль ÑвойÑтвенна ICU, укажите --icu-locale." + +#: initdb.c:2231 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "неверные уÑтановки локали; проверьте переменные Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ LANG и LC_*" -#: initdb.c:2080 initdb.c:2104 +#: initdb.c:2262 initdb.c:2286 #, c-format msgid "encoding mismatch" msgstr "неÑоответÑтвие кодировки" -#: initdb.c:2081 +#: initdb.c:2263 #, c-format msgid "" "The encoding you selected (%s) and the encoding that the selected locale " @@ -470,7 +521,7 @@ msgstr "" "может привеÑти к неправильной работе различных функций обработки текÑтовых " "Ñтрок." -#: initdb.c:2086 initdb.c:2107 +#: initdb.c:2268 initdb.c:2289 #, c-format msgid "" "Rerun %s and either do not specify an encoding explicitly, or choose a " @@ -479,22 +530,47 @@ msgstr "" "Ð”Ð»Ñ Ð¸ÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑтите %s, не ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÑƒ Ñвно, либо выберите " "подходÑщее Ñочетание параметров локализации." -#: initdb.c:2105 +#: initdb.c:2287 #, c-format msgid "The encoding you selected (%s) is not supported with the ICU provider." msgstr "Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð²Ð°Ð¼Ð¸ кодировка (%s) не поддерживаетÑÑ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ð¾Ð¼ ICU." -#: initdb.c:2169 +#: initdb.c:2338 #, c-format -msgid "ICU locale must be specified" -msgstr "необходимо задать локаль ICU" +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "не удалоÑÑŒ получить из Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" метку Ñзыка: %s" -#: initdb.c:2176 +#: initdb.c:2344 initdb.c:2396 initdb.c:2488 #, c-format msgid "ICU is not supported in this build" msgstr "ICU не поддерживаетÑÑ Ð² данной Ñборке" -#: initdb.c:2187 +#: initdb.c:2367 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "не удалоÑÑŒ определить Ñзык Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\": %s" + +#: initdb.c:2393 +#, c-format +msgid "locale \"%s\" has unknown language \"%s\"" +msgstr "Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" получен неизвеÑтный Ñзык \"%s\"" + +#: initdb.c:2454 +#, c-format +msgid "locale must be specified if provider is %s" +msgstr "еÑли выбран провайдер %s, необходимо задать локаль" + +#: initdb.c:2465 +#, c-format +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "неверное Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" Ð´Ð»Ñ Ð²Ñтроенного провайдера" + +#: initdb.c:2476 +#, c-format +msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" +msgstr "Ð”Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ ICU \"%s\" иÑпользуетÑÑ Ð¼ÐµÑ‚ÐºÐ° Ñзыка \"%s\".\n" + +#: initdb.c:2499 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -503,17 +579,17 @@ msgstr "" "%s инициализирует клаÑтер PostgreSQL.\n" "\n" -#: initdb.c:2188 +#: initdb.c:2500 #, c-format msgid "Usage:\n" msgstr "ИÑпользование:\n" -#: initdb.c:2189 +#: initdb.c:2501 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [ПÐРÐМЕТР]... [КÐТÐЛОГ]\n" -#: initdb.c:2190 +#: initdb.c:2502 #, c-format msgid "" "\n" @@ -522,7 +598,7 @@ msgstr "" "\n" "Параметры:\n" -#: initdb.c:2191 +#: initdb.c:2503 #, c-format msgid "" " -A, --auth=METHOD default authentication method for local " @@ -531,7 +607,7 @@ msgstr "" " -A, --auth=МЕТОД метод проверки подлинноÑти по умолчанию\n" " Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… подключений\n" -#: initdb.c:2192 +#: initdb.c:2504 #, c-format msgid "" " --auth-host=METHOD default authentication method for local TCP/IP " @@ -540,7 +616,7 @@ msgstr "" " --auth-host=МЕТОД метод проверки подлинноÑти по умолчанию\n" " Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… TCP/IP-подключений\n" -#: initdb.c:2193 +#: initdb.c:2505 #, c-format msgid "" " --auth-local=METHOD default authentication method for local-socket " @@ -549,17 +625,17 @@ msgstr "" " --auth-local=МЕТОД метод проверки подлинноÑти по умолчанию\n" " Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… подключений через Ñокет\n" -#: initdb.c:2194 +#: initdb.c:2506 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]КÐТÐЛОГ раÑположение данных Ñтого клаÑтера БД\n" -#: initdb.c:2195 +#: initdb.c:2507 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=КОДИРОВКРкодировка по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… баз\n" -#: initdb.c:2196 +#: initdb.c:2508 #, c-format msgid "" " -g, --allow-group-access allow group read/execute on data directory\n" @@ -568,22 +644,31 @@ msgstr "" "длÑ\n" " группы\n" -#: initdb.c:2197 +#: initdb.c:2509 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" msgstr " --icu-locale=ЛОКÐЛЬ идентификатор локали ICU Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… баз\n" -#: initdb.c:2198 +#: initdb.c:2510 +#, c-format +msgid "" +" --icu-rules=RULES set additional ICU collation rules for new " +"databases\n" +msgstr "" +" --icu-rules=ПРÐВИЛРдополнительные правила Ñортировки ICU Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… " +"баз\n" + +#: initdb.c:2511 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums включить контроль целоÑтноÑти Ñтраниц\n" -#: initdb.c:2199 +#: initdb.c:2512 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=ЛОКÐЛЬ локаль по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… баз\n" -#: initdb.c:2200 +#: initdb.c:2513 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -597,28 +682,37 @@ msgstr "" " уÑтановить ÑоответÑтвующий параметр локали\n" " Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… баз (вмеÑто Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð· окружениÑ)\n" -#: initdb.c:2204 +#: initdb.c:2517 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale Ñквивалентно --locale=C\n" -#: initdb.c:2205 +#: initdb.c:2518 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --builtin-locale=LOCALE\n" +" set builtin locale name for new databases\n" +msgstr "" +" --builtin-locale=ЛОКÐЛЬ\n" +" Ð¸Ð¼Ñ Ð²Ñтроенной локали Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… баз\n" + +#: initdb.c:2520 +#, c-format +msgid "" +" --locale-provider={builtin|libc|icu}\n" " set default locale provider for new databases\n" msgstr "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " провайдер оÑновной локали Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… баз\n" -#: initdb.c:2207 +#: initdb.c:2522 #, c-format msgid "" " --pwfile=FILE read password for the new superuser from file\n" msgstr "" " --pwfile=ФÐЙЛ прочитать пароль ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· файла\n" -#: initdb.c:2208 +#: initdb.c:2523 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -627,29 +721,29 @@ msgstr "" " -T, --text-search-config=КОÐФИГУРÐЦИЯ\n" " ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка по умолчанию\n" -#: initdb.c:2210 +#: initdb.c:2525 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=ИМЯ Ð¸Ð¼Ñ ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð‘Ð”\n" -#: initdb.c:2211 +#: initdb.c:2526 #, c-format msgid "" " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt запроÑить пароль ÑуперпользователÑ\n" -#: initdb.c:2212 +#: initdb.c:2527 #, c-format msgid "" " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=КÐТÐЛОГ раÑположение журнала предзапиÑи\n" -#: initdb.c:2213 +#: initdb.c:2528 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=РÐЗМЕР размер Ñегментов WAL (в мегабайтах)\n" -#: initdb.c:2214 +#: initdb.c:2529 #, c-format msgid "" "\n" @@ -658,27 +752,35 @@ msgstr "" "\n" "Редко иÑпользуемые параметры:\n" -#: initdb.c:2215 +#: initdb.c:2530 +#, c-format +msgid "" +" -c, --set NAME=VALUE override default setting for server parameter\n" +msgstr "" +" -c, --set ИМЯ=ЗÐÐЧЕÐИЕ переопределить значение Ñерверного параметра по\n" +" умолчанию\n" + +#: initdb.c:2531 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug выдавать много отладочных Ñообщений\n" -#: initdb.c:2216 +#: initdb.c:2532 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches уÑтановить debug_discard_caches=1\n" -#: initdb.c:2217 +#: initdb.c:2533 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L КÐТÐЛОГ раÑположение входных файлов\n" -#: initdb.c:2218 +#: initdb.c:2534 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean не очищать поÑле ошибок\n" -#: initdb.c:2219 +#: initdb.c:2535 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written safely to " @@ -686,18 +788,23 @@ msgid "" msgstr "" " -N, --no-sync не ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… на диÑке\n" -#: initdb.c:2220 +#: initdb.c:2536 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr "" " --no-instructions не выводить инÑтрукции Ð´Ð»Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐ¸Ñ… дейÑтвий\n" -#: initdb.c:2221 +#: initdb.c:2537 +#, c-format +msgid " -s, --show show internal settings, then exit\n" +msgstr " -s, --show показать внутренние уÑтановки и выйти\n" + +#: initdb.c:2538 #, c-format -msgid " -s, --show show internal settings\n" -msgstr " -s, --show показать внутренние уÑтановки\n" +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=МЕТОД метод Ñинхронизации файлов Ñ Ð¤Ð¡\n" -#: initdb.c:2222 +#: initdb.c:2539 #, c-format msgid "" " -S, --sync-only only sync database files to disk, then exit\n" @@ -705,7 +812,7 @@ msgstr "" " -S, --sync-only только Ñинхронизировать Ñ Ð¤Ð¡ файлы базы и " "завершитьÑÑ\n" -#: initdb.c:2223 +#: initdb.c:2540 #, c-format msgid "" "\n" @@ -714,17 +821,17 @@ msgstr "" "\n" "Другие параметры:\n" -#: initdb.c:2224 +#: initdb.c:2541 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: initdb.c:2225 +#: initdb.c:2542 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: initdb.c:2226 +#: initdb.c:2543 #, c-format msgid "" "\n" @@ -734,7 +841,7 @@ msgstr "" "\n" "ЕÑли каталог данных не указан, иÑпользуетÑÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n" -#: initdb.c:2228 +#: initdb.c:2545 #, c-format msgid "" "\n" @@ -743,18 +850,18 @@ msgstr "" "\n" "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: initdb.c:2229 +#: initdb.c:2546 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" -#: initdb.c:2257 +#: initdb.c:2570 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "" "нераÑпознанный метод проверки подлинноÑти \"%s\" Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ð¹ \"%s\"" -#: initdb.c:2271 +#: initdb.c:2584 #, c-format msgid "" "must specify a password for the superuser to enable password authentication" @@ -762,12 +869,12 @@ msgstr "" "Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ по паролю необходимо указать пароль " "ÑуперпользователÑ" -#: initdb.c:2290 +#: initdb.c:2603 #, c-format msgid "no data directory specified" msgstr "каталог данных не указан" -#: initdb.c:2291 +#: initdb.c:2604 #, c-format msgid "" "You must identify the directory where the data for this database system will " @@ -777,53 +884,55 @@ msgstr "" "Ð’Ñ‹ должны указать каталог, в котором будут раÑполагатьÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ Ñтой СУБД. " "Это можно Ñделать, добавив ключ -D или уÑтановив переменную Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA." -#: initdb.c:2308 +#: initdb.c:2621 #, c-format msgid "could not set environment" msgstr "не удалоÑÑŒ задать переменную окружениÑ" -#: initdb.c:2326 +#: initdb.c:2639 #, c-format msgid "" -"program \"%s\" is needed by %s but was not found in the same directory as \"" -"%s\"" +"program \"%s\" is needed by %s but was not found in the same directory as " +"\"%s\"" msgstr "программа \"%s\" нужна Ð´Ð»Ñ %s, но она не найдена в каталоге \"%s\"" -#: initdb.c:2329 +#: initdb.c:2642 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "" "программа \"%s\" найдена программой \"%s\", но её верÑÐ¸Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð¾Ñ‚ " "верÑии %s" -#: initdb.c:2344 +#: initdb.c:2657 #, c-format msgid "input file location must be an absolute path" msgstr "раÑположение входных файлов должно задаватьÑÑ Ð°Ð±Ñолютным путём" -#: initdb.c:2361 +#: initdb.c:2674 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "КлаÑтер баз данных будет инициализирован Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÑŽ \"%s\".\n" -#: initdb.c:2364 +#: initdb.c:2677 #, c-format msgid "" "The database cluster will be initialized with this locale configuration:\n" msgstr "" "КлаÑтер баз данных будет инициализирован Ñо Ñледующими параметрами локали:\n" -#: initdb.c:2365 +#: initdb.c:2678 #, c-format -msgid " provider: %s\n" -msgstr " провайдер: %s\n" +msgid " locale provider: %s\n" +msgstr " провайдер локалей: %s\n" -#: initdb.c:2367 +#: initdb.c:2680 #, c-format -msgid " ICU locale: %s\n" -msgstr " локаль ICU: %s\n" +msgid " default collation: %s\n" +msgstr "" +" правило Ñортировки\n" +" по умолчанию: %s\n" -#: initdb.c:2368 +#: initdb.c:2681 #, c-format msgid "" " LC_COLLATE: %s\n" @@ -840,27 +949,22 @@ msgstr "" " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2385 -#, c-format -msgid "The default database encoding has been set to \"%s\".\n" -msgstr "Ð’ качеÑтве кодировки БД по умолчанию уÑтановлена \"%s\".\n" - -#: initdb.c:2397 +#: initdb.c:2711 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "не удалоÑÑŒ найти подходÑщую кодировку Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\"" -#: initdb.c:2399 +#: initdb.c:2713 #, c-format msgid "Rerun %s with the -E option." msgstr "ПерезапуÑтите %s Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ -E." -#: initdb.c:2400 initdb.c:3021 initdb.c:3041 +#: initdb.c:2714 initdb.c:3257 initdb.c:3377 initdb.c:3397 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." -#: initdb.c:2412 +#: initdb.c:2726 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -869,40 +973,45 @@ msgstr "" "Кодировка \"%s\", Ð¿Ð¾Ð´Ñ€Ð°Ð·ÑƒÐ¼ÐµÐ²Ð°ÐµÐ¼Ð°Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÑŽ, не годитÑÑ Ð´Ð»Ñ Ñервера.\n" "ВмеÑто неё в качеÑтве кодировки БД по умолчанию будет выбрана \"%s\".\n" -#: initdb.c:2417 +#: initdb.c:2731 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" требуетÑÑ Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° \"%s\"" -#: initdb.c:2419 +#: initdb.c:2733 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "Кодировка \"%s\" недопуÑтима в качеÑтве Ñерверной кодировки." -#: initdb.c:2421 +#: initdb.c:2735 #, c-format msgid "Rerun %s with a different locale selection." msgstr "ПерезапуÑтите %s, выбрав другую локаль." -#: initdb.c:2429 +#: initdb.c:2743 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "" "Кодировка БД по умолчанию, Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð² ÑоответÑтвии Ñ Ð½Ð°Ñтройками: \"%s\".\n" -#: initdb.c:2498 +#: initdb.c:2757 +#, c-format +msgid "builtin provider locale \"%s\" requires encoding \"%s\"" +msgstr "Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" вÑтроенного провайдера требуетÑÑ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° \"%s\"" + +#: initdb.c:2819 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "" "не удалоÑÑŒ найти подходÑщую конфигурацию текÑтового поиÑка Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\"" -#: initdb.c:2509 +#: initdb.c:2830 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "" "внимание: Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ \"%s\" нет извеÑтной конфигурации текÑтового поиÑка" -#: initdb.c:2514 +#: initdb.c:2835 #, c-format msgid "" "specified text search configuration \"%s\" might not match locale \"%s\"" @@ -910,37 +1019,37 @@ msgstr "" "ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка \"%s\" может не ÑоответÑтвовать " "локали \"%s\"" -#: initdb.c:2519 +#: initdb.c:2840 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "Выбрана ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка по умолчанию \"%s\".\n" -#: initdb.c:2562 initdb.c:2633 +#: initdb.c:2883 initdb.c:2954 #, c-format msgid "creating directory %s ... " msgstr "Ñоздание каталога %s... " -#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746 +#: initdb.c:2888 initdb.c:2959 initdb.c:3007 initdb.c:3064 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m" -#: initdb.c:2576 initdb.c:2648 +#: initdb.c:2897 initdb.c:2969 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "иÑправление прав Ð´Ð»Ñ ÑущеÑтвующего каталога %s... " -#: initdb.c:2581 initdb.c:2653 +#: initdb.c:2902 initdb.c:2974 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "не удалоÑÑŒ поменÑть права Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° \"%s\": %m" -#: initdb.c:2593 initdb.c:2665 +#: initdb.c:2914 initdb.c:2986 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "каталог \"%s\" ÑущеÑтвует, но он не пуÑÑ‚" -#: initdb.c:2597 +#: initdb.c:2918 #, c-format msgid "" "If you want to create a new database system, either remove or empty the " @@ -949,34 +1058,29 @@ msgstr "" "ЕÑли вы хотите Ñоздать новую ÑиÑтему баз данных, удалите или очиÑтите " "каталог \"%s\", либо при запуÑке %s в качеÑтве пути укажите не \"%s\"." -#: initdb.c:2605 initdb.c:2675 initdb.c:3058 +#: initdb.c:2926 initdb.c:2996 initdb.c:3422 #, c-format msgid "could not access directory \"%s\": %m" -msgstr "ошибка доÑтупа к каталогу \"%s\": %m" +msgstr "ошибка при обращении к каталогу \"%s\": %m" -#: initdb.c:2626 +#: initdb.c:2947 #, c-format msgid "WAL directory location must be an absolute path" msgstr "раÑположение каталога WAL должно определÑтьÑÑ Ð°Ð±Ñолютным путём" -#: initdb.c:2669 +#: initdb.c:2990 #, c-format msgid "" -"If you want to store the WAL there, either remove or empty the directory \"" -"%s\"." +"If you want to store the WAL there, either remove or empty the directory " +"\"%s\"." msgstr "ЕÑли вы хотите хранить WAL здеÑÑŒ, удалите или очиÑтите каталог \"%s\"." -#: initdb.c:2680 +#: initdb.c:3000 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать ÑимволичеÑкую ÑÑылку \"%s\": %m" -#: initdb.c:2683 -#, c-format -msgid "symlinks are not supported on this platform" -msgstr "ÑимволичеÑкие ÑÑылки не поддерживаютÑÑ Ð² Ñтой ОС" - -#: initdb.c:2702 +#: initdb.c:3019 #, c-format msgid "" "It contains a dot-prefixed/invisible file, perhaps due to it being a mount " @@ -984,78 +1088,78 @@ msgid "" msgstr "" "Он Ñодержит файл Ñ Ñ‚Ð¾Ñ‡ÐºÐ¾Ð¹ (невидимый), возможно, Ñто точка монтированиÑ." -#: initdb.c:2704 +#: initdb.c:3021 #, c-format msgid "" "It contains a lost+found directory, perhaps due to it being a mount point." msgstr "Он Ñодержит подкаталог lost+found, возможно, Ñто точка монтированиÑ." -#: initdb.c:2706 +#: initdb.c:3023 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" "Create a subdirectory under the mount point." msgstr "" -"ИÑпользовать в качеÑтве каталога данных точку Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ рекомендуетÑÑ." -"\n" +"ИÑпользовать в качеÑтве каталога данных точку Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ " +"рекомендуетÑÑ.\n" "Создайте в монтируемом реÑурÑе подкаталог и иÑпользуйте его." -#: initdb.c:2732 +#: initdb.c:3050 #, c-format msgid "creating subdirectories ... " msgstr "Ñоздание подкаталогов... " -#: initdb.c:2775 +#: initdb.c:3093 msgid "performing post-bootstrap initialization ... " msgstr "выполнÑетÑÑ Ð·Ð°ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ... " -#: initdb.c:2940 +#: initdb.c:3256 +#, c-format +msgid "-c %s requires a value" +msgstr "Ð´Ð»Ñ -c %s требуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ" + +#: initdb.c:3281 #, c-format msgid "Running in debug mode.\n" msgstr "Программа запущена в режиме отладки.\n" -#: initdb.c:2944 +#: initdb.c:3285 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "" "Программа запущена в режиме 'no-clean' - очиÑтки и иÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº не " "будет.\n" -#: initdb.c:3014 +#: initdb.c:3358 #, c-format msgid "unrecognized locale provider: %s" msgstr "нераÑпознанный провайдер локали: %s" -#: initdb.c:3039 +#: initdb.c:3395 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")" -#: initdb.c:3046 +#: initdb.c:3402 initdb.c:3406 initdb.c:3410 #, c-format msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgstr "%s можно указать, только еÑли выбран провайдер локали \"%s\"" -#: initdb.c:3060 initdb.c:3137 +#: initdb.c:3424 initdb.c:3487 msgid "syncing data to disk ... " msgstr "Ñохранение данных на диÑке... " -#: initdb.c:3068 +#: initdb.c:3432 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ запроÑить пароль и прочитать пароль из файла" -#: initdb.c:3090 -#, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "аргументом --wal-segsize должно быть чиÑло" - -#: initdb.c:3092 +#: initdb.c:3443 #, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "аргументом --wal-segsize должна быть Ñтепень 2 от 1 до 1024" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "аргументом %s должна быть Ñтепень двух от 1 до 1024" -#: initdb.c:3106 +#: initdb.c:3456 #, c-format msgid "" "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" @@ -1063,7 +1167,7 @@ msgstr "" "Ð¸Ð¼Ñ \"%s\" Ð´Ð»Ñ ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ допуÑкаетÑÑ; имена ролей не могут " "начинатьÑÑ Ñ \"pg_\"" -#: initdb.c:3108 +#: initdb.c:3458 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -1074,17 +1178,17 @@ msgstr "" "От его имени также будет запуÑкатьÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑ Ñервера.\n" "\n" -#: initdb.c:3124 +#: initdb.c:3474 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Контроль целоÑтноÑти Ñтраниц данных включён.\n" -#: initdb.c:3126 +#: initdb.c:3476 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Контроль целоÑтноÑти Ñтраниц данных отключён.\n" -#: initdb.c:3143 +#: initdb.c:3493 #, c-format msgid "" "\n" @@ -1095,12 +1199,12 @@ msgstr "" "Сохранение данных на диÑк пропуÑкаетÑÑ.\n" "Каталог данных может повредитьÑÑ Ð¿Ñ€Ð¸ Ñбое операционной ÑиÑтемы.\n" -#: initdb.c:3148 +#: initdb.c:3498 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "включение метода аутентификации \"trust\" Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… подключений" -#: initdb.c:3149 +#: initdb.c:3499 #, c-format msgid "" "You can change this by editing pg_hba.conf or using the option -A, or --auth-" @@ -1110,11 +1214,11 @@ msgstr "" "initdb Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð¼ -A, --auth-local или --auth-host." #. translator: This is a placeholder in a shell command. -#: initdb.c:3179 +#: initdb.c:3529 msgid "logfile" msgstr "файл_журнала" -#: initdb.c:3181 +#: initdb.c:3531 #, c-format msgid "" "\n" @@ -1129,6 +1233,46 @@ msgstr "" " %s\n" "\n" +#, c-format +#~ msgid " ICU locale: %s\n" +#~ msgstr " локаль ICU: %s\n" + +#, c-format +#~ msgid "argument of --wal-segsize must be a number" +#~ msgstr "аргументом --wal-segsize должно быть чиÑло" + +#, c-format +#~ msgid "could not identify current directory: %m" +#~ msgstr "не удалоÑÑŒ определить текущий каталог: %m" + +#, c-format +#~ msgid "could not change directory to \"%s\": %m" +#~ msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m" + +#, c-format +#~ msgid "could not read symbolic link \"%s\": %m" +#~ msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m" + +#, c-format +#~ msgid "could not load library \"%s\": error code %lu" +#~ msgstr "не удалоÑÑŒ загрузить библиотеку \"%s\" (код ошибки: %lu)" + +#, c-format +#~ msgid "cannot create restricted tokens on this platform: error code %lu" +#~ msgstr "в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры (код ошибки: %lu)" + +#, c-format +#~ msgid "could not stat file or directory \"%s\": %m" +#~ msgstr "не удалоÑÑŒ получить информацию о файле или каталоге \"%s\": %m" + +#, c-format +#~ msgid "The default database encoding has been set to \"%s\".\n" +#~ msgstr "Ð’ качеÑтве кодировки БД по умолчанию уÑтановлена \"%s\".\n" + +#, c-format +#~ msgid "symlinks are not supported on this platform" +#~ msgstr "ÑимволичеÑкие ÑÑылки не поддерживаютÑÑ Ð² Ñтой ОС" + #~ msgid "fatal: " #~ msgstr "важно: " @@ -1171,9 +1315,6 @@ msgstr "" #~ msgid "%s: locale name too long, skipped: \"%s\"\n" #~ msgstr "%s: Ñлишком длинное Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸, пропущено: \"%s\"\n" -#~ msgid "%s: locale name has non-ASCII characters, skipped: \"%s\"\n" -#~ msgstr "%s: Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ Ñодержит не ASCII-Ñимволы, пропущено: \"%s\"\n" - #~ msgid "No usable system locales were found.\n" #~ msgstr "Пригодные локали в ÑиÑтеме не найдены.\n" diff --git a/src/bin/initdb/po/sv.po b/src/bin/initdb/po/sv.po index 98ef72f11f0b4..58183c91295e7 100644 --- a/src/bin/initdb/po/sv.po +++ b/src/bin/initdb/po/sv.po @@ -1,5 +1,5 @@ # Swedish message translation file for initdb -# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. +# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025. # Magnus Hagander , 2007. # Peter Eisentraut , 2009. # Mats Erik Andersson , 2014. @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-16 19:19+0000\n" -"PO-Revision-Date: 2022-09-17 07:24+0200\n" +"POT-Creation-Date: 2025-02-12 13:51+0000\n" +"PO-Revision-Date: 2025-02-12 20:46+0100\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -40,85 +40,103 @@ msgstr "detalj: " msgid "hint: " msgstr "tips: " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "kunde inte identifiera aktuell katalog: %m" +msgid "invalid binary \"%s\": %m" +msgstr "ogiltig binär \"%s\": %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "ogiltig binär \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "kunde inte läsa binär \"%s\": %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "kunde inte läsa binär \"%s\"" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "kunde inte hitta en \"%s\" att köra" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "kunde inte byta katalog till \"%s\": %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "kunde inte konvertera sökvägen \"%s\" till en absolut sökväg: %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:382 initdb.c:750 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "kan inte läsa symbolisk länk \"%s\": %m" +msgid "could not execute command \"%s\": %m" +msgstr "kunde inte köra kommandot \"%s\": %m" -#: ../../common/exec.c:422 +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "kunde inte läsa frÃ¥n kommando \"%s\": %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "ingen data returnerades frÃ¥n kommandot \"%s\"" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() misslyckades: %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: initdb.c:334 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: initdb.c:372 initdb.c:408 #, c-format msgid "out of memory" msgstr "slut pÃ¥ minne" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "slut pÃ¥ minne\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "kunde inte öppna fil \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 #, c-format msgid "could not stat file \"%s\": %m" msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" -#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "detta bygge stöder inte synkmetod \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: ../../common/pgfnames.c:48 ../../common/rmtree.c:63 #, c-format msgid "could not open directory \"%s\": %m" msgstr "kunde inte öppna katalog \"%s\": %m" -#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: ../../common/pgfnames.c:69 ../../common/rmtree.c:106 #, c-format msgid "could not read directory \"%s\": %m" msgstr "kunde inte läsa katalog \"%s\": %m" -#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 -#: ../../common/file_utils.c:365 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "kunde inte öppna fil \"%s\": %m" - -#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "kunde inte fsync:a fil \"%s\": %m" -#: ../../common/file_utils.c:383 +#: ../../common/file_utils.c:498 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" @@ -128,55 +146,45 @@ msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" msgid "could not close directory \"%s\": %m" msgstr "kunde inte stänga katalog \"%s\": %m" -#: ../../common/restricted_token.c:64 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "kunde inte ladda länkbibliotek \"%s\": felkod %lu" - -#: ../../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "kan inte skapa token för begränsad Ã¥tkomst pÃ¥ denna plattorm: felkod %lu" - -#: ../../common/restricted_token.c:82 +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "kunde inte öppna process-token: felkod %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "kunde inte allokera SID: felkod %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "kunde inte skapa token för begränsad Ã¥tkomst: felkod %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "kunde inte starta process för kommando \"%s\": felkod %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "kunde inte köra igen med token för begränsad Ã¥tkomst: felkod %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "kunde inte hämta statuskod för underprocess: felkod %lu" -#: ../../common/rmtree.c:79 +#: ../../common/rmtree.c:97 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "kunde inte ta status pÃ¥ fil eller katalog \"%s\": %m" +msgid "could not remove file \"%s\": %m" +msgstr "kunde inte ta bort fil \"%s\": %m" -#: ../../common/rmtree.c:101 ../../common/rmtree.c:113 +#: ../../common/rmtree.c:124 #, c-format -msgid "could not remove file or directory \"%s\": %m" -msgstr "kunde inte ta bort fil eller katalog \"%s\": %m" +msgid "could not remove directory \"%s\": %m" +msgstr "kunde inte ta bort katalog \"%s\": %m" #: ../../common/username.c:43 #, c-format @@ -192,191 +200,231 @@ msgstr "användaren finns inte" msgid "user name lookup failure: error code %lu" msgstr "misslyckad sökning efter användarnamn: felkod %lu" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "kommandot är inte körbart" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "kommandot kan ej hittas" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "barnprocess avslutade med kod %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "barnprocess terminerades med avbrott 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "barnprocess terminerades av signal %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "barnprocess avslutade med okänd statuskod %d" -#: ../../port/dirmod.c:221 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s mÃ¥ste vara i intervallet %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "okänd synkmetod: %s" + +#: ../../fe_utils/string_utils.c:608 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "shell-kommandots argument innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:781 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "databasnamnet innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: ../../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" msgstr "kunde inte sätta en knutpunkt (junction) för \"%s\": %s\n" -#: ../../port/dirmod.c:298 +#: ../../port/dirmod.c:367 #, c-format msgid "could not get junction for \"%s\": %s\n" msgstr "kunde inte fÃ¥ en knutpunkt (junction) för \"%s\": %s\n" -#: initdb.c:464 initdb.c:1459 +#: initdb.c:369 +#, c-format +msgid "_wsetlocale() failed" +msgstr "_wsetlocale() misslyckades" + +#: initdb.c:376 +#, c-format +msgid "setlocale() failed" +msgstr "setlocale() misslyckades" + +#: initdb.c:390 +#, c-format +msgid "failed to restore old locale" +msgstr "misslyckades med att Ã¥terställa gamla lokalen" + +#: initdb.c:393 +#, c-format +msgid "failed to restore old locale \"%s\"" +msgstr "misslyckades med att Ã¥terställa gamla lokalen \"%s\"" + +#: initdb.c:682 initdb.c:1674 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "kunde inte öppna filen \"%s\" för läsning: %m" -#: initdb.c:505 initdb.c:809 initdb.c:829 +#: initdb.c:726 initdb.c:1030 initdb.c:1050 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "kunde inte öppna fil \"%s\" för skrivning: %m" -#: initdb.c:509 initdb.c:812 initdb.c:831 +#: initdb.c:730 initdb.c:1033 initdb.c:1052 #, c-format msgid "could not write file \"%s\": %m" msgstr "kunde inte skriva fil \"%s\": %m" -#: initdb.c:513 +#: initdb.c:734 #, c-format msgid "could not close file \"%s\": %m" msgstr "kunde inte stänga fil \"%s\": %m" -#: initdb.c:529 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "kunde inte köra kommandot \"%s\": %m" - -#: initdb.c:547 +#: initdb.c:768 #, c-format msgid "removing data directory \"%s\"" msgstr "tar bort datakatalog \"%s\"" -#: initdb.c:549 +#: initdb.c:770 #, c-format msgid "failed to remove data directory" msgstr "misslyckades med att ta bort datakatalog" -#: initdb.c:553 +#: initdb.c:774 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "tar bort innehÃ¥llet i datakatalog \"%s\"" -#: initdb.c:556 +#: initdb.c:777 #, c-format msgid "failed to remove contents of data directory" msgstr "misslyckades med att ta bort innehÃ¥llet i datakatalogen" -#: initdb.c:561 +#: initdb.c:782 #, c-format msgid "removing WAL directory \"%s\"" msgstr "tar bort WAL-katalog \"%s\"" -#: initdb.c:563 +#: initdb.c:784 #, c-format msgid "failed to remove WAL directory" msgstr "misslyckades med att ta bort WAL-katalog" -#: initdb.c:567 +#: initdb.c:788 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "tar bort innehÃ¥llet i WAL-katalog \"%s\"" -#: initdb.c:569 +#: initdb.c:790 #, c-format msgid "failed to remove contents of WAL directory" msgstr "misslyckades med att ta bort innehÃ¥llet i WAL-katalogen" -#: initdb.c:576 +#: initdb.c:797 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "datakatalog \"%s\" är ej borttagen pÃ¥ användares begäran" -#: initdb.c:580 +#: initdb.c:801 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "WAL-katalog \"%s\" är ej borttagen pÃ¥ användares begäran" -#: initdb.c:598 +#: initdb.c:819 #, c-format msgid "cannot be run as root" msgstr "kan inte köras som root" -#: initdb.c:599 +#: initdb.c:820 #, c-format msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." msgstr "Logga in (t.ex. med \"su\") som den (opriviligerade) användare som skall äga serverprocessen." -#: initdb.c:631 +#: initdb.c:852 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "\"%s\" är inte en giltig teckenkodning för servern" -#: initdb.c:775 +#: initdb.c:996 #, c-format msgid "file \"%s\" does not exist" msgstr "filen \"%s\" finns inte" -#: initdb.c:776 initdb.c:781 initdb.c:788 +#: initdb.c:997 initdb.c:1002 initdb.c:1009 #, c-format msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." msgstr "Detta kan betyda att du har en korrupt installation eller att du har angivit felaktig katalog till flaggan -L." -#: initdb.c:780 +#: initdb.c:1001 #, c-format msgid "could not access file \"%s\": %m" msgstr "kunde inte komma Ã¥t filen \"%s\": %m" -#: initdb.c:787 +#: initdb.c:1008 #, c-format msgid "file \"%s\" is not a regular file" msgstr "filen \"%s\" är inte en normal fil" -#: initdb.c:922 +#: initdb.c:1141 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "väljer mekanism för dynamiskt, delat minne ... " -#: initdb.c:931 +#: initdb.c:1150 #, c-format -msgid "selecting default max_connections ... " -msgstr "sätter förvalt värde för max_connections ... " +msgid "selecting default \"max_connections\" ... " +msgstr "sätter förvalt värde för \"max_connections\" ... " -#: initdb.c:962 +#: initdb.c:1170 #, c-format -msgid "selecting default shared_buffers ... " -msgstr "sätter förvalt värde för shared_buffers ... " +msgid "selecting default \"shared_buffers\" ... " +msgstr "sätter förvalt värde för \"shared_buffers\" ... " -#: initdb.c:996 +#: initdb.c:1193 #, c-format msgid "selecting default time zone ... " msgstr "sätter förvalt värde för tidszon ... " -#: initdb.c:1030 +#: initdb.c:1272 msgid "creating configuration files ... " msgstr "skapar konfigurationsfiler ... " -#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299 +#: initdb.c:1425 initdb.c:1439 initdb.c:1506 initdb.c:1517 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "kunde inte ändra rättigheter pÃ¥ \"%s\": %m" -#: initdb.c:1319 +#: initdb.c:1536 #, c-format msgid "running bootstrap script ... " msgstr "kör uppsättningsskript..." -#: initdb.c:1331 +#: initdb.c:1548 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "indatafil \"%s\" tillhör inte PostgreSQL %s" @@ -385,100 +433,125 @@ msgstr "indatafil \"%s\" tillhör inte PostgreSQL %s" # with a standard directory "/usr/local/pgsql", is such that # the translated message string produces a reasonable output. # -#: initdb.c:1333 +#: initdb.c:1550 #, c-format msgid "Specify the correct path using the option -L." msgstr "Ange korrekt sökväg med flaggan -L." -#: initdb.c:1437 +#: initdb.c:1652 msgid "Enter new superuser password: " msgstr "Mata in ett nytt lösenord för superuser: " -#: initdb.c:1438 +#: initdb.c:1653 msgid "Enter it again: " msgstr "Mata in det igen: " -#: initdb.c:1441 +#: initdb.c:1656 #, c-format msgid "Passwords didn't match.\n" msgstr "Lösenorden stämde inte överens.\n" -#: initdb.c:1465 +#: initdb.c:1680 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "kunde inte läsa lösenord i filen \"%s\": %m" -#: initdb.c:1468 +#: initdb.c:1683 #, c-format msgid "password file \"%s\" is empty" msgstr "lösenordsfilen \"%s\" är tom" -#: initdb.c:1915 +#: initdb.c:2095 #, c-format msgid "caught signal\n" msgstr "mottog signal\n" -#: initdb.c:1921 +#: initdb.c:2101 #, c-format msgid "could not write to child process: %s\n" msgstr "kunde inte skriva till barnprocess: %s\n" -#: initdb.c:1929 +#: initdb.c:2109 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2018 +#: initdb.c:2191 initdb.c:2237 #, c-format -msgid "setlocale() failed" -msgstr "setlocale() misslyckades" +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "lokalnamn \"%s\" innehÃ¥ller tecken som ej är ASCII" -#: initdb.c:2036 -#, c-format -msgid "failed to restore old locale \"%s\"" -msgstr "misslyckades med att Ã¥terställa gamla lokalen \"%s\"" - -#: initdb.c:2043 +#: initdb.c:2217 #, c-format msgid "invalid locale name \"%s\"" msgstr "ogiltigt lokalnamn \"%s\"" -#: initdb.c:2054 +#: initdb.c:2218 +#, c-format +msgid "If the locale name is specific to ICU, use --icu-locale." +msgstr "Om lokalnamnet är specifikt för ICU, använd --icu-locale." + +#: initdb.c:2231 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "ogiltig lokalinställning. Kontrollera miljövariablerna LANG och LC_*" -#: initdb.c:2080 initdb.c:2104 +#: initdb.c:2262 initdb.c:2286 #, c-format msgid "encoding mismatch" msgstr "teckenkodning matchar inte" -#: initdb.c:2081 +#: initdb.c:2263 #, c-format msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." msgstr "Teckenkodningen du har valt (%s) och teckenkodningen som valda lokalen använder (%s) passar inte ihop. Detta kommer leda till problem för funktioner som arbetar med strängar." -#: initdb.c:2086 initdb.c:2107 +#: initdb.c:2268 initdb.c:2289 #, c-format msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." msgstr "Kör %s igen och ange antingen ingen explicit kodning eller välj en matchande kombination." -#: initdb.c:2105 +#: initdb.c:2287 #, c-format msgid "The encoding you selected (%s) is not supported with the ICU provider." msgstr "Den valda teckenkodningen (%s) stöds inte av ICU." -#: initdb.c:2169 +#: initdb.c:2338 #, c-format -msgid "ICU locale must be specified" -msgstr "ICU-lokal mÃ¥ste anges" +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "kunde inte konvertera lokalnamn \"%s\" till sprÃ¥ktagg: %s" -#: initdb.c:2176 +#: initdb.c:2344 initdb.c:2396 initdb.c:2488 #, c-format msgid "ICU is not supported in this build" msgstr "ICU stöds inte av detta bygge" -#: initdb.c:2187 +#: initdb.c:2367 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "kunde inte härleda sprÃ¥k frÃ¥n lokalen \"%s\": %s" + +#: initdb.c:2393 +#, c-format +msgid "locale \"%s\" has unknown language \"%s\"" +msgstr "lokalen \"%s\" har ett okänt sprÃ¥k \"%s\"" + +#: initdb.c:2454 +#, c-format +msgid "locale must be specified if provider is %s" +msgstr "lokal mÃ¥ste anges när leverantören är %s" + +#: initdb.c:2465 +#, c-format +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "ogiltigt lokalnamn \"%s\" för inbyggd leverantör" + +#: initdb.c:2476 +#, c-format +msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" +msgstr "Använder sprÃ¥ktagg \"%s\" för ICU-lokal \"%s\".\n" + +#: initdb.c:2499 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" @@ -487,17 +560,17 @@ msgstr "" "%s initierar ett databaskluster för PostgreSQL.\n" "\n" -#: initdb.c:2188 +#: initdb.c:2500 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: initdb.c:2189 +#: initdb.c:2501 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [FLAGGA]... [DATAKATALOG]\n" -#: initdb.c:2190 +#: initdb.c:2502 #, c-format msgid "" "\n" @@ -506,52 +579,57 @@ msgstr "" "\n" "Flaggor:\n" -#: initdb.c:2191 +#: initdb.c:2503 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, --auth=METOD förvald autentiseringsmetod för alla anslutningar\n" -#: initdb.c:2192 +#: initdb.c:2504 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr " --auth-host=METOD autentiseringsmetod för TCP/IP-anslutningar\n" -#: initdb.c:2193 +#: initdb.c:2505 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr " --auth-local=METOD autentiseringsmetod för anslutningar via unix-uttag\n" -#: initdb.c:2194 +#: initdb.c:2506 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D, --pgdata=]DATAKATALOG läge för detta databaskluster\n" -#: initdb.c:2195 +#: initdb.c:2507 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=KODNING sätter teckenkodning för nya databaser\n" -#: initdb.c:2196 +#: initdb.c:2508 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr " -g, --allow-group-access tillÃ¥t läs/kör för grupp pÃ¥ datakatalogen\n" -#: initdb.c:2197 +#: initdb.c:2509 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" msgstr " --icu-locale=LOKAL sätt ID för ICU-lokal för nya databaser\n" -#: initdb.c:2198 +#: initdb.c:2510 +#, c-format +msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" +msgstr " --icu-rules=REGLER sätt ytterligare ICU-jämförelseregler för nya databaser\n" + +#: initdb.c:2511 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums använd checksummor pÃ¥ datablock\n" -#: initdb.c:2199 +#: initdb.c:2512 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOKAL sätt standardlokal för nya databaser\n" -#: initdb.c:2200 +#: initdb.c:2513 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -564,26 +642,35 @@ msgstr "" " sätter standardlokal i utvald kategori för\n" " nya databaser (förval hämtas ur omgivningen)\n" -#: initdb.c:2204 +#: initdb.c:2517 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale samma som --locale=C\n" -#: initdb.c:2205 +#: initdb.c:2518 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --builtin-locale=LOCALE\n" +" set builtin locale name for new databases\n" +msgstr "" +" --builtin-locale=LOKAL\n" +" sätt standard lokalnamn för nya databaser\n" + +#: initdb.c:2520 +#, c-format +msgid "" +" --locale-provider={builtin|libc|icu}\n" " set default locale provider for new databases\n" msgstr "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " sätt standard lokalleverantör för nya databaser\n" -#: initdb.c:2207 +#: initdb.c:2522 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=FIL läser lösenord för superuser frÃ¥n fil\n" -#: initdb.c:2208 +#: initdb.c:2523 #, c-format msgid "" " -T, --text-search-config=CFG\n" @@ -592,27 +679,27 @@ msgstr "" " -T, --text-search-config=CFG\n" " standardkonfiguration för textsökning\n" -#: initdb.c:2210 +#: initdb.c:2525 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NAMN namn pÃ¥ databasens superuser\n" -#: initdb.c:2211 +#: initdb.c:2526 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt efterfrÃ¥ga lösenord för superuser\n" -#: initdb.c:2212 +#: initdb.c:2527 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR katalog för write-ahead-log (WAL)\n" -#: initdb.c:2213 +#: initdb.c:2528 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=STORLEK storlek pÃ¥ WAL-segment i megabyte\n" -#: initdb.c:2214 +#: initdb.c:2529 #, c-format msgid "" "\n" @@ -621,47 +708,57 @@ msgstr "" "\n" "Mindre vanliga flaggor:\n" -#: initdb.c:2215 +#: initdb.c:2530 +#, c-format +msgid " -c, --set NAME=VALUE override default setting for server parameter\n" +msgstr " -c, --set NAMN=VÄRDE ersätt standardinställning för serverparameter\n" + +#: initdb.c:2531 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug generera massor med debug-utskrifter\n" -#: initdb.c:2216 +#: initdb.c:2532 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches sätt debug_discard_caches=1\n" -#: initdb.c:2217 +#: initdb.c:2533 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L KATALOG katalog där indatafiler skall sökas\n" -#: initdb.c:2218 +#: initdb.c:2534 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean städa inte upp efter fel\n" -#: initdb.c:2219 +#: initdb.c:2535 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync vänta inte pÃ¥ att ändingar säkert skrivits till disk\n" -#: initdb.c:2220 +#: initdb.c:2536 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions skriv inte instruktioner för nästa steg\n" -#: initdb.c:2221 +#: initdb.c:2537 +#, c-format +msgid " -s, --show show internal settings, then exit\n" +msgstr " -s, --show visa interna inställningar, avsluta sedan\n" + +#: initdb.c:2538 #, c-format -msgid " -s, --show show internal settings\n" -msgstr " -s, --show visa interna inställningar\n" +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METOD sätt synkmetod för att synka filer till disk\n" -#: initdb.c:2222 +#: initdb.c:2539 #, c-format msgid " -S, --sync-only only sync database files to disk, then exit\n" msgstr " -S, --sync-only synka bara databasfiler till disk, avsluta seden\n" -#: initdb.c:2223 +#: initdb.c:2540 #, c-format msgid "" "\n" @@ -670,17 +767,17 @@ msgstr "" "\n" "Andra flaggor:\n" -#: initdb.c:2224 +#: initdb.c:2541 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: initdb.c:2225 +#: initdb.c:2542 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: initdb.c:2226 +#: initdb.c:2543 #, c-format msgid "" "\n" @@ -690,7 +787,7 @@ msgstr "" "\n" "Om datakatalogen inte anges sÃ¥ tas den frÃ¥n omgivningsvariabeln PGDATA.\n" -#: initdb.c:2228 +#: initdb.c:2545 #, c-format msgid "" "\n" @@ -699,72 +796,72 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: initdb.c:2229 +#: initdb.c:2546 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: initdb.c:2257 +#: initdb.c:2570 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "ogiltig autentiseringsmetod \"%s\" för anslutning av typen \"%s\"" -#: initdb.c:2271 +#: initdb.c:2584 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "du mÃ¥ste ange ett lösenord för superuser för att kunna slÃ¥ pÃ¥ lösenordsautentisering" -#: initdb.c:2290 +#: initdb.c:2603 #, c-format msgid "no data directory specified" msgstr "ingen datakatalog angiven" -#: initdb.c:2291 +#: initdb.c:2604 #, c-format msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." msgstr "Du mÃ¥ste uppge den katalog där data för detta databassystem skall lagras. Gör det antingen med flaggan -D eller genom att sätta omgivningsvariabeln PGDATA." -#: initdb.c:2308 +#: initdb.c:2621 #, c-format msgid "could not set environment" msgstr "kunde inte sätta omgivningen" -#: initdb.c:2326 +#: initdb.c:2639 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"" -#: initdb.c:2329 +#: initdb.c:2642 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s" -#: initdb.c:2344 +#: initdb.c:2657 #, c-format msgid "input file location must be an absolute path" msgstr "plats för indatafiler mÃ¥ste vara en absolut sökväg" -#: initdb.c:2361 +#: initdb.c:2674 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "Databasklustret kommer att skapas med lokalnamn \"%s\".\n" -#: initdb.c:2364 +#: initdb.c:2677 #, c-format msgid "The database cluster will be initialized with this locale configuration:\n" msgstr "Databasklustret kommer att initieras med denna lokalkonfiguration:\n" -#: initdb.c:2365 +#: initdb.c:2678 #, c-format -msgid " provider: %s\n" -msgstr " leverantör: %s\n" +msgid " locale provider: %s\n" +msgstr " lokalleverantör: %s\n" -#: initdb.c:2367 +#: initdb.c:2680 #, c-format -msgid " ICU locale: %s\n" -msgstr " ICU-lokal: %s\n" +msgid " default collation: %s\n" +msgstr " standardjämförelse: %s\n" -#: initdb.c:2368 +#: initdb.c:2681 #, c-format msgid "" " LC_COLLATE: %s\n" @@ -781,27 +878,22 @@ msgstr "" " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2385 -#, c-format -msgid "The default database encoding has been set to \"%s\".\n" -msgstr "Förvald teckenkodning för databaser är satt till \"%s\".\n" - -#: initdb.c:2397 +#: initdb.c:2711 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "kunde inte välja en lämplig kodning för lokal \"%s\"" -#: initdb.c:2399 +#: initdb.c:2713 #, c-format msgid "Rerun %s with the -E option." msgstr "Kör %s igen men med flaggan -E." -#: initdb.c:2400 initdb.c:3021 initdb.c:3041 +#: initdb.c:2714 initdb.c:3257 initdb.c:3377 initdb.c:3397 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: initdb.c:2412 +#: initdb.c:2726 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -810,112 +902,112 @@ msgstr "" "Teckenkodning \"%s\", tagen ur lokalnamnet, är inte godtagbar för servern.\n" "I dess ställe sättes databasens förvalda teckenkodning till \"%s\".\n" -#: initdb.c:2417 +#: initdb.c:2731 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "lokalen \"%s\" kräver ej supportad teckenkodning \"%s\"" -#: initdb.c:2419 +#: initdb.c:2733 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "Teckenkodning \"%s\" tillÃ¥ts inte som serverteckenkodning." -#: initdb.c:2421 +#: initdb.c:2735 #, c-format msgid "Rerun %s with a different locale selection." msgstr "Kör %s igen men välj en annan lokal." -#: initdb.c:2429 +#: initdb.c:2743 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "Förvald teckenkodning för databaser är satt till \"%s\".\n" -#: initdb.c:2498 +#: initdb.c:2757 +#, c-format +msgid "builtin provider locale \"%s\" requires encoding \"%s\"" +msgstr "lokal \"%s\" för inbyggd leverantör kräver teckenkodning \"%s\"" + +#: initdb.c:2819 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "kunde inte hitta en lämplig textsökningskonfiguration för lokalnamn \"%s\"" -#: initdb.c:2509 +#: initdb.c:2830 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "ingen lämplig textsökningskonfiguration för lokalnamn \"%s\"" -#: initdb.c:2514 +#: initdb.c:2835 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "uppgiven textsökningskonfiguration \"%s\" passar kanske inte till lokalnamn \"%s\"" -#: initdb.c:2519 +#: initdb.c:2840 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "Förvald textsökningskonfiguration för databaser är satt till \"%s\".\n" -#: initdb.c:2562 initdb.c:2633 +#: initdb.c:2883 initdb.c:2954 #, c-format msgid "creating directory %s ... " msgstr "skapar katalog %s ... " -#: initdb.c:2567 initdb.c:2638 initdb.c:2690 initdb.c:2746 +#: initdb.c:2888 initdb.c:2959 initdb.c:3007 initdb.c:3064 #, c-format msgid "could not create directory \"%s\": %m" msgstr "kunde inte skapa katalog \"%s\": %m" -#: initdb.c:2576 initdb.c:2648 +#: initdb.c:2897 initdb.c:2969 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "sätter rättigheter pÃ¥ existerande katalog %s ... " -#: initdb.c:2581 initdb.c:2653 +#: initdb.c:2902 initdb.c:2974 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "kunde inte ändra rättigheter pÃ¥ katalogen \"%s\": %m" -#: initdb.c:2593 initdb.c:2665 +#: initdb.c:2914 initdb.c:2986 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "katalogen \"%s\" existerar men är inte tom" -#: initdb.c:2597 +#: initdb.c:2918 #, c-format msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." msgstr "Om du vill skapa ett nytt databassystem, tag dÃ¥ antingen bort eller töm katalogen \"%s\" eller kör %s med annat argument än \"%s\"." -#: initdb.c:2605 initdb.c:2675 initdb.c:3058 +#: initdb.c:2926 initdb.c:2996 initdb.c:3422 #, c-format msgid "could not access directory \"%s\": %m" msgstr "kunde inte komma Ã¥t katalog \"%s\": %m" -#: initdb.c:2626 +#: initdb.c:2947 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL-katalogen mÃ¥ste vara en absolut sökväg" -#: initdb.c:2669 +#: initdb.c:2990 #, c-format msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." msgstr "Om du vill spara WAL där, antingen radera eller töm katalogen \"%s\"." -#: initdb.c:2680 +#: initdb.c:3000 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "kan inte skapa symbolisk länk \"%s\": %m" -#: initdb.c:2683 -#, c-format -msgid "symlinks are not supported on this platform" -msgstr "symboliska länkar stöds inte pÃ¥ denna plattform" - -#: initdb.c:2702 +#: initdb.c:3019 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." msgstr "Den innehÃ¥ller en gömd fil, med inledande punkt i namnet; kanske är detta en monteringspunkt." -#: initdb.c:2704 +#: initdb.c:3021 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point." msgstr "Den innehÃ¥ller \"lost+found\"; kanske är detta en monteringspunkt." -#: initdb.c:2706 +#: initdb.c:3023 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" @@ -924,65 +1016,65 @@ msgstr "" "Att använda en monteringspunkt som datakatalog rekommenderas inte.\n" "Skapa först en underkatalog under monteringspunkten." -#: initdb.c:2732 +#: initdb.c:3050 #, c-format msgid "creating subdirectories ... " msgstr "Skapar underkataloger ... " -#: initdb.c:2775 +#: initdb.c:3093 msgid "performing post-bootstrap initialization ... " msgstr "utför initiering efter uppstättning..." -#: initdb.c:2940 +#: initdb.c:3256 +#, c-format +msgid "-c %s requires a value" +msgstr "-c %s kräver ett värde" + +#: initdb.c:3281 #, c-format msgid "Running in debug mode.\n" msgstr "Kör i debug-läge.\n" -#: initdb.c:2944 +#: initdb.c:3285 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "Kör i no-clean-läge. Misstag kommer inte städas bort.\n" -#: initdb.c:3014 +#: initdb.c:3358 #, c-format msgid "unrecognized locale provider: %s" msgstr "okänd lokalleverantör: %s" -#: initdb.c:3039 +#: initdb.c:3395 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")" -#: initdb.c:3046 +#: initdb.c:3402 initdb.c:3406 initdb.c:3410 #, c-format msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgstr "%s kan inte anges om inte lokalleverantör \"%s\" valts" -#: initdb.c:3060 initdb.c:3137 +#: initdb.c:3424 initdb.c:3487 msgid "syncing data to disk ... " msgstr "synkar data till disk ... " -#: initdb.c:3068 +#: initdb.c:3432 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "lösenordsfrÃ¥ga och lösenordsfil kan inte anges samtidigt" -#: initdb.c:3090 -#, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "argumentet till --wal-segsize mÃ¥ste vara ett tal" - -#: initdb.c:3092 +#: initdb.c:3443 #, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "argumentet till --wal-segsize mÃ¥ste vara en tvÃ¥potens mellan 1 och 1024" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "argumentet till %s mÃ¥ste vara en tvÃ¥potens mellan 1 och 1024" -#: initdb.c:3106 +#: initdb.c:3456 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "superuser-namn \"%s\" tillÃ¥ts inte; rollnamn fÃ¥r inte börja pÃ¥ \"pg_\"" -#: initdb.c:3108 +#: initdb.c:3458 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -993,17 +1085,17 @@ msgstr "" "Denna användare mÃ¥ste ocksÃ¥ vara ägare av server-processen.\n" "\n" -#: initdb.c:3124 +#: initdb.c:3474 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Checksummor för datablock är aktiva.\n" -#: initdb.c:3126 +#: initdb.c:3476 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Checksummor för datablock är avstängda.\n" -#: initdb.c:3143 +#: initdb.c:3493 #, c-format msgid "" "\n" @@ -1014,22 +1106,22 @@ msgstr "" "Avstod frÃ¥n synkning mot lagringsmedium.\n" "Datakatalogen kan komma att fördärvas om operativsystemet störtar.\n" -#: initdb.c:3148 +#: initdb.c:3498 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "slÃ¥r pÃ¥ autentiseringsmetod \"trust\" för lokala anslutningar" -#: initdb.c:3149 +#: initdb.c:3499 #, c-format msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." msgstr "Du kan ändra detta genom att redigera pg_hba.conf eller genom att sätta flaggor -A eller --auth-local och --auth-host nästa gÃ¥ng du kör initdb." #. translator: This is a placeholder in a shell command. -#: initdb.c:3179 +#: initdb.c:3529 msgid "logfile" msgstr "loggfil" -#: initdb.c:3181 +#: initdb.c:3531 #, c-format msgid "" "\n" diff --git a/src/bin/initdb/po/uk.po b/src/bin/initdb/po/uk.po index 6eddbffc47b52..30db9471ba1ab 100644 --- a/src/bin/initdb/po/uk.po +++ b/src/bin/initdb/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:49+0000\n" -"PO-Revision-Date: 2022-09-13 12:23\n" +"POT-Creation-Date: 2025-03-29 10:39+0000\n" +"PO-Revision-Date: 2025-04-01 15:40\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/initdb.pot\n" -"X-Crowdin-File-ID: 882\n" +"X-Crowdin-File: /REL_17_STABLE/initdb.pot\n" +"X-Crowdin-File-ID: 1034\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,85 +37,103 @@ msgstr "деталі: " msgid "hint: " msgstr "підказка: " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ поточний каталог: %m" +msgid "invalid binary \"%s\": %m" +msgstr "невірний бінарний файл \"%s\": %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "невірний бінарний файл \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ бінарний файл \"%s\": %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "неможливо прочитати бінарний файл \"%s\"" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "неможливо знайти \"%s\" Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ абÑолютний шлÑÑ… \"%s\": %m" + +#: ../../common/exec.c:382 initdb.c:750 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ команду \"%s\": %m" + +#: ../../common/exec.c:394 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ каталог на \"%s\": %m" +msgid "could not read from command \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ виÑновок команди \"%s\": %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:397 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "не можливо прочитати Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m" +msgid "no data was returned by command \"%s\"" +msgstr "команда \"%s\" не повернула жодних даних" -#: ../../common/exec.c:422 +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() помилка: %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: initdb.c:334 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: initdb.c:372 initdb.c:408 #, c-format msgid "out of memory" msgstr "недоÑтатньо пам'Ñті" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "недоÑтатньо пам'Ñті\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не можливо відкрити файл \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не вдалоÑÑ Ñинхронізувати файлову ÑиÑтему Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" -#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує метод Ñинхронізації \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: ../../common/pgfnames.c:48 ../../common/rmtree.c:63 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" -#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: ../../common/pgfnames.c:69 ../../common/rmtree.c:106 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" -#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 -#: ../../common/file_utils.c:365 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "не можливо відкрити файл \"%s\": %m" - -#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "не вдалоÑÑ fsync файл \"%s\": %m" -#: ../../common/file_utils.c:383 +#: ../../common/file_utils.c:498 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" @@ -125,55 +143,45 @@ msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s msgid "could not close directory \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" -#: ../../common/restricted_token.c:64 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ бібліотеку \"%s\": код помилки %lu" - -#: ../../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "не вдалоÑÑ Ñтворити обмежені токени на цій платформі: код помилки %lu" - -#: ../../common/restricted_token.c:82 +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ токен процеÑу: код помилки %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ SID: код помилки %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "не вдалоÑÑ Ñтворити обмежений токен: код помилки %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ \"%s\": код помилки %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑтити з обмеженим токеном: код помилки %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑу: код помилки %lu" -#: ../../common/rmtree.c:79 +#: ../../common/rmtree.c:97 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про файл або каталог \"%s\": %m" +msgid "could not remove file \"%s\": %m" +msgstr "не можливо видалити файл \"%s\": %m" -#: ../../common/rmtree.c:101 ../../common/rmtree.c:113 +#: ../../common/rmtree.c:124 #, c-format -msgid "could not remove file or directory \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл або каталог \"%s\": %m" +msgid "could not remove directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ каталог \"%s\": %m" #: ../../common/username.c:43 #, c-format @@ -189,352 +197,427 @@ msgstr "кориÑтувача не Ñ–Ñнує" msgid "user name lookup failure: error code %lu" msgstr "невдала підÑтановка імені кориÑтувача: код помилки %lu" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "неможливо виконати команду" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "команду не знайдено" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· кодом виходу %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через помилку 0Ñ…%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через Ñигнал %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· невизнаним ÑтатуÑом %d" -#: ../../port/dirmod.c:221 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s має бути в діапазоні %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нерозпізнаний метод Ñинхронізації: %s" + +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "аргумент командної оболонки міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "назва бази даних міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: ../../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" msgstr "не вдалоÑÑ Ð²Ñтановити ÑÐ¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ \"%s\": %s\n" -#: ../../port/dirmod.c:298 +#: ../../port/dirmod.c:367 #, c-format msgid "could not get junction for \"%s\": %s\n" msgstr "не вдалоÑÑ Ð²Ñтановити ÑÐ¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ \"%s\": %s\n" -#: initdb.c:464 initdb.c:1459 +#: initdb.c:369 +#, c-format +msgid "_wsetlocale() failed" +msgstr "_wsetlocale() завершивÑÑ Ð½ÐµÐ²Ð´Ð°Ð»Ð¾" + +#: initdb.c:376 +#, c-format +msgid "setlocale() failed" +msgstr "setlocale() завершивÑÑ Ð½ÐµÐ²Ð´Ð°Ð»Ð¾" + +#: initdb.c:390 +#, c-format +msgid "failed to restore old locale" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ñтарі локалі" + +#: initdb.c:393 +#, c-format +msgid "failed to restore old locale \"%s\"" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ñтару локаль \"%s\"" + +#: initdb.c:682 initdb.c:1674 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m" -#: initdb.c:505 initdb.c:809 initdb.c:829 +#: initdb.c:726 initdb.c:1030 initdb.c:1050 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу: %m" -#: initdb.c:509 initdb.c:812 initdb.c:831 +#: initdb.c:730 initdb.c:1033 initdb.c:1052 #, c-format msgid "could not write file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m" -#: initdb.c:513 +#: initdb.c:734 #, c-format msgid "could not close file \"%s\": %m" msgstr "неможливо закрити файл \"%s\": %m" -#: initdb.c:529 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ команду \"%s\": %m" - -#: initdb.c:547 +#: initdb.c:768 #, c-format msgid "removing data directory \"%s\"" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з директорії \"%s\"" -#: initdb.c:549 +#: initdb.c:770 #, c-format msgid "failed to remove data directory" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ дані директорії" -#: initdb.c:553 +#: initdb.c:774 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з директорії \"%s\"" -#: initdb.c:556 +#: initdb.c:777 #, c-format msgid "failed to remove contents of data directory" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ дані директорії" -#: initdb.c:561 +#: initdb.c:782 #, c-format msgid "removing WAL directory \"%s\"" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ WAL директорії \"%s\"" -#: initdb.c:563 +#: initdb.c:784 #, c-format msgid "failed to remove WAL directory" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ директорію WAL" -#: initdb.c:567 +#: initdb.c:788 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з директорії WAL \"%s\"" -#: initdb.c:569 +#: initdb.c:790 #, c-format msgid "failed to remove contents of WAL directory" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ дані директорії WAL" -#: initdb.c:576 +#: initdb.c:797 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð°Ð½Ð¸Ñ… \"%s\" не видалена за запитом кориÑтувача" -#: initdb.c:580 +#: initdb.c:801 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ WAL \"%s\" не видалена за запитом кориÑтувача" -#: initdb.c:598 +#: initdb.c:819 #, c-format msgid "cannot be run as root" msgstr "не може виконуватиÑÑŒ Ñк root" -#: initdb.c:599 +#: initdb.c:820 #, c-format msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." msgstr "Будь лаÑка, увійдіть (за допомогою, наприклад, \"su\") Ñк (непривілейований) кориÑтувач, від імені Ñкого буде запущено Ñерверний процеÑ." -#: initdb.c:631 +#: initdb.c:852 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "\"%s\" невірне ім'Ñ Ñерверного кодуваннÑ" -#: initdb.c:775 +#: initdb.c:996 #, c-format msgid "file \"%s\" does not exist" msgstr "файл \"%s\" не Ñ–Ñнує" -#: initdb.c:776 initdb.c:781 initdb.c:788 +#: initdb.c:997 initdb.c:1002 initdb.c:1009 #, c-format msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." msgstr "Це означає, що ваша інÑталÑÑ†Ñ–Ñ Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð° або в параметрі -L задана неправильна директоріÑ." -#: initdb.c:780 +#: initdb.c:1001 #, c-format msgid "could not access file \"%s\": %m" msgstr "немає доÑтупу до файлу \"%s\": %m" -#: initdb.c:787 +#: initdb.c:1008 #, c-format msgid "file \"%s\" is not a regular file" msgstr "файл \"%s\" не Ñ” звичайним файлом" -#: initdb.c:922 +#: initdb.c:1141 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "обираєтьÑÑ Ñ€ÐµÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— Ñпільної пам'Ñті ... " -#: initdb.c:931 +#: initdb.c:1150 #, c-format -msgid "selecting default max_connections ... " -msgstr "обираєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ max_connections ... \n" +msgid "selecting default \"max_connections\" ... " +msgstr "обираєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"max_connections\" за замовчуваннÑм... \n" " " -#: initdb.c:962 +#: initdb.c:1170 #, c-format -msgid "selecting default shared_buffers ... " -msgstr "обираєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ shared_buffers... " +msgid "selecting default \"shared_buffers\" ... " +msgstr "обираєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"shared_buffers\" за замовчуваннÑм... " -#: initdb.c:996 +#: initdb.c:1193 #, c-format msgid "selecting default time zone ... " msgstr "обираєтьÑÑ Ñ‡Ð°Ñовий поÑÑ Ð·Ð° замовчуваннÑм ... " -#: initdb.c:1030 +#: initdb.c:1272 msgid "creating configuration files ... " msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ð¹Ð½Ð¸Ñ… файлів... " -#: initdb.c:1188 initdb.c:1204 initdb.c:1287 initdb.c:1299 +#: initdb.c:1425 initdb.c:1439 initdb.c:1506 initdb.c:1517 #, c-format msgid "could not change permissions of \"%s\": %m" msgstr "неможливо змінити дозволи \"%s\": %m" -#: initdb.c:1319 +#: initdb.c:1536 #, c-format msgid "running bootstrap script ... " msgstr "виконуємо Ñценарій ініціалізації ... " -#: initdb.c:1331 +#: initdb.c:1548 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" msgstr "вхідний файл \"%s\" не належить PostgreSQL %s" -#: initdb.c:1333 +#: initdb.c:1550 #, c-format msgid "Specify the correct path using the option -L." msgstr "Вкажіть правильний шлÑÑ… за допомогою параметру -L." -#: initdb.c:1437 +#: initdb.c:1652 msgid "Enter new superuser password: " msgstr "Введіть новий пароль Ð´Ð»Ñ superuser: " -#: initdb.c:1438 +#: initdb.c:1653 msgid "Enter it again: " msgstr "Введіть знову: " -#: initdb.c:1441 +#: initdb.c:1656 #, c-format msgid "Passwords didn't match.\n" msgstr "Паролі не Ñпівпадають.\n" -#: initdb.c:1465 +#: initdb.c:1680 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ пароль з файлу \"%s\": %m" -#: initdb.c:1468 +#: initdb.c:1683 #, c-format msgid "password file \"%s\" is empty" msgstr "файл з паролÑми \"%s\" Ñ” порожнім" -#: initdb.c:1915 +#: initdb.c:2095 #, c-format msgid "caught signal\n" msgstr "отримано Ñигнал\n" -#: initdb.c:1921 +#: initdb.c:2101 #, c-format msgid "could not write to child process: %s\n" msgstr "не вдалоÑÑ Ð½Ð°Ð¿Ð¸Ñати у дочірній процеÑ: %s\n" -#: initdb.c:1929 +#: initdb.c:2109 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2018 -#, c-format -msgid "setlocale() failed" -msgstr "setlocale() завершивÑÑ Ð½ÐµÐ²Ð´Ð°Ð»Ð¾" - -#: initdb.c:2036 +#: initdb.c:2191 initdb.c:2237 #, c-format -msgid "failed to restore old locale \"%s\"" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ñтару локаль \"%s\"" +msgid "locale name \"%s\" contains non-ASCII characters" +msgstr "назва локалі \"%s\" міÑтить не-ASCII Ñимволи" -#: initdb.c:2043 +#: initdb.c:2217 #, c-format msgid "invalid locale name \"%s\"" msgstr "не допуÑтиме ім'Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– \"%s\"" -#: initdb.c:2054 +#: initdb.c:2218 +#, c-format +msgid "If the locale name is specific to ICU, use --icu-locale." +msgstr "Якщо ім'Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– характерне Ð´Ð»Ñ ICU, викориÑтовуйте --icu-locale." + +#: initdb.c:2231 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "неприпуÑтимі параметри локалі; перевірте LANG та LC_* змінні Ñередовища" -#: initdb.c:2080 +#: initdb.c:2262 initdb.c:2286 #, c-format msgid "encoding mismatch" msgstr "невідповідніÑть кодуваннÑ" -#: initdb.c:2081 +#: initdb.c:2263 #, c-format msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." msgstr "Вибране вами ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ (%s) Ñ– кодуваннÑ, Ñке викориÑтовує обрана локаль (%s) не збігаютьÑÑ. Це призведе до неправильної поведінки у різних функціÑÑ… обробки Ñимвольних Ñ€Ñдків." -#: initdb.c:2086 +#: initdb.c:2268 initdb.c:2289 #, c-format msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." msgstr "ПерезапуÑтіть %s Ñ– або не вказуйте ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ñмо або виберіть відповідну комбінацію." -#: initdb.c:2148 +#: initdb.c:2287 +#, c-format +msgid "The encoding you selected (%s) is not supported with the ICU provider." +msgstr "Обране вами ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ (%s) не підтримуєтьÑÑ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ð¾Ð¼ ICU." + +#: initdb.c:2338 #, c-format -msgid "ICU locale must be specified" -msgstr "Ðеобхідно вказати локаль ICU" +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ локальну назву \"%s\" на мітку мови: %s" -#: initdb.c:2155 +#: initdb.c:2344 initdb.c:2396 initdb.c:2488 #, c-format msgid "ICU is not supported in this build" msgstr "ICU не підтримуєтьÑÑ Ð² цій збірці" -#: initdb.c:2166 +#: initdb.c:2367 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ мову з локалі \"%s\": %s" + +#: initdb.c:2393 +#, c-format +msgid "locale \"%s\" has unknown language \"%s\"" +msgstr "locale \"%s\" має невідому мову \"%s\"" + +#: initdb.c:2454 +#, c-format +msgid "locale must be specified if provider is %s" +msgstr "потрібно вказати локаль Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²Ð°Ð¹Ð´ÐµÑ€Ð° %s" + +#: initdb.c:2465 +#, c-format +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "неприпуÑтиме ім'Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– \"%s\" Ð´Ð»Ñ Ð²Ð±ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ провайдера" + +#: initdb.c:2476 +#, c-format +msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" +msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ Ð¼Ñ–Ñ‚ÐºÐ¸ мови \"%s\" Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– ICU \"%s\".\n" + +#: initdb.c:2499 #, c-format msgid "%s initializes a PostgreSQL database cluster.\n\n" msgstr "%s ініціалізує клаÑтер баз даних PostgreSQL.\n\n" -#: initdb.c:2167 +#: initdb.c:2500 #, c-format msgid "Usage:\n" msgstr "ВикориÑтаннÑ:\n" -#: initdb.c:2168 +#: initdb.c:2501 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATADIR]\n" -#: initdb.c:2169 +#: initdb.c:2502 #, c-format msgid "\n" "Options:\n" msgstr "\n" "Параметри:\n" -#: initdb.c:2170 +#: initdb.c:2503 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, -- auth=METHOD метод аутентифікації за замовчуваннÑм Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… підключень\n" -#: initdb.c:2171 +#: initdb.c:2504 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" msgstr " --auth-host=METHOD метод аутентифікації за замовчуваннÑм Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ TCP/IP підключеннÑ\n" -#: initdb.c:2172 +#: initdb.c:2505 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr " --auth-local=METHOD метод аутентифікації за замовчуваннÑм Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· Ñокет\n" -#: initdb.c:2173 +#: initdb.c:2506 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D - pgdata =] DATADIR Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»Ð°Ñтеру цієї бази даних\n" -#: initdb.c:2174 +#: initdb.c:2507 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=ENCODING вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñ— бази даних\n" -#: initdb.c:2175 +#: initdb.c:2508 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr " -g, --allow-group-access дозволити читати/виконувати у каталозі даних Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¸\n" -#: initdb.c:2176 +#: initdb.c:2509 #, c-format msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" msgstr " --icu-locale=LOCALE вÑтановлює ідентифікатор мови ICU Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… баз даних\n" -#: initdb.c:2177 +#: initdb.c:2510 +#, c-format +msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" +msgstr " --icu-rules=RULES вÑтановити додаткові правила ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² ICU Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… баз даних\n" + +#: initdb.c:2511 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums викориÑтовувати контрольні Ñуми Ñторінок\n" -#: initdb.c:2178 +#: initdb.c:2512 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE вÑтановлює локаль за замовчуваннÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… баз даних\n" -#: initdb.c:2179 +#: initdb.c:2513 #, c-format msgid " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" " --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n" @@ -545,115 +628,132 @@ msgstr " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" " вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– за замовчуваннÑм Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ñ— категорії в\n" " нових базах даних (заміÑть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð· Ñередовища)\n" -#: initdb.c:2183 +#: initdb.c:2517 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale еквівалентно --locale=C\n" -#: initdb.c:2184 +#: initdb.c:2518 #, c-format -msgid " --locale-provider={libc|icu}\n" +msgid " --builtin-locale=LOCALE\n" +" set builtin locale name for new databases\n" +msgstr " --builtin-locale=LOCALE\n" +" вÑтановити ім'Ñ Ð²Ð±ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¾Ñ— локалі Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… баз даних\n" + +#: initdb.c:2520 +#, c-format +msgid " --locale-provider={builtin|libc|icu}\n" " set default locale provider for new databases\n" -msgstr " --locale-provider={libc|icu}\n" +msgstr " --locale-provider={builtin|libc|icu}\n" " вÑтановлює провайдер локалі за замовченнÑм Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ñ… баз даних\n" -#: initdb.c:2186 +#: initdb.c:2522 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=FILE прочитати пароль Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑуперкориÑтувача з файлу\n" -#: initdb.c:2187 +#: initdb.c:2523 #, c-format msgid " -T, --text-search-config=CFG\n" " default text search configuration\n" msgstr " -T, --text-search-config=CFG ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐºÑтового пошуку за замовчуваннÑм\n" -#: initdb.c:2189 +#: initdb.c:2525 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NAME ім'Ñ ÑуперкориÑтувача бази даних\n" -#: initdb.c:2190 +#: initdb.c:2526 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt запитувати пароль нового ÑуперкориÑтувача\n" -#: initdb.c:2191 +#: initdb.c:2527 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ попереднього запиÑу\n" -#: initdb.c:2192 +#: initdb.c:2528 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=SIZE розмір Ñегментів WAL у мегабайтах\n" -#: initdb.c:2193 +#: initdb.c:2529 #, c-format msgid "\n" "Less commonly used options:\n" msgstr "\n" "Рідковживані параметри:\n" -#: initdb.c:2194 +#: initdb.c:2530 +#, c-format +msgid " -c, --set NAME=VALUE override default setting for server parameter\n" +msgstr " -c, --set NAME=VALUE перевизначити параметр за замовчуваннÑм Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° Ñервера\n" + +#: initdb.c:2531 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug генерувати багато налагоджувальних повідомлень\n" -#: initdb.c:2195 +#: initdb.c:2532 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches вÑтановити debug_discard_caches=1\n" -#: initdb.c:2196 +#: initdb.c:2533 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORY Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¸Ñ… файлів\n" -#: initdb.c:2197 +#: initdb.c:2534 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean не очищувати піÑÐ»Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº\n" " \n" -#: initdb.c:2198 +#: initdb.c:2535 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync не чекати на безпечний Ð·Ð°Ð¿Ð¸Ñ Ð·Ð¼Ñ–Ð½ на диÑк\n" -#: initdb.c:2199 +#: initdb.c:2536 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions не друкувати інÑтрукції Ð´Ð»Ñ Ð½Ð°Ñтупних кроків\n" -#: initdb.c:2200 +#: initdb.c:2537 +#, c-format +msgid " -s, --show show internal settings, then exit\n" +msgstr " -s, --show показати внутрішні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ– вийти\n" + +#: initdb.c:2538 #, c-format -msgid " -s, --show show internal settings\n" -msgstr " -s, --show показати внутрішні налаштуваннÑ\n" +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD вÑтановити метод Ñинхронізації файлів на диÑк\n" -#: initdb.c:2201 +#: initdb.c:2539 #, c-format msgid " -S, --sync-only only sync database files to disk, then exit\n" msgstr " -S, --sync-only лише Ñинхронізувати файли бази даних на диÑк, потім вийти\n" -#: initdb.c:2202 +#: initdb.c:2540 #, c-format msgid "\n" "Other options:\n" msgstr "\n" "Інші параметри:\n" -#: initdb.c:2203 +#: initdb.c:2541 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" -#: initdb.c:2204 +#: initdb.c:2542 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: initdb.c:2205 +#: initdb.c:2543 #, c-format msgid "\n" "If the data directory is not specified, the environment variable PGDATA\n" @@ -661,79 +761,79 @@ msgid "\n" msgstr "\n" "Якщо каталог даних не вказано, викориÑтовуєтьÑÑ Ð·Ð¼Ñ–Ð½Ð½Ð° Ñередовища PGDATA.\n" -#: initdb.c:2207 +#: initdb.c:2545 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "ПовідомлÑти про помилки на <%s>.\n" -#: initdb.c:2208 +#: initdb.c:2546 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" -#: initdb.c:2236 +#: initdb.c:2570 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "неприпуÑтимий ÑпоÑіб автентифікації \"%s\" Ð´Ð»Ñ \"%s\" підключеннÑ" -#: initdb.c:2250 +#: initdb.c:2584 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "необхідно вказати пароль ÑуперкориÑтувача Ð´Ð»Ñ Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ— автентифікації за допомогою паролÑ" -#: initdb.c:2269 +#: initdb.c:2603 #, c-format msgid "no data directory specified" msgstr "каталог даних не вказано" -#: initdb.c:2270 +#: initdb.c:2604 #, c-format msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." msgstr "Ви повинні зазначити каталог, де будуть зберігатиÑÑ Ð´Ð°Ð½Ñ– цієї ÑиÑтеми баз даних. Зробіть це або параметром -D, або змінною Ñередовища PGDATA." -#: initdb.c:2287 +#: initdb.c:2621 #, c-format msgid "could not set environment" msgstr "не вдалоÑÑ Ð²Ñтановити Ñередовище" -#: initdb.c:2305 +#: initdb.c:2639 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "програма \"%s\" потрібна Ð´Ð»Ñ %s, але не знайдена в тому ж каталозі, що й \"%s\"" -#: initdb.c:2308 +#: initdb.c:2642 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "програма \"%s\" знайдена Ð´Ð»Ñ \"%s\", але має відмінну верÑÑ–ÑŽ від %s" -#: initdb.c:2323 +#: initdb.c:2657 #, c-format msgid "input file location must be an absolute path" msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ…Ñ–Ð´Ð½Ð¾Ð³Ð¾ файлу має бути абÑолютним шлÑхом" -#: initdb.c:2340 +#: initdb.c:2674 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "КлаÑтер бази даних буде ініціалізовано з локалізацією \"%s\".\n" -#: initdb.c:2343 +#: initdb.c:2677 #, c-format msgid "The database cluster will be initialized with this locale configuration:\n" msgstr "КлаÑтер бази даних буде ініціалізовано з локалізацією:\n" -#: initdb.c:2344 +#: initdb.c:2678 #, c-format -msgid " provider: %s\n" -msgstr " поÑтачальник: %s\n" +msgid " locale provider: %s\n" +msgstr " провайдер локалі: %s\n" -#: initdb.c:2346 +#: initdb.c:2680 #, c-format -msgid " ICU locale: %s\n" -msgstr " Локаль ICU: %s\n" +msgid " default collation: %s\n" +msgstr " Ñтандартне ÑортуваннÑ: %s\n" -#: initdb.c:2347 +#: initdb.c:2681 #, c-format msgid " LC_COLLATE: %s\n" " LC_CTYPE: %s\n" @@ -748,216 +848,216 @@ msgstr " LC_COLLATE: %s\n" " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2372 +#: initdb.c:2711 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ відповідне ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– \"%s\"" -#: initdb.c:2374 +#: initdb.c:2713 #, c-format msgid "Rerun %s with the -E option." msgstr "ПерезапуÑтіть %s з параметром -E." -#: initdb.c:2375 initdb.c:2992 initdb.c:3012 +#: initdb.c:2714 initdb.c:3257 initdb.c:3377 initdb.c:3397 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." -#: initdb.c:2387 +#: initdb.c:2726 #, c-format msgid "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" "The default database encoding will be set to \"%s\" instead.\n" msgstr "ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\", що очікуєтьÑÑ Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ”ÑŽ, не дозволено у ÑкоÑті ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера.\n" "ЗаміÑть нього буде вÑтановлене ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" за замовчуваннÑм.\n" -#: initdb.c:2392 +#: initdb.c:2731 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "Ð»Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ \"%s\" потребує ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\", що не підтримуєтьÑÑ" -#: initdb.c:2394 +#: initdb.c:2733 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" не допуÑкаєтьÑÑ Ñк ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера." -#: initdb.c:2396 +#: initdb.c:2735 #, c-format msgid "Rerun %s with a different locale selection." msgstr "ПерезапуÑтіть %s з іншим вибором локалі." -#: initdb.c:2404 +#: initdb.c:2743 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "ÐšÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних за замовчуваннÑм вÑтановлено: \"%s\".\n" -#: initdb.c:2469 +#: initdb.c:2757 +#, c-format +msgid "builtin provider locale \"%s\" requires encoding \"%s\"" +msgstr "локаль вбудованого провайдера \"%s\" вимагає ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"" + +#: initdb.c:2819 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ відповідну конфігурацію текÑтового пошуку Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ–\"%s\"" -#: initdb.c:2480 +#: initdb.c:2830 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "відповідна ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐºÑтового пошуку Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– \"%s\" невідома" -#: initdb.c:2485 +#: initdb.c:2835 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "вказана ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐºÑтового пошуку \"%s\" може не підходити локалі \"%s\"" -#: initdb.c:2490 +#: initdb.c:2840 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ‚ÐµÐºÑтового пошуку за замовчуваннÑм буде вÑтановлена в \"%s\".\n" -#: initdb.c:2533 initdb.c:2604 +#: initdb.c:2883 initdb.c:2954 #, c-format msgid "creating directory %s ... " msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ %s... " -#: initdb.c:2538 initdb.c:2609 initdb.c:2661 initdb.c:2717 +#: initdb.c:2888 initdb.c:2959 initdb.c:3007 initdb.c:3064 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не вдалоÑÑ Ñтворити каталог \"%s\": %m" -#: initdb.c:2547 initdb.c:2619 +#: initdb.c:2897 initdb.c:2969 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "виправлÑÑŽ дозволи Ð´Ð»Ñ Ñтвореного каталогу %s... " -#: initdb.c:2552 initdb.c:2624 +#: initdb.c:2902 initdb.c:2974 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ дозволи каталогу \"%s\": %m" -#: initdb.c:2564 initdb.c:2636 +#: initdb.c:2914 initdb.c:2986 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "каталог \"%s\" Ñ–Ñнує, але він не порожній" -#: initdb.c:2568 +#: initdb.c:2918 #, c-format msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." msgstr "Якщо ви хочете Ñтворити нову ÑиÑтему бази даних, видаліть або очиÑтіть каталог \"%s\", або запуÑтіть %s з аргументом, відмінним від \"%s\"." -#: initdb.c:2576 initdb.c:2646 initdb.c:3029 +#: initdb.c:2926 initdb.c:2996 initdb.c:3422 #, c-format msgid "could not access directory \"%s\": %m" msgstr "немає доÑтупу до каталогу \"%s\": %m" -#: initdb.c:2597 +#: initdb.c:2947 #, c-format msgid "WAL directory location must be an absolute path" msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL каталогу має бути абÑолютним шлÑхом" -#: initdb.c:2640 +#: initdb.c:2990 #, c-format msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." msgstr "Якщо ви хочете зберігати дані з WAL там, потрібно видалити або очиÑтити директорію \"%s\"." -#: initdb.c:2651 +#: initdb.c:3000 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "не вдалоÑÑ Ñтворити Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m" -#: initdb.c:2654 -#, c-format -msgid "symlinks are not supported on this platform" -msgstr "Ñимволічні поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ Ñ†Ñ–Ñ”ÑŽ платформою" - -#: initdb.c:2673 +#: initdb.c:3019 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." msgstr "Він міÑтить файл з крапкою або невидимий файл, можливо це точка під'єднаннÑ." -#: initdb.c:2675 +#: initdb.c:3021 #, c-format msgid "It contains a lost+found directory, perhaps due to it being a mount point." msgstr "Він міÑтить каталог lost+found, можливо це точка під'єднаннÑ." -#: initdb.c:2677 +#: initdb.c:3023 #, c-format msgid "Using a mount point directly as the data directory is not recommended.\n" "Create a subdirectory under the mount point." msgstr "Ðе рекомендуєтьÑÑ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтовувати точку під'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñƒ ÑкоÑті каталогу даних.\n" "Створіть підкаталог Ñ– викориÑтайте його." -#: initdb.c:2703 +#: initdb.c:3050 #, c-format msgid "creating subdirectories ... " msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñ–Ð²... " -#: initdb.c:2746 +#: initdb.c:3093 msgid "performing post-bootstrap initialization ... " msgstr "виконуєтьÑÑ ÐºÑ–Ð½Ñ†ÐµÐ²Ð° фаза ініціалізації ... " -#: initdb.c:2911 +#: initdb.c:3256 +#, c-format +msgid "-c %s requires a value" +msgstr "-c %s необхідне значеннÑ" + +#: initdb.c:3281 #, c-format msgid "Running in debug mode.\n" msgstr "ВиконуєтьÑÑ Ñƒ режимі налагодженнÑ.\n" -#: initdb.c:2915 +#: initdb.c:3285 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "ВиконуєтьÑÑ Ñƒ режимі 'no-clean'. Помилки не будуть виправлені.\n" -#: initdb.c:2985 +#: initdb.c:3358 #, c-format msgid "unrecognized locale provider: %s" msgstr "нерозпізнаний поÑтачальник локалів: %s" -#: initdb.c:3010 +#: initdb.c:3395 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")" -#: initdb.c:3017 +#: initdb.c:3402 initdb.c:3406 initdb.c:3410 #, c-format msgid "%s cannot be specified unless locale provider \"%s\" is chosen" msgstr "%s не може бути вказано, поки не буде обрано поÑтачальник локалі \"%s\"" -#: initdb.c:3031 initdb.c:3108 +#: initdb.c:3424 initdb.c:3487 msgid "syncing data to disk ... " msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð´Ð°Ð½Ð¸Ñ… з диÑком ... " -#: initdb.c:3039 +#: initdb.c:3432 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "неможливо вказати одночаÑно пароль Ñ– файл паролю" -#: initdb.c:3061 -#, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "аргумент --wal-segsize повинен бути чиÑлом" - -#: initdb.c:3063 +#: initdb.c:3443 #, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "аргумент --wal-segsize повинен бути Ñтупенем 2 між 1 Ñ– 1024" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "аргумент %s має бути Ñтупенем двійки в діапазоні від 1 до 1024" -#: initdb.c:3077 +#: initdb.c:3456 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" msgstr "неприпуÑтиме ім'Ñ ÑуперкориÑтувача \"%s\"; імена ролей не можуть починатиÑÑ Ð½Ð° \"pg_\"" -#: initdb.c:3079 +#: initdb.c:3458 #, c-format msgid "The files belonging to this database system will be owned by user \"%s\".\n" "This user must also own the server process.\n\n" msgstr "Файли цієї бази даних будуть належати кориÑтувачеві \"%s\".\n" "Від імені цього кориÑтувача повинен запуÑкатиÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑ Ñервера.\n\n" -#: initdb.c:3095 +#: initdb.c:3474 #, c-format msgid "Data page checksums are enabled.\n" msgstr "Контроль ціліÑноÑті Ñторінок даних увімкнено.\n" -#: initdb.c:3097 +#: initdb.c:3476 #, c-format msgid "Data page checksums are disabled.\n" msgstr "Контроль ціліÑноÑті Ñторінок даних вимкнено.\n" -#: initdb.c:3114 +#: initdb.c:3493 #, c-format msgid "\n" "Sync to disk skipped.\n" @@ -966,22 +1066,22 @@ msgstr "\n" "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð· диÑком пропущена.\n" "Каталог з даними може бути пошкоджено під Ñ‡Ð°Ñ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ операційної ÑиÑтеми.\n" -#: initdb.c:3119 +#: initdb.c:3498 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"довіри\" Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… підключень" -#: initdb.c:3120 +#: initdb.c:3499 #, c-format msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." msgstr "Ви можете змінити це, змінивши pg_hba.conf або ÑкориÑтавшиÑÑŒ опцією -A, або --auth-local Ñ– --auth-host, наÑтупного разу, коли ви запуÑкаєте initdb." #. translator: This is a placeholder in a shell command. -#: initdb.c:3150 +#: initdb.c:3529 msgid "logfile" msgstr "logfile" -#: initdb.c:3152 +#: initdb.c:3531 #, c-format msgid "\n" "Success. You can now start the database server using:\n\n" diff --git a/src/bin/initdb/po/zh_CN.po b/src/bin/initdb/po/zh_CN.po index 9876679154c3c..5ffb5e045fe4c 100644 --- a/src/bin/initdb/po/zh_CN.po +++ b/src/bin/initdb/po/zh_CN.po @@ -4,111 +4,135 @@ # msgid "" msgstr "" -"Project-Id-Version: initdb (PostgreSQL) 14\n" +"Project-Id-Version: initdb (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-08-14 05:47+0000\n" -"PO-Revision-Date: 2021-08-15 18:00+0800\n" -"Last-Translator: Jie Zhang \n" +"POT-Creation-Date: 2024-05-24 03:30+0000\n" +"PO-Revision-Date: 2024-05-25 16:46+0800\n" +"Last-Translator: Dianjin Wang \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.5.7\n" +"X-Generator: Poedit 3.4.4\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "致命的: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "错误: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " -#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "详细信æ¯: " + +#: ../../../src/common/logging.c:301 #, c-format -msgid "could not identify current directory: %m" -msgstr "无法确认当å‰ç›®å½•: %m" +msgid "hint: " +msgstr "æç¤º: " -#: ../../common/exec.c:155 +#: ../../common/exec.c:174 #, c-format -msgid "invalid binary \"%s\"" -msgstr "æ— æ•ˆçš„äºŒè¿›åˆ¶ç  \"%s\"" +msgid "invalid binary \"%s\": %m" +msgstr "æ— æ•ˆçš„äºŒè¿›åˆ¶ç  \"%s\": %m" -#: ../../common/exec.c:205 +#: ../../common/exec.c:217 #, c-format -msgid "could not read binary \"%s\"" -msgstr "无法读å–äºŒè¿›åˆ¶ç  \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "无法读å–äºŒè¿›åˆ¶ç  \"%s\": %m" -#: ../../common/exec.c:213 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "未能找到一个 \"%s\" æ¥æ‰§è¡Œ" -#: ../../common/exec.c:269 ../../common/exec.c:308 +#: ../../common/exec.c:252 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "无法跳转到目录 \"%s\" 中: %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "无法将路径 \"%s\" è§£æžä¸ºç»å¯¹è·¯å¾„æ ¼å¼: %m" -#: ../../common/exec.c:286 +#: ../../common/exec.c:382 initdb.c:695 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "无法读å–符å·é“¾æŽ¥ \"%s\": %m" +msgid "could not execute command \"%s\": %m" +msgstr "无法执行命令 \"%s\": %m" -#: ../../common/exec.c:409 +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "无法读å–命令 \"%s\": %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "命令 \"%s\" 未返回数æ®" + +#: ../../common/exec.c:424 +#, c-format msgid "%s() failed: %m" -msgstr "%s()失败: %m" +msgstr "%s() 失败: %m" -#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 -#: initdb.c:331 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: initdb.c:353 #, c-format msgid "out of memory" msgstr "内存ä¸è¶³" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "内存ä¸è¶³\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "无法å¤åˆ¶ç©ºæŒ‡é’ˆ (内部错误)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "无法打开文件 \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "无法为文件 \"%s\" åŒæ­¥æ–‡ä»¶ç³»ç»Ÿ: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 #, c-format msgid "could not stat file \"%s\": %m" -msgstr "æ— æ³•å–æ–‡ä»¶ \"%s\" 的状æ€: %m" +msgstr "æ— æ³•èŽ·å–æ–‡ä»¶ \"%s\" 的状æ€: %m" -#: ../../common/file_utils.c:166 ../../common/pgfnames.c:48 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "è¯¥ç‰ˆæœ¬ä¸æ”¯æŒåŒæ­¥æ–¹æ³• \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: ../../common/pgfnames.c:48 ../../common/rmtree.c:63 #, c-format msgid "could not open directory \"%s\": %m" msgstr "无法打开目录 \"%s\": %m" -#: ../../common/file_utils.c:200 ../../common/pgfnames.c:69 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: ../../common/pgfnames.c:69 ../../common/rmtree.c:106 #, c-format msgid "could not read directory \"%s\": %m" msgstr "无法读å–目录 \"%s\": %m" -#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 -#: ../../common/file_utils.c:365 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "无法打开文件 \"%s\": %m" - -#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "无法 fsync 文件 \"%s\": %m" -#: ../../common/file_utils.c:383 +#: ../../common/file_utils.c:498 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "无法把文件 \"%s\" é‡å‘½å为 \"%s\": %m" @@ -118,60 +142,50 @@ msgstr "无法把文件 \"%s\" é‡å‘½å为 \"%s\": %m" msgid "could not close directory \"%s\": %m" msgstr "无法关闭目录 \"%s\": %m" -#: ../../common/restricted_token.c:64 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "无法加载库 \"%s\": é”™è¯¯ç  %lu" - -#: ../../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "无法为该平å°åˆ›å»ºå—é™åˆ¶çš„令牌:é”™è¯¯ç  %lu" - -#: ../../common/restricted_token.c:82 +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" -msgstr "无法打开进程令牌 (token): é”™è¯¯ç  %lu" +msgstr "无法打开进程令牌: é”™è¯¯ç  %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" -msgstr "无法分é…SID: é”™è¯¯ç  %lu" +msgstr "æ— æ³•åˆ†é… SID: é”™è¯¯ç  %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" -msgstr "无法创建å—é™ä»¤ç‰Œ: 错误ç ä¸º %lu" +msgstr "无法创建å—é™ä»¤ç‰Œ: é”™è¯¯ç  %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" -msgstr "无法为命令 \"%s\"创建进程: é”™è¯¯ç  %lu" +msgstr "无法为命令 \"%s\" 创建进程: é”™è¯¯ç  %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "无法使用å—é™ä»¤ç‰Œå†æ¬¡æ‰§è¡Œ: é”™è¯¯ç  %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" -msgstr "无法从å­è¿›ç¨‹å¾—到退出ç : é”™è¯¯ç  %lu" +msgstr "无法从å­è¿›ç¨‹èŽ·å–退出ç : é”™è¯¯ç  %lu" -#: ../../common/rmtree.c:79 +#: ../../common/rmtree.c:97 #, c-format -msgid "could not stat file or directory \"%s\": %m" -msgstr "无法统计文件或目录\"%s\": %m" +msgid "could not remove file \"%s\": %m" +msgstr "无法删除文件 \"%s\": %m" -#: ../../common/rmtree.c:101 ../../common/rmtree.c:113 +#: ../../common/rmtree.c:124 #, c-format -msgid "could not remove file or directory \"%s\": %m" -msgstr "无法删除文件或目录 \"%s\": %m" +msgid "could not remove directory \"%s\": %m" +msgstr "无法删除目录 \"%s\": %m" #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" -msgstr "无法找到有效的用户ID %ld: %s" +msgstr "无法找到有效的用户 ID %ld: %s" #: ../../common/username.c:45 msgid "user does not exist" @@ -180,302 +194,350 @@ msgstr "用户ä¸å­˜åœ¨" #: ../../common/username.c:60 #, c-format msgid "user name lookup failure: error code %lu" -msgstr "ç”¨æˆ·åæŸ¥æ‰¾å¤±è´¥ï¼šé”™è¯¯ä»£ç %lu" +msgstr "ç”¨æˆ·åæŸ¥æ‰¾å¤±è´¥: é”™è¯¯ç  %lu" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" -msgstr "无法执行命令" +msgstr "命令无法执行" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "命令没有找到" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "å­è¿›ç¨‹å·²é€€å‡º, 退出ç ä¸º %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" -msgstr "å­è¿›ç¨‹è¢«ä¾‹å¤–(exception) 0x%X 终止" +msgstr "å­è¿›ç¨‹è¢«å¼‚常 0x%X 终止" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "å­è¿›ç¨‹è¢«ä¿¡å· %d 终止: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "å­è¿›ç¨‹å·²é€€å‡º, æœªçŸ¥çŠ¶æ€ %d" -#: ../../port/dirmod.c:221 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "\"%s\" 是选项 %s 的无效值" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s å¿…é¡»ä½äºŽ %d..%d 的范围内" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "æ— æ³•è¯†åˆ«åŒæ­¥æ–¹æ³•: %s" + +#: ../../port/dirmod.c:287 #, c-format msgid "could not set junction for \"%s\": %s\n" -msgstr "无法为 \"%s\"设置连接: %s\n" +msgstr "无法为 \"%s\" 设置连接: %s\n" -#: ../../port/dirmod.c:298 +#: ../../port/dirmod.c:367 #, c-format msgid "could not get junction for \"%s\": %s\n" -msgstr "无法为\"%s\"得到连接: %s\n" +msgstr "无法为 \"%s\" 获å–连接: %s\n" -#: initdb.c:464 initdb.c:1496 +#: initdb.c:627 initdb.c:1619 #, c-format msgid "could not open file \"%s\" for reading: %m" -msgstr "为了读å–, 无法打开文件 \"%s\": %m" +msgstr "无法打开文件 \"%s\" 进行读å–: %m" -#: initdb.c:508 initdb.c:830 initdb.c:856 +#: initdb.c:671 initdb.c:975 initdb.c:995 #, c-format msgid "could not open file \"%s\" for writing: %m" -msgstr "为了写入, 无法打开文件 \"%s\": %m" +msgstr "无法打开文件 \"%s\" 进行写入: %m" -#: initdb.c:515 initdb.c:522 initdb.c:836 initdb.c:861 +#: initdb.c:675 initdb.c:978 initdb.c:997 #, c-format msgid "could not write file \"%s\": %m" msgstr "无法写入文件 \"%s\": %m" -#: initdb.c:540 +#: initdb.c:679 #, c-format -msgid "could not execute command \"%s\": %m" -msgstr "无法执行命令 \"%s\": %m" +msgid "could not close file \"%s\": %m" +msgstr "无法关闭文件 \"%s\": %m" -#: initdb.c:558 +#: initdb.c:713 #, c-format msgid "removing data directory \"%s\"" -msgstr "删除数æ®ç›®å½• \"%s\"" +msgstr "正在删除数æ®ç›®å½• \"%s\"" -#: initdb.c:560 +#: initdb.c:715 #, c-format msgid "failed to remove data directory" msgstr "删除数æ®ç›®å½•失败" -#: initdb.c:564 +#: initdb.c:719 #, c-format msgid "removing contents of data directory \"%s\"" -msgstr "删除数æ®ç›®å½• \"%s\" 的内容" +msgstr "正在删除数æ®ç›®å½• \"%s\" 的内容" -#: initdb.c:567 +#: initdb.c:722 #, c-format msgid "failed to remove contents of data directory" msgstr "删除数æ®ç›®å½•内容失败" -#: initdb.c:572 +#: initdb.c:727 #, c-format msgid "removing WAL directory \"%s\"" -msgstr "正在删除WAL目录\"%s\"" +msgstr "正在删除 WAL 目录 \"%s\"" -#: initdb.c:574 +#: initdb.c:729 #, c-format msgid "failed to remove WAL directory" -msgstr "删除WAL目录失败" +msgstr "删除 WAL 目录失败" -#: initdb.c:578 +#: initdb.c:733 #, c-format msgid "removing contents of WAL directory \"%s\"" -msgstr "正在删除WAL目录 \"%s\" 的内容" +msgstr "正在删除 WAL 目录 \"%s\" 的内容" -#: initdb.c:580 +#: initdb.c:735 #, c-format msgid "failed to remove contents of WAL directory" -msgstr "删除WAL目录内容失败" +msgstr "删除 WAL 目录内容失败" -#: initdb.c:587 +#: initdb.c:742 #, c-format msgid "data directory \"%s\" not removed at user's request" -msgstr "åœ¨ç”¨æˆ·çš„è¦æ±‚下数æ®åº“目录 \"%s\" ä¸è¢«åˆ é™¤" +msgstr "ä¾ç…§ç”¨æˆ·è¦æ±‚æ•°æ®åº“目录 \"%s\" ä¸è¢«åˆ é™¤" -#: initdb.c:591 +#: initdb.c:746 #, c-format msgid "WAL directory \"%s\" not removed at user's request" -msgstr "åœ¨ç”¨æˆ·çš„è¦æ±‚下WAL目录 \"%s\" ä¸è¢«åˆ é™¤" +msgstr "ä¾ç…§ç”¨æˆ·è¦æ±‚ WAL 目录 \"%s\" ä¸è¢«åˆ é™¤" -#: initdb.c:609 +#: initdb.c:764 #, c-format msgid "cannot be run as root" -msgstr "ä¸èƒ½ä½¿ç”¨root用户è¿è¡Œ" +msgstr "无法以 root 身份è¿è¡Œ" -#: initdb.c:611 +#: initdb.c:765 #, c-format -msgid "" -"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" -"own the server process.\n" -msgstr "" -"请以æœåŠ¡å™¨è¿›ç¨‹æ‰€æœ‰è€…çš„ç”¨æˆ· (无特æƒ) 身份\n" -"登陆 (使用, e.g., \"su\").\n" +msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." +msgstr "请以拥有æœåŠ¡å™¨è¿›ç¨‹çš„ (无特æƒ) 用户身份登录 (例如使用 \"su\")." -#: initdb.c:644 +#: initdb.c:797 #, c-format msgid "\"%s\" is not a valid server encoding name" -msgstr "\"%s\" 䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„æœåŠ¡å™¨ç¼–ç åå­—" +msgstr "\"%s\" 䏿˜¯ä¸€ä¸ªæœ‰æ•ˆçš„æœåŠ¡å™¨ç¼–ç åç§°" -#: initdb.c:789 +#: initdb.c:941 #, c-format msgid "file \"%s\" does not exist" msgstr "文件 \"%s\" ä¸å­˜åœ¨" -#: initdb.c:791 initdb.c:798 initdb.c:807 +#: initdb.c:942 initdb.c:947 initdb.c:954 #, c-format -msgid "" -"This might mean you have a corrupted installation or identified\n" -"the wrong directory with the invocation option -L.\n" -msgstr "" -"è¿™æ„å‘³ç€æ‚¨çš„安装å‘生了错误或\n" -"使用 -L 选项指定了错误的路径.\n" +msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." +msgstr "è¿™æ„味ç€ä½ çš„安装å‘生了错误或使用 -L 选项指定了错误的目录." -#: initdb.c:796 +#: initdb.c:946 #, c-format msgid "could not access file \"%s\": %m" msgstr "无法访问文件 \"%s\": %m" -#: initdb.c:805 +#: initdb.c:953 #, c-format msgid "file \"%s\" is not a regular file" msgstr "文件 \"%s\" 䏿˜¯å¸¸è§„文件" -#: initdb.c:950 +#: initdb.c:1086 #, c-format msgid "selecting dynamic shared memory implementation ... " -msgstr "选择动æ€å…±äº«å†…存实现 ......" +msgstr "正在选择动æ€å…±äº«å†…存实现 ... " -#: initdb.c:959 +#: initdb.c:1095 #, c-format -msgid "selecting default max_connections ... " -msgstr "é€‰æ‹©é»˜è®¤æœ€å¤§è”æŽ¥æ•° (max_connections) ... " +msgid "selecting default \"max_connections\" ... " +msgstr "正在选择默认最大连接数 (max_connections) ... " -#: initdb.c:990 +#: initdb.c:1115 #, c-format -msgid "selecting default shared_buffers ... " -msgstr "é€‰æ‹©é»˜è®¤å…±äº«ç¼“å†²åŒºå¤§å° (shared_buffers) ... " +msgid "selecting default \"shared_buffers\" ... " +msgstr "正在选择默认共享缓冲区 (shared_buffers) ... " -#: initdb.c:1024 +#: initdb.c:1138 +#, c-format msgid "selecting default time zone ... " -msgstr "选择默认时区 ... " +msgstr "正在选择默认时区 ... " -#: initdb.c:1058 +#: initdb.c:1217 msgid "creating configuration files ... " -msgstr "创建é…置文件 ... " +msgstr "正在创建é…置文件 ... " -#: initdb.c:1217 initdb.c:1236 initdb.c:1322 initdb.c:1337 +#: initdb.c:1370 initdb.c:1384 initdb.c:1451 initdb.c:1462 #, c-format msgid "could not change permissions of \"%s\": %m" -msgstr "无法改å˜\"%s\"çš„æƒé™: %m" +msgstr "æ— æ³•æ”¹å˜ \"%s\" çš„æƒé™: %m" -#: initdb.c:1359 +#: initdb.c:1481 #, c-format msgid "running bootstrap script ... " -msgstr "正在è¿è¡Œè‡ªä¸¾è„šæœ¬ ..." +msgstr "正在è¿è¡Œå¯åŠ¨è„šæœ¬ ... " -#: initdb.c:1371 +#: initdb.c:1493 #, c-format msgid "input file \"%s\" does not belong to PostgreSQL %s" -msgstr "输入文件 \"%s\" ä¸å±žäºŽPostgreSQL %s" +msgstr "输入文件 \"%s\" ä¸å±žäºŽ PostgreSQL %s" -#: initdb.c:1374 +#: initdb.c:1495 #, c-format -msgid "Check your installation or specify the correct path using the option -L.\n" -msgstr "检查你的安装或使用 -L 选项指定正确的路径.\n" +msgid "Specify the correct path using the option -L." +msgstr "使用 -L 选项指定正确的路径." -#: initdb.c:1473 +#: initdb.c:1597 msgid "Enter new superuser password: " -msgstr "输入新的超级用户å£ä»¤: " +msgstr "输入新的超级用户密ç : " -#: initdb.c:1474 +#: initdb.c:1598 msgid "Enter it again: " msgstr "å†è¾“入一é: " -#: initdb.c:1477 +#: initdb.c:1601 #, c-format msgid "Passwords didn't match.\n" -msgstr "å£ä»¤ä¸åŒ¹é….\n" +msgstr "密ç ä¸åŒ¹é….\n" -#: initdb.c:1504 +#: initdb.c:1625 #, c-format msgid "could not read password from file \"%s\": %m" -msgstr "无法从文件 \"%s\" 读å–å£ä»¤: %m" +msgstr "无法从文件 \"%s\" 读å–密ç : %m" -#: initdb.c:1507 +#: initdb.c:1628 #, c-format msgid "password file \"%s\" is empty" -msgstr "å£ä»¤æ–‡ä»¶\"%s\"为空" +msgstr "å¯†ç æ–‡ä»¶ \"%s\" 为空" -#: initdb.c:1998 +#: initdb.c:2040 #, c-format msgid "caught signal\n" msgstr "æ•获信å·\n" -#: initdb.c:2004 +#: initdb.c:2046 #, c-format msgid "could not write to child process: %s\n" -msgstr "无法写到å­è¿›ç¨‹: %s\n" +msgstr "无法写入å­è¿›ç¨‹: %s\n" -#: initdb.c:2012 +#: initdb.c:2054 #, c-format msgid "ok\n" msgstr "æˆåŠŸ\n" -#: initdb.c:2102 +#: initdb.c:2143 #, c-format msgid "setlocale() failed" -msgstr "setlocale()调用失败" +msgstr "setlocale() 调用失败" -#: initdb.c:2123 +#: initdb.c:2161 #, c-format msgid "failed to restore old locale \"%s\"" -msgstr "还原旧区域\"%s\"失败" +msgstr "æ¢å¤æ—§åŒºåŸŸè®¾ç½® \"%s\" 失败" -#: initdb.c:2132 +#: initdb.c:2169 #, c-format msgid "invalid locale name \"%s\"" -msgstr "无效的语言环境åç§° \"%s\"" +msgstr "无效的区域设置åç§° \"%s\"" -#: initdb.c:2143 +#: initdb.c:2170 +#, c-format +msgid "If the locale name is specific to ICU, use --icu-locale." +msgstr "如果将区域设置å称指定为 ICU, 请使用 --icu-locale." + +#: initdb.c:2183 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" -msgstr "无效的本地化设置; 请检查环境å˜é‡LANGå’ŒLC_*的值" +msgstr "无效的区域设置; 请检查环境å˜é‡ LANG å’Œ LC_* 的值" -#: initdb.c:2170 +#: initdb.c:2209 initdb.c:2233 #, c-format msgid "encoding mismatch" msgstr "ç¼–ç ä¸åŒ¹é…" -#: initdb.c:2172 +#: initdb.c:2210 #, c-format -msgid "" -"The encoding you selected (%s) and the encoding that the\n" -"selected locale uses (%s) do not match. This would lead to\n" -"misbehavior in various character string processing functions.\n" -"Rerun %s and either do not specify an encoding explicitly,\n" -"or choose a matching combination.\n" -msgstr "" -"æ‚¨é€‰æ‹©çš„ç¼–ç  (%s) å’Œæ‰€é€‰æ‹©çš„è¯­è¨€çŽ¯å¢ƒä½¿ç”¨çš„ç¼–ç  (%s) ä¸åŒ¹é…çš„.\n" -"这样将导致处ç†ä¸åŒå­—符串的函数时产生错误.\n" -"è¦ä¿®å¤æ­¤é—®é¢˜, 釿–°è¿è¡Œ %s 并且ä¸è¦æ˜Žç¡®æŒ‡å®šç¼–ç , 或者先选择一个匹é…\n" -"组åˆç±»åž‹.\n" -"\n" +msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." +msgstr "ä½ é€‰æ‹©çš„ç¼–ç  (%s) å’Œæ‰€é€‰æ‹©çš„åŒºåŸŸè®¾ç½®ä½¿ç”¨çš„ç¼–ç  (%s) ä¸åŒ¹é…. 这将导致ä¸åŒå­—符串处ç†å‡½æ•°æ—¶äº§ç”Ÿé”™è¯¯." + +#: initdb.c:2215 initdb.c:2236 +#, c-format +msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." +msgstr "è¯·é‡æ–°è¿è¡Œ %s, 且ä¸è¦æ˜¾ç¤ºæŒ‡å®šç¼–ç , 或选择一个匹é…的组åˆ." + +#: initdb.c:2234 +#, c-format +msgid "The encoding you selected (%s) is not supported with the ICU provider." +msgstr "ä½ æ‰€é€‰æ‹©çš„ç¼–ç  (%s) ä¸å— ICU 支æŒç¨‹åºæ”¯æŒ." + +#: initdb.c:2285 +#, c-format +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "无法将区域设置åç§° \"%s\" 转æ¢ä¸ºè¯­è¨€æ ‡ç­¾: %s" + +#: initdb.c:2291 initdb.c:2343 initdb.c:2435 +#, c-format +msgid "ICU is not supported in this build" +msgstr "è¯¥ç‰ˆæœ¬ä¸æ”¯æŒ ICU" + +#: initdb.c:2314 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "无法从区域设置 \"%s\" 获å–语言: %s" + +#: initdb.c:2340 +#, c-format +msgid "locale \"%s\" has unknown language \"%s\"" +msgstr "区域设置 \"%s\" 拥有未知的语言 \"%s\"" + +#: initdb.c:2401 +#, c-format +msgid "locale must be specified if provider is %s" +msgstr "如果支æŒç¨‹åºä¸º %s 必须指定区域设置" + +#: initdb.c:2412 +#, c-format +msgid "invalid locale name \"%s\" for builtin provider" +msgstr "\"%s\" 是内置支æŒç¨‹åºçš„æ— æ•ˆåŒºåŸŸè®¾ç½®åç§°" + +#: initdb.c:2423 +#, c-format +msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" +msgstr "使用语言标签 \"%s\" 用于 ICU 区域设置 \"%s\".\n" -#: initdb.c:2244 +#: initdb.c:2446 #, c-format msgid "" "%s initializes a PostgreSQL database cluster.\n" "\n" msgstr "" -"%s åˆå§‹åŒ–一个 PostgreSQL æ•°æ®åº“ç°‡.\n" +"%s åˆå§‹åŒ–一个 PostgreSQL æ•°æ®åº“集簇.\n" "\n" -#: initdb.c:2245 +#: initdb.c:2447 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: initdb.c:2246 +#: initdb.c:2448 #, c-format msgid " %s [OPTION]... [DATADIR]\n" -msgstr " %s [选项]... [DATADIR]\n" +msgstr " %s [选项]... [æ•°æ®ç›®å½•]\n" -#: initdb.c:2247 +#: initdb.c:2449 #, c-format msgid "" "\n" @@ -484,47 +546,57 @@ msgstr "" "\n" "选项:\n" -#: initdb.c:2248 +#: initdb.c:2450 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, --auth=METHOD æœ¬åœ°è¿žæŽ¥çš„é»˜è®¤è®¤è¯æ–¹æ³•\n" -#: initdb.c:2249 +#: initdb.c:2451 #, c-format msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" -msgstr " --auth-host=METHOD 本地的TCP/IPè¿žæŽ¥çš„é»˜è®¤è®¤è¯æ–¹æ³•\n" +msgstr " --auth-host=METHOD 本地的 TCP/IP è¿žæŽ¥çš„é»˜è®¤è®¤è¯æ–¹æ³•\n" -#: initdb.c:2250 +#: initdb.c:2452 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" -msgstr " --auth-local=METHOD 本地socketè¿žæŽ¥çš„é»˜è®¤è®¤è¯æ–¹æ³•\n" +msgstr " --auth-local=METHOD 本地 socket è¿žæŽ¥çš„é»˜è®¤è®¤è¯æ–¹æ³•\n" -#: initdb.c:2251 +#: initdb.c:2453 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" -msgstr " -D, --pgdata=DATADIR 当剿•°æ®åº“簇的ä½ç½®\n" +msgstr " [-D, --pgdata=]DATADIR 当剿•°æ®åº“集簇的ä½ç½®\n" -#: initdb.c:2252 +#: initdb.c:2454 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=ENCODING 为新数æ®åº“设置默认编ç \n" -#: initdb.c:2253 +#: initdb.c:2455 #, c-format msgid " -g, --allow-group-access allow group read/execute on data directory\n" msgstr " -g, --allow-group-access å…许组对数æ®ç›®å½•进行读/执行\n" -#: initdb.c:2254 +#: initdb.c:2456 +#, c-format +msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" +msgstr " --icu-locale=LOCALE 为新数æ®åº“设置 ICU 区域环境 ID\n" + +#: initdb.c:2457 +#, c-format +msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" +msgstr " --icu-rules=RULES 为新数æ®åº“设置é¢å¤–çš„ ICU 排åºè§„则\n" + +#: initdb.c:2458 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums 使用数æ®é¡µäº§ç”Ÿæ•ˆéªŒå’Œ\n" -#: initdb.c:2255 +#: initdb.c:2459 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" -msgstr " --locale=LOCALE 为新数æ®åº“设置默认语言环境\n" +msgstr " --locale=LOCALE 为新数æ®åº“设置默认区域环境\n" -#: initdb.c:2256 +#: initdb.c:2460 #, c-format msgid "" " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" @@ -534,97 +606,126 @@ msgid "" msgstr "" " --lc-collate, --lc-ctype, --lc-messages=LOCALE\n" " --lc-monetary, --lc-numeric, --lc-time=LOCALE\n" -" 为新的数æ®åº“簇在å„自的目录中分别\n" -" 设定缺çœè¯­è¨€çŽ¯å¢ƒï¼ˆé»˜è®¤ä½¿ç”¨çŽ¯å¢ƒå˜é‡)\n" +" 为新的数æ®åº“集簇在å„自的目录中分别\n" +" 设置默认区域环境(默认使用环境å˜é‡)\n" -#: initdb.c:2260 +#: initdb.c:2464 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale ç­‰åŒäºŽ --locale=C\n" -#: initdb.c:2261 +#: initdb.c:2465 +#, c-format +msgid "" +" --builtin-locale=LOCALE\n" +" set builtin locale name for new databases\n" +msgstr "" +" —builtin-locale=LOCALE\n" +" 为新数æ®åº“设置内置区域环境åç§°\n" + +#: initdb.c:2467 +#, c-format +msgid "" +" --locale-provider={builtin|libc|icu}\n" +" set default locale provider for new databases\n" +msgstr "" +" —locale-provider={builtin|libc|icu}\n" +" 为新数æ®åº“设置默认的区域环境支æŒç¨‹åº\n" + +#: initdb.c:2469 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" -msgstr " --pwfile=FILE 对于新的超级用户从文件读å–å£ä»¤\n" +msgstr " --pwfile=FILE 为新的超级用户从文件读å–密ç \n" -#: initdb.c:2262 +#: initdb.c:2470 #, c-format msgid "" " -T, --text-search-config=CFG\n" " default text search configuration\n" msgstr "" " -T, --text-search-config=CFG\n" -" 缺çœçš„æ–‡æœ¬æœç´¢é…ç½®\n" +" 默认的文本æœç´¢é…ç½®\n" -#: initdb.c:2264 +#: initdb.c:2472 #, c-format msgid " -U, --username=NAME database superuser name\n" -msgstr " -U, --username=NAME æ•°æ®åº“超级用户å\n" +msgstr " -U, --username=NAME æ•°æ®åº“超级用户åç§°\n" -#: initdb.c:2265 +#: initdb.c:2473 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" -msgstr " -W, --pwprompt 对于新的超级用户æç¤ºè¾“å…¥å£ä»¤\n" +msgstr " -W, --pwprompt 对于新的超级用户æç¤ºè¾“入密ç \n" -#: initdb.c:2266 +#: initdb.c:2474 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR 预写日志目录的ä½ç½®\n" -#: initdb.c:2267 +#: initdb.c:2475 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " --wal-segsize=SIZE WAL段的大å°ï¼ˆå…†å­—节)\n" +msgstr " --wal-segsize=SIZE WAL 段的大å°(兆字节)\n" -#: initdb.c:2268 +#: initdb.c:2476 #, c-format msgid "" "\n" "Less commonly used options:\n" msgstr "" "\n" -"éžæ™®é€šä½¿ç”¨é€‰é¡¹:\n" +"ä¸å¸¸ç”¨é€‰é¡¹:\n" -#: initdb.c:2269 +#: initdb.c:2477 +#, c-format +msgid " -c, --set NAME=VALUE override default setting for server parameter\n" +msgstr " -c, --set NAME=VALUE 覆盖默认的æœåС噍傿•°è®¾ç½®\n" + +#: initdb.c:2478 #, c-format msgid " -d, --debug generate lots of debugging output\n" -msgstr " -d, --debug 产生大é‡çš„除错信æ¯\n" +msgstr " -d, --debug 产生大é‡çš„调试信æ¯\n" -#: initdb.c:2270 +#: initdb.c:2479 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" -msgstr " --discard-caches 设置debug_discard_caches=1\n" +msgstr " --discard-caches 设置 debug_discard_caches=1\n" -#: initdb.c:2271 +#: initdb.c:2480 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORY 输入文件的ä½ç½®\n" -#: initdb.c:2272 +#: initdb.c:2481 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean 出错åŽä¸æ¸…ç†\n" -#: initdb.c:2273 +#: initdb.c:2482 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" -msgstr " -N, --no-sync ä¸ç”¨ç­‰å¾…å˜åŒ–安全写入ç£ç›˜\n" +msgstr " -N, --no-sync ä¸ç”¨ç­‰å¾…å˜æ›´å®‰å…¨å†™å…¥ç£ç›˜\n" -#: initdb.c:2274 +#: initdb.c:2483 +#, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions ä¸è¦æ‰“å°åŽç»­æ­¥éª¤çš„说明\n" -#: initdb.c:2275 +#: initdb.c:2484 #, c-format msgid " -s, --show show internal settings\n" msgstr " -s, --show 显示内部设置\n" -#: initdb.c:2276 +#: initdb.c:2485 #, c-format -msgid " -S, --sync-only only sync data directory\n" -msgstr " -S, --sync-only åªåŒæ­¥æ•°æ®ç›®å½•\n" +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD è®¾ç½®åŒæ­¥æ–‡ä»¶åˆ°ç£ç›˜çš„æ–¹æ³•\n" -#: initdb.c:2277 +#: initdb.c:2486 +#, c-format +msgid " -S, --sync-only only sync database files to disk, then exit\n" +msgstr " -S, --sync-only åªåŒæ­¥æ•°æ®åº“文件到ç£ç›˜, ç„¶åŽé€€å‡º\n" + +#: initdb.c:2487 #, c-format msgid "" "\n" @@ -633,17 +734,17 @@ msgstr "" "\n" "其它选项:\n" -#: initdb.c:2278 +#: initdb.c:2488 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 输出版本信æ¯, ç„¶åŽé€€å‡º\n" -#: initdb.c:2279 +#: initdb.c:2489 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help 显示此帮助, ç„¶åŽé€€å‡º\n" -#: initdb.c:2280 +#: initdb.c:2490 #, c-format msgid "" "\n" @@ -652,117 +753,115 @@ msgid "" msgstr "" "\n" "如果没有指定数æ®ç›®å½•, 将使用环境å˜é‡ PGDATA\n" +"\n" -#: initdb.c:2282 +#: initdb.c:2492 #, c-format msgid "" "\n" "Report bugs to <%s>.\n" msgstr "" "\n" -"臭虫报告至<%s>.\n" +"报告缺陷: <%s>.\n" -#: initdb.c:2283 +#: initdb.c:2493 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 主页: <%s>\n" -#: initdb.c:2311 +#: initdb.c:2517 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" -msgstr "æ— æ•ˆè®¤è¯æ–¹æ³• \"%s\" 用于 \"%s\" 连接" +msgstr "\"%s\" 是用于 \"%s\" è¿žæŽ¥çš„æ— æ•ˆè®¤è¯æ–¹æ³•" -#: initdb.c:2327 +#: initdb.c:2531 +#, c-format msgid "must specify a password for the superuser to enable password authentication" -msgstr "为了å¯åЍ坆ç è®¤è¯, 你需è¦ä¸ºè¶…级用户指定一个å£ä»¤" +msgstr "为了å¯ç”¨å¯†ç è®¤è¯, 必须为超级用户指定一个密ç " -#: initdb.c:2348 +#: initdb.c:2550 #, c-format msgid "no data directory specified" msgstr "没有指定数æ®ç›®å½•" -#: initdb.c:2350 +#: initdb.c:2551 #, c-format -msgid "" -"You must identify the directory where the data for this database system\n" -"will reside. Do this with either the invocation option -D or the\n" -"environment variable PGDATA.\n" -msgstr "" -"您必须确认此数æ®åº“ç³»ç»Ÿçš„æ•°æ®æ‰€åœ¨ç›®å½•\n" -"存在. 使用 -D 选项或者\n" -"环境å˜é‡ PGDATA.\n" +msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." +msgstr "你必须确认此数æ®åº“ç³»ç»Ÿçš„æ•°æ®æ‰€åœ¨ç›®å½•存在. å¯ä½¿ç”¨ -D 选项或者环境å˜é‡ PGDATA æ“作." -#: initdb.c:2368 +#: initdb.c:2568 +#, c-format msgid "could not set environment" msgstr "无法设置环境" -#: initdb.c:2388 +#: initdb.c:2586 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"%2$s需è¦ç¨‹åº\"%1$s\"\n" -"但在与\"%3$s\"相åŒçš„目录中找ä¸åˆ°è¯¥ç¨‹åº.\n" -"检查您的安装." +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "%2$s 需è¦ç¨‹åº \"%1$s\", 但在与 \"%3$s\" 相åŒçš„目录中找ä¸åˆ°è¯¥ç¨‹åº" -#: initdb.c:2393 +#: initdb.c:2589 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." -msgstr "" -"程åº\"%s\"是由\"%s\"找到的\n" -"但与%s的版本ä¸åŒ.\n" -"检查您的安装." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "ç¨‹åº \"%s\" 已由 \"%s\" 找到, 但与 %s 版本ä¸ä¸€è‡´" -#: initdb.c:2412 +#: initdb.c:2604 #, c-format msgid "input file location must be an absolute path" msgstr "输入文件ä½ç½®å¿…须为ç»å¯¹è·¯å¾„" -#: initdb.c:2429 +#: initdb.c:2621 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" -msgstr "æ•°æ®åº“簇将使用本地化语言 \"%s\"进行åˆå§‹åŒ–.\n" +msgstr "æ•°æ®åº“集簇将以区域环境设置 \"%s\" 进行åˆå§‹åŒ–.\n" + +#: initdb.c:2624 +#, c-format +msgid "The database cluster will be initialized with this locale configuration:\n" +msgstr "æ•°æ®åº“集簇将以该区域环境é…置进行åˆå§‹åŒ–:\n" + +#: initdb.c:2625 +#, c-format +msgid " locale provider: %s\n" +msgstr " 区域环境支æŒç¨‹åº: %s\n" + +#: initdb.c:2627 +#, c-format +msgid " default collation: %s\n" +msgstr " 默认排åº: %s\n" -#: initdb.c:2432 +#: initdb.c:2628 #, c-format msgid "" -"The database cluster will be initialized with locales\n" -" COLLATE: %s\n" -" CTYPE: %s\n" -" MESSAGES: %s\n" -" MONETARY: %s\n" -" NUMERIC: %s\n" -" TIME: %s\n" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" msgstr "" -"æ•°æ®åº“簇将带有一下 locales åˆå§‹åŒ–\n" -" COLLATE: %s\n" -" CTYPE: %s\n" -" MESSAGES: %s\n" -" MONETARY: %s\n" -" NUMERIC: %s\n" -" TIME: %s\n" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" -#: initdb.c:2456 +#: initdb.c:2658 #, c-format msgid "could not find suitable encoding for locale \"%s\"" -msgstr "无法为locale(本地化语言)\"%s\"找到åˆé€‚的编ç " +msgstr "无法为区域环境 \"%s\" 找到åˆé€‚的编ç " -#: initdb.c:2458 +#: initdb.c:2660 #, c-format -msgid "Rerun %s with the -E option.\n" -msgstr "带 -E 选项釿–°è¿è¡Œ %s.\n" +msgid "Rerun %s with the -E option." +msgstr "请带 -E 选项釿–°è¿è¡Œ %s." -#: initdb.c:2459 initdb.c:3099 initdb.c:3120 +#: initdb.c:2661 initdb.c:3204 initdb.c:3324 initdb.c:3344 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "请用 \"%s --help\" èŽ·å–æ›´å¤šçš„ä¿¡æ¯.\n" +msgid "Try \"%s --help\" for more information." +msgstr "请用 \"%s --help\" èŽ·å–æ›´å¤šä¿¡æ¯." -#: initdb.c:2472 +#: initdb.c:2673 #, c-format msgid "" "Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" @@ -771,173 +870,179 @@ msgstr "" "本地化éšå«çš„ç¼–ç  \"%s\" ä¸å…许作为æœåŠ¡å™¨ç«¯çš„ç¼–ç .\n" "默认的数æ®åº“ç¼–ç å°†é‡‡ç”¨ \"%s\" 作为代替.\n" -#: initdb.c:2477 +#: initdb.c:2678 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" -msgstr "本地化语言环境 \"%s\"è¦æ±‚ä½¿ç”¨ä¸æ”¯æŒçš„ç¼–ç \"%s\"" +msgstr "区域环境 \"%s\" è¦æ±‚ä½¿ç”¨ä¸æ”¯æŒçš„ç¼–ç  \"%s\"" -#: initdb.c:2480 +#: initdb.c:2680 #, c-format -msgid "" -"Encoding \"%s\" is not allowed as a server-side encoding.\n" -"Rerun %s with a different locale selection.\n" -msgstr "" -"ä¸å…许将编ç \"%s\"作为æœåŠ¡å™¨ç«¯ç¼–ç .\n" -"使用一个ä¸åŒçš„æœ¬åœ°åŒ–è¯­è¨€çŽ¯å¢ƒé‡æ–°è¿è¡Œ%s.\n" +msgid "Encoding \"%s\" is not allowed as a server-side encoding." +msgstr "ç¼–ç  \"%s\" ä¸å…许作为æœåŠ¡å™¨ç«¯ç¼–ç ." -#: initdb.c:2489 +#: initdb.c:2682 +#, c-format +msgid "Rerun %s with a different locale selection." +msgstr "请使用一个ä¸åŒçš„åŒºåŸŸçŽ¯å¢ƒé€‰é¡¹é‡æ–°è¿è¡Œ %s." + +#: initdb.c:2690 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "默认的数æ®åº“ç¼–ç å·²ç»ç›¸åº”的设置为 \"%s\".\n" -#: initdb.c:2555 +#: initdb.c:2704 +#, c-format +msgid "builtin provider locale \"%s\" requires encoding \"%s\"" +msgstr "内置的支æŒç¨‹åºåŒºåŸŸçŽ¯å¢ƒ \"%s\" è¦æ±‚ç¼–ç  \"%s\"" + +#: initdb.c:2766 +#, c-format msgid "could not find suitable text search configuration for locale \"%s\"" -msgstr "无法为本地化语言环境\"%s\"找到åˆé€‚的文本æœç´¢é…ç½®" +msgstr "无法为区域环境 \"%s\" 找到åˆé€‚的文本æœç´¢é…ç½®" -#: initdb.c:2566 +#: initdb.c:2777 +#, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" -msgstr "对于本地化语言环境\"%s\"åˆé€‚的文本æœç´¢é…置未知" +msgstr "区域环境 \"%s\" çš„åˆé€‚文本æœç´¢é…置未知" -#: initdb.c:2571 +#: initdb.c:2782 +#, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" -msgstr "所指定的文本æœç´¢é…ç½®\"%s\"å¯èƒ½ä¸Žæœ¬åœ°è¯­è¨€çŽ¯å¢ƒ\"%s\"ä¸åŒ¹é…" +msgstr "所指定的文本æœç´¢é…ç½® \"%s\" å¯èƒ½ä¸ŽåŒºåŸŸçŽ¯å¢ƒ \"%s\" ä¸åŒ¹é…" -#: initdb.c:2576 +#: initdb.c:2787 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" -msgstr "缺çœçš„æ–‡æœ¬æœç´¢é…置将会被设置到\"%s\"\n" +msgstr "默认的文本æœç´¢é…置将被设为 \"%s\".\n" -#: initdb.c:2620 initdb.c:2702 +#: initdb.c:2830 initdb.c:2901 #, c-format msgid "creating directory %s ... " -msgstr "创建目录 %s ... " +msgstr "正在创建目录 %s ... " -#: initdb.c:2626 initdb.c:2708 initdb.c:2773 initdb.c:2835 +#: initdb.c:2835 initdb.c:2906 initdb.c:2954 initdb.c:3011 #, c-format msgid "could not create directory \"%s\": %m" msgstr "无法创建目录 \"%s\": %m" -#: initdb.c:2637 initdb.c:2720 +#: initdb.c:2844 initdb.c:2916 #, c-format msgid "fixing permissions on existing directory %s ... " -msgstr "ä¿®å¤å·²å­˜åœ¨ç›®å½• %s çš„æƒé™ ... " +msgstr "正在修å¤å·²å­˜åœ¨ç›®å½• %s çš„æƒé™ ... " -#: initdb.c:2643 initdb.c:2726 +#: initdb.c:2849 initdb.c:2921 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "无法改å˜ç›®å½• \"%s\" çš„æƒé™: %m" -#: initdb.c:2657 initdb.c:2740 +#: initdb.c:2861 initdb.c:2933 #, c-format msgid "directory \"%s\" exists but is not empty" -msgstr "目录\"%s\"å·²å­˜åœ¨ï¼Œä½†ä¸æ˜¯ç©ºçš„" +msgstr "目录 \"%s\" 已存在,但ä¸ä¸ºç©º" -#: initdb.c:2662 +#: initdb.c:2865 #, c-format -msgid "" -"If you want to create a new database system, either remove or empty\n" -"the directory \"%s\" or run %s\n" -"with an argument other than \"%s\".\n" -msgstr "" -"如果您想创建一个新的数æ®åº“系统, 请删除或清空\n" -"目录 \"%s\" 或者è¿è¡Œå¸¦å‚æ•°çš„ %s\n" -"è€Œä¸æ˜¯ \"%s\".\n" +msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." +msgstr "如果你想创建一个新的数æ®åº“系统, 请删除或清空目录 \"%s\" 或者è¿è¡Œå¸¦æœ‰å‚æ•°çš„ %s è€Œä¸æ˜¯ \"%s\"." -#: initdb.c:2670 initdb.c:2752 initdb.c:3135 +#: initdb.c:2873 initdb.c:2943 initdb.c:3369 #, c-format msgid "could not access directory \"%s\": %m" msgstr "无法访问目录 \"%s\": %m" -#: initdb.c:2693 +#: initdb.c:2894 #, c-format msgid "WAL directory location must be an absolute path" -msgstr "WAL目录的ä½ç½®å¿…须为ç»å¯¹è·¯å¾„" +msgstr "WAL 目录ä½ç½®å¿…须为ç»å¯¹è·¯å¾„" -#: initdb.c:2745 +#: initdb.c:2937 #, c-format -msgid "" -"If you want to store the WAL there, either remove or empty the directory\n" -"\"%s\".\n" -msgstr "如果您è¦å­˜å‚¨WAL日志,需è¦åˆ é™¤æˆ–者清空目录\"%s\".\n" +msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." +msgstr "如果你è¦å­˜å‚¨ WAL 日志,需è¦åˆ é™¤æˆ–者清空目录 \"%s\"." -#: initdb.c:2759 +#: initdb.c:2947 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "无法创建符å·é“¾æŽ¥ \"%s\": %m" -#: initdb.c:2764 +#: initdb.c:2966 #, c-format -msgid "symlinks are not supported on this platform" -msgstr "在这个平å°ä¸Šä¸æ”¯æŒç¬¦å·é“¾æŽ¥" +msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." +msgstr "它包å«ä¸€ä¸ªä»¥ç‚¹å·å¼€å¤´/ä¸å¯è§çš„æ–‡ä»¶ï¼Œå¯èƒ½å› ä¸ºå®ƒæ˜¯ä¸€ä¸ªæŒ‚载点." -#: initdb.c:2788 +#: initdb.c:2968 #, c-format -msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point.\n" -msgstr "它包å«ä¸€ä¸ªä¸å¯è§çš„带固定点的文件,å¯èƒ½å› ä¸ºå®ƒæ˜¯ä¸€ä¸ªè£…载点。\n" +msgid "It contains a lost+found directory, perhaps due to it being a mount point." +msgstr "它包å«å为 lost+found 的目录,å¯èƒ½å› ä¸ºå®ƒæ˜¯ä¸€ä¸ªæŒ‚载点." -#: initdb.c:2791 -#, c-format -msgid "It contains a lost+found directory, perhaps due to it being a mount point.\n" -msgstr "它包å«å为lost+found的目录,å¯èƒ½å› ä¸ºå®ƒæ˜¯ä¸€ä¸ªåŠ è½½ç‚¹.\n" - -#: initdb.c:2794 +#: initdb.c:2970 #, c-format msgid "" "Using a mount point directly as the data directory is not recommended.\n" -"Create a subdirectory under the mount point.\n" +"Create a subdirectory under the mount point." msgstr "" -"䏿ލè将加载点作为数æ®ç›®å½•.\n" -"通常在加载点下边创建一个å­ç›®å½•.\n" +"䏿ލè直接将挂载点用作数æ®ç›®å½•.\n" +"通常在挂载点下边创建一个å­ç›®å½•." -#: initdb.c:2820 +#: initdb.c:2997 #, c-format msgid "creating subdirectories ... " msgstr "正在创建å­ç›®å½• ... " -#: initdb.c:2866 +#: initdb.c:3040 msgid "performing post-bootstrap initialization ... " -msgstr "正在执行自举åŽåˆå§‹åŒ– ..." +msgstr "正在执行å¯åŠ¨è„šæœ¬åŽç»­åˆå§‹åŒ– ... " + +#: initdb.c:3203 +#, c-format +msgid "-c %s requires a value" +msgstr "-c %s 需è¦ä¸€ä¸ªå€¼" -#: initdb.c:3029 +#: initdb.c:3228 #, c-format msgid "Running in debug mode.\n" -msgstr "è¿è¡Œåœ¨é™¤é”™æ¨¡å¼ä¸­. \n" +msgstr "正在以调试模å¼è¿è¡Œ. \n" -#: initdb.c:3033 +#: initdb.c:3232 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" -msgstr "è¿è¡Œåœ¨ no-clean 模å¼ä¸­. 错误将ä¸è¢«æ¸…ç†.\n" +msgstr "正在以 no-clean 模å¼è¿è¡Œ. 错误将ä¸è¢«æ¸…ç†.\n" + +#: initdb.c:3305 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "无法识别的区域环境支æŒç¨‹åº: %s" -#: initdb.c:3118 +#: initdb.c:3342 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "å‘½ä»¤è¡Œå‚æ•°å¤ªå¤š (第一个是 \"%s\")" -#: initdb.c:3139 initdb.c:3228 +#: initdb.c:3349 initdb.c:3353 initdb.c:3357 +#, c-format +msgid "%s cannot be specified unless locale provider \"%s\" is chosen" +msgstr "无法指定 %s, 除éžé€‰æ‹©åŒºåŸŸçŽ¯å¢ƒæ”¯æŒç¨‹åº \"%s\"" + +#: initdb.c:3371 initdb.c:3434 msgid "syncing data to disk ... " -msgstr "åŒæ­¥æ•°æ®åˆ°ç£ç›˜..." +msgstr "æ­£åœ¨åŒæ­¥æ•°æ®åˆ°ç£ç›˜ ... " -#: initdb.c:3148 +#: initdb.c:3379 #, c-format msgid "password prompt and password file cannot be specified together" -msgstr "å£ä»¤æç¤ºå’Œå£ä»¤æ–‡ä»¶ä¸èƒ½åŒæ—¶éƒ½æŒ‡å®š" +msgstr "å¯†ç æç¤ºå’Œå¯†ç æ–‡ä»¶ä¸èƒ½åŒæ—¶éƒ½æŒ‡å®š" -#: initdb.c:3173 +#: initdb.c:3390 #, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "--wal-segsizeçš„å‚æ•°å¿…须是一个数字" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "%s çš„å‚æ•°å¿…须是 2 的幂次方(在 1 - 1024 之间)" -#: initdb.c:3178 -#, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "--wal-segsizeçš„å‚æ•°å¿…须是2的幂次方(在1å’Œ1024之间)" - -#: initdb.c:3195 +#: initdb.c:3403 #, c-format msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" -msgstr "超级用户å\"%s\"是ä¸å…许的;角色åç§°ä¸èƒ½ä»¥\"pg_\"开始" +msgstr "超级用户å \"%s\" ä¸è¢«å…许;角色åç§°ä¸èƒ½ä»¥ \"pg_\" 开始" -#: initdb.c:3199 +#: initdb.c:3405 #, c-format msgid "" "The files belonging to this database system will be owned by user \"%s\".\n" @@ -946,18 +1051,19 @@ msgid "" msgstr "" "属于此数æ®åº“系统的文件宿主为用户 \"%s\".\n" "此用户也必须为æœåŠ¡å™¨è¿›ç¨‹çš„å®¿ä¸».\n" +"\n" -#: initdb.c:3215 +#: initdb.c:3421 #, c-format msgid "Data page checksums are enabled.\n" msgstr "å…è®¸ç”Ÿæˆæ•°æ®é¡µæ ¡éªŒå’Œ.\n" -#: initdb.c:3217 +#: initdb.c:3423 #, c-format msgid "Data page checksums are disabled.\n" msgstr "ç¦æ­¢ä¸ºæ•°æ®é¡µç”Ÿæˆæ ¡éªŒå’Œ.\n" -#: initdb.c:3234 +#: initdb.c:3440 #, c-format msgid "" "\n" @@ -968,26 +1074,22 @@ msgstr "" "è·³è¿‡åŒæ­¥åˆ°ç£ç›˜æ“作.\n" "如果æ“作系统宕机,数æ®ç›®å½•å¯èƒ½ä¼šæ¯å.\n" -#: initdb.c:3239 +#: initdb.c:3445 #, c-format msgid "enabling \"trust\" authentication for local connections" -msgstr "为本地连接å¯ç”¨\"trust\"身份验è¯" +msgstr "为本地连接å¯ç”¨ \"trust\" 身份验è¯" -#: initdb.c:3240 +#: initdb.c:3446 #, c-format -msgid "" -"You can change this by editing pg_hba.conf or using the option -A, or\n" -"--auth-local and --auth-host, the next time you run initdb.\n" -msgstr "" -"ä½ å¯ä»¥é€šè¿‡ç¼–辑 pg_hba.conf 更改或你下次\n" -"执行 initdb 时使用 -A或者--auth-localå’Œ--auth-host选项.\n" +msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." +msgstr "ä½ å¯ä»¥é€šè¿‡ç¼–辑 pg_hba.conf 或下次è¿è¡Œ initdb 时使用 -A 或者 --auth-local å’Œ --auth-host 选项进行更改." #. translator: This is a placeholder in a shell command. -#: initdb.c:3270 +#: initdb.c:3476 msgid "logfile" -msgstr "日志文件" +msgstr "logfile" -#: initdb.c:3272 +#: initdb.c:3478 #, c-format msgid "" "\n" @@ -997,8 +1099,79 @@ msgid "" "\n" msgstr "" "\n" -"æˆåŠŸã€‚æ‚¨çŽ°åœ¨å¯ä»¥ç”¨ä¸‹é¢çš„命令开坿•°æ®åº“æœåŠ¡å™¨ï¼š\n" +"æˆåŠŸã€‚ä½ çŽ°åœ¨å¯ä»¥ç”¨ä¸‹é¢çš„命令开坿•°æ®åº“æœåС噍:\n" "\n" " %s\n" "\n" +#, c-format +#~ msgid "" +#~ "The program \"%s\" is needed by %s but was not found in the\n" +#~ "same directory as \"%s\".\n" +#~ "Check your installation." +#~ msgstr "" +#~ "%2$s需è¦ç¨‹åº\"%1$s\"\n" +#~ "但在与\"%3$s\"相åŒçš„目录中找ä¸åˆ°è¯¥ç¨‹åº.\n" +#~ "检查您的安装." + +#, c-format +#~ msgid "" +#~ "The program \"%s\" was found by \"%s\"\n" +#~ "but was not the same version as %s.\n" +#~ "Check your installation." +#~ msgstr "" +#~ "程åº\"%s\"是由\"%s\"找到的\n" +#~ "但与%s的版本ä¸åŒ.\n" +#~ "检查您的安装." + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "请用 \"%s --help\" èŽ·å–æ›´å¤šçš„ä¿¡æ¯.\n" + +#, c-format +#~ msgid "argument of --wal-segsize must be a number" +#~ msgstr "--wal-segsize çš„å‚æ•°å¿…须是一个数字" + +#, c-format +#~ msgid "cannot create restricted tokens on this platform: error code %lu" +#~ msgstr "无法为该平å°åˆ›å»ºå—é™ä»¤ç‰Œ: é”™è¯¯ç  %lu" + +#, c-format +#~ msgid "could not change directory to \"%s\": %m" +#~ msgstr "无法跳转到目录 \"%s\" 中: %m" + +#, c-format +#~ msgid "could not identify current directory: %m" +#~ msgstr "无法确认当å‰ç›®å½•: %m" + +#, c-format +#~ msgid "could not load library \"%s\": error code %lu" +#~ msgstr "无法加载库 \"%s\": é”™è¯¯ç  %lu" + +#, c-format +#~ msgid "could not read binary \"%s\"" +#~ msgstr "无法读å–äºŒè¿›åˆ¶ç  \"%s\"" + +#, c-format +#~ msgid "could not read symbolic link \"%s\": %m" +#~ msgstr "无法读å–符å·é“¾æŽ¥ \"%s\": %m" + +#, c-format +#~ msgid "could not remove file or directory \"%s\": %m" +#~ msgstr "无法删除文件或目录 \"%s\": %m" + +#, c-format +#~ msgid "could not stat file or directory \"%s\": %m" +#~ msgstr "æ— æ³•èŽ·å–æ–‡ä»¶æˆ–目录 \"%s\" 状æ€: %m" + +#, c-format +#~ msgid "fatal: " +#~ msgstr "致命的: " + +#, c-format +#~ msgid "invalid binary \"%s\"" +#~ msgstr "æ— æ•ˆçš„äºŒè¿›åˆ¶ç  \"%s\"" + +#, c-format +#~ msgid "symlinks are not supported on this platform" +#~ msgstr "在这个平å°ä¸Šä¸æ”¯æŒç¬¦å·é“¾æŽ¥" diff --git a/src/bin/initdb/po/zh_TW.po b/src/bin/initdb/po/zh_TW.po new file mode 100644 index 0000000000000..b350093d2ec93 --- /dev/null +++ b/src/bin/initdb/po/zh_TW.po @@ -0,0 +1,1369 @@ +# Traditional Chinese message translation file for initdb +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the initdb (PostgreSQL) package. +# 2004-12-13 Zhenbang Wei +# +msgid "" +msgstr "" +"Project-Id-Version: initdb (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-05 20:50+0000\n" +"PO-Revision-Date: 2023-11-06 08:49+0800\n" +"Last-Translator: Zhenbang Wei \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.4.1\n" + +# libpq/be-secure.c:294 libpq/be-secure.c:387 +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "錯誤: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "警告: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "詳細內容: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "æç¤º: " + +# command.c:122 +#: ../../common/exec.c:172 +#, c-format +msgid "invalid binary \"%s\": %m" +msgstr "無效的執行檔 \"%s\": %m" + +# command.c:1103 +#: ../../common/exec.c:215 +#, c-format +msgid "could not read binary \"%s\": %m" +msgstr "無法讀å–執行檔 \"%s\": %m" + +#: ../../common/exec.c:223 +#, c-format +msgid "could not find a \"%s\" to execute" +msgstr "找ä¸åˆ°å¯åŸ·è¡Œçš„ \"%s\"" + +# utils/error/elog.c:1128 +#: ../../common/exec.c:250 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "無法將路徑 \"%s\" è§£æžç‚ºçµ•å°è·¯å¾‘: %m" + +# fe-misc.c:991 +#: ../../common/exec.c:412 +#, c-format +msgid "%s() failed: %m" +msgstr "%s() 失敗: %m" + +# commands/sequence.c:798 executor/execGrouping.c:328 +# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43 +# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006 +# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527 +# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623 +# postmaster/postmaster.c:755 postmaster/postmaster.c:1625 +# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139 +# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766 +# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138 +# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297 +# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73 +# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191 +# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164 +# utils/cache/relcache.c:178 utils/cache/relcache.c:1130 +# utils/cache/typcache.c:165 utils/cache/typcache.c:487 +# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532 +# utils/init/miscinit.c:213 utils/init/miscinit.c:234 +# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911 +# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503 +# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75 +#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: initdb.c:349 +#, c-format +msgid "out of memory" +msgstr "記憶體ä¸è¶³" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "記憶體ä¸è¶³\n" + +# common.c:78 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "無法複製 null 指標(內部錯誤)\n" + +# access/transam/xlog.c:1936 access/transam/xlog.c:2038 +# access/transam/xlog.c:5291 +#: ../../common/file_utils.c:87 ../../common/file_utils.c:447 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "無法å–得檔案 \"%s\" 的狀態: %m" + +# access/transam/slru.c:930 commands/tablespace.c:529 +# commands/tablespace.c:694 utils/adt/misc.c:174 +#: ../../common/file_utils.c:162 ../../common/pgfnames.c:48 +#: ../../common/rmtree.c:63 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "無法開啟目錄 \"%s\": %m" + +# access/transam/slru.c:967 commands/tablespace.c:577 +# commands/tablespace.c:721 +#: ../../common/file_utils.c:196 ../../common/pgfnames.c:69 +#: ../../common/rmtree.c:104 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "無法讀å–目錄 \"%s\": %m" + +# access/transam/slru.c:638 access/transam/xlog.c:1631 +# access/transam/xlog.c:2742 access/transam/xlog.c:2832 +# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935 +# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889 +# utils/misc/database.c:68 +#: ../../common/file_utils.c:228 ../../common/file_utils.c:287 +#: ../../common/file_utils.c:361 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "無法開啟檔案 \"%s\": %m" + +# access/transam/slru.c:673 access/transam/xlog.c:1562 +# access/transam/xlog.c:1686 access/transam/xlog.c:3008 +#: ../../common/file_utils.c:299 ../../common/file_utils.c:369 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "無法 fsync 檔案 \"%s\": %m" + +# access/transam/xlog.c:3037 access/transam/xlog.c:3819 +# access/transam/xlog.c:3862 commands/user.c:282 commands/user.c:412 +# postmaster/pgarch.c:597 +#: ../../common/file_utils.c:379 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "無法將檔案 \"%s\" æ›´å為 \"%s\": %m" + +# access/transam/slru.c:930 commands/tablespace.c:529 +# commands/tablespace.c:694 utils/adt/misc.c:174 +#: ../../common/pgfnames.c:74 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "無法關閉目錄 \"%s\": %m" + +# port/win32/security.c:39 +#: ../../common/restricted_token.c:60 +#, c-format +msgid "could not open process token: error code %lu" +msgstr "無法開啟行程 token: 錯誤碼 %lu" + +# port/pg_sema.c:117 port/sysv_sema.c:117 +#: ../../common/restricted_token.c:74 +#, c-format +msgid "could not allocate SIDs: error code %lu" +msgstr "無法é…ç½® SID: 錯誤碼 %lu" + +# port/win32/signal.c:239 +#: ../../common/restricted_token.c:94 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "無法建立å—é™ token: 錯誤碼 %lu" + +#: ../../common/restricted_token.c:115 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "無法為指令 \"%s\" 啟動行程: 錯誤碼 %lu" + +# port/win32/signal.c:239 +#: ../../common/restricted_token.c:153 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "無法使用å—é™ token 釿–°åŸ·è¡Œ: 錯誤碼 %lu" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "無法從å­è¡Œç¨‹å–å¾—çµæŸç¢¼: 錯誤碼 %lu" + +# access/transam/xlog.c:1944 access/transam/xlog.c:5453 +# access/transam/xlog.c:5607 postmaster/postmaster.c:3504 +#: ../../common/rmtree.c:95 +#, c-format +msgid "could not remove file \"%s\": %m" +msgstr "無法刪除檔案 \"%s\": %m" + +# commands/tablespace.c:610 +#: ../../common/rmtree.c:122 +#, c-format +msgid "could not remove directory \"%s\": %m" +msgstr "無法刪除目錄 \"%s\": %m" + +# libpq/be-secure.c:689 +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "找ä¸åˆ°æœ‰æ•ˆçš„使用者 ID %ld: %s" + +# commands/user.c:899 commands/user.c:1012 commands/user.c:1104 +# commands/user.c:1233 commands/variable.c:664 utils/cache/lsyscache.c:2064 +# utils/init/miscinit.c:335 +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "使用者ä¸å­˜åœ¨" + +# port/win32/security.c:39 +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "找ä¸åˆ°ä½¿ç”¨è€…å稱: 錯誤碼 %lu" + +#: ../../common/wait_error.c:55 +#, c-format +msgid "command not executable" +msgstr "無法執行指令" + +#: ../../common/wait_error.c:59 +#, c-format +msgid "command not found" +msgstr "找ä¸åˆ°æŒ‡ä»¤" + +#: ../../common/wait_error.c:64 +#, c-format +msgid "child process exited with exit code %d" +msgstr "å­è¡Œç¨‹çµæŸï¼ŒçµæŸç¢¼ %d" + +#: ../../common/wait_error.c:72 +#, c-format +msgid "child process was terminated by exception 0x%X" +msgstr "å­è¡Œç¨‹å› ç•°å¸¸ 0x%X è€Œåœæ­¢" + +#: ../../common/wait_error.c:76 +#, c-format +msgid "child process was terminated by signal %d: %s" +msgstr "å­è¡Œç¨‹å› ä¿¡è™Ÿ %d è€Œåœæ­¢: %s" + +#: ../../common/wait_error.c:82 +#, c-format +msgid "child process exited with unrecognized status %d" +msgstr "å­è¡Œç¨‹å› ä¸æ˜Žç‹€æ…‹ %d è€Œåœæ­¢" + +#: ../../port/dirmod.c:287 +#, c-format +msgid "could not set junction for \"%s\": %s\n" +msgstr "無法設置 junction 至 \"%s\": %s\n" + +#: ../../port/dirmod.c:367 +#, c-format +msgid "could not get junction for \"%s\": %s\n" +msgstr "無法å–å¾— \"%s\" çš„ junction: %s\n" + +# commands/copy.c:1031 +#: initdb.c:618 initdb.c:1613 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "無法開啟檔案 \"%s\" 以進行讀å–: %m" + +# commands/copy.c:1094 +#: initdb.c:662 initdb.c:966 initdb.c:986 +#, c-format +msgid "could not open file \"%s\" for writing: %m" +msgstr "無法開啟檔案 \"%s\" 以進行寫入: %m" + +# access/transam/xlog.c:5319 access/transam/xlog.c:5439 +#: initdb.c:666 initdb.c:969 initdb.c:988 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "無法寫入檔案 \"%s\": %m" + +# access/transam/slru.c:680 access/transam/xlog.c:1567 +# access/transam/xlog.c:1691 access/transam/xlog.c:3013 +#: initdb.c:670 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "無法關閉檔案 \"%s\": %m" + +#: initdb.c:686 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "無法執行指令 \"%s\": %m" + +#: initdb.c:704 +#, c-format +msgid "removing data directory \"%s\"" +msgstr "刪除資料目錄 \"%s\"" + +#: initdb.c:706 +#, c-format +msgid "failed to remove data directory" +msgstr "無法刪除資料目錄" + +#: initdb.c:710 +#, c-format +msgid "removing contents of data directory \"%s\"" +msgstr "刪除資料目錄 \"%s\" 的內容" + +#: initdb.c:713 +#, c-format +msgid "failed to remove contents of data directory" +msgstr "無法刪除資料目錄的內容" + +#: initdb.c:718 +#, c-format +msgid "removing WAL directory \"%s\"" +msgstr "刪除 WAL 目錄 \"%s\"" + +#: initdb.c:720 +#, c-format +msgid "failed to remove WAL directory" +msgstr "無法刪除 WAL 目錄" + +#: initdb.c:724 +#, c-format +msgid "removing contents of WAL directory \"%s\"" +msgstr "刪除 WAL 目錄 \"%s\" 的內容" + +#: initdb.c:726 +#, c-format +msgid "failed to remove contents of WAL directory" +msgstr "無法刪除 WAL 目錄的內容" + +#: initdb.c:733 +#, c-format +msgid "data directory \"%s\" not removed at user's request" +msgstr "æ ¹æ“šä½¿ç”¨è€…è¦æ±‚,未刪除資料目錄 \"%s\"" + +#: initdb.c:737 +#, c-format +msgid "WAL directory \"%s\" not removed at user's request" +msgstr "æ ¹æ“šä½¿ç”¨è€…è¦æ±‚,未刪除WAL目錄 \"%s\"" + +# translator: %s represents an SQL statement name +# access/transam/xact.c:2195 +#: initdb.c:755 +#, c-format +msgid "cannot be run as root" +msgstr "無法以 root 執行" + +#: initdb.c:756 +#, c-format +msgid "Please log in (using, e.g., \"su\") as the (unprivileged) user that will own the server process." +msgstr "è«‹ä»¥æ“æœ‰ä¼ºæœå™¨è¡Œç¨‹çš„(éžç‰¹æ¬Š)使用者身分登入(例如用 \"su\" 命令)。" + +#: initdb.c:788 +#, c-format +msgid "\"%s\" is not a valid server encoding name" +msgstr "\"%s\" 䏿˜¯æœ‰æ•ˆçš„伺æœå™¨ç·¨ç¢¼å稱" + +# commands/comment.c:582 +#: initdb.c:932 +#, c-format +msgid "file \"%s\" does not exist" +msgstr "檔案 \"%s\" ä¸å­˜åœ¨" + +#: initdb.c:933 initdb.c:938 initdb.c:945 +#, c-format +msgid "This might mean you have a corrupted installation or identified the wrong directory with the invocation option -L." +msgstr "這å¯èƒ½è¡¨ç¤ºæ‚¨çš„å®‰è£æå£žæˆ–ä½¿ç”¨éŒ¯èª¤çš„ç›®éŒ„é¸é … -L。" + +# utils/fmgr/dfmgr.c:107 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:263 +#: initdb.c:937 +#, c-format +msgid "could not access file \"%s\": %m" +msgstr "ç„¡æ³•å­˜å–æª”案 \"%s\": %m" + +#: initdb.c:944 +#, c-format +msgid "file \"%s\" is not a regular file" +msgstr "檔案 \"%s\" 䏿˜¯ä¸€èˆ¬æª”案" + +#: initdb.c:1077 +#, c-format +msgid "selecting dynamic shared memory implementation ... " +msgstr "鏿“‡å‹•態共享記憶體實作方å¼â€¦ " + +#: initdb.c:1086 +#, c-format +msgid "selecting default max_connections ... " +msgstr "鏿“‡é è¨­ max_connections … " + +#: initdb.c:1106 +#, c-format +msgid "selecting default shared_buffers ... " +msgstr "鏿“‡é è¨­ shared_buffers … " + +#: initdb.c:1129 +#, c-format +msgid "selecting default time zone ... " +msgstr "鏿“‡é è¨­æ™‚å€ â€¦ " + +#: initdb.c:1206 +msgid "creating configuration files ... " +msgstr "建立組態檔… " + +# libpq/pqcomm.c:520 +#: initdb.c:1367 initdb.c:1381 initdb.c:1448 initdb.c:1459 +#, c-format +msgid "could not change permissions of \"%s\": %m" +msgstr "無法修改檔案 \"%s\" 的權é™: %m" + +#: initdb.c:1477 +#, c-format +msgid "running bootstrap script ... " +msgstr "執行啟動腳本… " + +# tcop/utility.c:92 +#: initdb.c:1489 +#, c-format +msgid "input file \"%s\" does not belong to PostgreSQL %s" +msgstr "輸入檔 \"%s\" ä¸å±¬æ–¼ PostgreSQL %s" + +#: initdb.c:1491 +#, c-format +msgid "Specify the correct path using the option -L." +msgstr "使用é¸é … -L 指定正確的路徑。" + +#: initdb.c:1591 +msgid "Enter new superuser password: " +msgstr "輸入超級使用者的新密碼: " + +#: initdb.c:1592 +msgid "Enter it again: " +msgstr "è«‹é‡æ–°è¼¸å…¥: " + +#: initdb.c:1595 +#, c-format +msgid "Passwords didn't match.\n" +msgstr "密碼ä¸ä¸€è‡´ã€‚\n" + +#: initdb.c:1619 +#, c-format +msgid "could not read password from file \"%s\": %m" +msgstr "無法從檔案 \"%s\" 讀å–密碼: %m" + +# commands/tablespace.c:334 +#: initdb.c:1622 +#, c-format +msgid "password file \"%s\" is empty" +msgstr "密碼檔 \"%s\" 是空的" + +#: initdb.c:2034 +#, c-format +msgid "caught signal\n" +msgstr "æ•æ‰åˆ°ä¿¡è™Ÿ\n" + +#: initdb.c:2040 +#, c-format +msgid "could not write to child process: %s\n" +msgstr "無法寫入至å­è¡Œç¨‹: %s\n" + +#: initdb.c:2048 +#, c-format +msgid "ok\n" +msgstr "" + +# fe-misc.c:991 +#: initdb.c:2137 +#, c-format +msgid "setlocale() failed" +msgstr "setlocale() 失敗" + +# utils/init/miscinit.c:648 +#: initdb.c:2155 +#, c-format +msgid "failed to restore old locale \"%s\"" +msgstr "無法還原舊的å€åŸŸè¨­å®š \"%s\"" + +#: initdb.c:2163 +#, c-format +msgid "invalid locale name \"%s\"" +msgstr "無效的å€åŸŸå稱 \"%s\"" + +#: initdb.c:2164 +#, c-format +msgid "If the locale name is specific to ICU, use --icu-locale." +msgstr "如果å€åŸŸå稱是 ICU 專用的,請使用 --icu-locale。" + +#: initdb.c:2177 +#, c-format +msgid "invalid locale settings; check LANG and LC_* environment variables" +msgstr "無效的å€åŸŸè¨­å®šï¼›è«‹æª¢æŸ¥ LANG å’Œ LC_* 環境變數" + +#: initdb.c:2203 initdb.c:2227 +#, c-format +msgid "encoding mismatch" +msgstr "編碼ä¸ä¸€è‡´" + +#: initdb.c:2204 +#, c-format +msgid "The encoding you selected (%s) and the encoding that the selected locale uses (%s) do not match. This would lead to misbehavior in various character string processing functions." +msgstr "æ‚¨é¸æ“‡çš„編碼方å¼(%s)和所é¸çš„å€åŸŸä½¿ç”¨çš„編碼方å¼(%s)ä¸ä¸€è‡´ï¼Œé€™å¯èƒ½æœƒå°Žè‡´å„種字串處ç†å‡½æ•¸çš„䏿­£å¸¸è¡Œç‚ºã€‚" + +#: initdb.c:2209 initdb.c:2230 +#, c-format +msgid "Rerun %s and either do not specify an encoding explicitly, or choose a matching combination." +msgstr "釿–°åŸ·è¡Œ %s 䏔䏿˜Žç¢ºæŒ‡å®šç·¨ç¢¼æˆ–鏿“‡ä¸€å€‹ç›¸ç¬¦çš„組åˆã€‚" + +#: initdb.c:2228 +#, c-format +msgid "The encoding you selected (%s) is not supported with the ICU provider." +msgstr "æ‚¨æ‰€é¸æ“‡çš„編碼方å¼(%s)ä¸å— ICU æä¾›è€…支æ´ã€‚" + +# rewrite/rewriteDefine.c:421 +#: initdb.c:2279 +#, c-format +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "無法將å€åŸŸå稱 \"%s\" 轉æ›ç‚ºèªžè¨€æ¨™ç±¤: %s" + +# input.c:213 +#: initdb.c:2285 initdb.c:2337 initdb.c:2416 +#, c-format +msgid "ICU is not supported in this build" +msgstr "æ­¤ç‰ˆæœ¬ä¸æ”¯æ´ ICU" + +# utils/init/miscinit.c:792 utils/misc/guc.c:5074 +#: initdb.c:2308 +#, c-format +msgid "could not get language from locale \"%s\": %s" +msgstr "無法從å€åŸŸè¨­å®š \"%s\" ç²å¾—語言: %s" + +#: initdb.c:2334 +#, c-format +msgid "locale \"%s\" has unknown language \"%s\"" +msgstr "å€åŸŸè¨­å®š \"%s\" 具有未知的語言 \"%s\"" + +# commands/aggregatecmds.c:111 +#: initdb.c:2400 +#, c-format +msgid "ICU locale must be specified" +msgstr "必須指定 ICU å€åŸŸè¨­å®š" + +#: initdb.c:2404 +#, c-format +msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" +msgstr "使用語言標籤 \"%s\" 來設定 ICU å€åŸŸ \"%s\"。\n" + +#: initdb.c:2427 +#, c-format +msgid "" +"%s initializes a PostgreSQL database cluster.\n" +"\n" +msgstr "" +"%s åˆå§‹åŒ– PostgreSQL 資料庫å¢é›†ã€‚\n" +"\n" + +#: initdb.c:2428 +#, c-format +msgid "Usage:\n" +msgstr "用法:\n" + +#: initdb.c:2429 +#, c-format +msgid " %s [OPTION]... [DATADIR]\n" +msgstr " %s [OPTION]... [DATADIR]\n" + +#: initdb.c:2430 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"é¸é …:\n" + +#: initdb.c:2431 +#, c-format +msgid " -A, --auth=METHOD default authentication method for local connections\n" +msgstr " -A, --auth=METHOD 本機連線的é è¨­é©—證方法\n" + +#: initdb.c:2432 +#, c-format +msgid " --auth-host=METHOD default authentication method for local TCP/IP connections\n" +msgstr " --auth-host=METHOD 本機 TCP/IP 連線的é è¨­é©—證方法\n" + +#: initdb.c:2433 +#, c-format +msgid " --auth-local=METHOD default authentication method for local-socket connections\n" +msgstr " --auth-local=METHOD 本機 socket 連線的é è¨­é©—證方法\n" + +#: initdb.c:2434 +#, c-format +msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" +msgstr " [-D, --pgdata=]DATADIR 資料庫å¢é›†çš„ä½ç½®\n" + +#: initdb.c:2435 +#, c-format +msgid " -E, --encoding=ENCODING set default encoding for new databases\n" +msgstr " -E, --encoding=ENCODING 設定新資料庫的é è¨­ç·¨ç¢¼\n" + +#: initdb.c:2436 +#, c-format +msgid " -g, --allow-group-access allow group read/execute on data directory\n" +msgstr " -g, --allow-group-access å…è¨±ç¾¤çµ„å°æ•¸æ“šç›®éŒ„進行讀å–和執行æ“作\n" + +#: initdb.c:2437 +#, c-format +msgid " --icu-locale=LOCALE set ICU locale ID for new databases\n" +msgstr " --icu-locale=LOCALE 設定新資料庫的 ICU å€åŸŸè­˜åˆ¥ç¢¼\n" + +#: initdb.c:2438 +#, c-format +msgid " --icu-rules=RULES set additional ICU collation rules for new databases\n" +msgstr " --icu-rules=RULES 設定新資料庫的é¡å¤– ICU 排åºè¦å‰‡\n" + +#: initdb.c:2439 +#, c-format +msgid " -k, --data-checksums use data page checksums\n" +msgstr " -k, --data-checksums ä½¿ç”¨è³‡æ–™é æª¢æŸ¥\n" + +#: initdb.c:2440 +#, c-format +msgid " --locale=LOCALE set default locale for new databases\n" +msgstr " --locale=LOCALE 定新資料庫的é è¨­å€åŸŸ\n" + +#: initdb.c:2441 +#, c-format +msgid "" +" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" +" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n" +" set default locale in the respective category for\n" +" new databases (default taken from environment)\n" +msgstr "" +" --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" +" --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n" +" 設定新資料庫相應類別的é è¨­å€åŸŸ(é è¨­å€¼å–自環境)\n" + +#: initdb.c:2445 +#, c-format +msgid " --no-locale equivalent to --locale=C\n" +msgstr " --no-locale åŒ --locale=C\n" + +#: initdb.c:2446 +#, c-format +msgid "" +" --locale-provider={libc|icu}\n" +" set default locale provider for new databases\n" +msgstr "" +" --locale-provider={libc|icu}\n" +" 設定新資料庫的é è¨­åŸŸæä¾›è€…\n" + +#: initdb.c:2448 +#, c-format +msgid " --pwfile=FILE read password for the new superuser from file\n" +msgstr " --pwfile=FILE å¾žæª”æ¡ˆä¸­è®€å–æ–°è¶…級使用者的密碼\n" + +#: initdb.c:2449 +#, c-format +msgid "" +" -T, --text-search-config=CFG\n" +" default text search configuration\n" +msgstr "" +" -T, --text-search-config=CFG\n" +" é è¨­æ–‡å­—æœå°‹é…ç½®\n" + +#: initdb.c:2451 +#, c-format +msgid " -U, --username=NAME database superuser name\n" +msgstr " -U, --username=NAME 資料庫超級使用者å稱\n" + +#: initdb.c:2452 +#, c-format +msgid " -W, --pwprompt prompt for a password for the new superuser\n" +msgstr " -W, --pwprompt æç¤ºè¼¸å…¥æ–°è¶…級使用者的密碼\n" + +#: initdb.c:2453 +#, c-format +msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" +msgstr " -X, --waldir=WALDIR write-ahead 日誌目錄的ä½ç½®\n" + +#: initdb.c:2454 +#, c-format +msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" +msgstr " --wal-segsize=SIZE WAL 片段的大å°ï¼Œå–®ä½æ˜¯ MB\n" + +#: initdb.c:2455 +#, c-format +msgid "" +"\n" +"Less commonly used options:\n" +msgstr "" +"\n" +"較少使用的é¸é …:\n" + +# postmaster/postmaster.c:1022 tcop/postgres.c:2120 +#: initdb.c:2456 +#, c-format +msgid " -c, --set NAME=VALUE override default setting for server parameter\n" +msgstr " -c, --set NAME=VALUE 覆寫伺æœå™¨åƒæ•¸çš„é è¨­è¨­å®š\n" + +#: initdb.c:2457 +#, c-format +msgid " -d, --debug generate lots of debugging output\n" +msgstr " -d, --debug 產生大é‡çš„除錯訊æ¯\n" + +#: initdb.c:2458 +#, c-format +msgid " --discard-caches set debug_discard_caches=1\n" +msgstr " --discard-caches 設定 debug_discard_caches=1\n" + +#: initdb.c:2459 +#, c-format +msgid " -L DIRECTORY where to find the input files\n" +msgstr " -L DIRECTORY 指定尋找輸入檔案的路徑\n" + +#: initdb.c:2460 +#, c-format +msgid " -n, --no-clean do not clean up after errors\n" +msgstr " -n, --no-clean 錯誤發生後ä¸åŸ·è¡Œæ¸…ç†å‹•作\n" + +#: initdb.c:2461 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr " -N, --no-sync ä¸ç­‰å¾…將被安全地寫入ç£ç¢Ÿçš„資料\n" + +#: initdb.c:2462 +#, c-format +msgid " --no-instructions do not print instructions for next steps\n" +msgstr " --no-instructions ä¸é¡¯ç¤ºä¸‹ä¸€æ­¥æ“作的指示\n" + +#: initdb.c:2463 +#, c-format +msgid " -s, --show show internal settings\n" +msgstr " -s, --show 顯示內部設定\n" + +#: initdb.c:2464 +#, c-format +msgid " -S, --sync-only only sync database files to disk, then exit\n" +msgstr " -S, --sync-only åªåŒæ­¥è³‡æ–™åº«æª”案至ç£ç¢Ÿï¼Œç„¶å¾ŒçµæŸ\n" + +#: initdb.c:2465 +#, c-format +msgid "" +"\n" +"Other options:\n" +msgstr "" +"\n" +"å…¶ä»–é¸é …:\n" + +#: initdb.c:2466 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version é¡¯ç¤ºç‰ˆæœ¬ï¼Œç„¶å¾ŒçµæŸ\n" + +#: initdb.c:2467 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help é¡¯ç¤ºèªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" + +#: initdb.c:2468 +#, c-format +msgid "" +"\n" +"If the data directory is not specified, the environment variable PGDATA\n" +"is used.\n" +msgstr "" +"\n" +"如果未指定資料目錄,則將使用環境變數 PGDATA。\n" + +#: initdb.c:2470 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"回報錯誤至 <%s>。\n" + +#: initdb.c:2471 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 網站: <%s>\n" + +#: initdb.c:2499 +#, c-format +msgid "invalid authentication method \"%s\" for \"%s\" connections" +msgstr "無效的身份驗證方法 \"%s\" 用於 \"%s\" 連線" + +#: initdb.c:2513 +#, c-format +msgid "must specify a password for the superuser to enable password authentication" +msgstr "必須為超級使用者指定密碼以啟用密碼驗證" + +#: initdb.c:2532 +#, c-format +msgid "no data directory specified" +msgstr "未指定資料目錄" + +#: initdb.c:2533 +#, c-format +msgid "You must identify the directory where the data for this database system will reside. Do this with either the invocation option -D or the environment variable PGDATA." +msgstr "您必須確èªè³‡æ–™åº«ç³»çµ±å­˜æ”¾è³‡æ–™çš„目錄。您å¯ä»¥ä½¿ç”¨ -D é¸é …或是環境變數 PGDATA。" + +#: initdb.c:2550 +#, c-format +msgid "could not set environment" +msgstr "無法設定環境" + +#: initdb.c:2568 +#, c-format +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "ç¨‹å¼ \"%s\" 為 %s 所需,但未在åŒä¸€ç›®éŒ„中找到 \"%s\"" + +#: initdb.c:2571 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "ç¨‹å¼ \"%s\" 被 \"%s\" 找到,但版本ä¸åŒæ–¼ %s" + +#: initdb.c:2586 +#, c-format +msgid "input file location must be an absolute path" +msgstr "輸入檔案的ä½ç½®å¿…須是絕å°è·¯å¾‘" + +#: initdb.c:2603 +#, c-format +msgid "The database cluster will be initialized with locale \"%s\".\n" +msgstr "資料庫å¢é›†å°‡ä»¥å€åŸŸ \"%s\" 進行åˆå§‹åŒ–。\n" + +#: initdb.c:2606 +#, c-format +msgid "The database cluster will be initialized with this locale configuration:\n" +msgstr "資料庫å¢é›†å°‡ä»¥æ­¤èªžè¨€ç’°å¢ƒè¨­å®šé€²è¡Œåˆå§‹åŒ–:\n" + +#: initdb.c:2607 +#, c-format +msgid " provider: %s\n" +msgstr " æä¾›è€…: %s\n" + +#: initdb.c:2609 +#, c-format +msgid " ICU locale: %s\n" +msgstr " ICU å€åŸŸ: %s\n" + +#: initdb.c:2610 +#, c-format +msgid "" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" +msgstr "" +" LC_COLLATE: %s\n" +" LC_CTYPE: %s\n" +" LC_MESSAGES: %s\n" +" LC_MONETARY: %s\n" +" LC_NUMERIC: %s\n" +" LC_TIME: %s\n" + +#: initdb.c:2640 +#, c-format +msgid "could not find suitable encoding for locale \"%s\"" +msgstr "找ä¸åˆ°é©åˆå€åŸŸ \"%s\" 的編碼" + +#: initdb.c:2642 +#, c-format +msgid "Rerun %s with the -E option." +msgstr "以 -E é¸é …釿–°åŸ·è¡Œ %s。" + +# tcop/postgres.c:2636 tcop/postgres.c:2652 +#: initdb.c:2643 initdb.c:3176 initdb.c:3284 initdb.c:3304 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "用 \"%s --help\" å–得更多資訊。" + +#: initdb.c:2655 +#, c-format +msgid "" +"Encoding \"%s\" implied by locale is not allowed as a server-side encoding.\n" +"The default database encoding will be set to \"%s\" instead.\n" +msgstr "" +"ç”±å€åŸŸéš±å«çš„編碼 \"%s\" ä¸è¢«å…許作為伺æœå™¨ç«¯çš„編碼。\n" +"é è¨­çš„資料庫編碼將設定為 \"%s\"。\n" + +#: initdb.c:2660 +#, c-format +msgid "locale \"%s\" requires unsupported encoding \"%s\"" +msgstr "å€åŸŸ \"%s\" 需è¦ä¸æ”¯æ´çš„編碼 \"%s\"。" + +#: initdb.c:2662 +#, c-format +msgid "Encoding \"%s\" is not allowed as a server-side encoding." +msgstr "編碼 \"%s\" ä¸å…許作為伺æœå™¨ç«¯ç·¨ç¢¼ã€‚" + +#: initdb.c:2664 +#, c-format +msgid "Rerun %s with a different locale selection." +msgstr "以ä¸åŒçš„å€åŸŸé‡æ–°åŸ·è¡Œ %s。" + +#: initdb.c:2672 +#, c-format +msgid "The default database encoding has accordingly been set to \"%s\".\n" +msgstr "é è¨­è³‡æ–™åº«ç·¨ç¢¼å·²è¢«è¨­ç‚º \"%s\"。\n" + +#: initdb.c:2741 +#, c-format +msgid "could not find suitable text search configuration for locale \"%s\"" +msgstr "無法找到é©ç”¨æ–¼å€åŸŸ \"%s\" 的文字æœå°‹é…ç½®" + +# utils/misc/guc.c:2507 +#: initdb.c:2752 +#, c-format +msgid "suitable text search configuration for locale \"%s\" is unknown" +msgstr "無法確定é©ç”¨æ–¼å€åŸŸ \"%s\" 的文字æœå°‹é…ç½®" + +#: initdb.c:2757 +#, c-format +msgid "specified text search configuration \"%s\" might not match locale \"%s\"" +msgstr "指定的文字æœå°‹é…ç½® \"%s\" å¯èƒ½èˆ‡å€åŸŸ \"%s\" ä¸ç›¸ç¬¦" + +#: initdb.c:2762 +#, c-format +msgid "The default text search configuration will be set to \"%s\".\n" +msgstr "é è¨­æ–‡å­—æœå°‹é…置將被設為 \"%s\"。\n" + +#: initdb.c:2805 initdb.c:2876 +#, c-format +msgid "creating directory %s ... " +msgstr "建立目錄 %s… " + +# commands/tablespace.c:154 commands/tablespace.c:162 +# commands/tablespace.c:168 +#: initdb.c:2810 initdb.c:2881 initdb.c:2929 initdb.c:2985 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "無法建立目錄 \"%s\": %m" + +#: initdb.c:2819 initdb.c:2891 +#, c-format +msgid "fixing permissions on existing directory %s ... " +msgstr "ä¿®å¾©ç¾æœ‰ç›®éŒ„ %s 的權é™â€¦ " + +#: initdb.c:2824 initdb.c:2896 +#, c-format +msgid "could not change permissions of directory \"%s\": %m" +msgstr "無法變更目錄 \"%s\" 的權é™: %m" + +# commands/tablespace.c:334 +#: initdb.c:2836 initdb.c:2908 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "目錄 \"%s\" å·²å­˜åœ¨ï¼Œä½†ä¸æ˜¯ç©ºç›®éŒ„。" + +#: initdb.c:2840 +#, c-format +msgid "If you want to create a new database system, either remove or empty the directory \"%s\" or run %s with an argument other than \"%s\"." +msgstr "è‹¥è¦å»ºç«‹æ–°çš„資料庫系統,請刪除或清空目錄 \"%s\",或執行 %s 並使用 \"%s\" ä»¥å¤–çš„åƒæ•¸ã€‚" + +# utils/init/postinit.c:283 +#: initdb.c:2848 initdb.c:2918 initdb.c:3325 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "無法存å–目錄 \"%s\": %m" + +#: initdb.c:2869 +#, c-format +msgid "WAL directory location must be an absolute path" +msgstr "WAL 目錄的ä½ç½®å¿…須是絕å°è·¯å¾‘" + +#: initdb.c:2912 +#, c-format +msgid "If you want to store the WAL there, either remove or empty the directory \"%s\"." +msgstr "如果您想將 WAL 存儲在這個ä½ç½®ï¼Œè«‹åˆªé™¤æˆ–清空目錄 \"%s\"。" + +# commands/tablespace.c:355 commands/tablespace.c:984 +#: initdb.c:2922 +#, c-format +msgid "could not create symbolic link \"%s\": %m" +msgstr "ç„¡æ³•å»ºç«‹ç¬¦è™Ÿé€£çµ \"%s\": %m" + +#: initdb.c:2941 +#, c-format +msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." +msgstr "其中包å«ä¸€å€‹ä»¥é»žè™Ÿé–‹é ­çš„éš±è—æª”案,å¯èƒ½æ˜¯å› ç‚ºå®ƒæ˜¯ä¸€å€‹æŽ›è¼‰é»žã€‚" + +#: initdb.c:2943 +#, c-format +msgid "It contains a lost+found directory, perhaps due to it being a mount point." +msgstr "這包å«ä¸€å€‹ lost+found 目錄,å¯èƒ½æ˜¯å› ç‚ºå®ƒæ˜¯ä¸€å€‹æŽ›è¼‰é»žã€‚" + +#: initdb.c:2945 +#, c-format +msgid "" +"Using a mount point directly as the data directory is not recommended.\n" +"Create a subdirectory under the mount point." +msgstr "" +"ä¸å»ºè­°ç›´æŽ¥ä½¿ç”¨æŽ›è¼‰é»žä½œç‚ºè³‡æ–™ç›®éŒ„。\n" +"請在掛載點下建立一個å­ç›®éŒ„。" + +#: initdb.c:2971 +#, c-format +msgid "creating subdirectories ... " +msgstr "建立å­ç›®éŒ„… " + +#: initdb.c:3014 +msgid "performing post-bootstrap initialization ... " +msgstr "執行啟動後的åˆå§‹åŒ–程åºâ€¦ " + +# bootstrap/bootstrap.c:304 postmaster/postmaster.c:500 tcop/postgres.c:2507 +#: initdb.c:3175 +#, c-format +msgid "-c %s requires a value" +msgstr "-c %s éœ€è¦æä¾›ä¸€å€‹å€¼" + +#: initdb.c:3200 +#, c-format +msgid "Running in debug mode.\n" +msgstr "以除錯模å¼åŸ·è¡Œã€‚\n" + +#: initdb.c:3204 +#, c-format +msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" +msgstr "以䏿¸…ç†æ¨¡å¼åŸ·è¡Œï¼ŒéŒ¯èª¤å°‡ä¸æœƒè¢«æ¸…除。\n" + +#: initdb.c:3274 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "未能識別的å€åŸŸæä¾›è€…: %s" + +#: initdb.c:3302 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "å‘½ä»¤åˆ—åƒæ•¸éŽå¤š(第一個是 \"%s\")" + +#: initdb.c:3309 initdb.c:3313 +#, c-format +msgid "%s cannot be specified unless locale provider \"%s\" is chosen" +msgstr "除éžé¸æ“‡äº†èªžè¨€æä¾›è€… \"%2$s\",å¦å‰‡ä¸èƒ½æŒ‡å®š %1$s" + +#: initdb.c:3327 initdb.c:3404 +msgid "syncing data to disk ... " +msgstr "åŒæ­¥è³‡æ–™åˆ°ç£ç¢Ÿâ€¦ " + +#: initdb.c:3335 +#, c-format +msgid "password prompt and password file cannot be specified together" +msgstr "ä¸èƒ½åŒæ™‚指定密碼æç¤ºå’Œå¯†ç¢¼æª”案" + +# commands/define.c:197 +#: initdb.c:3357 +#, c-format +msgid "argument of --wal-segsize must be a number" +msgstr "--wal-segsize çš„åƒæ•¸å¿…須是數字" + +#: initdb.c:3359 +#, c-format +msgid "argument of --wal-segsize must be a power of two between 1 and 1024" +msgstr "--wal-segsize çš„åƒæ•¸å¿…須是1å’Œ1024之間的二的次方數" + +#: initdb.c:3373 +#, c-format +msgid "superuser name \"%s\" is disallowed; role names cannot begin with \"pg_\"" +msgstr "ä¸å…許使用超級使用者å稱 \"%s\",角色å稱ä¸èƒ½ä»¥ \"pg_\" é–‹é ­" + +#: initdb.c:3375 +#, c-format +msgid "" +"The files belonging to this database system will be owned by user \"%s\".\n" +"This user must also own the server process.\n" +"\n" +msgstr "" +"資料庫系統的檔案屬於使用者 \"%s\"ï¼Œè©²ä½¿ç”¨è€…ä¹Ÿå¿…é ˆæ“æœ‰ä¼ºæœå™¨è¡Œç¨‹ã€‚\n" +"\n" + +#: initdb.c:3391 +#, c-format +msgid "Data page checksums are enabled.\n" +msgstr "å·²å•Ÿå‹•è³‡æ–™é æª¢æŸ¥ã€‚\n" + +#: initdb.c:3393 +#, c-format +msgid "Data page checksums are disabled.\n" +msgstr "å·²åœç”¨è³‡æ–™é æª¢æŸ¥ã€‚\n" + +#: initdb.c:3410 +#, c-format +msgid "" +"\n" +"Sync to disk skipped.\n" +"The data directory might become corrupt if the operating system crashes.\n" +msgstr "" +"\n" +"已略éŽåŒæ­¥è‡³ç£ç¢Ÿã€‚\n" +"如果作業系統當機,資料目錄å¯èƒ½æœƒæå£žã€‚\n" + +# libpq/auth.c:465 +#: initdb.c:3415 +#, c-format +msgid "enabling \"trust\" authentication for local connections" +msgstr "啟動本機連線的 \"trust\" 身份驗證" + +#: initdb.c:3416 +#, c-format +msgid "You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb." +msgstr "您å¯ä»¥åœ¨ä¸‹æ¬¡åŸ·è¡Œ initdb 時é€éŽç·¨è¼¯ pg_hba.conf 或用é¸é … -A 或 --auth-local å’Œ --auth-host 來變更這個設定。" + +#. translator: This is a placeholder in a shell command. +#: initdb.c:3446 +msgid "logfile" +msgstr "logfile" + +#: initdb.c:3448 +#, c-format +msgid "" +"\n" +"Success. You can now start the database server using:\n" +"\n" +" %s\n" +"\n" +msgstr "" +"\n" +"æˆåŠŸï¼Œæ‚¨ç¾åœ¨å¯ä»¥ç”¨ä¸‹åˆ—命令啟動資料庫伺æœå™¨:\n" +"\n" +" %s\n" +"\n" + +#~ msgid " --locale=LOCALE initialize database cluster with given locale\n" +#~ msgstr " --locale=LOCALE 以指定的localeåˆå§‹åŒ–資料庫cluster\n" + +#~ msgid "%s: The password file was not generated. Please report this problem.\n" +#~ msgstr "%s:無法產生密碼檔,請回報這個錯誤。\n" + +#, c-format +#~ msgid "%s: could not access directory \"%s\": %s\n" +#~ msgstr "%s: 無法存å–目錄 \"%s\": %s\n" + +# utils/fmgr/dfmgr.c:107 utils/fmgr/dfmgr.c:209 utils/fmgr/dfmgr.c:263 +#, c-format +#~ msgid "%s: could not access file \"%s\": %s\n" +#~ msgstr "%s: ç„¡æ³•å­˜å–æª”案 \"%s\":%s\n" + +#, c-format +#~ msgid "%s: could not create directory \"%s\": %s\n" +#~ msgstr "%s: 無法建立目錄\"%s\": %s\n" + +# commands/tablespace.c:355 commands/tablespace.c:984 +#, c-format +#~ msgid "%s: could not create symbolic link \"%s\": %s\n" +#~ msgstr "%s: ç„¡æ³•å»ºç«‹ç¬¦è™Ÿé€£çµ \"%s\":%s\n" + +#~ msgid "%s: could not determine valid short version string\n" +#~ msgstr "%s:無法å–得短版本字串\n" + +#, c-format +#~ msgid "%s: could not get current user name: %s\n" +#~ msgstr "%s: 無法å–å¾—ç›®å‰ä½¿ç”¨è€…å稱: %s\n" + +#, c-format +#~ msgid "%s: could not obtain information about current user: %s\n" +#~ msgstr "%s: 無法å–å¾—ç›®å‰ä½¿ç”¨è€…資訊; %s\n" + +#, c-format +#~ msgid "%s: could not open file \"%s\" for reading: %s\n" +#~ msgstr "%s: 無法開啟檔案\"%s\"讀å–資料: %s\n" + +#, c-format +#~ msgid "%s: could not open file \"%s\" for writing: %s\n" +#~ msgstr "%s: 無法開啟檔案\"%s\"寫入資料: %s\n" + +#, c-format +#~ msgid "%s: could not write file \"%s\": %s\n" +#~ msgstr "%s: 無法寫入檔案\"%s\"; %s\n" + +#~ msgid "%s: failed\n" +#~ msgstr "%s:失敗\n" + +#, c-format +#~ msgid "%s: failed to remove contents of transaction log directory\n" +#~ msgstr "%s: 無法移除交易日誌目錄的內容\n" + +#, c-format +#~ msgid "%s: failed to remove transaction log directory\n" +#~ msgstr "%s: 無法移除交易日誌目錄\n" + +#, c-format +#~ msgid "%s: file \"%s\" does not exist\n" +#~ msgstr "%s: 檔案 \"%s\" ä¸å­˜åœ¨\n" + +#, c-format +#~ msgid "" +#~ "%s: input file \"%s\" does not belong to PostgreSQL %s\n" +#~ "Check your installation or specify the correct path using the option -L.\n" +#~ msgstr "" +#~ "%s: 輸入檔 \"%s\" ä¸å±¬æ–¼ PostgreSQL %s\n" +#~ "è«‹æª¢æŸ¥ä½ çš„å®‰è£æˆ–用 -L é¸é …指定正確的路徑。\n" + +#, c-format +#~ msgid "%s: invalid locale name \"%s\"\n" +#~ msgstr "%s: 無效的å€åŸŸå稱 \"%s\"\n" + +#, c-format +#~ msgid "%s: locale name has non-ASCII characters, skipped: %s\n" +#~ msgstr "%s: å€åŸŸå稱有éžASCII字元,忽略: %s\n" + +#, c-format +#~ msgid "%s: locale name too long, skipped: %s\n" +#~ msgstr "%s: å€åŸŸå稱太長,忽略: %s\n" + +#, c-format +#~ msgid "%s: out of memory\n" +#~ msgstr "%s: 記憶體用盡\n" + +#, c-format +#~ msgid "%s: removing contents of transaction log directory \"%s\"\n" +#~ msgstr "%s: 正在移除交易日誌目錄的內容 \"%s\"\n" + +# access/transam/xlog.c:2163 +#, c-format +#~ msgid "%s: removing transaction log directory \"%s\"\n" +#~ msgstr "%s: 正在移除交易日誌目錄 \"%s\"\n" + +# commands/tablespace.c:386 commands/tablespace.c:483 +#, c-format +#~ msgid "%s: symlinks are not supported on this platform" +#~ msgstr "%s: 此平å°ä¸æ”¯æ´ç¬¦è™Ÿé€£çµ" + +#, c-format +#~ msgid "%s: transaction log directory \"%s\" not removed at user's request\n" +#~ msgstr "%s: 無法ä¾ä½¿ç”¨è€…è¦æ±‚刪除交易日誌目錄 \"%s\"\n" + +#, c-format +#~ msgid "%s: unrecognized authentication method \"%s\"\n" +#~ msgstr "%s: 無法辨èªçš„驗證方å¼\"%s\"\n" + +# describe.c:1542 +#, c-format +#~ msgid "No usable system locales were found.\n" +#~ msgstr "找ä¸åˆ°å¯ç”¨çš„系統å€åŸŸã€‚\n" + +#, c-format +#~ msgid "" +#~ "The program \"postgres\" is needed by %s but was not found in the\n" +#~ "same directory as \"%s\".\n" +#~ "Check your installation.\n" +#~ msgstr "" +#~ "%s 需è¦ç¨‹å¼ \"postgres\",但是在與\"%s\"相åŒçš„目錄中找ä¸åˆ°ã€‚\n" +#~ "請檢查你的安è£ã€‚\n" + +#, c-format +#~ msgid "" +#~ "The program \"postgres\" was found by \"%s\"\n" +#~ "but was not the same version as %s.\n" +#~ "Check your installation.\n" +#~ msgstr "" +#~ "\"%s\" å·²æ‰¾åˆ°ç¨‹å¼ \"postgres\",但是與 %s 的版本ä¸ç¬¦ã€‚\n" +#~ "請檢查你的安è£ã€‚\n" + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "執行\"%s --help\"å–得更多資訊。\n" + +#, c-format +#~ msgid "Use the option \"--debug\" to see details.\n" +#~ msgstr "用 \"--debug\" é¸é …å–得詳細資訊。\n" + +#, c-format +#~ msgid "child process was terminated by signal %s" +#~ msgstr "å­è¡Œç¨‹è¢«ä¿¡è™Ÿ %s 終止" + +#~ msgid "copying template1 to postgres ... " +#~ msgstr "複製 template1 到 postgres..." + +#~ msgid "copying template1 to template0 ... " +#~ msgstr "複製 template1 到 template0 ..." + +#, c-format +#~ msgid "could not change directory to \"%s\"" +#~ msgstr "無法切æ›ç›®éŒ„至\"%s\"" + +#, c-format +#~ msgid "could not identify current directory: %s" +#~ msgstr "無法識別目å‰çš„目錄:%s" + +# access/transam/slru.c:930 commands/tablespace.c:529 +# commands/tablespace.c:694 utils/adt/misc.c:174 +#, c-format +#~ msgid "could not open directory \"%s\": %s\n" +#~ msgstr "無法開啟目錄 \"%s\":%s\n" + +# access/transam/slru.c:967 commands/tablespace.c:577 +# commands/tablespace.c:721 +#, c-format +#~ msgid "could not read directory \"%s\": %s\n" +#~ msgstr "無法讀å–目錄 \"%s\":%s\n" + +#, c-format +#~ msgid "could not read symbolic link \"%s\"" +#~ msgstr "無法讀å–符號連çµ\"%s\"" + +# commands/tablespace.c:610 +#, c-format +#~ msgid "could not remove file or directory \"%s\": %s\n" +#~ msgstr "無法移除檔案或目錄 \"%s\":%s\n" + +# access/transam/slru.c:967 commands/tablespace.c:577 +# commands/tablespace.c:721 +#, c-format +#~ msgid "could not stat file or directory \"%s\": %s\n" +#~ msgstr "ç„¡æ³•å°æª”案或目錄 \"%s\" 執行 stat 函å¼:%s\n" + +#~ msgid "creating collations ... " +#~ msgstr "å»ºç«‹å®šåº ... " + +#~ msgid "creating conversions ... " +#~ msgstr "å»ºç«‹è½‰æ› ... " + +#~ msgid "creating dictionaries ... " +#~ msgstr "建立字典..." + +#~ msgid "creating directory %s/%s ... " +#~ msgstr "建立目錄 %s/%s ..." + +#~ msgid "creating information schema ... " +#~ msgstr "建立information schema ... " + +#~ msgid "creating system views ... " +#~ msgstr "建立系統views..." + +#, c-format +#~ msgid "creating template1 database in %s/base/1 ... " +#~ msgstr "建立 template1 資料庫於 %s/base/1 ... " + +#~ msgid "enabling unlimited row size for system tables ... " +#~ msgstr "啟用系統資料表的無資料筆數é™åˆ¶ ..." + +#~ msgid "initializing dependencies ... " +#~ msgstr "åˆå§‹åŒ–ç›¸ä¾æ€§..." + +#~ msgid "initializing pg_authid ... " +#~ msgstr "åˆå§‹åŒ– pg_authid..." + +#~ msgid "loading PL/pgSQL server-side language ... " +#~ msgstr "載入 PL/pgSQL 伺æœå™¨ç«¯èªžè¨€ ..." + +#~ msgid "loading system objects' descriptions ... " +#~ msgstr "正在載入系統物件的æè¿°..." + +# commands/tablespace.c:386 commands/tablespace.c:483 +#, c-format +#~ msgid "not supported on this platform\n" +#~ msgstr "在此平å°ä¸æ”¯æ´\n" + +#, c-format +#~ msgid "setting password ... " +#~ msgstr "設定密碼..." + +#~ msgid "setting privileges on built-in objects ... " +#~ msgstr "è¨­å®šå…§å»ºç‰©ä»¶çš„æ¬Šé™ ... " + +#~ msgid "vacuuming database template1 ... " +#~ msgstr "釿•´è³‡æ–™åº«template1 ..." diff --git a/src/bin/initdb/t/001_initdb.pl b/src/bin/initdb/t/001_initdb.pl index 2d7469d2fc339..06a35ac0b738e 100644 --- a/src/bin/initdb/t/001_initdb.pl +++ b/src/bin/initdb/t/001_initdb.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # To test successful data directory creation with an additional feature, first # try to elaborate the "successful creation" test instead of adding a test. # Successful initdb consumes much time and I/O. use strict; -use warnings; +use warnings FATAL => 'all'; use Fcntl ':mode'; use File::stat qw{lstat}; use PostgreSQL::Test::Cluster; @@ -16,6 +16,7 @@ my $tempdir = PostgreSQL::Test::Utils::tempdir; my $xlogdir = "$tempdir/pgxlog"; my $datadir = "$tempdir/data"; +my $supports_syncfs = check_pg_config("#define HAVE_SYNCFS 1"); program_help_ok('initdb'); program_version_ok('initdb'); @@ -82,11 +83,22 @@ command_ok([ 'initdb', '-S', $datadir ], 'sync only'); command_fails([ 'initdb', $datadir ], 'existing data directory'); +if ($supports_syncfs) +{ + command_ok([ 'initdb', '-S', $datadir, '--sync-method', 'syncfs' ], + 'sync method syncfs'); +} +else +{ + command_fails([ 'initdb', '-S', $datadir, '--sync-method', 'syncfs' ], + 'sync method syncfs'); +} + # Check group access on PGDATA SKIP: { skip "unix-style permissions not supported on Windows", 2 - if ($windows_os); + if ($windows_os || $Config::Config{osname} eq 'cygwin'); # Init a new db with group access my $datadir_group = "$tempdir/data_group"; @@ -105,7 +117,7 @@ { command_fails_like( [ 'initdb', '--no-sync', '--locale-provider=icu', "$tempdir/data2" ], - qr/initdb: error: ICU locale must be specified/, + qr/initdb: error: locale must be specified if provider is icu/, 'locale provider ICU requires --icu-locale'); command_ok( @@ -126,7 +138,7 @@ '--lc-monetary=C', '--lc-time=C', "$tempdir/data4" ], - qr/^\s+ICU locale:\s+und\n/ms, + qr/^\s+default collation:\s+und\n/ms, 'options --locale-provider=icu --locale=und --lc-*=C'); command_fails_like( @@ -172,6 +184,61 @@ 'locale provider ICU fails since no ICU support'); } +command_fails( + [ 'initdb', '--no-sync', '--locale-provider=builtin', "$tempdir/data6" ], + 'locale provider builtin fails without --locale'); + +command_ok( + [ + 'initdb', '--no-sync', + '--locale-provider=builtin', '--locale=C', + "$tempdir/data7" + ], + 'locale provider builtin with --locale'); + +command_ok( + [ + 'initdb', '--no-sync', + '--locale-provider=builtin', '-E UTF-8', + '--lc-collate=C', '--lc-ctype=C', + '--builtin-locale=C.UTF-8', "$tempdir/data8" + ], + 'locale provider builtin with -E UTF-8 --builtin-locale=C.UTF-8'); + +command_fails( + [ + 'initdb', '--no-sync', + '--locale-provider=builtin', '-E SQL_ASCII', + '--lc-collate=C', '--lc-ctype=C', + '--builtin-locale=C.UTF-8', "$tempdir/data9" + ], + 'locale provider builtin with --builtin-locale=C.UTF-8 fails for SQL_ASCII' +); + +command_ok( + [ + 'initdb', '--no-sync', + '--locale-provider=builtin', '--lc-ctype=C', + '--locale=C', "$tempdir/data10" + ], + 'locale provider builtin with --lc-ctype'); + +command_fails( + [ + 'initdb', '--no-sync', + '--locale-provider=builtin', '--icu-locale=en', + "$tempdir/dataX" + ], + 'fails for locale provider builtin with ICU locale'); + +command_fails( + [ + 'initdb', '--no-sync', + '--locale-provider=builtin', '--icu-rules=""', + "$tempdir/dataX" + ], + 'fails for locale provider builtin with ICU rules'); + command_fails( [ 'initdb', '--no-sync', '--locale-provider=xyz', "$tempdir/dataX" ], 'fails for invalid locale provider'); @@ -187,4 +254,18 @@ command_fails([ 'initdb', '--no-sync', '--set', 'foo=bar', "$tempdir/dataX" ], 'fails for invalid --set option'); +# Make sure multiple invocations of -c parameters are added case insensitive +command_ok( + [ + 'initdb', '-cwork_mem=128', + '-cWork_Mem=256', '-cWORK_MEM=512', + "$tempdir/dataY" + ], + 'multiple -c options with different case'); + +my $conf = slurp_file("$tempdir/dataY/postgresql.conf"); +ok($conf !~ qr/^WORK_MEM = /m, "WORK_MEM should not be configured"); +ok($conf !~ qr/^Work_Mem = /m, "Work_Mem should not be configured"); +ok($conf =~ qr/^work_mem = 512/m, "work_mem should be in config"); + done_testing(); diff --git a/src/bin/meson.build b/src/bin/meson.build index 67cb50630c5a3..aa60ebaa3026f 100644 --- a/src/bin/meson.build +++ b/src/bin/meson.build @@ -1,10 +1,11 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group subdir('initdb') subdir('pg_amcheck') subdir('pg_archivecleanup') subdir('pg_basebackup') subdir('pg_checksums') +subdir('pg_combinebackup') subdir('pg_config') subdir('pg_controldata') subdir('pg_ctl') @@ -16,6 +17,7 @@ subdir('pg_test_timing') subdir('pg_upgrade') subdir('pg_verifybackup') subdir('pg_waldump') +subdir('pg_walsummary') subdir('pgbench') subdir('pgevent') subdir('psql') diff --git a/src/bin/pg_amcheck/Makefile b/src/bin/pg_amcheck/Makefile index 947f2267ed153..f9488c447a887 100644 --- a/src/bin/pg_amcheck/Makefile +++ b/src/bin/pg_amcheck/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/pg_amcheck # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/bin/pg_amcheck/Makefile @@ -40,7 +40,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_amcheck$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_amcheck$(X) $(OBJS) rm -rf tmp_check diff --git a/src/bin/pg_amcheck/meson.build b/src/bin/pg_amcheck/meson.build index 2ade5aba03caa..292b33eb09425 100644 --- a/src/bin/pg_amcheck/meson.build +++ b/src/bin/pg_amcheck/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_amcheck_sources = files( 'pg_amcheck.c', diff --git a/src/bin/pg_amcheck/nls.mk b/src/bin/pg_amcheck/nls.mk index 5e6171952c0f7..941d224e18059 100644 --- a/src/bin/pg_amcheck/nls.mk +++ b/src/bin/pg_amcheck/nls.mk @@ -2,10 +2,15 @@ CATALOG_NAME = pg_amcheck GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ pg_amcheck.c \ + ../../common/fe_memutils.c \ + ../../common/file_utils.c \ + ../../common/username.c \ ../../fe_utils/cancel.c \ ../../fe_utils/connect_utils.c \ ../../fe_utils/option_utils.c \ - ../../fe_utils/query_utils.c + ../../fe_utils/parallel_slot.c \ + ../../fe_utils/query_utils.c \ + ../../fe_utils/string_utils.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \ log_no_match GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \ diff --git a/src/bin/pg_amcheck/pg_amcheck.c b/src/bin/pg_amcheck/pg_amcheck.c index 68f8180c19fab..8844bfb6a0e45 100644 --- a/src/bin/pg_amcheck/pg_amcheck.c +++ b/src/bin/pg_amcheck/pg_amcheck.c @@ -3,7 +3,7 @@ * pg_amcheck.c * Detects corruption within database relations. * - * Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Copyright (c) 2017-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_amcheck/pg_amcheck.c @@ -102,6 +102,7 @@ typedef struct AmcheckOptions bool parent_check; bool rootdescend; bool heapallindexed; + bool checkunique; /* heap and btree hybrid option */ bool no_btree_expansion; @@ -132,6 +133,7 @@ static AmcheckOptions opts = { .parent_check = false, .rootdescend = false, .heapallindexed = false, + .checkunique = false, .no_btree_expansion = false }; @@ -148,6 +150,7 @@ typedef struct DatabaseInfo { char *datname; char *amcheck_schema; /* escaped, quoted literal */ + bool is_checkunique; } DatabaseInfo; typedef struct RelationInfo @@ -166,7 +169,7 @@ typedef struct RelationInfo * Query for determining if contrib's amcheck is installed. If so, selects the * namespace name where amcheck's functions can be found. */ -static const char *amcheck_sql = +static const char *const amcheck_sql = "SELECT n.nspname, x.extversion FROM pg_catalog.pg_extension x" "\nJOIN pg_catalog.pg_namespace n ON x.extnamespace = n.oid" "\nWHERE x.extname = 'amcheck'"; @@ -267,6 +270,7 @@ main(int argc, char *argv[]) {"heapallindexed", no_argument, NULL, 11}, {"parent-check", no_argument, NULL, 12}, {"install-missing", optional_argument, NULL, 13}, + {"checkunique", no_argument, NULL, 14}, {NULL, 0, NULL, 0} }; @@ -434,6 +438,9 @@ main(int argc, char *argv[]) if (optarg) opts.install_schema = pg_strdup(optarg); break; + case 14: + opts.checkunique = true; + break; default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -552,7 +559,7 @@ main(int argc, char *argv[]) executeCommand(conn, install_sql, opts.echo); pfree(install_sql); - pfree(schema); + PQfreemem(schema); } /* @@ -589,6 +596,39 @@ main(int argc, char *argv[]) PQdb(conn), PQgetvalue(result, 0, 1), amcheck_schema); dat->amcheck_schema = PQescapeIdentifier(conn, amcheck_schema, strlen(amcheck_schema)); + + /* + * Check the version of amcheck extension. Skip requested unique + * constraint check with warning if it is not yet supported by + * amcheck. + */ + if (opts.checkunique == true) + { + /* + * Now amcheck has only major and minor versions in the string but + * we also support revision just in case. Now it is expected to be + * zero. + */ + int vmaj = 0, + vmin = 0, + vrev = 0; + const char *amcheck_version = PQgetvalue(result, 0, 1); + + sscanf(amcheck_version, "%d.%d.%d", &vmaj, &vmin, &vrev); + + /* + * checkunique option is supported in amcheck since version 1.4 + */ + if ((vmaj == 1 && vmin < 4) || vmaj == 0) + { + pg_log_warning("option %s is not supported by amcheck version %s", + "--checkunique", amcheck_version); + dat->is_checkunique = false; + } + else + dat->is_checkunique = true; + } + PQclear(result); compile_relation_list_one_db(conn, &relations, dat, &pagestotal); @@ -845,7 +885,8 @@ prepare_btree_command(PQExpBuffer sql, RelationInfo *rel, PGconn *conn) if (opts.parent_check) appendPQExpBuffer(sql, "SELECT %s.bt_index_parent_check(" - "index := c.oid, heapallindexed := %s, rootdescend := %s)" + "index := c.oid, heapallindexed := %s, rootdescend := %s " + "%s)" "\nFROM pg_catalog.pg_class c, pg_catalog.pg_index i " "WHERE c.oid = %u " "AND c.oid = i.indexrelid " @@ -854,11 +895,13 @@ prepare_btree_command(PQExpBuffer sql, RelationInfo *rel, PGconn *conn) rel->datinfo->amcheck_schema, (opts.heapallindexed ? "true" : "false"), (opts.rootdescend ? "true" : "false"), + (rel->datinfo->is_checkunique ? ", checkunique := true" : ""), rel->reloid); else appendPQExpBuffer(sql, "SELECT %s.bt_index_check(" - "index := c.oid, heapallindexed := %s)" + "index := c.oid, heapallindexed := %s " + "%s)" "\nFROM pg_catalog.pg_class c, pg_catalog.pg_index i " "WHERE c.oid = %u " "AND c.oid = i.indexrelid " @@ -866,6 +909,7 @@ prepare_btree_command(PQExpBuffer sql, RelationInfo *rel, PGconn *conn) "AND i.indisready AND i.indisvalid AND i.indislive", rel->datinfo->amcheck_schema, (opts.heapallindexed ? "true" : "false"), + (rel->datinfo->is_checkunique ? ", checkunique := true" : ""), rel->reloid); } @@ -947,6 +991,7 @@ should_processing_continue(PGresult *res) case PGRES_SINGLE_TUPLE: case PGRES_PIPELINE_SYNC: case PGRES_PIPELINE_ABORTED: + case PGRES_TUPLES_CHUNK: return false; } return true; @@ -1160,6 +1205,7 @@ help(const char *progname) printf(_(" --startblock=BLOCK begin checking table(s) at the given block number\n")); printf(_(" --endblock=BLOCK check table(s) only up to the given block number\n")); printf(_("\nB-tree index checking options:\n")); + printf(_(" --checkunique check unique constraint if index is unique\n")); printf(_(" --heapallindexed check that all heap tuples are found within indexes\n")); printf(_(" --parent-check check index parent/child relationships\n")); printf(_(" --rootdescend search from root page to refind tuples\n")); @@ -1590,7 +1636,7 @@ compile_database_list(PGconn *conn, SimplePtrList *databases, "FROM pg_catalog.pg_database d " "LEFT OUTER JOIN exclude_raw e " "ON d.datname ~ e.rgx " - "\nWHERE d.datallowconn " + "\nWHERE d.datallowconn AND datconnlimit != -2 " "AND e.pattern_id IS NULL" ")," diff --git a/src/bin/pg_amcheck/po/LINGUAS b/src/bin/pg_amcheck/po/LINGUAS index 104448b64b66f..2358abbf78cb7 100644 --- a/src/bin/pg_amcheck/po/LINGUAS +++ b/src/bin/pg_amcheck/po/LINGUAS @@ -1 +1 @@ -de el es fr it ja ka ru sv uk zh_CN +de el es fr it ja ka ko ru sv uk zh_CN zh_TW diff --git a/src/bin/pg_amcheck/po/de.po b/src/bin/pg_amcheck/po/de.po index cf5b3b93db635..5dd5992747206 100644 --- a/src/bin/pg_amcheck/po/de.po +++ b/src/bin/pg_amcheck/po/de.po @@ -1,13 +1,13 @@ # German message translation file for pg_amcheck -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_amcheck (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: pg_amcheck (PostgreSQL) 15\n" +"Project-Id-Version: pg_amcheck (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-11 15:50+0000\n" -"PO-Revision-Date: 2022-05-11 22:10+0200\n" +"POT-Creation-Date: 2024-08-28 04:23+0000\n" +"PO-Revision-Date: 2024-08-28 07:51+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -15,31 +15,98 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "Warnung: " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "Detail: " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "Tipp: " -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "Speicher aufgebraucht\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "konnte Datei »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht lesen: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "konnte Datei »%s« nicht fsyncen: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "konnte effektive Benutzer-ID %ld nicht nachschlagen: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "Benutzer existiert nicht" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu" + +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Abbruchsanforderung gesendet\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "Konnte Abbruchsanforderung nicht senden: " @@ -48,7 +115,7 @@ msgstr "Konnte Abbruchsanforderung nicht senden: " msgid "could not connect to database %s: out of memory" msgstr "konnte nicht mit Datenbank %s verbinden: Speicher aufgebraucht" -#: ../../fe_utils/connect_utils.c:117 +#: ../../fe_utils/connect_utils.c:116 #, c-format msgid "%s" msgstr "%s" @@ -63,174 +130,214 @@ msgstr "ungültiger Wert »%s« für Option %s" msgid "%s must be in range %d..%d" msgstr "%s muss im Bereich %d..%d sein" +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "unbekannte Sync-Methode: %s" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "zu viele Jobs für diese Plattform: %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "Socket-Dateideskriptor außerhalb des gültigen Bereichs für select(): %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "Versuchen Sie es mit weniger Jobs." + +#: ../../fe_utils/parallel_slot.c:553 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "Verarbeitung der Datenbank »%s« fehlgeschlagen: %s" + #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1645 pg_amcheck.c:2090 +#: pg_amcheck.c:1693 pg_amcheck.c:2138 #, c-format msgid "query failed: %s" msgstr "Anfrage fehlgeschlagen: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:571 pg_amcheck.c:1100 pg_amcheck.c:1646 pg_amcheck.c:2091 +#: pg_amcheck.c:578 pg_amcheck.c:1147 pg_amcheck.c:1694 pg_amcheck.c:2139 #, c-format msgid "Query was: %s" msgstr "Anfrage war: %s" -#: pg_amcheck.c:399 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s«\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "Datenbankname enthält Newline oder Carriage Return: »%s«\n" + +#: pg_amcheck.c:403 #, c-format msgid "invalid argument for option %s" msgstr "ungültiges Argument für Option %s" -#: pg_amcheck.c:405 +#: pg_amcheck.c:409 #, c-format msgid "invalid start block" msgstr "ungültiger Startblock" -#: pg_amcheck.c:407 +#: pg_amcheck.c:411 #, c-format msgid "start block out of bounds" msgstr "Startblock außerhalb des gültigen Bereichs" -#: pg_amcheck.c:414 +#: pg_amcheck.c:418 #, c-format msgid "invalid end block" msgstr "ungültiger Endblock" -#: pg_amcheck.c:416 +#: pg_amcheck.c:420 #, c-format msgid "end block out of bounds" msgstr "Endblock außerhalb des gültigen Bereichs" -#: pg_amcheck.c:439 pg_amcheck.c:461 +#: pg_amcheck.c:446 pg_amcheck.c:468 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_amcheck.c:445 +#: pg_amcheck.c:452 #, c-format msgid "end block precedes start block" msgstr "Endblock kommt vor dem Startblock" -#: pg_amcheck.c:459 +#: pg_amcheck.c:466 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_amcheck.c:479 +#: pg_amcheck.c:486 #, c-format msgid "cannot specify a database name with --all" msgstr "ein Datenbankname kann nicht mit --all angegeben werden" -#: pg_amcheck.c:485 +#: pg_amcheck.c:492 #, c-format msgid "cannot specify both a database name and database patterns" msgstr "Datenbankname und Datenbankmuster können nicht zusammen angegeben werden" -#: pg_amcheck.c:513 +#: pg_amcheck.c:520 #, c-format msgid "no databases to check" msgstr "keine zu prüfenden Datenbanken" -#: pg_amcheck.c:569 +#: pg_amcheck.c:576 #, c-format msgid "database \"%s\": %s" msgstr "Datenbank »%s«: %s" -#: pg_amcheck.c:580 +#: pg_amcheck.c:587 #, c-format msgid "skipping database \"%s\": amcheck is not installed" msgstr "Datenbank »%s« übersprungen: amcheck nicht installiert" -#: pg_amcheck.c:588 +#: pg_amcheck.c:595 #, c-format msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" msgstr "in Datenbank »%s«: verwende amcheck Version »%s« in Schema »%s«" -#: pg_amcheck.c:610 +#: pg_amcheck.c:624 +#, c-format +msgid "option %s is not supported by amcheck version %s" +msgstr "Option %s wird von amcheck Version %s nicht unterstützt" + +#: pg_amcheck.c:650 #, c-format msgid "no heap tables to check matching \"%s\"" msgstr "keine zu prüfenden Tabellen, die mit »%s« übereinstimmen" -#: pg_amcheck.c:613 +#: pg_amcheck.c:653 #, c-format msgid "no btree indexes to check matching \"%s\"" msgstr "keine zu prüfenden B-Tree-Indexe, die mit »%s« übereinstimmen" -#: pg_amcheck.c:616 +#: pg_amcheck.c:656 #, c-format msgid "no relations to check in schemas matching \"%s\"" msgstr "keine zu prüfenden Relationen in Schemas, die mit »%s« übereinstimmen" -#: pg_amcheck.c:619 +#: pg_amcheck.c:659 #, c-format msgid "no relations to check matching \"%s\"" msgstr "keine zu prüfenden Relationen, die mit »%s« übereinstimmen" -#: pg_amcheck.c:647 +#: pg_amcheck.c:687 #, c-format msgid "no relations to check" msgstr "keine zu prüfenden Relationen" -#: pg_amcheck.c:730 +#: pg_amcheck.c:770 #, c-format msgid "checking heap table \"%s.%s.%s\"" msgstr "prüfe Heap-Tabelle »%s.%s.%s«" -#: pg_amcheck.c:746 +#: pg_amcheck.c:786 #, c-format msgid "checking btree index \"%s.%s.%s\"" msgstr "prüfe B-Tree-Index »%s.%s.%s«" -#: pg_amcheck.c:893 +#: pg_amcheck.c:937 #, c-format msgid "error sending command to database \"%s\": %s" msgstr "Fehler beim Senden von Befehl an Datenbank »%s«: %s" -#: pg_amcheck.c:896 +#: pg_amcheck.c:940 #, c-format msgid "Command was: %s" msgstr "Die Anweisung war: %s" -#: pg_amcheck.c:1013 +#: pg_amcheck.c:1060 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" msgstr "Heap-Tabelle »%s.%s.%s«, Block %s, Offset %s, Attribut %s:\n" -#: pg_amcheck.c:1020 +#: pg_amcheck.c:1067 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" msgstr "Heap-Tabelle »%s.%s.%s«, Block %s, Offset %s:\n" -#: pg_amcheck.c:1026 +#: pg_amcheck.c:1073 #, c-format msgid "heap table \"%s.%s.%s\", block %s:\n" msgstr "Heap-Tabelle »%s.%s.%s«, Block %s:\n" -#: pg_amcheck.c:1031 pg_amcheck.c:1042 +#: pg_amcheck.c:1078 pg_amcheck.c:1089 #, c-format msgid "heap table \"%s.%s.%s\":\n" msgstr "Heap-Tabelle »%s.%s.%s«:\n" -#: pg_amcheck.c:1046 pg_amcheck.c:1115 +#: pg_amcheck.c:1093 pg_amcheck.c:1162 #, c-format msgid "query was: %s\n" msgstr "Anfrage war: %s\n" -#: pg_amcheck.c:1097 +#: pg_amcheck.c:1144 #, c-format msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" msgstr "B-Tree-Index »%s.%s.%s«: B-Tree-Prüffunktion gab unerwartete Anzahl Zeilen zurück: %d" -#: pg_amcheck.c:1101 +#: pg_amcheck.c:1148 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "Sind die Versionen von %s und amcheck kompatibel?" -#: pg_amcheck.c:1111 +#: pg_amcheck.c:1158 #, c-format msgid "btree index \"%s.%s.%s\":\n" msgstr "B-Tree-Index »%s.%s.%s«:\n" -#: pg_amcheck.c:1136 +#: pg_amcheck.c:1183 #, c-format msgid "" "%s checks objects in a PostgreSQL database for corruption.\n" @@ -239,17 +346,17 @@ msgstr "" "%s prüft Objekte in einer PostgreSQL-Datenbank auf Beschädigung.\n" "\n" -#: pg_amcheck.c:1137 +#: pg_amcheck.c:1184 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_amcheck.c:1138 +#: pg_amcheck.c:1185 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: pg_amcheck.c:1139 +#: pg_amcheck.c:1186 #, c-format msgid "" "\n" @@ -258,77 +365,77 @@ msgstr "" "\n" "Zieloptionen:\n" -#: pg_amcheck.c:1140 +#: pg_amcheck.c:1187 #, c-format msgid " -a, --all check all databases\n" msgstr " -a, --all alle Datenbanken prüfen\n" -#: pg_amcheck.c:1141 +#: pg_amcheck.c:1188 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" msgstr " -d, --database=MUSTER übereinstimmende Datenbanken prüfen\n" -#: pg_amcheck.c:1142 +#: pg_amcheck.c:1189 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" msgstr " -D, --exclude-database=MUSTER übereinstimmende Datenbanken NICHT prüfen\n" -#: pg_amcheck.c:1143 +#: pg_amcheck.c:1190 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" msgstr " -i, --index=MUSTER übereinstimmende Indexe prüfen\n" -#: pg_amcheck.c:1144 +#: pg_amcheck.c:1191 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" msgstr " -I, --exclude-index=MUSTER übereinstimmende Indexe NICHT prüfen\n" -#: pg_amcheck.c:1145 +#: pg_amcheck.c:1192 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" msgstr " -r, --relation=MUSTER übereinstimmende Relationen prüfen\n" -#: pg_amcheck.c:1146 +#: pg_amcheck.c:1193 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" msgstr " -R, --exclude-relation=MUSTER übereinstimmende Relationen NICHT prüfen\n" -#: pg_amcheck.c:1147 +#: pg_amcheck.c:1194 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" msgstr " -s, --schema=MUSTER übereinstimmende Schemas prüfen\n" -#: pg_amcheck.c:1148 +#: pg_amcheck.c:1195 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" msgstr " -S, --exclude-schema=MUSTER übereinstimmende Schemas NICHT prüfen\n" -#: pg_amcheck.c:1149 +#: pg_amcheck.c:1196 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" msgstr " -t, --table=MUSTER übereinstimmende Tabellen prüfen\n" -#: pg_amcheck.c:1150 +#: pg_amcheck.c:1197 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" msgstr " -T, --exclude-table=MUSTER übereinstimmende Tabellen NICHT prüfen\n" -#: pg_amcheck.c:1151 +#: pg_amcheck.c:1198 #, c-format msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" msgstr " --no-dependent-indexes Liste der Relationen NICHT um Indexe erweitern\n" -#: pg_amcheck.c:1152 +#: pg_amcheck.c:1199 #, c-format msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" msgstr " --no-dependent-toast Liste der Relationen NICHT um TOAST-Tabellen erweitern\n" -#: pg_amcheck.c:1153 +#: pg_amcheck.c:1200 #, c-format msgid " --no-strict-names do NOT require patterns to match objects\n" msgstr " --no-strict-names Muster müssen NICHT mit Objekten übereinstimmen\n" -#: pg_amcheck.c:1154 +#: pg_amcheck.c:1201 #, c-format msgid "" "\n" @@ -337,32 +444,32 @@ msgstr "" "\n" "Optionen für Tabellen:\n" -#: pg_amcheck.c:1155 +#: pg_amcheck.c:1202 #, c-format msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" msgstr " --exclude-toast-pointers TOAST-Zeigern NICHT folgen\n" -#: pg_amcheck.c:1156 +#: pg_amcheck.c:1203 #, c-format msgid " --on-error-stop stop checking at end of first corrupt page\n" msgstr " --on-error-stop Prüfung nach der ersten beschädigten Seite beenden\n" -#: pg_amcheck.c:1157 +#: pg_amcheck.c:1204 #, c-format msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" msgstr " --skip=OPTION Blöcke mit »all-frozen« oder »all-visible« NICHT prüfen\n" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1205 #, c-format msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" msgstr " --startblock=BLOCK Prüfen der Tabelle(n) bei angegebener Blocknummer beginnen\n" -#: pg_amcheck.c:1159 +#: pg_amcheck.c:1206 #, c-format msgid " --endblock=BLOCK check table(s) only up to the given block number\n" msgstr " --endblock=BLOCK Tabelle(n) nur bis zur angegebenen Blocknummer prüfen\n" -#: pg_amcheck.c:1160 +#: pg_amcheck.c:1207 #, c-format msgid "" "\n" @@ -371,22 +478,27 @@ msgstr "" "\n" "Optionen für B-Tree-Indexe:\n" -#: pg_amcheck.c:1161 +#: pg_amcheck.c:1208 +#, c-format +msgid " --checkunique check unique constraint if index is unique\n" +msgstr " --checkunique Unique-Constraint prüfen, wenn der Index Unique ist\n" + +#: pg_amcheck.c:1209 #, c-format msgid " --heapallindexed check that all heap tuples are found within indexes\n" msgstr " --heapallindexed prüfen, dass alle Heap-Tupel in Indexen zu finden sind\n" -#: pg_amcheck.c:1162 +#: pg_amcheck.c:1210 #, c-format msgid " --parent-check check index parent/child relationships\n" msgstr " --parent-check Index-Eltern/Kind-Beziehungen prüfen\n" -#: pg_amcheck.c:1163 +#: pg_amcheck.c:1211 #, c-format msgid " --rootdescend search from root page to refind tuples\n" msgstr " --rootdescend Tupel erneut von der Wurzelseite aus suchen\n" -#: pg_amcheck.c:1164 +#: pg_amcheck.c:1212 #, c-format msgid "" "\n" @@ -395,37 +507,37 @@ msgstr "" "\n" "Verbindungsoptionen:\n" -#: pg_amcheck.c:1165 +#: pg_amcheck.c:1213 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: pg_amcheck.c:1166 +#: pg_amcheck.c:1214 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT Port des Datenbankservers\n" -#: pg_amcheck.c:1167 +#: pg_amcheck.c:1215 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: pg_amcheck.c:1168 +#: pg_amcheck.c:1216 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: pg_amcheck.c:1169 +#: pg_amcheck.c:1217 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password Passwortfrage erzwingen\n" -#: pg_amcheck.c:1170 +#: pg_amcheck.c:1218 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n" -#: pg_amcheck.c:1171 +#: pg_amcheck.c:1219 #, c-format msgid "" "\n" @@ -434,46 +546,46 @@ msgstr "" "\n" "Weitere Optionen:\n" -#: pg_amcheck.c:1172 +#: pg_amcheck.c:1220 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr "" " -e, --echo zeige die Befehle, die an den Server\n" " gesendet werden\n" -#: pg_amcheck.c:1173 +#: pg_amcheck.c:1221 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" msgstr "" " -j, --jobs=NUM so viele parallele Verbindungen zum Server\n" " verwenden\n" -#: pg_amcheck.c:1174 +#: pg_amcheck.c:1222 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress Fortschrittsinformationen zeigen\n" -#: pg_amcheck.c:1175 +#: pg_amcheck.c:1223 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: pg_amcheck.c:1176 +#: pg_amcheck.c:1224 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_amcheck.c:1177 +#: pg_amcheck.c:1225 #, c-format msgid " --install-missing install missing extensions\n" msgstr " --install-missing fehlende Erweiterungen installieren\n" -#: pg_amcheck.c:1178 +#: pg_amcheck.c:1226 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_amcheck.c:1180 +#: pg_amcheck.c:1228 #, c-format msgid "" "\n" @@ -482,52 +594,52 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_amcheck.c:1181 +#: pg_amcheck.c:1229 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_amcheck.c:1234 +#: pg_amcheck.c:1282 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%) %*s" -#: pg_amcheck.c:1245 +#: pg_amcheck.c:1293 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%) (%s%-*.*s)" -#: pg_amcheck.c:1260 +#: pg_amcheck.c:1308 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" msgstr "%*s/%s Relationen (%d%%), %*s/%s Seiten (%d%%)" -#: pg_amcheck.c:1319 pg_amcheck.c:1352 +#: pg_amcheck.c:1367 pg_amcheck.c:1400 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "falscher qualifizierter Name (zu viele Namensteile): %s" -#: pg_amcheck.c:1397 +#: pg_amcheck.c:1445 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "falscher Relationsname (zu viele Namensteile): %s" -#: pg_amcheck.c:1550 pg_amcheck.c:1689 +#: pg_amcheck.c:1598 pg_amcheck.c:1737 #, c-format msgid "including database \"%s\"" msgstr "Datenbank »%s« einbezogen" -#: pg_amcheck.c:1671 +#: pg_amcheck.c:1719 #, c-format msgid "internal error: received unexpected database pattern_id %d" msgstr "interner Fehler: unerwartete pattern_id %d für Datenbank empfangen" -#: pg_amcheck.c:1673 +#: pg_amcheck.c:1721 #, c-format msgid "no connectable databases to check matching \"%s\"" msgstr "keine Datenbanken, mit denen verbunden werden kann und die mit »%s« übereinstimmen" -#: pg_amcheck.c:2131 +#: pg_amcheck.c:2179 #, c-format msgid "internal error: received unexpected relation pattern_id %d" msgstr "interner Fehler: unerwartete pattern_id %d für Relation empfangen" diff --git a/src/bin/pg_amcheck/po/es.po b/src/bin/pg_amcheck/po/es.po index ed8cb6e5503c0..7dc5272b7b76d 100644 --- a/src/bin/pg_amcheck/po/es.po +++ b/src/bin/pg_amcheck/po/es.po @@ -7,10 +7,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_amcheck (PostgreSQL) 16\n" +"Project-Id-Version: pg_amcheck (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-24 23:20+0000\n" -"PO-Revision-Date: 2023-05-22 12:05+0200\n" +"POT-Creation-Date: 2024-11-16 05:22+0000\n" +"PO-Revision-Date: 2024-11-16 14:23+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -39,11 +39,78 @@ msgstr "detalle: " msgid "hint: " msgstr "consejo: " -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "memoria agotada\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "no se puede duplicar un puntero nulo (error interno)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "no se pudo abrir el archivo «%s»: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "no se pudo hacer stat al archivo «%s»: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "esta instalación no soporta el método de sync «%s»" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "no se pudo abrir el directorio «%s»: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "no se pudo leer el directorio «%s»: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "no se pudo buscar el ID de usuario efectivo %ld: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "el usuario no existe" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "fallo en la búsqueda de nombre de usuario: código de error %lu" + +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Petición de cancelación enviada\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "No se pudo enviar la petición de cancelación: " @@ -52,7 +119,7 @@ msgstr "No se pudo enviar la petición de cancelación: " msgid "could not connect to database %s: out of memory" msgstr "no se pudo conectar a la base de datos %s: memoria agotada" -#: ../../fe_utils/connect_utils.c:117 +#: ../../fe_utils/connect_utils.c:116 #, c-format msgid "%s" msgstr "%s" @@ -67,174 +134,214 @@ msgstr "el valor «%s» no es válido para la opción %s" msgid "%s must be in range %d..%d" msgstr "%s debe estar en el rango %d..%d" +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "método de sync no reconocido: %s" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "demasiados procesos para esta plataforma: %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "descriptor de archivo para socket fuera de rango para select(): %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "Intente con menos trabajos." + +#: ../../fe_utils/parallel_slot.c:553 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "falló el procesamiento de la base de datos «%s»: %s" + #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1647 pg_amcheck.c:2092 +#: pg_amcheck.c:1693 pg_amcheck.c:2138 #, c-format msgid "query failed: %s" msgstr "la consulta falló: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093 +#: pg_amcheck.c:578 pg_amcheck.c:1147 pg_amcheck.c:1694 pg_amcheck.c:2139 #, c-format msgid "Query was: %s" msgstr "La consulta era: %s" -#: pg_amcheck.c:399 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "el argumento de la orden de shell contiene un salto de línea o retorno de carro: «%s»\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "el nombre de base de datos contiene un salto de línea o retorno de carro: «%s»\n" + +#: pg_amcheck.c:403 #, c-format msgid "invalid argument for option %s" msgstr "argumento no válido para la opción %s" -#: pg_amcheck.c:405 +#: pg_amcheck.c:409 #, c-format msgid "invalid start block" msgstr "bloque de inicio no válido" -#: pg_amcheck.c:407 +#: pg_amcheck.c:411 #, c-format msgid "start block out of bounds" msgstr "bloque de inicio fuera de rango" -#: pg_amcheck.c:414 +#: pg_amcheck.c:418 #, c-format msgid "invalid end block" msgstr "bloque final no válido" -#: pg_amcheck.c:416 +#: pg_amcheck.c:420 #, c-format msgid "end block out of bounds" msgstr "bloque final fuera de rango" -#: pg_amcheck.c:439 pg_amcheck.c:461 +#: pg_amcheck.c:446 pg_amcheck.c:468 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: pg_amcheck.c:445 +#: pg_amcheck.c:452 #, c-format msgid "end block precedes start block" msgstr "bloque final precede al bloque de inicio" -#: pg_amcheck.c:459 +#: pg_amcheck.c:466 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: pg_amcheck.c:479 +#: pg_amcheck.c:486 #, c-format msgid "cannot specify a database name with --all" msgstr "no se puede especificar un nombre de base de datos al usar --all" -#: pg_amcheck.c:485 +#: pg_amcheck.c:492 #, c-format msgid "cannot specify both a database name and database patterns" msgstr "no se puede especificar al mismo tiempo un nombre de base de datos junto con patrones de bases de datos" -#: pg_amcheck.c:513 +#: pg_amcheck.c:520 #, c-format msgid "no databases to check" msgstr "no hay bases de datos para revisar" -#: pg_amcheck.c:569 +#: pg_amcheck.c:576 #, c-format msgid "database \"%s\": %s" msgstr "base de datos «%s»: %s" -#: pg_amcheck.c:580 +#: pg_amcheck.c:587 #, c-format msgid "skipping database \"%s\": amcheck is not installed" msgstr "omitiendo la base de datos «%s»: amcheck no está instalado" -#: pg_amcheck.c:588 +#: pg_amcheck.c:595 #, c-format msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" msgstr "en base de datos «%s»: usando amcheck versión «%s» en esquema «%s»" -#: pg_amcheck.c:610 +#: pg_amcheck.c:624 +#, c-format +msgid "option %s is not supported by amcheck version %s" +msgstr "la opción %s no está soportada por la versión %s de amcheck" + +#: pg_amcheck.c:650 #, c-format msgid "no heap tables to check matching \"%s\"" msgstr "no hay tablas heap para revisar que coincidan con «%s»" -#: pg_amcheck.c:613 +#: pg_amcheck.c:653 #, c-format msgid "no btree indexes to check matching \"%s\"" msgstr "no hay índices btree para revisar que coincidan con «%s»" -#: pg_amcheck.c:616 +#: pg_amcheck.c:656 #, c-format msgid "no relations to check in schemas matching \"%s\"" msgstr "no hay relaciones para revisar en esquemas que coincidan con «%s»" -#: pg_amcheck.c:619 +#: pg_amcheck.c:659 #, c-format msgid "no relations to check matching \"%s\"" msgstr "no hay relaciones para revisar que coincidan con «%s»" -#: pg_amcheck.c:647 +#: pg_amcheck.c:687 #, c-format msgid "no relations to check" msgstr "no hay relaciones para revisar" -#: pg_amcheck.c:730 +#: pg_amcheck.c:770 #, c-format msgid "checking heap table \"%s.%s.%s\"" msgstr "revisando tabla heap «%s.%s.%s»" -#: pg_amcheck.c:746 +#: pg_amcheck.c:786 #, c-format msgid "checking btree index \"%s.%s.%s\"" msgstr "revisando índice btree «%s.%s.%s»" -#: pg_amcheck.c:893 +#: pg_amcheck.c:937 #, c-format msgid "error sending command to database \"%s\": %s" msgstr "error al enviar orden a la base de datos «%s»: %s" -#: pg_amcheck.c:896 +#: pg_amcheck.c:940 #, c-format msgid "Command was: %s" msgstr "La orden era: % s" -#: pg_amcheck.c:1015 +#: pg_amcheck.c:1060 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" msgstr "tabla heap «%s.%s.%s», bloque %s, posición %s, atributo %s:\n" -#: pg_amcheck.c:1022 +#: pg_amcheck.c:1067 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" msgstr "tabla heap «%s.%s.%s», bloque %s, posición %s:\n" -#: pg_amcheck.c:1028 +#: pg_amcheck.c:1073 #, c-format msgid "heap table \"%s.%s.%s\", block %s:\n" msgstr "tabla heap «%s.%s.%s», bloque %s:\n" -#: pg_amcheck.c:1033 pg_amcheck.c:1044 +#: pg_amcheck.c:1078 pg_amcheck.c:1089 #, c-format msgid "heap table \"%s.%s.%s\":\n" msgstr "tabla heap «%s.%s.%s»:\n" -#: pg_amcheck.c:1048 pg_amcheck.c:1117 +#: pg_amcheck.c:1093 pg_amcheck.c:1162 #, c-format msgid "query was: %s\n" msgstr "la consulta era: %s\n" -#: pg_amcheck.c:1099 +#: pg_amcheck.c:1144 #, c-format msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" msgstr "índice btree «%s.%s.%s»: la función de comprobación de btree devolvió un número inesperado de registros: %d" -#: pg_amcheck.c:1103 +#: pg_amcheck.c:1148 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "¿Son compatibles la versión de %s con la de amcheck?" -#: pg_amcheck.c:1113 +#: pg_amcheck.c:1158 #, c-format msgid "btree index \"%s.%s.%s\":\n" msgstr "índice btree «%s.%s.%s»:\n" -#: pg_amcheck.c:1138 +#: pg_amcheck.c:1183 #, c-format msgid "" "%s checks objects in a PostgreSQL database for corruption.\n" @@ -243,17 +350,17 @@ msgstr "" "%s busca corrupción en objetos de una base de datos PostgreSQL.\n" "\n" -#: pg_amcheck.c:1139 +#: pg_amcheck.c:1184 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: pg_amcheck.c:1140 +#: pg_amcheck.c:1185 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPCIÓN]... [BASE-DE-DATOS]\n" -#: pg_amcheck.c:1141 +#: pg_amcheck.c:1186 #, c-format msgid "" "\n" @@ -262,77 +369,77 @@ msgstr "" "\n" "Opciones de objetivo:\n" -#: pg_amcheck.c:1142 +#: pg_amcheck.c:1187 #, c-format msgid " -a, --all check all databases\n" msgstr " -a, --all revisar todas las bases de datos\n" -#: pg_amcheck.c:1143 +#: pg_amcheck.c:1188 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" msgstr " -d, --database=PATRÓN revisar la(s) base(s) de datos que coincida(n)\n" -#: pg_amcheck.c:1144 +#: pg_amcheck.c:1189 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" msgstr " -D, --exclude-database=PATRÓN NO revisar la(s) base(s) de datos que coincida(n)\n" -#: pg_amcheck.c:1145 +#: pg_amcheck.c:1190 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" msgstr " -i, --index=PATRÓN revisar el(los) índice(s) que coincida(n)\n" -#: pg_amcheck.c:1146 +#: pg_amcheck.c:1191 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" msgstr " -I, --exclude-index=PATRÓN NO revisar el(los) índice(s) que coincida(n)\n" -#: pg_amcheck.c:1147 +#: pg_amcheck.c:1192 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" msgstr " -r, --relation=PATRÓN revisar la(s) relación(es) que coincida(n)\n" -#: pg_amcheck.c:1148 +#: pg_amcheck.c:1193 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" msgstr " -R, --exclude-relation=PATRÓN NO revisar la(s) relación(es) que coincida(n)\n" -#: pg_amcheck.c:1149 +#: pg_amcheck.c:1194 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" msgstr " -s, --schema=PATRÓN revisar el(los) esquema(s) que coincida(n)\n" -#: pg_amcheck.c:1150 +#: pg_amcheck.c:1195 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" msgstr " -S, --exclude-schema=PATRÓN NO revisar el(los) esquema(s) que coincida(n)\n" -#: pg_amcheck.c:1151 +#: pg_amcheck.c:1196 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" msgstr " -t, --table=PATRÓN revisar la(s) tabla(s) que coincida(n)\n" -#: pg_amcheck.c:1152 +#: pg_amcheck.c:1197 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" msgstr " -T, --exclude-table=PATRÓN NO revisar la(s) tabla(s) que coincida(n)\n" -#: pg_amcheck.c:1153 +#: pg_amcheck.c:1198 #, c-format msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" msgstr " --no-dependent-indexes NO expandir la lista de relaciones para incluir índices\n" -#: pg_amcheck.c:1154 +#: pg_amcheck.c:1199 #, c-format msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" msgstr " --no-dependent-toast NO expandir lista de relaciones para incluir tablas TOAST\n" -#: pg_amcheck.c:1155 +#: pg_amcheck.c:1200 #, c-format msgid " --no-strict-names do NOT require patterns to match objects\n" msgstr " --no-strict-names NO requerir que los patrones coincidan con los objetos\n" -#: pg_amcheck.c:1156 +#: pg_amcheck.c:1201 #, c-format msgid "" "\n" @@ -341,32 +448,32 @@ msgstr "" "\n" "Opciones para revisión de tabla:\n" -#: pg_amcheck.c:1157 +#: pg_amcheck.c:1202 #, c-format msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" msgstr " --exclude-toast-pointers NO seguir punteros TOAST de la relación\n" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1203 #, c-format msgid " --on-error-stop stop checking at end of first corrupt page\n" msgstr " --on-error-stop detener la revisión al final de la primera página corrupta\n" -#: pg_amcheck.c:1159 +#: pg_amcheck.c:1204 #, c-format msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" msgstr " --skip=OPTION NO revisar bloques «all-frozen» u «all-visible»\n" -#: pg_amcheck.c:1160 +#: pg_amcheck.c:1205 #, c-format msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" msgstr " --startblock=BLOQUE empezar la revisión de la(s) tabla(s) en el número de bloque especificado\n" -#: pg_amcheck.c:1161 +#: pg_amcheck.c:1206 #, c-format msgid " --endblock=BLOCK check table(s) only up to the given block number\n" msgstr " --endblock=BLOQUE solo revisar la(s) tabla(s) hasta el número de bloque especificado\n" -#: pg_amcheck.c:1162 +#: pg_amcheck.c:1207 #, c-format msgid "" "\n" @@ -375,22 +482,27 @@ msgstr "" "\n" "Opciones para revisión de índices B-tree:\n" -#: pg_amcheck.c:1163 +#: pg_amcheck.c:1208 +#, c-format +msgid " --checkunique check unique constraint if index is unique\n" +msgstr " --checkunique verificar si restricción de unicidad se cumple en índice\n" + +#: pg_amcheck.c:1209 #, c-format msgid " --heapallindexed check that all heap tuples are found within indexes\n" msgstr " --heapallindexed revisar que todas las tuplas heap se encuentren en los índices\n" -#: pg_amcheck.c:1164 +#: pg_amcheck.c:1210 #, c-format msgid " --parent-check check index parent/child relationships\n" msgstr " --parent-check revisar relaciones padre/hijo de índice\n" -#: pg_amcheck.c:1165 +#: pg_amcheck.c:1211 #, c-format msgid " --rootdescend search from root page to refind tuples\n" msgstr " --rootdescend buscar desde la página raíz para volver a encontrar tuplas\n" -#: pg_amcheck.c:1166 +#: pg_amcheck.c:1212 #, c-format msgid "" "\n" @@ -399,37 +511,37 @@ msgstr "" "\n" "Opciones de conexión:\n" -#: pg_amcheck.c:1167 +#: pg_amcheck.c:1213 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=ANFITRIÓN nombre del servidor o directorio del socket\n" -#: pg_amcheck.c:1168 +#: pg_amcheck.c:1214 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PUERTO puerto del servidor de base de datos\n" -#: pg_amcheck.c:1169 +#: pg_amcheck.c:1215 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n" -#: pg_amcheck.c:1170 +#: pg_amcheck.c:1216 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password nunca pedir contraseña\n" -#: pg_amcheck.c:1171 +#: pg_amcheck.c:1217 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password forzar la petición de contraseña\n" -#: pg_amcheck.c:1172 +#: pg_amcheck.c:1218 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=BASE base de datos de mantención alternativa\n" -#: pg_amcheck.c:1173 +#: pg_amcheck.c:1219 #, c-format msgid "" "\n" @@ -438,42 +550,42 @@ msgstr "" "\n" "Otras opciones:\n" -#: pg_amcheck.c:1174 +#: pg_amcheck.c:1220 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n" -#: pg_amcheck.c:1175 +#: pg_amcheck.c:1221 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" msgstr " -j, --jobs=NUM usar esta cantidad de conexiones concurrentes hacia el servidor\n" -#: pg_amcheck.c:1176 +#: pg_amcheck.c:1222 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress mostrar información de progreso\n" -#: pg_amcheck.c:1177 +#: pg_amcheck.c:1223 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose desplegar varios mensajes informativos\n" -#: pg_amcheck.c:1178 +#: pg_amcheck.c:1224 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión y salir\n" -#: pg_amcheck.c:1179 +#: pg_amcheck.c:1225 #, c-format msgid " --install-missing install missing extensions\n" msgstr " --install-missing instalar extensiones faltantes\n" -#: pg_amcheck.c:1180 +#: pg_amcheck.c:1226 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: pg_amcheck.c:1182 +#: pg_amcheck.c:1228 #, c-format msgid "" "\n" @@ -482,52 +594,52 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: pg_amcheck.c:1183 +#: pg_amcheck.c:1229 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: pg_amcheck.c:1236 +#: pg_amcheck.c:1282 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" msgstr "%*s/%s relaciones (%d%%), %*s/%s páginas (%d%%) %*s" -#: pg_amcheck.c:1247 +#: pg_amcheck.c:1293 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" msgstr "%*s/%s relaciones (%d%%), %*s/%s páginas (%d%%), (%s%-*.*s)" -#: pg_amcheck.c:1262 +#: pg_amcheck.c:1308 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" msgstr "%*s/%s relaciones (%d%%), %*s/%s páginas (%d%%)" -#: pg_amcheck.c:1321 pg_amcheck.c:1354 +#: pg_amcheck.c:1367 pg_amcheck.c:1400 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "el nombre no es válido (demasiados puntos): %s" -#: pg_amcheck.c:1399 +#: pg_amcheck.c:1445 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "el nombre de relación no es válido (demasiados puntos): %s" -#: pg_amcheck.c:1552 pg_amcheck.c:1691 +#: pg_amcheck.c:1598 pg_amcheck.c:1737 #, c-format msgid "including database \"%s\"" msgstr "incluyendo base de datos «%s»" -#: pg_amcheck.c:1673 +#: pg_amcheck.c:1719 #, c-format msgid "internal error: received unexpected database pattern_id %d" msgstr "error interno: se recibió pattern_id de base de datos inesperado (%d)" -#: pg_amcheck.c:1675 +#: pg_amcheck.c:1721 #, c-format msgid "no connectable databases to check matching \"%s\"" msgstr "no hay bases de datos a las que se pueda conectar que coincidan con «%s»" -#: pg_amcheck.c:2133 +#: pg_amcheck.c:2179 #, c-format msgid "internal error: received unexpected relation pattern_id %d" msgstr "error interno: se recibió pattern_id de relación inesperado (%d)" diff --git a/src/bin/pg_amcheck/po/fr.po b/src/bin/pg_amcheck/po/fr.po index 9fc553f23b70c..14157b066b0b5 100644 --- a/src/bin/pg_amcheck/po/fr.po +++ b/src/bin/pg_amcheck/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-14 10:19+0000\n" -"PO-Revision-Date: 2022-05-14 17:15+0200\n" +"POT-Creation-Date: 2024-08-29 17:53+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,33 +19,100 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "attention : " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "détail : " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "astuce : " -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "mémoire épuisée\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier « %s » : %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "n'a pas pu tester le fichier « %s » : %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "cette construction ne supporte pas la méthode de synchronisation %s" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "n'a pas pu lire le répertoire « %s » : %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "n'a pas pu trouver l'identifiant réel %ld de l'utilisateur : %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "l'utilisateur n'existe pas" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu" + +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Requête d'annulation envoyée\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "N'a pas pu envoyer la requête d'annulation : " @@ -54,7 +121,7 @@ msgstr "N'a pas pu envoyer la requête d'annulation : " msgid "could not connect to database %s: out of memory" msgstr "n'a pas pu se connecter à la base de données %s : plus de mémoire" -#: ../../fe_utils/connect_utils.c:117 +#: ../../fe_utils/connect_utils.c:116 #, c-format msgid "%s" msgstr "%s" @@ -69,174 +136,214 @@ msgstr "valeur « %s » invalide pour l'option %s" msgid "%s must be in range %d..%d" msgstr "%s doit être compris entre %d et %d" +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "méthode de synchronisation non reconnu : %s" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "trop de jobs pour cette plateforme : %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "descripteur de fichier socket hors d'échelle pour select() : %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "Essayez moins de jobs." + +#: ../../fe_utils/parallel_slot.c:553 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "le traitement de la base de données « %s » a échoué : %s" + #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1645 pg_amcheck.c:2090 +#: pg_amcheck.c:1693 pg_amcheck.c:2138 #, c-format msgid "query failed: %s" msgstr "échec de la requête : %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:571 pg_amcheck.c:1100 pg_amcheck.c:1646 pg_amcheck.c:2091 +#: pg_amcheck.c:578 pg_amcheck.c:1147 pg_amcheck.c:1694 pg_amcheck.c:2139 #, c-format msgid "Query was: %s" msgstr "La requête était : %s" -#: pg_amcheck.c:399 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "l'argument de la commande shell contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "le nom de la base contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: pg_amcheck.c:403 #, c-format msgid "invalid argument for option %s" msgstr "argument invalide pour l'option %s" -#: pg_amcheck.c:405 +#: pg_amcheck.c:409 #, c-format msgid "invalid start block" msgstr "bloc de début invalide" -#: pg_amcheck.c:407 +#: pg_amcheck.c:411 #, c-format msgid "start block out of bounds" msgstr "bloc de début hors des limites" -#: pg_amcheck.c:414 +#: pg_amcheck.c:418 #, c-format msgid "invalid end block" msgstr "bloc de fin invalide" -#: pg_amcheck.c:416 +#: pg_amcheck.c:420 #, c-format msgid "end block out of bounds" msgstr "bloc de fin hors des limites" -#: pg_amcheck.c:439 pg_amcheck.c:461 +#: pg_amcheck.c:446 pg_amcheck.c:468 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_amcheck.c:445 +#: pg_amcheck.c:452 #, c-format msgid "end block precedes start block" msgstr "le bloc de fin précède le bloc de début" -#: pg_amcheck.c:459 +#: pg_amcheck.c:466 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_amcheck.c:479 +#: pg_amcheck.c:486 #, c-format msgid "cannot specify a database name with --all" msgstr "ne peut pas spécifier un nom de base de données avec --all" -#: pg_amcheck.c:485 +#: pg_amcheck.c:492 #, c-format msgid "cannot specify both a database name and database patterns" msgstr "ne peut pas spécifier à la fois le nom d'une base de données et des motifs de noms de base" -#: pg_amcheck.c:513 +#: pg_amcheck.c:520 #, c-format msgid "no databases to check" msgstr "aucune base de données à vérifier" -#: pg_amcheck.c:569 +#: pg_amcheck.c:576 #, c-format msgid "database \"%s\": %s" msgstr "base de données « %s » : %s" -#: pg_amcheck.c:580 +#: pg_amcheck.c:587 #, c-format msgid "skipping database \"%s\": amcheck is not installed" msgstr "ignore la base « %s » : amcheck n'est pas installé" -#: pg_amcheck.c:588 +#: pg_amcheck.c:595 #, c-format msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" msgstr "dans la base de données « %s » : utilisation de la version « %s » d'amcheck dans le schéma « %s »" -#: pg_amcheck.c:610 +#: pg_amcheck.c:624 +#, c-format +msgid "option %s is not supported by amcheck version %s" +msgstr "l'option %s n'est pas acceptée par la version « %s » de amcheck" + +#: pg_amcheck.c:650 #, c-format msgid "no heap tables to check matching \"%s\"" msgstr "aucune table heap à vérifier correspondant à « %s »" -#: pg_amcheck.c:613 +#: pg_amcheck.c:653 #, c-format msgid "no btree indexes to check matching \"%s\"" msgstr "aucun index btree à vérifier correspondant à « %s »" -#: pg_amcheck.c:616 +#: pg_amcheck.c:656 #, c-format msgid "no relations to check in schemas matching \"%s\"" msgstr "aucune relation à vérifier dans les schémas correspondant à « %s »" -#: pg_amcheck.c:619 +#: pg_amcheck.c:659 #, c-format msgid "no relations to check matching \"%s\"" msgstr "aucune relation à vérifier correspondant à « %s »" -#: pg_amcheck.c:647 +#: pg_amcheck.c:687 #, c-format msgid "no relations to check" msgstr "aucune relation à vérifier" -#: pg_amcheck.c:730 +#: pg_amcheck.c:770 #, c-format msgid "checking heap table \"%s.%s.%s\"" msgstr "vérification de la table heap « %s %s.%s »" -#: pg_amcheck.c:746 +#: pg_amcheck.c:786 #, c-format msgid "checking btree index \"%s.%s.%s\"" msgstr "vérification de l'index btree « %s %s.%s »" -#: pg_amcheck.c:893 +#: pg_amcheck.c:937 #, c-format msgid "error sending command to database \"%s\": %s" msgstr "erreur de l'envoi d'une commande à la base de données « %s » : %s" -#: pg_amcheck.c:896 +#: pg_amcheck.c:940 #, c-format msgid "Command was: %s" msgstr "La commande était : %s" -#: pg_amcheck.c:1013 +#: pg_amcheck.c:1060 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" msgstr "table heap « %s.%s.%s », bloc %s, décalage %s, attribut %s :\n" -#: pg_amcheck.c:1020 +#: pg_amcheck.c:1067 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" msgstr "table heap « %s.%s.%s », bloc %s, décalage %s :\n" -#: pg_amcheck.c:1026 +#: pg_amcheck.c:1073 #, c-format msgid "heap table \"%s.%s.%s\", block %s:\n" msgstr "table heap « %s %s.%s », bloc %s :\n" -#: pg_amcheck.c:1031 pg_amcheck.c:1042 +#: pg_amcheck.c:1078 pg_amcheck.c:1089 #, c-format msgid "heap table \"%s.%s.%s\":\n" msgstr "table heap « %s %s.%s » :\n" -#: pg_amcheck.c:1046 pg_amcheck.c:1115 +#: pg_amcheck.c:1093 pg_amcheck.c:1162 #, c-format msgid "query was: %s\n" msgstr "la requête était : %s\n" -#: pg_amcheck.c:1097 +#: pg_amcheck.c:1144 #, c-format msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" msgstr "index btree « %s.%s.%s » : la fonction de vérification des index btree a renvoyé un nombre de lignes inattendu : %d" -#: pg_amcheck.c:1101 +#: pg_amcheck.c:1148 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "est-ce que les versions de %s et d'amcheck sont compatibles ?" -#: pg_amcheck.c:1111 +#: pg_amcheck.c:1158 #, c-format msgid "btree index \"%s.%s.%s\":\n" msgstr "vérification de l'index btree« %s %s.%s » :\n" -#: pg_amcheck.c:1136 +#: pg_amcheck.c:1183 #, c-format msgid "" "%s checks objects in a PostgreSQL database for corruption.\n" @@ -246,17 +353,17 @@ msgstr "" "PostgreSQL sont corrompus.\n" "\n" -#: pg_amcheck.c:1137 +#: pg_amcheck.c:1184 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_amcheck.c:1138 +#: pg_amcheck.c:1185 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [BASE]\n" -#: pg_amcheck.c:1139 +#: pg_amcheck.c:1186 #, c-format msgid "" "\n" @@ -265,83 +372,83 @@ msgstr "" "\n" "Options de la cible :\n" -#: pg_amcheck.c:1140 +#: pg_amcheck.c:1187 #, c-format msgid " -a, --all check all databases\n" msgstr " -a, --all vérifie toutes les bases\n" -#: pg_amcheck.c:1141 +#: pg_amcheck.c:1188 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" msgstr " -d, --database=MOTIF vérifie les bases correspondantes\n" -#: pg_amcheck.c:1142 +#: pg_amcheck.c:1189 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" msgstr " -D, --exclude-database=MOTIF ne vérifie PAS les bases correspondantes\n" -#: pg_amcheck.c:1143 +#: pg_amcheck.c:1190 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" msgstr " -i, --index=MOTIF vérifie les index correspondants\n" -#: pg_amcheck.c:1144 +#: pg_amcheck.c:1191 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" msgstr " -I, --exclude-index=MOTIF ne vérifie PAS les index correspondants\n" -#: pg_amcheck.c:1145 +#: pg_amcheck.c:1192 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" msgstr " -r, --relation=MOTIF vérifie les relations correspondantes\n" -#: pg_amcheck.c:1146 +#: pg_amcheck.c:1193 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" msgstr " -R, --exclude-relation=MOTIF ne vérifie PAS les relations correspondantes\n" -#: pg_amcheck.c:1147 +#: pg_amcheck.c:1194 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" msgstr " -s, --schema=MOTIF vérifie les schémas correspondants\n" -#: pg_amcheck.c:1148 +#: pg_amcheck.c:1195 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" msgstr " -S, --exclude-schema=MOTIF ne vérifie PAS les schémas correspondants\n" -#: pg_amcheck.c:1149 +#: pg_amcheck.c:1196 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" msgstr " -t, --table=MOTIF vérifie les tables correspondantes\n" -#: pg_amcheck.c:1150 +#: pg_amcheck.c:1197 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" msgstr " -T, --exclude-table=MOTIF ne vérifie PAS les tables correspondantes\n" -#: pg_amcheck.c:1151 +#: pg_amcheck.c:1198 #, c-format msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" msgstr "" " --no-dependent-indexes n'étend PAS la liste des relations pour inclure\n" " les index\n" -#: pg_amcheck.c:1152 +#: pg_amcheck.c:1199 #, c-format msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" msgstr "" " --no-dependent-toast n'étend PAS la liste des relations pour inclure\n" " les TOAST\n" -#: pg_amcheck.c:1153 +#: pg_amcheck.c:1200 #, c-format msgid " --no-strict-names do NOT require patterns to match objects\n" msgstr "" " --no-strict-names ne requiert PAS que les motifs correspondent à\n" " des objets\n" -#: pg_amcheck.c:1154 +#: pg_amcheck.c:1201 #, c-format msgid "" "\n" @@ -350,40 +457,40 @@ msgstr "" "\n" "Options de vérification des tables :\n" -#: pg_amcheck.c:1155 +#: pg_amcheck.c:1202 #, c-format msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" msgstr " --exclude-toast-pointers ne suit PAS les pointeurs de TOAST\n" -#: pg_amcheck.c:1156 +#: pg_amcheck.c:1203 #, c-format msgid " --on-error-stop stop checking at end of first corrupt page\n" msgstr "" " --on-error-stop arrête la vérification à la fin du premier bloc\n" " corrompu\n" -#: pg_amcheck.c:1157 +#: pg_amcheck.c:1204 #, c-format msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" msgstr "" " --skip=OPTION ne vérifie PAS les blocs « all-frozen » et\n" " « all-visible »\n" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1205 #, c-format msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" msgstr "" " --startblock=BLOC commence la vérification des tables au numéro\n" " de bloc indiqué\n" -#: pg_amcheck.c:1159 +#: pg_amcheck.c:1206 #, c-format msgid " --endblock=BLOCK check table(s) only up to the given block number\n" msgstr "" " --endblock=BLOC vérifie les tables jusqu'au numéro de bloc\n" " indiqué\n" -#: pg_amcheck.c:1160 +#: pg_amcheck.c:1207 #, c-format msgid "" "\n" @@ -392,28 +499,33 @@ msgstr "" "\n" "Options de vérification des index Btree :\n" -#: pg_amcheck.c:1161 +#: pg_amcheck.c:1208 +#, c-format +msgid " --checkunique check unique constraint if index is unique\n" +msgstr " --checkunique vérifie l'unicité de l'index pour la contrainte d'unicité\n" + +#: pg_amcheck.c:1209 #, c-format msgid " --heapallindexed check that all heap tuples are found within indexes\n" msgstr "" " --heapallindexed vérifie que tous les enregistrements de la\n" " table sont référencés dans les index\n" -#: pg_amcheck.c:1162 +#: pg_amcheck.c:1210 #, c-format msgid " --parent-check check index parent/child relationships\n" msgstr "" " --parent-check vérifie les relations parent/enfants dans les\n" " index\n" -#: pg_amcheck.c:1163 +#: pg_amcheck.c:1211 #, c-format msgid " --rootdescend search from root page to refind tuples\n" msgstr "" " --rootdescend recherche à partir de la racine pour trouver\n" " les lignes\n" -#: pg_amcheck.c:1164 +#: pg_amcheck.c:1212 #, c-format msgid "" "\n" @@ -422,37 +534,37 @@ msgstr "" "\n" "Options de connexion :\n" -#: pg_amcheck.c:1165 +#: pg_amcheck.c:1213 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HÔTE IP/alias du serveur ou répertoire du socket\n" -#: pg_amcheck.c:1166 +#: pg_amcheck.c:1214 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT port du serveur de bases de données\n" -#: pg_amcheck.c:1167 +#: pg_amcheck.c:1215 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n" -#: pg_amcheck.c:1168 +#: pg_amcheck.c:1216 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ne demande jamais un mot de passe\n" -#: pg_amcheck.c:1169 +#: pg_amcheck.c:1217 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password force la saisie d'un mot de passe\n" -#: pg_amcheck.c:1170 +#: pg_amcheck.c:1218 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=BASE change la base de maintenance\n" -#: pg_amcheck.c:1171 +#: pg_amcheck.c:1219 #, c-format msgid "" "\n" @@ -461,44 +573,44 @@ msgstr "" "\n" "Autres options :\n" -#: pg_amcheck.c:1172 +#: pg_amcheck.c:1220 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo affiche les commandes envoyées au serveur\n" -#: pg_amcheck.c:1173 +#: pg_amcheck.c:1221 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" msgstr "" " -j, --jobs=NOMBRE utilise ce nombre de connexions simultanées au\n" " serveur\n" -#: pg_amcheck.c:1174 +#: pg_amcheck.c:1222 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress affiche la progression\n" -#: pg_amcheck.c:1175 +#: pg_amcheck.c:1223 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose mode verbeux\n" -#: pg_amcheck.c:1176 +#: pg_amcheck.c:1224 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: pg_amcheck.c:1177 +#: pg_amcheck.c:1225 #, c-format msgid " --install-missing install missing extensions\n" msgstr " --install-missing installe les extensions manquantes\n" -#: pg_amcheck.c:1178 +#: pg_amcheck.c:1226 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_amcheck.c:1180 +#: pg_amcheck.c:1228 #, c-format msgid "" "\n" @@ -507,99 +619,52 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_amcheck.c:1181 +#: pg_amcheck.c:1229 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" -#: pg_amcheck.c:1234 +#: pg_amcheck.c:1282 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" msgstr "relations %*s/%s (%d%%), blocs %*s/%s (%d%%) %*s" -#: pg_amcheck.c:1245 +#: pg_amcheck.c:1293 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" msgstr "relations %*s/%s (%d%%), blocs %*s/%s (%d%%) (%s%-*.*s)" -#: pg_amcheck.c:1260 +#: pg_amcheck.c:1308 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" msgstr "relations %*s/%s (%d%%), blocs %*s/%s (%d%%)" -#: pg_amcheck.c:1319 pg_amcheck.c:1352 +#: pg_amcheck.c:1367 pg_amcheck.c:1400 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s" -#: pg_amcheck.c:1397 +#: pg_amcheck.c:1445 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "nom de relation incorrecte (trop de points entre les noms) : %s" -#: pg_amcheck.c:1550 pg_amcheck.c:1689 +#: pg_amcheck.c:1598 pg_amcheck.c:1737 #, c-format msgid "including database \"%s\"" msgstr "en incluant la base de données : « %s »" -#: pg_amcheck.c:1671 +#: pg_amcheck.c:1719 #, c-format msgid "internal error: received unexpected database pattern_id %d" msgstr "erreur interne : a reçu un pattern_id %d inattendu de la base" -#: pg_amcheck.c:1673 +#: pg_amcheck.c:1721 #, c-format msgid "no connectable databases to check matching \"%s\"" msgstr "aucune base de données connectable à vérifier correspondant à « %s »" -#: pg_amcheck.c:2131 +#: pg_amcheck.c:2179 #, c-format msgid "internal error: received unexpected relation pattern_id %d" msgstr "erreur interne : a reçu un pattern_id %d inattendu de la relation" - -#~ msgid "" -#~ "\n" -#~ "Other Options:\n" -#~ msgstr "" -#~ "\n" -#~ "Autres options:\n" - -#~ msgid " -?, --help show this help, then exit\n" -#~ msgstr " -?, --help affiche cette aide, puis quitte\n" - -#~ msgid " -V, --version output version information, then exit\n" -#~ msgstr " -V, --version affiche la version, puis quitte\n" - -#~ msgid " -e, --echo show the commands being sent to the server\n" -#~ msgstr " -e, --echo affiche les commandes envoyées au serveur\n" - -#~ msgid " -q, --quiet don't write any messages\n" -#~ msgstr " -q, --quiet n'écrit aucun message\n" - -#~ msgid " -q, --quiet don't write any messages\n" -#~ msgstr " -q, --quiet n'écrit aucun message\n" - -#~ msgid " -v, --verbose write a lot of output\n" -#~ msgstr " -v, --verbose mode verbeux\n" - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" - -#, c-format -#~ msgid "command was: %s" -#~ msgstr "la commande était : %s" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatal : " - -#~ msgid "invalid skip option" -#~ msgstr "option skip invalide" - -#, c-format -#~ msgid "number of parallel jobs must be at least 1" -#~ msgstr "le nombre maximum de jobs en parallèle doit être au moins de 1" - -#~ msgid "number of parallel jobs must be at least 1\n" -#~ msgstr "le nombre de jobs parallèles doit être au moins de 1\n" diff --git a/src/bin/pg_amcheck/po/it.po b/src/bin/pg_amcheck/po/it.po index 881b5c3b92508..ed4974f0c5f24 100644 --- a/src/bin/pg_amcheck/po/it.po +++ b/src/bin/pg_amcheck/po/it.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pg_amcheck (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-09-26 08:20+0000\n" -"PO-Revision-Date: 2022-09-30 14:42+0200\n" +"PO-Revision-Date: 2023-09-05 08:02+0200\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -263,27 +263,27 @@ msgstr "" #: pg_amcheck.c:1142 #, c-format msgid " -a, --all check all databases\n" -msgstr " -a, --all controlla tutti i database\n" +msgstr " -a, --all controlla tutti i database\n" #: pg_amcheck.c:1143 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" -msgstr " -d, --database=PATTERN controlla i database corrispondenti\n" +msgstr " -d, --database=PATTERN controlla i database corrispondenti\n" #: pg_amcheck.c:1144 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" -msgstr " -D, --exclude-database=PATTERN Non controlla i database corrispondenti\n" +msgstr " -D, --exclude-database=PATTERN Non controlla i database corrispondenti\n" #: pg_amcheck.c:1145 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" -msgstr " -i, --index=PATTERN controlla gli indici corrispondenti\n" +msgstr " -i, --index=PATTERN controlla gli indici corrispondenti\n" #: pg_amcheck.c:1146 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" -msgstr " -I, --exclude-index=PATTERN Non controlla gli indici corrispondenti\n" +msgstr " -I, --exclude-index=PATTERN Non controlla gli indici corrispondenti\n" #: pg_amcheck.c:1147 #, c-format @@ -298,22 +298,22 @@ msgstr " -R, --exclude-relation=PATTERN Non controlla le relazioni corrisponde #: pg_amcheck.c:1149 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" -msgstr " -s, --schema=PATTERN controlla gli schemi corrispondenti\n" +msgstr " -s, --schema=PATTERN controlla gli schemi corrispondenti\n" #: pg_amcheck.c:1150 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" -msgstr " -S, --exclude-schema=PATTERN Non controlla gli schemi corrispondenti\n" +msgstr " -S, --exclude-schema=PATTERN Non controlla gli schemi corrispondenti\n" #: pg_amcheck.c:1151 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" -msgstr " -t, --table=PATTERN controlla le tabelle corrispondenti\n" +msgstr " -t, --table=PATTERN controlla le tabelle corrispondenti\n" #: pg_amcheck.c:1152 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" -msgstr " -T, --exclude-table=PATTERN Non controlla le tabelle corrispondenti\n" +msgstr " -T, --exclude-table=PATTERN Non controlla le tabelle corrispondenti\n" #: pg_amcheck.c:1153 #, c-format @@ -323,7 +323,7 @@ msgstr " --no-dependent-indexes Non espande l'elenco di relazioni per #: pg_amcheck.c:1154 #, c-format msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" -msgstr " --no-dependent-toast Non espande l'elenco delle relazioni per includere le tabelle TOAST\n" +msgstr " --no-dependent-toast Non espande l'elenco delle relazioni per includere le tabelle TOAST\n" #: pg_amcheck.c:1155 #, c-format @@ -342,27 +342,27 @@ msgstr "" #: pg_amcheck.c:1157 #, c-format msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" -msgstr " --exclude-toast-pointers NON seguono i puntatori TOAST di relazione\n" +msgstr " --exclude-toast-pointers NON seguono i puntatori TOAST di relazione\n" #: pg_amcheck.c:1158 #, c-format msgid " --on-error-stop stop checking at end of first corrupt page\n" -msgstr " --on-error-stop interrompe il controllo alla fine della prima pagina danneggiata\n" +msgstr " --on-error-stop interrompe il controllo alla fine della prima pagina danneggiata\n" #: pg_amcheck.c:1159 #, c-format msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" -msgstr " --skip=OPZIONE Non controlla i blocchi \"tutto congelato\" o \"tutto visibile\".\n" +msgstr " --skip=OPZIONE Non controlla i blocchi \"tutto congelato\" o \"tutto visibile\".\n" #: pg_amcheck.c:1160 #, c-format msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" -msgstr " --startblock=BLOCCO inizia a controllare le tabelle al numero di blocco dato\n" +msgstr " --startblock=BLOCCO inizia a controllare le tabelle al numero di blocco dato\n" #: pg_amcheck.c:1161 #, c-format msgid " --endblock=BLOCK check table(s) only up to the given block number\n" -msgstr " --endblock=BLOCCO controlla le tabelle solo fino al numero di blocco specificato\n" +msgstr " --endblock=BLOCCO controlla le tabelle solo fino al numero di blocco specificato\n" #: pg_amcheck.c:1162 #, c-format @@ -376,12 +376,12 @@ msgstr "" #: pg_amcheck.c:1163 #, c-format msgid " --heapallindexed check that all heap tuples are found within indexes\n" -msgstr " --heapallindexed controlla che tutte le tuple dell'heap si trovino all'interno degli indici\n" +msgstr " --heapallindexed controlla che tutte le tuple dell'heap si trovino all'interno degli indici\n" #: pg_amcheck.c:1164 #, c-format msgid " --parent-check check index parent/child relationships\n" -msgstr " --parent-check controlla le relazioni genitore/figlio dell'indice\n" +msgstr " --parent-check controlla le relazioni genitore/figlio dell'indice\n" #: pg_amcheck.c:1165 #, c-format @@ -400,7 +400,7 @@ msgstr "" #: pg_amcheck.c:1167 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" -msgstr " -h, --host=HOSTNAME host del database o directory socket\n" +msgstr " -h, --host=HOSTNAME host del database o directory socket\n" #: pg_amcheck.c:1168 #, c-format @@ -410,7 +410,7 @@ msgstr " -p, --port=PORT porta del server del database\n" #: pg_amcheck.c:1169 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" -msgstr " -U, --username=USERNAME nome utente con cui connettersi\n" +msgstr " -U, --username=USERNAME nome utente con cui connettersi\n" #: pg_amcheck.c:1170 #, c-format @@ -420,12 +420,12 @@ msgstr " -w, --no-password non richiede mai la password\n" #: pg_amcheck.c:1171 #, c-format msgid " -W, --password force password prompt\n" -msgstr " -W, --password forza la richiesta della password\n" +msgstr " -W, --password forza la richiesta della password\n" #: pg_amcheck.c:1172 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" -msgstr " --maintenance-db=DBNAME database di manutenzione alternativo\n" +msgstr " --maintenance-db=DBNAME database di manutenzione alternativo\n" #: pg_amcheck.c:1173 #, c-format @@ -444,12 +444,12 @@ msgstr " -e, --echo mostra i comandi inviati al server\n" #: pg_amcheck.c:1175 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" -msgstr " -j, --jobs=NUM usa questo numero di connessioni simultanee al server\n" +msgstr " -j, --jobs=NUM usa questo numero di connessioni simultanee al server\n" #: pg_amcheck.c:1176 #, c-format msgid " -P, --progress show progress information\n" -msgstr " -P, --progress mostra le informazioni sullo stato di avanzamento\n" +msgstr " -P, --progress mostra le informazioni sullo stato di avanzamento\n" #: pg_amcheck.c:1177 #, c-format @@ -464,7 +464,7 @@ msgstr " -V, --version mostra informazioni sulla versione ed #: pg_amcheck.c:1179 #, c-format msgid " --install-missing install missing extensions\n" -msgstr " --install-missing installa le estensioni mancanti\n" +msgstr " --install-missing installa le estensioni mancanti\n" #: pg_amcheck.c:1180 #, c-format diff --git a/src/bin/pg_amcheck/po/ja.po b/src/bin/pg_amcheck/po/ja.po index 6fa8208369de6..a4f67dfd21182 100644 --- a/src/bin/pg_amcheck/po/ja.po +++ b/src/bin/pg_amcheck/po/ja.po @@ -1,47 +1,115 @@ # LANGUAGE message translation file for pg_amcheck -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_amcheck (PostgreSQL) package. # FIRST AUTHOR , 2022. # msgid "" msgstr "" -"Project-Id-Version: pg_amcheck (PostgreSQL 15)\n" +"Project-Id-Version: pg_amcheck (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-09 12:00+0900\n" -"PO-Revision-Date: 2022-05-10 11:31+0900\n" -"Last-Translator: \n" +"POT-Creation-Date: 2024-08-28 10:42+0900\n" +"PO-Revision-Date: 2024-08-28 11:43+0900\n" +"Last-Translator: Kyotaro Horiguchi \n" "Language-Team: \n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.13\n" +"Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:276 +#: ../../../src/common/logging.c:278 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:283 +#: ../../../src/common/logging.c:285 #, c-format msgid "warning: " msgstr "警告: " -#: ../../../src/common/logging.c:294 +#: ../../../src/common/logging.c:296 #, c-format msgid "detail: " msgstr "詳細: " -#: ../../../src/common/logging.c:301 +#: ../../../src/common/logging.c:303 #, c-format msgid "hint: " msgstr "ヒント: " -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "メモリä¸è¶³ã§ã™\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "nullãƒã‚¤ãƒ³ã‚¿ã¯è¤‡è£½ã§ãã¾ã›ã‚“(内部エラー)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "ファイル\"%s\"ã«å¯¾ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã‚’åŒæœŸã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ã“ã®ãƒ“ルドã§ã¯åŒæœŸæ–¹å¼\"%s\"をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "実効ユーザーID %ld ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "ユーザーãŒå­˜åœ¨ã—ã¾ã›ã‚“" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "ユーザーåã®å‚ç…§ã«å¤±æ•—: エラーコード %lu" + +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "ã‚­ãƒ£ãƒ³ã‚»ãƒ«è¦æ±‚ã‚’é€ä¿¡ã—ã¾ã—ãŸ\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "ã‚­ãƒ£ãƒ³ã‚»ãƒ«è¦æ±‚ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: " @@ -50,7 +118,7 @@ msgstr "ã‚­ãƒ£ãƒ³ã‚»ãƒ«è¦æ±‚ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: " msgid "could not connect to database %s: out of memory" msgstr "データベース%sã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ: メモリä¸è¶³ã§ã™" -#: ../../fe_utils/connect_utils.c:117 +#: ../../fe_utils/connect_utils.c:116 #, c-format msgid "%s" msgstr "%s" @@ -65,174 +133,214 @@ msgstr "オプション%2$sã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\"" msgid "%s must be in range %d..%d" msgstr "%sã¯%d..%dã®ç¯„囲ã«ãªã‘れã°ãªã‚Šã¾ã›ã‚“" +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "èªè­˜ã§ããªã„åŒæœŸæ–¹å¼: %s" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "ã“ã®ãƒ—ラットフォームã«å¯¾ã—ã¦ã‚¸ãƒ§ãƒ–æ•°ãŒå¤šã™ãŽã¾ã™: %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "socket() ã®ã‚½ã‚±ãƒƒãƒˆãƒ•ァイル記述å­ãŒç¯„囲外ã§ã™: %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "ジョブ数を減らã—ã¦ã¿ã¦ãã ã•ã„。" + +#: ../../fe_utils/parallel_slot.c:553 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "データベース\"%s\"ã®å‡¦ç†ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" + #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1647 pg_amcheck.c:2092 +#: pg_amcheck.c:1693 pg_amcheck.c:2138 #, c-format msgid "query failed: %s" msgstr "å•ã„åˆã‚ã›ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093 +#: pg_amcheck.c:578 pg_amcheck.c:1147 pg_amcheck.c:1694 pg_amcheck.c:2139 #, c-format msgid "Query was: %s" msgstr "å•ã„åˆã‚ã›: %s" -#: pg_amcheck.c:399 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "シェルコマンドã®å¼•æ•°ã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "データベースåã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + +#: pg_amcheck.c:403 #, c-format msgid "invalid argument for option %s" msgstr "オプション%sã®å¼•æ•°ãŒä¸æ­£ã§ã™" -#: pg_amcheck.c:405 +#: pg_amcheck.c:409 #, c-format msgid "invalid start block" msgstr "䏿­£ãªé–‹å§‹ãƒ–ロック" -#: pg_amcheck.c:407 +#: pg_amcheck.c:411 #, c-format msgid "start block out of bounds" msgstr "開始ブロックãŒç¯„囲外ã§ã™" -#: pg_amcheck.c:414 +#: pg_amcheck.c:418 #, c-format msgid "invalid end block" msgstr "䏿­£ãªçµ‚了ブロック" -#: pg_amcheck.c:416 +#: pg_amcheck.c:420 #, c-format msgid "end block out of bounds" msgstr "終了ブロックãŒç¯„囲外ã§ã™" -#: pg_amcheck.c:439 pg_amcheck.c:461 +#: pg_amcheck.c:446 pg_amcheck.c:468 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" -#: pg_amcheck.c:445 +#: pg_amcheck.c:452 #, c-format msgid "end block precedes start block" msgstr "終了ブロックãŒé–‹å§‹ãƒ–ロックよりå‰ã«ãªã£ã¦ã„ã¾ã™" -#: pg_amcheck.c:459 +#: pg_amcheck.c:466 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")" -#: pg_amcheck.c:479 +#: pg_amcheck.c:486 #, c-format msgid "cannot specify a database name with --all" msgstr "--allã§ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹åã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: pg_amcheck.c:485 +#: pg_amcheck.c:492 #, c-format msgid "cannot specify both a database name and database patterns" msgstr "データベースåã¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ‘ターンã¯åŒæ™‚ã«æŒ‡å®šã¯ã§ãã¾ã›ã‚“" -#: pg_amcheck.c:513 +#: pg_amcheck.c:520 #, c-format msgid "no databases to check" msgstr "検査ã™ã¹ãデータベースãŒã‚りã¾ã›ã‚“" -#: pg_amcheck.c:569 +#: pg_amcheck.c:576 #, c-format msgid "database \"%s\": %s" msgstr "データベース\"%s\": %s" -#: pg_amcheck.c:580 +#: pg_amcheck.c:587 #, c-format msgid "skipping database \"%s\": amcheck is not installed" msgstr "データベース\"%s\"をスキップã—ã¾ã™: amcheckãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã›ã‚“" -#: pg_amcheck.c:588 +#: pg_amcheck.c:595 #, c-format msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" msgstr "データベース\"%1$s\"内: スキーマ\"%3$s\"内ã§amcheck ãƒãƒ¼ã‚¸ãƒ§ãƒ³\"%2$s\"を使用中" -#: pg_amcheck.c:610 +#: pg_amcheck.c:624 +#, c-format +msgid "option %s is not supported by amcheck version %s" +msgstr "%sオプションã¯amcheckãƒãƒ¼ã‚¸ãƒ§ãƒ³\"%s\"ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" + +#: pg_amcheck.c:650 #, c-format msgid "no heap tables to check matching \"%s\"" msgstr "\"%s\"ã«åˆè‡´ã™ã‚‹æ¤œæŸ»å¯¾è±¡ã®ãƒ’ープテーブルãŒã‚りã¾ã›ã‚“" -#: pg_amcheck.c:613 +#: pg_amcheck.c:653 #, c-format msgid "no btree indexes to check matching \"%s\"" msgstr "%s\"ã«åˆè‡´ã™ã‚‹æ¤œæŸ»å¯¾è±¡ã®btreeインデックスãŒã‚りã¾ã›ã‚“" -#: pg_amcheck.c:616 +#: pg_amcheck.c:656 #, c-format msgid "no relations to check in schemas matching \"%s\"" msgstr "\"%s\"ã«åˆè‡´ã™ã‚‹ã‚¹ã‚­ãƒ¼ãƒžå†…ã«æ¤œæŸ»å¯¾è±¡ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã›ã‚“" -#: pg_amcheck.c:619 +#: pg_amcheck.c:659 #, c-format msgid "no relations to check matching \"%s\"" msgstr "\"%s\"ã«åˆè‡´ã™ã‚‹æ¤œæŸ»å¯¾è±¡ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã›ã‚“" -#: pg_amcheck.c:647 +#: pg_amcheck.c:687 #, c-format msgid "no relations to check" msgstr "検査対象ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã›ã‚“" -#: pg_amcheck.c:730 +#: pg_amcheck.c:770 #, c-format msgid "checking heap table \"%s.%s.%s\"" msgstr "ヒープテーブル\"%s.%s.%s\"を検査" -#: pg_amcheck.c:746 +#: pg_amcheck.c:786 #, c-format msgid "checking btree index \"%s.%s.%s\"" msgstr "btreeインデックス\"%s.%s.%s\"を検査" -#: pg_amcheck.c:893 +#: pg_amcheck.c:937 #, c-format msgid "error sending command to database \"%s\": %s" msgstr "データベース\"%s\"ã¸ã®ã‚³ãƒžãƒ³ãƒ‰é€å‡ºä¸­ã®ã‚¨ãƒ©ãƒ¼: %s" -#: pg_amcheck.c:896 +#: pg_amcheck.c:940 #, c-format msgid "Command was: %s" msgstr "コマンド: %s" -#: pg_amcheck.c:1015 +#: pg_amcheck.c:1060 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" msgstr "ヒープテーブル\"%s.%s.%s\"ã€ãƒ–ロック%sã€ã‚ªãƒ•セット%sã€å±žæ€§%s:\n" -#: pg_amcheck.c:1022 +#: pg_amcheck.c:1067 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" msgstr "ヒープテーブル\"%s.%s.%s\"ã€ãƒ–ロック%sã€ã‚ªãƒ•セット%s:\n" -#: pg_amcheck.c:1028 +#: pg_amcheck.c:1073 #, c-format msgid "heap table \"%s.%s.%s\", block %s:\n" msgstr "ヒープテーブル\"%s.%s.%s\"ã€ãƒ–ロック%s:\n" -#: pg_amcheck.c:1033 pg_amcheck.c:1044 +#: pg_amcheck.c:1078 pg_amcheck.c:1089 #, c-format msgid "heap table \"%s.%s.%s\":\n" msgstr "ヒープテーブル\"%s.%s.%s\":\n" -#: pg_amcheck.c:1048 pg_amcheck.c:1117 +#: pg_amcheck.c:1093 pg_amcheck.c:1162 #, c-format msgid "query was: %s\n" msgstr "å•ã„åˆã‚ã›: %s\n" -#: pg_amcheck.c:1099 +#: pg_amcheck.c:1144 #, c-format msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" msgstr "btreeインデックス\"%s.%s.%s\": btree検索関数ãŒäºˆæœŸã—ãªã„æ•°ã®è¡Œã‚’è¿”å´ã—ã¾ã—ãŸ: %d" -#: pg_amcheck.c:1103 +#: pg_amcheck.c:1148 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "%sã¨amcheckã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯åˆã£ã¦ã„ã¾ã™ã‹?" -#: pg_amcheck.c:1113 +#: pg_amcheck.c:1158 #, c-format msgid "btree index \"%s.%s.%s\":\n" msgstr "btreeインデックス\"%s.%s.%s\":\n" -#: pg_amcheck.c:1138 +#: pg_amcheck.c:1183 #, c-format msgid "" "%s checks objects in a PostgreSQL database for corruption.\n" @@ -241,17 +349,17 @@ msgstr "" "%sã¯PostgreSQLデータベース内ã®ã‚ªãƒ–ジェクトã®ç ´æã‚’検査ã—ã¾ã™ã€‚\n" "\n" -#: pg_amcheck.c:1139 +#: pg_amcheck.c:1184 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_amcheck.c:1140 +#: pg_amcheck.c:1185 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [オプション]... [データベースå]\n" -#: pg_amcheck.c:1141 +#: pg_amcheck.c:1186 #, c-format msgid "" "\n" @@ -260,83 +368,83 @@ msgstr "" "\n" "対象指定オプション:\n" -#: pg_amcheck.c:1142 +#: pg_amcheck.c:1187 #, c-format msgid " -a, --all check all databases\n" msgstr " -a, --all ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’検査\n" -#: pg_amcheck.c:1143 +#: pg_amcheck.c:1188 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" msgstr " -d, --database=PATTERN åˆè‡´ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’検査\n" -#: pg_amcheck.c:1144 +#: pg_amcheck.c:1189 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" msgstr " -D, --exclude-database=PATTERN åˆè‡´ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’検査「ã—ãªã„ã€\n" -#: pg_amcheck.c:1145 +#: pg_amcheck.c:1190 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" msgstr " -i, --index=PATTERN åˆè‡´ã™ã‚‹ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’検査\n" -#: pg_amcheck.c:1146 +#: pg_amcheck.c:1191 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" msgstr " -I, --exclude-index=PATTERN åˆè‡´ã™ã‚‹ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’検査「ã—ãªã„ã€\n" -#: pg_amcheck.c:1147 +#: pg_amcheck.c:1192 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" msgstr " -r, --relation=PATTERN åˆè‡´ã™ã‚‹ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’検査\n" -#: pg_amcheck.c:1148 +#: pg_amcheck.c:1193 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" msgstr " -R, --exclude-relation=PATTERN åˆè‡´ã™ã‚‹ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’検査「ã—ãªã„ã€\n" -#: pg_amcheck.c:1149 +#: pg_amcheck.c:1194 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" msgstr " -s, --schema=PATTERN åˆè‡´ã™ã‚‹ã‚¹ã‚­ãƒ¼ãƒžã‚’検査\n" -#: pg_amcheck.c:1150 +#: pg_amcheck.c:1195 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" msgstr " -S, --exclude-schema=PATTERN åˆè‡´ã™ã‚‹ã‚¹ã‚­ãƒ¼ãƒžã‚’検査「ã—ãªã„ã€\n" -#: pg_amcheck.c:1151 +#: pg_amcheck.c:1196 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" msgstr " -t, --table=PATTERN åˆè‡´ã™ã‚‹ãƒ†ãƒ¼ãƒ–ルを検査\n" -#: pg_amcheck.c:1152 +#: pg_amcheck.c:1197 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" msgstr " -T, --exclude-table=PATTERN åˆè‡´ã™ã‚‹ãƒ†ãƒ¼ãƒ–ルを検査「ã—ãªã„ã€\n" -#: pg_amcheck.c:1153 +#: pg_amcheck.c:1198 #, c-format msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" msgstr "" " --no-dependent-indexes リレーションã®ãƒªã‚¹ãƒˆã‚’インデックスをå«ã‚€ã‚ˆã†ã«\n" " 拡張「ã—ãªã„ã€\n" -#: pg_amcheck.c:1154 +#: pg_amcheck.c:1199 #, c-format msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" msgstr "" " --no-dependent-toast リレーションã®ãƒªã‚¹ãƒˆã‚’TOASTテーブルをå«ã‚€\n" " よã†ã«æ‹¡å¼µã€Œã—ãªã„ã€\n" -#: pg_amcheck.c:1155 +#: pg_amcheck.c:1200 #, c-format msgid " --no-strict-names do NOT require patterns to match objects\n" msgstr "" " --no-strict-names パターンãŒã‚ªãƒ–ジェクトã«åˆè‡´ã™ã‚‹ã“ã¨ã‚’å¿…é ˆã¨\n" " ã—ãªã„\n" -#: pg_amcheck.c:1156 +#: pg_amcheck.c:1201 #, c-format msgid "" "\n" @@ -345,36 +453,36 @@ msgstr "" "\n" "テーブル検査オプション:\n" -#: pg_amcheck.c:1157 +#: pg_amcheck.c:1202 #, c-format msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" msgstr " --exclude-toast-pointers リレーションã®TOASTãƒã‚¤ãƒ³ã‚¿ã‚’追跡「ã—ãªã„ã€\n" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1203 #, c-format msgid " --on-error-stop stop checking at end of first corrupt page\n" msgstr " --on-error-stop 最åˆã®ç ´æãƒšãƒ¼ã‚¸ã®çµ‚ã‚ã‚Šã§æ¤œæŸ»ã‚’中断ã™ã‚‹\n" -#: pg_amcheck.c:1159 +#: pg_amcheck.c:1204 #, c-format msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" msgstr "" " --skip=OPTION \"all-frozen\"ãŠã‚ˆã³\"all-visible\"ã§ã‚ã‚‹\n" " ブロックを検査「ã—ãªã„ã€\n" -#: pg_amcheck.c:1160 +#: pg_amcheck.c:1205 #, c-format msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" msgstr "" " --startblock=BLOCK 指定ã—ãŸãƒ–ロック番å·ã‹ã‚‰ãƒ†ãƒ¼ãƒ–ãƒ«ã®æ¤œæŸ»ã‚’\n" " é–‹å§‹ã™ã‚‹\n" -#: pg_amcheck.c:1161 +#: pg_amcheck.c:1206 #, c-format msgid " --endblock=BLOCK check table(s) only up to the given block number\n" msgstr " --endblock=BLOCK 指定ã—ãŸãƒ–ロック番å·ã¾ã§ãƒ‡ãƒ¼ãƒ–ãƒ«ã®æ¤œæŸ»ã‚’行ã†\n" -#: pg_amcheck.c:1162 +#: pg_amcheck.c:1207 #, c-format msgid "" "\n" @@ -383,24 +491,29 @@ msgstr "" "\n" "B-treeインデックス検査オプション:\n" -#: pg_amcheck.c:1163 +#: pg_amcheck.c:1208 +#, c-format +msgid " --checkunique check unique constraint if index is unique\n" +msgstr " --checkunique インデックスãŒãƒ¦ãƒ‹ãƒ¼ã‚¯ã§ã‚れã°ãƒ¦ãƒ‹ãƒ¼ã‚¯åˆ¶ç´„ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹\n" + +#: pg_amcheck.c:1209 #, c-format msgid " --heapallindexed check that all heap tuples are found within indexes\n" msgstr "" " --heapallindexed ã™ã¹ã¦ã®ãƒ’ープタプルãŒã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†…ã«\n" " 見ã¤ã‹ã‚‹ã“ã¨ã‚’検査\n" -#: pg_amcheck.c:1164 +#: pg_amcheck.c:1210 #, c-format msgid " --parent-check check index parent/child relationships\n" msgstr " --parent-check インデックスã®è¦ªå­é–¢ä¿‚を検査\n" -#: pg_amcheck.c:1165 +#: pg_amcheck.c:1211 #, c-format msgid " --rootdescend search from root page to refind tuples\n" msgstr " --rootdescend ã‚¿ãƒ—ãƒ«å†æŽ¢ç´¢ã‚’ãƒ«ãƒ¼ãƒˆãƒšãƒ¼ã‚¸ã‹ã‚‰å®Ÿè¡Œã™ã‚‹\n" -#: pg_amcheck.c:1166 +#: pg_amcheck.c:1212 #, c-format msgid "" "\n" @@ -409,39 +522,39 @@ msgstr "" "\n" "接続オプション:\n" -#: pg_amcheck.c:1167 +#: pg_amcheck.c:1213 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HOSTNAME データベースサーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆã¾ãŸã¯\n" " ソケットディレクトリ\n" -#: pg_amcheck.c:1168 +#: pg_amcheck.c:1214 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆ\n" -#: pg_amcheck.c:1169 +#: pg_amcheck.c:1215 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME 接続ã«ç”¨ã„るユーザーå\n" -#: pg_amcheck.c:1170 +#: pg_amcheck.c:1216 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰å…¥åŠ›ã‚’è¦æ±‚ã—ãªã„\n" -#: pg_amcheck.c:1171 +#: pg_amcheck.c:1217 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰å…¥åŠ›è¦æ±‚を強制ã™ã‚‹\n" -#: pg_amcheck.c:1172 +#: pg_amcheck.c:1218 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME 代替ã®ä¿å®ˆãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\n" -#: pg_amcheck.c:1173 +#: pg_amcheck.c:1219 #, c-format msgid "" "\n" @@ -450,42 +563,42 @@ msgstr "" "\n" "ãã®ä»–ã®ã‚ªãƒ—ション:\n" -#: pg_amcheck.c:1174 +#: pg_amcheck.c:1220 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo サーãƒãƒ¼ã«é€ã‚‰ã‚Œã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’表示\n" -#: pg_amcheck.c:1175 +#: pg_amcheck.c:1221 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" msgstr " -j, --jobs=NUM サーãƒãƒ¼ã«å¯¾ã—ã¦æŒ‡å®šã—ãŸæ•°ã®æŽ¥ç¶šã‚’使用ã™ã‚‹\n" -#: pg_amcheck.c:1176 +#: pg_amcheck.c:1222 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress 進行状æ³ã‚’表示\n" -#: pg_amcheck.c:1177 +#: pg_amcheck.c:1223 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose 多ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’出力ã—ã¾ã™\n" -#: pg_amcheck.c:1178 +#: pg_amcheck.c:1224 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: pg_amcheck.c:1179 +#: pg_amcheck.c:1225 #, c-format msgid " --install-missing install missing extensions\n" msgstr " --install-missing 機能拡張ãŒãªã„å ´åˆã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã™ã‚‹\n" -#: pg_amcheck.c:1180 +#: pg_amcheck.c:1226 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: pg_amcheck.c:1182 +#: pg_amcheck.c:1228 #, c-format msgid "" "\n" @@ -494,52 +607,52 @@ msgstr "" "\n" "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: pg_amcheck.c:1183 +#: pg_amcheck.c:1229 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_amcheck.c:1236 +#: pg_amcheck.c:1282 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" msgstr "%*s/%s個ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³(%d%%), %*s/%sページ(%d%%) %*s" -#: pg_amcheck.c:1247 +#: pg_amcheck.c:1293 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" msgstr "%*s/%s個ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³(%d%%), %*s/%sページ(%d%%) (%s%-*.*s)" -#: pg_amcheck.c:1262 +#: pg_amcheck.c:1308 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" msgstr "%*s/%s個ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³(%d%%), %*s/%sページ(%d%%)" -#: pg_amcheck.c:1321 pg_amcheck.c:1354 +#: pg_amcheck.c:1367 pg_amcheck.c:1400 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "修飾åãŒä¸é©åˆ‡ã§ã™(ドット区切りã®åå‰ãŒå¤šã™ãŽã¾ã™): %s" -#: pg_amcheck.c:1399 +#: pg_amcheck.c:1445 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "リレーションåãŒä¸é©åˆ‡ã§ã™(ドット区切りã®åå‰ãŒå¤šã™ãŽã¾ã™): %s" -#: pg_amcheck.c:1552 pg_amcheck.c:1691 +#: pg_amcheck.c:1598 pg_amcheck.c:1737 #, c-format msgid "including database \"%s\"" msgstr "データベース\"%s\"ã‚’å«ã‚ã¾ã™" -#: pg_amcheck.c:1673 +#: pg_amcheck.c:1719 #, c-format msgid "internal error: received unexpected database pattern_id %d" msgstr "内部エラー: 予期ã—ãªã„データベースパターンID %dã‚’å—ä¿¡" -#: pg_amcheck.c:1675 +#: pg_amcheck.c:1721 #, c-format msgid "no connectable databases to check matching \"%s\"" msgstr "\"%s\"ã«åˆè‡´ã™ã‚‹æ¤œæŸ»å¯¾è±¡ã®æŽ¥ç¶šå¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒã‚りã¾ã›ã‚“" -#: pg_amcheck.c:2133 +#: pg_amcheck.c:2179 #, c-format msgid "internal error: received unexpected relation pattern_id %d" msgstr "内部エラー: 予期ã—ãªã„リレーションパターンID %dã‚’å—ä¿¡" diff --git a/src/bin/pg_amcheck/po/ka.po b/src/bin/pg_amcheck/po/ka.po index 99b2c562fe733..8cf7f280e248b 100644 --- a/src/bin/pg_amcheck/po/ka.po +++ b/src/bin/pg_amcheck/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_amcheck (PostgreSQL) 15\n" +"Project-Id-Version: pg_amcheck (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-02 04:50+0000\n" -"PO-Revision-Date: 2022-07-04 11:33+0200\n" +"POT-Creation-Date: 2024-08-27 16:52+0000\n" +"PO-Revision-Date: 2024-08-28 05:43+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.1\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -38,11 +38,78 @@ msgstr "დეტáƒáƒšáƒ”ბი: " msgid "hint: " msgstr "მინიშნებáƒ: " -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ეფექტური ID-ის (%ld) áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "მáƒáƒ›áƒ®áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu" + +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•ნრგáƒáƒ’ზáƒáƒ•ნილიáƒ\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ’ზáƒáƒ•ნრშეუძლებელიáƒ: " @@ -51,7 +118,7 @@ msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ’ზრmsgid "could not connect to database %s: out of memory" msgstr "ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ (%s) მიერთებრშეუძლებელიáƒ: áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" -#: ../../fe_utils/connect_utils.c:117 +#: ../../fe_utils/connect_utils.c:116 #, c-format msgid "%s" msgstr "%s" @@ -66,179 +133,214 @@ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პრmsgid "%s must be in range %d..%d" msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე" +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "უცნáƒáƒ‘ი სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი: \"%s\"" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "მეტისმეტáƒáƒ“ ბევრი დáƒáƒ•áƒáƒšáƒ”ბრáƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒ˜áƒ¡áƒ—ვის: %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "სáƒáƒ™áƒ”ტის ფáƒáƒ˜áƒšáƒ˜áƒ¡ დესკრიპტáƒáƒ áƒ˜ დáƒáƒ¡áƒáƒ¨áƒ•ებ შუáƒáƒšáƒ”დს გáƒáƒ áƒ”თáƒáƒ ფუნქციისთვის select(): %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "სცáƒáƒ“ეთ ნáƒáƒ™áƒšáƒ”ბი დáƒáƒ•áƒáƒšáƒ”ბáƒ." + +#: ../../fe_utils/parallel_slot.c:553 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "ბáƒáƒ–ის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ:%s" + #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1647 pg_amcheck.c:2092 +#: pg_amcheck.c:1693 pg_amcheck.c:2138 #, c-format msgid "query failed: %s" msgstr "მáƒáƒ—ხáƒáƒ•ნის შეცდáƒáƒ›áƒ: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093 +#: pg_amcheck.c:578 pg_amcheck.c:1147 pg_amcheck.c:1694 pg_amcheck.c:2139 #, c-format msgid "Query was: %s" msgstr "მáƒáƒ—ხáƒáƒ•ნის შინáƒáƒáƒ áƒ¡áƒ˜: %s" -#: pg_amcheck.c:399 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის áƒáƒ áƒ’უმენტი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + +#: pg_amcheck.c:403 #, c-format msgid "invalid argument for option %s" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი პáƒáƒ áƒáƒ›áƒ”ტრისთვის: %s" -#: pg_amcheck.c:405 +#: pg_amcheck.c:409 #, c-format msgid "invalid start block" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ბლáƒáƒ™áƒ˜" -#: pg_amcheck.c:407 +#: pg_amcheck.c:411 #, c-format msgid "start block out of bounds" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ბლáƒáƒ™áƒ˜ სáƒáƒ–ღვრებს გáƒáƒ áƒ”თáƒáƒ" -#: pg_amcheck.c:414 +#: pg_amcheck.c:418 #, c-format msgid "invalid end block" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბáƒáƒšáƒ ბლáƒáƒ™áƒ˜" -#: pg_amcheck.c:416 +#: pg_amcheck.c:420 #, c-format msgid "end block out of bounds" msgstr "ბáƒáƒšáƒ ბლáƒáƒ™áƒ˜ სáƒáƒ–ღვრებს გáƒáƒ áƒ”თáƒáƒ" -#: pg_amcheck.c:439 pg_amcheck.c:461 +#: pg_amcheck.c:446 pg_amcheck.c:468 #, c-format msgid "Try \"%s --help\" for more information." msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." -#: pg_amcheck.c:445 +#: pg_amcheck.c:452 #, c-format msgid "end block precedes start block" msgstr "ბáƒáƒšáƒ ბლáƒáƒ™áƒ˜ სáƒáƒ¬áƒ§áƒ˜áƒ¡ ბლáƒáƒ™áƒáƒ›áƒ“ე მდებáƒáƒ áƒ”áƒáƒ‘ს" -#: pg_amcheck.c:459 +#: pg_amcheck.c:466 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")" -#: pg_amcheck.c:479 +#: pg_amcheck.c:486 #, c-format msgid "cannot specify a database name with --all" msgstr "--all -თáƒáƒœ ერთáƒáƒ“ ბáƒáƒ–ის სáƒáƒ®áƒ”ლს ვერ მიუთითებთ" -#: pg_amcheck.c:485 +#: pg_amcheck.c:492 #, c-format msgid "cannot specify both a database name and database patterns" msgstr "áƒáƒ áƒ˜áƒ•ეს, ბáƒáƒ–ის სáƒáƒ®áƒ”ლსრდრმის შáƒáƒ‘ლáƒáƒœáƒ¡ ვერ მიუთითებთ" -#: pg_amcheck.c:513 +#: pg_amcheck.c:520 #, c-format msgid "no databases to check" msgstr "შემáƒáƒ¡áƒáƒ›áƒáƒ¬áƒ›áƒ”ბელი ბáƒáƒ–ის გáƒáƒ áƒ”შე" -#: pg_amcheck.c:569 +#: pg_amcheck.c:576 #, c-format msgid "database \"%s\": %s" msgstr "ბáƒáƒ–რ\"%s\": %s" -#: pg_amcheck.c:580 +#: pg_amcheck.c:587 #, c-format msgid "skipping database \"%s\": amcheck is not installed" msgstr "\"%s\" ბáƒáƒ–ის გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ: amcheck დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" -#: pg_amcheck.c:588 +#: pg_amcheck.c:595 #, c-format msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" msgstr "ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრamcheck-ის ვერსირ\"%s\" სქემáƒáƒ¨áƒ˜ \"%s\"" -#: pg_amcheck.c:610 +#: pg_amcheck.c:624 +#, c-format +msgid "option %s is not supported by amcheck version %s" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის '%s' მხáƒáƒ áƒ“áƒáƒ­áƒ”რრamcheck-ის ვერსიáƒáƒ¡ \"%s\" áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: pg_amcheck.c:650 #, c-format msgid "no heap tables to check matching \"%s\"" msgstr "მეხსირების ცხრილები, რáƒáƒ›áƒšáƒ”ბიც ემთხვევრ\"%s\"-ს, áƒáƒ  áƒáƒ áƒ¡áƒ”ბბს" -#: pg_amcheck.c:613 +#: pg_amcheck.c:653 #, c-format msgid "no btree indexes to check matching \"%s\"" msgstr "áƒáƒ áƒáƒ‘ით ხის ინდექსები, რáƒáƒ›áƒšáƒ”ბიც ემთხვევრ\"%s\"-ს, áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_amcheck.c:616 +#: pg_amcheck.c:656 #, c-format msgid "no relations to check in schemas matching \"%s\"" msgstr "\"%s\"-ს áƒáƒ áƒª ერთი სქემრáƒáƒ  ემთხვევáƒ" -#: pg_amcheck.c:619 +#: pg_amcheck.c:659 #, c-format msgid "no relations to check matching \"%s\"" msgstr "\"%s\"-ს áƒáƒ áƒª ერთი ურთიერთáƒáƒ‘რáƒáƒ  ემთხვევáƒ" -#: pg_amcheck.c:647 +#: pg_amcheck.c:687 #, c-format msgid "no relations to check" msgstr "შესáƒáƒ›áƒáƒ¬áƒ›áƒ”ბელი ურთიერთáƒáƒ‘ების გáƒáƒ áƒ”შე" -#: pg_amcheck.c:730 +#: pg_amcheck.c:770 #, c-format msgid "checking heap table \"%s.%s.%s\"" msgstr "მეხსიერების ცხრილის შემáƒáƒ¬áƒ›áƒ”ბáƒ\"%s.%s.%s\"" -#: pg_amcheck.c:746 +#: pg_amcheck.c:786 #, c-format msgid "checking btree index \"%s.%s.%s\"" msgstr "áƒáƒ áƒáƒ‘ითი ხის ინდექსის შემáƒáƒ¬áƒ›áƒ”ბრ\"%s.%s.%s\"" -#: pg_amcheck.c:893 +#: pg_amcheck.c:937 #, c-format msgid "error sending command to database \"%s\": %s" msgstr "ბáƒáƒ–ისთვის ბრძáƒáƒœáƒ”ბის გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ \"%s\": %s" -#: pg_amcheck.c:896 +#: pg_amcheck.c:940 #, c-format msgid "Command was: %s" msgstr "ბრძáƒáƒœáƒ”ბრიყáƒ: %s" -#: pg_amcheck.c:1015 +#: pg_amcheck.c:1060 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" -msgstr "" -"მეხსიერების ცხრილი \"%s.%s.%s\", ბლáƒáƒ™áƒ˜ %s, წáƒáƒœáƒáƒªáƒ•ლებრ%s, áƒáƒ¢áƒ áƒ˜áƒ‘უტი %s:\n" +msgstr "მეხსიერების ცხრილი \"%s.%s.%s\", ბლáƒáƒ™áƒ˜ %s, წáƒáƒœáƒáƒªáƒ•ლებრ%s, áƒáƒ¢áƒ áƒ˜áƒ‘უტი %s:\n" -#: pg_amcheck.c:1022 +#: pg_amcheck.c:1067 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" msgstr "მეხსიერების ცხრილი \"%s.%s.%s\", ბლáƒáƒ™áƒ˜ %s, წáƒáƒœáƒáƒªáƒ•ლებრ%s:\n" -#: pg_amcheck.c:1028 +#: pg_amcheck.c:1073 #, c-format msgid "heap table \"%s.%s.%s\", block %s:\n" msgstr "მეხსიერების ცხრილი \"%s.%s.%s\", ბლáƒáƒ™áƒ˜ %s:\n" -#: pg_amcheck.c:1033 pg_amcheck.c:1044 +#: pg_amcheck.c:1078 pg_amcheck.c:1089 #, c-format msgid "heap table \"%s.%s.%s\":\n" msgstr "ცხრილი მეხსიერებáƒáƒ¨áƒ˜ \"%s.%s.%s\":\n" -#: pg_amcheck.c:1048 pg_amcheck.c:1117 +#: pg_amcheck.c:1093 pg_amcheck.c:1162 #, c-format msgid "query was: %s\n" msgstr "მáƒáƒ—ხáƒáƒ•ნის შინáƒáƒáƒ áƒ¡áƒ˜: %s\n" -#: pg_amcheck.c:1099 +#: pg_amcheck.c:1144 #, c-format -msgid "" -"btree index \"%s.%s.%s\": btree checking function returned unexpected number " -"of rows: %d" -msgstr "" -"áƒáƒ áƒáƒ‘ითი ხის ინდექსი\"%s.%s.%s\": áƒáƒ áƒáƒ‘ითი ხის შემáƒáƒ¬áƒ›áƒ”ბის ფუნქციáƒáƒ› მწკრივების " -"მáƒáƒ£áƒšáƒáƒ“ნელი რáƒáƒáƒ“ენáƒáƒ‘რდáƒáƒáƒ‘რუნáƒ: %d" +msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" +msgstr "áƒáƒ áƒáƒ‘ითი ხის ინდექსი\"%s.%s.%s\": áƒáƒ áƒáƒ‘ითი ხის შემáƒáƒ¬áƒ›áƒ”ბის ფუნქციáƒáƒ› მწკრივების მáƒáƒ£áƒšáƒáƒ“ნელი რáƒáƒáƒ“ენáƒáƒ‘რდáƒáƒáƒ‘რუნáƒ: %d" -#: pg_amcheck.c:1103 +#: pg_amcheck.c:1148 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "áƒáƒ áƒ˜áƒáƒœ %s\"-ის დრamcheck-ის ვერსიები თáƒáƒ•სებáƒáƒ“ი?" -#: pg_amcheck.c:1113 +#: pg_amcheck.c:1158 #, c-format msgid "btree index \"%s.%s.%s\":\n" msgstr "btree index \"%s.%s.%s\":\n" -#: pg_amcheck.c:1138 +#: pg_amcheck.c:1183 #, c-format msgid "" "%s checks objects in a PostgreSQL database for corruption.\n" @@ -247,17 +349,17 @@ msgstr "" "%s PostgreSQL -ის ბáƒáƒ–áƒáƒ¨áƒ˜ áƒáƒ áƒ¡áƒ”ბულ áƒáƒ‘იექტებს დáƒáƒ–იáƒáƒœáƒ”ბებზე შეáƒáƒ›áƒáƒ¬áƒ›áƒ”ბს.\n" "\n" -#: pg_amcheck.c:1139 +#: pg_amcheck.c:1184 #, c-format msgid "Usage:\n" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" -#: pg_amcheck.c:1140 +#: pg_amcheck.c:1185 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [ბáƒáƒ–ისსáƒáƒ®áƒ”ლი]\n" -#: pg_amcheck.c:1141 +#: pg_amcheck.c:1186 #, c-format msgid "" "\n" @@ -266,93 +368,77 @@ msgstr "" "\n" "სáƒáƒ›áƒ˜áƒ–ნის პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_amcheck.c:1142 +#: pg_amcheck.c:1187 #, c-format msgid " -a, --all check all databases\n" msgstr " -a, --all ყველრბáƒáƒ–ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" -#: pg_amcheck.c:1143 +#: pg_amcheck.c:1188 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" msgstr " -d, --database=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ბáƒáƒ–(ებ)-ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" -#: pg_amcheck.c:1144 +#: pg_amcheck.c:1189 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" msgstr " -D, --exclude-database=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ბáƒáƒ–(ებ)ის áƒáƒ -შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" -#: pg_amcheck.c:1145 +#: pg_amcheck.c:1190 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" msgstr " -i, --index=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ინდექს(ებ)-ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" -#: pg_amcheck.c:1146 +#: pg_amcheck.c:1191 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" -msgstr "" -" -I, --exclude-index=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ შáƒáƒ‘ლáƒáƒœ(ებ)-ის áƒáƒ -შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" +msgstr " -I, --exclude-index=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ შáƒáƒ‘ლáƒáƒœ(ებ)-ის áƒáƒ -შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" -#: pg_amcheck.c:1147 +#: pg_amcheck.c:1192 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" -msgstr "" -" -r, --relation=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ურთითერთáƒáƒ‘(ებ)-ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" +msgstr " -r, --relation=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ურთითერთáƒáƒ‘(ებ)-ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" -#: pg_amcheck.c:1148 +#: pg_amcheck.c:1193 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" -msgstr "" -" -R, --exclude-relation=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ურთიერთáƒáƒ‘(ებ)-ის áƒáƒ -შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" +msgstr " -R, --exclude-relation=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ურთიერთáƒáƒ‘(ებ)-ის áƒáƒ -შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" -#: pg_amcheck.c:1149 +#: pg_amcheck.c:1194 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" msgstr " -s, --schema=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ სქემ(ებ)-ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" -#: pg_amcheck.c:1150 +#: pg_amcheck.c:1195 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" -msgstr "" -" -S, --exclude-schema=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ სქემ(ებ)-ის áƒáƒ  შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" +msgstr " -S, --exclude-schema=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ სქემ(ებ)-ის áƒáƒ  შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" -#: pg_amcheck.c:1151 +#: pg_amcheck.c:1196 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" msgstr " -t, --table=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ცხრილ(ებ)-ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" -#: pg_amcheck.c:1152 +#: pg_amcheck.c:1197 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" -msgstr "" -" -T, --exclude-table=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ცხრილ(ებ)-ი áƒáƒ  შემáƒáƒ¬áƒ›áƒ“ებáƒ\n" +msgstr " -T, --exclude-table=შáƒáƒ‘ლáƒáƒœáƒ˜ შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ცხრილ(ებ)-ი áƒáƒ  შემáƒáƒ¬áƒ›áƒ“ებáƒ\n" -#: pg_amcheck.c:1153 +#: pg_amcheck.c:1198 #, c-format -msgid "" -" --no-dependent-indexes do NOT expand list of relations to include " -"indexes\n" -msgstr "" -" --no-dependent-indexes ურთერთáƒáƒ‘ების სიის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებისáƒáƒ¡ ინდექსები " -"áƒáƒ  დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებდებáƒ\n" +msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" +msgstr " --no-dependent-indexes ურთერთáƒáƒ‘ების სიის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებისáƒáƒ¡ ინდექსები áƒáƒ  დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებდებáƒ\n" -#: pg_amcheck.c:1154 +#: pg_amcheck.c:1199 #, c-format -msgid "" -" --no-dependent-toast do NOT expand list of relations to include " -"TOAST tables\n" -msgstr "" -" --no-dependent-toast ურთიერთáƒáƒ‘ების სიის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებისáƒáƒ¡ TOAST " -"ცხრილები áƒáƒ  დáƒáƒ›áƒ£áƒ¨áƒáƒ•დებრ\n" +msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" +msgstr " --no-dependent-toast ურთიერთáƒáƒ‘ების სიის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებისáƒáƒ¡ TOAST ცხრილები áƒáƒ  დáƒáƒ›áƒ£áƒ¨áƒáƒ•დებრ\n" -#: pg_amcheck.c:1155 +#: pg_amcheck.c:1200 #, c-format -msgid "" -" --no-strict-names do NOT require patterns to match objects\n" -msgstr "" -" --no-strict-names მáƒáƒ—ხáƒáƒ•ნებში შáƒáƒ‘ლáƒáƒœáƒ–ე დáƒáƒ›áƒ—ხვევრჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ áƒáƒ  " -"იქნებáƒ\n" +msgid " --no-strict-names do NOT require patterns to match objects\n" +msgstr " --no-strict-names მáƒáƒ—ხáƒáƒ•ნებში შáƒáƒ‘ლáƒáƒœáƒ–ე დáƒáƒ›áƒ—ხვევრჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ áƒáƒ  იქნებáƒ\n" -#: pg_amcheck.c:1156 +#: pg_amcheck.c:1201 #, c-format msgid "" "\n" @@ -361,50 +447,32 @@ msgstr "" "\n" "ცხრილის შემáƒáƒ¬áƒ›áƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_amcheck.c:1157 +#: pg_amcheck.c:1202 #, c-format -msgid "" -" --exclude-toast-pointers do NOT follow relation TOAST pointers\n" -msgstr "" -" --exclude-toast-pointers ურთიერთáƒáƒ‘ის TOAST მáƒáƒ©áƒ•ენებლებს áƒáƒ  " -"გáƒáƒ°áƒ§áƒ•ებáƒ\n" +msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" +msgstr " --exclude-toast-pointers ურთიერთáƒáƒ‘ის TOAST მáƒáƒ©áƒ•ენებლებს áƒáƒ  გáƒáƒ°áƒ§áƒ•ებáƒ\n" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1203 #, c-format -msgid "" -" --on-error-stop stop checking at end of first corrupt " -"page\n" -msgstr "" -" --on-error-stop მუშáƒáƒáƒ‘ის პირველი დáƒáƒ–იáƒáƒœáƒ”ბული გვერდის " -"ბáƒáƒšáƒáƒ¨áƒ˜ შეწყვეტáƒ\n" +msgid " --on-error-stop stop checking at end of first corrupt page\n" +msgstr " --on-error-stop მუშáƒáƒáƒ‘ის პირველი დáƒáƒ–იáƒáƒœáƒ”ბული გვერდის ბáƒáƒšáƒáƒ¨áƒ˜ შეწყვეტáƒ\n" -#: pg_amcheck.c:1159 +#: pg_amcheck.c:1204 #, c-format -msgid "" -" --skip=OPTION do NOT check \"all-frozen\" or \"all-" -"visible\" blocks\n" -msgstr "" -" --skip=პáƒáƒ áƒáƒ›áƒ”ტრი \"all-frozen\" დრ\"all-visible\" " -"ბლáƒáƒ™áƒ”ბი áƒáƒ  შემáƒáƒ¬áƒ›áƒ“ებáƒ\n" +msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" +msgstr " --skip=პáƒáƒ áƒáƒ›áƒ”ტრი \"all-frozen\" დრ\"all-visible\" ბლáƒáƒ™áƒ”ბი áƒáƒ  შემáƒáƒ¬áƒ›áƒ“ებáƒ\n" -#: pg_amcheck.c:1160 +#: pg_amcheck.c:1205 #, c-format -msgid "" -" --startblock=BLOCK begin checking table(s) at the given block " -"number\n" -msgstr "" -" --startblock=ბლáƒáƒ™áƒ˜ შემáƒáƒ¬áƒ›áƒ”ბის ბლáƒáƒ™áƒ˜áƒ¡ მითითებული ნáƒáƒ›áƒ áƒ˜áƒ“áƒáƒœ " -"დáƒáƒ¬áƒ§áƒ”ბáƒ\n" +msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" +msgstr " --startblock=ბლáƒáƒ™áƒ˜ შემáƒáƒ¬áƒ›áƒ”ბის ბლáƒáƒ™áƒ˜áƒ¡ მითითებული ნáƒáƒ›áƒ áƒ˜áƒ“áƒáƒœ დáƒáƒ¬áƒ§áƒ”ბáƒ\n" -#: pg_amcheck.c:1161 +#: pg_amcheck.c:1206 #, c-format -msgid "" -" --endblock=BLOCK check table(s) only up to the given block " -"number\n" -msgstr "" -" --endblock=ბლáƒáƒ™áƒ˜ შემáƒáƒ¬áƒ›áƒ”ბის მითითებულ ბლáƒáƒ™áƒ–ე დáƒáƒ›áƒ—áƒáƒ•რებáƒ\n" +msgid " --endblock=BLOCK check table(s) only up to the given block number\n" +msgstr " --endblock=ბლáƒáƒ™áƒ˜ შემáƒáƒ¬áƒ›áƒ”ბის მითითებულ ბლáƒáƒ™áƒ–ე დáƒáƒ›áƒ—áƒáƒ•რებáƒ\n" -#: pg_amcheck.c:1162 +#: pg_amcheck.c:1207 #, c-format msgid "" "\n" @@ -413,32 +481,27 @@ msgstr "" "\n" "áƒáƒ áƒáƒ‘ითი ხის ინდექსის შემáƒáƒ¬áƒ›áƒ”ბის პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_amcheck.c:1163 +#: pg_amcheck.c:1208 #, c-format -msgid "" -" --heapallindexed check that all heap tuples are found " -"within indexes\n" -msgstr "" -" --heapallindexed შემáƒáƒ¬áƒ›áƒ”ბáƒ, მეხსიერების ცხრილში ყველრ" -"მáƒáƒœáƒáƒªáƒ”მი áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, თუ áƒáƒ áƒ\n" +msgid " --checkunique check unique constraint if index is unique\n" +msgstr " --checkunique უნიკáƒáƒšáƒ£áƒ áƒ˜ შეზღუდვის შემáƒáƒ¬áƒ›áƒ”ბáƒ, უნიკáƒáƒšáƒ£áƒ áƒ˜áƒ თუ áƒáƒ áƒ ინდექსი\n" -#: pg_amcheck.c:1164 +#: pg_amcheck.c:1209 #, c-format -msgid "" -" --parent-check check index parent/child relationships\n" -msgstr "" -" --parent-check ინდექსის მშáƒáƒ‘ელი/შვილის ურთიერთáƒáƒ‘ის " -"შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" +msgid " --heapallindexed check that all heap tuples are found within indexes\n" +msgstr " --heapallindexed შემáƒáƒ¬áƒ›áƒ”ბáƒ, მეხსიერების ცხრილში ყველრმáƒáƒœáƒáƒªáƒ”მი áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, თუ áƒáƒ áƒ\n" -#: pg_amcheck.c:1165 +#: pg_amcheck.c:1210 #, c-format -msgid "" -" --rootdescend search from root page to refind tuples\n" -msgstr "" -" --rootdescend მáƒáƒœáƒáƒªáƒ”მების თáƒáƒ•იდáƒáƒœ სáƒáƒžáƒáƒ•ნელáƒáƒ“ ძებნის root " -"გვერდიდáƒáƒœ დáƒáƒ¬áƒ§áƒ”ბáƒ\n" +msgid " --parent-check check index parent/child relationships\n" +msgstr " --parent-check ინდექსის მშáƒáƒ‘ელი/შვილის ურთიერთáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" + +#: pg_amcheck.c:1211 +#, c-format +msgid " --rootdescend search from root page to refind tuples\n" +msgstr " --rootdescend მáƒáƒœáƒáƒªáƒ”მების თáƒáƒ•იდáƒáƒœ სáƒáƒžáƒáƒ•ნელáƒáƒ“ ძებნის root გვერდიდáƒáƒœ დáƒáƒ¬áƒ§áƒ”ბáƒ\n" -#: pg_amcheck.c:1166 +#: pg_amcheck.c:1212 #, c-format msgid "" "\n" @@ -447,41 +510,37 @@ msgstr "" "\n" "შეერთების პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_amcheck.c:1167 +#: pg_amcheck.c:1213 #, c-format -msgid "" -" -h, --host=HOSTNAME database server host or socket directory\n" -msgstr "" -" -h, --host=ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი ბáƒáƒ–ის სერვერის სáƒáƒ®áƒ”ლი áƒáƒœ სáƒáƒ™áƒ”ტის " -"სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი ბáƒáƒ–ის სერვერის სáƒáƒ®áƒ”ლი áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: pg_amcheck.c:1168 +#: pg_amcheck.c:1214 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=პáƒáƒ áƒ¢áƒ˜ ბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜\n" -#: pg_amcheck.c:1169 +#: pg_amcheck.c:1215 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" -msgstr "" -" -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი მისáƒáƒ”რთებელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" +msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი მისáƒáƒ”რთებელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: pg_amcheck.c:1170 +#: pg_amcheck.c:1216 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password პáƒáƒ áƒáƒšáƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•ნრáƒáƒ  მáƒáƒ®áƒ“ებáƒ\n" -#: pg_amcheck.c:1171 +#: pg_amcheck.c:1217 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password პáƒáƒ áƒáƒšáƒ˜áƒ¡ ყველრშემთხვევáƒáƒ¨áƒ˜ კითხვáƒ\n" -#: pg_amcheck.c:1172 +#: pg_amcheck.c:1218 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ სáƒáƒáƒ•áƒáƒ áƒ˜áƒ ბáƒáƒ–áƒ\n" -#: pg_amcheck.c:1173 +#: pg_amcheck.c:1219 #, c-format msgid "" "\n" @@ -490,49 +549,42 @@ msgstr "" "\n" "სხვრპáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_amcheck.c:1174 +#: pg_amcheck.c:1220 #, c-format -msgid "" -" -e, --echo show the commands being sent to the " -"server\n" +msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo-queries სერვერზე გáƒáƒ’ზáƒáƒ•ნილი ბრძáƒáƒœáƒ”ბების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: pg_amcheck.c:1175 +#: pg_amcheck.c:1221 #, c-format -msgid "" -" -j, --jobs=NUM use this many concurrent connections to " -"the server\n" -msgstr "" -" -j, --jobs=რიცხვი სერვერთáƒáƒœ მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის " -"მიერთებების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" +msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" +msgstr " -j, --jobs=რიცხვი სერვერთáƒáƒœ მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის მიერთებების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" -#: pg_amcheck.c:1176 +#: pg_amcheck.c:1222 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress მიმდინáƒáƒ áƒ”áƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებáƒ\n" -#: pg_amcheck.c:1177 +#: pg_amcheck.c:1223 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: pg_amcheck.c:1178 +#: pg_amcheck.c:1224 #, c-format -msgid "" -" -V, --version output version information, then exit\n" +msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_amcheck.c:1179 +#: pg_amcheck.c:1225 #, c-format msgid " --install-missing install missing extensions\n" msgstr " --install-missing ნáƒáƒ™áƒšáƒ£áƒšáƒ˜ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების დáƒáƒ§áƒ”ნებáƒ\n" -#: pg_amcheck.c:1180 +#: pg_amcheck.c:1226 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_amcheck.c:1182 +#: pg_amcheck.c:1228 #, c-format msgid "" "\n" @@ -541,52 +593,52 @@ msgstr "" "\n" "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n" -#: pg_amcheck.c:1183 +#: pg_amcheck.c:1229 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" -#: pg_amcheck.c:1236 +#: pg_amcheck.c:1282 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" msgstr "%*s/%s ურთიერთáƒáƒ‘რ(%d%%), %*s/%s გვერდი (%d%%) %*s" -#: pg_amcheck.c:1247 +#: pg_amcheck.c:1293 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" msgstr "%*s/%s ურთიერთáƒáƒ‘áƒ(%d%%), %*s/%s გვერდი (%d%%) (%s%-*.*s)" -#: pg_amcheck.c:1262 +#: pg_amcheck.c:1308 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" msgstr "%*s/%s ურთიერთáƒáƒ‘რ(%d%%), %*s/%s გვერდი (%d%%)" -#: pg_amcheck.c:1321 pg_amcheck.c:1354 +#: pg_amcheck.c:1367 pg_amcheck.c:1400 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სრული სáƒáƒ®áƒ”ლი (ძáƒáƒšáƒ˜áƒáƒœ ბევრი წერტილიáƒáƒœáƒ˜ სáƒáƒ®áƒ”ლი): %s" -#: pg_amcheck.c:1399 +#: pg_amcheck.c:1445 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "ურთიერთáƒáƒ‘ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი (ძáƒáƒšáƒ˜áƒáƒœ ბევრი წერტილიáƒáƒœáƒ˜ სáƒáƒ®áƒ”ლი): %s" -#: pg_amcheck.c:1552 pg_amcheck.c:1691 +#: pg_amcheck.c:1598 pg_amcheck.c:1737 #, c-format msgid "including database \"%s\"" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\"" -#: pg_amcheck.c:1673 +#: pg_amcheck.c:1719 #, c-format msgid "internal error: received unexpected database pattern_id %d" msgstr "შიდრშეცდáƒáƒ›áƒ: მიღებულრბáƒáƒ–ის მáƒáƒ£áƒšáƒáƒ“ნელი შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡_id: %d" -#: pg_amcheck.c:1675 +#: pg_amcheck.c:1721 #, c-format msgid "no connectable databases to check matching \"%s\"" msgstr "\"%s\"-ის დáƒáƒ›áƒ—ხვევის შესáƒáƒ›áƒáƒ¬áƒ›áƒ”ბლáƒáƒ“ მიერთებáƒáƒ“ი ბáƒáƒ–რáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_amcheck.c:2133 +#: pg_amcheck.c:2179 #, c-format msgid "internal error: received unexpected relation pattern_id %d" msgstr "შიდრშეცდáƒáƒ›áƒ: მიღებულრურთიერთáƒáƒ‘ის მáƒáƒ£áƒšáƒáƒ“ნელი შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡_id: %d" diff --git a/src/bin/pg_amcheck/po/ko.po b/src/bin/pg_amcheck/po/ko.po new file mode 100644 index 0000000000000..d5e78e4f22c7f --- /dev/null +++ b/src/bin/pg_amcheck/po/ko.po @@ -0,0 +1,681 @@ +# Korean message translation file for pg_amcheck +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_amcheck (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2025-01-17 04:52+0000\n" +"PO-Revision-Date: 2025-01-17 18:01+0900\n" +"Last-Translator: Ioseph Kim \n" +"Language-Team: Korean \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "오류: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "경고: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "메모리 부족\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ë„ í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 위한 íŒŒì¼ ì‹œìŠ¤í…œ ë™ê¸°í™”를 í•  수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ìƒíƒœ 정보를 알 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ì´ ë¹Œë“œëŠ” \"%s\" ë™ê¸°í™” ë°©ë²•ì€ ì§€ì›í•˜ì§€ 않ìŒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ fsync í•  수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "ì‚¬ìš©ìž ID(%ld)를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "ì‚¬ìš©ìž ì—†ìŒ" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "ì‚¬ìš©ìž ì´ë¦„ 찾기 실패: 오류 코드 %lu" + +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 +msgid "Cancel request sent\n" +msgstr "취소 요청 보냄\n" + +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 +msgid "Could not send cancel request: " +msgstr "취소 요청 보내기 실패: " + +#: ../../fe_utils/connect_utils.c:91 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "%s ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²° í•  수 ì—†ìŒ: 메모리 부족" + +#: ../../fe_utils/connect_utils.c:116 +#, c-format +msgid "%s" +msgstr "%s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "\"%s\" ê°’ì€ %s ì˜µì…˜ì˜ ê°’ìœ¼ë¡œ ì ë‹¹í•˜ì§€ 않ìŒ" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s ê°’ì€ %d부터 %d까지만 허용합니다" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "알 수 없는 ë™ê¸°í™” 방법: %s" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "ì´ í”Œëž«í¼ì—서는 너무 ë§Žì€ job 입니다: %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "select() 작업 범위를 벗어나는 소켓 íŒŒì¼ ê¸°ìˆ ìž: %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "job 수를 줄여주세요." + +#: ../../fe_utils/parallel_slot.c:553 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ 처리 중 오류 ë°œìƒ: %s" + +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#: pg_amcheck.c:1693 pg_amcheck.c:2138 +#, c-format +msgid "query failed: %s" +msgstr "쿼리 실패: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#: pg_amcheck.c:578 pg_amcheck.c:1147 pg_amcheck.c:1694 pg_amcheck.c:2139 +#, c-format +msgid "Query was: %s" +msgstr "사용한 쿼리: %s" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "쉘 명령 ì¸ìžì— 줄바꿈 문ìžê°€ 있ìŒ: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "ë°ì´í„°ë² ì´ìФ ì´ë¦„ì— ì¤„ë°”ê¿ˆ 문ìžê°€ 있ìŒ: \"%s\"\n" + +#: pg_amcheck.c:403 +#, c-format +msgid "invalid argument for option %s" +msgstr "%s ì˜µì…˜ì˜ ìž˜ëª»ëœ ì¸ìž" + +#: pg_amcheck.c:409 +#, c-format +msgid "invalid start block" +msgstr "시작 블ë¡ì´ 유효하지 않ìŒ" + +#: pg_amcheck.c:411 +#, c-format +msgid "start block out of bounds" +msgstr "시작 블ë¡ì´ 범위를 벗어남" + +#: pg_amcheck.c:418 +#, c-format +msgid "invalid end block" +msgstr "마지막 블ë¡ì´ 유효하지 않ìŒ" + +#: pg_amcheck.c:420 +#, c-format +msgid "end block out of bounds" +msgstr "마지막 블ë¡ì´ 범위를 벗어남" + +#: pg_amcheck.c:446 pg_amcheck.c:468 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보십시오." + +#: pg_amcheck.c:452 +#, c-format +msgid "end block precedes start block" +msgstr "마지막 블ë¡ì´ 시작 블ë¡ë³´ë‹¤ ì•žì— ì¡´ìž¬í•¨" + +#: pg_amcheck.c:466 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")" + +#: pg_amcheck.c:486 +#, c-format +msgid "cannot specify a database name with --all" +msgstr "ë°ì´í„°ë² ì´ìФ ì´ë¦„ì„ â€”all 와 ê°™ì´ ì§€ì •í•  수 없습니다" + +#: pg_amcheck.c:492 +#, c-format +msgid "cannot specify both a database name and database patterns" +msgstr "ë°ì´í„°ë² ì´ìФ ì´ë¦„ê³¼ 형ì‹ì„ 지정할 수 없습니다" + +#: pg_amcheck.c:520 +#, c-format +msgid "no databases to check" +msgstr "확ì¸í•  ë°ì´í„°ë² ì´ìŠ¤ê°€ 없습니다" + +#: pg_amcheck.c:576 +#, c-format +msgid "database \"%s\": %s" +msgstr "ë°ì´í„°ë² ì´ìФ “%sâ€: %s" + +#: pg_amcheck.c:587 +#, c-format +msgid "skipping database \"%s\": amcheck is not installed" +msgstr "ë°ì´í„°ë² ì´ìФ ìƒëžµ “%sâ€: amcheck ê°€ 설치ë˜ì§€ 않ìŒ" + +#: pg_amcheck.c:595 +#, c-format +msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" +msgstr "ë°ì´í„°ë² ì´ìФ “%sâ€: 사용하는 amcheck 버전 “%s†스키마 “%sâ€" + +#: pg_amcheck.c:624 +#, c-format +msgid "option %s is not supported by amcheck version %s" +msgstr "%s ì˜µì…˜ì€ %s 버전 amcheckì—서 ì§€ì›í•˜ì§€ 않ìŒ" + +#: pg_amcheck.c:650 +#, c-format +msgid "no heap tables to check matching \"%s\"" +msgstr "“%s†와 ì¼ì¹˜í•˜ëŠ” heap í…Œì´ë¸”ì„ ì°¾ì„ ìˆ˜ 없습니다" + +#: pg_amcheck.c:653 +#, c-format +msgid "no btree indexes to check matching \"%s\"" +msgstr "“%s†와 ì¼ì¹˜í•˜ëŠ” btree ì¸ë±ìŠ¤ë¥¼ ì°¾ì„ ìˆ˜ 없습니다" + +#: pg_amcheck.c:656 +#, c-format +msgid "no relations to check in schemas matching \"%s\"" +msgstr "스키마ì—서 “%s†와 ì¼ì¹˜í•˜ëŠ” 릴레ì´ì…˜ì„ ì°¾ì„ ìˆ˜ 없습니다" + +#: pg_amcheck.c:659 +#, c-format +msgid "no relations to check matching \"%s\"" +msgstr "“%s†와 ì¼ì¹˜í•˜ëŠ” 릴레ì´ì…˜ì„ ì°¾ì„ ìˆ˜ 없습니다" + +#: pg_amcheck.c:687 +#, c-format +msgid "no relations to check" +msgstr "확ì¸í•  릴레ì´ì…˜ì´ 없습니다" + +#: pg_amcheck.c:770 +#, c-format +msgid "checking heap table \"%s.%s.%s\"" +msgstr "heap í…Œì´ë¸” í™•ì¸ â€œ%s.%s.%sâ€" + +#: pg_amcheck.c:786 +#, c-format +msgid "checking btree index \"%s.%s.%s\"" +msgstr "btree ì¸ë±ìФ í™•ì¸ â€œ%s.%s.%sâ€" + +#: pg_amcheck.c:937 +#, c-format +msgid "error sending command to database \"%s\": %s" +msgstr "ë°ì´í„°ë² ì´ìŠ¤ì— ëª…ë ¹ì„ ë³´ë‚´ëŠ” 중 오류 ë°œìƒ â€œ%sâ€: %s" + +#: pg_amcheck.c:940 +#, c-format +msgid "Command was: %s" +msgstr "사용한 명령: %s" + +#: pg_amcheck.c:1060 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" +msgstr "heap í…Œì´ë¸” “%s.%s.%sâ€, ë¸”ë¡ %s, 오프셋 %s, ì—트리뷰트 %s:\n" + +#: pg_amcheck.c:1067 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" +msgstr "heap í…Œì´ë¸” “%s.%s.%sâ€, ë¸”ë¡ %s, 오프셋 %s:\n" + +#: pg_amcheck.c:1073 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s:\n" +msgstr "heap í…Œì´ë¸” “%s.%s.%sâ€, ë¸”ë¡ %s:\n" + +#: pg_amcheck.c:1078 pg_amcheck.c:1089 +#, c-format +msgid "heap table \"%s.%s.%s\":\n" +msgstr "heap í…Œì´ë¸” “%s.%s.%sâ€:\n" + +#: pg_amcheck.c:1093 pg_amcheck.c:1162 +#, c-format +msgid "query was: %s\n" +msgstr "사용한 쿼리: %s\n" + +#: pg_amcheck.c:1144 +#, c-format +msgid "" +"btree index \"%s.%s.%s\": btree checking function returned unexpected number " +"of rows: %d" +msgstr "btree ì¸ë±ìФ “%s.%s.%sâ€: btree í™•ì¸ ì¤‘ì— ì˜ˆê¸°ì¹˜ ì•Šì€ í–‰ìˆ˜ë¥¼ 반환함: %d" + +#: pg_amcheck.c:1148 +#, c-format +msgid "Are %s's and amcheck's versions compatible?" +msgstr "%s 버전과 amcheckì˜ ë²„ì „ì´ í˜¸í™˜ 가능합니까?" + +#: pg_amcheck.c:1158 +#, c-format +msgid "btree index \"%s.%s.%s\":\n" +msgstr "btree ì¸ë±ìФ “%s.%s.%sâ€:\n" + +#: pg_amcheck.c:1183 +#, c-format +msgid "" +"%s checks objects in a PostgreSQL database for corruption.\n" +"\n" +msgstr "" +"%s는 PostgreSQL ë°ì´í„°ë² ì´ìФ 개체 ì†ìƒ 여부를 검사합니다.\n" +"\n" + +#: pg_amcheck.c:1184 +#, c-format +msgid "Usage:\n" +msgstr "사용법:\n" + +#: pg_amcheck.c:1185 +#, c-format +msgid " %s [OPTION]... [DBNAME]\n" +msgstr " %s [옵션]... [DBì´ë¦„]\n" + +#: pg_amcheck.c:1186 +#, c-format +msgid "" +"\n" +"Target options:\n" +msgstr "" +"\n" +"사용가능한 옵션들:\n" + +#: pg_amcheck.c:1187 +#, c-format +msgid " -a, --all check all databases\n" +msgstr " -a, -—all 모든 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 검사\n" + +#: pg_amcheck.c:1188 +#, c-format +msgid " -d, --database=PATTERN check matching database(s)\n" +msgstr " -d, -—database=PATTERN ì¼ì¹˜í•˜ëŠ” 모든 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 검사\n" + +#: pg_amcheck.c:1189 +#, c-format +msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" +msgstr "" +" -D, -—exclude-database=PATTERN ì¼ì¹˜í•˜ëŠ” ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 제외 하고 검사\n" + +#: pg_amcheck.c:1190 +#, c-format +msgid " -i, --index=PATTERN check matching index(es)\n" +msgstr " -i, -—index=PATTERN ì¼ì¹˜í•˜ëŠ” ì¸ë±ìŠ¤ë¥¼ 검사\n" + +#: pg_amcheck.c:1191 +#, c-format +msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" +msgstr " -I, -—exclude-index=PATTERN ì¼ì¹˜í•˜ëŠ” ì¸ë±ìŠ¤ë¥¼ 제외하고 검사\n" + +#: pg_amcheck.c:1192 +#, c-format +msgid " -r, --relation=PATTERN check matching relation(s)\n" +msgstr " -r, -—relation=PATTERN ì¼ì¹˜í•˜ëŠ” 릴레ì´ì…˜ì„ 검사\n" + +#: pg_amcheck.c:1193 +#, c-format +msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" +msgstr " -R, -—exclude-relation=PATTERN ì¼ì¹˜í•˜ëŠ” 릴레ì´ì…˜ì„ 제외하고 검사\n" + +#: pg_amcheck.c:1194 +#, c-format +msgid " -s, --schema=PATTERN check matching schema(s)\n" +msgstr " -s, -—schema=PATTERN ì¼ì¹˜í•˜ëŠ” 스키마를 검사\n" + +#: pg_amcheck.c:1195 +#, c-format +msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" +msgstr " -S, -—exclude-schema=PATTERN ì¼ì¹˜í•˜ëŠ” 스키마를 제외하고 검사\n" + +#: pg_amcheck.c:1196 +#, c-format +msgid " -t, --table=PATTERN check matching table(s)\n" +msgstr " -t, -—table=PATTERN ì¼ì¹˜í•˜ëŠ” í…Œì´ë¸”ì„ ê²€ì‚¬\n" + +#: pg_amcheck.c:1197 +#, c-format +msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" +msgstr " -T, -—exclude-table=PATTERN ì¼ì¹˜í•˜ëŠ” í…Œì´ë¸”ì„ ì œì™¸í•˜ê³  검사\n" + +#: pg_amcheck.c:1198 +#, c-format +msgid "" +" --no-dependent-indexes do NOT expand list of relations to include " +"indexes\n" +msgstr " -—no-dependent-indexes 릴레ì´ì…˜ì— ì¸ë±ìŠ¤ë¥¼ í¬í•¨í•˜ì§€ ì•ŠìŒ \n" + +#: pg_amcheck.c:1199 +#, c-format +msgid "" +" --no-dependent-toast do NOT expand list of relations to include " +"TOAST tables\n" +msgstr "" +" -—no-dependent-toast 릴레ì´ì…˜ì— TOAST í…Œì´ë¸”ì„ í¬í•¨í•˜ì§€ 않ìŒ\n" + +#: pg_amcheck.c:1200 +#, c-format +msgid "" +" --no-strict-names do NOT require patterns to match objects\n" +msgstr "" +" -—no-strict-names 개체가 패턴과 ì¼ì¹˜í•˜ì§€ ì•Šì•„ë„ í—ˆìš©í•¨\n" + +#: pg_amcheck.c:1201 +#, c-format +msgid "" +"\n" +"Table checking options:\n" +msgstr "" +"\n" +"í…Œì´ë¸” 검사 옵션들:\n" + +#: pg_amcheck.c:1202 +#, c-format +msgid "" +" --exclude-toast-pointers do NOT follow relation TOAST pointers\n" +msgstr " -—exclude-toast-pointers TOAST í¬ì¸í„°ë¥¼ 확ì¸í•˜ì§€ 않ìŒ\n" + +#: pg_amcheck.c:1203 +#, c-format +msgid "" +" --on-error-stop stop checking at end of first corrupt " +"page\n" +msgstr " -—on-error-stop ì†ìƒëœ 페ì´ì§€ ëì—서 검사를 멈춤\n" + +#: pg_amcheck.c:1204 +#, c-format +msgid "" +" --skip=OPTION do NOT check \"all-frozen\" or \"all-" +"visible\" blocks\n" +msgstr "" +" -—skip=OPTION \"all-frozen\" ë˜ëŠ” \"all-visible\" 블ë¡ì„ " +"검사하지 않ìŒ\n" + +#: pg_amcheck.c:1205 +#, c-format +msgid "" +" --startblock=BLOCK begin checking table(s) at the given block " +"number\n" +msgstr "" +" -—startblock=BLOCK ì§€ì •ëœ ë¸”ë¡ ë²ˆí˜¸ë¶€í„° í…Œì´ë¸” 검사를 시작\n" + +#: pg_amcheck.c:1206 +#, c-format +msgid "" +" --endblock=BLOCK check table(s) only up to the given block " +"number\n" +msgstr "" +" -—endblock=BLOCK ì§€ì •ëœ ë¸”ë¡ ë²ˆí˜¸ê¹Œì§€ í…Œì´ë¸” 검사 마침\n" + +#: pg_amcheck.c:1207 +#, c-format +msgid "" +"\n" +"B-tree index checking options:\n" +msgstr "" +"\n" +"B-tree ì¸ë±ìФ 검사 옵션들:\n" + +#: pg_amcheck.c:1208 +#, c-format +msgid "" +" --checkunique check unique constraint if index is " +"unique\n" +msgstr "" +" --checkunique ìœ ë‹ˆí¬ ì¸ë±ìФë¼ë©´ ìœ ë‹ˆí¬ ì œì•½ì¡°ê±´ 검사\n" + +#: pg_amcheck.c:1209 +#, c-format +msgid "" +" --heapallindexed check that all heap tuples are found " +"within indexes\n" +msgstr "" +" -—heapallindexed 모든 heap íŠœí”Œì´ ì¸ë±ìФ ë‚´ì— ìžˆëŠ”ì§€ 검사\n" + +#: pg_amcheck.c:1210 +#, c-format +msgid "" +" --parent-check check index parent/child relationships\n" +msgstr " -—parent-check ì¸ë±ìŠ¤ì˜ ë¶€ëª¨/ìžì‹ 관계를 검사\n" + +#: pg_amcheck.c:1211 +#, c-format +msgid "" +" --rootdescend search from root page to refind tuples\n" +msgstr " —-rootdescend 루트 페ì´ì§€ 부터 íŠœí”Œì„ ë‹¤ì‹œ ì°¾ìŒ \n" + +#: pg_amcheck.c:1212 +#, c-format +msgid "" +"\n" +"Connection options:\n" +msgstr "" +"\n" +"ì—°ê²° 옵션들:\n" + +#: pg_amcheck.c:1213 +#, c-format +msgid "" +" -h, --host=HOSTNAME database server host or socket directory\n" +msgstr "" +" -h, -—host=HOSTNAME ë°ì´í„°ë² ì´ìФ 서버 호스트 ë˜ëŠ” ì†Œì¼“ì˜ ë””ë ‰í„°" +"리\n" + +#: pg_amcheck.c:1214 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, -—port=PORT ë°ì´í„°ë² ì´ìФ 서버 í¬íЏ\n" + +#: pg_amcheck.c:1215 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, -—username=USERNAME ì—°ê²°í•  유저 ì´ë¦„\n" + +#: pg_amcheck.c:1216 +#, c-format +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, -—no-password 암호 ìž…ë ¥ 프롬프트가 나타나지 않ìŒ\n" + +#: pg_amcheck.c:1217 +#, c-format +msgid " -W, --password force password prompt\n" +msgstr " -W, -—password 암호 ìž…ë ¥ 프롬프트가 나타남\n" + +#: pg_amcheck.c:1218 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " -—maintenance-db=DBNAME 대체 ì—°ê²° ë°ì´í„°ë² ì´ìФ\n" + +#: pg_amcheck.c:1219 +#, c-format +msgid "" +"\n" +"Other options:\n" +msgstr "" +"\n" +"기타 옵션:\n" + +#: pg_amcheck.c:1220 +#, c-format +msgid "" +" -e, --echo show the commands being sent to the " +"server\n" +msgstr " -e, --echo 서버로 보내는 ëª…ë ¹ë“¤ì„ ë³´ì—¬ì¤Œ\n" + +#: pg_amcheck.c:1221 +#, c-format +msgid "" +" -j, --jobs=NUM use this many concurrent connections to " +"the server\n" +msgstr " -j, -—jobs=NUM ì„œë²„ì— ë™ì‹œ ì—°ê²°í•  수를 지정\n" + +#: pg_amcheck.c:1222 +#, c-format +msgid " -P, --progress show progress information\n" +msgstr " -P, -—progress ì§„í–‰ 사항 정보를 보여줌\n" + +#: pg_amcheck.c:1223 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose ìž‘ì—…ë‚´ì—­ì˜ ìžì„¸í•œ 출력\n" + +#: pg_amcheck.c:1224 +#, c-format +msgid "" +" -V, --version output version information, then exit\n" +msgstr " -V, --version 버전 정보를 보여주고 마침\n" + +#: pg_amcheck.c:1225 +#, c-format +msgid " --install-missing install missing extensions\n" +msgstr " -—install-missing 누ë½ëœ ìµìФí…ì…˜ì„ ì„¤ì¹˜\n" + +#: pg_amcheck.c:1226 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ë„움ë§ì„ 표시하고 종료\n" + +#: pg_amcheck.c:1228 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"ë¬¸ì œì  ë³´ê³  주소: <%s>\n" + +#: pg_amcheck.c:1229 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 홈페ì´ì§€: <%s>\n" + +#: pg_amcheck.c:1282 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" +msgstr "%*s/%s 릴레ì´ì…˜ (%d%%), %*s/%s 페ì´ì§€ (%d%%) %*s" + +#: pg_amcheck.c:1293 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" +msgstr "%*s/%s 릴레ì´ì…˜ (%d%%), %*s/%s 페ì´ì§€ (%d%%) (%s%-*.*s)" + +#: pg_amcheck.c:1308 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" +msgstr "%*s/%s 릴레ì´ì…˜ (%d%%), %*s/%s 페ì´ì§€ (%d%%)" + +#: pg_amcheck.c:1367 pg_amcheck.c:1400 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "바르지 못한 규정 ì´ë¦„(ì ìœ¼ë¡œ êµ¬ë¶„ëœ ì´ë¦„ì´ ë„ˆë¬´ ë§ŽìŒ): %s" + +#: pg_amcheck.c:1445 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "바르지 못한 릴레ì´ì…˜ ì´ë¦„(ì ìœ¼ë¡œ êµ¬ë¶„ëœ ì´ë¦„ì´ ë„ˆë¬´ ë§ŽìŒ): %s" + +#: pg_amcheck.c:1598 pg_amcheck.c:1737 +#, c-format +msgid "including database \"%s\"" +msgstr "“%s†ë°ì´í„°ë² ì´ìŠ¤ë¥¼ í¬í•¨í•©ë‹ˆë‹¤" + +#: pg_amcheck.c:1719 +#, c-format +msgid "internal error: received unexpected database pattern_id %d" +msgstr "ë‚´ë¶€ 오류: 올바르지 ì•Šì€ ë°ì´í„°ë² ì´ìФ 패턴 ì•„ì´ë”” %d" + +#: pg_amcheck.c:1721 +#, c-format +msgid "no connectable databases to check matching \"%s\"" +msgstr "“%s†와 ì¼ì¹˜í•˜ëŠ” ì—°ê²° 가능한 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ" + +#: pg_amcheck.c:2179 +#, c-format +msgid "internal error: received unexpected relation pattern_id %d" +msgstr "ë‚´ë¶€ 오류: 올바르지 ì•Šì€ ë¦´ë ˆì´ì…˜ 패턴 ì•„ì´ë”” %d" diff --git a/src/bin/pg_amcheck/po/meson.build b/src/bin/pg_amcheck/po/meson.build index 618de4f445818..8ab3577dd29ed 100644 --- a/src/bin/pg_amcheck/po/meson.build +++ b/src/bin/pg_amcheck/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_amcheck-' + pg_version_major.to_string())] diff --git a/src/bin/pg_amcheck/po/ru.po b/src/bin/pg_amcheck/po/ru.po index 8b6654585185c..74437e92a3388 100644 --- a/src/bin/pg_amcheck/po/ru.po +++ b/src/bin/pg_amcheck/po/ru.po @@ -1,10 +1,10 @@ -# Alexander Lakhin , 2021, 2022. +# Alexander Lakhin , 2021, 2022, 2024. msgid "" msgstr "" "Project-Id-Version: pg_amcheck (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-27 14:52+0300\n" -"PO-Revision-Date: 2022-09-05 13:33+0300\n" +"POT-Creation-Date: 2025-05-03 16:06+0300\n" +"PO-Revision-Date: 2024-09-05 08:23+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -32,11 +32,78 @@ msgstr "подробноÑти: " msgid "hint: " msgstr "подÑказка: " -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "нехватка памÑти\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñта Ñборка программы не поддерживает метод Ñинхронизации \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "выÑÑнить Ñффективный идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (%ld) не удалоÑÑŒ: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "пользователь не ÑущеÑтвует" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "раÑпознать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалоÑÑŒ (код ошибки: %lu)" + +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Сигнал отмены отправлен\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "Отправить Ñигнал отмены не удалоÑÑŒ: " @@ -45,7 +112,7 @@ msgstr "Отправить Ñигнал отмены не удалоÑÑŒ: " msgid "could not connect to database %s: out of memory" msgstr "не удалоÑÑŒ подключитьÑÑ Ðº базе %s (нехватка памÑти)" -#: ../../fe_utils/connect_utils.c:117 +#: ../../fe_utils/connect_utils.c:116 #, c-format msgid "%s" msgstr "%s" @@ -60,160 +127,203 @@ msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" msgid "%s must be in range %d..%d" msgstr "значение %s должно быть в диапазоне %d..%d" +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нераÑпознанный метод Ñинхронизации: %s" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "Ñлишком много заданий Ð´Ð»Ñ Ñтой платформы: %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "деÑкриптор файла Ñокета вне диапазона, допуÑтимого Ð´Ð»Ñ select(): %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "Попробуйте уменьшить количеÑтво заданий." + +#: ../../fe_utils/parallel_slot.c:553 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "ошибка при обработке базы \"%s\": %s" + #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1647 pg_amcheck.c:2092 +#: pg_amcheck.c:1693 pg_amcheck.c:2138 #, c-format msgid "query failed: %s" msgstr "ошибка при выполнении запроÑа: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093 +#: pg_amcheck.c:578 pg_amcheck.c:1147 pg_amcheck.c:1694 pg_amcheck.c:2139 #, c-format msgid "Query was: %s" msgstr "ВыполнÑлÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñ: %s" -#: pg_amcheck.c:399 +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "" +"аргумент команды оболочки Ñодержит Ñимвол новой Ñтроки или перевода каретки: " +"\"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "" +"Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ñодержит Ñимвол новой Ñтроки или перевода каретки: \"%s\"\n" + +#: pg_amcheck.c:403 #, c-format msgid "invalid argument for option %s" msgstr "недопуÑтимый аргумент параметра %s" -#: pg_amcheck.c:405 +#: pg_amcheck.c:409 #, c-format msgid "invalid start block" msgstr "неверный начальный блок" -#: pg_amcheck.c:407 +#: pg_amcheck.c:411 #, c-format msgid "start block out of bounds" msgstr "начальный блок вне допуÑтимых пределов" -#: pg_amcheck.c:414 +#: pg_amcheck.c:418 #, c-format msgid "invalid end block" msgstr "неверный конечный блок" -#: pg_amcheck.c:416 +#: pg_amcheck.c:420 #, c-format msgid "end block out of bounds" msgstr "конечный блок вне допуÑтимых пределов" -#: pg_amcheck.c:439 pg_amcheck.c:461 +#: pg_amcheck.c:446 pg_amcheck.c:468 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." -#: pg_amcheck.c:445 +#: pg_amcheck.c:452 #, c-format msgid "end block precedes start block" msgstr "конечный блок предшеÑтвует начальному" -#: pg_amcheck.c:459 +#: pg_amcheck.c:466 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")" -#: pg_amcheck.c:479 +#: pg_amcheck.c:486 #, c-format msgid "cannot specify a database name with --all" msgstr "Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ Ñ --all" -#: pg_amcheck.c:485 +#: pg_amcheck.c:492 #, c-format msgid "cannot specify both a database name and database patterns" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ одновременно Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных и шаблоны имён" -#: pg_amcheck.c:513 +#: pg_amcheck.c:520 #, c-format msgid "no databases to check" msgstr "не указаны базы Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸" -#: pg_amcheck.c:569 +#: pg_amcheck.c:576 #, c-format msgid "database \"%s\": %s" msgstr "база данных \"%s\": %s" -#: pg_amcheck.c:580 +#: pg_amcheck.c:587 #, c-format msgid "skipping database \"%s\": amcheck is not installed" msgstr "база \"%s\" пропуÑкаетÑÑ: раÑширение amcheck не уÑтановлено" -#: pg_amcheck.c:588 +#: pg_amcheck.c:595 #, c-format msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" msgstr "база \"%s\": иÑпользуетÑÑ amcheck верÑии \"%s\" в Ñхеме \"%s\"" -#: pg_amcheck.c:610 +#: pg_amcheck.c:624 +#, c-format +msgid "option %s is not supported by amcheck version %s" +msgstr "параметр %s не поддерживаетÑÑ Ð²ÐµÑ€Ñией amcheck %s" + +#: pg_amcheck.c:650 #, c-format msgid "no heap tables to check matching \"%s\"" msgstr "не найдены подлежащие проверке базовые таблицы, ÑоответÑтвующие \"%s\"" -#: pg_amcheck.c:613 +#: pg_amcheck.c:653 #, c-format msgid "no btree indexes to check matching \"%s\"" msgstr "не найдены подлежащие проверке индекÑÑ‹ btree, ÑоответÑтвующие \"%s\"" -#: pg_amcheck.c:616 +#: pg_amcheck.c:656 #, c-format msgid "no relations to check in schemas matching \"%s\"" msgstr "" "не найдены подлежащие проверке Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð² Ñхемах, ÑоответÑтвующих \"%s\"" -#: pg_amcheck.c:619 +#: pg_amcheck.c:659 #, c-format msgid "no relations to check matching \"%s\"" msgstr "не найдены подлежащие проверке отношениÑ, ÑоответÑтвующие \"%s\"" -#: pg_amcheck.c:647 +#: pg_amcheck.c:687 #, c-format msgid "no relations to check" msgstr "не найдены Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸" -#: pg_amcheck.c:730 +#: pg_amcheck.c:770 #, c-format msgid "checking heap table \"%s.%s.%s\"" msgstr "проверка базовой таблицы \"%s.%s.%s\"" -#: pg_amcheck.c:746 +#: pg_amcheck.c:786 #, c-format msgid "checking btree index \"%s.%s.%s\"" msgstr "проверка индекÑа btree \"%s.%s.%s\"" -#: pg_amcheck.c:893 +#: pg_amcheck.c:937 #, c-format msgid "error sending command to database \"%s\": %s" msgstr "ошибка передачи команды базе \"%s\": %s" -#: pg_amcheck.c:896 +#: pg_amcheck.c:940 #, c-format msgid "Command was: %s" msgstr "ВыполнÑлаÑÑŒ команда: %s" -#: pg_amcheck.c:1015 +#: pg_amcheck.c:1060 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" msgstr "Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s.%s\", блок %s, Ñмещение %s, атрибут %s:\n" -#: pg_amcheck.c:1022 +#: pg_amcheck.c:1067 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" msgstr "Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s.%s\", блок %s, Ñмещение %s:\n" -#: pg_amcheck.c:1028 +#: pg_amcheck.c:1073 #, c-format msgid "heap table \"%s.%s.%s\", block %s:\n" msgstr "Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s.%s\", блок %s:\n" -#: pg_amcheck.c:1033 pg_amcheck.c:1044 +#: pg_amcheck.c:1078 pg_amcheck.c:1089 #, c-format msgid "heap table \"%s.%s.%s\":\n" msgstr "Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s.%s\":\n" -#: pg_amcheck.c:1048 pg_amcheck.c:1117 +#: pg_amcheck.c:1093 pg_amcheck.c:1162 #, c-format msgid "query was: %s\n" msgstr "запроÑ: %s\n" -#: pg_amcheck.c:1099 +#: pg_amcheck.c:1144 #, c-format msgid "" "btree index \"%s.%s.%s\": btree checking function returned unexpected number " @@ -222,17 +332,17 @@ msgstr "" "Ð¸Ð½Ð´ÐµÐºÑ btree \"%s.%s.%s\": Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ btree выдала неожиданное " "количеÑтво Ñтрок: %d" -#: pg_amcheck.c:1103 +#: pg_amcheck.c:1148 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "СовмеÑтимы ли верÑии %s и amcheck?" -#: pg_amcheck.c:1113 +#: pg_amcheck.c:1158 #, c-format msgid "btree index \"%s.%s.%s\":\n" msgstr "Ð¸Ð½Ð´ÐµÐºÑ btree \"%s.%s.%s\":\n" -#: pg_amcheck.c:1138 +#: pg_amcheck.c:1183 #, c-format msgid "" "%s checks objects in a PostgreSQL database for corruption.\n" @@ -241,17 +351,17 @@ msgstr "" "%s проверÑет объекты в базе данных PostgreSQL на предмет повреждений.\n" "\n" -#: pg_amcheck.c:1139 +#: pg_amcheck.c:1184 #, c-format msgid "Usage:\n" msgstr "ИÑпользование:\n" -#: pg_amcheck.c:1140 +#: pg_amcheck.c:1185 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [ПÐРÐМЕТР]... [ИМЯ_БД]\n" -#: pg_amcheck.c:1141 +#: pg_amcheck.c:1186 #, c-format msgid "" "\n" @@ -260,77 +370,77 @@ msgstr "" "\n" "Параметры выбора объектов:\n" -#: pg_amcheck.c:1142 +#: pg_amcheck.c:1187 #, c-format msgid " -a, --all check all databases\n" msgstr " -a, --all проверить вÑе базы\n" -#: pg_amcheck.c:1143 +#: pg_amcheck.c:1188 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" msgstr "" " -d, --database=ШÐБЛОРпроверить ÑоответÑтвующие шаблону базы\n" -#: pg_amcheck.c:1144 +#: pg_amcheck.c:1189 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" msgstr "" " -D, --exclude-database=ШÐБЛОРне проверÑть ÑоответÑтвующие шаблону базы\n" -#: pg_amcheck.c:1145 +#: pg_amcheck.c:1190 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" msgstr "" " -i, --index=ШÐБЛОРпроверить ÑоответÑтвующие шаблону индекÑÑ‹\n" -#: pg_amcheck.c:1146 +#: pg_amcheck.c:1191 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" msgstr "" " -I, --exclude-index=ШÐБЛОРне проверÑть ÑоответÑтвующие шаблону " "индекÑÑ‹\n" -#: pg_amcheck.c:1147 +#: pg_amcheck.c:1192 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" msgstr "" " -r, --relation=ШÐБЛОРпроверить ÑоответÑтвующие шаблону " "отношениÑ\n" -#: pg_amcheck.c:1148 +#: pg_amcheck.c:1193 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" msgstr "" " -R, --exclude-relation=ШÐБЛОРне проверÑть ÑоответÑтвующие шаблону " "отношениÑ\n" -#: pg_amcheck.c:1149 +#: pg_amcheck.c:1194 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" msgstr "" " -s, --schema=ШÐБЛОРпроверить ÑоответÑтвующие шаблону Ñхемы\n" -#: pg_amcheck.c:1150 +#: pg_amcheck.c:1195 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" msgstr "" " -S, --exclude-schema=ШÐБЛОРне проверÑть ÑоответÑтвующие шаблону " "Ñхемы\n" -#: pg_amcheck.c:1151 +#: pg_amcheck.c:1196 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" msgstr "" " -t, --table=ШÐБЛОРпроверить ÑоответÑтвующие шаблону таблицы\n" -#: pg_amcheck.c:1152 +#: pg_amcheck.c:1197 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" msgstr "" " -T, --exclude-table=ШÐБЛОРне проверÑть ÑоответÑтвующие шаблону " "таблицы\n" -#: pg_amcheck.c:1153 +#: pg_amcheck.c:1198 #, c-format msgid "" " --no-dependent-indexes do NOT expand list of relations to include " @@ -339,7 +449,7 @@ msgstr "" " --no-dependent-indexes не включать в ÑпиÑок проверÑемых отношений " "индекÑÑ‹\n" -#: pg_amcheck.c:1154 +#: pg_amcheck.c:1199 #, c-format msgid "" " --no-dependent-toast do NOT expand list of relations to include " @@ -348,7 +458,7 @@ msgstr "" " --no-dependent-toast не включать в ÑпиÑок проверÑемых отношений " "TOAST-таблицы\n" -#: pg_amcheck.c:1155 +#: pg_amcheck.c:1200 #, c-format msgid "" " --no-strict-names do NOT require patterns to match objects\n" @@ -356,7 +466,7 @@ msgstr "" " --no-strict-names не требовать Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð², " "ÑоответÑтвующих шаблонам\n" -#: pg_amcheck.c:1156 +#: pg_amcheck.c:1201 #, c-format msgid "" "\n" @@ -365,14 +475,14 @@ msgstr "" "\n" "Параметры проверки таблиц:\n" -#: pg_amcheck.c:1157 +#: pg_amcheck.c:1202 #, c-format msgid "" " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" msgstr "" " --exclude-toast-pointers не переходить по указателÑм в TOAST\n" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1203 #, c-format msgid "" " --on-error-stop stop checking at end of first corrupt " @@ -381,7 +491,7 @@ msgstr "" " --on-error-stop прекратить проверку по доÑтижении конца " "первой повреждённой Ñтраницы\n" -#: pg_amcheck.c:1159 +#: pg_amcheck.c:1204 #, c-format msgid "" " --skip=OPTION do NOT check \"all-frozen\" or \"all-" @@ -390,7 +500,7 @@ msgstr "" " --skip=ТИП_БЛОКРне проверÑть блоки типа \"all-frozen\" или " "\"all-visible\"\n" -#: pg_amcheck.c:1160 +#: pg_amcheck.c:1205 #, c-format msgid "" " --startblock=BLOCK begin checking table(s) at the given block " @@ -400,7 +510,7 @@ msgstr "" "заданным номером\n" # skip-rule: no-space-before-parentheses -#: pg_amcheck.c:1161 +#: pg_amcheck.c:1206 #, c-format msgid "" " --endblock=BLOCK check table(s) only up to the given block " @@ -409,7 +519,7 @@ msgstr "" " --endblock=БЛОК проверить таблицы(у) до блока Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ " "номером\n" -#: pg_amcheck.c:1162 +#: pg_amcheck.c:1207 #, c-format msgid "" "\n" @@ -418,7 +528,16 @@ msgstr "" "\n" "Параметры проверки индекÑов-B-деревьев:\n" -#: pg_amcheck.c:1163 +#: pg_amcheck.c:1208 +#, c-format +msgid "" +" --checkunique check unique constraint if index is " +"unique\n" +msgstr "" +" --checkunique проверить ограничение уникальноÑти Ð´Ð»Ñ " +"уникальных индекÑов\n" + +#: pg_amcheck.c:1209 #, c-format msgid "" " --heapallindexed check that all heap tuples are found " @@ -427,7 +546,7 @@ msgstr "" " --heapallindexed проверить, что вÑем кортежам кучи " "находитÑÑ ÑоответÑтвие в индекÑах\n" -#: pg_amcheck.c:1164 +#: pg_amcheck.c:1210 #, c-format msgid "" " --parent-check check index parent/child relationships\n" @@ -435,7 +554,7 @@ msgstr "" " --parent-check проверить ÑвÑзи родитель/потомок в " "индекÑах\n" -#: pg_amcheck.c:1165 +#: pg_amcheck.c:1211 #, c-format msgid "" " --rootdescend search from root page to refind tuples\n" @@ -443,7 +562,7 @@ msgstr "" " --rootdescend перепроверÑть поиÑк кортежей от корневой " "Ñтраницы\n" -#: pg_amcheck.c:1166 +#: pg_amcheck.c:1212 #, c-format msgid "" "\n" @@ -452,42 +571,42 @@ msgstr "" "\n" "Параметры подключениÑ:\n" -#: pg_amcheck.c:1167 +#: pg_amcheck.c:1213 #, c-format msgid "" " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог " -"Ñокетов\n" +" -h, --host=ИМЯ компьютер Ñ Ñервером баз данных или " +"каталог Ñокетов\n" -#: pg_amcheck.c:1168 +#: pg_amcheck.c:1214 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт Ñервера баз данных\n" -#: pg_amcheck.c:1169 +#: pg_amcheck.c:1215 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr "" " -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº " "Ñерверу\n" -#: pg_amcheck.c:1170 +#: pg_amcheck.c:1216 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: pg_amcheck.c:1171 +#: pg_amcheck.c:1217 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password запроÑить пароль\n" -#: pg_amcheck.c:1172 +#: pg_amcheck.c:1218 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=ИМЯ_БД Ð´Ñ€ÑƒÐ³Ð°Ñ Ð¾Ð¿Ð¾Ñ€Ð½Ð°Ñ Ð±Ð°Ð·Ð° данных\n" -#: pg_amcheck.c:1173 +#: pg_amcheck.c:1219 #, c-format msgid "" "\n" @@ -496,7 +615,7 @@ msgstr "" "\n" "Другие параметры:\n" -#: pg_amcheck.c:1174 +#: pg_amcheck.c:1220 #, c-format msgid "" " -e, --echo show the commands being sent to the " @@ -504,7 +623,7 @@ msgid "" msgstr "" " -e, --echo отображать команды, отправлÑемые Ñерверу\n" -#: pg_amcheck.c:1175 +#: pg_amcheck.c:1221 #, c-format msgid "" " -j, --jobs=NUM use this many concurrent connections to " @@ -513,33 +632,33 @@ msgstr "" " -j, --jobs=ЧИСЛО уÑтанавливать заданное чиÑло подключений к " "Ñерверу\n" -#: pg_amcheck.c:1176 +#: pg_amcheck.c:1222 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress показывать прогреÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸\n" -#: pg_amcheck.c:1177 +#: pg_amcheck.c:1223 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose выводить иÑчерпывающие ÑообщениÑ\n" -#: pg_amcheck.c:1178 +#: pg_amcheck.c:1224 #, c-format msgid "" " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: pg_amcheck.c:1179 +#: pg_amcheck.c:1225 #, c-format msgid " --install-missing install missing extensions\n" msgstr " --install-missing уÑтановить недоÑтающие раÑширениÑ\n" -#: pg_amcheck.c:1180 +#: pg_amcheck.c:1226 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: pg_amcheck.c:1182 +#: pg_amcheck.c:1228 #, c-format msgid "" "\n" @@ -548,53 +667,53 @@ msgstr "" "\n" "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: pg_amcheck.c:1183 +#: pg_amcheck.c:1229 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" -#: pg_amcheck.c:1236 +#: pg_amcheck.c:1282 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" msgstr "отношений: %*s/%s (%d%%), Ñтраниц: %*s/%s (%d%%) %*s" -#: pg_amcheck.c:1247 +#: pg_amcheck.c:1293 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" msgstr "отношений: %*s/%s (%d%%), Ñтраниц: %*s/%s (%d%%) (%s%-*.*s)" -#: pg_amcheck.c:1262 +#: pg_amcheck.c:1308 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" msgstr "отношений: %*s/%s (%d%%), Ñтраниц: %*s/%s (%d%%)" -#: pg_amcheck.c:1321 pg_amcheck.c:1354 +#: pg_amcheck.c:1367 pg_amcheck.c:1400 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неверное полное Ð¸Ð¼Ñ (Ñлишком много компонентов): %s" -#: pg_amcheck.c:1399 +#: pg_amcheck.c:1445 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "неверное Ð¸Ð¼Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ (Ñлишком много компонентов): %s" -#: pg_amcheck.c:1552 pg_amcheck.c:1691 +#: pg_amcheck.c:1598 pg_amcheck.c:1737 #, c-format msgid "including database \"%s\"" msgstr "выбираетÑÑ Ð±Ð°Ð·Ð° \"%s\"" -#: pg_amcheck.c:1673 +#: pg_amcheck.c:1719 #, c-format msgid "internal error: received unexpected database pattern_id %d" msgstr "внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: получен неожиданный идентификатор шаблона базы %d" -#: pg_amcheck.c:1675 +#: pg_amcheck.c:1721 #, c-format msgid "no connectable databases to check matching \"%s\"" msgstr "" "не найдены подлежащие проверке доÑтупные базы, ÑоответÑтвующие шаблону \"%s\"" -#: pg_amcheck.c:2133 +#: pg_amcheck.c:2179 #, c-format msgid "internal error: received unexpected relation pattern_id %d" msgstr "" diff --git a/src/bin/pg_amcheck/po/sv.po b/src/bin/pg_amcheck/po/sv.po index 96aa844ed22bb..6db26dc737657 100644 --- a/src/bin/pg_amcheck/po/sv.po +++ b/src/bin/pg_amcheck/po/sv.po @@ -1,14 +1,14 @@ # SWEDISH message translation file for pg_amcheck # Copyright (C) 2021 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_amcheck (PostgreSQL) package. -# Dennis Björklund , 2021, 2022. +# Dennis Björklund , 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-09 18:50+0000\n" -"PO-Revision-Date: 2022-05-09 21:45+0200\n" +"POT-Creation-Date: 2024-08-27 15:52+0000\n" +"PO-Revision-Date: 2024-08-27 18:29+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -16,31 +16,98 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "varning: " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "detalj: " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "tips: " -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "slut pÃ¥ minne\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kan inte duplicera null-pekare (internt fel)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "kunde inte öppna fil \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "detta bygge stöder inte synkmetod \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "kunde inte öppna katalog \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "kunde inte läsa katalog \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "kunde inte fsync:a fil \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "kunde inte slÃ¥ upp effektivt användar-id %ld: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "användaren finns inte" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "misslyckad sökning efter användarnamn: felkod %lu" + +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "FörfrÃ¥gan om avbrytning skickad\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "Kunde inte skicka förfrÃ¥gan om avbrytning: " @@ -49,7 +116,7 @@ msgstr "Kunde inte skicka förfrÃ¥gan om avbrytning: " msgid "could not connect to database %s: out of memory" msgstr "kunde inte ansluta till databas %s: slut pÃ¥ minne" -#: ../../fe_utils/connect_utils.c:117 +#: ../../fe_utils/connect_utils.c:116 #, c-format msgid "%s" msgstr "%s" @@ -64,174 +131,214 @@ msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" msgid "%s must be in range %d..%d" msgstr "%s mÃ¥ste vara i intervallet %d..%d" +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "okänd synkmetod: %s" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "för mÃ¥nga jobb för denna plattform: %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "deskriptor-index utanför sitt intervall för select(): %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "Försök med färre job." + +#: ../../fe_utils/parallel_slot.c:553 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "processande av databas \"%s\" misslyckades: %s" + #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1645 pg_amcheck.c:2090 +#: pg_amcheck.c:1693 pg_amcheck.c:2138 #, c-format msgid "query failed: %s" msgstr "frÃ¥ga misslyckades: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:571 pg_amcheck.c:1100 pg_amcheck.c:1646 pg_amcheck.c:2091 +#: pg_amcheck.c:578 pg_amcheck.c:1147 pg_amcheck.c:1694 pg_amcheck.c:2139 #, c-format msgid "Query was: %s" msgstr "FrÃ¥gan var: %s" -#: pg_amcheck.c:399 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "shell-kommandots argument innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "databasnamnet innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: pg_amcheck.c:403 #, c-format msgid "invalid argument for option %s" msgstr "ogiltigt argument för flaggan %s" -#: pg_amcheck.c:405 +#: pg_amcheck.c:409 #, c-format msgid "invalid start block" msgstr "ogiltigt startblock" -#: pg_amcheck.c:407 +#: pg_amcheck.c:411 #, c-format msgid "start block out of bounds" msgstr "startblocket utanför giltig gräns" -#: pg_amcheck.c:414 +#: pg_amcheck.c:418 #, c-format msgid "invalid end block" msgstr "ogiltigt slutblock" -#: pg_amcheck.c:416 +#: pg_amcheck.c:420 #, c-format msgid "end block out of bounds" msgstr "slutblocket utanför giltig gräns" -#: pg_amcheck.c:439 pg_amcheck.c:461 +#: pg_amcheck.c:446 pg_amcheck.c:468 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: pg_amcheck.c:445 +#: pg_amcheck.c:452 #, c-format msgid "end block precedes start block" msgstr "slutblocket kommer före startblocket" -#: pg_amcheck.c:459 +#: pg_amcheck.c:466 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")" -#: pg_amcheck.c:479 +#: pg_amcheck.c:486 #, c-format msgid "cannot specify a database name with --all" msgstr "kan inte ange databasnamn tillsammans med --all" -#: pg_amcheck.c:485 +#: pg_amcheck.c:492 #, c-format msgid "cannot specify both a database name and database patterns" msgstr "kan inte ange bÃ¥de ett databasnamn och ett databasmönster" -#: pg_amcheck.c:513 +#: pg_amcheck.c:520 #, c-format msgid "no databases to check" msgstr "inga databaser att kontrollera" -#: pg_amcheck.c:569 +#: pg_amcheck.c:576 #, c-format msgid "database \"%s\": %s" msgstr "databas \"%s\": %s" -#: pg_amcheck.c:580 +#: pg_amcheck.c:587 #, c-format msgid "skipping database \"%s\": amcheck is not installed" msgstr "hoppar över databas \"%s\": amcheck är inte installerad" -#: pg_amcheck.c:588 +#: pg_amcheck.c:595 #, c-format msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" msgstr "i databas \"%s\": använder amcheck version \"%s\" i schema \"%s\"" -#: pg_amcheck.c:610 +#: pg_amcheck.c:624 +#, c-format +msgid "option %s is not supported by amcheck version %s" +msgstr "flaggan %s stöds inte av amcheck version %s" + +#: pg_amcheck.c:650 #, c-format msgid "no heap tables to check matching \"%s\"" msgstr "finns inga heap-tabeller för att kontrollera matchning \"%s\"" -#: pg_amcheck.c:613 +#: pg_amcheck.c:653 #, c-format msgid "no btree indexes to check matching \"%s\"" msgstr "finns inga btree-index för att kontrollera matching \"%s\"" -#: pg_amcheck.c:616 +#: pg_amcheck.c:656 #, c-format msgid "no relations to check in schemas matching \"%s\"" msgstr "finns inga relationer att kontrollera i schemamatchning \"%s\"" -#: pg_amcheck.c:619 +#: pg_amcheck.c:659 #, c-format msgid "no relations to check matching \"%s\"" msgstr "finns inga relations för att kontrollera matching \"%s\"" -#: pg_amcheck.c:647 +#: pg_amcheck.c:687 #, c-format msgid "no relations to check" msgstr "finns inga relationer att kontrollera" -#: pg_amcheck.c:730 +#: pg_amcheck.c:770 #, c-format msgid "checking heap table \"%s.%s.%s\"" msgstr "kontrollerar heap-tabell \"%s.%s.%s\"" -#: pg_amcheck.c:746 +#: pg_amcheck.c:786 #, c-format msgid "checking btree index \"%s.%s.%s\"" msgstr "kontrollerar btree-index \"%s.%s.%s\"" -#: pg_amcheck.c:893 +#: pg_amcheck.c:937 #, c-format msgid "error sending command to database \"%s\": %s" msgstr "fel vid skickande av kommando till databas \"%s\": %s" -#: pg_amcheck.c:896 +#: pg_amcheck.c:940 #, c-format msgid "Command was: %s" msgstr "Kommandot var: %s" -#: pg_amcheck.c:1013 +#: pg_amcheck.c:1060 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" msgstr "heap-tabell \"%s.%s.%s\", block %s, offset %s, attribut %s:\n" -#: pg_amcheck.c:1020 +#: pg_amcheck.c:1067 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" msgstr "heap-tabell \"%s.%s.%s\", block %s, offset %s:\n" -#: pg_amcheck.c:1026 +#: pg_amcheck.c:1073 #, c-format msgid "heap table \"%s.%s.%s\", block %s:\n" msgstr "heap-tabell \"%s.%s.%s\", block %s:\n" -#: pg_amcheck.c:1031 pg_amcheck.c:1042 +#: pg_amcheck.c:1078 pg_amcheck.c:1089 #, c-format msgid "heap table \"%s.%s.%s\":\n" msgstr "heap-tabell \"%s.%s.%s\":\n" -#: pg_amcheck.c:1046 pg_amcheck.c:1115 +#: pg_amcheck.c:1093 pg_amcheck.c:1162 #, c-format msgid "query was: %s\n" msgstr "frÃ¥gan var: %s\n" -#: pg_amcheck.c:1097 +#: pg_amcheck.c:1144 #, c-format msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" msgstr "btree-index \"%s.%s.%s\": kontrollfunktion för btree returnerade oväntat antal rader: %d" -#: pg_amcheck.c:1101 +#: pg_amcheck.c:1148 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "Är versionerna pÃ¥ %s och amcheck kompatibla?" -#: pg_amcheck.c:1111 +#: pg_amcheck.c:1158 #, c-format msgid "btree index \"%s.%s.%s\":\n" msgstr "btree-index \"%s.%s.%s\":\n" -#: pg_amcheck.c:1136 +#: pg_amcheck.c:1183 #, c-format msgid "" "%s checks objects in a PostgreSQL database for corruption.\n" @@ -240,17 +347,17 @@ msgstr "" "%s kontrollerar objekt i en PostgreSQL-database för att hitta korruption.\n" "\n" -#: pg_amcheck.c:1137 +#: pg_amcheck.c:1184 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_amcheck.c:1138 +#: pg_amcheck.c:1185 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [FLAGGA]... [DBNAMN]\n" -#: pg_amcheck.c:1139 +#: pg_amcheck.c:1186 #, c-format msgid "" "\n" @@ -259,77 +366,77 @@ msgstr "" "\n" "Flaggor för destinationen:\n" -#: pg_amcheck.c:1140 +#: pg_amcheck.c:1187 #, c-format msgid " -a, --all check all databases\n" msgstr " -a, --all kontrollera alla databaser\n" -#: pg_amcheck.c:1141 +#: pg_amcheck.c:1188 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" msgstr " -d, --database=MALL kontrollera matchande databas(er)\n" -#: pg_amcheck.c:1142 +#: pg_amcheck.c:1189 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" msgstr " -D, --exclude-database=MALL kontrollera INTE matchande databas(er)\n" -#: pg_amcheck.c:1143 +#: pg_amcheck.c:1190 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" msgstr " -i, --index=MALL kontrollera matchande index\n" -#: pg_amcheck.c:1144 +#: pg_amcheck.c:1191 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" msgstr " -I, --exclude-index=MALL kontrollera INTE matchande index\n" -#: pg_amcheck.c:1145 +#: pg_amcheck.c:1192 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" msgstr " -r, --relation=MALL kontrollera matchande relation(er)\n" -#: pg_amcheck.c:1146 +#: pg_amcheck.c:1193 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" msgstr " -R, --exclude-relation=MALL kontrollera INTE matchande relation(er)\n" -#: pg_amcheck.c:1147 +#: pg_amcheck.c:1194 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" msgstr " -s, --schema=MALL kontrollera matchande schema(n)\n" -#: pg_amcheck.c:1148 +#: pg_amcheck.c:1195 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" msgstr " -S, --exclude-schema=MALL kontrollera INTE matchande schema(n)\n" -#: pg_amcheck.c:1149 +#: pg_amcheck.c:1196 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" msgstr " -t, --table=MALL kontollera matchande tabell(er)\n" -#: pg_amcheck.c:1150 +#: pg_amcheck.c:1197 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" msgstr " -T, --exclude-table=MALL kontollera INTE matchande tabell(er)\n" -#: pg_amcheck.c:1151 +#: pg_amcheck.c:1198 #, c-format msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" msgstr " --no-dependent-indexes expandera INTE listan med relationer för att inkludera index\n" -#: pg_amcheck.c:1152 +#: pg_amcheck.c:1199 #, c-format msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" msgstr " --no-dependent-toast expandera inte listan av relationer för att inkludera TOAST-tabeller\n" -#: pg_amcheck.c:1153 +#: pg_amcheck.c:1200 #, c-format msgid " --no-strict-names do NOT require patterns to match objects\n" msgstr " --no-strict-names kräv INTE mallar för matcha objekt\n" -#: pg_amcheck.c:1154 +#: pg_amcheck.c:1201 #, c-format msgid "" "\n" @@ -338,32 +445,32 @@ msgstr "" "\n" "Flaggor för kontroll av tabeller:\n" -#: pg_amcheck.c:1155 +#: pg_amcheck.c:1202 #, c-format msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" msgstr " --exclude-toast-pointers följ INTE relationers TOAST-pekare\n" -#: pg_amcheck.c:1156 +#: pg_amcheck.c:1203 #, c-format msgid " --on-error-stop stop checking at end of first corrupt page\n" msgstr " --on-error-stop sluta kontrollera efter första korrupta sidan\n" -#: pg_amcheck.c:1157 +#: pg_amcheck.c:1204 #, c-format msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" msgstr " --skip=FLAGGA kontrollera INTE block som är \"all-frozen\" eller \"all-visible\"\n" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1205 #, c-format msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" msgstr " --startblock=BLOCK börja kontollera tabell(er) vid angivet blocknummer\n" -#: pg_amcheck.c:1159 +#: pg_amcheck.c:1206 #, c-format msgid " --endblock=BLOCK check table(s) only up to the given block number\n" msgstr " --endblock=BLOCK kontrollera tabell(er) fram till angivet blocknummer\n" -#: pg_amcheck.c:1160 +#: pg_amcheck.c:1207 #, c-format msgid "" "\n" @@ -372,22 +479,27 @@ msgstr "" "\n" "Flaggor för kontroll av B-tree-index:\n" -#: pg_amcheck.c:1161 +#: pg_amcheck.c:1208 +#, c-format +msgid " --checkunique check unique constraint if index is unique\n" +msgstr " --checkunique verifiera unik-villkor om indexet är unikt\n" + +#: pg_amcheck.c:1209 #, c-format msgid " --heapallindexed check that all heap tuples are found within indexes\n" msgstr " --heapallindexed kontrollera att alla heap-tupler hittas i index\n" -#: pg_amcheck.c:1162 +#: pg_amcheck.c:1210 #, c-format msgid " --parent-check check index parent/child relationships\n" msgstr " --parent-check kontrollera förhÃ¥llandet mellan barn/förälder i index\n" -#: pg_amcheck.c:1163 +#: pg_amcheck.c:1211 #, c-format msgid " --rootdescend search from root page to refind tuples\n" msgstr " --rootdescend sök frÃ¥n root-sidan för att Ã¥terfinna tupler\n" -#: pg_amcheck.c:1164 +#: pg_amcheck.c:1212 #, c-format msgid "" "\n" @@ -396,37 +508,37 @@ msgstr "" "\n" "Flaggor för anslutning:\n" -#: pg_amcheck.c:1165 +#: pg_amcheck.c:1213 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n" -#: pg_amcheck.c:1166 +#: pg_amcheck.c:1214 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT databasserverns port\n" -#: pg_amcheck.c:1167 +#: pg_amcheck.c:1215 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" -msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n" +msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n" -#: pg_amcheck.c:1168 +#: pg_amcheck.c:1216 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password frÃ¥ga ej efter lösenord\n" -#: pg_amcheck.c:1169 +#: pg_amcheck.c:1217 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password tvinga fram lösenordsfrÃ¥ga\n" -#: pg_amcheck.c:1170 +#: pg_amcheck.c:1218 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAMN val av underhÃ¥llsdatabas\n" -#: pg_amcheck.c:1171 +#: pg_amcheck.c:1219 #, c-format msgid "" "\n" @@ -435,42 +547,42 @@ msgstr "" "\n" "Andra flaggor:\n" -#: pg_amcheck.c:1172 +#: pg_amcheck.c:1220 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo visa kommandon som skickas till servern\n" -#: pg_amcheck.c:1173 +#: pg_amcheck.c:1221 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" msgstr " -j, --jobs=NUM antal samtidiga anslutningar till servern\n" -#: pg_amcheck.c:1174 +#: pg_amcheck.c:1222 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress visa förloppsinformation\n" -#: pg_amcheck.c:1175 +#: pg_amcheck.c:1223 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose skriv massor med utdata\n" -#: pg_amcheck.c:1176 +#: pg_amcheck.c:1224 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_amcheck.c:1177 +#: pg_amcheck.c:1225 #, c-format msgid " --install-missing install missing extensions\n" msgstr " --install-missing installera utökningar som saknas\n" -#: pg_amcheck.c:1178 +#: pg_amcheck.c:1226 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_amcheck.c:1180 +#: pg_amcheck.c:1228 #, c-format msgid "" "\n" @@ -479,68 +591,52 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_amcheck.c:1181 +#: pg_amcheck.c:1229 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_amcheck.c:1234 +#: pg_amcheck.c:1282 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" msgstr "%*s/%s relationer (%d%%), %*s/%s sidor (%d%%) %*s" -#: pg_amcheck.c:1245 +#: pg_amcheck.c:1293 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" msgstr "%*s/%s relationer (%d%%), %*s/%s sidor (%d%%) (%s%-*.*s)" -#: pg_amcheck.c:1260 +#: pg_amcheck.c:1308 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" msgstr "%*s/%s relationer (%d%%), %*s/%s sidor (%d%%)" -#: pg_amcheck.c:1319 pg_amcheck.c:1352 +#: pg_amcheck.c:1367 pg_amcheck.c:1400 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "ej korrekt kvalificerat namn (för mÃ¥nga namn med punkt): %s" -#: pg_amcheck.c:1397 +#: pg_amcheck.c:1445 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "ej korrekt relationsnamn (för mÃ¥nga namn med punkt): %s" -#: pg_amcheck.c:1550 pg_amcheck.c:1689 +#: pg_amcheck.c:1598 pg_amcheck.c:1737 #, c-format msgid "including database \"%s\"" msgstr "inkludera databas \"%s\"" -#: pg_amcheck.c:1671 +#: pg_amcheck.c:1719 #, c-format msgid "internal error: received unexpected database pattern_id %d" msgstr "internt fel: tog emot oväntat pattern_id %d för databas" -#: pg_amcheck.c:1673 +#: pg_amcheck.c:1721 #, c-format msgid "no connectable databases to check matching \"%s\"" msgstr "finns inga anslutningsbara databaser att kontrollera som matchar \"%s\"" -#: pg_amcheck.c:2131 +#: pg_amcheck.c:2179 #, c-format msgid "internal error: received unexpected relation pattern_id %d" msgstr "internt fel: tog emot oväntat pattern_id %d för relation" - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Försök med \"%s --help\" för mer information.\n" - -#, c-format -#~ msgid "command was: %s" -#~ msgstr "kommandot var: %s" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatalt: " - -#, c-format -#~ msgid "number of parallel jobs must be at least 1" -#~ msgstr "antalet parallella jobb mÃ¥ste vara minst 1" diff --git a/src/bin/pg_amcheck/po/uk.po b/src/bin/pg_amcheck/po/uk.po index 601e0434da1e5..7ce979b0ea83b 100644 --- a/src/bin/pg_amcheck/po/uk.po +++ b/src/bin/pg_amcheck/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:50+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:23+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pg_amcheck.pot\n" -"X-Crowdin-File-ID: 892\n" +"X-Crowdin-File: /REL_17_STABLE/pg_amcheck.pot\n" +"X-Crowdin-File-ID: 1036\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,11 +37,78 @@ msgstr "деталі: " msgid "hint: " msgstr "підказка: " -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "недоÑтатньо пам'Ñті\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не можливо відкрити файл \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не вдалоÑÑ Ñинхронізувати файлову ÑиÑтему Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує метод Ñинхронізації \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не вдалоÑÑ fsync файл \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "не можу знайти кориÑтувача з ефективним ID %ld: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "кориÑтувача не Ñ–Ñнує" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "невдала підÑтановка імені кориÑтувача: код помилки %lu" + +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Запит на ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ð¹\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "Ðе вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати запит на ÑкаÑуваннÑ: " @@ -50,7 +117,7 @@ msgstr "Ðе вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати запит на ÑкаÑуван msgid "could not connect to database %s: out of memory" msgstr "не можливо під'єднатиÑÑ Ð´Ð¾ бази даних %s: не виÑтачає пам'Ñті" -#: ../../fe_utils/connect_utils.c:117 +#: ../../fe_utils/connect_utils.c:116 #, c-format msgid "%s" msgstr "%s" @@ -65,451 +132,496 @@ msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ msgid "%s must be in range %d..%d" msgstr "%s має бути в діапазоні %d..%d" +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нерозпізнаний метод Ñинхронізації: %s" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "занадто багато завдань Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— платформи: %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "деÑкриптор файлу Ñокету поза діапазоном Ð´Ð»Ñ select(): %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "Спробуйте менше робочих завдань." + +#: ../../fe_utils/parallel_slot.c:553 +#, c-format +msgid "processing of database \"%s\" failed: %s" +msgstr "обробка бази даних \"%s\" не вдалаÑÑŒ: %s" + #: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 -#: pg_amcheck.c:1647 pg_amcheck.c:2092 +#: pg_amcheck.c:1693 pg_amcheck.c:2138 #, c-format msgid "query failed: %s" msgstr "запит не вдавÑÑ: %s" #: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 -#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093 +#: pg_amcheck.c:578 pg_amcheck.c:1147 pg_amcheck.c:1694 pg_amcheck.c:2139 #, c-format msgid "Query was: %s" msgstr "Запит був: %s" -#: pg_amcheck.c:399 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "аргумент командної оболонки міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "назва бази даних міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: pg_amcheck.c:403 #, c-format msgid "invalid argument for option %s" msgstr "неприпуÑтимий аргумент Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ %s" -#: pg_amcheck.c:405 +#: pg_amcheck.c:409 #, c-format msgid "invalid start block" msgstr "неприпуÑтимий початковий блок" -#: pg_amcheck.c:407 +#: pg_amcheck.c:411 #, c-format msgid "start block out of bounds" msgstr "початковий блок поза межами" -#: pg_amcheck.c:414 +#: pg_amcheck.c:418 #, c-format msgid "invalid end block" msgstr "неприпуÑтимий кінцевий блок" -#: pg_amcheck.c:416 +#: pg_amcheck.c:420 #, c-format msgid "end block out of bounds" msgstr "кінцевий блок поза межами" -#: pg_amcheck.c:439 pg_amcheck.c:461 +#: pg_amcheck.c:446 pg_amcheck.c:468 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." -#: pg_amcheck.c:445 +#: pg_amcheck.c:452 #, c-format msgid "end block precedes start block" msgstr "кінцевий блок передує початковому блоку" -#: pg_amcheck.c:459 +#: pg_amcheck.c:466 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")" -#: pg_amcheck.c:479 +#: pg_amcheck.c:486 #, c-format msgid "cannot specify a database name with --all" msgstr "не можна вказати назву бази даних з --all" -#: pg_amcheck.c:485 +#: pg_amcheck.c:492 #, c-format msgid "cannot specify both a database name and database patterns" msgstr "не можна вказати одночаÑно ім'Ñ Ð±Ð°Ð·Ð¸ даних Ñ– шаблони бази даних" -#: pg_amcheck.c:513 +#: pg_amcheck.c:520 #, c-format msgid "no databases to check" msgstr "немає баз даних Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸" -#: pg_amcheck.c:569 +#: pg_amcheck.c:576 #, c-format msgid "database \"%s\": %s" msgstr "база даних \"%s\": %s" -#: pg_amcheck.c:580 +#: pg_amcheck.c:587 #, c-format msgid "skipping database \"%s\": amcheck is not installed" msgstr "пропуÑк бази даних \"%s\": amcheck не вÑтановлено" -#: pg_amcheck.c:588 +#: pg_amcheck.c:595 #, c-format msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" msgstr "у базі даних \"%s\": викориÑтовуєтьÑÑ amcheck верÑÑ–Ñ— \"%s\" у Ñхемі \"%s\"" -#: pg_amcheck.c:610 +#: pg_amcheck.c:624 +#, c-format +msgid "option %s is not supported by amcheck version %s" +msgstr "параметр %s не підтримуєтьÑÑ Ñƒ верÑÑ–Ñ— amcheck %s" + +#: pg_amcheck.c:650 #, c-format msgid "no heap tables to check matching \"%s\"" msgstr "немає таблиць в динамічній пам'Ñті Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ відповідноÑті \"%s\"" -#: pg_amcheck.c:613 +#: pg_amcheck.c:653 #, c-format msgid "no btree indexes to check matching \"%s\"" msgstr "немає індекÑів btree Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ відповідноÑті \"%s\"" -#: pg_amcheck.c:616 +#: pg_amcheck.c:656 #, c-format msgid "no relations to check in schemas matching \"%s\"" msgstr "немає відношень Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ в Ñхемах, відповідних \"%s\"" -#: pg_amcheck.c:619 +#: pg_amcheck.c:659 #, c-format msgid "no relations to check matching \"%s\"" msgstr "немає відношень Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ відповідноÑті \"%s\"" -#: pg_amcheck.c:647 +#: pg_amcheck.c:687 #, c-format msgid "no relations to check" msgstr "немає зв'Ñзків Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸" -#: pg_amcheck.c:730 +#: pg_amcheck.c:770 #, c-format msgid "checking heap table \"%s.%s.%s\"" msgstr "перевірка таблиць динамічної пам'Ñті \"%s.%s.%s\"" -#: pg_amcheck.c:746 +#: pg_amcheck.c:786 #, c-format msgid "checking btree index \"%s.%s.%s\"" msgstr "перевірка індекÑу btree \"%s.%s.%s\"" -#: pg_amcheck.c:893 +#: pg_amcheck.c:937 #, c-format msgid "error sending command to database \"%s\": %s" msgstr "помилка надÑÐ¸Ð»Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ до бази даних \"%s: %s" -#: pg_amcheck.c:896 +#: pg_amcheck.c:940 #, c-format msgid "Command was: %s" msgstr "Команда була: %s" -#: pg_amcheck.c:1015 +#: pg_amcheck.c:1060 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— пам'Ñті \"%s.%s.%s\", блок %s, зÑув %s, атрибут %s:\n" -#: pg_amcheck.c:1022 +#: pg_amcheck.c:1067 #, c-format msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— пам'Ñті \"%s.%s.%s\", блок %s, зÑув %s:\n" -#: pg_amcheck.c:1028 +#: pg_amcheck.c:1073 #, c-format msgid "heap table \"%s.%s.%s\", block %s:\n" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— пам'Ñті \"%s.%s.%s\", блок %s:\n" -#: pg_amcheck.c:1033 pg_amcheck.c:1044 +#: pg_amcheck.c:1078 pg_amcheck.c:1089 #, c-format msgid "heap table \"%s.%s.%s\":\n" msgstr "Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð¸Ð½Ð°Ð¼Ñ–Ñ‡Ð½Ð¾Ñ— пам'Ñті \"%s.%s.%s\":\n" -#: pg_amcheck.c:1048 pg_amcheck.c:1117 +#: pg_amcheck.c:1093 pg_amcheck.c:1162 #, c-format msgid "query was: %s\n" msgstr "запит був: %s\n" -#: pg_amcheck.c:1099 +#: pg_amcheck.c:1144 #, c-format msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" msgstr "Ñ–Ð½Ð´ÐµÐºÑ btree \"%s.%s.%s\": Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ btree повернула неочікувану кількіÑть Ñ€Ñдків: %d" -#: pg_amcheck.c:1103 +#: pg_amcheck.c:1148 #, c-format msgid "Are %s's and amcheck's versions compatible?" msgstr "Чи ÑуміÑні верÑÑ–Ñ— %s Ñ– amcheck?" -#: pg_amcheck.c:1113 +#: pg_amcheck.c:1158 #, c-format msgid "btree index \"%s.%s.%s\":\n" msgstr "Ñ–Ð½Ð´ÐµÐºÑ btree \"%s.%s.%s\":\n" -#: pg_amcheck.c:1138 +#: pg_amcheck.c:1183 #, c-format msgid "%s checks objects in a PostgreSQL database for corruption.\n\n" msgstr "%s перевірÑÑ” об'єкти бази даних PostgreSQL на пошкодженнÑ.\n\n" -#: pg_amcheck.c:1139 +#: pg_amcheck.c:1184 #, c-format msgid "Usage:\n" msgstr "ВикориÑтаннÑ:\n" -#: pg_amcheck.c:1140 +#: pg_amcheck.c:1185 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: pg_amcheck.c:1141 +#: pg_amcheck.c:1186 #, c-format msgid "\n" "Target options:\n" msgstr "\n" "Цільові параметри:\n" -#: pg_amcheck.c:1142 +#: pg_amcheck.c:1187 #, c-format msgid " -a, --all check all databases\n" msgstr " -a, --all перевірити вÑÑ– бази даних\n" -#: pg_amcheck.c:1143 +#: pg_amcheck.c:1188 #, c-format msgid " -d, --database=PATTERN check matching database(s)\n" msgstr " -d, --database=PATTERN перевірити відповідні бази даних\n" -#: pg_amcheck.c:1144 +#: pg_amcheck.c:1189 #, c-format msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" msgstr " -D, --exclude-database=PATTERN ÐЕ перевірÑти відповідні бази даних\n" -#: pg_amcheck.c:1145 +#: pg_amcheck.c:1190 #, c-format msgid " -i, --index=PATTERN check matching index(es)\n" msgstr " -i, --index=PATTERN перевірити відповідні індекÑи\n" -#: pg_amcheck.c:1146 +#: pg_amcheck.c:1191 #, c-format msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" msgstr " -I, --exclude-index=PATTERN ÐЕ перевірÑти відповідні індекÑи\n" -#: pg_amcheck.c:1147 +#: pg_amcheck.c:1192 #, c-format msgid " -r, --relation=PATTERN check matching relation(s)\n" msgstr " -r, --relation=PATTERN перевірити відповідні відношеннÑ\n" -#: pg_amcheck.c:1148 +#: pg_amcheck.c:1193 #, c-format msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" msgstr " -R, --exclude-relation=PATTERN ÐЕ перевірÑти відповідні відношеннÑ\n" -#: pg_amcheck.c:1149 +#: pg_amcheck.c:1194 #, c-format msgid " -s, --schema=PATTERN check matching schema(s)\n" msgstr " -s, --schema=PATTERN перевірити відповідні Ñхеми\n" -#: pg_amcheck.c:1150 +#: pg_amcheck.c:1195 #, c-format msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" msgstr " -S, --exclude-schema=PATTERN ÐЕ перевірÑти відповідні Ñхеми\n" -#: pg_amcheck.c:1151 +#: pg_amcheck.c:1196 #, c-format msgid " -t, --table=PATTERN check matching table(s)\n" msgstr " -t, --table=PATTERN перевірити відповідні таблиці\n" -#: pg_amcheck.c:1152 +#: pg_amcheck.c:1197 #, c-format msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" msgstr " -T, --exclude-table=PATTERN ÐЕ перевірÑти відповідні таблиці\n" -#: pg_amcheck.c:1153 +#: pg_amcheck.c:1198 #, c-format msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" msgstr " --no-dependent-indexes ÐЕ розширювати ÑпиÑок відноÑин, щоб включити індекÑи\n" -#: pg_amcheck.c:1154 +#: pg_amcheck.c:1199 #, c-format msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" msgstr " --no-dependent-toast ÐЕ розширювати ÑпиÑок відноÑин, щоб включити таблиці TOAST\n" -#: pg_amcheck.c:1155 +#: pg_amcheck.c:1200 #, c-format msgid " --no-strict-names do NOT require patterns to match objects\n" msgstr " --no-strict-names ÐЕ вимагати відповідноÑті шаблонів об'єктам\n" -#: pg_amcheck.c:1156 +#: pg_amcheck.c:1201 #, c-format msgid "\n" "Table checking options:\n" msgstr "\n" "Параметри перевірки таблиць:\n" -#: pg_amcheck.c:1157 +#: pg_amcheck.c:1202 #, c-format msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" msgstr " --exclude-toast-pointers ÐЕ Ñлідувати покажчикам відношень TOAST\n" -#: pg_amcheck.c:1158 +#: pg_amcheck.c:1203 #, c-format msgid " --on-error-stop stop checking at end of first corrupt page\n" msgstr " --on-error-stop зупинити перевірку наприкінці першої пошкодженої Ñторінки\n" -#: pg_amcheck.c:1159 +#: pg_amcheck.c:1204 #, c-format msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" msgstr " --skip=OPTION ÐЕ перевірÑти \"вÑÑ– заморожені\" або \"вÑÑ– видимі\" блоки\n" -#: pg_amcheck.c:1160 +#: pg_amcheck.c:1205 #, c-format msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" msgstr " --startblock=BLOCK почати перевірку таблиць за поданим номером блоку\n" -#: pg_amcheck.c:1161 +#: pg_amcheck.c:1206 #, c-format msgid " --endblock=BLOCK check table(s) only up to the given block number\n" msgstr " --endblock=BLOCK перевірÑти таблиці лише до поданого номеру блоку\n" -#: pg_amcheck.c:1162 +#: pg_amcheck.c:1207 #, c-format msgid "\n" "B-tree index checking options:\n" msgstr "\n" "Параметри перевірки індекÑів B-tree:\n" -#: pg_amcheck.c:1163 +#: pg_amcheck.c:1208 +#, c-format +msgid " --checkunique check unique constraint if index is unique\n" +msgstr " --checkunique перевірÑємо Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ unique, Ñкщо Ñ–Ð½Ð´ÐµÐºÑ ÑƒÐ½Ñ–ÐºÐ°Ð»ÑŒÐ½Ð¸Ð¹\n" + +#: pg_amcheck.c:1209 #, c-format msgid " --heapallindexed check that all heap tuples are found within indexes\n" msgstr " --heapallindexed перевірити чи вÑÑ– кортежі динамічної пам'Ñті міÑÑ‚ÑтьÑÑ Ð² індекÑах\n" -#: pg_amcheck.c:1164 +#: pg_amcheck.c:1210 #, c-format msgid " --parent-check check index parent/child relationships\n" msgstr " --parent-check перевірити Ñ–Ð½Ð´ÐµÐºÑ Ð±Ð°Ñ‚ÑŒÐºÑ–Ð²Ñьких/дочірніх відноÑин\n" -#: pg_amcheck.c:1165 +#: pg_amcheck.c:1211 #, c-format msgid " --rootdescend search from root page to refind tuples\n" msgstr " --rootdescend шукати з кореневої Ñторінки, Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ пошуку кортежів\n" -#: pg_amcheck.c:1166 +#: pg_amcheck.c:1212 #, c-format msgid "\n" "Connection options:\n" msgstr "\n" "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·'єднаннÑ:\n" -#: pg_amcheck.c:1167 +#: pg_amcheck.c:1213 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME хоÑÑ‚ Ñервера бази даних або каталог Ñокетів\n" -#: pg_amcheck.c:1168 +#: pg_amcheck.c:1214 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT порт Ñерверу бази даних\n" -#: pg_amcheck.c:1169 +#: pg_amcheck.c:1215 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñервером\n" -#: pg_amcheck.c:1170 +#: pg_amcheck.c:1216 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ніколи не запитувати пароль\n" -#: pg_amcheck.c:1171 +#: pg_amcheck.c:1217 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password примуÑовий запит паролÑ\n" -#: pg_amcheck.c:1172 +#: pg_amcheck.c:1218 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME база даних альтернативного обÑлуговуваннÑ\n" -#: pg_amcheck.c:1173 +#: pg_amcheck.c:1219 #, c-format msgid "\n" "Other options:\n" msgstr "\n" "Інші параметри:\n" -#: pg_amcheck.c:1174 +#: pg_amcheck.c:1220 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo показати команди, надіÑлані Ñерверу\n" -#: pg_amcheck.c:1175 +#: pg_amcheck.c:1221 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" msgstr " -j, --jobs=NUM викориÑтати цю кількіÑть одночаÑних з'єднань з Ñервером\n" -#: pg_amcheck.c:1176 +#: pg_amcheck.c:1222 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress показати інформацію про прогреÑ\n" -#: pg_amcheck.c:1177 +#: pg_amcheck.c:1223 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose виводити багато інформації\n" -#: pg_amcheck.c:1178 +#: pg_amcheck.c:1224 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" -#: pg_amcheck.c:1179 +#: pg_amcheck.c:1225 #, c-format msgid " --install-missing install missing extensions\n" msgstr " --install-missing вÑтановити відÑутні розширеннÑ\n" -#: pg_amcheck.c:1180 +#: pg_amcheck.c:1226 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю Ñправку, потім вийти\n" -#: pg_amcheck.c:1182 +#: pg_amcheck.c:1228 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "ПовідомлÑти про помилки на <%s>.\n" -#: pg_amcheck.c:1183 +#: pg_amcheck.c:1229 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" -#: pg_amcheck.c:1236 +#: pg_amcheck.c:1282 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" msgstr "%*s/%s відношень (%d%%), %*s/%s Ñторінок (%d%%) %*s" -#: pg_amcheck.c:1247 +#: pg_amcheck.c:1293 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" msgstr "%*s/%s відношень (%d%%), %*s/%s Ñторінок (%d%%) (%s%-*.*s)" -#: pg_amcheck.c:1262 +#: pg_amcheck.c:1308 #, c-format msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" msgstr "%*s/%s відношень (%d%%), %*s/%s Ñторінок (%d%%)" -#: pg_amcheck.c:1321 pg_amcheck.c:1354 +#: pg_amcheck.c:1367 pg_amcheck.c:1400 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неправильне повне ім'Ñ (забагато компонентів): %s" -#: pg_amcheck.c:1399 +#: pg_amcheck.c:1445 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "неправильне ім'Ñ Ð·Ð²'Ñзку (забагато компонентів): %s" -#: pg_amcheck.c:1552 pg_amcheck.c:1691 +#: pg_amcheck.c:1598 pg_amcheck.c:1737 #, c-format msgid "including database \"%s\"" msgstr "включаючи базу даних \"%s\"" -#: pg_amcheck.c:1673 +#: pg_amcheck.c:1719 #, c-format msgid "internal error: received unexpected database pattern_id %d" msgstr "Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: отримано неочікувану помилку шаблону бази даних %d" -#: pg_amcheck.c:1675 +#: pg_amcheck.c:1721 #, c-format msgid "no connectable databases to check matching \"%s\"" msgstr "немає бази даних Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ, щоб перевірити відповідніÑть\"%s\"" -#: pg_amcheck.c:2133 +#: pg_amcheck.c:2179 #, c-format msgid "internal error: received unexpected relation pattern_id %d" msgstr "Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: отримано неочікувану помилку шаблону Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ %d" diff --git a/src/bin/pg_amcheck/po/zh_TW.po b/src/bin/pg_amcheck/po/zh_TW.po new file mode 100644 index 0000000000000..96a82beaa381d --- /dev/null +++ b/src/bin/pg_amcheck/po/zh_TW.po @@ -0,0 +1,538 @@ +# Traditional Chinese message translation file for pg_amcheck +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_amcheck (PostgreSQL) package. +# Zhenbang Wei , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_amcheck (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-11 20:51+0000\n" +"PO-Revision-Date: 2023-11-06 08:49+0800\n" +"Last-Translator: Zhenbang Wei \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.4.1\n" + +# libpq/be-secure.c:294 libpq/be-secure.c:387 +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "錯誤: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "警告: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "詳細內容: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "æç¤º: " + +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +msgid "Cancel request sent\n" +msgstr "已傳é€å–消請求\n" + +# fe-connect.c:1427 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +msgid "Could not send cancel request: " +msgstr "無法傳é€å–消請求: " + +#: ../../fe_utils/connect_utils.c:91 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "無法連線至資料庫 %s: 記憶體ä¸è¶³" + +# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770 +# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285 +#: ../../fe_utils/connect_utils.c:116 +#, c-format +msgid "%s" +msgstr "%s" + +# utils/adt/formatting.c:2044 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "值 \"%s\" å°æ–¼ \"%s\" 是無效的" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s å¿…é ˆåœ¨ç¯„åœ %d..%d å…§" + +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#: pg_amcheck.c:1647 pg_amcheck.c:2092 +#, c-format +msgid "query failed: %s" +msgstr "查詢失敗: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#: pg_amcheck.c:571 pg_amcheck.c:1102 pg_amcheck.c:1648 pg_amcheck.c:2093 +#, c-format +msgid "Query was: %s" +msgstr "查詢是: %s" + +#: pg_amcheck.c:399 +#, c-format +msgid "invalid argument for option %s" +msgstr "é¸é … %s çš„åƒæ•¸ç„¡æ•ˆ" + +#: pg_amcheck.c:405 +#, c-format +msgid "invalid start block" +msgstr "èµ·å§‹å€å¡Šç„¡æ•ˆ" + +#: pg_amcheck.c:407 +#, c-format +msgid "start block out of bounds" +msgstr "èµ·å§‹å€å¡Šè¶…出範åœ" + +#: pg_amcheck.c:414 +#, c-format +msgid "invalid end block" +msgstr "çµæŸå€å¡Šç„¡æ•ˆ" + +#: pg_amcheck.c:416 +#, c-format +msgid "end block out of bounds" +msgstr "çµæŸå€å¡Šè¶…出範åœ" + +# tcop/postgres.c:2636 tcop/postgres.c:2652 +#: pg_amcheck.c:439 pg_amcheck.c:461 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "用 \"%s --help\" å–得更多資訊。" + +#: pg_amcheck.c:445 +#, c-format +msgid "end block precedes start block" +msgstr "çµæŸå€å¡Šæ—©æ–¼èµ·å§‹å€å¡Š" + +#: pg_amcheck.c:459 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "å‘½ä»¤åˆ—åƒæ•¸éŽå¤š(第一個是 \"%s\")" + +#: pg_amcheck.c:479 +#, c-format +msgid "cannot specify a database name with --all" +msgstr "無法用 --all åƒæ•¸æŒ‡å®šè³‡æ–™åº«å稱" + +#: pg_amcheck.c:485 +#, c-format +msgid "cannot specify both a database name and database patterns" +msgstr "ç„¡æ³•åŒæ™‚使用資料庫å稱和資料庫å稱表é”å¼" + +#: pg_amcheck.c:513 +#, c-format +msgid "no databases to check" +msgstr "無需檢查任何資料庫" + +#: pg_amcheck.c:569 +#, c-format +msgid "database \"%s\": %s" +msgstr "資料庫 \"%s\": %s" + +#: pg_amcheck.c:580 +#, c-format +msgid "skipping database \"%s\": amcheck is not installed" +msgstr "è·³éŽè³‡æ–™åº« \"%s\": æœªå®‰è£ amcheck" + +#: pg_amcheck.c:588 +#, c-format +msgid "in database \"%s\": using amcheck version \"%s\" in schema \"%s\"" +msgstr "在資料庫 \"%s\": schema \"%s\" 使用 amcheck 版本 \"%s\"" + +#: pg_amcheck.c:610 +#, c-format +msgid "no heap tables to check matching \"%s\"" +msgstr "æ²’æœ‰ç¬¦åˆ \"%s\" çš„ heap è³‡æ–™è¡¨éœ€è¦æª¢æŸ¥" + +#: pg_amcheck.c:613 +#, c-format +msgid "no btree indexes to check matching \"%s\"" +msgstr "æ²’æœ‰ç¬¦åˆ \"%s\" çš„ btree ç´¢å¼•éœ€è¦æª¢æŸ¥" + +#: pg_amcheck.c:616 +#, c-format +msgid "no relations to check in schemas matching \"%s\"" +msgstr "ç¬¦åˆ \"%s\" çš„ schema 中沒有關è¯éœ€è¦æª¢æŸ¥" + +#: pg_amcheck.c:619 +#, c-format +msgid "no relations to check matching \"%s\"" +msgstr "æ²’æœ‰ç¬¦åˆ \"%s\" 的關è¯éœ€è¦æª¢æŸ¥" + +#: pg_amcheck.c:647 +#, c-format +msgid "no relations to check" +msgstr "沒有關è¯éœ€è¦æª¢æŸ¥" + +#: pg_amcheck.c:730 +#, c-format +msgid "checking heap table \"%s.%s.%s\"" +msgstr "檢查 heap 資料表 \"%s.%s.%s\"" + +#: pg_amcheck.c:746 +#, c-format +msgid "checking btree index \"%s.%s.%s\"" +msgstr "檢查 btree 索引 \"%s.%s.%s\"" + +#: pg_amcheck.c:893 +#, c-format +msgid "error sending command to database \"%s\": %s" +msgstr "傳é€å‘½ä»¤è‡³è³‡æ–™åº« \"%s\" 發生錯誤: %s" + +#: pg_amcheck.c:896 +#, c-format +msgid "Command was: %s" +msgstr "命令是: %s" + +#: pg_amcheck.c:1015 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s, attribute %s:\n" +msgstr "heap 資料表 \"%s.%s.%s\",å€å¡Š %s,ä½ç§» %s,屬性 %s:\n" + +#: pg_amcheck.c:1022 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s, offset %s:\n" +msgstr "heap 資料表 \"%s.%s.%s\",å€å¡Š %s,ä½ç§» %s:\n" + +#: pg_amcheck.c:1028 +#, c-format +msgid "heap table \"%s.%s.%s\", block %s:\n" +msgstr "heap 資料表 \"%s.%s.%s\",å€å¡Š %s:\n" + +#: pg_amcheck.c:1033 pg_amcheck.c:1044 +#, c-format +msgid "heap table \"%s.%s.%s\":\n" +msgstr "heap 資料表 \"%s.%s.%s\":\n" + +#: pg_amcheck.c:1048 pg_amcheck.c:1117 +#, c-format +msgid "query was: %s\n" +msgstr "查詢是: %s\n" + +#: pg_amcheck.c:1099 +#, c-format +msgid "btree index \"%s.%s.%s\": btree checking function returned unexpected number of rows: %d" +msgstr "btree 索引 \"%s.%s.%s\": btree 檢查函數回傳éžé æœŸæ•¸é‡çš„資料列: %d" + +#: pg_amcheck.c:1103 +#, c-format +msgid "Are %s's and amcheck's versions compatible?" +msgstr "%s å’Œ amcheck 的版本是å¦ç›¸å®¹?" + +#: pg_amcheck.c:1113 +#, c-format +msgid "btree index \"%s.%s.%s\":\n" +msgstr "btree 索引 \"%s.%s.%s\":\n" + +#: pg_amcheck.c:1138 +#, c-format +msgid "" +"%s checks objects in a PostgreSQL database for corruption.\n" +"\n" +msgstr "%s 檢查 PostgreSQL è³‡æ–™åº«ä¸­çš„ç‰©ä»¶æ˜¯å¦æå£žã€‚\n" + +#: pg_amcheck.c:1139 +#, c-format +msgid "Usage:\n" +msgstr "用法:\n" + +#: pg_amcheck.c:1140 +#, c-format +msgid " %s [OPTION]... [DBNAME]\n" +msgstr " %s [OPTION]... [DBNAME]\n" + +#: pg_amcheck.c:1141 +#, c-format +msgid "" +"\n" +"Target options:\n" +msgstr "" +"\n" +"目標é¸é …:\n" + +#: pg_amcheck.c:1142 +#, c-format +msgid " -a, --all check all databases\n" +msgstr " -a, --all 檢查所有資料庫\n" + +#: pg_amcheck.c:1143 +#, c-format +msgid " -d, --database=PATTERN check matching database(s)\n" +msgstr " -d, --database=PATTERN 檢查符åˆçš„資料庫\n" + +#: pg_amcheck.c:1144 +#, c-format +msgid " -D, --exclude-database=PATTERN do NOT check matching database(s)\n" +msgstr " -D, --exclude-database=PATTERN 䏿ª¢æŸ¥ç¬¦åˆçš„資料庫\n" + +#: pg_amcheck.c:1145 +#, c-format +msgid " -i, --index=PATTERN check matching index(es)\n" +msgstr " -i, --index=PATTERN 檢查符åˆçš„索引\n" + +#: pg_amcheck.c:1146 +#, c-format +msgid " -I, --exclude-index=PATTERN do NOT check matching index(es)\n" +msgstr " -I, --exclude-index=PATTERN 䏿ª¢æŸ¥ç¬¦åˆçš„索引\n" + +#: pg_amcheck.c:1147 +#, c-format +msgid " -r, --relation=PATTERN check matching relation(s)\n" +msgstr " -r, --relation=PATTERN 檢查符åˆçš„é—œè¯\n" + +#: pg_amcheck.c:1148 +#, c-format +msgid " -R, --exclude-relation=PATTERN do NOT check matching relation(s)\n" +msgstr " -R, --exclude-relation=PATTERN 䏿ª¢æŸ¥ç¬¦åˆçš„é—œè¯\n" + +#: pg_amcheck.c:1149 +#, c-format +msgid " -s, --schema=PATTERN check matching schema(s)\n" +msgstr " -s, --schema=PATTERN 檢查符åˆçš„ schema\n" + +#: pg_amcheck.c:1150 +#, c-format +msgid " -S, --exclude-schema=PATTERN do NOT check matching schema(s)\n" +msgstr " -S, --exclude-schema=PATTERN 䏿ª¢æŸ¥ç¬¦åˆçš„ schema\n" + +#: pg_amcheck.c:1151 +#, c-format +msgid " -t, --table=PATTERN check matching table(s)\n" +msgstr " -t, --table=PATTERN 檢查符åˆçš„資料表\n" + +#: pg_amcheck.c:1152 +#, c-format +msgid " -T, --exclude-table=PATTERN do NOT check matching table(s)\n" +msgstr " -T, --exclude-table=PATTERN 䏿ª¢æŸ¥ç¬¦åˆçš„資料表\n" + +#: pg_amcheck.c:1153 +#, c-format +msgid " --no-dependent-indexes do NOT expand list of relations to include indexes\n" +msgstr " --no-dependent-indexes ä¸å±•é–‹é—œè¯æ¸…單以包å«ç´¢å¼•\n" + +#: pg_amcheck.c:1154 +#, c-format +msgid " --no-dependent-toast do NOT expand list of relations to include TOAST tables\n" +msgstr " --no-dependent-toast ä¸å±•é–‹é—œè¯æ¸…å–®ä»¥åŒ…å« TOAST 資料表\n" + +#: pg_amcheck.c:1155 +#, c-format +msgid " --no-strict-names do NOT require patterns to match objects\n" +msgstr " --no-strict-names ä¸è¦æ±‚表é”å¼å¿…須符åˆç‰©ä»¶\n" + +#: pg_amcheck.c:1156 +#, c-format +msgid "" +"\n" +"Table checking options:\n" +msgstr "" +"\n" +"資料表檢查é¸é …:\n" + +#: pg_amcheck.c:1157 +#, c-format +msgid " --exclude-toast-pointers do NOT follow relation TOAST pointers\n" +msgstr " --exclude-toast-pointers ä¸è¦è¿½è¹¤é—œè¯ TOAST 指標\n" + +#: pg_amcheck.c:1158 +#, c-format +msgid " --on-error-stop stop checking at end of first corrupt page\n" +msgstr " --on-error-stop 在第一個æå£žè³‡æ–™é çš„çµå°¾åœæ­¢æª¢æŸ¥\n" + +#: pg_amcheck.c:1159 +#, c-format +msgid " --skip=OPTION do NOT check \"all-frozen\" or \"all-visible\" blocks\n" +msgstr " --skip=OPTION 䏿ª¢æŸ¥ \"all-frozen\" 或 \"all-visible\" å€å¡Š\n" + +#: pg_amcheck.c:1160 +#, c-format +msgid " --startblock=BLOCK begin checking table(s) at the given block number\n" +msgstr " --startblock=BLOCK 從指定的å€å¡Šç·¨è™Ÿé–‹å§‹æª¢æŸ¥è³‡æ–™è¡¨\n" + +#: pg_amcheck.c:1161 +#, c-format +msgid " --endblock=BLOCK check table(s) only up to the given block number\n" +msgstr " --endblock=BLOCK åªæª¢æŸ¥è³‡æ–™è¡¨ç›´åˆ°æŒ‡å®šçš„å€å¡Šç·¨è™Ÿç‚ºæ­¢\n" + +#: pg_amcheck.c:1162 +#, c-format +msgid "" +"\n" +"B-tree index checking options:\n" +msgstr "" +"\n" +"B-tree 索引檢查é¸é …:\n" + +#: pg_amcheck.c:1163 +#, c-format +msgid " --heapallindexed check that all heap tuples are found within indexes\n" +msgstr " --heapallindexed 檢查所有 heap tuple 是å¦éƒ½åœ¨ç´¢å¼•內找到\n" + +#: pg_amcheck.c:1164 +#, c-format +msgid " --parent-check check index parent/child relationships\n" +msgstr " --parent-check 檢查索引的父å­é—œä¿‚\n" + +#: pg_amcheck.c:1165 +#, c-format +msgid " --rootdescend search from root page to refind tuples\n" +msgstr " --rootdescend å¾žæ ¹è³‡æ–™é æœç´¢ä»¥é‡æ–°å°‹æ‰¾ tuple\n" + +#: pg_amcheck.c:1166 +#, c-format +msgid "" +"\n" +"Connection options:\n" +msgstr "" +"\n" +"連線é¸é …:\n" + +#: pg_amcheck.c:1167 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=HOSTNAME 資料庫伺æœå™¨ä¸»æ©Ÿæˆ– socket 目錄\n" + +#: pg_amcheck.c:1168 +#, c-format +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT 資料庫伺æœå™¨é€£æŽ¥åŸ \n" + +#: pg_amcheck.c:1169 +#, c-format +msgid " -U, --username=USERNAME user name to connect as\n" +msgstr " -U, --username=USERNAME 連線的使用者å稱\n" + +#: pg_amcheck.c:1170 +#, c-format +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, --no-password ä¸è©¢å•密碼\n" + +#: pg_amcheck.c:1171 +#, c-format +msgid " -W, --password force password prompt\n" +msgstr " -W, --password è¦æ±‚è©¢å•密碼\n" + +#: pg_amcheck.c:1172 +#, c-format +msgid " --maintenance-db=DBNAME alternate maintenance database\n" +msgstr " --maintenance-db=DBNAME 替代的維護資料庫\n" + +#: pg_amcheck.c:1173 +#, c-format +msgid "" +"\n" +"Other options:\n" +msgstr "" +"\n" +"å…¶ä»–é¸é …:\n" + +#: pg_amcheck.c:1174 +#, c-format +msgid " -e, --echo show the commands being sent to the server\n" +msgstr " -e, --echo 顯示被é€åˆ°ä¼ºæœå™¨çš„命令\n" + +#: pg_amcheck.c:1175 +#, c-format +msgid " -j, --jobs=NUM use this many concurrent connections to the server\n" +msgstr " -j, --jobs=NUM 用這麼多連線至伺æœå™¨\n" + +#: pg_amcheck.c:1176 +#, c-format +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress 顯示進度資訊\n" + +#: pg_amcheck.c:1177 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose 產生詳細輸出\n" + +#: pg_amcheck.c:1178 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version é¡¯ç¤ºç‰ˆæœ¬ï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_amcheck.c:1179 +#, c-format +msgid " --install-missing install missing extensions\n" +msgstr " --install-missing 安è£ç¼ºå°‘的擴充模組\n" + +#: pg_amcheck.c:1180 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help é¡¯ç¤ºèªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_amcheck.c:1182 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"回報錯誤至 <%s>。\n" + +#: pg_amcheck.c:1183 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 網站: <%s>\n" + +#: pg_amcheck.c:1236 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) %*s" +msgstr "%*s/%s é—œè¯ (%d%%),%*s/%s è³‡æ–™é  (%d%%) %*s" + +#: pg_amcheck.c:1247 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%) (%s%-*.*s)" +msgstr "%*s/%s é—œè¯ (%d%%),%*s/%s è³‡æ–™é  (%d%%) (%s%-*.*s)" + +#: pg_amcheck.c:1262 +#, c-format +msgid "%*s/%s relations (%d%%), %*s/%s pages (%d%%)" +msgstr "%*s/%s é—œè¯ (%d%%),%*s/%s è³‡æ–™é  (%d%%)" + +# catalog/namespace.c:1201 gram.y:2516 gram.y:7422 parser/parse_expr.c:1183 +# parser/parse_target.c:734 +#: pg_amcheck.c:1321 pg_amcheck.c:1354 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "完整åç¨±ä¸æ­£ç¢º(太多å«é»žå稱): %s" + +# catalog/namespace.c:1313 +#: pg_amcheck.c:1399 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "é—œè¯åç¨±ä¸æ­£ç¢º(太多å«é»žå稱): %s" + +#: pg_amcheck.c:1552 pg_amcheck.c:1691 +#, c-format +msgid "including database \"%s\"" +msgstr "包括資料庫 \"%s\"" + +#: pg_amcheck.c:1673 +#, c-format +msgid "internal error: received unexpected database pattern_id %d" +msgstr "內部錯誤: 收到éžé æœŸçš„資料庫 pattern_id %d" + +#: pg_amcheck.c:1675 +#, c-format +msgid "no connectable databases to check matching \"%s\"" +msgstr "æ²’æœ‰ç¬¦åˆ \"%s\" çš„å¯é€£ç·šè³‡æ–™åº«éœ€è¦æª¢æŸ¥" + +#: pg_amcheck.c:2133 +#, c-format +msgid "internal error: received unexpected relation pattern_id %d" +msgstr "內部錯誤: 收到éžé æœŸçš„é—œè¯ pattern_id %d" diff --git a/src/bin/pg_amcheck/t/001_basic.pl b/src/bin/pg_amcheck/t/001_basic.pl index 1f1e33278b81d..b7b5607728cef 100644 --- a/src/bin/pg_amcheck/t/001_basic.pl +++ b/src/bin/pg_amcheck/t/001_basic.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_amcheck/t/002_nonesuch.pl b/src/bin/pg_amcheck/t/002_nonesuch.pl index cf2438717e182..67d700ea07a90 100644 --- a/src/bin/pg_amcheck/t/002_nonesuch.pl +++ b/src/bin/pg_amcheck/t/002_nonesuch.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -291,6 +291,37 @@ 'many unmatched patterns and one matched pattern under --no-strict-names' ); + +######################################### +# Test that an invalid / partially dropped database won't be targeted + +$node->safe_psql( + 'postgres', q( + CREATE DATABASE regression_invalid; + UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid'; +)); + +$node->command_checks_all( + [ 'pg_amcheck', '-d', 'regression_invalid' ], + 1, + [qr/^$/], + [ + qr/pg_amcheck: error: no connectable databases to check matching "regression_invalid"/, + ], + 'checking handling of invalid database'); + +$node->command_checks_all( + [ + 'pg_amcheck', '-d', 'postgres', '-t', 'regression_invalid.public.foo', + ], + 1, + [qr/^$/], + [ + qr/pg_amcheck: error: no connectable databases to check matching "regression_invalid.public.foo"/, + ], + 'checking handling of object in invalid database'); + + ######################################### # Test checking otherwise existent objects but in databases where they do not exist diff --git a/src/bin/pg_amcheck/t/003_check.pl b/src/bin/pg_amcheck/t/003_check.pl index d577cffa30df3..d99b094dba807 100644 --- a/src/bin/pg_amcheck/t/003_check.pl +++ b/src/bin/pg_amcheck/t/003_check.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -257,6 +257,9 @@ () CREATE INDEX t1_spgist ON $schema.t1 USING SPGIST (ir); CREATE INDEX t2_spgist ON $schema.t2 USING SPGIST (ir); + + CREATE UNIQUE INDEX t1_btree_unique ON $schema.t1 USING BTREE (i); + CREATE UNIQUE INDEX t2_btree_unique ON $schema.t2 USING BTREE (i); )); } } @@ -517,4 +520,51 @@ () 0, [$no_output_re], [$no_output_re], 'pg_amcheck excluding all corrupt schemas'); +$node->command_checks_all( + [ + @cmd, '-s', 's1', '-i', 't1_btree', '--parent-check', + '--checkunique', 'db1' + ], + 2, + [$index_missing_relation_fork_re], + [$no_output_re], + 'pg_amcheck smoke test --parent-check --checkunique'); + +$node->command_checks_all( + [ + @cmd, '-s', 's1', '-i', 't1_btree', '--heapallindexed', + '--rootdescend', '--checkunique', 'db1' + ], + 2, + [$index_missing_relation_fork_re], + [$no_output_re], + 'pg_amcheck smoke test --heapallindexed --rootdescend --checkunique'); + +$node->command_checks_all( + [ + @cmd, '--checkunique', '-d', 'db1', '-d', 'db2', + '-d', 'db3', '-S', 's*' + ], + 0, + [$no_output_re], + [$no_output_re], + 'pg_amcheck excluding all corrupt schemas with --checkunique option'); + +# +# Smoke test for checkunique option for not supported versions. +# +$node->safe_psql( + 'db3', q( + DROP EXTENSION amcheck; + CREATE EXTENSION amcheck WITH SCHEMA amcheck_schema VERSION '1.3' ; +)); + +$node->command_checks_all( + [ @cmd, '--checkunique', 'db3' ], + 0, + [$no_output_re], + [ + qr/pg_amcheck: warning: option --checkunique is not supported by amcheck version 1.3/ + ], + 'pg_amcheck smoke test --checkunique'); done_testing(); diff --git a/src/bin/pg_amcheck/t/004_verify_heapam.pl b/src/bin/pg_amcheck/t/004_verify_heapam.pl index 1b5027c4204b6..f6d2c5f7877d5 100644 --- a/src/bin/pg_amcheck/t/004_verify_heapam.pl +++ b/src/bin/pg_amcheck/t/004_verify_heapam.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -367,10 +367,11 @@ sub write_tuple { close($file); # ignore errors on close; we're exiting anyway $node->clean_node; - plan skip_all => - sprintf( + plan skip_all => sprintf( "Page layout of index %d differs from our expectations: expected (%x, %x, \"%s\"), got (%x, %x, \"%s\")", - $tupidx, 0xDEADF9F9, 0xDEADF9F9, "abcdefg", $a_1, $a_2, $b); + $tupidx, 0xDEADF9F9, 0xDEADF9F9, "abcdefg", $a_1, $a_2, + # escape non-word characters to avoid confusing the terminal + $b =~ s{(\W)}{ sprintf '\x%02x', ord($1) }aegr); exit; } diff --git a/src/bin/pg_amcheck/t/005_opclass_damage.pl b/src/bin/pg_amcheck/t/005_opclass_damage.pl index fd476179f494f..1eea215227208 100644 --- a/src/bin/pg_amcheck/t/005_opclass_damage.pl +++ b/src/bin/pg_amcheck/t/005_opclass_damage.pl @@ -1,11 +1,11 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # This regression test checks the behavior of the btree validation in the # presence of breaking sort order changes. # use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -22,14 +22,33 @@ CREATE FUNCTION int4_asc_cmp (a int4, b int4) RETURNS int LANGUAGE sql AS $$ SELECT CASE WHEN $1 = $2 THEN 0 WHEN $1 > $2 THEN 1 ELSE -1 END; $$; + CREATE FUNCTION ok_cmp (int4, int4) + RETURNS int LANGUAGE sql AS + $$ + SELECT + CASE WHEN $1 < $2 THEN -1 + WHEN $1 > $2 THEN 1 + ELSE 0 + END; + $$; + CREATE OPERATOR CLASS int4_fickle_ops FOR TYPE int4 USING btree AS OPERATOR 1 < (int4, int4), OPERATOR 2 <= (int4, int4), OPERATOR 3 = (int4, int4), OPERATOR 4 >= (int4, int4), OPERATOR 5 > (int4, int4), FUNCTION 1 int4_asc_cmp(int4, int4); + CREATE OPERATOR CLASS int4_unique_ops FOR TYPE int4 USING btree AS + OPERATOR 1 < (int4, int4), OPERATOR 2 <= (int4, int4), + OPERATOR 3 = (int4, int4), OPERATOR 4 >= (int4, int4), + OPERATOR 5 > (int4, int4), FUNCTION 1 ok_cmp(int4, int4); + CREATE TABLE int4tbl (i int4); INSERT INTO int4tbl (SELECT * FROM generate_series(1,1000) gs); CREATE INDEX fickleidx ON int4tbl USING btree (i int4_fickle_ops); + CREATE UNIQUE INDEX bttest_unique_idx + ON int4tbl + USING btree (i int4_unique_ops) + WITH (deduplicate_items = off); )); # We have not yet broken the index, so we should get no corruption @@ -57,4 +76,50 @@ 'pg_amcheck all schemas, tables and indexes reports fickleidx corruption' ); +# +# Check unique constraints +# + +# Repair broken opclass for check unique tests. +$node->safe_psql( + 'postgres', q( + UPDATE pg_catalog.pg_amproc + SET amproc = 'int4_asc_cmp'::regproc + WHERE amproc = 'int4_desc_cmp'::regproc +)); + +# We should get no corruptions +$node->command_like( + [ 'pg_amcheck', '--checkunique', '-p', $node->port, 'postgres' ], + qr/^$/, + 'pg_amcheck all schemas, tables and indexes reports no corruption'); + +# Break opclass for check unique tests. +$node->safe_psql( + 'postgres', q( + CREATE FUNCTION bad_cmp (int4, int4) + RETURNS int LANGUAGE sql AS + $$ + SELECT + CASE WHEN ($1 = 768 AND $2 = 769) OR + ($1 = 769 AND $2 = 768) THEN 0 + WHEN $1 < $2 THEN -1 + WHEN $1 > $2 THEN 1 + ELSE 0 + END; + $$; + + UPDATE pg_catalog.pg_amproc + SET amproc = 'bad_cmp'::regproc + WHERE amproc = 'ok_cmp'::regproc +)); + +# Unique index corruption should now be reported +$node->command_checks_all( + [ 'pg_amcheck', '--checkunique', '-p', $node->port, 'postgres' ], + 2, + [qr/index uniqueness is violated for index "bttest_unique_idx"/], + [], + 'pg_amcheck all schemas, tables and indexes reports bttest_unique_idx corruption' +); done_testing(); diff --git a/src/bin/pg_archivecleanup/Makefile b/src/bin/pg_archivecleanup/Makefile index 49935d6dce3b7..93fd703f22591 100644 --- a/src/bin/pg_archivecleanup/Makefile +++ b/src/bin/pg_archivecleanup/Makefile @@ -25,7 +25,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_archivecleanup$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_archivecleanup$(X) $(OBJS) rm -rf tmp_check diff --git a/src/bin/pg_archivecleanup/meson.build b/src/bin/pg_archivecleanup/meson.build index 28349db58bfea..f5ae47eaf464f 100644 --- a/src/bin/pg_archivecleanup/meson.build +++ b/src/bin/pg_archivecleanup/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_archivecleanup_sources = files( 'pg_archivecleanup.c', diff --git a/src/bin/pg_archivecleanup/nls.mk b/src/bin/pg_archivecleanup/nls.mk index 801cf1c51e842..c23cdf6096916 100644 --- a/src/bin/pg_archivecleanup/nls.mk +++ b/src/bin/pg_archivecleanup/nls.mk @@ -1,5 +1,5 @@ # src/bin/pg_archivecleanup/nls.mk CATALOG_NAME = pg_archivecleanup -GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_archivecleanup.c +GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_archivecleanup.c ../../common/fe_memutils.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/pg_archivecleanup/pg_archivecleanup.c b/src/bin/pg_archivecleanup/pg_archivecleanup.c index 7726d051499b7..07bf356b70cb4 100644 --- a/src/bin/pg_archivecleanup/pg_archivecleanup.c +++ b/src/bin/pg_archivecleanup/pg_archivecleanup.c @@ -17,12 +17,14 @@ #include "access/xlog_internal.h" #include "common/logging.h" -#include "pg_getopt.h" +#include "getopt_long.h" const char *progname; /* Options and defaults */ bool dryrun = false; /* are we performing a dry-run operation? */ +bool cleanBackupHistory = false; /* remove files including backup + * history files */ char *additional_ext = NULL; /* Extension to remove from filenames */ char *archiveLocation; /* where to find the archive? */ @@ -93,75 +95,81 @@ CleanupPriorWALFiles(void) struct dirent *xlde; char walfile[MAXPGPATH]; - if ((xldir = opendir(archiveLocation)) != NULL) + xldir = opendir(archiveLocation); + if (xldir == NULL) + pg_fatal("could not open archive location \"%s\": %m", + archiveLocation); + + while (errno = 0, (xlde = readdir(xldir)) != NULL) { - while (errno = 0, (xlde = readdir(xldir)) != NULL) + char WALFilePath[MAXPGPATH * 2]; /* the file path including + * archive */ + + /* + * Truncation is essentially harmless, because we skip files whose + * format is different from WAL files and backup history files. (In + * principle, one could use a 1000-character additional_ext and get + * trouble.) + */ + strlcpy(walfile, xlde->d_name, MAXPGPATH); + TrimExtension(walfile, additional_ext); + + /* + * Ignore anything does that not look like a WAL segment, a .partial + * WAL segment or a backup history file (if requested). + */ + if (!IsXLogFileName(walfile) && !IsPartialXLogFileName(walfile) && + !(cleanBackupHistory && IsBackupHistoryFileName(walfile))) + continue; + + /* + * We ignore the timeline part of the XLOG segment identifiers in + * deciding whether a segment is still needed. This ensures that we + * won't prematurely remove a segment from a parent timeline. We could + * probably be a little more proactive about removing segments of + * non-parent timelines, but that would be a whole lot more + * complicated. + * + * We use the alphanumeric sorting property of the filenames to decide + * which ones are earlier than the exclusiveCleanupFileName file. Note + * that this means files are not removed in the order they were + * originally written, in case this worries you. + */ + if (strcmp(walfile + 8, exclusiveCleanupFileName + 8) >= 0) + continue; + + /* + * Use the original file name again now, including any extension that + * might have been chopped off before testing the sequence. + */ + snprintf(WALFilePath, sizeof(WALFilePath), "%s/%s", + archiveLocation, xlde->d_name); + + if (dryrun) { /* - * Truncation is essentially harmless, because we skip names of - * length other than XLOG_FNAME_LEN. (In principle, one could use - * a 1000-character additional_ext and get trouble.) + * Prints the name of the file to be removed and skips the actual + * removal. The regular printout is so that the user can pipe the + * output into some other program. */ - strlcpy(walfile, xlde->d_name, MAXPGPATH); - TrimExtension(walfile, additional_ext); - - /* - * We ignore the timeline part of the XLOG segment identifiers in - * deciding whether a segment is still needed. This ensures that - * we won't prematurely remove a segment from a parent timeline. - * We could probably be a little more proactive about removing - * segments of non-parent timelines, but that would be a whole lot - * more complicated. - * - * We use the alphanumeric sorting property of the filenames to - * decide which ones are earlier than the exclusiveCleanupFileName - * file. Note that this means files are not removed in the order - * they were originally written, in case this worries you. - */ - if ((IsXLogFileName(walfile) || IsPartialXLogFileName(walfile)) && - strcmp(walfile + 8, exclusiveCleanupFileName + 8) < 0) - { - char WALFilePath[MAXPGPATH * 2]; /* the file path - * including archive */ - - /* - * Use the original file name again now, including any - * extension that might have been chopped off before testing - * the sequence. - */ - snprintf(WALFilePath, sizeof(WALFilePath), "%s/%s", - archiveLocation, xlde->d_name); - - if (dryrun) - { - /* - * Prints the name of the file to be removed and skips the - * actual removal. The regular printout is so that the - * user can pipe the output into some other program. - */ - printf("%s\n", WALFilePath); - pg_log_debug("file \"%s\" would be removed", WALFilePath); - continue; - } - - pg_log_debug("removing file \"%s\"", WALFilePath); - - rc = unlink(WALFilePath); - if (rc != 0) - pg_fatal("could not remove file \"%s\": %m", - WALFilePath); - } + printf("%s\n", WALFilePath); + pg_log_debug("file \"%s\" would be removed", WALFilePath); + continue; } - if (errno) - pg_fatal("could not read archive location \"%s\": %m", - archiveLocation); - if (closedir(xldir)) - pg_fatal("could not close archive location \"%s\": %m", - archiveLocation); + pg_log_debug("removing file \"%s\"", WALFilePath); + + rc = unlink(WALFilePath); + if (rc != 0) + pg_fatal("could not remove file \"%s\": %m", + WALFilePath); } - else - pg_fatal("could not open archive location \"%s\": %m", + + if (errno) + pg_fatal("could not read archive location \"%s\": %m", + archiveLocation); + if (closedir(xldir)) + pg_fatal("could not close archive location \"%s\": %m", archiveLocation); } @@ -252,11 +260,14 @@ usage(void) printf(_("Usage:\n")); printf(_(" %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n"), progname); printf(_("\nOptions:\n")); - printf(_(" -d generate debug output (verbose mode)\n")); - printf(_(" -n dry run, show the names of the files that would be removed\n")); - printf(_(" -V, --version output version information, then exit\n")); - printf(_(" -x EXT clean up files if they have this extension\n")); - printf(_(" -?, --help show this help, then exit\n")); + printf(_(" -b, --clean-backup-history clean up files including backup history files\n")); + printf(_(" -d, --debug generate debug output (verbose mode)\n")); + printf(_(" -n, --dry-run dry run, show the names of the files that would be\n" + " removed\n")); + printf(_(" -V, --version output version information, then exit\n")); + printf(_(" -x, --strip-extension=EXT strip this extension before identifying files for\n" + " clean up\n")); + printf(_(" -?, --help show this help, then exit\n")); printf(_("\n" "For use as archive_cleanup_command in postgresql.conf:\n" " archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n" @@ -274,6 +285,13 @@ usage(void) int main(int argc, char **argv) { + static struct option long_options[] = { + {"clean-backup-history", no_argument, NULL, 'b'}, + {"debug", no_argument, NULL, 'd'}, + {"dry-run", no_argument, NULL, 'n'}, + {"strip-extension", required_argument, NULL, 'x'}, + {NULL, 0, NULL, 0} + }; int c; pg_logging_init(argv[0]); @@ -294,10 +312,13 @@ main(int argc, char **argv) } } - while ((c = getopt(argc, argv, "dnx:")) != -1) + while ((c = getopt_long(argc, argv, "bdnx:", long_options, NULL)) != -1) { switch (c) { + case 'b': /* Remove backup history files as well */ + cleanBackupHistory = true; + break; case 'd': /* Debug mode */ pg_logging_increase_verbosity(); break; diff --git a/src/bin/pg_archivecleanup/po/de.po b/src/bin/pg_archivecleanup/po/de.po index 64ff8d9baf897..ff82851e552cd 100644 --- a/src/bin/pg_archivecleanup/po/de.po +++ b/src/bin/pg_archivecleanup/po/de.po @@ -1,14 +1,14 @@ # pg_archivecleanup message translation file for pg_archivecleanup -# Copyright (C) 2019-2022 PostgreSQL Global Development Group +# Copyright (C) 2019-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Peter Eisentraut , 2019 - 2022. +# Peter Eisentraut , 2019 - 2024. # msgid "" msgstr "" -"Project-Id-Version: pg_archivecleanup (PostgreSQL) 15\n" +"Project-Id-Version: pg_archivecleanup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-11 15:50+0000\n" -"PO-Revision-Date: 2022-05-11 22:07+0200\n" +"POT-Creation-Date: 2024-06-16 07:53+0000\n" +"PO-Revision-Date: 2024-04-04 11:48+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,63 +16,74 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "Warnung: " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "Detail: " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "Tipp: " -#: pg_archivecleanup.c:66 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "Speicher aufgebraucht\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" + +#: pg_archivecleanup.c:68 #, c-format msgid "archive location \"%s\" does not exist" msgstr "Archivverzeichnis »%s« existiert nicht" -#: pg_archivecleanup.c:151 +#: pg_archivecleanup.c:100 +#, c-format +msgid "could not open archive location \"%s\": %m" +msgstr "konnte Archivverzeichnis »%s« nicht öffnen: %m" + +#: pg_archivecleanup.c:164 #, c-format msgid "could not remove file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" -#: pg_archivecleanup.c:157 +#: pg_archivecleanup.c:169 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "konnte Archivverzeichnis »%s« nicht lesen: %m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:172 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "konnte Archivverzeichnis »%s« nicht schließen: %m" -#: pg_archivecleanup.c:164 -#, c-format -msgid "could not open archive location \"%s\": %m" -msgstr "konnte Archivverzeichnis »%s« nicht öffnen: %m" - -#: pg_archivecleanup.c:237 +#: pg_archivecleanup.c:245 #, c-format msgid "invalid file name argument" msgstr "ungültiges Dateinamenargument" -#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333 -#: pg_archivecleanup.c:345 pg_archivecleanup.c:352 +#: pg_archivecleanup.c:246 pg_archivecleanup.c:334 pg_archivecleanup.c:354 +#: pg_archivecleanup.c:366 pg_archivecleanup.c:373 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_archivecleanup.c:251 +#: pg_archivecleanup.c:259 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -81,17 +92,17 @@ msgstr "" "%s entfernt alte WAL-Dateien aus PostgreSQL-Archiven.\n" "\n" -#: pg_archivecleanup.c:252 +#: pg_archivecleanup.c:260 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_archivecleanup.c:253 +#: pg_archivecleanup.c:261 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr " %s [OPTION]... ARCHIVVERZEICHNIS ÄLTESTE-ZU-BEHALTENE-WALDATEI\n" -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:262 #, c-format msgid "" "\n" @@ -100,32 +111,43 @@ msgstr "" "\n" "Optionen:\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:263 #, c-format -msgid " -d generate debug output (verbose mode)\n" -msgstr " -d Debug-Ausgaben erzeugen (Verbose-Modus)\n" +msgid " -b, --clean-backup-history clean up files including backup history files\n" +msgstr " -b, --clean-backup-history Dateien einschließlich Backup-History-Dateien aufräumen\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:264 #, c-format -msgid " -n dry run, show the names of the files that would be removed\n" -msgstr " -n Probelauf, Namen der Dateien anzeigen, die entfernt würden\n" +msgid " -d, --debug generate debug output (verbose mode)\n" +msgstr " -d, --debug Debug-Ausgaben erzeugen (Verbose-Modus)\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:265 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" +msgid "" +" -n, --dry-run dry run, show the names of the files that would be\n" +" removed\n" +msgstr " -n, --dry-run Probelauf, Namen der Dateien anzeigen, die entfernt würden\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:267 #, c-format -msgid " -x EXT clean up files if they have this extension\n" -msgstr " -x ERW Dateien mit dieser Erweiterung aufräumen\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:268 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" +msgid "" +" -x, --strip-extension=EXT strip this extension before identifying files for\n" +" clean up\n" +msgstr "" +" -x, --strip-extension=ERW diese Erweiterung entfernen, bevor aufzuräumende\n" +" Dateien bestimmt werden\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:270 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" + +#: pg_archivecleanup.c:271 #, c-format msgid "" "\n" @@ -140,7 +162,7 @@ msgstr "" "z.B.\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiv %%r'\n" -#: pg_archivecleanup.c:265 +#: pg_archivecleanup.c:276 #, c-format msgid "" "\n" @@ -153,7 +175,7 @@ msgstr "" "z.B.\n" " pg_archivecleanup /mnt/server/archiv 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:269 +#: pg_archivecleanup.c:280 #, c-format msgid "" "\n" @@ -162,22 +184,22 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_archivecleanup.c:270 +#: pg_archivecleanup.c:281 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_archivecleanup.c:332 +#: pg_archivecleanup.c:353 #, c-format msgid "must specify archive location" msgstr "Archivverzeichnis muss angegeben werden" -#: pg_archivecleanup.c:344 +#: pg_archivecleanup.c:365 #, c-format msgid "must specify oldest kept WAL file" msgstr "älteste zu behaltene WAL-Datei muss angegeben werden" -#: pg_archivecleanup.c:351 +#: pg_archivecleanup.c:372 #, c-format msgid "too many command-line arguments" msgstr "zu viele Kommandozeilenargumente" diff --git a/src/bin/pg_archivecleanup/po/es.po b/src/bin/pg_archivecleanup/po/es.po index 902f4a849d7a1..bac039fa0539b 100644 --- a/src/bin/pg_archivecleanup/po/es.po +++ b/src/bin/pg_archivecleanup/po/es.po @@ -6,10 +6,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_archivecleanup (PostgreSQL) 16\n" +"Project-Id-Version: pg_archivecleanup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:21+0000\n" -"PO-Revision-Date: 2023-05-22 12:05+0200\n" +"POT-Creation-Date: 2025-02-16 19:52+0000\n" +"PO-Revision-Date: 2024-11-16 14:23+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -38,43 +38,54 @@ msgstr "detalle: " msgid "hint: " msgstr "consejo: " -#: pg_archivecleanup.c:66 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "memoria agotada\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "no se puede duplicar un puntero nulo (error interno)\n" + +#: pg_archivecleanup.c:68 #, c-format msgid "archive location \"%s\" does not exist" msgstr "ubicación de archivador «%s» no existe" -#: pg_archivecleanup.c:151 +#: pg_archivecleanup.c:100 +#, c-format +msgid "could not open archive location \"%s\": %m" +msgstr "no se pudo abrir la ubicación del archivador «%s»: %m" + +#: pg_archivecleanup.c:164 #, c-format msgid "could not remove file \"%s\": %m" msgstr "no se pudo eliminar el archivo «%s»: %m" -#: pg_archivecleanup.c:157 +#: pg_archivecleanup.c:169 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "no se pudo leer la ubicación del archivador «%s»: %m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:172 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "no se pudo cerrar la ubicación del archivador «%s»: %m" -#: pg_archivecleanup.c:164 -#, c-format -msgid "could not open archive location \"%s\": %m" -msgstr "no se pudo abrir la ubicación del archivador «%s»: %m" - -#: pg_archivecleanup.c:237 +#: pg_archivecleanup.c:245 #, c-format msgid "invalid file name argument" msgstr "el nombre de archivo usado como argumento no es válido" -#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333 -#: pg_archivecleanup.c:345 pg_archivecleanup.c:352 +#: pg_archivecleanup.c:246 pg_archivecleanup.c:334 pg_archivecleanup.c:354 +#: pg_archivecleanup.c:366 pg_archivecleanup.c:373 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: pg_archivecleanup.c:251 +#: pg_archivecleanup.c:259 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -83,17 +94,17 @@ msgstr "" "%s elimina archivos de WAL antiguos del archivador de PostgreSQL.\n" "\n" -#: pg_archivecleanup.c:252 +#: pg_archivecleanup.c:260 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: pg_archivecleanup.c:253 +#: pg_archivecleanup.c:261 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr " %s [OPCIÓN].... UBICACIÓNARCHIVADOR WALMÃSANTIGUOAMANTENER\n" -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:262 #, c-format msgid "" "\n" @@ -102,32 +113,43 @@ msgstr "" "\n" "Opciones:\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:263 #, c-format -msgid " -d generate debug output (verbose mode)\n" -msgstr " -d genera salida de depuración (modo verboso)\n" +msgid " -b, --clean-backup-history clean up files including backup history files\n" +msgstr " -, --clean-backup-history limpia archivos incluyendo archivos de historia de backup\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:264 #, c-format -msgid " -n dry run, show the names of the files that would be removed\n" -msgstr " -n simulacro, muestra el nombre de los archivos que se eliminarían\n" +msgid " -d, --debug generate debug output (verbose mode)\n" +msgstr " -d, --debug genera salida de depuración (modo verboso)\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:265 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version muestra información de la versión, luego sale\n" +msgid "" +" -n, --dry-run dry run, show the names of the files that would be\n" +" removed\n" +msgstr " -n, --dry-run simulacro, muestra el nombre de los archivos que se eliminarían\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:267 #, c-format -msgid " -x EXT clean up files if they have this extension\n" -msgstr " -x EXT hace limpieza de archivos que tengan esta extensión\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version mostrar la información de la versión, luego salir\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:268 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help muestra esta ayuda, luego sale\n" +msgid "" +" -x, --strip-extension=EXT strip this extension before identifying files for\n" +" clean up\n" +msgstr "" +" -x, --strip-extension=EXT quitar esta extensión antes de identificar archivos\n" +" a limpiar\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:270 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help muestra esta ayuda, luego salir\n" + +#: pg_archivecleanup.c:271 #, c-format msgid "" "\n" @@ -142,7 +164,7 @@ msgstr "" "por ej.\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/servidor/directorioarchivador %%r'\n" -#: pg_archivecleanup.c:265 +#: pg_archivecleanup.c:276 #, c-format msgid "" "\n" @@ -155,7 +177,7 @@ msgstr "" "por ej.\n" " pg_archivecleanup /mnt/servidor/directorioarchivador 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:269 +#: pg_archivecleanup.c:280 #, c-format msgid "" "\n" @@ -164,22 +186,22 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: pg_archivecleanup.c:270 +#: pg_archivecleanup.c:281 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: pg_archivecleanup.c:332 +#: pg_archivecleanup.c:353 #, c-format msgid "must specify archive location" msgstr "debe especificar la ubicación del archivador" -#: pg_archivecleanup.c:344 +#: pg_archivecleanup.c:365 #, c-format msgid "must specify oldest kept WAL file" msgstr "debe especificar el fichero WAL más antiguo a mantener" -#: pg_archivecleanup.c:351 +#: pg_archivecleanup.c:372 #, c-format msgid "too many command-line arguments" msgstr "demasiados argumentos de línea de órdenes" diff --git a/src/bin/pg_archivecleanup/po/fr.po b/src/bin/pg_archivecleanup/po/fr.po index 0ac310cc7012a..392e6e64d5f60 100644 --- a/src/bin/pg_archivecleanup/po/fr.po +++ b/src/bin/pg_archivecleanup/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-12 05:16+0000\n" -"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"POT-Creation-Date: 2024-07-20 21:23+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,65 +19,76 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:280 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "attention : " -#: ../../../src/common/logging.c:291 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "détail : " -#: ../../../src/common/logging.c:298 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "astuce : " -#: pg_archivecleanup.c:66 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "mémoire épuisée\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" + +#: pg_archivecleanup.c:68 #, c-format msgid "archive location \"%s\" does not exist" msgstr "l'emplacement d'archivage « %s » n'existe pas" -#: pg_archivecleanup.c:151 +#: pg_archivecleanup.c:100 +#, c-format +msgid "could not open archive location \"%s\": %m" +msgstr "n'a pas pu ouvrir l'emplacement de l'archive « %s » : %m" + +#: pg_archivecleanup.c:164 #, c-format msgid "could not remove file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier « %s » : %m" -#: pg_archivecleanup.c:157 +#: pg_archivecleanup.c:169 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "n'a pas pu lire l'emplacement de l'archive « %s » : %m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:172 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "n'a pas pu fermer l'emplacement de l'archive « %s » : %m" -#: pg_archivecleanup.c:164 -#, c-format -msgid "could not open archive location \"%s\": %m" -msgstr "n'a pas pu ouvrir l'emplacement de l'archive « %s » : %m" - -#: pg_archivecleanup.c:237 +#: pg_archivecleanup.c:245 #, c-format msgid "invalid file name argument" msgstr "argument du nom de fichier invalide" -#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333 -#: pg_archivecleanup.c:345 pg_archivecleanup.c:352 +#: pg_archivecleanup.c:246 pg_archivecleanup.c:334 pg_archivecleanup.c:354 +#: pg_archivecleanup.c:366 pg_archivecleanup.c:373 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_archivecleanup.c:251 +#: pg_archivecleanup.c:259 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -86,17 +97,17 @@ msgstr "" "%s supprime les anciens fichiers WAL des archives de PostgreSQL.\n" "\n" -#: pg_archivecleanup.c:252 +#: pg_archivecleanup.c:260 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_archivecleanup.c:253 +#: pg_archivecleanup.c:261 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr " %s [OPTION]... EMPLACEMENTARCHIVE PLUSANCIENFICHIERWALCONSERVÉ\n" -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:262 #, c-format msgid "" "\n" @@ -105,32 +116,41 @@ msgstr "" "\n" "Options :\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:263 +#, c-format +msgid " -b, --clean-backup-history clean up files including backup history files\n" +msgstr " -b, --clean-backup-history nettoie les fichiers, y compris les historiques de sauvegarde\n" + +#: pg_archivecleanup.c:264 #, c-format -msgid " -d generate debug output (verbose mode)\n" -msgstr " -d affiche des informations de débugage (mode verbeux)\n" +msgid " -d, --debug generate debug output (verbose mode)\n" +msgstr " -d, --debug affiche des informations de débogage (mode verbeux)\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:265 #, c-format -msgid " -n dry run, show the names of the files that would be removed\n" -msgstr " -n test, affiche le nom des fichiers qui seraient supprimés\n" +msgid "" +" -n, --dry-run dry run, show the names of the files that would be\n" +" removed\n" +msgstr " -n, --dry-run test, affiche le nom des fichiers qui seraient supprimés\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:267 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version et quitte\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version affiche la version, puis quitte\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:268 #, c-format -msgid " -x EXT clean up files if they have this extension\n" -msgstr " -x EXT nettoie les fichiers s'ils ont cette extension\n" +msgid "" +" -x, --strip-extension=EXT strip this extension before identifying files for\n" +" clean up\n" +msgstr " -x, --strip-extension=EXT supprime cette extension avant d'identifier les fichiers pour nettoyage\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:270 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide et quitte\n" +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help affiche cette aide, puis quitte\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:271 #, c-format msgid "" "\n" @@ -145,7 +165,7 @@ msgstr "" "Par exemple :\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/serveur/reparchives %%r'\n" -#: pg_archivecleanup.c:265 +#: pg_archivecleanup.c:276 #, c-format msgid "" "\n" @@ -158,7 +178,7 @@ msgstr "" "Par exemple :\n" " pg_archivecleanup /mnt/serveur/reparchives 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:269 +#: pg_archivecleanup.c:280 #, c-format msgid "" "\n" @@ -167,52 +187,22 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_archivecleanup.c:270 +#: pg_archivecleanup.c:281 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" -#: pg_archivecleanup.c:332 +#: pg_archivecleanup.c:353 #, c-format msgid "must specify archive location" msgstr "doit spécifier l'emplacement de l'archive" -#: pg_archivecleanup.c:344 +#: pg_archivecleanup.c:365 #, c-format msgid "must specify oldest kept WAL file" msgstr "doit spécifier le plus ancien journal de transactions conservé" -#: pg_archivecleanup.c:351 +#: pg_archivecleanup.c:372 #, c-format msgid "too many command-line arguments" msgstr "trop d'arguments en ligne de commande" - -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" - -#~ msgid "%s: ERROR: could not remove file \"%s\": %s\n" -#~ msgstr "%s : ERREUR : n'a pas pu supprimer le fichier « %s » : %s\n" - -#~ msgid "%s: file \"%s\" would be removed\n" -#~ msgstr "%s : le fichier « %s » serait supprimé\n" - -#~ msgid "%s: keeping WAL file \"%s\" and later\n" -#~ msgstr "%s : conservation du fichier WAL « %s » et des suivants\n" - -#~ msgid "%s: removing file \"%s\"\n" -#~ msgstr "%s : suppression du fichier « %s »\n" - -#~ msgid "%s: too many parameters\n" -#~ msgstr "%s : trop de paramètres\n" - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatal : " diff --git a/src/bin/pg_archivecleanup/po/ja.po b/src/bin/pg_archivecleanup/po/ja.po index cabca2e4a20c5..e1fd2dbff8941 100644 --- a/src/bin/pg_archivecleanup/po/ja.po +++ b/src/bin/pg_archivecleanup/po/ja.po @@ -1,13 +1,13 @@ # Japanese message translation file for pg_archivecleanup -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: pg_archivecleanup (PostgreSQL 15)\n" +"Project-Id-Version: pg_archivecleanup (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-09 12:00+0900\n" -"PO-Revision-Date: 2020-09-13 08:55+0200\n" +"POT-Creation-Date: 2025-02-28 10:05+0900\n" +"PO-Revision-Date: 2025-03-03 17:28+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -15,6 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.13\n" +"Plural-Forms: nplurals=1; plural=0;\n" #: ../../../src/common/logging.c:276 #, c-format @@ -36,43 +37,54 @@ msgstr "詳細: " msgid "hint: " msgstr "ヒント: " -#: pg_archivecleanup.c:66 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "メモリä¸è¶³ã§ã™\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "nullãƒã‚¤ãƒ³ã‚¿ã¯è¤‡è£½ã§ãã¾ã›ã‚“(内部エラー)\n" + +#: pg_archivecleanup.c:68 #, c-format msgid "archive location \"%s\" does not exist" msgstr "アーカイブã®å ´æ‰€\"%s\"ãŒå­˜åœ¨ã—ã¾ã›ã‚“" -#: pg_archivecleanup.c:151 +#: pg_archivecleanup.c:100 +#, c-format +msgid "could not open archive location \"%s\": %m" +msgstr "アーカイブã®å ´æ‰€\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: pg_archivecleanup.c:164 #, c-format msgid "could not remove file \"%s\": %m" msgstr "ファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_archivecleanup.c:157 +#: pg_archivecleanup.c:169 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "アーカイブã®å ´æ‰€\"%s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:172 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "アーカイブã®å ´æ‰€\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_archivecleanup.c:164 -#, c-format -msgid "could not open archive location \"%s\": %m" -msgstr "アーカイブã®å ´æ‰€\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: pg_archivecleanup.c:237 +#: pg_archivecleanup.c:245 #, c-format msgid "invalid file name argument" msgstr "ファイルå引数ãŒç„¡åйã§ã™" -#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333 -#: pg_archivecleanup.c:345 pg_archivecleanup.c:352 +#: pg_archivecleanup.c:246 pg_archivecleanup.c:334 pg_archivecleanup.c:354 +#: pg_archivecleanup.c:366 pg_archivecleanup.c:373 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" -#: pg_archivecleanup.c:251 +#: pg_archivecleanup.c:259 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -81,17 +93,17 @@ msgstr "" "%sã¯PostgreSQLã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã‹ã‚‰å¤ã„WALファイルを削除ã—ã¾ã™ã€‚\n" "\n" -#: pg_archivecleanup.c:252 +#: pg_archivecleanup.c:260 #, c-format msgid "Usage:\n" msgstr "使用法:\n" -#: pg_archivecleanup.c:253 +#: pg_archivecleanup.c:261 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr "%s [オプション] ... {アーカイブã®å ´æ‰€} {ä¿å­˜ã™ã‚‹æœ€å¤ã® WAL ファイルå}\n" -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:262 #, c-format msgid "" "\n" @@ -100,32 +112,41 @@ msgstr "" "\n" "オプション:\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:263 #, c-format -msgid " -d generate debug output (verbose mode)\n" -msgstr " -d デãƒãƒƒã‚°æƒ…報を出力(冗長モード)\n" +msgid " -b, --clean-backup-history clean up files including backup history files\n" +msgstr " -b, --clean-backup-history ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ヒストリファイルをå«ã‚ã¦å‰Šé™¤ã™ã‚‹\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:264 #, c-format -msgid " -n dry run, show the names of the files that would be removed\n" -msgstr " -n リãƒãƒ¼ã‚µãƒ«ã€å‰Šé™¤å¯¾è±¡ã®ãƒ•ァイルåを表示\n" +msgid " -d, --debug generate debug output (verbose mode)\n" +msgstr " -d, --debug デãƒãƒƒã‚°æƒ…報を出力(冗長モード)\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:265 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を出力ã—ã¦çµ‚了\n" +msgid "" +" -n, --dry-run dry run, show the names of the files that would be\n" +" removed\n" +msgstr " -n, --dry-run リãƒãƒ¼ã‚µãƒ«ã€å‰Šé™¤å¯¾è±¡ã®ãƒ•ァイルåを表示\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:267 #, c-format -msgid " -x EXT clean up files if they have this extension\n" -msgstr " -x EXT ã“ã®æ‹¡å¼µå­ã‚’æŒã¤ãƒ•ァイルを削除対象ã¨ã™ã‚‹\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:268 +#, c-format +msgid "" +" -x, --strip-extension=EXT strip this extension before identifying files for\n" +" clean up\n" +msgstr " -x, --strip-extension=EXT 削除対象ã®ãƒ•ァイルã®ç¢ºèªå‰ã«ã“ã®æ‹¡å¼µå­ã‚’削除ã™ã‚‹\n" + +#: pg_archivecleanup.c:270 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:271 #, c-format msgid "" "\n" @@ -135,12 +156,12 @@ msgid "" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" msgstr "" "\n" -"postgresql.confã§archive_cleanup_commandã¨ã—ã¦ä½¿ç”¨ã™ã‚‹å ´åˆã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™:\n" -" archive_cleanup_command = 'pg_archivecleanup [オプション]... アーカイブã®å ´æ‰€ %%r'\n" +"postgresql.conf ã§ archive_cleanup_command ã¨ã—ã¦ä½¿ç”¨ã™ã‚‹å ´åˆã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™:\n" +" archive_cleanup_command = 'pg_archivecleanup [オプション]... <アーカイブã®å ´æ‰€> %%r'\n" "例ã¨ã—ã¦ã¯:\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" -#: pg_archivecleanup.c:265 +#: pg_archivecleanup.c:276 #, c-format msgid "" "\n" @@ -153,7 +174,7 @@ msgstr "" "使用例\n" " pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:269 +#: pg_archivecleanup.c:280 #, c-format msgid "" "\n" @@ -162,40 +183,22 @@ msgstr "" "\n" "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: pg_archivecleanup.c:270 +#: pg_archivecleanup.c:281 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_archivecleanup.c:332 +#: pg_archivecleanup.c:353 #, c-format msgid "must specify archive location" msgstr "アーカイブã®å ´æ‰€ã‚’指定ã—ã¦ãã ã•ã„" -#: pg_archivecleanup.c:344 +#: pg_archivecleanup.c:365 #, c-format msgid "must specify oldest kept WAL file" msgstr "ä¿å­˜ã™ã‚‹æœ€å¤ã®WALファイルを指定ã—ã¦ãã ã•ã„" -#: pg_archivecleanup.c:351 +#: pg_archivecleanup.c:372 #, c-format msgid "too many command-line arguments" msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™" - -#~ msgid "%s: keeping WAL file \"%s\" and later\n" -#~ msgstr "%s: WAL file \"%s\" ã¨ãれ以é™ã®åˆ†ã‚’ä¿å­˜ã—ã¦ã„ã¾ã™\n" - -#~ msgid "%s: ERROR: could not remove file \"%s\": %s\n" -#~ msgstr "%s: エラー: ファイル \"%s\" を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" - -#~ msgid "%s: removing file \"%s\"\n" -#~ msgstr "%s: ファイル \"%s\" を削除ã—ã¦ã„ã¾ã™\n" - -#~ msgid "%s: file \"%s\" would be removed\n" -#~ msgstr "%s: ファイル \"%s\" ã¯å‰Šé™¤ã•れã¾ã™\n" - -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "\"%s --help\"ã§è©³ç´°ãŒå‚ç…§ã§ãã¾ã™ã€‚\n" - -#~ msgid "fatal: " -#~ msgstr "致命的エラー: " diff --git a/src/bin/pg_archivecleanup/po/ka.po b/src/bin/pg_archivecleanup/po/ka.po index 6bfc88734e42c..e14bdcd06f1cf 100644 --- a/src/bin/pg_archivecleanup/po/ka.po +++ b/src/bin/pg_archivecleanup/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_archivecleanup (PostgreSQL) 15\n" +"Project-Id-Version: pg_archivecleanup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-02 04:50+0000\n" -"PO-Revision-Date: 2022-07-04 09:06+0200\n" +"POT-Creation-Date: 2024-07-01 03:53+0000\n" +"PO-Revision-Date: 2024-02-11 14:42+0100\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.1\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -38,43 +38,54 @@ msgstr "დეტáƒáƒšáƒ”ბი: " msgid "hint: " msgstr "მინიშნებáƒ: " -#: pg_archivecleanup.c:66 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" + +#: pg_archivecleanup.c:68 #, c-format msgid "archive location \"%s\" does not exist" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის მდებáƒáƒ áƒ”áƒáƒ‘რáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" -#: pg_archivecleanup.c:151 +#: pg_archivecleanup.c:100 +#, c-format +msgid "could not open archive location \"%s\": %m" +msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის მდებáƒáƒ áƒ”áƒáƒ‘ის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ\"%s\": %m" + +#: pg_archivecleanup.c:164 #, c-format msgid "could not remove file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m" -#: pg_archivecleanup.c:157 +#: pg_archivecleanup.c:169 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის მდებáƒáƒ áƒ”áƒáƒ‘ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ\"%s\": %m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:172 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ\"%s\": %m" -#: pg_archivecleanup.c:164 -#, c-format -msgid "could not open archive location \"%s\": %m" -msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის მდებáƒáƒ áƒ”áƒáƒ‘ის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ\"%s\": %m" - -#: pg_archivecleanup.c:237 +#: pg_archivecleanup.c:245 #, c-format msgid "invalid file name argument" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი" -#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333 -#: pg_archivecleanup.c:345 pg_archivecleanup.c:352 +#: pg_archivecleanup.c:246 pg_archivecleanup.c:334 pg_archivecleanup.c:354 +#: pg_archivecleanup.c:366 pg_archivecleanup.c:373 #, c-format msgid "Try \"%s --help\" for more information." msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." -#: pg_archivecleanup.c:251 +#: pg_archivecleanup.c:259 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -83,17 +94,17 @@ msgstr "" "%s PostgreSQL-ის áƒáƒ áƒ¥áƒ˜áƒ•ებიდáƒáƒœ ძველი WAL ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ.\n" "\n" -#: pg_archivecleanup.c:252 +#: pg_archivecleanup.c:260 #, c-format msgid "Usage:\n" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" -#: pg_archivecleanup.c:253 +#: pg_archivecleanup.c:261 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... áƒáƒ áƒ¥áƒ˜áƒ•ისმდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘რუძველესიშენáƒáƒ®áƒ£áƒšáƒ˜WALფáƒáƒ˜áƒšáƒ˜\n" -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:262 #, c-format msgid "" "\n" @@ -102,72 +113,73 @@ msgstr "" "\n" "პáƒáƒ áƒáƒ›áƒ”ტრები\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:263 #, c-format -msgid " -d generate debug output (verbose mode)\n" -msgstr "" -" -d, --debug გáƒáƒ¡áƒáƒ›áƒáƒ áƒ—ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ(verbose mode)\n" +msgid " -b, --clean-backup-history clean up files including backup history files\n" +msgstr " -b, --clean-backup-history ფáƒáƒ˜áƒšáƒ”ბის მáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებრმáƒáƒ áƒ¥áƒáƒ¤áƒ˜ ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის ჩáƒáƒ—ვლით\n" + +#: pg_archivecleanup.c:264 +#, c-format +msgid " -d, --debug generate debug output (verbose mode)\n" +msgstr " -d, --debug გáƒáƒ¡áƒáƒ›áƒáƒ áƒ—ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ(დáƒáƒ›áƒáƒ¢áƒ”ბითი შეტყáƒáƒ‘ინებების რეჟიმი)\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:265 #, c-format msgid "" -" -n dry run, show the names of the files that would be " -"removed\n" +" -n, --dry-run dry run, show the names of the files that would be\n" +" removed\n" msgstr "" -" -n მშრáƒáƒšáƒ˜ გáƒáƒ¨áƒ•ებáƒ. ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ˜áƒ¡ მáƒáƒ’იერ მხáƒáƒšáƒáƒ“ მáƒáƒ—ი " -"სáƒáƒ®áƒ”ლების ჩვენებáƒ\n" +" -n, --dry-run მშრáƒáƒšáƒ˜ გáƒáƒ¨áƒ•ებáƒ. ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ˜áƒ¡ მáƒáƒ’იერ მხáƒáƒšáƒáƒ“ მáƒáƒ—ი \n" +" სáƒáƒ®áƒ”ლების ჩვენებáƒ\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:267 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version ვერსიის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:268 #, c-format -msgid " -x EXT clean up files if they have this extension\n" +msgid "" +" -x, --strip-extension=EXT strip this extension before identifying files for\n" +" clean up\n" msgstr "" -" -x EXT ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებáƒ, თუ მáƒáƒ— ეს გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრგáƒáƒáƒ©áƒœáƒ˜áƒáƒ—\n" +" -x, --strip-extension=გáƒáƒ¤ áƒáƒ› გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის მáƒáƒªáƒ˜áƒšáƒ”ბáƒáƒ¤áƒáƒ˜áƒšáƒ˜áƒ¡ მáƒáƒ¡áƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებლების\n" +" სიáƒáƒ¨áƒ˜ ჩáƒáƒ¡áƒ›áƒáƒ›áƒ“ე\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:270 #, c-format -msgid " -?, --help show this help, then exit\n" +msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:271 #, c-format msgid "" "\n" "For use as archive_cleanup_command in postgresql.conf:\n" -" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION " -"%%r'\n" +" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n" "e.g.\n" -" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir " -"%%r'\n" +" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" msgstr "" "\n" "გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“, რáƒáƒ’áƒáƒ áƒª archive_cleanup_command postgresql.conf-ში: \n" -" archive_cleanup_command = 'pg_archivecleanup [პáƒáƒ áƒáƒ›áƒ”ტრი]... " -"áƒáƒ áƒ¥áƒ˜áƒ•ისმდებáƒáƒ áƒ”áƒáƒ‘რ%%r'\n" +" archive_cleanup_command = 'pg_archivecleanup [პáƒáƒ áƒáƒ›áƒ”ტრი]... áƒáƒ áƒ¥áƒ˜áƒ•ისმდებáƒáƒ áƒ”áƒáƒ‘რ%%r'\n" "მáƒáƒ’: \n" -" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir " -"%%r'\n" +" archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" -#: pg_archivecleanup.c:265 +#: pg_archivecleanup.c:276 #, c-format msgid "" "\n" "Or for use as a standalone archive cleaner:\n" "e.g.\n" -" pg_archivecleanup /mnt/server/archiverdir " -"000000010000000000000010.00000020.backup\n" +" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n" msgstr "" "\n" "áƒáƒœ ეული áƒáƒ áƒ¥áƒ˜áƒ•ის გáƒáƒ›áƒ¬áƒ›áƒ”ნდáƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" "მáƒáƒ’:\n" -" pg_archivecleanup /mnt/server/archiverdir " -"000000010000000000000010.00000020.backup\n" +" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:269 +#: pg_archivecleanup.c:280 #, c-format msgid "" "\n" @@ -176,22 +188,34 @@ msgstr "" "\n" "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n" -#: pg_archivecleanup.c:270 +#: pg_archivecleanup.c:281 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" -#: pg_archivecleanup.c:332 +#: pg_archivecleanup.c:353 #, c-format msgid "must specify archive location" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის მდებáƒáƒ áƒ”áƒáƒ‘ის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" -#: pg_archivecleanup.c:344 +#: pg_archivecleanup.c:365 #, c-format msgid "must specify oldest kept WAL file" msgstr "დáƒáƒ¢áƒáƒ•ებული უძველესი WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" -#: pg_archivecleanup.c:351 +#: pg_archivecleanup.c:372 #, c-format msgid "too many command-line arguments" msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი" + +#, c-format +#~ msgid " -?, --help show this help, then exit\n" +#~ msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" + +#, c-format +#~ msgid " -V, --version output version information, then exit\n" +#~ msgstr " -V, --version ვერსიის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" + +#, c-format +#~ msgid " -x EXT clean up files if they have this extension\n" +#~ msgstr " -x EXT ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებáƒ, თუ მáƒáƒ— ეს გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრგáƒáƒáƒ©áƒœáƒ˜áƒáƒ—\n" diff --git a/src/bin/pg_archivecleanup/po/ko.po b/src/bin/pg_archivecleanup/po/ko.po index 785839ab2fd4a..79fea6d7cf4cd 100644 --- a/src/bin/pg_archivecleanup/po/ko.po +++ b/src/bin/pg_archivecleanup/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_archivecleanup (PostgreSQL) 13\n" +"Project-Id-Version: pg_archivecleanup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 01:16+0000\n" -"PO-Revision-Date: 2020-10-05 17:51+0900\n" +"POT-Creation-Date: 2025-01-17 04:52+0000\n" +"PO-Revision-Date: 2025-01-16 13:10+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -17,58 +17,74 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "심ê°: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " -#: pg_archivecleanup.c:66 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "메모리 부족\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ë„ í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" + +#: pg_archivecleanup.c:68 #, c-format msgid "archive location \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ì•„ì¹´ì´ë¸Œ 위치가 ì—†ìŒ" -#: pg_archivecleanup.c:152 +#: pg_archivecleanup.c:100 +#, c-format +msgid "could not open archive location \"%s\": %m" +msgstr "\"%s\" ì•„ì¹´ì´ë¸Œ 위치를 ì—´ 수 ì—†ìŒ: %m" + +#: pg_archivecleanup.c:164 #, c-format msgid "could not remove file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ 삭제할 수 ì—†ìŒ: %m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:169 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "\"%s\" ì•„ì¹´ì´ë¸Œ 위치를 ì½ì„ 수 ì—†ìŒ: %m" -#: pg_archivecleanup.c:163 +#: pg_archivecleanup.c:172 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "\"%s\" ì•„ì¹´ì´ë¸Œ 위치를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: pg_archivecleanup.c:167 -#, c-format -msgid "could not open archive location \"%s\": %m" -msgstr "\"%s\" ì•„ì¹´ì´ë¸Œ 위치를 ì—´ 수 ì—†ìŒ: %m" - -#: pg_archivecleanup.c:240 +#: pg_archivecleanup.c:245 #, c-format msgid "invalid file name argument" msgstr "ìž˜ëª»ëœ íŒŒì¼ ì´ë¦„ 매개변수" -#: pg_archivecleanup.c:241 pg_archivecleanup.c:315 pg_archivecleanup.c:336 -#: pg_archivecleanup.c:348 pg_archivecleanup.c:355 +#: pg_archivecleanup.c:246 pg_archivecleanup.c:334 pg_archivecleanup.c:354 +#: pg_archivecleanup.c:366 pg_archivecleanup.c:373 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "보다 ìžì„¸í•œ 정보는 \"%s --help\" ëª…ë ¹ì„ ì°¸ì¡°í•˜ì„¸ìš”.\n" +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:259 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -78,17 +94,17 @@ msgstr "" "WAL 파ì¼ì„ ì§€ì›ë‹ˆë‹¤.\n" "\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:260 #, c-format msgid "Usage:\n" msgstr "사용법:\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:261 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr " %s [옵션]... ì•„ì¹´ì´ë¸Œìœ„치 보관할제ì¼ì˜¤ëž˜ëœíŒŒì¼\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:262 #, c-format msgid "" "\n" @@ -97,33 +113,45 @@ msgstr "" "\n" "옵션들:\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:263 #, c-format -msgid " -d generate debug output (verbose mode)\n" -msgstr " -d 보다 ìžì„¸í•œ 작업 ë‚´ìš© 출력\n" +msgid "" +" -b, --clean-backup-history clean up files including backup history files\n" +msgstr " -b, --clean-backup-history 백업 ë‚´ì—­ 파ì¼ì„ í¬í•¨í•´ì„œ 파ì¼ë“¤ 지움\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:264 +#, c-format +msgid " -d, --debug generate debug output (verbose mode)\n" +msgstr " -d, --debug 보다 ìžì„¸í•œ 작업 ë‚´ìš© 출력\n" + +#: pg_archivecleanup.c:265 #, c-format msgid "" -" -n dry run, show the names of the files that would be removed\n" -msgstr " -n 지울 대ìƒë§Œ 확ì¸í•˜ê³  지우지는 않ìŒ\n" +" -n, --dry-run dry run, show the names of the files that " +"would be\n" +" removed\n" +msgstr " -n, --dry-run 지울 대ìƒë§Œ 확ì¸í•˜ê³  지우지는 않ìŒ\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:267 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version 버전 정보를 보여주고 마침\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: pg_archivecleanup.c:261 +#: pg_archivecleanup.c:268 #, c-format -msgid " -x EXT clean up files if they have this extension\n" -msgstr " -x EXT 해당 í™•ìž¥ìž íŒŒì¼ë“¤ì„ 작업 대ìƒìœ¼ë¡œ 함\n" +msgid "" +" -x, --strip-extension=EXT strip this extension before identifying files " +"for\n" +" clean up\n" +msgstr "" +" -x, --strip-extension=EXT 지울 파ì¼ì„ ì‹ë³„하기 ì „ì— í•´ë‹¹ 확장 모듈 지움\n" -#: pg_archivecleanup.c:262 +#: pg_archivecleanup.c:270 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help ë„움ë§ì„ 보여주고 마침\n" +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: pg_archivecleanup.c:263 +#: pg_archivecleanup.c:271 #, c-format msgid "" "\n" @@ -139,7 +167,7 @@ msgstr "" "사용예:\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" -#: pg_archivecleanup.c:268 +#: pg_archivecleanup.c:276 #, c-format msgid "" "\n" @@ -154,7 +182,7 @@ msgstr "" " pg_archivecleanup /mnt/server/archiverdir " "000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:272 +#: pg_archivecleanup.c:280 #, c-format msgid "" "\n" @@ -163,22 +191,26 @@ msgstr "" "\n" "ë¬¸ì œì  ë³´ê³  주소: <%s>\n" -#: pg_archivecleanup.c:273 +#: pg_archivecleanup.c:281 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페ì´ì§€: <%s>\n" -#: pg_archivecleanup.c:335 +#: pg_archivecleanup.c:353 #, c-format msgid "must specify archive location" msgstr "ì•„ì¹´ì´ë¸Œ 위치는 지정해야 함" -#: pg_archivecleanup.c:347 +#: pg_archivecleanup.c:365 #, c-format msgid "must specify oldest kept WAL file" msgstr "남길 가장 ì˜¤ëž˜ëœ WAL 파ì¼ì€ 지정해야 함" -#: pg_archivecleanup.c:354 +#: pg_archivecleanup.c:372 #, c-format msgid "too many command-line arguments" msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정했ìŒ" + +#, c-format +#~ msgid " -x EXT clean up files if they have this extension\n" +#~ msgstr " -x EXT 해당 í™•ìž¥ìž íŒŒì¼ë“¤ì„ 작업 대ìƒìœ¼ë¡œ 함\n" diff --git a/src/bin/pg_archivecleanup/po/meson.build b/src/bin/pg_archivecleanup/po/meson.build index c6f33edcad128..9c2d4ba82b5f4 100644 --- a/src/bin/pg_archivecleanup/po/meson.build +++ b/src/bin/pg_archivecleanup/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_archivecleanup-' + pg_version_major.to_string())] diff --git a/src/bin/pg_archivecleanup/po/ru.po b/src/bin/pg_archivecleanup/po/ru.po index 4b542ce16ce84..e04456d67d365 100644 --- a/src/bin/pg_archivecleanup/po/ru.po +++ b/src/bin/pg_archivecleanup/po/ru.po @@ -1,21 +1,21 @@ # Russian message translation file for pg_archivecleanup # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2017, 2019, 2020, 2022. +# Alexander Lakhin , 2017, 2019, 2020, 2022, 2024. msgid "" msgstr "" "Project-Id-Version: pg_archivecleanup (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-27 14:52+0300\n" -"PO-Revision-Date: 2022-09-05 13:34+0300\n" +"POT-Creation-Date: 2024-09-02 09:29+0300\n" +"PO-Revision-Date: 2024-09-07 06:17+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,43 +37,54 @@ msgstr "подробноÑти: " msgid "hint: " msgstr "подÑказка: " -#: pg_archivecleanup.c:66 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "нехватка памÑти\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" + +#: pg_archivecleanup.c:68 #, c-format msgid "archive location \"%s\" does not exist" msgstr "раÑположение архива \"%s\" не ÑущеÑтвует" -#: pg_archivecleanup.c:151 +#: pg_archivecleanup.c:100 +#, c-format +msgid "could not open archive location \"%s\": %m" +msgstr "не удалоÑÑŒ открыть раÑположение архива \"%s\": %m" + +#: pg_archivecleanup.c:164 #, c-format msgid "could not remove file \"%s\": %m" msgstr "не удалоÑÑŒ Ñтереть файл \"%s\": %m" -#: pg_archivecleanup.c:157 +#: pg_archivecleanup.c:169 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "не удалоÑÑŒ прочитать раÑположение архива \"%s\": %m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:172 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "не удалоÑÑŒ закрыть раÑположение архива \"%s\": %m" -#: pg_archivecleanup.c:164 -#, c-format -msgid "could not open archive location \"%s\": %m" -msgstr "не удалоÑÑŒ открыть раÑположение архива \"%s\": %m" - -#: pg_archivecleanup.c:237 +#: pg_archivecleanup.c:245 #, c-format msgid "invalid file name argument" msgstr "неверный аргумент Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ файла" -#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333 -#: pg_archivecleanup.c:345 pg_archivecleanup.c:352 +#: pg_archivecleanup.c:246 pg_archivecleanup.c:334 pg_archivecleanup.c:354 +#: pg_archivecleanup.c:366 pg_archivecleanup.c:373 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." -#: pg_archivecleanup.c:251 +#: pg_archivecleanup.c:259 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -82,18 +93,18 @@ msgstr "" "%s удалÑет Ñтарые файлы WAL из архивов PostgreSQL.\n" "\n" -#: pg_archivecleanup.c:252 +#: pg_archivecleanup.c:260 #, c-format msgid "Usage:\n" msgstr "ИÑпользование:\n" -#: pg_archivecleanup.c:253 +#: pg_archivecleanup.c:261 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr "" " %s [ПÐРÐМЕТР]... РÐСПОЛОЖЕÐИЕ_ÐРХИВРСТÐРЕЙШИЙ_СОХРÐÐЯЕМЫЙ_ФÐЙЛ_WAL\n" -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:262 #, c-format msgid "" "\n" @@ -102,42 +113,60 @@ msgstr "" "\n" "Параметры:\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:263 #, c-format -msgid " -d generate debug output (verbose mode)\n" -msgstr " -d генерировать подробные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (отладочный режим)\n" +msgid "" +" -b, --clean-backup-history clean up files including backup history files\n" +msgstr "" +" -b, --clean-backup-history удалить также файлы иÑтории копированиÑ\n" + +#: pg_archivecleanup.c:264 +#, c-format +msgid " -d, --debug generate debug output (verbose mode)\n" +msgstr "" +" -d, --debug генерировать подробные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (режим " +"отладки)\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:265 #, c-format msgid "" -" -n dry run, show the names of the files that would be removed\n" +" -n, --dry-run dry run, show the names of the files that " +"would be\n" +" removed\n" msgstr "" -" -n холоÑтой запуÑк, только показать имена файлов, которые " -"будут удалены\n" +" -n, --dry-run холоÑтой запуÑк, только показать имена " +"файлов,\n" +" которые будут удалены\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:267 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version показать верÑию и выйти\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version показать верÑию и выйти\n" # well-spelled: РСШ -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:268 #, c-format -msgid " -x EXT clean up files if they have this extension\n" -msgstr " -x РСШ убрать файлы Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ раÑширением\n" +msgid "" +" -x, --strip-extension=EXT strip this extension before identifying files " +"for\n" +" clean up\n" +msgstr "" +" -x, --strip-extension=РСШ убрать Ñто раÑширение прежде чем определÑть " +"файлы,\n" +" подлежащие удалению\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:270 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help показать Ñту Ñправку и выйти\n" +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:271 #, c-format msgid "" "\n" "For use as archive_cleanup_command in postgresql.conf:\n" -" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %" -"%r'\n" +" archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION " +"%%r'\n" "e.g.\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" msgstr "" @@ -148,22 +177,22 @@ msgstr "" "например:\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" -#: pg_archivecleanup.c:265 +#: pg_archivecleanup.c:276 #, c-format msgid "" "\n" "Or for use as a standalone archive cleaner:\n" "e.g.\n" -" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010." -"00000020.backup\n" +" pg_archivecleanup /mnt/server/archiverdir " +"000000010000000000000010.00000020.backup\n" msgstr "" "\n" "Либо Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве отдельного ÑредÑтва очиÑтки архива,\n" "например:\n" -" pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010." -"00000020.backup\n" +" pg_archivecleanup /mnt/server/archiverdir " +"000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:269 +#: pg_archivecleanup.c:280 #, c-format msgid "" "\n" @@ -172,26 +201,31 @@ msgstr "" "\n" "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: pg_archivecleanup.c:270 +#: pg_archivecleanup.c:281 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" -#: pg_archivecleanup.c:332 +#: pg_archivecleanup.c:353 #, c-format msgid "must specify archive location" msgstr "необходимо задать раÑположение архива" -#: pg_archivecleanup.c:344 +#: pg_archivecleanup.c:365 #, c-format msgid "must specify oldest kept WAL file" msgstr "необходимо задать Ð¸Ð¼Ñ Ñтарейшего ÑохранÑемого файла WAL" -#: pg_archivecleanup.c:351 +#: pg_archivecleanup.c:372 #, c-format msgid "too many command-line arguments" msgstr "Ñлишком много аргументов командной Ñтроки" +# well-spelled: РСШ +#, c-format +#~ msgid " -x EXT clean up files if they have this extension\n" +#~ msgstr " -x РСШ убрать файлы Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ раÑширением\n" + #~ msgid "fatal: " #~ msgstr "важно: " diff --git a/src/bin/pg_archivecleanup/po/sv.po b/src/bin/pg_archivecleanup/po/sv.po index 6cebbc1ad1b86..d91831a8ba751 100644 --- a/src/bin/pg_archivecleanup/po/sv.po +++ b/src/bin/pg_archivecleanup/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_archivecleanup # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-11 13:50+0000\n" -"PO-Revision-Date: 2022-04-11 16:06+0200\n" +"POT-Creation-Date: 2024-07-12 13:23+0000\n" +"PO-Revision-Date: 2024-07-12 15:46+0200\n" "Last-Translator: FDennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,63 +17,74 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:268 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:275 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "varning: " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "detalj: " -#: ../../../src/common/logging.c:287 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "tips: " -#: pg_archivecleanup.c:66 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "slut pÃ¥ minne\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kan inte duplicera null-pekare (internt fel)\n" + +#: pg_archivecleanup.c:68 #, c-format msgid "archive location \"%s\" does not exist" msgstr "arkivplats \"%s\" finns inte" -#: pg_archivecleanup.c:151 +#: pg_archivecleanup.c:100 +#, c-format +msgid "could not open archive location \"%s\": %m" +msgstr "kunde inte öppna arkivplats \"%s\": %m" + +#: pg_archivecleanup.c:164 #, c-format msgid "could not remove file \"%s\": %m" msgstr "kunde inte ta bort fil \"%s\": %m" -#: pg_archivecleanup.c:157 +#: pg_archivecleanup.c:169 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "kunde inte läsa arkivplats \"%s\": %m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:172 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "kunde inte stänga arkivplats \"%s\": %m" -#: pg_archivecleanup.c:164 -#, c-format -msgid "could not open archive location \"%s\": %m" -msgstr "kunde inte öppna arkivplats \"%s\": %m" - -#: pg_archivecleanup.c:237 +#: pg_archivecleanup.c:245 #, c-format msgid "invalid file name argument" msgstr "ogiltigt filnamnsargument" -#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333 -#: pg_archivecleanup.c:345 pg_archivecleanup.c:352 +#: pg_archivecleanup.c:246 pg_archivecleanup.c:334 pg_archivecleanup.c:354 +#: pg_archivecleanup.c:366 pg_archivecleanup.c:373 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: pg_archivecleanup.c:251 +#: pg_archivecleanup.c:259 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -82,17 +93,17 @@ msgstr "" "%s tar bort gamla WAL-filer frÃ¥n PostgreSQLs arkiv.\n" "\n" -#: pg_archivecleanup.c:252 +#: pg_archivecleanup.c:260 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_archivecleanup.c:253 +#: pg_archivecleanup.c:261 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr " %s [FLAGGA]... ARKIVPLATS ÄLDSTASPARADEWALFIL\n" -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:262 #, c-format msgid "" "\n" @@ -101,32 +112,45 @@ msgstr "" "\n" "Flaggor:\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:263 #, c-format -msgid " -d generate debug output (verbose mode)\n" -msgstr " -d generera debugutskrift (utförligt läge)\n" +msgid " -b, --clean-backup-history clean up files including backup history files\n" +msgstr " -b, --clean-backup-history rensa upp filer, inklusive filer för backuphistorik\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:264 #, c-format -msgid " -n dry run, show the names of the files that would be removed\n" -msgstr " -n gör inga ändringar visa namn pÃ¥ de filer som skulle ha tagits bort\n" +msgid " -d, --debug generate debug output (verbose mode)\n" +msgstr " -d, --debug generera debugutskrift (utförligt läge)\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:265 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version visa versionsinformation, avsluta sedan\n" +msgid "" +" -n, --dry-run dry run, show the names of the files that would be\n" +" removed\n" +msgstr "" +" -n, --dry-run gör inga ändringar, visa namn pÃ¥ de filer som skulle\n" +" ha tagits bort\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:267 #, c-format -msgid " -x EXT clean up files if they have this extension\n" -msgstr " -x SUF städa upp filer om de har detta suffix\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:268 +#, c-format +msgid "" +" -x, --strip-extension=EXT strip this extension before identifying files for\n" +" clean up\n" +msgstr "" +" -x, --strip-extension=EXT ta bort denna ändelse innan vi identifierar filer\n" +" som skall tas bort\n" + +#: pg_archivecleanup.c:270 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help visa denna hjälp, avsluta sedan\n" +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:271 #, c-format msgid "" "\n" @@ -141,7 +165,7 @@ msgstr "" "t.ex.\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" -#: pg_archivecleanup.c:265 +#: pg_archivecleanup.c:276 #, c-format msgid "" "\n" @@ -154,7 +178,7 @@ msgstr "" "t.ex.\n" " pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:269 +#: pg_archivecleanup.c:280 #, c-format msgid "" "\n" @@ -163,22 +187,22 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_archivecleanup.c:270 +#: pg_archivecleanup.c:281 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_archivecleanup.c:332 +#: pg_archivecleanup.c:353 #, c-format msgid "must specify archive location" msgstr "mÃ¥ste ange en arkivplats" -#: pg_archivecleanup.c:344 +#: pg_archivecleanup.c:365 #, c-format msgid "must specify oldest kept WAL file" msgstr "mÃ¥ste ange äldsta sparade WAL-filen" -#: pg_archivecleanup.c:351 +#: pg_archivecleanup.c:372 #, c-format msgid "too many command-line arguments" msgstr "för mÃ¥nga kommandoradsargument" diff --git a/src/bin/pg_archivecleanup/po/uk.po b/src/bin/pg_archivecleanup/po/uk.po index 120f799bc7014..767f51cc73f95 100644 --- a/src/bin/pg_archivecleanup/po/uk.po +++ b/src/bin/pg_archivecleanup/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:51+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:23+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pg_archivecleanup.pot\n" -"X-Crowdin-File-ID: 898\n" +"X-Crowdin-File: /REL_17_STABLE/pg_archivecleanup.pot\n" +"X-Crowdin-File-ID: 1032\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,90 +37,110 @@ msgstr "деталі: " msgid "hint: " msgstr "підказка: " -#: pg_archivecleanup.c:66 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "недоÑтатньо пам'Ñті\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" + +#: pg_archivecleanup.c:68 #, c-format msgid "archive location \"%s\" does not exist" msgstr "архівного Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: pg_archivecleanup.c:151 +#: pg_archivecleanup.c:100 +#, c-format +msgid "could not open archive location \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ архівне Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ \"%s\":%m" + +#: pg_archivecleanup.c:164 #, c-format msgid "could not remove file \"%s\": %m" msgstr "не можливо видалити файл \"%s\": %m" -#: pg_archivecleanup.c:157 +#: pg_archivecleanup.c:169 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ архівне Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ \"%s\":%m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:172 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ архівне Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ \"%s\":%m" -#: pg_archivecleanup.c:164 -#, c-format -msgid "could not open archive location \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ архівне Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ \"%s\":%m" - -#: pg_archivecleanup.c:237 +#: pg_archivecleanup.c:245 #, c-format msgid "invalid file name argument" msgstr "недійÑна назва файла з аргументом" -#: pg_archivecleanup.c:238 pg_archivecleanup.c:313 pg_archivecleanup.c:333 -#: pg_archivecleanup.c:345 pg_archivecleanup.c:352 +#: pg_archivecleanup.c:246 pg_archivecleanup.c:334 pg_archivecleanup.c:354 +#: pg_archivecleanup.c:366 pg_archivecleanup.c:373 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." -#: pg_archivecleanup.c:251 +#: pg_archivecleanup.c:259 #, c-format msgid "%s removes older WAL files from PostgreSQL archives.\n\n" msgstr "%s видалÑÑ” Ñтарі WAL-файли з архівів PostgreSQL.\n\n" -#: pg_archivecleanup.c:252 +#: pg_archivecleanup.c:260 #, c-format msgid "Usage:\n" msgstr "ВикориÑтаннÑ:\n" -#: pg_archivecleanup.c:253 +#: pg_archivecleanup.c:261 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr " %s [OPTION]... РОЗТÐШУВÐÐÐЯ_ÐРХІВРÐÐЙДÐÐ’ÐІШИЙ_ЗБЕРЕЖЕÐИЙ_WAL_ФÐЙЛ\n" -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:262 #, c-format msgid "\n" "Options:\n" msgstr "\n" "Параметри:\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:263 #, c-format -msgid " -d generate debug output (verbose mode)\n" -msgstr " -d генерує налагоджувальні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ (детальний режим)\n" +msgid " -b, --clean-backup-history clean up files including backup history files\n" +msgstr " -b, --clean-backup-history очиÑтити файли, включаючи файли Ñ–Ñторії резервного копіюваннÑ\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:264 #, c-format -msgid " -n dry run, show the names of the files that would be removed\n" -msgstr " -n Ñухий запуÑк, показує тільки ті файли, Ñкі будуть видалені\n" +msgid " -d, --debug generate debug output (verbose mode)\n" +msgstr " -d, --debug генерувати налагоджувальний вивід (розгорнутий режим)\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:265 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version показати верÑÑ–ÑŽ, потім вийти\n" +msgid " -n, --dry-run dry run, show the names of the files that would be\n" +" removed\n" +msgstr " -n, --dry-run Ñухий запуÑк, показати назви файлів, Ñкі будуть\n" +" вилучені\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:267 #, c-format -msgid " -x EXT clean up files if they have this extension\n" -msgstr " -x EXT прибрати файли з цим розширеннÑм\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:268 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help показати цю довідку, потім вийти\n" +msgid " -x, --strip-extension=EXT strip this extension before identifying files for\n" +" clean up\n" +msgstr " -x, --strip-extension=EXT вилучати це Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ ідентифікацією файлів длÑ\n" +" очищеннÑ\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:270 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help показати цю довідку, потім вийти\n" + +#: pg_archivecleanup.c:271 #, c-format msgid "\n" "For use as archive_cleanup_command in postgresql.conf:\n" @@ -133,7 +153,7 @@ msgstr "\n" "напр.\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" -#: pg_archivecleanup.c:265 +#: pg_archivecleanup.c:276 #, c-format msgid "\n" "Or for use as a standalone archive cleaner:\n" @@ -144,29 +164,29 @@ msgstr "\n" "наприклад:\n" " pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:269 +#: pg_archivecleanup.c:280 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "ПовідомлÑти про помилки на <%s>.\n" -#: pg_archivecleanup.c:270 +#: pg_archivecleanup.c:281 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" -#: pg_archivecleanup.c:332 +#: pg_archivecleanup.c:353 #, c-format msgid "must specify archive location" msgstr "необхідно вказати Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ð°" -#: pg_archivecleanup.c:344 +#: pg_archivecleanup.c:365 #, c-format msgid "must specify oldest kept WAL file" msgstr "необхідно вказати найдавніший збережений WAL-файл" -#: pg_archivecleanup.c:351 +#: pg_archivecleanup.c:372 #, c-format msgid "too many command-line arguments" msgstr "занадто багато аргументів командного Ñ€Ñдка" diff --git a/src/bin/pg_archivecleanup/po/zh_CN.po b/src/bin/pg_archivecleanup/po/zh_CN.po index e8c33482e1750..ae2cc68e75c68 100644 --- a/src/bin/pg_archivecleanup/po/zh_CN.po +++ b/src/bin/pg_archivecleanup/po/zh_CN.po @@ -1,92 +1,98 @@ # LANGUAGE message translation file for pg_archivecleanup # Copyright (C) 2019 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. -# FIRST AUTHOR , 2019. +# Dianjin Wang , 2024. # msgid "" msgstr "" -"Project-Id-Version: pg_archivecleanup (PostgreSQL) 14\n" +"Project-Id-Version: pg_archivecleanup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-08-14 05:48+0000\n" -"PO-Revision-Date: 2021-08-14 19:40+0800\n" -"Last-Translator: Jie Zhang \n" +"POT-Creation-Date: 2024-06-06 01:23+0000\n" +"PO-Revision-Date: 2024-06-06 16:40+0800\n" +"Last-Translator: Dianjin Wang \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.4.4\n" -#: ../../../src/common/logging.c:259 -#, c-format -msgid "fatal: " -msgstr "致命的: " - -#: ../../../src/common/logging.c:266 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "错误: " -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " -#: pg_archivecleanup.c:66 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "详细信æ¯: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "æç¤º: " + +#: pg_archivecleanup.c:68 #, c-format msgid "archive location \"%s\" does not exist" -msgstr "存档ä½ç½®\"%s\"ä¸å­˜åœ¨" +msgstr "存档ä½ç½® \"%s\" ä¸å­˜åœ¨" -#: pg_archivecleanup.c:152 +#: pg_archivecleanup.c:100 +#, c-format +msgid "could not open archive location \"%s\": %m" +msgstr "无法打开存档ä½ç½® \"%s\": %m" + +#: pg_archivecleanup.c:164 #, c-format msgid "could not remove file \"%s\": %m" msgstr "无法删除文件 \"%s\": %m" -#: pg_archivecleanup.c:160 +#: pg_archivecleanup.c:169 #, c-format msgid "could not read archive location \"%s\": %m" -msgstr "无法读å–存档ä½ç½®\"%s\": %m" +msgstr "无法读å–存档ä½ç½® \"%s\": %m" -#: pg_archivecleanup.c:163 +#: pg_archivecleanup.c:172 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "无法关闭存档ä½ç½® \"%s\": %m" -#: pg_archivecleanup.c:167 -#, c-format -msgid "could not open archive location \"%s\": %m" -msgstr "无法打开存档ä½ç½®\"%s\": %m" - -#: pg_archivecleanup.c:240 +#: pg_archivecleanup.c:245 #, c-format msgid "invalid file name argument" msgstr "文件å傿•°æ— æ•ˆ" -#: pg_archivecleanup.c:241 pg_archivecleanup.c:315 pg_archivecleanup.c:336 -#: pg_archivecleanup.c:348 pg_archivecleanup.c:355 +#: pg_archivecleanup.c:246 pg_archivecleanup.c:334 pg_archivecleanup.c:354 +#: pg_archivecleanup.c:366 pg_archivecleanup.c:373 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "请用 \"%s --help\" èŽ·å–æ›´å¤šçš„ä¿¡æ¯.\n" +msgid "Try \"%s --help\" for more information." +msgstr "请用 \"%s --help\" èŽ·å–æ›´å¤šçš„ä¿¡æ¯." -#: pg_archivecleanup.c:254 +#: pg_archivecleanup.c:259 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" "\n" msgstr "" -"%s 从PostgreSQL存档中删除旧的WAL文件.\n" +"%s 从 PostgreSQL 存档中删除旧的 WAL 文件.\n" "\n" -#: pg_archivecleanup.c:255 +#: pg_archivecleanup.c:260 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_archivecleanup.c:256 +#: pg_archivecleanup.c:261 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" -msgstr " %s [OPTION]... 归档文件ä½ç½® 最早ä¿å­˜çš„WAL文件\n" +msgstr " %s [选项]... 归档文件ä½ç½® 最早ä¿å­˜çš„WAL文件\n" -#: pg_archivecleanup.c:257 +#: pg_archivecleanup.c:262 #, c-format msgid "" "\n" @@ -95,32 +101,45 @@ msgstr "" "\n" "选项:\n" -#: pg_archivecleanup.c:258 +#: pg_archivecleanup.c:263 #, c-format -msgid " -d generate debug output (verbose mode)\n" -msgstr " -d 生æˆè°ƒè¯•输出(详细模å¼ï¼‰\n" +msgid " -b, --clean-backup-history clean up files including backup history files\n" +msgstr " -b, --clean-backup-history 清ç†åŒ…æ‹¬å¤‡ä»½åŽ†å²æ–‡ä»¶åœ¨å†…的文件\n" -#: pg_archivecleanup.c:259 +#: pg_archivecleanup.c:264 #, c-format -msgid " -n dry run, show the names of the files that would be removed\n" -msgstr " -n dryè¿è¡Œï¼Œæ˜¾ç¤ºè¦åˆ é™¤çš„æ–‡ä»¶çš„åç§°\n" +msgid " -d, --debug generate debug output (verbose mode)\n" +msgstr " -d, --debug 生æˆè°ƒè¯•输出(详细模å¼)\n" -#: pg_archivecleanup.c:260 +#: pg_archivecleanup.c:265 #, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version 输出版本信æ¯ï¼Œç„¶åŽé€€å‡º\n" +msgid "" +" -n, --dry-run dry run, show the names of the files that would be\n" +" removed\n" +msgstr "" +" -n, --dry-run 模拟è¿è¡Œ, 显示è¦è¢«åˆ é™¤çš„æ–‡ä»¶åç§°\n" +" \n" -#: pg_archivecleanup.c:261 +#: pg_archivecleanup.c:267 #, c-format -msgid " -x EXT clean up files if they have this extension\n" -msgstr " -x EXT 如果文件具有此扩展å,则清除文件\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version 输出版本信æ¯ï¼Œç„¶åŽé€€å‡º\n" -#: pg_archivecleanup.c:262 +#: pg_archivecleanup.c:268 +#, c-format +msgid "" +" -x, --strip-extension=EXT strip this extension before identifying files for\n" +" clean up\n" +msgstr "" +" -x, --strip-extension=EXT åœ¨è¯†åˆ«è¦æ¸…ç†çš„æ–‡ä»¶å‰ç§»é™¤è¯¥æ‰©å±•\n" +" \n" + +#: pg_archivecleanup.c:270 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help 显示帮助信æ¯ï¼Œç„¶åŽé€€å‡º\n" +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help 显示此帮助,然åŽé€€å‡º\n" -#: pg_archivecleanup.c:263 +#: pg_archivecleanup.c:271 #, c-format msgid "" "\n" @@ -130,12 +149,12 @@ msgid "" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" msgstr "" "\n" -"在postgresql.conf中,archive_cleanup_command的用法 \n" +"在 postgresql.conf 中,archive_cleanup_command 的用法为:\n" " archive_cleanup_command = 'pg_archivecleanup [选项]... 存档ä½ç½® %%r'\n" -"例.\n" +"例如:\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" -#: pg_archivecleanup.c:268 +#: pg_archivecleanup.c:276 #, c-format msgid "" "\n" @@ -144,36 +163,55 @@ msgid "" " pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n" msgstr "" "\n" -"或者,用作独立存档清ç†ç¨‹åº:\n" -"例.\n" +"或者,将其用作独立存档清ç†ç¨‹åº:\n" +"例如:\n" " pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:272 +#: pg_archivecleanup.c:280 #, c-format msgid "" "\n" "Report bugs to <%s>.\n" msgstr "" "\n" -"臭虫报告至<%s>.\n" +"报告缺陷: <%s>.\n" -#: pg_archivecleanup.c:273 +#: pg_archivecleanup.c:281 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 主页: <%s>\n" -#: pg_archivecleanup.c:335 +#: pg_archivecleanup.c:353 #, c-format msgid "must specify archive location" msgstr "必须指定存档ä½ç½®" -#: pg_archivecleanup.c:347 +#: pg_archivecleanup.c:365 #, c-format msgid "must specify oldest kept WAL file" -msgstr "必须指定最早ä¿å­˜çš„WAL文件" +msgstr "必须指定最早ä¿å­˜çš„ WAL 文件" -#: pg_archivecleanup.c:354 +#: pg_archivecleanup.c:372 #, c-format msgid "too many command-line arguments" msgstr "å‘½ä»¤è¡Œå‚æ•°å¤ªå¤š" +#, c-format +#~ msgid " -?, --help show this help, then exit\n" +#~ msgstr " -?, --help 显示帮助信æ¯ï¼Œç„¶åŽé€€å‡º\n" + +#, c-format +#~ msgid " -V, --version output version information, then exit\n" +#~ msgstr " -V, --version 输出版本信æ¯ï¼Œç„¶åŽé€€å‡º\n" + +#, c-format +#~ msgid " -x EXT clean up files if they have this extension\n" +#~ msgstr " -x EXT 如果文件具有此扩展å,则清除文件\n" + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "请用 \"%s --help\" èŽ·å–æ›´å¤šçš„ä¿¡æ¯.\n" + +#, c-format +#~ msgid "fatal: " +#~ msgstr "致命的: " diff --git a/src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl b/src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl index cc3386d1464e1..91a98c71e9974 100644 --- a/src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl +++ b/src/bin/pg_archivecleanup/t/010_pg_archivecleanup.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; @@ -12,22 +12,46 @@ my $tempdir = PostgreSQL::Test::Utils::tempdir; -my @walfiles = ( - '00000001000000370000000C.gz', '00000001000000370000000D', - '00000001000000370000000E', '00000001000000370000000F.partial',); +# WAL file patterns created before running each sub-scenario. "present" +# tracks if the file with "name" still exists or not after running +# pg_archivecleanup. +my @walfiles_verbose = ( + { name => '00000001000000370000000D', present => 0 }, + { name => '00000001000000370000000E', present => 1 }); +my @walfiles_with_gz = ( + { name => '00000001000000370000000C.gz', present => 0 }, + { name => '00000001000000370000000D', present => 0 }, + { name => '00000001000000370000000D.backup', present => 1 }, + { name => '00000001000000370000000E', present => 1 }, + { name => '00000001000000370000000F.partial', present => 1 }, + { name => 'unrelated_file', present => 1 }); +my @walfiles_for_clean_backup_history = ( + { name => '00000001000000370000000D', present => 0 }, + { name => '00000001000000370000000D.00000028.backup', present => 0 }, + { name => '00000001000000370000000E', present => 1 }, + { name => '00000001000000370000000F.partial', present => 1 }, + { name => 'unrelated_file', present => 1 }); sub create_files { - foreach my $fn (@walfiles, 'unrelated_file') + foreach my $fn (map { $_->{name} } @_) { - open my $file, '>', "$tempdir/$fn"; + open my $file, '>', "$tempdir/$fn" or die $!; + print $file 'CONTENT'; close $file; } return; } -create_files(); +sub remove_files +{ + foreach my $fn (map { $_->{name} } @_) + { + unlink "$tempdir/$fn"; + } + return; +} command_fails_like( ['pg_archivecleanup'], @@ -54,54 +78,86 @@ sub create_files qr/invalid file name argument/, 'fails with invalid restart file name'); +# Test a dry run, no files are physically removed, but logs are generated +# to show what would be removed. { - # like command_like but checking stderr + create_files(@walfiles_verbose); + my $stderr; + my $oldestkeptwalfile = '00000001000000370000000E'; my $result = IPC::Run::run [ 'pg_archivecleanup', '-d', '-n', $tempdir, - $walfiles[2] ], + $oldestkeptwalfile ], '2>', \$stderr; ok($result, "pg_archivecleanup dry run: exit code 0"); - like( - $stderr, - qr/$walfiles[1].*would be removed/, - "pg_archivecleanup dry run: matches"); - foreach my $fn (@walfiles) + + for my $walpair (@walfiles_verbose) + { + if ($walpair->{present}) + { + unlike( + $stderr, + qr/$walpair->{name}.*would be removed/, + "pg_archivecleanup dry run for $walpair->{name}: matches"); + } + else + { + like( + $stderr, + qr/$walpair->{name}.*would be removed/, + "pg_archivecleanup dry run for $walpair->{name}: matches"); + } + } + foreach my $fn (map { $_->{name} } @walfiles_verbose) { ok(-f "$tempdir/$fn", "$fn not removed"); } + + remove_files(@walfiles_verbose); } sub run_check { local $Test::Builder::Level = $Test::Builder::Level + 1; - my ($suffix, $test_name) = @_; + my ($testdata, $oldestkeptwalfile, $test_name, @options) = @_; - create_files(); + create_files(@$testdata); command_ok( - [ - 'pg_archivecleanup', '-x', '.gz', $tempdir, - $walfiles[2] . $suffix - ], + [ 'pg_archivecleanup', @options, $tempdir, $oldestkeptwalfile ], "$test_name: runs"); - ok(!-f "$tempdir/$walfiles[0]", - "$test_name: first older WAL file was cleaned up"); - ok(!-f "$tempdir/$walfiles[1]", - "$test_name: second older WAL file was cleaned up"); - ok(-f "$tempdir/$walfiles[2]", - "$test_name: restartfile was not cleaned up"); - ok(-f "$tempdir/$walfiles[3]", - "$test_name: newer WAL file was not cleaned up"); - ok(-f "$tempdir/unrelated_file", - "$test_name: unrelated file was not cleaned up"); + for my $walpair (@$testdata) + { + if ($walpair->{present}) + { + ok(-f "$tempdir/$walpair->{name}", + "$test_name:$walpair->{name} was not cleaned up"); + } + else + { + ok(!-f "$tempdir/$walpair->{name}", + "$test_name:$walpair->{name} was cleaned up"); + } + } + + remove_files(@$testdata); return; } -run_check('', 'pg_archivecleanup'); -run_check('.partial', 'pg_archivecleanup with .partial file'); -run_check('.00000020.backup', 'pg_archivecleanup with .backup file'); +run_check(\@walfiles_with_gz, '00000001000000370000000E', + 'pg_archivecleanup', '-x.gz'); +run_check( + \@walfiles_with_gz, + '00000001000000370000000E.partial', + 'pg_archivecleanup with .partial file', '-x.gz'); +run_check( + \@walfiles_with_gz, + '00000001000000370000000E.00000020.backup', + 'pg_archivecleanup with .backup file', '-x.gz'); +run_check(\@walfiles_for_clean_backup_history, + '00000001000000370000000E', + 'pg_archivecleanup with --clean-backup-history', '-b'); done_testing(); diff --git a/src/bin/pg_basebackup/.gitignore b/src/bin/pg_basebackup/.gitignore index 26048bdbd8432..14d5de6c01eed 100644 --- a/src/bin/pg_basebackup/.gitignore +++ b/src/bin/pg_basebackup/.gitignore @@ -1,4 +1,5 @@ /pg_basebackup +/pg_createsubscriber /pg_receivewal /pg_recvlogical diff --git a/src/bin/pg_basebackup/Makefile b/src/bin/pg_basebackup/Makefile index 893a75c942d7e..26c53e473f560 100644 --- a/src/bin/pg_basebackup/Makefile +++ b/src/bin/pg_basebackup/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/pg_basebackup # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/bin/pg_basebackup/Makefile @@ -35,9 +35,6 @@ OBJS = \ streamutil.o \ walmethods.o -# If you add or remove files here, also update Mkvcbuild.pm, which only knows -# about OBJS, not BBOBJS, and thus has to be manually updated to stay in sync -# with this list. BBOBJS = \ pg_basebackup.o \ bbstreamer_file.o \ @@ -47,11 +44,14 @@ BBOBJS = \ bbstreamer_tar.o \ bbstreamer_zstd.o -all: pg_basebackup pg_receivewal pg_recvlogical +all: pg_basebackup pg_createsubscriber pg_receivewal pg_recvlogical pg_basebackup: $(BBOBJS) $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils $(CC) $(CFLAGS) $(BBOBJS) $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) +pg_createsubscriber: pg_createsubscriber.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils + $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) + pg_receivewal: pg_receivewal.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils $(CC) $(CFLAGS) pg_receivewal.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) @@ -60,6 +60,7 @@ pg_recvlogical: pg_recvlogical.o $(OBJS) | submake-libpq submake-libpgport subma install: all installdirs $(INSTALL_PROGRAM) pg_basebackup$(X) '$(DESTDIR)$(bindir)/pg_basebackup$(X)' + $(INSTALL_PROGRAM) pg_createsubscriber$(X) '$(DESTDIR)$(bindir)/pg_createsubscriber$(X)' $(INSTALL_PROGRAM) pg_receivewal$(X) '$(DESTDIR)$(bindir)/pg_receivewal$(X)' $(INSTALL_PROGRAM) pg_recvlogical$(X) '$(DESTDIR)$(bindir)/pg_recvlogical$(X)' @@ -68,12 +69,13 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_basebackup$(X)' + rm -f '$(DESTDIR)$(bindir)/pg_createsubscriber$(X)' rm -f '$(DESTDIR)$(bindir)/pg_receivewal$(X)' rm -f '$(DESTDIR)$(bindir)/pg_recvlogical$(X)' -clean distclean maintainer-clean: - rm -f pg_basebackup$(X) pg_receivewal$(X) pg_recvlogical$(X) \ - $(BBOBJS) pg_receivewal.o pg_recvlogical.o \ +clean distclean: + rm -f pg_basebackup$(X) pg_createsubscriber$(X) pg_receivewal$(X) pg_recvlogical$(X) \ + $(BBOBJS) pg_createsubscriber.o pg_receivewal.o pg_recvlogical.o \ $(OBJS) rm -rf tmp_check diff --git a/src/bin/pg_basebackup/bbstreamer.h b/src/bin/pg_basebackup/bbstreamer.h index f999e635d9894..3b820f13b519a 100644 --- a/src/bin/pg_basebackup/bbstreamer.h +++ b/src/bin/pg_basebackup/bbstreamer.h @@ -12,7 +12,7 @@ * make further decisions about how to process the data; for example, * it might choose to modify the archive contents. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/bbstreamer.h @@ -56,7 +56,7 @@ typedef enum BBSTREAMER_MEMBER_HEADER, BBSTREAMER_MEMBER_CONTENTS, BBSTREAMER_MEMBER_TRAILER, - BBSTREAMER_ARCHIVE_TRAILER + BBSTREAMER_ARCHIVE_TRAILER, } bbstreamer_archive_context; /* diff --git a/src/bin/pg_basebackup/bbstreamer_file.c b/src/bin/pg_basebackup/bbstreamer_file.c index 45f32974ff6e3..0be39dddc977a 100644 --- a/src/bin/pg_basebackup/bbstreamer_file.c +++ b/src/bin/pg_basebackup/bbstreamer_file.c @@ -2,7 +2,7 @@ * * bbstreamer_file.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/bbstreamer_file.c @@ -14,8 +14,8 @@ #include #include "bbstreamer.h" -#include "common/logging.h" #include "common/file_perm.h" +#include "common/logging.h" #include "common/string.h" typedef struct bbstreamer_plain_writer @@ -296,6 +296,7 @@ should_allow_existing_directory(const char *pathname) if (strcmp(filename, "pg_wal") == 0 || strcmp(filename, "pg_xlog") == 0 || strcmp(filename, "archive_status") == 0 || + strcmp(filename, "summaries") == 0 || strcmp(filename, "pg_tblspc") == 0) return true; diff --git a/src/bin/pg_basebackup/bbstreamer_gzip.c b/src/bin/pg_basebackup/bbstreamer_gzip.c index 3bdbfa0bc43ef..4659314afd235 100644 --- a/src/bin/pg_basebackup/bbstreamer_gzip.c +++ b/src/bin/pg_basebackup/bbstreamer_gzip.c @@ -2,7 +2,7 @@ * * bbstreamer_gzip.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/bbstreamer_gzip.c @@ -18,8 +18,8 @@ #endif #include "bbstreamer.h" -#include "common/logging.h" #include "common/file_perm.h" +#include "common/logging.h" #include "common/string.h" #ifdef HAVE_LIBZ @@ -269,7 +269,7 @@ bbstreamer_gzip_decompressor_content(bbstreamer *streamer, mystreamer = (bbstreamer_gzip_decompressor *) streamer; zs = &mystreamer->zstream; - zs->next_in = (uint8 *) data; + zs->next_in = (const uint8 *) data; zs->avail_in = len; /* Process the current chunk */ diff --git a/src/bin/pg_basebackup/bbstreamer_inject.c b/src/bin/pg_basebackup/bbstreamer_inject.c index a7de2a172b8a6..1f598091819e0 100644 --- a/src/bin/pg_basebackup/bbstreamer_inject.c +++ b/src/bin/pg_basebackup/bbstreamer_inject.c @@ -2,7 +2,7 @@ * * bbstreamer_inject.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/bbstreamer_inject.c diff --git a/src/bin/pg_basebackup/bbstreamer_lz4.c b/src/bin/pg_basebackup/bbstreamer_lz4.c index 395fcb92795c0..eda62caeded4d 100644 --- a/src/bin/pg_basebackup/bbstreamer_lz4.c +++ b/src/bin/pg_basebackup/bbstreamer_lz4.c @@ -2,7 +2,7 @@ * * bbstreamer_lz4.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/bbstreamer_lz4.c @@ -18,8 +18,8 @@ #endif #include "bbstreamer.h" -#include "common/logging.h" #include "common/file_perm.h" +#include "common/logging.h" #include "common/string.h" #ifdef USE_LZ4 diff --git a/src/bin/pg_basebackup/bbstreamer_tar.c b/src/bin/pg_basebackup/bbstreamer_tar.c index 03d7fd3375a85..dec71ea65b3de 100644 --- a/src/bin/pg_basebackup/bbstreamer_tar.c +++ b/src/bin/pg_basebackup/bbstreamer_tar.c @@ -12,7 +12,7 @@ * just adds two blocks of NUL bytes to the end of the file, since older * server versions produce files with this terminator omitted. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/bbstreamer_tar.c @@ -286,22 +286,20 @@ bbstreamer_tar_header(bbstreamer_tar_parser *mystreamer) /* * Parse key fields out of the header. - * - * FIXME: It's terrible that we use hard-coded values here instead of some - * more principled approach. It's been like this for a long time, but we - * ought to do better. */ - strlcpy(member->pathname, &buffer[0], MAXPGPATH); + strlcpy(member->pathname, &buffer[TAR_OFFSET_NAME], MAXPGPATH); if (member->pathname[0] == '\0') pg_fatal("tar member has empty name"); - member->size = read_tar_number(&buffer[124], 12); - member->mode = read_tar_number(&buffer[100], 8); - member->uid = read_tar_number(&buffer[108], 8); - member->gid = read_tar_number(&buffer[116], 8); - member->is_directory = (buffer[156] == '5'); - member->is_link = (buffer[156] == '2'); + member->size = read_tar_number(&buffer[TAR_OFFSET_SIZE], 12); + member->mode = read_tar_number(&buffer[TAR_OFFSET_MODE], 8); + member->uid = read_tar_number(&buffer[TAR_OFFSET_UID], 8); + member->gid = read_tar_number(&buffer[TAR_OFFSET_GID], 8); + member->is_directory = + (buffer[TAR_OFFSET_TYPEFLAG] == TAR_FILETYPE_DIRECTORY); + member->is_link = + (buffer[TAR_OFFSET_TYPEFLAG] == TAR_FILETYPE_SYMLINK); if (member->is_link) - strlcpy(member->linktarget, &buffer[157], 100); + strlcpy(member->linktarget, &buffer[TAR_OFFSET_LINKNAME], 100); /* Compute number of padding bytes. */ mystreamer->pad_bytes_expected = tarPaddingBytesRequired(member->size); @@ -347,7 +345,7 @@ bbstreamer_tar_parser_free(bbstreamer *streamer) } /* - * Create an bbstreamer that can generate a tar archive. + * Create a bbstreamer that can generate a tar archive. * * This is intended to be usable either for generating a brand-new tar archive * or for modifying one on the fly. The input should be a series of typed diff --git a/src/bin/pg_basebackup/bbstreamer_zstd.c b/src/bin/pg_basebackup/bbstreamer_zstd.c index 58e32ca5bb089..9e09f8f90bfcf 100644 --- a/src/bin/pg_basebackup/bbstreamer_zstd.c +++ b/src/bin/pg_basebackup/bbstreamer_zstd.c @@ -2,7 +2,7 @@ * * bbstreamer_zstd.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/bbstreamer_zstd.c diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build index c426173db3a0f..c00acd5e11828 100644 --- a/src/bin/pg_basebackup/meson.build +++ b/src/bin/pg_basebackup/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group common_sources = files( 'bbstreamer_file.c', @@ -38,6 +38,24 @@ pg_basebackup = executable('pg_basebackup', bin_targets += pg_basebackup +pg_createsubscriber_sources = files( + 'pg_createsubscriber.c' +) + +if host_system == 'windows' + pg_createsubscriber_sources += rc_bin_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'pg_createsubscriber', + '--FILEDESC', 'pg_createsubscriber - create a new logical replica from a standby server',]) +endif + +pg_createsubscriber = executable('pg_createsubscriber', + pg_createsubscriber_sources, + dependencies: [frontend_code, libpq], + kwargs: default_bin_args, +) +bin_targets += pg_createsubscriber + + pg_receivewal_sources = files( 'pg_receivewal.c', ) @@ -80,8 +98,8 @@ tests += { 'sd': meson.current_source_dir(), 'bd': meson.current_build_dir(), 'tap': { - 'env': {'GZIP_PROGRAM': gzip.path(), - 'TAR': tar.path(), + 'env': {'GZIP_PROGRAM': gzip.found() ? gzip.path() : '', + 'TAR': tar.found() ? tar.path() : '', 'LZ4': program_lz4.found() ? program_lz4.path() : '', }, 'tests': [ @@ -89,6 +107,7 @@ tests += { 't/011_in_place_tablespace.pl', 't/020_pg_receivewal.pl', 't/030_pg_recvlogical.pl', + 't/040_pg_createsubscriber.pl', ], }, } diff --git a/src/bin/pg_basebackup/nls.mk b/src/bin/pg_basebackup/nls.mk index fc475003e8ee2..384dbb021e922 100644 --- a/src/bin/pg_basebackup/nls.mk +++ b/src/bin/pg_basebackup/nls.mk @@ -8,15 +8,19 @@ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ bbstreamer_tar.c \ bbstreamer_zstd.c \ pg_basebackup.c \ + pg_createsubscriber.c \ pg_receivewal.c \ pg_recvlogical.c \ receivelog.c \ streamutil.c \ walmethods.c \ ../../common/compression.c \ + ../../common/controldata_utils.c \ ../../common/fe_memutils.c \ ../../common/file_utils.c \ + ../../common/restricted_token.c \ ../../fe_utils/option_utils.c \ - ../../fe_utils/recovery_gen.c + ../../fe_utils/recovery_gen.c \ + ../../fe_utils/string_utils.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index 1dc8efe0cb7be..8f3dd04fd2226 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -4,7 +4,7 @@ * * Author: Magnus Hagander * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/pg_basebackup.c @@ -101,6 +101,11 @@ typedef void (*WriteDataCallback) (size_t nbytes, char *buf, */ #define MINIMUM_VERSION_FOR_TERMINATED_TARFILE 150000 +/* + * pg_wal/summaries exists beginning with version 17. + */ +#define MINIMUM_VERSION_FOR_WAL_SUMMARIES 170000 + /* * Different ways to include WAL */ @@ -108,7 +113,7 @@ typedef enum { NO_WAL, FETCH_WAL, - STREAM_WAL + STREAM_WAL, } IncludeWal; /* @@ -118,7 +123,7 @@ typedef enum { COMPRESS_LOCATION_UNSPECIFIED, COMPRESS_LOCATION_CLIENT, - COMPRESS_LOCATION_SERVER + COMPRESS_LOCATION_SERVER, } CompressionLocation; /* Global options */ @@ -148,6 +153,7 @@ static bool verify_checksums = true; static bool manifest = true; static bool manifest_force_encode = false; static char *manifest_checksums = NULL; +static DataDirSyncMethod sync_method = DATA_DIR_SYNC_METHOD_FSYNC; static bool success = false; static bool made_new_pgdata = false; @@ -216,7 +222,8 @@ static void ReceiveBackupManifestInMemoryChunk(size_t r, char *copybuf, void *callback_data); static void BaseBackup(char *compression_algorithm, char *compression_detail, CompressionLocation compressloc, - pg_compress_specification *client_compress); + pg_compress_specification *client_compress, + char *incremental_manifest); static bool reached_end_position(XLogRecPtr segendpos, uint32 timeline, bool segment_finished); @@ -389,6 +396,8 @@ usage(void) printf(_("\nOptions controlling the output:\n")); printf(_(" -D, --pgdata=DIRECTORY receive base backup into directory\n")); printf(_(" -F, --format=p|t output format (plain (default), tar)\n")); + printf(_(" -i, --incremental=OLDMANIFEST\n" + " take incremental backup\n")); printf(_(" -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" " (in kB/s, or use suffix \"k\" or \"M\")\n")); printf(_(" -R, --write-recovery-conf\n" @@ -406,7 +415,7 @@ usage(void) printf(_(" -Z, --compress=none do not compress tar output\n")); printf(_("\nGeneral options:\n")); printf(_(" -c, --checkpoint=fast|spread\n" - " set fast or spread checkpointing\n")); + " set fast or spread (default) checkpointing\n")); printf(_(" -C, --create-slot create replication slot\n")); printf(_(" -l, --label=LABEL set backup label\n")); printf(_(" -n, --no-clean do not clean up after errors\n")); @@ -424,6 +433,8 @@ usage(void) printf(_(" --no-slot prevent creation of temporary replication slot\n")); printf(_(" --no-verify-checksums\n" " do not verify checksums\n")); + printf(_(" --sync-method=METHOD\n" + " set method for syncing files to disk\n")); printf(_(" -?, --help show this help, then exit\n")); printf(_("\nConnection options:\n")); printf(_(" -d, --dbname=CONNSTR connection string\n")); @@ -651,7 +662,8 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier, * Create replication slot if requested */ if (temp_replication_slot && !replication_slot) - replication_slot = psprintf("pg_basebackup_%d", (int) PQbackendPID(param->bgconn)); + replication_slot = psprintf("pg_basebackup_%u", + (unsigned int) PQbackendPID(param->bgconn)); if (temp_replication_slot || create_slot) { if (!CreateReplicationSlot(param->bgconn, replication_slot, NULL, @@ -684,6 +696,21 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier, if (pg_mkdir_p(statusdir, pg_dir_create_mode) != 0 && errno != EEXIST) pg_fatal("could not create directory \"%s\": %m", statusdir); + + /* + * For newer server versions, likewise create pg_wal/summaries + */ + if (PQserverVersion(conn) >= MINIMUM_VERSION_FOR_WAL_SUMMARIES) + { + char summarydir[MAXPGPATH]; + + snprintf(summarydir, sizeof(summarydir), "%s/%s/summaries", + basedir, "pg_wal"); + + if (pg_mkdir_p(summarydir, pg_dir_create_mode) != 0 && + errno != EEXIST) + pg_fatal("could not create directory \"%s\": %m", summarydir); + } } /* @@ -1724,7 +1751,9 @@ ReceiveBackupManifestInMemoryChunk(size_t r, char *copybuf, static void BaseBackup(char *compression_algorithm, char *compression_detail, - CompressionLocation compressloc, pg_compress_specification *client_compress) + CompressionLocation compressloc, + pg_compress_specification *client_compress, + char *incremental_manifest) { PGresult *res; char *sysidentifier; @@ -1778,10 +1807,18 @@ BaseBackup(char *compression_algorithm, char *compression_detail, } /* - * Build contents of configuration file if requested + * Build contents of configuration file if requested. + * + * Note that we don't use the dbname from key-value pair in conn as that + * would have been filled by the default dbname (dbname=replication) in + * case the user didn't specify the one. The dbname written in the config + * file as part of primary_conninfo would be used by slotsync worker which + * doesn't use a replication connection so the default won't work for it. */ if (writerecoveryconf) - recoveryconfcontents = GenerateRecoveryConfig(conn, replication_slot); + recoveryconfcontents = GenerateRecoveryConfig(conn, + replication_slot, + GetDbnameFromConnectionOptions()); /* * Run IDENTIFY_SYSTEM so we can get the timeline @@ -1790,7 +1827,76 @@ BaseBackup(char *compression_algorithm, char *compression_detail, exit(1); /* - * Start the actual backup + * If the user wants an incremental backup, we must upload the manifest + * for the previous backup upon which it is to be based. + */ + if (incremental_manifest != NULL) + { + int fd; + char mbuf[65536]; + int nbytes; + + /* Reject if server is too old. */ + if (serverVersion < MINIMUM_VERSION_FOR_WAL_SUMMARIES) + pg_fatal("server does not support incremental backup"); + + /* Open the file. */ + fd = open(incremental_manifest, O_RDONLY | PG_BINARY, 0); + if (fd < 0) + pg_fatal("could not open file \"%s\": %m", incremental_manifest); + + /* Tell the server what we want to do. */ + if (PQsendQuery(conn, "UPLOAD_MANIFEST") == 0) + pg_fatal("could not send replication command \"%s\": %s", + "UPLOAD_MANIFEST", PQerrorMessage(conn)); + res = PQgetResult(conn); + if (PQresultStatus(res) != PGRES_COPY_IN) + { + if (PQresultStatus(res) == PGRES_FATAL_ERROR) + pg_fatal("could not upload manifest: %s", + PQerrorMessage(conn)); + else + pg_fatal("could not upload manifest: unexpected status %s", + PQresStatus(PQresultStatus(res))); + } + + /* Loop, reading from the file and sending the data to the server. */ + while ((nbytes = read(fd, mbuf, sizeof mbuf)) > 0) + { + if (PQputCopyData(conn, mbuf, nbytes) < 0) + pg_fatal("could not send COPY data: %s", + PQerrorMessage(conn)); + } + + /* Bail out if we exited the loop due to an error. */ + if (nbytes < 0) + pg_fatal("could not read file \"%s\": %m", incremental_manifest); + + /* End the COPY operation. */ + if (PQputCopyEnd(conn, NULL) < 0) + pg_fatal("could not send end-of-COPY: %s", + PQerrorMessage(conn)); + + /* See whether the server is happy with what we sent. */ + res = PQgetResult(conn); + if (PQresultStatus(res) == PGRES_FATAL_ERROR) + pg_fatal("could not upload manifest: %s", + PQerrorMessage(conn)); + else if (PQresultStatus(res) != PGRES_COMMAND_OK) + pg_fatal("could not upload manifest: unexpected status %s", + PQresStatus(PQresultStatus(res))); + + /* Consume ReadyForQuery message from server. */ + res = PQgetResult(conn); + if (res != NULL) + pg_fatal("unexpected extra result while sending manifest"); + + /* Add INCREMENTAL option to BASE_BACKUP command. */ + AppendPlainCommandOption(&buf, use_new_option_syntax, "INCREMENTAL"); + } + + /* + * Continue building up the options list for the BASE_BACKUP command. */ AppendStringCommandOption(&buf, use_new_option_syntax, "LABEL", label); if (estimatesize) @@ -1897,6 +2003,7 @@ BaseBackup(char *compression_algorithm, char *compression_detail, else basebkp = psprintf("BASE_BACKUP %s", buf.data); + /* OK, try to start the backup. */ if (PQsendQuery(conn, basebkp) == 0) pg_fatal("could not send replication command \"%s\": %s", "BASE_BACKUP", PQerrorMessage(conn)); @@ -2199,11 +2306,11 @@ BaseBackup(char *compression_algorithm, char *compression_detail, if (format == 't') { if (strcmp(basedir, "-") != 0) - (void) fsync_dir_recurse(basedir); + (void) sync_dir_recurse(basedir, sync_method); } else { - (void) fsync_pgdata(basedir, serverVersion); + (void) sync_pgdata(basedir, serverVersion, sync_method); } } @@ -2252,6 +2359,7 @@ main(int argc, char **argv) {"version", no_argument, NULL, 'V'}, {"pgdata", required_argument, NULL, 'D'}, {"format", required_argument, NULL, 'F'}, + {"incremental", required_argument, NULL, 'i'}, {"checkpoint", required_argument, NULL, 'c'}, {"create-slot", no_argument, NULL, 'C'}, {"max-rate", required_argument, NULL, 'r'}, @@ -2281,6 +2389,7 @@ main(int argc, char **argv) {"no-manifest", no_argument, NULL, 5}, {"manifest-force-encode", no_argument, NULL, 6}, {"manifest-checksums", required_argument, NULL, 7}, + {"sync-method", required_argument, NULL, 8}, {NULL, 0, NULL, 0} }; int c; @@ -2288,6 +2397,7 @@ main(int argc, char **argv) int option_index; char *compression_algorithm = "none"; char *compression_detail = NULL; + char *incremental_manifest = NULL; CompressionLocation compressloc = COMPRESS_LOCATION_UNSPECIFIED; pg_compress_specification client_compress; @@ -2312,7 +2422,7 @@ main(int argc, char **argv) atexit(cleanup_directories_atexit); - while ((c = getopt_long(argc, argv, "c:Cd:D:F:h:l:nNp:Pr:Rs:S:t:T:U:vwWX:zZ:", + while ((c = getopt_long(argc, argv, "c:Cd:D:F:h:i:l:nNp:Pr:Rs:S:t:T:U:vwWX:zZ:", long_options, &option_index)) != -1) { switch (c) @@ -2347,6 +2457,9 @@ main(int argc, char **argv) case 'h': dbhost = pg_strdup(optarg); break; + case 'i': + incremental_manifest = pg_strdup(optarg); + break; case 'l': label = pg_strdup(optarg); break; @@ -2452,6 +2565,10 @@ main(int argc, char **argv) case 7: manifest_checksums = pg_strdup(optarg); break; + case 8: + if (!parse_sync_method(optarg, &sync_method)) + exit(1); + break; default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -2756,7 +2873,7 @@ main(int argc, char **argv) } BaseBackup(compression_algorithm, compression_detail, compressloc, - &client_compress); + &client_compress, incremental_manifest); success = true; return 0; diff --git a/src/bin/pg_basebackup/pg_createsubscriber.c b/src/bin/pg_basebackup/pg_createsubscriber.c new file mode 100644 index 0000000000000..677c0cd0843bf --- /dev/null +++ b/src/bin/pg_basebackup/pg_createsubscriber.c @@ -0,0 +1,2254 @@ +/*------------------------------------------------------------------------- + * + * pg_createsubscriber.c + * Create a new logical replica from a standby server + * + * Copyright (C) 2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/bin/pg_basebackup/pg_createsubscriber.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres_fe.h" + +#include +#include +#include + +#include "catalog/pg_authid_d.h" +#include "common/connect.h" +#include "common/controldata_utils.h" +#include "common/file_perm.h" +#include "common/logging.h" +#include "common/pg_prng.h" +#include "common/restricted_token.h" +#include "fe_utils/recovery_gen.h" +#include "fe_utils/simple_list.h" +#include "fe_utils/string_utils.h" +#include "getopt_long.h" + +#define DEFAULT_SUB_PORT "50432" + +/* Command-line options */ +struct CreateSubscriberOptions +{ + char *config_file; /* configuration file */ + char *pub_conninfo_str; /* publisher connection string */ + char *socket_dir; /* directory for Unix-domain socket, if any */ + char *sub_port; /* subscriber port number */ + const char *sub_username; /* subscriber username */ + SimpleStringList database_names; /* list of database names */ + SimpleStringList pub_names; /* list of publication names */ + SimpleStringList sub_names; /* list of subscription names */ + SimpleStringList replslot_names; /* list of replication slot names */ + int recovery_timeout; /* stop recovery after this time */ +}; + +struct LogicalRepInfo +{ + char *dbname; /* database name */ + char *pubconninfo; /* publisher connection string */ + char *subconninfo; /* subscriber connection string */ + char *pubname; /* publication name */ + char *subname; /* subscription name */ + char *replslotname; /* replication slot name */ + + bool made_replslot; /* replication slot was created */ + bool made_publication; /* publication was created */ +}; + +static void cleanup_objects_atexit(void); +static void usage(); +static char *get_base_conninfo(const char *conninfo, char **dbname); +static char *get_sub_conninfo(const struct CreateSubscriberOptions *opt); +static char *get_exec_path(const char *argv0, const char *progname); +static void check_data_directory(const char *datadir); +static char *concat_conninfo_dbname(const char *conninfo, const char *dbname); +static struct LogicalRepInfo *store_pub_sub_info(const struct CreateSubscriberOptions *opt, + const char *pub_base_conninfo, + const char *sub_base_conninfo); +static PGconn *connect_database(const char *conninfo, bool exit_on_error); +static void disconnect_database(PGconn *conn, bool exit_on_error); +static uint64 get_primary_sysid(const char *conninfo); +static uint64 get_standby_sysid(const char *datadir); +static void modify_subscriber_sysid(const struct CreateSubscriberOptions *opt); +static bool server_is_in_recovery(PGconn *conn); +static char *generate_object_name(PGconn *conn); +static void check_publisher(const struct LogicalRepInfo *dbinfo); +static char *setup_publisher(struct LogicalRepInfo *dbinfo); +static void check_subscriber(const struct LogicalRepInfo *dbinfo); +static void setup_subscriber(struct LogicalRepInfo *dbinfo, + const char *consistent_lsn); +static void setup_recovery(const struct LogicalRepInfo *dbinfo, const char *datadir, + const char *lsn); +static void drop_primary_replication_slot(struct LogicalRepInfo *dbinfo, + const char *slotname); +static void drop_failover_replication_slots(struct LogicalRepInfo *dbinfo); +static char *create_logical_replication_slot(PGconn *conn, + struct LogicalRepInfo *dbinfo); +static void drop_replication_slot(PGconn *conn, struct LogicalRepInfo *dbinfo, + const char *slot_name); +static void pg_ctl_status(const char *pg_ctl_cmd, int rc); +static void start_standby_server(const struct CreateSubscriberOptions *opt, + bool restricted_access, + bool restrict_logical_worker); +static void stop_standby_server(const char *datadir); +static void wait_for_end_recovery(const char *conninfo, + const struct CreateSubscriberOptions *opt); +static void create_publication(PGconn *conn, struct LogicalRepInfo *dbinfo); +static void drop_publication(PGconn *conn, struct LogicalRepInfo *dbinfo); +static void create_subscription(PGconn *conn, const struct LogicalRepInfo *dbinfo); +static void set_replication_progress(PGconn *conn, const struct LogicalRepInfo *dbinfo, + const char *lsn); +static void enable_subscription(PGconn *conn, const struct LogicalRepInfo *dbinfo); +static void check_and_drop_existing_subscriptions(PGconn *conn, + const struct LogicalRepInfo *dbinfo); +static void drop_existing_subscriptions(PGconn *conn, const char *subname, + const char *dbname); + +#define USEC_PER_SEC 1000000 +#define WAIT_INTERVAL 1 /* 1 second */ + +static const char *progname; + +static char *primary_slot_name = NULL; +static bool dry_run = false; + +static bool success = false; + +static struct LogicalRepInfo *dbinfo; +static int num_dbs = 0; /* number of specified databases */ +static int num_pubs = 0; /* number of specified publications */ +static int num_subs = 0; /* number of specified subscriptions */ +static int num_replslots = 0; /* number of specified replication slots */ + +static pg_prng_state prng_state; + +static char *pg_ctl_path = NULL; +static char *pg_resetwal_path = NULL; + +/* standby / subscriber data directory */ +static char *subscriber_dir = NULL; + +static bool recovery_ended = false; +static bool standby_running = false; + +enum WaitPMResult +{ + POSTMASTER_READY, + POSTMASTER_STILL_STARTING +}; + + +/* + * Cleanup objects that were created by pg_createsubscriber if there is an + * error. + * + * Publications and replication slots are created on primary. Depending on the + * step it failed, it should remove the already created objects if it is + * possible (sometimes it won't work due to a connection issue). + * There is no cleanup on the target server. The steps on the target server are + * executed *after* promotion, hence, at this point, a failure means recreate + * the physical replica and start again. + */ +static void +cleanup_objects_atexit(void) +{ + if (success) + return; + + /* + * If the server is promoted, there is no way to use the current setup + * again. Warn the user that a new replication setup should be done before + * trying again. + */ + if (recovery_ended) + { + pg_log_warning("failed after the end of recovery"); + pg_log_warning_hint("The target server cannot be used as a physical replica anymore. " + "You must recreate the physical replica before continuing."); + } + + for (int i = 0; i < num_dbs; i++) + { + if (dbinfo[i].made_publication || dbinfo[i].made_replslot) + { + PGconn *conn; + + conn = connect_database(dbinfo[i].pubconninfo, false); + if (conn != NULL) + { + if (dbinfo[i].made_publication) + drop_publication(conn, &dbinfo[i]); + if (dbinfo[i].made_replslot) + drop_replication_slot(conn, &dbinfo[i], dbinfo[i].replslotname); + disconnect_database(conn, false); + } + else + { + /* + * If a connection could not be established, inform the user + * that some objects were left on primary and should be + * removed before trying again. + */ + if (dbinfo[i].made_publication) + { + pg_log_warning("publication \"%s\" created in database \"%s\" on primary was left behind", + dbinfo[i].pubname, dbinfo[i].dbname); + pg_log_warning_hint("Drop this publication before trying again."); + } + if (dbinfo[i].made_replslot) + { + pg_log_warning("replication slot \"%s\" created in database \"%s\" on primary was left behind", + dbinfo[i].replslotname, dbinfo[i].dbname); + pg_log_warning_hint("Drop this replication slot soon to avoid retention of WAL files."); + } + } + } + } + + if (standby_running) + stop_standby_server(subscriber_dir); +} + +static void +usage(void) +{ + printf(_("%s creates a new logical replica from a standby server.\n\n"), + progname); + printf(_("Usage:\n")); + printf(_(" %s [OPTION]...\n"), progname); + printf(_("\nOptions:\n")); + printf(_(" -d, --database=DBNAME database in which to create a subscription\n")); + printf(_(" -D, --pgdata=DATADIR location for the subscriber data directory\n")); + printf(_(" -n, --dry-run dry run, just show what would be done\n")); + printf(_(" -p, --subscriber-port=PORT subscriber port number (default %s)\n"), DEFAULT_SUB_PORT); + printf(_(" -P, --publisher-server=CONNSTR publisher connection string\n")); + printf(_(" -s, --socketdir=DIR socket directory to use (default current dir.)\n")); + printf(_(" -t, --recovery-timeout=SECS seconds to wait for recovery to end\n")); + printf(_(" -U, --subscriber-username=NAME user name for subscriber connection\n")); + printf(_(" -v, --verbose output verbose messages\n")); + printf(_(" --config-file=FILENAME use specified main server configuration\n" + " file when running target cluster\n")); + printf(_(" --publication=NAME publication name\n")); + printf(_(" --replication-slot=NAME replication slot name\n")); + printf(_(" --subscription=NAME subscription name\n")); + printf(_(" -V, --version output version information, then exit\n")); + printf(_(" -?, --help show this help, then exit\n")); + printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); + printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL); +} + +/* + * Subroutine to append "keyword=value" to a connection string, + * with proper quoting of the value. (We assume keywords don't need that.) + */ +static void +appendConnStrItem(PQExpBuffer buf, const char *keyword, const char *val) +{ + if (buf->len > 0) + appendPQExpBufferChar(buf, ' '); + appendPQExpBufferStr(buf, keyword); + appendPQExpBufferChar(buf, '='); + appendConnStrVal(buf, val); +} + +/* + * Validate a connection string. Returns a base connection string that is a + * connection string without a database name. + * + * Since we might process multiple databases, each database name will be + * appended to this base connection string to provide a final connection + * string. If the second argument (dbname) is not null, returns dbname if the + * provided connection string contains it. + * + * It is the caller's responsibility to free the returned connection string and + * dbname. + */ +static char * +get_base_conninfo(const char *conninfo, char **dbname) +{ + PQExpBuffer buf; + PQconninfoOption *conn_opts; + PQconninfoOption *conn_opt; + char *errmsg = NULL; + char *ret; + + conn_opts = PQconninfoParse(conninfo, &errmsg); + if (conn_opts == NULL) + { + pg_log_error("could not parse connection string: %s", errmsg); + PQfreemem(errmsg); + return NULL; + } + + buf = createPQExpBuffer(); + for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++) + { + if (conn_opt->val != NULL && conn_opt->val[0] != '\0') + { + if (strcmp(conn_opt->keyword, "dbname") == 0) + { + if (dbname) + *dbname = pg_strdup(conn_opt->val); + continue; + } + appendConnStrItem(buf, conn_opt->keyword, conn_opt->val); + } + } + + ret = pg_strdup(buf->data); + + destroyPQExpBuffer(buf); + PQconninfoFree(conn_opts); + + return ret; +} + +/* + * Build a subscriber connection string. Only a few parameters are supported + * since it starts a server with restricted access. + */ +static char * +get_sub_conninfo(const struct CreateSubscriberOptions *opt) +{ + PQExpBuffer buf = createPQExpBuffer(); + char *ret; + + appendConnStrItem(buf, "port", opt->sub_port); +#if !defined(WIN32) + appendConnStrItem(buf, "host", opt->socket_dir); +#endif + if (opt->sub_username != NULL) + appendConnStrItem(buf, "user", opt->sub_username); + appendConnStrItem(buf, "fallback_application_name", progname); + + ret = pg_strdup(buf->data); + + destroyPQExpBuffer(buf); + + return ret; +} + +/* + * Verify if a PostgreSQL binary (progname) is available in the same directory as + * pg_createsubscriber and it has the same version. It returns the absolute + * path of the progname. + */ +static char * +get_exec_path(const char *argv0, const char *progname) +{ + char *versionstr; + char *exec_path; + int ret; + + versionstr = psprintf("%s (PostgreSQL) %s\n", progname, PG_VERSION); + exec_path = pg_malloc(MAXPGPATH); + ret = find_other_exec(argv0, progname, versionstr, exec_path); + + if (ret < 0) + { + char full_path[MAXPGPATH]; + + if (find_my_exec(argv0, full_path) < 0) + strlcpy(full_path, progname, sizeof(full_path)); + + if (ret == -1) + pg_fatal("program \"%s\" is needed by %s but was not found in the same directory as \"%s\"", + progname, "pg_createsubscriber", full_path); + else + pg_fatal("program \"%s\" was found by \"%s\" but was not the same version as %s", + progname, full_path, "pg_createsubscriber"); + } + + pg_log_debug("%s path is: %s", progname, exec_path); + + return exec_path; +} + +/* + * Is it a cluster directory? These are preliminary checks. It is far from + * making an accurate check. If it is not a clone from the publisher, it will + * eventually fail in a future step. + */ +static void +check_data_directory(const char *datadir) +{ + struct stat statbuf; + char versionfile[MAXPGPATH]; + + pg_log_info("checking if directory \"%s\" is a cluster data directory", + datadir); + + if (stat(datadir, &statbuf) != 0) + { + if (errno == ENOENT) + pg_fatal("data directory \"%s\" does not exist", datadir); + else + pg_fatal("could not access directory \"%s\": %m", datadir); + } + + snprintf(versionfile, MAXPGPATH, "%s/PG_VERSION", datadir); + if (stat(versionfile, &statbuf) != 0 && errno == ENOENT) + { + pg_fatal("directory \"%s\" is not a database cluster directory", + datadir); + } +} + +/* + * Append database name into a base connection string. + * + * dbname is the only parameter that changes so it is not included in the base + * connection string. This function concatenates dbname to build a "real" + * connection string. + */ +static char * +concat_conninfo_dbname(const char *conninfo, const char *dbname) +{ + PQExpBuffer buf = createPQExpBuffer(); + char *ret; + + Assert(conninfo != NULL); + + appendPQExpBufferStr(buf, conninfo); + appendConnStrItem(buf, "dbname", dbname); + + ret = pg_strdup(buf->data); + destroyPQExpBuffer(buf); + + return ret; +} + +/* + * Store publication and subscription information. + * + * If publication, replication slot and subscription names were specified, + * store it here. Otherwise, a generated name will be assigned to the object in + * setup_publisher(). + */ +static struct LogicalRepInfo * +store_pub_sub_info(const struct CreateSubscriberOptions *opt, + const char *pub_base_conninfo, + const char *sub_base_conninfo) +{ + struct LogicalRepInfo *dbinfo; + SimpleStringListCell *pubcell = NULL; + SimpleStringListCell *subcell = NULL; + SimpleStringListCell *replslotcell = NULL; + int i = 0; + + dbinfo = pg_malloc_array(struct LogicalRepInfo, num_dbs); + + if (num_pubs > 0) + pubcell = opt->pub_names.head; + if (num_subs > 0) + subcell = opt->sub_names.head; + if (num_replslots > 0) + replslotcell = opt->replslot_names.head; + + for (SimpleStringListCell *cell = opt->database_names.head; cell; cell = cell->next) + { + char *conninfo; + + /* Fill publisher attributes */ + conninfo = concat_conninfo_dbname(pub_base_conninfo, cell->val); + dbinfo[i].pubconninfo = conninfo; + dbinfo[i].dbname = cell->val; + if (num_pubs > 0) + dbinfo[i].pubname = pubcell->val; + else + dbinfo[i].pubname = NULL; + if (num_replslots > 0) + dbinfo[i].replslotname = replslotcell->val; + else + dbinfo[i].replslotname = NULL; + dbinfo[i].made_replslot = false; + dbinfo[i].made_publication = false; + /* Fill subscriber attributes */ + conninfo = concat_conninfo_dbname(sub_base_conninfo, cell->val); + dbinfo[i].subconninfo = conninfo; + if (num_subs > 0) + dbinfo[i].subname = subcell->val; + else + dbinfo[i].subname = NULL; + /* Other fields will be filled later */ + + pg_log_debug("publisher(%d): publication: %s ; replication slot: %s ; connection string: %s", i, + dbinfo[i].pubname ? dbinfo[i].pubname : "(auto)", + dbinfo[i].replslotname ? dbinfo[i].replslotname : "(auto)", + dbinfo[i].pubconninfo); + pg_log_debug("subscriber(%d): subscription: %s ; connection string: %s", i, + dbinfo[i].subname ? dbinfo[i].subname : "(auto)", + dbinfo[i].subconninfo); + + if (num_pubs > 0) + pubcell = pubcell->next; + if (num_subs > 0) + subcell = subcell->next; + if (num_replslots > 0) + replslotcell = replslotcell->next; + + i++; + } + + return dbinfo; +} + +/* + * Open a new connection. If exit_on_error is true, it has an undesired + * condition and it should exit immediately. + */ +static PGconn * +connect_database(const char *conninfo, bool exit_on_error) +{ + PGconn *conn; + PGresult *res; + + conn = PQconnectdb(conninfo); + if (PQstatus(conn) != CONNECTION_OK) + { + pg_log_error("connection to database failed: %s", + PQerrorMessage(conn)); + PQfinish(conn); + + if (exit_on_error) + exit(1); + return NULL; + } + + /* Secure search_path */ + res = PQexec(conn, ALWAYS_SECURE_SEARCH_PATH_SQL); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + pg_log_error("could not clear search_path: %s", + PQresultErrorMessage(res)); + PQclear(res); + PQfinish(conn); + + if (exit_on_error) + exit(1); + return NULL; + } + PQclear(res); + + return conn; +} + +/* + * Close the connection. If exit_on_error is true, it has an undesired + * condition and it should exit immediately. + */ +static void +disconnect_database(PGconn *conn, bool exit_on_error) +{ + Assert(conn != NULL); + + PQfinish(conn); + + if (exit_on_error) + exit(1); +} + +/* + * Obtain the system identifier using the provided connection. It will be used + * to compare if a data directory is a clone of another one. + */ +static uint64 +get_primary_sysid(const char *conninfo) +{ + PGconn *conn; + PGresult *res; + uint64 sysid; + + pg_log_info("getting system identifier from publisher"); + + conn = connect_database(conninfo, true); + + res = PQexec(conn, "SELECT system_identifier FROM pg_catalog.pg_control_system()"); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + pg_log_error("could not get system identifier: %s", + PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + if (PQntuples(res) != 1) + { + pg_log_error("could not get system identifier: got %d rows, expected %d row", + PQntuples(res), 1); + disconnect_database(conn, true); + } + + sysid = strtou64(PQgetvalue(res, 0, 0), NULL, 10); + + pg_log_info("system identifier is %llu on publisher", + (unsigned long long) sysid); + + PQclear(res); + disconnect_database(conn, false); + + return sysid; +} + +/* + * Obtain the system identifier from control file. It will be used to compare + * if a data directory is a clone of another one. This routine is used locally + * and avoids a connection. + */ +static uint64 +get_standby_sysid(const char *datadir) +{ + ControlFileData *cf; + bool crc_ok; + uint64 sysid; + + pg_log_info("getting system identifier from subscriber"); + + cf = get_controlfile(datadir, &crc_ok); + if (!crc_ok) + pg_fatal("control file appears to be corrupt"); + + sysid = cf->system_identifier; + + pg_log_info("system identifier is %llu on subscriber", + (unsigned long long) sysid); + + pg_free(cf); + + return sysid; +} + +/* + * Modify the system identifier. Since a standby server preserves the system + * identifier, it makes sense to change it to avoid situations in which WAL + * files from one of the systems might be used in the other one. + */ +static void +modify_subscriber_sysid(const struct CreateSubscriberOptions *opt) +{ + ControlFileData *cf; + bool crc_ok; + struct timeval tv; + + char *cmd_str; + + pg_log_info("modifying system identifier of subscriber"); + + cf = get_controlfile(subscriber_dir, &crc_ok); + if (!crc_ok) + pg_fatal("control file appears to be corrupt"); + + /* + * Select a new system identifier. + * + * XXX this code was extracted from BootStrapXLOG(). + */ + gettimeofday(&tv, NULL); + cf->system_identifier = ((uint64) tv.tv_sec) << 32; + cf->system_identifier |= ((uint64) tv.tv_usec) << 12; + cf->system_identifier |= getpid() & 0xFFF; + + if (!dry_run) + update_controlfile(subscriber_dir, cf, true); + + pg_log_info("system identifier is %llu on subscriber", + (unsigned long long) cf->system_identifier); + + pg_log_info("running pg_resetwal on the subscriber"); + + cmd_str = psprintf("\"%s\" -D \"%s\" > \"%s\"", pg_resetwal_path, + subscriber_dir, DEVNULL); + + pg_log_debug("pg_resetwal command is: %s", cmd_str); + + if (!dry_run) + { + int rc = system(cmd_str); + + if (rc == 0) + pg_log_info("subscriber successfully changed the system identifier"); + else + pg_fatal("could not change system identifier of subscriber: %s", wait_result_to_str(rc)); + } + + pg_free(cf); +} + +/* + * Generate an object name using a prefix, database oid and a random integer. + * It is used in case the user does not specify an object name (publication, + * subscription, replication slot). + */ +static char * +generate_object_name(PGconn *conn) +{ + PGresult *res; + Oid oid; + uint32 rand; + char *objname; + + res = PQexec(conn, + "SELECT oid FROM pg_catalog.pg_database " + "WHERE datname = pg_catalog.current_database()"); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + pg_log_error("could not obtain database OID: %s", + PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + + if (PQntuples(res) != 1) + { + pg_log_error("could not obtain database OID: got %d rows, expected %d row", + PQntuples(res), 1); + disconnect_database(conn, true); + } + + /* Database OID */ + oid = strtoul(PQgetvalue(res, 0, 0), NULL, 10); + + PQclear(res); + + /* Random unsigned integer */ + rand = pg_prng_uint32(&prng_state); + + /* + * Build the object name. The name must not exceed NAMEDATALEN - 1. This + * current schema uses a maximum of 40 characters (20 + 10 + 1 + 8 + + * '\0'). + */ + objname = psprintf("pg_createsubscriber_%u_%x", oid, rand); + + return objname; +} + +/* + * Create the publications and replication slots in preparation for logical + * replication. Returns the LSN from latest replication slot. It will be the + * replication start point that is used to adjust the subscriptions (see + * set_replication_progress). + */ +static char * +setup_publisher(struct LogicalRepInfo *dbinfo) +{ + char *lsn = NULL; + + pg_prng_seed(&prng_state, (uint64) (getpid() ^ time(NULL))); + + for (int i = 0; i < num_dbs; i++) + { + PGconn *conn; + char *genname = NULL; + + conn = connect_database(dbinfo[i].pubconninfo, true); + + /* + * If an object name was not specified as command-line options, assign + * a generated object name. The replication slot has a different rule. + * The subscription name is assigned to the replication slot name if + * no replication slot is specified. It follows the same rule as + * CREATE SUBSCRIPTION. + */ + if (num_pubs == 0 || num_subs == 0 || num_replslots == 0) + genname = generate_object_name(conn); + if (num_pubs == 0) + dbinfo[i].pubname = pg_strdup(genname); + if (num_subs == 0) + dbinfo[i].subname = pg_strdup(genname); + if (num_replslots == 0) + dbinfo[i].replslotname = pg_strdup(dbinfo[i].subname); + + /* + * Create publication on publisher. This step should be executed + * *before* promoting the subscriber to avoid any transactions between + * consistent LSN and the new publication rows (such transactions + * wouldn't see the new publication rows resulting in an error). + */ + create_publication(conn, &dbinfo[i]); + + /* Create replication slot on publisher */ + if (lsn) + pg_free(lsn); + lsn = create_logical_replication_slot(conn, &dbinfo[i]); + if (lsn != NULL || dry_run) + pg_log_info("create replication slot \"%s\" on publisher", + dbinfo[i].replslotname); + else + exit(1); + + /* + * Since we are using the LSN returned by the last replication slot as + * recovery_target_lsn, this LSN is ahead of the current WAL position + * and the recovery waits until the publisher writes a WAL record to + * reach the target and ends the recovery. On idle systems, this wait + * time is unpredictable and could lead to failure in promoting the + * subscriber. To avoid that, insert a harmless WAL record. + */ + if (i == num_dbs - 1 && !dry_run) + { + PGresult *res; + + res = PQexec(conn, "SELECT pg_log_standby_snapshot()"); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + pg_log_error("could not write an additional WAL record: %s", + PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + PQclear(res); + } + + disconnect_database(conn, false); + } + + return lsn; +} + +/* + * Is recovery still in progress? + */ +static bool +server_is_in_recovery(PGconn *conn) +{ + PGresult *res; + int ret; + + res = PQexec(conn, "SELECT pg_catalog.pg_is_in_recovery()"); + + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + pg_log_error("could not obtain recovery progress: %s", + PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + + + ret = strcmp("t", PQgetvalue(res, 0, 0)); + + PQclear(res); + + return ret == 0; +} + +/* + * Is the primary server ready for logical replication? + * + * XXX Does it not allow a synchronous replica? + */ +static void +check_publisher(const struct LogicalRepInfo *dbinfo) +{ + PGconn *conn; + PGresult *res; + bool failed = false; + + char *wal_level; + int max_repslots; + int cur_repslots; + int max_walsenders; + int cur_walsenders; + int max_prepared_transactions; + + pg_log_info("checking settings on publisher"); + + conn = connect_database(dbinfo[0].pubconninfo, true); + + /* + * If the primary server is in recovery (i.e. cascading replication), + * objects (publication) cannot be created because it is read only. + */ + if (server_is_in_recovery(conn)) + { + pg_log_error("primary server cannot be in recovery"); + disconnect_database(conn, true); + } + + /*------------------------------------------------------------------------ + * Logical replication requires a few parameters to be set on publisher. + * Since these parameters are not a requirement for physical replication, + * we should check it to make sure it won't fail. + * + * - wal_level = logical + * - max_replication_slots >= current + number of dbs to be converted + * - max_wal_senders >= current + number of dbs to be converted + * ----------------------------------------------------------------------- + */ + res = PQexec(conn, + "SELECT pg_catalog.current_setting('wal_level')," + " pg_catalog.current_setting('max_replication_slots')," + " (SELECT count(*) FROM pg_catalog.pg_replication_slots)," + " pg_catalog.current_setting('max_wal_senders')," + " (SELECT count(*) FROM pg_catalog.pg_stat_activity WHERE backend_type = 'walsender')," + " pg_catalog.current_setting('max_prepared_transactions')"); + + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + pg_log_error("could not obtain publisher settings: %s", + PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + + wal_level = pg_strdup(PQgetvalue(res, 0, 0)); + max_repslots = atoi(PQgetvalue(res, 0, 1)); + cur_repslots = atoi(PQgetvalue(res, 0, 2)); + max_walsenders = atoi(PQgetvalue(res, 0, 3)); + cur_walsenders = atoi(PQgetvalue(res, 0, 4)); + max_prepared_transactions = atoi(PQgetvalue(res, 0, 5)); + + PQclear(res); + + pg_log_debug("publisher: wal_level: %s", wal_level); + pg_log_debug("publisher: max_replication_slots: %d", max_repslots); + pg_log_debug("publisher: current replication slots: %d", cur_repslots); + pg_log_debug("publisher: max_wal_senders: %d", max_walsenders); + pg_log_debug("publisher: current wal senders: %d", cur_walsenders); + pg_log_debug("publisher: max_prepared_transactions: %d", + max_prepared_transactions); + + disconnect_database(conn, false); + + if (strcmp(wal_level, "logical") != 0) + { + pg_log_error("publisher requires wal_level >= \"logical\""); + failed = true; + } + + if (max_repslots - cur_repslots < num_dbs) + { + pg_log_error("publisher requires %d replication slots, but only %d remain", + num_dbs, max_repslots - cur_repslots); + pg_log_error_hint("Increase the configuration parameter \"%s\" to at least %d.", + "max_replication_slots", cur_repslots + num_dbs); + failed = true; + } + + if (max_walsenders - cur_walsenders < num_dbs) + { + pg_log_error("publisher requires %d WAL sender processes, but only %d remain", + num_dbs, max_walsenders - cur_walsenders); + pg_log_error_hint("Increase the configuration parameter \"%s\" to at least %d.", + "max_wal_senders", cur_walsenders + num_dbs); + failed = true; + } + + if (max_prepared_transactions != 0) + { + pg_log_warning("two_phase option will not be enabled for replication slots"); + pg_log_warning_detail("Subscriptions will be created with the two_phase option disabled. " + "Prepared transactions will be replicated at COMMIT PREPARED."); + } + + pg_free(wal_level); + + if (failed) + exit(1); +} + +/* + * Is the standby server ready for logical replication? + * + * XXX Does it not allow a time-delayed replica? + * + * XXX In a cascaded replication scenario (P -> S -> C), if the target server + * is S, it cannot detect there is a replica (server C) because server S starts + * accepting only local connections and server C cannot connect to it. Hence, + * there is not a reliable way to provide a suitable error saying the server C + * will be broken at the end of this process (due to pg_resetwal). + */ +static void +check_subscriber(const struct LogicalRepInfo *dbinfo) +{ + PGconn *conn; + PGresult *res; + bool failed = false; + + int max_lrworkers; + int max_repslots; + int max_wprocs; + + pg_log_info("checking settings on subscriber"); + + conn = connect_database(dbinfo[0].subconninfo, true); + + /* The target server must be a standby */ + if (!server_is_in_recovery(conn)) + { + pg_log_error("target server must be a standby"); + disconnect_database(conn, true); + } + + /*------------------------------------------------------------------------ + * Logical replication requires a few parameters to be set on subscriber. + * Since these parameters are not a requirement for physical replication, + * we should check it to make sure it won't fail. + * + * - max_replication_slots >= number of dbs to be converted + * - max_logical_replication_workers >= number of dbs to be converted + * - max_worker_processes >= 1 + number of dbs to be converted + *------------------------------------------------------------------------ + */ + res = PQexec(conn, + "SELECT setting FROM pg_catalog.pg_settings WHERE name IN (" + "'max_logical_replication_workers', " + "'max_replication_slots', " + "'max_worker_processes', " + "'primary_slot_name') " + "ORDER BY name"); + + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + pg_log_error("could not obtain subscriber settings: %s", + PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + + max_lrworkers = atoi(PQgetvalue(res, 0, 0)); + max_repslots = atoi(PQgetvalue(res, 1, 0)); + max_wprocs = atoi(PQgetvalue(res, 2, 0)); + if (strcmp(PQgetvalue(res, 3, 0), "") != 0) + primary_slot_name = pg_strdup(PQgetvalue(res, 3, 0)); + + pg_log_debug("subscriber: max_logical_replication_workers: %d", + max_lrworkers); + pg_log_debug("subscriber: max_replication_slots: %d", max_repslots); + pg_log_debug("subscriber: max_worker_processes: %d", max_wprocs); + if (primary_slot_name) + pg_log_debug("subscriber: primary_slot_name: %s", primary_slot_name); + + PQclear(res); + + disconnect_database(conn, false); + + if (max_repslots < num_dbs) + { + pg_log_error("subscriber requires %d replication slots, but only %d remain", + num_dbs, max_repslots); + pg_log_error_hint("Increase the configuration parameter \"%s\" to at least %d.", + "max_replication_slots", num_dbs); + failed = true; + } + + if (max_lrworkers < num_dbs) + { + pg_log_error("subscriber requires %d logical replication workers, but only %d remain", + num_dbs, max_lrworkers); + pg_log_error_hint("Increase the configuration parameter \"%s\" to at least %d.", + "max_logical_replication_workers", num_dbs); + failed = true; + } + + if (max_wprocs < num_dbs + 1) + { + pg_log_error("subscriber requires %d worker processes, but only %d remain", + num_dbs + 1, max_wprocs); + pg_log_error_hint("Increase the configuration parameter \"%s\" to at least %d.", + "max_worker_processes", num_dbs + 1); + failed = true; + } + + if (failed) + exit(1); +} + +/* + * Drop a specified subscription. This is to avoid duplicate subscriptions on + * the primary (publisher node) and the newly created subscriber. We + * shouldn't drop the associated slot as that would be used by the publisher + * node. + */ +static void +drop_existing_subscriptions(PGconn *conn, const char *subname, const char *dbname) +{ + PQExpBuffer query = createPQExpBuffer(); + PGresult *res; + + Assert(conn != NULL); + + /* + * Construct a query string. These commands are allowed to be executed + * within a transaction. + */ + appendPQExpBuffer(query, "ALTER SUBSCRIPTION %s DISABLE;", + subname); + appendPQExpBuffer(query, " ALTER SUBSCRIPTION %s SET (slot_name = NONE);", + subname); + appendPQExpBuffer(query, " DROP SUBSCRIPTION %s;", subname); + + pg_log_info("dropping subscription \"%s\" in database \"%s\"", + subname, dbname); + + if (!dry_run) + { + res = PQexec(conn, query->data); + + if (PQresultStatus(res) != PGRES_COMMAND_OK) + { + pg_log_error("could not drop subscription \"%s\": %s", + subname, PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + + PQclear(res); + } + + destroyPQExpBuffer(query); +} + +/* + * Retrieve and drop the pre-existing subscriptions. + */ +static void +check_and_drop_existing_subscriptions(PGconn *conn, + const struct LogicalRepInfo *dbinfo) +{ + PQExpBuffer query = createPQExpBuffer(); + char *dbname; + PGresult *res; + + Assert(conn != NULL); + + dbname = PQescapeLiteral(conn, dbinfo->dbname, strlen(dbinfo->dbname)); + + appendPQExpBuffer(query, + "SELECT s.subname FROM pg_catalog.pg_subscription s " + "INNER JOIN pg_catalog.pg_database d ON (s.subdbid = d.oid) " + "WHERE d.datname = %s", + dbname); + res = PQexec(conn, query->data); + + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + pg_log_error("could not obtain pre-existing subscriptions: %s", + PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + + for (int i = 0; i < PQntuples(res); i++) + drop_existing_subscriptions(conn, PQgetvalue(res, i, 0), + dbinfo->dbname); + + PQclear(res); + destroyPQExpBuffer(query); + PQfreemem(dbname); +} + +/* + * Create the subscriptions, adjust the initial location for logical + * replication and enable the subscriptions. That's the last step for logical + * replication setup. + */ +static void +setup_subscriber(struct LogicalRepInfo *dbinfo, const char *consistent_lsn) +{ + for (int i = 0; i < num_dbs; i++) + { + PGconn *conn; + + /* Connect to subscriber. */ + conn = connect_database(dbinfo[i].subconninfo, true); + + /* + * We don't need the pre-existing subscriptions on the newly formed + * subscriber. They can connect to other publisher nodes and either + * get some unwarranted data or can lead to ERRORs in connecting to + * such nodes. + */ + check_and_drop_existing_subscriptions(conn, &dbinfo[i]); + + /* + * Since the publication was created before the consistent LSN, it is + * available on the subscriber when the physical replica is promoted. + * Remove publications from the subscriber because it has no use. + */ + drop_publication(conn, &dbinfo[i]); + + create_subscription(conn, &dbinfo[i]); + + /* Set the replication progress to the correct LSN */ + set_replication_progress(conn, &dbinfo[i], consistent_lsn); + + /* Enable subscription */ + enable_subscription(conn, &dbinfo[i]); + + disconnect_database(conn, false); + } +} + +/* + * Write the required recovery parameters. + */ +static void +setup_recovery(const struct LogicalRepInfo *dbinfo, const char *datadir, const char *lsn) +{ + PGconn *conn; + PQExpBuffer recoveryconfcontents; + + /* + * Despite of the recovery parameters will be written to the subscriber, + * use a publisher connection. The primary_conninfo is generated using the + * connection settings. + */ + conn = connect_database(dbinfo[0].pubconninfo, true); + + /* + * Write recovery parameters. + * + * The subscriber is not running yet. In dry run mode, the recovery + * parameters *won't* be written. An invalid LSN is used for printing + * purposes. Additional recovery parameters are added here. It avoids + * unexpected behavior such as end of recovery as soon as a consistent + * state is reached (recovery_target) and failure due to multiple recovery + * targets (name, time, xid, LSN). + */ + recoveryconfcontents = GenerateRecoveryConfig(conn, NULL, NULL); + appendPQExpBuffer(recoveryconfcontents, "recovery_target = ''\n"); + appendPQExpBuffer(recoveryconfcontents, + "recovery_target_timeline = 'latest'\n"); + appendPQExpBuffer(recoveryconfcontents, + "recovery_target_inclusive = true\n"); + appendPQExpBuffer(recoveryconfcontents, + "recovery_target_action = promote\n"); + appendPQExpBuffer(recoveryconfcontents, "recovery_target_name = ''\n"); + appendPQExpBuffer(recoveryconfcontents, "recovery_target_time = ''\n"); + appendPQExpBuffer(recoveryconfcontents, "recovery_target_xid = ''\n"); + + if (dry_run) + { + appendPQExpBuffer(recoveryconfcontents, "# dry run mode"); + appendPQExpBuffer(recoveryconfcontents, + "recovery_target_lsn = '%X/%X'\n", + LSN_FORMAT_ARGS((XLogRecPtr) InvalidXLogRecPtr)); + } + else + { + appendPQExpBuffer(recoveryconfcontents, "recovery_target_lsn = '%s'\n", + lsn); + WriteRecoveryConfig(conn, datadir, recoveryconfcontents); + } + disconnect_database(conn, false); + + pg_log_debug("recovery parameters:\n%s", recoveryconfcontents->data); +} + +/* + * Drop physical replication slot on primary if the standby was using it. After + * the transformation, it has no use. + * + * XXX we might not fail here. Instead, we provide a warning so the user + * eventually drops this replication slot later. + */ +static void +drop_primary_replication_slot(struct LogicalRepInfo *dbinfo, const char *slotname) +{ + PGconn *conn; + + /* Replication slot does not exist, do nothing */ + if (!primary_slot_name) + return; + + conn = connect_database(dbinfo[0].pubconninfo, false); + if (conn != NULL) + { + drop_replication_slot(conn, &dbinfo[0], slotname); + disconnect_database(conn, false); + } + else + { + pg_log_warning("could not drop replication slot \"%s\" on primary", + slotname); + pg_log_warning_hint("Drop this replication slot soon to avoid retention of WAL files."); + } +} + +/* + * Drop failover replication slots on subscriber. After the transformation, + * they have no use. + * + * XXX We do not fail here. Instead, we provide a warning so the user can drop + * them later. + */ +static void +drop_failover_replication_slots(struct LogicalRepInfo *dbinfo) +{ + PGconn *conn; + PGresult *res; + + conn = connect_database(dbinfo[0].subconninfo, false); + if (conn != NULL) + { + /* Get failover replication slot names */ + res = PQexec(conn, + "SELECT slot_name FROM pg_catalog.pg_replication_slots WHERE failover"); + + if (PQresultStatus(res) == PGRES_TUPLES_OK) + { + /* Remove failover replication slots from subscriber */ + for (int i = 0; i < PQntuples(res); i++) + drop_replication_slot(conn, &dbinfo[0], PQgetvalue(res, i, 0)); + } + else + { + pg_log_warning("could not obtain failover replication slot information: %s", + PQresultErrorMessage(res)); + pg_log_warning_hint("Drop the failover replication slots on subscriber soon to avoid retention of WAL files."); + } + + PQclear(res); + disconnect_database(conn, false); + } + else + { + pg_log_warning("could not drop failover replication slot"); + pg_log_warning_hint("Drop the failover replication slots on subscriber soon to avoid retention of WAL files."); + } +} + +/* + * Create a logical replication slot and returns a LSN. + * + * CreateReplicationSlot() is not used because it does not provide the one-row + * result set that contains the LSN. + */ +static char * +create_logical_replication_slot(PGconn *conn, struct LogicalRepInfo *dbinfo) +{ + PQExpBuffer str = createPQExpBuffer(); + PGresult *res = NULL; + const char *slot_name = dbinfo->replslotname; + char *slot_name_esc; + char *lsn = NULL; + + Assert(conn != NULL); + + pg_log_info("creating the replication slot \"%s\" in database \"%s\"", + slot_name, dbinfo->dbname); + + slot_name_esc = PQescapeLiteral(conn, slot_name, strlen(slot_name)); + + appendPQExpBuffer(str, + "SELECT lsn FROM pg_catalog.pg_create_logical_replication_slot(%s, 'pgoutput', false, false, false)", + slot_name_esc); + + PQfreemem(slot_name_esc); + + pg_log_debug("command is: %s", str->data); + + if (!dry_run) + { + res = PQexec(conn, str->data); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + pg_log_error("could not create replication slot \"%s\" in database \"%s\": %s", + slot_name, dbinfo->dbname, + PQresultErrorMessage(res)); + PQclear(res); + destroyPQExpBuffer(str); + return NULL; + } + + lsn = pg_strdup(PQgetvalue(res, 0, 0)); + PQclear(res); + } + + /* For cleanup purposes */ + dbinfo->made_replslot = true; + + destroyPQExpBuffer(str); + + return lsn; +} + +static void +drop_replication_slot(PGconn *conn, struct LogicalRepInfo *dbinfo, + const char *slot_name) +{ + PQExpBuffer str = createPQExpBuffer(); + char *slot_name_esc; + PGresult *res; + + Assert(conn != NULL); + + pg_log_info("dropping the replication slot \"%s\" in database \"%s\"", + slot_name, dbinfo->dbname); + + slot_name_esc = PQescapeLiteral(conn, slot_name, strlen(slot_name)); + + appendPQExpBuffer(str, "SELECT pg_catalog.pg_drop_replication_slot(%s)", slot_name_esc); + + PQfreemem(slot_name_esc); + + pg_log_debug("command is: %s", str->data); + + if (!dry_run) + { + res = PQexec(conn, str->data); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + pg_log_error("could not drop replication slot \"%s\" in database \"%s\": %s", + slot_name, dbinfo->dbname, PQresultErrorMessage(res)); + dbinfo->made_replslot = false; /* don't try again. */ + } + + PQclear(res); + } + + destroyPQExpBuffer(str); +} + +/* + * Reports a suitable message if pg_ctl fails. + */ +static void +pg_ctl_status(const char *pg_ctl_cmd, int rc) +{ + if (rc != 0) + { + if (WIFEXITED(rc)) + { + pg_log_error("pg_ctl failed with exit code %d", WEXITSTATUS(rc)); + } + else if (WIFSIGNALED(rc)) + { +#if defined(WIN32) + pg_log_error("pg_ctl was terminated by exception 0x%X", + WTERMSIG(rc)); + pg_log_error_detail("See C include file \"ntstatus.h\" for a description of the hexadecimal value."); +#else + pg_log_error("pg_ctl was terminated by signal %d: %s", + WTERMSIG(rc), pg_strsignal(WTERMSIG(rc))); +#endif + } + else + { + pg_log_error("pg_ctl exited with unrecognized status %d", rc); + } + + pg_log_error_detail("The failed command was: %s", pg_ctl_cmd); + exit(1); + } +} + +static void +start_standby_server(const struct CreateSubscriberOptions *opt, bool restricted_access, + bool restrict_logical_worker) +{ + PQExpBuffer pg_ctl_cmd = createPQExpBuffer(); + int rc; + + appendPQExpBuffer(pg_ctl_cmd, "\"%s\" start -D ", pg_ctl_path); + appendShellString(pg_ctl_cmd, subscriber_dir); + appendPQExpBuffer(pg_ctl_cmd, " -s -o \"-c sync_replication_slots=off\""); + if (restricted_access) + { + appendPQExpBuffer(pg_ctl_cmd, " -o \"-p %s\"", opt->sub_port); +#if !defined(WIN32) + + /* + * An empty listen_addresses list means the server does not listen on + * any IP interfaces; only Unix-domain sockets can be used to connect + * to the server. Prevent external connections to minimize the chance + * of failure. + */ + appendPQExpBufferStr(pg_ctl_cmd, " -o \"-c listen_addresses='' -c unix_socket_permissions=0700"); + if (opt->socket_dir) + appendPQExpBuffer(pg_ctl_cmd, " -c unix_socket_directories='%s'", + opt->socket_dir); + appendPQExpBufferChar(pg_ctl_cmd, '"'); +#endif + } + if (opt->config_file != NULL) + appendPQExpBuffer(pg_ctl_cmd, " -o \"-c config_file=%s\"", + opt->config_file); + + /* Suppress to start logical replication if requested */ + if (restrict_logical_worker) + appendPQExpBuffer(pg_ctl_cmd, " -o \"-c max_logical_replication_workers=0\""); + + pg_log_debug("pg_ctl command is: %s", pg_ctl_cmd->data); + rc = system(pg_ctl_cmd->data); + pg_ctl_status(pg_ctl_cmd->data, rc); + standby_running = true; + destroyPQExpBuffer(pg_ctl_cmd); + pg_log_info("server was started"); +} + +static void +stop_standby_server(const char *datadir) +{ + char *pg_ctl_cmd; + int rc; + + pg_ctl_cmd = psprintf("\"%s\" stop -D \"%s\" -s", pg_ctl_path, + datadir); + pg_log_debug("pg_ctl command is: %s", pg_ctl_cmd); + rc = system(pg_ctl_cmd); + pg_ctl_status(pg_ctl_cmd, rc); + standby_running = false; + pg_log_info("server was stopped"); +} + +/* + * Returns after the server finishes the recovery process. + * + * If recovery_timeout option is set, terminate abnormally without finishing + * the recovery process. By default, it waits forever. + * + * XXX Is the recovery process still in progress? When recovery process has a + * better progress reporting mechanism, it should be added here. + */ +static void +wait_for_end_recovery(const char *conninfo, const struct CreateSubscriberOptions *opt) +{ + PGconn *conn; + int status = POSTMASTER_STILL_STARTING; + int timer = 0; + + pg_log_info("waiting for the target server to reach the consistent state"); + + conn = connect_database(conninfo, true); + + for (;;) + { + bool in_recovery = server_is_in_recovery(conn); + + /* + * Does the recovery process finish? In dry run mode, there is no + * recovery mode. Bail out as the recovery process has ended. + */ + if (!in_recovery || dry_run) + { + status = POSTMASTER_READY; + recovery_ended = true; + break; + } + + /* Bail out after recovery_timeout seconds if this option is set */ + if (opt->recovery_timeout > 0 && timer >= opt->recovery_timeout) + { + stop_standby_server(subscriber_dir); + pg_log_error("recovery timed out"); + disconnect_database(conn, true); + } + + /* Keep waiting */ + pg_usleep(WAIT_INTERVAL * USEC_PER_SEC); + + timer += WAIT_INTERVAL; + } + + disconnect_database(conn, false); + + if (status == POSTMASTER_STILL_STARTING) + pg_fatal("server did not end recovery"); + + pg_log_info("target server reached the consistent state"); + pg_log_info_hint("If pg_createsubscriber fails after this point, you must recreate the physical replica before continuing."); +} + +/* + * Create a publication that includes all tables in the database. + */ +static void +create_publication(PGconn *conn, struct LogicalRepInfo *dbinfo) +{ + PQExpBuffer str = createPQExpBuffer(); + PGresult *res; + char *ipubname_esc; + char *spubname_esc; + + Assert(conn != NULL); + + ipubname_esc = PQescapeIdentifier(conn, dbinfo->pubname, strlen(dbinfo->pubname)); + spubname_esc = PQescapeLiteral(conn, dbinfo->pubname, strlen(dbinfo->pubname)); + + /* Check if the publication already exists */ + appendPQExpBuffer(str, + "SELECT 1 FROM pg_catalog.pg_publication " + "WHERE pubname = %s", + spubname_esc); + res = PQexec(conn, str->data); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + pg_log_error("could not obtain publication information: %s", + PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + + if (PQntuples(res) == 1) + { + /* + * Unfortunately, if it reaches this code path, it will always fail + * (unless you decide to change the existing publication name). That's + * bad but it is very unlikely that the user will choose a name with + * pg_createsubscriber_ prefix followed by the exact database oid and + * a random number. + */ + pg_log_error("publication \"%s\" already exists", dbinfo->pubname); + pg_log_error_hint("Consider renaming this publication before continuing."); + disconnect_database(conn, true); + } + + PQclear(res); + resetPQExpBuffer(str); + + pg_log_info("creating publication \"%s\" in database \"%s\"", + dbinfo->pubname, dbinfo->dbname); + + appendPQExpBuffer(str, "CREATE PUBLICATION %s FOR ALL TABLES", + ipubname_esc); + + pg_log_debug("command is: %s", str->data); + + if (!dry_run) + { + res = PQexec(conn, str->data); + if (PQresultStatus(res) != PGRES_COMMAND_OK) + { + pg_log_error("could not create publication \"%s\" in database \"%s\": %s", + dbinfo->pubname, dbinfo->dbname, PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + PQclear(res); + } + + /* For cleanup purposes */ + dbinfo->made_publication = true; + + PQfreemem(ipubname_esc); + PQfreemem(spubname_esc); + destroyPQExpBuffer(str); +} + +/* + * Remove publication if it couldn't finish all steps. + */ +static void +drop_publication(PGconn *conn, struct LogicalRepInfo *dbinfo) +{ + PQExpBuffer str = createPQExpBuffer(); + PGresult *res; + char *pubname_esc; + + Assert(conn != NULL); + + pubname_esc = PQescapeIdentifier(conn, dbinfo->pubname, strlen(dbinfo->pubname)); + + pg_log_info("dropping publication \"%s\" in database \"%s\"", + dbinfo->pubname, dbinfo->dbname); + + appendPQExpBuffer(str, "DROP PUBLICATION %s", pubname_esc); + + PQfreemem(pubname_esc); + + pg_log_debug("command is: %s", str->data); + + if (!dry_run) + { + res = PQexec(conn, str->data); + if (PQresultStatus(res) != PGRES_COMMAND_OK) + { + pg_log_error("could not drop publication \"%s\" in database \"%s\": %s", + dbinfo->pubname, dbinfo->dbname, PQresultErrorMessage(res)); + dbinfo->made_publication = false; /* don't try again. */ + + /* + * Don't disconnect and exit here. This routine is used by primary + * (cleanup publication / replication slot due to an error) and + * subscriber (remove the replicated publications). In both cases, + * it can continue and provide instructions for the user to remove + * it later if cleanup fails. + */ + } + PQclear(res); + } + + destroyPQExpBuffer(str); +} + +/* + * Create a subscription with some predefined options. + * + * A replication slot was already created in a previous step. Let's use it. It + * is not required to copy data. The subscription will be created but it will + * not be enabled now. That's because the replication progress must be set and + * the replication origin name (one of the function arguments) contains the + * subscription OID in its name. Once the subscription is created, + * set_replication_progress() can obtain the chosen origin name and set up its + * initial location. + */ +static void +create_subscription(PGconn *conn, const struct LogicalRepInfo *dbinfo) +{ + PQExpBuffer str = createPQExpBuffer(); + PGresult *res; + char *pubname_esc; + char *subname_esc; + char *pubconninfo_esc; + char *replslotname_esc; + + Assert(conn != NULL); + + pubname_esc = PQescapeIdentifier(conn, dbinfo->pubname, strlen(dbinfo->pubname)); + subname_esc = PQescapeIdentifier(conn, dbinfo->subname, strlen(dbinfo->subname)); + pubconninfo_esc = PQescapeLiteral(conn, dbinfo->pubconninfo, strlen(dbinfo->pubconninfo)); + replslotname_esc = PQescapeLiteral(conn, dbinfo->replslotname, strlen(dbinfo->replslotname)); + + pg_log_info("creating subscription \"%s\" in database \"%s\"", + dbinfo->subname, dbinfo->dbname); + + appendPQExpBuffer(str, + "CREATE SUBSCRIPTION %s CONNECTION %s PUBLICATION %s " + "WITH (create_slot = false, enabled = false, " + "slot_name = %s, copy_data = false)", + subname_esc, pubconninfo_esc, pubname_esc, replslotname_esc); + + PQfreemem(pubname_esc); + PQfreemem(subname_esc); + PQfreemem(pubconninfo_esc); + PQfreemem(replslotname_esc); + + pg_log_debug("command is: %s", str->data); + + if (!dry_run) + { + res = PQexec(conn, str->data); + if (PQresultStatus(res) != PGRES_COMMAND_OK) + { + pg_log_error("could not create subscription \"%s\" in database \"%s\": %s", + dbinfo->subname, dbinfo->dbname, PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + PQclear(res); + } + + destroyPQExpBuffer(str); +} + +/* + * Sets the replication progress to the consistent LSN. + * + * The subscriber caught up to the consistent LSN provided by the last + * replication slot that was created. The goal is to set up the initial + * location for the logical replication that is the exact LSN that the + * subscriber was promoted. Once the subscription is enabled it will start + * streaming from that location onwards. In dry run mode, the subscription OID + * and LSN are set to invalid values for printing purposes. + */ +static void +set_replication_progress(PGconn *conn, const struct LogicalRepInfo *dbinfo, const char *lsn) +{ + PQExpBuffer str = createPQExpBuffer(); + PGresult *res; + Oid suboid; + char *subname; + char *dbname; + char *originname; + char *lsnstr; + + Assert(conn != NULL); + + subname = PQescapeLiteral(conn, dbinfo->subname, strlen(dbinfo->subname)); + dbname = PQescapeLiteral(conn, dbinfo->dbname, strlen(dbinfo->dbname)); + + appendPQExpBuffer(str, + "SELECT s.oid FROM pg_catalog.pg_subscription s " + "INNER JOIN pg_catalog.pg_database d ON (s.subdbid = d.oid) " + "WHERE s.subname = %s AND d.datname = %s", + subname, dbname); + + res = PQexec(conn, str->data); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + pg_log_error("could not obtain subscription OID: %s", + PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + + if (PQntuples(res) != 1 && !dry_run) + { + pg_log_error("could not obtain subscription OID: got %d rows, expected %d row", + PQntuples(res), 1); + disconnect_database(conn, true); + } + + if (dry_run) + { + suboid = InvalidOid; + lsnstr = psprintf("%X/%X", LSN_FORMAT_ARGS((XLogRecPtr) InvalidXLogRecPtr)); + } + else + { + suboid = strtoul(PQgetvalue(res, 0, 0), NULL, 10); + lsnstr = psprintf("%s", lsn); + } + + PQclear(res); + + /* + * The origin name is defined as pg_%u. %u is the subscription OID. See + * ApplyWorkerMain(). + */ + originname = psprintf("pg_%u", suboid); + + pg_log_info("setting the replication progress (node name \"%s\", LSN %s) in database \"%s\"", + originname, lsnstr, dbinfo->dbname); + + resetPQExpBuffer(str); + appendPQExpBuffer(str, + "SELECT pg_catalog.pg_replication_origin_advance('%s', '%s')", + originname, lsnstr); + + pg_log_debug("command is: %s", str->data); + + if (!dry_run) + { + res = PQexec(conn, str->data); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + pg_log_error("could not set replication progress for subscription \"%s\": %s", + dbinfo->subname, PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + PQclear(res); + } + + PQfreemem(subname); + PQfreemem(dbname); + pg_free(originname); + pg_free(lsnstr); + destroyPQExpBuffer(str); +} + +/* + * Enables the subscription. + * + * The subscription was created in a previous step but it was disabled. After + * adjusting the initial logical replication location, enable the subscription. + */ +static void +enable_subscription(PGconn *conn, const struct LogicalRepInfo *dbinfo) +{ + PQExpBuffer str = createPQExpBuffer(); + PGresult *res; + char *subname; + + Assert(conn != NULL); + + subname = PQescapeIdentifier(conn, dbinfo->subname, strlen(dbinfo->subname)); + + pg_log_info("enabling subscription \"%s\" in database \"%s\"", + dbinfo->subname, dbinfo->dbname); + + appendPQExpBuffer(str, "ALTER SUBSCRIPTION %s ENABLE", subname); + + pg_log_debug("command is: %s", str->data); + + if (!dry_run) + { + res = PQexec(conn, str->data); + if (PQresultStatus(res) != PGRES_COMMAND_OK) + { + pg_log_error("could not enable subscription \"%s\": %s", + dbinfo->subname, PQresultErrorMessage(res)); + disconnect_database(conn, true); + } + + PQclear(res); + } + + PQfreemem(subname); + destroyPQExpBuffer(str); +} + +int +main(int argc, char **argv) +{ + static struct option long_options[] = + { + {"database", required_argument, NULL, 'd'}, + {"pgdata", required_argument, NULL, 'D'}, + {"dry-run", no_argument, NULL, 'n'}, + {"subscriber-port", required_argument, NULL, 'p'}, + {"publisher-server", required_argument, NULL, 'P'}, + {"socketdir", required_argument, NULL, 's'}, + {"recovery-timeout", required_argument, NULL, 't'}, + {"subscriber-username", required_argument, NULL, 'U'}, + {"verbose", no_argument, NULL, 'v'}, + {"version", no_argument, NULL, 'V'}, + {"help", no_argument, NULL, '?'}, + {"config-file", required_argument, NULL, 1}, + {"publication", required_argument, NULL, 2}, + {"replication-slot", required_argument, NULL, 3}, + {"subscription", required_argument, NULL, 4}, + {NULL, 0, NULL, 0} + }; + + struct CreateSubscriberOptions opt = {0}; + + int c; + int option_index; + + char *pub_base_conninfo; + char *sub_base_conninfo; + char *dbname_conninfo = NULL; + + uint64 pub_sysid; + uint64 sub_sysid; + struct stat statbuf; + + char *consistent_lsn; + + char pidfile[MAXPGPATH]; + + pg_logging_init(argv[0]); + pg_logging_set_level(PG_LOG_WARNING); + progname = get_progname(argv[0]); + set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_basebackup")); + + if (argc > 1) + { + if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) + { + usage(); + exit(0); + } + else if (strcmp(argv[1], "-V") == 0 + || strcmp(argv[1], "--version") == 0) + { + puts("pg_createsubscriber (PostgreSQL) " PG_VERSION); + exit(0); + } + } + + /* Default settings */ + subscriber_dir = NULL; + opt.config_file = NULL; + opt.pub_conninfo_str = NULL; + opt.socket_dir = NULL; + opt.sub_port = DEFAULT_SUB_PORT; + opt.sub_username = NULL; + opt.database_names = (SimpleStringList) + { + 0 + }; + opt.recovery_timeout = 0; + + /* + * Don't allow it to be run as root. It uses pg_ctl which does not allow + * it either. + */ +#ifndef WIN32 + if (geteuid() == 0) + { + pg_log_error("cannot be executed by \"root\""); + pg_log_error_hint("You must run %s as the PostgreSQL superuser.", + progname); + exit(1); + } +#endif + + get_restricted_token(); + + while ((c = getopt_long(argc, argv, "d:D:np:P:s:t:U:v", + long_options, &option_index)) != -1) + { + switch (c) + { + case 'd': + if (!simple_string_list_member(&opt.database_names, optarg)) + { + simple_string_list_append(&opt.database_names, optarg); + num_dbs++; + } + else + { + pg_log_error("database \"%s\" specified more than once", optarg); + exit(1); + } + break; + case 'D': + subscriber_dir = pg_strdup(optarg); + canonicalize_path(subscriber_dir); + break; + case 'n': + dry_run = true; + break; + case 'p': + opt.sub_port = pg_strdup(optarg); + break; + case 'P': + opt.pub_conninfo_str = pg_strdup(optarg); + break; + case 's': + opt.socket_dir = pg_strdup(optarg); + canonicalize_path(opt.socket_dir); + break; + case 't': + opt.recovery_timeout = atoi(optarg); + break; + case 'U': + opt.sub_username = pg_strdup(optarg); + break; + case 'v': + pg_logging_increase_verbosity(); + break; + case 1: + opt.config_file = pg_strdup(optarg); + break; + case 2: + if (!simple_string_list_member(&opt.pub_names, optarg)) + { + simple_string_list_append(&opt.pub_names, optarg); + num_pubs++; + } + else + { + pg_log_error("publication \"%s\" specified more than once", optarg); + exit(1); + } + break; + case 3: + if (!simple_string_list_member(&opt.replslot_names, optarg)) + { + simple_string_list_append(&opt.replslot_names, optarg); + num_replslots++; + } + else + { + pg_log_error("replication slot \"%s\" specified more than once", optarg); + exit(1); + } + break; + case 4: + if (!simple_string_list_member(&opt.sub_names, optarg)) + { + simple_string_list_append(&opt.sub_names, optarg); + num_subs++; + } + else + { + pg_log_error("subscription \"%s\" specified more than once", optarg); + exit(1); + } + break; + default: + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + } + + /* Any non-option arguments? */ + if (optind < argc) + { + pg_log_error("too many command-line arguments (first is \"%s\")", + argv[optind]); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + + /* Required arguments */ + if (subscriber_dir == NULL) + { + pg_log_error("no subscriber data directory specified"); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + + /* If socket directory is not provided, use the current directory */ + if (opt.socket_dir == NULL) + { + char cwd[MAXPGPATH]; + + if (!getcwd(cwd, MAXPGPATH)) + pg_fatal("could not determine current directory"); + opt.socket_dir = pg_strdup(cwd); + canonicalize_path(opt.socket_dir); + } + + /* + * Parse connection string. Build a base connection string that might be + * reused by multiple databases. + */ + if (opt.pub_conninfo_str == NULL) + { + /* + * TODO use primary_conninfo (if available) from subscriber and + * extract publisher connection string. Assume that there are + * identical entries for physical and logical replication. If there is + * not, we would fail anyway. + */ + pg_log_error("no publisher connection string specified"); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + pg_log_info("validating publisher connection string"); + pub_base_conninfo = get_base_conninfo(opt.pub_conninfo_str, + &dbname_conninfo); + if (pub_base_conninfo == NULL) + exit(1); + + pg_log_info("validating subscriber connection string"); + sub_base_conninfo = get_sub_conninfo(&opt); + + if (opt.database_names.head == NULL) + { + pg_log_info("no database was specified"); + + /* + * If --database option is not provided, try to obtain the dbname from + * the publisher conninfo. If dbname parameter is not available, error + * out. + */ + if (dbname_conninfo) + { + simple_string_list_append(&opt.database_names, dbname_conninfo); + num_dbs++; + + pg_log_info("database name \"%s\" was extracted from the publisher connection string", + dbname_conninfo); + } + else + { + pg_log_error("no database name specified"); + pg_log_error_hint("Try \"%s --help\" for more information.", + progname); + exit(1); + } + } + + /* Number of object names must match number of databases */ + if (num_pubs > 0 && num_pubs != num_dbs) + { + pg_log_error("wrong number of publication names specified"); + pg_log_error_detail("The number of specified publication names (%d) must match the number of specified database names (%d).", + num_pubs, num_dbs); + exit(1); + } + if (num_subs > 0 && num_subs != num_dbs) + { + pg_log_error("wrong number of subscription names specified"); + pg_log_error_detail("The number of specified subscription names (%d) must match the number of specified database names (%d).", + num_subs, num_dbs); + exit(1); + } + if (num_replslots > 0 && num_replslots != num_dbs) + { + pg_log_error("wrong number of replication slot names specified"); + pg_log_error_detail("The number of specified replication slot names (%d) must match the number of specified database names (%d).", + num_replslots, num_dbs); + exit(1); + } + + /* Get the absolute path of pg_ctl and pg_resetwal on the subscriber */ + pg_ctl_path = get_exec_path(argv[0], "pg_ctl"); + pg_resetwal_path = get_exec_path(argv[0], "pg_resetwal"); + + /* Rudimentary check for a data directory */ + check_data_directory(subscriber_dir); + + /* + * Store database information for publisher and subscriber. It should be + * called before atexit() because its return is used in the + * cleanup_objects_atexit(). + */ + dbinfo = store_pub_sub_info(&opt, pub_base_conninfo, sub_base_conninfo); + + /* Register a function to clean up objects in case of failure */ + atexit(cleanup_objects_atexit); + + /* + * Check if the subscriber data directory has the same system identifier + * than the publisher data directory. + */ + pub_sysid = get_primary_sysid(dbinfo[0].pubconninfo); + sub_sysid = get_standby_sysid(subscriber_dir); + if (pub_sysid != sub_sysid) + pg_fatal("subscriber data directory is not a copy of the source database cluster"); + + /* Subscriber PID file */ + snprintf(pidfile, MAXPGPATH, "%s/postmaster.pid", subscriber_dir); + + /* + * The standby server must not be running. If the server is started under + * service manager and pg_createsubscriber stops it, the service manager + * might react to this action and start the server again. Therefore, + * refuse to proceed if the server is running to avoid possible failures. + */ + if (stat(pidfile, &statbuf) == 0) + { + pg_log_error("standby server is running"); + pg_log_error_hint("Stop the standby server and try again."); + exit(1); + } + + /* + * Start a short-lived standby server with temporary parameters (provided + * by command-line options). The goal is to avoid connections during the + * transformation steps. + */ + pg_log_info("starting the standby server with command-line options"); + start_standby_server(&opt, true, false); + + /* Check if the standby server is ready for logical replication */ + check_subscriber(dbinfo); + + /* Check if the primary server is ready for logical replication */ + check_publisher(dbinfo); + + /* + * Stop the target server. The recovery process requires that the server + * reaches a consistent state before targeting the recovery stop point. + * Make sure a consistent state is reached (stop the target server + * guarantees it) *before* creating the replication slots in + * setup_publisher(). + */ + pg_log_info("stopping the subscriber"); + stop_standby_server(subscriber_dir); + + /* Create the required objects for each database on publisher */ + consistent_lsn = setup_publisher(dbinfo); + + /* Write the required recovery parameters */ + setup_recovery(dbinfo, subscriber_dir, consistent_lsn); + + /* + * Start subscriber so the recovery parameters will take effect. Wait + * until accepting connections. We don't want to start logical replication + * during setup. + */ + pg_log_info("starting the subscriber"); + start_standby_server(&opt, true, true); + + /* Waiting the subscriber to be promoted */ + wait_for_end_recovery(dbinfo[0].subconninfo, &opt); + + /* + * Create the subscription for each database on subscriber. It does not + * enable it immediately because it needs to adjust the replication start + * point to the LSN reported by setup_publisher(). It also cleans up + * publications created by this tool and replication to the standby. + */ + setup_subscriber(dbinfo, consistent_lsn); + + /* Remove primary_slot_name if it exists on primary */ + drop_primary_replication_slot(dbinfo, primary_slot_name); + + /* Remove failover replication slots if they exist on subscriber */ + drop_failover_replication_slots(dbinfo); + + /* Stop the subscriber */ + pg_log_info("stopping the subscriber"); + stop_standby_server(subscriber_dir); + + /* Change system identifier from subscriber */ + modify_subscriber_sysid(&opt); + + success = true; + + pg_log_info("Done!"); + + return 0; +} diff --git a/src/bin/pg_basebackup/pg_receivewal.c b/src/bin/pg_basebackup/pg_receivewal.c index d0a4079d50697..555f0175f0e82 100644 --- a/src/bin/pg_basebackup/pg_receivewal.c +++ b/src/bin/pg_basebackup/pg_receivewal.c @@ -5,7 +5,7 @@ * * Author: Magnus Hagander * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/pg_receivewal.c diff --git a/src/bin/pg_basebackup/pg_recvlogical.c b/src/bin/pg_basebackup/pg_recvlogical.c index f3c7937a1dfac..3db520ed38b65 100644 --- a/src/bin/pg_basebackup/pg_recvlogical.c +++ b/src/bin/pg_basebackup/pg_recvlogical.c @@ -3,7 +3,7 @@ * pg_recvlogical.c - receive data from a logical decoding slot in a streaming * fashion and write it to a local file. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/pg_recvlogical.c @@ -32,6 +32,14 @@ /* Time to sleep between reconnection attempts */ #define RECONNECT_SLEEP_TIME 5 +typedef enum +{ + STREAM_STOP_NONE, + STREAM_STOP_END_OF_WAL, + STREAM_STOP_KEEPALIVE, + STREAM_STOP_SIGNAL +} StreamStopReason; + /* Global Options */ static char *outfile = NULL; static int verbose = 0; @@ -55,6 +63,7 @@ static const char *plugin = "test_decoding"; /* Global State */ static int outfd = -1; static volatile sig_atomic_t time_to_abort = false; +static volatile sig_atomic_t stop_reason = STREAM_STOP_NONE; static volatile sig_atomic_t output_reopen = false; static bool output_isfile; static TimestampTz output_last_fsync = -1; @@ -66,7 +75,8 @@ static void usage(void); static void StreamLogicalLog(void); static bool flushAndSendFeedback(PGconn *conn, TimestampTz *now); static void prepareToTerminate(PGconn *conn, XLogRecPtr endpos, - bool keepalive, XLogRecPtr lsn); + StreamStopReason reason, + XLogRecPtr lsn); static void usage(void) @@ -207,9 +217,11 @@ StreamLogicalLog(void) TimestampTz last_status = -1; int i; PQExpBuffer query; + XLogRecPtr cur_record_lsn; output_written_lsn = InvalidXLogRecPtr; output_fsync_lsn = InvalidXLogRecPtr; + cur_record_lsn = InvalidXLogRecPtr; /* * Connect in replication mode to the server @@ -275,7 +287,8 @@ StreamLogicalLog(void) int bytes_written; TimestampTz now; int hdr_len; - XLogRecPtr cur_record_lsn = InvalidXLogRecPtr; + + cur_record_lsn = InvalidXLogRecPtr; if (copybuf != NULL) { @@ -487,7 +500,7 @@ StreamLogicalLog(void) if (endposReached) { - prepareToTerminate(conn, endpos, true, InvalidXLogRecPtr); + stop_reason = STREAM_STOP_KEEPALIVE; time_to_abort = true; break; } @@ -527,7 +540,7 @@ StreamLogicalLog(void) */ if (!flushAndSendFeedback(conn, &now)) goto error; - prepareToTerminate(conn, endpos, false, cur_record_lsn); + stop_reason = STREAM_STOP_END_OF_WAL; time_to_abort = true; break; } @@ -572,12 +585,16 @@ StreamLogicalLog(void) /* endpos was exactly the record we just processed, we're done */ if (!flushAndSendFeedback(conn, &now)) goto error; - prepareToTerminate(conn, endpos, false, cur_record_lsn); + stop_reason = STREAM_STOP_END_OF_WAL; time_to_abort = true; break; } } + /* Clean up connection state if stream has been aborted */ + if (time_to_abort) + prepareToTerminate(conn, endpos, stop_reason, cur_record_lsn); + res = PQgetResult(conn); if (PQresultStatus(res) == PGRES_COPY_OUT) { @@ -656,6 +673,7 @@ StreamLogicalLog(void) static void sigexit_handler(SIGNAL_ARGS) { + stop_reason = STREAM_STOP_SIGNAL; time_to_abort = true; } @@ -1021,18 +1039,31 @@ flushAndSendFeedback(PGconn *conn, TimestampTz *now) * retry on failure. */ static void -prepareToTerminate(PGconn *conn, XLogRecPtr endpos, bool keepalive, XLogRecPtr lsn) +prepareToTerminate(PGconn *conn, XLogRecPtr endpos, StreamStopReason reason, + XLogRecPtr lsn) { (void) PQputCopyEnd(conn, NULL); (void) PQflush(conn); if (verbose) { - if (keepalive) - pg_log_info("end position %X/%X reached by keepalive", - LSN_FORMAT_ARGS(endpos)); - else - pg_log_info("end position %X/%X reached by WAL record at %X/%X", - LSN_FORMAT_ARGS(endpos), LSN_FORMAT_ARGS(lsn)); + switch (reason) + { + case STREAM_STOP_SIGNAL: + pg_log_info("received interrupt signal, exiting"); + break; + case STREAM_STOP_KEEPALIVE: + pg_log_info("end position %X/%X reached by keepalive", + LSN_FORMAT_ARGS(endpos)); + break; + case STREAM_STOP_END_OF_WAL: + Assert(!XLogRecPtrIsInvalid(lsn)); + pg_log_info("end position %X/%X reached by WAL record at %X/%X", + LSN_FORMAT_ARGS(endpos), LSN_FORMAT_ARGS(lsn)); + break; + case STREAM_STOP_NONE: + Assert(false); + break; + } } } diff --git a/src/bin/pg_basebackup/po/de.po b/src/bin/pg_basebackup/po/de.po index 3862d33690bff..14b06dde075f9 100644 --- a/src/bin/pg_basebackup/po/de.po +++ b/src/bin/pg_basebackup/po/de.po @@ -1,15 +1,15 @@ # German message translation file for pg_basebackup -# Copyright (C) 2011 - 2023 PostgreSQL Global Development Group +# Copyright (C) 2011 - 2024 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 16\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-19 17:19+0000\n" -"PO-Revision-Date: 2023-05-19 20:49+0200\n" +"POT-Creation-Date: 2024-08-25 09:20+0000\n" +"PO-Revision-Date: 2024-08-25 16:44+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -90,6 +90,65 @@ msgstr "Komprimierungsalgorithmus »%s« akzeptiert keine Worker-Anzahl" msgid "compression algorithm \"%s\" does not support long-distance mode" msgstr "Komprimierungsalgorithmus »%s« unterstützt keinen Long-Distance-Modus" +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" + +#: ../../common/controldata_utils.c:110 pg_basebackup.c:1873 +#: pg_receivewal.c:402 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "konnte Datei »%s« nicht lesen: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: bbstreamer_file.c:138 pg_recvlogical.c:650 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schließen: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "falsche Byte-Reihenfolge" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"möglicherweise falsche Byte-Reihenfolge\n" +"Die Byte-Reihenfolge, die zur Speicherung der Datei pg_control verwendet wurde,\n" +"stimmt möglicherweise nicht mit der von diesem Programm verwendeten überein. In\n" +"diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n" +"wäre inkompatibel mit diesem Datenverzeichnis." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: pg_basebackup.c:1846 pg_receivewal.c:386 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "konnte Datei »%s« nicht öffnen: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schreiben: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 pg_recvlogical.c:204 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "konnte Datei »%s« nicht fsyncen: %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format @@ -101,39 +160,69 @@ msgstr "Speicher aufgebraucht\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:447 -#: pg_receivewal.c:319 pg_recvlogical.c:339 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_receivewal.c:319 pg_recvlogical.c:352 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" -#: ../../common/file_utils.c:162 pg_receivewal.c:242 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_receivewal.c:242 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: ../../common/file_utils.c:196 pg_receivewal.c:471 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_receivewal.c:471 #, c-format msgid "could not read directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht lesen: %m" -#: ../../common/file_utils.c:228 ../../common/file_utils.c:287 -#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121 -#: pg_receivewal.c:386 +#: ../../common/file_utils.c:498 pg_basebackup.c:2344 walmethods.c:462 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "konnte Datei »%s« nicht öffnen: %m" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" -#: ../../common/file_utils.c:299 ../../common/file_utils.c:369 -#: pg_recvlogical.c:194 +#: ../../common/restricted_token.c:60 #, c-format -msgid "could not fsync file \"%s\": %m" -msgstr "konnte Datei »%s« nicht fsyncen: %m" +msgid "could not open process token: error code %lu" +msgstr "konnte Prozess-Token nicht öffnen: Fehlercode %lu" -#: ../../common/file_utils.c:379 pg_basebackup.c:2237 walmethods.c:462 +#: ../../common/restricted_token.c:74 #, c-format -msgid "could not rename file \"%s\" to \"%s\": %m" -msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" +msgid "could not allocate SIDs: error code %lu" +msgstr "konnte SIDs nicht erzeugen: Fehlercode %lu" + +#: ../../common/restricted_token.c:94 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "konnte beschränktes Token nicht erzeugen: Fehlercode %lu" + +#: ../../common/restricted_token.c:115 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "konnte Prozess für Befehl »%s« nicht starten: Fehlercode %lu" + +#: ../../common/restricted_token.c:153 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu" #: ../../fe_utils/option_utils.c:69 #, c-format @@ -145,51 +234,62 @@ msgstr "ungültiger Wert »%s« für Option %s" msgid "%s must be in range %d..%d" msgstr "%s muss im Bereich %d..%d sein" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1609 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "unbekannte Sync-Methode: %s" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 pg_basebackup.c:1636 streamutil.c:331 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" -#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121 -#: bbstreamer_file.c:258 pg_basebackup.c:1406 pg_basebackup.c:1700 +#: ../../fe_utils/recovery_gen.c:143 bbstreamer_file.c:121 +#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727 #, c-format msgid "could not write to file \"%s\": %m" msgstr "konnte nicht in Datei »%s« schreiben: %m" -#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360 -#: pg_basebackup.c:1470 pg_basebackup.c:1679 +#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:361 +#: pg_basebackup.c:1497 pg_basebackup.c:1706 #, c-format msgid "could not create file \"%s\": %m" msgstr "konnte Datei »%s« nicht erstellen: %m" -#: bbstreamer_file.c:138 pg_recvlogical.c:633 +#: ../../fe_utils/string_utils.c:434 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "konnte Datei »%s« nicht schließen: %m" +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s«\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "Datenbankname enthält Newline oder Carriage Return: »%s«\n" #: bbstreamer_file.c:275 #, c-format msgid "unexpected state while extracting archive" msgstr "unerwarteter Zustand beim Extrahieren des Archivs" -#: bbstreamer_file.c:320 pg_basebackup.c:686 pg_basebackup.c:730 +#: bbstreamer_file.c:321 pg_basebackup.c:698 pg_basebackup.c:712 +#: pg_basebackup.c:757 #, c-format msgid "could not create directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" -#: bbstreamer_file.c:325 +#: bbstreamer_file.c:326 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "konnte Zugriffsrechte für Verzeichnis »%s« nicht setzen: %m" -#: bbstreamer_file.c:344 +#: bbstreamer_file.c:345 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "konnte symbolische Verknüpfung von »%s« nach »%s« nicht erzeugen: %m" -#: bbstreamer_file.c:364 +#: bbstreamer_file.c:365 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "konnte Zugriffsrechte von Datei »%s« nicht setzen: %m" @@ -224,7 +324,7 @@ msgstr "konnte nicht in komprimierte Datei »%s« schreiben: %s" msgid "could not close compressed file \"%s\": %m" msgstr "konnte komprimierte Datei »%s« nicht schließen: %m" -#: bbstreamer_gzip.c:245 walmethods.c:876 +#: bbstreamer_gzip.c:245 walmethods.c:880 #, c-format msgid "could not initialize compression library" msgstr "konnte Komprimierungsbibliothek nicht initialisieren" @@ -274,12 +374,12 @@ msgstr "Tar-Datei-Trailer überschreitet 2 Blöcke" msgid "unexpected state while parsing tar archive" msgstr "unerwarteter Zustand beim Parsen des Tar-Archivs" -#: bbstreamer_tar.c:296 +#: bbstreamer_tar.c:292 #, c-format msgid "tar member has empty name" msgstr "Tar-Mitglied hat leeren Namen" -#: bbstreamer_tar.c:328 +#: bbstreamer_tar.c:326 #, c-format msgid "COPY stream ended before last file was finished" msgstr "COPY-Strom endete vor dem Ende der letzten Datei" @@ -309,87 +409,87 @@ msgstr "konnte Long-Distance-Modus nicht einschalten: %s" msgid "could not create zstd decompression context" msgstr "konnte zstd-Dekomprimierungskontext nicht erzeugen" -#: pg_basebackup.c:238 +#: pg_basebackup.c:245 #, c-format msgid "removing data directory \"%s\"" msgstr "entferne Datenverzeichnis »%s«" -#: pg_basebackup.c:240 +#: pg_basebackup.c:247 #, c-format msgid "failed to remove data directory" msgstr "konnte Datenverzeichnis nicht entfernen" -#: pg_basebackup.c:244 +#: pg_basebackup.c:251 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "entferne Inhalt des Datenverzeichnisses »%s«" -#: pg_basebackup.c:246 +#: pg_basebackup.c:253 #, c-format msgid "failed to remove contents of data directory" msgstr "konnte Inhalt des Datenverzeichnisses nicht entfernen" -#: pg_basebackup.c:251 +#: pg_basebackup.c:258 #, c-format msgid "removing WAL directory \"%s\"" msgstr "entferne WAL-Verzeichnis »%s«" -#: pg_basebackup.c:253 +#: pg_basebackup.c:260 #, c-format msgid "failed to remove WAL directory" msgstr "konnte WAL-Verzeichnis nicht entfernen" -#: pg_basebackup.c:257 +#: pg_basebackup.c:264 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "entferne Inhalt des WAL-Verzeichnisses »%s«" -#: pg_basebackup.c:259 +#: pg_basebackup.c:266 #, c-format msgid "failed to remove contents of WAL directory" msgstr "konnte Inhalt des WAL-Verzeichnisses nicht entfernen" -#: pg_basebackup.c:265 +#: pg_basebackup.c:272 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "Datenverzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt" -#: pg_basebackup.c:268 +#: pg_basebackup.c:275 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "WAL-Verzeichnis »%s« wurde auf Anwenderwunsch nicht entfernt" -#: pg_basebackup.c:272 +#: pg_basebackup.c:279 #, c-format msgid "changes to tablespace directories will not be undone" msgstr "Änderungen in Tablespace-Verzeichnissen werden nicht rückgängig gemacht" -#: pg_basebackup.c:324 +#: pg_basebackup.c:331 #, c-format msgid "directory name too long" msgstr "Verzeichnisname zu lang" -#: pg_basebackup.c:331 +#: pg_basebackup.c:338 #, c-format msgid "multiple \"=\" signs in tablespace mapping" msgstr "mehrere »=«-Zeichen im Tablespace-Mapping" -#: pg_basebackup.c:340 +#: pg_basebackup.c:347 #, c-format msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "ungültiges Tablespace-Mapping-Format »%s«, muss »ALTES_VERZ=NEUES_VERZ« sein" -#: pg_basebackup.c:359 +#: pg_basebackup.c:366 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "altes Verzeichnis im Tablespace-Mapping ist kein absoluter Pfad: %s" -#: pg_basebackup.c:363 +#: pg_basebackup.c:370 #, c-format msgid "new directory is not an absolute path in tablespace mapping: %s" msgstr "neues Verzeichnis im Tablespace-Mapping ist kein absoluter Pfad: %s" -#: pg_basebackup.c:385 +#: pg_basebackup.c:392 #, c-format msgid "" "%s takes a base backup of a running PostgreSQL server.\n" @@ -398,17 +498,19 @@ msgstr "" "%s erzeugt eine Basissicherung eines laufenden PostgreSQL-Servers.\n" "\n" -#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76 +#: pg_basebackup.c:394 pg_createsubscriber.c:221 pg_receivewal.c:79 +#: pg_recvlogical.c:86 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77 +#: pg_basebackup.c:395 pg_createsubscriber.c:222 pg_receivewal.c:80 +#: pg_recvlogical.c:87 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_basebackup.c:389 +#: pg_basebackup.c:396 #, c-format msgid "" "\n" @@ -417,17 +519,26 @@ msgstr "" "\n" "Optionen die die Ausgabe kontrollieren:\n" -#: pg_basebackup.c:390 +#: pg_basebackup.c:397 #, c-format msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n" msgstr " -D, --pgdata=VERZ Basissicherung in dieses Verzeichnis empfangen\n" -#: pg_basebackup.c:391 +#: pg_basebackup.c:398 #, c-format msgid " -F, --format=p|t output format (plain (default), tar)\n" msgstr " -F, --format=p|t Ausgabeformat (plain (Voreinstellung), tar)\n" -#: pg_basebackup.c:392 +#: pg_basebackup.c:399 +#, c-format +msgid "" +" -i, --incremental=OLDMANIFEST\n" +" take incremental backup\n" +msgstr "" +" -i, --incremental=ALTES_MANIFEST\n" +" inkrementelles Backup durchführen\n" + +#: pg_basebackup.c:401 #, c-format msgid "" " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" @@ -436,7 +547,7 @@ msgstr "" " -r, --max-rate=RATE maximale Transferrate für Übertragung des Datenver-\n" " zeichnisses (in kB/s, oder Suffix »k« oder »M« abgeben)\n" -#: pg_basebackup.c:394 +#: pg_basebackup.c:403 #, c-format msgid "" " -R, --write-recovery-conf\n" @@ -445,7 +556,7 @@ msgstr "" " -R, --write-recovery-conf\n" " Konfiguration für Replikation schreiben\n" -#: pg_basebackup.c:396 +#: pg_basebackup.c:405 #, c-format msgid "" " -t, --target=TARGET[:DETAIL]\n" @@ -454,7 +565,7 @@ msgstr "" " -t, --target=ZIEL[:DETAIL]\n" " Backup-Ziel (wenn nicht Client)\n" -#: pg_basebackup.c:398 +#: pg_basebackup.c:407 #, c-format msgid "" " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" @@ -463,12 +574,12 @@ msgstr "" " -T, --tablespace-mapping=ALTES_VERZ=NEUES_VERZ\n" " Tablespace in ALTES_VERZ nach NEUES_VERZ verlagern\n" -#: pg_basebackup.c:400 +#: pg_basebackup.c:409 #, c-format msgid " --waldir=WALDIR location for the write-ahead log directory\n" msgstr " --waldir=WALVERZ Verzeichnis für das Write-Ahead-Log\n" -#: pg_basebackup.c:401 +#: pg_basebackup.c:410 #, c-format msgid "" " -X, --wal-method=none|fetch|stream\n" @@ -477,12 +588,12 @@ msgstr "" " -X, --wal-method=none|fetch|stream\n" " benötigte WAL-Dateien mit angegebener Methode einbeziehen\n" -#: pg_basebackup.c:403 +#: pg_basebackup.c:412 #, c-format msgid " -z, --gzip compress tar output\n" msgstr " -z, --gzip Tar-Ausgabe komprimieren\n" -#: pg_basebackup.c:404 +#: pg_basebackup.c:413 #, c-format msgid "" " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" @@ -491,12 +602,12 @@ msgstr "" " -Z, --compress=[{client|server}-]METHODE[:DETAIL]\n" " auf Client oder Server wie angegeben komprimieren\n" -#: pg_basebackup.c:406 +#: pg_basebackup.c:415 #, c-format msgid " -Z, --compress=none do not compress tar output\n" msgstr " -Z, --compress=none Tar-Ausgabe nicht komprimieren\n" -#: pg_basebackup.c:407 +#: pg_basebackup.c:416 #, c-format msgid "" "\n" @@ -505,58 +616,59 @@ msgstr "" "\n" "Allgemeine Optionen:\n" -#: pg_basebackup.c:408 +#: pg_basebackup.c:417 #, c-format msgid "" " -c, --checkpoint=fast|spread\n" -" set fast or spread checkpointing\n" +" set fast or spread (default) checkpointing\n" msgstr "" " -c, --checkpoint=fast|spread\n" -" schnelles oder verteiltes Checkpointing einstellen\n" +" schnelles oder verteiltes (Voreinstellung) Checkpointing\n" +" einstellen\n" -#: pg_basebackup.c:410 +#: pg_basebackup.c:419 #, c-format msgid " -C, --create-slot create replication slot\n" msgstr " -C, --create-slot Replikations-Slot erzeugen\n" -#: pg_basebackup.c:411 +#: pg_basebackup.c:420 #, c-format msgid " -l, --label=LABEL set backup label\n" msgstr " -l, --label=LABEL Backup-Label setzen\n" -#: pg_basebackup.c:412 +#: pg_basebackup.c:421 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean nach Fehlern nicht aufräumen\n" -#: pg_basebackup.c:413 +#: pg_basebackup.c:422 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" " geschrieben sind\n" -#: pg_basebackup.c:414 +#: pg_basebackup.c:423 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress Fortschrittsinformationen zeigen\n" -#: pg_basebackup.c:415 pg_receivewal.c:89 +#: pg_basebackup.c:424 pg_receivewal.c:89 #, c-format msgid " -S, --slot=SLOTNAME replication slot to use\n" msgstr " -S, --slot=SLOTNAME zu verwendender Replikations-Slot\n" -#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98 +#: pg_basebackup.c:425 pg_receivewal.c:91 pg_recvlogical.c:108 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose »Verbose«-Modus\n" -#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99 +#: pg_basebackup.c:426 pg_receivewal.c:92 pg_recvlogical.c:109 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_basebackup.c:418 +#: pg_basebackup.c:427 #, c-format msgid "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" @@ -565,7 +677,7 @@ msgstr "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" " Algorithmus für Manifest-Prüfsummen\n" -#: pg_basebackup.c:420 +#: pg_basebackup.c:429 #, c-format msgid "" " --manifest-force-encode\n" @@ -574,22 +686,22 @@ msgstr "" " --manifest-force-encode\n" " alle Dateinamen im Manifest hex-kodieren\n" -#: pg_basebackup.c:422 +#: pg_basebackup.c:431 #, c-format msgid " --no-estimate-size do not estimate backup size in server side\n" msgstr " --no-estimate-size nicht die Backup-Größe auf dem Server schätzen\n" -#: pg_basebackup.c:423 +#: pg_basebackup.c:432 #, c-format msgid " --no-manifest suppress generation of backup manifest\n" msgstr " --no-manifest kein Backup-Manifest erzeugen\n" -#: pg_basebackup.c:424 +#: pg_basebackup.c:433 #, c-format msgid " --no-slot prevent creation of temporary replication slot\n" msgstr " --no-slot keinen temporären Replikations-Slot erzeugen\n" -#: pg_basebackup.c:425 +#: pg_basebackup.c:434 #, c-format msgid "" " --no-verify-checksums\n" @@ -598,12 +710,22 @@ msgstr "" " --no-verify-checksums\n" " Prüfsummen nicht überprüfen\n" -#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100 +#: pg_basebackup.c:436 +#, c-format +msgid "" +" --sync-method=METHOD\n" +" set method for syncing files to disk\n" +msgstr "" +" --sync-method=METHODE\n" +" Methode zum Synchronisieren von Dateien auf Festplatte\n" +" setzen\n" + +#: pg_basebackup.c:438 pg_receivewal.c:95 pg_recvlogical.c:110 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101 +#: pg_basebackup.c:439 pg_receivewal.c:96 pg_recvlogical.c:111 #, c-format msgid "" "\n" @@ -612,22 +734,22 @@ msgstr "" "\n" "Verbindungsoptionen:\n" -#: pg_basebackup.c:429 pg_receivewal.c:97 +#: pg_basebackup.c:440 pg_receivewal.c:97 #, c-format msgid " -d, --dbname=CONNSTR connection string\n" msgstr " -d, --dbname=VERBDG Verbindungsparameter\n" -#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103 +#: pg_basebackup.c:441 pg_receivewal.c:98 pg_recvlogical.c:113 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104 +#: pg_basebackup.c:442 pg_receivewal.c:99 pg_recvlogical.c:114 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT Portnummer des Datenbankservers\n" -#: pg_basebackup.c:432 +#: pg_basebackup.c:443 #, c-format msgid "" " -s, --status-interval=INTERVAL\n" @@ -636,22 +758,23 @@ msgstr "" " -s, --status-interval=INTERVALL\n" " Zeit zwischen an Server gesendeten Statuspaketen (in Sekunden)\n" -#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105 +#: pg_basebackup.c:445 pg_receivewal.c:100 pg_recvlogical.c:115 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106 +#: pg_basebackup.c:446 pg_receivewal.c:101 pg_recvlogical.c:116 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107 +#: pg_basebackup.c:447 pg_receivewal.c:102 pg_recvlogical.c:117 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n" -#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108 +#: pg_basebackup.c:448 pg_createsubscriber.c:240 pg_receivewal.c:106 +#: pg_recvlogical.c:118 #, c-format msgid "" "\n" @@ -660,484 +783,548 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109 +#: pg_basebackup.c:449 pg_createsubscriber.c:241 pg_receivewal.c:107 +#: pg_recvlogical.c:119 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_basebackup.c:477 +#: pg_basebackup.c:488 #, c-format msgid "could not read from ready pipe: %m" msgstr "konnte nicht aus bereiter Pipe lesen: %m" -#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2151 -#: streamutil.c:441 +#: pg_basebackup.c:491 pg_basebackup.c:633 pg_basebackup.c:2258 +#: streamutil.c:518 #, c-format msgid "could not parse write-ahead log location \"%s\"" msgstr "konnte Write-Ahead-Log-Position »%s« nicht interpretieren" -#: pg_basebackup.c:585 pg_receivewal.c:600 +#: pg_basebackup.c:596 pg_receivewal.c:600 #, c-format msgid "could not finish writing WAL files: %m" msgstr "konnte WAL-Dateien nicht zu Ende schreiben: %m" -#: pg_basebackup.c:631 +#: pg_basebackup.c:642 #, c-format msgid "could not create pipe for background process: %m" msgstr "konnte Pipe für Hintergrundprozess nicht erzeugen: %m" -#: pg_basebackup.c:664 +#: pg_basebackup.c:676 #, c-format msgid "created temporary replication slot \"%s\"" msgstr "temporärer Replikations-Slot »%s« wurde erzeugt" -#: pg_basebackup.c:667 +#: pg_basebackup.c:679 #, c-format msgid "created replication slot \"%s\"" msgstr "Replikations-Slot »%s« wurde erzeugt" -#: pg_basebackup.c:701 +#: pg_basebackup.c:728 #, c-format msgid "could not create background process: %m" msgstr "konnte Hintergrundprozess nicht erzeugen: %m" -#: pg_basebackup.c:710 +#: pg_basebackup.c:737 #, c-format msgid "could not create background thread: %m" msgstr "konnte Hintergrund-Thread nicht erzeugen: %m" -#: pg_basebackup.c:749 +#: pg_basebackup.c:776 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "Verzeichnis »%s« existiert aber ist nicht leer" -#: pg_basebackup.c:755 +#: pg_basebackup.c:782 pg_createsubscriber.c:390 #, c-format msgid "could not access directory \"%s\": %m" msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" -#: pg_basebackup.c:831 +#: pg_basebackup.c:858 #, c-format msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" msgstr[0] "%*s/%s kB (100%%), %d/%d Tablespace %*s" msgstr[1] "%*s/%s kB (100%%), %d/%d Tablespaces %*s" -#: pg_basebackup.c:843 +#: pg_basebackup.c:870 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" msgstr[0] "%*s/%s kB (%d%%), %d/%d Tablespace (%s%-*.*s)" msgstr[1] "%*s/%s kB (%d%%), %d/%d Tablespaces (%s%-*.*s)" -#: pg_basebackup.c:859 +#: pg_basebackup.c:886 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" msgstr[0] "%*s/%s kB (%d%%), %d/%d Tablespace" msgstr[1] "%*s/%s kB (%d%%), %d/%d Tablespaces" -#: pg_basebackup.c:883 +#: pg_basebackup.c:910 #, c-format msgid "transfer rate \"%s\" is not a valid value" msgstr "Transferrate »%s« ist kein gültiger Wert" -#: pg_basebackup.c:885 +#: pg_basebackup.c:912 #, c-format msgid "invalid transfer rate \"%s\": %m" msgstr "ungültige Transferrate »%s«: %m" -#: pg_basebackup.c:892 +#: pg_basebackup.c:919 #, c-format msgid "transfer rate must be greater than zero" msgstr "Transferrate muss größer als null sein" -#: pg_basebackup.c:922 +#: pg_basebackup.c:949 #, c-format msgid "invalid --max-rate unit: \"%s\"" msgstr "ungültige Einheit für --max-rate: »%s«" -#: pg_basebackup.c:926 +#: pg_basebackup.c:953 #, c-format msgid "transfer rate \"%s\" exceeds integer range" msgstr "Transferrate »%s« überschreitet Bereich für ganze Zahlen" -#: pg_basebackup.c:933 +#: pg_basebackup.c:960 #, c-format msgid "transfer rate \"%s\" is out of range" msgstr "Transferrate »%s« ist außerhalb des gültigen Bereichs" -#: pg_basebackup.c:995 +#: pg_basebackup.c:1022 #, c-format msgid "could not get COPY data stream: %s" msgstr "konnte COPY-Datenstrom nicht empfangen: %s" -#: pg_basebackup.c:1012 pg_recvlogical.c:436 pg_recvlogical.c:608 +#: pg_basebackup.c:1039 pg_recvlogical.c:449 pg_recvlogical.c:625 #: receivelog.c:973 #, c-format msgid "could not read COPY data: %s" msgstr "konnte COPY-Daten nicht lesen: %s" -#: pg_basebackup.c:1016 +#: pg_basebackup.c:1043 #, c-format msgid "background process terminated unexpectedly" msgstr "Hintergrundprozess beendete unerwartet" -#: pg_basebackup.c:1087 +#: pg_basebackup.c:1114 #, c-format msgid "cannot inject manifest into a compressed tar file" msgstr "Manifest kann nicht in eine komprimierte Tar-Datei eingefügt werden" -#: pg_basebackup.c:1088 +#: pg_basebackup.c:1115 #, c-format msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s." msgstr "Verwenden Sie clientseitige Komprimierung, senden Sie die Ausgabe in ein Verzeichnis statt auf die Standardausgabe, oder verwenden Sie %s." -#: pg_basebackup.c:1104 +#: pg_basebackup.c:1131 #, c-format msgid "cannot parse archive \"%s\"" msgstr "kann Archiv »%s« nicht parsen" -#: pg_basebackup.c:1105 +#: pg_basebackup.c:1132 #, c-format msgid "Only tar archives can be parsed." msgstr "Nur Tar-Archive können geparst werden." -#: pg_basebackup.c:1107 +#: pg_basebackup.c:1134 #, c-format msgid "Plain format requires pg_basebackup to parse the archive." msgstr "Format »plain« benötigt pg_basebackup, um das Archiv zu parsen." -#: pg_basebackup.c:1109 +#: pg_basebackup.c:1136 #, c-format msgid "Using - as the output directory requires pg_basebackup to parse the archive." msgstr "Wenn - als Ausgabeverzeichnis verwendet wird, wird pg_basebackup benötigt, um das Archiv zu parsen." -#: pg_basebackup.c:1111 +#: pg_basebackup.c:1138 #, c-format msgid "The -R option requires pg_basebackup to parse the archive." msgstr "Die Option -R benötigt pg_basebackup, um das Archiv zu parsen." -#: pg_basebackup.c:1330 +#: pg_basebackup.c:1357 #, c-format msgid "archives must precede manifest" msgstr "Archive müssen vor dem Manifest kommen" -#: pg_basebackup.c:1345 +#: pg_basebackup.c:1372 #, c-format msgid "invalid archive name: \"%s\"" msgstr "ungültiger Archivname: »%s«" -#: pg_basebackup.c:1417 +#: pg_basebackup.c:1444 #, c-format msgid "unexpected payload data" msgstr "unerwartete Payload-Daten" -#: pg_basebackup.c:1560 +#: pg_basebackup.c:1587 #, c-format msgid "empty COPY message" msgstr "leere COPY-Nachricht" -#: pg_basebackup.c:1562 +#: pg_basebackup.c:1589 #, c-format msgid "malformed COPY message of type %d, length %zu" msgstr "fehlerhafte COPY-Nachricht vom Typ %d, Länge %zu" -#: pg_basebackup.c:1760 +#: pg_basebackup.c:1789 #, c-format msgid "incompatible server version %s" msgstr "inkompatible Serverversion %s" -#: pg_basebackup.c:1776 +#: pg_basebackup.c:1805 #, c-format msgid "Use -X none or -X fetch to disable log streaming." msgstr "Verwenden Sie -X none oder -X fetch, um Log-Streaming abzuschalten." -#: pg_basebackup.c:1844 +#: pg_basebackup.c:1841 +#, c-format +msgid "server does not support incremental backup" +msgstr "Server unterstützt kein inkrementelles Backup" + +#: pg_basebackup.c:1850 pg_basebackup.c:2008 pg_recvlogical.c:272 +#: receivelog.c:543 receivelog.c:582 streamutil.c:364 streamutil.c:438 +#: streamutil.c:490 streamutil.c:578 streamutil.c:730 streamutil.c:775 +#, c-format +msgid "could not send replication command \"%s\": %s" +msgstr "konnte Replikationsbefehl »%s« nicht senden: %s" + +#: pg_basebackup.c:1856 pg_basebackup.c:1883 +#, c-format +msgid "could not upload manifest: %s" +msgstr "konnte Manifest nicht hochladen: %s" + +#: pg_basebackup.c:1859 pg_basebackup.c:1886 +#, c-format +msgid "could not upload manifest: unexpected status %s" +msgstr "konnte Manifest nicht hochladen: unerwarteter Status %s" + +#: pg_basebackup.c:1867 +#, c-format +msgid "could not send COPY data: %s" +msgstr "konnte COPY-Daten nicht senden: %s" + +#: pg_basebackup.c:1877 +#, c-format +msgid "could not send end-of-COPY: %s" +msgstr "konnte End-of-COPY nicht senden: %s" + +#: pg_basebackup.c:1892 +#, c-format +msgid "unexpected extra result while sending manifest" +msgstr "unerwartetes zusätzliches Ergebnis beim Senden des Manifests" + +#: pg_basebackup.c:1950 #, c-format msgid "backup targets are not supported by this server version" msgstr "Backup-Ziele werden von dieser Serverversion nicht unterstützt" -#: pg_basebackup.c:1847 +#: pg_basebackup.c:1953 #, c-format msgid "recovery configuration cannot be written when a backup target is used" msgstr "Recovery-Konfiguration kann nicht geschrieben werden, wenn ein Backup-Ziel verwendet wird" -#: pg_basebackup.c:1874 +#: pg_basebackup.c:1980 #, c-format msgid "server does not support server-side compression" msgstr "Server unterstützt keine serverseitige Komprimierung" -#: pg_basebackup.c:1884 +#: pg_basebackup.c:1990 #, c-format msgid "initiating base backup, waiting for checkpoint to complete" msgstr "Basissicherung eingeleitet, warte auf Abschluss des Checkpoints" -#: pg_basebackup.c:1888 +#: pg_basebackup.c:1994 #, c-format msgid "waiting for checkpoint" msgstr "Warten auf Checkpoint" -#: pg_basebackup.c:1901 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582 -#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501 -#: streamutil.c:653 streamutil.c:698 -#, c-format -msgid "could not send replication command \"%s\": %s" -msgstr "konnte Replikationsbefehl »%s« nicht senden: %s" - -#: pg_basebackup.c:1909 +#: pg_basebackup.c:2016 #, c-format msgid "could not initiate base backup: %s" msgstr "konnte Basissicherung nicht starten: %s" -#: pg_basebackup.c:1912 +#: pg_basebackup.c:2019 #, c-format msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields" msgstr "unerwartete Antwort auf Befehl BASE_BACKUP: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" -#: pg_basebackup.c:1918 +#: pg_basebackup.c:2025 #, c-format msgid "checkpoint completed" msgstr "Checkpoint abgeschlossen" -#: pg_basebackup.c:1932 +#: pg_basebackup.c:2039 #, c-format msgid "write-ahead log start point: %s on timeline %u" msgstr "Write-Ahead-Log-Startpunkt: %s auf Zeitleiste %u" -#: pg_basebackup.c:1940 +#: pg_basebackup.c:2047 #, c-format msgid "could not get backup header: %s" msgstr "konnte Kopf der Sicherung nicht empfangen: %s" -#: pg_basebackup.c:1943 +#: pg_basebackup.c:2050 #, c-format msgid "no data returned from server" msgstr "keine Daten vom Server zurückgegeben" -#: pg_basebackup.c:1986 +#: pg_basebackup.c:2093 #, c-format msgid "can only write single tablespace to stdout, database has %d" msgstr "kann nur einen einzelnen Tablespace auf die Standardausgabe schreiben, Datenbank hat %d" -#: pg_basebackup.c:1999 +#: pg_basebackup.c:2106 #, c-format msgid "starting background WAL receiver" msgstr "Hintergrund-WAL-Receiver wird gestartet" -#: pg_basebackup.c:2082 +#: pg_basebackup.c:2189 #, c-format msgid "backup failed: %s" msgstr "Backup fehlgeschlagen: %s" -#: pg_basebackup.c:2085 +#: pg_basebackup.c:2192 #, c-format msgid "no write-ahead log end position returned from server" msgstr "keine Write-Ahead-Log-Endposition vom Server zurückgegeben" -#: pg_basebackup.c:2088 +#: pg_basebackup.c:2195 #, c-format msgid "write-ahead log end point: %s" msgstr "Write-Ahead-Log-Endposition: %s" -#: pg_basebackup.c:2099 +#: pg_basebackup.c:2206 #, c-format msgid "checksum error occurred" msgstr "ein Prüfsummenfehler ist aufgetreten" -#: pg_basebackup.c:2104 +#: pg_basebackup.c:2211 #, c-format msgid "final receive failed: %s" msgstr "letztes Empfangen fehlgeschlagen: %s" -#: pg_basebackup.c:2128 +#: pg_basebackup.c:2235 #, c-format msgid "waiting for background process to finish streaming ..." msgstr "warte bis Hintergrundprozess Streaming beendet hat ..." -#: pg_basebackup.c:2132 +#: pg_basebackup.c:2239 #, c-format msgid "could not send command to background pipe: %m" msgstr "konnte Befehl nicht an Hintergrund-Pipe senden: %m" -#: pg_basebackup.c:2137 +#: pg_basebackup.c:2244 #, c-format msgid "could not wait for child process: %m" msgstr "konnte nicht auf Kindprozess warten: %m" -#: pg_basebackup.c:2139 +#: pg_basebackup.c:2246 #, c-format msgid "child %d died, expected %d" msgstr "Kindprozess %d endete, aber %d wurde erwartet" -#: pg_basebackup.c:2141 streamutil.c:91 streamutil.c:196 +#: pg_basebackup.c:2248 streamutil.c:89 streamutil.c:204 streamutil.c:316 #, c-format msgid "%s" msgstr "%s" -#: pg_basebackup.c:2161 +#: pg_basebackup.c:2268 #, c-format msgid "could not wait for child thread: %m" msgstr "konnte nicht auf Kind-Thread warten: %m" -#: pg_basebackup.c:2166 +#: pg_basebackup.c:2273 #, c-format msgid "could not get child thread exit status: %m" msgstr "konnte Statuscode des Kind-Threads nicht ermitteln: %m" -#: pg_basebackup.c:2169 +#: pg_basebackup.c:2276 #, c-format msgid "child thread exited with error %u" msgstr "Kind-Thread hat mit Fehler %u beendet" -#: pg_basebackup.c:2198 +#: pg_basebackup.c:2305 #, c-format msgid "syncing data to disk ..." msgstr "synchronisiere Daten auf Festplatte ..." -#: pg_basebackup.c:2223 +#: pg_basebackup.c:2330 #, c-format msgid "renaming backup_manifest.tmp to backup_manifest" msgstr "umbenennen von backup_manifest.tmp nach backup_manifest" -#: pg_basebackup.c:2243 +#: pg_basebackup.c:2350 #, c-format msgid "base backup completed" msgstr "Basissicherung abgeschlossen" -#: pg_basebackup.c:2326 +#: pg_basebackup.c:2436 #, c-format msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" msgstr "ungültiges Checkpoint-Argument »%s«, muss »fast« oder »spread« sein" -#: pg_basebackup.c:2344 +#: pg_basebackup.c:2454 #, c-format msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" msgstr "ungültiges Ausgabeformat »%s«, muss »plain« oder »tar« sein" -#: pg_basebackup.c:2422 +#: pg_basebackup.c:2535 #, c-format msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" msgstr "ungültige Option »%s« für --wal-method, muss »fetch«, »stream« oder »none« sein" -#: pg_basebackup.c:2457 pg_basebackup.c:2469 pg_basebackup.c:2491 -#: pg_basebackup.c:2503 pg_basebackup.c:2509 pg_basebackup.c:2561 -#: pg_basebackup.c:2572 pg_basebackup.c:2582 pg_basebackup.c:2588 -#: pg_basebackup.c:2595 pg_basebackup.c:2607 pg_basebackup.c:2619 -#: pg_basebackup.c:2627 pg_basebackup.c:2640 pg_basebackup.c:2646 -#: pg_basebackup.c:2655 pg_basebackup.c:2667 pg_basebackup.c:2678 -#: pg_basebackup.c:2686 pg_receivewal.c:748 pg_receivewal.c:760 +#: pg_basebackup.c:2574 pg_basebackup.c:2586 pg_basebackup.c:2608 +#: pg_basebackup.c:2620 pg_basebackup.c:2626 pg_basebackup.c:2678 +#: pg_basebackup.c:2689 pg_basebackup.c:2699 pg_basebackup.c:2705 +#: pg_basebackup.c:2712 pg_basebackup.c:2724 pg_basebackup.c:2736 +#: pg_basebackup.c:2744 pg_basebackup.c:2757 pg_basebackup.c:2763 +#: pg_basebackup.c:2772 pg_basebackup.c:2784 pg_basebackup.c:2795 +#: pg_basebackup.c:2803 pg_createsubscriber.c:2037 pg_createsubscriber.c:2047 +#: pg_createsubscriber.c:2055 pg_createsubscriber.c:2083 +#: pg_createsubscriber.c:2115 pg_receivewal.c:748 pg_receivewal.c:760 #: pg_receivewal.c:767 pg_receivewal.c:776 pg_receivewal.c:783 -#: pg_receivewal.c:793 pg_recvlogical.c:835 pg_recvlogical.c:847 -#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871 -#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892 -#: pg_recvlogical.c:899 pg_recvlogical.c:906 +#: pg_receivewal.c:793 pg_recvlogical.c:853 pg_recvlogical.c:865 +#: pg_recvlogical.c:875 pg_recvlogical.c:882 pg_recvlogical.c:889 +#: pg_recvlogical.c:896 pg_recvlogical.c:903 pg_recvlogical.c:910 +#: pg_recvlogical.c:917 pg_recvlogical.c:924 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_basebackup.c:2467 pg_receivewal.c:758 pg_recvlogical.c:845 +#: pg_basebackup.c:2584 pg_createsubscriber.c:2045 pg_receivewal.c:758 +#: pg_recvlogical.c:863 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_basebackup.c:2490 +#: pg_basebackup.c:2607 #, c-format msgid "cannot specify both format and backup target" msgstr "Format und Backup-Ziel können nicht beide angegeben werden" -#: pg_basebackup.c:2502 +#: pg_basebackup.c:2619 #, c-format msgid "must specify output directory or backup target" msgstr "Ausgabeverzeichnis oder Backup-Ziel muss angegeben werden" -#: pg_basebackup.c:2508 +#: pg_basebackup.c:2625 #, c-format msgid "cannot specify both output directory and backup target" msgstr "Ausgabeverzeichnis und Backup-Ziel können nicht beide angegeben werden" -#: pg_basebackup.c:2538 pg_receivewal.c:802 +#: pg_basebackup.c:2655 pg_receivewal.c:802 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "unbekannter Komprimierungsalgorithmus: »%s«" -#: pg_basebackup.c:2544 pg_receivewal.c:809 +#: pg_basebackup.c:2661 pg_receivewal.c:809 #, c-format msgid "invalid compression specification: %s" msgstr "ungültige Komprimierungsangabe: %s" -#: pg_basebackup.c:2560 +#: pg_basebackup.c:2677 #, c-format msgid "client-side compression is not possible when a backup target is specified" msgstr "clientseitige Komprimierung ist nicht möglich, wenn ein Backup-Ziel angegeben ist" -#: pg_basebackup.c:2571 +#: pg_basebackup.c:2688 #, c-format msgid "only tar mode backups can be compressed" msgstr "nur Sicherungen im Tar-Modus können komprimiert werden" -#: pg_basebackup.c:2581 +#: pg_basebackup.c:2698 #, c-format msgid "WAL cannot be streamed when a backup target is specified" msgstr "WAL-Streaming ist nicht möglich, wenn ein Backup-Ziel angegeben ist" -#: pg_basebackup.c:2587 +#: pg_basebackup.c:2704 #, c-format msgid "cannot stream write-ahead logs in tar mode to stdout" msgstr "im Tar-Modus können Write-Ahead-Logs nicht auf Standardausgabe geschrieben werden" -#: pg_basebackup.c:2594 +#: pg_basebackup.c:2711 #, c-format msgid "replication slots can only be used with WAL streaming" msgstr "Replikations-Slots können nur mit WAL-Streaming verwendet werden" -#: pg_basebackup.c:2606 +#: pg_basebackup.c:2723 #, c-format msgid "--no-slot cannot be used with slot name" msgstr "--no-slot kann nicht zusammen mit einem Slot-Namen verwendet werden" #. translator: second %s is an option name -#: pg_basebackup.c:2617 pg_receivewal.c:774 +#: pg_basebackup.c:2734 pg_receivewal.c:774 #, c-format msgid "%s needs a slot to be specified using --slot" msgstr "für %s muss ein Slot mit --slot angegeben werden" -#: pg_basebackup.c:2625 pg_basebackup.c:2665 pg_basebackup.c:2676 -#: pg_basebackup.c:2684 +#: pg_basebackup.c:2742 pg_basebackup.c:2782 pg_basebackup.c:2793 +#: pg_basebackup.c:2801 #, c-format msgid "%s and %s are incompatible options" msgstr "%s und %s sind inkompatible Optionen" -#: pg_basebackup.c:2639 +#: pg_basebackup.c:2756 #, c-format msgid "WAL directory location cannot be specified along with a backup target" msgstr "WAL-Verzeichnis kann nicht zusammen mit einem Backup-Ziel angegeben werden" -#: pg_basebackup.c:2645 +#: pg_basebackup.c:2762 #, c-format msgid "WAL directory location can only be specified in plain mode" msgstr "WAL-Verzeichnis kann nur im »plain«-Modus angegeben werden" -#: pg_basebackup.c:2654 +#: pg_basebackup.c:2771 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL-Verzeichnis muss absoluten Pfad haben" -#: pg_basebackup.c:2754 +#: pg_basebackup.c:2871 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m" -#: pg_receivewal.c:77 +#: pg_createsubscriber.c:169 +#, c-format +msgid "failed after the end of recovery" +msgstr "fehlgeschlagen am Ende der Wiederherstellung" + +#: pg_createsubscriber.c:170 +#, c-format +msgid "The target server cannot be used as a physical replica anymore. You must recreate the physical replica before continuing." +msgstr "Der Zielserver kann nicht mehr als physischer Standby verwendet werden. Sie müssen den physischen Standby neu erzeugen bevor fortgesetzt werden kann." + +#: pg_createsubscriber.c:198 +#, c-format +msgid "publication \"%s\" created in database \"%s\" on primary was left behind" +msgstr "Publikation »%s« erzeugt in Datenbank »%s« auf dem Primärserver wurde zurückgelassen" + +#: pg_createsubscriber.c:200 +#, c-format +msgid "Drop this publication before trying again." +msgstr "Löschen Sie diese Publikation, bevor Sie erneut versuchen." + +#: pg_createsubscriber.c:204 +#, c-format +msgid "replication slot \"%s\" created in database \"%s\" on primary was left behind" +msgstr "Replikations-Slot »%s« erzeugt in Datenbank »%s« auf dem Primärserver wurde zurückgelassen" + +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1260 +#, c-format +msgid "Drop this replication slot soon to avoid retention of WAL files." +msgstr "Löschen Sie diesen Replikations-Slot bald, um Zurückhalten von WAL-Datein zu vermeiden." + +#: pg_createsubscriber.c:219 #, c-format msgid "" -"%s receives PostgreSQL streaming write-ahead logs.\n" +"%s creates a new logical replica from a standby server.\n" "\n" msgstr "" -"%s empfängt PostgreSQL-Write-Ahead-Logs.\n" +"%s erzeugt eine neue logische Replik aus einem Standby-Server.\n" "\n" -#: pg_receivewal.c:81 pg_recvlogical.c:82 +#: pg_createsubscriber.c:223 pg_receivewal.c:81 pg_recvlogical.c:92 #, c-format msgid "" "\n" @@ -1146,22 +1333,637 @@ msgstr "" "\n" "Optionen:\n" +#: pg_createsubscriber.c:224 +#, c-format +msgid " -d, --database=DBNAME database in which to create a subscription\n" +msgstr " -d, --database=DBNAME Datenbank, in der eine Subskription erzeugt werden soll\n" + +#: pg_createsubscriber.c:225 +#, c-format +msgid " -D, --pgdata=DATADIR location for the subscriber data directory\n" +msgstr " -D, --pgdata=DATENVERZ Datenverzeichnis für den Subskriptionsserver\n" + +#: pg_createsubscriber.c:226 +#, c-format +msgid " -n, --dry-run dry run, just show what would be done\n" +msgstr " -n, --dry-run Probelauf; nur zeigen, was gemacht werden würde\n" + +#: pg_createsubscriber.c:227 +#, c-format +msgid " -p, --subscriber-port=PORT subscriber port number (default %s)\n" +msgstr " -p, --subscriber-port=PORT Portnummer für den Subskriptionsserver (Standard %s)\n" + +#: pg_createsubscriber.c:228 +#, c-format +msgid " -P, --publisher-server=CONNSTR publisher connection string\n" +msgstr " -P, --publisher-server=VERBDG Verbindungsparameter des Publikationsservers\n" + +#: pg_createsubscriber.c:229 +#, c-format +msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" +msgstr " -s, --socketdir=VERZ Verzeichnis für Socket (Standard: aktuelles Verz.)\n" + +#: pg_createsubscriber.c:230 +#, c-format +msgid " -t, --recovery-timeout=SECS seconds to wait for recovery to end\n" +msgstr " -t, --recovery-timeout=SEK Sekunden zu warten auf Ende der Wiederherstellung\n" + +#: pg_createsubscriber.c:231 +#, c-format +msgid " -U, --subscriber-username=NAME user name for subscriber connection\n" +msgstr " -U, --subscriber-username=NAME Benutzername für Subskriptionsserver-Verbindung\n" + +#: pg_createsubscriber.c:232 +#, c-format +msgid " -v, --verbose output verbose messages\n" +msgstr " -v, --verbose »Verbose«-Modus\n" + +#: pg_createsubscriber.c:233 +#, c-format +msgid "" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr "" +" --config-file=DATEINAME angegebene Serverkonfigurationsdatei zum\n" +" Starten des Ziel-Clusters verwenden\n" + +#: pg_createsubscriber.c:235 +#, c-format +msgid " --publication=NAME publication name\n" +msgstr " --publication=NAME Publikationsname\n" + +#: pg_createsubscriber.c:236 +#, c-format +msgid " --replication-slot=NAME replication slot name\n" +msgstr " --replication-slot=NAME Replikations-Slot-Name\n" + +#: pg_createsubscriber.c:237 +#, c-format +msgid " --subscription=NAME subscription name\n" +msgstr " --subscription=NAME Subskriptionsname\n" + +#: pg_createsubscriber.c:238 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" + +#: pg_createsubscriber.c:239 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" + +#: pg_createsubscriber.c:282 +#, c-format +msgid "could not parse connection string: %s" +msgstr "konnte Verbindungsparameter nicht interpretieren: %s" + +#: pg_createsubscriber.c:359 +#, c-format +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden" + +#: pg_createsubscriber.c:362 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s" + +#: pg_createsubscriber.c:382 +#, c-format +msgid "checking if directory \"%s\" is a cluster data directory" +msgstr "prüfe ob Verzeichnis »%s« ein Cluster-Datenverzeichnis ist" + +#: pg_createsubscriber.c:388 +#, c-format +msgid "data directory \"%s\" does not exist" +msgstr "Datenverzeichnis »%s« existiert nicht" + +#: pg_createsubscriber.c:396 +#, c-format +msgid "directory \"%s\" is not a database cluster directory" +msgstr "Verzeichnis »%s« ist kein Datenbankclusterverzeichnis" + +#: pg_createsubscriber.c:513 +#, c-format +msgid "connection to database failed: %s" +msgstr "Verbindung zur Datenbank fehlgeschlagen: %s" + +#: pg_createsubscriber.c:526 +#, c-format +msgid "could not clear search_path: %s" +msgstr "konnte search_path nicht auf leer setzen: %s" + +#: pg_createsubscriber.c:566 +#, c-format +msgid "getting system identifier from publisher" +msgstr "hole Systemidentifikator vom Publikationsserver" + +#: pg_createsubscriber.c:573 +#, c-format +msgid "could not get system identifier: %s" +msgstr "konnte Systemidentifikator nicht ermitteln: %s" + +#: pg_createsubscriber.c:579 +#, c-format +msgid "could not get system identifier: got %d rows, expected %d row" +msgstr "konnte Systemidentifikator nicht ermitteln: %d Zeilen erhalten, %d Zeile erwartet" + +#: pg_createsubscriber.c:586 +#, c-format +msgid "system identifier is %llu on publisher" +msgstr "Systemidentifikator ist %llu auf dem Publikationsserver" + +#: pg_createsubscriber.c:607 +#, c-format +msgid "getting system identifier from subscriber" +msgstr "hole Systemidentifikator vom Subskriptionsserver" + +#: pg_createsubscriber.c:611 pg_createsubscriber.c:641 +#, c-format +msgid "control file appears to be corrupt" +msgstr "Kontrolldatei scheint kaputt zu sein" + +#: pg_createsubscriber.c:615 pg_createsubscriber.c:656 +#, c-format +msgid "system identifier is %llu on subscriber" +msgstr "Systemidentifikator ist %llu auf dem Subskriptionsserver" + +#: pg_createsubscriber.c:637 +#, c-format +msgid "modifying system identifier of subscriber" +msgstr "ändere Systemidentifikator auf dem Subskriptionsserver" + +#: pg_createsubscriber.c:659 +#, c-format +msgid "running pg_resetwal on the subscriber" +msgstr "führe pg_resetwal auf dem Subskriptionsserver aus" + +#: pg_createsubscriber.c:671 +#, c-format +msgid "subscriber successfully changed the system identifier" +msgstr "Subskriptionsserver hat Systemidentifikator erfolgreich geändert" + +#: pg_createsubscriber.c:673 +#, c-format +msgid "could not change system identifier of subscriber: %s" +msgstr "konnte Systemidentifikator des Subskriptionsservers nicht ändern: %s" + +#: pg_createsubscriber.c:697 +#, c-format +msgid "could not obtain database OID: %s" +msgstr "konnte Datenbank-OID nicht ermitteln: %s" + +#: pg_createsubscriber.c:704 +#, c-format +msgid "could not obtain database OID: got %d rows, expected %d row" +msgstr "konnte Datenbank-OID nicht ermitteln: %d Zeilen erhalten, %d Zeile erwartet" + +#: pg_createsubscriber.c:776 +#, c-format +msgid "create replication slot \"%s\" on publisher" +msgstr "erzeuge Replikations-Slot »%s« auf dem Publikationsserver" + +#: pg_createsubscriber.c:796 +#, c-format +msgid "could not write an additional WAL record: %s" +msgstr "konnte zusätzlichen WAL-Datensatz nicht schreiben: %s" + +#: pg_createsubscriber.c:822 +#, c-format +msgid "could not obtain recovery progress: %s" +msgstr "konnte Recovery-Fortschritt nicht ermitteln: %s" + +#: pg_createsubscriber.c:854 +#, c-format +msgid "checking settings on publisher" +msgstr "prüfe Einstellungen auf dem Publikationsserver" + +#: pg_createsubscriber.c:864 +#, c-format +msgid "primary server cannot be in recovery" +msgstr "Primärserver kann nicht im Wiederherstellungsmodus sein" + +#: pg_createsubscriber.c:888 +#, c-format +msgid "could not obtain publisher settings: %s" +msgstr "konnte Einstellungen des Publikationsservers nicht ermitteln: %s" + +#: pg_createsubscriber.c:914 +#, c-format +msgid "publisher requires wal_level >= \"logical\"" +msgstr "Publikationsserver benötigt wal_level >= »logical«" + +#: pg_createsubscriber.c:920 +#, c-format +msgid "publisher requires %d replication slots, but only %d remain" +msgstr "Publikationsserver benötigt %d Replikations-Slots, aber nur %d verbleiben" + +#: pg_createsubscriber.c:922 pg_createsubscriber.c:931 +#: pg_createsubscriber.c:1028 pg_createsubscriber.c:1037 +#: pg_createsubscriber.c:1046 +#, c-format +msgid "Increase the configuration parameter \"%s\" to at least %d." +msgstr "Erhöhen Sie den Konfigurationsparameter »%s« auf mindestens %d." + +#: pg_createsubscriber.c:929 +#, c-format +msgid "publisher requires %d WAL sender processes, but only %d remain" +msgstr "Publikationsserver benötigt %d WAL-Sender-Prozesse, aber nur %d verbleiben" + +#: pg_createsubscriber.c:938 +#, c-format +msgid "two_phase option will not be enabled for replication slots" +msgstr "Option »two_phase« wird für Replikations-Slots nicht aktiviert" + +#: pg_createsubscriber.c:939 +#, c-format +msgid "Subscriptions will be created with the two_phase option disabled. Prepared transactions will be replicated at COMMIT PREPARED." +msgstr "Subskriptionen werden mit der Option »two_phase« ausgeschaltet erzeugt. Vorbereitete Transaktionen werden bei COMMIT PREPARED repliziert werden." + +#: pg_createsubscriber.c:971 +#, c-format +msgid "checking settings on subscriber" +msgstr "prüfe Einstellungen auf Subskriptionsserver" + +#: pg_createsubscriber.c:978 +#, c-format +msgid "target server must be a standby" +msgstr "Zielserver muss ein Standby sein" + +#: pg_createsubscriber.c:1002 +#, c-format +msgid "could not obtain subscriber settings: %s" +msgstr "konnte Einstellungen des Subskriptionsservers nicht ermitteln: %s" + +#: pg_createsubscriber.c:1026 +#, c-format +msgid "subscriber requires %d replication slots, but only %d remain" +msgstr "Subskriptionsserver benötigt %d Replikations-Slots, aber nur %d verbleiben" + +#: pg_createsubscriber.c:1035 +#, c-format +msgid "subscriber requires %d logical replication workers, but only %d remain" +msgstr "Subskriptionsserver benötigt %d Arbeitsprozesse für logische Replikation, aber nur %d verbleiben" + +#: pg_createsubscriber.c:1044 +#, c-format +msgid "subscriber requires %d worker processes, but only %d remain" +msgstr "Subskriptionsserver benötigt %d Arbeitsprozesse, aber nur %d verbleiben" + +#: pg_createsubscriber.c:1079 +#, c-format +msgid "dropping subscription \"%s\" in database \"%s\"" +msgstr "lösche Subskription »%s« in Datenbank »%s«" + +#: pg_createsubscriber.c:1088 +#, c-format +msgid "could not drop subscription \"%s\": %s" +msgstr "konnte Subskription »%s« nicht löschen: %s" + +#: pg_createsubscriber.c:1123 +#, c-format +msgid "could not obtain pre-existing subscriptions: %s" +msgstr "konnte bereits existierende Subskriptionen nicht ermitteln: %s" + +#: pg_createsubscriber.c:1258 +#, c-format +msgid "could not drop replication slot \"%s\" on primary" +msgstr "konnte Replikations-Slot »%s« auf dem Primärserver nicht löschen" + +#: pg_createsubscriber.c:1292 +#, c-format +msgid "could not obtain failover replication slot information: %s" +msgstr "konnte Failover-Replikations-Slot-Informationen nicht ermitteln: %s" + +#: pg_createsubscriber.c:1294 pg_createsubscriber.c:1303 +#, c-format +msgid "Drop the failover replication slots on subscriber soon to avoid retention of WAL files." +msgstr "Löschen Sie die Failover-Replikations-Slots auf dem Subskriptionsserver bald, um Zurückhalten von WAL-Dateien zu vermeiden." + +#: pg_createsubscriber.c:1302 +#, c-format +msgid "could not drop failover replication slot" +msgstr "konnte Failover-Replikations-Slot nicht löschen" + +#: pg_createsubscriber.c:1324 +#, c-format +msgid "creating the replication slot \"%s\" in database \"%s\"" +msgstr "erzeuge Replikations-Slot »%s« in Datenbank »%s«" + +#: pg_createsubscriber.c:1342 +#, c-format +msgid "could not create replication slot \"%s\" in database \"%s\": %s" +msgstr "konnte Replikations-Slot »%s« in Datenbank »%s« nicht erzeugen: %s" + +#: pg_createsubscriber.c:1372 +#, c-format +msgid "dropping the replication slot \"%s\" in database \"%s\"" +msgstr "lösche Replikations-Slot »%s« in Datenbank »%s«" + +#: pg_createsubscriber.c:1388 +#, c-format +msgid "could not drop replication slot \"%s\" in database \"%s\": %s" +msgstr "konnte Replikations-Slot »%s« in Datenbank »%s« nicht löschen: %s" + +#: pg_createsubscriber.c:1409 +#, c-format +msgid "pg_ctl failed with exit code %d" +msgstr "pg_ctl ist fehlgeschlagen mit Statuscode %d" + +#: pg_createsubscriber.c:1414 +#, c-format +msgid "pg_ctl was terminated by exception 0x%X" +msgstr "pg_ctl wurde durch Ausnahme 0x%X beendet" + +#: pg_createsubscriber.c:1416 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "Sehen Sie die Beschreibung des Hexadezimalwerts in der C-Include-Datei »ntstatus.h« nach." + +#: pg_createsubscriber.c:1418 +#, c-format +msgid "pg_ctl was terminated by signal %d: %s" +msgstr "pg_ctl wurde durch Signal %d beendet: %s" + +#: pg_createsubscriber.c:1424 +#, c-format +msgid "pg_ctl exited with unrecognized status %d" +msgstr "pg_ctl hat mit unbekanntem Status %d beendet" + +#: pg_createsubscriber.c:1427 +#, c-format +msgid "The failed command was: %s" +msgstr "Der fehlgeschlagene Befehl war: %s" + +#: pg_createsubscriber.c:1473 +#, c-format +msgid "server was started" +msgstr "Server wurde gestartet" + +#: pg_createsubscriber.c:1488 +#, c-format +msgid "server was stopped" +msgstr "Server wurde angehalten" + +#: pg_createsubscriber.c:1507 +#, c-format +msgid "waiting for the target server to reach the consistent state" +msgstr "warte, dass der Zielserver einen konsistenten Zustand erreicht" + +#: pg_createsubscriber.c:1530 +#, c-format +msgid "recovery timed out" +msgstr "Zeitüberschreitung bei der Wiederherstellung" + +#: pg_createsubscriber.c:1543 +#, c-format +msgid "server did not end recovery" +msgstr "Server hat Recovery-Zustand nicht beendet" + +#: pg_createsubscriber.c:1545 +#, c-format +msgid "target server reached the consistent state" +msgstr "Zielserver hat einen konsistenten Zustand erreicht" + +#: pg_createsubscriber.c:1546 +#, c-format +msgid "If pg_createsubscriber fails after this point, you must recreate the physical replica before continuing." +msgstr "Wenn pg_createsubscriber ab diesem Punkt fehlschlägt, dann müssen Sie die physikalische Replik neu erzeugen, bevor fortgesetzt werden kann." + +#: pg_createsubscriber.c:1573 +#, c-format +msgid "could not obtain publication information: %s" +msgstr "konnte Publikationsinformationen nicht ermitteln: %s" + +#: pg_createsubscriber.c:1587 +#, c-format +msgid "publication \"%s\" already exists" +msgstr "Publikation »%s« existiert bereits" + +#: pg_createsubscriber.c:1588 +#, c-format +msgid "Consider renaming this publication before continuing." +msgstr "Nennen Sie diese Publikation eventuell um bevor Sie fortsetzen." + +#: pg_createsubscriber.c:1595 +#, c-format +msgid "creating publication \"%s\" in database \"%s\"" +msgstr "erzeuge Publikation »%s« in Datenbank »%s«" + +#: pg_createsubscriber.c:1608 +#, c-format +msgid "could not create publication \"%s\" in database \"%s\": %s" +msgstr "konnte Publikation »%s« in Datenbank »%s« nicht erzeugen: %s" + +#: pg_createsubscriber.c:1637 +#, c-format +msgid "dropping publication \"%s\" in database \"%s\"" +msgstr "lösche Publikation »%s« in Datenbank »%s«" + +#: pg_createsubscriber.c:1651 +#, c-format +msgid "could not drop publication \"%s\" in database \"%s\": %s" +msgstr "konnte Publikation »%s« in Datenbank »%s« nicht löschen: %s" + +#: pg_createsubscriber.c:1697 +#, c-format +msgid "creating subscription \"%s\" in database \"%s\"" +msgstr "erzeuge Subskription »%s« in Datenbank »%s«" + +#: pg_createsubscriber.c:1718 +#, c-format +msgid "could not create subscription \"%s\" in database \"%s\": %s" +msgstr "konnte Subskription »%s« in Datenbank »%s« nicht erzeugen: %s" + +#: pg_createsubscriber.c:1763 +#, c-format +msgid "could not obtain subscription OID: %s" +msgstr "konnte Subskriptions-OID nicht ermitteln: %s" + +#: pg_createsubscriber.c:1770 +#, c-format +msgid "could not obtain subscription OID: got %d rows, expected %d row" +msgstr "konnte Subskriptions-OID nicht ermitteln: %d Zeilen erhalten, %d Zeile erwartet" + +#: pg_createsubscriber.c:1794 +#, c-format +msgid "setting the replication progress (node name \"%s\", LSN %s) in database \"%s\"" +msgstr "setze Replikationsfortschritt (Knotenname »%s«, LSN %s) in Datenbank »%s«" + +#: pg_createsubscriber.c:1809 +#, c-format +msgid "could not set replication progress for subscription \"%s\": %s" +msgstr "konnte Replikationsfortschritt für Subskription »%s« nicht setzen: %s" + +#: pg_createsubscriber.c:1840 +#, c-format +msgid "enabling subscription \"%s\" in database \"%s\"" +msgstr "aktiviere Subskription »%s« in Datenbank »%s«" + +#: pg_createsubscriber.c:1852 +#, c-format +msgid "could not enable subscription \"%s\": %s" +msgstr "konnte Subskription »%s« nicht aktivieren: %s" + +#: pg_createsubscriber.c:1944 +#, c-format +msgid "cannot be executed by \"root\"" +msgstr "kann nicht von »root« ausgeführt werden" + +#: pg_createsubscriber.c:1945 +#, c-format +msgid "You must run %s as the PostgreSQL superuser." +msgstr "Sie müssen %s als PostgreSQL-Superuser ausführen." + +#: pg_createsubscriber.c:1966 +#, c-format +msgid "database \"%s\" specified more than once" +msgstr "Datenbank »%s« mehrmals angegeben" + +#: pg_createsubscriber.c:2007 +#, c-format +msgid "publication \"%s\" specified more than once" +msgstr "Publikation »%s« mehrmals angegeben" + +#: pg_createsubscriber.c:2019 +#, c-format +msgid "replication slot \"%s\" specified more than once" +msgstr "Replikations-Slot »%s« mehrmals angegeben" + +#: pg_createsubscriber.c:2031 +#, c-format +msgid "subscription \"%s\" specified more than once" +msgstr "Subskription »%s« mehrmals angegeben" + +#: pg_createsubscriber.c:2054 +#, c-format +msgid "no subscriber data directory specified" +msgstr "kein Datenverzeichnis für Subskriptionsserver angegeben" + +#: pg_createsubscriber.c:2065 +#, c-format +msgid "could not determine current directory" +msgstr "konnte aktuelles Verzeichnis nicht ermitteln" + +#: pg_createsubscriber.c:2082 +#, c-format +msgid "no publisher connection string specified" +msgstr "keine Verbindungsparameter für Publikationsserver angegeben" + +#: pg_createsubscriber.c:2086 +#, c-format +msgid "validating publisher connection string" +msgstr "validiere Verbindungsparameter für Publikationsserver" + +#: pg_createsubscriber.c:2092 +#, c-format +msgid "validating subscriber connection string" +msgstr "validiere Verbindungsparameter für Subskriptionsserver" + +#: pg_createsubscriber.c:2097 +#, c-format +msgid "no database was specified" +msgstr "keine Datenbank wurde angegeben" + +#: pg_createsubscriber.c:2109 +#, c-format +msgid "database name \"%s\" was extracted from the publisher connection string" +msgstr "Datenbankname »%s« wurde aus der Verbindungszeichenkette des Publikationsservers extrahiert" + +#: pg_createsubscriber.c:2114 +#, c-format +msgid "no database name specified" +msgstr "kein Datenbankname angegeben" + +#: pg_createsubscriber.c:2124 +#, c-format +msgid "wrong number of publication names specified" +msgstr "falsche Anzahl Publikationsnamen angegeben" + +#: pg_createsubscriber.c:2125 +#, c-format +msgid "The number of specified publication names (%d) must match the number of specified database names (%d)." +msgstr "Die Anzahl der angegebenen Publikationsnamen (%d) muss mit der Anzahl der angegebenen Datenbanknamen (%d) übereinstimmen." + +#: pg_createsubscriber.c:2131 +#, c-format +msgid "wrong number of subscription names specified" +msgstr "falsche Anzahl Subskriptionsnamen angegeben" + +#: pg_createsubscriber.c:2132 +#, c-format +msgid "The number of specified subscription names (%d) must match the number of specified database names (%d)." +msgstr "Die Anzahl der angegebenen Subskriptionsnamen (%d) muss mit der Anzahl der angegebenen Datenbanknamen (%d) übereinstimmen." + +#: pg_createsubscriber.c:2138 +#, c-format +msgid "wrong number of replication slot names specified" +msgstr "falsche Anzahl Replikations-Slot-Namen angegeben" + +#: pg_createsubscriber.c:2139 +#, c-format +msgid "The number of specified replication slot names (%d) must match the number of specified database names (%d)." +msgstr "Die Anzahl der angegebenen Replikations-Slot-Namen (%d) muss mit der Anzahl der angegebenen Datenbanknamen (%d) übereinstimmen." + +#: pg_createsubscriber.c:2168 +#, c-format +msgid "subscriber data directory is not a copy of the source database cluster" +msgstr "Datenverzeichnis des Subskriptionsservers ist keine Kopie des Quelldatenbankclusters" + +#: pg_createsubscriber.c:2181 +#, c-format +msgid "standby server is running" +msgstr "Standby-Server läuft" + +#: pg_createsubscriber.c:2182 +#, c-format +msgid "Stop the standby server and try again." +msgstr "Halten Sie den Standby-Server an und versuchen Sie erneut." + +#: pg_createsubscriber.c:2191 +#, c-format +msgid "starting the standby server with command-line options" +msgstr "starte den Standby-Server mit Kommandozeilenoptionen" + +#: pg_createsubscriber.c:2207 pg_createsubscriber.c:2242 +#, c-format +msgid "stopping the subscriber" +msgstr "stoppe den Subskriptionsserver" + +#: pg_createsubscriber.c:2221 +#, c-format +msgid "starting the subscriber" +msgstr "starte den Subskriptionsserver" + +#: pg_createsubscriber.c:2250 +#, c-format +msgid "Done!" +msgstr "Fertig!" + +#: pg_receivewal.c:77 +#, c-format +msgid "" +"%s receives PostgreSQL streaming write-ahead logs.\n" +"\n" +msgstr "" +"%s empfängt PostgreSQL-Write-Ahead-Logs.\n" +"\n" + #: pg_receivewal.c:82 #, c-format msgid " -D, --directory=DIR receive write-ahead log files into this directory\n" msgstr " -D, --directory=VERZ Write-Ahead-Log-Dateien in dieses Verzeichnis empfangen\n" -#: pg_receivewal.c:83 pg_recvlogical.c:83 +#: pg_receivewal.c:83 pg_recvlogical.c:93 #, c-format msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" msgstr " -E, --endpos=LSN nach Empfang der angegebenen LSN beenden\n" -#: pg_receivewal.c:84 pg_recvlogical.c:87 +#: pg_receivewal.c:84 pg_recvlogical.c:97 #, c-format msgid " --if-not-exists do not error if slot already exists when creating a slot\n" msgstr " --if-not-exists keinen Fehler ausgeben, wenn Slot beim Erzeugen schon existiert\n" -#: pg_receivewal.c:85 pg_recvlogical.c:89 +#: pg_receivewal.c:85 pg_recvlogical.c:99 #, c-format msgid " -n, --no-loop do not loop on connection lost\n" msgstr " -n, --no-loop bei Verbindungsverlust nicht erneut probieren\n" @@ -1173,7 +1975,7 @@ msgstr "" " --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" " geschrieben sind\n" -#: pg_receivewal.c:87 pg_recvlogical.c:94 +#: pg_receivewal.c:87 pg_recvlogical.c:104 #, c-format msgid "" " -s, --status-interval=SECS\n" @@ -1205,12 +2007,12 @@ msgstr "" "\n" "Optionale Aktionen:\n" -#: pg_receivewal.c:104 pg_recvlogical.c:79 +#: pg_receivewal.c:104 pg_recvlogical.c:89 #, c-format msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n" msgstr " --create-slot neuen Replikations-Slot erzeugen (Slot-Name siehe --slot)\n" -#: pg_receivewal.c:105 pg_recvlogical.c:80 +#: pg_receivewal.c:105 pg_recvlogical.c:90 #, c-format msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n" msgstr " --drop-slot Replikations-Slot löschen (Slot-Name siehe --slot)\n" @@ -1230,7 +2032,7 @@ msgstr "Log-Streaming gestoppt bei %X/%X (Zeitleiste %u)" msgid "switched to timeline %u at %X/%X" msgstr "auf Zeitleiste %u umgeschaltet bei %X/%X" -#: pg_receivewal.c:224 +#: pg_receivewal.c:224 pg_recvlogical.c:1053 #, c-format msgid "received interrupt signal, exiting" msgstr "Interrupt-Signal erhalten, beende" @@ -1275,11 +2077,6 @@ msgstr "komprimierte Segmentdatei »%s« hat falsche unkomprimierte Größe %d, msgid "could not create LZ4 decompression context: %s" msgstr "konnte LZ4-Dekomprimierungskontext nicht erzeugen: %s" -#: pg_receivewal.c:402 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "konnte Datei »%s« nicht lesen: %m" - #: pg_receivewal.c:420 #, c-format msgid "could not decompress file \"%s\": %s" @@ -1305,7 +2102,7 @@ msgstr "kann Datei »%s« nicht prüfen: Komprimierung mit %s wird von dieser In msgid "starting log streaming at %X/%X (timeline %u)" msgstr "starte Log-Streaming bei %X/%X (Zeitleiste %u)" -#: pg_receivewal.c:693 pg_recvlogical.c:783 +#: pg_receivewal.c:693 pg_recvlogical.c:801 #, c-format msgid "could not parse end position \"%s\"" msgstr "konnte Endposition »%s« nicht parsen" @@ -1335,28 +2132,28 @@ msgstr "Komprimierung mit %s wird noch nicht unterstützt" msgid "replication connection using slot \"%s\" is unexpectedly database specific" msgstr "Replikationsverbindung, die Slot »%s« verwendet, ist unerwarteterweise datenbankspezifisch" -#: pg_receivewal.c:878 pg_recvlogical.c:954 +#: pg_receivewal.c:878 pg_recvlogical.c:972 #, c-format msgid "dropping replication slot \"%s\"" msgstr "lösche Replikations-Slot »%s«" -#: pg_receivewal.c:889 pg_recvlogical.c:964 +#: pg_receivewal.c:889 pg_recvlogical.c:982 #, c-format msgid "creating replication slot \"%s\"" msgstr "erzeuge Replikations-Slot »%s«" -#: pg_receivewal.c:918 pg_recvlogical.c:988 +#: pg_receivewal.c:918 pg_recvlogical.c:1006 #, c-format msgid "disconnected" msgstr "Verbindung beendet" #. translator: check source for value for %d -#: pg_receivewal.c:922 pg_recvlogical.c:992 +#: pg_receivewal.c:922 pg_recvlogical.c:1010 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "Verbindung beendet; erneuter Versuch in %d Sekunden" -#: pg_recvlogical.c:74 +#: pg_recvlogical.c:84 #, c-format msgid "" "%s controls PostgreSQL logical decoding streams.\n" @@ -1365,7 +2162,7 @@ msgstr "" "%s kontrolliert logische Dekodierungsströme von PostgreSQL.\n" "\n" -#: pg_recvlogical.c:78 +#: pg_recvlogical.c:88 #, c-format msgid "" "\n" @@ -1374,17 +2171,17 @@ msgstr "" "\n" "Auszuführende Aktion:\n" -#: pg_recvlogical.c:81 +#: pg_recvlogical.c:91 #, c-format msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n" msgstr " --start Streaming in einem Replikations-Slot starten (Slot-Name siehe --slot)\n" -#: pg_recvlogical.c:84 +#: pg_recvlogical.c:94 #, c-format msgid " -f, --file=FILE receive log into this file, - for stdout\n" msgstr " -f, --file=DATEI Log in diese Datei empfangen, - für Standardausgabe\n" -#: pg_recvlogical.c:85 +#: pg_recvlogical.c:95 #, c-format msgid "" " -F --fsync-interval=SECS\n" @@ -1393,12 +2190,12 @@ msgstr "" " -F --fsync-interval=SEK\n" " Zeit zwischen Fsyncs der Ausgabedatei (Standard: %d)\n" -#: pg_recvlogical.c:88 +#: pg_recvlogical.c:98 #, c-format msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n" msgstr " -I, --startpos=LSN wo in einem bestehenden Slot das Streaming starten soll\n" -#: pg_recvlogical.c:90 +#: pg_recvlogical.c:100 #, c-format msgid "" " -o, --option=NAME[=VALUE]\n" @@ -1409,145 +2206,145 @@ msgstr "" " Option NAME mit optionalem Wert WERT an den\n" " Ausgabe-Plugin übergeben\n" -#: pg_recvlogical.c:93 +#: pg_recvlogical.c:103 #, c-format msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n" msgstr " -P, --plugin=PLUGIN Ausgabe-Plugin PLUGIN verwenden (Standard: %s)\n" -#: pg_recvlogical.c:96 +#: pg_recvlogical.c:106 #, c-format msgid " -S, --slot=SLOTNAME name of the logical replication slot\n" msgstr " -S, --slot=SLOTNAME Name des logischen Replikations-Slots\n" -#: pg_recvlogical.c:97 +#: pg_recvlogical.c:107 #, c-format msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n" msgstr "" " -t, --two-phase Dekodieren von vorbereiteten Transaktionen beim Erzeugen\n" " eines Slots einschalten\n" -#: pg_recvlogical.c:102 +#: pg_recvlogical.c:112 #, c-format msgid " -d, --dbname=DBNAME database to connect to\n" msgstr " -d, --dbname=DBNAME Datenbank, mit der verbunden werden soll\n" -#: pg_recvlogical.c:135 +#: pg_recvlogical.c:145 #, c-format msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)" msgstr "bestätige Schreiben bis %X/%X, Flush bis %X/%X (Slot %s)" -#: pg_recvlogical.c:159 receivelog.c:360 +#: pg_recvlogical.c:169 receivelog.c:360 #, c-format msgid "could not send feedback packet: %s" msgstr "konnte Rückmeldungspaket nicht senden: %s" -#: pg_recvlogical.c:227 +#: pg_recvlogical.c:239 #, c-format msgid "starting log streaming at %X/%X (slot %s)" msgstr "starte Log-Streaming bei %X/%X (Slot %s)" -#: pg_recvlogical.c:269 +#: pg_recvlogical.c:281 #, c-format msgid "streaming initiated" msgstr "Streaming eingeleitet" -#: pg_recvlogical.c:333 +#: pg_recvlogical.c:346 #, c-format msgid "could not open log file \"%s\": %m" msgstr "konnte Logdatei »%s« nicht öffnen: %m" -#: pg_recvlogical.c:362 receivelog.c:882 +#: pg_recvlogical.c:375 receivelog.c:882 #, c-format msgid "invalid socket: %s" msgstr "ungültiges Socket: %s" -#: pg_recvlogical.c:415 receivelog.c:910 +#: pg_recvlogical.c:428 receivelog.c:910 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: pg_recvlogical.c:422 receivelog.c:959 +#: pg_recvlogical.c:435 receivelog.c:959 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "konnte keine Daten vom WAL-Stream empfangen: %s" -#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003 +#: pg_recvlogical.c:477 pg_recvlogical.c:528 receivelog.c:1003 #: receivelog.c:1066 #, c-format msgid "streaming header too small: %d" msgstr "Streaming-Header zu klein: %d" -#: pg_recvlogical.c:499 receivelog.c:843 +#: pg_recvlogical.c:512 receivelog.c:843 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "unbekannter Streaming-Header: »%c«" -#: pg_recvlogical.c:553 pg_recvlogical.c:565 +#: pg_recvlogical.c:566 pg_recvlogical.c:578 #, c-format msgid "could not write %d bytes to log file \"%s\": %m" msgstr "konnte %d Bytes nicht in Logdatei »%s« schreiben: %m" -#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679 +#: pg_recvlogical.c:636 receivelog.c:642 receivelog.c:679 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "unerwarteter Abbruch des Replikations-Streams: %s" -#: pg_recvlogical.c:778 +#: pg_recvlogical.c:796 #, c-format msgid "could not parse start position \"%s\"" msgstr "konnte Startposition »%s« nicht parsen" -#: pg_recvlogical.c:856 +#: pg_recvlogical.c:874 #, c-format msgid "no slot specified" msgstr "kein Slot angegeben" -#: pg_recvlogical.c:863 +#: pg_recvlogical.c:881 #, c-format msgid "no target file specified" msgstr "keine Zieldatei angegeben" -#: pg_recvlogical.c:870 +#: pg_recvlogical.c:888 #, c-format msgid "no database specified" msgstr "keine Datenbank angegeben" -#: pg_recvlogical.c:877 +#: pg_recvlogical.c:895 #, c-format msgid "at least one action needs to be specified" msgstr "mindestens eine Aktion muss angegeben werden" -#: pg_recvlogical.c:884 +#: pg_recvlogical.c:902 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "--create-slot oder --start kann nicht zusammen mit --drop-slot verwendet werden" -#: pg_recvlogical.c:891 +#: pg_recvlogical.c:909 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "--create-slot oder --drop-slot kann nicht zusammen mit --startpos verwendet werden" -#: pg_recvlogical.c:898 +#: pg_recvlogical.c:916 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos kann nur zusammen mit --start angegeben werden" -#: pg_recvlogical.c:905 +#: pg_recvlogical.c:923 #, c-format msgid "--two-phase may only be specified with --create-slot" msgstr "--two-phase kann nur zusammen mit --create-slot angegeben werden" -#: pg_recvlogical.c:938 +#: pg_recvlogical.c:956 #, c-format msgid "could not establish database-specific replication connection" msgstr "konnte keine datenbankspezifische Replikationsverbindung herstellen" -#: pg_recvlogical.c:1032 +#: pg_recvlogical.c:1056 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "Endposition %X/%X durch Keepalive erreicht" -#: pg_recvlogical.c:1035 +#: pg_recvlogical.c:1061 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "Endposition %X/%X erreicht durch WAL-Eintrag bei %X/%X" @@ -1664,7 +2461,7 @@ msgstr "unerwartete Ergebnismenge nach Ende der Zeitleiste: %d Zeilen und %d Fel msgid "could not parse next timeline's starting point \"%s\"" msgstr "konnte Startpunkt der nächsten Zeitleiste (»%s«) nicht interpretieren" -#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201 +#: receivelog.c:775 receivelog.c:1022 walmethods.c:1206 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "konnte Datei »%s« nicht fsyncen: %s" @@ -1689,116 +2486,121 @@ msgstr "konnte %d Bytes nicht in WAL-Datei »%s« schreiben: %s" msgid "could not send copy-end packet: %s" msgstr "konnte COPY-Ende-Paket nicht senden: %s" -#: streamutil.c:158 +#: streamutil.c:162 msgid "Password: " msgstr "Passwort: " -#: streamutil.c:181 +#: streamutil.c:189 #, c-format msgid "could not connect to server" msgstr "konnte nicht mit Server verbinden" -#: streamutil.c:222 +#: streamutil.c:230 #, c-format -msgid "could not clear search_path: %s" -msgstr "konnte search_path nicht auf leer setzen: %s" +msgid "could not clear \"search_path\": %s" +msgstr "konnte »search_path« nicht auf leer setzen: %s" -#: streamutil.c:238 +#: streamutil.c:246 #, c-format -msgid "could not determine server setting for integer_datetimes" -msgstr "konnte Servereinstellung für integer_datetimes nicht ermitteln" +msgid "could not determine server setting for \"integer_datetimes\"" +msgstr "konnte Servereinstellung für »integer_datetimes« nicht ermitteln" -#: streamutil.c:245 +#: streamutil.c:253 #, c-format -msgid "integer_datetimes compile flag does not match server" +msgid "\"integer_datetimes\" compile flag does not match server" msgstr "Kompilieroption »integer_datetimes« stimmt nicht mit Server überein" -#: streamutil.c:296 +#: streamutil.c:372 #, c-format msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "konnte WAL-Segmentgröße nicht ermitteln: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet" -#: streamutil.c:306 +#: streamutil.c:382 #, c-format msgid "WAL segment size could not be parsed" msgstr "WAL-Segmentgröße konnte nicht interpretiert werden" -#: streamutil.c:324 +#: streamutil.c:400 +#, c-format +msgid "remote server reported invalid WAL segment size (%d byte)" +msgid_plural "remote server reported invalid WAL segment size (%d bytes)" +msgstr[0] "Server meldete ungültige WAL-Segmentgröße (%d Byte)" +msgstr[1] "Server meldete ungültige WAL-Segmentgröße (%d Bytes)" + +#: streamutil.c:404 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes" -msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Server gab einen Wert von %d Byte an" -msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Server gab einen Wert von %d Bytes an" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "Die WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein." -#: streamutil.c:369 +#: streamutil.c:446 #, c-format msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "konnte Gruppenzugriffseinstellung nicht ermitteln: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet" -#: streamutil.c:378 +#: streamutil.c:455 #, c-format msgid "group access flag could not be parsed: %s" msgstr "Gruppenzugriffseinstellung konnte nicht interpretiert werden: %s" -#: streamutil.c:421 streamutil.c:458 +#: streamutil.c:498 streamutil.c:535 #, c-format msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "Konnte System nicht identifizieren: %d Zeilen und %d Felder erhalten, %d Zeilen und %d oder mehr Felder erwartet" -#: streamutil.c:510 +#: streamutil.c:587 #, c-format msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "konnte Replikations-Slot »%s« nicht lesen: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" -#: streamutil.c:522 +#: streamutil.c:599 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "Replikations-Slot »%s« existiert nicht" -#: streamutil.c:533 +#: streamutil.c:610 #, c-format msgid "expected a physical replication slot, got type \"%s\" instead" msgstr "physischer Replikations-Slot wurde erwartet, stattdessen wurde Typ »%s« erhalten" -#: streamutil.c:547 +#: streamutil.c:624 #, c-format msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" msgstr "konnte restart_lsn »%s« für Replikations-Slot »%s« nicht parsen" -#: streamutil.c:664 +#: streamutil.c:741 #, c-format msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "konnte Replikations-Slot »%s« nicht erzeugen: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" -#: streamutil.c:708 +#: streamutil.c:785 #, c-format msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "konnte Replikations-Slot »%s« nicht löschen: %d Zeilen und %d Felder erhalten, %d Zeilen und %d Felder erwartet" -#: walmethods.c:721 walmethods.c:1264 +#: walmethods.c:726 walmethods.c:1269 msgid "could not compress data" msgstr "konnte Daten nicht komprimieren" -#: walmethods.c:750 +#: walmethods.c:755 msgid "could not reset compression stream" msgstr "konnte Komprimierungsstrom nicht zurücksetzen" -#: walmethods.c:888 +#: walmethods.c:892 msgid "implementation error: tar files can't have more than one open file" msgstr "Implementierungsfehler: Tar-Dateien können nicht mehr als eine offene Datei haben" -#: walmethods.c:903 +#: walmethods.c:907 msgid "could not create tar header" msgstr "konnte Tar-Dateikopf nicht erzeugen" -#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179 +#: walmethods.c:924 walmethods.c:965 walmethods.c:1171 walmethods.c:1184 msgid "could not change compression parameters" msgstr "konnte Komprimierungsparameter nicht ändern" -#: walmethods.c:1052 +#: walmethods.c:1056 msgid "unlink not supported with compression" msgstr "Unlink wird bei Komprimierung nicht unterstützt" -#: walmethods.c:1288 +#: walmethods.c:1293 msgid "could not close compression stream" msgstr "konnte Komprimierungsstrom nicht schließen" diff --git a/src/bin/pg_basebackup/po/es.po b/src/bin/pg_basebackup/po/es.po index 1148c0b46b9dc..b637026541f0e 100644 --- a/src/bin/pg_basebackup/po/es.po +++ b/src/bin/pg_basebackup/po/es.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_basebackup (PostgreSQL) 16\n" +"Project-Id-Version: pg_basebackup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:19+0000\n" -"PO-Revision-Date: 2023-05-22 12:05+0200\n" +"POT-Creation-Date: 2025-02-16 19:49+0000\n" +"PO-Revision-Date: 2024-11-16 14:23+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -70,9 +70,8 @@ msgstr "el valor para la opción de compresión «%s» debe ser un entero" #: ../../common/compression.c:331 #, c-format -#| msgid "value for compression option \"%s\" must be a boolean" msgid "value for compression option \"%s\" must be a Boolean value" -msgstr "el valor para la opción de compresión «%s» debe ser booleano" +msgstr "el valor para la opción de compresión «%s» debe ser un booleano" #: ../../common/compression.c:379 #, c-format @@ -94,6 +93,65 @@ msgstr "el algoritmo de compresión «%s» no acepta una cantidad de procesos ay msgid "compression algorithm \"%s\" does not support long-distance mode" msgstr "el algoritmo de compresión «%s» no acepta modo de larga distancia" +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "no se pudo abrir archivo «%s» para lectura: %m" + +#: ../../common/controldata_utils.c:110 pg_basebackup.c:1873 +#: pg_receivewal.c:402 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "no se pudo leer el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: bbstreamer_file.c:138 pg_recvlogical.c:650 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "no se pudo cerrar el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "discordancia en orden de bytes" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"posible discordancia en orden de bytes\n" +"El ordenamiento de bytes usado para almacenar el archivo pg_control puede no\n" +"coincidir con el usado por este programa. En tal caso los resultados de abajo\n" +"serían erróneos, y la instalación de PostgreSQL sería incompatible con este\n" +"directorio de datos." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: pg_basebackup.c:1846 pg_receivewal.c:386 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "no se pudo abrir el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "no se pudo escribir el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 pg_recvlogical.c:204 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format @@ -105,39 +163,69 @@ msgstr "memoria agotada\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "no se puede duplicar un puntero nulo (error interno)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:447 -#: pg_receivewal.c:319 pg_recvlogical.c:339 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_receivewal.c:319 pg_recvlogical.c:352 #, c-format msgid "could not stat file \"%s\": %m" msgstr "no se pudo hacer stat al archivo «%s»: %m" -#: ../../common/file_utils.c:162 pg_receivewal.c:242 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "esta instalación no soporta el método de sync «%s»" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_receivewal.c:242 #, c-format msgid "could not open directory \"%s\": %m" msgstr "no se pudo abrir el directorio «%s»: %m" -#: ../../common/file_utils.c:196 pg_receivewal.c:471 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_receivewal.c:471 #, c-format msgid "could not read directory \"%s\": %m" msgstr "no se pudo leer el directorio «%s»: %m" -#: ../../common/file_utils.c:228 ../../common/file_utils.c:287 -#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121 -#: pg_receivewal.c:386 +#: ../../common/file_utils.c:498 pg_basebackup.c:2344 walmethods.c:462 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "no se pudo abrir el archivo «%s»: %m" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" -#: ../../common/file_utils.c:299 ../../common/file_utils.c:369 -#: pg_recvlogical.c:194 +#: ../../common/restricted_token.c:60 #, c-format -msgid "could not fsync file \"%s\": %m" -msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" +msgid "could not open process token: error code %lu" +msgstr "no se pudo abrir el token de proceso: código de error %lu" -#: ../../common/file_utils.c:379 pg_basebackup.c:2237 walmethods.c:462 +#: ../../common/restricted_token.c:74 #, c-format -msgid "could not rename file \"%s\" to \"%s\": %m" -msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" +msgid "could not allocate SIDs: error code %lu" +msgstr "no se pudo emplazar los SIDs: código de error %lu" + +#: ../../common/restricted_token.c:94 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "no se pudo crear el token restringido: código de error %lu" + +#: ../../common/restricted_token.c:115 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "no se pudo iniciar el proceso para la orden «%s»: código de error %lu" + +#: ../../common/restricted_token.c:153 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "no se pudo re-ejecutar con el token restringido: código de error %lu" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "no se pudo obtener el código de salida del subproceso: código de error %lu" #: ../../fe_utils/option_utils.c:69 #, c-format @@ -149,51 +237,62 @@ msgstr "el valor «%s» no es válido para la opción «%s»" msgid "%s must be in range %d..%d" msgstr "%s debe estar en el rango %d..%d" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1609 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "método de sync no reconocido: «%s»" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 pg_basebackup.c:1636 streamutil.c:334 #, c-format msgid "out of memory" msgstr "memoria agotada" -#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121 -#: bbstreamer_file.c:258 pg_basebackup.c:1406 pg_basebackup.c:1700 +#: ../../fe_utils/recovery_gen.c:143 bbstreamer_file.c:121 +#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727 #, c-format msgid "could not write to file \"%s\": %m" msgstr "no se pudo escribir a archivo «%s»: %m" -#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360 -#: pg_basebackup.c:1470 pg_basebackup.c:1679 +#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:361 +#: pg_basebackup.c:1497 pg_basebackup.c:1706 #, c-format msgid "could not create file \"%s\": %m" msgstr "no se pudo crear archivo «%s»: %m" -#: bbstreamer_file.c:138 pg_recvlogical.c:633 +#: ../../fe_utils/string_utils.c:587 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "no se pudo cerrar el archivo «%s»: %m" +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "el argumento de la orden de shell contiene un salto de línea o retorno de carro: «%s»\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "el nombre de base de datos contiene un salto de línea o retorno de carro: «%s»\n" #: bbstreamer_file.c:275 #, c-format msgid "unexpected state while extracting archive" msgstr "estado inesperado mientras se extraía el archivo" -#: bbstreamer_file.c:320 pg_basebackup.c:686 pg_basebackup.c:730 +#: bbstreamer_file.c:321 pg_basebackup.c:698 pg_basebackup.c:712 +#: pg_basebackup.c:757 #, c-format msgid "could not create directory \"%s\": %m" msgstr "no se pudo crear el directorio «%s»: %m" -#: bbstreamer_file.c:325 +#: bbstreamer_file.c:326 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "no se pudo definir los permisos del directorio «%s»: %m" -#: bbstreamer_file.c:344 +#: bbstreamer_file.c:345 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "no se pudo crear un enlace simbólico desde «%s» a «%s»: %m" -#: bbstreamer_file.c:364 +#: bbstreamer_file.c:365 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "no se pudo definir los permisos al archivo «%s»: %m" @@ -228,7 +327,7 @@ msgstr "no se pudo escribir al archivo comprimido «%s»: %s" msgid "could not close compressed file \"%s\": %m" msgstr "no se pudo cerrar el archivo comprimido «%s»: %m" -#: bbstreamer_gzip.c:245 walmethods.c:876 +#: bbstreamer_gzip.c:245 walmethods.c:880 #, c-format msgid "could not initialize compression library" msgstr "no se pudo inicializar la biblioteca de compresión" @@ -278,12 +377,12 @@ msgstr "la terminación del archivo tar excede de 2 bloques" msgid "unexpected state while parsing tar archive" msgstr "se encontró un estado inesperado mientras se interpretaba el archivo tar" -#: bbstreamer_tar.c:296 +#: bbstreamer_tar.c:292 #, c-format msgid "tar member has empty name" msgstr "miembro de tar tiene nombre vacío" -#: bbstreamer_tar.c:328 +#: bbstreamer_tar.c:326 #, c-format msgid "COPY stream ended before last file was finished" msgstr "el flujo COPY terminó antes que el último archivo estuviera completo" @@ -305,115 +404,117 @@ msgstr "no se pudo definir la cantidad de procesos ayudantes de compresión a %d #: bbstreamer_zstd.c:116 #, c-format -#| msgid "could not enable user right \"%s\"" msgid "could not enable long-distance mode: %s" -msgstr "no se pudo habilitar el modo “long-distanceâ€: %s" +msgstr "no se pudo habilitar el modo de larga distancia: %s" #: bbstreamer_zstd.c:275 #, c-format msgid "could not create zstd decompression context" msgstr "no se pudo crear el contexto de descompresión zstd" -#: pg_basebackup.c:238 +#: pg_basebackup.c:245 #, c-format msgid "removing data directory \"%s\"" msgstr "eliminando el directorio de datos «%s»" -#: pg_basebackup.c:240 +#: pg_basebackup.c:247 #, c-format msgid "failed to remove data directory" msgstr "no se pudo eliminar el directorio de datos" -#: pg_basebackup.c:244 +#: pg_basebackup.c:251 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "eliminando el contenido del directorio «%s»" -#: pg_basebackup.c:246 +#: pg_basebackup.c:253 #, c-format msgid "failed to remove contents of data directory" msgstr "no se pudo eliminar el contenido del directorio de datos" -#: pg_basebackup.c:251 +#: pg_basebackup.c:258 #, c-format msgid "removing WAL directory \"%s\"" msgstr "eliminando el directorio de WAL «%s»" -#: pg_basebackup.c:253 +#: pg_basebackup.c:260 #, c-format msgid "failed to remove WAL directory" msgstr "no se pudo eliminar el directorio de WAL" -#: pg_basebackup.c:257 +#: pg_basebackup.c:264 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "eliminando el contenido del directorio de WAL «%s»" -#: pg_basebackup.c:259 +#: pg_basebackup.c:266 #, c-format msgid "failed to remove contents of WAL directory" msgstr "no se pudo eliminar el contenido del directorio de WAL" -#: pg_basebackup.c:265 +#: pg_basebackup.c:272 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "directorio de datos «%s» no eliminado a petición del usuario" -#: pg_basebackup.c:268 +#: pg_basebackup.c:275 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "directorio de WAL «%s» no eliminado a petición del usuario" -#: pg_basebackup.c:272 +#: pg_basebackup.c:279 #, c-format msgid "changes to tablespace directories will not be undone" msgstr "los cambios a los directorios de tablespaces no se desharán" -#: pg_basebackup.c:324 +#: pg_basebackup.c:331 #, c-format msgid "directory name too long" msgstr "nombre de directorio demasiado largo" -#: pg_basebackup.c:331 +#: pg_basebackup.c:338 #, c-format msgid "multiple \"=\" signs in tablespace mapping" msgstr "múltiples signos «=» en mapeo de tablespace" -#: pg_basebackup.c:340 +#: pg_basebackup.c:347 #, c-format msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "formato de mapeo de tablespace «%s» no válido, debe ser «ANTIGUO=NUEVO»" -#: pg_basebackup.c:359 +#: pg_basebackup.c:366 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "directorio antiguo no es una ruta absoluta en mapeo de tablespace: %s" -#: pg_basebackup.c:363 +#: pg_basebackup.c:370 #, c-format msgid "new directory is not an absolute path in tablespace mapping: %s" msgstr "directorio nuevo no es una ruta absoluta en mapeo de tablespace: %s" -#: pg_basebackup.c:385 +#: pg_basebackup.c:392 #, c-format msgid "" "%s takes a base backup of a running PostgreSQL server.\n" "\n" msgstr "" -"%s obtiene un respaldo base a partir de un servidor PostgreSQL en ejecución.\n" +"%s obtiene un respaldo base a partir de un servidor PostgreSQL\n" +"en ejecución.\n" "\n" -#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76 +#: pg_basebackup.c:394 pg_createsubscriber.c:221 pg_receivewal.c:79 +#: pg_recvlogical.c:86 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77 +#: pg_basebackup.c:395 pg_createsubscriber.c:222 pg_receivewal.c:80 +#: pg_recvlogical.c:87 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPCIÓN]...\n" -#: pg_basebackup.c:389 +#: pg_basebackup.c:396 #, c-format msgid "" "\n" @@ -422,17 +523,26 @@ msgstr "" "\n" "Opciones que controlan la salida:\n" -#: pg_basebackup.c:390 +#: pg_basebackup.c:397 #, c-format msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n" msgstr " -D, --pgdata=DIR directorio en el cual recibir el respaldo base\n" -#: pg_basebackup.c:391 +#: pg_basebackup.c:398 #, c-format msgid " -F, --format=p|t output format (plain (default), tar)\n" msgstr " -F, --format=p|t formato de salida (plano (por omisión), tar)\n" -#: pg_basebackup.c:392 +#: pg_basebackup.c:399 +#, c-format +msgid "" +" -i, --incremental=OLDMANIFEST\n" +" take incremental backup\n" +msgstr "" +" -i, --incremental=MANIFIESTOANTIGUO\n" +" tomar respaldo base incremental\n" + +#: pg_basebackup.c:401 #, c-format msgid "" " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" @@ -441,7 +551,7 @@ msgstr "" " -r, --max-rate=TASA máxima tasa a la que transferir el directorio de datos\n" " (en kB/s, o use sufijos «k» o «M»)\n" -#: pg_basebackup.c:394 +#: pg_basebackup.c:403 #, c-format msgid "" " -R, --write-recovery-conf\n" @@ -450,7 +560,7 @@ msgstr "" " -R, --write-recovery-conf\n" " escribe configuración para replicación\n" -#: pg_basebackup.c:396 +#: pg_basebackup.c:405 #, c-format msgid "" " -t, --target=TARGET[:DETAIL]\n" @@ -459,7 +569,7 @@ msgstr "" " -t, --target=DESTINO:[DETALLE]\n" " destino del respaldo base (si no es el cliente)\n" -#: pg_basebackup.c:398 +#: pg_basebackup.c:407 #, c-format msgid "" " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" @@ -468,12 +578,12 @@ msgstr "" " -T, --tablespace-mapping=ANTIGUO=NUEVO\n" " reubicar el directorio de tablespace de ANTIGUO a NUEVO\n" -#: pg_basebackup.c:400 +#: pg_basebackup.c:409 #, c-format msgid " --waldir=WALDIR location for the write-ahead log directory\n" msgstr " --waldir=DIRWAL ubicación para el directorio WAL\n" -#: pg_basebackup.c:401 +#: pg_basebackup.c:410 #, c-format msgid "" " -X, --wal-method=none|fetch|stream\n" @@ -481,14 +591,14 @@ msgid "" msgstr "" " -X, --wal-method=none|fetch|stream\n" " incluye los archivos WAL necesarios,\n" -" en el modo especificado\n" +" usando el método especificado\n" -#: pg_basebackup.c:403 +#: pg_basebackup.c:412 #, c-format msgid " -z, --gzip compress tar output\n" msgstr " -z, --gzip comprimir la salida de tar\n" -#: pg_basebackup.c:404 +#: pg_basebackup.c:413 #, c-format msgid "" " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" @@ -497,12 +607,12 @@ msgstr "" " -Z, --compress=[{client|server}-]MÉTODO[:DETALLE]\n" " comprimir en cliente o servidor como se especifica\n" -#: pg_basebackup.c:406 +#: pg_basebackup.c:415 #, c-format msgid " -Z, --compress=none do not compress tar output\n" msgstr " -Z, --compress=none no comprimir la salida tar\n" -#: pg_basebackup.c:407 +#: pg_basebackup.c:416 #, c-format msgid "" "\n" @@ -511,89 +621,93 @@ msgstr "" "\n" "Opciones generales:\n" -#: pg_basebackup.c:408 +#: pg_basebackup.c:417 #, c-format msgid "" " -c, --checkpoint=fast|spread\n" -" set fast or spread checkpointing\n" +" set fast or spread (default) checkpointing\n" msgstr "" -" -c, --checkpoint=fast|spread\n" -" utilizar checkpoint rápido o extendido\n" +" -c, --checkpoint=spread|fast\n" +" utilizar checkpoint extendido (por omisión) o rápido\n" -#: pg_basebackup.c:410 +#: pg_basebackup.c:419 #, c-format msgid " -C, --create-slot create replication slot\n" msgstr " -C, --create-slot crear un slot de replicación\n" -#: pg_basebackup.c:411 +#: pg_basebackup.c:420 #, c-format msgid " -l, --label=LABEL set backup label\n" msgstr " -l, --label=ETIQUETA establecer etiqueta del respaldo\n" -#: pg_basebackup.c:412 +#: pg_basebackup.c:421 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean no hacer limpieza tras errores\n" -#: pg_basebackup.c:413 +#: pg_basebackup.c:422 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n" -#: pg_basebackup.c:414 +#: pg_basebackup.c:423 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress mostrar información de progreso\n" -#: pg_basebackup.c:415 pg_receivewal.c:89 +#: pg_basebackup.c:424 pg_receivewal.c:89 #, c-format msgid " -S, --slot=SLOTNAME replication slot to use\n" msgstr " -S, --slot=NOMBRE slot de replicación a usar\n" -#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98 +#: pg_basebackup.c:425 pg_receivewal.c:91 pg_recvlogical.c:108 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose desplegar mensajes verbosos\n" -#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99 +#: pg_basebackup.c:426 pg_receivewal.c:92 pg_recvlogical.c:109 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión, luego salir\n" -#: pg_basebackup.c:418 +#: pg_basebackup.c:427 #, c-format msgid "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" " use algorithm for manifest checksums\n" msgstr "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" -" usar algoritmo para sumas de comprobación del manifiesto\n" +" algoritmo a usar para \"checksums\" del manifiesto\n" -#: pg_basebackup.c:420 +#: pg_basebackup.c:429 #, c-format msgid "" " --manifest-force-encode\n" " hex encode all file names in manifest\n" msgstr "" -" --manifest-force-encode\n" -" codifica a hexadecimal todos los nombres de archivo en el manifiesto\n" +" --manifest-force-encode codifica a hexadecimal todos los nombres\n" +" de archivo en el manifiesto\n" -#: pg_basebackup.c:422 +#: pg_basebackup.c:431 #, c-format msgid " --no-estimate-size do not estimate backup size in server side\n" -msgstr " --no-estimate-size no estimar el tamaño del la copia de seguridad en el lado del servidor\n" +msgstr "" +" --no-estimate-size no estimar el tamaño de la copia de seguridad en\n" +" el lado del servidor\n" -#: pg_basebackup.c:423 +#: pg_basebackup.c:432 #, c-format msgid " --no-manifest suppress generation of backup manifest\n" -msgstr " --no-manifest suprimir la generación del manifiesto de la copia de seguridad\n" +msgstr "" +" --no-manifest suprimir la generación del manifiesto\n" +" de la copia de seguridad\n" -#: pg_basebackup.c:424 +#: pg_basebackup.c:433 #, c-format msgid " --no-slot prevent creation of temporary replication slot\n" msgstr " --no-slot evitar la creación de un slot de replicación temporal\n" -#: pg_basebackup.c:425 +#: pg_basebackup.c:434 #, c-format msgid "" " --no-verify-checksums\n" @@ -602,12 +716,19 @@ msgstr "" " --no-verify-checksums\n" " no verificar checksums\n" -#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100 +#: pg_basebackup.c:436 +#, c-format +msgid "" +" --sync-method=METHOD\n" +" set method for syncing files to disk\n" +msgstr " --sync-method=MÉTODO definir método para sincronizar archivos a disco\n" + +#: pg_basebackup.c:438 pg_receivewal.c:95 pg_recvlogical.c:110 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda, luego salir\n" -#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101 +#: pg_basebackup.c:439 pg_receivewal.c:96 pg_recvlogical.c:111 #, c-format msgid "" "\n" @@ -616,22 +737,22 @@ msgstr "" "\n" "Opciones de conexión:\n" -#: pg_basebackup.c:429 pg_receivewal.c:97 +#: pg_basebackup.c:440 pg_receivewal.c:97 #, c-format msgid " -d, --dbname=CONNSTR connection string\n" msgstr " -d, --dbname=CONSTR cadena de conexión\n" -#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103 +#: pg_basebackup.c:441 pg_receivewal.c:98 pg_recvlogical.c:113 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=ANFITRIÓN dirección del servidor o directorio del socket\n" -#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104 +#: pg_basebackup.c:442 pg_receivewal.c:99 pg_recvlogical.c:114 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT número de port del servidor\n" -#: pg_basebackup.c:432 +#: pg_basebackup.c:443 #, c-format msgid "" " -s, --status-interval=INTERVAL\n" @@ -640,24 +761,25 @@ msgstr "" " -s, --status-interval=INTERVALO (segundos)\n" " tiempo entre envíos de paquetes de estado al servidor\n" -#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105 +#: pg_basebackup.c:445 pg_receivewal.c:100 pg_recvlogical.c:115 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NOMBRE conectarse con el usuario especificado\n" -#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106 +#: pg_basebackup.c:446 pg_receivewal.c:101 pg_recvlogical.c:116 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password nunca pedir contraseña\n" -#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107 +#: pg_basebackup.c:447 pg_receivewal.c:102 pg_recvlogical.c:117 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" " -W, --password forzar un prompt para la contraseña\n" " (debería ser automático)\n" -#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108 +#: pg_basebackup.c:448 pg_createsubscriber.c:240 pg_receivewal.c:106 +#: pg_recvlogical.c:118 #, c-format msgid "" "\n" @@ -666,484 +788,549 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109 +#: pg_basebackup.c:449 pg_createsubscriber.c:241 pg_receivewal.c:107 +#: pg_recvlogical.c:119 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: pg_basebackup.c:477 +#: pg_basebackup.c:488 #, c-format msgid "could not read from ready pipe: %m" msgstr "no se pudo leer desde la tubería: %m" -#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2151 -#: streamutil.c:441 +#: pg_basebackup.c:491 pg_basebackup.c:633 pg_basebackup.c:2258 +#: streamutil.c:521 #, c-format msgid "could not parse write-ahead log location \"%s\"" msgstr "no se pudo interpretar la ubicación del WAL «%s»" -#: pg_basebackup.c:585 pg_receivewal.c:600 +#: pg_basebackup.c:596 pg_receivewal.c:600 #, c-format msgid "could not finish writing WAL files: %m" msgstr "no se pudo completar la escritura de archivos WAL: %m" -#: pg_basebackup.c:631 +#: pg_basebackup.c:642 #, c-format msgid "could not create pipe for background process: %m" msgstr "no se pudo crear la tubería para el proceso en segundo plano: %m" -#: pg_basebackup.c:664 +#: pg_basebackup.c:676 #, c-format msgid "created temporary replication slot \"%s\"" msgstr "se creó slot temporal de replicación «%s»" -#: pg_basebackup.c:667 +#: pg_basebackup.c:679 #, c-format msgid "created replication slot \"%s\"" msgstr "se creó el slot de replicación «%s»" -#: pg_basebackup.c:701 +#: pg_basebackup.c:728 #, c-format msgid "could not create background process: %m" msgstr "no se pudo lanzar el proceso en segundo plano: %m" -#: pg_basebackup.c:710 +#: pg_basebackup.c:737 #, c-format msgid "could not create background thread: %m" msgstr "no se pudo lanzar el hilo en segundo plano: %m" -#: pg_basebackup.c:749 +#: pg_basebackup.c:776 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "el directorio «%s» existe pero no está vacío" -#: pg_basebackup.c:755 +#: pg_basebackup.c:782 pg_createsubscriber.c:390 #, c-format msgid "could not access directory \"%s\": %m" msgstr "no se pudo acceder al directorio «%s»: %m" -#: pg_basebackup.c:831 +#: pg_basebackup.c:858 #, c-format msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" msgstr[0] "%*s/%s kB (100%%), %d/%d tablespace %*s" msgstr[1] "%*s/%s kB (100%%), %d/%d tablespaces %*s" -#: pg_basebackup.c:843 +#: pg_basebackup.c:870 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" -#: pg_basebackup.c:859 +#: pg_basebackup.c:886 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace" msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespaces" -#: pg_basebackup.c:883 +#: pg_basebackup.c:910 #, c-format msgid "transfer rate \"%s\" is not a valid value" msgstr "tasa de transferencia «%s» no es un valor válido" -#: pg_basebackup.c:885 +#: pg_basebackup.c:912 #, c-format msgid "invalid transfer rate \"%s\": %m" msgstr "tasa de transferencia «%s» no válida: %m" -#: pg_basebackup.c:892 +#: pg_basebackup.c:919 #, c-format msgid "transfer rate must be greater than zero" msgstr "tasa de transferencia debe ser mayor que cero" -#: pg_basebackup.c:922 +#: pg_basebackup.c:949 #, c-format msgid "invalid --max-rate unit: \"%s\"" msgstr "unidad de --max-rato no válida: «%s»" -#: pg_basebackup.c:926 +#: pg_basebackup.c:953 #, c-format msgid "transfer rate \"%s\" exceeds integer range" msgstr "la tasa de transferencia «%s» excede el rango de enteros" -#: pg_basebackup.c:933 +#: pg_basebackup.c:960 #, c-format msgid "transfer rate \"%s\" is out of range" msgstr "la tasa de transferencia «%s» está fuera de rango" -#: pg_basebackup.c:995 +#: pg_basebackup.c:1022 #, c-format msgid "could not get COPY data stream: %s" msgstr "no se pudo obtener un flujo de datos COPY: %s" -#: pg_basebackup.c:1012 pg_recvlogical.c:436 pg_recvlogical.c:608 +#: pg_basebackup.c:1039 pg_recvlogical.c:449 pg_recvlogical.c:625 #: receivelog.c:973 #, c-format msgid "could not read COPY data: %s" msgstr "no fue posible leer datos COPY: %s" -#: pg_basebackup.c:1016 +#: pg_basebackup.c:1043 #, c-format msgid "background process terminated unexpectedly" msgstr "un proceso en segundo plano terminó inesperadamente" -#: pg_basebackup.c:1087 +#: pg_basebackup.c:1114 #, c-format msgid "cannot inject manifest into a compressed tar file" msgstr "no se pueden inyectar un manifiesto en un archivo tar comprimido" -#: pg_basebackup.c:1088 +#: pg_basebackup.c:1115 #, c-format msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s." msgstr "Use compresión del lado del cliente, envíe la salida a un directorio en lugar de a salida estándar, o use %s." -#: pg_basebackup.c:1104 +#: pg_basebackup.c:1131 #, c-format msgid "cannot parse archive \"%s\"" msgstr "no se pudo interpretar el archivo «%s»" -#: pg_basebackup.c:1105 +#: pg_basebackup.c:1132 #, c-format msgid "Only tar archives can be parsed." msgstr "Sólo los archivos tar pueden ser interpretados." -#: pg_basebackup.c:1107 +#: pg_basebackup.c:1134 #, c-format msgid "Plain format requires pg_basebackup to parse the archive." msgstr "El formato plano requiere que pg_basebackup interprete el archivo." -#: pg_basebackup.c:1109 +#: pg_basebackup.c:1136 #, c-format msgid "Using - as the output directory requires pg_basebackup to parse the archive." msgstr "Usar - como directorio de salida requiere que pg_basebackup interprete el archivo." -#: pg_basebackup.c:1111 +#: pg_basebackup.c:1138 #, c-format msgid "The -R option requires pg_basebackup to parse the archive." msgstr "La opción -R requiere que pg_basebackup interprete el archivo." -#: pg_basebackup.c:1330 +#: pg_basebackup.c:1357 #, c-format msgid "archives must precede manifest" msgstr "los archivos deben preceder al manifiesto" -#: pg_basebackup.c:1345 +#: pg_basebackup.c:1372 #, c-format msgid "invalid archive name: \"%s\"" msgstr "nombre de archivo no válido: «%s»" -#: pg_basebackup.c:1417 +#: pg_basebackup.c:1444 #, c-format msgid "unexpected payload data" msgstr "datos inesperados" -#: pg_basebackup.c:1560 +#: pg_basebackup.c:1587 #, c-format msgid "empty COPY message" msgstr "mensaje COPY vacío" -#: pg_basebackup.c:1562 +#: pg_basebackup.c:1589 #, c-format msgid "malformed COPY message of type %d, length %zu" msgstr "mensaje COPY mal formado de tipo %d, largo %zu" -#: pg_basebackup.c:1760 +#: pg_basebackup.c:1789 #, c-format msgid "incompatible server version %s" msgstr "versión del servidor %s incompatible" -#: pg_basebackup.c:1776 +#: pg_basebackup.c:1805 #, c-format msgid "Use -X none or -X fetch to disable log streaming." msgstr "Use -X none o -X fetch para deshabilitar el flujo de log." -#: pg_basebackup.c:1844 +#: pg_basebackup.c:1841 +#, c-format +msgid "server does not support incremental backup" +msgstr "el servidor no soporta backup incremental" + +#: pg_basebackup.c:1850 pg_basebackup.c:2008 pg_recvlogical.c:272 +#: receivelog.c:543 receivelog.c:582 streamutil.c:367 streamutil.c:441 +#: streamutil.c:493 streamutil.c:581 streamutil.c:733 streamutil.c:778 +#, c-format +msgid "could not send replication command \"%s\": %s" +msgstr "no se pudo ejecutar la orden de replicación «%s»: %s" + +#: pg_basebackup.c:1856 pg_basebackup.c:1883 +#, c-format +msgid "could not upload manifest: %s" +msgstr "no se pudo cargar el manifiesto: %s" + +#: pg_basebackup.c:1859 pg_basebackup.c:1886 +#, c-format +msgid "could not upload manifest: unexpected status %s" +msgstr "no se pudo cargar el manifiesto: estado inesperado %s" + +#: pg_basebackup.c:1867 +#, c-format +msgid "could not send COPY data: %s" +msgstr "no fue posible enviar datos COPY: %s" + +#: pg_basebackup.c:1877 +#, c-format +msgid "could not send end-of-COPY: %s" +msgstr "no se pudo enviar fin-de-COPY: %s" + +#: pg_basebackup.c:1892 +#, c-format +msgid "unexpected extra result while sending manifest" +msgstr "conjunto de resultados inesperado mientras se enviaba el manifiesto" + +#: pg_basebackup.c:1950 #, c-format msgid "backup targets are not supported by this server version" msgstr "los destinos de respaldo no están soportados por esta versión de servidor" -#: pg_basebackup.c:1847 +#: pg_basebackup.c:1953 #, c-format msgid "recovery configuration cannot be written when a backup target is used" msgstr "la configuración de recuperación no puede ser escrita cuando se usa un destino de respaldo base" -#: pg_basebackup.c:1874 +#: pg_basebackup.c:1980 #, c-format msgid "server does not support server-side compression" msgstr "el servidor no soporta compresión del lado del servidor" -#: pg_basebackup.c:1884 +#: pg_basebackup.c:1990 #, c-format msgid "initiating base backup, waiting for checkpoint to complete" msgstr "iniciando el respaldo base, esperando que el checkpoint se complete" -#: pg_basebackup.c:1888 +#: pg_basebackup.c:1994 #, c-format msgid "waiting for checkpoint" msgstr "esperando al checkpoint" -#: pg_basebackup.c:1901 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582 -#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501 -#: streamutil.c:653 streamutil.c:698 -#, c-format -msgid "could not send replication command \"%s\": %s" -msgstr "no se pudo ejecutar la orden de replicación «%s»: %s" - -#: pg_basebackup.c:1909 +#: pg_basebackup.c:2016 #, c-format msgid "could not initiate base backup: %s" msgstr "no se pudo iniciar el respaldo base: %s" -#: pg_basebackup.c:1912 +#: pg_basebackup.c:2019 #, c-format msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields" msgstr "el servidor envió una respuesta inesperada a la orden BASE_BACKUP; se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos" -#: pg_basebackup.c:1918 +#: pg_basebackup.c:2025 #, c-format msgid "checkpoint completed" msgstr "el checkpoint se ha completado" -#: pg_basebackup.c:1932 +#: pg_basebackup.c:2039 #, c-format msgid "write-ahead log start point: %s on timeline %u" msgstr "punto de inicio del WAL: %s en el timeline %u" -#: pg_basebackup.c:1940 +#: pg_basebackup.c:2047 #, c-format msgid "could not get backup header: %s" msgstr "no se pudo obtener la cabecera de respaldo: %s" -#: pg_basebackup.c:1943 +#: pg_basebackup.c:2050 #, c-format msgid "no data returned from server" msgstr "el servidor no retornó datos" -#: pg_basebackup.c:1986 +#: pg_basebackup.c:2093 #, c-format msgid "can only write single tablespace to stdout, database has %d" msgstr "sólo se puede escribir un tablespace a stdout, la base de datos tiene %d" -#: pg_basebackup.c:1999 +#: pg_basebackup.c:2106 #, c-format msgid "starting background WAL receiver" msgstr "iniciando el receptor de WAL en segundo plano" -#: pg_basebackup.c:2082 +#: pg_basebackup.c:2189 #, c-format msgid "backup failed: %s" msgstr "el respaldo falló: %s" -#: pg_basebackup.c:2085 +#: pg_basebackup.c:2192 #, c-format msgid "no write-ahead log end position returned from server" msgstr "el servidor no retornó la posición final del WAL" -#: pg_basebackup.c:2088 +#: pg_basebackup.c:2195 #, c-format msgid "write-ahead log end point: %s" msgstr "posición final del WAL: %s" -#: pg_basebackup.c:2099 +#: pg_basebackup.c:2206 #, c-format msgid "checksum error occurred" msgstr "ocurrió un error de checksums" -#: pg_basebackup.c:2104 +#: pg_basebackup.c:2211 #, c-format msgid "final receive failed: %s" msgstr "la recepción final falló: %s" -#: pg_basebackup.c:2128 +#: pg_basebackup.c:2235 #, c-format msgid "waiting for background process to finish streaming ..." msgstr "esperando que el proceso en segundo plano complete el flujo..." -#: pg_basebackup.c:2132 +#: pg_basebackup.c:2239 #, c-format msgid "could not send command to background pipe: %m" msgstr "no se pudo enviar una orden a la tubería de segundo plano: %m" -#: pg_basebackup.c:2137 +#: pg_basebackup.c:2244 #, c-format msgid "could not wait for child process: %m" msgstr "no se pudo esperar al proceso hijo: %m" -#: pg_basebackup.c:2139 +#: pg_basebackup.c:2246 #, c-format msgid "child %d died, expected %d" msgstr "el hijo %d murió, pero se esperaba al %d" -#: pg_basebackup.c:2141 streamutil.c:91 streamutil.c:196 +#: pg_basebackup.c:2248 streamutil.c:92 streamutil.c:207 streamutil.c:319 #, c-format msgid "%s" msgstr "%s" -#: pg_basebackup.c:2161 +#: pg_basebackup.c:2268 #, c-format msgid "could not wait for child thread: %m" msgstr "no se pudo esperar el hilo hijo: %m" -#: pg_basebackup.c:2166 +#: pg_basebackup.c:2273 #, c-format msgid "could not get child thread exit status: %m" msgstr "no se pudo obtener la cabecera de respaldo: %m" -#: pg_basebackup.c:2169 +#: pg_basebackup.c:2276 #, c-format msgid "child thread exited with error %u" msgstr "el hilo hijo terminó con error %u" -#: pg_basebackup.c:2198 +#: pg_basebackup.c:2305 #, c-format msgid "syncing data to disk ..." msgstr "sincronizando datos a disco ..." -#: pg_basebackup.c:2223 +#: pg_basebackup.c:2330 #, c-format msgid "renaming backup_manifest.tmp to backup_manifest" msgstr "renombrando backup_manifest.tmp a backup_manifest" -#: pg_basebackup.c:2243 +#: pg_basebackup.c:2350 #, c-format msgid "base backup completed" msgstr "el respaldo base se ha completado" -#: pg_basebackup.c:2326 +#: pg_basebackup.c:2436 #, c-format msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" msgstr "argumento de checkpoint «%s» no válido, debe ser «fast» o «spread»" -#: pg_basebackup.c:2344 +#: pg_basebackup.c:2454 #, c-format msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" msgstr "formato de salida «%s» no válido, debe ser «plain» o «tar»" -#: pg_basebackup.c:2422 +#: pg_basebackup.c:2535 #, c-format msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" msgstr "opción de wal-method «%s» no válida, debe ser «fetch», «stream» o «none»" -#: pg_basebackup.c:2457 pg_basebackup.c:2469 pg_basebackup.c:2491 -#: pg_basebackup.c:2503 pg_basebackup.c:2509 pg_basebackup.c:2561 -#: pg_basebackup.c:2572 pg_basebackup.c:2582 pg_basebackup.c:2588 -#: pg_basebackup.c:2595 pg_basebackup.c:2607 pg_basebackup.c:2619 -#: pg_basebackup.c:2627 pg_basebackup.c:2640 pg_basebackup.c:2646 -#: pg_basebackup.c:2655 pg_basebackup.c:2667 pg_basebackup.c:2678 -#: pg_basebackup.c:2686 pg_receivewal.c:748 pg_receivewal.c:760 +#: pg_basebackup.c:2574 pg_basebackup.c:2586 pg_basebackup.c:2608 +#: pg_basebackup.c:2620 pg_basebackup.c:2626 pg_basebackup.c:2678 +#: pg_basebackup.c:2689 pg_basebackup.c:2699 pg_basebackup.c:2705 +#: pg_basebackup.c:2712 pg_basebackup.c:2724 pg_basebackup.c:2736 +#: pg_basebackup.c:2744 pg_basebackup.c:2757 pg_basebackup.c:2763 +#: pg_basebackup.c:2772 pg_basebackup.c:2784 pg_basebackup.c:2795 +#: pg_basebackup.c:2803 pg_createsubscriber.c:2038 pg_createsubscriber.c:2048 +#: pg_createsubscriber.c:2056 pg_createsubscriber.c:2084 +#: pg_createsubscriber.c:2116 pg_receivewal.c:748 pg_receivewal.c:760 #: pg_receivewal.c:767 pg_receivewal.c:776 pg_receivewal.c:783 -#: pg_receivewal.c:793 pg_recvlogical.c:835 pg_recvlogical.c:847 -#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871 -#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892 -#: pg_recvlogical.c:899 pg_recvlogical.c:906 +#: pg_receivewal.c:793 pg_recvlogical.c:853 pg_recvlogical.c:865 +#: pg_recvlogical.c:875 pg_recvlogical.c:882 pg_recvlogical.c:889 +#: pg_recvlogical.c:896 pg_recvlogical.c:903 pg_recvlogical.c:910 +#: pg_recvlogical.c:917 pg_recvlogical.c:924 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: pg_basebackup.c:2467 pg_receivewal.c:758 pg_recvlogical.c:845 +#: pg_basebackup.c:2584 pg_createsubscriber.c:2046 pg_receivewal.c:758 +#: pg_recvlogical.c:863 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: pg_basebackup.c:2490 +#: pg_basebackup.c:2607 #, c-format msgid "cannot specify both format and backup target" msgstr "no se puede especificar un formato junto con un destino de respaldo" -#: pg_basebackup.c:2502 +#: pg_basebackup.c:2619 #, c-format msgid "must specify output directory or backup target" msgstr "debe especificar un directorio de salida o destino de respaldo base" -#: pg_basebackup.c:2508 +#: pg_basebackup.c:2625 #, c-format msgid "cannot specify both output directory and backup target" msgstr "no se puede especificar un directorio de salida junto con un destino de respaldo" -#: pg_basebackup.c:2538 pg_receivewal.c:802 +#: pg_basebackup.c:2655 pg_receivewal.c:802 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "algoritmo de compresión no reconocido: «%s»" -#: pg_basebackup.c:2544 pg_receivewal.c:809 +#: pg_basebackup.c:2661 pg_receivewal.c:809 #, c-format msgid "invalid compression specification: %s" msgstr "especificación de compresión no válida: %s" -#: pg_basebackup.c:2560 +#: pg_basebackup.c:2677 #, c-format msgid "client-side compression is not possible when a backup target is specified" msgstr "la compresión del lado del cliente no es posible cuando se especifica un destino del respaldo base" -#: pg_basebackup.c:2571 +#: pg_basebackup.c:2688 #, c-format msgid "only tar mode backups can be compressed" msgstr "sólo los respaldos de modo tar pueden ser comprimidos" -#: pg_basebackup.c:2581 +#: pg_basebackup.c:2698 #, c-format msgid "WAL cannot be streamed when a backup target is specified" msgstr "no se puede enviar WAL cuando se especifica un destino del respaldo base" -#: pg_basebackup.c:2587 +#: pg_basebackup.c:2704 #, c-format msgid "cannot stream write-ahead logs in tar mode to stdout" msgstr "no se puede enviar WALs en modo tar a stdout" -#: pg_basebackup.c:2594 +#: pg_basebackup.c:2711 #, c-format msgid "replication slots can only be used with WAL streaming" msgstr "los slots de replicación sólo pueden usarse con flujo de WAL" -#: pg_basebackup.c:2606 +#: pg_basebackup.c:2723 #, c-format msgid "--no-slot cannot be used with slot name" msgstr "no se puede usar --no-slot junto con nombre de slot" #. translator: second %s is an option name -#: pg_basebackup.c:2617 pg_receivewal.c:774 +#: pg_basebackup.c:2734 pg_receivewal.c:774 #, c-format msgid "%s needs a slot to be specified using --slot" msgstr "la opcón %s necesita que se especifique un slot con --slot" -#: pg_basebackup.c:2625 pg_basebackup.c:2665 pg_basebackup.c:2676 -#: pg_basebackup.c:2684 +#: pg_basebackup.c:2742 pg_basebackup.c:2782 pg_basebackup.c:2793 +#: pg_basebackup.c:2801 #, c-format msgid "%s and %s are incompatible options" msgstr "%s y %s son opciones incompatibles" -#: pg_basebackup.c:2639 +#: pg_basebackup.c:2756 #, c-format msgid "WAL directory location cannot be specified along with a backup target" msgstr "la ubicación del directorio de WAL no puede especificarse junto con un destino de respaldo" -#: pg_basebackup.c:2645 +#: pg_basebackup.c:2762 #, c-format msgid "WAL directory location can only be specified in plain mode" msgstr "la ubicación del directorio de WAL sólo puede especificarse en modo «plain»" -#: pg_basebackup.c:2654 +#: pg_basebackup.c:2771 #, c-format msgid "WAL directory location must be an absolute path" msgstr "la ubicación del directorio de WAL debe ser una ruta absoluta" -#: pg_basebackup.c:2754 +#: pg_basebackup.c:2871 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "no se pudo crear el enlace simbólico «%s»: %m" -#: pg_receivewal.c:77 +#: pg_createsubscriber.c:169 +#, c-format +msgid "failed after the end of recovery" +msgstr "falló al final de la recuperación" + +#: pg_createsubscriber.c:170 +#, c-format +msgid "The target server cannot be used as a physical replica anymore. You must recreate the physical replica before continuing." +msgstr "El servidor de destino no puede ser usado más como réplica física. Debe volver a crear la réplica física antes de continuar." + +#: pg_createsubscriber.c:198 +#, c-format +msgid "publication \"%s\" created in database \"%s\" on primary was left behind" +msgstr "la publicación «%s» en la base de datos «%s» en el primaro fue abandonada" + +#: pg_createsubscriber.c:200 +#, c-format +msgid "Drop this publication before trying again." +msgstr "Borre esta publicación antes de volver a intentar." + +#: pg_createsubscriber.c:204 +#, c-format +msgid "replication slot \"%s\" created in database \"%s\" on primary was left behind" +msgstr "el slot de replicación «%s» en la base de datos «%s» en el primario fue abandonada" + +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1261 +#, c-format +msgid "Drop this replication slot soon to avoid retention of WAL files." +msgstr "Elimine este slot de replicación pronto para evitar la retención de archivos WAL." + +#: pg_createsubscriber.c:219 #, c-format msgid "" -"%s receives PostgreSQL streaming write-ahead logs.\n" +"%s creates a new logical replica from a standby server.\n" "\n" msgstr "" -"%s recibe flujos del WAL de PostgreSQL.\n" +"%s crea una nueva réplica lógica a partir de un\n" +"servidor standby.\n" "\n" -#: pg_receivewal.c:81 pg_recvlogical.c:82 +#: pg_createsubscriber.c:223 pg_receivewal.c:81 pg_recvlogical.c:92 #, c-format msgid "" "\n" @@ -1152,22 +1339,638 @@ msgstr "" "\n" "Opciones:\n" +#: pg_createsubscriber.c:224 +#, c-format +msgid " -d, --database=DBNAME database in which to create a subscription\n" +msgstr " -d, --dbname=BASE-DATOS base de datos en la cual crear una suscripción\n" + +#: pg_createsubscriber.c:225 +#, c-format +msgid " -D, --pgdata=DATADIR location for the subscriber data directory\n" +msgstr " -D, --pgdata=DATADIR ubicación del directorio de datos del suscriptor\n" + +#: pg_createsubscriber.c:226 +#, c-format +msgid " -n, --dry-run dry run, just show what would be done\n" +msgstr " -n, --dry-run no actualiza, sólo muestra lo que se haría\n" + +#: pg_createsubscriber.c:227 +#, c-format +msgid " -p, --subscriber-port=PORT subscriber port number (default %s)\n" +msgstr " -p, --subscriber-port=PUERTO número de puerto del suscriptor (def. %s)\n" + +#: pg_createsubscriber.c:228 +#, c-format +msgid " -P, --publisher-server=CONNSTR publisher connection string\n" +msgstr " -P, --publisher-server=CONSTR cadena de conexión del publicador\n" + +#: pg_createsubscriber.c:229 +#, c-format +msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" +msgstr " -s, --socketdir=DIR directorio de sockets a usar (omisión: dir. actual)\n" + +#: pg_createsubscriber.c:230 +#, c-format +msgid " -t, --recovery-timeout=SECS seconds to wait for recovery to end\n" +msgstr " -t, --recovery-timeout=SEGS segundos a esperar a que la recuperación termine\n" + +#: pg_createsubscriber.c:231 +#, c-format +msgid " -U, --subscriber-username=NAME user name for subscriber connection\n" +msgstr " -U, --subscriber-username=USUARIO nombre de usuario para conexión del suscriptor\n" + +#: pg_createsubscriber.c:232 +#, c-format +msgid " -v, --verbose output verbose messages\n" +msgstr " -v, --verbose desplegar mensajes verbosos\n" + +#: pg_createsubscriber.c:233 +#, c-format +msgid "" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr "" +" --config-file=ARCHIVO utilizar el archivo de configuración del servidor\n" +" principal especificado al ejecutar el clúster de destino\n" + +#: pg_createsubscriber.c:235 +#, c-format +msgid " --publication=NAME publication name\n" +msgstr " --publication=NOMBRE nombre de publicación\n" + +#: pg_createsubscriber.c:236 +#, c-format +msgid " --replication-slot=NAME replication slot name\n" +msgstr " --replication-slot=NOMBRE nombre de slot de replicación\n" + +#: pg_createsubscriber.c:237 +#, c-format +msgid " --subscription=NAME subscription name\n" +msgstr " --subscription=NOMBRE nombre de suscripción\n" + +#: pg_createsubscriber.c:238 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version mostrar información de versión y salir\n" + +#: pg_createsubscriber.c:239 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostrar esta ayuda y salir\n" + +#: pg_createsubscriber.c:282 +#, c-format +msgid "could not parse connection string: %s" +msgstr "no se pudo interpretar la cadena de conexión: %s" + +#: pg_createsubscriber.c:359 +#, c-format +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "el programa «%s» es requerido por %s pero se encontró en el mismo directorio que «%s»" + +#: pg_createsubscriber.c:362 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "El programa «%s» fue encontrado por «%s», pero no es de la misma versión que %s" + +#: pg_createsubscriber.c:382 +#, c-format +msgid "checking if directory \"%s\" is a cluster data directory" +msgstr "verificando si el directorio «%s» es un directorio de datos de base de datos" + +#: pg_createsubscriber.c:388 +#, c-format +msgid "data directory \"%s\" does not exist" +msgstr "no existe el directorio de datos «%s»" + +#: pg_createsubscriber.c:396 +#, c-format +msgid "directory \"%s\" is not a database cluster directory" +msgstr "el directorio «%s» no es un directorio de base de datos" + +#: pg_createsubscriber.c:513 +#, c-format +msgid "connection to database failed: %s" +msgstr "falló la conexión a la base de datos: %s" + +#: pg_createsubscriber.c:526 +#, c-format +msgid "could not clear search_path: %s" +msgstr "no se pudo limpiar search_path: %s" + +#: pg_createsubscriber.c:566 +#, c-format +msgid "getting system identifier from publisher" +msgstr "obteniendo el identificador de sistema del publicador" + +#: pg_createsubscriber.c:573 +#, c-format +msgid "could not get system identifier: %s" +msgstr "no se pudo obtener el identificador de sistema: %s" + +#: pg_createsubscriber.c:579 +#, c-format +msgid "could not get system identifier: got %d rows, expected %d row" +msgstr "no se pudo obtener el identificador de sistema: se obtuvieron %d filas, se esperaban %d filas" + +#: pg_createsubscriber.c:586 +#, c-format +msgid "system identifier is %llu on publisher" +msgstr "identificador de sistema es %llu en el publicador" + +#: pg_createsubscriber.c:607 +#, c-format +msgid "getting system identifier from subscriber" +msgstr "obteniendo identificador de sistema del suscriptor" + +#: pg_createsubscriber.c:611 pg_createsubscriber.c:641 +#, c-format +msgid "control file appears to be corrupt" +msgstr "el archivo de control parece estar corrupto" + +#: pg_createsubscriber.c:615 pg_createsubscriber.c:656 +#, c-format +msgid "system identifier is %llu on subscriber" +msgstr "el identificador de sistema es %llu en suscriptor" + +#: pg_createsubscriber.c:637 +#, c-format +msgid "modifying system identifier of subscriber" +msgstr "modificando el identificador de sistema del suscriptor" + +#: pg_createsubscriber.c:659 +#, c-format +msgid "running pg_resetwal on the subscriber" +msgstr "ejecutando pg_resetwal en el suscriptor" + +#: pg_createsubscriber.c:671 +#, c-format +msgid "subscriber successfully changed the system identifier" +msgstr "el suscriptor cambió exitosamente el identificador de sistema" + +#: pg_createsubscriber.c:673 +#, c-format +msgid "could not change system identifier of subscriber: %s" +msgstr "no se pudo cambiar el identificador de sistema del suscriptor: %s" + +#: pg_createsubscriber.c:697 +#, c-format +msgid "could not obtain database OID: %s" +msgstr "no se pudo obtener el OID de base de datos: %s" + +#: pg_createsubscriber.c:704 +#, c-format +msgid "could not obtain database OID: got %d rows, expected %d row" +msgstr "no se pudo obtener el OID de base de datos: se obtuvieron %d filas, se esperaban %d filas" + +#: pg_createsubscriber.c:776 +#, c-format +msgid "create replication slot \"%s\" on publisher" +msgstr "crear el slot de replicación «%s» en el publicador" + +#: pg_createsubscriber.c:796 +#, c-format +msgid "could not write an additional WAL record: %s" +msgstr "no se pudo escribir un registro WAL adicional: %s" + +#: pg_createsubscriber.c:822 +#, c-format +msgid "could not obtain recovery progress: %s" +msgstr "no se pudo obtener el progreso de la recuperación: %s" + +#: pg_createsubscriber.c:854 +#, c-format +msgid "checking settings on publisher" +msgstr "verificando configuración en el publicador" + +#: pg_createsubscriber.c:864 +#, c-format +msgid "primary server cannot be in recovery" +msgstr "el servidor primario no puede estar en recuperación" + +#: pg_createsubscriber.c:888 +#, c-format +msgid "could not obtain publisher settings: %s" +msgstr "no se pudo obtener configuraciones del publicador: %s" + +# FIXME see slot.c:779. See also postmaster.c:835 +#: pg_createsubscriber.c:914 +#, c-format +msgid "publisher requires wal_level >= \"logical\"" +msgstr "el publicador requiere wal_level >= «logical»" + +#: pg_createsubscriber.c:920 +#, c-format +msgid "publisher requires %d replication slots, but only %d remain" +msgstr "el publicador requiere %d slots de replicación, pero solo quedan %d" + +#: pg_createsubscriber.c:922 pg_createsubscriber.c:931 +#: pg_createsubscriber.c:1028 pg_createsubscriber.c:1037 +#: pg_createsubscriber.c:1046 +#, c-format +msgid "Increase the configuration parameter \"%s\" to at least %d." +msgstr "Aumente el parámetro de configuración «%s» a al menos %d." + +#: pg_createsubscriber.c:929 +#, c-format +msgid "publisher requires %d WAL sender processes, but only %d remain" +msgstr "el publicador requiere %d procesos WAL sender, pero sólo quedan %d" + +#: pg_createsubscriber.c:938 +#, c-format +msgid "two_phase option will not be enabled for replication slots" +msgstr "la opción two_phase no será activada en los slots de replicación" + +#: pg_createsubscriber.c:939 +#, c-format +msgid "Subscriptions will be created with the two_phase option disabled. Prepared transactions will be replicated at COMMIT PREPARED." +msgstr "Las suscripciones serán creadas con la opción two_phase desactivada. Las transacciones preparadas serán replicadas durante COMMIT PREPARED." + +#: pg_createsubscriber.c:971 +#, c-format +msgid "checking settings on subscriber" +msgstr "verificando configuraciones en el suscriptor" + +#: pg_createsubscriber.c:978 +#, c-format +msgid "target server must be a standby" +msgstr "el servidor de destino debe ser un standby" + +#: pg_createsubscriber.c:1002 +#, c-format +msgid "could not obtain subscriber settings: %s" +msgstr "no se pudo obtener la configuración del suscriptor: %s" + +#: pg_createsubscriber.c:1026 +#, c-format +msgid "subscriber requires %d replication slots, but only %d remain" +msgstr "el suscriptor requiere %d slots de replicación, pero sólo quedan %d" + +#: pg_createsubscriber.c:1035 +#, c-format +msgid "subscriber requires %d logical replication workers, but only %d remain" +msgstr "el suscriptor requiere %d procesos de replicación lógica, pero sólo quedan %d" + +#: pg_createsubscriber.c:1044 +#, c-format +msgid "subscriber requires %d worker processes, but only %d remain" +msgstr "el suscriptor requiere %d procesos ayudantes, pero solo quedan %d" + +#: pg_createsubscriber.c:1079 +#, c-format +msgid "dropping subscription \"%s\" in database \"%s\"" +msgstr "eliminando suscripción «%s» en base de datos «%s»" + +#: pg_createsubscriber.c:1088 +#, c-format +msgid "could not drop subscription \"%s\": %s" +msgstr "no se pudo eliminar la suscripción «%s»: %s" + +#: pg_createsubscriber.c:1123 +#, c-format +msgid "could not obtain pre-existing subscriptions: %s" +msgstr "no se pudo obtener suscripciones pre-existentes: %s" + +#: pg_createsubscriber.c:1259 +#, c-format +msgid "could not drop replication slot \"%s\" on primary" +msgstr "no se pudo eliminar el slot de replicación «%s» en el primario" + +#: pg_createsubscriber.c:1293 +#, c-format +msgid "could not obtain failover replication slot information: %s" +msgstr "no se pudo obtener información de slots de replicación \"failover\": %s" + +#: pg_createsubscriber.c:1295 pg_createsubscriber.c:1304 +#, c-format +msgid "Drop the failover replication slots on subscriber soon to avoid retention of WAL files." +msgstr "Elimine los slots de replicación de failover en el suscriptor pronto para evitar retención de archivos WAL." + +#: pg_createsubscriber.c:1303 +#, c-format +msgid "could not drop failover replication slot" +msgstr "no se pudo eliminar el slot de replicación \"failover\"" + +#: pg_createsubscriber.c:1325 +#, c-format +msgid "creating the replication slot \"%s\" in database \"%s\"" +msgstr "creando el slot de replicación «%s» en base de datos «%s»" + +#: pg_createsubscriber.c:1343 +#, c-format +msgid "could not create replication slot \"%s\" in database \"%s\": %s" +msgstr "no se pudo crear el slot de replicación «%s» en base de datos «%s»: %s" + +#: pg_createsubscriber.c:1373 +#, c-format +msgid "dropping the replication slot \"%s\" in database \"%s\"" +msgstr "eliminando el slot de replicación «%s» en base de datos «%s»" + +#: pg_createsubscriber.c:1389 +#, c-format +msgid "could not drop replication slot \"%s\" in database \"%s\": %s" +msgstr "no se pudo eliminar el slot de replicación «%s» en base de datos «%s»: %s" + +#: pg_createsubscriber.c:1410 +#, c-format +msgid "pg_ctl failed with exit code %d" +msgstr "pg_ctl falló con código de retorno %d" + +#: pg_createsubscriber.c:1415 +#, c-format +msgid "pg_ctl was terminated by exception 0x%X" +msgstr "pg_ctl fue terminado por una excepción 0x%X" + +#: pg_createsubscriber.c:1417 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "Vea el archivo «ntstatus.h» para una descripción del valor hexadecimal." + +#: pg_createsubscriber.c:1419 +#, c-format +msgid "pg_ctl was terminated by signal %d: %s" +msgstr "pg_ctl fue terminado por una señal %d: %s" + +#: pg_createsubscriber.c:1425 +#, c-format +msgid "pg_ctl exited with unrecognized status %d" +msgstr "pg_ctl terminó con código no reconocido %d" + +#: pg_createsubscriber.c:1428 +#, c-format +msgid "The failed command was: %s" +msgstr "La orden fallida era: %s" + +#: pg_createsubscriber.c:1474 +#, c-format +msgid "server was started" +msgstr "el servidor fue iniciado" + +#: pg_createsubscriber.c:1489 +#, c-format +msgid "server was stopped" +msgstr "el servidor fue detenido" + +#: pg_createsubscriber.c:1508 +#, c-format +msgid "waiting for the target server to reach the consistent state" +msgstr "esperando que el servidor de destino alcance el estado consistente" + +#: pg_createsubscriber.c:1531 +#, c-format +msgid "recovery timed out" +msgstr "la recuperación tomó demasiado tiempo" + +#: pg_createsubscriber.c:1544 +#, c-format +msgid "server did not end recovery" +msgstr "el servidor no terminó la recuperación" + +#: pg_createsubscriber.c:1546 +#, c-format +msgid "target server reached the consistent state" +msgstr "el servidor de destino alcanzó el estado consistente" + +#: pg_createsubscriber.c:1547 +#, c-format +msgid "If pg_createsubscriber fails after this point, you must recreate the physical replica before continuing." +msgstr "Si pg_createsubscriber falla a partir de este punto, deberá re-crear la réplica física antes de continuar." + +#: pg_createsubscriber.c:1574 +#, c-format +msgid "could not obtain publication information: %s" +msgstr "no se pudo obtener la información de publicación: %s" + +#: pg_createsubscriber.c:1588 +#, c-format +msgid "publication \"%s\" already exists" +msgstr "la publicación «%s» ya existe" + +#: pg_createsubscriber.c:1589 +#, c-format +msgid "Consider renaming this publication before continuing." +msgstr "Considere cambiar el nombre de esta publicación antes de continuar." + +#: pg_createsubscriber.c:1596 +#, c-format +msgid "creating publication \"%s\" in database \"%s\"" +msgstr "creando la publicación «%s» en la base de datos «%s»" + +#: pg_createsubscriber.c:1609 +#, c-format +msgid "could not create publication \"%s\" in database \"%s\": %s" +msgstr "no se pudo crear la publicación «%s» en la base de datos «%s»: %s" + +#: pg_createsubscriber.c:1638 +#, c-format +msgid "dropping publication \"%s\" in database \"%s\"" +msgstr "eliminando la publicación «%s» en la base de datos «%s»" + +#: pg_createsubscriber.c:1652 +#, c-format +msgid "could not drop publication \"%s\" in database \"%s\": %s" +msgstr "no se pudo eliminar la publicación «%s» en la base de datos «%s»: %s" + +#: pg_createsubscriber.c:1698 +#, c-format +msgid "creating subscription \"%s\" in database \"%s\"" +msgstr "creando la suscripción «%s» en la base de datos «%s»" + +#: pg_createsubscriber.c:1719 +#, c-format +msgid "could not create subscription \"%s\" in database \"%s\": %s" +msgstr "no se pudo create la suscripción «%s» en la base de datos «%s»: %s" + +#: pg_createsubscriber.c:1764 +#, c-format +msgid "could not obtain subscription OID: %s" +msgstr "no se pudo obtener el OID de suscripción: %s" + +#: pg_createsubscriber.c:1771 +#, c-format +msgid "could not obtain subscription OID: got %d rows, expected %d row" +msgstr "no se pudo obtener el OID de suscripción: se obtuvieron %d filas, se esperaban %d filas" + +#: pg_createsubscriber.c:1795 +#, c-format +msgid "setting the replication progress (node name \"%s\", LSN %s) in database \"%s\"" +msgstr "definiendo progreso de replicación (nombre de nodo «%s», LSN %s) en base de datos «%s»" + +#: pg_createsubscriber.c:1810 +#, c-format +msgid "could not set replication progress for subscription \"%s\": %s" +msgstr "no se pudo establecer el progreso de replicación para la suscripción «%s»: %s" + +#: pg_createsubscriber.c:1841 +#, c-format +msgid "enabling subscription \"%s\" in database \"%s\"" +msgstr "activando la suscripción «%s» en la base de datos «%s»" + +#: pg_createsubscriber.c:1853 +#, c-format +msgid "could not enable subscription \"%s\": %s" +msgstr "no se pudo habilitar la suscripción «%s»: %s" + +#: pg_createsubscriber.c:1945 +#, c-format +msgid "cannot be executed by \"root\"" +msgstr "no puede ser ejecutado con el usuario «root»" + +#: pg_createsubscriber.c:1946 +#, c-format +msgid "You must run %s as the PostgreSQL superuser." +msgstr "Debe ejecutar %s con el superusuario de PostgreSQL." + +#: pg_createsubscriber.c:1967 +#, c-format +msgid "database \"%s\" specified more than once" +msgstr "la base de datos «%s» fue especificado más de una vez" + +#: pg_createsubscriber.c:2008 +#, c-format +msgid "publication \"%s\" specified more than once" +msgstr "la publicación «%s» fue especificada más de una vez" + +#: pg_createsubscriber.c:2020 +#, c-format +msgid "replication slot \"%s\" specified more than once" +msgstr "el slot de replicación «%s» fue especificado más de una vez" + +#: pg_createsubscriber.c:2032 +#, c-format +msgid "subscription \"%s\" specified more than once" +msgstr "la suscripción «%s» fue especificada más de una vez" + +#: pg_createsubscriber.c:2055 +#, c-format +msgid "no subscriber data directory specified" +msgstr "no se especificó un directorio de datos de suscripción" + +#: pg_createsubscriber.c:2066 +#, c-format +msgid "could not determine current directory" +msgstr "no se pudo determinar el directorio actual" + +#: pg_createsubscriber.c:2083 +#, c-format +msgid "no publisher connection string specified" +msgstr "no se especificó un string de conexión de publicador" + +#: pg_createsubscriber.c:2087 +#, c-format +msgid "validating publisher connection string" +msgstr "validando string de conexión del publicador" + +#: pg_createsubscriber.c:2093 +#, c-format +msgid "validating subscriber connection string" +msgstr "validando string de conexión del suscriptor" + +#: pg_createsubscriber.c:2098 +#, c-format +msgid "no database was specified" +msgstr "no se especificó una base de datos" + +#: pg_createsubscriber.c:2110 +#, c-format +msgid "database name \"%s\" was extracted from the publisher connection string" +msgstr "el nombr de base de datos «%s» fue extraído del string de conexión del publicador" + +#: pg_createsubscriber.c:2115 +#, c-format +msgid "no database name specified" +msgstr "no se especificó un nombre de base de datos" + +#: pg_createsubscriber.c:2125 +#, c-format +msgid "wrong number of publication names specified" +msgstr "una cantidad incorrecta de nombres de publicación fue especificada" + +#: pg_createsubscriber.c:2126 +#, c-format +msgid "The number of specified publication names (%d) must match the number of specified database names (%d)." +msgstr "La cantidad de nombres de publicación especificados (%d) debe coincidir con el número de nombres de bases de datos (%d)." + +#: pg_createsubscriber.c:2132 +#, c-format +msgid "wrong number of subscription names specified" +msgstr "una cantidad incorrecta de nombres de suscripción fue especificada" + +#: pg_createsubscriber.c:2133 +#, c-format +msgid "The number of specified subscription names (%d) must match the number of specified database names (%d)." +msgstr "La cantidad de nombres de suscripción especificados (%d) debe coincidir con el número de nombres de bases de datos (%d)." + +#: pg_createsubscriber.c:2139 +#, c-format +msgid "wrong number of replication slot names specified" +msgstr "una cantidad incorrecta de nombres de slots de replicación fue especificada" + +#: pg_createsubscriber.c:2140 +#, c-format +msgid "The number of specified replication slot names (%d) must match the number of specified database names (%d)." +msgstr "La cantidad de nombres de slots de replicación especificados (%d) debe coincidir con el número de nombres de bases de datos (%d)." + +#: pg_createsubscriber.c:2169 +#, c-format +msgid "subscriber data directory is not a copy of the source database cluster" +msgstr "el directorio de datos del suscriptor no es una copia del clúster de origen" + +#: pg_createsubscriber.c:2182 +#, c-format +msgid "standby server is running" +msgstr "el servidor standby está en ejecución" + +#: pg_createsubscriber.c:2183 +#, c-format +msgid "Stop the standby server and try again." +msgstr "Detenga el servidor standby y pruebe otra vez." + +#: pg_createsubscriber.c:2192 +#, c-format +msgid "starting the standby server with command-line options" +msgstr "iniciando el standby con opciones de línea de órdenes" + +#: pg_createsubscriber.c:2208 pg_createsubscriber.c:2243 +#, c-format +msgid "stopping the subscriber" +msgstr "deteniendo el suscriptor" + +#: pg_createsubscriber.c:2222 +#, c-format +msgid "starting the subscriber" +msgstr "iniciando el suscriptor" + +#: pg_createsubscriber.c:2251 +#, c-format +msgid "Done!" +msgstr "¡Listo!" + +#: pg_receivewal.c:77 +#, c-format +msgid "" +"%s receives PostgreSQL streaming write-ahead logs.\n" +"\n" +msgstr "" +"%s recibe flujos del WAL de PostgreSQL.\n" +"\n" + #: pg_receivewal.c:82 #, c-format msgid " -D, --directory=DIR receive write-ahead log files into this directory\n" msgstr " -D, --directory=DIR recibir los archivos de WAL en este directorio\n" -#: pg_receivewal.c:83 pg_recvlogical.c:83 +#: pg_receivewal.c:83 pg_recvlogical.c:93 #, c-format msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" msgstr " -E, --endpos=LSN salir luego de recibir el LSN especificado\n" -#: pg_receivewal.c:84 pg_recvlogical.c:87 +#: pg_receivewal.c:84 pg_recvlogical.c:97 #, c-format msgid " --if-not-exists do not error if slot already exists when creating a slot\n" msgstr " --if-not-exists no abandonar si el slot ya existe al crear un slot\n" -#: pg_receivewal.c:85 pg_recvlogical.c:89 +#: pg_receivewal.c:85 pg_recvlogical.c:99 #, c-format msgid " -n, --no-loop do not loop on connection lost\n" msgstr " -n, --no-loop no entrar en bucle al perder la conexión\n" @@ -1177,7 +1980,7 @@ msgstr " -n, --no-loop no entrar en bucle al perder la conexión\n" msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync no esperar que los cambios se sincronicen a disco\n" -#: pg_receivewal.c:87 pg_recvlogical.c:94 +#: pg_receivewal.c:87 pg_recvlogical.c:104 #, c-format msgid "" " -s, --status-interval=SECS\n" @@ -1210,12 +2013,12 @@ msgstr "" "\n" "Acciones optativas:\n" -#: pg_receivewal.c:104 pg_recvlogical.c:79 +#: pg_receivewal.c:104 pg_recvlogical.c:89 #, c-format msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n" msgstr " --create-slot crear un nuevo slot de replicación (para el nombre, vea --slot)\n" -#: pg_receivewal.c:105 pg_recvlogical.c:80 +#: pg_receivewal.c:105 pg_recvlogical.c:90 #, c-format msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n" msgstr " --drop-slot eliminar un slot de replicación (para el nombre, vea --slot)\n" @@ -1235,7 +2038,7 @@ msgstr "detenido el flujo de log en %X/%X (timeline %u)" msgid "switched to timeline %u at %X/%X" msgstr "cambiado al timeline %u en %X/%X" -#: pg_receivewal.c:224 +#: pg_receivewal.c:224 pg_recvlogical.c:1053 #, c-format msgid "received interrupt signal, exiting" msgstr "se recibió una señal de interrupción, saliendo" @@ -1280,11 +2083,6 @@ msgstr "el archivo de segmento «%s» tiene tamaño incorrecto %d al descomprimi msgid "could not create LZ4 decompression context: %s" msgstr "no se pudo crear un contexto de descompresión LZ4: %s" -#: pg_receivewal.c:402 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "no se pudo leer el archivo «%s»: %m" - #: pg_receivewal.c:420 #, c-format msgid "could not decompress file \"%s\": %s" @@ -1310,7 +2108,7 @@ msgstr "no se puede verificar el archivo «%s»: la compresión con %s no está msgid "starting log streaming at %X/%X (timeline %u)" msgstr "iniciando el flujo de log en %X/%X (timeline %u)" -#: pg_receivewal.c:693 pg_recvlogical.c:783 +#: pg_receivewal.c:693 pg_recvlogical.c:801 #, c-format msgid "could not parse end position \"%s\"" msgstr "no se pudo interpretar la posición final «%s»" @@ -1340,28 +2138,28 @@ msgstr "el método de compresión %s no está soportado aún" msgid "replication connection using slot \"%s\" is unexpectedly database specific" msgstr "la conexión de replicación usando el slot «%s» es inesperadamente específica a una base de datos" -#: pg_receivewal.c:878 pg_recvlogical.c:954 +#: pg_receivewal.c:878 pg_recvlogical.c:972 #, c-format msgid "dropping replication slot \"%s\"" msgstr "eliminando el slot de replicación «%s»" -#: pg_receivewal.c:889 pg_recvlogical.c:964 +#: pg_receivewal.c:889 pg_recvlogical.c:982 #, c-format msgid "creating replication slot \"%s\"" msgstr "creando el slot de replicación «%s»" -#: pg_receivewal.c:918 pg_recvlogical.c:988 +#: pg_receivewal.c:918 pg_recvlogical.c:1006 #, c-format msgid "disconnected" msgstr "desconectado" #. translator: check source for value for %d -#: pg_receivewal.c:922 pg_recvlogical.c:992 +#: pg_receivewal.c:922 pg_recvlogical.c:1010 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "desconectado; esperando %d segundos para intentar nuevamente" -#: pg_recvlogical.c:74 +#: pg_recvlogical.c:84 #, c-format msgid "" "%s controls PostgreSQL logical decoding streams.\n" @@ -1370,7 +2168,7 @@ msgstr "" "%s controla flujos de decodificación lógica de PostgreSQL.\n" "\n" -#: pg_recvlogical.c:78 +#: pg_recvlogical.c:88 #, c-format msgid "" "\n" @@ -1379,17 +2177,17 @@ msgstr "" "\n" "Acciones a ejecutar:\n" -#: pg_recvlogical.c:81 +#: pg_recvlogical.c:91 #, c-format msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n" msgstr " --start iniciar flujo en un slot de replicación (para el nombre, vea --slot)\n" -#: pg_recvlogical.c:84 +#: pg_recvlogical.c:94 #, c-format msgid " -f, --file=FILE receive log into this file, - for stdout\n" msgstr " -f, --file=ARCHIVO recibir el log en este archivo, - para stdout\n" -#: pg_recvlogical.c:85 +#: pg_recvlogical.c:95 #, c-format msgid "" " -F --fsync-interval=SECS\n" @@ -1398,12 +2196,12 @@ msgstr "" " -F, --fsync-interval=SEGS\n" " tiempo entre fsyncs del archivo de salida (omisión: %d)\n" -#: pg_recvlogical.c:88 +#: pg_recvlogical.c:98 #, c-format msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n" msgstr " -I, --startpos=LSN dónde en un slot existente debe empezar el flujo\n" -#: pg_recvlogical.c:90 +#: pg_recvlogical.c:100 #, c-format msgid "" " -o, --option=NAME[=VALUE]\n" @@ -1414,143 +2212,143 @@ msgstr "" " pasar opción NOMBRE con valor opcional VALOR al\n" " plugin de salida\n" -#: pg_recvlogical.c:93 +#: pg_recvlogical.c:103 #, c-format msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n" msgstr " -P, --plugin=PLUGIN usar plug-in de salida PLUGIN (omisión: %s)\n" -#: pg_recvlogical.c:96 +#: pg_recvlogical.c:106 #, c-format msgid " -S, --slot=SLOTNAME name of the logical replication slot\n" msgstr " -S, --slot=NOMBRE-SLOT nombre del slot de replicación lógica\n" -#: pg_recvlogical.c:97 +#: pg_recvlogical.c:107 #, c-format msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n" msgstr " -t, --two-phase activa decodificación de transacciones preparadas al crear un slot\n" -#: pg_recvlogical.c:102 +#: pg_recvlogical.c:112 #, c-format msgid " -d, --dbname=DBNAME database to connect to\n" msgstr " -d, --dbname=BASE base de datos a la cual conectarse\n" -#: pg_recvlogical.c:135 +#: pg_recvlogical.c:145 #, c-format msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)" msgstr "confirmando escritura hasta %X/%X, fsync hasta %X/%X (slot %s)" -#: pg_recvlogical.c:159 receivelog.c:360 +#: pg_recvlogical.c:169 receivelog.c:360 #, c-format msgid "could not send feedback packet: %s" msgstr "no se pudo enviar el paquete de retroalimentación: %s" -#: pg_recvlogical.c:227 +#: pg_recvlogical.c:239 #, c-format msgid "starting log streaming at %X/%X (slot %s)" msgstr "iniciando el flujo de log en %X/%X (slot %s)" -#: pg_recvlogical.c:269 +#: pg_recvlogical.c:281 #, c-format msgid "streaming initiated" msgstr "flujo iniciado" -#: pg_recvlogical.c:333 +#: pg_recvlogical.c:346 #, c-format msgid "could not open log file \"%s\": %m" msgstr "no se pudo abrir el archivo de registro «%s»: %m" -#: pg_recvlogical.c:362 receivelog.c:882 +#: pg_recvlogical.c:375 receivelog.c:882 #, c-format msgid "invalid socket: %s" msgstr "el socket no es válido: %s" -#: pg_recvlogical.c:415 receivelog.c:910 +#: pg_recvlogical.c:428 receivelog.c:910 #, c-format msgid "%s() failed: %m" msgstr "%s() falló: %m" -#: pg_recvlogical.c:422 receivelog.c:959 +#: pg_recvlogical.c:435 receivelog.c:959 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "no se pudo recibir datos desde el flujo de WAL: %s" -#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003 +#: pg_recvlogical.c:477 pg_recvlogical.c:528 receivelog.c:1003 #: receivelog.c:1066 #, c-format msgid "streaming header too small: %d" msgstr "cabecera de flujo demasiado pequeña: %d" -#: pg_recvlogical.c:499 receivelog.c:843 +#: pg_recvlogical.c:512 receivelog.c:843 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "cabecera de flujo no reconocida: «%c»" -#: pg_recvlogical.c:553 pg_recvlogical.c:565 +#: pg_recvlogical.c:566 pg_recvlogical.c:578 #, c-format msgid "could not write %d bytes to log file \"%s\": %m" msgstr "no se pudo escribir %d bytes al archivo de registro «%s»: %m" -#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679 +#: pg_recvlogical.c:636 receivelog.c:642 receivelog.c:679 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "término inesperado del flujo de replicación: %s" -#: pg_recvlogical.c:778 +#: pg_recvlogical.c:796 #, c-format msgid "could not parse start position \"%s\"" msgstr "no se pudo interpretar la posición de inicio «%s»" -#: pg_recvlogical.c:856 +#: pg_recvlogical.c:874 #, c-format msgid "no slot specified" msgstr "no se especificó slot" -#: pg_recvlogical.c:863 +#: pg_recvlogical.c:881 #, c-format msgid "no target file specified" msgstr "no se especificó un archivo de destino" -#: pg_recvlogical.c:870 +#: pg_recvlogical.c:888 #, c-format msgid "no database specified" msgstr "no se especificó una base de datos" -#: pg_recvlogical.c:877 +#: pg_recvlogical.c:895 #, c-format msgid "at least one action needs to be specified" msgstr "debe especificarse al menos una operación" -#: pg_recvlogical.c:884 +#: pg_recvlogical.c:902 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "no puede usarse --create-slot o --start junto con --drop-slot" -#: pg_recvlogical.c:891 +#: pg_recvlogical.c:909 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "no puede usarse --create-slot o --drop-slot junto con --startpos" -#: pg_recvlogical.c:898 +#: pg_recvlogical.c:916 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos sólo se puede utilizar con --start" -#: pg_recvlogical.c:905 +#: pg_recvlogical.c:923 #, c-format msgid "--two-phase may only be specified with --create-slot" msgstr "--two-phase sólo se puede utilizar con --create-slot" -#: pg_recvlogical.c:938 +#: pg_recvlogical.c:956 #, c-format msgid "could not establish database-specific replication connection" msgstr "no se pudo establecer una conexión de replicación específica a una base de datos" -#: pg_recvlogical.c:1032 +#: pg_recvlogical.c:1056 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "ubicación de término %X/%X alcanzado por «keep-alive»" -#: pg_recvlogical.c:1035 +#: pg_recvlogical.c:1061 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "ubicación de término %X/%X alcanzado por registro WAL en %X/%X" @@ -1667,7 +2465,7 @@ msgstr "respuesta inesperada después del fin-de-timeline: se obtuvieron %d fila msgid "could not parse next timeline's starting point \"%s\"" msgstr "no se pudo interpretar el punto de inicio del siguiente timeline «%s»" -#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201 +#: receivelog.c:775 receivelog.c:1022 walmethods.c:1206 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "no se pudo sincronizar (fsync) archivo «%s»: %s" @@ -1692,120 +2490,121 @@ msgstr "no se pudo escribir %d bytes al archivo WAL «%s»: %s" msgid "could not send copy-end packet: %s" msgstr "no se pudo enviar el paquete copy-end: %s" -#: streamutil.c:158 +#: streamutil.c:165 msgid "Password: " msgstr "Contraseña: " -#: streamutil.c:181 +#: streamutil.c:192 #, c-format msgid "could not connect to server" msgstr "no se pudo conectar al servidor" -#: streamutil.c:222 +#: streamutil.c:233 #, c-format -msgid "could not clear search_path: %s" -msgstr "no se pudo limpiar search_path: %s" +msgid "could not clear \"search_path\": %s" +msgstr "no se pudo limpiar «search_path»: %s" -#: streamutil.c:238 +#: streamutil.c:249 #, c-format -msgid "could not determine server setting for integer_datetimes" -msgstr "no se pudo determinar la opción integer_datetimes del servidor" +msgid "could not determine server setting for \"integer_datetimes\"" +msgstr "no se pudo determinar la opción «integer_datetimes» del servidor" -#: streamutil.c:245 +#: streamutil.c:256 #, c-format -msgid "integer_datetimes compile flag does not match server" -msgstr "la opción de compilación integer_datetimes no coincide con el servidor" +msgid "\"integer_datetimes\" compile flag does not match server" +msgstr "la opción de compilación «integer_datetimes» no coincide con el servidor" -#: streamutil.c:296 +#: streamutil.c:375 #, c-format msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "no se pudo obtener el tamaño del segmento de WAL: se obtuvo %d filas y %d campos, se esperaban %d filas y %d o más campos" -#: streamutil.c:306 +#: streamutil.c:385 #, c-format msgid "WAL segment size could not be parsed" msgstr "el tamaño de segmento de WAL no pudo ser analizado" -#: streamutil.c:324 +#: streamutil.c:403 +#, c-format +msgid "remote server reported invalid WAL segment size (%d byte)" +msgid_plural "remote server reported invalid WAL segment size (%d bytes)" +msgstr[0] "el servidor remoto reportó un tamaño de segmento de WAL no válido (%d byte)" +msgstr[1] "el servidor remoto reportó un tamaño de segmento de WAL no válido (%d bytes)" + +#: streamutil.c:407 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes" -msgstr[0] "el tamaño de segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el servidor remoto reportó un valor de %d byte" -msgstr[1] "el tamaño de segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el servidor remoto reportó un valor de %d bytes" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "El tamaño de segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB." -#: streamutil.c:369 +#: streamutil.c:449 #, c-format msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "no se pudo obtener el indicador de acceso de grupo: se obtuvo %d filas y %d campos, se esperaban %d filas y %d o más campos" -#: streamutil.c:378 +#: streamutil.c:458 #, c-format msgid "group access flag could not be parsed: %s" msgstr "el indicador de acceso de grupo no pudo ser analizado: %s" -#: streamutil.c:421 streamutil.c:458 +#: streamutil.c:501 streamutil.c:538 #, c-format msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "no se pudo identificar al sistema: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d o más campos" -#: streamutil.c:510 +#: streamutil.c:590 #, c-format msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "no se pudo leer el slot de replicación «%s»: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos" -#: streamutil.c:522 +#: streamutil.c:602 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "no existe el slot de replicación «%s»" -#: streamutil.c:533 +#: streamutil.c:613 #, c-format msgid "expected a physical replication slot, got type \"%s\" instead" msgstr "se esperaba un slot de replicación físico, en cambio se obtuvo tipo «%s»" -#: streamutil.c:547 +#: streamutil.c:627 #, c-format msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" msgstr "no se pudo interpretar restart_lsn de WAL «%s» para el slot de replicación «%s»" -#: streamutil.c:664 +#: streamutil.c:744 #, c-format msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "no se pudo create el slot de replicación «%s»: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos" -#: streamutil.c:708 +#: streamutil.c:788 #, c-format msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "no se pudo eliminar el slot de replicación «%s»: se obtuvieron %d filas y %d campos, se esperaban %d filas y %d campos" -#: walmethods.c:721 walmethods.c:1264 +#: walmethods.c:726 walmethods.c:1269 msgid "could not compress data" msgstr "no se pudo comprimir datos" -#: walmethods.c:750 +#: walmethods.c:755 msgid "could not reset compression stream" msgstr "no se pudo restablecer el flujo comprimido" -#: walmethods.c:888 +#: walmethods.c:892 msgid "implementation error: tar files can't have more than one open file" msgstr "error de implementación: los archivos tar no pueden tener abierto más de un fichero" -#: walmethods.c:903 +#: walmethods.c:907 msgid "could not create tar header" msgstr "no se pudo crear la cabecera del archivo tar" -#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179 +#: walmethods.c:924 walmethods.c:965 walmethods.c:1171 walmethods.c:1184 msgid "could not change compression parameters" msgstr "no se pudo cambiar los parámetros de compresión" -#: walmethods.c:1052 +#: walmethods.c:1056 msgid "unlink not supported with compression" msgstr "unlink no soportado con compresión" -#: walmethods.c:1288 +#: walmethods.c:1293 msgid "could not close compression stream" msgstr "no se pudo cerrar el flujo comprimido" - -#, c-format -#~ msgid "could not set compression flag for %s: %s" -#~ msgstr "no se pudo definir una opción de compresión para %s: %s" diff --git a/src/bin/pg_basebackup/po/fr.po b/src/bin/pg_basebackup/po/fr.po index f8be071f07135..ae370d26a6cae 100644 --- a/src/bin/pg_basebackup/po/fr.po +++ b/src/bin/pg_basebackup/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-26 08:18+0000\n" -"PO-Revision-Date: 2022-09-26 14:09+0200\n" +"POT-Creation-Date: 2024-08-26 19:50+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.1.1\n" +"X-Generator: Poedit 3.5\n" #: ../../../src/common/logging.c:276 #, c-format @@ -41,90 +41,191 @@ msgstr "détail : " msgid "hint: " msgstr "astuce : " -#: ../../common/compression.c:130 ../../common/compression.c:139 -#: ../../common/compression.c:148 +#: ../../common/compression.c:132 ../../common/compression.c:141 +#: ../../common/compression.c:150 bbstreamer_gzip.c:116 bbstreamer_gzip.c:249 +#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298 bbstreamer_zstd.c:129 +#: bbstreamer_zstd.c:284 #, c-format msgid "this build does not support compression with %s" msgstr "cette construction ne supporte pas la compression avec %s" -#: ../../common/compression.c:203 +#: ../../common/compression.c:205 msgid "found empty string where a compression option was expected" msgstr "a trouvé une chaîne vide alors qu'une option de compression était attendue" -#: ../../common/compression.c:237 +#: ../../common/compression.c:244 #, c-format msgid "unrecognized compression option: \"%s\"" msgstr "option de compression inconnue : « %s »" -#: ../../common/compression.c:276 +#: ../../common/compression.c:283 #, c-format msgid "compression option \"%s\" requires a value" msgstr "l'option de compression « %s » requiert une valeur" -#: ../../common/compression.c:285 +#: ../../common/compression.c:292 #, c-format msgid "value for compression option \"%s\" must be an integer" msgstr "la valeur pour l'option de compression « %s » doit être un entier" -#: ../../common/compression.c:335 +#: ../../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "la valeur pour l'option de compression « %s » doit être un booléen" + +#: ../../common/compression.c:379 #, c-format msgid "compression algorithm \"%s\" does not accept a compression level" msgstr "l'algorithme de compression « %s » n'accepte pas un niveau de compression" -#: ../../common/compression.c:342 +#: ../../common/compression.c:386 #, c-format msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" msgstr "l'algorithme de compression « %s » attend un niveau de compression compris entre %d et %d (par défaut à %d)" -#: ../../common/compression.c:353 +#: ../../common/compression.c:397 #, c-format msgid "compression algorithm \"%s\" does not accept a worker count" msgstr "l'algorithme de compression « %s » n'accepte pas un nombre de workers" +#: ../../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "l'algorithme de compression « %s » n'accepte pas un mode distance longue" + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" + +#: ../../common/controldata_utils.c:110 pg_basebackup.c:1873 +#: pg_receivewal.c:402 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "n'a pas pu lire le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: bbstreamer_file.c:138 pg_recvlogical.c:650 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "n'a pas pu fermer le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "différence de l'ordre des octets" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"possible incohérence dans l'ordre des octets\n" +"L'ordre des octets utilisé pour enregistrer le fichier pg_control peut ne\n" +"pas correspondre à celui utilisé par ce programme. Dans ce cas, les\n" +"résultats ci-dessous sont incorrects, et l'installation de PostgreSQL\n" +"est incompatible avec ce répertoire des données." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: pg_basebackup.c:1846 pg_receivewal.c:386 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "impossible d'écrire le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 pg_recvlogical.c:204 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "mémoire épuisée\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 -#: pg_receivewal.c:380 pg_recvlogical.c:341 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_receivewal.c:319 pg_recvlogical.c:352 #, c-format msgid "could not stat file \"%s\": %m" msgstr "n'a pas pu tester le fichier « %s » : %m" -#: ../../common/file_utils.c:166 pg_receivewal.c:303 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "cette construction ne supporte pas la méthode de synchronisation « %s »" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_receivewal.c:242 #, c-format msgid "could not open directory \"%s\": %m" msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" -#: ../../common/file_utils.c:200 pg_receivewal.c:532 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_receivewal.c:471 #, c-format msgid "could not read directory \"%s\": %m" msgstr "n'a pas pu lire le répertoire « %s » : %m" -#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 -#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121 -#: pg_receivewal.c:447 +#: ../../common/file_utils.c:498 pg_basebackup.c:2344 walmethods.c:462 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "n'a pas pu ouvrir le fichier « %s » : %m" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" -#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 -#: pg_recvlogical.c:196 +#: ../../common/restricted_token.c:60 #, c-format -msgid "could not fsync file \"%s\": %m" -msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" +msgid "could not open process token: error code %lu" +msgstr "n'a pas pu ouvrir le jeton du processus : code d'erreur %lu" -#: ../../common/file_utils.c:383 pg_basebackup.c:2256 walmethods.c:459 +#: ../../common/restricted_token.c:74 #, c-format -msgid "could not rename file \"%s\" to \"%s\": %m" -msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" +msgid "could not allocate SIDs: error code %lu" +msgstr "n'a pas pu allouer les SID : code d'erreur %lu" + +#: ../../common/restricted_token.c:94 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "n'a pas pu créer le jeton restreint : code d'erreur %lu" + +#: ../../common/restricted_token.c:115 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu" + +#: ../../common/restricted_token.c:153 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu" #: ../../fe_utils/option_utils.c:69 #, c-format @@ -136,51 +237,62 @@ msgstr "valeur « %s » invalide pour l'option %s" msgid "%s must be in range %d..%d" msgstr "%s doit être compris entre %d et %d" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1636 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "méthode de synchronisation non reconnu : %s" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 pg_basebackup.c:1636 streamutil.c:331 #, c-format msgid "out of memory" msgstr "mémoire épuisée" -#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121 +#: ../../fe_utils/recovery_gen.c:143 bbstreamer_file.c:121 #: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727 #, c-format msgid "could not write to file \"%s\": %m" msgstr "n'a pas pu écrire dans le fichier « %s » : %m" -#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339 +#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:361 #: pg_basebackup.c:1497 pg_basebackup.c:1706 #, c-format msgid "could not create file \"%s\": %m" msgstr "n'a pas pu créer le fichier « %s » : %m" -#: bbstreamer_file.c:138 pg_recvlogical.c:635 +#: ../../fe_utils/string_utils.c:434 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "n'a pas pu fermer le fichier « %s » : %m" +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "l'argument de la commande shell contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "le nom de la base contient un retour à la ligne ou un retour chariot : « %s »\n" #: bbstreamer_file.c:275 #, c-format msgid "unexpected state while extracting archive" msgstr "état inattendu lors de l'extraction de l'archive" -#: bbstreamer_file.c:298 pg_basebackup.c:686 pg_basebackup.c:730 +#: bbstreamer_file.c:321 pg_basebackup.c:698 pg_basebackup.c:712 +#: pg_basebackup.c:757 #, c-format msgid "could not create directory \"%s\": %m" msgstr "n'a pas pu créer le répertoire « %s » : %m" -#: bbstreamer_file.c:304 +#: bbstreamer_file.c:326 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "n'a pas pu configurer les droits du répertoire « %s » : %m" -#: bbstreamer_file.c:323 +#: bbstreamer_file.c:345 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "n'a pas pu créer le lien symbolique de « %s » vers « %s » : %m" -#: bbstreamer_file.c:343 +#: bbstreamer_file.c:365 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "n'a pas pu initialiser les droits du fichier « %s » : %m" @@ -205,11 +317,6 @@ msgstr "n'a pas pu ouvrir le fichier de sauvegarde : %m" msgid "could not set compression level %d: %s" msgstr "n'a pas pu configurer le niveau de compression %d : %s" -#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249 -#, c-format -msgid "this build does not support gzip compression" -msgstr "cette construction ne supporte pas la compression gzip" - #: bbstreamer_gzip.c:143 #, c-format msgid "could not write to compressed file \"%s\": %s" @@ -220,12 +327,12 @@ msgstr "n'a pas pu écrire dans le fichier compressé « %s » : %s" msgid "could not close compressed file \"%s\": %m" msgstr "n'a pas pu fermer le fichier compressé « %s » : %m" -#: bbstreamer_gzip.c:245 walmethods.c:869 +#: bbstreamer_gzip.c:245 walmethods.c:880 #, c-format msgid "could not initialize compression library" msgstr "n'a pas pu initialiser la bibliothèque de compression" -#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316 +#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329 #, c-format msgid "could not decompress data: %s" msgstr "n'a pas pu décompresser les données : %s" @@ -240,17 +347,12 @@ msgstr "état inattendu lors de l'injection des paramètres de restauration" msgid "could not create lz4 compression context: %s" msgstr "n'a pas pu créer le contexte de compression lz4 : %s" -#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298 -#, c-format -msgid "this build does not support lz4 compression" -msgstr "cette construction ne supporte pas la compression lz4" - #: bbstreamer_lz4.c:140 #, c-format msgid "could not write lz4 header: %s" msgstr "n'a pas pu écrire l'entête lz4 : %s" -#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210 +#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223 #, c-format msgid "could not compress data: %s" msgstr "n'a pas pu compresser les données : %s" @@ -275,12 +377,12 @@ msgstr "la fin du fichier tar fait plus de 2 blocs" msgid "unexpected state while parsing tar archive" msgstr "état inattendu lors de l'analyse de l'archive tar" -#: bbstreamer_tar.c:296 +#: bbstreamer_tar.c:292 #, c-format msgid "tar member has empty name" msgstr "le membre de tar a un nom vide" -#: bbstreamer_tar.c:328 +#: bbstreamer_tar.c:326 #, c-format msgid "COPY stream ended before last file was finished" msgstr "le flux COPY s'est terminé avant que le dernier fichier soit terminé" @@ -300,97 +402,97 @@ msgstr "n'a pas pu configurer le niveau de compression zstd à %d : %s" msgid "could not set compression worker count to %d: %s" msgstr "n'a pas pu configurer le nombre de workers de compression à %d : %s" -#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271 +#: bbstreamer_zstd.c:116 #, c-format -msgid "this build does not support zstd compression" -msgstr "cette construction ne supporte pas la compression zstd" +msgid "could not enable long-distance mode: %s" +msgstr "n'a pas pu activer le mode distance longue : %s" -#: bbstreamer_zstd.c:262 +#: bbstreamer_zstd.c:275 #, c-format msgid "could not create zstd decompression context" msgstr "n'a pas pu créer le contexte de décompression zstd" -#: pg_basebackup.c:240 +#: pg_basebackup.c:245 #, c-format msgid "removing data directory \"%s\"" msgstr "suppression du répertoire des données « %s »" -#: pg_basebackup.c:242 +#: pg_basebackup.c:247 #, c-format msgid "failed to remove data directory" msgstr "échec de la suppression du répertoire des données" -#: pg_basebackup.c:246 +#: pg_basebackup.c:251 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "suppression du contenu du répertoire des données « %s »" -#: pg_basebackup.c:248 +#: pg_basebackup.c:253 #, c-format msgid "failed to remove contents of data directory" msgstr "échec de la suppression du contenu du répertoire des données" -#: pg_basebackup.c:253 +#: pg_basebackup.c:258 #, c-format msgid "removing WAL directory \"%s\"" msgstr "suppression du répertoire des journaux de transactions « %s »" -#: pg_basebackup.c:255 +#: pg_basebackup.c:260 #, c-format msgid "failed to remove WAL directory" msgstr "échec de la suppression du répertoire des journaux de transactions" -#: pg_basebackup.c:259 +#: pg_basebackup.c:264 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "suppression du contenu du répertoire des journaux de transactions « %s »" -#: pg_basebackup.c:261 +#: pg_basebackup.c:266 #, c-format msgid "failed to remove contents of WAL directory" msgstr "échec de la suppression du contenu du répertoire des journaux de transactions" -#: pg_basebackup.c:267 +#: pg_basebackup.c:272 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "répertoire des données « %s » non supprimé à la demande de l'utilisateur" -#: pg_basebackup.c:270 +#: pg_basebackup.c:275 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "répertoire des journaux de transactions « %s » non supprimé à la demande de l'utilisateur" -#: pg_basebackup.c:274 +#: pg_basebackup.c:279 #, c-format msgid "changes to tablespace directories will not be undone" msgstr "les modifications des répertoires des tablespaces ne seront pas annulées" -#: pg_basebackup.c:326 +#: pg_basebackup.c:331 #, c-format msgid "directory name too long" msgstr "nom du répertoire trop long" -#: pg_basebackup.c:333 +#: pg_basebackup.c:338 #, c-format msgid "multiple \"=\" signs in tablespace mapping" msgstr "multiple signes « = » dans la correspondance de tablespace" -#: pg_basebackup.c:342 +#: pg_basebackup.c:347 #, c-format msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "format de correspondance de tablespace « %s » invalide, doit être « ANCIENREPERTOIRE=NOUVEAUREPERTOIRE »" -#: pg_basebackup.c:351 +#: pg_basebackup.c:366 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "l'ancien répertoire n'est pas un chemin absolu dans la correspondance de tablespace : %s" -#: pg_basebackup.c:355 +#: pg_basebackup.c:370 #, c-format msgid "new directory is not an absolute path in tablespace mapping: %s" msgstr "le nouveau répertoire n'est pas un chemin absolu dans la correspondance de tablespace : %s" -#: pg_basebackup.c:377 +#: pg_basebackup.c:392 #, c-format msgid "" "%s takes a base backup of a running PostgreSQL server.\n" @@ -400,17 +502,19 @@ msgstr "" "d'exécution.\n" "\n" -#: pg_basebackup.c:379 pg_receivewal.c:81 pg_recvlogical.c:78 +#: pg_basebackup.c:394 pg_createsubscriber.c:221 pg_receivewal.c:79 +#: pg_recvlogical.c:86 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_basebackup.c:380 pg_receivewal.c:82 pg_recvlogical.c:79 +#: pg_basebackup.c:395 pg_createsubscriber.c:222 pg_receivewal.c:80 +#: pg_recvlogical.c:87 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_basebackup.c:381 +#: pg_basebackup.c:396 #, c-format msgid "" "\n" @@ -419,17 +523,26 @@ msgstr "" "\n" "Options contrôlant la sortie :\n" -#: pg_basebackup.c:382 +#: pg_basebackup.c:397 #, c-format msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n" msgstr " -D, --pgdata=RÉPERTOIRE reçoit la sauvegarde de base dans ce répertoire\n" -#: pg_basebackup.c:383 +#: pg_basebackup.c:398 #, c-format msgid " -F, --format=p|t output format (plain (default), tar)\n" msgstr " -F, --format=p|t format en sortie (plain (par défaut), tar)\n" -#: pg_basebackup.c:384 +#: pg_basebackup.c:399 +#, c-format +msgid "" +" -i, --incremental=OLDMANIFEST\n" +" take incremental backup\n" +msgstr "" +" -i, --incremental=ANCIENMANIFESTE\n" +" réalise une sauvegarde incrémentale\n" + +#: pg_basebackup.c:401 #, c-format msgid "" " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" @@ -439,21 +552,21 @@ msgstr "" " données (en Ko/s, ou utiliser le suffixe « k »\n" " ou « M »)\n" -#: pg_basebackup.c:386 +#: pg_basebackup.c:403 #, c-format msgid "" " -R, --write-recovery-conf\n" " write configuration for replication\n" msgstr " -R, --write-recovery-conf écrit la configuration pour la réplication\n" -#: pg_basebackup.c:388 +#: pg_basebackup.c:405 #, c-format msgid "" " -t, --target=TARGET[:DETAIL]\n" " backup target (if other than client)\n" msgstr " -t, --target=CIBLE[:DETAIL] cible de sauvegarde (si autre que client)\n" -#: pg_basebackup.c:390 +#: pg_basebackup.c:407 #, c-format msgid "" " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" @@ -462,14 +575,14 @@ msgstr "" " -T, --tablespace-mapping=ANCIENREP=NOUVEAUREP\n" " déplace le répertoire ANCIENREP en NOUVEAUREP\n" -#: pg_basebackup.c:392 +#: pg_basebackup.c:409 #, c-format msgid " --waldir=WALDIR location for the write-ahead log directory\n" msgstr "" " --waldir=RÉP_WAL emplacement du répertoire des journaux de\n" " transactions\n" -#: pg_basebackup.c:393 +#: pg_basebackup.c:410 #, c-format msgid "" " -X, --wal-method=none|fetch|stream\n" @@ -479,12 +592,12 @@ msgstr "" " inclut les journaux de transactions requis avec\n" " la méthode spécifiée\n" -#: pg_basebackup.c:395 +#: pg_basebackup.c:412 #, c-format msgid " -z, --gzip compress tar output\n" msgstr " -z, --gzip compresse la sortie tar\n" -#: pg_basebackup.c:396 +#: pg_basebackup.c:413 #, c-format msgid "" " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" @@ -493,12 +606,12 @@ msgstr "" " -Z, --compress=[{client|server}-]METHODE[:DETAIL]\n" " compresse sur le client ou le serveur comme indiqué\n" -#: pg_basebackup.c:398 +#: pg_basebackup.c:415 #, c-format msgid " -Z, --compress=none do not compress tar output\n" msgstr " -Z, --compress=none ne compresse pas la sortie tar\n" -#: pg_basebackup.c:399 +#: pg_basebackup.c:416 #, c-format msgid "" "\n" @@ -507,56 +620,56 @@ msgstr "" "\n" "Options générales :\n" -#: pg_basebackup.c:400 +#: pg_basebackup.c:417 #, c-format msgid "" " -c, --checkpoint=fast|spread\n" -" set fast or spread checkpointing\n" -msgstr " -c, --checkpoint=fast|spread exécute un CHECKPOINT rapide ou réparti\n" +" set fast or spread (default) checkpointing\n" +msgstr " -c, --checkpoint=fast|spread exécute un CHECKPOINT rapide ou réparti (par défaut)\n" -#: pg_basebackup.c:402 +#: pg_basebackup.c:419 #, c-format msgid " -C, --create-slot create replication slot\n" msgstr " --create-slot crée un slot de réplication\n" -#: pg_basebackup.c:403 +#: pg_basebackup.c:420 #, c-format msgid " -l, --label=LABEL set backup label\n" msgstr " -l, --label=LABEL configure le label de sauvegarde\n" -#: pg_basebackup.c:404 +#: pg_basebackup.c:421 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean ne nettoie pas en cas d'erreur\n" -#: pg_basebackup.c:405 +#: pg_basebackup.c:422 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " -N, --no-sync n'attend pas que les modifications soient\n" " proprement écrites sur disque\n" -#: pg_basebackup.c:406 +#: pg_basebackup.c:423 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress affiche la progression de la sauvegarde\n" -#: pg_basebackup.c:407 pg_receivewal.c:91 +#: pg_basebackup.c:424 pg_receivewal.c:89 #, c-format msgid " -S, --slot=SLOTNAME replication slot to use\n" msgstr " -S, --slot=NOMREP slot de réplication à utiliser\n" -#: pg_basebackup.c:408 pg_receivewal.c:93 pg_recvlogical.c:100 +#: pg_basebackup.c:425 pg_receivewal.c:91 pg_recvlogical.c:108 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose affiche des messages verbeux\n" -#: pg_basebackup.c:409 pg_receivewal.c:94 pg_recvlogical.c:101 +#: pg_basebackup.c:426 pg_receivewal.c:92 pg_recvlogical.c:109 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: pg_basebackup.c:410 +#: pg_basebackup.c:427 #, c-format msgid "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" @@ -566,7 +679,7 @@ msgstr "" " utilise cet algorithme pour les sommes de\n" " contrôle du manifeste\n" -#: pg_basebackup.c:412 +#: pg_basebackup.c:429 #, c-format msgid "" " --manifest-force-encode\n" @@ -575,40 +688,47 @@ msgstr "" " --manifest-force-encode encode tous les noms de fichier dans le\n" " manifeste en hexadécimal\n" -#: pg_basebackup.c:414 +#: pg_basebackup.c:431 #, c-format msgid " --no-estimate-size do not estimate backup size in server side\n" msgstr "" " --no-estimate-size ne réalise pas d'estimation sur la taille de la\n" " sauvegarde côté serveur\n" -#: pg_basebackup.c:415 +#: pg_basebackup.c:432 #, c-format msgid " --no-manifest suppress generation of backup manifest\n" msgstr "" " --no-manifest supprime la génération de manifeste de\n" " sauvegarde\n" -#: pg_basebackup.c:416 +#: pg_basebackup.c:433 #, c-format msgid " --no-slot prevent creation of temporary replication slot\n" msgstr "" " --no-slot empêche la création de slots de réplication\n" " temporaires\n" -#: pg_basebackup.c:417 +#: pg_basebackup.c:434 #, c-format msgid "" " --no-verify-checksums\n" " do not verify checksums\n" msgstr " --no-verify-checksums ne vérifie pas les sommes de contrôle\n" -#: pg_basebackup.c:419 pg_receivewal.c:97 pg_recvlogical.c:102 +#: pg_basebackup.c:436 +#, c-format +msgid "" +" --sync-method=METHOD\n" +" set method for syncing files to disk\n" +msgstr " --sync-method=METHODE configure la méthode pour synchroniser les fichiers sur disque\n" + +#: pg_basebackup.c:438 pg_receivewal.c:95 pg_recvlogical.c:110 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_basebackup.c:420 pg_receivewal.c:98 pg_recvlogical.c:103 +#: pg_basebackup.c:439 pg_receivewal.c:96 pg_recvlogical.c:111 #, c-format msgid "" "\n" @@ -617,24 +737,24 @@ msgstr "" "\n" "Options de connexion :\n" -#: pg_basebackup.c:421 pg_receivewal.c:99 +#: pg_basebackup.c:440 pg_receivewal.c:97 #, c-format msgid " -d, --dbname=CONNSTR connection string\n" msgstr " -d, --dbname=CHAÃŽNE_CONNEX chaîne de connexion\n" -#: pg_basebackup.c:422 pg_receivewal.c:100 pg_recvlogical.c:105 +#: pg_basebackup.c:441 pg_receivewal.c:98 pg_recvlogical.c:113 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HÔTE hôte du serveur de bases de données ou\n" " répertoire des sockets\n" -#: pg_basebackup.c:423 pg_receivewal.c:101 pg_recvlogical.c:106 +#: pg_basebackup.c:442 pg_receivewal.c:99 pg_recvlogical.c:114 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT numéro de port du serveur de bases de données\n" -#: pg_basebackup.c:424 +#: pg_basebackup.c:443 #, c-format msgid "" " -s, --status-interval=INTERVAL\n" @@ -643,24 +763,25 @@ msgstr "" " -s, --status-interval=INTERVAL durée entre l'envoi de paquets de statut au\n" " serveur (en secondes)\n" -#: pg_basebackup.c:426 pg_receivewal.c:102 pg_recvlogical.c:107 +#: pg_basebackup.c:445 pg_receivewal.c:100 pg_recvlogical.c:115 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=UTILISATEUR se connecte avec cet utilisateur\n" -#: pg_basebackup.c:427 pg_receivewal.c:103 pg_recvlogical.c:108 +#: pg_basebackup.c:446 pg_receivewal.c:101 pg_recvlogical.c:116 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ne demande jamais le mot de passe\n" -#: pg_basebackup.c:428 pg_receivewal.c:104 pg_recvlogical.c:109 +#: pg_basebackup.c:447 pg_receivewal.c:102 pg_recvlogical.c:117 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" " -W, --password force la demande du mot de passe (devrait\n" " survenir automatiquement)\n" -#: pg_basebackup.c:429 pg_receivewal.c:108 pg_recvlogical.c:110 +#: pg_basebackup.c:448 pg_createsubscriber.c:240 pg_receivewal.c:106 +#: pg_recvlogical.c:118 #, c-format msgid "" "\n" @@ -669,160 +790,161 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_basebackup.c:430 pg_receivewal.c:109 pg_recvlogical.c:111 +#: pg_basebackup.c:449 pg_createsubscriber.c:241 pg_receivewal.c:107 +#: pg_recvlogical.c:119 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" -#: pg_basebackup.c:472 +#: pg_basebackup.c:488 #, c-format msgid "could not read from ready pipe: %m" msgstr "n'a pas pu lire à partir du tube : %m" -#: pg_basebackup.c:475 pg_basebackup.c:622 pg_basebackup.c:2170 -#: streamutil.c:444 +#: pg_basebackup.c:491 pg_basebackup.c:633 pg_basebackup.c:2258 +#: streamutil.c:518 #, c-format msgid "could not parse write-ahead log location \"%s\"" msgstr "n'a pas pu analyser l'emplacement du journal des transactions « %s »" -#: pg_basebackup.c:581 pg_receivewal.c:663 +#: pg_basebackup.c:596 pg_receivewal.c:600 #, c-format msgid "could not finish writing WAL files: %m" msgstr "n'a pas pu finir l'écriture dans les fichiers de transactions : %m" -#: pg_basebackup.c:631 +#: pg_basebackup.c:642 #, c-format msgid "could not create pipe for background process: %m" msgstr "n'a pas pu créer un tube pour le processus en tâche de fond : %m" -#: pg_basebackup.c:664 +#: pg_basebackup.c:676 #, c-format msgid "created temporary replication slot \"%s\"" msgstr "a créé le slot de réplication temporaire « %s »" -#: pg_basebackup.c:667 +#: pg_basebackup.c:679 #, c-format msgid "created replication slot \"%s\"" msgstr "a créé le slot de réplication « %s »" -#: pg_basebackup.c:701 +#: pg_basebackup.c:728 #, c-format msgid "could not create background process: %m" msgstr "n'a pas pu créer un processus en tâche de fond : %m" -#: pg_basebackup.c:710 +#: pg_basebackup.c:737 #, c-format msgid "could not create background thread: %m" msgstr "n'a pas pu créer un thread en tâche de fond : %m" -#: pg_basebackup.c:749 +#: pg_basebackup.c:776 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "le répertoire « %s » existe mais n'est pas vide" -#: pg_basebackup.c:755 +#: pg_basebackup.c:782 pg_createsubscriber.c:390 #, c-format msgid "could not access directory \"%s\": %m" msgstr "n'a pas pu accéder au répertoire « %s » : %m" -#: pg_basebackup.c:832 +#: pg_basebackup.c:858 #, c-format msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" msgstr[0] "%*s/%s Ko (100%%), %d/%d tablespace %*s" msgstr[1] "%*s/%s Ko (100%%), %d/%d tablespaces %*s" -#: pg_basebackup.c:844 +#: pg_basebackup.c:870 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" msgstr[0] "%*s/%s Ko (%d%%), %d/%d tablespace (%s%-*.*s)" msgstr[1] "%*s/%s Ko (%d%%), %d/%d tablespaces (%s%-*.*s)" -#: pg_basebackup.c:860 +#: pg_basebackup.c:886 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" msgstr[0] "%*s/%s Ko (%d%%), %d/%d tablespace" msgstr[1] "%*s/%s Ko (%d%%), %d/%d tablespaces" -#: pg_basebackup.c:884 +#: pg_basebackup.c:910 #, c-format msgid "transfer rate \"%s\" is not a valid value" msgstr "le taux de transfert « %s » ne correspond pas à une valeur valide" -#: pg_basebackup.c:886 +#: pg_basebackup.c:912 #, c-format msgid "invalid transfer rate \"%s\": %m" msgstr "taux de transfert invalide (« %s ») : %m" -#: pg_basebackup.c:893 +#: pg_basebackup.c:919 #, c-format msgid "transfer rate must be greater than zero" msgstr "le taux de transfert doit être supérieur à zéro" -#: pg_basebackup.c:923 +#: pg_basebackup.c:949 #, c-format msgid "invalid --max-rate unit: \"%s\"" msgstr "unité invalide pour --max-rate : « %s »" -#: pg_basebackup.c:927 +#: pg_basebackup.c:953 #, c-format msgid "transfer rate \"%s\" exceeds integer range" msgstr "le taux de transfert « %s » dépasse l'échelle des entiers" -#: pg_basebackup.c:934 +#: pg_basebackup.c:960 #, c-format msgid "transfer rate \"%s\" is out of range" msgstr "le taux de transfert « %s » est en dehors des limites" -#: pg_basebackup.c:1030 +#: pg_basebackup.c:1022 #, c-format msgid "could not get COPY data stream: %s" msgstr "n'a pas pu obtenir le flux de données de COPY : %s" -#: pg_basebackup.c:1047 pg_recvlogical.c:438 pg_recvlogical.c:610 -#: receivelog.c:981 +#: pg_basebackup.c:1039 pg_recvlogical.c:449 pg_recvlogical.c:625 +#: receivelog.c:973 #, c-format msgid "could not read COPY data: %s" msgstr "n'a pas pu lire les données du COPY : %s" -#: pg_basebackup.c:1051 +#: pg_basebackup.c:1043 #, c-format msgid "background process terminated unexpectedly" msgstr "un processus worker s'est arrêté de façon inattendue" -#: pg_basebackup.c:1122 +#: pg_basebackup.c:1114 #, c-format msgid "cannot inject manifest into a compressed tar file" msgstr "ne peut pas injecter le manifeste dans un fichier tar compressé" -#: pg_basebackup.c:1123 +#: pg_basebackup.c:1115 #, c-format msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s." msgstr "Utilisez la compression côté client, envoyez la sortie dans un répertoire plutôt que sur la sortie standard, ou utilisez %s." -#: pg_basebackup.c:1139 +#: pg_basebackup.c:1131 #, c-format msgid "cannot parse archive \"%s\"" msgstr "n'a pas pu analyser l'archive « %s »" -#: pg_basebackup.c:1140 +#: pg_basebackup.c:1132 #, c-format msgid "Only tar archives can be parsed." msgstr "Seules les archives tar peuvent être analysées" -#: pg_basebackup.c:1142 +#: pg_basebackup.c:1134 #, c-format msgid "Plain format requires pg_basebackup to parse the archive." msgstr "Le format plain requiert que pg_basebackup analyse l'archive." -#: pg_basebackup.c:1144 +#: pg_basebackup.c:1136 #, c-format msgid "Using - as the output directory requires pg_basebackup to parse the archive." msgstr "Utiliser - comme répertoire de sortie requiert que pg_basebackup analyse l'archive." -#: pg_basebackup.c:1146 +#: pg_basebackup.c:1138 #, c-format msgid "The -R option requires pg_basebackup to parse the archive." msgstr "L'option -R requiert que pg_basebackup analyse l'archive." @@ -852,306 +974,364 @@ msgstr "message COPY vide" msgid "malformed COPY message of type %d, length %zu" msgstr "message COPY malformé de type %d, longueur %zu" -#: pg_basebackup.c:1787 +#: pg_basebackup.c:1789 #, c-format msgid "incompatible server version %s" msgstr "version « %s » du serveur incompatible" -#: pg_basebackup.c:1803 +#: pg_basebackup.c:1805 #, c-format msgid "Use -X none or -X fetch to disable log streaming." msgstr "Utilisez -X none ou -X fetch pour désactiver la réplication en flux." -#: pg_basebackup.c:1871 +#: pg_basebackup.c:1841 +#, c-format +msgid "server does not support incremental backup" +msgstr "le serveur n'accepte pas les sauvegardes incrémentales" + +#: pg_basebackup.c:1850 pg_basebackup.c:2008 pg_recvlogical.c:272 +#: receivelog.c:543 receivelog.c:582 streamutil.c:364 streamutil.c:438 +#: streamutil.c:490 streamutil.c:578 streamutil.c:730 streamutil.c:775 +#, c-format +msgid "could not send replication command \"%s\": %s" +msgstr "n'a pas pu envoyer la commande de réplication « %s » : %s" + +#: pg_basebackup.c:1856 pg_basebackup.c:1883 +#, c-format +msgid "could not upload manifest: %s" +msgstr "n'a pas pu charger le manifeste : %s" + +#: pg_basebackup.c:1859 pg_basebackup.c:1886 +#, c-format +msgid "could not upload manifest: unexpected status %s" +msgstr "n'a pas pu charger le manifeste : statut %s inattendu" + +#: pg_basebackup.c:1867 +#, c-format +msgid "could not send COPY data: %s" +msgstr "n'a pas pu envoyer les données COPY : %s" + +#: pg_basebackup.c:1877 +#, c-format +msgid "could not send end-of-COPY: %s" +msgstr "n'a pas pu envoyer end-of-COPY : %s" + +#: pg_basebackup.c:1892 +#, c-format +msgid "unexpected extra result while sending manifest" +msgstr "résultat supplémentaire inattendu lors de l'envoi du manifeste" + +#: pg_basebackup.c:1950 #, c-format msgid "backup targets are not supported by this server version" msgstr "les cibles de sauvegarde ne sont pas supportées par cette version du serveur" -#: pg_basebackup.c:1874 +#: pg_basebackup.c:1953 #, c-format msgid "recovery configuration cannot be written when a backup target is used" msgstr "la configuration de la restauration ne peut pas être écrite quand une cible de restauration est utilisée" -#: pg_basebackup.c:1901 +#: pg_basebackup.c:1980 #, c-format msgid "server does not support server-side compression" msgstr "le serveur ne supporte pas la compression côté serveur" -#: pg_basebackup.c:1911 +#: pg_basebackup.c:1990 #, c-format msgid "initiating base backup, waiting for checkpoint to complete" msgstr "début de la sauvegarde de base, en attente de la fin du checkpoint" -#: pg_basebackup.c:1915 +#: pg_basebackup.c:1994 #, c-format msgid "waiting for checkpoint" msgstr "en attente du checkpoint" -#: pg_basebackup.c:1928 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588 -#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504 -#: streamutil.c:656 streamutil.c:701 -#, c-format -msgid "could not send replication command \"%s\": %s" -msgstr "n'a pas pu envoyer la commande de réplication « %s » : %s" - -#: pg_basebackup.c:1936 +#: pg_basebackup.c:2016 #, c-format msgid "could not initiate base backup: %s" msgstr "n'a pas pu initier la sauvegarde de base : %s" -#: pg_basebackup.c:1939 +#: pg_basebackup.c:2019 #, c-format msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields" msgstr "le serveur a renvoyé une réponse inattendue à la commande BASE_BACKUP ; a récupéré %d lignes et %d champs, alors qu'il attendait %d lignes et %d champs" -#: pg_basebackup.c:1945 +#: pg_basebackup.c:2025 #, c-format msgid "checkpoint completed" msgstr "checkpoint terminé" -#: pg_basebackup.c:1960 +#: pg_basebackup.c:2039 #, c-format msgid "write-ahead log start point: %s on timeline %u" msgstr "point de départ du journal de transactions : %s sur la timeline %u" -#: pg_basebackup.c:1968 +#: pg_basebackup.c:2047 #, c-format msgid "could not get backup header: %s" msgstr "n'a pas pu obtenir l'en-tête du serveur : %s" -#: pg_basebackup.c:1971 +#: pg_basebackup.c:2050 #, c-format msgid "no data returned from server" msgstr "aucune donnée renvoyée du serveur" -#: pg_basebackup.c:2006 +#: pg_basebackup.c:2093 #, c-format msgid "can only write single tablespace to stdout, database has %d" msgstr "peut seulement écrire un tablespace sur la sortie standard, la base en a %d" -#: pg_basebackup.c:2019 +#: pg_basebackup.c:2106 #, c-format msgid "starting background WAL receiver" msgstr "lance le récepteur de journaux de transactions en tâche de fond" -#: pg_basebackup.c:2101 +#: pg_basebackup.c:2189 #, c-format msgid "backup failed: %s" msgstr "échec de la sauvegarde : %s" -#: pg_basebackup.c:2104 +#: pg_basebackup.c:2192 #, c-format msgid "no write-ahead log end position returned from server" msgstr "aucune position de fin du journal de transactions renvoyée par le serveur" -#: pg_basebackup.c:2107 +#: pg_basebackup.c:2195 #, c-format msgid "write-ahead log end point: %s" msgstr "point final du journal de transactions : %s" -#: pg_basebackup.c:2118 +#: pg_basebackup.c:2206 #, c-format msgid "checksum error occurred" msgstr "erreur de somme de contrôle" -#: pg_basebackup.c:2123 +#: pg_basebackup.c:2211 #, c-format msgid "final receive failed: %s" msgstr "échec lors de la réception finale : %s" -#: pg_basebackup.c:2147 +#: pg_basebackup.c:2235 #, c-format msgid "waiting for background process to finish streaming ..." msgstr "en attente que le processus en tâche de fond termine le flux..." -#: pg_basebackup.c:2151 +#: pg_basebackup.c:2239 #, c-format msgid "could not send command to background pipe: %m" msgstr "n'a pas pu envoyer la commande au tube du processus : %m" -#: pg_basebackup.c:2156 +#: pg_basebackup.c:2244 #, c-format msgid "could not wait for child process: %m" msgstr "n'a pas pu attendre le processus fils : %m" -#: pg_basebackup.c:2158 +#: pg_basebackup.c:2246 #, c-format msgid "child %d died, expected %d" msgstr "le fils %d est mort, %d attendu" -#: pg_basebackup.c:2160 streamutil.c:91 streamutil.c:197 +#: pg_basebackup.c:2248 streamutil.c:89 streamutil.c:204 streamutil.c:316 #, c-format msgid "%s" msgstr "%s" -#: pg_basebackup.c:2180 +#: pg_basebackup.c:2268 #, c-format msgid "could not wait for child thread: %m" msgstr "n'a pas pu attendre le thread : %m" -#: pg_basebackup.c:2185 +#: pg_basebackup.c:2273 #, c-format msgid "could not get child thread exit status: %m" msgstr "n'a pas pu obtenir le code de sortie du thread : %m" -#: pg_basebackup.c:2188 +#: pg_basebackup.c:2276 #, c-format msgid "child thread exited with error %u" msgstr "le thread a quitté avec le code d'erreur %u" -#: pg_basebackup.c:2217 +#: pg_basebackup.c:2305 #, c-format msgid "syncing data to disk ..." msgstr "synchronisation des données sur disque..." -#: pg_basebackup.c:2242 +#: pg_basebackup.c:2330 #, c-format msgid "renaming backup_manifest.tmp to backup_manifest" msgstr "renommage de backup_manifest.tmp en backup_manifest" -#: pg_basebackup.c:2262 +#: pg_basebackup.c:2350 #, c-format msgid "base backup completed" msgstr "sauvegarde de base terminée" -#: pg_basebackup.c:2351 +#: pg_basebackup.c:2436 +#, c-format +msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" +msgstr "argument « %s » invalide pour le CHECKPOINT, doit être soit « fast » soit « spread »" + +#: pg_basebackup.c:2454 #, c-format msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" msgstr "format de sortie « %s » invalide, doit être soit « plain » soit « tar »" -#: pg_basebackup.c:2395 +#: pg_basebackup.c:2535 #, c-format msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" msgstr "option wal-method « %s » invalide, doit être soit « fetch » soit « stream » soit « none »" -#: pg_basebackup.c:2425 -#, c-format -msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" -msgstr "argument « %s » invalide pour le CHECKPOINT, doit être soit « fast » soit « spread »" - -#: pg_basebackup.c:2476 pg_basebackup.c:2488 pg_basebackup.c:2510 -#: pg_basebackup.c:2522 pg_basebackup.c:2528 pg_basebackup.c:2580 -#: pg_basebackup.c:2591 pg_basebackup.c:2601 pg_basebackup.c:2607 -#: pg_basebackup.c:2614 pg_basebackup.c:2626 pg_basebackup.c:2638 -#: pg_basebackup.c:2646 pg_basebackup.c:2659 pg_basebackup.c:2665 -#: pg_basebackup.c:2674 pg_basebackup.c:2686 pg_basebackup.c:2697 -#: pg_basebackup.c:2705 pg_receivewal.c:814 pg_receivewal.c:826 -#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849 -#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849 -#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873 -#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894 -#: pg_recvlogical.c:901 pg_recvlogical.c:908 +#: pg_basebackup.c:2574 pg_basebackup.c:2586 pg_basebackup.c:2608 +#: pg_basebackup.c:2620 pg_basebackup.c:2626 pg_basebackup.c:2678 +#: pg_basebackup.c:2689 pg_basebackup.c:2699 pg_basebackup.c:2705 +#: pg_basebackup.c:2712 pg_basebackup.c:2724 pg_basebackup.c:2736 +#: pg_basebackup.c:2744 pg_basebackup.c:2757 pg_basebackup.c:2763 +#: pg_basebackup.c:2772 pg_basebackup.c:2784 pg_basebackup.c:2795 +#: pg_basebackup.c:2803 pg_createsubscriber.c:2037 pg_createsubscriber.c:2047 +#: pg_createsubscriber.c:2055 pg_createsubscriber.c:2083 +#: pg_createsubscriber.c:2115 pg_receivewal.c:748 pg_receivewal.c:760 +#: pg_receivewal.c:767 pg_receivewal.c:776 pg_receivewal.c:783 +#: pg_receivewal.c:793 pg_recvlogical.c:853 pg_recvlogical.c:865 +#: pg_recvlogical.c:875 pg_recvlogical.c:882 pg_recvlogical.c:889 +#: pg_recvlogical.c:896 pg_recvlogical.c:903 pg_recvlogical.c:910 +#: pg_recvlogical.c:917 pg_recvlogical.c:924 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_basebackup.c:2486 pg_receivewal.c:824 pg_recvlogical.c:847 +#: pg_basebackup.c:2584 pg_createsubscriber.c:2045 pg_receivewal.c:758 +#: pg_recvlogical.c:863 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_basebackup.c:2509 +#: pg_basebackup.c:2607 #, c-format msgid "cannot specify both format and backup target" msgstr "ne peut pas spécifier à la fois le format et la cible de sauvegarde" -#: pg_basebackup.c:2521 +#: pg_basebackup.c:2619 #, c-format msgid "must specify output directory or backup target" msgstr "doit spécifier un répertoire de sortie ou une cible de sauvegarde" -#: pg_basebackup.c:2527 +#: pg_basebackup.c:2625 #, c-format msgid "cannot specify both output directory and backup target" msgstr "ne peut pas spécifier à la fois le répertoire en sortie et la cible de sauvegarde" -#: pg_basebackup.c:2557 pg_receivewal.c:868 +#: pg_basebackup.c:2655 pg_receivewal.c:802 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "algorithme de compression inconnu : « %s »" -#: pg_basebackup.c:2563 pg_receivewal.c:875 +#: pg_basebackup.c:2661 pg_receivewal.c:809 #, c-format msgid "invalid compression specification: %s" msgstr "spécification de compression invalide : %s" -#: pg_basebackup.c:2579 +#: pg_basebackup.c:2677 #, c-format msgid "client-side compression is not possible when a backup target is specified" msgstr "la compression client n'est pas possible quand une cible de restauration est indiquée." -#: pg_basebackup.c:2590 +#: pg_basebackup.c:2688 #, c-format msgid "only tar mode backups can be compressed" msgstr "seules les sauvegardes en mode tar peuvent être compressées" -#: pg_basebackup.c:2600 +#: pg_basebackup.c:2698 #, c-format msgid "WAL cannot be streamed when a backup target is specified" msgstr "Les journaux de transactions ne peuvent pas être envoyés en flux quand une cible de sauvegarde est indiquée." -#: pg_basebackup.c:2606 +#: pg_basebackup.c:2704 #, c-format msgid "cannot stream write-ahead logs in tar mode to stdout" msgstr "ne peut pas envoyer les journaux de transactions vers stdout en mode tar" -#: pg_basebackup.c:2613 +#: pg_basebackup.c:2711 #, c-format msgid "replication slots can only be used with WAL streaming" msgstr "les slots de réplications peuvent seulement être utilisés avec la réplication en flux des WAL" -#: pg_basebackup.c:2625 +#: pg_basebackup.c:2723 #, c-format msgid "--no-slot cannot be used with slot name" msgstr "--no-slot ne peut pas être utilisé avec un nom de slot" #. translator: second %s is an option name -#: pg_basebackup.c:2636 pg_receivewal.c:840 +#: pg_basebackup.c:2734 pg_receivewal.c:774 #, c-format msgid "%s needs a slot to be specified using --slot" msgstr "%s a besoin du slot avec l'option --slot" -#: pg_basebackup.c:2644 pg_basebackup.c:2684 pg_basebackup.c:2695 -#: pg_basebackup.c:2703 +#: pg_basebackup.c:2742 pg_basebackup.c:2782 pg_basebackup.c:2793 +#: pg_basebackup.c:2801 #, c-format msgid "%s and %s are incompatible options" msgstr "%s et %s sont des options incompatibles" -#: pg_basebackup.c:2658 +#: pg_basebackup.c:2756 #, c-format msgid "WAL directory location cannot be specified along with a backup target" msgstr "l'emplacement du répertoire des journaux de transactions ne peut pas être indiqué avec une cible de sauvegarde" -#: pg_basebackup.c:2664 +#: pg_basebackup.c:2762 #, c-format msgid "WAL directory location can only be specified in plain mode" msgstr "l'emplacement du répertoire des journaux de transactions doit être indiqué uniquement dans le mode plain" -#: pg_basebackup.c:2673 +#: pg_basebackup.c:2771 #, c-format msgid "WAL directory location must be an absolute path" msgstr "l'emplacement du répertoire des journaux de transactions doit être indiqué avec un chemin absolu" -#: pg_basebackup.c:2774 +#: pg_basebackup.c:2871 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "n'a pas pu créer le lien symbolique « %s » : %m" -#: pg_basebackup.c:2776 +#: pg_createsubscriber.c:169 #, c-format -msgid "symlinks are not supported on this platform" -msgstr "les liens symboliques ne sont pas supportés sur cette plateforme" +msgid "failed after the end of recovery" +msgstr "échec après la fin de la restauration" -#: pg_receivewal.c:79 +#: pg_createsubscriber.c:170 +#, c-format +msgid "The target server cannot be used as a physical replica anymore. You must recreate the physical replica before continuing." +msgstr "Le serveur cible ne peut plus être utilisé comme un réplicat physique. Vous devez recréer le réplicat physique avant de continuer." + +#: pg_createsubscriber.c:198 +#, c-format +msgid "publication \"%s\" created in database \"%s\" on primary was left behind" +msgstr "la publication « %s » dans la base « %s » sur le primaire pourrait être laissé derrière" + +#: pg_createsubscriber.c:200 +#, c-format +msgid "Drop this publication before trying again." +msgstr "Supprimez cette publication avant de tenter de nouveau." + +#: pg_createsubscriber.c:204 +#, c-format +msgid "replication slot \"%s\" created in database \"%s\" on primary was left behind" +msgstr "le slot de réplication « %s » dans la base « %s » sur le primaire pourrait être laissé derrière" + +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1260 +#, c-format +msgid "Drop this replication slot soon to avoid retention of WAL files." +msgstr "Supprimez rapidement ce slot de réplication pour éviter la rétention des fichiers WAL." + +#: pg_createsubscriber.c:219 #, c-format msgid "" -"%s receives PostgreSQL streaming write-ahead logs.\n" +"%s creates a new logical replica from a standby server.\n" "\n" msgstr "" -"%s reçoit le flux des journaux de transactions PostgreSQL.\n" +"%s crée un nouveau réplicat logique à partir d'un serveur secondaire.\n" "\n" -#: pg_receivewal.c:83 pg_recvlogical.c:84 +#: pg_createsubscriber.c:223 pg_receivewal.c:81 pg_recvlogical.c:92 #, c-format msgid "" "\n" @@ -1160,259 +1340,874 @@ msgstr "" "\n" "Options :\n" -#: pg_receivewal.c:84 +#: pg_createsubscriber.c:224 #, c-format -msgid " -D, --directory=DIR receive write-ahead log files into this directory\n" -msgstr "" -" -D, --directory=RÉPERTOIRE reçoit les journaux de transactions dans ce\n" -" répertoire\n" +msgid " -d, --database=DBNAME database in which to create a subscription\n" +msgstr " -d, --dbname=BASE base de données où créer la souscription\n" -#: pg_receivewal.c:85 pg_recvlogical.c:85 +#: pg_createsubscriber.c:225 #, c-format -msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" -msgstr " -E, --endpos=LSN quitte après avoir reçu le LSN spécifié\n" +msgid " -D, --pgdata=DATADIR location for the subscriber data directory\n" +msgstr " [-D, --pgdata=]RÉP_DONNEES emplacement du répertoire de données de l'abonné\n" -#: pg_receivewal.c:86 pg_recvlogical.c:89 +#: pg_createsubscriber.c:226 #, c-format -msgid " --if-not-exists do not error if slot already exists when creating a slot\n" +msgid " -n, --dry-run dry run, just show what would be done\n" msgstr "" -" --if-not-exists ne pas renvoyer une erreur si le slot existe\n" -" déjà lors de sa création\n" +" -n, --dry-run pas d'exécution, affiche\n" +" simplement ce qui sera fait\n" -#: pg_receivewal.c:87 pg_recvlogical.c:91 +#: pg_createsubscriber.c:227 #, c-format -msgid " -n, --no-loop do not loop on connection lost\n" -msgstr " -n, --no-loop ne boucle pas en cas de perte de la connexion\n" +msgid " -p, --subscriber-port=PORT subscriber port number (default %s)\n" +msgstr " -p, --subscriber-port=PORT numéro de port de l'abonné (par défaut %s)\n" -#: pg_receivewal.c:88 +#: pg_createsubscriber.c:228 #, c-format -msgid " --no-sync do not wait for changes to be written safely to disk\n" -msgstr "" -" --no-sync n'attend pas que les modifications soient\n" -" proprement écrites sur disque\n" +msgid " -P, --publisher-server=CONNSTR publisher connection string\n" +msgstr " -P, --publisher-server=CHAÃŽNE_CONNEX chaîne de connexion du publieur\n" -#: pg_receivewal.c:89 pg_recvlogical.c:96 +#: pg_createsubscriber.c:229 #, c-format -msgid "" -" -s, --status-interval=SECS\n" -" time between status packets sent to server (default: %d)\n" -msgstr "" -" -s, --status-interval=SECS durée entre l'envoi de paquets de statut au\n" -" (par défaut %d)\n" +msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" +msgstr " -s, --socketdir=RÉP répertoire de la socket à utiliser (par défaut, le répertoire courant)\n" -#: pg_receivewal.c:92 +#: pg_createsubscriber.c:230 #, c-format -msgid " --synchronous flush write-ahead log immediately after writing\n" -msgstr "" -" --synchronous vide le journal de transactions immédiatement\n" -" après son écriture\n" +msgid " -t, --recovery-timeout=SECS seconds to wait for recovery to end\n" +msgstr " -t, --recovery-timeout=SECS durée en secondes à attendre pour la fin de la restauration\n" -#: pg_receivewal.c:95 +#: pg_createsubscriber.c:231 #, c-format -msgid "" -" -Z, --compress=METHOD[:DETAIL]\n" -" compress as specified\n" -msgstr "" -" -Z, --compress=METHOD[:DETAIL]\n" -" compresse comme indiqué\n" +msgid " -U, --subscriber-username=NAME user name for subscriber connection\n" +msgstr " -U, --subscriber-username=NOM nom d'utilisateur pour la connexion de l'abonné\n" + +#: pg_createsubscriber.c:232 +#, c-format +msgid " -v, --verbose output verbose messages\n" +msgstr " -v, --verbose affiche des messages verbeux\n" -#: pg_receivewal.c:105 +#: pg_createsubscriber.c:233 #, c-format msgid "" -"\n" -"Optional actions:\n" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" msgstr "" -"\n" -"Actions optionnelles :\n" +" --config-file=NOMFICHIER utilise le fichier de configuration indiqué\n" +" du serveur principal lors de l'exécution de\n" +" l'instance cible\n" -#: pg_receivewal.c:106 pg_recvlogical.c:81 +#: pg_createsubscriber.c:235 #, c-format -msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n" -msgstr "" -" --create-slot crée un nouveau slot de réplication\n" -" (pour le nom du slot, voir --slot)\n" +msgid " --publication=NAME publication name\n" +msgstr " --publication=NOM nom de la publication\n" -#: pg_receivewal.c:107 pg_recvlogical.c:82 +#: pg_createsubscriber.c:236 #, c-format -msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n" -msgstr "" -" --drop-slot supprime un nouveau slot de réplication\n" -" (pour le nom du slot, voir --slot)\n" +msgid " --replication-slot=NAME replication slot name\n" +msgstr " --replication-slot=NOM nom du slot de réplication\n" -#: pg_receivewal.c:252 +#: pg_createsubscriber.c:237 #, c-format -msgid "finished segment at %X/%X (timeline %u)" -msgstr "segment terminé à %X/%X (timeline %u)" +msgid " --subscription=NAME subscription name\n" +msgstr " --subscription=NOM nom de la souscription\n" -#: pg_receivewal.c:259 +#: pg_createsubscriber.c:238 #, c-format -msgid "stopped log streaming at %X/%X (timeline %u)" -msgstr "arrêt du flux streaming à %X/%X (timeline %u)" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version affiche la version puis quitte\n" -#: pg_receivewal.c:275 +#: pg_createsubscriber.c:239 #, c-format -msgid "switched to timeline %u at %X/%X" -msgstr "a basculé sur la timeline %u à %X/%X" +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_receivewal.c:285 +#: pg_createsubscriber.c:282 #, c-format -msgid "received interrupt signal, exiting" -msgstr "a reçu un signal d'interruption, quitte" +msgid "could not parse connection string: %s" +msgstr "n'a pas pu analyser la chaîne de connexion : %s" -#: pg_receivewal.c:317 +#: pg_createsubscriber.c:359 #, c-format -msgid "could not close directory \"%s\": %m" -msgstr "n'a pas pu fermer le répertoire « %s » : %m" +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »" -#: pg_receivewal.c:384 +#: pg_createsubscriber.c:362 #, c-format -msgid "segment file \"%s\" has incorrect size %lld, skipping" -msgstr "le segment « %s » a une taille incorrecte (%lld), ignoré" +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s" -#: pg_receivewal.c:401 +#: pg_createsubscriber.c:382 #, c-format -msgid "could not open compressed file \"%s\": %m" -msgstr "n'a pas pu ouvrir le fichier compressé « %s » : %m" +msgid "checking if directory \"%s\" is a cluster data directory" +msgstr "vérification si le répertoire « %s » est le répertoire d'une instance" -#: pg_receivewal.c:404 +#: pg_createsubscriber.c:388 #, c-format -msgid "could not seek in compressed file \"%s\": %m" -msgstr "n'a pas pu chercher dans le fichier compressé « %s » : %m" +msgid "data directory \"%s\" does not exist" +msgstr "le répertoire des données « %s » n'existe pas" -#: pg_receivewal.c:410 +#: pg_createsubscriber.c:396 #, c-format -msgid "could not read compressed file \"%s\": %m" -msgstr "n'a pas pu lire le fichier compressé « %s » : %m" +msgid "directory \"%s\" is not a database cluster directory" +msgstr "le répertoire « %s » n'est pas un répertoire d'instance" -#: pg_receivewal.c:413 +#: pg_createsubscriber.c:513 #, c-format -msgid "could not read compressed file \"%s\": read %d of %zu" -msgstr "n'a pas pu lire le fichier compressé « %s » : a lu %d sur %zu" +msgid "connection to database failed: %s" +msgstr "échec de la connexion à la base de données : %s" -#: pg_receivewal.c:423 +#: pg_createsubscriber.c:526 #, c-format -msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping" -msgstr "le segment compressé « %s » a une taille %d non compressé incorrecte, ignoré" +msgid "could not clear search_path: %s" +msgstr "n'a pas pu effacer search_path : %s" -#: pg_receivewal.c:451 +#: pg_createsubscriber.c:566 #, c-format -msgid "could not create LZ4 decompression context: %s" -msgstr "n'a pas pu créer le contexte de décompression LZ4 : %s" +msgid "getting system identifier from publisher" +msgstr "recherche de l'identifieur système sur le publieur" -#: pg_receivewal.c:463 +#: pg_createsubscriber.c:573 #, c-format -msgid "could not read file \"%s\": %m" -msgstr "n'a pas pu lire le fichier « %s » : %m" +msgid "could not get system identifier: %s" +msgstr "n'a pas pu obtenir l'identifiant du système : %s" -#: pg_receivewal.c:481 +#: pg_createsubscriber.c:579 #, c-format -msgid "could not decompress file \"%s\": %s" -msgstr "n'a pas pu décompresser le fichier « %s » : %s" +msgid "could not get system identifier: got %d rows, expected %d row" +msgstr "n'a pas pu obtenir l'identifiant du système : lu %d octets, %d attendus" -#: pg_receivewal.c:504 +#: pg_createsubscriber.c:586 #, c-format -msgid "could not free LZ4 decompression context: %s" -msgstr "n'a pas pu libérer le contexte de décompression LZ4 : %s" +msgid "system identifier is %llu on publisher" +msgstr "l'identifieur système est %llu sur le publieur" -#: pg_receivewal.c:509 +#: pg_createsubscriber.c:607 #, c-format -msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping" -msgstr "le fichier segment compressé « %s » a une taille %zu décompressée incorrecte, ignoré" +msgid "getting system identifier from subscriber" +msgstr "recherche l'identifieur système sur l'abonné" -#: pg_receivewal.c:514 +#: pg_createsubscriber.c:611 pg_createsubscriber.c:641 #, c-format -msgid "cannot check file \"%s\": compression with %s not supported by this build" -msgstr "ne peut pas vérifier le fichier « %s » : la compression avec %s n'a pas été intégrée lors de la compilation" +msgid "control file appears to be corrupt" +msgstr "le fichier de contrôle semble corrompu" -#: pg_receivewal.c:641 +#: pg_createsubscriber.c:615 pg_createsubscriber.c:656 #, c-format -msgid "starting log streaming at %X/%X (timeline %u)" -msgstr "commence le flux des journaux à %X/%X (timeline %u)" +msgid "system identifier is %llu on subscriber" +msgstr "l'identifieur système est %llu sur l'abonné" -#: pg_receivewal.c:783 pg_recvlogical.c:785 +#: pg_createsubscriber.c:637 #, c-format -msgid "could not parse end position \"%s\"" -msgstr "n'a pas pu analyser la position finale « %s »" +msgid "modifying system identifier of subscriber" +msgstr "modification de l'identifieur système sur l'abonné" -#: pg_receivewal.c:832 +#: pg_createsubscriber.c:659 #, c-format -msgid "cannot use --create-slot together with --drop-slot" -msgstr "ne peut pas utiliser --create-slot avec --drop-slot" +msgid "running pg_resetwal on the subscriber" +msgstr "exécution de pg_resetwal sur l'abonné" -#: pg_receivewal.c:848 +#: pg_createsubscriber.c:671 #, c-format -msgid "cannot use --synchronous together with --no-sync" -msgstr "ne peut pas utiliser --synchronous avec --no-sync" +msgid "subscriber successfully changed the system identifier" +msgstr "l'abonné a modifié avec succès l'identifieur système" -#: pg_receivewal.c:858 +#: pg_createsubscriber.c:673 #, c-format -msgid "no target directory specified" -msgstr "aucun répertoire cible indiqué" +msgid "could not change system identifier of subscriber: %s" +msgstr "n'a pas pu modifier l'identifiant du système abonné : %s" -#: pg_receivewal.c:882 +#: pg_createsubscriber.c:697 #, c-format -msgid "compression with %s is not yet supported" -msgstr "la méthode de compression %s n'est pas encore supportée" +msgid "could not obtain database OID: %s" +msgstr "n'a pas pu obtenir l'OID de la base : %s" -#: pg_receivewal.c:924 +#: pg_createsubscriber.c:704 #, c-format -msgid "replication connection using slot \"%s\" is unexpectedly database specific" -msgstr "la connexion de réplication utilisant le slot « %s » est spécifique à une base, ce qui est inattendu" +msgid "could not obtain database OID: got %d rows, expected %d row" +msgstr "n'a pas pu obtenir l'OID de la base de données : %d lignes attendues, %d ligne reçue" -#: pg_receivewal.c:943 pg_recvlogical.c:955 +#: pg_createsubscriber.c:776 #, c-format -msgid "dropping replication slot \"%s\"" -msgstr "suppression du slot de réplication « %s »" +msgid "create replication slot \"%s\" on publisher" +msgstr "création du slot de réplication « %s » sur le publieur" -#: pg_receivewal.c:954 pg_recvlogical.c:965 +#: pg_createsubscriber.c:796 #, c-format -msgid "creating replication slot \"%s\"" -msgstr "création du slot de réplication « %s »" +msgid "could not write an additional WAL record: %s" +msgstr "n'a pas pu écrire un enregistrement WAL supplémentaire : %s" -#: pg_receivewal.c:983 pg_recvlogical.c:989 +#: pg_createsubscriber.c:822 #, c-format -msgid "disconnected" -msgstr "déconnecté" +msgid "could not obtain recovery progress: %s" +msgstr "n'a pas pu obtenir la progression de la restauration : %s" -#. translator: check source for value for %d -#: pg_receivewal.c:987 pg_recvlogical.c:993 +#: pg_createsubscriber.c:854 #, c-format -msgid "disconnected; waiting %d seconds to try again" -msgstr "déconnecté, attente de %d secondes avant une nouvelle tentative" +msgid "checking settings on publisher" +msgstr "vérification de la configuration du publieur" -#: pg_recvlogical.c:76 +#: pg_createsubscriber.c:864 #, c-format -msgid "" -"%s controls PostgreSQL logical decoding streams.\n" -"\n" -msgstr "" -"%s contrôle le flux des modifications logiques de PostgreSQL.\n" -"\n" +msgid "primary server cannot be in recovery" +msgstr "le serveur primaire ne peut pas être en restauration" -#: pg_recvlogical.c:80 +#: pg_createsubscriber.c:888 #, c-format -msgid "" -"\n" -"Action to be performed:\n" -msgstr "" -"\n" -"Action à réaliser :\n" +msgid "could not obtain publisher settings: %s" +msgstr "n'a pas pu obtenir la configuration du publieur : %s" -#: pg_recvlogical.c:83 +#: pg_createsubscriber.c:914 +#, c-format +msgid "publisher requires wal_level >= \"logical\"" +msgstr "le publieur requiert wal_level >= « logical »" + +#: pg_createsubscriber.c:920 +#, c-format +msgid "publisher requires %d replication slots, but only %d remain" +msgstr "le publieur requiert %d slots de réplication, mais seuls %d restent" + +#: pg_createsubscriber.c:922 pg_createsubscriber.c:931 +#: pg_createsubscriber.c:1028 pg_createsubscriber.c:1037 +#: pg_createsubscriber.c:1046 +#, c-format +msgid "Increase the configuration parameter \"%s\" to at least %d." +msgstr "Augmentez le paramètre de configuration « %s » à au moins %d." + +#: pg_createsubscriber.c:929 +#, c-format +msgid "publisher requires %d WAL sender processes, but only %d remain" +msgstr "le publieur requiert %d processus wal sender, mais seuls %d restent" + +#: pg_createsubscriber.c:938 +#, c-format +msgid "two_phase option will not be enabled for replication slots" +msgstr "l'option two_phase ne sera pas activée pour les slots de réplication" + +#: pg_createsubscriber.c:939 +#, c-format +msgid "Subscriptions will be created with the two_phase option disabled. Prepared transactions will be replicated at COMMIT PREPARED." +msgstr "Les souscriptions seront créées avec l'option two_phase désactivé. Les transactions préparées seront répliquées au COMMIT PREPARED." + +#: pg_createsubscriber.c:971 +#, c-format +msgid "checking settings on subscriber" +msgstr "vérification de la configuration sur l'abonné" + +#: pg_createsubscriber.c:978 +#, c-format +msgid "target server must be a standby" +msgstr "le serveur cible doit être un secondaire" + +#: pg_createsubscriber.c:1002 +#, c-format +msgid "could not obtain subscriber settings: %s" +msgstr "n'a pas pu obtenir la configuration de l'abonné : %s" + +#: pg_createsubscriber.c:1026 +#, c-format +msgid "subscriber requires %d replication slots, but only %d remain" +msgstr "l'abonné requiert %d slots de réplication, mais seuls %d restent" + +#: pg_createsubscriber.c:1035 +#, c-format +msgid "subscriber requires %d logical replication workers, but only %d remain" +msgstr "l'abonné requiert %d processus worker de réplication logique, mais seuls %d restent" + +#: pg_createsubscriber.c:1044 +#, c-format +msgid "subscriber requires %d worker processes, but only %d remain" +msgstr "l'abonné requiert %d processus worker, mais seuls %d restent" + +#: pg_createsubscriber.c:1079 +#, c-format +msgid "dropping subscription \"%s\" in database \"%s\"" +msgstr "suppression de la souscription « %s » dans la base de données « %s »" + +#: pg_createsubscriber.c:1088 +#, c-format +msgid "could not drop subscription \"%s\": %s" +msgstr "n'a pas pu supprimer la souscription « %s » : %s" + +#: pg_createsubscriber.c:1123 +#, c-format +msgid "could not obtain pre-existing subscriptions: %s" +msgstr "n'a pas pu obtenir les souscriptions pré-existantes : %s" + +#: pg_createsubscriber.c:1258 +#, c-format +msgid "could not drop replication slot \"%s\" on primary" +msgstr "n'a pas pu supprimer le slot de réplication « %s » sur le primaire" + +#: pg_createsubscriber.c:1292 +#, c-format +msgid "could not obtain failover replication slot information: %s" +msgstr "n'a pas pu obtenir l'information de slot de réplication failover : %s" + +#: pg_createsubscriber.c:1294 pg_createsubscriber.c:1303 +#, c-format +msgid "Drop the failover replication slots on subscriber soon to avoid retention of WAL files." +msgstr "Supprimez rapidement les slots de réplication failover sur l'abonnée pour éviter la rétention des fichiers WAL." + +#: pg_createsubscriber.c:1302 +#, c-format +msgid "could not drop failover replication slot" +msgstr "n'a pas pu supprimer le slot de réplication failover" + +#: pg_createsubscriber.c:1324 +#, c-format +msgid "creating the replication slot \"%s\" in database \"%s\"" +msgstr "création du slot de réplication « %s » dans la base « %s »" + +#: pg_createsubscriber.c:1342 +#, c-format +msgid "could not create replication slot \"%s\" in database \"%s\": %s" +msgstr "n'a pas pu créer le slot de réplication « %s » dans la base « %s » : %s" + +#: pg_createsubscriber.c:1372 +#, c-format +msgid "dropping the replication slot \"%s\" in database \"%s\"" +msgstr "suppression du slot de réplication « %s » dans la base « %s »" + +#: pg_createsubscriber.c:1388 +#, c-format +msgid "could not drop replication slot \"%s\" in database \"%s\": %s" +msgstr "n'a pas pu supprimer le slot de réplication « %s » dans la base « %s » : %s" + +#: pg_createsubscriber.c:1409 +#, c-format +msgid "pg_ctl failed with exit code %d" +msgstr "échec de pg_ctl avec un code de retour %d" + +#: pg_createsubscriber.c:1414 +#, c-format +msgid "pg_ctl was terminated by exception 0x%X" +msgstr "pg_ctl a été terminé par l'exception 0x%X" + +#: pg_createsubscriber.c:1416 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "" +"Voir le fichier d'en-tête C « ntstatus.h » pour une description de la valeur\n" +"hexadécimale." + +#: pg_createsubscriber.c:1418 +#, c-format +msgid "pg_ctl was terminated by signal %d: %s" +msgstr "pg_ctl a été terminé par le signal %d : %s" + +#: pg_createsubscriber.c:1424 +#, c-format +msgid "pg_ctl exited with unrecognized status %d" +msgstr "pg_ctl a quitté avec un statut %d non reconnu" + +#: pg_createsubscriber.c:1427 +#, c-format +msgid "The failed command was: %s" +msgstr "La commande échouée était : %s" + +#: pg_createsubscriber.c:1473 +#, c-format +msgid "server was started" +msgstr "le serveur a été démarré" + +#: pg_createsubscriber.c:1488 +#, c-format +msgid "server was stopped" +msgstr "le serveur a été arrêté" + +#: pg_createsubscriber.c:1507 +#, c-format +msgid "waiting for the target server to reach the consistent state" +msgstr "en attente de l'atteinte de l'état de cohérence sur le serveur cible" + +#: pg_createsubscriber.c:1530 +#, c-format +msgid "recovery timed out" +msgstr "délai de restauration atteint" + +#: pg_createsubscriber.c:1543 +#, c-format +msgid "server did not end recovery" +msgstr "le serveur n'a pas terminé la restauration" + +#: pg_createsubscriber.c:1545 +#, c-format +msgid "target server reached the consistent state" +msgstr "le serveur cible a atteint l'état de cohérence" + +#: pg_createsubscriber.c:1546 +#, c-format +msgid "If pg_createsubscriber fails after this point, you must recreate the physical replica before continuing." +msgstr "Si pg_createsubscriber échoue après cela, vous devez recréer le réplicat physique avant de continuer." + +#: pg_createsubscriber.c:1573 +#, c-format +msgid "could not obtain publication information: %s" +msgstr "n'a pas pu obtenir une information sur la publication : %s" + +#: pg_createsubscriber.c:1587 +#, c-format +msgid "publication \"%s\" already exists" +msgstr "la publication « %s » existe déjà" + +#: pg_createsubscriber.c:1588 +#, c-format +msgid "Consider renaming this publication before continuing." +msgstr "Pensez à renommer cette publication avant de continuer." + +#: pg_createsubscriber.c:1595 +#, c-format +msgid "creating publication \"%s\" in database \"%s\"" +msgstr "création de la publication « %s » dans la base de données « %s »" + +#: pg_createsubscriber.c:1608 +#, c-format +msgid "could not create publication \"%s\" in database \"%s\": %s" +msgstr "n'a pas pu créer la publication « %s » dans la base de données « %s » : %s" + +#: pg_createsubscriber.c:1637 +#, c-format +msgid "dropping publication \"%s\" in database \"%s\"" +msgstr "suppression de la publication « %s » dans la base de données « %s »" + +#: pg_createsubscriber.c:1651 +#, c-format +msgid "could not drop publication \"%s\" in database \"%s\": %s" +msgstr "n'a pas pu supprimer la publication « %s » dans la base de données « %s » : %s" + +#: pg_createsubscriber.c:1697 +#, c-format +msgid "creating subscription \"%s\" in database \"%s\"" +msgstr "création de la souscription « %s » dans la base de données « %s »" + +#: pg_createsubscriber.c:1718 +#, c-format +msgid "could not create subscription \"%s\" in database \"%s\": %s" +msgstr "n'a pas pu créer la souscription « %s » dans la base « %s » : %s" + +#: pg_createsubscriber.c:1763 +#, c-format +msgid "could not obtain subscription OID: %s" +msgstr "n'a pas pu obtenir l'OID de la souscription : %s" + +#: pg_createsubscriber.c:1770 +#, c-format +msgid "could not obtain subscription OID: got %d rows, expected %d row" +msgstr "n'a pas pu obtenir l'OID de la souscription : attendait %d lignes, a reçu %d ligne" + +#: pg_createsubscriber.c:1794 +#, c-format +msgid "setting the replication progress (node name \"%s\", LSN %s) in database \"%s\"" +msgstr "configuration de la progression de la réplication (nom du noeud « %s » , LSN %s) dans la base de données « %s »" + +#: pg_createsubscriber.c:1809 +#, c-format +msgid "could not set replication progress for subscription \"%s\": %s" +msgstr "n'a pas pu configurer la progression de la réplication pour la souscription « %s » : %s" + +#: pg_createsubscriber.c:1840 +#, c-format +msgid "enabling subscription \"%s\" in database \"%s\"" +msgstr "activation de la souscription « %s » dans la base de données « %s »" + +#: pg_createsubscriber.c:1852 +#, c-format +msgid "could not enable subscription \"%s\": %s" +msgstr "n'a pas pu activer la souscription « %s » : %s" + +#: pg_createsubscriber.c:1944 +#, c-format +msgid "cannot be executed by \"root\"" +msgstr "ne peut pas être exécuté par « root »" + +#: pg_createsubscriber.c:1945 +#, c-format +msgid "You must run %s as the PostgreSQL superuser." +msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL." + +#: pg_createsubscriber.c:1966 +#, c-format +msgid "database \"%s\" specified more than once" +msgstr "la base de données « %s » est spécifiée plus d'une fois" + +#: pg_createsubscriber.c:2007 +#, c-format +msgid "publication \"%s\" specified more than once" +msgstr "la publication « %s » est spécifiée plus d'une fois" + +#: pg_createsubscriber.c:2019 +#, c-format +msgid "replication slot \"%s\" specified more than once" +msgstr "le slot de réplication « %s » est spécifié plus d'une fois" + +#: pg_createsubscriber.c:2031 +#, c-format +msgid "subscription \"%s\" specified more than once" +msgstr "la souscription « %s » est spécifiée plus d'une fois" + +#: pg_createsubscriber.c:2054 +#, c-format +msgid "no subscriber data directory specified" +msgstr "aucune chaîne de connexion de l'abonné indiquée" + +#: pg_createsubscriber.c:2065 +#, c-format +msgid "could not determine current directory" +msgstr "n'a pas pu déterminer le répertoire courant" + +#: pg_createsubscriber.c:2082 +#, c-format +msgid "no publisher connection string specified" +msgstr "aucune chaîne de connexion du publieur indiquée" + +#: pg_createsubscriber.c:2086 +#, c-format +msgid "validating publisher connection string" +msgstr "validation de la chaîne de connexion du publieur" + +#: pg_createsubscriber.c:2092 +#, c-format +msgid "validating subscriber connection string" +msgstr "validation de la chaîne de connexion de l'abonné" + +#: pg_createsubscriber.c:2097 +#, c-format +msgid "no database was specified" +msgstr "aucune base de données n'a été indiquée" + +#: pg_createsubscriber.c:2109 +#, c-format +msgid "database name \"%s\" was extracted from the publisher connection string" +msgstr "le nom de la base de données « %s » a été extrait de la chaîne de connexion du publieur" + +#: pg_createsubscriber.c:2114 +#, c-format +msgid "no database name specified" +msgstr "aucun nom de base de données indiqué" + +#: pg_createsubscriber.c:2124 +#, c-format +msgid "wrong number of publication names specified" +msgstr "mauvais nombre de noms de publication indiqués" + +#: pg_createsubscriber.c:2125 +#, c-format +msgid "The number of specified publication names (%d) must match the number of specified database names (%d)." +msgstr "Le nombre de noms de publication indiqués (%d) doit correspondre au nombre de noms de bases de données indiqués (%d)" + +#: pg_createsubscriber.c:2131 +#, c-format +msgid "wrong number of subscription names specified" +msgstr "mauvais nombre de noms de souscription indiqués" + +#: pg_createsubscriber.c:2132 +#, c-format +msgid "The number of specified subscription names (%d) must match the number of specified database names (%d)." +msgstr "Le nombre de noms de souscriptions indiqués (%d) doit correspondre au nombre de noms de bases de données indiqués (%d)" + +#: pg_createsubscriber.c:2138 +#, c-format +msgid "wrong number of replication slot names specified" +msgstr "mauvais nombre de noms de slots de réplication indiqués" + +#: pg_createsubscriber.c:2139 +#, c-format +msgid "The number of specified replication slot names (%d) must match the number of specified database names (%d)." +msgstr "Le nombre de noms de slots de réplication indiqués (%d) doit correspondre au nombre de noms de bases de données indiqués (%d)" + +#: pg_createsubscriber.c:2168 +#, c-format +msgid "subscriber data directory is not a copy of the source database cluster" +msgstr "le répertoire de données de l'abonné n'est pas une copie de l'instance source" + +#: pg_createsubscriber.c:2181 +#, c-format +msgid "standby server is running" +msgstr "le serveur secondaire est en cours d'exécution" + +#: pg_createsubscriber.c:2182 +#, c-format +msgid "Stop the standby server and try again." +msgstr "Arrêtez le secondaire et tentez de nouveau." + +#: pg_createsubscriber.c:2191 +#, c-format +msgid "starting the standby server with command-line options" +msgstr "lancement du serveur secondaire avec les options en ligne de commande" + +#: pg_createsubscriber.c:2207 pg_createsubscriber.c:2242 +#, c-format +msgid "stopping the subscriber" +msgstr "arrêt de l'abonné" + +#: pg_createsubscriber.c:2221 +#, c-format +msgid "starting the subscriber" +msgstr "lancement de l'abonné" + +#: pg_createsubscriber.c:2250 +#, c-format +msgid "Done!" +msgstr "Terminé !" + +#: pg_receivewal.c:77 +#, c-format +msgid "" +"%s receives PostgreSQL streaming write-ahead logs.\n" +"\n" +msgstr "" +"%s reçoit le flux des journaux de transactions PostgreSQL.\n" +"\n" + +#: pg_receivewal.c:82 +#, c-format +msgid " -D, --directory=DIR receive write-ahead log files into this directory\n" +msgstr "" +" -D, --directory=RÉPERTOIRE reçoit les journaux de transactions dans ce\n" +" répertoire\n" + +#: pg_receivewal.c:83 pg_recvlogical.c:93 +#, c-format +msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" +msgstr " -E, --endpos=LSN quitte après avoir reçu le LSN spécifié\n" + +#: pg_receivewal.c:84 pg_recvlogical.c:97 +#, c-format +msgid " --if-not-exists do not error if slot already exists when creating a slot\n" +msgstr "" +" --if-not-exists ne pas renvoyer une erreur si le slot existe\n" +" déjà lors de sa création\n" + +#: pg_receivewal.c:85 pg_recvlogical.c:99 +#, c-format +msgid " -n, --no-loop do not loop on connection lost\n" +msgstr " -n, --no-loop ne boucle pas en cas de perte de la connexion\n" + +#: pg_receivewal.c:86 +#, c-format +msgid " --no-sync do not wait for changes to be written safely to disk\n" +msgstr "" +" --no-sync n'attend pas que les modifications soient\n" +" proprement écrites sur disque\n" + +#: pg_receivewal.c:87 pg_recvlogical.c:104 +#, c-format +msgid "" +" -s, --status-interval=SECS\n" +" time between status packets sent to server (default: %d)\n" +msgstr "" +" -s, --status-interval=SECS durée entre l'envoi de paquets de statut au\n" +" serveur (par défaut %d)\n" + +#: pg_receivewal.c:90 +#, c-format +msgid " --synchronous flush write-ahead log immediately after writing\n" +msgstr "" +" --synchronous vide le journal de transactions immédiatement\n" +" après son écriture\n" + +#: pg_receivewal.c:93 +#, c-format +msgid "" +" -Z, --compress=METHOD[:DETAIL]\n" +" compress as specified\n" +msgstr "" +" -Z, --compress=METHOD[:DETAIL]\n" +" compresse comme indiqué\n" + +#: pg_receivewal.c:103 +#, c-format +msgid "" +"\n" +"Optional actions:\n" +msgstr "" +"\n" +"Actions optionnelles :\n" + +#: pg_receivewal.c:104 pg_recvlogical.c:89 +#, c-format +msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n" +msgstr "" +" --create-slot crée un nouveau slot de réplication\n" +" (pour le nom du slot, voir --slot)\n" + +#: pg_receivewal.c:105 pg_recvlogical.c:90 +#, c-format +msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n" +msgstr "" +" --drop-slot supprime un nouveau slot de réplication\n" +" (pour le nom du slot, voir --slot)\n" + +#: pg_receivewal.c:191 +#, c-format +msgid "finished segment at %X/%X (timeline %u)" +msgstr "segment terminé à %X/%X (timeline %u)" + +#: pg_receivewal.c:198 +#, c-format +msgid "stopped log streaming at %X/%X (timeline %u)" +msgstr "arrêt du flux streaming à %X/%X (timeline %u)" + +#: pg_receivewal.c:214 +#, c-format +msgid "switched to timeline %u at %X/%X" +msgstr "a basculé sur la timeline %u à %X/%X" + +#: pg_receivewal.c:224 pg_recvlogical.c:1053 +#, c-format +msgid "received interrupt signal, exiting" +msgstr "a reçu un signal d'interruption, quitte" + +#: pg_receivewal.c:256 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "n'a pas pu fermer le répertoire « %s » : %m" + +#: pg_receivewal.c:323 +#, c-format +msgid "segment file \"%s\" has incorrect size %lld, skipping" +msgstr "le segment « %s » a une taille incorrecte (%lld), ignoré" + +#: pg_receivewal.c:340 +#, c-format +msgid "could not open compressed file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier compressé « %s » : %m" + +#: pg_receivewal.c:343 +#, c-format +msgid "could not seek in compressed file \"%s\": %m" +msgstr "n'a pas pu chercher dans le fichier compressé « %s » : %m" + +#: pg_receivewal.c:349 +#, c-format +msgid "could not read compressed file \"%s\": %m" +msgstr "n'a pas pu lire le fichier compressé « %s » : %m" + +#: pg_receivewal.c:352 +#, c-format +msgid "could not read compressed file \"%s\": read %d of %zu" +msgstr "n'a pas pu lire le fichier compressé « %s » : a lu %d sur %zu" + +#: pg_receivewal.c:362 +#, c-format +msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping" +msgstr "le segment compressé « %s » a une taille %d non compressé incorrecte, ignoré" + +#: pg_receivewal.c:390 +#, c-format +msgid "could not create LZ4 decompression context: %s" +msgstr "n'a pas pu créer le contexte de décompression LZ4 : %s" + +#: pg_receivewal.c:420 +#, c-format +msgid "could not decompress file \"%s\": %s" +msgstr "n'a pas pu décompresser le fichier « %s » : %s" + +#: pg_receivewal.c:443 +#, c-format +msgid "could not free LZ4 decompression context: %s" +msgstr "n'a pas pu libérer le contexte de décompression LZ4 : %s" + +#: pg_receivewal.c:448 +#, c-format +msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping" +msgstr "le fichier segment compressé « %s » a une taille %zu décompressée incorrecte, ignoré" + +#: pg_receivewal.c:453 +#, c-format +msgid "cannot check file \"%s\": compression with %s not supported by this build" +msgstr "ne peut pas vérifier le fichier « %s » : la compression avec %s n'a pas été intégrée lors de la compilation" + +#: pg_receivewal.c:578 +#, c-format +msgid "starting log streaming at %X/%X (timeline %u)" +msgstr "commence le flux des journaux à %X/%X (timeline %u)" + +#: pg_receivewal.c:693 pg_recvlogical.c:801 +#, c-format +msgid "could not parse end position \"%s\"" +msgstr "n'a pas pu analyser la position finale « %s »" + +#: pg_receivewal.c:766 +#, c-format +msgid "cannot use --create-slot together with --drop-slot" +msgstr "ne peut pas utiliser --create-slot avec --drop-slot" + +#: pg_receivewal.c:782 +#, c-format +msgid "cannot use --synchronous together with --no-sync" +msgstr "ne peut pas utiliser --synchronous avec --no-sync" + +#: pg_receivewal.c:792 +#, c-format +msgid "no target directory specified" +msgstr "aucun répertoire cible indiqué" + +#: pg_receivewal.c:816 +#, c-format +msgid "compression with %s is not yet supported" +msgstr "la méthode de compression %s n'est pas encore supportée" + +#: pg_receivewal.c:859 +#, c-format +msgid "replication connection using slot \"%s\" is unexpectedly database specific" +msgstr "la connexion de réplication utilisant le slot « %s » est spécifique à une base, ce qui est inattendu" + +#: pg_receivewal.c:878 pg_recvlogical.c:972 +#, c-format +msgid "dropping replication slot \"%s\"" +msgstr "suppression du slot de réplication « %s »" + +#: pg_receivewal.c:889 pg_recvlogical.c:982 +#, c-format +msgid "creating replication slot \"%s\"" +msgstr "création du slot de réplication « %s »" + +#: pg_receivewal.c:918 pg_recvlogical.c:1006 +#, c-format +msgid "disconnected" +msgstr "déconnecté" + +#. translator: check source for value for %d +#: pg_receivewal.c:922 pg_recvlogical.c:1010 +#, c-format +msgid "disconnected; waiting %d seconds to try again" +msgstr "déconnecté, attente de %d secondes avant une nouvelle tentative" + +#: pg_recvlogical.c:84 +#, c-format +msgid "" +"%s controls PostgreSQL logical decoding streams.\n" +"\n" +msgstr "" +"%s contrôle le flux des modifications logiques de PostgreSQL.\n" +"\n" + +#: pg_recvlogical.c:88 +#, c-format +msgid "" +"\n" +"Action to be performed:\n" +msgstr "" +"\n" +"Action à réaliser :\n" + +#: pg_recvlogical.c:91 #, c-format msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n" msgstr "" " --start lance le flux dans un slot de réplication (pour\n" " le nom du slot, voir --slot)\n" -#: pg_recvlogical.c:86 +#: pg_recvlogical.c:94 #, c-format msgid " -f, --file=FILE receive log into this file, - for stdout\n" msgstr "" " -f, --file=FICHIER trace la réception dans ce fichier, - pour\n" " stdout\n" -#: pg_recvlogical.c:87 +#: pg_recvlogical.c:95 #, c-format msgid "" " -F --fsync-interval=SECS\n" @@ -1421,14 +2216,14 @@ msgstr "" " -F --fsync-interval=SECS durée entre les fsyncs vers le fichier de sortie\n" " (par défaut %d)\n" -#: pg_recvlogical.c:90 +#: pg_recvlogical.c:98 #, c-format msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n" msgstr "" " -I, --startpos=LSN position de début du streaming dans le slot\n" " existant\n" -#: pg_recvlogical.c:92 +#: pg_recvlogical.c:100 #, c-format msgid "" " -o, --option=NAME[=VALUE]\n" @@ -1438,760 +2233,401 @@ msgstr "" " -o, --option=NOM[=VALEUR] passe l'option NOM avec la valeur optionnelle\n" " VALEUR au plugin en sortie\n" -#: pg_recvlogical.c:95 +#: pg_recvlogical.c:103 #, c-format msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n" msgstr "" " -P, --plugin=PLUGIN utilise le plugin PLUGIN en sortie (par défaut\n" " %s)\n" -#: pg_recvlogical.c:98 +#: pg_recvlogical.c:106 #, c-format msgid " -S, --slot=SLOTNAME name of the logical replication slot\n" msgstr " -S, --slot=SLOT nom du slot de réplication logique\n" -#: pg_recvlogical.c:99 +#: pg_recvlogical.c:107 #, c-format msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n" msgstr " -t, --two-phase active le décodage des transactions préparées lors de la création d'un slot\n" -#: pg_recvlogical.c:104 +#: pg_recvlogical.c:112 #, c-format msgid " -d, --dbname=DBNAME database to connect to\n" msgstr " -d, --dbname=BASE base de données de connexion\n" -#: pg_recvlogical.c:137 +#: pg_recvlogical.c:145 #, c-format msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)" msgstr "confirmation d'écriture jusqu'à %X/%X et de synchronisation jusqu'à %X/%X (slot %s)" -#: pg_recvlogical.c:161 receivelog.c:366 +#: pg_recvlogical.c:169 receivelog.c:360 #, c-format msgid "could not send feedback packet: %s" msgstr "n'a pas pu envoyer le paquet d'informations en retour : %s" -#: pg_recvlogical.c:229 +#: pg_recvlogical.c:239 #, c-format msgid "starting log streaming at %X/%X (slot %s)" msgstr "commence le flux des journaux à %X/%X (slot %s)" -#: pg_recvlogical.c:271 +#: pg_recvlogical.c:281 #, c-format msgid "streaming initiated" msgstr "flux lancé" -#: pg_recvlogical.c:335 +#: pg_recvlogical.c:346 #, c-format msgid "could not open log file \"%s\": %m" msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m" -#: pg_recvlogical.c:364 receivelog.c:889 +#: pg_recvlogical.c:375 receivelog.c:882 #, c-format msgid "invalid socket: %s" msgstr "socket invalide : %s" -#: pg_recvlogical.c:417 receivelog.c:917 +#: pg_recvlogical.c:428 receivelog.c:910 #, c-format msgid "%s() failed: %m" msgstr "échec de %s() : %m" -#: pg_recvlogical.c:424 receivelog.c:967 +#: pg_recvlogical.c:435 receivelog.c:959 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "n'a pas pu recevoir des données du flux de WAL : %s" -#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011 -#: receivelog.c:1074 +#: pg_recvlogical.c:477 pg_recvlogical.c:528 receivelog.c:1003 +#: receivelog.c:1066 #, c-format msgid "streaming header too small: %d" msgstr "en-tête de flux trop petit : %d" -#: pg_recvlogical.c:501 receivelog.c:849 +#: pg_recvlogical.c:512 receivelog.c:843 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "entête non reconnu du flux : « %c »" -#: pg_recvlogical.c:555 pg_recvlogical.c:567 +#: pg_recvlogical.c:566 pg_recvlogical.c:578 #, c-format msgid "could not write %d bytes to log file \"%s\": %m" msgstr "n'a pas pu écrire %d octets dans le journal de transactions « %s » : %m" -#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685 +#: pg_recvlogical.c:636 receivelog.c:642 receivelog.c:679 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "fin inattendue du flux de réplication : %s" -#: pg_recvlogical.c:780 +#: pg_recvlogical.c:796 #, c-format msgid "could not parse start position \"%s\"" msgstr "n'a pas pu analyser la position de départ « %s »" -#: pg_recvlogical.c:858 +#: pg_recvlogical.c:874 #, c-format msgid "no slot specified" msgstr "aucun slot de réplication indiqué" -#: pg_recvlogical.c:865 +#: pg_recvlogical.c:881 #, c-format msgid "no target file specified" msgstr "aucun fichier cible indiqué" -#: pg_recvlogical.c:872 +#: pg_recvlogical.c:888 #, c-format msgid "no database specified" msgstr "aucune base de données indiquée" -#: pg_recvlogical.c:879 +#: pg_recvlogical.c:895 #, c-format msgid "at least one action needs to be specified" msgstr "au moins une action doit être indiquée" -#: pg_recvlogical.c:886 +#: pg_recvlogical.c:902 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "ne peut pas utiliser --create-slot ou --start avec --drop-slot" -#: pg_recvlogical.c:893 +#: pg_recvlogical.c:909 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "ne peut pas utiliser --create-slot ou --drop-slot avec --startpos" -#: pg_recvlogical.c:900 +#: pg_recvlogical.c:916 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos peut seulement être spécifié avec --start" -#: pg_recvlogical.c:907 +#: pg_recvlogical.c:923 #, c-format msgid "--two-phase may only be specified with --create-slot" msgstr "--two-phase peut seulement être spécifié avec --create-slot" -#: pg_recvlogical.c:939 +#: pg_recvlogical.c:956 #, c-format msgid "could not establish database-specific replication connection" msgstr "n'a pas pu établir une connexion de réplication spécifique à la base" -#: pg_recvlogical.c:1033 +#: pg_recvlogical.c:1056 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "position finale %X/%X atteinte par keepalive" -#: pg_recvlogical.c:1036 +#: pg_recvlogical.c:1061 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "position finale %X/%X atteinte à l'enregistrement WAL %X/%X" -#: receivelog.c:68 +#: receivelog.c:66 #, c-format msgid "could not create archive status file \"%s\": %s" msgstr "n'a pas pu créer le fichier de statut d'archivage « %s » : %s" -#: receivelog.c:75 +#: receivelog.c:73 #, c-format msgid "could not close archive status file \"%s\": %s" msgstr "n'a pas pu fermer le fichier de statut d'archivage « %s » : %s" -#: receivelog.c:123 +#: receivelog.c:122 #, c-format msgid "could not get size of write-ahead log file \"%s\": %s" msgstr "n'a pas pu obtenir la taille du journal de transactions « %s » : %s" -#: receivelog.c:134 +#: receivelog.c:133 #, c-format msgid "could not open existing write-ahead log file \"%s\": %s" msgstr "n'a pas pu ouvrir le journal des transactions « %s » existant : %s" -#: receivelog.c:143 +#: receivelog.c:142 #, c-format msgid "could not fsync existing write-ahead log file \"%s\": %s" msgstr "n'a pas pu synchroniser sur disque le journal de transactions « %s » existant : %s" -#: receivelog.c:158 +#: receivelog.c:157 #, c-format msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d" msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d" msgstr[0] "le journal de transactions « %s » comprend %zd octet, cela devrait être 0 ou %d" msgstr[1] "le journal de transactions « %s » comprend %zd octets, cela devrait être 0 ou %d" -#: receivelog.c:174 +#: receivelog.c:175 #, c-format msgid "could not open write-ahead log file \"%s\": %s" msgstr "n'a pas pu ouvrir le journal de transactions « %s » : %s" -#: receivelog.c:208 -#, c-format -msgid "could not determine seek position in file \"%s\": %s" -msgstr "n'a pas pu déterminer la position de recherche dans le fichier d'archive « %s » : %s" - -#: receivelog.c:223 +#: receivelog.c:216 #, c-format msgid "not renaming \"%s\", segment is not complete" msgstr "pas de renommage de « %s », le segment n'est pas complet" -#: receivelog.c:234 receivelog.c:323 receivelog.c:694 +#: receivelog.c:227 receivelog.c:317 receivelog.c:688 #, c-format msgid "could not close file \"%s\": %s" msgstr "n'a pas pu fermer le fichier « %s » : %s" -#: receivelog.c:295 +#: receivelog.c:288 #, c-format msgid "server reported unexpected history file name for timeline %u: %s" msgstr "le serveur a renvoyé un nom de fichier historique inattendu pour la timeline %u : %s" -#: receivelog.c:303 +#: receivelog.c:297 #, c-format msgid "could not create timeline history file \"%s\": %s" msgstr "n'a pas pu créer le fichier historique de la timeline « %s » : %s" -#: receivelog.c:310 +#: receivelog.c:304 #, c-format msgid "could not write timeline history file \"%s\": %s" msgstr "n'a pas pu écrire dans le fichier historique de la timeline « %s » : %s" -#: receivelog.c:400 +#: receivelog.c:394 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions older than %s" msgstr "version %s du serveur incompatible ; le client ne supporte pas le streaming de versions plus anciennes que %s" -#: receivelog.c:409 +#: receivelog.c:403 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions newer than %s" msgstr "version %s du serveur incompatible ; le client ne supporte pas le streaming de versions plus récentes que %s" -#: receivelog.c:514 +#: receivelog.c:508 #, c-format msgid "system identifier does not match between base backup and streaming connection" msgstr "l'identifiant système ne correspond pas entre la sauvegarde des fichiers et la connexion de réplication" -#: receivelog.c:522 +#: receivelog.c:516 #, c-format msgid "starting timeline %u is not present in the server" msgstr "la timeline %u de départ n'est pas dans le serveur" -#: receivelog.c:561 +#: receivelog.c:555 #, c-format msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields" msgstr "réponse inattendue à la commande TIMELINE_HISTORY : a récupéré %d lignes et %d champs, alors qu'il attendait %d lignes et %d champs" -#: receivelog.c:632 +#: receivelog.c:626 #, c-format msgid "server reported unexpected next timeline %u, following timeline %u" msgstr "le serveur a renvoyé une timeline suivante %u inattendue, après la timeline %u" -#: receivelog.c:638 +#: receivelog.c:632 #, c-format msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X" msgstr "le serveur a arrêté l'envoi de la timeline %u à %X/%X, mais a indiqué que la timeline suivante, %u, commence à %X/%X" -#: receivelog.c:678 +#: receivelog.c:672 #, c-format msgid "replication stream was terminated before stop point" msgstr "le flux de réplication a été abandonné avant d'arriver au point d'arrêt" -#: receivelog.c:724 +#: receivelog.c:718 #, c-format msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields" msgstr "ensemble de résultats inattendu après la fin de la timeline : a récupéré %d lignes et %d champs, alors qu'il attendait %d lignes et %d champs" -#: receivelog.c:733 +#: receivelog.c:727 #, c-format msgid "could not parse next timeline's starting point \"%s\"" msgstr "n'a pas pu analyser la position de départ de la prochaine timeline « %s »" -#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205 +#: receivelog.c:775 receivelog.c:1022 walmethods.c:1206 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %s" -#: receivelog.c:1091 +#: receivelog.c:1083 #, c-format msgid "received write-ahead log record for offset %u with no file open" msgstr "a reçu l'enregistrement du journal de transactions pour le décalage %u sans fichier ouvert" -#: receivelog.c:1101 +#: receivelog.c:1093 #, c-format msgid "got WAL data offset %08x, expected %08x" msgstr "a obtenu le décalage %08x pour les données du journal, attendait %08x" -#: receivelog.c:1135 +#: receivelog.c:1128 #, c-format msgid "could not write %d bytes to WAL file \"%s\": %s" msgstr "n'a pas pu écrire %d octets dans le journal de transactions « %s » : %s" -#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230 +#: receivelog.c:1153 receivelog.c:1193 receivelog.c:1222 #, c-format msgid "could not send copy-end packet: %s" msgstr "n'a pas pu envoyer le paquet de fin de copie : %s" -#: streamutil.c:159 +#: streamutil.c:162 msgid "Password: " msgstr "Mot de passe : " -#: streamutil.c:182 +#: streamutil.c:189 #, c-format msgid "could not connect to server" msgstr "n'a pas pu se connecter au serveur" -#: streamutil.c:225 +#: streamutil.c:230 #, c-format -msgid "could not clear search_path: %s" -msgstr "n'a pas pu effacer search_path : %s" +msgid "could not clear \"search_path\": %s" +msgstr "n'a pas pu effacer « search_path » : %s" -#: streamutil.c:241 +#: streamutil.c:246 #, c-format -msgid "could not determine server setting for integer_datetimes" -msgstr "n'a pas pu déterminer la configuration serveur de integer_datetimes" +msgid "could not determine server setting for \"integer_datetimes\"" +msgstr "n'a pas pu déterminer la configuration serveur de « integer_datetimes »" -#: streamutil.c:248 +#: streamutil.c:253 #, c-format -msgid "integer_datetimes compile flag does not match server" -msgstr "l'option de compilation integer_datetimes ne correspond pas au serveur" +msgid "\"integer_datetimes\" compile flag does not match server" +msgstr "l'option de compilation « integer_datetimes » ne correspond pas au serveur" -#: streamutil.c:299 +#: streamutil.c:372 #, c-format msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "n'a pas pu récupéré la taille d'un segment WAL : a obtenu %d lignes et %d champs, attendait %d lignes et %d champs (ou plus)" -#: streamutil.c:309 +#: streamutil.c:382 #, c-format msgid "WAL segment size could not be parsed" msgstr "la taille du segment WAL n'a pas pu être analysée" -#: streamutil.c:327 +#: streamutil.c:400 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes" -msgstr[0] "la taille d'un WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go mais le serveur distant a rapporté une valeur de %d octet" -msgstr[1] "la taille d'un WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go mais le serveur distant a rapporté une valeur de %d octets" +msgid "remote server reported invalid WAL segment size (%d byte)" +msgid_plural "remote server reported invalid WAL segment size (%d bytes)" +msgstr[0] "le serveur distant a rapporté une taille invalide du segment WAL (%d octet)" +msgstr[1] "le serveur distant a rapporté une taille invalide du segment WAL (%d octets)" -#: streamutil.c:372 +#: streamutil.c:404 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go." + +#: streamutil.c:446 #, c-format msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "n'a pas pu récupérer les options d'accès du groupe : a obtenu %d lignes et %d champs, attendait %d lignes et %d champs (ou plus)" -#: streamutil.c:381 +#: streamutil.c:455 #, c-format msgid "group access flag could not be parsed: %s" msgstr "l'option d'accès du groupe n'a pas pu être analysé : %s" -#: streamutil.c:424 streamutil.c:461 +#: streamutil.c:498 streamutil.c:535 #, c-format msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "n'a pas pu identifier le système : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs (ou plus)." -#: streamutil.c:513 +#: streamutil.c:587 #, c-format msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "n'a pas pu lire le slot de réplication « %s » : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs" -#: streamutil.c:525 +#: streamutil.c:599 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "le slot de réplication « %s » n'existe pas" -#: streamutil.c:536 +#: streamutil.c:610 #, c-format msgid "expected a physical replication slot, got type \"%s\" instead" msgstr "attendait un slot de réplication physique, a obtenu le type « %s » à la place" -#: streamutil.c:550 +#: streamutil.c:624 #, c-format msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" msgstr "n'a pas pu analyser le champ restart_lsn « %s » pour le slot de réplication « %s »" -#: streamutil.c:667 +#: streamutil.c:741 #, c-format msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "n'a pas pu créer le slot de réplication « %s » : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs" -#: streamutil.c:711 +#: streamutil.c:785 #, c-format msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "n'a pas pu supprimer le slot de réplication « %s » : a récupéré %d lignes et %d champs, attendait %d lignes et %d champs" -#: walmethods.c:720 walmethods.c:1267 +#: walmethods.c:726 walmethods.c:1269 msgid "could not compress data" msgstr "n'a pas pu compresser les données" -#: walmethods.c:749 +#: walmethods.c:755 msgid "could not reset compression stream" msgstr "n'a pas pu réinitialiser le flux de compression" -#: walmethods.c:880 +#: walmethods.c:892 msgid "implementation error: tar files can't have more than one open file" msgstr "erreur d'implémentation : les fichiers tar ne peuvent pas avoir plus d'un fichier ouvert" -#: walmethods.c:894 +#: walmethods.c:907 msgid "could not create tar header" msgstr "n'a pas pu créer l'en-tête du fichier tar" -#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183 +#: walmethods.c:924 walmethods.c:965 walmethods.c:1171 walmethods.c:1184 msgid "could not change compression parameters" msgstr "n'a pas pu modifier les paramètres de compression" -#: walmethods.c:1055 +#: walmethods.c:1056 msgid "unlink not supported with compression" msgstr "suppression non supportée avec la compression" -#: walmethods.c:1291 +#: walmethods.c:1293 msgid "could not close compression stream" msgstr "n'a pas pu fermer le flux de compression" - -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" - -#, c-format -#~ msgid "" -#~ " --compression-method=METHOD\n" -#~ " method to compress logs\n" -#~ msgstr "" -#~ " --compression-method=METHODE\n" -#~ " méthode pour compresser les journaux\n" - -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide et quitte\n" - -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version et quitte\n" - -#~ msgid " -?, --help show this help, then exit\n" -#~ msgstr " -?, --help affiche cette aide puis quitte\n" - -#~ msgid " -V, --version output version information, then exit\n" -#~ msgstr " -V, --version affiche la version puis quitte\n" - -#, c-format -#~ msgid " -Z, --compress=0-9 compress tar output with given compression level\n" -#~ msgstr "" -#~ " -Z, --compress=0-9 compresse la sortie tar avec le niveau de\n" -#~ " compression indiqué\n" - -#, c-format -#~ msgid " -Z, --compress=1-9 compress logs with given compression level\n" -#~ msgstr "" -#~ " -Z, --compress=0-9 compresse les journaux avec le niveau de\n" -#~ " compression indiqué\n" - -#~ msgid " -x, --xlog include required WAL files in backup (fetch mode)\n" -#~ msgstr "" -#~ " -x, --xlog inclut les journaux de transactions nécessaires\n" -#~ " dans la sauvegarde (mode fetch)\n" - -#~ msgid "%s: WAL directory \"%s\" not removed at user's request\n" -#~ msgstr "%s : répertoire des journaux de transactions « %s » non supprimé à la demande de l'utilisateur\n" - -#~ msgid "%s: WAL directory location must be an absolute path\n" -#~ msgstr "" -#~ "%s : l'emplacement du répertoire des journaux de transactions doit être\n" -#~ "indiqué avec un chemin absolu\n" - -#~ msgid "%s: WAL streaming can only be used in plain mode\n" -#~ msgstr "%s : le flux de journaux de transactions peut seulement être utilisé en mode plain\n" - -#~ msgid "%s: cannot specify both --xlog and --xlog-method\n" -#~ msgstr "%s : ne peut pas spécifier à la fois --xlog et --xlog-method\n" - -#~ msgid "%s: child process did not exit normally\n" -#~ msgstr "%s : le processus fils n'a pas quitté normalement\n" - -#~ msgid "%s: child process exited with error %d\n" -#~ msgstr "%s : le processus fils a quitté avec le code erreur %d\n" - -#~ msgid "%s: could not access directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n" - -#~ msgid "%s: could not clear search_path: %s" -#~ msgstr "%s : n'a pas pu effacer search_path : %s" - -#~ msgid "%s: could not close directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n" - -#~ msgid "%s: could not close file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu fermer le fichier « %s » : %s\n" - -#~ msgid "%s: could not close file %s: %s\n" -#~ msgstr "%s : n'a pas pu fermer le fichier %s : %s\n" - -#~ msgid "%s: could not connect to server\n" -#~ msgstr "%s : n'a pas pu se connecter au serveur\n" - -#~ msgid "%s: could not connect to server: %s" -#~ msgstr "%s : n'a pas pu se connecter au serveur : %s" - -#~ msgid "%s: could not create archive status file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le fichier de statut d'archivage « %s » : %s\n" - -#~ msgid "%s: could not create directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le répertoire « %s » : %s\n" - -#~ msgid "%s: could not create file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le fichier « %s » : %s\n" - -#~ msgid "%s: could not create symbolic link \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le lien symbolique « %s » : %s\n" - -#~ msgid "%s: could not fsync file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n" - -#~ msgid "%s: could not fsync log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu synchroniser sur disque le fichier « %s » : %s\n" - -#~ msgid "%s: could not get current position in file %s: %s\n" -#~ msgstr "%s : n'a pas pu obtenir la position courant dans le fichier %s : %s\n" - -#~ msgid "%s: could not identify system: %s" -#~ msgstr "%s : n'a pas pu identifier le système : %s" - -#~ msgid "%s: could not identify system: %s\n" -#~ msgstr "%s : n'a pas pu identifier le système : %s\n" - -#~ msgid "%s: could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields\n" -#~ msgstr "" -#~ "%s : n'a pas pu identifier le système, a récupéré %d lignes et %d champs,\n" -#~ "attendait %d lignes et %d champs (ou plus)\n" - -#~ msgid "%s: could not open WAL segment %s: %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le segment WAL %s : %s\n" - -#~ msgid "%s: could not open directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" - -#~ msgid "%s: could not open file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" - -#~ msgid "%s: could not open log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n" - -#~ msgid "%s: could not open timeline history file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le journal historique de la timeline « %s » : %s\n" - -#~ msgid "%s: could not open write-ahead log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le journal de transactions « %s » : %s\n" - -#~ msgid "%s: could not pad WAL segment %s: %s\n" -#~ msgstr "%s : n'a pas pu terminer le segment WAL %s : %s\n" - -#~ msgid "%s: could not pad transaction log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu remplir de zéros le journal de transactions « %s » : %s\n" - -#~ msgid "%s: could not parse file mode\n" -#~ msgstr "%s : n'a pas pu analyser le mode du fichier\n" - -#~ msgid "%s: could not parse file size\n" -#~ msgstr "%s : n'a pas pu analyser la taille du fichier\n" - -#~ msgid "%s: could not parse log start position from value \"%s\"\n" -#~ msgstr "%s : n'a pas pu analyser la position de départ des WAL à partir de la valeur « %s »\n" - -#~ msgid "%s: could not parse transaction log file name \"%s\"\n" -#~ msgstr "%s : n'a pas pu analyser le nom du journal de transactions « %s »\n" - -#~ msgid "%s: could not read copy data: %s\n" -#~ msgstr "%s : n'a pas pu lire les données du COPY : %s\n" - -#~ msgid "%s: could not read directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" - -#~ msgid "%s: could not receive data from WAL stream: %s" -#~ msgstr "%s : n'a pas pu recevoir des données du flux de WAL : %s" - -#~ msgid "%s: could not rename file \"%s\" to \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu renommer le fichier « %s » en « %s » : %s\n" - -#~ msgid "%s: could not rename file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu renommer le fichier « %s » : %s\n" - -#~ msgid "%s: could not seek back to beginning of WAL segment %s: %s\n" -#~ msgstr "%s : n'a pas pu se déplacer au début du segment WAL %s : %s\n" - -#~ msgid "%s: could not seek to beginning of transaction log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu rechercher le début du journal de transaction « %s » : %s\n" - -#~ msgid "%s: could not send base backup command: %s" -#~ msgstr "%s : n'a pas pu envoyer la commande de sauvegarde de base : %s" - -#~ msgid "%s: could not set permissions on directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas configurer les droits sur le répertoire « %s » : %s\n" - -#~ msgid "%s: could not set permissions on file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu configurer les droits sur le fichier « %s » : %s\n" - -#~ msgid "%s: could not stat WAL segment %s: %s\n" -#~ msgstr "%s : n'a pas pu récupérer les informations sur le segment WAL %s : %s\n" - -#~ msgid "%s: could not stat file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n" - -#~ msgid "%s: could not stat transaction log file \"%s\": %s\n" -#~ msgstr "" -#~ "%s : n'a pas pu récupérer les informations sur le journal de transactions\n" -#~ "« %s » : %s\n" - -#~ msgid "%s: could not write to file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu écrire dans le fichier « %s » : %s\n" - -#~ msgid "%s: data directory \"%s\" not removed at user's request\n" -#~ msgstr "%s : répertoire des données « %s » non supprimé à la demande de l'utilisateur\n" - -#~ msgid "%s: directory \"%s\" exists but is not empty\n" -#~ msgstr "%s : le répertoire « %s » existe mais n'est pas vide\n" - -#~ msgid "%s: failed to remove WAL directory\n" -#~ msgstr "%s : échec de la suppression du répertoire des journaux de transactions\n" - -#~ msgid "%s: failed to remove contents of WAL directory\n" -#~ msgstr "%s : échec de la suppression du contenu du répertoire des journaux de transactions\n" - -#~ msgid "%s: failed to remove contents of data directory\n" -#~ msgstr "%s : échec de la suppression du contenu du répertoire des données\n" - -#~ msgid "%s: failed to remove data directory\n" -#~ msgstr "%s : échec de la suppression du répertoire des données\n" - -#~ msgid "%s: invalid format of xlog location: %s\n" -#~ msgstr "%s : format invalide de l'emplacement du journal de transactions : %s\n" - -#~ msgid "%s: invalid port number \"%s\"\n" -#~ msgstr "%s : numéro de port invalide : « %s »\n" - -#~ msgid "%s: invalid socket: %s" -#~ msgstr "%s : socket invalide : %s" - -#~ msgid "%s: keepalive message has incorrect size %d\n" -#~ msgstr "%s : le message keepalive a une taille %d incorrecte\n" - -#~ msgid "%s: no start point returned from server\n" -#~ msgstr "%s : aucun point de redémarrage renvoyé du serveur\n" - -#~ msgid "%s: out of memory\n" -#~ msgstr "%s : mémoire épuisée\n" - -#~ msgid "%s: removing WAL directory \"%s\"\n" -#~ msgstr "%s : suppression du répertoire des journaux de transactions « %s »\n" - -#~ msgid "%s: removing contents of WAL directory \"%s\"\n" -#~ msgstr "%s : suppression du contenu du répertoire des journaux de transactions « %s »\n" - -#~ msgid "%s: removing contents of data directory \"%s\"\n" -#~ msgstr "%s : suppression du contenu du répertoire des données « %s »\n" - -#~ msgid "%s: removing data directory \"%s\"\n" -#~ msgstr "%s : suppression du répertoire des données « %s »\n" - -#~ msgid "%s: select() failed: %s\n" -#~ msgstr "%s : échec de select() : %s\n" - -#~ msgid "%s: socket not open" -#~ msgstr "%s : socket non ouvert" - -#~ msgid "%s: symlinks are not supported on this platform\n" -#~ msgstr "%s : les liens symboliques ne sont pas supportés sur cette plateforme\n" - -#~ msgid "%s: timeline does not match between base backup and streaming connection\n" -#~ msgstr "" -#~ "%s : la timeline ne correspond pas entre la sauvegarde des fichiers et la\n" -#~ "connexion de réplication\n" - -#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" -#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" - -#~ msgid "--create-slot and --no-slot are incompatible options" -#~ msgstr "--create-slot et --no-slot sont des options incompatibles" - -#~ msgid "--no-manifest and --manifest-checksums are incompatible options" -#~ msgstr "--no-manifest et --manifest-checksums sont des options incompatibles" - -#~ msgid "--no-manifest and --manifest-force-encode are incompatible options" -#~ msgstr "--no-manifest et --manifest-force-encode sont des options incompatibles" - -#~ msgid "--progress and --no-estimate-size are incompatible options" -#~ msgstr "--progress et --no-estimate-size sont des options incompatibles" - -#, c-format -#~ msgid "This build does not support compression with %s." -#~ msgstr "Cette construction ne supporte pas la compression avec %s." - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayer « %s --help » pour plus d'informations.\n" - -#, c-format -#~ msgid "cannot use --compress with --compression-method=%s" -#~ msgstr "ne peut pas utiliser --compress avec --compression-method=%s" - -#, c-format -#~ msgid "could not check file \"%s\"" -#~ msgstr "n'a pas pu vérifier le fichier « %s »" - -#~ msgid "could not connect to server: %s" -#~ msgstr "n'a pas pu se connecter au serveur : %s" - -#, c-format -#~ msgid "could not find replication slot \"%s\"" -#~ msgstr "n'a pas pu trouver le slot de réplication « %s »" - -#, c-format -#~ msgid "could not get write-ahead log end position from server: %s" -#~ msgstr "n'a pas pu obtenir la position finale des journaux de transactions à partir du serveur : %s" - -#~ msgid "deflate failed" -#~ msgstr "échec en décompression" - -#~ msgid "deflateEnd failed" -#~ msgstr "échec de deflateEnd" - -#~ msgid "deflateInit2 failed" -#~ msgstr "échec de deflateInit2" - -#~ msgid "deflateParams failed" -#~ msgstr "échec de deflateParams" - -#~ msgid "deflateReset failed" -#~ msgstr "échec de deflateReset" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatal : " - -#, c-format -#~ msgid "invalid compression level \"%s\"" -#~ msgstr "niveau de compression « %s » invalide" - -#, c-format -#~ msgid "invalid fsync interval \"%s\"" -#~ msgstr "intervalle fsync « %s » invalide" - -#, c-format -#~ msgid "invalid port number \"%s\"" -#~ msgstr "numéro de port invalide : « %s »" - -#, c-format -#~ msgid "invalid status interval \"%s\"" -#~ msgstr "intervalle « %s » invalide du statut" - -#, c-format -#~ msgid "invalid tar block header size: %zu" -#~ msgstr "taille invalide de l'en-tête de bloc du fichier tar : %zu" - -#, c-format -#~ msgid "log streamer with pid %d exiting" -#~ msgstr "le processus d'envoi des journaux de PID %d quitte" - -#, c-format -#~ msgid "no value specified for --compress, switching to default" -#~ msgstr "aucune valeur indiquée pour --compression, utilise la valeur par défaut" - -#~ msgid "select() failed: %m" -#~ msgstr "échec de select() : %m" - -#, c-format -#~ msgid "unknown compression option \"%s\"" -#~ msgstr "option de compression « %s » inconnue" - -#, c-format -#~ msgid "unrecognized link indicator \"%c\"" -#~ msgstr "indicateur de lien « %c » non reconnu" diff --git a/src/bin/pg_basebackup/po/ja.po b/src/bin/pg_basebackup/po/ja.po index b27acff7fee80..098c300fa6260 100644 --- a/src/bin/pg_basebackup/po/ja.po +++ b/src/bin/pg_basebackup/po/ja.po @@ -1,7 +1,7 @@ # pg_basebackup.po # Japanese message translation file for pg_basebackup # -# Copyright (C) 2013-2022 PostgreSQL Global Development Group +# Copyright (C) 2013-2024 PostgreSQL Global Development Group # # This file is distributed under the same license as the PostgreSQL package. # @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_basebackup (PostgreSQL 16)\n" +"Project-Id-Version: pg_basebackup (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 09:35+0900\n" -"PO-Revision-Date: 2023-05-22 09:48+0900\n" +"POT-Creation-Date: 2025-02-28 10:05+0900\n" +"PO-Revision-Date: 2025-03-03 17:28+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -94,6 +94,64 @@ msgstr "圧縮アルゴリズム\"%s\"ã¯ãƒ¯ãƒ¼ã‚«ãƒ¼æ•°ã‚’å—ã‘付ã‘ã¾ã›ã‚“ msgid "compression algorithm \"%s\" does not support long-distance mode" msgstr "圧縮アルゴリズム\"%s\"ã¯é•·è·é›¢ãƒ¢ãƒ¼ãƒ‰ã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ファイル\"%s\"を読ã¿è¾¼ã¿ç”¨ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:110 pg_basebackup.c:1873 +#: pg_receivewal.c:402 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ファイル\"%s\"ã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$zuãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: bbstreamer_file.c:138 pg_recvlogical.c:650 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒåˆã£ã¦ã„ã¾ã›ã‚“" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒç•°ãªã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚\n" +"pg_controlファイルを格ç´ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒæœ¬ãƒ—ログラムã§ä½¿ç”¨\n" +"ã•れるもã®ã¨ä¸€è‡´ã—ãªã„よã†ã§ã™ã€‚ã“ã®å ´åˆä»¥ä¸‹ã®çµæžœã¯ä¸æ­£ç¢ºã«ãªã‚Šã¾ã™ã€‚ã¾ãŸã€\n" +"PostgreSQLインストレーションã¯ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨äº’æ›æ€§ãŒãªããªã‚Šã¾ã™ã€‚" + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: pg_basebackup.c:1846 pg_receivewal.c:386 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 pg_recvlogical.c:204 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format @@ -105,39 +163,69 @@ msgstr "メモリä¸è¶³ã§ã™\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ãƒã‚¤ãƒ³ã‚¿ã‚’複製ã§ãã¾ã›ã‚“ (内部エラー)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:447 -#: pg_receivewal.c:319 pg_recvlogical.c:339 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "ファイル\"%s\"ã«å¯¾ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã‚’åŒæœŸã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_receivewal.c:319 pg_recvlogical.c:352 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: ../../common/file_utils.c:162 pg_receivewal.c:242 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ã“ã®ãƒ“ルドã§ã¯åŒæœŸæ–¹å¼\"%s\"をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_receivewal.c:242 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/file_utils.c:196 pg_receivewal.c:471 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_receivewal.c:471 #, c-format msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/file_utils.c:228 ../../common/file_utils.c:287 -#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121 -#: pg_receivewal.c:386 +#: ../../common/file_utils.c:498 pg_basebackup.c:2344 walmethods.c:462 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/file_utils.c:299 ../../common/file_utils.c:369 -#: pg_recvlogical.c:194 +#: ../../common/restricted_token.c:60 #, c-format -msgid "could not fsync file \"%s\": %m" -msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" +msgid "could not open process token: error code %lu" +msgstr "プロセストークンをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" -#: ../../common/file_utils.c:379 pg_basebackup.c:2237 walmethods.c:462 +#: ../../common/restricted_token.c:74 #, c-format -msgid "could not rename file \"%s\" to \"%s\": %m" -msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" +msgid "could not allocate SIDs: error code %lu" +msgstr "SIDを割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" + +#: ../../common/restricted_token.c:94 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "制é™ä»˜ãトークンを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" + +#: ../../common/restricted_token.c:115 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "コマンド\"%s\"ã®ãŸã‚ã®ãƒ—ロセスを起動ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" + +#: ../../common/restricted_token.c:153 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "制é™ä»˜ãトークンã§å†å®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—ãŸ: %lu" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "サブプロセスã®çµ‚了コードをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" #: ../../fe_utils/option_utils.c:69 #, c-format @@ -149,51 +237,62 @@ msgstr "オプション\"%2$s\"ã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\"" msgid "%s must be in range %d..%d" msgstr "%sã¯%d..%dã®ç¯„囲ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1609 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "èªè­˜ã§ããªã„åŒæœŸæ–¹å¼: %s" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 pg_basebackup.c:1636 streamutil.c:334 #, c-format msgid "out of memory" msgstr "メモリä¸è¶³ã§ã™" -#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121 -#: bbstreamer_file.c:258 pg_basebackup.c:1406 pg_basebackup.c:1700 +#: ../../fe_utils/recovery_gen.c:143 bbstreamer_file.c:121 +#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727 #, c-format msgid "could not write to file \"%s\": %m" msgstr "ファイル\"%s\"を書ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360 -#: pg_basebackup.c:1470 pg_basebackup.c:1679 +#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:361 +#: pg_basebackup.c:1497 pg_basebackup.c:1706 #, c-format msgid "could not create file \"%s\": %m" msgstr "ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: bbstreamer_file.c:138 pg_recvlogical.c:633 +#: ../../fe_utils/string_utils.c:587 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "シェルコマンドã®å¼•æ•°ã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "データベースåã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" #: bbstreamer_file.c:275 #, c-format msgid "unexpected state while extracting archive" msgstr "ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã®æŠ½å‡ºä¸­ã«æƒ³å®šå¤–ã®çŠ¶æ…‹" -#: bbstreamer_file.c:320 pg_basebackup.c:686 pg_basebackup.c:730 +#: bbstreamer_file.c:321 pg_basebackup.c:698 pg_basebackup.c:712 +#: pg_basebackup.c:757 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: bbstreamer_file.c:325 +#: bbstreamer_file.c:326 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "ディレクトリ\"%s\"ã«æ¨©é™ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: bbstreamer_file.c:344 +#: bbstreamer_file.c:345 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "\"%s\"ã‹ã‚‰\"%s\"ã¸ã®ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: bbstreamer_file.c:364 +#: bbstreamer_file.c:365 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "ファイル\"%s\"ã®æ¨©é™ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" @@ -228,7 +327,7 @@ msgstr "圧縮ファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s" msgid "could not close compressed file \"%s\": %m" msgstr "圧縮ファイル\"%s\"をクローズã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: bbstreamer_gzip.c:245 walmethods.c:876 +#: bbstreamer_gzip.c:245 walmethods.c:880 #, c-format msgid "could not initialize compression library" msgstr "åœ§ç¸®ãƒ©ã‚¤ãƒ–ãƒ©ãƒªã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ" @@ -278,12 +377,12 @@ msgstr "tarファイル後続ブロックãŒ2ブロックを超ãˆã¦ã„ã¾ã™" msgid "unexpected state while parsing tar archive" msgstr "tarアーカイブã®ãƒ‘ãƒ¼ã‚¹ä¸­ã«æƒ³å®šå¤–ã®çŠ¶æ…‹" -#: bbstreamer_tar.c:296 +#: bbstreamer_tar.c:292 #, c-format msgid "tar member has empty name" msgstr "tarメンãƒãƒ¼ã®åå‰ãŒç©ºã§ã™" -#: bbstreamer_tar.c:328 +#: bbstreamer_tar.c:326 #, c-format msgid "COPY stream ended before last file was finished" msgstr "最後ã®ãƒ•ァイルãŒçµ‚ã‚ã‚‹å‰ã«COPYストリームãŒçµ‚了ã—ã¾ã—ãŸ" @@ -313,87 +412,87 @@ msgstr "é•·è·é›¢ãƒ¢ãƒ¼ãƒ‰ã‚’有効化ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" msgid "could not create zstd decompression context" msgstr "zstd伸張コンテクストを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_basebackup.c:238 +#: pg_basebackup.c:245 #, c-format msgid "removing data directory \"%s\"" msgstr "データディレクトリ\"%s\"を削除ã—ã¦ã„ã¾ã™" -#: pg_basebackup.c:240 +#: pg_basebackup.c:247 #, c-format msgid "failed to remove data directory" msgstr "データディレクトリã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: pg_basebackup.c:244 +#: pg_basebackup.c:251 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "データディレクトリ\"%s\"ã®å†…容を削除ã—ã¦ã„ã¾ã™" -#: pg_basebackup.c:246 +#: pg_basebackup.c:253 #, c-format msgid "failed to remove contents of data directory" msgstr "データディレクトリã®ä¸­èº«ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: pg_basebackup.c:251 +#: pg_basebackup.c:258 #, c-format msgid "removing WAL directory \"%s\"" msgstr "WAL ディレクトリ\"%s\"を削除ã—ã¦ã„ã¾ã™" -#: pg_basebackup.c:253 +#: pg_basebackup.c:260 #, c-format msgid "failed to remove WAL directory" msgstr "WAL ディレクトリã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: pg_basebackup.c:257 +#: pg_basebackup.c:264 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "WAL ディレクトリ\"%s\"ã®ä¸­èº«ã‚’削除ã—ã¦ã„ã¾ã™" -#: pg_basebackup.c:259 +#: pg_basebackup.c:266 #, c-format msgid "failed to remove contents of WAL directory" msgstr "WAL ディレクトリã®ä¸­èº«ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: pg_basebackup.c:265 +#: pg_basebackup.c:272 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "ユーザーã®è¦æ±‚ã«ã‚ˆã‚Šã€ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"を削除ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: pg_basebackup.c:268 +#: pg_basebackup.c:275 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "ユーザーã®è¦æ±‚ã«ã‚ˆã‚Šã€WAL ディレクトリ\"%s\"を削除ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: pg_basebackup.c:272 +#: pg_basebackup.c:279 #, c-format msgid "changes to tablespace directories will not be undone" msgstr "テーブル空間用ディレクトリã¸ã®å¤‰æ›´ã¯å–り消ã•れã¾ã›ã‚“" -#: pg_basebackup.c:324 +#: pg_basebackup.c:331 #, c-format msgid "directory name too long" msgstr "ディレクトリåãŒé•·ã™ãŽã¾ã™" -#: pg_basebackup.c:331 +#: pg_basebackup.c:338 #, c-format msgid "multiple \"=\" signs in tablespace mapping" msgstr "テーブル空間ã®ãƒžãƒƒãƒ”ングã«è¤‡æ•°ã®\"=\"記å·ãŒã‚りã¾ã™" -#: pg_basebackup.c:340 +#: pg_basebackup.c:347 #, c-format msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "テーブル空間ã®ãƒžãƒƒãƒ”ング形å¼\"%s\"ãŒä¸æ­£ã§ã™ã€‚\"æ—§DIR=æ–°DIR\"ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_basebackup.c:359 +#: pg_basebackup.c:366 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "テーブル空間ã®ãƒžãƒƒãƒ”ングã«ãŠã„ã¦ã€æ—§ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒçµ¶å¯¾ãƒ‘スã§ã¯ã‚りã¾ã›ã‚“: %s" -#: pg_basebackup.c:363 +#: pg_basebackup.c:370 #, c-format msgid "new directory is not an absolute path in tablespace mapping: %s" msgstr "テーブル空間ã®ãƒžãƒƒãƒ”ングã«ãŠã„ã¦ã€æ–°ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒçµ¶å¯¾ãƒ‘スã§ã¯ã‚りã¾ã›ã‚“: %s" -#: pg_basebackup.c:385 +#: pg_basebackup.c:392 #, c-format msgid "" "%s takes a base backup of a running PostgreSQL server.\n" @@ -402,17 +501,19 @@ msgstr "" "%sã¯å®Ÿè¡Œä¸­ã®PostgreSQLサーãƒãƒ¼ã®ãƒ™ãƒ¼ã‚¹ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’å–å¾—ã—ã¾ã™ã€‚\n" "\n" -#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76 +#: pg_basebackup.c:394 pg_createsubscriber.c:221 pg_receivewal.c:79 +#: pg_recvlogical.c:86 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77 +#: pg_basebackup.c:395 pg_createsubscriber.c:222 pg_receivewal.c:80 +#: pg_recvlogical.c:87 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [オプション]...\n" -#: pg_basebackup.c:389 +#: pg_basebackup.c:396 #, c-format msgid "" "\n" @@ -421,17 +522,26 @@ msgstr "" "\n" "出力を制御ã™ã‚‹ã‚ªãƒ—ション:\n" -#: pg_basebackup.c:390 +#: pg_basebackup.c:397 #, c-format msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n" msgstr " -D, --pgdata=DIRECTORY ベースãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå†…ã«æ ¼ç´\n" -#: pg_basebackup.c:391 +#: pg_basebackup.c:398 #, c-format msgid " -F, --format=p|t output format (plain (default), tar)\n" msgstr " -F, --format=p|t 出力フォーマット(プレイン(デフォルト)ã¾ãŸã¯tar)\n" -#: pg_basebackup.c:392 +#: pg_basebackup.c:399 +#, c-format +msgid "" +" -i, --incremental=OLDMANIFEST\n" +" take incremental backup\n" +msgstr "" +" -i, --incremental=OLDMANIFEST\n" +" 差分ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’å–å¾—ã™ã‚‹\n" + +#: pg_basebackup.c:401 #, c-format msgid "" " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" @@ -440,7 +550,7 @@ msgstr "" " -r, --max-rate=RATE データディレクトリ転é€ã®éš›ã®æœ€å¤§è»¢é€é€Ÿåº¦\n" " (kB/s å˜ä½ã€ã¾ãŸã¯ 接尾辞 \"k\" ã‹\"M\" を使用)\n" -#: pg_basebackup.c:394 +#: pg_basebackup.c:403 #, c-format msgid "" " -R, --write-recovery-conf\n" @@ -449,7 +559,7 @@ msgstr "" " -R, --write-recovery-conf\n" " レプリケーションã®ãŸã‚ã®è¨­å®šã‚’書ã込む\n" -#: pg_basebackup.c:396 +#: pg_basebackup.c:405 #, c-format msgid "" " -t, --target=TARGET[:DETAIL]\n" @@ -458,7 +568,7 @@ msgstr "" " -t, --target=ターゲット[:詳細]\n" " ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲット(クライアント以外ã®å ´åˆ)\n" -#: pg_basebackup.c:398 +#: pg_basebackup.c:407 #, c-format msgid "" " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" @@ -467,12 +577,12 @@ msgstr "" " -T, --tablespace-mapping=æ—§DIR=æ–°DIR\n" " テーブル空間を旧DIRã‹ã‚‰æ–°DIRã«ç§»å‹•ã™ã‚‹\n" -#: pg_basebackup.c:400 +#: pg_basebackup.c:409 #, c-format msgid " --waldir=WALDIR location for the write-ahead log directory\n" msgstr " --waldir=WALDIR 先行書ãè¾¼ã¿ãƒ­ã‚°ç”¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä½ç½®\n" -#: pg_basebackup.c:401 +#: pg_basebackup.c:410 #, c-format msgid "" " -X, --wal-method=none|fetch|stream\n" @@ -482,12 +592,12 @@ msgstr "" " è¦æ±‚ã•れãŸWALãƒ•ã‚¡ã‚¤ãƒ«ã‚’æŒ‡å®šã®æ–¹å¼ã§ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—\n" " ã«å«ã‚ã‚‹\n" -#: pg_basebackup.c:403 +#: pg_basebackup.c:412 #, c-format msgid " -z, --gzip compress tar output\n" msgstr " -z, --gzip tar ã®å‡ºåŠ›ã‚’åœ§ç¸®ã™ã‚‹\n" -#: pg_basebackup.c:404 +#: pg_basebackup.c:413 #, c-format msgid "" " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" @@ -496,12 +606,12 @@ msgstr "" " -Z, --compress=[{client|server}-]æ–¹å¼[:詳細]\n" " 指定ã«å¾“ã£ã¦ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã¾ãŸã¯ã‚µãƒ¼ãƒãƒ¼å´ã§åœ§ç¸®\n" -#: pg_basebackup.c:406 +#: pg_basebackup.c:415 #, c-format msgid " -Z, --compress=none do not compress tar output\n" msgstr " -Z, --compress=none tar出力を圧縮ã—ãªã„\n" -#: pg_basebackup.c:407 +#: pg_basebackup.c:416 #, c-format msgid "" "\n" @@ -510,56 +620,56 @@ msgstr "" "\n" "汎用オプション:\n" -#: pg_basebackup.c:408 +#: pg_basebackup.c:417 #, c-format msgid "" " -c, --checkpoint=fast|spread\n" -" set fast or spread checkpointing\n" +" set fast or spread (default) checkpointing\n" msgstr "" " -c, --checkpoint=fast|spread\n" -" 高速ã¾ãŸã¯åˆ†æ•£ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆå‡¦ç†ã®æŒ‡å®š\n" +" 高速ã¾ãŸã¯åˆ†æ•£(デフォルト)ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆå‡¦ç†ã‚’指定\n" -#: pg_basebackup.c:410 +#: pg_basebackup.c:419 #, c-format msgid " -C, --create-slot create replication slot\n" msgstr " -C, --create-slot æ–°ã—ã„レプリケーションスロットを作æˆã™ã‚‹\n" -#: pg_basebackup.c:411 +#: pg_basebackup.c:420 #, c-format msgid " -l, --label=LABEL set backup label\n" msgstr " -l, --label=LABEL ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ラベルã®è¨­å®š\n" -#: pg_basebackup.c:412 +#: pg_basebackup.c:421 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --noclean エラー発生後作æˆã—ãŸãƒ•ァイルã®å‰Šé™¤ã‚’行ã‚ãªã„\n" -#: pg_basebackup.c:413 +#: pg_basebackup.c:422 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --nosync ディスクã¸ã®å®‰å…¨ãªæ›¸ãè¾¼ã¿ã‚’待機ã—ãªã„\n" -#: pg_basebackup.c:414 +#: pg_basebackup.c:423 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress 進行状æ³ã®è¡¨ç¤º\n" -#: pg_basebackup.c:415 pg_receivewal.c:89 +#: pg_basebackup.c:424 pg_receivewal.c:89 #, c-format msgid " -S, --slot=SLOTNAME replication slot to use\n" msgstr " -S, --slot=スロットå 使用ã™ã‚‹ãƒ¬ãƒ—リケーションスロット\n" -#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98 +#: pg_basebackup.c:425 pg_receivewal.c:91 pg_recvlogical.c:108 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose 冗長メッセージã®å‡ºåŠ›\n" -#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99 +#: pg_basebackup.c:426 pg_receivewal.c:92 pg_recvlogical.c:109 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: pg_basebackup.c:418 +#: pg_basebackup.c:427 #, c-format msgid "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" @@ -568,7 +678,7 @@ msgstr "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" " 目録ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã«ä½¿ç”¨ã™ã‚‹ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ \n" -#: pg_basebackup.c:420 +#: pg_basebackup.c:429 #, c-format msgid "" " --manifest-force-encode\n" @@ -577,22 +687,22 @@ msgstr "" " --manifest-force-encode\n" " 目録中ã®å…¨ã¦ã®ãƒ•ァイルåã‚’16進エンコードã™ã‚‹\n" -#: pg_basebackup.c:422 +#: pg_basebackup.c:431 #, c-format msgid " --no-estimate-size do not estimate backup size in server side\n" msgstr " --no-estimate-size サーãƒãƒ¼å´ã§ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—サイズを見ç©ã‚‚らãªã„\n" -#: pg_basebackup.c:423 +#: pg_basebackup.c:432 #, c-format msgid " --no-manifest suppress generation of backup manifest\n" msgstr " --no-manifest ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録ã®ä½œæˆã‚’çœç•¥ã™ã‚‹\n" -#: pg_basebackup.c:424 +#: pg_basebackup.c:433 #, c-format msgid " --no-slot prevent creation of temporary replication slot\n" msgstr " --no-slot 一時レプリケーションスロットã®ä½œæˆã‚’行ã‚ãªã„\n" -#: pg_basebackup.c:425 +#: pg_basebackup.c:434 #, c-format msgid "" " --no-verify-checksums\n" @@ -601,12 +711,21 @@ msgstr "" " --no-verify-checksums\n" " ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’検証ã—ãªã„\n" -#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100 +#: pg_basebackup.c:436 +#, c-format +msgid "" +" --sync-method=METHOD\n" +" set method for syncing files to disk\n" +msgstr "" +" --sync-method=METHOD\n" +" ファイルをディスクã«åŒæœŸã•ã›ã‚‹æ–¹æ³•を指定\n" + +#: pg_basebackup.c:438 pg_receivewal.c:95 pg_recvlogical.c:110 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101 +#: pg_basebackup.c:439 pg_receivewal.c:96 pg_recvlogical.c:111 #, c-format msgid "" "\n" @@ -615,22 +734,22 @@ msgstr "" "\n" "接続オプション:\n" -#: pg_basebackup.c:429 pg_receivewal.c:97 +#: pg_basebackup.c:440 pg_receivewal.c:97 #, c-format msgid " -d, --dbname=CONNSTR connection string\n" msgstr " -d, --dbname=CONNSTR 接続文字列\n" -#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103 +#: pg_basebackup.c:441 pg_receivewal.c:98 pg_recvlogical.c:113 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME データベースサーãƒãƒ¼ãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚½ã‚±ãƒƒãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n" -#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104 +#: pg_basebackup.c:442 pg_receivewal.c:99 pg_recvlogical.c:114 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆç•ªå·\n" -#: pg_basebackup.c:432 +#: pg_basebackup.c:443 #, c-format msgid "" " -s, --status-interval=INTERVAL\n" @@ -639,22 +758,23 @@ msgstr "" " -s, --status-interval=INTERVAL\n" " サーãƒãƒ¼ã¸é€å‡ºã™ã‚‹ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒ‘ケットã®é–“éš”(ç§’å˜ä½)\n" -#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105 +#: pg_basebackup.c:445 pg_receivewal.c:100 pg_recvlogical.c:115 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAME 指定ã—ãŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§æŽ¥ç¶š\n" -#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106 +#: pg_basebackup.c:446 pg_receivewal.c:101 pg_recvlogical.c:116 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password パスワードã®å…¥åŠ›ã‚’è¦æ±‚ã—ãªã„\n" -#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107 +#: pg_basebackup.c:447 pg_receivewal.c:102 pg_recvlogical.c:117 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰å…¥åŠ›è¦æ±‚を強制(自動的ã«è¡Œã‚れるã¯ãš)\n" -#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108 +#: pg_basebackup.c:448 pg_createsubscriber.c:240 pg_receivewal.c:106 +#: pg_recvlogical.c:118 #, c-format msgid "" "\n" @@ -663,481 +783,545 @@ msgstr "" "\n" "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109 +#: pg_basebackup.c:449 pg_createsubscriber.c:241 pg_receivewal.c:107 +#: pg_recvlogical.c:119 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_basebackup.c:477 +#: pg_basebackup.c:488 #, c-format msgid "could not read from ready pipe: %m" msgstr "準備ãŒã§ããŸãƒ‘イプã‹ã‚‰ã®èª­ã¿è¾¼ã¿ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" -#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2151 -#: streamutil.c:441 +#: pg_basebackup.c:491 pg_basebackup.c:633 pg_basebackup.c:2258 +#: streamutil.c:521 #, c-format msgid "could not parse write-ahead log location \"%s\"" msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ã®ä½ç½®\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_basebackup.c:585 pg_receivewal.c:600 +#: pg_basebackup.c:596 pg_receivewal.c:600 #, c-format msgid "could not finish writing WAL files: %m" msgstr "WALãƒ•ã‚¡ã‚¤ãƒ«ã®æ›¸ãè¾¼ã¿ã‚’終了ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_basebackup.c:631 +#: pg_basebackup.c:642 #, c-format msgid "could not create pipe for background process: %m" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰ãƒ—ロセス用ã®ãƒ‘イプを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: \"%m" -#: pg_basebackup.c:664 +#: pg_basebackup.c:676 #, c-format msgid "created temporary replication slot \"%s\"" msgstr "一時レプリケーションスロット\"%s\"を作æˆã—ã¾ã—ãŸ" -#: pg_basebackup.c:667 +#: pg_basebackup.c:679 #, c-format msgid "created replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を作æˆã—ã¦ã„ã¾ã—ãŸ" -#: pg_basebackup.c:701 +#: pg_basebackup.c:728 #, c-format msgid "could not create background process: %m" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ—ロセスを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_basebackup.c:710 +#: pg_basebackup.c:737 #, c-format msgid "could not create background thread: %m" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_basebackup.c:749 +#: pg_basebackup.c:776 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "ディレクトリ\"%s\"ã¯å­˜åœ¨ã—ã¾ã™ãŒç©ºã§ã¯ã‚りã¾ã›ã‚“" -#: pg_basebackup.c:755 +#: pg_basebackup.c:782 pg_createsubscriber.c:390 #, c-format msgid "could not access directory \"%s\": %m" msgstr "ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_basebackup.c:831 +#: pg_basebackup.c:858 #, c-format msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" msgstr[0] "%*s/%s kB (100%%), %d/%d テーブル空間 %*s" -#: pg_basebackup.c:843 +#: pg_basebackup.c:870 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" msgstr[0] "%*s/%s kB (%d%%), %d/%d テーブル空間 (%s%-*.*s)" -#: pg_basebackup.c:859 +#: pg_basebackup.c:886 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" msgstr[0] "%*s/%s kB (%d%%), %d/%d テーブル空間" -#: pg_basebackup.c:883 +#: pg_basebackup.c:910 #, c-format msgid "transfer rate \"%s\" is not a valid value" msgstr "転é€é€Ÿåº¦\"%s\"ã¯ç„¡åйãªå€¤ã§ã™" -#: pg_basebackup.c:885 +#: pg_basebackup.c:912 #, c-format msgid "invalid transfer rate \"%s\": %m" msgstr "転é€é€Ÿåº¦\"%s\"ã¯ç„¡åйã§ã™: %m" -#: pg_basebackup.c:892 +#: pg_basebackup.c:919 #, c-format msgid "transfer rate must be greater than zero" msgstr "転é€é€Ÿåº¦ã¯0より大ããªå€¤ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_basebackup.c:922 +#: pg_basebackup.c:949 #, c-format msgid "invalid --max-rate unit: \"%s\"" msgstr "--max-rate ã®å˜ä½ãŒä¸æ­£ã§ã™: \"%s\"" -#: pg_basebackup.c:926 +#: pg_basebackup.c:953 #, c-format msgid "transfer rate \"%s\" exceeds integer range" msgstr "転é€é€Ÿåº¦\"%s\"ãŒintegerã®ç¯„囲を超ãˆã¦ã„ã¾ã™" -#: pg_basebackup.c:933 +#: pg_basebackup.c:960 #, c-format msgid "transfer rate \"%s\" is out of range" msgstr "転é€é€Ÿåº¦\"%s\"ãŒç¯„囲外ã§ã™" -#: pg_basebackup.c:995 +#: pg_basebackup.c:1022 #, c-format msgid "could not get COPY data stream: %s" msgstr "COPYデータストリームをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_basebackup.c:1012 pg_recvlogical.c:436 pg_recvlogical.c:608 +#: pg_basebackup.c:1039 pg_recvlogical.c:449 pg_recvlogical.c:625 #: receivelog.c:973 #, c-format msgid "could not read COPY data: %s" msgstr "COPYデータを読ã¿å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_basebackup.c:1016 +#: pg_basebackup.c:1043 #, c-format msgid "background process terminated unexpectedly" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ãƒ—ロセスãŒçªç„¶çµ‚了ã—ã¾ã—ãŸ" -#: pg_basebackup.c:1087 +#: pg_basebackup.c:1114 #, c-format msgid "cannot inject manifest into a compressed tar file" msgstr "圧縮tarファイルã«ã¯ç›®éŒ²ã¯å‡ºåŠ›ã§ãã¾ã›ã‚“" -#: pg_basebackup.c:1088 +#: pg_basebackup.c:1115 #, c-format msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s." msgstr "クライアントサイド圧縮を使用ã—ã¦æ¨™æº–出力ã§ã¯ãªãディレクトリã«å‡ºåŠ›ã™ã‚‹ã€ã¾ãŸã¯ %s を使用ã—ã¦ãã ã•ã„。" -#: pg_basebackup.c:1104 +#: pg_basebackup.c:1131 #, c-format msgid "cannot parse archive \"%s\"" msgstr "アーカイブ\"%s\"ã®ãƒ‘ースãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_basebackup.c:1105 +#: pg_basebackup.c:1132 #, c-format msgid "Only tar archives can be parsed." msgstr "tarアーカイブã®ã¿ãƒ‘ースå¯èƒ½ã§ã™ã€‚" -#: pg_basebackup.c:1107 +#: pg_basebackup.c:1134 #, c-format msgid "Plain format requires pg_basebackup to parse the archive." msgstr "Plainフォーマットã§ã¯pg_basebackupãŒã‚¢ãƒ¼ã‚«ã‚¤ãƒ–をパースã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: pg_basebackup.c:1109 +#: pg_basebackup.c:1136 #, c-format msgid "Using - as the output directory requires pg_basebackup to parse the archive." msgstr "出力ディレクトリ㫠- を指定ã™ã‚‹éš›ã«ã¯pg_basebackupãŒã‚¢ãƒ¼ã‚«ã‚¤ãƒ–をパースã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: pg_basebackup.c:1111 +#: pg_basebackup.c:1138 #, c-format msgid "The -R option requires pg_basebackup to parse the archive." msgstr "-Rオプションを指定ã™ã‚‹å ´åˆã¯pg_basebackupãŒã‚¢ãƒ¼ã‚«ã‚¤ãƒ–をパースã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: pg_basebackup.c:1330 +#: pg_basebackup.c:1357 #, c-format msgid "archives must precede manifest" msgstr "アーカイブã¯ç›®éŒ²ã‚ˆã‚Šå…ˆã«ã‚ã‚‹ã¯ãšã§ã™" -#: pg_basebackup.c:1345 +#: pg_basebackup.c:1372 #, c-format msgid "invalid archive name: \"%s\"" msgstr "䏿­£ãªã‚¢ãƒ¼ã‚«ã‚¤ãƒ–å: \"%s\"" -#: pg_basebackup.c:1417 +#: pg_basebackup.c:1444 #, c-format msgid "unexpected payload data" msgstr "予期ã—ãªã„ペイロードã®ãƒ‡ãƒ¼ã‚¿" -#: pg_basebackup.c:1560 +#: pg_basebackup.c:1587 #, c-format msgid "empty COPY message" msgstr "空ã®COPYメッセージ" -#: pg_basebackup.c:1562 +#: pg_basebackup.c:1589 #, c-format msgid "malformed COPY message of type %d, length %zu" msgstr "タイプ%dã€é•·ã•%zuã®COPYメッセージã®ãƒ•ォーマット異常" -#: pg_basebackup.c:1760 +#: pg_basebackup.c:1789 #, c-format msgid "incompatible server version %s" msgstr "éžäº’æ›ã®ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ \"%s\"" -#: pg_basebackup.c:1776 +#: pg_basebackup.c:1805 #, c-format msgid "Use -X none or -X fetch to disable log streaming." msgstr "-X none ã¾ãŸã¯ -X fetch ã§ãƒ­ã‚°ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’無効ã«ã§ãã¾ã™ã€‚" -#: pg_basebackup.c:1844 +#: pg_basebackup.c:1841 +#, c-format +msgid "server does not support incremental backup" +msgstr "サーãƒãƒ¼ã¯å·®åˆ†ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" + +#: pg_basebackup.c:1850 pg_basebackup.c:2008 pg_recvlogical.c:272 +#: receivelog.c:543 receivelog.c:582 streamutil.c:367 streamutil.c:441 +#: streamutil.c:493 streamutil.c:581 streamutil.c:733 streamutil.c:778 +#, c-format +msgid "could not send replication command \"%s\": %s" +msgstr "レプリケーションコマンド\"%s\"ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_basebackup.c:1856 pg_basebackup.c:1883 +#, c-format +msgid "could not upload manifest: %s" +msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録をアップロードã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_basebackup.c:1859 pg_basebackup.c:1886 +#, c-format +msgid "could not upload manifest: unexpected status %s" +msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録をアップロードã§ãã¾ã›ã‚“ã§ã—ãŸ: 予期ã—ãªã„ステータス %s" + +#: pg_basebackup.c:1867 +#, c-format +msgid "could not send COPY data: %s" +msgstr "COPYデータを創出ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_basebackup.c:1877 +#, c-format +msgid "could not send end-of-COPY: %s" +msgstr "COPY終端マーカーをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_basebackup.c:1892 +#, c-format +msgid "unexpected extra result while sending manifest" +msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録é€å‡ºä¸­ã®æƒ³å®šå¤–ã®ä½™åˆ†ãªçµæžœ" + +#: pg_basebackup.c:1950 #, c-format msgid "backup targets are not supported by this server version" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲットã¯ã“ã®ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: pg_basebackup.c:1847 +#: pg_basebackup.c:1953 #, c-format msgid "recovery configuration cannot be written when a backup target is used" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲットãŒä½¿ç”¨ã•れã¦ã„ã‚‹å ´åˆã«ã¯ãƒªã‚«ãƒãƒªè¨­å®šã¯å‡ºåŠ›ã§ãã¾ã›ã‚“" -#: pg_basebackup.c:1874 +#: pg_basebackup.c:1980 #, c-format msgid "server does not support server-side compression" msgstr "サーãƒãƒ¼ã¯ã‚µãƒ¼ãƒãƒ¼ã‚µã‚¤ãƒ‰åœ§ç¸®ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: pg_basebackup.c:1884 +#: pg_basebackup.c:1990 #, c-format msgid "initiating base backup, waiting for checkpoint to complete" msgstr "ベースãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’é–‹å§‹ã—ã¦ã„ã¾ã™ - ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®å®Œäº†ã‚’待機中" -#: pg_basebackup.c:1888 +#: pg_basebackup.c:1994 #, c-format msgid "waiting for checkpoint" msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã‚’å¾…ã£ã¦ã„ã¾ã™" -#: pg_basebackup.c:1901 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582 -#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501 -#: streamutil.c:653 streamutil.c:698 -#, c-format -msgid "could not send replication command \"%s\": %s" -msgstr "レプリケーションコマンド\"%s\"ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" - -#: pg_basebackup.c:1909 +#: pg_basebackup.c:2016 #, c-format msgid "could not initiate base backup: %s" msgstr "ベースãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’é–‹å§‹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_basebackup.c:1912 +#: pg_basebackup.c:2019 #, c-format msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields" msgstr "サーãƒãƒ¼ãŒ BASE_BACKUP ã‚³ãƒžãƒ³ãƒ‰ã«æœŸå¾…ã—ã¦ã„ãªã„応答を返ã—ã¾ã—ãŸ; %d行 %d列をå—ä¿¡ã—ã¾ã—ãŸãŒæœŸå¾…㯠%d列 %d行ã§ã—ãŸ" -#: pg_basebackup.c:1918 +#: pg_basebackup.c:2025 #, c-format msgid "checkpoint completed" msgstr "ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆãŒå®Œäº†ã—ã¾ã—ãŸ" -#: pg_basebackup.c:1932 +#: pg_basebackup.c:2039 #, c-format msgid "write-ahead log start point: %s on timeline %u" msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ã®é–‹å§‹ãƒã‚¤ãƒ³ãƒˆ: タイムライン %2$u 上㮠%1$s" -#: pg_basebackup.c:1940 +#: pg_basebackup.c:2047 #, c-format msgid "could not get backup header: %s" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ヘッダをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_basebackup.c:1943 +#: pg_basebackup.c:2050 #, c-format msgid "no data returned from server" msgstr "サーãƒãƒ¼ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ãŒè¿”ã•れã¾ã›ã‚“ã§ã—ãŸ" -#: pg_basebackup.c:1986 +#: pg_basebackup.c:2093 #, c-format msgid "can only write single tablespace to stdout, database has %d" msgstr "æ¨™æº–å‡ºåŠ›ã«æ›¸ã出ã›ã‚‹ãƒ†ãƒ¼ãƒ–ル空間ã¯ï¼‘ã¤ã ã‘ã§ã™ãŒã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã¯%d個ã‚りã¾ã™" -#: pg_basebackup.c:1999 +#: pg_basebackup.c:2106 #, c-format msgid "starting background WAL receiver" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰WALå—信処ç†ã‚’èµ·å‹•ã—ã¾ã™" -#: pg_basebackup.c:2082 +#: pg_basebackup.c:2189 #, c-format msgid "backup failed: %s" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" -#: pg_basebackup.c:2085 +#: pg_basebackup.c:2192 #, c-format msgid "no write-ahead log end position returned from server" msgstr "サーãƒãƒ¼ã‹ã‚‰å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ã®çµ‚了ä½ç½®ãŒè¿”ã•れã¾ã›ã‚“ã§ã—ãŸ" -#: pg_basebackup.c:2088 +#: pg_basebackup.c:2195 #, c-format msgid "write-ahead log end point: %s" msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ã®çµ‚了ãƒã‚¤ãƒ³ãƒˆ: %s" -#: pg_basebackup.c:2099 +#: pg_basebackup.c:2206 #, c-format msgid "checksum error occurred" msgstr "ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ" -#: pg_basebackup.c:2104 +#: pg_basebackup.c:2211 #, c-format msgid "final receive failed: %s" msgstr "終端ã®å—ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: pg_basebackup.c:2128 +#: pg_basebackup.c:2235 #, c-format msgid "waiting for background process to finish streaming ..." msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰ãƒ—ロセスãŒã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°å‡¦ç†ãŒçµ‚ã‚ã‚‹ã¾ã§å¾…機ã—ã¾ã™ ..." -#: pg_basebackup.c:2132 +#: pg_basebackup.c:2239 #, c-format msgid "could not send command to background pipe: %m" msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ãƒ³ãƒ‰ã¸ã®ãƒ‘イプã«ã‚³ãƒžãƒ³ãƒ‰ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_basebackup.c:2137 +#: pg_basebackup.c:2244 #, c-format msgid "could not wait for child process: %m" msgstr "å­ãƒ—ロセスã®å¾…機ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_basebackup.c:2139 +#: pg_basebackup.c:2246 #, c-format msgid "child %d died, expected %d" msgstr "å­ãƒ—ロセス %d ãŒçµ‚了ã—ã¾ã—ãŸãŒã€æœŸå¾…ã—ã¦ã„ãŸã®ã¯ %d ã§ã—ãŸ" -#: pg_basebackup.c:2141 streamutil.c:91 streamutil.c:196 +#: pg_basebackup.c:2248 streamutil.c:92 streamutil.c:207 streamutil.c:319 #, c-format msgid "%s" msgstr "%s" -#: pg_basebackup.c:2161 +#: pg_basebackup.c:2268 #, c-format msgid "could not wait for child thread: %m" msgstr "å­ã‚¹ãƒ¬ãƒƒãƒ‰ã®å¾…機ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_basebackup.c:2166 +#: pg_basebackup.c:2273 #, c-format msgid "could not get child thread exit status: %m" msgstr "å­ã‚¹ãƒ¬ãƒƒãƒ‰ã®çµ‚了ステータスをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_basebackup.c:2169 +#: pg_basebackup.c:2276 #, c-format msgid "child thread exited with error %u" msgstr "å­ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã‚¨ãƒ©ãƒ¼%uã§çµ‚了ã—ã¾ã—ãŸ" -#: pg_basebackup.c:2198 +#: pg_basebackup.c:2305 #, c-format msgid "syncing data to disk ..." msgstr "データをディスクã«åŒæœŸã—ã¦ã„ã¾ã™..." -#: pg_basebackup.c:2223 +#: pg_basebackup.c:2330 #, c-format msgid "renaming backup_manifest.tmp to backup_manifest" -msgstr "backup_manifest.tmp ã®åå‰ã‚’ backup_manifest ã«å¤‰æ›´ã—ã¦ãã ã•ã„" +msgstr "backup_manifest.tmp ã®åå‰ã‚’ backup_manifest ã«å¤‰æ›´ã—ã¦ã„ã¾ã™" -#: pg_basebackup.c:2243 +#: pg_basebackup.c:2350 #, c-format msgid "base backup completed" msgstr "ベースãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒå®Œäº†ã—ã¾ã—ãŸ" -#: pg_basebackup.c:2326 +#: pg_basebackup.c:2436 #, c-format msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" msgstr "䏿­£ãª checkpoint ã®å¼•æ•°\"%s\"ã€\"fast\" ã¾ãŸã¯ \"spreadã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_basebackup.c:2344 +#: pg_basebackup.c:2454 #, c-format msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" msgstr "䏿­£ãªå‡ºåŠ›ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ\"%s\"ã€\"plain\"ã‹\"tar\"ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_basebackup.c:2422 +#: pg_basebackup.c:2535 #, c-format msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" msgstr "䏿­£ãª wal-method オプション\"%s\"ã€\"fetch\"ã€\"stream\" ã¾ãŸã¯ \"none\" ã®ã„ãšã‚Œã‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_basebackup.c:2457 pg_basebackup.c:2469 pg_basebackup.c:2491 -#: pg_basebackup.c:2503 pg_basebackup.c:2509 pg_basebackup.c:2561 -#: pg_basebackup.c:2572 pg_basebackup.c:2582 pg_basebackup.c:2588 -#: pg_basebackup.c:2595 pg_basebackup.c:2607 pg_basebackup.c:2619 -#: pg_basebackup.c:2627 pg_basebackup.c:2640 pg_basebackup.c:2646 -#: pg_basebackup.c:2655 pg_basebackup.c:2667 pg_basebackup.c:2678 -#: pg_basebackup.c:2686 pg_receivewal.c:748 pg_receivewal.c:760 +#: pg_basebackup.c:2574 pg_basebackup.c:2586 pg_basebackup.c:2608 +#: pg_basebackup.c:2620 pg_basebackup.c:2626 pg_basebackup.c:2678 +#: pg_basebackup.c:2689 pg_basebackup.c:2699 pg_basebackup.c:2705 +#: pg_basebackup.c:2712 pg_basebackup.c:2724 pg_basebackup.c:2736 +#: pg_basebackup.c:2744 pg_basebackup.c:2757 pg_basebackup.c:2763 +#: pg_basebackup.c:2772 pg_basebackup.c:2784 pg_basebackup.c:2795 +#: pg_basebackup.c:2803 pg_createsubscriber.c:2038 pg_createsubscriber.c:2048 +#: pg_createsubscriber.c:2056 pg_createsubscriber.c:2084 +#: pg_createsubscriber.c:2116 pg_receivewal.c:748 pg_receivewal.c:760 #: pg_receivewal.c:767 pg_receivewal.c:776 pg_receivewal.c:783 -#: pg_receivewal.c:793 pg_recvlogical.c:835 pg_recvlogical.c:847 -#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871 -#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892 -#: pg_recvlogical.c:899 pg_recvlogical.c:906 +#: pg_receivewal.c:793 pg_recvlogical.c:853 pg_recvlogical.c:865 +#: pg_recvlogical.c:875 pg_recvlogical.c:882 pg_recvlogical.c:889 +#: pg_recvlogical.c:896 pg_recvlogical.c:903 pg_recvlogical.c:910 +#: pg_recvlogical.c:917 pg_recvlogical.c:924 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" -#: pg_basebackup.c:2467 pg_receivewal.c:758 pg_recvlogical.c:845 +#: pg_basebackup.c:2584 pg_createsubscriber.c:2046 pg_receivewal.c:758 +#: pg_recvlogical.c:863 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数ãŒå¤šéŽãŽã¾ã™(先頭ã¯\"%s\"ã§ã™)" -#: pg_basebackup.c:2490 +#: pg_basebackup.c:2607 #, c-format msgid "cannot specify both format and backup target" msgstr "フォーマットã¨ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲットã®ä¸¡æ–¹ã‚’åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: pg_basebackup.c:2502 +#: pg_basebackup.c:2619 #, c-format msgid "must specify output directory or backup target" msgstr "出力ディレクトリã‹ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲットを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: pg_basebackup.c:2508 +#: pg_basebackup.c:2625 #, c-format msgid "cannot specify both output directory and backup target" msgstr "出力先ディレクトリã¨ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲットã®ä¸¡æ–¹ã‚’åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: pg_basebackup.c:2538 pg_receivewal.c:802 +#: pg_basebackup.c:2655 pg_receivewal.c:802 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "èªè­˜ã§ããªã„圧縮アルゴリズム\"%s\"" -#: pg_basebackup.c:2544 pg_receivewal.c:809 +#: pg_basebackup.c:2661 pg_receivewal.c:809 #, c-format msgid "invalid compression specification: %s" msgstr "䏿­£ãªåœ§ç¸®æŒ‡å®š: %s" -#: pg_basebackup.c:2560 +#: pg_basebackup.c:2677 #, c-format msgid "client-side compression is not possible when a backup target is specified" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãŒæŒ‡å®šã•れã¦ã„ã‚‹ã¨ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚µã‚¤ãƒ‰åœ§ç¸®ã¯ã§ãã¾ã›ã‚“" -#: pg_basebackup.c:2571 +#: pg_basebackup.c:2688 #, c-format msgid "only tar mode backups can be compressed" msgstr "tarモードã§ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®ã¿ãŒåœ§ç¸®å¯èƒ½ã§ã™" -#: pg_basebackup.c:2581 +#: pg_basebackup.c:2698 #, c-format msgid "WAL cannot be streamed when a backup target is specified" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲット指定ã•れã¦ã„ã‚‹ã¨WALã¯ã‚¹ãƒˆãƒªãƒ¼ãƒ å‡ºåŠ›ã§ãã¾ã›ã‚“" -#: pg_basebackup.c:2587 +#: pg_basebackup.c:2704 #, c-format msgid "cannot stream write-ahead logs in tar mode to stdout" msgstr "標準出力ã¸ã® tar モードã§ã¯æ›¸ãè¾¼ã¿å…ˆè¡Œãƒ­ã‚°ã‚’ストリーム出力ã§ãã¾ã›ã‚“" -#: pg_basebackup.c:2594 +#: pg_basebackup.c:2711 #, c-format msgid "replication slots can only be used with WAL streaming" msgstr "レプリケーションスロットã¯WALストリーミングã§ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™" -#: pg_basebackup.c:2606 +#: pg_basebackup.c:2723 #, c-format msgid "--no-slot cannot be used with slot name" msgstr "--no-slot ã¯ã‚¹ãƒ­ãƒƒãƒˆåã¨åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" #. translator: second %s is an option name -#: pg_basebackup.c:2617 pg_receivewal.c:774 +#: pg_basebackup.c:2734 pg_receivewal.c:774 #, c-format msgid "%s needs a slot to be specified using --slot" msgstr "%s 㯠--slot ã§ã‚¹ãƒ­ãƒƒãƒˆã‚’指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: pg_basebackup.c:2625 pg_basebackup.c:2665 pg_basebackup.c:2676 -#: pg_basebackup.c:2684 +#: pg_basebackup.c:2742 pg_basebackup.c:2782 pg_basebackup.c:2793 +#: pg_basebackup.c:2801 #, c-format msgid "%s and %s are incompatible options" msgstr "%s 㨠%s ã¯éžäº’æ›ãªã‚ªãƒ—ションã§ã™" -#: pg_basebackup.c:2639 +#: pg_basebackup.c:2756 #, c-format msgid "WAL directory location cannot be specified along with a backup target" msgstr "WALディレクトリã®ä½ç½®ã¯ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ターゲットã¨åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: pg_basebackup.c:2645 +#: pg_basebackup.c:2762 #, c-format msgid "WAL directory location can only be specified in plain mode" msgstr "WALディレクトリã®ä½ç½®ã¯ plainモードã§ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™" -#: pg_basebackup.c:2654 +#: pg_basebackup.c:2771 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WALディレクトリã®ä½ç½®ã¯ã€çµ¶å¯¾ãƒ‘スã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_basebackup.c:2754 +#: pg_basebackup.c:2871 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_receivewal.c:77 +#: pg_createsubscriber.c:169 +#, c-format +msgid "failed after the end of recovery" +msgstr "リカãƒãƒªå®Œäº†å¾Œã«å¤±æ•—ã—ã¾ã—ãŸ" + +#: pg_createsubscriber.c:170 +#, c-format +msgid "The target server cannot be used as a physical replica anymore. You must recreate the physical replica before continuing." +msgstr "以é™ã“ã®å¯¾è±¡ã‚µãƒ¼ãƒãƒ¼ã¯ç‰©ç†è¤‡è£½ã¨ã—ã¦ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。作業を継続ã™ã‚‹å‰ã«ç‰©ç†è¤‡è£½ã‚’å†ä½œæˆã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" + +#: pg_createsubscriber.c:198 +#, c-format +msgid "publication \"%s\" created in database \"%s\" on primary was left behind" +msgstr "プライマリ上ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%2$s\"ã§ä½œæˆã•れãŸãƒ‘ブリケーション\"%1$s\"ãŒæ®‹ã•れã¦ã„ã¾ã™" + +#: pg_createsubscriber.c:200 +#, c-format +msgid "Drop this publication before trying again." +msgstr "å†è©¦è¡Œã®å‰ã«ã“ã®ãƒ‘ブリケーションを削除ã—ã¦ãã ã•ã„。" + +#: pg_createsubscriber.c:204 +#, c-format +msgid "replication slot \"%s\" created in database \"%s\" on primary was left behind" +msgstr "プライマリ上ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%2$s\"ã§ä½œæˆã•れãŸãƒ¬ãƒ—リケーションスロット\"%1$s\"ãŒæ®‹ã•れã¦ã„ã¾ã™" + +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1261 +#, c-format +msgid "Drop this replication slot soon to avoid retention of WAL files." +msgstr "WALファイルã®å¢—加をé¿ã‘ã‚‹ãŸã‚ã«ã“ã®ãƒ¬ãƒ—リケーションスロットを直ã¡ã«å‰Šé™¤ã—ã¦ãã ã•ã„。" + +#: pg_createsubscriber.c:219 #, c-format msgid "" -"%s receives PostgreSQL streaming write-ahead logs.\n" +"%s creates a new logical replica from a standby server.\n" "\n" msgstr "" -"%sã¯PostgreSQLã®å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’å—ä¿¡ã—ã¾ã™ã€‚\n" +"%s スタンãƒã‚¤ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰æ–°ãŸãªè«–ç†è¤‡è£½ã‚’作æˆã—ã¾ã™ã€‚\n" "\n" -#: pg_receivewal.c:81 pg_recvlogical.c:82 +#: pg_createsubscriber.c:223 pg_receivewal.c:81 pg_recvlogical.c:92 #, c-format msgid "" "\n" @@ -1146,22 +1330,639 @@ msgstr "" "\n" "オプション:\n" +#: pg_createsubscriber.c:224 +#, c-format +msgid " -d, --database=DBNAME database in which to create a subscription\n" +msgstr " -d, --database=DBNAME サブスクリプションを作æˆã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å\n" + +#: pg_createsubscriber.c:225 +#, c-format +msgid " -D, --pgdata=DATADIR location for the subscriber data directory\n" +msgstr " -D, --pgdata=DATADIR サブスクライãƒã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å ´æ‰€\n" + +#: pg_createsubscriber.c:226 +#, c-format +msgid " -n, --dry-run dry run, just show what would be done\n" +msgstr " -n, --dry-run æ›´æ–°ã‚’ã›ãšã€å˜ã«ä½•ãŒè¡Œãªã‚れるã‹ã‚’表示\n" + +#: pg_createsubscriber.c:227 +#, c-format +msgid " -p, --subscriber-port=PORT subscriber port number (default %s)\n" +msgstr " -p, --subscriber-port=PORT サブスクライãƒã®ãƒãƒ¼ãƒˆç•ªå· (デフォルト %s)\n" + +#: pg_createsubscriber.c:228 +#, c-format +msgid " -P, --publisher-server=CONNSTR publisher connection string\n" +msgstr " -P, --publisher-server=CONNSTR ãƒ‘ãƒ–ãƒªãƒƒã‚·ãƒ£ã®æŽ¥ç¶šæ–‡å­—åˆ—\n" + +#: pg_createsubscriber.c:229 +#, c-format +msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" +msgstr "" +" -s, --socketdir=DIR 使用ã™ã‚‹ã‚½ã‚±ãƒƒãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª(デフォルトã¯\n" +" カレントディレクトリ)\n" + +#: pg_createsubscriber.c:230 +#, c-format +msgid " -t, --recovery-timeout=SECS seconds to wait for recovery to end\n" +msgstr " -t, --recovery-timeout=SECS リカãƒãƒªå®Œäº†ã‚’待機ã™ã‚‹ç§’æ•°\n" + +#: pg_createsubscriber.c:231 +#, c-format +msgid " -U, --subscriber-username=NAME user name for subscriber connection\n" +msgstr " -U, --subscriber-username=NAME ã‚µãƒ–ã‚¹ã‚¯ãƒ©ã‚¤ãƒæŽ¥ç¶šã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å\n" + +#: pg_createsubscriber.c:232 +#, c-format +msgid " -v, --verbose output verbose messages\n" +msgstr " -v, --verbose 冗長メッセージを出力\n" + +#: pg_createsubscriber.c:233 +#, c-format +msgid "" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr "" +" --config-file=FILENAME ターゲットã®ã‚¯ãƒ©ã‚¹ã‚¿ã®å®Ÿè¡Œæ™‚ã«æŒ‡å®šã—ãŸ\n" +" 主サーãƒãƒ¼è¨­å®šãƒ•ァイルを使用ã™ã‚‹\n" + +#: pg_createsubscriber.c:235 +#, c-format +msgid " --publication=NAME publication name\n" +msgstr " --publication=NAME パブリケーションå\n" + +#: pg_createsubscriber.c:236 +#, c-format +msgid " --replication-slot=NAME replication slot name\n" +msgstr " --replication-slot=NAME レプリケーションスロットå\n" + +#: pg_createsubscriber.c:237 +#, c-format +msgid " --subscription=NAME subscription name\n" +msgstr " --subscription=NAME サブスクリプションå\n" + +#: pg_createsubscriber.c:238 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" + +#: pg_createsubscriber.c:239 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" + +#: pg_createsubscriber.c:282 +#, c-format +msgid "could not parse connection string: %s" +msgstr "接続文字列をパースã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:359 +#, c-format +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "%2$sã«ã¯ãƒ—ログラム\"%1$s\"ãŒå¿…è¦ã§ã™ãŒã€\"%3$s\"ã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚" + +#: pg_createsubscriber.c:362 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "\"%2$s\"ãŒãƒ—ログラム\"%1$s\"を見ã¤ã‘ã¾ã—ãŸãŒã€ã“れã¯%3$sã¨åŒã˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚" + +#: pg_createsubscriber.c:382 +#, c-format +msgid "checking if directory \"%s\" is a cluster data directory" +msgstr "ディレクトリ\"%s\"ãŒã‚¯ãƒ©ã‚¹ã‚¿ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã‚ã‚‹ã“ã¨ã‚’確èªä¸­" + +#: pg_createsubscriber.c:388 +#, c-format +msgid "data directory \"%s\" does not exist" +msgstr "データディレクトリ\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" + +#: pg_createsubscriber.c:396 +#, c-format +msgid "directory \"%s\" is not a database cluster directory" +msgstr "ディレクトリ\"%s\"ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¯ãƒ©ã‚¹ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚りã¾ã›ã‚“" + +#: pg_createsubscriber.c:513 +#, c-format +msgid "connection to database failed: %s" +msgstr "データベース接続ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" + +#: pg_createsubscriber.c:526 +#, c-format +msgid "could not clear search_path: %s" +msgstr "search_path を消去ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:566 +#, c-format +msgid "getting system identifier from publisher" +msgstr "パブリッシャã‹ã‚‰ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ã‚’å–å¾—ã—ã¦ã„ã¾ã™" + +#: pg_createsubscriber.c:573 +#, c-format +msgid "could not get system identifier: %s" +msgstr "システム識別å­ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:579 +#, c-format +msgid "could not get system identifier: got %d rows, expected %d row" +msgstr "システム識別å­ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%dè¡Œã€æƒ³å®šã¯%d行" + +#: pg_createsubscriber.c:586 +#, c-format +msgid "system identifier is %llu on publisher" +msgstr "パブリッシャã®ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ã¯%lluã§ã™" + +#: pg_createsubscriber.c:607 +#, c-format +msgid "getting system identifier from subscriber" +msgstr "サブスクライãƒã‹ã‚‰ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ã‚’å–å¾—ã—ã¦ã„ã¾ã™" + +#: pg_createsubscriber.c:611 pg_createsubscriber.c:641 +#, c-format +msgid "control file appears to be corrupt" +msgstr "制御ファイルãŒç ´æã—ã¦ã„るよã†ã§ã™" + +#: pg_createsubscriber.c:615 pg_createsubscriber.c:656 +#, c-format +msgid "system identifier is %llu on subscriber" +msgstr "サブスクライãƒã®ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ã¯%lluã§ã™" + +#: pg_createsubscriber.c:637 +#, c-format +msgid "modifying system identifier of subscriber" +msgstr "サブスクライãƒã®ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ã‚’変更ã—ã¦ã„ã¾ã™" + +#: pg_createsubscriber.c:659 +#, c-format +msgid "running pg_resetwal on the subscriber" +msgstr "サブスクライãƒä¸Šã§pg_resetwalを実行ã—ã¾ã™" + +#: pg_createsubscriber.c:671 +#, c-format +msgid "subscriber successfully changed the system identifier" +msgstr "サブスクライãƒã¯ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ã®å¤‰æ›´ã«æˆåŠŸã—ã¾ã—ãŸ" + +#: pg_createsubscriber.c:673 +#, c-format +msgid "could not change system identifier of subscriber: %s" +msgstr "サブスクライãƒãƒ¼ã®ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ã‚’変更ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:697 +#, c-format +msgid "could not obtain database OID: %s" +msgstr "データベースOIDã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:704 +#, c-format +msgid "could not obtain database OID: got %d rows, expected %d row" +msgstr "データベースOIDã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%dè¡Œã€æƒ³å®šã¯%d行" + +#: pg_createsubscriber.c:776 +#, c-format +msgid "create replication slot \"%s\" on publisher" +msgstr "パブリッシャã§ãƒ¬ãƒ—リケーションスロット\"%s\"を作æˆã—ã¾ã™" + +#: pg_createsubscriber.c:796 +#, c-format +msgid "could not write an additional WAL record: %s" +msgstr "追加ã®WALレコードを書ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:822 +#, c-format +msgid "could not obtain recovery progress: %s" +msgstr "リカãƒãƒªé€²æ—ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:854 +#, c-format +msgid "checking settings on publisher" +msgstr "パブリッシャ上ã®è¨­å®šã‚’確èªã—ã¦ã„ã¾ã™" + +#: pg_createsubscriber.c:864 +#, c-format +msgid "primary server cannot be in recovery" +msgstr "プライマリサーãƒãƒ¼ãŒãƒªã‚«ãƒãƒªä¸­ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" + +#: pg_createsubscriber.c:888 +#, c-format +msgid "could not obtain publisher settings: %s" +msgstr "パブリッシャã®è¨­å®šãŒå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:914 +#, c-format +msgid "publisher requires wal_level >= \"logical\"" +msgstr "パブリッシャã§ã¯ wal_level >= \"logical\" ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" + +#: pg_createsubscriber.c:920 +#, c-format +msgid "publisher requires %d replication slots, but only %d remain" +msgstr "パブリッシャã¯%d個ã®ãƒ¬ãƒ—リケーションスロットを必è¦ã¨ã—ã¾ã™ãŒã€%d個ã—ã‹æ®‹ã£ã¦ã„ã¾ã›ã‚“" + +#: pg_createsubscriber.c:922 pg_createsubscriber.c:931 +#: pg_createsubscriber.c:1028 pg_createsubscriber.c:1037 +#: pg_createsubscriber.c:1046 +#, c-format +msgid "Increase the configuration parameter \"%s\" to at least %d." +msgstr "設定パラメータ\"%s\"ã‚’å°‘ãªãã¨ã‚‚%dã«å¢—ã‚„ã—ã¦ãã ã•ã„。" + +#: pg_createsubscriber.c:929 +#, c-format +msgid "publisher requires %d WAL sender processes, but only %d remain" +msgstr "パブリッシャã¯%d個ã®WAL senderプロセスを必è¦ã¨ã—ã¾ã™ãŒã€%d個ã—ã‹æ®‹ã£ã¦ã„ã¾ã›ã‚“" + +#: pg_createsubscriber.c:938 +#, c-format +msgid "two_phase option will not be enabled for replication slots" +msgstr "レプリケーションスロットã«å¯¾ã—ã¦two_phaseã‚ªãƒ—ã‚·ãƒ§ãƒ³ã¯æœ‰åŠ¹åŒ–ã•れã¾ã›ã‚“" + +#: pg_createsubscriber.c:939 +#, c-format +msgid "Subscriptions will be created with the two_phase option disabled. Prepared transactions will be replicated at COMMIT PREPARED." +msgstr "サブスクリプションã¯two_phaseオプションãŒç„¡åйãªçŠ¶æ…‹ã§ä½œæˆã•れã¾ã™ã€‚準備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯COMMIT PREPAREDã§ãƒ¬ãƒ—リケートã•れã¾ã™ã€‚" + +#: pg_createsubscriber.c:971 +#, c-format +msgid "checking settings on subscriber" +msgstr "サブスクライãƒä¸Šã§è¨­å®šã‚’確èªã—ã¾ã™" + +#: pg_createsubscriber.c:978 +#, c-format +msgid "target server must be a standby" +msgstr "ターゲットサーãƒãƒ¼ã¯ã‚¹ã‚¿ãƒ³ãƒã‚¤ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" + +#: pg_createsubscriber.c:1002 +#, c-format +msgid "could not obtain subscriber settings: %s" +msgstr "サブスクライãƒã®è¨­å®šã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:1026 +#, c-format +msgid "subscriber requires %d replication slots, but only %d remain" +msgstr "サブスクライãƒã¯%d個ã®ãƒ¬ãƒ—リケーションスロットを必è¦ã¨ã—ã¾ã™ãŒã€%d個ã—ã‹æ®‹ã£ã¦ã¾ã›ã‚“" + +#: pg_createsubscriber.c:1035 +#, c-format +msgid "subscriber requires %d logical replication workers, but only %d remain" +msgstr "サブスクライãƒã¯%d個ã®è«–ç†ãƒ¬ãƒ—リケーションワーカーを必è¦ã¨ã—ã¾ã™ãŒã€%d個ã—ã‹æ®‹ã£ã¦ã„ã¾ã›ã‚“" + +#: pg_createsubscriber.c:1044 +#, c-format +msgid "subscriber requires %d worker processes, but only %d remain" +msgstr "サブスクライãƒã¯%d個ã®ãƒ¯ãƒ¼ã‚«ãƒ¼ãƒ—ロセスを必è¦ã¨ã—ã¾ã™ãŒã€%d個ã—ã‹æ®‹ã£ã¦ã„ã¾ã›ã‚“" + +#: pg_createsubscriber.c:1079 +#, c-format +msgid "dropping subscription \"%s\" in database \"%s\"" +msgstr "データベース\"%2$s\"ã®ã‚µãƒ–スクリプション\"%1$s\"ã®å‰Šé™¤ä¸­" + +#: pg_createsubscriber.c:1088 +#, c-format +msgid "could not drop subscription \"%s\": %s" +msgstr "サブスクリプション\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:1123 +#, c-format +msgid "could not obtain pre-existing subscriptions: %s" +msgstr "既存ã®ã‚µãƒ–スクリプションをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:1259 +#, c-format +msgid "could not drop replication slot \"%s\" on primary" +msgstr "プライマリ上ã®ãƒ¬ãƒ—リケーションスロット\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: pg_createsubscriber.c:1293 +#, c-format +msgid "could not obtain failover replication slot information: %s" +msgstr "フェイルオーãƒãƒ¼ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ãƒ­ãƒƒãƒˆã®æƒ…報をå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:1295 pg_createsubscriber.c:1304 +#, c-format +msgid "Drop the failover replication slots on subscriber soon to avoid retention of WAL files." +msgstr "WALファイルã®å¢—加をé¿ã‘ã‚‹ãŸã‚ã«ã“ã®ãƒ•ェイルオーãƒãƒ¼ãƒ¬ãƒ—リケーションスロットを直ã¡ã«å‰Šé™¤ã—ã¦ãã ã•ã„。" + +#: pg_createsubscriber.c:1303 +#, c-format +msgid "could not drop failover replication slot" +msgstr "フェイルオーãƒãƒ¼ãƒ¬ãƒ—リケーションスロットを削除ã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: pg_createsubscriber.c:1325 +#, c-format +msgid "creating the replication slot \"%s\" in database \"%s\"" +msgstr "データベース\"%2$s\"ã§ãƒ¬ãƒ—リケーションスロット\"%1$s:を作æˆã—ã¾ã™" + +#: pg_createsubscriber.c:1343 +#, c-format +msgid "could not create replication slot \"%s\" in database \"%s\": %s" +msgstr "データベース\"%2$s\"ã§ãƒ¬ãƒ—リケーションスロット\"%1$s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %3$s" + +#: pg_createsubscriber.c:1373 +#, c-format +msgid "dropping the replication slot \"%s\" in database \"%s\"" +msgstr "データベース\"%2$s\"ã®ãƒ¬ãƒ—リケーションスロット\"%1$s:を削除ã—ã¾ã™" + +#: pg_createsubscriber.c:1389 +#, c-format +msgid "could not drop replication slot \"%s\" in database \"%s\": %s" +msgstr "データベース\"%2$s\"ã®ãƒ¬ãƒ—リケーションスロット\"%1$s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %3$s" + +#: pg_createsubscriber.c:1410 +#, c-format +msgid "pg_ctl failed with exit code %d" +msgstr "pg_ctlãŒçµ‚了コード%dã§å¤±æ•—ã—ã¾ã—ãŸ" + +#: pg_createsubscriber.c:1415 +#, c-format +msgid "pg_ctl was terminated by exception 0x%X" +msgstr "pg_ctlãŒä¾‹å¤–0x%Xã«ã‚ˆã£ã¦çµ‚了ã•ã›ã‚‰ã‚Œã¾ã—ãŸ" + +#: pg_createsubscriber.c:1417 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "16進値ã®èª¬æ˜Žã«ã¤ã„ã¦ã¯C インクルードファイル\"ntstatus.h\"ã‚’å‚ç…§ã—ã¦ãã ã•ã„。" + +#: pg_createsubscriber.c:1419 +#, c-format +msgid "pg_ctl was terminated by signal %d: %s" +msgstr "pg_ctlãŒã‚·ã‚°ãƒŠãƒ«%dã«ã‚ˆã£ã¦çµ‚了ã•ã›ã‚‰ã‚Œã¾ã—㟠%s" + +#: pg_createsubscriber.c:1425 +#, c-format +msgid "pg_ctl exited with unrecognized status %d" +msgstr "pg_ctlãŒèªè­˜ã§ããªã„状態%dã§çµ‚了ã—ã¾ã—ãŸ" + +#: pg_createsubscriber.c:1428 +#, c-format +msgid "The failed command was: %s" +msgstr "失敗ã—ãŸã‚³ãƒžãƒ³ãƒ‰ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šã§ã™: %s" + +#: pg_createsubscriber.c:1474 +#, c-format +msgid "server was started" +msgstr "サーãƒãƒ¼èµ·å‹•完了" + +#: pg_createsubscriber.c:1489 +#, c-format +msgid "server was stopped" +msgstr "サーãƒãƒ¼ã¯åœæ­¢ã—ã¾ã—ãŸ" + +#: pg_createsubscriber.c:1508 +#, c-format +msgid "waiting for the target server to reach the consistent state" +msgstr "対象サーãƒãƒ¼ãŒä¸€è²«æ€§ã®ã‚る状態ã«åˆ°é”ã™ã‚‹ã®ã‚’å¾…ã£ã¦ã„ã¾ã™" + +#: pg_createsubscriber.c:1531 +#, c-format +msgid "recovery timed out" +msgstr "リカãƒãƒªãƒ¼ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ" + +#: pg_createsubscriber.c:1544 +#, c-format +msgid "server did not end recovery" +msgstr "サーãƒãƒ¼ã¯ãƒªã‚«ãƒãƒªã‚’完了ã—ã¾ã›ã‚“ã§ã—ãŸ" + +#: pg_createsubscriber.c:1546 +#, c-format +msgid "target server reached the consistent state" +msgstr "対象サーãƒãƒ¼ãŒä¸€è²«æ€§ã®ã‚る状態ã«åˆ°é”ã—ã¾ã—ãŸ" + +#: pg_createsubscriber.c:1547 +#, c-format +msgid "If pg_createsubscriber fails after this point, you must recreate the physical replica before continuing." +msgstr "ã‚‚ã—pg_createsubscriberãŒä»Šæ™‚点より後ã§å¤±æ•—ã—ãŸå ´åˆã¯ã€ä½œæ¥­ã‚’継続ã™ã‚‹å‰ã«ç‰©ç†ãƒ¬ãƒ—リカをå†ä½œæˆã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" + +#: pg_createsubscriber.c:1574 +#, c-format +msgid "could not obtain publication information: %s" +msgstr "パブリケーション情報をå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:1588 +#, c-format +msgid "publication \"%s\" already exists" +msgstr "パブリケーション\"%s\"ã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™" + +#: pg_createsubscriber.c:1589 +#, c-format +msgid "Consider renaming this publication before continuing." +msgstr "作業を継続ã™ã‚‹å‰ã«ã“ã®ãƒ‘ブリケーションã®åå‰ã‚’変更ã™ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。" + +#: pg_createsubscriber.c:1596 +#, c-format +msgid "creating publication \"%s\" in database \"%s\"" +msgstr "データベース\"%2$s\"ã§ãƒ‘ブリケーション\"%1$s\"を作æˆã—ã¾ã™" + +#: pg_createsubscriber.c:1609 +#, c-format +msgid "could not create publication \"%s\" in database \"%s\": %s" +msgstr "データベース\"%2$s\"ã§ãƒ‘ブリケーション\"%1$s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %3$s" + +#: pg_createsubscriber.c:1638 +#, c-format +msgid "dropping publication \"%s\" in database \"%s\"" +msgstr "データベース\"%2$s\"ã®ãƒ‘ブリケーション\"%1$s\"を削除ã—ã¾ã™" + +#: pg_createsubscriber.c:1652 +#, c-format +msgid "could not drop publication \"%s\" in database \"%s\": %s" +msgstr "データベース\"%2$s\"ã®ãƒ‘ブリケーション\"%1$s\"ãŒå‰Šé™¤ã§ãã¾ã›ã‚“ã§ã—ãŸ: %3$s" + +#: pg_createsubscriber.c:1698 +#, c-format +msgid "creating subscription \"%s\" in database \"%s\"" +msgstr "データベース\"%2$s\"ã§ã‚µãƒ–スクリプション\"%1$s\"を作æˆã—ã¾ã™" + +#: pg_createsubscriber.c:1719 +#, c-format +msgid "could not create subscription \"%s\" in database \"%s\": %s" +msgstr "データベース\"%2$s\"ã§ã‚µãƒ–スクリプション\"%1$s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %3$s" + +#: pg_createsubscriber.c:1764 +#, c-format +msgid "could not obtain subscription OID: %s" +msgstr "サブスクリプションOIDãŒå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:1771 +#, c-format +msgid "could not obtain subscription OID: got %d rows, expected %d row" +msgstr "サブスクリプションOIDãŒå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%dè¡Œã€æƒ³å®šã¯%d行" + +#: pg_createsubscriber.c:1795 +#, c-format +msgid "setting the replication progress (node name \"%s\", LSN %s) in database \"%s\"" +msgstr "データベース\"%3$s\"ã§ã®ãƒ¬ãƒ—リケーションã®é€²æ—を設定ã—ã¦ã„ã¾ã™(ノードå\"%1$s\", LSN %2$s)" + +#: pg_createsubscriber.c:1810 +#, c-format +msgid "could not set replication progress for subscription \"%s\": %s" +msgstr "サブスクリプション\"%s\"ã«ãƒ¬ãƒ—リケーション進æ—を設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:1841 +#, c-format +msgid "enabling subscription \"%s\" in database \"%s\"" +msgstr "データベース\"%2$s\"ã®ã‚µãƒ–スクリプション\"%1$s\"を有効ã«ã—ã¾ã™" + +#: pg_createsubscriber.c:1853 +#, c-format +msgid "could not enable subscription \"%s\": %s" +msgstr "サブスクリプション\"%s\"を有効化ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_createsubscriber.c:1945 +#, c-format +msgid "cannot be executed by \"root\"" +msgstr "\"root\"ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" + +#: pg_createsubscriber.c:1946 +#, c-format +msgid "You must run %s as the PostgreSQL superuser." +msgstr "PostgreSQLã®ã‚¹ãƒ¼ãƒ‘ーユーザーã§%sを実行ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#: pg_createsubscriber.c:1967 +#, c-format +msgid "database \"%s\" specified more than once" +msgstr "データベース\"%s\"ãŒè¤‡æ•°å›žæŒ‡å®šã•れã¾ã—ãŸ" + +#: pg_createsubscriber.c:2008 +#, c-format +msgid "publication \"%s\" specified more than once" +msgstr "パブリケーション\"%s\"ãŒè¤‡æ•°å›žæŒ‡å®šã•れã¾ã—ãŸ" + +#: pg_createsubscriber.c:2020 +#, c-format +msgid "replication slot \"%s\" specified more than once" +msgstr "レプリケーションスロット\"%s\"ãŒè¤‡æ•°å›žæŒ‡å®šã•れã¾ã—ãŸ" + +#: pg_createsubscriber.c:2032 +#, c-format +msgid "subscription \"%s\" specified more than once" +msgstr "サブスクリプション\"%s\"ãŒè¤‡æ•°å›žæŒ‡å®šã•れã¾ã—ãŸ" + +#: pg_createsubscriber.c:2055 +#, c-format +msgid "no subscriber data directory specified" +msgstr "サブスクライãƒã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" + +#: pg_createsubscriber.c:2066 +#, c-format +msgid "could not determine current directory" +msgstr "カレントディレクトリを特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: pg_createsubscriber.c:2083 +#, c-format +msgid "no publisher connection string specified" +msgstr "ãƒ‘ãƒ–ãƒªãƒƒã‚·ãƒ£ã®æŽ¥ç¶šæ–‡å­—åˆ—ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" + +#: pg_createsubscriber.c:2087 +#, c-format +msgid "validating publisher connection string" +msgstr "ãƒ‘ãƒ–ãƒªãƒƒã‚·ãƒ£ã®æŽ¥ç¶šæ–‡å­—åˆ—ã®æ¤œè¨¼ä¸­" + +#: pg_createsubscriber.c:2093 +#, c-format +msgid "validating subscriber connection string" +msgstr "サブスクライãƒã®æŽ¥ç¶šæ–‡å­—åˆ—ã®æ¤œè¨¼ä¸­" + +#: pg_createsubscriber.c:2098 +#, c-format +msgid "no database was specified" +msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" + +#: pg_createsubscriber.c:2110 +#, c-format +msgid "database name \"%s\" was extracted from the publisher connection string" +msgstr "データベースå\"%s\"ãŒãƒ‘ãƒ–ãƒªãƒƒã‚·ãƒ£ã®æŽ¥ç¶šæ–‡å­—åˆ—ã‹ã‚‰æŠ½å‡ºã•れã¾ã—ãŸ" + +#: pg_createsubscriber.c:2115 +#, c-format +msgid "no database name specified" +msgstr "データベースåãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" + +#: pg_createsubscriber.c:2125 +#, c-format +msgid "wrong number of publication names specified" +msgstr "指定ã•れãŸãƒ‘ブリケーションåã®æ•°ãŒé–“é•ã£ã¦ã„ã¾ã™" + +#: pg_createsubscriber.c:2126 +#, c-format +msgid "The number of specified publication names (%d) must match the number of specified database names (%d)." +msgstr "パブリケーションåã®æ•°(%d)ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹åã®æ•°(%d)ã¨ä¸€è‡´ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" + +#: pg_createsubscriber.c:2132 +#, c-format +msgid "wrong number of subscription names specified" +msgstr "指定ã•れãŸã‚µãƒ–スクリプションåã®æ•°ãŒé–“é•ã£ã¦ã„ã¾ã™" + +#: pg_createsubscriber.c:2133 +#, c-format +msgid "The number of specified subscription names (%d) must match the number of specified database names (%d)." +msgstr "サブスクリプションåã®æ•°(%d)ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹åã®æ•°(%d)ã¨ä¸€è‡´ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" + +#: pg_createsubscriber.c:2139 +#, c-format +msgid "wrong number of replication slot names specified" +msgstr "指定ã•れãŸãƒ¬ãƒ—リケーションスロットåã®æ•°ãŒé–“é•ã£ã¦ã„ã¾ã™" + +#: pg_createsubscriber.c:2140 +#, c-format +msgid "The number of specified replication slot names (%d) must match the number of specified database names (%d)." +msgstr "レプリケーションスロットåã®æ•°(%d)ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹åã®æ•°(%d)ã¨ä¸€è‡´ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" + +#: pg_createsubscriber.c:2169 +#, c-format +msgid "subscriber data directory is not a copy of the source database cluster" +msgstr "サブスクライãƒã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯å…ƒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¯ãƒ©ã‚¹ã‚¿ã®ã‚³ãƒ”ーã§ã¯ã‚りã¾ã›ã‚“" + +#: pg_createsubscriber.c:2182 +#, c-format +msgid "standby server is running" +msgstr "スタンãƒã‚¤ã‚µãƒ¼ãƒãƒ¼ãŒç¨¼åƒä¸­ã§ã™" + +#: pg_createsubscriber.c:2183 +#, c-format +msgid "Stop the standby server and try again." +msgstr "ã“ã®ã‚¹ã‚¿ãƒ³ãƒã‚¤ã‚µãƒ¼ãƒãƒ¼ã‚’åœæ­¢ã—ã¦ã‹ã‚‰å†è©¦è¡Œã—ã¦ãã ã•ã„。" + +#: pg_createsubscriber.c:2192 +#, c-format +msgid "starting the standby server with command-line options" +msgstr "コマンドラインオプションを指定ã—ã¦ã‚¹ã‚¿ãƒ³ãƒã‚¤ã‚µãƒ¼ãƒãƒ¼ã‚’èµ·å‹•ã—ã¦ã„ã¾ã™" + +#: pg_createsubscriber.c:2208 pg_createsubscriber.c:2243 +#, c-format +msgid "stopping the subscriber" +msgstr "サブスクライãƒã‚’èµ·å‹•ã—ã¦ã„ã¾ã™" + +#: pg_createsubscriber.c:2222 +#, c-format +msgid "starting the subscriber" +msgstr "サブスクライãƒã‚’èµ·å‹•ã—ã¦ã„ã¾ã™" + +#: pg_createsubscriber.c:2251 +#, c-format +msgid "Done!" +msgstr "完了!" + +#: pg_receivewal.c:77 +#, c-format +msgid "" +"%s receives PostgreSQL streaming write-ahead logs.\n" +"\n" +msgstr "" +"%sã¯PostgreSQLã®å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’å—ä¿¡ã—ã¾ã™ã€‚\n" +"\n" + #: pg_receivewal.c:82 #, c-format msgid " -D, --directory=DIR receive write-ahead log files into this directory\n" msgstr " -D, --directory=DIR å—ä¿¡ã—ãŸå…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ã®æ ¼ç´ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n" -#: pg_receivewal.c:83 pg_recvlogical.c:83 +#: pg_receivewal.c:83 pg_recvlogical.c:93 #, c-format msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" msgstr " -E, --endpos=LSN 指定ã—ãŸLSNã®å—信後ã«çµ‚了\n" -#: pg_receivewal.c:84 pg_recvlogical.c:87 +#: pg_receivewal.c:84 pg_recvlogical.c:97 #, c-format msgid " --if-not-exists do not error if slot already exists when creating a slot\n" msgstr "   --if-not-exists スロットã®ä½œæˆæ™‚ã«æ—¢ã«å­˜åœ¨ã—ã¦ã„ã¦ã‚‚エラーã¨ã—ãªã„\n" -#: pg_receivewal.c:85 pg_recvlogical.c:89 +#: pg_receivewal.c:85 pg_recvlogical.c:99 #, c-format msgid " -n, --no-loop do not loop on connection lost\n" msgstr " -n, --no-loop 接続断ã®éš›ã«ãƒ«ãƒ¼ãƒ—ã—ãªã„\n" @@ -1171,7 +1972,7 @@ msgstr " -n, --no-loop 接続断ã®éš›ã«ãƒ«ãƒ¼ãƒ—ã—ãªã„\n" msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync ディスクã¸ã®å®‰å…¨ãªæ›¸ãè¾¼ã¿ã®å¾…機を行ã‚ãªã„\n" -#: pg_receivewal.c:87 pg_recvlogical.c:94 +#: pg_receivewal.c:87 pg_recvlogical.c:104 #, c-format msgid "" " -s, --status-interval=SECS\n" @@ -1204,14 +2005,14 @@ msgstr "" "\n" "追加ã®å‹•作:\n" -#: pg_receivewal.c:104 pg_recvlogical.c:79 +#: pg_receivewal.c:104 pg_recvlogical.c:89 #, c-format msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n" msgstr "" " --create-slot æ–°ã—ã„レプリケーションスロットを作æˆã™ã‚‹\n" " (スロットåã«ã¤ã„ã¦ã¯ --slot ã‚’å‚ç…§)\n" -#: pg_receivewal.c:105 pg_recvlogical.c:80 +#: pg_receivewal.c:105 pg_recvlogical.c:90 #, c-format msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n" msgstr "" @@ -1233,7 +2034,7 @@ msgstr "%X/%X (タイムライン %u)ã§ãƒ­ã‚°ã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’åœæ­¢ msgid "switched to timeline %u at %X/%X" msgstr "%3$X/%2$X㧠タイムライン%1$uã«åˆ‡ã‚Šæ›¿ãˆã¾ã—ãŸ" -#: pg_receivewal.c:224 +#: pg_receivewal.c:224 pg_recvlogical.c:1053 #, c-format msgid "received interrupt signal, exiting" msgstr "割り込ã¿ã‚·ã‚°ãƒŠãƒ«ã‚’å—ä¿¡ã€çµ‚了ã—ã¾ã™" @@ -1278,11 +2079,6 @@ msgstr "圧縮セグメントファイル\"%s\"ã®å±•開後サイズ%dãŒä¸æ­£ msgid "could not create LZ4 decompression context: %s" msgstr "LZ4伸張コンテキストを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_receivewal.c:402 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "ファイル\"%s\"ã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ: %m" - #: pg_receivewal.c:420 #, c-format msgid "could not decompress file \"%s\": %s" @@ -1308,7 +2104,7 @@ msgstr "ファイル\"%s\"ã®ç¢ºèªãŒã§ãã¾ã›ã‚“: %sã«ã‚ˆã‚‹åœ§ç¸®ã¯ã“ msgid "starting log streaming at %X/%X (timeline %u)" msgstr "%X/%X (タイムライン %u)ã‹ã‚‰ãƒ­ã‚°ã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’é–‹å§‹" -#: pg_receivewal.c:693 pg_recvlogical.c:783 +#: pg_receivewal.c:693 pg_recvlogical.c:801 #, c-format msgid "could not parse end position \"%s\"" msgstr "終了ä½ç½®\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" @@ -1338,28 +2134,28 @@ msgstr "%sã«ã‚ˆã‚‹åœ§ç¸®`ã¾ã ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" msgid "replication connection using slot \"%s\" is unexpectedly database specific" msgstr "スロット\"%s\"を使用ã™ã‚‹ãƒ¬ãƒ—リケーション接続ã§ã€æƒ³å®šã«åã—ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã™" -#: pg_receivewal.c:878 pg_recvlogical.c:954 +#: pg_receivewal.c:878 pg_recvlogical.c:972 #, c-format msgid "dropping replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を削除ã—ã¦ã„ã¾ã™" -#: pg_receivewal.c:889 pg_recvlogical.c:964 +#: pg_receivewal.c:889 pg_recvlogical.c:982 #, c-format msgid "creating replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を作æˆã—ã¦ã„ã¾ã™" -#: pg_receivewal.c:918 pg_recvlogical.c:988 +#: pg_receivewal.c:918 pg_recvlogical.c:1006 #, c-format msgid "disconnected" msgstr "切断ã—ã¾ã—ãŸ" #. translator: check source for value for %d -#: pg_receivewal.c:922 pg_recvlogical.c:992 +#: pg_receivewal.c:922 pg_recvlogical.c:1010 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "切断ã—ã¾ã—ãŸ; %d秒待機ã—ã¦å†è©¦è¡Œã—ã¾ã™" -#: pg_recvlogical.c:74 +#: pg_recvlogical.c:84 #, c-format msgid "" "%s controls PostgreSQL logical decoding streams.\n" @@ -1368,7 +2164,7 @@ msgstr "" "%s ã¯PostgreSQLã®è«–ç†ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’制御ã—ã¾ã™ã€‚\n" "\n" -#: pg_recvlogical.c:78 +#: pg_recvlogical.c:88 #, c-format msgid "" "\n" @@ -1377,19 +2173,19 @@ msgstr "" "\n" "実行ã™ã‚‹å‹•作:\n" -#: pg_recvlogical.c:81 +#: pg_recvlogical.c:91 #, c-format msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n" msgstr "" " --start レプリケーションスロットã§ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’é–‹å§‹ã™ã‚‹\n" " (スロットåã«ã¤ã„ã¦ã¯ --slot ã‚’å‚ç…§)\n" -#: pg_recvlogical.c:84 +#: pg_recvlogical.c:94 #, c-format msgid " -f, --file=FILE receive log into this file, - for stdout\n" msgstr " -f, --file=FILE ã“ã®ãƒ•ァイルã«ãƒ­ã‚°ã‚’å—ã‘å–る〠- ã§æ¨™æº–出力\n" -#: pg_recvlogical.c:85 +#: pg_recvlogical.c:95 #, c-format msgid "" " -F --fsync-interval=SECS\n" @@ -1398,12 +2194,12 @@ msgstr "" " -F --fsync-interval=SECS\n" " 出力ファイルã¸ã®fsync時間間隔(デフォルト: %d)\n" -#: pg_recvlogical.c:88 +#: pg_recvlogical.c:98 #, c-format msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n" msgstr " -I, --startpos=LSN 既存スロット内ã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°é–‹å§‹ä½ç½®\n" -#: pg_recvlogical.c:90 +#: pg_recvlogical.c:100 #, c-format msgid "" " -o, --option=NAME[=VALUE]\n" @@ -1414,143 +2210,143 @@ msgstr "" " 出力プラグインã«ã‚ªãƒ—ションNAMEをオプション値VALUEã¨\n" " ã¨ã‚‚ã«æ¸¡ã™\n" -#: pg_recvlogical.c:93 +#: pg_recvlogical.c:103 #, c-format msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n" msgstr " -P, --plugin=PLUGIN 出力プラグインPLUGINを使ã†(デフォルト: %s)\n" -#: pg_recvlogical.c:96 +#: pg_recvlogical.c:106 #, c-format msgid " -S, --slot=SLOTNAME name of the logical replication slot\n" msgstr " -S, --slot=SLOTNAME è«–ç†ãƒ¬ãƒ—リケーションスロットã®åå‰\n" -#: pg_recvlogical.c:97 +#: pg_recvlogical.c:107 #, c-format msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n" msgstr " -t, --two-phase ã‚¹ãƒ­ãƒƒãƒˆä½œæˆæ™‚ã«ãƒ—リペアドトランザクションã®ãƒ‡ã‚³ãƒ¼ãƒ‰ã‚’有効ã«ã™ã‚‹\n" -#: pg_recvlogical.c:102 +#: pg_recvlogical.c:112 #, c-format msgid " -d, --dbname=DBNAME database to connect to\n" msgstr " -d, --dbname=DBNAME 接続先データベース\n" -#: pg_recvlogical.c:135 +#: pg_recvlogical.c:145 #, c-format msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)" msgstr "PrecPpg%X/%Xã¾ã§ã®æ›¸ãè¾¼ã¿ã¨ã€%X/%X (スロット %s)ã¾ã§ã®ãƒ•ラッシュを確èªã—ã¦ã„ã¾ã™" -#: pg_recvlogical.c:159 receivelog.c:360 +#: pg_recvlogical.c:169 receivelog.c:360 #, c-format msgid "could not send feedback packet: %s" msgstr "フィードãƒãƒƒã‚¯ãƒ‘ケットをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_recvlogical.c:227 +#: pg_recvlogical.c:239 #, c-format msgid "starting log streaming at %X/%X (slot %s)" msgstr "%X/%X (スロット %s)ã‹ã‚‰ãƒ­ã‚°ã®ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ã‚’é–‹å§‹ã—ã¾ã™" -#: pg_recvlogical.c:269 +#: pg_recvlogical.c:281 #, c-format msgid "streaming initiated" msgstr "ストリーミングを開始ã—ã¾ã—ãŸ" -#: pg_recvlogical.c:333 +#: pg_recvlogical.c:346 #, c-format msgid "could not open log file \"%s\": %m" msgstr "ロックファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_recvlogical.c:362 receivelog.c:882 +#: pg_recvlogical.c:375 receivelog.c:882 #, c-format msgid "invalid socket: %s" msgstr "無効ãªã‚½ã‚±ãƒƒãƒˆ: %s" -#: pg_recvlogical.c:415 receivelog.c:910 +#: pg_recvlogical.c:428 receivelog.c:910 #, c-format msgid "%s() failed: %m" msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" -#: pg_recvlogical.c:422 receivelog.c:959 +#: pg_recvlogical.c:435 receivelog.c:959 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "WAL ストリームã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003 +#: pg_recvlogical.c:477 pg_recvlogical.c:528 receivelog.c:1003 #: receivelog.c:1066 #, c-format msgid "streaming header too small: %d" msgstr "ストリーミングヘッダãŒå°ã•éŽãŽã¾ã™: %d" -#: pg_recvlogical.c:499 receivelog.c:843 +#: pg_recvlogical.c:512 receivelog.c:843 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "ストリーミングヘッダをèªè­˜ã§ãã¾ã›ã‚“ã§ã—ãŸ: \"%c\"" -#: pg_recvlogical.c:553 pg_recvlogical.c:565 +#: pg_recvlogical.c:566 pg_recvlogical.c:578 #, c-format msgid "could not write %d bytes to log file \"%s\": %m" msgstr "%dãƒã‚¤ãƒˆã‚’ログファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679 +#: pg_recvlogical.c:636 receivelog.c:642 receivelog.c:679 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "レプリケーションストリームãŒçªç„¶çµ‚了ã—ã¾ã—ãŸ: %s" -#: pg_recvlogical.c:778 +#: pg_recvlogical.c:796 #, c-format msgid "could not parse start position \"%s\"" msgstr "é–‹å§‹ä½ç½®\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_recvlogical.c:856 +#: pg_recvlogical.c:874 #, c-format msgid "no slot specified" msgstr "ã‚¹ãƒ­ãƒƒãƒˆãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: pg_recvlogical.c:863 +#: pg_recvlogical.c:881 #, c-format msgid "no target file specified" msgstr "ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ•ã‚¡ã‚¤ãƒ«ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: pg_recvlogical.c:870 +#: pg_recvlogical.c:888 #, c-format msgid "no database specified" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: pg_recvlogical.c:877 +#: pg_recvlogical.c:895 #, c-format msgid "at least one action needs to be specified" msgstr "å°‘ãªãã¨ã‚‚一ã¤ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: pg_recvlogical.c:884 +#: pg_recvlogical.c:902 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "--create-slot ã‚„ --start 㯠--drop-slot ã¨åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: pg_recvlogical.c:891 +#: pg_recvlogical.c:909 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "--create-slot ã‚„ --drop-slot 㯠--startpos ã¨åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: pg_recvlogical.c:898 +#: pg_recvlogical.c:916 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos 㯠--start ãŒæŒ‡å®šã•れã¦ã„ã‚‹ã¨ãã«ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™" -#: pg_recvlogical.c:905 +#: pg_recvlogical.c:923 #, c-format msgid "--two-phase may only be specified with --create-slot" msgstr "--two-phaseã¯--create-slotãŒæŒ‡å®šã•れã¦ã„ã‚‹ã¨ãã«ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™" -#: pg_recvlogical.c:938 +#: pg_recvlogical.c:956 #, c-format msgid "could not establish database-specific replication connection" msgstr "データベース指定ã®ãƒ¬ãƒ—リケーション接続ãŒç¢ºç«‹ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_recvlogical.c:1032 +#: pg_recvlogical.c:1056 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "キープアライブã§çµ‚了ä½ç½® %X/%X ã«åˆ°é”ã—ã¾ã—㟠" -#: pg_recvlogical.c:1035 +#: pg_recvlogical.c:1061 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "%X/%X ã®WALレコードã§çµ‚了ä½ç½® %X/%X ã«åˆ°é”ã—ã¾ã—ãŸ" @@ -1666,7 +2462,7 @@ msgstr "ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³çµ‚äº†å¾Œã«æƒ³å®šå¤–ã®çµæžœã‚»ãƒƒãƒˆ: å—ä¿¡ã—㟠msgid "could not parse next timeline's starting point \"%s\"" msgstr "次ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ã®é–‹å§‹ãƒã‚¤ãƒ³ãƒˆ\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201 +#: receivelog.c:775 receivelog.c:1022 walmethods.c:1206 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" @@ -1691,115 +2487,126 @@ msgstr "WALファイル\"%2$s\"ã«%1$dãƒã‚¤ãƒˆæ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: % msgid "could not send copy-end packet: %s" msgstr "コピー終端パケットをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: streamutil.c:158 +#: streamutil.c:165 msgid "Password: " msgstr "パスワード: " -#: streamutil.c:181 +#: streamutil.c:192 #, c-format msgid "could not connect to server" msgstr "サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: streamutil.c:222 +#: streamutil.c:233 #, c-format -msgid "could not clear search_path: %s" -msgstr "search_pathを消去ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not clear \"search_path\": %s" +msgstr "\"search_path\"を消去ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: streamutil.c:238 +#: streamutil.c:249 #, c-format -msgid "could not determine server setting for integer_datetimes" -msgstr "integer_datetimesã®ã‚µãƒ¼ãƒãƒ¼è¨­å®šã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" +msgid "could not determine server setting for \"integer_datetimes\"" +msgstr "\"integer_datetimes\"ã®ã‚µãƒ¼ãƒãƒ¼è¨­å®šã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: streamutil.c:245 +#: streamutil.c:256 #, c-format -msgid "integer_datetimes compile flag does not match server" -msgstr "integer_datetimesコンパイル時フラグãŒã‚µãƒ¼ãƒãƒ¼ã¨ä¸€è‡´ã—ã¾ã›ã‚“" +msgid "\"integer_datetimes\" compile flag does not match server" +msgstr "コンパイル時フラグ\"integer_datetimes\"ãŒã‚µãƒ¼ãƒãƒ¼ã¨ç•°ãªã£ã¦ã„ã¾ã™" -#: streamutil.c:296 +#: streamutil.c:375 #, c-format msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "WALセグメントサイズをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%d行ã§%dåˆ—ã€æƒ³å®šã¯%d行ã§%d列以上" -#: streamutil.c:306 +#: streamutil.c:385 #, c-format msgid "WAL segment size could not be parsed" msgstr "WALセグメントサイズãŒãƒ‘ースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: streamutil.c:324 +#: streamutil.c:403 +#, c-format +msgid "remote server reported invalid WAL segment size (%d byte)" +msgid_plural "remote server reported invalid WAL segment size (%d bytes)" +msgstr[0] "リモートサーãƒãƒ¼ãŒä¸æ­£ãªWALセグメントサイズを報告ã—ã¦ãã¾ã—㟠(%dãƒã‚¤ãƒˆ)" + +#: streamutil.c:407 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes" -msgstr[0] "WALセグメントã®ã‚µã‚¤ã‚ºæŒ‡å®šã¯1MBã¨1GBã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“ã€ã—ã‹ã—対å‘サーãƒãƒ¼ã¯%dãƒã‚¤ãƒˆã¨å ±å‘Šã—ã¦ãã¾ã—ãŸ" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WALセグメントサイズã¯1MBã‹ã‚‰1GBã¾ã§ã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: streamutil.c:369 +#: streamutil.c:449 #, c-format msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "グループアクセスフラグをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%d行ã§%dåˆ—ã€æƒ³å®šã¯%d行ã§%d列以上" -#: streamutil.c:378 +#: streamutil.c:458 #, c-format msgid "group access flag could not be parsed: %s" msgstr "グループアクセスフラグãŒãƒ‘ースã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: streamutil.c:421 streamutil.c:458 +#: streamutil.c:501 streamutil.c:538 #, c-format msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "システムを識別ã§ãã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%d行%dåˆ—ã€æƒ³å®šã¯%d行%d列以上" -#: streamutil.c:510 +#: streamutil.c:590 #, c-format msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "レプリケーションスロット\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%d行%dåˆ—ã€æƒ³å®šã¯%d行%d列" -#: streamutil.c:522 +#: streamutil.c:602 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "レプリケーションスロット\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: streamutil.c:533 +#: streamutil.c:613 #, c-format msgid "expected a physical replication slot, got type \"%s\" instead" msgstr "物ç†ãƒ¬ãƒ—リケーションスロットãŒå¿…è¦ã§ã™ãŒã€ã‚¿ã‚¤ãƒ—ã¯\"%s\"ã§ã—ãŸ" -#: streamutil.c:547 +#: streamutil.c:627 #, c-format msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" msgstr "レプリケーションスロット\"%2$s\"ã®restart_lsn\"%1$s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: streamutil.c:664 +#: streamutil.c:744 #, c-format msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "レプリケーションスロット\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%d行%dåˆ—ã€æƒ³å®šã¯%d行%d列" -#: streamutil.c:708 +#: streamutil.c:788 #, c-format msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "レプリケーションスロット\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: å—ä¿¡ã—ãŸã®ã¯%d行%dåˆ—ã€æƒ³å®šã¯%d行%d列" -#: walmethods.c:721 walmethods.c:1264 +#: walmethods.c:726 walmethods.c:1269 msgid "could not compress data" msgstr "データを圧縮ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: walmethods.c:750 +#: walmethods.c:755 msgid "could not reset compression stream" msgstr "圧縮ストリームをリセットã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: walmethods.c:888 +#: walmethods.c:892 msgid "implementation error: tar files can't have more than one open file" msgstr "実装エラー: tarファイルã§ã¯2ã¤ä»¥ä¸Šã®ãƒ•ァイルをオープンã§ãã¾ã›ã‚“" -#: walmethods.c:903 +#: walmethods.c:907 msgid "could not create tar header" msgstr "tarヘッダを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: walmethods.c:920 walmethods.c:961 walmethods.c:1166 walmethods.c:1179 +#: walmethods.c:924 walmethods.c:965 walmethods.c:1171 walmethods.c:1184 msgid "could not change compression parameters" msgstr "圧縮パラメータを変更ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: walmethods.c:1052 +#: walmethods.c:1056 msgid "unlink not supported with compression" msgstr "圧縮時ã®unlinkã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: walmethods.c:1288 +#: walmethods.c:1293 msgid "could not close compression stream" msgstr "圧縮ストリームをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#~ msgid "Set the configuration parameter \"%s\" to -1 to ensure that required WAL files are not prematurely removed." +#~ msgstr "設定パラメータ\"%s\"ã‚’ -1 ã«è¨­å®šã—ã¦ã€å¿…è¦ã¨ãªã‚‹WALファイルãŒä½¿ç”¨ã•れるå‰ã«å‰Šé™¤ã•れãªã„よã†ã«ã—ã¦ãã ã•ã„。" + +#~ msgid "required WAL could be removed from the publisher" +#~ msgstr "å¿…è¦ãªWALãŒãƒ‘ブリッシャã‹ã‚‰å‰Šé™¤ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™" diff --git a/src/bin/pg_basebackup/po/ka.po b/src/bin/pg_basebackup/po/ka.po index 8feb3bd4bf24e..970f3bbd016b6 100644 --- a/src/bin/pg_basebackup/po/ka.po +++ b/src/bin/pg_basebackup/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_basebackup (PostgreSQL) 16\n" +"Project-Id-Version: pg_basebackup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-19 11:18+0000\n" -"PO-Revision-Date: 2023-04-20 08:19+0200\n" +"POT-Creation-Date: 2024-08-27 16:49+0000\n" +"PO-Revision-Date: 2024-08-28 05:55+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -67,8 +67,8 @@ msgstr "შემუმშვის პáƒáƒ áƒáƒ›áƒ”ტრ \"%s\"-ის ნ #: ../../common/compression.c:331 #, c-format -msgid "value for compression option \"%s\" must be a boolean" -msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრის \"%s\" მნიშვნელáƒáƒ‘რლáƒáƒ’იკური უნდრიყáƒáƒ¡" +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘რ\"%s\" ლáƒáƒ’იკურ მნიშვნელáƒáƒ‘áƒáƒ¡ უნდრწáƒáƒ áƒ›áƒáƒáƒ“გენდეს" #: ../../common/compression.c:379 #, c-format @@ -78,7 +78,7 @@ msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" შეკ #: ../../common/compression.c:386 #, c-format msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" -msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მის \"%s\" შეკუმშვის დáƒáƒœáƒ” %d-სრდრ%d-ს შáƒáƒ áƒ˜áƒ¡ უნდრიყáƒáƒ¡ (ნáƒáƒ’ულისხმები %d)" +msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მის \"%s\" შეკუმშვის დáƒáƒœáƒ” %d-სრდრ%d-ს შáƒáƒ áƒ˜áƒ¡ უნდრიყáƒáƒ¡ (ნáƒáƒ’ულისხმევი %d)" #: ../../common/compression.c:397 #, c-format @@ -90,6 +90,63 @@ msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" დáƒáƒ› msgid "compression algorithm \"%s\" does not support long-distance mode" msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" long-distance რეჟიმის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:110 pg_basebackup.c:1873 +#: pg_receivewal.c:402 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\"-ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %zu-დáƒáƒœ" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: bbstreamer_file.c:138 pg_recvlogical.c:650 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რáƒáƒ  ემთხვევáƒ" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘ის შესáƒáƒ«áƒšáƒ შეუსáƒáƒ‘áƒáƒ›áƒáƒ‘რpg_control ფáƒáƒ˜áƒšáƒ˜áƒ¡ შესáƒáƒœáƒáƒ®áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული \n" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რშესáƒáƒ«áƒšáƒáƒ áƒáƒ  ემთხვეáƒáƒ“ეს áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ მიერ გáƒáƒ›áƒáƒ§áƒ”ნებულს. áƒáƒ› შემთხვევáƒáƒ¨áƒ˜ ქვემáƒáƒ— \n" +"მáƒáƒªáƒ”მული შედეგები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იქნებრდრPostgreSQL ეს áƒáƒ’ებრáƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ შეუთáƒáƒ•სებელი იქნებáƒ." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: pg_basebackup.c:1846 pg_receivewal.c:386 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 pg_recvlogical.c:204 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format @@ -101,39 +158,69 @@ msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:447 -#: pg_receivewal.c:319 pg_recvlogical.c:339 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_receivewal.c:319 pg_recvlogical.c:352 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" -#: ../../common/file_utils.c:162 pg_receivewal.c:242 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_receivewal.c:242 #, c-format msgid "could not open directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: ../../common/file_utils.c:196 pg_receivewal.c:471 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_receivewal.c:471 #, c-format msgid "could not read directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: ../../common/file_utils.c:228 ../../common/file_utils.c:287 -#: ../../common/file_utils.c:361 ../../fe_utils/recovery_gen.c:121 -#: pg_receivewal.c:386 +#: ../../common/file_utils.c:498 pg_basebackup.c:2344 walmethods.c:462 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" -#: ../../common/file_utils.c:299 ../../common/file_utils.c:369 -#: pg_recvlogical.c:194 +#: ../../common/restricted_token.c:60 #, c-format -msgid "could not fsync file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" +msgid "could not open process token: error code %lu" +msgstr "პრáƒáƒªáƒ”სის კáƒáƒ“ის გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" -#: ../../common/file_utils.c:379 pg_basebackup.c:2237 walmethods.c:462 +#: ../../common/restricted_token.c:74 #, c-format -msgid "could not rename file \"%s\" to \"%s\": %m" -msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" +msgid "could not allocate SIDs: error code %lu" +msgstr "შეცდáƒáƒ›áƒ SSID-ების გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: ../../common/restricted_token.c:94 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "შეზღუდული კáƒáƒ“ის შექმნრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: ../../common/restricted_token.c:115 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "„%s“ ბრძáƒáƒœáƒ”ბის პრáƒáƒªáƒ”სის დáƒáƒ¬áƒ§áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: ../../common/restricted_token.c:153 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "შეზღუდულ კáƒáƒ“ის ხელáƒáƒ®áƒšáƒ შესრულებრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "ქვეპრáƒáƒªáƒ”სიდáƒáƒœ გáƒáƒ¡áƒáƒ¡áƒ•ლელი კáƒáƒ“ი ვერ მივიღე: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" #: ../../fe_utils/option_utils.c:69 #, c-format @@ -145,51 +232,62 @@ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პრmsgid "%s must be in range %d..%d" msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1609 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "უცნáƒáƒ‘ი სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი: %s" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 pg_basebackup.c:1636 streamutil.c:331 #, c-format msgid "out of memory" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" -#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121 -#: bbstreamer_file.c:258 pg_basebackup.c:1406 pg_basebackup.c:1700 +#: ../../fe_utils/recovery_gen.c:143 bbstreamer_file.c:121 +#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727 #, c-format msgid "could not write to file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" -#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:360 -#: pg_basebackup.c:1470 pg_basebackup.c:1679 +#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:361 +#: pg_basebackup.c:1497 pg_basebackup.c:1706 #, c-format msgid "could not create file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %m" -#: bbstreamer_file.c:138 pg_recvlogical.c:633 +#: ../../fe_utils/string_utils.c:434 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის áƒáƒ áƒ’უმენტი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" #: bbstreamer_file.c:275 #, c-format msgid "unexpected state while extracting archive" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის გáƒáƒ¨áƒšáƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒ" -#: bbstreamer_file.c:320 pg_basebackup.c:686 pg_basebackup.c:730 +#: bbstreamer_file.c:321 pg_basebackup.c:698 pg_basebackup.c:712 +#: pg_basebackup.c:757 #, c-format msgid "could not create directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m" -#: bbstreamer_file.c:325 +#: bbstreamer_file.c:326 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეზე \"%s\" წვდáƒáƒ›áƒ”ბის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %m" -#: bbstreamer_file.c:344 +#: bbstreamer_file.c:345 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "%s-დáƒáƒœ %s-მდე სიმბმულის შექმნრშეუძლებელიáƒ: %m" -#: bbstreamer_file.c:364 +#: bbstreamer_file.c:365 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ–ე \"%s\" წვდáƒáƒ›áƒ”ბის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %m" @@ -224,7 +322,7 @@ msgstr "შეკუმშული ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რ msgid "could not close compressed file \"%s\": %m" msgstr "შეკუმშული ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: bbstreamer_gzip.c:245 +#: bbstreamer_gzip.c:245 walmethods.c:880 #, c-format msgid "could not initialize compression library" msgstr "შეკუმშვის ბიბლიáƒáƒ—ეკის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" @@ -274,12 +372,12 @@ msgstr "tar ფáƒáƒ˜áƒšáƒ˜áƒ¡ ბáƒáƒšáƒáƒ¡áƒáƒ áƒ—ი 2 ბლáƒáƒ™áƒ¡ ს msgid "unexpected state while parsing tar archive" msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘რtar áƒáƒ áƒ¥áƒ˜áƒ•ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებისáƒáƒ¡" -#: bbstreamer_tar.c:296 +#: bbstreamer_tar.c:292 #, c-format msgid "tar member has empty name" msgstr "tar-ის წევრს ცáƒáƒ áƒ˜áƒ”ლი სáƒáƒ®áƒ”ლი áƒáƒ¥áƒ•ს" -#: bbstreamer_tar.c:328 +#: bbstreamer_tar.c:326 #, c-format msgid "COPY stream ended before last file was finished" msgstr "COPY-ის ნáƒáƒ™áƒáƒ“ი ბáƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბáƒáƒ›áƒ“ე დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ" @@ -301,95 +399,95 @@ msgstr "შეკუმშვის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”ს #: bbstreamer_zstd.c:116 #, c-format -msgid "could not set compression flag for %s: %s" -msgstr "%s-სთვის შეკუმშვის დáƒáƒœáƒ˜áƒ¡ დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" +msgid "could not enable long-distance mode: %s" +msgstr "long-distance რეჟიმი ვერ ჩáƒáƒ•რთე: %s" #: bbstreamer_zstd.c:275 #, c-format msgid "could not create zstd decompression context" msgstr "zstd გáƒáƒ¨áƒšáƒ˜áƒ¡ კáƒáƒœáƒ¢áƒ”ქსტის შექმნის შეცდáƒáƒ›áƒ" -#: pg_basebackup.c:238 +#: pg_basebackup.c:245 #, c-format msgid "removing data directory \"%s\"" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ \"%s\"" -#: pg_basebackup.c:240 +#: pg_basebackup.c:247 #, c-format msgid "failed to remove data directory" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: pg_basebackup.c:244 +#: pg_basebackup.c:251 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ \"%s\"" -#: pg_basebackup.c:246 +#: pg_basebackup.c:253 #, c-format msgid "failed to remove contents of data directory" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: pg_basebackup.c:251 +#: pg_basebackup.c:258 #, c-format msgid "removing WAL directory \"%s\"" msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ \"%s\"" -#: pg_basebackup.c:253 +#: pg_basebackup.c:260 #, c-format msgid "failed to remove WAL directory" msgstr "შეცდáƒáƒ›áƒ WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ˜áƒ¡áƒáƒ¡" -#: pg_basebackup.c:257 +#: pg_basebackup.c:264 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ" -#: pg_basebackup.c:259 +#: pg_basebackup.c:266 #, c-format msgid "failed to remove contents of WAL directory" msgstr "შეცდáƒáƒ›áƒ WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ˜áƒ¡áƒáƒ¡" -#: pg_basebackup.c:265 +#: pg_basebackup.c:272 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მáƒáƒ—ხáƒáƒ•ნისáƒáƒ¡ áƒáƒ  წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ" -#: pg_basebackup.c:268 +#: pg_basebackup.c:275 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მáƒáƒ—ხáƒáƒ•ნისáƒáƒ¡ áƒáƒ  წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ" -#: pg_basebackup.c:272 +#: pg_basebackup.c:279 #, c-format msgid "changes to tablespace directories will not be undone" msgstr "ცხრილების სივრცის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეების ცვლილებების დáƒáƒ‘რუნებრშეუძლებელიáƒ" -#: pg_basebackup.c:324 +#: pg_basebackup.c:331 #, c-format msgid "directory name too long" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის სáƒáƒ®áƒ”ლი ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" -#: pg_basebackup.c:331 +#: pg_basebackup.c:338 #, c-format msgid "multiple \"=\" signs in tablespace mapping" msgstr "ცხრილების სივრცის მიბმáƒáƒ¨áƒ˜ ერთზე მეტი \"=\" ნიშáƒáƒœáƒ˜áƒ" -#: pg_basebackup.c:340 +#: pg_basebackup.c:347 #, c-format msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "ცხრილების მიბმის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ \"%s\", უნდრიყáƒáƒ¡ \"OLDDIR=NEWDIR\"" -#: pg_basebackup.c:359 +#: pg_basebackup.c:366 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "ძველი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ბილიკი ცხრილის სივრცის მიბმáƒáƒ¨áƒ˜ áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ áƒáƒ áƒáƒ: %s" -#: pg_basebackup.c:363 +#: pg_basebackup.c:370 #, c-format msgid "new directory is not an absolute path in tablespace mapping: %s" msgstr "áƒáƒ®áƒáƒšáƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ბილიკი ცხრილის სივრცის მიბმáƒáƒ¨áƒ˜ áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ áƒáƒ áƒáƒ: %s" -#: pg_basebackup.c:385 +#: pg_basebackup.c:392 #, c-format msgid "" "%s takes a base backup of a running PostgreSQL server.\n" @@ -398,17 +496,19 @@ msgstr "" "%s გáƒáƒ¨áƒ•ებული PostgreSQL სერვერის მáƒáƒ áƒ¥áƒáƒ¤áƒ¡ იღებს.\n" "\n" -#: pg_basebackup.c:387 pg_receivewal.c:79 pg_recvlogical.c:76 +#: pg_basebackup.c:394 pg_createsubscriber.c:221 pg_receivewal.c:79 +#: pg_recvlogical.c:86 #, c-format msgid "Usage:\n" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" -#: pg_basebackup.c:388 pg_receivewal.c:80 pg_recvlogical.c:77 +#: pg_basebackup.c:395 pg_createsubscriber.c:222 pg_receivewal.c:80 +#: pg_recvlogical.c:87 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]...\n" -#: pg_basebackup.c:389 +#: pg_basebackup.c:396 #, c-format msgid "" "\n" @@ -417,17 +517,26 @@ msgstr "" "\n" "პáƒáƒ áƒáƒ›áƒ”ტრები, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბენ გáƒáƒ›áƒáƒ¢áƒáƒœáƒáƒ¡:\n" -#: pg_basebackup.c:390 +#: pg_basebackup.c:397 #, c-format msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n" msgstr " -D, --pgdata=სáƒáƒ¥áƒáƒ¦áƒšáƒ“ე იღებს ბáƒáƒ–ის სáƒáƒ áƒ”ზერვრáƒáƒ¡áƒšáƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში\n" -#: pg_basebackup.c:391 +#: pg_basebackup.c:398 #, c-format msgid " -F, --format=p|t output format (plain (default), tar)\n" -msgstr " -F, --format=p|t გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ (plain (ნáƒáƒ’ულისხმები), tar)\n" +msgstr " -F, --format=p|t გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ (plain (ნáƒáƒ’ულისხმევი), tar)\n" -#: pg_basebackup.c:392 +#: pg_basebackup.c:399 +#, c-format +msgid "" +" -i, --incremental=OLDMANIFEST\n" +" take incremental backup\n" +msgstr "" +" -i, --incremental=ძველიმáƒáƒœáƒ˜áƒ¤áƒ”სტი\n" +" ინკრემენტული მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ áƒáƒ¦áƒ”ბáƒ\n" + +#: pg_basebackup.c:401 #, c-format msgid "" " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" @@ -436,7 +545,7 @@ msgstr "" " -r, --max-rate=RATE მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიჩქáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მისáƒáƒ¡\n" " (kB/s-ში, áƒáƒœ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ სუფიქსი \"k\" áƒáƒœ \"M\")\n" -#: pg_basebackup.c:394 +#: pg_basebackup.c:403 #, c-format msgid "" " -R, --write-recovery-conf\n" @@ -445,7 +554,7 @@ msgstr "" " -R, --write-recovery-conf\n" " რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რრ\n" -#: pg_basebackup.c:396 +#: pg_basebackup.c:405 #, c-format msgid "" " -t, --target=TARGET[:DETAIL]\n" @@ -454,7 +563,7 @@ msgstr "" " -t, --target=TARGET[:DETAIL]\n" " სáƒáƒ›áƒ˜áƒ–ნის მáƒáƒ áƒ¥áƒáƒ¤áƒ˜(თუ კლიენტისგáƒáƒœ გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ებულიáƒ)\n" -#: pg_basebackup.c:398 +#: pg_basebackup.c:407 #, c-format msgid "" " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" @@ -463,12 +572,12 @@ msgstr "" " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" " ცხრილების სივრცის OLDDIR -დáƒáƒœ NEWDIR-ში გáƒáƒ“áƒáƒ¢áƒáƒœáƒ\n" -#: pg_basebackup.c:400 +#: pg_basebackup.c:409 #, c-format msgid " --waldir=WALDIR location for the write-ahead log directory\n" msgstr " --waldir=WALDIR წინáƒáƒ¡áƒ¬áƒáƒ  ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ (WAL) სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n" -#: pg_basebackup.c:401 +#: pg_basebackup.c:410 #, c-format msgid "" " -X, --wal-method=none|fetch|stream\n" @@ -477,12 +586,12 @@ msgstr "" " -X, --wal-method=none|fetch|stream\n" " სáƒáƒ­áƒ˜áƒ áƒ WAL ფáƒáƒ˜áƒšáƒ”ბის მითითებული მეთáƒáƒ“ით ჩáƒáƒ¡áƒ›áƒ\n" -#: pg_basebackup.c:403 +#: pg_basebackup.c:412 #, c-format msgid " -z, --gzip compress tar output\n" msgstr " -z, --gzip შექნილი tar ფáƒáƒ˜áƒšáƒ˜áƒ¡ შეკუმშვáƒ\n" -#: pg_basebackup.c:404 +#: pg_basebackup.c:413 #, c-format msgid "" " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" @@ -491,12 +600,12 @@ msgstr "" " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" " შეკუმშვის ჩáƒáƒ áƒ—ვრსერვერზე áƒáƒœ კლიენტზე, მითითებისáƒáƒ›áƒ”ბრ\n" -#: pg_basebackup.c:406 +#: pg_basebackup.c:415 #, c-format msgid " -Z, --compress=none do not compress tar output\n" msgstr " -Z, --compress=none შექმნილი tar áƒáƒ áƒ¥áƒ˜áƒ•ი áƒáƒ  შეიკუმშებáƒ\n" -#: pg_basebackup.c:407 +#: pg_basebackup.c:416 #, c-format msgid "" "\n" @@ -505,56 +614,56 @@ msgstr "" "\n" "ზáƒáƒ’áƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_basebackup.c:408 +#: pg_basebackup.c:417 #, c-format msgid "" " -c, --checkpoint=fast|spread\n" -" set fast or spread checkpointing\n" +" set fast or spread (default) checkpointing\n" msgstr "" " -c, --checkpoint=fast|spread\n" -" სწრáƒáƒ¤áƒ˜ áƒáƒœ გáƒáƒ¤áƒáƒœáƒ¢áƒ£áƒšáƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილები\n" +" სწრáƒáƒ¤áƒ˜(fast) áƒáƒœ გáƒáƒ¤áƒáƒœáƒ¢áƒ£áƒšáƒ˜(spread) (ნáƒáƒ’ულიხმევი) სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილების დáƒáƒ§áƒ”ნებáƒ\n" -#: pg_basebackup.c:410 +#: pg_basebackup.c:419 #, c-format msgid " -C, --create-slot create replication slot\n" msgstr " -C, --create-slot რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ შექმნáƒ\n" -#: pg_basebackup.c:411 +#: pg_basebackup.c:420 #, c-format msgid " -l, --label=LABEL set backup label\n" msgstr " -l, --label=LABEL მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ ჭდის შექმნáƒ\n" -#: pg_basebackup.c:412 +#: pg_basebackup.c:421 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean შეცდáƒáƒ›áƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜ áƒáƒ  გáƒáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•áƒ\n" -#: pg_basebackup.c:413 +#: pg_basebackup.c:422 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync áƒáƒ  დáƒáƒ•ელáƒáƒ“რცვლილებების დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡\n" -#: pg_basebackup.c:414 +#: pg_basebackup.c:423 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress მიმდინáƒáƒ áƒ”áƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებáƒ\n" -#: pg_basebackup.c:415 pg_receivewal.c:89 +#: pg_basebackup.c:424 pg_receivewal.c:89 #, c-format msgid " -S, --slot=SLOTNAME replication slot to use\n" msgstr " -S, --slot=SLOTNAME გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებელი სლáƒáƒ¢áƒ˜\n" -#: pg_basebackup.c:416 pg_receivewal.c:91 pg_recvlogical.c:98 +#: pg_basebackup.c:425 pg_receivewal.c:91 pg_recvlogical.c:108 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: pg_basebackup.c:417 pg_receivewal.c:92 pg_recvlogical.c:99 +#: pg_basebackup.c:426 pg_receivewal.c:92 pg_recvlogical.c:109 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_basebackup.c:418 +#: pg_basebackup.c:427 #, c-format msgid "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" @@ -563,7 +672,7 @@ msgstr "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" " მáƒáƒœáƒ˜áƒ¤áƒ”სტების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ—ვლელი áƒáƒšáƒ¤áƒáƒ áƒ˜áƒ—მი\n" -#: pg_basebackup.c:420 +#: pg_basebackup.c:429 #, c-format msgid "" " --manifest-force-encode\n" @@ -572,22 +681,22 @@ msgstr "" " --manifest-force-encode\n" " მáƒáƒœáƒ˜áƒ¤áƒ”სტში ყველრფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის თექვსმეტáƒáƒ‘ითში კáƒáƒ“ირებáƒ\n" -#: pg_basebackup.c:422 +#: pg_basebackup.c:431 #, c-format msgid " --no-estimate-size do not estimate backup size in server side\n" msgstr " --no-estimate-size მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ ზáƒáƒ›áƒ სერვერის მხáƒáƒ áƒ”ს áƒáƒ  გáƒáƒ˜áƒ–áƒáƒ›áƒ”ბáƒ\n" -#: pg_basebackup.c:423 +#: pg_basebackup.c:432 #, c-format msgid " --no-manifest suppress generation of backup manifest\n" msgstr " --no-manifest მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ მáƒáƒœáƒ˜áƒ¤áƒ”სტი áƒáƒ  შეიქმნებáƒ\n" -#: pg_basebackup.c:424 +#: pg_basebackup.c:433 #, c-format msgid " --no-slot prevent creation of temporary replication slot\n" msgstr " --no-slot რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ”ბითი სლáƒáƒ¢áƒ˜áƒ¡ შექმნის თáƒáƒ•იდáƒáƒœ áƒáƒªáƒ˜áƒšáƒ”ბáƒ\n" -#: pg_basebackup.c:425 +#: pg_basebackup.c:434 #, c-format msgid "" " --no-verify-checksums\n" @@ -596,12 +705,21 @@ msgstr "" " --no-verify-checksums\n" " სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი áƒáƒ  შემáƒáƒ¬áƒ›áƒ“ებáƒ\n" -#: pg_basebackup.c:427 pg_receivewal.c:95 pg_recvlogical.c:100 +#: pg_basebackup.c:436 +#, c-format +msgid "" +" --sync-method=METHOD\n" +" set method for syncing files to disk\n" +msgstr "" +" --sync-method=მეთáƒáƒ“ი\n" +" ფáƒáƒ˜áƒšáƒ”ბის დისკზე სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის დáƒáƒ§áƒ”ნებáƒ\n" + +#: pg_basebackup.c:438 pg_receivewal.c:95 pg_recvlogical.c:110 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_basebackup.c:428 pg_receivewal.c:96 pg_recvlogical.c:101 +#: pg_basebackup.c:439 pg_receivewal.c:96 pg_recvlogical.c:111 #, c-format msgid "" "\n" @@ -610,22 +728,22 @@ msgstr "" "\n" "შეერთების პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_basebackup.c:429 pg_receivewal.c:97 +#: pg_basebackup.c:440 pg_receivewal.c:97 #, c-format msgid " -d, --dbname=CONNSTR connection string\n" msgstr " -d, --dbname=CONNSTR კáƒáƒ•შირის სტრიქáƒáƒœáƒ˜\n" -#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103 +#: pg_basebackup.c:441 pg_receivewal.c:98 pg_recvlogical.c:113 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: pg_basebackup.c:431 pg_receivewal.c:99 pg_recvlogical.c:104 +#: pg_basebackup.c:442 pg_receivewal.c:99 pg_recvlogical.c:114 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜\n" -#: pg_basebackup.c:432 +#: pg_basebackup.c:443 #, c-format msgid "" " -s, --status-interval=INTERVAL\n" @@ -634,22 +752,23 @@ msgstr "" " -s, --status-interval=INTERVAL=INTERVAL\n" " სერვერზე გáƒáƒ’ზáƒáƒ•ნილ სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ პáƒáƒ™áƒ”ტებს შáƒáƒ áƒ˜áƒ¡ დáƒáƒ§áƒáƒ•ნებáƒ(წáƒáƒ›áƒ”ბში)\n" -#: pg_basebackup.c:434 pg_receivewal.c:100 pg_recvlogical.c:105 +#: pg_basebackup.c:445 pg_receivewal.c:100 pg_recvlogical.c:115 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: pg_basebackup.c:435 pg_receivewal.c:101 pg_recvlogical.c:106 +#: pg_basebackup.c:446 pg_receivewal.c:101 pg_recvlogical.c:116 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password áƒáƒ áƒáƒ¡áƒáƒ“ეს მკითხრპáƒáƒ áƒáƒšáƒ˜\n" -#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107 +#: pg_basebackup.c:447 pg_receivewal.c:102 pg_recvlogical.c:117 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password პáƒáƒ áƒáƒšáƒ˜áƒ¡ ყáƒáƒ•ელთვის კითხვრ(áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ უნდრხდებáƒáƒ“ეს)\n" -#: pg_basebackup.c:437 pg_receivewal.c:106 pg_recvlogical.c:108 +#: pg_basebackup.c:448 pg_createsubscriber.c:240 pg_receivewal.c:106 +#: pg_recvlogical.c:118 #, c-format msgid "" "\n" @@ -658,484 +777,548 @@ msgstr "" "\n" "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n" -#: pg_basebackup.c:438 pg_receivewal.c:107 pg_recvlogical.c:109 +#: pg_basebackup.c:449 pg_createsubscriber.c:241 pg_receivewal.c:107 +#: pg_recvlogical.c:119 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" -#: pg_basebackup.c:477 +#: pg_basebackup.c:488 #, c-format msgid "could not read from ready pipe: %m" msgstr "მზრფáƒáƒ˜áƒ¤áƒ˜áƒ“áƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: pg_basebackup.c:480 pg_basebackup.c:622 pg_basebackup.c:2151 -#: streamutil.c:441 +#: pg_basebackup.c:491 pg_basebackup.c:633 pg_basebackup.c:2258 +#: streamutil.c:518 #, c-format msgid "could not parse write-ahead log location \"%s\"" msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: %s" -#: pg_basebackup.c:585 pg_receivewal.c:600 +#: pg_basebackup.c:596 pg_receivewal.c:600 #, c-format msgid "could not finish writing WAL files: %m" msgstr "\"WAL\" ფáƒáƒ˜áƒšáƒ”ბის ჩáƒáƒ¬áƒ”რის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %m" -#: pg_basebackup.c:631 +#: pg_basebackup.c:642 #, c-format msgid "could not create pipe for background process: %m" msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ პრáƒáƒªáƒ”სისთვის ფáƒáƒ˜áƒ¤áƒ˜áƒ¡ შექმნის შეცდáƒáƒ›áƒ: %m" -#: pg_basebackup.c:664 +#: pg_basebackup.c:676 #, c-format msgid "created temporary replication slot \"%s\"" msgstr "შექმნილირრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ დრáƒáƒ”ბითი სლáƒáƒ¢áƒ˜ %s" -#: pg_basebackup.c:667 +#: pg_basebackup.c:679 #, c-format msgid "created replication slot \"%s\"" msgstr "შექმნილირრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ %s" -#: pg_basebackup.c:701 +#: pg_basebackup.c:728 #, c-format msgid "could not create background process: %m" msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ პრáƒáƒªáƒ”სის შექმნის შეცდáƒáƒ›áƒ: %m" -#: pg_basebackup.c:710 +#: pg_basebackup.c:737 #, c-format msgid "could not create background thread: %m" msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ ნáƒáƒ™áƒáƒ“ის შექმნის შეცდáƒáƒ›áƒ: %m" -#: pg_basebackup.c:749 +#: pg_basebackup.c:776 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ áƒáƒ" -#: pg_basebackup.c:755 +#: pg_basebackup.c:782 pg_createsubscriber.c:390 #, c-format msgid "could not access directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: pg_basebackup.c:831 +#: pg_basebackup.c:858 #, c-format msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" msgstr[0] "%*s/%s კბ (100%%), %d/%d ცხრილების სივრცე %*s" msgstr[1] "%*s/%s კბ (100%%), %d/%d ცხრილების სივრცე %*s" -#: pg_basebackup.c:843 +#: pg_basebackup.c:870 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" msgstr[0] "%*s/%s კბ (%d%%), %d/%d ცხრილების სივრცე (%s%-*.*s)" msgstr[1] "%*s/%s კბ (%d%%), %d/%d ცხრილების სივრცე (%s%-*.*s)" -#: pg_basebackup.c:859 +#: pg_basebackup.c:886 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" msgstr[0] "%*s/%s კბ (%d%%), %d/%d ცხრილების სივრცე" msgstr[1] "%*s/%s კბ (%d%%), %d/%d ცხრილების სივრცე" -#: pg_basebackup.c:883 +#: pg_basebackup.c:910 #, c-format msgid "transfer rate \"%s\" is not a valid value" msgstr "გáƒáƒ“áƒáƒªáƒ”მის სიჩქáƒáƒ áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: %s" -#: pg_basebackup.c:885 +#: pg_basebackup.c:912 #, c-format msgid "invalid transfer rate \"%s\": %m" msgstr "გáƒáƒ“áƒáƒªáƒ”მის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიჩქáƒáƒ áƒ” \"%s\": %m" -#: pg_basebackup.c:892 +#: pg_basebackup.c:919 #, c-format msgid "transfer rate must be greater than zero" msgstr "გáƒáƒ“áƒáƒªáƒ”მის სიჩქáƒáƒ áƒ” ნულზე მეტი უნდრიყáƒáƒ¡" -#: pg_basebackup.c:922 +#: pg_basebackup.c:949 #, c-format msgid "invalid --max-rate unit: \"%s\"" msgstr "--max-rate -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ერთეული: \"%s\"" -#: pg_basebackup.c:926 +#: pg_basebackup.c:953 #, c-format msgid "transfer rate \"%s\" exceeds integer range" msgstr "გáƒáƒ“áƒáƒªáƒ”მის სიჩქáƒáƒ áƒ” მთელი რიცხვის დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ áƒáƒ¦áƒ”მáƒáƒ¢áƒ”ბáƒ: %s" -#: pg_basebackup.c:933 +#: pg_basebackup.c:960 #, c-format msgid "transfer rate \"%s\" is out of range" msgstr "გáƒáƒ“áƒáƒªáƒ”მის სიჩქáƒáƒ áƒ˜áƒ¡ მნიშვნელáƒáƒ‘რდიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ: %s" -#: pg_basebackup.c:995 +#: pg_basebackup.c:1022 #, c-format msgid "could not get COPY data stream: %s" msgstr "\"COPY\"-ის მáƒáƒœáƒáƒªáƒ”მების ნáƒáƒ™áƒáƒ“ის მიღების შეცდáƒáƒ›áƒ: %s" -#: pg_basebackup.c:1012 pg_recvlogical.c:436 pg_recvlogical.c:608 +#: pg_basebackup.c:1039 pg_recvlogical.c:449 pg_recvlogical.c:625 #: receivelog.c:973 #, c-format msgid "could not read COPY data: %s" msgstr "\"COPY\"-ის მáƒáƒœáƒáƒªáƒ”მების წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s" -#: pg_basebackup.c:1016 +#: pg_basebackup.c:1043 #, c-format msgid "background process terminated unexpectedly" msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ პრáƒáƒªáƒ”სი მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ" -#: pg_basebackup.c:1087 +#: pg_basebackup.c:1114 #, c-format msgid "cannot inject manifest into a compressed tar file" msgstr "შეკუმშულ tar ფáƒáƒ˜áƒšáƒ¨áƒ˜ მáƒáƒœáƒ˜áƒ¤áƒ”სტის შეჩურთვრშეუძლებელიáƒ" -#: pg_basebackup.c:1088 +#: pg_basebackup.c:1115 #, c-format msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s." msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ კლიენტის მხáƒáƒ áƒ”ს შეკუმშვრდრგáƒáƒáƒ’ზáƒáƒ•ნეთ გáƒáƒ›áƒáƒœáƒáƒ¢áƒáƒœáƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში stdout-ის მáƒáƒ’იერ, áƒáƒœ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ %s." -#: pg_basebackup.c:1104 +#: pg_basebackup.c:1131 #, c-format msgid "cannot parse archive \"%s\"" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: %s" -#: pg_basebackup.c:1105 +#: pg_basebackup.c:1132 #, c-format msgid "Only tar archives can be parsed." msgstr "შესáƒáƒ«áƒšáƒ”ბელირმხáƒáƒšáƒáƒ“ tar áƒáƒ áƒ¥áƒ˜áƒ•ების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒ." -#: pg_basebackup.c:1107 +#: pg_basebackup.c:1134 #, c-format msgid "Plain format requires pg_basebackup to parse the archive." msgstr "Plain-ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ áƒáƒ áƒ¥áƒ˜áƒ•ის დáƒáƒ¡áƒáƒ›áƒ£áƒ¨áƒáƒ•ებლáƒáƒ“ pg_basebackup-ს მáƒáƒ˜áƒ—ხáƒáƒ•ს." -#: pg_basebackup.c:1109 +#: pg_basebackup.c:1136 #, c-format msgid "Using - as the output directory requires pg_basebackup to parse the archive." msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ედ - -ის მითითებრáƒáƒ áƒ¥áƒ˜áƒ•ის დáƒáƒ¡áƒáƒ›áƒ£áƒ¨áƒáƒ•ებლáƒáƒ“ pg_basebackup-ს მáƒáƒ˜áƒ—ხáƒáƒ•ს." -#: pg_basebackup.c:1111 +#: pg_basebackup.c:1138 #, c-format msgid "The -R option requires pg_basebackup to parse the archive." msgstr "-R პáƒáƒ áƒáƒ›áƒ”ტრს áƒáƒ áƒ¥áƒ˜áƒ•ის დáƒáƒ¡áƒáƒ›áƒ£áƒ¨áƒáƒ•ებლáƒáƒ“ pg_basebackup-ს მáƒáƒ˜áƒ—ხáƒáƒ•ს." -#: pg_basebackup.c:1330 +#: pg_basebackup.c:1357 #, c-format msgid "archives must precede manifest" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ები წინ უნდრუსწრებდეს მáƒáƒœáƒ˜áƒ¤áƒ”სტს" -#: pg_basebackup.c:1345 +#: pg_basebackup.c:1372 #, c-format msgid "invalid archive name: \"%s\"" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\"" -#: pg_basebackup.c:1417 +#: pg_basebackup.c:1444 #, c-format msgid "unexpected payload data" msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი შიგთáƒáƒ•სი" -#: pg_basebackup.c:1560 +#: pg_basebackup.c:1587 #, c-format msgid "empty COPY message" msgstr "შეტყáƒáƒ‘ინებრCOPY ცáƒáƒ áƒ˜áƒ”ლიáƒ" -#: pg_basebackup.c:1562 +#: pg_basebackup.c:1589 #, c-format msgid "malformed COPY message of type %d, length %zu" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ COPY შეტყáƒáƒ‘ინებრტიპით %d, სიგრძე %zu" -#: pg_basebackup.c:1760 +#: pg_basebackup.c:1789 #, c-format msgid "incompatible server version %s" msgstr "სერვერის შეუთáƒáƒ•სებელი ვერსირ%s" -#: pg_basebackup.c:1776 +#: pg_basebackup.c:1805 #, c-format msgid "Use -X none or -X fetch to disable log streaming." msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ის გáƒáƒ¡áƒáƒ—იშáƒáƒ“ -X none áƒáƒœ -X fetch გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." -#: pg_basebackup.c:1844 +#: pg_basebackup.c:1841 +#, c-format +msgid "server does not support incremental backup" +msgstr "სერვერს ინკრემენტული მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: pg_basebackup.c:1850 pg_basebackup.c:2008 pg_recvlogical.c:272 +#: receivelog.c:543 receivelog.c:582 streamutil.c:364 streamutil.c:438 +#: streamutil.c:490 streamutil.c:578 streamutil.c:730 streamutil.c:775 +#, c-format +msgid "could not send replication command \"%s\": %s" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის (\"%s\") გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ: %s" + +#: pg_basebackup.c:1856 pg_basebackup.c:1883 +#, c-format +msgid "could not upload manifest: %s" +msgstr "ვერ áƒáƒ•ტვირთე მáƒáƒœáƒ˜áƒ¤áƒ”სტი: %s" + +#: pg_basebackup.c:1859 pg_basebackup.c:1886 +#, c-format +msgid "could not upload manifest: unexpected status %s" +msgstr "ვერ áƒáƒ•ტვირთე მáƒáƒœáƒ˜áƒ¤áƒ”სტი: მáƒáƒ£áƒšáƒáƒ“ნელი სტáƒáƒ¢áƒ£áƒ¡áƒ˜ %s" + +#: pg_basebackup.c:1867 +#, c-format +msgid "could not send COPY data: %s" +msgstr "ვერ გáƒáƒ•áƒáƒ’ზáƒáƒ•ნე COPY-ის მáƒáƒœáƒáƒªáƒ”მები: %s" + +#: pg_basebackup.c:1877 +#, c-format +msgid "could not send end-of-COPY: %s" +msgstr "ვერ გáƒáƒ•áƒáƒ’ზáƒáƒ•ნე end-of-COPY: %s" + +#: pg_basebackup.c:1892 +#, c-format +msgid "unexpected extra result while sending manifest" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ›áƒáƒ¢áƒ”ბითი პáƒáƒ¡áƒ£áƒ®áƒ˜ მáƒáƒœáƒ˜áƒ¤áƒ”სტის გáƒáƒ’ზáƒáƒ•ნისáƒáƒ¡" + +#: pg_basebackup.c:1950 #, c-format msgid "backup targets are not supported by this server version" msgstr "სერვერის áƒáƒ› ვერსიáƒáƒ¡ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" -#: pg_basebackup.c:1847 +#: pg_basebackup.c:1953 #, c-format msgid "recovery configuration cannot be written when a backup target is used" msgstr "áƒáƒ¦áƒ“გენის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რრმáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნე გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ, შეუძლებელიáƒ" -#: pg_basebackup.c:1874 +#: pg_basebackup.c:1980 #, c-format msgid "server does not support server-side compression" msgstr "სერვერს თáƒáƒ•ის მხáƒáƒ áƒ”ს შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" -#: pg_basebackup.c:1884 +#: pg_basebackup.c:1990 #, c-format msgid "initiating base backup, waiting for checkpoint to complete" msgstr "ბáƒáƒ–ის მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ პრáƒáƒ¤áƒ”სი დáƒáƒ˜áƒ¬áƒ§áƒ. ველáƒáƒ“ები სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ¡" -#: pg_basebackup.c:1888 +#: pg_basebackup.c:1994 #, c-format msgid "waiting for checkpoint" msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის მáƒáƒšáƒáƒ“ინი" -#: pg_basebackup.c:1901 pg_recvlogical.c:260 receivelog.c:543 receivelog.c:582 -#: streamutil.c:288 streamutil.c:361 streamutil.c:413 streamutil.c:501 -#: streamutil.c:653 streamutil.c:698 -#, c-format -msgid "could not send replication command \"%s\": %s" -msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის (\"%s\") გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ: %s" - -#: pg_basebackup.c:1909 +#: pg_basebackup.c:2016 #, c-format msgid "could not initiate base backup: %s" msgstr "ბáƒáƒ–ის მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" -#: pg_basebackup.c:1912 +#: pg_basebackup.c:2019 #, c-format msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields" msgstr "სერვერმრBASE_BACKUP ბრძáƒáƒœáƒ”ბáƒáƒ–ე მáƒáƒ£áƒšáƒáƒ“ნელი პáƒáƒ¡áƒ£áƒ®áƒ˜ დáƒáƒáƒ‘რუნáƒ; მივიღე %d მწკრივი დრ%d ველი, მáƒáƒ•ელáƒáƒ“ი %d მწკრივს დრ%d ველს" -#: pg_basebackup.c:1918 +#: pg_basebackup.c:2025 #, c-format msgid "checkpoint completed" msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილი დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულიáƒ" -#: pg_basebackup.c:1932 +#: pg_basebackup.c:2039 #, c-format msgid "write-ahead log start point: %s on timeline %u" msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ წერტილი: %s დრáƒáƒ¡ ხáƒáƒ–ზე %u" -#: pg_basebackup.c:1940 +#: pg_basebackup.c:2047 #, c-format msgid "could not get backup header: %s" msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ თáƒáƒ•სáƒáƒ áƒ—ის მიღების შეცდáƒáƒ›áƒ: %s" -#: pg_basebackup.c:1943 +#: pg_basebackup.c:2050 #, c-format msgid "no data returned from server" msgstr "სერვერიდáƒáƒœ მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  დáƒáƒ‘რუნებულáƒ" -#: pg_basebackup.c:1986 +#: pg_basebackup.c:2093 #, c-format msgid "can only write single tablespace to stdout, database has %d" msgstr "stdout-ში მხáƒáƒšáƒáƒ“ ერთი ცხრილების სივრცის ჩáƒáƒ¬áƒ”რრშეუძლიáƒ. ბáƒáƒ–áƒáƒ¡ კი %d áƒáƒ¥áƒ•ს" -#: pg_basebackup.c:1999 +#: pg_basebackup.c:2106 #, c-format msgid "starting background WAL receiver" msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ WAL მიმღების გáƒáƒ¨áƒ•ებáƒ" -#: pg_basebackup.c:2082 +#: pg_basebackup.c:2189 #, c-format msgid "backup failed: %s" msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" -#: pg_basebackup.c:2085 +#: pg_basebackup.c:2192 #, c-format msgid "no write-ahead log end position returned from server" msgstr "სერვერიდáƒáƒœ წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ბáƒáƒšáƒ პáƒáƒ–იცირáƒáƒ  დáƒáƒ‘რუნებულáƒ" -#: pg_basebackup.c:2088 +#: pg_basebackup.c:2195 #, c-format msgid "write-ahead log end point: %s" msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ბáƒáƒšáƒ წერტილი: %s" -#: pg_basebackup.c:2099 +#: pg_basebackup.c:2206 #, c-format msgid "checksum error occurred" msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: pg_basebackup.c:2104 +#: pg_basebackup.c:2211 #, c-format msgid "final receive failed: %s" msgstr "მიღების დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s" -#: pg_basebackup.c:2128 +#: pg_basebackup.c:2235 #, c-format msgid "waiting for background process to finish streaming ..." msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ პრáƒáƒªáƒ”სის მიერ ნáƒáƒ™áƒáƒ“ის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის მáƒáƒšáƒáƒ“ინი ..." -#: pg_basebackup.c:2132 +#: pg_basebackup.c:2239 #, c-format msgid "could not send command to background pipe: %m" msgstr "ფáƒáƒœáƒ£áƒ áƒ˜ ფáƒáƒ˜áƒ¤áƒ˜áƒ¡áƒ—ვის ბრძáƒáƒœáƒ”ბის გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ: %m" -#: pg_basebackup.c:2137 +#: pg_basebackup.c:2244 #, c-format msgid "could not wait for child process: %m" msgstr "შვულეულ პრáƒáƒªáƒ”სს ვერ დáƒáƒ•ელáƒáƒ“ები: %m" -#: pg_basebackup.c:2139 +#: pg_basebackup.c:2246 #, c-format msgid "child %d died, expected %d" msgstr "%d შვილი მáƒáƒ™áƒ•დáƒ, მáƒáƒ•ელáƒáƒ“ი %d" -#: pg_basebackup.c:2141 streamutil.c:91 streamutil.c:196 +#: pg_basebackup.c:2248 streamutil.c:89 streamutil.c:204 streamutil.c:316 #, c-format msgid "%s" msgstr "%s" -#: pg_basebackup.c:2161 +#: pg_basebackup.c:2268 #, c-format msgid "could not wait for child thread: %m" msgstr "შვილეულ ნáƒáƒ™áƒáƒ“ს ვერ დáƒáƒ•ელáƒáƒ“ები %m" -#: pg_basebackup.c:2166 +#: pg_basebackup.c:2273 #, c-format msgid "could not get child thread exit status: %m" msgstr "შვილეული ნáƒáƒ™áƒáƒ“ის გáƒáƒ›áƒáƒ¡áƒ•ლის სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ მიღების შეცდáƒáƒ›áƒ: %m" -#: pg_basebackup.c:2169 +#: pg_basebackup.c:2276 #, c-format msgid "child thread exited with error %u" msgstr "შვილეული ნáƒáƒ™áƒáƒ“ის შეცდáƒáƒ›áƒ: %u" -#: pg_basebackup.c:2198 +#: pg_basebackup.c:2305 #, c-format msgid "syncing data to disk ..." msgstr "მáƒáƒœáƒáƒªáƒ”მების სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ დისკზე ..." -#: pg_basebackup.c:2223 +#: pg_basebackup.c:2330 #, c-format msgid "renaming backup_manifest.tmp to backup_manifest" msgstr "backup_manifest.tmp -ის სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრbackup_manifest" -#: pg_basebackup.c:2243 +#: pg_basebackup.c:2350 #, c-format msgid "base backup completed" msgstr "ბáƒáƒ–ის მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ" -#: pg_basebackup.c:2326 +#: pg_basebackup.c:2436 #, c-format msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი %s: უნდრიყáƒáƒ¡ \"fast\" an \"spread\"" -#: pg_basebackup.c:2344 +#: pg_basebackup.c:2454 #, c-format msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" msgstr "\"%s\"-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜. უნდრიყáƒáƒ¡: \"plain\" áƒáƒœ \"tar\"" -#: pg_basebackup.c:2422 +#: pg_basebackup.c:2535 #, c-format msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" msgstr "wal-method-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: %s. უნდრიყáƒáƒ¡ \"fetch\", \"stream\" áƒáƒœ \"none\"" -#: pg_basebackup.c:2457 pg_basebackup.c:2469 pg_basebackup.c:2491 -#: pg_basebackup.c:2503 pg_basebackup.c:2509 pg_basebackup.c:2561 -#: pg_basebackup.c:2572 pg_basebackup.c:2582 pg_basebackup.c:2588 -#: pg_basebackup.c:2595 pg_basebackup.c:2607 pg_basebackup.c:2619 -#: pg_basebackup.c:2627 pg_basebackup.c:2640 pg_basebackup.c:2646 -#: pg_basebackup.c:2655 pg_basebackup.c:2667 pg_basebackup.c:2678 -#: pg_basebackup.c:2686 pg_receivewal.c:748 pg_receivewal.c:760 +#: pg_basebackup.c:2574 pg_basebackup.c:2586 pg_basebackup.c:2608 +#: pg_basebackup.c:2620 pg_basebackup.c:2626 pg_basebackup.c:2678 +#: pg_basebackup.c:2689 pg_basebackup.c:2699 pg_basebackup.c:2705 +#: pg_basebackup.c:2712 pg_basebackup.c:2724 pg_basebackup.c:2736 +#: pg_basebackup.c:2744 pg_basebackup.c:2757 pg_basebackup.c:2763 +#: pg_basebackup.c:2772 pg_basebackup.c:2784 pg_basebackup.c:2795 +#: pg_basebackup.c:2803 pg_createsubscriber.c:2037 pg_createsubscriber.c:2047 +#: pg_createsubscriber.c:2055 pg_createsubscriber.c:2083 +#: pg_createsubscriber.c:2115 pg_receivewal.c:748 pg_receivewal.c:760 #: pg_receivewal.c:767 pg_receivewal.c:776 pg_receivewal.c:783 -#: pg_receivewal.c:793 pg_recvlogical.c:835 pg_recvlogical.c:847 -#: pg_recvlogical.c:857 pg_recvlogical.c:864 pg_recvlogical.c:871 -#: pg_recvlogical.c:878 pg_recvlogical.c:885 pg_recvlogical.c:892 -#: pg_recvlogical.c:899 pg_recvlogical.c:906 +#: pg_receivewal.c:793 pg_recvlogical.c:853 pg_recvlogical.c:865 +#: pg_recvlogical.c:875 pg_recvlogical.c:882 pg_recvlogical.c:889 +#: pg_recvlogical.c:896 pg_recvlogical.c:903 pg_recvlogical.c:910 +#: pg_recvlogical.c:917 pg_recvlogical.c:924 #, c-format msgid "Try \"%s --help\" for more information." msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." -#: pg_basebackup.c:2467 pg_receivewal.c:758 pg_recvlogical.c:845 +#: pg_basebackup.c:2584 pg_createsubscriber.c:2045 pg_receivewal.c:758 +#: pg_recvlogical.c:863 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")" -#: pg_basebackup.c:2490 +#: pg_basebackup.c:2607 #, c-format msgid "cannot specify both format and backup target" msgstr "ერთდრáƒáƒ£áƒšáƒáƒ“ შეუძლებელირáƒáƒ áƒ˜áƒ•ე, ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ დრმáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნის მითითებáƒ" -#: pg_basebackup.c:2502 +#: pg_basebackup.c:2619 #, c-format msgid "must specify output directory or backup target" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის áƒáƒœ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" -#: pg_basebackup.c:2508 +#: pg_basebackup.c:2625 #, c-format msgid "cannot specify both output directory and backup target" msgstr "áƒáƒ áƒ˜áƒ•ე, გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის დრმáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნის მითითებრერთდრáƒáƒ£áƒšáƒáƒ“ შეუძლებელიáƒ" -#: pg_basebackup.c:2538 pg_receivewal.c:802 +#: pg_basebackup.c:2655 pg_receivewal.c:802 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "შეკუმშვის უცხრáƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მი: \"%s\"" -#: pg_basebackup.c:2544 pg_receivewal.c:809 +#: pg_basebackup.c:2661 pg_receivewal.c:809 #, c-format msgid "invalid compression specification: %s" msgstr "შეკუმშვის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციფიკáƒáƒªáƒ˜áƒ: %s" -#: pg_basebackup.c:2560 +#: pg_basebackup.c:2677 #, c-format msgid "client-side compression is not possible when a backup target is specified" msgstr "რáƒáƒªáƒ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნე მითითებულიáƒ, კლიენტის-მხრის შეკუმშვის მითითებრშეუძლებელიáƒ" -#: pg_basebackup.c:2571 +#: pg_basebackup.c:2688 #, c-format msgid "only tar mode backups can be compressed" msgstr "შესáƒáƒ«áƒšáƒ”ბელირმხáƒáƒšáƒáƒ“ tar რეჟიმის მáƒáƒ áƒ¥áƒáƒ¤áƒ”ბის შეკუმშვáƒ" -#: pg_basebackup.c:2581 +#: pg_basebackup.c:2698 #, c-format msgid "WAL cannot be streamed when a backup target is specified" msgstr "WAL-ის ნáƒáƒ™áƒáƒ“ი მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნე მითითებულიáƒ, შეუძლებელიáƒ" -#: pg_basebackup.c:2587 +#: pg_basebackup.c:2704 #, c-format msgid "cannot stream write-ahead logs in tar mode to stdout" msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ის tar-ის რეჟიმში stdout-ზე გáƒáƒ›áƒáƒ¢áƒáƒœáƒ შეუძლებელიáƒ" -#: pg_basebackup.c:2594 +#: pg_basebackup.c:2711 #, c-format msgid "replication slots can only be used with WAL streaming" msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ WAL ნáƒáƒ™áƒáƒ“თáƒáƒœ ერთáƒáƒ“áƒáƒ შესáƒáƒ«áƒšáƒ”ბელი" -#: pg_basebackup.c:2606 +#: pg_basebackup.c:2723 #, c-format msgid "--no-slot cannot be used with slot name" msgstr "--no-slot სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლთáƒáƒœ ერთáƒáƒ“ áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" #. translator: second %s is an option name -#: pg_basebackup.c:2617 pg_receivewal.c:774 +#: pg_basebackup.c:2734 pg_receivewal.c:774 #, c-format msgid "%s needs a slot to be specified using --slot" msgstr "%s-სთვის სáƒáƒ­áƒ˜áƒ áƒáƒ სლáƒáƒ¢áƒ˜áƒ¡ მითითებრ--slot პáƒáƒ áƒáƒ›áƒ”ტრის სáƒáƒ¨áƒ£áƒáƒšáƒ”ბით" -#: pg_basebackup.c:2625 pg_basebackup.c:2665 pg_basebackup.c:2676 -#: pg_basebackup.c:2684 +#: pg_basebackup.c:2742 pg_basebackup.c:2782 pg_basebackup.c:2793 +#: pg_basebackup.c:2801 #, c-format msgid "%s and %s are incompatible options" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები %s დრ%s შეუთáƒáƒ•სებელიáƒ" -#: pg_basebackup.c:2639 +#: pg_basebackup.c:2756 #, c-format msgid "WAL directory location cannot be specified along with a backup target" msgstr "WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘რმáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ›áƒ˜áƒ–ნესთáƒáƒœ ერთáƒáƒ“ მითითებული áƒáƒ  შეიძლებრიყáƒáƒ¡" -#: pg_basebackup.c:2645 +#: pg_basebackup.c:2762 #, c-format msgid "WAL directory location can only be specified in plain mode" msgstr "WAL-ის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘ის მითითებრმხáƒáƒšáƒáƒ“ უბრáƒáƒšáƒ რეჟიმშირშესáƒáƒ«áƒšáƒ”ბელი" -#: pg_basebackup.c:2654 +#: pg_basebackup.c:2771 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘რáƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ ბილიკი უნდრიყáƒáƒ¡" -#: pg_basebackup.c:2754 +#: pg_basebackup.c:2871 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "სიმბმულის შექმნის შეცდáƒáƒ›áƒ %s: %m" -#: pg_receivewal.c:77 +#: pg_createsubscriber.c:169 +#, c-format +msgid "failed after the end of recovery" +msgstr "ჩáƒáƒ•áƒáƒ áƒ“რáƒáƒ¦áƒ“გენის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შემდეგ" + +#: pg_createsubscriber.c:170 +#, c-format +msgid "The target server cannot be used as a physical replica anymore. You must recreate the physical replica before continuing." +msgstr "სáƒáƒ›áƒ˜áƒ–ნე სერვერს ფიზიკურ რეპლიკáƒáƒ“ ვეღáƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ. გáƒáƒ’რძელებáƒáƒ›áƒ“ე ფიზიკური რეპლიკრთáƒáƒ•იდáƒáƒœ უნდრშექმნáƒáƒ—." + +#: pg_createsubscriber.c:198 +#, c-format +msgid "publication \"%s\" created in database \"%s\" on primary was left behind" +msgstr "გáƒáƒ›áƒáƒªáƒ”მრ\"%s\", შექმნილი მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\" ძირითáƒáƒ“ზე, გáƒáƒ›áƒáƒ¢áƒáƒ•ებულიáƒ" + +#: pg_createsubscriber.c:200 +#, c-format +msgid "Drop this publication before trying again." +msgstr "მáƒáƒáƒªáƒ˜áƒšáƒ”თ ეს გáƒáƒ›áƒáƒªáƒ”მáƒ, სáƒáƒœáƒáƒ› თáƒáƒ•იდáƒáƒœ სცდით." + +#: pg_createsubscriber.c:204 +#, c-format +msgid "replication slot \"%s\" created in database \"%s\" on primary was left behind" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\" შეიქმნრმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\" ძირითáƒáƒ“ზე, შეიძლებáƒ, გáƒáƒ›áƒáƒ¢áƒáƒ•ებულიáƒ" + +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1260 +#, c-format +msgid "Drop this replication slot soon to avoid retention of WAL files." +msgstr "áƒáƒ› რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ მáƒáƒšáƒ” წáƒáƒ¨áƒšáƒ WAL ფáƒáƒ˜áƒšáƒ”ბის მáƒáƒ áƒ©áƒ”ნის თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“." + +#: pg_createsubscriber.c:219 #, c-format msgid "" -"%s receives PostgreSQL streaming write-ahead logs.\n" +"%s creates a new logical replica from a standby server.\n" "\n" msgstr "" -"%s PostgreSQL-ის ნáƒáƒ™áƒáƒ“ური წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ¡ áƒáƒ®áƒ“ენს.\n" +"%s შექმნის áƒáƒ®áƒáƒš ლáƒáƒ’იკური რეპლიკáƒáƒ¡ უქმე სერვერიდáƒáƒœ.\n" "\n" -#: pg_receivewal.c:81 pg_recvlogical.c:82 +#: pg_createsubscriber.c:223 pg_receivewal.c:81 pg_recvlogical.c:92 #, c-format msgid "" "\n" @@ -1144,22 +1327,637 @@ msgstr "" "\n" "პáƒáƒ áƒáƒ›áƒ”ტრები:\n" +#: pg_createsubscriber.c:224 +#, c-format +msgid " -d, --database=DBNAME database in which to create a subscription\n" +msgstr " -d, --database=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒ, რáƒáƒ›áƒ”ლშიც გნებáƒáƒ•თ, გáƒáƒ›áƒáƒ¬áƒ”რრშექმნáƒáƒ—\n" + +#: pg_createsubscriber.c:225 +#, c-format +msgid " -D, --pgdata=DATADIR location for the subscriber data directory\n" +msgstr " -D, --pgdata=DATADIR გáƒáƒ›áƒáƒ›áƒ¬áƒ”რის მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n" + +#: pg_createsubscriber.c:226 +#, c-format +msgid " -n, --dry-run dry run, just show what would be done\n" +msgstr " -n, --dry-run გáƒáƒœáƒáƒ®áƒšáƒ”ბის გáƒáƒ áƒ”შე. უბრáƒáƒšáƒáƒ“ ნáƒáƒ©áƒ•ენები იქნებáƒ, რრმáƒáƒ®áƒ“ებáƒáƒ“áƒ\n" + +#: pg_createsubscriber.c:227 +#, c-format +msgid " -p, --subscriber-port=PORT subscriber port number (default %s)\n" +msgstr " -p, --subscriber-port=პáƒáƒ áƒ¢áƒ˜ გáƒáƒ›áƒáƒ›áƒ¬áƒ”რის პáƒáƒ áƒ¢áƒ˜áƒ¡ ნáƒáƒ›áƒ”რი (ნáƒáƒ’ულისხმევი %s)\n" + +#: pg_createsubscriber.c:228 +#, c-format +msgid " -P, --publisher-server=CONNSTR publisher connection string\n" +msgstr " -P, --publisher-server=CONNSTR გáƒáƒ›áƒáƒ›áƒªáƒ”მელთáƒáƒœ მიერთების სტრიქáƒáƒœáƒ˜\n" + +#: pg_createsubscriber.c:229 +#, c-format +msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" +msgstr " -s, --socketdir=DIR სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (ნáƒáƒ’ულისხმევირმიმდინáƒáƒ áƒ”.)\n" + +#: pg_createsubscriber.c:230 +#, c-format +msgid " -t, --recovery-timeout=SECS seconds to wait for recovery to end\n" +msgstr " -t, --recovery-timeout=წáƒáƒ›áƒ”ბი რáƒáƒ›áƒ“ენი წáƒáƒ›áƒ˜ დáƒáƒ•ელáƒáƒ“რáƒáƒ¦áƒ“გენის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბáƒáƒ¡\n" + +#: pg_createsubscriber.c:231 +#, c-format +msgid " -U, --subscriber-username=NAME user name for subscriber connection\n" +msgstr " -U, --subscriber-username=სáƒáƒ®áƒ”ლი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი გáƒáƒ›áƒáƒ›áƒ¬áƒ”რის კáƒáƒ•შირისთვის\n" + +#: pg_createsubscriber.c:232 +#, c-format +msgid " -v, --verbose output verbose messages\n" +msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" + +#: pg_createsubscriber.c:233 +#, c-format +msgid "" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr "" +" --config-file=FILENAME სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒ¨áƒ•ებისáƒáƒ¡ მთáƒáƒ•áƒáƒ áƒ˜ \n" +" სერვერის მითითებული კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" + +#: pg_createsubscriber.c:235 +#, c-format +msgid " --publication=NAME publication name\n" +msgstr " --publication=NAME პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n" + +#: pg_createsubscriber.c:236 +#, c-format +msgid " --replication-slot=NAME replication slot name\n" +msgstr " --replication-slot=სáƒáƒ®áƒ”ლი რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n" + +#: pg_createsubscriber.c:237 +#, c-format +msgid " --subscription=NAME subscription name\n" +msgstr " --subscription=NAME გáƒáƒ›áƒáƒ¬áƒ”რის სáƒáƒ®áƒ”ლი\n" + +#: pg_createsubscriber.c:238 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" + +#: pg_createsubscriber.c:239 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" + +#: pg_createsubscriber.c:282 +#, c-format +msgid "could not parse connection string: %s" +msgstr "შეერთების სტრიქáƒáƒœáƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: %s" + +#: pg_createsubscriber.c:359 +#, c-format +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "პრáƒáƒ’რáƒáƒ›áƒ \"%s\" სჭირდებრ\"%s\"-ს, მáƒáƒ’რáƒáƒ› იგივე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში, სáƒáƒ“áƒáƒª \"%s\", ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" + +#: pg_createsubscriber.c:362 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "პრáƒáƒ’რáƒáƒ›áƒ „%s“ ნáƒáƒžáƒáƒ•ნირ„%s“-ის მიერ, მáƒáƒ’რáƒáƒ› ვერსიáƒ, იგივერáƒáƒ áƒáƒ, რáƒáƒª %s" + +#: pg_createsubscriber.c:382 +#, c-format +msgid "checking if directory \"%s\" is a cluster data directory" +msgstr "შემáƒáƒ¬áƒ›áƒ”ბáƒ, áƒáƒ áƒ˜áƒ¡ თუ áƒáƒ áƒ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე" + +#: pg_createsubscriber.c:388 +#, c-format +msgid "data directory \"%s\" does not exist" +msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" + +#: pg_createsubscriber.c:396 +#, c-format +msgid "directory \"%s\" is not a database cluster directory" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" + +#: pg_createsubscriber.c:513 +#, c-format +msgid "connection to database failed: %s" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებრჩáƒáƒ•áƒáƒ áƒ“áƒ: %s" + +#: pg_createsubscriber.c:526 +#, c-format +msgid "could not clear search_path: %s" +msgstr "search_path-ის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ების პრáƒáƒ‘ლემáƒ: %s" + +#: pg_createsubscriber.c:566 +#, c-format +msgid "getting system identifier from publisher" +msgstr "სისტემური იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მიღებრგáƒáƒ›áƒáƒ›áƒªáƒ”მლისგáƒáƒœ" + +#: pg_createsubscriber.c:573 +#, c-format +msgid "could not get system identifier: %s" +msgstr "ვერ მივიღე სისტემის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜: %s" + +#: pg_createsubscriber.c:579 +#, c-format +msgid "could not get system identifier: got %d rows, expected %d row" +msgstr "სისტემური იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მიღებრშეუძლებელიáƒ: მივიღე %d მწკრივი. მáƒáƒ•ელáƒáƒ“ი %d მწკრივს" + +#: pg_createsubscriber.c:586 +#, c-format +msgid "system identifier is %llu on publisher" +msgstr "სისტემური იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ გáƒáƒ›áƒáƒ›áƒªáƒ”მელზე %llu-იáƒ" + +#: pg_createsubscriber.c:607 +#, c-format +msgid "getting system identifier from subscriber" +msgstr "სისტემური იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მიღებრგáƒáƒ›áƒáƒ›áƒ¬áƒ”რისგáƒáƒœ" + +#: pg_createsubscriber.c:611 pg_createsubscriber.c:641 +#, c-format +msgid "control file appears to be corrupt" +msgstr "რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ" + +#: pg_createsubscriber.c:615 pg_createsubscriber.c:656 +#, c-format +msgid "system identifier is %llu on subscriber" +msgstr "სისტემური იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ %llu გáƒáƒ›áƒáƒ›áƒ¬áƒ”რზეáƒ" + +#: pg_createsubscriber.c:637 +#, c-format +msgid "modifying system identifier of subscriber" +msgstr "გáƒáƒ›áƒáƒ›áƒ¬áƒ”რის სისტემური იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ შეცვლáƒ" + +#: pg_createsubscriber.c:659 +#, c-format +msgid "running pg_resetwal on the subscriber" +msgstr "pg_resetwal-ის გáƒáƒ¨áƒ•ებრგáƒáƒ›áƒáƒ›áƒ¬áƒ”რზე" + +#: pg_createsubscriber.c:671 +#, c-format +msgid "subscriber successfully changed the system identifier" +msgstr "გáƒáƒ›áƒáƒ›áƒ¬áƒ”რმრსისტემური იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ წáƒáƒ áƒ›áƒáƒ¢áƒ”ბით შეცვáƒáƒšáƒ" + +#: pg_createsubscriber.c:673 +#, c-format +msgid "could not change system identifier of subscriber: %s" +msgstr "ვერ შევცვáƒáƒšáƒ” სისტემურ იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ გáƒáƒ›áƒáƒ›áƒ¬áƒ”რისთვის: %s" + +#: pg_createsubscriber.c:697 +#, c-format +msgid "could not obtain database OID: %s" +msgstr "ვერ მივიღე მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის OID: %s" + +#: pg_createsubscriber.c:704 +#, c-format +msgid "could not obtain database OID: got %d rows, expected %d row" +msgstr "ვერ მივიღე მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის OID: მივიღე %d მწკრივი, მáƒáƒ•ელáƒáƒ“ი %d მწკრივს" + +#: pg_createsubscriber.c:776 +#, c-format +msgid "create replication slot \"%s\" on publisher" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ \"%s\" შექმნრგáƒáƒ›áƒáƒ›áƒªáƒ”მელზე" + +#: pg_createsubscriber.c:796 +#, c-format +msgid "could not write an additional WAL record: %s" +msgstr "ვერ ჩáƒáƒ•წერე დáƒáƒ›áƒáƒ¢áƒ”ბითი WAL ჩáƒáƒœáƒáƒ¬áƒ”რი: %s" + +#: pg_createsubscriber.c:822 +#, c-format +msgid "could not obtain recovery progress: %s" +msgstr "áƒáƒ¦áƒ“გენის მიმდინáƒáƒ áƒ”áƒáƒ‘ის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის მიღებრშეუძლებელიáƒ: %s" + +#: pg_createsubscriber.c:854 +#, c-format +msgid "checking settings on publisher" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრების შექმნრგáƒáƒ›áƒáƒ›áƒªáƒ”მელზე" + +#: pg_createsubscriber.c:864 +#, c-format +msgid "primary server cannot be in recovery" +msgstr "ძირითáƒáƒ“ი სერვერი áƒáƒ¦áƒ“გენის რეჟიმში ვერ იქნებáƒ" + +#: pg_createsubscriber.c:888 +#, c-format +msgid "could not obtain publisher settings: %s" +msgstr "გáƒáƒ›áƒáƒ›áƒªáƒ”მლის პáƒáƒ áƒáƒ›áƒ”ტრების მიღებრშეუძლებელიáƒ: %s" + +#: pg_createsubscriber.c:914 +#, c-format +msgid "publisher requires wal_level >= \"logical\"" +msgstr "გáƒáƒ›áƒáƒ›áƒªáƒ”მელს wal_level >= \"logical\" ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ" + +#: pg_createsubscriber.c:920 +#, c-format +msgid "publisher requires %d replication slots, but only %d remain" +msgstr "გáƒáƒ›áƒáƒ›áƒªáƒ”მელს %d რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ სჭირდებáƒ, მáƒáƒ’რáƒáƒ› დáƒáƒ áƒ©áƒ”ნილიáƒ, მხáƒáƒšáƒáƒ“, %d" + +#: pg_createsubscriber.c:922 pg_createsubscriber.c:931 +#: pg_createsubscriber.c:1028 pg_createsubscriber.c:1037 +#: pg_createsubscriber.c:1046 +#, c-format +msgid "Increase the configuration parameter \"%s\" to at least %d." +msgstr "გáƒáƒ–áƒáƒ áƒ“ეთ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" %d-მდე მáƒáƒ˜áƒœáƒª." + +#: pg_createsubscriber.c:929 +#, c-format +msgid "publisher requires %d WAL sender processes, but only %d remain" +msgstr "გáƒáƒ›áƒáƒ›áƒªáƒ”მელს %d WAL-ის გáƒáƒ›áƒ’ზáƒáƒ•ნი პრáƒáƒªáƒ”სი სჭირდებáƒ, მáƒáƒ’რáƒáƒ› დáƒáƒ áƒ©áƒ”ნილიáƒ, მხáƒáƒšáƒáƒ“, %d" + +#: pg_createsubscriber.c:938 +#, c-format +msgid "two_phase option will not be enabled for replication slots" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი two_phase რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბისთვის áƒáƒ  ჩáƒáƒ˜áƒ áƒ—ვებáƒ" + +#: pg_createsubscriber.c:939 +#, c-format +msgid "Subscriptions will be created with the two_phase option disabled. Prepared transactions will be replicated at COMMIT PREPARED." +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რები two_phase პáƒáƒ áƒáƒ›áƒ”ტრით გáƒáƒ—იშული შეიქმნებáƒ. მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის რეპლიკáƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“ებრCOMMIT PREPARED-თáƒáƒœ." + +#: pg_createsubscriber.c:971 +#, c-format +msgid "checking settings on subscriber" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრების შემáƒáƒ¬áƒ›áƒ”ბრგáƒáƒ›áƒáƒ›áƒ¬áƒ”რზე" + +#: pg_createsubscriber.c:978 +#, c-format +msgid "target server must be a standby" +msgstr "სáƒáƒ›áƒ˜áƒ–ნე სერვერი უქმე უნდრიყáƒáƒ¡" + +#: pg_createsubscriber.c:1002 +#, c-format +msgid "could not obtain subscriber settings: %s" +msgstr "გáƒáƒ›áƒáƒ›áƒ¬áƒ”რის პáƒáƒ áƒáƒ›áƒ”ტრების მიღებრშეუძლებელიáƒ: %s" + +#: pg_createsubscriber.c:1026 +#, c-format +msgid "subscriber requires %d replication slots, but only %d remain" +msgstr "გáƒáƒ›áƒáƒ›áƒ¬áƒ”რს %d რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ სჭირდებáƒ, მáƒáƒ’რáƒáƒ› დáƒáƒ áƒ©áƒ”ნილიáƒ, მხáƒáƒšáƒáƒ“, %d" + +#: pg_createsubscriber.c:1035 +#, c-format +msgid "subscriber requires %d logical replication workers, but only %d remain" +msgstr "გáƒáƒ›áƒáƒ›áƒ¬áƒ”რს %d ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი სჭირდებáƒ, მáƒáƒ’რáƒáƒ› დáƒáƒ áƒ©áƒ”ნილიáƒ, მხáƒáƒšáƒáƒ“, %d" + +#: pg_createsubscriber.c:1044 +#, c-format +msgid "subscriber requires %d worker processes, but only %d remain" +msgstr "გáƒáƒ›áƒáƒ›áƒ¬áƒ”რს %d დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი სჭირდებáƒ, მáƒáƒ’რáƒáƒ› დáƒáƒ áƒ©áƒ”ნილიáƒ, მხáƒáƒšáƒáƒ“, %d" + +#: pg_createsubscriber.c:1079 +#, c-format +msgid "dropping subscription \"%s\" in database \"%s\"" +msgstr "მáƒáƒ®áƒ“ებრმáƒáƒªáƒ˜áƒšáƒ”ბრგáƒáƒ›áƒáƒ¬áƒ”რისრ\"%s\" მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\"" + +#: pg_createsubscriber.c:1088 +#, c-format +msgid "could not drop subscription \"%s\": %s" +msgstr "ვერ მáƒáƒ•áƒáƒªáƒ˜áƒšáƒ” გáƒáƒ›áƒáƒ¬áƒ”რრ\"%s\": %s" + +#: pg_createsubscriber.c:1123 +#, c-format +msgid "could not obtain pre-existing subscriptions: %s" +msgstr "ვერ მივიღე უკვე áƒáƒ áƒ¡áƒ”ბული გáƒáƒ›áƒáƒ¬áƒ”რები: %s" + +#: pg_createsubscriber.c:1258 +#, c-format +msgid "could not drop replication slot \"%s\" on primary" +msgstr "ვერ წáƒáƒ•შáƒáƒšáƒ” რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\" ძირითáƒáƒ“ზე" + +#: pg_createsubscriber.c:1292 +#, c-format +msgid "could not obtain failover replication slot information: %s" +msgstr "გáƒáƒ“áƒáƒ¡áƒáƒ áƒ—ველი რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მიღებრშეუძლებელიáƒ: %s" + +#: pg_createsubscriber.c:1294 pg_createsubscriber.c:1303 +#, c-format +msgid "Drop the failover replication slots on subscriber soon to avoid retention of WAL files." +msgstr "გáƒáƒ›áƒáƒ›áƒ¬áƒ”რზე გáƒáƒ“áƒáƒ¡áƒáƒ áƒ—ველი რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის მáƒáƒšáƒ” წáƒáƒ¨áƒšáƒ WAL ფáƒáƒ˜áƒšáƒ”ბის მáƒáƒ áƒ©áƒ”ნის თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“." + +#: pg_createsubscriber.c:1302 +#, c-format +msgid "could not drop failover replication slot" +msgstr "გáƒáƒ“áƒáƒ¡áƒáƒ áƒ—ველი რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ წáƒáƒ¨áƒšáƒ შეუძლებელიáƒ" + +#: pg_createsubscriber.c:1324 +#, c-format +msgid "creating the replication slot \"%s\" in database \"%s\"" +msgstr "იქმნებრრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\" მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\"" + +#: pg_createsubscriber.c:1342 +#, c-format +msgid "could not create replication slot \"%s\" in database \"%s\": %s" +msgstr "ვერ შევქმენი რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\" მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": %s" + +#: pg_createsubscriber.c:1372 +#, c-format +msgid "dropping the replication slot \"%s\" in database \"%s\"" +msgstr "იშლებრრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\" მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\"" + +#: pg_createsubscriber.c:1388 +#, c-format +msgid "could not drop replication slot \"%s\" in database \"%s\": %s" +msgstr "ვერ წáƒáƒ•შáƒáƒšáƒ” რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\" მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": %s" + +#: pg_createsubscriber.c:1409 +#, c-format +msgid "pg_ctl failed with exit code %d" +msgstr "pg_ctl ჩáƒáƒ•áƒáƒ áƒ“რგáƒáƒ›áƒáƒ¡áƒ•ლის კáƒáƒ“ით %d" + +#: pg_createsubscriber.c:1414 +#, c-format +msgid "pg_ctl was terminated by exception 0x%X" +msgstr "pg_ctl შეწყდრგáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ— 0x%X" + +#: pg_createsubscriber.c:1416 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "თექვსმეტáƒáƒ‘ითი მნიშვნელáƒáƒ‘ის áƒáƒ¦áƒ¬áƒ”რისთვის იხილეთ C-ის ჩáƒáƒ¡áƒáƒ¡áƒ›áƒ”ლი ფáƒáƒ˜áƒšáƒ˜ \"ntstatus.h\"." + +#: pg_createsubscriber.c:1418 +#, c-format +msgid "pg_ctl was terminated by signal %d: %s" +msgstr "pg_ctl შეწყვეტილირსიგნáƒáƒšáƒ˜áƒ— %d: %s" + +#: pg_createsubscriber.c:1424 +#, c-format +msgid "pg_ctl exited with unrecognized status %d" +msgstr "pg_ctl დáƒáƒ¡áƒ áƒ£áƒšáƒ“რუცნáƒáƒ‘ი სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d" + +#: pg_createsubscriber.c:1427 +#, c-format +msgid "The failed command was: %s" +msgstr "ჩáƒáƒ•áƒáƒ áƒ“ნილი ბრძáƒáƒœáƒ”ბრიყáƒ: %s" + +#: pg_createsubscriber.c:1473 +#, c-format +msgid "server was started" +msgstr "სერვერი გáƒáƒ”შვáƒ" + +#: pg_createsubscriber.c:1488 +#, c-format +msgid "server was stopped" +msgstr "სერვერი გáƒáƒ›áƒáƒ˜áƒ áƒ—áƒ" + +#: pg_createsubscriber.c:1507 +#, c-format +msgid "waiting for the target server to reach the consistent state" +msgstr "სáƒáƒ›áƒ˜áƒ–ნე სერვერის მდგრáƒáƒ“ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒáƒ¨áƒ˜ გáƒáƒ“áƒáƒ¡áƒ•ლის მáƒáƒšáƒáƒ“ინი" + +#: pg_createsubscriber.c:1530 +#, c-format +msgid "recovery timed out" +msgstr "áƒáƒ¦áƒ“გენის მáƒáƒšáƒáƒ“ინის ვáƒáƒ“რáƒáƒ›áƒáƒ˜áƒ¬áƒ£áƒ áƒ" + +#: pg_createsubscriber.c:1543 +#, c-format +msgid "server did not end recovery" +msgstr "სერვერმრáƒáƒ¦áƒ“გენრáƒáƒ  დáƒáƒáƒ›áƒ—áƒáƒ•რáƒ" + +#: pg_createsubscriber.c:1545 +#, c-format +msgid "target server reached the consistent state" +msgstr "სáƒáƒ›áƒ˜áƒ–ნე სერვერმრმიáƒáƒ¦áƒ¬áƒ˜áƒ მდგრáƒáƒ“ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒáƒ¡" + +#: pg_createsubscriber.c:1546 +#, c-format +msgid "If pg_createsubscriber fails after this point, you must recreate the physical replica before continuing." +msgstr "თუ áƒáƒ› წერტილის შემდეგ pg_createsubscriber ჩáƒáƒ•áƒáƒ áƒ“ებáƒ, გáƒáƒ’რძელებáƒáƒ›áƒ“ე ფიზიკური რეპლიკრთáƒáƒ•იდáƒáƒœ უნდრშექმნáƒáƒ—." + +#: pg_createsubscriber.c:1573 +#, c-format +msgid "could not obtain publication information: %s" +msgstr "გáƒáƒ›áƒáƒªáƒ”მის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მიღებრშეუძლებელიáƒ: %s" + +#: pg_createsubscriber.c:1587 +#, c-format +msgid "publication \"%s\" already exists" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ \"%s\" უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: pg_createsubscriber.c:1588 +#, c-format +msgid "Consider renaming this publication before continuing." +msgstr "გáƒáƒœáƒ˜áƒ®áƒ˜áƒšáƒ”თ áƒáƒ› პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ®áƒ”ლის გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვრხელáƒáƒ®áƒšáƒ ცდáƒáƒ›áƒ“ე." + +#: pg_createsubscriber.c:1595 +#, c-format +msgid "creating publication \"%s\" in database \"%s\"" +msgstr "იქმნებრგáƒáƒ›áƒáƒªáƒ”მრ\"%s\" მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\"" + +#: pg_createsubscriber.c:1608 +#, c-format +msgid "could not create publication \"%s\" in database \"%s\": %s" +msgstr "ვერ შევქმენი გáƒáƒ›áƒáƒªáƒ”მრ\"%s\" მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": %s" + +#: pg_createsubscriber.c:1637 +#, c-format +msgid "dropping publication \"%s\" in database \"%s\"" +msgstr "ვშლი გáƒáƒ›áƒáƒªáƒ”მáƒáƒ¡ \"%s\" მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\"" + +#: pg_createsubscriber.c:1651 +#, c-format +msgid "could not drop publication \"%s\" in database \"%s\": %s" +msgstr "ვერ წáƒáƒ•შáƒáƒšáƒ” გáƒáƒ›áƒáƒªáƒ”მრ\"%s\" მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": %s" + +#: pg_createsubscriber.c:1697 +#, c-format +msgid "creating subscription \"%s\" in database \"%s\"" +msgstr "იქმნებრგáƒáƒ›áƒáƒ¬áƒ”რრ\"%s\" მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\"" + +#: pg_createsubscriber.c:1718 +#, c-format +msgid "could not create subscription \"%s\" in database \"%s\": %s" +msgstr "ვერ შევქმენი გáƒáƒ›áƒáƒ¬áƒ”რრ\"%s\" მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": %s" + +#: pg_createsubscriber.c:1763 +#, c-format +msgid "could not obtain subscription OID: %s" +msgstr "ვერ მივიღე გáƒáƒ›áƒáƒ¬áƒ”რის OID: %s" + +#: pg_createsubscriber.c:1770 +#, c-format +msgid "could not obtain subscription OID: got %d rows, expected %d row" +msgstr "ვერ მივიღე გáƒáƒ›áƒáƒ¬áƒ”რის OID: მივიღე %d მწკრივი, მáƒáƒ•ელáƒáƒ“ი %d მწკრივს" + +#: pg_createsubscriber.c:1794 +#, c-format +msgid "setting the replication progress (node name \"%s\", LSN %s) in database \"%s\"" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ მიმდინáƒáƒ áƒ”áƒáƒ‘ის (კვáƒáƒœáƒ«áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი \"%s\", LSN %s) დáƒáƒ§áƒ”ნებრმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ–ე \"%s\"" + +#: pg_createsubscriber.c:1809 +#, c-format +msgid "could not set replication progress for subscription \"%s\": %s" +msgstr "შეუძლებელირრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ მიმდინáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ§áƒ”ნებრგáƒáƒ›áƒáƒ¬áƒ”რისთვის \"%s\": %s" + +#: pg_createsubscriber.c:1840 +#, c-format +msgid "enabling subscription \"%s\" in database \"%s\"" +msgstr "ჩáƒáƒ˜áƒ áƒ—ვებრგáƒáƒ›áƒáƒ¬áƒ”რრ\"%s\" მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\"" + +#: pg_createsubscriber.c:1852 +#, c-format +msgid "could not enable subscription \"%s\": %s" +msgstr "ვერ ჩáƒáƒ•რთე გáƒáƒ›áƒáƒ¬áƒ”რრ\"%s\": %s" + +#: pg_createsubscriber.c:1944 +#, c-format +msgid "cannot be executed by \"root\"" +msgstr "root-ით ვერ გáƒáƒ”შვებáƒ" + +#: pg_createsubscriber.c:1945 +#, c-format +msgid "You must run %s as the PostgreSQL superuser." +msgstr "%s PostgreSQL-ის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლით უნდრგáƒáƒ£áƒ¨áƒ•áƒáƒ—." + +#: pg_createsubscriber.c:1966 +#, c-format +msgid "database \"%s\" specified more than once" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რ\"%s\" ერთზე მეტჯერáƒáƒ მითითებული" + +#: pg_createsubscriber.c:2007 +#, c-format +msgid "publication \"%s\" specified more than once" +msgstr "პუბლიკáƒáƒªáƒ˜áƒ \"%s\" მითითებულირერთზე მეტჯერ" + +#: pg_createsubscriber.c:2019 +#, c-format +msgid "replication slot \"%s\" specified more than once" +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\" მითითებულირერთზე მეტჯერ" + +#: pg_createsubscriber.c:2031 +#, c-format +msgid "subscription \"%s\" specified more than once" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რრ\"%s\" მითითებულირერთზე მეტჯერ" + +#: pg_createsubscriber.c:2054 +#, c-format +msgid "no subscriber data directory specified" +msgstr "გáƒáƒ›áƒáƒ›áƒ¬áƒ”რის მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ" + +#: pg_createsubscriber.c:2065 +#, c-format +msgid "could not determine current directory" +msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ" + +#: pg_createsubscriber.c:2082 +#, c-format +msgid "no publisher connection string specified" +msgstr "გáƒáƒ›áƒáƒ›áƒªáƒ”მლის მიერთების სტრიქáƒáƒœáƒ˜ მითითებული áƒáƒ áƒáƒ" + +#: pg_createsubscriber.c:2086 +#, c-format +msgid "validating publisher connection string" +msgstr "გáƒáƒ›áƒáƒ›áƒªáƒ”მლის მიერთების სტრიქáƒáƒœáƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბáƒ" + +#: pg_createsubscriber.c:2092 +#, c-format +msgid "validating subscriber connection string" +msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს გáƒáƒ›áƒáƒ›áƒ¬áƒ”რის დáƒáƒ™áƒáƒ•შირების სტრიქáƒáƒœáƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბáƒ" + +#: pg_createsubscriber.c:2097 +#, c-format +msgid "no database was specified" +msgstr "ბáƒáƒ–რმითითებული áƒáƒ áƒáƒ" + +#: pg_createsubscriber.c:2109 +#, c-format +msgid "database name \"%s\" was extracted from the publisher connection string" +msgstr "ბáƒáƒ–რ\"%s\" გáƒáƒ›áƒáƒ¦áƒ”ბულირგáƒáƒ›áƒáƒ›áƒªáƒ”მლის მიერთების სტრიქáƒáƒœáƒ˜áƒ“áƒáƒœ" + +#: pg_createsubscriber.c:2114 +#, c-format +msgid "no database name specified" +msgstr "ბáƒáƒ–ის სáƒáƒ®áƒ”ლი მითითებული áƒáƒ áƒáƒ" + +#: pg_createsubscriber.c:2124 +#, c-format +msgid "wrong number of publication names specified" +msgstr "მითითებულირგáƒáƒ›áƒáƒªáƒ”მის სáƒáƒ®áƒ”ლების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ" + +#: pg_createsubscriber.c:2125 +#, c-format +msgid "The number of specified publication names (%d) must match the number of specified database names (%d)." +msgstr "გáƒáƒ›áƒáƒªáƒ”მის სáƒáƒ®áƒ”ლების რáƒáƒáƒ“ენáƒáƒ‘რ(%d) ბáƒáƒ–ის სáƒáƒ®áƒ”ლების მითითებულ რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ¡ (%d) უნდრემთხვეáƒáƒ“ეს." + +#: pg_createsubscriber.c:2131 +#, c-format +msgid "wrong number of subscription names specified" +msgstr "მითითებულირგáƒáƒ›áƒáƒ¬áƒ”რის სáƒáƒ®áƒ”ლების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ" + +#: pg_createsubscriber.c:2132 +#, c-format +msgid "The number of specified subscription names (%d) must match the number of specified database names (%d)." +msgstr "მითითებული გáƒáƒ›áƒáƒ¬áƒ”რის სáƒáƒ®áƒ”ლების რáƒáƒáƒ“ენáƒáƒ‘რ(%d) მითითებული ბáƒáƒ–ის სáƒáƒ®áƒ”ლების რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ¡ (%d) უნდრემთხვეáƒáƒ“ეს." + +#: pg_createsubscriber.c:2138 +#, c-format +msgid "wrong number of replication slot names specified" +msgstr "მითითებულირრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ" + +#: pg_createsubscriber.c:2139 +#, c-format +msgid "The number of specified replication slot names (%d) must match the number of specified database names (%d)." +msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის მითითებული სáƒáƒ®áƒ”ლების რáƒáƒáƒ“ენáƒáƒ‘რ(%d) ბáƒáƒ–ის სáƒáƒ®áƒ”ლების მითითებულ რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ¡ (%d) უნდრემთხვეáƒáƒ“ეს." + +#: pg_createsubscriber.c:2168 +#, c-format +msgid "subscriber data directory is not a copy of the source database cluster" +msgstr "გáƒáƒ›áƒáƒ›áƒ¬áƒ”რის მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე წყáƒáƒ áƒ ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის áƒáƒ¡áƒšáƒ˜ áƒáƒ áƒáƒ" + +#: pg_createsubscriber.c:2181 +#, c-format +msgid "standby server is running" +msgstr "უქმე სერვერი გáƒáƒ¨áƒ•ებულიáƒ" + +#: pg_createsubscriber.c:2182 +#, c-format +msgid "Stop the standby server and try again." +msgstr "გáƒáƒáƒ©áƒ”რეთ უქმე სერვერი დრთáƒáƒ•იდáƒáƒœ სცáƒáƒ“ეთ." + +#: pg_createsubscriber.c:2191 +#, c-format +msgid "starting the standby server with command-line options" +msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს უქმე სერვერის გáƒáƒ¨áƒ•ებრბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრებით" + +#: pg_createsubscriber.c:2207 pg_createsubscriber.c:2242 +#, c-format +msgid "stopping the subscriber" +msgstr "გáƒáƒ›áƒáƒ›áƒ¬áƒ”რის გáƒáƒ©áƒ”რებáƒ" + +#: pg_createsubscriber.c:2221 +#, c-format +msgid "starting the subscriber" +msgstr "გáƒáƒ›áƒáƒ›áƒ¬áƒ”რის გáƒáƒ¨áƒ•ებáƒ" + +#: pg_createsubscriber.c:2250 +#, c-format +msgid "Done!" +msgstr "შესრულებულიáƒ!" + +#: pg_receivewal.c:77 +#, c-format +msgid "" +"%s receives PostgreSQL streaming write-ahead logs.\n" +"\n" +msgstr "" +"%s PostgreSQL-ის ნáƒáƒ™áƒáƒ“ური წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ¡ áƒáƒ®áƒ“ენს.\n" +"\n" + #: pg_receivewal.c:82 #, c-format msgid " -D, --directory=DIR receive write-ahead log files into this directory\n" msgstr " -D, --directory=DIR წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის მითითებულ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში ჩáƒáƒ¬áƒ”რáƒ\n" -#: pg_receivewal.c:83 pg_recvlogical.c:83 +#: pg_receivewal.c:83 pg_recvlogical.c:93 #, c-format msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" msgstr " -E, --endpos=LSN გáƒáƒ›áƒáƒ¡áƒ•ლრმითითებული LSN-ის მიღების შემდეგ\n" -#: pg_receivewal.c:84 pg_recvlogical.c:87 +#: pg_receivewal.c:84 pg_recvlogical.c:97 #, c-format msgid " --if-not-exists do not error if slot already exists when creating a slot\n" msgstr " --if-not-exists სლáƒáƒ¢áƒ˜áƒ¡ შექმნისáƒáƒ¡ მისი áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ის შემთხვევáƒáƒ¨áƒ˜ ფáƒáƒ¥áƒ¢áƒ˜ შეცდáƒáƒ›áƒáƒ“ áƒáƒ  ჩáƒáƒ˜áƒ—ვლებáƒ\n" -#: pg_receivewal.c:85 pg_recvlogical.c:89 +#: pg_receivewal.c:85 pg_recvlogical.c:99 #, c-format msgid " -n, --no-loop do not loop on connection lost\n" msgstr " -n, --no-loop შეერთების დáƒáƒ™áƒáƒ áƒ’ვისáƒáƒ¡ თáƒáƒ•იდáƒáƒœ áƒáƒ  ცდáƒ\n" @@ -1169,14 +1967,14 @@ msgstr " -n, --no-loop შეერთების დáƒáƒ™áƒáƒ áƒ’ msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync áƒáƒ  დáƒáƒ•ელáƒáƒ“რცვლილებების დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡\n" -#: pg_receivewal.c:87 pg_recvlogical.c:94 +#: pg_receivewal.c:87 pg_recvlogical.c:104 #, c-format msgid "" " -s, --status-interval=SECS\n" " time between status packets sent to server (default: %d)\n" msgstr "" " -s, --status-interval=SECS\n" -" შუáƒáƒšáƒ”დი სერვერზე სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ პáƒáƒ™áƒ”ტების გáƒáƒ’ზáƒáƒ•ნებს შáƒáƒ áƒ˜áƒ¡ (ნáƒáƒ’ულისხმები: %d)\n" +" შუáƒáƒšáƒ”დი სერვერზე სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ პáƒáƒ™áƒ”ტების გáƒáƒ’ზáƒáƒ•ნებს შáƒáƒ áƒ˜áƒ¡ (ნáƒáƒ’ულისხმევი: %d)\n" #: pg_receivewal.c:90 #, c-format @@ -1201,12 +1999,12 @@ msgstr "" "\n" "áƒáƒ áƒáƒ¡áƒáƒ•áƒáƒšáƒ“ებულრქმედებები:\n" -#: pg_receivewal.c:104 pg_recvlogical.c:79 +#: pg_receivewal.c:104 pg_recvlogical.c:89 #, c-format msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n" msgstr " --create-slot áƒáƒ®áƒáƒšáƒ˜ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ შექმნრ(სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლისთვის იხილეთ --slot)\n" -#: pg_receivewal.c:105 pg_recvlogical.c:80 +#: pg_receivewal.c:105 pg_recvlogical.c:90 #, c-format msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n" msgstr " --drop-slot რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ გáƒáƒ“áƒáƒ’დებრ(რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სáƒáƒ®áƒ”ლისთვის იხილეთ --slot)\n" @@ -1226,7 +2024,7 @@ msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ი შეჩერდრმი msgid "switched to timeline %u at %X/%X" msgstr "გáƒáƒ“áƒáƒ•ერთე %u-ე დრáƒáƒ˜áƒ¡ ხáƒáƒ–ზე მისáƒáƒ›áƒáƒ áƒ—ით %X/%X" -#: pg_receivewal.c:224 +#: pg_receivewal.c:224 pg_recvlogical.c:1053 #, c-format msgid "received interrupt signal, exiting" msgstr "მიღებულირშეწყვეტის სიგნáƒáƒšáƒ˜. გáƒáƒ›áƒáƒ¡áƒ•ლáƒ" @@ -1271,11 +2069,6 @@ msgstr "შეკუმშული სეგმენტის ფáƒáƒ˜áƒšáƒ˜ msgid "could not create LZ4 decompression context: %s" msgstr "lz4 შეკუმშვის კáƒáƒœáƒ¢áƒ”ქსტის შექმნის შეცდáƒáƒ›áƒ: %s" -#: pg_receivewal.c:402 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" - #: pg_receivewal.c:420 #, c-format msgid "could not decompress file \"%s\": %s" @@ -1301,7 +2094,7 @@ msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შემáƒáƒ¬áƒ›áƒ”ბრშეუძლე msgid "starting log streaming at %X/%X (timeline %u)" msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ი დáƒáƒ˜áƒ¬áƒ§áƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X (დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი %u)" -#: pg_receivewal.c:693 pg_recvlogical.c:783 +#: pg_receivewal.c:693 pg_recvlogical.c:801 #, c-format msgid "could not parse end position \"%s\"" msgstr "ბáƒáƒšáƒ პáƒáƒ–იციის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: %s" @@ -1331,28 +2124,28 @@ msgstr "%s-სთáƒáƒœ დáƒáƒ™áƒáƒ•შირების მხáƒáƒ áƒ“რmsgid "replication connection using slot \"%s\" is unexpectedly database specific" msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ შეერთებრსლáƒáƒ¢áƒ˜áƒ— \"%s\" მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ ბáƒáƒ–áƒáƒ–ერდáƒáƒ›áƒáƒ™áƒ˜áƒ“ებული" -#: pg_receivewal.c:878 pg_recvlogical.c:954 +#: pg_receivewal.c:878 pg_recvlogical.c:972 #, c-format msgid "dropping replication slot \"%s\"" msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ: %s" -#: pg_receivewal.c:889 pg_recvlogical.c:964 +#: pg_receivewal.c:889 pg_recvlogical.c:982 #, c-format msgid "creating replication slot \"%s\"" msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ შექმნრ\"%s\"" -#: pg_receivewal.c:918 pg_recvlogical.c:988 +#: pg_receivewal.c:918 pg_recvlogical.c:1006 #, c-format msgid "disconnected" msgstr "გáƒáƒ—იშულიáƒ" #. translator: check source for value for %d -#: pg_receivewal.c:922 pg_recvlogical.c:992 +#: pg_receivewal.c:922 pg_recvlogical.c:1010 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "გáƒáƒ—იშულიáƒ; თáƒáƒ•იდáƒáƒœ ცდáƒáƒ›áƒ“ე დáƒáƒ§áƒáƒ•ნებრ%d წáƒáƒ›áƒ˜áƒ" -#: pg_recvlogical.c:74 +#: pg_recvlogical.c:84 #, c-format msgid "" "%s controls PostgreSQL logical decoding streams.\n" @@ -1362,7 +2155,7 @@ msgstr "" "\n" " \n" -#: pg_recvlogical.c:78 +#: pg_recvlogical.c:88 #, c-format msgid "" "\n" @@ -1371,31 +2164,31 @@ msgstr "" "\n" "შესáƒáƒ¡áƒ áƒ£áƒšáƒ”ბელი ქმედებები:\n" -#: pg_recvlogical.c:81 +#: pg_recvlogical.c:91 #, c-format msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n" msgstr " --start რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ¨áƒ˜ ნáƒáƒ™áƒáƒ“ის გáƒáƒ¨áƒ•ებრ(სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლისთვის იხილეთ --slot)\n" -#: pg_recvlogical.c:84 +#: pg_recvlogical.c:94 #, c-format msgid " -f, --file=FILE receive log into this file, - for stdout\n" msgstr " -f, --file=FILE ჟურნáƒáƒšáƒ˜áƒ¡ მითითებულ ფáƒáƒ˜áƒšáƒ¨áƒ˜ მიღებáƒ. stdout-ისთვის -\n" -#: pg_recvlogical.c:85 +#: pg_recvlogical.c:95 #, c-format msgid "" " -F --fsync-interval=SECS\n" " time between fsyncs to the output file (default: %d)\n" msgstr "" " -F --fsync-interval=SECS\n" -" შუáƒáƒšáƒ”დი გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ fsync-ებს შáƒáƒ áƒ˜áƒ¡ (ნáƒáƒ’ულისხმები: %d)\n" +" შუáƒáƒšáƒ”დი გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ fsync-ებს შáƒáƒ áƒ˜áƒ¡ (ნáƒáƒ’ულისხმევი: %d)\n" -#: pg_recvlogical.c:88 +#: pg_recvlogical.c:98 #, c-format msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n" msgstr " -I, --startpos=LSN ნáƒáƒ™áƒáƒ“ის დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ áƒáƒ áƒ¡áƒ”ბული სლáƒáƒ¢áƒ˜áƒ¡áƒ—ვის\n" -#: pg_recvlogical.c:90 +#: pg_recvlogical.c:100 #, c-format msgid "" " -o, --option=NAME[=VALUE]\n" @@ -1406,143 +2199,143 @@ msgstr "" " გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბისთვის მითითებული სáƒáƒ®áƒ”ლის, áƒáƒ áƒáƒ¡áƒáƒ•áƒáƒšáƒ“ებულრმნიშვნელáƒáƒ‘ით,\n" " გáƒáƒ“áƒáƒªáƒ”მáƒ\n" -#: pg_recvlogical.c:93 +#: pg_recvlogical.c:103 #, c-format msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n" -msgstr " -P, --plugin=PLUGIN გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ მითითებული დáƒáƒ›áƒáƒ¢áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრ(ნáƒáƒ’ულისხმები: %s)\n" +msgstr " -P, --plugin=PLUGIN გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ მითითებული დáƒáƒ›áƒáƒ¢áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრ(ნáƒáƒ’ულისხმევი: %s)\n" -#: pg_recvlogical.c:96 +#: pg_recvlogical.c:106 #, c-format msgid " -S, --slot=SLOTNAME name of the logical replication slot\n" msgstr " -S, --slot=SLOTNAME ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n" -#: pg_recvlogical.c:97 +#: pg_recvlogical.c:107 #, c-format msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n" msgstr " -t, --two-phase სლáƒáƒ¢áƒ˜áƒ¡ შექმნისáƒáƒ¡ მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის დეკáƒáƒ“ერის ჩáƒáƒ áƒ—ვáƒ\n" -#: pg_recvlogical.c:102 +#: pg_recvlogical.c:112 #, c-format msgid " -d, --dbname=DBNAME database to connect to\n" msgstr " -d, --dbname=DBNAME მისáƒáƒ”რთებელი ბáƒáƒ–ის სáƒáƒ®áƒ”ლი\n" -#: pg_recvlogical.c:135 +#: pg_recvlogical.c:145 #, c-format msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)" msgstr "ჩáƒáƒ¬áƒ”რის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბრ%X/%X-მდე, %X/%X-მდე მáƒáƒªáƒ˜áƒšáƒ”ბრ(სლáƒáƒ¢áƒ˜ %s)" -#: pg_recvlogical.c:159 receivelog.c:360 +#: pg_recvlogical.c:169 receivelog.c:360 #, c-format msgid "could not send feedback packet: %s" msgstr "უკუკáƒáƒ•შირის პáƒáƒ™áƒ”ტის გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ: %s" -#: pg_recvlogical.c:227 +#: pg_recvlogical.c:239 #, c-format msgid "starting log streaming at %X/%X (slot %s)" msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ის დáƒáƒ¬áƒ§áƒ”ბრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X (სლáƒáƒ¢áƒ˜ %s)" -#: pg_recvlogical.c:269 +#: pg_recvlogical.c:281 #, c-format msgid "streaming initiated" msgstr "ნáƒáƒ™áƒáƒ“ი ინიცირებულიáƒ" -#: pg_recvlogical.c:333 +#: pg_recvlogical.c:346 #, c-format msgid "could not open log file \"%s\": %m" msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m" -#: pg_recvlogical.c:362 receivelog.c:882 +#: pg_recvlogical.c:375 receivelog.c:882 #, c-format msgid "invalid socket: %s" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒ”ტი: %s" -#: pg_recvlogical.c:415 receivelog.c:910 +#: pg_recvlogical.c:428 receivelog.c:910 #, c-format msgid "%s() failed: %m" msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m" -#: pg_recvlogical.c:422 receivelog.c:959 +#: pg_recvlogical.c:435 receivelog.c:959 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "\"WAL\" ნáƒáƒ™áƒáƒ“იდáƒáƒœ მáƒáƒœáƒáƒªáƒ”მების მიღების შეცდáƒáƒ›áƒ: %s" -#: pg_recvlogical.c:464 pg_recvlogical.c:515 receivelog.c:1003 +#: pg_recvlogical.c:477 pg_recvlogical.c:528 receivelog.c:1003 #: receivelog.c:1066 #, c-format msgid "streaming header too small: %d" msgstr "ნáƒáƒ™áƒáƒ“ის თáƒáƒ•სáƒáƒ áƒ—ი ძáƒáƒšáƒ˜áƒáƒœ პáƒáƒ¢áƒáƒ áƒáƒ: %d" -#: pg_recvlogical.c:499 receivelog.c:843 +#: pg_recvlogical.c:512 receivelog.c:843 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "ნáƒáƒ™áƒáƒ“ის უცნáƒáƒ‘ი თáƒáƒ•სáƒáƒ áƒ—ი: \"%c\"" -#: pg_recvlogical.c:553 pg_recvlogical.c:565 +#: pg_recvlogical.c:566 pg_recvlogical.c:578 #, c-format msgid "could not write %d bytes to log file \"%s\": %m" msgstr "%d ბáƒáƒ˜áƒ¢áƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": %m" -#: pg_recvlogical.c:619 receivelog.c:642 receivelog.c:679 +#: pg_recvlogical.c:636 receivelog.c:642 receivelog.c:679 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜: %s" -#: pg_recvlogical.c:778 +#: pg_recvlogical.c:796 #, c-format msgid "could not parse start position \"%s\"" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: %s" -#: pg_recvlogical.c:856 +#: pg_recvlogical.c:874 #, c-format msgid "no slot specified" msgstr "სლáƒáƒ¢áƒ˜ მითითებული áƒáƒ áƒáƒ" -#: pg_recvlogical.c:863 +#: pg_recvlogical.c:881 #, c-format msgid "no target file specified" msgstr "სáƒáƒ›áƒ˜áƒ–ნე ფáƒáƒ˜áƒšáƒ˜ მითითებული áƒáƒ áƒáƒ" -#: pg_recvlogical.c:870 +#: pg_recvlogical.c:888 #, c-format msgid "no database specified" msgstr "ბáƒáƒ–რმითითებული áƒáƒ áƒáƒ" -#: pg_recvlogical.c:877 +#: pg_recvlogical.c:895 #, c-format msgid "at least one action needs to be specified" msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ, სულ ცáƒáƒ¢áƒ, ერთი ქმედების მითითებáƒ" -#: pg_recvlogical.c:884 +#: pg_recvlogical.c:902 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "--create-slot -ს დრ---start-ს -drop-slot -თáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" -#: pg_recvlogical.c:891 +#: pg_recvlogical.c:909 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "--create-slot -ს დრ--drop-slot-ს --startpos -თáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" -#: pg_recvlogical.c:898 +#: pg_recvlogical.c:916 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos -ის მითითებრმხáƒáƒšáƒáƒ“ --start -თáƒáƒœ ერთáƒáƒ“ შეიძლებáƒ" -#: pg_recvlogical.c:905 +#: pg_recvlogical.c:923 #, c-format msgid "--two-phase may only be specified with --create-slot" msgstr "--two-phase -ის მითითებრმხáƒáƒšáƒáƒ“ --create-slot -თáƒáƒœ ერთáƒáƒ“ შეიძლებáƒ" -#: pg_recvlogical.c:938 +#: pg_recvlogical.c:956 #, c-format msgid "could not establish database-specific replication connection" msgstr "ბáƒáƒ–áƒáƒ–ე-დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებული რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ შეერთების დáƒáƒ›áƒ§áƒáƒ áƒ”ბის შეცდáƒáƒ›áƒ" -#: pg_recvlogical.c:1032 +#: pg_recvlogical.c:1056 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "ბáƒáƒšáƒ მდებáƒáƒ áƒ”áƒáƒ‘რ%X/%X keepalive-ის მიერ მიღწეული" -#: pg_recvlogical.c:1035 +#: pg_recvlogical.c:1061 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "ბáƒáƒšáƒ მდებáƒáƒ áƒ”áƒáƒ‘რ%X/%X WAL ჩáƒáƒœáƒáƒ¬áƒ”რის მიერ მიღწეულირმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" @@ -1659,7 +2452,7 @@ msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი შედეგების ნáƒáƒ™áƒ  msgid "could not parse next timeline's starting point \"%s\"" msgstr "შემდეგი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის დáƒáƒ¬áƒ§áƒ”ბის წერტილის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" -#: receivelog.c:775 receivelog.c:1022 walmethods.c:1201 +#: receivelog.c:775 receivelog.c:1022 walmethods.c:1206 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") fsync-ის შეცდáƒáƒ›áƒ: %s" @@ -1684,125 +2477,202 @@ msgstr "%d ბáƒáƒ˜áƒ¢áƒ˜áƒ¡ WAL ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რი msgid "could not send copy-end packet: %s" msgstr "copy-end პáƒáƒ™áƒ”ტის გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ: %s" -#: streamutil.c:158 +#: streamutil.c:162 msgid "Password: " msgstr "პáƒáƒ áƒáƒšáƒ˜: " -#: streamutil.c:181 +#: streamutil.c:189 #, c-format msgid "could not connect to server" msgstr "სერვერთáƒáƒœ მიერთების პრáƒáƒ‘ლემáƒ" -#: streamutil.c:222 +#: streamutil.c:230 #, c-format -msgid "could not clear search_path: %s" -msgstr "search_path-ის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ების პრáƒáƒ‘ლემáƒ: %s" +msgid "could not clear \"search_path\": %s" +msgstr "\"search_path\"-ის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ების პრáƒáƒ‘ლემáƒ: %s" -#: streamutil.c:238 +#: streamutil.c:246 #, c-format -msgid "could not determine server setting for integer_datetimes" +msgid "could not determine server setting for \"integer_datetimes\"" msgstr "სერვერის პáƒáƒ áƒáƒ›áƒ”ტრის \"integer_datetimes\" დáƒáƒ“გენრშეუძლებელიáƒ" -#: streamutil.c:245 +#: streamutil.c:253 #, c-format -msgid "integer_datetimes compile flag does not match server" -msgstr "áƒáƒ’ებისáƒáƒ¡ მითითებული áƒáƒšáƒáƒ›áƒ˜ integer_datetimes სერვერისáƒáƒ¡ áƒáƒ  ემთხვვევáƒ" +msgid "\"integer_datetimes\" compile flag does not match server" +msgstr "áƒáƒ’ებისáƒáƒ¡ მითითებული áƒáƒšáƒáƒ›áƒ˜ \"integer_datetimes\" სერვერისáƒáƒ¡ áƒáƒ  ემთხვვევáƒ" -#: streamutil.c:296 +#: streamutil.c:372 #, c-format msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "შეცდáƒáƒ›áƒ WAL-ის სეგმენტის ზáƒáƒ›áƒ˜áƒ¡ მიღებისáƒáƒ¡: მივიღე %d მწკრივი დრ%d ველი. მáƒáƒ•ელáƒáƒ“ი %d მწკრივს დრ%d áƒáƒœ მეტ ველს" -#: streamutil.c:306 +#: streamutil.c:382 #, c-format msgid "WAL segment size could not be parsed" msgstr "WAL სეგმენტის ზáƒáƒ›áƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" -#: streamutil.c:324 +#: streamutil.c:400 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes" -msgstr[0] "WAL-ის სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡ 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› დáƒáƒ¨áƒáƒ áƒ”ბულმრსერვერმრ%d ბáƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ მნიშვნელáƒáƒ‘რდáƒáƒáƒ‘რუნáƒ" -msgstr[1] "WAL-ის სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡ 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› დáƒáƒ¨áƒáƒ áƒ”ბულმრსერვერმრ%d ბáƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ მნიშვნელáƒáƒ‘რდáƒáƒáƒ‘რუნáƒ" +msgid "remote server reported invalid WAL segment size (%d byte)" +msgid_plural "remote server reported invalid WAL segment size (%d bytes)" +msgstr[0] "დáƒáƒ¨áƒáƒ áƒ”ბულმრსერვერმრáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ˜áƒ¡ (%d ბáƒáƒ˜áƒ¢áƒ˜) შესáƒáƒ®áƒ”ბ შეგვáƒáƒ¢áƒ§áƒáƒ‘ინáƒ" +msgstr[1] "დáƒáƒ¨áƒáƒ áƒ”ბულმრსერვერმრáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ˜áƒ¡ (%d ბáƒáƒ˜áƒ¢áƒ˜) შესáƒáƒ®áƒ”ბ შეგვáƒáƒ¢áƒ§áƒáƒ‘ინáƒ" -#: streamutil.c:369 +#: streamutil.c:404 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, შუáƒáƒšáƒ”დიდáƒáƒœ 1მბ-1გბ." + +#: streamutil.c:446 #, c-format msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "ჯგუფის წვდáƒáƒ›áƒ˜áƒ¡ áƒáƒšáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ—ხáƒáƒ•ის შეცდáƒáƒ›áƒ: მივიღე %d მწკრივი დრ%d ველი. მáƒáƒ•ელáƒáƒ“ი %d მწკრივს დრ%d áƒáƒœ მეტ ველს" -#: streamutil.c:378 +#: streamutil.c:455 #, c-format msgid "group access flag could not be parsed: %s" msgstr "ჯგუფის წვდáƒáƒ›áƒ˜áƒ¡ áƒáƒšáƒ›áƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: %s" -#: streamutil.c:421 streamutil.c:458 +#: streamutil.c:498 streamutil.c:535 #, c-format msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "სისტემის áƒáƒ›áƒáƒªáƒœáƒáƒ‘ის შეცდáƒáƒ›áƒ: მივიღე %d მწკრივი დრ%d ველი. მáƒáƒ•ელáƒáƒ“ი %d მწკრივს დრ%d áƒáƒœ მეტ ველს" -#: streamutil.c:510 +#: streamutil.c:587 #, c-format msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: მივიღე %d მწკრივი დრ%d ველი. მáƒáƒ•ელáƒáƒ“ი %d მწკრივს დრ%d ველს" -#: streamutil.c:522 +#: streamutil.c:599 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\"áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: streamutil.c:533 +#: streamutil.c:610 #, c-format msgid "expected a physical replication slot, got type \"%s\" instead" msgstr "მáƒáƒ•ელáƒáƒ“ი ფიზიკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ¡. მივიღე: %s" -#: streamutil.c:547 +#: streamutil.c:624 #, c-format msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" msgstr "restart_lsn \"%s\"-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡áƒ—ვის \"%s\"" -#: streamutil.c:664 +#: streamutil.c:741 #, c-format msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ (\"%s\") შექმნის შეცდáƒáƒ›áƒ: მივიღე %d მწკრივი დრ%d ველი. მáƒáƒ•ელáƒáƒ“ი %d მწკრივს დრ%d ველს" -#: streamutil.c:708 +#: streamutil.c:785 #, c-format msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ (\"%s\") გáƒáƒ“áƒáƒ’დების შეცდáƒáƒ›áƒ: მივიღე %d მწკრივი დრ%d ველი. მáƒáƒ•ელáƒáƒ“ი %d მწკრივს დრ%d ველს" +#: walmethods.c:726 walmethods.c:1269 +msgid "could not compress data" +msgstr "მáƒáƒœáƒáƒªáƒ”მების შეკუმშვის შეცდáƒáƒ›áƒ" + +#: walmethods.c:755 +msgid "could not reset compression stream" +msgstr "შეკუმშვის ნáƒáƒ™áƒáƒ“ის თáƒáƒ•იდáƒáƒœ დáƒáƒ¬áƒ§áƒ”ბის შეცდáƒáƒ›áƒ" + +#: walmethods.c:892 +msgid "implementation error: tar files can't have more than one open file" +msgstr "გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლების შეცდáƒáƒ›áƒ: tar ფáƒáƒ˜áƒšáƒ”ბს ერთზე მეტი ღირფáƒáƒ˜áƒšáƒ˜ ვერ ექნებáƒáƒ—" + +#: walmethods.c:907 +msgid "could not create tar header" +msgstr "tar-ის თáƒáƒ•სáƒáƒ áƒ—ის შექმნის შეცდáƒáƒ›áƒ" + +#: walmethods.c:924 walmethods.c:965 walmethods.c:1171 walmethods.c:1184 +msgid "could not change compression parameters" +msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრების შეცვლრშეუძლებელáƒ" + +#: walmethods.c:1056 +msgid "unlink not supported with compression" +msgstr "წáƒáƒ¨áƒšáƒ შეკუმშვით მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#: walmethods.c:1293 +msgid "could not close compression stream" +msgstr "შეკუმშვის ნáƒáƒ™áƒáƒ“ის დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ" + +#, c-format +#~ msgid "" +#~ " --config-file=FILENAME use specified main server configuration\n" +#~ " file when running target cluster\n" +#~ msgstr "" +#~ " --config-file=FILENAME სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒ¨áƒ•ებისáƒáƒ¡ მთáƒáƒ•áƒáƒ áƒ˜ \n" +#~ " სერვერის მითითებული კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" + +#, c-format +#~ msgid " -s, --socket-directory=DIR socket directory to use (default current directory)\n" +#~ msgstr " -s, --socket-directory=DIR სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (ნáƒáƒ’ულისხმევირმიმდინáƒáƒ áƒ”.)\n" + +#, c-format +#~ msgid " -?, --help show this help, then exit\n" +#~ msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" + +#, c-format +#~ msgid " -V, --version output version information, then exit\n" +#~ msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" + +#, c-format +#~ msgid "Consider increasing max_logical_replication_workers to at least %d." +#~ msgstr "გáƒáƒœáƒ˜áƒ®áƒ˜áƒšáƒ”თ max_logical_replication_workers-ის გáƒáƒ–რდრმინიმუმ %d-მდე." + +#, c-format +#~ msgid "Consider increasing max_replication_slots to at least %d." +#~ msgstr "გáƒáƒœáƒ˜áƒ®áƒ˜áƒšáƒ”თ max_replication_slots-ის გáƒáƒ–რდრმინიმუმ %d-მდე." + +#, c-format +#~ msgid "Consider increasing max_wal_senders to at least %d." +#~ msgstr "გáƒáƒœáƒ˜áƒ®áƒ˜áƒšáƒ”თ max_wal_senders-ის გáƒáƒ–რდრმინიმუმ %d-მდე." + +#, c-format +#~ msgid "Consider increasing max_worker_processes to at least %d." +#~ msgstr "გáƒáƒœáƒ˜áƒ®áƒ˜áƒšáƒ”თ max_worker_processes-ის გáƒáƒ–რდრმინიმუმ %d-მდე." + #, c-format #~ msgid "This build does not support compression with %s." #~ msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ %s-ით შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ áƒ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს." -#~ msgid "could not change compression parameters" -#~ msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრების შეცვლრშეუძლებელáƒ" +#, c-format +#~ msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte" +#~ msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes" +#~ msgstr[0] "WAL-ის სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡ 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› დáƒáƒ¨áƒáƒ áƒ”ბულმრსერვერმრ%d ბáƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ მნიშვნელáƒáƒ‘რდáƒáƒáƒ‘რუნáƒ" +#~ msgstr[1] "WAL-ის სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡ 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› დáƒáƒ¨áƒáƒ áƒ”ბულმრსერვერმრ%d ბáƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ მნიშვნელáƒáƒ‘რდáƒáƒáƒ‘რუნáƒ" #, c-format #~ msgid "could not check file \"%s\"" #~ msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბრშეუძლებელიáƒ: %s" -#~ msgid "could not close compression stream" -#~ msgstr "შეკუმშვის ნáƒáƒ™áƒáƒ“ის დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ" +#, c-format +#~ msgid "could not determine seek position in file \"%s\": %s" +#~ msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ %s გáƒáƒ“áƒáƒ®áƒ•ევის მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ“გენრშეუძლებელიáƒ: %s" -#~ msgid "could not compress data" -#~ msgstr "მáƒáƒœáƒáƒªáƒ”მების შეკუმშვის შეცდáƒáƒ›áƒ" +#, c-format +#~ msgid "could not obtain replication slot information: got %d rows, expected %d row" +#~ msgstr "ვერ მივიღე რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ: მივიღე %d მწკრივი, მáƒáƒ•ელáƒáƒ“ი %d მწკრივს" -#~ msgid "could not create tar header" -#~ msgstr "tar-ის თáƒáƒ•სáƒáƒ áƒ—ის შექმნის შეცდáƒáƒ›áƒ" +#, c-format +#~ msgid "could not set compression flag for %s: %s" +#~ msgstr "%s-სთვის შეკუმშვის დáƒáƒœáƒ˜áƒ¡ დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" #, c-format -#~ msgid "could not determine seek position in file \"%s\": %s" -#~ msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ %s გáƒáƒ“áƒáƒ®áƒ•ევის მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ“გენრშეუძლებელიáƒ: %s" +#~ msgid "duplicate database \"%s\"" +#~ msgstr "გáƒáƒœáƒ›áƒ”áƒáƒ áƒ”ბáƒáƒ“ი ბáƒáƒ–რ\"%s\"" #, c-format -#~ msgid "could not find replication slot \"%s\"" -#~ msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" +#~ msgid "duplicate publication \"%s\"" +#~ msgstr "გáƒáƒœáƒ›áƒ”áƒáƒ áƒ”ბáƒáƒ“ი გáƒáƒ›áƒáƒªáƒ”მრ\"%s\"" -#~ msgid "could not reset compression stream" -#~ msgstr "შეკუმშვის ნáƒáƒ™áƒáƒ“ის თáƒáƒ•იდáƒáƒœ დáƒáƒ¬áƒ§áƒ”ბის შეცდáƒáƒ›áƒ" +#, c-format +#~ msgid "duplicate replication slot \"%s\"" +#~ msgstr "გáƒáƒœáƒ›áƒ”áƒáƒ áƒ”ბáƒáƒ“ი რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\"" -#~ msgid "implementation error: tar files can't have more than one open file" -#~ msgstr "გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლების შეცდáƒáƒ›áƒ: tar ფáƒáƒ˜áƒšáƒ”ბს ერთზე მეტი ღირფáƒáƒ˜áƒšáƒ˜ ვერ ექნებáƒáƒ—" +#, c-format +#~ msgid "duplicate subscription \"%s\"" +#~ msgstr "გáƒáƒœáƒ›áƒ”áƒáƒ áƒ”ბáƒáƒ“ი გáƒáƒ›áƒáƒ¬áƒ”რრ\"%s\"" #, c-format #~ msgid "log streamer with pid %d exiting" @@ -1812,6 +2682,22 @@ msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ (\"%s\") გáƒáƒ“ #~ msgid "no value specified for --compress, switching to default" #~ msgstr "--compress -ის მნიშვნელáƒáƒ‘რმითითებული áƒáƒ áƒáƒ. გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრნáƒáƒ’ულისხმები" +#, c-format +#~ msgid "primary has replication slot \"%s\"" +#~ msgstr "ძირითáƒáƒ“ს áƒáƒ¥áƒ•ს რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜ \"%s\"" + +#, c-format +#~ msgid "standby is up and running" +#~ msgstr "უქმე ჩáƒáƒ áƒ—ულირდრმუშáƒáƒáƒ‘ს" + +#, c-format +#~ msgid "standby server disconnected from the primary" +#~ msgstr "უქმე სერვერ გáƒáƒ˜áƒ—იშრძირითáƒáƒ“ისგáƒáƒœ" + +#, c-format +#~ msgid "subscriber failed to change system identifier: exit code: %d" +#~ msgstr "გáƒáƒ›áƒáƒ›áƒ¬áƒ”რის სისტემური იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ შეცვლრჩáƒáƒ•áƒáƒ áƒ“áƒ: გáƒáƒ›áƒáƒ¡áƒ•ლის კáƒáƒ“ი: %d" + #, c-format #~ msgid "symlinks are not supported on this platform" #~ msgstr "სიმბმულები áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" @@ -1832,5 +2718,6 @@ msgstr "რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ˜áƒ¡ (\"%s\") გáƒáƒ“ #~ msgid "unknown compression option \"%s\"" #~ msgstr "შეკუმშვის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" -#~ msgid "unlink not supported with compression" -#~ msgstr "წáƒáƒ¨áƒšáƒ შეკუმშვით მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" +#, c-format +#~ msgid "validating connection string on subscriber" +#~ msgstr "შეერთების სტრიქáƒáƒœáƒ˜áƒ¡ დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბრგáƒáƒ›áƒáƒ›áƒ¬áƒ”რზე" diff --git a/src/bin/pg_basebackup/po/ko.po b/src/bin/pg_basebackup/po/ko.po index bbd19de74311b..08861d1022c3e 100644 --- a/src/bin/pg_basebackup/po/ko.po +++ b/src/bin/pg_basebackup/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_basebackup (PostgreSQL) 13\n" +"Project-Id-Version: pg_basebackup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 01:15+0000\n" -"PO-Revision-Date: 2020-10-06 11:02+0900\n" +"POT-Creation-Date: 2025-01-17 04:49+0000\n" +"PO-Revision-Date: 2025-01-18 02:23+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -17,167 +17,484 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "심ê°: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + +#: ../../common/compression.c:132 ../../common/compression.c:141 +#: ../../common/compression.c:150 bbstreamer_gzip.c:116 bbstreamer_gzip.c:249 +#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298 bbstreamer_zstd.c:129 +#: bbstreamer_zstd.c:284 +#, c-format +msgid "this build does not support compression with %s" +msgstr "ì´ ë²„ì „ì€ %s ì••ì¶• ê¸°ëŠ¥ì„ í¬í•¨ 하지 않고 빌드 ë˜ì—ˆìŠµë‹ˆë‹¤." + +#: ../../common/compression.c:205 +msgid "found empty string where a compression option was expected" +msgstr "ì••ì¶• ì˜µì…˜ì„ ì§€ì •í•˜ëŠ” ìžë¦¬ì— 빈 문ìžì—´ì´ 있습니다." + +#: ../../common/compression.c:244 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "ì¸ì‹í•  수 없는 ì••ì¶• 옵션: \"%s\"" + +#: ../../common/compression.c:283 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "\"%s\" ì••ì¶• 옵션ì—는 ê·¸ ì§€ì •ê°’ì´ í•„ìš”í•©ë‹ˆë‹¤." + +#: ../../common/compression.c:292 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "\"%s\" ì••ì¶• 옵션 ê°’ì€ ì •ìˆ˜ì—¬ì•¼ 합니다." + +#: ../../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "\"%s\" ì••ì¶• 옵션 ê°’ì€ ë¶€ìš¸ë¦°í˜•ì—¬ì•¼ 합니다." + +#: ../../common/compression.c:379 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "\"%s\" ì••ì¶• ì•Œê³ ë¦¬ì¦˜ì€ ì••ì¶• ìˆ˜ì¤€ì„ ì§€ì •í•  수 없습니다." + +#: ../../common/compression.c:386 +#, c-format +msgid "" +"compression algorithm \"%s\" expects a compression level between %d and %d " +"(default at %d)" +msgstr "" +"\"%s\" ì••ì¶• ì•Œê³ ë¦¬ì¦˜ì€ ì••ì¶• 수준값으로 %dì—서 %d까지만 허용함 (기본값 %d)" + +#: ../../common/compression.c:397 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "\"%s\" ì••ì¶• ì•Œê³ ë¦¬ì¦˜ì€ ë³‘ë ¬ 작업 수를 지정할 수 없습니다." + +#: ../../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "\"%s\" ì••ì¶• ì•Œê³ ë¦¬ì¦˜ì€ ì›ê±°ë¦¬ 모드를 ì§€ì›í•˜ì§€ 않습니다." + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ì½ê¸° ìš© \"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:110 pg_basebackup.c:1873 +#: pg_receivewal.c:402 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: bbstreamer_file.c:138 pg_recvlogical.c:650 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ë°”ì´íЏ 순서 불ì¼ì¹˜" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, " +"and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ë°”ì´íЏ 순서 ì¼ì¹˜í•˜ì§€ 않는 문제\n" +"ë°”ì´íЏ 순서 정보는 pg_control 파ì¼ì„ 저장할 때 사용ë˜ëŠ”ë°,\n" +"ì´ íŒŒì¼ì˜ ë°”ì´íЏ 순서 정보와 ì´ í”„ë¡œê·¸ëž¨ì—서 사용하는 순서 ì •ë³´ê°€ 다릅니다.\n" +"ì´ëŸ´ 경우, 출력 결과가 바르지 ì•Šì„ ìˆ˜ 있고,\n" +"ì„¤ì¹˜ëœ PostgreSQL 프로그램과 ë°ì´í„° 디렉터리가 호환ë˜ì§€ ì•Šì„ ìˆ˜ 있습니다." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: pg_basebackup.c:1846 pg_receivewal.c:386 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 pg_recvlogical.c:204 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ fsync 실패: %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "메모리 부족\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "null í¬ì¸í„°ë¥¼ 복제할 수 ì—†ìŒ(ë‚´ë¶€ 오류)\n" -#: ../../common/file_utils.c:79 ../../common/file_utils.c:181 -#: pg_receivewal.c:266 pg_recvlogical.c:340 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 위해 íŒŒì¼ ì‹œìŠ¤í…œ ë™ê¸°í™” 실패: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_receivewal.c:319 pg_recvlogical.c:352 #, c-format msgid "could not stat file \"%s\": %m" msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m" -#: ../../common/file_utils.c:158 pg_receivewal.c:169 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ì´ ë¹Œë“œëŠ” \"%s\" ë™ê¸°í™” ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_receivewal.c:242 #, c-format msgid "could not open directory \"%s\": %m" msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m" -#: ../../common/file_utils.c:192 pg_receivewal.c:337 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_receivewal.c:471 #, c-format msgid "could not read directory \"%s\": %m" msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" -#: ../../common/file_utils.c:224 ../../common/file_utils.c:283 -#: ../../common/file_utils.c:357 ../../fe_utils/recovery_gen.c:134 +#: ../../common/file_utils.c:498 pg_basebackup.c:2344 walmethods.c:462 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" -#: ../../common/file_utils.c:295 ../../common/file_utils.c:365 -#: pg_recvlogical.c:193 +#: ../../common/restricted_token.c:60 #, c-format -msgid "could not fsync file \"%s\": %m" -msgstr "\"%s\" íŒŒì¼ fsync 실패: %m" +msgid "could not open process token: error code %lu" +msgstr "프로세스 토í°ì„ ì—´ 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/file_utils.c:375 +#: ../../common/restricted_token.c:74 #, c-format -msgid "could not rename file \"%s\" to \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" +msgid "could not allocate SIDs: error code %lu" +msgstr "SID를 할당할 수 ì—†ìŒ: 오류 코드 %lu" + +#: ../../common/restricted_token.c:94 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "ì œí•œëœ í† í°ì„ ìƒì„±í•  수 없습니다: %lu" + +#: ../../common/restricted_token.c:115 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "\"%s\" 명령용 프로세스를 시작할 수 ì—†ìŒ: 오류 코드 %lu" + +#: ../../common/restricted_token.c:153 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "ì œí•œëœ í† í°ìœ¼ë¡œ 다시 실행할 수 ì—†ìŒ: 오류 코드 %lu" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "하위 í”„ë¡œì„¸ìŠ¤ì˜ ì¢…ë£Œ 코드를 구할 수 ì—†ìŒ: 오류 코드 %lu" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "\"%s\" ê°’ì€ \"%s\" 옵션값으로 유효하지 않ìŒ" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s ê°’ì€ %d부터 %d까지 지정할 수 있습니다." + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "알 수 없는 ë™ê¸°í™” 방법: %s" -#: ../../fe_utils/recovery_gen.c:35 ../../fe_utils/recovery_gen.c:49 -#: ../../fe_utils/recovery_gen.c:77 ../../fe_utils/recovery_gen.c:100 -#: ../../fe_utils/recovery_gen.c:171 pg_basebackup.c:1248 +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 pg_basebackup.c:1636 streamutil.c:334 #, c-format msgid "out of memory" msgstr "메모리 부족" -#: ../../fe_utils/recovery_gen.c:140 pg_basebackup.c:1021 pg_basebackup.c:1714 -#: pg_basebackup.c:1770 +#: ../../fe_utils/recovery_gen.c:143 bbstreamer_file.c:121 +#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727 #, c-format msgid "could not write to file \"%s\": %m" msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m" -#: ../../fe_utils/recovery_gen.c:152 pg_basebackup.c:1166 pg_basebackup.c:1671 -#: pg_basebackup.c:1747 +#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:361 +#: pg_basebackup.c:1497 pg_basebackup.c:1706 #, c-format msgid "could not create file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %m" -#: pg_basebackup.c:224 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "쉘 명령 ì¸ìžì— 줄바꿈 문ìžê°€ 있ìŒ: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "ë°ì´í„°ë² ì´ìФ ì´ë¦„ì— ì¤„ë°”ê¿ˆ 문ìžê°€ 있ìŒ: \"%s\"\n" + +#: bbstreamer_file.c:275 +#, c-format +msgid "unexpected state while extracting archive" +msgstr "ì•„ì¹´ì´ë¸Œ 추출 중 예ìƒì¹˜ 못한 ìƒíƒœê°’ 발견" + +#: bbstreamer_file.c:321 pg_basebackup.c:698 pg_basebackup.c:712 +#: pg_basebackup.c:757 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m" + +#: bbstreamer_file.c:326 +#, c-format +msgid "could not set permissions on directory \"%s\": %m" +msgstr "\"%s\" 디렉터리 액세스 ê¶Œí•œì„ ì§€ì •í•  수 ì—†ìŒ: %m" + +#: bbstreamer_file.c:345 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 심볼릭 ë§í¬ë¡œ 만들 수 ì—†ìŒ: %m" + +#: bbstreamer_file.c:365 +#, c-format +msgid "could not set permissions on file \"%s\": %m" +msgstr "íŒŒì¼ \"%s\" ì˜ ì ‘ê·¼ê¶Œí•œì„ ì§€ì •í•  수 ì—†ìŒ: %m" + +#: bbstreamer_gzip.c:95 +#, c-format +msgid "could not create compressed file \"%s\": %m" +msgstr "\"%s\" ì••ì¶• íŒŒì¼ ë§Œë“¤ê¸° 실패: %m" + +#: bbstreamer_gzip.c:103 +#, c-format +msgid "could not duplicate stdout: %m" +msgstr "stdoutì„ ì¤‘ë³µí•  수 ì—†ìŒ: %m" + +#: bbstreamer_gzip.c:107 +#, c-format +msgid "could not open output file: %m" +msgstr "출력파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: bbstreamer_gzip.c:111 +#, c-format +msgid "could not set compression level %d: %s" +msgstr "ìž˜ëª»ëœ ì••ì¶• 수위 %d: %s" + +#: bbstreamer_gzip.c:143 +#, c-format +msgid "could not write to compressed file \"%s\": %s" +msgstr "\"%s\" ì••ì¶• íŒŒì¼ ì“°ê¸° 실패: %s" + +#: bbstreamer_gzip.c:167 +#, c-format +msgid "could not close compressed file \"%s\": %m" +msgstr "\"%s\" ì••ì¶• íŒŒì¼ ë‹«ê¸° 실패: %m" + +#: bbstreamer_gzip.c:245 walmethods.c:880 +#, c-format +msgid "could not initialize compression library" +msgstr "ì••ì¶• ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 초기화할 수 ì—†ìŒ" + +#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329 +#, c-format +msgid "could not decompress data: %s" +msgstr "ì••ì¶• 풀기 실패: %s" + +#: bbstreamer_inject.c:189 +#, c-format +msgid "unexpected state while injecting recovery settings" +msgstr "복구 관련 ì„¤ì •ì„ ì¶”ê°€ 하는 ë„중 예ìƒì¹˜ 못한 ìƒíƒœ 발견" + +#: bbstreamer_lz4.c:95 +#, c-format +msgid "could not create lz4 compression context: %s" +msgstr "lz4 ì••ì¶• 컨í…스트 정보를 ìƒì„±í•  수 없습니다: %s" + +#: bbstreamer_lz4.c:140 +#, c-format +msgid "could not write lz4 header: %s" +msgstr "lz4 í—¤ë”를 쓸 수 ì—†ìŒ: %s" + +#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223 +#, c-format +msgid "could not compress data: %s" +msgstr "ìžë£Œë¥¼ ì••ì¶•í•  수 ì—†ìŒ: %s" + +#: bbstreamer_lz4.c:241 +#, c-format +msgid "could not end lz4 compression: %s" +msgstr "lz4 ì••ì¶•ì„ ë낼 수 ì—†ìŒ: %s" + +#: bbstreamer_lz4.c:293 +#, c-format +msgid "could not initialize compression library: %s" +msgstr "ì••ì¶• ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 초기화 í•  수 ì—†ìŒ: %s" + +#: bbstreamer_tar.c:244 +#, c-format +msgid "tar file trailer exceeds 2 blocks" +msgstr "tar íŒŒì¼ ë부분ì—서 2 블ë¡ì´ 초과ë¨" + +#: bbstreamer_tar.c:249 +#, c-format +msgid "unexpected state while parsing tar archive" +msgstr "tar ì•„ì¹´ì´ë¸Œ ë¶„ì„ ì¤‘ 예ìƒì¹˜ 못한 ìƒíƒœ 발견" + +#: bbstreamer_tar.c:292 +#, c-format +msgid "tar member has empty name" +msgstr "tar ë§´ë²„ì— ì´ë¦„ì´ ì—†ìŒ" + +#: bbstreamer_tar.c:326 +#, c-format +msgid "COPY stream ended before last file was finished" +msgstr "마지막 파ì¼ì„ ë내기 ì „ì— COPY ìŠ¤íŠ¸ë¦¼ì´ ë났ìŒ" + +#: bbstreamer_zstd.c:85 +#, c-format +msgid "could not create zstd compression context" +msgstr "zstd ì••ì¶• 컨í…스트를 만들 수 ì—†ìŒ" + +#: bbstreamer_zstd.c:91 +#, c-format +msgid "could not set zstd compression level to %d: %s" +msgstr "zstd ì••ì¶• ìˆ˜ì¤€ì„ %d 값으로 지정할 수 ì—†ìŒ: %s" + +#: bbstreamer_zstd.c:105 +#, c-format +msgid "could not set compression worker count to %d: %s" +msgstr "ì••ì¶•ìš© 병렬 ìž‘ì—…ìž ìˆ˜ë¥¼ %d 값으로 지정할 수 ì—†ìŒ: %s" + +#: bbstreamer_zstd.c:116 +#, c-format +msgid "could not enable long-distance mode: %s" +msgstr "ì›ê±°ë¦¬ 모드를 활성화 í•  수 ì—†ìŒ: %s" + +#: bbstreamer_zstd.c:275 +#, c-format +msgid "could not create zstd decompression context" +msgstr "zstd ì••ì¶• 컨í…스트를 만들 수 ì—†ìŒ" + +#: pg_basebackup.c:245 #, c-format msgid "removing data directory \"%s\"" msgstr "\"%s\" 디렉터리를 지우는 중" -#: pg_basebackup.c:226 +#: pg_basebackup.c:247 #, c-format msgid "failed to remove data directory" msgstr "ë°ì´í„° 디렉터리 ì‚­ì œ 실패" -#: pg_basebackup.c:230 +#: pg_basebackup.c:251 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "\"%s\" ë°ì´í„° ë””ë ‰í„°ë¦¬ì˜ ë‚´ìš©ì„ ì§€ìš°ëŠ” 중" -#: pg_basebackup.c:232 +#: pg_basebackup.c:253 #, c-format msgid "failed to remove contents of data directory" msgstr "ë°ì´í„° ë””ë ‰í„°ë¦¬ì˜ ë‚´ìš©ì„ ì§€ìš¸ 수 ì—†ìŒ" -#: pg_basebackup.c:237 +#: pg_basebackup.c:258 #, c-format msgid "removing WAL directory \"%s\"" msgstr "\"%s\" WAL 디렉터리를 지우는 중" -#: pg_basebackup.c:239 +#: pg_basebackup.c:260 #, c-format msgid "failed to remove WAL directory" msgstr "WAL 디렉터리 ì‚­ì œ 실패" -#: pg_basebackup.c:243 +#: pg_basebackup.c:264 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "\"%s\" WAL 디렉터리 ë‚´ìš©ì„ ì§€ìš°ëŠ” 중" -#: pg_basebackup.c:245 +#: pg_basebackup.c:266 #, c-format msgid "failed to remove contents of WAL directory" msgstr "WAL ë””ë ‰í„°ë¦¬ì˜ ë‚´ìš©ì„ ì§€ìš¸ 수 ì—†ìŒ" -#: pg_basebackup.c:251 +#: pg_basebackup.c:272 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "ì‚¬ìš©ìž ìš”ì²­ìœ¼ë¡œ \"%s\" ë°ì´í„° 디렉터리를 지우지 않았ìŒ" -#: pg_basebackup.c:254 +#: pg_basebackup.c:275 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "ì‚¬ìš©ìž ìš”ì²­ìœ¼ë¡œ \"%s\" WAL 디렉터리를 지우지 않았ìŒ" -#: pg_basebackup.c:258 +#: pg_basebackup.c:279 #, c-format msgid "changes to tablespace directories will not be undone" msgstr "ì•„ì§ ë§ˆë¬´ë¦¬ ë˜ì§€ ì•Šì€ í…Œì´ë¸”스페ì´ìФ 디렉터리 변경함" -#: pg_basebackup.c:299 +#: pg_basebackup.c:331 #, c-format msgid "directory name too long" msgstr "디렉터리 ì´ë¦„ì´ ë„ˆë¬´ ê¹€" -#: pg_basebackup.c:309 +#: pg_basebackup.c:338 #, c-format msgid "multiple \"=\" signs in tablespace mapping" msgstr "í…Œì´ë¸”스페ì´ìФ 맵핑 하는 ê³³ì—서 \"=\" 문ìžê°€ 중복 ë˜ì–´ 있ìŒ" -#: pg_basebackup.c:321 +#: pg_basebackup.c:347 #, c-format msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "" "\"%s\" 형ì‹ì˜ í…Œì´ë¸”스페ì´ìФ ë§µí•‘ì´ ìž˜ëª» ë˜ì—ˆìŒ, \"OLDDIR=NEWDIR\" 형ì‹ì´ì–´" "야 함" -#: pg_basebackup.c:333 +#: pg_basebackup.c:366 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "í…Œì´ë¸”스페ì´ìФ 맵핑용 옛 디렉터리가 절대 경로가 아님: %s" -#: pg_basebackup.c:340 +#: pg_basebackup.c:370 #, c-format msgid "new directory is not an absolute path in tablespace mapping: %s" msgstr "í…Œì´ë¸”스페ì´ìФ 맵핑용 새 디렉터리가 절대 경로가 아님: %s" -#: pg_basebackup.c:379 +#: pg_basebackup.c:392 #, c-format msgid "" "%s takes a base backup of a running PostgreSQL server.\n" @@ -187,17 +504,19 @@ msgstr "" "다.\n" "\n" -#: pg_basebackup.c:381 pg_receivewal.c:79 pg_recvlogical.c:75 +#: pg_basebackup.c:394 pg_createsubscriber.c:221 pg_receivewal.c:79 +#: pg_recvlogical.c:86 #, c-format msgid "Usage:\n" msgstr "사용법:\n" -#: pg_basebackup.c:382 pg_receivewal.c:80 pg_recvlogical.c:76 +#: pg_basebackup.c:395 pg_createsubscriber.c:222 pg_receivewal.c:80 +#: pg_recvlogical.c:87 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [옵션]...\n" -#: pg_basebackup.c:383 +#: pg_basebackup.c:396 #, c-format msgid "" "\n" @@ -206,17 +525,26 @@ msgstr "" "\n" "ì¶œë ¥ë¬¼ì„ ì œì–´ì•¼í•˜ëŠ” 옵션들:\n" -#: pg_basebackup.c:384 +#: pg_basebackup.c:397 #, c-format msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n" msgstr " -D, --pgdata=디렉터리 ë² ì´ìФ 백업 ê²°ê³¼ë¬¼ì´ ì €ìž¥ë  ë””ë ‰í„°ë¦¬\n" -#: pg_basebackup.c:385 +#: pg_basebackup.c:398 #, c-format msgid " -F, --format=p|t output format (plain (default), tar)\n" msgstr " -F, --format=p|t 출력 í˜•ì‹ (plain (초기값), tar)\n" -#: pg_basebackup.c:386 +#: pg_basebackup.c:399 +#, c-format +msgid "" +" -i, --incremental=OLDMANIFEST\n" +" take incremental backup\n" +msgstr "" +" -i, --incremental=ì´ì „매니페ì´ìФ\n" +" ì¦ë¶„ 백업\n" + +#: pg_basebackup.c:401 #, c-format msgid "" " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" @@ -226,7 +554,7 @@ msgstr "" " (단위는 kB/s, ë˜ëŠ” ìˆ«ìž ë’¤ì— \"k\" ë˜ëŠ” \"M\" 단위 " "ë¬¸ìž ì§€ì • 가능)\n" -#: pg_basebackup.c:388 +#: pg_basebackup.c:403 #, c-format msgid "" " -R, --write-recovery-conf\n" @@ -235,7 +563,16 @@ msgstr "" " -R, --write-recovery-conf\n" " 복제를 위한 환경 설정 함\n" -#: pg_basebackup.c:390 +#: pg_basebackup.c:405 +#, c-format +msgid "" +" -t, --target=TARGET[:DETAIL]\n" +" backup target (if other than client)\n" +msgstr "" +" -t, --target=TARGET[:DETAIL]\n" +" 백업 타겟 지정 (ì´ê³³ ë˜ëŠ” 다른 ê³³)\n" + +#: pg_basebackup.c:407 #, c-format msgid "" " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" @@ -244,12 +581,12 @@ msgstr "" " -T, --tablespace-mapping=옛DIR=새DIR\n" " í…Œì´ë¸”스페ì´ìФ 디렉터리 새 맵핑\n" -#: pg_basebackup.c:392 +#: pg_basebackup.c:409 #, c-format msgid " --waldir=WALDIR location for the write-ahead log directory\n" msgstr " --waldir=WALDIR 트랜잭션 로그 디렉터리 지정\n" -#: pg_basebackup.c:393 +#: pg_basebackup.c:410 #, c-format msgid "" " -X, --wal-method=none|fetch|stream\n" @@ -258,18 +595,26 @@ msgstr "" " -X, --wal-method=none|fetch|stream\n" " 필요한 WAL 파ì¼ì„ 백업하는 방법\n" -#: pg_basebackup.c:395 +#: pg_basebackup.c:412 #, c-format msgid " -z, --gzip compress tar output\n" msgstr " -z, --gzip tar ì¶œë ¥ë¬¼ì„ ì••ì¶•\n" -#: pg_basebackup.c:396 +#: pg_basebackup.c:413 #, c-format msgid "" -" -Z, --compress=0-9 compress tar output with given compression level\n" -msgstr " -Z, --compress=0-9 ì••ì¶•ëœ tar 파ì¼ì˜ ì••ì¶• 수위 지정\n" +" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" +" compress on client or server as specified\n" +msgstr "" +" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" +" ì••ì¶• 관련 설정\n" -#: pg_basebackup.c:397 +#: pg_basebackup.c:415 +#, c-format +msgid " -Z, --compress=none do not compress tar output\n" +msgstr " -Z, --compress=none tar 출력ì—서 ì••ì¶• 안함\n" + +#: pg_basebackup.c:416 #, c-format msgid "" "\n" @@ -278,58 +623,58 @@ msgstr "" "\n" "ì¼ë°˜ 옵션들:\n" -#: pg_basebackup.c:398 +#: pg_basebackup.c:417 #, c-format msgid "" " -c, --checkpoint=fast|spread\n" -" set fast or spread checkpointing\n" +" set fast or spread (default) checkpointing\n" msgstr "" " -c, --checkpoint=fast|spread\n" -" ì²´í¬í¬ì¸íЏ 방법\n" +" ì²´í¬í¬ì¸íЏ 방법, fast ë˜ëŠ” spread (기본값)\n" -#: pg_basebackup.c:400 +#: pg_basebackup.c:419 #, c-format msgid " -C, --create-slot create replication slot\n" msgstr " -C, --create-slot 새 복제 ìŠ¬ë¡¯ì„ ë§Œë“¬\n" -#: pg_basebackup.c:401 +#: pg_basebackup.c:420 #, c-format msgid " -l, --label=LABEL set backup label\n" msgstr " -l, --label=ë¼ë²¨ 백업 ë¼ë²¨ 지정\n" -#: pg_basebackup.c:402 +#: pg_basebackup.c:421 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean 오류 ë°œìƒ ì‹œ 정리하지 않ìŒ\n" -#: pg_basebackup.c:403 +#: pg_basebackup.c:422 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written safely to " "disk\n" msgstr " -N, --no-sync ë””ìŠ¤í¬ ì“°ê¸° ë’¤ sync 작업 ìƒëžµ\n" -#: pg_basebackup.c:404 +#: pg_basebackup.c:423 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress ì§„í–‰ 과정 보여줌\n" -#: pg_basebackup.c:405 pg_receivewal.c:89 +#: pg_basebackup.c:424 pg_receivewal.c:89 #, c-format msgid " -S, --slot=SLOTNAME replication slot to use\n" msgstr " -S, --slot=슬롯ì´ë¦„ 지정한 복제 ìŠ¬ë¡¯ì„ ì‚¬ìš©í•¨\n" -#: pg_basebackup.c:406 pg_receivewal.c:91 pg_recvlogical.c:96 +#: pg_basebackup.c:425 pg_receivewal.c:91 pg_recvlogical.c:108 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose ìžì„¸í•œ 작업 메시지 보여줌\n" -#: pg_basebackup.c:407 pg_receivewal.c:92 pg_recvlogical.c:97 +#: pg_basebackup.c:426 pg_receivewal.c:92 pg_recvlogical.c:109 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 ì •ë³´ 보여주고 마침\n" -#: pg_basebackup.c:408 +#: pg_basebackup.c:427 #, c-format msgid "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" @@ -338,7 +683,7 @@ msgstr "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" " 사용할 manifest ì²´í¬ì„¬ 알고리즘\n" -#: pg_basebackup.c:410 +#: pg_basebackup.c:429 #, c-format msgid "" " --manifest-force-encode\n" @@ -347,23 +692,23 @@ msgstr "" " --manifest-force-encode\n" " manifest ë‚´ 모든 íŒŒì¼ ì´ë¦„ì„ 16진수 ì¸ì½”딩함\n" -#: pg_basebackup.c:412 +#: pg_basebackup.c:431 #, c-format msgid " --no-estimate-size do not estimate backup size in server side\n" msgstr " --no-estimate-size 서버측 백업 í¬ê¸°ë¥¼ 예ìƒí•˜ì§€ 않ìŒ\n" -#: pg_basebackup.c:413 +#: pg_basebackup.c:432 #, c-format msgid " --no-manifest suppress generation of backup manifest\n" msgstr " --no-manifest 백업 매니페스트 만들지 않ìŒ\n" -#: pg_basebackup.c:414 +#: pg_basebackup.c:433 #, c-format msgid "" " --no-slot prevent creation of temporary replication slot\n" msgstr " --no-slot 임시 복제 슬롯 만들지 않ìŒ\n" -#: pg_basebackup.c:415 +#: pg_basebackup.c:434 #, c-format msgid "" " --no-verify-checksums\n" @@ -372,12 +717,21 @@ msgstr "" " --no-verify-checksums\n" " ì²´í¬ì„¬ 검사 안함\n" -#: pg_basebackup.c:417 pg_receivewal.c:94 pg_recvlogical.c:98 +#: pg_basebackup.c:436 +#, c-format +msgid "" +" --sync-method=METHOD\n" +" set method for syncing files to disk\n" +msgstr "" +" --sync-method=METHOD\n" +" 파ì¼ì„ 디스í¬ì— ë™ê¸°í™” 하는 방법 지정\n" + +#: pg_basebackup.c:438 pg_receivewal.c:95 pg_recvlogical.c:110 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: pg_basebackup.c:418 pg_receivewal.c:95 pg_recvlogical.c:99 +#: pg_basebackup.c:439 pg_receivewal.c:96 pg_recvlogical.c:111 #, c-format msgid "" "\n" @@ -386,22 +740,22 @@ msgstr "" "\n" "ì—°ê²° 옵션들:\n" -#: pg_basebackup.c:419 pg_receivewal.c:96 +#: pg_basebackup.c:440 pg_receivewal.c:97 #, c-format msgid " -d, --dbname=CONNSTR connection string\n" msgstr " -d, --dbname=ì ‘ì†ë¬¸ìžì—´ 서버 ì ‘ì† ë¬¸ìžì—´\n" -#: pg_basebackup.c:420 pg_receivewal.c:97 pg_recvlogical.c:101 +#: pg_basebackup.c:441 pg_receivewal.c:98 pg_recvlogical.c:113 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=호스트ì´ë¦„ ì ‘ì†í•  ë°ì´í„°ë² ì´ìФ 서버나 소켓 디렉터리\n" -#: pg_basebackup.c:421 pg_receivewal.c:98 pg_recvlogical.c:102 +#: pg_basebackup.c:442 pg_receivewal.c:99 pg_recvlogical.c:114 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=í¬íЏ ë°ì´í„°ë² ì´ìФ 서버 í¬íЏ 번호\n" -#: pg_basebackup.c:422 +#: pg_basebackup.c:443 #, c-format msgid "" " -s, --status-interval=INTERVAL\n" @@ -411,17 +765,17 @@ msgstr "" " -s, --status-interval=ì´ˆ\n" " ì´ˆ 단위 매번 서버로 ìƒíƒœ íŒ¨í‚·ì„ ë³´ëƒ„\n" -#: pg_basebackup.c:424 pg_receivewal.c:99 pg_recvlogical.c:103 +#: pg_basebackup.c:445 pg_receivewal.c:100 pg_recvlogical.c:115 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=ì‚¬ìš©ìž ì ‘ì†í•  특정 ë°ì´í„°ë² ì´ìФ 사용ìž\n" -#: pg_basebackup.c:425 pg_receivewal.c:100 pg_recvlogical.c:104 +#: pg_basebackup.c:446 pg_receivewal.c:101 pg_recvlogical.c:116 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password 비밀번호 물어 ë³´ì§€ 않ìŒ\n" -#: pg_basebackup.c:426 pg_receivewal.c:101 pg_recvlogical.c:105 +#: pg_basebackup.c:447 pg_receivewal.c:102 pg_recvlogical.c:117 #, c-format msgid "" " -W, --password force password prompt (should happen " @@ -429,7 +783,8 @@ msgid "" msgstr "" " -W, --password í•­ìƒ ë¹„ë°€ë²ˆí˜¸ 프롬프트 ë³´ìž„ (ìžë™ìœ¼ë¡œ íŒë‹¨ 함)\n" -#: pg_basebackup.c:427 pg_receivewal.c:105 pg_recvlogical.c:106 +#: pg_basebackup.c:448 pg_createsubscriber.c:240 pg_receivewal.c:106 +#: pg_recvlogical.c:118 #, c-format msgid "" "\n" @@ -438,464 +793,1218 @@ msgstr "" "\n" "ë¬¸ì œì  ë³´ê³  주소: <%s>\n" -#: pg_basebackup.c:428 pg_receivewal.c:106 pg_recvlogical.c:107 +#: pg_basebackup.c:449 pg_createsubscriber.c:241 pg_receivewal.c:107 +#: pg_recvlogical.c:119 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페ì´ì§€: <%s>\n" -#: pg_basebackup.c:471 +#: pg_basebackup.c:488 +#, c-format +msgid "could not read from ready pipe: %m" +msgstr "ì¤€ë¹„ëœ íŒŒì´í”„로부터 ì½ê¸° 실패: %m" + +#: pg_basebackup.c:491 pg_basebackup.c:633 pg_basebackup.c:2258 +#: streamutil.c:521 +#, c-format +msgid "could not parse write-ahead log location \"%s\"" +msgstr "트랜잭션 로그 위치 \"%s\" ë¶„ì„ ì‹¤íŒ¨" + +#: pg_basebackup.c:596 pg_receivewal.c:600 +#, c-format +msgid "could not finish writing WAL files: %m" +msgstr "WAL íŒŒì¼ ì“°ê¸° 마무리 실패: %m" + +#: pg_basebackup.c:642 +#, c-format +msgid "could not create pipe for background process: %m" +msgstr "백그ë¼ìš´ë“œ 프로세스를 위한 파ì´í”„ 만들기 실패: %m" + +#: pg_basebackup.c:676 +#, c-format +msgid "created temporary replication slot \"%s\"" +msgstr "\"%s\" 임시 복제 ìŠ¬ë¡¯ì„ ë§Œë“¦" + +#: pg_basebackup.c:679 +#, c-format +msgid "created replication slot \"%s\"" +msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ ë§Œë“¦" + +#: pg_basebackup.c:728 +#, c-format +msgid "could not create background process: %m" +msgstr "백그ë¼ìš´ë“œ 프로세스 만들기 실패: %m" + +#: pg_basebackup.c:737 +#, c-format +msgid "could not create background thread: %m" +msgstr "백그ë¼ìš´ë“œ 스래드 만들기 실패: %m" + +#: pg_basebackup.c:776 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "\"%s\" 디렉터리가 있지만 비어 있지 않ìŒ" + +#: pg_basebackup.c:782 pg_createsubscriber.c:390 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m" + +#: pg_basebackup.c:858 +#, c-format +msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" +msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" +msgstr[0] "%*s/%s kB (100%%), %d/%d í…Œì´ë¸”스페ì´ìФ %*s" + +#: pg_basebackup.c:870 +#, c-format +msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" +msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" +msgstr[0] "%*s/%s kB (%d%%), %d/%d í…Œì´ë¸”스페ì´ìФ (%s%-*.*s)" + +#: pg_basebackup.c:886 +#, c-format +msgid "%*s/%s kB (%d%%), %d/%d tablespace" +msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" +msgstr[0] "%*s/%s kB (%d%%), %d/%d í…Œì´ë¸”스페ì´ìФ" + +#: pg_basebackup.c:910 +#, c-format +msgid "transfer rate \"%s\" is not a valid value" +msgstr "\"%s\" 전송 ì†ë„는 ìž˜ëª»ëœ ê°’ìž„" + +#: pg_basebackup.c:912 +#, c-format +msgid "invalid transfer rate \"%s\": %m" +msgstr "ìž˜ëª»ëœ ì „ì†¡ ì†ë„ \"%s\": %m" + +#: pg_basebackup.c:919 +#, c-format +msgid "transfer rate must be greater than zero" +msgstr "전송 ì†ë„는 0보다 커야 함" + +#: pg_basebackup.c:949 +#, c-format +msgid "invalid --max-rate unit: \"%s\"" +msgstr "ìž˜ëª»ëœ --max-rate 단위: \"%s\"" + +#: pg_basebackup.c:953 +#, c-format +msgid "transfer rate \"%s\" exceeds integer range" +msgstr "\"%s\" 전송 ì†ë„는 정수형 범위가 아님" + +#: pg_basebackup.c:960 +#, c-format +msgid "transfer rate \"%s\" is out of range" +msgstr "\"%s\" 전송 ì†ë„는 범위 초과" + +#: pg_basebackup.c:1022 +#, c-format +msgid "could not get COPY data stream: %s" +msgstr "COPY ë°ì´í„° ìŠ¤íŠ¸ë¦¼ì„ ì‚¬ìš©í•  수 ì—†ìŒ: %s" + +#: pg_basebackup.c:1039 pg_recvlogical.c:449 pg_recvlogical.c:625 +#: receivelog.c:973 +#, c-format +msgid "could not read COPY data: %s" +msgstr "COPY ìžë£Œë¥¼ ì½ì„ 수 ì—†ìŒ: %s" + +#: pg_basebackup.c:1043 +#, c-format +msgid "background process terminated unexpectedly" +msgstr "백그ë¼ìš´ë“œ 프로세스가 예ìƒì¹˜ 않게 종료ë¨" + +#: pg_basebackup.c:1114 +#, c-format +msgid "cannot inject manifest into a compressed tar file" +msgstr "ì••ì¶•ëœ tar 파ì¼ì—는 manifest를 ë„£ì„ ìˆ˜ 없습니다." + +#: pg_basebackup.c:1115 +#, c-format +msgid "" +"Use client-side compression, send the output to a directory rather than " +"standard output, or use %s." +msgstr "" +"ê²°ê³¼ë¬¼ì„ í‘œì¤€ 출력으로 ë³´ë‚´ì§€ ë§ê³ , 디렉터리로 보낸 ë’¤ í´ë¼ì´ì–¸íЏ 측ì—서 ì••" +"ì¶• 하거나, %s ì˜µì…˜ì„ ì‚¬ìš©í•˜ì„¸ìš”." + +#: pg_basebackup.c:1131 +#, c-format +msgid "cannot parse archive \"%s\"" +msgstr "\"%s\" ì•„ì¹´ì´ë¸Œë¥¼ 구문분ì„í•  수 ì—†ìŒ" + +#: pg_basebackup.c:1132 +#, c-format +msgid "Only tar archives can be parsed." +msgstr "tar 형ì‹ë§Œ 구문분ì„í•  수 있ìŒ" + +#: pg_basebackup.c:1134 +#, c-format +msgid "Plain format requires pg_basebackup to parse the archive." +msgstr "ì•„ì¹´ì´ë¸Œë¥¼ ë¶„ì„하기 위해서는 ì¼ë°˜ ì–‘ì‹ì´ì–´ì•¼ 합니다." + +#: pg_basebackup.c:1136 +#, c-format +msgid "" +"Using - as the output directory requires pg_basebackup to parse the archive." +msgstr "ì•„ì¹´ì´ë¸Œë¥¼ ë¶„ì„하기 위해 출력 디렉터리 ì´ë¦„으로 - 문ìžë¥¼ 사용하세요." + +#: pg_basebackup.c:1138 +#, c-format +msgid "The -R option requires pg_basebackup to parse the archive." +msgstr "ì•„ì¹´ì´ë¸Œë¥¼ ë¶„ì„하기 위해 -R ì˜µì…˜ì„ ì‚¬ìš©í•˜ì„¸ìš”." + +#: pg_basebackup.c:1357 +#, c-format +msgid "archives must precede manifest" +msgstr "ì•„ì¹´ì´ë¸Œ ìž‘ì—…ì€ ë§¤ë‹ˆíŽ˜ìŠ¤íŠ¸ë³´ë‹¤ 앞서야합니다" + +#: pg_basebackup.c:1372 +#, c-format +msgid "invalid archive name: \"%s\"" +msgstr "ìž˜ëª»ëœ ì•„ì¹´ì´ë¸Œ ì´ë¦„: \"%s\"" + +#: pg_basebackup.c:1444 +#, c-format +msgid "unexpected payload data" +msgstr "ë¹„ì •ìƒ payload ìžë£Œ" + +#: pg_basebackup.c:1587 +#, c-format +msgid "empty COPY message" +msgstr "빈 COPY 메시지" + +#: pg_basebackup.c:1589 +#, c-format +msgid "malformed COPY message of type %d, length %zu" +msgstr "타입 %dì˜ ìž˜ëª»ëœ COPY 메시지, 길ì´: %zu" + +#: pg_basebackup.c:1789 +#, c-format +msgid "incompatible server version %s" +msgstr "호환하지 않는 서버 버전 %s" + +#: pg_basebackup.c:1805 +#, c-format +msgid "Use -X none or -X fetch to disable log streaming." +msgstr "" +"트랜잭션 로그 스트리ë°ì„ 사용하지 않으려면 -X none ë˜ëŠ” -X fetch ì˜µì…˜ì„ ì‚¬ìš©" +"하세요." + +#: pg_basebackup.c:1841 +#, c-format +msgid "server does not support incremental backup" +msgstr "서버가 ì¦ë¶„ ë°±ì—…ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: pg_basebackup.c:1850 pg_basebackup.c:2008 pg_recvlogical.c:272 +#: receivelog.c:543 receivelog.c:582 streamutil.c:367 streamutil.c:441 +#: streamutil.c:493 streamutil.c:581 streamutil.c:733 streamutil.c:778 +#, c-format +msgid "could not send replication command \"%s\": %s" +msgstr "\"%s\" 복제 ëª…ë ¹ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s" + +#: pg_basebackup.c:1856 pg_basebackup.c:1883 +#, c-format +msgid "could not upload manifest: %s" +msgstr "매니페ì´ìФ 파ì¼ì„ 업로드 í•  수 ì—†ìŒ: %s" + +#: pg_basebackup.c:1859 pg_basebackup.c:1886 +#, c-format +msgid "could not upload manifest: unexpected status %s" +msgstr "매니페ì´ìФ 파ì¼ì„ 업로드 í•  수 ì—†ìŒ: 예ìƒì¹˜ ì•Šì€ ìƒíƒœ %s" + +#: pg_basebackup.c:1867 +#, c-format +msgid "could not send COPY data: %s" +msgstr "COPY ìžë£Œë¥¼ 보낼 수 ì—†ìŒ: %s" + +#: pg_basebackup.c:1877 +#, c-format +msgid "could not send end-of-COPY: %s" +msgstr "COPY 종료 정보를 보낼 수 ì—†ìŒ: %s" + +#: pg_basebackup.c:1892 +#, c-format +msgid "unexpected extra result while sending manifest" +msgstr "매니페ì´ìŠ¤ë¥¼ 보내는 중 예ìƒì¹˜ 못한 부가 ê²°ê³¼ 발견" + +#: pg_basebackup.c:1950 +#, c-format +msgid "backup targets are not supported by this server version" +msgstr "ì´ ì„œë²„ëŠ” 백업 íƒ€ì¼“ì„ ì§€ì›í•˜ì§€ 않ìŒ." + +#: pg_basebackup.c:1953 +#, c-format +msgid "recovery configuration cannot be written when a backup target is used" +msgstr "백업 íƒ€ê²Ÿì„ ì‚¬ìš©í•  때는 ì› í™˜ê²½ ì„¤ì •ì„ ê¸°ë¡í•  수 없습니다." + +#: pg_basebackup.c:1980 +#, c-format +msgid "server does not support server-side compression" +msgstr "ì´ ì„œë²„ëŠ” 서버 측 ì••ì¶•ì„ ì§€ì›í•˜ì§€ 않습니다" + +#: pg_basebackup.c:1990 +#, c-format +msgid "initiating base backup, waiting for checkpoint to complete" +msgstr "ë² ì´ìФ ë°±ì—…ì„ ì´ˆê¸°í™” 중, ì²´í¬í¬ì¸íЏ 완료를 기다리는 중" + +#: pg_basebackup.c:1994 +#, c-format +msgid "waiting for checkpoint" +msgstr "ì²´í¬í¬ì¸íŠ¸ê°€ ë나길 기다리는 중" + +#: pg_basebackup.c:2016 +#, c-format +msgid "could not initiate base backup: %s" +msgstr "ë² ì´ìФ ë°±ì—…ì„ ì´ˆê¸°í™” í•  수 ì—†ìŒ: %s" + +#: pg_basebackup.c:2019 +#, c-format +msgid "" +"server returned unexpected response to BASE_BACKUP command; got %d rows and " +"%d fields, expected %d rows and %d fields" +msgstr "" +"서버가 BASE_BACKUP ëª…ë ¹ì— ëŒ€í•´ì„œ ìž˜ëª»ëœ ì‘ë‹µì„ í–ˆìŠµë‹ˆë‹¤; ì‘답값: %d 로우, %d " +"필드, (기대값: %d 로우, %d 필드)" + +#: pg_basebackup.c:2025 +#, c-format +msgid "checkpoint completed" +msgstr "ì²´í¬í¬ì¸íЏ 완료" + +#: pg_basebackup.c:2039 +#, c-format +msgid "write-ahead log start point: %s on timeline %u" +msgstr "트랙잭션 로그 시작 위치: %s, 타임ë¼ì¸: %u" + +#: pg_basebackup.c:2047 +#, c-format +msgid "could not get backup header: %s" +msgstr "백업 í—¤ë”를 구할 수 ì—†ìŒ: %s" + +#: pg_basebackup.c:2050 +#, c-format +msgid "no data returned from server" +msgstr "서버가 아무런 ìžë£Œë„ 주지 않았ìŒ" + +#: pg_basebackup.c:2093 +#, c-format +msgid "can only write single tablespace to stdout, database has %d" +msgstr "" +"표준 출력으로는 í•˜ë‚˜ì˜ í…Œì´ë¸”스페ì´ìŠ¤ë§Œ 쓸 수 있ìŒ, ë°ì´í„°ë² ì´ìŠ¤ëŠ” %d ê°œì˜ í…Œ" +"ì´ë¸” 스페ì´ìŠ¤ê°€ 있ìŒ" + +#: pg_basebackup.c:2106 +#, c-format +msgid "starting background WAL receiver" +msgstr "백그ë¼ìš´ë“œ WAL ìˆ˜ì‹ ìž ì‹œìž‘ 중" + +#: pg_basebackup.c:2189 +#, c-format +msgid "backup failed: %s" +msgstr "백업 실패: %s" + +#: pg_basebackup.c:2192 +#, c-format +msgid "no write-ahead log end position returned from server" +msgstr "서버ì—서 트랜잭션 로그 마지막 위치가 수신 ë˜ì§€ 않았ìŒ" + +#: pg_basebackup.c:2195 +#, c-format +msgid "write-ahead log end point: %s" +msgstr "트랜잭션 로그 마지막 위치: %s" + +#: pg_basebackup.c:2206 +#, c-format +msgid "checksum error occurred" +msgstr "ì²´í¬ì„¬ 오류 ë°œìƒ" + +#: pg_basebackup.c:2211 +#, c-format +msgid "final receive failed: %s" +msgstr "수신 작업 마무리 실패: %s" + +#: pg_basebackup.c:2235 +#, c-format +msgid "waiting for background process to finish streaming ..." +msgstr "스트리ë°ì„ ë내기 위해서 백그ë¼ìš´ë“œ 프로세스를 기다리는 중 ..." + +#: pg_basebackup.c:2239 +#, c-format +msgid "could not send command to background pipe: %m" +msgstr "백그ë¼ìš´ë“œ 파ì´í”„로 ëª…ë ¹ì„ ë³´ë‚¼ 수 ì—†ìŒ: %m" + +#: pg_basebackup.c:2244 +#, c-format +msgid "could not wait for child process: %m" +msgstr "하위 프로세스를 기다릴 수 ì—†ìŒ: %m" + +#: pg_basebackup.c:2246 +#, c-format +msgid "child %d died, expected %d" +msgstr "%d ê°œì˜ í•˜ìœ„ 프로세스가 종료ë¨, 기대값 %d" + +#: pg_basebackup.c:2248 streamutil.c:92 streamutil.c:207 streamutil.c:319 +#, c-format +msgid "%s" +msgstr "%s" + +#: pg_basebackup.c:2268 +#, c-format +msgid "could not wait for child thread: %m" +msgstr "하위 스레드를 기다릴 수 ì—†ìŒ: %m" + +#: pg_basebackup.c:2273 +#, c-format +msgid "could not get child thread exit status: %m" +msgstr "하위 스레드 종료 ìƒíƒœê°€ ì •ìƒì ì´ì§€ 않ìŒ: %m" + +#: pg_basebackup.c:2276 +#, c-format +msgid "child thread exited with error %u" +msgstr "하위 스레드가 ë¹„ì •ìƒ ì¢…ë£Œë¨: 오류 코드 %u" + +#: pg_basebackup.c:2305 +#, c-format +msgid "syncing data to disk ..." +msgstr "ìžë£Œë¥¼ 디스í¬ì— ë™ê¸°í™” 하는 중 ... " + +#: pg_basebackup.c:2330 +#, c-format +msgid "renaming backup_manifest.tmp to backup_manifest" +msgstr "backup_manifest.tmp 파ì¼ì„ backup_manifest로 바꾸는 중" + +#: pg_basebackup.c:2350 +#, c-format +msgid "base backup completed" +msgstr "ë² ì´ìФ 백업 완료" + +#: pg_basebackup.c:2436 +#, c-format +msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" +msgstr "ìž˜ëª»ëœ ì²´í¬í¬ì¸íЏ 옵션값 \"%s\", \"fast\" ë˜ëŠ” \"spread\"ë§Œ 사용 가능" + +#: pg_basebackup.c:2454 +#, c-format +msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" +msgstr "\"%s\" ê°’ì€ ìž˜ëª»ëœ ì¶œë ¥ 형ì‹, \"plain\" ë˜ëŠ” \"tar\" ë§Œ 사용 가능" + +#: pg_basebackup.c:2535 +#, c-format +msgid "" +"invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" +msgstr "" +"\"%s\" ê°’ì€ ìž˜ëª»ëœ wal-method 옵션값, \"fetch\", \"stream\" ë˜ëŠ” \"none\"ë§Œ " +"사용 가능" + +#: pg_basebackup.c:2574 pg_basebackup.c:2586 pg_basebackup.c:2608 +#: pg_basebackup.c:2620 pg_basebackup.c:2626 pg_basebackup.c:2678 +#: pg_basebackup.c:2689 pg_basebackup.c:2699 pg_basebackup.c:2705 +#: pg_basebackup.c:2712 pg_basebackup.c:2724 pg_basebackup.c:2736 +#: pg_basebackup.c:2744 pg_basebackup.c:2757 pg_basebackup.c:2763 +#: pg_basebackup.c:2772 pg_basebackup.c:2784 pg_basebackup.c:2795 +#: pg_basebackup.c:2803 pg_createsubscriber.c:2037 pg_createsubscriber.c:2047 +#: pg_createsubscriber.c:2055 pg_createsubscriber.c:2083 +#: pg_createsubscriber.c:2115 pg_receivewal.c:748 pg_receivewal.c:760 +#: pg_receivewal.c:767 pg_receivewal.c:776 pg_receivewal.c:783 +#: pg_receivewal.c:793 pg_recvlogical.c:853 pg_recvlogical.c:865 +#: pg_recvlogical.c:875 pg_recvlogical.c:882 pg_recvlogical.c:889 +#: pg_recvlogical.c:896 pg_recvlogical.c:903 pg_recvlogical.c:910 +#: pg_recvlogical.c:917 pg_recvlogical.c:924 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." + +#: pg_basebackup.c:2584 pg_createsubscriber.c:2045 pg_receivewal.c:758 +#: pg_recvlogical.c:863 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")" + +#: pg_basebackup.c:2607 +#, c-format +msgid "cannot specify both format and backup target" +msgstr "백업 ì–‘ì‹ê³¼ 백업 íƒ€ê²Ÿì„ í•¨ê»˜ 사용할 수 ì—†ìŒ" + +#: pg_basebackup.c:2619 +#, c-format +msgid "must specify output directory or backup target" +msgstr "출력 디렉터리를 지정하거나, 백업 íƒ€ê²Ÿì„ ì§€ì •í•˜ì„¸ìš”." + +#: pg_basebackup.c:2625 +#, c-format +msgid "cannot specify both output directory and backup target" +msgstr "출력 디렉터리와 백업 íƒ€ê²Ÿì€ í•¨ê»˜ 지정할 수 ì—†ìŒ" + +#: pg_basebackup.c:2655 pg_receivewal.c:802 +#, c-format +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "알 수 없는 ì••ì¶• 알고리즘: \"%s\"" + +#: pg_basebackup.c:2661 pg_receivewal.c:809 +#, c-format +msgid "invalid compression specification: %s" +msgstr "ìž˜ëª»ëœ ì••ì¶• ì •ë³´: %s" + +#: pg_basebackup.c:2677 +#, c-format +msgid "" +"client-side compression is not possible when a backup target is specified" +msgstr "백업 íƒ€ì¼“ì„ ì‚¬ìš©í•  때는 í´ë¼ì´ì–¸íЏ 측 ì••ì¶•ì„ ì‚¬ìš©í•  수 없습니다." + +#: pg_basebackup.c:2688 +#, c-format +msgid "only tar mode backups can be compressed" +msgstr "tar 형ì‹ë§Œ ì••ì¶•ì„ ì‚¬ìš©í•  수 있ìŒ" + +#: pg_basebackup.c:2698 +#, c-format +msgid "WAL cannot be streamed when a backup target is specified" +msgstr "백업 íƒ€ê²Ÿì„ ì§€ì •í•  때는 WAL 스트리ë°ì„ 사용할 수 없습니다." + +#: pg_basebackup.c:2704 +#, c-format +msgid "cannot stream write-ahead logs in tar mode to stdout" +msgstr "tar ë°©ì‹ì—서 stdout으로 트랜잭션 로그 ìŠ¤íŠ¸ë¦¬ë° ë¶ˆê°€" + +#: pg_basebackup.c:2711 +#, c-format +msgid "replication slots can only be used with WAL streaming" +msgstr "복제 ìŠ¬ë¡¯ì€ WAL ìŠ¤íŠ¸ë¦¬ë° ë°©ì‹ì—서만 사용할 수 있ìŒ" + +#: pg_basebackup.c:2723 +#, c-format +msgid "--no-slot cannot be used with slot name" +msgstr "슬롯 ì´ë¦„ì„ ì§€ì •í•œ 경우 --no-slot ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ" + +#. translator: second %s is an option name +#: pg_basebackup.c:2734 pg_receivewal.c:774 +#, c-format +msgid "%s needs a slot to be specified using --slot" +msgstr "%s ì˜µì…˜ì€ --slot ì˜µì…˜ì„ í•¨ê»˜ 사용해야 함" + +#: pg_basebackup.c:2742 pg_basebackup.c:2782 pg_basebackup.c:2793 +#: pg_basebackup.c:2801 +#, c-format +msgid "%s and %s are incompatible options" +msgstr "%s 옵션과 %s ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" + +#: pg_basebackup.c:2756 +#, c-format +msgid "WAL directory location cannot be specified along with a backup target" +msgstr "트랜잭션 로그 디렉터리 위치는 백업 타켓과 함께 지정할 수 ì—†ìŒ" + +#: pg_basebackup.c:2762 +#, c-format +msgid "WAL directory location can only be specified in plain mode" +msgstr "트랜잭션 로그 디렉터리 위치는 plain 모드ì—서만 사용할 수 있ìŒ" + +#: pg_basebackup.c:2771 +#, c-format +msgid "WAL directory location must be an absolute path" +msgstr "트랜잭션 로그 디렉터리 위치는 절대 경로여야 함" + +#: pg_basebackup.c:2871 +#, c-format +msgid "could not create symbolic link \"%s\": %m" +msgstr "\"%s\" 심벌릭 ë§í¬ë¥¼ 만들 수 ì—†ìŒ: %m" + +#: pg_createsubscriber.c:169 +#, c-format +msgid "failed after the end of recovery" +msgstr "복구 ë’¤ 실패" + +#: pg_createsubscriber.c:170 +#, c-format +msgid "" +"The target server cannot be used as a physical replica anymore. You must " +"recreate the physical replica before continuing." +msgstr "" +"ëŒ€ìƒ ì„œë²„ëŠ” ë” ì´ìƒ 물리 복제 대기 서버로 사용할 수 없습니다. 물리 복제 대기 " +"서버가 필요하다면, 다시 만들어야 합니다." + +#: pg_createsubscriber.c:198 +#, c-format +msgid "" +"publication \"%s\" created in database \"%s\" on primary was left behind" +msgstr "ë‹¤ìŒ ë°œí–‰ì´ ë‚¨ì•„ 있ìŒ: 발행 ì´ë¦„=\"%s\", ëŒ€ìƒ ë°ì´í„°ë² ì´ìФ=\"%s\"" + +#: pg_createsubscriber.c:200 +#, c-format +msgid "Drop this publication before trying again." +msgstr "ìž¬ì‹œë„ ì „ì— ì´ ë°œí–‰ì„ ì‚­ì œí•˜ì„¸ìš”." + +#: pg_createsubscriber.c:204 +#, c-format +msgid "" +"replication slot \"%s\" created in database \"%s\" on primary was left behind" +msgstr "" +"ë‹¤ìŒ ë³µì œ ìŠ¬ë¡¯ì´ ë‚¨ì•„ 있ìŒ: 복제 슬롯 ì´ë¦„=\"%s\", ëŒ€ìƒ ë°ì´í„°ë² ì´ìФ=\"%s\"" + +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1260 +#, c-format +msgid "Drop this replication slot soon to avoid retention of WAL files." +msgstr "WAL 파ì¼ì´ 늘어나는 ê²ƒì„ ë§‰ê¸°ìœ„í•´ 해당 복제 ìŠ¬ë¡¯ì„ ì‚­ì œí•˜ì„¸ìš”." + +#: pg_createsubscriber.c:219 +#, c-format +msgid "" +"%s creates a new logical replica from a standby server.\n" +"\n" +msgstr "" +"%s í”„ë¡œê·¸ëž¨ì€ ë¬¼ë¦¬ 복제 대기 서버를 새로운 논리 복제 서버로 만듭니다.\n" +"\n" + +#: pg_createsubscriber.c:223 pg_receivewal.c:81 pg_recvlogical.c:92 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"옵션들:\n" + +#: pg_createsubscriber.c:224 +#, c-format +msgid "" +" -d, --database=DBNAME database in which to create a " +"subscription\n" +msgstr " -d, --database=DBNAME 구ë…ì„ ë§Œë“¤ ë°ì´í„°ë² ì´ìФ 지정\n" + +#: pg_createsubscriber.c:225 +#, c-format +msgid "" +" -D, --pgdata=DATADIR location for the subscriber data " +"directory\n" +msgstr " -D, --pgdata=DATADIR 구ë…ìš© ì¸ìŠ¤í„´ìŠ¤ ë°ì´í„° 디렉터리\n" + +#: pg_createsubscriber.c:226 +#, c-format +msgid "" +" -n, --dry-run dry run, just show what would be done\n" +msgstr "" +" -n, --dry-run ì‹¤ìž‘ì—…ì€ ì•ˆí•˜ê³ , ë­˜ í•  것ì¸ì§€ë§Œ 보여줌\n" + +#: pg_createsubscriber.c:227 +#, c-format +msgid " -p, --subscriber-port=PORT subscriber port number (default %s)\n" +msgstr "" +" -p, --subscriber-port=PORT 구ë…ìš© ì¸ìŠ¤í„´ìŠ¤ í¬íЏ 번호 (초기값 %s)\n" + +#: pg_createsubscriber.c:228 +#, c-format +msgid " -P, --publisher-server=CONNSTR publisher connection string\n" +msgstr " -P, --publisher-server=CONNSTR 구ë…ìš© ì¸ìŠ¤í„´ìŠ¤ ì—°ê²° 문ìžì—´\n" + +#: pg_createsubscriber.c:229 +#, c-format +msgid "" +" -s, --socketdir=DIR socket directory to use (default current " +"dir.)\n" +msgstr "" +" -s, --socketdir=DIR 사용할 소켓 디렉터리 (초기값 current " +"dir.)\n" + +#: pg_createsubscriber.c:230 +#, c-format +msgid " -t, --recovery-timeout=SECS seconds to wait for recovery to end\n" +msgstr " -t, --recovery-timeout=SECS 복구가 ëë‚  때까지 기다리는 ì´ˆ\n" + +#: pg_createsubscriber.c:231 +#, c-format +msgid " -U, --subscriber-username=NAME user name for subscriber connection\n" +msgstr " -U, --subscriber-username=NAME 구ë…ìš© ì¸ìŠ¤í„´ìŠ¤ ì—°ê²°ì„ ìœ„í•œ 사용ìž\n" + +#: pg_createsubscriber.c:232 +#, c-format +msgid " -v, --verbose output verbose messages\n" +msgstr " -v, --verbose ìžì„¸í•œ 작업 메시지 보여줌\n" + +#: pg_createsubscriber.c:233 +#, c-format +msgid "" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr "" +" --config-file=FILENAME ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ê°€ ì‹¤í–‰ë  ë•Œ 사용할\n" +" 주 서버용 환경 설정 파ì¼\n" + +#: pg_createsubscriber.c:235 +#, c-format +msgid " --publication=NAME publication name\n" +msgstr " --publication=NAME 발행 ì´ë¦„\n" + +#: pg_createsubscriber.c:236 +#, c-format +msgid " --replication-slot=NAME replication slot name\n" +msgstr " --replication-slot=NAME 복제 슬롯 ì´ë¦„\n" + +#: pg_createsubscriber.c:237 +#, c-format +msgid " --subscription=NAME subscription name\n" +msgstr " --subscription=NAME êµ¬ë… ì´ë¦„\n" + +#: pg_createsubscriber.c:238 +#, c-format +msgid "" +" -V, --version output version information, then exit\n" +msgstr " -V, --version 버전 ì •ë³´ 보여주고 마침\n" + +#: pg_createsubscriber.c:239 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" + +#: pg_createsubscriber.c:282 +#, c-format +msgid "could not parse connection string: %s" +msgstr "ì—°ê²° 문ìžì—´ êµ¬ë¬¸ì´ ìž˜ëª»ë¨: %s" + +#: pg_createsubscriber.c:359 +#, c-format +msgid "" +"program \"%s\" is needed by %s but was not found in the same directory as " +"\"%s\"" +msgstr "\"%s\" í”„ë¡œê·¸ëž¨ì´ %sì—서 필요하지만, \"%s\" 디렉터리 ì•ˆì— ì—†ìŒ" + +#: pg_createsubscriber.c:362 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "\"%s\" í”„ë¡œê·¸ëž¨ì´ \"%s\" 프로그램ì—서 사용하는 %s 버전과 같지 않ìŒ" + +#: pg_createsubscriber.c:382 +#, c-format +msgid "checking if directory \"%s\" is a cluster data directory" +msgstr "\"%s\" 디렉터리가 í´ëŸ¬ìŠ¤í„° ë°ì´í„° 디렉터리ì¸ì§€ 확ì¸í•´ë³´ì„¸ìš”." + +#: pg_createsubscriber.c:388 +#, c-format +msgid "data directory \"%s\" does not exist" +msgstr "\"%s\" ë°ì´í„° 디렉터리가 ì—†ìŒ" + +#: pg_createsubscriber.c:396 +#, c-format +msgid "directory \"%s\" is not a database cluster directory" +msgstr "\"%s\" 디렉터리는 ë°ì´ë² ì´ìФ í´ëŸ¬ìŠ¤í„° 디렉터리가 아님" + +#: pg_createsubscriber.c:513 +#, c-format +msgid "connection to database failed: %s" +msgstr "ë°ì´í„°ë² ì´ìФ ì—°ê²° 실패: %s" + +#: pg_createsubscriber.c:526 +#, c-format +msgid "could not clear search_path: %s" +msgstr "search_path를 지울 수 ì—†ìŒ: %s" + +#: pg_createsubscriber.c:566 +#, c-format +msgid "getting system identifier from publisher" +msgstr "발행ì—서 system identifier 가져오는 중" + +#: pg_createsubscriber.c:573 +#, c-format +msgid "could not get system identifier: %s" +msgstr "system identifier 가져오기 실패: %s" + +#: pg_createsubscriber.c:579 +#, c-format +msgid "could not get system identifier: got %d rows, expected %d row" +msgstr "system identifier 가져오기 실패: ì·¨ë“=%dê°œ 로우, 예ìƒ=%dê°œ 로우" + +#: pg_createsubscriber.c:586 +#, c-format +msgid "system identifier is %llu on publisher" +msgstr "발행 ì„œë²„ì˜ system identifier: %llu" + +#: pg_createsubscriber.c:607 +#, c-format +msgid "getting system identifier from subscriber" +msgstr "구ë…ì—서 system identifier 가져오는 중" + +#: pg_createsubscriber.c:611 pg_createsubscriber.c:641 +#, c-format +msgid "control file appears to be corrupt" +msgstr "컨트롤 íŒŒì¼ ê¹¨ì§" + +#: pg_createsubscriber.c:615 pg_createsubscriber.c:656 +#, c-format +msgid "system identifier is %llu on subscriber" +msgstr "êµ¬ë… ì„œë²„ì˜ system identifier: %llu" + +#: pg_createsubscriber.c:637 +#, c-format +msgid "modifying system identifier of subscriber" +msgstr "êµ¬ë… ì„œë²„ì˜ system identifier 바꾸는 중" + +#: pg_createsubscriber.c:659 +#, c-format +msgid "running pg_resetwal on the subscriber" +msgstr "êµ¬ë… ì„œë²„ì—서 pg_resetwal 실행 중" + +#: pg_createsubscriber.c:671 +#, c-format +msgid "subscriber successfully changed the system identifier" +msgstr "êµ¬ë… ì„œë²„ì˜ system identifier 바꾸기 ë" + +#: pg_createsubscriber.c:673 +#, c-format +msgid "could not change system identifier of subscriber: %s" +msgstr "êµ¬ë… ì„œë²„ì˜ system identifier 바꾸기 실패: %s" + +#: pg_createsubscriber.c:697 +#, c-format +msgid "could not obtain database OID: %s" +msgstr "ë² ì´ìŠ¤ë² ì´ìФ OID í™•ì¸ ë¶ˆê°€: %s" + +#: pg_createsubscriber.c:704 #, c-format -msgid "could not read from ready pipe: %m" -msgstr "ì¤€ë¹„ëœ íŒŒì´í”„로부터 ì½ê¸° 실패: %m" +msgid "could not obtain database OID: got %d rows, expected %d row" +msgstr "ë² ì´ìŠ¤ë² ì´ìФ OID í™•ì¸ ë¶ˆê°€: %dê°œ 로우 발견, %dê°œ 로우 예ìƒ" -#: pg_basebackup.c:477 pg_basebackup.c:608 pg_basebackup.c:2133 -#: streamutil.c:450 +#: pg_createsubscriber.c:776 #, c-format -msgid "could not parse write-ahead log location \"%s\"" -msgstr "트랜잭션 로그 위치 \"%s\" ë¶„ì„ ì‹¤íŒ¨" +msgid "create replication slot \"%s\" on publisher" +msgstr "발행 서버ì—서 \"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ ë§Œë“¦" -#: pg_basebackup.c:573 pg_receivewal.c:441 +#: pg_createsubscriber.c:796 #, c-format -msgid "could not finish writing WAL files: %m" -msgstr "WAL íŒŒì¼ ì“°ê¸° 마무리 실패: %m" +msgid "could not write an additional WAL record: %s" +msgstr "추가 WAL 레코드를 쓸 수 ì—†ìŒ: %s" -#: pg_basebackup.c:620 +#: pg_createsubscriber.c:822 #, c-format -msgid "could not create pipe for background process: %m" -msgstr "백그ë¼ìš´ë“œ 프로세스를 위한 파ì´í”„ 만들기 실패: %m" +msgid "could not obtain recovery progress: %s" +msgstr "복구 작업 과정 í™•ì¸ ë¶ˆê°€: %s" -#: pg_basebackup.c:655 +#: pg_createsubscriber.c:854 #, c-format -msgid "created temporary replication slot \"%s\"" -msgstr "\"%s\" 임시 복제 ìŠ¬ë¡¯ì„ ë§Œë“¤ 수 ì—†ìŒ" +msgid "checking settings on publisher" +msgstr "발행 서버 설정 검사 중" -#: pg_basebackup.c:658 +#: pg_createsubscriber.c:864 #, c-format -msgid "created replication slot \"%s\"" -msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ ë§Œë“¦" +msgid "primary server cannot be in recovery" +msgstr "주 서버는 복구 ìž‘ì—…ì„ í•  수 ì—†ìŒ" -#: pg_basebackup.c:678 pg_basebackup.c:731 pg_basebackup.c:1620 +#: pg_createsubscriber.c:888 #, c-format -msgid "could not create directory \"%s\": %m" -msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m" +msgid "could not obtain publisher settings: %s" +msgstr "발행 서버 설정 í™•ì¸ ë¶ˆê°€: %s" -#: pg_basebackup.c:696 +#: pg_createsubscriber.c:914 #, c-format -msgid "could not create background process: %m" -msgstr "백그ë¼ìš´ë“œ 프로세스 만들기 실패: %m" +msgid "publisher requires wal_level >= \"logical\"" +msgstr "발행 ì„œë²„ì˜ wal_level >= \"logical\" 설정 í•„ìš”" -#: pg_basebackup.c:708 +#: pg_createsubscriber.c:920 #, c-format -msgid "could not create background thread: %m" -msgstr "백그ë¼ìš´ë“œ 스래드 만들기 실패: %m" +msgid "publisher requires %d replication slots, but only %d remain" +msgstr "발행서버는 %dê°œì˜ ë³µì œ ìŠ¬ë¡¯ì´ í•„ìš”í•˜ì§€ë§Œ, %d개만 남았ìŒ" -#: pg_basebackup.c:752 +#: pg_createsubscriber.c:922 pg_createsubscriber.c:931 +#: pg_createsubscriber.c:1028 pg_createsubscriber.c:1037 +#: pg_createsubscriber.c:1046 #, c-format -msgid "directory \"%s\" exists but is not empty" -msgstr "\"%s\" 디렉터리가 있지만 비어 있지 않ìŒ" +msgid "Increase the configuration parameter \"%s\" to at least %d." +msgstr "\"%s\" 환경설정 매개변수 ê°’ì„ %d ì´ìƒìœ¼ë¡œ 늘려주세요." -#: pg_basebackup.c:759 +#: pg_createsubscriber.c:929 #, c-format -msgid "could not access directory \"%s\": %m" -msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m" +msgid "publisher requires %d WAL sender processes, but only %d remain" +msgstr "발행서버는 %dê°œì˜ WAL 발송 프로세스가 필요하지만, %d개만 남았ìŒ" -#: pg_basebackup.c:824 +#: pg_createsubscriber.c:938 #, c-format -msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" -msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" -msgstr[0] "%*s/%s kB (100%%), %d/%d í…Œì´ë¸”스페ì´ìФ %*s" +msgid "two_phase option will not be enabled for replication slots" +msgstr "two_phase ì˜µì…˜ì€ ë³µì œ ìŠ¬ë¡¯ì„ ìœ„í•´ 비활성화 ë  ì˜ˆì •" -#: pg_basebackup.c:836 +#: pg_createsubscriber.c:939 #, c-format -msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" -msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" -msgstr[0] "%*s/%s kB (%d%%), %d/%d í…Œì´ë¸”스페ì´ìФ (%s%-*.*s)" +msgid "" +"Subscriptions will be created with the two_phase option disabled. Prepared " +"transactions will be replicated at COMMIT PREPARED." +msgstr "" +"구ë…ì€ two_phase ì˜µì…˜ì´ ë¹„í™œì„± ë˜ì–´ 만들어집니다. 미리 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì€ " +"COMMIT PREPARED 때 ë³µì œë  ê²ƒìž…ë‹ˆë‹¤." -#: pg_basebackup.c:852 +#: pg_createsubscriber.c:971 #, c-format -msgid "%*s/%s kB (%d%%), %d/%d tablespace" -msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" -msgstr[0] "%*s/%s kB (%d%%), %d/%d í…Œì´ë¸”스페ì´ìФ" +msgid "checking settings on subscriber" +msgstr "êµ¬ë… ì„œë²„ 설정 검사 중" -#: pg_basebackup.c:877 +#: pg_createsubscriber.c:978 #, c-format -msgid "transfer rate \"%s\" is not a valid value" -msgstr "\"%s\" 전송 ì†ë„는 ìž˜ëª»ëœ ê°’ìž„" +msgid "target server must be a standby" +msgstr "ëŒ€ìƒ ì„œë²„ëŠ” 대기 서버여야 함" -#: pg_basebackup.c:882 +#: pg_createsubscriber.c:1002 #, c-format -msgid "invalid transfer rate \"%s\": %m" -msgstr "ìž˜ëª»ëœ ì „ì†¡ ì†ë„ \"%s\": %m" +msgid "could not obtain subscriber settings: %s" +msgstr "êµ¬ë… ì„œë²„ 설정 í™•ì¸ ë¶ˆê°€: %s" -#: pg_basebackup.c:891 +#: pg_createsubscriber.c:1026 #, c-format -msgid "transfer rate must be greater than zero" -msgstr "전송 ì†ë„는 0보다 커야 함" +msgid "subscriber requires %d replication slots, but only %d remain" +msgstr "êµ¬ë… ì„œë²„ëŠ” %dê°œì˜ ë³µì œ ìŠ¬ë¡¯ì´ í•„ìš”í•˜ì§€ë§Œ, %d개만 남았ìŒ" -#: pg_basebackup.c:923 +#: pg_createsubscriber.c:1035 #, c-format -msgid "invalid --max-rate unit: \"%s\"" -msgstr "ìž˜ëª»ëœ --max-rate 단위: \"%s\"" +msgid "subscriber requires %d logical replication workers, but only %d remain" +msgstr "êµ¬ë… ì„œë²„ëŠ” %dê°œì˜ ë…¼ë¦¬ 복제 작업ìžê°€ 필요하지만, %d개만 남았ìŒ" -#: pg_basebackup.c:930 +#: pg_createsubscriber.c:1044 #, c-format -msgid "transfer rate \"%s\" exceeds integer range" -msgstr "\"%s\" 전송 ì†ë„는 정수형 범위가 아님" +msgid "subscriber requires %d worker processes, but only %d remain" +msgstr "êµ¬ë… ì„œë²„ëŠ” %dê°œì˜ ìž‘ì—…ìžê°€ 필요하지만, %d개만 남았ìŒ" -#: pg_basebackup.c:940 +#: pg_createsubscriber.c:1079 #, c-format -msgid "transfer rate \"%s\" is out of range" -msgstr "\"%s\" 전송 ì†ë„는 범위 초과" +msgid "dropping subscription \"%s\" in database \"%s\"" +msgstr "\"%s\" ì´ë¦„ì˜ êµ¬ë…ì„ \"%s\" ë°ì´í„°ë² ì´ìФì—서 ì‚­ì œ 중" -#: pg_basebackup.c:961 +#: pg_createsubscriber.c:1088 #, c-format -msgid "could not get COPY data stream: %s" -msgstr "COPY ë°ì´í„° ìŠ¤íŠ¸ë¦¼ì„ ì‚¬ìš©í•  수 ì—†ìŒ: %s" +msgid "could not drop subscription \"%s\": %s" +msgstr "\"%s\" êµ¬ë… ì‚­ì œ 실패: %s" -#: pg_basebackup.c:981 pg_recvlogical.c:435 pg_recvlogical.c:607 -#: receivelog.c:965 +#: pg_createsubscriber.c:1123 #, c-format -msgid "could not read COPY data: %s" -msgstr "COPY ìžë£Œë¥¼ ì½ì„ 수 ì—†ìŒ: %s" +msgid "could not obtain pre-existing subscriptions: %s" +msgstr "ì´ë¯¸ 있는 êµ¬ë… ì •ë³´ë¥¼ 알 수 ì—†ìŒ: %s" -#: pg_basebackup.c:1007 +#: pg_createsubscriber.c:1258 #, c-format -msgid "could not write to compressed file \"%s\": %s" -msgstr "\"%s\" ì••ì¶• íŒŒì¼ ì“°ê¸° 실패: %s" +msgid "could not drop replication slot \"%s\" on primary" +msgstr "주 ì„œë²„ì˜ \"%s\" 복제 ìŠ¬ë¡¯ì„ ì‚­ì œ 수 ì—†ìŒ" -#: pg_basebackup.c:1071 +#: pg_createsubscriber.c:1292 #, c-format -msgid "could not duplicate stdout: %m" -msgstr "stdoutì„ ì¤‘ë³µí•  수 ì—†ìŒ: %m" +msgid "could not obtain failover replication slot information: %s" +msgstr "failover 복제 슬롯 정보를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" -#: pg_basebackup.c:1078 +#: pg_createsubscriber.c:1294 pg_createsubscriber.c:1303 #, c-format -msgid "could not open output file: %m" -msgstr "출력파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" +msgid "" +"Drop the failover replication slots on subscriber soon to avoid retention of " +"WAL files." +msgstr "" +"WAL 파ì¼ì´ 비정ìƒì ìœ¼ë¡œ ì¦ê°€ëŠ” 문제를 막기 위해, êµ¬ë… ì„œë²„ì—서 failover 복제 " +"ìŠ¬ë¡¯ì„ ë°”ë¡œ 지우세요." -#: pg_basebackup.c:1085 pg_basebackup.c:1106 pg_basebackup.c:1135 +#: pg_createsubscriber.c:1302 #, c-format -msgid "could not set compression level %d: %s" -msgstr "ìž˜ëª»ëœ ì••ì¶• 수위 %d: %s" +msgid "could not drop failover replication slot" +msgstr "failover 복제 ìŠ¬ë¡¯ì„ ì‚­ì œí•  수 ì—†ìŒ" -#: pg_basebackup.c:1155 +#: pg_createsubscriber.c:1324 #, c-format -msgid "could not create compressed file \"%s\": %s" -msgstr "\"%s\" ì••ì¶• íŒŒì¼ ë§Œë“¤ê¸° 실패: %s" +msgid "creating the replication slot \"%s\" in database \"%s\"" +msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ \"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— ë§Œë“œëŠ” 중" -#: pg_basebackup.c:1267 +#: pg_createsubscriber.c:1342 #, c-format -msgid "could not close compressed file \"%s\": %s" -msgstr "\"%s\" ì••ì¶• íŒŒì¼ ë‹«ê¸° 실패: %s" +msgid "could not create replication slot \"%s\" in database \"%s\": %s" +msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ \"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— ë§Œë“¤ê¸° 실패: %s" -#: pg_basebackup.c:1279 pg_recvlogical.c:632 +#: pg_createsubscriber.c:1372 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" +msgid "dropping the replication slot \"%s\" in database \"%s\"" +msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ \"%s\" ë°ì´í„°ë² ì´ìФì—서 ì‚­ì œ 중" -#: pg_basebackup.c:1541 +#: pg_createsubscriber.c:1388 #, c-format -msgid "COPY stream ended before last file was finished" -msgstr "마지막 파ì¼ì„ ë내기 ì „ì— COPY ìŠ¤íŠ¸ë¦¼ì´ ë났ìŒ" +msgid "could not drop replication slot \"%s\" in database \"%s\": %s" +msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ \"%s\" ë°ì´í„°ë² ì´ìФì—서 ì‚­ì œ 실패: %s" -#: pg_basebackup.c:1570 +#: pg_createsubscriber.c:1409 #, c-format -msgid "invalid tar block header size: %zu" -msgstr "ìž˜ëª»ëœ tar 블럭 í—¤ë” í¬ê¸°: %zu" +msgid "pg_ctl failed with exit code %d" +msgstr "pg_ctl 작업 실패: 오류 코드 %d" -#: pg_basebackup.c:1627 +#: pg_createsubscriber.c:1414 #, c-format -msgid "could not set permissions on directory \"%s\": %m" -msgstr "\"%s\" 디렉터리 액세스 ê¶Œí•œì„ ì§€ì •í•  수 ì—†ìŒ: %m" +msgid "pg_ctl was terminated by exception 0x%X" +msgstr "pg_ctl 종료ë¨: 예외 처리 0x%X" -#: pg_basebackup.c:1651 +#: pg_createsubscriber.c:1416 #, c-format -msgid "could not create symbolic link from \"%s\" to \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ \"%s\" 심볼릭 ë§í¬ë¡œ 만들 수 ì—†ìŒ: %m" +msgid "" +"See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "윗 16진수 ê°’ì€ \"ntstatus.h\" 파ì¼ì„ 참조하세요." -#: pg_basebackup.c:1658 +#: pg_createsubscriber.c:1418 #, c-format -msgid "unrecognized link indicator \"%c\"" -msgstr "알 수 없는 ë§í¬ ì§€ì‹œìž \"%c\"" +msgid "pg_ctl was terminated by signal %d: %s" +msgstr "pg_ctl 종료ë¨: 수신 시그ë„=%d: %s" -#: pg_basebackup.c:1677 +#: pg_createsubscriber.c:1424 #, c-format -msgid "could not set permissions on file \"%s\": %m" -msgstr "íŒŒì¼ \"%s\" ì˜ ì ‘ê·¼ê¶Œí•œì„ ì§€ì •í•  수 ì—†ìŒ: %m" +msgid "pg_ctl exited with unrecognized status %d" +msgstr "pg_ctl 종료ë¨: 알 수 ì—†ì€ ìƒíƒœ %d" -#: pg_basebackup.c:1831 +#: pg_createsubscriber.c:1427 #, c-format -msgid "incompatible server version %s" -msgstr "호환하지 않는 서버 버전 %s" +msgid "The failed command was: %s" +msgstr "실패한 명령: %s" -#: pg_basebackup.c:1846 +#: pg_createsubscriber.c:1473 #, c-format -msgid "HINT: use -X none or -X fetch to disable log streaming" -msgstr "" -"힌트: 트랜잭션 로그 스트리ë°ì„ 사용하지 않으려면 -X none ë˜ëŠ” -X fetch 옵션" -"ì„ ì‚¬ìš©í•˜ì„¸ìš”." +msgid "server was started" +msgstr "서버 시작ë¨" -#: pg_basebackup.c:1882 +#: pg_createsubscriber.c:1488 #, c-format -msgid "initiating base backup, waiting for checkpoint to complete" -msgstr "ë² ì´ìФ ë°±ì—…ì„ ì´ˆê¸°í™” 중, ì²´í¬í¬ì¸íЏ 완료를 기다리는 중" +msgid "server was stopped" +msgstr "서버 멈춤" -#: pg_basebackup.c:1908 pg_recvlogical.c:262 receivelog.c:481 receivelog.c:530 -#: receivelog.c:569 streamutil.c:297 streamutil.c:370 streamutil.c:422 -#: streamutil.c:533 streamutil.c:578 +#: pg_createsubscriber.c:1507 #, c-format -msgid "could not send replication command \"%s\": %s" -msgstr "\"%s\" 복제 ëª…ë ¹ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s" +msgid "waiting for the target server to reach the consistent state" +msgstr "ì¼ê´€ì„± 맞추기 위해 ëŒ€ìƒ ì„œë²„ 기다리는 중" -#: pg_basebackup.c:1919 +#: pg_createsubscriber.c:1530 #, c-format -msgid "could not initiate base backup: %s" -msgstr "ë² ì´ìФ ë°±ì—…ì„ ì´ˆê¸°í™” í•  수 ì—†ìŒ: %s" +msgid "recovery timed out" +msgstr "복구 시간 초과" -#: pg_basebackup.c:1925 +#: pg_createsubscriber.c:1543 #, c-format -msgid "" -"server returned unexpected response to BASE_BACKUP command; got %d rows and " -"%d fields, expected %d rows and %d fields" -msgstr "" -"서버가 BASE_BACKUP ëª…ë ¹ì— ëŒ€í•´ì„œ ìž˜ëª»ëœ ì‘ë‹µì„ í–ˆìŠµë‹ˆë‹¤; ì‘답값: %d 로우, %d " -"필드, (기대값: %d 로우, %d 필드)" +msgid "server did not end recovery" +msgstr "서버 복구 실패" -#: pg_basebackup.c:1933 +#: pg_createsubscriber.c:1545 #, c-format -msgid "checkpoint completed" -msgstr "ì²´í¬í¬ì¸íЏ 완료" +msgid "target server reached the consistent state" +msgstr "ëŒ€ìƒ ì„œë²„ ì¼ê´€ì„± 맞추기 완료" -#: pg_basebackup.c:1948 +#: pg_createsubscriber.c:1546 #, c-format -msgid "write-ahead log start point: %s on timeline %u" -msgstr "트랙잭션 로그 시작 위치: %s, 타임ë¼ì¸: %u" +msgid "" +"If pg_createsubscriber fails after this point, you must recreate the " +"physical replica before continuing." +msgstr "" +"ì´ ì‹œì ì—서 pg_createsubscriber ìž‘ì—…ì„ ì‹¤íŒ¨í•˜ë©´, 물리 복제 대기 서버는 다시 " +"만들어야 합니다." -#: pg_basebackup.c:1957 +#: pg_createsubscriber.c:1573 #, c-format -msgid "could not get backup header: %s" -msgstr "백업 í—¤ë”를 구할 수 ì—†ìŒ: %s" +msgid "could not obtain publication information: %s" +msgstr "발행 정보를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" -#: pg_basebackup.c:1963 +#: pg_createsubscriber.c:1587 #, c-format -msgid "no data returned from server" -msgstr "서버가 아무런 ìžë£Œë„ 주지 않았ìŒ" +msgid "publication \"%s\" already exists" +msgstr "\"%s\" ì´ë¦„ì˜ ë°œí–‰ì´ ì´ë¯¸ 있ìŒ" -#: pg_basebackup.c:1995 +#: pg_createsubscriber.c:1588 #, c-format -msgid "can only write single tablespace to stdout, database has %d" -msgstr "" -"표준 출력으로는 í•˜ë‚˜ì˜ í…Œì´ë¸”스페ì´ìŠ¤ë§Œ 쓸 수 있ìŒ, ë°ì´í„°ë² ì´ìŠ¤ëŠ” %d ê°œì˜ í…Œ" -"ì´ë¸” 스페ì´ìŠ¤ê°€ 있ìŒ" +msgid "Consider renaming this publication before continuing." +msgstr "ê³„ì† ì§„í–‰ì„ ìœ„í•´ì„œëŠ” ì´ ë°œí–‰ ì´ë¦„ì„ ë°”ê¿”ë³´ì„¸ìš”." -#: pg_basebackup.c:2007 +#: pg_createsubscriber.c:1595 #, c-format -msgid "starting background WAL receiver" -msgstr "백그ë¼ìš´ë“œ WAL ìˆ˜ì‹ ìž ì‹œìž‘ 중" +msgid "creating publication \"%s\" in database \"%s\"" +msgstr "\"%s\" ì´ë¦„ì˜ ë°œí–‰ì„ \"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— ë§Œë“œëŠ” 중" -#: pg_basebackup.c:2046 +#: pg_createsubscriber.c:1608 #, c-format -msgid "could not get write-ahead log end position from server: %s" -msgstr "서버ì—서 트랜잭션 로그 마지막 위치를 구할 수 ì—†ìŒ: %s" +msgid "could not create publication \"%s\" in database \"%s\": %s" +msgstr "\"%s\" ì´ë¦„ì˜ ë°œí–‰ì„ \"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— ë§Œë“¤ 수 ì—†ìŒ: %s" -#: pg_basebackup.c:2052 +#: pg_createsubscriber.c:1637 #, c-format -msgid "no write-ahead log end position returned from server" -msgstr "서버ì—서 트랜잭션 로그 마지막 위치가 수신 ë˜ì§€ 않았ìŒ" +msgid "dropping publication \"%s\" in database \"%s\"" +msgstr "\"%s\" ì´ë¦„ì˜ ë°œí–‰ì„ \"%s\" ë°ì´í„°ë² ì´ìФì—서 ì‚­ì œ 중" -#: pg_basebackup.c:2057 +#: pg_createsubscriber.c:1651 #, c-format -msgid "write-ahead log end point: %s" -msgstr "트랜잭션 로그 마지막 위치: %s" +msgid "could not drop publication \"%s\" in database \"%s\": %s" +msgstr "\"%s\" ì´ë¦„ì˜ ë°œí–‰ì„ \"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— ì§€ìš¸ 수 ì—†ìŒ: %s" -#: pg_basebackup.c:2068 +#: pg_createsubscriber.c:1697 #, c-format -msgid "checksum error occurred" -msgstr "ì²´í¬ì„¬ 오류 ë°œìƒ" +msgid "creating subscription \"%s\" in database \"%s\"" +msgstr "\"%s\" ì´ë¦„ì˜ êµ¬ë…ì„ \"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— ë§Œë“œëŠ” 중" -#: pg_basebackup.c:2073 +#: pg_createsubscriber.c:1718 #, c-format -msgid "final receive failed: %s" -msgstr "수신 작업 마무리 실패: %s" +msgid "could not create subscription \"%s\" in database \"%s\": %s" +msgstr "\"%s\" ì´ë¦„ì˜ êµ¬ë…ì„ \"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— ë§Œë“¤ 수 ì—†ìŒ: %s" -#: pg_basebackup.c:2097 +#: pg_createsubscriber.c:1763 #, c-format -msgid "waiting for background process to finish streaming ..." -msgstr "스트리ë°ì„ ë내기 위해서 백그ë¼ìš´ë“œ 프로세스를 기다리는 중 ..." +msgid "could not obtain subscription OID: %s" +msgstr "êµ¬ë… OID 찾지 못함: %s" -#: pg_basebackup.c:2102 +#: pg_createsubscriber.c:1770 #, c-format -msgid "could not send command to background pipe: %m" -msgstr "백그ë¼ìš´ë“œ 파ì´í”„로 ëª…ë ¹ì„ ë³´ë‚¼ 수 ì—†ìŒ: %m" +msgid "could not obtain subscription OID: got %d rows, expected %d row" +msgstr "êµ¬ë… OID í™•ì¸ ë¶ˆê°€: %dê°œ 로우 발견, %dê°œ 로우 예ìƒ" -#: pg_basebackup.c:2110 +#: pg_createsubscriber.c:1794 #, c-format -msgid "could not wait for child process: %m" -msgstr "하위 프로세스를 기다릴 수 ì—†ìŒ: %m" +msgid "" +"setting the replication progress (node name \"%s\", LSN %s) in database " +"\"%s\"" +msgstr "복제 설정 중(노드ì´ë¦„ \"%s\", LSN %s, ë°ì´í„°ë² ì´ìФ \"%s\")" -#: pg_basebackup.c:2115 +#: pg_createsubscriber.c:1809 #, c-format -msgid "child %d died, expected %d" -msgstr "%d ê°œì˜ í•˜ìœ„ 프로세스가 종료ë¨, 기대값 %d" +msgid "could not set replication progress for subscription \"%s\": %s" +msgstr "\"%s\" 구ë…ì„ ìœ„í•œ 복제 설정 실패: %s" -#: pg_basebackup.c:2120 streamutil.c:92 +#: pg_createsubscriber.c:1840 #, c-format -msgid "%s" -msgstr "%s" +msgid "enabling subscription \"%s\" in database \"%s\"" +msgstr "\"%s\" 구ë…ì„ \"%s\" ë°ì´í„°ë² ì´ìФì—서 활성화 ì‹œë„ ì¤‘" -#: pg_basebackup.c:2145 +#: pg_createsubscriber.c:1852 #, c-format -msgid "could not wait for child thread: %m" -msgstr "하위 스레드를 기다릴 수 ì—†ìŒ: %m" +msgid "could not enable subscription \"%s\": %s" +msgstr "\"%s\" 구ë…ì„ í™œì„±í™” í•  수 ì—†ìŒ: %s" -#: pg_basebackup.c:2151 +#: pg_createsubscriber.c:1944 #, c-format -msgid "could not get child thread exit status: %m" -msgstr "하위 스레드 종료 ìƒíƒœê°€ ì •ìƒì ì´ì§€ 않ìŒ: %m" +msgid "cannot be executed by \"root\"" +msgstr "\"root\" 권한으로 실행할 수 ì—†ìŒ" -#: pg_basebackup.c:2156 +#: pg_createsubscriber.c:1945 #, c-format -msgid "child thread exited with error %u" -msgstr "하위 스레드가 ë¹„ì •ìƒ ì¢…ë£Œë¨: 오류 코드 %u" +msgid "You must run %s as the PostgreSQL superuser." +msgstr "PostgreSQL 슈í¼ìœ ì € 계정으로 %s í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•˜ì„¸ìš”." -#: pg_basebackup.c:2184 +#: pg_createsubscriber.c:1966 #, c-format -msgid "syncing data to disk ..." -msgstr "ìžë£Œë¥¼ 디스í¬ì— ë™ê¸°í™” 하는 중 ... " +msgid "database \"%s\" specified more than once" +msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ê°€ 중복 지정 ë˜ì—ˆìŒ" -#: pg_basebackup.c:2209 +#: pg_createsubscriber.c:2007 #, c-format -msgid "renaming backup_manifest.tmp to backup_manifest" -msgstr "backup_manifest.tmp 파ì¼ì„ backup_manifest로 바꾸는 중" +msgid "publication \"%s\" specified more than once" +msgstr "\"%s\" ë°œí–‰ì´ ì¤‘ë³µ 지정 ë˜ì—ˆìŒ" -#: pg_basebackup.c:2220 +#: pg_createsubscriber.c:2019 #, c-format -msgid "base backup completed" -msgstr "ë² ì´ìФ 백업 완료" +msgid "replication slot \"%s\" specified more than once" +msgstr "\"%s\" 복제 ìŠ¬ë¡¯ì´ ì¤‘ë³µ 지정 ë˜ì—ˆìŒ" -#: pg_basebackup.c:2305 +#: pg_createsubscriber.c:2031 #, c-format -msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" -msgstr "\"%s\" ê°’ì€ ìž˜ëª»ëœ ì¶œë ¥ 형ì‹, \"plain\" ë˜ëŠ” \"tar\" ë§Œ 사용 가능" +msgid "subscription \"%s\" specified more than once" +msgstr "\"%s\" 구ë…ì´ ì¤‘ë³µ 지정 ë˜ì—ˆìŒ" -#: pg_basebackup.c:2349 +#: pg_createsubscriber.c:2054 #, c-format -msgid "" -"invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" -msgstr "" -"\"%s\" ê°’ì€ ìž˜ëª»ëœ wal-method 옵션값, \"fetch\", \"stream\" ë˜ëŠ” \"none\"ë§Œ " -"사용 가능" +msgid "no subscriber data directory specified" +msgstr "êµ¬ë… ì„œë²„ìš© ë°ì´í„° 디렉터리를 지정하지 않았ìŒ" -#: pg_basebackup.c:2377 pg_receivewal.c:580 +#: pg_createsubscriber.c:2065 #, c-format -msgid "invalid compression level \"%s\"" -msgstr "ìž˜ëª»ëœ ì••ì¶• 수위 \"%s\"" +msgid "could not determine current directory" +msgstr "현재 디렉터리를 확ì¸í•  수 ì—†ìŒ" -#: pg_basebackup.c:2388 +#: pg_createsubscriber.c:2082 #, c-format -msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" -msgstr "ìž˜ëª»ëœ ì²´í¬í¬ì¸íЏ 옵션값 \"%s\", \"fast\" ë˜ëŠ” \"spread\"ë§Œ 사용 가능" +msgid "no publisher connection string specified" +msgstr "발행 서버 ì—°ê²° 문ìžì—´ì„ 지정하지 않았ìŒ" -#: pg_basebackup.c:2415 pg_receivewal.c:555 pg_recvlogical.c:820 +#: pg_createsubscriber.c:2086 #, c-format -msgid "invalid status interval \"%s\"" -msgstr "ìž˜ëª»ëœ ìƒíƒœê°’ 간격: \"%s\"" +msgid "validating publisher connection string" +msgstr "발행 서버 ì—°ê²° 문ìžì—´ 검사 중" -#: pg_basebackup.c:2445 pg_basebackup.c:2458 pg_basebackup.c:2469 -#: pg_basebackup.c:2480 pg_basebackup.c:2488 pg_basebackup.c:2496 -#: pg_basebackup.c:2506 pg_basebackup.c:2519 pg_basebackup.c:2527 -#: pg_basebackup.c:2538 pg_basebackup.c:2548 pg_basebackup.c:2565 -#: pg_basebackup.c:2573 pg_basebackup.c:2581 pg_receivewal.c:605 -#: pg_receivewal.c:618 pg_receivewal.c:626 pg_receivewal.c:636 -#: pg_receivewal.c:644 pg_receivewal.c:655 pg_recvlogical.c:846 -#: pg_recvlogical.c:859 pg_recvlogical.c:870 pg_recvlogical.c:878 -#: pg_recvlogical.c:886 pg_recvlogical.c:894 pg_recvlogical.c:902 -#: pg_recvlogical.c:910 pg_recvlogical.c:918 +#: pg_createsubscriber.c:2092 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "ìžì œí•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보십시오.\n" +msgid "validating subscriber connection string" +msgstr "êµ¬ë… ì„œë²„ ì—°ê²° 문ìžì—´ 검사 중" -#: pg_basebackup.c:2456 pg_receivewal.c:616 pg_recvlogical.c:857 +#: pg_createsubscriber.c:2097 #, c-format -msgid "too many command-line arguments (first is \"%s\")" -msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")" +msgid "no database was specified" +msgstr "ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 지정하지 않았ìŒ" -#: pg_basebackup.c:2468 pg_receivewal.c:654 +#: pg_createsubscriber.c:2109 #, c-format -msgid "no target directory specified" -msgstr "ëŒ€ìƒ ë””ë ‰í„°ë¦¬ë¥¼ 지정하지 않ìŒ" +msgid "database name \"%s\" was extracted from the publisher connection string" +msgstr "발행 서버 ì—°ê²° 문ìžì—´ì—서 ë°ì´í„°ë² ì´ìФ ì´ë¦„ 확ì¸: \"%s\"" -#: pg_basebackup.c:2479 +#: pg_createsubscriber.c:2114 #, c-format -msgid "only tar mode backups can be compressed" -msgstr "tar 형ì‹ë§Œ ì••ì¶•ì„ ì‚¬ìš©í•  수 있ìŒ" +msgid "no database name specified" +msgstr "ë°ì´í„°ë² ì´ìФ ì´ë¦„ì„ ì§€ì •í•˜ì§€ 않았ìŒ" -#: pg_basebackup.c:2487 +#: pg_createsubscriber.c:2124 #, c-format -msgid "cannot stream write-ahead logs in tar mode to stdout" -msgstr "tar ë°©ì‹ì—서 stdout으로 트랜잭션 로그 ìŠ¤íŠ¸ë¦¬ë° ë¶ˆê°€" +msgid "wrong number of publication names specified" +msgstr "발행 ì´ë¦„ë“¤ì˜ ê°œìˆ˜ê°€ 잘못ë¨" -#: pg_basebackup.c:2495 +#: pg_createsubscriber.c:2125 #, c-format -msgid "replication slots can only be used with WAL streaming" -msgstr "복제 ìŠ¬ë¡¯ì€ WAL ìŠ¤íŠ¸ë¦¬ë° ë°©ì‹ì—서만 사용할 수 있ìŒ" +msgid "" +"The number of specified publication names (%d) must match the number of " +"specified database names (%d)." +msgstr "지정한 발행 ì´ë¦„ì˜ ìˆ˜(%d)와 ë°ì´í„°ë² ì´ìФ ì´ë¦„ì˜ ìˆ˜(%d)ê°€ 같지 않ìŒ" -#: pg_basebackup.c:2505 +#: pg_createsubscriber.c:2131 #, c-format -msgid "--no-slot cannot be used with slot name" -msgstr "슬롯 ì´ë¦„ì„ ì§€ì •í•œ 경우 --no-slot ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ" +msgid "wrong number of subscription names specified" +msgstr "êµ¬ë… ì´ë¦„ë“¤ì˜ ê°œìˆ˜ê°€ 잘못ë¨" -#. translator: second %s is an option name -#: pg_basebackup.c:2517 pg_receivewal.c:634 +#: pg_createsubscriber.c:2132 #, c-format -msgid "%s needs a slot to be specified using --slot" -msgstr "%s ì˜µì…˜ì€ --slot ì˜µì…˜ì„ í•¨ê»˜ 사용해야 함" +msgid "" +"The number of specified subscription names (%d) must match the number of " +"specified database names (%d)." +msgstr "지정한 êµ¬ë… ì´ë¦„ì˜ ìˆ˜(%d)와 ë°ì´í„°ë² ì´ìФ ì´ë¦„ì˜ ìˆ˜(%d)ê°€ 같지 않ìŒ" -#: pg_basebackup.c:2526 +#: pg_createsubscriber.c:2138 #, c-format -msgid "--create-slot and --no-slot are incompatible options" -msgstr "--create-slot 옵션과 -no-slot ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" +msgid "wrong number of replication slot names specified" +msgstr "복제 슬롯 ì´ë¦„ë“¤ì˜ ê°œìˆ˜ê°€ 잘못ë¨" -#: pg_basebackup.c:2537 +#: pg_createsubscriber.c:2139 #, c-format -msgid "WAL directory location can only be specified in plain mode" -msgstr "트랜잭션 로그 디렉터리 위치는 plain 모드ì—서만 사용할 수 있ìŒ" +msgid "" +"The number of specified replication slot names (%d) must match the number of " +"specified database names (%d)." +msgstr "" +"지정한 복제 슬롯 ì´ë¦„ì˜ ìˆ˜(%d)와 ë°ì´í„°ë² ì´ìФ ì´ë¦„ì˜ ìˆ˜(%d)ê°€ 같지 않ìŒ" -#: pg_basebackup.c:2547 +#: pg_createsubscriber.c:2168 #, c-format -msgid "WAL directory location must be an absolute path" -msgstr "트랜잭션 로그 디렉터리 위치는 절대 경로여야 함" +msgid "subscriber data directory is not a copy of the source database cluster" +msgstr "êµ¬ë… ì„œë²„ì˜ ë°ì´í„° 디렉터리는 ì›ë³¸ ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ì˜ ê²ƒì´ ì•„ë‹˜" -#: pg_basebackup.c:2557 pg_receivewal.c:663 +#: pg_createsubscriber.c:2181 #, c-format -msgid "this build does not support compression" -msgstr "ì´ ë²„ì „ì€ ì••ì¶• 하는 ê¸°ëŠ¥ì„ í¬í•¨ 하지 않고 빌드 ë˜ì—ˆìŠµë‹ˆë‹¤." +msgid "standby server is running" +msgstr "대기 서버가 실행 중입니다." -#: pg_basebackup.c:2564 +#: pg_createsubscriber.c:2182 #, c-format -msgid "--progress and --no-estimate-size are incompatible options" -msgstr "--progress 옵션과 --no-estimate-size ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" +msgid "Stop the standby server and try again." +msgstr "대기 서버를 중지 하고, 다시 하세요." -#: pg_basebackup.c:2572 +#: pg_createsubscriber.c:2191 #, c-format -msgid "--no-manifest and --manifest-checksums are incompatible options" -msgstr "--no-manifest 옵션과 --manifest-checksums ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" +msgid "starting the standby server with command-line options" +msgstr "명령행 ì˜µì…˜ì„ í¬í•¨í•´ì„œ 대기 서버를 시작 중" -#: pg_basebackup.c:2580 +#: pg_createsubscriber.c:2207 pg_createsubscriber.c:2242 #, c-format -msgid "--no-manifest and --manifest-force-encode are incompatible options" -msgstr "" -"--no-manifest 옵션과 --manifest-force-encode ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" +msgid "stopping the subscriber" +msgstr "êµ¬ë… ì„œë²„ 중지 중" -#: pg_basebackup.c:2639 +#: pg_createsubscriber.c:2221 #, c-format -msgid "could not create symbolic link \"%s\": %m" -msgstr "\"%s\" 심벌릭 ë§í¬ë¥¼ 만들 수 ì—†ìŒ: %m" +msgid "starting the subscriber" +msgstr "êµ¬ë… ì„œë²„ 실행 중" -#: pg_basebackup.c:2643 +#: pg_createsubscriber.c:2250 #, c-format -msgid "symlinks are not supported on this platform" -msgstr "ì´ í”Œëž«í¼ì—서는 심볼 ë§í¬ê°€ ì§€ì›ë˜ì§€ 않ìŒ" +msgid "Done!" +msgstr "완료!" #: pg_receivewal.c:77 #, c-format @@ -906,15 +2015,6 @@ msgstr "" "%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ìŠ¤íŠ¸ë¦¬ë° íŠ¸ëžœìž­ì…˜ 로그를 수신하는 ë„구입니다.\n" "\n" -#: pg_receivewal.c:81 pg_recvlogical.c:81 -#, c-format -msgid "" -"\n" -"Options:\n" -msgstr "" -"\n" -"옵션들:\n" - #: pg_receivewal.c:82 #, c-format msgid "" @@ -922,12 +2022,12 @@ msgid "" msgstr "" " -D, --directory=DIR 지정한 디렉터리로 트랜잭션 로그 파ì¼ì„ 백업함\n" -#: pg_receivewal.c:83 pg_recvlogical.c:82 +#: pg_receivewal.c:83 pg_recvlogical.c:93 #, c-format msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" msgstr " -E, --endpos=LSN 지정한 LSN까지 받고 종료함\n" -#: pg_receivewal.c:84 pg_recvlogical.c:86 +#: pg_receivewal.c:84 pg_recvlogical.c:97 #, c-format msgid "" " --if-not-exists do not error if slot already exists when creating a " @@ -935,7 +2035,7 @@ msgid "" msgstr "" " --if-not-exists ìŠ¬ë¡¯ì„ ìƒˆë¡œ 만들 때 ì´ë¯¸ ìžˆì–´ë„ ì˜¤ë¥˜ ë‚´ì§€ 않ìŒ\n" -#: pg_receivewal.c:85 pg_recvlogical.c:88 +#: pg_receivewal.c:85 pg_recvlogical.c:99 #, c-format msgid " -n, --no-loop do not loop on connection lost\n" msgstr " -n, --no-loop ì ‘ì†ì´ ëŠê²¼ì„ 때 재연결 하지 않ìŒ\n" @@ -947,7 +2047,7 @@ msgid "" "disk\n" msgstr " --no-sync ë””ìŠ¤í¬ ì“°ê¸° ë’¤ sync 작업 ìƒëžµ\n" -#: pg_receivewal.c:87 pg_recvlogical.c:93 +#: pg_receivewal.c:87 pg_recvlogical.c:104 #, c-format msgid "" " -s, --status-interval=SECS\n" @@ -966,10 +2066,14 @@ msgstr " --synchronous 쓰기 작업 후 즉시 트랜잭션 로그를 #: pg_receivewal.c:93 #, c-format -msgid " -Z, --compress=0-9 compress logs with given compression level\n" -msgstr " -Z, --compress=0-9 ì••ì¶•ëœ ë¡œê·¸ 파ì¼ì˜ ì••ì¶• 수위 지정\n" +msgid "" +" -Z, --compress=METHOD[:DETAIL]\n" +" compress as specified\n" +msgstr "" +" -Z, --compress=METHOD[:DETAIL]\n" +" ì••ì¶• 관련 ì†ì„± 지정\n" -#: pg_receivewal.c:102 +#: pg_receivewal.c:103 #, c-format msgid "" "\n" @@ -978,7 +2082,7 @@ msgstr "" "\n" "추가 기능:\n" -#: pg_receivewal.c:103 pg_recvlogical.c:78 +#: pg_receivewal.c:104 pg_recvlogical.c:89 #, c-format msgid "" " --create-slot create a new replication slot (for the slot's name " @@ -987,7 +2091,7 @@ msgstr "" " --create-slot 새 복제 ìŠ¬ë¡¯ì„ ë§Œë“¬ (--slot 옵션ì—서 슬롯 ì´ë¦„ ì§€" "ì •)\n" -#: pg_receivewal.c:104 pg_recvlogical.c:79 +#: pg_receivewal.c:105 pg_recvlogical.c:90 #, c-format msgid "" " --drop-slot drop the replication slot (for the slot's name see " @@ -995,115 +2099,147 @@ msgid "" msgstr "" " --drop-slot 복제 슬롯 ì‚­ì œ (--slot 옵션ì—서 슬롯 ì´ë¦„ 지정)\n" -#: pg_receivewal.c:117 +#: pg_receivewal.c:191 #, c-format msgid "finished segment at %X/%X (timeline %u)" msgstr "ë§ˆë¬´ë¦¬ëœ ì„¸ê·¸ë¨¼íŠ¸ 위치: %X/%X (타임ë¼ì¸ %u)" -#: pg_receivewal.c:124 +#: pg_receivewal.c:198 #, c-format msgid "stopped log streaming at %X/%X (timeline %u)" msgstr "로그 ìŠ¤íŠ¸ë¦¬ë° ì¤‘ì§€ëœ ìœ„ì¹˜: %X/%X (타임ë¼ì¸ %u)" -#: pg_receivewal.c:140 +#: pg_receivewal.c:214 #, c-format msgid "switched to timeline %u at %X/%X" msgstr "전환ë¨: 타임ë¼ì¸ %u, 위치 %X/%X" -#: pg_receivewal.c:150 +#: pg_receivewal.c:224 pg_recvlogical.c:1053 #, c-format msgid "received interrupt signal, exiting" msgstr "ì¸í„°ëŸ½í„° 시그ë„ì„ ë°›ìŒ, 종료함" -#: pg_receivewal.c:186 +#: pg_receivewal.c:256 #, c-format msgid "could not close directory \"%s\": %m" msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: pg_receivewal.c:272 +#: pg_receivewal.c:323 #, c-format -msgid "segment file \"%s\" has incorrect size %d, skipping" -msgstr "\"%s\" ì¡°ê° íŒŒì¼ì€ ìž˜ëª»ëœ í¬ê¸°ìž„: %d, 무시함" +msgid "segment file \"%s\" has incorrect size %lld, skipping" +msgstr "\"%s\" ì¡°ê° íŒŒì¼ì€ ìž˜ëª»ëœ í¬ê¸°ìž„: %lld, 무시함" -#: pg_receivewal.c:290 +#: pg_receivewal.c:340 #, c-format msgid "could not open compressed file \"%s\": %m" msgstr "\"%s\" ì••ì¶• íŒŒì¼ ì—´ê¸° 실패: %m" -#: pg_receivewal.c:296 +#: pg_receivewal.c:343 #, c-format msgid "could not seek in compressed file \"%s\": %m" msgstr "\"%s\" ì••ì¶• íŒŒì¼ ìž‘ì—… 위치 찾기 실패: %m" -#: pg_receivewal.c:304 +#: pg_receivewal.c:349 #, c-format msgid "could not read compressed file \"%s\": %m" msgstr "\"%s\" ì••ì¶• íŒŒì¼ ì½ê¸° 실패: %m" -#: pg_receivewal.c:307 +#: pg_receivewal.c:352 #, c-format msgid "could not read compressed file \"%s\": read %d of %zu" msgstr "\"%s\" ì••ì¶• 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %zu" -#: pg_receivewal.c:318 +#: pg_receivewal.c:362 #, c-format msgid "" "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping" msgstr "\"%s\" ì••ì¶• 파ì¼ì€ ì••ì¶• í’€ì—ˆì„ ë•Œ ìž˜ëª»ëœ í¬ê¸°ìž„: %d, 무시함" -#: pg_receivewal.c:422 +#: pg_receivewal.c:390 #, c-format -msgid "starting log streaming at %X/%X (timeline %u)" -msgstr "로그 ìŠ¤íŠ¸ë¦¬ë° ì‹œìž‘ 위치: %X/%X (타임ë¼ì¸ %u)" +msgid "could not create LZ4 decompression context: %s" +msgstr "LZ4 ì••ì¶• 컨í…스트 정보를 ìƒì„±í•  수 없습니다: %s" + +#: pg_receivewal.c:420 +#, c-format +msgid "could not decompress file \"%s\": %s" +msgstr "\"%s\" íŒŒì¼ ì••ì¶• 풀기 실패: %s" + +#: pg_receivewal.c:443 +#, c-format +msgid "could not free LZ4 decompression context: %s" +msgstr "LZ4 ì••ì¶• í•´ì œ 컨í…스트 반환 실패: %s" -#: pg_receivewal.c:537 pg_recvlogical.c:762 +#: pg_receivewal.c:448 #, c-format -msgid "invalid port number \"%s\"" -msgstr "ìž˜ëª»ëœ í¬íЏ 번호: \"%s\"" +msgid "" +"compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping" +msgstr "\"%s\" ì••ì¶•ëœ ì¡°ê° íŒŒì¼ì€ ì••ì¶• í’€ì—ˆì„ ë•Œ ìž˜ëª»ëœ í¬ê¸°ìž„: %zu, 무시함" + +#: pg_receivewal.c:453 +#, c-format +msgid "" +"cannot check file \"%s\": compression with %s not supported by this build" +msgstr "\"%s\" íŒŒì¼ ê²€ì‚¬ 실패: %s ì••ì¶•ì„ ì§€ì› ì•ˆí•˜ê²Œ 빌드ë˜ì—ˆìŒ" + +#: pg_receivewal.c:578 +#, c-format +msgid "starting log streaming at %X/%X (timeline %u)" +msgstr "로그 ìŠ¤íŠ¸ë¦¬ë° ì‹œìž‘ 위치: %X/%X (타임ë¼ì¸ %u)" -#: pg_receivewal.c:565 pg_recvlogical.c:788 +#: pg_receivewal.c:693 pg_recvlogical.c:801 #, c-format msgid "could not parse end position \"%s\"" msgstr "시작 위치 êµ¬ë¬¸ì´ ìž˜ëª»ë¨ \"%s\"" -#: pg_receivewal.c:625 +#: pg_receivewal.c:766 #, c-format msgid "cannot use --create-slot together with --drop-slot" msgstr "--create-slot 옵션과 --drop-slot ì˜µì…˜ì„ í•¨ê»˜ 사용할 수 ì—†ìŒ" -#: pg_receivewal.c:643 +#: pg_receivewal.c:782 #, c-format msgid "cannot use --synchronous together with --no-sync" msgstr "--synchronous 옵션과 --no-sync ì˜µì…˜ì„ í•¨ê»˜ 사용할 수 ì—†ìŒ" -#: pg_receivewal.c:719 +#: pg_receivewal.c:792 +#, c-format +msgid "no target directory specified" +msgstr "ëŒ€ìƒ ë””ë ‰í„°ë¦¬ë¥¼ 지정하지 않ìŒ" + +#: pg_receivewal.c:816 +#, c-format +msgid "compression with %s is not yet supported" +msgstr "%s ì••ì¶•ì„ ì•„ì§ ì§€ì›í•˜ì§€ 않ìŒ" + +#: pg_receivewal.c:859 #, c-format msgid "" "replication connection using slot \"%s\" is unexpectedly database specific" msgstr "\"%s\" ìŠ¬ë¡¯ì„ ì´ìš©í•œ 복제 ì—°ê²°ì€ ì´ ë°ì´í„°ë² ì´ìФì—서 사용할 수 ì—†ìŒ" -#: pg_receivewal.c:730 pg_recvlogical.c:966 +#: pg_receivewal.c:878 pg_recvlogical.c:972 #, c-format msgid "dropping replication slot \"%s\"" msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ ì‚­ì œ 중" -#: pg_receivewal.c:741 pg_recvlogical.c:976 +#: pg_receivewal.c:889 pg_recvlogical.c:982 #, c-format msgid "creating replication slot \"%s\"" msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì„ ë§Œë“œëŠ” 중" -#: pg_receivewal.c:767 pg_recvlogical.c:1001 +#: pg_receivewal.c:918 pg_recvlogical.c:1006 #, c-format msgid "disconnected" msgstr "ì—°ê²° ëŠê¹€" #. translator: check source for value for %d -#: pg_receivewal.c:773 pg_recvlogical.c:1007 +#: pg_receivewal.c:922 pg_recvlogical.c:1010 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "ì—°ê²° ëŠê¹€; 다시 ì—°ê²° 하기 위해 %d 초를 기다리는 중" -#: pg_recvlogical.c:73 +#: pg_recvlogical.c:84 #, c-format msgid "" "%s controls PostgreSQL logical decoding streams.\n" @@ -1112,7 +2248,7 @@ msgstr "" "%s í”„ë¡œê·¸ëž¨ì€ ë…¼ë¦¬ 디코딩 ìŠ¤íŠ¸ë¦¼ì„ ì œì–´í•˜ëŠ” ë„구입니다.\n" "\n" -#: pg_recvlogical.c:77 +#: pg_recvlogical.c:88 #, c-format msgid "" "\n" @@ -1121,7 +2257,7 @@ msgstr "" "\n" "ì„±ëŠ¥ì— ê´€ê³„ëœ ê¸°ëŠ¥ë“¤:\n" -#: pg_recvlogical.c:80 +#: pg_recvlogical.c:91 #, c-format msgid "" " --start start streaming in a replication slot (for the " @@ -1130,12 +2266,12 @@ msgstr "" " --start 복제 ìŠ¬ë¡¯ì„ ì´ìš©í•œ ìŠ¤íŠ¸ë¦¬ë° ì‹œìž‘ (--slot 옵션ì—서 슬" "롯 ì´ë¦„ 지정)\n" -#: pg_recvlogical.c:83 +#: pg_recvlogical.c:94 #, c-format msgid " -f, --file=FILE receive log into this file, - for stdout\n" msgstr " -f, --file=íŒŒì¼ ìž‘ì—… 로그를 해당 파ì¼ì— 기ë¡, 표준 ì¶œë ¥ì€ -\n" -#: pg_recvlogical.c:84 +#: pg_recvlogical.c:95 #, c-format msgid "" " -F --fsync-interval=SECS\n" @@ -1146,14 +2282,14 @@ msgstr "" " 지정한 ì´ˆ 간격으로 íŒŒì¼ fsync ìž‘ì—…ì„ í•¨ (초기값: " "%d)\n" -#: pg_recvlogical.c:87 +#: pg_recvlogical.c:98 #, c-format msgid "" " -I, --startpos=LSN where in an existing slot should the streaming " "start\n" msgstr " -I, --startpos=LSN 스트리ë°ì„ 시작할 기존 슬롯 위치\n" -#: pg_recvlogical.c:89 +#: pg_recvlogical.c:100 #, c-format msgid "" " -o, --option=NAME[=VALUE]\n" @@ -1164,112 +2300,116 @@ msgstr "" " 출력 플러그ì¸ì—서 사용할 ì˜µì…˜ë“¤ì˜ ì˜µì…˜ ì´ë¦„ê³¼ ê·¸ " "ê°’\n" -#: pg_recvlogical.c:92 +#: pg_recvlogical.c:103 #, c-format msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n" msgstr " -P, --plugin=PLUGIN 사용할 출력 í”ŒëŸ¬ê·¸ì¸ (초기값: %s)\n" -#: pg_recvlogical.c:95 +#: pg_recvlogical.c:106 #, c-format msgid " -S, --slot=SLOTNAME name of the logical replication slot\n" msgstr " -S, --slot=슬롯ì´ë¦„ 논리 복제 슬롯 ì´ë¦„\n" -#: pg_recvlogical.c:100 +#: pg_recvlogical.c:107 +#, c-format +msgid "" +" -t, --two-phase enable decoding of prepared transactions when " +"creating a slot\n" +msgstr "" +" -t, --two-phase ìŠ¬ë¡¯ì„ ë§Œë“¤ 때 미리 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ 디코딩 활성화\n" + +#: pg_recvlogical.c:112 #, c-format msgid " -d, --dbname=DBNAME database to connect to\n" msgstr " -d, --dbname=디비ì´ë¦„ ì ‘ì†í•  ë°ì´í„°ë² ì´ìФ\n" -#: pg_recvlogical.c:133 +#: pg_recvlogical.c:145 #, c-format msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)" msgstr "쓰기 í™•ì¸ ìœ„ì¹˜: %X/%X, 플러시 위치 %X/%X (슬롯 %s)" -#: pg_recvlogical.c:157 receivelog.c:343 +#: pg_recvlogical.c:169 receivelog.c:360 #, c-format msgid "could not send feedback packet: %s" msgstr "피드백 íŒ¨í‚·ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s" -#: pg_recvlogical.c:230 +#: pg_recvlogical.c:239 #, c-format msgid "starting log streaming at %X/%X (slot %s)" msgstr "로그 ìŠ¤íŠ¸ë¦¬ë° ì‹œìž‘ 함, 위치: %X/%X (슬롯 %s)" -#: pg_recvlogical.c:271 +#: pg_recvlogical.c:281 #, c-format msgid "streaming initiated" msgstr "ìŠ¤íŠ¸ë¦¬ë° ì´ˆê¸°í™” ë¨" -#: pg_recvlogical.c:335 +#: pg_recvlogical.c:346 #, c-format msgid "could not open log file \"%s\": %m" msgstr "\"%s\" 잠금파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: pg_recvlogical.c:361 receivelog.c:873 +#: pg_recvlogical.c:375 receivelog.c:882 #, c-format msgid "invalid socket: %s" msgstr "ìž˜ëª»ëœ ì†Œì¼“: %s" -#: pg_recvlogical.c:414 receivelog.c:901 +#: pg_recvlogical.c:428 receivelog.c:910 #, c-format -msgid "select() failed: %m" -msgstr "select() 실패: %m" +msgid "%s() failed: %m" +msgstr "%s() 실패: %m" -#: pg_recvlogical.c:421 receivelog.c:951 +#: pg_recvlogical.c:435 receivelog.c:959 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "WAL 스트림ì—서 ìžë£Œ 받기 실패: %s" -#: pg_recvlogical.c:463 pg_recvlogical.c:514 receivelog.c:995 receivelog.c:1061 +#: pg_recvlogical.c:477 pg_recvlogical.c:528 receivelog.c:1003 +#: receivelog.c:1066 #, c-format msgid "streaming header too small: %d" msgstr "ìŠ¤íŠ¸ë¦¬ë° í—¤ë” í¬ê¸°ê°€ 너무 ìž‘ìŒ: %d" -#: pg_recvlogical.c:498 receivelog.c:833 +#: pg_recvlogical.c:512 receivelog.c:843 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "알 수 없는 ìŠ¤íŠ¸ë¦¬ë° í—¤ë”: \"%c\"" -#: pg_recvlogical.c:552 pg_recvlogical.c:564 +#: pg_recvlogical.c:566 pg_recvlogical.c:578 #, c-format -msgid "could not write %u bytes to log file \"%s\": %m" -msgstr "%u ë°”ì´íЏ 쓰기 실패, ë¡œê·¸íŒŒì¼ \"%s\": %m" +msgid "could not write %d bytes to log file \"%s\": %m" +msgstr "%d ë°”ì´íЏ 쓰기 실패, ëŒ€ìƒ ë¡œê·¸íŒŒì¼ \"%s\": %m" -#: pg_recvlogical.c:618 receivelog.c:629 receivelog.c:666 +#: pg_recvlogical.c:636 receivelog.c:642 receivelog.c:679 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "복제 ìŠ¤íŠ¸ë¦¼ì˜ ì˜ˆìƒì¹˜ 못한 종료: %s" -#: pg_recvlogical.c:742 -#, c-format -msgid "invalid fsync interval \"%s\"" -msgstr "\"%s\" ê°’ì€ ìž˜ëª»ëœ fsync 반복주기 ìž„" - -#: pg_recvlogical.c:780 +#: pg_recvlogical.c:796 #, c-format msgid "could not parse start position \"%s\"" msgstr "시작 위치 êµ¬ë¬¸ì´ ìž˜ëª»ë¨ \"%s\"" -#: pg_recvlogical.c:869 +#: pg_recvlogical.c:874 #, c-format msgid "no slot specified" msgstr "ìŠ¬ë¡¯ì„ ì§€ì •í•˜ì§€ 않았ìŒ" -#: pg_recvlogical.c:877 +#: pg_recvlogical.c:881 #, c-format msgid "no target file specified" msgstr "ëŒ€ìƒ íŒŒì¼ì„ 지정하지 않았ìŒ" -#: pg_recvlogical.c:885 +#: pg_recvlogical.c:888 #, c-format msgid "no database specified" msgstr "ë°ì´í„°ë² ì´ìФ 지정하지 않았ìŒ" -#: pg_recvlogical.c:893 +#: pg_recvlogical.c:895 #, c-format msgid "at least one action needs to be specified" msgstr "ì ì–´ë„ 하나 ì´ìƒì˜ 작업 ë°©ë²•ì„ ì§€ì •í•´ì•¼ 함" -#: pg_recvlogical.c:901 +#: pg_recvlogical.c:902 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "" @@ -1281,89 +2421,94 @@ msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "" " --create-slot 옵션ì´ë‚˜ --drop-slot ì˜µì…˜ì€ --startpos 옵션과 함께 쓸 수 ì—†ìŒ" -#: pg_recvlogical.c:917 +#: pg_recvlogical.c:916 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos ì˜µì…˜ì€ --start 옵션과 함께 사용해야 함" -#: pg_recvlogical.c:948 +#: pg_recvlogical.c:923 +#, c-format +msgid "--two-phase may only be specified with --create-slot" +msgstr "--two-phase ì˜µì…˜ì€ --create-slot ì˜µì…˜ì„ ì“¸ 때만 사용 가능함" + +#: pg_recvlogical.c:956 #, c-format msgid "could not establish database-specific replication connection" msgstr "ë°ì´í„°ë² ì´ìФ ì˜ì¡´ì ì¸ 복제 ì—°ê²°ì„ í•  수 ì—†ìŒ" -#: pg_recvlogical.c:1047 +#: pg_recvlogical.c:1056 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "keepaliveì— ì˜í•´ì„œ %X/%X 마지막 ìœ„ì¹˜ì— ë„달했ìŒ" -#: pg_recvlogical.c:1050 +#: pg_recvlogical.c:1061 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "%X/%X 마지막 위치가 WAL 레코드 %X/%X 위치ì—서 ë„달했ìŒ" -#: receivelog.c:69 +#: receivelog.c:66 #, c-format msgid "could not create archive status file \"%s\": %s" msgstr "\"%s\" archive status 파ì¼ì„ 만들 수 없습니다: %s" -#: receivelog.c:116 +#: receivelog.c:73 +#, c-format +msgid "could not close archive status file \"%s\": %s" +msgstr "\"%s\" archive status 파ì¼ì„ ë‹«ì„ ìˆ˜ 없습니다: %s" + +#: receivelog.c:122 #, c-format msgid "could not get size of write-ahead log file \"%s\": %s" msgstr "\"%s\" WAL íŒŒì¼ í¬ê¸°ë¥¼ 알 수 ì—†ìŒ: %s" -#: receivelog.c:126 +#: receivelog.c:133 #, c-format msgid "could not open existing write-ahead log file \"%s\": %s" msgstr "ì´ë¯¸ 있는 \"%s\" 트랜잭션 로그 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s" -#: receivelog.c:134 +#: receivelog.c:142 #, c-format msgid "could not fsync existing write-ahead log file \"%s\": %s" msgstr "ì´ë¯¸ 있는 \"%s\" WAL íŒŒì¼ fsync 실패: %s" -#: receivelog.c:148 +#: receivelog.c:157 #, c-format -msgid "write-ahead log file \"%s\" has %d byte, should be 0 or %d" -msgid_plural "write-ahead log file \"%s\" has %d bytes, should be 0 or %d" +msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d" +msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d" msgstr[0] "" -"\"%s\" 트랜잭션 로그파ì¼ì˜ í¬ê¸°ê°€ %d ë°”ì´íŠ¸ìž„, 0 ë˜ëŠ” %d ë°”ì´íŠ¸ì—¬ì•¼ 함" +"\"%s\" 트랜잭션 로그파ì¼ì˜ í¬ê¸°ê°€ %zd ë°”ì´íŠ¸ìž„, 0 ë˜ëŠ” %d ë°”ì´íŠ¸ì—¬ì•¼ 함" -#: receivelog.c:163 +#: receivelog.c:175 #, c-format msgid "could not open write-ahead log file \"%s\": %s" msgstr "\"%s\" WAL 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s" -#: receivelog.c:189 -#, c-format -msgid "could not determine seek position in file \"%s\": %s" -msgstr "\"%s\" 파ì¼ì˜ 시작 위치를 ê²°ì •í•  수 ì—†ìŒ: %s" - -#: receivelog.c:203 +#: receivelog.c:216 #, c-format -msgid "not renaming \"%s%s\", segment is not complete" -msgstr "\"%s%s\" ì´ë¦„ 변경 실패, 세그먼트가 완료ë˜ì§€ 않았ìŒ" +msgid "not renaming \"%s\", segment is not complete" +msgstr "\"%s\" ì´ë¦„ 변경 실패, 세그먼트가 완료ë˜ì§€ 않았ìŒ" -#: receivelog.c:215 receivelog.c:300 receivelog.c:675 +#: receivelog.c:227 receivelog.c:317 receivelog.c:688 #, c-format msgid "could not close file \"%s\": %s" msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %s" -#: receivelog.c:272 +#: receivelog.c:288 #, c-format msgid "server reported unexpected history file name for timeline %u: %s" msgstr "타임ë¼ì¸ %u ë²ˆì„ ìœ„í•œ ë‚´ì—­ íŒŒì¼ ì´ë¦„ì´ ìž˜ëª» ë˜ì—ˆìŒ: %s" -#: receivelog.c:280 +#: receivelog.c:297 #, c-format msgid "could not create timeline history file \"%s\": %s" msgstr "\"%s\" 타임ë¼ì¸ ë‚´ì—­ 파ì¼ì„ 만들 수 ì—†ìŒ: %s" -#: receivelog.c:287 +#: receivelog.c:304 #, c-format msgid "could not write timeline history file \"%s\": %s" msgstr "\"%s\" 타임ë¼ì¸ ë‚´ì—­ 파ì¼ì— 쓸 수 ì—†ìŒ: %s" -#: receivelog.c:377 +#: receivelog.c:394 #, c-format msgid "" "incompatible server version %s; client does not support streaming from " @@ -1372,7 +2517,7 @@ msgstr "" "%s 서버 ë²„ì „ì€ í˜¸í™˜ë˜ì§€ 않ìŒ; í´ë¼ì´ì–¸íŠ¸ëŠ” %s 버전 보다 ì˜¤ëž˜ëœ ì„œë²„ì˜ ìŠ¤íŠ¸ë¦¬" "ë°ì€ ì§€ì›í•˜ì§€ 않ìŒ" -#: receivelog.c:386 +#: receivelog.c:403 #, c-format msgid "" "incompatible server version %s; client does not support streaming from " @@ -1381,27 +2526,18 @@ msgstr "" "%s 서버 ë²„ì „ì€ í˜¸í™˜ë˜ì§€ 않ìŒ; í´ë¼ì´ì–¸íŠ¸ëŠ” %s 버전 보다 새로운 ì„œë²„ì˜ ìŠ¤íŠ¸ë¦¬" "ë°ì€ ì§€ì›í•˜ì§€ 않ìŒ" -#: receivelog.c:488 streamutil.c:430 streamutil.c:467 -#, c-format -msgid "" -"could not identify system: got %d rows and %d fields, expected %d rows and " -"%d or more fields" -msgstr "" -"ì‹œìŠ¤í…œì„ ì‹ë³„í•  수 ì—†ìŒ: 로우수 %d, 필드수 %d, 예ìƒê°’: 로우수 %d, 필드수 %d " -"ì´ìƒ" - -#: receivelog.c:495 +#: receivelog.c:508 #, c-format msgid "" "system identifier does not match between base backup and streaming connection" msgstr "시스템 ì‹ë³„ìžê°€ ë² ì´ìФ 백업과 ìŠ¤íŠ¸ë¦¬ë° ì—°ê²°ì—서 서로 다름" -#: receivelog.c:501 +#: receivelog.c:516 #, c-format msgid "starting timeline %u is not present in the server" msgstr "%u 타임ë¼ì¸ìœ¼ë¡œ 시작하는 ê²ƒì„ ì„œë²„ì—서 제공 하지 않ìŒ" -#: receivelog.c:542 +#: receivelog.c:555 #, c-format msgid "" "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, " @@ -1410,12 +2546,12 @@ msgstr "" "TIMELINE_HISTORY 명령 결과가 잘못ë¨: ë°›ì€ ê°’: 로우수 %d, 필드수 %d, 예ìƒê°’: " "로우수 %d, 필드수 %d" -#: receivelog.c:613 +#: receivelog.c:626 #, c-format msgid "server reported unexpected next timeline %u, following timeline %u" msgstr "서버가 ìž˜ëª»ëœ ë‹¤ìŒ íƒ€ìž„ë¼ì¸ 번호 %u 보고함, ì´ì „ 타임ë¼ì¸ 번호 %u" -#: receivelog.c:619 +#: receivelog.c:632 #, c-format msgid "" "server stopped streaming timeline %u at %X/%X, but reported next timeline %u " @@ -1424,12 +2560,12 @@ msgstr "" "ì„œë²„ì˜ ì¤‘ì§€ 위치: 타임ë¼ì¸ %u, 위치 %X/%X, 하지만 ë³´ê³  ë°›ì€ ìœ„ì¹˜: 타임ë¼ì¸ " "%u 위치 %X/%X" -#: receivelog.c:659 +#: receivelog.c:672 #, c-format msgid "replication stream was terminated before stop point" msgstr "복제 ìŠ¤íŠ¸ë¦¼ì´ ì¤‘ì§€ 위치 ì „ì— ì¢…ë£Œ ë˜ì—ˆìŒ" -#: receivelog.c:705 +#: receivelog.c:718 #, c-format msgid "" "unexpected result set after end-of-timeline: got %d rows and %d fields, " @@ -1438,66 +2574,61 @@ msgstr "" "타임ë¼ì¸ ëì— ìž˜ëª»ëœ ê²°ê³¼ê°€ 발견 ë¨: 로우수 %d, 필드수 %d / 예ìƒê°’: 로우수 " "%d, 필드수 %d" -#: receivelog.c:714 +#: receivelog.c:727 #, c-format msgid "could not parse next timeline's starting point \"%s\"" msgstr "ë‹¤ìŒ íƒ€ìž„ë¼ì¸ 시작 위치 ë¶„ì„ ì‹¤íŒ¨ \"%s\"" -#: receivelog.c:763 receivelog.c:1015 +#: receivelog.c:775 receivelog.c:1022 walmethods.c:1206 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "\"%s\" íŒŒì¼ fsync 실패: %s" -#: receivelog.c:1078 +#: receivelog.c:1083 #, c-format msgid "received write-ahead log record for offset %u with no file open" msgstr "%u ìœ„ì¹˜ì˜ ìˆ˜ì‹ ëœ íŠ¸ëžœìž­ì…˜ 로그 ë ˆì½”ë“œì— íŒŒì¼ì„ ì—´ 수 ì—†ìŒ" -#: receivelog.c:1088 +#: receivelog.c:1093 #, c-format msgid "got WAL data offset %08x, expected %08x" msgstr "ìž˜ëª»ëœ WAL ìžë£Œ 위치 %08x, 기대값 %08x" -#: receivelog.c:1122 +#: receivelog.c:1128 #, c-format -msgid "could not write %u bytes to WAL file \"%s\": %s" -msgstr "%u ë°”ì´íŠ¸ë¥¼ \"%s\" WAL 파ì¼ì— 쓸 수 ì—†ìŒ: %s" +msgid "could not write %d bytes to WAL file \"%s\": %s" +msgstr "%d ë°”ì´íŠ¸ë¥¼ \"%s\" WAL 파ì¼ì— 쓸 수 ì—†ìŒ: %s" -#: receivelog.c:1147 receivelog.c:1187 receivelog.c:1218 +#: receivelog.c:1153 receivelog.c:1193 receivelog.c:1222 #, c-format msgid "could not send copy-end packet: %s" msgstr "copy-end íŒ¨í‚·ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s" -#: streamutil.c:160 +#: streamutil.c:165 msgid "Password: " msgstr "암호: " -#: streamutil.c:185 +#: streamutil.c:192 #, c-format msgid "could not connect to server" msgstr "서버 ì ‘ì† ì‹¤íŒ¨" -#: streamutil.c:202 -#, c-format -msgid "could not connect to server: %s" -msgstr "서버 ì ‘ì† ì‹¤íŒ¨: %s" - -#: streamutil.c:231 +#: streamutil.c:233 #, c-format -msgid "could not clear search_path: %s" -msgstr "search_path를 지울 수 ì—†ìŒ: %s" +msgid "could not clear \"search_path\": %s" +msgstr "\"search_path\"를 지울 수 ì—†ìŒ: %s" -#: streamutil.c:247 +#: streamutil.c:249 #, c-format -msgid "could not determine server setting for integer_datetimes" -msgstr "integer_datetimes 서버 ì„¤ì •ì„ ì•Œ 수 ì—†ìŒ" +msgid "could not determine server setting for \"integer_datetimes\"" +msgstr "\"integer_datetimes\" 서버 ì„¤ì •ì„ ì•Œ 수 ì—†ìŒ" -#: streamutil.c:254 +#: streamutil.c:256 #, c-format -msgid "integer_datetimes compile flag does not match server" -msgstr "integer_datetimes ì»´íŒŒì¼ í”Œëž˜ê·¸ê°€ 서버와 ì¼ì¹˜í•˜ì§€ 않ìŒ" +msgid "\"integer_datetimes\" compile flag does not match server" +msgstr "\"integer_datetimes\" ì»´íŒŒì¼ í”Œëž˜ê·¸ê°€ 서버와 ì¼ì¹˜í•˜ì§€ 않ìŒ" -#: streamutil.c:305 +#: streamutil.c:375 #, c-format msgid "" "could not fetch WAL segment size: got %d rows and %d fields, expected %d " @@ -1506,24 +2637,23 @@ msgstr "" "WAL ì¡°ê° í¬ê¸° 계산 실패: 로우수 %d, 필드수 %d, 예ìƒê°’: 로우수 %d, 필드수 %d " "ì´ìƒ" -#: streamutil.c:315 +#: streamutil.c:385 #, c-format msgid "WAL segment size could not be parsed" msgstr "WAL ì¡°ê° í¬ê¸° ë¶„ì„ ëª»í•¨" -#: streamutil.c:333 +#: streamutil.c:403 #, c-format -msgid "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the " -"remote server reported a value of %d byte" -msgid_plural "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the " -"remote server reported a value of %d bytes" -msgstr[0] "" -"WAL ì¡°ê° íŒŒì¼ í¬ê¸°ëŠ” 1MBì—서 1GBì‚¬ì´ 2ì˜ ì œê³± í¬ê¸°ì—¬ì•¼ 하는ë°, " -"ì›ê²© 서버는 %d ë°”ì´íŠ¸ìž…ë‹ˆë‹¤." +msgid "remote server reported invalid WAL segment size (%d byte)" +msgid_plural "remote server reported invalid WAL segment size (%d bytes)" +msgstr[0] "ì›ê²© 서버가 잘못 WAL ì¡°ê° í¬ê¸°ë¥¼ ë³´ê³ í–ˆìŒ (%d ë°”ì´íЏ)" + +#: streamutil.c:407 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL ì¡°ê° íŒŒì¼ í¬ê¸°ëŠ” 1MBì—서 1GBì‚¬ì´ 2ì˜ ì œê³± í¬ê¸°ì—¬ì•¼ 합니다." -#: streamutil.c:378 +#: streamutil.c:449 #, c-format msgid "" "could not fetch group access flag: got %d rows and %d fields, expected %d " @@ -1532,12 +2662,45 @@ msgstr "" "그룹 ì ‘ê·¼ 플래그를 가져올 수 ì—†ìŒ: 로우수 %d, 필드수 %d, 예ìƒê°’: 로우수 %d, " "필드수 %d ì´ìƒ" -#: streamutil.c:387 +#: streamutil.c:458 #, c-format msgid "group access flag could not be parsed: %s" msgstr "그룹 ì ‘ê·¼ 플래그를 ë¶„ì„ ëª»í•¨: %s" -#: streamutil.c:544 +#: streamutil.c:501 streamutil.c:538 +#, c-format +msgid "" +"could not identify system: got %d rows and %d fields, expected %d rows and " +"%d or more fields" +msgstr "" +"ì‹œìŠ¤í…œì„ ì‹ë³„í•  수 ì—†ìŒ: 로우수 %d, 필드수 %d, 예ìƒê°’: 로우수 %d, 필드수 %d " +"ì´ìƒ" + +#: streamutil.c:590 +#, c-format +msgid "" +"could not read replication slot \"%s\": got %d rows and %d fields, expected " +"%d rows and %d fields" +msgstr "" +"\"%s\" 복제 ìŠ¬ë¡¯ì„ ì½ì„ 수 ì—†ìŒ: 로우수 %d, 필드수 %d, 기대값 로우수 %d, 필드" +"수 %d" + +#: streamutil.c:602 +#, c-format +msgid "replication slot \"%s\" does not exist" +msgstr "\"%s\" ì´ë¦„ì˜ ë³µì œ ìŠ¬ë¡¯ì´ ì—†ìŠµë‹ˆë‹¤" + +#: streamutil.c:613 +#, c-format +msgid "expected a physical replication slot, got type \"%s\" instead" +msgstr "물리 복제 ìŠ¬ë¡¯ì„ ì‚¬ìš©í•´ì•¼ 함, \"%s\" 복제 슬롯임" + +#: streamutil.c:627 +#, c-format +msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" +msgstr "\"%s\" restart_lsn 위치를 í•´ì„í•  수 ì—†ìŒ, 해당 슬롯: \"%s\"" + +#: streamutil.c:744 #, c-format msgid "" "could not create replication slot \"%s\": got %d rows and %d fields, " @@ -1546,7 +2709,7 @@ msgstr "" "\"%s\" 복제 ìŠ¬ë¡¯ì„ ë§Œë“¤ 수 ì—†ìŒ: 로우수 %d, 필드수 %d, 기대값 로우수 %d, 필드" "수 %d" -#: streamutil.c:588 +#: streamutil.c:788 #, c-format msgid "" "could not drop replication slot \"%s\": got %d rows and %d fields, expected " @@ -1555,34 +2718,30 @@ msgstr "" "\"%s\" 복제 ìŠ¬ë¡¯ì„ ì‚­ì œí•  수 ì—†ìŒ: 로우수 %d, 필드수 %d, 기대값 로우수 %d, í•„" "드수 %d" -#: walmethods.c:438 walmethods.c:927 +#: walmethods.c:726 walmethods.c:1269 msgid "could not compress data" msgstr "ìžë£Œë¥¼ ì••ì¶•í•  수 ì—†ìŒ" -#: walmethods.c:470 +#: walmethods.c:755 msgid "could not reset compression stream" msgstr "ì••ì¶• ìŠ¤íŠ¸ë¦¼ì„ ë¦¬ì…‹í•  수 ì—†ìŒ" -#: walmethods.c:568 -msgid "could not initialize compression library" -msgstr "ì••ì¶• ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 초기화할 수 ì—†ìŒ" - -#: walmethods.c:580 +#: walmethods.c:892 msgid "implementation error: tar files can't have more than one open file" msgstr "구현 오류: tar 파ì¼ì€ 하나 ì´ìƒ ì—´ 수 ì—†ìŒ" -#: walmethods.c:594 +#: walmethods.c:907 msgid "could not create tar header" msgstr "tar í•´ë”를 만들 수 ì—†ìŒ" -#: walmethods.c:608 walmethods.c:648 walmethods.c:843 walmethods.c:854 +#: walmethods.c:924 walmethods.c:965 walmethods.c:1171 walmethods.c:1184 msgid "could not change compression parameters" msgstr "ì••ì¶• 매개 변수를 바꿀 수 ì—†ìŒ" -#: walmethods.c:730 +#: walmethods.c:1056 msgid "unlink not supported with compression" msgstr "ì••ì¶• ìƒíƒœì—서 íŒŒì¼ ì‚­ì œëŠ” ì§€ì›í•˜ì§€ 않ìŒ" -#: walmethods.c:952 +#: walmethods.c:1293 msgid "could not close compression stream" msgstr "ì••ì¶• ìŠ¤íŠ¸ë¦¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ" diff --git a/src/bin/pg_basebackup/po/meson.build b/src/bin/pg_basebackup/po/meson.build index 2a39f5ffeba47..aee79603634ba 100644 --- a/src/bin/pg_basebackup/po/meson.build +++ b/src/bin/pg_basebackup/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_basebackup-' + pg_version_major.to_string())] diff --git a/src/bin/pg_basebackup/po/ru.po b/src/bin/pg_basebackup/po/ru.po index 743d7c935e40d..3f00c4d3d239a 100644 --- a/src/bin/pg_basebackup/po/ru.po +++ b/src/bin/pg_basebackup/po/ru.po @@ -1,21 +1,21 @@ # Russian message translation file for pg_basebackup # Copyright (C) 2012-2016 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: pg_basebackup (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-11-01 14:40+0300\n" -"PO-Revision-Date: 2022-09-29 12:01+0300\n" +"POT-Creation-Date: 2025-05-03 16:06+0300\n" +"PO-Revision-Date: 2024-09-07 11:12+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,37 +37,44 @@ msgstr "подробноÑти: " msgid "hint: " msgstr "подÑказка: " -#: ../../common/compression.c:130 ../../common/compression.c:139 -#: ../../common/compression.c:148 +#: ../../common/compression.c:132 ../../common/compression.c:141 +#: ../../common/compression.c:150 bbstreamer_gzip.c:116 bbstreamer_gzip.c:249 +#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298 bbstreamer_zstd.c:129 +#: bbstreamer_zstd.c:284 #, c-format msgid "this build does not support compression with %s" msgstr "Ñта Ñборка программы не поддерживает Ñжатие %s" -#: ../../common/compression.c:203 +#: ../../common/compression.c:205 msgid "found empty string where a compression option was expected" msgstr "вмеÑто ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð° пуÑÑ‚Ð°Ñ Ñтрока" -#: ../../common/compression.c:237 +#: ../../common/compression.c:244 #, c-format msgid "unrecognized compression option: \"%s\"" msgstr "нераÑпознанный параметр ÑжатиÑ: \"%s\"" -#: ../../common/compression.c:276 +#: ../../common/compression.c:283 #, c-format msgid "compression option \"%s\" requires a value" msgstr "Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" требуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ" -#: ../../common/compression.c:285 +#: ../../common/compression.c:292 #, c-format msgid "value for compression option \"%s\" must be an integer" msgstr "значение параметра ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" должно быть целочиÑленным" -#: ../../common/compression.c:335 +#: ../../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "значение параметра ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" должно быть булевÑким" + +#: ../../common/compression.c:379 #, c-format msgid "compression algorithm \"%s\" does not accept a compression level" msgstr "Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ уровень ÑжатиÑ" -#: ../../common/compression.c:342 +#: ../../common/compression.c:386 #, c-format msgid "" "compression algorithm \"%s\" expects a compression level between %d and %d " @@ -76,55 +83,149 @@ msgstr "" "Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" ожидаетÑÑ ÑƒÑ€Ð¾Ð²ÐµÐ½ÑŒ ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¾Ñ‚ %d до %d (по " "умолчанию %d)" -#: ../../common/compression.c:353 +#: ../../common/compression.c:397 #, c-format msgid "compression algorithm \"%s\" does not accept a worker count" msgstr "Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ чиÑло потоков" +#: ../../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "алгоритм ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" не поддерживает режим большой диÑтанции" + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m" + +#: ../../common/controldata_utils.c:110 pg_basebackup.c:1873 +#: pg_receivewal.c:402 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %zu)" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: bbstreamer_file.c:138 pg_recvlogical.c:650 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неÑоответÑтвие порÑдка байт" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, " +"and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"возможно неÑоответÑтвие порÑдка байт\n" +"ПорÑдок байт в файле pg_control может не ÑоответÑтвовать иÑпользуемому\n" +"Ñтой программой. Ð’ Ñтом Ñлучае результаты будут неверными и\n" +"уÑтановленный PostgreSQL будет неÑовмеÑтим Ñ Ñтим каталогом данных." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: pg_basebackup.c:1846 pg_receivewal.c:386 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 pg_recvlogical.c:204 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "нехватка памÑти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 -#: pg_receivewal.c:380 pg_recvlogical.c:341 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_receivewal.c:319 pg_recvlogical.c:352 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" -#: ../../common/file_utils.c:166 pg_receivewal.c:303 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñта Ñборка программы не поддерживает метод Ñинхронизации \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_receivewal.c:242 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" -#: ../../common/file_utils.c:200 pg_receivewal.c:532 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_receivewal.c:471 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" -#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 -#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121 -#: pg_receivewal.c:447 +#: ../../common/file_utils.c:498 pg_basebackup.c:2344 walmethods.c:462 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" -#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 -#: pg_recvlogical.c:196 +#: ../../common/restricted_token.c:60 #, c-format -msgid "could not fsync file \"%s\": %m" -msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" +msgid "could not open process token: error code %lu" +msgstr "не удалоÑÑŒ открыть маркер процеÑÑа (код ошибки: %lu)" -#: ../../common/file_utils.c:383 pg_basebackup.c:2266 walmethods.c:459 +#: ../../common/restricted_token.c:74 #, c-format -msgid "could not rename file \"%s\" to \"%s\": %m" -msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" +msgid "could not allocate SIDs: error code %lu" +msgstr "не удалоÑÑŒ подготовить Ñтруктуры SID (код ошибки: %lu)" + +#: ../../common/restricted_token.c:94 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "не удалоÑÑŒ Ñоздать ограниченный маркер (код ошибки: %lu)" + +#: ../../common/restricted_token.c:115 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "не удалоÑÑŒ запуÑтить процеÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ \"%s\" (код ошибки: %lu)" + +#: ../../common/restricted_token.c:153 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "не удалоÑÑŒ перезапуÑтитьÑÑ Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ маркером (код ошибки: %lu)" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "не удалоÑÑŒ получить код выхода от подпроцеÑÑа (код ошибки: %lu)" #: ../../fe_utils/option_utils.c:69 #, c-format @@ -136,51 +237,65 @@ msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" msgid "%s must be in range %d..%d" msgstr "значение %s должно быть в диапазоне %d..%d" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1646 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нераÑпознанный метод Ñинхронизации: %s" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 pg_basebackup.c:1636 streamutil.c:334 #, c-format msgid "out of memory" msgstr "нехватка памÑти" -#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121 -#: bbstreamer_file.c:258 pg_basebackup.c:1443 pg_basebackup.c:1737 +#: ../../fe_utils/recovery_gen.c:143 bbstreamer_file.c:121 +#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727 #, c-format msgid "could not write to file \"%s\": %m" msgstr "не удалоÑÑŒ запиÑать в файл \"%s\": %m" -#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339 -#: pg_basebackup.c:1507 pg_basebackup.c:1716 +#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:361 +#: pg_basebackup.c:1497 pg_basebackup.c:1706 #, c-format msgid "could not create file \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать файл \"%s\": %m" -#: bbstreamer_file.c:138 pg_recvlogical.c:635 +#: ../../fe_utils/string_utils.c:587 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m" +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "" +"аргумент команды оболочки Ñодержит Ñимвол новой Ñтроки или перевода каретки: " +"\"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "" +"Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ñодержит Ñимвол новой Ñтроки или перевода каретки: \"%s\"\n" #: bbstreamer_file.c:275 #, c-format msgid "unexpected state while extracting archive" msgstr "неожиданное ÑоÑтоÑние при извлечении архива" -#: bbstreamer_file.c:298 pg_basebackup.c:696 pg_basebackup.c:740 +#: bbstreamer_file.c:321 pg_basebackup.c:698 pg_basebackup.c:712 +#: pg_basebackup.c:757 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m" -#: bbstreamer_file.c:304 +#: bbstreamer_file.c:326 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "не удалоÑÑŒ уÑтановить права Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° \"%s\": %m" -#: bbstreamer_file.c:323 +#: bbstreamer_file.c:345 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать ÑимволичеÑкую ÑÑылку \"%s\" в \"%s\": %m" -#: bbstreamer_file.c:343 +#: bbstreamer_file.c:365 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "не удалоÑÑŒ уÑтановить права доÑтупа Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": %m" @@ -205,11 +320,6 @@ msgstr "не удалоÑÑŒ открыть выходной файл: %m" msgid "could not set compression level %d: %s" msgstr "не удалоÑÑŒ уÑтановить уровень ÑÐ¶Ð°Ñ‚Ð¸Ñ %d: %s" -#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249 -#, c-format -msgid "this build does not support gzip compression" -msgstr "Ñта Ñборка программы не поддерживает Ñжатие gzip" - #: bbstreamer_gzip.c:143 #, c-format msgid "could not write to compressed file \"%s\": %s" @@ -220,12 +330,12 @@ msgstr "не удалоÑÑŒ запиÑать Ñжатый файл \"%s\": %s" msgid "could not close compressed file \"%s\": %m" msgstr "не удалоÑÑŒ закрыть Ñжатый файл \"%s\": %m" -#: bbstreamer_gzip.c:245 walmethods.c:869 +#: bbstreamer_gzip.c:245 walmethods.c:880 #, c-format msgid "could not initialize compression library" msgstr "не удалоÑÑŒ инициализировать библиотеку ÑжатиÑ" -#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316 +#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329 #, c-format msgid "could not decompress data: %s" msgstr "не удалоÑÑŒ раÑпаковать данные: %s" @@ -240,17 +350,12 @@ msgstr "неожиданное ÑоÑтоÑние при внедрении па msgid "could not create lz4 compression context: %s" msgstr "не удалоÑÑŒ Ñоздать контекÑÑ‚ ÑÐ¶Ð°Ñ‚Ð¸Ñ lz4: %s" -#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298 -#, c-format -msgid "this build does not support lz4 compression" -msgstr "Ñта Ñборка программы не поддерживает Ñжатие lz4" - #: bbstreamer_lz4.c:140 #, c-format msgid "could not write lz4 header: %s" msgstr "не удалоÑÑŒ запиÑать заголовок lz4: %s" -#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210 +#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223 #, c-format msgid "could not compress data: %s" msgstr "не удалоÑÑŒ Ñжать данные: %s" @@ -275,12 +380,12 @@ msgstr "окончание файла tar занимает больше 2 бло msgid "unexpected state while parsing tar archive" msgstr "неожиданное ÑоÑтоÑние при разборе архива tar" -#: bbstreamer_tar.c:296 +#: bbstreamer_tar.c:292 #, c-format msgid "tar member has empty name" msgstr "пуÑтое Ð¸Ð¼Ñ Ñƒ компонента tar" -#: bbstreamer_tar.c:328 +#: bbstreamer_tar.c:326 #, c-format msgid "COPY stream ended before last file was finished" msgstr "поток COPY закончилÑÑ Ð´Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледнего файла" @@ -300,103 +405,103 @@ msgstr "не удалоÑÑŒ уÑтановить Ð´Ð»Ñ zstd уровень Ñж msgid "could not set compression worker count to %d: %s" msgstr "не удалоÑÑŒ уÑтановить Ð´Ð»Ñ zstd чиÑло потоков %d: %s" -#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271 +#: bbstreamer_zstd.c:116 #, c-format -msgid "this build does not support zstd compression" -msgstr "Ñта Ñборка программы не поддерживает Ñжатие zstd" +msgid "could not enable long-distance mode: %s" +msgstr "не удалоÑÑŒ включить режим большой диÑтанции: %s" -#: bbstreamer_zstd.c:262 +#: bbstreamer_zstd.c:275 #, c-format msgid "could not create zstd decompression context" msgstr "не удалоÑÑŒ Ñоздать контекÑÑ‚ раÑпаковки zstd" -#: pg_basebackup.c:240 +#: pg_basebackup.c:245 #, c-format msgid "removing data directory \"%s\"" msgstr "удаление каталога данных \"%s\"" -#: pg_basebackup.c:242 +#: pg_basebackup.c:247 #, c-format msgid "failed to remove data directory" msgstr "ошибка при удалении каталога данных" -#: pg_basebackup.c:246 +#: pg_basebackup.c:251 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "удаление Ñодержимого каталога данных \"%s\"" -#: pg_basebackup.c:248 +#: pg_basebackup.c:253 #, c-format msgid "failed to remove contents of data directory" msgstr "ошибка при удалении Ñодержимого каталога данных" -#: pg_basebackup.c:253 +#: pg_basebackup.c:258 #, c-format msgid "removing WAL directory \"%s\"" msgstr "удаление каталога WAL \"%s\"" -#: pg_basebackup.c:255 +#: pg_basebackup.c:260 #, c-format msgid "failed to remove WAL directory" msgstr "ошибка при удалении каталога WAL" -#: pg_basebackup.c:259 +#: pg_basebackup.c:264 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "удаление Ñодержимого каталога WAL \"%s\"" -#: pg_basebackup.c:261 +#: pg_basebackup.c:266 #, c-format msgid "failed to remove contents of WAL directory" msgstr "ошибка при удалении Ñодержимого каталога WAL" -#: pg_basebackup.c:267 +#: pg_basebackup.c:272 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "каталог данных \"%s\" не был удалён по запроÑу пользователÑ" -#: pg_basebackup.c:270 +#: pg_basebackup.c:275 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "каталог WAL \"%s\" не был удалён по запроÑу пользователÑ" -#: pg_basebackup.c:274 +#: pg_basebackup.c:279 #, c-format msgid "changes to tablespace directories will not be undone" msgstr "Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² каталогах табличных проÑтранÑтв не будут отменены" -#: pg_basebackup.c:326 +#: pg_basebackup.c:331 #, c-format msgid "directory name too long" msgstr "Ñлишком длинное Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°" -#: pg_basebackup.c:333 +#: pg_basebackup.c:338 #, c-format msgid "multiple \"=\" signs in tablespace mapping" msgstr "неÑколько знаков \"=\" в ÑопоÑтавлении табличного проÑтранÑтва" -#: pg_basebackup.c:342 +#: pg_basebackup.c:347 #, c-format msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "" "ÑопоÑтавление табл. проÑтранÑтва запиÑано неверно: \"%s\"; должно быть " "\"СТÐРЫЙ_КÐТÐЛОГ=ÐОВЫЙ_КÐТÐЛОГ\"" -#: pg_basebackup.c:361 +#: pg_basebackup.c:366 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "" "Ñтарый каталог в ÑопоÑтавлении табл. проÑтранÑтва задан не абÑолютным путём: " "%s" -#: pg_basebackup.c:365 +#: pg_basebackup.c:370 #, c-format msgid "new directory is not an absolute path in tablespace mapping: %s" msgstr "" "новый каталог в ÑопоÑтавлении табл. проÑтранÑтва задан не абÑолютным путём: " "%s" -#: pg_basebackup.c:387 +#: pg_basebackup.c:392 #, c-format msgid "" "%s takes a base backup of a running PostgreSQL server.\n" @@ -405,17 +510,19 @@ msgstr "" "%s делает базовую резервную копию работающего Ñервера PostgreSQL.\n" "\n" -#: pg_basebackup.c:389 pg_receivewal.c:81 pg_recvlogical.c:78 +#: pg_basebackup.c:394 pg_createsubscriber.c:221 pg_receivewal.c:79 +#: pg_recvlogical.c:86 #, c-format msgid "Usage:\n" msgstr "ИÑпользование:\n" -#: pg_basebackup.c:390 pg_receivewal.c:82 pg_recvlogical.c:79 +#: pg_basebackup.c:395 pg_createsubscriber.c:222 pg_receivewal.c:80 +#: pg_recvlogical.c:87 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [ПÐРÐМЕТР]...\n" -#: pg_basebackup.c:391 +#: pg_basebackup.c:396 #, c-format msgid "" "\n" @@ -424,19 +531,28 @@ msgstr "" "\n" "Параметры, управлÑющие выводом:\n" -#: pg_basebackup.c:392 +#: pg_basebackup.c:397 #, c-format msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n" msgstr " -D, --pgdata=КÐТÐЛОГ Ñохранить базовую копию в указанный каталог\n" -#: pg_basebackup.c:393 +#: pg_basebackup.c:398 #, c-format msgid " -F, --format=p|t output format (plain (default), tar)\n" msgstr "" " -F, --format=p|t формат вывода (p (по умолчанию) - проÑтой, t - " "tar)\n" -#: pg_basebackup.c:394 +#: pg_basebackup.c:399 +#, c-format +msgid "" +" -i, --incremental=OLDMANIFEST\n" +" take incremental backup\n" +msgstr "" +" -i, --incremental=СТÐРЫЙ_МÐÐИФЕСТ\n" +" Ñоздать инкрементальную копию\n" + +#: pg_basebackup.c:401 #, c-format msgid "" " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" @@ -445,7 +561,7 @@ msgstr "" " -r, --max-rate=СКОРОСТЬ макÑ. ÑкороÑть передачи данных в целевой каталог\n" " (в КБ/Ñ, либо добавьте ÑÑƒÑ„Ñ„Ð¸ÐºÑ \"k\" или \"M\")\n" -#: pg_basebackup.c:396 +#: pg_basebackup.c:403 #, c-format msgid "" " -R, --write-recovery-conf\n" @@ -455,7 +571,7 @@ msgstr "" " запиÑать конфигурацию Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸\n" # well-spelled: ИÐФО -#: pg_basebackup.c:398 +#: pg_basebackup.c:405 #, c-format msgid "" " -t, --target=TARGET[:DETAIL]\n" @@ -464,7 +580,7 @@ msgstr "" " -t, --target=ПОЛУЧÐТЕЛЬ[:ДОП_ИÐФО]\n" " получатель копии (еÑли отличаетÑÑ Ð¾Ñ‚ client)\n" -#: pg_basebackup.c:400 +#: pg_basebackup.c:407 #, c-format msgid "" " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" @@ -475,14 +591,14 @@ msgstr "" "каталога\n" " в новый\n" -#: pg_basebackup.c:402 +#: pg_basebackup.c:409 #, c-format msgid " --waldir=WALDIR location for the write-ahead log directory\n" msgstr "" " --waldir=КÐТÐЛОГ_WAL\n" " раÑположение каталога Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð¾Ð¼ предзапиÑи\n" -#: pg_basebackup.c:403 +#: pg_basebackup.c:410 #, c-format msgid "" " -X, --wal-method=none|fetch|stream\n" @@ -492,13 +608,13 @@ msgstr "" " включить в копию требуемые файлы WAL, иÑпользуÑ\n" " заданный метод\n" -#: pg_basebackup.c:405 +#: pg_basebackup.c:412 #, c-format msgid " -z, --gzip compress tar output\n" msgstr " -z, --gzip Ñжать выходной tar\n" # well-spelled: ИÐФО -#: pg_basebackup.c:406 +#: pg_basebackup.c:413 #, c-format msgid "" " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" @@ -508,12 +624,12 @@ msgstr "" " выполнÑть Ñжатие на клиенте или Ñервере как " "указано\n" -#: pg_basebackup.c:408 +#: pg_basebackup.c:415 #, c-format msgid " -Z, --compress=none do not compress tar output\n" msgstr " -Z, --compress=none не Ñжимать вывод tar\n" -#: pg_basebackup.c:409 +#: pg_basebackup.c:416 #, c-format msgid "" "\n" @@ -522,31 +638,32 @@ msgstr "" "\n" "Общие параметры:\n" -#: pg_basebackup.c:410 +#: pg_basebackup.c:417 #, c-format msgid "" " -c, --checkpoint=fast|spread\n" -" set fast or spread checkpointing\n" +" set fast or spread (default) checkpointing\n" msgstr "" " -c, --checkpoint=fast|spread\n" -" режим быÑтрых или раÑпределённых контрольных точек\n" +" режим быÑтрых или раÑпределённых (по умолчанию)\n" +" контрольных точек\n" -#: pg_basebackup.c:412 +#: pg_basebackup.c:419 #, c-format msgid " -C, --create-slot create replication slot\n" msgstr " -C, --create-slot Ñоздать Ñлот репликации\n" -#: pg_basebackup.c:413 +#: pg_basebackup.c:420 #, c-format msgid " -l, --label=LABEL set backup label\n" msgstr " -l, --label=МЕТКРуÑтановить метку резервной копии\n" -#: pg_basebackup.c:414 +#: pg_basebackup.c:421 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean не очищать поÑле ошибок\n" -#: pg_basebackup.c:415 +#: pg_basebackup.c:422 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written safely to " @@ -554,27 +671,27 @@ msgid "" msgstr "" " -N, --no-sync не ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… на диÑке\n" -#: pg_basebackup.c:416 +#: pg_basebackup.c:423 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress показывать прогреÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸\n" -#: pg_basebackup.c:417 pg_receivewal.c:91 +#: pg_basebackup.c:424 pg_receivewal.c:89 #, c-format msgid " -S, --slot=SLOTNAME replication slot to use\n" msgstr " -S, --slot=ИМЯ_СЛОТРиÑпользовать заданный Ñлот репликации\n" -#: pg_basebackup.c:418 pg_receivewal.c:93 pg_recvlogical.c:100 +#: pg_basebackup.c:425 pg_receivewal.c:91 pg_recvlogical.c:108 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose выводить подробные ÑообщениÑ\n" -#: pg_basebackup.c:419 pg_receivewal.c:94 pg_recvlogical.c:101 +#: pg_basebackup.c:426 pg_receivewal.c:92 pg_recvlogical.c:109 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: pg_basebackup.c:420 +#: pg_basebackup.c:427 #, c-format msgid "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" @@ -585,7 +702,7 @@ msgstr "" # skip-rule: capital-letter-first # well-spelled: шеÑтнадц -#: pg_basebackup.c:422 +#: pg_basebackup.c:429 #, c-format msgid "" " --manifest-force-encode\n" @@ -595,25 +712,25 @@ msgstr "" " запиÑывать вÑе имена файлов в манифеÑте в шеÑтнадц. " "виде\n" -#: pg_basebackup.c:424 +#: pg_basebackup.c:431 #, c-format msgid " --no-estimate-size do not estimate backup size in server side\n" msgstr "" " --no-estimate-size не раÑÑчитывать размер копии на Ñтороне Ñервера\n" -#: pg_basebackup.c:425 +#: pg_basebackup.c:432 #, c-format msgid " --no-manifest suppress generation of backup manifest\n" msgstr " --no-manifest отключить Ñоздание манифеÑта копии\n" -#: pg_basebackup.c:426 +#: pg_basebackup.c:433 #, c-format msgid "" " --no-slot prevent creation of temporary replication slot\n" msgstr "" " --no-slot предотвратить Ñоздание временного Ñлота репликации\n" -#: pg_basebackup.c:427 +#: pg_basebackup.c:434 #, c-format msgid "" " --no-verify-checksums\n" @@ -622,12 +739,22 @@ msgstr "" " --no-verify-checksums\n" " не проверÑть контрольные Ñуммы\n" -#: pg_basebackup.c:429 pg_receivewal.c:97 pg_recvlogical.c:102 +# well-spelled: ИÐФО +#: pg_basebackup.c:436 +#, c-format +msgid "" +" --sync-method=METHOD\n" +" set method for syncing files to disk\n" +msgstr "" +" --sync-method=МЕТОД\n" +" метод Ñинхронизации файлов Ñ Ð¤Ð¡\n" + +#: pg_basebackup.c:438 pg_receivewal.c:95 pg_recvlogical.c:110 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: pg_basebackup.c:430 pg_receivewal.c:98 pg_recvlogical.c:103 +#: pg_basebackup.c:439 pg_receivewal.c:96 pg_recvlogical.c:111 #, c-format msgid "" "\n" @@ -636,22 +763,24 @@ msgstr "" "\n" "Параметры подключениÑ:\n" -#: pg_basebackup.c:431 pg_receivewal.c:99 +#: pg_basebackup.c:440 pg_receivewal.c:97 #, c-format msgid " -d, --dbname=CONNSTR connection string\n" msgstr " -d, --dbname=СТРОКРÑтрока подключениÑ\n" -#: pg_basebackup.c:432 pg_receivewal.c:100 pg_recvlogical.c:105 +#: pg_basebackup.c:441 pg_receivewal.c:98 pg_recvlogical.c:113 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" -msgstr " -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог Ñокетов\n" +msgstr "" +" -h, --host=ИМЯ компьютер Ñ Ñервером баз данных или каталог " +"Ñокетов\n" -#: pg_basebackup.c:433 pg_receivewal.c:101 pg_recvlogical.c:106 +#: pg_basebackup.c:442 pg_receivewal.c:99 pg_recvlogical.c:114 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=ПОРТ номер порта Ñервера БД\n" -#: pg_basebackup.c:434 +#: pg_basebackup.c:443 #, c-format msgid "" " -s, --status-interval=INTERVAL\n" @@ -662,19 +791,19 @@ msgstr "" " интервал между передаваемыми Ñерверу\n" " пакетами ÑоÑтоÑÐ½Ð¸Ñ (в Ñекундах)\n" -#: pg_basebackup.c:436 pg_receivewal.c:102 pg_recvlogical.c:107 +#: pg_basebackup.c:445 pg_receivewal.c:100 pg_recvlogical.c:115 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr "" " -U, --username=NAME connect as specified database user\n" " -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð°Ð· данных\n" -#: pg_basebackup.c:437 pg_receivewal.c:103 pg_recvlogical.c:108 +#: pg_basebackup.c:446 pg_receivewal.c:101 pg_recvlogical.c:116 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: pg_basebackup.c:438 pg_receivewal.c:104 pg_recvlogical.c:109 +#: pg_basebackup.c:447 pg_receivewal.c:102 pg_recvlogical.c:117 #, c-format msgid "" " -W, --password force password prompt (should happen " @@ -682,7 +811,8 @@ msgid "" msgstr "" " -W, --password запрашивать пароль вÑегда (обычно не требуетÑÑ)\n" -#: pg_basebackup.c:439 pg_receivewal.c:108 pg_recvlogical.c:110 +#: pg_basebackup.c:448 pg_createsubscriber.c:240 pg_receivewal.c:106 +#: pg_recvlogical.c:118 #, c-format msgid "" "\n" @@ -691,63 +821,64 @@ msgstr "" "\n" "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: pg_basebackup.c:440 pg_receivewal.c:109 pg_recvlogical.c:111 +#: pg_basebackup.c:449 pg_createsubscriber.c:241 pg_receivewal.c:107 +#: pg_recvlogical.c:119 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" -#: pg_basebackup.c:482 +#: pg_basebackup.c:488 #, c-format msgid "could not read from ready pipe: %m" msgstr "не удалоÑÑŒ прочитать из готового канала: %m" -#: pg_basebackup.c:485 pg_basebackup.c:632 pg_basebackup.c:2180 -#: streamutil.c:444 +#: pg_basebackup.c:491 pg_basebackup.c:633 pg_basebackup.c:2258 +#: streamutil.c:521 #, c-format msgid "could not parse write-ahead log location \"%s\"" msgstr "не удалоÑÑŒ разобрать положение в журнале предзапиÑи \"%s\"" -#: pg_basebackup.c:591 pg_receivewal.c:663 +#: pg_basebackup.c:596 pg_receivewal.c:600 #, c-format msgid "could not finish writing WAL files: %m" msgstr "не удалоÑÑŒ завершить запиÑÑŒ файлов WAL: %m" -#: pg_basebackup.c:641 +#: pg_basebackup.c:642 #, c-format msgid "could not create pipe for background process: %m" msgstr "не удалоÑÑŒ Ñоздать канал Ð´Ð»Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð³Ð¾ процеÑÑа: %m" -#: pg_basebackup.c:674 +#: pg_basebackup.c:676 #, c-format msgid "created temporary replication slot \"%s\"" msgstr "Ñоздан временный Ñлот репликации \"%s\"" -#: pg_basebackup.c:677 +#: pg_basebackup.c:679 #, c-format msgid "created replication slot \"%s\"" msgstr "Ñоздан Ñлот репликации \"%s\"" -#: pg_basebackup.c:711 +#: pg_basebackup.c:728 #, c-format msgid "could not create background process: %m" msgstr "не удалоÑÑŒ Ñоздать фоновый процеÑÑ: %m" -#: pg_basebackup.c:720 +#: pg_basebackup.c:737 #, c-format msgid "could not create background thread: %m" msgstr "не удалоÑÑŒ Ñоздать фоновый поток выполнениÑ: %m" -#: pg_basebackup.c:759 +#: pg_basebackup.c:776 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "каталог \"%s\" ÑущеÑтвует, но он не пуÑÑ‚" -#: pg_basebackup.c:765 +#: pg_basebackup.c:782 pg_createsubscriber.c:390 #, c-format msgid "could not access directory \"%s\": %m" -msgstr "ошибка доÑтупа к каталогу \"%s\": %m" +msgstr "ошибка при обращении к каталогу \"%s\": %m" -#: pg_basebackup.c:842 +#: pg_basebackup.c:858 #, c-format msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" @@ -755,7 +886,7 @@ msgstr[0] "%*s/%s КБ (100%%), табличное проÑтранÑтво %d/% msgstr[1] "%*s/%s КБ (100%%), табличное проÑтранÑтво %d/%d %*s" msgstr[2] "%*s/%s КБ (100%%), табличное проÑтранÑтво %d/%d %*s" -#: pg_basebackup.c:854 +#: pg_basebackup.c:870 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" @@ -763,7 +894,7 @@ msgstr[0] "%*s/%s КБ (%d%%), табличное проÑтранÑтво %d/%d msgstr[1] "%*s/%s КБ (%d%%), табличное проÑтранÑтво %d/%d (%s%-*.*s)" msgstr[2] "%*s/%s КБ (%d%%), табличное проÑтранÑтво %d/%d (%s%-*.*s)" -#: pg_basebackup.c:870 +#: pg_basebackup.c:886 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" @@ -771,58 +902,58 @@ msgstr[0] "%*s/%s КБ (%d%%), табличное проÑтранÑтво %d/%d msgstr[1] "%*s/%s КБ (%d%%), табличное проÑтранÑтво %d/%d" msgstr[2] "%*s/%s КБ (%d%%), табличное проÑтранÑтво %d/%d" -#: pg_basebackup.c:894 +#: pg_basebackup.c:910 #, c-format msgid "transfer rate \"%s\" is not a valid value" msgstr "неверное значение (\"%s\") Ð´Ð»Ñ ÑкороÑти передачи данных" -#: pg_basebackup.c:896 +#: pg_basebackup.c:912 #, c-format msgid "invalid transfer rate \"%s\": %m" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑкороÑть передачи данных \"%s\": %m" -#: pg_basebackup.c:903 +#: pg_basebackup.c:919 #, c-format msgid "transfer rate must be greater than zero" msgstr "ÑкороÑть передачи должна быть больше 0" -#: pg_basebackup.c:933 +#: pg_basebackup.c:949 #, c-format msgid "invalid --max-rate unit: \"%s\"" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ†Ð° Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð¸Ñ Ð² --max-rate: \"%s\"" -#: pg_basebackup.c:937 +#: pg_basebackup.c:953 #, c-format msgid "transfer rate \"%s\" exceeds integer range" msgstr "ÑкороÑть передачи \"%s\" вне целочиÑленного диапазона" -#: pg_basebackup.c:944 +#: pg_basebackup.c:960 #, c-format msgid "transfer rate \"%s\" is out of range" msgstr "ÑкороÑть передачи \"%s\" вне диапазона" -#: pg_basebackup.c:1040 +#: pg_basebackup.c:1022 #, c-format msgid "could not get COPY data stream: %s" msgstr "не удалоÑÑŒ получить поток данных COPY: %s" -#: pg_basebackup.c:1057 pg_recvlogical.c:438 pg_recvlogical.c:610 -#: receivelog.c:981 +#: pg_basebackup.c:1039 pg_recvlogical.c:449 pg_recvlogical.c:625 +#: receivelog.c:973 #, c-format msgid "could not read COPY data: %s" msgstr "не удалоÑÑŒ прочитать данные COPY: %s" -#: pg_basebackup.c:1061 +#: pg_basebackup.c:1043 #, c-format msgid "background process terminated unexpectedly" msgstr "фоновый процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾" -#: pg_basebackup.c:1132 +#: pg_basebackup.c:1114 #, c-format msgid "cannot inject manifest into a compressed tar file" msgstr "манифеÑÑ‚ Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ð½ÐµÐ´Ñ€Ð¸Ñ‚ÑŒ в Ñжатый архив tar" -#: pg_basebackup.c:1133 +#: pg_basebackup.c:1115 #, c-format msgid "" "Use client-side compression, send the output to a directory rather than " @@ -831,24 +962,24 @@ msgstr "" "Примените Ñжатие на Ñтороне клиента, передайте вывод в каталог, а не в " "Ñтандартный вывод, или иÑпользуйте %s." -#: pg_basebackup.c:1149 +#: pg_basebackup.c:1131 #, c-format msgid "cannot parse archive \"%s\"" msgstr "обработать архив \"%s\" невозможно" -#: pg_basebackup.c:1150 +#: pg_basebackup.c:1132 #, c-format msgid "Only tar archives can be parsed." msgstr "Возможна обработка только архивов tar." -#: pg_basebackup.c:1152 +#: pg_basebackup.c:1134 #, c-format msgid "Plain format requires pg_basebackup to parse the archive." msgstr "" "Когда иÑпользуетÑÑ Ð¿Ñ€Ð¾Ñтой формат, программа pg_basebackup должна обработать " "архив." -#: pg_basebackup.c:1154 +#: pg_basebackup.c:1136 #, c-format msgid "" "Using - as the output directory requires pg_basebackup to parse the archive." @@ -856,89 +987,119 @@ msgstr "" "Когда в качеÑтве выходного каталога иÑпользуетÑÑ \"-\", программа " "pg_basebackup должна обработать архив." -#: pg_basebackup.c:1156 +#: pg_basebackup.c:1138 #, c-format msgid "The -R option requires pg_basebackup to parse the archive." msgstr "" "Когда иÑпользуетÑÑ ÐºÐ»ÑŽÑ‡ -R, программа pg_basebackup должна обработать архив." -#: pg_basebackup.c:1367 +#: pg_basebackup.c:1357 #, c-format msgid "archives must precede manifest" msgstr "архивы должны предшеÑтвовать манифеÑту" -#: pg_basebackup.c:1382 +#: pg_basebackup.c:1372 #, c-format msgid "invalid archive name: \"%s\"" msgstr "неверное Ð¸Ð¼Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð°: \"%s\"" -#: pg_basebackup.c:1454 +#: pg_basebackup.c:1444 #, c-format msgid "unexpected payload data" msgstr "неожиданно получены данные" -#: pg_basebackup.c:1597 +#: pg_basebackup.c:1587 #, c-format msgid "empty COPY message" msgstr "пуÑтое Ñообщение COPY" -#: pg_basebackup.c:1599 +#: pg_basebackup.c:1589 #, c-format msgid "malformed COPY message of type %d, length %zu" msgstr "неправильное Ñообщение COPY типа %d, длины %zu" -#: pg_basebackup.c:1797 +#: pg_basebackup.c:1789 #, c-format msgid "incompatible server version %s" msgstr "неÑовмеÑÑ‚Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñервера %s" -#: pg_basebackup.c:1813 +#: pg_basebackup.c:1805 #, c-format msgid "Use -X none or -X fetch to disable log streaming." msgstr "Укажите -X none или -X fetch Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ñ€Ð°Ð½ÑлÑции журнала." -#: pg_basebackup.c:1881 +#: pg_basebackup.c:1841 +#, c-format +msgid "server does not support incremental backup" +msgstr "Ñервер не поддерживает инкрементальное копирование" + +#: pg_basebackup.c:1850 pg_basebackup.c:2008 pg_recvlogical.c:272 +#: receivelog.c:543 receivelog.c:582 streamutil.c:367 streamutil.c:441 +#: streamutil.c:493 streamutil.c:581 streamutil.c:733 streamutil.c:778 +#, c-format +msgid "could not send replication command \"%s\": %s" +msgstr "не удалоÑÑŒ передать команду репликации \"%s\": %s" + +#: pg_basebackup.c:1856 pg_basebackup.c:1883 +#, c-format +msgid "could not upload manifest: %s" +msgstr "не удалоÑÑŒ загрузить манифеÑÑ‚ на Ñервер: %s" + +#: pg_basebackup.c:1859 pg_basebackup.c:1886 +#, c-format +msgid "could not upload manifest: unexpected status %s" +msgstr "не удалоÑÑŒ загрузить манифеÑÑ‚ на Ñервер: неожиданное ÑоÑтоÑние %s" + +#: pg_basebackup.c:1867 +#, c-format +msgid "could not send COPY data: %s" +msgstr "не удалоÑÑŒ отправить данные COPY: %s" + +#: pg_basebackup.c:1877 +#, c-format +msgid "could not send end-of-COPY: %s" +msgstr "не удалоÑÑŒ отправить Ñообщение \"конец COPY\": %s" + +#: pg_basebackup.c:1892 +#, c-format +msgid "unexpected extra result while sending manifest" +msgstr "неожиданный лишний результат при передаче манифеÑта" + +#: pg_basebackup.c:1950 #, c-format msgid "backup targets are not supported by this server version" msgstr "получатели копий не поддерживаютÑÑ Ð´Ð°Ð½Ð½Ð¾Ð¹ верÑией Ñервера" -#: pg_basebackup.c:1884 +#: pg_basebackup.c:1953 #, c-format msgid "recovery configuration cannot be written when a backup target is used" msgstr "" "при иÑпользовании Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ запиÑать конфигурацию воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ " "нельзÑ" -#: pg_basebackup.c:1911 +#: pg_basebackup.c:1980 #, c-format msgid "server does not support server-side compression" msgstr "Ñервер не поддерживает Ñжатие на Ñтороне Ñервера" -#: pg_basebackup.c:1921 +#: pg_basebackup.c:1990 #, c-format msgid "initiating base backup, waiting for checkpoint to complete" msgstr "" "начинаетÑÑ Ð±Ð°Ð·Ð¾Ð²Ð¾Ðµ резервное копирование, ожидаетÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ðµ контрольной " "точки" -#: pg_basebackup.c:1925 +#: pg_basebackup.c:1994 #, c-format msgid "waiting for checkpoint" msgstr "ожидание контрольной точки" -#: pg_basebackup.c:1938 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588 -#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504 -#: streamutil.c:656 streamutil.c:701 -#, c-format -msgid "could not send replication command \"%s\": %s" -msgstr "не удалоÑÑŒ передать команду репликации \"%s\": %s" - -#: pg_basebackup.c:1946 +#: pg_basebackup.c:2016 #, c-format msgid "could not initiate base backup: %s" msgstr "не удалоÑÑŒ инициализировать базовое резервное копирование: %s" -#: pg_basebackup.c:1949 +#: pg_basebackup.c:2019 #, c-format msgid "" "server returned unexpected response to BASE_BACKUP command; got %d rows and " @@ -947,123 +1108,130 @@ msgstr "" "Ñервер вернул неожиданный ответ на команду BASE_BACKUP; получено Ñтрок: %d, " "полей: %d, а ожидалоÑÑŒ Ñтрок: %d, полей: %d" -#: pg_basebackup.c:1955 +#: pg_basebackup.c:2025 #, c-format msgid "checkpoint completed" msgstr "ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° завершена" -#: pg_basebackup.c:1970 +#: pg_basebackup.c:2039 #, c-format msgid "write-ahead log start point: %s on timeline %u" msgstr "ÑÑ‚Ð°Ñ€Ñ‚Ð¾Ð²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° в журнале предзапиÑи: %s на линии времени %u" -#: pg_basebackup.c:1978 +#: pg_basebackup.c:2047 #, c-format msgid "could not get backup header: %s" msgstr "не удалоÑÑŒ получить заголовок резервной копии: %s" -#: pg_basebackup.c:1981 +#: pg_basebackup.c:2050 #, c-format msgid "no data returned from server" msgstr "Ñервер не вернул данные" -#: pg_basebackup.c:2016 +#: pg_basebackup.c:2093 #, c-format msgid "can only write single tablespace to stdout, database has %d" msgstr "" "в stdout можно вывеÑти только одно табличное проÑтранÑтво, вÑего в СУБД их %d" -#: pg_basebackup.c:2029 +#: pg_basebackup.c:2106 #, c-format msgid "starting background WAL receiver" msgstr "запуÑк фонового процеÑÑа ÑÑ‡Ð¸Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ WAL" -#: pg_basebackup.c:2111 +#: pg_basebackup.c:2189 #, c-format msgid "backup failed: %s" msgstr "ошибка при Ñоздании копии: %s" -#: pg_basebackup.c:2114 +#: pg_basebackup.c:2192 #, c-format msgid "no write-ahead log end position returned from server" msgstr "Ñервер не передал конечную позицию в журнале предзапиÑи" -#: pg_basebackup.c:2117 +#: pg_basebackup.c:2195 #, c-format msgid "write-ahead log end point: %s" msgstr "ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° в журнале предзапиÑи: %s" -#: pg_basebackup.c:2128 +#: pg_basebackup.c:2206 #, c-format msgid "checksum error occurred" msgstr "выÑвлена ошибка контрольной Ñуммы" -#: pg_basebackup.c:2133 +#: pg_basebackup.c:2211 #, c-format msgid "final receive failed: %s" msgstr "ошибка в конце передачи: %s" -#: pg_basebackup.c:2157 +#: pg_basebackup.c:2235 #, c-format msgid "waiting for background process to finish streaming ..." msgstr "ожидание Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð²Ð¾Ð¹ передачи фоновым процеÑÑом..." -#: pg_basebackup.c:2161 +#: pg_basebackup.c:2239 #, c-format msgid "could not send command to background pipe: %m" msgstr "не удалоÑÑŒ отправить команду в канал фонового процеÑÑа: %m" -#: pg_basebackup.c:2166 +#: pg_basebackup.c:2244 #, c-format msgid "could not wait for child process: %m" msgstr "Ñбой при ожидании дочернего процеÑÑа: %m" -#: pg_basebackup.c:2168 +#: pg_basebackup.c:2246 #, c-format msgid "child %d died, expected %d" msgstr "завершилÑÑ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ð¹ процеÑÑ %d вмеÑто ожидаемого %d" -#: pg_basebackup.c:2170 streamutil.c:91 streamutil.c:197 +#: pg_basebackup.c:2248 streamutil.c:92 streamutil.c:207 streamutil.c:319 #, c-format msgid "%s" msgstr "%s" -#: pg_basebackup.c:2190 +#: pg_basebackup.c:2268 #, c-format msgid "could not wait for child thread: %m" msgstr "Ñбой при ожидании дочернего потока: %m" -#: pg_basebackup.c:2195 +#: pg_basebackup.c:2273 #, c-format msgid "could not get child thread exit status: %m" msgstr "не удалоÑÑŒ получить ÑоÑтоÑние Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð´Ð¾Ñ‡ÐµÑ€Ð½ÐµÐ³Ð¾ потока: %m" -#: pg_basebackup.c:2198 +#: pg_basebackup.c:2276 #, c-format msgid "child thread exited with error %u" msgstr "дочерний поток завершилÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ %u" -#: pg_basebackup.c:2227 +#: pg_basebackup.c:2305 #, c-format msgid "syncing data to disk ..." msgstr "Ñохранение данных на диÑке..." -#: pg_basebackup.c:2252 +#: pg_basebackup.c:2330 #, c-format msgid "renaming backup_manifest.tmp to backup_manifest" msgstr "переименование backup_manifest.tmp в backup_manifest" -#: pg_basebackup.c:2272 +#: pg_basebackup.c:2350 #, c-format msgid "base backup completed" msgstr "базовое резервное копирование завершено" -#: pg_basebackup.c:2361 +#: pg_basebackup.c:2436 +#, c-format +msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" +msgstr "" +"неверный аргумент режима контрольных точек \"%s\"; должен быть \"fast\" или " +"\"spread\"" + +#: pg_basebackup.c:2454 #, c-format msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" msgstr "неверный формат вывода \"%s\", должен быть \"plain\" или \"tar\"" -#: pg_basebackup.c:2405 +#: pg_basebackup.c:2535 #, c-format msgid "" "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" @@ -1071,137 +1239,167 @@ msgstr "" "неверный аргумент Ð´Ð»Ñ wal-method — \"%s\", допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ \"fetch\", " "\"stream\" или \"none\"" -#: pg_basebackup.c:2435 -#, c-format -msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" -msgstr "" -"неверный аргумент режима контрольных точек \"%s\"; должен быть \"fast\" или " -"\"spread\"" - -#: pg_basebackup.c:2486 pg_basebackup.c:2498 pg_basebackup.c:2520 -#: pg_basebackup.c:2532 pg_basebackup.c:2538 pg_basebackup.c:2590 -#: pg_basebackup.c:2601 pg_basebackup.c:2611 pg_basebackup.c:2617 -#: pg_basebackup.c:2624 pg_basebackup.c:2636 pg_basebackup.c:2648 -#: pg_basebackup.c:2656 pg_basebackup.c:2669 pg_basebackup.c:2675 -#: pg_basebackup.c:2684 pg_basebackup.c:2696 pg_basebackup.c:2707 -#: pg_basebackup.c:2715 pg_receivewal.c:814 pg_receivewal.c:826 -#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849 -#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849 -#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873 -#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894 -#: pg_recvlogical.c:901 pg_recvlogical.c:908 +#: pg_basebackup.c:2574 pg_basebackup.c:2586 pg_basebackup.c:2608 +#: pg_basebackup.c:2620 pg_basebackup.c:2626 pg_basebackup.c:2678 +#: pg_basebackup.c:2689 pg_basebackup.c:2699 pg_basebackup.c:2705 +#: pg_basebackup.c:2712 pg_basebackup.c:2724 pg_basebackup.c:2736 +#: pg_basebackup.c:2744 pg_basebackup.c:2757 pg_basebackup.c:2763 +#: pg_basebackup.c:2772 pg_basebackup.c:2784 pg_basebackup.c:2795 +#: pg_basebackup.c:2803 pg_createsubscriber.c:2038 pg_createsubscriber.c:2048 +#: pg_createsubscriber.c:2056 pg_createsubscriber.c:2084 +#: pg_createsubscriber.c:2116 pg_receivewal.c:748 pg_receivewal.c:760 +#: pg_receivewal.c:767 pg_receivewal.c:776 pg_receivewal.c:783 +#: pg_receivewal.c:793 pg_recvlogical.c:853 pg_recvlogical.c:865 +#: pg_recvlogical.c:875 pg_recvlogical.c:882 pg_recvlogical.c:889 +#: pg_recvlogical.c:896 pg_recvlogical.c:903 pg_recvlogical.c:910 +#: pg_recvlogical.c:917 pg_recvlogical.c:924 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." -#: pg_basebackup.c:2496 pg_receivewal.c:824 pg_recvlogical.c:847 +#: pg_basebackup.c:2584 pg_createsubscriber.c:2046 pg_receivewal.c:758 +#: pg_recvlogical.c:863 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")" -#: pg_basebackup.c:2519 +#: pg_basebackup.c:2607 #, c-format msgid "cannot specify both format and backup target" msgstr "указать и формат, и Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ одновременно нельзÑ" -#: pg_basebackup.c:2531 +#: pg_basebackup.c:2619 #, c-format msgid "must specify output directory or backup target" msgstr "необходимо указать выходной каталог или Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð¿Ð¸Ð¸" -#: pg_basebackup.c:2537 +#: pg_basebackup.c:2625 #, c-format msgid "cannot specify both output directory and backup target" msgstr "указать и выходной каталог, и Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð¿Ð¸Ð¸ одновременно нельзÑ" -#: pg_basebackup.c:2567 pg_receivewal.c:868 +#: pg_basebackup.c:2655 pg_receivewal.c:802 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "нераÑпознанный алгоритм ÑжатиÑ: \"%s\"" -#: pg_basebackup.c:2573 pg_receivewal.c:875 +#: pg_basebackup.c:2661 pg_receivewal.c:809 #, c-format msgid "invalid compression specification: %s" msgstr "неправильное указание ÑжатиÑ: %s" -#: pg_basebackup.c:2589 +#: pg_basebackup.c:2677 #, c-format msgid "" "client-side compression is not possible when a backup target is specified" msgstr "Ñжатие на Ñтороне клиента невозможно при указании Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð¿Ð¸Ð¸" -#: pg_basebackup.c:2600 +#: pg_basebackup.c:2688 #, c-format msgid "only tar mode backups can be compressed" msgstr "ÑжиматьÑÑ Ð¼Ð¾Ð³ÑƒÑ‚ только резервные копии в архиве tar" -#: pg_basebackup.c:2610 +#: pg_basebackup.c:2698 #, c-format msgid "WAL cannot be streamed when a backup target is specified" msgstr "Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð²Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° WAL невозможна при указании Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ ÐºÐ¾Ð¿Ð¸Ð¸" -#: pg_basebackup.c:2616 +#: pg_basebackup.c:2704 #, c-format msgid "cannot stream write-ahead logs in tar mode to stdout" msgstr "транÑлировать журналы предзапиÑи в режиме tar в поток stdout нельзÑ" -#: pg_basebackup.c:2623 +#: pg_basebackup.c:2711 #, c-format msgid "replication slots can only be used with WAL streaming" msgstr "Ñлоты репликации можно иÑпользовать только при потоковой передаче WAL" -#: pg_basebackup.c:2635 +#: pg_basebackup.c:2723 #, c-format msgid "--no-slot cannot be used with slot name" msgstr "--no-slot Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ñлота" #. translator: second %s is an option name -#: pg_basebackup.c:2646 pg_receivewal.c:840 +#: pg_basebackup.c:2734 pg_receivewal.c:774 #, c-format msgid "%s needs a slot to be specified using --slot" msgstr "Ð´Ð»Ñ %s необходимо задать Ñлот Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ параметра --slot" -#: pg_basebackup.c:2654 pg_basebackup.c:2694 pg_basebackup.c:2705 -#: pg_basebackup.c:2713 +#: pg_basebackup.c:2742 pg_basebackup.c:2782 pg_basebackup.c:2793 +#: pg_basebackup.c:2801 #, c-format msgid "%s and %s are incompatible options" msgstr "параметры %s и %s неÑовмеÑтимы" -#: pg_basebackup.c:2668 +#: pg_basebackup.c:2756 #, c-format msgid "WAL directory location cannot be specified along with a backup target" msgstr "раÑположение каталога WAL Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ вмеÑте Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»ÐµÐ¼ копии" -#: pg_basebackup.c:2674 +#: pg_basebackup.c:2762 #, c-format msgid "WAL directory location can only be specified in plain mode" msgstr "раÑположение каталога WAL можно указать только в режиме plain" -#: pg_basebackup.c:2683 +#: pg_basebackup.c:2771 #, c-format msgid "WAL directory location must be an absolute path" msgstr "раÑположение каталога WAL должно определÑтьÑÑ Ð°Ð±Ñолютным путём" -#: pg_basebackup.c:2784 +#: pg_basebackup.c:2871 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать ÑимволичеÑкую ÑÑылку \"%s\": %m" -#: pg_basebackup.c:2786 +#: pg_createsubscriber.c:169 #, c-format -msgid "symlinks are not supported on this platform" -msgstr "ÑимволичеÑкие ÑÑылки не поддерживаютÑÑ Ð² Ñтой ОС" +msgid "failed after the end of recovery" +msgstr "ошибка поÑле Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð²Ð¾ÑÑтановлениÑ" -#: pg_receivewal.c:79 +#: pg_createsubscriber.c:170 #, c-format msgid "" -"%s receives PostgreSQL streaming write-ahead logs.\n" +"The target server cannot be used as a physical replica anymore. You must " +"recreate the physical replica before continuing." +msgstr "" +"Целевой Ñервер больше не может иÑпользоватьÑÑ ÐºÐ°Ðº физичеÑÐºÐ°Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°. Чтобы " +"продолжить, физичеÑкую реплику необходимо переÑоздать." + +#: pg_createsubscriber.c:198 +#, c-format +msgid "" +"publication \"%s\" created in database \"%s\" on primary was left behind" +msgstr "на главном Ñервере оÑталаÑÑŒ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\", ÑÐ¾Ð·Ð´Ð°Ð½Ð½Ð°Ñ Ð² базе \"%s\"" + +#: pg_createsubscriber.c:200 +#, c-format +msgid "Drop this publication before trying again." +msgstr "Удалите Ñту публикацию и попробуйте повторить операцию." + +#: pg_createsubscriber.c:204 +#, c-format +msgid "" +"replication slot \"%s\" created in database \"%s\" on primary was left behind" +msgstr "" +"на главном Ñервере оÑталÑÑ Ñлот репликации \"%s\", Ñозданный в базе \"%s\"" + +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1261 +#, c-format +msgid "Drop this replication slot soon to avoid retention of WAL files." +msgstr "" +"Удалите Ñтот Ñлот репликации незамедлительно во избежание Ð½Ð°ÐºÐ¾Ð¿Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² " +"WAL." + +#: pg_createsubscriber.c:219 +#, c-format +msgid "" +"%s creates a new logical replica from a standby server.\n" "\n" msgstr "" -"%s получает транÑлируемые журналы предзапиÑи PostgreSQL.\n" +"%s превращает резервный Ñервер в логичеÑкую реплику.\n" "\n" -#: pg_receivewal.c:83 pg_recvlogical.c:84 +#: pg_createsubscriber.c:223 pg_receivewal.c:81 pg_recvlogical.c:92 #, c-format msgid "" "\n" @@ -1210,7 +1408,681 @@ msgstr "" "\n" "Параметры:\n" -#: pg_receivewal.c:84 +#: pg_createsubscriber.c:224 +#, c-format +msgid "" +" -d, --database=DBNAME database in which to create a " +"subscription\n" +msgstr "" +" -d, --database=ИМЯ_БД база, в которой будет Ñоздана подпиÑка\n" + +#: pg_createsubscriber.c:225 +#, c-format +msgid "" +" -D, --pgdata=DATADIR location for the subscriber data " +"directory\n" +msgstr "" +" -D, --pgdata=КÐТ_ДÐÐÐЫХ раÑположение каталога данных подпиÑчика\n" + +#: pg_createsubscriber.c:226 +#, c-format +msgid "" +" -n, --dry-run dry run, just show what would be done\n" +msgstr "" +" -n, --dry-run показать, какие дейÑÑ‚Ð²Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ выполнены,\n" +" но не выполнÑть их\n" + +#: pg_createsubscriber.c:227 +#, c-format +msgid " -p, --subscriber-port=PORT subscriber port number (default %s)\n" +msgstr "" +" -p, --subscriber-port=ПОРТ номер порта подпиÑчика (по умолчанию: %s)\n" + +#: pg_createsubscriber.c:228 +#, c-format +msgid " -P, --publisher-server=CONNSTR publisher connection string\n" +msgstr "" +" -P, --publisher-server=СТРОКРÑтрока Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу публикации\n" + +#: pg_createsubscriber.c:229 +#, c-format +msgid "" +" -s, --socketdir=DIR socket directory to use (default current " +"dir.)\n" +msgstr "" +" -s, --socketdir=КÐТÐЛОГ каталог Ñокетов (по умолчанию текущий)\n" + +#: pg_createsubscriber.c:230 +#, c-format +msgid " -t, --recovery-timeout=SECS seconds to wait for recovery to end\n" +msgstr "" +" -t, --recovery-timeout=СЕК Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð²Ð¾ÑÑтановлениÑ\n" + +#: pg_createsubscriber.c:231 +#, c-format +msgid " -U, --subscriber-username=NAME user name for subscriber connection\n" +msgstr "" +" -U, --subscriber-username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ " +"подпиÑчика\n" + +#: pg_createsubscriber.c:232 +#, c-format +msgid " -v, --verbose output verbose messages\n" +msgstr " -v, --verbose выводить подробные ÑообщениÑ\n" + +#: pg_createsubscriber.c:233 +#, c-format +msgid "" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr "" +" --config-file=ИМЯ_ФÐЙЛРиÑпользовать указанный оÑновной файл\n" +" конфигурации Ñервера при запуÑке целевого\n" +" клаÑтера\n" + +#: pg_createsubscriber.c:235 +#, c-format +msgid " --publication=NAME publication name\n" +msgstr " --publication=ИМЯ Ð¸Ð¼Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸\n" + +#: pg_createsubscriber.c:236 +#, c-format +msgid " --replication-slot=NAME replication slot name\n" +msgstr " --replication-slot=ИМЯ Ð¸Ð¼Ñ Ñлота репликации\n" + +#: pg_createsubscriber.c:237 +#, c-format +msgid " --subscription=NAME subscription name\n" +msgstr " --subscription=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки\n" + +#: pg_createsubscriber.c:238 +#, c-format +msgid "" +" -V, --version output version information, then exit\n" +msgstr " -V, --version показать верÑию и выйти\n" + +#: pg_createsubscriber.c:239 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help показать Ñту Ñправку и выйти\n" + +#: pg_createsubscriber.c:282 +#, c-format +msgid "could not parse connection string: %s" +msgstr "не удалоÑÑŒ разобрать Ñтроку подключениÑ: %s" + +#: pg_createsubscriber.c:359 +#, c-format +msgid "" +"program \"%s\" is needed by %s but was not found in the same directory as " +"\"%s\"" +msgstr "программа \"%s\" нужна Ð´Ð»Ñ %s, но она не найдена в каталоге \"%s\"" + +#: pg_createsubscriber.c:362 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "" +"программа \"%s\" найдена программой \"%s\", но её верÑÐ¸Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð¾Ñ‚ " +"верÑии %s" + +#: pg_createsubscriber.c:382 +#, c-format +msgid "checking if directory \"%s\" is a cluster data directory" +msgstr "проверÑетÑÑ, ÑвлÑетÑÑ Ð»Ð¸ каталог \"%s\" каталогом данных клаÑтера" + +#: pg_createsubscriber.c:388 +#, c-format +msgid "data directory \"%s\" does not exist" +msgstr "каталог данных \"%s\" не ÑущеÑтвует" + +#: pg_createsubscriber.c:396 +#, c-format +msgid "directory \"%s\" is not a database cluster directory" +msgstr "каталог \"%s\" не ÑвлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼ клаÑтера баз данных" + +#: pg_createsubscriber.c:513 +#, c-format +msgid "connection to database failed: %s" +msgstr "не удалоÑÑŒ подключитьÑÑ Ðº базе: %s" + +#: pg_createsubscriber.c:526 +#, c-format +msgid "could not clear search_path: %s" +msgstr "не удалоÑÑŒ очиÑтить search_path: %s" + +#: pg_createsubscriber.c:566 +#, c-format +msgid "getting system identifier from publisher" +msgstr "получение идентификатора ÑиÑтемы Ñ Ñервера публикации" + +#: pg_createsubscriber.c:573 +#, c-format +msgid "could not get system identifier: %s" +msgstr "не удалоÑÑŒ получить идентификатор ÑиÑтемы: %s" + +#: pg_createsubscriber.c:579 +#, c-format +msgid "could not get system identifier: got %d rows, expected %d row" +msgstr "" +"не удалоÑÑŒ получить идентификатор ÑиÑтемы; получено Ñтрок: %d, ожидалоÑÑŒ: %d" + +#: pg_createsubscriber.c:586 +#, c-format +msgid "system identifier is %llu on publisher" +msgstr "идентификатор ÑиÑтемы на Ñтороне публикации: %llu" + +#: pg_createsubscriber.c:607 +#, c-format +msgid "getting system identifier from subscriber" +msgstr "получение идентификатора ÑиÑтемы Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñчика" + +#: pg_createsubscriber.c:611 pg_createsubscriber.c:641 +#, c-format +msgid "control file appears to be corrupt" +msgstr "управлÑющий файл, по-видимому, иÑпорчен" + +#: pg_createsubscriber.c:615 pg_createsubscriber.c:656 +#, c-format +msgid "system identifier is %llu on subscriber" +msgstr "идентификатор ÑиÑтемы на подпиÑчике: %llu" + +#: pg_createsubscriber.c:637 +#, c-format +msgid "modifying system identifier of subscriber" +msgstr "изменение идентификатора ÑиÑтемы на подпиÑчике" + +#: pg_createsubscriber.c:659 +#, c-format +msgid "running pg_resetwal on the subscriber" +msgstr "запуÑк pg_resetwal на подпиÑчике" + +#: pg_createsubscriber.c:671 +#, c-format +msgid "subscriber successfully changed the system identifier" +msgstr "идентификатор ÑиÑтемы на подпиÑчике уÑпешно изменён" + +#: pg_createsubscriber.c:673 +#, c-format +msgid "could not change system identifier of subscriber: %s" +msgstr "изменить идентификатор ÑиÑтемы на подпиÑчике не удалоÑÑŒ: %s" + +#: pg_createsubscriber.c:697 +#, c-format +msgid "could not obtain database OID: %s" +msgstr "получить OID базы данных не удалоÑÑŒ: %s" + +#: pg_createsubscriber.c:704 +#, c-format +msgid "could not obtain database OID: got %d rows, expected %d row" +msgstr "получить OID базы данных не удалоÑÑŒ; получено Ñтрок: %d, ожидалоÑÑŒ: %d" + +#: pg_createsubscriber.c:776 +#, c-format +msgid "create replication slot \"%s\" on publisher" +msgstr "ÑоздаётÑÑ Ñлот репликации \"%s\" на подпиÑчике" + +#: pg_createsubscriber.c:796 +#, c-format +msgid "could not write an additional WAL record: %s" +msgstr "не удалоÑÑŒ запиÑать дополнительную запиÑÑŒ WAL: %s" + +#: pg_createsubscriber.c:822 +#, c-format +msgid "could not obtain recovery progress: %s" +msgstr "не удалоÑÑŒ получить ÑоÑтоÑние воÑÑтановлениÑ: %s" + +#: pg_createsubscriber.c:854 +#, c-format +msgid "checking settings on publisher" +msgstr "проверка параметров на Ñтороне публикации" + +#: pg_createsubscriber.c:864 +#, c-format +msgid "primary server cannot be in recovery" +msgstr "главный Ñервер не должен быть в ÑоÑтоÑнии воÑÑтановлениÑ" + +#: pg_createsubscriber.c:888 +#, c-format +msgid "could not obtain publisher settings: %s" +msgstr "не удалоÑÑŒ получить параметры Ñ Ñервера публикации: %s" + +#: pg_createsubscriber.c:914 +#, c-format +msgid "publisher requires wal_level >= \"logical\"" +msgstr "на Ñтороне публикации требуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ wal_level >= \"logical\"" + +#: pg_createsubscriber.c:920 +#, c-format +msgid "publisher requires %d replication slots, but only %d remain" +msgstr "" +"на Ñтороне публикации требуетÑÑ Ñлотов репликации: %d, но доÑтупно вÑего %d" + +#: pg_createsubscriber.c:922 pg_createsubscriber.c:931 +#: pg_createsubscriber.c:1028 pg_createsubscriber.c:1037 +#: pg_createsubscriber.c:1046 +#, c-format +msgid "Increase the configuration parameter \"%s\" to at least %d." +msgstr "Увеличьте значение параметра конфигурации \"%s\" как минимум до %d." + +#: pg_createsubscriber.c:929 +#, c-format +msgid "publisher requires %d WAL sender processes, but only %d remain" +msgstr "" +"на Ñтороне публикации требуетÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑов-передатчиков WAL: %d, но доÑтупно " +"вÑего %d" + +#: pg_createsubscriber.c:938 +#, c-format +msgid "two_phase option will not be enabled for replication slots" +msgstr "параметр two_phase Ð´Ð»Ñ Ñлотов репликации не будет включён" + +#: pg_createsubscriber.c:939 +#, c-format +msgid "" +"Subscriptions will be created with the two_phase option disabled. Prepared " +"transactions will be replicated at COMMIT PREPARED." +msgstr "" +"ПодпиÑки будут Ñозданы Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ñ‘Ð½Ð½Ñ‹Ð¼ параметром two_phase. Подготовленные " +"транзакции будут реплицироватьÑÑ Ð² момент Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ COMMIT PREPARED." + +#: pg_createsubscriber.c:971 +#, c-format +msgid "checking settings on subscriber" +msgstr "проверка параметров на подпиÑчике" + +#: pg_createsubscriber.c:978 +#, c-format +msgid "target server must be a standby" +msgstr "целевой Ñервер должен быть резервным" + +#: pg_createsubscriber.c:1002 +#, c-format +msgid "could not obtain subscriber settings: %s" +msgstr "получить параметры подпиÑчика не удалоÑÑŒ: %s" + +#: pg_createsubscriber.c:1026 +#, c-format +msgid "subscriber requires %d replication slots, but only %d remain" +msgstr "подпиÑчику требуетÑÑ Ñлотов репликации: %d, но доÑтупно вÑего %d" + +#: pg_createsubscriber.c:1035 +#, c-format +msgid "subscriber requires %d logical replication workers, but only %d remain" +msgstr "" +"подпиÑчику требуетÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÑÑов логичеÑкой репликации: %d, но доÑтупно вÑего " +"%d" + +#: pg_createsubscriber.c:1044 +#, c-format +msgid "subscriber requires %d worker processes, but only %d remain" +msgstr "подпиÑчику требуетÑÑ Ñ€Ð°Ð±Ð¾Ñ‡Ð¸Ñ… процеÑÑов: %d, но доÑтупно вÑего %d" + +#: pg_createsubscriber.c:1079 +#, c-format +msgid "dropping subscription \"%s\" in database \"%s\"" +msgstr "удаление подпиÑки \"%s\" в базе \"%s\"" + +#: pg_createsubscriber.c:1088 +#, c-format +msgid "could not drop subscription \"%s\": %s" +msgstr "удалить подпиÑку \"%s\" не получилоÑÑŒ: %s" + +#: pg_createsubscriber.c:1123 +#, c-format +msgid "could not obtain pre-existing subscriptions: %s" +msgstr "получить уже ÑущеÑтвующие подпиÑки не удалоÑÑŒ: %s" + +#: pg_createsubscriber.c:1259 +#, c-format +msgid "could not drop replication slot \"%s\" on primary" +msgstr "удалить Ñлот репликации \"%s\" на главном Ñервере не получилоÑÑŒ" + +#: pg_createsubscriber.c:1293 +#, c-format +msgid "could not obtain failover replication slot information: %s" +msgstr "получить информацию о переноÑимом Ñлоте репликации не удалоÑÑŒ: %s" + +#: pg_createsubscriber.c:1295 pg_createsubscriber.c:1304 +#, c-format +msgid "" +"Drop the failover replication slots on subscriber soon to avoid retention of " +"WAL files." +msgstr "" +"Удалите переноÑимые Ñлоты репликации на подпиÑчике незамедлительно во " +"избежание Ð½Ð°ÐºÐ¾Ð¿Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² WAL." + +#: pg_createsubscriber.c:1303 +#, c-format +msgid "could not drop failover replication slot" +msgstr "удалить переноÑимый Ñлот репликации не получилоÑÑŒ" + +#: pg_createsubscriber.c:1325 +#, c-format +msgid "creating the replication slot \"%s\" in database \"%s\"" +msgstr "Ñоздание Ñлота репликации \"%s\" в базе \"%s\"" + +#: pg_createsubscriber.c:1343 +#, c-format +msgid "could not create replication slot \"%s\" in database \"%s\": %s" +msgstr "Ñоздать Ñлот репликации \"%s\" в базе \"%s\" не удалоÑÑŒ: %s" + +#: pg_createsubscriber.c:1373 +#, c-format +msgid "dropping the replication slot \"%s\" in database \"%s\"" +msgstr "удаление Ñлота репликации \"%s\" в базе \"%s\"" + +#: pg_createsubscriber.c:1389 +#, c-format +msgid "could not drop replication slot \"%s\" in database \"%s\": %s" +msgstr "удалить Ñлот репликации \"%s\" в базе \"%s\" не получилоÑÑŒ: %s" + +#: pg_createsubscriber.c:1410 +#, c-format +msgid "pg_ctl failed with exit code %d" +msgstr "команда pg_ctl завершилаÑÑŒ Ñ ÐºÐ¾Ð´Ð¾Ð¼ ошибки %d" + +#: pg_createsubscriber.c:1415 +#, c-format +msgid "pg_ctl was terminated by exception 0x%X" +msgstr "команда pg_ctl была прервана иÑключением 0x%X" + +#: pg_createsubscriber.c:1417 +#, c-format +msgid "" +"See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "" +"ОпиÑание Ñтого шеÑтнадцатеричного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ñ‰Ð¸Ñ‚Ðµ во включаемом C-файле " +"\"ntstatus.h\"" + +#: pg_createsubscriber.c:1419 +#, c-format +msgid "pg_ctl was terminated by signal %d: %s" +msgstr "команда pg_ctl была завершена Ñигналом %d: %s" + +#: pg_createsubscriber.c:1425 +#, c-format +msgid "pg_ctl exited with unrecognized status %d" +msgstr "команда pg_ctl завершилаÑÑŒ Ñ Ð½ÐµÑ€Ð°Ñпознанным кодом ÑоÑтоÑÐ½Ð¸Ñ %d" + +#: pg_createsubscriber.c:1428 +#, c-format +msgid "The failed command was: %s" +msgstr "Ошибку вызвала команда: %s" + +#: pg_createsubscriber.c:1474 +#, c-format +msgid "server was started" +msgstr "Ñервер был запущен" + +#: pg_createsubscriber.c:1489 +#, c-format +msgid "server was stopped" +msgstr "Ñервер был оÑтановлен" + +#: pg_createsubscriber.c:1508 +#, c-format +msgid "waiting for the target server to reach the consistent state" +msgstr "ожидание доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ñ†ÐµÐ»ÐµÐ²Ñ‹Ð¼ Ñервером ÑоглаÑованного ÑоÑтоÑниÑ" + +#: pg_createsubscriber.c:1531 +#, c-format +msgid "recovery timed out" +msgstr "тайм-аут при воÑÑтановлении" + +#: pg_createsubscriber.c:1544 +#, c-format +msgid "server did not end recovery" +msgstr "Ñервер не завершил воÑÑтановление" + +#: pg_createsubscriber.c:1546 +#, c-format +msgid "target server reached the consistent state" +msgstr "целевой Ñервер доÑтиг ÑоглаÑованного ÑоÑтоÑниÑ" + +#: pg_createsubscriber.c:1547 +#, c-format +msgid "" +"If pg_createsubscriber fails after this point, you must recreate the " +"physical replica before continuing." +msgstr "" +"ЕÑли в работе pg_createsubscriber произойдёт Ñбой поÑле Ñтого момента, " +"продолжение возможно только поÑле переÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑкой реплики." + +#: pg_createsubscriber.c:1574 +#, c-format +msgid "could not obtain publication information: %s" +msgstr "получить информацию о публикации не удалоÑÑŒ: %s" + +#: pg_createsubscriber.c:1588 +#, c-format +msgid "publication \"%s\" already exists" +msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\" уже ÑущеÑтвует" + +#: pg_createsubscriber.c:1589 +#, c-format +msgid "Consider renaming this publication before continuing." +msgstr "Чтобы продолжить, её можно переименовать." + +#: pg_createsubscriber.c:1596 +#, c-format +msgid "creating publication \"%s\" in database \"%s\"" +msgstr "ÑоздаётÑÑ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\" в базе \"%s\"" + +#: pg_createsubscriber.c:1609 +#, c-format +msgid "could not create publication \"%s\" in database \"%s\": %s" +msgstr "Ñоздать публикацию \"%s\" в базе \"%s\" не удалоÑÑŒ: %s" + +#: pg_createsubscriber.c:1638 +#, c-format +msgid "dropping publication \"%s\" in database \"%s\"" +msgstr "удалÑетÑÑ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\" в базе \"%s\"" + +#: pg_createsubscriber.c:1652 +#, c-format +msgid "could not drop publication \"%s\" in database \"%s\": %s" +msgstr "удалить публикацию \"%s\" в базе \"%s\" не получилоÑÑŒ: %s" + +#: pg_createsubscriber.c:1698 +#, c-format +msgid "creating subscription \"%s\" in database \"%s\"" +msgstr "ÑоздаётÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñка \"%s\" в базе \"%s\"" + +#: pg_createsubscriber.c:1719 +#, c-format +msgid "could not create subscription \"%s\" in database \"%s\": %s" +msgstr "Ñоздать подпиÑку \"%s\" в базе \"%s\" не удалоÑÑŒ: %s" + +#: pg_createsubscriber.c:1764 +#, c-format +msgid "could not obtain subscription OID: %s" +msgstr "получить OID подпиÑки не удалоÑÑŒ: %s" + +#: pg_createsubscriber.c:1771 +#, c-format +msgid "could not obtain subscription OID: got %d rows, expected %d row" +msgstr "получить OID подпиÑки не удалоÑÑŒ; получено Ñтрок: %d, ожидалоÑÑŒ: %d" + +#: pg_createsubscriber.c:1795 +#, c-format +msgid "" +"setting the replication progress (node name \"%s\", LSN %s) in database " +"\"%s\"" +msgstr "отражение ÑоÑтоÑÐ½Ð¸Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ (Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð° \"%s\", LSN %s) в базе \"%s\"" + +#: pg_createsubscriber.c:1810 +#, c-format +msgid "could not set replication progress for subscription \"%s\": %s" +msgstr "не удалоÑÑŒ передать ÑоÑтоÑние репликации Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки \"%s\": %s" + +#: pg_createsubscriber.c:1841 +#, c-format +msgid "enabling subscription \"%s\" in database \"%s\"" +msgstr "включение подпиÑки \"%s\" в базе \"%s\"" + +#: pg_createsubscriber.c:1853 +#, c-format +msgid "could not enable subscription \"%s\": %s" +msgstr "включить подпиÑку \"%s\" не удалоÑÑŒ: %s" + +#: pg_createsubscriber.c:1945 +#, c-format +msgid "cannot be executed by \"root\"" +msgstr "программу не должен запуÑкать root" + +#: pg_createsubscriber.c:1946 +#, c-format +msgid "You must run %s as the PostgreSQL superuser." +msgstr "ЗапуÑкать %s нужно от имени ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PostgreSQL." + +#: pg_createsubscriber.c:1967 +#, c-format +msgid "database \"%s\" specified more than once" +msgstr "база \"%s\" указана неоднократно" + +#: pg_createsubscriber.c:2008 +#, c-format +msgid "publication \"%s\" specified more than once" +msgstr "Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\" указана неоднократно" + +#: pg_createsubscriber.c:2020 +#, c-format +msgid "replication slot \"%s\" specified more than once" +msgstr "Ñлот репликации \"%s\" указан неоднократно" + +#: pg_createsubscriber.c:2032 +#, c-format +msgid "subscription \"%s\" specified more than once" +msgstr "подпиÑка \"%s\" указана неоднократно" + +#: pg_createsubscriber.c:2055 +#, c-format +msgid "no subscriber data directory specified" +msgstr "каталог данных подпиÑчика не указан" + +#: pg_createsubscriber.c:2066 +#, c-format +msgid "could not determine current directory" +msgstr "не удалоÑÑŒ определить текущий каталог" + +#: pg_createsubscriber.c:2083 +#, c-format +msgid "no publisher connection string specified" +msgstr "Ñтрока Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу публикации не указана" + +#: pg_createsubscriber.c:2087 +#, c-format +msgid "validating publisher connection string" +msgstr "проверÑетÑÑ Ñтрока Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу публикации" + +#: pg_createsubscriber.c:2093 +#, c-format +msgid "validating subscriber connection string" +msgstr "проверÑетÑÑ Ñтрока Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº подпиÑчику" + +#: pg_createsubscriber.c:2098 +#, c-format +msgid "no database was specified" +msgstr "база данных не указана" + +#: pg_createsubscriber.c:2110 +#, c-format +msgid "database name \"%s\" was extracted from the publisher connection string" +msgstr "Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ \"%s\" извлечено из Ñтроки Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу публикации" + +#: pg_createsubscriber.c:2115 +#, c-format +msgid "no database name specified" +msgstr "Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных не указано" + +#: pg_createsubscriber.c:2125 +#, c-format +msgid "wrong number of publication names specified" +msgstr "указано неверное количеÑтво имён публикаций" + +#: pg_createsubscriber.c:2126 +#, c-format +msgid "" +"The number of specified publication names (%d) must match the number of " +"specified database names (%d)." +msgstr "" +"КоличеÑтво указанных имён публикаций (%d) должно Ñовпадать Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтвом " +"указанных имён баз (%d)." + +#: pg_createsubscriber.c:2132 +#, c-format +msgid "wrong number of subscription names specified" +msgstr "указано неверное количеÑтво имён подпиÑок" + +#: pg_createsubscriber.c:2133 +#, c-format +msgid "" +"The number of specified subscription names (%d) must match the number of " +"specified database names (%d)." +msgstr "" +"КоличеÑтво указанных имён подпиÑок (%d) должно Ñовпадать Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтвом " +"указанных имён баз (%d)." + +#: pg_createsubscriber.c:2139 +#, c-format +msgid "wrong number of replication slot names specified" +msgstr "указано неверное количеÑтво имён Ñлотов репликации" + +#: pg_createsubscriber.c:2140 +#, c-format +msgid "" +"The number of specified replication slot names (%d) must match the number of " +"specified database names (%d)." +msgstr "" +"КоличеÑтво указанных имён Ñлотов репликации (%d) должно Ñовпадать Ñ " +"количеÑтвом указанных имён баз (%d)." + +#: pg_createsubscriber.c:2169 +#, c-format +msgid "subscriber data directory is not a copy of the source database cluster" +msgstr "" +"каталог данных подпиÑчика не ÑвлÑетÑÑ ÐºÐ¾Ð¿Ð¸ÐµÐ¹ иÑходного клаÑтера баз данных" + +#: pg_createsubscriber.c:2182 +#, c-format +msgid "standby server is running" +msgstr "резервный Ñервер запущен" + +#: pg_createsubscriber.c:2183 +#, c-format +msgid "Stop the standby server and try again." +msgstr "ОÑтановите резервный Ñервер и повторите попытку." + +#: pg_createsubscriber.c:2192 +#, c-format +msgid "starting the standby server with command-line options" +msgstr "резервный Ñервер запуÑкаетÑÑ Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸ командной Ñтроки" + +#: pg_createsubscriber.c:2208 pg_createsubscriber.c:2243 +#, c-format +msgid "stopping the subscriber" +msgstr "подпиÑчик оÑтанавливаетÑÑ" + +#: pg_createsubscriber.c:2222 +#, c-format +msgid "starting the subscriber" +msgstr "подпиÑчик запуÑкаетÑÑ" + +#: pg_createsubscriber.c:2251 +#, c-format +msgid "Done!" +msgstr "Готово!" + +#: pg_receivewal.c:77 +#, c-format +msgid "" +"%s receives PostgreSQL streaming write-ahead logs.\n" +"\n" +msgstr "" +"%s получает транÑлируемые журналы предзапиÑи PostgreSQL.\n" +"\n" + +#: pg_receivewal.c:82 #, c-format msgid "" " -D, --directory=DIR receive write-ahead log files into this directory\n" @@ -1218,14 +2090,14 @@ msgstr "" " -D, --directory=ПУТЬ ÑохранÑть файлы журнала предзапиÑи в данный " "каталог\n" -#: pg_receivewal.c:85 pg_recvlogical.c:85 +#: pg_receivewal.c:83 pg_recvlogical.c:93 #, c-format msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" msgstr "" " -E, --endpos=LSN определÑет позицию, поÑле которой нужно " "оÑтановитьÑÑ\n" -#: pg_receivewal.c:86 pg_recvlogical.c:89 +#: pg_receivewal.c:84 pg_recvlogical.c:97 #, c-format msgid "" " --if-not-exists do not error if slot already exists when creating a " @@ -1234,12 +2106,12 @@ msgstr "" " --if-not-exists не выдавать ошибку при попытке Ñоздать уже " "ÑущеÑтвующий Ñлот\n" -#: pg_receivewal.c:87 pg_recvlogical.c:91 +#: pg_receivewal.c:85 pg_recvlogical.c:99 #, c-format msgid " -n, --no-loop do not loop on connection lost\n" msgstr " -n, --no-loop прерывать работу при потере ÑоединениÑ\n" -#: pg_receivewal.c:88 +#: pg_receivewal.c:86 #, c-format msgid "" " --no-sync do not wait for changes to be written safely to " @@ -1247,7 +2119,7 @@ msgid "" msgstr "" " --no-sync не ждать надёжного ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ на диÑке\n" -#: pg_receivewal.c:89 pg_recvlogical.c:96 +#: pg_receivewal.c:87 pg_recvlogical.c:104 #, c-format msgid "" " -s, --status-interval=SECS\n" @@ -1258,7 +2130,7 @@ msgstr "" " интервал между отправкой ÑтатуÑных пакетов Ñерверу " "(по умолчанию: %d)\n" -#: pg_receivewal.c:92 +#: pg_receivewal.c:90 #, c-format msgid "" " --synchronous flush write-ahead log immediately after writing\n" @@ -1266,7 +2138,7 @@ msgstr "" " --synchronous ÑбраÑывать журнал предзапиÑи Ñразу поÑле запиÑи\n" # well-spelled: ИÐФО -#: pg_receivewal.c:95 +#: pg_receivewal.c:93 #, c-format msgid "" " -Z, --compress=METHOD[:DETAIL]\n" @@ -1275,7 +2147,7 @@ msgstr "" " -Z, --compress=МЕТОД[:ДОП_ИÐФО]\n" " выполнÑть Ñжатие как указано\n" -#: pg_receivewal.c:105 +#: pg_receivewal.c:103 #, c-format msgid "" "\n" @@ -1284,7 +2156,7 @@ msgstr "" "\n" "Дополнительные дейÑтвиÑ:\n" -#: pg_receivewal.c:106 pg_recvlogical.c:81 +#: pg_receivewal.c:104 pg_recvlogical.c:89 #, c-format msgid "" " --create-slot create a new replication slot (for the slot's name " @@ -1293,7 +2165,7 @@ msgstr "" " --create-slot Ñоздать новый Ñлот репликации (Ð¸Ð¼Ñ Ñлота задаёт " "параметр --slot)\n" -#: pg_receivewal.c:107 pg_recvlogical.c:82 +#: pg_receivewal.c:105 pg_recvlogical.c:90 #, c-format msgid "" " --drop-slot drop the replication slot (for the slot's name see " @@ -1302,57 +2174,57 @@ msgstr "" " --drop-slot удалить Ñлот репликации (Ð¸Ð¼Ñ Ñлота задаёт параметр " "--slot)\n" -#: pg_receivewal.c:252 +#: pg_receivewal.c:191 #, c-format msgid "finished segment at %X/%X (timeline %u)" msgstr "завершён Ñегмент %X/%X (Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u)" -#: pg_receivewal.c:259 +#: pg_receivewal.c:198 #, c-format msgid "stopped log streaming at %X/%X (timeline %u)" msgstr "завершена передача журнала Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %X/%X (Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u)" -#: pg_receivewal.c:275 +#: pg_receivewal.c:214 #, c-format msgid "switched to timeline %u at %X/%X" msgstr "переключение на линию времени %u (Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %X/%X)" -#: pg_receivewal.c:285 +#: pg_receivewal.c:224 pg_recvlogical.c:1053 #, c-format msgid "received interrupt signal, exiting" msgstr "получен Ñигнал прерываниÑ, работа завершаетÑÑ" -#: pg_receivewal.c:317 +#: pg_receivewal.c:256 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не удалоÑÑŒ закрыть каталог \"%s\": %m" -#: pg_receivewal.c:384 +#: pg_receivewal.c:323 #, c-format msgid "segment file \"%s\" has incorrect size %lld, skipping" msgstr "файл Ñегмента \"%s\" имеет неправильный размер %lld, файл пропуÑкаетÑÑ" -#: pg_receivewal.c:401 +#: pg_receivewal.c:340 #, c-format msgid "could not open compressed file \"%s\": %m" msgstr "не удалоÑÑŒ открыть Ñжатый файл \"%s\": %m" -#: pg_receivewal.c:404 +#: pg_receivewal.c:343 #, c-format msgid "could not seek in compressed file \"%s\": %m" msgstr "ошибка Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Ñжатом файле \"%s\": %m" -#: pg_receivewal.c:410 +#: pg_receivewal.c:349 #, c-format msgid "could not read compressed file \"%s\": %m" msgstr "не удалоÑÑŒ прочитать Ñжатый файл \"%s\": %m" -#: pg_receivewal.c:413 +#: pg_receivewal.c:352 #, c-format msgid "could not read compressed file \"%s\": read %d of %zu" msgstr "не удалоÑÑŒ прочитать Ñжатый файл \"%s\" (прочитано байт: %d из %zu)" -#: pg_receivewal.c:423 +#: pg_receivewal.c:362 #, c-format msgid "" "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping" @@ -1360,27 +2232,22 @@ msgstr "" "файл Ñжатого Ñегмента \"%s\" имеет неправильный иÑходный размер %d, файл " "пропуÑкаетÑÑ" -#: pg_receivewal.c:451 +#: pg_receivewal.c:390 #, c-format msgid "could not create LZ4 decompression context: %s" msgstr "не удалоÑÑŒ Ñоздать контекÑÑ‚ раÑпаковки LZ4: %s" -#: pg_receivewal.c:463 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" - -#: pg_receivewal.c:481 +#: pg_receivewal.c:420 #, c-format msgid "could not decompress file \"%s\": %s" msgstr "не удалоÑÑŒ раÑпаковать файл \"%s\": %s" -#: pg_receivewal.c:504 +#: pg_receivewal.c:443 #, c-format msgid "could not free LZ4 decompression context: %s" msgstr "не удалоÑÑŒ оÑвободить контекÑÑ‚ раÑпаковки LZ4: %s" -#: pg_receivewal.c:509 +#: pg_receivewal.c:448 #, c-format msgid "" "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping" @@ -1388,7 +2255,7 @@ msgstr "" "файл Ñжатого Ñегмента \"%s\" имеет неправильный иÑходный размер %zu, файл " "пропуÑкаетÑÑ" -#: pg_receivewal.c:514 +#: pg_receivewal.c:453 #, c-format msgid "" "cannot check file \"%s\": compression with %s not supported by this build" @@ -1396,37 +2263,37 @@ msgstr "" "не удалоÑÑŒ проверить файл \"%s\": Ñжатие методом %s не поддерживаетÑÑ Ð´Ð°Ð½Ð½Ð¾Ð¹ " "Ñборкой" -#: pg_receivewal.c:641 +#: pg_receivewal.c:578 #, c-format msgid "starting log streaming at %X/%X (timeline %u)" msgstr "начало передачи журнала Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %X/%X (Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ %u)" -#: pg_receivewal.c:783 pg_recvlogical.c:785 +#: pg_receivewal.c:693 pg_recvlogical.c:801 #, c-format msgid "could not parse end position \"%s\"" msgstr "не удалоÑÑŒ разобрать конечную позицию \"%s\"" -#: pg_receivewal.c:832 +#: pg_receivewal.c:766 #, c-format msgid "cannot use --create-slot together with --drop-slot" msgstr "--create-slot Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть вмеÑте Ñ --drop-slot" -#: pg_receivewal.c:848 +#: pg_receivewal.c:782 #, c-format msgid "cannot use --synchronous together with --no-sync" msgstr "--synchronous Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть вмеÑте Ñ --no-sync" -#: pg_receivewal.c:858 +#: pg_receivewal.c:792 #, c-format msgid "no target directory specified" msgstr "целевой каталог не указан" -#: pg_receivewal.c:882 +#: pg_receivewal.c:816 #, c-format msgid "compression with %s is not yet supported" msgstr "метод ÑÐ¶Ð°Ñ‚Ð¸Ñ %s ещё не поддерживаетÑÑ" -#: pg_receivewal.c:924 +#: pg_receivewal.c:859 #, c-format msgid "" "replication connection using slot \"%s\" is unexpectedly database specific" @@ -1434,28 +2301,28 @@ msgstr "" "подключение Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ через Ñлот \"%s\" оказалоÑÑŒ привÑзано к базе " "данных" -#: pg_receivewal.c:943 pg_recvlogical.c:955 +#: pg_receivewal.c:878 pg_recvlogical.c:972 #, c-format msgid "dropping replication slot \"%s\"" msgstr "удаление Ñлота репликации \"%s\"" -#: pg_receivewal.c:954 pg_recvlogical.c:965 +#: pg_receivewal.c:889 pg_recvlogical.c:982 #, c-format msgid "creating replication slot \"%s\"" msgstr "Ñоздание Ñлота репликации \"%s\"" -#: pg_receivewal.c:983 pg_recvlogical.c:989 +#: pg_receivewal.c:918 pg_recvlogical.c:1006 #, c-format msgid "disconnected" msgstr "отключение" #. translator: check source for value for %d -#: pg_receivewal.c:987 pg_recvlogical.c:993 +#: pg_receivewal.c:922 pg_recvlogical.c:1010 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "отключение; через %d Ñек. поÑледует повторное подключение" -#: pg_recvlogical.c:76 +#: pg_recvlogical.c:84 #, c-format msgid "" "%s controls PostgreSQL logical decoding streams.\n" @@ -1464,7 +2331,7 @@ msgstr "" "%s управлÑет потоками логичеÑкого Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ PostgreSQL.\n" "\n" -#: pg_recvlogical.c:80 +#: pg_recvlogical.c:88 #, c-format msgid "" "\n" @@ -1473,7 +2340,7 @@ msgstr "" "\n" "ДейÑтвие, которое будет выполнено:\n" -#: pg_recvlogical.c:83 +#: pg_recvlogical.c:91 #, c-format msgid "" " --start start streaming in a replication slot (for the " @@ -1482,13 +2349,13 @@ msgstr "" " --start начать передачу в Ñлоте репликации (Ð¸Ð¼Ñ Ñлота " "задаёт параметр --slot)\n" -#: pg_recvlogical.c:86 +#: pg_recvlogical.c:94 #, c-format msgid " -f, --file=FILE receive log into this file, - for stdout\n" msgstr "" " -f, --file=ФÐЙЛ ÑохранÑть журнал в Ñтот файл, - обозначает stdout\n" -#: pg_recvlogical.c:87 +#: pg_recvlogical.c:95 #, c-format msgid "" " -F --fsync-interval=SECS\n" @@ -1499,7 +2366,7 @@ msgstr "" " периодичноÑть ÑброÑа на диÑк выходного файла (по " "умолчанию: %d)\n" -#: pg_recvlogical.c:90 +#: pg_recvlogical.c:98 #, c-format msgid "" " -I, --startpos=LSN where in an existing slot should the streaming " @@ -1508,7 +2375,7 @@ msgstr "" " -I, --startpos=LSN определÑет, Ñ ÐºÐ°ÐºÐ¾Ð¹ позиции в ÑущеÑтвующем Ñлоте " "начнётÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð°\n" -#: pg_recvlogical.c:92 +#: pg_recvlogical.c:100 #, c-format msgid "" " -o, --option=NAME[=VALUE]\n" @@ -1520,19 +2387,19 @@ msgstr "" "необÑзательным\n" " значением модулю вывода\n" -#: pg_recvlogical.c:95 +#: pg_recvlogical.c:103 #, c-format msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n" msgstr "" " -P, --plugin=МОДУЛЬ иÑпользовать заданный модуль вывода (по умолчанию: " "%s)\n" -#: pg_recvlogical.c:98 +#: pg_recvlogical.c:106 #, c-format msgid " -S, --slot=SLOTNAME name of the logical replication slot\n" msgstr " -S, --slot=ИМЯ_Ð¡Ð›ÐžÐ¢Ð Ð¸Ð¼Ñ Ñлота логичеÑкой репликации\n" -#: pg_recvlogical.c:99 +#: pg_recvlogical.c:107 #, c-format msgid "" " -t, --two-phase enable decoding of prepared transactions when " @@ -1541,160 +2408,160 @@ msgstr "" " -t, --two-phase включить декодирование подготовленных транзакций " "при Ñоздании Ñлота\n" -#: pg_recvlogical.c:104 +#: pg_recvlogical.c:112 #, c-format msgid " -d, --dbname=DBNAME database to connect to\n" msgstr " -d, --dbname=ИМЯ_БД Ñ†ÐµÐ»ÐµÐ²Ð°Ñ Ð±Ð°Ð·Ð° данных\n" -#: pg_recvlogical.c:137 +#: pg_recvlogical.c:145 #, c-format msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)" msgstr "подтверждаетÑÑ Ð·Ð°Ð¿Ð¸ÑÑŒ до %X/%X, ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ Ð¤Ð¡ до %X/%X (Ñлот %s)" -#: pg_recvlogical.c:161 receivelog.c:366 +#: pg_recvlogical.c:169 receivelog.c:360 #, c-format msgid "could not send feedback packet: %s" msgstr "не удалоÑÑŒ отправить пакет ответа: %s" -#: pg_recvlogical.c:229 +#: pg_recvlogical.c:239 #, c-format msgid "starting log streaming at %X/%X (slot %s)" msgstr "начало передачи журнала Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ð¸ %X/%X (Ñлот %s)" -#: pg_recvlogical.c:271 +#: pg_recvlogical.c:281 #, c-format msgid "streaming initiated" msgstr "передача запущена" -#: pg_recvlogical.c:335 +#: pg_recvlogical.c:346 #, c-format msgid "could not open log file \"%s\": %m" msgstr "не удалоÑÑŒ открыть файл протокола \"%s\": %m" -#: pg_recvlogical.c:364 receivelog.c:889 +#: pg_recvlogical.c:375 receivelog.c:882 #, c-format msgid "invalid socket: %s" msgstr "неверный Ñокет: %s" -#: pg_recvlogical.c:417 receivelog.c:917 +#: pg_recvlogical.c:428 receivelog.c:910 #, c-format msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" -#: pg_recvlogical.c:424 receivelog.c:967 +#: pg_recvlogical.c:435 receivelog.c:959 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "не удалоÑÑŒ получить данные из потока WAL: %s" -#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011 -#: receivelog.c:1074 +#: pg_recvlogical.c:477 pg_recvlogical.c:528 receivelog.c:1003 +#: receivelog.c:1066 #, c-format msgid "streaming header too small: %d" msgstr "заголовок потока Ñлишком мал: %d" -#: pg_recvlogical.c:501 receivelog.c:849 +#: pg_recvlogical.c:512 receivelog.c:843 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "нераÑпознанный заголовок потока: \"%c\"" -#: pg_recvlogical.c:555 pg_recvlogical.c:567 +#: pg_recvlogical.c:566 pg_recvlogical.c:578 #, c-format msgid "could not write %d bytes to log file \"%s\": %m" msgstr "не удалоÑÑŒ запиÑать %d Б в файл журнала \"%s\": %m" -#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685 +#: pg_recvlogical.c:636 receivelog.c:642 receivelog.c:679 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "неожиданный конец потока репликации: %s" -#: pg_recvlogical.c:780 +#: pg_recvlogical.c:796 #, c-format msgid "could not parse start position \"%s\"" msgstr "не удалоÑÑŒ разобрать начальную позицию \"%s\"" -#: pg_recvlogical.c:858 +#: pg_recvlogical.c:874 #, c-format msgid "no slot specified" msgstr "Ñлот не указан" -#: pg_recvlogical.c:865 +#: pg_recvlogical.c:881 #, c-format msgid "no target file specified" msgstr "целевой файл не задан" -#: pg_recvlogical.c:872 +#: pg_recvlogical.c:888 #, c-format msgid "no database specified" msgstr "база данных не задана" -#: pg_recvlogical.c:879 +#: pg_recvlogical.c:895 #, c-format msgid "at least one action needs to be specified" msgstr "необходимо задать минимум одно дейÑтвие" -#: pg_recvlogical.c:886 +#: pg_recvlogical.c:902 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "--create-slot или --start Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть вмеÑте Ñ --drop-slot" -#: pg_recvlogical.c:893 +#: pg_recvlogical.c:909 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "--create-slot или --drop-slot Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½Ñть вмеÑте Ñ --startpos" -#: pg_recvlogical.c:900 +#: pg_recvlogical.c:916 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos можно задать только вмеÑте Ñ --start" -#: pg_recvlogical.c:907 +#: pg_recvlogical.c:923 #, c-format msgid "--two-phase may only be specified with --create-slot" msgstr "--two-phase можно задать только вмеÑте Ñ --create-slot" -#: pg_recvlogical.c:939 +#: pg_recvlogical.c:956 #, c-format msgid "could not establish database-specific replication connection" msgstr "" "не удалоÑÑŒ уÑтановить подключение Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ к определённой базе данных" -#: pg_recvlogical.c:1033 +#: pg_recvlogical.c:1056 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %X/%X доÑтигнута при обработке keepalive" -#: pg_recvlogical.c:1036 +#: pg_recvlogical.c:1061 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ %X/%X доÑтигнута при обработке запиÑи WAL %X/%X" -#: receivelog.c:68 +#: receivelog.c:66 #, c-format msgid "could not create archive status file \"%s\": %s" msgstr "не удалоÑÑŒ Ñоздать файл ÑтатуÑа архива \"%s\": %s" -#: receivelog.c:75 +#: receivelog.c:73 #, c-format msgid "could not close archive status file \"%s\": %s" msgstr "не удалоÑÑŒ закрыть файл ÑтатуÑа архива \"%s\": %s" -#: receivelog.c:123 +#: receivelog.c:122 #, c-format msgid "could not get size of write-ahead log file \"%s\": %s" msgstr "не удалоÑÑŒ получить размер файла журнала предзапиÑи \"%s\": %s" -#: receivelog.c:134 +#: receivelog.c:133 #, c-format msgid "could not open existing write-ahead log file \"%s\": %s" msgstr "не удалоÑÑŒ открыть ÑущеÑтвующий файл журнала предзапиÑи \"%s\": %s" -#: receivelog.c:143 +#: receivelog.c:142 #, c-format msgid "could not fsync existing write-ahead log file \"%s\": %s" msgstr "" "не удалоÑÑŒ ÑброÑить на диÑк ÑущеÑтвующий файл журнала предзапиÑи \"%s\": %s" -#: receivelog.c:158 +#: receivelog.c:157 #, c-format msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d" msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d" @@ -1705,42 +2572,37 @@ msgstr[1] "" msgstr[2] "" "файл журнала предзапиÑи \"%s\" имеет размер %zd Б, а должен — 0 или %d" -#: receivelog.c:174 +#: receivelog.c:175 #, c-format msgid "could not open write-ahead log file \"%s\": %s" msgstr "не удалоÑÑŒ открыть файл журнала предзапиÑи \"%s\": %s" -#: receivelog.c:208 -#, c-format -msgid "could not determine seek position in file \"%s\": %s" -msgstr "не удалоÑÑŒ определить текущую позицию в файле \"%s\": %s" - -#: receivelog.c:223 +#: receivelog.c:216 #, c-format msgid "not renaming \"%s\", segment is not complete" msgstr "файл Ñегмента \"%s\" не переименовываетÑÑ, так как он неполный" -#: receivelog.c:234 receivelog.c:323 receivelog.c:694 +#: receivelog.c:227 receivelog.c:317 receivelog.c:688 #, c-format msgid "could not close file \"%s\": %s" msgstr "не удалоÑÑŒ закрыть файл \"%s\": %s" -#: receivelog.c:295 +#: receivelog.c:288 #, c-format msgid "server reported unexpected history file name for timeline %u: %s" msgstr "Ñервер Ñообщил неожиданное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° иÑтории Ð´Ð»Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени %u: %s" -#: receivelog.c:303 +#: receivelog.c:297 #, c-format msgid "could not create timeline history file \"%s\": %s" msgstr "не удалоÑÑŒ Ñоздать файл иÑтории линии времени \"%s\": %s" -#: receivelog.c:310 +#: receivelog.c:304 #, c-format msgid "could not write timeline history file \"%s\": %s" msgstr "не удалоÑÑŒ запиÑать файл иÑтории линии времени \"%s\": %s" -#: receivelog.c:400 +#: receivelog.c:394 #, c-format msgid "" "incompatible server version %s; client does not support streaming from " @@ -1749,7 +2611,7 @@ msgstr "" "неÑовмеÑÑ‚Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñервера %s; клиент не поддерживает репликацию Ñ " "Ñерверов верÑии ниже %s" -#: receivelog.c:409 +#: receivelog.c:403 #, c-format msgid "" "incompatible server version %s; client does not support streaming from " @@ -1758,7 +2620,7 @@ msgstr "" "неÑовмеÑÑ‚Ð¸Ð¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñервера %s; клиент не поддерживает репликацию Ñ " "Ñерверов верÑии выше %s" -#: receivelog.c:514 +#: receivelog.c:508 #, c-format msgid "" "system identifier does not match between base backup and streaming connection" @@ -1766,12 +2628,12 @@ msgstr "" "ÑиÑтемный идентификатор базовой резервной копии отличаетÑÑ Ð¾Ñ‚ идентификатора " "потоковой передачи" -#: receivelog.c:522 +#: receivelog.c:516 #, c-format msgid "starting timeline %u is not present in the server" msgstr "на Ñервере нет начальной линии времени %u" -#: receivelog.c:561 +#: receivelog.c:555 #, c-format msgid "" "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, " @@ -1780,12 +2642,12 @@ msgstr "" "Ñервер вернул неожиданный ответ на команду TIMELINE_HISTORY; получено Ñтрок: " "%d, полей: %d, а ожидалоÑÑŒ Ñтрок: %d, полей: %d" -#: receivelog.c:632 +#: receivelog.c:626 #, c-format msgid "server reported unexpected next timeline %u, following timeline %u" msgstr "Ñервер неожиданно Ñообщил линию времени %u поÑле линии времени %u" -#: receivelog.c:638 +#: receivelog.c:632 #, c-format msgid "" "server stopped streaming timeline %u at %X/%X, but reported next timeline %u " @@ -1794,12 +2656,12 @@ msgstr "" "Ñервер прекратил передачу линии времени %u в %X/%X, но Ñообщил, что " "ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени %u начнётÑÑ Ð² %X/%X" -#: receivelog.c:678 +#: receivelog.c:672 #, c-format msgid "replication stream was terminated before stop point" msgstr "поток репликации закончилÑÑ Ð´Ð¾ точки оÑтановки" -#: receivelog.c:724 +#: receivelog.c:718 #, c-format msgid "" "unexpected result set after end-of-timeline: got %d rows and %d fields, " @@ -1808,61 +2670,62 @@ msgstr "" "Ñервер вернул неожиданный набор данных поÑле конца линии времени; получено " "Ñтрок: %d, полей: %d, а ожидалоÑÑŒ Ñтрок: %d, полей: %d" -#: receivelog.c:733 +#: receivelog.c:727 #, c-format msgid "could not parse next timeline's starting point \"%s\"" msgstr "не удалоÑÑŒ разобрать начальную точку Ñледующей линии времени \"%s\"" -#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205 +#: receivelog.c:775 receivelog.c:1022 walmethods.c:1206 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %s" -#: receivelog.c:1091 +#: receivelog.c:1083 #, c-format msgid "received write-ahead log record for offset %u with no file open" msgstr "получена запиÑÑŒ журнала предзапиÑи по Ñмещению %u, но файл не открыт" -#: receivelog.c:1101 +#: receivelog.c:1093 #, c-format msgid "got WAL data offset %08x, expected %08x" msgstr "получено Ñмещение данных WAL %08x, но ожидалоÑÑŒ %08x" -#: receivelog.c:1135 +#: receivelog.c:1128 #, c-format msgid "could not write %d bytes to WAL file \"%s\": %s" msgstr "не удалоÑÑŒ запиÑать %d Б в файл WAL \"%s\": %s" -#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230 +#: receivelog.c:1153 receivelog.c:1193 receivelog.c:1222 #, c-format msgid "could not send copy-end packet: %s" msgstr "не удалоÑÑŒ отправить пакет \"конец COPY\": %s" -#: streamutil.c:159 +#: streamutil.c:165 msgid "Password: " msgstr "Пароль: " -#: streamutil.c:182 +#: streamutil.c:192 #, c-format msgid "could not connect to server" msgstr "не удалоÑÑŒ подключитьÑÑ Ðº Ñерверу" -#: streamutil.c:225 +#: streamutil.c:233 #, c-format -msgid "could not clear search_path: %s" -msgstr "не удалоÑÑŒ очиÑтить search_path: %s" +msgid "could not clear \"search_path\": %s" +msgstr "не удалоÑÑŒ очиÑтить \"search_path\": %s" -#: streamutil.c:241 +#: streamutil.c:249 #, c-format -msgid "could not determine server setting for integer_datetimes" -msgstr "не удалоÑÑŒ получить наÑтройку Ñервера integer_datetimes" +msgid "could not determine server setting for \"integer_datetimes\"" +msgstr "не удалоÑÑŒ получить параметр Ñервера \"integer_datetimes\"" -#: streamutil.c:248 +#: streamutil.c:256 #, c-format -msgid "integer_datetimes compile flag does not match server" -msgstr "флаг компилÑции integer_datetimes не ÑоответÑтвует наÑтройке Ñервера" +msgid "\"integer_datetimes\" compile flag does not match server" +msgstr "" +"флаг компилÑции \"integer_datetimes\" не ÑоответÑтвует наÑтройке Ñервера" -#: streamutil.c:299 +#: streamutil.c:375 #, c-format msgid "" "could not fetch WAL segment size: got %d rows and %d fields, expected %d " @@ -1871,30 +2734,26 @@ msgstr "" "не удалоÑÑŒ извлечь размер Ñегмента WAL; получено Ñтрок: %d, полей: %d " "(ожидалоÑÑŒ: %d и %d (или более))" -#: streamutil.c:309 +#: streamutil.c:385 #, c-format msgid "WAL segment size could not be parsed" msgstr "разобрать размер Ñегмента WAL не удалоÑÑŒ" -#: streamutil.c:327 +#: streamutil.c:403 #, c-format -msgid "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the " -"remote server reported a value of %d byte" -msgid_plural "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the " -"remote server reported a value of %d bytes" -msgstr[0] "" -"размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 " -"ГБ, но удалённый Ñервер Ñообщил значение: %d" -msgstr[1] "" -"размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 " -"ГБ, но удалённый Ñервер Ñообщил значение: %d" -msgstr[2] "" -"размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 " -"ГБ, но удалённый Ñервер Ñообщил значение: %d" +msgid "remote server reported invalid WAL segment size (%d byte)" +msgid_plural "remote server reported invalid WAL segment size (%d bytes)" +msgstr[0] "удалённый Ñервер выдал неверный размер Ñегмента WAL: %d Б" +msgstr[1] "удалённый Ñервер выдал неверный размер Ñегмента WAL: %d Б" +msgstr[2] "удалённый Ñервер выдал неверный размер Ñегмента WAL: %d Б" -#: streamutil.c:372 +#: streamutil.c:407 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "" +"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 ГБ." + +#: streamutil.c:449 #, c-format msgid "" "could not fetch group access flag: got %d rows and %d fields, expected %d " @@ -1903,12 +2762,12 @@ msgstr "" "не удалоÑÑŒ извлечь флаг доÑтупа группы; получено Ñтрок: %d, полей: %d " "(ожидалоÑÑŒ: %d и %d (или более))" -#: streamutil.c:381 +#: streamutil.c:458 #, c-format msgid "group access flag could not be parsed: %s" msgstr "не удалоÑÑŒ разобрать флаг доÑтупа группы: %s" -#: streamutil.c:424 streamutil.c:461 +#: streamutil.c:501 streamutil.c:538 #, c-format msgid "" "could not identify system: got %d rows and %d fields, expected %d rows and " @@ -1917,7 +2776,7 @@ msgstr "" "не удалоÑÑŒ идентифицировать ÑиÑтему; получено Ñтрок: %d, полей: %d " "(ожидалоÑÑŒ: %d и %d (или более))" -#: streamutil.c:513 +#: streamutil.c:590 #, c-format msgid "" "could not read replication slot \"%s\": got %d rows and %d fields, expected " @@ -1926,23 +2785,23 @@ msgstr "" "прочитать из Ñлота репликации \"%s\" не удалоÑÑŒ; получено Ñтрок: %d, полей: " "%d (ожидалоÑÑŒ: %d и %d)" -#: streamutil.c:525 +#: streamutil.c:602 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "Ñлот репликации \"%s\" не ÑущеÑтвует" -#: streamutil.c:536 +#: streamutil.c:613 #, c-format msgid "expected a physical replication slot, got type \"%s\" instead" msgstr "ожидалÑÑ Ñлот физичеÑкой репликации, вмеÑто Ñтого получен тип \"%s\"" -#: streamutil.c:550 +#: streamutil.c:627 #, c-format msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" msgstr "" "не удалоÑÑŒ разобрать позицию restart_lsn \"%s\" Ð´Ð»Ñ Ñлота репликации \"%s\"" -#: streamutil.c:667 +#: streamutil.c:744 #, c-format msgid "" "could not create replication slot \"%s\": got %d rows and %d fields, " @@ -1951,7 +2810,7 @@ msgstr "" "Ñоздать Ñлот репликации \"%s\" не удалоÑÑŒ; получено Ñтрок: %d, полей: %d " "(ожидалоÑÑŒ: %d и %d)" -#: streamutil.c:711 +#: streamutil.c:788 #, c-format msgid "" "could not drop replication slot \"%s\": got %d rows and %d fields, expected " @@ -1960,35 +2819,55 @@ msgstr "" "удалить Ñлот репликации \"%s\" не получилоÑÑŒ; получено Ñтрок: %d, полей: %d " "(ожидалоÑÑŒ: %d и %d)" -#: walmethods.c:720 walmethods.c:1267 +#: walmethods.c:726 walmethods.c:1269 msgid "could not compress data" msgstr "не удалоÑÑŒ Ñжать данные" -#: walmethods.c:749 +#: walmethods.c:755 msgid "could not reset compression stream" msgstr "не удалоÑÑŒ ÑброÑить поток Ñжатых данных" -#: walmethods.c:880 +#: walmethods.c:892 msgid "implementation error: tar files can't have more than one open file" msgstr "" "ошибка реализации: в файлах tar не может быть больше одно открытого файла" -#: walmethods.c:894 +#: walmethods.c:907 msgid "could not create tar header" msgstr "не удалоÑÑŒ Ñоздать заголовок tar" -#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183 +#: walmethods.c:924 walmethods.c:965 walmethods.c:1171 walmethods.c:1184 msgid "could not change compression parameters" msgstr "не удалоÑÑŒ изменить параметры ÑжатиÑ" -#: walmethods.c:1055 +#: walmethods.c:1056 msgid "unlink not supported with compression" msgstr "Ñо Ñжатием закрытие файла Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸ÐµÐ¼ не поддерживаетÑÑ" -#: walmethods.c:1291 +#: walmethods.c:1293 msgid "could not close compression stream" msgstr "не удалоÑÑŒ закрыть поток Ñжатых данных" +#, c-format +#~ msgid "this build does not support gzip compression" +#~ msgstr "Ñта Ñборка программы не поддерживает Ñжатие gzip" + +#, c-format +#~ msgid "this build does not support lz4 compression" +#~ msgstr "Ñта Ñборка программы не поддерживает Ñжатие lz4" + +#, c-format +#~ msgid "this build does not support zstd compression" +#~ msgstr "Ñта Ñборка программы не поддерживает Ñжатие zstd" + +#, c-format +#~ msgid "symlinks are not supported on this platform" +#~ msgstr "ÑимволичеÑкие ÑÑылки не поддерживаютÑÑ Ð² Ñтой ОС" + +#, c-format +#~ msgid "could not determine seek position in file \"%s\": %s" +#~ msgstr "не удалоÑÑŒ определить текущую позицию в файле \"%s\": %s" + #~ msgid "unknown compression option \"%s\"" #~ msgstr "неизвеÑтный параметр ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\"" @@ -2003,9 +2882,6 @@ msgstr "не удалоÑÑŒ закрыть поток Ñжатых данных" #~ "Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° --compress не задано значение, иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ по " #~ "умолчанию" -#~ msgid "could not find replication slot \"%s\"" -#~ msgstr "не удалоÑÑŒ найти Ñлот репликации \"%s\"" - #~ msgid "fatal: " #~ msgstr "важно: " @@ -2044,9 +2920,6 @@ msgstr "не удалоÑÑŒ закрыть поток Ñжатых данных" #~ msgid "--no-manifest and --manifest-force-encode are incompatible options" #~ msgstr "параметры --no-manifest и --manifest-force-encode неÑовмеÑтимы" -#~ msgid "could not connect to server: %s" -#~ msgstr "не удалоÑÑŒ подключитьÑÑ Ðº Ñерверу: %s" - #~ msgid "" #~ "\n" #~ "Report bugs to .\n" @@ -2130,13 +3003,6 @@ msgstr "не удалоÑÑŒ закрыть поток Ñжатых данных" #~ msgid "%s: initializing replication slot \"%s\"\n" #~ msgstr "%s: инициализируетÑÑ Ñлот репликации \"%s\"\n" -#~ msgid "" -#~ "%s: could not init logical replication: got %d rows and %d fields, " -#~ "expected %d rows and %d fields\n" -#~ msgstr "" -#~ "%s: не удалоÑÑŒ инициализировать логичеÑкую репликацию; получено Ñтрок: " -#~ "%d, полей: %d (ожидалоÑÑŒ: %d и %d)\n" - #~ msgid "%s: no start point returned from server\n" #~ msgstr "%s: Ñервер не вернул Ñтартовую точку\n" @@ -2155,9 +3021,6 @@ msgstr "не удалоÑÑŒ закрыть поток Ñжатых данных" #~ msgid "%s: invalid format of xlog location: %s\n" #~ msgstr "%s: неверный формат позиции в xlog: %s\n" -#~ msgid "%s: could not identify system: %s" -#~ msgstr "%s: не удалоÑÑŒ идентифицировать ÑиÑтему: %s" - #~ msgid "%s: could not send base backup command: %s" #~ msgstr "" #~ "%s: не удалоÑÑŒ отправить команду базового резервного копированиÑ: %s" diff --git a/src/bin/pg_basebackup/po/sv.po b/src/bin/pg_basebackup/po/sv.po index c239ab70e3d55..e93dab66b4ca8 100644 --- a/src/bin/pg_basebackup/po/sv.po +++ b/src/bin/pg_basebackup/po/sv.po @@ -1,14 +1,14 @@ # SWEDISH message translation file for pg_basebackup # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-29 11:48+0000\n" -"PO-Revision-Date: 2022-09-29 21:41+0200\n" +"POT-Creation-Date: 2024-08-26 18:20+0000\n" +"PO-Revision-Date: 2024-08-26 20:56+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -37,90 +37,190 @@ msgstr "detalj: " msgid "hint: " msgstr "tips: " -#: ../../common/compression.c:130 ../../common/compression.c:139 -#: ../../common/compression.c:148 +#: ../../common/compression.c:132 ../../common/compression.c:141 +#: ../../common/compression.c:150 bbstreamer_gzip.c:116 bbstreamer_gzip.c:249 +#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298 bbstreamer_zstd.c:129 +#: bbstreamer_zstd.c:284 #, c-format msgid "this build does not support compression with %s" msgstr "detta bygge stöder inte komprimering med %s" -#: ../../common/compression.c:203 +#: ../../common/compression.c:205 msgid "found empty string where a compression option was expected" msgstr "hittade en tom sträng där en komprimeringsinställning förväntades" -#: ../../common/compression.c:237 +#: ../../common/compression.c:244 #, c-format msgid "unrecognized compression option: \"%s\"" -msgstr "okänd komprimeringsflagga \"%s\"" +msgstr "okänd komprimeringsflagga: \"%s\"" -#: ../../common/compression.c:276 +#: ../../common/compression.c:283 #, c-format msgid "compression option \"%s\" requires a value" msgstr "komprimeringsflaggan \"%s\" kräver ett värde" -#: ../../common/compression.c:285 +#: ../../common/compression.c:292 #, c-format msgid "value for compression option \"%s\" must be an integer" msgstr "värdet pÃ¥ komprimeringsflaggan \"%s\" mÃ¥ste vara ett heltal" -#: ../../common/compression.c:335 +#: ../../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "värdet pÃ¥ komprimeringsflaggan \"%s\" mÃ¥ste vara en boolean" + +#: ../../common/compression.c:379 #, c-format msgid "compression algorithm \"%s\" does not accept a compression level" msgstr "komprimeringsalgoritmen \"%s\" stöder inte komprimeringsnivÃ¥er" -#: ../../common/compression.c:342 +#: ../../common/compression.c:386 #, c-format msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" msgstr "komprimeringsalgoritmen \"%s\" förväntar sig en komprimeringsnivÃ¥ mellan %d och %d (standard är %d)" -#: ../../common/compression.c:353 +#: ../../common/compression.c:397 #, c-format msgid "compression algorithm \"%s\" does not accept a worker count" msgstr "komprimeringsalgoritmen \"%s\" stöder inte inställning av antal arbetarprocesser" +#: ../../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "komprimeringsalgoritmen \"%s\" stöder inte lÃ¥ngdistansläge" + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "kunde inte öppna filen \"%s\" för läsning: %m" + +#: ../../common/controldata_utils.c:110 pg_basebackup.c:1873 +#: pg_receivewal.c:402 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "kunde inte läsa fil \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: bbstreamer_file.c:138 pg_recvlogical.c:650 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "kunde inte stänga fil \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "byte-ordning stämmer inte" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"möjligt fel i byteordning\n" +"Den byteordning som filen frÃ¥n pg_control lagrats med passar kanske\n" +"inte detta program. I sÃ¥ fall kan nedanstÃ¥ende resultat vara felaktiga\n" +"och PostgreSQL-installationen vara inkompatibel med databaskatalogen." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: pg_basebackup.c:1846 pg_receivewal.c:386 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "kunde inte öppna fil \"%s\": %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "kunde inte skriva fil \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 pg_recvlogical.c:204 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "kunde inte fsync:a fil \"%s\": %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "slut pÃ¥ minne\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 -#: pg_receivewal.c:380 pg_recvlogical.c:341 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_receivewal.c:319 pg_recvlogical.c:352 #, c-format msgid "could not stat file \"%s\": %m" msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" -#: ../../common/file_utils.c:166 pg_receivewal.c:303 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "detta bygge stöder inte synkmetod \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_receivewal.c:242 #, c-format msgid "could not open directory \"%s\": %m" msgstr "kunde inte öppna katalog \"%s\": %m" -#: ../../common/file_utils.c:200 pg_receivewal.c:532 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_receivewal.c:471 #, c-format msgid "could not read directory \"%s\": %m" msgstr "kunde inte läsa katalog \"%s\": %m" -#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 -#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121 -#: pg_receivewal.c:447 +#: ../../common/file_utils.c:498 pg_basebackup.c:2344 walmethods.c:462 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "kunde inte öppna fil \"%s\": %m" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" -#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 -#: pg_recvlogical.c:196 +#: ../../common/restricted_token.c:60 #, c-format -msgid "could not fsync file \"%s\": %m" -msgstr "kunde inte fsync:a fil \"%s\": %m" +msgid "could not open process token: error code %lu" +msgstr "kunde inte öppna process-token: felkod %lu" -#: ../../common/file_utils.c:383 pg_basebackup.c:2256 walmethods.c:459 +#: ../../common/restricted_token.c:74 #, c-format -msgid "could not rename file \"%s\" to \"%s\": %m" -msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" +msgid "could not allocate SIDs: error code %lu" +msgstr "kunde inte allokera SID: felkod %lu" + +#: ../../common/restricted_token.c:94 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "kunde inte skapa token för begränsad Ã¥tkomst: felkod %lu" + +#: ../../common/restricted_token.c:115 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "kunde inte starta process för kommando \"%s\": felkod %lu" + +#: ../../common/restricted_token.c:153 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "kunde inte köra igen med token för begränsad Ã¥tkomst: felkod %lu" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "kunde inte hämta statuskod för underprocess: felkod %lu" #: ../../fe_utils/option_utils.c:69 #, c-format @@ -132,51 +232,62 @@ msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" msgid "%s must be in range %d..%d" msgstr "%s mÃ¥ste vara i intervallet %d..%d" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1636 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "okänd synkmetod: %s" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 pg_basebackup.c:1636 streamutil.c:331 #, c-format msgid "out of memory" msgstr "slut pÃ¥ minne" -#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121 +#: ../../fe_utils/recovery_gen.c:143 bbstreamer_file.c:121 #: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727 #, c-format msgid "could not write to file \"%s\": %m" msgstr "kunde inte skriva till fil \"%s\": %m" -#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339 +#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:361 #: pg_basebackup.c:1497 pg_basebackup.c:1706 #, c-format msgid "could not create file \"%s\": %m" msgstr "kunde inte skapa fil \"%s\": %m" -#: bbstreamer_file.c:138 pg_recvlogical.c:635 +#: ../../fe_utils/string_utils.c:434 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "kunde inte stänga fil \"%s\": %m" +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "shell-kommandots argument innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "databasnamnet innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" #: bbstreamer_file.c:275 #, c-format msgid "unexpected state while extracting archive" msgstr "oväntat tillstÃ¥nd vid uppackning av arkiv" -#: bbstreamer_file.c:298 pg_basebackup.c:686 pg_basebackup.c:730 +#: bbstreamer_file.c:321 pg_basebackup.c:698 pg_basebackup.c:712 +#: pg_basebackup.c:757 #, c-format msgid "could not create directory \"%s\": %m" msgstr "kunde inte skapa katalog \"%s\": %m" -#: bbstreamer_file.c:304 +#: bbstreamer_file.c:326 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "kunde inte sätta rättigheter pÃ¥ katalogen \"%s\": %m" -#: bbstreamer_file.c:323 +#: bbstreamer_file.c:345 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "kunde inte skapa symbolisk länk frÃ¥n \"%s\" till \"%s\": %m" -#: bbstreamer_file.c:343 +#: bbstreamer_file.c:365 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "kunde inte sätta rättigheter pÃ¥ filen \"%s\": %m" @@ -201,11 +312,6 @@ msgstr "kunde inte öppna utdatafilen: %m" msgid "could not set compression level %d: %s" msgstr "kunde inte sätta komprimeringsnivÃ¥ %d: %s" -#: bbstreamer_gzip.c:116 bbstreamer_gzip.c:249 -#, c-format -msgid "this build does not support gzip compression" -msgstr "detta bygge stöder inte gzip-komprimering" - #: bbstreamer_gzip.c:143 #, c-format msgid "could not write to compressed file \"%s\": %s" @@ -216,12 +322,12 @@ msgstr "kunde inte skriva till komprimerad fil \"%s\": %s" msgid "could not close compressed file \"%s\": %m" msgstr "kunde inte stänga komprimerad fil \"%s\": %m" -#: bbstreamer_gzip.c:245 walmethods.c:869 +#: bbstreamer_gzip.c:245 walmethods.c:880 #, c-format msgid "could not initialize compression library" msgstr "kunde inte initierar komprimeringsbibliotek" -#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:316 +#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329 #, c-format msgid "could not decompress data: %s" msgstr "kunde inte dekomprimera data: %s" @@ -236,17 +342,12 @@ msgstr "oväntat tillstÃ¥nd vid injicering av Ã¥terställningsinställningar" msgid "could not create lz4 compression context: %s" msgstr "kunde inte skapa kontext för lz4-komprimering: %s" -#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298 -#, c-format -msgid "this build does not support lz4 compression" -msgstr "detta bygge stöder inte lz4-komprimering" - #: bbstreamer_lz4.c:140 #, c-format msgid "could not write lz4 header: %s" msgstr "kunde inte skriva lz4-header: %s" -#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:168 bbstreamer_zstd.c:210 +#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223 #, c-format msgid "could not compress data: %s" msgstr "kunde inte komprimera data: %s" @@ -271,12 +372,12 @@ msgstr "tarfilens slutdel överskred 2 block" msgid "unexpected state while parsing tar archive" msgstr "oväntat tillstÃ¥nd vid parsning av tar-arkiv" -#: bbstreamer_tar.c:296 +#: bbstreamer_tar.c:292 #, c-format msgid "tar member has empty name" msgstr "tar-medlem har tomt namn" -#: bbstreamer_tar.c:328 +#: bbstreamer_tar.c:326 #, c-format msgid "COPY stream ended before last file was finished" msgstr "COPY-ström avslutade innan sista filen var klar" @@ -296,97 +397,97 @@ msgstr "kunde inte sätta zstd-komprimeringsnivÃ¥ till %d: %s" msgid "could not set compression worker count to %d: %s" msgstr "kunde inte sätta komprimeringsarbetarantalet till %d: %s" -#: bbstreamer_zstd.c:116 bbstreamer_zstd.c:271 +#: bbstreamer_zstd.c:116 #, c-format -msgid "this build does not support zstd compression" -msgstr "detta bygge stöder inte zstd-komprimering" +msgid "could not enable long-distance mode: %s" +msgstr "kunde inte aktivera lÃ¥ngdistansläge: %s" -#: bbstreamer_zstd.c:262 +#: bbstreamer_zstd.c:275 #, c-format msgid "could not create zstd decompression context" msgstr "kunde inte skapa kontext för zstd-dekomprimering" -#: pg_basebackup.c:240 +#: pg_basebackup.c:245 #, c-format msgid "removing data directory \"%s\"" msgstr "tar bort datakatalog \"%s\"" -#: pg_basebackup.c:242 +#: pg_basebackup.c:247 #, c-format msgid "failed to remove data directory" msgstr "misslyckades med att ta bort datakatalog" -#: pg_basebackup.c:246 +#: pg_basebackup.c:251 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "tar bort innehÃ¥llet i datakatalog \"%s\"" -#: pg_basebackup.c:248 +#: pg_basebackup.c:253 #, c-format msgid "failed to remove contents of data directory" msgstr "misslyckades med att ta bort innehÃ¥llet i datakatalogen" -#: pg_basebackup.c:253 +#: pg_basebackup.c:258 #, c-format msgid "removing WAL directory \"%s\"" msgstr "tar bort WAL-katalog \"%s\"" -#: pg_basebackup.c:255 +#: pg_basebackup.c:260 #, c-format msgid "failed to remove WAL directory" msgstr "misslyckades med att ta bort WAL-katalog" -#: pg_basebackup.c:259 +#: pg_basebackup.c:264 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "tar bort innehÃ¥llet i WAL-katalog \"%s\"" -#: pg_basebackup.c:261 +#: pg_basebackup.c:266 #, c-format msgid "failed to remove contents of WAL directory" msgstr "misslyckades med att ta bort innehÃ¥llet i WAL-katalogen" -#: pg_basebackup.c:267 +#: pg_basebackup.c:272 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "datakatalog \"%s\" är ej borttagen pÃ¥ användares begäran" -#: pg_basebackup.c:270 +#: pg_basebackup.c:275 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "WAL-katalog \"%s\" är ej borttagen pÃ¥ användares begäran" -#: pg_basebackup.c:274 +#: pg_basebackup.c:279 #, c-format msgid "changes to tablespace directories will not be undone" msgstr "ändringar av tablespace-kataloger kan inte backas" -#: pg_basebackup.c:326 +#: pg_basebackup.c:331 #, c-format msgid "directory name too long" msgstr "katalognamn för lÃ¥ngt" -#: pg_basebackup.c:333 +#: pg_basebackup.c:338 #, c-format msgid "multiple \"=\" signs in tablespace mapping" msgstr "multipla \"=\"-tecken i tablespace-mappning" -#: pg_basebackup.c:342 +#: pg_basebackup.c:347 #, c-format msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "ogiltigt tablespace-mappningsformat \"%s\", mÃ¥ste vara \"OLDDIR=NEWDIR\"" -#: pg_basebackup.c:351 +#: pg_basebackup.c:366 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "gammal katalog är inte en absolut sökväg i tablespace-mappning: %s" -#: pg_basebackup.c:355 +#: pg_basebackup.c:370 #, c-format msgid "new directory is not an absolute path in tablespace mapping: %s" msgstr "ny katalog är inte en absolut sökväg i tablespace-mappning: %s" -#: pg_basebackup.c:377 +#: pg_basebackup.c:392 #, c-format msgid "" "%s takes a base backup of a running PostgreSQL server.\n" @@ -395,17 +496,19 @@ msgstr "" "%s tar en basbackup av en körande PostgreSQL-server.\n" "\n" -#: pg_basebackup.c:379 pg_receivewal.c:81 pg_recvlogical.c:78 +#: pg_basebackup.c:394 pg_createsubscriber.c:221 pg_receivewal.c:79 +#: pg_recvlogical.c:86 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_basebackup.c:380 pg_receivewal.c:82 pg_recvlogical.c:79 +#: pg_basebackup.c:395 pg_createsubscriber.c:222 pg_receivewal.c:80 +#: pg_recvlogical.c:87 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [FLAGGA]...\n" -#: pg_basebackup.c:381 +#: pg_basebackup.c:396 #, c-format msgid "" "\n" @@ -414,17 +517,26 @@ msgstr "" "\n" "Flaggor som styr utmatning:\n" -#: pg_basebackup.c:382 +#: pg_basebackup.c:397 #, c-format msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n" -msgstr " -D, --pgdata=KATALOG ta emot basbackup till katalog\n" +msgstr " -D, --pgdata=KATALOG ta emot basbackup till katalog\n" -#: pg_basebackup.c:383 +#: pg_basebackup.c:398 #, c-format msgid " -F, --format=p|t output format (plain (default), tar)\n" msgstr " -F, --format=p|t utdataformat (plain (standard), tar)\n" -#: pg_basebackup.c:384 +#: pg_basebackup.c:399 +#, c-format +msgid "" +" -i, --incremental=OLDMANIFEST\n" +" take incremental backup\n" +msgstr "" +" -i, --incremental=GAMMALTMANIFEST\n" +" ta inkrementell backup\n" + +#: pg_basebackup.c:401 #, c-format msgid "" " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" @@ -433,7 +545,7 @@ msgstr "" " -r, --max-rate=RATE maximal överföringshastighet för att överföra datakatalog\n" " (i kB/s, eller använd suffix \"k\" resp. \"M\")\n" -#: pg_basebackup.c:386 +#: pg_basebackup.c:403 #, c-format msgid "" " -R, --write-recovery-conf\n" @@ -442,7 +554,7 @@ msgstr "" " -R, --write-recovery-conf\n" " skriv konfiguration för replikering\n" -#: pg_basebackup.c:388 +#: pg_basebackup.c:405 #, c-format msgid "" " -t, --target=TARGET[:DETAIL]\n" @@ -451,7 +563,7 @@ msgstr "" " -t, --target=MÃ…L[:DETALJ]\n" " backupmÃ¥l (om annat än klienten)\n" -#: pg_basebackup.c:390 +#: pg_basebackup.c:407 #, c-format msgid "" " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" @@ -460,12 +572,12 @@ msgstr "" " -T, --tablespace-mapping=GAMMALKAT=NYKAT\n" " flytta tablespace i GAMMALKAT till NYKAT\n" -#: pg_basebackup.c:392 +#: pg_basebackup.c:409 #, c-format msgid " --waldir=WALDIR location for the write-ahead log directory\n" msgstr " --waldir=WALKAT plats för write-ahead-logg-katalog\n" -#: pg_basebackup.c:393 +#: pg_basebackup.c:410 #, c-format msgid "" " -X, --wal-method=none|fetch|stream\n" @@ -474,12 +586,12 @@ msgstr "" " -X, --wal-method=none|fetch|stream\n" " inkludera behövda WAL-filer med angiven metod\n" -#: pg_basebackup.c:395 +#: pg_basebackup.c:412 #, c-format msgid " -z, --gzip compress tar output\n" msgstr " -z, --gzip komprimera tar-utdata\n" -#: pg_basebackup.c:396 +#: pg_basebackup.c:413 #, c-format msgid "" " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" @@ -488,12 +600,12 @@ msgstr "" " -Z, --compress=[{client|server}-]METOD[:DETALJ]\n" " komprimera pÃ¥ klient- eller serversida\n" -#: pg_basebackup.c:398 +#: pg_basebackup.c:415 #, c-format msgid " -Z, --compress=none do not compress tar output\n" msgstr " -Z, --compress=none komprimera inte tar-utdata\n" -#: pg_basebackup.c:399 +#: pg_basebackup.c:416 #, c-format msgid "" "\n" @@ -502,56 +614,56 @@ msgstr "" "\n" "Allmänna flaggor:\n" -#: pg_basebackup.c:400 +#: pg_basebackup.c:417 #, c-format msgid "" " -c, --checkpoint=fast|spread\n" -" set fast or spread checkpointing\n" +" set fast or spread (default) checkpointing\n" msgstr "" " -c, --checkpoint=fast|spread\n" -" ställ in \"fast\" eller \"spread\" checkpoint-metod\n" +" ställ in checkpoint-metod \"fast\" eller \"spread\" (standard)\n" -#: pg_basebackup.c:402 +#: pg_basebackup.c:419 #, c-format msgid " -C, --create-slot create replication slot\n" msgstr " --create-slot skapa en replikeringsslot\n" -#: pg_basebackup.c:403 +#: pg_basebackup.c:420 #, c-format msgid " -l, --label=LABEL set backup label\n" msgstr " -l, --label=ETIKETT sätt backup-etikett\n" -#: pg_basebackup.c:404 +#: pg_basebackup.c:421 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean städa inte upp efter fel\n" -#: pg_basebackup.c:405 +#: pg_basebackup.c:422 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync vänta inte pÃ¥ att ändringar skall skrivas säkert till disk\n" -#: pg_basebackup.c:406 +#: pg_basebackup.c:423 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress visa förloppsinformation\n" -#: pg_basebackup.c:407 pg_receivewal.c:91 +#: pg_basebackup.c:424 pg_receivewal.c:89 #, c-format msgid " -S, --slot=SLOTNAME replication slot to use\n" msgstr " -S, --slot=SLOTNAMN replikerings-slot att använda\n" -#: pg_basebackup.c:408 pg_receivewal.c:93 pg_recvlogical.c:100 +#: pg_basebackup.c:425 pg_receivewal.c:91 pg_recvlogical.c:108 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose mata ut utförliga meddelanden\n" -#: pg_basebackup.c:409 pg_receivewal.c:94 pg_recvlogical.c:101 +#: pg_basebackup.c:426 pg_receivewal.c:92 pg_recvlogical.c:109 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_basebackup.c:410 +#: pg_basebackup.c:427 #, c-format msgid "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" @@ -560,7 +672,7 @@ msgstr "" " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" " använd algoritm för manifestchecksummor\n" -#: pg_basebackup.c:412 +#: pg_basebackup.c:429 #, c-format msgid "" " --manifest-force-encode\n" @@ -569,22 +681,22 @@ msgstr "" " --manifest-force-encode\n" " hex-koda alla filnamn i manifestet\n" -#: pg_basebackup.c:414 +#: pg_basebackup.c:431 #, c-format msgid " --no-estimate-size do not estimate backup size in server side\n" msgstr " --no-estimate-size estimerar inte backupstorlek pÃ¥ serversidan\n" -#: pg_basebackup.c:415 +#: pg_basebackup.c:432 #, c-format msgid " --no-manifest suppress generation of backup manifest\n" msgstr " --no-manifest förhindra att backupmanifest genereras\n" -#: pg_basebackup.c:416 +#: pg_basebackup.c:433 #, c-format msgid " --no-slot prevent creation of temporary replication slot\n" msgstr " --no-slot förhindra skapande av temporär replikerings-slot\n" -#: pg_basebackup.c:417 +#: pg_basebackup.c:434 #, c-format msgid "" " --no-verify-checksums\n" @@ -593,12 +705,21 @@ msgstr "" " --no-verify-checksums\n" " verifiera inte checksummor\n" -#: pg_basebackup.c:419 pg_receivewal.c:97 pg_recvlogical.c:102 +#: pg_basebackup.c:436 +#, c-format +msgid "" +" --sync-method=METHOD\n" +" set method for syncing files to disk\n" +msgstr "" +" --sync-method=METOD\n" +" sätt synkmetod för att synka filer till disk\n" + +#: pg_basebackup.c:438 pg_receivewal.c:95 pg_recvlogical.c:110 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa den här hjälpen, avsluta sedan\n" -#: pg_basebackup.c:420 pg_receivewal.c:98 pg_recvlogical.c:103 +#: pg_basebackup.c:439 pg_receivewal.c:96 pg_recvlogical.c:111 #, c-format msgid "" "\n" @@ -607,22 +728,22 @@ msgstr "" "\n" "Flaggor för anslutning:\n" -#: pg_basebackup.c:421 pg_receivewal.c:99 +#: pg_basebackup.c:440 pg_receivewal.c:97 #, c-format msgid " -d, --dbname=CONNSTR connection string\n" msgstr " -d, --dbname=CONNSTR anslutningssträng\n" -#: pg_basebackup.c:422 pg_receivewal.c:100 pg_recvlogical.c:105 +#: pg_basebackup.c:441 pg_receivewal.c:98 pg_recvlogical.c:113 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAMN databasserverns värdnamn eller socket-katalog\n" -#: pg_basebackup.c:423 pg_receivewal.c:101 pg_recvlogical.c:106 +#: pg_basebackup.c:442 pg_receivewal.c:99 pg_recvlogical.c:114 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT databasserverns postnummer\n" -#: pg_basebackup.c:424 +#: pg_basebackup.c:443 #, c-format msgid "" " -s, --status-interval=INTERVAL\n" @@ -631,22 +752,23 @@ msgstr "" " -s, --status-interval=INTERVAL\n" " tid mellan att statuspaket skickas till servern (i sekunder)\n" -#: pg_basebackup.c:426 pg_receivewal.c:102 pg_recvlogical.c:107 +#: pg_basebackup.c:445 pg_receivewal.c:100 pg_recvlogical.c:115 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAMN ansluta som angiven databasanvändare\n" -#: pg_basebackup.c:427 pg_receivewal.c:103 pg_recvlogical.c:108 +#: pg_basebackup.c:446 pg_receivewal.c:101 pg_recvlogical.c:116 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password frÃ¥ga aldrig efter lösenord\n" -#: pg_basebackup.c:428 pg_receivewal.c:104 pg_recvlogical.c:109 +#: pg_basebackup.c:447 pg_receivewal.c:102 pg_recvlogical.c:117 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password tvinga fram lösenordsfrÃ¥ga (skall ske automatiskt)\n" -#: pg_basebackup.c:429 pg_receivewal.c:108 pg_recvlogical.c:110 +#: pg_basebackup.c:448 pg_createsubscriber.c:240 pg_receivewal.c:106 +#: pg_recvlogical.c:118 #, c-format msgid "" "\n" @@ -655,160 +777,161 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_basebackup.c:430 pg_receivewal.c:109 pg_recvlogical.c:111 +#: pg_basebackup.c:449 pg_createsubscriber.c:241 pg_receivewal.c:107 +#: pg_recvlogical.c:119 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_basebackup.c:472 +#: pg_basebackup.c:488 #, c-format msgid "could not read from ready pipe: %m" msgstr "kunde inte läsa frÃ¥n rör (pipe) som har data: %m" -#: pg_basebackup.c:475 pg_basebackup.c:622 pg_basebackup.c:2170 -#: streamutil.c:444 +#: pg_basebackup.c:491 pg_basebackup.c:633 pg_basebackup.c:2258 +#: streamutil.c:518 #, c-format msgid "could not parse write-ahead log location \"%s\"" msgstr "kunde inte parsa write-ahead-logg-plats \"%s\"" -#: pg_basebackup.c:581 pg_receivewal.c:663 +#: pg_basebackup.c:596 pg_receivewal.c:600 #, c-format msgid "could not finish writing WAL files: %m" msgstr "kunde inte slutföra skrivning av WAL-filer: %m" -#: pg_basebackup.c:631 +#: pg_basebackup.c:642 #, c-format msgid "could not create pipe for background process: %m" msgstr "kunde inte skapa rör (pipe) för bakgrundsprocess: %m" -#: pg_basebackup.c:664 +#: pg_basebackup.c:676 #, c-format msgid "created temporary replication slot \"%s\"" msgstr "skapade en temporär replikeringsslot \"%s\"" -#: pg_basebackup.c:667 +#: pg_basebackup.c:679 #, c-format msgid "created replication slot \"%s\"" msgstr "skapade en replikeringsslot \"%s\"" -#: pg_basebackup.c:701 +#: pg_basebackup.c:728 #, c-format msgid "could not create background process: %m" msgstr "kunde inte skapa bakgrundsprocess: %m" -#: pg_basebackup.c:710 +#: pg_basebackup.c:737 #, c-format msgid "could not create background thread: %m" msgstr "kunde inte skapa bakgrundstrÃ¥d: %m" -#: pg_basebackup.c:749 +#: pg_basebackup.c:776 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "katalogen \"%s\" existerar men är inte tom" -#: pg_basebackup.c:755 +#: pg_basebackup.c:782 pg_createsubscriber.c:390 #, c-format msgid "could not access directory \"%s\": %m" msgstr "kunde inte komma Ã¥t katalog \"%s\": %m" -#: pg_basebackup.c:832 +#: pg_basebackup.c:858 #, c-format msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" msgstr[0] "%*s/%s kB (100%%), %d/%d tablespace %*s" msgstr[1] "%*s/%s kB (100%%), %d/%d tablespace %*s" -#: pg_basebackup.c:844 +#: pg_basebackup.c:870 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" -#: pg_basebackup.c:860 +#: pg_basebackup.c:886 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" msgstr[0] "%*s/%s kB (%d%%), %d/%d tablespace" msgstr[1] "%*s/%s kB (%d%%), %d/%d tablespace" -#: pg_basebackup.c:884 +#: pg_basebackup.c:910 #, c-format msgid "transfer rate \"%s\" is not a valid value" msgstr "överföringshastighet \"%s\" är inte ett giltigt värde" -#: pg_basebackup.c:886 +#: pg_basebackup.c:912 #, c-format msgid "invalid transfer rate \"%s\": %m" msgstr "ogiltig överföringshastighet \"%s\": %m" -#: pg_basebackup.c:893 +#: pg_basebackup.c:919 #, c-format msgid "transfer rate must be greater than zero" msgstr "överföringshastigheten mÃ¥ste vara större än noll" -#: pg_basebackup.c:923 +#: pg_basebackup.c:949 #, c-format msgid "invalid --max-rate unit: \"%s\"" msgstr "ogiltig enhet för --max-rate: \"%s\"" -#: pg_basebackup.c:927 +#: pg_basebackup.c:953 #, c-format msgid "transfer rate \"%s\" exceeds integer range" msgstr "överföringshastighet \"%s\" överskrider heltalsintervall" -#: pg_basebackup.c:934 +#: pg_basebackup.c:960 #, c-format msgid "transfer rate \"%s\" is out of range" msgstr "överföringshastighet \"%s\" är utanför sitt intervall" -#: pg_basebackup.c:1030 +#: pg_basebackup.c:1022 #, c-format msgid "could not get COPY data stream: %s" msgstr "kunde inte hämta COPY-data-ström: %s" -#: pg_basebackup.c:1047 pg_recvlogical.c:438 pg_recvlogical.c:610 -#: receivelog.c:981 +#: pg_basebackup.c:1039 pg_recvlogical.c:449 pg_recvlogical.c:625 +#: receivelog.c:973 #, c-format msgid "could not read COPY data: %s" msgstr "kunde inte läsa COPY-data: %s" -#: pg_basebackup.c:1051 +#: pg_basebackup.c:1043 #, c-format msgid "background process terminated unexpectedly" msgstr "en bakgrundsprocess avslutade oväntat" -#: pg_basebackup.c:1122 +#: pg_basebackup.c:1114 #, c-format msgid "cannot inject manifest into a compressed tar file" msgstr "kan inte injicera manifest in i en komprimerad tarfil" -#: pg_basebackup.c:1123 +#: pg_basebackup.c:1115 #, c-format msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s." msgstr "använd komprimering pÃ¥ klientsidan, skicka utdatan till en katalog istället för till standard ut eller använd %s." -#: pg_basebackup.c:1139 +#: pg_basebackup.c:1131 #, c-format msgid "cannot parse archive \"%s\"" msgstr "kunde inte parsa arkiv \"%s\"" -#: pg_basebackup.c:1140 +#: pg_basebackup.c:1132 #, c-format msgid "Only tar archives can be parsed." msgstr "Bara tar-arkiv kan parsas." -#: pg_basebackup.c:1142 +#: pg_basebackup.c:1134 #, c-format msgid "Plain format requires pg_basebackup to parse the archive." msgstr "Enkelt format kräver pg_basebackup för att parsa arkivet." -#: pg_basebackup.c:1144 +#: pg_basebackup.c:1136 #, c-format msgid "Using - as the output directory requires pg_basebackup to parse the archive." msgstr "Att använda - som utkatalog kräver att pg_basebackup parsar arkivet." -#: pg_basebackup.c:1146 +#: pg_basebackup.c:1138 #, c-format msgid "The -R option requires pg_basebackup to parse the archive." msgstr "Flaggan -R kräver att pg_basebackup parsar arkivet." @@ -838,306 +961,362 @@ msgstr "tomt COPY-meddelande" msgid "malformed COPY message of type %d, length %zu" msgstr "felaktigt COPY-meddelande av typ %d, längd %zu" -#: pg_basebackup.c:1787 +#: pg_basebackup.c:1789 #, c-format msgid "incompatible server version %s" msgstr "inkompatibel serverversion %s" -#: pg_basebackup.c:1803 +#: pg_basebackup.c:1805 #, c-format msgid "Use -X none or -X fetch to disable log streaming." msgstr "Använd -X none eller -X fetch för att stänga av logg-strömning" -#: pg_basebackup.c:1871 +#: pg_basebackup.c:1841 +#, c-format +msgid "server does not support incremental backup" +msgstr "servern stöder inte inkrementella backup:er" + +#: pg_basebackup.c:1850 pg_basebackup.c:2008 pg_recvlogical.c:272 +#: receivelog.c:543 receivelog.c:582 streamutil.c:364 streamutil.c:438 +#: streamutil.c:490 streamutil.c:578 streamutil.c:730 streamutil.c:775 +#, c-format +msgid "could not send replication command \"%s\": %s" +msgstr "kunde inte skicka replikeringskommando \"%s\": %s" + +#: pg_basebackup.c:1856 pg_basebackup.c:1883 +#, c-format +msgid "could not upload manifest: %s" +msgstr "kunde inte ladda upp manifest: %s" + +#: pg_basebackup.c:1859 pg_basebackup.c:1886 +#, c-format +msgid "could not upload manifest: unexpected status %s" +msgstr "kunde inte ladda upp manifest: oväntad status %s" + +#: pg_basebackup.c:1867 +#, c-format +msgid "could not send COPY data: %s" +msgstr "kunde inte skicka COPY-data: %s" + +#: pg_basebackup.c:1877 +#, c-format +msgid "could not send end-of-COPY: %s" +msgstr "kunde inte skicka slut-pÃ¥-COPY: %s" + +#: pg_basebackup.c:1892 +#, c-format +msgid "unexpected extra result while sending manifest" +msgstr "oväntat extra resultat vid skickande av manifest" + +#: pg_basebackup.c:1950 #, c-format msgid "backup targets are not supported by this server version" msgstr "backupmÃ¥l stöds inte av denna serverversion" -#: pg_basebackup.c:1874 +#: pg_basebackup.c:1953 #, c-format msgid "recovery configuration cannot be written when a backup target is used" msgstr "Ã¥terställningskonfiguration kan inte skrivas när backupmÃ¥l används" -#: pg_basebackup.c:1901 +#: pg_basebackup.c:1980 #, c-format msgid "server does not support server-side compression" msgstr "servern stöder inte komprimering pÃ¥ serversidan" -#: pg_basebackup.c:1911 +#: pg_basebackup.c:1990 #, c-format msgid "initiating base backup, waiting for checkpoint to complete" msgstr "initierar basbackup, väntar pÃ¥ att checkpoint skall gÃ¥ klart" -#: pg_basebackup.c:1915 +#: pg_basebackup.c:1994 #, c-format msgid "waiting for checkpoint" msgstr "väntar pÃ¥ checkpoint" -#: pg_basebackup.c:1928 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588 -#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504 -#: streamutil.c:656 streamutil.c:701 -#, c-format -msgid "could not send replication command \"%s\": %s" -msgstr "kunde inte skicka replikeringskommando \"%s\": %s" - -#: pg_basebackup.c:1936 +#: pg_basebackup.c:2016 #, c-format msgid "could not initiate base backup: %s" msgstr "kunde inte initiera basbackup: %s" -#: pg_basebackup.c:1939 +#: pg_basebackup.c:2019 #, c-format msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields" msgstr "servern retunerade ett oväntat svar pÃ¥ BASE_BACKUP-kommandot; fick %d rader och %d fält, förväntade %d rader och %d fält" -#: pg_basebackup.c:1945 +#: pg_basebackup.c:2025 #, c-format msgid "checkpoint completed" msgstr "checkpoint klar" -#: pg_basebackup.c:1960 +#: pg_basebackup.c:2039 #, c-format msgid "write-ahead log start point: %s on timeline %u" msgstr "write-ahead-loggens startposition: %s pÃ¥ tidslinje %u" -#: pg_basebackup.c:1968 +#: pg_basebackup.c:2047 #, c-format msgid "could not get backup header: %s" msgstr "kunde inte hämta backup-header: %s" -#: pg_basebackup.c:1971 +#: pg_basebackup.c:2050 #, c-format msgid "no data returned from server" msgstr "ingen data returnerades frÃ¥n servern" -#: pg_basebackup.c:2006 +#: pg_basebackup.c:2093 #, c-format msgid "can only write single tablespace to stdout, database has %d" msgstr "kunde bara skriva en endaste tablespace till stdout, databasen har %d" -#: pg_basebackup.c:2019 +#: pg_basebackup.c:2106 #, c-format msgid "starting background WAL receiver" msgstr "startar bakgrunds-WAL-mottagare" -#: pg_basebackup.c:2101 +#: pg_basebackup.c:2189 #, c-format msgid "backup failed: %s" msgstr "backup misslyckades: %s" -#: pg_basebackup.c:2104 +#: pg_basebackup.c:2192 #, c-format msgid "no write-ahead log end position returned from server" msgstr "ingen write-ahead-logg-slutposition returnerad frÃ¥n servern" -#: pg_basebackup.c:2107 +#: pg_basebackup.c:2195 #, c-format msgid "write-ahead log end point: %s" msgstr "write-ahead-logg-slutposition: %s" -#: pg_basebackup.c:2118 +#: pg_basebackup.c:2206 #, c-format msgid "checksum error occurred" msgstr "felaktig kontrollsumma upptäcktes" -#: pg_basebackup.c:2123 +#: pg_basebackup.c:2211 #, c-format msgid "final receive failed: %s" msgstr "sista mottagning misslyckades: %s" -#: pg_basebackup.c:2147 +#: pg_basebackup.c:2235 #, c-format msgid "waiting for background process to finish streaming ..." msgstr "väntat pÃ¥ att bakgrundsprocess skall avsluta strömmande ..." -#: pg_basebackup.c:2151 +#: pg_basebackup.c:2239 #, c-format msgid "could not send command to background pipe: %m" msgstr "kunde inte skicka kommando till bakgrundsrör (pipe): %m" -#: pg_basebackup.c:2156 +#: pg_basebackup.c:2244 #, c-format msgid "could not wait for child process: %m" msgstr "kunde inte vänta pÃ¥ barnprocess: %m" -#: pg_basebackup.c:2158 +#: pg_basebackup.c:2246 #, c-format msgid "child %d died, expected %d" msgstr "barn %d dog, förväntade %d" -#: pg_basebackup.c:2160 streamutil.c:91 streamutil.c:197 +#: pg_basebackup.c:2248 streamutil.c:89 streamutil.c:204 streamutil.c:316 #, c-format msgid "%s" msgstr "%s" -#: pg_basebackup.c:2180 +#: pg_basebackup.c:2268 #, c-format msgid "could not wait for child thread: %m" msgstr "kunde inte vänta pÃ¥ barntrÃ¥d: %m" -#: pg_basebackup.c:2185 +#: pg_basebackup.c:2273 #, c-format msgid "could not get child thread exit status: %m" msgstr "kunde inte hämta barntrÃ¥dens slutstatus: %m" -#: pg_basebackup.c:2188 +#: pg_basebackup.c:2276 #, c-format msgid "child thread exited with error %u" msgstr "barntrÃ¥d avslutade med fel %u" -#: pg_basebackup.c:2217 +#: pg_basebackup.c:2305 #, c-format msgid "syncing data to disk ..." msgstr "synkar data till disk ..." -#: pg_basebackup.c:2242 +#: pg_basebackup.c:2330 #, c-format msgid "renaming backup_manifest.tmp to backup_manifest" msgstr "byter namn pÃ¥ backup_manifest.tmp till backup_manifest" -#: pg_basebackup.c:2262 +#: pg_basebackup.c:2350 #, c-format msgid "base backup completed" msgstr "basbackup klar" -#: pg_basebackup.c:2351 +#: pg_basebackup.c:2436 +#, c-format +msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" +msgstr "ogiltigt checkpoint-argument \"%s\", mÃ¥ste vara \"fast\" eller \"spread\"" + +#: pg_basebackup.c:2454 #, c-format msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" msgstr "ogiltigt utdataformat \"%s\", mÃ¥ste vara \"plain\" eller \"tar\"" -#: pg_basebackup.c:2395 +#: pg_basebackup.c:2535 #, c-format msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" msgstr "ogiltig wal-metod-flagga \"%s\", mÃ¥ste vara \"fetch\", \"stream\" eller \"none\"" -#: pg_basebackup.c:2425 -#, c-format -msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" -msgstr "ogiltigt checkpoint-argument \"%s\", mÃ¥ste vara \"fast\" eller \"spread\"" - -#: pg_basebackup.c:2476 pg_basebackup.c:2488 pg_basebackup.c:2510 -#: pg_basebackup.c:2522 pg_basebackup.c:2528 pg_basebackup.c:2580 -#: pg_basebackup.c:2591 pg_basebackup.c:2601 pg_basebackup.c:2607 -#: pg_basebackup.c:2614 pg_basebackup.c:2626 pg_basebackup.c:2638 -#: pg_basebackup.c:2646 pg_basebackup.c:2659 pg_basebackup.c:2665 -#: pg_basebackup.c:2674 pg_basebackup.c:2686 pg_basebackup.c:2697 -#: pg_basebackup.c:2705 pg_receivewal.c:814 pg_receivewal.c:826 -#: pg_receivewal.c:833 pg_receivewal.c:842 pg_receivewal.c:849 -#: pg_receivewal.c:859 pg_recvlogical.c:837 pg_recvlogical.c:849 -#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873 -#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894 -#: pg_recvlogical.c:901 pg_recvlogical.c:908 +#: pg_basebackup.c:2574 pg_basebackup.c:2586 pg_basebackup.c:2608 +#: pg_basebackup.c:2620 pg_basebackup.c:2626 pg_basebackup.c:2678 +#: pg_basebackup.c:2689 pg_basebackup.c:2699 pg_basebackup.c:2705 +#: pg_basebackup.c:2712 pg_basebackup.c:2724 pg_basebackup.c:2736 +#: pg_basebackup.c:2744 pg_basebackup.c:2757 pg_basebackup.c:2763 +#: pg_basebackup.c:2772 pg_basebackup.c:2784 pg_basebackup.c:2795 +#: pg_basebackup.c:2803 pg_createsubscriber.c:2037 pg_createsubscriber.c:2047 +#: pg_createsubscriber.c:2055 pg_createsubscriber.c:2083 +#: pg_createsubscriber.c:2115 pg_receivewal.c:748 pg_receivewal.c:760 +#: pg_receivewal.c:767 pg_receivewal.c:776 pg_receivewal.c:783 +#: pg_receivewal.c:793 pg_recvlogical.c:853 pg_recvlogical.c:865 +#: pg_recvlogical.c:875 pg_recvlogical.c:882 pg_recvlogical.c:889 +#: pg_recvlogical.c:896 pg_recvlogical.c:903 pg_recvlogical.c:910 +#: pg_recvlogical.c:917 pg_recvlogical.c:924 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: pg_basebackup.c:2486 pg_receivewal.c:824 pg_recvlogical.c:847 +#: pg_basebackup.c:2584 pg_createsubscriber.c:2045 pg_receivewal.c:758 +#: pg_recvlogical.c:863 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")" -#: pg_basebackup.c:2509 +#: pg_basebackup.c:2607 #, c-format msgid "cannot specify both format and backup target" msgstr "kan inte ange bÃ¥de format och backupmÃ¥l" -#: pg_basebackup.c:2521 +#: pg_basebackup.c:2619 #, c-format msgid "must specify output directory or backup target" msgstr "mÃ¥ste ange utkatalog eller backupmÃ¥l" -#: pg_basebackup.c:2527 +#: pg_basebackup.c:2625 #, c-format msgid "cannot specify both output directory and backup target" msgstr "kan inte ange bÃ¥de utdatakatalog och backupmÃ¥l" -#: pg_basebackup.c:2557 pg_receivewal.c:868 +#: pg_basebackup.c:2655 pg_receivewal.c:802 #, c-format msgid "unrecognized compression algorithm: \"%s\"" -msgstr "okänd komprimeringsalgoritm \"%s\"" +msgstr "okänd komprimeringsalgoritm: \"%s\"" -#: pg_basebackup.c:2563 pg_receivewal.c:875 +#: pg_basebackup.c:2661 pg_receivewal.c:809 #, c-format msgid "invalid compression specification: %s" msgstr "ogiltig komprimeringsangivelse: %s" -#: pg_basebackup.c:2579 +#: pg_basebackup.c:2677 #, c-format msgid "client-side compression is not possible when a backup target is specified" msgstr "komprimering pÃ¥ klientsidan är inte möjlig när backupmÃ¥l angivits" -#: pg_basebackup.c:2590 +#: pg_basebackup.c:2688 #, c-format msgid "only tar mode backups can be compressed" msgstr "bara backupper i tar-läge kan komprimeras" -#: pg_basebackup.c:2600 +#: pg_basebackup.c:2698 #, c-format msgid "WAL cannot be streamed when a backup target is specified" msgstr "WAL kan inte strömmas när ett backupmÃ¥l angivits" -#: pg_basebackup.c:2606 +#: pg_basebackup.c:2704 #, c-format msgid "cannot stream write-ahead logs in tar mode to stdout" msgstr "kan inte strömma write-ahead-logg i tar-läge till stdout" -#: pg_basebackup.c:2613 +#: pg_basebackup.c:2711 #, c-format msgid "replication slots can only be used with WAL streaming" msgstr "replikerings-slot kan bara användas med WAL-strömning" -#: pg_basebackup.c:2625 +#: pg_basebackup.c:2723 #, c-format msgid "--no-slot cannot be used with slot name" msgstr "--no-slot kan inte användas tillsammans med slot-namn" #. translator: second %s is an option name -#: pg_basebackup.c:2636 pg_receivewal.c:840 +#: pg_basebackup.c:2734 pg_receivewal.c:774 #, c-format msgid "%s needs a slot to be specified using --slot" msgstr "%s kräver att en slot anges med --slot" -#: pg_basebackup.c:2644 pg_basebackup.c:2684 pg_basebackup.c:2695 -#: pg_basebackup.c:2703 +#: pg_basebackup.c:2742 pg_basebackup.c:2782 pg_basebackup.c:2793 +#: pg_basebackup.c:2801 #, c-format msgid "%s and %s are incompatible options" msgstr "%s och %s är inkompatibla flaggor" -#: pg_basebackup.c:2658 +#: pg_basebackup.c:2756 #, c-format msgid "WAL directory location cannot be specified along with a backup target" msgstr "WAL-katalogplats kan inte anges tillsammans med backupmÃ¥l" -#: pg_basebackup.c:2664 +#: pg_basebackup.c:2762 #, c-format msgid "WAL directory location can only be specified in plain mode" msgstr "WAL-katalogplats kan bara anges i läget \"plain\"" -#: pg_basebackup.c:2673 +#: pg_basebackup.c:2771 #, c-format msgid "WAL directory location must be an absolute path" msgstr "WAL-katalogen mÃ¥ste vara en absolut sökväg" -#: pg_basebackup.c:2774 +#: pg_basebackup.c:2871 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "kan inte skapa symbolisk länk \"%s\": %m" -#: pg_basebackup.c:2776 +#: pg_createsubscriber.c:169 +#, c-format +msgid "failed after the end of recovery" +msgstr "misslyckades vid slutet av Ã¥terställning" + +#: pg_createsubscriber.c:170 +#, c-format +msgid "The target server cannot be used as a physical replica anymore. You must recreate the physical replica before continuing." +msgstr "MÃ¥lservern kan inte längre användas som en fysisk replika. Du mÃ¥ste Ã¥terskapa den fysiska replikan innan det gÃ¥r att fortsätta." + +#: pg_createsubscriber.c:198 +#, c-format +msgid "publication \"%s\" created in database \"%s\" on primary was left behind" +msgstr "publiceringen \"%s\" som skapades i databasen \"%s\" pÃ¥ primären har lämnats kvar" + +#: pg_createsubscriber.c:200 +#, c-format +msgid "Drop this publication before trying again." +msgstr "Släng denna publiceringen innan du försöker igen." + +#: pg_createsubscriber.c:204 #, c-format -msgid "symlinks are not supported on this platform" -msgstr "symboliska länkar stöds inte pÃ¥ denna plattform" +msgid "replication slot \"%s\" created in database \"%s\" on primary was left behind" +msgstr "replikeringsslotten \"%s\" som skapades i databasen \"%s\" pÃ¥ primären har lämnats kvar" -#: pg_receivewal.c:79 +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1260 +#, c-format +msgid "Drop this replication slot soon to avoid retention of WAL files." +msgstr "Släng denna replikeringsslot inom kort för att undvika att WAL-filer köas upp." + +#: pg_createsubscriber.c:219 #, c-format msgid "" -"%s receives PostgreSQL streaming write-ahead logs.\n" -"\n" -msgstr "" -"%s tar emot PostgreSQL-strömning-write-ahead-logg.\n" +"%s creates a new logical replica from a standby server.\n" "\n" +msgstr "%s skapar en ny logisk replikering frÃ¥n en standby-server.\n" -#: pg_receivewal.c:83 pg_recvlogical.c:84 +#: pg_createsubscriber.c:223 pg_receivewal.c:81 pg_recvlogical.c:92 #, c-format msgid "" "\n" @@ -1146,32 +1325,649 @@ msgstr "" "\n" "Flaggor:\n" -#: pg_receivewal.c:84 +#: pg_createsubscriber.c:224 +#, c-format +msgid " -d, --database=DBNAME database in which to create a subscription\n" +msgstr " -d, --database=DBNAME databas att skapa prenumeration i\n" + +#: pg_createsubscriber.c:225 +#, c-format +msgid " -D, --pgdata=DATADIR location for the subscriber data directory\n" +msgstr " -D, --pgdata=DATADIR plats för prenumerantens datakatalog\n" + +#: pg_createsubscriber.c:226 +#, c-format +msgid " -n, --dry-run dry run, just show what would be done\n" +msgstr " -n, --dry-run ingen updatering, visa bara planerade Ã¥tgärder\n" + +#: pg_createsubscriber.c:227 +#, c-format +msgid " -p, --subscriber-port=PORT subscriber port number (default %s)\n" +msgstr " -p, --subscriber-port=PORT prenumerantens portnummer (standard %s)\n" + +#: pg_createsubscriber.c:228 +#, c-format +msgid " -P, --publisher-server=CONNSTR publisher connection string\n" +msgstr " -P, --publisher-server=CONNSTR publicerarens anslutningssträng\n" + +#: pg_createsubscriber.c:229 +#, c-format +msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" +msgstr " -s, --socketdir=KAT uttagskatalog (standard är aktuell katalog.)\n" + +#: pg_createsubscriber.c:230 +#, c-format +msgid " -t, --recovery-timeout=SECS seconds to wait for recovery to end\n" +msgstr " -t, --recovery-timeout=SECS antal sekunder att vänta pÃ¥ att Ã¥terställning skall avslutas\n" + +#: pg_createsubscriber.c:231 +#, c-format +msgid " -U, --subscriber-username=NAME user name for subscriber connection\n" +msgstr " -U, --subscriber-username=NAME användarnamn för prenumerantens anslutning\n" + +#: pg_createsubscriber.c:232 +#, c-format +msgid " -v, --verbose output verbose messages\n" +msgstr " -v, --verbose visa utförliga meddelanden\n" + +#: pg_createsubscriber.c:233 +#, c-format +msgid "" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr "" +" --config-file=FILNAMN använd angiven fil med serverkonfiguration\n" +" när mÃ¥lklustret körs\n" + +#: pg_createsubscriber.c:235 +#, c-format +msgid " --publication=NAME publication name\n" +msgstr " --publication=NAME publiceringsnamn\n" + +#: pg_createsubscriber.c:236 +#, c-format +msgid " --replication-slot=NAME replication slot name\n" +msgstr " --replication-slot=NAME namn pÃ¥ replikeringsslot\n" + +#: pg_createsubscriber.c:237 +#, c-format +msgid " --subscription=NAME subscription name\n" +msgstr " --subscription=NAME namn pÃ¥ prenumeration\n" + +#: pg_createsubscriber.c:238 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version visa versionsinformation, avsluta sedan\n" + +#: pg_createsubscriber.c:239 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help visa denna hjälp, avsluta sedan\n" + +#: pg_createsubscriber.c:282 +#, c-format +msgid "could not parse connection string: %s" +msgstr "kunde inte parsa anslutningssträng: %s" + +#: pg_createsubscriber.c:359 +#, c-format +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"" + +#: pg_createsubscriber.c:362 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s" + +#: pg_createsubscriber.c:382 +#, c-format +msgid "checking if directory \"%s\" is a cluster data directory" +msgstr "undersöker om katalogen \"%s\" är en klusterkatalog" + +#: pg_createsubscriber.c:388 +#, c-format +msgid "data directory \"%s\" does not exist" +msgstr "databaskatalogen \"%s\" existerar inte" + +#: pg_createsubscriber.c:396 +#, c-format +msgid "directory \"%s\" is not a database cluster directory" +msgstr "katalogen \"%s\" innehÃ¥ller inte ett databaskluster." + +#: pg_createsubscriber.c:513 +#, c-format +msgid "connection to database failed: %s" +msgstr "anslutning till databasen misslyckades: %s" + +#: pg_createsubscriber.c:526 +#, c-format +msgid "could not clear search_path: %s" +msgstr "kunde inte nollställa search_path: %s" + +#: pg_createsubscriber.c:566 +#, c-format +msgid "getting system identifier from publisher" +msgstr "hämtar systemidentifierare frÃ¥n publicerare" + +#: pg_createsubscriber.c:573 +#, c-format +msgid "could not get system identifier: %s" +msgstr "kunde inte hämta systemidentifierare: %s" + +#: pg_createsubscriber.c:579 +#, c-format +msgid "could not get system identifier: got %d rows, expected %d row" +msgstr "kunde inte hämta systemidentifierare: fick %d rader, förväntade %d rad" + +#: pg_createsubscriber.c:586 +#, c-format +msgid "system identifier is %llu on publisher" +msgstr "systemidentifieraren är %llu pÃ¥ publiceraren" + +#: pg_createsubscriber.c:607 +#, c-format +msgid "getting system identifier from subscriber" +msgstr "hämtar systemidentifierare frÃ¥n prenumeranten" + +#: pg_createsubscriber.c:611 pg_createsubscriber.c:641 +#, c-format +msgid "control file appears to be corrupt" +msgstr "kontrollfilen verkar vara trasig" + +#: pg_createsubscriber.c:615 pg_createsubscriber.c:656 +#, c-format +msgid "system identifier is %llu on subscriber" +msgstr "systemidentifieraren är %llu hos prenumeranten" + +#: pg_createsubscriber.c:637 +#, c-format +msgid "modifying system identifier of subscriber" +msgstr "uppdaterar systemidentifieraren för prenumeranten" + +#: pg_createsubscriber.c:659 +#, c-format +msgid "running pg_resetwal on the subscriber" +msgstr "kör pg_resetwal pÃ¥ prenumeranten" + +#: pg_createsubscriber.c:671 +#, c-format +msgid "subscriber successfully changed the system identifier" +msgstr "prenumeranten lyckades ändra systemidentifieraren" + +#: pg_createsubscriber.c:673 +#, c-format +msgid "could not change system identifier of subscriber: %s" +msgstr "kunde inte ändra systemidentifierare för prenumerant: %s" + +#: pg_createsubscriber.c:697 +#, c-format +msgid "could not obtain database OID: %s" +msgstr "kunde inte hämta databas-OID: %s" + +#: pg_createsubscriber.c:704 +#, c-format +msgid "could not obtain database OID: got %d rows, expected %d row" +msgstr "kunde inte hämta databas-OID: fick %d rader, förväntade %d rad" + +#: pg_createsubscriber.c:776 +#, c-format +msgid "create replication slot \"%s\" on publisher" +msgstr "skapa replikerings-slot \"%s\" pÃ¥ publicerare" + +#: pg_createsubscriber.c:796 +#, c-format +msgid "could not write an additional WAL record: %s" +msgstr "kunde inte läsa ytterligare en WAL-post: %s" + +#: pg_createsubscriber.c:822 +#, c-format +msgid "could not obtain recovery progress: %s" +msgstr "kunde inte hämta progress för Ã¥terställning: %s" + +#: pg_createsubscriber.c:854 +#, c-format +msgid "checking settings on publisher" +msgstr "kontrollerar inställningar pÃ¥ publicerare" + +#: pg_createsubscriber.c:864 +#, c-format +msgid "primary server cannot be in recovery" +msgstr "primära servern kan inte vara i Ã¥terställningsläge" + +#: pg_createsubscriber.c:888 +#, c-format +msgid "could not obtain publisher settings: %s" +msgstr "kunde inte hämta inställningar för publicerare: %s" + +#: pg_createsubscriber.c:914 +#, c-format +msgid "publisher requires wal_level >= \"logical\"" +msgstr "publiceraren kräver wal_level >= \"logical\"" + +#: pg_createsubscriber.c:920 +#, c-format +msgid "publisher requires %d replication slots, but only %d remain" +msgstr "publicerare kräver %d replikeringssslottar men bara %d Ã¥terstÃ¥r" + +#: pg_createsubscriber.c:922 pg_createsubscriber.c:931 +#: pg_createsubscriber.c:1028 pg_createsubscriber.c:1037 +#: pg_createsubscriber.c:1046 +#, c-format +msgid "Increase the configuration parameter \"%s\" to at least %d." +msgstr "Öka konfigurationsparametern \"%s\" till minst %d." + +#: pg_createsubscriber.c:929 +#, c-format +msgid "publisher requires %d WAL sender processes, but only %d remain" +msgstr "publicerare kräver %d WAL-skickar-processer men bara %d Ã¥terstÃ¥r" + +#: pg_createsubscriber.c:938 +#, c-format +msgid "two_phase option will not be enabled for replication slots" +msgstr "flaggan two_phase kommer inte aktiveras för replikeringsslottar" + +#: pg_createsubscriber.c:939 +#, c-format +msgid "Subscriptions will be created with the two_phase option disabled. Prepared transactions will be replicated at COMMIT PREPARED." +msgstr "Prenumerationer kommer skapas med flaggan two_phase avaktiverad. Förberedda transaktioner kommer replikeras vid COMMIT PREPARED." + +#: pg_createsubscriber.c:971 +#, c-format +msgid "checking settings on subscriber" +msgstr "kontrollerar inställningar pÃ¥ prenumeranten" + +#: pg_createsubscriber.c:978 +#, c-format +msgid "target server must be a standby" +msgstr "mÃ¥lserver mÃ¥ste vara en standby" + +#: pg_createsubscriber.c:1002 +#, c-format +msgid "could not obtain subscriber settings: %s" +msgstr "kunde inte hämta inställningar för prenumerant: %s" + +#: pg_createsubscriber.c:1026 +#, c-format +msgid "subscriber requires %d replication slots, but only %d remain" +msgstr "prenumerant kräver %d replikeringsslottar men bara %d Ã¥terstÃ¥r" + +#: pg_createsubscriber.c:1035 +#, c-format +msgid "subscriber requires %d logical replication workers, but only %d remain" +msgstr "prenumerant kräver %d logiska replikeringsprocesser men bara %d Ã¥terstÃ¥r" + +#: pg_createsubscriber.c:1044 +#, c-format +msgid "subscriber requires %d worker processes, but only %d remain" +msgstr "prenumerant kräver %d arbetsprocesser men bara %d Ã¥terstÃ¥r" + +#: pg_createsubscriber.c:1079 +#, c-format +msgid "dropping subscription \"%s\" in database \"%s\"" +msgstr "slänger prenumeration \"%s\" i databasen \"%s\"" + +#: pg_createsubscriber.c:1088 +#, c-format +msgid "could not drop subscription \"%s\": %s" +msgstr "kunde inte slänga prenumeration \"%s\": %s" + +#: pg_createsubscriber.c:1123 +#, c-format +msgid "could not obtain pre-existing subscriptions: %s" +msgstr "kunde inte hämta redan existerande prenumerationer: %s" + +#: pg_createsubscriber.c:1258 +#, c-format +msgid "could not drop replication slot \"%s\" on primary" +msgstr "kunde inte slänga replikeringsslotten \"%s\" pÃ¥ primären" + +#: pg_createsubscriber.c:1292 +#, c-format +msgid "could not obtain failover replication slot information: %s" +msgstr "kunde inte hämta replikeringsslottens information för failover: %s" + +#: pg_createsubscriber.c:1294 pg_createsubscriber.c:1303 +#, c-format +msgid "Drop the failover replication slots on subscriber soon to avoid retention of WAL files." +msgstr "Släng replikeringsslottar för failover pÃ¥ prenumeranten inom kort för att undvika att köa upp WAL-filer." + +#: pg_createsubscriber.c:1302 +#, c-format +msgid "could not drop failover replication slot" +msgstr "kunde inte slänga replikeringsslot för failover" + +#: pg_createsubscriber.c:1324 +#, c-format +msgid "creating the replication slot \"%s\" in database \"%s\"" +msgstr "skapar replikeringsslot \"%s\" i databasen \"%s\"" + +#: pg_createsubscriber.c:1342 +#, c-format +msgid "could not create replication slot \"%s\" in database \"%s\": %s" +msgstr "kunde inte skapa replikeringsslot \"%s\" i databasen \"%s\": %s" + +#: pg_createsubscriber.c:1372 +#, c-format +msgid "dropping the replication slot \"%s\" in database \"%s\"" +msgstr "slänger replikeringsslot \"%s\" i databasen \"%s\"" + +#: pg_createsubscriber.c:1388 +#, c-format +msgid "could not drop replication slot \"%s\" in database \"%s\": %s" +msgstr "kunde inte slänga replikeringsslot \"%s\" i databasen \"%s\": %s" + +#: pg_createsubscriber.c:1409 +#, c-format +msgid "pg_ctl failed with exit code %d" +msgstr "pg_ctl avslutade med felkod %d" + +#: pg_createsubscriber.c:1414 +#, c-format +msgid "pg_ctl was terminated by exception 0x%X" +msgstr "pg_ctl avslutades med avbrott 0x%X" + +#: pg_createsubscriber.c:1416 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "Se C-include-fil \"ntstatus.h\" för en beskrivning av det hexdecimala värdet." + +#: pg_createsubscriber.c:1418 +#, c-format +msgid "pg_ctl was terminated by signal %d: %s" +msgstr "pg_ctl terminerades av signal %d: %s" + +#: pg_createsubscriber.c:1424 +#, c-format +msgid "pg_ctl exited with unrecognized status %d" +msgstr "pg_ctl avslutade med okänd statuskod %d" + +#: pg_createsubscriber.c:1427 +#, c-format +msgid "The failed command was: %s" +msgstr "Det misslyckade kommandot var: %s" + +#: pg_createsubscriber.c:1473 +#, c-format +msgid "server was started" +msgstr "servern startad" + +#: pg_createsubscriber.c:1488 +#, c-format +msgid "server was stopped" +msgstr "servern är stoppad" + +#: pg_createsubscriber.c:1507 +#, c-format +msgid "waiting for the target server to reach the consistent state" +msgstr "väntar pÃ¥ att mÃ¥lservern skall komma till ett konsistent läge" + +#: pg_createsubscriber.c:1530 +#, c-format +msgid "recovery timed out" +msgstr "timeout vid Ã¥terställning" + +#: pg_createsubscriber.c:1543 +#, c-format +msgid "server did not end recovery" +msgstr "servern avslutade inte Ã¥terställning" + +#: pg_createsubscriber.c:1545 +#, c-format +msgid "target server reached the consistent state" +msgstr "mÃ¥lservern har nÃ¥tt ett konsistent läge" + +#: pg_createsubscriber.c:1546 +#, c-format +msgid "If pg_createsubscriber fails after this point, you must recreate the physical replica before continuing." +msgstr "" +"Om pg_createsubscriber misslyckas efter denna punkt sÃ¥ mÃ¥ste du\n" +"Ã¥terskapa den fysiska replikan innan du fortsätter." + +#: pg_createsubscriber.c:1573 +#, c-format +msgid "could not obtain publication information: %s" +msgstr "kunde inte hämta publiceringsinformation: %s" + +#: pg_createsubscriber.c:1587 +#, c-format +msgid "publication \"%s\" already exists" +msgstr "publicering \"%s\" finns redan" + +#: pg_createsubscriber.c:1588 +#, c-format +msgid "Consider renaming this publication before continuing." +msgstr "Överväg att byta namn pÃ¥ denna publicering innan fortsättning." + +#: pg_createsubscriber.c:1595 +#, c-format +msgid "creating publication \"%s\" in database \"%s\"" +msgstr "skapar puiblicering \"%s\" i databasen \"%s\"" + +#: pg_createsubscriber.c:1608 +#, c-format +msgid "could not create publication \"%s\" in database \"%s\": %s" +msgstr "kunde inte skapa publicering \"%s\" i databasen \"%s\": %s" + +#: pg_createsubscriber.c:1637 +#, c-format +msgid "dropping publication \"%s\" in database \"%s\"" +msgstr "slänger publiceringen \"%s\" i databasen \"%s\"" + +#: pg_createsubscriber.c:1651 +#, c-format +msgid "could not drop publication \"%s\" in database \"%s\": %s" +msgstr "kunde inte slänga publiceringen \"%s\" i databasen \"%s\": %s" + +#: pg_createsubscriber.c:1697 +#, c-format +msgid "creating subscription \"%s\" in database \"%s\"" +msgstr "skapar prenumeration \"%s\" i databasen \"%s\"" + +#: pg_createsubscriber.c:1718 +#, c-format +msgid "could not create subscription \"%s\" in database \"%s\": %s" +msgstr "kunde inte skapa prenumeration \"%s\" i databasen \"%s\": %s" + +#: pg_createsubscriber.c:1763 +#, c-format +msgid "could not obtain subscription OID: %s" +msgstr "kunde inte hämta prenumerations-OID: %s" + +#: pg_createsubscriber.c:1770 +#, c-format +msgid "could not obtain subscription OID: got %d rows, expected %d row" +msgstr "kunde inte hämta prenumerations-OID: fick %d rader, förväntade %d rad" + +#: pg_createsubscriber.c:1794 +#, c-format +msgid "setting the replication progress (node name \"%s\", LSN %s) in database \"%s\"" +msgstr "sätter progress för replikering (nod-namn \"%s\", LSN %s) i databasen \"%s\"" + +#: pg_createsubscriber.c:1809 +#, c-format +msgid "could not set replication progress for subscription \"%s\": %s" +msgstr "kunde inte sätta progress för replikering till prenumeration \"%s\": %s" + +#: pg_createsubscriber.c:1840 +#, c-format +msgid "enabling subscription \"%s\" in database \"%s\"" +msgstr "aktiverar prenumeration \"%s\" i databasen \"%s\"" + +#: pg_createsubscriber.c:1852 +#, c-format +msgid "could not enable subscription \"%s\": %s" +msgstr "kunde inte aktivera prenumerationen \"%s\": %s" + +#: pg_createsubscriber.c:1944 +#, c-format +msgid "cannot be executed by \"root\"" +msgstr "kan inte köras av \"root\"" + +#: pg_createsubscriber.c:1945 +#, c-format +msgid "You must run %s as the PostgreSQL superuser." +msgstr "Du mÃ¥ste köra %s som PostgreSQL:s superuser." + +#: pg_createsubscriber.c:1966 +#, c-format +msgid "database \"%s\" specified more than once" +msgstr "database \"%s\" angiven mer än en gÃ¥ng" + +#: pg_createsubscriber.c:2007 +#, c-format +msgid "publication \"%s\" specified more than once" +msgstr "publicering \"%s\" angiven mer än en gÃ¥ng" + +#: pg_createsubscriber.c:2019 +#, c-format +msgid "replication slot \"%s\" specified more than once" +msgstr "replikeringsslott \"%s\" angiven mer än en gÃ¥ng" + +#: pg_createsubscriber.c:2031 +#, c-format +msgid "subscription \"%s\" specified more than once" +msgstr "prenumeration \"%s\" angiven mer än en gÃ¥ng" + +#: pg_createsubscriber.c:2054 +#, c-format +msgid "no subscriber data directory specified" +msgstr "ingen datakatalog för prenumeration angiven" + +#: pg_createsubscriber.c:2065 +#, c-format +msgid "could not determine current directory" +msgstr "kunde inte bestämma aktuell katalog" + +#: pg_createsubscriber.c:2082 +#, c-format +msgid "no publisher connection string specified" +msgstr "ingen anslutningssträng angiven för publicerare" + +#: pg_createsubscriber.c:2086 +#, c-format +msgid "validating publisher connection string" +msgstr "validerar publicerares anslutningssträng" + +#: pg_createsubscriber.c:2092 +#, c-format +msgid "validating subscriber connection string" +msgstr "validerar prenumerants anslutningssträng" + +#: pg_createsubscriber.c:2097 +#, c-format +msgid "no database was specified" +msgstr "ingen databas angavs" + +#: pg_createsubscriber.c:2109 +#, c-format +msgid "database name \"%s\" was extracted from the publisher connection string" +msgstr "databasnamn \"%s\" extraherades frÃ¥n publicistens anslutningssträng" + +#: pg_createsubscriber.c:2114 +#, c-format +msgid "no database name specified" +msgstr "inget databasnamn angavs" + +#: pg_createsubscriber.c:2124 +#, c-format +msgid "wrong number of publication names specified" +msgstr "fel antal namn pÃ¥ publicister angavs" + +#: pg_createsubscriber.c:2125 +#, c-format +msgid "The number of specified publication names (%d) must match the number of specified database names (%d)." +msgstr "Antalet angivna namn pÃ¥ publicister (%d) mÃ¥ste matcha antalet angivna namn pÃ¥ databaser (%d)." + +#: pg_createsubscriber.c:2131 +#, c-format +msgid "wrong number of subscription names specified" +msgstr "fel antal namn pÃ¥ prenumeranter angivna" + +#: pg_createsubscriber.c:2132 +#, c-format +msgid "The number of specified subscription names (%d) must match the number of specified database names (%d)." +msgstr "Antalet angivna namn pÃ¥ prenumeranter (%d) mÃ¥ste matcha antalet angivna namn pÃ¥ databaser (%d)." + +#: pg_createsubscriber.c:2138 +#, c-format +msgid "wrong number of replication slot names specified" +msgstr "fel antal namn pÃ¥ replikeringsslottar angivet" + +#: pg_createsubscriber.c:2139 +#, c-format +msgid "The number of specified replication slot names (%d) must match the number of specified database names (%d)." +msgstr "Antalet angivna namn pÃ¥ replikeringsslottar (%d) mÃ¥ste matcha antalet angivna namn pÃ¥ databaser (%d)." + +#: pg_createsubscriber.c:2168 +#, c-format +msgid "subscriber data directory is not a copy of the source database cluster" +msgstr "prenumerantens datakatalog är inte en kopia pÃ¥ källdatabasens kluster" + +#: pg_createsubscriber.c:2181 +#, c-format +msgid "standby server is running" +msgstr "standby-servern kör" + +#: pg_createsubscriber.c:2182 +#, c-format +msgid "Stop the standby server and try again." +msgstr "Stoppa standby-servern och försök igen." + +#: pg_createsubscriber.c:2191 +#, c-format +msgid "starting the standby server with command-line options" +msgstr "startar standby-server med kommandoradsflaggor" + +#: pg_createsubscriber.c:2207 pg_createsubscriber.c:2242 +#, c-format +msgid "stopping the subscriber" +msgstr "stoppar prenumeranten" + +#: pg_createsubscriber.c:2221 +#, c-format +msgid "starting the subscriber" +msgstr "startar prenumeranten" + +#: pg_createsubscriber.c:2250 +#, c-format +msgid "Done!" +msgstr "Klar!" + +#: pg_receivewal.c:77 +#, c-format +msgid "" +"%s receives PostgreSQL streaming write-ahead logs.\n" +"\n" +msgstr "" +"%s tar emot PostgreSQL-strömning-write-ahead-logg.\n" +"\n" + +#: pg_receivewal.c:82 #, c-format msgid " -D, --directory=DIR receive write-ahead log files into this directory\n" msgstr " -D, --directory=KAT ta emot write-ahead-logg-filer till denna katalog\n" -#: pg_receivewal.c:85 pg_recvlogical.c:85 +#: pg_receivewal.c:83 pg_recvlogical.c:93 #, c-format msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" msgstr " -E, --endpos=LSN avsluta efter att ha taget emot den angivna LSN\n" -#: pg_receivewal.c:86 pg_recvlogical.c:89 +#: pg_receivewal.c:84 pg_recvlogical.c:97 #, c-format msgid " --if-not-exists do not error if slot already exists when creating a slot\n" msgstr " --if-not-exists inget fel om slot:en redan finns när vi skapar slot:en\n" -#: pg_receivewal.c:87 pg_recvlogical.c:91 +#: pg_receivewal.c:85 pg_recvlogical.c:99 #, c-format msgid " -n, --no-loop do not loop on connection lost\n" msgstr " -n, --no-loop loopa inte om anslutning tappas\n" -#: pg_receivewal.c:88 +#: pg_receivewal.c:86 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync vänta inte pÃ¥ att ändringar skall skrivas säkert till disk\n" -#: pg_receivewal.c:89 pg_recvlogical.c:96 +#: pg_receivewal.c:87 pg_recvlogical.c:104 #, c-format msgid "" " -s, --status-interval=SECS\n" @@ -1180,12 +1976,12 @@ msgstr "" " -s, --status-interval=SEKS\n" " tid mellan att statuspaket skickas till serverb (standard: %d)\n" -#: pg_receivewal.c:92 +#: pg_receivewal.c:90 #, c-format msgid " --synchronous flush write-ahead log immediately after writing\n" msgstr " --synchronous flush:a write-ahead-logg direkt efter skrivning\n" -#: pg_receivewal.c:95 +#: pg_receivewal.c:93 #, c-format msgid "" " -Z, --compress=METHOD[:DETAIL]\n" @@ -1194,7 +1990,7 @@ msgstr "" " -Z, --compress=[{client|server}-]METOD[:DETALJ]\n" " komprimera enligt detta\n" -#: pg_receivewal.c:105 +#: pg_receivewal.c:103 #, c-format msgid "" "\n" @@ -1203,158 +1999,153 @@ msgstr "" "\n" "Valfria handlingar:\n" -#: pg_receivewal.c:106 pg_recvlogical.c:81 +#: pg_receivewal.c:104 pg_recvlogical.c:89 #, c-format msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n" msgstr " --create-slot skapa en ny replikeringsslot (angÃ¥ende slot:ens namn, se --slot)\n" -#: pg_receivewal.c:107 pg_recvlogical.c:82 +#: pg_receivewal.c:105 pg_recvlogical.c:90 #, c-format msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n" msgstr " --drop-slot släng replikeringsslot (angÃ¥ende slot:ens namn, se --slot)\n" -#: pg_receivewal.c:252 +#: pg_receivewal.c:191 #, c-format msgid "finished segment at %X/%X (timeline %u)" msgstr "slutförde segment vid %X/%X (tidslinje %u)" -#: pg_receivewal.c:259 +#: pg_receivewal.c:198 #, c-format msgid "stopped log streaming at %X/%X (timeline %u)" msgstr "stoppade logg-strömning vid %X/%X (tidslinje %u)" -#: pg_receivewal.c:275 +#: pg_receivewal.c:214 #, c-format msgid "switched to timeline %u at %X/%X" msgstr "bytte till tidslinje %u vid %X/%X" -#: pg_receivewal.c:285 +#: pg_receivewal.c:224 pg_recvlogical.c:1053 #, c-format msgid "received interrupt signal, exiting" msgstr "mottog avbrottsignal, avslutar" -#: pg_receivewal.c:317 +#: pg_receivewal.c:256 #, c-format msgid "could not close directory \"%s\": %m" msgstr "kunde inte stänga katalog \"%s\": %m" -#: pg_receivewal.c:384 +#: pg_receivewal.c:323 #, c-format msgid "segment file \"%s\" has incorrect size %lld, skipping" msgstr "segmentfil \"%s\" har inkorrekt storlek %lld, hoppar över" -#: pg_receivewal.c:401 +#: pg_receivewal.c:340 #, c-format msgid "could not open compressed file \"%s\": %m" msgstr "kunde inte öppna komprimerad fil \"%s\": %m" -#: pg_receivewal.c:404 +#: pg_receivewal.c:343 #, c-format msgid "could not seek in compressed file \"%s\": %m" msgstr "kunde inte söka i komprimerad fil \"%s\": %m" -#: pg_receivewal.c:410 +#: pg_receivewal.c:349 #, c-format msgid "could not read compressed file \"%s\": %m" msgstr "kunde inte läsa komprimerad fil \"%s\": %m" -#: pg_receivewal.c:413 +#: pg_receivewal.c:352 #, c-format msgid "could not read compressed file \"%s\": read %d of %zu" msgstr "kunde inte läsa komprimerad fil \"%s\": läste %d av %zu" -#: pg_receivewal.c:423 +#: pg_receivewal.c:362 #, c-format msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping" msgstr "komprimerad segmentfil \"%s\" har inkorrekt okomprimerad storlek %d, hoppar över" -#: pg_receivewal.c:451 +#: pg_receivewal.c:390 #, c-format msgid "could not create LZ4 decompression context: %s" msgstr "kunde inte skapa kontext för LZ4-dekomprimering: %s" -#: pg_receivewal.c:463 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "kunde inte läsa fil \"%s\": %m" - -#: pg_receivewal.c:481 +#: pg_receivewal.c:420 #, c-format msgid "could not decompress file \"%s\": %s" msgstr "kunde inte dekomprimera fil \"%s\": %s" -#: pg_receivewal.c:504 +#: pg_receivewal.c:443 #, c-format msgid "could not free LZ4 decompression context: %s" msgstr "kunde inte frigöra kontext för LZ4-dekomprimering: %s" -#: pg_receivewal.c:509 +#: pg_receivewal.c:448 #, c-format msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping" msgstr "komprimerad segmentfil \"%s\" har inkorrekt okomprimerad storlek %zu, hoppar över" -#: pg_receivewal.c:514 +#: pg_receivewal.c:453 #, c-format msgid "cannot check file \"%s\": compression with %s not supported by this build" msgstr "kan inte kontrollera filen \"%s\": komprimering med %s stöds inte av detta bygge" -#: pg_receivewal.c:641 +#: pg_receivewal.c:578 #, c-format msgid "starting log streaming at %X/%X (timeline %u)" msgstr "startar logg-strömning vid %X/%X (tidslinje %u)" -#: pg_receivewal.c:783 pg_recvlogical.c:785 +#: pg_receivewal.c:693 pg_recvlogical.c:801 #, c-format msgid "could not parse end position \"%s\"" msgstr "kunde inte parsa slutposition \"%s\"" -#: pg_receivewal.c:832 +#: pg_receivewal.c:766 #, c-format msgid "cannot use --create-slot together with --drop-slot" msgstr "kan inte använda --create-slot tillsammans med --drop-slot" -#: pg_receivewal.c:848 +#: pg_receivewal.c:782 #, c-format msgid "cannot use --synchronous together with --no-sync" msgstr "kan inte använda --synchronous tillsammans med --no-sync" -#: pg_receivewal.c:858 +#: pg_receivewal.c:792 #, c-format msgid "no target directory specified" msgstr "ingen mÃ¥lkatalog angiven" -#: pg_receivewal.c:882 +#: pg_receivewal.c:816 #, c-format msgid "compression with %s is not yet supported" msgstr "komprimering med %s stöds inte än" -#: pg_receivewal.c:924 +#: pg_receivewal.c:859 #, c-format msgid "replication connection using slot \"%s\" is unexpectedly database specific" msgstr "replikeringsanslutning som använder slot \"%s\" är oväntat databasspecifik" -#: pg_receivewal.c:943 pg_recvlogical.c:955 +#: pg_receivewal.c:878 pg_recvlogical.c:972 #, c-format msgid "dropping replication slot \"%s\"" msgstr "slänger replikeringsslot \"%s\"" -#: pg_receivewal.c:954 pg_recvlogical.c:965 +#: pg_receivewal.c:889 pg_recvlogical.c:982 #, c-format msgid "creating replication slot \"%s\"" msgstr "skapar replikeringsslot \"%s\"" -#: pg_receivewal.c:983 pg_recvlogical.c:989 +#: pg_receivewal.c:918 pg_recvlogical.c:1006 #, c-format msgid "disconnected" msgstr "nerkopplad" #. translator: check source for value for %d -#: pg_receivewal.c:987 pg_recvlogical.c:993 +#: pg_receivewal.c:922 pg_recvlogical.c:1010 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "nerkopplad; väntar %d sekunder för att försöka igen" -#: pg_recvlogical.c:76 +#: pg_recvlogical.c:84 #, c-format msgid "" "%s controls PostgreSQL logical decoding streams.\n" @@ -1363,7 +2154,7 @@ msgstr "" "%s styr PostgreSQL:s logiskt avkodade strömmar.\n" "\n" -#: pg_recvlogical.c:80 +#: pg_recvlogical.c:88 #, c-format msgid "" "\n" @@ -1372,17 +2163,17 @@ msgstr "" "\n" "Handling att utföra:\n" -#: pg_recvlogical.c:83 +#: pg_recvlogical.c:91 #, c-format msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n" msgstr " --start starta strömning i en replikeringsslot (angÃ¥ende slot:ens namn, se --slot)\n" -#: pg_recvlogical.c:86 +#: pg_recvlogical.c:94 #, c-format msgid " -f, --file=FILE receive log into this file, - for stdout\n" msgstr " -f, --file=FIL ta emot logg till denna fil, - för stdout\n" -#: pg_recvlogical.c:87 +#: pg_recvlogical.c:95 #, c-format msgid "" " -F --fsync-interval=SECS\n" @@ -1391,12 +2182,12 @@ msgstr "" " -F --fsync-interval=SEK\n" " tid mellan fsync av utdatafil (standard: %d)\n" -#: pg_recvlogical.c:90 +#: pg_recvlogical.c:98 #, c-format msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n" msgstr " -I, --startpos=LSN var i en existerande slot skall strömningen starta\n" -#: pg_recvlogical.c:92 +#: pg_recvlogical.c:100 #, c-format msgid "" " -o, --option=NAME[=VALUE]\n" @@ -1407,399 +2198,399 @@ msgstr "" " skicka vidare flaggan NAMN med ev. värde VÄRDE till\n" " utmatnings-plugin:en\n" -#: pg_recvlogical.c:95 +#: pg_recvlogical.c:103 #, c-format msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n" msgstr " -P, --plugin=PLUGIN använd utmatnings-plugin:en PLUGIN (standard: %s)\n" -#: pg_recvlogical.c:98 +#: pg_recvlogical.c:106 #, c-format msgid " -S, --slot=SLOTNAME name of the logical replication slot\n" msgstr " -S, --slot=SLOTNAMN namn pÃ¥ den logiska replikerings-slotten\n" -#: pg_recvlogical.c:99 +#: pg_recvlogical.c:107 #, c-format msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n" msgstr " -t, --two-phase slÃ¥ pÃ¥ avkodning av förberedda transaktioner när en slot skapas\n" -#: pg_recvlogical.c:104 +#: pg_recvlogical.c:112 #, c-format msgid " -d, --dbname=DBNAME database to connect to\n" msgstr " -d, --dbname=DBNAMN databas att ansluta till\n" -#: pg_recvlogical.c:137 +#: pg_recvlogical.c:145 #, c-format msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)" msgstr "bekräftar skrivning fram till %X/%X, flush till %X/%X (slot %s)" -#: pg_recvlogical.c:161 receivelog.c:366 +#: pg_recvlogical.c:169 receivelog.c:360 #, c-format msgid "could not send feedback packet: %s" msgstr "kunde inte skicka feedback-paket: %s" -#: pg_recvlogical.c:229 +#: pg_recvlogical.c:239 #, c-format msgid "starting log streaming at %X/%X (slot %s)" msgstr "startar logg-strömning vid %X/%X (slot %s)" -#: pg_recvlogical.c:271 +#: pg_recvlogical.c:281 #, c-format msgid "streaming initiated" msgstr "strömning initierad" -#: pg_recvlogical.c:335 +#: pg_recvlogical.c:346 #, c-format msgid "could not open log file \"%s\": %m" msgstr "kunde inte öppna loggfil \"%s\": %m" -#: pg_recvlogical.c:364 receivelog.c:889 +#: pg_recvlogical.c:375 receivelog.c:882 #, c-format msgid "invalid socket: %s" msgstr "ogiltigt uttag: %s" -#: pg_recvlogical.c:417 receivelog.c:917 +#: pg_recvlogical.c:428 receivelog.c:910 #, c-format msgid "%s() failed: %m" msgstr "%s() misslyckades: %m" -#: pg_recvlogical.c:424 receivelog.c:967 +#: pg_recvlogical.c:435 receivelog.c:959 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "kunde inte ta emot data frÃ¥n WAL-ström: %s" -#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011 -#: receivelog.c:1074 +#: pg_recvlogical.c:477 pg_recvlogical.c:528 receivelog.c:1003 +#: receivelog.c:1066 #, c-format msgid "streaming header too small: %d" msgstr "strömningsheader för liten: %d" -#: pg_recvlogical.c:501 receivelog.c:849 +#: pg_recvlogical.c:512 receivelog.c:843 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "okänd strömningsheader: \"%c\"" -#: pg_recvlogical.c:555 pg_recvlogical.c:567 +#: pg_recvlogical.c:566 pg_recvlogical.c:578 #, c-format msgid "could not write %d bytes to log file \"%s\": %m" msgstr "kunde inte skriva %d byte till loggfil \"%s\": %m" -#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685 +#: pg_recvlogical.c:636 receivelog.c:642 receivelog.c:679 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "oväntad terminering av replikeringsström: %s" -#: pg_recvlogical.c:780 +#: pg_recvlogical.c:796 #, c-format msgid "could not parse start position \"%s\"" msgstr "kunde inte parsa startposition \"%s\"" -#: pg_recvlogical.c:858 +#: pg_recvlogical.c:874 #, c-format msgid "no slot specified" msgstr "ingen slot angiven" -#: pg_recvlogical.c:865 +#: pg_recvlogical.c:881 #, c-format msgid "no target file specified" msgstr "ingen mÃ¥lfil angiven" -#: pg_recvlogical.c:872 +#: pg_recvlogical.c:888 #, c-format msgid "no database specified" msgstr "ingen databas angiven" -#: pg_recvlogical.c:879 +#: pg_recvlogical.c:895 #, c-format msgid "at least one action needs to be specified" msgstr "minst en handling mÃ¥ste anges" -#: pg_recvlogical.c:886 +#: pg_recvlogical.c:902 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "kan inte använda --create-slot eller --start tillsammans med --drop-slot" -#: pg_recvlogical.c:893 +#: pg_recvlogical.c:909 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "kan inte använda --create-slot eller --drop-slot tillsammans med --startpos" -#: pg_recvlogical.c:900 +#: pg_recvlogical.c:916 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos fÃ¥r bara anges tillsammans med --start" -#: pg_recvlogical.c:907 +#: pg_recvlogical.c:923 #, c-format msgid "--two-phase may only be specified with --create-slot" msgstr "--two-phase fÃ¥r bara anges tillsammans med --create-slot" -#: pg_recvlogical.c:939 +#: pg_recvlogical.c:956 #, c-format msgid "could not establish database-specific replication connection" msgstr "kunde inte upprätta databasspecifik replikeringsanslutning" -#: pg_recvlogical.c:1033 +#: pg_recvlogical.c:1056 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "slutposition %X/%X nÃ¥dd av keepalive" -#: pg_recvlogical.c:1036 +#: pg_recvlogical.c:1061 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "slutposition %X/%X nÃ¥dd av WAL-post vid %X/%X" -#: receivelog.c:68 +#: receivelog.c:66 #, c-format msgid "could not create archive status file \"%s\": %s" msgstr "kunde inte skapa arkiveringsstatusfil \"%s\": %s" -#: receivelog.c:75 +#: receivelog.c:73 #, c-format msgid "could not close archive status file \"%s\": %s" msgstr "kunde inte stänga arkiveringsstatusfil \"%s\": %s" -#: receivelog.c:123 +#: receivelog.c:122 #, c-format msgid "could not get size of write-ahead log file \"%s\": %s" msgstr "kunde inte hämta storleken pÃ¥ write-ahead-logg-fil \"%s\": %s" -#: receivelog.c:134 +#: receivelog.c:133 #, c-format msgid "could not open existing write-ahead log file \"%s\": %s" msgstr "kunde inte öppna existerande write-ahead-logg-fil \"%s\": %s" -#: receivelog.c:143 +#: receivelog.c:142 #, c-format msgid "could not fsync existing write-ahead log file \"%s\": %s" msgstr "kunde inte fsync:a befintlig write-ahead-logg-fil \"%s\": %s" -#: receivelog.c:158 +#: receivelog.c:157 #, c-format msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d" msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d" msgstr[0] "write-ahead-logg-fil \"%s\" har %zd byte, skall vara 0 eller %d" msgstr[1] "write-ahead-logg-fil \"%s\" har %zd byte, skall vara 0 eller %d" -#: receivelog.c:174 +#: receivelog.c:175 #, c-format msgid "could not open write-ahead log file \"%s\": %s" msgstr "kunde inte öppna write-ahead-logg-fil \"%s\": %s" -#: receivelog.c:208 -#, c-format -msgid "could not determine seek position in file \"%s\": %s" -msgstr "kunde inte fastställa sökposition i fil \"%s\": %s" - -#: receivelog.c:223 +#: receivelog.c:216 #, c-format msgid "not renaming \"%s\", segment is not complete" msgstr "byter inte namn pÃ¥ \"%s\", segmentet är inte komplett" -#: receivelog.c:234 receivelog.c:323 receivelog.c:694 +#: receivelog.c:227 receivelog.c:317 receivelog.c:688 #, c-format msgid "could not close file \"%s\": %s" msgstr "kunde inte stänga fil \"%s\": %s" -#: receivelog.c:295 +#: receivelog.c:288 #, c-format msgid "server reported unexpected history file name for timeline %u: %s" msgstr "servern rapporterade oväntat historikfilnamn för tidslinje %u: %s" -#: receivelog.c:303 +#: receivelog.c:297 #, c-format msgid "could not create timeline history file \"%s\": %s" msgstr "kunde inte skapa tidslinjehistorikfil \"%s\": %s" -#: receivelog.c:310 +#: receivelog.c:304 #, c-format msgid "could not write timeline history file \"%s\": %s" msgstr "kunde inte skriva tidslinjehistorikfil \"%s\": %s" -#: receivelog.c:400 +#: receivelog.c:394 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions older than %s" msgstr "inkompatibel serverversion %s; klienten stöder inte stömning frÃ¥n serverversioner äldre än %s" -#: receivelog.c:409 +#: receivelog.c:403 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions newer than %s" msgstr "inkompatibel serverversion %s; klienten stöder inte stömning frÃ¥n serverversioner nyare än %s" -#: receivelog.c:514 +#: receivelog.c:508 #, c-format msgid "system identifier does not match between base backup and streaming connection" msgstr "systemidentifieraren matchar inte mellan basbackup och strömningsanslutning" -#: receivelog.c:522 +#: receivelog.c:516 #, c-format msgid "starting timeline %u is not present in the server" msgstr "starttidslinje %u finns inte tillgänglig i servern" -#: receivelog.c:561 +#: receivelog.c:555 #, c-format msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields" msgstr "oväntat svar pÃ¥ TIMELINE_HISTORY-kommando: fick %d rader och %d fält, förväntade %d rader och %d fält" -#: receivelog.c:632 +#: receivelog.c:626 #, c-format msgid "server reported unexpected next timeline %u, following timeline %u" msgstr "servern rapporterade oväntad nästa tidslinje %u, följer pÃ¥ tidslinje %u" -#: receivelog.c:638 +#: receivelog.c:632 #, c-format msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X" msgstr "servern stoppade strömning av tidslinje %u vid %X/%X men rapporterade nästa tidslinje %u skulle börja vid %X/%X" -#: receivelog.c:678 +#: receivelog.c:672 #, c-format msgid "replication stream was terminated before stop point" msgstr "replikeringsström avslutades innan stoppunkt" -#: receivelog.c:724 +#: receivelog.c:718 #, c-format msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields" msgstr "oväntad resultatmängd efter slut-pÃ¥-tidslinje: fick %d rader och %d fält, förväntade %d rader och %d fält" -#: receivelog.c:733 +#: receivelog.c:727 #, c-format msgid "could not parse next timeline's starting point \"%s\"" msgstr "kunde inte parsa nästa tidslinjens startpunkt \"%s\"" -#: receivelog.c:781 receivelog.c:1030 walmethods.c:1205 +#: receivelog.c:775 receivelog.c:1022 walmethods.c:1206 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "kunde inte fsync:a fil \"%s\": %s" -#: receivelog.c:1091 +#: receivelog.c:1083 #, c-format msgid "received write-ahead log record for offset %u with no file open" msgstr "tog emot write-ahead-logg-post för offset %u utan att ha nÃ¥gon öppen fil" -#: receivelog.c:1101 +#: receivelog.c:1093 #, c-format msgid "got WAL data offset %08x, expected %08x" msgstr "fick WAL-data-offset %08x, förväntade %08x" -#: receivelog.c:1135 +#: receivelog.c:1128 #, c-format msgid "could not write %d bytes to WAL file \"%s\": %s" msgstr "kunde inte skriva %d byte till WAL-fil \"%s\": %s" -#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230 +#: receivelog.c:1153 receivelog.c:1193 receivelog.c:1222 #, c-format msgid "could not send copy-end packet: %s" msgstr "kunde inte skicka \"copy-end\"-paket: %s" -#: streamutil.c:159 +#: streamutil.c:162 msgid "Password: " msgstr "Lösenord: " -#: streamutil.c:182 +#: streamutil.c:189 #, c-format msgid "could not connect to server" msgstr "kunde inte ansluta till server" -#: streamutil.c:225 +#: streamutil.c:230 #, c-format -msgid "could not clear search_path: %s" -msgstr "kunde inte nollställa search_path: %s" +msgid "could not clear \"search_path\": %s" +msgstr "kunde inte nollställa \"search_path\": %s" -#: streamutil.c:241 +#: streamutil.c:246 #, c-format -msgid "could not determine server setting for integer_datetimes" -msgstr "kunde inte lista ut serverns inställning för integer_datetimes" +msgid "could not determine server setting for \"integer_datetimes\"" +msgstr "kunde inte lista ut serverns inställning för \"integer_datetimes\"" -#: streamutil.c:248 +#: streamutil.c:253 #, c-format -msgid "integer_datetimes compile flag does not match server" -msgstr "kompileringsflaggan integer_datetimes matchar inte servern" +msgid "\"integer_datetimes\" compile flag does not match server" +msgstr "kompileringsflaggan \"integer_datetimes\" matchar inte servern" -#: streamutil.c:299 +#: streamutil.c:372 #, c-format msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "kunde inte hämta WAL-segmentstorlek: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält" -#: streamutil.c:309 +#: streamutil.c:382 #, c-format msgid "WAL segment size could not be parsed" msgstr "WAL-segment-storlek kunde inte parsas" -#: streamutil.c:327 +#: streamutil.c:400 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes" -msgstr[0] "WAL-segmentstorlek mÃ¥ste vara en tvÃ¥potens mellan 1MB och 1GB men fjärrservern rapporterade värdet %d byte" -msgstr[1] "WAL-segmentstorlek mÃ¥ste vara en tvÃ¥potens mellan 1MB och 1GB men fjärrservern rapporterade värdet %d byte" +msgid "remote server reported invalid WAL segment size (%d byte)" +msgid_plural "remote server reported invalid WAL segment size (%d bytes)" +msgstr[0] "fjärrservern rapporterade ogiltig WAL-segmentstorlek (%d byte)" +msgstr[1] "fjärrservern rapporterade ogiltig WAL-segmentstorlek (%d byte)" -#: streamutil.c:372 +#: streamutil.c:404 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "Storleken pÃ¥ WAL-segment mÃ¥ste vara en tvÃ¥potens mellan 1 MB och 1 GB." + +#: streamutil.c:446 #, c-format msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "kunde inte hämta gruppaccessflagga: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält" -#: streamutil.c:381 +#: streamutil.c:455 #, c-format msgid "group access flag could not be parsed: %s" msgstr "gruppaccessflagga kunde inte parsas: %s" -#: streamutil.c:424 streamutil.c:461 +#: streamutil.c:498 streamutil.c:535 #, c-format msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "kunde inte identifiera system: fick %d rader och %d fält, förväntade %d rader och %d eller fler fält" -#: streamutil.c:513 +#: streamutil.c:587 #, c-format msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "kunde inte läsa replikeringsslot \"%s\": fick %d rader och %d fält, förväntade %d rader och %d fält" -#: streamutil.c:525 +#: streamutil.c:599 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "replikeringsslot \"%s\" existerar inte" -#: streamutil.c:536 +#: streamutil.c:610 #, c-format msgid "expected a physical replication slot, got type \"%s\" instead" msgstr "förväntade en fysisk replikeringsslot men fick av typen \"%s\" istället" -#: streamutil.c:550 +#: streamutil.c:624 #, c-format msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" msgstr "kunde inte parsa restart_lsn \"%s\" för replikeringsslot \"%s\"" -#: streamutil.c:667 +#: streamutil.c:741 #, c-format msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "kunde inte skapa replikeringsslot \"%s\": fick %d rader och %d fält, förväntade %d rader och %d fält" -#: streamutil.c:711 +#: streamutil.c:785 #, c-format msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "kunde inte slänga replikeringsslot \"%s\": fick %d rader och %d fält, förväntade %d rader och %d fält" -#: walmethods.c:720 walmethods.c:1267 +#: walmethods.c:726 walmethods.c:1269 msgid "could not compress data" msgstr "kunde inte komprimera data" -#: walmethods.c:749 +#: walmethods.c:755 msgid "could not reset compression stream" msgstr "kunde inte nollställa komprimeringsström" -#: walmethods.c:880 +#: walmethods.c:892 msgid "implementation error: tar files can't have more than one open file" msgstr "implementationsfel: tar-filer kan inte ha mer än en öppen fil" -#: walmethods.c:894 +#: walmethods.c:907 msgid "could not create tar header" msgstr "kunde inte skapa tar-header" -#: walmethods.c:910 walmethods.c:951 walmethods.c:1170 walmethods.c:1183 +#: walmethods.c:924 walmethods.c:965 walmethods.c:1171 walmethods.c:1184 msgid "could not change compression parameters" msgstr "kunde inte ändra komprimeringsparametrar" -#: walmethods.c:1055 +#: walmethods.c:1056 msgid "unlink not supported with compression" msgstr "unlink stöds inte med komprimering" -#: walmethods.c:1291 +#: walmethods.c:1293 msgid "could not close compression stream" msgstr "kunde inte stänga komprimeringsström" diff --git a/src/bin/pg_basebackup/po/uk.po b/src/bin/pg_basebackup/po/uk.po index 695c62a9fd948..09cd1a552dde9 100644 --- a/src/bin/pg_basebackup/po/uk.po +++ b/src/bin/pg_basebackup/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:48+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:20+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pg_basebackup.pot\n" -"X-Crowdin-File-ID: 910\n" +"X-Crowdin-File: /REL_17_STABLE/pg_basebackup.pot\n" +"X-Crowdin-File-ID: 1006\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,84 +37,186 @@ msgstr "деталі: " msgid "hint: " msgstr "підказка: " -#: ../../common/compression.c:157 +#: ../../common/compression.c:132 ../../common/compression.c:141 +#: ../../common/compression.c:150 bbstreamer_gzip.c:116 bbstreamer_gzip.c:249 +#: bbstreamer_lz4.c:100 bbstreamer_lz4.c:298 bbstreamer_zstd.c:129 +#: bbstreamer_zstd.c:284 +#, c-format +msgid "this build does not support compression with %s" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð· %s" + +#: ../../common/compression.c:205 msgid "found empty string where a compression option was expected" msgstr "знайдено порожній Ñ€Ñдок, де очікувавÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ ÑтиÑканнÑ" -#: ../../common/compression.c:187 +#: ../../common/compression.c:244 #, c-format -msgid "unknown compression option \"%s\"" -msgstr "невідомий параметр ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\"" +msgid "unrecognized compression option: \"%s\"" +msgstr "нерозпізнаний алгоритм ÑтиÑканнÑ: \"%s\"" -#: ../../common/compression.c:226 +#: ../../common/compression.c:283 #, c-format msgid "compression option \"%s\" requires a value" msgstr "параметр ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" потребує значеннÑ" -#: ../../common/compression.c:235 +#: ../../common/compression.c:292 #, c-format msgid "value for compression option \"%s\" must be an integer" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" має бути цілим чиÑлом" -#: ../../common/compression.c:273 +#: ../../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" має бути логічним значеннÑм" + +#: ../../common/compression.c:379 #, c-format msgid "compression algorithm \"%s\" does not accept a compression level" msgstr "алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" не приймає рівень ÑтиÑканнÑ" -#: ../../common/compression.c:277 +#: ../../common/compression.c:386 #, c-format -msgid "compression algorithm \"%s\" expects a compression level between %d and %d" -msgstr "алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" очікує рівень ÑтиÑÐºÐ°Ð½Ð½Ñ Ð¼Ñ–Ð¶ %d Ñ– %d" +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" очікує рівень ÑтиÑÐºÐ°Ð½Ð½Ñ Ð¼Ñ–Ð¶ %d Ñ– %d (за замовчуваннÑм %d)" -#: ../../common/compression.c:289 +#: ../../common/compression.c:397 #, c-format msgid "compression algorithm \"%s\" does not accept a worker count" msgstr "алгоритм ÑтиÑÐ½ÐµÐ½Ð½Ñ \"%s\" не приймає кількіÑть працівників" +#: ../../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "алгоритм ÑтиÑÐ½ÐµÐ½Ð½Ñ \"%s\" не підтримує режим довгої відÑтані" + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m" + +#: ../../common/controldata_utils.c:110 pg_basebackup.c:1873 +#: pg_receivewal.c:402 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: bbstreamer_file.c:138 pg_recvlogical.c:650 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "неможливо закрити файл \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неправильний порÑдок байтів" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "можлива помилка у поÑлідовноÑті байтів.\n" +"ПорÑдок байтів, що викориÑтовують Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ pg_control, може не відповідати тому, Ñкий викориÑтовуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ програмою. У такому випадку результати нижче будуть неправильним, Ñ– інÑталÑÑ†Ñ–Ñ PostgreSQL буде неÑуміÑною з цим каталогом даних." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: pg_basebackup.c:1846 pg_receivewal.c:386 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не можливо відкрити файл \"%s\": %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 pg_recvlogical.c:204 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не вдалоÑÑ fsync файл \"%s\": %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "недоÑтатньо пам'Ñті\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" -#: ../../common/file_utils.c:87 ../../common/file_utils.c:451 -#: pg_receivewal.c:380 pg_recvlogical.c:341 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не вдалоÑÑ Ñинхронізувати файлову ÑиÑтему Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_receivewal.c:319 pg_recvlogical.c:352 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" -#: ../../common/file_utils.c:166 pg_receivewal.c:303 +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує метод Ñинхронізації \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_receivewal.c:242 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" -#: ../../common/file_utils.c:200 pg_receivewal.c:534 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_receivewal.c:471 #, c-format msgid "could not read directory \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" -#: ../../common/file_utils.c:232 ../../common/file_utils.c:291 -#: ../../common/file_utils.c:365 ../../fe_utils/recovery_gen.c:121 -#: pg_receivewal.c:447 +#: ../../common/file_utils.c:498 pg_basebackup.c:2344 walmethods.c:462 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "не можливо відкрити файл \"%s\": %m" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" -#: ../../common/file_utils.c:303 ../../common/file_utils.c:373 -#: pg_recvlogical.c:196 +#: ../../common/restricted_token.c:60 #, c-format -msgid "could not fsync file \"%s\": %m" -msgstr "не вдалоÑÑ fsync файл \"%s\": %m" +msgid "could not open process token: error code %lu" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ токен процеÑу: код помилки %lu" -#: ../../common/file_utils.c:383 pg_basebackup.c:2256 walmethods.c:459 +#: ../../common/restricted_token.c:74 #, c-format -msgid "could not rename file \"%s\" to \"%s\": %m" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" +msgid "could not allocate SIDs: error code %lu" +msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ SID: код помилки %lu" + +#: ../../common/restricted_token.c:94 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "не вдалоÑÑ Ñтворити обмежений токен: код помилки %lu" + +#: ../../common/restricted_token.c:115 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ \"%s\": код помилки %lu" + +#: ../../common/restricted_token.c:153 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑтити з обмеженим токеном: код помилки %lu" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑу: код помилки %lu" #: ../../fe_utils/option_utils.c:69 #, c-format @@ -126,51 +228,62 @@ msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ msgid "%s must be in range %d..%d" msgstr "%s має бути в діапазоні %d..%d" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 pg_basebackup.c:1635 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нерозпізнаний метод Ñинхронізації: %s" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 pg_basebackup.c:1636 streamutil.c:331 #, c-format msgid "out of memory" msgstr "недоÑтатньо пам'Ñті" -#: ../../fe_utils/recovery_gen.c:124 bbstreamer_file.c:121 -#: bbstreamer_file.c:258 pg_basebackup.c:1432 pg_basebackup.c:1726 +#: ../../fe_utils/recovery_gen.c:143 bbstreamer_file.c:121 +#: bbstreamer_file.c:258 pg_basebackup.c:1433 pg_basebackup.c:1727 #, c-format msgid "could not write to file \"%s\": %m" msgstr "неможливо запиÑати до файлу \"%s\": %m" -#: ../../fe_utils/recovery_gen.c:133 bbstreamer_file.c:93 bbstreamer_file.c:339 -#: pg_basebackup.c:1496 pg_basebackup.c:1705 +#: ../../fe_utils/recovery_gen.c:152 bbstreamer_file.c:93 bbstreamer_file.c:361 +#: pg_basebackup.c:1497 pg_basebackup.c:1706 #, c-format msgid "could not create file \"%s\": %m" msgstr "неможливо Ñтворити файл \"%s\": %m" -#: bbstreamer_file.c:138 pg_recvlogical.c:635 +#: ../../fe_utils/string_utils.c:434 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "неможливо закрити файл \"%s\": %m" +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "аргумент командної оболонки міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "назва бази даних міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" #: bbstreamer_file.c:275 #, c-format msgid "unexpected state while extracting archive" msgstr "неочікуваний Ñтан під Ñ‡Ð°Ñ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ" -#: bbstreamer_file.c:298 pg_basebackup.c:686 pg_basebackup.c:730 +#: bbstreamer_file.c:321 pg_basebackup.c:698 pg_basebackup.c:712 +#: pg_basebackup.c:757 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не вдалоÑÑ Ñтворити каталог \"%s\": %m" -#: bbstreamer_file.c:304 +#: bbstreamer_file.c:326 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñтановити права Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ \"%s\": %m" -#: bbstreamer_file.c:323 +#: bbstreamer_file.c:345 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "не вдалоÑÑ Ñтворити Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ Ð· \"%s\" на \"%s\": %m" -#: bbstreamer_file.c:343 +#: bbstreamer_file.c:365 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñтановити права на файл \"%s\": %m" @@ -190,32 +303,27 @@ msgstr "не вдалоÑÑ Ð´ÑƒÐ±Ð»ÑŽÐ²Ð°Ñ‚Ð¸ stdout: %m" msgid "could not open output file: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вихідний файл: %m" -#: bbstreamer_gzip.c:113 +#: bbstreamer_gzip.c:111 #, c-format msgid "could not set compression level %d: %s" msgstr "не вдалоÑÑ Ð²Ñтановити рівень ÑтиÑÐºÐ°Ð½Ð½Ñ %d: %s" -#: bbstreamer_gzip.c:118 bbstreamer_gzip.c:251 -#, c-format -msgid "this build does not support gzip compression" -msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує ÑтиÑÐ½ÐµÐ½Ð½Ñ gzip" - -#: bbstreamer_gzip.c:145 +#: bbstreamer_gzip.c:143 #, c-format msgid "could not write to compressed file \"%s\": %s" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до ÑтиÑнутого файлу \"%s\": %s" -#: bbstreamer_gzip.c:169 +#: bbstreamer_gzip.c:167 #, c-format msgid "could not close compressed file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ ÑтиÑнутий файл \"%s\": %m" -#: bbstreamer_gzip.c:247 walmethods.c:869 +#: bbstreamer_gzip.c:245 walmethods.c:880 #, c-format msgid "could not initialize compression library" msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ бібліотеку ÑтиÑканнÑ" -#: bbstreamer_gzip.c:298 bbstreamer_lz4.c:355 bbstreamer_zstd.c:319 +#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329 #, c-format msgid "could not decompress data: %s" msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ дані: %s" @@ -225,32 +333,27 @@ msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ дані: %s" msgid "unexpected state while injecting recovery settings" msgstr "неочікуваний Ñтан під Ñ‡Ð°Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½ÑŒ відновленнÑ" -#: bbstreamer_lz4.c:96 +#: bbstreamer_lz4.c:95 #, c-format msgid "could not create lz4 compression context: %s" msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ ÑтиÑÐ½ÐµÐ½Ð½Ñ lz4: %s" -#: bbstreamer_lz4.c:101 bbstreamer_lz4.c:299 -#, c-format -msgid "this build does not support lz4 compression" -msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує ÑтиÑÐ½ÐµÐ½Ð½Ñ lz4" - -#: bbstreamer_lz4.c:141 +#: bbstreamer_lz4.c:140 #, c-format msgid "could not write lz4 header: %s" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати заголовок lz4: %s" -#: bbstreamer_lz4.c:190 bbstreamer_zstd.c:171 bbstreamer_zstd.c:213 +#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223 #, c-format msgid "could not compress data: %s" msgstr "не вдалоÑÑ ÑтиÑнути дані: %s" -#: bbstreamer_lz4.c:242 +#: bbstreamer_lz4.c:241 #, c-format msgid "could not end lz4 compression: %s" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ñ‚Ð¸ ÑтиÑÐºÐ°Ð½Ð½Ñ lz4: %s" -#: bbstreamer_lz4.c:294 +#: bbstreamer_lz4.c:293 #, c-format msgid "could not initialize compression library: %s" msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ бібліотеку ÑтиÑненнÑ: %s" @@ -265,12 +368,12 @@ msgstr "причіп файлу tar перевищує 2 блоки" msgid "unexpected state while parsing tar archive" msgstr "неочікуваний Ñтан під Ñ‡Ð°Ñ Ñ€Ð¾Ð·Ð±Ð¾Ñ€Ñƒ архіву tar" -#: bbstreamer_tar.c:296 +#: bbstreamer_tar.c:292 #, c-format msgid "tar member has empty name" msgstr "чаÑтина tar міÑтить порожню назву" -#: bbstreamer_tar.c:328 +#: bbstreamer_tar.c:326 #, c-format msgid "COPY stream ended before last file was finished" msgstr "потік COPY завершивÑÑ Ð´Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ñтаннього файлу" @@ -280,397 +383,415 @@ msgstr "потік COPY завершивÑÑ Ð´Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ñта msgid "could not create zstd compression context" msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ ÑтиÑÐ½ÐµÐ½Ð½Ñ zstd" -#: bbstreamer_zstd.c:93 +#: bbstreamer_zstd.c:91 #, c-format msgid "could not set zstd compression level to %d: %s" msgstr "не вдалоÑÑ Ð²Ñтановити рівень ÑтиÑÐºÐ°Ð½Ð½Ñ zstd на %d: %s" -#: bbstreamer_zstd.c:108 +#: bbstreamer_zstd.c:105 #, c-format msgid "could not set compression worker count to %d: %s" msgstr "не вдалоÑÑ Ð²Ñтановити кількіÑть процеÑів ÑтиÑÐºÐ°Ð½Ð½Ñ Ð½Ð° %d: %s" -#: bbstreamer_zstd.c:119 bbstreamer_zstd.c:274 +#: bbstreamer_zstd.c:116 #, c-format -msgid "this build does not support zstd compression" -msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує ÑтиÑÐ½ÐµÐ½Ð½Ñ zstd" +msgid "could not enable long-distance mode: %s" +msgstr "не вдалоÑÑ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ режим довгої відÑтані: %s" -#: bbstreamer_zstd.c:265 +#: bbstreamer_zstd.c:275 #, c-format msgid "could not create zstd decompression context" msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ zstd декомпреÑÑ–Ñ—" -#: pg_basebackup.c:240 +#: pg_basebackup.c:245 #, c-format msgid "removing data directory \"%s\"" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з директорії \"%s\"" -#: pg_basebackup.c:242 +#: pg_basebackup.c:247 #, c-format msgid "failed to remove data directory" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ дані директорії" -#: pg_basebackup.c:246 +#: pg_basebackup.c:251 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з директорії \"%s\"" -#: pg_basebackup.c:248 +#: pg_basebackup.c:253 #, c-format msgid "failed to remove contents of data directory" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ дані директорії" -#: pg_basebackup.c:253 +#: pg_basebackup.c:258 #, c-format msgid "removing WAL directory \"%s\"" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ WAL директорії \"%s\"" -#: pg_basebackup.c:255 +#: pg_basebackup.c:260 #, c-format msgid "failed to remove WAL directory" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ директорію WAL" -#: pg_basebackup.c:259 +#: pg_basebackup.c:264 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… з директорії WAL \"%s\"" -#: pg_basebackup.c:261 +#: pg_basebackup.c:266 #, c-format msgid "failed to remove contents of WAL directory" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ дані директорії WAL" -#: pg_basebackup.c:267 +#: pg_basebackup.c:272 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð°Ð½Ð¸Ñ… \"%s\" не видалена за запитом кориÑтувача" -#: pg_basebackup.c:270 +#: pg_basebackup.c:275 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ WAL \"%s\" не видалена за запитом кориÑтувача" -#: pg_basebackup.c:274 +#: pg_basebackup.c:279 #, c-format msgid "changes to tablespace directories will not be undone" msgstr "зміни в каталогах табличних проÑторів незворотні" -#: pg_basebackup.c:326 +#: pg_basebackup.c:331 #, c-format msgid "directory name too long" msgstr "ім'Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ— задовге" -#: pg_basebackup.c:333 +#: pg_basebackup.c:338 #, c-format msgid "multiple \"=\" signs in tablespace mapping" msgstr "кілька знаків \"=\" зіÑтавленні табличних проÑторів" -#: pg_basebackup.c:342 +#: pg_basebackup.c:347 #, c-format msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" msgstr "неприпуÑтимий табличний проÑтір зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñƒ \"%s\", має бути \"OLDDIR = NEWDIR\"" -#: pg_basebackup.c:351 +#: pg_basebackup.c:366 #, c-format msgid "old directory is not an absolute path in tablespace mapping: %s" msgstr "Ñтарий каталог не Ñ” абÑолютним шлÑхом у зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору: %s" -#: pg_basebackup.c:355 +#: pg_basebackup.c:370 #, c-format msgid "new directory is not an absolute path in tablespace mapping: %s" msgstr "новий каталог не Ñ” абÑолютним шлÑхом у зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору: %s" -#: pg_basebackup.c:377 +#: pg_basebackup.c:392 #, c-format msgid "%s takes a base backup of a running PostgreSQL server.\n\n" msgstr "%s робить базову резервну копію працюючого Ñервера PostgreSQL.\n\n" -#: pg_basebackup.c:379 pg_receivewal.c:81 pg_recvlogical.c:78 +#: pg_basebackup.c:394 pg_createsubscriber.c:221 pg_receivewal.c:79 +#: pg_recvlogical.c:86 #, c-format msgid "Usage:\n" msgstr "ВикориÑтаннÑ:\n" -#: pg_basebackup.c:380 pg_receivewal.c:82 pg_recvlogical.c:79 +#: pg_basebackup.c:395 pg_createsubscriber.c:222 pg_receivewal.c:80 +#: pg_recvlogical.c:87 #, c-format msgid " %s [OPTION]...\n" msgstr " %s: [OPTION]...\n" -#: pg_basebackup.c:381 +#: pg_basebackup.c:396 #, c-format msgid "\n" "Options controlling the output:\n" msgstr "\n" "Параметри, що контролюють вивід:\n" -#: pg_basebackup.c:382 +#: pg_basebackup.c:397 #, c-format msgid " -D, --pgdata=DIRECTORY receive base backup into directory\n" msgstr " -D, -- pgdata=DIRECTORY директоріÑ, в Ñку зберегти резервну копію бази\n" -#: pg_basebackup.c:383 +#: pg_basebackup.c:398 #, c-format msgid " -F, --format=p|t output format (plain (default), tar)\n" msgstr " -F, --format=p|Ñ‚ формат виводу (звичайний за замовчуваннÑм, tar)\n" -#: pg_basebackup.c:384 +#: pg_basebackup.c:399 +#, c-format +msgid " -i, --incremental=OLDMANIFEST\n" +" take incremental backup\n" +msgstr " -i, --incremental=OLDMANIFEST\n" +" Ñтворювати інкрементні резервні копії\n" + +#: pg_basebackup.c:401 #, c-format msgid " -r, --max-rate=RATE maximum transfer rate to transfer data directory\n" " (in kB/s, or use suffix \"k\" or \"M\")\n" msgstr " -r, --max-rate=RATE макÑимальна швидкіÑть Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… до директорії\n" " (у кБ/Ñ Ð°Ð±Ð¾ з викориÑтаннÑм ÑуфікÑів \"k\" або \"М\")\n" -#: pg_basebackup.c:386 +#: pg_basebackup.c:403 #, c-format msgid " -R, --write-recovery-conf\n" " write configuration for replication\n" msgstr " -R, --write-recovery-conf\n" " запиÑати конфігурацію Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—\n" -#: pg_basebackup.c:388 +#: pg_basebackup.c:405 #, c-format msgid " -t, --target=TARGET[:DETAIL]\n" " backup target (if other than client)\n" msgstr " -t, --target=TARGET[:DETAIL]\n" " ціль резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ (Ñкщо не клієнт)\n" -#: pg_basebackup.c:390 +#: pg_basebackup.c:407 #, c-format msgid " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" " relocate tablespace in OLDDIR to NEWDIR\n" msgstr " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" " перенеÑÑ‚b табличний проÑтір з OLDDIR до NEWDIR\n" -#: pg_basebackup.c:392 +#: pg_basebackup.c:409 #, c-format msgid " --waldir=WALDIR location for the write-ahead log directory\n" msgstr "--waldir=WALDIR Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ попереднього запиÑу\n" -#: pg_basebackup.c:393 +#: pg_basebackup.c:410 #, c-format msgid " -X, --wal-method=none|fetch|stream\n" " include required WAL files with specified method\n" msgstr " -X, --wal-method=none|fetch|stream\n" " додати необхідні WAL файли за допомогою вказаного методу\n" -#: pg_basebackup.c:395 +#: pg_basebackup.c:412 #, c-format msgid " -z, --gzip compress tar output\n" msgstr " -z, --gzip ÑтиÑнути вихідний tar\n" -#: pg_basebackup.c:396 +#: pg_basebackup.c:413 #, c-format msgid " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" " compress on client or server as specified\n" msgstr " -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" " ÑтиÑкати на клієнті або Ñервері, Ñк зазначено\n" -#: pg_basebackup.c:398 +#: pg_basebackup.c:415 #, c-format msgid " -Z, --compress=none do not compress tar output\n" msgstr " -Z, --compress=none не ÑтиÑкати вивід tar\n" -#: pg_basebackup.c:399 +#: pg_basebackup.c:416 #, c-format msgid "\n" "General options:\n" msgstr "\n" "ОÑновні налаштуваннÑ:\n" -#: pg_basebackup.c:400 +#: pg_basebackup.c:417 #, c-format msgid " -c, --checkpoint=fast|spread\n" -" set fast or spread checkpointing\n" +" set fast or spread (default) checkpointing\n" msgstr " -c, --checkpoint=fast|spread\n" -" режим швидких або розділених контрольних точок\n" +" вÑтановлювати швидкі або розподілені (за замовчуваннÑм) контрольні точки\n" -#: pg_basebackup.c:402 +#: pg_basebackup.c:419 #, c-format msgid " -C, --create-slot create replication slot\n" msgstr " -C, --create-slot Ñтворити Ñлот Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—\n" -#: pg_basebackup.c:403 +#: pg_basebackup.c:420 #, c-format msgid " -l, --label=LABEL set backup label\n" msgstr " -l, --label=LABEL вÑтановити мітку резервної копії\n" -#: pg_basebackup.c:404 +#: pg_basebackup.c:421 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean не очищати піÑÐ»Ñ Ð¿Ð¾Ð¼Ð¸Ð»Ð¾Ðº\n" -#: pg_basebackup.c:405 +#: pg_basebackup.c:422 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync не чекати Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… на диÑку\n" -#: pg_basebackup.c:406 +#: pg_basebackup.c:423 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress відображати інформацію про прогреÑ\n" -#: pg_basebackup.c:407 pg_receivewal.c:91 +#: pg_basebackup.c:424 pg_receivewal.c:89 #, c-format msgid " -S, --slot=SLOTNAME replication slot to use\n" msgstr " -S, --slot=ИМ'Я_СЛОТРвикориÑтовувати вказаний Ñлот реплікації\n" -#: pg_basebackup.c:408 pg_receivewal.c:93 pg_recvlogical.c:100 +#: pg_basebackup.c:425 pg_receivewal.c:91 pg_recvlogical.c:108 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose виводити детальні повідомленнÑ\n" -#: pg_basebackup.c:409 pg_receivewal.c:94 pg_recvlogical.c:101 +#: pg_basebackup.c:426 pg_receivewal.c:92 pg_recvlogical.c:109 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" -#: pg_basebackup.c:410 +#: pg_basebackup.c:427 #, c-format msgid " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" " use algorithm for manifest checksums\n" msgstr " --manifest-checksums=SHA{224,256,384,512}|CRC32C|ÐЕ\n" " викориÑтовувати алгоритм Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум маніфеÑту\n" -#: pg_basebackup.c:412 +#: pg_basebackup.c:429 #, c-format msgid " --manifest-force-encode\n" " hex encode all file names in manifest\n" msgstr " --manifest-force-encode\n" " кодувати у hex вÑÑ– імена файлів у маніфеÑті\n" -#: pg_basebackup.c:414 +#: pg_basebackup.c:431 #, c-format msgid " --no-estimate-size do not estimate backup size in server side\n" msgstr " --no-estimate-size не оцінювати розмір резервної копії на Ñтороні Ñервера\n" -#: pg_basebackup.c:415 +#: pg_basebackup.c:432 #, c-format msgid " --no-manifest suppress generation of backup manifest\n" msgstr " --no-manifest пропуÑтити ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту резервного копіюваннÑ\n" -#: pg_basebackup.c:416 +#: pg_basebackup.c:433 #, c-format msgid " --no-slot prevent creation of temporary replication slot\n" msgstr " --no-slot не Ñтворювати тимчаÑового Ñлоту реплікації\n" -#: pg_basebackup.c:417 +#: pg_basebackup.c:434 #, c-format msgid " --no-verify-checksums\n" " do not verify checksums\n" msgstr " --no-verify-checksums\n" " не перевірÑти контрольні Ñуми\n" -#: pg_basebackup.c:419 pg_receivewal.c:97 pg_recvlogical.c:102 +#: pg_basebackup.c:436 +#, c-format +msgid " --sync-method=METHOD\n" +" set method for syncing files to disk\n" +msgstr " --sync-method=METHOD\n" +" вÑтановити метод Ñинхронізації файлів на диÑк\n" + +#: pg_basebackup.c:438 pg_receivewal.c:95 pg_recvlogical.c:110 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку потім вийти\n" -#: pg_basebackup.c:420 pg_receivewal.c:98 pg_recvlogical.c:103 +#: pg_basebackup.c:439 pg_receivewal.c:96 pg_recvlogical.c:111 #, c-format msgid "\n" "Connection options:\n" msgstr "\n" "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·'єднаннÑ:\n" -#: pg_basebackup.c:421 pg_receivewal.c:99 +#: pg_basebackup.c:440 pg_receivewal.c:97 #, c-format msgid " -d, --dbname=CONNSTR connection string\n" msgstr " -d, --dbname=CONNSTR Ñ€Ñдок з'єднаннÑ\n" -#: pg_basebackup.c:422 pg_receivewal.c:100 pg_recvlogical.c:105 +#: pg_basebackup.c:441 pg_receivewal.c:98 pg_recvlogical.c:113 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME хоÑÑ‚ Ñервера бази даних або каталог Ñокетів\n" -#: pg_basebackup.c:423 pg_receivewal.c:101 pg_recvlogical.c:106 +#: pg_basebackup.c:442 pg_receivewal.c:99 pg_recvlogical.c:114 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT порт Ñервера бази даних\n" -#: pg_basebackup.c:424 +#: pg_basebackup.c:443 #, c-format msgid " -s, --status-interval=INTERVAL\n" " time between status packets sent to server (in seconds)\n" msgstr " -s, --status-interval=INTERVAL чаÑу між пакетами ÑтатуÑу до Ñервера (у Ñекундах)\n" -#: pg_basebackup.c:426 pg_receivewal.c:102 pg_recvlogical.c:107 +#: pg_basebackup.c:445 pg_receivewal.c:100 pg_recvlogical.c:115 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAME підключатиÑÑŒ Ñк вказаний кориÑтувач бази даних\n" -#: pg_basebackup.c:427 pg_receivewal.c:103 pg_recvlogical.c:108 +#: pg_basebackup.c:446 pg_receivewal.c:101 pg_recvlogical.c:116 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ніколи не питати пароль\n" -#: pg_basebackup.c:428 pg_receivewal.c:104 pg_recvlogical.c:109 +#: pg_basebackup.c:447 pg_receivewal.c:102 pg_recvlogical.c:117 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password обов'Ñзково питати пароль (повинно відбуватиÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾)\n" -#: pg_basebackup.c:429 pg_receivewal.c:108 pg_recvlogical.c:110 +#: pg_basebackup.c:448 pg_createsubscriber.c:240 pg_receivewal.c:106 +#: pg_recvlogical.c:118 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "ПовідомлÑти про помилки на <%s>.\n" -#: pg_basebackup.c:430 pg_receivewal.c:109 pg_recvlogical.c:111 +#: pg_basebackup.c:449 pg_createsubscriber.c:241 pg_receivewal.c:107 +#: pg_recvlogical.c:119 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" -#: pg_basebackup.c:472 +#: pg_basebackup.c:488 #, c-format msgid "could not read from ready pipe: %m" msgstr "не можливо прочитати з готових каналів: %m" -#: pg_basebackup.c:475 pg_basebackup.c:622 pg_basebackup.c:2170 -#: streamutil.c:444 +#: pg_basebackup.c:491 pg_basebackup.c:633 pg_basebackup.c:2258 +#: streamutil.c:518 #, c-format msgid "could not parse write-ahead log location \"%s\"" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ наперед журнал локації \"%s\"" -#: pg_basebackup.c:581 pg_receivewal.c:665 +#: pg_basebackup.c:596 pg_receivewal.c:600 #, c-format msgid "could not finish writing WAL files: %m" msgstr "не можливо закінчити напиÑÐ°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² WAL: %m" -#: pg_basebackup.c:631 +#: pg_basebackup.c:642 #, c-format msgid "could not create pipe for background process: %m" msgstr "не можливо Ñтворити канал Ð´Ð»Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¾Ð³Ð¾ процеÑу: %m" -#: pg_basebackup.c:664 +#: pg_basebackup.c:676 #, c-format msgid "created temporary replication slot \"%s\"" msgstr "Ñтворено Ñлот тимчаÑових реплікацій \"%s\"" -#: pg_basebackup.c:667 +#: pg_basebackup.c:679 #, c-format msgid "created replication slot \"%s\"" msgstr "Ñтворено Ñлот реплікацій \"%s\"" -#: pg_basebackup.c:701 +#: pg_basebackup.c:728 #, c-format msgid "could not create background process: %m" msgstr "не можливо Ñтворити фоновий процеÑ: %m" -#: pg_basebackup.c:710 +#: pg_basebackup.c:737 #, c-format msgid "could not create background thread: %m" msgstr "не можливо Ñтворити фоновий потік: %m" -#: pg_basebackup.c:749 +#: pg_basebackup.c:776 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "каталог \"%s\" Ñ–Ñнує, але він не порожній" -#: pg_basebackup.c:755 +#: pg_basebackup.c:782 pg_createsubscriber.c:390 #, c-format msgid "could not access directory \"%s\": %m" msgstr "немає доÑтупу до каталогу \"%s\": %m" -#: pg_basebackup.c:832 +#: pg_basebackup.c:858 #, c-format msgid "%*s/%s kB (100%%), %d/%d tablespace %*s" msgid_plural "%*s/%s kB (100%%), %d/%d tablespaces %*s" @@ -679,7 +800,7 @@ msgstr[1] "%*s/%s kB (100%%), %d/%d табличних проÑтори %*s" msgstr[2] "%*s/%s kB (100%%), %d/%d табличних проÑторів %*s" msgstr[3] "%*s/%s kB (100%%), %d/%d табличних проÑторів %*s" -#: pg_basebackup.c:844 +#: pg_basebackup.c:870 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace (%s%-*.*s)" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces (%s%-*.*s)" @@ -688,7 +809,7 @@ msgstr[1] "%*s/%s kB (%d%%), %d/%d табличних проÑтори (%s%-*.*s msgstr[2] "%*s/%s kB (%d%%), %d/%d табличних проÑторів (%s%-*.*s)" msgstr[3] "%*s/%s kB (%d%%), %d/%d табличних проÑторів (%s%-*.*s)" -#: pg_basebackup.c:860 +#: pg_basebackup.c:886 #, c-format msgid "%*s/%s kB (%d%%), %d/%d tablespace" msgid_plural "%*s/%s kB (%d%%), %d/%d tablespaces" @@ -697,661 +818,1313 @@ msgstr[1] "%*s/%s kB (%d%%), %d/%d табличних проÑтори" msgstr[2] "%*s/%s kB (%d%%), %d/%d табличних проÑторів" msgstr[3] "%*s/%s kB (%d%%), %d/%d табличних проÑторів" -#: pg_basebackup.c:884 +#: pg_basebackup.c:910 #, c-format msgid "transfer rate \"%s\" is not a valid value" msgstr "чаÑтота передач \"%s\" не Ñ” припуÑтимим значеннÑм" -#: pg_basebackup.c:886 +#: pg_basebackup.c:912 #, c-format msgid "invalid transfer rate \"%s\": %m" msgstr "неприпуÑтима чаÑтота передач \"%s\": %m" -#: pg_basebackup.c:893 +#: pg_basebackup.c:919 #, c-format msgid "transfer rate must be greater than zero" msgstr "чаÑтота передач повинна бути більша за нуль" -#: pg_basebackup.c:923 +#: pg_basebackup.c:949 #, c-format msgid "invalid --max-rate unit: \"%s\"" msgstr "неприпуÑтима Ð¾Ð´Ð¸Ð½Ð¸Ñ†Ñ Ð²Ð¸Ð¼Ñ–Ñ€Ñƒ в --max-rate: \"%s\"" -#: pg_basebackup.c:927 +#: pg_basebackup.c:953 #, c-format msgid "transfer rate \"%s\" exceeds integer range" msgstr "швидкіÑть передачі \"%s\" перевищує діапазон цілого чиÑла" -#: pg_basebackup.c:934 +#: pg_basebackup.c:960 #, c-format msgid "transfer rate \"%s\" is out of range" msgstr "швидкіÑть Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ \"%s\" поза діапазоном" -#: pg_basebackup.c:1030 +#: pg_basebackup.c:1022 #, c-format msgid "could not get COPY data stream: %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ потік даних COPY: %s" -#: pg_basebackup.c:1047 pg_recvlogical.c:438 pg_recvlogical.c:610 -#: receivelog.c:981 +#: pg_basebackup.c:1039 pg_recvlogical.c:449 pg_recvlogical.c:625 +#: receivelog.c:973 #, c-format msgid "could not read COPY data: %s" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ дані COPY: %s" -#: pg_basebackup.c:1051 +#: pg_basebackup.c:1043 #, c-format msgid "background process terminated unexpectedly" msgstr "фоновий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð½ÐµÑподівано перервано" -#: pg_basebackup.c:1122 +#: pg_basebackup.c:1114 #, c-format -msgid "cannot inject manifest into a compressed tarfile" +msgid "cannot inject manifest into a compressed tar file" msgstr "неможливо підÑтавити маніфеÑÑ‚ в ÑтиÑнений tar-файл" -#: pg_basebackup.c:1123 +#: pg_basebackup.c:1115 #, c-format -msgid "use client-side compression, send the output to a directory rather than standard output, or use --no-manifest" -msgstr "викориÑтйте ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð½Ð° клієнті та Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… в каталог заміÑть Ñтандартного виводу, або викориÑтайте параметр --no-manifest" +msgid "Use client-side compression, send the output to a directory rather than standard output, or use %s." +msgstr "ВикориÑтайте ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð½Ð° клієнті та Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… в каталог заміÑть Ñтандартного виводу, або викориÑтайте %s." -#: pg_basebackup.c:1138 +#: pg_basebackup.c:1131 #, c-format -msgid "unable to parse archive: %s" -msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ñ–Ð±Ñ€Ð°Ñ‚Ð¸ архів: %s" +msgid "cannot parse archive \"%s\"" +msgstr "неможливо розібрати архів \"%s\"" -#: pg_basebackup.c:1139 +#: pg_basebackup.c:1132 #, c-format msgid "Only tar archives can be parsed." msgstr "Тільки архів tar може бути проаналізований." -#: pg_basebackup.c:1141 +#: pg_basebackup.c:1134 #, c-format msgid "Plain format requires pg_basebackup to parse the archive." msgstr "ПроÑтий формат потребує обробки архіву в pg_basebackup Ð´Ð»Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸." -#: pg_basebackup.c:1143 +#: pg_basebackup.c:1136 #, c-format msgid "Using - as the output directory requires pg_basebackup to parse the archive." msgstr "ВикориÑÑ‚Ð°Ð½Ð½Ñ - в ÑкоÑті вихідного каталогу потребує pg_basebackup Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ñƒ архіву." -#: pg_basebackup.c:1145 +#: pg_basebackup.c:1138 #, c-format msgid "The -R option requires pg_basebackup to parse the archive." msgstr "Параметр -R потребує викориÑÑ‚Ð°Ð½Ð½Ñ pg_basebackup Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ñƒ архіву." -#: pg_basebackup.c:1356 +#: pg_basebackup.c:1357 #, c-format -msgid "archives should precede manifest" +msgid "archives must precede manifest" msgstr "архіви повинні передувати маніфеÑту" -#: pg_basebackup.c:1371 +#: pg_basebackup.c:1372 #, c-format msgid "invalid archive name: \"%s\"" msgstr "неприпуÑтиме ім'Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñƒ: \"%s\"" -#: pg_basebackup.c:1443 +#: pg_basebackup.c:1444 #, c-format msgid "unexpected payload data" msgstr "неочікувані дані кориÑного навантаженнÑ" -#: pg_basebackup.c:1586 +#: pg_basebackup.c:1587 #, c-format msgid "empty COPY message" msgstr "порожнє Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ COPY" -#: pg_basebackup.c:1588 +#: pg_basebackup.c:1589 #, c-format msgid "malformed COPY message of type %d, length %zu" msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ COPY з типом %d, довжина %zu" -#: pg_basebackup.c:1786 +#: pg_basebackup.c:1789 #, c-format msgid "incompatible server version %s" msgstr "неÑуміÑна верÑÑ–Ñ Ñерверу %s" -#: pg_basebackup.c:1802 +#: pg_basebackup.c:1805 +#, c-format +msgid "Use -X none or -X fetch to disable log streaming." +msgstr "ВикориÑтайте -X none або -X fetch, щоб вимкнути потокову передачу журналу." + +#: pg_basebackup.c:1841 +#, c-format +msgid "server does not support incremental backup" +msgstr "Ñервер не підтримує інкрементне резервне копіюваннÑ" + +#: pg_basebackup.c:1850 pg_basebackup.c:2008 pg_recvlogical.c:272 +#: receivelog.c:543 receivelog.c:582 streamutil.c:364 streamutil.c:438 +#: streamutil.c:490 streamutil.c:578 streamutil.c:730 streamutil.c:775 +#, c-format +msgid "could not send replication command \"%s\": %s" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ð¸ реплікаційну команду \"%s\": %s" + +#: pg_basebackup.c:1856 pg_basebackup.c:1883 +#, c-format +msgid "could not upload manifest: %s" +msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ маніфеÑÑ‚: %s" + +#: pg_basebackup.c:1859 pg_basebackup.c:1886 #, c-format -msgid "HINT: use -X none or -X fetch to disable log streaming" -msgstr "ПІДКÐЗКÐ: викориÑтайте -X none або -X fetch, щоб вимкнути потокову передачу журналу" +msgid "could not upload manifest: unexpected status %s" +msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ маніфеÑÑ‚: неочікуваний ÑÑ‚Ð°Ñ‚ÑƒÑ %s" -#: pg_basebackup.c:1870 +#: pg_basebackup.c:1867 +#, c-format +msgid "could not send COPY data: %s" +msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати дані COPY: %s" + +#: pg_basebackup.c:1877 +#, c-format +msgid "could not send end-of-COPY: %s" +msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ: %s" + +#: pg_basebackup.c:1892 +#, c-format +msgid "unexpected extra result while sending manifest" +msgstr "неÑподіваний додатковий результат під Ñ‡Ð°Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту" + +#: pg_basebackup.c:1950 #, c-format msgid "backup targets are not supported by this server version" msgstr "цілі резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ Ñ†Ñ–Ñ”ÑŽ верÑією Ñервера" -#: pg_basebackup.c:1873 +#: pg_basebackup.c:1953 #, c-format msgid "recovery configuration cannot be written when a backup target is used" msgstr "ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ може бути запиÑана під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñ†Ñ–Ð»Ñ– резервного копіюваннÑ" -#: pg_basebackup.c:1900 +#: pg_basebackup.c:1980 #, c-format msgid "server does not support server-side compression" msgstr "Ñервер не підтримує ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð½Ð° Ñервері" -#: pg_basebackup.c:1910 +#: pg_basebackup.c:1990 #, c-format msgid "initiating base backup, waiting for checkpoint to complete" msgstr "початок базового резервного копіюваннÑ, очікуєтьÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки" -#: pg_basebackup.c:1927 pg_recvlogical.c:262 receivelog.c:549 receivelog.c:588 -#: streamutil.c:291 streamutil.c:364 streamutil.c:416 streamutil.c:504 -#: streamutil.c:656 streamutil.c:701 +#: pg_basebackup.c:1994 #, c-format -msgid "could not send replication command \"%s\": %s" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ð¸ реплікаційну команду \"%s\": %s" +msgid "waiting for checkpoint" +msgstr "Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки" -#: pg_basebackup.c:1935 +#: pg_basebackup.c:2016 #, c-format msgid "could not initiate base backup: %s" msgstr "не вдалоÑÑ Ð¿Ð¾Ñ‡Ð°Ñ‚Ð¸ базове резервне копіюваннÑ: %s" -#: pg_basebackup.c:1938 +#: pg_basebackup.c:2019 #, c-format msgid "server returned unexpected response to BASE_BACKUP command; got %d rows and %d fields, expected %d rows and %d fields" msgstr "Ñервер повернув неочікувану відповідь на команду BASE_BACKUP; отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d полів" -#: pg_basebackup.c:1944 +#: pg_basebackup.c:2025 #, c-format msgid "checkpoint completed" msgstr "контрольна точка завершена" -#: pg_basebackup.c:1959 +#: pg_basebackup.c:2039 #, c-format msgid "write-ahead log start point: %s on timeline %u" msgstr "Ñтартова точка у випереджувальному журналюванні: %s на чаÑовій шкалі %u" -#: pg_basebackup.c:1967 +#: pg_basebackup.c:2047 #, c-format msgid "could not get backup header: %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ заголовок резервної копії: %s" -#: pg_basebackup.c:1970 +#: pg_basebackup.c:2050 #, c-format msgid "no data returned from server" msgstr "Ñервер не повернув дані" -#: pg_basebackup.c:2005 +#: pg_basebackup.c:2093 #, c-format msgid "can only write single tablespace to stdout, database has %d" msgstr "можна запиÑати лише один табличний проÑтір в stdout, вÑього Ñ—Ñ… в базі даних %d" -#: pg_basebackup.c:2018 +#: pg_basebackup.c:2106 #, c-format msgid "starting background WAL receiver" msgstr "запуÑк фонового процеÑу Ð·Ñ‡Ð¸Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ WAL" -#: pg_basebackup.c:2101 +#: pg_basebackup.c:2189 #, c-format msgid "backup failed: %s" msgstr "помилка резервного копіюваннÑ: %s" -#: pg_basebackup.c:2104 +#: pg_basebackup.c:2192 #, c-format msgid "no write-ahead log end position returned from server" msgstr "Ñервер не повернув кінцеву позицію у випереджувальному журналюванні" -#: pg_basebackup.c:2107 +#: pg_basebackup.c:2195 #, c-format msgid "write-ahead log end point: %s" msgstr "кінцева точка у випереджувальному журналюванні: %s" -#: pg_basebackup.c:2118 +#: pg_basebackup.c:2206 #, c-format msgid "checksum error occurred" msgstr "ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° контрольної Ñуми" -#: pg_basebackup.c:2123 +#: pg_basebackup.c:2211 #, c-format msgid "final receive failed: %s" msgstr "помилка в кінці передачі: %s" -#: pg_basebackup.c:2147 +#: pg_basebackup.c:2235 #, c-format msgid "waiting for background process to finish streaming ..." msgstr "Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ¾Ð²Ð¾Ð³Ð¾ Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ñ„Ð¾Ð½Ð¾Ð²Ð¸Ð¼ процеÑом ..." -#: pg_basebackup.c:2151 +#: pg_basebackup.c:2239 #, c-format msgid "could not send command to background pipe: %m" msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати команду до канала фонового процеÑу: %m" -#: pg_basebackup.c:2156 +#: pg_basebackup.c:2244 #, c-format msgid "could not wait for child process: %m" msgstr "збій при очікуванні дочірнього процеÑу: %m" -#: pg_basebackup.c:2158 +#: pg_basebackup.c:2246 #, c-format msgid "child %d died, expected %d" msgstr "завершивÑÑ Ð´Ð¾Ñ‡Ñ–Ñ€Ð½Ñ–Ð¹ Ð¿Ñ€Ð¾Ñ†ÐµÑ %d, очікувалоÑÑ %d" -#: pg_basebackup.c:2160 streamutil.c:91 streamutil.c:197 +#: pg_basebackup.c:2248 streamutil.c:89 streamutil.c:204 streamutil.c:316 #, c-format msgid "%s" msgstr "%s" -#: pg_basebackup.c:2180 +#: pg_basebackup.c:2268 #, c-format msgid "could not wait for child thread: %m" msgstr "неможливо дочекатиÑÑ Ð´Ð¾Ñ‡Ñ–Ñ€Ð½ÑŒÐ¾Ð³Ð¾ потоку: %m" -#: pg_basebackup.c:2185 +#: pg_basebackup.c:2273 #, c-format msgid "could not get child thread exit status: %m" msgstr "не можливо отримати ÑÑ‚Ð°Ñ‚ÑƒÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð´Ð¾Ñ‡Ñ–Ñ€Ð½ÑŒÐ¾Ð³Ð¾ потоку: %m" -#: pg_basebackup.c:2188 +#: pg_basebackup.c:2276 #, c-format msgid "child thread exited with error %u" msgstr "дочірній потік завершивÑÑ Ð· помилкою %u" -#: pg_basebackup.c:2217 +#: pg_basebackup.c:2305 #, c-format msgid "syncing data to disk ..." msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð´Ð°Ð½Ð¸Ñ… з диÑком ..." -#: pg_basebackup.c:2242 +#: pg_basebackup.c:2330 #, c-format msgid "renaming backup_manifest.tmp to backup_manifest" msgstr "Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ backup_manifest.tmp в backup_manifest" -#: pg_basebackup.c:2262 +#: pg_basebackup.c:2350 #, c-format msgid "base backup completed" msgstr "базове резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾" -#: pg_basebackup.c:2351 +#: pg_basebackup.c:2436 +#, c-format +msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" +msgstr "неприпуÑтимий аргумент контрольної точки \"%s\", повинен бути \"fast\" або \"spread\"" + +#: pg_basebackup.c:2454 #, c-format msgid "invalid output format \"%s\", must be \"plain\" or \"tar\"" msgstr "неприпуÑтимий формат виводу \"%s\", повинен бути \"plain\" або \"tar\"" -#: pg_basebackup.c:2395 +#: pg_basebackup.c:2535 #, c-format msgid "invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"" msgstr "неприпуÑтимий параметр wal-method \"%s\", повинен бути \"fetch\", \"stream\" або \"none\"" -#: pg_basebackup.c:2425 -#, c-format -msgid "invalid checkpoint argument \"%s\", must be \"fast\" or \"spread\"" -msgstr "неприпуÑтимий аргумент контрольної точки \"%s\", повинен бути \"fast\" або \"spread\"" - -#: pg_basebackup.c:2476 pg_basebackup.c:2488 pg_basebackup.c:2510 -#: pg_basebackup.c:2522 pg_basebackup.c:2528 pg_basebackup.c:2580 -#: pg_basebackup.c:2591 pg_basebackup.c:2601 pg_basebackup.c:2607 -#: pg_basebackup.c:2614 pg_basebackup.c:2626 pg_basebackup.c:2638 -#: pg_basebackup.c:2646 pg_basebackup.c:2659 pg_basebackup.c:2665 -#: pg_basebackup.c:2674 pg_basebackup.c:2686 pg_basebackup.c:2697 -#: pg_basebackup.c:2705 pg_receivewal.c:816 pg_receivewal.c:828 -#: pg_receivewal.c:835 pg_receivewal.c:844 pg_receivewal.c:851 -#: pg_receivewal.c:861 pg_recvlogical.c:837 pg_recvlogical.c:849 -#: pg_recvlogical.c:859 pg_recvlogical.c:866 pg_recvlogical.c:873 -#: pg_recvlogical.c:880 pg_recvlogical.c:887 pg_recvlogical.c:894 -#: pg_recvlogical.c:901 pg_recvlogical.c:908 +#: pg_basebackup.c:2574 pg_basebackup.c:2586 pg_basebackup.c:2608 +#: pg_basebackup.c:2620 pg_basebackup.c:2626 pg_basebackup.c:2678 +#: pg_basebackup.c:2689 pg_basebackup.c:2699 pg_basebackup.c:2705 +#: pg_basebackup.c:2712 pg_basebackup.c:2724 pg_basebackup.c:2736 +#: pg_basebackup.c:2744 pg_basebackup.c:2757 pg_basebackup.c:2763 +#: pg_basebackup.c:2772 pg_basebackup.c:2784 pg_basebackup.c:2795 +#: pg_basebackup.c:2803 pg_createsubscriber.c:2037 pg_createsubscriber.c:2047 +#: pg_createsubscriber.c:2055 pg_createsubscriber.c:2083 +#: pg_createsubscriber.c:2115 pg_receivewal.c:748 pg_receivewal.c:760 +#: pg_receivewal.c:767 pg_receivewal.c:776 pg_receivewal.c:783 +#: pg_receivewal.c:793 pg_recvlogical.c:853 pg_recvlogical.c:865 +#: pg_recvlogical.c:875 pg_recvlogical.c:882 pg_recvlogical.c:889 +#: pg_recvlogical.c:896 pg_recvlogical.c:903 pg_recvlogical.c:910 +#: pg_recvlogical.c:917 pg_recvlogical.c:924 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." -#: pg_basebackup.c:2486 pg_receivewal.c:826 pg_recvlogical.c:847 +#: pg_basebackup.c:2584 pg_createsubscriber.c:2045 pg_receivewal.c:758 +#: pg_recvlogical.c:863 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")" -#: pg_basebackup.c:2509 +#: pg_basebackup.c:2607 #, c-format msgid "cannot specify both format and backup target" msgstr "неможливо одночаÑно вказати формат Ñ– ціль резервного копіюваннÑ" -#: pg_basebackup.c:2521 +#: pg_basebackup.c:2619 #, c-format msgid "must specify output directory or backup target" msgstr "потрібно вказати вихідний каталог або ціль резервного копіюваннÑ" -#: pg_basebackup.c:2527 +#: pg_basebackup.c:2625 #, c-format msgid "cannot specify both output directory and backup target" msgstr "неможливо одночаÑно вказати вихідну директорію Ñ– ціль резервного копіюваннÑ" -#: pg_basebackup.c:2557 pg_receivewal.c:870 +#: pg_basebackup.c:2655 pg_receivewal.c:802 #, c-format -msgid "unrecognized compression algorithm \"%s\"" -msgstr "нерозпізнаний алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\"" +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "нерозпізнаний алгоритм ÑтиÑканнÑ: \"%s\"" -#: pg_basebackup.c:2563 pg_receivewal.c:877 +#: pg_basebackup.c:2661 pg_receivewal.c:809 #, c-format msgid "invalid compression specification: %s" msgstr "неприпуÑтима ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ ÑтиÑканнÑ: %s" -#: pg_basebackup.c:2579 +#: pg_basebackup.c:2677 #, c-format msgid "client-side compression is not possible when a backup target is specified" msgstr "ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð½Ð° Ñтороні клієнта неможливе, коли вказана ціль резервного копіюваннÑ" -#: pg_basebackup.c:2590 +#: pg_basebackup.c:2688 #, c-format msgid "only tar mode backups can be compressed" msgstr "лише резервні копії в архіві tar можуть ÑтиÑкатиÑÑŒ" -#: pg_basebackup.c:2600 +#: pg_basebackup.c:2698 #, c-format msgid "WAL cannot be streamed when a backup target is specified" msgstr "неможливо передавати WAL, коли вказана ціль резервного копіюваннÑ" -#: pg_basebackup.c:2606 +#: pg_basebackup.c:2704 #, c-format msgid "cannot stream write-ahead logs in tar mode to stdout" msgstr "транÑлювати випереджувальні Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð² режимі tar в потік stdout не можна" -#: pg_basebackup.c:2613 +#: pg_basebackup.c:2711 #, c-format msgid "replication slots can only be used with WAL streaming" msgstr "Ñлоти реплікації можуть викориÑтовуватиÑÑŒ тільки з потоковим передаваннÑм WAL" -#: pg_basebackup.c:2625 +#: pg_basebackup.c:2723 #, c-format msgid "--no-slot cannot be used with slot name" msgstr "--no-slot не можна викориÑтовувати з іменем Ñлота" #. translator: second %s is an option name -#: pg_basebackup.c:2636 pg_receivewal.c:842 +#: pg_basebackup.c:2734 pg_receivewal.c:774 #, c-format msgid "%s needs a slot to be specified using --slot" msgstr "Ð´Ð»Ñ %s потрібно вказати Ñлот за допомогою --slot" -#: pg_basebackup.c:2644 pg_basebackup.c:2684 pg_basebackup.c:2695 -#: pg_basebackup.c:2703 +#: pg_basebackup.c:2742 pg_basebackup.c:2782 pg_basebackup.c:2793 +#: pg_basebackup.c:2801 #, c-format msgid "%s and %s are incompatible options" msgstr "параметри %s Ñ– %s неÑуміÑні" -#: pg_basebackup.c:2658 +#: pg_basebackup.c:2756 #, c-format msgid "WAL directory location cannot be specified along with a backup target" msgstr "Ðе можна вказати Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ— WAL разом з ціллю резервного копіюваннÑ" -#: pg_basebackup.c:2664 +#: pg_basebackup.c:2762 #, c-format msgid "WAL directory location can only be specified in plain mode" msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° WAL можна вказати лише в режимі plain" -#: pg_basebackup.c:2673 +#: pg_basebackup.c:2771 #, c-format msgid "WAL directory location must be an absolute path" msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL каталогу має бути абÑолютним шлÑхом" -#: pg_basebackup.c:2774 +#: pg_basebackup.c:2871 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "не вдалоÑÑ Ñтворити Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m" -#: pg_basebackup.c:2776 +#: pg_createsubscriber.c:169 #, c-format -msgid "symlinks are not supported on this platform" -msgstr "Ñимволічні поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ Ñ†Ñ–Ñ”ÑŽ платформою" +msgid "failed after the end of recovery" +msgstr "помилка піÑÐ»Ñ Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ" -#: pg_receivewal.c:79 +#: pg_createsubscriber.c:170 #, c-format -msgid "%s receives PostgreSQL streaming write-ahead logs.\n\n" -msgstr "%s отримує передачу випереджувальних журналів PostgreSQL.\n\n" +msgid "The target server cannot be used as a physical replica anymore. You must recreate the physical replica before continuing." +msgstr "Цільовий Ñервер не можна більше викориÑтовувати Ñк фізичну репліку. Перед продовженнÑм вам Ñлід відтворити фізичну репліку." + +#: pg_createsubscriber.c:198 +#, c-format +msgid "publication \"%s\" created in database \"%s\" on primary was left behind" +msgstr "Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ \"%s\" Ñтворена в базі даних \"%s\" на оÑновному клаÑтері залишилаÑÑ Ð¿Ð¾Ð·Ð°Ð´Ñƒ" -#: pg_receivewal.c:83 pg_recvlogical.c:84 +#: pg_createsubscriber.c:200 +#, c-format +msgid "Drop this publication before trying again." +msgstr "Видаліть цю публікацію перед тим, Ñк Ñпробувати знову." + +#: pg_createsubscriber.c:204 +#, c-format +msgid "replication slot \"%s\" created in database \"%s\" on primary was left behind" +msgstr "Ñлот реплікації \"%s\" Ñтворений в базі даних \"%s\" на оÑновному клаÑтері залишивÑÑ Ð¿Ð¾Ð·Ð°Ð´Ñƒ" + +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1260 +#, c-format +msgid "Drop this replication slot soon to avoid retention of WAL files." +msgstr "Видаліть цей Ñлот реплікації найближчим чаÑом, щоб уникнути Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² WAL." + +#: pg_createsubscriber.c:219 +#, c-format +msgid "%s creates a new logical replica from a standby server.\n\n" +msgstr "%s Ñтворює нову логічну репліку з резервного Ñервера.\n\n" + +#: pg_createsubscriber.c:223 pg_receivewal.c:81 pg_recvlogical.c:92 #, c-format msgid "\n" "Options:\n" msgstr "\n" "Параметри:\n" -#: pg_receivewal.c:84 +#: pg_createsubscriber.c:224 +#, c-format +msgid " -d, --database=DBNAME database in which to create a subscription\n" +msgstr " -d, --database=DBNAME база даних Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки\n" + +#: pg_createsubscriber.c:225 +#, c-format +msgid " -D, --pgdata=DATADIR location for the subscriber data directory\n" +msgstr " -D, --pgdata=DATADIR Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ даних підпиÑника\n" + +#: pg_createsubscriber.c:226 +#, c-format +msgid " -n, --dry-run dry run, just show what would be done\n" +msgstr " -n, --dry-run Ñухий запуÑк, проÑто показати, що буде зроблено\n" + +#: pg_createsubscriber.c:227 +#, c-format +msgid " -p, --subscriber-port=PORT subscriber port number (default %s)\n" +msgstr " -p, --subscriber-port=PORT номер порту підпиÑника (за замовчуваннÑм %s)\n" + +#: pg_createsubscriber.c:228 +#, c-format +msgid " -P, --publisher-server=CONNSTR publisher connection string\n" +msgstr " -P, --publisher-server=CONNSTR Ñ€Ñдок Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð°Ð²Ñ†Ñ\n" + +#: pg_createsubscriber.c:229 +#, c-format +msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" +msgstr " -s, --socketdir=DIR Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ Ñокету Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ (за Ð·Ð°Ð¼Ð¾Ð²Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð° директоріÑ)\n" + +#: pg_createsubscriber.c:230 +#, c-format +msgid " -t, --recovery-timeout=SECS seconds to wait for recovery to end\n" +msgstr " -t, --recovery-timeout=SECS Ñекунд Ð´Ð»Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ ÐºÑ–Ð½Ñ†Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\n" + +#: pg_createsubscriber.c:231 +#, c-format +msgid " -U, --subscriber-username=NAME user name for subscriber connection\n" +msgstr " -U, --subscriber-username=NAME кориÑтувач Ð´Ð»Ñ Ð¿Ñ–Ð´'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñника\n" + +#: pg_createsubscriber.c:232 +#, c-format +msgid " -v, --verbose output verbose messages\n" +msgstr " -v, --verbose виводити детальні повідомленнÑ\n" + +#: pg_createsubscriber.c:233 +#, c-format +msgid " --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr " --config-file=FILENAME викориÑтовувати заданий оÑновний файл конфігурації Ñервера\n" +" при запуÑку цільового клаÑтера\n" + +#: pg_createsubscriber.c:235 +#, c-format +msgid " --publication=NAME publication name\n" +msgstr " --publication=NAME назва публікації\n" + +#: pg_createsubscriber.c:236 +#, c-format +msgid " --replication-slot=NAME replication slot name\n" +msgstr " --replication-slot=NAME назва Ñлота реплікації\n" + +#: pg_createsubscriber.c:237 +#, c-format +msgid " --subscription=NAME subscription name\n" +msgstr " --subscription=NAME назва підпиÑки\n" + +#: pg_createsubscriber.c:238 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" + +#: pg_createsubscriber.c:239 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help показати цю Ñправку, потім вийти\n" + +#: pg_createsubscriber.c:282 +#, c-format +msgid "could not parse connection string: %s" +msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ñ€Ñдок підключеннÑ: %s" + +#: pg_createsubscriber.c:359 +#, c-format +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "програма \"%s\" потрібна Ð´Ð»Ñ %s, але не знайдена в тому ж каталозі, що й \"%s\"" + +#: pg_createsubscriber.c:362 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "програма \"%s\" знайдена Ð´Ð»Ñ \"%s\", але має відмінну верÑÑ–ÑŽ від %s" + +#: pg_createsubscriber.c:382 +#, c-format +msgid "checking if directory \"%s\" is a cluster data directory" +msgstr "перевірка чи каталог \"%s\" Ñ” каталогом даних клаÑтера" + +#: pg_createsubscriber.c:388 +#, c-format +msgid "data directory \"%s\" does not exist" +msgstr "каталог даних \"%s\" не Ñ–Ñнує" + +#: pg_createsubscriber.c:396 +#, c-format +msgid "directory \"%s\" is not a database cluster directory" +msgstr "каталог \"%s\" не Ñ” каталогом клаÑтера бази даних" + +#: pg_createsubscriber.c:513 +#, c-format +msgid "connection to database failed: %s" +msgstr "помилка Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних: %s" + +#: pg_createsubscriber.c:526 +#, c-format +msgid "could not clear search_path: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‡Ð¸Ñтити search_path: %s" + +#: pg_createsubscriber.c:566 +#, c-format +msgid "getting system identifier from publisher" +msgstr "Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÑиÑтемного ідентифікатора з публікації" + +#: pg_createsubscriber.c:573 +#, c-format +msgid "could not get system identifier: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑиÑтемний ідентифікатор: %s" + +#: pg_createsubscriber.c:579 +#, c-format +msgid "could not get system identifier: got %d rows, expected %d row" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑиÑтемний ідентифікатор: отримано Ñ€Ñдки %d, очікувалоÑÑŒ %d Ñ€Ñдок" + +#: pg_createsubscriber.c:586 +#, c-format +msgid "system identifier is %llu on publisher" +msgstr "ÑиÑтемний ідентифікатор %llu на Ñервері публікації" + +#: pg_createsubscriber.c:607 +#, c-format +msgid "getting system identifier from subscriber" +msgstr "Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ ÑиÑтемного ідентифікатора від підпиÑника" + +#: pg_createsubscriber.c:611 pg_createsubscriber.c:641 +#, c-format +msgid "control file appears to be corrupt" +msgstr "контрольний файл здаєтьÑÑ Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð¸Ð¼" + +#: pg_createsubscriber.c:615 pg_createsubscriber.c:656 +#, c-format +msgid "system identifier is %llu on subscriber" +msgstr "ÑиÑтемний ідентифікатор %llu на підпиÑнику" + +#: pg_createsubscriber.c:637 +#, c-format +msgid "modifying system identifier of subscriber" +msgstr "змінюю ÑиÑтемний ідентифікатор підпиÑника" + +#: pg_createsubscriber.c:659 +#, c-format +msgid "running pg_resetwal on the subscriber" +msgstr "запуÑкаю pg_resetwal на підпиÑнику" + +#: pg_createsubscriber.c:671 +#, c-format +msgid "subscriber successfully changed the system identifier" +msgstr "підпиÑник уÑпішно змінив ÑиÑтемний ідентифікатор" + +#: pg_createsubscriber.c:673 +#, c-format +msgid "could not change system identifier of subscriber: %s" +msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ ÑиÑтемний ідентифікатор підпиÑника: %s" + +#: pg_createsubscriber.c:697 +#, c-format +msgid "could not obtain database OID: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ OID бази даних: %s" + +#: pg_createsubscriber.c:704 +#, c-format +msgid "could not obtain database OID: got %d rows, expected %d row" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ OID бази даних: отримано %d Ñ€Ñдків, очікувалоÑÑŒ %d Ñ€Ñдок" + +#: pg_createsubscriber.c:776 +#, c-format +msgid "create replication slot \"%s\" on publisher" +msgstr "Ñтворіть Ñлот реплікації \"%s\" на Ñервері публікації" + +#: pg_createsubscriber.c:796 +#, c-format +msgid "could not write an additional WAL record: %s" +msgstr "не вдалоÑÑ Ð½Ð°Ð¿Ð¸Ñати додатковий Ð·Ð°Ð¿Ð¸Ñ WAL: %s" + +#: pg_createsubscriber.c:822 +#, c-format +msgid "could not obtain recovery progress: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð¿Ñ€Ð¾Ð³Ñ€ÐµÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ: %s" + +#: pg_createsubscriber.c:854 +#, c-format +msgid "checking settings on publisher" +msgstr "перевірка налаштувань на Ñервері публікації" + +#: pg_createsubscriber.c:864 +#, c-format +msgid "primary server cannot be in recovery" +msgstr "оÑновний Ñервер не може бути у процеÑÑ– відновленнÑ" + +#: pg_createsubscriber.c:888 +#, c-format +msgid "could not obtain publisher settings: %s" +msgstr "не вдалоÑÑŒ отримати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера публікацій: %s" + +#: pg_createsubscriber.c:914 +#, c-format +msgid "publisher requires wal_level >= \"logical\"" +msgstr "Ñервер публікації вимагає wal_level >= \"logical\"" + +#: pg_createsubscriber.c:920 +#, c-format +msgid "publisher requires %d replication slots, but only %d remain" +msgstr "Ñервер публікацій вимагає %d Ñлотів реплікації, але залишаєтьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ %d" + +#: pg_createsubscriber.c:922 pg_createsubscriber.c:931 +#: pg_createsubscriber.c:1028 pg_createsubscriber.c:1037 +#: pg_createsubscriber.c:1046 +#, c-format +msgid "Increase the configuration parameter \"%s\" to at least %d." +msgstr "Збільшіть параметр Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" принаймні до %d." + +#: pg_createsubscriber.c:929 +#, c-format +msgid "publisher requires %d WAL sender processes, but only %d remain" +msgstr "Ñервер публікацій вимагає %d процеÑів відправника WAL, але залишаєтьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ %d" + +#: pg_createsubscriber.c:938 +#, c-format +msgid "two_phase option will not be enabled for replication slots" +msgstr "Ð¾Ð¿Ñ†Ñ–Ñ two_phase Ð´Ð»Ñ Ñлотів реплікації не буде увімкнена" + +#: pg_createsubscriber.c:939 +#, c-format +msgid "Subscriptions will be created with the two_phase option disabled. Prepared transactions will be replicated at COMMIT PREPARED." +msgstr "ПідпиÑки будуть Ñтворені з відключенем параметром two_phase. Підготовлені транзакції будуть Ñкопійовані в COMMIT PREPARED." + +#: pg_createsubscriber.c:971 +#, c-format +msgid "checking settings on subscriber" +msgstr "перевірка налаштувань підпиÑника" + +#: pg_createsubscriber.c:978 +#, c-format +msgid "target server must be a standby" +msgstr "цільовий Ñервер повинен бути в режимі очікуваннÑ" + +#: pg_createsubscriber.c:1002 +#, c-format +msgid "could not obtain subscriber settings: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñника: %s" + +#: pg_createsubscriber.c:1026 +#, c-format +msgid "subscriber requires %d replication slots, but only %d remain" +msgstr "підпиÑник вимагає %d Ñлотів реплікації, але залишаєтьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ %d" + +#: pg_createsubscriber.c:1035 +#, c-format +msgid "subscriber requires %d logical replication workers, but only %d remain" +msgstr "підпиÑник вимагає %d процеÑів логічної реплікації, але залишаєтьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ %d" + +#: pg_createsubscriber.c:1044 +#, c-format +msgid "subscriber requires %d worker processes, but only %d remain" +msgstr "підпиÑник вимагає %d робочих процеÑів, але залишаєтьÑÑ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ %d" + +#: pg_createsubscriber.c:1079 +#, c-format +msgid "dropping subscription \"%s\" in database \"%s\"" +msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" в базі даних \"%s\"" + +#: pg_createsubscriber.c:1088 +#, c-format +msgid "could not drop subscription \"%s\": %s" +msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ підпиÑку \"%s\": %s" + +#: pg_createsubscriber.c:1123 +#, c-format +msgid "could not obtain pre-existing subscriptions: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ раніше наÑвні підпиÑки: %s" + +#: pg_createsubscriber.c:1258 +#, c-format +msgid "could not drop replication slot \"%s\" on primary" +msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñлот реплікації \"%s\" на головному Ñервері" + +#: pg_createsubscriber.c:1292 +#, c-format +msgid "could not obtain failover replication slot information: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про запаÑний Ñлот реплікації: %s" + +#: pg_createsubscriber.c:1294 pg_createsubscriber.c:1303 +#, c-format +msgid "Drop the failover replication slots on subscriber soon to avoid retention of WAL files." +msgstr "Видаліть запаÑний Ñлот реплікації найближчим чаÑом, щоб уникнути Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² WAL." + +#: pg_createsubscriber.c:1302 +#, c-format +msgid "could not drop failover replication slot" +msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ запаÑний Ñлот реплікації" + +#: pg_createsubscriber.c:1324 +#, c-format +msgid "creating the replication slot \"%s\" in database \"%s\"" +msgstr "Ñтворюю Ñлот реплікації \"%s\" в базі даних \"%s\"" + +#: pg_createsubscriber.c:1342 +#, c-format +msgid "could not create replication slot \"%s\" in database \"%s\": %s" +msgstr "не вдалоÑÑ Ñтворити Ñлот реплікації \"%s\" в базі даних \"%s\": %s" + +#: pg_createsubscriber.c:1372 +#, c-format +msgid "dropping the replication slot \"%s\" in database \"%s\"" +msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñлоту реплікації \"%s\" в базі даних \"%s\"" + +#: pg_createsubscriber.c:1388 +#, c-format +msgid "could not drop replication slot \"%s\" in database \"%s\": %s" +msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñлот реплікації \"%s\" в базі даних \"%s\": %s" + +#: pg_createsubscriber.c:1409 +#, c-format +msgid "pg_ctl failed with exit code %d" +msgstr "помилка pg_ctl з кодом %d" + +#: pg_createsubscriber.c:1414 +#, c-format +msgid "pg_ctl was terminated by exception 0x%X" +msgstr "pg_ctl був перерваний винÑтком 0x%X" + +#: pg_createsubscriber.c:1416 +#, c-format +msgid "See C include file \"ntstatus.h\" for a description of the hexadecimal value." +msgstr "ÐžÐ¿Ð¸Ñ Ñ†ÑŒÐ¾Ð³Ð¾ ШіÑтнадцÑткового Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¸Ð²Ñ–Ñ‚ÑŒÑÑ Ñƒ включаємому C-файлі \"ntstatus.h\"." + +#: pg_createsubscriber.c:1418 +#, c-format +msgid "pg_ctl was terminated by signal %d: %s" +msgstr "pg_ctl було припинено Ñигналом %d: %s" + +#: pg_createsubscriber.c:1424 +#, c-format +msgid "pg_ctl exited with unrecognized status %d" +msgstr "pg_ctl завершивÑÑ Ð· невідомим ÑтатуÑом %d" + +#: pg_createsubscriber.c:1427 +#, c-format +msgid "The failed command was: %s" +msgstr "Команда з помилкою: %s" + +#: pg_createsubscriber.c:1473 +#, c-format +msgid "server was started" +msgstr "Ñервер був запущений" + +#: pg_createsubscriber.c:1488 +#, c-format +msgid "server was stopped" +msgstr "Ñервер було зупинено" + +#: pg_createsubscriber.c:1507 +#, c-format +msgid "waiting for the target server to reach the consistent state" +msgstr "чекаю на доÑÑÐ³Ð½ÐµÐ½Ð½Ñ ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð¾Ð³Ð¾ Ñтану цільовим Ñервером" + +#: pg_createsubscriber.c:1530 +#, c-format +msgid "recovery timed out" +msgstr "Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð¸Ñ‡ÐµÑ€Ð¿Ð°Ð²ÑÑ" + +#: pg_createsubscriber.c:1543 +#, c-format +msgid "server did not end recovery" +msgstr "Ñервер не завершив відновленнÑ" + +#: pg_createsubscriber.c:1545 +#, c-format +msgid "target server reached the consistent state" +msgstr "цільовий Ñервер доÑÑг узгодженого Ñтану" + +#: pg_createsubscriber.c:1546 +#, c-format +msgid "If pg_createsubscriber fails after this point, you must recreate the physical replica before continuing." +msgstr "Якщо pg_createsubscriber поверне помилку піÑÐ»Ñ Ñ†Ñ–Ñ”Ñ— точки, вам потрібно буде переÑтворити фізичну репліку перед продовженнÑм." + +#: pg_createsubscriber.c:1573 +#, c-format +msgid "could not obtain publication information: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про публікацію: %s" + +#: pg_createsubscriber.c:1587 +#, c-format +msgid "publication \"%s\" already exists" +msgstr "Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ \"%s\" вже Ñ–Ñнує" + +#: pg_createsubscriber.c:1588 +#, c-format +msgid "Consider renaming this publication before continuing." +msgstr "Подумайте про Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ†Ñ–Ñ”Ñ— публікації, перш ніж продовжити." + +#: pg_createsubscriber.c:1595 +#, c-format +msgid "creating publication \"%s\" in database \"%s\"" +msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"%s\" в базі даних \"%s\"" + +#: pg_createsubscriber.c:1608 +#, c-format +msgid "could not create publication \"%s\" in database \"%s\": %s" +msgstr "не вдалоÑÑ Ñтворити публікацію \"%s\" в базі даних \"%s\": %s" + +#: pg_createsubscriber.c:1637 +#, c-format +msgid "dropping publication \"%s\" in database \"%s\"" +msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— \"%s\" в базі даних \"%s\"" + +#: pg_createsubscriber.c:1651 +#, c-format +msgid "could not drop publication \"%s\" in database \"%s\": %s" +msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ публікацію \"%s\" в базі даних \"%s\": %s" + +#: pg_createsubscriber.c:1697 +#, c-format +msgid "creating subscription \"%s\" in database \"%s\"" +msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" в базі даних \"%s\"" + +#: pg_createsubscriber.c:1718 +#, c-format +msgid "could not create subscription \"%s\" in database \"%s\": %s" +msgstr "не вдалоÑÑ Ñтворити підпиÑку \"%s\" в базі даних \"%s\": %s" + +#: pg_createsubscriber.c:1763 +#, c-format +msgid "could not obtain subscription OID: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ OID підпиÑки: %s" + +#: pg_createsubscriber.c:1770 +#, c-format +msgid "could not obtain subscription OID: got %d rows, expected %d row" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ OID підпиÑки: отримано %d Ñ€Ñдків, очікувалоÑÑŒ %d Ñ€Ñдок" + +#: pg_createsubscriber.c:1794 +#, c-format +msgid "setting the replication progress (node name \"%s\", LSN %s) in database \"%s\"" +msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€ÐµÑу реплікації (назва вузла \"%s, LSN %s) в базі даних \"%s\"" + +#: pg_createsubscriber.c:1809 +#, c-format +msgid "could not set replication progress for subscription \"%s\": %s" +msgstr "не вдалоÑÑ Ð²Ð¸Ñтавити Ð¿Ñ€Ð¾Ð³Ñ€ÐµÑ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\": %s" + +#: pg_createsubscriber.c:1840 +#, c-format +msgid "enabling subscription \"%s\" in database \"%s\"" +msgstr "Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ñ–Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки \"%s\" в базі даних \"%s\"" + +#: pg_createsubscriber.c:1852 +#, c-format +msgid "could not enable subscription \"%s\": %s" +msgstr "не вдалоÑÑ Ð°ÐºÑ‚Ð¸Ð²ÑƒÐ²Ð°Ñ‚Ð¸ підпиÑку \"%s\": %s" + +#: pg_createsubscriber.c:1944 +#, c-format +msgid "cannot be executed by \"root\"" +msgstr "\"root\" не може це виконувати" + +#: pg_createsubscriber.c:1945 +#, c-format +msgid "You must run %s as the PostgreSQL superuser." +msgstr "ЗапуÑкати %s треба від ÑуперкориÑтувача PostgreSQL." + +#: pg_createsubscriber.c:1966 +#, c-format +msgid "database \"%s\" specified more than once" +msgstr "база даних \"%s\" вказана неодноразово" + +#: pg_createsubscriber.c:2007 +#, c-format +msgid "publication \"%s\" specified more than once" +msgstr "Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ \"%s\" вказана неодноразово" + +#: pg_createsubscriber.c:2019 +#, c-format +msgid "replication slot \"%s\" specified more than once" +msgstr "Ñлот реплікації \"%s\" вказаний неодноразово" + +#: pg_createsubscriber.c:2031 +#, c-format +msgid "subscription \"%s\" specified more than once" +msgstr "підпиÑка \"%s\" вказана неодноразово" + +#: pg_createsubscriber.c:2054 +#, c-format +msgid "no subscriber data directory specified" +msgstr "не вказано каталог з даними підпиÑника" + +#: pg_createsubscriber.c:2065 +#, c-format +msgid "could not determine current directory" +msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ поточний каталог" + +#: pg_createsubscriber.c:2082 +#, c-format +msgid "no publisher connection string specified" +msgstr "немає Ñ€Ñдка Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ видавцÑ" + +#: pg_createsubscriber.c:2086 +#, c-format +msgid "validating publisher connection string" +msgstr "перевірка Ñ€Ñдка Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð°Ð²Ñ†Ñ" + +#: pg_createsubscriber.c:2092 +#, c-format +msgid "validating subscriber connection string" +msgstr "перевірка Ñ€Ñдка з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· підпиÑником" + +#: pg_createsubscriber.c:2097 +#, c-format +msgid "no database was specified" +msgstr "база даних не вказана" + +#: pg_createsubscriber.c:2109 +#, c-format +msgid "database name \"%s\" was extracted from the publisher connection string" +msgstr "ім'Ñ Ð±Ð°Ð·Ð¸ даних \"%s\" було отримано з Ñ€Ñдка Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ð´Ð°Ð²Ñ†Ñ" + +#: pg_createsubscriber.c:2114 +#, c-format +msgid "no database name specified" +msgstr "не вказано ім'Ñ Ð±Ð°Ð·Ð¸ даних" + +#: pg_createsubscriber.c:2124 +#, c-format +msgid "wrong number of publication names specified" +msgstr "вказана невірна кількіÑть імен публікації" + +#: pg_createsubscriber.c:2125 +#, c-format +msgid "The number of specified publication names (%d) must match the number of specified database names (%d)." +msgstr "КількіÑть вказаних назв публікації (%d) муÑить Ñпівпадати з кількіÑтю вказаних баз даних (%d)." + +#: pg_createsubscriber.c:2131 +#, c-format +msgid "wrong number of subscription names specified" +msgstr "вказано неправильну кількіÑть імен підпиÑки" + +#: pg_createsubscriber.c:2132 +#, c-format +msgid "The number of specified subscription names (%d) must match the number of specified database names (%d)." +msgstr "КількіÑть зазначених назв підпиÑки (%d) повинна Ñпівпадати з кількіÑтю зазначених назв бази даних (%d)." + +#: pg_createsubscriber.c:2138 +#, c-format +msgid "wrong number of replication slot names specified" +msgstr "вказано неправильну кількіÑть назв Ñлотів реплікації" + +#: pg_createsubscriber.c:2139 +#, c-format +msgid "The number of specified replication slot names (%d) must match the number of specified database names (%d)." +msgstr "КількіÑть вказаних назв Ñлотів реплікації (%d) повинна збігатиÑÑ Ð· кількіÑтю вказаних назв бази даних (%d)." + +#: pg_createsubscriber.c:2168 +#, c-format +msgid "subscriber data directory is not a copy of the source database cluster" +msgstr "каталог даних підпиÑника не Ñ” копією клаÑтера вихідної бази даних" + +#: pg_createsubscriber.c:2181 +#, c-format +msgid "standby server is running" +msgstr "резервний Ñервер працює" + +#: pg_createsubscriber.c:2182 +#, c-format +msgid "Stop the standby server and try again." +msgstr "Зупиніть резервний Ñервер та повторіть Ñпробу." + +#: pg_createsubscriber.c:2191 +#, c-format +msgid "starting the standby server with command-line options" +msgstr "запуÑк резервного Ñерверу з параметрами командного Ñ€Ñдка" + +#: pg_createsubscriber.c:2207 pg_createsubscriber.c:2242 +#, c-format +msgid "stopping the subscriber" +msgstr "зупинка підпиÑника" + +#: pg_createsubscriber.c:2221 +#, c-format +msgid "starting the subscriber" +msgstr "запуÑк підпиÑника" + +#: pg_createsubscriber.c:2250 +#, c-format +msgid "Done!" +msgstr "Готово!" + +#: pg_receivewal.c:77 +#, c-format +msgid "%s receives PostgreSQL streaming write-ahead logs.\n\n" +msgstr "%s отримує передачу випереджувальних журналів PostgreSQL.\n\n" + +#: pg_receivewal.c:82 #, c-format msgid " -D, --directory=DIR receive write-ahead log files into this directory\n" msgstr " -D, --directory=DIR зберігати файли випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð¾ цього каталогу\n" -#: pg_receivewal.c:85 pg_recvlogical.c:85 +#: pg_receivewal.c:83 pg_recvlogical.c:93 #, c-format msgid " -E, --endpos=LSN exit after receiving the specified LSN\n" msgstr " -E, --endpos=LSN вийти піÑÐ»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¾Ð³Ð¾ LSN\n" -#: pg_receivewal.c:86 pg_recvlogical.c:89 +#: pg_receivewal.c:84 pg_recvlogical.c:97 #, c-format msgid " --if-not-exists do not error if slot already exists when creating a slot\n" msgstr " --if-not-exists не видавати помилку, при Ñтворенні Ñлота, Ñкщо Ñлот вже Ñ–Ñнує\n" -#: pg_receivewal.c:87 pg_recvlogical.c:91 +#: pg_receivewal.c:85 pg_recvlogical.c:99 #, c-format msgid " -n, --no-loop do not loop on connection lost\n" msgstr " -n, --no-loop переривати роботу при втраті підключеннÑ\n" -#: pg_receivewal.c:88 +#: pg_receivewal.c:86 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync не чекати безпечного Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ на диÑк\n" -#: pg_receivewal.c:89 pg_recvlogical.c:96 +#: pg_receivewal.c:87 pg_recvlogical.c:104 #, c-format msgid " -s, --status-interval=SECS\n" " time between status packets sent to server (default: %d)\n" msgstr " -s, --status-interval=SECS\n" " інтервал між відправкою ÑтатуÑних пакетів Ñерверу (за замовчуваннÑм: %d)\n" -#: pg_receivewal.c:92 +#: pg_receivewal.c:90 #, c-format msgid " --synchronous flush write-ahead log immediately after writing\n" msgstr " --synchronous очиÑтити випереджувальне Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ñ€Ð°Ð·Ñƒ піÑÐ»Ñ Ð·Ð°Ð¿Ð¸Ñу\n" -#: pg_receivewal.c:95 +#: pg_receivewal.c:93 #, c-format msgid " -Z, --compress=METHOD[:DETAIL]\n" " compress as specified\n" msgstr " -Z, --compress=METHOD[:DETAIL]\n" " ÑтиÑкати Ñк вказано\n" -#: pg_receivewal.c:105 +#: pg_receivewal.c:103 #, c-format msgid "\n" "Optional actions:\n" msgstr "\n" "Додаткові дії:\n" -#: pg_receivewal.c:106 pg_recvlogical.c:81 +#: pg_receivewal.c:104 pg_recvlogical.c:89 #, c-format msgid " --create-slot create a new replication slot (for the slot's name see --slot)\n" msgstr " --create-slot Ñтворити новий Ñлот реплікації (ім'Ñ Ñлота задає параметр --slot)\n" -#: pg_receivewal.c:107 pg_recvlogical.c:82 +#: pg_receivewal.c:105 pg_recvlogical.c:90 #, c-format msgid " --drop-slot drop the replication slot (for the slot's name see --slot)\n" msgstr " --drop-slot видалити Ñлот реплікації (ім'Ñ Ñлота задає параметр --slot)\n" -#: pg_receivewal.c:252 +#: pg_receivewal.c:191 #, c-format msgid "finished segment at %X/%X (timeline %u)" msgstr "завершено Ñегмент в позиції %X/%X (чаÑова шкала %u)" -#: pg_receivewal.c:259 +#: pg_receivewal.c:198 #, c-format msgid "stopped log streaming at %X/%X (timeline %u)" msgstr "зупинено потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ в позиції %X/%X (чаÑова шкала %u)" -#: pg_receivewal.c:275 +#: pg_receivewal.c:214 #, c-format msgid "switched to timeline %u at %X/%X" msgstr "переключено на чаÑову шкалу %u в позиції %X/%X" -#: pg_receivewal.c:285 +#: pg_receivewal.c:224 pg_recvlogical.c:1053 #, c-format msgid "received interrupt signal, exiting" msgstr "отримано Ñигнал перериваннÑ, Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸" -#: pg_receivewal.c:317 +#: pg_receivewal.c:256 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" -#: pg_receivewal.c:384 +#: pg_receivewal.c:323 #, c-format msgid "segment file \"%s\" has incorrect size %lld, skipping" msgstr "файл Ñегменту \"%s\" має неправильний розмір %lld, пропуÑкаєтьÑÑ" -#: pg_receivewal.c:401 +#: pg_receivewal.c:340 #, c-format msgid "could not open compressed file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ ÑтиÑнутий файл \"%s\": %m" -#: pg_receivewal.c:404 +#: pg_receivewal.c:343 #, c-format msgid "could not seek in compressed file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ в ÑтиÑнутому файлі \"%s\": %m" -#: pg_receivewal.c:410 +#: pg_receivewal.c:349 #, c-format msgid "could not read compressed file \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ ÑтиÑнутий файл \"%s\": %m" -#: pg_receivewal.c:413 +#: pg_receivewal.c:352 #, c-format msgid "could not read compressed file \"%s\": read %d of %zu" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ ÑтиÑнутий файл \"%s\": прочитано %d з %zu" -#: pg_receivewal.c:423 +#: pg_receivewal.c:362 #, c-format msgid "compressed segment file \"%s\" has incorrect uncompressed size %d, skipping" msgstr "файл ÑтиÑнутого Ñегменту \"%s\" має неправильний розмір без ÑтиÑÐºÐ°Ð½Ð½Ñ %d, пропуÑкаєтьÑÑ" -#: pg_receivewal.c:451 +#: pg_receivewal.c:390 #, c-format msgid "could not create LZ4 decompression context: %s" msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ декомпреÑÑ–Ñ— LZ4: %s" -#: pg_receivewal.c:463 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" - -#: pg_receivewal.c:481 +#: pg_receivewal.c:420 #, c-format msgid "could not decompress file \"%s\": %s" msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\": %s" -#: pg_receivewal.c:504 +#: pg_receivewal.c:443 #, c-format msgid "could not free LZ4 decompression context: %s" msgstr "не вдалоÑÑ Ð·Ð²Ñ–Ð»ÑŒÐ½Ð¸Ñ‚Ð¸ контекÑÑ‚ декомпреÑÑ–Ñ— LZ4: %s" -#: pg_receivewal.c:509 +#: pg_receivewal.c:448 #, c-format msgid "compressed segment file \"%s\" has incorrect uncompressed size %zu, skipping" msgstr "файл ÑтиÑнутого Ñегменту \"%s\" має неправильний розмір не ÑтиÑнутого розміру %zu, пропуÑкаєтьÑÑ" -#: pg_receivewal.c:514 -#, c-format -msgid "could not check file \"%s\"" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ файл \"%s\"" - -#: pg_receivewal.c:516 +#: pg_receivewal.c:453 #, c-format -msgid "This build does not support compression with %s." -msgstr "Ð¦Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð· %s." +msgid "cannot check file \"%s\": compression with %s not supported by this build" +msgstr "неможливо перевірити файл \"%s\": ÑтиÑÐ½ÐµÐ½Ð½Ñ %s не підтримуєтьÑÑ Ð´Ð°Ð½Ð¾ÑŽ збіркою" -#: pg_receivewal.c:643 +#: pg_receivewal.c:578 #, c-format msgid "starting log streaming at %X/%X (timeline %u)" msgstr "початок потокового Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ в позиції %X/%X (чаÑова шкала %u)" -#: pg_receivewal.c:785 pg_recvlogical.c:785 +#: pg_receivewal.c:693 pg_recvlogical.c:801 #, c-format msgid "could not parse end position \"%s\"" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ кінцеву позицію \"%s\"" -#: pg_receivewal.c:834 +#: pg_receivewal.c:766 #, c-format msgid "cannot use --create-slot together with --drop-slot" msgstr "викориÑтовувати --create-slot разом з --drop-slot не можна" -#: pg_receivewal.c:850 +#: pg_receivewal.c:782 #, c-format msgid "cannot use --synchronous together with --no-sync" msgstr "викориÑтовувати --synchronous разом з --no-sync не можна" -#: pg_receivewal.c:860 +#: pg_receivewal.c:792 #, c-format msgid "no target directory specified" msgstr "цільовий каталог не вказано" -#: pg_receivewal.c:893 -#, c-format -msgid "no value specified for --compress, switching to default" -msgstr "не вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ --compress, викориÑтовуєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм" - -#: pg_receivewal.c:897 pg_receivewal.c:903 -#, c-format -msgid "this build does not support compression with %s" -msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð· %s" - -#: pg_receivewal.c:908 +#: pg_receivewal.c:816 #, c-format msgid "compression with %s is not yet supported" msgstr "ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð· %s ще не підтримуєтьÑÑ" -#: pg_receivewal.c:953 +#: pg_receivewal.c:859 #, c-format msgid "replication connection using slot \"%s\" is unexpectedly database specific" msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— з викориÑтаннÑм Ñлоту \"%s\" неочікувано виÑвилоÑÑŒ прив'Ñзаним до бази даних" -#: pg_receivewal.c:972 pg_recvlogical.c:955 +#: pg_receivewal.c:878 pg_recvlogical.c:972 #, c-format msgid "dropping replication slot \"%s\"" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñлоту реплікації \"%s\"" -#: pg_receivewal.c:983 pg_recvlogical.c:965 +#: pg_receivewal.c:889 pg_recvlogical.c:982 #, c-format msgid "creating replication slot \"%s\"" msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñлоту реплікації \"%s\"" -#: pg_receivewal.c:1012 pg_recvlogical.c:989 +#: pg_receivewal.c:918 pg_recvlogical.c:1006 #, c-format msgid "disconnected" msgstr "роз’єднано" #. translator: check source for value for %d -#: pg_receivewal.c:1016 pg_recvlogical.c:993 +#: pg_receivewal.c:922 pg_recvlogical.c:1010 #, c-format msgid "disconnected; waiting %d seconds to try again" msgstr "роз’єднано; через %d Ñекунд буде повторна Ñпроба" -#: pg_recvlogical.c:76 +#: pg_recvlogical.c:84 #, c-format msgid "%s controls PostgreSQL logical decoding streams.\n\n" msgstr "%s керує потоковими передаваннÑми логічного Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ PostgreSQL.\n\n" -#: pg_recvlogical.c:80 +#: pg_recvlogical.c:88 #, c-format msgid "\n" "Action to be performed:\n" msgstr "\n" "Ð”Ñ–Ñ Ð´Ð¾ виконаннÑ:\n" -#: pg_recvlogical.c:83 +#: pg_recvlogical.c:91 #, c-format msgid " --start start streaming in a replication slot (for the slot's name see --slot)\n" msgstr " --start почати потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð² Ñлоті реплікації (ім'Ñ Ñлоту задає параметр --slot)\n" -#: pg_recvlogical.c:86 +#: pg_recvlogical.c:94 #, c-format msgid " -f, --file=FILE receive log into this file, - for stdout\n" msgstr " -f, --file=FILE зберігати журнал до цього файлу, - позначає stdout\n" -#: pg_recvlogical.c:87 +#: pg_recvlogical.c:95 #, c-format msgid " -F --fsync-interval=SECS\n" " time between fsyncs to the output file (default: %d)\n" msgstr " -F --fsync-interval=SECS\n" " Ñ‡Ð°Ñ Ð¼Ñ–Ð¶ fsyncs до файлу виводу (за замовчуваннÑм: %d)\n" -#: pg_recvlogical.c:90 +#: pg_recvlogical.c:98 #, c-format msgid " -I, --startpos=LSN where in an existing slot should the streaming start\n" msgstr " -I, --startpos=LSN де в Ñ–Ñнуючому Ñлоті Ñлід почати потокове передаваннÑ\n" -#: pg_recvlogical.c:92 +#: pg_recvlogical.c:100 #, c-format msgid " -o, --option=NAME[=VALUE]\n" " pass option NAME with optional value VALUE to the\n" @@ -1360,173 +2133,173 @@ msgstr " -o, --option=NAME[=VALUE]\n" " передати параметр NAME з додатковим значеннÑм VALUE до\n" " плагіну виводу\n" -#: pg_recvlogical.c:95 +#: pg_recvlogical.c:103 #, c-format msgid " -P, --plugin=PLUGIN use output plugin PLUGIN (default: %s)\n" msgstr " -P, --plugin=PLUGIN викориÑтовувати плагін виводу PLUGIN (за замовчуваннÑм: %s)\n" -#: pg_recvlogical.c:98 +#: pg_recvlogical.c:106 #, c-format msgid " -S, --slot=SLOTNAME name of the logical replication slot\n" msgstr " -S, --slot=SLOTNAME ім'Ñ Ñлоту логічної реплікації\n" -#: pg_recvlogical.c:99 +#: pg_recvlogical.c:107 #, c-format -msgid " -t, --two-phase enable two-phase decoding when creating a slot\n" -msgstr " -t, --2-фазове Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñлота\n" +msgid " -t, --two-phase enable decoding of prepared transactions when creating a slot\n" +msgstr " -t, --two-phase активувати Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ… транзакцій під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñлоту\n" -#: pg_recvlogical.c:104 +#: pg_recvlogical.c:112 #, c-format msgid " -d, --dbname=DBNAME database to connect to\n" msgstr " -d, --dbname=DBNAME бази даних Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ\n" -#: pg_recvlogical.c:137 +#: pg_recvlogical.c:145 #, c-format msgid "confirming write up to %X/%X, flush to %X/%X (slot %s)" msgstr "Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу до %X/%X, Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð´Ð¾ %X/%X (Ñлот %s)" -#: pg_recvlogical.c:161 receivelog.c:366 +#: pg_recvlogical.c:169 receivelog.c:360 #, c-format msgid "could not send feedback packet: %s" msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ð¸ пакет зворотнього зв'Ñзку: %s" -#: pg_recvlogical.c:229 +#: pg_recvlogical.c:239 #, c-format msgid "starting log streaming at %X/%X (slot %s)" msgstr "початок потокового Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ в позиції %X/%X (Ñлот %s)" -#: pg_recvlogical.c:271 +#: pg_recvlogical.c:281 #, c-format msgid "streaming initiated" msgstr "потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð¹Ð¾Ð²Ð°Ð½Ð¾" -#: pg_recvlogical.c:335 +#: pg_recvlogical.c:346 #, c-format msgid "could not open log file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу \"%s\": %m" -#: pg_recvlogical.c:364 receivelog.c:889 +#: pg_recvlogical.c:375 receivelog.c:882 #, c-format msgid "invalid socket: %s" msgstr "неприпуÑтимий Ñокет: %s" -#: pg_recvlogical.c:417 receivelog.c:917 +#: pg_recvlogical.c:428 receivelog.c:910 #, c-format msgid "%s() failed: %m" msgstr "%s() помилка: %m" -#: pg_recvlogical.c:424 receivelog.c:967 +#: pg_recvlogical.c:435 receivelog.c:959 #, c-format msgid "could not receive data from WAL stream: %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані з WAL потоку: %s" -#: pg_recvlogical.c:466 pg_recvlogical.c:517 receivelog.c:1011 -#: receivelog.c:1074 +#: pg_recvlogical.c:477 pg_recvlogical.c:528 receivelog.c:1003 +#: receivelog.c:1066 #, c-format msgid "streaming header too small: %d" msgstr "заголовок потокового Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ малий: %d" -#: pg_recvlogical.c:501 receivelog.c:849 +#: pg_recvlogical.c:512 receivelog.c:843 #, c-format msgid "unrecognized streaming header: \"%c\"" msgstr "нерозпізнаний заголовок потокового передаваннÑ: \"%c\"" -#: pg_recvlogical.c:555 pg_recvlogical.c:567 +#: pg_recvlogical.c:566 pg_recvlogical.c:578 #, c-format msgid "could not write %d bytes to log file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати %d байт до файлу журналу \"%s\": %m" -#: pg_recvlogical.c:621 receivelog.c:648 receivelog.c:685 +#: pg_recvlogical.c:636 receivelog.c:642 receivelog.c:679 #, c-format msgid "unexpected termination of replication stream: %s" msgstr "неочікуване Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ потоку реплікації: %s" -#: pg_recvlogical.c:780 +#: pg_recvlogical.c:796 #, c-format msgid "could not parse start position \"%s\"" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ початкову позицію \"%s\"" -#: pg_recvlogical.c:858 +#: pg_recvlogical.c:874 #, c-format msgid "no slot specified" msgstr "Ñлот не вказано" -#: pg_recvlogical.c:865 +#: pg_recvlogical.c:881 #, c-format msgid "no target file specified" msgstr "цільовий файл не вказано" -#: pg_recvlogical.c:872 +#: pg_recvlogical.c:888 #, c-format msgid "no database specified" msgstr "база даних не вказана" -#: pg_recvlogical.c:879 +#: pg_recvlogical.c:895 #, c-format msgid "at least one action needs to be specified" msgstr "необхідно вказати щонайменше одну дію" -#: pg_recvlogical.c:886 +#: pg_recvlogical.c:902 #, c-format msgid "cannot use --create-slot or --start together with --drop-slot" msgstr "викориÑтовувати --create-slot або --start разом з --drop-slot не можна" -#: pg_recvlogical.c:893 +#: pg_recvlogical.c:909 #, c-format msgid "cannot use --create-slot or --drop-slot together with --startpos" msgstr "викориÑтовувати --create-slot або --drop-slot разом з --startpos не можна" -#: pg_recvlogical.c:900 +#: pg_recvlogical.c:916 #, c-format msgid "--endpos may only be specified with --start" msgstr "--endpos можна вказати лише з --start" -#: pg_recvlogical.c:907 +#: pg_recvlogical.c:923 #, c-format msgid "--two-phase may only be specified with --create-slot" msgstr "--two-phase може бути вказано тільки з --create-slot" -#: pg_recvlogical.c:939 +#: pg_recvlogical.c:956 #, c-format msgid "could not establish database-specific replication connection" msgstr "не вдалоÑÑ Ð²Ñтановити Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— до вказаної бази даних" -#: pg_recvlogical.c:1033 +#: pg_recvlogical.c:1056 #, c-format msgid "end position %X/%X reached by keepalive" msgstr "кінцева Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ %X/%X доÑÑгнута наживо" -#: pg_recvlogical.c:1036 +#: pg_recvlogical.c:1061 #, c-format msgid "end position %X/%X reached by WAL record at %X/%X" msgstr "кінцева Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ %X/%X доÑÑгнута WAL запиÑом %X/%X" -#: receivelog.c:68 +#: receivelog.c:66 #, c-format msgid "could not create archive status file \"%s\": %s" msgstr "не вдалоÑÑ Ñтворити файл ÑтатуÑу архіву \"%s\": %s" -#: receivelog.c:75 +#: receivelog.c:73 #, c-format msgid "could not close archive status file \"%s\": %s" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл ÑтатуÑу архіву \"%s\": %s" -#: receivelog.c:123 +#: receivelog.c:122 #, c-format msgid "could not get size of write-ahead log file \"%s\": %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ розмір файлу випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\": %s" -#: receivelog.c:134 +#: receivelog.c:133 #, c-format msgid "could not open existing write-ahead log file \"%s\": %s" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ Ñ–Ñнуючий файл випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\": %s" -#: receivelog.c:143 +#: receivelog.c:142 #, c-format msgid "could not fsync existing write-ahead log file \"%s\": %s" msgstr "не вдалоÑÑ fsync Ñ–Ñнуючий файл випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\": %s" -#: receivelog.c:158 +#: receivelog.c:157 #, c-format msgid "write-ahead log file \"%s\" has %zd byte, should be 0 or %d" msgid_plural "write-ahead log file \"%s\" has %zd bytes, should be 0 or %d" @@ -1535,229 +2308,229 @@ msgstr[1] "файл випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ msgstr[2] "файл випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\" має %zd байтів, а повинен мати 0 або %d" msgstr[3] "файл випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\" має %zd байтів, а повинен мати 0 або %d" -#: receivelog.c:174 +#: receivelog.c:175 #, c-format msgid "could not open write-ahead log file \"%s\": %s" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл випереджувального Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\": %s" -#: receivelog.c:208 -#, c-format -msgid "could not determine seek position in file \"%s\": %s" -msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ позицію у файлі \"%s\": %s" - -#: receivelog.c:223 +#: receivelog.c:216 #, c-format msgid "not renaming \"%s\", segment is not complete" msgstr "не перейменовуєтьÑÑ \"%s\", Ñегмент не завершений" -#: receivelog.c:234 receivelog.c:323 receivelog.c:694 +#: receivelog.c:227 receivelog.c:317 receivelog.c:688 #, c-format msgid "could not close file \"%s\": %s" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %s" -#: receivelog.c:295 +#: receivelog.c:288 #, c-format msgid "server reported unexpected history file name for timeline %u: %s" msgstr "Ñервер повідомив неочікуване ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ñ–Ñторії чаÑової шкали %u: %s" -#: receivelog.c:303 +#: receivelog.c:297 #, c-format msgid "could not create timeline history file \"%s\": %s" msgstr "не вдалоÑÑ Ñтворити файл Ñ–Ñторії чаÑової шкали \"%s\": %s" -#: receivelog.c:310 +#: receivelog.c:304 #, c-format msgid "could not write timeline history file \"%s\": %s" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл Ñ–Ñторії чаÑової шкали \"%s\": %s" -#: receivelog.c:400 +#: receivelog.c:394 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions older than %s" msgstr "неÑуміÑна верÑÑ–Ñ Ñерверу %s; клієнт не підтримує потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð· верÑій Ñерверу Ñтаріших, ніж %s" -#: receivelog.c:409 +#: receivelog.c:403 #, c-format msgid "incompatible server version %s; client does not support streaming from server versions newer than %s" msgstr "неÑуміÑна верÑÑ–Ñ Ñерверу %s; клієнт не підтримує потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð· верÑій Ñерверу новіших, ніж %s" -#: receivelog.c:514 +#: receivelog.c:508 #, c-format msgid "system identifier does not match between base backup and streaming connection" msgstr "ÑиÑтемний ідентифікатор базової резервної копії не відповідає ідентифікатору потокового Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ" -#: receivelog.c:522 +#: receivelog.c:516 #, c-format msgid "starting timeline %u is not present in the server" msgstr "початкова чаÑова шкала %u не Ñ–Ñнує на Ñервері" -#: receivelog.c:561 +#: receivelog.c:555 #, c-format msgid "unexpected response to TIMELINE_HISTORY command: got %d rows and %d fields, expected %d rows and %d fields" msgstr "неочікувана відповідь на команду TIMELINE_HISTORY: отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d полів" -#: receivelog.c:632 +#: receivelog.c:626 #, c-format msgid "server reported unexpected next timeline %u, following timeline %u" msgstr "Ñервер неочікувано повідомив наÑтупну чаÑову шкалу %u піÑÐ»Ñ Ñ‡Ð°Ñової шкали %u" -#: receivelog.c:638 +#: receivelog.c:632 #, c-format msgid "server stopped streaming timeline %u at %X/%X, but reported next timeline %u to begin at %X/%X" msgstr "Ñервер зупинив потокове Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ð½Ð½Ñ Ñ‡Ð°Ñової шкали %u в позиції %X/%X, але повідомив, що наÑтупна чаÑова шкала %u почнетьÑÑ Ð² позиції %X/%X" -#: receivelog.c:678 +#: receivelog.c:672 #, c-format msgid "replication stream was terminated before stop point" msgstr "потік реплікації перервано до точки зупинки" -#: receivelog.c:724 +#: receivelog.c:718 #, c-format msgid "unexpected result set after end-of-timeline: got %d rows and %d fields, expected %d rows and %d fields" msgstr "неочікуваний набір результатів піÑÐ»Ñ ÐºÑ–Ð½Ñ†Ñ Ñ‡Ð°Ñової шкали: отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d полів" -#: receivelog.c:733 +#: receivelog.c:727 #, c-format msgid "could not parse next timeline's starting point \"%s\"" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ початкову точку наÑтупної чаÑової шкали \"%s\"" -#: receivelog.c:781 receivelog.c:1030 walmethods.c:1203 +#: receivelog.c:775 receivelog.c:1022 walmethods.c:1206 #, c-format msgid "could not fsync file \"%s\": %s" msgstr "не вдалоÑÑ fsync файл \"%s\": %s" -#: receivelog.c:1091 +#: receivelog.c:1083 #, c-format msgid "received write-ahead log record for offset %u with no file open" msgstr "отримано Ð·Ð°Ð¿Ð¸Ñ Ð²Ð¸Ð¿ÐµÑ€ÐµÐ´Ð¶ÑƒÐ²Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð·Ñуву %u з закритим файлом" -#: receivelog.c:1101 +#: receivelog.c:1093 #, c-format msgid "got WAL data offset %08x, expected %08x" msgstr "отримано дані зÑуву WAL %08x, очікувалоÑÑŒ %08x" -#: receivelog.c:1135 +#: receivelog.c:1128 #, c-format msgid "could not write %d bytes to WAL file \"%s\": %s" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати %d байт до файлу WAL \"%s\": %s" -#: receivelog.c:1160 receivelog.c:1200 receivelog.c:1230 +#: receivelog.c:1153 receivelog.c:1193 receivelog.c:1222 #, c-format msgid "could not send copy-end packet: %s" msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ð¸ пакет ÐºÑ–Ð½Ñ†Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ \"copy-end\": %s" -#: streamutil.c:159 +#: streamutil.c:162 msgid "Password: " msgstr "Пароль: " -#: streamutil.c:182 +#: streamutil.c:189 #, c-format msgid "could not connect to server" msgstr "не вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑŒ до Ñерверу" -#: streamutil.c:225 +#: streamutil.c:230 #, c-format -msgid "could not clear search_path: %s" -msgstr "не вдалоÑÑ Ð¾Ñ‡Ð¸Ñтити search_path: %s" +msgid "could not clear \"search_path\": %s" +msgstr "не вдалоÑÑ Ð¾Ñ‡Ð¸Ñтити \"search_path\": %s" -#: streamutil.c:241 +#: streamutil.c:246 #, c-format -msgid "could not determine server setting for integer_datetimes" -msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ наÑÑ‚Ñ€Ð¾ÑŽÐ²Ð°Ð½Ð½Ñ Ñерверу Ð´Ð»Ñ integer_datetimes" +msgid "could not determine server setting for \"integer_datetimes\"" +msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера Ð´Ð»Ñ \"integer_datetimes\"" -#: streamutil.c:248 +#: streamutil.c:253 #, c-format -msgid "integer_datetimes compile flag does not match server" -msgstr "параметри компілÑції integer_datetimes не відповідають Ñерверу" +msgid "\"integer_datetimes\" compile flag does not match server" +msgstr "флаг компілÑції \"integer_datetimes\" не відповідає Ñерверу" -#: streamutil.c:299 +#: streamutil.c:372 #, c-format msgid "could not fetch WAL segment size: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ розмір Ñегменту WAL: отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d або більше полів" -#: streamutil.c:309 +#: streamutil.c:382 #, c-format msgid "WAL segment size could not be parsed" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ розмір Ñегмента WAL" -#: streamutil.c:327 +#: streamutil.c:400 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes" -msgstr[0] "Розмір Ñегменту WAL повинен бути двійкою, піднеÑеною до ÑÑ‚ÐµÐ¿ÐµÐ½Ñ Ð² інтервалі між 1 МБ Ñ– 1 ГБ, але віддалений Ñервер повідомив Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d байт" -msgstr[1] "Розмір Ñегменту WAL повинен бути двійкою, піднеÑеною до ÑÑ‚ÐµÐ¿ÐµÐ½Ñ Ð² інтервалі між 1 МБ Ñ– 1 ГБ, але віддалений Ñервер повідомив Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d байти" -msgstr[2] "Розмір Ñегменту WAL повинен бути двійкою, піднеÑеною до ÑÑ‚ÐµÐ¿ÐµÐ½Ñ Ð² інтервалі між 1 МБ Ñ– 1 ГБ, але віддалений Ñервер повідомив Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d байтів" -msgstr[3] "Розмір Ñегменту WAL повинен бути двійкою, піднеÑеною до ÑÑ‚ÐµÐ¿ÐµÐ½Ñ Ð² інтервалі між 1 МБ Ñ– 1 ГБ, але віддалений Ñервер повідомив Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d байтів" +msgid "remote server reported invalid WAL segment size (%d byte)" +msgid_plural "remote server reported invalid WAL segment size (%d bytes)" +msgstr[0] "віддалений Ñервер повідомив про неправильний розмір Ñегмента WAL (%d байт)" +msgstr[1] "віддалений Ñервер повідомив про неправильний розмір Ñегмента WAL (%d байтів)" +msgstr[2] "віддалений Ñервер повідомив про неправильний розмір Ñегмента WAL (%d байтів)" +msgstr[3] "віддалений Ñервер повідомив про неправильний розмір Ñегмента WAL (%d байтів)" -#: streamutil.c:372 +#: streamutil.c:404 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "Розмір Ñегмента WAL повинен бути Ñтепенем двійки від 1 МБ до 1 ГБ." + +#: streamutil.c:446 #, c-format msgid "could not fetch group access flag: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "не вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ позначку доÑтупа групи: отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d або більше полів" -#: streamutil.c:381 +#: streamutil.c:455 #, c-format msgid "group access flag could not be parsed: %s" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ позначку доÑтупа групи: %s" -#: streamutil.c:424 streamutil.c:461 +#: streamutil.c:498 streamutil.c:535 #, c-format msgid "could not identify system: got %d rows and %d fields, expected %d rows and %d or more fields" msgstr "не вдалоÑÑ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÑƒÐ²Ð°Ñ‚Ð¸ ÑиÑтему: отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d або більше полів" -#: streamutil.c:513 +#: streamutil.c:587 #, c-format msgid "could not read replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñлот реплікації \"%s\": отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d полів" -#: streamutil.c:525 +#: streamutil.c:599 #, c-format -msgid "could not find replication slot \"%s\"" -msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ñлот реплікації \"%s\"" +msgid "replication slot \"%s\" does not exist" +msgstr "Ñлот реплікації \"%s\" не Ñ–Ñнує" -#: streamutil.c:536 +#: streamutil.c:610 #, c-format msgid "expected a physical replication slot, got type \"%s\" instead" msgstr "очікувавÑÑ Ñлот фізичної реплікації, а натоміÑть знайдено \"%s\"" -#: streamutil.c:550 +#: streamutil.c:624 #, c-format msgid "could not parse restart_lsn \"%s\" for replication slot \"%s\"" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ restart_lsn \"%s\" Ð´Ð»Ñ Ñлоту реплікації \"%s\"" -#: streamutil.c:667 +#: streamutil.c:741 #, c-format msgid "could not create replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "не вдалоÑÑ Ñтворити Ñлот реплікації \"%s\": отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d полів" -#: streamutil.c:711 +#: streamutil.c:785 #, c-format msgid "could not drop replication slot \"%s\": got %d rows and %d fields, expected %d rows and %d fields" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñлот реплікації \"%s\": отримано %d Ñ€Ñдків Ñ– %d полів, очікувалоÑÑŒ %d Ñ€Ñдків Ñ– %d полів" -#: walmethods.c:720 walmethods.c:1265 +#: walmethods.c:726 walmethods.c:1269 msgid "could not compress data" msgstr "не вдалоÑÑ ÑтиÑнути дані" -#: walmethods.c:749 +#: walmethods.c:755 msgid "could not reset compression stream" msgstr "не вдалоÑÑ Ñкинути потік ÑтиÑканнÑ" -#: walmethods.c:880 +#: walmethods.c:892 msgid "implementation error: tar files can't have more than one open file" msgstr "помилка реалізації: файли tar не можуть мати більше одного відкритого файлу" -#: walmethods.c:894 +#: walmethods.c:907 msgid "could not create tar header" msgstr "не вдалоÑÑ Ñтворити заголовок tar" -#: walmethods.c:910 walmethods.c:950 walmethods.c:1169 walmethods.c:1181 +#: walmethods.c:924 walmethods.c:965 walmethods.c:1171 walmethods.c:1184 msgid "could not change compression parameters" msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ параметри ÑтиÑканнÑ" -#: walmethods.c:1054 +#: walmethods.c:1056 msgid "unlink not supported with compression" msgstr "unink не підтримуєтьÑÑ Ð·Ñ– ÑтиÑканнÑм" -#: walmethods.c:1289 +#: walmethods.c:1293 msgid "could not close compression stream" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ потік ÑтиÑканнÑ" diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c index 504d82bef67b3..8543f3576a85d 100644 --- a/src/bin/pg_basebackup/receivelog.c +++ b/src/bin/pg_basebackup/receivelog.c @@ -5,7 +5,7 @@ * * Author: Magnus Hagander * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/receivelog.c @@ -192,7 +192,7 @@ static bool close_walfile(StreamCtl *stream, XLogRecPtr pos) { char *fn; - off_t currpos; + pgoff_t currpos; int r; char walfile_name[MAXPGPATH]; diff --git a/src/bin/pg_basebackup/receivelog.h b/src/bin/pg_basebackup/receivelog.h index 805c1c2cb9597..0a18f897964f6 100644 --- a/src/bin/pg_basebackup/receivelog.h +++ b/src/bin/pg_basebackup/receivelog.h @@ -2,7 +2,7 @@ * * receivelog.h * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/receivelog.h diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c index 15514599c4ef3..dc604b1538056 100644 --- a/src/bin/pg_basebackup/streamutil.c +++ b/src/bin/pg_basebackup/streamutil.c @@ -5,7 +5,7 @@ * * Author: Magnus Hagander * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/streamutil.c @@ -34,6 +34,7 @@ int WalSegSz; static bool RetrieveDataDirCreatePerm(PGconn *conn); +static char *FindDbnameInConnParams(PQconninfoOption *conn_opts); /* SHOW command for replication connection was introduced in version 10 */ #define MINIMUM_VERSION_FOR_SHOW_CMD 100000 @@ -73,15 +74,15 @@ GetConnection(void) PQconninfoOption *conn_opt; char *err_msg = NULL; - /* pg_recvlogical uses dbname only; others use connection_string only. */ + /* + * pg_recvlogical uses dbname only; others use connection_string only. + * (Note: both variables will be NULL if there's no command line options.) + */ Assert(dbname == NULL || connection_string == NULL); /* * Merge the connection info inputs given in form of connection string, * options and default values (dbname=replication, replication=true, etc.) - * Explicitly discard any dbname value in the connection string; - * otherwise, PQconnectdbParams() would interpret that value as being - * itself a connection string. */ i = 0; if (connection_string) @@ -92,18 +93,24 @@ GetConnection(void) for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++) { - if (conn_opt->val != NULL && conn_opt->val[0] != '\0' && - strcmp(conn_opt->keyword, "dbname") != 0) + if (conn_opt->val != NULL && conn_opt->val[0] != '\0') argcount++; } keywords = pg_malloc0((argcount + 1) * sizeof(*keywords)); values = pg_malloc0((argcount + 1) * sizeof(*values)); + /* + * Set dbname here already, so it can be overridden by a dbname in the + * connection string. + */ + keywords[i] = "dbname"; + values[i] = "replication"; + i++; + for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++) { - if (conn_opt->val != NULL && conn_opt->val[0] != '\0' && - strcmp(conn_opt->keyword, "dbname") != 0) + if (conn_opt->val != NULL && conn_opt->val[0] != '\0') { keywords[i] = conn_opt->keyword; values[i] = conn_opt->val; @@ -115,13 +122,13 @@ GetConnection(void) { keywords = pg_malloc0((argcount + 1) * sizeof(*keywords)); values = pg_malloc0((argcount + 1) * sizeof(*values)); + keywords[i] = "dbname"; + values[i] = (dbname == NULL) ? "replication" : dbname; + i++; } - keywords[i] = "dbname"; - values[i] = dbname == NULL ? "replication" : dbname; - i++; keywords[i] = "replication"; - values[i] = dbname == NULL ? "true" : "database"; + values[i] = (dbname == NULL) ? "true" : "database"; i++; keywords[i] = "fallback_application_name"; values[i] = progname; @@ -171,7 +178,11 @@ GetConnection(void) values[i] = NULL; } - tmpconn = PQconnectdbParams(keywords, values, true); + /* + * Only expand dbname when we did not already parse the argument as a + * connection string ourselves. + */ + tmpconn = PQconnectdbParams(keywords, values, !connection_string); /* * If there is too little memory even to allocate the PGconn object @@ -219,7 +230,7 @@ GetConnection(void) res = PQexec(tmpconn, ALWAYS_SECURE_SEARCH_PATH_SQL); if (PQresultStatus(res) != PGRES_TUPLES_OK) { - pg_log_error("could not clear search_path: %s", + pg_log_error("could not clear \"search_path\": %s", PQerrorMessage(tmpconn)); PQclear(res); PQfinish(tmpconn); @@ -235,14 +246,14 @@ GetConnection(void) tmpparam = PQparameterStatus(tmpconn, "integer_datetimes"); if (!tmpparam) { - pg_log_error("could not determine server setting for integer_datetimes"); + pg_log_error("could not determine server setting for \"integer_datetimes\""); PQfinish(tmpconn); exit(1); } if (strcmp(tmpparam, "on") != 0) { - pg_log_error("integer_datetimes compile flag does not match server"); + pg_log_error("\"integer_datetimes\" compile flag does not match server"); PQfinish(tmpconn); exit(1); } @@ -260,6 +271,74 @@ GetConnection(void) return tmpconn; } +/* + * FindDbnameInConnParams + * + * This is a helper function for GetDbnameFromConnectionOptions(). Extract + * the value of dbname from PQconninfoOption parameters, if it's present. + * Returns a strdup'd result or NULL. + */ +static char * +FindDbnameInConnParams(PQconninfoOption *conn_opts) +{ + PQconninfoOption *conn_opt; + + for (conn_opt = conn_opts; conn_opt->keyword != NULL; conn_opt++) + { + if (strcmp(conn_opt->keyword, "dbname") == 0 && + conn_opt->val != NULL && conn_opt->val[0] != '\0') + return pg_strdup(conn_opt->val); + } + return NULL; +} + +/* + * GetDbnameFromConnectionOptions + * + * This is a special purpose function to retrieve the dbname from either the + * connection_string specified by the user or from the environment variables. + * + * We follow GetConnection() to fetch the dbname from various connection + * options. + * + * Returns NULL, if dbname is not specified by the user in the above + * mentioned connection options. + */ +char * +GetDbnameFromConnectionOptions(void) +{ + PQconninfoOption *conn_opts; + char *err_msg = NULL; + char *dbname; + + /* First try to get the dbname from connection string. */ + if (connection_string) + { + conn_opts = PQconninfoParse(connection_string, &err_msg); + if (conn_opts == NULL) + pg_fatal("%s", err_msg); + + dbname = FindDbnameInConnParams(conn_opts); + + PQconninfoFree(conn_opts); + if (dbname) + return dbname; + } + + /* + * Next try to get the dbname from default values that are available from + * the environment. + */ + conn_opts = PQconndefaults(); + if (conn_opts == NULL) + pg_fatal("out of memory"); + + dbname = FindDbnameInConnParams(conn_opts); + + PQconninfoFree(conn_opts); + return dbname; +} + /* * From version 10, explicitly set wal segment size using SHOW wal_segment_size * since ControlFile is not accessible here. @@ -321,10 +400,11 @@ RetrieveWalSegSize(PGconn *conn) if (!IsValidWalSegSize(WalSegSz)) { - pg_log_error(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d byte", - "WAL segment size must be a power of two between 1 MB and 1 GB, but the remote server reported a value of %d bytes", + pg_log_error(ngettext("remote server reported invalid WAL segment size (%d byte)", + "remote server reported invalid WAL segment size (%d bytes)", WalSegSz), WalSegSz); + pg_log_error_detail("The WAL segment size must be a power of two between 1 MB and 1 GB."); return false; } diff --git a/src/bin/pg_basebackup/streamutil.h b/src/bin/pg_basebackup/streamutil.h index 268c163213c24..9b38e8c0f38f9 100644 --- a/src/bin/pg_basebackup/streamutil.h +++ b/src/bin/pg_basebackup/streamutil.h @@ -2,7 +2,7 @@ * * streamutil.h * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/streamutil.h @@ -31,6 +31,8 @@ extern PGconn *conn; extern PGconn *GetConnection(void); +extern char *GetDbnameFromConnectionOptions(void); + /* Replication commands */ extern bool CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin, bool is_temporary, diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 793d64863c764..403acb6eb4115 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -1,8 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; +use Config; use File::Basename qw(basename dirname); use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; @@ -76,7 +77,7 @@ ok(-d "$tempdir/backup", 'backup directory was created and left behind'); rmtree("$tempdir/backup"); -open my $conf, '>>', "$pgdata/postgresql.conf"; +open my $conf, '>>', "$pgdata/postgresql.conf" or die $!; print $conf "max_replication_slots = 10\n"; print $conf "max_wal_senders = 10\n"; print $conf "wal_level = replica\n"; @@ -174,7 +175,17 @@ qw(backup_label tablespace_map postgresql.auto.conf.tmp current_logfiles.tmp global/pg_internal.init.123)) { - open my $file, '>>', "$pgdata/$filename"; + open my $file, '>>', "$pgdata/$filename" or die $!; + print $file "DONOTCOPY"; + close $file; +} + +# Test that macOS system files are skipped. Only test on non-macOS systems +# however since creating incorrect .DS_Store files on a macOS system may have +# unintended side effects. +if ($Config{osname} ne 'darwin') +{ + open my $file, '>>', "$pgdata/.DS_Store" or die $!; print $file "DONOTCOPY"; close $file; } @@ -223,10 +234,10 @@ "check backup dir permissions"); } -# Only archive_status directory should be copied in pg_wal/. +# Only archive_status and summaries directories should be copied in pg_wal/. is_deeply( [ sort(slurp_dir("$tempdir/backup/pg_wal/")) ], - [ sort qw(. .. archive_status) ], + [ sort qw(. .. archive_status summaries) ], 'no WAL files copied'); # Contents of these directories should not be copied. @@ -248,6 +259,12 @@ ok(!-f "$tempdir/backup/$filename", "$filename not copied"); } +# We only test .DS_Store files being skipped on non-macOS systems +if ($Config{osname} ne 'darwin') +{ + ok(!-f "$tempdir/backup/.DS_Store", ".DS_Store not copied"); +} + # Unlogged relation forks other than init should not be copied ok(-f "$tempdir/backup/${baseUnloggedPath}_init", 'unlogged init fork in backup'); @@ -310,17 +327,23 @@ [ @pg_basebackup_defs, '-D', "$tempdir/backup_foo", '-Fp', "-Tfoo" ], '-T with invalid format fails'); -# Tar format doesn't support filenames longer than 100 bytes. my $superlongname = "superlongname_" . ("x" x 100); -my $superlongpath = "$pgdata/$superlongname"; +# Tar format doesn't support filenames longer than 100 bytes. +SKIP: +{ + my $superlongpath = "$pgdata/$superlongname"; -open my $file, '>', "$superlongpath" - or die "unable to create file $superlongpath"; -close $file; -$node->command_fails( - [ @pg_basebackup_defs, '-D', "$tempdir/tarbackup_l1", '-Ft' ], - 'pg_basebackup tar with long name fails'); -unlink "$pgdata/$superlongname"; + skip "File path too long", 1 + if $windows_os && length($superlongpath) > 255; + + open my $file, '>', "$superlongpath" + or die "unable to create file $superlongpath"; + close $file; + $node->command_fails( + [ @pg_basebackup_defs, '-D', "$tempdir/tarbackup_l1", '-Ft' ], + 'pg_basebackup tar with long name fails'); + unlink "$superlongpath"; +} # The following tests are for symlinks. @@ -333,19 +356,24 @@ # Enable group permissions on PGDATA chmod_recursive("$pgdata", 0750, 0640); -rename("$pgdata/pg_replslot", "$tempdir/pg_replslot") - or BAIL_OUT "could not move $pgdata/pg_replslot"; -dir_symlink("$tempdir/pg_replslot", "$pgdata/pg_replslot") +# Create a temporary directory in the system location. +my $sys_tempdir = PostgreSQL::Test::Utils::tempdir_short; + +# pg_replslot should be empty. We remove it and recreate it in $sys_tempdir +# before symlinking, in order to avoid possibly trying to move things across +# drives. +rmdir("$pgdata/pg_replslot") + or BAIL_OUT "could not remove $pgdata/pg_replslot"; +mkdir("$sys_tempdir/pg_replslot"); # if this fails the symlink will fail +dir_symlink("$sys_tempdir/pg_replslot", "$pgdata/pg_replslot") or BAIL_OUT "could not symlink to $pgdata/pg_replslot"; $node->start; # Test backup of a tablespace using tar format. -# Create a temporary directory in the system location and symlink it -# to our physical temp location. That way we can use shorter names -# for the tablespace directories, which hopefully won't run afoul of -# the 99 character length limit. -my $sys_tempdir = PostgreSQL::Test::Utils::tempdir_short; +# Symlink the system located tempdir to our physical temp location. +# That way we can use shorter names for the tablespace directories, +# which hopefully won't run afoul of the 99 character length limit. my $real_sys_tempdir = "$sys_tempdir/tempdir"; dir_symlink "$tempdir", $real_sys_tempdir; @@ -373,32 +401,20 @@ { my $tar = $ENV{TAR}; # don't check for a working tar here, to accommodate various odd - # cases such as AIX. If tar doesn't work the init_from_backup below - # will fail. + # cases. If tar doesn't work the init_from_backup below will fail. skip "no tar program available", 1 if (!defined $tar || $tar eq ''); my $node2 = PostgreSQL::Test::Cluster->new('replica'); - # Recover main data directory - $node2->init_from_backup($node, 'tarbackup2', tar_program => $tar); - - # Recover tablespace into a new directory (not where it was!) - my $repTsDir = "$tempdir/tblspc1replica"; - my $realRepTsDir = "$real_sys_tempdir/tblspc1replica"; - mkdir $repTsDir; - PostgreSQL::Test::Utils::system_or_bail($tar, 'xf', $tblspc_tars[0], - '-C', $repTsDir); - - # Update tablespace map to point to new directory. - # XXX Ideally pg_basebackup would handle this. + # Recover the backup $tblspc_tars[0] =~ m|/([0-9]*)\.tar$|; my $tblspcoid = $1; - my $escapedRepTsDir = $realRepTsDir; - $escapedRepTsDir =~ s/\\/\\\\/g; - open my $mapfile, '>', $node2->data_dir . '/tablespace_map'; - print $mapfile "$tblspcoid $escapedRepTsDir\n"; - close $mapfile; + my $realRepTsDir = "$real_sys_tempdir/tblspc1replica"; + $node2->init_from_backup( + $node, 'tarbackup2', + tar_program => $tar, + 'tablespace_map' => { $tblspcoid => $realRepTsDir }); $node2->start; my $result = $node2->safe_psql('postgres', 'SELECT * FROM test1'); @@ -467,7 +483,7 @@ SKIP: { skip "unix-style permissions not supported on Windows", 1 - if ($windows_os); + if ($windows_os || $Config::Config{osname} eq 'cygwin'); ok(check_mode_recursive("$tempdir/backup1", 0750, 0640), "check backup dir permissions"); @@ -756,6 +772,17 @@ is($checksum, 'on', 'checksums are enabled'); rmtree("$tempdir/backupxs_sl_R"); +$node->command_ok( + [ + @pg_basebackup_defs, '-D', "$tempdir/backup_dbname_R", '-X', + 'stream', '-d', "dbname=db1", '-R', + ], + 'pg_basebackup with dbname and -R runs'); +like(slurp_file("$tempdir/backup_dbname_R/postgresql.auto.conf"), + qr/dbname=db1/m, 'recovery conf file sets dbname'); + +rmtree("$tempdir/backup_dbname_R"); + # create tables to corrupt and get their relfilenodes my $file_corrupt1 = $node->safe_psql('postgres', q{CREATE TABLE corrupt1 AS SELECT a FROM generate_series(1,10000) AS a; ALTER TABLE corrupt1 SET (autovacuum_enabled=false); SELECT pg_relation_filepath('corrupt1')} @@ -938,4 +965,23 @@ my @dst_tblspc = glob "$backupdir/pg_tblspc/$tblspc_oid/PG_*"; is(@dst_tblspc, 1, 'tblspc directory copied'); +# Can't take backup with referring manifest of different cluster +# +# Set up another new database instance with force initdb option. We don't want +# to initializing database system by copying initdb template for this, because +# we want it to be a separate cluster with a different system ID. +my $node2 = PostgreSQL::Test::Cluster->new('node2'); +$node2->init(force_initdb => 1, has_archiving => 1, allows_streaming => 1); +$node2->append_conf('postgresql.conf', 'summarize_wal = on'); +$node2->start; + +$node2->command_fails_like( + [ + @pg_basebackup_defs, '-D', + "$tempdir" . '/diff_sysid', '--incremental', + "$backupdir" . '/backup_manifest' + ], + qr/system identifier in backup manifest is .*, but database system identifier is/, + "pg_basebackup fails with different database system manifest"); + done_testing(); diff --git a/src/bin/pg_basebackup/t/011_in_place_tablespace.pl b/src/bin/pg_basebackup/t/011_in_place_tablespace.pl index d58696e8f99cb..439171c0ef969 100644 --- a/src/bin/pg_basebackup/t/011_in_place_tablespace.pl +++ b/src/bin/pg_basebackup/t/011_in_place_tablespace.pl @@ -1,7 +1,7 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_basebackup/t/020_pg_receivewal.pl b/src/bin/pg_basebackup/t/020_pg_receivewal.pl index 374f090a8b6dd..e4a0377331bf4 100644 --- a/src/bin/pg_basebackup/t/020_pg_receivewal.pl +++ b/src/bin/pg_basebackup/t/020_pg_receivewal.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use PostgreSQL::Test::Cluster; use Test::More; diff --git a/src/bin/pg_basebackup/t/030_pg_recvlogical.pl b/src/bin/pg_basebackup/t/030_pg_recvlogical.pl index 62dca5b67a6ce..8432e5660d63f 100644 --- a/src/bin/pg_basebackup/t/030_pg_recvlogical.pl +++ b/src/bin/pg_basebackup/t/030_pg_recvlogical.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use PostgreSQL::Test::Cluster; use Test::More; diff --git a/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl b/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl new file mode 100644 index 0000000000000..0a900edb656ed --- /dev/null +++ b/src/bin/pg_basebackup/t/040_pg_createsubscriber.pl @@ -0,0 +1,441 @@ +# Copyright (c) 2024, PostgreSQL Global Development Group + +# +# Test using a standby server as the subscriber. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +program_help_ok('pg_createsubscriber'); +program_version_ok('pg_createsubscriber'); +program_options_handling_ok('pg_createsubscriber'); + +my $datadir = PostgreSQL::Test::Utils::tempdir; + +# Generate a database with a name made of a range of ASCII characters. +# Extracted from 002_pg_upgrade.pl. +sub generate_db +{ + my ($node, $prefix, $from_char, $to_char, $suffix) = @_; + + my $dbname = $prefix; + for my $i ($from_char .. $to_char) + { + next if $i == 7 || $i == 10 || $i == 13; # skip BEL, LF, and CR + $dbname = $dbname . sprintf('%c', $i); + } + + $dbname .= $suffix; + + # On Windows, older IPC::Run versions can mis-quote command line arguments + # containing double quote or backslash + $dbname =~ tr/\"\\//d if ($windows_os); + + $node->command_ok( + [ 'createdb', $dbname ], + "created database with ASCII characters from $from_char to $to_char"); + + return $dbname; +} + +# +# Test mandatory options +command_fails(['pg_createsubscriber'], + 'no subscriber data directory specified'); +command_fails( + [ 'pg_createsubscriber', '--pgdata', $datadir ], + 'no publisher connection string specified'); +command_fails( + [ + 'pg_createsubscriber', '--verbose', + '--pgdata', $datadir, + '--publisher-server', 'port=5432' + ], + 'no database name specified'); +command_fails( + [ + 'pg_createsubscriber', '--verbose', + '--pgdata', $datadir, + '--publisher-server', 'port=5432', + '--database', 'pg1', + '--database', 'pg1' + ], + 'duplicate database name'); +command_fails( + [ + 'pg_createsubscriber', '--verbose', + '--pgdata', $datadir, + '--publisher-server', 'port=5432', + '--publication', 'foo1', + '--publication', 'foo1', + '--database', 'pg1', + '--database', 'pg2' + ], + 'duplicate publication name'); +command_fails( + [ + 'pg_createsubscriber', '--verbose', + '--pgdata', $datadir, + '--publisher-server', 'port=5432', + '--publication', 'foo1', + '--database', 'pg1', + '--database', 'pg2' + ], + 'wrong number of publication names'); +command_fails( + [ + 'pg_createsubscriber', '--verbose', + '--pgdata', $datadir, + '--publisher-server', 'port=5432', + '--publication', 'foo1', + '--publication', 'foo2', + '--subscription', 'bar1', + '--database', 'pg1', + '--database', 'pg2' + ], + 'wrong number of subscription names'); +command_fails( + [ + 'pg_createsubscriber', '--verbose', + '--pgdata', $datadir, + '--publisher-server', 'port=5432', + '--publication', 'foo1', + '--publication', 'foo2', + '--subscription', 'bar1', + '--subscription', 'bar2', + '--replication-slot', 'baz1', + '--database', 'pg1', + '--database', 'pg2' + ], + 'wrong number of replication slot names'); + +# Set up node P as primary +my $node_p = PostgreSQL::Test::Cluster->new('node_p'); +my $pconnstr = $node_p->connstr; +$node_p->init(allows_streaming => 'logical'); +# Disable autovacuum to avoid generating xid during stats update as otherwise +# the new XID could then be replicated to standby at some random point making +# slots at primary lag behind standby during slot sync. +$node_p->append_conf('postgresql.conf', 'autovacuum = off'); +$node_p->start; + +# Set up node F as about-to-fail node +# Force it to initialize a new cluster instead of copying a +# previously initdb'd cluster. New cluster has a different system identifier so +# we can test if the target cluster is a copy of the source cluster. +my $node_f = PostgreSQL::Test::Cluster->new('node_f'); +$node_f->init(force_initdb => 1, allows_streaming => 'logical'); + +# On node P +# - create databases +# - create test tables +# - insert a row +# - create a physical replication slot +my $db1 = generate_db($node_p, 'regression\\"\\', 1, 45, '\\\\"\\\\\\'); +my $db2 = generate_db($node_p, 'regression', 46, 90, ''); + +$node_p->safe_psql($db1, 'CREATE TABLE tbl1 (a text)'); +$node_p->safe_psql($db1, "INSERT INTO tbl1 VALUES('first row')"); +$node_p->safe_psql($db2, 'CREATE TABLE tbl2 (a text)'); +my $slotname = 'physical_slot'; +$node_p->safe_psql($db2, + "SELECT pg_create_physical_replication_slot('$slotname')"); + +# Set up node S as standby linking to node P +$node_p->backup('backup_1'); +my $node_s = PostgreSQL::Test::Cluster->new('node_s'); +$node_s->init_from_backup($node_p, 'backup_1', has_streaming => 1); +$node_s->append_conf( + 'postgresql.conf', qq[ +primary_slot_name = '$slotname' +primary_conninfo = '$pconnstr dbname=postgres' +hot_standby_feedback = on +]); +$node_s->set_standby_mode(); +$node_s->start; + +# Set up node T as standby linking to node P then promote it +my $node_t = PostgreSQL::Test::Cluster->new('node_t'); +$node_t->init_from_backup($node_p, 'backup_1', has_streaming => 1); +$node_t->set_standby_mode(); +$node_t->start; +$node_t->promote; +$node_t->stop; + +# Run pg_createsubscriber on a promoted server +command_fails( + [ + 'pg_createsubscriber', '--verbose', + '--dry-run', '--pgdata', + $node_t->data_dir, '--publisher-server', + $node_p->connstr($db1), '--socketdir', + $node_t->host, '--subscriber-port', + $node_t->port, '--database', + $db1, '--database', + $db2 + ], + 'target server is not in recovery'); + +# Run pg_createsubscriber when standby is running +command_fails( + [ + 'pg_createsubscriber', '--verbose', + '--dry-run', '--pgdata', + $node_s->data_dir, '--publisher-server', + $node_p->connstr($db1), '--socketdir', + $node_s->host, '--subscriber-port', + $node_s->port, '--database', + $db1, '--database', + $db2 + ], + 'standby is up and running'); + +# Run pg_createsubscriber on about-to-fail node F +command_fails( + [ + 'pg_createsubscriber', '--verbose', + '--pgdata', $node_f->data_dir, + '--publisher-server', $node_p->connstr($db1), + '--socketdir', $node_f->host, + '--subscriber-port', $node_f->port, + '--database', $db1, + '--database', $db2 + ], + 'subscriber data directory is not a copy of the source database cluster'); + +# Set up node C as standby linking to node S +$node_s->backup('backup_2'); +my $node_c = PostgreSQL::Test::Cluster->new('node_c'); +$node_c->init_from_backup($node_s, 'backup_2', has_streaming => 1); +$node_c->adjust_conf('postgresql.conf', 'primary_slot_name', undef); +$node_c->set_standby_mode(); + +# Run pg_createsubscriber on node C (P -> S -> C) +command_fails( + [ + 'pg_createsubscriber', '--verbose', + '--dry-run', '--pgdata', + $node_c->data_dir, '--publisher-server', + $node_s->connstr($db1), '--socketdir', + $node_c->host, '--subscriber-port', + $node_c->port, '--database', + $db1, '--database', + $db2 + ], + 'primary server is in recovery'); + +# Check some unmet conditions on node P +$node_p->append_conf( + 'postgresql.conf', q{ +wal_level = replica +max_replication_slots = 1 +max_wal_senders = 1 +max_worker_processes = 2 +}); +$node_p->restart; +$node_s->stop; +command_fails( + [ + 'pg_createsubscriber', '--verbose', + '--dry-run', '--pgdata', + $node_s->data_dir, '--publisher-server', + $node_p->connstr($db1), '--socketdir', + $node_s->host, '--subscriber-port', + $node_s->port, '--database', + $db1, '--database', + $db2 + ], + 'primary contains unmet conditions on node P'); +# Restore default settings here but only apply it after testing standby. Some +# standby settings should not be a lower setting than on the primary. +$node_p->append_conf( + 'postgresql.conf', q{ +wal_level = logical +max_replication_slots = 10 +max_wal_senders = 10 +max_worker_processes = 8 +}); + +# Check some unmet conditions on node S +$node_s->append_conf( + 'postgresql.conf', q{ +max_replication_slots = 1 +max_logical_replication_workers = 1 +max_worker_processes = 2 +}); +command_fails( + [ + 'pg_createsubscriber', '--verbose', + '--dry-run', '--pgdata', + $node_s->data_dir, '--publisher-server', + $node_p->connstr($db1), '--socketdir', + $node_s->host, '--subscriber-port', + $node_s->port, '--database', + $db1, '--database', + $db2 + ], + 'standby contains unmet conditions on node S'); +$node_s->append_conf( + 'postgresql.conf', q{ +max_replication_slots = 10 +max_logical_replication_workers = 4 +max_worker_processes = 8 +}); +# Restore default settings on both servers +$node_p->restart; + +# Create failover slot to test its removal +my $fslotname = 'failover_slot'; +$node_p->safe_psql($db1, + "SELECT pg_create_logical_replication_slot('$fslotname', 'pgoutput', false, false, true)" +); +$node_s->start; +# Wait for the standby to catch up so that the standby is not lagging behind +# the failover slot. +$node_p->wait_for_replay_catchup($node_s); +$node_s->safe_psql('postgres', "SELECT pg_sync_replication_slots()"); +my $result = $node_s->safe_psql('postgres', + "SELECT slot_name FROM pg_replication_slots WHERE slot_name = '$fslotname' AND synced AND NOT temporary" +); +is($result, 'failover_slot', 'failover slot is synced'); + +# Insert another row on node P and wait node S to catch up. We +# intentionally performed this insert after syncing logical slot +# as otherwise the local slot's (created during synchronization of +# slot) xmin on standby could be ahead of the remote slot leading +# to failure in synchronization. +$node_p->safe_psql($db1, "INSERT INTO tbl1 VALUES('second row')"); +$node_p->wait_for_replay_catchup($node_s); + +# Create subscription to test its removal +my $dummy_sub = 'regress_sub_dummy'; +$node_p->safe_psql($db1, + "CREATE SUBSCRIPTION $dummy_sub CONNECTION 'dbname=dummy' PUBLICATION pub_dummy WITH (connect=false)" +); +$node_p->wait_for_replay_catchup($node_s); +$node_s->stop; + +# dry run mode on node S +command_ok( + [ + 'pg_createsubscriber', '--verbose', + '--recovery-timeout', "$PostgreSQL::Test::Utils::timeout_default", + '--dry-run', '--pgdata', + $node_s->data_dir, '--publisher-server', + $node_p->connstr($db1), '--socketdir', + $node_s->host, '--subscriber-port', + $node_s->port, '--publication', + 'pub1', '--publication', + 'pub2', '--subscription', + 'sub1', '--subscription', + 'sub2', '--database', + $db1, '--database', + $db2 + ], + 'run pg_createsubscriber --dry-run on node S'); + +# Check if node S is still a standby +$node_s->start; +is($node_s->safe_psql('postgres', 'SELECT pg_catalog.pg_is_in_recovery()'), + 't', 'standby is in recovery'); +$node_s->stop; + +# pg_createsubscriber can run without --databases option +command_ok( + [ + 'pg_createsubscriber', '--verbose', + '--dry-run', '--pgdata', + $node_s->data_dir, '--publisher-server', + $node_p->connstr($db1), '--socketdir', + $node_s->host, '--subscriber-port', + $node_s->port, '--replication-slot', + 'replslot1' + ], + 'run pg_createsubscriber without --databases'); + +# Run pg_createsubscriber on node S +command_ok( + [ + 'pg_createsubscriber', '--verbose', + '--recovery-timeout', "$PostgreSQL::Test::Utils::timeout_default", + '--verbose', '--pgdata', + $node_s->data_dir, '--publisher-server', + $node_p->connstr($db1), '--socketdir', + $node_s->host, '--subscriber-port', + $node_s->port, '--publication', + 'pub1', '--publication', + 'Pub2', '--replication-slot', + 'replslot1', '--replication-slot', + 'replslot2', '--database', + $db1, '--database', + $db2 + ], + 'run pg_createsubscriber on node S'); + +# Confirm the physical replication slot has been removed +$result = $node_p->safe_psql($db1, + "SELECT count(*) FROM pg_replication_slots WHERE slot_name = '$slotname'" +); +is($result, qq(0), + 'the physical replication slot used as primary_slot_name has been removed' +); + +# Insert rows on P +$node_p->safe_psql($db1, "INSERT INTO tbl1 VALUES('third row')"); +$node_p->safe_psql($db2, "INSERT INTO tbl2 VALUES('row 1')"); + +# Start subscriber +$node_s->start; + +# Confirm the pre-existing subscription has been removed +$result = $node_s->safe_psql( + 'postgres', qq( + SELECT count(*) FROM pg_subscription WHERE subname = '$dummy_sub' +)); +is($result, qq(0), 'pre-existing subscription was dropped'); + +# Get subscription names +$result = $node_s->safe_psql( + 'postgres', qq( + SELECT subname FROM pg_subscription WHERE subname ~ '^pg_createsubscriber_' +)); +my @subnames = split("\n", $result); + +# Wait subscriber to catch up +$node_s->wait_for_subscription_sync($node_p, $subnames[0]); +$node_s->wait_for_subscription_sync($node_p, $subnames[1]); + +# Confirm the failover slot has been removed +$result = $node_s->safe_psql($db1, + "SELECT count(*) FROM pg_replication_slots WHERE slot_name = '$fslotname'" +); +is($result, qq(0), 'failover slot was removed'); + +# Check result in database $db1 +$result = $node_s->safe_psql($db1, 'SELECT * FROM tbl1'); +is( $result, qq(first row +second row +third row), + "logical replication works in database $db1"); + +# Check result in database $db2 +$result = $node_s->safe_psql($db2, 'SELECT * FROM tbl2'); +is($result, qq(row 1), "logical replication works in database $db2"); + +# Different system identifier? +my $sysid_p = $node_p->safe_psql('postgres', + 'SELECT system_identifier FROM pg_control_system()'); +my $sysid_s = $node_s->safe_psql('postgres', + 'SELECT system_identifier FROM pg_control_system()'); +ok($sysid_p != $sysid_s, 'system identifier was changed'); + +# clean up +$node_p->teardown_node; +$node_s->teardown_node; +$node_t->teardown_node; +$node_f->teardown_node; + +done_testing(); diff --git a/src/bin/pg_basebackup/walmethods.c b/src/bin/pg_basebackup/walmethods.c index 376ddf72b7104..935429ea1e819 100644 --- a/src/bin/pg_basebackup/walmethods.c +++ b/src/bin/pg_basebackup/walmethods.c @@ -2,7 +2,7 @@ * * walmethods.c - implementations of different ways to write received wal * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/walmethods.c @@ -594,6 +594,11 @@ dir_existsfile(WalWriteMethod *wwmethod, const char *pathname) fd = open(tmppath, O_RDONLY | PG_BINARY, 0); if (fd < 0) + + /* + * Skip setting dir_data->lasterrno here because we are only checking + * for existence. + */ return false; close(fd); return true; @@ -686,7 +691,7 @@ const WalWriteMethodOps WalTarMethodOps = { typedef struct TarMethodFile { Walfile base; - off_t ofs_start; /* Where does the *header* for this file start */ + pgoff_t ofs_start; /* Where does the *header* for this file start */ char header[TAR_BLOCK_SIZE]; size_t pad_to_size; } TarMethodFile; @@ -705,7 +710,7 @@ typedef struct TarMethodData #ifdef HAVE_LIBZ static bool -tar_write_compressed_data(TarMethodData *tar_data, void *buf, size_t count, +tar_write_compressed_data(TarMethodData *tar_data, const void *buf, size_t count, bool flush) { tar_data->zp->next_in = buf; @@ -782,8 +787,7 @@ tar_write(Walfile *f, const void *buf, size_t count) #ifdef HAVE_LIBZ else if (f->wwmethod->compression_algorithm == PG_COMPRESSION_GZIP) { - if (!tar_write_compressed_data(tar_data, unconstify(void *, buf), - count, false)) + if (!tar_write_compressed_data(tar_data, buf, count, false)) return -1; f->currpos += count; return count; @@ -1131,7 +1135,7 @@ tar_close(Walfile *f, WalCloseMethod method) * possibly also renaming the file. We overwrite the entire current header * when done, including the checksum. */ - print_tar_number(&(tf->header[124]), 12, filesize); + print_tar_number(&(tf->header[TAR_OFFSET_SIZE]), 12, filesize); if (method == CLOSE_NORMAL) @@ -1139,9 +1143,10 @@ tar_close(Walfile *f, WalCloseMethod method) * We overwrite it with what it was before if we have no tempname, * since we're going to write the buffer anyway. */ - strlcpy(&(tf->header[0]), tf->base.pathname, 100); + strlcpy(&(tf->header[TAR_OFFSET_NAME]), tf->base.pathname, 100); - print_tar_number(&(tf->header[148]), 8, tarChecksum(((TarMethodFile *) f)->header)); + print_tar_number(&(tf->header[TAR_OFFSET_CHECKSUM]), 8, + tarChecksum(((TarMethodFile *) f)->header)); if (lseek(tar_data->fd, tf->ofs_start, SEEK_SET) != ((TarMethodFile *) f)->ofs_start) { f->wwmethod->lasterrno = errno; diff --git a/src/bin/pg_basebackup/walmethods.h b/src/bin/pg_basebackup/walmethods.h index 54a22fe6070a1..488dd8f92d330 100644 --- a/src/bin/pg_basebackup/walmethods.h +++ b/src/bin/pg_basebackup/walmethods.h @@ -2,7 +2,7 @@ * * walmethods.h * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_basebackup/walmethods.h @@ -17,7 +17,7 @@ typedef struct WalWriteMethod WalWriteMethod; typedef struct { WalWriteMethod *wwmethod; - off_t currpos; + pgoff_t currpos; char *pathname; /* @@ -32,7 +32,7 @@ typedef enum { CLOSE_NORMAL, CLOSE_UNLINK, - CLOSE_NO_RENAME + CLOSE_NO_RENAME, } WalCloseMethod; /* diff --git a/src/bin/pg_checksums/Makefile b/src/bin/pg_checksums/Makefile index 4911f6bee2cb2..31de5fb467344 100644 --- a/src/bin/pg_checksums/Makefile +++ b/src/bin/pg_checksums/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/pg_checksums # -# Copyright (c) 1998-2023, PostgreSQL Global Development Group +# Copyright (c) 1998-2024, PostgreSQL Global Development Group # # src/bin/pg_checksums/Makefile # @@ -36,7 +36,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_checksums$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_checksums$(X) $(OBJS) rm -rf tmp_check diff --git a/src/bin/pg_checksums/meson.build b/src/bin/pg_checksums/meson.build index 5528526094da1..e5153a47a97ce 100644 --- a/src/bin/pg_checksums/meson.build +++ b/src/bin/pg_checksums/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_checksums_sources = files( 'pg_checksums.c', diff --git a/src/bin/pg_checksums/nls.mk b/src/bin/pg_checksums/nls.mk index f7cd2a5ee9371..9f1b5a8b4a2dc 100644 --- a/src/bin/pg_checksums/nls.mk +++ b/src/bin/pg_checksums/nls.mk @@ -2,6 +2,9 @@ CATALOG_NAME = pg_checksums GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ pg_checksums.c \ + ../../common/controldata_utils.c \ + ../../common/fe_memutils.c \ + ../../common/file_utils.c \ ../../fe_utils/option_utils.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c index 19eb67e4854f7..9e6fd435f6069 100644 --- a/src/bin/pg_checksums/pg_checksums.c +++ b/src/bin/pg_checksums/pg_checksums.c @@ -4,7 +4,7 @@ * Checks, enables or disables page level checksums for an offline * cluster * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_checksums/pg_checksums.c @@ -20,11 +20,11 @@ #include #include -#include "access/xlog_internal.h" #include "common/controldata_utils.h" #include "common/file_perm.h" #include "common/file_utils.h" #include "common/logging.h" +#include "common/relpath.h" #include "fe_utils/option_utils.h" #include "getopt_long.h" #include "pg_getopt.h" @@ -44,24 +44,15 @@ static char *only_filenode = NULL; static bool do_sync = true; static bool verbose = false; static bool showprogress = false; +static DataDirSyncMethod sync_method = DATA_DIR_SYNC_METHOD_FSYNC; typedef enum { PG_MODE_CHECK, PG_MODE_DISABLE, - PG_MODE_ENABLE + PG_MODE_ENABLE, } PgChecksumMode; -/* - * Filename components. - * - * XXX: fd.h is not declared here as frontend side code is not able to - * interact with the backend-side definitions for the various fsync - * wrappers. - */ -#define PG_TEMP_FILES_DIR "pgsql_tmp" -#define PG_TEMP_FILE_PREFIX "pgsql_tmp" - static PgChecksumMode mode = PG_MODE_CHECK; static const char *progname; @@ -87,6 +78,7 @@ usage(void) printf(_(" -f, --filenode=FILENODE check only relation with specified filenode\n")); printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n")); printf(_(" -P, --progress show progress information\n")); + printf(_(" --sync-method=METHOD set method for syncing files to disk\n")); printf(_(" -v, --verbose output verbose messages\n")); printf(_(" -V, --version output version information, then exit\n")); printf(_(" -?, --help show this help, then exit\n")); @@ -337,6 +329,10 @@ scan_directory(const char *basedir, const char *subdir, bool sizeonly) strlen(PG_TEMP_FILES_DIR)) == 0) continue; + /* Skip macOS system files */ + if (strcmp(de->d_name, ".DS_Store") == 0) + continue; + snprintf(fn, sizeof(fn), "%s/%s", path, de->d_name); if (lstat(fn, &st) < 0) pg_fatal("could not stat file \"%s\": %m", fn); @@ -445,6 +441,7 @@ main(int argc, char *argv[]) {"no-sync", no_argument, NULL, 'N'}, {"progress", no_argument, NULL, 'P'}, {"verbose", no_argument, NULL, 'v'}, + {"sync-method", required_argument, NULL, 1}, {NULL, 0, NULL, 0} }; @@ -503,6 +500,10 @@ main(int argc, char *argv[]) case 'v': verbose = true; break; + case 1: + if (!parse_sync_method(optarg, &sync_method)) + exit(1); + break; default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -633,7 +634,7 @@ main(int argc, char *argv[]) if (do_sync) { pg_log_info("syncing data directory"); - fsync_pgdata(DataDir, PG_VERSION_NUM); + sync_pgdata(DataDir, PG_VERSION_NUM, sync_method); } pg_log_info("updating control file"); diff --git a/src/bin/pg_checksums/po/LINGUAS b/src/bin/pg_checksums/po/LINGUAS index e83c28361e778..ea6197d98d094 100644 --- a/src/bin/pg_checksums/po/LINGUAS +++ b/src/bin/pg_checksums/po/LINGUAS @@ -1 +1 @@ -cs de el es fr it ja ka ko pt_BR ru sv tr uk zh_CN +cs de el es fr it ja ka ko pt_BR ru sv tr uk zh_CN zh_TW diff --git a/src/bin/pg_checksums/po/de.po b/src/bin/pg_checksums/po/de.po index 460b5b5be1e7d..8b74011f53b17 100644 --- a/src/bin/pg_checksums/po/de.po +++ b/src/bin/pg_checksums/po/de.po @@ -1,14 +1,14 @@ # German message translation file for pg_checksums -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2024 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Peter Eisentraut , 2018 - 2022. +# Peter Eisentraut , 2018 - 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-11 15:51+0000\n" -"PO-Revision-Date: 2022-05-11 22:16+0200\n" +"POT-Creation-Date: 2024-06-16 07:54+0000\n" +"PO-Revision-Date: 2024-03-19 21:17+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,26 +16,126 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "Warnung: " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "Detail: " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "Tipp: " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" + +#: ../../common/controldata_utils.c:110 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "konnte Datei »%s« nicht lesen: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schließen: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "falsche Byte-Reihenfolge" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"möglicherweise falsche Byte-Reihenfolge\n" +"Die Byte-Reihenfolge, die zur Speicherung der Datei pg_control verwendet wurde,\n" +"stimmt möglicherweise nicht mit der von diesem Programm verwendeten überein. In\n" +"diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n" +"wäre inkompatibel mit diesem Datenverzeichnis." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_checksums.c:192 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "konnte Datei »%s« nicht öffnen: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schreiben: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "konnte Datei »%s« nicht fsyncen: %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "Speicher aufgebraucht\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_checksums.c:338 pg_checksums.c:407 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_checksums.c:310 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht lesen: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" + #: ../../fe_utils/option_utils.c:69 #, c-format msgid "invalid value \"%s\" for option %s" @@ -46,7 +146,12 @@ msgstr "ungültiger Wert »%s« für Option %s" msgid "%s must be in range %d..%d" msgstr "%s muss im Bereich %d..%d sein" -#: pg_checksums.c:79 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "unbekannte Sync-Methode: %s" + +#: pg_checksums.c:70 #, c-format msgid "" "%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n" @@ -55,17 +160,17 @@ msgstr "" "%s überprüft die Datenprüfsummen in einem PostgreSQL-Datenbankcluster oder schaltet sie ein oder aus.\n" "\n" -#: pg_checksums.c:80 +#: pg_checksums.c:71 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_checksums.c:81 +#: pg_checksums.c:72 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATENVERZEICHNIS]\n" -#: pg_checksums.c:82 +#: pg_checksums.c:73 #, c-format msgid "" "\n" @@ -74,59 +179,67 @@ msgstr "" "\n" "Optionen:\n" -#: pg_checksums.c:83 +#: pg_checksums.c:74 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]VERZ Datenbankverzeichnis\n" -#: pg_checksums.c:84 +#: pg_checksums.c:75 #, c-format msgid " -c, --check check data checksums (default)\n" msgstr " -c, --check Datenprüfsummen prüfen (Voreinstellung)\n" -#: pg_checksums.c:85 +#: pg_checksums.c:76 #, c-format msgid " -d, --disable disable data checksums\n" msgstr " -d, --disable Datenprüfsummen ausschalten\n" -#: pg_checksums.c:86 +#: pg_checksums.c:77 #, c-format msgid " -e, --enable enable data checksums\n" msgstr " -e, --enable Datenprüfsummen einschalten\n" -#: pg_checksums.c:87 +#: pg_checksums.c:78 #, c-format msgid " -f, --filenode=FILENODE check only relation with specified filenode\n" msgstr " -f, --filenode=FILENODE nur Relation mit angegebenem Filenode prüfen\n" -#: pg_checksums.c:88 +#: pg_checksums.c:79 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" " geschrieben sind\n" -#: pg_checksums.c:89 +#: pg_checksums.c:80 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress Fortschrittsinformationen zeigen\n" -#: pg_checksums.c:90 +#: pg_checksums.c:81 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr "" +" --sync-method=METHODE\n" +" Methode zum Synchronisieren von Dateien auf Festplatte\n" +" setzen\n" + +#: pg_checksums.c:82 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose »Verbose«-Modus\n" -#: pg_checksums.c:91 +#: pg_checksums.c:83 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_checksums.c:92 +#: pg_checksums.c:84 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_checksums.c:93 +#: pg_checksums.c:85 #, c-format msgid "" "\n" @@ -139,192 +252,177 @@ msgstr "" "PGDATA verwendet.\n" "\n" -#: pg_checksums.c:95 +#: pg_checksums.c:87 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Berichten Sie Fehler an <%s>.\n" -#: pg_checksums.c:96 +#: pg_checksums.c:88 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_checksums.c:153 +#: pg_checksums.c:145 #, c-format msgid "%lld/%lld MB (%d%%) computed" msgstr "%lld/%lld MB (%d%%) berechnet" -#: pg_checksums.c:200 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "konnte Datei »%s« nicht öffnen: %m" - -#: pg_checksums.c:214 +#: pg_checksums.c:206 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "konnte Block %u in Datei »%s« nicht lesen: %m" -#: pg_checksums.c:217 +#: pg_checksums.c:209 #, c-format msgid "could not read block %u in file \"%s\": read %d of %d" msgstr "konnte Block %u in Datei »%s« nicht lesen: %d von %d gelesen" -#: pg_checksums.c:240 +#: pg_checksums.c:232 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X" msgstr "Prüfsummenprüfung fehlgeschlagen in Datei »%s«, Block %u: berechnete Prüfsumme ist %X, aber der Block enthält %X" -#: pg_checksums.c:263 +#: pg_checksums.c:255 #, c-format msgid "seek failed for block %u in file \"%s\": %m" msgstr "seek fehlgeschlagen für Block %u in Datei »%s«: %m" -#: pg_checksums.c:270 +#: pg_checksums.c:262 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "konnte Block %u in Datei »%s« nicht schreiben: %m" -#: pg_checksums.c:273 +#: pg_checksums.c:265 #, c-format msgid "could not write block %u in file \"%s\": wrote %d of %d" msgstr "konnte Block %u in Datei »%s« nicht schreiben: %d von %d geschrieben" -#: pg_checksums.c:285 +#: pg_checksums.c:277 #, c-format msgid "checksums verified in file \"%s\"" msgstr "Prüfsummen wurden überprüft in Datei »%s«" -#: pg_checksums.c:287 +#: pg_checksums.c:279 #, c-format msgid "checksums enabled in file \"%s\"" msgstr "Prüfsummen wurden eingeschaltet in Datei »%s«" -#: pg_checksums.c:318 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" - -#: pg_checksums.c:342 pg_checksums.c:415 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" - -#: pg_checksums.c:366 +#: pg_checksums.c:362 #, c-format msgid "invalid segment number %d in file name \"%s\"" msgstr "ungültige Segmentnummer %d in Dateiname »%s«" -#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546 +#: pg_checksums.c:509 pg_checksums.c:525 pg_checksums.c:535 pg_checksums.c:543 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_checksums.c:527 +#: pg_checksums.c:524 #, c-format msgid "no data directory specified" msgstr "kein Datenverzeichnis angegeben" -#: pg_checksums.c:536 +#: pg_checksums.c:533 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_checksums.c:545 +#: pg_checksums.c:542 #, c-format msgid "option -f/--filenode can only be used with --check" msgstr "Option -f/--filenode kann nur mit --check verwendet werden" -#: pg_checksums.c:553 +#: pg_checksums.c:550 #, c-format msgid "pg_control CRC value is incorrect" msgstr "CRC-Wert in pg_control ist falsch" -#: pg_checksums.c:556 +#: pg_checksums.c:553 #, c-format msgid "cluster is not compatible with this version of pg_checksums" msgstr "die Cluster sind nicht mit dieser Version von pg_checksums kompatibel" -#: pg_checksums.c:560 +#: pg_checksums.c:557 #, c-format msgid "database cluster is not compatible" msgstr "Datenbank-Cluster ist nicht kompatibel" -#: pg_checksums.c:561 +#: pg_checksums.c:558 #, c-format msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u." msgstr "Der Datenbank-Cluster wurde mit Blockgröße %u initialisiert, aber pg_checksums wurde mit Blockgröße %u kompiliert." -#: pg_checksums.c:573 +#: pg_checksums.c:570 #, c-format msgid "cluster must be shut down" msgstr "Cluster muss heruntergefahren sein" -#: pg_checksums.c:577 +#: pg_checksums.c:574 #, c-format msgid "data checksums are not enabled in cluster" msgstr "Datenprüfsummen sind im Cluster nicht eingeschaltet" -#: pg_checksums.c:581 +#: pg_checksums.c:578 #, c-format msgid "data checksums are already disabled in cluster" msgstr "Datenprüfsummen sind im Cluster bereits ausgeschaltet" -#: pg_checksums.c:585 +#: pg_checksums.c:582 #, c-format msgid "data checksums are already enabled in cluster" msgstr "Datenprüfsummen sind im Cluster bereits eingeschaltet" -#: pg_checksums.c:609 +#: pg_checksums.c:606 #, c-format msgid "Checksum operation completed\n" msgstr "Prüfsummenoperation abgeschlossen\n" -#: pg_checksums.c:610 +#: pg_checksums.c:607 #, c-format msgid "Files scanned: %lld\n" msgstr "Überprüfte Dateien: %lld\n" -#: pg_checksums.c:611 +#: pg_checksums.c:608 #, c-format msgid "Blocks scanned: %lld\n" msgstr "Überprüfte Blöcke: %lld\n" -#: pg_checksums.c:614 +#: pg_checksums.c:611 #, c-format msgid "Bad checksums: %lld\n" msgstr "Falsche Prüfsummen: %lld\n" -#: pg_checksums.c:615 pg_checksums.c:647 +#: pg_checksums.c:612 pg_checksums.c:644 #, c-format msgid "Data checksum version: %u\n" msgstr "Datenprüfsummenversion: %u\n" -#: pg_checksums.c:622 +#: pg_checksums.c:619 #, c-format msgid "Files written: %lld\n" msgstr "Geschriebene Dateien: %lld\n" -#: pg_checksums.c:623 +#: pg_checksums.c:620 #, c-format msgid "Blocks written: %lld\n" msgstr "Geschriebene Blöcke: %lld\n" -#: pg_checksums.c:639 +#: pg_checksums.c:636 #, c-format msgid "syncing data directory" msgstr "synchronisiere Datenverzeichnis" -#: pg_checksums.c:643 +#: pg_checksums.c:640 #, c-format msgid "updating control file" msgstr "aktualisiere Kontrolldatei" -#: pg_checksums.c:649 +#: pg_checksums.c:646 #, c-format msgid "Checksums enabled in cluster\n" msgstr "Prüfsummen wurden im Cluster eingeschaltet\n" -#: pg_checksums.c:651 +#: pg_checksums.c:648 #, c-format msgid "Checksums disabled in cluster\n" msgstr "Prüfsummen wurden im Cluster ausgeschaltet\n" diff --git a/src/bin/pg_checksums/po/es.po b/src/bin/pg_checksums/po/es.po index 41f051cef1953..4a45c85987bbe 100644 --- a/src/bin/pg_checksums/po/es.po +++ b/src/bin/pg_checksums/po/es.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_checksums (PostgreSQL) 16\n" +"Project-Id-Version: pg_checksums (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:23+0000\n" -"PO-Revision-Date: 2023-05-22 12:05+0200\n" +"POT-Creation-Date: 2025-02-16 19:53+0000\n" +"PO-Revision-Date: 2024-11-16 14:23+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: pgsql-es-ayuda \n" "Language: es\n" @@ -40,6 +40,106 @@ msgstr "detalle: " msgid "hint: " msgstr "consejo: " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "no se pudo abrir archivo «%s» para lectura: %m" + +#: ../../common/controldata_utils.c:110 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "no se pudo leer el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "no se pudo cerrar el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "discordancia en orden de bytes" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"posible discordancia en orden de bytes\n" +"El ordenamiento de bytes usado para almacenar el archivo pg_control puede no\n" +"coincidir con el usado por este programa. En tal caso los resultados de abajo\n" +"serían erróneos, y la instalación de PostgreSQL sería incompatible con este\n" +"directorio de datos." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_checksums.c:192 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "no se pudo abrir el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "no se pudo escribir el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "memoria agotada\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "no se puede duplicar un puntero nulo (error interno)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_checksums.c:338 pg_checksums.c:407 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "no se pudo hacer stat al archivo «%s»: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "esta instalación no soporta el método de sync «%s»" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_checksums.c:310 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "no se pudo abrir el directorio «%s»: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "no se pudo leer el directorio «%s»: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" + #: ../../fe_utils/option_utils.c:69 #, c-format msgid "invalid value \"%s\" for option %s" @@ -50,26 +150,32 @@ msgstr "el valor «%s» no es válido para la opción %s" msgid "%s must be in range %d..%d" msgstr "%s debe estar en el rango %d..%d" -#: pg_checksums.c:79 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "método sync no reconocido: %s" + +#: pg_checksums.c:70 #, c-format msgid "" "%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n" "\n" msgstr "" -"%s activa, desactiva o verifica checksums de datos en un clúster PostgreSQL.\n" +"%s activa, desactiva o verifica checksums de datos en un\n" +"clúster PostgreSQL.\n" "\n" -#: pg_checksums.c:80 +#: pg_checksums.c:71 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: pg_checksums.c:81 +#: pg_checksums.c:72 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPCIÓN]... [DATADIR]\n" -#: pg_checksums.c:82 +#: pg_checksums.c:73 #, c-format msgid "" "\n" @@ -78,57 +184,62 @@ msgstr "" "\n" "Opciones:\n" -#: pg_checksums.c:83 +#: pg_checksums.c:74 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]DATADIR directorio de datos\n" -#: pg_checksums.c:84 +#: pg_checksums.c:75 #, c-format msgid " -c, --check check data checksums (default)\n" msgstr " -c, --check verificar checksums (por omisión)\n" -#: pg_checksums.c:85 +#: pg_checksums.c:76 #, c-format msgid " -d, --disable disable data checksums\n" msgstr " -d, --disable desactivar checksums\n" -#: pg_checksums.c:86 +#: pg_checksums.c:77 #, c-format msgid " -e, --enable enable data checksums\n" msgstr " -e, --enable activar checksums\n" -#: pg_checksums.c:87 +#: pg_checksums.c:78 #, c-format msgid " -f, --filenode=FILENODE check only relation with specified filenode\n" msgstr " -f, --filenode=FILENODE verificar sólo la relación con el filenode dado\n" -#: pg_checksums.c:88 +#: pg_checksums.c:79 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n" -#: pg_checksums.c:89 +#: pg_checksums.c:80 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress mostrar información de progreso\n" -#: pg_checksums.c:90 +#: pg_checksums.c:81 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=MÉTODO definir método para sincr. archivos a disco\n" + +#: pg_checksums.c:82 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose desplegar mensajes verbosos\n" -#: pg_checksums.c:91 +#: pg_checksums.c:83 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión y salir\n" -#: pg_checksums.c:92 +#: pg_checksums.c:84 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: pg_checksums.c:93 +#: pg_checksums.c:85 #, c-format msgid "" "\n" @@ -141,192 +252,177 @@ msgstr "" "la variable de entorno PGDATA.\n" "\n" -#: pg_checksums.c:95 +#: pg_checksums.c:87 #, c-format msgid "Report bugs to <%s>.\n" -msgstr "Reportar errores a <%s>.\n" +msgstr "Reporte errores a <%s>.\n" -#: pg_checksums.c:96 +#: pg_checksums.c:88 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: pg_checksums.c:153 +#: pg_checksums.c:145 #, c-format msgid "%lld/%lld MB (%d%%) computed" msgstr "%lld/%lld MB (%d%%) calculado" -#: pg_checksums.c:200 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "no se pudo abrir el archivo «%s»: %m" - -#: pg_checksums.c:214 +#: pg_checksums.c:206 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "no se pudo leer el bloque %u del archivo «%s»: %m" -#: pg_checksums.c:217 +#: pg_checksums.c:209 #, c-format msgid "could not read block %u in file \"%s\": read %d of %d" msgstr "no se pudo leer bloque %u en archivo «%s»: leídos %d de %d" -#: pg_checksums.c:240 +#: pg_checksums.c:232 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X" msgstr "verificación de checksums falló en archivo «%s», bloque %u: checksum calculado %X pero bloque contiene %X" -#: pg_checksums.c:263 +#: pg_checksums.c:255 #, c-format msgid "seek failed for block %u in file \"%s\": %m" msgstr "posicionamiento (seek) falló para el bloque %u en archivo «%s»: %m" -#: pg_checksums.c:270 +#: pg_checksums.c:262 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "no se pudo escribir el bloque %u en el archivo «%s»: %m" -#: pg_checksums.c:273 +#: pg_checksums.c:265 #, c-format msgid "could not write block %u in file \"%s\": wrote %d of %d" msgstr "no se pudo escribir el bloque %u en el archivo «%s»: se escribieron %d de %d" -#: pg_checksums.c:285 +#: pg_checksums.c:277 #, c-format msgid "checksums verified in file \"%s\"" msgstr "checksums verificados en archivo «%s»" -#: pg_checksums.c:287 +#: pg_checksums.c:279 #, c-format msgid "checksums enabled in file \"%s\"" msgstr "checksums activados en archivo «%s»" -#: pg_checksums.c:318 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "no se pudo abrir el directorio «%s»: %m" - -#: pg_checksums.c:342 pg_checksums.c:411 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "no se pudo hacer stat al archivo «%s»: %m" - -#: pg_checksums.c:366 +#: pg_checksums.c:362 #, c-format msgid "invalid segment number %d in file name \"%s\"" msgstr "número de segmento %d no válido en nombre de archivo «%s»" -#: pg_checksums.c:508 pg_checksums.c:524 pg_checksums.c:534 pg_checksums.c:542 +#: pg_checksums.c:509 pg_checksums.c:525 pg_checksums.c:535 pg_checksums.c:543 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: pg_checksums.c:523 +#: pg_checksums.c:524 #, c-format msgid "no data directory specified" msgstr "no se especificó el directorio de datos" -#: pg_checksums.c:532 +#: pg_checksums.c:533 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: pg_checksums.c:541 +#: pg_checksums.c:542 #, c-format msgid "option -f/--filenode can only be used with --check" msgstr "la opción -f/--filenode sólo puede usarse con --check" -#: pg_checksums.c:549 +#: pg_checksums.c:550 #, c-format msgid "pg_control CRC value is incorrect" msgstr "el valor de CRC de pg_control es incorrecto" -#: pg_checksums.c:552 +#: pg_checksums.c:553 #, c-format msgid "cluster is not compatible with this version of pg_checksums" msgstr "el clúster no es compatible con esta versión de pg_checksums" -#: pg_checksums.c:556 +#: pg_checksums.c:557 #, c-format msgid "database cluster is not compatible" msgstr "el clúster de bases de datos no es compatible" -#: pg_checksums.c:557 +#: pg_checksums.c:558 #, c-format msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u." msgstr "El clúster fue inicializado con tamaño de bloque %u, pero pg_checksums fue compilado con tamaño de bloques %u." -#: pg_checksums.c:569 +#: pg_checksums.c:570 #, c-format msgid "cluster must be shut down" msgstr "el clúster debe estar apagado" -#: pg_checksums.c:573 +#: pg_checksums.c:574 #, c-format msgid "data checksums are not enabled in cluster" msgstr "los checksums de datos no están activados en el clúster" -#: pg_checksums.c:577 +#: pg_checksums.c:578 #, c-format msgid "data checksums are already disabled in cluster" msgstr "los checksums de datos ya están desactivados en el clúster" -#: pg_checksums.c:581 +#: pg_checksums.c:582 #, c-format msgid "data checksums are already enabled in cluster" msgstr "los checksums de datos ya están activados en el clúster" -#: pg_checksums.c:605 +#: pg_checksums.c:606 #, c-format msgid "Checksum operation completed\n" msgstr "Operación de checksums completa\n" -#: pg_checksums.c:606 +#: pg_checksums.c:607 #, c-format msgid "Files scanned: %lld\n" msgstr "Archivos recorridos: %lld\n" -#: pg_checksums.c:607 +#: pg_checksums.c:608 #, c-format msgid "Blocks scanned: %lld\n" msgstr "Bloques recorridos: %lld\n" -#: pg_checksums.c:610 +#: pg_checksums.c:611 #, c-format msgid "Bad checksums: %lld\n" msgstr "Checksums incorrectos: %lld\n" -#: pg_checksums.c:611 pg_checksums.c:643 +#: pg_checksums.c:612 pg_checksums.c:644 #, c-format msgid "Data checksum version: %u\n" msgstr "Versión de checksums de datos: %u\n" -#: pg_checksums.c:618 +#: pg_checksums.c:619 #, c-format msgid "Files written: %lld\n" msgstr "Archivos escritos: %lld\n" -#: pg_checksums.c:619 +#: pg_checksums.c:620 #, c-format msgid "Blocks written: %lld\n" msgstr "Bloques escritos: %lld\n" -#: pg_checksums.c:635 +#: pg_checksums.c:636 #, c-format msgid "syncing data directory" msgstr "sincronizando directorio de datos" -#: pg_checksums.c:639 +#: pg_checksums.c:640 #, c-format msgid "updating control file" msgstr "actualizando archivo de control" -#: pg_checksums.c:645 +#: pg_checksums.c:646 #, c-format msgid "Checksums enabled in cluster\n" msgstr "Checksums activos en el clúster\n" -#: pg_checksums.c:647 +#: pg_checksums.c:648 #, c-format msgid "Checksums disabled in cluster\n" msgstr "Checksums inactivos en el clúster\n" diff --git a/src/bin/pg_checksums/po/fr.po b/src/bin/pg_checksums/po/fr.po index dcdb4c74f1512..dcd82587d4ff4 100644 --- a/src/bin/pg_checksums/po/fr.po +++ b/src/bin/pg_checksums/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-14 10:21+0000\n" -"PO-Revision-Date: 2022-05-14 17:15+0200\n" +"POT-Creation-Date: 2024-07-20 21:25+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,28 +19,128 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "attention : " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "détail : " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "astuce : " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" + +#: ../../common/controldata_utils.c:110 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "n'a pas pu lire le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "n'a pas pu fermer le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "différence de l'ordre des octets" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"possible incohérence dans l'ordre des octets\n" +"L'ordre des octets utilisé pour enregistrer le fichier pg_control peut ne\n" +"pas correspondre à celui utilisé par ce programme. Dans ce cas, les\n" +"résultats ci-dessous sont incorrects, et l'installation de PostgreSQL\n" +"est incompatible avec ce répertoire des données." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_checksums.c:192 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "impossible d'écrire le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "mémoire épuisée\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_checksums.c:338 pg_checksums.c:407 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "n'a pas pu tester le fichier « %s » : %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "cette construction ne supporte pas la méthode de synchronisation « %s »" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_checksums.c:310 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "n'a pas pu lire le répertoire « %s » : %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" + #: ../../fe_utils/option_utils.c:69 #, c-format msgid "invalid value \"%s\" for option %s" @@ -51,7 +151,12 @@ msgstr "valeur « %s » invalide pour l'option %s" msgid "%s must be in range %d..%d" msgstr "%s doit être compris entre %d et %d" -#: pg_checksums.c:79 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "méthode de synchronisation non reconnu : %s" + +#: pg_checksums.c:70 #, c-format msgid "" "%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n" @@ -61,17 +166,17 @@ msgstr "" "une instance PostgreSQL.\n" "\n" -#: pg_checksums.c:80 +#: pg_checksums.c:71 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_checksums.c:81 +#: pg_checksums.c:72 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [RÉP_DONNÉES]\n" -#: pg_checksums.c:82 +#: pg_checksums.c:73 #, c-format msgid "" "\n" @@ -80,61 +185,66 @@ msgstr "" "\n" "Options :\n" -#: pg_checksums.c:83 +#: pg_checksums.c:74 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]REP_DONNEES répertoire des données\n" -#: pg_checksums.c:84 +#: pg_checksums.c:75 #, c-format msgid " -c, --check check data checksums (default)\n" msgstr " -c, --check vérifie les sommes de contrôle (par défaut)\n" -#: pg_checksums.c:85 +#: pg_checksums.c:76 #, c-format msgid " -d, --disable disable data checksums\n" msgstr " -d, --disable désactive les sommes de contrôle\n" -#: pg_checksums.c:86 +#: pg_checksums.c:77 #, c-format msgid " -e, --enable enable data checksums\n" msgstr " -e, --enable active les sommes de contrôle\n" -#: pg_checksums.c:87 +#: pg_checksums.c:78 #, c-format msgid " -f, --filenode=FILENODE check only relation with specified filenode\n" msgstr "" " -f, --filenode=FILENODE vérifie seulement la relation dont l'identifiant\n" " relfilenode est indiqué\n" -#: pg_checksums.c:88 +#: pg_checksums.c:79 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " -N, --no-sync n'attend pas que les modifications soient\n" " proprement écrites sur disque\n" -#: pg_checksums.c:89 +#: pg_checksums.c:80 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress affiche la progression de l'opération\n" -#: pg_checksums.c:90 +#: pg_checksums.c:81 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHODE configure la méthode pour synchroniser les fichiers sur disque\n" + +#: pg_checksums.c:82 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose affiche des messages verbeux\n" -#: pg_checksums.c:91 +#: pg_checksums.c:83 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: pg_checksums.c:92 +#: pg_checksums.c:84 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_checksums.c:93 +#: pg_checksums.c:85 #, c-format msgid "" "\n" @@ -147,228 +257,177 @@ msgstr "" "PGDATA est utilisée.\n" "\n" -#: pg_checksums.c:95 +#: pg_checksums.c:87 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapporter les bogues à <%s>.\n" -#: pg_checksums.c:96 +#: pg_checksums.c:88 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" -#: pg_checksums.c:153 +#: pg_checksums.c:145 #, c-format msgid "%lld/%lld MB (%d%%) computed" msgstr "%lld/%lld Mo (%d%%) traités" -#: pg_checksums.c:200 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "n'a pas pu ouvrir le fichier « %s » : %m" - -#: pg_checksums.c:214 +#: pg_checksums.c:206 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "n'a pas pu lire le bloc %u dans le fichier « %s » : %m" -#: pg_checksums.c:217 +#: pg_checksums.c:209 #, c-format msgid "could not read block %u in file \"%s\": read %d of %d" msgstr "n'a pas pu lire le bloc %u dans le fichier « %s » : %d lus sur %d" -#: pg_checksums.c:240 +#: pg_checksums.c:232 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X" msgstr "échec de la vérification de la somme de contrôle dans le fichier « %s », bloc %u : somme de contrôle calculée %X, alors que le bloc contient %X" -#: pg_checksums.c:263 +#: pg_checksums.c:255 #, c-format msgid "seek failed for block %u in file \"%s\": %m" msgstr "n'a pas pu rechercher le bloc %u dans le fichier « %s » : %m" -#: pg_checksums.c:270 +#: pg_checksums.c:262 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "n'a pas pu écrire le bloc %u dans le fichier « %s » : %m" -#: pg_checksums.c:273 +#: pg_checksums.c:265 #, c-format msgid "could not write block %u in file \"%s\": wrote %d of %d" msgstr "n'a pas pu écrire le bloc %u du fichier « %s » : a écrit %d octets sur %d" -#: pg_checksums.c:285 +#: pg_checksums.c:277 #, c-format msgid "checksums verified in file \"%s\"" msgstr "sommes de contrôle vérifiées dans le fichier « %s »" -#: pg_checksums.c:287 +#: pg_checksums.c:279 #, c-format msgid "checksums enabled in file \"%s\"" msgstr "sommes de contrôle activées dans le fichier « %s »" -#: pg_checksums.c:318 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" - -#: pg_checksums.c:342 pg_checksums.c:415 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "n'a pas pu tester le fichier « %s » : %m" - -#: pg_checksums.c:366 +#: pg_checksums.c:362 #, c-format msgid "invalid segment number %d in file name \"%s\"" msgstr "numéro de segment %d invalide dans le nom de fichier « %s »" -#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546 +#: pg_checksums.c:509 pg_checksums.c:525 pg_checksums.c:535 pg_checksums.c:543 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_checksums.c:527 +#: pg_checksums.c:524 #, c-format msgid "no data directory specified" msgstr "aucun répertoire de données indiqué" -#: pg_checksums.c:536 +#: pg_checksums.c:533 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_checksums.c:545 +#: pg_checksums.c:542 #, c-format msgid "option -f/--filenode can only be used with --check" msgstr "l'option « -f/--filenode » peut seulement être utilisée avec --check" -#: pg_checksums.c:553 +#: pg_checksums.c:550 #, c-format msgid "pg_control CRC value is incorrect" msgstr "la valeur CRC de pg_control n'est pas correcte" -#: pg_checksums.c:556 +#: pg_checksums.c:553 #, c-format msgid "cluster is not compatible with this version of pg_checksums" msgstr "l'instance n'est pas compatible avec cette version de pg_checksums" -#: pg_checksums.c:560 +#: pg_checksums.c:557 #, c-format msgid "database cluster is not compatible" msgstr "l'instance n'est pas compatible" -#: pg_checksums.c:561 +#: pg_checksums.c:558 #, c-format msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u." msgstr "L'instance a été initialisée avec une taille de bloc à %u alors que pg_checksums a été compilé avec une taille de bloc à %u." -#: pg_checksums.c:573 +#: pg_checksums.c:570 #, c-format msgid "cluster must be shut down" msgstr "l'instance doit être arrêtée" -#: pg_checksums.c:577 +#: pg_checksums.c:574 #, c-format msgid "data checksums are not enabled in cluster" msgstr "les sommes de contrôle sur les données ne sont pas activées sur cette instance" -#: pg_checksums.c:581 +#: pg_checksums.c:578 #, c-format msgid "data checksums are already disabled in cluster" msgstr "les sommes de contrôle sur les données sont déjà désactivées sur cette instance" -#: pg_checksums.c:585 +#: pg_checksums.c:582 #, c-format msgid "data checksums are already enabled in cluster" msgstr "les sommes de contrôle sur les données sont déjà activées sur cette instance" -#: pg_checksums.c:609 +#: pg_checksums.c:606 #, c-format msgid "Checksum operation completed\n" msgstr "Opération sur les sommes de contrôle terminée\n" -#: pg_checksums.c:610 +#: pg_checksums.c:607 #, c-format msgid "Files scanned: %lld\n" msgstr "Fichiers parcourus : %lld\n" -#: pg_checksums.c:611 +#: pg_checksums.c:608 #, c-format msgid "Blocks scanned: %lld\n" msgstr "Blocs parcourus : %lld\n" -#: pg_checksums.c:614 +#: pg_checksums.c:611 #, c-format msgid "Bad checksums: %lld\n" msgstr "Mauvaises sommes de contrôle : %lld\n" -#: pg_checksums.c:615 pg_checksums.c:647 +#: pg_checksums.c:612 pg_checksums.c:644 #, c-format msgid "Data checksum version: %u\n" msgstr "Version des sommes de contrôle sur les données : %u\n" -#: pg_checksums.c:622 +#: pg_checksums.c:619 #, c-format msgid "Files written: %lld\n" msgstr "Fichiers écrits : %lld\n" -#: pg_checksums.c:623 +#: pg_checksums.c:620 #, c-format msgid "Blocks written: %lld\n" msgstr "Blocs écrits : %lld\n" -#: pg_checksums.c:639 +#: pg_checksums.c:636 #, c-format msgid "syncing data directory" msgstr "synchronisation du répertoire des données" -#: pg_checksums.c:643 +#: pg_checksums.c:640 #, c-format msgid "updating control file" msgstr "mise à jour du fichier de contrôle" -#: pg_checksums.c:649 +#: pg_checksums.c:646 #, c-format msgid "Checksums enabled in cluster\n" msgstr "Sommes de contrôle sur les données activées sur cette instance\n" -#: pg_checksums.c:651 +#: pg_checksums.c:648 #, c-format msgid "Checksums disabled in cluster\n" msgstr "Sommes de contrôle sur les données désactivées sur cette instance\n" - -#~ msgid " -?, --help show this help, then exit\n" -#~ msgstr " -?, --help affiche cette aide puis quitte\n" - -#~ msgid " -V, --version output version information, then exit\n" -#~ msgstr " -V, --version affiche la version puis quitte\n" - -#~ msgid "%s: could not open directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" - -#~ msgid "%s: could not open file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" - -#~ msgid "%s: could not stat file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n" - -#~ msgid "%s: no data directory specified\n" -#~ msgstr "%s : aucun répertoire de données indiqué\n" - -#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" -#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" - -#~ msgid "Report bugs to .\n" -#~ msgstr "Rapporter les bogues à .\n" - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatal : " - -#, c-format -#~ msgid "invalid filenode specification, must be numeric: %s" -#~ msgstr "spécification invalide du relfilnode, doit être numérique : %s" diff --git a/src/bin/pg_checksums/po/it.po b/src/bin/pg_checksums/po/it.po index 9e37af3784af1..359c084334864 100644 --- a/src/bin/pg_checksums/po/it.po +++ b/src/bin/pg_checksums/po/it.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pg_checksums (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-09-26 08:21+0000\n" -"PO-Revision-Date: 2022-09-29 20:10+0200\n" +"PO-Revision-Date: 2023-09-05 08:10+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: it\n" @@ -76,42 +76,42 @@ msgstr "" #: pg_checksums.c:83 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]DATADIR directory dei dati\n" +msgstr " [-D, --pgdata=]DATADIR directory dei dati\n" #: pg_checksums.c:84 #, c-format msgid " -c, --check check data checksums (default)\n" -msgstr " -c, --check controlla i checksum dei dati (predefinito)\n" +msgstr " -c, --check controlla i checksum dei dati (predefinito)\n" #: pg_checksums.c:85 #, c-format msgid " -d, --disable disable data checksums\n" -msgstr " -d, --disable disabilita i checksum dei dati\n" +msgstr " -d, --disable disabilita i checksum dei dati\n" #: pg_checksums.c:86 #, c-format msgid " -e, --enable enable data checksums\n" -msgstr " -e, --enable abilita i checksum dei dati\n" +msgstr " -e, --enable abilita i checksum dei dati\n" #: pg_checksums.c:87 #, c-format msgid " -f, --filenode=FILENODE check only relation with specified filenode\n" -msgstr " -f, --filenode=FILENODE controlla solo la relazione con il filenode specificato\n" +msgstr " -f, --filenode=FILENODE controlla solo la relazione con il filenode specificato\n" #: pg_checksums.c:88 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" -msgstr " -N, --no-sync non attende che le modifiche vengano scritte in modo sicuro sul disco\n" +msgstr " -N, --no-sync non attende che le modifiche vengano scritte in modo sicuro sul disco\n" #: pg_checksums.c:89 #, c-format msgid " -P, --progress show progress information\n" -msgstr " -P, --progress mostra le informazioni sullo stato di avanzamento\n" +msgstr " -P, --progress mostra le informazioni sullo stato di avanzamento\n" #: pg_checksums.c:90 #, c-format msgid " -v, --verbose output verbose messages\n" -msgstr " -v, --verbose genera messaggi dettagliati\n" +msgstr " -v, --verbose genera messaggi dettagliati\n" #: pg_checksums.c:91 #, c-format diff --git a/src/bin/pg_checksums/po/ja.po b/src/bin/pg_checksums/po/ja.po index aacabdea6fce8..f4d3da0256ed6 100644 --- a/src/bin/pg_checksums/po/ja.po +++ b/src/bin/pg_checksums/po/ja.po @@ -1,13 +1,13 @@ # Japanese message translation file for pg_checksums -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: pg_checksums (PostgreSQL 15)\n" +"Project-Id-Version: pg_checksums (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-09 12:00+0900\n" -"PO-Revision-Date: 2022-05-10 13:45+0900\n" +"POT-Creation-Date: 2023-09-07 09:23+0900\n" +"PO-Revision-Date: 2023-09-07 10:23+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -15,6 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.13\n" +"Plural-Forms: nplurals=1; plural=0;\n" #: ../../../src/common/logging.c:276 #, c-format @@ -46,7 +47,17 @@ msgstr "オプション%sã®ä¸æ­£ãªå€¤\"%s\"" msgid "%s must be in range %d..%d" msgstr "%sã¯%d..%dã®ç¯„囲ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_checksums.c:79 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ã“ã®ãƒ“ルドã§ã¯åŒæœŸæ–¹å¼\"%s\"をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "èªè­˜ã§ããªã„åŒæœŸæ–¹å¼: %s" + +#: pg_checksums.c:70 #, c-format msgid "" "%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n" @@ -55,17 +66,17 @@ msgstr "" "%sã¯PostgreSQLデータベースクラスタã«ãŠã‘るデータãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®æœ‰åŠ¹åŒ–ã€ç„¡åŠ¹åŒ–ãŠã‚ˆã³æ¤œè¨¼ã‚’行ã„ã¾ã™ã€‚\n" "\n" -#: pg_checksums.c:80 +#: pg_checksums.c:71 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_checksums.c:81 +#: pg_checksums.c:72 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATADIR]\n" -#: pg_checksums.c:82 +#: pg_checksums.c:73 #, c-format msgid "" "\n" @@ -74,57 +85,62 @@ msgstr "" "\n" "オプション:\n" -#: pg_checksums.c:83 +#: pg_checksums.c:74 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]DATADIR データディレクトリ\n" -#: pg_checksums.c:84 +#: pg_checksums.c:75 #, c-format msgid " -c, --check check data checksums (default)\n" msgstr " -c, --check データãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’検証(デフォルト)\n" -#: pg_checksums.c:85 +#: pg_checksums.c:76 #, c-format msgid " -d, --disable disable data checksums\n" msgstr " -d, --disable データãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’無効化\n" -#: pg_checksums.c:86 +#: pg_checksums.c:77 #, c-format msgid " -e, --enable enable data checksums\n" msgstr " -e, --enable データãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’有効化\n" -#: pg_checksums.c:87 +#: pg_checksums.c:78 #, c-format msgid " -f, --filenode=FILENODE check only relation with specified filenode\n" msgstr " -f, --filenode=FILENODE 指定ã—ãŸãƒ•ァイルノードã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ã¿æ¤œè¨¼\n" -#: pg_checksums.c:88 +#: pg_checksums.c:79 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync ディスクã¸ã®å®‰å…¨ãªæ›¸ãè¾¼ã¿ã‚’待機ã—ãªã„\n" -#: pg_checksums.c:89 +#: pg_checksums.c:80 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress 進行状æ³ã‚’表示\n" -#: pg_checksums.c:90 +#: pg_checksums.c:81 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD ファイルをディスクã«åŒæœŸã•ã›ã‚‹æ–¹æ³•を指定\n" + +#: pg_checksums.c:82 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose 冗長メッセージを出力\n" -#: pg_checksums.c:91 +#: pg_checksums.c:83 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: pg_checksums.c:92 +#: pg_checksums.c:84 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: pg_checksums.c:93 +#: pg_checksums.c:85 #, c-format msgid "" "\n" @@ -136,204 +152,192 @@ msgstr "" "データディレクトリ(DATADIR)ãŒæŒ‡å®šã•れãªã„å ´åˆã€PGDATA環境変数ãŒä½¿ç”¨ã•れã¾ã™ã€‚\n" "\n" -#: pg_checksums.c:95 +#: pg_checksums.c:87 #, c-format msgid "Report bugs to <%s>.\n" msgstr "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: pg_checksums.c:96 +#: pg_checksums.c:88 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_checksums.c:153 +#: pg_checksums.c:145 #, c-format msgid "%lld/%lld MB (%d%%) computed" msgstr "%lld/%lld MB (%d%%) 完了" -#: pg_checksums.c:200 +#: pg_checksums.c:192 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_checksums.c:214 +#: pg_checksums.c:206 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "ファイル\"%2$s\"ã§%1$uブロックを読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %3$m" -#: pg_checksums.c:217 +#: pg_checksums.c:209 #, c-format msgid "could not read block %u in file \"%s\": read %d of %d" msgstr " ファイル\"%2$s\"ã®ãƒ–ロック%1$uãŒèª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %4$d中%3$d読ã¿è¾¼ã¿æ¸ˆã¿" -#: pg_checksums.c:240 +#: pg_checksums.c:232 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X" msgstr "ファイル\"%s\" ブロック%uã§ãƒã‚§ãƒƒã‚¯ã‚µãƒ æ¤œè¨¼ãŒå¤±æ•—: 算出ã—ãŸãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯%X ã€ã—ã‹ã—ブロック上ã®å€¤ã¯%X" -#: pg_checksums.c:263 +#: pg_checksums.c:255 #, c-format msgid "seek failed for block %u in file \"%s\": %m" msgstr "ファイル\"%2$s\" ブロック%1$uã¸ã®ã‚·ãƒ¼ã‚¯å¤±æ•—: %3$m" -#: pg_checksums.c:270 +#: pg_checksums.c:262 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "ファイル\"%2$s\"ã§%1$uãƒ–ãƒ­ãƒƒã‚¯ãŒæ›¸ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %3$m" -#: pg_checksums.c:273 +#: pg_checksums.c:265 #, c-format msgid "could not write block %u in file \"%s\": wrote %d of %d" msgstr "ファイル\"%2$s\"ã®ãƒ–ロック%1$uã®æ›¸ãè¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ: %4$dãƒã‚¤ãƒˆä¸­%3$dãƒã‚¤ãƒˆã®ã¿æ›¸ãè¾¼ã¿ã¾ã—ãŸ" -#: pg_checksums.c:285 +#: pg_checksums.c:277 #, c-format msgid "checksums verified in file \"%s\"" msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯æ¤œè¨¼ã•れã¾ã—ãŸ" -#: pg_checksums.c:287 +#: pg_checksums.c:279 #, c-format msgid "checksums enabled in file \"%s\"" msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯æœ‰åŠ¹åŒ–ã•れã¾ã—ãŸ" -#: pg_checksums.c:318 +#: pg_checksums.c:310 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_checksums.c:342 pg_checksums.c:415 +#: pg_checksums.c:334 pg_checksums.c:403 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: pg_checksums.c:366 +#: pg_checksums.c:358 #, c-format msgid "invalid segment number %d in file name \"%s\"" msgstr "ファイルå\"%2$s\"ã®ä¸æ­£ãªã‚»ã‚°ãƒ¡ãƒ³ãƒˆç•ªå·%1$d" -#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546 +#: pg_checksums.c:505 pg_checksums.c:521 pg_checksums.c:531 pg_checksums.c:539 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細ã«ã¤ã„ã¦ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" -#: pg_checksums.c:527 +#: pg_checksums.c:520 #, c-format msgid "no data directory specified" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: pg_checksums.c:536 +#: pg_checksums.c:529 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ (最åˆã¯\"%s\")" -#: pg_checksums.c:545 +#: pg_checksums.c:538 #, c-format msgid "option -f/--filenode can only be used with --check" msgstr "オプション-f/--filenodeã¯--checkを指定ã—ãŸã¨ãã®ã¿æŒ‡å®šå¯èƒ½" -#: pg_checksums.c:553 +#: pg_checksums.c:546 #, c-format msgid "pg_control CRC value is incorrect" msgstr "pg_controlã®CRCå€¤ãŒæ­£ã—ãã‚りã¾ã›ã‚“" -#: pg_checksums.c:556 +#: pg_checksums.c:549 #, c-format msgid "cluster is not compatible with this version of pg_checksums" msgstr "クラスタã¯ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®pg_checksumsã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: pg_checksums.c:560 +#: pg_checksums.c:553 #, c-format msgid "database cluster is not compatible" msgstr "データベースクラスタãŒéžäº’æ›ã§ã™" -#: pg_checksums.c:561 +#: pg_checksums.c:554 #, c-format msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u." msgstr "データベースクラスタã¯ãƒ–ロックサイズ%uã§åˆæœŸåŒ–ã•れã¦ã„ã¾ã™ã€ã—ã‹ã—pg_checksumsã¯ãƒ–ロックサイズ%uã§ã‚³ãƒ³ãƒ‘イルã•れã¦ã„ã¾ã™ã€‚" -#: pg_checksums.c:573 +#: pg_checksums.c:566 #, c-format msgid "cluster must be shut down" msgstr "クラスタã¯ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•れã¦ã„ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_checksums.c:577 +#: pg_checksums.c:570 #, c-format msgid "data checksums are not enabled in cluster" msgstr "クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯æœ‰åйã«ãªã£ã¦ã„ã¾ã›ã‚“" -#: pg_checksums.c:581 +#: pg_checksums.c:574 #, c-format msgid "data checksums are already disabled in cluster" msgstr "クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯ã™ã§ã«ç„¡åйã«ãªã£ã¦ã„ã¾ã™" -#: pg_checksums.c:585 +#: pg_checksums.c:578 #, c-format msgid "data checksums are already enabled in cluster" msgstr "クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã¯ã™ã§ã«æœ‰åйã«ãªã£ã¦ã„ã¾ã™" -#: pg_checksums.c:609 +#: pg_checksums.c:602 #, c-format msgid "Checksum operation completed\n" msgstr "ãƒã‚§ãƒƒã‚¯ã‚µãƒ æ“作ãŒå®Œäº†ã—ã¾ã—ãŸ\n" -#: pg_checksums.c:610 +#: pg_checksums.c:603 #, c-format msgid "Files scanned: %lld\n" msgstr "スキャンã—ãŸãƒ•ァイル数: %lld\n" -#: pg_checksums.c:611 +#: pg_checksums.c:604 #, c-format msgid "Blocks scanned: %lld\n" msgstr "スキャンã—ãŸãƒ–ロック数: %lld\n" -#: pg_checksums.c:614 +#: pg_checksums.c:607 #, c-format msgid "Bad checksums: %lld\n" msgstr "䏿­£ãªãƒã‚§ãƒƒã‚¯ã‚µãƒ æ•°: %lld\n" -#: pg_checksums.c:615 pg_checksums.c:647 +#: pg_checksums.c:608 pg_checksums.c:640 #, c-format msgid "Data checksum version: %u\n" msgstr "データãƒã‚§ãƒƒã‚¯ã‚µãƒ ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %u\n" -#: pg_checksums.c:622 +#: pg_checksums.c:615 #, c-format msgid "Files written: %lld\n" msgstr "スキャンã—ãŸãƒ•ァイル数: %lld\n" -#: pg_checksums.c:623 +#: pg_checksums.c:616 #, c-format msgid "Blocks written: %lld\n" msgstr "スキャンã—ãŸãƒ–ロック数: %lld\n" -#: pg_checksums.c:639 +#: pg_checksums.c:632 #, c-format msgid "syncing data directory" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åŒæœŸã—ã¦ã„ã¾ã™" -#: pg_checksums.c:643 +#: pg_checksums.c:636 #, c-format msgid "updating control file" msgstr "コントロールファイルを更新ã—ã¦ã„ã¾ã™" -#: pg_checksums.c:649 +#: pg_checksums.c:642 #, c-format msgid "Checksums enabled in cluster\n" msgstr "クラスタã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒæœ‰åŠ¹åŒ–ã•れã¾ã—ãŸ\n" -#: pg_checksums.c:651 +#: pg_checksums.c:644 #, c-format msgid "Checksums disabled in cluster\n" msgstr "クラスタã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒç„¡åŠ¹åŒ–ã•れã¾ã—ãŸ\n" - -#~ msgid "fatal: " -#~ msgstr "致命的エラー: " - -#~ msgid "invalid filenode specification, must be numeric: %s" -#~ msgstr "䏿­£ãªãƒ•ã‚¡ã‚¤ãƒ«ãƒŽãƒ¼ãƒ‰æŒ‡å®šã€æ•°å€¤ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™: %s" - -#~ msgid "could not update checksum of block %u in file \"%s\": %m" -#~ msgstr "ファイル\"%2$s\" ブロック%1$uã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ æ›´æ–°å¤±æ•—: %3$m" - -#~ msgid "Report bugs to .\n" -#~ msgstr "ãƒã‚°ã¯ ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" diff --git a/src/bin/pg_checksums/po/ka.po b/src/bin/pg_checksums/po/ka.po index d202cd767c7d4..0f5afb95f2904 100644 --- a/src/bin/pg_checksums/po/ka.po +++ b/src/bin/pg_checksums/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_checksums (PostgreSQL) 15\n" +"Project-Id-Version: pg_checksums (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-02 04:51+0000\n" -"PO-Revision-Date: 2022-07-04 17:50+0200\n" +"POT-Creation-Date: 2024-07-01 03:54+0000\n" +"PO-Revision-Date: 2024-02-11 14:43+0100\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.1\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -38,6 +38,104 @@ msgstr "დეტáƒáƒšáƒ”ბი: " msgid "hint: " msgstr "მინიშნებáƒ: " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:110 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\"-ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %zu-დáƒáƒœ" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რáƒáƒ  ემთხვევáƒ" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘ის შესáƒáƒ«áƒšáƒ შეუსáƒáƒ‘áƒáƒ›áƒáƒ‘რpg_control ფáƒáƒ˜áƒšáƒ˜áƒ¡ შესáƒáƒœáƒáƒ®áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული \n" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რშესáƒáƒ«áƒšáƒáƒ áƒáƒ  ემთხვეáƒáƒ“ეს áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ მიერ გáƒáƒ›áƒáƒ§áƒ”ნებულს. áƒáƒ› შემთხვევáƒáƒ¨áƒ˜ ქვემáƒáƒ— \n" +"მáƒáƒªáƒ”მული შედეგები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იქნებრდრPostgreSQL ეს áƒáƒ’ებრáƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ შეუთáƒáƒ•სებელი იქნებáƒ." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_checksums.c:192 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_checksums.c:338 pg_checksums.c:407 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_checksums.c:310 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" + #: ../../fe_utils/option_utils.c:69 #, c-format msgid "invalid value \"%s\" for option %s" @@ -48,28 +146,31 @@ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პრmsgid "%s must be in range %d..%d" msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე" -#: pg_checksums.c:79 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "უცნáƒáƒ‘ი სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი: %s" + +#: pg_checksums.c:70 #, c-format msgid "" -"%s enables, disables, or verifies data checksums in a PostgreSQL database " -"cluster.\n" +"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n" "\n" msgstr "" -"%s ჩáƒáƒ áƒ—áƒáƒ•ს, გáƒáƒ›áƒáƒ áƒ—áƒáƒ•ს დრშეáƒáƒ›áƒáƒ¬áƒ›áƒ”ბს მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბს " -"PostgreSQL მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რში.\n" +"%s ჩáƒáƒ áƒ—áƒáƒ•ს, გáƒáƒ›áƒáƒ áƒ—áƒáƒ•ს დრშეáƒáƒ›áƒáƒ¬áƒ›áƒ”ბს მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბს PostgreSQL მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რში.\n" "\n" -#: pg_checksums.c:80 +#: pg_checksums.c:71 #, c-format msgid "Usage:\n" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" -#: pg_checksums.c:81 +#: pg_checksums.c:72 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე]\n" -#: pg_checksums.c:82 +#: pg_checksums.c:73 #, c-format msgid "" "\n" @@ -78,71 +179,66 @@ msgstr "" "\n" "პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_checksums.c:83 +#: pg_checksums.c:74 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]DATADIR მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: pg_checksums.c:84 +#: pg_checksums.c:75 #, c-format msgid " -c, --check check data checksums (default)\n" -msgstr "" -" -c, --check მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ " -"შემáƒáƒ¬áƒ›áƒ”ბáƒ(ნáƒáƒ’ულისხმები)\n" +msgstr " -c, --check მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბáƒ(ნáƒáƒ’ულისხმები)\n" -#: pg_checksums.c:85 +#: pg_checksums.c:76 #, c-format msgid " -d, --disable disable data checksums\n" msgstr " -d, --disable მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბის გáƒáƒ›áƒáƒ áƒ—ვáƒ\n" -#: pg_checksums.c:86 +#: pg_checksums.c:77 #, c-format msgid " -e, --enable enable data checksums\n" msgstr " -e, --enable მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბის ჩáƒáƒ áƒ—ვáƒ\n" -#: pg_checksums.c:87 +#: pg_checksums.c:78 #, c-format -msgid "" -" -f, --filenode=FILENODE check only relation with specified filenode\n" -msgstr "" -" -f, --filenode=ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ™áƒ•áƒáƒœáƒ«áƒ˜ მხáƒáƒšáƒáƒ“ მითითებულ ფáƒáƒ˜áƒšáƒ˜áƒ¡ კვáƒáƒœáƒ«áƒ—áƒáƒœ ურთიერთáƒáƒ‘ის " -"შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" +msgid " -f, --filenode=FILENODE check only relation with specified filenode\n" +msgstr " -f, --filenode=ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ™áƒ•áƒáƒœáƒ«áƒ˜ მხáƒáƒšáƒáƒ“ მითითებულ ფáƒáƒ˜áƒšáƒ˜áƒ¡ კვáƒáƒœáƒ«áƒ—áƒáƒœ ურთიერთáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბáƒ\n" -#: pg_checksums.c:88 +#: pg_checksums.c:79 #, c-format -msgid "" -" -N, --no-sync do not wait for changes to be written safely to " -"disk\n" -msgstr "" -" -N, --no-sync áƒáƒ  დáƒáƒ•ელáƒáƒ“რცვლილებების დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ " -"ჩáƒáƒ¬áƒ”რáƒáƒ¡\n" +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr " -N, --no-sync áƒáƒ  დáƒáƒ•ელáƒáƒ“რცვლილებების დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡\n" -#: pg_checksums.c:89 +#: pg_checksums.c:80 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress მიმდინáƒáƒ áƒ”áƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებáƒ\n" -#: pg_checksums.c:90 +#: pg_checksums.c:81 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=მეთáƒáƒ“ი ფáƒáƒ˜áƒšáƒ”ბის დისკზე სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის დáƒáƒ§áƒ”ნებáƒ\n" + +#: pg_checksums.c:82 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: pg_checksums.c:91 +#: pg_checksums.c:83 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_checksums.c:92 +#: pg_checksums.c:84 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_checksums.c:93 +#: pg_checksums.c:85 #, c-format msgid "" "\n" -"If no data directory (DATADIR) is specified, the environment variable " -"PGDATA\n" +"If no data directory (DATADIR) is specified, the environment variable PGDATA\n" "is used.\n" "\n" msgstr "" @@ -150,202 +246,177 @@ msgstr "" "თუ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ, გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრ\n" "გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი PGDATA.\n" -#: pg_checksums.c:95 +#: pg_checksums.c:87 #, c-format msgid "Report bugs to <%s>.\n" msgstr "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: <%s>\n" -#: pg_checksums.c:96 +#: pg_checksums.c:88 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" -#: pg_checksums.c:153 +#: pg_checksums.c:145 #, c-format msgid "%lld/%lld MB (%d%%) computed" msgstr "%lld/%lld მბ (%d%%) გáƒáƒ›áƒáƒ—ვლილიáƒ" -#: pg_checksums.c:200 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" - -#: pg_checksums.c:214 +#: pg_checksums.c:206 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "ბლáƒáƒ™áƒ˜áƒ¡ %u წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": %m" -#: pg_checksums.c:217 +#: pg_checksums.c:209 #, c-format msgid "could not read block %u in file \"%s\": read %d of %d" msgstr "ბლáƒáƒ™áƒ˜áƒ¡ %u წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": წáƒáƒ™áƒ˜áƒ—ხულირ%d %d-დáƒáƒœ" -#: pg_checksums.c:240 +#: pg_checksums.c:232 #, c-format -msgid "" -"checksum verification failed in file \"%s\", block %u: calculated checksum " -"%X but block contains %X" -msgstr "" -"სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ—ვლის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\", ბლáƒáƒ™áƒ˜ \"%u\": გáƒáƒ›áƒáƒ—ვლილი " -"სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ კáƒáƒ›áƒ˜áƒ %X, მáƒáƒ’რáƒáƒ› ბლáƒáƒ™áƒ˜ შეიცáƒáƒ•ს: %X" +msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ—ვლის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\", ბლáƒáƒ™áƒ˜ \"%u\": გáƒáƒ›áƒáƒ—ვლილი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ კáƒáƒ›áƒ˜áƒ %X, მáƒáƒ’რáƒáƒ› ბლáƒáƒ™áƒ˜ შეიცáƒáƒ•ს: %X" -#: pg_checksums.c:263 +#: pg_checksums.c:255 #, c-format msgid "seek failed for block %u in file \"%s\": %m" msgstr "გáƒáƒ“áƒáƒ®áƒ•ევის შეცდáƒáƒ›áƒ ბლáƒáƒ™áƒ˜áƒ¡áƒ—ვის %u ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": %m" -#: pg_checksums.c:270 +#: pg_checksums.c:262 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "ბლáƒáƒ™áƒ˜áƒ¡ %u ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": %m" -#: pg_checksums.c:273 +#: pg_checksums.c:265 #, c-format msgid "could not write block %u in file \"%s\": wrote %d of %d" msgstr "ბლáƒáƒ™áƒ˜áƒ¡ %u ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": ჩáƒáƒ¬áƒ”რილირ%d %d-დáƒáƒœ" -#: pg_checksums.c:285 +#: pg_checksums.c:277 #, c-format msgid "checksums verified in file \"%s\"" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი შემáƒáƒ¬áƒ›áƒ”ბულირფáƒáƒ˜áƒšáƒ¨áƒ˜: \"%s\"" -#: pg_checksums.c:287 +#: pg_checksums.c:279 #, c-format msgid "checksums enabled in file \"%s\"" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი ჩáƒáƒ áƒ—ულირფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ: \"%s\"" -#: pg_checksums.c:318 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" - -#: pg_checksums.c:342 pg_checksums.c:415 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" - -#: pg_checksums.c:366 +#: pg_checksums.c:362 #, c-format msgid "invalid segment number %d in file name \"%s\"" msgstr "სეგმენტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი %d ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლში \"%s\"" -#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546 +#: pg_checksums.c:509 pg_checksums.c:525 pg_checksums.c:535 pg_checksums.c:543 #, c-format msgid "Try \"%s --help\" for more information." msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." -#: pg_checksums.c:527 +#: pg_checksums.c:524 #, c-format msgid "no data directory specified" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ" -#: pg_checksums.c:536 +#: pg_checksums.c:533 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")" -#: pg_checksums.c:545 +#: pg_checksums.c:542 #, c-format msgid "option -f/--filenode can only be used with --check" -msgstr "" -"პáƒáƒ áƒáƒ›áƒ”ტრი -f/--filenode მხáƒáƒšáƒáƒ“ --check -თáƒáƒœ ერთáƒáƒ“ შეიძლებრიქნáƒáƒ¡ " -"გáƒáƒ›áƒáƒ§áƒ”ნებული" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი -f/--filenode მხáƒáƒšáƒáƒ“ --check -თáƒáƒœ ერთáƒáƒ“ შეიძლებრიქნáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული" -#: pg_checksums.c:553 +#: pg_checksums.c:550 #, c-format msgid "pg_control CRC value is incorrect" msgstr "pg_control CRC მნიშვნელáƒáƒ‘რáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" -#: pg_checksums.c:556 +#: pg_checksums.c:553 #, c-format msgid "cluster is not compatible with this version of pg_checksums" msgstr "კლáƒáƒ¡áƒ¢áƒ”რი შეუთáƒáƒ•სებელირpg_checksums-ის áƒáƒ› ვერსიáƒáƒ¡áƒ—áƒáƒœ" -#: pg_checksums.c:560 +#: pg_checksums.c:557 #, c-format msgid "database cluster is not compatible" msgstr "ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რი შეუთáƒáƒ•სებელიáƒ" -#: pg_checksums.c:561 +#: pg_checksums.c:558 #, c-format -msgid "" -"The database cluster was initialized with block size %u, but pg_checksums " -"was compiled with block size %u." -msgstr "" -"ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ— %u მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ " -"pg_checksums áƒáƒ’ებულირბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ—: %u." +msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u." +msgstr "ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ მáƒáƒ®áƒ“რბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ— %u მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ pg_checksums áƒáƒ’ებულირბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ—: %u." -#: pg_checksums.c:573 +#: pg_checksums.c:570 #, c-format msgid "cluster must be shut down" msgstr "კლáƒáƒ¡áƒ¢áƒ”რი უნდრგáƒáƒ›áƒáƒ˜áƒ áƒ—áƒáƒ¡" -#: pg_checksums.c:577 +#: pg_checksums.c:574 #, c-format msgid "data checksums are not enabled in cluster" msgstr "კლáƒáƒ¡áƒ¢áƒ”რში მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი ჩáƒáƒ áƒ—ული áƒáƒ áƒáƒ" -#: pg_checksums.c:581 +#: pg_checksums.c:578 #, c-format msgid "data checksums are already disabled in cluster" msgstr "კლáƒáƒ¡áƒ¢áƒ”რში მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი უკვე გáƒáƒ›áƒáƒ áƒ—ულიáƒ" -#: pg_checksums.c:585 +#: pg_checksums.c:582 #, c-format msgid "data checksums are already enabled in cluster" msgstr "კლáƒáƒ¡áƒ¢áƒ”რში მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი უკვე ჩáƒáƒ áƒ—ულიáƒ" -#: pg_checksums.c:609 +#: pg_checksums.c:606 #, c-format msgid "Checksum operation completed\n" msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბის áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ\n" -#: pg_checksums.c:610 +#: pg_checksums.c:607 #, c-format msgid "Files scanned: %lld\n" msgstr "დáƒáƒ¡áƒ™áƒáƒœáƒ”რებულირფáƒáƒ˜áƒšáƒ”ბი: %lld\n" -#: pg_checksums.c:611 +#: pg_checksums.c:608 #, c-format msgid "Blocks scanned: %lld\n" msgstr "დáƒáƒ¡áƒ™áƒáƒ áƒ”რებული ბლáƒáƒ™áƒ”ბი: %lld\n" -#: pg_checksums.c:614 +#: pg_checksums.c:611 #, c-format msgid "Bad checksums: %lld\n" msgstr "ცუდი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი: %lld\n" -#: pg_checksums.c:615 pg_checksums.c:647 +#: pg_checksums.c:612 pg_checksums.c:644 #, c-format msgid "Data checksum version: %u\n" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ვერსიáƒ: %u\n" -#: pg_checksums.c:622 +#: pg_checksums.c:619 #, c-format msgid "Files written: %lld\n" msgstr "ჩáƒáƒ¬áƒ”რილი ფáƒáƒ˜áƒšáƒ”ბი: %lld\n" -#: pg_checksums.c:623 +#: pg_checksums.c:620 #, c-format msgid "Blocks written: %lld\n" msgstr "ჩáƒáƒ¬áƒ”რილი ბლáƒáƒ™áƒ”ბი: %lld\n" -#: pg_checksums.c:639 +#: pg_checksums.c:636 #, c-format msgid "syncing data directory" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ" -#: pg_checksums.c:643 +#: pg_checksums.c:640 #, c-format msgid "updating control file" msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ¢áƒ•ირთვáƒ" -#: pg_checksums.c:649 +#: pg_checksums.c:646 #, c-format msgid "Checksums enabled in cluster\n" msgstr "კლáƒáƒ¡áƒ¢áƒ”რში მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი ჩáƒáƒ áƒ—ულიáƒ\n" -#: pg_checksums.c:651 +#: pg_checksums.c:648 #, c-format msgid "Checksums disabled in cluster\n" msgstr "კლáƒáƒ¡áƒ¢áƒ”რში სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი გáƒáƒ›áƒáƒ áƒ—ულიáƒ\n" diff --git a/src/bin/pg_checksums/po/ko.po b/src/bin/pg_checksums/po/ko.po index ff767cfc7df3d..f8c71ae2ead3a 100644 --- a/src/bin/pg_checksums/po/ko.po +++ b/src/bin/pg_checksums/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_checksums (PostgreSQL) 13\n" +"Project-Id-Version: pg_checksums (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 20:47+0000\n" -"PO-Revision-Date: 2020-10-06 11:13+0900\n" +"POT-Creation-Date: 2025-01-17 04:54+0000\n" +"PO-Revision-Date: 2025-01-16 15:23+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: PostgreSQL Korea \n" "Language: ko\n" @@ -16,22 +16,143 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "심ê°: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " -#: pg_checksums.c:75 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ì½ê¸°ìš© \"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:110 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d / %zu ë°”ì´íŠ¸ë§Œ ì½ìŒ" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ë°”ì´íЏ 순서 ì¼ì¹˜í•˜ì§€ 않ìŒ" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, " +"and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ë°”ì´íЏ 순서 ì¼ì¹˜í•˜ì§€ 않는 문제\n" +"ë°”ì´íЏ 순서 정보는 pg_control 파ì¼ì„ 저장할 때 사용ë˜ëŠ”ë°,\n" +"ì´ íŒŒì¼ì˜ ë°”ì´íЏ 순서 정보와 ì´ í”„ë¡œê·¸ëž¨ì—서 사용하는 순서 ì •ë³´ê°€ 다릅니다.\n" +"ì´ëŸ´ 경우, 출력 결과가 바르지 ì•Šì„ ìˆ˜ 있고,\n" +"ì„¤ì¹˜ëœ PostgreSQL 프로그램과 ë°ì´í„° 디렉터리가 호환ë˜ì§€ ì•Šì„ ìˆ˜ 있습니다." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_checksums.c:192 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 쓸 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ fsync í•  수 ì—†ìŒ: %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "메모리 부족\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ë„ í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 위해 íŒŒì¼ ì‹œìŠ¤í…œ ë™ê¸°í™”를 í•  수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_checksums.c:338 pg_checksums.c:407 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ì´ ë¹Œë“œëŠ” \"%s\" ë™ê¸°í™” ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_checksums.c:310 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "\"%s\" ê°’ì€ \"%s\" 옵션값으로 유효하지 않ìŒ" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s ê°’ì€ %d부터 %d까지 지정할 수 있습니다." + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "알 수 없는 ë™ê¸°í™” 방법: %s" + +#: pg_checksums.c:70 #, c-format msgid "" "%s enables, disables, or verifies data checksums in a PostgreSQL database " @@ -42,17 +163,17 @@ msgstr "" "비활성화 ë˜ëŠ” 유효성 검사를 합니다.\n" "\n" -#: pg_checksums.c:76 +#: pg_checksums.c:71 #, c-format msgid "Usage:\n" msgstr "사용법:\n" -#: pg_checksums.c:77 +#: pg_checksums.c:72 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [옵션]... [DATADIR]\n" -#: pg_checksums.c:78 +#: pg_checksums.c:73 #, c-format msgid "" "\n" @@ -61,33 +182,33 @@ msgstr "" "\n" "옵션들:\n" -#: pg_checksums.c:79 +#: pg_checksums.c:74 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]DATADIR ë°ì´í„° 디렉터리\n" -#: pg_checksums.c:80 +#: pg_checksums.c:75 #, c-format msgid " -c, --check check data checksums (default)\n" msgstr " -c, --check 실 작업 ì—†ì´, 그냥 검사만 (기본값)\n" -#: pg_checksums.c:81 +#: pg_checksums.c:76 #, c-format msgid " -d, --disable disable data checksums\n" msgstr " -d, --disable ìžë£Œ 페ì´ì§€ ì²´í¬ì„¬ 비활성화\n" -#: pg_checksums.c:82 +#: pg_checksums.c:77 #, c-format msgid " -e, --enable enable data checksums\n" msgstr " -e, --enable ìžë£Œ 페ì´ì§€ ì²´í¬ì„¬ 활성화\n" -#: pg_checksums.c:83 +#: pg_checksums.c:78 #, c-format msgid "" " -f, --filenode=FILENODE check only relation with specified filenode\n" msgstr " -f, --filenode=FILENODE 지정한 파ì¼ë…¸ë“œë§Œ 검사\n" -#: pg_checksums.c:84 +#: pg_checksums.c:79 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written safely to " @@ -95,27 +216,32 @@ msgid "" msgstr "" " -N, --no-sync 작업 완료 ë’¤ ë””ìŠ¤í¬ ë™ê¸°í™” ìž‘ì—…ì„ í•˜ì§€ 않ìŒ\n" -#: pg_checksums.c:85 +#: pg_checksums.c:80 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress ì§„í–‰ 과정 보여줌\n" -#: pg_checksums.c:86 +#: pg_checksums.c:81 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD 파ì¼ì„ 디스í¬ì— ë™ê¸°í™” 하는 방법 지정\n" + +#: pg_checksums.c:82 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose ìžì„¸í•œ 작업 메시지 보여줌\n" -#: pg_checksums.c:87 +#: pg_checksums.c:83 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: pg_checksums.c:88 +#: pg_checksums.c:84 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: pg_checksums.c:89 +#: pg_checksums.c:85 #, c-format msgid "" "\n" @@ -129,37 +255,32 @@ msgstr "" "사용합니다.\n" "\n" -#: pg_checksums.c:91 +#: pg_checksums.c:87 #, c-format msgid "Report bugs to <%s>.\n" msgstr "ë¬¸ì œì  ë³´ê³  주소: <%s>\n" -#: pg_checksums.c:92 +#: pg_checksums.c:88 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페ì´ì§€: <%s>\n" -#: pg_checksums.c:161 +#: pg_checksums.c:145 #, c-format -msgid "%*s/%s MB (%d%%) computed" -msgstr "%*s/%s MB (%d%%) 계산ë¨" +msgid "%lld/%lld MB (%d%%) computed" +msgstr "%lld/%lld MB (%d%%) 계산ë¨" -#: pg_checksums.c:207 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" - -#: pg_checksums.c:223 +#: pg_checksums.c:206 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì—서 ì½ì„ 수 ì—†ìŒ: %m" -#: pg_checksums.c:226 +#: pg_checksums.c:209 #, c-format msgid "could not read block %u in file \"%s\": read %d of %d" msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì—서 ì½ì„ 수 ì—†ìŒ: %d / %d ë°”ì´íŠ¸ë§Œ ì½ìŒ" -#: pg_checksums.c:243 +#: pg_checksums.c:232 #, c-format msgid "" "checksum verification failed in file \"%s\", block %u: calculated checksum " @@ -168,156 +289,151 @@ msgstr "" "\"%s\" 파ì¼, %u ë¸”ëŸ­ì˜ ì²´í¬ì„¬ 검사 실패: ê³„ì‚°ëœ ì²´í¬ì„¬ì€ %X ê°’ì´ì§€ë§Œ, 블럭ì—" "는 %X ê°’ì´ ìžˆìŒ" -#: pg_checksums.c:258 +#: pg_checksums.c:255 #, c-format msgid "seek failed for block %u in file \"%s\": %m" msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì—서 ì°¾ì„ ìˆ˜ ì—†ìŒ: %m" -#: pg_checksums.c:267 +#: pg_checksums.c:262 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì— 쓸 수 ì—†ìŒ: %m" -#: pg_checksums.c:270 +#: pg_checksums.c:265 #, c-format msgid "could not write block %u in file \"%s\": wrote %d of %d" msgstr "%u ë¸”ëŸ­ì„ \"%s\" 파ì¼ì— 쓸 수 ì—†ìŒ: %d / %d ë°”ì´íŠ¸ë§Œ 씀" -#: pg_checksums.c:283 +#: pg_checksums.c:277 #, c-format msgid "checksums verified in file \"%s\"" msgstr "\"%s\" íŒŒì¼ ì²´í¬ì„¬ 검사 마침" -#: pg_checksums.c:285 +#: pg_checksums.c:279 #, c-format msgid "checksums enabled in file \"%s\"" msgstr "\"%s\" íŒŒì¼ ì²´í¬ì„¬ 활성화 함" -#: pg_checksums.c:310 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m" - -#: pg_checksums.c:337 pg_checksums.c:416 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m" - -#: pg_checksums.c:364 +#: pg_checksums.c:362 #, c-format msgid "invalid segment number %d in file name \"%s\"" msgstr "ìž˜ëª»ëœ ì¡°ê° ë²ˆí˜¸ %d, 해당 파ì¼: \"%s\"" -#: pg_checksums.c:497 -#, c-format -msgid "invalid filenode specification, must be numeric: %s" -msgstr "파ì¼ë…¸ë“œ ê°’ì´ ì´ìƒí•¨. ì´ ê°’ì€ ìˆ«ìžì—¬ì•¼ 함: %s" - -#: pg_checksums.c:515 pg_checksums.c:531 pg_checksums.c:541 pg_checksums.c:550 +#: pg_checksums.c:509 pg_checksums.c:525 pg_checksums.c:535 pg_checksums.c:543 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "ìžì œí•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보십시오.\n" +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." -#: pg_checksums.c:530 +#: pg_checksums.c:524 #, c-format msgid "no data directory specified" msgstr "ë°ì´í„° 디렉터리를 지정하지 않았ìŒ" -#: pg_checksums.c:539 +#: pg_checksums.c:533 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë¥¼ ì§€ì •í–ˆìŒ (ì²˜ìŒ \"%s\")" -#: pg_checksums.c:549 +#: pg_checksums.c:542 #, c-format msgid "option -f/--filenode can only be used with --check" msgstr "-f/--filenode ì˜µì…˜ì€ --check 옵션만 사용할 수 있ìŒ" -#: pg_checksums.c:559 +#: pg_checksums.c:550 #, c-format msgid "pg_control CRC value is incorrect" msgstr "pg_control CRC ê°’ì´ ìž˜ëª»ë˜ì—ˆìŒ" -#: pg_checksums.c:565 +#: pg_checksums.c:553 #, c-format msgid "cluster is not compatible with this version of pg_checksums" msgstr "해당 í´ëŸ¬ìŠ¤í„°ëŠ” ì´ ë²„ì „ pg_checksumê³¼ 호환ë˜ì§€ 않ìŒ" -#: pg_checksums.c:571 +#: pg_checksums.c:557 #, c-format msgid "database cluster is not compatible" msgstr "ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” 호환ë˜ì§€ 않ìŒ" -#: pg_checksums.c:572 +#: pg_checksums.c:558 #, c-format msgid "" "The database cluster was initialized with block size %u, but pg_checksums " -"was compiled with block size %u.\n" +"was compiled with block size %u." msgstr "" "ì´ ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ëŠ” %u ë¸”ë¡ í¬ê¸°ë¡œ 초기화 ë˜ì—ˆì§€ë§Œ, pg_checksumì€ %u " -"ë¸”ë¡ í¬ê¸°ë¡œ ì»´íŒŒì¼ ë˜ì–´ìžˆìŠµë‹ˆë‹¤.\n" +"ë¸”ë¡ í¬ê¸°ë¡œ ì»´íŒŒì¼ ë˜ì–´ìžˆìŠµë‹ˆë‹¤." -#: pg_checksums.c:585 +#: pg_checksums.c:570 #, c-format msgid "cluster must be shut down" msgstr "먼저 서버가 중지ë˜ì–´ì•¼ 함" -#: pg_checksums.c:592 +#: pg_checksums.c:574 #, c-format msgid "data checksums are not enabled in cluster" msgstr "ì´ í´ëŸ¬ìŠ¤í„°ëŠ” ìžë£Œ ì²´í¬ì„¬ì´ 비활성화 ìƒíƒœìž„" -#: pg_checksums.c:599 +#: pg_checksums.c:578 #, c-format msgid "data checksums are already disabled in cluster" msgstr "ì´ í´ëŸ¬ìŠ¤í„°ëŠ” ì´ë¯¸ ìžë£Œ ì²´í¬ì„¬ì´ 비활성화 ìƒíƒœìž„" -#: pg_checksums.c:606 +#: pg_checksums.c:582 #, c-format msgid "data checksums are already enabled in cluster" msgstr "ì´ í´ëŸ¬ìŠ¤í„°ëŠ” ì´ë¯¸ ìžë£Œ ì²´í¬ì„¬ì´ 활성화 ìƒíƒœìž„" -#: pg_checksums.c:632 +#: pg_checksums.c:606 #, c-format msgid "Checksum operation completed\n" msgstr "ì²´í¬ì„¬ 작업 완료\n" -#: pg_checksums.c:633 +#: pg_checksums.c:607 +#, c-format +msgid "Files scanned: %lld\n" +msgstr "조사한 파ì¼ìˆ˜: %lld\n" + +#: pg_checksums.c:608 +#, c-format +msgid "Blocks scanned: %lld\n" +msgstr "조사한 블럭수: %lld\n" + +#: pg_checksums.c:611 #, c-format -msgid "Files scanned: %s\n" -msgstr "조사한 파ì¼ìˆ˜: %s\n" +msgid "Bad checksums: %lld\n" +msgstr "ìž˜ëª»ëœ ì²´í¬ì„¬: %lld\n" -#: pg_checksums.c:634 +#: pg_checksums.c:612 pg_checksums.c:644 #, c-format -msgid "Blocks scanned: %s\n" -msgstr "조사한 블럭수: %s\n" +msgid "Data checksum version: %u\n" +msgstr "ìžë£Œ ì²´í¬ì„¬ 버전: %u\n" -#: pg_checksums.c:637 +#: pg_checksums.c:619 #, c-format -msgid "Bad checksums: %s\n" -msgstr "ìž˜ëª»ëœ ì²´í¬ì„¬: %s\n" +msgid "Files written: %lld\n" +msgstr "기ë¡í•œ 파ì¼ìˆ˜: %lld\n" -#: pg_checksums.c:638 pg_checksums.c:665 +#: pg_checksums.c:620 #, c-format -msgid "Data checksum version: %d\n" -msgstr "ìžë£Œ ì²´í¬ì„¬ 버전: %d\n" +msgid "Blocks written: %lld\n" +msgstr "기ë¡í•œ 블럭수: %lld\n" -#: pg_checksums.c:657 +#: pg_checksums.c:636 #, c-format msgid "syncing data directory" msgstr "ë°ì´í„° 디렉터리 fsync 중" -#: pg_checksums.c:661 +#: pg_checksums.c:640 #, c-format msgid "updating control file" msgstr "컨트롤 íŒŒì¼ ë°”ê¾¸ëŠ” 중" -#: pg_checksums.c:667 +#: pg_checksums.c:646 #, c-format msgid "Checksums enabled in cluster\n" msgstr "ì´ í´ëŸ¬ìŠ¤í„°ëŠ” ìžë£Œ ì²´í¬ì„¬ ì˜µì…˜ì´ í™œì„±í™” ë˜ì—ˆìŒ\n" -#: pg_checksums.c:669 +#: pg_checksums.c:648 #, c-format msgid "Checksums disabled in cluster\n" msgstr "ì´ í´ëŸ¬ìŠ¤í„°ëŠ” ìžë£Œ ì²´í¬ì„¬ ì˜µì…˜ì´ ë¹„í™œì„±í™” ë˜ì—ˆìŒ\n" diff --git a/src/bin/pg_checksums/po/meson.build b/src/bin/pg_checksums/po/meson.build index 97b20f263cf0a..b91cef0828f6f 100644 --- a/src/bin/pg_checksums/po/meson.build +++ b/src/bin/pg_checksums/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_checksums-' + pg_version_major.to_string())] diff --git a/src/bin/pg_checksums/po/pt_BR.po b/src/bin/pg_checksums/po/pt_BR.po index d310b37dac585..c0ebf5dbafea4 100644 --- a/src/bin/pg_checksums/po/pt_BR.po +++ b/src/bin/pg_checksums/po/pt_BR.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-09-27 13:15-0300\n" -"PO-Revision-Date: 2022-09-27 20:27-0300\n" +"PO-Revision-Date: 2023-08-17 16:33+0200\n" "Last-Translator: Euler Taveira \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" @@ -145,7 +145,7 @@ msgstr "Relate erros a <%s>.\n" #: pg_checksums.c:96 #, c-format msgid "%s home page: <%s>\n" -msgstr "página web do %s: <%s>\n" +msgstr "Página web do %s: <%s>\n" #: pg_checksums.c:153 #, c-format diff --git a/src/bin/pg_checksums/po/ru.po b/src/bin/pg_checksums/po/ru.po index 02eb7541db3d4..30f9791b0460a 100644 --- a/src/bin/pg_checksums/po/ru.po +++ b/src/bin/pg_checksums/po/ru.po @@ -1,10 +1,10 @@ -# Alexander Lakhin , 2019, 2020, 2021, 2022. +# Alexander Lakhin , 2019, 2020, 2021, 2022, 2024. msgid "" msgstr "" "Project-Id-Version: pg_verify_checksums (PostgreSQL) 11\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-27 14:52+0300\n" -"PO-Revision-Date: 2022-09-05 13:34+0300\n" +"POT-Creation-Date: 2024-09-02 09:29+0300\n" +"PO-Revision-Date: 2024-09-04 13:35+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -32,6 +32,106 @@ msgstr "подробноÑти: " msgid "hint: " msgstr "подÑказка: " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m" + +#: ../../common/controldata_utils.c:110 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %zu)" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неÑоответÑтвие порÑдка байт" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, " +"and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"возможно неÑоответÑтвие порÑдка байт\n" +"ПорÑдок байт в файле pg_control может не ÑоответÑтвовать иÑпользуемому\n" +"Ñтой программой. Ð’ Ñтом Ñлучае результаты будут неверными и\n" +"уÑтановленный PostgreSQL будет неÑовмеÑтим Ñ Ñтим каталогом данных." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_checksums.c:192 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "нехватка памÑти\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_checksums.c:338 pg_checksums.c:407 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñта Ñборка программы не поддерживает метод Ñинхронизации \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_checksums.c:310 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" + #: ../../fe_utils/option_utils.c:69 #, c-format msgid "invalid value \"%s\" for option %s" @@ -42,7 +142,12 @@ msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" msgid "%s must be in range %d..%d" msgstr "значение %s должно быть в диапазоне %d..%d" -#: pg_checksums.c:79 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нераÑпознанный метод Ñинхронизации: %s" + +#: pg_checksums.c:70 #, c-format msgid "" "%s enables, disables, or verifies data checksums in a PostgreSQL database " @@ -53,17 +158,17 @@ msgstr "" "PostgreSQL.\n" "\n" -#: pg_checksums.c:80 +#: pg_checksums.c:71 #, c-format msgid "Usage:\n" msgstr "ИÑпользование:\n" -#: pg_checksums.c:81 +#: pg_checksums.c:72 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [ПÐРÐМЕТР]... [КÐТÐЛОГ]\n" -#: pg_checksums.c:82 +#: pg_checksums.c:73 #, c-format msgid "" "\n" @@ -72,29 +177,29 @@ msgstr "" "\n" "Параметры:\n" -#: pg_checksums.c:83 +#: pg_checksums.c:74 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]КÐТ_ДÐÐÐЫХ каталог данных\n" -#: pg_checksums.c:84 +#: pg_checksums.c:75 #, c-format msgid " -c, --check check data checksums (default)\n" msgstr "" -" -c, --check проверить контрольные Ñуммы данных (по умолчанию)" -"\n" +" -c, --check проверить контрольные Ñуммы данных (по " +"умолчанию)\n" -#: pg_checksums.c:85 +#: pg_checksums.c:76 #, c-format msgid " -d, --disable disable data checksums\n" msgstr " -d, --disable отключить контрольные Ñуммы\n" -#: pg_checksums.c:86 +#: pg_checksums.c:77 #, c-format msgid " -e, --enable enable data checksums\n" msgstr " -e, --enable включить контрольные Ñуммы\n" -#: pg_checksums.c:87 +#: pg_checksums.c:78 #, c-format msgid "" " -f, --filenode=FILENODE check only relation with specified filenode\n" @@ -102,7 +207,7 @@ msgstr "" " -f, --filenode=ФÐЙЛ_УЗЕЛ проверить только отношение Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ файловым " "узлом\n" -#: pg_checksums.c:88 +#: pg_checksums.c:79 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written safely to " @@ -110,27 +215,32 @@ msgid "" msgstr "" " -N, --no-sync не ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… на диÑке\n" -#: pg_checksums.c:89 +#: pg_checksums.c:80 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress показывать прогреÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸\n" -#: pg_checksums.c:90 +#: pg_checksums.c:81 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=МЕТОД метод Ñинхронизации файлов Ñ Ð¤Ð¡\n" + +#: pg_checksums.c:82 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose выводить подробные ÑообщениÑ\n" -#: pg_checksums.c:91 +#: pg_checksums.c:83 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: pg_checksums.c:92 +#: pg_checksums.c:84 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: pg_checksums.c:93 +#: pg_checksums.c:85 #, c-format msgid "" "\n" @@ -144,37 +254,32 @@ msgstr "" "переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n" "\n" -#: pg_checksums.c:95 +#: pg_checksums.c:87 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: pg_checksums.c:96 +#: pg_checksums.c:88 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" -#: pg_checksums.c:153 +#: pg_checksums.c:145 #, c-format msgid "%lld/%lld MB (%d%%) computed" msgstr "%lld/%lld МБ (%d%%) обработано" -#: pg_checksums.c:200 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" - -#: pg_checksums.c:214 +#: pg_checksums.c:206 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "не удалоÑÑŒ прочитать блок %u в файле \"%s\": %m" -#: pg_checksums.c:217 +#: pg_checksums.c:209 #, c-format msgid "could not read block %u in file \"%s\": read %d of %d" msgstr "не удалоÑÑŒ прочитать блок %u в файле \"%s\" (прочитано байт: %d из %d)" -#: pg_checksums.c:240 +#: pg_checksums.c:232 #, c-format msgid "" "checksum verification failed in file \"%s\", block %u: calculated checksum " @@ -183,82 +288,72 @@ msgstr "" "ошибка контрольных Ñумм в файле \"%s\", блоке %u: вычиÑлена ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ " "Ñумма %X, но блок Ñодержит %X" -#: pg_checksums.c:263 +#: pg_checksums.c:255 #, c-format msgid "seek failed for block %u in file \"%s\": %m" msgstr "ошибка при переходе к блоку %u в файле \"%s\": %m" -#: pg_checksums.c:270 +#: pg_checksums.c:262 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "не удалоÑÑŒ запиÑать блок %u в файл \"%s\": %m" -#: pg_checksums.c:273 +#: pg_checksums.c:265 #, c-format msgid "could not write block %u in file \"%s\": wrote %d of %d" msgstr "не удалоÑÑŒ запиÑать блок %u в файле \"%s\" (запиÑано байт: %d из %d)" -#: pg_checksums.c:285 +#: pg_checksums.c:277 #, c-format msgid "checksums verified in file \"%s\"" msgstr "контрольные Ñуммы в файле \"%s\" проверены" -#: pg_checksums.c:287 +#: pg_checksums.c:279 #, c-format msgid "checksums enabled in file \"%s\"" msgstr "контрольные Ñуммы в файле \"%s\" включены" -#: pg_checksums.c:318 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" - -#: pg_checksums.c:342 pg_checksums.c:415 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" - -#: pg_checksums.c:366 +#: pg_checksums.c:362 #, c-format msgid "invalid segment number %d in file name \"%s\"" msgstr "неверный номер Ñегмента %d в имени файла \"%s\"" -#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546 +#: pg_checksums.c:509 pg_checksums.c:525 pg_checksums.c:535 pg_checksums.c:543 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." -#: pg_checksums.c:527 +#: pg_checksums.c:524 #, c-format msgid "no data directory specified" msgstr "каталог данных не указан" -#: pg_checksums.c:536 +#: pg_checksums.c:533 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")" -#: pg_checksums.c:545 +#: pg_checksums.c:542 #, c-format msgid "option -f/--filenode can only be used with --check" msgstr "параметр -f/--filenode можно иÑпользовать только Ñ --check" -#: pg_checksums.c:553 +#: pg_checksums.c:550 #, c-format msgid "pg_control CRC value is incorrect" msgstr "ошибка контрольного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² pg_control" -#: pg_checksums.c:556 +#: pg_checksums.c:553 #, c-format msgid "cluster is not compatible with this version of pg_checksums" msgstr "клаÑтер неÑовмеÑтим Ñ Ñтой верÑией pg_checksums" -#: pg_checksums.c:560 +#: pg_checksums.c:557 #, c-format msgid "database cluster is not compatible" msgstr "неÑовмеÑтимый клаÑтер баз данных" -#: pg_checksums.c:561 +#: pg_checksums.c:558 #, c-format msgid "" "The database cluster was initialized with block size %u, but pg_checksums " @@ -267,77 +362,77 @@ msgstr "" "КлаÑтер баз данных был инициализирован Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð¾Ð¼ блока %u, а утилита " "pg_checksums Ñкомпилирована Ð´Ð»Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° блока %u." -#: pg_checksums.c:573 +#: pg_checksums.c:570 #, c-format msgid "cluster must be shut down" msgstr "клаÑтер должен быть отключён" -#: pg_checksums.c:577 +#: pg_checksums.c:574 #, c-format msgid "data checksums are not enabled in cluster" msgstr "контрольные Ñуммы в клаÑтере не включены" -#: pg_checksums.c:581 +#: pg_checksums.c:578 #, c-format msgid "data checksums are already disabled in cluster" msgstr "контрольные Ñуммы в клаÑтере уже отключены" -#: pg_checksums.c:585 +#: pg_checksums.c:582 #, c-format msgid "data checksums are already enabled in cluster" msgstr "контрольные Ñуммы в клаÑтере уже включены" -#: pg_checksums.c:609 +#: pg_checksums.c:606 #, c-format msgid "Checksum operation completed\n" msgstr "Обработка контрольных Ñумм завершена\n" -#: pg_checksums.c:610 +#: pg_checksums.c:607 #, c-format msgid "Files scanned: %lld\n" msgstr "ПроÑканировано файлов: %lld\n" -#: pg_checksums.c:611 +#: pg_checksums.c:608 #, c-format msgid "Blocks scanned: %lld\n" msgstr "ПроÑканировано блоков: %lld\n" -#: pg_checksums.c:614 +#: pg_checksums.c:611 #, c-format msgid "Bad checksums: %lld\n" msgstr "Ðеверные контрольные Ñуммы: %lld\n" -#: pg_checksums.c:615 pg_checksums.c:647 +#: pg_checksums.c:612 pg_checksums.c:644 #, c-format msgid "Data checksum version: %u\n" msgstr "ВерÑÐ¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… Ñумм данных: %u\n" -#: pg_checksums.c:622 +#: pg_checksums.c:619 #, c-format msgid "Files written: %lld\n" msgstr "ЗапиÑано файлов: %lld\n" -#: pg_checksums.c:623 +#: pg_checksums.c:620 #, c-format msgid "Blocks written: %lld\n" msgstr "ЗапиÑано блоков: %lld\n" -#: pg_checksums.c:639 +#: pg_checksums.c:636 #, c-format msgid "syncing data directory" msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° данных" -#: pg_checksums.c:643 +#: pg_checksums.c:640 #, c-format msgid "updating control file" msgstr "Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющего файла" -#: pg_checksums.c:649 +#: pg_checksums.c:646 #, c-format msgid "Checksums enabled in cluster\n" msgstr "Контрольные Ñуммы в клаÑтере включены\n" -#: pg_checksums.c:651 +#: pg_checksums.c:648 #, c-format msgid "Checksums disabled in cluster\n" msgstr "Контрольные Ñуммы в клаÑтере отключены\n" diff --git a/src/bin/pg_checksums/po/sv.po b/src/bin/pg_checksums/po/sv.po index 8e92a9e5443b1..245aa1722ae29 100644 --- a/src/bin/pg_checksums/po/sv.po +++ b/src/bin/pg_checksums/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_checksums # Copyright (C) 2019 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_checksums (PostgreSQL) package. -# Dennis Björklund , 2019, 2020, 2021, 2022. +# Dennis Björklund , 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-09 18:52+0000\n" -"PO-Revision-Date: 2022-05-09 21:46+0200\n" +"POT-Creation-Date: 2024-07-12 14:25+0000\n" +"PO-Revision-Date: 2024-07-12 18:57+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,26 +17,125 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "varning: " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "detalj: " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "tips: " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "kunde inte öppna filen \"%s\" för läsning: %m" + +#: ../../common/controldata_utils.c:110 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "kunde inte läsa fil \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "kunde inte stänga fil \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "byte-ordning stämmer inte" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"möjligt fel i byteordning\n" +"Den byteordning som filen frÃ¥n pg_control lagrats med passar kanske\n" +"inte detta program. I sÃ¥ fall kan nedanstÃ¥ende resultat vara felaktiga\n" +"och PostgreSQL-installationen vara inkompatibel med databaskatalogen." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_checksums.c:192 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "kunde inte öppna fil \"%s\": %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "kunde inte skriva fil \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "kunde inte fsync:a fil \"%s\": %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "slut pÃ¥ minne\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kan inte duplicera null-pekare (internt fel)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_checksums.c:338 pg_checksums.c:407 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "detta bygge stöder inte synkmetod \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_checksums.c:310 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "kunde inte öppna katalog \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "kunde inte läsa katalog \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" + #: ../../fe_utils/option_utils.c:69 #, c-format msgid "invalid value \"%s\" for option %s" @@ -47,7 +146,12 @@ msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" msgid "%s must be in range %d..%d" msgstr "%s mÃ¥ste vara i intervallet %d..%d" -#: pg_checksums.c:79 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "okänd synkmetod: %s" + +#: pg_checksums.c:70 #, c-format msgid "" "%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n" @@ -56,17 +160,17 @@ msgstr "" "%s slÃ¥r pÃ¥, slÃ¥r av eller verifierar datakontrollsummor i ett PostgreSQL databaskluster.\n" "\n" -#: pg_checksums.c:80 +#: pg_checksums.c:71 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_checksums.c:81 +#: pg_checksums.c:72 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [FLAGGA]... [DATAKATALOG]\n" -#: pg_checksums.c:82 +#: pg_checksums.c:73 #, c-format msgid "" "\n" @@ -75,57 +179,62 @@ msgstr "" "\n" "Flaggor:\n" -#: pg_checksums.c:83 +#: pg_checksums.c:74 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]DATAKAT datakatalog\n" -#: pg_checksums.c:84 +#: pg_checksums.c:75 #, c-format msgid " -c, --check check data checksums (default)\n" msgstr " -c, --check kontrollera datakontrollsummor (standard)\n" -#: pg_checksums.c:85 +#: pg_checksums.c:76 #, c-format msgid " -d, --disable disable data checksums\n" msgstr " -d, --disable slÃ¥ av datakontrollsummor\n" -#: pg_checksums.c:86 +#: pg_checksums.c:77 #, c-format msgid " -e, --enable enable data checksums\n" msgstr " -e, --enable slÃ¥ pÃ¥ datakontrollsummor\n" -#: pg_checksums.c:87 +#: pg_checksums.c:78 #, c-format msgid " -f, --filenode=FILENODE check only relation with specified filenode\n" msgstr " -f, --filenode=FILNOD kontrollera bara relation med angiven filnod\n" -#: pg_checksums.c:88 +#: pg_checksums.c:79 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync vänta inte pÃ¥ att ändingar säkert skrivits till disk\n" -#: pg_checksums.c:89 +#: pg_checksums.c:80 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress visa förloppsinformation\n" -#: pg_checksums.c:90 +#: pg_checksums.c:81 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METOD sätt synkmetod för att synka filer till disk\n" + +#: pg_checksums.c:82 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose visa utförliga meddelanden\n" -#: pg_checksums.c:91 +#: pg_checksums.c:83 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_checksums.c:92 +#: pg_checksums.c:84 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_checksums.c:93 +#: pg_checksums.c:85 #, c-format msgid "" "\n" @@ -138,192 +247,177 @@ msgstr "" "PGDATA för detta syfte.\n" "\n" -#: pg_checksums.c:95 +#: pg_checksums.c:87 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapportera fel till <%s>.\n" -#: pg_checksums.c:96 +#: pg_checksums.c:88 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_checksums.c:153 +#: pg_checksums.c:145 #, c-format msgid "%lld/%lld MB (%d%%) computed" msgstr "%lld/%lld MB (%d%%) beräknad" -#: pg_checksums.c:200 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "kunde inte öppna fil \"%s\": %m" - -#: pg_checksums.c:214 +#: pg_checksums.c:206 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "kunde inte läsa block %u i fil \"%s\": %m" -#: pg_checksums.c:217 +#: pg_checksums.c:209 #, c-format msgid "could not read block %u in file \"%s\": read %d of %d" msgstr "kunde inte läsa block %u i fil \"%s\": läste %d av %d" -#: pg_checksums.c:240 +#: pg_checksums.c:232 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X" msgstr "verifiering av kontrollsumma misslyckades i fil \"%s\", block %u: beräknad kontrollsumma är %X men blocket innehÃ¥ller %X" -#: pg_checksums.c:263 +#: pg_checksums.c:255 #, c-format msgid "seek failed for block %u in file \"%s\": %m" msgstr "seek misslyckades för block %u i fil \"%s\": %m" -#: pg_checksums.c:270 +#: pg_checksums.c:262 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "kunde inte skriva block %u i fil \"%s\": %m" -#: pg_checksums.c:273 +#: pg_checksums.c:265 #, c-format msgid "could not write block %u in file \"%s\": wrote %d of %d" msgstr "kunde inte skriva block %u i fil \"%s\": skrev %d av %d" -#: pg_checksums.c:285 +#: pg_checksums.c:277 #, c-format msgid "checksums verified in file \"%s\"" msgstr "kontrollsummor verifierade i fil \"%s\"" -#: pg_checksums.c:287 +#: pg_checksums.c:279 #, c-format msgid "checksums enabled in file \"%s\"" msgstr "kontrollsummor pÃ¥slagen i fil \"%s\"" -#: pg_checksums.c:318 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "kunde inte öppna katalog \"%s\": %m" - -#: pg_checksums.c:342 pg_checksums.c:415 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" - -#: pg_checksums.c:366 +#: pg_checksums.c:362 #, c-format msgid "invalid segment number %d in file name \"%s\"" msgstr "ogiltigt segmentnummer %d i filnamn \"%s\"" -#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546 +#: pg_checksums.c:509 pg_checksums.c:525 pg_checksums.c:535 pg_checksums.c:543 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: pg_checksums.c:527 +#: pg_checksums.c:524 #, c-format msgid "no data directory specified" msgstr "ingen datakatalog angiven" -#: pg_checksums.c:536 +#: pg_checksums.c:533 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")" -#: pg_checksums.c:545 +#: pg_checksums.c:542 #, c-format msgid "option -f/--filenode can only be used with --check" msgstr "inställningen -f/--filenode tillÃ¥ts bara med --check" -#: pg_checksums.c:553 +#: pg_checksums.c:550 #, c-format msgid "pg_control CRC value is incorrect" msgstr "pg_control CRC-värde är inkorrekt" -#: pg_checksums.c:556 +#: pg_checksums.c:553 #, c-format msgid "cluster is not compatible with this version of pg_checksums" msgstr "klustret är inte kompatibelt med denna version av pg_checksums" -#: pg_checksums.c:560 +#: pg_checksums.c:557 #, c-format msgid "database cluster is not compatible" msgstr "databasklustret är inte kompatibelt" -#: pg_checksums.c:561 +#: pg_checksums.c:558 #, c-format msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u." msgstr "Databasklustret initierades med blockstorlek %u men pg_checksums kompilerades med blockstorlek %u." -#: pg_checksums.c:573 +#: pg_checksums.c:570 #, c-format msgid "cluster must be shut down" msgstr "klustret mÃ¥ste stängas ner" -#: pg_checksums.c:577 +#: pg_checksums.c:574 #, c-format msgid "data checksums are not enabled in cluster" msgstr "datakontrollsummor är inte pÃ¥slaget i klustret" -#: pg_checksums.c:581 +#: pg_checksums.c:578 #, c-format msgid "data checksums are already disabled in cluster" msgstr "datakontrollsummor är redan avslaget i klustret" -#: pg_checksums.c:585 +#: pg_checksums.c:582 #, c-format msgid "data checksums are already enabled in cluster" msgstr "datakontrollsummor är redan pÃ¥slagna i klustret" -#: pg_checksums.c:609 +#: pg_checksums.c:606 #, c-format msgid "Checksum operation completed\n" msgstr "Kontrollsummeoperation avslutad\n" -#: pg_checksums.c:610 +#: pg_checksums.c:607 #, c-format msgid "Files scanned: %lld\n" msgstr "Skannade filer: %lld\n" -#: pg_checksums.c:611 +#: pg_checksums.c:608 #, c-format msgid "Blocks scanned: %lld\n" msgstr "Skannade block: %lld\n" -#: pg_checksums.c:614 +#: pg_checksums.c:611 #, c-format msgid "Bad checksums: %lld\n" msgstr "Felaktiga kontrollsummor: %lld\n" -#: pg_checksums.c:615 pg_checksums.c:647 +#: pg_checksums.c:612 pg_checksums.c:644 #, c-format msgid "Data checksum version: %u\n" msgstr "Datakontrollsummeversion: %u\n" -#: pg_checksums.c:622 +#: pg_checksums.c:619 #, c-format msgid "Files written: %lld\n" msgstr "Skrivna filer: %lld\n" -#: pg_checksums.c:623 +#: pg_checksums.c:620 #, c-format msgid "Blocks written: %lld\n" msgstr "Skrivna block: %lld\n" -#: pg_checksums.c:639 +#: pg_checksums.c:636 #, c-format msgid "syncing data directory" msgstr "synkar datakatalogen" -#: pg_checksums.c:643 +#: pg_checksums.c:640 #, c-format msgid "updating control file" msgstr "uppdaterar kontrollfil" -#: pg_checksums.c:649 +#: pg_checksums.c:646 #, c-format msgid "Checksums enabled in cluster\n" msgstr "Kontrollsummor pÃ¥slaget i klustret\n" -#: pg_checksums.c:651 +#: pg_checksums.c:648 #, c-format msgid "Checksums disabled in cluster\n" msgstr "Kontrollsummor avslaget i klustret\n" diff --git a/src/bin/pg_checksums/po/uk.po b/src/bin/pg_checksums/po/uk.po index 0a994be1ec476..747d6867562a4 100644 --- a/src/bin/pg_checksums/po/uk.po +++ b/src/bin/pg_checksums/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:52+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:25+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pg_checksums.pot\n" -"X-Crowdin-File-ID: 888\n" +"X-Crowdin-File: /REL_17_STABLE/pg_checksums.pot\n" +"X-Crowdin-File-ID: 1000\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,6 +37,101 @@ msgstr "деталі: " msgid "hint: " msgstr "підказка: " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m" + +#: ../../common/controldata_utils.c:110 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "неможливо закрити файл \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неправильний порÑдок байтів" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "можлива помилка у поÑлідовноÑті байтів.\n" +"ПорÑдок байтів, що викориÑтовують Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ pg_control, може не відповідати тому, Ñкий викориÑтовуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ програмою. У такому випадку результати нижче будуть неправильним, Ñ– інÑталÑÑ†Ñ–Ñ PostgreSQL буде неÑуміÑною з цим каталогом даних." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_checksums.c:192 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не можливо відкрити файл \"%s\": %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не вдалоÑÑ fsync файл \"%s\": %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "недоÑтатньо пам'Ñті\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не вдалоÑÑ Ñинхронізувати файлову ÑиÑтему Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: pg_checksums.c:338 pg_checksums.c:407 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує метод Ñинхронізації \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_checksums.c:310 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" + #: ../../fe_utils/option_utils.c:69 #, c-format msgid "invalid value \"%s\" for option %s" @@ -47,79 +142,89 @@ msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ msgid "%s must be in range %d..%d" msgstr "%s має бути в діапазоні %d..%d" -#: pg_checksums.c:79 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нерозпізнаний метод Ñинхронізації: %s" + +#: pg_checksums.c:70 #, c-format msgid "%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n\n" msgstr "%s активує, деактивує або перевірÑÑ” контрольні Ñуми даних в клаÑтері бази даних PostgreSQL.\n\n" -#: pg_checksums.c:80 +#: pg_checksums.c:71 #, c-format msgid "Usage:\n" msgstr "ВикориÑтаннÑ:\n" -#: pg_checksums.c:81 +#: pg_checksums.c:72 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATADIR]\n" -#: pg_checksums.c:82 +#: pg_checksums.c:73 #, c-format msgid "\n" "Options:\n" msgstr "\n" "Параметри:\n" -#: pg_checksums.c:83 +#: pg_checksums.c:74 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]DATADIR каталог даних\n" -#: pg_checksums.c:84 +#: pg_checksums.c:75 #, c-format msgid " -c, --check check data checksums (default)\n" msgstr " -c, --check перевірити контрольні Ñуми даних (за замовчуваннÑм)\n" -#: pg_checksums.c:85 +#: pg_checksums.c:76 #, c-format msgid " -d, --disable disable data checksums\n" msgstr " -d, --disable вимкнути контрольні Ñуми даних\n" -#: pg_checksums.c:86 +#: pg_checksums.c:77 #, c-format msgid " -e, --enable enable data checksums\n" msgstr " -e, --enable активувати контрольні Ñуми даних\n" -#: pg_checksums.c:87 +#: pg_checksums.c:78 #, c-format msgid " -f, --filenode=FILENODE check only relation with specified filenode\n" msgstr " -f, --filenode=FILENODE перевірÑти Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð»Ð¸ÑˆÐµ із вказаним файлом\n" -#: pg_checksums.c:88 +#: pg_checksums.c:79 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync не чекати на безпечний Ð·Ð°Ð¿Ð¸Ñ Ð·Ð¼Ñ–Ð½ на диÑк\n" -#: pg_checksums.c:89 +#: pg_checksums.c:80 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress показати інформацію про прогреÑ\n" -#: pg_checksums.c:90 +#: pg_checksums.c:81 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD вÑтановити метод Ñинхронізації файлів на диÑк\n" + +#: pg_checksums.c:82 #, c-format msgid " -v, --verbose output verbose messages\n" msgstr " -v, --verbose виводити детальні повідомленнÑ\n" -#: pg_checksums.c:91 +#: pg_checksums.c:83 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n" -#: pg_checksums.c:92 +#: pg_checksums.c:84 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: pg_checksums.c:93 +#: pg_checksums.c:85 #, c-format msgid "\n" "If no data directory (DATADIR) is specified, the environment variable PGDATA\n" @@ -127,192 +232,177 @@ msgid "\n" msgstr "\n" "Якщо каталог даних не вказано (DATADIR), викориÑтовуєтьÑÑ Ð·Ð¼Ñ–Ð½Ð½Ð° Ñередовища PGDATA.\n\n" -#: pg_checksums.c:95 +#: pg_checksums.c:87 #, c-format msgid "Report bugs to <%s>.\n" msgstr "ПовідомлÑти про помилки на <%s>.\n" -#: pg_checksums.c:96 +#: pg_checksums.c:88 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" -#: pg_checksums.c:153 +#: pg_checksums.c:145 #, c-format msgid "%lld/%lld MB (%d%%) computed" msgstr "%lld/%lld MB (%d%%) обчиÑлено" -#: pg_checksums.c:200 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "не можливо відкрити файл \"%s\": %m" - -#: pg_checksums.c:214 +#: pg_checksums.c:206 #, c-format msgid "could not read block %u in file \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ блок %u в файлі \"%s\": %m" -#: pg_checksums.c:217 +#: pg_checksums.c:209 #, c-format msgid "could not read block %u in file \"%s\": read %d of %d" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ блок %u у файлі \"%s\": прочитано %d з %d" -#: pg_checksums.c:240 +#: pg_checksums.c:232 #, c-format msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X" msgstr "помилка перевірки контрольних Ñум у файлі \"%s\", блок %u: обчиÑлена контрольна Ñума %X, але блок міÑтить %X" -#: pg_checksums.c:263 +#: pg_checksums.c:255 #, c-format msgid "seek failed for block %u in file \"%s\": %m" msgstr "помилка пошуку Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÑƒ %u у файлі \"%s\": %m" -#: pg_checksums.c:270 +#: pg_checksums.c:262 #, c-format msgid "could not write block %u in file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати блок %u у файл \"%s\": %m" -#: pg_checksums.c:273 +#: pg_checksums.c:265 #, c-format msgid "could not write block %u in file \"%s\": wrote %d of %d" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати блок %u у файлі \"%s\": запиÑано %d з %d" -#: pg_checksums.c:285 +#: pg_checksums.c:277 #, c-format msgid "checksums verified in file \"%s\"" msgstr "контрольні Ñуми у файлі \"%s\" перевірені" -#: pg_checksums.c:287 +#: pg_checksums.c:279 #, c-format msgid "checksums enabled in file \"%s\"" msgstr "контрольні Ñуми у файлі \"%s\" активовані" -#: pg_checksums.c:318 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" - -#: pg_checksums.c:342 pg_checksums.c:415 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" - -#: pg_checksums.c:366 +#: pg_checksums.c:362 #, c-format msgid "invalid segment number %d in file name \"%s\"" msgstr "неприпуÑтимий номер Ñегменту %d в імені файлу \"%s\"" -#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546 +#: pg_checksums.c:509 pg_checksums.c:525 pg_checksums.c:535 pg_checksums.c:543 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." -#: pg_checksums.c:527 +#: pg_checksums.c:524 #, c-format msgid "no data directory specified" msgstr "каталог даних не вказано" -#: pg_checksums.c:536 +#: pg_checksums.c:533 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")" -#: pg_checksums.c:545 +#: pg_checksums.c:542 #, c-format msgid "option -f/--filenode can only be used with --check" msgstr "параметр -f/--filenode може бути викориÑтаний тільки з --check" -#: pg_checksums.c:553 +#: pg_checksums.c:550 #, c-format msgid "pg_control CRC value is incorrect" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ CRC pg_control неправильне" -#: pg_checksums.c:556 +#: pg_checksums.c:553 #, c-format msgid "cluster is not compatible with this version of pg_checksums" msgstr "клаÑтер не ÑуміÑний з цією верÑією pg_checksum" -#: pg_checksums.c:560 +#: pg_checksums.c:557 #, c-format msgid "database cluster is not compatible" msgstr "клаÑтер бази даних не ÑуміÑний" -#: pg_checksums.c:561 +#: pg_checksums.c:558 #, c-format msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u." msgstr "КлаÑтер бази даних було ініціалізовано з розміром блоку %u, але pg_checksums було Ñкомпільовано з розміром блоку %u." -#: pg_checksums.c:573 +#: pg_checksums.c:570 #, c-format msgid "cluster must be shut down" msgstr "клаÑтер повинен бути закритий" -#: pg_checksums.c:577 +#: pg_checksums.c:574 #, c-format msgid "data checksums are not enabled in cluster" msgstr "контрольні Ñуми в клаÑтері неактивовані" -#: pg_checksums.c:581 +#: pg_checksums.c:578 #, c-format msgid "data checksums are already disabled in cluster" msgstr "контрольні Ñуми вже неактивовані в клаÑтері" -#: pg_checksums.c:585 +#: pg_checksums.c:582 #, c-format msgid "data checksums are already enabled in cluster" msgstr "контрольні Ñуми вже активовані в клаÑтері" -#: pg_checksums.c:609 +#: pg_checksums.c:606 #, c-format msgid "Checksum operation completed\n" msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ñ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— Ñуми завершена\n" -#: pg_checksums.c:610 +#: pg_checksums.c:607 #, c-format msgid "Files scanned: %lld\n" msgstr "Файлів проÑкановано: %lld\n" -#: pg_checksums.c:611 +#: pg_checksums.c:608 #, c-format msgid "Blocks scanned: %lld\n" msgstr "Блоків відÑкановано: %lld\n" -#: pg_checksums.c:614 +#: pg_checksums.c:611 #, c-format msgid "Bad checksums: %lld\n" msgstr "Помилкові контрольні Ñуми: %lld\n" -#: pg_checksums.c:615 pg_checksums.c:647 +#: pg_checksums.c:612 pg_checksums.c:644 #, c-format msgid "Data checksum version: %u\n" msgstr "ВерÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум даних: %u\n" -#: pg_checksums.c:622 +#: pg_checksums.c:619 #, c-format msgid "Files written: %lld\n" msgstr "Файлів запиÑано: %lld\n" -#: pg_checksums.c:623 +#: pg_checksums.c:620 #, c-format msgid "Blocks written: %lld\n" msgstr "Блоків запиÑано: %lld\n" -#: pg_checksums.c:639 +#: pg_checksums.c:636 #, c-format msgid "syncing data directory" msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð´Ð°Ð½Ð¸Ñ… каталогу" -#: pg_checksums.c:643 +#: pg_checksums.c:640 #, c-format msgid "updating control file" msgstr "Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð³Ð¾ файлу" -#: pg_checksums.c:649 +#: pg_checksums.c:646 #, c-format msgid "Checksums enabled in cluster\n" msgstr "Контрольні Ñуми активовані в клаÑтері\n" -#: pg_checksums.c:651 +#: pg_checksums.c:648 #, c-format msgid "Checksums disabled in cluster\n" msgstr "Контрольні Ñуми вимкнені у клаÑтері\n" diff --git a/src/bin/pg_checksums/po/zh_TW.po b/src/bin/pg_checksums/po/zh_TW.po new file mode 100644 index 0000000000000..aafef8e41280d --- /dev/null +++ b/src/bin/pg_checksums/po/zh_TW.po @@ -0,0 +1,342 @@ +# Traditional Chinese message translation file for pg_checksums +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_checksums (PostgreSQL) package. +# Zhenbang Wei , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_checksums (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-11 20:52+0000\n" +"PO-Revision-Date: 2023-11-06 08:49+0800\n" +"Last-Translator: Zhenbang Wei \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.4.1\n" + +# libpq/be-secure.c:294 libpq/be-secure.c:387 +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "錯誤: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "警告: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "詳細內容: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "æç¤º: " + +# utils/adt/formatting.c:2044 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "é¸é … %2$s 的值 \"%1$s\" 無效" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s å¿…é ˆåœ¨ç¯„åœ %d..%d å…§" + +#: pg_checksums.c:79 +#, c-format +msgid "" +"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n" +"\n" +msgstr "" +"%s å¯ä»¥å•Ÿå‹•ã€é—œé–‰æˆ–é©—è­‰ PostgreSQL 資料庫å¢é›†ä¸­çš„資料檢查碼。\n" +"\n" + +#: pg_checksums.c:80 +#, c-format +msgid "Usage:\n" +msgstr "用法:\n" + +#: pg_checksums.c:81 +#, c-format +msgid " %s [OPTION]... [DATADIR]\n" +msgstr " %s [OPTION]... [DATADIR]\n" + +#: pg_checksums.c:82 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"é¸é …:\n" + +#: pg_checksums.c:83 +#, c-format +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]DATADIR 資料目錄\n" + +#: pg_checksums.c:84 +#, c-format +msgid " -c, --check check data checksums (default)\n" +msgstr " -c, --check 檢查資料檢查碼(é è¨­)\n" + +#: pg_checksums.c:85 +#, c-format +msgid " -d, --disable disable data checksums\n" +msgstr " -d, --disable 關閉資料檢查碼\n" + +#: pg_checksums.c:86 +#, c-format +msgid " -e, --enable enable data checksums\n" +msgstr " -e, --enable 啟動資料檢查碼\n" + +#: pg_checksums.c:87 +#, c-format +msgid " -f, --filenode=FILENODE check only relation with specified filenode\n" +msgstr " -f, --filenode=FILENODE åªæª¢æŸ¥æŒ‡å®š filenode 的關è¯\n" + +#: pg_checksums.c:88 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr " -N, --no-sync ä¸ç­‰å¾…變更安全寫入ç£ç¢Ÿ\n" + +#: pg_checksums.c:89 +#, c-format +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress 顯示進度資訊\n" + +#: pg_checksums.c:90 +#, c-format +msgid " -v, --verbose output verbose messages\n" +msgstr " -v, --verbose 顯示詳細訊æ¯\n" + +#: pg_checksums.c:91 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version é¡¯ç¤ºç‰ˆæœ¬ï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_checksums.c:92 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help é¡¯ç¤ºèªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_checksums.c:93 +#, c-format +msgid "" +"\n" +"If no data directory (DATADIR) is specified, the environment variable PGDATA\n" +"is used.\n" +"\n" +msgstr "" +"\n" +"若未指定資料目錄(DATADIR)就用環境變數 PGDATA。\n" +"\n" + +#: pg_checksums.c:95 +#, c-format +msgid "Report bugs to <%s>.\n" +msgstr "回報錯誤至 <%s>。\n" + +#: pg_checksums.c:96 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 網站: <%s>\n" + +#: pg_checksums.c:153 +#, c-format +msgid "%lld/%lld MB (%d%%) computed" +msgstr "%lld/%lld MB (%d%%) 已被計算" + +# access/transam/slru.c:638 access/transam/xlog.c:1631 +# access/transam/xlog.c:2742 access/transam/xlog.c:2832 +# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935 +# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889 +# utils/misc/database.c:68 +#: pg_checksums.c:200 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "無法開啟檔案\"%s\": %m" + +# utils/init/miscinit.c:539 +#: pg_checksums.c:214 +#, c-format +msgid "could not read block %u in file \"%s\": %m" +msgstr "ç„¡æ³•è®€å–æª”案 \"%2$s\" çš„ block %1$u: %3$m" + +#: pg_checksums.c:217 +#, c-format +msgid "could not read block %u in file \"%s\": read %d of %d" +msgstr "ç„¡æ³•è®€å–æª”案 \"%2$s\" çš„ block %1$u: å·²è®€å– %3$d / %4$d" + +#: pg_checksums.c:240 +#, c-format +msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X" +msgstr "在檔案 \"%s\" 驗證檢查碼失敗,å€å¡Š %u: 算得檢查碼 %X 但是å€å¡Šç‚º %X" + +#: pg_checksums.c:263 +#, c-format +msgid "seek failed for block %u in file \"%s\": %m" +msgstr "在檔案 \"%2$s\" 中 seek å€å¡Š %1$u 失敗: %3$m" + +# utils/init/miscinit.c:672 utils/init/miscinit.c:682 +#: pg_checksums.c:270 +#, c-format +msgid "could not write block %u in file \"%s\": %m" +msgstr "無法寫入檔案 \"%2$s\" çš„ block %1$u: %3$m" + +#: pg_checksums.c:273 +#, c-format +msgid "could not write block %u in file \"%s\": wrote %d of %d" +msgstr "無法寫入檔案 \"%2$s\" 中的å€å¡Š %1$u: 已寫入 %3$d / %4$d" + +#: pg_checksums.c:285 +#, c-format +msgid "checksums verified in file \"%s\"" +msgstr "檔案 \"%s\" 中已驗證檢查碼" + +#: pg_checksums.c:287 +#, c-format +msgid "checksums enabled in file \"%s\"" +msgstr "檔案 \"%s\" 中已啟動檢查碼" + +# access/transam/slru.c:930 commands/tablespace.c:529 +# commands/tablespace.c:694 utils/adt/misc.c:174 +#: pg_checksums.c:318 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "無法開啟目錄\"%s\": %m" + +# access/transam/xlog.c:1936 access/transam/xlog.c:2038 +# access/transam/xlog.c:5291 +#: pg_checksums.c:342 pg_checksums.c:411 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "無法å–得檔案 \"%s\" 的狀態: %m" + +#: pg_checksums.c:366 +#, c-format +msgid "invalid segment number %d in file name \"%s\"" +msgstr "檔å \"%2$s\" 中的片段編號 %1$d 無效" + +# tcop/postgres.c:2636 tcop/postgres.c:2652 +#: pg_checksums.c:508 pg_checksums.c:524 pg_checksums.c:534 pg_checksums.c:542 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "用 \"%s --help\" å–得更多資訊。" + +#: pg_checksums.c:523 +#, c-format +msgid "no data directory specified" +msgstr "未指定資料目錄" + +#: pg_checksums.c:532 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "å‘½ä»¤åˆ—åƒæ•¸éŽå¤š(第一個是 \"%s\")" + +#: pg_checksums.c:541 +#, c-format +msgid "option -f/--filenode can only be used with --check" +msgstr "é¸é … -f/--filenode åªèƒ½èˆ‡ --check 一起使用" + +#: pg_checksums.c:549 +#, c-format +msgid "pg_control CRC value is incorrect" +msgstr "pg_control çš„ CRC 值䏿­£ç¢º" + +#: pg_checksums.c:552 +#, c-format +msgid "cluster is not compatible with this version of pg_checksums" +msgstr "å¢é›†èˆ‡é€™ç‰ˆ pg_checksums ä¸ç›¸å®¹" + +#: pg_checksums.c:556 +#, c-format +msgid "database cluster is not compatible" +msgstr "資料庫å¢é›†ä¸ç›¸å®¹" + +#: pg_checksums.c:557 +#, c-format +msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u." +msgstr "資料庫å¢é›†ä½¿ç”¨å€å¡Šå¤§å° %u 進行åˆå§‹åŒ–,但 pg_checksums 編譯時使用å€å¡Šå¤§å° %u。" + +#: pg_checksums.c:569 +#, c-format +msgid "cluster must be shut down" +msgstr "必須關閉å¢é›†" + +#: pg_checksums.c:573 +#, c-format +msgid "data checksums are not enabled in cluster" +msgstr "å¢é›†æœªå•Ÿå‹•資料檢查碼" + +#: pg_checksums.c:577 +#, c-format +msgid "data checksums are already disabled in cluster" +msgstr "å¢é›†å·²é—œé–‰è³‡æ–™æª¢æŸ¥ç¢¼" + +#: pg_checksums.c:581 +#, c-format +msgid "data checksums are already enabled in cluster" +msgstr "å¢é›†å·²å•Ÿå‹•資料檢查碼" + +#: pg_checksums.c:605 +#, c-format +msgid "Checksum operation completed\n" +msgstr "驗證檢查碼作業完æˆ\n" + +#: pg_checksums.c:606 +#, c-format +msgid "Files scanned: %lld\n" +msgstr "å·²æŽƒææª”案: %lld\n" + +#: pg_checksums.c:607 +#, c-format +msgid "Blocks scanned: %lld\n" +msgstr "已掃æå€å¡Š: %lld\n" + +#: pg_checksums.c:610 +#, c-format +msgid "Bad checksums: %lld\n" +msgstr "䏿­£ç¢ºçš„æª¢æŸ¥ç¢¼: %lld\n" + +#: pg_checksums.c:611 pg_checksums.c:643 +#, c-format +msgid "Data checksum version: %u\n" +msgstr "資料檢查碼版本: %u\n" + +#: pg_checksums.c:618 +#, c-format +msgid "Files written: %lld\n" +msgstr "已寫入檔案: %lld\n" + +#: pg_checksums.c:619 +#, c-format +msgid "Blocks written: %lld\n" +msgstr "已寫入å€å¡Š: %lld\n" + +#: pg_checksums.c:635 +#, c-format +msgid "syncing data directory" +msgstr "åŒæ­¥è³‡æ–™ç›®éŒ„" + +#: pg_checksums.c:639 +#, c-format +msgid "updating control file" +msgstr "更新控制檔" + +#: pg_checksums.c:645 +#, c-format +msgid "Checksums enabled in cluster\n" +msgstr "å¢é›†å·²å•Ÿå‹•檢查碼\n" + +#: pg_checksums.c:647 +#, c-format +msgid "Checksums disabled in cluster\n" +msgstr "å¢é›†å·²é—œé–‰æª¢æŸ¥ç¢¼\n" diff --git a/src/bin/pg_checksums/t/001_basic.pl b/src/bin/pg_checksums/t/001_basic.pl index d3601a5dd84a2..c11abe142e4c6 100644 --- a/src/bin/pg_checksums/t/001_basic.pl +++ b/src/bin/pg_checksums/t/001_basic.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_checksums/t/002_actions.pl b/src/bin/pg_checksums/t/002_actions.pl index 2d63182d59f57..33e7fb53c5e16 100644 --- a/src/bin/pg_checksums/t/002_actions.pl +++ b/src/bin/pg_checksums/t/002_actions.pl @@ -1,11 +1,12 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Do basic sanity checks supported by pg_checksums using # an initialized cluster. use strict; -use warnings; +use warnings FATAL => 'all'; +use Config; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -114,6 +115,12 @@ sub check_relation_corruption append_to_file "$pgdata/global/pg_internal.init", "foo"; append_to_file "$pgdata/global/pg_internal.init.123", "foo"; +# These are non-postgres macOS files, which should be ignored by the scan. +# Only perform this test on non-macOS systems though as creating incorrect +# system files may have side effects on macOS. +append_to_file "$pgdata/global/.DS_Store", "foo" + unless ($Config{osname} eq 'darwin'); + # Enable checksums. command_ok([ 'pg_checksums', '--enable', '--no-sync', '-D', $pgdata ], "checksums successfully enabled in cluster"); diff --git a/src/bin/pg_combinebackup/.gitignore b/src/bin/pg_combinebackup/.gitignore new file mode 100644 index 0000000000000..f860b25dd99eb --- /dev/null +++ b/src/bin/pg_combinebackup/.gitignore @@ -0,0 +1,3 @@ +pg_combinebackup + +/tmp_check/ diff --git a/src/bin/pg_combinebackup/Makefile b/src/bin/pg_combinebackup/Makefile new file mode 100644 index 0000000000000..c3729755ba4ba --- /dev/null +++ b/src/bin/pg_combinebackup/Makefile @@ -0,0 +1,53 @@ +#------------------------------------------------------------------------- +# +# Makefile for src/bin/pg_combinebackup +# +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group +# Portions Copyright (c) 1994, Regents of the University of California +# +# src/bin/pg_combinebackup/Makefile +# +#------------------------------------------------------------------------- + +PGFILEDESC = "pg_combinebackup - combine incremental backups" +PGAPPICON=win32 + +subdir = src/bin/pg_combinebackup +top_builddir = ../../.. +include $(top_builddir)/src/Makefile.global + +override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) +LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils + +OBJS = \ + $(WIN32RES) \ + pg_combinebackup.o \ + backup_label.o \ + copy_file.o \ + load_manifest.o \ + reconstruct.o \ + write_manifest.o + +all: pg_combinebackup + +pg_combinebackup: $(OBJS) | submake-libpgport submake-libpgfeutils + $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) + +install: all installdirs + $(INSTALL_PROGRAM) pg_combinebackup$(X) '$(DESTDIR)$(bindir)/pg_combinebackup$(X)' + +installdirs: + $(MKDIR_P) '$(DESTDIR)$(bindir)' + +uninstall: + rm -f '$(DESTDIR)$(bindir)/pg_combinebackup$(X)' + +clean distclean maintainer-clean: + rm -f pg_combinebackup$(X) $(OBJS) + rm -rf tmp_check + +check: + $(prove_check) + +installcheck: + $(prove_installcheck) diff --git a/src/bin/pg_combinebackup/backup_label.c b/src/bin/pg_combinebackup/backup_label.c new file mode 100644 index 0000000000000..e676249247d47 --- /dev/null +++ b/src/bin/pg_combinebackup/backup_label.c @@ -0,0 +1,283 @@ +/*------------------------------------------------------------------------- + * + * Read and manipulate backup label files + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/bin/pg_combinebackup/backup_label.c + * + *------------------------------------------------------------------------- + */ +#include "postgres_fe.h" + +#include + +#include "access/xlogdefs.h" +#include "backup_label.h" +#include "common/file_perm.h" +#include "common/logging.h" +#include "write_manifest.h" + +static int get_eol_offset(StringInfo buf); +static bool line_starts_with(char *s, char *e, char *match, char **sout); +static bool parse_lsn(char *s, char *e, XLogRecPtr *lsn, char **c); +static bool parse_tli(char *s, char *e, TimeLineID *tli); + +/* + * Parse a backup label file, starting at buf->cursor. + * + * We expect to find a START WAL LOCATION line, followed by a LSN, followed + * by a space; the resulting LSN is stored into *start_lsn. + * + * We expect to find a START TIMELINE line, followed by a TLI, followed by + * a newline; the resulting TLI is stored into *start_tli. + * + * We expect to find either both INCREMENTAL FROM LSN and INCREMENTAL FROM TLI + * or neither. If these are found, they should be followed by an LSN or TLI + * respectively and then by a newline, and the values will be stored into + * *previous_lsn and *previous_tli, respectively. + * + * Other lines in the provided backup_label data are ignored. filename is used + * for error reporting; errors are fatal. + */ +void +parse_backup_label(char *filename, StringInfo buf, + TimeLineID *start_tli, XLogRecPtr *start_lsn, + TimeLineID *previous_tli, XLogRecPtr *previous_lsn) +{ + int found = 0; + + *start_tli = 0; + *start_lsn = InvalidXLogRecPtr; + *previous_tli = 0; + *previous_lsn = InvalidXLogRecPtr; + + while (buf->cursor < buf->len) + { + char *s = &buf->data[buf->cursor]; + int eo = get_eol_offset(buf); + char *e = &buf->data[eo]; + char *c; + + if (line_starts_with(s, e, "START WAL LOCATION: ", &s)) + { + if (!parse_lsn(s, e, start_lsn, &c)) + pg_fatal("%s: could not parse %s", + filename, "START WAL LOCATION"); + if (c >= e || *c != ' ') + pg_fatal("%s: improper terminator for %s", + filename, "START WAL LOCATION"); + found |= 1; + } + else if (line_starts_with(s, e, "START TIMELINE: ", &s)) + { + if (!parse_tli(s, e, start_tli)) + pg_fatal("%s: could not parse TLI for %s", + filename, "START TIMELINE"); + if (*start_tli == 0) + pg_fatal("%s: invalid TLI", filename); + found |= 2; + } + else if (line_starts_with(s, e, "INCREMENTAL FROM LSN: ", &s)) + { + if (!parse_lsn(s, e, previous_lsn, &c)) + pg_fatal("%s: could not parse %s", + filename, "INCREMENTAL FROM LSN"); + if (c >= e || *c != '\n') + pg_fatal("%s: improper terminator for %s", + filename, "INCREMENTAL FROM LSN"); + found |= 4; + } + else if (line_starts_with(s, e, "INCREMENTAL FROM TLI: ", &s)) + { + if (!parse_tli(s, e, previous_tli)) + pg_fatal("%s: could not parse %s", + filename, "INCREMENTAL FROM TLI"); + if (*previous_tli == 0) + pg_fatal("%s: invalid TLI", filename); + found |= 8; + } + + buf->cursor = eo; + } + + if ((found & 1) == 0) + pg_fatal("%s: could not find %s", filename, "START WAL LOCATION"); + if ((found & 2) == 0) + pg_fatal("%s: could not find %s", filename, "START TIMELINE"); + if ((found & 4) != 0 && (found & 8) == 0) + pg_fatal("%s: %s requires %s", filename, + "INCREMENTAL FROM LSN", "INCREMENTAL FROM TLI"); + if ((found & 8) != 0 && (found & 4) == 0) + pg_fatal("%s: %s requires %s", filename, + "INCREMENTAL FROM TLI", "INCREMENTAL FROM LSN"); +} + +/* + * Write a backup label file to the output directory. + * + * This will be identical to the provided backup_label file, except that the + * INCREMENTAL FROM LSN and INCREMENTAL FROM TLI lines will be omitted. + * + * The new file will be checksummed using the specified algorithm. If + * mwriter != NULL, it will be added to the manifest. + */ +void +write_backup_label(char *output_directory, StringInfo buf, + pg_checksum_type checksum_type, manifest_writer *mwriter) +{ + char output_filename[MAXPGPATH]; + int output_fd; + pg_checksum_context checksum_ctx; + uint8 checksum_payload[PG_CHECKSUM_MAX_LENGTH]; + int checksum_length; + + pg_checksum_init(&checksum_ctx, checksum_type); + + snprintf(output_filename, MAXPGPATH, "%s/backup_label", output_directory); + + if ((output_fd = open(output_filename, + O_WRONLY | O_CREAT | O_EXCL | PG_BINARY, + pg_file_create_mode)) < 0) + pg_fatal("could not open file \"%s\": %m", output_filename); + + while (buf->cursor < buf->len) + { + char *s = &buf->data[buf->cursor]; + int eo = get_eol_offset(buf); + char *e = &buf->data[eo]; + + if (!line_starts_with(s, e, "INCREMENTAL FROM LSN: ", NULL) && + !line_starts_with(s, e, "INCREMENTAL FROM TLI: ", NULL)) + { + ssize_t wb; + + wb = write(output_fd, s, e - s); + if (wb != e - s) + { + if (wb < 0) + pg_fatal("could not write file \"%s\": %m", output_filename); + else + pg_fatal("could not write file \"%s\": wrote %d of %d", + output_filename, (int) wb, (int) (e - s)); + } + if (pg_checksum_update(&checksum_ctx, (uint8 *) s, e - s) < 0) + pg_fatal("could not update checksum of file \"%s\"", + output_filename); + } + + buf->cursor = eo; + } + + if (close(output_fd) != 0) + pg_fatal("could not close file \"%s\": %m", output_filename); + + checksum_length = pg_checksum_final(&checksum_ctx, checksum_payload); + + if (mwriter != NULL) + { + struct stat sb; + + /* + * We could track the length ourselves, but must stat() to get the + * mtime. + */ + if (stat(output_filename, &sb) < 0) + pg_fatal("could not stat file \"%s\": %m", output_filename); + add_file_to_manifest(mwriter, "backup_label", sb.st_size, + sb.st_mtime, checksum_type, + checksum_length, checksum_payload); + } +} + +/* + * Return the offset at which the next line in the buffer starts, or there + * is none, the offset at which the buffer ends. + * + * The search begins at buf->cursor. + */ +static int +get_eol_offset(StringInfo buf) +{ + int eo = buf->cursor; + + while (eo < buf->len) + { + if (buf->data[eo] == '\n') + return eo + 1; + ++eo; + } + + return eo; +} + +/* + * Test whether the line that runs from s to e (inclusive of *s, but not + * inclusive of *e) starts with the match string provided, and return true + * or false according to whether or not this is the case. + * + * If the function returns true and if *sout != NULL, stores a pointer to the + * byte following the match into *sout. + */ +static bool +line_starts_with(char *s, char *e, char *match, char **sout) +{ + while (s < e && *match != '\0' && *s == *match) + ++s, ++match; + + if (*match == '\0' && sout != NULL) + *sout = s; + + return (*match == '\0'); +} + +/* + * Parse an LSN starting at s and not stopping at or before e. The return value + * is true on success and otherwise false. On success, stores the result into + * *lsn and sets *c to the first character that is not part of the LSN. + */ +static bool +parse_lsn(char *s, char *e, XLogRecPtr *lsn, char **c) +{ + char save = *e; + int nchars; + bool success; + unsigned hi; + unsigned lo; + + *e = '\0'; + success = (sscanf(s, "%X/%X%n", &hi, &lo, &nchars) == 2); + *e = save; + + if (success) + { + *lsn = ((XLogRecPtr) hi) << 32 | (XLogRecPtr) lo; + *c = s + nchars; + } + + return success; +} + +/* + * Parse a TLI starting at s and stopping at or before e. The return value is + * true on success and otherwise false. On success, stores the result into + * *tli. If the first character that is not part of the TLI is anything other + * than a newline, that is deemed a failure. + */ +static bool +parse_tli(char *s, char *e, TimeLineID *tli) +{ + char save = *e; + int nchars; + bool success; + + *e = '\0'; + success = (sscanf(s, "%u%n", tli, &nchars) == 1); + *e = save; + + if (success && s[nchars] != '\n') + success = false; + + return success; +} diff --git a/src/bin/pg_combinebackup/backup_label.h b/src/bin/pg_combinebackup/backup_label.h new file mode 100644 index 0000000000000..e2fc8dd4ce1fe --- /dev/null +++ b/src/bin/pg_combinebackup/backup_label.h @@ -0,0 +1,30 @@ +/*------------------------------------------------------------------------- + * + * Read and manipulate backup label files + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/bin/pg_combinebackup/backup_label.h + * + *------------------------------------------------------------------------- + */ +#ifndef BACKUP_LABEL_H +#define BACKUP_LABEL_H + +#include "access/xlogdefs.h" +#include "common/checksum_helper.h" +#include "lib/stringinfo.h" + +struct manifest_writer; + +extern void parse_backup_label(char *filename, StringInfo buf, + TimeLineID *start_tli, + XLogRecPtr *start_lsn, + TimeLineID *previous_tli, + XLogRecPtr *previous_lsn); +extern void write_backup_label(char *output_directory, StringInfo buf, + pg_checksum_type checksum_type, + struct manifest_writer *mwriter); + +#endif /* BACKUP_LABEL_H */ diff --git a/src/bin/pg_combinebackup/copy_file.c b/src/bin/pg_combinebackup/copy_file.c new file mode 100644 index 0000000000000..57a7c3a202c39 --- /dev/null +++ b/src/bin/pg_combinebackup/copy_file.c @@ -0,0 +1,306 @@ +/* + * Copy entire files. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/bin/pg_combinebackup/copy_file.h + * + *------------------------------------------------------------------------- + */ +#include "postgres_fe.h" + +#ifdef HAVE_COPYFILE_H +#include +#endif +#ifdef __linux__ +#include +#include +#endif +#include +#include +#include +#include + +#include "common/file_perm.h" +#include "common/logging.h" +#include "copy_file.h" + +static void copy_file_blocks(const char *src, const char *dst, + pg_checksum_context *checksum_ctx); + +static void copy_file_clone(const char *src, const char *dest, + pg_checksum_context *checksum_ctx); + +static void copy_file_by_range(const char *src, const char *dest, + pg_checksum_context *checksum_ctx); + +#ifdef WIN32 +static void copy_file_copyfile(const char *src, const char *dst, + pg_checksum_context *checksum_ctx); +#endif + +/* + * Copy a regular file, optionally computing a checksum, and emitting + * appropriate debug messages. But if we're in dry-run mode, then just emit + * the messages and don't copy anything. + */ +void +copy_file(const char *src, const char *dst, + pg_checksum_context *checksum_ctx, + CopyMethod copy_method, bool dry_run) +{ + char *strategy_name = NULL; + void (*strategy_implementation) (const char *, const char *, + pg_checksum_context *checksum_ctx) = NULL; + + /* + * In dry-run mode, we don't actually copy anything, nor do we read any + * data from the source file, but we do verify that we can open it. + */ + if (dry_run) + { + int fd; + + if ((fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0) + pg_fatal("could not open file \"%s\": %m", src); + if (close(fd) < 0) + pg_fatal("could not close file \"%s\": %m", src); + } + +#ifdef WIN32 + copy_method = COPY_METHOD_COPYFILE; +#endif + + /* Determine the name of the copy strategy for use in log messages. */ + switch (copy_method) + { + case COPY_METHOD_CLONE: + strategy_name = "clone"; + strategy_implementation = copy_file_clone; + break; + case COPY_METHOD_COPY: + /* leave NULL for simple block-by-block copy */ + strategy_implementation = copy_file_blocks; + break; + case COPY_METHOD_COPY_FILE_RANGE: + strategy_name = "copy_file_range"; + strategy_implementation = copy_file_by_range; + break; +#ifdef WIN32 + case COPY_METHOD_COPYFILE: + strategy_name = "CopyFile"; + strategy_implementation = copy_file_copyfile; + break; +#endif + } + + if (dry_run) + { + if (strategy_name) + pg_log_debug("would copy \"%s\" to \"%s\" using strategy %s", + src, dst, strategy_name); + else + pg_log_debug("would copy \"%s\" to \"%s\"", + src, dst); + } + else + { + if (strategy_name) + pg_log_debug("copying \"%s\" to \"%s\" using strategy %s", + src, dst, strategy_name); + else if (checksum_ctx->type == CHECKSUM_TYPE_NONE) + pg_log_debug("copying \"%s\" to \"%s\"", + src, dst); + else + pg_log_debug("copying \"%s\" to \"%s\" and checksumming with %s", + src, dst, pg_checksum_type_name(checksum_ctx->type)); + + strategy_implementation(src, dst, checksum_ctx); + } +} + +/* + * Calculate checksum for the src file. + */ +static void +checksum_file(const char *src, pg_checksum_context *checksum_ctx) +{ + int src_fd; + uint8 *buffer; + const int buffer_size = 50 * BLCKSZ; + ssize_t rb; + + /* bail out if no checksum needed */ + if (checksum_ctx->type == CHECKSUM_TYPE_NONE) + return; + + if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0) + pg_fatal("could not open file \"%s\": %m", src); + + buffer = pg_malloc(buffer_size); + + while ((rb = read(src_fd, buffer, buffer_size)) > 0) + { + if (pg_checksum_update(checksum_ctx, buffer, rb) < 0) + pg_fatal("could not update checksum of file \"%s\"", src); + } + + if (rb < 0) + pg_fatal("could not read file \"%s\": %m", src); + + pg_free(buffer); + close(src_fd); +} + +/* + * Copy a file block by block, and optionally compute a checksum as we go. + */ +static void +copy_file_blocks(const char *src, const char *dst, + pg_checksum_context *checksum_ctx) +{ + int src_fd; + int dest_fd; + uint8 *buffer; + const int buffer_size = 50 * BLCKSZ; + ssize_t rb; + unsigned offset = 0; + + if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0) + pg_fatal("could not open file \"%s\": %m", src); + + if ((dest_fd = open(dst, O_WRONLY | O_CREAT | O_EXCL | PG_BINARY, + pg_file_create_mode)) < 0) + pg_fatal("could not open file \"%s\": %m", dst); + + buffer = pg_malloc(buffer_size); + + while ((rb = read(src_fd, buffer, buffer_size)) > 0) + { + ssize_t wb; + + if ((wb = write(dest_fd, buffer, rb)) != rb) + { + if (wb < 0) + pg_fatal("could not write to file \"%s\": %m", dst); + else + pg_fatal("could not write to file \"%s\", offset %u: wrote %d of %d", + dst, offset, (int) wb, (int) rb); + } + + if (pg_checksum_update(checksum_ctx, buffer, rb) < 0) + pg_fatal("could not update checksum of file \"%s\"", dst); + + offset += rb; + } + + if (rb < 0) + pg_fatal("could not read from file \"%s\": %m", dst); + + pg_free(buffer); + close(src_fd); + close(dest_fd); +} + +/* + * copy_file_clone + * Clones/reflinks a file from src to dest. + * + * If needed, also reads the file and calculates the checksum. + */ +static void +copy_file_clone(const char *src, const char *dest, + pg_checksum_context *checksum_ctx) +{ +#if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE) + if (copyfile(src, dest, NULL, COPYFILE_CLONE_FORCE) < 0) + pg_fatal("error while cloning file \"%s\" to \"%s\": %m", src, dest); +#elif defined(__linux__) && defined(FICLONE) + { + int src_fd; + int dest_fd; + + if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0) + pg_fatal("could not open file \"%s\": %m", src); + + if ((dest_fd = open(dest, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, + pg_file_create_mode)) < 0) + pg_fatal("could not create file \"%s\": %m", dest); + + if (ioctl(dest_fd, FICLONE, src_fd) < 0) + { + int save_errno = errno; + + unlink(dest); + + pg_fatal("error while cloning file \"%s\" to \"%s\": %s", + src, dest, strerror(save_errno)); + } + + close(src_fd); + close(dest_fd); + } +#else + pg_fatal("file cloning not supported on this platform"); +#endif + + /* if needed, calculate checksum of the file */ + checksum_file(src, checksum_ctx); +} + +/* + * copy_file_by_range + * Copies a file from src to dest using copy_file_range system call. + * + * If needed, also reads the file and calculates the checksum. + */ +static void +copy_file_by_range(const char *src, const char *dest, + pg_checksum_context *checksum_ctx) +{ +#if defined(HAVE_COPY_FILE_RANGE) + int src_fd; + int dest_fd; + ssize_t nbytes; + + if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0) + pg_fatal("could not open file \"%s\": %m", src); + + if ((dest_fd = open(dest, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, + pg_file_create_mode)) < 0) + pg_fatal("could not create file \"%s\": %m", dest); + + do + { + nbytes = copy_file_range(src_fd, NULL, dest_fd, NULL, SSIZE_MAX, 0); + if (nbytes < 0) + pg_fatal("error while copying file range from \"%s\" to \"%s\": %m", + src, dest); + } while (nbytes > 0); + + close(src_fd); + close(dest_fd); +#else + pg_fatal("copy_file_range not supported on this platform"); +#endif + + /* if needed, calculate checksum of the file */ + checksum_file(src, checksum_ctx); +} + +#ifdef WIN32 +static void +copy_file_copyfile(const char *src, const char *dst, + pg_checksum_context *checksum_ctx) +{ + if (CopyFile(src, dst, true) == 0) + { + _dosmaperr(GetLastError()); + pg_fatal("could not copy file \"%s\" to \"%s\": %m", src, dst); + } + + /* if needed, calculate checksum of the file */ + checksum_file(src, checksum_ctx); +} +#endif /* WIN32 */ diff --git a/src/bin/pg_combinebackup/copy_file.h b/src/bin/pg_combinebackup/copy_file.h new file mode 100644 index 0000000000000..cedb760738561 --- /dev/null +++ b/src/bin/pg_combinebackup/copy_file.h @@ -0,0 +1,35 @@ +/* + * Copy entire files. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/bin/pg_combinebackup/copy_file.h + * + *------------------------------------------------------------------------- + */ +#ifndef COPY_FILE_H +#define COPY_FILE_H + +#include "c.h" +#include "common/checksum_helper.h" +#include "common/file_utils.h" + +/* + * Enumeration to denote copy modes. + */ +typedef enum CopyMethod +{ + COPY_METHOD_CLONE, + COPY_METHOD_COPY, + COPY_METHOD_COPY_FILE_RANGE, +#ifdef WIN32 + COPY_METHOD_COPYFILE, +#endif +} CopyMethod; + +extern void copy_file(const char *src, const char *dst, + pg_checksum_context *checksum_ctx, + CopyMethod copy_method, bool dry_run); + +#endif /* COPY_FILE_H */ diff --git a/src/bin/pg_combinebackup/load_manifest.c b/src/bin/pg_combinebackup/load_manifest.c new file mode 100644 index 0000000000000..298c883c17f6b --- /dev/null +++ b/src/bin/pg_combinebackup/load_manifest.c @@ -0,0 +1,314 @@ +/*------------------------------------------------------------------------- + * + * Load data from a backup manifest into memory. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/bin/pg_combinebackup/load_manifest.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres_fe.h" + +#include +#include + +#include "common/hashfn_unstable.h" +#include "common/logging.h" +#include "common/parse_manifest.h" +#include "load_manifest.h" + +/* + * For efficiency, we'd like our hash table containing information about the + * manifest to start out with approximately the correct number of entries. + * There's no way to know the exact number of entries without reading the whole + * file, but we can get an estimate by dividing the file size by the estimated + * number of bytes per line. + * + * This could be off by about a factor of two in either direction, because the + * checksum algorithm has a big impact on the line lengths; e.g. a SHA512 + * checksum is 128 hex bytes, whereas a CRC-32C value is only 8, and there + * might be no checksum at all. + */ +#define ESTIMATED_BYTES_PER_MANIFEST_LINE 100 + +/* + * size of json chunk to be read in + * + */ +#define READ_CHUNK_SIZE (128 * 1024) + +/* + * Define a hash table which we can use to store information about the files + * mentioned in the backup manifest. + */ +#define SH_PREFIX manifest_files +#define SH_ELEMENT_TYPE manifest_file +#define SH_KEY_TYPE const char * +#define SH_KEY pathname +#define SH_HASH_KEY(tb, key) hash_string(key) +#define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0) +#define SH_SCOPE extern +#define SH_RAW_ALLOCATOR pg_malloc0 +#define SH_DEFINE +#include "lib/simplehash.h" + +static void combinebackup_version_cb(JsonManifestParseContext *context, + int manifest_version); +static void combinebackup_system_identifier_cb(JsonManifestParseContext *context, + uint64 manifest_system_identifier); +static void combinebackup_per_file_cb(JsonManifestParseContext *context, + const char *pathname, size_t size, + pg_checksum_type checksum_type, + int checksum_length, + uint8 *checksum_payload); +static void combinebackup_per_wal_range_cb(JsonManifestParseContext *context, + TimeLineID tli, + XLogRecPtr start_lsn, + XLogRecPtr end_lsn); +static void report_manifest_error(JsonManifestParseContext *context, + const char *fmt,...) + pg_attribute_printf(2, 3) pg_attribute_noreturn(); + +/* + * Load backup_manifest files from an array of backups and produces an array + * of manifest_data objects. + * + * NB: Since load_backup_manifest() can return NULL, the resulting array could + * contain NULL entries. + */ +manifest_data ** +load_backup_manifests(int n_backups, char **backup_directories) +{ + manifest_data **result; + int i; + + result = pg_malloc(sizeof(manifest_data *) * n_backups); + for (i = 0; i < n_backups; ++i) + result[i] = load_backup_manifest(backup_directories[i]); + + return result; +} + +/* + * Parse the backup_manifest file in the named backup directory. Construct a + * hash table with information about all the files it mentions, and a linked + * list of all the WAL ranges it mentions. + * + * If the backup_manifest file simply doesn't exist, logs a warning and returns + * NULL. Any other error, or any error parsing the contents of the file, is + * fatal. + */ +manifest_data * +load_backup_manifest(char *backup_directory) +{ + char pathname[MAXPGPATH]; + int fd; + struct stat statbuf; + off_t estimate; + uint32 initial_size; + manifest_files_hash *ht; + char *buffer; + int rc; + JsonManifestParseContext context; + manifest_data *result; + int chunk_size = READ_CHUNK_SIZE; + + /* Open the manifest file. */ + snprintf(pathname, MAXPGPATH, "%s/backup_manifest", backup_directory); + if ((fd = open(pathname, O_RDONLY | PG_BINARY, 0)) < 0) + { + if (errno == ENOENT) + { + pg_log_warning("file \"%s\" does not exist", pathname); + return NULL; + } + pg_fatal("could not open file \"%s\": %m", pathname); + } + + /* Figure out how big the manifest is. */ + if (fstat(fd, &statbuf) != 0) + pg_fatal("could not stat file \"%s\": %m", pathname); + + /* Guess how large to make the hash table based on the manifest size. */ + estimate = statbuf.st_size / ESTIMATED_BYTES_PER_MANIFEST_LINE; + initial_size = Min(PG_UINT32_MAX, Max(estimate, 256)); + + /* Create the hash table. */ + ht = manifest_files_create(initial_size, NULL); + + result = pg_malloc0(sizeof(manifest_data)); + result->files = ht; + context.private_data = result; + context.version_cb = combinebackup_version_cb; + context.system_identifier_cb = combinebackup_system_identifier_cb; + context.per_file_cb = combinebackup_per_file_cb; + context.per_wal_range_cb = combinebackup_per_wal_range_cb; + context.error_cb = report_manifest_error; + + /* + * Parse the file, in chunks if necessary. + */ + if (statbuf.st_size <= chunk_size) + { + buffer = pg_malloc(statbuf.st_size); + rc = read(fd, buffer, statbuf.st_size); + if (rc != statbuf.st_size) + { + if (rc < 0) + pg_fatal("could not read file \"%s\": %m", pathname); + else + pg_fatal("could not read file \"%s\": read %d of %lld", + pathname, rc, (long long int) statbuf.st_size); + } + + /* Close the manifest file. */ + close(fd); + + /* Parse the manifest. */ + json_parse_manifest(&context, buffer, statbuf.st_size); + } + else + { + int bytes_left = statbuf.st_size; + JsonManifestParseIncrementalState *inc_state; + + inc_state = json_parse_manifest_incremental_init(&context); + + buffer = pg_malloc(chunk_size + 1); + + while (bytes_left > 0) + { + int bytes_to_read = chunk_size; + + /* + * Make sure that the last chunk is sufficiently large. (i.e. at + * least half the chunk size) so that it will contain fully the + * piece at the end with the checksum. + */ + if (bytes_left < chunk_size) + bytes_to_read = bytes_left; + else if (bytes_left < 2 * chunk_size) + bytes_to_read = bytes_left / 2; + rc = read(fd, buffer, bytes_to_read); + if (rc != bytes_to_read) + { + if (rc < 0) + pg_fatal("could not read file \"%s\": %m", pathname); + else + pg_fatal("could not read file \"%s\": read %lld of %lld", + pathname, + (long long int) (statbuf.st_size + rc - bytes_left), + (long long int) statbuf.st_size); + } + bytes_left -= rc; + json_parse_manifest_incremental_chunk(inc_state, buffer, rc, bytes_left == 0); + } + + /* Release the incremental state memory */ + json_parse_manifest_incremental_shutdown(inc_state); + + close(fd); + } + + /* All done. */ + pfree(buffer); + return result; +} + +/* + * Report an error while parsing the manifest. + * + * We consider all such errors to be fatal errors. The manifest parser + * expects this function not to return. + */ +static void +report_manifest_error(JsonManifestParseContext *context, const char *fmt,...) +{ + va_list ap; + + va_start(ap, fmt); + pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, gettext(fmt), ap); + va_end(ap); + + exit(1); +} + +/* + * This callback to validate the manifest version number for incremental backup. + */ +static void +combinebackup_version_cb(JsonManifestParseContext *context, + int manifest_version) +{ + /* Incremental backups supported on manifest version 2 or later */ + if (manifest_version == 1) + pg_fatal("backup manifest version 1 does not support incremental backup"); +} + +/* + * Record system identifier extracted from the backup manifest. + */ +static void +combinebackup_system_identifier_cb(JsonManifestParseContext *context, + uint64 manifest_system_identifier) +{ + manifest_data *manifest = context->private_data; + + /* Validation will be at the later stage */ + manifest->system_identifier = manifest_system_identifier; +} + +/* + * Record details extracted from the backup manifest for one file. + */ +static void +combinebackup_per_file_cb(JsonManifestParseContext *context, + const char *pathname, size_t size, + pg_checksum_type checksum_type, + int checksum_length, uint8 *checksum_payload) +{ + manifest_data *manifest = context->private_data; + manifest_file *m; + bool found; + + /* Make a new entry in the hash table for this file. */ + m = manifest_files_insert(manifest->files, pathname, &found); + if (found) + pg_fatal("duplicate path name in backup manifest: \"%s\"", pathname); + + /* Initialize the entry. */ + m->size = size; + m->checksum_type = checksum_type; + m->checksum_length = checksum_length; + m->checksum_payload = checksum_payload; +} + +/* + * Record details extracted from the backup manifest for one WAL range. + */ +static void +combinebackup_per_wal_range_cb(JsonManifestParseContext *context, + TimeLineID tli, + XLogRecPtr start_lsn, XLogRecPtr end_lsn) +{ + manifest_data *manifest = context->private_data; + manifest_wal_range *range; + + /* Allocate and initialize a struct describing this WAL range. */ + range = palloc(sizeof(manifest_wal_range)); + range->tli = tli; + range->start_lsn = start_lsn; + range->end_lsn = end_lsn; + range->prev = manifest->last_wal_range; + range->next = NULL; + + /* Add it to the end of the list. */ + if (manifest->first_wal_range == NULL) + manifest->first_wal_range = range; + else + manifest->last_wal_range->next = range; + manifest->last_wal_range = range; +} diff --git a/src/bin/pg_combinebackup/load_manifest.h b/src/bin/pg_combinebackup/load_manifest.h new file mode 100644 index 0000000000000..a96ae12eb8ed4 --- /dev/null +++ b/src/bin/pg_combinebackup/load_manifest.h @@ -0,0 +1,68 @@ +/*------------------------------------------------------------------------- + * + * Load data from a backup manifest into memory. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/bin/pg_combinebackup/load_manifest.h + * + *------------------------------------------------------------------------- + */ +#ifndef LOAD_MANIFEST_H +#define LOAD_MANIFEST_H + +#include "access/xlogdefs.h" +#include "common/checksum_helper.h" + +/* + * Each file described by the manifest file is parsed to produce an object + * like this. + */ +typedef struct manifest_file +{ + uint32 status; /* hash status */ + const char *pathname; + size_t size; + pg_checksum_type checksum_type; + int checksum_length; + uint8 *checksum_payload; +} manifest_file; + +#define SH_PREFIX manifest_files +#define SH_ELEMENT_TYPE manifest_file +#define SH_KEY_TYPE const char * +#define SH_SCOPE extern +#define SH_RAW_ALLOCATOR pg_malloc0 +#define SH_DECLARE +#include "lib/simplehash.h" + +/* + * Each WAL range described by the manifest file is parsed to produce an + * object like this. + */ +typedef struct manifest_wal_range +{ + TimeLineID tli; + XLogRecPtr start_lsn; + XLogRecPtr end_lsn; + struct manifest_wal_range *next; + struct manifest_wal_range *prev; +} manifest_wal_range; + +/* + * All the data parsed from a backup_manifest file. + */ +typedef struct manifest_data +{ + uint64 system_identifier; + manifest_files_hash *files; + manifest_wal_range *first_wal_range; + manifest_wal_range *last_wal_range; +} manifest_data; + +extern manifest_data *load_backup_manifest(char *backup_directory); +extern manifest_data **load_backup_manifests(int n_backups, + char **backup_directories); + +#endif /* LOAD_MANIFEST_H */ diff --git a/src/bin/pg_combinebackup/meson.build b/src/bin/pg_combinebackup/meson.build new file mode 100644 index 0000000000000..550d3503269f3 --- /dev/null +++ b/src/bin/pg_combinebackup/meson.build @@ -0,0 +1,44 @@ +# Copyright (c) 2022-2024, PostgreSQL Global Development Group + +pg_combinebackup_sources = files( + 'pg_combinebackup.c', + 'backup_label.c', + 'copy_file.c', + 'load_manifest.c', + 'reconstruct.c', + 'write_manifest.c', +) + +if host_system == 'windows' + pg_combinebackup_sources += rc_bin_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'pg_combinebackup', + '--FILEDESC', 'pg_combinebackup - combine incremental backups',]) +endif + +pg_combinebackup = executable('pg_combinebackup', + pg_combinebackup_sources, + dependencies: [frontend_code], + kwargs: default_bin_args, +) +bin_targets += pg_combinebackup + +tests += { + 'name': 'pg_combinebackup', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tap': { + 'tests': [ + 't/001_basic.pl', + 't/002_compare_backups.pl', + 't/003_timeline.pl', + 't/004_manifest.pl', + 't/005_integrity.pl', + 't/006_db_file_copy.pl', + 't/007_wal_level_minimal.pl', + 't/008_promote.pl', + 't/009_no_full_file.pl', + ], + } +} + +subdir('po', if_found: libintl) diff --git a/src/bin/pg_combinebackup/nls.mk b/src/bin/pg_combinebackup/nls.mk new file mode 100644 index 0000000000000..55dc173a17e24 --- /dev/null +++ b/src/bin/pg_combinebackup/nls.mk @@ -0,0 +1,24 @@ +# src/bin/pg_combinebackup/nls.mk +CATALOG_NAME = pg_combinebackup +GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ + backup_label.c \ + copy_file.c \ + load_manifest.c \ + pg_combinebackup.c \ + reconstruct.c \ + write_manifest.c \ + ../../common/controldata_utils.c \ + ../../common/cryptohash.c \ + ../../common/cryptohash_openssl.c \ + ../../common/fe_memutils.c \ + ../../common/file_utils.c \ + ../../common/jsonapi.c \ + ../../common/parse_manifest.c \ + ../../fe_utils/option_utils.c +GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \ + json_token_error:2 \ + json_manifest_parse_failure:2 \ + error_cb:2 +GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \ + json_token_error:2:c-format \ + error_cb:2:c-format diff --git a/src/bin/pg_combinebackup/pg_combinebackup.c b/src/bin/pg_combinebackup/pg_combinebackup.c new file mode 100644 index 0000000000000..98a422c580088 --- /dev/null +++ b/src/bin/pg_combinebackup/pg_combinebackup.c @@ -0,0 +1,1409 @@ +/*------------------------------------------------------------------------- + * + * pg_combinebackup.c + * Combine incremental backups with prior backups. + * + * Copyright (c) 2017-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/bin/pg_combinebackup/pg_combinebackup.c + * + *------------------------------------------------------------------------- + */ +#include "postgres_fe.h" + +#include +#include +#include + +#ifdef HAVE_COPYFILE_H +#include +#endif +#ifdef __linux__ +#include +#include +#endif + +#include "backup_label.h" +#include "common/blkreftable.h" +#include "common/checksum_helper.h" +#include "common/controldata_utils.h" +#include "common/file_perm.h" +#include "common/file_utils.h" +#include "common/logging.h" +#include "copy_file.h" +#include "fe_utils/option_utils.h" +#include "getopt_long.h" +#include "lib/stringinfo.h" +#include "load_manifest.h" +#include "reconstruct.h" +#include "write_manifest.h" + +/* Incremental file naming convention. */ +#define INCREMENTAL_PREFIX "INCREMENTAL." +#define INCREMENTAL_PREFIX_LENGTH (sizeof(INCREMENTAL_PREFIX) - 1) + +/* + * Tracking for directories that need to be removed, or have their contents + * removed, if the operation fails. + */ +typedef struct cb_cleanup_dir +{ + char *target_path; + bool rmtopdir; + struct cb_cleanup_dir *next; +} cb_cleanup_dir; + +/* + * Stores a tablespace mapping provided using -T, --tablespace-mapping. + */ +typedef struct cb_tablespace_mapping +{ + char old_dir[MAXPGPATH]; + char new_dir[MAXPGPATH]; + struct cb_tablespace_mapping *next; +} cb_tablespace_mapping; + +/* + * Stores data parsed from all command-line options. + */ +typedef struct cb_options +{ + bool debug; + char *output; + bool dry_run; + bool no_sync; + cb_tablespace_mapping *tsmappings; + pg_checksum_type manifest_checksums; + bool no_manifest; + DataDirSyncMethod sync_method; + CopyMethod copy_method; +} cb_options; + +/* + * Data about a tablespace. + * + * Every normal tablespace needs a tablespace mapping, but in-place tablespaces + * don't, so the list of tablespaces can contain more entries than the list of + * tablespace mappings. + */ +typedef struct cb_tablespace +{ + Oid oid; + bool in_place; + char old_dir[MAXPGPATH]; + char new_dir[MAXPGPATH]; + struct cb_tablespace *next; +} cb_tablespace; + +/* Directories to be removed if we exit uncleanly. */ +cb_cleanup_dir *cleanup_dir_list = NULL; + +static void add_tablespace_mapping(cb_options *opt, char *arg); +static StringInfo check_backup_label_files(int n_backups, char **backup_dirs); +static uint64 check_control_files(int n_backups, char **backup_dirs); +static void check_input_dir_permissions(char *dir); +static void cleanup_directories_atexit(void); +static void create_output_directory(char *dirname, cb_options *opt); +static void help(const char *progname); +static bool parse_oid(char *s, Oid *result); +static void process_directory_recursively(Oid tsoid, + char *input_directory, + char *output_directory, + char *relative_path, + int n_prior_backups, + char **prior_backup_dirs, + manifest_data **manifests, + manifest_writer *mwriter, + cb_options *opt); +static int read_pg_version_file(char *directory); +static void remember_to_cleanup_directory(char *target_path, bool rmtopdir); +static void reset_directory_cleanup_list(void); +static cb_tablespace *scan_for_existing_tablespaces(char *pathname, + cb_options *opt); +static void slurp_file(int fd, char *filename, StringInfo buf, int maxlen); + +/* + * Main program. + */ +int +main(int argc, char *argv[]) +{ + static struct option long_options[] = { + {"debug", no_argument, NULL, 'd'}, + {"dry-run", no_argument, NULL, 'n'}, + {"no-sync", no_argument, NULL, 'N'}, + {"output", required_argument, NULL, 'o'}, + {"tablespace-mapping", required_argument, NULL, 'T'}, + {"manifest-checksums", required_argument, NULL, 1}, + {"no-manifest", no_argument, NULL, 2}, + {"sync-method", required_argument, NULL, 3}, + {"clone", no_argument, NULL, 4}, + {"copy", no_argument, NULL, 5}, + {"copy-file-range", no_argument, NULL, 6}, + {NULL, 0, NULL, 0} + }; + + const char *progname; + char *last_input_dir; + int i; + int optindex; + int c; + int n_backups; + int n_prior_backups; + int version; + uint64 system_identifier; + char **prior_backup_dirs; + cb_options opt; + cb_tablespace *tablespaces; + cb_tablespace *ts; + StringInfo last_backup_label; + manifest_data **manifests; + manifest_writer *mwriter; + + pg_logging_init(argv[0]); + progname = get_progname(argv[0]); + set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_combinebackup")); + handle_help_version_opts(argc, argv, progname, help); + + memset(&opt, 0, sizeof(opt)); + opt.manifest_checksums = CHECKSUM_TYPE_CRC32C; + opt.sync_method = DATA_DIR_SYNC_METHOD_FSYNC; + opt.copy_method = COPY_METHOD_COPY; + + /* process command-line options */ + while ((c = getopt_long(argc, argv, "dnNo:T:", + long_options, &optindex)) != -1) + { + switch (c) + { + case 'd': + opt.debug = true; + pg_logging_increase_verbosity(); + break; + case 'n': + opt.dry_run = true; + break; + case 'N': + opt.no_sync = true; + break; + case 'o': + opt.output = optarg; + break; + case 'T': + add_tablespace_mapping(&opt, optarg); + break; + case 1: + if (!pg_checksum_parse_type(optarg, + &opt.manifest_checksums)) + pg_fatal("unrecognized checksum algorithm: \"%s\"", + optarg); + break; + case 2: + opt.no_manifest = true; + break; + case 3: + if (!parse_sync_method(optarg, &opt.sync_method)) + exit(1); + break; + case 4: + opt.copy_method = COPY_METHOD_CLONE; + break; + case 5: + opt.copy_method = COPY_METHOD_COPY; + break; + case 6: + opt.copy_method = COPY_METHOD_COPY_FILE_RANGE; + break; + default: + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + } + + if (optind >= argc) + { + pg_log_error("no input directories specified"); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + + if (opt.output == NULL) + pg_fatal("no output directory specified"); + + /* If no manifest is needed, no checksums are needed, either. */ + if (opt.no_manifest) + opt.manifest_checksums = CHECKSUM_TYPE_NONE; + + /* Check that the platform supports the requested copy method. */ + if (opt.copy_method == COPY_METHOD_CLONE) + { +#if (defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE)) || \ + (defined(__linux__) && defined(FICLONE)) + + if (opt.dry_run) + pg_log_debug("would use cloning to copy files"); + else + pg_log_debug("will use cloning to copy files"); + +#else + pg_fatal("file cloning not supported on this platform"); +#endif + } + else if (opt.copy_method == COPY_METHOD_COPY_FILE_RANGE) + { +#if defined(HAVE_COPY_FILE_RANGE) + + if (opt.dry_run) + pg_log_debug("would use copy_file_range to copy blocks"); + else + pg_log_debug("will use copy_file_range to copy blocks"); + +#else + pg_fatal("copy_file_range not supported on this platform"); +#endif + } + + /* Read the server version from the final backup. */ + version = read_pg_version_file(argv[argc - 1]); + + /* Sanity-check control files. */ + n_backups = argc - optind; + system_identifier = check_control_files(n_backups, argv + optind); + + /* Sanity-check backup_label files, and get the contents of the last one. */ + last_backup_label = check_backup_label_files(n_backups, argv + optind); + + /* + * We'll need the pathnames to the prior backups. By "prior" we mean all + * but the last one listed on the command line. + */ + n_prior_backups = argc - optind - 1; + prior_backup_dirs = argv + optind; + + /* Load backup manifests. */ + manifests = load_backup_manifests(n_backups, prior_backup_dirs); + + /* + * Validate the manifest system identifier against the backup system + * identifier. + */ + for (i = 0; i < n_backups; i++) + { + if (manifests[i] && + manifests[i]->system_identifier != system_identifier) + { + char *controlpath; + + controlpath = psprintf("%s/%s", prior_backup_dirs[i], "global/pg_control"); + + pg_fatal("%s: manifest system identifier is %llu, but control file has %llu", + controlpath, + (unsigned long long) manifests[i]->system_identifier, + (unsigned long long) system_identifier); + } + } + + /* Figure out which tablespaces are going to be included in the output. */ + last_input_dir = argv[argc - 1]; + check_input_dir_permissions(last_input_dir); + tablespaces = scan_for_existing_tablespaces(last_input_dir, &opt); + + /* + * Create output directories. + * + * We create one output directory for the main data directory plus one for + * each non-in-place tablespace. create_output_directory() will arrange + * for those directories to be cleaned up on failure. In-place tablespaces + * aren't handled at this stage because they're located beneath the main + * output directory, and thus the cleanup of that directory will get rid + * of them. Plus, the pg_tblspc directory that needs to contain them + * doesn't exist yet. + */ + atexit(cleanup_directories_atexit); + create_output_directory(opt.output, &opt); + for (ts = tablespaces; ts != NULL; ts = ts->next) + if (!ts->in_place) + create_output_directory(ts->new_dir, &opt); + + /* If we need to write a backup_manifest, prepare to do so. */ + if (!opt.dry_run && !opt.no_manifest) + { + mwriter = create_manifest_writer(opt.output, system_identifier); + + /* + * Verify that we have a backup manifest for the final backup; else we + * won't have the WAL ranges for the resulting manifest. + */ + if (manifests[n_prior_backups] == NULL) + pg_fatal("cannot generate a manifest because no manifest is available for the final input backup"); + } + else + mwriter = NULL; + + /* Write backup label into output directory. */ + if (opt.dry_run) + pg_log_debug("would generate \"%s/backup_label\"", opt.output); + else + { + pg_log_debug("generating \"%s/backup_label\"", opt.output); + last_backup_label->cursor = 0; + write_backup_label(opt.output, last_backup_label, + opt.manifest_checksums, mwriter); + } + + /* Process everything that's not part of a user-defined tablespace. */ + pg_log_debug("processing backup directory \"%s\"", last_input_dir); + process_directory_recursively(InvalidOid, last_input_dir, opt.output, + NULL, n_prior_backups, prior_backup_dirs, + manifests, mwriter, &opt); + + /* Process user-defined tablespaces. */ + for (ts = tablespaces; ts != NULL; ts = ts->next) + { + pg_log_debug("processing tablespace directory \"%s\"", ts->old_dir); + + /* + * If it's a normal tablespace, we need to set up a symbolic link from + * pg_tblspc/${OID} to the target directory; if it's an in-place + * tablespace, we need to create a directory at pg_tblspc/${OID}. + */ + if (!ts->in_place) + { + char linkpath[MAXPGPATH]; + + snprintf(linkpath, MAXPGPATH, "%s/pg_tblspc/%u", opt.output, + ts->oid); + + if (opt.dry_run) + pg_log_debug("would create symbolic link from \"%s\" to \"%s\"", + linkpath, ts->new_dir); + else + { + pg_log_debug("creating symbolic link from \"%s\" to \"%s\"", + linkpath, ts->new_dir); + if (symlink(ts->new_dir, linkpath) != 0) + pg_fatal("could not create symbolic link from \"%s\" to \"%s\": %m", + linkpath, ts->new_dir); + } + } + else + { + if (opt.dry_run) + pg_log_debug("would create directory \"%s\"", ts->new_dir); + else + { + pg_log_debug("creating directory \"%s\"", ts->new_dir); + if (pg_mkdir_p(ts->new_dir, pg_dir_create_mode) == -1) + pg_fatal("could not create directory \"%s\": %m", + ts->new_dir); + } + } + + /* OK, now handle the directory contents. */ + process_directory_recursively(ts->oid, ts->old_dir, ts->new_dir, + NULL, n_prior_backups, prior_backup_dirs, + manifests, mwriter, &opt); + } + + /* Finalize the backup_manifest, if we're generating one. */ + if (mwriter != NULL) + finalize_manifest(mwriter, + manifests[n_prior_backups]->first_wal_range); + + /* fsync that output directory unless we've been told not to do so */ + if (!opt.no_sync) + { + if (opt.dry_run) + pg_log_debug("would recursively fsync \"%s\"", opt.output); + else + { + pg_log_debug("recursively fsyncing \"%s\"", opt.output); + sync_pgdata(opt.output, version * 10000, opt.sync_method); + } + } + + /* It's a success, so don't remove the output directories. */ + reset_directory_cleanup_list(); + exit(0); +} + +/* + * Process the option argument for the -T, --tablespace-mapping switch. + */ +static void +add_tablespace_mapping(cb_options *opt, char *arg) +{ + cb_tablespace_mapping *tsmap = pg_malloc0(sizeof(cb_tablespace_mapping)); + char *dst; + char *dst_ptr; + char *arg_ptr; + + /* + * Basically, we just want to copy everything before the equals sign to + * tsmap->old_dir and everything afterwards to tsmap->new_dir, but if + * there's more or less than one equals sign, that's an error, and if + * there's an equals sign preceded by a backslash, don't treat it as a + * field separator but instead copy a literal equals sign. + */ + dst_ptr = dst = tsmap->old_dir; + for (arg_ptr = arg; *arg_ptr != '\0'; arg_ptr++) + { + if (dst_ptr - dst >= MAXPGPATH) + pg_fatal("directory name too long"); + + if (*arg_ptr == '\\' && *(arg_ptr + 1) == '=') + ; /* skip backslash escaping = */ + else if (*arg_ptr == '=' && (arg_ptr == arg || *(arg_ptr - 1) != '\\')) + { + if (tsmap->new_dir[0] != '\0') + pg_fatal("multiple \"=\" signs in tablespace mapping"); + else + dst = dst_ptr = tsmap->new_dir; + } + else + *dst_ptr++ = *arg_ptr; + } + if (!tsmap->old_dir[0] || !tsmap->new_dir[0]) + pg_fatal("invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"", arg); + + /* + * All tablespaces are created with absolute directories, so specifying a + * non-absolute path here would never match, possibly confusing users. + * + * In contrast to pg_basebackup, both the old and new directories are on + * the local machine, so the local machine's definition of an absolute + * path is the only relevant one. + */ + if (!is_absolute_path(tsmap->old_dir)) + pg_fatal("old directory is not an absolute path in tablespace mapping: %s", + tsmap->old_dir); + + if (!is_absolute_path(tsmap->new_dir)) + pg_fatal("old directory is not an absolute path in tablespace mapping: %s", + tsmap->new_dir); + + /* Canonicalize paths to avoid spurious failures when comparing. */ + canonicalize_path(tsmap->old_dir); + canonicalize_path(tsmap->new_dir); + + /* Add it to the list. */ + tsmap->next = opt->tsmappings; + opt->tsmappings = tsmap; +} + +/* + * Check that the backup_label files form a coherent backup chain, and return + * the contents of the backup_label file from the latest backup. + */ +static StringInfo +check_backup_label_files(int n_backups, char **backup_dirs) +{ + StringInfo buf = makeStringInfo(); + StringInfo lastbuf = buf; + int i; + TimeLineID check_tli = 0; + XLogRecPtr check_lsn = InvalidXLogRecPtr; + + /* Try to read each backup_label file in turn, last to first. */ + for (i = n_backups - 1; i >= 0; --i) + { + char pathbuf[MAXPGPATH]; + int fd; + TimeLineID start_tli; + TimeLineID previous_tli; + XLogRecPtr start_lsn; + XLogRecPtr previous_lsn; + + /* Open the backup_label file. */ + snprintf(pathbuf, MAXPGPATH, "%s/backup_label", backup_dirs[i]); + pg_log_debug("reading \"%s\"", pathbuf); + if ((fd = open(pathbuf, O_RDONLY, 0)) < 0) + pg_fatal("could not open file \"%s\": %m", pathbuf); + + /* + * Slurp the whole file into memory. + * + * The exact size limit that we impose here doesn't really matter -- + * most of what's supposed to be in the file is fixed size and quite + * short. However, the length of the backup_label is limited (at least + * by some parts of the code) to MAXPGPATH, so include that value in + * the maximum length that we tolerate. + */ + slurp_file(fd, pathbuf, buf, 10000 + MAXPGPATH); + + /* Close the file. */ + if (close(fd) != 0) + pg_fatal("could not close file \"%s\": %m", pathbuf); + + /* Parse the file contents. */ + parse_backup_label(pathbuf, buf, &start_tli, &start_lsn, + &previous_tli, &previous_lsn); + + /* + * Sanity checks. + * + * XXX. It's actually not required that start_lsn == check_lsn. It + * would be OK if start_lsn > check_lsn provided that start_lsn is + * less than or equal to the relevant switchpoint. But at the moment + * we don't have that information. + */ + if (i > 0 && previous_tli == 0) + pg_fatal("backup at \"%s\" is a full backup, but only the first backup should be a full backup", + backup_dirs[i]); + if (i == 0 && previous_tli != 0) + pg_fatal("backup at \"%s\" is an incremental backup, but the first backup should be a full backup", + backup_dirs[i]); + if (i < n_backups - 1 && start_tli != check_tli) + pg_fatal("backup at \"%s\" starts on timeline %u, but expected %u", + backup_dirs[i], start_tli, check_tli); + if (i < n_backups - 1 && start_lsn != check_lsn) + pg_fatal("backup at \"%s\" starts at LSN %X/%X, but expected %X/%X", + backup_dirs[i], + LSN_FORMAT_ARGS(start_lsn), + LSN_FORMAT_ARGS(check_lsn)); + check_tli = previous_tli; + check_lsn = previous_lsn; + + /* + * The last backup label in the chain needs to be saved for later use, + * while the others are only needed within this loop. + */ + if (lastbuf == buf) + buf = makeStringInfo(); + else + resetStringInfo(buf); + } + + /* Free memory that we don't need any more. */ + if (lastbuf != buf) + destroyStringInfo(buf); + + /* + * Return the data from the first backup_info that we read (which is the + * backup_label from the last directory specified on the command line). + */ + return lastbuf; +} + +/* + * Sanity check control files and return system_identifier. + */ +static uint64 +check_control_files(int n_backups, char **backup_dirs) +{ + int i; + uint64 system_identifier = 0; /* placate compiler */ + uint32 data_checksum_version = 0; /* placate compiler */ + bool data_checksum_mismatch = false; + + /* Try to read each control file in turn, last to first. */ + for (i = n_backups - 1; i >= 0; --i) + { + ControlFileData *control_file; + bool crc_ok; + char *controlpath; + + controlpath = psprintf("%s/%s", backup_dirs[i], "global/pg_control"); + pg_log_debug("reading \"%s\"", controlpath); + control_file = get_controlfile_by_exact_path(controlpath, &crc_ok); + + /* Control file contents not meaningful if CRC is bad. */ + if (!crc_ok) + pg_fatal("%s: CRC is incorrect", controlpath); + + /* Can't interpret control file if not current version. */ + if (control_file->pg_control_version != PG_CONTROL_VERSION) + pg_fatal("%s: unexpected control file version", + controlpath); + + /* System identifiers should all match. */ + if (i == n_backups - 1) + system_identifier = control_file->system_identifier; + else if (system_identifier != control_file->system_identifier) + pg_fatal("%s: expected system identifier %llu, but found %llu", + controlpath, (unsigned long long) system_identifier, + (unsigned long long) control_file->system_identifier); + + /* + * Detect checksum mismatches, but only if the last backup in the + * chain has checksums enabled. + */ + if (i == n_backups - 1) + data_checksum_version = control_file->data_checksum_version; + else if (data_checksum_version != 0 && + data_checksum_version != control_file->data_checksum_version) + data_checksum_mismatch = true; + + /* Release memory. */ + pfree(control_file); + pfree(controlpath); + } + + /* + * If debug output is enabled, make a note of the system identifier that + * we found in all of the relevant control files. + */ + pg_log_debug("system identifier is %llu", + (unsigned long long) system_identifier); + + /* + * Warn the user if not all backups are in the same state with regards to + * checksums. + */ + if (data_checksum_mismatch) + { + pg_log_warning("only some backups have checksums enabled"); + pg_log_warning_hint("Disable, and optionally reenable, checksums on the output directory to avoid failures."); + } + + return system_identifier; +} + +/* + * Set default permissions for new files and directories based on the + * permissions of the given directory. The intent here is that the output + * directory should use the same permissions scheme as the final input + * directory. + */ +static void +check_input_dir_permissions(char *dir) +{ + struct stat st; + + if (stat(dir, &st) != 0) + pg_fatal("could not stat file \"%s\": %m", dir); + + SetDataDirectoryCreatePerm(st.st_mode); +} + +/* + * Clean up output directories before exiting. + */ +static void +cleanup_directories_atexit(void) +{ + while (cleanup_dir_list != NULL) + { + cb_cleanup_dir *dir = cleanup_dir_list; + + if (dir->rmtopdir) + { + pg_log_info("removing output directory \"%s\"", dir->target_path); + if (!rmtree(dir->target_path, dir->rmtopdir)) + pg_log_error("failed to remove output directory"); + } + else + { + pg_log_info("removing contents of output directory \"%s\"", + dir->target_path); + if (!rmtree(dir->target_path, dir->rmtopdir)) + pg_log_error("failed to remove contents of output directory"); + } + + cleanup_dir_list = cleanup_dir_list->next; + pfree(dir); + } +} + +/* + * Create the named output directory, unless it already exists or we're in + * dry-run mode. If it already exists but is not empty, that's a fatal error. + * + * Adds the created directory to the list of directories to be cleaned up + * at process exit. + */ +static void +create_output_directory(char *dirname, cb_options *opt) +{ + switch (pg_check_dir(dirname)) + { + case 0: + if (opt->dry_run) + { + pg_log_debug("would create directory \"%s\"", dirname); + return; + } + pg_log_debug("creating directory \"%s\"", dirname); + if (pg_mkdir_p(dirname, pg_dir_create_mode) == -1) + pg_fatal("could not create directory \"%s\": %m", dirname); + remember_to_cleanup_directory(dirname, true); + break; + + case 1: + pg_log_debug("using existing directory \"%s\"", dirname); + remember_to_cleanup_directory(dirname, false); + break; + + case 2: + case 3: + case 4: + pg_fatal("directory \"%s\" exists but is not empty", dirname); + + case -1: + pg_fatal("could not access directory \"%s\": %m", dirname); + } +} + +/* + * help + * + * Prints help page for the program + * + * progname: the name of the executed program, such as "pg_combinebackup" + */ +static void +help(const char *progname) +{ + printf(_("%s reconstructs full backups from incrementals.\n\n"), progname); + printf(_("Usage:\n")); + printf(_(" %s [OPTION]... DIRECTORY...\n"), progname); + printf(_("\nOptions:\n")); + printf(_(" -d, --debug generate lots of debugging output\n")); + printf(_(" -n, --dry-run do not actually do anything\n")); + printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n")); + printf(_(" -o, --output=DIRECTORY output directory\n")); + printf(_(" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" + " relocate tablespace in OLDDIR to NEWDIR\n")); + printf(_(" --clone clone (reflink) files instead of copying\n")); + printf(_(" --copy copy files (default)\n")); + printf(_(" --copy-file-range copy using copy_file_range() system call\n")); + printf(_(" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" + " use algorithm for manifest checksums\n")); + printf(_(" --no-manifest suppress generation of backup manifest\n")); + printf(_(" --sync-method=METHOD set method for syncing files to disk\n")); + printf(_(" -V, --version output version information, then exit\n")); + printf(_(" -?, --help show this help, then exit\n")); + + printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); + printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL); +} + +/* + * Try to parse a string as a non-zero OID without leading zeroes. + * + * If it works, return true and set *result to the answer, else return false. + */ +static bool +parse_oid(char *s, Oid *result) +{ + Oid oid; + char *ep; + + errno = 0; + oid = strtoul(s, &ep, 10); + if (errno != 0 || *ep != '\0' || oid < 1 || oid > PG_UINT32_MAX) + return false; + + *result = oid; + return true; +} + +/* + * Copy files from the input directory to the output directory, reconstructing + * full files from incremental files as required. + * + * If processing a user-defined tablespace, the tsoid should be the OID + * of that tablespace and input_directory and output_directory should be the + * toplevel input and output directories for that tablespace. Otherwise, + * tsoid should be InvalidOid and input_directory and output_directory should + * be the main input and output directories. + * + * relative_path is the path beneath the given input and output directories + * that we are currently processing. If NULL, it indicates that we're + * processing the input and output directories themselves. + * + * n_prior_backups is the number of prior backups that we have available. + * This doesn't count the very last backup, which is referenced by + * input_directory, just the older ones. prior_backup_dirs is an array of + * the locations of those previous backups. + */ +static void +process_directory_recursively(Oid tsoid, + char *input_directory, + char *output_directory, + char *relative_path, + int n_prior_backups, + char **prior_backup_dirs, + manifest_data **manifests, + manifest_writer *mwriter, + cb_options *opt) +{ + char ifulldir[MAXPGPATH]; + char ofulldir[MAXPGPATH]; + char manifest_prefix[MAXPGPATH]; + DIR *dir; + struct dirent *de; + bool is_pg_tblspc = false; + bool is_pg_wal = false; + bool is_incremental_dir = false; + manifest_data *latest_manifest = manifests[n_prior_backups]; + pg_checksum_type checksum_type; + + /* + * Classify this directory. + * + * We set is_pg_tblspc only for the toplevel pg_tblspc directory, because + * the symlinks in that specific directory require special handling. + * + * We set is_pg_wal for the toplevel WAL directory and all of its + * subdirectories, because those files are not included in the backup + * manifest and hence need special treatement. (Since incremental backup + * does not exist in pre-v10 versions, we don't have to worry about the + * old pg_xlog naming.) + * + * We set is_incremental_dir for directories that can contain incremental + * files requiring reconstruction. If such files occur outside these + * directories, we want to just copy them straight to the output + * directory. This is to protect against a user creating a file with a + * strange name like INCREMENTAL.config and then complaining that + * incremental backups don't work properly. The test here is a bit tricky: + * incremental files occur in subdirectories of base, in pg_global itself, + * and in subdirectories of pg_tblspc only if in-place tablespaces are + * used. + */ + if (OidIsValid(tsoid)) + is_incremental_dir = true; + else if (relative_path != NULL) + { + is_pg_tblspc = strcmp(relative_path, "pg_tblspc") == 0; + is_pg_wal = (strcmp(relative_path, "pg_wal") == 0 || + strncmp(relative_path, "pg_wal/", 7) == 0); + is_incremental_dir = strncmp(relative_path, "base/", 5) == 0 || + strcmp(relative_path, "global") == 0 || + strncmp(relative_path, "pg_tblspc/", 10) == 0; + } + + /* + * If we're under pg_wal, then we don't need checksums, because these + * files aren't included in the backup manifest. Otherwise use whatever + * type of checksum is configured. + */ + if (!is_pg_wal) + checksum_type = opt->manifest_checksums; + else + checksum_type = CHECKSUM_TYPE_NONE; + + /* + * Append the relative path to the input and output directories, and + * figure out the appropriate prefix to add to files in this directory + * when looking them up in a backup manifest. + */ + if (relative_path == NULL) + { + strlcpy(ifulldir, input_directory, MAXPGPATH); + strlcpy(ofulldir, output_directory, MAXPGPATH); + if (OidIsValid(tsoid)) + snprintf(manifest_prefix, MAXPGPATH, "pg_tblspc/%u/", tsoid); + else + manifest_prefix[0] = '\0'; + } + else + { + snprintf(ifulldir, MAXPGPATH, "%s/%s", input_directory, + relative_path); + snprintf(ofulldir, MAXPGPATH, "%s/%s", output_directory, + relative_path); + if (OidIsValid(tsoid)) + snprintf(manifest_prefix, MAXPGPATH, "pg_tblspc/%u/%s/", + tsoid, relative_path); + else + snprintf(manifest_prefix, MAXPGPATH, "%s/", relative_path); + } + + /* + * Toplevel output directories have already been created by the time this + * function is called, but any subdirectories are our responsibility. + */ + if (relative_path != NULL) + { + if (opt->dry_run) + pg_log_debug("would create directory \"%s\"", ofulldir); + else + { + pg_log_debug("creating directory \"%s\"", ofulldir); + if (mkdir(ofulldir, pg_dir_create_mode) == -1) + pg_fatal("could not create directory \"%s\": %m", ofulldir); + } + } + + /* It's time to scan the directory. */ + if ((dir = opendir(ifulldir)) == NULL) + pg_fatal("could not open directory \"%s\": %m", ifulldir); + while (errno = 0, (de = readdir(dir)) != NULL) + { + PGFileType type; + char ifullpath[MAXPGPATH]; + char ofullpath[MAXPGPATH]; + char manifest_path[MAXPGPATH]; + Oid oid = InvalidOid; + int checksum_length = 0; + uint8 *checksum_payload = NULL; + pg_checksum_context checksum_ctx; + + /* Ignore "." and ".." entries. */ + if (strcmp(de->d_name, ".") == 0 || + strcmp(de->d_name, "..") == 0) + continue; + + /* Construct input path. */ + snprintf(ifullpath, MAXPGPATH, "%s/%s", ifulldir, de->d_name); + + /* Figure out what kind of directory entry this is. */ + type = get_dirent_type(ifullpath, de, false, PG_LOG_ERROR); + if (type == PGFILETYPE_ERROR) + exit(1); + + /* + * If we're processing pg_tblspc, then check whether the filename + * looks like it could be a tablespace OID. If so, and if the + * directory entry is a symbolic link or a directory, skip it. + * + * Our goal here is to ignore anything that would have been considered + * by scan_for_existing_tablespaces to be a tablespace. + */ + if (is_pg_tblspc && parse_oid(de->d_name, &oid) && + (type == PGFILETYPE_LNK || type == PGFILETYPE_DIR)) + continue; + + /* If it's a directory, recurse. */ + if (type == PGFILETYPE_DIR) + { + char new_relative_path[MAXPGPATH]; + + /* Append new pathname component to relative path. */ + if (relative_path == NULL) + strlcpy(new_relative_path, de->d_name, MAXPGPATH); + else + snprintf(new_relative_path, MAXPGPATH, "%s/%s", relative_path, + de->d_name); + + /* And recurse. */ + process_directory_recursively(tsoid, + input_directory, output_directory, + new_relative_path, + n_prior_backups, prior_backup_dirs, + manifests, mwriter, opt); + continue; + } + + /* Skip anything that's not a regular file. */ + if (type != PGFILETYPE_REG) + { + if (type == PGFILETYPE_LNK) + pg_log_warning("skipping symbolic link \"%s\"", ifullpath); + else + pg_log_warning("skipping special file \"%s\"", ifullpath); + continue; + } + + /* + * Skip the backup_label and backup_manifest files; they require + * special handling and are handled elsewhere. + */ + if (relative_path == NULL && + (strcmp(de->d_name, "backup_label") == 0 || + strcmp(de->d_name, "backup_manifest") == 0)) + continue; + + /* + * If it's an incremental file, hand it off to the reconstruction + * code, which will figure out what to do. + */ + if (is_incremental_dir && + strncmp(de->d_name, INCREMENTAL_PREFIX, + INCREMENTAL_PREFIX_LENGTH) == 0) + { + /* Output path should not include "INCREMENTAL." prefix. */ + snprintf(ofullpath, MAXPGPATH, "%s/%s", ofulldir, + de->d_name + INCREMENTAL_PREFIX_LENGTH); + + + /* Manifest path likewise omits incremental prefix. */ + snprintf(manifest_path, MAXPGPATH, "%s%s", manifest_prefix, + de->d_name + INCREMENTAL_PREFIX_LENGTH); + + /* Reconstruction logic will do the rest. */ + reconstruct_from_incremental_file(ifullpath, ofullpath, + manifest_prefix, + de->d_name + INCREMENTAL_PREFIX_LENGTH, + n_prior_backups, + prior_backup_dirs, + manifests, + manifest_path, + checksum_type, + &checksum_length, + &checksum_payload, + opt->copy_method, + opt->debug, + opt->dry_run); + } + else + { + /* Construct the path that the backup_manifest will use. */ + snprintf(manifest_path, MAXPGPATH, "%s%s", manifest_prefix, + de->d_name); + + /* + * It's not an incremental file, so we need to copy the entire + * file to the output directory. + * + * If a checksum of the required type already exists in the + * backup_manifest for the final input directory, we can save some + * work by reusing that checksum instead of computing a new one. + */ + if (checksum_type != CHECKSUM_TYPE_NONE && + latest_manifest != NULL) + { + manifest_file *mfile; + + mfile = manifest_files_lookup(latest_manifest->files, + manifest_path); + if (mfile == NULL) + { + char *bmpath; + + /* + * The directory is out of sync with the backup_manifest, + * so emit a warning. + */ + bmpath = psprintf("%s/%s", input_directory, + "backup_manifest"); + pg_log_warning("manifest file \"%s\" contains no entry for file \"%s\"", + bmpath, manifest_path); + pfree(bmpath); + } + else if (mfile->checksum_type == checksum_type) + { + checksum_length = mfile->checksum_length; + checksum_payload = mfile->checksum_payload; + } + } + + /* + * If we're reusing a checksum, then we don't need copy_file() to + * compute one for us, but otherwise, it needs to compute whatever + * type of checksum we need. + */ + if (checksum_length != 0) + pg_checksum_init(&checksum_ctx, CHECKSUM_TYPE_NONE); + else + pg_checksum_init(&checksum_ctx, checksum_type); + + /* Actually copy the file. */ + snprintf(ofullpath, MAXPGPATH, "%s/%s", ofulldir, de->d_name); + copy_file(ifullpath, ofullpath, &checksum_ctx, + opt->copy_method, opt->dry_run); + + /* + * If copy_file() performed a checksum calculation for us, then + * save the results (except in dry-run mode, when there's no + * point). + */ + if (checksum_ctx.type != CHECKSUM_TYPE_NONE && !opt->dry_run) + { + checksum_payload = pg_malloc(PG_CHECKSUM_MAX_LENGTH); + checksum_length = pg_checksum_final(&checksum_ctx, + checksum_payload); + } + } + + /* Generate manifest entry, if needed. */ + if (mwriter != NULL) + { + struct stat sb; + + /* + * In order to generate a manifest entry, we need the file size + * and mtime. We have no way to know the correct mtime except to + * stat() the file, so just do that and get the size as well. + * + * If we didn't need the mtime here, we could try to obtain the + * file size from the reconstruction or file copy process above, + * although that is actually not convenient in all cases. If we + * write the file ourselves then clearly we can keep a count of + * bytes, but if we use something like CopyFile() then it's + * trickier. Since we have to stat() anyway to get the mtime, + * there's no point in worrying about it. + */ + if (stat(ofullpath, &sb) < 0) + pg_fatal("could not stat file \"%s\": %m", ofullpath); + + /* OK, now do the work. */ + add_file_to_manifest(mwriter, manifest_path, + sb.st_size, sb.st_mtime, + checksum_type, checksum_length, + checksum_payload); + } + + /* Avoid leaking memory. */ + if (checksum_payload != NULL) + pfree(checksum_payload); + } + + closedir(dir); +} + +/* + * Read the version number from PG_VERSION and convert it to the usual server + * version number format. (e.g. If PG_VERSION contains "14\n" this function + * will return 140000) + */ +static int +read_pg_version_file(char *directory) +{ + char filename[MAXPGPATH]; + StringInfoData buf; + int fd; + int version; + char *ep; + + /* Construct pathname. */ + snprintf(filename, MAXPGPATH, "%s/PG_VERSION", directory); + + /* Open file. */ + if ((fd = open(filename, O_RDONLY, 0)) < 0) + pg_fatal("could not open file \"%s\": %m", filename); + + /* Read into memory. Length limit of 128 should be more than generous. */ + initStringInfo(&buf); + slurp_file(fd, filename, &buf, 128); + + /* Close the file. */ + if (close(fd) != 0) + pg_fatal("could not close file \"%s\": %m", filename); + + /* Convert to integer. */ + errno = 0; + version = strtoul(buf.data, &ep, 10); + if (errno != 0 || *ep != '\n') + { + /* + * Incremental backup is not relevant to very old server versions that + * used multi-part version number (e.g. 9.6, or 8.4). So if we see + * what looks like the beginning of such a version number, just bail + * out. + */ + if (version < 10 && *ep == '.') + pg_fatal("%s: server version too old", filename); + pg_fatal("%s: could not parse version number", filename); + } + + /* Debugging output. */ + pg_log_debug("read server version %d from file \"%s\"", version, filename); + + /* Release memory and return result. */ + pfree(buf.data); + return version * 10000; +} + +/* + * Add a directory to the list of output directories to clean up. + */ +static void +remember_to_cleanup_directory(char *target_path, bool rmtopdir) +{ + cb_cleanup_dir *dir = pg_malloc(sizeof(cb_cleanup_dir)); + + dir->target_path = target_path; + dir->rmtopdir = rmtopdir; + dir->next = cleanup_dir_list; + cleanup_dir_list = dir; +} + +/* + * Empty out the list of directories scheduled for cleanup at exit. + * + * We want to remove the output directories only on a failure, so call this + * function when we know that the operation has succeeded. + * + * Since we only expect this to be called when we're about to exit, we could + * just set cleanup_dir_list to NULL and be done with it, but we free the + * memory to be tidy. + */ +static void +reset_directory_cleanup_list(void) +{ + while (cleanup_dir_list != NULL) + { + cb_cleanup_dir *dir = cleanup_dir_list; + + cleanup_dir_list = cleanup_dir_list->next; + pfree(dir); + } +} + +/* + * Scan the pg_tblspc directory of the final input backup to get a canonical + * list of what tablespaces are part of the backup. + * + * 'pathname' should be the path to the toplevel backup directory for the + * final backup in the backup chain. + */ +static cb_tablespace * +scan_for_existing_tablespaces(char *pathname, cb_options *opt) +{ + char pg_tblspc[MAXPGPATH]; + DIR *dir; + struct dirent *de; + cb_tablespace *tslist = NULL; + + snprintf(pg_tblspc, MAXPGPATH, "%s/pg_tblspc", pathname); + pg_log_debug("scanning \"%s\"", pg_tblspc); + + if ((dir = opendir(pg_tblspc)) == NULL) + pg_fatal("could not open directory \"%s\": %m", pg_tblspc); + + while (errno = 0, (de = readdir(dir)) != NULL) + { + Oid oid; + char tblspcdir[MAXPGPATH]; + char link_target[MAXPGPATH]; + int link_length; + cb_tablespace *ts; + cb_tablespace *otherts; + PGFileType type; + + /* Silently ignore "." and ".." entries. */ + if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) + continue; + + /* Construct full pathname. */ + snprintf(tblspcdir, MAXPGPATH, "%s/%s", pg_tblspc, de->d_name); + + /* Ignore any file name that doesn't look like a proper OID. */ + if (!parse_oid(de->d_name, &oid)) + { + pg_log_debug("skipping \"%s\" because the filename is not a legal tablespace OID", + tblspcdir); + continue; + } + + /* Only symbolic links and directories are tablespaces. */ + type = get_dirent_type(tblspcdir, de, false, PG_LOG_ERROR); + if (type == PGFILETYPE_ERROR) + exit(1); + if (type != PGFILETYPE_LNK && type != PGFILETYPE_DIR) + { + pg_log_debug("skipping \"%s\" because it is neither a symbolic link nor a directory", + tblspcdir); + continue; + } + + /* Create a new tablespace object. */ + ts = pg_malloc0(sizeof(cb_tablespace)); + ts->oid = oid; + + /* + * If it's a link, it's not an in-place tablespace. Otherwise, it must + * be a directory, and thus an in-place tablespace. + */ + if (type == PGFILETYPE_LNK) + { + cb_tablespace_mapping *tsmap; + + /* Read the link target. */ + link_length = readlink(tblspcdir, link_target, sizeof(link_target)); + if (link_length < 0) + pg_fatal("could not read symbolic link \"%s\": %m", + tblspcdir); + if (link_length >= sizeof(link_target)) + pg_fatal("target of symbolic link \"%s\" is too long", tblspcdir); + link_target[link_length] = '\0'; + if (!is_absolute_path(link_target)) + pg_fatal("target of symbolic link \"%s\" is relative", tblspcdir); + + /* Canonicalize the link target. */ + canonicalize_path(link_target); + + /* + * Find the corresponding tablespace mapping and copy the relevant + * details into the new tablespace entry. + */ + for (tsmap = opt->tsmappings; tsmap != NULL; tsmap = tsmap->next) + { + if (strcmp(tsmap->old_dir, link_target) == 0) + { + strlcpy(ts->old_dir, tsmap->old_dir, MAXPGPATH); + strlcpy(ts->new_dir, tsmap->new_dir, MAXPGPATH); + ts->in_place = false; + break; + } + } + + /* Every non-in-place tablespace must be mapped. */ + if (tsmap == NULL) + pg_fatal("tablespace at \"%s\" has no tablespace mapping", + link_target); + } + else + { + /* + * For an in-place tablespace, there's no separate directory, so + * we just record the paths within the data directories. + */ + snprintf(ts->old_dir, MAXPGPATH, "%s/%s", pg_tblspc, de->d_name); + snprintf(ts->new_dir, MAXPGPATH, "%s/pg_tblspc/%s", opt->output, + de->d_name); + ts->in_place = true; + } + + /* Tablespaces should not share a directory. */ + for (otherts = tslist; otherts != NULL; otherts = otherts->next) + if (strcmp(ts->new_dir, otherts->new_dir) == 0) + pg_fatal("tablespaces with OIDs %u and %u both point at directory \"%s\"", + otherts->oid, oid, ts->new_dir); + + /* Add this tablespace to the list. */ + ts->next = tslist; + tslist = ts; + } + + if (closedir(dir) != 0) + pg_fatal("could not close directory \"%s\": %m", pg_tblspc); + + return tslist; +} + +/* + * Read a file into a StringInfo. + * + * fd is used for the actual file I/O, filename for error reporting purposes. + * A file longer than maxlen is a fatal error. + */ +static void +slurp_file(int fd, char *filename, StringInfo buf, int maxlen) +{ + struct stat st; + ssize_t rb; + + /* Check file size, and complain if it's too large. */ + if (fstat(fd, &st) != 0) + pg_fatal("could not stat file \"%s\": %m", filename); + if (st.st_size > maxlen) + pg_fatal("file \"%s\" is too large", filename); + + /* Make sure we have enough space. */ + enlargeStringInfo(buf, st.st_size); + + /* Read the data. */ + rb = read(fd, &buf->data[buf->len], st.st_size); + + /* + * We don't expect any concurrent changes, so we should read exactly the + * expected number of bytes. + */ + if (rb != st.st_size) + { + if (rb < 0) + pg_fatal("could not read file \"%s\": %m", filename); + else + pg_fatal("could not read file \"%s\": read %zd of %lld", + filename, rb, (long long int) st.st_size); + } + + /* Adjust buffer length for new data and restore trailing-\0 invariant */ + buf->len += rb; + buf->data[buf->len] = '\0'; +} diff --git a/src/bin/pg_combinebackup/po/LINGUAS b/src/bin/pg_combinebackup/po/LINGUAS new file mode 100644 index 0000000000000..a6af4f7c83594 --- /dev/null +++ b/src/bin/pg_combinebackup/po/LINGUAS @@ -0,0 +1 @@ +de es fr ja ka ko ru sv uk diff --git a/src/bin/pg_combinebackup/po/de.po b/src/bin/pg_combinebackup/po/de.po new file mode 100644 index 0000000000000..a5f9c0675217d --- /dev/null +++ b/src/bin/pg_combinebackup/po/de.po @@ -0,0 +1,899 @@ +# German message translation file for pg_combinebackup +# Copyright (C) 2024 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_combinebackup (PostgreSQL) package. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_combinebackup (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-11-07 13:52+0000\n" +"PO-Revision-Date: 2024-11-07 15:31+0100\n" +"Last-Translator: Peter Eisentraut \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "Fehler: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "Warnung: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "Tipp: " + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" + +#: ../../common/controldata_utils.c:110 copy_file.c:150 load_manifest.c:161 +#: load_manifest.c:199 pg_combinebackup.c:1400 reconstruct.c:540 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "konnte Datei »%s« nicht lesen: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: backup_label.c:174 copy_file.c:68 pg_combinebackup.c:538 +#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:740 +#: write_manifest.c:187 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schließen: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "falsche Byte-Reihenfolge" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"möglicherweise falsche Byte-Reihenfolge\n" +"Die Byte-Reihenfolge, die zur Speicherung der Datei pg_control verwendet wurde,\n" +"stimmt möglicherweise nicht mit der von diesem Programm verwendeten überein. In\n" +"diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n" +"wäre inkompatibel mit diesem Datenverzeichnis." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 backup_label.c:143 copy_file.c:66 +#: copy_file.c:139 copy_file.c:171 copy_file.c:175 copy_file.c:225 +#: copy_file.c:268 load_manifest.c:128 pg_combinebackup.c:523 +#: pg_combinebackup.c:1167 reconstruct.c:523 reconstruct.c:638 +#: write_manifest.c:250 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "konnte Datei »%s« nicht öffnen: %m" + +#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:759 +#: write_manifest.c:260 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schreiben: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "konnte Datei »%s« nicht fsyncen: %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:853 +#, c-format +msgid "out of memory" +msgstr "Speicher aufgebraucht" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "Erfolg" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "Zielpuffer ist zu klein" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "OpenSSL-Fehler" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "Speicher aufgebraucht\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: backup_label.c:187 load_manifest.c:133 pg_combinebackup.c:676 +#: pg_combinebackup.c:1131 pg_combinebackup.c:1383 reconstruct.c:204 +#: reconstruct.c:421 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_combinebackup.c:933 pg_combinebackup.c:1256 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht lesen: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" + +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "Parser mit rekursivem Abstieg kann inkrementellen Lexer nicht benutzen." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "Inkrementeller Parser benötigt inkrementellen Lexer." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON zu tief geschachtelt, maximale erlaubte Tiefe ist 6400." + +#: ../../common/jsonapi.c:2127 +#, c-format +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "Escape-Sequenz »\\%.*s« ist nicht gültig." + +#: ../../common/jsonapi.c:2131 +#, c-format +msgid "Character with value 0x%02x must be escaped." +msgstr "Zeichen mit Wert 0x%02x muss escapt werden." + +#: ../../common/jsonapi.c:2135 +#, c-format +msgid "Expected end of input, but found \"%.*s\"." +msgstr "Ende der Eingabe erwartet, aber »%.*s« gefunden." + +#: ../../common/jsonapi.c:2138 +#, c-format +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "Array-Element oder »]« erwartet, aber »%.*s« gefunden." + +#: ../../common/jsonapi.c:2141 +#, c-format +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "»,« oder »]« erwartet, aber »%.*s« gefunden." + +#: ../../common/jsonapi.c:2144 +#, c-format +msgid "Expected \":\", but found \"%.*s\"." +msgstr "»:« erwartet, aber »%.*s« gefunden." + +#: ../../common/jsonapi.c:2147 +#, c-format +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "JSON-Wert erwartet, aber »%.*s« gefunden." + +#: ../../common/jsonapi.c:2150 +msgid "The input string ended unexpectedly." +msgstr "Die Eingabezeichenkette endete unerwartet." + +#: ../../common/jsonapi.c:2152 +#, c-format +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "Zeichenkette oder »}« erwartet, aber »%.*s« gefunden." + +#: ../../common/jsonapi.c:2155 +#, c-format +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "»,« oder »}« erwartet, aber »%.*s« gefunden." + +#: ../../common/jsonapi.c:2158 +#, c-format +msgid "Expected string, but found \"%.*s\"." +msgstr "Zeichenkette erwartet, aber »%.*s« gefunden." + +#: ../../common/jsonapi.c:2161 +#, c-format +msgid "Token \"%.*s\" is invalid." +msgstr "Token »%.*s« ist ungültig." + +#: ../../common/jsonapi.c:2164 +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 kann nicht in »text« umgewandelt werden." + +#: ../../common/jsonapi.c:2166 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "Nach »\\u« müssen vier Hexadezimalziffern folgen." + +#: ../../common/jsonapi.c:2169 +msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." +msgstr "Unicode-Escape-Werte können nicht für Code-Punkt-Werte über 007F verwendet werden, wenn die Kodierung nicht UTF8 ist." + +#: ../../common/jsonapi.c:2178 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "Unicode-Escape-Wert konnte nicht in die Serverkodierung %s umgewandelt werden." + +#: ../../common/jsonapi.c:2185 +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "Unicode-High-Surrogate darf nicht auf ein High-Surrogate folgen." + +#: ../../common/jsonapi.c:2187 +msgid "Unicode low surrogate must follow a high surrogate." +msgstr "Unicode-Low-Surrogate muss auf ein High-Surrogate folgen." + +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:855 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "konnte Prüfsumme des Manifests nicht initialisieren" + +#: ../../common/parse_manifest.c:204 ../../common/parse_manifest.c:261 +msgid "manifest ended unexpectedly" +msgstr "Manifest endete unerwartet" + +#: ../../common/parse_manifest.c:210 ../../common/parse_manifest.c:862 +#, c-format +msgid "could not update checksum of manifest" +msgstr "konnte Prüfsumme des Manifests nicht aktualisieren" + +#: ../../common/parse_manifest.c:302 +msgid "unexpected object start" +msgstr "unerwarteter Objektstart" + +#: ../../common/parse_manifest.c:337 +msgid "unexpected object end" +msgstr "unerwartetes Objektende" + +#: ../../common/parse_manifest.c:366 +msgid "unexpected array start" +msgstr "unerwarteter Array-Start" + +#: ../../common/parse_manifest.c:391 +msgid "unexpected array end" +msgstr "unerwartetes Array-Ende" + +#: ../../common/parse_manifest.c:418 +msgid "expected version indicator" +msgstr "unerwartete Versionskennzeichnung" + +#: ../../common/parse_manifest.c:454 +msgid "unrecognized top-level field" +msgstr "unbekanntes Feld auf oberster Ebene" + +#: ../../common/parse_manifest.c:473 +msgid "unexpected file field" +msgstr "unerwartetes Feld für Datei" + +#: ../../common/parse_manifest.c:487 +msgid "unexpected WAL range field" +msgstr "unerwartetes Feld für WAL-Bereich" + +#: ../../common/parse_manifest.c:493 +msgid "unexpected object field" +msgstr "unbekanntes Feld für Objekt" + +#: ../../common/parse_manifest.c:583 +msgid "unexpected scalar" +msgstr "unerwarteter Skalar" + +#: ../../common/parse_manifest.c:609 +msgid "manifest version not an integer" +msgstr "Manifestversion ist keine ganze Zahl" + +#: ../../common/parse_manifest.c:613 +msgid "unexpected manifest version" +msgstr "unerwartete Manifestversion" + +#: ../../common/parse_manifest.c:637 +msgid "system identifier in manifest not an integer" +msgstr "Systemidentifikator im Manifest ist keine ganze Zahl" + +#: ../../common/parse_manifest.c:662 +msgid "missing path name" +msgstr "fehlender Pfadname" + +#: ../../common/parse_manifest.c:665 +msgid "both path name and encoded path name" +msgstr "sowohl Pfadname als auch kodierter Pfadname angegeben" + +#: ../../common/parse_manifest.c:667 +msgid "missing size" +msgstr "Größenangabe fehlt" + +#: ../../common/parse_manifest.c:670 +msgid "checksum without algorithm" +msgstr "Prüfsumme ohne Algorithmus" + +#: ../../common/parse_manifest.c:684 +msgid "could not decode file name" +msgstr "konnte Dateinamen nicht dekodieren" + +#: ../../common/parse_manifest.c:694 +msgid "file size is not an integer" +msgstr "Dateigröße ist keine ganze Zahl" + +#: ../../common/parse_manifest.c:700 pg_combinebackup.c:199 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "unbekannter Prüfsummenalgorithmus: »%s«" + +#: ../../common/parse_manifest.c:719 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "ungültige Prüfsumme für Datei »%s«: »%s«" + +#: ../../common/parse_manifest.c:762 +msgid "missing timeline" +msgstr "Zeitleiste fehlt" + +#: ../../common/parse_manifest.c:764 +msgid "missing start LSN" +msgstr "Start-LSN fehlt" + +#: ../../common/parse_manifest.c:766 +msgid "missing end LSN" +msgstr "End-LSN fehlt" + +#: ../../common/parse_manifest.c:772 +msgid "timeline is not an integer" +msgstr "Zeitleiste ist keine ganze Zahl" + +#: ../../common/parse_manifest.c:775 +msgid "could not parse start LSN" +msgstr "konnte Start-LSN nicht parsen" + +#: ../../common/parse_manifest.c:778 +msgid "could not parse end LSN" +msgstr "konnte End-LSN nicht parsen" + +#: ../../common/parse_manifest.c:843 +msgid "expected at least 2 lines" +msgstr "mindestens 2 Zeilen erwartet" + +#: ../../common/parse_manifest.c:846 +msgid "last line not newline-terminated" +msgstr "letzte Zeile nicht durch Newline abgeschlossen" + +#: ../../common/parse_manifest.c:865 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "konnte Prüfsumme des Manifests nicht abschließen" + +#: ../../common/parse_manifest.c:869 +#, c-format +msgid "manifest has no checksum" +msgstr "Manifest hat keine Prüfsumme" + +#: ../../common/parse_manifest.c:873 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "ungültige Manifestprüfsumme: »%s«" + +#: ../../common/parse_manifest.c:877 +#, c-format +msgid "manifest checksum mismatch" +msgstr "Manifestprüfsumme stimmt nicht überein" + +#: ../../common/parse_manifest.c:892 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "konnte Backup-Manifest nicht parsen: %s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ungültiger Wert »%s« für Option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s muss im Bereich %d..%d sein" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "unbekannte Sync-Methode: %s" + +#: backup_label.c:66 backup_label.c:85 backup_label.c:95 +#, c-format +msgid "%s: could not parse %s" +msgstr "%s: konnte %s nicht parsen" + +#: backup_label.c:69 backup_label.c:88 +#, c-format +msgid "%s: improper terminator for %s" +msgstr "%s: fehlerhaftes Endezeichen für %s" + +#: backup_label.c:76 +#, c-format +msgid "%s: could not parse TLI for %s" +msgstr "%s: konnte TLI für %s nicht parsen" + +#: backup_label.c:79 backup_label.c:98 +#, c-format +msgid "%s: invalid TLI" +msgstr "%s: TLI ungültig" + +#: backup_label.c:106 backup_label.c:108 +#, c-format +msgid "%s: could not find %s" +msgstr "%s: konnte %s nicht finden" + +#: backup_label.c:110 backup_label.c:113 +#, c-format +msgid "%s: %s requires %s" +msgstr "%s: %s benötigt %s" + +#: backup_label.c:162 reconstruct.c:761 write_manifest.c:262 +#, c-format +msgid "could not write file \"%s\": wrote %d of %d" +msgstr "konnte Datei »%s« nicht schreiben: %d von %d geschrieben" + +#: backup_label.c:166 copy_file.c:146 copy_file.c:193 reconstruct.c:721 +#: reconstruct.c:767 write_manifest.c:270 +#, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "konnte Prüfsumme der Datei »%s« nicht aktualisieren" + +#: copy_file.c:186 +#, c-format +msgid "could not write to file \"%s\": %m" +msgstr "konnte nicht in Datei »%s« schreiben: %m" + +#: copy_file.c:188 +#, c-format +msgid "could not write to file \"%s\", offset %u: wrote %d of %d" +msgstr "konnte nicht in Datei »%s«, Position %u schreiben: %d von %d geschrieben" + +#: copy_file.c:199 reconstruct.c:784 +#, c-format +msgid "could not read from file \"%s\": %m" +msgstr "konnte nicht aus Datei »%s« lesen: %m" + +#: copy_file.c:218 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %m" +msgstr "Fehler beim Klonen von Datei »%s« nach »%s«: %m" + +#: copy_file.c:229 copy_file.c:272 +#, c-format +msgid "could not create file \"%s\": %m" +msgstr "konnte Datei »%s« nicht erstellen: %m" + +#: copy_file.c:237 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %s" +msgstr "Fehler beim Klonen von Datei »%s« nach »%s«: %s" + +#: copy_file.c:245 pg_combinebackup.c:251 +#, c-format +msgid "file cloning not supported on this platform" +msgstr "Klonen von Dateien wird auf dieser Plattform nicht unterstützt" + +#: copy_file.c:278 reconstruct.c:704 +#, c-format +msgid "error while copying file range from \"%s\" to \"%s\": %m" +msgstr "Fehler beim Kopieren von Dateibereich von »%s« nach »%s«: %m" + +#: copy_file.c:285 pg_combinebackup.c:264 reconstruct.c:724 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "copy_file_range wird auf dieser Plattform nicht unterstützt" + +#: copy_file.c:300 +#, c-format +msgid "could not copy file \"%s\" to \"%s\": %m" +msgstr "konnte Datei »%s« nicht nach »%s« kopieren: %m" + +#: load_manifest.c:125 +#, c-format +msgid "file \"%s\" does not exist" +msgstr "Datei »%s« existiert nicht" + +#: load_manifest.c:163 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "konnte Datei »%s« nicht lesen: %d von %lld gelesen" + +#: load_manifest.c:201 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "konnte Datei »%s« nicht lesen: %lld von %lld gelesen" + +#: load_manifest.c:249 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "Backup-Manifest Version 1 unterstützt kein inkrementelles Backup" + +#: load_manifest.c:281 +#, c-format +msgid "duplicate path name in backup manifest: \"%s\"" +msgstr "doppelter Pfadname im Backup-Manifest: »%s«" + +#: pg_combinebackup.c:220 pg_combinebackup.c:228 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." + +#: pg_combinebackup.c:227 +#, c-format +msgid "no input directories specified" +msgstr "keine Eingabeverzeichnisse angegeben" + +#: pg_combinebackup.c:233 +#, c-format +msgid "no output directory specified" +msgstr "kein Ausgabeverzeichnis angegeben" + +#: pg_combinebackup.c:301 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: Systemidentifikator im Manifest ist %llu, aber Kontrolldatei hat %llu" + +#: pg_combinebackup.c:340 +#, c-format +msgid "cannot generate a manifest because no manifest is available for the final input backup" +msgstr "kann kein Manifest erzeugen, weil kein Manifest für das letzte Eingabe-Backup verfügbar ist" + +#: pg_combinebackup.c:387 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "konnte symbolische Verknüpfung von »%s« nach »%s« nicht erzeugen: %m" + +#: pg_combinebackup.c:399 pg_combinebackup.c:730 pg_combinebackup.c:927 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" + +#: pg_combinebackup.c:454 +#, c-format +msgid "directory name too long" +msgstr "Verzeichnisname zu lang" + +#: pg_combinebackup.c:461 +#, c-format +msgid "multiple \"=\" signs in tablespace mapping" +msgstr "mehrere »=«-Zeichen im Tablespace-Mapping" + +#: pg_combinebackup.c:469 +#, c-format +msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" +msgstr "ungültiges Tablespace-Mapping-Format »%s«, muss »ALTES_VERZ=NEUES_VERZ« sein" + +#: pg_combinebackup.c:480 pg_combinebackup.c:484 +#, c-format +msgid "old directory is not an absolute path in tablespace mapping: %s" +msgstr "altes Verzeichnis im Tablespace-Mapping ist kein absoluter Pfad: %s" + +#: pg_combinebackup.c:553 +#, c-format +msgid "backup at \"%s\" is a full backup, but only the first backup should be a full backup" +msgstr "Backup in »%s« ist ein volles Backup, aber nur das erste Backup sollte ein volles Backup sein" + +#: pg_combinebackup.c:556 +#, c-format +msgid "backup at \"%s\" is an incremental backup, but the first backup should be a full backup" +msgstr "Backup in »%s« ist ein inkrementelles Backup, aber das erste Backup sollte ein volles Backup sein" + +#: pg_combinebackup.c:559 +#, c-format +msgid "backup at \"%s\" starts on timeline %u, but expected %u" +msgstr "Backup in »%s« startet auf Zeitleiste %u, aber %u wurde erwartet" + +#: pg_combinebackup.c:562 +#, c-format +msgid "backup at \"%s\" starts at LSN %X/%X, but expected %X/%X" +msgstr "Backup in »%s« startet bei LSN %X/%X, aber %X/%X wurde erwartet" + +#: pg_combinebackup.c:614 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: CRC ist falsch" + +#: pg_combinebackup.c:618 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: unerwartete Kontrolldateiversion" + +#: pg_combinebackup.c:625 +#, c-format +msgid "%s: expected system identifier %llu, but found %llu" +msgstr "%s: Systemidentifikator %llu erwartet, aber %llu gefunden" + +#: pg_combinebackup.c:657 +#, c-format +msgid "only some backups have checksums enabled" +msgstr "nur einige Sicherungen haben Prüfsummen aktiviert" + +#: pg_combinebackup.c:658 +#, c-format +msgid "Disable, and optionally reenable, checksums on the output directory to avoid failures." +msgstr "Schalten Sie für das Ausgabeverzeichnis Prüfsummen aus, und optional wieder an, um Fehler zu vermeiden." + +#: pg_combinebackup.c:693 +#, c-format +msgid "removing output directory \"%s\"" +msgstr "Ausgabeverzeichnis »%s« wird entfernt" + +#: pg_combinebackup.c:695 +#, c-format +msgid "failed to remove output directory" +msgstr "konnte Ausgabeverzeichnis nicht entfernen" + +#: pg_combinebackup.c:699 +#, c-format +msgid "removing contents of output directory \"%s\"" +msgstr "entferne Inhalt des Ausgabeverzeichnisses »%s«" + +#: pg_combinebackup.c:702 +#, c-format +msgid "failed to remove contents of output directory" +msgstr "konnte Inhalt des Ausgabeverzeichnisses nicht entfernen" + +#: pg_combinebackup.c:742 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "Verzeichnis »%s« existiert aber ist nicht leer" + +#: pg_combinebackup.c:745 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" + +#: pg_combinebackup.c:759 +#, c-format +msgid "" +"%s reconstructs full backups from incrementals.\n" +"\n" +msgstr "" +"%s rekonstruiert volle Backups aus inkrementellen.\n" +"\n" + +#: pg_combinebackup.c:760 +#, c-format +msgid "Usage:\n" +msgstr "Aufruf:\n" + +#: pg_combinebackup.c:761 +#, c-format +msgid " %s [OPTION]... DIRECTORY...\n" +msgstr " %s [OPTION]... VERZEICHNIS...\n" + +#: pg_combinebackup.c:762 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Optionen:\n" + +#: pg_combinebackup.c:763 +#, c-format +msgid " -d, --debug generate lots of debugging output\n" +msgstr " -d, --debug erzeuge eine Menge Debug-Ausgaben\n" + +#: pg_combinebackup.c:764 +#, c-format +msgid " -n, --dry-run do not actually do anything\n" +msgstr " -n, --dry-run nichts wirklich ausführen\n" + +#: pg_combinebackup.c:765 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr "" +" -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" +" geschrieben sind\n" + +#: pg_combinebackup.c:766 +#, c-format +msgid " -o, --output=DIRECTORY output directory\n" +msgstr " -o, --output=VERZEICHNIS Ausgabeverzeichnis\n" + +#: pg_combinebackup.c:767 +#, c-format +msgid "" +" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" +" relocate tablespace in OLDDIR to NEWDIR\n" +msgstr "" +" -T, --tablespace-mapping=ALTES_VERZ=NEUES_VERZ\n" +" Tablespace in ALTES_VERZ nach NEUES_VERZ verlagern\n" + +#: pg_combinebackup.c:769 +#, c-format +msgid " --clone clone (reflink) files instead of copying\n" +msgstr " --clone Dateien klonen (reflink) statt kopieren\n" + +#: pg_combinebackup.c:770 +#, c-format +msgid " --copy copy files (default)\n" +msgstr " --copy Dateien kopieren (Voreinstellung)\n" + +#: pg_combinebackup.c:771 +#, c-format +msgid " --copy-file-range copy using copy_file_range() system call\n" +msgstr " --copy-file-range mit Systemaufruf copy_file_range() kopieren\n" + +#: pg_combinebackup.c:772 +#, c-format +msgid "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" use algorithm for manifest checksums\n" +msgstr "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" Algorithmus für Manifest-Prüfsummen\n" + +#: pg_combinebackup.c:774 +#, c-format +msgid " --no-manifest suppress generation of backup manifest\n" +msgstr " --no-manifest Erzeugen des Backup-Manifests unterbinden\n" + +#: pg_combinebackup.c:775 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr "" +" --sync-method=METHODE Methode zum Synchronisieren vond Dateien auf\n" +" Festplatte setzen\n" + +#: pg_combinebackup.c:776 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" + +#: pg_combinebackup.c:777 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" + +#: pg_combinebackup.c:779 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Berichten Sie Fehler an <%s>.\n" + +#: pg_combinebackup.c:780 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s Homepage: <%s>\n" + +#: pg_combinebackup.c:995 +#, c-format +msgid "skipping symbolic link \"%s\"" +msgstr "überspringe symbolische Verknüpfung »%s«" + +#: pg_combinebackup.c:997 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "überspringe besondere Datei »%s«" + +#: pg_combinebackup.c:1073 reconstruct.c:305 +#, c-format +msgid "manifest file \"%s\" contains no entry for file \"%s\"" +msgstr "Manifestdatei »%s« enthält keinen Eintrag für Datei »%s«" + +#: pg_combinebackup.c:1189 +#, c-format +msgid "%s: server version too old" +msgstr "%s: Serverversion zu alt" + +#: pg_combinebackup.c:1190 +#, c-format +msgid "%s: could not parse version number" +msgstr "%s: konnte Versionsnummer nicht parsen" + +#: pg_combinebackup.c:1309 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m" + +#: pg_combinebackup.c:1312 +#, c-format +msgid "target of symbolic link \"%s\" is too long" +msgstr "Ziel der symbolischen Verknüpfung »%s« ist zu lang" + +#: pg_combinebackup.c:1315 +#, c-format +msgid "target of symbolic link \"%s\" is relative" +msgstr "Ziel der symbolischen Verknüpfung »%s« ist relativ" + +#: pg_combinebackup.c:1337 +#, c-format +msgid "tablespace at \"%s\" has no tablespace mapping" +msgstr "Tablespace in »%s« hat kein Tablespace-Mapping" + +#: pg_combinebackup.c:1355 +#, c-format +msgid "tablespaces with OIDs %u and %u both point at directory \"%s\"" +msgstr "die Tablespaces mit OIDs %u und %u zeigen beide auf Verzeichnis »%s«" + +#: pg_combinebackup.c:1364 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht schließen: %m" + +#: pg_combinebackup.c:1385 +#, c-format +msgid "file \"%s\" is too large" +msgstr "Datei »%s« ist zu groß" + +#: pg_combinebackup.c:1402 +#, c-format +msgid "could not read file \"%s\": read %zd of %lld" +msgstr "konnte Datei »%s« nicht lesen: %zd von %lld gelesen" + +#: reconstruct.c:339 +#, c-format +msgid "full backup contains unexpected incremental file \"%s\"" +msgstr "volles Backup enthält unerwartete inkrementelle Datei »%s«" + +#: reconstruct.c:423 +#, c-format +msgid "file \"%s\" is too short: expected %llu, found %llu" +msgstr "Datei »%s« ist zu kurz: %llu erwartet, %llu gefunden" + +#: reconstruct.c:465 +#, c-format +msgid "file \"%s\" has bad incremental magic number (0x%x, expected 0x%x)" +msgstr "Datei »%s« hat falsche inkrementelle magische Zahl (0x%x, erwartet 0x%x)" + +#: reconstruct.c:471 +#, c-format +msgid "file \"%s\" has block count %u in excess of segment size %u" +msgstr "Datei »%s« hat Blockzahl %u, was die Segmentgröße %u überschreitet" + +#: reconstruct.c:478 +#, c-format +msgid "file \"%s\" has truncation block length %u in excess of segment size %u" +msgstr "Datei »%s« hat Truncation-Blocklänge %u, was die Segmentgröße %u überschreitet" + +#: reconstruct.c:542 +#, c-format +msgid "could not read file \"%s\": read %d of %u" +msgstr "konnte Datei »%s« nicht lesen: %d von %u gelesen" + +#: reconstruct.c:786 +#, c-format +msgid "could not read from file \"%s\", offset %llu: read %d of %d" +msgstr "konnte nicht aus Datei »%s«, Position %llu lesen: %d von %d gelesen" diff --git a/src/bin/pg_combinebackup/po/es.po b/src/bin/pg_combinebackup/po/es.po new file mode 100644 index 0000000000000..850ef3dde2a0e --- /dev/null +++ b/src/bin/pg_combinebackup/po/es.po @@ -0,0 +1,900 @@ +# Spanish translation file for pg_combinebackup +# +# Copyright (c) 2024, PostgreSQL Global Development Group +# This file is distributed under the same license as the PostgreSQL package. +# +# Alvaro Herrera , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: pg_combinebackup (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-11-16 05:22+0000\n" +"PO-Revision-Date: 2024-11-16 09:07+0100\n" +"Last-Translator: Ãlvaro Herrera \n" +"Language-Team: PgSQL-es-Ayuda \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: BlackCAT 1.1\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "error: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "precaución: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "detalle: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "consejo: " + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "no se pudo abrir archivo «%s» para lectura: %m" + +#: ../../common/controldata_utils.c:110 copy_file.c:150 load_manifest.c:161 +#: load_manifest.c:199 pg_combinebackup.c:1400 reconstruct.c:540 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "no se pudo leer el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: backup_label.c:174 copy_file.c:68 pg_combinebackup.c:538 +#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:740 +#: write_manifest.c:187 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "no se pudo cerrar el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "discordancia en orden de bytes" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"posible discordancia en orden de bytes\n" +"El ordenamiento de bytes usado para almacenar el archivo pg_control puede no\n" +"coincidir con el usado por este programa. En tal caso los resultados de abajo\n" +"serían erróneos, y la instalación de PostgreSQL sería incompatible con este\n" +"directorio de datos." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 backup_label.c:143 copy_file.c:66 +#: copy_file.c:139 copy_file.c:171 copy_file.c:175 copy_file.c:225 +#: copy_file.c:268 load_manifest.c:128 pg_combinebackup.c:523 +#: pg_combinebackup.c:1167 reconstruct.c:523 reconstruct.c:638 +#: write_manifest.c:250 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "no se pudo abrir el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:759 +#: write_manifest.c:260 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "no se pudo escribir el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:853 +#, c-format +msgid "out of memory" +msgstr "memoria agotada" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "éxito" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "el búfer de destino es demasiado pequeño" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "falla de openSSL" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "memoria agotada\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "no se puede duplicar un puntero nulo (error interno)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: backup_label.c:187 load_manifest.c:133 pg_combinebackup.c:676 +#: pg_combinebackup.c:1131 pg_combinebackup.c:1383 reconstruct.c:204 +#: reconstruct.c:421 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "no se pudo hacer stat al archivo «%s»: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "esta instalación no soporta el método de sync «%s»" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_combinebackup.c:933 pg_combinebackup.c:1256 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "no se pudo abrir el directorio «%s»: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "no se pudo leer el directorio «%s»: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" + +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "El parser recursivo descendiente no puede usar el lexer incremental." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "El parser incremental requiere el lexer incremental." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON anidado demasiado profundamente, profundidad máxima es 6400." + +#: ../../common/jsonapi.c:2127 +#, c-format +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "La secuencia de escape «\\%.*s» no es válida." + +#: ../../common/jsonapi.c:2131 +#, c-format +msgid "Character with value 0x%02x must be escaped." +msgstr "Los caracteres con valor 0x%02x deben ser escapados." + +#: ../../common/jsonapi.c:2135 +#, c-format +msgid "Expected end of input, but found \"%.*s\"." +msgstr "Se esperaba el fin de la entrada, se encontró «%.*s»." + +#: ../../common/jsonapi.c:2138 +#, c-format +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "Se esperaba un elemento de array o «]», se encontró «%.*s»." + +#: ../../common/jsonapi.c:2141 +#, c-format +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "Se esperaba «,» o «]», se encontró «%.*s»." + +#: ../../common/jsonapi.c:2144 +#, c-format +msgid "Expected \":\", but found \"%.*s\"." +msgstr "Se esperaba «:», se encontró «%.*s»." + +#: ../../common/jsonapi.c:2147 +#, c-format +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "Se esperaba un valor JSON, se encontró «%.*s»." + +#: ../../common/jsonapi.c:2150 +msgid "The input string ended unexpectedly." +msgstr "La cadena de entrada terminó inesperadamente." + +#: ../../common/jsonapi.c:2152 +#, c-format +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "Se esperaba una cadena o «}», se encontró «%.*s»." + +#: ../../common/jsonapi.c:2155 +#, c-format +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "Se esperaba «,» o «}», se encontró «%.*s»." + +#: ../../common/jsonapi.c:2158 +#, c-format +msgid "Expected string, but found \"%.*s\"." +msgstr "Se esperaba una cadena, se encontró «%.*s»." + +#: ../../common/jsonapi.c:2161 +#, c-format +msgid "Token \"%.*s\" is invalid." +msgstr "El elemento «%.*s» no es válido." + +#: ../../common/jsonapi.c:2164 +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 no puede ser convertido a text." + +#: ../../common/jsonapi.c:2166 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "«\\u» debe ser seguido por cuatro dígitos hexadecimales." + +#: ../../common/jsonapi.c:2169 +msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." +msgstr "Los valores de escape Unicode no se pueden utilizar para valores de código superiores a 007F cuando la codificación no es UTF8." + +#: ../../common/jsonapi.c:2178 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "El valor de escape Unicode no pudo ser traducido a la codificación del servidor %s." + +#: ../../common/jsonapi.c:2185 +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "Un «high-surrogate» Unicode no puede venir después de un «high-surrogate»." + +#: ../../common/jsonapi.c:2187 +msgid "Unicode low surrogate must follow a high surrogate." +msgstr "Un «low-surrogate» Unicode debe seguir a un «high-surrogate»." + +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:855 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "no se pudo inicializar la suma de verificación del manifiesto" + +#: ../../common/parse_manifest.c:204 ../../common/parse_manifest.c:261 +msgid "manifest ended unexpectedly" +msgstr "el manifiesto terminó inesperadamente" + +#: ../../common/parse_manifest.c:210 ../../common/parse_manifest.c:862 +#, c-format +msgid "could not update checksum of manifest" +msgstr "no se pudo actualizar la suma de verificación del manifiesto" + +#: ../../common/parse_manifest.c:302 +msgid "unexpected object start" +msgstr "inicio de objeto inesperado" + +#: ../../common/parse_manifest.c:337 +msgid "unexpected object end" +msgstr "fin de objeto inesperado" + +#: ../../common/parse_manifest.c:366 +msgid "unexpected array start" +msgstr "inicio de array inesperado" + +#: ../../common/parse_manifest.c:391 +msgid "unexpected array end" +msgstr "fin de array inesperado" + +#: ../../common/parse_manifest.c:418 +msgid "expected version indicator" +msgstr "se esperaba indicador de versión" + +#: ../../common/parse_manifest.c:454 +msgid "unrecognized top-level field" +msgstr "campo de nivel superior no reconocido" + +#: ../../common/parse_manifest.c:473 +msgid "unexpected file field" +msgstr "campo de archivo inesperado" + +#: ../../common/parse_manifest.c:487 +msgid "unexpected WAL range field" +msgstr "campo de rango de WAL inesperado" + +#: ../../common/parse_manifest.c:493 +msgid "unexpected object field" +msgstr "campo de objeto inesperado" + +#: ../../common/parse_manifest.c:583 +msgid "unexpected scalar" +msgstr "escalar inesperado" + +#: ../../common/parse_manifest.c:609 +msgid "manifest version not an integer" +msgstr "la versión de manifiesto no es un número entero" + +#: ../../common/parse_manifest.c:613 +msgid "unexpected manifest version" +msgstr "versión de manifiesto inesperada" + +#: ../../common/parse_manifest.c:637 +msgid "system identifier in manifest not an integer" +msgstr "el identificador de sistema en el manifiesto no es un número entero" + +#: ../../common/parse_manifest.c:662 +msgid "missing path name" +msgstr "ruta de archivo faltante" + +#: ../../common/parse_manifest.c:665 +msgid "both path name and encoded path name" +msgstr "hay ambos ruta de archivo (path name) y ruta codificada (encoded path name)" + +#: ../../common/parse_manifest.c:667 +msgid "missing size" +msgstr "tamaño faltante" + +#: ../../common/parse_manifest.c:670 +msgid "checksum without algorithm" +msgstr "suma de comprobación sin algoritmo" + +#: ../../common/parse_manifest.c:684 +msgid "could not decode file name" +msgstr "no se pudo decodificar el nombre del archivo" + +#: ../../common/parse_manifest.c:694 +msgid "file size is not an integer" +msgstr "el tamaño del archivo no es un número entero" + +#: ../../common/parse_manifest.c:700 pg_combinebackup.c:199 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "algoritmo de suma de comprobación no reconocido: \"%s\"" + +#: ../../common/parse_manifest.c:719 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "suma de comprobación no válida para el archivo \"%s\": \"%s\"" + +#: ../../common/parse_manifest.c:762 +msgid "missing timeline" +msgstr "falta el timeline" + +#: ../../common/parse_manifest.c:764 +msgid "missing start LSN" +msgstr "falta el LSN de inicio" + +#: ../../common/parse_manifest.c:766 +msgid "missing end LSN" +msgstr "falta el LSN de término" + +#: ../../common/parse_manifest.c:772 +msgid "timeline is not an integer" +msgstr "el timeline no es un número entero" + +#: ../../common/parse_manifest.c:775 +msgid "could not parse start LSN" +msgstr "no se pudo interpretar el LSN de inicio" + +#: ../../common/parse_manifest.c:778 +msgid "could not parse end LSN" +msgstr "no se pudo interpretar el LSN de término" + +#: ../../common/parse_manifest.c:843 +msgid "expected at least 2 lines" +msgstr "esperado al menos 2 líneas" + +#: ../../common/parse_manifest.c:846 +msgid "last line not newline-terminated" +msgstr "última línea no termina en nueva línea" + +#: ../../common/parse_manifest.c:865 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "no se pudo finalizar la suma de verificación del manifiesto" + +#: ../../common/parse_manifest.c:869 +#, c-format +msgid "manifest has no checksum" +msgstr "el manifiesto no tiene suma de comprobación" + +#: ../../common/parse_manifest.c:873 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "suma de comprobación de manifiesto no válida: \"%s\"" + +#: ../../common/parse_manifest.c:877 +#, c-format +msgid "manifest checksum mismatch" +msgstr "discordancia en la suma de comprobación del manifiesto" + +#: ../../common/parse_manifest.c:892 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "no se pudo analizar el manifiesto de la copia de seguridad: %s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "el valor «%s» no es válido para la opción %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s debe estar en el rango %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "método de sync no reconocido: %s" + +#: backup_label.c:66 backup_label.c:85 backup_label.c:95 +#, c-format +msgid "%s: could not parse %s" +msgstr "%s: no se pudo interpretar %s" + +#: backup_label.c:69 backup_label.c:88 +#, c-format +msgid "%s: improper terminator for %s" +msgstr "%s: terminador inapropiado para %s" + +#: backup_label.c:76 +#, c-format +msgid "%s: could not parse TLI for %s" +msgstr "%s: no se pudo interpretar el TLI para %s" + +#: backup_label.c:79 backup_label.c:98 +#, c-format +msgid "%s: invalid TLI" +msgstr "%s: TLI no válido" + +#: backup_label.c:106 backup_label.c:108 +#, c-format +msgid "%s: could not find %s" +msgstr "%s: no se pudo encontrar %s" + +#: backup_label.c:110 backup_label.c:113 +#, c-format +msgid "%s: %s requires %s" +msgstr "%s: %s requiere %s" + +#: backup_label.c:162 reconstruct.c:761 write_manifest.c:262 +#, c-format +msgid "could not write file \"%s\": wrote %d of %d" +msgstr "no se pudo escribir al archivo «%s»: se escribió %d de %d" + +#: backup_label.c:166 copy_file.c:146 copy_file.c:193 reconstruct.c:721 +#: reconstruct.c:767 write_manifest.c:270 +#, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "no se pudo actualizar la suma de verificación para el archivo «%s»" + +#: copy_file.c:186 +#, c-format +msgid "could not write to file \"%s\": %m" +msgstr "no se pudo escribir a archivo «%s»: %m" + +#: copy_file.c:188 +#, c-format +msgid "could not write to file \"%s\", offset %u: wrote %d of %d" +msgstr "no se pudo escribir al archivo «%s», posición %u: se escribió %d de %d" + +#: copy_file.c:199 reconstruct.c:784 +#, c-format +msgid "could not read from file \"%s\": %m" +msgstr "no se pudo leer el archivo «%s»: %m" + +#: copy_file.c:218 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %m" +msgstr "error mientras se clonaba el archivo «%s» a «%s»: %m" + +#: copy_file.c:229 copy_file.c:272 +#, c-format +msgid "could not create file \"%s\": %m" +msgstr "no se pudo crear archivo «%s»: %m" + +#: copy_file.c:237 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %s" +msgstr "error mientras se clonaba la relación «%s» a «%s»: %s" + +#: copy_file.c:245 pg_combinebackup.c:251 +#, c-format +msgid "file cloning not supported on this platform" +msgstr "el clonado de archivos no está soportado en esta plataforma" + +#: copy_file.c:278 reconstruct.c:704 +#, c-format +msgid "error while copying file range from \"%s\" to \"%s\": %m" +msgstr "error mientras se copiaba un rango de archivo de «%s» a «%s»: %m" + +#: copy_file.c:285 pg_combinebackup.c:264 reconstruct.c:724 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "copy_file_range no está soportado en esta plataforma" + +#: copy_file.c:300 +#, c-format +msgid "could not copy file \"%s\" to \"%s\": %m" +msgstr "no se pudo copiar el archivo de «%s» a «%s»: %m" + +#: load_manifest.c:125 +#, c-format +msgid "file \"%s\" does not exist" +msgstr "el archivo «%s» no existe" + +#: load_manifest.c:163 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "no se pudo leer el archivo «%s»: leídos %d de %lld" + +#: load_manifest.c:201 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "no se pudo leer el archivo «%s»: leídos %lld de %lld" + +#: load_manifest.c:249 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "el manifiesto de backup versión 1 no soporta backups incrementales" + +#: load_manifest.c:281 +#, c-format +msgid "duplicate path name in backup manifest: \"%s\"" +msgstr "nombre de ruta duplicado en el manifiesto de la copia de seguridad: \"%s\"" + +#: pg_combinebackup.c:220 pg_combinebackup.c:228 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Pruebe «%s --help» para mayor información." + +#: pg_combinebackup.c:227 +#, c-format +msgid "no input directories specified" +msgstr "no se especificó un directorio de entrada" + +#: pg_combinebackup.c:233 +#, c-format +msgid "no output directory specified" +msgstr "no se especificó un directorio de salida" + +#: pg_combinebackup.c:301 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: el identificador de sistema del manifiesto es %llu, pero el archivo de control tiene %llu" + +#: pg_combinebackup.c:340 +#, c-format +msgid "cannot generate a manifest because no manifest is available for the final input backup" +msgstr "no se puede generar un manifiesto porque no hay un manifiesto disponible para el backup final de entrada" + +#: pg_combinebackup.c:387 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "no se pudo crear un enlace simbólico desde «%s» a «%s»: %m" + +#: pg_combinebackup.c:399 pg_combinebackup.c:730 pg_combinebackup.c:927 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "no se pudo crear el directorio «%s»: %m" + +#: pg_combinebackup.c:454 +#, c-format +msgid "directory name too long" +msgstr "nombre de directorio demasiado largo" + +#: pg_combinebackup.c:461 +#, c-format +msgid "multiple \"=\" signs in tablespace mapping" +msgstr "múltiples signos «=» en mapeo de tablespace" + +#: pg_combinebackup.c:469 +#, c-format +msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" +msgstr "formato de mapeo de tablespace «%s» no válido, debe ser «ANTIGUO=NUEVO»" + +#: pg_combinebackup.c:480 pg_combinebackup.c:484 +#, c-format +msgid "old directory is not an absolute path in tablespace mapping: %s" +msgstr "directorio antiguo no es una ruta absoluta en mapeo de tablespace: %s" + +#: pg_combinebackup.c:553 +#, c-format +msgid "backup at \"%s\" is a full backup, but only the first backup should be a full backup" +msgstr "el backup en «%s» es un backup full, pero sólo el primer backup puede ser full" + +#: pg_combinebackup.c:556 +#, c-format +msgid "backup at \"%s\" is an incremental backup, but the first backup should be a full backup" +msgstr "el backup en «%s» es incremental, pero el primer backup debería ser full" + +#: pg_combinebackup.c:559 +#, c-format +msgid "backup at \"%s\" starts on timeline %u, but expected %u" +msgstr "el backup en «%s» empieza en el timeline %u, pero se esperaba %u" + +#: pg_combinebackup.c:562 +#, c-format +msgid "backup at \"%s\" starts at LSN %X/%X, but expected %X/%X" +msgstr "el backup en «%s» empieza en el LSN %X/%X, pero se esperaba %X/%X" + +#: pg_combinebackup.c:614 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: el valor de CRC es incorrecto" + +#: pg_combinebackup.c:618 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: versión de archivo de control inesperado" + +#: pg_combinebackup.c:625 +#, c-format +msgid "%s: expected system identifier %llu, but found %llu" +msgstr "%s: se esperaba identificador de sistema %llu, pero se encontró %llu" + +#: pg_combinebackup.c:657 +#, c-format +msgid "only some backups have checksums enabled" +msgstr "sólo algunos backups tienen checksums activados" + +#: pg_combinebackup.c:658 +#, c-format +msgid "Disable, and optionally reenable, checksums on the output directory to avoid failures." +msgstr "Desactive (y opcionalmente reactive) los checksums en el directorio de salida para evitar fallos." + +#: pg_combinebackup.c:693 +#, c-format +msgid "removing output directory \"%s\"" +msgstr "eliminando el directorio de salida «%s»" + +#: pg_combinebackup.c:695 +#, c-format +msgid "failed to remove output directory" +msgstr "no se pudo eliminar el directorio de salida" + +#: pg_combinebackup.c:699 +#, c-format +msgid "removing contents of output directory \"%s\"" +msgstr "eliminando el contenido del directorio de salida «%s»" + +#: pg_combinebackup.c:702 +#, c-format +msgid "failed to remove contents of output directory" +msgstr "no se pudo eliminar el contenido del directorio de salida" + +#: pg_combinebackup.c:742 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "el directorio «%s» existe pero no está vacío" + +#: pg_combinebackup.c:745 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "no se pudo acceder al directorio «%s»: %m" + +#: pg_combinebackup.c:759 +#, c-format +msgid "" +"%s reconstructs full backups from incrementals.\n" +"\n" +msgstr "" +"%s reconstruye backups full desde incrementales.\n" +"\n" + +#: pg_combinebackup.c:760 +#, c-format +msgid "Usage:\n" +msgstr "Empleo:\n" + +#: pg_combinebackup.c:761 +#, c-format +msgid " %s [OPTION]... DIRECTORY...\n" +msgstr " %s [OPCIÓN]... DIRECTOTIO...\n" + +#: pg_combinebackup.c:762 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opciones:\n" + +#: pg_combinebackup.c:763 +#, c-format +msgid " -d, --debug generate lots of debugging output\n" +msgstr " -d, --debug genera mucha salida de depuración\n" + +#: pg_combinebackup.c:764 +#, c-format +msgid " -n, --dry-run do not actually do anything\n" +msgstr " -n, --dry-run no hacer realmente nada\n" + +#: pg_combinebackup.c:765 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n" + +#: pg_combinebackup.c:766 +#, c-format +msgid " -o, --output=DIRECTORY output directory\n" +msgstr " -o, --output=DIR directorio de salida\n" + +#: pg_combinebackup.c:767 +#, c-format +msgid "" +" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" +" relocate tablespace in OLDDIR to NEWDIR\n" +msgstr "" +" -T, --tablespace-mapping=ANTIGUO=NUEVO\n" +" reubicar el tablespace de ANTIGUO a NUEVO\n" + +#: pg_combinebackup.c:769 +#, c-format +msgid " --clone clone (reflink) files instead of copying\n" +msgstr " --clone clonar (reflink) archivos en vez de copiarlos\n" + +#: pg_combinebackup.c:770 +#, c-format +msgid " --copy copy files (default)\n" +msgstr " --copy copiar archivos (por omisión)\n" + +#: pg_combinebackup.c:771 +#, c-format +msgid " --copy-file-range copy using copy_file_range() system call\n" +msgstr " --copy-file-range copiar usando la llamada copy_file_range()\n" + +#: pg_combinebackup.c:772 +#, c-format +msgid "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" use algorithm for manifest checksums\n" +msgstr "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" usar algoritmo para checksums del manifiesto\n" + +#: pg_combinebackup.c:774 +#, c-format +msgid " --no-manifest suppress generation of backup manifest\n" +msgstr " --no-manifest suprimir generación del manifiesto\n" + +#: pg_combinebackup.c:775 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=MÉTODO definir método para sincronizar archivos a disco\n" + +#: pg_combinebackup.c:776 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version mostrar información de version y salir\n" + +#: pg_combinebackup.c:777 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostrar esta ayuda y salir\n" + +#: pg_combinebackup.c:779 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Reporte errores a <%s>.\n" + +#: pg_combinebackup.c:780 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "Sitio web de %s: <%s>\n" + +#: pg_combinebackup.c:995 +#, c-format +msgid "skipping symbolic link \"%s\"" +msgstr "omitiendo el link simbólico «%s»" + +#: pg_combinebackup.c:997 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "omitiendo el archivo especial «%s»" + +#: pg_combinebackup.c:1073 reconstruct.c:305 +#, c-format +msgid "manifest file \"%s\" contains no entry for file \"%s\"" +msgstr "el archivo de manifiesto «%s» no contiene una entrada para el archivo «%s»" + +#: pg_combinebackup.c:1189 +#, c-format +msgid "%s: server version too old" +msgstr "%s: versión de servidor demasiado antigua" + +#: pg_combinebackup.c:1190 +#, c-format +msgid "%s: could not parse version number" +msgstr "%s: no se pudo interpretar el número de versión" + +#: pg_combinebackup.c:1309 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "no se pudo leer el enlace simbólico «%s»: %m" + +#: pg_combinebackup.c:1312 +#, c-format +msgid "target of symbolic link \"%s\" is too long" +msgstr "el destino del enlace simbólico «%s» es demasiado largo" + +#: pg_combinebackup.c:1315 +#, c-format +msgid "target of symbolic link \"%s\" is relative" +msgstr "el destino del enlace simbólico «%s» es relativo" + +#: pg_combinebackup.c:1337 +#, c-format +msgid "tablespace at \"%s\" has no tablespace mapping" +msgstr "el tablespace en «%s» no tiene mapeo de tablespace" + +#: pg_combinebackup.c:1355 +#, c-format +msgid "tablespaces with OIDs %u and %u both point at directory \"%s\"" +msgstr "los tablespaces con OIDs %u y %u ambos apuntan al directorio «%s»" + +#: pg_combinebackup.c:1364 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "no se pudo abrir el directorio «%s»: %m" + +#: pg_combinebackup.c:1385 +#, c-format +msgid "file \"%s\" is too large" +msgstr "el archivo «%s» es demasiado grande" + +#: pg_combinebackup.c:1402 +#, c-format +msgid "could not read file \"%s\": read %zd of %lld" +msgstr "no se pudo leer el archivo «%s»: leídos %zd de %lld" + +#: reconstruct.c:339 +#, c-format +msgid "full backup contains unexpected incremental file \"%s\"" +msgstr "backup «full» contiene archivo incremental «%s» inesperado" + +#: reconstruct.c:423 +#, c-format +msgid "file \"%s\" is too short: expected %llu, found %llu" +msgstr "el archivo «%s» es demasiado corto: se esperaban %llu, se encontraron %llu" + +#: reconstruct.c:465 +#, c-format +msgid "file \"%s\" has bad incremental magic number (0x%x, expected 0x%x)" +msgstr "el archivo «%s» tiene número mágico incremental erróneo (0x%x, se esperaba 0x%x)" + +#: reconstruct.c:471 +#, c-format +msgid "file \"%s\" has block count %u in excess of segment size %u" +msgstr "el archivo «%s» tiene una cantidad de bloques %u más allá del tamaño de bloque %u" + +#: reconstruct.c:478 +#, c-format +msgid "file \"%s\" has truncation block length %u in excess of segment size %u" +msgstr "el archivo «%s» tiene una longitud de truncado de bloque %u en exceso del tamaño de segmento %u" + +#: reconstruct.c:542 +#, c-format +msgid "could not read file \"%s\": read %d of %u" +msgstr "no se pudo leer el archivo «%s»: leídos %d de %u" + +#: reconstruct.c:786 +#, c-format +msgid "could not read from file \"%s\", offset %llu: read %d of %d" +msgstr "no se pudo leer del archivo \"%s\", posición %llu: leídos %d de %d" diff --git a/src/bin/pg_combinebackup/po/fr.po b/src/bin/pg_combinebackup/po/fr.po new file mode 100644 index 0000000000000..aa8b0f4ea61f8 --- /dev/null +++ b/src/bin/pg_combinebackup/po/fr.po @@ -0,0 +1,900 @@ +# LANGUAGE message translation file for pg_combinebackup +# Copyright (C) 2024 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_combinebackup (PostgreSQL) package. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: PostgreSQL 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-11-11 01:52+0000\n" +"PO-Revision-Date: 2024-11-11 09:55+0100\n" +"Last-Translator: Guillaume Lelarge \n" +"Language-Team: French \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.5\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "erreur : " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "attention : " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "astuce : " + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" + +#: ../../common/controldata_utils.c:110 copy_file.c:150 load_manifest.c:161 +#: load_manifest.c:199 pg_combinebackup.c:1400 reconstruct.c:540 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "n'a pas pu lire le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: backup_label.c:174 copy_file.c:68 pg_combinebackup.c:538 +#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:740 +#: write_manifest.c:187 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "n'a pas pu fermer le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "différence de l'ordre des octets" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"possible incohérence dans l'ordre des octets\n" +"L'ordre des octets utilisé pour enregistrer le fichier pg_control peut ne\n" +"pas correspondre à celui utilisé par ce programme. Dans ce cas, les\n" +"résultats ci-dessous sont incorrects, et l'installation de PostgreSQL\n" +"est incompatible avec ce répertoire des données." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 backup_label.c:143 copy_file.c:66 +#: copy_file.c:139 copy_file.c:171 copy_file.c:175 copy_file.c:225 +#: copy_file.c:268 load_manifest.c:128 pg_combinebackup.c:523 +#: pg_combinebackup.c:1167 reconstruct.c:523 reconstruct.c:638 +#: write_manifest.c:250 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:759 +#: write_manifest.c:260 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "impossible d'écrire le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:853 +#, c-format +msgid "out of memory" +msgstr "mémoire épuisée" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "succès" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "tampon de destination trop petit" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "échec OpenSSL" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "mémoire épuisée\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: backup_label.c:187 load_manifest.c:133 pg_combinebackup.c:676 +#: pg_combinebackup.c:1131 pg_combinebackup.c:1383 reconstruct.c:204 +#: reconstruct.c:421 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "n'a pas pu tester le fichier « %s » : %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "cette construction ne supporte pas la méthode de synchronisation « %s »" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_combinebackup.c:933 pg_combinebackup.c:1256 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "n'a pas pu lire le répertoire « %s » : %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" + +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "L'analyseur (parser) en descente récursive ne peut pas utiliser l'analyseur (lexer) incrémental." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "L'analyser (parser) incrémental nécessite l'analyseur (lexer) incrémental." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON trop profondément imbriqué, profondeur maximum permise est 6400." + +#: ../../common/jsonapi.c:2127 +#, c-format +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "La séquence d'échappement « \\%.*s » est invalide." + +#: ../../common/jsonapi.c:2131 +#, c-format +msgid "Character with value 0x%02x must be escaped." +msgstr "Le caractère de valeur 0x%02x doit être échappé." + +#: ../../common/jsonapi.c:2135 +#, c-format +msgid "Expected end of input, but found \"%.*s\"." +msgstr "Fin de l'entrée attendue, mais trouvé « %.*s »." + +#: ../../common/jsonapi.c:2138 +#, c-format +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "Élément de tableau ou « ] » attendu, mais trouvé « %.*s »." + +#: ../../common/jsonapi.c:2141 +#, c-format +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "« , » ou « ] » attendu, mais trouvé « %.*s »." + +#: ../../common/jsonapi.c:2144 +#, c-format +msgid "Expected \":\", but found \"%.*s\"." +msgstr "« : » attendu, mais trouvé « %.*s »." + +#: ../../common/jsonapi.c:2147 +#, c-format +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "Valeur JSON attendue, mais « %.*s » trouvé." + +#: ../../common/jsonapi.c:2150 +msgid "The input string ended unexpectedly." +msgstr "La chaîne en entrée se ferme de manière inattendue." + +#: ../../common/jsonapi.c:2152 +#, c-format +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "Chaîne ou « } » attendu, mais « %.*s » trouvé." + +#: ../../common/jsonapi.c:2155 +#, c-format +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "« , » ou « } » attendu, mais trouvé « %.*s »." + +#: ../../common/jsonapi.c:2158 +#, c-format +msgid "Expected string, but found \"%.*s\"." +msgstr "Chaîne attendue, mais « %.*s » trouvé." + +#: ../../common/jsonapi.c:2161 +#, c-format +msgid "Token \"%.*s\" is invalid." +msgstr "Le jeton « %.*s » n'est pas valide." + +#: ../../common/jsonapi.c:2164 +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 ne peut pas être converti en texte." + +#: ../../common/jsonapi.c:2166 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "« \\u » doit être suivi par quatre chiffres hexadécimaux." + +#: ../../common/jsonapi.c:2169 +msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." +msgstr "Les valeurs d'échappement Unicode ne peuvent pas être utilisées pour des valeurs de point code au-dessus de 007F quand l'encodage n'est pas UTF8." + +#: ../../common/jsonapi.c:2178 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "La valeur d'échappement unicode ne peut pas être traduite dans l'encodage du serveur %s." + +#: ../../common/jsonapi.c:2185 +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "Une substitution unicode haute ne doit pas suivre une substitution haute." + +#: ../../common/jsonapi.c:2187 +msgid "Unicode low surrogate must follow a high surrogate." +msgstr "Une substitution unicode basse ne doit pas suivre une substitution haute." + +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:855 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "n'a pas pu initialiser la somme de contrôle du manifeste" + +#: ../../common/parse_manifest.c:204 ../../common/parse_manifest.c:261 +msgid "manifest ended unexpectedly" +msgstr "le manifeste se termine de façon inattendue" + +#: ../../common/parse_manifest.c:210 ../../common/parse_manifest.c:862 +#, c-format +msgid "could not update checksum of manifest" +msgstr "n'a pas pu mettre à jour la somme de contrôle du manifeste" + +#: ../../common/parse_manifest.c:302 +msgid "unexpected object start" +msgstr "début d'objet inattendu" + +#: ../../common/parse_manifest.c:337 +msgid "unexpected object end" +msgstr "fin d'objet inattendue" + +#: ../../common/parse_manifest.c:366 +msgid "unexpected array start" +msgstr "début de tableau inattendu" + +#: ../../common/parse_manifest.c:391 +msgid "unexpected array end" +msgstr "fin de tableau inattendue" + +#: ../../common/parse_manifest.c:418 +msgid "expected version indicator" +msgstr "indicateur de version inattendu" + +#: ../../common/parse_manifest.c:454 +msgid "unrecognized top-level field" +msgstr "champ haut niveau inconnu" + +#: ../../common/parse_manifest.c:473 +msgid "unexpected file field" +msgstr "champ de fichier inattendu" + +#: ../../common/parse_manifest.c:487 +msgid "unexpected WAL range field" +msgstr "champ d'intervalle de WAL inattendu" + +#: ../../common/parse_manifest.c:493 +msgid "unexpected object field" +msgstr "champ d'objet inattendu" + +#: ../../common/parse_manifest.c:583 +msgid "unexpected scalar" +msgstr "scalaire inattendu" + +#: ../../common/parse_manifest.c:609 +msgid "manifest version not an integer" +msgstr "la version du manifeste n'est pas un entier" + +#: ../../common/parse_manifest.c:613 +msgid "unexpected manifest version" +msgstr "version du manifeste inattendue" + +#: ../../common/parse_manifest.c:637 +msgid "system identifier in manifest not an integer" +msgstr "l'identifieur système dans le manifeste n'est pas un entier" + +#: ../../common/parse_manifest.c:662 +msgid "missing path name" +msgstr "nom de chemin manquant" + +#: ../../common/parse_manifest.c:665 +msgid "both path name and encoded path name" +msgstr "le nom du chemin et le nom du chemin encodé" + +#: ../../common/parse_manifest.c:667 +msgid "missing size" +msgstr "taille manquante" + +#: ../../common/parse_manifest.c:670 +msgid "checksum without algorithm" +msgstr "somme de contrôle sans algorithme" + +#: ../../common/parse_manifest.c:684 +msgid "could not decode file name" +msgstr "n'a pas pu décoder le nom du fichier" + +#: ../../common/parse_manifest.c:694 +msgid "file size is not an integer" +msgstr "la taille du fichier n'est pas un entier" + +#: ../../common/parse_manifest.c:700 pg_combinebackup.c:199 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "algorithme de somme de contrôle inconnu : « %s »" + +#: ../../common/parse_manifest.c:719 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "somme de contrôle invalide pour le fichier « %s » : « %s »" + +#: ../../common/parse_manifest.c:762 +msgid "missing timeline" +msgstr "timeline manquante" + +#: ../../common/parse_manifest.c:764 +msgid "missing start LSN" +msgstr "LSN de début manquante" + +#: ../../common/parse_manifest.c:766 +msgid "missing end LSN" +msgstr "LSN de fin manquante" + +#: ../../common/parse_manifest.c:772 +msgid "timeline is not an integer" +msgstr "la timeline n'est pas un entier" + +#: ../../common/parse_manifest.c:775 +msgid "could not parse start LSN" +msgstr "n'a pas pu analyser le LSN de début" + +#: ../../common/parse_manifest.c:778 +msgid "could not parse end LSN" +msgstr "n'a pas pu analyser le LSN de fin" + +#: ../../common/parse_manifest.c:843 +msgid "expected at least 2 lines" +msgstr "attendait au moins deux lignes" + +#: ../../common/parse_manifest.c:846 +msgid "last line not newline-terminated" +msgstr "dernière ligne non terminée avec un caractère newline" + +#: ../../common/parse_manifest.c:865 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "n'a pas pu finaliser la somme de contrôle du manifeste" + +#: ../../common/parse_manifest.c:869 +#, c-format +msgid "manifest has no checksum" +msgstr "le manifeste n'a pas de somme de contrôle" + +#: ../../common/parse_manifest.c:873 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "somme de contrôle du manifeste invalide : « %s »" + +#: ../../common/parse_manifest.c:877 +#, c-format +msgid "manifest checksum mismatch" +msgstr "différence de somme de contrôle pour le manifeste" + +#: ../../common/parse_manifest.c:892 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "n'a pas pu analyser le manifeste de sauvegarde : %s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "valeur « %s » invalide pour l'option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s doit être compris entre %d et %d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "méthode de synchronisation non reconnu : %s" + +#: backup_label.c:66 backup_label.c:85 backup_label.c:95 +#, c-format +msgid "%s: could not parse %s" +msgstr "%s : n'a pas pu analyser %s" + +#: backup_label.c:69 backup_label.c:88 +#, c-format +msgid "%s: improper terminator for %s" +msgstr "%s : mauvais terminateur pour %s" + +#: backup_label.c:76 +#, c-format +msgid "%s: could not parse TLI for %s" +msgstr "%s : n'a pas pu analyser le TLI pour %s" + +#: backup_label.c:79 backup_label.c:98 +#, c-format +msgid "%s: invalid TLI" +msgstr "%s : TLI invalide" + +#: backup_label.c:106 backup_label.c:108 +#, c-format +msgid "%s: could not find %s" +msgstr "%s : n'a pas pu trouver %s" + +#: backup_label.c:110 backup_label.c:113 +#, c-format +msgid "%s: %s requires %s" +msgstr "%s : %s requiert %s" + +#: backup_label.c:162 reconstruct.c:761 write_manifest.c:262 +#, c-format +msgid "could not write file \"%s\": wrote %d of %d" +msgstr "n'a pas pu écrire le fichier « %s » : a écrit %d sur %d" + +#: backup_label.c:166 copy_file.c:146 copy_file.c:193 reconstruct.c:721 +#: reconstruct.c:767 write_manifest.c:270 +#, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "n'a pas pu mettre à jour la somme de contrôle du fichier « %s »" + +#: copy_file.c:186 +#, c-format +msgid "could not write to file \"%s\": %m" +msgstr "n'a pas pu écrire dans le fichier « %s » : %m" + +#: copy_file.c:188 +#, c-format +msgid "could not write to file \"%s\", offset %u: wrote %d of %d" +msgstr "n'a pas pu écrire dans le fichier « %s », à la position %u : a écrit %d sur %d" + +#: copy_file.c:199 reconstruct.c:784 +#, c-format +msgid "could not read from file \"%s\": %m" +msgstr "n'a pas pu lire à partir du fichier « %s » : %m" + +#: copy_file.c:218 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %m" +msgstr "erreur lors du clonage du fichier « %s » en «%s » : %m" + +#: copy_file.c:229 copy_file.c:272 +#, c-format +msgid "could not create file \"%s\": %m" +msgstr "n'a pas pu créer le fichier « %s » : %m" + +#: copy_file.c:237 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %s" +msgstr "erreur lors du clonage du fichier « %s » en «%s » : %s" + +#: copy_file.c:245 pg_combinebackup.c:251 +#, c-format +msgid "file cloning not supported on this platform" +msgstr "clonage de fichiers non supporté sur cette plateforme" + +#: copy_file.c:278 reconstruct.c:704 +#, c-format +msgid "error while copying file range from \"%s\" to \"%s\": %m" +msgstr "erreur lors de l'opération copy_file_range de « %s » à « %s » : %m" + +#: copy_file.c:285 pg_combinebackup.c:264 reconstruct.c:724 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "copy_file_range non supporté sur cette plateforme" + +#: copy_file.c:300 +#, c-format +msgid "could not copy file \"%s\" to \"%s\": %m" +msgstr "n'a pas pu copier le fichier « %s » en « %s » : %m" + +#: load_manifest.c:125 +#, c-format +msgid "file \"%s\" does not exist" +msgstr "le rôle « %s » n'existe pas" + +#: load_manifest.c:163 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %lld" + +#: load_manifest.c:201 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "n'a pas pu lire le fichier « %s » : a lu %lld sur %lld" + +#: load_manifest.c:249 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "la version du manifeste de sauvegarde ne permet pas les sauvegardes incrémentales" + +#: load_manifest.c:281 +#, c-format +msgid "duplicate path name in backup manifest: \"%s\"" +msgstr "nom de chemin dupliqué dans le manifeste de sauvegarde : « %s »" + +#: pg_combinebackup.c:220 pg_combinebackup.c:228 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." + +#: pg_combinebackup.c:227 +#, c-format +msgid "no input directories specified" +msgstr "aucun répertoire en entrée indiqué" + +#: pg_combinebackup.c:233 +#, c-format +msgid "no output directory specified" +msgstr "aucun répertoire cible indiqué" + +#: pg_combinebackup.c:301 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: l'identifieur système du manifeste est %llu, mais le fichier de contrôle a %llu" + +#: pg_combinebackup.c:340 +#, c-format +msgid "cannot generate a manifest because no manifest is available for the final input backup" +msgstr "ne peut pas générer un manifeste parce qu'aucun manifeste n'est disponible pour la sauvegarde finale en entrée" + +#: pg_combinebackup.c:387 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "n'a pas pu créer le lien symbolique de « %s » vers « %s » : %m" + +#: pg_combinebackup.c:399 pg_combinebackup.c:730 pg_combinebackup.c:927 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "n'a pas pu créer le répertoire « %s » : %m" + +#: pg_combinebackup.c:454 +#, c-format +msgid "directory name too long" +msgstr "nom du répertoire trop long" + +#: pg_combinebackup.c:461 +#, c-format +msgid "multiple \"=\" signs in tablespace mapping" +msgstr "multiple signes « = » dans la correspondance de tablespace" + +#: pg_combinebackup.c:469 +#, c-format +msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" +msgstr "format de correspondance de tablespace « %s » invalide, doit être « ANCIENREPERTOIRE=NOUVEAUREPERTOIRE »" + +#: pg_combinebackup.c:480 pg_combinebackup.c:484 +#, c-format +msgid "old directory is not an absolute path in tablespace mapping: %s" +msgstr "l'ancien répertoire n'est pas un chemin absolu dans la correspondance de tablespace : %s" + +#: pg_combinebackup.c:553 +#, c-format +msgid "backup at \"%s\" is a full backup, but only the first backup should be a full backup" +msgstr "la sauvegarde à « %s » est une sauvegarde complète, mais seule la première sauvegarde devrait être une sauvegarde complète" + +#: pg_combinebackup.c:556 +#, c-format +msgid "backup at \"%s\" is an incremental backup, but the first backup should be a full backup" +msgstr "la sauvegarde à « %s » est une sauvegarde incrémentale, mais la première sauvegarde devrait être une sauvegarde complète" + +#: pg_combinebackup.c:559 +#, c-format +msgid "backup at \"%s\" starts on timeline %u, but expected %u" +msgstr "la sauvegarde à « %s » commence à la timeline %u, mais attendait %u" + +#: pg_combinebackup.c:562 +#, c-format +msgid "backup at \"%s\" starts at LSN %X/%X, but expected %X/%X" +msgstr "la sauvegarde à « %s » commence au LSN %X/%X, mais s'attendait à %X/%X" + +#: pg_combinebackup.c:614 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s : la valeur CRC n'est pas correcte" + +#: pg_combinebackup.c:618 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s : version inattendue pour le fichier de contrôle" + +#: pg_combinebackup.c:625 +#, c-format +msgid "%s: expected system identifier %llu, but found %llu" +msgstr "%s : identifieur système attendu %llu, mais %llu trouvé" + +#: pg_combinebackup.c:657 +#, c-format +msgid "only some backups have checksums enabled" +msgstr "seules certaines sauvegardes ont les sommes de contrôle activées" + +#: pg_combinebackup.c:658 +#, c-format +msgid "Disable, and optionally reenable, checksums on the output directory to avoid failures." +msgstr "Désactivez, puis activez si vous le souhaitez, les sommes de contrôle sur le répertoire en sortie pour éviter les échecs" + +#: pg_combinebackup.c:693 +#, c-format +msgid "removing output directory \"%s\"" +msgstr "suppression du répertoire en sortie « %s »" + +#: pg_combinebackup.c:695 +#, c-format +msgid "failed to remove output directory" +msgstr "échec lors de la suppression du répertoire en sortie" + +#: pg_combinebackup.c:699 +#, c-format +msgid "removing contents of output directory \"%s\"" +msgstr "suppression du contenu du répertoire en sortie « %s »" + +#: pg_combinebackup.c:702 +#, c-format +msgid "failed to remove contents of output directory" +msgstr "échec lors de la suppression du contenu du répertoire en sortie" + +#: pg_combinebackup.c:742 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "le répertoire « %s » existe mais n'est pas vide" + +#: pg_combinebackup.c:745 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "n'a pas pu accéder au répertoire « %s » : %m" + +#: pg_combinebackup.c:759 +#, c-format +msgid "" +"%s reconstructs full backups from incrementals.\n" +"\n" +msgstr "" +"%s reconstruit des sauvegardes complètes à partir de sauvegardes incrémentales.\n" +"\n" + +#: pg_combinebackup.c:760 +#, c-format +msgid "Usage:\n" +msgstr "Usage :\n" + +#: pg_combinebackup.c:761 +#, c-format +msgid " %s [OPTION]... DIRECTORY...\n" +msgstr " %s [OPTION]... RÉPERTOIRE...\n" + +#: pg_combinebackup.c:762 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Options :\n" + +#: pg_combinebackup.c:763 +#, c-format +msgid " -d, --debug generate lots of debugging output\n" +msgstr " -d, --debug engendre un grand nombre de traces de débogage\n" + +#: pg_combinebackup.c:764 +#, c-format +msgid " -n, --dry-run do not actually do anything\n" +msgstr " -n, --dry-run ne fait rien\n" + +#: pg_combinebackup.c:765 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr "" +" -N, --nosync n'attend pas que les modifications soient\n" +" proprement écrites sur disque\n" + +#: pg_combinebackup.c:766 +#, c-format +msgid " -o, --output=DIRECTORY output directory\n" +msgstr " -o, --output=RÉPERTOIRE répertoire en sortie\n" + +#: pg_combinebackup.c:767 +#, c-format +msgid "" +" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" +" relocate tablespace in OLDDIR to NEWDIR\n" +msgstr "" +" -T, --tablespace-mapping=ANCIENREP=NOUVEAUREP\n" +" déplace le tablespace de ANCIENREP vers NOUVEAUREP\n" + +#: pg_combinebackup.c:769 +#, c-format +msgid " --clone clone (reflink) files instead of copying\n" +msgstr " --clone clone (reflink) les fichiers au lieu de les copier\n" + +#: pg_combinebackup.c:770 +#, c-format +msgid " --copy copy files (default)\n" +msgstr " --copy copie les fichiers (par défaut)\n" + +#: pg_combinebackup.c:771 +#, c-format +msgid " --copy-file-range copy using copy_file_range() system call\n" +msgstr " --copy-file-range copie les fichiers en utilisant la fonction système copy_file_range()\n" + +#: pg_combinebackup.c:772 +#, c-format +msgid "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" use algorithm for manifest checksums\n" +msgstr "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" utilise l'algorithme pour les sommes de contrôle du manifeste\n" + +#: pg_combinebackup.c:774 +#, c-format +msgid " --no-manifest suppress generation of backup manifest\n" +msgstr " --no-manifest ne génère pas de manifeste de sauvegarde\n" + +#: pg_combinebackup.c:775 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHODE configure la méthode pour synchroniser les fichiers sur disque\n" + +#: pg_combinebackup.c:776 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version affiche la version puis quitte\n" + +#: pg_combinebackup.c:777 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help affiche cette aide puis quitte\n" + +#: pg_combinebackup.c:779 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Rapporter les bogues à <%s>.\n" + +#: pg_combinebackup.c:780 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" + +#: pg_combinebackup.c:995 +#, c-format +msgid "skipping symbolic link \"%s\"" +msgstr "ignore le lien symbolique « %s »" + +#: pg_combinebackup.c:997 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "ignore le fichier spécial « %s »" + +#: pg_combinebackup.c:1073 reconstruct.c:305 +#, c-format +msgid "manifest file \"%s\" contains no entry for file \"%s\"" +msgstr "le fichier manifeste « %s » ne contient aucune entrée pour le fichier « %s »" + +#: pg_combinebackup.c:1189 +#, c-format +msgid "%s: server version too old" +msgstr "%s : version trop ancienne du serveur" + +#: pg_combinebackup.c:1190 +#, c-format +msgid "%s: could not parse version number" +msgstr "%s : n'a pas pu analyser le numéro de version" + +#: pg_combinebackup.c:1309 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "n'a pas pu lire le lien symbolique « %s » : %m" + +#: pg_combinebackup.c:1312 +#, c-format +msgid "target of symbolic link \"%s\" is too long" +msgstr "la cible « %s » du lien symbolique est trop longue" + +#: pg_combinebackup.c:1315 +#, c-format +msgid "target of symbolic link \"%s\" is relative" +msgstr "la cible « %s » du lien symbolique est relative" + +#: pg_combinebackup.c:1337 +#, c-format +msgid "tablespace at \"%s\" has no tablespace mapping" +msgstr "le tablespace sur \"%s\" n'a pas de correspondance de tablespace" + +#: pg_combinebackup.c:1355 +#, c-format +msgid "tablespaces with OIDs %u and %u both point at directory \"%s\"" +msgstr "les tablespaces d'OID %u et %u pointent tous les deux au répertoire « %s »" + +#: pg_combinebackup.c:1364 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "n'a pas pu fermer le répertoire « %s » : %m" + +#: pg_combinebackup.c:1385 +#, c-format +msgid "file \"%s\" is too large" +msgstr "le fichier « %s » est trop gros" + +#: pg_combinebackup.c:1402 +#, c-format +msgid "could not read file \"%s\": read %zd of %lld" +msgstr "n'a pas pu lire le fichier « %s » : a lu %zd sur %lld" + +#: reconstruct.c:339 +#, c-format +msgid "full backup contains unexpected incremental file \"%s\"" +msgstr "la sauvegarde complète contient un fichier incrémental inattendu « %s »" + +#: reconstruct.c:423 +#, c-format +msgid "file \"%s\" is too short: expected %llu, found %llu" +msgstr "le fichier « %s » est trop court : attendait %llu, a trouvé %llu" + +#: reconstruct.c:465 +#, c-format +msgid "file \"%s\" has bad incremental magic number (0x%x, expected 0x%x)" +msgstr "le fichier « %s » a un mauvaise numéro magique incrémental (0x%x et non pas 0x%x)" + +#: reconstruct.c:471 +#, c-format +msgid "file \"%s\" has block count %u in excess of segment size %u" +msgstr "le fichier « %s » a %u blocs en plus de la taille de segment %u" + +#: reconstruct.c:478 +#, c-format +msgid "file \"%s\" has truncation block length %u in excess of segment size %u" +msgstr "le fichier « %s » a une longueur de bloc %u pour la troncation en excès de la taille de segment %u" + +#: reconstruct.c:542 +#, c-format +msgid "could not read file \"%s\": read %d of %u" +msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %u" + +#: reconstruct.c:786 +#, c-format +msgid "could not read from file \"%s\", offset %llu: read %d of %d" +msgstr "n'a pas pu lire le fichier « %s » à la position %llu : a lu %d sur %d" diff --git a/src/bin/pg_combinebackup/po/ja.po b/src/bin/pg_combinebackup/po/ja.po new file mode 100644 index 0000000000000..068f398f0d988 --- /dev/null +++ b/src/bin/pg_combinebackup/po/ja.po @@ -0,0 +1,903 @@ +# LANGUAGE message translation file for pg_combinebackup +# Copyright (C) 2024 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_combinebackup (PostgreSQL) package. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_combinebackup (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-11-05 09:21+0900\n" +"PO-Revision-Date: 2024-11-05 09:28+0900\n" +"Last-Translator: Kyotaro Horiguchi \n" +"Language-Team: \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.13\n" + +#: ../../../src/common/logging.c:279 +#, c-format +msgid "error: " +msgstr "エラー: " + +#: ../../../src/common/logging.c:286 +#, c-format +msgid "warning: " +msgstr "警告: " + +#: ../../../src/common/logging.c:297 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:304 +#, c-format +msgid "hint: " +msgstr "ヒント: " + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ファイル\"%s\"を読ã¿è¾¼ã¿ç”¨ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:110 copy_file.c:150 load_manifest.c:161 +#: load_manifest.c:199 pg_combinebackup.c:1400 reconstruct.c:540 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ファイル\"%s\"ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$zuãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: backup_label.c:174 copy_file.c:68 pg_combinebackup.c:538 +#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:740 +#: write_manifest.c:188 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒåˆã£ã¦ã„ã¾ã›ã‚“" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒç•°ãªã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚\n" +"pg_controlファイルを格ç´ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒæœ¬ãƒ—ログラムã§ä½¿ç”¨\n" +"ã•れるもã®ã¨ä¸€è‡´ã—ãªã„よã†ã§ã™ã€‚ã“ã®å ´åˆä»¥ä¸‹ã®çµæžœã¯ä¸æ­£ç¢ºã«ãªã‚Šã¾ã™ã€‚ã¾ãŸã€\n" +"PostgreSQLインストレーションã¯ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨äº’æ›æ€§ãŒãªããªã‚Šã¾ã™ã€‚" + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:71 +#: ../../common/file_utils.c:348 ../../common/file_utils.c:407 +#: ../../common/file_utils.c:481 backup_label.c:143 copy_file.c:66 +#: copy_file.c:139 copy_file.c:171 copy_file.c:175 copy_file.c:225 +#: copy_file.c:268 load_manifest.c:128 pg_combinebackup.c:523 +#: pg_combinebackup.c:1167 reconstruct.c:523 reconstruct.c:638 +#: write_manifest.c:251 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:759 +#: write_manifest.c:261 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:419 +#: ../../common/file_utils.c:489 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/jsonapi.c:2317 ../../common/parse_manifest.c:157 +#: ../../common/parse_manifest.c:853 +#, c-format +msgid "out of memory" +msgstr "メモリä¸è¶³ã§ã™" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "æˆåŠŸ" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "出力先ãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¾ã™" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "OpenSSLã®ã‚¨ãƒ©ãƒ¼" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "メモリä¸è¶³ã§ã™\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "nullãƒã‚¤ãƒ³ã‚¿ã¯è¤‡è£½ã§ãã¾ã›ã‚“(内部エラー)\n" + +#: ../../common/file_utils.c:77 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "ファイル\"%s\"ã«å¯¾ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã‚’åŒæœŸã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:121 ../../common/file_utils.c:567 +#: backup_label.c:187 load_manifest.c:133 pg_combinebackup.c:676 +#: pg_combinebackup.c:1131 pg_combinebackup.c:1383 reconstruct.c:204 +#: reconstruct.c:421 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m" + +#: ../../common/file_utils.c:131 ../../common/file_utils.c:228 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ã“ã®ãƒ“ルドã§ã¯åŒæœŸæ–¹å¼\"%s\"をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" + +#: ../../common/file_utils.c:152 ../../common/file_utils.c:282 +#: pg_combinebackup.c:933 pg_combinebackup.c:1256 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:170 ../../common/file_utils.c:316 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:499 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/jsonapi.c:2342 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "å†å¸°é™ä¸‹ãƒ‘ーサーã¯å·®åˆ†å­—å¥è§£æžå™¨ã‚’使用ã§ãã¾ã›ã‚“。" + +#: ../../common/jsonapi.c:2344 +msgid "Incremental parser requires incremental lexer." +msgstr "差分パーサーã¯å·®åˆ†å­—å¥è§£æžå™¨ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚" + +#: ../../common/jsonapi.c:2346 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSONã®ãƒã‚¹ãƒˆãŒæ·±ã™ãŽã¾ã™ã€å¯èƒ½ãªæœ€å¤§ã®æ·±ã•ã¯6400ã§ã™ã€‚" + +#: ../../common/jsonapi.c:2348 +#, c-format +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "エスケープシーケンス\"\\%.*s\"ã¯ä¸æ­£ã§ã™ã€‚" + +#: ../../common/jsonapi.c:2352 +#, c-format +msgid "Character with value 0x%02x must be escaped." +msgstr "0x%02x値をæŒã¤æ–‡å­—ã¯ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#: ../../common/jsonapi.c:2356 +#, c-format +msgid "Expected end of input, but found \"%.*s\"." +msgstr "入力ã®çµ‚端を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" + +#: ../../common/jsonapi.c:2359 +#, c-format +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "é…列è¦ç´ ã¾ãŸã¯\"]\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" + +#: ../../common/jsonapi.c:2362 +#, c-format +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "\",\"ã¾ãŸã¯\"]\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" + +#: ../../common/jsonapi.c:2365 +#, c-format +msgid "Expected \":\", but found \"%.*s\"." +msgstr "\":\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" + +#: ../../common/jsonapi.c:2368 +#, c-format +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "JSON値を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" + +#: ../../common/jsonapi.c:2371 +msgid "The input string ended unexpectedly." +msgstr "入力文字列ãŒäºˆæœŸã›ãšçµ‚了ã—ã¾ã—ãŸã€‚" + +#: ../../common/jsonapi.c:2373 +#, c-format +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "文字列ã¾ãŸã¯\"}\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" + +#: ../../common/jsonapi.c:2376 +#, c-format +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "\",\"ã¾ãŸã¯\"}\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" + +#: ../../common/jsonapi.c:2379 +#, c-format +msgid "Expected string, but found \"%.*s\"." +msgstr "文字列を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" + +#: ../../common/jsonapi.c:2382 +#, c-format +msgid "Token \"%.*s\" is invalid." +msgstr "トークン\"\\%.*s\"ã¯ä¸æ­£ã§ã™ã€‚" + +#: ../../common/jsonapi.c:2388 +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 ã¯ãƒ†ã‚­ã‚¹ãƒˆã«å¤‰æ›ã§ãã¾ã›ã‚“。" + +#: ../../common/jsonapi.c:2390 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "\"\\u\"ã®å¾Œã«ã¯16進数ã®4æ¡ãŒç¶šã‹ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" + +#: ../../common/jsonapi.c:2393 +msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." +msgstr "エンコーディングãŒUTF-8ã§ã¯ãªã„å ´åˆã€ã‚³ãƒ¼ãƒ‰ãƒã‚¤ãƒ³ãƒˆã®å€¤ãŒ 007F 以上ã«ã¤ã„ã¦ã¯Unicodeエスケープã®å€¤ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。" + +#: ../../common/jsonapi.c:2402 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "Unicodeエスケープã®å€¤ãŒã‚µãƒ¼ãƒãƒ¼ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°%sã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" + +#: ../../common/jsonapi.c:2409 +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "Unicodeã®ãƒã‚¤ã‚µãƒ­ã‚²ãƒ¼ãƒˆã¯ãƒã‚¤ã‚µãƒ­ã‚²ãƒ¼ãƒˆã«ç¶šã„ã¦ã¯ã„ã‘ã¾ã›ã‚“。" + +#: ../../common/jsonapi.c:2411 +msgid "Unicode low surrogate must follow a high surrogate." +msgstr "Unicodeã®ãƒ­ãƒ¼ã‚µãƒ­ã‚²ãƒ¼ãƒˆã¯ãƒã‚¤ã‚µãƒ­ã‚²ãƒ¼ãƒˆã«ç¶šã‹ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" + +#: ../../common/jsonapi.c:2433 +msgid "out of memory while constructing error description" +msgstr "ã‚¨ãƒ©ãƒ¼è¨˜è¿°ã®æ§‹ç¯‰ä¸­ã«ãƒ¡ãƒ¢ãƒªä¸è¶³" + +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:855 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®åˆæœŸåŒ–ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: ../../common/parse_manifest.c:204 ../../common/parse_manifest.c:261 +msgid "manifest ended unexpectedly" +msgstr "目録ãŒäºˆæœŸã›ãšçµ‚了ã—ã¾ã—ãŸã€‚" + +#: ../../common/parse_manifest.c:210 ../../common/parse_manifest.c:862 +#, c-format +msgid "could not update checksum of manifest" +msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®æ›´æ–°ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: ../../common/parse_manifest.c:302 +msgid "unexpected object start" +msgstr "予期ã—ãªã„オブジェクトã®é–‹å§‹" + +#: ../../common/parse_manifest.c:337 +msgid "unexpected object end" +msgstr "予期ã—ãªã„オブジェクトã®çµ‚ã‚り" + +#: ../../common/parse_manifest.c:366 +msgid "unexpected array start" +msgstr "予期ã—ãªã„é…列ã®é–‹å§‹" + +#: ../../common/parse_manifest.c:391 +msgid "unexpected array end" +msgstr "予期ã—ãªã„é…列ã®çµ‚ã‚り" + +#: ../../common/parse_manifest.c:418 +msgid "expected version indicator" +msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³æŒ‡ç¤ºå­ã‚’想定ã—ã¦ã„ã¾ã—ãŸ" + +#: ../../common/parse_manifest.c:454 +msgid "unrecognized top-level field" +msgstr "èªè­˜ã§ããªã„トップレベルフィールド" + +#: ../../common/parse_manifest.c:473 +msgid "unexpected file field" +msgstr "予期ã—ãªã„ファイルフィールド" + +#: ../../common/parse_manifest.c:487 +msgid "unexpected WAL range field" +msgstr "予期ã—ãªã„WAL範囲フィールド" + +#: ../../common/parse_manifest.c:493 +msgid "unexpected object field" +msgstr "予期ã—ãªã„オブジェクトフィールド" + +#: ../../common/parse_manifest.c:583 +msgid "unexpected scalar" +msgstr "予期ã—ãªã„スカラー" + +#: ../../common/parse_manifest.c:609 +msgid "manifest version not an integer" +msgstr "目録ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒæ•´æ•°ã§ã¯ã‚りã¾ã›ã‚“" + +#: ../../common/parse_manifest.c:613 +msgid "unexpected manifest version" +msgstr "予期ã—ãªã„目録ãƒãƒ¼ã‚¸ãƒ§ãƒ³" + +#: ../../common/parse_manifest.c:637 +msgid "system identifier in manifest not an integer" +msgstr "目録中ã®ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ãŒæ•´æ•°ã§ã¯ã‚りã¾ã›ã‚“" + +#: ../../common/parse_manifest.c:662 +msgid "missing path name" +msgstr "パスåãŒã‚りã¾ã›ã‚“" + +#: ../../common/parse_manifest.c:665 +msgid "both path name and encoded path name" +msgstr "パスåã¨ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•れãŸãƒ‘スåã®ä¸¡æ–¹" + +#: ../../common/parse_manifest.c:667 +msgid "missing size" +msgstr "サイズãŒã‚りã¾ã›ã‚“" + +#: ../../common/parse_manifest.c:670 +msgid "checksum without algorithm" +msgstr "アルゴリズムãªã—ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ " + +#: ../../common/parse_manifest.c:684 +msgid "could not decode file name" +msgstr "ファイルåをデコードã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: ../../common/parse_manifest.c:694 +msgid "file size is not an integer" +msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºãŒæ•´æ•°ã§ã¯ã‚りã¾ã›ã‚“" + +#: ../../common/parse_manifest.c:700 pg_combinebackup.c:199 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "èªè­˜ã§ããªã„ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ : \"%s\"" + +#: ../../common/parse_manifest.c:719 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "\"%s\" ファイルã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒç„¡åй: \"%s\"" + +#: ../../common/parse_manifest.c:762 +msgid "missing timeline" +msgstr "タイムラインãŒã‚りã¾ã›ã‚“" + +#: ../../common/parse_manifest.c:764 +msgid "missing start LSN" +msgstr "é–‹å§‹LSNãŒã‚りã¾ã›ã‚“" + +#: ../../common/parse_manifest.c:766 +msgid "missing end LSN" +msgstr "終了LSNãŒã‚りã¾ã›ã‚“" + +#: ../../common/parse_manifest.c:772 +msgid "timeline is not an integer" +msgstr "ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ãŒæ•´æ•°ã§ã¯ã‚りã¾ã›ã‚“" + +#: ../../common/parse_manifest.c:775 +msgid "could not parse start LSN" +msgstr "é–‹å§‹LSNをパースã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: ../../common/parse_manifest.c:778 +msgid "could not parse end LSN" +msgstr "終了LSNをパースã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: ../../common/parse_manifest.c:843 +msgid "expected at least 2 lines" +msgstr "å°‘ãªãã¨ã‚‚2行ãŒå¿…è¦ã§ã™" + +#: ../../common/parse_manifest.c:846 +msgid "last line not newline-terminated" +msgstr "最後ã®è¡ŒãŒæ”¹è¡Œã§çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“" + +#: ../../common/parse_manifest.c:865 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®å®Œäº†ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: ../../common/parse_manifest.c:869 +#, c-format +msgid "manifest has no checksum" +msgstr "目録ã«ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒã‚りã¾ã›ã‚“" + +#: ../../common/parse_manifest.c:873 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "無効ãªç›®éŒ²ãƒã‚§ãƒƒã‚¯ã‚µãƒ : \"%s\"" + +#: ../../common/parse_manifest.c:877 +#, c-format +msgid "manifest checksum mismatch" +msgstr "目録ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ä¸ä¸€è‡´" + +#: ../../common/parse_manifest.c:892 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録をパースã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "オプション%2$sã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%sã¯%d..%dã®ç¯„囲ã«ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "èªè­˜ã§ããªã„åŒæœŸæ–¹å¼: %s" + +#: backup_label.c:66 backup_label.c:85 backup_label.c:95 +#, c-format +msgid "%s: could not parse %s" +msgstr "%s: %sをパースã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: backup_label.c:69 backup_label.c:88 +#, c-format +msgid "%s: improper terminator for %s" +msgstr "%s: %sã«å¯¾ã™ã‚‹ä¸é©åˆ‡ãªçµ‚端文字" + +#: backup_label.c:76 +#, c-format +msgid "%s: could not parse TLI for %s" +msgstr "%s: %sã®TLIã®ãƒ‘ースãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: backup_label.c:79 backup_label.c:98 +#, c-format +msgid "%s: invalid TLI" +msgstr "%s: 䏿­£ãªTLI" + +#: backup_label.c:106 backup_label.c:108 +#, c-format +msgid "%s: could not find %s" +msgstr "%s: %sãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" + +#: backup_label.c:110 backup_label.c:113 +#, c-format +msgid "%s: %s requires %s" +msgstr "%s: %sã¯%sã‚’å¿…è¦ã¨ã—ã¾ã™" + +#: backup_label.c:162 reconstruct.c:761 write_manifest.c:263 +#, c-format +msgid "could not write file \"%s\": wrote %d of %d" +msgstr "ファイル\"%1$s\"ã®æ›¸ãè¾¼ã¿ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %3$dãƒã‚¤ãƒˆä¸­%2$dãƒã‚¤ãƒˆæ›¸ãè¾¼ã¿ã¾ã—ãŸ" + +#: backup_label.c:166 copy_file.c:146 copy_file.c:193 reconstruct.c:721 +#: reconstruct.c:767 write_manifest.c:271 +#, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®æ›´æ–°ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: copy_file.c:186 +#, c-format +msgid "could not write to file \"%s\": %m" +msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: copy_file.c:188 +#, c-format +msgid "could not write to file \"%s\", offset %u: wrote %d of %d" +msgstr "ファイル \"%1$s\"ã€ã‚ªãƒ•セット%2$uã§æ›¸ãè¾¼ã¿ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %4$dãƒã‚¤ãƒˆä¸­%3$dãƒã‚¤ãƒˆæ›¸ãè¾¼ã¿ã¾ã—ãŸ" + +#: copy_file.c:199 reconstruct.c:784 +#, c-format +msgid "could not read from file \"%s\": %m" +msgstr "ファイル\"%s\"ã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: copy_file.c:218 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %m" +msgstr "ファイル\"%s\"ã®\"%s\"ã¸ã®ã‚¯ãƒ­ãƒ¼ãƒ‹ãƒ³ã‚°ä¸­ã®ã‚¨ãƒ©ãƒ¼: %m" + +#: copy_file.c:229 copy_file.c:272 +#, c-format +msgid "could not create file \"%s\": %m" +msgstr "ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: copy_file.c:237 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %s" +msgstr "ファイル\"%s\"ã®\"%s\"ã¸ã®ã‚¯ãƒ­ãƒ¼ãƒ‹ãƒ³ã‚°ä¸­ã®ã‚¨ãƒ©ãƒ¼: %s" + +#: copy_file.c:245 pg_combinebackup.c:251 +#, c-format +msgid "file cloning not supported on this platform" +msgstr "ã“ã®ãƒ—ラットフォームã§ã¯ãƒ•ァイルã®ã‚¯ãƒ­ãƒ¼ãƒ³ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" + +#: copy_file.c:278 reconstruct.c:704 +#, c-format +msgid "error while copying file range from \"%s\" to \"%s\": %m" +msgstr "\"%s\"ã®\"%s\"ã¸ã®ãƒ•ァイル範囲ã®ã‚³ãƒ”ー中ã®ã‚¨ãƒ©ãƒ¼: %m" + +#: copy_file.c:285 pg_combinebackup.c:264 reconstruct.c:724 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "ã“ã®ãƒ—ラットフォームã§ã¯copy_file_rangeã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" + +#: copy_file.c:300 +#, c-format +msgid "could not copy file \"%s\" to \"%s\": %m" +msgstr "ファイル\"%s\"ã‚’\"%s\"ã«ã‚³ãƒ”ーã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: load_manifest.c:125 +#, c-format +msgid "file \"%s\" does not exist" +msgstr "ファイル\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" + +#: load_manifest.c:163 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$lldãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" + +#: load_manifest.c:201 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$lldãƒã‚¤ãƒˆã®ã†ã¡%2$lldãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" + +#: load_manifest.c:249 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³1ã¯å·®åˆ†ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" + +#: load_manifest.c:281 +#, c-format +msgid "duplicate path name in backup manifest: \"%s\"" +msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録内ã®é‡è¤‡ãƒ‘スå: \"%s\"" + +#: pg_combinebackup.c:220 pg_combinebackup.c:228 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" + +#: pg_combinebackup.c:227 +#, c-format +msgid "no input directories specified" +msgstr "å…¥åŠ›ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" + +#: pg_combinebackup.c:233 +#, c-format +msgid "no output directory specified" +msgstr "å‡ºåŠ›ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" + +#: pg_combinebackup.c:301 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: 目録ã®ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ãŒ%lluã§ã™ãŒã€åˆ¶å¾¡ãƒ•ァイルã§ã¯%lluã§ã™" + +#: pg_combinebackup.c:340 +#, c-format +msgid "cannot generate a manifest because no manifest is available for the final input backup" +msgstr "最後ã®å…¥åŠ›ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã«ç›®éŒ²ãŒãªã„ãŸã‚目録を生æˆã§ãã¾ã›ã‚“" + +#: pg_combinebackup.c:387 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "\"%s\"ã‹ã‚‰\"%s\"ã¸ã®ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: pg_combinebackup.c:399 pg_combinebackup.c:730 pg_combinebackup.c:927 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: pg_combinebackup.c:454 +#, c-format +msgid "directory name too long" +msgstr "ディレクトリåãŒé•·ã™ãŽã¾ã™" + +#: pg_combinebackup.c:461 +#, c-format +msgid "multiple \"=\" signs in tablespace mapping" +msgstr "テーブル空間ã®ãƒžãƒƒãƒ”ングã«è¤‡æ•°ã®\"=\"記å·ãŒã‚りã¾ã™" + +#: pg_combinebackup.c:469 +#, c-format +msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" +msgstr "テーブル空間ã®ãƒžãƒƒãƒ”ング形å¼\"%s\"ãŒä¸æ­£ã§ã™ã€‚\"æ—§DIR=æ–°DIR\"ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#: pg_combinebackup.c:480 pg_combinebackup.c:484 +#, c-format +msgid "old directory is not an absolute path in tablespace mapping: %s" +msgstr "テーブル空間ã®ãƒžãƒƒãƒ”ングã«ãŠã„ã¦ã€æ—§ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒçµ¶å¯¾ãƒ‘スã§ã¯ã‚りã¾ã›ã‚“: %s" + +#: pg_combinebackup.c:553 +#, c-format +msgid "backup at \"%s\" is a full backup, but only the first backup should be a full backup" +msgstr "\"%s\"ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯ãƒ•ルãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ã™ãŒã€æœ€åˆã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®ã¿ãŒãƒ•ルãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" + +#: pg_combinebackup.c:556 +#, c-format +msgid "backup at \"%s\" is an incremental backup, but the first backup should be a full backup" +msgstr "\"%s\"ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯å·®åˆ†ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ã™ãŒã€æœ€åˆã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯ãƒ•ルãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" + +#: pg_combinebackup.c:559 +#, c-format +msgid "backup at \"%s\" starts on timeline %u, but expected %u" +msgstr "\"%s\"ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³%uã§å§‹ã¾ã£ã¦ã„ã¾ã™ãŒã€%uを期待ã—ã¦ã„ã¾ã—ãŸ" + +#: pg_combinebackup.c:562 +#, c-format +msgid "backup at \"%s\" starts at LSN %X/%X, but expected %X/%X" +msgstr "\"%s\"ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯LSN %X/%Xã§å§‹ã¾ã£ã¦ã„ã¾ã™ãŒã€%X/%Xを期待ã—ã¦ã„ã¾ã—ãŸ" + +#: pg_combinebackup.c:614 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: CRCãŒæ­£ã—ãã‚りã¾ã›ã‚“" + +#: pg_combinebackup.c:618 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: 予期ã—ãªã„制御ファイルãƒãƒ¼ã‚¸ãƒ§ãƒ³" + +#: pg_combinebackup.c:625 +#, c-format +msgid "%s: expected system identifier %llu, but found %llu" +msgstr "%s: ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ %llu を予期ã—ã¦ã„ã¾ã—ãŸãŒã€%llu ã§ã—ãŸ" + +#: pg_combinebackup.c:657 +#, c-format +msgid "only some backups have checksums enabled" +msgstr "一部ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®ã¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒæœ‰åŠ¹åŒ–ã•れã¦ã„ã¾ã™" + +#: pg_combinebackup.c:658 +#, c-format +msgid "Disable, and optionally reenable, checksums on the output directory to avoid failures." +msgstr "失敗を防止ã™ã‚‹ãŸã‚ã«ã¯å‡ºåŠ›å…ˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’無効ã«ã—ã¦ã€å¿…è¦ã«å¿œã˜ã¦å†åº¦æœ‰åйã«ã—ã¦ãã ã•ã„。" + +#: pg_combinebackup.c:693 +#, c-format +msgid "removing output directory \"%s\"" +msgstr "出力ディレクトリ\"%s\"を削除ã—ã¦ã„ã¾ã™" + +#: pg_combinebackup.c:695 +#, c-format +msgid "failed to remove output directory" +msgstr "出力ディレクトリã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ" + +#: pg_combinebackup.c:699 +#, c-format +msgid "removing contents of output directory \"%s\"" +msgstr "出力ディレクトリ\"%s\"ã®å†…容ã®å‰Šé™¤ä¸­" + +#: pg_combinebackup.c:702 +#, c-format +msgid "failed to remove contents of output directory" +msgstr "出力ディレクトリã®å†…容ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ" + +#: pg_combinebackup.c:742 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "ディレクトリ\"%s\"ã¯å­˜åœ¨ã—ã¾ã™ãŒã€ç©ºã§ã¯ã‚りã¾ã›ã‚“" + +#: pg_combinebackup.c:745 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: pg_combinebackup.c:759 +#, c-format +msgid "" +"%s reconstructs full backups from incrementals.\n" +"\n" +msgstr "" +"%s 差分ã‹ã‚‰ãƒ•ルãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã‚’å†æ§‹ç¯‰ã™ã‚‹ã€‚\n" +"\n" + +#: pg_combinebackup.c:760 +#, c-format +msgid "Usage:\n" +msgstr "使用方法:\n" + +#: pg_combinebackup.c:761 +#, c-format +msgid " %s [OPTION]... DIRECTORY...\n" +msgstr " %s [オプション]... ディレクトリ...\n" + +#: pg_combinebackup.c:762 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"オプション:\n" + +#: pg_combinebackup.c:763 +#, c-format +msgid " -d, --debug generate lots of debugging output\n" +msgstr " -d, --debug 多ãã®ãƒ‡ãƒãƒƒã‚°ç”¨ã®å‡ºåŠ›ã‚’ç”Ÿæˆ\n" + +#: pg_combinebackup.c:764 +#, c-format +msgid " -n, --dry-run do not actually do anything\n" +msgstr " -n, --dry-run 実際ã«ã¯ä½•ã‚‚ã—ãªã„\n" + +#: pg_combinebackup.c:765 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr " -N, --no-sync 変更ã®å®‰å…¨ãªãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®æ›¸ã出ã—を待機ã—ãªã„\n" + +#: pg_combinebackup.c:766 +#, c-format +msgid " -o, --output=DIRECTORY output directory\n" +msgstr " -o, --output=DIRECTORY 出力ディレクトリ\n" + +#: pg_combinebackup.c:767 +#, c-format +msgid "" +" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" +" relocate tablespace in OLDDIR to NEWDIR\n" +msgstr "" +" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" +" OLDDIRã«ã‚るテーブルスペースをNEWDIRã¸ç§»å‹•\n" + +#: pg_combinebackup.c:769 +#, c-format +msgid " --clone clone (reflink) files instead of copying\n" +msgstr "" +" --clone ファイルをコピーã™ã‚‹ã®ã§ã¯ãªãクローニング(reflink)\n" +" を行ã†\n" + +#: pg_combinebackup.c:770 +#, c-format +msgid " --copy copy files (default)\n" +msgstr " --copy ファイルをコピーã™ã‚‹(デフォルト)\n" + +#: pg_combinebackup.c:771 +#, c-format +msgid " --copy-file-range copy using copy_file_range() system call\n" +msgstr " --copy-file-range copy_file_range()システムコールã§ã‚³ãƒ”ーã™ã‚‹\n" + +#: pg_combinebackup.c:772 +#, c-format +msgid "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" use algorithm for manifest checksums\n" +msgstr "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" 目録ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã‚’指定\n" + +#: pg_combinebackup.c:774 +#, c-format +msgid " --no-manifest suppress generation of backup manifest\n" +msgstr " --no-manifest ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—マニフェストã®ç”Ÿæˆã‚’抑止\n" + +#: pg_combinebackup.c:775 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD ファイルをディスクã«åŒæœŸã•ã›ã‚‹æ–¹æ³•を指定\n" + +#: pg_combinebackup.c:776 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" + +#: pg_combinebackup.c:777 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" + +#: pg_combinebackup.c:779 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" + +#: pg_combinebackup.c:780 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s ホームページ: <%s>\n" + +#: pg_combinebackup.c:995 +#, c-format +msgid "skipping symbolic link \"%s\"" +msgstr "シンボリックリンク\"%s\"をスキップã—ã¾ã™" + +#: pg_combinebackup.c:997 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "スペシャルファイル\"%s\"をスキップã—ã¦ã„ã¾ã™" + +#: pg_combinebackup.c:1073 reconstruct.c:305 +#, c-format +msgid "manifest file \"%s\" contains no entry for file \"%s\"" +msgstr "目録ファイル\"%s\" ã«ã¯ãƒ•ァイル\"%s\"ã®ã‚¨ãƒ³ãƒˆãƒªãŒã‚りã¾ã›ã‚“" + +#: pg_combinebackup.c:1189 +#, c-format +msgid "%s: server version too old" +msgstr "%s: サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¤ã™ãŽã¾ã™" + +#: pg_combinebackup.c:1190 +#, c-format +msgid "%s: could not parse version number" +msgstr "%s: ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ã‚’パースã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: pg_combinebackup.c:1309 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "シンボリックリンク\"%s\"を読ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: pg_combinebackup.c:1312 +#, c-format +msgid "target of symbolic link \"%s\" is too long" +msgstr "シンボリックリンク\"%s\"ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãŒé•·ã™ãŽã¾ã™" + +#: pg_combinebackup.c:1315 +#, c-format +msgid "target of symbolic link \"%s\" is relative" +msgstr "シンボリックリンク\"%s\"ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãŒç›¸å¯¾çš„ã§ã™" + +#: pg_combinebackup.c:1337 +#, c-format +msgid "tablespace at \"%s\" has no tablespace mapping" +msgstr "\"%s\"ã«ã‚るテーブルスペースã«å¯¾å¿œã™ã‚‹ãƒ†ãƒ¼ãƒ–ルスペースマッピングãŒã‚りã¾ã›ã‚“" + +#: pg_combinebackup.c:1355 +#, c-format +msgid "tablespaces with OIDs %u and %u both point at directory \"%s\"" +msgstr "OID %uã¨%uã®ãƒ†ãƒ¼ãƒ–ルスペースãŒã©ã¡ã‚‰ã‚‚ディレクトリ\"%s\"を指ã—ã¦ã„ã¾ã™" + +#: pg_combinebackup.c:1364 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: pg_combinebackup.c:1385 +#, c-format +msgid "file \"%s\" is too large" +msgstr "ファイル\"%s\"ã¯å¤§ãã™ãŽã¾ã™" + +#: pg_combinebackup.c:1402 +#, c-format +msgid "could not read file \"%s\": read %zd of %lld" +msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$lldãƒã‚¤ãƒˆã®ã†ã¡%2$zdãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" + +#: reconstruct.c:339 +#, c-format +msgid "full backup contains unexpected incremental file \"%s\"" +msgstr "フルãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã«äºˆæœŸã—ãªã„差分ファイル\"%s\"ãŒå«ã¾ã‚Œã¦ã„ã¾ã™" + +#: reconstruct.c:423 +#, c-format +msgid "file \"%s\" is too short: expected %llu, found %llu" +msgstr "ファイル\"%s\"ãŒçŸ­ã™ãŽã¾ã™: %lluを期待ã—ã¦ã„ã¾ã—ãŸãŒ%lluã§ã—ãŸ" + +#: reconstruct.c:465 +#, c-format +msgid "file \"%s\" has bad incremental magic number (0x%x, expected 0x%x)" +msgstr "ファイル\"%1$s\"ã®å·®åˆ†ãƒžã‚¸ãƒƒã‚¯ãƒŠãƒ³ãƒãƒ¼ãŒæ­£ã—ãã‚りã¾ã›ã‚“ (0x%3$xを期待ã—ã¦ã„ã¾ã—ãŸãŒ0x%2$xã§ã—ãŸ)" + +#: reconstruct.c:471 +#, c-format +msgid "file \"%s\" has block count %u in excess of segment size %u" +msgstr "ファイル\"%s\"ã®ãƒ–ロック数%uãŒã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚º%uã‚’è¶…ãˆã¦ã„ã¾ã™" + +#: reconstruct.c:478 +#, c-format +msgid "file \"%s\" has truncation block length %u in excess of segment size %u" +msgstr "ファイル\"%s\"ã®åˆ‡ã‚Šè©°ã‚ブロック長%uãŒã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚º%uã‚’è¶…ãˆã¦ã„ã¾ã™" + +#: reconstruct.c:542 +#, c-format +msgid "could not read file \"%s\": read %d of %u" +msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$uãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" + +#: reconstruct.c:786 +#, c-format +msgid "could not read from file \"%s\", offset %llu: read %d of %d" +msgstr "ファイル \"%1$s\"ã€ã‚ªãƒ•セット%2$lluã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %4$d中%3$d" diff --git a/src/bin/pg_combinebackup/po/ka.po b/src/bin/pg_combinebackup/po/ka.po new file mode 100644 index 0000000000000..31cc0498b4d2e --- /dev/null +++ b/src/bin/pg_combinebackup/po/ka.po @@ -0,0 +1,943 @@ +# LANGUAGE message translation file for pg_combinebackup +# Copyright (C) 2024 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_combinebackup (PostgreSQL) package. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_combinebackup (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-11-28 22:52+0000\n" +"PO-Revision-Date: 2024-11-29 05:07+0100\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: \n" +"Language: ka\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.5\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "შეცდáƒáƒ›áƒ: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "დეტáƒáƒšáƒ”ბი: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "მინიშნებáƒ: " + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:110 copy_file.c:150 load_manifest.c:161 +#: load_manifest.c:199 pg_combinebackup.c:1400 reconstruct.c:540 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\"-ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %zu-დáƒáƒœ" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: backup_label.c:174 copy_file.c:68 pg_combinebackup.c:538 +#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:740 +#: write_manifest.c:187 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რáƒáƒ  ემთხვევáƒ" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘ის შესáƒáƒ«áƒšáƒ შეუსáƒáƒ‘áƒáƒ›áƒáƒ‘რpg_control ფáƒáƒ˜áƒšáƒ˜áƒ¡ შესáƒáƒœáƒáƒ®áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული \n" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რშესáƒáƒ«áƒšáƒáƒ áƒáƒ  ემთხვეáƒáƒ“ეს áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ მიერ გáƒáƒ›áƒáƒ§áƒ”ნებულს. áƒáƒ› შემთხვევáƒáƒ¨áƒ˜ ქვემáƒáƒ— \n" +"მáƒáƒªáƒ”მული შედეგები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იქნებრდრPostgreSQL ეს áƒáƒ’ებრáƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ შეუთáƒáƒ•სებელი იქნებáƒ." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 backup_label.c:143 copy_file.c:66 +#: copy_file.c:139 copy_file.c:171 copy_file.c:175 copy_file.c:225 +#: copy_file.c:268 load_manifest.c:128 pg_combinebackup.c:523 +#: pg_combinebackup.c:1167 reconstruct.c:523 reconstruct.c:638 +#: write_manifest.c:250 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:759 +#: write_manifest.c:260 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:852 +#, c-format +msgid "out of memory" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "წáƒáƒ áƒ›áƒáƒ¢áƒ”ბáƒ" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "სáƒáƒ›áƒ˜áƒ–ნე ბუფერი ძáƒáƒšáƒ˜áƒáƒœ პáƒáƒ¢áƒáƒ áƒáƒ" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "OpenSSL -ის სეცდáƒáƒ›áƒ" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: backup_label.c:187 load_manifest.c:133 pg_combinebackup.c:676 +#: pg_combinebackup.c:1131 pg_combinebackup.c:1383 reconstruct.c:204 +#: reconstruct.c:421 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_combinebackup.c:933 pg_combinebackup.c:1256 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" + +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "რეკურსიულ დáƒáƒ¦áƒ›áƒáƒ•áƒáƒš დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელს ინკრემენტული lexer-ის გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ  შეუძლიáƒ." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "ინკრემენტულ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელს ინკრემენტული lexer სჭირდებáƒ." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON მეტისმეტáƒáƒ“ ღრმáƒáƒ“áƒáƒ ერთმáƒáƒœáƒ”თში ჩáƒáƒšáƒáƒ’ებული. მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ დáƒáƒ¡áƒáƒ¨áƒ•ები სიღრმერ6400." + +#: ../../common/jsonapi.c:2127 +#, c-format +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "სპეციáƒáƒšáƒ£áƒ áƒ˜ მიმდევრáƒáƒ‘რ\"\\%.*s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ." + +#: ../../common/jsonapi.c:2131 +#, c-format +msgid "Character with value 0x%02x must be escaped." +msgstr "სიმბáƒáƒšáƒ კáƒáƒ“ით 0x%02x áƒáƒ£áƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ ეკრáƒáƒœáƒ˜áƒ áƒ”ბული უნდრიყáƒáƒ¡." + +#: ../../common/jsonapi.c:2135 +#, c-format +msgid "Expected end of input, but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი შეყვáƒáƒœáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ¡, მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../../common/jsonapi.c:2138 +#, c-format +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი მáƒáƒ¡áƒ˜áƒ•ის ელემენტს áƒáƒœ \"]\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../../common/jsonapi.c:2141 +#, c-format +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი \",\" áƒáƒœ \"]\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../../common/jsonapi.c:2144 +#, c-format +msgid "Expected \":\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი \":\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../../common/jsonapi.c:2147 +#, c-format +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი JSON მნიშვნელáƒáƒ‘áƒáƒ¡. მივიღე \"%.*s\"." + +#: ../../common/jsonapi.c:2150 +msgid "The input string ended unexpectedly." +msgstr "შეყვáƒáƒœáƒ˜áƒ¡ სტრიქáƒáƒœáƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ." + +#: ../../common/jsonapi.c:2152 +#, c-format +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი სტრიქáƒáƒœáƒ¡ áƒáƒœ \"}\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../../common/jsonapi.c:2155 +#, c-format +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი \",\", áƒáƒœ \"}\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../../common/jsonapi.c:2158 +#, c-format +msgid "Expected string, but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი სტრიქáƒáƒœáƒ¡, მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." + +#: ../../common/jsonapi.c:2161 +#, c-format +msgid "Token \"%.*s\" is invalid." +msgstr "კáƒáƒ“ი \"%.*s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ." + +#: ../../common/jsonapi.c:2164 +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 ტექსტáƒáƒ“ ვერ გáƒáƒ áƒ“áƒáƒ˜áƒ¥áƒ›áƒœáƒ”ბáƒ." + +#: ../../common/jsonapi.c:2166 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "\"\\u\" ს თექვსმეტáƒáƒ‘ითი ციფრები უნდრმáƒáƒ°áƒ§áƒ•ებáƒáƒ“ეს." + +#: ../../common/jsonapi.c:2169 +msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." +msgstr "უნიკáƒáƒ“ის სპეციáƒáƒšáƒ£áƒ áƒ˜ კáƒáƒ“ების გáƒáƒ›áƒáƒ§áƒ”ნებრკáƒáƒ“ის წერტილის მნიშვნელáƒáƒ‘ებáƒáƒ“ 007F-ის ზემáƒáƒ— შეუძლებელიáƒ, თუ კáƒáƒ“ირებრUTF-8 áƒáƒ áƒáƒ." + +#: ../../common/jsonapi.c:2178 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "უნიკáƒáƒ“ის სპეციáƒáƒšáƒ£áƒ áƒ˜ კáƒáƒ“ების სერვერის კáƒáƒ“ირებáƒáƒ¨áƒ˜ (%s) თáƒáƒ áƒ’მნრშეუძლებელიáƒ." + +#: ../../common/jsonapi.c:2185 +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "უნიკáƒáƒ“ის მáƒáƒ¦áƒáƒš სურáƒáƒ’áƒáƒ¢áƒ¡ მáƒáƒ¦áƒáƒšáƒ˜ სურáƒáƒ’áƒáƒ¢áƒ˜ áƒáƒ  უნდრმáƒáƒ¡áƒ“ევდეს." + +#: ../../common/jsonapi.c:2187 +msgid "Unicode low surrogate must follow a high surrogate." +msgstr "უნიკáƒáƒ“ის დáƒáƒ‘áƒáƒšáƒ˜ სურáƒáƒ’áƒáƒ¢áƒ˜ მáƒáƒ¦áƒáƒš სურáƒáƒ’áƒáƒ¢áƒ¡ უნდრმისდევდეს." + +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" + +#: ../../common/parse_manifest.c:203 ../../common/parse_manifest.c:260 +msgid "manifest ended unexpectedly" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტი მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ" + +#: ../../common/parse_manifest.c:209 ../../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბის შეცდáƒáƒ›áƒ" + +#: ../../common/parse_manifest.c:301 +msgid "unexpected object start" +msgstr "áƒáƒ‘იექტის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜" + +#: ../../common/parse_manifest.c:336 +msgid "unexpected object end" +msgstr "áƒáƒ‘იექტის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" + +#: ../../common/parse_manifest.c:365 +msgid "unexpected array start" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜" + +#: ../../common/parse_manifest.c:390 +msgid "unexpected array end" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" + +#: ../../common/parse_manifest.c:417 +msgid "expected version indicator" +msgstr "მáƒáƒ¡áƒáƒšáƒáƒ“ნელი ვერსიის მáƒáƒ©áƒ•ენებელი" + +#: ../../common/parse_manifest.c:453 +msgid "unrecognized top-level field" +msgstr "უცნáƒáƒ‘ი ველი ზედრდáƒáƒœáƒ”ზე" + +#: ../../common/parse_manifest.c:472 +msgid "unexpected file field" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი ველი ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის" + +#: ../../common/parse_manifest.c:486 +msgid "unexpected WAL range field" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი ველი WAL-ის დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡áƒ—ვის" + +#: ../../common/parse_manifest.c:492 +msgid "unexpected object field" +msgstr "áƒáƒ‘იექტის მáƒáƒ£áƒšáƒáƒ“ნელი ველი" + +#: ../../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი სკáƒáƒšáƒáƒ áƒ˜" + +#: ../../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის ვერსირმთელი რიცხვი áƒáƒ áƒáƒ" + +#: ../../common/parse_manifest.c:612 +msgid "unexpected manifest version" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის მáƒáƒ£áƒšáƒáƒ“ნელი ვერსიáƒ" + +#: ../../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სისტემის იდენფიტიკáƒáƒ¢áƒáƒ áƒ˜ მთელი რიცხვი áƒáƒ áƒáƒ" + +#: ../../common/parse_manifest.c:661 +msgid "missing path name" +msgstr "áƒáƒ™áƒšáƒ˜áƒ ბილიკის სáƒáƒ®áƒ”ლი" + +#: ../../common/parse_manifest.c:664 +msgid "both path name and encoded path name" +msgstr "áƒáƒ áƒ˜áƒ•ე, ბილიკის სáƒáƒ®áƒ”ლი დრბილიკის კáƒáƒ“ირებული სáƒáƒ®áƒ”ლი" + +#: ../../common/parse_manifest.c:666 +msgid "missing size" +msgstr "ზáƒáƒ›áƒ áƒáƒ™áƒšáƒ˜áƒ" + +#: ../../common/parse_manifest.c:669 +msgid "checksum without algorithm" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მის გáƒáƒ áƒ”შე" + +#: ../../common/parse_manifest.c:683 +msgid "could not decode file name" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის გáƒáƒ¨áƒ˜áƒ¤áƒ•რის შეცდáƒáƒ›áƒ" + +#: ../../common/parse_manifest.c:693 +msgid "file size is not an integer" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ მთელი რიცხვი áƒáƒ áƒáƒ" + +#: ../../common/parse_manifest.c:699 pg_combinebackup.c:199 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ უცნáƒáƒ‘ი áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მი: \"%s\"" + +#: ../../common/parse_manifest.c:718 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": \"%s\"" + +#: ../../common/parse_manifest.c:761 +msgid "missing timeline" +msgstr "áƒáƒ™áƒšáƒ˜áƒ დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი" + +#: ../../common/parse_manifest.c:763 +msgid "missing start LSN" +msgstr "áƒáƒ™áƒšáƒ˜áƒ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ LSN" + +#: ../../common/parse_manifest.c:765 +msgid "missing end LSN" +msgstr "áƒáƒ™áƒšáƒ˜áƒ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ¡ LSN" + +#: ../../common/parse_manifest.c:771 +msgid "timeline is not an integer" +msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი მთელი რიცხვი áƒáƒ áƒáƒ" + +#: ../../common/parse_manifest.c:774 +msgid "could not parse start LSN" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ LSN-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" + +#: ../../common/parse_manifest.c:777 +msgid "could not parse end LSN" +msgstr "სáƒáƒ‘áƒáƒšáƒáƒ LSN-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" + +#: ../../common/parse_manifest.c:842 +msgid "expected at least 2 lines" +msgstr "ველáƒáƒ“ებáƒáƒ“ი სულ ცáƒáƒ¢áƒ 2 ხáƒáƒ–ს" + +#: ../../common/parse_manifest.c:845 +msgid "last line not newline-terminated" +msgstr "ბáƒáƒšáƒ ხáƒáƒ–ი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ— áƒáƒ  სრულდებáƒ" + +#: ../../common/parse_manifest.c:864 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ" + +#: ../../common/parse_manifest.c:868 +#, c-format +msgid "manifest has no checksum" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../../common/parse_manifest.c:872 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: %s" + +#: ../../common/parse_manifest.c:876 +#, c-format +msgid "manifest checksum mismatch" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ áƒáƒ  ემთხვევáƒ" + +#: ../../common/parse_manifest.c:891 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ მáƒáƒœáƒ˜áƒ¤áƒ”სტის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცრáƒáƒ›áƒ: %s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრისთვის %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "უცნáƒáƒ‘ი სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი: \"%s\"" + +#: backup_label.c:66 backup_label.c:85 backup_label.c:95 +#, c-format +msgid "%s: could not parse %s" +msgstr "%s: ვერ დáƒáƒ•áƒáƒ›áƒ£áƒ¨áƒáƒ•ე %s" + +#: backup_label.c:69 backup_label.c:88 +#, c-format +msgid "%s: improper terminator for %s" +msgstr "%s: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შემწყვეტი %s-სთვის" + +#: backup_label.c:76 +#, c-format +msgid "%s: could not parse TLI for %s" +msgstr "%s: ვერ დáƒáƒ•áƒáƒ›áƒ£áƒ¨áƒáƒ•ე TLI %s-სთვის" + +#: backup_label.c:79 backup_label.c:98 +#, c-format +msgid "%s: invalid TLI" +msgstr "%s: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ TLI" + +#: backup_label.c:106 backup_label.c:108 +#, c-format +msgid "%s: could not find %s" +msgstr "%s: %s ვერ ვიპáƒáƒ•ე" + +#: backup_label.c:110 backup_label.c:113 +#, c-format +msgid "%s: %s requires %s" +msgstr "%s: %s-ს %s სჭირდებáƒ" + +#: backup_label.c:162 reconstruct.c:761 write_manifest.c:262 +#, c-format +msgid "could not write file \"%s\": wrote %d of %d" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ. ჩáƒáƒ¬áƒ”რილირ%d %d-დáƒáƒœ" + +#: backup_label.c:166 copy_file.c:146 copy_file.c:193 reconstruct.c:721 +#: reconstruct.c:767 write_manifest.c:270 +#, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბის შეცდáƒáƒ›áƒ" + +#: copy_file.c:186 +#, c-format +msgid "could not write to file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: copy_file.c:188 +#, c-format +msgid "could not write to file \"%s\", offset %u: wrote %d of %d" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ. წáƒáƒœáƒáƒªáƒ•ლებრ%u: ჩáƒáƒ•წერე %d ბáƒáƒ˜áƒ¢áƒ˜ %d-დáƒáƒœ" + +#: copy_file.c:199 reconstruct.c:784 +#, c-format +msgid "could not read from file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: copy_file.c:218 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %m" +msgstr "შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ™áƒšáƒáƒœáƒ•ისáƒáƒ¡ \"%s\"-დáƒáƒœ \"%s\"-მდე: %m" + +#: copy_file.c:229 copy_file.c:272 +#, c-format +msgid "could not create file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %m" + +#: copy_file.c:237 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %s" +msgstr "შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ™áƒšáƒáƒœáƒ•ისáƒáƒ¡ \"%s\"-დáƒáƒœ \"%s\"-მდე: %s" + +#: copy_file.c:245 pg_combinebackup.c:251 +#, c-format +msgid "file cloning not supported on this platform" +msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე კლáƒáƒœáƒ˜áƒ áƒ”ბრმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: copy_file.c:278 reconstruct.c:704 +#, c-format +msgid "error while copying file range from \"%s\" to \"%s\": %m" +msgstr "შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ‘ის შუáƒáƒšáƒ”დის კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡ \"%s\"-დáƒáƒœ \"%s\"-მდე: %m" + +#: copy_file.c:285 pg_combinebackup.c:264 reconstruct.c:724 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე copy_file_range მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: copy_file.c:300 +#, c-format +msgid "could not copy file \"%s\" to \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\"-დáƒáƒœ \"%s\"-ში კáƒáƒžáƒ˜áƒ áƒ”ბრშეუძლებელიáƒ: %m" + +#: load_manifest.c:125 +#, c-format +msgid "file \"%s\" does not exist" +msgstr "ფáƒáƒ˜áƒšáƒ˜ %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: load_manifest.c:163 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %lld-დáƒáƒœ" + +#: load_manifest.c:201 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%lld %lld-დáƒáƒœ" + +#: load_manifest.c:248 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ მáƒáƒœáƒ˜áƒ¤áƒ”სტის ვერსიáƒáƒ¡ 1 ინკრემენტული მáƒáƒ áƒ¥áƒáƒ¤áƒ”ბის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: load_manifest.c:280 +#, c-format +msgid "duplicate path name in backup manifest: \"%s\"" +msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ¡ მáƒáƒœáƒ˜áƒ¤áƒ”სტში მითითებული ბილიკის სáƒáƒ®áƒ”ლი დუბლირებულიáƒ: %s" + +#: pg_combinebackup.c:220 pg_combinebackup.c:228 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." + +#: pg_combinebackup.c:227 +#, c-format +msgid "no input directories specified" +msgstr "შეყვáƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეები მითითებული áƒáƒ áƒáƒ" + +#: pg_combinebackup.c:233 +#, c-format +msgid "no output directory specified" +msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ" + +#: pg_combinebackup.c:301 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: მáƒáƒœáƒ˜áƒ¤áƒ”სტის სისტემის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ %llu, მáƒáƒ’რáƒáƒ› კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ შეიცáƒáƒ•ს %llu" + +#: pg_combinebackup.c:340 +#, c-format +msgid "cannot generate a manifest because no manifest is available for the final input backup" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის გენერáƒáƒªáƒ˜áƒ შეუძლებელიáƒ, რáƒáƒ“გáƒáƒœ სáƒáƒ‘áƒáƒšáƒáƒ შეყვáƒáƒœáƒ˜áƒ¡ მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡áƒ—ვის მáƒáƒœáƒ˜áƒ¤áƒ”სტი ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ áƒáƒ áƒáƒ" + +#: pg_combinebackup.c:387 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "%s-დáƒáƒœ %s-მდე სიმბმულის შექმნრშეუძლებელიáƒ: %m" + +#: pg_combinebackup.c:399 pg_combinebackup.c:730 pg_combinebackup.c:927 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m" + +#: pg_combinebackup.c:454 +#, c-format +msgid "directory name too long" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის სáƒáƒ®áƒ”ლი ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" + +#: pg_combinebackup.c:461 +#, c-format +msgid "multiple \"=\" signs in tablespace mapping" +msgstr "ცხრილების სივრცის მიბმáƒáƒ¨áƒ˜ ერთზე მეტი \"=\" ნიშáƒáƒœáƒ˜áƒ" + +#: pg_combinebackup.c:469 +#, c-format +msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" +msgstr "ცხრილების მიბმის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ \"%s\", უნდრიყáƒáƒ¡ \"OLDDIR=NEWDIR\"" + +#: pg_combinebackup.c:480 pg_combinebackup.c:484 +#, c-format +msgid "old directory is not an absolute path in tablespace mapping: %s" +msgstr "ძველი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ბილიკი ცხრილის სივრცის მიბმáƒáƒ¨áƒ˜ áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ áƒáƒ áƒáƒ: %s" + +#: pg_combinebackup.c:553 +#, c-format +msgid "backup at \"%s\" is a full backup, but only the first backup should be a full backup" +msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ მისáƒáƒ›áƒáƒ áƒ—ზე \"%s\" სრული მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ, მáƒáƒ’რáƒáƒ›, მხáƒáƒšáƒáƒ“, პირველი მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ უნდრიყáƒáƒ¡ სრული" + +#: pg_combinebackup.c:556 +#, c-format +msgid "backup at \"%s\" is an incremental backup, but the first backup should be a full backup" +msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ მისáƒáƒ›áƒáƒ áƒ—ზე \"%s\" ინკრემენტული მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ, მáƒáƒ’რáƒáƒ› პირველი მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ სრული უნდრიყáƒáƒ¡" + +#: pg_combinebackup.c:559 +#, c-format +msgid "backup at \"%s\" starts on timeline %u, but expected %u" +msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ მისáƒáƒ›áƒáƒ áƒ—ზე \"%s\" იწყებრდრáƒáƒ˜áƒ¡ ხáƒáƒ–ზე %u, მáƒáƒ’რáƒáƒ› მáƒáƒ•ელáƒáƒ“ი მნიშვნელáƒáƒ‘áƒáƒ¡ %u" + +#: pg_combinebackup.c:562 +#, c-format +msgid "backup at \"%s\" starts at LSN %X/%X, but expected %X/%X" +msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ მისáƒáƒ›áƒáƒ áƒ—ზე \"%s\" იწყებრLSN-თáƒáƒœ %X/%X, მáƒáƒ’რáƒáƒ› მáƒáƒ•ელáƒáƒ“ი მნიშვნელáƒáƒ‘áƒáƒ¡ %X/%X" + +#: pg_combinebackup.c:614 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: CRC áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: pg_combinebackup.c:618 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: მáƒáƒ£áƒšáƒáƒ“ნელი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ვერსიáƒ" + +#: pg_combinebackup.c:625 +#, c-format +msgid "%s: expected system identifier %llu, but found %llu" +msgstr "%s: მáƒáƒ•ელáƒáƒ“ი სისტემის იდენტიფიკáƒáƒ¢áƒáƒ áƒ¡ %llu, ნáƒáƒžáƒáƒ•ნი მნიშვნელáƒáƒ‘áƒáƒ %llu" + +#: pg_combinebackup.c:657 +#, c-format +msgid "only some backups have checksums enabled" +msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბი, მხáƒáƒšáƒáƒ“, ზáƒáƒ’იერთ მáƒáƒ áƒ¥áƒáƒ¤áƒ¡ ჰქáƒáƒœáƒ“áƒ" + +#: pg_combinebackup.c:658 +#, c-format +msgid "Disable, and optionally reenable, checksums on the output directory to avoid failures." +msgstr "გáƒáƒ›áƒáƒ áƒ—ვრდრáƒáƒ áƒáƒ¡áƒáƒ•áƒáƒšáƒ“ებულáƒáƒ“ თáƒáƒ•იდáƒáƒœ ჩáƒáƒ áƒ—ვრსáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბისრგáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეზე, ჩáƒáƒ•áƒáƒ áƒ“ნების თáƒáƒ•იდáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒšáƒ”ბლáƒáƒ“." + +#: pg_combinebackup.c:693 +#, c-format +msgid "removing output directory \"%s\"" +msgstr "წáƒáƒ˜áƒ¨áƒšáƒ”ბრგáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\"" + +#: pg_combinebackup.c:695 +#, c-format +msgid "failed to remove output directory" +msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წáƒáƒ¨áƒšáƒ ჩáƒáƒ•áƒáƒ áƒ“áƒ" + +#: pg_combinebackup.c:699 +#, c-format +msgid "removing contents of output directory \"%s\"" +msgstr "წáƒáƒ˜áƒ¨áƒšáƒ”ბრშემცველáƒáƒ‘რგáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ისთვის \"%s\"" + +#: pg_combinebackup.c:702 +#, c-format +msgid "failed to remove contents of output directory" +msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შემცველáƒáƒ‘ის წáƒáƒ¨áƒšáƒ ჩáƒáƒ•áƒáƒ áƒ“áƒ" + +#: pg_combinebackup.c:742 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ áƒáƒ" + +#: pg_combinebackup.c:745 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: pg_combinebackup.c:759 +#, c-format +msgid "" +"%s reconstructs full backups from incrementals.\n" +"\n" +msgstr "" +"%s სრული მáƒáƒ áƒ¥áƒáƒ¤áƒ”ბის áƒáƒ’ებრინკრემენტულებისგáƒáƒœ.\n" +"\n" + +#: pg_combinebackup.c:760 +#, c-format +msgid "Usage:\n" +msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" + +#: pg_combinebackup.c:761 +#, c-format +msgid " %s [OPTION]... DIRECTORY...\n" +msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე...\n" + +#: pg_combinebackup.c:762 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"პáƒáƒ áƒáƒ›áƒ”ტრები:\n" + +#: pg_combinebackup.c:763 +#, c-format +msgid " -d, --debug generate lots of debugging output\n" +msgstr " -d, --debug გáƒáƒ¡áƒáƒ›áƒáƒ áƒ—ი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ\n" + +#: pg_combinebackup.c:764 +#, c-format +msgid " -n, --dry-run do not actually do anything\n" +msgstr " -n, --dry-run áƒáƒ áƒáƒ¤áƒ”რი სინáƒáƒ›áƒ“ვილეში áƒáƒ  ქნáƒ\n" + +#: pg_combinebackup.c:765 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr " -N, --no-sync áƒáƒ  დáƒáƒ•ელáƒáƒ“რცვლილებების დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡\n" + +#: pg_combinebackup.c:766 +#, c-format +msgid " -o, --output=DIRECTORY output directory\n" +msgstr " -o, --output=სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" + +#: pg_combinebackup.c:767 +#, c-format +msgid "" +" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" +" relocate tablespace in OLDDIR to NEWDIR\n" +msgstr "" +" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" +" ცხრილების სივრცის OLDDIR-დáƒáƒœ NEWDIR-ში გáƒáƒ“áƒáƒ¢áƒáƒœáƒ\n" + +#: pg_combinebackup.c:769 +#, c-format +msgid " --clone clone (reflink) files instead of copying\n" +msgstr " --clone ფáƒáƒ˜áƒšáƒ”ბის დáƒáƒ™áƒšáƒáƒœáƒ•რ(reflink) კáƒáƒžáƒ˜áƒ áƒ”ბის ნáƒáƒªáƒ•ლáƒáƒ“\n" + +#: pg_combinebackup.c:770 +#, c-format +msgid " --copy copy files (default)\n" +msgstr " --copy ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბრ(ნáƒáƒ’ულისხმევი)\n" + +#: pg_combinebackup.c:771 +#, c-format +msgid " --copy-file-range copy using copy_file_range() system call\n" +msgstr " --copy-file-range კáƒáƒžáƒ˜áƒ áƒ”ბრსისტემური ფუნქციით copy_file_range()\n" + +#: pg_combinebackup.c:772 +#, c-format +msgid "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" use algorithm for manifest checksums\n" +msgstr "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" მáƒáƒœáƒ˜áƒ¤áƒ”სტების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¡áƒáƒ—ვლელი áƒáƒšáƒ¤áƒáƒ áƒ˜áƒ—მი\n" + +#: pg_combinebackup.c:774 +#, c-format +msgid " --no-manifest suppress generation of backup manifest\n" +msgstr " --no-manifest მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ მáƒáƒœáƒ˜áƒ¤áƒ”სტი áƒáƒ  შეიქმნებáƒ\n" + +#: pg_combinebackup.c:775 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=მეთáƒáƒ“ი ფáƒáƒ˜áƒšáƒ”ბის დისკზე სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის დáƒáƒ§áƒ”ნებáƒ\n" + +#: pg_combinebackup.c:776 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" + +#: pg_combinebackup.c:777 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" + +#: pg_combinebackup.c:779 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n" + +#: pg_combinebackup.c:780 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" + +#: pg_combinebackup.c:995 +#, c-format +msgid "skipping symbolic link \"%s\"" +msgstr "%s: სიმბმულიáƒ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" + +#: pg_combinebackup.c:997 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "სპეციáƒáƒšáƒ£áƒ áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒ•ებრ\"%s\"" + +#: pg_combinebackup.c:1073 reconstruct.c:305 +#, c-format +msgid "manifest file \"%s\" contains no entry for file \"%s\"" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის ფáƒáƒ˜áƒšáƒ˜ \"%s\" ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\" ჩáƒáƒœáƒáƒ¬áƒ”რებს áƒáƒ  შეიცáƒáƒ•ს" + +#: pg_combinebackup.c:1189 +#, c-format +msgid "%s: server version too old" +msgstr "%s: სერვერის ვერსირძáƒáƒšáƒ˜áƒáƒœ ძველიáƒ" + +#: pg_combinebackup.c:1190 +#, c-format +msgid "%s: could not parse version number" +msgstr "%s: ვერსის ნáƒáƒ›áƒ áƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" + +#: pg_combinebackup.c:1309 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმის \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: pg_combinebackup.c:1312 +#, c-format +msgid "target of symbolic link \"%s\" is too long" +msgstr "სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმულის \"%s\" სáƒáƒ›áƒ˜áƒ–ნე მეტისმეტáƒáƒ“ გრძელიáƒ" + +#: pg_combinebackup.c:1315 +#, c-format +msgid "target of symbolic link \"%s\" is relative" +msgstr "სიმბმულის \"%s\" სáƒáƒ›áƒ˜áƒ–ნე ფáƒáƒ áƒ“áƒáƒ‘ითიáƒ" + +#: pg_combinebackup.c:1337 +#, c-format +msgid "tablespace at \"%s\" has no tablespace mapping" +msgstr "ცხრილები სივრცეს მისáƒáƒ›áƒáƒ áƒ—ზე \"%s\" ცხრილების სივრცის áƒáƒ¡áƒáƒ®áƒ•ები áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: pg_combinebackup.c:1355 +#, c-format +msgid "tablespaces with OIDs %u and %u both point at directory \"%s\"" +msgstr "ცხრილის სივრცეები OID-ებით %u დრ%u, áƒáƒ áƒ˜áƒ•ე მიუთითებს სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეზე \"%s\"-ზე" + +#: pg_combinebackup.c:1364 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: pg_combinebackup.c:1385 +#, c-format +msgid "file \"%s\" is too large" +msgstr "%s: ფáƒáƒ˜áƒšáƒ˜ ძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ" + +#: pg_combinebackup.c:1402 +#, c-format +msgid "could not read file \"%s\": read %zd of %lld" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%zd %lld-დáƒáƒœ" + +#: reconstruct.c:339 +#, c-format +msgid "full backup contains unexpected incremental file \"%s\"" +msgstr "სრული მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ შეიცáƒáƒ•ს მáƒáƒ£áƒšáƒáƒ“ნელ ინკრემენტულ ფáƒáƒ˜áƒšáƒ¡ \"%s\"" + +#: reconstruct.c:423 +#, c-format +msgid "file \"%s\" is too short: expected %llu, found %llu" +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" მეტისმეტáƒáƒ“ მáƒáƒ™áƒšáƒ”áƒ. მáƒáƒ•ელáƒáƒ“ი %llu, მივიღე %llu" + +#: reconstruct.c:465 +#, c-format +msgid "file \"%s\" has bad incremental magic number (0x%x, expected 0x%x)" +msgstr "ფáƒáƒ˜áƒšáƒ¡ \"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ინკრემენტული ჯáƒáƒ“áƒáƒ¡áƒœáƒ£áƒ áƒ˜ რიცხვი (0x%x not 0x%x) გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: reconstruct.c:471 +#, c-format +msgid "file \"%s\" has block count %u in excess of segment size %u" +msgstr "ფáƒáƒ˜áƒšáƒ¡ \"%s\" áƒáƒ¥áƒ•ს ბლáƒáƒ™áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რ%u, რáƒáƒ›áƒ”ლიც სეგმენტის ზáƒáƒ›áƒáƒ¡ %u áƒáƒ­áƒáƒ áƒ‘ებს" + +#: reconstruct.c:478 +#, c-format +msgid "file \"%s\" has truncation block length %u in excess of segment size %u" +msgstr "ფáƒáƒ˜áƒšáƒ¡ \"%s\" áƒáƒ¥áƒ•ს წáƒáƒ™áƒ•ეთის ბლáƒáƒ™áƒ˜áƒ¡ სიგრძე %u, რáƒáƒ›áƒ”ლიც სეგმენტის ზáƒáƒ›áƒáƒ¡ %u áƒáƒ­áƒáƒ áƒ‘ებს" + +#: reconstruct.c:542 +#, c-format +msgid "could not read file \"%s\": read %d of %u" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %u-დáƒáƒœ" + +#: reconstruct.c:786 +#, c-format +msgid "could not read from file \"%s\", offset %llu: read %d of %d" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ. წáƒáƒœáƒáƒªáƒ•ლებრ%llu: წáƒáƒ™áƒ˜áƒ—ხულირ%d %d-დáƒáƒœ" + +#, c-format +#~ msgid "\"%s\" contains no entry for \"%s\"" +#~ msgstr "\"%s\" áƒáƒ  შეიცáƒáƒ•ს ჩáƒáƒœáƒáƒ¬áƒ”რს \"%s\"-სთვის" + +#, c-format +#~ msgid "\"%s\" does not exist" +#~ msgstr "\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#, c-format +#~ msgid "could not close \"%s\": %m" +#~ msgstr "\"%s\" ვერ დáƒáƒ•ხურე: %m" + +#, c-format +#~ msgid "could not open \"%s\": %m" +#~ msgstr "\"%s\" ვერ გáƒáƒ•ხსენი: %m" + +#, c-format +#~ msgid "could not read file \"%s\": read only %d of %d bytes at offset %llu" +#~ msgstr "ვერ წáƒáƒ•იკითხე ფáƒáƒ˜áƒšáƒ˜ \"%s\": წáƒáƒ•იკითხე, მხáƒáƒšáƒáƒ“ %d ბáƒáƒ˜áƒ¢áƒ˜ %d-დáƒáƒœ წáƒáƒœáƒáƒªáƒ•ლებáƒáƒ–ე %llu" + +#, c-format +#~ msgid "could not read file \"%s\": read only %d of %u bytes" +#~ msgstr "ვერ წáƒáƒ•იკითხე ფáƒáƒ˜áƒšáƒ˜ \"%s\": წáƒáƒ•იკითხე, მხáƒáƒšáƒáƒ“, %d ბáƒáƒ˜áƒ¢áƒ˜ %u-დáƒáƒœ" + +#, c-format +#~ msgid "could not read file \"%s\": read only %zd of %lld bytes" +#~ msgstr "ვერ წáƒáƒ•იკითხე ფáƒáƒ˜áƒšáƒ˜ \"%s\": წáƒáƒ•იკითხე, მხáƒáƒšáƒáƒ“, %zd ბáƒáƒ˜áƒ¢áƒ˜ %lld-დáƒáƒœ" + +#, c-format +#~ msgid "could not stat \"%s\": %m" +#~ msgstr "\"%s\" ვერ áƒáƒ¦áƒ›áƒáƒ•áƒáƒ©áƒ˜áƒœáƒ”: %m" + +#, c-format +#~ msgid "could not write \"%s\": %m" +#~ msgstr "\"%s\"-ში ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#, c-format +#~ msgid "could not write file \"%s\": wrote only %d of %d bytes" +#~ msgstr "ვერ ჩáƒáƒ•წერე ფáƒáƒ˜áƒšáƒ˜ \"%s\": ჩáƒáƒ•წერე, მხáƒáƒšáƒáƒ“, %d ბáƒáƒ˜áƒ¢áƒ˜ %d-დáƒáƒœ" + +#, c-format +#~ msgid "could not write file \"%s\": wrote only %d of %d bytes at offset %u" +#~ msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: ჩáƒáƒ•წერე მხáƒáƒšáƒáƒ“ %d ბáƒáƒ˜áƒ¢áƒ˜ %d-დáƒáƒœ , წáƒáƒœáƒáƒªáƒ•ლებáƒáƒ–ე %u" + +#, c-format +#~ msgid "unexpected json parse error type: %d" +#~ msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი json-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ˜áƒ¡ ტიპი: %d" diff --git a/src/bin/pg_combinebackup/po/ko.po b/src/bin/pg_combinebackup/po/ko.po new file mode 100644 index 0000000000000..e6d9629b170ff --- /dev/null +++ b/src/bin/pg_combinebackup/po/ko.po @@ -0,0 +1,918 @@ +# Korean message translation file for pg_combinebackup +# Copyright (C) 2025 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_combinebackup (PostgreSQL) package. +# Ioseph Kim , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_combinebackup (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2025-01-17 04:52+0000\n" +"PO-Revision-Date: 2025-01-18 00:54+0900\n" +"Last-Translator: Ioseph Kim \n" +"Language-Team: Korean team \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "오류: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "경고: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "\"%s\" íŒŒì¼ ì¼ê¸° 모드로 열기 실패: %m" + +#: ../../common/controldata_utils.c:110 copy_file.c:150 load_manifest.c:161 +#: load_manifest.c:199 pg_combinebackup.c:1400 reconstruct.c:540 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: backup_label.c:174 copy_file.c:68 pg_combinebackup.c:538 +#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:740 +#: write_manifest.c:187 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ë°”ì´íЏ 순서 불ì¼ì¹˜" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, " +"and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ë°”ì´íЏ 순서가 ì¼ì¹˜í•˜ì§€ 않습니다.\n" +"pg_control 파ì¼ì„ 저장하는 ë° ì‚¬ìš©ëœ ë°”ì´íЏ 순서는 \n" +"ì´ í”„ë¡œê·¸ëž¨ì—서 사용하는 순서와 ì¼ì¹˜í•´ì•¼ 합니다. ì´ ê²½ìš° 아래 결과는 올바르" +"ì§€ 않으며\n" +"현재 PostgreSQL 설치본과 ì´ ë°ì´í„° 디렉터리가 호환하지 않습니다." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 backup_label.c:143 copy_file.c:66 +#: copy_file.c:139 copy_file.c:171 copy_file.c:175 copy_file.c:225 +#: copy_file.c:268 load_manifest.c:128 pg_combinebackup.c:523 +#: pg_combinebackup.c:1167 reconstruct.c:523 reconstruct.c:638 +#: write_manifest.c:250 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:759 +#: write_manifest.c:260 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ fsync 실패: %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:852 +#, c-format +msgid "out of memory" +msgstr "메모리 부족" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "성공" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "ëŒ€ìƒ ë²„í¼ê°€ 너무 작습니다." + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "OpenSSL 실패" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "메모리 부족\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "null í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ëŒ€ìƒìœ¼ë¡œ íŒŒì¼ ì‹œìŠ¤í…œ ë™ê¸°í™”를 í•  수 없습니다: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: backup_label.c:187 load_manifest.c:133 pg_combinebackup.c:676 +#: pg_combinebackup.c:1131 pg_combinebackup.c:1383 reconstruct.c:204 +#: reconstruct.c:421 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ì´ ë¹Œë“œëŠ” \"%s\" ë™ê¸°í™” ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_combinebackup.c:933 pg_combinebackup.c:1256 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" + +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "ìž¬ê·€ì  í•˜í–¥ 구문분ì„기는 ì¦ë¶„ 토í°ë¶„ì„ê¸°ì„ ì‚¬ìš©í•  수 없습니다." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "ì¦ë¶„ 구문분ì„기는 ì¦ë¶„ 토í°ë¶„ì„기를 필요로 합니다." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON ê³„ì¸µì´ ë„ˆë¬´ 깊ìŒ, 허용하는 최대 깊ì´ëŠ” 6400입니다." + +#: ../../common/jsonapi.c:2127 +#, c-format +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "\"\\%.*s\" ì´ìŠ¤ì¼€ì´í”„ 표기가 바르지 않습니다." + +#: ../../common/jsonapi.c:2131 +#, c-format +msgid "Character with value 0x%02x must be escaped." +msgstr "0x%02x ê°’ì˜ ë¬¸ìžëŠ” ì´ìŠ¤ì¼€ì´í”„ 처리를 해야함." + +#: ../../common/jsonapi.c:2135 +#, c-format +msgid "Expected end of input, but found \"%.*s\"." +msgstr "ìž…ë ¥ì´ ë나야하는ë°, \"%.*s\" 발견했습니다." + +#: ../../common/jsonapi.c:2138 +#, c-format +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "ë°°ì—´ 요소나 \"]\" 문ìžë¥¼ 기대했는ë°, \"%.*s\" 발견했습니다." + +#: ../../common/jsonapi.c:2141 +#, c-format +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "\",\" ë˜ëŠ” \"]\" 문ìžë¥¼ 기대했는ë°, \"%.*s\" 발견했습니다." + +#: ../../common/jsonapi.c:2144 +#, c-format +msgid "Expected \":\", but found \"%.*s\"." +msgstr "\":\" 문ìžë¥¼ 기대했는ë°, \"%.*s\" 발견했습니다." + +#: ../../common/jsonapi.c:2147 +#, c-format +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "JSON ê°’ì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%.*s\" ê°’ìž„" + +#: ../../common/jsonapi.c:2150 +msgid "The input string ended unexpectedly." +msgstr "ìž…ë ¥ 문ìžì—´ì´ 예ìƒì¹˜ 않게 ë났ìŒ." + +#: ../../common/jsonapi.c:2152 +#, c-format +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "문ìžì—´ì´ë‚˜, \"}\"ê°€ í•„ìš”í•œë° \"%.*s\"ì´(ê°€) 있ìŒ" + +#: ../../common/jsonapi.c:2155 +#, c-format +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "\",\" ë˜ëŠ” \"}\"ê°€ í•„ìš”í•œë° \"%.*s\"ì´(ê°€) 있ìŒ" + +#: ../../common/jsonapi.c:2158 +#, c-format +msgid "Expected string, but found \"%.*s\"." +msgstr "문ìžì—´ ê°’ì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%.*s\" ê°’ìž„" + +#: ../../common/jsonapi.c:2161 +#, c-format +msgid "Token \"%.*s\" is invalid." +msgstr "ìž˜ëª»ëœ í† í°: \"%.*s\"" + +#: ../../common/jsonapi.c:2164 +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 ê°’ì€ text 형으로 변환할 수 ì—†ìŒ." + +#: ../../common/jsonapi.c:2166 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "\"\\u\" í‘œê¸°ë²•ì€ ë’¤ì— 4ê°œì˜ 16진수가 와야 합니다." + +#: ../../common/jsonapi.c:2169 +msgid "" +"Unicode escape values cannot be used for code point values above 007F when " +"the encoding is not UTF8." +msgstr "" +"서버 ì¸ì½”ë”©ì´ UTF8ì´ ì•„ë‹Œ 경우 007F보다 í° ì½”ë“œ ì§€ì  ê°’ì—는 유니코드 ì´ìŠ¤ì¼€ì´" +"프 ê°’ì„ ì‚¬ìš©í•  수 ì—†ìŒ" + +#: ../../common/jsonapi.c:2178 +#, c-format +msgid "" +"Unicode escape value could not be translated to the server's encoding %s." +msgstr "유니코드 ì´ìŠ¤ì¼€ì´í”„ ê°’ì„ %s 서버 ì¸ì½”딩으로 변환할 수 ì—†ìŒ." + +#: ../../common/jsonapi.c:2185 +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "유니코드 ìƒìœ„ surrogate(딸림 코드)는 ìƒìœ„ 딸림 코드 ë’¤ì— ì˜¤ë©´ 안ë¨." + +#: ../../common/jsonapi.c:2187 +msgid "Unicode low surrogate must follow a high surrogate." +msgstr "유니코드 ìƒìœ„ surrogate(딸림 코드) ë’¤ì—는 하위 딸림 코드가 있어야 함." + +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "메니페스트 ì²´í¬ì„¬ 초기화를 í•  수 ì—†ìŒ" + +#: ../../common/parse_manifest.c:203 ../../common/parse_manifest.c:260 +msgid "manifest ended unexpectedly" +msgstr "메니페스트가 비정ìƒì ìœ¼ë¡œ ë났ìŒ" + +#: ../../common/parse_manifest.c:209 ../../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "메니페스트 ì²´í¬ì„¬ 갱신 í•  수 ì—†ìŒ" + +#: ../../common/parse_manifest.c:301 +msgid "unexpected object start" +msgstr "비정ìƒì ì¸ 개체 시작" + +#: ../../common/parse_manifest.c:336 +msgid "unexpected object end" +msgstr "비정ìƒì ì¸ 개체 ë" + +#: ../../common/parse_manifest.c:365 +msgid "unexpected array start" +msgstr "비정ìƒì ì¸ ë°°ì—´ 시작" + +#: ../../common/parse_manifest.c:390 +msgid "unexpected array end" +msgstr "비정ìƒì ì¸ ë°°ì—´ ë" + +#: ../../common/parse_manifest.c:417 +msgid "expected version indicator" +msgstr "버전 지시ìžê°€ 있어야 함" + +#: ../../common/parse_manifest.c:453 +msgid "unrecognized top-level field" +msgstr "최ìƒìœ„ 필드를 알 수 ì—†ìŒ" + +#: ../../common/parse_manifest.c:472 +msgid "unexpected file field" +msgstr "예ìƒì¹˜ 못한 íŒŒì¼ í•„ë“œ" + +#: ../../common/parse_manifest.c:486 +msgid "unexpected WAL range field" +msgstr "예ìƒì¹˜ 못한 WAL 범위 필드" + +#: ../../common/parse_manifest.c:492 +msgid "unexpected object field" +msgstr "예ìƒì¹˜ 못한 개체 필드" + +#: ../../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "예ìƒì¹˜ 못한 스칼ë¼" + +#: ../../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "매니페ì´ìФ ë²„ì „ì´ ì •ìˆ˜ê°€ 아님" + +#: ../../common/parse_manifest.c:612 +msgid "unexpected manifest version" +msgstr "예ìƒì¹˜ 못한 메니페스트 버전" + +#: ../../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "매니페ì´ìФ 안 system identifierê°€ 정수가 아님" + +#: ../../common/parse_manifest.c:661 +msgid "missing path name" +msgstr "패스 ì´ë¦„ ë¹ ì§" + +#: ../../common/parse_manifest.c:664 +msgid "both path name and encoded path name" +msgstr "패스 ì´ë¦„ê³¼ ì¸ì½”딩 ëœ íŒ¨ìŠ¤ ì´ë¦„ì´ í•¨ê»˜ 있ìŒ" + +#: ../../common/parse_manifest.c:666 +msgid "missing size" +msgstr "í¬ê¸° ë¹ ì§" + +#: ../../common/parse_manifest.c:669 +msgid "checksum without algorithm" +msgstr "알고리즘 없는 ì²´í¬ì„¬" + +#: ../../common/parse_manifest.c:683 +msgid "could not decode file name" +msgstr "íŒŒì¼ ì´ë¦„ì„ ë””ì½”ë”©í•  수 ì—†ìŒ" + +#: ../../common/parse_manifest.c:693 +msgid "file size is not an integer" +msgstr "íŒŒì¼ í¬ê¸°ê°€ 정수가 아님" + +#: ../../common/parse_manifest.c:699 pg_combinebackup.c:199 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "알 수 없는 ì²´í¬ì„¬ 알고리즘: \"%s\"" + +#: ../../common/parse_manifest.c:718 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "\"%s\" 파ì¼ì˜ ì²´í¬ì„¬ì´ 잘못ë¨: \"%s\"" + +#: ../../common/parse_manifest.c:761 +msgid "missing timeline" +msgstr "타임ë¼ì¸ ë¹ ì§" + +#: ../../common/parse_manifest.c:763 +msgid "missing start LSN" +msgstr "시작 LSN ë¹ ì§" + +#: ../../common/parse_manifest.c:765 +msgid "missing end LSN" +msgstr "ë LSN ë¹ ì§" + +#: ../../common/parse_manifest.c:771 +msgid "timeline is not an integer" +msgstr "타임ë¼ì¸ì´ 정수가 아님" + +#: ../../common/parse_manifest.c:774 +msgid "could not parse start LSN" +msgstr "시작 LSN ê°’ì„ ë¶„ì„í•  수 ì—†ìŒ" + +#: ../../common/parse_manifest.c:777 +msgid "could not parse end LSN" +msgstr "ë LSN ê°’ì„ ë¶„ì„í•  수 ì—†ìŒ" + +#: ../../common/parse_manifest.c:842 +msgid "expected at least 2 lines" +msgstr "ì ì–´ë„ 2ì¤„ì´ ë” ìžˆì–´ì•¼ 함" + +#: ../../common/parse_manifest.c:845 +msgid "last line not newline-terminated" +msgstr "마지막 ì¤„ì— ì¤„ë°”ê¿ˆ 문ìžê°€ ì—†ìŒ" + +#: ../../common/parse_manifest.c:864 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "메니페스트 ì²´í¬ì„¬ 마무리 작업 í•  수 ì—†ìŒ" + +#: ../../common/parse_manifest.c:868 +#, c-format +msgid "manifest has no checksum" +msgstr "ë©”ë‹ˆíŽ˜ìŠ¤íŠ¸ì— ì²´í¬ì„¬ ì—†ìŒ" + +#: ../../common/parse_manifest.c:872 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "ìž˜ëª»ëœ ë©”ë‹ˆíŽ˜ìŠ¤íŠ¸ ì²´í¬ì„¬: \"%s\"" + +#: ../../common/parse_manifest.c:876 +#, c-format +msgid "manifest checksum mismatch" +msgstr "메니페스트 ì²´í¬ì„¬ 불ì¼ì¹˜" + +#: ../../common/parse_manifest.c:891 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "백업 메니페스트 구문 ë¶„ì„ ì‹¤íŒ¨: %s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "\"%s\" ê°’ì€ %s ì˜µì…˜ì˜ ê°’ìœ¼ë¡œ ì ë‹¹í•˜ì§€ 않ìŒ" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s ê°’ì€ %d부터 %d까지만 허용합니다" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "알 수 없는 ë™ê¸°í™” 방법: %s" + +#: backup_label.c:66 backup_label.c:85 backup_label.c:95 +#, c-format +msgid "%s: could not parse %s" +msgstr "%s: %s êµ¬ë¬¸ë¶„ì„ ì‹¤íŒ¨" + +#: backup_label.c:69 backup_label.c:88 +#, c-format +msgid "%s: improper terminator for %s" +msgstr "%s: %s ê°’ì˜ ëì´ ì´ìƒí•¨" + +#: backup_label.c:76 +#, c-format +msgid "%s: could not parse TLI for %s" +msgstr "%s: %s ê°’ì˜ TLI êµ¬ë¬¸ë¶„ì„ ì‹¤íŒ¨" + +#: backup_label.c:79 backup_label.c:98 +#, c-format +msgid "%s: invalid TLI" +msgstr "%s: 바르지 ì•Šì€ TLI" + +#: backup_label.c:106 backup_label.c:108 +#, c-format +msgid "%s: could not find %s" +msgstr "%s: %s 찾지 못함" + +#: backup_label.c:110 backup_label.c:113 +#, c-format +msgid "%s: %s requires %s" +msgstr "%s: %sì€(는) %sì„(를) 필요로 함" + +#: backup_label.c:162 reconstruct.c:761 write_manifest.c:262 +#, c-format +msgid "could not write file \"%s\": wrote %d of %d" +msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %d/%d ë§Œí¼ ì”€" + +#: backup_label.c:166 copy_file.c:146 copy_file.c:193 reconstruct.c:721 +#: reconstruct.c:767 write_manifest.c:270 +#, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "\"%s\" íŒŒì¼ ì²´í¬ì„¬ì„ 갱신할 수 ì—†ìŒ" + +#: copy_file.c:186 +#, c-format +msgid "could not write to file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m" + +#: copy_file.c:188 +#, c-format +msgid "could not write to file \"%s\", offset %u: wrote %d of %d" +msgstr "\"%s\"íŒŒì¼ ì“°ê¸° 실패: 시작위치=%u, %d/%d ë§Œí¼ ì”€" + +#: copy_file.c:199 reconstruct.c:784 +#, c-format +msgid "could not read from file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" + +#: copy_file.c:218 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ í´ë¡ í•˜ëŠ” ë™ì•ˆ 오류 ë°œìƒ: %m" + +#: copy_file.c:229 copy_file.c:272 +#, c-format +msgid "could not create file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %m" + +#: copy_file.c:237 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %s" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ í´ë¡ í•˜ëŠ” ë™ì•ˆ 오류 ë°œìƒ: %s" + +#: copy_file.c:245 pg_combinebackup.c:251 +#, c-format +msgid "file cloning not supported on this platform" +msgstr "ì´ ìš´ì˜ì²´ì œëŠ” íŒŒì¼ í´ë¡  ê¸°ëŠ¥ì„ ì œê³µí•˜ì§€ 않습니다." + +#: copy_file.c:278 reconstruct.c:704 +#, c-format +msgid "error while copying file range from \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ copy_file_range 기능으로 복사 중 오류: %m" + +#: copy_file.c:285 pg_combinebackup.c:264 reconstruct.c:724 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "ì´ ìš´ì˜ì²´ì œëŠ” copy_file_range ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않습니다." + +#: copy_file.c:300 +#, c-format +msgid "could not copy file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ 복사할 수 ì—†ìŒ: %m" + +#: load_manifest.c:125 +#, c-format +msgid "file \"%s\" does not exist" +msgstr "\"%s\" íŒŒì¼ ì—†ìŒ" + +#: load_manifest.c:163 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "\"%s\" íŒŒì¼ ì½ê¸° 실패: %d/%lld ì½ìŒ" + +#: load_manifest.c:201 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "\"%s\" íŒŒì¼ ì½ê¸° 실패: %lld/%lld ì½ìŒ" + +#: load_manifest.c:248 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "백업 매니페ì´ìФ íŒŒì¼ ë²„ì „ì´ 1ì¸ ê²½ìš°ëŠ” ì¦ë¶„ ë°±ì—…ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: load_manifest.c:280 +#, c-format +msgid "duplicate path name in backup manifest: \"%s\"" +msgstr "백업 메니페스트 ì•ˆì— ê²½ë¡œ ì´ë¦„ì´ ì¤‘ë³µë¨: \"%s\"" + +#: pg_combinebackup.c:220 pg_combinebackup.c:228 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." + +#: pg_combinebackup.c:227 +#, c-format +msgid "no input directories specified" +msgstr "ìž…ë ¥ 디렉터리를 지정하지 않았ìŒ" + +#: pg_combinebackup.c:233 +#, c-format +msgid "no output directory specified" +msgstr "ìžë£Œê°€ ì €ìž¥ë  ë””ë ‰í„°ë¦¬ë¥¼ 지정하지 않았ìŒ" + +#: pg_combinebackup.c:301 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: 매니페ì´ìФ 시스템 ì‹ë³„번호는 %lluì¸ë°, 컨트롤 파ì¼ì€ %lluìž„" + +#: pg_combinebackup.c:340 +#, c-format +msgid "" +"cannot generate a manifest because no manifest is available for the final " +"input backup" +msgstr "마지막 ìž…ë ¥ 백업용 매니페ì´ìŠ¤ê°€ 없어 매니페ì´ìŠ¤ë¥¼ 만들 수 ì—†ìŒ" + +#: pg_combinebackup.c:387 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 심볼릭 ë§í¬ë¡œ 만들 수 ì—†ìŒ: %m" + +#: pg_combinebackup.c:399 pg_combinebackup.c:730 pg_combinebackup.c:927 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m" + +#: pg_combinebackup.c:454 +#, c-format +msgid "directory name too long" +msgstr "디렉터리 ì´ë¦„ì´ ë„ˆë¬´ ê¹€" + +#: pg_combinebackup.c:461 +#, c-format +msgid "multiple \"=\" signs in tablespace mapping" +msgstr "í…Œì´ë¸”스페ì´ìФ 맵핑 하는 ê³³ì—서 \"=\" 문ìžê°€ 중복 ë˜ì–´ 있ìŒ" + +#: pg_combinebackup.c:469 +#, c-format +msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" +msgstr "" +"\"%s\" 형ì‹ì˜ í…Œì´ë¸”스페ì´ìФ ë§µí•‘ì´ ìž˜ëª» ë˜ì—ˆìŒ, \"OLDDIR=NEWDIR\" 형ì‹ì´ì–´" +"야 함" + +#: pg_combinebackup.c:480 pg_combinebackup.c:484 +#, c-format +msgid "old directory is not an absolute path in tablespace mapping: %s" +msgstr "í…Œì´ë¸”스페ì´ìФ 맵핑용 옛 디렉터리가 절대 경로가 아님: %s" + +#: pg_combinebackup.c:553 +#, c-format +msgid "" +"backup at \"%s\" is a full backup, but only the first backup should be a " +"full backup" +msgstr "\"%s\"ì˜ ë°±ì—…ì€ ì „ì²´ 백업ì´ì§€ë§Œ, 첫 백업 단 하나만 ì „ì²´ 백업ì´ì–´ì•¼ 함" + +#: pg_combinebackup.c:556 +#, c-format +msgid "" +"backup at \"%s\" is an incremental backup, but the first backup should be a " +"full backup" +msgstr "\"%s\"ì˜ ë°±ì—…ì€ ì¦ë¶„ 백업ì´ì§€ë§Œ, 첫 ë°±ì—…ì€ ì „ì²´ 백업ì´ì–´ì•¼ 함" + +#: pg_combinebackup.c:559 +#, c-format +msgid "backup at \"%s\" starts on timeline %u, but expected %u" +msgstr "\"%s\"ì˜ ë°±ì—…ì€ íƒ€ìž„ë¼ì¸ %u번으로 시작하지만, 기대번호는 %uìž„" + +#: pg_combinebackup.c:562 +#, c-format +msgid "backup at \"%s\" starts at LSN %X/%X, but expected %X/%X" +msgstr "\"%s\"ì˜ ë°±ì—…ì€ ì‹œìž‘ LSNì´ %X/%Xì´ì§€ë§Œ, 기대 LSNì€ %X/%Xìž„" + +#: pg_combinebackup.c:614 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: CRC 잘못ë¨" + +#: pg_combinebackup.c:618 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: 예ìƒì¹˜ 못한 컨트롤 íŒŒì¼ ë²„ì „" + +#: pg_combinebackup.c:625 +#, c-format +msgid "%s: expected system identifier %llu, but found %llu" +msgstr "%s: ì˜ˆìƒ ì‹œìŠ¤í…œ ì‹ë³„번호는 %lluì´ì§€ë§Œ, %lluìž„" + +#: pg_combinebackup.c:657 +#, c-format +msgid "only some backups have checksums enabled" +msgstr "ì¼ë¶€ 백업만 ì²´í¬ì„¬ ê¸°ëŠ¥ì´ í™œì„±í™” ë˜ì—ˆìŒ" + +#: pg_combinebackup.c:658 +#, c-format +msgid "" +"Disable, and optionally reenable, checksums on the output directory to avoid " +"failures." +msgstr "" +"실패를 피하기 위해 출력 ë””ë ‰í„°ë¦¬ì˜ ì²´í¬ì„¬ ê¸°ëŠ¥ì„ ë¹„í™œì„±í•˜ê³ , 다 합치고 나서 " +"활성화하는 ë°©ë²•ì´ ìžˆìŒ." + +#: pg_combinebackup.c:693 +#, c-format +msgid "removing output directory \"%s\"" +msgstr "\"%s\" 출력 디렉터리 ì‚­ì œ 중" + +#: pg_combinebackup.c:695 +#, c-format +msgid "failed to remove output directory" +msgstr "출력 디렉터리 ì‚­ì œ 실패" + +#: pg_combinebackup.c:699 +#, c-format +msgid "removing contents of output directory \"%s\"" +msgstr "\"%s\" 출력 디렉터리 안 파ì¼ë“¤ì„ ì‚­ì œ 중" + +#: pg_combinebackup.c:702 +#, c-format +msgid "failed to remove contents of output directory" +msgstr "출력 디렉터리 안 íŒŒì¼ ì‚­ì œ 실패" + +#: pg_combinebackup.c:742 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "\"%s\" 디렉터리가 비어있지 않습니다." + +#: pg_combinebackup.c:745 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m" + +#: pg_combinebackup.c:759 +#, c-format +msgid "" +"%s reconstructs full backups from incrementals.\n" +"\n" +msgstr "" +"%sì€ ì¦ë¶„ ë°±ì—…ë“¤ì„ í•©ì³ ì „ì²´ ë°±ì—…ì„ ìž¬ìƒì„± 합니다.\n" +"\n" + +#: pg_combinebackup.c:760 +#, c-format +msgid "Usage:\n" +msgstr "사용법:\n" + +#: pg_combinebackup.c:761 +#, c-format +msgid " %s [OPTION]... DIRECTORY...\n" +msgstr " %s [옵션]... 디렉터리...\n" + +#: pg_combinebackup.c:762 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"옵션들:\n" + +#: pg_combinebackup.c:763 +#, c-format +msgid " -d, --debug generate lots of debugging output\n" +msgstr " -d, --debug ë””ë²„ê¹…ì— í•„ìš”í•œ ì •ë³´ë“¤ë„ í•¨ê»˜ 출력함\n" + +#: pg_combinebackup.c:764 +#, c-format +msgid " -n, --dry-run do not actually do anything\n" +msgstr " -n, --dry-run 실 ìž‘ì—…ì€ ì§„í–‰í•˜ì§€ 않ìŒ\n" + +#: pg_combinebackup.c:765 +#, c-format +msgid "" +" -N, --no-sync do not wait for changes to be written safely to " +"disk\n" +msgstr "" +" -N, --no-sync 작업 완료 ë’¤ ë””ìŠ¤í¬ ë™ê¸°í™” ìž‘ì—…ì„ í•˜ì§€ 않ìŒ\n" + +#: pg_combinebackup.c:766 +#, c-format +msgid " -o, --output=DIRECTORY output directory\n" +msgstr " -o, --output=DIRECTORY 출력 디렉터리\n" + +#: pg_combinebackup.c:767 +#, c-format +msgid "" +" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" +" relocate tablespace in OLDDIR to NEWDIR\n" +msgstr "" +" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" +" OLDDIRì„ NEWDIR로 í…Œì´ë¸”스페ì´ìФ 재조정\n" + +#: pg_combinebackup.c:769 +#, c-format +msgid " --clone clone (reflink) files instead of copying\n" +msgstr " --clone 파ì¼ì„ 복사 ëŒ€ì‹ ì— í´ë¡  (reflink)\n" + +#: pg_combinebackup.c:770 +#, c-format +msgid " --copy copy files (default)\n" +msgstr " --copy íŒŒì¼ ë³µì‚¬ (기본값)\n" + +#: pg_combinebackup.c:771 +#, c-format +msgid " --copy-file-range copy using copy_file_range() system call\n" +msgstr "" +" --copy-file-range 복사 í•  때 copy using copy_file_range() 사용\n" + +#: pg_combinebackup.c:772 +#, c-format +msgid "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" use algorithm for manifest checksums\n" +msgstr "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" 매니페스트 ì²´í¬ì„¬ 알고리즘 지정\n" + +#: pg_combinebackup.c:774 +#, c-format +msgid " --no-manifest suppress generation of backup manifest\n" +msgstr " --no-manifest 백업 매니페ì´ìФ íŒŒì¼ ë§Œë“¤ì§€ 않ìŒ\n" + +#: pg_combinebackup.c:775 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD 파ì¼ì„ 디스í¬ì— ë™ê¸°í™” 하는 방법 지정\n" + +#: pg_combinebackup.c:776 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version 버전 정보를 보여주고 마침\n" + +#: pg_combinebackup.c:777 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" + +#: pg_combinebackup.c:779 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"ë¬¸ì œì  ë³´ê³  주소: <%s>\n" + +#: pg_combinebackup.c:780 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 홈페ì´ì§€: <%s>\n" + +#: pg_combinebackup.c:995 +#, c-format +msgid "skipping symbolic link \"%s\"" +msgstr "\"%s\" 심볼릭 ë§í¬ 건너뜀" + +#: pg_combinebackup.c:997 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "\"%s\" 특수 파ì¼ì„ 건너뜀" + +#: pg_combinebackup.c:1073 reconstruct.c:305 +#, c-format +msgid "manifest file \"%s\" contains no entry for file \"%s\"" +msgstr "\"%s\" 매니페스트 파ì¼ì— \"%s\" 파ì¼ì— 대한 ì •ë³´ê°€ ì—†ìŒ" + +#: pg_combinebackup.c:1189 +#, c-format +msgid "%s: server version too old" +msgstr "%s: 서버 ë²„ì „ì´ ë„ˆë¬´ ë‚®ìŒ" + +#: pg_combinebackup.c:1190 +#, c-format +msgid "%s: could not parse version number" +msgstr "%s: 버전 번호를 í•´ì„í•  수 ì—†ìŒ" + +#: pg_combinebackup.c:1309 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "\"%s\" 심볼릭 ë§í¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" + +#: pg_combinebackup.c:1312 +#, c-format +msgid "target of symbolic link \"%s\" is too long" +msgstr "\"%s\" 심볼릭 ë§í¬ì˜ 대ìƒì´ 너무 긺" + +#: pg_combinebackup.c:1315 +#, c-format +msgid "target of symbolic link \"%s\" is relative" +msgstr "\"%s\" 심볼릭 ë§í¬ 대ìƒì´ ìƒëŒ€ 경로임" + +#: pg_combinebackup.c:1337 +#, c-format +msgid "tablespace at \"%s\" has no tablespace mapping" +msgstr "\"%s\"ì˜ í…Œì´ë¸”스페ì´ìŠ¤ëŠ” í…Œì´ë¸”스페ì´ìФ 맵핑 ì •ë³´ê°€ ì—†ìŒ" + +#: pg_combinebackup.c:1355 +#, c-format +msgid "tablespaces with OIDs %u and %u both point at directory \"%s\"" +msgstr "OIDs %u, %u ë‘ í…Œì´ë¸”스페ì´ìŠ¤ëŠ” ê°™ì€ \"%s\" 디렉터리를 사용함" + +#: pg_combinebackup.c:1364 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: pg_combinebackup.c:1385 +#, c-format +msgid "file \"%s\" is too large" +msgstr "\"%s\" 파ì¼ì´ 너무 í½ë‹ˆë‹¤." + +#: pg_combinebackup.c:1402 +#, c-format +msgid "could not read file \"%s\": read %zd of %lld" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %zd/%lld ë§Œ ì½ì—ˆìŒ" + +#: reconstruct.c:339 +#, c-format +msgid "full backup contains unexpected incremental file \"%s\"" +msgstr "ì „ì²´ ë°±ì—…ì— ì˜ˆìƒì¹˜ 못한 ì¦ë¶„ 파ì¼ì´ 있ìŒ: \"%s\"" + +#: reconstruct.c:423 +#, c-format +msgid "file \"%s\" is too short: expected %llu, found %llu" +msgstr "\"%s\" íŒŒì¼ í¬ê¸°ê°€ 너무 ì ìŒ: 기대값=%llu, 실재값=%llu" + +#: reconstruct.c:465 +#, c-format +msgid "file \"%s\" has bad incremental magic number (0x%x, expected 0x%x)" +msgstr "\"%s\" 파ì¼ì— ìž˜ëª»ëœ ì¦ë¶„ ë§¤ì§ ë²ˆí˜¸(0x%x)ê°€ ìžˆìŒ (기대값 0x%x)" + +#: reconstruct.c:471 +#, c-format +msgid "file \"%s\" has block count %u in excess of segment size %u" +msgstr "\"%s\" 파ì¼ì˜ ë¸”ë¡ ìˆ˜(%u)ê°€ ì¡°ê° í¬ê¸°(%u)보다 í¼" + +#: reconstruct.c:478 +#, c-format +msgid "file \"%s\" has truncation block length %u in excess of segment size %u" +msgstr "\"%s\" 파ì¼ì˜ ì‚­ì œ 블럭 길ì´(%u)ê°€ ì¡°ê° í¬ê¸°(%u)보다 í¼" + +#: reconstruct.c:542 +#, c-format +msgid "could not read file \"%s\": read %d of %u" +msgstr "\"%s\" íŒŒì¼ ì½ì„ 수 ì—†ìŒ: %d/%uë§Œ ì½ìŒ" + +#: reconstruct.c:786 +#, c-format +msgid "could not read from file \"%s\", offset %llu: read %d of %d" +msgstr "\"%s\" íŒŒì¼ ì½ì„ 수 ì—†ìŒ: 시작위치 %llu, %d/%dë§Œ ì½ìŒ" diff --git a/src/bin/pg_combinebackup/po/meson.build b/src/bin/pg_combinebackup/po/meson.build new file mode 100644 index 0000000000000..48568425f68d4 --- /dev/null +++ b/src/bin/pg_combinebackup/po/meson.build @@ -0,0 +1,3 @@ +# Copyright (c) 2023-2024, PostgreSQL Global Development Group + +nls_targets += [i18n.gettext('pg_combinebackup-' + pg_version_major.to_string())] diff --git a/src/bin/pg_combinebackup/po/ru.po b/src/bin/pg_combinebackup/po/ru.po new file mode 100644 index 0000000000000..5c2af7387c385 --- /dev/null +++ b/src/bin/pg_combinebackup/po/ru.po @@ -0,0 +1,944 @@ +# Alexander Lakhin , 2024. +msgid "" +msgstr "" +"Project-Id-Version: pg_combinebackup (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2025-02-08 07:44+0200\n" +"PO-Revision-Date: 2024-11-09 08:04+0300\n" +"Last-Translator: Alexander Lakhin \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Lokalize 21.12.3\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "ошибка: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "предупреждение: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "подробноÑти: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "подÑказка: " + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m" + +#: ../../common/controldata_utils.c:110 copy_file.c:150 load_manifest.c:161 +#: load_manifest.c:199 pg_combinebackup.c:1400 reconstruct.c:540 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %zu)" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: backup_label.c:174 copy_file.c:68 pg_combinebackup.c:538 +#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:740 +#: write_manifest.c:187 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неÑоответÑтвие порÑдка байт" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, " +"and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"возможно неÑоответÑтвие порÑдка байт\n" +"ПорÑдок байт в файле pg_control может не ÑоответÑтвовать иÑпользуемому\n" +"Ñтой программой. Ð’ Ñтом Ñлучае результаты будут неверными и\n" +"уÑтановленный PostgreSQL будет неÑовмеÑтим Ñ Ñтим каталогом данных." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 backup_label.c:143 copy_file.c:66 +#: copy_file.c:139 copy_file.c:171 copy_file.c:175 copy_file.c:225 +#: copy_file.c:268 load_manifest.c:128 pg_combinebackup.c:523 +#: pg_combinebackup.c:1167 reconstruct.c:523 reconstruct.c:638 +#: write_manifest.c:250 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" + +#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:759 +#: write_manifest.c:260 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:852 +#, c-format +msgid "out of memory" +msgstr "нехватка памÑти" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "уÑпех" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "буфер Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñлишком мал" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "ошибка OpenSSL" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "нехватка памÑти\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: backup_label.c:187 load_manifest.c:133 pg_combinebackup.c:676 +#: pg_combinebackup.c:1131 pg_combinebackup.c:1383 reconstruct.c:204 +#: reconstruct.c:421 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñта Ñборка программы не поддерживает метод Ñинхронизации \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_combinebackup.c:933 pg_combinebackup.c:1256 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" + +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "" +"Инкрементальный лекÑичеÑкий анализатор не подходит Ð´Ð»Ñ Ð½Ð¸ÑходÑщего " +"рекурÑивного разбора." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "" +"Ð”Ð»Ñ Ð¸Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ разбора требуетÑÑ Ð¸Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ñ‹Ð¹ лекÑичеÑкий " +"анализатор." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "" +"Слишком Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ñть JSON, макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð°Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð°: 6400." + +#: ../../common/jsonapi.c:2127 +#, c-format +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑпецпоÑледовательноÑть: \"\\%.*s\"." + +#: ../../common/jsonapi.c:2131 +#, c-format +msgid "Character with value 0x%02x must be escaped." +msgstr "Символ Ñ ÐºÐ¾Ð´Ð¾Ð¼ 0x%02x необходимо Ñкранировать." + +#: ../../common/jsonapi.c:2135 +#, c-format +msgid "Expected end of input, but found \"%.*s\"." +msgstr "ОжидалÑÑ ÐºÐ¾Ð½ÐµÑ† текÑта, но обнаружено продолжение \"%.*s\"." + +#: ../../common/jsonapi.c:2138 +#, c-format +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "ОжидалÑÑ Ñлемент маÑÑива или \"]\", но обнаружено \"%.*s\"." + +#: ../../common/jsonapi.c:2141 +#, c-format +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "ОжидалаÑÑŒ \",\" или \"]\", но обнаружено \"%.*s\"." + +#: ../../common/jsonapi.c:2144 +#, c-format +msgid "Expected \":\", but found \"%.*s\"." +msgstr "ОжидалоÑÑŒ \":\", но обнаружено \"%.*s\"." + +#: ../../common/jsonapi.c:2147 +#, c-format +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "ОжидалоÑÑŒ значение JSON, но обнаружено \"%.*s\"." + +#: ../../common/jsonapi.c:2150 +msgid "The input string ended unexpectedly." +msgstr "Ðеожиданный конец входной Ñтроки." + +#: ../../common/jsonapi.c:2152 +#, c-format +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "ОжидалаÑÑŒ Ñтрока или \"}\", но обнаружено \"%.*s\"." + +#: ../../common/jsonapi.c:2155 +#, c-format +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "ОжидалаÑÑŒ \",\" или \"}\", но обнаружено \"%.*s\"." + +#: ../../common/jsonapi.c:2158 +#, c-format +msgid "Expected string, but found \"%.*s\"." +msgstr "ОжидалаÑÑŒ Ñтрока, но обнаружено \"%.*s\"." + +#: ../../common/jsonapi.c:2161 +#, c-format +msgid "Token \"%.*s\" is invalid." +msgstr "Ошибочный Ñлемент \"%.*s\"." + +#: ../../common/jsonapi.c:2164 +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ в текÑÑ‚." + +#: ../../common/jsonapi.c:2166 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "За \"\\u\" должны Ñледовать четыре шеÑтнадцатеричные цифры." + +#: ../../common/jsonapi.c:2169 +msgid "" +"Unicode escape values cannot be used for code point values above 007F when " +"the encoding is not UTF8." +msgstr "" +"Спецкоды Unicode Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ выше 007F можно иÑпользовать только Ñ " +"кодировкой UTF8." + +#: ../../common/jsonapi.c:2178 +#, c-format +msgid "" +"Unicode escape value could not be translated to the server's encoding %s." +msgstr "Спецкод Unicode Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ в Ñерверную кодировку %s." + +#: ../../common/jsonapi.c:2185 +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "" +"Старшее Ñлово Ñуррогата Unicode не может Ñледовать за другим Ñтаршим Ñловом." + +#: ../../common/jsonapi.c:2187 +msgid "Unicode low surrogate must follow a high surrogate." +msgstr "Младшее Ñлово Ñуррогата Unicode должно Ñледовать за Ñтаршим Ñловом." + +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "не удалоÑÑŒ подготовить контекÑÑ‚ контрольной Ñуммы манифеÑта" + +#: ../../common/parse_manifest.c:203 ../../common/parse_manifest.c:260 +msgid "manifest ended unexpectedly" +msgstr "неожиданный конец манифеÑта" + +#: ../../common/parse_manifest.c:209 ../../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "не удалоÑÑŒ изменить контекÑÑ‚ контрольной Ñуммы манифеÑта" + +#: ../../common/parse_manifest.c:301 +msgid "unexpected object start" +msgstr "неожиданное начало объекта" + +#: ../../common/parse_manifest.c:336 +msgid "unexpected object end" +msgstr "неожиданный конец объекта" + +#: ../../common/parse_manifest.c:365 +msgid "unexpected array start" +msgstr "неожиданное начало маÑÑива" + +#: ../../common/parse_manifest.c:390 +msgid "unexpected array end" +msgstr "неожиданный конец маÑÑива" + +#: ../../common/parse_manifest.c:417 +msgid "expected version indicator" +msgstr "ожидалоÑÑŒ указание верÑии" + +#: ../../common/parse_manifest.c:453 +msgid "unrecognized top-level field" +msgstr "нераÑпознанное поле на верхнем уровне" + +#: ../../common/parse_manifest.c:472 +msgid "unexpected file field" +msgstr "неизвеÑтное поле Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°" + +#: ../../common/parse_manifest.c:486 +msgid "unexpected WAL range field" +msgstr "неизвеÑтное поле в указании диапазона WAL" + +#: ../../common/parse_manifest.c:492 +msgid "unexpected object field" +msgstr "неожиданное поле объекта" + +#: ../../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "неожиданное ÑкалÑрное значение" + +#: ../../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "верÑÐ¸Ñ Ð¼Ð°Ð½Ð¸Ñ„ÐµÑта не ÑвлÑетÑÑ Ñ†ÐµÐ»Ñ‹Ð¼ чиÑлом" + +#: ../../common/parse_manifest.c:612 +msgid "unexpected manifest version" +msgstr "Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¼Ð°Ð½Ð¸Ñ„ÐµÑта" + +#: ../../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "идентификатор ÑиÑтемы в манифеÑте не ÑвлÑетÑÑ Ñ†ÐµÐ»Ñ‹Ð¼ чиÑлом" + +#: ../../common/parse_manifest.c:661 +msgid "missing path name" +msgstr "отÑутÑтвует указание пути" + +#: ../../common/parse_manifest.c:664 +msgid "both path name and encoded path name" +msgstr "путь задан в обычном виде и в закодированном" + +#: ../../common/parse_manifest.c:666 +msgid "missing size" +msgstr "отÑутÑтвует указание размера" + +#: ../../common/parse_manifest.c:669 +msgid "checksum without algorithm" +msgstr "не задан алгоритм раÑчёта контрольной Ñуммы" + +#: ../../common/parse_manifest.c:683 +msgid "could not decode file name" +msgstr "не удалоÑÑŒ декодировать Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°" + +#: ../../common/parse_manifest.c:693 +msgid "file size is not an integer" +msgstr "размер файла не ÑвлÑетÑÑ Ñ†ÐµÐ»Ð¾Ñ‡Ð¸Ñленным" + +#: ../../common/parse_manifest.c:699 pg_combinebackup.c:199 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "нераÑпознанный алгоритм раÑчёта контрольных Ñумм: \"%s\"" + +#: ../../common/parse_manifest.c:718 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": \"%s\"" + +#: ../../common/parse_manifest.c:761 +msgid "missing timeline" +msgstr "отÑутÑтвует Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸" + +#: ../../common/parse_manifest.c:763 +msgid "missing start LSN" +msgstr "отÑутÑтвует начальный LSN" + +#: ../../common/parse_manifest.c:765 +msgid "missing end LSN" +msgstr "отÑутÑтвует конечный LSN" + +#: ../../common/parse_manifest.c:771 +msgid "timeline is not an integer" +msgstr "Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ задана не целым чиÑлом" + +#: ../../common/parse_manifest.c:774 +msgid "could not parse start LSN" +msgstr "не удалоÑÑŒ разобрать начальный LSN" + +#: ../../common/parse_manifest.c:777 +msgid "could not parse end LSN" +msgstr "не удалоÑÑŒ разобрать конечный LSN" + +#: ../../common/parse_manifest.c:842 +msgid "expected at least 2 lines" +msgstr "ожидалоÑÑŒ как минимум 2 Ñтроки" + +#: ../../common/parse_manifest.c:845 +msgid "last line not newline-terminated" +msgstr "поÑледнÑÑ Ñтрока не оканчиваетÑÑ Ñимволом новой Ñтроки" + +#: ../../common/parse_manifest.c:864 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "не удалоÑÑŒ завершить раÑчёт контрольной Ñуммы манифеÑта" + +#: ../../common/parse_manifest.c:868 +#, c-format +msgid "manifest has no checksum" +msgstr "в манифеÑте нет контрольной Ñуммы" + +#: ../../common/parse_manifest.c:872 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма в манифеÑте: \"%s\"" + +#: ../../common/parse_manifest.c:876 +#, c-format +msgid "manifest checksum mismatch" +msgstr "ошибка контрольной Ñуммы манифеÑта" + +#: ../../common/parse_manifest.c:891 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "не удалоÑÑŒ разобрать манифеÑÑ‚ копии: %s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "значение %s должно быть в диапазоне %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нераÑпознанный метод Ñинхронизации: %s" + +#: backup_label.c:66 backup_label.c:85 backup_label.c:95 +#, c-format +msgid "%s: could not parse %s" +msgstr "%s: не удалоÑÑŒ разобрать %s" + +#: backup_label.c:69 backup_label.c:88 +#, c-format +msgid "%s: improper terminator for %s" +msgstr "%s: неподходÑщее окончание Ð´Ð»Ñ %s" + +#: backup_label.c:76 +#, c-format +msgid "%s: could not parse TLI for %s" +msgstr "%s: не удалоÑÑŒ разобрать TLI Ð´Ð»Ñ %s" + +#: backup_label.c:79 backup_label.c:98 +#, c-format +msgid "%s: invalid TLI" +msgstr "%s: неверное значение TLI" + +#: backup_label.c:106 backup_label.c:108 +#, c-format +msgid "%s: could not find %s" +msgstr "%s: не удалоÑÑŒ найти %s" + +#: backup_label.c:110 backup_label.c:113 +#, c-format +msgid "%s: %s requires %s" +msgstr "%s: %s требует %s" + +#: backup_label.c:162 reconstruct.c:761 write_manifest.c:262 +#, c-format +msgid "could not write file \"%s\": wrote %d of %d" +msgstr "не удалоÑÑŒ запиÑать файл \"%s\" (запиÑано байт: %d из %d)" + +#: backup_label.c:166 copy_file.c:146 copy_file.c:193 reconstruct.c:721 +#: reconstruct.c:767 write_manifest.c:270 +#, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "не удалоÑÑŒ изменить контекÑÑ‚ контрольной Ñуммы файла \"%s\"" + +#: copy_file.c:186 +#, c-format +msgid "could not write to file \"%s\": %m" +msgstr "не удалоÑÑŒ запиÑать в файл \"%s\": %m" + +#: copy_file.c:188 +#, c-format +msgid "could not write to file \"%s\", offset %u: wrote %d of %d" +msgstr "" +"не удалоÑÑŒ запиÑать в файл \"%s\" (Ñмещение %u, запиÑано байт: %d из %d)" + +#: copy_file.c:199 reconstruct.c:784 +#, c-format +msgid "could not read from file \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" + +#: copy_file.c:218 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %m" +msgstr "ошибка при клонировании файла \"%s\" в \"%s\": %m" + +#: copy_file.c:229 copy_file.c:272 +#, c-format +msgid "could not create file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñоздать файл \"%s\": %m" + +#: copy_file.c:237 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %s" +msgstr "ошибка при клонировании файла \"%s\" в \"%s\": %s" + +#: copy_file.c:245 pg_combinebackup.c:251 +#, c-format +msgid "file cloning not supported on this platform" +msgstr "клонирование файлов не поддерживаетÑÑ Ð² Ñтой ОС" + +#: copy_file.c:278 reconstruct.c:704 +#, c-format +msgid "error while copying file range from \"%s\" to \"%s\": %m" +msgstr "ошибка при копировании фрагмента файла \"%s\" в \"%s\": %m" + +#: copy_file.c:285 pg_combinebackup.c:264 reconstruct.c:724 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "copy_file_range не поддерживаетÑÑ Ð² Ñтой ОС" + +#: copy_file.c:300 +#, c-format +msgid "could not copy file \"%s\" to \"%s\": %m" +msgstr "не удалоÑÑŒ Ñкопировать файл \"%s\" в \"%s\": %m" + +#: load_manifest.c:125 +#, c-format +msgid "file \"%s\" does not exist" +msgstr "файл \"%s\" не ÑущеÑтвует" + +#: load_manifest.c:163 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %lld)" + +#: load_manifest.c:201 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %lld из %lld)" + +#: load_manifest.c:248 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "" +"Ñ Ð²ÐµÑ€Ñией 1 манифеÑта копии инкрементальное копирование не поддерживаетÑÑ" + +#: load_manifest.c:280 +#, c-format +msgid "duplicate path name in backup manifest: \"%s\"" +msgstr "дублирующийÑÑ Ð¿ÑƒÑ‚ÑŒ в манифеÑте копии: \"%s\"" + +#: pg_combinebackup.c:220 pg_combinebackup.c:228 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." + +#: pg_combinebackup.c:227 +#, c-format +msgid "no input directories specified" +msgstr "входные каталоги не указаны" + +#: pg_combinebackup.c:233 +#, c-format +msgid "no output directory specified" +msgstr "выходной каталог не указан" + +#: pg_combinebackup.c:301 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: идентификатор ÑиÑтемы в манифеÑте %llu, а в управлÑющем файле %llu" + +#: pg_combinebackup.c:340 +#, c-format +msgid "" +"cannot generate a manifest because no manifest is available for the final " +"input backup" +msgstr "" +"Ñгенерировать манифеÑÑ‚ Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾ причине отÑутÑÑ‚Ð²Ð¸Ñ Ð¼Ð°Ð½Ð¸Ñ„ÐµÑта в поÑледней " +"указанной копии" + +#: pg_combinebackup.c:387 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "не удалоÑÑŒ Ñоздать ÑимволичеÑкую ÑÑылку \"%s\" в \"%s\": %m" + +#: pg_combinebackup.c:399 pg_combinebackup.c:730 pg_combinebackup.c:927 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m" + +#: pg_combinebackup.c:454 +#, c-format +msgid "directory name too long" +msgstr "Ñлишком длинное Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°" + +#: pg_combinebackup.c:461 +#, c-format +msgid "multiple \"=\" signs in tablespace mapping" +msgstr "неÑколько знаков \"=\" в ÑопоÑтавлении табличного проÑтранÑтва" + +#: pg_combinebackup.c:469 +#, c-format +msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" +msgstr "" +"ÑопоÑтавление табл. проÑтранÑтва запиÑано неверно: \"%s\"; должно быть " +"\"СТÐРЫЙ_КÐТÐЛОГ=ÐОВЫЙ_КÐТÐЛОГ\"" + +#: pg_combinebackup.c:480 pg_combinebackup.c:484 +#, c-format +msgid "old directory is not an absolute path in tablespace mapping: %s" +msgstr "" +"Ñтарый каталог в ÑопоÑтавлении табл. проÑтранÑтва задан не абÑолютным путём: " +"%s" + +#: pg_combinebackup.c:553 +#, c-format +msgid "" +"backup at \"%s\" is a full backup, but only the first backup should be a " +"full backup" +msgstr "" +"ÐºÐ¾Ð¿Ð¸Ñ Ð² \"%s\" ÑвлÑетÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ копией, но полную копию можно передать только " +"первой в ÑпиÑке" + +#: pg_combinebackup.c:556 +#, c-format +msgid "" +"backup at \"%s\" is an incremental backup, but the first backup should be a " +"full backup" +msgstr "" +"ÐºÐ¾Ð¿Ð¸Ñ Ð² \"%s\" ÑвлÑетÑÑ Ð¸Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð¹, но первой в ÑпиÑке должна " +"передаватьÑÑ Ð¿Ð¾Ð»Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ" + +#: pg_combinebackup.c:559 +#, c-format +msgid "backup at \"%s\" starts on timeline %u, but expected %u" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ Ð² \"%s\" начинаетÑÑ Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени %u, а ожидалаÑÑŒ %u" + +#: pg_combinebackup.c:562 +#, c-format +msgid "backup at \"%s\" starts at LSN %X/%X, but expected %X/%X" +msgstr "ÐºÐ¾Ð¿Ð¸Ñ Ð² \"%s\" начинаетÑÑ Ñ LSN %X/%X, а ожидалÑÑ %X/%X" + +#: pg_combinebackup.c:614 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: ошибка CRC" + +#: pg_combinebackup.c:618 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющего файла" + +#: pg_combinebackup.c:625 +#, c-format +msgid "%s: expected system identifier %llu, but found %llu" +msgstr "%s: ожидалÑÑ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€ ÑиÑтемы %llu, но обнаружен %llu" + +#: pg_combinebackup.c:657 +#, c-format +msgid "only some backups have checksums enabled" +msgstr "контрольные Ñуммы включены только в некоторых копиÑÑ…" + +#: pg_combinebackup.c:658 +#, c-format +msgid "" +"Disable, and optionally reenable, checksums on the output directory to avoid " +"failures." +msgstr "" +"Отключите (и при необходимоÑти вновь включите) контрольные Ñуммы в выходном " +"каталоге во избежание Ñбоев." + +#: pg_combinebackup.c:693 +#, c-format +msgid "removing output directory \"%s\"" +msgstr "удаление выходного каталога \"%s\"" + +#: pg_combinebackup.c:695 +#, c-format +msgid "failed to remove output directory" +msgstr "ошибка при удалении выходного каталога" + +#: pg_combinebackup.c:699 +#, c-format +msgid "removing contents of output directory \"%s\"" +msgstr "удаление Ñодержимого выходного каталога \"%s\"" + +#: pg_combinebackup.c:702 +#, c-format +msgid "failed to remove contents of output directory" +msgstr "ошибка при удалении Ñодержимого выходного каталога" + +#: pg_combinebackup.c:742 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "каталог \"%s\" ÑущеÑтвует, но он не пуÑÑ‚" + +#: pg_combinebackup.c:745 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "ошибка при обращении к каталогу \"%s\": %m" + +#: pg_combinebackup.c:759 +#, c-format +msgid "" +"%s reconstructs full backups from incrementals.\n" +"\n" +msgstr "" +"%s реконÑтруирует полные копии из инкрементальных.\n" +"\n" + +#: pg_combinebackup.c:760 +#, c-format +msgid "Usage:\n" +msgstr "ИÑпользование:\n" + +#: pg_combinebackup.c:761 +#, c-format +msgid " %s [OPTION]... DIRECTORY...\n" +msgstr " %s [ПÐРÐМЕТР]... КÐТÐЛОГ...\n" + +#: pg_combinebackup.c:762 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Параметры:\n" + +#: pg_combinebackup.c:763 +#, c-format +msgid " -d, --debug generate lots of debugging output\n" +msgstr " -d, --debug выдавать много отладочных Ñообщений\n" + +#: pg_combinebackup.c:764 +#, c-format +msgid " -n, --dry-run do not actually do anything\n" +msgstr "" +" -n, --dry-run не выполнÑть никаких практичеÑких дейÑтвий\n" + +#: pg_combinebackup.c:765 +#, c-format +msgid "" +" -N, --no-sync do not wait for changes to be written safely to " +"disk\n" +msgstr "" +" -N, --no-sync не ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… на диÑке\n" + +#: pg_combinebackup.c:766 +#, c-format +msgid " -o, --output=DIRECTORY output directory\n" +msgstr " -o, --output=КÐТÐЛОГ выходной каталог\n" + +#: pg_combinebackup.c:767 +#, c-format +msgid "" +" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" +" relocate tablespace in OLDDIR to NEWDIR\n" +msgstr "" +" -T, --tablespace-mapping=СТÐРЫЙ_КÐТÐЛОГ=ÐОВЫЙ_КÐТÐЛОГ\n" +" перенеÑти табличное проÑтранÑтво из Ñтарого " +"каталога\n" +" в новый\n" + +#: pg_combinebackup.c:769 +#, c-format +msgid " --clone clone (reflink) files instead of copying\n" +msgstr "" +" --clone клонировать (иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ reflink), а не " +"копировать\n" +" файлы\n" + +#: pg_combinebackup.c:770 +#, c-format +msgid " --copy copy files (default)\n" +msgstr " --copy копировать файлы (по умолчанию)\n" + +#: pg_combinebackup.c:771 +#, c-format +msgid " --copy-file-range copy using copy_file_range() system call\n" +msgstr "" +" --copy-file-range иÑпользовать Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑиÑтемную функцию\n" +" copy_file_range()\n" + +#: pg_combinebackup.c:772 +#, c-format +msgid "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" use algorithm for manifest checksums\n" +msgstr "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" алгоритм подÑчёта контрольных Ñумм в манифеÑте\n" + +#: pg_combinebackup.c:774 +#, c-format +msgid " --no-manifest suppress generation of backup manifest\n" +msgstr " --no-manifest отключить Ñоздание манифеÑта копии\n" + +#: pg_combinebackup.c:775 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=МЕТОД метод Ñинхронизации файлов Ñ Ð¤Ð¡\n" + +#: pg_combinebackup.c:776 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version показать верÑию и выйти\n" + +#: pg_combinebackup.c:777 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help показать Ñту Ñправку и выйти\n" + +#: pg_combinebackup.c:779 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Об ошибках Ñообщайте по адреÑу <%s>.\n" + +#: pg_combinebackup.c:780 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" + +#: pg_combinebackup.c:995 +#, c-format +msgid "skipping symbolic link \"%s\"" +msgstr "ÑимволичеÑÐºÐ°Ñ ÑÑылка \"%s\" пропуÑкаетÑÑ" + +#: pg_combinebackup.c:997 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "Ñпециальный файл \"%s\" пропуÑкаетÑÑ" + +#: pg_combinebackup.c:1073 reconstruct.c:305 +#, c-format +msgid "manifest file \"%s\" contains no entry for file \"%s\"" +msgstr "файл манифеÑта \"%s\" не Ñодержит запиÑи о файле \"%s\"" + +#: pg_combinebackup.c:1189 +#, c-format +msgid "%s: server version too old" +msgstr "%s: верÑÐ¸Ñ Ñервера Ñлишком ÑтараÑ" + +#: pg_combinebackup.c:1190 +#, c-format +msgid "%s: could not parse version number" +msgstr "%s: не удалоÑÑŒ разобрать номер верÑии" + +#: pg_combinebackup.c:1309 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m" + +#: pg_combinebackup.c:1312 +#, c-format +msgid "target of symbolic link \"%s\" is too long" +msgstr "целевой путь ÑимволичеÑкой ÑÑылки \"%s\" Ñлишком длинный" + +#: pg_combinebackup.c:1315 +#, c-format +msgid "target of symbolic link \"%s\" is relative" +msgstr "целевой путь ÑимволичеÑкой ÑÑылки \"%s\" ÑвлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительным" + +#: pg_combinebackup.c:1337 +#, c-format +msgid "tablespace at \"%s\" has no tablespace mapping" +msgstr "Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтранÑтва в \"%s\" не задано ÑопоÑтавление" + +#: pg_combinebackup.c:1355 +#, c-format +msgid "tablespaces with OIDs %u and %u both point at directory \"%s\"" +msgstr "" +"два табличных проÑтранÑтва Ñ OIDs %u и %u указывают на один каталог \"%s\"" + +#: pg_combinebackup.c:1364 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "не удалоÑÑŒ закрыть каталог \"%s\": %m" + +#: pg_combinebackup.c:1385 +#, c-format +msgid "file \"%s\" is too large" +msgstr "файл \"%s\" Ñлишком большой" + +#: pg_combinebackup.c:1402 +#, c-format +msgid "could not read file \"%s\": read %zd of %lld" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %zd из %lld)" + +#: reconstruct.c:339 +#, c-format +msgid "full backup contains unexpected incremental file \"%s\"" +msgstr "Ð¿Ð¾Ð»Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ñодержит неожиданный инкрементальный файл \"%s\"" + +#: reconstruct.c:423 +#, c-format +msgid "file \"%s\" is too short: expected %llu, found %llu" +msgstr "файл \"%s\" Ñлишком мал (ожидалоÑÑŒ байт: %llu, фактичеÑки: %llu)" + +#: reconstruct.c:465 +#, c-format +msgid "file \"%s\" has bad incremental magic number (0x%x, expected 0x%x)" +msgstr "" +"в файла \"%s\" неверное контрольное чиÑло инкрементальной копии (0x%x, " +"ожидалоÑÑŒ: 0x%x)" + +#: reconstruct.c:471 +#, c-format +msgid "file \"%s\" has block count %u in excess of segment size %u" +msgstr "в файле \"%s\" количеÑтво блоков %u превышает размер Ñегмента %u" + +#: reconstruct.c:478 +#, c-format +msgid "file \"%s\" has truncation block length %u in excess of segment size %u" +msgstr "" +"в файле \"%s\" длина отÑÐµÑ‡ÐµÐ½Ð¸Ñ Ð² блоках (%u) превышает размер Ñегмента %u" + +#: reconstruct.c:542 +#, c-format +msgid "could not read file \"%s\": read %d of %u" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %u)" + +#: reconstruct.c:786 +#, c-format +msgid "could not read from file \"%s\", offset %llu: read %d of %d" +msgstr "" +"не удалоÑÑŒ прочитать файл \"%s\" по Ñмещению %llu (прочитано байт: %d из %d)" diff --git a/src/bin/pg_combinebackup/po/sv.po b/src/bin/pg_combinebackup/po/sv.po new file mode 100644 index 0000000000000..06327f49fe97d --- /dev/null +++ b/src/bin/pg_combinebackup/po/sv.po @@ -0,0 +1,896 @@ +# Swedish message translation file for pg_combinebackup +# Copyright (C) 2024 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_combinebackup (PostgreSQL) package. +# Dennis Björklund , 2024, 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: PostgreSQL 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2025-02-12 13:52+0000\n" +"PO-Revision-Date: 2025-02-12 20:37+0100\n" +"Last-Translator: Dennis Björklund \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "fel: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "varning: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "tips: " + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "kunde inte öppna filen \"%s\" för läsning: %m" + +#: ../../common/controldata_utils.c:110 copy_file.c:150 load_manifest.c:161 +#: load_manifest.c:199 pg_combinebackup.c:1400 reconstruct.c:540 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "kunde inte läsa fil \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: backup_label.c:174 copy_file.c:68 pg_combinebackup.c:538 +#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:740 +#: write_manifest.c:187 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "kunde inte stänga fil \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "byte-ordning stämmer inte" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"möjligt fel i byteordning\n" +"Den byteordning som filen frÃ¥n pg_control lagrats med passar kanske\n" +"inte detta program. I sÃ¥ fall kan nedanstÃ¥ende resultat vara felaktiga\n" +"och PostgreSQL-installationen vara inkompatibel med databaskatalogen." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 backup_label.c:143 copy_file.c:66 +#: copy_file.c:139 copy_file.c:171 copy_file.c:175 copy_file.c:225 +#: copy_file.c:268 load_manifest.c:128 pg_combinebackup.c:523 +#: pg_combinebackup.c:1167 reconstruct.c:523 reconstruct.c:638 +#: write_manifest.c:250 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "kunde inte öppna fil \"%s\": %m" + +#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:759 +#: write_manifest.c:260 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "kunde inte skriva fil \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "kunde inte fsync:a fil \"%s\": %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:852 +#, c-format +msgid "out of memory" +msgstr "slut pÃ¥ minne" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "lyckades" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "destinationsbuffer för liten" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "OpenSSL-fel" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "slut pÃ¥ minne\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kan inte duplicera null-pekare (internt fel)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: backup_label.c:187 load_manifest.c:133 pg_combinebackup.c:676 +#: pg_combinebackup.c:1131 pg_combinebackup.c:1383 reconstruct.c:204 +#: reconstruct.c:421 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "detta bygge stöder inte synkmetod \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_combinebackup.c:933 pg_combinebackup.c:1256 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "kunde inte öppna katalog \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "kunde inte läsa katalog \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" + +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "Recursive-descent-parser kan inte använda inkrementell lexer." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "Inkrementell parser kräver en inkrementell lexer." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON nästlad för djupt, maximal tillÃ¥tet djup är 6400." + +#: ../../common/jsonapi.c:2127 +#, c-format +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "Escape-sekvens \"\\%.*s\" är ogiltig." + +#: ../../common/jsonapi.c:2131 +#, c-format +msgid "Character with value 0x%02x must be escaped." +msgstr "Tecken med värde 0x%02x mÃ¥ste escape:as." + +#: ../../common/jsonapi.c:2135 +#, c-format +msgid "Expected end of input, but found \"%.*s\"." +msgstr "Förväntade slut pÃ¥ indata, men hittade \"%.*s\"." + +#: ../../common/jsonapi.c:2138 +#, c-format +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "Färväntade array-element eller \"]\", men hittade \"%.*s\"." + +#: ../../common/jsonapi.c:2141 +#, c-format +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "Förväntade \",\" eller \"]\", men hittade \"%.*s\"." + +#: ../../common/jsonapi.c:2144 +#, c-format +msgid "Expected \":\", but found \"%.*s\"." +msgstr "Förväntade sig \":\" men hittade \"%.*s\"." + +#: ../../common/jsonapi.c:2147 +#, c-format +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "Förväntade JSON-värde, men hittade \"%.*s\"." + +#: ../../common/jsonapi.c:2150 +msgid "The input string ended unexpectedly." +msgstr "Indatasträngen avslutades oväntat." + +#: ../../common/jsonapi.c:2152 +#, c-format +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "Färväntade sträng eller \"}\", men hittade \"%.*s\"." + +#: ../../common/jsonapi.c:2155 +#, c-format +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "Förväntade sig \",\" eller \"}\" men hittade \"%.*s\"." + +#: ../../common/jsonapi.c:2158 +#, c-format +msgid "Expected string, but found \"%.*s\"." +msgstr "Förväntade sträng, men hittade \"%.*s\"." + +#: ../../common/jsonapi.c:2161 +#, c-format +msgid "Token \"%.*s\" is invalid." +msgstr "Token \"%.*s\" är ogiltig." + +#: ../../common/jsonapi.c:2164 +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 kan inte konverteras till text." + +#: ../../common/jsonapi.c:2166 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "\"\\u\" mÃ¥ste följas av fyra hexdecimala siffror." + +#: ../../common/jsonapi.c:2169 +msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." +msgstr "Escape-värden för unicode kan inte användas för kodpunkter med värde över 007F när kodningen inte är UTF8." + +#: ../../common/jsonapi.c:2178 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "Escape-värde för unicode kan inte översättas till serverns kodning %s." + +#: ../../common/jsonapi.c:2185 +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "Unicodes övre surrogathalva fÃ¥r inte komma efter en övre surrogathalva." + +#: ../../common/jsonapi.c:2187 +msgid "Unicode low surrogate must follow a high surrogate." +msgstr "Unicodes lägre surrogathalva mÃ¥ste följa en övre surrogathalva." + +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "kunde inte initiera kontrollsumma för backup-manifest" + +#: ../../common/parse_manifest.c:203 ../../common/parse_manifest.c:260 +msgid "manifest ended unexpectedly" +msgstr "manifestet avslutades oväntat" + +#: ../../common/parse_manifest.c:209 ../../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "kunde inte uppdatera kontrollsumma för backup-manifest" + +#: ../../common/parse_manifest.c:301 +msgid "unexpected object start" +msgstr "oväntad objektstart" + +#: ../../common/parse_manifest.c:336 +msgid "unexpected object end" +msgstr "oväntat objektslut" + +#: ../../common/parse_manifest.c:365 +msgid "unexpected array start" +msgstr "oväntad array-start" + +#: ../../common/parse_manifest.c:390 +msgid "unexpected array end" +msgstr "oväntat array-slut" + +#: ../../common/parse_manifest.c:417 +msgid "expected version indicator" +msgstr "förväntade en versionsindikator" + +#: ../../common/parse_manifest.c:453 +msgid "unrecognized top-level field" +msgstr "okänt toppnivÃ¥fält" + +#: ../../common/parse_manifest.c:472 +msgid "unexpected file field" +msgstr "oväntat filfält" + +#: ../../common/parse_manifest.c:486 +msgid "unexpected WAL range field" +msgstr "oväntat WAL-intervall-fält" + +#: ../../common/parse_manifest.c:492 +msgid "unexpected object field" +msgstr "oväntat objektfält" + +#: ../../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "oväntad skalar" + +#: ../../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "manifestversion är inte ett heltal" + +#: ../../common/parse_manifest.c:612 +msgid "unexpected manifest version" +msgstr "oväntad manifestversion" + +#: ../../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "manifestets systemidentifierare är inte ett heltal" + +#: ../../common/parse_manifest.c:661 +msgid "missing path name" +msgstr "saknas sökväg" + +#: ../../common/parse_manifest.c:664 +msgid "both path name and encoded path name" +msgstr "bÃ¥de sökväg och kodad sökväg" + +#: ../../common/parse_manifest.c:666 +msgid "missing size" +msgstr "saknar storlek" + +#: ../../common/parse_manifest.c:669 +msgid "checksum without algorithm" +msgstr "kontrollsumma utan algoritm" + +#: ../../common/parse_manifest.c:683 +msgid "could not decode file name" +msgstr "kunde inte avkoda filnamn" + +#: ../../common/parse_manifest.c:693 +msgid "file size is not an integer" +msgstr "filstorlek är inte ett haltal" + +#: ../../common/parse_manifest.c:699 pg_combinebackup.c:199 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "okänd algoritm för kontrollsumma: \"%s\"" + +#: ../../common/parse_manifest.c:718 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "ogiltig kontrollsumma för fil \"%s\": \"%s\"" + +#: ../../common/parse_manifest.c:761 +msgid "missing timeline" +msgstr "saknar tidslinje" + +#: ../../common/parse_manifest.c:763 +msgid "missing start LSN" +msgstr "saknar start-LSN" + +#: ../../common/parse_manifest.c:765 +msgid "missing end LSN" +msgstr "saknar slut-LSN" + +#: ../../common/parse_manifest.c:771 +msgid "timeline is not an integer" +msgstr "tidslinje är inte ett heltal" + +#: ../../common/parse_manifest.c:774 +msgid "could not parse start LSN" +msgstr "kunde inte parsa start-LSN" + +#: ../../common/parse_manifest.c:777 +msgid "could not parse end LSN" +msgstr "kunde inte parsa slut-LSN" + +#: ../../common/parse_manifest.c:842 +msgid "expected at least 2 lines" +msgstr "förväntade minst tvÃ¥ rader" + +#: ../../common/parse_manifest.c:845 +msgid "last line not newline-terminated" +msgstr "sista raden är inte nyradsterminerad" + +#: ../../common/parse_manifest.c:864 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "kunde inte göra klart kontrollsumma för backup-manifest" + +#: ../../common/parse_manifest.c:868 +#, c-format +msgid "manifest has no checksum" +msgstr "manifestet har ingen kontrollsumma" + +#: ../../common/parse_manifest.c:872 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "ogiltig kontrollsumma för manifest: \"%s\"" + +#: ../../common/parse_manifest.c:876 +#, c-format +msgid "manifest checksum mismatch" +msgstr "kontrollsumma för manifest matchar inte" + +#: ../../common/parse_manifest.c:891 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "kunde inte parsa backup-manifest: %s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s mÃ¥ste vara i intervallet %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "okänd synkmetod: %s" + +#: backup_label.c:66 backup_label.c:85 backup_label.c:95 +#, c-format +msgid "%s: could not parse %s" +msgstr "%s: kunde inte parsa %s" + +#: backup_label.c:69 backup_label.c:88 +#, c-format +msgid "%s: improper terminator for %s" +msgstr "%s: felaktig avslutare för %s" + +#: backup_label.c:76 +#, c-format +msgid "%s: could not parse TLI for %s" +msgstr "%s: kunde inte parsa TLI för %s" + +#: backup_label.c:79 backup_label.c:98 +#, c-format +msgid "%s: invalid TLI" +msgstr "%s: ogitlig TLI" + +#: backup_label.c:106 backup_label.c:108 +#, c-format +msgid "%s: could not find %s" +msgstr "%s: kunde inte hitta %s" + +#: backup_label.c:110 backup_label.c:113 +#, c-format +msgid "%s: %s requires %s" +msgstr "%s: %s kräver %s" + +#: backup_label.c:162 reconstruct.c:761 write_manifest.c:262 +#, c-format +msgid "could not write file \"%s\": wrote %d of %d" +msgstr "kunde inte skriva fil \"%s\": skrev %d av %d" + +#: backup_label.c:166 copy_file.c:146 copy_file.c:193 reconstruct.c:721 +#: reconstruct.c:767 write_manifest.c:270 +#, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "kunde inte uppdatera kontrollsumma för filen \"%s\"" + +#: copy_file.c:186 +#, c-format +msgid "could not write to file \"%s\": %m" +msgstr "kunde inte skriva till fil \"%s\": %m" + +#: copy_file.c:188 +#, c-format +msgid "could not write to file \"%s\", offset %u: wrote %d of %d" +msgstr "kunde inte skriva till fil \"%s\", offset %u: skrev %d av %d" + +#: copy_file.c:199 reconstruct.c:784 +#, c-format +msgid "could not read from file \"%s\": %m" +msgstr "kunde inte läsa frÃ¥n fil \"%s\": %m" + +#: copy_file.c:218 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %m" +msgstr "fel vid kloning av fil \"%s\" till \"%s\": %m" + +#: copy_file.c:229 copy_file.c:272 +#, c-format +msgid "could not create file \"%s\": %m" +msgstr "kunde inte skapa fil \"%s\": %m" + +#: copy_file.c:237 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %s" +msgstr "fel vid kloning av fil \"%s\" till \"%s\": %s" + +#: copy_file.c:245 pg_combinebackup.c:251 +#, c-format +msgid "file cloning not supported on this platform" +msgstr "filkloning stöds inte pÃ¥ denna plattform" + +#: copy_file.c:278 reconstruct.c:704 +#, c-format +msgid "error while copying file range from \"%s\" to \"%s\": %m" +msgstr "fel vid kopiering av filintervall frÃ¥n \"%s\" till \"%s\": %m" + +#: copy_file.c:285 pg_combinebackup.c:264 reconstruct.c:724 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "copy_file_range stöds inte pÃ¥ denna plattform" + +#: copy_file.c:300 +#, c-format +msgid "could not copy file \"%s\" to \"%s\": %m" +msgstr "kunde inte kopiera fil \"%s\" till \"%s\": %m" + +#: load_manifest.c:125 +#, c-format +msgid "file \"%s\" does not exist" +msgstr "filen \"%s\" finns inte" + +#: load_manifest.c:163 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "kunde inte läsa fil \"%s\": läste %d av %lld" + +#: load_manifest.c:201 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "kunde inte läsa fil \"%s\": läste %lld av %lld" + +#: load_manifest.c:248 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "version 1 av backup-manifest stöder inte inkrementell backup" + +#: load_manifest.c:280 +#, c-format +msgid "duplicate path name in backup manifest: \"%s\"" +msgstr "duplicerad sökväg i backup-manifest: \"%s\"" + +#: pg_combinebackup.c:220 pg_combinebackup.c:228 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." + +#: pg_combinebackup.c:227 +#, c-format +msgid "no input directories specified" +msgstr "inga indatakataloger har angivits" + +#: pg_combinebackup.c:233 +#, c-format +msgid "no output directory specified" +msgstr "ingen utdatakatalog angiven" + +#: pg_combinebackup.c:301 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: manifestets systemidentifierare är %llu men kontrollfilern har %llu" + +#: pg_combinebackup.c:340 +#, c-format +msgid "cannot generate a manifest because no manifest is available for the final input backup" +msgstr "kan inte skapa manifest dÃ¥ inget manifest är tillgängligt för den avslutande indatabackup:en" + +#: pg_combinebackup.c:387 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "kunde inte skapa symbolisk länk frÃ¥n \"%s\" till \"%s\": %m" + +#: pg_combinebackup.c:399 pg_combinebackup.c:730 pg_combinebackup.c:927 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "kunde inte skapa katalog \"%s\": %m" + +#: pg_combinebackup.c:454 +#, c-format +msgid "directory name too long" +msgstr "katalognamn för lÃ¥ngt" + +#: pg_combinebackup.c:461 +#, c-format +msgid "multiple \"=\" signs in tablespace mapping" +msgstr "multipla \"=\"-tecken i tablespace-mappning" + +#: pg_combinebackup.c:469 +#, c-format +msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" +msgstr "ogiltigt tablespace-mappningsformat \"%s\", mÃ¥ste vara \"OLDDIR=NEWDIR\"" + +#: pg_combinebackup.c:480 pg_combinebackup.c:484 +#, c-format +msgid "old directory is not an absolute path in tablespace mapping: %s" +msgstr "gammal katalog är inte en absolut sökväg i tablespace-mappning: %s" + +#: pg_combinebackup.c:553 +#, c-format +msgid "backup at \"%s\" is a full backup, but only the first backup should be a full backup" +msgstr "backup:en vid \"%s\" är en full backup men det är bara den första backup:en som skall vara en full backup" + +#: pg_combinebackup.c:556 +#, c-format +msgid "backup at \"%s\" is an incremental backup, but the first backup should be a full backup" +msgstr "backup:en vid \"%s\" är en inkrementell backup men den första backupen skall vara en full backup" + +#: pg_combinebackup.c:559 +#, c-format +msgid "backup at \"%s\" starts on timeline %u, but expected %u" +msgstr "backup:en vid \"%s\" startar pÃ¥ tidslinjen %u men det förväntades vara %u" + +#: pg_combinebackup.c:562 +#, c-format +msgid "backup at \"%s\" starts at LSN %X/%X, but expected %X/%X" +msgstr "backup:eb vid \"%s\" startar vid LSN %X/%X men förväntades vare %X/%X" + +#: pg_combinebackup.c:614 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: CRC är inkorrekt" + +#: pg_combinebackup.c:618 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: oväntad version pÃ¥ kontrollfil" + +#: pg_combinebackup.c:625 +#, c-format +msgid "%s: expected system identifier %llu, but found %llu" +msgstr "%s: förväntade systemidentifierare %llu men hittade %llu" + +#: pg_combinebackup.c:657 +#, c-format +msgid "only some backups have checksums enabled" +msgstr "bara nÃ¥gra backup:er har checksummor aktiverade" + +#: pg_combinebackup.c:658 +#, c-format +msgid "Disable, and optionally reenable, checksums on the output directory to avoid failures." +msgstr "Avaktivera och möjligen Ã¥teraktivera checksummor pÃ¥ utdatakatalogen för att undvika fel" + +#: pg_combinebackup.c:693 +#, c-format +msgid "removing output directory \"%s\"" +msgstr "tar bort katalog för utdata \"%s\"" + +#: pg_combinebackup.c:695 +#, c-format +msgid "failed to remove output directory" +msgstr "misslyckades att ta bort katalog för utdata" + +#: pg_combinebackup.c:699 +#, c-format +msgid "removing contents of output directory \"%s\"" +msgstr "tar bort innehÃ¥ll i katalog för utdata \"%s\"" + +#: pg_combinebackup.c:702 +#, c-format +msgid "failed to remove contents of output directory" +msgstr "misslyckades att ta bort innehÃ¥ll i katalog för utdata" + +#: pg_combinebackup.c:742 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "katalogen \"%s\" existerar men är inte tom" + +#: pg_combinebackup.c:745 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "kunde inte komma Ã¥t katalog \"%s\": %m" + +#: pg_combinebackup.c:759 +#, c-format +msgid "" +"%s reconstructs full backups from incrementals.\n" +"\n" +msgstr "" +"%s Ã¥terskapar fulla backup:er frÃ¥n inkrementella.\n" +"\n" + +#: pg_combinebackup.c:760 +#, c-format +msgid "Usage:\n" +msgstr "Användning:\n" + +#: pg_combinebackup.c:761 +#, c-format +msgid " %s [OPTION]... DIRECTORY...\n" +msgstr " %s [FLAGGA]... KATALOG...\n" + +#: pg_combinebackup.c:762 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Flaggor:\n" + +#: pg_combinebackup.c:763 +#, c-format +msgid " -d, --debug generate lots of debugging output\n" +msgstr " -d, --debug generera massor med debug-utskrifter\n" + +#: pg_combinebackup.c:764 +#, c-format +msgid " -n, --dry-run do not actually do anything\n" +msgstr " -n, --dry-run gör inga operationer\n" + +#: pg_combinebackup.c:765 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr " -N, --no-sync vänta inte pÃ¥ att ändingar säkert skrivits till disk\n" + +#: pg_combinebackup.c:766 +#, c-format +msgid " -o, --output=DIRECTORY output directory\n" +msgstr " -o, --output=KATALOG katalog för utdata\n" + +#: pg_combinebackup.c:767 +#, c-format +msgid "" +" -T, --tablespace-mapping=OLDDIR=NEWDIR\n" +" relocate tablespace in OLDDIR to NEWDIR\n" +msgstr "" +" -T, --tablespace-mapping=FRÃ…NKAT=NYKAT\n" +" flytta tabellutrymme i FRÃ…NKAT till NYKAT\n" + +#: pg_combinebackup.c:769 +#, c-format +msgid " --clone clone (reflink) files instead of copying\n" +msgstr " --clone klona (reflink) filer istället för att kopiera\n" + +#: pg_combinebackup.c:770 +#, c-format +msgid " --copy copy files (default)\n" +msgstr " --copy kopiera filer (standard)\n" + +#: pg_combinebackup.c:771 +#, c-format +msgid " --copy-file-range copy using copy_file_range() system call\n" +msgstr " --copy-file-range kopiera med systemaropet copy_file_range()\n" + +#: pg_combinebackup.c:772 +#, c-format +msgid "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" use algorithm for manifest checksums\n" +msgstr "" +" --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" algoritm att anvvända för checksummor i manifest\n" + +#: pg_combinebackup.c:774 +#, c-format +msgid " --no-manifest suppress generation of backup manifest\n" +msgstr " --no-manifest skapa inget backup-manifest\n" + +#: pg_combinebackup.c:775 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METOD sätt synkmetod för att synka filer till disk\n" + +#: pg_combinebackup.c:776 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version visa versionsinformation, avsluta sedan\n" + +#: pg_combinebackup.c:777 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help visa denna hjälp, avsluta sedan\n" + +#: pg_combinebackup.c:779 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Rapportera fel till <%s>.\n" + +#: pg_combinebackup.c:780 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "hemsida för %s: <%s>\n" + +#: pg_combinebackup.c:995 +#, c-format +msgid "skipping symbolic link \"%s\"" +msgstr "hoppar över symbolisk länk \"%s\"" + +#: pg_combinebackup.c:997 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "hoppar över specialfil \"%s\"" + +#: pg_combinebackup.c:1073 reconstruct.c:305 +#, c-format +msgid "manifest file \"%s\" contains no entry for file \"%s\"" +msgstr "manifestfil \"%s\" innehÃ¥ller ingen post för fil \"%s\"" + +#: pg_combinebackup.c:1189 +#, c-format +msgid "%s: server version too old" +msgstr "%s: serverns version är för gammal" + +#: pg_combinebackup.c:1190 +#, c-format +msgid "%s: could not parse version number" +msgstr "%s: kunde inte parsa versionnummer" + +#: pg_combinebackup.c:1309 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "kan inte läsa symbolisk länk \"%s\": %m" + +#: pg_combinebackup.c:1312 +#, c-format +msgid "target of symbolic link \"%s\" is too long" +msgstr "destinationen för symbolisk länk \"%s\" är för lÃ¥ng" + +#: pg_combinebackup.c:1315 +#, c-format +msgid "target of symbolic link \"%s\" is relative" +msgstr "destination för symbolisk länk \"%s\" är relativ" + +#: pg_combinebackup.c:1337 +#, c-format +msgid "tablespace at \"%s\" has no tablespace mapping" +msgstr "tabellutrymme vid \"%s\" har ingen mapping" + +#: pg_combinebackup.c:1355 +#, c-format +msgid "tablespaces with OIDs %u and %u both point at directory \"%s\"" +msgstr "tabellutrymme med OID:er %u och %u pekar pÃ¥ samma katalog \"%s\"" + +#: pg_combinebackup.c:1364 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "kunde inte stänga katalog \"%s\": %m" + +#: pg_combinebackup.c:1385 +#, c-format +msgid "file \"%s\" is too large" +msgstr "filen \"%s\" är för stor" + +#: pg_combinebackup.c:1402 +#, c-format +msgid "could not read file \"%s\": read %zd of %lld" +msgstr "kunde inte läsa fil \"%s\": läste %zd av %lld" + +#: reconstruct.c:339 +#, c-format +msgid "full backup contains unexpected incremental file \"%s\"" +msgstr "full backup innehÃ¥ller in oväntad inkrementell fil \"%s\"" + +#: reconstruct.c:423 +#, c-format +msgid "file \"%s\" is too short: expected %llu, found %llu" +msgstr "filen \"%s\" är för kort: förväntade %llu, hittade %llu" + +#: reconstruct.c:465 +#, c-format +msgid "file \"%s\" has bad incremental magic number (0x%x, expected 0x%x)" +msgstr "filen \"%s\" har ett felaktigt inkrementellt magiskt nummer (0x%x, förväntade 0x%x)" + +#: reconstruct.c:471 +#, c-format +msgid "file \"%s\" has block count %u in excess of segment size %u" +msgstr "filen \"%s\" har ett blockantal %u som är större än segmentstorleken %u" + +#: reconstruct.c:478 +#, c-format +msgid "file \"%s\" has truncation block length %u in excess of segment size %u" +msgstr "filen \"%s\" trunkeringsblocklängd %u som är större än segmentstorleken %u" + +#: reconstruct.c:542 +#, c-format +msgid "could not read file \"%s\": read %d of %u" +msgstr "kunde inte läsa filen \"%s\": läste %d av %u" + +#: reconstruct.c:786 +#, c-format +msgid "could not read from file \"%s\", offset %llu: read %d of %d" +msgstr "kunde inte läsa frÃ¥n filen \"%s\", offset %llu: läste %d av %d" diff --git a/src/bin/pg_combinebackup/po/uk.po b/src/bin/pg_combinebackup/po/uk.po new file mode 100644 index 0000000000000..26fa809ce2867 --- /dev/null +++ b/src/bin/pg_combinebackup/po/uk.po @@ -0,0 +1,881 @@ +msgid "" +msgstr "" +"Project-Id-Version: postgresql\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2025-03-29 10:40+0000\n" +"PO-Revision-Date: 2025-04-01 15:40\n" +"Last-Translator: \n" +"Language-Team: Ukrainian\n" +"Language: uk_UA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: postgresql\n" +"X-Crowdin-Project-ID: 324573\n" +"X-Crowdin-Language: uk\n" +"X-Crowdin-File: /REL_17_STABLE/pg_combinebackup.pot\n" +"X-Crowdin-File-ID: 1008\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "помилка: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "попередженнÑ: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "деталі: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "підказка: " + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m" + +#: ../../common/controldata_utils.c:110 copy_file.c:150 load_manifest.c:161 +#: load_manifest.c:199 pg_combinebackup.c:1400 reconstruct.c:540 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: backup_label.c:174 copy_file.c:68 pg_combinebackup.c:538 +#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:740 +#: write_manifest.c:187 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "неможливо закрити файл \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неправильний порÑдок байтів" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "можлива помилка у поÑлідовноÑті байтів.\n" +"ПорÑдок байтів, що викориÑтовують Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ pg_control, може не відповідати тому, Ñкий викориÑтовуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ програмою. У такому випадку результати нижче будуть неправильним, Ñ– інÑталÑÑ†Ñ–Ñ PostgreSQL буде неÑуміÑною з цим каталогом даних." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 backup_label.c:143 copy_file.c:66 +#: copy_file.c:139 copy_file.c:171 copy_file.c:175 copy_file.c:225 +#: copy_file.c:268 load_manifest.c:128 pg_combinebackup.c:523 +#: pg_combinebackup.c:1167 reconstruct.c:523 reconstruct.c:638 +#: write_manifest.c:250 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не можливо відкрити файл \"%s\": %m" + +#: ../../common/controldata_utils.c:249 backup_label.c:160 reconstruct.c:759 +#: write_manifest.c:260 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не вдалоÑÑ fsync файл \"%s\": %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:852 +#, c-format +msgid "out of memory" +msgstr "недоÑтатньо пам'Ñті" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "уÑпіх" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "буфер Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ малий" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "Помилка OpenSSL" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "недоÑтатньо пам'Ñті\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не вдалоÑÑ Ñинхронізувати файлову ÑиÑтему Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: backup_label.c:187 load_manifest.c:133 pg_combinebackup.c:676 +#: pg_combinebackup.c:1131 pg_combinebackup.c:1383 reconstruct.c:204 +#: reconstruct.c:421 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує метод Ñинхронізації \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_combinebackup.c:933 pg_combinebackup.c:1256 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" + +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "РекурÑивний ÑпуÑк не може викориÑтовувати інкрементний лекÑичний аналізатор." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "Інкрементний аналізатор потребує Інкрементний лекÑичний аналізатор." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON вкладений занадто глибокий, макÑимально дозволена глибина - 6400." + +#: ../../common/jsonapi.c:2127 +#, c-format +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "ÐеприпуÑтима Ñпеціальна поÑлідовніÑть \"\\%.*s\"." + +#: ../../common/jsonapi.c:2131 +#, c-format +msgid "Character with value 0x%02x must be escaped." +msgstr "Символ зі значеннÑм 0x%02x повинен бути пропущений." + +#: ../../common/jsonapi.c:2135 +#, c-format +msgid "Expected end of input, but found \"%.*s\"." +msgstr "ОчікувавÑÑ ÐºÑ–Ð½ÐµÑ†ÑŒ введеннÑ, але знайдено \"%.*s\"." + +#: ../../common/jsonapi.c:2138 +#, c-format +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "ОчікувавÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚ маÑиву або \"]\", але знайдено \"%.*s\"." + +#: ../../common/jsonapi.c:2141 +#, c-format +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "ОчікувалоÑÑŒ \",\" або \"]\", але знайдено \"%.*s\"." + +#: ../../common/jsonapi.c:2144 +#, c-format +msgid "Expected \":\", but found \"%.*s\"." +msgstr "ОчікувалоÑÑŒ \":\", але знайдено \"%.*s\"." + +#: ../../common/jsonapi.c:2147 +#, c-format +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "ОчікувалоÑÑŒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ JSON, але знайдено \"%.*s\"." + +#: ../../common/jsonapi.c:2150 +msgid "The input string ended unexpectedly." +msgstr "ÐеÑподіваний кінець вхідного Ñ€Ñдка." + +#: ../../common/jsonapi.c:2152 +#, c-format +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "ОчікувавÑÑ Ñ€Ñдок або \"}\", але знайдено \"%.*s\"." + +#: ../../common/jsonapi.c:2155 +#, c-format +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "ОчікувалоÑÑŒ \",\" або \"}\", але знайдено \"%.*s\"." + +#: ../../common/jsonapi.c:2158 +#, c-format +msgid "Expected string, but found \"%.*s\"." +msgstr "ОчікувавÑÑ Ñ€Ñдок, але знайдено \"%.*s\"." + +#: ../../common/jsonapi.c:2161 +#, c-format +msgid "Token \"%.*s\" is invalid." +msgstr "ÐеприпуÑтимий маркер \"%.*s\"." + +#: ../../common/jsonapi.c:2164 +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 не можна перетворити в текÑÑ‚." + +#: ../../common/jsonapi.c:2166 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "За \"\\u\" повинні прÑмувати чотири шіÑтнадцÑткових чиÑла." + +#: ../../common/jsonapi.c:2169 +msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." +msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ñ…Ð¾Ð´Ñƒ Unicode не можна викориÑтовувати Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ кодових точок більше 007F, Ñкщо ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ UTF8." + +#: ../../common/jsonapi.c:2178 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñимволу Unicode не вдалоÑÑ Ð¿ÐµÑ€ÐµÐºÐ»Ð°Ñти в ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера %s." + +#: ../../common/jsonapi.c:2185 +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "Старший Ñурогат Unicode не повинен прÑмувати за іншим Ñтаршим Ñурогатом." + +#: ../../common/jsonapi.c:2187 +msgid "Unicode low surrogate must follow a high surrogate." +msgstr "Молодший Ñурогат Unicode не повинен прÑмувати за іншим молодшим Ñурогатом." + +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ контрольну Ñуму маніфеÑту" + +#: ../../common/parse_manifest.c:203 ../../common/parse_manifest.c:260 +msgid "manifest ended unexpectedly" +msgstr "маніфеÑÑ‚ закінчивÑÑ Ð½ÐµÑподівано" + +#: ../../common/parse_manifest.c:209 ../../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ контрольну Ñуму маніфеÑту" + +#: ../../common/parse_manifest.c:301 +msgid "unexpected object start" +msgstr "неочікуваний початок об'єкта" + +#: ../../common/parse_manifest.c:336 +msgid "unexpected object end" +msgstr "неочікуваний кінець об'єкта" + +#: ../../common/parse_manifest.c:365 +msgid "unexpected array start" +msgstr "неочікуваний початок маÑиву" + +#: ../../common/parse_manifest.c:390 +msgid "unexpected array end" +msgstr "неочікуваний кінець маÑиву" + +#: ../../common/parse_manifest.c:417 +msgid "expected version indicator" +msgstr "індикатор очікуваної верÑÑ–Ñ—" + +#: ../../common/parse_manifest.c:453 +msgid "unrecognized top-level field" +msgstr "нерозпізнане поле верхнього рівнÑ" + +#: ../../common/parse_manifest.c:472 +msgid "unexpected file field" +msgstr "неочікуване поле файлу" + +#: ../../common/parse_manifest.c:486 +msgid "unexpected WAL range field" +msgstr "неочікуване поле діапазону WAL" + +#: ../../common/parse_manifest.c:492 +msgid "unexpected object field" +msgstr "неочікуване поле об'єкта" + +#: ../../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "неочікуваний ÑкалÑÑ€" + +#: ../../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "верÑÑ–Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту не ціле чиÑло" + +#: ../../common/parse_manifest.c:612 +msgid "unexpected manifest version" +msgstr "неочікувана верÑÑ–Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту" + +#: ../../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "ÑиÑтемний ідентифікатор в маніфеÑті не ціле чиÑло" + +#: ../../common/parse_manifest.c:661 +msgid "missing path name" +msgstr "пропущено шлÑÑ…" + +#: ../../common/parse_manifest.c:664 +msgid "both path name and encoded path name" +msgstr "Ñ– ім'Ñ ÑˆÐ»Ñху, Ñ– закодований шлÑÑ…" + +#: ../../common/parse_manifest.c:666 +msgid "missing size" +msgstr "відÑутній розмір" + +#: ../../common/parse_manifest.c:669 +msgid "checksum without algorithm" +msgstr "контрольна Ñума без алгоритму" + +#: ../../common/parse_manifest.c:683 +msgid "could not decode file name" +msgstr "не вдалоÑÑ Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ñ‚Ð¸ ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ" + +#: ../../common/parse_manifest.c:693 +msgid "file size is not an integer" +msgstr "розмір файлу не Ñ” цілим чиÑлом" + +#: ../../common/parse_manifest.c:699 pg_combinebackup.c:199 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "нерозпізнаний алгоритм контрольної Ñуми: \"%s\"" + +#: ../../common/parse_manifest.c:718 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "неприпуÑтима контрольна Ñума Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": \"%s\"" + +#: ../../common/parse_manifest.c:761 +msgid "missing timeline" +msgstr "відÑÑƒÑ‚Ð½Ñ Ñ‡Ð°Ñова шкала" + +#: ../../common/parse_manifest.c:763 +msgid "missing start LSN" +msgstr "відÑутній LSN початку" + +#: ../../common/parse_manifest.c:765 +msgid "missing end LSN" +msgstr "відÑутній LSN кінцÑ" + +#: ../../common/parse_manifest.c:771 +msgid "timeline is not an integer" +msgstr "чаÑова Ð»Ñ–Ð½Ñ–Ñ Ð½Ðµ Ñ” цілим чиÑлом" + +#: ../../common/parse_manifest.c:774 +msgid "could not parse start LSN" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ початковий LSN" + +#: ../../common/parse_manifest.c:777 +msgid "could not parse end LSN" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ кінцевий LSN" + +#: ../../common/parse_manifest.c:842 +msgid "expected at least 2 lines" +msgstr "очікувалоÑÑ Ð¿Ñ€Ð¸Ð½Ð°Ð¹Ð¼Ð½Ñ– 2 Ñ€Ñдки" + +#: ../../common/parse_manifest.c:845 +msgid "last line not newline-terminated" +msgstr "оÑтанній Ñ€Ñдок не завершений новим Ñ€Ñдком" + +#: ../../common/parse_manifest.c:864 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "не вдалоÑÑ Ð¾Ñтаточно завершити контрольну Ñуму маніфеÑту" + +#: ../../common/parse_manifest.c:868 +#, c-format +msgid "manifest has no checksum" +msgstr "у маніфеÑті немає контрольної Ñуми" + +#: ../../common/parse_manifest.c:872 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "неприпуÑтима контрольна Ñума маніфеÑту: \"%s\"" + +#: ../../common/parse_manifest.c:876 +#, c-format +msgid "manifest checksum mismatch" +msgstr "невідповідніÑть контрольної Ñуми маніфеÑту" + +#: ../../common/parse_manifest.c:891 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ маніфеÑÑ‚ резервної копії: %s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s має бути в діапазоні %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нерозпізнаний метод Ñинхронізації: %s" + +#: backup_label.c:66 backup_label.c:85 backup_label.c:95 +#, c-format +msgid "%s: could not parse %s" +msgstr "%s: не вдалоÑÑ Ñ€Ð¾Ð·Ñ–Ð±Ñ€Ð°Ñ‚Ð¸ %s" + +#: backup_label.c:69 backup_label.c:88 +#, c-format +msgid "%s: improper terminator for %s" +msgstr "%s: неправильний термінатор Ð´Ð»Ñ %s" + +#: backup_label.c:76 +#, c-format +msgid "%s: could not parse TLI for %s" +msgstr "%s: не вдалоÑÑ Ñ€Ð¾Ð·Ñ–Ð±Ñ€Ð°Ñ‚Ð¸ TLI Ð´Ð»Ñ %s" + +#: backup_label.c:79 backup_label.c:98 +#, c-format +msgid "%s: invalid TLI" +msgstr "%s: невірний TLI" + +#: backup_label.c:106 backup_label.c:108 +#, c-format +msgid "%s: could not find %s" +msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ %s" + +#: backup_label.c:110 backup_label.c:113 +#, c-format +msgid "%s: %s requires %s" +msgstr "%s: %s вимагає %s" + +#: backup_label.c:162 reconstruct.c:761 write_manifest.c:262 +#, c-format +msgid "could not write file \"%s\": wrote %d of %d" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": запиÑано %d з %d" + +#: backup_label.c:166 copy_file.c:146 copy_file.c:193 reconstruct.c:721 +#: reconstruct.c:767 write_manifest.c:270 +#, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ контрольну Ñуму файлу \"%s\"" + +#: copy_file.c:186 +#, c-format +msgid "could not write to file \"%s\": %m" +msgstr "неможливо запиÑати до файлу \"%s\": %m" + +#: copy_file.c:188 +#, c-format +msgid "could not write to file \"%s\", offset %u: wrote %d of %d" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файлу \"%s\", зÑув %u: запиÑано %d з %d" + +#: copy_file.c:199 reconstruct.c:784 +#, c-format +msgid "could not read from file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу \"%s\": %m" + +#: copy_file.c:218 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %m" +msgstr "помилка при клонуванні файлу \"%s\" в \"%s\": %m" + +#: copy_file.c:229 copy_file.c:272 +#, c-format +msgid "could not create file \"%s\": %m" +msgstr "неможливо Ñтворити файл \"%s\": %m" + +#: copy_file.c:237 +#, c-format +msgid "error while cloning file \"%s\" to \"%s\": %s" +msgstr "помилка при клонуванні файлу \"%s\" в \"%s\": %s" + +#: copy_file.c:245 pg_combinebackup.c:251 +#, c-format +msgid "file cloning not supported on this platform" +msgstr "ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² не підтримуєтьÑÑ Ð½Ð° цій платформі" + +#: copy_file.c:278 reconstruct.c:704 +#, c-format +msgid "error while copying file range from \"%s\" to \"%s\": %m" +msgstr "помилка при копіюванні діапазону файлу від \"%s\" до \"%s\": %m" + +#: copy_file.c:285 pg_combinebackup.c:264 reconstruct.c:724 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "copy_file_range не підтримуєтьÑÑ Ð½Ð° цій платформі" + +#: copy_file.c:300 +#, c-format +msgid "could not copy file \"%s\" to \"%s\": %m" +msgstr "не вдалоÑÑ Ñкопіювати файл \"%s\" в \"%s\": %m" + +#: load_manifest.c:125 +#, c-format +msgid "file \"%s\" does not exist" +msgstr "файл \"%s\" не Ñ–Ñнує" + +#: load_manifest.c:163 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %lld" + +#: load_manifest.c:201 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %lld з %lld" + +#: load_manifest.c:248 +#, c-format +msgid "backup manifest version 1 does not support incremental backup" +msgstr "маніфеÑÑ‚ резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñ— 1 не підтримує інкреметного резервного копіюваннÑ" + +#: load_manifest.c:280 +#, c-format +msgid "duplicate path name in backup manifest: \"%s\"" +msgstr "дубльований шлÑÑ… у маніфеÑті резервного копіюваннÑ: \"%s\"" + +#: pg_combinebackup.c:220 pg_combinebackup.c:228 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." + +#: pg_combinebackup.c:227 +#, c-format +msgid "no input directories specified" +msgstr "вхідні каталоги не вказано" + +#: pg_combinebackup.c:233 +#, c-format +msgid "no output directory specified" +msgstr "вихідний каталог не вказано" + +#: pg_combinebackup.c:301 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: маніфеÑтовий ідентифікатор ÑиÑтеми - %llu, але контрольний файл має %llu" + +#: pg_combinebackup.c:340 +#, c-format +msgid "cannot generate a manifest because no manifest is available for the final input backup" +msgstr "не вдаєтьÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ маніфеÑÑ‚, оÑкільки Ð´Ð»Ñ Ð¾Ñтаточної резервної копії вхідних даних немає маніфеÑту" + +#: pg_combinebackup.c:387 +#, c-format +msgid "could not create symbolic link from \"%s\" to \"%s\": %m" +msgstr "не вдалоÑÑ Ñтворити Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ Ð· \"%s\" на \"%s\": %m" + +#: pg_combinebackup.c:399 pg_combinebackup.c:730 pg_combinebackup.c:927 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "не вдалоÑÑ Ñтворити каталог \"%s\": %m" + +#: pg_combinebackup.c:454 +#, c-format +msgid "directory name too long" +msgstr "ім'Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ— задовге" + +#: pg_combinebackup.c:461 +#, c-format +msgid "multiple \"=\" signs in tablespace mapping" +msgstr "кілька знаків \"=\" зіÑтавленні табличних проÑторів" + +#: pg_combinebackup.c:469 +#, c-format +msgid "invalid tablespace mapping format \"%s\", must be \"OLDDIR=NEWDIR\"" +msgstr "неприпуÑтимий табличний проÑтір зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñƒ \"%s\", має бути \"OLDDIR = NEWDIR\"" + +#: pg_combinebackup.c:480 pg_combinebackup.c:484 +#, c-format +msgid "old directory is not an absolute path in tablespace mapping: %s" +msgstr "Ñтарий каталог не Ñ” абÑолютним шлÑхом у зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору: %s" + +#: pg_combinebackup.c:553 +#, c-format +msgid "backup at \"%s\" is a full backup, but only the first backup should be a full backup" +msgstr "резервна ÐºÐ¾Ð¿Ñ–Ñ Ð·Ð° адреÑою \"%s\" Ñ” повною резервною копією, але тільки перша резервна ÐºÐ¾Ð¿Ñ–Ñ Ð¼Ð°Ñ” бути повною резервною копією" + +#: pg_combinebackup.c:556 +#, c-format +msgid "backup at \"%s\" is an incremental backup, but the first backup should be a full backup" +msgstr "резервна ÐºÐ¾Ð¿Ñ–Ñ Ð·Ð° адреÑою \"%s\" Ñ” інкрементною резервною копією, але перша резервна ÐºÐ¾Ð¿Ñ–Ñ Ð¼Ð°Ñ” бути повною" + +#: pg_combinebackup.c:559 +#, c-format +msgid "backup at \"%s\" starts on timeline %u, but expected %u" +msgstr "резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð° \"%s\" починаєтьÑÑ Ð½Ð° лінії чаÑу %u, але очікуєтьÑÑ %u" + +#: pg_combinebackup.c:562 +#, c-format +msgid "backup at \"%s\" starts at LSN %X/%X, but expected %X/%X" +msgstr "резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð½Ð° \"%s\" починаєтьÑÑ Ð· LSN %X/%X, але очікуєтьÑÑ %X/%X" + +#: pg_combinebackup.c:614 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: CRC невірний" + +#: pg_combinebackup.c:618 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: неочікувана верÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð³Ð¾ файлу" + +#: pg_combinebackup.c:625 +#, c-format +msgid "%s: expected system identifier %llu, but found %llu" +msgstr "%s: очікуваний ідентифікатор ÑиÑтеми %llu, але знайдено %llu" + +#: pg_combinebackup.c:657 +#, c-format +msgid "only some backups have checksums enabled" +msgstr "лише деÑкі резервні копії мають включені контрольні Ñуми" + +#: pg_combinebackup.c:658 +#, c-format +msgid "Disable, and optionally reenable, checksums on the output directory to avoid failures." +msgstr "Вимкніть, та за бажаннÑм увімкніть, контрольні Ñуми Ð´Ð»Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¾Ð³Ð¾ каталога, щоб уникнути помилок." + +#: pg_combinebackup.c:693 +#, c-format +msgid "removing output directory \"%s\"" +msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¾Ð³Ð¾ каталогу \"%s\"" + +#: pg_combinebackup.c:695 +#, c-format +msgid "failed to remove output directory" +msgstr "не вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ вихідний каталог" + +#: pg_combinebackup.c:699 +#, c-format +msgid "removing contents of output directory \"%s\"" +msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð²Ð¼Ñ–Ñту вихідного каталогу \"%s\"" + +#: pg_combinebackup.c:702 +#, c-format +msgid "failed to remove contents of output directory" +msgstr "не вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ вміÑÑ‚ з вихідного каталогу" + +#: pg_combinebackup.c:742 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "каталог \"%s\" Ñ–Ñнує, але він не порожній" + +#: pg_combinebackup.c:745 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "немає доÑтупу до каталогу \"%s\": %m" + +#: pg_combinebackup.c:759 +#, c-format +msgid "%s reconstructs full backups from incrementals.\n\n" +msgstr "%s відновлює повні резервні копії з інкрементів.\n\n" + +#: pg_combinebackup.c:760 +#, c-format +msgid "Usage:\n" +msgstr "ВикориÑтаннÑ:\n" + +#: pg_combinebackup.c:761 +#, c-format +msgid " %s [OPTION]... DIRECTORY...\n" +msgstr " %s [ПÐРÐМЕТР]... КÐТÐЛОГ...\n" + +#: pg_combinebackup.c:762 +#, c-format +msgid "\n" +"Options:\n" +msgstr "\n" +"Параметри:\n" + +#: pg_combinebackup.c:763 +#, c-format +msgid " -d, --debug generate lots of debugging output\n" +msgstr " -d, --debug генерувати багато налагоджувальних повідомлень\n" + +#: pg_combinebackup.c:764 +#, c-format +msgid " -n, --dry-run do not actually do anything\n" +msgstr " -n, --dry-run наÑправді ніÑкої дії\n" + +#: pg_combinebackup.c:765 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr " -N, --no-sync не чекати на безпечний Ð·Ð°Ð¿Ð¸Ñ Ð·Ð¼Ñ–Ð½ на диÑк\n" + +#: pg_combinebackup.c:766 +#, c-format +msgid " -o, --output=DIRECTORY output directory\n" +msgstr " -o, --output=DIRECTORY вихідний каталог\n" + +#: pg_combinebackup.c:767 +#, c-format +msgid " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" +" relocate tablespace in OLDDIR to NEWDIR\n" +msgstr " -T, --tablespace-mapping=OLDDIR=NEWDIR\n" +" переміÑтити табличний проÑтір з OLDDIR в NEWDIR\n" + +#: pg_combinebackup.c:769 +#, c-format +msgid " --clone clone (reflink) files instead of copying\n" +msgstr " --clone клонувати (reflink) файли заміÑть копіюваннÑ\n" + +#: pg_combinebackup.c:770 +#, c-format +msgid " --copy copy files (default)\n" +msgstr " --copy копіювати файли (за замовчуваннÑм)\n" + +#: pg_combinebackup.c:771 +#, c-format +msgid " --copy-file-range copy using copy_file_range() system call\n" +msgstr " --copy-file-range копіювати за допомогою ÑиÑтемного виклику copy_file_range()\n" + +#: pg_combinebackup.c:772 +#, c-format +msgid " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" use algorithm for manifest checksums\n" +msgstr " --manifest-checksums=SHA{224,256,384,512}|CRC32C|NONE\n" +" алгоритм викориÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум маніфеÑту\n" + +#: pg_combinebackup.c:774 +#, c-format +msgid " --no-manifest suppress generation of backup manifest\n" +msgstr " --no-manifest заборонити ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту резервної копії\n" + +#: pg_combinebackup.c:775 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD вÑтановити метод Ñинхронізації файлів на диÑк\n" + +#: pg_combinebackup.c:776 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" + +#: pg_combinebackup.c:777 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help показати цю довідку, потім вийти\n" + +#: pg_combinebackup.c:779 +#, c-format +msgid "\n" +"Report bugs to <%s>.\n" +msgstr "\n" +"ПовідомлÑти про помилки на <%s>.\n" + +#: pg_combinebackup.c:780 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" + +#: pg_combinebackup.c:995 +#, c-format +msgid "skipping symbolic link \"%s\"" +msgstr "пропуÑÐºÐ°Ð½Ð½Ñ Ñимволічного поÑÐ¸Ð»Ð°Ð½Ð½Ñ \"%s\"" + +#: pg_combinebackup.c:997 +#, c-format +msgid "skipping special file \"%s\"" +msgstr "Ñпеціальний файл \"%s\" пропуÑкаєтьÑÑ" + +#: pg_combinebackup.c:1073 reconstruct.c:305 +#, c-format +msgid "manifest file \"%s\" contains no entry for file \"%s\"" +msgstr "файл маніфеÑта \"%s\" не міÑтить запиÑу Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\"" + +#: pg_combinebackup.c:1189 +#, c-format +msgid "%s: server version too old" +msgstr "%s: верÑÑ–Ñ Ñерверу заÑтаріла" + +#: pg_combinebackup.c:1190 +#, c-format +msgid "%s: could not parse version number" +msgstr "%s: не вдалоÑÑ Ñ€Ð¾Ð·Ñ–Ð±Ñ€Ð°Ñ‚Ð¸ номер верÑÑ–Ñ—" + +#: pg_combinebackup.c:1309 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "не можливо прочитати Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m" + +#: pg_combinebackup.c:1312 +#, c-format +msgid "target of symbolic link \"%s\" is too long" +msgstr "ціль Ñимволічного поÑÐ¸Ð»Ð°Ð½Ð½Ñ \"%s\" занадто довга" + +#: pg_combinebackup.c:1315 +#, c-format +msgid "target of symbolic link \"%s\" is relative" +msgstr "ціль Ñимволічного поÑÐ¸Ð»Ð°Ð½Ð½Ñ \"%s\" Ñ” відноÑною" + +#: pg_combinebackup.c:1337 +#, c-format +msgid "tablespace at \"%s\" has no tablespace mapping" +msgstr "табличний проÑтір за адреÑою \"%s\" не має зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору" + +#: pg_combinebackup.c:1355 +#, c-format +msgid "tablespaces with OIDs %u and %u both point at directory \"%s\"" +msgstr "табличні проÑтори з OID %u та %u обидва вказують на каталог \"%s\"" + +#: pg_combinebackup.c:1364 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" + +#: pg_combinebackup.c:1385 +#, c-format +msgid "file \"%s\" is too large" +msgstr "файл \"%s\" занадто великий" + +#: pg_combinebackup.c:1402 +#, c-format +msgid "could not read file \"%s\": read %zd of %lld" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %zd з %lld" + +#: reconstruct.c:339 +#, c-format +msgid "full backup contains unexpected incremental file \"%s\"" +msgstr "повна резервна ÐºÐ¾Ð¿Ñ–Ñ Ð¼Ñ–Ñтить неочікуваний інкрементний файл \"%s\"" + +#: reconstruct.c:423 +#, c-format +msgid "file \"%s\" is too short: expected %llu, found %llu" +msgstr "файл \"%s\" занадто короткий: очікуєтьÑÑ %llu, знайдено %llu" + +#: reconstruct.c:465 +#, c-format +msgid "file \"%s\" has bad incremental magic number (0x%x, expected 0x%x)" +msgstr "файл \"%s\" має неправильне інкрементне магічне чиÑло (0x%x, очікувалоÑÑŒ 0x%x)" + +#: reconstruct.c:471 +#, c-format +msgid "file \"%s\" has block count %u in excess of segment size %u" +msgstr "файл \"%s\" має кількіÑть блоків %u, що перевищує розмір Ñегмента %u" + +#: reconstruct.c:478 +#, c-format +msgid "file \"%s\" has truncation block length %u in excess of segment size %u" +msgstr "файл \"%s\" має довжину блоку уÑÑ–ÐºÐ°Ð½Ð½Ñ %u, що перевищує розмір Ñегмента %u" + +#: reconstruct.c:542 +#, c-format +msgid "could not read file \"%s\": read %d of %u" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %u" + +#: reconstruct.c:786 +#, c-format +msgid "could not read from file \"%s\", offset %llu: read %d of %d" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу \"%s\", Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ %llu: прочитано %d з %d" + diff --git a/src/bin/pg_combinebackup/reconstruct.c b/src/bin/pg_combinebackup/reconstruct.c new file mode 100644 index 0000000000000..37ae38b6108b8 --- /dev/null +++ b/src/bin/pg_combinebackup/reconstruct.c @@ -0,0 +1,789 @@ +/*------------------------------------------------------------------------- + * + * reconstruct.c + * Reconstruct full file from incremental file and backup chain. + * + * Copyright (c) 2017-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/bin/pg_combinebackup/reconstruct.c + * + *------------------------------------------------------------------------- + */ +#include "postgres_fe.h" + +#include + +#include "backup/basebackup_incremental.h" +#include "common/file_perm.h" +#include "common/logging.h" +#include "copy_file.h" +#include "lib/stringinfo.h" +#include "reconstruct.h" +#include "storage/block.h" + +/* + * An rfile stores the data that we need in order to be able to use some file + * on disk for reconstruction. For any given output file, we create one rfile + * per backup that we need to consult when we constructing that output file. + * + * If we find a full version of the file in the backup chain, then only + * filename and fd are initialized; the remaining fields are 0 or NULL. + * For an incremental file, header_length, num_blocks, relative_block_numbers, + * and truncation_block_length are also set. + * + * num_blocks_read and highest_offset_read always start out as 0. + */ +typedef struct rfile +{ + char *filename; + int fd; + size_t header_length; + unsigned num_blocks; + BlockNumber *relative_block_numbers; + unsigned truncation_block_length; + unsigned num_blocks_read; + off_t highest_offset_read; +} rfile; + +static void debug_reconstruction(int n_source, + rfile **sources, + bool dry_run); +static unsigned find_reconstructed_block_length(rfile *s); +static rfile *make_incremental_rfile(char *filename); +static rfile *make_rfile(char *filename, bool missing_ok); +static void write_reconstructed_file(char *input_filename, + char *output_filename, + unsigned block_length, + rfile **sourcemap, + off_t *offsetmap, + pg_checksum_context *checksum_ctx, + CopyMethod copy_method, + bool debug, + bool dry_run); +static void read_bytes(rfile *rf, void *buffer, unsigned length); +static void write_block(int fd, char *output_filename, + uint8 *buffer, + pg_checksum_context *checksum_ctx); +static void read_block(rfile *s, off_t off, uint8 *buffer); + +/* + * Reconstruct a full file from an incremental file and a chain of prior + * backups. + * + * input_filename should be the path to the incremental file, and + * output_filename should be the path where the reconstructed file is to be + * written. + * + * relative_path should be the path to the directory containing this file, + * relative to the root of the backup (NOT relative to the root of the + * tablespace). It must always end with a trailing slash. bare_file_name + * should be the name of the file within that directory, without + * "INCREMENTAL.". + * + * n_prior_backups is the number of prior backups, and prior_backup_dirs is + * an array of pathnames where those backups can be found. + */ +void +reconstruct_from_incremental_file(char *input_filename, + char *output_filename, + char *relative_path, + char *bare_file_name, + int n_prior_backups, + char **prior_backup_dirs, + manifest_data **manifests, + char *manifest_path, + pg_checksum_type checksum_type, + int *checksum_length, + uint8 **checksum_payload, + CopyMethod copy_method, + bool debug, + bool dry_run) +{ + rfile **source; + rfile *latest_source = NULL; + rfile **sourcemap; + off_t *offsetmap; + unsigned block_length; + unsigned i; + unsigned sidx = n_prior_backups; + bool full_copy_possible = true; + int copy_source_index = -1; + rfile *copy_source = NULL; + pg_checksum_context checksum_ctx; + + /* Sanity check the relative_path. */ + Assert(relative_path[0] != '\0'); + Assert(relative_path[strlen(relative_path) - 1] == '/'); + + /* + * Every block must come either from the latest version of the file or + * from one of the prior backups. + */ + source = pg_malloc0(sizeof(rfile *) * (1 + n_prior_backups)); + + /* + * Use the information from the latest incremental file to figure out how + * long the reconstructed file should be. + */ + latest_source = make_incremental_rfile(input_filename); + source[n_prior_backups] = latest_source; + block_length = find_reconstructed_block_length(latest_source); + + /* + * For each block in the output file, we need to know from which file we + * need to obtain it and at what offset in that file it's stored. + * sourcemap gives us the first of these things, and offsetmap the latter. + */ + sourcemap = pg_malloc0(sizeof(rfile *) * block_length); + offsetmap = pg_malloc0(sizeof(off_t) * block_length); + + /* + * Every block that is present in the newest incremental file should be + * sourced from that file. If it precedes the truncation_block_length, + * it's a block that we would otherwise have had to find in an older + * backup and thus reduces the number of blocks remaining to be found by + * one; otherwise, it's an extra block that needs to be included in the + * output but would not have needed to be found in an older backup if it + * had not been present. + */ + for (i = 0; i < latest_source->num_blocks; ++i) + { + BlockNumber b = latest_source->relative_block_numbers[i]; + + Assert(b < block_length); + sourcemap[b] = latest_source; + offsetmap[b] = latest_source->header_length + (i * BLCKSZ); + + /* + * A full copy of a file from an earlier backup is only possible if no + * blocks are needed from any later incremental file. + */ + full_copy_possible = false; + } + + while (1) + { + char source_filename[MAXPGPATH]; + rfile *s; + + /* + * Move to the next backup in the chain. If there are no more, then + * we're done. + */ + if (sidx == 0) + break; + --sidx; + + /* + * Look for the full file in the previous backup. If not found, then + * look for an incremental file instead. + */ + snprintf(source_filename, MAXPGPATH, "%s/%s%s", + prior_backup_dirs[sidx], relative_path, bare_file_name); + if ((s = make_rfile(source_filename, true)) == NULL) + { + snprintf(source_filename, MAXPGPATH, "%s/%sINCREMENTAL.%s", + prior_backup_dirs[sidx], relative_path, bare_file_name); + s = make_incremental_rfile(source_filename); + } + source[sidx] = s; + + /* + * If s->header_length == 0, then this is a full file; otherwise, it's + * an incremental file. + */ + if (s->header_length == 0) + { + struct stat sb; + BlockNumber b; + BlockNumber blocklength; + + /* We need to know the length of the file. */ + if (fstat(s->fd, &sb) < 0) + pg_fatal("could not stat file \"%s\": %m", s->filename); + + /* + * Since we found a full file, source all blocks from it that + * exist in the file. + * + * Note that there may be blocks that don't exist either in this + * file or in any incremental file but that precede + * truncation_block_length. These are, presumably, zero-filled + * blocks that result from the server extending the file but + * taking no action on those blocks that generated any WAL. + * + * Sadly, we have no way of validating that this is really what + * happened, and neither does the server. From it's perspective, + * an unmodified block that contains data looks exactly the same + * as a zero-filled block that never had any data: either way, + * it's not mentioned in any WAL summary and the server has no + * reason to read it. From our perspective, all we know is that + * nobody had a reason to back up the block. That certainly means + * that the block didn't exist at the time of the full backup, but + * the supposition that it was all zeroes at the time of every + * later backup is one that we can't validate. + */ + blocklength = sb.st_size / BLCKSZ; + for (b = 0; b < latest_source->truncation_block_length; ++b) + { + if (sourcemap[b] == NULL && b < blocklength) + { + sourcemap[b] = s; + offsetmap[b] = b * BLCKSZ; + } + } + + /* + * If a full copy looks possible, check whether the resulting file + * should be exactly as long as the source file is. If so, a full + * copy is acceptable, otherwise not. + */ + if (full_copy_possible) + { + uint64 expected_length; + + expected_length = + (uint64) latest_source->truncation_block_length; + expected_length *= BLCKSZ; + if (expected_length == sb.st_size) + { + copy_source = s; + copy_source_index = sidx; + } + } + + /* We don't need to consider any further sources. */ + break; + } + + /* + * Since we found another incremental file, source all blocks from it + * that we need but don't yet have. + */ + for (i = 0; i < s->num_blocks; ++i) + { + BlockNumber b = s->relative_block_numbers[i]; + + if (b < latest_source->truncation_block_length && + sourcemap[b] == NULL) + { + sourcemap[b] = s; + offsetmap[b] = s->header_length + (i * BLCKSZ); + + /* + * A full copy of a file from an earlier backup is only + * possible if no blocks are needed from any later incremental + * file. + */ + full_copy_possible = false; + } + } + } + + /* + * If a checksum of the required type already exists in the + * backup_manifest for the relevant input directory, we can save some work + * by reusing that checksum instead of computing a new one. + */ + if (copy_source_index >= 0 && manifests[copy_source_index] != NULL && + checksum_type != CHECKSUM_TYPE_NONE) + { + manifest_file *mfile; + + mfile = manifest_files_lookup(manifests[copy_source_index]->files, + manifest_path); + if (mfile == NULL) + { + char *path = psprintf("%s/backup_manifest", + prior_backup_dirs[copy_source_index]); + + /* + * The directory is out of sync with the backup_manifest, so emit + * a warning. + */ + pg_log_warning("manifest file \"%s\" contains no entry for file \"%s\"", + path, + manifest_path); + pfree(path); + } + else if (mfile->checksum_type == checksum_type) + { + *checksum_length = mfile->checksum_length; + *checksum_payload = pg_malloc(*checksum_length); + memcpy(*checksum_payload, mfile->checksum_payload, + *checksum_length); + checksum_type = CHECKSUM_TYPE_NONE; + } + } + + /* Prepare for checksum calculation, if required. */ + pg_checksum_init(&checksum_ctx, checksum_type); + + /* + * If the full file can be created by copying a file from an older backup + * in the chain without needing to overwrite any blocks or truncate the + * result, then forget about performing reconstruction and just copy that + * file in its entirety. + * + * If we have only incremental files, and there's no full file at any + * point in the backup chain, something has gone wrong. Emit an error. + * + * Otherwise, reconstruct. + */ + if (copy_source != NULL) + copy_file(copy_source->filename, output_filename, + &checksum_ctx, copy_method, dry_run); + else if (sidx == 0 && source[0]->header_length != 0) + { + pg_fatal("full backup contains unexpected incremental file \"%s\"", + source[0]->filename); + } + else + { + write_reconstructed_file(input_filename, output_filename, + block_length, sourcemap, offsetmap, + &checksum_ctx, copy_method, + debug, dry_run); + debug_reconstruction(n_prior_backups + 1, source, dry_run); + } + + /* Save results of checksum calculation. */ + if (checksum_type != CHECKSUM_TYPE_NONE) + { + *checksum_payload = pg_malloc(PG_CHECKSUM_MAX_LENGTH); + *checksum_length = pg_checksum_final(&checksum_ctx, + *checksum_payload); + } + + /* + * Close files and release memory. + */ + for (i = 0; i <= n_prior_backups; ++i) + { + rfile *s = source[i]; + + if (s == NULL) + continue; + if (close(s->fd) != 0) + pg_fatal("could not close file \"%s\": %m", s->filename); + if (s->relative_block_numbers != NULL) + pfree(s->relative_block_numbers); + pg_free(s->filename); + } + pfree(sourcemap); + pfree(offsetmap); + pfree(source); +} + +/* + * Perform post-reconstruction logging and sanity checks. + */ +static void +debug_reconstruction(int n_source, rfile **sources, bool dry_run) +{ + unsigned i; + + for (i = 0; i < n_source; ++i) + { + rfile *s = sources[i]; + + /* Ignore source if not used. */ + if (s == NULL) + continue; + + /* If no data is needed from this file, we can ignore it. */ + if (s->num_blocks_read == 0) + continue; + + /* Debug logging. */ + if (dry_run) + pg_log_debug("would have read %u blocks from \"%s\"", + s->num_blocks_read, s->filename); + else + pg_log_debug("read %u blocks from \"%s\"", + s->num_blocks_read, s->filename); + + /* + * In dry-run mode, we don't actually try to read data from the file, + * but we do try to verify that the file is long enough that we could + * have read the data if we'd tried. + * + * If this fails, then it means that a non-dry-run attempt would fail, + * complaining of not being able to read the required bytes from the + * file. + */ + if (dry_run) + { + struct stat sb; + + if (fstat(s->fd, &sb) < 0) + pg_fatal("could not stat file \"%s\": %m", s->filename); + if (sb.st_size < s->highest_offset_read) + pg_fatal("file \"%s\" is too short: expected %llu, found %llu", + s->filename, + (unsigned long long) s->highest_offset_read, + (unsigned long long) sb.st_size); + } + } +} + +/* + * When we perform reconstruction using an incremental file, the output file + * should be at least as long as the truncation_block_length. Any blocks + * present in the incremental file increase the output length as far as is + * necessary to include those blocks. + */ +static unsigned +find_reconstructed_block_length(rfile *s) +{ + unsigned block_length = s->truncation_block_length; + unsigned i; + + for (i = 0; i < s->num_blocks; ++i) + if (s->relative_block_numbers[i] >= block_length) + block_length = s->relative_block_numbers[i] + 1; + + return block_length; +} + +/* + * Initialize an incremental rfile, reading the header so that we know which + * blocks it contains. + */ +static rfile * +make_incremental_rfile(char *filename) +{ + rfile *rf; + unsigned magic; + + rf = make_rfile(filename, false); + + /* Read and validate magic number. */ + read_bytes(rf, &magic, sizeof(magic)); + if (magic != INCREMENTAL_MAGIC) + pg_fatal("file \"%s\" has bad incremental magic number (0x%x, expected 0x%x)", + filename, magic, INCREMENTAL_MAGIC); + + /* Read block count. */ + read_bytes(rf, &rf->num_blocks, sizeof(rf->num_blocks)); + if (rf->num_blocks > RELSEG_SIZE) + pg_fatal("file \"%s\" has block count %u in excess of segment size %u", + filename, rf->num_blocks, RELSEG_SIZE); + + /* Read truncation block length. */ + read_bytes(rf, &rf->truncation_block_length, + sizeof(rf->truncation_block_length)); + if (rf->truncation_block_length > RELSEG_SIZE) + pg_fatal("file \"%s\" has truncation block length %u in excess of segment size %u", + filename, rf->truncation_block_length, RELSEG_SIZE); + + /* Read block numbers if there are any. */ + if (rf->num_blocks > 0) + { + rf->relative_block_numbers = + pg_malloc0(sizeof(BlockNumber) * rf->num_blocks); + read_bytes(rf, rf->relative_block_numbers, + sizeof(BlockNumber) * rf->num_blocks); + } + + /* Remember length of header. */ + rf->header_length = sizeof(magic) + sizeof(rf->num_blocks) + + sizeof(rf->truncation_block_length) + + sizeof(BlockNumber) * rf->num_blocks; + + /* + * Round header length to a multiple of BLCKSZ, so that blocks contents + * are properly aligned. Only do this when the file actually has data for + * some blocks. + */ + if ((rf->num_blocks > 0) && ((rf->header_length % BLCKSZ) != 0)) + rf->header_length += (BLCKSZ - (rf->header_length % BLCKSZ)); + + return rf; +} + +/* + * Allocate and perform basic initialization of an rfile. + */ +static rfile * +make_rfile(char *filename, bool missing_ok) +{ + rfile *rf; + + rf = pg_malloc0(sizeof(rfile)); + rf->filename = pstrdup(filename); + if ((rf->fd = open(filename, O_RDONLY | PG_BINARY, 0)) < 0) + { + if (missing_ok && errno == ENOENT) + { + pg_free(rf); + return NULL; + } + pg_fatal("could not open file \"%s\": %m", filename); + } + + return rf; +} + +/* + * Read the indicated number of bytes from an rfile into the buffer. + */ +static void +read_bytes(rfile *rf, void *buffer, unsigned length) +{ + int rb = read(rf->fd, buffer, length); + + if (rb != length) + { + if (rb < 0) + pg_fatal("could not read file \"%s\": %m", rf->filename); + else + pg_fatal("could not read file \"%s\": read %d of %u", + rf->filename, rb, length); + } +} + +/* + * Write out a reconstructed file. + */ +static void +write_reconstructed_file(char *input_filename, + char *output_filename, + unsigned block_length, + rfile **sourcemap, + off_t *offsetmap, + pg_checksum_context *checksum_ctx, + CopyMethod copy_method, + bool debug, + bool dry_run) +{ + int wfd = -1; + unsigned i; + unsigned zero_blocks = 0; + + /* Debugging output. */ + if (debug) + { + StringInfoData debug_buf; + unsigned start_of_range = 0; + unsigned current_block = 0; + + /* Basic information about the output file to be produced. */ + if (dry_run) + pg_log_debug("would reconstruct \"%s\" (%u blocks, checksum %s)", + output_filename, block_length, + pg_checksum_type_name(checksum_ctx->type)); + else + pg_log_debug("reconstructing \"%s\" (%u blocks, checksum %s)", + output_filename, block_length, + pg_checksum_type_name(checksum_ctx->type)); + + /* Print out the plan for reconstructing this file. */ + initStringInfo(&debug_buf); + while (current_block < block_length) + { + rfile *s = sourcemap[current_block]; + + /* Extend range, if possible. */ + if (current_block + 1 < block_length && + s == sourcemap[current_block + 1]) + { + ++current_block; + continue; + } + + /* Add details about this range. */ + if (s == NULL) + { + if (current_block == start_of_range) + appendStringInfo(&debug_buf, " %u:zero", current_block); + else + appendStringInfo(&debug_buf, " %u-%u:zero", + start_of_range, current_block); + } + else + { + if (current_block == start_of_range) + appendStringInfo(&debug_buf, " %u:%s@" UINT64_FORMAT, + current_block, s->filename, + (uint64) offsetmap[current_block]); + else + appendStringInfo(&debug_buf, " %u-%u:%s@" UINT64_FORMAT, + start_of_range, current_block, + s->filename, + (uint64) offsetmap[current_block]); + } + + /* Begin new range. */ + start_of_range = ++current_block; + + /* If the output is very long or we are done, dump it now. */ + if (current_block == block_length || debug_buf.len > 1024) + { + pg_log_debug("reconstruction plan:%s", debug_buf.data); + resetStringInfo(&debug_buf); + } + } + + /* Free memory. */ + pfree(debug_buf.data); + } + + /* Open the output file, except in dry_run mode. */ + if (!dry_run && + (wfd = open(output_filename, + O_RDWR | PG_BINARY | O_CREAT | O_EXCL, + pg_file_create_mode)) < 0) + pg_fatal("could not open file \"%s\": %m", output_filename); + + /* Read and write the blocks as required. */ + for (i = 0; i < block_length; ++i) + { + uint8 buffer[BLCKSZ]; + rfile *s = sourcemap[i]; + + /* Update accounting information. */ + if (s == NULL) + ++zero_blocks; + else + { + s->num_blocks_read++; + s->highest_offset_read = Max(s->highest_offset_read, + offsetmap[i] + BLCKSZ); + } + + /* Skip the rest of this in dry-run mode. */ + if (dry_run) + continue; + + /* Read or zero-fill the block as appropriate. */ + if (s == NULL) + { + /* + * New block not mentioned in the WAL summary. Should have been an + * uninitialized block, so just zero-fill it. + */ + memset(buffer, 0, BLCKSZ); + + /* Write out the block, update the checksum if needed. */ + write_block(wfd, output_filename, buffer, checksum_ctx); + + /* Nothing else to do for zero-filled blocks. */ + continue; + } + + /* Copy the block using the appropriate copy method. */ + if (copy_method != COPY_METHOD_COPY_FILE_RANGE) + { + /* + * Read the block from the correct source file, and then write it + * out, possibly with a checksum update. + */ + read_block(s, offsetmap[i], buffer); + write_block(wfd, output_filename, buffer, checksum_ctx); + } + else /* use copy_file_range */ + { +#if defined(HAVE_COPY_FILE_RANGE) + /* copy_file_range modifies the offset, so use a local copy */ + off_t off = offsetmap[i]; + size_t nwritten = 0; + + /* + * Retry until we've written all the bytes (the offset is updated + * by copy_file_range, and so is the wfd file offset). + */ + do + { + int wb; + + wb = copy_file_range(s->fd, &off, wfd, NULL, BLCKSZ - nwritten, 0); + + if (wb < 0) + pg_fatal("error while copying file range from \"%s\" to \"%s\": %m", + input_filename, output_filename); + + nwritten += wb; + + } while (BLCKSZ > nwritten); + + /* + * When checksum calculation not needed, we're done, otherwise + * read the block and pass it to the checksum calculation. + */ + if (checksum_ctx->type == CHECKSUM_TYPE_NONE) + continue; + + read_block(s, offsetmap[i], buffer); + + if (pg_checksum_update(checksum_ctx, buffer, BLCKSZ) < 0) + pg_fatal("could not update checksum of file \"%s\"", + output_filename); +#else + pg_fatal("copy_file_range not supported on this platform"); +#endif + } + } + + /* Debugging output. */ + if (zero_blocks > 0) + { + if (dry_run) + pg_log_debug("would have zero-filled %u blocks", zero_blocks); + else + pg_log_debug("zero-filled %u blocks", zero_blocks); + } + + /* Close the output file. */ + if (wfd >= 0 && close(wfd) != 0) + pg_fatal("could not close file \"%s\": %m", output_filename); +} + +/* + * Write the block into the file (using the file descriptor), and + * if needed update the checksum calculation. + * + * The buffer is expected to contain BLCKSZ bytes. The filename is + * provided only for the error message. + */ +static void +write_block(int fd, char *output_filename, + uint8 *buffer, pg_checksum_context *checksum_ctx) +{ + int wb; + + if ((wb = write(fd, buffer, BLCKSZ)) != BLCKSZ) + { + if (wb < 0) + pg_fatal("could not write file \"%s\": %m", output_filename); + else + pg_fatal("could not write file \"%s\": wrote %d of %d", + output_filename, wb, BLCKSZ); + } + + /* Update the checksum computation. */ + if (pg_checksum_update(checksum_ctx, buffer, BLCKSZ) < 0) + pg_fatal("could not update checksum of file \"%s\"", + output_filename); +} + +/* + * Read a block of data (BLCKSZ bytes) into the buffer. + */ +static void +read_block(rfile *s, off_t off, uint8 *buffer) +{ + int rb; + + /* Read the block from the correct source, except if dry-run. */ + rb = pg_pread(s->fd, buffer, BLCKSZ, off); + if (rb != BLCKSZ) + { + if (rb < 0) + pg_fatal("could not read from file \"%s\": %m", s->filename); + else + pg_fatal("could not read from file \"%s\", offset %llu: read %d of %d", + s->filename, (unsigned long long) off, rb, BLCKSZ); + } +} diff --git a/src/bin/pg_combinebackup/reconstruct.h b/src/bin/pg_combinebackup/reconstruct.h new file mode 100644 index 0000000000000..c878febbb3862 --- /dev/null +++ b/src/bin/pg_combinebackup/reconstruct.h @@ -0,0 +1,35 @@ +/*------------------------------------------------------------------------- + * + * reconstruct.h + * Reconstruct full file from incremental file and backup chain. + * + * Copyright (c) 2017-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/bin/pg_combinebackup/reconstruct.h + * + *------------------------------------------------------------------------- + */ +#ifndef RECONSTRUCT_H +#define RECONSTRUCT_H + +#include "common/checksum_helper.h" +#include "copy_file.h" +#include "load_manifest.h" + +extern void reconstruct_from_incremental_file(char *input_filename, + char *output_filename, + char *relative_path, + char *bare_file_name, + int n_prior_backups, + char **prior_backup_dirs, + manifest_data **manifests, + char *manifest_path, + pg_checksum_type checksum_type, + int *checksum_length, + uint8 **checksum_payload, + CopyMethod copy_method, + bool debug, + bool dry_run); + +#endif diff --git a/src/bin/pg_combinebackup/t/001_basic.pl b/src/bin/pg_combinebackup/t/001_basic.pl new file mode 100644 index 0000000000000..a2b7f30d59e55 --- /dev/null +++ b/src/bin/pg_combinebackup/t/001_basic.pl @@ -0,0 +1,23 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Utils; +use Test::More; + +my $tempdir = PostgreSQL::Test::Utils::tempdir; + +program_help_ok('pg_combinebackup'); +program_version_ok('pg_combinebackup'); +program_options_handling_ok('pg_combinebackup'); + +command_fails_like( + ['pg_combinebackup'], + qr/no input directories specified/, + 'input directories must be specified'); +command_fails_like( + [ 'pg_combinebackup', $tempdir ], + qr/no output directory specified/, + 'output directory must be specified'); + +done_testing(); diff --git a/src/bin/pg_combinebackup/t/002_compare_backups.pl b/src/bin/pg_combinebackup/t/002_compare_backups.pl new file mode 100644 index 0000000000000..cfdd25471cb5f --- /dev/null +++ b/src/bin/pg_combinebackup/t/002_compare_backups.pl @@ -0,0 +1,212 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use File::Compare qw(compare_text); +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $tempdir = PostgreSQL::Test::Utils::tempdir_short(); + +# Can be changed to test the other modes. +my $mode = $ENV{PG_TEST_PG_COMBINEBACKUP_MODE} || '--copy'; + +note "testing using mode $mode"; + +# Set up a new database instance. +my $primary = PostgreSQL::Test::Cluster->new('primary'); +$primary->init(has_archiving => 1, allows_streaming => 1); +$primary->append_conf('postgresql.conf', 'summarize_wal = on'); +$primary->start; +my $tsprimary = $tempdir . '/ts'; +mkdir($tsprimary) || die "mkdir $tsprimary: $!"; + +# Create some test tables, each containing one row of data, plus a whole +# extra database. +$primary->safe_psql('postgres', <data_dir . '/pg_tblspc'); +is(0 + @tsoids, 1, "exactly one user-defined tablespace"); +my $tsoid = $tsoids[0]; + +# Take a full backup. +my $backup1path = $primary->backup_dir . '/backup1'; +my $tsbackup1path = $tempdir . '/ts1backup'; +mkdir($tsbackup1path) || die "mkdir $tsbackup1path: $!"; +$primary->command_ok( + [ + 'pg_basebackup', '-D', + $backup1path, '--no-sync', + '-cfast', "-T${tsprimary}=${tsbackup1path}" + ], + "full backup"); + +# Now make some database changes. +$primary->safe_psql('postgres', <backup_dir . '/backup2'; +my $tsbackup2path = $tempdir . '/tsbackup2'; +mkdir($tsbackup2path) || die "mkdir $tsbackup2path: $!"; +$primary->command_ok( + [ + 'pg_basebackup', '-D', + $backup2path, '--no-sync', + '-cfast', "-T${tsprimary}=${tsbackup2path}", + '--incremental', $backup1path . '/backup_manifest' + ], + "incremental backup"); + +# Find an LSN to which either backup can be recovered. +my $lsn = $primary->safe_psql('postgres', "SELECT pg_current_wal_lsn();"); + +# Make sure that the WAL segment containing that LSN has been archived. +# PostgreSQL won't issue two consecutive XLOG_SWITCH records, and the backup +# just issued one, so call txid_current() to generate some WAL activity +# before calling pg_switch_wal(). +$primary->safe_psql('postgres', 'SELECT txid_current();'); +$primary->safe_psql('postgres', 'SELECT pg_switch_wal()'); + +# Now wait for the LSN we chose above to be archived. +my $archive_wait_query = + "SELECT pg_walfile_name('$lsn') <= last_archived_wal FROM pg_stat_archiver;"; +$primary->poll_query_until('postgres', $archive_wait_query) + or die "Timed out while waiting for WAL segment to be archived"; + +# Perform PITR from the full backup. Disable archive_mode so that the archive +# doesn't find out about the new timeline; that way, the later PITR below will +# choose the same timeline. +my $tspitr1path = $tempdir . '/tspitr1'; +my $pitr1 = PostgreSQL::Test::Cluster->new('pitr1'); +$pitr1->init_from_backup( + $primary, 'backup1', + standby => 1, + has_restoring => 1, + tablespace_map => { $tsoid => $tspitr1path }); +$pitr1->append_conf( + 'postgresql.conf', qq{ +recovery_target_lsn = '$lsn' +recovery_target_action = 'promote' +archive_mode = 'off' +}); +$pitr1->start(); + +# Perform PITR to the same LSN from the incremental backup. Use the same +# basic configuration as before. +my $tspitr2path = $tempdir . '/tspitr2'; +my $pitr2 = PostgreSQL::Test::Cluster->new('pitr2'); +$pitr2->init_from_backup( + $primary, 'backup2', + standby => 1, + has_restoring => 1, + combine_with_prior => ['backup1'], + tablespace_map => { $tsbackup2path => $tspitr2path }, + combine_mode => $mode); +$pitr2->append_conf( + 'postgresql.conf', qq{ +recovery_target_lsn = '$lsn' +recovery_target_action = 'promote' +archive_mode = 'off' +}); +$pitr2->start(); + +# Wait until both servers exit recovery. +$pitr1->poll_query_until('postgres', "SELECT NOT pg_is_in_recovery();") + or die "Timed out while waiting apply to reach LSN $lsn"; +$pitr2->poll_query_until('postgres', "SELECT NOT pg_is_in_recovery();") + or die "Timed out while waiting apply to reach LSN $lsn"; + +# Perform a logical dump of each server, and check that they match. +# It would be much nicer if we could physically compare the data files, but +# that doesn't really work. The contents of the page hole aren't guaranteed to +# be identical, and there can be other discrepancies as well. To make this work +# we'd need the equivalent of each AM's rm_mask function written or at least +# callable from Perl, and that doesn't seem practical. +# +# NB: We're just using the primary's backup directory for scratch space here. +# This could equally well be any other directory we wanted to pick. +my $backupdir = $primary->backup_dir; +my $dump1 = $backupdir . '/pitr1.dump'; +my $dump2 = $backupdir . '/pitr2.dump'; +$pitr1->command_ok( + [ + 'pg_dumpall', '-f', + $dump1, '--no-sync', + '--no-unlogged-table-data', '-d', + $pitr1->connstr('postgres'), + ], + 'dump from PITR 1'); +$pitr2->command_ok( + [ + 'pg_dumpall', '-f', + $dump2, '--no-sync', + '--no-unlogged-table-data', '-d', + $pitr2->connstr('postgres'), + ], + 'dump from PITR 2'); + +# Compare the two dumps, there should be no differences other than +# the tablespace paths. +my $compare_res = compare_text( + $dump1, $dump2, + sub { + s{create tablespace .* location .*\btspitr\K[12]}{N}i for @_; + return $_[0] ne $_[1]; + }); +note($dump1); +note($dump2); +is($compare_res, 0, "dumps are identical"); + +# Provide more context if the dumps do not match. +if ($compare_res != 0) +{ + my ($stdout, $stderr) = + run_command([ 'diff', '-u', $dump1, $dump2 ]); + print "=== diff of $dump1 and $dump2\n"; + print "=== stdout ===\n"; + print $stdout; + print "=== stderr ===\n"; + print $stderr; + print "=== EOF ===\n"; +} + +done_testing(); diff --git a/src/bin/pg_combinebackup/t/003_timeline.pl b/src/bin/pg_combinebackup/t/003_timeline.pl new file mode 100644 index 0000000000000..b9c67341ad83a --- /dev/null +++ b/src/bin/pg_combinebackup/t/003_timeline.pl @@ -0,0 +1,101 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group +# +# This test aims to validate that restoring an incremental backup works +# properly even when the reference backup is on a different timeline. + +use strict; +use warnings FATAL => 'all'; +use File::Compare; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Can be changed to test the other modes. +my $mode = $ENV{PG_TEST_PG_COMBINEBACKUP_MODE} || '--copy'; + +note "testing using mode $mode"; + +# Set up a new database instance. +my $node1 = PostgreSQL::Test::Cluster->new('node1'); +$node1->init(has_archiving => 1, allows_streaming => 1); +$node1->append_conf('postgresql.conf', 'summarize_wal = on'); +$node1->start; + +# Create a table and insert a test row into it. +$node1->safe_psql('postgres', <backup_dir . '/backup1'; +$node1->command_ok( + [ 'pg_basebackup', '-D', $backup1path, '--no-sync', '-cfast' ], + "full backup from node1"); + +# Insert a second row on the original node. +$node1->safe_psql('postgres', <backup_dir . '/backup2'; +$node1->command_ok( + [ + 'pg_basebackup', '-D', $backup2path, '--no-sync', '-cfast', + '--incremental', $backup1path . '/backup_manifest' + ], + "incremental backup from node1"); + +# Restore the incremental backup and use it to create a new node. +my $node2 = PostgreSQL::Test::Cluster->new('node2'); +$node2->init_from_backup($node1, 'backup2', + combine_with_prior => ['backup1']); +$node2->start(); + +# Insert rows on both nodes. +$node1->safe_psql('postgres', <safe_psql('postgres', <backup_dir . '/backup3'; +$node2->command_ok( + [ + 'pg_basebackup', '-D', $backup3path, '--no-sync', '-cfast', + '--incremental', $backup2path . '/backup_manifest' + ], + "incremental backup from node2"); + +# Restore the incremental backup and use it to create a new node. +my $node3 = PostgreSQL::Test::Cluster->new('node3'); +$node3->init_from_backup( + $node1, 'backup3', + combine_with_prior => [ 'backup1', 'backup2' ], + combine_mode => $mode); +$node3->start(); + +# Let's insert one more row. +$node3->safe_psql('postgres', <safe_psql('postgres', <command_ok( + [ 'pg_verifybackup', $node1->backup_dir . '/' . $backup_name ], + "verify backup $backup_name"); +} + +# OK, that's all. +done_testing(); diff --git a/src/bin/pg_combinebackup/t/004_manifest.pl b/src/bin/pg_combinebackup/t/004_manifest.pl new file mode 100644 index 0000000000000..9b09ae2641d0d --- /dev/null +++ b/src/bin/pg_combinebackup/t/004_manifest.pl @@ -0,0 +1,81 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group +# +# This test aims to validate that pg_combinebackup works in the degenerate +# case where it is invoked on a single full backup and that it can produce +# a new, valid manifest when it does. Secondarily, it checks that +# pg_combinebackup does not produce a manifest when run with --no-manifest. + +use strict; +use warnings FATAL => 'all'; +use File::Compare; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Can be changed to test the other modes. +my $mode = $ENV{PG_TEST_PG_COMBINEBACKUP_MODE} || '--copy'; + +note "testing using mode $mode"; + +# Set up a new database instance. +my $node = PostgreSQL::Test::Cluster->new('node'); +$node->init(has_archiving => 1, allows_streaming => 1); +$node->start; + +# Take a full backup. +my $original_backup_path = $node->backup_dir . '/original'; +$node->command_ok( + [ 'pg_basebackup', '-D', $original_backup_path, '--no-sync', '-cfast' ], + "full backup"); + +# Verify the full backup. +$node->command_ok([ 'pg_verifybackup', $original_backup_path ], + "verify original backup"); + +# Process the backup with pg_combinebackup using various manifest options. +sub combine_and_test_one_backup +{ + my ($backup_name, $failure_pattern, @extra_options) = @_; + my $revised_backup_path = $node->backup_dir . '/' . $backup_name; + $node->command_ok( + [ + 'pg_combinebackup', $original_backup_path, + '-o', $revised_backup_path, + '--no-sync', @extra_options + ], + "pg_combinebackup with @extra_options"); + if (defined $failure_pattern) + { + $node->command_fails_like([ 'pg_verifybackup', $revised_backup_path ], + $failure_pattern, "unable to verify backup $backup_name"); + } + else + { + $node->command_ok([ 'pg_verifybackup', $revised_backup_path ], + "verify backup $backup_name"); + } +} +combine_and_test_one_backup('nomanifest', + qr/could not open file.*backup_manifest/, + '--no-manifest'); +combine_and_test_one_backup('csum_none', undef, '--manifest-checksums=NONE', + $mode); +combine_and_test_one_backup('csum_sha224', + undef, '--manifest-checksums=SHA224', $mode); + +# Verify that SHA224 is mentioned in the SHA224 manifest lots of times. +my $sha224_manifest = + slurp_file($node->backup_dir . '/csum_sha224/backup_manifest'); +my $sha224_count = (() = $sha224_manifest =~ /SHA224/mig); +cmp_ok($sha224_count, + '>', 100, "SHA224 is mentioned many times in SHA224 manifest"); + +# Verify that SHA224 is mentioned in the SHA224 manifest lots of times. +my $nocsum_manifest = + slurp_file($node->backup_dir . '/csum_none/backup_manifest'); +my $nocsum_count = (() = $nocsum_manifest =~ /Checksum-Algorithm/mig); +is($nocsum_count, 0, + "Checksum-Algorithm is not mentioned in no-checksum manifest"); + +# OK, that's all. +done_testing(); diff --git a/src/bin/pg_combinebackup/t/005_integrity.pl b/src/bin/pg_combinebackup/t/005_integrity.pl new file mode 100644 index 0000000000000..25ebb8c04068d --- /dev/null +++ b/src/bin/pg_combinebackup/t/005_integrity.pl @@ -0,0 +1,185 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group +# +# This test aims to validate that an incremental backup can be combined +# with a valid prior backup and that it cannot be combined with an invalid +# prior backup. + +use strict; +use warnings FATAL => 'all'; +use File::Compare; +use File::Path qw(rmtree); +use File::Copy; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Can be changed to test the other modes. +my $mode = $ENV{PG_TEST_PG_COMBINEBACKUP_MODE} || '--copy'; + +note "testing using mode $mode"; + +# Set up a new database instance. +my $node1 = PostgreSQL::Test::Cluster->new('node1'); +$node1->init(has_archiving => 1, allows_streaming => 1); +$node1->append_conf('postgresql.conf', 'summarize_wal = on'); +$node1->start; + +# Create a file called INCREMENTAL.config in the root directory of the +# first database instance. We only recognize INCREMENTAL.${original_name} +# files under base and global and in tablespace directories, so this shouldn't +# cause anything to fail. +my $strangely_named_config_file = $node1->data_dir . '/INCREMENTAL.config'; +open(my $icfg, '>', $strangely_named_config_file) + || die "$strangely_named_config_file: $!"; +close($icfg); + +# Set up another new database instance. force_initdb is used because +# we want it to be a separate cluster with a different system ID. +my $node2 = PostgreSQL::Test::Cluster->new('node2'); +$node2->init(force_initdb => 1, has_archiving => 1, allows_streaming => 1); +$node2->append_conf('postgresql.conf', 'summarize_wal = on'); +$node2->start; + +# Take a full backup from node1. +my $backup1path = $node1->backup_dir . '/backup1'; +$node1->command_ok( + [ 'pg_basebackup', '-D', $backup1path, '--no-sync', '-cfast' ], + "full backup from node1"); + +# Now take an incremental backup. +my $backup2path = $node1->backup_dir . '/backup2'; +$node1->command_ok( + [ + 'pg_basebackup', '-D', $backup2path, '--no-sync', '-cfast', + '--incremental', $backup1path . '/backup_manifest' + ], + "incremental backup from node1"); + +# Now take another incremental backup. +my $backup3path = $node1->backup_dir . '/backup3'; +$node1->command_ok( + [ + 'pg_basebackup', '-D', $backup3path, '--no-sync', '-cfast', + '--incremental', $backup2path . '/backup_manifest' + ], + "another incremental backup from node1"); + +# Take a full backup from node2. +my $backupother1path = $node1->backup_dir . '/backupother1'; +$node2->command_ok( + [ 'pg_basebackup', '-D', $backupother1path, '--no-sync', '-cfast' ], + "full backup from node2"); + +# Take an incremental backup from node2. +my $backupother2path = $node1->backup_dir . '/backupother2'; +$node2->command_ok( + [ + 'pg_basebackup', '-D', $backupother2path, '--no-sync', '-cfast', + '--incremental', $backupother1path . '/backup_manifest' + ], + "incremental backup from node2"); + +# Result directory. +my $resultpath = $node1->backup_dir . '/result'; + +# Can't combine 2 full backups. +$node1->command_fails_like( + [ + 'pg_combinebackup', $backup1path, $backup1path, '-o', + $resultpath, $mode + ], + qr/is a full backup, but only the first backup should be a full backup/, + "can't combine full backups"); + +# Can't combine 2 incremental backups. +$node1->command_fails_like( + [ + 'pg_combinebackup', $backup2path, $backup2path, '-o', + $resultpath, $mode + ], + qr/is an incremental backup, but the first backup should be a full backup/, + "can't combine full backups"); + +# Can't combine full backup with an incremental backup from a different system. +$node1->command_fails_like( + [ + 'pg_combinebackup', $backup1path, $backupother2path, '-o', + $resultpath, $mode + ], + qr/expected system identifier.*but found/, + "can't combine backups from different nodes"); + +# Can't combine when different manifest system identifier +rename("$backup2path/backup_manifest", "$backup2path/backup_manifest.orig") + or die "could not move $backup2path/backup_manifest"; +copy("$backupother2path/backup_manifest", "$backup2path/backup_manifest") + or die "could not copy $backupother2path/backup_manifest"; +$node1->command_fails_like( + [ + 'pg_combinebackup', $backup1path, $backup2path, $backup3path, + '-o', $resultpath, $mode + ], + qr/ manifest system identifier is .*, but control file has /, + "can't combine backups with different manifest system identifier "); +# Restore the backup state +move("$backup2path/backup_manifest.orig", "$backup2path/backup_manifest") + or die "could not move $backup2path/backup_manifest"; + +# Can't omit a required backup. +$node1->command_fails_like( + [ + 'pg_combinebackup', $backup1path, $backup3path, '-o', + $resultpath, $mode + ], + qr/starts at LSN.*but expected/, + "can't omit a required backup"); + +# Can't combine backups in the wrong order. +$node1->command_fails_like( + [ + 'pg_combinebackup', $backup1path, $backup3path, $backup2path, + '-o', $resultpath, $mode + ], + qr/starts at LSN.*but expected/, + "can't combine backups in the wrong order"); + +# Can combine 3 backups that match up properly. +$node1->command_ok( + [ + 'pg_combinebackup', $backup1path, $backup2path, $backup3path, + '-o', $resultpath, $mode + ], + "can combine 3 matching backups"); +rmtree($resultpath); + +# Can combine full backup with first incremental. +my $synthetic12path = $node1->backup_dir . '/synthetic12'; +$node1->command_ok( + [ + 'pg_combinebackup', $backup1path, $backup2path, '-o', + $synthetic12path, $mode + ], + "can combine 2 matching backups"); + +# Can combine result of previous step with second incremental. +$node1->command_ok( + [ + 'pg_combinebackup', $synthetic12path, + $backup3path, '-o', + $resultpath, $mode + ], + "can combine synthetic backup with later incremental"); +rmtree($resultpath); + +# Can't combine result of 1+2 with 2. +$node1->command_fails_like( + [ + 'pg_combinebackup', $synthetic12path, + $backup2path, '-o', + $resultpath, $mode + ], + qr/starts at LSN.*but expected/, + "can't combine synthetic backup with included incremental"); + +# OK, that's all. +done_testing(); diff --git a/src/bin/pg_combinebackup/t/006_db_file_copy.pl b/src/bin/pg_combinebackup/t/006_db_file_copy.pl new file mode 100644 index 0000000000000..60bdc8d00f79a --- /dev/null +++ b/src/bin/pg_combinebackup/t/006_db_file_copy.pl @@ -0,0 +1,71 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use File::Compare; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Can be changed to test the other modes. +my $mode = $ENV{PG_TEST_PG_COMBINEBACKUP_MODE} || '--copy'; + +note "testing using mode $mode"; + +# Set up a new database instance. +my $primary = PostgreSQL::Test::Cluster->new('primary'); +$primary->init(has_archiving => 1, allows_streaming => 1); +$primary->append_conf('postgresql.conf', 'summarize_wal = on'); +$primary->start; + +# Initial setup. +$primary->safe_psql('postgres', <safe_psql('lakh', <backup_dir . '/backup1'; +$primary->command_ok( + [ 'pg_basebackup', '-D', $backup1path, '--no-sync', '-cfast' ], + "full backup"); + +# Now make some database changes. +$primary->safe_psql('postgres', <backup_dir . '/backup2'; +$primary->command_ok( + [ + 'pg_basebackup', '-D', $backup2path, '--no-sync', '-cfast', + '--incremental', $backup1path . '/backup_manifest' + ], + "incremental backup"); + +# Recover the incremental backup. +my $restore = PostgreSQL::Test::Cluster->new('restore'); +$restore->init_from_backup( + $primary, 'backup2', + combine_with_prior => ['backup1'], + combine_mode => $mode); +$restore->start(); + +# Query the DB. +my $stdout; +my $stderr; +$restore->psql( + 'lakh', 'SELECT * FROM t1', + stdout => \$stdout, + stderr => \$stderr); +is($stdout, '', 'SELECT * FROM t1: no stdout'); +like( + $stderr, + qr/relation "t1" does not exist/, + 'SELECT * FROM t1: stderr missing table'); + +done_testing(); diff --git a/src/bin/pg_combinebackup/t/007_wal_level_minimal.pl b/src/bin/pg_combinebackup/t/007_wal_level_minimal.pl new file mode 100644 index 0000000000000..900df6b2864a7 --- /dev/null +++ b/src/bin/pg_combinebackup/t/007_wal_level_minimal.pl @@ -0,0 +1,73 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group +# +# This test aims to validate that taking an incremental backup fails when +# wal_level has been changed to minimal between the full backup and the +# attempted incremental backup. + +use strict; +use warnings FATAL => 'all'; +use File::Compare; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Can be changed to test the other modes. +my $mode = $ENV{PG_TEST_PG_COMBINEBACKUP_MODE} || '--copy'; + +note "testing using mode $mode"; + +# Set up a new database instance. +my $node1 = PostgreSQL::Test::Cluster->new('node1'); +$node1->init(allows_streaming => 1); +$node1->append_conf('postgresql.conf', <start; + +# Create a table and insert a test row into it. +$node1->safe_psql('postgres', <backup_dir . '/backup1'; +$node1->command_ok( + [ 'pg_basebackup', '-D', $backup1path, '--no-sync', '-cfast' ], + "full backup"); + +# Switch to wal_level=minimal, which also requires max_wal_senders=0 and +# summarize_wal=off +$node1->safe_psql('postgres', <restart; + +# Insert a second row on the original node. +$node1->safe_psql('postgres', <safe_psql('postgres', <restart; + +# Now take an incremental backup. +my $backup2path = $node1->backup_dir . '/backup2'; +$node1->command_fails_like( + [ + 'pg_basebackup', '-D', $backup2path, '--no-sync', '-cfast', + '--incremental', $backup1path . '/backup_manifest' + ], + qr/WAL summaries are required on timeline 1 from.*are incomplete/, + "incremental backup fails"); + +# OK, that's all. +done_testing(); diff --git a/src/bin/pg_combinebackup/t/008_promote.pl b/src/bin/pg_combinebackup/t/008_promote.pl new file mode 100644 index 0000000000000..1154a5d8b2241 --- /dev/null +++ b/src/bin/pg_combinebackup/t/008_promote.pl @@ -0,0 +1,81 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group +# +# Test whether WAL summaries are complete such that incremental backup +# can be performed after promoting a standby at an arbitrary LSN. + +use strict; +use warnings FATAL => 'all'; +use File::Compare; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Can be changed to test the other modes. +my $mode = $ENV{PG_TEST_PG_COMBINEBACKUP_MODE} || '--copy'; + +note "testing using mode $mode"; + +# Set up a new database instance. +my $node1 = PostgreSQL::Test::Cluster->new('node1'); +$node1->init(has_archiving => 1, allows_streaming => 1); +$node1->append_conf('postgresql.conf', 'summarize_wal = on'); +$node1->append_conf('postgresql.conf', 'log_min_messages = debug1'); +$node1->start; + +# Create a table and insert a test row into it. +$node1->safe_psql('postgres', <backup_dir . '/backup1'; +$node1->command_ok( + [ 'pg_basebackup', '-D', $backup1path, '--no-sync', '-cfast' ], + "full backup from node1"); + +# Checkpoint and record LSN after. +$node1->safe_psql('postgres', 'CHECKPOINT'); +my $lsn = $node1->safe_psql('postgres', 'SELECT pg_current_wal_insert_lsn()'); + +# Insert a second row on the original node. +$node1->safe_psql('postgres', <new('node2'); +$node2->init_from_backup($node1, 'backup1', 'has_streaming' => 1); +$node2->append_conf('postgresql.conf', <start(); + +# Wait until recoveery pauses, then promote. +$node2->poll_query_until('postgres', "SELECT pg_get_wal_replay_pause_state() = 'paused';"); +$node2->safe_psql('postgres', "SELECT pg_promote()"); + +# Once promotion occurs, insert a second row on the new node. +$node2->poll_query_until('postgres', "SELECT pg_is_in_recovery() = 'f';"); +$node2->safe_psql('postgres', <backup_dir . '/backup2'; +$node2->command_ok( + [ 'pg_basebackup', '-D', $backup2path, '--no-sync', '-cfast', + '--incremental', $backup1path . '/backup_manifest' ], + "incremental backup from node2"); + +# Restore the incremental backup and use it to create a new node. +my $node3 = PostgreSQL::Test::Cluster->new('node3'); +$node3->init_from_backup($node1, 'backup2', + combine_with_prior => [ 'backup1' ]); +$node3->start(); + +done_testing(); diff --git a/src/bin/pg_combinebackup/t/009_no_full_file.pl b/src/bin/pg_combinebackup/t/009_no_full_file.pl new file mode 100644 index 0000000000000..8a23fa7a4cf88 --- /dev/null +++ b/src/bin/pg_combinebackup/t/009_no_full_file.pl @@ -0,0 +1,66 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use File::Copy; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Can be changed to test the other modes. +my $mode = $ENV{PG_TEST_PG_COMBINEBACKUP_MODE} || '--copy'; + +note "testing using mode $mode"; + +# Set up a new database instance. +my $primary = PostgreSQL::Test::Cluster->new('primary'); +$primary->init(has_archiving => 1, allows_streaming => 1); +$primary->append_conf('postgresql.conf', 'summarize_wal = on'); +$primary->start; + +# Take a full backup. +my $backup1path = $primary->backup_dir . '/backup1'; +$primary->command_ok( + [ 'pg_basebackup', '-D', $backup1path, '--no-sync', '-cfast' ], + "full backup"); + +# Take an incremental backup. +my $backup2path = $primary->backup_dir . '/backup2'; +$primary->command_ok( + [ + 'pg_basebackup', '-D', $backup2path, '--no-sync', '-cfast', + '--incremental', $backup1path . '/backup_manifest' + ], + "incremental backup"); + +# Find an incremental file in the incremental backup for which there is a full +# file in the full backup. When we find one, replace the full file with an +# incremental file. +my @filelist = grep { /^INCREMENTAL\./ } slurp_dir("$backup2path/base/1"); +my $success = 0; +for my $iname (@filelist) +{ + my $name = $iname; + $name =~ s/^INCREMENTAL.//; + + if (-f "$backup1path/base/1/$name") + { + copy("$backup2path/base/1/$iname", "$backup1path/base/1/$iname") + || die "copy $backup2path/base/1/$iname: $!"; + unlink("$backup1path/base/1/$name") + || die "unlink $backup1path/base/1/$name: $!"; + $success = 1; + last; + } +} + +# pg_combinebackup should fail. +my $outpath = $primary->backup_dir . '/out'; +$primary->command_fails_like( + [ + 'pg_combinebackup', $backup1path, $backup2path, '-o', $outpath, + ], + qr/full backup contains unexpected incremental file/, + "pg_combinebackup fails"); + +done_testing(); diff --git a/src/bin/pg_combinebackup/write_manifest.c b/src/bin/pg_combinebackup/write_manifest.c new file mode 100644 index 0000000000000..369d6d2071c75 --- /dev/null +++ b/src/bin/pg_combinebackup/write_manifest.c @@ -0,0 +1,295 @@ +/*------------------------------------------------------------------------- + * + * Write a new backup manifest. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/bin/pg_combinebackup/write_manifest.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres_fe.h" + +#include +#include +#include + +#include "common/checksum_helper.h" +#include "common/file_perm.h" +#include "common/logging.h" +#include "lib/stringinfo.h" +#include "load_manifest.h" +#include "mb/pg_wchar.h" +#include "write_manifest.h" + +struct manifest_writer +{ + char pathname[MAXPGPATH]; + int fd; + StringInfoData buf; + bool first_file; + bool still_checksumming; + pg_checksum_context manifest_ctx; +}; + +static void escape_json(StringInfo buf, const char *str); +static void flush_manifest(manifest_writer *mwriter); +static size_t hex_encode(const uint8 *src, size_t len, char *dst); + +/* + * Create a new backup manifest writer. + * + * The backup manifest will be written into a file named backup_manifest + * in the specified directory. + */ +manifest_writer * +create_manifest_writer(char *directory, uint64 system_identifier) +{ + manifest_writer *mwriter = pg_malloc(sizeof(manifest_writer)); + + snprintf(mwriter->pathname, MAXPGPATH, "%s/backup_manifest", directory); + mwriter->fd = -1; + initStringInfo(&mwriter->buf); + mwriter->first_file = true; + mwriter->still_checksumming = true; + pg_checksum_init(&mwriter->manifest_ctx, CHECKSUM_TYPE_SHA256); + + appendStringInfo(&mwriter->buf, + "{ \"PostgreSQL-Backup-Manifest-Version\": 2,\n" + "\"System-Identifier\": " UINT64_FORMAT ",\n" + "\"Files\": [", + system_identifier); + + return mwriter; +} + +/* + * Add an entry for a file to a backup manifest. + * + * This is very similar to the backend's AddFileToBackupManifest, but + * various adjustments are required due to frontend/backend differences + * and other details. + */ +void +add_file_to_manifest(manifest_writer *mwriter, const char *manifest_path, + size_t size, time_t mtime, + pg_checksum_type checksum_type, + int checksum_length, + uint8 *checksum_payload) +{ + int pathlen = strlen(manifest_path); + + if (mwriter->first_file) + { + appendStringInfoChar(&mwriter->buf, '\n'); + mwriter->first_file = false; + } + else + appendStringInfoString(&mwriter->buf, ",\n"); + + if (pg_encoding_verifymbstr(PG_UTF8, manifest_path, pathlen) == pathlen) + { + appendStringInfoString(&mwriter->buf, "{ \"Path\": "); + escape_json(&mwriter->buf, manifest_path); + appendStringInfoString(&mwriter->buf, ", "); + } + else + { + appendStringInfoString(&mwriter->buf, "{ \"Encoded-Path\": \""); + enlargeStringInfo(&mwriter->buf, 2 * pathlen); + mwriter->buf.len += hex_encode((const uint8 *) manifest_path, pathlen, + &mwriter->buf.data[mwriter->buf.len]); + appendStringInfoString(&mwriter->buf, "\", "); + } + + appendStringInfo(&mwriter->buf, "\"Size\": %zu, ", size); + + appendStringInfoString(&mwriter->buf, "\"Last-Modified\": \""); + enlargeStringInfo(&mwriter->buf, 128); + mwriter->buf.len += strftime(&mwriter->buf.data[mwriter->buf.len], 128, + "%Y-%m-%d %H:%M:%S %Z", + gmtime(&mtime)); + appendStringInfoChar(&mwriter->buf, '"'); + + if (mwriter->buf.len > 128 * 1024) + flush_manifest(mwriter); + + if (checksum_length > 0) + { + appendStringInfo(&mwriter->buf, + ", \"Checksum-Algorithm\": \"%s\", \"Checksum\": \"", + pg_checksum_type_name(checksum_type)); + + enlargeStringInfo(&mwriter->buf, 2 * checksum_length); + mwriter->buf.len += hex_encode(checksum_payload, checksum_length, + &mwriter->buf.data[mwriter->buf.len]); + + appendStringInfoChar(&mwriter->buf, '"'); + } + + appendStringInfoString(&mwriter->buf, " }"); + + if (mwriter->buf.len > 128 * 1024) + flush_manifest(mwriter); +} + +/* + * Finalize the backup_manifest. + */ +void +finalize_manifest(manifest_writer *mwriter, + manifest_wal_range *first_wal_range) +{ + uint8 checksumbuf[PG_SHA256_DIGEST_LENGTH]; + int len; + manifest_wal_range *wal_range; + + /* Terminate the list of files. */ + appendStringInfoString(&mwriter->buf, "\n],\n"); + + /* Start a list of LSN ranges. */ + appendStringInfoString(&mwriter->buf, "\"WAL-Ranges\": [\n"); + + for (wal_range = first_wal_range; wal_range != NULL; + wal_range = wal_range->next) + appendStringInfo(&mwriter->buf, + "%s{ \"Timeline\": %u, \"Start-LSN\": \"%X/%X\", \"End-LSN\": \"%X/%X\" }", + wal_range == first_wal_range ? "" : ",\n", + wal_range->tli, + LSN_FORMAT_ARGS(wal_range->start_lsn), + LSN_FORMAT_ARGS(wal_range->end_lsn)); + + /* Terminate the list of WAL ranges. */ + appendStringInfoString(&mwriter->buf, "\n],\n"); + + /* Flush accumulated data and update checksum calculation. */ + flush_manifest(mwriter); + + /* Checksum only includes data up to this point. */ + mwriter->still_checksumming = false; + + /* Compute and insert manifest checksum. */ + appendStringInfoString(&mwriter->buf, "\"Manifest-Checksum\": \""); + enlargeStringInfo(&mwriter->buf, 2 * PG_SHA256_DIGEST_STRING_LENGTH); + len = pg_checksum_final(&mwriter->manifest_ctx, checksumbuf); + Assert(len == PG_SHA256_DIGEST_LENGTH); + mwriter->buf.len += + hex_encode(checksumbuf, len, &mwriter->buf.data[mwriter->buf.len]); + appendStringInfoString(&mwriter->buf, "\"}\n"); + + /* Flush the last manifest checksum itself. */ + flush_manifest(mwriter); + + /* Close the file. */ + if (close(mwriter->fd) != 0) + pg_fatal("could not close file \"%s\": %m", mwriter->pathname); + mwriter->fd = -1; +} + +/* + * Produce a JSON string literal, properly escaping characters in the text. + */ +static void +escape_json(StringInfo buf, const char *str) +{ + const char *p; + + appendStringInfoCharMacro(buf, '"'); + for (p = str; *p; p++) + { + switch (*p) + { + case '\b': + appendStringInfoString(buf, "\\b"); + break; + case '\f': + appendStringInfoString(buf, "\\f"); + break; + case '\n': + appendStringInfoString(buf, "\\n"); + break; + case '\r': + appendStringInfoString(buf, "\\r"); + break; + case '\t': + appendStringInfoString(buf, "\\t"); + break; + case '"': + appendStringInfoString(buf, "\\\""); + break; + case '\\': + appendStringInfoString(buf, "\\\\"); + break; + default: + if ((unsigned char) *p < ' ') + appendStringInfo(buf, "\\u%04x", (int) *p); + else + appendStringInfoCharMacro(buf, *p); + break; + } + } + appendStringInfoCharMacro(buf, '"'); +} + +/* + * Flush whatever portion of the backup manifest we have generated and + * buffered in memory out to a file on disk. + * + * The first call to this function will create the file. After that, we + * keep it open and just append more data. + */ +static void +flush_manifest(manifest_writer *mwriter) +{ + if (mwriter->fd == -1 && + (mwriter->fd = open(mwriter->pathname, + O_WRONLY | O_CREAT | O_EXCL | PG_BINARY, + pg_file_create_mode)) < 0) + pg_fatal("could not open file \"%s\": %m", mwriter->pathname); + + if (mwriter->buf.len > 0) + { + ssize_t wb; + + wb = write(mwriter->fd, mwriter->buf.data, mwriter->buf.len); + if (wb != mwriter->buf.len) + { + if (wb < 0) + pg_fatal("could not write file \"%s\": %m", mwriter->pathname); + else + pg_fatal("could not write file \"%s\": wrote %d of %d", + mwriter->pathname, (int) wb, mwriter->buf.len); + } + + if (mwriter->still_checksumming && + pg_checksum_update(&mwriter->manifest_ctx, + (uint8 *) mwriter->buf.data, + mwriter->buf.len) < 0) + pg_fatal("could not update checksum of file \"%s\"", + mwriter->pathname); + resetStringInfo(&mwriter->buf); + } +} + +/* + * Encode bytes using two hexadecimal digits for each one. + */ +static size_t +hex_encode(const uint8 *src, size_t len, char *dst) +{ + const uint8 *end = src + len; + + while (src < end) + { + unsigned n1 = (*src >> 4) & 0xF; + unsigned n2 = *src & 0xF; + + *dst++ = n1 < 10 ? '0' + n1 : 'a' + n1 - 10; + *dst++ = n2 < 10 ? '0' + n2 : 'a' + n2 - 10; + ++src; + } + + return len * 2; +} diff --git a/src/bin/pg_combinebackup/write_manifest.h b/src/bin/pg_combinebackup/write_manifest.h new file mode 100644 index 0000000000000..ebc4f9441ada5 --- /dev/null +++ b/src/bin/pg_combinebackup/write_manifest.h @@ -0,0 +1,33 @@ +/*------------------------------------------------------------------------- + * + * Write a new backup manifest. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/bin/pg_combinebackup/write_manifest.h + * + *------------------------------------------------------------------------- + */ +#ifndef WRITE_MANIFEST_H +#define WRITE_MANIFEST_H + +#include "common/checksum_helper.h" + +struct manifest_wal_range; + +struct manifest_writer; +typedef struct manifest_writer manifest_writer; + +extern manifest_writer *create_manifest_writer(char *directory, + uint64 system_identifier); +extern void add_file_to_manifest(manifest_writer *mwriter, + const char *manifest_path, + size_t size, time_t mtime, + pg_checksum_type checksum_type, + int checksum_length, + uint8 *checksum_payload); +extern void finalize_manifest(manifest_writer *mwriter, + struct manifest_wal_range *first_wal_range); + +#endif /* WRITE_MANIFEST_H */ diff --git a/src/bin/pg_config/Makefile b/src/bin/pg_config/Makefile index 1a405f9c977e5..c54f68c9daddd 100644 --- a/src/bin/pg_config/Makefile +++ b/src/bin/pg_config/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/pg_config # -# Copyright (c) 1998-2023, PostgreSQL Global Development Group +# Copyright (c) 1998-2024, PostgreSQL Global Development Group # # src/bin/pg_config/Makefile # @@ -33,7 +33,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_config$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_config$(X) $(OBJS) rm -rf tmp_check diff --git a/src/bin/pg_config/meson.build b/src/bin/pg_config/meson.build index 7fd7e94e2d57f..b4fddd297abfa 100644 --- a/src/bin/pg_config/meson.build +++ b/src/bin/pg_config/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_config_sources = files( 'pg_config.c', diff --git a/src/bin/pg_config/nls.mk b/src/bin/pg_config/nls.mk index d86c28c404d68..faa45848428a9 100644 --- a/src/bin/pg_config/nls.mk +++ b/src/bin/pg_config/nls.mk @@ -1,3 +1,6 @@ # src/bin/pg_config/nls.mk CATALOG_NAME = pg_config -GETTEXT_FILES = pg_config.c ../../common/config_info.c ../../common/exec.c +GETTEXT_FILES = pg_config.c \ + ../../common/config_info.c \ + ../../common/exec.c \ + ../../common/fe_memutils.c diff --git a/src/bin/pg_config/pg_config.c b/src/bin/pg_config/pg_config.c index 70cab817ddd68..77d09ccfc47ca 100644 --- a/src/bin/pg_config/pg_config.c +++ b/src/bin/pg_config/pg_config.c @@ -15,7 +15,7 @@ * * This code is released under the terms of the PostgreSQL License. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/bin/pg_config/pg_config.c * diff --git a/src/bin/pg_config/po/de.po b/src/bin/pg_config/po/de.po index f20b719c4abde..63dd1889cdb32 100644 --- a/src/bin/pg_config/po/de.po +++ b/src/bin/pg_config/po/de.po @@ -1,14 +1,14 @@ # German message translation file for pg_config -# Peter Eisentraut , 2004 - 2023. +# Peter Eisentraut , 2004 - 2024. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 16\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-22 16:18+0000\n" -"PO-Revision-Date: 2023-04-22 23:05+0200\n" +"POT-Creation-Date: 2024-06-16 07:49+0000\n" +"PO-Revision-Date: 2024-03-26 10:37+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -23,35 +23,61 @@ msgstr "" msgid "not recorded" msgstr "nicht aufgezeichnet" -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "ungültige Programmdatei »%s«: %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "konnte Programmdatei »%s« nicht lesen: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "konnte kein »%s« zum Ausführen finden" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "konnte Pfad »%s« nicht in absolute Form auflösen: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "konnte Befehl »%s« nicht ausführen: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "konnte nicht von Befehl »%s« lesen: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "Befehl »%s« gab keine Daten zurück" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "Speicher aufgebraucht" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "Speicher aufgebraucht\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" + #: pg_config.c:74 #, c-format msgid "" diff --git a/src/bin/pg_config/po/el.po b/src/bin/pg_config/po/el.po index 5f96e8a2f7159..422d6d1c29a20 100644 --- a/src/bin/pg_config/po/el.po +++ b/src/bin/pg_config/po/el.po @@ -9,15 +9,15 @@ msgid "" msgstr "" "Project-Id-Version: pg_config (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-07-20 03:45+0000\n" -"PO-Revision-Date: 2021-07-20 10:27+0200\n" +"POT-Creation-Date: 2023-08-14 23:17+0000\n" +"PO-Revision-Date: 2023-08-15 13:21+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" +"X-Generator: Poedit 3.3.2\n" #: ../../common/config_info.c:134 ../../common/config_info.c:142 #: ../../common/config_info.c:150 ../../common/config_info.c:158 @@ -26,42 +26,32 @@ msgstr "" msgid "not recorded" msgstr "δεν έχει καταγÏαφεί" -#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 +#: ../../common/exec.c:172 #, c-format -msgid "could not identify current directory: %m" -msgstr "δεν ήταν δυνατή η αναγνώÏιση του Ï„Ïέχοντος καταλόγου: %m" +msgid "invalid binary \"%s\": %m" +msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»: %m" -#: ../../common/exec.c:155 +#: ../../common/exec.c:215 #, c-format -msgid "invalid binary \"%s\"" -msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»" +msgid "could not read binary \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»: %m" -#: ../../common/exec.c:205 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»" - -#: ../../common/exec.c:213 +#: ../../common/exec.c:223 #, c-format msgid "could not find a \"%s\" to execute" msgstr "δεν βÏέθηκε το αÏχείο «%s» για να εκτελεστεί" -#: ../../common/exec.c:269 ../../common/exec.c:308 +#: ../../common/exec.c:250 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "δεν δÏναται η επίλυση διαδÏομής «%s» σε απόλυτη μοÏφή: %m" -#: ../../common/exec.c:286 -#, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m" - -#: ../../common/exec.c:409 +#: ../../common/exec.c:412 #, c-format msgid "%s() failed: %m" msgstr "%s() απέτυχε: %m" -#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 msgid "out of memory" msgstr "έλλειψη μνήμης" @@ -186,8 +176,7 @@ msgstr " --cppflags εμφάνισε την τιμή CPPFLAGS που #: pg_config.c:96 #, c-format msgid " --cflags show CFLAGS value used when PostgreSQL was built\n" -msgstr "" -" --cflags εμφάνισε την τιμή CFLAGS που χÏησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" +msgstr " --cflags εμφάνισε την τιμή CFLAGS που χÏησιμοποιήθηκε κατά την κατασκευή της PostgreSQL\n" #: pg_config.c:97 #, c-format @@ -259,3 +248,18 @@ msgstr "%s: δεν ήταν δυνατή η εÏÏεση του ιδίου εκ #, c-format msgid "%s: invalid argument: %s\n" msgstr "%s: μη έγκυÏη παÏάμετÏος: %s\n" + +#~ msgid "could not change directory to \"%s\": %m" +#~ msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" + +#~ msgid "could not identify current directory: %m" +#~ msgstr "δεν ήταν δυνατή η αναγνώÏιση του Ï„Ïέχοντος καταλόγου: %m" + +#~ msgid "could not read binary \"%s\"" +#~ msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»" + +#~ msgid "could not read symbolic link \"%s\": %m" +#~ msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m" + +#~ msgid "invalid binary \"%s\"" +#~ msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»" diff --git a/src/bin/pg_config/po/es.po b/src/bin/pg_config/po/es.po index 4ea583846477a..2ebb19f2a50c9 100644 --- a/src/bin/pg_config/po/es.po +++ b/src/bin/pg_config/po/es.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_config (PostgreSQL) 16\n" +"Project-Id-Version: pg_config (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:18+0000\n" -"PO-Revision-Date: 2023-05-22 12:05+0200\n" +"POT-Creation-Date: 2025-02-16 19:48+0000\n" +"PO-Revision-Date: 2024-11-16 14:23+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -27,35 +27,61 @@ msgstr "" msgid "not recorded" msgstr "no registrado" -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "binario «%s» no válido: %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "no se pudo leer el binario «%s»: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "no se pudo encontrar un «%s» para ejecutar" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "no se pudo resolver la ruta «%s» a forma absoluta: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "no se pudo ejecutar la orden «%s»: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "no se pudo leer desde la orden «%s»: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "la orden «%s» no retornó datos" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() falló: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "memoria agotada" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "memoria agotada\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "no se puede duplicar un puntero nulo (error interno)\n" + #: pg_config.c:74 #, c-format msgid "" diff --git a/src/bin/pg_config/po/fr.po b/src/bin/pg_config/po/fr.po index 0fb56a72ab19b..3433a07cc2ef8 100644 --- a/src/bin/pg_config/po/fr.po +++ b/src/bin/pg_config/po/fr.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-12 05:16+0000\n" -"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"POT-Creation-Date: 2024-07-20 21:19+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -21,7 +21,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" #: ../../common/config_info.c:134 ../../common/config_info.c:142 #: ../../common/config_info.c:150 ../../common/config_info.c:158 @@ -30,45 +30,61 @@ msgstr "" msgid "not recorded" msgstr "non enregistré" -#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "n'a pas pu identifier le répertoire courant : %m" +msgid "invalid binary \"%s\": %m" +msgstr "binaire « %s » invalide : %m" -#: ../../common/exec.c:155 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "binaire « %s » invalide" +msgid "could not read binary \"%s\": %m" +msgstr "n'a pas pu lire le binaire « %s » : %m" -#: ../../common/exec.c:205 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "n'a pas pu lire le binaire « %s »" - -#: ../../common/exec.c:213 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "n'a pas pu trouver un « %s » à exécuter" -#: ../../common/exec.c:269 ../../common/exec.c:308 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "n'a pas pu résoudre le chemin « %s » en sa forme absolue : %m" + +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "n'a pas pu exécuter la commande « %s » : %m" + +#: ../../common/exec.c:394 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "n'a pas pu modifier le répertoire par « %s » : %m" +msgid "could not read from command \"%s\": %m" +msgstr "n'a pas pu lire à partir de la commande « %s » : %m" -#: ../../common/exec.c:286 +#: ../../common/exec.c:397 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "n'a pas pu lire le lien symbolique « %s » : %m" +msgid "no data was returned by command \"%s\"" +msgstr "aucune donnée n'a été renvoyée par la commande « %s »" -#: ../../common/exec.c:409 +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "échec de %s() : %m" -#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "mémoire épuisée" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "mémoire épuisée\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" + #: pg_config.c:74 #, c-format msgid "" @@ -112,8 +128,7 @@ msgstr " --docdir affiche l'emplacement des fichiers de documentat #: pg_config.c:80 #, c-format msgid " --htmldir show location of HTML documentation files\n" -msgstr "" -" --htmldir affiche l'emplacement des fichiers de documentation HTML\n" +msgstr " --htmldir affiche l'emplacement des fichiers de documentation HTML\n" #: pg_config.c:81 #, c-format @@ -127,8 +142,7 @@ msgstr "" #: pg_config.c:83 #, c-format msgid " --pkgincludedir show location of other C header files\n" -msgstr "" -" --pkgincludedir affiche l'emplacement des autres fichiers d'en-tête C\n" +msgstr " --pkgincludedir affiche l'emplacement des autres fichiers d'en-tête C\n" #: pg_config.c:84 #, c-format @@ -290,36 +304,3 @@ msgstr "%s : n'a pas pu trouver l'exécutable du programme\n" #, c-format msgid "%s: invalid argument: %s\n" msgstr "%s : argument invalide : %s\n" - -#~ msgid "Report bugs to .\n" -#~ msgstr "Rapporter les bogues à .\n" - -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide puis quitte\n" - -#~ msgid "child process exited with unrecognized status %d" -#~ msgstr "le processus fils a quitté avec un statut %d non reconnu" - -#~ msgid "child process was terminated by signal %d" -#~ msgstr "le processus fils a été terminé par le signal %d" - -#~ msgid "child process was terminated by signal %s" -#~ msgstr "le processus fils a été terminé par le signal %s" - -#~ msgid "child process was terminated by exception 0x%X" -#~ msgstr "le processus fils a été terminé par l'exception 0x%X" - -#~ msgid "child process exited with exit code %d" -#~ msgstr "le processus fils a quitté avec le code de sortie %d" - -#~ msgid "could not change directory to \"%s\"" -#~ msgstr "n'a pas pu accéder au répertoire « %s »" - -#~ msgid "could not read symbolic link \"%s\"" -#~ msgstr "n'a pas pu lire le lien symbolique « %s »" - -#~ msgid "could not change directory to \"%s\": %s" -#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s" - -#~ msgid "pclose failed: %m" -#~ msgstr "échec de pclose : %m" diff --git a/src/bin/pg_config/po/ja.po b/src/bin/pg_config/po/ja.po index b770bab7e6de4..f2825c82b95d0 100644 --- a/src/bin/pg_config/po/ja.po +++ b/src/bin/pg_config/po/ja.po @@ -1,14 +1,14 @@ # Japanese message translation file for pg_config -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # Shigehiro Honda , 2005 # msgid "" msgstr "" -"Project-Id-Version: pg_config (PostgreSQL 16)\n" +"Project-Id-Version: pg_config (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-03-24 09:21+0900\n" -"PO-Revision-Date: 2023-03-24 14:10+0900\n" +"POT-Creation-Date: 2024-03-11 09:58+0900\n" +"PO-Revision-Date: 2024-03-11 16:20+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -25,32 +25,47 @@ msgstr "" msgid "not recorded" msgstr "記録ã•れã¦ã„ã¾ã›ã‚“" -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "䏿­£ãªãƒã‚¤ãƒŠãƒª\"%s\": %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "ãƒã‚¤ãƒŠãƒª\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "実行ã™ã‚‹\"%s\"ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "パス\"%s\"を絶対パス形å¼ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "コマンド\"%s\"を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "コマンド\"%s\"ã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "コマンド\"%s\"ãŒãƒ‡ãƒ¼ã‚¿ã‚’è¿”å´ã—ã¾ã›ã‚“ã§ã—ãŸ" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s()ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "メモリä¸è¶³ã§ã™" diff --git a/src/bin/pg_config/po/ka.po b/src/bin/pg_config/po/ka.po index ee27824ac3109..f0014e3c1fde7 100644 --- a/src/bin/pg_config/po/ka.po +++ b/src/bin/pg_config/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_config (PostgreSQL) 16\n" +"Project-Id-Version: pg_config (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-19 11:17+0000\n" -"PO-Revision-Date: 2023-04-20 08:19+0200\n" +"POT-Creation-Date: 2024-07-01 03:49+0000\n" +"PO-Revision-Date: 2024-03-10 20:43+0100\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../common/config_info.c:134 ../../common/config_info.c:142 #: ../../common/config_info.c:150 ../../common/config_info.c:158 @@ -25,35 +25,61 @@ msgstr "" msgid "not recorded" msgstr "ჩáƒáƒ¬áƒ”რილი áƒáƒ áƒáƒ" -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ \"%s\": %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "გáƒáƒ¡áƒáƒ¨áƒ•ებáƒáƒ“ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" პáƒáƒ•ნრშეუძლებელიáƒ" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "ბილიკის (\"%s\") áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ  ფáƒáƒ áƒ›áƒáƒ¨áƒ˜ áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "ბრძáƒáƒœáƒ”ბის (\"%s\") შესრულების შეცდáƒáƒ›áƒ: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "ბრძáƒáƒœáƒ”ბიდáƒáƒœ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "ბრძáƒáƒœáƒ”ბáƒáƒ› \"%s\" მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  დáƒáƒáƒ‘რუნáƒ" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" + #: pg_config.c:74 #, c-format msgid "" diff --git a/src/bin/pg_config/po/ko.po b/src/bin/pg_config/po/ko.po index 2d44f89e73124..e735330275b57 100644 --- a/src/bin/pg_config/po/ko.po +++ b/src/bin/pg_config/po/ko.po @@ -3,10 +3,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_config (PostgreSQL) 13\n" +"Project-Id-Version: pg_config (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 20:44+0000\n" -"PO-Revision-Date: 2020-10-06 11:15+0900\n" +"POT-Creation-Date: 2025-01-17 04:48+0000\n" +"PO-Revision-Date: 2025-01-16 12:53+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean team \n" "Language: ko\n" @@ -22,45 +22,61 @@ msgstr "" msgid "not recorded" msgstr "기ë¡ë˜ì–´ 있지 않ìŒ" -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "현재 디렉터리를 알 수 ì—†ìŒ: %m" +msgid "invalid binary \"%s\": %m" +msgstr "\"%s\" 파ì¼ì€ ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼ìž„: %m" -#: ../../common/exec.c:156 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼: \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: ../../common/exec.c:206 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ" - -#: ../../common/exec.c:214 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "실행할 \"%s\" íŒŒì¼ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "\"%s\" 경로를 절대경로로 바꿀 수 ì—†ìŒ: %m" + +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "\"%s\" ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ: %m" + +#: ../../common/exec.c:394 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "\"%s\" 디렉터리로 바꿀 수 ì—†ìŒ: %m" +msgid "could not read from command \"%s\": %m" +msgstr "\"%s\" 명령으로부터 ì½ì„ 수 ì—†ìŒ: %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:397 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "\"%s\" 심벌릭 ë§í¬ë¥¼ ì½ì„ 수 ì—†ìŒ: %m" +msgid "no data was returned by command \"%s\"" +msgstr "\"%s\" ëª…ë ¹ì´ ì•„ë¬´ëŸ° ë°ì´í„°ë¥¼ 반환하지 않ìŒ" -#: ../../common/exec.c:410 +#: ../../common/exec.c:424 #, c-format -msgid "pclose failed: %m" -msgstr "pclose 실패: %m" +msgid "%s() failed: %m" +msgstr "%s() 실패: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "메모리 부족" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "메모리 부족\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ë„ í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" + #: pg_config.c:74 #, c-format msgid "" diff --git a/src/bin/pg_config/po/meson.build b/src/bin/pg_config/po/meson.build index f515af816ea6a..4db4bda6356c8 100644 --- a/src/bin/pg_config/po/meson.build +++ b/src/bin/pg_config/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_config-' + pg_version_major.to_string())] diff --git a/src/bin/pg_config/po/pt_BR.po b/src/bin/pg_config/po/pt_BR.po index 4ab4c93f69f16..306f9fa97b70a 100644 --- a/src/bin/pg_config/po/pt_BR.po +++ b/src/bin/pg_config/po/pt_BR.po @@ -1,15 +1,15 @@ # Brazilian Portuguese message translation file for pg_config # -# Copyright (C) 2004-2022 PostgreSQL Global Development Group +# Copyright (C) 2004-2023 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # -# Euler Taveira , 2004-2022. +# Euler Taveira , 2004-2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-10 18:27-0300\n" +"POT-Creation-Date: 2024-01-02 13:00-0300\n" "PO-Revision-Date: 2005-10-04 22:15-0300\n" "Last-Translator: Euler Taveira \n" "Language-Team: Brazilian Portuguese \n" @@ -25,42 +25,32 @@ msgstr "" msgid "not recorded" msgstr "não informado" -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:172 #, c-format -msgid "could not identify current directory: %m" -msgstr "não pôde identificar diretório atual: %m" +msgid "invalid binary \"%s\": %m" +msgstr "binário \"%s\" é inválido: %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:215 #, c-format -msgid "invalid binary \"%s\"" -msgstr "binário \"%s\" é inválido" +msgid "could not read binary \"%s\": %m" +msgstr "não pôde ler o binário \"%s\": %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "não pôde ler o binário \"%s\"" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:223 #, c-format msgid "could not find a \"%s\" to execute" msgstr "não pôde encontrar o \"%s\" para executá-lo" -#: ../../common/exec.c:282 ../../common/exec.c:321 -#, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "não pôde mudar diretório para \"%s\": %m" - -#: ../../common/exec.c:299 +#: ../../common/exec.c:250 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "não pôde ler link simbólico \"%s\": %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "não pôde resolver caminho \"%s\" para forma absoluta: %m" -#: ../../common/exec.c:422 +#: ../../common/exec.c:412 #, c-format msgid "%s() failed: %m" msgstr "%s() falhou: %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 msgid "out of memory" msgstr "sem memória" diff --git a/src/bin/pg_config/po/ru.po b/src/bin/pg_config/po/ru.po index a627eb5f5e53d..0a86bbb455c6d 100644 --- a/src/bin/pg_config/po/ru.po +++ b/src/bin/pg_config/po/ru.po @@ -5,21 +5,21 @@ # Serguei A. Mokhov , 2004-2005. # Sergey Burladyan , 2009, 2012. # Andrey Sudnik , 2010. -# Alexander Lakhin , 2012-2016, 2017, 2019, 2020, 2021. +# Alexander Lakhin , 2012-2016, 2017, 2019, 2020, 2021, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: pg_config (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-27 14:52+0300\n" -"PO-Revision-Date: 2021-09-04 12:15+0300\n" +"POT-Creation-Date: 2024-09-02 09:29+0300\n" +"PO-Revision-Date: 2024-09-04 13:45+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../../common/config_info.c:134 ../../common/config_info.c:142 #: ../../common/config_info.c:150 ../../common/config_info.c:158 @@ -28,45 +28,61 @@ msgstr "" msgid "not recorded" msgstr "не запиÑано" -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "не удалоÑÑŒ определить текущий каталог: %m" +msgid "invalid binary \"%s\": %m" +msgstr "неверный иÑполнÑемый файл \"%s\": %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "неверный иÑполнÑемый файл \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\": %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\"" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "не удалоÑÑŒ найти запуÑкаемый файл \"%s\"" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "не удалоÑÑŒ преобразовать отноÑительный путь \"%s\" в абÑолютный: %m" + +#: ../../common/exec.c:382 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m" +msgid "could not execute command \"%s\": %m" +msgstr "не удалоÑÑŒ выполнить команду \"%s\": %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:394 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m" +msgid "could not read from command \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать вывод команды \"%s\": %m" -#: ../../common/exec.c:422 +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "команда \"%s\" не выдала данные" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "нехватка памÑти" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "нехватка памÑти\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" + #: pg_config.c:74 #, c-format msgid "" @@ -301,6 +317,14 @@ msgstr "%s: не удалоÑÑŒ найти Ñвой иÑполнÑемый фа msgid "%s: invalid argument: %s\n" msgstr "%s: неверный аргумент: %s\n" +#, c-format +#~ msgid "could not identify current directory: %m" +#~ msgstr "не удалоÑÑŒ определить текущий каталог: %m" + +#, c-format +#~ msgid "could not read symbolic link \"%s\": %m" +#~ msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m" + #~ msgid "Report bugs to .\n" #~ msgstr "Об ошибках Ñообщайте по адреÑу .\n" diff --git a/src/bin/pg_config/po/sv.po b/src/bin/pg_config/po/sv.po index 642168035f591..d729e3053217d 100644 --- a/src/bin/pg_config/po/sv.po +++ b/src/bin/pg_config/po/sv.po @@ -1,13 +1,13 @@ # Swedish message translation file for pg_config. -# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021. +# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # Mats Erik Andersson , 2014. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-11-06 22:15+0000\n" -"PO-Revision-Date: 2021-11-07 06:44+0100\n" +"POT-Creation-Date: 2024-07-12 14:19+0000\n" +"PO-Revision-Date: 2024-07-12 18:58+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -23,45 +23,61 @@ msgstr "" msgid "not recorded" msgstr "ej sparad" -#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "kunde inte identifiera aktuell katalog: %m" +msgid "invalid binary \"%s\": %m" +msgstr "ogiltig binär \"%s\": %m" -#: ../../common/exec.c:155 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "ogiltig binär \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "kunde inte läsa binär \"%s\": %m" -#: ../../common/exec.c:205 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "kunde inte läsa binär \"%s\"" - -#: ../../common/exec.c:213 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "kunde inte hitta en \"%s\" att köra" -#: ../../common/exec.c:269 ../../common/exec.c:308 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "kunde inte konvertera sökvägen \"%s\" till en absolut sökväg: %m" + +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "kunde inte köra kommandot \"%s\": %m" + +#: ../../common/exec.c:394 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "kunde inte byta katalog till \"%s\": %m" +msgid "could not read from command \"%s\": %m" +msgstr "kunde inte läsa frÃ¥n kommando \"%s\": %m" -#: ../../common/exec.c:286 +#: ../../common/exec.c:397 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "kan inte läsa symbolisk länk \"%s\": %m" +msgid "no data was returned by command \"%s\"" +msgstr "ingen data returnerades frÃ¥n kommandot \"%s\"" -#: ../../common/exec.c:409 +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() misslyckades: %m" -#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "slut pÃ¥ minne" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "slut pÃ¥ minne\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kan inte duplicera null-pekare (internt fel)\n" + #: pg_config.c:74 #, c-format msgid "" diff --git a/src/bin/pg_config/po/uk.po b/src/bin/pg_config/po/uk.po index 30681dbd51f79..ad38f026516c6 100644 --- a/src/bin/pg_config/po/uk.po +++ b/src/bin/pg_config/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:47+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:19+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pg_config.pot\n" -"X-Crowdin-File-ID: 926\n" +"X-Crowdin-File: /REL_17_STABLE/pg_config.pot\n" +"X-Crowdin-File-ID: 1024\n" #: ../../common/config_info.c:134 ../../common/config_info.c:142 #: ../../common/config_info.c:150 ../../common/config_info.c:158 @@ -24,45 +24,61 @@ msgstr "" msgid "not recorded" msgstr "не запиÑано" -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ поточний каталог: %m" +msgid "invalid binary \"%s\": %m" +msgstr "невірний бінарний файл \"%s\": %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "невірний бінарний файл \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ бінарний файл \"%s\": %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "неможливо прочитати бінарний файл \"%s\"" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "неможливо знайти \"%s\" Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ абÑолютний шлÑÑ… \"%s\": %m" + +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ команду \"%s\": %m" + +#: ../../common/exec.c:394 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ каталог на \"%s\": %m" +msgid "could not read from command \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ виÑновок команди \"%s\": %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:397 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "не можливо прочитати Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m" +msgid "no data was returned by command \"%s\"" +msgstr "команда \"%s\" не повернула жодних даних" -#: ../../common/exec.c:422 +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() помилка: %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "недоÑтатньо пам'Ñті" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "недоÑтатньо пам'Ñті\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" + #: pg_config.c:74 #, c-format msgid "\n" diff --git a/src/bin/pg_config/po/zh_CN.po b/src/bin/pg_config/po/zh_CN.po index 8c32e10321f30..b12c1e2da620b 100644 --- a/src/bin/pg_config/po/zh_CN.po +++ b/src/bin/pg_config/po/zh_CN.po @@ -1,20 +1,20 @@ # SOME DESCRIPTIVE TITLE. # This file is put in the public domain. -# FIRST AUTHOR , YEAR. +# Dianjin Wang , 2024 # msgid "" msgstr "" -"Project-Id-Version: pg_config (PostgreSQL) 14\n" +"Project-Id-Version: pg_config (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-08-14 05:46+0000\n" -"PO-Revision-Date: 2021-08-15 17:25+0800\n" -"Last-Translator: Jie Zhang \n" +"POT-Creation-Date: 2024-09-13 22:51+0000\n" +"PO-Revision-Date: 2024-09-14 12:07+0800\n" +"Last-Translator: Dianjin Wang \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.5.4\n" +"X-Generator: Poedit 3.4.4\n" #: ../../common/config_info.c:134 ../../common/config_info.c:142 #: ../../common/config_info.c:150 ../../common/config_info.c:158 @@ -23,44 +23,61 @@ msgstr "" msgid "not recorded" msgstr "没有被记录" -#: ../../common/exec.c:136 ../../common/exec.c:253 ../../common/exec.c:299 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "无法确认当å‰ç›®å½•: %m" +msgid "invalid binary \"%s\": %m" +msgstr "无效的二进制 \"%s\": %m" -#: ../../common/exec.c:155 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "æ— æ•ˆçš„äºŒè¿›åˆ¶ç  \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "无法读å–二进制 \"%s\": %m" -#: ../../common/exec.c:205 +#: ../../common/exec.c:225 #, c-format -msgid "could not read binary \"%s\"" -msgstr "无法读å–äºŒè¿›åˆ¶ç  \"%s\"" +msgid "could not find a \"%s\" to execute" +msgstr "未能找到一个 \"%s\" 予以执行" -#: ../../common/exec.c:213 +#: ../../common/exec.c:252 #, c-format -msgid "could not find a \"%s\" to execute" -msgstr "未能找到一个 \"%s\" æ¥æ‰§è¡Œ" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "无法将路径 \"%s\" è§£æžä¸ºç»å¯¹è·¯å¾„æ ¼å¼: %m" -#: ../../common/exec.c:269 ../../common/exec.c:308 +#: ../../common/exec.c:382 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "无法跳转到目录 \"%s\" 中: %m" +msgid "could not execute command \"%s\": %m" +msgstr "无法执行命令 \"%s\": %m" -#: ../../common/exec.c:286 +#: ../../common/exec.c:394 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "无法读å–符å·é“¾æŽ¥ \"%s\": %m" +msgid "could not read from command \"%s\": %m" +msgstr "无法读å–命令 \"%s\": %m" -#: ../../common/exec.c:409 +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "命令 \"%s\" 未返回数æ®" + +#: ../../common/exec.c:424 +#, c-format msgid "%s() failed: %m" -msgstr "%s()失败: %m" +msgstr "%s() 失败: %m" -#: ../../common/exec.c:522 ../../common/exec.c:567 ../../common/exec.c:659 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "内存ä¸è¶³" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "内存ä¸è¶³\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "无法å¤åˆ¶ç©ºæŒ‡é’ˆ (内部错误)\n" + #: pg_config.c:74 #, c-format msgid "" @@ -69,7 +86,7 @@ msgid "" "\n" msgstr "" "\n" -"%s æä¾› PostgreSQL 的安装信æ¯.\n" +"%s æä¾›æ‰€å®‰è£… PostgreSQL 版本的信æ¯.\n" "\n" #: pg_config.c:75 @@ -82,7 +99,9 @@ msgstr "使用方法:\n" msgid "" " %s [OPTION]...\n" "\n" -msgstr " %s [选项]...\n" +msgstr "" +" %s [选项]...\n" +"\n" #: pg_config.c:77 #, c-format @@ -92,17 +111,17 @@ msgstr "选项:\n" #: pg_config.c:78 #, c-format msgid " --bindir show location of user executables\n" -msgstr " --bindir 显示执行文件所在ä½ç½®\n" +msgstr " --bindir 显示用户执行文件所在ä½ç½®\n" #: pg_config.c:79 #, c-format msgid " --docdir show location of documentation files\n" -msgstr " --docdir 显示文档所在ä½ç½®\n" +msgstr " --docdir 显示文档文件所在ä½ç½®\n" #: pg_config.c:80 #, c-format msgid " --htmldir show location of HTML documentation files\n" -msgstr " --htmldir 显示HTML文档文件所在ä½ç½®\n" +msgstr " --htmldir 显示 HTML 文档文件所在ä½ç½®\n" #: pg_config.c:81 #, c-format @@ -110,18 +129,18 @@ msgid "" " --includedir show location of C header files of the client\n" " interfaces\n" msgstr "" -" --includedir æ˜¾ç¤ºå®¢æˆ·ç«¯æŽ¥å£ C 头文件所在\n" +" --includedir æ˜¾ç¤ºå®¢æˆ·ç«¯æŽ¥å£ C 语言头文件所在\n" " ä½ç½®\n" #: pg_config.c:83 #, c-format msgid " --pkgincludedir show location of other C header files\n" -msgstr " --pkgincludedir 显示其它C语言头文件所在的ä½ç½®\n" +msgstr " --pkgincludedir 显示其它 C 语言头文件所在ä½ç½®\n" #: pg_config.c:84 #, c-format msgid " --includedir-server show location of C header files for the server\n" -msgstr " --includedir-server 显示æœåŠ¡ç«¯ C 头文件所在ä½ç½®\n" +msgstr " --includedir-server 显示æœåŠ¡å™¨ç«¯ C 语言头文件所在ä½ç½®\n" #: pg_config.c:85 #, c-format @@ -151,7 +170,7 @@ msgstr " --sharedir æ˜¾ç¤ºç‹¬ç«‹æž¶æž„æ”¯æŒæ–‡ä»¶æ‰€åœ¨ä½ç½®\n" #: pg_config.c:90 #, c-format msgid " --sysconfdir show location of system-wide configuration files\n" -msgstr " --sysconfdir 显示系统范围的é…置文件的所在ä½ç½®\n" +msgstr " --sysconfdir 显示系统范围的é…置文件所在ä½ç½®\n" #: pg_config.c:91 #, c-format @@ -164,53 +183,53 @@ msgid "" " --configure show options given to \"configure\" script when\n" " PostgreSQL was built\n" msgstr "" -" --configure 显示编译 PostgreSQL æ—¶ \"configure\"\n" -" 的选项\n" +" --configure 显示在编译 PostgreSQL æ—¶ \"configure\" 脚本\n" +" 的所用选项\n" #: pg_config.c:94 #, c-format msgid " --cc show CC value used when PostgreSQL was built\n" -msgstr " --cc 显示在创建PostgreSQL时所使用的CC值\n" +msgstr " --cc 显示在编译 PostgreSQL 时所使用的 CC 值\n" #: pg_config.c:95 #, c-format msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n" -msgstr " --cppflags 当创建PostgreSQL时显示CPPFLAGS的值\n" +msgstr " --cppflags 显示在编译 PostgreSQL 时所使用的 CPPFLAGS 值\n" #: pg_config.c:96 #, c-format msgid " --cflags show CFLAGS value used when PostgreSQL was built\n" -msgstr " --cflags 显示在创建PostgreSQL时所使用的CFLAG值\n" +msgstr " --cflags 显示在编译 PostgreSQL 时所使用的 CFLAGS 值\n" #: pg_config.c:97 #, c-format msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n" -msgstr " --cflags_sl 当创建PostgreSQL时显示CFLAGS_SL的值\n" +msgstr " --cflags_sl 显示在编译 PostgreSQL 时所使用的 CFLAGS_SL 值\n" #: pg_config.c:98 #, c-format msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n" -msgstr " --ldflags 显示在创建PostgreSQL时所使用的LDFLAG值\n" +msgstr " --ldflags 显示在编译 PostgreSQL 时所使用的 LDFLAGS 值\n" #: pg_config.c:99 #, c-format msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n" -msgstr " --ldflags_ex 当创建PostgreSQL时显示LDFLAGS_EX的值\n" +msgstr " --ldflags_ex 显示在编译 PostgreSQL 时所使用的 LDFLAGS_EX 值\n" #: pg_config.c:100 #, c-format msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n" -msgstr " --ldflags_sl 当创建PostgreSQL时显示LDFLAGS_SL的值\n" +msgstr " --ldflags_sl 显示在编译 PostgreSQL 时所使用的 LDFLAGS_SL 值\n" #: pg_config.c:101 #, c-format msgid " --libs show LIBS value used when PostgreSQL was built\n" -msgstr " --libs 显示在创建PostgreSQL时所使用的LIBS值\n" +msgstr " --libs 显示在编译 PostgreSQL 时所使用的 LIBS 值\n" #: pg_config.c:102 #, c-format msgid " --version show the PostgreSQL version\n" -msgstr " --version 显示PostgreSQL的版本信æ¯\n" +msgstr " --version 显示 PostgreSQL 的版本信æ¯\n" #: pg_config.c:103 #, c-format @@ -225,13 +244,13 @@ msgid "" "\n" msgstr "" "\n" -"æ²¡æœ‰å‚æ•°,将显示所有已知的æˆå‘˜.\n" +"æ²¡æœ‰å‚æ•°, 将显示所有已知æ¡ç›®.\n" "\n" #: pg_config.c:105 #, c-format msgid "Report bugs to <%s>.\n" -msgstr "臭虫报告至<%s>.\n" +msgstr "报告缺陷: <%s>.\n" #: pg_config.c:106 #, c-format @@ -246,10 +265,29 @@ msgstr "请用 \"%s --help\" èŽ·å–æ›´å¤šçš„ä¿¡æ¯.\n" #: pg_config.c:154 #, c-format msgid "%s: could not find own program executable\n" -msgstr "%s: 无法找到执行文件\n" +msgstr "%s: 无法找到所属执行程åº\n" #: pg_config.c:181 #, c-format msgid "%s: invalid argument: %s\n" msgstr "%s: æ— æ•ˆå‚æ•°: %s\n" +#, c-format +#~ msgid "could not change directory to \"%s\": %m" +#~ msgstr "无法跳转到目录 \"%s\" 中: %m" + +#, c-format +#~ msgid "could not identify current directory: %m" +#~ msgstr "无法确认当å‰ç›®å½•: %m" + +#, c-format +#~ msgid "could not read binary \"%s\"" +#~ msgstr "无法读å–äºŒè¿›åˆ¶ç  \"%s\"" + +#, c-format +#~ msgid "could not read symbolic link \"%s\": %m" +#~ msgstr "无法读å–符å·é“¾æŽ¥ \"%s\": %m" + +#, c-format +#~ msgid "invalid binary \"%s\"" +#~ msgstr "æ— æ•ˆçš„äºŒè¿›åˆ¶ç  \"%s\"" diff --git a/src/bin/pg_config/po/zh_TW.po b/src/bin/pg_config/po/zh_TW.po index d7780000c2187..e5c695ad08f0c 100644 --- a/src/bin/pg_config/po/zh_TW.po +++ b/src/bin/pg_config/po/zh_TW.po @@ -1,30 +1,84 @@ # Traditional Chinese message translation file for pg_config -# Copyright (C) 2011 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_config (PostgreSQL) package. # 2004-12-13 Zhenbang Wei # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.1\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2011-05-11 20:40+0000\n" -"PO-Revision-Date: 2013-09-03 23:27-0400\n" +"Project-Id-Version: pg_config (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-08 21:48+0000\n" +"PO-Revision-Date: 2023-11-06 08:49+0800\n" "Last-Translator: Zhenbang Wei \n" -"Language-Team: EnterpriseDB translation team \n" +"Language-Team: \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.4.1\n" -#: pg_config.c:243 pg_config.c:259 pg_config.c:275 pg_config.c:291 -#: pg_config.c:307 pg_config.c:323 pg_config.c:339 pg_config.c:355 -#: pg_config.c:371 +#: ../../common/config_info.c:134 ../../common/config_info.c:142 +#: ../../common/config_info.c:150 ../../common/config_info.c:158 +#: ../../common/config_info.c:166 ../../common/config_info.c:174 +#: ../../common/config_info.c:182 ../../common/config_info.c:190 +msgid "not recorded" +msgstr "未紀錄" + +# command.c:122 +#: ../../common/exec.c:172 +#, c-format +msgid "invalid binary \"%s\": %m" +msgstr "無效的執行檔 \"%s\": %m" + +# command.c:1103 +#: ../../common/exec.c:215 #, c-format -msgid "not recorded\n" -msgstr "沒有紀錄\n" +msgid "could not read binary \"%s\": %m" +msgstr "無法讀å–執行檔 \"%s\": %m" -#: pg_config.c:428 +#: ../../common/exec.c:223 +#, c-format +msgid "could not find a \"%s\" to execute" +msgstr "找ä¸åˆ°å¯åŸ·è¡Œçš„ \"%s\"" + +# utils/error/elog.c:1128 +#: ../../common/exec.c:250 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "無法將路徑 \"%s\" è§£æžç‚ºçµ•å°è·¯å¾‘: %m" + +# fe-misc.c:991 +#: ../../common/exec.c:412 +#, c-format +msgid "%s() failed: %m" +msgstr "%s() 失敗: %m" + +# commands/sequence.c:798 executor/execGrouping.c:328 +# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43 +# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006 +# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527 +# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623 +# postmaster/postmaster.c:755 postmaster/postmaster.c:1625 +# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139 +# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766 +# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138 +# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297 +# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73 +# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191 +# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164 +# utils/cache/relcache.c:178 utils/cache/relcache.c:1130 +# utils/cache/typcache.c:165 utils/cache/typcache.c:487 +# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532 +# utils/init/miscinit.c:213 utils/init/miscinit.c:234 +# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911 +# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503 +# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75 +#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +msgid "out of memory" +msgstr "記憶體ä¸è¶³" + +#: pg_config.c:74 #, c-format msgid "" "\n" @@ -32,168 +86,153 @@ msgid "" "\n" msgstr "" "\n" -"%s é¡¯ç¤ºå·²å®‰è£ PostgreSQL 資訊。\n" +"%s æä¾›é—œæ–¼å·²å®‰è£ PostgreSQL 版本的資訊。\n" "\n" -#: pg_config.c:429 +#: pg_config.c:75 #, c-format msgid "Usage:\n" -msgstr "使用方法:\n" +msgstr "用法:\n" -#: pg_config.c:430 +#: pg_config.c:76 #, c-format msgid "" " %s [OPTION]...\n" "\n" msgstr "" -" %s [é¸é …]...\n" +" %s [OPTION]...\n" "\n" -#: pg_config.c:431 +#: pg_config.c:77 #, c-format msgid "Options:\n" msgstr "é¸é …:\n" -#: pg_config.c:432 +#: pg_config.c:78 #, c-format msgid " --bindir show location of user executables\n" -msgstr " --bindir 顯示執行檔ä½ç½®\n" +msgstr " --bindir 顯示使用者å¯åŸ·è¡Œæª”çš„ä½ç½®\n" -#: pg_config.c:433 +#: pg_config.c:79 #, c-format msgid " --docdir show location of documentation files\n" -msgstr " --docdir 顯示文件檔ä½ç½®\n" +msgstr " --docdir 顯示文件檔的ä½ç½®\n" -#: pg_config.c:434 +#: pg_config.c:80 #, c-format msgid " --htmldir show location of HTML documentation files\n" -msgstr " --htmldir 顯示 HTML 文件檔ä½ç½®\n" +msgstr " --htmldir 顯示 HTML 文件檔的ä½ç½®\n" -#: pg_config.c:435 +#: pg_config.c:81 #, c-format msgid "" " --includedir show location of C header files of the client\n" " interfaces\n" -msgstr " --includedir é¡¯ä½¿ç”¨æˆ¶ç«¯ä»‹é¢ C 標頭檔ä½ç½®\n" +msgstr " --includedir é¡¯ç¤ºå®¢æˆ¶ç«¯ä»‹é¢ C 標頭檔的ä½ç½®\n" -#: pg_config.c:437 +#: pg_config.c:83 #, c-format msgid " --pkgincludedir show location of other C header files\n" -msgstr " --pkgincludedir 顯示其他 C 標頭檔ä½ç½®\n" +msgstr " --pkgincludedir 顯示其他 C 標頭檔的ä½ç½®\n" -#: pg_config.c:438 +#: pg_config.c:84 #, c-format -msgid "" -" --includedir-server show location of C header files for the server\n" -msgstr " --includedir-server 顯示伺æœå™¨ C 標頭檔ä½ç½®\n" +msgid " --includedir-server show location of C header files for the server\n" +msgstr " --includedir-server 顯示伺æœå™¨ C 標頭檔的ä½ç½®\n" -#: pg_config.c:439 +#: pg_config.c:85 #, c-format msgid " --libdir show location of object code libraries\n" -msgstr " --libdir 顯示程å¼åº«ä½ç½®\n" +msgstr " --libdir 顯示目的碼程å¼åº«çš„ä½ç½®\n" -#: pg_config.c:440 +#: pg_config.c:86 #, c-format msgid " --pkglibdir show location of dynamically loadable modules\n" -msgstr " --pkglibdir 顯示å¯å‹•態載入模組ä½ç½®\n" +msgstr " --pkglibdir 顯示動態載入模組的ä½ç½®\n" -#: pg_config.c:441 +#: pg_config.c:87 #, c-format msgid " --localedir show location of locale support files\n" -msgstr " --localedir 顯示å€åŸŸæ”¯æ´æª”ä½ç½®\n" +msgstr " --localedir 顯示å€åŸŸæ”¯æ´æª”çš„ä½ç½®\n" -#: pg_config.c:442 +#: pg_config.c:88 #, c-format msgid " --mandir show location of manual pages\n" -msgstr " --mandir 顯示使用說明ä½ç½®\n" +msgstr " --mandir 顯示使用手冊的ä½ç½®\n" -#: pg_config.c:443 +#: pg_config.c:89 #, c-format -msgid "" -" --sharedir show location of architecture-independent support " -"files\n" -msgstr " --sharedir é¡¯ç¤ºèˆ‡æž¶æ§‹ç„¡é—œçš„æ”¯æ´æª”ä½ç½®\n" +msgid " --sharedir show location of architecture-independent support files\n" +msgstr " --sharedir é¡¯ç¤ºèˆ‡æž¶æ§‹ç„¡é—œçš„æ”¯æ´æª”çš„ä½ç½®\n" -#: pg_config.c:444 +#: pg_config.c:90 #, c-format -msgid "" -" --sysconfdir show location of system-wide configuration files\n" -msgstr " --sysconfdir 顯示系統層級設定檔ä½ç½®\n" +msgid " --sysconfdir show location of system-wide configuration files\n" +msgstr " --sysconfdir 顯示系統全域組態檔的ä½ç½®\n" -#: pg_config.c:445 +#: pg_config.c:91 #, c-format msgid " --pgxs show location of extension makefile\n" -msgstr " --pgxs é¡¯ç¤ºå¤–éƒ¨ç¨‹å¼ makefile ä½ç½®\n" +msgstr " --pgxs 顯示擴充模組 makefile ä½ç½®\n" -#: pg_config.c:446 +#: pg_config.c:92 #, c-format msgid "" " --configure show options given to \"configure\" script when\n" " PostgreSQL was built\n" -msgstr "" -" --configure 顯示建立 PostgreSQL 時 \"configure\" 命令æž\n" -" æ‰€ä½¿ç”¨çš„åƒæ•¸\n" +msgstr " --configure 顯示建立 PostgreSQL 時給 \"configure\" è…³æœ¬çš„åƒæ•¸\n" -#: pg_config.c:448 +#: pg_config.c:94 #, c-format msgid " --cc show CC value used when PostgreSQL was built\n" msgstr " --cc 顯示建立 PostgreSQL 時使用的 CC 值\n" -#: pg_config.c:449 +#: pg_config.c:95 #, c-format -msgid "" -" --cppflags show CPPFLAGS value used when PostgreSQL was built\n" +msgid " --cppflags show CPPFLAGS value used when PostgreSQL was built\n" msgstr " --cppflags 顯示建立 PostgreSQL 時使用的 CPPFLAGS 值\n" -#: pg_config.c:450 +#: pg_config.c:96 #, c-format -msgid "" -" --cflags show CFLAGS value used when PostgreSQL was built\n" +msgid " --cflags show CFLAGS value used when PostgreSQL was built\n" msgstr " --cflags 顯示建立 PostgreSQL 時使用的 CFLAGS 值\n" -#: pg_config.c:451 +#: pg_config.c:97 #, c-format -msgid "" -" --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n" +msgid " --cflags_sl show CFLAGS_SL value used when PostgreSQL was built\n" msgstr " --cflags_sl 顯示建立 PostgreSQL 時使用的 CFLAGS_SL 值\n" -#: pg_config.c:452 +#: pg_config.c:98 #, c-format -msgid "" -" --ldflags show LDFLAGS value used when PostgreSQL was built\n" +msgid " --ldflags show LDFLAGS value used when PostgreSQL was built\n" msgstr " --ldflags 顯示建立 PostgreSQL 時使用的 LDFLAGS 值\n" -#: pg_config.c:453 +#: pg_config.c:99 #, c-format -msgid "" -" --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was " -"built\n" +msgid " --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built\n" msgstr " --ldflags_ex 顯示建立 PostgreSQL 時使用的 LDFLAGS_EX 值\n" -#: pg_config.c:454 +#: pg_config.c:100 #, c-format -msgid "" -" --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was " -"built\n" +msgid " --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built\n" msgstr " --ldflags_sl 顯示建立 PostgreSQL 時使用的 LDFLAGS_SL 值\n" -#: pg_config.c:455 +#: pg_config.c:101 #, c-format -msgid "" -" --libs show LIBS value used when PostgreSQL was built\n" +msgid " --libs show LIBS value used when PostgreSQL was built\n" msgstr " --libs 顯示建立 PostgreSQL 時使用的 LIBS 值\n" -#: pg_config.c:456 +#: pg_config.c:102 #, c-format msgid " --version show the PostgreSQL version\n" -msgstr " --version 顯示 PostgreSQL 版本\n" +msgstr " --version 顯示 PostgreSQL 的版本\n" -#: pg_config.c:457 +#: pg_config.c:103 #, c-format -msgid " --help show this help, then exit\n" -msgstr " --help é¡¯ç¤ºèªªæ˜Žç„¶å¾ŒçµæŸ\n" +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help é¡¯ç¤ºèªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" -#: pg_config.c:458 +#: pg_config.c:104 #, c-format msgid "" "\n" @@ -201,103 +240,87 @@ msgid "" "\n" msgstr "" "\n" -"æ²’æœ‰åƒæ•¸ï¼Œå·²é¡¯ç¤ºæ‰€æœ‰å·²çŸ¥é …目。\n" +"æ²’æœ‰åƒæ•¸æ™‚顯示所有已知項目。\n" "\n" -#: pg_config.c:459 +#: pg_config.c:105 +#, c-format +msgid "Report bugs to <%s>.\n" +msgstr "回報錯誤至 <%s>。\n" + +#: pg_config.c:106 #, c-format -msgid "Report bugs to .\n" -msgstr "回報錯誤至 。\n" +msgid "%s home page: <%s>\n" +msgstr "%s 首é : <%s>\n" # postmaster/postmaster.c:512 postmaster/postmaster.c:525 -#: pg_config.c:465 +#: pg_config.c:112 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "執行 \"%s --help\" 顯示更多資訊。\n" +msgstr "用 \"%s --help\" å–得更多資訊。\n" -#: pg_config.c:504 +#: pg_config.c:154 #, c-format msgid "%s: could not find own program executable\n" -msgstr "%s: 找ä¸åˆ°ç¨‹å¼åŸ·è¡Œæª”\n" +msgstr "%s: 找ä¸åˆ°è‡ªèº«çš„程å¼åŸ·è¡Œæª”\n" -#: pg_config.c:527 +#: pg_config.c:181 #, c-format msgid "%s: invalid argument: %s\n" msgstr "%s: ç„¡æ•ˆçš„åƒæ•¸: %s\n" -#: ../../port/exec.c:125 ../../port/exec.c:239 ../../port/exec.c:282 -#, c-format -msgid "could not identify current directory: %s" -msgstr "無法識別目å‰çš„目錄: %s" +#~ msgid "" +#~ "\n" +#~ "Try \"%s --help\" for more information\n" +#~ msgstr "" +#~ "\n" +#~ "執行\"%s --help\"å–得更多資訊\n" -# command.c:122 -#: ../../port/exec.c:144 -#, c-format -msgid "invalid binary \"%s\"" -msgstr "無效的 binary \"%s\"" +#~ msgid "" +#~ " %s OPTION...\n" +#~ "\n" +#~ msgstr "" +#~ " %s é¸é …...\n" +#~ "\n" -# command.c:1103 -#: ../../port/exec.c:193 #, c-format -msgid "could not read binary \"%s\"" -msgstr "ç„¡æ³•è®€å– binary \"%s\"" +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help é¡¯ç¤ºèªªæ˜Žç„¶å¾ŒçµæŸ\n" -#: ../../port/exec.c:200 -#, c-format -msgid "could not find a \"%s\" to execute" -msgstr "找ä¸åˆ° \"%s\" 執行" +#~ msgid "%s: argument required\n" +#~ msgstr "%s:ä¸èƒ½çœç•¥åƒæ•¸\n" -#: ../../port/exec.c:255 ../../port/exec.c:291 -#, c-format -msgid "could not change directory to \"%s\"" -msgstr "無法切æ›ç›®éŒ„至 \"%s\"" +#~ msgid "%s: could not find own executable\n" +#~ msgstr "%s:找ä¸åˆ°åŸ·è¡Œæª”\n" -#: ../../port/exec.c:270 #, c-format -msgid "could not read symbolic link \"%s\"" -msgstr "無法讀å–ç¬¦è™Ÿé€£çµ \"%s\"" +#~ msgid "child process exited with exit code %d" +#~ msgstr "å­è¡Œç¨‹çµæŸï¼ŒçµæŸä»£ç¢¼ %d" -#: ../../port/exec.c:517 #, c-format -msgid "child process exited with exit code %d" -msgstr "å­è¡Œç¨‹çµæŸï¼ŒçµæŸä»£ç¢¼ %d" +#~ msgid "child process exited with unrecognized status %d" +#~ msgstr "å­è¡Œç¨‹çµæŸï¼Œä¸æ˜Žç‹€æ…‹ä»£ç¢¼ %d" -#: ../../port/exec.c:521 #, c-format -msgid "child process was terminated by exception 0x%X" -msgstr "å­è¡Œç¨‹è¢«ä¾‹å¤– 0x%X çµæŸ" +#~ msgid "child process was terminated by exception 0x%X" +#~ msgstr "å­è¡Œç¨‹è¢«ä¾‹å¤– 0x%X çµæŸ" -#: ../../port/exec.c:530 #, c-format -msgid "child process was terminated by signal %s" -msgstr "å­è¡Œç¨‹è¢«ä¿¡è™Ÿ %s çµæŸ" +#~ msgid "child process was terminated by signal %d" +#~ msgstr "å­è¡Œç¨‹è¢«ä¿¡è™Ÿ %d çµæŸ" -#: ../../port/exec.c:533 #, c-format -msgid "child process was terminated by signal %d" -msgstr "å­è¡Œç¨‹è¢«ä¿¡è™Ÿ %d çµæŸ" +#~ msgid "child process was terminated by signal %s" +#~ msgstr "å­è¡Œç¨‹è¢«ä¿¡è™Ÿ %s çµæŸ" -#: ../../port/exec.c:537 #, c-format -msgid "child process exited with unrecognized status %d" -msgstr "å­è¡Œç¨‹çµæŸï¼Œä¸æ˜Žç‹€æ…‹ä»£ç¢¼ %d" - -#~ msgid "" -#~ " %s OPTION...\n" -#~ "\n" -#~ msgstr "" -#~ " %s é¸é …...\n" -#~ "\n" - -#~ msgid "" -#~ "\n" -#~ "Try \"%s --help\" for more information\n" -#~ msgstr "" -#~ "\n" -#~ "執行\"%s --help\"å–得更多資訊\n" +#~ msgid "could not change directory to \"%s\"" +#~ msgstr "無法切æ›ç›®éŒ„至 \"%s\"" -#~ msgid "%s: argument required\n" -#~ msgstr "%s:ä¸èƒ½çœç•¥åƒæ•¸\n" +#, c-format +#~ msgid "could not identify current directory: %s" +#~ msgstr "無法識別目å‰çš„目錄: %s" -#~ msgid "%s: could not find own executable\n" -#~ msgstr "%s:找ä¸åˆ°åŸ·è¡Œæª”\n" +#, c-format +#~ msgid "could not read symbolic link \"%s\"" +#~ msgstr "無法讀å–ç¬¦è™Ÿé€£çµ \"%s\"" diff --git a/src/bin/pg_config/t/001_pg_config.pl b/src/bin/pg_config/t/001_pg_config.pl index 24acf7872b2a5..94c3eb377c7c5 100644 --- a/src/bin/pg_config/t/001_pg_config.pl +++ b/src/bin/pg_config/t/001_pg_config.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_controldata/Makefile b/src/bin/pg_controldata/Makefile index aa5bd5822263e..c3f64e189690a 100644 --- a/src/bin/pg_controldata/Makefile +++ b/src/bin/pg_controldata/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/pg_controldata # -# Copyright (c) 1998-2023, PostgreSQL Global Development Group +# Copyright (c) 1998-2024, PostgreSQL Global Development Group # # src/bin/pg_controldata/Makefile # @@ -33,7 +33,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_controldata$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_controldata$(X) $(OBJS) rm -rf tmp_check diff --git a/src/bin/pg_controldata/meson.build b/src/bin/pg_controldata/meson.build index 03c9d0ae3eedc..8009bd8c9a7af 100644 --- a/src/bin/pg_controldata/meson.build +++ b/src/bin/pg_controldata/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_controldata_sources = files( 'pg_controldata.c', diff --git a/src/bin/pg_controldata/nls.mk b/src/bin/pg_controldata/nls.mk index ab34205b96010..3e7e018470a89 100644 --- a/src/bin/pg_controldata/nls.mk +++ b/src/bin/pg_controldata/nls.mk @@ -1,5 +1,7 @@ # src/bin/pg_controldata/nls.mk CATALOG_NAME = pg_controldata -GETTEXT_FILES = pg_controldata.c ../../common/controldata_utils.c +GETTEXT_FILES = pg_controldata.c \ + ../../common/controldata_utils.c \ + ../../common/fe_memutils.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/pg_controldata/pg_controldata.c b/src/bin/pg_controldata/pg_controldata.c index c390ec51ce9b4..cf11ab3f2ee3e 100644 --- a/src/bin/pg_controldata/pg_controldata.c +++ b/src/bin/pg_controldata/pg_controldata.c @@ -81,7 +81,7 @@ wal_level_str(WalLevel wal_level) case WAL_LEVEL_LOGICAL: return "logical"; } - return _("unrecognized wal_level"); + return _("unrecognized \"wal_level\""); } @@ -97,6 +97,7 @@ main(int argc, char *argv[]) bool crc_ok; char *DataDir = NULL; time_t time_tmp; + struct tm *tm_tmp; char pgctime_str[128]; char ckpttime_str[128]; char mock_auth_nonce_str[MOCK_AUTH_NONCE_LEN * 2 + 1]; @@ -167,24 +168,23 @@ main(int argc, char *argv[]) /* get a copy of the control file */ ControlFile = get_controlfile(DataDir, &crc_ok); if (!crc_ok) - printf(_("WARNING: Calculated CRC checksum does not match value stored in file.\n" - "Either the file is corrupt, or it has a different layout than this program\n" - "is expecting. The results below are untrustworthy.\n\n")); + { + pg_log_warning("calculated CRC checksum does not match value stored in control file"); + pg_log_warning_detail("Either the control file is corrupt, or it has a different layout than this program " + "is expecting. The results below are untrustworthy."); + } /* set wal segment size */ WalSegSz = ControlFile->xlog_seg_size; if (!IsValidWalSegSize(WalSegSz)) { - printf(_("WARNING: invalid WAL segment size\n")); - printf(ngettext("The WAL segment size stored in the file, %d byte, is not a power of two\n" - "between 1 MB and 1 GB. The file is corrupt and the results below are\n" - "untrustworthy.\n\n", - "The WAL segment size stored in the file, %d bytes, is not a power of two\n" - "between 1 MB and 1 GB. The file is corrupt and the results below are\n" - "untrustworthy.\n\n", - WalSegSz), - WalSegSz); + pg_log_warning(ngettext("invalid WAL segment size in control file (%d byte)", + "invalid WAL segment size in control file (%d bytes)", + WalSegSz), + WalSegSz); + pg_log_warning_detail("The WAL segment size must be a power of two between 1 MB and 1 GB."); + pg_log_warning_detail("The file is corrupt and the results below are untrustworthy."); } /* @@ -197,20 +197,30 @@ main(int argc, char *argv[]) * about %c */ time_tmp = (time_t) ControlFile->time; - strftime(pgctime_str, sizeof(pgctime_str), strftime_fmt, - localtime(&time_tmp)); + tm_tmp = localtime(&time_tmp); + + if (tm_tmp != NULL) + strftime(pgctime_str, sizeof(pgctime_str), strftime_fmt, tm_tmp); + else + snprintf(pgctime_str, sizeof(pgctime_str), _("???")); + time_tmp = (time_t) ControlFile->checkPointCopy.time; - strftime(ckpttime_str, sizeof(ckpttime_str), strftime_fmt, - localtime(&time_tmp)); + tm_tmp = localtime(&time_tmp); + + if (tm_tmp != NULL) + strftime(ckpttime_str, sizeof(ckpttime_str), strftime_fmt, tm_tmp); + else + snprintf(ckpttime_str, sizeof(ckpttime_str), _("???")); /* * Calculate name of the WAL file containing the latest checkpoint's REDO * start point. * - * A corrupted control file could report a WAL segment size of 0, and to - * guard against division by zero, we need to treat that specially. + * A corrupted control file could report a WAL segment size of 0 or + * negative value, and to guard against division by zero, we need to treat + * that specially. */ - if (WalSegSz != 0) + if (WalSegSz > 0) { XLogSegNo segno; diff --git a/src/bin/pg_controldata/po/LINGUAS b/src/bin/pg_controldata/po/LINGUAS index 312956920df20..4cc8bed767c42 100644 --- a/src/bin/pg_controldata/po/LINGUAS +++ b/src/bin/pg_controldata/po/LINGUAS @@ -1 +1 @@ -cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN +cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN zh_TW diff --git a/src/bin/pg_controldata/po/cs.po b/src/bin/pg_controldata/po/cs.po index 4774832b805ee..165b7d134a068 100644 --- a/src/bin/pg_controldata/po/cs.po +++ b/src/bin/pg_controldata/po/cs.po @@ -257,9 +257,7 @@ msgstr "Číslo verze katalogu: %u\n" #: pg_controldata.c:232 #, c-format msgid "Database system identifier: %llu\n" -msgstr "" -"Identifikátor databázového systému: %llu\n" -"\n" +msgstr "Identifikátor databázového systému: %llu\n" #: pg_controldata.c:234 #, c-format diff --git a/src/bin/pg_controldata/po/de.po b/src/bin/pg_controldata/po/de.po index 02b3a2dc1fbbc..d1ec166e8929e 100644 --- a/src/bin/pg_controldata/po/de.po +++ b/src/bin/pg_controldata/po/de.po @@ -1,14 +1,14 @@ # German message translation file for pg_controldata -# Peter Eisentraut , 2002 - 2022. +# Peter Eisentraut , 2002 - 2024. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-10 13:51+0000\n" -"PO-Revision-Date: 2022-04-10 20:16+0200\n" +"POT-Creation-Date: 2024-06-16 07:53+0000\n" +"PO-Revision-Date: 2024-05-17 13:06+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -17,31 +17,31 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../common/controldata_utils.c:73 +#: ../../common/controldata_utils.c:97 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" -#: ../../common/controldata_utils.c:86 +#: ../../common/controldata_utils.c:110 #, c-format msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" -#: ../../common/controldata_utils.c:95 +#: ../../common/controldata_utils.c:119 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" -#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244 +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #, c-format msgid "could not close file \"%s\": %m" msgstr "konnte Datei »%s« nicht schließen: %m" -#: ../../common/controldata_utils.c:124 +#: ../../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "falsche Byte-Reihenfolge" -#: ../../common/controldata_utils.c:126 +#: ../../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -55,21 +55,32 @@ msgstr "" "diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n" "wäre inkompatibel mit diesem Datenverzeichnis." -#: ../../common/controldata_utils.c:194 +#: ../../common/controldata_utils.c:230 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" -#: ../../common/controldata_utils.c:213 +#: ../../common/controldata_utils.c:249 #, c-format msgid "could not write file \"%s\": %m" msgstr "konnte Datei »%s« nicht schreiben: %m" -#: ../../common/controldata_utils.c:232 +#: ../../common/controldata_utils.c:268 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fsyncen: %m" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "Speicher aufgebraucht\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" + #: pg_controldata.c:35 #, c-format msgid "" @@ -169,8 +180,8 @@ msgid "unrecognized status code" msgstr "nicht erkannter Statuscode" #: pg_controldata.c:84 -msgid "unrecognized wal_level" -msgstr "unbekanntes wal_level" +msgid "unrecognized \"wal_level\"" +msgstr "unbekanntes »wal_level«" #: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 #, c-format @@ -187,326 +198,311 @@ msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" msgid "no data directory specified" msgstr "kein Datenverzeichnis angegeben" -#: pg_controldata.c:170 +#: pg_controldata.c:171 #, c-format -msgid "" -"WARNING: Calculated CRC checksum does not match value stored in file.\n" -"Either the file is corrupt, or it has a different layout than this program\n" -"is expecting. The results below are untrustworthy.\n" -"\n" -msgstr "" -"WARNUNG: Berechnete CRC-Prüfsumme stimmt nicht mit dem Wert in der Datei\n" -"überein. Entweder ist die Datei kaputt oder sie hat ein anderes Layout\n" -"als von diesem Programm erwartet. Die Ergebnisse unten sind nicht\n" -"verlässlich.\n" -"\n" +msgid "calculated CRC checksum does not match value stored in control file" +msgstr "berechnete CRC-Prüfsumme stimmt nicht mit dem Wert in der Kontrolldatei überein" -#: pg_controldata.c:179 +#: pg_controldata.c:172 #, c-format -msgid "WARNING: invalid WAL segment size\n" -msgstr "WARNUNG: ungültige WAL-Segmentgröße\n" +msgid "Either the control file is corrupt, or it has a different layout than this program is expecting. The results below are untrustworthy." +msgstr "Entweder ist die Kontrolldatei kaputt oder sie hat ein anderes Layout als von diesem Programm erwartet. Die Ergebnisse unten sind nicht verlässlich." -#: pg_controldata.c:180 +#: pg_controldata.c:181 #, c-format -msgid "" -"The WAL segment size stored in the file, %d byte, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgid_plural "" -"The WAL segment size stored in the file, %d bytes, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgstr[0] "" -"Die in der Datei gespeicherte WAL-Segmentgröße, %d Byte, ist keine\n" -"Zweierpotenz zwischen 1 MB und 1 GB. Die Datei ist kaputt und die\n" -"Ergebnisse unten sind nicht verlässlich.\n" -"\n" -msgstr[1] "" -"Die in der Datei gespeicherte WAL-Segmentgröße, %d Bytes, ist keine\n" -"Zweierpotenz zwischen 1 MB und 1 GB. Die Datei ist kaputt und die\n" -"Ergebnisse unten sind nicht verlässlich.\n" -"\n" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "ungültige WAL-Segmentgröße in Kontrolldatei (%d Byte)" +msgstr[1] "ungültige WAL-Segmentgröße in Kontrolldatei (%d Bytes)" + +#: pg_controldata.c:185 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "Die WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein." + +#: pg_controldata.c:186 +#, c-format +msgid "The file is corrupt and the results below are untrustworthy." +msgstr "Die Datei ist kaputt und die Ergebnisse unten sind nicht verlässlich." -#: pg_controldata.c:222 +#: pg_controldata.c:221 msgid "???" msgstr "???" -#: pg_controldata.c:228 +#: pg_controldata.c:227 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_control-Versionsnummer: %u\n" -#: pg_controldata.c:230 +#: pg_controldata.c:229 #, c-format msgid "Catalog version number: %u\n" msgstr "Katalogversionsnummer: %u\n" -#: pg_controldata.c:232 +#: pg_controldata.c:231 #, c-format msgid "Database system identifier: %llu\n" msgstr "Datenbanksystemidentifikation: %llu\n" -#: pg_controldata.c:234 +#: pg_controldata.c:233 #, c-format msgid "Database cluster state: %s\n" msgstr "Datenbank-Cluster-Status: %s\n" -#: pg_controldata.c:236 +#: pg_controldata.c:235 #, c-format msgid "pg_control last modified: %s\n" msgstr "pg_control zuletzt geändert: %s\n" -#: pg_controldata.c:238 +#: pg_controldata.c:237 #, c-format msgid "Latest checkpoint location: %X/%X\n" msgstr "Position des letzten Checkpoints: %X/%X\n" -#: pg_controldata.c:240 +#: pg_controldata.c:239 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "REDO-Position des letzten Checkpoints: %X/%X\n" -#: pg_controldata.c:242 +#: pg_controldata.c:241 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "REDO-WAL-Datei des letzten Checkpoints: %s\n" -#: pg_controldata.c:244 +#: pg_controldata.c:243 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "TimeLineID des letzten Checkpoints: %u\n" -#: pg_controldata.c:246 +#: pg_controldata.c:245 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "PrevTimeLineID des letzten Checkpoints: %u\n" -#: pg_controldata.c:248 +#: pg_controldata.c:247 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "full_page_writes des letzten Checkpoints: %s\n" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "off" msgstr "aus" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "on" msgstr "an" -#: pg_controldata.c:250 +#: pg_controldata.c:249 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID des letzten Checkpoints: %u:%u\n" -#: pg_controldata.c:253 +#: pg_controldata.c:252 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID des letzten Checkpoints: %u\n" -#: pg_controldata.c:255 +#: pg_controldata.c:254 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId des letzten Checkpoints: %u\n" -#: pg_controldata.c:257 +#: pg_controldata.c:256 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset des letzten Checkpoints: %u\n" -#: pg_controldata.c:259 +#: pg_controldata.c:258 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID des letzten Checkpoints: %u\n" -#: pg_controldata.c:261 +#: pg_controldata.c:260 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "DB der oldestXID des letzten Checkpoints: %u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:262 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID des letzten Checkpoints: %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:264 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid des letzten Checkpoints: %u\n" -#: pg_controldata.c:267 +#: pg_controldata.c:266 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "DB des oldestMulti des letzten Checkpoints: %u\n" -#: pg_controldata.c:269 +#: pg_controldata.c:268 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid des letzten Checkpoints: %u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:270 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid des letzten Checkpoints: %u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:272 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "Zeit des letzten Checkpoints: %s\n" -#: pg_controldata.c:275 +#: pg_controldata.c:274 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "Fake-LSN-Zähler für ungeloggte Relationen: %X/%X\n" -#: pg_controldata.c:277 +#: pg_controldata.c:276 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "Minimaler Wiederherstellungsendpunkt: %X/%X\n" -#: pg_controldata.c:279 +#: pg_controldata.c:278 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "Zeitleiste des minimalen Wiederherstellungsendpunkts: %u\n" -#: pg_controldata.c:281 +#: pg_controldata.c:280 #, c-format msgid "Backup start location: %X/%X\n" msgstr "Backup-Startpunkt: %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:282 #, c-format msgid "Backup end location: %X/%X\n" msgstr "Backup-Endpunkt: %X/%X\n" -#: pg_controldata.c:285 +#: pg_controldata.c:284 #, c-format msgid "End-of-backup record required: %s\n" msgstr "End-of-Backup-Eintrag erforderlich: %s\n" -#: pg_controldata.c:286 +#: pg_controldata.c:285 msgid "no" msgstr "nein" -#: pg_controldata.c:286 +#: pg_controldata.c:285 msgid "yes" msgstr "ja" -#: pg_controldata.c:287 +#: pg_controldata.c:286 #, c-format msgid "wal_level setting: %s\n" msgstr "wal_level-Einstellung: %s\n" -#: pg_controldata.c:289 +#: pg_controldata.c:288 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "wal_log_hints-Einstellung: %s\n" -#: pg_controldata.c:291 +#: pg_controldata.c:290 #, c-format msgid "max_connections setting: %d\n" msgstr "max_connections-Einstellung: %d\n" -#: pg_controldata.c:293 +#: pg_controldata.c:292 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "max_worker_processes-Einstellung: %d\n" -#: pg_controldata.c:295 +#: pg_controldata.c:294 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "max_wal_senders-Einstellung: %d\n" -#: pg_controldata.c:297 +#: pg_controldata.c:296 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "max_prepared_xacts-Einstellung: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:298 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "max_locks_per_xact-Einstellung: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:300 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "track_commit_timestamp-Einstellung: %s\n" -#: pg_controldata.c:303 +#: pg_controldata.c:302 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Maximale Datenausrichtung (Alignment): %u\n" -#: pg_controldata.c:306 +#: pg_controldata.c:305 #, c-format msgid "Database block size: %u\n" msgstr "Datenbankblockgröße: %u\n" -#: pg_controldata.c:308 +#: pg_controldata.c:307 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Blöcke pro Segment: %u\n" -#: pg_controldata.c:310 +#: pg_controldata.c:309 #, c-format msgid "WAL block size: %u\n" msgstr "WAL-Blockgröße: %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:311 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Bytes pro WAL-Segment: %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:313 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Maximale Bezeichnerlänge: %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:315 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Maximale Spalten in einem Index: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:317 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Maximale Größe eines Stücks TOAST: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:319 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Größe eines Large-Object-Chunks: %u\n" -#: pg_controldata.c:323 +#: pg_controldata.c:322 #, c-format msgid "Date/time type storage: %s\n" msgstr "Speicherung von Datum/Zeit-Typen: %s\n" -#: pg_controldata.c:324 +#: pg_controldata.c:323 msgid "64-bit integers" msgstr "64-Bit-Ganzzahlen" -#: pg_controldata.c:325 +#: pg_controldata.c:324 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Übergabe von Float8-Argumenten: %s\n" -#: pg_controldata.c:326 +#: pg_controldata.c:325 msgid "by reference" msgstr "Referenz" -#: pg_controldata.c:326 +#: pg_controldata.c:325 msgid "by value" msgstr "Wert" -#: pg_controldata.c:327 +#: pg_controldata.c:326 #, c-format msgid "Data page checksum version: %u\n" msgstr "Datenseitenprüfsummenversion: %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:328 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "Mock-Authentifizierungs-Nonce: %s\n" diff --git a/src/bin/pg_controldata/po/es.po b/src/bin/pg_controldata/po/es.po index 58127cba51d81..79a931a21b2d1 100644 --- a/src/bin/pg_controldata/po/es.po +++ b/src/bin/pg_controldata/po/es.po @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_controldata (PostgreSQL) 16\n" +"Project-Id-Version: pg_controldata (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:22+0000\n" -"PO-Revision-Date: 2023-05-22 12:05+0200\n" +"POT-Creation-Date: 2025-02-16 19:53+0000\n" +"PO-Revision-Date: 2024-11-16 14:23+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -22,31 +22,31 @@ msgstr "" "X-Generator: Poedit 2.0.2\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../common/controldata_utils.c:73 +#: ../../common/controldata_utils.c:97 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "no se pudo abrir archivo «%s» para lectura: %m" -#: ../../common/controldata_utils.c:86 +#: ../../common/controldata_utils.c:110 #, c-format msgid "could not read file \"%s\": %m" msgstr "no se pudo leer el archivo «%s»: %m" -#: ../../common/controldata_utils.c:95 +#: ../../common/controldata_utils.c:119 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu" -#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:236 +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #, c-format msgid "could not close file \"%s\": %m" msgstr "no se pudo cerrar el archivo «%s»: %m" -#: ../../common/controldata_utils.c:124 +#: ../../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "discordancia en orden de bytes" -#: ../../common/controldata_utils.c:126 +#: ../../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -60,21 +60,32 @@ msgstr "" "serían erróneos, y la instalación de PostgreSQL sería incompatible con este\n" "directorio de datos." -#: ../../common/controldata_utils.c:186 +#: ../../common/controldata_utils.c:230 #, c-format msgid "could not open file \"%s\": %m" msgstr "no se pudo abrir el archivo «%s»: %m" -#: ../../common/controldata_utils.c:205 +#: ../../common/controldata_utils.c:249 #, c-format msgid "could not write file \"%s\": %m" msgstr "no se pudo escribir el archivo «%s»: %m" -#: ../../common/controldata_utils.c:224 +#: ../../common/controldata_utils.c:268 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "memoria agotada\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "no se puede duplicar un puntero nulo (error interno)\n" + #: pg_controldata.c:35 #, c-format msgid "" @@ -174,342 +185,330 @@ msgid "unrecognized status code" msgstr "código de estado no reconocido" #: pg_controldata.c:84 -msgid "unrecognized wal_level" -msgstr "wal_level no reconocido" +msgid "unrecognized \"wal_level\"" +msgstr "«wal_level» no reconocido" -#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 +#: pg_controldata.c:139 pg_controldata.c:157 pg_controldata.c:164 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: pg_controldata.c:154 +#: pg_controldata.c:155 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: pg_controldata.c:162 +#: pg_controldata.c:163 #, c-format msgid "no data directory specified" msgstr "no se especificó el directorio de datos" -#: pg_controldata.c:170 +#: pg_controldata.c:172 #, c-format -msgid "" -"WARNING: Calculated CRC checksum does not match value stored in file.\n" -"Either the file is corrupt, or it has a different layout than this program\n" -"is expecting. The results below are untrustworthy.\n" -"\n" -msgstr "" -"ATENCIÓN: La suma de verificación calculada no coincide con el valor\n" -"almacenado en el archivo. Puede ser que el archivo esté corrupto, o\n" -"bien tiene una estructura diferente de la que este programa está\n" -"esperando. Los resultados presentados a continuación no son confiables.\n" -"\n" +msgid "calculated CRC checksum does not match value stored in control file" +msgstr "el \"checksum\" calculado no coincide con el valor almacenado en el archivo de control" -#: pg_controldata.c:179 +#: pg_controldata.c:173 #, c-format -msgid "WARNING: invalid WAL segment size\n" -msgstr "PRECAUCIÓN: tamaño de segmento de WAL no válido\n" +msgid "Either the control file is corrupt, or it has a different layout than this program is expecting. The results below are untrustworthy." +msgstr "O bien el archivo está corrupto, o tiene una estructura diferente de la que este programa está esperando. Los resultados presentados a continuación no son confiables." -#: pg_controldata.c:180 +#: pg_controldata.c:182 +#, c-format +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "tamaño de segmento de WAL no válido (%d byte) en archivo de control" +msgstr[1] "tamaño de segmento de WAL no válido (%d bytes) en archivo de control" + +#: pg_controldata.c:186 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "El tamaño de segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB." + +#: pg_controldata.c:187 +#, c-format +msgid "The file is corrupt and the results below are untrustworthy." +msgstr "El archivo está corrupto y los resultados a continuación no son confiables." + +#: pg_controldata.c:205 pg_controldata.c:213 pg_controldata.c:232 #, c-format -msgid "" -"The WAL segment size stored in the file, %d byte, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgid_plural "" -"The WAL segment size stored in the file, %d bytes, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgstr[0] "" -"El tamaño de segmento de WAL almacenado en el archivo, %d byte,\n" -"no es una potencia de dos entre 1 MB y 1 GB. El archivo está corrupto y los\n" -"resultados de abajo no son confiables.\n" -msgstr[1] "" -"El tamaño de segmento de WAL almacenado en el archivo, %d bytes,\n" -"no es una potencia de dos entre 1 MB y 1 GB. El archivo está corrupto y los\n" -"resultados de abajo no son confiables.\n" - -#: pg_controldata.c:222 msgid "???" msgstr "???" -#: pg_controldata.c:228 +#: pg_controldata.c:238 #, c-format msgid "pg_control version number: %u\n" msgstr "Número de versión de pg_control: %u\n" -#: pg_controldata.c:230 +#: pg_controldata.c:240 #, c-format msgid "Catalog version number: %u\n" msgstr "Número de versión del catálogo: %u\n" -#: pg_controldata.c:232 +#: pg_controldata.c:242 #, c-format msgid "Database system identifier: %llu\n" msgstr "Identificador de sistema: %llu\n" -#: pg_controldata.c:234 +#: pg_controldata.c:244 #, c-format msgid "Database cluster state: %s\n" msgstr "Estado del sistema de base de datos: %s\n" -#: pg_controldata.c:236 +#: pg_controldata.c:246 #, c-format msgid "pg_control last modified: %s\n" msgstr "Última modificación de pg_control: %s\n" -#: pg_controldata.c:238 +#: pg_controldata.c:248 #, c-format msgid "Latest checkpoint location: %X/%X\n" msgstr "Ubicación del último checkpoint: %X/%X\n" -#: pg_controldata.c:240 +#: pg_controldata.c:250 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "Ubicación de REDO de último checkpoint: %X/%X\n" -#: pg_controldata.c:242 +#: pg_controldata.c:252 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "Ubicación de REDO de último checkpoint: %s\n" -#: pg_controldata.c:244 +#: pg_controldata.c:254 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "TimeLineID del último checkpoint: %u\n" -#: pg_controldata.c:246 +#: pg_controldata.c:256 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "PrevTimeLineID del último checkpoint: %u\n" -#: pg_controldata.c:248 +#: pg_controldata.c:258 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "full_page_writes del último checkpoint: %s\n" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:259 pg_controldata.c:300 pg_controldata.c:312 msgid "off" msgstr "desactivado" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:259 pg_controldata.c:300 pg_controldata.c:312 msgid "on" msgstr "activado" -#: pg_controldata.c:250 +#: pg_controldata.c:260 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID de último checkpoint: %u/%u\n" -#: pg_controldata.c:253 +#: pg_controldata.c:263 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID de último checkpoint: %u\n" -#: pg_controldata.c:255 +#: pg_controldata.c:265 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId de último checkpoint: %u\n" -#: pg_controldata.c:257 +#: pg_controldata.c:267 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset de último checkpoint: %u\n" -#: pg_controldata.c:259 +#: pg_controldata.c:269 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID del último checkpoint: %u\n" -#: pg_controldata.c:261 +#: pg_controldata.c:271 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "DB del oldestXID del último checkpoint: %u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:273 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID del último checkpoint: %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:275 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid del último checkpoint: %u\n" -#: pg_controldata.c:267 +#: pg_controldata.c:277 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "DB del oldestMultiXid del últ. checkpoint: %u\n" -#: pg_controldata.c:269 +#: pg_controldata.c:279 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid del último checkpoint: %u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:281 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid del último checkpoint: %u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:283 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "Instante de último checkpoint: %s\n" -#: pg_controldata.c:275 +#: pg_controldata.c:285 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "Contador de LSN falsas para rels. unlogged: %X/%X\n" -#: pg_controldata.c:277 +#: pg_controldata.c:287 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "Punto final mínimo de recuperación: %X/%X\n" -#: pg_controldata.c:279 +#: pg_controldata.c:289 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "Timeline de dicho punto final mínimo: %u\n" -#: pg_controldata.c:281 +#: pg_controldata.c:291 #, c-format msgid "Backup start location: %X/%X\n" msgstr "Ubicación del inicio de backup: %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:293 #, c-format msgid "Backup end location: %X/%X\n" msgstr "Ubicación del fin de backup: %X/%X\n" -#: pg_controldata.c:285 +#: pg_controldata.c:295 #, c-format msgid "End-of-backup record required: %s\n" msgstr "Registro fin-de-backup requerido: %s\n" -#: pg_controldata.c:286 +#: pg_controldata.c:296 msgid "no" msgstr "no" -#: pg_controldata.c:286 +#: pg_controldata.c:296 msgid "yes" msgstr "sí" -#: pg_controldata.c:287 +#: pg_controldata.c:297 #, c-format msgid "wal_level setting: %s\n" msgstr "Parámetro wal_level: %s\n" -#: pg_controldata.c:289 +#: pg_controldata.c:299 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "Parámetro wal_log_hings: %s\n" -#: pg_controldata.c:291 +#: pg_controldata.c:301 #, c-format msgid "max_connections setting: %d\n" msgstr "Parámetro max_connections: %d\n" -#: pg_controldata.c:293 +#: pg_controldata.c:303 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "Parámetro max_worker_processes: %d\n" -#: pg_controldata.c:295 +#: pg_controldata.c:305 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "Parámetro max_wal_senders: %d\n" -#: pg_controldata.c:297 +#: pg_controldata.c:307 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "Parámetro max_prepared_xacts: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:309 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "Parámetro max_locks_per_xact: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:311 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "Parámetro track_commit_timestamp: %s\n" -#: pg_controldata.c:303 +#: pg_controldata.c:313 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Alineamiento máximo de datos: %u\n" -#: pg_controldata.c:306 +#: pg_controldata.c:316 #, c-format msgid "Database block size: %u\n" msgstr "Tamaño de bloque de la base de datos: %u\n" -#: pg_controldata.c:308 +#: pg_controldata.c:318 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Bloques por segmento en relación grande: %u\n" -#: pg_controldata.c:310 +#: pg_controldata.c:320 #, c-format msgid "WAL block size: %u\n" msgstr "Tamaño del bloque de WAL: %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:322 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Bytes por segmento WAL: %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:324 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Máxima longitud de identificadores: %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:326 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Máximo número de columnas de un índice: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:328 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Longitud máxima de un trozo TOAST: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:330 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Longitud máx. de un trozo de objeto grande: %u\n" -#: pg_controldata.c:323 +#: pg_controldata.c:333 #, c-format msgid "Date/time type storage: %s\n" msgstr "Tipo de almacenamiento de horas y fechas: %s\n" -#: pg_controldata.c:324 +#: pg_controldata.c:334 msgid "64-bit integers" msgstr "enteros de 64 bits" -#: pg_controldata.c:325 +#: pg_controldata.c:335 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Paso de parámetros float8: %s\n" -#: pg_controldata.c:326 +#: pg_controldata.c:336 msgid "by reference" msgstr "por referencia" -#: pg_controldata.c:326 +#: pg_controldata.c:336 msgid "by value" msgstr "por valor" -#: pg_controldata.c:327 +#: pg_controldata.c:337 #, c-format msgid "Data page checksum version: %u\n" msgstr "Versión de sumas de verificación de datos: %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:339 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "Nonce para autentificación simulada: %s\n" diff --git a/src/bin/pg_controldata/po/fr.po b/src/bin/pg_controldata/po/fr.po index 6f2a45a204ac9..1c94ff051b777 100644 --- a/src/bin/pg_controldata/po/fr.po +++ b/src/bin/pg_controldata/po/fr.po @@ -11,10 +11,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-12 05:16+0000\n" -"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"POT-Creation-Date: 2024-07-20 21:24+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -22,33 +22,33 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: ../../common/controldata_utils.c:73 +#: ../../common/controldata_utils.c:97 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" -#: ../../common/controldata_utils.c:86 +#: ../../common/controldata_utils.c:110 #, c-format msgid "could not read file \"%s\": %m" msgstr "n'a pas pu lire le fichier « %s » : %m" -#: ../../common/controldata_utils.c:95 +#: ../../common/controldata_utils.c:119 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" -#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244 +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #, c-format msgid "could not close file \"%s\": %m" msgstr "n'a pas pu fermer le fichier « %s » : %m" -#: ../../common/controldata_utils.c:124 +#: ../../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "différence de l'ordre des octets" -#: ../../common/controldata_utils.c:126 +#: ../../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -62,21 +62,32 @@ msgstr "" "résultats ci-dessous sont incorrects, et l'installation de PostgreSQL\n" "est incompatible avec ce répertoire des données." -#: ../../common/controldata_utils.c:194 +#: ../../common/controldata_utils.c:230 #, c-format msgid "could not open file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier « %s » : %m" -#: ../../common/controldata_utils.c:213 +#: ../../common/controldata_utils.c:249 #, c-format msgid "could not write file \"%s\": %m" msgstr "impossible d'écrire le fichier « %s » : %m" -#: ../../common/controldata_utils.c:232 +#: ../../common/controldata_utils.c:268 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "mémoire épuisée\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" + #: pg_controldata.c:35 #, c-format msgid "" @@ -176,8 +187,8 @@ msgid "unrecognized status code" msgstr "code de statut inconnu" #: pg_controldata.c:84 -msgid "unrecognized wal_level" -msgstr "wal_level non reconnu" +msgid "unrecognized \"wal_level\"" +msgstr "« wal_level » non reconnu" #: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 #, c-format @@ -194,376 +205,311 @@ msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" msgid "no data directory specified" msgstr "aucun répertoire de données indiqué" -#: pg_controldata.c:170 +#: pg_controldata.c:171 #, c-format -msgid "" -"WARNING: Calculated CRC checksum does not match value stored in file.\n" -"Either the file is corrupt, or it has a different layout than this program\n" -"is expecting. The results below are untrustworthy.\n" -"\n" -msgstr "" -"ATTENTION : Les sommes de contrôle (CRC) calculées ne correspondent pas aux\n" -"valeurs stockées dans le fichier.\n" -"Soit le fichier est corrompu, soit son organisation diffère de celle\n" -"attendue par le programme.\n" -"Les résultats ci-dessous ne sont pas dignes de confiance.\n" -"\n" +msgid "calculated CRC checksum does not match value stored in control file" +msgstr "la somme de contrôle CRC calculée ne correspond par à la valeur enregistrée dans le fichier de contrôle" -#: pg_controldata.c:179 +#: pg_controldata.c:172 #, c-format -msgid "WARNING: invalid WAL segment size\n" -msgstr "ATTENTION : taille invalide du segment WAL\n" +msgid "Either the control file is corrupt, or it has a different layout than this program is expecting. The results below are untrustworthy." +msgstr "Soit le fichier de contrôle est corrompu, soit son organisation diffère de celle attendue par le programme. Les résultats ci-dessous ne sont pas dignes de confiance." -#: pg_controldata.c:180 +#: pg_controldata.c:181 #, c-format -msgid "" -"The WAL segment size stored in the file, %d byte, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgid_plural "" -"The WAL segment size stored in the file, %d bytes, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgstr[0] "" -"La taille d'un segment WAL enregistré dans le fichier, %d octet, n'est pas une puissance de deux " -"entre 1 Mo et 1 Go. Le fichier est corrompu et les résultats ci-dessous ne proviennent pas d'une " -"source fiable.\n" -"\n" -msgstr[1] "" -"La taille d'un segment WAL enregistré dans le fichier, %d octets, n'est pas une puissance de deux " -"entre 1 Mo et 1 Go. Le fichier est corrompu et les résultats ci-dessous ne proviennent pas d'une " -"source fiable.\n" -"\n" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "taille invalide du segment WAL dans le fichier de contrôle (%d octet)" +msgstr[1] "taille invalide du segment WAL dans le fichier de contrôle (%d octets)" + +#: pg_controldata.c:185 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go." -#: pg_controldata.c:222 +#: pg_controldata.c:186 +#, c-format +msgid "The file is corrupt and the results below are untrustworthy." +msgstr "Le fichier est corrompu et il ne faut pas faire confiance aux résultats ci-dessous." + +#: pg_controldata.c:221 msgid "???" msgstr "???" -#: pg_controldata.c:228 +#: pg_controldata.c:227 #, c-format msgid "pg_control version number: %u\n" msgstr "Numéro de version de pg_control : %u\n" -#: pg_controldata.c:230 +#: pg_controldata.c:229 #, c-format msgid "Catalog version number: %u\n" msgstr "Numéro de version du catalogue : %u\n" -#: pg_controldata.c:232 +#: pg_controldata.c:231 #, c-format msgid "Database system identifier: %llu\n" msgstr "Identifiant du système de base de données : %llu\n" -#: pg_controldata.c:234 +#: pg_controldata.c:233 #, c-format msgid "Database cluster state: %s\n" msgstr "État du cluster de base de données : %s\n" -#: pg_controldata.c:236 +#: pg_controldata.c:235 #, c-format msgid "pg_control last modified: %s\n" msgstr "Dernière modification de pg_control : %s\n" -#: pg_controldata.c:238 +#: pg_controldata.c:237 #, c-format msgid "Latest checkpoint location: %X/%X\n" msgstr "Dernier point de contrôle : %X/%X\n" -#: pg_controldata.c:240 +#: pg_controldata.c:239 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "Dernier REDO (reprise) du point de contrôle : %X/%X\n" -#: pg_controldata.c:242 +#: pg_controldata.c:241 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" -msgstr "Dernier fichier WAL du rejeu du point de contrrôle : %s\n" +msgstr "Dernier fichier WAL du rejeu du point de contrôle : %s\n" -#: pg_controldata.c:244 +#: pg_controldata.c:243 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "Dernier TimeLineID du point de contrôle : %u\n" -#: pg_controldata.c:246 +#: pg_controldata.c:245 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "Dernier PrevTimeLineID du point de contrôle : %u\n" -#: pg_controldata.c:248 +#: pg_controldata.c:247 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Dernier full_page_writes du point de contrôle : %s\n" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "off" msgstr "désactivé" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "on" msgstr "activé" -#: pg_controldata.c:250 +#: pg_controldata.c:249 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "Dernier NextXID du point de contrôle : %u:%u\n" -#: pg_controldata.c:253 +#: pg_controldata.c:252 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "Dernier NextOID du point de contrôle : %u\n" -#: pg_controldata.c:255 +#: pg_controldata.c:254 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "Dernier NextMultiXactId du point de contrôle : %u\n" -#: pg_controldata.c:257 +#: pg_controldata.c:256 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "Dernier NextMultiOffset du point de contrôle : %u\n" -#: pg_controldata.c:259 +#: pg_controldata.c:258 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "Dernier oldestXID du point de contrôle : %u\n" -#: pg_controldata.c:261 +#: pg_controldata.c:260 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "Dernier oldestXID du point de contrôle de la base : %u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:262 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "Dernier oldestActiveXID du point de contrôle : %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:264 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "Dernier oldestMultiXid du point de contrôle : %u\n" -#: pg_controldata.c:267 +#: pg_controldata.c:266 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" -msgstr "Dernier oldestMulti du point de contrôle de base : %u\n" +msgstr "Dernier oldestMulti du point de contrôle de la base : %u\n" -#: pg_controldata.c:269 +#: pg_controldata.c:268 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "Dernier oldestCommitTsXid du point de contrôle : %u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:270 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "Dernier newestCommitTsXid du point de contrôle : %u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:272 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "Heure du dernier point de contrôle : %s\n" -#: pg_controldata.c:275 +#: pg_controldata.c:274 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "Faux compteur LSN pour les relations non journalisés : %X/%X\n" -#: pg_controldata.c:277 +#: pg_controldata.c:276 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "Emplacement de fin de la récupération minimale : %X/%X\n" -#: pg_controldata.c:279 +#: pg_controldata.c:278 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "Timeline de l'emplacement de fin de restauration : %u\n" -#: pg_controldata.c:281 +#: pg_controldata.c:280 #, c-format msgid "Backup start location: %X/%X\n" msgstr "Début de la sauvegarde : %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:282 #, c-format msgid "Backup end location: %X/%X\n" msgstr "Fin de la sauvegarde : %X/%X\n" -#: pg_controldata.c:285 +#: pg_controldata.c:284 #, c-format msgid "End-of-backup record required: %s\n" msgstr "Enregistrement de fin de sauvegarde requis : %s\n" -#: pg_controldata.c:286 +#: pg_controldata.c:285 msgid "no" msgstr "non" -#: pg_controldata.c:286 +#: pg_controldata.c:285 msgid "yes" msgstr "oui" -#: pg_controldata.c:287 +#: pg_controldata.c:286 #, c-format msgid "wal_level setting: %s\n" -msgstr "Paramètrage actuel de wal_level : %s\n" +msgstr "Paramétrage actuel de wal_level : %s\n" -#: pg_controldata.c:289 +#: pg_controldata.c:288 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "Paramétrage actuel de wal_log_hints : %s\n" -#: pg_controldata.c:291 +#: pg_controldata.c:290 #, c-format msgid "max_connections setting: %d\n" -msgstr "Paramètrage actuel de max_connections : %d\n" +msgstr "Paramétrage actuel de max_connections : %d\n" -#: pg_controldata.c:293 +#: pg_controldata.c:292 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "Paramétrage actuel de max_worker_processes : %d\n" -#: pg_controldata.c:295 +#: pg_controldata.c:294 #, c-format msgid "max_wal_senders setting: %d\n" -msgstr "Paramètrage actuel de max_wal_senders : %d\n" +msgstr "Paramétrage actuel de max_wal_senders : %d\n" -#: pg_controldata.c:297 +#: pg_controldata.c:296 #, c-format msgid "max_prepared_xacts setting: %d\n" -msgstr "Paramètrage actuel de max_prepared_xacts : %d\n" +msgstr "Paramétrage actuel de max_prepared_xacts : %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:298 #, c-format msgid "max_locks_per_xact setting: %d\n" -msgstr "Paramètrage actuel de max_locks_per_xact : %d\n" +msgstr "Paramétrage actuel de max_locks_per_xact : %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:300 #, c-format msgid "track_commit_timestamp setting: %s\n" -msgstr "Paramètrage actuel de track_commit_timestamp : %s\n" +msgstr "Paramétrage actuel de track_commit_timestamp : %s\n" -#: pg_controldata.c:303 +#: pg_controldata.c:302 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Alignement maximal des données : %u\n" -#: pg_controldata.c:306 +#: pg_controldata.c:305 #, c-format msgid "Database block size: %u\n" msgstr "Taille du bloc de la base de données : %u\n" -#: pg_controldata.c:308 +#: pg_controldata.c:307 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Blocs par segment des relations volumineuses : %u\n" -#: pg_controldata.c:310 +#: pg_controldata.c:309 #, c-format msgid "WAL block size: %u\n" msgstr "Taille de bloc du journal de transaction : %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:311 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Octets par segment du journal de transaction : %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:313 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Longueur maximale des identifiants : %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:315 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Nombre maximum de colonnes d'un index: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:317 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Longueur maximale d'un morceau TOAST : %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:319 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Taille d'un morceau de Large Object : %u\n" -#: pg_controldata.c:323 +#: pg_controldata.c:322 #, c-format msgid "Date/time type storage: %s\n" msgstr "Stockage du type date/heure : %s\n" -#: pg_controldata.c:324 +#: pg_controldata.c:323 msgid "64-bit integers" msgstr "entiers 64-bits" -#: pg_controldata.c:325 +#: pg_controldata.c:324 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Passage d'argument float8 : %s\n" -#: pg_controldata.c:326 +#: pg_controldata.c:325 msgid "by reference" msgstr "par référence" -#: pg_controldata.c:326 +#: pg_controldata.c:325 msgid "by value" msgstr "par valeur" -#: pg_controldata.c:327 +#: pg_controldata.c:326 #, c-format msgid "Data page checksum version: %u\n" msgstr "Version des sommes de contrôle des pages de données : %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:328 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "Nonce pour simuler une identité: %s\n" - -#~ msgid " -?, --help show this help, then exit\n" -#~ msgstr " -?, --help affiche cette aide et quitte\n" - -#~ msgid " -V, --version output version information, then exit\n" -#~ msgstr " -V, --version affiche la version et quitte\n" - -#~ msgid "%s: could not open file \"%s\" for reading: %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n" - -#~ msgid "%s: could not read file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le fichier « %s » : %s\n" - -#~ msgid "%s: could not read file \"%s\": read %d of %d\n" -#~ msgstr "%s : n'a pas pu lire le fichier « %s » : a lu %d sur %d\n" - -#~ msgid "Float4 argument passing: %s\n" -#~ msgstr "Passage d'argument float4 : %s\n" - -#~ msgid "Prior checkpoint location: %X/%X\n" -#~ msgstr "Point de contrôle précédent : %X/%X\n" - -#~ msgid "Report bugs to .\n" -#~ msgstr "Rapporter les bogues à .\n" - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayer « %s --help » pour plus d'informations.\n" - -#~ msgid "" -#~ "Usage:\n" -#~ " %s [OPTION] [DATADIR]\n" -#~ "\n" -#~ "Options:\n" -#~ " --help show this help, then exit\n" -#~ " --version output version information, then exit\n" -#~ msgstr "" -#~ "Usage :\n" -#~ " %s [OPTION] [RÉP_DONNÉES]\n" -#~ "\n" -#~ "Options :\n" -#~ " --help affiche cette aide et quitte\n" -#~ " --version affiche les informations de version et quitte\n" - -#~ msgid "calculated CRC checksum does not match value stored in file" -#~ msgstr "la somme de contrôle CRC calculée ne correspond par à la valeur enregistrée dans le fichier" - -#~ msgid "floating-point numbers" -#~ msgstr "nombres à virgule flottante" diff --git a/src/bin/pg_controldata/po/it.po b/src/bin/pg_controldata/po/it.po index 814e334732ba9..cc35f9609e988 100644 --- a/src/bin/pg_controldata/po/it.po +++ b/src/bin/pg_controldata/po/it.po @@ -266,9 +266,7 @@ msgstr "Numero di versione del catalogo: %u\n" #: pg_controldata.c:232 #, c-format msgid "Database system identifier: %llu\n" -msgstr "" -"Identificatore di sistema del database: %llu\n" -"\n" +msgstr "Identificatore di sistema del database: %llu\n" #: pg_controldata.c:234 #, c-format @@ -439,9 +437,7 @@ msgstr "impostazione di max_worker_processes: %d\n" #: pg_controldata.c:295 #, c-format msgid "max_wal_senders setting: %d\n" -msgstr "" -"impostazione di max_wal_senders: %d\n" -"\n" +msgstr "impostazione di max_wal_senders: %d\n" #: pg_controldata.c:297 #, c-format diff --git a/src/bin/pg_controldata/po/ja.po b/src/bin/pg_controldata/po/ja.po index c6d728d8b95b5..8da59bf47503a 100644 --- a/src/bin/pg_controldata/po/ja.po +++ b/src/bin/pg_controldata/po/ja.po @@ -1,14 +1,14 @@ # Japanese message translation file for pg_controldata -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # Shigehiro Honda , 2005 # msgid "" msgstr "" -"Project-Id-Version: pg_controldata (PostgreSQL 16)\n" +"Project-Id-Version: pg_controldata (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-14 10:48+0900\n" -"PO-Revision-Date: 2022-05-10 13:48+0900\n" +"POT-Creation-Date: 2024-05-20 14:21+0900\n" +"PO-Revision-Date: 2024-05-20 16:33+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -18,31 +18,31 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../common/controldata_utils.c:73 +#: ../../common/controldata_utils.c:97 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読ã¿å–り用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/controldata_utils.c:86 +#: ../../common/controldata_utils.c:110 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"ã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: ../../common/controldata_utils.c:95 +#: ../../common/controldata_utils.c:119 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$zuãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" -#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244 +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #, c-format msgid "could not close file \"%s\": %m" msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/controldata_utils.c:124 +#: ../../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ã®ä¸æ•´åˆ" -#: ../../common/controldata_utils.c:126 +#: ../../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -55,17 +55,17 @@ msgstr "" "ã•れるもã®ã¨ä¸€è‡´ã—ãªã„よã†ã§ã™ã€‚ã“ã®å ´åˆä»¥ä¸‹ã®çµæžœã¯ä¸æ­£ç¢ºã«ãªã‚Šã¾ã™ã€‚ã¾ãŸã€\n" "PostgreSQLインストレーションã¯ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨äº’æ›æ€§ãŒãªããªã‚Šã¾ã™ã€‚" -#: ../../common/controldata_utils.c:194 +#: ../../common/controldata_utils.c:230 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/controldata_utils.c:213 +#: ../../common/controldata_utils.c:249 #, c-format msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/controldata_utils.c:232 +#: ../../common/controldata_utils.c:268 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" @@ -168,8 +168,8 @@ msgid "unrecognized status code" msgstr "未知ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚³ãƒ¼ãƒ‰" #: pg_controldata.c:84 -msgid "unrecognized wal_level" -msgstr "wal_level ã‚’èªè­˜ã§ãã¾ã›ã‚“" +msgid "unrecognized \"wal_level\"" +msgstr "\"wal_level\"ã‚’èªè­˜ã§ãã¾ã›ã‚“" #: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 #, c-format @@ -186,341 +186,310 @@ msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")" msgid "no data directory specified" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: pg_controldata.c:170 +#: pg_controldata.c:171 #, c-format -msgid "" -"WARNING: Calculated CRC checksum does not match value stored in file.\n" -"Either the file is corrupt, or it has a different layout than this program\n" -"is expecting. The results below are untrustworthy.\n" -"\n" -msgstr "" -"警告: CRCãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®è¨ˆç®—çµæžœãŒãƒ•ァイル内ã®å€¤ã¨ä¸€è‡´ã—ã¾ã›ã‚“。\n" -"ファイルã®ç ´æã€ã‚ã‚‹ã„ã¯ã€æœ¬ãƒ—ãƒ­ã‚°ãƒ©ãƒ ãŒæƒ³å®šã™ã‚‹ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã¨ç•°ãªã‚‹\n" -"å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚以下ã®çµæžœã¯ä¿¡é ¼ã§ãã¾ã›ã‚“。\n" -"\n" +msgid "calculated CRC checksum does not match value stored in control file" +msgstr "算出ã•れãŸCRCãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒåˆ¶å¾¡ãƒ•ã‚¡ã‚¤ãƒ«ã«æ ¼ç´ã•れã¦ã„る値ã¨ä¸€è‡´ã—ã¾ã›ã‚“" -#: pg_controldata.c:179 +#: pg_controldata.c:172 #, c-format -msgid "WARNING: invalid WAL segment size\n" -msgstr "警告: 䏿­£ãªWALセグメントサイズ\n" +msgid "Either the control file is corrupt, or it has a different layout than this program is expecting. The results below are untrustworthy." +msgstr "制御ファイルãŒç ´æã—ã¦ã„ã‚‹ã‹ã€ã“ã®ãƒ—ãƒ­ã‚°ãƒ©ãƒ ãŒæœŸå¾…ã—ã¦ã„ãªã„é…ç½®ã«ãªã£ã¦ã„ã¾ã™ã€‚以下ã®çµæžœã¯ä¿¡é ¼ã§ãã¾ã›ã‚“。" -#: pg_controldata.c:180 +#: pg_controldata.c:181 #, c-format -msgid "" -"The WAL segment size stored in the file, %d byte, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgid_plural "" -"The WAL segment size stored in the file, %d bytes, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgstr[0] "" -"ファイル中ã®WALセグメントサイズ㯠%d ãƒã‚¤ãƒˆã¨ãªã£ã¦ã„ã¾ã™ãŒã€ã“れã¯\n" -"1MBã‹ã‚‰1GBã¾ã§ã®2ã®ç´¯ä¹—ã§ã¯ã‚りã¾ã›ã‚“。ã“ã®ãƒ•ァイルã¯å£Šã‚Œã¦ãŠã‚Šã€\n" -"ä»¥ä¸‹ã®æƒ…å ±ã¯ä¿¡é ¼ã§ãã¾ã›ã‚“。\n" -"\n" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "制御ファイル中ã®ä¸æ­£ãªWALセグメントサイズ (%dãƒã‚¤ãƒˆ)" + +#: pg_controldata.c:185 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WALセグメントサイズã¯1MBã‹ã‚‰1GBã¾ã§ã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" + +#: pg_controldata.c:186 +#, c-format +msgid "The file is corrupt and the results below are untrustworthy." +msgstr "ã“ã®ãƒ•ァイルã¯ç ´æã—ã¦ãŠã‚Šã€ä»¥ä¸‹ã®çµæžœã¯ä¿¡é ¼ã§ãã¾ã›ã‚“。" -#: pg_controldata.c:222 +#: pg_controldata.c:221 msgid "???" msgstr "???" -#: pg_controldata.c:228 +#: pg_controldata.c:227 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_controlãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·: %u\n" -#: pg_controldata.c:230 +#: pg_controldata.c:229 #, c-format msgid "Catalog version number: %u\n" msgstr "カタログãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·: %u\n" -#: pg_controldata.c:232 +#: pg_controldata.c:231 #, c-format msgid "Database system identifier: %llu\n" msgstr "データベースシステム識別å­: %llu\n" -#: pg_controldata.c:234 +#: pg_controldata.c:233 #, c-format msgid "Database cluster state: %s\n" msgstr "データベースクラスタã®çŠ¶æ…‹: %s\n" -#: pg_controldata.c:236 +#: pg_controldata.c:235 #, c-format msgid "pg_control last modified: %s\n" msgstr "pg_control最終更新: %s\n" -#: pg_controldata.c:238 +#: pg_controldata.c:237 #, c-format msgid "Latest checkpoint location: %X/%X\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆä½ç½®: %X/%X\n" -#: pg_controldata.c:240 +#: pg_controldata.c:239 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®REDOä½ç½®: %X/%X\n" -#: pg_controldata.c:242 +#: pg_controldata.c:241 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®REDO WALファイル: %s\n" -#: pg_controldata.c:244 +#: pg_controldata.c:243 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®æ™‚系列ID: %u\n" -#: pg_controldata.c:246 +#: pg_controldata.c:245 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®PrevTimeLineID: %u\n" -#: pg_controldata.c:248 +#: pg_controldata.c:247 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®full_page_writes: %s\n" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "off" msgstr "オフ" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "on" msgstr "オン" -#: pg_controldata.c:250 +#: pg_controldata.c:249 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextXID: %u:%u\n" -#: pg_controldata.c:253 +#: pg_controldata.c:252 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextOID: %u\n" -#: pg_controldata.c:255 +#: pg_controldata.c:254 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextMultiXactId: %u\n" -#: pg_controldata.c:257 +#: pg_controldata.c:256 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextMultiOffset: %u\n" -#: pg_controldata.c:259 +#: pg_controldata.c:258 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestXID: %u\n" -#: pg_controldata.c:261 +#: pg_controldata.c:260 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestXIDã®DB: %u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:262 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestActiveXID: %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:264 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestMultiXid: %u\n" -#: pg_controldata.c:267 +#: pg_controldata.c:266 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestMultiã®DB: %u\n" -#: pg_controldata.c:269 +#: pg_controldata.c:268 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestCommitTsXid: %u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:270 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®newestCommitTsXid: %u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:272 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆæ™‚刻: %s\n" -#: pg_controldata.c:275 +#: pg_controldata.c:274 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "UNLOGGEDリレーションã®å½ã®LSNカウンタ: %X/%X\n" -#: pg_controldata.c:277 +#: pg_controldata.c:276 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "最å°ãƒªã‚«ãƒãƒªçµ‚了ä½ç½®: %X/%X\n" -#: pg_controldata.c:279 +#: pg_controldata.c:278 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "最å°ãƒªã‚«ãƒãƒªçµ‚了ä½ç½®ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³: %u\n" -#: pg_controldata.c:281 +#: pg_controldata.c:280 #, c-format msgid "Backup start location: %X/%X\n" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—é–‹å§‹ä½ç½®: %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:282 #, c-format msgid "Backup end location: %X/%X\n" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—終了ä½ç½®: %X/%X\n" -#: pg_controldata.c:285 +#: pg_controldata.c:284 #, c-format msgid "End-of-backup record required: %s\n" msgstr "å¿…è¦ãªãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—最終レコード: %s\n" -#: pg_controldata.c:286 +#: pg_controldata.c:285 msgid "no" msgstr "ã„ã„ãˆ" -#: pg_controldata.c:286 +#: pg_controldata.c:285 msgid "yes" msgstr "ã¯ã„" -#: pg_controldata.c:287 +#: pg_controldata.c:286 #, c-format msgid "wal_level setting: %s\n" msgstr "wal_levelã®è¨­å®š: %s\n" -#: pg_controldata.c:289 +#: pg_controldata.c:288 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "wal_log_hintsã®è¨­å®š: %s\n" -#: pg_controldata.c:291 +#: pg_controldata.c:290 #, c-format msgid "max_connections setting: %d\n" msgstr "max_connectionsã®è¨­å®š: %d\n" -#: pg_controldata.c:293 +#: pg_controldata.c:292 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "max_worker_processesã®è¨­å®š: %d\n" -#: pg_controldata.c:295 +#: pg_controldata.c:294 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "max_wal_sendersã®è¨­å®š: %d\n" -#: pg_controldata.c:297 +#: pg_controldata.c:296 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "max_prepared_xactsã®è¨­å®š: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:298 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "max_locks_per_xactã®è¨­å®š: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:300 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "track_commit_timestampã®è¨­å®š: %s\n" -#: pg_controldata.c:303 +#: pg_controldata.c:302 #, c-format msgid "Maximum data alignment: %u\n" msgstr "最大データアラインメント: %u\n" -#: pg_controldata.c:306 +#: pg_controldata.c:305 #, c-format msgid "Database block size: %u\n" msgstr "データベースã®ãƒ–ロックサイズ: %u\n" -#: pg_controldata.c:308 +#: pg_controldata.c:307 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "大ããªãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆæ¯Žã®ãƒ–ロック数:%u\n" -#: pg_controldata.c:310 +#: pg_controldata.c:309 #, c-format msgid "WAL block size: %u\n" msgstr "WALã®ãƒ–ロックサイズ: %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:311 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "WALセグメント当ãŸã‚Šã®ãƒã‚¤ãƒˆæ•°: %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:313 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "識別å­ã®æœ€å¤§é•·: %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:315 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†…ã®æœ€å¤§åˆ—æ•°: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:317 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "TOASTãƒãƒ£ãƒ³ã‚¯ã®æœ€å¤§ã‚µã‚¤ã‚º: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:319 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "ラージオブジェクトãƒãƒ£ãƒ³ã‚¯ã®ã‚µã‚¤ã‚º: %u\n" -#: pg_controldata.c:323 +#: pg_controldata.c:322 #, c-format msgid "Date/time type storage: %s\n" msgstr "日付/æ™‚åˆ»åž‹ã®æ ¼ç´æ–¹å¼: %s\n" -#: pg_controldata.c:324 +#: pg_controldata.c:323 msgid "64-bit integers" msgstr "64ビット整数" -#: pg_controldata.c:325 +#: pg_controldata.c:324 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Float8å¼•æ•°ã®æ¸¡ã—æ–¹: %s\n" -#: pg_controldata.c:326 +#: pg_controldata.c:325 msgid "by reference" msgstr "å‚照渡ã—" -#: pg_controldata.c:326 +#: pg_controldata.c:325 msgid "by value" msgstr "値渡ã—" -#: pg_controldata.c:327 +#: pg_controldata.c:326 #, c-format msgid "Data page checksum version: %u\n" msgstr "データベージãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:328 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "èªè¨¼ç”¨ã®ç–‘ä¼¼nonce: %s\n" - -#~ msgid "%s: could not open file \"%s\" for reading: %s\n" -#~ msgstr "%s: 読ã¿å–り用ã®\"%s\"ファイルã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n" - -#~ msgid "%s: could not read file \"%s\": %s\n" -#~ msgstr "%s: \"%s\"ファイルã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n" - -#~ msgid "%s: could not read file \"%s\": read %d of %d\n" -#~ msgstr "%1$s: ファイル\"%2$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %4$dãƒã‚¤ãƒˆã®ã†ã¡%3$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ\n" - -#~ msgid "Prior checkpoint location: %X/%X\n" -#~ msgstr "å‰å›žã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆä½ç½®: %X/%X\n" - -#~ msgid " -?, --help show this help, then exit\n" -#~ msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦ã€çµ‚了ã—ã¾ã™\n" - -#~ msgid " -V, --version output version information, then exit\n" -#~ msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦ã€çµ‚了ã—ã¾ã™\n" - -#~ msgid "Float4 argument passing: %s\n" -#~ msgstr "Float4å¼•æ•°ã®æ¸¡ã—æ–¹: %s\n" diff --git a/src/bin/pg_controldata/po/ka.po b/src/bin/pg_controldata/po/ka.po index 49044c061c959..5cab2d7d61167 100644 --- a/src/bin/pg_controldata/po/ka.po +++ b/src/bin/pg_controldata/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_controldata (PostgreSQL) 15\n" +"Project-Id-Version: pg_controldata (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-02 04:51+0000\n" -"PO-Revision-Date: 2022-07-04 20:26+0200\n" +"POT-Creation-Date: 2024-07-01 03:53+0000\n" +"PO-Revision-Date: 2024-05-19 07:11+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,64 +16,70 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.1\n" +"X-Generator: Poedit 3.3.2\n" -#: ../../common/controldata_utils.c:73 +#: ../../common/controldata_utils.c:97 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: ../../common/controldata_utils.c:86 +#: ../../common/controldata_utils.c:110 #, c-format msgid "could not read file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: ../../common/controldata_utils.c:95 +#: ../../common/controldata_utils.c:119 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "\"%s\"-ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %zu-დáƒáƒœ" -#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244 +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #, c-format msgid "could not close file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: ../../common/controldata_utils.c:124 +#: ../../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რáƒáƒ  ემთხვევáƒ" -#: ../../common/controldata_utils.c:126 +#: ../../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" -"The byte ordering used to store the pg_control file might not match the " -"one\n" -"used by this program. In that case the results below would be incorrect, " -"and\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" "the PostgreSQL installation would be incompatible with this data directory." msgstr "" -"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘ის შესáƒáƒ«áƒšáƒ შეუსáƒáƒ‘áƒáƒ›áƒáƒ‘რpg_control ფáƒáƒ˜áƒšáƒ˜áƒ¡ შესáƒáƒœáƒáƒ®áƒáƒ“ " -"გáƒáƒ›áƒáƒ§áƒ”ნებული \n" -"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რშესáƒáƒ«áƒšáƒáƒ áƒáƒ  ემთხვეáƒáƒ“ეს áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ მიერ გáƒáƒ›áƒáƒ§áƒ”ნებულს. " -"áƒáƒ› შემთხვევáƒáƒ¨áƒ˜ ქვემáƒáƒ— \n" -"მáƒáƒªáƒ”მული შედეგები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იქნებრდრPostgreSQL ეს áƒáƒ’ებრáƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრ" -"სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ შეუთáƒáƒ•სებელი იქნებáƒ." +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘ის შესáƒáƒ«áƒšáƒ შეუსáƒáƒ‘áƒáƒ›áƒáƒ‘რpg_control ფáƒáƒ˜áƒšáƒ˜áƒ¡ შესáƒáƒœáƒáƒ®áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული \n" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რშესáƒáƒ«áƒšáƒáƒ áƒáƒ  ემთხვეáƒáƒ“ეს áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ მიერ გáƒáƒ›áƒáƒ§áƒ”ნებულს. áƒáƒ› შემთხვევáƒáƒ¨áƒ˜ ქვემáƒáƒ— \n" +"მáƒáƒªáƒ”მული შედეგები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იქნებრდრPostgreSQL ეს áƒáƒ’ებრáƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ შეუთáƒáƒ•სებელი იქნებáƒ." -#: ../../common/controldata_utils.c:194 +#: ../../common/controldata_utils.c:230 #, c-format msgid "could not open file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: ../../common/controldata_utils.c:213 +#: ../../common/controldata_utils.c:249 #, c-format msgid "could not write file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" -#: ../../common/controldata_utils.c:232 +#: ../../common/controldata_utils.c:268 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" + #: pg_controldata.c:35 #, c-format msgid "" @@ -121,8 +127,7 @@ msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩ #, c-format msgid "" "\n" -"If no data directory (DATADIR) is specified, the environment variable " -"PGDATA\n" +"If no data directory (DATADIR) is specified, the environment variable PGDATA\n" "is used.\n" "\n" msgstr "" @@ -173,8 +178,8 @@ msgid "unrecognized status code" msgstr "სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ უცნáƒáƒ‘ი კáƒáƒ“ი" #: pg_controldata.c:84 -msgid "unrecognized wal_level" -msgstr "უცნáƒáƒ‘ი wal_level" +msgid "unrecognized \"wal_level\"" +msgstr "უცნáƒáƒ‘ი \"wal_level\"" #: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 #, c-format @@ -191,325 +196,335 @@ msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბი msgid "no data directory specified" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ" -#: pg_controldata.c:170 +#: pg_controldata.c:171 #, c-format -msgid "" -"WARNING: Calculated CRC checksum does not match value stored in file.\n" -"Either the file is corrupt, or it has a different layout than this " -"program\n" -"is expecting. The results below are untrustworthy.\n" -"\n" -msgstr "" -"გáƒáƒ¤áƒ áƒ—ხილებáƒ: გáƒáƒ›áƒáƒ—ვლილი CRC სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ ფáƒáƒ˜áƒšáƒ¨áƒ˜ შენáƒáƒ®áƒ£áƒš მნიშვნელáƒáƒ‘áƒáƒ¡ áƒáƒ  " -"ემთხვევáƒ. \n" -"ფáƒáƒ˜áƒšáƒ˜ áƒáƒœ დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ, áƒáƒœ áƒáƒ¥áƒ•ს გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ებული მიმდევრáƒáƒ‘áƒ. ვიდრე \n" -"პრáƒáƒ’რáƒáƒ›áƒ ელáƒáƒ“ებáƒ. ქვემáƒáƒ— მáƒáƒ§áƒ•áƒáƒœáƒ˜áƒšáƒ˜ შედეგები áƒáƒ áƒáƒ¡áƒáƒœáƒ“áƒáƒ.\n" -"\n" +msgid "calculated CRC checksum does not match value stored in control file" +msgstr "გáƒáƒ›áƒáƒ—ვლილი CRC სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებულ მნიშვნელáƒáƒ‘áƒáƒ¡ áƒáƒ  ემთხვევáƒ" -#: pg_controldata.c:179 +#: pg_controldata.c:172 #, c-format -msgid "WARNING: invalid WAL segment size\n" -msgstr "გáƒáƒ¤áƒ áƒ—ხლებáƒ: WAL-ის სეგმენტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ\n" +msgid "Either the control file is corrupt, or it has a different layout than this program is expecting. The results below are untrustworthy." +msgstr "áƒáƒœ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ, áƒáƒœ გáƒáƒáƒ©áƒœáƒ˜áƒ იმისგáƒáƒœ გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ებული გáƒáƒœáƒšáƒáƒ’ებáƒ, ვიდრე áƒáƒ›áƒáƒ¡ პრáƒáƒ’რáƒáƒ›áƒ მáƒáƒ”ლáƒáƒ“áƒ. ქვემრშედეგები სáƒáƒœáƒ“რáƒáƒ áƒáƒ." -#: pg_controldata.c:180 +#: pg_controldata.c:181 #, c-format -msgid "" -"The WAL segment size stored in the file, %d byte, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgid_plural "" -"The WAL segment size stored in the file, %d bytes, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgstr[0] "" -"ფáƒáƒ˜áƒšáƒ¨áƒ˜ შენáƒáƒ®áƒ£áƒšáƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ, %d ბáƒáƒ˜áƒ¢áƒ˜, áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒ˜áƒ¡ \n" -"ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜1 მბ-დáƒáƒœ 1 გბ-მდე. ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულირდრქვემáƒáƒ— მáƒáƒªáƒ”მულირშედეგები\n" -"áƒáƒ áƒáƒ¡áƒáƒœáƒ“áƒáƒ.\n" -msgstr[1] "" -"ფáƒáƒ˜áƒšáƒ¨áƒ˜ შენáƒáƒ®áƒ£áƒšáƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ, %d ბáƒáƒ˜áƒ¢áƒ˜, áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒ˜áƒ¡ \n" -"ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜1 მბ-დáƒáƒœ 1 გბ-მდე. ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულირდრქვემáƒáƒ— მáƒáƒªáƒ”მულირშედეგები\n" -"áƒáƒ áƒáƒ¡áƒáƒœáƒ“áƒáƒ.\n" - -#: pg_controldata.c:222 +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%d ბáƒáƒ˜áƒ¢áƒ˜)" +msgstr[1] "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%d ბáƒáƒ˜áƒ¢áƒ˜)" + +#: pg_controldata.c:185 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, შუáƒáƒšáƒ”დიდáƒáƒœ 1მბ-1გბ." + +#: pg_controldata.c:186 +#, c-format +msgid "The file is corrupt and the results below are untrustworthy." +msgstr "ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულირდრქვემრშედეგები სáƒáƒœáƒ“რáƒáƒ áƒáƒ." + +#: pg_controldata.c:221 msgid "???" msgstr "???" -#: pg_controldata.c:228 +#: pg_controldata.c:227 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_control ვერსიის ნáƒáƒ›áƒ”რი: %u\n" -#: pg_controldata.c:230 +#: pg_controldata.c:229 #, c-format msgid "Catalog version number: %u\n" msgstr "კáƒáƒ¢áƒáƒšáƒáƒ’ის ვერსიის ნáƒáƒ›áƒ”რი: %u\n" -#: pg_controldata.c:232 +#: pg_controldata.c:231 #, c-format msgid "Database system identifier: %llu\n" msgstr "ბáƒáƒ–ის სისტემური იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜: %llu\n" -#: pg_controldata.c:234 +#: pg_controldata.c:233 #, c-format msgid "Database cluster state: %s\n" msgstr "ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒ: %s\n" -#: pg_controldata.c:236 +#: pg_controldata.c:235 #, c-format msgid "pg_control last modified: %s\n" msgstr "pg_control-ის ბáƒáƒšáƒ ცვლილების დრáƒ: %s\n" -#: pg_controldata.c:238 +#: pg_controldata.c:237 #, c-format msgid "Latest checkpoint location: %X/%X\n" msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი მდებáƒáƒ áƒ”áƒáƒ‘áƒ: %X/%X\n" -#: pg_controldata.c:240 +#: pg_controldata.c:239 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის REDO-ის უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი მდებáƒáƒ áƒ”áƒáƒ‘áƒ: %X/%X\n" -#: pg_controldata.c:242 +#: pg_controldata.c:241 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის REDO WAL ფáƒáƒ˜áƒšáƒ˜: %s\n" -#: pg_controldata.c:244 +#: pg_controldata.c:243 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილისTimeLineID: %u\n" -#: pg_controldata.c:246 +#: pg_controldata.c:245 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის PrevTimeLineID: %u\n" -#: pg_controldata.c:248 +#: pg_controldata.c:247 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "უáƒáƒ®áƒšáƒ”სი უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის full_page_writes: %s\n" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "off" msgstr "გáƒáƒ›áƒáƒ áƒ—ული" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "on" msgstr "ჩáƒáƒ áƒ—" -#: pg_controldata.c:250 +#: pg_controldata.c:249 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextXID: %u:%u\n" -#: pg_controldata.c:253 +#: pg_controldata.c:252 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextOID: %u\n" -#: pg_controldata.c:255 +#: pg_controldata.c:254 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextMultiXactId: %u\n" -#: pg_controldata.c:257 +#: pg_controldata.c:256 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextMultiOffset: %u\n" -#: pg_controldata.c:259 +#: pg_controldata.c:258 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestXID: %u\n" -#: pg_controldata.c:261 +#: pg_controldata.c:260 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestXID's DB: %u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:262 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestActiveXID: %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:264 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestMultiXid: %u\n" -#: pg_controldata.c:267 +#: pg_controldata.c:266 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestMulti's DB: %u\n" -#: pg_controldata.c:269 +#: pg_controldata.c:268 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestCommitTsXid:%u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:270 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის newestCommitTsXid:%u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:272 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒáƒšáƒ წერტილის დრáƒ: %s\n" -#: pg_controldata.c:275 +#: pg_controldata.c:274 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "LSN-ის ყáƒáƒšáƒ‘ი მთვლელი áƒáƒ áƒáƒŸáƒ£áƒ áƒœáƒáƒšáƒ˜áƒ–ებáƒáƒ“ი ურთ-თვის: %X/%X\n" -#: pg_controldata.c:277 +#: pg_controldata.c:276 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "მინიმáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ¦áƒ“გენის დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘რ%X/%X\n" -#: pg_controldata.c:279 +#: pg_controldata.c:278 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "მინ. áƒáƒ¦áƒ“გ დáƒáƒ¡áƒáƒ¡áƒ  მდებáƒáƒ  დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი: %u\n" -#: pg_controldata.c:281 +#: pg_controldata.c:280 #, c-format msgid "Backup start location: %X/%X\n" msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ დáƒáƒ¬áƒ§áƒ”ბის მდებáƒáƒ áƒ”áƒáƒ‘áƒ: %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:282 #, c-format msgid "Backup end location: %X/%X\n" msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘áƒ: %X/%X\n" -#: pg_controldata.c:285 +#: pg_controldata.c:284 #, c-format msgid "End-of-backup record required: %s\n" msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡-ბáƒáƒšáƒ ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ: %s\n" -#: pg_controldata.c:286 +#: pg_controldata.c:285 msgid "no" msgstr "áƒáƒ áƒ" -#: pg_controldata.c:286 +#: pg_controldata.c:285 msgid "yes" msgstr "დიáƒáƒ®" -#: pg_controldata.c:287 +#: pg_controldata.c:286 #, c-format msgid "wal_level setting: %s\n" msgstr "wal_level პáƒáƒ áƒáƒ›áƒ”ტრი: %s\n" -#: pg_controldata.c:289 +#: pg_controldata.c:288 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "wal_log_hints პáƒáƒ áƒáƒ›áƒ”ტრი: %s\n" -#: pg_controldata.c:291 +#: pg_controldata.c:290 #, c-format msgid "max_connections setting: %d\n" msgstr "max_connections პáƒáƒ áƒáƒ›áƒ”ტრი: %d\n" -#: pg_controldata.c:293 +#: pg_controldata.c:292 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "max_worker_processes პáƒáƒ áƒáƒ›áƒ”ტრი: %d\n" -#: pg_controldata.c:295 +#: pg_controldata.c:294 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "max_wal_senders პáƒáƒ áƒáƒ›áƒ”ტრი: %d\n" -#: pg_controldata.c:297 +#: pg_controldata.c:296 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "max_prepared_xacts პáƒáƒ áƒáƒ›áƒ”ტრი: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:298 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "max_locks_per_xact პáƒáƒ áƒáƒ›áƒ”ტრი: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:300 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "track_commit_timestamp პáƒáƒ áƒáƒ›áƒ”ტრი: %s\n" -#: pg_controldata.c:303 +#: pg_controldata.c:302 #, c-format msgid "Maximum data alignment: %u\n" msgstr "მáƒáƒœáƒáƒªáƒ”მების სწáƒáƒ áƒ”ბის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ˜: %u\n" -#: pg_controldata.c:306 +#: pg_controldata.c:305 #, c-format msgid "Database block size: %u\n" msgstr "ბáƒáƒ–ის ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ: %u\n" -#: pg_controldata.c:308 +#: pg_controldata.c:307 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "დიდი ურთიერთáƒáƒ‘ის სეგმენტები თითáƒáƒ”ულ ბლáƒáƒ™áƒ¨áƒ˜: %u\n" -#: pg_controldata.c:310 +#: pg_controldata.c:309 #, c-format msgid "WAL block size: %u\n" msgstr "WAL ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ: %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:311 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "ბáƒáƒ˜áƒ¢áƒ”ბი თითáƒáƒ”ულ WAL სეგმენტში: %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:313 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "იდენტიფიკáƒáƒ¢áƒáƒ áƒ”ბის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიგრძე: %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:315 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "ინდექსში სვეტების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:317 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "TOAST ნáƒáƒ’ლეჯის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ზáƒáƒ›áƒ: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:319 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "დიდი áƒáƒ‘იექტის ნáƒáƒ’ლეჯის ზáƒáƒ›áƒ: %u\n" -#: pg_controldata.c:323 +#: pg_controldata.c:322 #, c-format msgid "Date/time type storage: %s\n" msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡ ტიპის სáƒáƒªáƒáƒ•ი: %s\n" -#: pg_controldata.c:324 +#: pg_controldata.c:323 msgid "64-bit integers" msgstr "64-ბიტიáƒáƒœáƒ˜ მთელ რიცხვები" -#: pg_controldata.c:325 +#: pg_controldata.c:324 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Float8 áƒáƒ áƒ’უმენტის გáƒáƒ“áƒáƒªáƒ”მáƒ: %s\n" -#: pg_controldata.c:326 +#: pg_controldata.c:325 msgid "by reference" msgstr "ბმით" -#: pg_controldata.c:326 +#: pg_controldata.c:325 msgid "by value" msgstr "მნიშვნელáƒáƒ‘ით" -#: pg_controldata.c:327 +#: pg_controldata.c:326 #, c-format msgid "Data page checksum version: %u\n" msgstr "მáƒáƒœáƒáƒªáƒ”მების გვერდის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ვერსიáƒ: %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:328 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "ფსევდáƒáƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ შემთხვევითი რიცხვი: %s\n" + +#, c-format +#~ msgid "" +#~ "The WAL segment size stored in the file, %d byte, is not a power of two\n" +#~ "between 1 MB and 1 GB. The file is corrupt and the results below are\n" +#~ "untrustworthy.\n" +#~ "\n" +#~ msgid_plural "" +#~ "The WAL segment size stored in the file, %d bytes, is not a power of two\n" +#~ "between 1 MB and 1 GB. The file is corrupt and the results below are\n" +#~ "untrustworthy.\n" +#~ "\n" +#~ msgstr[0] "" +#~ "ფáƒáƒ˜áƒšáƒ¨áƒ˜ შენáƒáƒ®áƒ£áƒšáƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ, %d ბáƒáƒ˜áƒ¢áƒ˜, áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒ˜áƒ¡ \n" +#~ "ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜1 მბ-დáƒáƒœ 1 გბ-მდე. ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულირდრქვემáƒáƒ— მáƒáƒªáƒ”მულირშედეგები\n" +#~ "áƒáƒ áƒáƒ¡áƒáƒœáƒ“áƒáƒ.\n" +#~ msgstr[1] "" +#~ "ფáƒáƒ˜áƒšáƒ¨áƒ˜ შენáƒáƒ®áƒ£áƒšáƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ, %d ბáƒáƒ˜áƒ¢áƒ˜, áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒ áƒ˜áƒ¡ \n" +#~ "ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜1 მბ-დáƒáƒœ 1 გბ-მდე. ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულირდრქვემáƒáƒ— მáƒáƒªáƒ”მულირშედეგები\n" +#~ "áƒáƒ áƒáƒ¡áƒáƒœáƒ“áƒáƒ.\n" + +#, c-format +#~ msgid "WARNING: invalid WAL segment size\n" +#~ msgstr "გáƒáƒ¤áƒ áƒ—ხლებáƒ: WAL-ის სეგმენტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ\n" diff --git a/src/bin/pg_controldata/po/ko.po b/src/bin/pg_controldata/po/ko.po index 962b36ece7286..b753d7e93c13c 100644 --- a/src/bin/pg_controldata/po/ko.po +++ b/src/bin/pg_controldata/po/ko.po @@ -3,10 +3,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_controldata (PostgreSQL) 13\n" +"Project-Id-Version: pg_controldata (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 20:46+0000\n" -"PO-Revision-Date: 2020-10-06 11:18+0900\n" +"POT-Creation-Date: 2025-01-17 04:53+0000\n" +"PO-Revision-Date: 2025-01-16 15:43+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean Team \n" "Language: ko\n" @@ -15,31 +15,31 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../common/controldata_utils.c:73 +#: ../../common/controldata_utils.c:97 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "\"%s\" 파ì¼ì„ ì½ê¸° 모드로 ì—´ 수 없습니다: %m" -#: ../../common/controldata_utils.c:89 +#: ../../common/controldata_utils.c:110 #, c-format msgid "could not read file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 없습니다: %m" -#: ../../common/controldata_utils.c:101 +#: ../../common/controldata_utils.c:119 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %zu" -#: ../../common/controldata_utils.c:117 ../../common/controldata_utils.c:259 +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #, c-format msgid "could not close file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ 없습니다: %m" -#: ../../common/controldata_utils.c:135 +#: ../../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "ë°”ì´íЏ 순서 불ì¼ì¹˜" -#: ../../common/controldata_utils.c:137 +#: ../../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -48,26 +48,38 @@ msgid "" "and\n" "the PostgreSQL installation would be incompatible with this data directory." msgstr "" -"ë°”ì´íЏ 순서가 ì¼ì¹˜í•˜ì§€ 않습니다.\n" -"pg_control 파ì¼ì„ 저장하는 ë° ì‚¬ìš©ëœ ë°”ì´íЏ 순서는 \n" -"ì´ í”„ë¡œê·¸ëž¨ì—서 사용하는 순서와 ì¼ì¹˜í•´ì•¼ 합니다. ì´ ê²½ìš° 아래 결과는\n" -"올바르지 않으며 ì´ ë°ì´í„° ë””ë ‰í„°ë¦¬ì— PostgreSQLì„ ì„¤ì¹˜í•  수 없습니다." +"ë°”ì´íЏ 순서 ì¼ì¹˜í•˜ì§€ 않는 문제\n" +"ë°”ì´íЏ 순서 정보는 pg_control 파ì¼ì„ 저장할 때 사용ë˜ëŠ”ë°,\n" +"ì´ íŒŒì¼ì˜ ë°”ì´íЏ 순서 정보와 ì´ í”„ë¡œê·¸ëž¨ì—서 사용하는 순서 ì •ë³´ê°€ 다릅니다.\n" +"ì´ëŸ´ 경우, 출력 결과가 바르지 ì•Šì„ ìˆ˜ 있고,\n" +"ì„¤ì¹˜ëœ PostgreSQL 프로그램과 ë°ì´í„° 디렉터리가 호환ë˜ì§€ ì•Šì„ ìˆ˜ 있습니다." -#: ../../common/controldata_utils.c:203 +#: ../../common/controldata_utils.c:230 #, c-format msgid "could not open file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 없습니다: %m" -#: ../../common/controldata_utils.c:224 +#: ../../common/controldata_utils.c:249 #, c-format msgid "could not write file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ 쓸 수 없습니다: %m" -#: ../../common/controldata_utils.c:245 +#: ../../common/controldata_utils.c:268 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ fsync í•  수 없습니다: %m" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "메모리 부족\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ë„ í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" + #: pg_controldata.c:35 #, c-format msgid "" @@ -168,15 +180,15 @@ msgid "unrecognized status code" msgstr "알수 없는 ìƒíƒœ 코드" #: pg_controldata.c:84 -msgid "unrecognized wal_level" -msgstr "알 수 없는 wal_level" +msgid "unrecognized \"wal_level\"" +msgstr "알 수 없는 \"wal_level\"" -#: pg_controldata.c:137 pg_controldata.c:155 pg_controldata.c:163 +#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "보다 ìžì„¸í•œ 정보는 \"%s --help\"\n" +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." -#: pg_controldata.c:153 +#: pg_controldata.c:154 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")" @@ -186,319 +198,334 @@ msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")" msgid "no data directory specified" msgstr "ë°ì´í„° 디렉터리를 지정하지 않았습니다" -#: pg_controldata.c:170 +#: pg_controldata.c:171 +#, c-format +msgid "calculated CRC checksum does not match value stored in control file" +msgstr "ê³„ì‚°ëœ CRC ì²´í¬ì„¬ ê°’ê³¼ 컨트롤 파ì¼ì— ì €ìž¥ëœ ê°’ì´ ë‹¤ë¦„" + +#: pg_controldata.c:172 #, c-format msgid "" -"WARNING: Calculated CRC checksum does not match value stored in file.\n" -"Either the file is corrupt, or it has a different layout than this program\n" -"is expecting. The results below are untrustworthy.\n" -"\n" +"Either the control file is corrupt, or it has a different layout than this " +"program is expecting. The results below are untrustworthy." msgstr "" -"경고: ê³„ì‚°ëœ CRC ì²´í¬ì„¬ê°’ì´ íŒŒì¼ì— 있는 ê°’ê³¼ 틀립니다.\n" -"ì´ ê²½ìš°ëŠ” 파ì¼ì´ ì†ìƒë˜ì—ˆê±°ë‚˜, ì´ í”„ë¡œê·¸ëž¨ê³¼ 컨트롤 파ì¼ì˜ ë²„ì „ì´ í‹€ë¦°\n" -"경우입니다. ê²°ê³¼ê°’ë“¤ì€ ë¯¿ì§€ 못할 ê°’ë“¤ì´ ì¶œë ¥ë  ìˆ˜ 있습니다.\n" -"\n" +"ì´ ê²½ìš°ëŠ” 컨트롤 파ì¼ì´ ì†ìƒë˜ì—ˆê±°ë‚˜, ì´ í”„ë¡œê·¸ëž¨ê³¼ 컨트롤 파ì¼ì˜ ë²„ì „ì´ í‹€" +"린 경우입니다. ê²°ê³¼ê°’ë“¤ì€ ë¯¿ì§€ 못할 ê°’ë“¤ì´ ì¶œë ¥ë  ìˆ˜ 있습니다." -#: pg_controldata.c:179 +#: pg_controldata.c:181 #, c-format -msgid "WARNING: invalid WAL segment size\n" -msgstr "경고: ìž˜ëª»ëœ WAL ì¡°ê° í¬ê¸°\n" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "컨트롤 파ì¼ì˜ WAL ì¡°ê° íŒŒì¼ í¬ê¸°ê°€ 올바르지 ì•ŠìŒ (%d ë°”ì´íЏ)" -#: pg_controldata.c:180 +#: pg_controldata.c:185 #, c-format -msgid "" -"The WAL segment size stored in the file, %d byte, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgid_plural "" -"The WAL segment size stored in the file, %d bytes, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgstr[0] "" -"ì €ìž¥ëœ WAL ì¡°ê° íŒŒì¼ì˜ í¬ê¸°ëŠ” %d ë°”ì´íŠ¸ìž…ë‹ˆë‹¤. ì´ ê°’ì€ 1MB부터 1GB사ì´\n" -"2^n ê°’ì´ ì•„ë‹™ë‹ˆë‹¤. 파ì¼ì´ ì†ìƒë˜ì—ˆìœ¼ë©°, ê²°ê³¼ ë˜í•œ ë¯¿ì„ ìˆ˜ 없습니다.\n" -"\n" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL ì¡°ê° íŒŒì¼ í¬ê¸°ëŠ” 1MBì—서 1GBì‚¬ì´ 2ì˜ ì œê³±ê°’ì´ì–´ì•¼ 합니다." + +#: pg_controldata.c:186 +#, c-format +msgid "The file is corrupt and the results below are untrustworthy." +msgstr "ì´ íŒŒì¼ì´ 깨져서 신뢰할 수 없는 ê²°ê³¼ê°’ì´ ì¶œë ¥ë©ë‹ˆë‹¤." -#: pg_controldata.c:222 +#: pg_controldata.c:221 msgid "???" msgstr "???" -#: pg_controldata.c:228 +#: pg_controldata.c:227 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_control 버전 번호: %u\n" -#: pg_controldata.c:230 +#: pg_controldata.c:229 #, c-format msgid "Catalog version number: %u\n" msgstr "카탈로그 버전 번호: %u\n" -#: pg_controldata.c:232 +#: pg_controldata.c:231 #, c-format msgid "Database system identifier: %llu\n" msgstr "ë°ì´í„°ë² ì´ìФ 시스템 ì‹ë³„ìž: %llu\n" -#: pg_controldata.c:234 +#: pg_controldata.c:233 #, c-format msgid "Database cluster state: %s\n" msgstr "ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„° ìƒíƒœ: %s\n" -#: pg_controldata.c:236 +#: pg_controldata.c:235 #, c-format msgid "pg_control last modified: %s\n" msgstr "pg_control 마지막 변경시간: %s\n" -#: pg_controldata.c:238 +#: pg_controldata.c:237 #, c-format msgid "Latest checkpoint location: %X/%X\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ 위치: %X/%X\n" -#: pg_controldata.c:241 +#: pg_controldata.c:239 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ REDO 위치: %X/%X\n" -#: pg_controldata.c:244 +#: pg_controldata.c:241 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ REDO WAL 파ì¼: %s\n" -#: pg_controldata.c:246 +#: pg_controldata.c:243 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ TimeLineID: %u\n" -#: pg_controldata.c:248 +#: pg_controldata.c:245 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ PrevTimeLineID: %u\n" -#: pg_controldata.c:250 +#: pg_controldata.c:247 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ full_page_writes: %s\n" -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "off" msgstr "off" -#: pg_controldata.c:251 pg_controldata.c:296 pg_controldata.c:308 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "on" msgstr "on" -#: pg_controldata.c:252 +#: pg_controldata.c:249 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ NextXID: %u:%u\n" -#: pg_controldata.c:255 +#: pg_controldata.c:252 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ NextOID: %u\n" -#: pg_controldata.c:257 +#: pg_controldata.c:254 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ NextMultiXactId: %u\n" -#: pg_controldata.c:259 +#: pg_controldata.c:256 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ NextMultiOffset: %u\n" -#: pg_controldata.c:261 +#: pg_controldata.c:258 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ ì œì¼ì˜¤ëž˜ëœXID: %u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:260 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ ì œì¼ì˜¤ëž˜ëœXIDì˜ DB: %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:262 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ ì œì¼ì˜¤ëž˜ëœActiveXID:%u\n" -#: pg_controldata.c:267 +#: pg_controldata.c:264 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ ì œì¼ì˜¤ëž˜ëœMultiXid: %u\n" -#: pg_controldata.c:269 +#: pg_controldata.c:266 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ ì œì¼ì˜¤ëž˜ëœë©€í‹°Xid DB:%u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:268 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ ì œì¼ì˜¤ëž˜ëœCommitTsXid:%u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:270 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ 최신CommitTsXid: %u\n" -#: pg_controldata.c:275 +#: pg_controldata.c:272 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ 시간: %s\n" -#: pg_controldata.c:277 +#: pg_controldata.c:274 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "언로그 릴레ì´ì…˜ì˜ 가짜 LSN ì¹´ìš´í„°: %X/%X\n" -#: pg_controldata.c:280 +#: pg_controldata.c:276 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "최소 복구 마지막 위치: %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:278 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "최소 복구 종료 ìœ„ì¹˜ì˜ íƒ€ìž„ë¼ì¸: %u\n" -#: pg_controldata.c:285 +#: pg_controldata.c:280 #, c-format msgid "Backup start location: %X/%X\n" msgstr "백업 시작 위치: %X/%X\n" -#: pg_controldata.c:288 +#: pg_controldata.c:282 #, c-format msgid "Backup end location: %X/%X\n" msgstr "백업 종료 위치: %X/%X\n" -#: pg_controldata.c:291 +#: pg_controldata.c:284 #, c-format msgid "End-of-backup record required: %s\n" msgstr "백업 종료 레코드 í•„ìš” 여부: %s\n" -#: pg_controldata.c:292 +#: pg_controldata.c:285 msgid "no" msgstr "아니오" -#: pg_controldata.c:292 +#: pg_controldata.c:285 msgid "yes" msgstr "예" -#: pg_controldata.c:293 +#: pg_controldata.c:286 #, c-format msgid "wal_level setting: %s\n" msgstr "wal_level 설정값: %s\n" -#: pg_controldata.c:295 +#: pg_controldata.c:288 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "wal_log_hints 설정값: %s\n" -#: pg_controldata.c:297 +#: pg_controldata.c:290 #, c-format msgid "max_connections setting: %d\n" msgstr "max_connections 설정값: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:292 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "max_worker_processes 설정값: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:294 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "max_wal_senders 설정값: %d\n" -#: pg_controldata.c:303 +#: pg_controldata.c:296 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "max_prepared_xacts 설정값: %d\n" -#: pg_controldata.c:305 +#: pg_controldata.c:298 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "max_locks_per_xact 설정값: %d\n" -#: pg_controldata.c:307 +#: pg_controldata.c:300 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "track_commit_timestamp 설정값: %s\n" -#: pg_controldata.c:309 +#: pg_controldata.c:302 #, c-format msgid "Maximum data alignment: %u\n" msgstr "최대 ìžë£Œ ì •ë ¬: %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:305 #, c-format msgid "Database block size: %u\n" msgstr "ë°ì´í„°ë² ì´ìФ ë¸”ë¡ í¬ê¸°: %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:307 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "대형 릴레ì´ì…˜ì˜ 세그먼트당 블럭 개수: %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:309 #, c-format msgid "WAL block size: %u\n" msgstr "WAL ë¸”ë¡ í¬ê¸°: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:311 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "WAL ì„¸ê·¸ë¨¼íŠ¸ì˜ í¬ê¸°(byte): %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:313 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "ì‹ë³„ìž ìµœëŒ€ 길ì´: %u\n" -#: pg_controldata.c:322 +#: pg_controldata.c:315 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "ì¸ë±ìФì—서 사용하는 최대 ì—´ 수: %u\n" -#: pg_controldata.c:324 +#: pg_controldata.c:317 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "TOAST ì²­í¬ ìµœëŒ€ í¬ê¸°: %u\n" -#: pg_controldata.c:326 +#: pg_controldata.c:319 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "대형 ê°ì²´ ì²­í¬ í¬ê¸°: %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:322 #, c-format msgid "Date/time type storage: %s\n" msgstr "ë‚ ì§œ/시간형 ìžë£Œì˜ 저장방ì‹: %s\n" -#: pg_controldata.c:330 +#: pg_controldata.c:323 msgid "64-bit integers" msgstr "64-비트 정수" -#: pg_controldata.c:331 +#: pg_controldata.c:324 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Float8 ì¸ìˆ˜ 전달: %s\n" -#: pg_controldata.c:332 +#: pg_controldata.c:325 msgid "by reference" msgstr "참조별" -#: pg_controldata.c:332 +#: pg_controldata.c:325 msgid "by value" msgstr "값별" -#: pg_controldata.c:333 +#: pg_controldata.c:326 #, c-format msgid "Data page checksum version: %u\n" msgstr "ë°ì´í„° 페ì´ì§€ ì²´í¬ì„¬ 버전: %u\n" -#: pg_controldata.c:335 +#: pg_controldata.c:328 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "임시 ëª¨ì˜ ì¸ì¦: %s\n" + +#, c-format +#~ msgid "WARNING: invalid WAL segment size\n" +#~ msgstr "경고: ìž˜ëª»ëœ WAL ì¡°ê° í¬ê¸°\n" + +#, c-format +#~ msgid "" +#~ "The WAL segment size stored in the file, %d byte, is not a power of two\n" +#~ "between 1 MB and 1 GB. The file is corrupt and the results below are\n" +#~ "untrustworthy.\n" +#~ "\n" +#~ msgid_plural "" +#~ "The WAL segment size stored in the file, %d bytes, is not a power of two\n" +#~ "between 1 MB and 1 GB. The file is corrupt and the results below are\n" +#~ "untrustworthy.\n" +#~ "\n" +#~ msgstr[0] "" +#~ "ì €ìž¥ëœ WAL ì¡°ê° íŒŒì¼ì˜ í¬ê¸°ëŠ” %d ë°”ì´íŠ¸ìž…ë‹ˆë‹¤. ì´ ê°’ì€ 1MB부터 1GB사ì´\n" +#~ "2^n ê°’ì´ ì•„ë‹™ë‹ˆë‹¤. 파ì¼ì´ ì†ìƒë˜ì—ˆìœ¼ë©°, ê²°ê³¼ ë˜í•œ ë¯¿ì„ ìˆ˜ 없습니다.\n" +#~ "\n" diff --git a/src/bin/pg_controldata/po/meson.build b/src/bin/pg_controldata/po/meson.build index 685f1c167a759..465bb3c2572ba 100644 --- a/src/bin/pg_controldata/po/meson.build +++ b/src/bin/pg_controldata/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_controldata-' + pg_version_major.to_string())] diff --git a/src/bin/pg_controldata/po/pt_BR.po b/src/bin/pg_controldata/po/pt_BR.po index 14f8bd2caefe8..4a697d5e1df79 100644 --- a/src/bin/pg_controldata/po/pt_BR.po +++ b/src/bin/pg_controldata/po/pt_BR.po @@ -12,7 +12,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-09-27 13:15-0300\n" -"PO-Revision-Date: 2005-10-04 23:00-0300\n" +"PO-Revision-Date: 2023-09-05 08:59+0200\n" "Last-Translator: Euler Taveira \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" @@ -104,7 +104,7 @@ msgstr "" #: pg_controldata.c:39 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]DIRDADOS diretório de dados\n" +msgstr " [-D, --pgdata=]DIRDADOS diretório de dados\n" #: pg_controldata.c:40 #, c-format @@ -137,7 +137,7 @@ msgstr "Relate erros a <%s>.\n" #: pg_controldata.c:45 #, c-format msgid "%s home page: <%s>\n" -msgstr "página web do %s: <%s>\n" +msgstr "Página web do %s: <%s>\n" #: pg_controldata.c:55 msgid "starting up" diff --git a/src/bin/pg_controldata/po/ru.po b/src/bin/pg_controldata/po/ru.po index 79a06b227aee7..5197e06cc71d3 100644 --- a/src/bin/pg_controldata/po/ru.po +++ b/src/bin/pg_controldata/po/ru.po @@ -4,47 +4,47 @@ # Serguei A. Mokhov , 2002-2004. # Oleg Bartunov , 2004. # Andrey Sudnik , 2011. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2024. msgid "" msgstr "" "Project-Id-Version: pg_controldata (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-27 14:52+0300\n" -"PO-Revision-Date: 2022-09-05 13:34+0300\n" +"POT-Creation-Date: 2025-02-08 07:44+0200\n" +"PO-Revision-Date: 2024-09-04 17:08+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ../../common/controldata_utils.c:73 +#: ../../common/controldata_utils.c:97 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m" -#: ../../common/controldata_utils.c:86 +#: ../../common/controldata_utils.c:110 #, c-format msgid "could not read file \"%s\": %m" msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" -#: ../../common/controldata_utils.c:95 +#: ../../common/controldata_utils.c:119 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %zu)" -#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244 +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #, c-format msgid "could not close file \"%s\": %m" msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m" -#: ../../common/controldata_utils.c:124 +#: ../../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "неÑоответÑтвие порÑдка байт" -#: ../../common/controldata_utils.c:126 +#: ../../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -58,21 +58,32 @@ msgstr "" "Ñтой программой. Ð’ Ñтом Ñлучае результаты будут неверными и\n" "уÑтановленный PostgreSQL будет неÑовмеÑтим Ñ Ñтим каталогом данных." -#: ../../common/controldata_utils.c:194 +#: ../../common/controldata_utils.c:230 #, c-format msgid "could not open file \"%s\": %m" msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" -#: ../../common/controldata_utils.c:213 +#: ../../common/controldata_utils.c:249 #, c-format msgid "could not write file \"%s\": %m" msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m" -#: ../../common/controldata_utils.c:232 +#: ../../common/controldata_utils.c:268 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "нехватка памÑти\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" + #: pg_controldata.c:35 #, c-format msgid "" @@ -173,378 +184,398 @@ msgid "unrecognized status code" msgstr "нераÑпознанный код ÑоÑтоÑниÑ" #: pg_controldata.c:84 -msgid "unrecognized wal_level" -msgstr "нераÑпознанный уровень WAL" +msgid "unrecognized \"wal_level\"" +msgstr "нераÑпознанное значение \"wal_level\"" -#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 +#: pg_controldata.c:139 pg_controldata.c:157 pg_controldata.c:164 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." -#: pg_controldata.c:154 +#: pg_controldata.c:155 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")" -#: pg_controldata.c:162 +#: pg_controldata.c:163 #, c-format msgid "no data directory specified" msgstr "каталог данных не указан" -#: pg_controldata.c:170 +#: pg_controldata.c:172 +#, c-format +msgid "calculated CRC checksum does not match value stored in control file" +msgstr "" +"вычиÑÐ»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма (CRC) не ÑоответÑтвует значению, Ñохранённому " +"в управлÑющем файле" + +#: pg_controldata.c:173 #, c-format msgid "" -"WARNING: Calculated CRC checksum does not match value stored in file.\n" -"Either the file is corrupt, or it has a different layout than this program\n" -"is expecting. The results below are untrustworthy.\n" -"\n" +"Either the control file is corrupt, or it has a different layout than this " +"program is expecting. The results below are untrustworthy." msgstr "" -"ПРЕДУПРЕЖДЕÐИЕ: ВычиÑÐ»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма не Ñовпадает Ñо значением в " -"файле.\n" -"Либо файл повреждён, либо его формат отличаетÑÑ Ð¾Ñ‚ ожидаемого.\n" -"Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть недоÑтоверной.\n" -"\n" +"Либо управлÑющий файл повреждён, либо его Ñтруктура отличаетÑÑ Ð¾Ñ‚ ожидаемой. " +"Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть недоÑтоверной." -#: pg_controldata.c:179 +#: pg_controldata.c:182 #, c-format -msgid "WARNING: invalid WAL segment size\n" -msgstr "ПРЕДУПРЕЖДЕÐИЕ: неверный размер Ñегмента WAL\n" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "управлÑющий файл Ñодержит неверный размер Ñегмента WAL (%d Б)" +msgstr[1] "управлÑющий файл Ñодержит неверный размер Ñегмента WAL (%d Б)" +msgstr[2] "управлÑющий файл Ñодержит неверный размер Ñегмента WAL (%d Б)" -#: pg_controldata.c:180 +#: pg_controldata.c:186 #, c-format -msgid "" -"The WAL segment size stored in the file, %d byte, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgid_plural "" -"The WAL segment size stored in the file, %d bytes, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgstr[0] "" -"Сохранённый в Ñтом файле размер Ñегмента WAL (байт: %d) не ÑвлÑетÑÑ " -"Ñтепенью\n" -"двух между 1 МБ и 1 ГБ. Файл иÑпорчен, Ð²Ñ‹Ð²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð½Ð¸Ð¶Ðµ информациÑ\n" -"подлежит Ñомнению.\n" -"\n" -msgstr[1] "" -"Сохранённый в Ñтом файле размер Ñегмента WAL (байт: %d) не ÑвлÑетÑÑ " -"Ñтепенью\n" -"двух между 1 МБ и 1 ГБ. Файл иÑпорчен, Ð²Ñ‹Ð²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð½Ð¸Ð¶Ðµ информациÑ\n" -"подлежит Ñомнению.\n" -"\n" -msgstr[2] "" -"Сохранённый в Ñтом файле размер Ñегмента WAL (байт: %d) не ÑвлÑетÑÑ " -"Ñтепенью\n" -"двух между 1 МБ и 1 ГБ. Файл иÑпорчен, Ð²Ñ‹Ð²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð½Ð¸Ð¶Ðµ информациÑ\n" -"подлежит Ñомнению.\n" -"\n" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "" +"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 ГБ." -#: pg_controldata.c:222 +#: pg_controldata.c:187 +#, c-format +msgid "The file is corrupt and the results below are untrustworthy." +msgstr "Файл иÑпорчен, поÑтому ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ðµ ÑвлÑетÑÑ Ð´Ð¾Ñтоверной." + +#: pg_controldata.c:205 pg_controldata.c:213 pg_controldata.c:232 +#, c-format msgid "???" msgstr "???" -#: pg_controldata.c:228 +#: pg_controldata.c:238 #, c-format msgid "pg_control version number: %u\n" msgstr "Ðомер верÑии pg_control: %u\n" -#: pg_controldata.c:230 +#: pg_controldata.c:240 #, c-format msgid "Catalog version number: %u\n" msgstr "Ðомер верÑии каталога: %u\n" -#: pg_controldata.c:232 +#: pg_controldata.c:242 #, c-format msgid "Database system identifier: %llu\n" msgstr "Идентификатор ÑиÑтемы баз данных: %llu\n" -#: pg_controldata.c:234 +#: pg_controldata.c:244 #, c-format msgid "Database cluster state: %s\n" msgstr "СоÑтоÑние клаÑтера БД: %s\n" -#: pg_controldata.c:236 +#: pg_controldata.c:246 #, c-format msgid "pg_control last modified: %s\n" msgstr "ПоÑледнее обновление pg_control: %s\n" # skip-rule: capital-letter-first -#: pg_controldata.c:238 +#: pg_controldata.c:248 #, c-format msgid "Latest checkpoint location: %X/%X\n" msgstr "Положение поÑледней конт. точки: %X/%X\n" # skip-rule: capital-letter-first -#: pg_controldata.c:240 +#: pg_controldata.c:250 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "Положение REDO поÑледней конт. точки: %X/%X\n" # skip-rule: capital-letter-first -#: pg_controldata.c:242 +#: pg_controldata.c:252 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "Файл WAL c REDO поÑледней к. Ñ‚.: %s\n" # skip-rule: capital-letter-first -#: pg_controldata.c:244 +#: pg_controldata.c:254 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "Ð›Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ поÑледней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:246 +#: pg_controldata.c:256 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "Пред. Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ поÑледней к. Ñ‚.: %u\n" # skip-rule: no-space-after-period -#: pg_controldata.c:248 +#: pg_controldata.c:258 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Режим full_page_writes поÑледней к.Ñ‚: %s\n" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:259 pg_controldata.c:300 pg_controldata.c:312 msgid "off" msgstr "выкл." -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:259 pg_controldata.c:300 pg_controldata.c:312 msgid "on" msgstr "вкл." # skip-rule: capital-letter-first -#: pg_controldata.c:250 +#: pg_controldata.c:260 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID поÑледней конт. точки: %u:%u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:253 +#: pg_controldata.c:263 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID поÑледней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:255 +#: pg_controldata.c:265 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId поÑлед. конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:257 +#: pg_controldata.c:267 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset поÑлед. конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:259 +#: pg_controldata.c:269 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID поÑледней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:261 +#: pg_controldata.c:271 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "БД Ñ oldestXID поÑледней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:263 +#: pg_controldata.c:273 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID поÑледней к. Ñ‚.: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:265 +#: pg_controldata.c:275 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid поÑледней конт. точки: %u\n" # skip-rule: double-space, capital-letter-first -#: pg_controldata.c:267 +#: pg_controldata.c:277 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "БД Ñ oldestMulti поÑледней к. Ñ‚.: %u\n" # skip-rule: double-space, capital-letter-first -#: pg_controldata.c:269 +#: pg_controldata.c:279 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid поÑледней к. Ñ‚.: %u\n" # skip-rule: capital-letter-first, double-space -#: pg_controldata.c:271 +#: pg_controldata.c:281 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid поÑледней к. Ñ‚.: %u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:283 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледней контрольной точки: %s\n" # skip-rule: capital-letter-first # well-spelled: нежурналир -#: pg_controldata.c:275 +#: pg_controldata.c:285 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "Фиктивный LSN Ð´Ð»Ñ Ð½ÐµÐ¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€. таблиц: %X/%X\n" -#: pg_controldata.c:277 +#: pg_controldata.c:287 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "Мин. положение конца воÑÑтановлениÑ: %X/%X\n" # skip-rule: capital-letter-first -#: pg_controldata.c:279 +#: pg_controldata.c:289 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "Ð›Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ мин. Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ðº. в.: %u\n" -#: pg_controldata.c:281 +#: pg_controldata.c:291 #, c-format msgid "Backup start location: %X/%X\n" msgstr "Положение начала копии: %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:293 #, c-format msgid "Backup end location: %X/%X\n" msgstr "Положение конца копии: %X/%X\n" -#: pg_controldata.c:285 +#: pg_controldata.c:295 #, c-format msgid "End-of-backup record required: %s\n" msgstr "ТребуетÑÑ Ð·Ð°Ð¿Ð¸ÑÑŒ конец-копии: %s\n" -#: pg_controldata.c:286 +#: pg_controldata.c:296 msgid "no" msgstr "нет" -#: pg_controldata.c:286 +#: pg_controldata.c:296 msgid "yes" msgstr "да" -#: pg_controldata.c:287 +#: pg_controldata.c:297 #, c-format msgid "wal_level setting: %s\n" msgstr "Значение wal_level: %s\n" -#: pg_controldata.c:289 +#: pg_controldata.c:299 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "Значение wal_log_hints: %s\n" -#: pg_controldata.c:291 +#: pg_controldata.c:301 #, c-format msgid "max_connections setting: %d\n" msgstr "Значение max_connections: %d\n" -#: pg_controldata.c:293 +#: pg_controldata.c:303 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "Значение max_worker_processes: %d\n" -#: pg_controldata.c:295 +#: pg_controldata.c:305 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "Значение max_wal_senders: %d\n" -#: pg_controldata.c:297 +#: pg_controldata.c:307 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "Значение max_prepared_xacts: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:309 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "Значение max_locks_per_xact: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:311 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "Значение track_commit_timestamp: %s\n" -#: pg_controldata.c:303 +#: pg_controldata.c:313 #, c-format msgid "Maximum data alignment: %u\n" msgstr "МакÑ. предел Ð²Ñ‹Ñ€Ð°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…: %u\n" -#: pg_controldata.c:306 +#: pg_controldata.c:316 #, c-format msgid "Database block size: %u\n" msgstr "Размер блока БД: %u\n" # skip-rule: double-space -#: pg_controldata.c:308 +#: pg_controldata.c:318 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Блоков в макÑ. Ñегменте отношений: %u\n" -#: pg_controldata.c:310 +#: pg_controldata.c:320 #, c-format msgid "WAL block size: %u\n" msgstr "Размер блока WAL: %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:322 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Байт в Ñегменте WAL: %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:324 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° идентификаторов: %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:326 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "МакÑ. чиÑло Ñтолбцов в индекÑе: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:328 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "МакÑимальный размер порции TOAST: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:330 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Размер порции большого объекта: %u\n" -#: pg_controldata.c:323 +#: pg_controldata.c:333 #, c-format msgid "Date/time type storage: %s\n" msgstr "Формат Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚Ñ‹/времени: %s\n" -#: pg_controldata.c:324 +#: pg_controldata.c:334 msgid "64-bit integers" msgstr "64-битные целые" -#: pg_controldata.c:325 +#: pg_controldata.c:335 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Передача аргумента float8: %s\n" -#: pg_controldata.c:326 +#: pg_controldata.c:336 msgid "by reference" msgstr "по ÑÑылке" -#: pg_controldata.c:326 +#: pg_controldata.c:336 msgid "by value" msgstr "по значению" -#: pg_controldata.c:327 +#: pg_controldata.c:337 #, c-format msgid "Data page checksum version: %u\n" msgstr "ВерÑÐ¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… Ñумм Ñтраниц: %u\n" # skip-rule: capital-letter-first -#: pg_controldata.c:329 +#: pg_controldata.c:339 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "Случ. чиÑло Ð´Ð»Ñ Ð¿Ñевдоаутентификации: %s\n" +#, c-format +#~ msgid "WARNING: invalid WAL segment size\n" +#~ msgstr "ПРЕДУПРЕЖДЕÐИЕ: неверный размер Ñегмента WAL\n" + +#, c-format +#~ msgid "" +#~ "The WAL segment size stored in the file, %d byte, is not a power of two\n" +#~ "between 1 MB and 1 GB. The file is corrupt and the results below are\n" +#~ "untrustworthy.\n" +#~ "\n" +#~ msgid_plural "" +#~ "The WAL segment size stored in the file, %d bytes, is not a power of two\n" +#~ "between 1 MB and 1 GB. The file is corrupt and the results below are\n" +#~ "untrustworthy.\n" +#~ "\n" +#~ msgstr[0] "" +#~ "Сохранённый в Ñтом файле размер Ñегмента WAL (байт: %d) не ÑвлÑетÑÑ " +#~ "Ñтепенью\n" +#~ "двух между 1 МБ и 1 ГБ. Файл иÑпорчен, Ð²Ñ‹Ð²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð½Ð¸Ð¶Ðµ информациÑ\n" +#~ "подлежит Ñомнению.\n" +#~ "\n" +#~ msgstr[1] "" +#~ "Сохранённый в Ñтом файле размер Ñегмента WAL (байт: %d) не ÑвлÑетÑÑ " +#~ "Ñтепенью\n" +#~ "двух между 1 МБ и 1 ГБ. Файл иÑпорчен, Ð²Ñ‹Ð²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð½Ð¸Ð¶Ðµ информациÑ\n" +#~ "подлежит Ñомнению.\n" +#~ "\n" +#~ msgstr[2] "" +#~ "Сохранённый в Ñтом файле размер Ñегмента WAL (байт: %d) не ÑвлÑетÑÑ " +#~ "Ñтепенью\n" +#~ "двух между 1 МБ и 1 ГБ. Файл иÑпорчен, Ð²Ñ‹Ð²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð½Ð¸Ð¶Ðµ информациÑ\n" +#~ "подлежит Ñомнению.\n" +#~ "\n" + #~ msgid "Report bugs to .\n" #~ msgstr "Об ошибках Ñообщайте по адреÑу .\n" @@ -555,11 +586,6 @@ msgstr "Случ. чиÑло Ð´Ð»Ñ Ð¿Ñевдоаутентификации: %s #~ msgid "Prior checkpoint location: %X/%X\n" #~ msgstr "Положение предыдущей конт. точки: %X/%X\n" -#~ msgid "calculated CRC checksum does not match value stored in file" -#~ msgstr "" -#~ "вычиÑÐ»ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма (CRC) не ÑоответÑтвует значению, " -#~ "Ñохранённому в файле" - #~ msgid "floating-point numbers" #~ msgstr "чиÑла Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой" diff --git a/src/bin/pg_controldata/po/sv.po b/src/bin/pg_controldata/po/sv.po index aa7501af9da18..07b46343b13f3 100644 --- a/src/bin/pg_controldata/po/sv.po +++ b/src/bin/pg_controldata/po/sv.po @@ -1,16 +1,16 @@ # Swedish message translation file for pg_controldata # This file is put in the public domain. -# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. +# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # Mats Erik Andersson , 2014. # # Use these quotes: "%s" # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-11 09:21+0000\n" -"PO-Revision-Date: 2022-04-11 14:40+0200\n" +"POT-Creation-Date: 2024-07-12 14:24+0000\n" +"PO-Revision-Date: 2024-07-12 19:01+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -19,31 +19,31 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../common/controldata_utils.c:73 +#: ../../common/controldata_utils.c:97 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "kunde inte öppna filen \"%s\" för läsning: %m" -#: ../../common/controldata_utils.c:86 +#: ../../common/controldata_utils.c:110 #, c-format msgid "could not read file \"%s\": %m" msgstr "kunde inte läsa fil \"%s\": %m" -#: ../../common/controldata_utils.c:95 +#: ../../common/controldata_utils.c:119 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" -#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244 +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #, c-format msgid "could not close file \"%s\": %m" msgstr "kunde inte stänga fil \"%s\": %m" -#: ../../common/controldata_utils.c:124 +#: ../../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "byte-ordning stämmer inte" -#: ../../common/controldata_utils.c:126 +#: ../../common/controldata_utils.c:170 #, c-format msgid "" "possible byte ordering mismatch\n" @@ -56,21 +56,32 @@ msgstr "" "inte detta program. I sÃ¥ fall kan nedanstÃ¥ende resultat vara felaktiga\n" "och PostgreSQL-installationen vara inkompatibel med databaskatalogen." -#: ../../common/controldata_utils.c:194 +#: ../../common/controldata_utils.c:230 #, c-format msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" -#: ../../common/controldata_utils.c:213 +#: ../../common/controldata_utils.c:249 #, c-format msgid "could not write file \"%s\": %m" msgstr "kunde inte skriva fil \"%s\": %m" -#: ../../common/controldata_utils.c:232 +#: ../../common/controldata_utils.c:268 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "kunde inte fsync:a fil \"%s\": %m" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "slut pÃ¥ minne\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kan inte duplicera null-pekare (internt fel)\n" + #: pg_controldata.c:35 #, c-format msgid "" @@ -170,8 +181,8 @@ msgid "unrecognized status code" msgstr "okänd statuskod" #: pg_controldata.c:84 -msgid "unrecognized wal_level" -msgstr "okänd wal_level" +msgid "unrecognized \"wal_level\"" +msgstr "okänd \"wal_level\"" #: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 #, c-format @@ -188,48 +199,34 @@ msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")" msgid "no data directory specified" msgstr "ingen datakatalog angiven" -#: pg_controldata.c:170 +#: pg_controldata.c:171 #, c-format -msgid "" -"WARNING: Calculated CRC checksum does not match value stored in file.\n" -"Either the file is corrupt, or it has a different layout than this program\n" -"is expecting. The results below are untrustworthy.\n" -"\n" -msgstr "" -"VARNING: Beräknad CRC-kontrollsumma matchar inte det värde som har sparats i filen.\n" -"Antingen är filen trasig, eller sÃ¥ har den en annan uppbyggnad än vad detta\n" -"program förväntade sig. Resultatet nedan är inte helt tillförlitligt.\n" -"\n" +msgid "calculated CRC checksum does not match value stored in control file" +msgstr "uträknad CRC-checksumma matchar inte värdet som är lagrat i kontrollfil" -#: pg_controldata.c:179 +#: pg_controldata.c:172 #, c-format -msgid "WARNING: invalid WAL segment size\n" -msgstr "VARNING: ogiltig WAL-segmentstorlek\n" +msgid "Either the control file is corrupt, or it has a different layout than this program is expecting. The results below are untrustworthy." +msgstr "Antingen är filen trasig, eller sÃ¥ har den en annan uppbyggnad än vad detta program förväntade sig. Resultatet nedan är inte helt tillförlitligt." -#: pg_controldata.c:180 +#: pg_controldata.c:181 #, c-format -msgid "" -"The WAL segment size stored in the file, %d byte, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgid_plural "" -"The WAL segment size stored in the file, %d bytes, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n" -"\n" -msgstr[0] "" -"WAL-segmentstorleken sparad i filen, %d byte, är inte en tvÃ¥potens\n" -"mellan 1 MB och 1 GB. Filen är trasig och resultatet nedan gÃ¥r\n" -"ej att lita pÃ¥.\n" -"\n" -msgstr[1] "" -"WAL-segmentstorleken sparad i filen, %d byte, är inte en tvÃ¥potens\n" -"mellan 1 MB och 1 GB. Filen är trasig och resultatet nedan gÃ¥r\n" -"ej att lita pÃ¥.\n" -"\n" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "ogiltigt WAL-segmentstorlek i kontrollfil (%d byte)" +msgstr[1] "ogiltigt WAL-segmentstorlek i kontrollfil (%d byte)" + +#: pg_controldata.c:185 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL-segmentstorleken mÃ¥ste vara en tvÃ¥potens mellan 1 MB och 1 GB." + +#: pg_controldata.c:186 +#, c-format +msgid "The file is corrupt and the results below are untrustworthy." +msgstr "Filen är trasig och resultatet nedan är inte helt tillförlitligt." -#: pg_controldata.c:222 +#: pg_controldata.c:221 msgid "???" msgstr "???" @@ -239,280 +236,280 @@ msgstr "???" # used for English is insufficient for Swedish. New indenting # is consistent for all reporting statements: six additional # space characters. -#: pg_controldata.c:228 +#: pg_controldata.c:227 #, c-format msgid "pg_control version number: %u\n" msgstr "Versionsnummer för pg_control: %u\n" -#: pg_controldata.c:230 +#: pg_controldata.c:229 #, c-format msgid "Catalog version number: %u\n" msgstr "Katalogversion: %u\n" -#: pg_controldata.c:232 +#: pg_controldata.c:231 #, c-format msgid "Database system identifier: %llu\n" msgstr "Databasens systemidentifierare: %llu\n" -#: pg_controldata.c:234 +#: pg_controldata.c:233 #, c-format msgid "Database cluster state: %s\n" msgstr "Databasklustrets tillstÃ¥nd: %s\n" -#: pg_controldata.c:236 +#: pg_controldata.c:235 #, c-format msgid "pg_control last modified: %s\n" msgstr "pg_control ändrades senast: %s\n" -#: pg_controldata.c:238 +#: pg_controldata.c:237 #, c-format msgid "Latest checkpoint location: %X/%X\n" -msgstr "Läge för senaste checkpoint: %X/%X\n" +msgstr "Läge för senaste kontrollpunkt: %X/%X\n" -#: pg_controldata.c:240 +#: pg_controldata.c:239 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" -msgstr "REDO-läge för senaste checkpoint: %X/%X\n" +msgstr "REDO-läge för senaste kontrollpunkt: %X/%X\n" -#: pg_controldata.c:242 +#: pg_controldata.c:241 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" -msgstr "REDO-WAL-fil vid senaste checkpoint: %s\n" +msgstr "REDO-WAL-fil vid senaste kontrollpunkt: %s\n" -#: pg_controldata.c:244 +#: pg_controldata.c:243 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" -msgstr "TimeLineID vid senaste checkpoint: %u\n" +msgstr "TimeLineID vid senaste kontrollpunkt: %u\n" -#: pg_controldata.c:246 +#: pg_controldata.c:245 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" -msgstr "PrevTimeLineID vid senaste checkpoint: %u\n" +msgstr "PrevTimeLineID vid senaste kontrollpunkt: %u\n" -#: pg_controldata.c:248 +#: pg_controldata.c:247 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" -msgstr "Senaste checkpoint:ens full_page_writes: %s\n" +msgstr "Senaste kontrollpunktens full_page_writes: %s\n" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "off" msgstr "av" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "on" msgstr "pÃ¥" -#: pg_controldata.c:250 +#: pg_controldata.c:249 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" -msgstr "NextXID vid senaste checkpoint: %u:%u\n" +msgstr "NextXID vid senaste kontrollpunkt: %u:%u\n" -#: pg_controldata.c:253 +#: pg_controldata.c:252 #, c-format msgid "Latest checkpoint's NextOID: %u\n" -msgstr "NextOID vid senaste checkpoint: %u\n" +msgstr "NextOID vid senaste kontrollpunkt: %u\n" -#: pg_controldata.c:255 +#: pg_controldata.c:254 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" -msgstr "NextMultiXactId vid senaste checkpoint: %u\n" +msgstr "NextMultiXactId vid senaste kontrollpunkt: %u\n" -#: pg_controldata.c:257 +#: pg_controldata.c:256 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" -msgstr "NextMultiOffset vid senaste checkpoint: %u\n" +msgstr "NextMultiOffset vid senaste kontrollpunkt: %u\n" -#: pg_controldata.c:259 +#: pg_controldata.c:258 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" -msgstr "oldestXID vid senaste checkpoint: %u\n" +msgstr "oldestXID vid senaste kontrollpunkt: %u\n" -#: pg_controldata.c:261 +#: pg_controldata.c:260 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" -msgstr "DB för oldestXID vid senaste checkpoint: %u\n" +msgstr "DB för oldestXID vid senaste kontrollpunkt: %u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:262 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" -msgstr "oldestActiveXID vid senaste checkpoint: %u\n" +msgstr "oldestActiveXID vid senaste kontrollpunkt: %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:264 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" -msgstr "oldestMultiXid vid senaste checkpoint: %u\n" +msgstr "oldestMultiXid vid senaste kontrollpunkt: %u\n" -#: pg_controldata.c:267 +#: pg_controldata.c:266 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" -msgstr "DB för oldestMulti vid senaste checkpoint: %u\n" +msgstr "DB för oldestMulti vid senaste kontrollpkt: %u\n" -#: pg_controldata.c:269 +#: pg_controldata.c:268 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" -msgstr "oldestCommitTsXid vid senaste checkpoint: %u\n" +msgstr "oldestCommitTsXid vid senaste kontrollpunkt:%u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:270 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" -msgstr "newestCommitTsXid vid senaste checkpoint: %u\n" +msgstr "newestCommitTsXid vid senaste kontrollpunkt:%u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:272 #, c-format msgid "Time of latest checkpoint: %s\n" -msgstr "Tidpunkt för senaste checkpoint: %s\n" +msgstr "Tidpunkt för senaste kontrollpunkt: %s\n" -#: pg_controldata.c:275 +#: pg_controldata.c:274 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "Beräknat LSN-tal av ologgade relationer: %X/%X\n" -#: pg_controldata.c:277 +#: pg_controldata.c:276 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "Minsta slutposition vid Ã¥terställning: %X/%X\n" -#: pg_controldata.c:279 +#: pg_controldata.c:278 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "Tidslinje för min slutpos vid Ã¥terställning:%u\n" -#: pg_controldata.c:281 +#: pg_controldata.c:280 #, c-format msgid "Backup start location: %X/%X\n" msgstr "Startpunkt för backup: %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:282 #, c-format msgid "Backup end location: %X/%X\n" msgstr "Slutpunkt för backup: %X/%X\n" -#: pg_controldata.c:285 +#: pg_controldata.c:284 #, c-format msgid "End-of-backup record required: %s\n" msgstr "Tvingande markering av backupslut: %s\n" -#: pg_controldata.c:286 +#: pg_controldata.c:285 msgid "no" msgstr "nej" -#: pg_controldata.c:286 +#: pg_controldata.c:285 msgid "yes" msgstr "ja" -#: pg_controldata.c:287 +#: pg_controldata.c:286 #, c-format msgid "wal_level setting: %s\n" msgstr "Värde pÃ¥ wal_level: %s\n" -#: pg_controldata.c:289 +#: pg_controldata.c:288 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "Värde pÃ¥ wal_log_hints: %s\n" -#: pg_controldata.c:291 +#: pg_controldata.c:290 #, c-format msgid "max_connections setting: %d\n" msgstr "Värde pÃ¥ max_connections: %d\n" -#: pg_controldata.c:293 +#: pg_controldata.c:292 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "Värde pÃ¥ max_worker_processes: %d\n" -#: pg_controldata.c:295 +#: pg_controldata.c:294 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "Värde pÃ¥ max_wal_senders setting %d\n" -#: pg_controldata.c:297 +#: pg_controldata.c:296 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "Värde pÃ¥ max_prepared_xacts: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:298 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "Nuvarande max_locks_per_xact: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:300 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "Värde pÃ¥ track_commit_timestamp: %s\n" -#: pg_controldata.c:303 +#: pg_controldata.c:302 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Maximal jämkning av data (alignment): %u\n" -#: pg_controldata.c:306 +#: pg_controldata.c:305 #, c-format msgid "Database block size: %u\n" msgstr "Databasens blockstorlek: %u\n" -#: pg_controldata.c:308 +#: pg_controldata.c:307 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Block per segment i en stor relation: %u\n" -#: pg_controldata.c:310 +#: pg_controldata.c:309 #, c-format msgid "WAL block size: %u\n" msgstr "Blockstorlek i transaktionsloggen: %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:311 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Segmentstorlek i transaktionsloggen: %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:313 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Maximal längd för identifierare: %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:315 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Maximalt antal kolonner i ett index: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:317 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Maximal storlek för en TOAST-enhet: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:319 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Storlek för large-object-enheter: %u\n" -#: pg_controldata.c:323 +#: pg_controldata.c:322 #, c-format msgid "Date/time type storage: %s\n" msgstr "Representation av dag och tid: %s\n" -#: pg_controldata.c:324 +#: pg_controldata.c:323 msgid "64-bit integers" msgstr "64-bitars heltal" -#: pg_controldata.c:325 +#: pg_controldata.c:324 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Överföring av float8-argument: %s\n" -#: pg_controldata.c:326 +#: pg_controldata.c:325 msgid "by reference" msgstr "med referens" -#: pg_controldata.c:326 +#: pg_controldata.c:325 msgid "by value" msgstr "med värde" -#: pg_controldata.c:327 +#: pg_controldata.c:326 #, c-format msgid "Data page checksum version: %u\n" msgstr "Checksummaversion för datasidor: %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:328 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "Fejkat authentiseringsvärde: %s\n" diff --git a/src/bin/pg_controldata/po/uk.po b/src/bin/pg_controldata/po/uk.po index 758c4c1245eb9..c2b2e3217f1bb 100644 --- a/src/bin/pg_controldata/po/uk.po +++ b/src/bin/pg_controldata/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:51+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:24+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,34 +14,34 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pg_controldata.pot\n" -"X-Crowdin-File-ID: 924\n" +"X-Crowdin-File: /REL_17_STABLE/pg_controldata.pot\n" +"X-Crowdin-File-ID: 1018\n" -#: ../../common/controldata_utils.c:73 +#: ../../common/controldata_utils.c:97 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m" -#: ../../common/controldata_utils.c:86 +#: ../../common/controldata_utils.c:110 #, c-format msgid "could not read file \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" -#: ../../common/controldata_utils.c:95 +#: ../../common/controldata_utils.c:119 #, c-format msgid "could not read file \"%s\": read %d of %zu" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %zu" -#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:244 +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 #, c-format msgid "could not close file \"%s\": %m" msgstr "неможливо закрити файл \"%s\": %m" -#: ../../common/controldata_utils.c:124 +#: ../../common/controldata_utils.c:168 msgid "byte ordering mismatch" msgstr "неправильний порÑдок байтів" -#: ../../common/controldata_utils.c:126 +#: ../../common/controldata_utils.c:170 #, c-format msgid "possible byte ordering mismatch\n" "The byte ordering used to store the pg_control file might not match the one\n" @@ -50,21 +50,32 @@ msgid "possible byte ordering mismatch\n" msgstr "можлива помилка у поÑлідовноÑті байтів.\n" "ПорÑдок байтів, що викориÑтовують Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ pg_control, може не відповідати тому, Ñкий викориÑтовуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ програмою. У такому випадку результати нижче будуть неправильним, Ñ– інÑталÑÑ†Ñ–Ñ PostgreSQL буде неÑуміÑною з цим каталогом даних." -#: ../../common/controldata_utils.c:194 +#: ../../common/controldata_utils.c:230 #, c-format msgid "could not open file \"%s\": %m" msgstr "не можливо відкрити файл \"%s\": %m" -#: ../../common/controldata_utils.c:213 +#: ../../common/controldata_utils.c:249 #, c-format msgid "could not write file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m" -#: ../../common/controldata_utils.c:232 +#: ../../common/controldata_utils.c:268 #, c-format msgid "could not fsync file \"%s\": %m" msgstr "не вдалоÑÑ fsync файл \"%s\": %m" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "недоÑтатньо пам'Ñті\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" + #: pg_controldata.c:35 #, c-format msgid "%s displays control information of a PostgreSQL database cluster.\n\n" @@ -153,8 +164,8 @@ msgid "unrecognized status code" msgstr "невизнаний код ÑтатуÑу" #: pg_controldata.c:84 -msgid "unrecognized wal_level" -msgstr "невизнаний wal_рівень" +msgid "unrecognized \"wal_level\"" +msgstr "нерозпізнано \"wal_level\"" #: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 #, c-format @@ -171,309 +182,313 @@ msgstr "забагато аргументів у командному Ñ€Ñдку msgid "no data directory specified" msgstr "каталог даних не вказано" -#: pg_controldata.c:170 +#: pg_controldata.c:171 +#, c-format +msgid "calculated CRC checksum does not match value stored in control file" +msgstr "обчиÑлена контрольна Ñума CRC не збігаєтьÑÑ Ð·Ñ– значеннÑм, що зберігаєтьÑÑ Ð² контрольному файлі" + +#: pg_controldata.c:172 #, c-format -msgid "WARNING: Calculated CRC checksum does not match value stored in file.\n" -"Either the file is corrupt, or it has a different layout than this program\n" -"is expecting. The results below are untrustworthy.\n\n" -msgstr "ПОПЕРЕДЖЕÐÐЯ: Контрольна Ñума CRC не відповідає збереженому значенню у файлі. Ðбо файл пошкоджено, або він міÑтить іншу Ñтруктуру, ніж очікує Ñ†Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð°. Результати нижче Ñ” недоÑтовірними.\n\n" +msgid "Either the control file is corrupt, or it has a different layout than this program is expecting. The results below are untrustworthy." +msgstr "Ðбо контрольний файл пошкоджено, або він має іншу Ñтруктуру, ніж очікує Ñ†Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð°. Ðаведені нижче результати не заÑлуговують на довіру." -#: pg_controldata.c:179 +#: pg_controldata.c:181 #, c-format -msgid "WARNING: invalid WAL segment size\n" -msgstr "ПОПЕРЕДЖЕÐÐЯ: неправильний розмір WAL Ñегменту \n" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "невірний розмір Ñегменту WAL у файлі ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ (%d байт)" +msgstr[1] "невірний розмір Ñегмента WAL у файлі ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ (%d байтів)" +msgstr[2] "невірний розмір Ñегмента WAL у файлі ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ (%d байтів)" +msgstr[3] "невірний розмір Ñегмента WAL у файлі ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ (%d байтів)" -#: pg_controldata.c:180 +#: pg_controldata.c:185 #, c-format -msgid "The WAL segment size stored in the file, %d byte, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n\n" -msgid_plural "The WAL segment size stored in the file, %d bytes, is not a power of two\n" -"between 1 MB and 1 GB. The file is corrupt and the results below are\n" -"untrustworthy.\n\n" -msgstr[0] "Розмір WAL Ñегменту збережений у файлі, %d байт, не Ñ” Ñтепенем двійки між 1 MB та 1 GB. Файл пошкоджено та результати нижче Ñ” недоÑтовірними.\n\n" -msgstr[1] "Розмір WAL Ñегменту збережений у файлі, %d байтів, не Ñ” Ñтепенем двійки між 1 MB та 1 GB. Файл пошкоджено та результати нижче Ñ” недоÑтовірними.\n\n" -msgstr[2] "Розмір WAL Ñегменту збережений у файлі, %d байтів, не Ñ” Ñтепенем двійки між 1 MB та 1 GB. Файл пошкоджено та результати нижче Ñ” недоÑтовірними.\n\n" -msgstr[3] "Розмір WAL Ñегменту збережений у файлі, %d байта, не Ñ” Ñтепенем двійки між 1 MB та 1 GB. Файл пошкоджено та результати нижче Ñ” недоÑтовірними.\n\n" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "Розмір Ñегмента WAL повинен бути Ñтепенем двійки від 1 МБ до 1 ГБ." -#: pg_controldata.c:222 +#: pg_controldata.c:186 +#, c-format +msgid "The file is corrupt and the results below are untrustworthy." +msgstr "Файл пошкоджено, Ñ– наведені нижче результати не заÑлуговують на довіру." + +#: pg_controldata.c:221 msgid "???" msgstr "???" -#: pg_controldata.c:228 +#: pg_controldata.c:227 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_control номер верÑÑ–Ñ—: %u\n" -#: pg_controldata.c:230 +#: pg_controldata.c:229 #, c-format msgid "Catalog version number: %u\n" msgstr "Ðомер верÑÑ–Ñ— каталогу: %u\n" -#: pg_controldata.c:232 +#: pg_controldata.c:231 #, c-format msgid "Database system identifier: %llu\n" msgstr "СиÑтемний ідентифікатор бази даних: %llu\n" -#: pg_controldata.c:234 +#: pg_controldata.c:233 #, c-format msgid "Database cluster state: %s\n" msgstr "Стан клаÑтеру бази даних: %s\n" -#: pg_controldata.c:236 +#: pg_controldata.c:235 #, c-format msgid "pg_control last modified: %s\n" msgstr "pg_control був модифікований воÑтаннє: %s\n" -#: pg_controldata.c:238 +#: pg_controldata.c:237 #, c-format msgid "Latest checkpoint location: %X/%X\n" msgstr "ОÑтаннє міÑце Ð·Ð½Ð°Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— точки: %X/%X\n" -#: pg_controldata.c:240 +#: pg_controldata.c:239 #, c-format msgid "Latest checkpoint's REDO location: %X/%X\n" msgstr "Ð Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ñтанньої контрольної точки: %X%X\n" -#: pg_controldata.c:242 +#: pg_controldata.c:241 #, c-format msgid "Latest checkpoint's REDO WAL file: %s\n" msgstr "ОÑтанній файл контрольної точки REDO WAL: %s\n" -#: pg_controldata.c:244 +#: pg_controldata.c:243 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "ОÑтанній TimeLineID контрольної точки: %u\n" -#: pg_controldata.c:246 +#: pg_controldata.c:245 #, c-format msgid "Latest checkpoint's PrevTimeLineID: %u\n" msgstr "ОÑтанній PrevTimeLineID контрольної точки: %u\n" -#: pg_controldata.c:248 +#: pg_controldata.c:247 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "ОÑтанній full_page_writes контрольної точки: %s\n" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "off" msgstr "вимк" -#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +#: pg_controldata.c:248 pg_controldata.c:289 pg_controldata.c:301 msgid "on" msgstr "увімк" -#: pg_controldata.c:250 +#: pg_controldata.c:249 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "ОÑтанній NextXID контрольної точки: %u%u\n" -#: pg_controldata.c:253 +#: pg_controldata.c:252 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "ОÑтанній NextOID контрольної точки: %u\n" -#: pg_controldata.c:255 +#: pg_controldata.c:254 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "ОÑтанній NextMultiXactId контрольної точки: %u\n" -#: pg_controldata.c:257 +#: pg_controldata.c:256 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "ОÑтанній NextMultiOffset контрольної точки: %u\n" -#: pg_controldata.c:259 +#: pg_controldata.c:258 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "ОÑтанній oldestXID контрольної точки: %u\n" -#: pg_controldata.c:261 +#: pg_controldata.c:260 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ DB оÑтаннього oldestXID контрольної точки: %u\n" -#: pg_controldata.c:263 +#: pg_controldata.c:262 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "ОÑтанній oldestActiveXID контрольної точки: %u\n" -#: pg_controldata.c:265 +#: pg_controldata.c:264 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "ОÑтанній oldestMultiXid контрольної точки: %u \n" -#: pg_controldata.c:267 +#: pg_controldata.c:266 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ DB оÑтанньої oldestMulti контрольної точки: %u\n" -#: pg_controldata.c:269 +#: pg_controldata.c:268 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "ОÑтанній oldestCommitTsXid контрольної точки:%u\n" -#: pg_controldata.c:271 +#: pg_controldata.c:270 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "ОÑтанній newestCommitTsXid контрольної точки: %u\n" -#: pg_controldata.c:273 +#: pg_controldata.c:272 #, c-format msgid "Time of latest checkpoint: %s\n" msgstr "Ð§Ð°Ñ Ð¾Ñтанньої контрольної точки: %s\n" -#: pg_controldata.c:275 +#: pg_controldata.c:274 #, c-format msgid "Fake LSN counter for unlogged rels: %X/%X\n" msgstr "Фіктивний LSN Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ без журналюваннÑ: %X/%X\n" -#: pg_controldata.c:277 +#: pg_controldata.c:276 #, c-format msgid "Minimum recovery ending location: %X/%X\n" msgstr "Мінімальне Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ ÐºÑ–Ð½Ñ†Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ: %X/%X\n" -#: pg_controldata.c:279 +#: pg_controldata.c:278 #, c-format msgid "Min recovery ending loc's timeline: %u\n" msgstr "Мінімальна Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ Ñ–Ñторії чаÑу Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ: %u\n" -#: pg_controldata.c:281 +#: pg_controldata.c:280 #, c-format msgid "Backup start location: %X/%X\n" msgstr "Початкове Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ копіюваннÑ: %X/%X\n" -#: pg_controldata.c:283 +#: pg_controldata.c:282 #, c-format msgid "Backup end location: %X/%X\n" msgstr "Кінцеве Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ копіюваннÑ: %X/%X\n" -#: pg_controldata.c:285 +#: pg_controldata.c:284 #, c-format msgid "End-of-backup record required: %s\n" msgstr "ВимагаєтьÑÑ Ð·Ð°Ð¿Ð¸Ñ ÐºÑ–Ð½Ñ†Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð³Ð¾ копіюваннÑ: %s\n" -#: pg_controldata.c:286 +#: pg_controldata.c:285 msgid "no" msgstr "ні" -#: pg_controldata.c:286 +#: pg_controldata.c:285 msgid "yes" msgstr "так" -#: pg_controldata.c:287 +#: pg_controldata.c:286 #, c-format msgid "wal_level setting: %s\n" msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ wal_рівнÑ: %s\n" -#: pg_controldata.c:289 +#: pg_controldata.c:288 #, c-format msgid "wal_log_hints setting: %s\n" msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ wal_log_hints: %s\n" -#: pg_controldata.c:291 +#: pg_controldata.c:290 #, c-format msgid "max_connections setting: %d\n" msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ max_connections: %d\n" -#: pg_controldata.c:293 +#: pg_controldata.c:292 #, c-format msgid "max_worker_processes setting: %d\n" msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ max_worker_processes: %d\n" -#: pg_controldata.c:295 +#: pg_controldata.c:294 #, c-format msgid "max_wal_senders setting: %d\n" msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ max_wal_senders: %d\n" -#: pg_controldata.c:297 +#: pg_controldata.c:296 #, c-format msgid "max_prepared_xacts setting: %d\n" msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ max_prepared_xacts: %d\n" -#: pg_controldata.c:299 +#: pg_controldata.c:298 #, c-format msgid "max_locks_per_xact setting: %d\n" msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ max_locks_per_xact: %d\n" -#: pg_controldata.c:301 +#: pg_controldata.c:300 #, c-format msgid "track_commit_timestamp setting: %s\n" msgstr "Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ track_commit_timestamp: %s\n" -#: pg_controldata.c:303 +#: pg_controldata.c:302 #, c-format msgid "Maximum data alignment: %u\n" msgstr "МакÑимальне Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…: %u\n" -#: pg_controldata.c:306 +#: pg_controldata.c:305 #, c-format msgid "Database block size: %u\n" msgstr "Розмір блоку бази даних: %u\n" -#: pg_controldata.c:308 +#: pg_controldata.c:307 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Блоків на Ñегмент великого відношеннÑ: %u\n" -#: pg_controldata.c:310 +#: pg_controldata.c:309 #, c-format msgid "WAL block size: %u\n" msgstr "Pозмір блоку WAL: %u\n" -#: pg_controldata.c:312 +#: pg_controldata.c:311 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Байтів на Ñегмент WAL: %u\n" -#: pg_controldata.c:314 +#: pg_controldata.c:313 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "МакÑимальна довжина ідентифікаторів: %u\n" -#: pg_controldata.c:316 +#: pg_controldata.c:315 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "МакÑимальна кількіÑть Ñтовпців в індекÑÑ–: %u\n" -#: pg_controldata.c:318 +#: pg_controldata.c:317 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "МакÑимальний розмір Ñегменту TOAST: %u\n" -#: pg_controldata.c:320 +#: pg_controldata.c:319 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Розмір Ñегменту великих обїєктів: %u\n" -#: pg_controldata.c:323 +#: pg_controldata.c:322 #, c-format msgid "Date/time type storage: %s\n" msgstr "Дата/Ñ‡Ð°Ñ Ñ‚Ð¸Ð¿Ñƒ Ñховища: %s\n" -#: pg_controldata.c:324 +#: pg_controldata.c:323 msgid "64-bit integers" msgstr "64-бітні цілі" -#: pg_controldata.c:325 +#: pg_controldata.c:324 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Передача аргументу Float8: %s\n" -#: pg_controldata.c:326 +#: pg_controldata.c:325 msgid "by reference" msgstr "за поÑиланнÑм" -#: pg_controldata.c:326 +#: pg_controldata.c:325 msgid "by value" msgstr "за значеннÑм" -#: pg_controldata.c:327 +#: pg_controldata.c:326 #, c-format msgid "Data page checksum version: %u\n" msgstr "ВерÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум Ñторінок даних: %u\n" -#: pg_controldata.c:329 +#: pg_controldata.c:328 #, c-format msgid "Mock authentication nonce: %s\n" msgstr "Імітувати Ð½Ð¾Ð½Ñ Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ—: %s\n" diff --git a/src/bin/pg_controldata/po/zh_TW.po b/src/bin/pg_controldata/po/zh_TW.po new file mode 100644 index 0000000000000..b9ffb5669ac06 --- /dev/null +++ b/src/bin/pg_controldata/po/zh_TW.po @@ -0,0 +1,587 @@ +# Traditional Chinese message translation file for pg_controldata +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_controldata (PostgreSQL) package. +# 2004-11-01 Zhenbang Wei +# +msgid "" +msgstr "" +"Project-Id-Version: pg_controldata (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-08 21:52+0000\n" +"PO-Revision-Date: 2024-06-26 08:37+0200\n" +"Last-Translator: Zhenbang Wei \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.4.1\n" + +# commands/copy.c:1031 +#: ../../common/controldata_utils.c:73 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "無法開啟檔案 \"%s\" 以供讀å–: %m" + +# access/transam/xlog.c:1659 access/transam/xlog.c:2942 +# access/transam/xlog.c:5397 access/transam/xlog.c:5448 +# access/transam/xlog.c:5520 access/transam/xlog.c:5545 +# access/transam/xlog.c:5583 +#: ../../common/controldata_utils.c:86 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ç„¡æ³•è®€å–æª”案 \"%s\": %m" + +# access/transam/xlog.c:1659 access/transam/xlog.c:2942 +# access/transam/xlog.c:5397 access/transam/xlog.c:5448 +# access/transam/xlog.c:5520 access/transam/xlog.c:5545 +# access/transam/xlog.c:5583 +#: ../../common/controldata_utils.c:95 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "ç„¡æ³•è®€å–æª”案 \"%s\": å·²è®€å– %d / %zu" + +# access/transam/slru.c:680 access/transam/xlog.c:1567 +# access/transam/xlog.c:1691 access/transam/xlog.c:3013 +#: ../../common/controldata_utils.c:108 ../../common/controldata_utils.c:236 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "無法關閉檔案 \"%s\": %m" + +#: ../../common/controldata_utils.c:124 +msgid "byte ordering mismatch" +msgstr "ä½å…ƒçµ„é †åºä¸ä¸€è‡´" + +#: ../../common/controldata_utils.c:126 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the " +"one\n" +"used by this program. In that case the results below would be incorrect, " +"and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ä½å…ƒçµ„é †åºå¯èƒ½ä¸ä¸€è‡´\n" +"用於儲存 pg_control 檔案的ä½å…ƒçµ„é †åºå¯èƒ½èˆ‡æ­¤ç¨‹å¼ä½¿ç”¨çš„ä½å…ƒçµ„é †åºä¸åŒã€‚\n" +"在這種情æ³ä¸‹ï¼Œä¸‹é¢çš„çµæžœå°‡ä¸æ­£ç¢ºï¼Œä¸” PostgreSQL 安è£å°‡èˆ‡é€™å€‹è³‡æ–™ç›®éŒ„\n" +"ä¸ç›¸å®¹ã€‚" + +# access/transam/slru.c:638 access/transam/xlog.c:1631 +# access/transam/xlog.c:2742 access/transam/xlog.c:2832 +# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935 +# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889 +# utils/misc/database.c:68 +#: ../../common/controldata_utils.c:186 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "無法開啟檔案 \"%s\": %m" + +# access/transam/xlog.c:5319 access/transam/xlog.c:5439 +#: ../../common/controldata_utils.c:205 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "無法寫入檔案 \"%s\": %m" + +# access/transam/slru.c:673 access/transam/xlog.c:1562 +# access/transam/xlog.c:1686 access/transam/xlog.c:3008 +#: ../../common/controldata_utils.c:224 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "無法 fsync 檔案 \"%s\": %m" + +#: pg_controldata.c:35 +#, c-format +msgid "" +"%s displays control information of a PostgreSQL database cluster.\n" +"\n" +msgstr "" +"%s 顯示 PostgreSQL 資料庫å¢é›†çš„æŽ§åˆ¶è³‡è¨Š\n" +"\n" + +#: pg_controldata.c:36 +#, c-format +msgid "Usage:\n" +msgstr "用法:\n" + +#: pg_controldata.c:37 +#, c-format +#| msgid " %s [OPTION]... [DATADIR]\n" +msgid " %s [OPTION] [DATADIR]\n" +msgstr " %s [OPTION] [DATADIR]\n" + +#: pg_controldata.c:38 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"é¸é …:\n" + +# postmaster/postmaster.c:1024 tcop/postgres.c:2122 +#: pg_controldata.c:39 +#, c-format +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]DATADIR 資料目錄\n" + +#: pg_controldata.c:40 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version é¡¯ç¤ºç‰ˆæœ¬ï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_controldata.c:41 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help é¡¯ç¤ºèªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_controldata.c:42 +#, c-format +msgid "" +"\n" +"If no data directory (DATADIR) is specified, the environment variable " +"PGDATA\n" +"is used.\n" +"\n" +msgstr "" +"\n" +"若未指定資料目錄(DATADIR)就用環境變數 PGDATA。\n" +"\n" + +#: pg_controldata.c:44 +#, c-format +msgid "Report bugs to <%s>.\n" +msgstr "回報錯誤至 <%s>。\n" + +#: pg_controldata.c:45 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 首é : <%s>\n" + +#: pg_controldata.c:55 +msgid "starting up" +msgstr "啟動中" + +#: pg_controldata.c:57 +msgid "shut down" +msgstr "關閉" + +# access/transam/xlog.c:3596 +#: pg_controldata.c:59 +msgid "shut down in recovery" +msgstr "復原關閉中" + +#: pg_controldata.c:61 +msgid "shutting down" +msgstr "關閉中" + +#: pg_controldata.c:63 +msgid "in crash recovery" +msgstr "ææ¯€å¾©åŽŸä¸­" + +# access/transam/xlog.c:3596 +#: pg_controldata.c:65 +msgid "in archive recovery" +msgstr "å°å­˜å¾©åŽŸä¸­" + +#: pg_controldata.c:67 +msgid "in production" +msgstr "é‹ä½œä¸­" + +#: pg_controldata.c:69 +msgid "unrecognized status code" +msgstr "無法識別的狀態碼" + +# access/transam/xlog.c:3720 +#: pg_controldata.c:84 +msgid "unrecognized wal_level" +msgstr "無法識別的 wal_level" + +# tcop/postgres.c:2636 tcop/postgres.c:2652 +#: pg_controldata.c:138 pg_controldata.c:156 pg_controldata.c:163 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "用 \"%s --help\" å–得更多資訊。" + +#: pg_controldata.c:154 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "å‘½ä»¤åˆ—åƒæ•¸éŽå¤š(第一個是 \"%s\")" + +#: pg_controldata.c:162 +#, c-format +msgid "no data directory specified" +msgstr "未指定資料目錄" + +#: pg_controldata.c:170 +#, c-format +msgid "" +"WARNING: Calculated CRC checksum does not match value stored in file.\n" +"Either the file is corrupt, or it has a different layout than this " +"program\n" +"is expecting. The results below are untrustworthy.\n" +"\n" +msgstr "" +"警告: 計算ç²å¾—çš„ CRC 檢查碼和存在檔案中的值ä¸ä¸€è‡´ã€‚\n" +"å¯èƒ½æ˜¯æª”案æå£žï¼Œæˆ–æ˜¯æª”æ¡ˆçµæ§‹èˆ‡ç¨‹å¼æ‰€é æœŸçš„ä¸åŒã€‚\n" +"ä»¥ä¸‹çš„çµæžœä¸å¯ä¿¡ã€‚\n" +"\n" + +#: pg_controldata.c:179 +#, c-format +msgid "WARNING: invalid WAL segment size\n" +msgstr "警告: 無效的 WAL 片段大å°\n" + +#: pg_controldata.c:180 +#, c-format +msgid "" +"The WAL segment size stored in the file, %d byte, is not a power of two\n" +"between 1 MB and 1 GB. The file is corrupt and the results below are\n" +"untrustworthy.\n" +"\n" +msgid_plural "" +"The WAL segment size stored in the file, %d bytes, is not a power of two\n" +"between 1 MB and 1 GB. The file is corrupt and the results below are\n" +"untrustworthy.\n" +"\n" +msgstr[0] "" +"檔案中儲存的 WAL 片段大å°ç‚º %d ä½å…ƒçµ„ï¼Œä¸æ˜¯ä»‹æ–¼ 1MB å’Œ 1GB 之間的\n" +" 2 的冪次方。該檔案已æå£žï¼Œä»¥ä¸‹çš„çµæžœä¸å¯ä¿¡ã€‚\n" +"\n" + +#: pg_controldata.c:222 +msgid "???" +msgstr "???" + +#: pg_controldata.c:228 +#, c-format +msgid "pg_control version number: %u\n" +msgstr "pg_control 版本號碼: %u\n" + +#: pg_controldata.c:230 +#, c-format +msgid "Catalog version number: %u\n" +msgstr "Catalog 版本號碼: %u\n" + +#: pg_controldata.c:232 +#, c-format +msgid "Database system identifier: %llu\n" +msgstr "資料庫系統識別碼: %llu\n" + +#: pg_controldata.c:234 +#, c-format +msgid "Database cluster state: %s\n" +msgstr "資料庫å¢é›†ç‹€æ…‹: %s\n" + +#: pg_controldata.c:236 +#, c-format +msgid "pg_control last modified: %s\n" +msgstr "pg_control 最後修改時間: %s\n" + +#: pg_controldata.c:238 +#, c-format +msgid "Latest checkpoint location: %X/%X\n" +msgstr "最新檢查點ä½ç½®: %X/%X\n" + +#: pg_controldata.c:240 +#, c-format +msgid "Latest checkpoint's REDO location: %X/%X\n" +msgstr "最新檢查點 REDO ä½ç½®: %X/%X\n" + +#: pg_controldata.c:242 +#, c-format +msgid "Latest checkpoint's REDO WAL file: %s\n" +msgstr "最新檢查點 REDO WAL 檔: %s\n" + +#: pg_controldata.c:244 +#, c-format +msgid "Latest checkpoint's TimeLineID: %u\n" +msgstr "最新檢查點 TimeLineID: %u\n" + +#: pg_controldata.c:246 +#, c-format +msgid "Latest checkpoint's PrevTimeLineID: %u\n" +msgstr "最新檢查點 PrevTimeLineID: %u\n" + +#: pg_controldata.c:248 +#, c-format +msgid "Latest checkpoint's full_page_writes: %s\n" +msgstr "最新檢查點 full_page_writes: %s\n" + +# help.c:48 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +msgid "off" +msgstr "off" + +# help.c:48 +#: pg_controldata.c:249 pg_controldata.c:290 pg_controldata.c:302 +msgid "on" +msgstr "on" + +#: pg_controldata.c:250 +#, c-format +msgid "Latest checkpoint's NextXID: %u:%u\n" +msgstr "最新檢查點 NextXID: %u:%u\n" + +#: pg_controldata.c:253 +#, c-format +msgid "Latest checkpoint's NextOID: %u\n" +msgstr "最新檢查點 NextOID: %u\n" + +#: pg_controldata.c:255 +#, c-format +msgid "Latest checkpoint's NextMultiXactId: %u\n" +msgstr "最新檢查點 NextMultiXactId: %u\n" + +#: pg_controldata.c:257 +#, c-format +msgid "Latest checkpoint's NextMultiOffset: %u\n" +msgstr "最新檢查點 NextMultiOffset: %u\n" + +#: pg_controldata.c:259 +#, c-format +msgid "Latest checkpoint's oldestXID: %u\n" +msgstr "最新檢查點 oldestXID: %u\n" + +#: pg_controldata.c:261 +#, c-format +msgid "Latest checkpoint's oldestXID's DB: %u\n" +msgstr "最新檢查點 oldestXID 的資料庫: %u\n" + +#: pg_controldata.c:263 +#, c-format +msgid "Latest checkpoint's oldestActiveXID: %u\n" +msgstr "最新檢查點 oldestActiveXID: %u\n" + +#: pg_controldata.c:265 +#, c-format +msgid "Latest checkpoint's oldestMultiXid: %u\n" +msgstr "最新檢查點 oldestMultiXid: %u\n" + +#: pg_controldata.c:267 +#, c-format +msgid "Latest checkpoint's oldestMulti's DB: %u\n" +msgstr "最新檢查點 oldestMulti 的資料庫: %u\n" + +#: pg_controldata.c:269 +#, c-format +msgid "Latest checkpoint's oldestCommitTsXid:%u\n" +msgstr "最新檢查點 oldestCommitTsXid: %u\n" + +#: pg_controldata.c:271 +#, c-format +msgid "Latest checkpoint's newestCommitTsXid:%u\n" +msgstr "最新檢查點 newestCommitTsXid: %u\n" + +#: pg_controldata.c:273 +#, c-format +msgid "Time of latest checkpoint: %s\n" +msgstr "最新檢查點的時間: %s\n" + +#: pg_controldata.c:275 +#, c-format +msgid "Fake LSN counter for unlogged rels: %X/%X\n" +msgstr "無日誌關è¯çš„虛擬 LSN 計數: %X/%X\n" + +#: pg_controldata.c:277 +#, c-format +msgid "Minimum recovery ending location: %X/%X\n" +msgstr "最å°é‚„åŽŸçµæŸä½ç½®: %X/%X\n" + +#: pg_controldata.c:279 +#, c-format +msgid "Min recovery ending loc's timeline: %u\n" +msgstr "最å°é‚„åŽŸçµæŸä½ç½®çš„æ™‚間軸: %u\n" + +#: pg_controldata.c:281 +#, c-format +msgid "Backup start location: %X/%X\n" +msgstr "備份開始ä½ç½®: %X/%X\n" + +#: pg_controldata.c:283 +#, c-format +msgid "Backup end location: %X/%X\n" +msgstr "å‚™ä»½çµæŸä½ç½®: %X/%X\n" + +#: pg_controldata.c:285 +#, c-format +msgid "End-of-backup record required: %s\n" +msgstr "需è¦å‚™ä»½çµæŸè¨˜éŒ„: %s\n" + +# describe.c:1262 +# describe.c:1638 +# describe.c:1692 +#: pg_controldata.c:286 +msgid "no" +msgstr "no" + +# describe.c:1262 +# describe.c:1637 +# describe.c:1694 +#: pg_controldata.c:286 +msgid "yes" +msgstr "yes" + +#: pg_controldata.c:287 +#, c-format +#| msgid "Current wal_level setting: %s\n" +msgid "wal_level setting: %s\n" +msgstr "wal_level 設定: %s\n" + +#: pg_controldata.c:289 +#, c-format +#| msgid "Current wal_level setting: %s\n" +msgid "wal_log_hints setting: %s\n" +msgstr "wal_log_hints 設定: %s\n" + +#: pg_controldata.c:291 +#, c-format +#| msgid "Current max_connections setting: %d\n" +msgid "max_connections setting: %d\n" +msgstr "max_connections 設定: %d\n" + +#: pg_controldata.c:293 +#, c-format +#| msgid "Current max_connections setting: %d\n" +msgid "max_worker_processes setting: %d\n" +msgstr "max_worker_processes 設定: %d\n" + +#: pg_controldata.c:295 +#, c-format +#| msgid "Current wal_level setting: %s\n" +msgid "max_wal_senders setting: %d\n" +msgstr "max_wal_senders 設定: %d\n" + +#: pg_controldata.c:297 +#, c-format +#| msgid "Current max_prepared_xacts setting: %d\n" +msgid "max_prepared_xacts setting: %d\n" +msgstr "max_prepared_xacts 設定: %d\n" + +#: pg_controldata.c:299 +#, c-format +#| msgid "Current max_locks_per_xact setting: %d\n" +msgid "max_locks_per_xact setting: %d\n" +msgstr "max_locks_per_xact 設定: %d\n" + +#: pg_controldata.c:301 +#, c-format +#| msgid "Current max_connections setting: %d\n" +msgid "track_commit_timestamp setting: %s\n" +msgstr "track_commit_timestamp 設定: %s\n" + +#: pg_controldata.c:303 +#, c-format +msgid "Maximum data alignment: %u\n" +msgstr "資料å°é½Šä¸Šé™: %u\n" + +#: pg_controldata.c:306 +#, c-format +msgid "Database block size: %u\n" +msgstr "資料庫å€å¡Šå¤§å°: %u\n" + +#: pg_controldata.c:308 +#, c-format +msgid "Blocks per segment of large relation: %u\n" +msgstr "å¤§åž‹é—œè¯æ¯å€‹ç‰‡æ®µçš„å€å¡Šæ•¸: %u\n" + +#: pg_controldata.c:310 +#, c-format +msgid "WAL block size: %u\n" +msgstr "WAL å€å¡Šå¤§å°: %u\n" + +#: pg_controldata.c:312 +#, c-format +msgid "Bytes per WAL segment: %u\n" +msgstr "æ¯å€‹ WAL 片段的ä½å…ƒçµ„數: %u\n" + +#: pg_controldata.c:314 +#, c-format +msgid "Maximum length of identifiers: %u\n" +msgstr "識別å稱長度上é™: %u\n" + +#: pg_controldata.c:316 +#, c-format +msgid "Maximum columns in an index: %u\n" +msgstr "ç´¢å¼•æ¬„ä½æ•¸ä¸Šé™: %u\n" + +#: pg_controldata.c:318 +#, c-format +msgid "Maximum size of a TOAST chunk: %u\n" +msgstr "TOAST å€å¡Šå¤§å°ä¸Šé™: %u\n" + +#: pg_controldata.c:320 +#, c-format +msgid "Size of a large-object chunk: %u\n" +msgstr "大物件å€å¡Šçš„大å°: %u\n" + +#: pg_controldata.c:323 +#, c-format +msgid "Date/time type storage: %s\n" +msgstr "日期/時間類型的儲存方å¼: %s\n" + +#: pg_controldata.c:324 +msgid "64-bit integers" +msgstr "64ä½å…ƒæ•´æ•¸" + +#: pg_controldata.c:325 +#, c-format +msgid "Float8 argument passing: %s\n" +msgstr "Float8 åƒæ•¸å‚³éžæ–¹å¼: %s\n" + +#: pg_controldata.c:326 +msgid "by reference" +msgstr "傳å€" + +#: pg_controldata.c:326 +msgid "by value" +msgstr "傳值" + +#: pg_controldata.c:327 +#, c-format +msgid "Data page checksum version: %u\n" +msgstr "è³‡æ–™é æª¢æŸ¥ç¢¼ç‰ˆæœ¬: %u\n" + +#: pg_controldata.c:329 +#, c-format +msgid "Mock authentication nonce: %s\n" +msgstr "模擬的驗證 nonce: %s\n" + +#, c-format +#~ msgid "%s: could not open file \"%s\" for reading: %s\n" +#~ msgstr "%s: 無法開啟檔案 \"%s\" 讀å–: %s\n" + +#, c-format +#~ msgid "%s: could not read file \"%s\": %s\n" +#~ msgstr "%s: ç„¡æ³•è®€å–æª”案 \"%s\": %s\n" + +#, c-format +#~ msgid "Float4 argument passing: %s\n" +#~ msgstr "Float4 åƒæ•¸å‚³éžæ–¹å¼: %s\n" + +#~ msgid "Maximum number of function arguments: %u\n" +#~ msgstr "函å¼åƒæ•¸çš„æœ€å¤§å€‹æ•¸: %u\n" + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "執行 \"%s --help\" 顯示更多資訊。\n" + +#, c-format +#~ msgid "" +#~ "Usage:\n" +#~ " %s [OPTION] [DATADIR]\n" +#~ "\n" +#~ "Options:\n" +#~ " --help show this help, then exit\n" +#~ " --version output version information, then exit\n" +#~ msgstr "" +#~ "用法:\n" +#~ " %s [é¸é …] [資料目錄]\n" +#~ "\n" +#~ "é¸é …:\n" +#~ " --help 顯示說明訊æ¯ç„¶å¾ŒçµæŸ\n" +#~ " --version é¡¯ç¤ºç‰ˆæœ¬è³‡è¨Šç„¶å¾ŒçµæŸ\n" + +#~ msgid "floating-point numbers" +#~ msgstr "浮點數" diff --git a/src/bin/pg_controldata/t/001_pg_controldata.pl b/src/bin/pg_controldata/t/001_pg_controldata.pl index 0c641036e9c58..b0e938da6bcbe 100644 --- a/src/bin/pg_controldata/t/001_pg_controldata.pl +++ b/src/bin/pg_controldata/t/001_pg_controldata.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -24,7 +24,7 @@ # check with a corrupted pg_control my $pg_control = $node->data_dir . '/global/pg_control'; -my $size = (stat($pg_control))[7]; +my $size = -s $pg_control; open my $fh, '>', $pg_control or BAIL_OUT($!); binmode $fh; @@ -36,11 +36,11 @@ command_checks_all( [ 'pg_controldata', $node->data_dir ], 0, + [qr/./], [ - qr/WARNING: Calculated CRC checksum does not match value stored in file/, - qr/WARNING: invalid WAL segment size/ + qr/warning: calculated CRC checksum does not match value stored in control file/, + qr/warning: invalid WAL segment size/ ], - [qr/^$/], 'pg_controldata with corrupted pg_control'); done_testing(); diff --git a/src/bin/pg_ctl/Makefile b/src/bin/pg_ctl/Makefile index 4b6d47a8f88d6..a3fbad7a3a5a5 100644 --- a/src/bin/pg_ctl/Makefile +++ b/src/bin/pg_ctl/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/pg_ctl # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/bin/pg_ctl/Makefile @@ -42,7 +42,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_ctl$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_ctl$(X) $(OBJS) rm -rf tmp_check diff --git a/src/bin/pg_ctl/meson.build b/src/bin/pg_ctl/meson.build index 608a52f9fbfbd..da05bd8a8d476 100644 --- a/src/bin/pg_ctl/meson.build +++ b/src/bin/pg_ctl/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_ctl_sources = files( 'pg_ctl.c', diff --git a/src/bin/pg_ctl/nls.mk b/src/bin/pg_ctl/nls.mk index fd6355483c47c..27694a249ba52 100644 --- a/src/bin/pg_ctl/nls.mk +++ b/src/bin/pg_ctl/nls.mk @@ -1,6 +1,7 @@ # src/bin/pg_ctl/nls.mk CATALOG_NAME = pg_ctl GETTEXT_FILES = pg_ctl.c \ + ../../common/controldata_utils.c \ ../../common/exec.c \ ../../common/fe_memutils.c \ ../../common/wait_error.c \ diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 465948e70749c..ed97eb3f5042c 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -2,7 +2,7 @@ * * pg_ctl --- start/stops/restarts the PostgreSQL server * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/bin/pg_ctl/pg_ctl.c * @@ -38,14 +38,14 @@ typedef enum { SMART_MODE, FAST_MODE, - IMMEDIATE_MODE + IMMEDIATE_MODE, } ShutdownMode; typedef enum { POSTMASTER_READY, POSTMASTER_STILL_STARTING, - POSTMASTER_FAILED + POSTMASTER_FAILED, } WaitPMResult; typedef enum @@ -62,7 +62,7 @@ typedef enum KILL_COMMAND, REGISTER_COMMAND, UNREGISTER_COMMAND, - RUN_AS_SERVICE_COMMAND + RUN_AS_SERVICE_COMMAND, } CtlCommand; #define DEFAULT_WAIT 60 @@ -96,7 +96,6 @@ static time_t start_time; static char postopts_file[MAXPGPATH]; static char version_file[MAXPGPATH]; static char pid_file[MAXPGPATH]; -static char backup_file[MAXPGPATH]; static char promote_file[MAXPGPATH]; static char logrotate_file[MAXPGPATH]; @@ -255,8 +254,8 @@ get_pgpid(bool is_status_request) write_stderr(_("%s: directory \"%s\" does not exist\n"), progname, pg_data); else - write_stderr(_("%s: could not access directory \"%s\": %s\n"), progname, - pg_data, strerror(errno)); + write_stderr(_("%s: could not access directory \"%s\": %m\n"), progname, + pg_data); /* * The Linux Standard Base Core Specification 3.1 says this should @@ -281,8 +280,8 @@ get_pgpid(bool is_status_request) return 0; else { - write_stderr(_("%s: could not open PID file \"%s\": %s\n"), - progname, pid_file, strerror(errno)); + write_stderr(_("%s: could not open PID file \"%s\": %m\n"), + progname, pid_file); exit(1); } } @@ -455,8 +454,8 @@ start_postmaster(void) if (pm_pid < 0) { /* fork failed */ - write_stderr(_("%s: could not start server: %s\n"), - progname, strerror(errno)); + write_stderr(_("%s: could not start server: %m\n"), + progname); exit(1); } if (pm_pid > 0) @@ -475,8 +474,8 @@ start_postmaster(void) #ifdef HAVE_SETSID if (setsid() < 0) { - write_stderr(_("%s: could not start server due to setsid() failure: %s\n"), - progname, strerror(errno)); + write_stderr(_("%s: could not start server due to setsid() failure: %m\n"), + progname); exit(1); } #endif @@ -497,8 +496,8 @@ start_postmaster(void) (void) execl("/bin/sh", "/bin/sh", "-c", cmd, (char *) NULL); /* exec failed */ - write_stderr(_("%s: could not start server: %s\n"), - progname, strerror(errno)); + write_stderr(_("%s: could not start server: %m\n"), + progname); exit(1); return 0; /* keep dumb compilers quiet */ @@ -545,8 +544,8 @@ start_postmaster(void) */ if (errno != ENOENT) { - write_stderr(_("%s: could not open log file \"%s\": %s\n"), - progname, log_file, strerror(errno)); + write_stderr(_("%s: could not open log file \"%s\": %m\n"), + progname, log_file); exit(1); } } @@ -618,7 +617,7 @@ wait_for_postmaster_start(pid_t pm_pid, bool do_checkpoint) * Allow 2 seconds slop for possible cross-process clock skew. */ pmpid = atol(optlines[LOCK_FILE_LINE_PID - 1]); - pmstart = atol(optlines[LOCK_FILE_LINE_START_TIME - 1]); + pmstart = atoll(optlines[LOCK_FILE_LINE_START_TIME - 1]); if (pmstart >= start_time - 2 && #ifndef WIN32 pmpid == pm_pid @@ -852,8 +851,8 @@ trap_sigint_during_startup(SIGNAL_ARGS) if (postmasterPID != -1) { if (kill(postmasterPID, SIGINT) != 0) - write_stderr(_("%s: could not send stop signal (PID: %d): %s\n"), - progname, (int) postmasterPID, strerror(errno)); + write_stderr(_("%s: could not send stop signal (PID: %d): %m\n"), + progname, (int) postmasterPID); } /* @@ -1036,8 +1035,7 @@ do_stop(void) if (kill(pid, sig) != 0) { - write_stderr(_("%s: could not send stop signal (PID: %d): %s\n"), progname, (int) pid, - strerror(errno)); + write_stderr(_("%s: could not send stop signal (PID: %d): %m\n"), progname, (int) pid); exit(1); } @@ -1104,8 +1102,7 @@ do_restart(void) { if (kill(pid, sig) != 0) { - write_stderr(_("%s: could not send stop signal (PID: %d): %s\n"), progname, (int) pid, - strerror(errno)); + write_stderr(_("%s: could not send stop signal (PID: %d): %m\n"), progname, (int) pid); exit(1); } @@ -1160,8 +1157,8 @@ do_reload(void) if (kill(pid, sig) != 0) { - write_stderr(_("%s: could not send reload signal (PID: %d): %s\n"), - progname, (int) pid, strerror(errno)); + write_stderr(_("%s: could not send reload signal (PID: %d): %m\n"), + progname, (int) pid); exit(1); } @@ -1208,25 +1205,25 @@ do_promote(void) if ((prmfile = fopen(promote_file, "w")) == NULL) { - write_stderr(_("%s: could not create promote signal file \"%s\": %s\n"), - progname, promote_file, strerror(errno)); + write_stderr(_("%s: could not create promote signal file \"%s\": %m\n"), + progname, promote_file); exit(1); } if (fclose(prmfile)) { - write_stderr(_("%s: could not write promote signal file \"%s\": %s\n"), - progname, promote_file, strerror(errno)); + write_stderr(_("%s: could not write promote signal file \"%s\": %m\n"), + progname, promote_file); exit(1); } sig = SIGUSR1; if (kill(pid, sig) != 0) { - write_stderr(_("%s: could not send promote signal (PID: %d): %s\n"), - progname, (int) pid, strerror(errno)); + write_stderr(_("%s: could not send promote signal (PID: %d): %m\n"), + progname, (int) pid); if (unlink(promote_file) != 0) - write_stderr(_("%s: could not remove promote signal file \"%s\": %s\n"), - progname, promote_file, strerror(errno)); + write_stderr(_("%s: could not remove promote signal file \"%s\": %m\n"), + progname, promote_file); exit(1); } @@ -1281,25 +1278,25 @@ do_logrotate(void) if ((logrotatefile = fopen(logrotate_file, "w")) == NULL) { - write_stderr(_("%s: could not create log rotation signal file \"%s\": %s\n"), - progname, logrotate_file, strerror(errno)); + write_stderr(_("%s: could not create log rotation signal file \"%s\": %m\n"), + progname, logrotate_file); exit(1); } if (fclose(logrotatefile)) { - write_stderr(_("%s: could not write log rotation signal file \"%s\": %s\n"), - progname, logrotate_file, strerror(errno)); + write_stderr(_("%s: could not write log rotation signal file \"%s\": %m\n"), + progname, logrotate_file); exit(1); } sig = SIGUSR1; if (kill(pid, sig) != 0) { - write_stderr(_("%s: could not send log rotation signal (PID: %d): %s\n"), - progname, (int) pid, strerror(errno)); + write_stderr(_("%s: could not send log rotation signal (PID: %d): %m\n"), + progname, (int) pid); if (unlink(logrotate_file) != 0) - write_stderr(_("%s: could not remove log rotation signal file \"%s\": %s\n"), - progname, logrotate_file, strerror(errno)); + write_stderr(_("%s: could not remove log rotation signal file \"%s\": %m\n"), + progname, logrotate_file); exit(1); } @@ -1397,8 +1394,8 @@ do_kill(pid_t pid) { if (kill(pid, sig) != 0) { - write_stderr(_("%s: could not send signal %d (PID: %d): %s\n"), - progname, sig, (int) pid, strerror(errno)); + write_stderr(_("%s: could not send signal %d (PID: %d): %m\n"), + progname, sig, (int) pid); exit(1); } } @@ -2260,163 +2257,151 @@ main(int argc, char **argv) if (env_wait != NULL) wait_seconds = atoi(env_wait); - /* - * 'Action' can be before or after args so loop over both. Some - * getopt_long() implementations will reorder argv[] to place all flags - * first (GNU?), but we don't rely on it. Our /port version doesn't do - * that. - */ - optind = 1; - /* process command-line options */ - while (optind < argc) + while ((c = getopt_long(argc, argv, "cD:e:l:m:N:o:p:P:sS:t:U:wW", + long_options, &option_index)) != -1) { - while ((c = getopt_long(argc, argv, "cD:e:l:m:N:o:p:P:sS:t:U:wW", - long_options, &option_index)) != -1) + switch (c) { - switch (c) - { - case 'D': - { - char *pgdata_D; - - pgdata_D = pg_strdup(optarg); - canonicalize_path(pgdata_D); - setenv("PGDATA", pgdata_D, 1); - - /* - * We could pass PGDATA just in an environment - * variable but we do -D too for clearer postmaster - * 'ps' display - */ - pgdata_opt = psprintf("-D \"%s\" ", pgdata_D); - free(pgdata_D); - break; - } - case 'e': - event_source = pg_strdup(optarg); - break; - case 'l': - log_file = pg_strdup(optarg); - break; - case 'm': - set_mode(optarg); - break; - case 'N': - register_servicename = pg_strdup(optarg); - break; - case 'o': - /* append option? */ - if (!post_opts) - post_opts = pg_strdup(optarg); - else - { - char *old_post_opts = post_opts; - - post_opts = psprintf("%s %s", old_post_opts, optarg); - free(old_post_opts); - } - break; - case 'p': - exec_path = pg_strdup(optarg); - break; - case 'P': - register_password = pg_strdup(optarg); - break; - case 's': - silent_mode = true; + case 'D': + { + char *pgdata_D; + + pgdata_D = pg_strdup(optarg); + canonicalize_path(pgdata_D); + setenv("PGDATA", pgdata_D, 1); + + /* + * We could pass PGDATA just in an environment variable + * but we do -D too for clearer postmaster 'ps' display + */ + pgdata_opt = psprintf("-D \"%s\" ", pgdata_D); + free(pgdata_D); break; - case 'S': + } + case 'e': + event_source = pg_strdup(optarg); + break; + case 'l': + log_file = pg_strdup(optarg); + break; + case 'm': + set_mode(optarg); + break; + case 'N': + register_servicename = pg_strdup(optarg); + break; + case 'o': + /* append option? */ + if (!post_opts) + post_opts = pg_strdup(optarg); + else + { + char *old_post_opts = post_opts; + + post_opts = psprintf("%s %s", old_post_opts, optarg); + free(old_post_opts); + } + break; + case 'p': + exec_path = pg_strdup(optarg); + break; + case 'P': + register_password = pg_strdup(optarg); + break; + case 's': + silent_mode = true; + break; + case 'S': #ifdef WIN32 - set_starttype(optarg); + set_starttype(optarg); #else - write_stderr(_("%s: -S option not supported on this platform\n"), - progname); - exit(1); + write_stderr(_("%s: -S option not supported on this platform\n"), + progname); + exit(1); #endif - break; - case 't': - wait_seconds = atoi(optarg); - wait_seconds_arg = true; - break; - case 'U': - if (strchr(optarg, '\\')) - register_username = pg_strdup(optarg); - else - /* Prepend .\ for local accounts */ - register_username = psprintf(".\\%s", optarg); - break; - case 'w': - do_wait = true; - break; - case 'W': - do_wait = false; - break; - case 'c': - allow_core_files = true; - break; - default: - /* getopt_long already issued a suitable error message */ - do_advice(); - exit(1); - } + break; + case 't': + wait_seconds = atoi(optarg); + wait_seconds_arg = true; + break; + case 'U': + if (strchr(optarg, '\\')) + register_username = pg_strdup(optarg); + else + /* Prepend .\ for local accounts */ + register_username = psprintf(".\\%s", optarg); + break; + case 'w': + do_wait = true; + break; + case 'W': + do_wait = false; + break; + case 'c': + allow_core_files = true; + break; + default: + /* getopt_long already issued a suitable error message */ + do_advice(); + exit(1); } + } - /* Process an action */ - if (optind < argc) + /* Process an action */ + if (optind < argc) + { + if (strcmp(argv[optind], "init") == 0 + || strcmp(argv[optind], "initdb") == 0) + ctl_command = INIT_COMMAND; + else if (strcmp(argv[optind], "start") == 0) + ctl_command = START_COMMAND; + else if (strcmp(argv[optind], "stop") == 0) + ctl_command = STOP_COMMAND; + else if (strcmp(argv[optind], "restart") == 0) + ctl_command = RESTART_COMMAND; + else if (strcmp(argv[optind], "reload") == 0) + ctl_command = RELOAD_COMMAND; + else if (strcmp(argv[optind], "status") == 0) + ctl_command = STATUS_COMMAND; + else if (strcmp(argv[optind], "promote") == 0) + ctl_command = PROMOTE_COMMAND; + else if (strcmp(argv[optind], "logrotate") == 0) + ctl_command = LOGROTATE_COMMAND; + else if (strcmp(argv[optind], "kill") == 0) { - if (ctl_command != NO_COMMAND) + if (argc - optind < 3) { - write_stderr(_("%s: too many command-line arguments (first is \"%s\")\n"), progname, argv[optind]); + write_stderr(_("%s: missing arguments for kill mode\n"), progname); do_advice(); exit(1); } - - if (strcmp(argv[optind], "init") == 0 - || strcmp(argv[optind], "initdb") == 0) - ctl_command = INIT_COMMAND; - else if (strcmp(argv[optind], "start") == 0) - ctl_command = START_COMMAND; - else if (strcmp(argv[optind], "stop") == 0) - ctl_command = STOP_COMMAND; - else if (strcmp(argv[optind], "restart") == 0) - ctl_command = RESTART_COMMAND; - else if (strcmp(argv[optind], "reload") == 0) - ctl_command = RELOAD_COMMAND; - else if (strcmp(argv[optind], "status") == 0) - ctl_command = STATUS_COMMAND; - else if (strcmp(argv[optind], "promote") == 0) - ctl_command = PROMOTE_COMMAND; - else if (strcmp(argv[optind], "logrotate") == 0) - ctl_command = LOGROTATE_COMMAND; - else if (strcmp(argv[optind], "kill") == 0) - { - if (argc - optind < 3) - { - write_stderr(_("%s: missing arguments for kill mode\n"), progname); - do_advice(); - exit(1); - } - ctl_command = KILL_COMMAND; - set_sig(argv[++optind]); - killproc = atol(argv[++optind]); - } + ctl_command = KILL_COMMAND; + set_sig(argv[++optind]); + killproc = atol(argv[++optind]); + } #ifdef WIN32 - else if (strcmp(argv[optind], "register") == 0) - ctl_command = REGISTER_COMMAND; - else if (strcmp(argv[optind], "unregister") == 0) - ctl_command = UNREGISTER_COMMAND; - else if (strcmp(argv[optind], "runservice") == 0) - ctl_command = RUN_AS_SERVICE_COMMAND; + else if (strcmp(argv[optind], "register") == 0) + ctl_command = REGISTER_COMMAND; + else if (strcmp(argv[optind], "unregister") == 0) + ctl_command = UNREGISTER_COMMAND; + else if (strcmp(argv[optind], "runservice") == 0) + ctl_command = RUN_AS_SERVICE_COMMAND; #endif - else - { - write_stderr(_("%s: unrecognized operation mode \"%s\"\n"), progname, argv[optind]); - do_advice(); - exit(1); - } - optind++; + else + { + write_stderr(_("%s: unrecognized operation mode \"%s\"\n"), progname, argv[optind]); + do_advice(); + exit(1); } + optind++; + } + + if (optind < argc) + { + write_stderr(_("%s: too many command-line arguments (first is \"%s\")\n"), progname, argv[optind]); + do_advice(); + exit(1); } if (ctl_command == NO_COMMAND) @@ -2459,7 +2444,6 @@ main(int argc, char **argv) snprintf(postopts_file, MAXPGPATH, "%s/postmaster.opts", pg_data); snprintf(version_file, MAXPGPATH, "%s/PG_VERSION", pg_data); snprintf(pid_file, MAXPGPATH, "%s/postmaster.pid", pg_data); - snprintf(backup_file, MAXPGPATH, "%s/backup_label", pg_data); /* * Set mask based on PGDATA permissions, diff --git a/src/bin/pg_ctl/po/LINGUAS b/src/bin/pg_ctl/po/LINGUAS index e75500a22ded1..00f815d2ad2de 100644 --- a/src/bin/pg_ctl/po/LINGUAS +++ b/src/bin/pg_ctl/po/LINGUAS @@ -1 +1 @@ -cs de el es fr he it ja ka ko pl pt_BR ru sv tr uk zh_CN +cs de el es fr he it ja ka ko pl pt_BR ru sv tr uk zh_CN zh_TW diff --git a/src/bin/pg_ctl/po/de.po b/src/bin/pg_ctl/po/de.po index b4cad2260a719..b61e43eefb205 100644 --- a/src/bin/pg_ctl/po/de.po +++ b/src/bin/pg_ctl/po/de.po @@ -1,14 +1,14 @@ # German message translation file for pg_ctl -# Peter Eisentraut , 2004 - 2023. +# Peter Eisentraut , 2004 - 2024. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 16\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-24 03:48+0000\n" -"PO-Revision-Date: 2023-04-24 08:46+0200\n" +"POT-Creation-Date: 2024-06-16 07:49+0000\n" +"PO-Revision-Date: 2024-03-26 10:59+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,38 +16,57 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../common/exec.c:172 +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "falsche Byte-Reihenfolge" + +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "ungültige Programmdatei »%s«: %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "konnte Programmdatei »%s« nicht lesen: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "konnte kein »%s« zum Ausführen finden" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "konnte Pfad »%s« nicht in absolute Form auflösen: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "konnte Befehl »%s« nicht ausführen: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "konnte nicht von Befehl »%s« lesen: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "Befehl »%s« gab keine Daten zurück" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "Speicher aufgebraucht" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 -#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 +#: ../../port/path.c:753 ../../port/path.c:790 ../../port/path.c:807 #, c-format msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" @@ -89,121 +108,121 @@ msgstr "Kindprozess hat mit unbekanntem Status %d beendet" #: ../../port/path.c:775 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "konnte aktuelles Arbeitsverzeichnis nicht ermitteln: %m\n" -#: pg_ctl.c:255 +#: pg_ctl.c:254 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s: Verzeichnis »%s« existiert nicht\n" -#: pg_ctl.c:258 +#: pg_ctl.c:257 #, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: konnte nicht auf Verzeichnis »%s« zugreifen: %s\n" +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: konnte nicht auf Verzeichnis »%s« zugreifen: %m\n" -#: pg_ctl.c:271 +#: pg_ctl.c:270 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s: Verzeichnis »%s« ist kein Datenbankclusterverzeichnis\n" -#: pg_ctl.c:284 +#: pg_ctl.c:283 #, c-format -msgid "%s: could not open PID file \"%s\": %s\n" -msgstr "%s: konnte PID-Datei »%s« nicht öffnen: %s\n" +msgid "%s: could not open PID file \"%s\": %m\n" +msgstr "%s: konnte PID-Datei »%s« nicht öffnen: %m\n" -#: pg_ctl.c:293 +#: pg_ctl.c:292 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s: die PID-Datei »%s« ist leer\n" -#: pg_ctl.c:296 +#: pg_ctl.c:295 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s: ungültige Daten in PID-Datei »%s«\n" -#: pg_ctl.c:458 pg_ctl.c:500 +#: pg_ctl.c:457 pg_ctl.c:499 #, c-format -msgid "%s: could not start server: %s\n" -msgstr "%s: konnte Server nicht starten: %s\n" +msgid "%s: could not start server: %m\n" +msgstr "%s: konnte Server nicht starten: %m\n" -#: pg_ctl.c:478 +#: pg_ctl.c:477 #, c-format -msgid "%s: could not start server due to setsid() failure: %s\n" -msgstr "%s: konnte Server wegen setsid()-Fehler nicht starten: %s\n" +msgid "%s: could not start server due to setsid() failure: %m\n" +msgstr "%s: konnte Server wegen setsid()-Fehler nicht starten: %m\n" -#: pg_ctl.c:548 +#: pg_ctl.c:547 #, c-format -msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s: konnte Logdatei »%s« nicht öffnen: %s\n" +msgid "%s: could not open log file \"%s\": %m\n" +msgstr "%s: konnte Logdatei »%s« nicht öffnen: %m\n" -#: pg_ctl.c:565 +#: pg_ctl.c:564 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s: konnte Server nicht starten: Fehlercode %lu\n" -#: pg_ctl.c:782 +#: pg_ctl.c:781 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" msgstr "%s: kann Grenzwert für Core-Datei-Größe nicht setzen; durch harten Grenzwert verboten\n" -#: pg_ctl.c:808 +#: pg_ctl.c:807 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s: konnte Datei »%s« nicht lesen\n" -#: pg_ctl.c:813 +#: pg_ctl.c:812 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: Optionsdatei »%s« muss genau eine Zeile haben\n" -#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107 +#: pg_ctl.c:854 pg_ctl.c:1038 pg_ctl.c:1105 #, c-format -msgid "%s: could not send stop signal (PID: %d): %s\n" -msgstr "%s: konnte Stopp-Signal nicht senden (PID: %d): %s\n" +msgid "%s: could not send stop signal (PID: %d): %m\n" +msgstr "%s: konnte Stopp-Signal nicht senden (PID: %d): %m\n" -#: pg_ctl.c:883 +#: pg_ctl.c:882 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden\n" -#: pg_ctl.c:886 +#: pg_ctl.c:885 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s\n" -#: pg_ctl.c:918 +#: pg_ctl.c:917 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s: Initialisierung des Datenbanksystems fehlgeschlagen\n" -#: pg_ctl.c:933 +#: pg_ctl.c:932 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "%s: ein anderer Server läuft möglicherweise; versuche trotzdem zu starten\n" -#: pg_ctl.c:981 +#: pg_ctl.c:980 msgid "waiting for server to start..." msgstr "warte auf Start des Servers..." -#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238 +#: pg_ctl.c:985 pg_ctl.c:1061 pg_ctl.c:1123 pg_ctl.c:1235 msgid " done\n" msgstr " fertig\n" -#: pg_ctl.c:987 +#: pg_ctl.c:986 msgid "server started\n" msgstr "Server gestartet\n" -#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243 +#: pg_ctl.c:989 pg_ctl.c:995 pg_ctl.c:1240 msgid " stopped waiting\n" msgstr " Warten beendet\n" -#: pg_ctl.c:991 +#: pg_ctl.c:990 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: Starten des Servers hat nicht rechtzeitig abgeschlossen\n" -#: pg_ctl.c:997 +#: pg_ctl.c:996 #, c-format msgid "" "%s: could not start server\n" @@ -212,42 +231,42 @@ msgstr "" "%s: konnte Server nicht starten\n" "Prüfen Sie die Logausgabe.\n" -#: pg_ctl.c:1005 +#: pg_ctl.c:1004 msgid "server starting\n" msgstr "Server startet\n" -#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267 +#: pg_ctl.c:1023 pg_ctl.c:1081 pg_ctl.c:1144 pg_ctl.c:1183 pg_ctl.c:1264 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: PID-Datei »%s« existiert nicht\n" -#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268 +#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1145 pg_ctl.c:1184 pg_ctl.c:1265 msgid "Is server running?\n" msgstr "Läuft der Server?\n" -#: pg_ctl.c:1031 +#: pg_ctl.c:1030 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %d)\n" msgstr "%s: kann Server nicht anhalten; Einzelbenutzerserver läuft (PID: %d)\n" -#: pg_ctl.c:1046 +#: pg_ctl.c:1044 msgid "server shutting down\n" msgstr "Server fährt herunter\n" -#: pg_ctl.c:1051 pg_ctl.c:1112 +#: pg_ctl.c:1049 pg_ctl.c:1109 msgid "waiting for server to shut down..." msgstr "warte auf Herunterfahren des Servers..." -#: pg_ctl.c:1055 pg_ctl.c:1117 +#: pg_ctl.c:1053 pg_ctl.c:1114 msgid " failed\n" msgstr " Fehler\n" -#: pg_ctl.c:1057 pg_ctl.c:1119 +#: pg_ctl.c:1055 pg_ctl.c:1116 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: Server fährt nicht herunter\n" -#: pg_ctl.c:1059 pg_ctl.c:1121 +#: pg_ctl.c:1057 pg_ctl.c:1118 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -255,235 +274,235 @@ msgstr "" "TIPP: Die Option »-m fast« beendet Sitzungen sofort, statt auf das Beenden\n" "durch die Sitzungen selbst zu warten.\n" -#: pg_ctl.c:1065 pg_ctl.c:1127 +#: pg_ctl.c:1063 pg_ctl.c:1124 msgid "server stopped\n" msgstr "Server angehalten\n" -#: pg_ctl.c:1086 +#: pg_ctl.c:1084 msgid "trying to start server anyway\n" msgstr "versuche Server trotzdem zu starten\n" -#: pg_ctl.c:1095 +#: pg_ctl.c:1093 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %d)\n" msgstr "%s: kann Server nicht neu starten; Einzelbenutzerserver läuft (PID: %d)\n" -#: pg_ctl.c:1098 pg_ctl.c:1157 +#: pg_ctl.c:1096 pg_ctl.c:1154 msgid "Please terminate the single-user server and try again.\n" msgstr "Bitte beenden Sie den Einzelbenutzerserver und versuchen Sie es noch einmal.\n" -#: pg_ctl.c:1131 +#: pg_ctl.c:1128 #, c-format msgid "%s: old server process (PID: %d) seems to be gone\n" msgstr "%s: alter Serverprozess (PID: %d) scheint verschwunden zu sein\n" -#: pg_ctl.c:1133 +#: pg_ctl.c:1130 msgid "starting server anyway\n" msgstr "starte Server trotzdem\n" -#: pg_ctl.c:1154 +#: pg_ctl.c:1151 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %d)\n" msgstr "%s: kann Server nicht neu laden; Einzelbenutzerserver läuft (PID: %d)\n" -#: pg_ctl.c:1163 +#: pg_ctl.c:1160 #, c-format -msgid "%s: could not send reload signal (PID: %d): %s\n" -msgstr "%s: konnte Signal zum Neuladen nicht senden (PID: %d): %s\n" +msgid "%s: could not send reload signal (PID: %d): %m\n" +msgstr "%s: konnte Signal zum Neuladen nicht senden (PID: %d): %m\n" -#: pg_ctl.c:1168 +#: pg_ctl.c:1165 msgid "server signaled\n" msgstr "Signal an Server gesendet\n" -#: pg_ctl.c:1193 +#: pg_ctl.c:1190 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %d)\n" msgstr "%s: kann Server nicht befördern; Einzelbenutzerserver läuft (PID: %d)\n" -#: pg_ctl.c:1201 +#: pg_ctl.c:1198 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s: kann Server nicht befördern; Server ist nicht im Standby-Modus\n" -#: pg_ctl.c:1211 +#: pg_ctl.c:1208 #, c-format -msgid "%s: could not create promote signal file \"%s\": %s\n" -msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht erzeugen: %s\n" +msgid "%s: could not create promote signal file \"%s\": %m\n" +msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht erzeugen: %m\n" -#: pg_ctl.c:1217 +#: pg_ctl.c:1214 #, c-format -msgid "%s: could not write promote signal file \"%s\": %s\n" -msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht schreiben: %s\n" +msgid "%s: could not write promote signal file \"%s\": %m\n" +msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht schreiben: %m\n" -#: pg_ctl.c:1225 +#: pg_ctl.c:1222 #, c-format -msgid "%s: could not send promote signal (PID: %d): %s\n" -msgstr "%s: konnte Signal zum Befördern nicht senden (PID: %d): %s\n" +msgid "%s: could not send promote signal (PID: %d): %m\n" +msgstr "%s: konnte Signal zum Befördern nicht senden (PID: %d): %m\n" -#: pg_ctl.c:1228 +#: pg_ctl.c:1225 #, c-format -msgid "%s: could not remove promote signal file \"%s\": %s\n" -msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht entfernen: %s\n" +msgid "%s: could not remove promote signal file \"%s\": %m\n" +msgstr "%s: konnte Signaldatei zum Befördern »%s« nicht entfernen: %m\n" -#: pg_ctl.c:1235 +#: pg_ctl.c:1232 msgid "waiting for server to promote..." msgstr "warte auf Befördern des Servers..." -#: pg_ctl.c:1239 +#: pg_ctl.c:1236 msgid "server promoted\n" msgstr "Server wurde befördert\n" -#: pg_ctl.c:1244 +#: pg_ctl.c:1241 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: Befördern des Servers hat nicht rechtzeitig abgeschlossen\n" -#: pg_ctl.c:1250 +#: pg_ctl.c:1247 msgid "server promoting\n" msgstr "Server wird befördert\n" -#: pg_ctl.c:1274 +#: pg_ctl.c:1271 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n" msgstr "%s: kann Logdatei nicht rotieren; Einzelbenutzerserver läuft (PID: %d)\n" -#: pg_ctl.c:1284 +#: pg_ctl.c:1281 #, c-format -msgid "%s: could not create log rotation signal file \"%s\": %s\n" -msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht erzeugen: %s\n" +msgid "%s: could not create log rotation signal file \"%s\": %m\n" +msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht erzeugen: %m\n" -#: pg_ctl.c:1290 +#: pg_ctl.c:1287 #, c-format -msgid "%s: could not write log rotation signal file \"%s\": %s\n" -msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht schreiben: %s\n" +msgid "%s: could not write log rotation signal file \"%s\": %m\n" +msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht schreiben: %m\n" -#: pg_ctl.c:1298 +#: pg_ctl.c:1295 #, c-format -msgid "%s: could not send log rotation signal (PID: %d): %s\n" -msgstr "%s: konnte Signal zum Logrotieren nicht senden (PID: %d): %s\n" +msgid "%s: could not send log rotation signal (PID: %d): %m\n" +msgstr "%s: konnte Signal zum Logrotieren nicht senden (PID: %d): %m\n" -#: pg_ctl.c:1301 +#: pg_ctl.c:1298 #, c-format -msgid "%s: could not remove log rotation signal file \"%s\": %s\n" -msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht entfernen: %s\n" +msgid "%s: could not remove log rotation signal file \"%s\": %m\n" +msgstr "%s: konnte Signaldatei zum Logrotieren »%s« nicht entfernen: %m\n" -#: pg_ctl.c:1306 +#: pg_ctl.c:1303 msgid "server signaled to rotate log file\n" msgstr "Signal zum Logrotieren an Server gesendet\n" -#: pg_ctl.c:1353 +#: pg_ctl.c:1350 #, c-format msgid "%s: single-user server is running (PID: %d)\n" msgstr "%s: Einzelbenutzerserver läuft (PID: %d)\n" -#: pg_ctl.c:1367 +#: pg_ctl.c:1364 #, c-format msgid "%s: server is running (PID: %d)\n" msgstr "%s: Server läuft (PID: %d)\n" -#: pg_ctl.c:1383 +#: pg_ctl.c:1380 #, c-format msgid "%s: no server running\n" msgstr "%s: kein Server läuft\n" -#: pg_ctl.c:1400 +#: pg_ctl.c:1397 #, c-format -msgid "%s: could not send signal %d (PID: %d): %s\n" -msgstr "%s: konnte Signal %d nicht senden (PID: %d): %s\n" +msgid "%s: could not send signal %d (PID: %d): %m\n" +msgstr "%s: konnte Signal %d nicht senden (PID: %d): %m\n" -#: pg_ctl.c:1431 +#: pg_ctl.c:1428 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: konnte eigene Programmdatei nicht finden\n" -#: pg_ctl.c:1441 +#: pg_ctl.c:1438 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: konnte »postgres« Programmdatei nicht finden\n" -#: pg_ctl.c:1511 pg_ctl.c:1545 +#: pg_ctl.c:1508 pg_ctl.c:1542 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: konnte Servicemanager nicht öffnen\n" -#: pg_ctl.c:1517 +#: pg_ctl.c:1514 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: Systemdienst »%s« ist bereits registriert\n" -#: pg_ctl.c:1528 +#: pg_ctl.c:1525 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: konnte Systemdienst »%s« nicht registrieren: Fehlercode %lu\n" -#: pg_ctl.c:1551 +#: pg_ctl.c:1548 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: Systemdienst »%s« ist nicht registriert\n" -#: pg_ctl.c:1558 +#: pg_ctl.c:1555 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: konnte Systemdienst »%s« nicht öffnen: Fehlercode %lu\n" -#: pg_ctl.c:1567 +#: pg_ctl.c:1564 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: konnte Systemdienst »%s« nicht deregistrieren: Fehlercode %lu\n" -#: pg_ctl.c:1654 +#: pg_ctl.c:1651 msgid "Waiting for server startup...\n" msgstr "Warte auf Start des Servers...\n" -#: pg_ctl.c:1657 +#: pg_ctl.c:1654 msgid "Timed out waiting for server startup\n" msgstr "Zeitüberschreitung beim Warten auf Start des Servers\n" -#: pg_ctl.c:1661 +#: pg_ctl.c:1658 msgid "Server started and accepting connections\n" msgstr "Server wurde gestartet und nimmt Verbindungen an\n" -#: pg_ctl.c:1716 +#: pg_ctl.c:1713 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: konnte Systemdienst »%s« nicht starten: Fehlercode %lu\n" -#: pg_ctl.c:1789 +#: pg_ctl.c:1786 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: konnte Prozess-Token nicht öffnen: Fehlercode %lu\n" -#: pg_ctl.c:1803 +#: pg_ctl.c:1800 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: konnte SIDs nicht erzeugen: Fehlercode %lu\n" -#: pg_ctl.c:1829 +#: pg_ctl.c:1826 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: konnte beschränktes Token nicht erzeugen: Fehlercode %lu\n" -#: pg_ctl.c:1911 +#: pg_ctl.c:1908 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: konnte LUIDs für Privilegien nicht ermitteln: Fehlercode %lu\n" -#: pg_ctl.c:1919 pg_ctl.c:1934 +#: pg_ctl.c:1916 pg_ctl.c:1931 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: konnte Token-Informationen nicht ermitteln: Fehlercode %lu\n" -#: pg_ctl.c:1928 +#: pg_ctl.c:1925 #, c-format msgid "%s: out of memory\n" msgstr "%s: Speicher aufgebraucht\n" -#: pg_ctl.c:1958 +#: pg_ctl.c:1955 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" -#: pg_ctl.c:1966 +#: pg_ctl.c:1963 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" @@ -493,17 +512,17 @@ msgstr "" "starten, anzuhalten oder zu steuern.\n" "\n" -#: pg_ctl.c:1967 +#: pg_ctl.c:1964 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_ctl.c:1968 +#: pg_ctl.c:1965 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D DATENVERZ] [-s] [-o OPTIONEN]\n" -#: pg_ctl.c:1969 +#: pg_ctl.c:1966 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -512,12 +531,12 @@ msgstr "" " %s start [-D DATENVERZ] [-l DATEINAME] [-W] [-t SEK] [-s]\n" " [-o OPTIONEN] [-p PFAD] [-c]\n" -#: pg_ctl.c:1971 +#: pg_ctl.c:1968 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D DATENVERZ] [-m SHUTDOWN-MODUS] [-W] [-t SEK] [-s]\n" -#: pg_ctl.c:1972 +#: pg_ctl.c:1969 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -526,32 +545,32 @@ msgstr "" " %s restart [-D DATENVERZ] [-m SHUTDOWN-MODUS] [-W] [-t SEK] [-s]\n" " [-o OPTIONEN] [-c]\n" -#: pg_ctl.c:1974 +#: pg_ctl.c:1971 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D DATENVERZ] [-s]\n" -#: pg_ctl.c:1975 +#: pg_ctl.c:1972 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D DATENVERZ]\n" -#: pg_ctl.c:1976 +#: pg_ctl.c:1973 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D DATENVERZ] [-W] [-t SEK] [-s]\n" -#: pg_ctl.c:1977 +#: pg_ctl.c:1974 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D DATENVERZ] [-s]\n" -#: pg_ctl.c:1978 +#: pg_ctl.c:1975 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill SIGNALNAME PID\n" -#: pg_ctl.c:1980 +#: pg_ctl.c:1977 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" @@ -560,12 +579,12 @@ msgstr "" " %s register [-D DATENVERZ] [-N DIENSTNAME] [-U BENUTZERNAME] [-P PASSWORT]\n" " [-S STARTTYP] [-e QUELLE] [-W] [-t SEK] [-s] [-o OPTIONEN]\n" -#: pg_ctl.c:1982 +#: pg_ctl.c:1979 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N DIENSTNAME]\n" -#: pg_ctl.c:1985 +#: pg_ctl.c:1982 #, c-format msgid "" "\n" @@ -574,56 +593,56 @@ msgstr "" "\n" "Optionen für alle Modi:\n" -#: pg_ctl.c:1986 +#: pg_ctl.c:1983 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata=DATENVERZ Datenbankverzeichnis\n" -#: pg_ctl.c:1988 +#: pg_ctl.c:1985 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr "" " -e QUELLE Ereignisquelle fürs Loggen, wenn als Systemdienst\n" " gestartet\n" -#: pg_ctl.c:1990 +#: pg_ctl.c:1987 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr " -s, --silent nur Fehler zeigen, keine Informationsmeldungen\n" -#: pg_ctl.c:1991 +#: pg_ctl.c:1988 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr " -t, --timeout=SEK Sekunden zu warten bei Option -w\n" -#: pg_ctl.c:1992 +#: pg_ctl.c:1989 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_ctl.c:1993 +#: pg_ctl.c:1990 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait warten bis Operation abgeschlossen ist (Voreinstellung)\n" -#: pg_ctl.c:1994 +#: pg_ctl.c:1991 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait nicht warten bis Operation abgeschlossen ist\n" -#: pg_ctl.c:1995 +#: pg_ctl.c:1992 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_ctl.c:1996 +#: pg_ctl.c:1993 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "" "Wenn die Option -D weggelassen wird, dann wird die Umgebungsvariable\n" "PGDATA verwendet.\n" -#: pg_ctl.c:1998 +#: pg_ctl.c:1995 #, c-format msgid "" "\n" @@ -632,24 +651,24 @@ msgstr "" "\n" "Optionen für Start oder Neustart:\n" -#: pg_ctl.c:2000 +#: pg_ctl.c:1997 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files erlaubt postgres Core-Dateien zu erzeugen\n" -#: pg_ctl.c:2002 +#: pg_ctl.c:1999 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files betrifft diese Plattform nicht\n" -#: pg_ctl.c:2004 +#: pg_ctl.c:2001 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr "" " -l, --log=DATEINAME Serverlog in DATEINAME schreiben (wird an bestehende\n" " Datei angehängt)\n" -#: pg_ctl.c:2005 +#: pg_ctl.c:2002 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" @@ -658,12 +677,12 @@ msgstr "" " -o, --options=OPTIONEN Kommandozeilenoptionen für postgres (PostgreSQL-\n" " Serverprogramm) oder initdb\n" -#: pg_ctl.c:2007 +#: pg_ctl.c:2004 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p PFAD-ZU-POSTGRES normalerweise nicht notwendig\n" -#: pg_ctl.c:2008 +#: pg_ctl.c:2005 #, c-format msgid "" "\n" @@ -672,12 +691,12 @@ msgstr "" "\n" "Optionen für Anhalten oder Neustart:\n" -#: pg_ctl.c:2009 +#: pg_ctl.c:2006 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr " -m, --mode=MODUS MODUS kann »smart«, »fast« oder »immediate« sein\n" -#: pg_ctl.c:2011 +#: pg_ctl.c:2008 #, c-format msgid "" "\n" @@ -686,24 +705,24 @@ msgstr "" "\n" "Shutdown-Modi sind:\n" -#: pg_ctl.c:2012 +#: pg_ctl.c:2009 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart beenden nachdem alle Clientverbindungen geschlossen sind\n" -#: pg_ctl.c:2013 +#: pg_ctl.c:2010 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast sofort beenden, mit richtigem Shutdown (Voreinstellung)\n" -#: pg_ctl.c:2014 +#: pg_ctl.c:2011 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr "" " immediate beenden ohne vollständigen Shutdown; führt zu Recovery-Lauf\n" " beim Neustart\n" -#: pg_ctl.c:2016 +#: pg_ctl.c:2013 #, c-format msgid "" "\n" @@ -712,7 +731,7 @@ msgstr "" "\n" "Erlaubte Signalnamen für »kill«:\n" -#: pg_ctl.c:2020 +#: pg_ctl.c:2017 #, c-format msgid "" "\n" @@ -721,27 +740,27 @@ msgstr "" "\n" "Optionen für »register« und »unregister«:\n" -#: pg_ctl.c:2021 +#: pg_ctl.c:2018 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N DIENSTNAME Systemdienstname für Registrierung des PostgreSQL-Servers\n" -#: pg_ctl.c:2022 +#: pg_ctl.c:2019 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr " -P PASSWORD Passwort des Benutzers für Registrierung des PostgreSQL-Servers\n" -#: pg_ctl.c:2023 +#: pg_ctl.c:2020 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr " -U USERNAME Benutzername für Registrierung des PostgreSQL-Servers\n" -#: pg_ctl.c:2024 +#: pg_ctl.c:2021 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S STARTTYP Systemdienst-Starttyp für PostgreSQL-Server\n" -#: pg_ctl.c:2026 +#: pg_ctl.c:2023 #, c-format msgid "" "\n" @@ -750,19 +769,19 @@ msgstr "" "\n" "Starttypen sind:\n" -#: pg_ctl.c:2027 +#: pg_ctl.c:2024 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr "" " auto Dienst automatisch starten beim Start des Betriebssystems\n" " (Voreinstellung)\n" -#: pg_ctl.c:2028 +#: pg_ctl.c:2025 #, c-format msgid " demand start service on demand\n" msgstr " demand Dienst bei Bedarf starten\n" -#: pg_ctl.c:2031 +#: pg_ctl.c:2028 #, c-format msgid "" "\n" @@ -771,37 +790,37 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2029 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_ctl.c:2057 +#: pg_ctl.c:2054 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: unbekannter Shutdown-Modus »%s«\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:2083 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: unbekannter Signalname »%s«\n" -#: pg_ctl.c:2103 +#: pg_ctl.c:2100 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: unbekannter Starttyp »%s«\n" -#: pg_ctl.c:2159 +#: pg_ctl.c:2156 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: konnte das Datenverzeichnis mit Befehl »%s« nicht ermitteln\n" -#: pg_ctl.c:2182 +#: pg_ctl.c:2179 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: Kontrolldatei scheint kaputt zu sein\n" -#: pg_ctl.c:2250 +#: pg_ctl.c:2247 #, c-format msgid "" "%s: cannot be run as root\n" @@ -812,32 +831,32 @@ msgstr "" "Bitte loggen Sie sich (z.B. mit »su«) als der (unprivilegierte) Benutzer\n" "ein, der Eigentümer des Serverprozesses sein soll.\n" -#: pg_ctl.c:2333 +#: pg_ctl.c:2319 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: Option -S wird auf dieser Plattform nicht unterstützt\n" -#: pg_ctl.c:2370 -#, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: zu viele Kommandozeilenargumente (das erste ist »%s«)\n" - -#: pg_ctl.c:2396 +#: pg_ctl.c:2375 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: fehlende Argumente für »kill«-Modus\n" -#: pg_ctl.c:2414 +#: pg_ctl.c:2393 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: unbekannter Operationsmodus »%s«\n" -#: pg_ctl.c:2424 +#: pg_ctl.c:2402 +#, c-format +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: zu viele Kommandozeilenargumente (das erste ist »%s«)\n" + +#: pg_ctl.c:2409 #, c-format msgid "%s: no operation specified\n" msgstr "%s: keine Operation angegeben\n" -#: pg_ctl.c:2445 +#: pg_ctl.c:2430 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "%s: kein Datenbankverzeichnis angegeben und Umgebungsvariable PGDATA nicht gesetzt\n" diff --git a/src/bin/pg_ctl/po/el.po b/src/bin/pg_ctl/po/el.po index 27cea8604ee18..69fbd604eeb9a 100644 --- a/src/bin/pg_ctl/po/el.po +++ b/src/bin/pg_ctl/po/el.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_ctl (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-24 03:48+0000\n" -"PO-Revision-Date: 2023-04-24 09:04+0200\n" +"POT-Creation-Date: 2023-08-14 23:18+0000\n" +"PO-Revision-Date: 2023-08-15 13:37+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../common/exec.c:172 #, c-format @@ -36,10 +36,9 @@ msgid "could not find a \"%s\" to execute" msgstr "δεν βÏέθηκε το αÏχείο «%s» για να εκτελεστεί" #: ../../common/exec.c:250 -#, fuzzy, c-format -#| msgid "could not rename file \"%s\" to \"%s\": %m" +#, c-format msgid "could not resolve path \"%s\" to absolute form: %m" -msgstr "δεν ήταν δυνατή η μετονομασία του αÏχείου «%s» σε «%s»: %m" +msgstr "δεν δÏναται η επίλυση διαδÏομής «%s» σε απόλυτη μοÏφή: %m" #: ../../common/exec.c:412 #, c-format @@ -170,7 +169,7 @@ msgstr "%s: δεν ήταν δυνατή η αποστολή σήματος δι #: pg_ctl.c:883 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" -msgstr "Το Ï€ÏόγÏαμμα «%s» απαιτείται από %s αλλά δεν βÏέθηκε στον ίδιο κατάλογο με το «%s».\n" +msgstr "το Ï€ÏόγÏαμμα «%s» χÏειάζεται από %s αλλά δεν βÏέθηκε στον ίδιο κατάλογο με το «%s»\n" #: pg_ctl.c:886 #, c-format diff --git a/src/bin/pg_ctl/po/es.po b/src/bin/pg_ctl/po/es.po index ea82807aee75f..f57f1217e9586 100644 --- a/src/bin/pg_ctl/po/es.po +++ b/src/bin/pg_ctl/po/es.po @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_ctl (PostgreSQL) 16\n" +"Project-Id-Version: pg_ctl (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:18+0000\n" -"PO-Revision-Date: 2023-05-22 12:05+0200\n" +"POT-Creation-Date: 2025-02-16 19:49+0000\n" +"PO-Revision-Date: 2024-11-16 14:23+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -21,38 +21,57 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" -#: ../../common/exec.c:172 +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "discordancia en orden de bytes" + +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "binario «%s» no válido: %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "no se pudo leer el binario «%s»: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "no se pudo encontrar un «%s» para ejecutar" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "no se pudo resolver la ruta «%s» a forma absoluta: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "no se pudo ejecutar la orden «%s»: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "no se pudo leer desde la orden «%s»: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "la orden «%s» no retornó datos" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() falló: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "memoria agotada" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 -#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 +#: ../../port/path.c:830 ../../port/path.c:867 ../../port/path.c:884 #, c-format msgid "out of memory\n" msgstr "memoria agotada\n" @@ -92,125 +111,125 @@ msgstr "el proceso hijo fue terminado por una señal %d: %s" msgid "child process exited with unrecognized status %d" msgstr "el proceso hijo terminó con código no reconocido %d" -#: ../../port/path.c:775 +#: ../../port/path.c:852 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "no se pudo obtener el directorio de trabajo actual: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "no se pudo obtener el directorio de trabajo actual: %m\n" -#: pg_ctl.c:255 +#: pg_ctl.c:254 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s: el directorio «%s» no existe\n" -#: pg_ctl.c:258 +#: pg_ctl.c:257 #, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: no se pudo acceder al directorio «%s»: %s\n" +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: no se pudo acceder al directorio «%s»: %m\n" -#: pg_ctl.c:271 +#: pg_ctl.c:270 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s: el directorio «%s» no es un directorio de base de datos\n" -#: pg_ctl.c:284 +#: pg_ctl.c:283 #, c-format -msgid "%s: could not open PID file \"%s\": %s\n" -msgstr "%s: no se pudo abrir el archivo de PID «%s»: %s\n" +msgid "%s: could not open PID file \"%s\": %m\n" +msgstr "%s: no se pudo abrir el archivo de PID «%s»: %m\n" -#: pg_ctl.c:293 +#: pg_ctl.c:292 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s: el archivo de PID «%s» está vacío\n" -#: pg_ctl.c:296 +#: pg_ctl.c:295 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s: datos no válidos en archivo de PID «%s»\n" -#: pg_ctl.c:458 pg_ctl.c:500 +#: pg_ctl.c:457 pg_ctl.c:499 #, c-format -msgid "%s: could not start server: %s\n" -msgstr "%s: no se pudo iniciar el servidor: %s\n" +msgid "%s: could not start server: %m\n" +msgstr "%s: no se pudo iniciar el servidor: %m\n" -#: pg_ctl.c:478 +#: pg_ctl.c:477 #, c-format -msgid "%s: could not start server due to setsid() failure: %s\n" -msgstr "%s: no se pudo iniciar el servidor debido a falla en setsid(): %s\n" +msgid "%s: could not start server due to setsid() failure: %m\n" +msgstr "%s: no se pudo iniciar el servidor debido a falla en setsid(): %m\n" -#: pg_ctl.c:548 +#: pg_ctl.c:547 #, c-format -msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s: no se pudo abrir el archivo de log «%s»: %s\n" +msgid "%s: could not open log file \"%s\": %m\n" +msgstr "%s: no se pudo abrir el archivo de log «%s»: %m\n" -#: pg_ctl.c:565 +#: pg_ctl.c:564 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s: no se pudo iniciar el servidor: código de error %lu\n" -#: pg_ctl.c:782 +#: pg_ctl.c:781 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" msgstr "" "%s: no se puede establecer el límite de archivos de volcado;\n" "impedido por un límite duro\n" -#: pg_ctl.c:808 +#: pg_ctl.c:807 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s: no se pudo leer el archivo «%s»\n" -#: pg_ctl.c:813 +#: pg_ctl.c:812 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: archivo de opciones «%s» debe tener exactamente una línea\n" -#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107 +#: pg_ctl.c:854 pg_ctl.c:1038 pg_ctl.c:1105 #, c-format -msgid "%s: could not send stop signal (PID: %d): %s\n" -msgstr "%s: falló la señal de detención (PID: %d): %s\n" +msgid "%s: could not send stop signal (PID: %d): %m\n" +msgstr "%s: falló la señal de detención (PID: %d): %m\n" -#: pg_ctl.c:883 +#: pg_ctl.c:882 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" msgstr "el programa «%s» es requerido por %s, pero no fue encontrado en el mismo directorio que «%s»\n" -#: pg_ctl.c:886 +#: pg_ctl.c:885 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" msgstr "El programa «%s» fue encontrado por «%s», pero no es de la misma versión que %s\n" -#: pg_ctl.c:918 +#: pg_ctl.c:917 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s: falló la creación de la base de datos\n" -#: pg_ctl.c:933 +#: pg_ctl.c:932 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "%s: otro servidor puede estar en ejecución; tratando de iniciarlo de todas formas.\n" -#: pg_ctl.c:981 +#: pg_ctl.c:980 msgid "waiting for server to start..." msgstr "esperando que el servidor se inicie..." -#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238 +#: pg_ctl.c:985 pg_ctl.c:1061 pg_ctl.c:1123 pg_ctl.c:1235 msgid " done\n" msgstr " listo\n" -#: pg_ctl.c:987 +#: pg_ctl.c:986 msgid "server started\n" msgstr "servidor iniciado\n" -#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243 +#: pg_ctl.c:989 pg_ctl.c:995 pg_ctl.c:1240 msgid " stopped waiting\n" msgstr " abandonando la espera\n" -#: pg_ctl.c:991 +#: pg_ctl.c:990 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: el servidor no inició a tiempo\n" -#: pg_ctl.c:997 +#: pg_ctl.c:996 #, c-format msgid "" "%s: could not start server\n" @@ -219,44 +238,42 @@ msgstr "" "%s: no se pudo iniciar el servidor.\n" "Examine el registro del servidor.\n" -#: pg_ctl.c:1005 +#: pg_ctl.c:1004 msgid "server starting\n" msgstr "servidor iniciándose\n" -#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267 +#: pg_ctl.c:1023 pg_ctl.c:1081 pg_ctl.c:1144 pg_ctl.c:1183 pg_ctl.c:1264 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: el archivo de PID «%s» no existe\n" -#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268 +#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1145 pg_ctl.c:1184 pg_ctl.c:1265 msgid "Is server running?\n" msgstr "¿Está el servidor en ejecución?\n" -#: pg_ctl.c:1031 +#: pg_ctl.c:1030 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %d)\n" -msgstr "" -"%s: no se puede detener el servidor;\n" -"un servidor en modo mono-usuario está en ejecución (PID: %d)\n" +msgstr "%s: no se puede detener el servidor; un servidor en modo mono-usuario está en ejecución (PID: %d)\n" -#: pg_ctl.c:1046 +#: pg_ctl.c:1044 msgid "server shutting down\n" msgstr "servidor deteniéndose\n" -#: pg_ctl.c:1051 pg_ctl.c:1112 +#: pg_ctl.c:1049 pg_ctl.c:1109 msgid "waiting for server to shut down..." msgstr "esperando que el servidor se detenga..." -#: pg_ctl.c:1055 pg_ctl.c:1117 +#: pg_ctl.c:1053 pg_ctl.c:1114 msgid " failed\n" msgstr " falló\n" -#: pg_ctl.c:1057 pg_ctl.c:1119 +#: pg_ctl.c:1055 pg_ctl.c:1116 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: el servidor no se detiene\n" -#: pg_ctl.c:1059 pg_ctl.c:1121 +#: pg_ctl.c:1057 pg_ctl.c:1118 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -264,243 +281,237 @@ msgstr "" "SUGERENCIA: La opción «-m fast» desconecta las sesiones inmediatamente\n" "en lugar de esperar que cada sesión finalice por sí misma.\n" -#: pg_ctl.c:1065 pg_ctl.c:1127 +#: pg_ctl.c:1063 pg_ctl.c:1124 msgid "server stopped\n" msgstr "servidor detenido\n" -#: pg_ctl.c:1086 +#: pg_ctl.c:1084 msgid "trying to start server anyway\n" msgstr "intentando iniciae el servidor de todas maneras\n" -#: pg_ctl.c:1095 +#: pg_ctl.c:1093 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %d)\n" -msgstr "" -"%s: no se puede reiniciar el servidor;\n" -"un servidor en modo mono-usuario está en ejecución (PID: %d)\n" +msgstr "%s: no se puede reiniciar el servidor; un servidor en modo mono-usuario está en ejecución (PID: %d)\n" -#: pg_ctl.c:1098 pg_ctl.c:1157 +#: pg_ctl.c:1096 pg_ctl.c:1154 msgid "Please terminate the single-user server and try again.\n" msgstr "Por favor termine el servidor mono-usuario e intente nuevamente.\n" -#: pg_ctl.c:1131 +#: pg_ctl.c:1128 #, c-format msgid "%s: old server process (PID: %d) seems to be gone\n" msgstr "%s: el proceso servidor antiguo (PID: %d) parece no estar\n" -#: pg_ctl.c:1133 +#: pg_ctl.c:1130 msgid "starting server anyway\n" msgstr "iniciando el servidor de todas maneras\n" -#: pg_ctl.c:1154 +#: pg_ctl.c:1151 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %d)\n" -msgstr "" -"%s: no se puede recargar el servidor;\n" -"un servidor en modo mono-usuario está en ejecución (PID: %d)\n" +msgstr "%s: no se puede recargar el servidor; un servidor en modo mono-usuario está en ejecución (PID: %d)\n" -#: pg_ctl.c:1163 +#: pg_ctl.c:1160 #, c-format -msgid "%s: could not send reload signal (PID: %d): %s\n" -msgstr "%s: la señal de recarga falló (PID: %d): %s\n" +msgid "%s: could not send reload signal (PID: %d): %m\n" +msgstr "%s: no se pudo enviar señal de recarga (PID: %d): %m\n" -#: pg_ctl.c:1168 +#: pg_ctl.c:1165 msgid "server signaled\n" msgstr "se ha enviado una señal al servidor\n" -#: pg_ctl.c:1193 +#: pg_ctl.c:1190 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %d)\n" -msgstr "" -"%s: no se puede promover el servidor;\n" -"un servidor en modo mono-usuario está en ejecución (PID: %d)\n" +msgstr "%s: no se puede promover el servidor; un servidor en modo mono-usuario está en ejecución (PID: %d)\n" -#: pg_ctl.c:1201 +#: pg_ctl.c:1198 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "" "%s: no se puede promover el servidor;\n" "el servidor no está en modo «standby»\n" -#: pg_ctl.c:1211 +#: pg_ctl.c:1208 #, c-format -msgid "%s: could not create promote signal file \"%s\": %s\n" -msgstr "%s: no se pudo crear el archivo de señal de promoción «%s»: %s\n" +msgid "%s: could not create promote signal file \"%s\": %m\n" +msgstr "%s: no se pudo crear el archivo de señal de promoción «%s»: %m\n" -#: pg_ctl.c:1217 +#: pg_ctl.c:1214 #, c-format -msgid "%s: could not write promote signal file \"%s\": %s\n" -msgstr "%s: no se pudo escribir al archivo de señal de promoción «%s»: %s\n" +msgid "%s: could not write promote signal file \"%s\": %m\n" +msgstr "%s: no se pudo escribir al archivo de señal de promoción «%s»: %m\n" -#: pg_ctl.c:1225 +#: pg_ctl.c:1222 #, c-format -msgid "%s: could not send promote signal (PID: %d): %s\n" -msgstr "%s: no se pudo enviar la señal de promoción (PID: %d): %s\n" +msgid "%s: could not send promote signal (PID: %d): %m\n" +msgstr "%s: no se pudo enviar la señal de promoción (PID: %d): %m\n" -#: pg_ctl.c:1228 +#: pg_ctl.c:1225 #, c-format -msgid "%s: could not remove promote signal file \"%s\": %s\n" -msgstr "%s: no se pudo eliminar el archivo de señal de promoción «%s»: %s\n" +msgid "%s: could not remove promote signal file \"%s\": %m\n" +msgstr "%s: no se pudo eliminar el archivo de señal de promoción «%s»: %m\n" -#: pg_ctl.c:1235 +#: pg_ctl.c:1232 msgid "waiting for server to promote..." msgstr "esperando que el servidor se promueva..." -#: pg_ctl.c:1239 +#: pg_ctl.c:1236 msgid "server promoted\n" msgstr "servidor promovido\n" -#: pg_ctl.c:1244 +#: pg_ctl.c:1241 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: el servidor no se promovió a tiempo\n" -#: pg_ctl.c:1250 +#: pg_ctl.c:1247 msgid "server promoting\n" msgstr "servidor promoviendo\n" -#: pg_ctl.c:1274 +#: pg_ctl.c:1271 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n" msgstr "%s: no se puede rotar el archivo de log; un servidor en modo mono-usuario está en ejecución (PID: %d)\n" -#: pg_ctl.c:1284 +#: pg_ctl.c:1281 #, c-format -msgid "%s: could not create log rotation signal file \"%s\": %s\n" -msgstr "%s: no se pudo crear el archivo de señal de rotación de log «%s»: %s\n" +msgid "%s: could not create log rotation signal file \"%s\": %m\n" +msgstr "%s: no se pudo crear el archivo de señal de rotación de log «%s»: %m\n" -#: pg_ctl.c:1290 +#: pg_ctl.c:1287 #, c-format -msgid "%s: could not write log rotation signal file \"%s\": %s\n" -msgstr "%s: no se pudo escribir al archivo de señal de rotación de log «%s»: %s\n" +msgid "%s: could not write log rotation signal file \"%s\": %m\n" +msgstr "%s: no se pudo escribir al archivo de señal de rotación de log «%s»: %m\n" -#: pg_ctl.c:1298 +#: pg_ctl.c:1295 #, c-format -msgid "%s: could not send log rotation signal (PID: %d): %s\n" -msgstr "%s: no se pudo enviar la señal de rotación de log (PID: %d): %s\n" +msgid "%s: could not send log rotation signal (PID: %d): %m\n" +msgstr "%s: no se pudo enviar la señal de rotación de log (PID: %d): %m\n" -#: pg_ctl.c:1301 +#: pg_ctl.c:1298 #, c-format -msgid "%s: could not remove log rotation signal file \"%s\": %s\n" -msgstr "%s: no se pudo eliminar el archivo de señal de rotación de log «%s»: %s\n" +msgid "%s: could not remove log rotation signal file \"%s\": %m\n" +msgstr "%s: no se pudo eliminar el archivo de señal de rotación de log «%s»: %m\n" -#: pg_ctl.c:1306 +#: pg_ctl.c:1303 msgid "server signaled to rotate log file\n" msgstr "se ha enviado una señal de rotación de log al servidor\n" -#: pg_ctl.c:1353 +#: pg_ctl.c:1350 #, c-format msgid "%s: single-user server is running (PID: %d)\n" msgstr "%s: un servidor en modo mono-usuario está en ejecución (PID: %d)\n" -#: pg_ctl.c:1367 +#: pg_ctl.c:1364 #, c-format msgid "%s: server is running (PID: %d)\n" msgstr "%s: el servidor está en ejecución (PID: %d)\n" -#: pg_ctl.c:1383 +#: pg_ctl.c:1380 #, c-format msgid "%s: no server running\n" msgstr "%s: no hay servidor en ejecución\n" -#: pg_ctl.c:1400 +#: pg_ctl.c:1397 #, c-format -msgid "%s: could not send signal %d (PID: %d): %s\n" -msgstr "%s: no se pudo enviar la señal %d (PID: %d): %s\n" +msgid "%s: could not send signal %d (PID: %d): %m\n" +msgstr "%s: no se pudo enviar la señal %d (PID: %d): %m\n" -#: pg_ctl.c:1431 +#: pg_ctl.c:1428 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: no se pudo encontrar el ejecutable propio\n" -#: pg_ctl.c:1441 +#: pg_ctl.c:1438 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: no se pudo encontrar el ejecutable postgres\n" -#: pg_ctl.c:1511 pg_ctl.c:1545 +#: pg_ctl.c:1508 pg_ctl.c:1542 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: no se pudo abrir el gestor de servicios\n" -#: pg_ctl.c:1517 +#: pg_ctl.c:1514 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: el servicio «%s» ya está registrado\n" -#: pg_ctl.c:1528 +#: pg_ctl.c:1525 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: no se pudo registrar el servicio «%s»: código de error %lu\n" -#: pg_ctl.c:1551 +#: pg_ctl.c:1548 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: el servicio «%s» no ha sido registrado\n" -#: pg_ctl.c:1558 +#: pg_ctl.c:1555 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: no se pudo abrir el servicio «%s»: código de error %lu\n" -#: pg_ctl.c:1567 +#: pg_ctl.c:1564 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: no se pudo dar de baja el servicio «%s»: código de error %lu\n" -#: pg_ctl.c:1654 +#: pg_ctl.c:1651 msgid "Waiting for server startup...\n" msgstr "Esperando que el servidor se inicie...\n" -#: pg_ctl.c:1657 +#: pg_ctl.c:1654 msgid "Timed out waiting for server startup\n" msgstr "Se agotó el tiempo de espera al inicio del servidor\n" -#: pg_ctl.c:1661 +#: pg_ctl.c:1658 msgid "Server started and accepting connections\n" msgstr "Servidor iniciado y aceptando conexiones\n" -#: pg_ctl.c:1716 +#: pg_ctl.c:1713 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: no se pudo iniciar el servicio «%s»: código de error %lu\n" -#: pg_ctl.c:1789 +#: pg_ctl.c:1786 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: no se pudo abrir el token de proceso: código de error %lu\n" -#: pg_ctl.c:1803 +#: pg_ctl.c:1800 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: no se pudo emplazar los SIDs: código de error %lu\n" -#: pg_ctl.c:1829 +#: pg_ctl.c:1826 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: no se pudo crear el token restringido: código de error %lu\n" -#: pg_ctl.c:1911 +#: pg_ctl.c:1908 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: no se pudo obtener LUIDs para privilegios: código de error %lu\n" -#: pg_ctl.c:1919 pg_ctl.c:1934 +#: pg_ctl.c:1916 pg_ctl.c:1931 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: no se pudo obtener información de token: código de error %lu\n" -#: pg_ctl.c:1928 +#: pg_ctl.c:1925 #, c-format msgid "%s: out of memory\n" msgstr "%s: memoria agotada\n" -#: pg_ctl.c:1958 +#: pg_ctl.c:1955 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Use «%s --help» para obtener más información.\n" -#: pg_ctl.c:1966 +#: pg_ctl.c:1963 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" @@ -510,17 +521,17 @@ msgstr "" "un servidor PostgreSQL.\n" "\n" -#: pg_ctl.c:1967 +#: pg_ctl.c:1964 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: pg_ctl.c:1968 +#: pg_ctl.c:1965 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D DATADIR] [-s] [-o OPCIONES]\n" -#: pg_ctl.c:1969 +#: pg_ctl.c:1966 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -529,12 +540,12 @@ msgstr "" " %s start [-D DATADIR] [-l ARCHIVO] [-W] [-t SEGS] [-s]\n" " [-o OPCIONES] [-p RUTA] [-c]\n" -#: pg_ctl.c:1971 +#: pg_ctl.c:1968 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D DATADIR] [-m MODO-DETENCIÓN] [-W] [-t SEGS] [-s]\n" -#: pg_ctl.c:1972 +#: pg_ctl.c:1969 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -543,32 +554,32 @@ msgstr "" " %s restart [-D DATADIR] [-m MODO-DETENCIÓN] [-W] [-t SEGS] [-s]\n" " [-o OPCIONES]\n" -#: pg_ctl.c:1974 +#: pg_ctl.c:1971 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D DATADIR] [-s]\n" -#: pg_ctl.c:1975 +#: pg_ctl.c:1972 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D DATADIR]\n" -#: pg_ctl.c:1976 +#: pg_ctl.c:1973 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D DATADIR] [-W] [-t SEGS] [-s]\n" -#: pg_ctl.c:1977 +#: pg_ctl.c:1974 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D DATADIR] [-s]\n" -#: pg_ctl.c:1978 +#: pg_ctl.c:1975 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill NOMBRE-SEÑAL ID-DE-PROCESO\n" -#: pg_ctl.c:1980 +#: pg_ctl.c:1977 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" @@ -577,12 +588,12 @@ msgstr "" " %s register [-D DATADIR] [-N SERVICIO] [-U USUARIO] [-P PASSWORD]\n" " [-S TIPO-INICIO] [-e ORIGEN] [-W] [-t SEGS] [-o OPCIONES]\n" -#: pg_ctl.c:1982 +#: pg_ctl.c:1979 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N SERVICIO]\n" -#: pg_ctl.c:1985 +#: pg_ctl.c:1982 #, c-format msgid "" "\n" @@ -591,52 +602,52 @@ msgstr "" "\n" "Opciones comunes:\n" -#: pg_ctl.c:1986 +#: pg_ctl.c:1983 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata DATADIR ubicación del área de almacenamiento de datos\n" -#: pg_ctl.c:1988 +#: pg_ctl.c:1985 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr " -e ORIGEN origen para el log de eventos cuando se ejecuta como servicio\n" -#: pg_ctl.c:1990 +#: pg_ctl.c:1987 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr " -s, --silent mostrar sólo errores, no mensajes de información\n" -#: pg_ctl.c:1991 +#: pg_ctl.c:1988 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr " -t, --timeout=SEGS segundos a esperar cuando se use la opción -w\n" -#: pg_ctl.c:1992 +#: pg_ctl.c:1989 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión, luego salir\n" -#: pg_ctl.c:1993 +#: pg_ctl.c:1990 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait esperar hasta que la operación se haya completado (por omisión)\n" -#: pg_ctl.c:1994 +#: pg_ctl.c:1991 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait no esperar hasta que la operación se haya completado\n" -#: pg_ctl.c:1995 +#: pg_ctl.c:1992 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda, luego salir\n" -#: pg_ctl.c:1996 +#: pg_ctl.c:1993 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "Si la opción -D es omitida, se usa la variable de ambiente PGDATA.\n" -#: pg_ctl.c:1998 +#: pg_ctl.c:1995 #, c-format msgid "" "\n" @@ -645,24 +656,24 @@ msgstr "" "\n" "Opciones para inicio y reinicio:\n" -#: pg_ctl.c:2000 +#: pg_ctl.c:1997 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr "" " -c, --core-files permite que postgres produzca archivos\n" " de volcado (core)\n" -#: pg_ctl.c:2002 +#: pg_ctl.c:1999 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files no aplicable en esta plataforma\n" -#: pg_ctl.c:2004 +#: pg_ctl.c:2001 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr " -l --log=ARCHIVO guardar el registro del servidor en ARCHIVO.\n" -#: pg_ctl.c:2005 +#: pg_ctl.c:2002 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" @@ -671,12 +682,12 @@ msgstr "" " -o, --options=OPCIONES parámetros de línea de órdenes a pasar a postgres\n" " (ejecutable del servidor de PostgreSQL) o initdb\n" -#: pg_ctl.c:2007 +#: pg_ctl.c:2004 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p RUTA-A-POSTGRES normalmente no es necesario\n" -#: pg_ctl.c:2008 +#: pg_ctl.c:2005 #, c-format msgid "" "\n" @@ -685,12 +696,12 @@ msgstr "" "\n" "Opciones para detener o reiniciar:\n" -#: pg_ctl.c:2009 +#: pg_ctl.c:2006 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr " -m, --mode=MODO puede ser «smart», «fast» o «immediate»\n" -#: pg_ctl.c:2011 +#: pg_ctl.c:2008 #, c-format msgid "" "\n" @@ -699,24 +710,24 @@ msgstr "" "\n" "Modos de detención son:\n" -#: pg_ctl.c:2012 +#: pg_ctl.c:2009 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart salir después que todos los clientes se hayan desconectado\n" -#: pg_ctl.c:2013 +#: pg_ctl.c:2010 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast salir directamente, con apagado apropiado (por omisión)\n" -#: pg_ctl.c:2014 +#: pg_ctl.c:2011 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr "" " immediate salir sin apagado completo; se ejecutará recuperación\n" " en el próximo inicio\n" -#: pg_ctl.c:2016 +#: pg_ctl.c:2013 #, c-format msgid "" "\n" @@ -725,7 +736,7 @@ msgstr "" "\n" "Nombres de señales permitidos para kill:\n" -#: pg_ctl.c:2020 +#: pg_ctl.c:2017 #, c-format msgid "" "\n" @@ -734,35 +745,35 @@ msgstr "" "\n" "Opciones para registrar y dar de baja:\n" -#: pg_ctl.c:2021 +#: pg_ctl.c:2018 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr "" " -N SERVICIO nombre de servicio con el cual registrar\n" " el servidor PostgreSQL\n" -#: pg_ctl.c:2022 +#: pg_ctl.c:2019 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr "" " -P CONTRASEÑA contraseña de la cuenta con la cual registrar\n" " el servidor PostgreSQL\n" -#: pg_ctl.c:2023 +#: pg_ctl.c:2020 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr "" " -U USUARIO nombre de usuario de la cuenta con la cual\n" " registrar el servidor PostgreSQL\n" -#: pg_ctl.c:2024 +#: pg_ctl.c:2021 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr "" " -S TIPO-INICIO tipo de inicio de servicio con que registrar\n" " el servidor PostgreSQL\n" -#: pg_ctl.c:2026 +#: pg_ctl.c:2023 #, c-format msgid "" "\n" @@ -771,17 +782,17 @@ msgstr "" "\n" "Tipos de inicio del servicio son:\n" -#: pg_ctl.c:2027 +#: pg_ctl.c:2024 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr " auto iniciar automáticamente al inicio del sistema (por omisión)\n" -#: pg_ctl.c:2028 +#: pg_ctl.c:2025 #, c-format msgid " demand start service on demand\n" msgstr " demand iniciar el servicio en demanda\n" -#: pg_ctl.c:2031 +#: pg_ctl.c:2028 #, c-format msgid "" "\n" @@ -790,37 +801,37 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2029 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: pg_ctl.c:2057 +#: pg_ctl.c:2054 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: modo de apagado «%s» no reconocido\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:2083 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: nombre de señal «%s» no reconocido\n" -#: pg_ctl.c:2103 +#: pg_ctl.c:2100 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: tipo de inicio «%s» no reconocido\n" -#: pg_ctl.c:2159 +#: pg_ctl.c:2156 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: no se pudo determinar el directorio de datos usando la orden «%s»\n" -#: pg_ctl.c:2182 +#: pg_ctl.c:2179 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: el archivo de control parece estar corrupto\n" -#: pg_ctl.c:2250 +#: pg_ctl.c:2247 #, c-format msgid "" "%s: cannot be run as root\n" @@ -831,32 +842,32 @@ msgstr "" "Por favor conéctese (usando, por ejemplo, «su») con un usuario no privilegiado,\n" "quien ejecutará el proceso servidor.\n" -#: pg_ctl.c:2333 +#: pg_ctl.c:2319 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: la opción -S no está soportada en esta plataforma\n" -#: pg_ctl.c:2370 -#, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: demasiados argumentos de línea de órdenes (el primero es «%s»)\n" - -#: pg_ctl.c:2396 +#: pg_ctl.c:2375 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: argumentos faltantes para envío de señal\n" -#: pg_ctl.c:2414 +#: pg_ctl.c:2393 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: modo de operación «%s» no reconocido\n" -#: pg_ctl.c:2424 +#: pg_ctl.c:2402 +#, c-format +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: demasiados argumentos de línea de órdenes (el primero es «%s»)\n" + +#: pg_ctl.c:2409 #, c-format msgid "%s: no operation specified\n" msgstr "%s: no se especificó operación\n" -#: pg_ctl.c:2445 +#: pg_ctl.c:2430 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "%s: no se especificó directorio de datos y la variable PGDATA no está definida\n" diff --git a/src/bin/pg_ctl/po/fr.po b/src/bin/pg_ctl/po/fr.po index f4c48563c0e12..ea31cdbc395f9 100644 --- a/src/bin/pg_ctl/po/fr.po +++ b/src/bin/pg_ctl/po/fr.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-24 03:48+0000\n" -"PO-Revision-Date: 2023-04-24 09:05+0200\n" +"POT-Creation-Date: 2024-08-22 10:19+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -21,43 +21,59 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: ../../common/exec.c:172 -#, fuzzy, c-format -#| msgid "invalid binary \"%s\"" +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "différence de l'ordre des octets" + +#: ../../common/exec.c:174 +#, c-format msgid "invalid binary \"%s\": %m" -msgstr "binaire « %s » invalide" +msgstr "binaire « %s » invalide : %m" -#: ../../common/exec.c:215 -#, fuzzy, c-format -#| msgid "could not read binary \"%s\"" +#: ../../common/exec.c:217 +#, c-format msgid "could not read binary \"%s\": %m" -msgstr "n'a pas pu lire le binaire « %s »" +msgstr "n'a pas pu lire le binaire « %s » : %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "n'a pas pu trouver un « %s » à exécuter" -#: ../../common/exec.c:250 -#, fuzzy, c-format -#| msgid "could not reopen file \"%s\" as stderr: %m" +#: ../../common/exec.c:252 +#, c-format msgid "could not resolve path \"%s\" to absolute form: %m" -msgstr "n'a pas pu ré-ouvrir le fichier « %s » comme stderr : %m" +msgstr "n'a pas pu résoudre le chemin « %s » en sa forme absolue : %m" + +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "n'a pas pu exécuter la commande « %s » : %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "n'a pas pu lire à partir de la commande « %s » : %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "aucune donnée n'a été renvoyée par la commande « %s »" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "échec de %s() : %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "mémoire épuisée" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 -#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 +#: ../../port/path.c:753 ../../port/path.c:790 ../../port/path.c:807 #, c-format msgid "out of memory\n" msgstr "mémoire épuisée\n" @@ -99,125 +115,125 @@ msgstr "le processus fils a quitté avec un statut %d non reconnu" #: ../../port/path.c:775 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "n'a pas pu obtenir le répertoire de travail : %s\n" +msgid "could not get current working directory: %m\n" +msgstr "n'a pas pu obtenir le répertoire de travail : %m\n" -#: pg_ctl.c:255 +#: pg_ctl.c:254 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s : le répertoire « %s » n'existe pas\n" -#: pg_ctl.c:258 +#: pg_ctl.c:257 #, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n" +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s : n'a pas pu accéder au répertoire « %s » : %m\n" -#: pg_ctl.c:271 +#: pg_ctl.c:270 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s : le répertoire « %s » n'est pas un répertoire d'instance\n" -#: pg_ctl.c:284 +#: pg_ctl.c:283 #, c-format -msgid "%s: could not open PID file \"%s\": %s\n" -msgstr "%s : n'a pas pu ouvrir le fichier de PID « %s » : %s\n" +msgid "%s: could not open PID file \"%s\": %m\n" +msgstr "%s : n'a pas pu ouvrir le fichier de PID « %s » : %m\n" -#: pg_ctl.c:293 +#: pg_ctl.c:292 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s : le fichier PID « %s » est vide\n" -#: pg_ctl.c:296 +#: pg_ctl.c:295 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s : données invalides dans le fichier de PID « %s »\n" -#: pg_ctl.c:458 pg_ctl.c:500 +#: pg_ctl.c:457 pg_ctl.c:499 #, c-format -msgid "%s: could not start server: %s\n" -msgstr "%s : n'a pas pu démarrer le serveur : %s\n" +msgid "%s: could not start server: %m\n" +msgstr "%s : n'a pas pu démarrer le serveur : %m\n" -#: pg_ctl.c:478 +#: pg_ctl.c:477 #, c-format -msgid "%s: could not start server due to setsid() failure: %s\n" -msgstr "%s : n'a pas pu démarrer le serveur à cause d'un échec de setsid() : %s\n" +msgid "%s: could not start server due to setsid() failure: %m\n" +msgstr "%s : n'a pas pu démarrer le serveur à cause d'un échec de setsid() : %m\n" -#: pg_ctl.c:548 +#: pg_ctl.c:547 #, c-format -msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n" +msgid "%s: could not open log file \"%s\": %m\n" +msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %m\n" -#: pg_ctl.c:565 +#: pg_ctl.c:564 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s : n'a pas pu démarrer le serveur : code d'erreur %lu\n" -#: pg_ctl.c:782 +#: pg_ctl.c:781 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" msgstr "" "%s : n'a pas pu initialiser la taille des fichiers core, ceci est interdit\n" "par une limite dure\n" -#: pg_ctl.c:808 +#: pg_ctl.c:807 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s : n'a pas pu lire le fichier « %s »\n" -#: pg_ctl.c:813 +#: pg_ctl.c:812 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s : le fichier d'options « %s » ne doit comporter qu'une seule ligne\n" -#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107 +#: pg_ctl.c:854 pg_ctl.c:1038 pg_ctl.c:1105 #, c-format -msgid "%s: could not send stop signal (PID: %d): %s\n" -msgstr "%s : n'a pas pu envoyer le signal d'arrêt (PID : %d) : %s\n" +msgid "%s: could not send stop signal (PID: %d): %m\n" +msgstr "%s : n'a pas pu envoyer le signal d'arrêt (PID : %d) : %m\n" -#: pg_ctl.c:883 +#: pg_ctl.c:882 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »\n" -#: pg_ctl.c:886 +#: pg_ctl.c:885 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s\n" -#: pg_ctl.c:918 +#: pg_ctl.c:917 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s : l'initialisation du système a échoué\n" -#: pg_ctl.c:933 +#: pg_ctl.c:932 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "" "%s : un autre serveur semble en cours d'exécution ; le démarrage du serveur\n" "va toutefois être tenté\n" -#: pg_ctl.c:981 +#: pg_ctl.c:980 msgid "waiting for server to start..." msgstr "en attente du démarrage du serveur..." -#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238 +#: pg_ctl.c:985 pg_ctl.c:1061 pg_ctl.c:1123 pg_ctl.c:1235 msgid " done\n" msgstr " effectué\n" -#: pg_ctl.c:987 +#: pg_ctl.c:986 msgid "server started\n" msgstr "serveur démarré\n" -#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243 +#: pg_ctl.c:989 pg_ctl.c:995 pg_ctl.c:1240 msgid " stopped waiting\n" msgstr " attente arrêtée\n" -#: pg_ctl.c:991 +#: pg_ctl.c:990 #, c-format msgid "%s: server did not start in time\n" msgstr "%s : le serveur ne s'est pas lancé à temps\n" -#: pg_ctl.c:997 +#: pg_ctl.c:996 #, c-format msgid "" "%s: could not start server\n" @@ -226,44 +242,44 @@ msgstr "" "%s : n'a pas pu démarrer le serveur\n" "Examinez le journal applicatif.\n" -#: pg_ctl.c:1005 +#: pg_ctl.c:1004 msgid "server starting\n" msgstr "serveur en cours de démarrage\n" -#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267 +#: pg_ctl.c:1023 pg_ctl.c:1081 pg_ctl.c:1144 pg_ctl.c:1183 pg_ctl.c:1264 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s : le fichier de PID « %s » n'existe pas\n" -#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268 +#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1145 pg_ctl.c:1184 pg_ctl.c:1265 msgid "Is server running?\n" msgstr "Le serveur est-il en cours d'exécution ?\n" -#: pg_ctl.c:1031 +#: pg_ctl.c:1030 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %d)\n" msgstr "" "%s : ne peut pas arrêter le serveur ; le serveur mono-utilisateur est en\n" "cours d'exécution (PID : %d)\n" -#: pg_ctl.c:1046 +#: pg_ctl.c:1044 msgid "server shutting down\n" msgstr "serveur en cours d'arrêt\n" -#: pg_ctl.c:1051 pg_ctl.c:1112 +#: pg_ctl.c:1049 pg_ctl.c:1109 msgid "waiting for server to shut down..." msgstr "en attente de l'arrêt du serveur..." -#: pg_ctl.c:1055 pg_ctl.c:1117 +#: pg_ctl.c:1053 pg_ctl.c:1114 msgid " failed\n" msgstr " a échoué\n" -#: pg_ctl.c:1057 pg_ctl.c:1119 +#: pg_ctl.c:1055 pg_ctl.c:1116 #, c-format msgid "%s: server does not shut down\n" msgstr "%s : le serveur ne s'est pas arrêté\n" -#: pg_ctl.c:1059 pg_ctl.c:1121 +#: pg_ctl.c:1057 pg_ctl.c:1118 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -271,243 +287,243 @@ msgstr "" "ASTUCE : l'option « -m fast » déconnecte immédiatement les sessions plutôt que\n" "d'attendre la déconnexion des sessions déjà présentes.\n" -#: pg_ctl.c:1065 pg_ctl.c:1127 +#: pg_ctl.c:1063 pg_ctl.c:1124 msgid "server stopped\n" msgstr "serveur arrêté\n" -#: pg_ctl.c:1086 +#: pg_ctl.c:1084 msgid "trying to start server anyway\n" msgstr "tentative de lancement du serveur malgré tout\n" -#: pg_ctl.c:1095 +#: pg_ctl.c:1093 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %d)\n" msgstr "" "%s : ne peut pas relancer le serveur ; le serveur mono-utilisateur est en\n" "cours d'exécution (PID : %d)\n" -#: pg_ctl.c:1098 pg_ctl.c:1157 +#: pg_ctl.c:1096 pg_ctl.c:1154 msgid "Please terminate the single-user server and try again.\n" msgstr "Merci d'arrêter le serveur mono-utilisateur et de réessayer.\n" -#: pg_ctl.c:1131 +#: pg_ctl.c:1128 #, c-format msgid "%s: old server process (PID: %d) seems to be gone\n" msgstr "%s : l'ancien processus serveur (PID : %d) semble être parti\n" -#: pg_ctl.c:1133 +#: pg_ctl.c:1130 msgid "starting server anyway\n" msgstr "lancement du serveur malgré tout\n" -#: pg_ctl.c:1154 +#: pg_ctl.c:1151 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %d)\n" msgstr "" "%s : ne peut pas recharger le serveur ; le serveur mono-utilisateur est en\n" "cours d'exécution (PID : %d)\n" -#: pg_ctl.c:1163 +#: pg_ctl.c:1160 #, c-format -msgid "%s: could not send reload signal (PID: %d): %s\n" -msgstr "%s : n'a pas pu envoyer le signal de rechargement (PID : %d) : %s\n" +msgid "%s: could not send reload signal (PID: %d): %m\n" +msgstr "%s : n'a pas pu envoyer le signal de rechargement (PID : %d) : %m\n" -#: pg_ctl.c:1168 +#: pg_ctl.c:1165 msgid "server signaled\n" msgstr "envoi d'un signal au serveur\n" -#: pg_ctl.c:1193 +#: pg_ctl.c:1190 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %d)\n" msgstr "" "%s : ne peut pas promouvoir le serveur ; le serveur mono-utilisateur est en\n" "cours d'exécution (PID : %d)\n" -#: pg_ctl.c:1201 +#: pg_ctl.c:1198 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s : ne peut pas promouvoir le serveur ; le serveur n'est pas en standby\n" -#: pg_ctl.c:1211 +#: pg_ctl.c:1208 #, c-format -msgid "%s: could not create promote signal file \"%s\": %s\n" -msgstr "%s : n'a pas pu créer le fichier « %s » signalant la promotion : %s\n" +msgid "%s: could not create promote signal file \"%s\": %m\n" +msgstr "%s : n'a pas pu créer le fichier « %s » signalant la promotion : %m\n" -#: pg_ctl.c:1217 +#: pg_ctl.c:1214 #, c-format -msgid "%s: could not write promote signal file \"%s\": %s\n" -msgstr "%s : n'a pas pu écrire le fichier « %s » signalant la promotion : %s\n" +msgid "%s: could not write promote signal file \"%s\": %m\n" +msgstr "%s : n'a pas pu écrire le fichier « %s » signalant la promotion : %m\n" -#: pg_ctl.c:1225 +#: pg_ctl.c:1222 #, c-format -msgid "%s: could not send promote signal (PID: %d): %s\n" -msgstr "%s : n'a pas pu envoyer le signal de promotion (PID : %d) : %s\n" +msgid "%s: could not send promote signal (PID: %d): %m\n" +msgstr "%s : n'a pas pu envoyer le signal de promotion (PID : %d) : %m\n" -#: pg_ctl.c:1228 +#: pg_ctl.c:1225 #, c-format -msgid "%s: could not remove promote signal file \"%s\": %s\n" -msgstr "%s : n'a pas pu supprimer le fichier « %s » signalant la promotion : %s\n" +msgid "%s: could not remove promote signal file \"%s\": %m\n" +msgstr "%s : n'a pas pu supprimer le fichier « %s » signalant la promotion : %m\n" -#: pg_ctl.c:1235 +#: pg_ctl.c:1232 msgid "waiting for server to promote..." msgstr "en attente du serveur à promouvoir..." -#: pg_ctl.c:1239 +#: pg_ctl.c:1236 msgid "server promoted\n" msgstr "serveur promu\n" -#: pg_ctl.c:1244 +#: pg_ctl.c:1241 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s : le serveur ne s'est pas promu à temps\n" -#: pg_ctl.c:1250 +#: pg_ctl.c:1247 msgid "server promoting\n" msgstr "serveur en cours de promotion\n" -#: pg_ctl.c:1274 +#: pg_ctl.c:1271 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n" msgstr "" "%s : ne peut pas faire une rotation de fichier de traces ; le serveur mono-utilisateur est en\n" "cours d'exécution (PID : %d)\n" -#: pg_ctl.c:1284 +#: pg_ctl.c:1281 #, c-format -msgid "%s: could not create log rotation signal file \"%s\": %s\n" -msgstr "%s : n'a pas pu créer le fichier « %s » de demande de rotation des fichiers de trace : %s\n" +msgid "%s: could not create log rotation signal file \"%s\": %m\n" +msgstr "%s : n'a pas pu créer le fichier « %s » de demande de rotation des fichiers de trace : %m\n" -#: pg_ctl.c:1290 +#: pg_ctl.c:1287 #, c-format -msgid "%s: could not write log rotation signal file \"%s\": %s\n" -msgstr "%s : n'a pas pu écrire le fichier « %s » de demande de rotation des fichiers de trace : %s\n" +msgid "%s: could not write log rotation signal file \"%s\": %m\n" +msgstr "%s : n'a pas pu écrire le fichier « %s » de demande de rotation des fichiers de trace : %m\n" -#: pg_ctl.c:1298 +#: pg_ctl.c:1295 #, c-format -msgid "%s: could not send log rotation signal (PID: %d): %s\n" -msgstr "%s : n'a pas pu envoyer le signal de rotation des fichiers de trace (PID : %d) : %s\n" +msgid "%s: could not send log rotation signal (PID: %d): %m\n" +msgstr "%s : n'a pas pu envoyer le signal de rotation des fichiers de trace (PID : %d) : %m\n" -#: pg_ctl.c:1301 +#: pg_ctl.c:1298 #, c-format -msgid "%s: could not remove log rotation signal file \"%s\": %s\n" -msgstr "%s : n'a pas pu supprimer le fichier « %s » signalant la demande de rotation des fichiers de trace : %s\n" +msgid "%s: could not remove log rotation signal file \"%s\": %m\n" +msgstr "%s : n'a pas pu supprimer le fichier « %s » signalant la demande de rotation des fichiers de trace : %m\n" -#: pg_ctl.c:1306 +#: pg_ctl.c:1303 msgid "server signaled to rotate log file\n" msgstr "envoi d'un signal au serveur pour faire une rotation des traces\n" -#: pg_ctl.c:1353 +#: pg_ctl.c:1350 #, c-format msgid "%s: single-user server is running (PID: %d)\n" msgstr "%s : le serveur mono-utilisateur est en cours d'exécution (PID : %d)\n" -#: pg_ctl.c:1367 +#: pg_ctl.c:1364 #, c-format msgid "%s: server is running (PID: %d)\n" msgstr "%s : le serveur est en cours d'exécution (PID : %d)\n" -#: pg_ctl.c:1383 +#: pg_ctl.c:1380 #, c-format msgid "%s: no server running\n" msgstr "%s : aucun serveur en cours d'exécution\n" -#: pg_ctl.c:1400 +#: pg_ctl.c:1397 #, c-format -msgid "%s: could not send signal %d (PID: %d): %s\n" -msgstr "%s : n'a pas pu envoyer le signal %d (PID : %d) : %s\n" +msgid "%s: could not send signal %d (PID: %d): %m\n" +msgstr "%s : n'a pas pu envoyer le signal %d (PID : %d) : %m\n" -#: pg_ctl.c:1431 +#: pg_ctl.c:1428 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s : n'a pas pu trouver l'exécutable du programme\n" -#: pg_ctl.c:1441 +#: pg_ctl.c:1438 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s : n'a pas pu trouver l'exécutable postgres\n" -#: pg_ctl.c:1511 pg_ctl.c:1545 +#: pg_ctl.c:1508 pg_ctl.c:1542 #, c-format msgid "%s: could not open service manager\n" msgstr "%s : n'a pas pu ouvrir le gestionnaire de services\n" -#: pg_ctl.c:1517 +#: pg_ctl.c:1514 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s : le service « %s » est déjà enregistré\n" -#: pg_ctl.c:1528 +#: pg_ctl.c:1525 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s : n'a pas pu enregistrer le service « %s » : code d'erreur %lu\n" -#: pg_ctl.c:1551 +#: pg_ctl.c:1548 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s : le service « %s » n'est pas enregistré\n" -#: pg_ctl.c:1558 +#: pg_ctl.c:1555 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s : n'a pas pu ouvrir le service « %s » : code d'erreur %lu\n" -#: pg_ctl.c:1567 +#: pg_ctl.c:1564 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s : n'a pas pu supprimer le service « %s » : code d'erreur %lu\n" -#: pg_ctl.c:1654 +#: pg_ctl.c:1651 msgid "Waiting for server startup...\n" msgstr "En attente du démarrage du serveur...\n" -#: pg_ctl.c:1657 +#: pg_ctl.c:1654 msgid "Timed out waiting for server startup\n" msgstr "Dépassement du délai pour le démarrage du serveur\n" -#: pg_ctl.c:1661 +#: pg_ctl.c:1658 msgid "Server started and accepting connections\n" msgstr "Serveur lancé et acceptant les connexions\n" -#: pg_ctl.c:1716 +#: pg_ctl.c:1713 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s : n'a pas pu démarrer le service « %s » : code d'erreur %lu\n" -#: pg_ctl.c:1789 +#: pg_ctl.c:1786 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n" -#: pg_ctl.c:1803 +#: pg_ctl.c:1800 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n" -#: pg_ctl.c:1829 +#: pg_ctl.c:1826 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n" -#: pg_ctl.c:1911 +#: pg_ctl.c:1908 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s : n'a pas pu obtenir les LUID pour les droits : code d'erreur %lu\n" -#: pg_ctl.c:1919 pg_ctl.c:1934 +#: pg_ctl.c:1916 pg_ctl.c:1931 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s : n'a pas pu obtenir l'information sur le jeton : code d'erreur %lu\n" -#: pg_ctl.c:1928 +#: pg_ctl.c:1925 #, c-format msgid "%s: out of memory\n" msgstr "%s : mémoire épuisée\n" -#: pg_ctl.c:1958 +#: pg_ctl.c:1955 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Essayer « %s --help » pour plus d'informations.\n" -#: pg_ctl.c:1966 +#: pg_ctl.c:1963 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" @@ -517,17 +533,17 @@ msgstr "" "PostgreSQL.\n" "\n" -#: pg_ctl.c:1967 +#: pg_ctl.c:1964 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_ctl.c:1968 +#: pg_ctl.c:1965 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D RÉP_DONNÉES] [-s] [-o OPTIONS]\n" -#: pg_ctl.c:1969 +#: pg_ctl.c:1966 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -536,12 +552,12 @@ msgstr "" " %s start [-D RÉP_DONNÉES] [-l FICHIER] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-p CHEMIN] [-c]\n" -#: pg_ctl.c:1971 +#: pg_ctl.c:1968 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D RÉP_DONNÉES] [-m MODE_ARRÊT] [-W] [-t SECS] [-s]\n" -#: pg_ctl.c:1972 +#: pg_ctl.c:1969 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -550,32 +566,32 @@ msgstr "" " %s restart [-D RÉP_DONNÉES] [-m MODE_ARRÊT] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-c]\n" -#: pg_ctl.c:1974 +#: pg_ctl.c:1971 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D RÉP_DONNÉES] [-s]\n" -#: pg_ctl.c:1975 +#: pg_ctl.c:1972 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D RÉP_DONNÉES]\n" -#: pg_ctl.c:1976 +#: pg_ctl.c:1973 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D RÉP_DONNÉES] [-W] [-t SECS] [-s]\n" -#: pg_ctl.c:1977 +#: pg_ctl.c:1974 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" -msgstr " %s reload [-D RÉP_DONNÉES] [-s]\n" +msgstr " %s logrotate [-D RÉP_DONNÉES] [-s]\n" -#: pg_ctl.c:1978 +#: pg_ctl.c:1975 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill NOM_SIGNAL PID\n" -#: pg_ctl.c:1980 +#: pg_ctl.c:1977 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" @@ -584,12 +600,12 @@ msgstr "" " %s register [-D RÉP_DONNÉES] [-N NOM_SERVICE] [-U NOM_UTILISATEUR] [-P MOT_DE_PASSE]\n" " [-S TYPE_DÉMARRAGE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" -#: pg_ctl.c:1982 +#: pg_ctl.c:1979 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N NOM_SERVICE]\n" -#: pg_ctl.c:1985 +#: pg_ctl.c:1982 #, c-format msgid "" "\n" @@ -598,58 +614,58 @@ msgstr "" "\n" "Options générales :\n" -#: pg_ctl.c:1986 +#: pg_ctl.c:1983 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata=RÉP_DONNÉES emplacement du répertoire des données de l'instance\n" -#: pg_ctl.c:1988 +#: pg_ctl.c:1985 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr "" " -e SOURCE source de l'événement pour la trace lors de\n" " l'exécution en tant que service\n" -#: pg_ctl.c:1990 +#: pg_ctl.c:1987 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr "" " -s, --silent affiche uniquement les erreurs, aucun message\n" " d'informations\n" -#: pg_ctl.c:1991 +#: pg_ctl.c:1988 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr "" " -t, --timeout=SECS durée en secondes à attendre lors de l'utilisation\n" " de l'option -w\n" -#: pg_ctl.c:1992 +#: pg_ctl.c:1989 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: pg_ctl.c:1993 +#: pg_ctl.c:1990 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait attend la fin de l'opération (par défaut)\n" -#: pg_ctl.c:1994 +#: pg_ctl.c:1991 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait n'attend pas la fin de l'opération\n" -#: pg_ctl.c:1995 +#: pg_ctl.c:1992 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_ctl.c:1996 +#: pg_ctl.c:1993 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "Si l'option -D est omise, la variable d'environnement PGDATA est utilisée.\n" -#: pg_ctl.c:1998 +#: pg_ctl.c:1995 #, c-format msgid "" "\n" @@ -658,22 +674,22 @@ msgstr "" "\n" "Options pour le démarrage ou le redémarrage :\n" -#: pg_ctl.c:2000 +#: pg_ctl.c:1997 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files autorise postgres à produire des fichiers core\n" -#: pg_ctl.c:2002 +#: pg_ctl.c:1999 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files non applicable à cette plateforme\n" -#: pg_ctl.c:2004 +#: pg_ctl.c:2001 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr " -l, --log=FICHIER écrit (ou ajoute) le journal du serveur dans FICHIER\n" -#: pg_ctl.c:2005 +#: pg_ctl.c:2002 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" @@ -683,12 +699,12 @@ msgstr "" " postgres (exécutable du serveur PostgreSQL)\n" " ou à initdb\n" -#: pg_ctl.c:2007 +#: pg_ctl.c:2004 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p CHEMIN_POSTGRES normalement pas nécessaire\n" -#: pg_ctl.c:2008 +#: pg_ctl.c:2005 #, c-format msgid "" "\n" @@ -697,14 +713,14 @@ msgstr "" "\n" "Options pour l'arrêt ou le redémarrage :\n" -#: pg_ctl.c:2009 +#: pg_ctl.c:2006 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr "" " -m, --mode=MODE MODE peut valoir « smart », « fast » ou\n" " « immediate »\n" -#: pg_ctl.c:2011 +#: pg_ctl.c:2008 #, c-format msgid "" "\n" @@ -713,24 +729,24 @@ msgstr "" "\n" "Les modes d'arrêt sont :\n" -#: pg_ctl.c:2012 +#: pg_ctl.c:2009 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart quitte après déconnexion de tous les clients\n" -#: pg_ctl.c:2013 +#: pg_ctl.c:2010 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast quitte directement, et arrête correctement (par défaut)\n" -#: pg_ctl.c:2014 +#: pg_ctl.c:2011 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr "" " immediate quitte sans arrêt complet ; entraîne une restauration au démarrage\n" " suivant\n" -#: pg_ctl.c:2016 +#: pg_ctl.c:2013 #, c-format msgid "" "\n" @@ -739,7 +755,7 @@ msgstr "" "\n" "Signaux autorisés pour kill :\n" -#: pg_ctl.c:2020 +#: pg_ctl.c:2017 #, c-format msgid "" "\n" @@ -748,35 +764,35 @@ msgstr "" "\n" "Options d'enregistrement ou de dés-enregistrement :\n" -#: pg_ctl.c:2021 +#: pg_ctl.c:2018 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr "" " -N NOM_SERVICE nom du service utilisé pour l'enregistrement du\n" " serveur PostgreSQL\n" -#: pg_ctl.c:2022 +#: pg_ctl.c:2019 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr "" " -P MOT_DE_PASSE mot de passe du compte utilisé pour\n" " l'enregistrement du serveur PostgreSQL\n" -#: pg_ctl.c:2023 +#: pg_ctl.c:2020 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr "" " -U NOM_UTILISATEUR nom de l'utilisateur du compte utilisé pour\n" " l'enregistrement du serveur PostgreSQL\n" -#: pg_ctl.c:2024 +#: pg_ctl.c:2021 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr "" " -S TYPE_DÉMARRAGE type de démarrage du service pour enregistrer le\n" " serveur PostgreSQL\n" -#: pg_ctl.c:2026 +#: pg_ctl.c:2023 #, c-format msgid "" "\n" @@ -785,19 +801,19 @@ msgstr "" "\n" "Les types de démarrage sont :\n" -#: pg_ctl.c:2027 +#: pg_ctl.c:2024 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr "" " auto démarre le service automatiquement lors du démarrage du système\n" " (par défaut)\n" -#: pg_ctl.c:2028 +#: pg_ctl.c:2025 #, c-format msgid " demand start service on demand\n" msgstr " demand démarre le service à la demande\n" -#: pg_ctl.c:2031 +#: pg_ctl.c:2028 #, c-format msgid "" "\n" @@ -806,37 +822,37 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2029 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" -#: pg_ctl.c:2057 +#: pg_ctl.c:2054 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s : mode d'arrêt non reconnu « %s »\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:2083 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s : signal non reconnu « %s »\n" -#: pg_ctl.c:2103 +#: pg_ctl.c:2100 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s : type de redémarrage « %s » non reconnu\n" -#: pg_ctl.c:2159 +#: pg_ctl.c:2156 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s : n'a pas déterminer le répertoire des données en utilisant la commande « %s »\n" -#: pg_ctl.c:2182 +#: pg_ctl.c:2179 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s : le fichier de contrôle semble corrompu\n" -#: pg_ctl.c:2250 +#: pg_ctl.c:2247 #, c-format msgid "" "%s: cannot be run as root\n" @@ -847,170 +863,34 @@ msgstr "" "Connectez-vous (par exemple en utilisant « su ») sous l'utilisateur (non\n" " privilégié) qui sera propriétaire du processus serveur.\n" -#: pg_ctl.c:2333 +#: pg_ctl.c:2319 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s : option -S non supportée sur cette plateforme\n" -#: pg_ctl.c:2370 -#, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" - -#: pg_ctl.c:2396 +#: pg_ctl.c:2375 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s : arguments manquant pour le mode kill\n" -#: pg_ctl.c:2414 +#: pg_ctl.c:2393 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s : mode d'opération « %s » non reconnu\n" -#: pg_ctl.c:2424 +#: pg_ctl.c:2402 +#, c-format +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" + +#: pg_ctl.c:2409 #, c-format msgid "%s: no operation specified\n" msgstr "%s : aucune opération indiquée\n" -#: pg_ctl.c:2445 +#: pg_ctl.c:2430 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "" "%s : aucun répertoire de bases de données indiqué et variable\n" "d'environnement PGDATA non initialisée\n" - -#~ msgid "" -#~ "\n" -#~ "%s: -w option cannot use a relative socket directory specification\n" -#~ msgstr "" -#~ "\n" -#~ "%s : l'option -w ne peut pas utiliser un chemin relatif vers le répertoire de\n" -#~ "la socket\n" - -#~ msgid "" -#~ "\n" -#~ "%s: -w option is not supported when starting a pre-9.1 server\n" -#~ msgstr "" -#~ "\n" -#~ "%s : l'option -w n'est pas supportée lors du démarrage d'un serveur pré-9.1\n" - -#~ msgid "" -#~ "\n" -#~ "%s: this data directory appears to be running a pre-existing postmaster\n" -#~ msgstr "" -#~ "\n" -#~ "%s : ce répertoire des données semble être utilisé par un postmaster déjà existant\n" - -#~ msgid "" -#~ "\n" -#~ "Options for stop, restart, or promote:\n" -#~ msgstr "" -#~ "\n" -#~ "Options pour l'arrêt, le redémarrage ou la promotion :\n" - -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" - -#~ msgid " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n" -#~ msgstr "" -#~ " %s start [-w] [-t SECS] [-D RÉP_DONNÉES] [-s] [-l NOM_FICHIER]\n" -#~ " [-o \"OPTIONS\"]\n" - -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide et quitte\n" - -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version et quitte\n" - -#~ msgid "" -#~ "%s is a utility to start, stop, restart, reload configuration files,\n" -#~ "report the status of a PostgreSQL server, or signal a PostgreSQL process.\n" -#~ "\n" -#~ msgstr "" -#~ "%s est un outil qui permet de démarrer, arrêter, redémarrer, recharger les\n" -#~ "les fichiers de configuration, rapporter le statut d'un serveur PostgreSQL\n" -#~ "ou d'envoyer un signal à un processus PostgreSQL\n" -#~ "\n" - -#~ msgid "%s: could not create log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu créer le fichier de traces « %s » : %s\n" - -#~ msgid "%s: could not open process token: %lu\n" -#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : %lu\n" - -#~ msgid "%s: could not start server: exit code was %d\n" -#~ msgstr "%s : n'a pas pu démarrer le serveur : le code de sortie est %d\n" - -#~ msgid "%s: could not wait for server because of misconfiguration\n" -#~ msgstr "%s : n'a pas pu attendre le serveur à cause d'une mauvaise configuration\n" - -#~ msgid "" -#~ "(The default is to wait for shutdown, but not for start or restart.)\n" -#~ "\n" -#~ msgstr "" -#~ "(Le comportement par défaut attend l'arrêt, pas le démarrage ou le\n" -#~ "redémarrage.)\n" -#~ "\n" - -#, c-format -#~ msgid "" -#~ "The program \"%s\" is needed by %s but was not found in the\n" -#~ "same directory as \"%s\".\n" -#~ "Check your installation.\n" -#~ msgstr "" -#~ "Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n" -#~ "dans le même répertoire que « %s ».\n" -#~ "Vérifiez votre installation.\n" - -#, c-format -#~ msgid "" -#~ "The program \"%s\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation.\n" -#~ msgstr "" -#~ "Le programme « %s » a été trouvé par « %s »\n" -#~ "mais n'est pas de la même version que %s.\n" -#~ "Vérifiez votre installation.\n" - -#~ msgid "" -#~ "WARNING: online backup mode is active\n" -#~ "Shutdown will not complete until pg_stop_backup() is called.\n" -#~ "\n" -#~ msgstr "" -#~ "ATTENTION : le mode de sauvegarde en ligne est activé.\n" -#~ "L'arrêt ne surviendra qu'au moment où pg_stop_backup() sera appelé.\n" -#~ "\n" - -#~ msgid "child process was terminated by signal %s" -#~ msgstr "le processus fils a été terminé par le signal %s" - -#~ msgid "could not change directory to \"%s\"" -#~ msgstr "n'a pas pu accéder au répertoire « %s »" - -#, c-format -#~ msgid "could not change directory to \"%s\": %m" -#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %m" - -#~ msgid "could not change directory to \"%s\": %s" -#~ msgstr "n'a pas pu modifier le répertoire par « %s » : %s" - -#, c-format -#~ msgid "could not identify current directory: %m" -#~ msgstr "n'a pas pu identifier le répertoire courant : %m" - -#~ msgid "could not read symbolic link \"%s\"" -#~ msgstr "n'a pas pu lire le lien symbolique « %s »" - -#, c-format -#~ msgid "could not read symbolic link \"%s\": %m" -#~ msgstr "n'a pas pu lire le lien symbolique « %s » : %m" - -#~ msgid "pclose failed: %m" -#~ msgstr "échec de pclose : %m" - -#~ msgid "server is still starting up\n" -#~ msgstr "le serveur est toujours en cours de démarrage\n" diff --git a/src/bin/pg_ctl/po/it.po b/src/bin/pg_ctl/po/it.po index 72c4ae4c35554..07a0688d13121 100644 --- a/src/bin/pg_ctl/po/it.po +++ b/src/bin/pg_ctl/po/it.po @@ -18,7 +18,7 @@ msgstr "" "Project-Id-Version: pg_ctl (PostgreSQL) 11\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2023-04-24 03:48+0000\n" -"PO-Revision-Date: 2023-04-24 09:05+0200\n" +"PO-Revision-Date: 2023-09-05 08:14+0200\n" "Last-Translator: Domenico Sgarbossa \n" "Language-Team: https://github.com/dvarrazzo/postgresql-it\n" "Language: it\n" @@ -522,9 +522,8 @@ msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-p PATH] [-c]\n" msgstr "" -" %s inizio [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" +" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" " [-o OPZIONI] [-p PERCORSO] [-c]\n" -"\n" #: pg_ctl.c:1971 #, c-format @@ -537,33 +536,33 @@ msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-c]\n" msgstr "" -" %s riavvia [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" +" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" " [-o OPZIONI] [-c]\n" #: pg_ctl.c:1974 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" -msgstr " %s ricarica [-D DATADIR] [-s]\n" +msgstr " %s reload [-D DATADIR] [-s]\n" #: pg_ctl.c:1975 #, c-format msgid " %s status [-D DATADIR]\n" -msgstr " Stato %s [-D DATADIR]\n" +msgstr " %s status [-D DATADIR]\n" #: pg_ctl.c:1976 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" -msgstr " %s promuovono [-D DATADIR] [-W] [-t SECS] [-s]\n" +msgstr " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" #: pg_ctl.c:1977 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" -msgstr " %s logrotate [-D DATADIR] [-s]\n" +msgstr " %s logrotate [-D DATADIR] [-s]\n" #: pg_ctl.c:1978 #, c-format msgid " %s kill SIGNALNAME PID\n" -msgstr " %s elimina SIGNALNAME PID\n" +msgstr " %s kill SIGNALNAME PID\n" #: pg_ctl.c:1980 #, c-format @@ -571,7 +570,7 @@ msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" " [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" msgstr "" -" %s registra [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" +" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" " [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" #: pg_ctl.c:1982 diff --git a/src/bin/pg_ctl/po/ja.po b/src/bin/pg_ctl/po/ja.po index 28a354604b14a..77c2d6ba2f16c 100644 --- a/src/bin/pg_ctl/po/ja.po +++ b/src/bin/pg_ctl/po/ja.po @@ -1,7 +1,7 @@ # pg_ctl.po # Japanese message translation file for pg_ctl # -# Copyright (C) 2005-2022 PostgreSQL Global Development Group +# Copyright (C) 2005-2024 PostgreSQL Global Development Group # # Shigehiro Honda , 2005. # @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_ctl (PostgreSQL 16)\n" +"Project-Id-Version: pg_ctl (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-03-24 09:21+0900\n" -"PO-Revision-Date: 2023-03-24 14:11+0900\n" +"POT-Creation-Date: 2024-07-19 09:21+0900\n" +"PO-Revision-Date: 2024-07-19 09:52+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -22,38 +22,57 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../common/exec.c:172 +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒåˆã£ã¦ã„ã¾ã›ã‚“" + +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "䏿­£ãªãƒã‚¤ãƒŠãƒª\"%s\": %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "ãƒã‚¤ãƒŠãƒª\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "実行ã™ã‚‹\"%s\"ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "パス\"%s\"を絶対パス形å¼ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "コマンド\"%s\"を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "コマンド\"%s\"ã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "コマンド\"%s\"ãŒãƒ‡ãƒ¼ã‚¿ã‚’è¿”å´ã—ã¾ã›ã‚“ã§ã—ãŸ" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "メモリä¸è¶³ã§ã™" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 -#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 +#: ../../port/path.c:753 ../../port/path.c:790 ../../port/path.c:807 #, c-format msgid "out of memory\n" msgstr "メモリä¸è¶³ã§ã™\n" @@ -95,8 +114,8 @@ msgstr "å­ãƒ—ãƒ­ã‚»ã‚¹ãŒæœªçŸ¥ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹%dã§çµ‚了ã—ã¾ã—ãŸ" #: ../../port/path.c:775 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "ç¾åœ¨ã®ä½œæ¥­ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "ç¾åœ¨ã®ä½œæ¥­ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" #: pg_ctl.c:255 #, c-format @@ -105,8 +124,8 @@ msgstr "%s: ディレクトリ \"%s\" ã¯å­˜åœ¨ã—ã¾ã›ã‚“\n" #: pg_ctl.c:258 #, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" #: pg_ctl.c:271 #, c-format @@ -115,8 +134,8 @@ msgstr "%s: ディレクトリ\"%s\"ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¯ãƒ©ã‚¹ã‚¿ãƒ‡ã‚£ãƒ¬ #: pg_ctl.c:284 #, c-format -msgid "%s: could not open PID file \"%s\": %s\n" -msgstr "%s: PIDファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "%s: could not open PID file \"%s\": %m\n" +msgstr "%s: PIDファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" #: pg_ctl.c:293 #, c-format @@ -130,86 +149,90 @@ msgstr "%s: PIDファイル\"%s\"内ã«ç„¡åйãªãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã™\n" #: pg_ctl.c:458 pg_ctl.c:500 #, c-format -msgid "%s: could not start server: %s\n" -msgstr "%s: サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "%s: could not start server: %m\n" +msgstr "%s: サーãƒãƒ¼ã‚’èµ·å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" #: pg_ctl.c:478 #, c-format -msgid "%s: could not start server due to setsid() failure: %s\n" -msgstr "%s: setsid()ã«å¤±æ•—ã—ãŸãŸã‚サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "%s: could not start server due to setsid() failure: %m\n" +msgstr "%s: setsid()ã«å¤±æ•—ã—ãŸãŸã‚サーãƒãƒ¼ã‚’èµ·å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" #: pg_ctl.c:548 #, c-format -msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s: ログファイル \"%s\" をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "%s: could not open log file \"%s\": %m\n" +msgstr "%s: ログファイル \"%s\" をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" #: pg_ctl.c:565 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s: サーãƒãƒ¼ã®èµ·å‹•ã«å¤±æ•—ã—ã¾ã—ãŸ: エラーコード %lu\n" -#: pg_ctl.c:782 +#: pg_ctl.c:789 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" msgstr "%s: コアファイルã®ã‚µã‚¤ã‚ºåˆ¶é™ã‚’設定ã§ãã¾ã›ã‚“:固定ã®åˆ¶é™ã«ã‚ˆã‚Šè¨±ã•れã¦ã„ã¾ã›ã‚“\n" -#: pg_ctl.c:808 +#: pg_ctl.c:815 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s: ファイル\"%s\"を読ã¿å–ã‚‹ã“ã¨ã«å¤±æ•—ã—ã¾ã—ãŸ\n" -#: pg_ctl.c:813 +#: pg_ctl.c:820 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: オプションファイル\"%s\"ã¯1行ã®ã¿ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“\n" -#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107 +#: pg_ctl.c:862 pg_ctl.c:1050 pg_ctl.c:1117 #, c-format -msgid "%s: could not send stop signal (PID: %d): %s\n" -msgstr "%s: åœæ­¢ã‚·ã‚°ãƒŠãƒ«ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚(PID: %d): %s\n" +msgid "%s: could not send stop signal (PID: %d): %m\n" +msgstr "%s: åœæ­¢ã‚·ã‚°ãƒŠãƒ«ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚(PID: %d): %m\n" -#: pg_ctl.c:883 +#: pg_ctl.c:890 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" msgstr "%2$sã«ã¯ãƒ—ログラム\"%1$s\"ãŒå¿…è¦ã§ã™ãŒã€\"%3$s\"ã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚りã¾ã›ã‚“ã§ã—ãŸ\n" -#: pg_ctl.c:886 +#: pg_ctl.c:893 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" msgstr "\"%2$s\"ãŒãƒ—ログラム\"%1$s\"を見ã¤ã‘ã¾ã—ãŸãŒã€ã“れã¯%3$sã¨åŒã˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸ\n" -#: pg_ctl.c:918 +#: pg_ctl.c:925 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s: データベースシステムãŒåˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ\n" -#: pg_ctl.c:933 +#: pg_ctl.c:940 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "%s: ä»–ã®ã‚µãƒ¼ãƒãƒ¼ãŒå‹•作中ã®å¯èƒ½æ€§ãŒã‚りã¾ã™ãŒã€ã¨ã«ã‹ãpostmasterã®èµ·å‹•を試ã¿ã¾ã™ã€‚\n" -#: pg_ctl.c:981 +#: pg_ctl.c:988 msgid "waiting for server to start..." msgstr "サーãƒãƒ¼ã®èµ·å‹•完了を待ã£ã¦ã„ã¾ã™..." -#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238 +#: pg_ctl.c:993 pg_ctl.c:1003 pg_ctl.c:1073 pg_ctl.c:1135 pg_ctl.c:1247 msgid " done\n" msgstr "完了\n" -#: pg_ctl.c:987 +#: pg_ctl.c:994 msgid "server started\n" msgstr "サーãƒãƒ¼èµ·å‹•完了\n" -#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243 +#: pg_ctl.c:997 pg_ctl.c:1007 pg_ctl.c:1252 msgid " stopped waiting\n" msgstr " 待機処ç†ãŒåœæ­¢ã•れã¾ã—ãŸ\n" -#: pg_ctl.c:991 +#: pg_ctl.c:998 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: サーãƒãƒ¼ã¯æ™‚間内ã«èµ·å‹•ã—ã¾ã›ã‚“ã§ã—ãŸ\n" -#: pg_ctl.c:997 +#: pg_ctl.c:1004 +msgid "server shut down because of recovery target settings\n" +msgstr "リカãƒãƒªç›®æ¨™è¨­å®šã«ã‚ˆã‚Šã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã—ã¾ã—ãŸ\n" + +#: pg_ctl.c:1008 #, c-format msgid "" "%s: could not start server\n" @@ -218,42 +241,42 @@ msgstr "" "%s: サーãƒãƒ¼ã‚’èµ·å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚\n" "ログ出力を確èªã—ã¦ãã ã•ã„。\n" -#: pg_ctl.c:1005 +#: pg_ctl.c:1016 msgid "server starting\n" msgstr "サーãƒãƒ¼ã¯èµ·å‹•中ã§ã™ã€‚\n" -#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267 +#: pg_ctl.c:1035 pg_ctl.c:1093 pg_ctl.c:1156 pg_ctl.c:1195 pg_ctl.c:1276 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: PIDファイル\"%s\"ãŒã‚りã¾ã›ã‚“\n" -#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268 +#: pg_ctl.c:1036 pg_ctl.c:1095 pg_ctl.c:1157 pg_ctl.c:1196 pg_ctl.c:1277 msgid "Is server running?\n" msgstr "サーãƒãƒ¼ãŒå‹•作ã—ã¦ã„ã¾ã™ã‹?\n" -#: pg_ctl.c:1031 +#: pg_ctl.c:1042 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %d)\n" msgstr "%s: サーãƒãƒ¼ã‚’åœæ­¢ã§ãã¾ã›ã‚“。シングルユーザーサーãƒãƒ¼(PID: %d)ãŒå‹•作ã—ã¦ã„ã¾ã™ã€‚\n" -#: pg_ctl.c:1046 +#: pg_ctl.c:1056 msgid "server shutting down\n" msgstr "サーãƒãƒ¼ã®åœæ­¢ä¸­ã§ã™\n" -#: pg_ctl.c:1051 pg_ctl.c:1112 +#: pg_ctl.c:1061 pg_ctl.c:1121 msgid "waiting for server to shut down..." msgstr "サーãƒãƒ¼åœæ­¢å‡¦ç†ã®å®Œäº†ã‚’å¾…ã£ã¦ã„ã¾ã™..." -#: pg_ctl.c:1055 pg_ctl.c:1117 +#: pg_ctl.c:1065 pg_ctl.c:1126 msgid " failed\n" msgstr "失敗ã—ã¾ã—ãŸ\n" -#: pg_ctl.c:1057 pg_ctl.c:1119 +#: pg_ctl.c:1067 pg_ctl.c:1128 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: サーãƒãƒ¼ã¯åœæ­¢ã—ã¦ã„ã¾ã›ã‚“\n" -#: pg_ctl.c:1059 pg_ctl.c:1121 +#: pg_ctl.c:1069 pg_ctl.c:1130 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -261,252 +284,252 @@ msgstr "" "ヒント: \"-m fast\"オプションã¯ã€ã‚»ãƒƒã‚·ãƒ§ãƒ³åˆ‡æ–­ãŒå§‹ã¾ã‚‹ã¾ã§å¾…機ã™ã‚‹ã®ã§ã¯ãªã\n" "å³åº§ã«ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’切断ã—ã¾ã™ã€‚\n" -#: pg_ctl.c:1065 pg_ctl.c:1127 +#: pg_ctl.c:1075 pg_ctl.c:1136 msgid "server stopped\n" msgstr "サーãƒãƒ¼ã¯åœæ­¢ã—ã¾ã—ãŸ\n" -#: pg_ctl.c:1086 +#: pg_ctl.c:1096 msgid "trying to start server anyway\n" msgstr "ã¨ã«ã‹ãサーãƒãƒ¼ã®èµ·å‹•を試ã¿ã¾ã™\n" -#: pg_ctl.c:1095 +#: pg_ctl.c:1105 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %d)\n" msgstr "%s: サーãƒãƒ¼ã‚’å†èµ·å‹•ã§ãã¾ã›ã‚“。シングルユーザーサーãƒãƒ¼(PID: %d)ãŒå‹•作中ã§ã™ã€‚\n" -#: pg_ctl.c:1098 pg_ctl.c:1157 +#: pg_ctl.c:1108 pg_ctl.c:1166 msgid "Please terminate the single-user server and try again.\n" msgstr "シングルユーザーサーãƒãƒ¼ã‚’終了ã•ã›ã¦ã‹ã‚‰ã€å†åº¦å®Ÿè¡Œã—ã¦ãã ã•ã„\n" -#: pg_ctl.c:1131 +#: pg_ctl.c:1140 #, c-format msgid "%s: old server process (PID: %d) seems to be gone\n" msgstr "%s: å¤ã„サーãƒãƒ¼ãƒ—ロセス(PID: %d)ãŒå‹•作ã—ã¦ã„ãªã„よã†ã§ã™\n" -#: pg_ctl.c:1133 +#: pg_ctl.c:1142 msgid "starting server anyway\n" msgstr "ã¨ã«ã‹ãサーãƒãƒ¼ã‚’èµ·å‹•ã—ã¦ã„ã¾ã™\n" -#: pg_ctl.c:1154 +#: pg_ctl.c:1163 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %d)\n" msgstr "%s: サーãƒãƒ¼ã‚’リロードã§ãã¾ã›ã‚“。シングルユーザーサーãƒãƒ¼(PID: %d)ãŒå‹•作中ã§ã™\n" -#: pg_ctl.c:1163 +#: pg_ctl.c:1172 #, c-format -msgid "%s: could not send reload signal (PID: %d): %s\n" -msgstr "%s: リロードシグナルをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚(PID: %d): %s\n" +msgid "%s: could not send reload signal (PID: %d): %m\n" +msgstr "%s: リロードシグナルをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚(PID: %d): %m\n" -#: pg_ctl.c:1168 +#: pg_ctl.c:1177 msgid "server signaled\n" msgstr "サーãƒãƒ¼ã«ã‚·ã‚°ãƒŠãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸ\n" -#: pg_ctl.c:1193 +#: pg_ctl.c:1202 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %d)\n" msgstr "%s: サーãƒãƒ¼ã‚’昇格ã§ãã¾ã›ã‚“; シングルユーザーサーãƒãƒ¼(PID: %d)ãŒå‹•作中ã§ã™\n" -#: pg_ctl.c:1201 +#: pg_ctl.c:1210 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s: サーãƒãƒ¼ã‚’昇格ã§ãã¾ã›ã‚“; サーãƒãƒ¼ã¯ã‚¹ã‚¿ãƒ³ãƒã‚¤ãƒ¢ãƒ¼ãƒ‰ã§ã¯ã‚りã¾ã›ã‚“\n" -#: pg_ctl.c:1211 +#: pg_ctl.c:1220 #, c-format -msgid "%s: could not create promote signal file \"%s\": %s\n" -msgstr "%s: 昇格指示ファイル\"%s\"を作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "%s: could not create promote signal file \"%s\": %m\n" +msgstr "%s: 昇格指示ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" -#: pg_ctl.c:1217 +#: pg_ctl.c:1226 #, c-format -msgid "%s: could not write promote signal file \"%s\": %s\n" -msgstr "%s: 昇格指示ファイル\"%s\"ã«æ›¸ã出ã™ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "%s: could not write promote signal file \"%s\": %m\n" +msgstr "%s: 昇格指示ファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m\n" -#: pg_ctl.c:1225 +#: pg_ctl.c:1234 #, c-format -msgid "%s: could not send promote signal (PID: %d): %s\n" -msgstr "%s: 昇格シグナルをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—㟠(PID: %d): %s\n" +msgid "%s: could not send promote signal (PID: %d): %m\n" +msgstr "%s: 昇格シグナルをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—㟠(PID: %d): %m\n" -#: pg_ctl.c:1228 +#: pg_ctl.c:1237 #, c-format -msgid "%s: could not remove promote signal file \"%s\": %s\n" -msgstr "%s: 昇格指示ファイル\"%s\"ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n" +msgid "%s: could not remove promote signal file \"%s\": %m\n" +msgstr "%s: 昇格指示ファイル\"%s\"ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %m\n" -#: pg_ctl.c:1235 +#: pg_ctl.c:1244 msgid "waiting for server to promote..." msgstr "サーãƒãƒ¼ã®æ˜‡æ ¼ã‚’å¾…ã£ã¦ã„ã¾ã™..." -#: pg_ctl.c:1239 +#: pg_ctl.c:1248 msgid "server promoted\n" msgstr "サーãƒãƒ¼ã¯æ˜‡æ ¼ã—ã¾ã—ãŸ\n" -#: pg_ctl.c:1244 +#: pg_ctl.c:1253 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: サーãƒãƒ¼ã¯æ™‚é–“å†…ã«æ˜‡æ ¼ã—ã¾ã›ã‚“ã§ã—ãŸ\n" -#: pg_ctl.c:1250 +#: pg_ctl.c:1259 msgid "server promoting\n" msgstr "サーãƒãƒ¼ã‚’昇格中ã§ã™\n" -#: pg_ctl.c:1274 +#: pg_ctl.c:1283 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n" msgstr "%s: ログをローテートã§ãã¾ã›ã‚“; シングルユーザーサーãƒãƒ¼ãŒå‹•作中ã§ã™ (PID: %d)\n" -#: pg_ctl.c:1284 +#: pg_ctl.c:1293 #, c-format -msgid "%s: could not create log rotation signal file \"%s\": %s\n" -msgstr "%s: ログローテート指示ファイル\"%s\"を作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "%s: could not create log rotation signal file \"%s\": %m\n" +msgstr "%s: ログローテート指示ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" -#: pg_ctl.c:1290 +#: pg_ctl.c:1299 #, c-format -msgid "%s: could not write log rotation signal file \"%s\": %s\n" -msgstr "%s: ログローテート指示ファイル\"%s\"ã«æ›¸ã出ã™ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" +msgid "%s: could not write log rotation signal file \"%s\": %m\n" +msgstr "%s: ログローテート指示ファイル\"%s\"ã«æ›¸ãè¾¼ã‚ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" -#: pg_ctl.c:1298 +#: pg_ctl.c:1307 #, c-format -msgid "%s: could not send log rotation signal (PID: %d): %s\n" -msgstr "%s: ログローテートシグナルをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—㟠(PID: %d): %s\n" +msgid "%s: could not send log rotation signal (PID: %d): %m\n" +msgstr "%s: ログローテートシグナルをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—㟠(PID: %d): %m\n" -#: pg_ctl.c:1301 +#: pg_ctl.c:1310 #, c-format -msgid "%s: could not remove log rotation signal file \"%s\": %s\n" -msgstr "%s: ログローテーション指示ファイル\"%s\"ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %s\n" +msgid "%s: could not remove log rotation signal file \"%s\": %m\n" +msgstr "%s: ログローテート指示ファイル\"%s\"ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %m\n" -#: pg_ctl.c:1306 +#: pg_ctl.c:1315 msgid "server signaled to rotate log file\n" msgstr "サーãƒãƒ¼ãŒãƒ­ã‚°ãƒ­ãƒ¼ãƒ†ãƒ¼ãƒˆã‚’シグナルã•れã¾ã—ãŸ\n" -#: pg_ctl.c:1353 +#: pg_ctl.c:1362 #, c-format msgid "%s: single-user server is running (PID: %d)\n" msgstr "%s: シングルユーザーサーãƒãƒ¼ãŒå‹•作中ã§ã™(PID: %d)\n" -#: pg_ctl.c:1367 +#: pg_ctl.c:1376 #, c-format msgid "%s: server is running (PID: %d)\n" msgstr "%s: サーãƒãƒ¼ãŒå‹•作中ã§ã™(PID: %d)\n" -#: pg_ctl.c:1383 +#: pg_ctl.c:1392 #, c-format msgid "%s: no server running\n" msgstr "%s: サーãƒãƒ¼ãŒå‹•作ã—ã¦ã„ã¾ã›ã‚“\n" -#: pg_ctl.c:1400 +#: pg_ctl.c:1409 #, c-format -msgid "%s: could not send signal %d (PID: %d): %s\n" -msgstr "%s: シグナル%dã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ(PID: %d): %s\n" +msgid "%s: could not send signal %d (PID: %d): %m\n" +msgstr "%s: シグナル%dã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ(PID: %d): %m\n" -#: pg_ctl.c:1431 +#: pg_ctl.c:1440 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: 本プログラムã®å®Ÿè¡Œãƒ•ã‚¡ã‚¤ãƒ«ã®æ¤œç´¢ã«å¤±æ•—ã—ã¾ã—ãŸ\n" -#: pg_ctl.c:1441 +#: pg_ctl.c:1450 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: postgres ã®å®Ÿè¡Œãƒ•ァイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n" -#: pg_ctl.c:1511 pg_ctl.c:1545 +#: pg_ctl.c:1520 pg_ctl.c:1554 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: サービスマãƒãƒ¼ã‚¸ãƒ£ã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸ\n" -#: pg_ctl.c:1517 +#: pg_ctl.c:1526 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: サービス\\\"%s\\\"ã¯ç™»éŒ²æ¸ˆã¿ã§ã™\n" -#: pg_ctl.c:1528 +#: pg_ctl.c:1537 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: サービス\"%s\"ã®ç™»éŒ²ã«å¤±æ•—ã—ã¾ã—ãŸ: エラーコード %lu\n" -#: pg_ctl.c:1551 +#: pg_ctl.c:1560 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: サービス\"%s\"ã¯ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“\n" -#: pg_ctl.c:1558 +#: pg_ctl.c:1567 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: サービス\"%s\"ã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸ: エラーコード %lu\n" -#: pg_ctl.c:1567 +#: pg_ctl.c:1576 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: サービス\"%s\"ã®ç™»éŒ²å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: エラーコード %lu\n" -#: pg_ctl.c:1654 +#: pg_ctl.c:1663 msgid "Waiting for server startup...\n" msgstr "サーãƒãƒ¼ã®èµ·å‹•完了を待ã£ã¦ã„ã¾ã™...\n" -#: pg_ctl.c:1657 +#: pg_ctl.c:1666 msgid "Timed out waiting for server startup\n" msgstr "サーãƒãƒ¼ã®èµ·å‹•待機ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ\n" -#: pg_ctl.c:1661 +#: pg_ctl.c:1670 msgid "Server started and accepting connections\n" msgstr "サーãƒãƒ¼ã¯èµ·å‹•ã—ã€æŽ¥ç¶šã‚’å—ã‘付ã‘ã¦ã„ã¾ã™\n" -#: pg_ctl.c:1716 +#: pg_ctl.c:1725 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: サービス\"%s\"ã®èµ·å‹•ã«å¤±æ•—ã—ã¾ã—ãŸ: エラーコード %lu\n" -#: pg_ctl.c:1789 +#: pg_ctl.c:1798 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: プロセストークンをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu\n" -#: pg_ctl.c:1803 +#: pg_ctl.c:1812 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: SIDを割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu\n" -#: pg_ctl.c:1829 +#: pg_ctl.c:1838 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: 制é™ä»˜ãトークンを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu\n" -#: pg_ctl.c:1911 +#: pg_ctl.c:1920 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: 権é™ã® LUID ã‚’å–å¾—ã§ãã¾ã›ã‚“: エラーコード %lu\n" -#: pg_ctl.c:1919 pg_ctl.c:1934 +#: pg_ctl.c:1928 pg_ctl.c:1943 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: トークン情報をå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu\n" -#: pg_ctl.c:1928 +#: pg_ctl.c:1937 #, c-format msgid "%s: out of memory\n" msgstr "%s: メモリä¸è¶³ã§ã™\n" -#: pg_ctl.c:1958 +#: pg_ctl.c:1967 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。\n" -#: pg_ctl.c:1966 +#: pg_ctl.c:1975 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" "\n" msgstr "%sã¯PostgreSQLサーãƒãƒ¼ã®åˆæœŸåŒ–ã€èµ·å‹•ã€åœæ­¢ã€åˆ¶å¾¡ã‚’行ã†ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã§ã™ã€‚\n" -#: pg_ctl.c:1967 +#: pg_ctl.c:1976 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_ctl.c:1968 +#: pg_ctl.c:1977 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" -#: pg_ctl.c:1969 +#: pg_ctl.c:1978 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -515,12 +538,12 @@ msgstr "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-p PATH] [-c]\n" -#: pg_ctl.c:1971 +#: pg_ctl.c:1980 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" -#: pg_ctl.c:1972 +#: pg_ctl.c:1981 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -529,32 +552,32 @@ msgstr "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-c]\n" -#: pg_ctl.c:1974 +#: pg_ctl.c:1983 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D DATADIR] [-s]\n" -#: pg_ctl.c:1975 +#: pg_ctl.c:1984 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D DATADIR]\n" -#: pg_ctl.c:1976 +#: pg_ctl.c:1985 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" -#: pg_ctl.c:1977 +#: pg_ctl.c:1986 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D DATADIR] [-s]\n" -#: pg_ctl.c:1978 +#: pg_ctl.c:1987 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill SIGNALNAME PID\n" -#: pg_ctl.c:1980 +#: pg_ctl.c:1989 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" @@ -563,12 +586,12 @@ msgstr "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" " [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" -#: pg_ctl.c:1982 +#: pg_ctl.c:1991 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N SERVICENAME]\n" -#: pg_ctl.c:1985 +#: pg_ctl.c:1994 #, c-format msgid "" "\n" @@ -577,52 +600,52 @@ msgstr "" "\n" "共通ã®ã‚ªãƒ—ション:\n" -#: pg_ctl.c:1986 +#: pg_ctl.c:1995 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata=DATADIR データベース格ç´é ˜åŸŸã®å ´æ‰€\n" -#: pg_ctl.c:1988 +#: pg_ctl.c:1997 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr " -e SOURCE サービスã¨ã—ã¦èµ·å‹•ã•ã›ãŸã¨ãã®ãƒ­ã‚°ã®ã‚¤ãƒ™ãƒ³ãƒˆã‚½ãƒ¼ã‚¹\n" -#: pg_ctl.c:1990 +#: pg_ctl.c:1999 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr " -s, --silent エラーメッセージã®ã¿ã‚’è¡¨ç¤ºã€æƒ…報メッセージã¯è¡¨ç¤ºã—ãªã„\n" -#: pg_ctl.c:1991 +#: pg_ctl.c:2000 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr " -t, --timeout=SECS -wオプションを使用ã™ã‚‹æ™‚ã«å¾…機ã™ã‚‹ç§’æ•°\n" -#: pg_ctl.c:1992 +#: pg_ctl.c:2001 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: pg_ctl.c:1993 +#: pg_ctl.c:2002 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait æ“作ãŒå®Œäº†ã™ã‚‹ã¾ã§å¾…機 (デフォルト)\n" -#: pg_ctl.c:1994 +#: pg_ctl.c:2003 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait 作業ã®å®Œäº†ã‚’å¾…ãŸãªã„\n" -#: pg_ctl.c:1995 +#: pg_ctl.c:2004 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: pg_ctl.c:1996 +#: pg_ctl.c:2005 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "-Dオプションã®çœç•¥æ™‚ã¯PGDATA環境変数ãŒä½¿ç”¨ã•れã¾ã™ã€‚\n" -#: pg_ctl.c:1998 +#: pg_ctl.c:2007 #, c-format msgid "" "\n" @@ -631,22 +654,22 @@ msgstr "" "\n" "èµ·å‹•ã€å†èµ·å‹•ã®ã‚ªãƒ—ション\n" -#: pg_ctl.c:2000 +#: pg_ctl.c:2009 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files postgresã®ã‚³ã‚¢ãƒ•ァイル生æˆã‚’許å¯\n" -#: pg_ctl.c:2002 +#: pg_ctl.c:2011 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files ã“ã®ãƒ—ラットフォームã§ã¯é©ç”¨ã•れãªã„\n" -#: pg_ctl.c:2004 +#: pg_ctl.c:2013 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr " -l, --log FILENAME サーãƒãƒ¼ãƒ­ã‚°ã‚’FILENAMEã¸æ›¸ã込む(ã¾ãŸã¯è¿½åŠ ã™ã‚‹)\n" -#: pg_ctl.c:2005 +#: pg_ctl.c:2014 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" @@ -655,12 +678,12 @@ msgstr "" " -o, --options=OPTIONS postgres(PostgreSQLサーãƒãƒ¼å®Ÿè¡Œãƒ•ァイル)ã¾ãŸã¯\n" " initdb ã«æ¸¡ã™ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‚ªãƒ—ション\n" -#: pg_ctl.c:2007 +#: pg_ctl.c:2016 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p PATH-TO-POSTGRES 通常ã¯ä¸è¦\n" -#: pg_ctl.c:2008 +#: pg_ctl.c:2017 #, c-format msgid "" "\n" @@ -669,12 +692,12 @@ msgstr "" "\n" "åœæ­¢ã€å†èµ·å‹•ã®ã‚ªãƒ—ション\n" -#: pg_ctl.c:2009 +#: pg_ctl.c:2018 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr " -m, --mode=MODE MODEã¯\"smart\"ã€\"fast\"ã€\"immediate\"ã®ã„ãšã‚Œã‹\n" -#: pg_ctl.c:2011 +#: pg_ctl.c:2020 #, c-format msgid "" "\n" @@ -683,22 +706,22 @@ msgstr "" "\n" "シャットダウンモードã¯ä»¥ä¸‹ã®é€šã‚Š:\n" -#: pg_ctl.c:2012 +#: pg_ctl.c:2021 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart å…¨ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®æŽ¥ç¶šåˆ‡æ–­å¾Œã«åœæ­¢\n" -#: pg_ctl.c:2013 +#: pg_ctl.c:2022 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast é©åˆ‡ãªæ‰‹ç¶šãã§ç›´ã¡ã«åœæ­¢(デフォルト)\n" -#: pg_ctl.c:2014 +#: pg_ctl.c:2023 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr " immediate é©åˆ‡ãªæ‰‹ç¶šã抜ãã§åœæ­¢; å†èµ·å‹•時ã«ã¯ãƒªã‚«ãƒãƒªãŒå®Ÿè¡Œã•れる\n" -#: pg_ctl.c:2016 +#: pg_ctl.c:2025 #, c-format msgid "" "\n" @@ -707,7 +730,7 @@ msgstr "" "\n" "killモードã§åˆ©ç”¨ã§ãるシグナルå:\n" -#: pg_ctl.c:2020 +#: pg_ctl.c:2029 #, c-format msgid "" "\n" @@ -716,27 +739,27 @@ msgstr "" "\n" "登録ã€ç™»éŒ²è§£é™¤ã®ã‚ªãƒ—ション:\n" -#: pg_ctl.c:2021 +#: pg_ctl.c:2030 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N SERVICENAME PostgreSQLサーãƒãƒ¼ã‚’登録ã™ã‚‹éš›ã®ã‚µãƒ¼ãƒ“スå\n" -#: pg_ctl.c:2022 +#: pg_ctl.c:2031 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr " -P PASSWORD PostgreSQLサーãƒãƒ¼ã‚’登録ã™ã‚‹ãŸã‚ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ãƒ‘スワード\n" -#: pg_ctl.c:2023 +#: pg_ctl.c:2032 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr " -U USERNAME PostgreSQLサーãƒãƒ¼ã‚’登録ã™ã‚‹ãŸã‚ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå\n" -#: pg_ctl.c:2024 +#: pg_ctl.c:2033 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S START-TYPE PostgreSQLサーãƒãƒ¼ã‚’登録ã™ã‚‹éš›ã®ã‚µãƒ¼ãƒ“ス起動タイプ\n" -#: pg_ctl.c:2026 +#: pg_ctl.c:2035 #, c-format msgid "" "\n" @@ -745,17 +768,17 @@ msgstr "" "\n" "起動タイプã¯ä»¥ä¸‹ã®é€šã‚Š:\n" -#: pg_ctl.c:2027 +#: pg_ctl.c:2036 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr " auto システムã®èµ·å‹•時ã«ã‚µãƒ¼ãƒ“スを自動的ã«é–‹å§‹(デフォルト)\n" -#: pg_ctl.c:2028 +#: pg_ctl.c:2037 #, c-format msgid " demand start service on demand\n" msgstr " demand è¦æ±‚ã«å¿œã˜ã¦ã‚µãƒ¼ãƒ“スを開始\n" -#: pg_ctl.c:2031 +#: pg_ctl.c:2040 #, c-format msgid "" "\n" @@ -764,37 +787,37 @@ msgstr "" "\n" "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2041 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_ctl.c:2057 +#: pg_ctl.c:2066 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: 䏿­£ãªã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ãƒ¢ãƒ¼ãƒ‰\"%s\"\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:2095 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: 䏿­£ãªã‚·ã‚°ãƒŠãƒ«å\"%s\"\n" -#: pg_ctl.c:2103 +#: pg_ctl.c:2112 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: 䏿­£ãªèµ·å‹•タイプ\"%s\"\n" -#: pg_ctl.c:2159 +#: pg_ctl.c:2168 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: コマンド\"%s\"を使用ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’決定ã§ãã¾ã›ã‚“ã§ã—ãŸ\n" -#: pg_ctl.c:2182 +#: pg_ctl.c:2191 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: 制御ファイルãŒå£Šã‚Œã¦ã„るよã†ã§ã™\n" -#: pg_ctl.c:2250 +#: pg_ctl.c:2259 #, c-format msgid "" "%s: cannot be run as root\n" @@ -805,32 +828,32 @@ msgstr "" "サーãƒãƒ¼ãƒ—ãƒ­ã‚»ã‚¹ã®æ‰€æœ‰è€…ã¨ãªã‚‹(éžç‰¹æ¨©)ユーザーã¨ã—ã¦(\"su\"ãªã©ã‚’使用ã—ã¦)\n" "ログインã—ã¦ãã ã•ã„。\n" -#: pg_ctl.c:2333 +#: pg_ctl.c:2331 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: -Sオプションã¯ã“ã®ãƒ—ラットフォームã§ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“\n" -#: pg_ctl.c:2370 -#, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: コマンドライン引数ãŒå¤šã™ãŽã¾ã™(先頭ã¯\"%s\")\n" - -#: pg_ctl.c:2396 +#: pg_ctl.c:2387 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: killモード用ã®å¼•æ•°ãŒã‚りã¾ã›ã‚“\n" -#: pg_ctl.c:2414 +#: pg_ctl.c:2405 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: æ“作モード\"%s\"ã¯ä¸æ˜Žã§ã™\n" -#: pg_ctl.c:2424 +#: pg_ctl.c:2414 +#, c-format +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: コマンドライン引数ãŒå¤šã™ãŽã¾ã™(先頭ã¯\"%s\")\n" + +#: pg_ctl.c:2421 #, c-format msgid "%s: no operation specified\n" msgstr "%s: æ“ä½œãƒ¢ãƒ¼ãƒ‰ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“\n" -#: pg_ctl.c:2445 +#: pg_ctl.c:2442 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "%s: ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®æŒ‡å®šã‚‚ã€PGDATA環境変数ã®è¨­å®šã‚‚ã‚りã¾ã›ã‚“\n" diff --git a/src/bin/pg_ctl/po/ka.po b/src/bin/pg_ctl/po/ka.po index e52b8b23b9f56..196ff9cb67e0e 100644 --- a/src/bin/pg_ctl/po/ka.po +++ b/src/bin/pg_ctl/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_ctl (PostgreSQL) 16\n" +"Project-Id-Version: pg_ctl (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-19 11:18+0000\n" -"PO-Revision-Date: 2023-04-20 08:19+0200\n" +"POT-Creation-Date: 2024-07-01 03:50+0000\n" +"PO-Revision-Date: 2024-03-13 02:04+0100\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,40 +16,59 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" -#: ../../common/exec.c:172 +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რáƒáƒ  ემთხვევáƒ" + +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ \"%s\":%m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "გáƒáƒ¡áƒáƒ¨áƒ•ებáƒáƒ“ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" პáƒáƒ•ნრშეუძლებელიáƒ" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "ბილიკის (\"%s\") áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ  ფáƒáƒ áƒ›áƒáƒ¨áƒ˜ áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "ბრძáƒáƒœáƒ”ბის (\"%s\") შესრულების შეცდáƒáƒ›áƒ: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "ბრძáƒáƒœáƒ”ბიდáƒáƒœ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "ბრძáƒáƒœáƒ”ბáƒáƒ› \"%s\" მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  დáƒáƒáƒ‘რუნáƒ" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 -#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 +#: ../../port/path.c:753 ../../port/path.c:790 ../../port/path.c:807 #, c-format msgid "out of memory\n" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" @@ -91,121 +110,121 @@ msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რ#: ../../port/path.c:775 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ›áƒ£áƒ¨áƒáƒ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მიღების შეცდáƒáƒ›áƒ: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ›áƒ£áƒ¨áƒáƒ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მიღების შეცდáƒáƒ›áƒ: %m\n" -#: pg_ctl.c:255 +#: pg_ctl.c:254 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s: სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს\n" -#: pg_ctl.c:258 +#: pg_ctl.c:257 #, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ %s წვდáƒáƒ›áƒ˜áƒ¡ უფლებრáƒáƒ  გáƒáƒ¥áƒ•თ: %s\n" +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ %s წვდáƒáƒ›áƒ˜áƒ¡ უფლებრáƒáƒ  გáƒáƒ¥áƒ•თ: %m\n" -#: pg_ctl.c:271 +#: pg_ctl.c:270 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s: სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს\n" -#: pg_ctl.c:284 +#: pg_ctl.c:283 #, c-format -msgid "%s: could not open PID file \"%s\": %s\n" -msgstr "%s: PID ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s\n" +msgid "%s: could not open PID file \"%s\": %m\n" +msgstr "%s: PID ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m\n" -#: pg_ctl.c:293 +#: pg_ctl.c:292 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s: PID ფáƒáƒ˜áƒšáƒ˜ \"%s\" ცáƒáƒ áƒ˜áƒ”ლიáƒ\n" -#: pg_ctl.c:296 +#: pg_ctl.c:295 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s: PID ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შიგთáƒáƒ•სი\n" -#: pg_ctl.c:458 pg_ctl.c:500 +#: pg_ctl.c:457 pg_ctl.c:499 #, c-format -msgid "%s: could not start server: %s\n" -msgstr "%s: სერვერის გáƒáƒ¨áƒ•ების შეცდáƒáƒ›áƒ: %s\n" +msgid "%s: could not start server: %m\n" +msgstr "%s: სერვერის გáƒáƒ¨áƒ•ების შეცდáƒáƒ›áƒ: %m\n" -#: pg_ctl.c:478 +#: pg_ctl.c:477 #, c-format -msgid "%s: could not start server due to setsid() failure: %s\n" -msgstr "%s: სერვერის გáƒáƒ¨áƒ•ებრშეუძლებელირsetsid()-ის შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ: %s\n" +msgid "%s: could not start server due to setsid() failure: %m\n" +msgstr "%s: სერვერის გáƒáƒ¨áƒ•ებრშეუძლებელირsetsid()-ის ჩáƒáƒ•áƒáƒ áƒ“ნის გáƒáƒ›áƒ: %m\n" -#: pg_ctl.c:548 +#: pg_ctl.c:547 #, c-format -msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %s\n" +msgid "%s: could not open log file \"%s\": %m\n" +msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m\n" -#: pg_ctl.c:565 +#: pg_ctl.c:564 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s: სერვერის გáƒáƒ¨áƒ•ებრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" -#: pg_ctl.c:782 +#: pg_ctl.c:781 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" msgstr "%s ბირთვის ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ˜áƒ¡ ლიმიტის დáƒáƒ§áƒ”ნებრáƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ hardlimit-ის მიერ\n" -#: pg_ctl.c:808 +#: pg_ctl.c:807 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s\n" -#: pg_ctl.c:813 +#: pg_ctl.c:812 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: პáƒáƒ áƒáƒ›áƒ”ტრების ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ზუსტáƒáƒ“ ერთი ხáƒáƒ–ი უნდრიყáƒáƒ¡\n" -#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107 +#: pg_ctl.c:854 pg_ctl.c:1038 pg_ctl.c:1105 #, c-format -msgid "%s: could not send stop signal (PID: %d): %s\n" -msgstr "%s: გáƒáƒ©áƒ”რების სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნრშეუძლებელირ(PID: %d): %s\n" +msgid "%s: could not send stop signal (PID: %d): %m\n" +msgstr "%s: გáƒáƒ©áƒ”რების სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნრშეუძლებელირ(PID: %d): %m\n" -#: pg_ctl.c:883 +#: pg_ctl.c:882 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" msgstr "პრáƒáƒ’რáƒáƒ›áƒ \"%s\" სჭირდებრ\"%s\"-ს, მáƒáƒ’რáƒáƒ› იგივე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში, სáƒáƒ“áƒáƒª \"%s\", ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ\n" -#: pg_ctl.c:886 +#: pg_ctl.c:885 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" msgstr "პრáƒáƒ’რáƒáƒ›áƒ „%s“ ნáƒáƒžáƒáƒ•ნირ„%s“-ის მიერ, მáƒáƒ’რáƒáƒ› ვერსიáƒ, იგივერáƒáƒ áƒáƒ, რáƒáƒª %s\n" -#: pg_ctl.c:918 +#: pg_ctl.c:917 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s: მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ\n" -#: pg_ctl.c:933 +#: pg_ctl.c:932 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "%s: შეიძლებრგáƒáƒ¨áƒ•ებულირსხვრსერვერი; გáƒáƒ¨áƒ•ებáƒáƒ¡ მáƒáƒ˜áƒœáƒª ვეცდები\n" -#: pg_ctl.c:981 +#: pg_ctl.c:980 msgid "waiting for server to start..." msgstr "სერვერის გáƒáƒ¨áƒ•ების მáƒáƒšáƒáƒ“ინი..." -#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238 +#: pg_ctl.c:985 pg_ctl.c:1061 pg_ctl.c:1123 pg_ctl.c:1235 msgid " done\n" msgstr " დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ\n" -#: pg_ctl.c:987 +#: pg_ctl.c:986 msgid "server started\n" msgstr "სერვერი გáƒáƒ”შვáƒ\n" -#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243 +#: pg_ctl.c:989 pg_ctl.c:995 pg_ctl.c:1240 msgid " stopped waiting\n" msgstr " ლáƒáƒ“ინი შეწყვეტილიáƒ\n" -#: pg_ctl.c:991 +#: pg_ctl.c:990 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: სერვერი დრáƒáƒ–ე áƒáƒ  გáƒáƒ”შვáƒ\n" -#: pg_ctl.c:997 +#: pg_ctl.c:996 #, c-format msgid "" "%s: could not start server\n" @@ -214,42 +233,42 @@ msgstr "" "%s: სერვერის გáƒáƒ¨áƒ•ების შეცდáƒáƒ›áƒ\n" "შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜.\n" -#: pg_ctl.c:1005 +#: pg_ctl.c:1004 msgid "server starting\n" msgstr "სერვერი ეშვებáƒ\n" -#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267 +#: pg_ctl.c:1023 pg_ctl.c:1081 pg_ctl.c:1144 pg_ctl.c:1183 pg_ctl.c:1264 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: PID-ის ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს\n" -#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268 +#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1145 pg_ctl.c:1184 pg_ctl.c:1265 msgid "Is server running?\n" msgstr "სერვერი გáƒáƒ¨áƒ•ებიულიáƒ?\n" -#: pg_ctl.c:1031 +#: pg_ctl.c:1030 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %d)\n" msgstr "%s: სერვერის გáƒáƒ©áƒ”რების შეცდáƒáƒ›áƒ; გáƒáƒ¨áƒ•ებულირერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი (PID: %d)\n" -#: pg_ctl.c:1046 +#: pg_ctl.c:1044 msgid "server shutting down\n" msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს სერვერის გáƒáƒ›áƒáƒ áƒ—ვáƒ\n" -#: pg_ctl.c:1051 pg_ctl.c:1112 +#: pg_ctl.c:1049 pg_ctl.c:1109 msgid "waiting for server to shut down..." msgstr "სერვერის გáƒáƒ›áƒáƒ áƒ—ვის მáƒáƒšáƒáƒ“ინი..." -#: pg_ctl.c:1055 pg_ctl.c:1117 +#: pg_ctl.c:1053 pg_ctl.c:1114 msgid " failed\n" msgstr " წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი.\n" -#: pg_ctl.c:1057 pg_ctl.c:1119 +#: pg_ctl.c:1055 pg_ctl.c:1116 #, c-format msgid "%s: server does not shut down\n" msgstr "%s სერვერი áƒáƒ  გáƒáƒ›áƒáƒ áƒ—ულáƒ\n" -#: pg_ctl.c:1059 pg_ctl.c:1121 +#: pg_ctl.c:1057 pg_ctl.c:1118 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -257,235 +276,235 @@ msgstr "" "მინიშნებáƒ: \"-m fast\" პáƒáƒ áƒáƒ›áƒ”ტრი სესიებს მáƒáƒ¨áƒ˜áƒœáƒ•ე წყვეტს,\n" "სესიის-ინიცირებული გáƒáƒ—იშვის მáƒáƒšáƒáƒ“ინის გáƒáƒ áƒ”შე.\n" -#: pg_ctl.c:1065 pg_ctl.c:1127 +#: pg_ctl.c:1063 pg_ctl.c:1124 msgid "server stopped\n" msgstr "სერვერი გáƒáƒ›áƒáƒ˜áƒ áƒ—áƒ\n" -#: pg_ctl.c:1086 +#: pg_ctl.c:1084 msgid "trying to start server anyway\n" msgstr "სერვერის მáƒáƒ˜áƒœáƒª გáƒáƒ¨áƒ•ების მცდელáƒáƒ‘áƒ\n" -#: pg_ctl.c:1095 +#: pg_ctl.c:1093 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %d)\n" msgstr "%s: სერვერის რესტáƒáƒ áƒ¢áƒ˜ შეუძლებელიáƒ; გáƒáƒ¨áƒ•ებულირერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი (PID: %d)\n" -#: pg_ctl.c:1098 pg_ctl.c:1157 +#: pg_ctl.c:1096 pg_ctl.c:1154 msgid "Please terminate the single-user server and try again.\n" msgstr "შეáƒáƒ©áƒ”რეთ ერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი დრთáƒáƒ•იდáƒáƒœ სცáƒáƒ“ეთ.\n" -#: pg_ctl.c:1131 +#: pg_ctl.c:1128 #, c-format msgid "%s: old server process (PID: %d) seems to be gone\n" msgstr "%s: სერვერის ძველი პრáƒáƒªáƒ”სი (PID: %d) რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, მáƒáƒ™áƒ•დáƒ\n" -#: pg_ctl.c:1133 +#: pg_ctl.c:1130 msgid "starting server anyway\n" msgstr "სერვერის მáƒáƒ˜áƒœáƒª გáƒáƒ¨áƒ•ებáƒ\n" -#: pg_ctl.c:1154 +#: pg_ctl.c:1151 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %d)\n" msgstr "%s: სერვერის გáƒáƒ“áƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ; გáƒáƒ¨áƒ•ებულირერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი (PID: %d)\n" -#: pg_ctl.c:1163 +#: pg_ctl.c:1160 #, c-format -msgid "%s: could not send reload signal (PID: %d): %s\n" -msgstr "%s: გáƒáƒ“áƒáƒ¢áƒ•ირთვის სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ (PID: %d): %s\n" +msgid "%s: could not send reload signal (PID: %d): %m\n" +msgstr "%s: გáƒáƒ“áƒáƒ¢áƒ•ირთვის სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ (PID: %d): %m\n" -#: pg_ctl.c:1168 +#: pg_ctl.c:1165 msgid "server signaled\n" msgstr "სერვერს სიგნáƒáƒšáƒ˜ გáƒáƒ”გზáƒáƒ•ნáƒ\n" -#: pg_ctl.c:1193 +#: pg_ctl.c:1190 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %d)\n" msgstr "%s: სერვერის წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის შეცდáƒáƒ›áƒ; გáƒáƒ¨áƒ•ებულირერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი (PID: %d)\n" -#: pg_ctl.c:1201 +#: pg_ctl.c:1198 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s:სერვერის წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბრშეუძლებელიáƒ; სერვერი უქმე რეჟიმში áƒáƒ áƒáƒ\n" -#: pg_ctl.c:1211 +#: pg_ctl.c:1208 #, c-format -msgid "%s: could not create promote signal file \"%s\": %s\n" -msgstr "%s: წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შექმნრშეუძლებელიáƒ: %s\n" +msgid "%s: could not create promote signal file \"%s\": %m\n" +msgstr "%s: წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შექმნრშეუძლებელიáƒ: %m\n" -#: pg_ctl.c:1217 +#: pg_ctl.c:1214 #, c-format -msgid "%s: could not write promote signal file \"%s\": %s\n" -msgstr "%s: წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ: %s\n" +msgid "%s: could not write promote signal file \"%s\": %m\n" +msgstr "%s: წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ: %m\n" -#: pg_ctl.c:1225 +#: pg_ctl.c:1222 #, c-format -msgid "%s: could not send promote signal (PID: %d): %s\n" -msgstr "%s: წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნრშეუძლებელიáƒ(PID: %d): %s\n" +msgid "%s: could not send promote signal (PID: %d): %m\n" +msgstr "%s: წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნრშეუძლებელიáƒ(PID: %d): %m\n" -#: pg_ctl.c:1228 +#: pg_ctl.c:1225 #, c-format -msgid "%s: could not remove promote signal file \"%s\": %s\n" -msgstr "%s: წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s\n" +msgid "%s: could not remove promote signal file \"%s\": %m\n" +msgstr "%s: წáƒáƒ®áƒáƒšáƒ˜áƒ¡áƒ”ბის სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m\n" -#: pg_ctl.c:1235 +#: pg_ctl.c:1232 msgid "waiting for server to promote..." msgstr "სერვერის დáƒáƒ¬áƒ˜áƒœáƒáƒ£áƒ áƒ”ბის მáƒáƒšáƒáƒ“ინი..." -#: pg_ctl.c:1239 +#: pg_ctl.c:1236 msgid "server promoted\n" msgstr "სერვერი დáƒáƒ¬áƒ˜áƒœáƒáƒ£áƒ áƒ“áƒ\n" -#: pg_ctl.c:1244 +#: pg_ctl.c:1241 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s სერვერი დრáƒáƒ–ე áƒáƒ  დáƒáƒ¬áƒ˜áƒœáƒáƒ£áƒ áƒ“áƒ\n" -#: pg_ctl.c:1250 +#: pg_ctl.c:1247 msgid "server promoting\n" msgstr "სერვერის დáƒáƒ¬áƒ˜áƒœáƒáƒ£áƒ áƒ”ბáƒ\n" -#: pg_ctl.c:1274 +#: pg_ctl.c:1271 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n" msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის რáƒáƒ¢áƒáƒªáƒ˜áƒ შეუძლებელიáƒ; გáƒáƒ¨áƒ•ებულირერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი (PID: %d)\n" -#: pg_ctl.c:1284 +#: pg_ctl.c:1281 #, c-format -msgid "%s: could not create log rotation signal file \"%s\": %s\n" -msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შექმნრშეუძლებელიáƒ: %s\n" +msgid "%s: could not create log rotation signal file \"%s\": %m\n" +msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შექმნრშეუძლებელიáƒ: %m\n" -#: pg_ctl.c:1290 +#: pg_ctl.c:1287 #, c-format -msgid "%s: could not write log rotation signal file \"%s\": %s\n" -msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ: %s\n" +msgid "%s: could not write log rotation signal file \"%s\": %m\n" +msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ: %m\n" -#: pg_ctl.c:1298 +#: pg_ctl.c:1295 #, c-format -msgid "%s: could not send log rotation signal (PID: %d): %s\n" -msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ (PID: %d): %s\n" +msgid "%s: could not send log rotation signal (PID: %d): %m\n" +msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ სიგნáƒáƒšáƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ (PID: %d): %m\n" -#: pg_ctl.c:1301 +#: pg_ctl.c:1298 #, c-format -msgid "%s: could not remove log rotation signal file \"%s\": %s\n" -msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ : %s\n" +msgid "%s: could not remove log rotation signal file \"%s\": %m\n" +msgstr "%s: ჟურნáƒáƒšáƒ˜áƒ¡ რáƒáƒ¢áƒáƒªáƒ˜áƒ˜áƒ¡ სიგნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ : %m\n" -#: pg_ctl.c:1306 +#: pg_ctl.c:1303 msgid "server signaled to rotate log file\n" msgstr "სერვერმრგვáƒáƒœáƒ˜áƒ¨áƒœáƒ რáƒáƒ› ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ¡áƒáƒ¢áƒ áƒ˜áƒáƒšáƒ”ბელიáƒ\n" -#: pg_ctl.c:1353 +#: pg_ctl.c:1350 #, c-format msgid "%s: single-user server is running (PID: %d)\n" msgstr "%s: გáƒáƒ¨áƒ•ებულირერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ სერვერი (PID: %d)\n" -#: pg_ctl.c:1367 +#: pg_ctl.c:1364 #, c-format msgid "%s: server is running (PID: %d)\n" msgstr "%s: სერვერი გáƒáƒ¨áƒ•ებულირ(PID: %d)\n" -#: pg_ctl.c:1383 +#: pg_ctl.c:1380 #, c-format msgid "%s: no server running\n" msgstr "%s: სერვერი გáƒáƒ¨áƒ•ებული áƒáƒ áƒ\n" -#: pg_ctl.c:1400 +#: pg_ctl.c:1397 #, c-format -msgid "%s: could not send signal %d (PID: %d): %s\n" -msgstr "%s: სიგნáƒáƒšáƒ˜áƒ¡ (%d) გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ (PID: %d): %s\n" +msgid "%s: could not send signal %d (PID: %d): %m\n" +msgstr "%s: სიგნáƒáƒšáƒ˜áƒ¡ (%d) გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ (PID: %d): %m\n" -#: pg_ctl.c:1431 +#: pg_ctl.c:1428 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ˜áƒ¡ პáƒáƒ•ნრშეუძლებელიáƒ\n" -#: pg_ctl.c:1441 +#: pg_ctl.c:1438 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: გáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ˜ postgres áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს\n" -#: pg_ctl.c:1511 pg_ctl.c:1545 +#: pg_ctl.c:1508 pg_ctl.c:1542 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: სერვისის მმáƒáƒ áƒ—ველის გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ\n" -#: pg_ctl.c:1517 +#: pg_ctl.c:1514 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: სერვისი %s უკვე რეგისტრირებულიáƒ\n" -#: pg_ctl.c:1528 +#: pg_ctl.c:1525 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: სერვისის (\"%s\") რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" -#: pg_ctl.c:1551 +#: pg_ctl.c:1548 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: სერვისი %s უკვე რეგისტრირებულიáƒ\n" -#: pg_ctl.c:1558 +#: pg_ctl.c:1555 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: სერვისის (%s) გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu\n" -#: pg_ctl.c:1567 +#: pg_ctl.c:1564 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: სერვისის (\"%s\") რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu\n" -#: pg_ctl.c:1654 +#: pg_ctl.c:1651 msgid "Waiting for server startup...\n" msgstr "სერვერის გáƒáƒ¨áƒ•ების მáƒáƒšáƒáƒ“ინი...\n" -#: pg_ctl.c:1657 +#: pg_ctl.c:1654 msgid "Timed out waiting for server startup\n" msgstr "სერვერის გáƒáƒ¨áƒ•ების მáƒáƒšáƒáƒ“ინის ვáƒáƒ“რგáƒáƒ•იდáƒ\n" -#: pg_ctl.c:1661 +#: pg_ctl.c:1658 msgid "Server started and accepting connections\n" msgstr "სერვერი გáƒáƒ”შვრდრმზáƒáƒ“áƒáƒ შეერთებისთვის\n" -#: pg_ctl.c:1716 +#: pg_ctl.c:1713 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: სერვისის (%s) გáƒáƒ¨áƒ•ებრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" -#: pg_ctl.c:1789 +#: pg_ctl.c:1786 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: პრáƒáƒªáƒ”სის კáƒáƒ“ის გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" -#: pg_ctl.c:1803 +#: pg_ctl.c:1800 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: შეცდáƒáƒ›áƒ SSID-ების გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" -#: pg_ctl.c:1829 +#: pg_ctl.c:1826 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: შეზღუდული კáƒáƒ“ის შექმნრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" -#: pg_ctl.c:1911 +#: pg_ctl.c:1908 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: პრივილეგიებისთვის LUID-ების მიღებრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu\n" -#: pg_ctl.c:1919 pg_ctl.c:1934 +#: pg_ctl.c:1916 pg_ctl.c:1931 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: შეზღუდული კáƒáƒ“ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მიღებრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu\n" -#: pg_ctl.c:1928 +#: pg_ctl.c:1925 #, c-format msgid "%s: out of memory\n" msgstr "%s: áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" -#: pg_ctl.c:1958 +#: pg_ctl.c:1955 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'.\n" -#: pg_ctl.c:1966 +#: pg_ctl.c:1963 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" @@ -494,17 +513,17 @@ msgstr "" "%s წáƒáƒ áƒ›áƒáƒáƒ“გენს პრáƒáƒ’რáƒáƒ›áƒáƒ¡ PostgreSQL სერვერის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡, გáƒáƒ¨áƒ•ების, გáƒáƒ©áƒ”რების დრკáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡áƒ—ვის.\n" "\n" -#: pg_ctl.c:1967 +#: pg_ctl.c:1964 #, c-format msgid "Usage:\n" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" -#: pg_ctl.c:1968 +#: pg_ctl.c:1965 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-s] [-o პáƒáƒ áƒáƒ›áƒ”ტრები]\n" -#: pg_ctl.c:1969 +#: pg_ctl.c:1966 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -513,12 +532,12 @@ msgstr "" " %s start [-D მáƒáƒœáƒáƒªáƒ”მებსსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-l ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლი] [-W] [-t წáƒáƒ›áƒ˜] [-s]\n" " [-o პáƒáƒ áƒáƒ›áƒ”ტრი] [-p ბილიკი] [-c]\n" -#: pg_ctl.c:1971 +#: pg_ctl.c:1968 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D მáƒáƒœáƒáƒªáƒ”მებსსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-m გáƒáƒ›áƒáƒ áƒ—ვის-რეჟიმი] [-W] [-t წáƒáƒ›áƒ˜] [-s]\n" -#: pg_ctl.c:1972 +#: pg_ctl.c:1969 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -527,32 +546,32 @@ msgstr "" " %s restart [-D მáƒáƒœáƒáƒªáƒ”მებსსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-m გáƒáƒ›áƒáƒ áƒ—ვის-რეჟიმი] [-W] [-t წáƒáƒ›áƒ˜] [-s]\n" " [-o პáƒáƒ áƒáƒ›áƒ”ტრები] [-c]\n" -#: pg_ctl.c:1974 +#: pg_ctl.c:1971 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D მáƒáƒœáƒáƒªáƒ”მებსსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-s]\n" -#: pg_ctl.c:1975 +#: pg_ctl.c:1972 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D მáƒáƒœáƒáƒªáƒ”მებსსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე]\n" -#: pg_ctl.c:1976 +#: pg_ctl.c:1973 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-W] [-t წáƒáƒ›áƒ˜] [-s]\n" -#: pg_ctl.c:1977 +#: pg_ctl.c:1974 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-s]\n" -#: pg_ctl.c:1978 +#: pg_ctl.c:1975 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill სიგნáƒáƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლი PID\n" -#: pg_ctl.c:1980 +#: pg_ctl.c:1977 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" @@ -561,12 +580,12 @@ msgstr "" " %s register [-D მáƒáƒœáƒáƒªáƒ”მებსსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე] [-N სერვისისსáƒáƒ®áƒ”ლი] [-U მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი] [-P პáƒáƒ áƒáƒšáƒ˜]\n" " [-S გáƒáƒ¨áƒ•ების-ტიპი] [-e წყáƒáƒ áƒ] [-W] [-t წáƒáƒ›áƒ˜] [-s] [-o პáƒáƒ áƒáƒ›áƒ”ტრები]\n" -#: pg_ctl.c:1982 +#: pg_ctl.c:1979 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N სერვისისსáƒáƒ®áƒ”ლი]\n" -#: pg_ctl.c:1985 +#: pg_ctl.c:1982 #, c-format msgid "" "\n" @@ -575,52 +594,52 @@ msgstr "" "\n" "ზáƒáƒ’áƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_ctl.c:1986 +#: pg_ctl.c:1983 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " [-D, --pgdata=]DATADIR ბáƒáƒ–ის სáƒáƒªáƒáƒ•ის მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n" -#: pg_ctl.c:1988 +#: pg_ctl.c:1985 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr " -e SOURCE მáƒáƒ•ლენების წყáƒáƒ áƒ სერვისáƒáƒ“ გáƒáƒ¨áƒ•ებულáƒáƒ‘ის დრáƒáƒ¡ ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒ¡áƒáƒ¬áƒ”რáƒáƒ“\n" -#: pg_ctl.c:1990 +#: pg_ctl.c:1987 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr " -s, --silent მხáƒáƒšáƒáƒ“ შეცდáƒáƒ›áƒ”ბის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ. სáƒáƒ˜áƒœáƒ¤áƒáƒ áƒ›áƒáƒªáƒ˜áƒ შეტყáƒáƒ‘ინებები áƒáƒ  გáƒáƒ›áƒáƒ©áƒœáƒ“ებáƒ\n" -#: pg_ctl.c:1991 +#: pg_ctl.c:1988 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr " -t, --timeout=წáƒáƒ›áƒ˜ -w პáƒáƒ áƒáƒ›áƒ”ტრის გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ მითითებული ლáƒáƒ“ინის დრáƒ\n" -#: pg_ctl.c:1992 +#: pg_ctl.c:1989 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_ctl.c:1993 +#: pg_ctl.c:1990 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait დáƒáƒšáƒáƒ“ებრáƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბáƒáƒ›áƒ“ე(ნáƒáƒ’ულისხმები)\n" -#: pg_ctl.c:1994 +#: pg_ctl.c:1991 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait áƒáƒ  დáƒáƒ”ლáƒáƒ“ებრáƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ¡\n" -#: pg_ctl.c:1995 +#: pg_ctl.c:1992 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_ctl.c:1996 +#: pg_ctl.c:1993 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "თუ -D პáƒáƒ áƒáƒ›áƒ”ტრი მითითებული áƒáƒ áƒáƒ, გáƒáƒ›áƒáƒ§áƒ”ნებული იქნებრგáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი PGDATA.\n" -#: pg_ctl.c:1998 +#: pg_ctl.c:1995 #, c-format msgid "" "\n" @@ -629,22 +648,22 @@ msgstr "" "\n" "გáƒáƒ¨áƒ•ების áƒáƒœ თáƒáƒ•იდáƒáƒœ გáƒáƒ¨áƒ•ების პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_ctl.c:2000 +#: pg_ctl.c:1997 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files postgres-ისთვის ბირთვის ფáƒáƒ˜áƒšáƒ”ბის ჩáƒáƒ¬áƒ”რის უფლების მიცემáƒ\n" -#: pg_ctl.c:2002 +#: pg_ctl.c:1999 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე áƒáƒ  მუშáƒáƒáƒ‘ს\n" -#: pg_ctl.c:2004 +#: pg_ctl.c:2001 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr " -l, --log=ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლი სერვერის ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რრ(áƒáƒœ áƒáƒ áƒ¡áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ ბáƒáƒšáƒáƒ¨áƒ˜ მიწერáƒ)\n" -#: pg_ctl.c:2005 +#: pg_ctl.c:2002 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" @@ -653,12 +672,12 @@ msgstr "" " -o, --options=OPTIONS postgres-ისთვის (PostgreSQL სერვერი) áƒáƒœ initdb-სთვის გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მი \n" " ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები \n" -#: pg_ctl.c:2007 +#: pg_ctl.c:2004 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p ბილიკი-POSTGRES-მდე ჩვეულებრივ სáƒáƒ­áƒ˜áƒ áƒ áƒáƒ áƒáƒ\n" -#: pg_ctl.c:2008 +#: pg_ctl.c:2005 #, c-format msgid "" "\n" @@ -667,12 +686,12 @@ msgstr "" "\n" "გáƒáƒ©áƒ”რებისრდრგáƒáƒ“áƒáƒ¢áƒ•ირთვის პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_ctl.c:2009 +#: pg_ctl.c:2006 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr " -m, --mode=რეჟიმი რეჟიმი შეიძლებრიყáƒáƒ¡: (ჭკვიáƒáƒœáƒ˜)\"smart\", (ჩქáƒáƒ áƒ˜)\"fast\", áƒáƒœ (áƒáƒ®áƒšáƒáƒ•ე)\"immediate\"\n" -#: pg_ctl.c:2011 +#: pg_ctl.c:2008 #, c-format msgid "" "\n" @@ -681,22 +700,22 @@ msgstr "" "\n" "გáƒáƒ›áƒáƒ áƒ—ვის რეჟიმებიáƒ:\n" -#: pg_ctl.c:2012 +#: pg_ctl.c:2009 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart გáƒáƒ¡áƒ•ლáƒ, რáƒáƒªáƒ ყველრკლიენტი გáƒáƒ˜áƒ—იშებáƒ\n" -#: pg_ctl.c:2013 +#: pg_ctl.c:2010 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast პირდáƒáƒžáƒ˜áƒ  გáƒáƒ¡áƒ•ლáƒ, სწáƒáƒ áƒáƒ“ გáƒáƒ›áƒáƒ áƒ—ვით (ნáƒáƒ’ულისხმები)\n" -#: pg_ctl.c:2014 +#: pg_ctl.c:2011 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr " immediate სრული გáƒáƒ—იშვის გáƒáƒ áƒ”შე გáƒáƒ¡áƒ•ლáƒ; დიდი áƒáƒšáƒ‘áƒáƒ—áƒáƒ‘ით შემდეგ გáƒáƒ¨áƒ•ებáƒáƒ–ე მáƒáƒœáƒáƒªáƒ”მების áƒáƒ¦áƒ“გენრმáƒáƒ’იწევთ\n" -#: pg_ctl.c:2016 +#: pg_ctl.c:2013 #, c-format msgid "" "\n" @@ -705,7 +724,7 @@ msgstr "" "\n" "მáƒáƒ¡áƒáƒ™áƒšáƒáƒ•áƒáƒ“ დáƒáƒ¨áƒ•ებული სიგნáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლები:\n" -#: pg_ctl.c:2020 +#: pg_ctl.c:2017 #, c-format msgid "" "\n" @@ -714,27 +733,27 @@ msgstr "" "\n" "რეგისტრáƒáƒªáƒ˜áƒ˜áƒ¡áƒ დრმისი მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_ctl.c:2021 +#: pg_ctl.c:2018 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N სერვისისსáƒáƒ®áƒ”ლი სერვისის სáƒáƒ®áƒ”ლი, რáƒáƒ›áƒ”ლიც PostgreSQL სერვერი დáƒáƒ áƒ”გისტრირდებáƒ\n" -#: pg_ctl.c:2022 +#: pg_ctl.c:2019 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr " -P პáƒáƒ áƒáƒšáƒ˜ PostgreSQL სერვერის დáƒáƒ¡áƒáƒ áƒ”გისტრირებელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒšáƒ˜\n" -#: pg_ctl.c:2023 +#: pg_ctl.c:2020 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr " -U მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი PostgreSQL სერვერის დáƒáƒ¡áƒáƒ áƒ”გისტრირებელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: pg_ctl.c:2024 +#: pg_ctl.c:2021 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S გáƒáƒ¨áƒ•ების ტიპი PostgreSQL სერვერის გáƒáƒ¨áƒ•ების ტიპი\n" -#: pg_ctl.c:2026 +#: pg_ctl.c:2023 #, c-format msgid "" "\n" @@ -743,17 +762,17 @@ msgstr "" "\n" "გáƒáƒ¨áƒ•ების ტიპები:\n" -#: pg_ctl.c:2027 +#: pg_ctl.c:2024 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr " auto სერვისი áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒ”შვებრსისტემის ჩáƒáƒ¢áƒ•ირთვისáƒáƒ¡ (ნáƒáƒ’ულისხმები)\n" -#: pg_ctl.c:2028 +#: pg_ctl.c:2025 #, c-format msgid " demand start service on demand\n" msgstr " demand სáƒáƒ­áƒ˜áƒ áƒáƒ”ბის მიხედვით\n" -#: pg_ctl.c:2031 +#: pg_ctl.c:2028 #, c-format msgid "" "\n" @@ -762,37 +781,37 @@ msgstr "" "\n" "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2029 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" -#: pg_ctl.c:2057 +#: pg_ctl.c:2054 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: მუშáƒáƒáƒ‘ის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის უცნáƒáƒ‘ი რეჟიმი: \"%s\"\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:2083 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: სიგნáƒáƒšáƒ˜áƒ¡ უცნáƒáƒ‘ი სáƒáƒ®áƒ”ლი: \"%s\"\n" -#: pg_ctl.c:2103 +#: pg_ctl.c:2100 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: გáƒáƒ¨áƒ•ების უცნáƒáƒ‘ი ტიპი \"%s\"\n" -#: pg_ctl.c:2159 +#: pg_ctl.c:2156 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: შეუძლებელირმáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის პáƒáƒ•ნრბრძáƒáƒœáƒ”ბით \"%s\"\n" -#: pg_ctl.c:2182 +#: pg_ctl.c:2179 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜ დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ\n" -#: pg_ctl.c:2250 +#: pg_ctl.c:2247 #, c-format msgid "" "%s: cannot be run as root\n" @@ -803,32 +822,32 @@ msgstr "" "გთხáƒáƒ•თ შეხვიდეთ (მáƒáƒ’. \"su\"-ის გáƒáƒ›áƒáƒ§áƒ”ნებით) რáƒáƒ’áƒáƒ áƒª (áƒáƒ áƒáƒžáƒ áƒ˜áƒ•ილეგირებული)\n" "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი, რáƒáƒ›áƒ”ლიც ფლáƒáƒ‘ს სერვერის პრáƒáƒªáƒ”სს.\n" -#: pg_ctl.c:2333 +#: pg_ctl.c:2319 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: პáƒáƒ áƒáƒ›áƒ”ტრი -S áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ\n" -#: pg_ctl.c:2370 -#, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")\n" - -#: pg_ctl.c:2396 +#: pg_ctl.c:2375 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: ნáƒáƒ™áƒšáƒ£áƒšáƒ˜ áƒáƒ áƒ’უმენტები მáƒáƒ™áƒ•ლის რეჟიმისთვის\n" -#: pg_ctl.c:2414 +#: pg_ctl.c:2393 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ˜áƒ¡ უცნáƒáƒ‘ი რეჟიმი \"%s\"\n" -#: pg_ctl.c:2424 +#: pg_ctl.c:2402 +#, c-format +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")\n" + +#: pg_ctl.c:2409 #, c-format msgid "%s: no operation specified\n" msgstr "%s: áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ მითითებული áƒáƒ áƒáƒ\n" -#: pg_ctl.c:2445 +#: pg_ctl.c:2430 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "%s: ბáƒáƒ–ის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე დრგáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი PGDATA მითითებული áƒáƒ áƒáƒ\n" diff --git a/src/bin/pg_ctl/po/ko.po b/src/bin/pg_ctl/po/ko.po index b925b323b65b6..e6f6e8ccb5691 100644 --- a/src/bin/pg_ctl/po/ko.po +++ b/src/bin/pg_ctl/po/ko.po @@ -3,10 +3,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_ctl (PostgreSQL) 13\n" +"Project-Id-Version: pg_ctl (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-24 03:48+0000\n" -"PO-Revision-Date: 2023-04-24 09:04+0200\n" +"POT-Creation-Date: 2025-01-17 04:49+0000\n" +"PO-Revision-Date: 2025-01-16 14:12+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean Team \n" "Language: ko\n" @@ -15,42 +15,57 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../common/exec.c:172 -#, fuzzy, c-format -#| msgid "invalid binary \"%s\"" +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ë°”ì´íЏ 순서 ì •ë³´ 불ì¼ì¹˜" + +#: ../../common/exec.c:174 +#, c-format msgid "invalid binary \"%s\": %m" -msgstr "ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ íŒŒì¼ \"%s\"" +msgstr "\"%s\" 파ì¼ì€ ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼ìž„: %m" -#: ../../common/exec.c:215 -#, fuzzy, c-format -#| msgid "could not read binary \"%s\"" +#: ../../common/exec.c:217 +#, c-format msgid "could not read binary \"%s\": %m" -msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ" +msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "실행할 \"%s\" 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: ../../common/exec.c:250 -#, fuzzy, c-format -#| msgid "could not reopen file \"%s\" as stderr: %m" +#: ../../common/exec.c:252 +#, c-format msgid "could not resolve path \"%s\" to absolute form: %m" -msgstr "stderr 로 사용하기 위해 \"%s\" íŒŒì¼ ë‹¤ì‹œ 열기 실패: %m" +msgstr "\"%s\" 경로를 절대경로로 바꿀 수 ì—†ìŒ: %m" -#: ../../common/exec.c:412 -#, fuzzy, c-format -#| msgid "%s failed: %m" +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "\"%s\" ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "\"%s\" 명령ì—서 ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "\"%s\" ëª…ë ¹ì´ ì•„ë¬´ëŸ° ë°ì´í„°ë„ 반환하지 않ìŒ" + +#: ../../common/exec.c:424 +#, c-format msgid "%s() failed: %m" -msgstr "%s 실패: %m" +msgstr "%s() 실패: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "메모리 부족" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 -#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 +#: ../../port/path.c:753 ../../port/path.c:790 ../../port/path.c:807 #, c-format msgid "out of memory\n" msgstr "메모리 부족\n" @@ -92,135 +107,129 @@ msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, 알수 없는 ìƒíƒœ %d" #: ../../port/path.c:775 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "현재 작업 디렉터리를 알 수 ì—†ìŒ: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "현재 작업 디렉터리를 알 수 ì—†ìŒ: %m\n" -#: pg_ctl.c:255 +#: pg_ctl.c:254 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s: \"%s\" 디렉터리 ì—†ìŒ\n" -#: pg_ctl.c:258 +#: pg_ctl.c:257 #, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: \"%s\" ë””ë ‰í„°ë¦¬ì— ì•¡ì„¸ìŠ¤í•  수 ì—†ìŒ: %s\n" +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: \"%s\" ë””ë ‰í„°ë¦¬ì— ì•¡ì„¸ìŠ¤í•  수 ì—†ìŒ: %m\n" -#: pg_ctl.c:271 +#: pg_ctl.c:270 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s: 지정한 \"%s\" 디렉터리는 ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤íŠ¸ 디렉터리가 아님\n" -#: pg_ctl.c:284 +#: pg_ctl.c:283 #, c-format -msgid "%s: could not open PID file \"%s\": %s\n" -msgstr "%s: \"%s\" PID 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s\n" +msgid "%s: could not open PID file \"%s\": %m\n" +msgstr "%s: \"%s\" PID 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m\n" -#: pg_ctl.c:293 +#: pg_ctl.c:292 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s: \"%s\" PID 파ì¼ì— ë‚´ìš©ì´ ì—†ìŠµë‹ˆë‹¤\n" -#: pg_ctl.c:296 +#: pg_ctl.c:295 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s: \"%s\" PID 파ì¼ì´ 비었ìŒ\n" -#: pg_ctl.c:458 pg_ctl.c:500 +#: pg_ctl.c:457 pg_ctl.c:499 #, c-format -msgid "%s: could not start server: %s\n" -msgstr "%s: 서버를 시작 í•  수 ì—†ìŒ: %s\n" +msgid "%s: could not start server: %m\n" +msgstr "%s: 서버를 시작 í•  수 ì—†ìŒ: %m\n" -#: pg_ctl.c:478 +#: pg_ctl.c:477 #, c-format -msgid "%s: could not start server due to setsid() failure: %s\n" -msgstr "%s: setsid() 실패로 서버를 시작 í•  수 ì—†ìŒ: %s\n" +msgid "%s: could not start server due to setsid() failure: %m\n" +msgstr "%s: setsid() 실패로 서버를 시작 í•  수 ì—†ìŒ: %m\n" -#: pg_ctl.c:548 +#: pg_ctl.c:547 #, c-format -msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s: \"%s\" 로그 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s\n" +msgid "%s: could not open log file \"%s\": %m\n" +msgstr "%s: \"%s\" 로그 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m\n" -#: pg_ctl.c:565 +#: pg_ctl.c:564 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s: 서버를 시작할 수 ì—†ìŒ: 오류 코드 %lu\n" -#: pg_ctl.c:782 +#: pg_ctl.c:781 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" -msgstr "%s: 코어 íŒŒì¼ í¬ê¸° 한ë„를 설정할 수 ì—†ìŒ, 하드 ë””ìŠ¤í¬ ìš©ëŸ‰ 초과로 허용ë˜ì§€ 않ìŒ\n" +msgstr "" +"%s: 코어 íŒŒì¼ í¬ê¸° 한ë„를 설정할 수 ì—†ìŒ, 하드 ë””ìŠ¤í¬ ìš©ëŸ‰ 초과로 허용ë˜ì§€ 않" +"ìŒ\n" -#: pg_ctl.c:808 +#: pg_ctl.c:807 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s: \"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ\n" -#: pg_ctl.c:813 +#: pg_ctl.c:812 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: \"%s\" 환경설정파ì¼ì€ 반드시 한 ì¤„ì„ ê°€ì ¸ì•¼í•œë‹¤?\n" -#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107 +#: pg_ctl.c:854 pg_ctl.c:1038 pg_ctl.c:1105 #, c-format -msgid "%s: could not send stop signal (PID: %d): %s\n" -msgstr "%s: stop 시그ë„ì„ ë³´ë‚¼ 수 ì—†ìŒ (PID: %d): %s\n" +msgid "%s: could not send stop signal (PID: %d): %m\n" +msgstr "%s: stop 시그ë„ì„ ë³´ë‚¼ 수 ì—†ìŒ (PID: %d): %m\n" -#: pg_ctl.c:883 -#, fuzzy, c-format -#| msgid "" -#| "The program \"%s\" is needed by %s but was not found in the\n" -#| "same directory as \"%s\".\n" -#| "Check your installation." -msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" +#: pg_ctl.c:882 +#, c-format +msgid "" +"program \"%s\" is needed by %s but was not found in the same directory as " +"\"%s\"\n" msgstr "" "\"%s\" í”„ë¡œê·¸ëž¨ì´ %s 작업ì—서 필요합니다. 그런ë°, ì´ íŒŒì¼ì´\n" "\"%s\" 파ì¼ì´ 있는 ë””ë ‰í„°ë¦¬ì•ˆì— ì—†ìŠµë‹ˆë‹¤.\n" -"설치 ìƒíƒœë¥¼ 확ì¸í•´ 주십시오." - -#: pg_ctl.c:886 -#, fuzzy, c-format -#| msgid "" -#| "The program \"%s\" was found by \"%s\"\n" -#| "but was not the same version as %s.\n" -#| "Check your installation." + +#: pg_ctl.c:885 +#, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" msgstr "" "\"%s\" í”„ë¡œê·¸ëž¨ì„ \"%s\" 작업 ë•Œë¬¸ì— ì°¾ì•˜ì§€ë§Œ ì´ íŒŒì¼ì€\n" "%s í”„ë¡œê·¸ëž¨ì˜ ë²„ì „ê³¼ 다릅니다.\n" -"설치 ìƒíƒœë¥¼ 확ì¸í•´ 주십시오." -#: pg_ctl.c:918 +#: pg_ctl.c:917 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s: ë°ì´í„°ë² ì´ìФ 초기화 실패\n" -#: pg_ctl.c:933 +#: pg_ctl.c:932 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "%s: 다른 서버가 ê°€ë™ ì¤‘ì¸ ê²ƒ ê°™ìŒ; 어째든 서버 ê°€ë™ì„ 시ë„함\n" -#: pg_ctl.c:981 +#: pg_ctl.c:980 msgid "waiting for server to start..." msgstr "서버를 시작하기 위해 기다리는 중..." -#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238 +#: pg_ctl.c:985 pg_ctl.c:1061 pg_ctl.c:1123 pg_ctl.c:1235 msgid " done\n" msgstr " 완료\n" -#: pg_ctl.c:987 +#: pg_ctl.c:986 msgid "server started\n" msgstr "서버 시작ë¨\n" -#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243 +#: pg_ctl.c:989 pg_ctl.c:995 pg_ctl.c:1240 msgid " stopped waiting\n" msgstr " 중지 기다리는 중\n" -#: pg_ctl.c:991 +#: pg_ctl.c:990 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: 서버가 ì œ ì‹œê°„ì— ì‹œìž‘ë˜ì§€ 못했ìŒ\n" -#: pg_ctl.c:997 +#: pg_ctl.c:996 #, c-format msgid "" "%s: could not start server\n" @@ -229,42 +238,42 @@ msgstr "" "%s: 서버를 시작 í•  수 ì—†ìŒ\n" "로그 ì¶œë ¥ì„ ì‚´íŽ´ë³´ì‹­ì‹œì˜¤.\n" -#: pg_ctl.c:1005 +#: pg_ctl.c:1004 msgid "server starting\n" msgstr "서버를 시작합니다\n" -#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267 +#: pg_ctl.c:1023 pg_ctl.c:1081 pg_ctl.c:1144 pg_ctl.c:1183 pg_ctl.c:1264 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: \"%s\" PID 파ì¼ì´ 없습니다\n" -#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268 +#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1145 pg_ctl.c:1184 pg_ctl.c:1265 msgid "Is server running?\n" msgstr "서버가 실행 중입니까?\n" -#: pg_ctl.c:1031 +#: pg_ctl.c:1030 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %d)\n" msgstr "%s: 서버 중지 실패; ë‹¨ì¼ ì‚¬ìš©ìž ì„œë²„ê°€ 실행 중 (PID: %d)\n" -#: pg_ctl.c:1046 +#: pg_ctl.c:1044 msgid "server shutting down\n" msgstr "서버를 멈춥니다\n" -#: pg_ctl.c:1051 pg_ctl.c:1112 +#: pg_ctl.c:1049 pg_ctl.c:1109 msgid "waiting for server to shut down..." msgstr "서버를 멈추기 위해 기다리는 중..." -#: pg_ctl.c:1055 pg_ctl.c:1117 +#: pg_ctl.c:1053 pg_ctl.c:1114 msgid " failed\n" msgstr " 실패\n" -#: pg_ctl.c:1057 pg_ctl.c:1119 +#: pg_ctl.c:1055 pg_ctl.c:1116 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: 서버를 멈추지 못했ìŒ\n" -#: pg_ctl.c:1059 pg_ctl.c:1121 +#: pg_ctl.c:1057 pg_ctl.c:1118 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -272,235 +281,239 @@ msgstr "" "힌트: \"-m fast\" ì˜µì…˜ì„ ì‚¬ìš©í•˜ë©´ ì ‘ì†í•œ ì„¸ì…˜ë“¤ì„ ì¦‰ì‹œ 정리합니다.\n" "ì´ ì˜µì…˜ì„ ì‚¬ìš©í•˜ì§€ 않으면 ì ‘ì†í•œ 세션들 스스로 ëŠì„ 때까지 기다립니다.\n" -#: pg_ctl.c:1065 pg_ctl.c:1127 +#: pg_ctl.c:1063 pg_ctl.c:1124 msgid "server stopped\n" msgstr "서버 멈추었ìŒ\n" -#: pg_ctl.c:1086 +#: pg_ctl.c:1084 msgid "trying to start server anyway\n" msgstr "어째든 서버를 시작해 봅니다\n" -#: pg_ctl.c:1095 +#: pg_ctl.c:1093 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %d)\n" -msgstr "%s: 서버를 다시 시작 í•  수 ì—†ìŒ; 단ì¼ì‚¬ìš©ìž 서버가 실행 중임 (PID: %d)\n" +msgstr "" +"%s: 서버를 다시 시작 í•  수 ì—†ìŒ; 단ì¼ì‚¬ìš©ìž 서버가 실행 중임 (PID: %d)\n" -#: pg_ctl.c:1098 pg_ctl.c:1157 +#: pg_ctl.c:1096 pg_ctl.c:1154 msgid "Please terminate the single-user server and try again.\n" msgstr "ë‹¨ì¼ ì‚¬ìš©ìž ì„œë²„ë¥¼ 멈추고 다시 시ë„하십시오.\n" -#: pg_ctl.c:1131 +#: pg_ctl.c:1128 #, c-format msgid "%s: old server process (PID: %d) seems to be gone\n" msgstr "%s: ì´ì „ 서버 프로세스(PID: %d)ê°€ 없어졌습니다\n" -#: pg_ctl.c:1133 +#: pg_ctl.c:1130 msgid "starting server anyway\n" msgstr "어째든 서버를 시작합니다\n" -#: pg_ctl.c:1154 +#: pg_ctl.c:1151 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %d)\n" -msgstr "%s: 서버 í™˜ê²½ì„¤ì •ì„ ë‹¤ì‹œ 불러올 수 ì—†ìŒ; ë‹¨ì¼ ì‚¬ìš©ìž ì„œë²„ê°€ 실행 중임 (PID: %d)\n" +msgstr "" +"%s: 서버 í™˜ê²½ì„¤ì •ì„ ë‹¤ì‹œ 불러올 수 ì—†ìŒ; ë‹¨ì¼ ì‚¬ìš©ìž ì„œë²„ê°€ 실행 중임 (PID: " +"%d)\n" -#: pg_ctl.c:1163 +#: pg_ctl.c:1160 #, c-format -msgid "%s: could not send reload signal (PID: %d): %s\n" -msgstr "%s: reload 시그ë„ì„ ë³´ë‚¼ 수 ì—†ìŒ (PID: %d): %s\n" +msgid "%s: could not send reload signal (PID: %d): %m\n" +msgstr "%s: reload 시그ë„ì„ ë³´ë‚¼ 수 ì—†ìŒ (PID: %d): %m\n" -#: pg_ctl.c:1168 +#: pg_ctl.c:1165 msgid "server signaled\n" msgstr "서버가 시스템 시그ë„ì„ ë°›ì•˜ìŒ\n" -#: pg_ctl.c:1193 +#: pg_ctl.c:1190 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %d)\n" msgstr "%s: ìš´ì˜ì„œë²„ 전환 실패; 단ì¼ì‚¬ìš©ìž 서버가 실행 중(PID: %d)\n" -#: pg_ctl.c:1201 +#: pg_ctl.c:1198 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s: ìš´ì˜ì„œë²„ 전환 실패; 서버가 대기 모드로 ìƒíƒœê°€ 아님\n" -#: pg_ctl.c:1211 +#: pg_ctl.c:1208 #, c-format -msgid "%s: could not create promote signal file \"%s\": %s\n" -msgstr "%s: ìš´ì˜ì „환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %s\n" +msgid "%s: could not create promote signal file \"%s\": %m\n" +msgstr "%s: ìš´ì˜ì „환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %m\n" -#: pg_ctl.c:1217 +#: pg_ctl.c:1214 #, c-format -msgid "%s: could not write promote signal file \"%s\": %s\n" -msgstr "%s: ìš´ì˜ì „환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì— 쓰기 실패: %s\n" +msgid "%s: could not write promote signal file \"%s\": %m\n" +msgstr "%s: ìš´ì˜ì „환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì— 쓰기 실패: %m\n" -#: pg_ctl.c:1225 +#: pg_ctl.c:1222 #, c-format -msgid "%s: could not send promote signal (PID: %d): %s\n" -msgstr "%s: ìš´ì˜ì „환 시그ë„ì„ ì„œë²„(PID: %d)로 보낼 수 ì—†ìŒ: %s\n" +msgid "%s: could not send promote signal (PID: %d): %m\n" +msgstr "%s: ìš´ì˜ì „환 시그ë„ì„ ì„œë²„(PID: %d)로 보낼 수 ì—†ìŒ: %m\n" -#: pg_ctl.c:1228 +#: pg_ctl.c:1225 #, c-format -msgid "%s: could not remove promote signal file \"%s\": %s\n" -msgstr "%s: ìš´ì˜ì „환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì„ 지울 수 ì—†ìŒ: %s\n" +msgid "%s: could not remove promote signal file \"%s\": %m\n" +msgstr "%s: ìš´ì˜ì „환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì„ 지울 수 ì—†ìŒ: %m\n" -#: pg_ctl.c:1235 +#: pg_ctl.c:1232 msgid "waiting for server to promote..." msgstr "서버를 ìš´ì˜ ëª¨ë“œë¡œ 전환하는 중 ..." -#: pg_ctl.c:1239 +#: pg_ctl.c:1236 msgid "server promoted\n" msgstr "ìš´ì˜ ëª¨ë“œ 전환 완료\n" -#: pg_ctl.c:1244 +#: pg_ctl.c:1241 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: 서버를 ì œ ì‹œê°„ì— ìš´ì˜ ëª¨ë“œë¡œ 전환하지 못했ìŒ\n" -#: pg_ctl.c:1250 +#: pg_ctl.c:1247 msgid "server promoting\n" msgstr "서버를 ìš´ì˜ ëª¨ë“œë¡œ 전환합니다\n" -#: pg_ctl.c:1274 +#: pg_ctl.c:1271 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n" -msgstr "%s: 서버 로그 파ì¼ì„ 바꿀 수 ì—†ìŒ; ë‹¨ì¼ ì‚¬ìš©ìž ì„œë²„ê°€ 실행 중임 (PID: %d)\n" +msgstr "" +"%s: 서버 로그 파ì¼ì„ 바꿀 수 ì—†ìŒ; ë‹¨ì¼ ì‚¬ìš©ìž ì„œë²„ê°€ 실행 중임 (PID: %d)\n" -#: pg_ctl.c:1284 +#: pg_ctl.c:1281 #, c-format -msgid "%s: could not create log rotation signal file \"%s\": %s\n" -msgstr "%s: 로그 전환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %s\n" +msgid "%s: could not create log rotation signal file \"%s\": %m\n" +msgstr "%s: 로그 전환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %m\n" -#: pg_ctl.c:1290 +#: pg_ctl.c:1287 #, c-format -msgid "%s: could not write log rotation signal file \"%s\": %s\n" -msgstr "%s: 로그 전환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì— 쓰기 실패: %s\n" +msgid "%s: could not write log rotation signal file \"%s\": %m\n" +msgstr "%s: 로그 전환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì— 쓰기 실패: %m\n" -#: pg_ctl.c:1298 +#: pg_ctl.c:1295 #, c-format -msgid "%s: could not send log rotation signal (PID: %d): %s\n" -msgstr "%s: 로그 전환 시그ë„ì„ ë³´ë‚¼ 수 ì—†ìŒ (PID: %d): %s\n" +msgid "%s: could not send log rotation signal (PID: %d): %m\n" +msgstr "%s: 로그 전환 시그ë„ì„ ë³´ë‚¼ 수 ì—†ìŒ (PID: %d): %m\n" -#: pg_ctl.c:1301 +#: pg_ctl.c:1298 #, c-format -msgid "%s: could not remove log rotation signal file \"%s\": %s\n" -msgstr "%s: 로그 전환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì„ 지울 수 ì—†ìŒ: %s\n" +msgid "%s: could not remove log rotation signal file \"%s\": %m\n" +msgstr "%s: 로그 전환 ì‹œê·¸ë„ íŒŒì¼ì¸ \"%s\" 파ì¼ì„ 지울 수 ì—†ìŒ: %m\n" -#: pg_ctl.c:1306 +#: pg_ctl.c:1303 msgid "server signaled to rotate log file\n" msgstr "서버가 로그 전환 시그ë„ì„ ë°›ì•˜ìŒ\n" -#: pg_ctl.c:1353 +#: pg_ctl.c:1350 #, c-format msgid "%s: single-user server is running (PID: %d)\n" msgstr "%s: 단ì¼ì‚¬ìš©ìž 서버가 실행 중임 (PID: %d)\n" -#: pg_ctl.c:1367 +#: pg_ctl.c:1364 #, c-format msgid "%s: server is running (PID: %d)\n" msgstr "%s: 서버가 실행 중임 (PID: %d)\n" -#: pg_ctl.c:1383 +#: pg_ctl.c:1380 #, c-format msgid "%s: no server running\n" msgstr "%s: ê°€ë™ ì¤‘ì¸ ì„œë²„ê°€ ì—†ìŒ\n" -#: pg_ctl.c:1400 +#: pg_ctl.c:1397 #, c-format -msgid "%s: could not send signal %d (PID: %d): %s\n" -msgstr "%s: %d 시그ë„ì„ ë³´ë‚¼ 수 ì—†ìŒ (PID: %d): %s\n" +msgid "%s: could not send signal %d (PID: %d): %m\n" +msgstr "%s: %d 시그ë„ì„ ë³´ë‚¼ 수 ì—†ìŒ (PID: %d): %m\n" -#: pg_ctl.c:1431 +#: pg_ctl.c:1428 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: 실행 가능한 í”„ë¡œê·¸ëž¨ì„ ì°¾ì„ ìˆ˜ 없습니다\n" -#: pg_ctl.c:1441 +#: pg_ctl.c:1438 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: 실행 가능한 postgres í”„ë¡œê·¸ëž¨ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ\n" -#: pg_ctl.c:1511 pg_ctl.c:1545 +#: pg_ctl.c:1508 pg_ctl.c:1542 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: 서비스 관리ìžë¥¼ ì—´ 수 ì—†ìŒ\n" -#: pg_ctl.c:1517 +#: pg_ctl.c:1514 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: \"%s\" 서비스가 ì´ë¯¸ ë“±ë¡ ë˜ì–´ 있ìŒ\n" -#: pg_ctl.c:1528 +#: pg_ctl.c:1525 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: \"%s\" 서비스를 등ë¡í•  수 ì—†ìŒ: 오류 코드 %lu\n" -#: pg_ctl.c:1551 +#: pg_ctl.c:1548 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: \"%s\" 서비스가 등ë¡ë˜ì–´ 있지 않ìŒ\n" -#: pg_ctl.c:1558 +#: pg_ctl.c:1555 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: \"%s\" 서비스를 ì—´ 수 ì—†ìŒ: 오류 코드 %lu\n" -#: pg_ctl.c:1567 +#: pg_ctl.c:1564 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: \"%s\" 서비스를 서비스 목ë¡ì—서 뺄 수 ì—†ìŒ: 오류 코드 %lu\n" -#: pg_ctl.c:1654 +#: pg_ctl.c:1651 msgid "Waiting for server startup...\n" msgstr "서버를 시작하기 위해 기다리는 중...\n" -#: pg_ctl.c:1657 +#: pg_ctl.c:1654 msgid "Timed out waiting for server startup\n" msgstr "서버 ì‹œìž‘ì„ ê¸°ë‹¤ë¦¬ëŠ” ë™ì•ˆ 시간 초과ë¨\n" -#: pg_ctl.c:1661 +#: pg_ctl.c:1658 msgid "Server started and accepting connections\n" msgstr "서버가 시작ë˜ì—ˆìœ¼ë©° ì—°ê²°ì„ í—ˆìš©í•¨\n" -#: pg_ctl.c:1716 +#: pg_ctl.c:1713 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: \"%s\" 서비스를 시작할 수 ì—†ìŒ: 오류 코드 %lu\n" -#: pg_ctl.c:1789 +#: pg_ctl.c:1786 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: 프로세스 토í°ì„ ì—´ 수 ì—†ìŒ: 오류 코드 %lu\n" -#: pg_ctl.c:1803 +#: pg_ctl.c:1800 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: SID를 할당할 수 ì—†ìŒ: 오류 코드 %lu\n" -#: pg_ctl.c:1829 +#: pg_ctl.c:1826 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: restricted tokenì„ ë§Œë“¤ 수 ì—†ìŒ: 오류 코드 %lu\n" -#: pg_ctl.c:1911 +#: pg_ctl.c:1908 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: ì ‘ê·¼ 권한용 LUID를 구할 수 ì—†ìŒ: 오류 코드 %lu\n" -#: pg_ctl.c:1919 pg_ctl.c:1934 +#: pg_ctl.c:1916 pg_ctl.c:1931 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: í† í° ì •ë³´ë¥¼ 구할 수 ì—†ìŒ: 오류 코드 %lu\n" -#: pg_ctl.c:1928 +#: pg_ctl.c:1925 #, c-format msgid "%s: out of memory\n" msgstr "%s: 메모리 부족\n" -#: pg_ctl.c:1958 +#: pg_ctl.c:1955 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "보다 ìžì„¸í•œ ì‚¬ìš©ë²•ì€ \"%s --help\"\n" -#: pg_ctl.c:1966 +#: pg_ctl.c:1963 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" @@ -509,17 +522,17 @@ msgstr "" "%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL 서버를 초기화, 시작, 중지, 제어하는 ë„구입니다.\n" "\n" -#: pg_ctl.c:1967 +#: pg_ctl.c:1964 #, c-format msgid "Usage:\n" msgstr "사용법:\n" -#: pg_ctl.c:1968 +#: pg_ctl.c:1965 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D ë°ì´í„°ë””렉터리] [-s] [-o 옵션]\n" -#: pg_ctl.c:1969 +#: pg_ctl.c:1966 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -528,12 +541,12 @@ msgstr "" " %s start [-D ë°ì´í„°ë””렉터리] [-l 파ì¼ì´ë¦„] [-W] [-t ì´ˆ] [-s]\n" " [-o 옵션] [-p 경로] [-c]\n" -#: pg_ctl.c:1971 +#: pg_ctl.c:1968 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D ë°ì´í„°ë””렉터리] [-m 중지방법] [-W] [-t ì´ˆ] [-s]\n" -#: pg_ctl.c:1972 +#: pg_ctl.c:1969 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -542,46 +555,48 @@ msgstr "" " %s restart [-D ë°ì´í„°ë””렉터리] [-m 중지방법] [-W] [-t ì´ˆ] [-s]\n" " [-o 옵션] [-c]\n" -#: pg_ctl.c:1974 +#: pg_ctl.c:1971 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D ë°ì´í„°ë””렉터리] [-s]\n" -#: pg_ctl.c:1975 +#: pg_ctl.c:1972 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D ë°ì´í„°ë””렉터리]\n" -#: pg_ctl.c:1976 +#: pg_ctl.c:1973 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D ë°ì´í„°ë””렉터리] [-W] [-t ì´ˆ] [-s]\n" -#: pg_ctl.c:1977 +#: pg_ctl.c:1974 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D ë°ì´í„°ë””렉터리] [-s]\n" -#: pg_ctl.c:1978 +#: pg_ctl.c:1975 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill 시그ë„ì´ë¦„ PID\n" -#: pg_ctl.c:1980 +#: pg_ctl.c:1977 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" -" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" +" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o " +"OPTIONS]\n" msgstr "" -" %s register [-D ë°ì´í„°ë””렉터리] [-N 서비스ì´ë¦„] [-U 사용ìžì´ë¦„] [-P 암호]\n" +" %s register [-D ë°ì´í„°ë””렉터리] [-N 서비스ì´ë¦„] [-U 사용ìžì´ë¦„] [-P ì•”" +"호]\n" " [-S 시작형태] [-e SOURCE] [-w] [-t ì´ˆ] [-o 옵션]\n" -#: pg_ctl.c:1982 +#: pg_ctl.c:1979 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N 서비스ì´ë¦„]\n" -#: pg_ctl.c:1985 +#: pg_ctl.c:1982 #, c-format msgid "" "\n" @@ -590,52 +605,56 @@ msgstr "" "\n" "ì¼ë°˜ 옵션들:\n" -#: pg_ctl.c:1986 +#: pg_ctl.c:1983 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" -msgstr " -D, --pgdata=ë°ì´í„°ë””렉터리 ë°ì´í„°ë² ì´ìФ ìžë£Œê°€ 저장ë˜ì–´ìžˆëŠ” 디렉터리\n" +msgstr "" +" -D, --pgdata=ë°ì´í„°ë””렉터리 ë°ì´í„°ë² ì´ìФ ìžë£Œê°€ 저장ë˜ì–´ìžˆëŠ” 디렉터리\n" -#: pg_ctl.c:1988 +#: pg_ctl.c:1985 #, c-format -msgid " -e SOURCE event source for logging when running as a service\n" -msgstr " -e SOURCE 서비스가 실행 중ì¼ë•Œ ìŒ“ì„ ë¡œê·¸ë¥¼ 위한 ì´ë²¤íЏ 소스\n" +msgid "" +" -e SOURCE event source for logging when running as a service\n" +msgstr "" +" -e SOURCE 서비스가 실행 중ì¼ë•Œ ìŒ“ì„ ë¡œê·¸ë¥¼ 위한 ì´ë²¤íЏ 소스\n" -#: pg_ctl.c:1990 +#: pg_ctl.c:1987 #, c-format msgid " -s, --silent only print errors, no informational messages\n" -msgstr " -s, --silent ì¼ë°˜ì ì¸ 메시지는 ë³´ì´ì§€ 않고, 오류만 보여줌\n" +msgstr "" +" -s, --silent ì¼ë°˜ì ì¸ 메시지는 ë³´ì´ì§€ 않고, 오류만 보여줌\n" -#: pg_ctl.c:1991 +#: pg_ctl.c:1988 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr " -t, --timeout=ì´ˆ -w 옵션 사용 시 대기 시간(ì´ˆ)\n" -#: pg_ctl.c:1992 +#: pg_ctl.c:1989 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: pg_ctl.c:1993 +#: pg_ctl.c:1990 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait ìž‘ì—…ì´ ëë‚  때까지 기다림 (기본값)\n" -#: pg_ctl.c:1994 +#: pg_ctl.c:1991 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait ìž‘ì—…ì´ ëë‚  때까지 기다리지 않ìŒ\n" -#: pg_ctl.c:1995 +#: pg_ctl.c:1992 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: pg_ctl.c:1996 +#: pg_ctl.c:1993 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "-D ì˜µì…˜ì„ ì‚¬ìš©í•˜ì§€ 않으면, PGDATA í™˜ê²½ë³€ìˆ˜ê°’ì„ ì‚¬ìš©í•¨.\n" -#: pg_ctl.c:1998 +#: pg_ctl.c:1995 #, c-format msgid "" "\n" @@ -644,22 +663,22 @@ msgstr "" "\n" "start, restart 때 사용할 수 있는 옵션들:\n" -#: pg_ctl.c:2000 +#: pg_ctl.c:1997 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files 코어 ë¤í”„ 파ì¼ì„ 만듬\n" -#: pg_ctl.c:2002 +#: pg_ctl.c:1999 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files ì´ í”Œëž«í¼ì—서는 사용할 수 ì—†ìŒ\n" -#: pg_ctl.c:2004 +#: pg_ctl.c:2001 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr " -l, --log=ë¡œê·¸íŒŒì¼ ì„œë²„ 로그를 ì´ ë¡œê·¸íŒŒì¼ì— 기ë¡í•¨\n" -#: pg_ctl.c:2005 +#: pg_ctl.c:2002 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" @@ -668,12 +687,12 @@ msgstr "" " -o, --options=옵션들 PostgreSQL ì„œë²„í”„ë¡œê·¸ëž¨ì¸ postgres나 initdb\n" " 명령ì—서 사용할 명령행 옵션들\n" -#: pg_ctl.c:2007 +#: pg_ctl.c:2004 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p PATH-TO-POSTGRES ë³´í†µì€ í•„ìš”ì¹˜ 않ìŒ\n" -#: pg_ctl.c:2008 +#: pg_ctl.c:2005 #, c-format msgid "" "\n" @@ -682,12 +701,14 @@ msgstr "" "\n" "stop, restart 때 사용 í•  수 있는 옵션들:\n" -#: pg_ctl.c:2009 +#: pg_ctl.c:2006 #, c-format -msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" -msgstr " -m, --mode=모드 모드는 \"smart\", \"fast\", \"immediate\" 중 하나\n" +msgid "" +" -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" +msgstr "" +" -m, --mode=모드 모드는 \"smart\", \"fast\", \"immediate\" 중 하나\n" -#: pg_ctl.c:2011 +#: pg_ctl.c:2008 #, c-format msgid "" "\n" @@ -696,22 +717,26 @@ msgstr "" "\n" "중지방법 설명:\n" -#: pg_ctl.c:2012 +#: pg_ctl.c:2009 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart 모든 í´ë¼ì´ì–¸íŠ¸ì˜ ì—°ê²°ì´ ëŠê¸°ê²Œ ë˜ë©´ 중지 ë¨\n" -#: pg_ctl.c:2013 +#: pg_ctl.c:2010 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" -msgstr " fast í´ë¼ì´ì–¸íŠ¸ì˜ ì—°ê²°ì„ ê°•ì œë¡œ ëŠê³  ì •ìƒì ìœ¼ë¡œ 중지 ë¨ (기본값)\n" +msgstr "" +" fast í´ë¼ì´ì–¸íŠ¸ì˜ ì—°ê²°ì„ ê°•ì œë¡œ ëŠê³  ì •ìƒì ìœ¼ë¡œ 중지 ë¨ (기본값)\n" -#: pg_ctl.c:2014 +#: pg_ctl.c:2011 #, c-format -msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" -msgstr " immediate 그냥 무조건 중지함; 다시 시작할 때 복구 ìž‘ì—…ì„ í•  ìˆ˜ë„ ìžˆìŒ\n" +msgid "" +" immediate quit without complete shutdown; will lead to recovery on " +"restart\n" +msgstr "" +" immediate 그냥 무조건 중지함; 다시 시작할 때 복구 ìž‘ì—…ì„ í•  ìˆ˜ë„ ìžˆìŒ\n" -#: pg_ctl.c:2016 +#: pg_ctl.c:2013 #, c-format msgid "" "\n" @@ -720,7 +745,7 @@ msgstr "" "\n" "사용할 수 있는 중지용(for kill) ì‹œê·¸ë„ ì´ë¦„:\n" -#: pg_ctl.c:2020 +#: pg_ctl.c:2017 #, c-format msgid "" "\n" @@ -729,27 +754,28 @@ msgstr "" "\n" "서비스 등ë¡/제거용 옵션들:\n" -#: pg_ctl.c:2021 +#: pg_ctl.c:2018 #, c-format -msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" +msgid "" +" -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N SERVICENAME 서비스 목ë¡ì— 등ë¡ë  PostgreSQL 서비스 ì´ë¦„\n" -#: pg_ctl.c:2022 +#: pg_ctl.c:2019 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr " -P PASSWORD ì´ ì„œë¹„ìŠ¤ë¥¼ 실행할 사용ìžì˜ 암호\n" -#: pg_ctl.c:2023 +#: pg_ctl.c:2020 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr " -U USERNAME ì´ ì„œë¹„ìŠ¤ë¥¼ 실행할 ì‚¬ìš©ìž ì´ë¦„\n" -#: pg_ctl.c:2024 +#: pg_ctl.c:2021 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S 시작형태 서비스로 등ë¡ëœ PostgreSQL 서버 시작 방법\n" -#: pg_ctl.c:2026 +#: pg_ctl.c:2023 #, c-format msgid "" "\n" @@ -758,17 +784,18 @@ msgstr "" "\n" "시작형태 설명:\n" -#: pg_ctl.c:2027 +#: pg_ctl.c:2024 #, c-format -msgid " auto start service automatically during system startup (default)\n" +msgid "" +" auto start service automatically during system startup (default)\n" msgstr " auto ì‹œìŠ¤í…œì´ ì‹œìž‘ë˜ë©´ ìžë™ìœ¼ë¡œ 서비스가 ì‹œìž‘ë¨ (초기값)\n" -#: pg_ctl.c:2028 +#: pg_ctl.c:2025 #, c-format msgid " demand start service on demand\n" msgstr " demand ìˆ˜ë™ ì‹œìž‘\n" -#: pg_ctl.c:2031 +#: pg_ctl.c:2028 #, c-format msgid "" "\n" @@ -777,37 +804,37 @@ msgstr "" "\n" "ë¬¸ì œì  ë³´ê³  주소: <%s>\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2029 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페ì´ì§€: <%s>\n" -#: pg_ctl.c:2057 +#: pg_ctl.c:2054 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: ìž˜ëª»ëœ ì¤‘ì§€ 방법 \"%s\"\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:2083 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: ìž˜ëª»ëœ ì‹œê·¸ë„ ì´ë¦„ \"%s\"\n" -#: pg_ctl.c:2103 +#: pg_ctl.c:2100 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: 알 수 없는 시작형태 \"%s\"\n" -#: pg_ctl.c:2159 +#: pg_ctl.c:2156 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: \"%s\" 명령ì—서 사용할 ë°ì´í„° 디렉터리를 알 수 ì—†ìŒ\n" -#: pg_ctl.c:2182 +#: pg_ctl.c:2179 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: 컨트롤 파ì¼ì´ 깨졌ìŒ\n" -#: pg_ctl.c:2250 +#: pg_ctl.c:2247 #, c-format msgid "" "%s: cannot be run as root\n" @@ -818,65 +845,33 @@ msgstr "" "ì‹œìŠ¤í…œê´€ë¦¬ìž ê¶Œí•œì´ ì—†ëŠ”, ì„œë²„í”„ë¡œì„¸ìŠ¤ì˜ ì†Œìœ ì£¼ê°€ ë  ì¼ë°˜ 사용ìžë¡œ\n" "ë¡œê·¸ì¸ í•´ì„œ(\"su\", \"runas\" ê°™ì€ ëª…ë ¹ ì´ìš©) 실행하십시오.\n" -#: pg_ctl.c:2333 +#: pg_ctl.c:2319 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: -S ì˜µì…˜ì€ ì´ ìš´ì˜ì²´ì œì—서는 ì§€ì›í•˜ì§€ 않ìŒ\n" -#: pg_ctl.c:2370 -#, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: 너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë“¤ (시작 \"%s\")\n" - -#: pg_ctl.c:2396 +#: pg_ctl.c:2375 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: kill ìž‘ì—…ì— í•„ìš”í•œ ì¸ìˆ˜ê°€ 빠졌습니다\n" -#: pg_ctl.c:2414 +#: pg_ctl.c:2393 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: 알 수 없는 작업 모드 \"%s\"\n" -#: pg_ctl.c:2424 +#: pg_ctl.c:2402 +#, c-format +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: 너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë“¤ (시작 \"%s\")\n" + +#: pg_ctl.c:2409 #, c-format msgid "%s: no operation specified\n" msgstr "%s: 수행할 ìž‘ì—…ì„ ì§€ì •í•˜ì§€ 않았습니다\n" -#: pg_ctl.c:2445 +#: pg_ctl.c:2430 #, c-format -msgid "%s: no database directory specified and environment variable PGDATA unset\n" +msgid "" +"%s: no database directory specified and environment variable PGDATA unset\n" msgstr "%s: -D ì˜µì…˜ë„ ì—†ê³ , PGDATA í™˜ê²½ë³€ìˆ˜ê°’ë„ ì§€ì •ë˜ì–´ 있지 않습니다.\n" - -#, c-format -#~ msgid "" -#~ "The program \"%s\" is needed by %s but was not found in the\n" -#~ "same directory as \"%s\".\n" -#~ "Check your installation.\n" -#~ msgstr "" -#~ "\"%s\" í”„ë¡œê·¸ëž¨ì€ %s ì—서 필요로 합니다. 그런ë°, ì´ íŒŒì¼ì´\n" -#~ "\"%s\" 디렉터리 ì•ˆì— ì—†ìŠµë‹ˆë‹¤.\n" -#~ "설치 ìƒíƒœë¥¼ 확ì¸í•´ 주십시오.\n" - -#, c-format -#~ msgid "" -#~ "The program \"%s\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation.\n" -#~ msgstr "" -#~ "\"%s\" í”„ë¡œê·¸ëž¨ì„ \"%s\" ì—서 필요해서 찾았지만 ì´ íŒŒì¼ì€\n" -#~ "%s 버전과 같지 않습니다.\n" -#~ "설치 ìƒíƒœë¥¼ 확ì¸í•´ 주십시오.\n" - -#~ msgid "" -#~ "WARNING: online backup mode is active\n" -#~ "Shutdown will not complete until pg_stop_backup() is called.\n" -#~ "\n" -#~ msgstr "" -#~ "경고: 온ë¼ì¸ 백업 모드가 활성 ìƒíƒœìž…니다.\n" -#~ "pg_stop_backup()ì´ í˜¸ì¶œë  ë•Œê¹Œì§€ 종료가 완료ë˜ì§€ 않습니다.\n" -#~ "\n" - -#, c-format -#~ msgid "pclose failed: %m" -#~ msgstr "pclose 실패: %m" diff --git a/src/bin/pg_ctl/po/meson.build b/src/bin/pg_ctl/po/meson.build index 3d35f7ad2112b..03a259a61d617 100644 --- a/src/bin/pg_ctl/po/meson.build +++ b/src/bin/pg_ctl/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_ctl-' + pg_version_major.to_string())] diff --git a/src/bin/pg_ctl/po/pt_BR.po b/src/bin/pg_ctl/po/pt_BR.po index ba9da96b93c8d..b519356774200 100644 --- a/src/bin/pg_ctl/po/pt_BR.po +++ b/src/bin/pg_ctl/po/pt_BR.po @@ -1,16 +1,16 @@ # Brazilian Portuguese message translation file for pg_ctl # -# Copyright (C) 2004-2022 PostgreSQL Global Development Group +# Copyright (C) 2004-2023 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # -# Euler Taveira , 2004-2022. +# Euler Taveira , 2004-2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-24 03:48+0000\n" -"PO-Revision-Date: 2023-04-24 09:16+0200\n" +"POT-Creation-Date: 2024-01-02 13:01-0300\n" +"PO-Revision-Date: 2005-10-04 22:15-0300\n" "Last-Translator: Euler Taveira \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" @@ -34,10 +34,9 @@ msgid "could not find a \"%s\" to execute" msgstr "não pôde encontrar o \"%s\" para executá-lo" #: ../../common/exec.c:250 -#, fuzzy, c-format -#| msgid "could not reopen file \"%s\" as stderr: %m" +#, c-format msgid "could not resolve path \"%s\" to absolute form: %m" -msgstr "não pôde reabrir arquivo \"%s\" como saída stderr: %m" +msgstr "não pôde resolver caminho \"%s\" para forma absoluta: %m" #: ../../common/exec.c:412 #, c-format diff --git a/src/bin/pg_ctl/po/ru.po b/src/bin/pg_ctl/po/ru.po index c8b21affa51a4..8f9a0a24aef49 100644 --- a/src/bin/pg_ctl/po/ru.po +++ b/src/bin/pg_ctl/po/ru.po @@ -6,54 +6,73 @@ # Sergey Burladyan , 2009, 2012. # Andrey Sudnik , 2010. # Dmitriy Olshevskiy , 2014. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: pg_ctl (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-24 03:48+0000\n" -"PO-Revision-Date: 2023-04-24 09:19+0200\n" +"POT-Creation-Date: 2025-02-08 07:44+0200\n" +"PO-Revision-Date: 2024-09-07 06:47+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: ../../common/exec.c:172 +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неÑоответÑтвие порÑдка байт" + +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "неверный иÑполнÑемый файл \"%s\": %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\": %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "не удалоÑÑŒ найти запуÑкаемый файл \"%s\"" -#: ../../common/exec.c:250 -#, fuzzy, c-format -#| msgid "could not reopen file \"%s\" as stderr: %m" +#: ../../common/exec.c:252 +#, c-format msgid "could not resolve path \"%s\" to absolute form: %m" -msgstr "открыть файл \"%s\" как stderr не удалоÑÑŒ: %m" +msgstr "не удалоÑÑŒ преобразовать отноÑительный путь \"%s\" в абÑолютный: %m" + +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "не удалоÑÑŒ выполнить команду \"%s\": %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать вывод команды \"%s\": %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "команда \"%s\" не выдала данные" -#: ../../common/exec.c:412 +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "нехватка памÑти" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 -#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 +#: ../../port/path.c:830 ../../port/path.c:867 ../../port/path.c:884 #, c-format msgid "out of memory\n" msgstr "нехватка памÑти\n" @@ -91,125 +110,133 @@ msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %d: #: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" -msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным ÑоÑтоÑнием %d" +msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным кодом ÑоÑтоÑÐ½Ð¸Ñ %d" -#: ../../port/path.c:775 +#: ../../port/path.c:852 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "не удалоÑÑŒ определить текущий рабочий каталог: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "не удалоÑÑŒ определить текущий рабочий каталог: %m\n" -#: pg_ctl.c:255 +#: pg_ctl.c:254 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s: каталог \"%s\" не ÑущеÑтвует\n" -#: pg_ctl.c:258 +#: pg_ctl.c:257 #, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: ошибка доÑтупа к каталогу \"%s\": %s\n" +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: ошибка при обращении к каталогу \"%s\": %m\n" -#: pg_ctl.c:271 +#: pg_ctl.c:270 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s: каталог \"%s\" не Ñодержит Ñтруктуры клаÑтера баз данных\n" -#: pg_ctl.c:284 +#: pg_ctl.c:283 #, c-format -msgid "%s: could not open PID file \"%s\": %s\n" -msgstr "%s: не удалоÑÑŒ открыть файл PID \"%s\": %s\n" +msgid "%s: could not open PID file \"%s\": %m\n" +msgstr "%s: не удалоÑÑŒ открыть файл PID \"%s\": %m\n" -#: pg_ctl.c:293 +#: pg_ctl.c:292 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s: файл PID \"%s\" пуÑÑ‚\n" -#: pg_ctl.c:296 +#: pg_ctl.c:295 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s: неверные данные в файле PID \"%s\"\n" -#: pg_ctl.c:458 pg_ctl.c:500 +#: pg_ctl.c:457 pg_ctl.c:499 #, c-format -msgid "%s: could not start server: %s\n" -msgstr "%s: не удалоÑÑŒ запуÑтить Ñервер: %s\n" +msgid "%s: could not start server: %m\n" +msgstr "%s: не удалоÑÑŒ запуÑтить Ñервер: %m\n" -#: pg_ctl.c:478 +#: pg_ctl.c:477 #, c-format -msgid "%s: could not start server due to setsid() failure: %s\n" -msgstr "%s: не удалоÑÑŒ запуÑтить Ñервер из-за ошибки в setsid(): %s\n" +msgid "%s: could not start server due to setsid() failure: %m\n" +msgstr "%s: не удалоÑÑŒ запуÑтить Ñервер из-за ошибки в setsid(): %m\n" -#: pg_ctl.c:548 +#: pg_ctl.c:547 #, c-format -msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s: не удалоÑÑŒ открыть файл протокола \"%s\": %s\n" +msgid "%s: could not open log file \"%s\": %m\n" +msgstr "%s: не удалоÑÑŒ открыть файл протокола \"%s\": %m\n" -#: pg_ctl.c:565 +#: pg_ctl.c:564 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s: не удалоÑÑŒ запуÑтить Ñервер (код ошибки: %lu)\n" -#: pg_ctl.c:782 +#: pg_ctl.c:781 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" -msgstr "%s: не удалоÑÑŒ ограничить размер дампа памÑти; запрещено жёÑтким ограничением\n" +msgstr "" +"%s: не удалоÑÑŒ ограничить размер дампа памÑти; запрещено жёÑтким " +"ограничением\n" -#: pg_ctl.c:808 +#: pg_ctl.c:807 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s: не удалоÑÑŒ прочитать файл \"%s\"\n" -#: pg_ctl.c:813 +#: pg_ctl.c:812 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: в файле параметров \"%s\" должна быть ровно одна Ñтрока\n" -#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107 +#: pg_ctl.c:854 pg_ctl.c:1038 pg_ctl.c:1105 #, c-format -msgid "%s: could not send stop signal (PID: %d): %s\n" -msgstr "%s: не удалоÑÑŒ отправить Ñигнал оÑтановки (PID: %d): %s\n" +msgid "%s: could not send stop signal (PID: %d): %m\n" +msgstr "%s: не удалоÑÑŒ отправить Ñигнал оÑтановки (PID: %d): %m\n" -#: pg_ctl.c:883 +#: pg_ctl.c:882 #, c-format -msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" +msgid "" +"program \"%s\" is needed by %s but was not found in the same directory as " +"\"%s\"\n" msgstr "программа \"%s\" нужна Ð´Ð»Ñ %s, но она не найдена в каталоге \"%s\"\n" -#: pg_ctl.c:886 +#: pg_ctl.c:885 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" -msgstr "программа \"%s\" найдена программой \"%s\", но её верÑÐ¸Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð¾Ñ‚ верÑии %s\n" +msgstr "" +"программа \"%s\" найдена программой \"%s\", но её верÑÐ¸Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð¾Ñ‚ " +"верÑии %s\n" -#: pg_ctl.c:918 +#: pg_ctl.c:917 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s: Ñбой при инициализации ÑиÑтемы баз данных\n" -#: pg_ctl.c:933 +#: pg_ctl.c:932 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" -msgstr "%s: возможно, уже работает другой Ñервер; вÑÑ‘ же пробуем запуÑтить Ñтот Ñервер\n" +msgstr "" +"%s: возможно, уже работает другой Ñервер; вÑÑ‘ же пробуем запуÑтить Ñтот " +"Ñервер\n" -#: pg_ctl.c:981 +#: pg_ctl.c:980 msgid "waiting for server to start..." msgstr "ожидание запуÑка Ñервера..." -#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238 +#: pg_ctl.c:985 pg_ctl.c:1061 pg_ctl.c:1123 pg_ctl.c:1235 msgid " done\n" msgstr " готово\n" -#: pg_ctl.c:987 +#: pg_ctl.c:986 msgid "server started\n" msgstr "Ñервер запущен\n" -#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243 +#: pg_ctl.c:989 pg_ctl.c:995 pg_ctl.c:1240 msgid " stopped waiting\n" msgstr " прекращение ожиданиÑ\n" -#: pg_ctl.c:991 +#: pg_ctl.c:990 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: Ñервер не запуÑтилÑÑ Ð·Ð° отведённое времÑ\n" -#: pg_ctl.c:997 +#: pg_ctl.c:996 #, c-format msgid "" "%s: could not start server\n" @@ -218,42 +245,43 @@ msgstr "" "%s: не удалоÑÑŒ запуÑтить Ñервер\n" "Изучите протокол выполнениÑ.\n" -#: pg_ctl.c:1005 +#: pg_ctl.c:1004 msgid "server starting\n" msgstr "Ñервер запуÑкаетÑÑ\n" -#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267 +#: pg_ctl.c:1023 pg_ctl.c:1081 pg_ctl.c:1144 pg_ctl.c:1183 pg_ctl.c:1264 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: файл PID \"%s\" не ÑущеÑтвует\n" -#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268 +#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1145 pg_ctl.c:1184 pg_ctl.c:1265 msgid "Is server running?\n" msgstr "Запущен ли Ñервер?\n" -#: pg_ctl.c:1031 +#: pg_ctl.c:1030 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %d)\n" -msgstr "%s: оÑтановить Ñервер Ñ PID %d Ð½ÐµÐ»ÑŒÐ·Ñ - он запущен в монопольном режиме\n" +msgstr "" +"%s: оÑтановить Ñервер Ñ PID %d Ð½ÐµÐ»ÑŒÐ·Ñ - он запущен в монопольном режиме\n" -#: pg_ctl.c:1046 +#: pg_ctl.c:1044 msgid "server shutting down\n" msgstr "Ñервер оÑтанавливаетÑÑ\n" -#: pg_ctl.c:1051 pg_ctl.c:1112 +#: pg_ctl.c:1049 pg_ctl.c:1109 msgid "waiting for server to shut down..." msgstr "ожидание Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñервера..." -#: pg_ctl.c:1055 pg_ctl.c:1117 +#: pg_ctl.c:1053 pg_ctl.c:1114 msgid " failed\n" msgstr " ошибка\n" -#: pg_ctl.c:1057 pg_ctl.c:1119 +#: pg_ctl.c:1055 pg_ctl.c:1116 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: Ñервер не оÑтанавливаетÑÑ\n" -#: pg_ctl.c:1059 pg_ctl.c:1121 +#: pg_ctl.c:1057 pg_ctl.c:1118 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -261,254 +289,263 @@ msgstr "" "ПОДСКÐЗКÐ: Параметр \"-m fast\" может ÑброÑить ÑеанÑÑ‹ принудительно,\n" "не дожидаÑÑÑŒ, пока они завершатÑÑ Ñами.\n" -#: pg_ctl.c:1065 pg_ctl.c:1127 +#: pg_ctl.c:1063 pg_ctl.c:1124 msgid "server stopped\n" msgstr "Ñервер оÑтановлен\n" -#: pg_ctl.c:1086 +#: pg_ctl.c:1084 msgid "trying to start server anyway\n" msgstr "производитÑÑ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° запуÑка Ñервера в любом Ñлучае\n" -#: pg_ctl.c:1095 +#: pg_ctl.c:1093 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %d)\n" -msgstr "%s: перезапуÑтить Ñервер Ñ PID %d Ð½ÐµÐ»ÑŒÐ·Ñ - он запущен в монопольном режиме\n" +msgstr "" +"%s: перезапуÑтить Ñервер Ñ PID %d Ð½ÐµÐ»ÑŒÐ·Ñ - он запущен в монопольном режиме\n" -#: pg_ctl.c:1098 pg_ctl.c:1157 +#: pg_ctl.c:1096 pg_ctl.c:1154 msgid "Please terminate the single-user server and try again.\n" msgstr "ПожалуйÑта, оÑтановите его и повторите попытку.\n" -#: pg_ctl.c:1131 +#: pg_ctl.c:1128 #, c-format msgid "%s: old server process (PID: %d) seems to be gone\n" msgstr "%s: похоже, что Ñтарый Ñерверный процеÑÑ (PID: %d) иÑчез\n" -#: pg_ctl.c:1133 +#: pg_ctl.c:1130 msgid "starting server anyway\n" msgstr "Ñервер запуÑкаетÑÑ, неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° Ñто\n" -#: pg_ctl.c:1154 +#: pg_ctl.c:1151 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %d)\n" -msgstr "%s: перезагрузить Ñервер Ñ PID %d Ð½ÐµÐ»ÑŒÐ·Ñ - он запущен в монопольном режиме\n" +msgstr "" +"%s: перезагрузить Ñервер Ñ PID %d Ð½ÐµÐ»ÑŒÐ·Ñ - он запущен в монопольном режиме\n" -#: pg_ctl.c:1163 +#: pg_ctl.c:1160 #, c-format -msgid "%s: could not send reload signal (PID: %d): %s\n" -msgstr "%s: не удалоÑÑŒ отправить Ñигнал перезагрузки (PID: %d): %s\n" +msgid "%s: could not send reload signal (PID: %d): %m\n" +msgstr "%s: не удалоÑÑŒ отправить Ñигнал перезагрузки (PID: %d): %m\n" -#: pg_ctl.c:1168 +#: pg_ctl.c:1165 msgid "server signaled\n" msgstr "Ñигнал отправлен Ñерверу\n" -#: pg_ctl.c:1193 +#: pg_ctl.c:1190 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %d)\n" -msgstr "%s: повыÑить Ñервер Ñ PID %d Ð½ÐµÐ»ÑŒÐ·Ñ - он выполнÑетÑÑ Ð² монопольном режиме\n" +msgstr "" +"%s: повыÑить Ñервер Ñ PID %d Ð½ÐµÐ»ÑŒÐ·Ñ - он выполнÑетÑÑ Ð² монопольном режиме\n" -#: pg_ctl.c:1201 +#: pg_ctl.c:1198 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s: повыÑить Ñервер Ð½ÐµÐ»ÑŒÐ·Ñ - он работает не в режиме резерва\n" -#: pg_ctl.c:1211 +#: pg_ctl.c:1208 #, c-format -msgid "%s: could not create promote signal file \"%s\": %s\n" -msgstr "%s: не удалоÑÑŒ Ñоздать файл \"%s\" Ñ Ñигналом к повышению: %s\n" +msgid "%s: could not create promote signal file \"%s\": %m\n" +msgstr "%s: не удалоÑÑŒ Ñоздать файл \"%s\" Ñ Ñигналом к повышению: %m\n" -#: pg_ctl.c:1217 +#: pg_ctl.c:1214 #, c-format -msgid "%s: could not write promote signal file \"%s\": %s\n" -msgstr "%s: не удалоÑÑŒ запиÑать файл \"%s\" Ñ Ñигналом к повышению: %s\n" +msgid "%s: could not write promote signal file \"%s\": %m\n" +msgstr "%s: не удалоÑÑŒ запиÑать файл \"%s\" Ñ Ñигналом к повышению: %m\n" -#: pg_ctl.c:1225 +#: pg_ctl.c:1222 #, c-format -msgid "%s: could not send promote signal (PID: %d): %s\n" -msgstr "%s: не удалоÑÑŒ отправить Ñигнал к повышению (PID: %d): %s\n" +msgid "%s: could not send promote signal (PID: %d): %m\n" +msgstr "%s: не удалоÑÑŒ отправить Ñигнал к повышению (PID: %d): %m\n" -#: pg_ctl.c:1228 +#: pg_ctl.c:1225 #, c-format -msgid "%s: could not remove promote signal file \"%s\": %s\n" -msgstr "%s: ошибка при удалении файла \"%s\" Ñ Ñигналом к повышению: %s\n" +msgid "%s: could not remove promote signal file \"%s\": %m\n" +msgstr "%s: ошибка при удалении файла \"%s\" Ñ Ñигналом к повышению: %m\n" -#: pg_ctl.c:1235 +#: pg_ctl.c:1232 msgid "waiting for server to promote..." msgstr "ожидание Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ñервера..." -#: pg_ctl.c:1239 +#: pg_ctl.c:1236 msgid "server promoted\n" msgstr "Ñервер повышен\n" -#: pg_ctl.c:1244 +#: pg_ctl.c:1241 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: повышение Ñервера не завершилоÑÑŒ за отведённое времÑ\n" -#: pg_ctl.c:1250 +#: pg_ctl.c:1247 msgid "server promoting\n" msgstr "Ñервер повышаетÑÑ\n" -#: pg_ctl.c:1274 +#: pg_ctl.c:1271 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n" -msgstr "%s: не удалоÑÑŒ прокрутить файл журнала; Ñервер работает в монопольном режиме (PID: %d)\n" +msgstr "" +"%s: не удалоÑÑŒ прокрутить файл журнала; Ñервер работает в монопольном режиме " +"(PID: %d)\n" -#: pg_ctl.c:1284 +#: pg_ctl.c:1281 #, c-format -msgid "%s: could not create log rotation signal file \"%s\": %s\n" -msgstr "%s: не удалоÑÑŒ Ñоздать файл \"%s\" Ñ Ñигналом к прокрутке журнала: %s\n" +msgid "%s: could not create log rotation signal file \"%s\": %m\n" +msgstr "" +"%s: не удалоÑÑŒ Ñоздать файл \"%s\" Ñ Ñигналом к прокрутке журнала: %m\n" -#: pg_ctl.c:1290 +#: pg_ctl.c:1287 #, c-format -msgid "%s: could not write log rotation signal file \"%s\": %s\n" -msgstr "%s: не удалоÑÑŒ запиÑать файл \"%s\" Ñ Ñигналом к прокрутке журнала: %s\n" +msgid "%s: could not write log rotation signal file \"%s\": %m\n" +msgstr "" +"%s: не удалоÑÑŒ запиÑать файл \"%s\" Ñ Ñигналом к прокрутке журнала: %m\n" -#: pg_ctl.c:1298 +#: pg_ctl.c:1295 #, c-format -msgid "%s: could not send log rotation signal (PID: %d): %s\n" -msgstr "%s: не удалоÑÑŒ отправить Ñигнал к прокрутке журнала (PID: %d): %s\n" +msgid "%s: could not send log rotation signal (PID: %d): %m\n" +msgstr "%s: не удалоÑÑŒ отправить Ñигнал к прокрутке журнала (PID: %d): %m\n" -#: pg_ctl.c:1301 +#: pg_ctl.c:1298 #, c-format -msgid "%s: could not remove log rotation signal file \"%s\": %s\n" -msgstr "%s: ошибка при удалении файла \"%s\" Ñ Ñигналом к прокрутке журнала: %s\n" +msgid "%s: could not remove log rotation signal file \"%s\": %m\n" +msgstr "" +"%s: ошибка при удалении файла \"%s\" Ñ Ñигналом к прокрутке журнала: %m\n" -#: pg_ctl.c:1306 +#: pg_ctl.c:1303 msgid "server signaled to rotate log file\n" msgstr "Ñигнал Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ¸ файла журнала отправлен Ñерверу\n" -#: pg_ctl.c:1353 +#: pg_ctl.c:1350 #, c-format msgid "%s: single-user server is running (PID: %d)\n" msgstr "%s: Ñервер работает в монопольном режиме (PID: %d)\n" -#: pg_ctl.c:1367 +#: pg_ctl.c:1364 #, c-format msgid "%s: server is running (PID: %d)\n" msgstr "%s: Ñервер работает (PID: %d)\n" -#: pg_ctl.c:1383 +#: pg_ctl.c:1380 #, c-format msgid "%s: no server running\n" msgstr "%s: Ñервер не работает\n" -#: pg_ctl.c:1400 +#: pg_ctl.c:1397 #, c-format -msgid "%s: could not send signal %d (PID: %d): %s\n" -msgstr "%s: не удалоÑÑŒ отправить Ñигнал %d (PID: %d): %s\n" +msgid "%s: could not send signal %d (PID: %d): %m\n" +msgstr "%s: не удалоÑÑŒ отправить Ñигнал %d (PID: %d): %m\n" -#: pg_ctl.c:1431 +#: pg_ctl.c:1428 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: не удалоÑÑŒ найти Ñвой иÑполнÑемый файл\n" -#: pg_ctl.c:1441 +#: pg_ctl.c:1438 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: не удалоÑÑŒ найти иÑполнÑемый файл postgres\n" -#: pg_ctl.c:1511 pg_ctl.c:1545 +#: pg_ctl.c:1508 pg_ctl.c:1542 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: не удалоÑÑŒ открыть менеджер Ñлужб\n" -#: pg_ctl.c:1517 +#: pg_ctl.c:1514 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: Ñлужба \"%s\" уже зарегиÑтрирована\n" -#: pg_ctl.c:1528 +#: pg_ctl.c:1525 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: не удалоÑÑŒ зарегиÑтрировать Ñлужбу \"%s\" (код ошибки: %lu)\n" -#: pg_ctl.c:1551 +#: pg_ctl.c:1548 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: Ñлужба \"%s\" не зарегиÑтрирована\n" -#: pg_ctl.c:1558 +#: pg_ctl.c:1555 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: не удалоÑÑŒ открыть Ñлужбу \"%s\" (код ошибки: %lu)\n" -#: pg_ctl.c:1567 +#: pg_ctl.c:1564 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: ошибка при удалении Ñлужбы \"%s\" (код ошибки: %lu)\n" -#: pg_ctl.c:1654 +#: pg_ctl.c:1651 msgid "Waiting for server startup...\n" msgstr "Ожидание запуÑка Ñервера...\n" -#: pg_ctl.c:1657 +#: pg_ctl.c:1654 msgid "Timed out waiting for server startup\n" msgstr "Превышено Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿ÑƒÑка Ñервера\n" -#: pg_ctl.c:1661 +#: pg_ctl.c:1658 msgid "Server started and accepting connections\n" msgstr "Сервер запущен и принимает подключениÑ\n" -#: pg_ctl.c:1716 +#: pg_ctl.c:1713 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: не удалоÑÑŒ запуÑтить Ñлужбу \"%s\" (код ошибки: %lu)\n" -#: pg_ctl.c:1789 +#: pg_ctl.c:1786 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: не удалоÑÑŒ открыть маркер процеÑÑа (код ошибки: %lu)\n" -#: pg_ctl.c:1803 +#: pg_ctl.c:1800 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: не удалоÑÑŒ подготовить Ñтруктуры SID (код ошибки: %lu)\n" -#: pg_ctl.c:1829 +#: pg_ctl.c:1826 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: не удалоÑÑŒ Ñоздать ограниченный маркер (код ошибки: %lu)\n" -#: pg_ctl.c:1911 +#: pg_ctl.c:1908 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: не удалоÑÑŒ получить LUID Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð²Ð¸Ð»ÐµÐ³Ð¸Ð¹ (код ошибки: %lu)\n" -#: pg_ctl.c:1919 pg_ctl.c:1934 +#: pg_ctl.c:1916 pg_ctl.c:1931 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: не удалоÑÑŒ получить информацию о маркере (код ошибки: %lu)\n" -#: pg_ctl.c:1928 +#: pg_ctl.c:1925 #, c-format msgid "%s: out of memory\n" msgstr "%s: нехватка памÑти\n" -#: pg_ctl.c:1958 +#: pg_ctl.c:1955 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\".\n" -#: pg_ctl.c:1966 +#: pg_ctl.c:1963 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" "\n" msgstr "" -"%s - Ñто утилита Ð´Ð»Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸, запуÑка, оÑтановки и ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñервером PostgreSQL.\n" +"%s - Ñто утилита Ð´Ð»Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸, запуÑка, оÑтановки и ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñервером " +"PostgreSQL.\n" "\n" -#: pg_ctl.c:1967 +#: pg_ctl.c:1964 #, c-format msgid "Usage:\n" msgstr "ИÑпользование:\n" -#: pg_ctl.c:1968 +#: pg_ctl.c:1965 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-s] [-o ПÐРÐМЕТРЫ]\n" -#: pg_ctl.c:1969 +#: pg_ctl.c:1966 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -517,12 +554,13 @@ msgstr "" " %s start [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-l ИМЯ-ФÐЙЛÐ] [-W] [-t СЕК] [-s]\n" " [-o ПÐРÐМЕТРЫ] [-p ПУТЬ] [-c]\n" -#: pg_ctl.c:1971 +#: pg_ctl.c:1968 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" -msgstr " %s stop [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-m РЕЖИМ-ОСТÐÐОВКИ] [-W] [-t СЕК] [-s]\n" +msgstr "" +" %s stop [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-m РЕЖИМ-ОСТÐÐОВКИ] [-W] [-t СЕК] [-s]\n" -#: pg_ctl.c:1972 +#: pg_ctl.c:1969 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -531,46 +569,49 @@ msgstr "" " %s restart [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-m РЕЖИМ-ОСТÐÐОВКИ] [-W] [-t СЕК] [-s]\n" " [-o ПÐРÐМЕТРЫ] [-c]\n" -#: pg_ctl.c:1974 +#: pg_ctl.c:1971 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-s]\n" -#: pg_ctl.c:1975 +#: pg_ctl.c:1972 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D КÐТÐЛОГ-ДÐÐÐЫХ]\n" -#: pg_ctl.c:1976 +#: pg_ctl.c:1973 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-W] [-t СЕК] [-s]\n" -#: pg_ctl.c:1977 +#: pg_ctl.c:1974 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-s]\n" -#: pg_ctl.c:1978 +#: pg_ctl.c:1975 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill СИГÐÐЛ PID\n" -#: pg_ctl.c:1980 +#: pg_ctl.c:1977 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" -" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" +" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o " +"OPTIONS]\n" msgstr "" -" %s register [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-N ИМЯ-СЛУЖБЫ] [-U ПОЛЬЗОВÐТЕЛЬ] [-P ПÐРОЛЬ]\n" -" [-S ТИП-ЗÐПУСКÐ] [-e ИСТОЧÐИК] [-W] [-t СЕК] [-s] [-o ПÐРÐМЕТРЫ]\n" +" %s register [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-N ИМЯ-СЛУЖБЫ] [-U ПОЛЬЗОВÐТЕЛЬ] [-P " +"ПÐРОЛЬ]\n" +" [-S ТИП-ЗÐПУСКÐ] [-e ИСТОЧÐИК] [-W] [-t СЕК] [-s] [-o " +"ПÐРÐМЕТРЫ]\n" -#: pg_ctl.c:1982 +#: pg_ctl.c:1979 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N ИМЯ-СЛУЖБЫ]\n" -#: pg_ctl.c:1985 +#: pg_ctl.c:1982 #, c-format msgid "" "\n" @@ -579,54 +620,59 @@ msgstr "" "\n" "Общие параметры:\n" -#: pg_ctl.c:1986 +#: pg_ctl.c:1983 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata=КÐТÐЛОГ раÑположение хранилища баз данных\n" -#: pg_ctl.c:1988 +#: pg_ctl.c:1985 #, c-format -msgid " -e SOURCE event source for logging when running as a service\n" +msgid "" +" -e SOURCE event source for logging when running as a service\n" msgstr "" -" -e ИСТОЧÐИК иÑточник Ñобытий, уÑтанавливаемый при запиÑи в журнал,\n" +" -e ИСТОЧÐИК иÑточник Ñобытий, уÑтанавливаемый при запиÑи в " +"журнал,\n" " когда Ñервер работает в виде Ñлужбы\n" -#: pg_ctl.c:1990 +#: pg_ctl.c:1987 #, c-format msgid " -s, --silent only print errors, no informational messages\n" -msgstr " -s, --silent выводить только ошибки, без информационных Ñообщений\n" +msgstr "" +" -s, --silent выводить только ошибки, без информационных " +"Ñообщений\n" -#: pg_ctl.c:1991 +#: pg_ctl.c:1988 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" -msgstr " -t, --timeout=СЕК Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ иÑпользовании параметра -w\n" +msgstr "" +" -t, --timeout=СЕК Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ иÑпользовании параметра -w\n" -#: pg_ctl.c:1992 +#: pg_ctl.c:1989 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: pg_ctl.c:1993 +#: pg_ctl.c:1990 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸ (по умолчанию)\n" -#: pg_ctl.c:1994 +#: pg_ctl.c:1991 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait не ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸\n" -#: pg_ctl.c:1995 +#: pg_ctl.c:1992 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: pg_ctl.c:1996 +#: pg_ctl.c:1993 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "ЕÑли параметр -D опущен, иÑпользуетÑÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA.\n" -#: pg_ctl.c:1998 +#: pg_ctl.c:1995 #, c-format msgid "" "\n" @@ -635,36 +681,39 @@ msgstr "" "\n" "Параметры запуÑка и перезапуÑка:\n" -#: pg_ctl.c:2000 +#: pg_ctl.c:1997 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files указать postgres Ñоздавать дампы памÑти\n" -#: pg_ctl.c:2002 +#: pg_ctl.c:1999 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files неприменимо на Ñтой платформе\n" -#: pg_ctl.c:2004 +#: pg_ctl.c:2001 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" -msgstr " -l, --log=ФÐЙЛ запиÑывать (или добавлÑть) протокол Ñервера в ФÐЙЛ.\n" +msgstr "" +" -l, --log=ФÐЙЛ запиÑывать (или добавлÑть) протокол Ñервера в " +"ФÐЙЛ.\n" -#: pg_ctl.c:2005 +#: pg_ctl.c:2002 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" " (PostgreSQL server executable) or initdb\n" msgstr "" -" -o, --options=ПÐРÐМЕТРЫ передаваемые postgres (иÑполнÑемому файлу PostgreSQL)\n" +" -o, --options=ПÐРÐМЕТРЫ передаваемые postgres (иÑполнÑемому файлу " +"PostgreSQL)\n" " или initdb параметры командной Ñтроки\n" -#: pg_ctl.c:2007 +#: pg_ctl.c:2004 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p ПУТЬ-К-POSTGRES обычно не требуетÑÑ\n" -#: pg_ctl.c:2008 +#: pg_ctl.c:2005 #, c-format msgid "" "\n" @@ -673,12 +722,14 @@ msgstr "" "\n" "Параметры оÑтановки и перезапуÑка:\n" -#: pg_ctl.c:2009 +#: pg_ctl.c:2006 #, c-format -msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" -msgstr " -m, --mode=РЕЖИМ может быть \"smart\", \"fast\" или \"immediate\"\n" +msgid "" +" -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" +msgstr "" +" -m, --mode=РЕЖИМ может быть \"smart\", \"fast\" или \"immediate\"\n" -#: pg_ctl.c:2011 +#: pg_ctl.c:2008 #, c-format msgid "" "\n" @@ -687,24 +738,26 @@ msgstr "" "\n" "Режимы оÑтановки:\n" -#: pg_ctl.c:2012 +#: pg_ctl.c:2009 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart закончить работу поÑле Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð²Ñех клиентов\n" -#: pg_ctl.c:2013 +#: pg_ctl.c:2010 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast закончить Ñразу, в штатном режиме (по умолчанию)\n" -#: pg_ctl.c:2014 +#: pg_ctl.c:2011 #, c-format -msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" +msgid "" +" immediate quit without complete shutdown; will lead to recovery on " +"restart\n" msgstr "" " immediate закончить немедленно, в ÑкÑтренном режиме; влечёт за Ñобой\n" " воÑÑтановление при перезапуÑке\n" -#: pg_ctl.c:2016 +#: pg_ctl.c:2013 #, c-format msgid "" "\n" @@ -713,7 +766,7 @@ msgstr "" "\n" "Разрешённые Ñигналы Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ kill:\n" -#: pg_ctl.c:2020 +#: pg_ctl.c:2017 #, c-format msgid "" "\n" @@ -722,27 +775,30 @@ msgstr "" "\n" "Параметры Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации и удалениÑ:\n" -#: pg_ctl.c:2021 +#: pg_ctl.c:2018 #, c-format -msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" +msgid "" +" -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N ИМЯ-СЛУЖБЫ Ð¸Ð¼Ñ Ñлужбы Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации Ñервера PostgreSQL\n" -#: pg_ctl.c:2022 +#: pg_ctl.c:2019 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" -msgstr " -P ПÐРОЛЬ пароль учётной запиÑи Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации Ñервера PostgreSQL\n" +msgstr "" +" -P ПÐРОЛЬ пароль учётной запиÑи Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации Ñервера PostgreSQL\n" -#: pg_ctl.c:2023 +#: pg_ctl.c:2020 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" -msgstr " -U ПОЛЬЗОВÐТЕЛЬ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации Ñервера PostgreSQL\n" +msgstr "" +" -U ПОЛЬЗОВÐТЕЛЬ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации Ñервера PostgreSQL\n" -#: pg_ctl.c:2024 +#: pg_ctl.c:2021 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S ТИП-ЗÐПУСКРтип запуÑка Ñлужбы Ñервера PostgreSQL\n" -#: pg_ctl.c:2026 +#: pg_ctl.c:2023 #, c-format msgid "" "\n" @@ -751,17 +807,20 @@ msgstr "" "\n" "Типы запуÑка:\n" -#: pg_ctl.c:2027 +#: pg_ctl.c:2024 #, c-format -msgid " auto start service automatically during system startup (default)\n" -msgstr " auto запуÑкать Ñлужбу автоматичеÑки при Ñтарте ÑиÑтемы (по умолчанию)\n" +msgid "" +" auto start service automatically during system startup (default)\n" +msgstr "" +" auto запуÑкать Ñлужбу автоматичеÑки при Ñтарте ÑиÑтемы (по " +"умолчанию)\n" -#: pg_ctl.c:2028 +#: pg_ctl.c:2025 #, c-format msgid " demand start service on demand\n" msgstr " demand запуÑкать Ñлужбу по требованию\n" -#: pg_ctl.c:2031 +#: pg_ctl.c:2028 #, c-format msgid "" "\n" @@ -770,37 +829,37 @@ msgstr "" "\n" "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2029 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" -#: pg_ctl.c:2057 +#: pg_ctl.c:2054 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: неизвеÑтный режим оÑтановки \"%s\"\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:2083 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: нераÑпознанное Ð¸Ð¼Ñ Ñигнала \"%s\"\n" -#: pg_ctl.c:2103 +#: pg_ctl.c:2100 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: нераÑпознанный тип запуÑка \"%s\"\n" -#: pg_ctl.c:2159 +#: pg_ctl.c:2156 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: не удалоÑÑŒ определить каталог данных Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды \"%s\"\n" -#: pg_ctl.c:2182 +#: pg_ctl.c:2179 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: управлÑющий файл, по-видимому, иÑпорчен\n" -#: pg_ctl.c:2250 +#: pg_ctl.c:2247 #, c-format msgid "" "%s: cannot be run as root\n" @@ -811,42 +870,46 @@ msgstr "" "ПожалуйÑта, переключитеÑÑŒ на обычного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (например,\n" "иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ \"su\"), который будет запуÑкать Ñерверный процеÑÑ.\n" -#: pg_ctl.c:2333 +#: pg_ctl.c:2319 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: параметр -S не поддерживаетÑÑ Ð² Ñтой ОС\n" -#: pg_ctl.c:2370 -#, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: Ñлишком много аргументов командной Ñтроки (первый: \"%s\")\n" - -#: pg_ctl.c:2396 +#: pg_ctl.c:2375 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: отÑутÑтвуют аргументы Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° kill\n" -#: pg_ctl.c:2414 +#: pg_ctl.c:2393 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: нераÑпознанный режим работы \"%s\"\n" -#: pg_ctl.c:2424 +#: pg_ctl.c:2402 +#, c-format +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: Ñлишком много аргументов командной Ñтроки (первый: \"%s\")\n" + +#: pg_ctl.c:2409 #, c-format msgid "%s: no operation specified\n" msgstr "%s: команда не указана\n" -#: pg_ctl.c:2445 +#: pg_ctl.c:2430 #, c-format -msgid "%s: no database directory specified and environment variable PGDATA unset\n" -msgstr "%s: каталог баз данных не указан и Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA не уÑтановлена\n" +msgid "" +"%s: no database directory specified and environment variable PGDATA unset\n" +msgstr "" +"%s: каталог баз данных не указан и Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PGDATA не " +"уÑтановлена\n" #~ msgid "" #~ "\n" #~ "%s: -w option cannot use a relative socket directory specification\n" #~ msgstr "" #~ "\n" -#~ "%s: в параметре -w Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ отноÑительный путь к каталогу Ñокетов\n" +#~ "%s: в параметре -w Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ отноÑительный путь к каталогу " +#~ "Ñокетов\n" #~ msgid "" #~ "\n" @@ -867,7 +930,8 @@ msgstr "%s: каталог баз данных не указан и переме #~ "%s: this data directory appears to be running a pre-existing postmaster\n" #~ msgstr "" #~ "\n" -#~ "%s: похоже, что Ñ Ñтим каталогом уже работает управлÑющий процеÑÑ postmaster\n" +#~ "%s: похоже, что Ñ Ñтим каталогом уже работает управлÑющий процеÑÑ " +#~ "postmaster\n" #~ msgid "" #~ "\n" @@ -900,27 +964,40 @@ msgstr "%s: каталог баз данных не указан и переме #~ msgid " %s promote [-w] [-t SECS] [-D DATADIR] [-s]\n" #~ msgstr " %s promote [-w] [-t СЕК] [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-s]\n" -#~ msgid " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n" +#~ msgid "" +#~ " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o " +#~ "\"OPTIONS\"]\n" #~ msgstr "" #~ " %s start [-w] [-t СЕК] [-D КÐТÐЛОГ-ДÐÐÐЫХ] [-s] [-l ИМЯ-ФÐЙЛÐ]\n" #~ " [-o \"ПÐРÐМЕТРЫ\"]\n" -#~ msgid " -I, --idempotent don't error if server already running or stopped\n" -#~ msgstr " -I, --idempotent не Ñчитать ошибкой, еÑли он уже запущен или оÑтановлен\n" +#~ msgid "" +#~ " -I, --idempotent don't error if server already running or " +#~ "stopped\n" +#~ msgstr "" +#~ " -I, --idempotent не Ñчитать ошибкой, еÑли он уже запущен или " +#~ "оÑтановлен\n" -#~ msgid " fast promote quickly without waiting for checkpoint completion\n" -#~ msgstr " fast быÑтрое повышение, без Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð¹ точки\n" +#~ msgid "" +#~ " fast promote quickly without waiting for checkpoint completion\n" +#~ msgstr "" +#~ " fast быÑтрое повышение, без Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð¹ " +#~ "точки\n" #~ msgid " smart promote after performing a checkpoint\n" #~ msgstr " smart повышение поÑле Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð¹ точки\n" #, c-format #~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n" -#~ msgstr "%s: ПРЕДУПРЕЖДЕÐИЕ: в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры\n" +#~ msgstr "" +#~ "%s: ПРЕДУПРЕЖДЕÐИЕ: в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры\n" #, c-format -#~ msgid "%s: WARNING: could not locate all job object functions in system API\n" -#~ msgstr "%s: ПРЕДУПРЕЖДЕÐИЕ: не удалоÑÑŒ найти вÑе функции Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð·Ð°Ð´Ð°Ñ‡Ð°Ð¼Ð¸ в ÑиÑтемном API\n" +#~ msgid "" +#~ "%s: WARNING: could not locate all job object functions in system API\n" +#~ msgstr "" +#~ "%s: ПРЕДУПРЕЖДЕÐИЕ: не удалоÑÑŒ найти вÑе функции Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ Ð·Ð°Ð´Ð°Ñ‡Ð°Ð¼Ð¸ в " +#~ "ÑиÑтемном API\n" #~ msgid "%s: another server might be running\n" #~ msgstr "%s: возможно, работает другой Ñервер\n" @@ -935,7 +1012,8 @@ msgstr "%s: каталог баз данных не указан и переме #~ "(The default is to wait for shutdown, but not for start or restart.)\n" #~ "\n" #~ msgstr "" -#~ "(По умолчанию ожидание имеет меÑто при оÑтановке, но не при (пере)запуÑке.)\n" +#~ "(По умолчанию ожидание имеет меÑто при оÑтановке, но не при " +#~ "(пере)запуÑке.)\n" #~ "\n" #~ msgid "" @@ -950,10 +1028,6 @@ msgstr "%s: каталог баз данных не указан и переме #~ msgid "child process was terminated by signal %s" #~ msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %s" -#, c-format -#~ msgid "could not change directory to \"%s\": %m" -#~ msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m" - #, c-format #~ msgid "could not identify current directory: %m" #~ msgstr "не удалоÑÑŒ определить текущий каталог: %m" diff --git a/src/bin/pg_ctl/po/sv.po b/src/bin/pg_ctl/po/sv.po index 9762a39ba07d4..ff52b8cb20915 100644 --- a/src/bin/pg_ctl/po/sv.po +++ b/src/bin/pg_ctl/po/sv.po @@ -1,5 +1,5 @@ # Swedish message translation file for pg_ctl -# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. +# Dennis Björklund , 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # Magnus Hagander , 2010. # Mats Erik Andersson , 2013, 2014. # @@ -7,10 +7,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-11 09:18+0000\n" -"PO-Revision-Date: 2022-04-11 14:43+0200\n" +"POT-Creation-Date: 2024-07-12 14:20+0000\n" +"PO-Revision-Date: 2024-07-12 19:04+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -19,204 +19,213 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../common/exec.c:144 ../../common/exec.c:261 ../../common/exec.c:307 -#, c-format -msgid "could not identify current directory: %m" -msgstr "kunde inte identifiera aktuell katalog: %m" +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "byte-ordning stämmer inte" -#: ../../common/exec.c:163 +#: ../../common/exec.c:174 #, c-format -msgid "invalid binary \"%s\"" -msgstr "ogiltig binär \"%s\"" +msgid "invalid binary \"%s\": %m" +msgstr "ogiltig binär \"%s\": %m" -#: ../../common/exec.c:213 +#: ../../common/exec.c:217 #, c-format -msgid "could not read binary \"%s\"" -msgstr "kunde inte läsa binär \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "kunde inte läsa binär \"%s\": %m" -#: ../../common/exec.c:221 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "kunde inte hitta en \"%s\" att köra" -#: ../../common/exec.c:277 ../../common/exec.c:316 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "kunde inte konvertera sökvägen \"%s\" till en absolut sökväg: %m" + +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "kunde inte köra kommandot \"%s\": %m" + +#: ../../common/exec.c:394 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "kunde inte byta katalog till \"%s\": %m" +msgid "could not read from command \"%s\": %m" +msgstr "kunde inte läsa frÃ¥n kommando \"%s\": %m" -#: ../../common/exec.c:294 +#: ../../common/exec.c:397 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "kan inte läsa symbolisk länk \"%s\": %m" +msgid "no data was returned by command \"%s\"" +msgstr "ingen data returnerades frÃ¥n kommandot \"%s\"" -#: ../../common/exec.c:417 +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() misslyckades: %m" -#: ../../common/exec.c:555 ../../common/exec.c:600 ../../common/exec.c:692 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "slut pÃ¥ minne" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 -#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../port/path.c:753 ../../port/path.c:790 ../../port/path.c:807 #, c-format msgid "out of memory\n" msgstr "slut pÃ¥ minne\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "kommandot är inte körbart" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "kommandot kan ej hittas" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "barnprocess avslutade med kod %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "barnprocess terminerades med avbrott 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "barnprocess terminerades av signal %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "barnprocess avslutade med okänd statuskod %d" #: ../../port/path.c:775 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "kunde inte fastställa nuvarande arbetskatalog: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "kunde inte fastställa nuvarande arbetskatalog: %m\n" -#: pg_ctl.c:260 +#: pg_ctl.c:254 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s: katalogen \"%s\" existerar inte\n" -#: pg_ctl.c:263 +#: pg_ctl.c:257 #, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: kunde inte komma Ã¥t katalogen \"%s\": %s\n" +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: kunde inte komma Ã¥t katalogen \"%s\": %m\n" -#: pg_ctl.c:276 +#: pg_ctl.c:270 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s: katalogen \"%s\" innehÃ¥ller inte nÃ¥got databaskluster.\n" -#: pg_ctl.c:289 +#: pg_ctl.c:283 #, c-format -msgid "%s: could not open PID file \"%s\": %s\n" -msgstr "%s: kunde inte öppna PID-fil \"%s\": %s\n" +msgid "%s: could not open PID file \"%s\": %m\n" +msgstr "%s: kunde inte öppna PID-fil \"%s\": %m\n" -#: pg_ctl.c:298 +#: pg_ctl.c:292 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s: PID-filen \"%s\" är tom\n" -#: pg_ctl.c:301 +#: pg_ctl.c:295 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s: ogiltig data i PID-fil \"%s\"\n" -#: pg_ctl.c:464 pg_ctl.c:506 +#: pg_ctl.c:457 pg_ctl.c:499 #, c-format -msgid "%s: could not start server: %s\n" -msgstr "%s: kunde inte starta servern: %s\n" +msgid "%s: could not start server: %m\n" +msgstr "%s: kunde inte starta servern: %m\n" -#: pg_ctl.c:484 +#: pg_ctl.c:477 #, c-format -msgid "%s: could not start server due to setsid() failure: %s\n" -msgstr "%s: kunde inte starta servern dÃ¥ setsid() misslyckades: %s\n" +msgid "%s: could not start server due to setsid() failure: %m\n" +msgstr "%s: kunde inte starta servern dÃ¥ setsid() misslyckades: %m\n" -#: pg_ctl.c:554 +#: pg_ctl.c:547 #, c-format -msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s: kunde inte öppna logg-fil \"%s\": %s\n" +msgid "%s: could not open log file \"%s\": %m\n" +msgstr "%s: kunde inte öppna logg-fil \"%s\": %m\n" -#: pg_ctl.c:571 +#: pg_ctl.c:564 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s: kunde inte starta servern: felkod %lu\n" -#: pg_ctl.c:788 +#: pg_ctl.c:781 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" msgstr "%s: kan inte sätta storleksgränsning pÃ¥ core-fil; tillÃ¥ts inte av hÃ¥rd gräns\n" -#: pg_ctl.c:814 +#: pg_ctl.c:807 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s: kunde inte läsa filen \"%s\"\n" -#: pg_ctl.c:819 +#: pg_ctl.c:812 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: inställningsfilen \"%s\" mÃ¥ste bestÃ¥ av en enda rad.\n" -#: pg_ctl.c:861 pg_ctl.c:1044 pg_ctl.c:1112 +#: pg_ctl.c:854 pg_ctl.c:1038 pg_ctl.c:1105 #, c-format -msgid "%s: could not send stop signal (PID: %ld): %s\n" -msgstr "%s: kunde inte skicka stopp-signal (PID: %ld): %s\n" +msgid "%s: could not send stop signal (PID: %d): %m\n" +msgstr "%s: kunde inte skicka stopp-signal (PID: %d): %m\n" -#: pg_ctl.c:889 +#: pg_ctl.c:882 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" -msgstr "Programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"\n" +msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"\n" -#: pg_ctl.c:892 +#: pg_ctl.c:885 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" -msgstr "Programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s.\n" +msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s\n" -#: pg_ctl.c:923 +#: pg_ctl.c:917 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s: skapande av databaskluster misslyckades\n" -#: pg_ctl.c:938 +#: pg_ctl.c:932 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "%s: en annan server verkar köra; försöker starta servern ändÃ¥.\n" -#: pg_ctl.c:986 +#: pg_ctl.c:980 msgid "waiting for server to start..." msgstr "väntar pÃ¥ att servern skall starta..." -#: pg_ctl.c:991 pg_ctl.c:1068 pg_ctl.c:1131 pg_ctl.c:1243 +#: pg_ctl.c:985 pg_ctl.c:1061 pg_ctl.c:1123 pg_ctl.c:1235 msgid " done\n" msgstr " klar\n" -#: pg_ctl.c:992 +#: pg_ctl.c:986 msgid "server started\n" msgstr "servern startad\n" -#: pg_ctl.c:995 pg_ctl.c:1001 pg_ctl.c:1248 +#: pg_ctl.c:989 pg_ctl.c:995 pg_ctl.c:1240 msgid " stopped waiting\n" msgstr " avslutade väntan\n" -#: pg_ctl.c:996 +#: pg_ctl.c:990 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: servern startade inte i tid\n" -#: pg_ctl.c:1002 +#: pg_ctl.c:996 #, c-format msgid "" "%s: could not start server\n" @@ -225,42 +234,42 @@ msgstr "" "%s: kunde inte starta servern\n" "Undersök logg-utskriften.\n" -#: pg_ctl.c:1010 +#: pg_ctl.c:1004 msgid "server starting\n" msgstr "servern startar\n" -#: pg_ctl.c:1029 pg_ctl.c:1088 pg_ctl.c:1152 pg_ctl.c:1191 pg_ctl.c:1272 +#: pg_ctl.c:1023 pg_ctl.c:1081 pg_ctl.c:1144 pg_ctl.c:1183 pg_ctl.c:1264 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: PID-filen \"%s\" finns inte\n" -#: pg_ctl.c:1030 pg_ctl.c:1090 pg_ctl.c:1153 pg_ctl.c:1192 pg_ctl.c:1273 +#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1145 pg_ctl.c:1184 pg_ctl.c:1265 msgid "Is server running?\n" msgstr "Kör servern?\n" -#: pg_ctl.c:1036 +#: pg_ctl.c:1030 #, c-format -msgid "%s: cannot stop server; single-user server is running (PID: %ld)\n" -msgstr "%s: Kan inte stanna servern. En-användar-server i drift (PID: %ld).\n" +msgid "%s: cannot stop server; single-user server is running (PID: %d)\n" +msgstr "%s: Kan inte stanna servern. En-användar-server i drift (PID: %d).\n" -#: pg_ctl.c:1051 +#: pg_ctl.c:1044 msgid "server shutting down\n" msgstr "servern stänger ner\n" -#: pg_ctl.c:1056 pg_ctl.c:1117 +#: pg_ctl.c:1049 pg_ctl.c:1109 msgid "waiting for server to shut down..." msgstr "väntar pÃ¥ att servern skall stänga ner..." -#: pg_ctl.c:1060 pg_ctl.c:1122 +#: pg_ctl.c:1053 pg_ctl.c:1114 msgid " failed\n" msgstr " misslyckades\n" -#: pg_ctl.c:1062 pg_ctl.c:1124 +#: pg_ctl.c:1055 pg_ctl.c:1116 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: servern stänger inte ner\n" -#: pg_ctl.c:1064 pg_ctl.c:1126 +#: pg_ctl.c:1057 pg_ctl.c:1118 msgid "" "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" @@ -268,245 +277,235 @@ msgstr "" "TIPS: Flaggan \"-m fast\" avslutar sessioner omedelbart, i stället för att\n" "vänta pÃ¥ deras självvalda avslut.\n" -#: pg_ctl.c:1070 pg_ctl.c:1132 +#: pg_ctl.c:1063 pg_ctl.c:1124 msgid "server stopped\n" msgstr "servern är stoppad\n" -#: pg_ctl.c:1091 +#: pg_ctl.c:1084 msgid "trying to start server anyway\n" msgstr "försöker starta servern ändÃ¥\n" -#: pg_ctl.c:1100 +#: pg_ctl.c:1093 #, c-format -msgid "%s: cannot restart server; single-user server is running (PID: %ld)\n" -msgstr "%s: kan inte starta om servern. En-användar-server kör (PID: %ld).\n" +msgid "%s: cannot restart server; single-user server is running (PID: %d)\n" +msgstr "%s: kan inte starta om servern. En-användar-server kör (PID: %d).\n" -#: pg_ctl.c:1103 pg_ctl.c:1162 +#: pg_ctl.c:1096 pg_ctl.c:1154 msgid "Please terminate the single-user server and try again.\n" msgstr "Var vänlig att stanna en-användar-servern och försök sedan igen.\n" -#: pg_ctl.c:1136 +#: pg_ctl.c:1128 #, c-format -msgid "%s: old server process (PID: %ld) seems to be gone\n" -msgstr "%s: gamla serverprocessen (PID: %ld) verkar vara borta\n" +msgid "%s: old server process (PID: %d) seems to be gone\n" +msgstr "%s: gamla serverprocessen (PID: %d) verkar vara borta\n" -#: pg_ctl.c:1138 +#: pg_ctl.c:1130 msgid "starting server anyway\n" msgstr "startar servern ändÃ¥\n" -#: pg_ctl.c:1159 +#: pg_ctl.c:1151 #, c-format -msgid "%s: cannot reload server; single-user server is running (PID: %ld)\n" -msgstr "%s: kan inte ladda om servern; en-användar-server kör (PID: %ld)\n" +msgid "%s: cannot reload server; single-user server is running (PID: %d)\n" +msgstr "%s: kan inte ladda om servern; en-användar-server kör (PID: %d)\n" -#: pg_ctl.c:1168 +#: pg_ctl.c:1160 #, c-format -msgid "%s: could not send reload signal (PID: %ld): %s\n" -msgstr "%s: kunde inte skicka signalen \"reload\" (PID: %ld): %s\n" +msgid "%s: could not send reload signal (PID: %d): %m\n" +msgstr "%s: kunde inte skicka signalen \"reload\" (PID: %d): %m\n" -#: pg_ctl.c:1173 +#: pg_ctl.c:1165 msgid "server signaled\n" msgstr "servern är signalerad\n" -#: pg_ctl.c:1198 +#: pg_ctl.c:1190 #, c-format -msgid "%s: cannot promote server; single-user server is running (PID: %ld)\n" -msgstr "%s: kan inte befordra servern; en-användar-server kör (PID: %ld)\n" +msgid "%s: cannot promote server; single-user server is running (PID: %d)\n" +msgstr "%s: kan inte befordra servern; en-användar-server kör (PID: %d)\n" -#: pg_ctl.c:1206 +#: pg_ctl.c:1198 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s: kan inte befordra servern; servern är inte i beredskapsläge.\n" -#: pg_ctl.c:1216 +#: pg_ctl.c:1208 #, c-format -msgid "%s: could not create promote signal file \"%s\": %s\n" -msgstr "%s: kunde inte skapa befordringssignalfil \"%s\": %s\n" +msgid "%s: could not create promote signal file \"%s\": %m\n" +msgstr "%s: kunde inte skapa befordringssignalfil \"%s\": %m\n" -#: pg_ctl.c:1222 +#: pg_ctl.c:1214 #, c-format -msgid "%s: could not write promote signal file \"%s\": %s\n" -msgstr "%s: kunde inte skriva befordringssignalfil \"%s\": %s\n" +msgid "%s: could not write promote signal file \"%s\": %m\n" +msgstr "%s: kunde inte skriva befordringssignalfil \"%s\": %m\n" -#: pg_ctl.c:1230 +#: pg_ctl.c:1222 #, c-format -msgid "%s: could not send promote signal (PID: %ld): %s\n" -msgstr "%s: kunde inte skicka befordringssignal (PID: %ld): %s\n" +msgid "%s: could not send promote signal (PID: %d): %m\n" +msgstr "%s: kunde inte skicka befordringssignal (PID: %d): %m\n" -#: pg_ctl.c:1233 +#: pg_ctl.c:1225 #, c-format -msgid "%s: could not remove promote signal file \"%s\": %s\n" -msgstr "%s: kunde inte ta bort befordringssignalfil \"%s\": %s\n" +msgid "%s: could not remove promote signal file \"%s\": %m\n" +msgstr "%s: kunde inte ta bort befordringssignalfil \"%s\": %m\n" -#: pg_ctl.c:1240 +#: pg_ctl.c:1232 msgid "waiting for server to promote..." msgstr "väntar pÃ¥ att servern skall befordras..." -#: pg_ctl.c:1244 +#: pg_ctl.c:1236 msgid "server promoted\n" msgstr "servern befordrad\n" -#: pg_ctl.c:1249 +#: pg_ctl.c:1241 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: servern befordrades inte i tid\n" -#: pg_ctl.c:1255 +#: pg_ctl.c:1247 msgid "server promoting\n" msgstr "servern befordras\n" -#: pg_ctl.c:1279 +#: pg_ctl.c:1271 #, c-format -msgid "%s: cannot rotate log file; single-user server is running (PID: %ld)\n" -msgstr "%s: kan inte rotera loggfil; en-användar-server kör (PID: %ld)\n" +msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n" +msgstr "%s: kan inte rotera loggfil; en-användar-server kör (PID: %d)\n" -#: pg_ctl.c:1289 +#: pg_ctl.c:1281 #, c-format -msgid "%s: could not create log rotation signal file \"%s\": %s\n" -msgstr "%s: kunde inte skapa loggroteringssignalfil \"%s\": %s\n" +msgid "%s: could not create log rotation signal file \"%s\": %m\n" +msgstr "%s: kunde inte skapa loggroteringssignalfil \"%s\": %m\n" -#: pg_ctl.c:1295 +#: pg_ctl.c:1287 #, c-format -msgid "%s: could not write log rotation signal file \"%s\": %s\n" -msgstr "%s: kunde inte skriva loggroteringssignalfil \"%s\": %s\n" +msgid "%s: could not write log rotation signal file \"%s\": %m\n" +msgstr "%s: kunde inte skriva loggroteringssignalfil \"%s\": %m\n" -#: pg_ctl.c:1303 +#: pg_ctl.c:1295 #, c-format -msgid "%s: could not send log rotation signal (PID: %ld): %s\n" -msgstr "%s: kunde inte skicka signalen för loggrotering (PID: %ld): %s\n" +msgid "%s: could not send log rotation signal (PID: %d): %m\n" +msgstr "%s: kunde inte skicka signalen för loggrotering (PID: %d): %m\n" -#: pg_ctl.c:1306 +#: pg_ctl.c:1298 #, c-format -msgid "%s: could not remove log rotation signal file \"%s\": %s\n" -msgstr "%s: kunde inte ta bort loggroteringssignalfil \"%s\": %s\n" +msgid "%s: could not remove log rotation signal file \"%s\": %m\n" +msgstr "%s: kunde inte ta bort loggroteringssignalfil \"%s\": %m\n" -#: pg_ctl.c:1311 +#: pg_ctl.c:1303 msgid "server signaled to rotate log file\n" msgstr "servern är signalerad att rotera loggfil\n" -#: pg_ctl.c:1358 +#: pg_ctl.c:1350 #, c-format -msgid "%s: single-user server is running (PID: %ld)\n" -msgstr "%s: en-användar-server kör. (PID: %ld)\n" +msgid "%s: single-user server is running (PID: %d)\n" +msgstr "%s: en-användar-server kör. (PID: %d)\n" -#: pg_ctl.c:1372 +#: pg_ctl.c:1364 #, c-format -msgid "%s: server is running (PID: %ld)\n" -msgstr "%s: servern kör (PID: %ld)\n" +msgid "%s: server is running (PID: %d)\n" +msgstr "%s: servern kör (PID: %d)\n" -#: pg_ctl.c:1388 +#: pg_ctl.c:1380 #, c-format msgid "%s: no server running\n" msgstr "%s: ingen server kör\n" -#: pg_ctl.c:1405 +#: pg_ctl.c:1397 #, c-format -msgid "%s: could not send signal %d (PID: %ld): %s\n" -msgstr "%s: kunde inte skicka signal %d (PID: %ld): %s\n" +msgid "%s: could not send signal %d (PID: %d): %m\n" +msgstr "%s: kunde inte skicka signal %d (PID: %d): %m\n" -#: pg_ctl.c:1436 +#: pg_ctl.c:1428 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: kunde inte hitta det egna programmets körbara fil\n" -#: pg_ctl.c:1446 +#: pg_ctl.c:1438 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: kunde inte hitta körbar postgres.\n" -#: pg_ctl.c:1516 pg_ctl.c:1550 +#: pg_ctl.c:1508 pg_ctl.c:1542 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: kunde inte öppna tjänstehanteraren\n" -#: pg_ctl.c:1522 +#: pg_ctl.c:1514 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: tjänsten \"%s\" är redan registrerad\n" -#: pg_ctl.c:1533 +#: pg_ctl.c:1525 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: kunde inte registrera tjänsten \"%s\": felkod %lu\n" -#: pg_ctl.c:1556 +#: pg_ctl.c:1548 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: tjänsten \"%s\" är inte registrerad\n" -#: pg_ctl.c:1563 +#: pg_ctl.c:1555 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: kunde inte öppna tjänsten \"%s\": felkod %lu\n" -#: pg_ctl.c:1572 +#: pg_ctl.c:1564 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: kunde inte avregistrera tjänsten \"%s\": felkod %lu\n" -#: pg_ctl.c:1659 +#: pg_ctl.c:1651 msgid "Waiting for server startup...\n" msgstr "Väntar pÃ¥ serverstart...\n" -#: pg_ctl.c:1662 +#: pg_ctl.c:1654 msgid "Timed out waiting for server startup\n" msgstr "Tidsfristen ute vid väntan pÃ¥ serverstart\n" -#: pg_ctl.c:1666 +#: pg_ctl.c:1658 msgid "Server started and accepting connections\n" msgstr "Server startad och accepterar nu anslutningar\n" -#: pg_ctl.c:1721 +#: pg_ctl.c:1713 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: kunde inte starta tjänsten \"%s\": felkod %lu\n" -#: pg_ctl.c:1824 -#, c-format -msgid "%s: WARNING: cannot create restricted tokens on this platform\n" -msgstr "%s: VARNING: \"Restricted Token\" stöds inte av plattformen.\n" - -#: pg_ctl.c:1837 +#: pg_ctl.c:1786 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: kunde inte öppna process-token: felkod %lu\n" -#: pg_ctl.c:1851 +#: pg_ctl.c:1800 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: kunde inte tilldela SID: felkod %lu\n" -#: pg_ctl.c:1878 +#: pg_ctl.c:1826 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: kunde inte skapa restriktivt styrmärke (token): felkod %lu\n" -#: pg_ctl.c:1909 -#, c-format -msgid "%s: WARNING: could not locate all job object functions in system API\n" -msgstr "%s: VARNING: kunde inte hitta alla jobb-funktioner system-API:et.\n" - -#: pg_ctl.c:2006 +#: pg_ctl.c:1908 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: kunde inte hämta LUID:er för rättigheter: felkod %lu\n" -#: pg_ctl.c:2014 pg_ctl.c:2029 +#: pg_ctl.c:1916 pg_ctl.c:1931 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: kunde inte hämta token-information: felkod %lu\n" -#: pg_ctl.c:2023 +#: pg_ctl.c:1925 #, c-format msgid "%s: out of memory\n" msgstr "%s: slut pÃ¥ minne\n" -#: pg_ctl.c:2053 +#: pg_ctl.c:1955 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Försök med \"%s --help\" för mer information.\n" -#: pg_ctl.c:2061 +#: pg_ctl.c:1963 #, c-format msgid "" "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" @@ -516,17 +515,17 @@ msgstr "" "PostgreSQL-tjänsten.\n" "\n" -#: pg_ctl.c:2062 +#: pg_ctl.c:1964 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_ctl.c:2063 +#: pg_ctl.c:1965 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D DATAKAT] [-s] [-o FLAGGOR]\n" -#: pg_ctl.c:2064 +#: pg_ctl.c:1966 #, c-format msgid "" " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" @@ -535,12 +534,12 @@ msgstr "" " %s start [-D DATAKAT] [-l FILNAMN] [-W] [-t SEK] [-s]\n" " [-o FLAGGOR] [-p SOKVÄG] [-c]\n" -#: pg_ctl.c:2066 +#: pg_ctl.c:1968 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D DATAKAT] [-m STÄNGNINGSMETOD] [-W] [-t SEK] [-s]\n" -#: pg_ctl.c:2067 +#: pg_ctl.c:1969 #, c-format msgid "" " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" @@ -549,32 +548,32 @@ msgstr "" " %s restart [-D DATAKAT] [-m STÄNGNINGSMETOD] [-W] [-t SEK] [-s]\n" " [-o FLAGGOR] [-c]\n" -#: pg_ctl.c:2069 +#: pg_ctl.c:1971 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D DATAKAT] [-s]\n" -#: pg_ctl.c:2070 +#: pg_ctl.c:1972 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D DATAKAT]\n" -#: pg_ctl.c:2071 +#: pg_ctl.c:1973 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D DATAKAT] [-W] [-t SEK] [-s]\n" -#: pg_ctl.c:2072 +#: pg_ctl.c:1974 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D DATAKAT] [-s]\n" -#: pg_ctl.c:2073 +#: pg_ctl.c:1975 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill SIGNALNAMN PID\n" -#: pg_ctl.c:2075 +#: pg_ctl.c:1977 #, c-format msgid "" " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" @@ -583,12 +582,12 @@ msgstr "" " %s register [-D DATAKAT] [-N TJÄNSTENAMN] [-U ANVÄNDARNAMN] [-P LÖSENORD]\n" " [-S STARTTYPE] [-e KÄLLA] [-W] [-t SEK] [-s] [-o FLAGGOR]\n" -#: pg_ctl.c:2077 +#: pg_ctl.c:1979 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N TJÄNSTNAMN]\n" -#: pg_ctl.c:2080 +#: pg_ctl.c:1982 #, c-format msgid "" "\n" @@ -597,52 +596,52 @@ msgstr "" "\n" "Gemensamma flaggor:\n" -#: pg_ctl.c:2081 +#: pg_ctl.c:1983 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata=DATAKAT plats för databasens lagringsarea\n" -#: pg_ctl.c:2083 +#: pg_ctl.c:1985 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr " -e KÄLLA händelsekälla för loggning när vi kör som en tjänst\n" -#: pg_ctl.c:2085 +#: pg_ctl.c:1987 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr " -s, --silent skriv bara ut fel, inga informationsmeddelanden\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:1988 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr " -t, --timeout=SEK antal sekunder att vänta när växeln -w används\n" -#: pg_ctl.c:2087 +#: pg_ctl.c:1989 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_ctl.c:2088 +#: pg_ctl.c:1990 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait vänta pÃ¥ att operationen slutförs (standard)\n" -#: pg_ctl.c:2089 +#: pg_ctl.c:1991 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait vänta inte pÃ¥ att operationen slutförs\n" -#: pg_ctl.c:2090 +#: pg_ctl.c:1992 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa den här hjälpen, avsluta sedan\n" -#: pg_ctl.c:2091 +#: pg_ctl.c:1993 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "Om flaggan -D inte har angivits sÃ¥ används omgivningsvariabeln PGDATA.\n" -#: pg_ctl.c:2093 +#: pg_ctl.c:1995 #, c-format msgid "" "\n" @@ -651,22 +650,22 @@ msgstr "" "\n" "Flaggor för start eller omstart:\n" -#: pg_ctl.c:2095 +#: pg_ctl.c:1997 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files tillÃ¥t postgres att skapa core-filer\n" -#: pg_ctl.c:2097 +#: pg_ctl.c:1999 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files inte giltig för denna plattform\n" -#: pg_ctl.c:2099 +#: pg_ctl.c:2001 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr " -l, --log=FILNAMN skriv, eller tillfoga, server-loggen till FILNAMN\n" -#: pg_ctl.c:2100 +#: pg_ctl.c:2002 #, c-format msgid "" " -o, --options=OPTIONS command line options to pass to postgres\n" @@ -675,14 +674,14 @@ msgstr "" " -o, --options=OPTIONS kommandoradsflaggor som skickas vidare till postgres\n" " (PostgreSQL-serverns körbara fil) eller till initdb\n" -#: pg_ctl.c:2102 +#: pg_ctl.c:2004 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr "" " -p SÖKVÄG-TILL-POSTGRES\n" " behövs normalt inte\n" -#: pg_ctl.c:2103 +#: pg_ctl.c:2005 #, c-format msgid "" "\n" @@ -691,12 +690,12 @@ msgstr "" "\n" "Flaggor för stopp eller omstart:\n" -#: pg_ctl.c:2104 +#: pg_ctl.c:2006 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr " -m, --mode=METOD METOD kan vara \"smart\", \"fast\" eller \"immediate\"\n" -#: pg_ctl.c:2106 +#: pg_ctl.c:2008 #, c-format msgid "" "\n" @@ -705,22 +704,22 @@ msgstr "" "\n" "Stängningsmetoder är:\n" -#: pg_ctl.c:2107 +#: pg_ctl.c:2009 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart stäng när alla klienter har avslutat\n" -#: pg_ctl.c:2108 +#: pg_ctl.c:2010 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast stäng omedelbart, med en kontrollerad nedstängning (standard)\n" -#: pg_ctl.c:2109 +#: pg_ctl.c:2011 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr " immediate stäng utan kontroller; kommer leda till Ã¥terställning vid omstart\n" -#: pg_ctl.c:2111 +#: pg_ctl.c:2013 #, c-format msgid "" "\n" @@ -729,7 +728,7 @@ msgstr "" "\n" "TillÃ¥tna signalnamn för kommando \"kill\":\n" -#: pg_ctl.c:2115 +#: pg_ctl.c:2017 #, c-format msgid "" "\n" @@ -738,27 +737,27 @@ msgstr "" "\n" "Flaggor för registrering och avregistrering:\n" -#: pg_ctl.c:2116 +#: pg_ctl.c:2018 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N TJÄNSTENAMN tjänstenamn att registrera PostgreSQL-servern med\n" -#: pg_ctl.c:2117 +#: pg_ctl.c:2019 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr " -P LÖSENORD lösenord för konto vid registrering av PostgreSQL-servern\n" -#: pg_ctl.c:2118 +#: pg_ctl.c:2020 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr " -U NAMN användarnamn för konto vid registrering av PostgreSQL-servern\n" -#: pg_ctl.c:2119 +#: pg_ctl.c:2021 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S STARTSÄTT sätt att registrera PostgreSQL-servern vid tjänstestart\n" -#: pg_ctl.c:2121 +#: pg_ctl.c:2023 #, c-format msgid "" "\n" @@ -767,17 +766,17 @@ msgstr "" "\n" "Startmetoder är:\n" -#: pg_ctl.c:2122 +#: pg_ctl.c:2024 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr " auto starta tjänsten automatiskt vid systemstart (förval)\n" -#: pg_ctl.c:2123 +#: pg_ctl.c:2025 #, c-format msgid " demand start service on demand\n" msgstr " demand starta tjänsten vid behov\n" -#: pg_ctl.c:2126 +#: pg_ctl.c:2028 #, c-format msgid "" "\n" @@ -786,37 +785,37 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_ctl.c:2127 +#: pg_ctl.c:2029 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_ctl.c:2152 +#: pg_ctl.c:2054 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: ogiltig stängningsmetod \"%s\"\n" -#: pg_ctl.c:2181 +#: pg_ctl.c:2083 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: ogiltigt signalnamn \"%s\"\n" -#: pg_ctl.c:2198 +#: pg_ctl.c:2100 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: ogiltigt startvillkor \"%s\"\n" -#: pg_ctl.c:2253 +#: pg_ctl.c:2156 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: kunde inte bestämma databaskatalogen frÃ¥n kommandot \"%s\"\n" -#: pg_ctl.c:2277 +#: pg_ctl.c:2179 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: kontrollfilen verkar vara trasig\n" -#: pg_ctl.c:2345 +#: pg_ctl.c:2247 #, c-format msgid "" "%s: cannot be run as root\n" @@ -827,32 +826,32 @@ msgstr "" "Logga in (t.ex. med \"su\") som den (opriviligerade) användare\n" "vilken skall äga serverprocessen.\n" -#: pg_ctl.c:2428 +#: pg_ctl.c:2319 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: flaggan -S stöds inte pÃ¥ denna plattform.\n" -#: pg_ctl.c:2465 -#, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: för mÃ¥nga kommandoradsargument (första är \"%s\")\n" - -#: pg_ctl.c:2491 +#: pg_ctl.c:2375 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: saknar argument för \"kill\"-kommando.\n" -#: pg_ctl.c:2509 +#: pg_ctl.c:2393 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: okänd operationsmetod \"%s\"\n" -#: pg_ctl.c:2519 +#: pg_ctl.c:2402 +#, c-format +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: för mÃ¥nga kommandoradsargument (första är \"%s\")\n" + +#: pg_ctl.c:2409 #, c-format msgid "%s: no operation specified\n" msgstr "%s: ingen operation angiven\n" -#: pg_ctl.c:2540 +#: pg_ctl.c:2430 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "%s: ingen databaskatalog angiven och omgivningsvariabeln PGDATA är inte satt\n" diff --git a/src/bin/pg_ctl/po/uk.po b/src/bin/pg_ctl/po/uk.po index 6269df3963a32..b517535543aac 100644 --- a/src/bin/pg_ctl/po/uk.po +++ b/src/bin/pg_ctl/po/uk.po @@ -2,11 +2,11 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-24 03:48+0000\n" -"PO-Revision-Date: 2023-04-24 09:25+0200\n" +"POT-Creation-Date: 2024-08-31 06:20+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" -"Language: uk\n" +"Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -14,42 +14,60 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pg_ctl.pot\n" -"X-Crowdin-File-ID: 878\n" +"X-Crowdin-File: /REL_17_STABLE/pg_ctl.pot\n" +"X-Crowdin-File-ID: 994\n" -#: ../../common/exec.c:172 +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неправильний порÑдок байтів" + +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "невірний бінарний файл \"%s\": %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" -msgstr "неможливо прочитати бінарний файл \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ бінарний файл \"%s\": %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "неможливо знайти \"%s\" Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ" -#: ../../common/exec.c:250 -#, fuzzy, c-format -#| msgid "could not reopen file \"%s\" as stderr: %m" +#: ../../common/exec.c:252 +#, c-format msgid "could not resolve path \"%s\" to absolute form: %m" -msgstr "не вдалоÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ відкрити файл \"%s\" Ñк stderr: %m" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ абÑолютний шлÑÑ… \"%s\": %m" + +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ команду \"%s\": %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ виÑновок команди \"%s\": %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "команда \"%s\" не повернула жодних даних" -#: ../../common/exec.c:412 +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() помилка: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "недоÑтатньо пам'Ñті" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 -#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 +#: ../../port/path.c:753 ../../port/path.c:790 ../../port/path.c:807 #, c-format msgid "out of memory\n" msgstr "недоÑтатньо пам'Ñті\n" @@ -91,740 +109,709 @@ msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· невизнани #: ../../port/path.c:775 #, c-format -msgid "could not get current working directory: %s\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ поточний робочий каталог: %s\n" +msgid "could not get current working directory: %m\n" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ поточний робочий каталог: %m\n" -#: pg_ctl.c:255 +#: pg_ctl.c:254 #, c-format msgid "%s: directory \"%s\" does not exist\n" msgstr "%s: Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ \"%s\" не Ñ–Ñнує\n" -#: pg_ctl.c:258 +#: pg_ctl.c:257 #, c-format -msgid "%s: could not access directory \"%s\": %s\n" -msgstr "%s: немає доÑтупу до каталогу \"%s\": %s\n" +msgid "%s: could not access directory \"%s\": %m\n" +msgstr "%s: не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ доÑтуп до каталогу \"%s\": %m\n" -#: pg_ctl.c:271 +#: pg_ctl.c:270 #, c-format msgid "%s: directory \"%s\" is not a database cluster directory\n" msgstr "%s: каталог \"%s\" не Ñ” каталогом клаÑтера бази даних\n" -#: pg_ctl.c:284 +#: pg_ctl.c:283 #, c-format -msgid "%s: could not open PID file \"%s\": %s\n" -msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл PID \"%s\": %s\n" +msgid "%s: could not open PID file \"%s\": %m\n" +msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл PID \"%s\": %m\n" -#: pg_ctl.c:293 +#: pg_ctl.c:292 #, c-format msgid "%s: the PID file \"%s\" is empty\n" msgstr "%s: файл PID \"%s\" пуÑтий\n" -#: pg_ctl.c:296 +#: pg_ctl.c:295 #, c-format msgid "%s: invalid data in PID file \"%s\"\n" msgstr "%s: невірні дані у файлі PID \"%s\"\n" -#: pg_ctl.c:458 pg_ctl.c:500 +#: pg_ctl.c:457 pg_ctl.c:499 #, c-format -msgid "%s: could not start server: %s\n" -msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ñервер: %s\n" +msgid "%s: could not start server: %m\n" +msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ñервер: %m\n" -#: pg_ctl.c:478 +#: pg_ctl.c:477 #, c-format -msgid "%s: could not start server due to setsid() failure: %s\n" -msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ñервер через помилку setsid(): %s\n" +msgid "%s: could not start server due to setsid() failure: %m\n" +msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ñервер через помилку setsid(): %m\n" -#: pg_ctl.c:548 +#: pg_ctl.c:547 #, c-format -msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу \"%s\": %s\n" +msgid "%s: could not open log file \"%s\": %m\n" +msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу \"%s\": %m\n" -#: pg_ctl.c:565 +#: pg_ctl.c:564 #, c-format msgid "%s: could not start server: error code %lu\n" msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ñервер: код помилки %lu\n" -#: pg_ctl.c:782 +#: pg_ctl.c:781 #, c-format msgid "%s: cannot set core file size limit; disallowed by hard limit\n" msgstr "%s: не вдалоÑÑ Ð²Ñтановити Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð½Ð° розмір файлу; заборонено жорÑтким лімітом\n" -#: pg_ctl.c:808 +#: pg_ctl.c:807 #, c-format msgid "%s: could not read file \"%s\"\n" msgstr "%s: не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\"\n" -#: pg_ctl.c:813 +#: pg_ctl.c:812 #, c-format msgid "%s: option file \"%s\" must have exactly one line\n" msgstr "%s: файл параметрів \"%s\" повинен міÑтити рівно один Ñ€Ñдок\n" -#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107 +#: pg_ctl.c:854 pg_ctl.c:1038 pg_ctl.c:1105 #, c-format -msgid "%s: could not send stop signal (PID: %d): %s\n" -msgstr "%s: не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати Ñтоп-Ñигнал (PID: %d): %s\n" +msgid "%s: could not send stop signal (PID: %d): %m\n" +msgstr "%s: не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати Ñтоп-Ñигнал (PID: %d): %m\n" -#: pg_ctl.c:883 +#: pg_ctl.c:882 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" msgstr "програма \"%s\" потрібна Ð´Ð»Ñ %s, але не знайдена в тому ж каталозі, що й \"%s\"\n" -#: pg_ctl.c:886 +#: pg_ctl.c:885 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" msgstr "програма \"%s\" знайдена Ð´Ð»Ñ \"%s\", але має відмінну верÑÑ–ÑŽ від %s\n" -#: pg_ctl.c:918 +#: pg_ctl.c:917 #, c-format msgid "%s: database system initialization failed\n" msgstr "%s: не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ ініціалізацію ÑиÑтеми бази даних\n" -#: pg_ctl.c:933 +#: pg_ctl.c:932 #, c-format msgid "%s: another server might be running; trying to start server anyway\n" msgstr "%s: мабуть, інший Ñервер вже працює; у будь-Ñкому разі Ñпробуємо запуÑтити Ñервер\n" -#: pg_ctl.c:981 +#: pg_ctl.c:980 msgid "waiting for server to start..." msgstr "очікуєтьÑÑ Ð·Ð°Ð¿ÑƒÑк Ñерверу..." -#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238 +#: pg_ctl.c:985 pg_ctl.c:1061 pg_ctl.c:1123 pg_ctl.c:1235 msgid " done\n" msgstr " готово\n" -#: pg_ctl.c:987 +#: pg_ctl.c:986 msgid "server started\n" msgstr "Ñервер запущено\n" -#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243 +#: pg_ctl.c:989 pg_ctl.c:995 pg_ctl.c:1240 msgid " stopped waiting\n" msgstr " Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð¾\n" -#: pg_ctl.c:991 +#: pg_ctl.c:990 #, c-format msgid "%s: server did not start in time\n" msgstr "%s: Ñервер не було запущено вчаÑно\n" -#: pg_ctl.c:997 +#: pg_ctl.c:996 #, c-format -msgid "" -"%s: could not start server\n" +msgid "%s: could not start server\n" "Examine the log output.\n" -msgstr "" -"%s: неможливо запуÑтити Ñервер\n" +msgstr "%s: неможливо запуÑтити Ñервер\n" "ПередивітьÑÑ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð» виконаннÑ.\n" -#: pg_ctl.c:1005 +#: pg_ctl.c:1004 msgid "server starting\n" msgstr "запуÑк Ñерверу\n" -#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267 +#: pg_ctl.c:1023 pg_ctl.c:1081 pg_ctl.c:1144 pg_ctl.c:1183 pg_ctl.c:1264 #, c-format msgid "%s: PID file \"%s\" does not exist\n" msgstr "%s: файл PID \"%s\" не Ñ–Ñнує\n" -#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268 +#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1145 pg_ctl.c:1184 pg_ctl.c:1265 msgid "Is server running?\n" msgstr "Сервер працює?\n" -#: pg_ctl.c:1031 +#: pg_ctl.c:1030 #, c-format msgid "%s: cannot stop server; single-user server is running (PID: %d)\n" msgstr "%s: не можливо зупинити Ñервер; Ñервер запущений в режимі single-user (PID: %d)\n" -#: pg_ctl.c:1046 +#: pg_ctl.c:1044 msgid "server shutting down\n" msgstr "Ñервер зупинÑєтьÑÑ\n" -#: pg_ctl.c:1051 pg_ctl.c:1112 +#: pg_ctl.c:1049 pg_ctl.c:1109 msgid "waiting for server to shut down..." msgstr "очікуєтьÑÑ Ð·ÑƒÐ¿Ð¸Ð½ÐºÐ° Ñерверу..." -#: pg_ctl.c:1055 pg_ctl.c:1117 +#: pg_ctl.c:1053 pg_ctl.c:1114 msgid " failed\n" msgstr " помилка\n" -#: pg_ctl.c:1057 pg_ctl.c:1119 +#: pg_ctl.c:1055 pg_ctl.c:1116 #, c-format msgid "%s: server does not shut down\n" msgstr "%s: Ñервер не зупинено\n" -#: pg_ctl.c:1059 pg_ctl.c:1121 -msgid "" -"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" +#: pg_ctl.c:1057 pg_ctl.c:1118 +msgid "HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" "waiting for session-initiated disconnection.\n" msgstr "ПІДКÐЗКÐ: Режим \"-m fast\" закриває ÑеÑÑ–Ñ— відразу, не чекаючи на Ð²Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð¹Ð¾Ð²Ð°Ð½Ñ– ÑеÑÑ–Ñми.\n" -#: pg_ctl.c:1065 pg_ctl.c:1127 +#: pg_ctl.c:1063 pg_ctl.c:1124 msgid "server stopped\n" msgstr "Ñервер зупинено\n" -#: pg_ctl.c:1086 +#: pg_ctl.c:1084 msgid "trying to start server anyway\n" msgstr "Ñпроба запуÑку Ñерверу в будь-Ñкому разі\n" -#: pg_ctl.c:1095 +#: pg_ctl.c:1093 #, c-format msgid "%s: cannot restart server; single-user server is running (PID: %d)\n" msgstr "%s: не можливо перезапуÑтити Ñервер; Ñервер запущений в режимі single-user (PID: %d)\n" -#: pg_ctl.c:1098 pg_ctl.c:1157 +#: pg_ctl.c:1096 pg_ctl.c:1154 msgid "Please terminate the single-user server and try again.\n" msgstr "Будь лаÑка, припиніть однокориÑтувацький Ñервер та Ñпробуйте ще раз.\n" -#: pg_ctl.c:1131 +#: pg_ctl.c:1128 #, c-format msgid "%s: old server process (PID: %d) seems to be gone\n" msgstr "%s: Ñтарий Ñерверний Ð¿Ñ€Ð¾Ñ†ÐµÑ (PID: %d), здаєтьÑÑ, зник\n" -#: pg_ctl.c:1133 +#: pg_ctl.c:1130 msgid "starting server anyway\n" msgstr "запуÑк Ñерверу в будь-Ñкому разі\n" -#: pg_ctl.c:1154 +#: pg_ctl.c:1151 #, c-format msgid "%s: cannot reload server; single-user server is running (PID: %d)\n" -msgstr "%s: неможливо перезавантажити Ñервер; Ñервер запущено в однокориÑтувацькому режимі (PID: %d)\n" +msgstr "%s: не можливо перезапуÑтити Ñервер; Ñервер запущений в режимі single-user (PID: %d)\n" -#: pg_ctl.c:1163 +#: pg_ctl.c:1160 #, c-format -msgid "%s: could not send reload signal (PID: %d): %s\n" -msgstr "%s: не можливо надіÑлати Ñигнал Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ (PID: %d): %s\n" +msgid "%s: could not send reload signal (PID: %d): %m\n" +msgstr "%s: не можливо надіÑлати Ñигнал Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ (PID: %d): %m\n" -#: pg_ctl.c:1168 +#: pg_ctl.c:1165 msgid "server signaled\n" msgstr "Ñерверу надіÑлано Ñигнал\n" -#: pg_ctl.c:1193 +#: pg_ctl.c:1190 #, c-format msgid "%s: cannot promote server; single-user server is running (PID: %d)\n" msgstr "%s: неможливо підвищити Ñервер; Ñервер запущено в режимі single-user (PID: %d)\n" -#: pg_ctl.c:1201 +#: pg_ctl.c:1198 #, c-format msgid "%s: cannot promote server; server is not in standby mode\n" msgstr "%s: неможливо підвищити Ñервер; Ñервер запущено не в режимі резерву\n" -#: pg_ctl.c:1211 +#: pg_ctl.c:1208 #, c-format -msgid "%s: could not create promote signal file \"%s\": %s\n" -msgstr "%s: неможливо Ñтворити файл \"%s\" із Ñигналом Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ: %s\n" +msgid "%s: could not create promote signal file \"%s\": %m\n" +msgstr "%s: неможливо Ñтворити файл \"%s\" із Ñигналом Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ: %m\n" -#: pg_ctl.c:1217 +#: pg_ctl.c:1214 #, c-format -msgid "%s: could not write promote signal file \"%s\": %s\n" -msgstr "%s: неможливо запиÑати файл \"%s\" із Ñигналом Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ: %s\n" +msgid "%s: could not write promote signal file \"%s\": %m\n" +msgstr "%s: неможливо запиÑати файл \"%s\" із Ñигналом Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ: %m\n" -#: pg_ctl.c:1225 +#: pg_ctl.c:1222 #, c-format -msgid "%s: could not send promote signal (PID: %d): %s\n" -msgstr "%s: неможливо надіÑлати Ñигнал Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ (PID: %d): %s\n" +msgid "%s: could not send promote signal (PID: %d): %m\n" +msgstr "%s: неможливо надіÑлати Ñигнал Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ (PID: %d): %m\n" -#: pg_ctl.c:1228 +#: pg_ctl.c:1225 #, c-format -msgid "%s: could not remove promote signal file \"%s\": %s\n" -msgstr "%s: неможливо видалити файл \"%s\" із Ñигналом Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ: %s\n" +msgid "%s: could not remove promote signal file \"%s\": %m\n" +msgstr "%s: неможливо видалити файл \"%s\" із Ñигналом Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ: %m\n" -#: pg_ctl.c:1235 +#: pg_ctl.c:1232 msgid "waiting for server to promote..." msgstr "очікуєтьÑÑ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ñерверу..." -#: pg_ctl.c:1239 +#: pg_ctl.c:1236 msgid "server promoted\n" msgstr "Ñервер підвищено\n" -#: pg_ctl.c:1244 +#: pg_ctl.c:1241 #, c-format msgid "%s: server did not promote in time\n" msgstr "%s: Ñервер не було підвищено вчаÑно\n" -#: pg_ctl.c:1250 +#: pg_ctl.c:1247 msgid "server promoting\n" msgstr "Ñервер підвищуєтьÑÑ\n" -#: pg_ctl.c:1274 +#: pg_ctl.c:1271 #, c-format msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n" msgstr "%s: не можливо розвернути файл журналу; Ñервер працює в режимі одного кориÑтувача (PID: %d)\n" -#: pg_ctl.c:1284 +#: pg_ctl.c:1281 #, c-format -msgid "%s: could not create log rotation signal file \"%s\": %s\n" -msgstr "%s: не вдалоÑÑ Ñтворити файл Ñигналу розвороту журналу \"%s\": %s\n" +msgid "%s: could not create log rotation signal file \"%s\": %m\n" +msgstr "%s: не вдалоÑÑ Ñтворити файл Ñигналу розвороту журналу \"%s\": %m\n" -#: pg_ctl.c:1290 +#: pg_ctl.c:1287 #, c-format -msgid "%s: could not write log rotation signal file \"%s\": %s\n" -msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати у файл Ñигналу розвороту журналу \"%s\": %s\n" +msgid "%s: could not write log rotation signal file \"%s\": %m\n" +msgstr "%s: не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати у файл Ñигналу розвороту журналу \"%s\": %m\n" -#: pg_ctl.c:1298 +#: pg_ctl.c:1295 #, c-format -msgid "%s: could not send log rotation signal (PID: %d): %s\n" -msgstr "%s: не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати Ñигнал розвороту журналу (PID: %d): %s\n" +msgid "%s: could not send log rotation signal (PID: %d): %m\n" +msgstr "%s: не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати Ñигнал розвороту журналу (PID: %d): %m\n" -#: pg_ctl.c:1301 +#: pg_ctl.c:1298 #, c-format -msgid "%s: could not remove log rotation signal file \"%s\": %s\n" -msgstr "%s: не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл Ñигналу розвороту журналу \"%s\": %s\n" +msgid "%s: could not remove log rotation signal file \"%s\": %m\n" +msgstr "%s: не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл Ñигналу розвороту журналу \"%s\": %m\n" -#: pg_ctl.c:1306 +#: pg_ctl.c:1303 msgid "server signaled to rotate log file\n" msgstr "Ñерверу надіÑлано Ñигнал Ð´Ð»Ñ Ñ€Ð¾Ð·Ð²Ð¾Ñ€Ð¾Ñ‚ файлу журналу\n" -#: pg_ctl.c:1353 +#: pg_ctl.c:1350 #, c-format msgid "%s: single-user server is running (PID: %d)\n" msgstr "%s: однокориÑтувацький Ñервер працює (PID: %d)\n" -#: pg_ctl.c:1367 +#: pg_ctl.c:1364 #, c-format msgid "%s: server is running (PID: %d)\n" msgstr "%s: Ñервер працює (PID: %d)\n" -#: pg_ctl.c:1383 +#: pg_ctl.c:1380 #, c-format msgid "%s: no server running\n" msgstr "%s: Ñервер не працює \n" -#: pg_ctl.c:1400 +#: pg_ctl.c:1397 #, c-format -msgid "%s: could not send signal %d (PID: %d): %s\n" -msgstr "%s: не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати Ñигнал %d (PID: %d): %s\n" +msgid "%s: could not send signal %d (PID: %d): %m\n" +msgstr "%s: не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати Ñигнал %d (PID: %d): %m\n" -#: pg_ctl.c:1431 +#: pg_ctl.c:1428 #, c-format msgid "%s: could not find own program executable\n" msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ехе файл влаÑної програми\n" -#: pg_ctl.c:1441 +#: pg_ctl.c:1438 #, c-format msgid "%s: could not find postgres program executable\n" msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ виконану програму postgres\n" -#: pg_ctl.c:1511 pg_ctl.c:1545 +#: pg_ctl.c:1508 pg_ctl.c:1542 #, c-format msgid "%s: could not open service manager\n" msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ менеджер Ñлужб\n" -#: pg_ctl.c:1517 +#: pg_ctl.c:1514 #, c-format msgid "%s: service \"%s\" already registered\n" msgstr "%s: Ñлужба \"%s\" вже зареєÑтрована \n" -#: pg_ctl.c:1528 +#: pg_ctl.c:1525 #, c-format msgid "%s: could not register service \"%s\": error code %lu\n" msgstr "%s: не вдалоÑÑ Ð·Ð°Ñ€ÐµÑ”Ñтрувати Ñлужбу \"%s\": код помилки %lu\n" -#: pg_ctl.c:1551 +#: pg_ctl.c:1548 #, c-format msgid "%s: service \"%s\" not registered\n" msgstr "%s: Ñлужба \"%s\" не зареєÑтрована \n" -#: pg_ctl.c:1558 +#: pg_ctl.c:1555 #, c-format msgid "%s: could not open service \"%s\": error code %lu\n" msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ Ñлужбу \"%s\": код помилки %lu\n" -#: pg_ctl.c:1567 +#: pg_ctl.c:1564 #, c-format msgid "%s: could not unregister service \"%s\": error code %lu\n" msgstr "%s: не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñлужбу \"%s\": код помилки %lu\n" -#: pg_ctl.c:1654 +#: pg_ctl.c:1651 msgid "Waiting for server startup...\n" msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿ÑƒÑку Ñервера...\n" -#: pg_ctl.c:1657 +#: pg_ctl.c:1654 msgid "Timed out waiting for server startup\n" msgstr "Перевищено Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿ÑƒÑку Ñервера\n" -#: pg_ctl.c:1661 +#: pg_ctl.c:1658 msgid "Server started and accepting connections\n" msgstr "Сервер запущений Ñ– приймає з'єднаннÑ\n" -#: pg_ctl.c:1716 +#: pg_ctl.c:1713 #, c-format msgid "%s: could not start service \"%s\": error code %lu\n" msgstr "%s: не вдалоÑÑ Ð¿Ð¾Ñ‡Ð°Ñ‚Ð¸ Ñлужбу \"%s\": код помилки %lu\n" -#: pg_ctl.c:1789 +#: pg_ctl.c:1786 #, c-format msgid "%s: could not open process token: error code %lu\n" msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ токен процеÑу: код помилки %lu\n" -#: pg_ctl.c:1803 +#: pg_ctl.c:1800 #, c-format msgid "%s: could not allocate SIDs: error code %lu\n" msgstr "%s: не вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ SID: код помилки %lu\n" -#: pg_ctl.c:1829 +#: pg_ctl.c:1826 #, c-format msgid "%s: could not create restricted token: error code %lu\n" msgstr "%s: не вдалоÑÑ Ñтворити обмежений токен: код помилки %lu\n" -#: pg_ctl.c:1911 +#: pg_ctl.c:1908 #, c-format msgid "%s: could not get LUIDs for privileges: error code %lu\n" msgstr "%s: не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ LUIDs Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²: код помилки %lu\n" -#: pg_ctl.c:1919 pg_ctl.c:1934 +#: pg_ctl.c:1916 pg_ctl.c:1931 #, c-format msgid "%s: could not get token information: error code %lu\n" msgstr "%s: не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію токену: код помилки %lu\n" -#: pg_ctl.c:1928 +#: pg_ctl.c:1925 #, c-format msgid "%s: out of memory\n" msgstr "%s: бракує пам'Ñті\n" -#: pg_ctl.c:1958 +#: pg_ctl.c:1955 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації.\n" -#: pg_ctl.c:1966 +#: pg_ctl.c:1963 #, c-format -msgid "" -"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" -"\n" -msgstr "" -"%s - це утиліта Ð´Ð»Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ—, запуÑку, зупинки Ñ– контролю Ñерверу PostgreSQL.\n" -"\n" +msgid "%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n\n" +msgstr "%s - це утиліта Ð´Ð»Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ—, запуÑку, зупинки Ñ– контролю Ñерверу PostgreSQL.\n\n" -#: pg_ctl.c:1967 +#: pg_ctl.c:1964 #, c-format msgid "Usage:\n" msgstr "ВикориÑтаннÑ:\n" -#: pg_ctl.c:1968 +#: pg_ctl.c:1965 #, c-format msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" msgstr " %s init[db] [-D КÐТÐЛОГ-ДÐÐИХ] [-s] [-o ПÐРÐМЕТРИ]\n" -#: pg_ctl.c:1969 +#: pg_ctl.c:1966 #, c-format -msgid "" -" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" +msgid " %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-p PATH] [-c]\n" -msgstr "" -" %s start [-D КÐТÐЛОГ-ДÐÐИХ] [-l ІМ'Я-ФÐЙЛ] [-W] [-t СЕК] [-s]\n" +msgstr " %s start [-D КÐТÐЛОГ-ДÐÐИХ] [-l ІМ'Я-ФÐЙЛ] [-W] [-t СЕК] [-s]\n" " [-o ПÐРÐМЕТРИ] [-p ШЛЯХ] [-c]\n" -#: pg_ctl.c:1971 +#: pg_ctl.c:1968 #, c-format msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" msgstr " %s stop [-D КÐТÐЛОГ-ДÐÐИХ] [-m РЕЖИМ-ЗУПИÐКИ] [-W] [-t СЕК] [-s]\n" -#: pg_ctl.c:1972 +#: pg_ctl.c:1969 #, c-format -msgid "" -" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" +msgid " %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" " [-o OPTIONS] [-c]\n" -msgstr "" -" %s restart [-D КÐТÐЛОГ-ДÐÐИХ] [-m РЕЖИМ-ЗУПИÐКИ] [-W] [-t СЕК] [-s]\n" +msgstr " %s restart [-D КÐТÐЛОГ-ДÐÐИХ] [-m РЕЖИМ-ЗУПИÐКИ] [-W] [-t СЕК] [-s]\n" " [-o ПÐРÐМЕТРИ] [-c]\n" -#: pg_ctl.c:1974 +#: pg_ctl.c:1971 #, c-format msgid " %s reload [-D DATADIR] [-s]\n" msgstr " %s reload [-D КÐТÐЛОГ-ДÐÐИХ] [-s]\n" -#: pg_ctl.c:1975 +#: pg_ctl.c:1972 #, c-format msgid " %s status [-D DATADIR]\n" msgstr " %s status [-D DATADIR]\n" -#: pg_ctl.c:1976 +#: pg_ctl.c:1973 #, c-format msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" msgstr " %s promote [-D КÐТÐЛОГ-ДÐÐИХ] [-W] [-t СЕК] [-s]\n" -#: pg_ctl.c:1977 +#: pg_ctl.c:1974 #, c-format msgid " %s logrotate [-D DATADIR] [-s]\n" msgstr " %s logrotate [-D DATADIR] [-s]\n" -#: pg_ctl.c:1978 +#: pg_ctl.c:1975 #, c-format msgid " %s kill SIGNALNAME PID\n" msgstr " %s kill ІМ'Я-СИГÐÐЛУ PID\n" -#: pg_ctl.c:1980 +#: pg_ctl.c:1977 #, c-format -msgid "" -" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" +msgid " %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" " [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" -msgstr "" -" %s register [-D КÐТÐЛОГ-ДÐÐИХ] [-N ІМ'Я-СЛУЖБИ] [-U ІМ'Я-КОРИСТУВÐЧÐ] [-P ПÐРОЛЬ]\n" +msgstr " %s register [-D КÐТÐЛОГ-ДÐÐИХ] [-N ІМ'Я-СЛУЖБИ] [-U ІМ'Я-КОРИСТУВÐЧÐ] [-P ПÐРОЛЬ]\n" " [-S ТИП-ЗÐПУСКУ] [-e ДЖЕРЕЛО] [-W] [-t СЕК] [-s] [-o ПÐРÐМЕТРИ]\n" -#: pg_ctl.c:1982 +#: pg_ctl.c:1979 #, c-format msgid " %s unregister [-N SERVICENAME]\n" msgstr " %s unregister [-N ІМ'Я-СЛУЖБИ]\n" -#: pg_ctl.c:1985 +#: pg_ctl.c:1982 #, c-format -msgid "" -"\n" +msgid "\n" "Common options:\n" -msgstr "" -"\n" +msgstr "\n" "Загальні параметри:\n" -#: pg_ctl.c:1986 +#: pg_ctl.c:1983 #, c-format msgid " -D, --pgdata=DATADIR location of the database storage area\n" msgstr " -D, --pgdata=КÐТÐЛОГ-ДÐÐИХ Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñтору Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних\n" -#: pg_ctl.c:1988 +#: pg_ctl.c:1985 #, c-format msgid " -e SOURCE event source for logging when running as a service\n" msgstr " -e ДЖЕРЕЛО джерело подій Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ при запуÑку в ÑкоÑті поÑлуги\n" -#: pg_ctl.c:1990 +#: pg_ctl.c:1987 #, c-format msgid " -s, --silent only print errors, no informational messages\n" msgstr " -s, --silent виводити лише помилки, без інформаційних повідомлень\n" -#: pg_ctl.c:1991 +#: pg_ctl.c:1988 #, c-format msgid " -t, --timeout=SECS seconds to wait when using -w option\n" msgstr " -t, --timeout=СЕК Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ викориÑтанні -w параметра\n" -#: pg_ctl.c:1992 +#: pg_ctl.c:1989 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" -#: pg_ctl.c:1993 +#: pg_ctl.c:1990 #, c-format msgid " -w, --wait wait until operation completes (default)\n" msgstr " -w, --wait чекати Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ— (за замовчуваннÑм)\n" -#: pg_ctl.c:1994 +#: pg_ctl.c:1991 #, c-format msgid " -W, --no-wait do not wait until operation completes\n" msgstr " -W, --no-wait не чекати Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ—\n" -#: pg_ctl.c:1995 +#: pg_ctl.c:1992 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку потім вийти\n" -#: pg_ctl.c:1996 +#: pg_ctl.c:1993 #, c-format msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" msgstr "Якщо -D параметр пропущено, викориÑтовувати змінну Ñередовища PGDATA.\n" -#: pg_ctl.c:1998 +#: pg_ctl.c:1995 #, c-format -msgid "" -"\n" +msgid "\n" "Options for start or restart:\n" -msgstr "" -"\n" +msgstr "\n" "Параметри запуÑку або перезапуÑку:\n" -#: pg_ctl.c:2000 +#: pg_ctl.c:1997 #, c-format msgid " -c, --core-files allow postgres to produce core files\n" msgstr " -c, --core-files дозволÑти postgres Ñтворювати дампи пам'Ñті\n" -#: pg_ctl.c:2002 +#: pg_ctl.c:1999 #, c-format msgid " -c, --core-files not applicable on this platform\n" msgstr " -c, --core-files недопуÑтимо цією платформою\n" -#: pg_ctl.c:2004 +#: pg_ctl.c:2001 #, c-format msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" msgstr " -l, --log=ФÐЙЛ запиÑувати (або додавати) протокол Ñлужби до ФÐЙЛ\n" -#: pg_ctl.c:2005 +#: pg_ctl.c:2002 #, c-format -msgid "" -" -o, --options=OPTIONS command line options to pass to postgres\n" +msgid " -o, --options=OPTIONS command line options to pass to postgres\n" " (PostgreSQL server executable) or initdb\n" msgstr " -o, --options=ПÐРÐМЕТРИ параметри командного Ñ€Ñдку Ð´Ð»Ñ PostgreSQL або initdb\n" -#: pg_ctl.c:2007 +#: pg_ctl.c:2004 #, c-format msgid " -p PATH-TO-POSTGRES normally not necessary\n" msgstr " -p ШЛЯХ-ДО-СЕРВЕРУ зазвичай зайвий\n" -#: pg_ctl.c:2008 +#: pg_ctl.c:2005 #, c-format -msgid "" -"\n" +msgid "\n" "Options for stop or restart:\n" -msgstr "" -"\n" +msgstr "\n" "Параметри Ð¿Ñ€Ð¸Ð¿Ð¸Ð½ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ перезапуÑку:\n" -#: pg_ctl.c:2009 +#: pg_ctl.c:2006 #, c-format msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" msgstr " -m, --mode=РЕЖИМ РЕЖИМ може бути \"smart\", \"fast\", або \"immediate\"\n" -#: pg_ctl.c:2011 +#: pg_ctl.c:2008 #, c-format -msgid "" -"\n" +msgid "\n" "Shutdown modes are:\n" -msgstr "" -"\n" +msgstr "\n" "Режими зупинки:\n" -#: pg_ctl.c:2012 +#: pg_ctl.c:2009 #, c-format msgid " smart quit after all clients have disconnected\n" msgstr " smart вийти піÑÐ»Ñ Ð²Ñ–Ð´'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ ÑƒÑÑ–Ñ… клієнтів\n" -#: pg_ctl.c:2013 +#: pg_ctl.c:2010 #, c-format msgid " fast quit directly, with proper shutdown (default)\n" msgstr " fast вийти негайно з коректним вимкненнÑм (за замовченнÑм)\n" -#: pg_ctl.c:2014 +#: pg_ctl.c:2011 #, c-format msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" msgstr " immediate вийти негайно без повної процедури. Приведе до Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑку\n" -#: pg_ctl.c:2016 +#: pg_ctl.c:2013 #, c-format -msgid "" -"\n" +msgid "\n" "Allowed signal names for kill:\n" -msgstr "" -"\n" +msgstr "\n" "Дозволенні Ñигнали Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ kill:\n" -#: pg_ctl.c:2020 +#: pg_ctl.c:2017 #, c-format -msgid "" -"\n" +msgid "\n" "Options for register and unregister:\n" -msgstr "" -"\n" +msgstr "\n" "Параметри Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації Ñ– видаленнÑ: \n" -#: pg_ctl.c:2021 +#: pg_ctl.c:2018 #, c-format msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" msgstr " -N ІМ'Я-СЛУЖБИ ім'Ñ Ñлужби під Ñким зареєÑтрувати Ñервер PostgreSQL\n" -#: pg_ctl.c:2022 +#: pg_ctl.c:2019 #, c-format msgid " -P PASSWORD password of account to register PostgreSQL server\n" msgstr " -P ПÐРОЛЬ пароль облікового запиÑу Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації Ñерверу PostgreSQL\n" -#: pg_ctl.c:2023 +#: pg_ctl.c:2020 #, c-format msgid " -U USERNAME user name of account to register PostgreSQL server\n" msgstr " -U КОРИСТУВÐЧ ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача під Ñким зареєÑтрувати Ñервер PostgreSQL\n" -#: pg_ctl.c:2024 +#: pg_ctl.c:2021 #, c-format msgid " -S START-TYPE service start type to register PostgreSQL server\n" msgstr " -S ТИП-ЗÐПУСКУ тип запуÑку Ñлужби Ð´Ð»Ñ Ñ€ÐµÑ”Ñтрації Ñерверу PostgreSQL\n" -#: pg_ctl.c:2026 +#: pg_ctl.c:2023 #, c-format -msgid "" -"\n" +msgid "\n" "Start types are:\n" -msgstr "" -"\n" +msgstr "\n" "Типи запуÑку:\n" -#: pg_ctl.c:2027 +#: pg_ctl.c:2024 #, c-format msgid " auto start service automatically during system startup (default)\n" msgstr " auto запуÑкати Ñервер автоматично під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку ÑиÑтеми (за замовчуваннÑм)\n" -#: pg_ctl.c:2028 +#: pg_ctl.c:2025 #, c-format msgid " demand start service on demand\n" msgstr " demand запуÑкати Ñервер за потреби\n" -#: pg_ctl.c:2031 +#: pg_ctl.c:2028 #, c-format -msgid "" -"\n" +msgid "\n" "Report bugs to <%s>.\n" -msgstr "" -"\n" +msgstr "\n" "ПовідомлÑти про помилки на <%s>.\n" -#: pg_ctl.c:2032 +#: pg_ctl.c:2029 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" -#: pg_ctl.c:2057 +#: pg_ctl.c:2054 #, c-format msgid "%s: unrecognized shutdown mode \"%s\"\n" msgstr "%s: невідомий режим Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ \"%s\"\n" -#: pg_ctl.c:2086 +#: pg_ctl.c:2083 #, c-format msgid "%s: unrecognized signal name \"%s\"\n" msgstr "%s: невідомий Ñигнал \"%s\"\n" -#: pg_ctl.c:2103 +#: pg_ctl.c:2100 #, c-format msgid "%s: unrecognized start type \"%s\"\n" msgstr "%s: невідомий тип запуÑку \"%s\"\n" -#: pg_ctl.c:2159 +#: pg_ctl.c:2156 #, c-format msgid "%s: could not determine the data directory using command \"%s\"\n" msgstr "%s: неможливо визначити каталог даних за допомогою команди \"%s\"\n" -#: pg_ctl.c:2182 +#: pg_ctl.c:2179 #, c-format msgid "%s: control file appears to be corrupt\n" msgstr "%s: контрольний файл видаєтьÑÑ Ð¿Ð¾ÑˆÐºÐ¾Ð´Ð¶ÐµÐ½Ð¸Ð¼\n" -#: pg_ctl.c:2250 +#: pg_ctl.c:2247 #, c-format -msgid "" -"%s: cannot be run as root\n" +msgid "%s: cannot be run as root\n" "Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" "own the server process.\n" -msgstr "" -"%s: не може бути запущеним від ім'Ñ Ñупер-кориÑтувача\n" +msgstr "%s: не може бути запущеним від ім'Ñ Ñупер-кориÑтувача\n" " Будь лаÑка увійдіть (викориÑтовуючи наприклад, \"su\") Ñк (непривілейований) кориÑтувач Ñкий буде мати\n" "Ñвій Ñерверний процеÑ. \n" -#: pg_ctl.c:2333 +#: pg_ctl.c:2319 #, c-format msgid "%s: -S option not supported on this platform\n" msgstr "%s: параметр -S не підтримуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ платформою\n" -#: pg_ctl.c:2370 -#, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: забагато аргументів у командному Ñ€Ñдку (перший \"%s\")\n" - -#: pg_ctl.c:2396 +#: pg_ctl.c:2375 #, c-format msgid "%s: missing arguments for kill mode\n" msgstr "%s: відÑутні аргументи Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ñƒ kill\n" -#: pg_ctl.c:2414 +#: pg_ctl.c:2393 #, c-format msgid "%s: unrecognized operation mode \"%s\"\n" msgstr "%s: невідомий режим роботи \"%s\"\n" -#: pg_ctl.c:2424 +#: pg_ctl.c:2402 +#, c-format +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: забагато аргументів у командному Ñ€Ñдку (перший \"%s\")\n" + +#: pg_ctl.c:2409 #, c-format msgid "%s: no operation specified\n" msgstr "%s: команда не вказана\n" -#: pg_ctl.c:2445 +#: pg_ctl.c:2430 #, c-format msgid "%s: no database directory specified and environment variable PGDATA unset\n" msgstr "%s: не вказано каталог даних Ñ– змінна Ñередовища PGDATA не вÑтановлена\n" + diff --git a/src/bin/pg_ctl/po/zh_TW.po b/src/bin/pg_ctl/po/zh_TW.po new file mode 100644 index 0000000000000..a8937759b1a0a --- /dev/null +++ b/src/bin/pg_ctl/po/zh_TW.po @@ -0,0 +1,983 @@ +# Traditional Chinese message translation file for pg_ctl +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_ctl (PostgreSQL) package. +# 2004-12-13 Zhenbang Wei +# +msgid "" +msgstr "" +"Project-Id-Version: pg_ctl (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-05 20:48+0000\n" +"PO-Revision-Date: 2023-09-11 08:37+0800\n" +"Last-Translator: Zhenbang Wei \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.3.2\n" + +# command.c:122 +#: ../../common/exec.c:172 +#, c-format +msgid "invalid binary \"%s\": %m" +msgstr "無效的執行檔 \"%s\": %m" + +# command.c:1103 +#: ../../common/exec.c:215 +#, c-format +msgid "could not read binary \"%s\": %m" +msgstr "無法讀å–執行檔 \"%s\": %m" + +#: ../../common/exec.c:223 +#, c-format +msgid "could not find a \"%s\" to execute" +msgstr "找ä¸åˆ°å¯åŸ·è¡Œçš„ \"%s\"" + +# utils/error/elog.c:1128 +#: ../../common/exec.c:250 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "無法解æžè·¯å¾‘ \"%s\" 為絕å°è·¯å¾‘: %m" + +# fe-misc.c:991 +#: ../../common/exec.c:412 +#, c-format +msgid "%s() failed: %m" +msgstr "%s() 失敗: %m" + +# commands/sequence.c:798 executor/execGrouping.c:328 +# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43 +# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006 +# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527 +# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623 +# postmaster/postmaster.c:755 postmaster/postmaster.c:1625 +# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139 +# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766 +# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138 +# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297 +# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73 +# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191 +# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164 +# utils/cache/relcache.c:178 utils/cache/relcache.c:1130 +# utils/cache/typcache.c:165 utils/cache/typcache.c:487 +# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532 +# utils/init/miscinit.c:213 utils/init/miscinit.c:234 +# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911 +# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503 +# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75 +#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +msgid "out of memory" +msgstr "記憶體ä¸è¶³" + +# commands/sequence.c:798 executor/execGrouping.c:328 +# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43 +# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006 +# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527 +# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623 +# postmaster/postmaster.c:755 postmaster/postmaster.c:1625 +# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139 +# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766 +# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138 +# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297 +# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73 +# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191 +# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164 +# utils/cache/relcache.c:178 utils/cache/relcache.c:1130 +# utils/cache/typcache.c:165 utils/cache/typcache.c:487 +# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532 +# utils/init/miscinit.c:213 utils/init/miscinit.c:234 +# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911 +# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503 +# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#: ../../port/path.c:753 ../../port/path.c:791 ../../port/path.c:808 +#, c-format +msgid "out of memory\n" +msgstr "記憶體ä¸è¶³\n" + +# common.c:78 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "無法複製 null 指標(內部錯誤)\n" + +#: ../../common/wait_error.c:55 +#, c-format +msgid "command not executable" +msgstr "無法執行指令" + +#: ../../common/wait_error.c:59 +#, c-format +msgid "command not found" +msgstr "找ä¸åˆ°æŒ‡ä»¤" + +#: ../../common/wait_error.c:64 +#, c-format +msgid "child process exited with exit code %d" +msgstr "å­è¡Œç¨‹çµæŸï¼ŒçµæŸç¢¼ %d" + +#: ../../common/wait_error.c:72 +#, c-format +msgid "child process was terminated by exception 0x%X" +msgstr "å­è¡Œç¨‹å› ç•°å¸¸ 0x%X è€Œåœæ­¢" + +#: ../../common/wait_error.c:76 +#, c-format +msgid "child process was terminated by signal %d: %s" +msgstr "å­è¡Œç¨‹å› ä¿¡è™Ÿ %d è€Œåœæ­¢: %s" + +#: ../../common/wait_error.c:82 +#, c-format +msgid "child process exited with unrecognized status %d" +msgstr "å­è¡Œç¨‹çµæŸï¼Œä¸æ˜Žç‹€æ…‹ç¢¼ %d" + +#: ../../port/path.c:775 +#, c-format +msgid "could not get current working directory: %s\n" +msgstr "無法å–å¾—ç›®å‰çš„工作目錄: %s\n" + +# postmaster/postmaster.c:892 +#: pg_ctl.c:255 +#, c-format +msgid "%s: directory \"%s\" does not exist\n" +msgstr "%s: 目錄 \"%s\" ä¸å­˜åœ¨\n" + +#: pg_ctl.c:258 +#, c-format +msgid "%s: could not access directory \"%s\": %s\n" +msgstr "%s: 無法存å–目錄 \"%s\": %s\n" + +# postmaster/postmaster.c:892 +#: pg_ctl.c:271 +#, c-format +msgid "%s: directory \"%s\" is not a database cluster directory\n" +msgstr "%s: 目錄 \"%s\" 䏿˜¯è³‡æ–™åº«å¢é›†ç›®éŒ„\n" + +#: pg_ctl.c:284 +#, c-format +msgid "%s: could not open PID file \"%s\": %s\n" +msgstr "%s: 無法開啟 PID 檔 \"%s\": %s\n" + +#: pg_ctl.c:293 +#, c-format +msgid "%s: the PID file \"%s\" is empty\n" +msgstr "%s: PID 檔 \"%s\" 是空的\n" + +# access/transam/xlog.c:5414 access/transam/xlog.c:5535 +# access/transam/xlog.c:5541 access/transam/xlog.c:5572 +# access/transam/xlog.c:5578 +#: pg_ctl.c:296 +#, c-format +msgid "%s: invalid data in PID file \"%s\"\n" +msgstr "%s: PID 檔 \"%s\" 中的資料無效\n" + +#: pg_ctl.c:458 pg_ctl.c:500 +#, c-format +msgid "%s: could not start server: %s\n" +msgstr "%s: 無法啟動伺æœå™¨: %s\n" + +#: pg_ctl.c:478 +#, c-format +msgid "%s: could not start server due to setsid() failure: %s\n" +msgstr "%s: 由於 setsid() 失敗,無法啟動伺æœå™¨: %s\n" + +# command.c:1148 +#: pg_ctl.c:548 +#, c-format +msgid "%s: could not open log file \"%s\": %s\n" +msgstr "%s: 無法開啟日誌檔 \"%s\": %s\n" + +#: pg_ctl.c:565 +#, c-format +msgid "%s: could not start server: error code %lu\n" +msgstr "%s: 無法啟動伺æœå™¨: 錯誤碼 %lu\n" + +#: pg_ctl.c:782 +#, c-format +msgid "%s: cannot set core file size limit; disallowed by hard limit\n" +msgstr "%s: 無法設定核心檔案大å°é™åˆ¶ï¼Œè¢«ç¡¬é™åˆ¶ç¦æ­¢\n" + +#: pg_ctl.c:808 +#, c-format +msgid "%s: could not read file \"%s\"\n" +msgstr "%s: ç„¡æ³•è®€å–æª”案 \"%s\"\n" + +#: pg_ctl.c:813 +#, c-format +msgid "%s: option file \"%s\" must have exactly one line\n" +msgstr "%s: é¸é …檔 \"%s\" åªèƒ½æœ‰ä¸€è¡Œå…§å®¹\n" + +#: pg_ctl.c:855 pg_ctl.c:1039 pg_ctl.c:1107 +#, c-format +msgid "%s: could not send stop signal (PID: %d): %s\n" +msgstr "%s: 無法發é€åœæ­¢ä¿¡è™Ÿ(PID: %d): %s\n" + +#: pg_ctl.c:883 +#, c-format +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"\n" +msgstr "ç¨‹å¼ \"%s\" 被 %s 所需,但在相åŒç›®éŒ„中並未找到 \"%s\"。\n" + +#: pg_ctl.c:886 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s\n" +msgstr "ç¨‹å¼ \"%s\" 被 \"%s\" 找到,但版本與 %s ä¸ç›¸åŒã€‚\n" + +#: pg_ctl.c:918 +#, c-format +msgid "%s: database system initialization failed\n" +msgstr "%s: 資料庫系統åˆå§‹åŒ–失敗。\n" + +#: pg_ctl.c:933 +#, c-format +msgid "%s: another server might be running; trying to start server anyway\n" +msgstr "%s: å¯èƒ½æœ‰å¦ä¸€å€‹ä¼ºæœå™¨æ­£åœ¨åŸ·è¡Œï¼›å˜—試強制啟動伺æœå™¨\n" + +#: pg_ctl.c:981 +msgid "waiting for server to start..." +msgstr "等待伺æœå™¨å•Ÿå‹•中..." + +#: pg_ctl.c:986 pg_ctl.c:1063 pg_ctl.c:1126 pg_ctl.c:1238 +msgid " done\n" +msgstr " 完æˆ\n" + +#: pg_ctl.c:987 +msgid "server started\n" +msgstr "伺æœå™¨å·²å•Ÿå‹•\n" + +#: pg_ctl.c:990 pg_ctl.c:996 pg_ctl.c:1243 +msgid " stopped waiting\n" +msgstr " åœæ­¢ç­‰å¾…\n" + +#: pg_ctl.c:991 +#, c-format +msgid "%s: server did not start in time\n" +msgstr "%s: 伺æœå™¨æœªèƒ½åŠæ™‚啟動\n" + +#: pg_ctl.c:997 +#, c-format +msgid "" +"%s: could not start server\n" +"Examine the log output.\n" +msgstr "" +"%s: 無法啟動伺æœå™¨\n" +"請檢查日誌輸出。\n" + +#: pg_ctl.c:1005 +msgid "server starting\n" +msgstr "伺æœå™¨å•Ÿå‹•中\n" + +#: pg_ctl.c:1024 pg_ctl.c:1083 pg_ctl.c:1147 pg_ctl.c:1186 pg_ctl.c:1267 +#, c-format +msgid "%s: PID file \"%s\" does not exist\n" +msgstr "%s: PID 檔 \"%s\" ä¸å­˜åœ¨\n" + +#: pg_ctl.c:1025 pg_ctl.c:1085 pg_ctl.c:1148 pg_ctl.c:1187 pg_ctl.c:1268 +msgid "Is server running?\n" +msgstr "伺æœå™¨æ˜¯å¦åœ¨åŸ·è¡Œä¸­?\n" + +#: pg_ctl.c:1031 +#, c-format +msgid "%s: cannot stop server; single-user server is running (PID: %d)\n" +msgstr "%s: ç„¡æ³•åœæ­¢ä¼ºæœå™¨ï¼Œå–®äººæ¨¡å¼ä¼ºæœå™¨åŸ·è¡Œä¸­(PID: %d)\n" + +#: pg_ctl.c:1046 +msgid "server shutting down\n" +msgstr "伺æœå™¨é—œé–‰ä¸­\n" + +#: pg_ctl.c:1051 pg_ctl.c:1112 +msgid "waiting for server to shut down..." +msgstr "等待伺æœå™¨é—œé–‰ä¸­..." + +#: pg_ctl.c:1055 pg_ctl.c:1117 +msgid " failed\n" +msgstr " 失敗\n" + +#: pg_ctl.c:1057 pg_ctl.c:1119 +#, c-format +msgid "%s: server does not shut down\n" +msgstr "%s: 伺æœå™¨æœªåœæ­¢\n" + +#: pg_ctl.c:1059 pg_ctl.c:1121 +msgid "" +"HINT: The \"-m fast\" option immediately disconnects sessions rather than\n" +"waiting for session-initiated disconnection.\n" +msgstr "æç¤º: 使用 \"-m fast\" é¸é …會立å³ä¸­æ–·å·¥ä½œéšŽæ®µï¼Œè€Œä¸æ˜¯ç­‰å¾…由工作階段發起的斷線。\n" + +#: pg_ctl.c:1065 pg_ctl.c:1127 +msgid "server stopped\n" +msgstr "伺æœå™¨å·²åœæ­¢\n" + +#: pg_ctl.c:1086 +msgid "trying to start server anyway\n" +msgstr "嘗試強制啟動伺æœå™¨ã€‚\n" + +#: pg_ctl.c:1095 +#, c-format +msgid "%s: cannot restart server; single-user server is running (PID: %d)\n" +msgstr "%s: ç„¡æ³•é‡æ–°å•Ÿå‹•伺æœå™¨ï¼Œå–®äººæ¨¡å¼ä¼ºæœå™¨åŸ·è¡Œä¸­(PID: %d)\n" + +#: pg_ctl.c:1098 pg_ctl.c:1157 +msgid "Please terminate the single-user server and try again.\n" +msgstr "è«‹çµæŸå–®äººæ¨¡å¼ä¼ºæœå™¨ï¼Œç„¶å¾Œå†è©¦ä¸€æ¬¡ã€‚\n" + +#: pg_ctl.c:1131 +#, c-format +msgid "%s: old server process (PID: %d) seems to be gone\n" +msgstr "%s: 舊的伺æœå™¨è¡Œç¨‹(PID: %d) 似乎已經ä¸å­˜åœ¨\n" + +#: pg_ctl.c:1133 +msgid "starting server anyway\n" +msgstr "強制啟動伺æœå™¨ä¸­\n" + +#: pg_ctl.c:1154 +#, c-format +msgid "%s: cannot reload server; single-user server is running (PID: %d)\n" +msgstr "%s: ç„¡æ³•é‡æ–°è¼‰å…¥ä¼ºæœå™¨ï¼Œå–®äººæ¨¡å¼ä¼ºæœå™¨åŸ·è¡Œä¸­(PID: %d)\n" + +#: pg_ctl.c:1163 +#, c-format +msgid "%s: could not send reload signal (PID: %d): %s\n" +msgstr "%s: 無法發é€é‡æ–°è¼‰å…¥ä¿¡è™Ÿ(PID: %d): %s\n" + +#: pg_ctl.c:1168 +msgid "server signaled\n" +msgstr "伺æœå™¨å·²æ”¶åˆ°ä¿¡è™Ÿ\n" + +#: pg_ctl.c:1193 +#, c-format +msgid "%s: cannot promote server; single-user server is running (PID: %d)\n" +msgstr "%s: 無法å‡ç´šä¼ºæœå™¨ï¼Œå–®äººæ¨¡å¼ä¼ºæœå™¨åŸ·è¡Œä¸­(PID: %d)\n" + +#: pg_ctl.c:1201 +#, c-format +msgid "%s: cannot promote server; server is not in standby mode\n" +msgstr "%s: 無法å‡ç´šä¼ºæœå™¨ï¼Œä¼ºæœå™¨ä¸åœ¨å¾…機模å¼\n" + +# postmaster/postmaster.c:799 +#: pg_ctl.c:1211 +#, c-format +msgid "%s: could not create promote signal file \"%s\": %s\n" +msgstr "%s: 無法建立å‡ç´šä¿¡è™Ÿæª”案 \"%s\": %s\n" + +# postmaster/postmaster.c:799 +#: pg_ctl.c:1217 +#, c-format +msgid "%s: could not write promote signal file \"%s\": %s\n" +msgstr "%s: 無法寫入å‡ç´šä¿¡è™Ÿæª” \"%s\": %s\n" + +#: pg_ctl.c:1225 +#, c-format +msgid "%s: could not send promote signal (PID: %d): %s\n" +msgstr "%s: 無法發é€å‡ç´šä¿¡è™Ÿ(PID: %d): %s\n" + +#: pg_ctl.c:1228 +#, c-format +msgid "%s: could not remove promote signal file \"%s\": %s\n" +msgstr "%s: 無法刪除å‡ç´šä¿¡è™Ÿæª” \"%s\": %s\n" + +#: pg_ctl.c:1235 +msgid "waiting for server to promote..." +msgstr "等得伺æœå™¨å‡ç´šä¸­..." + +#: pg_ctl.c:1239 +msgid "server promoted\n" +msgstr "伺æœå™¨å·²å‡ç´š\n" + +#: pg_ctl.c:1244 +#, c-format +msgid "%s: server did not promote in time\n" +msgstr "%s: 伺æœå™¨æœªèƒ½åŠæ™‚å‡ç´š\n" + +#: pg_ctl.c:1250 +msgid "server promoting\n" +msgstr "伺æœå™¨å‡ç´šä¸­\n" + +#: pg_ctl.c:1274 +#, c-format +msgid "%s: cannot rotate log file; single-user server is running (PID: %d)\n" +msgstr "%s: 無法輪替日誌檔,單人模å¼ä¼ºæœå™¨åŸ·è¡Œä¸­(PID: %d)\n" + +# postmaster/postmaster.c:799 +#: pg_ctl.c:1284 +#, c-format +msgid "%s: could not create log rotation signal file \"%s\": %s\n" +msgstr "%s: 無法建立日誌輪替信號檔 \"%s\": %s\n" + +# postmaster/postmaster.c:799 +#: pg_ctl.c:1290 +#, c-format +msgid "%s: could not write log rotation signal file \"%s\": %s\n" +msgstr "%s: 無法寫入日誌輪替信號檔 \"%s\": %s\n" + +#: pg_ctl.c:1298 +#, c-format +msgid "%s: could not send log rotation signal (PID: %d): %s\n" +msgstr "%s: ç„¡æ³•ç™¼é€æ—¥èªŒè¼ªæ›¿ä¿¡è™Ÿ(PID: %d): %s\n" + +#: pg_ctl.c:1301 +#, c-format +msgid "%s: could not remove log rotation signal file \"%s\": %s\n" +msgstr "%s: 無法刪除日誌輪替信號檔 \"%s\": %s\n" + +# commands/user.c:655 +#: pg_ctl.c:1306 +msgid "server signaled to rotate log file\n" +msgstr "伺æœå™¨å·²æ”¶åˆ°æ—¥èªŒè¼ªæ›¿ä¿¡è™Ÿ\n" + +#: pg_ctl.c:1353 +#, c-format +msgid "%s: single-user server is running (PID: %d)\n" +msgstr "%s: 單人模å¼ä¼ºæœå™¨åŸ·è¡Œä¸­(PID: %d)\n" + +#: pg_ctl.c:1367 +#, c-format +msgid "%s: server is running (PID: %d)\n" +msgstr "%s: 伺æœå™¨åŸ·è¡Œä¸­(PID: %d)\n" + +#: pg_ctl.c:1383 +#, c-format +msgid "%s: no server running\n" +msgstr "%s: 沒有執行中的伺æœå™¨\n" + +#: pg_ctl.c:1400 +#, c-format +msgid "%s: could not send signal %d (PID: %d): %s\n" +msgstr "%s: 無法發é€ä¿¡è™Ÿ %d(PID: %d): %s\n" + +#: pg_ctl.c:1431 +#, c-format +msgid "%s: could not find own program executable\n" +msgstr "%s: 找ä¸åˆ°è‡ªèº«çš„程å¼åŸ·è¡Œæª”\n" + +#: pg_ctl.c:1441 +#, c-format +msgid "%s: could not find postgres program executable\n" +msgstr "%s: 找ä¸åˆ° postgres 程å¼çš„執行檔\n" + +#: pg_ctl.c:1511 pg_ctl.c:1545 +#, c-format +msgid "%s: could not open service manager\n" +msgstr "%s: 無法開啟æœå‹™ç®¡ç†å“¡\n" + +#: pg_ctl.c:1517 +#, c-format +msgid "%s: service \"%s\" already registered\n" +msgstr "%s: æœå‹™ \"%s\" 已註冊\n" + +#: pg_ctl.c:1528 +#, c-format +msgid "%s: could not register service \"%s\": error code %lu\n" +msgstr "%s: 無法註冊æœå‹™ \"%s\": 錯誤碼 %lu\n" + +#: pg_ctl.c:1551 +#, c-format +msgid "%s: service \"%s\" not registered\n" +msgstr "%s: æœå‹™ \"%s\" 未註冊\n" + +#: pg_ctl.c:1558 +#, c-format +msgid "%s: could not open service \"%s\": error code %lu\n" +msgstr "%s: 無法開啟æœå‹™ \"%s\": 錯誤碼 %lu\n" + +#: pg_ctl.c:1567 +#, c-format +msgid "%s: could not unregister service \"%s\": error code %lu\n" +msgstr "%s: ç„¡æ³•å–æ¶ˆè¨»å†Šæœå‹™ \"%s\": 錯誤碼 %lu\n" + +#: pg_ctl.c:1654 +msgid "Waiting for server startup...\n" +msgstr "等待伺æœå™¨å•Ÿå‹•...\n" + +#: pg_ctl.c:1657 +msgid "Timed out waiting for server startup\n" +msgstr "等待伺æœå™¨å•Ÿå‹•逾時\n" + +# utils/init/postinit.c:130 +#: pg_ctl.c:1661 +msgid "Server started and accepting connections\n" +msgstr "伺æœå™¨å·²å•Ÿå‹•並接å—連線\n" + +#: pg_ctl.c:1716 +#, c-format +msgid "%s: could not start service \"%s\": error code %lu\n" +msgstr "%s: 無法啟動æœå‹™ \"%s\": 錯誤碼 %lu\n" + +# port/win32/security.c:39 +#: pg_ctl.c:1789 +#, c-format +msgid "%s: could not open process token: error code %lu\n" +msgstr "%s: 無法開啟行程 token: 錯誤碼 %lu\n" + +#: pg_ctl.c:1803 +#, c-format +msgid "%s: could not allocate SIDs: error code %lu\n" +msgstr "%s: 無法é…ç½® SID: 錯誤碼 %lu\n" + +# port/win32/signal.c:239 +#: pg_ctl.c:1829 +#, c-format +msgid "%s: could not create restricted token: error code %lu\n" +msgstr "%s: 無法建立å—é™åˆ¶çš„ token: 錯誤碼 %lu\n" + +#: pg_ctl.c:1911 +#, c-format +msgid "%s: could not get LUIDs for privileges: error code %lu\n" +msgstr "%s: 無法å–得特權的LUID: 錯誤碼 %lu\n" + +#: pg_ctl.c:1919 pg_ctl.c:1934 +#, c-format +msgid "%s: could not get token information: error code %lu\n" +msgstr "%s: 無法å–å¾— token 資訊: 錯誤碼 %lu\n" + +#: pg_ctl.c:1928 +#, c-format +msgid "%s: out of memory\n" +msgstr "%s: 記憶體ä¸è¶³\n" + +#: pg_ctl.c:1958 +#, c-format +msgid "Try \"%s --help\" for more information.\n" +msgstr "用 \"%s --help\" å–得更多資訊。\n" + +#: pg_ctl.c:1966 +#, c-format +msgid "" +"%s is a utility to initialize, start, stop, or control a PostgreSQL server.\n" +"\n" +msgstr "" +"%s 是用於åˆå§‹åŒ–ã€å•Ÿå‹•ã€åœæ­¢æˆ–控制 PostgreSQL 伺æœå™¨çš„工具。\n" +"\n" + +#: pg_ctl.c:1967 +#, c-format +msgid "Usage:\n" +msgstr "用法:\n" + +#: pg_ctl.c:1968 +#, c-format +msgid " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" +msgstr " %s init[db] [-D DATADIR] [-s] [-o OPTIONS]\n" + +#: pg_ctl.c:1969 +#, c-format +msgid "" +" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" +" [-o OPTIONS] [-p PATH] [-c]\n" +msgstr "" +" %s start [-D DATADIR] [-l FILENAME] [-W] [-t SECS] [-s]\n" +" [-o OPTIONS] [-p PATH] [-c]\n" + +#: pg_ctl.c:1971 +#, c-format +msgid " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" +msgstr " %s stop [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" + +#: pg_ctl.c:1972 +#, c-format +msgid "" +" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" +" [-o OPTIONS] [-c]\n" +msgstr "" +" %s restart [-D DATADIR] [-m SHUTDOWN-MODE] [-W] [-t SECS] [-s]\n" +" [-o OPTIONS] [-c]\n" + +#: pg_ctl.c:1974 +#, c-format +msgid " %s reload [-D DATADIR] [-s]\n" +msgstr " %s reload [-D DATADIR] [-s]\n" + +#: pg_ctl.c:1975 +#, c-format +msgid " %s status [-D DATADIR]\n" +msgstr " %s status [-D DATADIR]\n" + +#: pg_ctl.c:1976 +#, c-format +msgid " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" +msgstr " %s promote [-D DATADIR] [-W] [-t SECS] [-s]\n" + +#: pg_ctl.c:1977 +#, c-format +msgid " %s logrotate [-D DATADIR] [-s]\n" +msgstr " %s logrotate [-D DATADIR] [-s]\n" + +#: pg_ctl.c:1978 +#, c-format +msgid " %s kill SIGNALNAME PID\n" +msgstr " %s kill SIGNALNAME PID\n" + +#: pg_ctl.c:1980 +#, c-format +msgid "" +" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" +" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" +msgstr "" +" %s register [-D DATADIR] [-N SERVICENAME] [-U USERNAME] [-P PASSWORD]\n" +" [-S START-TYPE] [-e SOURCE] [-W] [-t SECS] [-s] [-o OPTIONS]\n" + +#: pg_ctl.c:1982 +#, c-format +msgid " %s unregister [-N SERVICENAME]\n" +msgstr " %s unregister [-N SERVICENAME]\n" + +#: pg_ctl.c:1985 +#, c-format +msgid "" +"\n" +"Common options:\n" +msgstr "" +"\n" +"常用é¸é …:\n" + +#: pg_ctl.c:1986 +#, c-format +msgid " -D, --pgdata=DATADIR location of the database storage area\n" +msgstr " -D, --pgdata=DATADIR 資料庫儲存å€åŸŸçš„ä½ç½®\n" + +#: pg_ctl.c:1988 +#, c-format +msgid " -e SOURCE event source for logging when running as a service\n" +msgstr " -e SOURCE 在作為æœå‹™é‹è¡Œæ™‚的記錄事件來æº\n" + +#: pg_ctl.c:1990 +#, c-format +msgid " -s, --silent only print errors, no informational messages\n" +msgstr " -s, --silent 僅顯示錯誤訊æ¯ï¼Œä¸é¡¯ç¤ºè³‡è¨Šæ€§è¨Šæ¯ã€‚\n" + +#: pg_ctl.c:1991 +#, c-format +msgid " -t, --timeout=SECS seconds to wait when using -w option\n" +msgstr " -t, --timeout=SECS 使用 -w é¸é …時等待的秒數\n" + +#: pg_ctl.c:1992 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version é¡¯ç¤ºç‰ˆæœ¬ï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_ctl.c:1993 +#, c-format +msgid " -w, --wait wait until operation completes (default)\n" +msgstr " -w, --wait 等待æ“作完æˆ(é è¨­å€¼)\n" + +#: pg_ctl.c:1994 +#, c-format +msgid " -W, --no-wait do not wait until operation completes\n" +msgstr " -W, --no-wait ä¸ç­‰å¾…æ“作完æˆ\n" + +#: pg_ctl.c:1995 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help é¡¯ç¤ºèªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_ctl.c:1996 +#, c-format +msgid "If the -D option is omitted, the environment variable PGDATA is used.\n" +msgstr "è‹¥çœç•¥ -D é¸é …,將使用環境變數 PGDATA。\n" + +#: pg_ctl.c:1998 +#, c-format +msgid "" +"\n" +"Options for start or restart:\n" +msgstr "" +"\n" +"å•Ÿå‹•æˆ–é‡æ–°å•Ÿå‹•çš„é¸é …:\n" + +#: pg_ctl.c:2000 +#, c-format +msgid " -c, --core-files allow postgres to produce core files\n" +msgstr " -c, --core-files å…許 PostgreSQL ç”Ÿæˆæ ¸å¿ƒå‚¾å°\n" + +#: pg_ctl.c:2002 +#, c-format +msgid " -c, --core-files not applicable on this platform\n" +msgstr " -c, --core-files ä¸é©ç”¨æ­¤å¹³å°\n" + +#: pg_ctl.c:2004 +#, c-format +msgid " -l, --log=FILENAME write (or append) server log to FILENAME\n" +msgstr " -l, --log=FILENAME 將伺æœå™¨æ—¥èªŒå¯«å…¥(或附加到)檔案 FILENAME\n" + +#: pg_ctl.c:2005 +#, c-format +msgid "" +" -o, --options=OPTIONS command line options to pass to postgres\n" +" (PostgreSQL server executable) or initdb\n" +msgstr " -o, --options=OPTIONS 傳éžçµ¦ postgres(PostgreSQL 伺æœå™¨åŸ·è¡Œæª”)或 initdb 的命令列é¸é …\n" + +#: pg_ctl.c:2007 +#, c-format +msgid " -p PATH-TO-POSTGRES normally not necessary\n" +msgstr " -p PATH-TO-POSTGRES 通常ä¸éœ€è¦\n" + +#: pg_ctl.c:2008 +#, c-format +msgid "" +"\n" +"Options for stop or restart:\n" +msgstr "" +"\n" +"åœæ­¢æˆ–釿–°å•Ÿå‹•çš„é¸é …:\n" + +#: pg_ctl.c:2009 +#, c-format +msgid " -m, --mode=MODE MODE can be \"smart\", \"fast\", or \"immediate\"\n" +msgstr " -m, --mode=MODE MODE å¯ä»¥æ˜¯ \"smart\", \"fast\", \"immediate\"\n" + +#: pg_ctl.c:2011 +#, c-format +msgid "" +"\n" +"Shutdown modes are:\n" +msgstr "" +"\n" +"åœæ­¢æ¨¡å¼: \n" + +#: pg_ctl.c:2012 +#, c-format +msgid " smart quit after all clients have disconnected\n" +msgstr " smart åœ¨æ‰€æœ‰å®¢æˆ¶ç«¯ä¸­æ–·é€£ç·šå¾ŒçµæŸ\n" + +#: pg_ctl.c:2013 +#, c-format +msgid " fast quit directly, with proper shutdown (default)\n" +msgstr " fast ç›´æŽ¥çµæŸï¼Œæ­£å¸¸åœæ­¢(é è¨­)\n" + +#: pg_ctl.c:2014 +#, c-format +msgid " immediate quit without complete shutdown; will lead to recovery on restart\n" +msgstr " immediate ç«‹å³çµæŸï¼Œä¸é€²è¡Œå®Œæ•´çš„åœæ­¢ï¼›é‡æ–°å•Ÿå‹•時將進行復原\n" + +#: pg_ctl.c:2016 +#, c-format +msgid "" +"\n" +"Allowed signal names for kill:\n" +msgstr "" +"\n" +"å…許用於 kill 命令的信號å稱:\n" + +#: pg_ctl.c:2020 +#, c-format +msgid "" +"\n" +"Options for register and unregister:\n" +msgstr "" +"\n" +"è¨»å†Šå’Œå–æ¶ˆè¨»å†Šæœå‹™çš„é¸é …:\n" + +#: pg_ctl.c:2021 +#, c-format +msgid " -N SERVICENAME service name with which to register PostgreSQL server\n" +msgstr " -N SERVICENAME 註冊 PostgreSQL 伺æœå™¨çš„æœå‹™å稱\n" + +#: pg_ctl.c:2022 +#, c-format +msgid " -P PASSWORD password of account to register PostgreSQL server\n" +msgstr " -P PASSWORD 註冊 PostgreSQL 伺æœå™¨çš„帳號密碼\n" + +#: pg_ctl.c:2023 +#, c-format +msgid " -U USERNAME user name of account to register PostgreSQL server\n" +msgstr " -U USERNAME 註冊 PostgreSQL 伺æœå™¨çš„帳號å稱\n" + +#: pg_ctl.c:2024 +#, c-format +msgid " -S START-TYPE service start type to register PostgreSQL server\n" +msgstr " -S START-TYPE 註冊 PostgreSQL 伺æœå™¨çš„啟動方å¼\n" + +#: pg_ctl.c:2026 +#, c-format +msgid "" +"\n" +"Start types are:\n" +msgstr "" +"\n" +"啟動方å¼:\n" + +#: pg_ctl.c:2027 +#, c-format +msgid " auto start service automatically during system startup (default)\n" +msgstr " auto 系統啟動時自動啟動æœå‹™(é è¨­)\n" + +#: pg_ctl.c:2028 +#, c-format +msgid " demand start service on demand\n" +msgstr " demand 手動啟動æœå‹™\n" + +#: pg_ctl.c:2031 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"回報錯誤至 <%s>。\n" + +#: pg_ctl.c:2032 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s ç¶²é : <%s>\n" + +#: pg_ctl.c:2057 +#, c-format +msgid "%s: unrecognized shutdown mode \"%s\"\n" +msgstr "%s: ç„¡æ³•è­˜åˆ¥çš„é—œåœæ¨¡å¼ \"%s\"\n" + +#: pg_ctl.c:2086 +#, c-format +msgid "%s: unrecognized signal name \"%s\"\n" +msgstr "%s: 無法識別的信號å稱 \"%s\"\n" + +#: pg_ctl.c:2103 +#, c-format +msgid "%s: unrecognized start type \"%s\"\n" +msgstr "%s: ç„¡æ³•è­˜åˆ¥çš„å•Ÿå‹•æ–¹å¼ \"%s\"\n" + +#: pg_ctl.c:2159 +#, c-format +msgid "%s: could not determine the data directory using command \"%s\"\n" +msgstr "%s: 無法使用命令 \"%s\" 確定資料目錄\n" + +#: pg_ctl.c:2182 +#, c-format +msgid "%s: control file appears to be corrupt\n" +msgstr "%s: 控制檔似乎æå£ž\n" + +#: pg_ctl.c:2250 +#, c-format +msgid "" +"%s: cannot be run as root\n" +"Please log in (using, e.g., \"su\") as the (unprivileged) user that will\n" +"own the server process.\n" +msgstr "" +"%s: 無法以 root 身分執行\n" +"è«‹ä»¥å°‡æœƒæ“æœ‰ä¼ºæœå‹™è¡Œç¨‹çš„(éžç‰¹æ¬Š)使用者登入(例如用 \"su\" 命令)。\n" + +# commands/tablespace.c:386 commands/tablespace.c:483 +#: pg_ctl.c:2333 +#, c-format +msgid "%s: -S option not supported on this platform\n" +msgstr "%s: 此平å°ä¸æ”¯æ´ -S é¸é …\n" + +#: pg_ctl.c:2370 +#, c-format +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: å‘½ä»¤åˆ—åƒæ•¸éŽå¤š(第一個是 \"%s\")\n" + +#: pg_ctl.c:2396 +#, c-format +msgid "%s: missing arguments for kill mode\n" +msgstr "%s: 未指定 kill 模å¼åƒæ•¸\n" + +#: pg_ctl.c:2414 +#, c-format +msgid "%s: unrecognized operation mode \"%s\"\n" +msgstr "%s: 無法識別的æ“ä½œæ¨¡å¼ \"%s\"\n" + +#: pg_ctl.c:2424 +#, c-format +msgid "%s: no operation specified\n" +msgstr "%s: 沒有任何æ“作\n" + +#: pg_ctl.c:2445 +#, c-format +msgid "%s: no database directory specified and environment variable PGDATA unset\n" +msgstr "%s: 未指定資料庫目錄,且未設定環境變數 PGDATA\n" + +#, c-format +#~ msgid " %s start [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]\n" +#~ msgstr " %s start [-w] [-t 秒數] [-D 資料目錄] [-s] [-l 檔å] [-o \"é¸é …\"]\n" + +#, c-format +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help é¡¯ç¤ºé€™ä»½èªªæ˜Žç„¶å¾ŒçµæŸ\n" + +#, c-format +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version é¡¯ç¤ºç‰ˆæœ¬è³‡è¨Šç„¶å¾ŒçµæŸ\n" + +#, c-format +#~ msgid "" +#~ "%s is a utility to start, stop, restart, promote, reload configuration files,\n" +#~ "report the status of a PostgreSQL server, or signal a PostgreSQL process.\n" +#~ "\n" +#~ msgstr "" +#~ "%s å¯ä»¥ç”¨ä¾†å•Ÿå‹•ã€åœæ­¢ã€é‡æ–°å•Ÿå‹•ã€æå‡ã€é‡æ–°è¼‰å…¥è¨­å®šæª”ã€\n" +#~ "報告 PostgreSQL 伺æœå™¨ç‹€æ…‹ï¼Œæˆ–é€ä¿¡è™Ÿçµ¦ PostgreSQL 行程。\n" +#~ "\n" + +#, c-format +#~ msgid "%s: -w option cannot use a relative socket directory specification\n" +#~ msgstr "%s: -w é¸é …ä¸èƒ½å’Œç›¸å° socket 目錄一起使用\n" + +#, c-format +#~ msgid "%s: -w option is not supported when starting a pre-9.1 server\n" +#~ msgstr "%s: 啟動 pre-9.1 伺æœå™¨æ™‚䏿”¯æ´ -w é¸é …\n" + +#~ msgid "%s: a standalone backend \"postgres\" is running (PID: %ld)\n" +#~ msgstr "%s:一個ç¨ç«‹å¾Œç«¯\"postgres\"正在執行(PID:%ld)\n" + +#, c-format +#~ msgid "%s: could not wait for server because of misconfiguration\n" +#~ msgstr "%s: 無法等待伺æœå™¨ï¼Œè¨­å®šéŒ¯èª¤\n" + +#~ msgid "%s: invalid option %s\n" +#~ msgstr "%s:無效的é¸é … %s\n" + +#~ msgid "%s: neither postmaster nor postgres running\n" +#~ msgstr "%s:postmaster或postgres尚未執行\n" + +#, c-format +#~ msgid "%s: this data directory is running a pre-existing postmaster\n" +#~ msgstr "%s: 這個資料目錄正在執行以å‰çš„ postmaster\n" + +#, c-format +#~ msgid "" +#~ "(The default is to wait for shutdown, but not for start or restart.)\n" +#~ "\n" +#~ msgstr "" +#~ "(é è¨­æ˜¯é—œé–‰æ™‚而éžå•Ÿå‹•æˆ–é‡æ–°å•Ÿå‹•時等待。)\n" +#~ "\n" + +#~ msgid "" +#~ "The program \"postmaster\" is needed by %s but was not found in the\n" +#~ "same directory as \"%s\".\n" +#~ "Check your installation.\n" +#~ msgstr "" +#~ "%s 需è¦\"postmaster\"程å¼ï¼Œä½†æ˜¯åœ¨èˆ‡\"%s\"相åŒçš„目錄中找ä¸åˆ°ã€‚\n" +#~ "檢查你的安è£ã€‚\n" + +#~ msgid "" +#~ "The program \"postmaster\" was found by \"%s\"\n" +#~ "but was not the same version as %s.\n" +#~ "Check your installation.\n" +#~ msgstr "" +#~ "\"%s\"已找到程å¼\"postmaster\",但是與 %s 版本ä¸ç¬¦ã€‚\n" +#~ "請檢查你的安è£ã€‚\n" + +#~ msgid "" +#~ "WARNING: online backup mode is active\n" +#~ "Shutdown will not complete until pg_stop_backup() is called.\n" +#~ "\n" +#~ msgstr "" +#~ "警告: 線上備份模å¼ä½œç”¨ä¸­\n" +#~ "å¿…é ˆå‘¼å« pg_stop_backup(),關閉作業æ‰èƒ½å®Œæˆã€‚\n" +#~ "\n" + +#, c-format +#~ msgid "child process was terminated by signal %s" +#~ msgstr "å­è¡Œç¨‹è¢«ä¿¡è™Ÿ %s çµæŸ" + +#, c-format +#~ msgid "could not change directory to \"%s\"" +#~ msgstr "無法切æ›ç›®éŒ„至 \"%s\"" + +#, c-format +#~ msgid "could not read symbolic link \"%s\"" +#~ msgstr "無法讀å–ç¬¦è™Ÿé€£çµ \"%s\"" + +#~ msgid "server is still starting up\n" +#~ msgstr "伺æœå™¨ä»åœ¨å•Ÿå‹•中\n" diff --git a/src/bin/pg_ctl/t/001_start_stop.pl b/src/bin/pg_ctl/t/001_start_stop.pl index f019fe1703f3e..6a5ef0074335d 100644 --- a/src/bin/pg_ctl/t/001_start_stop.pl +++ b/src/bin/pg_ctl/t/001_start_stop.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -23,7 +23,7 @@ command_ok([ $ENV{PG_REGRESS}, '--config-auth', "$tempdir/data" ], 'configure authentication'); my $node_port = PostgreSQL::Test::Cluster::get_free_port(); -open my $conf, '>>', "$tempdir/data/postgresql.conf"; +open my $conf, '>>', "$tempdir/data/postgresql.conf" or die $!; print $conf "fsync = off\n"; print $conf "port = $node_port\n"; print $conf PostgreSQL::Test::Utils::slurp_file($ENV{TEMP_CONFIG}) @@ -79,7 +79,8 @@ SKIP: { - skip "group access not supported on Windows", 3 if ($windows_os); + skip "group access not supported on Windows", 3 + if ($windows_os || $Config::Config{osname} eq 'cygwin'); system_or_bail 'pg_ctl', 'stop', '-D', "$tempdir/data"; diff --git a/src/bin/pg_ctl/t/002_status.pl b/src/bin/pg_ctl/t/002_status.pl index f5c50f6a7db52..1931abc99cb99 100644 --- a/src/bin/pg_ctl/t/002_status.pl +++ b/src/bin/pg_ctl/t/002_status.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_ctl/t/003_promote.pl b/src/bin/pg_ctl/t/003_promote.pl index 0e83933098d94..df01742ccb536 100644 --- a/src/bin/pg_ctl/t/003_promote.pl +++ b/src/bin/pg_ctl/t/003_promote.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_ctl/t/004_logrotate.pl b/src/bin/pg_ctl/t/004_logrotate.pl index 8d48e56ee9b1e..eacca1a652394 100644 --- a/src/bin/pg_ctl/t/004_logrotate.pl +++ b/src/bin/pg_ctl/t/004_logrotate.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_dump/Makefile b/src/bin/pg_dump/Makefile index 24de7593a6ab6..930c741c95d85 100644 --- a/src/bin/pg_dump/Makefile +++ b/src/bin/pg_dump/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/pg_dump # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/bin/pg_dump/Makefile @@ -32,6 +32,7 @@ OBJS = \ compress_none.o \ compress_zstd.o \ dumputils.o \ + filter.o \ parallel.o \ pg_backup_archiver.o \ pg_backup_custom.o \ @@ -49,8 +50,8 @@ pg_dump: pg_dump.o common.o pg_dump_sort.o $(OBJS) | submake-libpq submake-libpg pg_restore: pg_restore.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils $(CC) $(CFLAGS) pg_restore.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) -pg_dumpall: pg_dumpall.o dumputils.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils - $(CC) $(CFLAGS) pg_dumpall.o dumputils.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) +pg_dumpall: pg_dumpall.o dumputils.o filter.o $(WIN32RES) | submake-libpq submake-libpgport submake-libpgfeutils + $(CC) $(CFLAGS) pg_dumpall.o dumputils.o filter.o $(WIN32RES) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) install: all installdirs $(INSTALL_PROGRAM) pg_dump$(X) '$(DESTDIR)$(bindir)'/pg_dump$(X) @@ -69,6 +70,6 @@ installcheck: uninstall: rm -f $(addprefix '$(DESTDIR)$(bindir)'/, pg_dump$(X) pg_restore$(X) pg_dumpall$(X)) -clean distclean maintainer-clean: +clean distclean: rm -f pg_dump$(X) pg_restore$(X) pg_dumpall$(X) $(OBJS) pg_dump.o common.o pg_dump_sort.o pg_restore.o pg_dumpall.o rm -rf tmp_check diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c index 5d988986edc01..64e7dc89f1338 100644 --- a/src/bin/pg_dump/common.c +++ b/src/bin/pg_dump/common.c @@ -4,7 +4,7 @@ * Catalog routines used by pg_dump; long ago these were shared * by another dump tool, but not anymore. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -24,6 +24,7 @@ #include "catalog/pg_operator_d.h" #include "catalog/pg_proc_d.h" #include "catalog/pg_publication_d.h" +#include "catalog/pg_subscription_d.h" #include "catalog/pg_type_d.h" #include "common/hashfn.h" #include "fe_utils/string_utils.h" @@ -46,6 +47,8 @@ static DumpId lastDumpId = 0; /* Note: 0 is InvalidDumpId */ * expects that it can move them around when resizing the table. So we * cannot make the DumpableObjects be elements of the hash table directly; * instead, the hash table elements contain pointers to DumpableObjects. + * This does have the advantage of letting us map multiple CatalogIds + * to one DumpableObject, which is useful for blobs. * * It turns out to be convenient to also use this data structure to map * CatalogIds to owning extensions, if any. Since extension membership @@ -82,7 +85,7 @@ static catalogid_hash *catalogIdHash = NULL; static void flagInhTables(Archive *fout, TableInfo *tblinfo, int numTables, InhInfo *inhinfo, int numInherits); static void flagInhIndexes(Archive *fout, TableInfo *tblinfo, int numTables); -static void flagInhAttrs(DumpOptions *dopt, TableInfo *tblinfo, int numTables); +static void flagInhAttrs(Archive *fout, TableInfo *tblinfo, int numTables); static int strInArray(const char *pattern, char **arr, int arr_size); static IndxInfo *findIndexByOid(Oid oid); @@ -226,7 +229,7 @@ getSchemaData(Archive *fout, int *numTablesPtr) getTableAttrs(fout, tblinfo, numTables); pg_log_info("flagging inherited columns in subtables"); - flagInhAttrs(fout->dopt, tblinfo, numTables); + flagInhAttrs(fout, tblinfo, numTables); pg_log_info("reading partitioning data"); getPartitioningInfo(fout); @@ -264,6 +267,9 @@ getSchemaData(Archive *fout, int *numTablesPtr) pg_log_info("reading subscriptions"); getSubscriptions(fout); + pg_log_info("reading subscription membership of tables"); + getSubscriptionTables(fout); + free(inhinfo); /* not needed any longer */ *numTablesPtr = numTables; @@ -491,8 +497,9 @@ flagInhIndexes(Archive *fout, TableInfo tblinfo[], int numTables) * modifies tblinfo */ static void -flagInhAttrs(DumpOptions *dopt, TableInfo *tblinfo, int numTables) +flagInhAttrs(Archive *fout, TableInfo *tblinfo, int numTables) { + DumpOptions *dopt = fout->dopt; int i, j, k; @@ -692,6 +699,30 @@ AssignDumpId(DumpableObject *dobj) } } +/* + * recordAdditionalCatalogID + * Record an additional catalog ID for the given DumpableObject + */ +void +recordAdditionalCatalogID(CatalogId catId, DumpableObject *dobj) +{ + CatalogIdMapEntry *entry; + bool found; + + /* CatalogId hash table must exist, if we have a DumpableObject */ + Assert(catalogIdHash != NULL); + + /* Add reference to CatalogId hash */ + entry = catalogid_insert(catalogIdHash, catId, &found); + if (!found) + { + entry->dobj = NULL; + entry->ext = NULL; + } + Assert(entry->dobj == NULL); + entry->dobj = dobj; +} + /* * Assign a DumpId that's not tied to a DumpableObject. * @@ -974,6 +1005,24 @@ findPublicationByOid(Oid oid) return (PublicationInfo *) dobj; } +/* + * findSubscriptionByOid + * finds the DumpableObject for the subscription with the given oid + * returns NULL if not found + */ +SubscriptionInfo * +findSubscriptionByOid(Oid oid) +{ + CatalogId catId; + DumpableObject *dobj; + + catId.tableoid = SubscriptionRelationId; + catId.oid = oid; + dobj = findObjectByCatalogId(catId); + Assert(dobj == NULL || dobj->objType == DO_SUBSCRIPTION); + return (SubscriptionInfo *) dobj; +} + /* * recordExtensionMembership diff --git a/src/bin/pg_dump/compress_gzip.c b/src/bin/pg_dump/compress_gzip.c index 63dfd9668c17e..9e1b7c157ea76 100644 --- a/src/bin/pg_dump/compress_gzip.c +++ b/src/bin/pg_dump/compress_gzip.c @@ -3,7 +3,7 @@ * compress_gzip.c * Routines for archivers to read or write a gzip compressed data stream. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -154,7 +154,7 @@ WriteDataToArchiveGzip(ArchiveHandle *AH, CompressorState *cs, { GzipCompressorState *gzipcs = (GzipCompressorState *) cs->private_data; - gzipcs->zp->next_in = (void *) unconstify(void *, data); + gzipcs->zp->next_in = data; gzipcs->zp->avail_in = dLen; DeflateCompressorCommon(AH, cs, false); } @@ -292,7 +292,7 @@ Gzip_getc(CompressFileHandle *CFH) if (ret == EOF) { if (!gzeof(gzfp)) - pg_fatal("could not read from input file: %s", strerror(errno)); + pg_fatal("could not read from input file: %m"); else pg_fatal("could not read from input file: end of file"); } diff --git a/src/bin/pg_dump/compress_gzip.h b/src/bin/pg_dump/compress_gzip.h index 2392c697b4c6b..072a30df14c36 100644 --- a/src/bin/pg_dump/compress_gzip.h +++ b/src/bin/pg_dump/compress_gzip.h @@ -3,7 +3,7 @@ * compress_gzip.h * GZIP interface to compress_io.c routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/bin/pg_dump/compress_io.c b/src/bin/pg_dump/compress_io.c index 4fee6e24348cc..e2edf8bf4f612 100644 --- a/src/bin/pg_dump/compress_io.c +++ b/src/bin/pg_dump/compress_io.c @@ -4,7 +4,7 @@ * Routines for archivers to write an uncompressed or compressed data * stream. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * This file includes two APIs for dealing with compressed data. The first @@ -249,7 +249,7 @@ InitDiscoverCompressFileHandle(const char *path, const char *mode) Assert(strcmp(mode, PG_BINARY_R) == 0); - fname = strdup(path); + fname = pg_strdup(path); if (hasSuffix(fname, ".gz")) compression_spec.algorithm = PG_COMPRESSION_GZIP; diff --git a/src/bin/pg_dump/compress_io.h b/src/bin/pg_dump/compress_io.h index 621e03a5c8583..bbbf1582abc5e 100644 --- a/src/bin/pg_dump/compress_io.h +++ b/src/bin/pg_dump/compress_io.h @@ -3,7 +3,7 @@ * compress_io.h * Interface to compress_io.c routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/bin/pg_dump/compress_lz4.c b/src/bin/pg_dump/compress_lz4.c index 52214b31eea06..7f72492beaf80 100644 --- a/src/bin/pg_dump/compress_lz4.c +++ b/src/bin/pg_dump/compress_lz4.c @@ -3,7 +3,7 @@ * compress_lz4.c * Routines for archivers to write a LZ4 compressed data stream. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -12,9 +12,9 @@ *------------------------------------------------------------------------- */ #include "postgres_fe.h" -#include "pg_backup_utils.h" #include "compress_lz4.h" +#include "pg_backup_utils.h" #ifdef USE_LZ4 #include diff --git a/src/bin/pg_dump/compress_lz4.h b/src/bin/pg_dump/compress_lz4.h index 40dbe00d46102..36f1a01b4e6d2 100644 --- a/src/bin/pg_dump/compress_lz4.h +++ b/src/bin/pg_dump/compress_lz4.h @@ -3,7 +3,7 @@ * compress_lz4.h * LZ4 interface to compress_io.c routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/bin/pg_dump/compress_none.c b/src/bin/pg_dump/compress_none.c index 736a7957bc78f..f3a524d8a4969 100644 --- a/src/bin/pg_dump/compress_none.c +++ b/src/bin/pg_dump/compress_none.c @@ -3,7 +3,7 @@ * compress_none.c * Routines for archivers to read or write an uncompressed stream. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -94,8 +94,7 @@ read_none(void *ptr, size_t size, size_t *rsize, CompressFileHandle *CFH) ret = fread(ptr, 1, size, fp); if (ret != size && !feof(fp)) - pg_fatal("could not read from input file: %s", - strerror(errno)); + pg_fatal("could not read from input file: %m"); if (rsize) *rsize = ret; @@ -137,7 +136,7 @@ getc_none(CompressFileHandle *CFH) if (ret == EOF) { if (!feof(fp)) - pg_fatal("could not read from input file: %s", strerror(errno)); + pg_fatal("could not read from input file: %m"); else pg_fatal("could not read from input file: end of file"); } diff --git a/src/bin/pg_dump/compress_none.h b/src/bin/pg_dump/compress_none.h index 143e599819dd9..c8e6c2089a664 100644 --- a/src/bin/pg_dump/compress_none.h +++ b/src/bin/pg_dump/compress_none.h @@ -3,7 +3,7 @@ * compress_none.h * Uncompressed interface to compress_io.c routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/bin/pg_dump/compress_zstd.c b/src/bin/pg_dump/compress_zstd.c index 82e3310100fe2..02987d6b0ba5b 100644 --- a/src/bin/pg_dump/compress_zstd.c +++ b/src/bin/pg_dump/compress_zstd.c @@ -3,7 +3,7 @@ * compress_zstd.c * Routines for archivers to write a Zstd compressed data stream. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -14,8 +14,8 @@ #include "postgres_fe.h" -#include "pg_backup_utils.h" #include "compress_zstd.h" +#include "pg_backup_utils.h" #ifndef USE_ZSTD @@ -137,9 +137,10 @@ EndCompressorZstd(ArchiveHandle *AH, CompressorState *cs) Assert(zstdcs->dstream == NULL); _ZstdWriteCommon(AH, cs, true); ZSTD_freeCStream(zstdcs->cstream); - pg_free(zstdcs->output.dst); } + /* output buffer may be allocated in either mode */ + pg_free(zstdcs->output.dst); pg_free(zstdcs); } diff --git a/src/bin/pg_dump/compress_zstd.h b/src/bin/pg_dump/compress_zstd.h index d0ab1351fdd6d..5acdc12bf1567 100644 --- a/src/bin/pg_dump/compress_zstd.h +++ b/src/bin/pg_dump/compress_zstd.h @@ -3,7 +3,7 @@ * compress_zstd.h * Zstd interface to compress_io.c routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c index 0ea96346cb015..5649859aa1e2d 100644 --- a/src/bin/pg_dump/dumputils.c +++ b/src/bin/pg_dump/dumputils.c @@ -5,7 +5,7 @@ * Basically this is stuff that is useful in both pg_dump and pg_dumpall. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/pg_dump/dumputils.c diff --git a/src/bin/pg_dump/dumputils.h b/src/bin/pg_dump/dumputils.h index 2c81f51837b13..98c71c6bf9473 100644 --- a/src/bin/pg_dump/dumputils.h +++ b/src/bin/pg_dump/dumputils.h @@ -5,7 +5,7 @@ * Basically this is stuff that is useful in both pg_dump and pg_dumpall. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/pg_dump/dumputils.h diff --git a/src/bin/pg_dump/filter.c b/src/bin/pg_dump/filter.c new file mode 100644 index 0000000000000..5815cd237483f --- /dev/null +++ b/src/bin/pg_dump/filter.c @@ -0,0 +1,473 @@ +/*------------------------------------------------------------------------- + * + * filter.c + * Implementation of simple filter file parser + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/bin/pg_dump/filter.c + * + *------------------------------------------------------------------------- + */ +#include "postgres_fe.h" + +#include "common/fe_memutils.h" +#include "common/logging.h" +#include "common/string.h" +#include "filter.h" +#include "lib/stringinfo.h" +#include "pqexpbuffer.h" + +#define is_keyword_str(cstr, str, bytes) \ + ((strlen(cstr) == (bytes)) && (pg_strncasecmp((cstr), (str), (bytes)) == 0)) + +/* + * Following routines are called from pg_dump, pg_dumpall and pg_restore. + * Since the implementation of exit_nicely is application specific, each + * application need to pass a function pointer to the exit_nicely function to + * use for exiting on errors. + */ + +/* + * Opens filter's file and initialize fstate structure. + */ +void +filter_init(FilterStateData *fstate, const char *filename, exit_function f_exit) +{ + fstate->filename = filename; + fstate->lineno = 0; + fstate->exit_nicely = f_exit; + initStringInfo(&fstate->linebuff); + + if (strcmp(filename, "-") != 0) + { + fstate->fp = fopen(filename, "r"); + if (!fstate->fp) + { + pg_log_error("could not open filter file \"%s\": %m", filename); + fstate->exit_nicely(1); + } + } + else + fstate->fp = stdin; +} + +/* + * Release allocated resources for the given filter. + */ +void +filter_free(FilterStateData *fstate) +{ + if (!fstate) + return; + + free(fstate->linebuff.data); + fstate->linebuff.data = NULL; + + if (fstate->fp && fstate->fp != stdin) + { + if (fclose(fstate->fp) != 0) + pg_log_error("could not close filter file \"%s\": %m", fstate->filename); + + fstate->fp = NULL; + } +} + +/* + * Translate FilterObjectType enum to string. The main purpose is for error + * message formatting. + */ +const char * +filter_object_type_name(FilterObjectType fot) +{ + switch (fot) + { + case FILTER_OBJECT_TYPE_NONE: + return "comment or empty line"; + case FILTER_OBJECT_TYPE_TABLE_DATA: + return "table data"; + case FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN: + return "table data and children"; + case FILTER_OBJECT_TYPE_DATABASE: + return "database"; + case FILTER_OBJECT_TYPE_EXTENSION: + return "extension"; + case FILTER_OBJECT_TYPE_FOREIGN_DATA: + return "foreign data"; + case FILTER_OBJECT_TYPE_FUNCTION: + return "function"; + case FILTER_OBJECT_TYPE_INDEX: + return "index"; + case FILTER_OBJECT_TYPE_SCHEMA: + return "schema"; + case FILTER_OBJECT_TYPE_TABLE: + return "table"; + case FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN: + return "table and children"; + case FILTER_OBJECT_TYPE_TRIGGER: + return "trigger"; + } + + /* should never get here */ + pg_unreachable(); +} + +/* + * Returns true when keyword is one of supported object types, and + * set related objtype. Returns false, when keyword is not assigned + * with known object type. + */ +static bool +get_object_type(const char *keyword, int size, FilterObjectType *objtype) +{ + if (is_keyword_str("table_data", keyword, size)) + *objtype = FILTER_OBJECT_TYPE_TABLE_DATA; + else if (is_keyword_str("table_data_and_children", keyword, size)) + *objtype = FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN; + else if (is_keyword_str("database", keyword, size)) + *objtype = FILTER_OBJECT_TYPE_DATABASE; + else if (is_keyword_str("extension", keyword, size)) + *objtype = FILTER_OBJECT_TYPE_EXTENSION; + else if (is_keyword_str("foreign_data", keyword, size)) + *objtype = FILTER_OBJECT_TYPE_FOREIGN_DATA; + else if (is_keyword_str("function", keyword, size)) + *objtype = FILTER_OBJECT_TYPE_FUNCTION; + else if (is_keyword_str("index", keyword, size)) + *objtype = FILTER_OBJECT_TYPE_INDEX; + else if (is_keyword_str("schema", keyword, size)) + *objtype = FILTER_OBJECT_TYPE_SCHEMA; + else if (is_keyword_str("table", keyword, size)) + *objtype = FILTER_OBJECT_TYPE_TABLE; + else if (is_keyword_str("table_and_children", keyword, size)) + *objtype = FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN; + else if (is_keyword_str("trigger", keyword, size)) + *objtype = FILTER_OBJECT_TYPE_TRIGGER; + else + return false; + + return true; +} + + +void +pg_log_filter_error(FilterStateData *fstate, const char *fmt,...) +{ + va_list argp; + char buf[256]; + + va_start(argp, fmt); + vsnprintf(buf, sizeof(buf), fmt, argp); + va_end(argp); + + if (fstate->fp == stdin) + pg_log_error("invalid format in filter read from standard input on line %d: %s", + fstate->lineno, buf); + else + pg_log_error("invalid format in filter read from file \"%s\" on line %d: %s", + fstate->filename, fstate->lineno, buf); +} + +/* + * filter_get_keyword - read the next filter keyword from buffer + * + * Search for keywords (limited to ascii alphabetic characters) in + * the passed in line buffer. Returns NULL when the buffer is empty or the first + * char is not alpha. The char '_' is allowed, except as the first character. + * The length of the found keyword is returned in the size parameter. + */ +static const char * +filter_get_keyword(const char **line, int *size) +{ + const char *ptr = *line; + const char *result = NULL; + + /* Set returned length preemptively in case no keyword is found */ + *size = 0; + + /* Skip initial whitespace */ + while (isspace((unsigned char) *ptr)) + ptr++; + + if (isalpha((unsigned char) *ptr)) + { + result = ptr++; + + while (isalpha((unsigned char) *ptr) || *ptr == '_') + ptr++; + + *size = ptr - result; + } + + *line = ptr; + + return result; +} + +/* + * read_quoted_string - read quoted possibly multi line string + * + * Reads a quoted string which can span over multiple lines and returns a + * pointer to next char after ending double quotes; it will exit on errors. + */ +static const char * +read_quoted_string(FilterStateData *fstate, + const char *str, + PQExpBuffer pattern) +{ + appendPQExpBufferChar(pattern, '"'); + str++; + + while (1) + { + /* + * We can ignore \r or \n chars because the string is read by + * pg_get_line_buf, so these chars should be just trailing chars. + */ + if (*str == '\r' || *str == '\n') + { + str++; + continue; + } + + if (*str == '\0') + { + Assert(fstate->linebuff.data); + + if (!pg_get_line_buf(fstate->fp, &fstate->linebuff)) + { + if (ferror(fstate->fp)) + pg_log_error("could not read from filter file \"%s\": %m", + fstate->filename); + else + pg_log_filter_error(fstate, _("unexpected end of file")); + + fstate->exit_nicely(1); + } + + str = fstate->linebuff.data; + + appendPQExpBufferChar(pattern, '\n'); + fstate->lineno++; + } + + if (*str == '"') + { + appendPQExpBufferChar(pattern, '"'); + str++; + + if (*str == '"') + { + appendPQExpBufferChar(pattern, '"'); + str++; + } + else + break; + } + else if (*str == '\\') + { + str++; + if (*str == 'n') + appendPQExpBufferChar(pattern, '\n'); + else if (*str == '\\') + appendPQExpBufferChar(pattern, '\\'); + + str++; + } + else + appendPQExpBufferChar(pattern, *str++); + } + + return str; +} + +/* + * read_pattern - reads on object pattern from input + * + * This function will parse any valid identifier (quoted or not, qualified or + * not), which can also includes the full signature for routines. + * Note that this function takes special care to sanitize the detected + * identifier (removing extraneous whitespaces or other unnecessary + * characters). This is necessary as most backup/restore filtering functions + * only recognize identifiers if they are written exactly the same way as + * they are output by the server. + * + * Returns a pointer to next character after the found identifier and exits + * on error. + */ +static const char * +read_pattern(FilterStateData *fstate, const char *str, PQExpBuffer pattern) +{ + bool skip_space = true; + bool found_space = false; + + /* Skip initial whitespace */ + while (isspace((unsigned char) *str)) + str++; + + if (*str == '\0') + { + pg_log_filter_error(fstate, _("missing object name pattern")); + fstate->exit_nicely(1); + } + + while (*str && *str != '#') + { + while (*str && !isspace((unsigned char) *str) && !strchr("#,.()\"", *str)) + { + /* + * Append space only when it is allowed, and when it was found in + * original string. + */ + if (!skip_space && found_space) + { + appendPQExpBufferChar(pattern, ' '); + skip_space = true; + } + + appendPQExpBufferChar(pattern, *str++); + } + + skip_space = false; + + if (*str == '"') + { + if (found_space) + appendPQExpBufferChar(pattern, ' '); + + str = read_quoted_string(fstate, str, pattern); + } + else if (*str == ',') + { + appendPQExpBufferStr(pattern, ", "); + skip_space = true; + str++; + } + else if (*str && strchr(".()", *str)) + { + appendPQExpBufferChar(pattern, *str++); + skip_space = true; + } + + found_space = false; + + /* skip ending whitespaces */ + while (isspace((unsigned char) *str)) + { + found_space = true; + str++; + } + } + + return str; +} + +/* + * filter_read_item - Read command/type/pattern triplet from a filter file + * + * This will parse one filter item from the filter file, and while it is a + * row based format a pattern may span more than one line due to how object + * names can be constructed. The expected format of the filter file is: + * + * + * + * command can be "include" or "exclude". + * + * Supported object types are described by enum FilterObjectType + * (see function get_object_type). + * + * pattern can be any possibly-quoted and possibly-qualified identifier. It + * follows the same rules as other object include and exclude functions so it + * can also use wildcards. + * + * Returns true when one filter item was successfully read and parsed. When + * object name contains \n chars, then more than one line from input file can + * be processed. Returns false when the filter file reaches EOF. In case of + * error, the function will emit an appropriate error message and exit. + */ +bool +filter_read_item(FilterStateData *fstate, + char **objname, + FilterCommandType *comtype, + FilterObjectType *objtype) +{ + if (pg_get_line_buf(fstate->fp, &fstate->linebuff)) + { + const char *str = fstate->linebuff.data; + const char *keyword; + int size; + PQExpBufferData pattern; + + fstate->lineno++; + + /* Skip initial white spaces */ + while (isspace((unsigned char) *str)) + str++; + + /* + * Skip empty lines or lines where the first non-whitespace character + * is a hash indicating a comment. + */ + if (*str != '\0' && *str != '#') + { + /* + * First we expect sequence of two keywords, {include|exclude} + * followed by the object type to operate on. + */ + keyword = filter_get_keyword(&str, &size); + if (!keyword) + { + pg_log_filter_error(fstate, + _("no filter command found (expected \"include\" or \"exclude\")")); + fstate->exit_nicely(1); + } + + if (is_keyword_str("include", keyword, size)) + *comtype = FILTER_COMMAND_TYPE_INCLUDE; + else if (is_keyword_str("exclude", keyword, size)) + *comtype = FILTER_COMMAND_TYPE_EXCLUDE; + else + { + pg_log_filter_error(fstate, + _("invalid filter command (expected \"include\" or \"exclude\")")); + fstate->exit_nicely(1); + } + + keyword = filter_get_keyword(&str, &size); + if (!keyword) + { + pg_log_filter_error(fstate, _("missing filter object type")); + fstate->exit_nicely(1); + } + + if (!get_object_type(keyword, size, objtype)) + { + pg_log_filter_error(fstate, + _("unsupported filter object type: \"%.*s\""), size, keyword); + fstate->exit_nicely(1); + } + + initPQExpBuffer(&pattern); + + str = read_pattern(fstate, str, &pattern); + *objname = pattern.data; + } + else + { + *objname = NULL; + *comtype = FILTER_COMMAND_TYPE_NONE; + *objtype = FILTER_OBJECT_TYPE_NONE; + } + + return true; + } + + if (ferror(fstate->fp)) + { + pg_log_error("could not read from filter file \"%s\": %m", fstate->filename); + fstate->exit_nicely(1); + } + + return false; +} diff --git a/src/bin/pg_dump/filter.h b/src/bin/pg_dump/filter.h new file mode 100644 index 0000000000000..d9b9b3eebcb81 --- /dev/null +++ b/src/bin/pg_dump/filter.h @@ -0,0 +1,71 @@ +/*------------------------------------------------------------------------- + * + * filter.h + * Common header file for the parser of filter file + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/bin/pg_dump/filter.h + * + *------------------------------------------------------------------------- + */ +#ifndef FILTER_H +#define FILTER_H + +#include "lib/stringinfo.h" + +/* Function signature for exit_nicely functions */ +typedef void (*exit_function) (int status); + +/* + * State data for reading filter items from stream + */ +typedef struct +{ + FILE *fp; + const char *filename; + exit_function exit_nicely; + int lineno; + StringInfoData linebuff; +} FilterStateData; + +/* + * List of command types that can be specified in filter file + */ +typedef enum +{ + FILTER_COMMAND_TYPE_NONE, + FILTER_COMMAND_TYPE_INCLUDE, + FILTER_COMMAND_TYPE_EXCLUDE, +} FilterCommandType; + +/* + * List of objects that can be specified in filter file + */ +typedef enum +{ + FILTER_OBJECT_TYPE_NONE, + FILTER_OBJECT_TYPE_TABLE_DATA, + FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN, + FILTER_OBJECT_TYPE_DATABASE, + FILTER_OBJECT_TYPE_EXTENSION, + FILTER_OBJECT_TYPE_FOREIGN_DATA, + FILTER_OBJECT_TYPE_FUNCTION, + FILTER_OBJECT_TYPE_INDEX, + FILTER_OBJECT_TYPE_SCHEMA, + FILTER_OBJECT_TYPE_TABLE, + FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN, + FILTER_OBJECT_TYPE_TRIGGER, +} FilterObjectType; + +extern const char *filter_object_type_name(FilterObjectType fot); +extern void filter_init(FilterStateData *fstate, const char *filename, exit_function f_exit); +extern void filter_free(FilterStateData *fstate); +extern void pg_log_filter_error(FilterStateData *fstate, const char *fmt,...) + pg_attribute_printf(2, 3); +extern bool filter_read_item(FilterStateData *fstate, char **objname, + FilterCommandType *comtype, FilterObjectType *objtype); + +#endif /* FILTER_H */ diff --git a/src/bin/pg_dump/meson.build b/src/bin/pg_dump/meson.build index 9d59a106f369a..ecd0a0a0e12db 100644 --- a/src/bin/pg_dump/meson.build +++ b/src/bin/pg_dump/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_dump_common_sources = files( 'compress_gzip.c', @@ -7,6 +7,7 @@ pg_dump_common_sources = files( 'compress_none.c', 'compress_zstd.c', 'dumputils.c', + 'filter.c', 'parallel.c', 'pg_backup_archiver.c', 'pg_backup_custom.c', @@ -89,7 +90,7 @@ tests += { 'bd': meson.current_build_dir(), 'tap': { 'env': { - 'GZIP_PROGRAM': gzip.path(), + 'GZIP_PROGRAM': gzip.found() ? gzip.path() : '', 'LZ4': program_lz4.found() ? program_lz4.path() : '', 'ZSTD': program_zstd.found() ? program_zstd.path() : '', 'with_icu': icu.found() ? 'yes' : 'no', @@ -99,6 +100,7 @@ tests += { 't/002_pg_dump.pl', 't/003_pg_dump_with_server.pl', 't/004_pg_dump_parallel.pl', + 't/005_pg_dump_filterfile.pl', 't/010_dump_connstr.pl', ], }, diff --git a/src/bin/pg_dump/nls.mk b/src/bin/pg_dump/nls.mk index cd91737f488d8..b7b77394f0fa6 100644 --- a/src/bin/pg_dump/nls.mk +++ b/src/bin/pg_dump/nls.mk @@ -20,15 +20,19 @@ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ pg_dumpall.c \ parallel.c \ parallel.h \ + filter.c \ pg_backup_utils.c \ pg_backup_utils.h \ ../../common/compression.c \ ../../common/exec.c \ ../../common/fe_memutils.c \ + ../../common/file_utils.c \ ../../common/wait_error.c \ - ../../fe_utils/option_utils.c + ../../fe_utils/option_utils.c \ + ../../fe_utils/string_utils.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \ simple_prompt \ - ExecuteSqlCommand:3 warn_or_exit_horribly:2 + ExecuteSqlCommand:3 \ + warn_or_exit_horribly:2 GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \ - warn_or_exit_horribly:2:c-format + warn_or_exit_horribly:2:c-format diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c index da0723ad38587..a09247fae47e3 100644 --- a/src/bin/pg_dump/parallel.c +++ b/src/bin/pg_dump/parallel.c @@ -4,7 +4,7 @@ * * Parallel support for pg_dump and pg_restore * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -77,7 +77,7 @@ typedef enum WRKR_NOT_STARTED = 0, WRKR_IDLE, WRKR_WORKING, - WRKR_TERMINATED + WRKR_TERMINATED, } T_WorkerStatus; #define WORKER_IS_RUNNING(workerStatus) \ @@ -204,7 +204,7 @@ static ParallelSlot *GetMyPSlot(ParallelState *pstate); static void archive_close_connection(int code, void *arg); static void ShutdownWorkersHard(ParallelState *pstate); static void WaitForTerminatingWorkers(ParallelState *pstate); -static void setup_cancel_handler(void); +static void set_cancel_handler(void); static void set_cancel_pstate(ParallelState *pstate); static void set_cancel_slot_archive(ParallelSlot *slot, ArchiveHandle *AH); static void RunWorker(ArchiveHandle *AH, ParallelSlot *slot); @@ -550,7 +550,7 @@ sigTermHandler(SIGNAL_ARGS) /* * Some platforms allow delivery of new signals to interrupt an active * signal handler. That could muck up our attempt to send PQcancel, so - * disable the signals that setup_cancel_handler enabled. + * disable the signals that set_cancel_handler enabled. */ pqsignal(SIGINT, SIG_IGN); pqsignal(SIGTERM, SIG_IGN); @@ -605,7 +605,7 @@ sigTermHandler(SIGNAL_ARGS) * Enable cancel interrupt handler, if not already done. */ static void -setup_cancel_handler(void) +set_cancel_handler(void) { /* * When forking, signal_info.handler_set will propagate into the new @@ -705,7 +705,7 @@ consoleHandler(DWORD dwCtrlType) * Enable cancel interrupt handler, if not already done. */ static void -setup_cancel_handler(void) +set_cancel_handler(void) { if (!signal_info.handler_set) { @@ -737,7 +737,7 @@ set_archive_cancel_info(ArchiveHandle *AH, PGconn *conn) * important that this happen at least once before we fork off any * threads. */ - setup_cancel_handler(); + set_cancel_handler(); /* * On Unix, we assume that storing a pointer value is atomic with respect diff --git a/src/bin/pg_dump/parallel.h b/src/bin/pg_dump/parallel.h index 17f03c1cceb58..5efc02c77c557 100644 --- a/src/bin/pg_dump/parallel.h +++ b/src/bin/pg_dump/parallel.h @@ -4,7 +4,7 @@ * * Parallel support for pg_dump and pg_restore * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -32,7 +32,7 @@ typedef enum WFW_NO_WAIT, WFW_GOT_STATUS, WFW_ONE_IDLE, - WFW_ALL_IDLE + WFW_ALL_IDLE, } WFW_WaitOption; /* diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h index aba780ef4b1ee..fbf5f1c515e5e 100644 --- a/src/bin/pg_dump/pg_backup.h +++ b/src/bin/pg_dump/pg_backup.h @@ -24,6 +24,7 @@ #define PG_BACKUP_H #include "common/compression.h" +#include "common/file_utils.h" #include "fe_utils/simple_list.h" #include "libpq-fe.h" @@ -32,7 +33,7 @@ typedef enum trivalue { TRI_DEFAULT, TRI_NO, - TRI_YES + TRI_YES, } trivalue; typedef enum _archiveFormat @@ -41,14 +42,14 @@ typedef enum _archiveFormat archCustom = 1, archTar = 3, archNull = 4, - archDirectory = 5 + archDirectory = 5, } ArchiveFormat; typedef enum _archiveMode { archModeAppend, archModeWrite, - archModeRead + archModeRead, } ArchiveMode; typedef enum _teSection @@ -56,7 +57,7 @@ typedef enum _teSection SECTION_NONE = 1, /* comments, ACLs, etc; can be anywhere */ SECTION_PRE_DATA, /* stuff to be processed before data */ SECTION_DATA, /* table data, large objects, LO comments */ - SECTION_POST_DATA /* stuff to be processed after data */ + SECTION_POST_DATA, /* stuff to be processed after data */ } teSection; /* We need one enum entry per prepared query in pg_dump */ @@ -148,7 +149,9 @@ typedef struct _restoreOptions * compression */ int suppressDumpWarnings; /* Suppress output of WARNING entries * to stderr */ - bool single_txn; + + bool single_txn; /* restore all TOCs in one transaction */ + int txn_size; /* restore this many TOCs per txn, if > 0 */ bool *idWanted; /* array showing which dump IDs to emit */ int enable_row_security; @@ -307,7 +310,8 @@ extern Archive *OpenArchive(const char *FileSpec, const ArchiveFormat fmt); extern Archive *CreateArchive(const char *FileSpec, const ArchiveFormat fmt, const pg_compress_specification compression_spec, bool dosync, ArchiveMode mode, - SetupWorkerPtrType setupDumpWorker); + SetupWorkerPtrType setupDumpWorker, + DataDirSyncMethod sync_method); /* The --list option */ extern void PrintTOCSummary(Archive *AHX); diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 39ebcfec326d4..f1ffed038b046 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -30,10 +30,12 @@ #include #endif +#include "catalog/pg_class_d.h" #include "common/string.h" #include "compress_io.h" #include "dumputils.h" #include "fe_utils/string_utils.h" +#include "lib/binaryheap.h" #include "lib/stringinfo.h" #include "libpq/libpq-fs.h" #include "parallel.h" @@ -44,29 +46,12 @@ #define TEXT_DUMP_HEADER "--\n-- PostgreSQL database dump\n--\n\n" #define TEXT_DUMPALL_HEADER "--\n-- PostgreSQL database cluster dump\n--\n\n" -/* - * State for tracking TocEntrys that are ready to process during a parallel - * restore. (This used to be a list, and we still call it that, though now - * it's really an array so that we can apply qsort to it.) - * - * tes[] is sized large enough that we can't overrun it. - * The valid entries are indexed first_te .. last_te inclusive. - * We periodically sort the array to bring larger-by-dataLength entries to - * the front; "sorted" is true if the valid entries are known sorted. - */ -typedef struct _parallelReadyList -{ - TocEntry **tes; /* Ready-to-dump TocEntrys */ - int first_te; /* index of first valid entry in tes[] */ - int last_te; /* index of last valid entry in tes[] */ - bool sorted; /* are valid entries currently sorted? */ -} ParallelReadyList; - static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt, const pg_compress_specification compression_spec, bool dosync, ArchiveMode mode, - SetupWorkerPtrType setupWorkerPtr); + SetupWorkerPtrType setupWorkerPtr, + DataDirSyncMethod sync_method); static void _getObjectDescription(PQExpBuffer buf, const TocEntry *te); static void _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData); static char *sanitize_line(const char *str, bool want_hyphen); @@ -78,6 +63,8 @@ static void _becomeOwner(ArchiveHandle *AH, TocEntry *te); static void _selectOutputSchema(ArchiveHandle *AH, const char *schemaName); static void _selectTablespace(ArchiveHandle *AH, const char *tablespace); static void _selectTableAccessMethod(ArchiveHandle *AH, const char *tableam); +static void _printTableAccessMethodNoStorage(ArchiveHandle *AH, + TocEntry *te); static void processEncodingEntry(ArchiveHandle *AH, TocEntry *te); static void processStdStringsEntry(ArchiveHandle *AH, TocEntry *te); static void processSearchPathEntry(ArchiveHandle *AH, TocEntry *te); @@ -110,16 +97,12 @@ static void restore_toc_entries_postfork(ArchiveHandle *AH, static void pending_list_header_init(TocEntry *l); static void pending_list_append(TocEntry *l, TocEntry *te); static void pending_list_remove(TocEntry *te); -static void ready_list_init(ParallelReadyList *ready_list, int tocCount); -static void ready_list_free(ParallelReadyList *ready_list); -static void ready_list_insert(ParallelReadyList *ready_list, TocEntry *te); -static void ready_list_remove(ParallelReadyList *ready_list, int i); -static void ready_list_sort(ParallelReadyList *ready_list); -static int TocEntrySizeCompare(const void *p1, const void *p2); -static void move_to_ready_list(TocEntry *pending_list, - ParallelReadyList *ready_list, +static int TocEntrySizeCompareQsort(const void *p1, const void *p2); +static int TocEntrySizeCompareBinaryheap(void *p1, void *p2, void *arg); +static void move_to_ready_heap(TocEntry *pending_list, + binaryheap *ready_heap, RestorePass pass); -static TocEntry *pop_next_work_item(ParallelReadyList *ready_list, +static TocEntry *pop_next_work_item(binaryheap *ready_heap, ParallelState *pstate); static void mark_dump_job_done(ArchiveHandle *AH, TocEntry *te, @@ -134,7 +117,7 @@ static bool has_lock_conflicts(TocEntry *te1, TocEntry *te2); static void repoint_table_dependencies(ArchiveHandle *AH); static void identify_locking_dependencies(ArchiveHandle *AH, TocEntry *te); static void reduce_dependencies(ArchiveHandle *AH, TocEntry *te, - ParallelReadyList *ready_list); + binaryheap *ready_heap); static void mark_create_done(ArchiveHandle *AH, TocEntry *te); static void inhibit_data_for_failed_table(ArchiveHandle *AH, TocEntry *te); @@ -238,11 +221,12 @@ Archive * CreateArchive(const char *FileSpec, const ArchiveFormat fmt, const pg_compress_specification compression_spec, bool dosync, ArchiveMode mode, - SetupWorkerPtrType setupDumpWorker) + SetupWorkerPtrType setupDumpWorker, + DataDirSyncMethod sync_method) { ArchiveHandle *AH = _allocAH(FileSpec, fmt, compression_spec, - dosync, mode, setupDumpWorker); + dosync, mode, setupDumpWorker, sync_method); return (Archive *) AH; } @@ -257,7 +241,8 @@ OpenArchive(const char *FileSpec, const ArchiveFormat fmt) compression_spec.algorithm = PG_COMPRESSION_NONE; AH = _allocAH(FileSpec, fmt, compression_spec, true, - archModeRead, setupRestoreWorker); + archModeRead, setupRestoreWorker, + DATA_DIR_SYNC_METHOD_FSYNC); return (Archive *) AH; } @@ -520,7 +505,28 @@ RestoreArchive(Archive *AHX) /* Otherwise, drop anything that's selected and has a dropStmt */ if (((te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0) && te->dropStmt) { + bool not_allowed_in_txn = false; + pg_log_info("dropping %s %s", te->desc, te->tag); + + /* + * In --transaction-size mode, we have to temporarily exit our + * transaction block to drop objects that can't be dropped + * within a transaction. + */ + if (ropt->txn_size > 0) + { + if (strcmp(te->desc, "DATABASE") == 0 || + strcmp(te->desc, "DATABASE PROPERTIES") == 0) + { + not_allowed_in_txn = true; + if (AH->connection) + CommitTransaction(AHX); + else + ahprintf(AH, "COMMIT;\n"); + } + } + /* Select owner and schema as necessary */ _becomeOwner(AH, te); _selectOutputSchema(AH, te->namespace); @@ -530,7 +536,20 @@ RestoreArchive(Archive *AHX) * don't necessarily emit it verbatim; at this point we add an * appropriate IF EXISTS clause, if the user requested it. */ - if (*te->dropStmt != '\0') + if (strcmp(te->desc, "BLOB METADATA") == 0) + { + /* We must generate the per-blob commands */ + if (ropt->if_exists) + IssueCommandPerBlob(AH, te, + "SELECT pg_catalog.lo_unlink(oid) " + "FROM pg_catalog.pg_largeobject_metadata " + "WHERE oid = '", "'"); + else + IssueCommandPerBlob(AH, te, + "SELECT pg_catalog.lo_unlink('", + "')"); + } + else if (*te->dropStmt != '\0') { if (!ropt->if_exists || strncmp(te->dropStmt, "--", 2) == 0) @@ -546,12 +565,12 @@ RestoreArchive(Archive *AHX) { /* * Inject an appropriate spelling of "if exists". For - * large objects, we have a separate routine that + * old-style large objects, we have a routine that * knows how to do it, without depending on * te->dropStmt; use that. For other objects we need * to parse the command. */ - if (strncmp(te->desc, "BLOB", 4) == 0) + if (strcmp(te->desc, "BLOB") == 0) { DropLOIfExists(AH, te->catalogId.oid); } @@ -633,6 +652,33 @@ RestoreArchive(Archive *AHX) } } } + + /* + * In --transaction-size mode, re-establish the transaction + * block if needed; otherwise, commit after every N drops. + */ + if (ropt->txn_size > 0) + { + if (not_allowed_in_txn) + { + if (AH->connection) + StartTransaction(AHX); + else + ahprintf(AH, "BEGIN;\n"); + AH->txnCount = 0; + } + else if (++AH->txnCount >= ropt->txn_size) + { + if (AH->connection) + { + CommitTransaction(AHX); + StartTransaction(AHX); + } + else + ahprintf(AH, "COMMIT;\nBEGIN;\n"); + AH->txnCount = 0; + } + } } } @@ -729,7 +775,11 @@ RestoreArchive(Archive *AHX) } } - if (ropt->single_txn) + /* + * Close out any persistent transaction we may have. While these two + * cases are started in different places, we can end both cases here. + */ + if (ropt->single_txn || ropt->txn_size > 0) { if (AH->connection) CommitTransaction(AHX); @@ -790,6 +840,25 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel) */ if ((reqs & REQ_SCHEMA) != 0) { + bool object_is_db = false; + + /* + * In --transaction-size mode, must exit our transaction block to + * create a database or set its properties. + */ + if (strcmp(te->desc, "DATABASE") == 0 || + strcmp(te->desc, "DATABASE PROPERTIES") == 0) + { + object_is_db = true; + if (ropt->txn_size > 0) + { + if (AH->connection) + CommitTransaction(&AH->public); + else + ahprintf(AH, "COMMIT;\n\n"); + } + } + /* Show namespace in log message if available */ if (te->namespace) pg_log_info("creating %s \"%s.%s\"", @@ -840,10 +909,10 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel) /* * If we created a DB, connect to it. Also, if we changed DB * properties, reconnect to ensure that relevant GUC settings are - * applied to our session. + * applied to our session. (That also restarts the transaction block + * in --transaction-size mode.) */ - if (strcmp(te->desc, "DATABASE") == 0 || - strcmp(te->desc, "DATABASE PROPERTIES") == 0) + if (object_is_db) { pg_log_info("connecting to new database \"%s\"", te->tag); _reconnectToDB(AH, te->tag); @@ -969,6 +1038,25 @@ restore_toc_entry(ArchiveHandle *AH, TocEntry *te, bool is_parallel) } } + /* + * If we emitted anything for this TOC entry, that counts as one action + * against the transaction-size limit. Commit if it's time to. + */ + if ((reqs & (REQ_SCHEMA | REQ_DATA)) != 0 && ropt->txn_size > 0) + { + if (++AH->txnCount >= ropt->txn_size) + { + if (AH->connection) + { + CommitTransaction(&AH->public); + StartTransaction(&AH->public); + } + else + ahprintf(AH, "COMMIT;\nBEGIN;\n\n"); + AH->txnCount = 0; + } + } + if (AH->public.n_errors > 0 && status == WORKER_OK) status = WORKER_IGNORED_ERRORS; @@ -1137,6 +1225,7 @@ ArchiveEntry(Archive *AHX, CatalogId catalogId, DumpId dumpId, newToc->namespace = opts->namespace ? pg_strdup(opts->namespace) : NULL; newToc->tablespace = opts->tablespace ? pg_strdup(opts->tablespace) : NULL; newToc->tableam = opts->tableam ? pg_strdup(opts->tableam) : NULL; + newToc->relkind = opts->relkind; newToc->owner = opts->owner ? pg_strdup(opts->owner) : NULL; newToc->desc = pg_strdup(opts->description); newToc->defn = opts->createStmt ? pg_strdup(opts->createStmt) : NULL; @@ -1230,10 +1319,13 @@ PrintTOCSummary(Archive *AHX) curSection = SECTION_PRE_DATA; for (te = AH->toc->next; te != AH->toc; te = te->next) { + /* This bit must match ProcessArchiveRestoreOptions' marking logic */ if (te->section != SECTION_NONE) curSection = te->section; + te->reqs = _tocEntryRequired(te, curSection, AH); + /* Now, should we print it? */ if (ropt->verbose || - (_tocEntryRequired(te, curSection, AH) & (REQ_SCHEMA | REQ_DATA)) != 0) + (te->reqs & (REQ_SCHEMA | REQ_DATA)) != 0) { char *sanitized_name; char *sanitized_schema; @@ -1308,14 +1400,19 @@ EndLO(Archive *AHX, Oid oid) **********/ /* - * Called by a format handler before any LOs are restored + * Called by a format handler before a group of LOs is restored */ void StartRestoreLOs(ArchiveHandle *AH) { RestoreOptions *ropt = AH->public.ropt; - if (!ropt->single_txn) + /* + * LOs must be restored within a transaction block, since we need the LO + * handle to stay open while we write it. Establish a transaction unless + * there's one being used globally. + */ + if (!(ropt->single_txn || ropt->txn_size > 0)) { if (AH->connection) StartTransaction(&AH->public); @@ -1327,14 +1424,14 @@ StartRestoreLOs(ArchiveHandle *AH) } /* - * Called by a format handler after all LOs are restored + * Called by a format handler after a group of LOs is restored */ void EndRestoreLOs(ArchiveHandle *AH) { RestoreOptions *ropt = AH->public.ropt; - if (!ropt->single_txn) + if (!(ropt->single_txn || ropt->txn_size > 0)) { if (AH->connection) CommitTransaction(&AH->public); @@ -1361,6 +1458,12 @@ StartRestoreLO(ArchiveHandle *AH, Oid oid, bool drop) AH->loCount++; /* Initialize the LO Buffer */ + if (AH->lo_buf == NULL) + { + /* First time through (in this process) so allocate the buffer */ + AH->lo_buf_size = LOBBUFSIZE; + AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE); + } AH->lo_buf_used = 0; pg_log_info("restoring large object with OID %u", oid); @@ -2233,7 +2336,7 @@ static ArchiveHandle * _allocAH(const char *FileSpec, const ArchiveFormat fmt, const pg_compress_specification compression_spec, bool dosync, ArchiveMode mode, - SetupWorkerPtrType setupWorkerPtr) + SetupWorkerPtrType setupWorkerPtr, DataDirSyncMethod sync_method) { ArchiveHandle *AH; CompressFileHandle *CFH; @@ -2287,6 +2390,7 @@ _allocAH(const char *FileSpec, const ArchiveFormat fmt, AH->mode = mode; AH->compression_spec = compression_spec; AH->dosync = dosync; + AH->sync_method = sync_method; memset(&(AH->sqlparse), 0, sizeof(AH->sqlparse)); @@ -2380,7 +2484,7 @@ WriteDataChunks(ArchiveHandle *AH, ParallelState *pstate) } if (ntes > 1) - qsort(tes, ntes, sizeof(TocEntry *), TocEntrySizeCompare); + qsort(tes, ntes, sizeof(TocEntry *), TocEntrySizeCompareQsort); for (int i = 0; i < ntes; i++) DispatchJobForTocEntry(AH, pstate, tes[i], ACT_DUMP, @@ -2505,6 +2609,7 @@ WriteToc(ArchiveHandle *AH) WriteStr(AH, te->namespace); WriteStr(AH, te->tablespace); WriteStr(AH, te->tableam); + WriteInt(AH, te->relkind); WriteStr(AH, te->owner); WriteStr(AH, "false"); @@ -2610,6 +2715,9 @@ ReadToc(ArchiveHandle *AH) if (AH->version >= K_VERS_1_14) te->tableam = ReadStr(AH); + if (AH->version >= K_VERS_1_16) + te->relkind = ReadInt(AH); + te->owner = ReadStr(AH); is_supported = true; if (AH->version < K_VERS_1_9) @@ -2710,6 +2818,7 @@ processEncodingEntry(ArchiveHandle *AH, TocEntry *te) pg_fatal("unrecognized encoding \"%s\"", ptr1); AH->public.encoding = encoding; + setFmtEncoding(encoding); } else pg_fatal("invalid ENCODING item: %s", @@ -2896,7 +3005,10 @@ _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH) * TOC entry types only if their parent object is being restored. * Without selectivity options, we let through everything in the * archive. Note there may be such entries with no parent, eg - * non-default ACLs for built-in objects. + * non-default ACLs for built-in objects. Also, we make + * per-column ACLs additionally depend on the table's ACL if any + * to ensure correct restore order, so those dependencies should + * be ignored in this check. * * This code depends on the parent having been marked already, * which should be the case; if it isn't, perhaps due to @@ -2907,8 +3019,23 @@ _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH) * But it's hard to tell which of their dependencies is the one to * consult. */ - if (te->nDeps != 1 || - TocIDRequired(AH, te->dependencies[0]) == 0) + bool dumpthis = false; + + for (int i = 0; i < te->nDeps; i++) + { + TocEntry *pte = getTocEntryByDumpId(AH, te->dependencies[i]); + + if (!pte) + continue; /* probably shouldn't happen */ + if (strcmp(pte->desc, "ACL") == 0) + continue; /* ignore dependency on another ACL */ + if (pte->reqs == 0) + continue; /* this object isn't marked, so ignore it */ + /* Found a parent to be dumped, so we want to dump this too */ + dumpthis = true; + break; + } + if (!dumpthis) return 0; } } @@ -2987,19 +3114,20 @@ _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH) { /* * Special Case: If 'SEQUENCE SET' or anything to do with LOs, then it - * is considered a data entry. We don't need to check for the BLOBS - * entry or old-style BLOB COMMENTS, because they will have hadDumper - * = true ... but we do need to check new-style BLOB ACLs, comments, + * is considered a data entry. We don't need to check for BLOBS or + * old-style BLOB COMMENTS entries, because they will have hadDumper = + * true ... but we do need to check new-style BLOB ACLs, comments, * etc. */ if (strcmp(te->desc, "SEQUENCE SET") == 0 || strcmp(te->desc, "BLOB") == 0 || + strcmp(te->desc, "BLOB METADATA") == 0 || (strcmp(te->desc, "ACL") == 0 && - strncmp(te->tag, "LARGE OBJECT ", 13) == 0) || + strncmp(te->tag, "LARGE OBJECT", 12) == 0) || (strcmp(te->desc, "COMMENT") == 0 && - strncmp(te->tag, "LARGE OBJECT ", 13) == 0) || + strncmp(te->tag, "LARGE OBJECT", 12) == 0) || (strcmp(te->desc, "SECURITY LABEL") == 0 && - strncmp(te->tag, "LARGE OBJECT ", 13) == 0)) + strncmp(te->tag, "LARGE OBJECT", 12) == 0)) res = res & REQ_DATA; else res = res & ~REQ_DATA; @@ -3034,12 +3162,13 @@ _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH) if (!(ropt->sequence_data && strcmp(te->desc, "SEQUENCE SET") == 0) && !(ropt->binary_upgrade && (strcmp(te->desc, "BLOB") == 0 || + strcmp(te->desc, "BLOB METADATA") == 0 || (strcmp(te->desc, "ACL") == 0 && - strncmp(te->tag, "LARGE OBJECT ", 13) == 0) || + strncmp(te->tag, "LARGE OBJECT", 12) == 0) || (strcmp(te->desc, "COMMENT") == 0 && - strncmp(te->tag, "LARGE OBJECT ", 13) == 0) || + strncmp(te->tag, "LARGE OBJECT", 12) == 0) || (strcmp(te->desc, "SECURITY LABEL") == 0 && - strncmp(te->tag, "LARGE OBJECT ", 13) == 0)))) + strncmp(te->tag, "LARGE OBJECT", 12) == 0)))) res = res & REQ_SCHEMA; } @@ -3114,6 +3243,7 @@ _doSetFixedOutputState(ArchiveHandle *AH) ahprintf(AH, "SET statement_timeout = 0;\n"); ahprintf(AH, "SET lock_timeout = 0;\n"); ahprintf(AH, "SET idle_in_transaction_session_timeout = 0;\n"); + ahprintf(AH, "SET transaction_timeout = 0;\n"); /* Select the correct character set encoding */ ahprintf(AH, "SET client_encoding = '%s';\n", @@ -3148,6 +3278,19 @@ _doSetFixedOutputState(ArchiveHandle *AH) else ahprintf(AH, "SET row_security = off;\n"); + /* + * In --transaction-size mode, we should always be in a transaction when + * we begin to restore objects. + */ + if (ropt && ropt->txn_size > 0) + { + if (AH->connection) + StartTransaction(&AH->public); + else + ahprintf(AH, "\nBEGIN;\n"); + AH->txnCount = 0; + } + ahprintf(AH, "\n"); } @@ -3312,7 +3455,7 @@ _selectOutputSchema(ArchiveHandle *AH, const char *schemaName) if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) warn_or_exit_horribly(AH, - "could not set search_path to \"%s\": %s", + "could not set \"search_path\" to \"%s\": %s", schemaName, PQerrorMessage(AH->connection)); PQclear(res); @@ -3373,7 +3516,7 @@ _selectTablespace(ArchiveHandle *AH, const char *tablespace) if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) warn_or_exit_horribly(AH, - "could not set default_tablespace to %s: %s", + "could not set \"default_tablespace\" to %s: %s", fmtId(want), PQerrorMessage(AH->connection)); PQclear(res); @@ -3422,7 +3565,7 @@ _selectTableAccessMethod(ArchiveHandle *AH, const char *tableam) if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) warn_or_exit_horribly(AH, - "could not set default_table_access_method: %s", + "could not set \"default_table_access_method\": %s", PQerrorMessage(AH->connection)); PQclear(res); @@ -3436,6 +3579,51 @@ _selectTableAccessMethod(ArchiveHandle *AH, const char *tableam) AH->currTableAm = pg_strdup(want); } +/* + * Set the proper default table access method for a table without storage. + * Currently, this is required only for partitioned tables with a table AM. + */ +static void +_printTableAccessMethodNoStorage(ArchiveHandle *AH, TocEntry *te) +{ + RestoreOptions *ropt = AH->public.ropt; + const char *tableam = te->tableam; + PQExpBuffer cmd; + + /* do nothing in --no-table-access-method mode */ + if (ropt->noTableAm) + return; + + if (!tableam) + return; + + Assert(te->relkind == RELKIND_PARTITIONED_TABLE); + + cmd = createPQExpBuffer(); + + appendPQExpBufferStr(cmd, "ALTER TABLE "); + appendPQExpBuffer(cmd, "%s ", fmtQualifiedId(te->namespace, te->tag)); + appendPQExpBuffer(cmd, "SET ACCESS METHOD %s;", + fmtId(tableam)); + + if (RestoringToDB(AH)) + { + PGresult *res; + + res = PQexec(AH->connection, cmd->data); + + if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) + warn_or_exit_horribly(AH, + "could not alter table access method: %s", + PQerrorMessage(AH->connection)); + PQclear(res); + } + else + ahprintf(AH, "%s\n\n", cmd->data); + + destroyPQExpBuffer(cmd); +} + /* * Extract an object description for a TOC entry, and append it to buf. * @@ -3542,11 +3730,17 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData) { RestoreOptions *ropt = AH->public.ropt; - /* Select owner, schema, tablespace and default AM as necessary */ + /* + * Select owner, schema, tablespace and default AM as necessary. The + * default access method for partitioned tables is handled after + * generating the object definition, as it requires an ALTER command + * rather than SET. + */ _becomeOwner(AH, te); _selectOutputSchema(AH, te->namespace); _selectTablespace(AH, te->tablespace); - _selectTableAccessMethod(AH, te->tableam); + if (te->relkind != RELKIND_PARTITIONED_TABLE) + _selectTableAccessMethod(AH, te->tableam); /* Emit header comment for item */ if (!AH->noTocComments) @@ -3605,22 +3799,61 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData) } /* - * Actually print the definition. + * Actually print the definition. Normally we can just print the defn + * string if any, but we have three special cases: * - * Really crude hack for suppressing AUTHORIZATION clause that old pg_dump + * 1. A crude hack for suppressing AUTHORIZATION clause that old pg_dump * versions put into CREATE SCHEMA. Don't mutate the variant for schema * "public" that is a comment. We have to do this when --no-owner mode is * selected. This is ugly, but I see no other good way ... + * + * 2. BLOB METADATA entries need special processing since their defn + * strings are just lists of OIDs, not complete SQL commands. + * + * 3. ACL LARGE OBJECTS entries need special processing because they + * contain only one copy of the ACL GRANT/REVOKE commands, which we must + * apply to each large object listed in the associated BLOB METADATA. */ if (ropt->noOwner && strcmp(te->desc, "SCHEMA") == 0 && strncmp(te->defn, "--", 2) != 0) { ahprintf(AH, "CREATE SCHEMA %s;\n\n\n", fmtId(te->tag)); } - else + else if (strcmp(te->desc, "BLOB METADATA") == 0) + { + IssueCommandPerBlob(AH, te, "SELECT pg_catalog.lo_create('", "')"); + } + else if (strcmp(te->desc, "ACL") == 0 && + strncmp(te->tag, "LARGE OBJECTS", 13) == 0) { - if (te->defn && strlen(te->defn) > 0) - ahprintf(AH, "%s\n\n", te->defn); + IssueACLPerBlob(AH, te); + } + else if (te->defn && strlen(te->defn) > 0) + { + ahprintf(AH, "%s\n\n", te->defn); + + /* + * If the defn string contains multiple SQL commands, txn_size mode + * should count it as N actions not one. But rather than build a full + * SQL parser, approximate this by counting semicolons. One case + * where that tends to be badly fooled is function definitions, so + * ignore them. (restore_toc_entry will count one action anyway.) + */ + if (ropt->txn_size > 0 && + strcmp(te->desc, "FUNCTION") != 0 && + strcmp(te->desc, "PROCEDURE") != 0) + { + const char *p = te->defn; + int nsemis = 0; + + while ((p = strchr(p, ';')) != NULL) + { + nsemis++; + p++; + } + if (nsemis > 1) + AH->txnCount += nsemis - 1; + } } /* @@ -3637,20 +3870,40 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData) te->owner && strlen(te->owner) > 0 && te->dropStmt && strlen(te->dropStmt) > 0) { - PQExpBufferData temp; + if (strcmp(te->desc, "BLOB METADATA") == 0) + { + /* BLOB METADATA needs special code to handle multiple LOs */ + char *cmdEnd = psprintf(" OWNER TO %s", fmtId(te->owner)); - initPQExpBuffer(&temp); - _getObjectDescription(&temp, te); + IssueCommandPerBlob(AH, te, "ALTER LARGE OBJECT ", cmdEnd); + pg_free(cmdEnd); + } + else + { + /* For all other cases, we can use _getObjectDescription */ + PQExpBufferData temp; - /* - * If _getObjectDescription() didn't fill the buffer, then there is no - * owner. - */ - if (temp.data[0]) - ahprintf(AH, "ALTER %s OWNER TO %s;\n\n", temp.data, fmtId(te->owner)); - termPQExpBuffer(&temp); + initPQExpBuffer(&temp); + _getObjectDescription(&temp, te); + + /* + * If _getObjectDescription() didn't fill the buffer, then there + * is no owner. + */ + if (temp.data[0]) + ahprintf(AH, "ALTER %s OWNER TO %s;\n\n", + temp.data, fmtId(te->owner)); + termPQExpBuffer(&temp); + } } + /* + * Select a partitioned table's default AM, once the table definition has + * been generated. + */ + if (te->relkind == RELKIND_PARTITIONED_TABLE) + _printTableAccessMethodNoStorage(AH, te); + /* * If it's an ACL entry, it might contain SET SESSION AUTHORIZATION * commands, so we can no longer assume we know the current auth setting. @@ -3980,7 +4233,7 @@ restore_toc_entries_prefork(ArchiveHandle *AH, TocEntry *pending_list) (void) restore_toc_entry(AH, next_work_item, false); - /* Reduce dependencies, but don't move anything to ready_list */ + /* Reduce dependencies, but don't move anything to ready_heap */ reduce_dependencies(AH, next_work_item, NULL); } else @@ -3990,6 +4243,14 @@ restore_toc_entries_prefork(ArchiveHandle *AH, TocEntry *pending_list) } } + /* + * In --transaction-size mode, we must commit the open transaction before + * dropping the database connection. This also ensures that child workers + * can see the objects we've created so far. + */ + if (AH->public.ropt->txn_size > 0) + CommitTransaction(&AH->public); + /* * Now close parent connection in prep for parallel steps. We do this * mainly to ensure that we don't exceed the specified number of parallel @@ -4023,24 +4284,26 @@ static void restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate, TocEntry *pending_list) { - ParallelReadyList ready_list; + binaryheap *ready_heap; TocEntry *next_work_item; pg_log_debug("entering restore_toc_entries_parallel"); - /* Set up ready_list with enough room for all known TocEntrys */ - ready_list_init(&ready_list, AH->tocCount); + /* Set up ready_heap with enough room for all known TocEntrys */ + ready_heap = binaryheap_allocate(AH->tocCount, + TocEntrySizeCompareBinaryheap, + NULL); /* * The pending_list contains all items that we need to restore. Move all - * items that are available to process immediately into the ready_list. + * items that are available to process immediately into the ready_heap. * After this setup, the pending list is everything that needs to be done - * but is blocked by one or more dependencies, while the ready list + * but is blocked by one or more dependencies, while the ready heap * contains items that have no remaining dependencies and are OK to * process in the current restore pass. */ AH->restorePass = RESTORE_PASS_MAIN; - move_to_ready_list(pending_list, &ready_list, AH->restorePass); + move_to_ready_heap(pending_list, ready_heap, AH->restorePass); /* * main parent loop @@ -4054,7 +4317,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate, for (;;) { /* Look for an item ready to be dispatched to a worker */ - next_work_item = pop_next_work_item(&ready_list, pstate); + next_work_item = pop_next_work_item(ready_heap, pstate); if (next_work_item != NULL) { /* If not to be restored, don't waste time launching a worker */ @@ -4064,7 +4327,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate, next_work_item->dumpId, next_work_item->desc, next_work_item->tag); /* Update its dependencies as though we'd completed it */ - reduce_dependencies(AH, next_work_item, &ready_list); + reduce_dependencies(AH, next_work_item, ready_heap); /* Loop around to see if anything else can be dispatched */ continue; } @@ -4075,7 +4338,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate, /* Dispatch to some worker */ DispatchJobForTocEntry(AH, pstate, next_work_item, ACT_RESTORE, - mark_restore_job_done, &ready_list); + mark_restore_job_done, ready_heap); } else if (IsEveryWorkerIdle(pstate)) { @@ -4089,7 +4352,7 @@ restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate, /* Advance to next restore pass */ AH->restorePass++; /* That probably allows some stuff to be made ready */ - move_to_ready_list(pending_list, &ready_list, AH->restorePass); + move_to_ready_heap(pending_list, ready_heap, AH->restorePass); /* Loop around to see if anything's now ready */ continue; } @@ -4118,10 +4381,10 @@ restore_toc_entries_parallel(ArchiveHandle *AH, ParallelState *pstate, next_work_item ? WFW_ONE_IDLE : WFW_GOT_STATUS); } - /* There should now be nothing in ready_list. */ - Assert(ready_list.first_te > ready_list.last_te); + /* There should now be nothing in ready_heap. */ + Assert(binaryheap_empty(ready_heap)); - ready_list_free(&ready_list); + binaryheap_free(ready_heap); pg_log_info("finished main parallel loop"); } @@ -4221,80 +4484,9 @@ pending_list_remove(TocEntry *te) } -/* - * Initialize the ready_list with enough room for up to tocCount entries. - */ -static void -ready_list_init(ParallelReadyList *ready_list, int tocCount) -{ - ready_list->tes = (TocEntry **) - pg_malloc(tocCount * sizeof(TocEntry *)); - ready_list->first_te = 0; - ready_list->last_te = -1; - ready_list->sorted = false; -} - -/* - * Free storage for a ready_list. - */ -static void -ready_list_free(ParallelReadyList *ready_list) -{ - pg_free(ready_list->tes); -} - -/* Add te to the ready_list */ -static void -ready_list_insert(ParallelReadyList *ready_list, TocEntry *te) -{ - ready_list->tes[++ready_list->last_te] = te; - /* List is (probably) not sorted anymore. */ - ready_list->sorted = false; -} - -/* Remove the i'th entry in the ready_list */ -static void -ready_list_remove(ParallelReadyList *ready_list, int i) -{ - int f = ready_list->first_te; - - Assert(i >= f && i <= ready_list->last_te); - - /* - * In the typical case where the item to be removed is the first ready - * entry, we need only increment first_te to remove it. Otherwise, move - * the entries before it to compact the list. (This preserves sortedness, - * if any.) We could alternatively move the entries after i, but there - * are typically many more of those. - */ - if (i > f) - { - TocEntry **first_te_ptr = &ready_list->tes[f]; - - memmove(first_te_ptr + 1, first_te_ptr, (i - f) * sizeof(TocEntry *)); - } - ready_list->first_te++; -} - -/* Sort the ready_list into the desired order */ -static void -ready_list_sort(ParallelReadyList *ready_list) -{ - if (!ready_list->sorted) - { - int n = ready_list->last_te - ready_list->first_te + 1; - - if (n > 1) - qsort(ready_list->tes + ready_list->first_te, n, - sizeof(TocEntry *), - TocEntrySizeCompare); - ready_list->sorted = true; - } -} - /* qsort comparator for sorting TocEntries by dataLength */ static int -TocEntrySizeCompare(const void *p1, const void *p2) +TocEntrySizeCompareQsort(const void *p1, const void *p2) { const TocEntry *te1 = *(const TocEntry *const *) p1; const TocEntry *te2 = *(const TocEntry *const *) p2; @@ -4314,17 +4506,25 @@ TocEntrySizeCompare(const void *p1, const void *p2) return 0; } +/* binaryheap comparator for sorting TocEntries by dataLength */ +static int +TocEntrySizeCompareBinaryheap(void *p1, void *p2, void *arg) +{ + /* return opposite of qsort comparator for max-heap */ + return -TocEntrySizeCompareQsort(&p1, &p2); +} + /* - * Move all immediately-ready items from pending_list to ready_list. + * Move all immediately-ready items from pending_list to ready_heap. * * Items are considered ready if they have no remaining dependencies and * they belong in the current restore pass. (See also reduce_dependencies, * which applies the same logic one-at-a-time.) */ static void -move_to_ready_list(TocEntry *pending_list, - ParallelReadyList *ready_list, +move_to_ready_heap(TocEntry *pending_list, + binaryheap *ready_heap, RestorePass pass) { TocEntry *te; @@ -4340,38 +4540,38 @@ move_to_ready_list(TocEntry *pending_list, { /* Remove it from pending_list ... */ pending_list_remove(te); - /* ... and add to ready_list */ - ready_list_insert(ready_list, te); + /* ... and add to ready_heap */ + binaryheap_add(ready_heap, te); } } } /* * Find the next work item (if any) that is capable of being run now, - * and remove it from the ready_list. + * and remove it from the ready_heap. * * Returns the item, or NULL if nothing is runnable. * * To qualify, the item must have no remaining dependencies * and no requirements for locks that are incompatible with - * items currently running. Items in the ready_list are known to have + * items currently running. Items in the ready_heap are known to have * no remaining dependencies, but we have to check for lock conflicts. */ static TocEntry * -pop_next_work_item(ParallelReadyList *ready_list, +pop_next_work_item(binaryheap *ready_heap, ParallelState *pstate) { /* - * Sort the ready_list so that we'll tackle larger jobs first. - */ - ready_list_sort(ready_list); - - /* - * Search the ready_list until we find a suitable item. + * Search the ready_heap until we find a suitable item. Note that we do a + * sequential scan through the heap nodes, so even though we will first + * try to choose the highest-priority item, we might end up picking + * something with a much lower priority. However, we expect that we will + * typically be able to pick one of the first few items, which should + * usually have a relatively high priority. */ - for (int i = ready_list->first_te; i <= ready_list->last_te; i++) + for (int i = 0; i < binaryheap_size(ready_heap); i++) { - TocEntry *te = ready_list->tes[i]; + TocEntry *te = (TocEntry *) binaryheap_get_node(ready_heap, i); bool conflicts = false; /* @@ -4397,7 +4597,7 @@ pop_next_work_item(ParallelReadyList *ready_list, continue; /* passed all tests, so this item can run */ - ready_list_remove(ready_list, i); + binaryheap_remove_node(ready_heap, i); return te; } @@ -4443,7 +4643,7 @@ mark_restore_job_done(ArchiveHandle *AH, int status, void *callback_data) { - ParallelReadyList *ready_list = (ParallelReadyList *) callback_data; + binaryheap *ready_heap = (binaryheap *) callback_data; pg_log_info("finished item %d %s %s", te->dumpId, te->desc, te->tag); @@ -4461,7 +4661,7 @@ mark_restore_job_done(ArchiveHandle *AH, pg_fatal("worker process failed: exit code %d", status); - reduce_dependencies(AH, te, ready_list); + reduce_dependencies(AH, te, ready_heap); } @@ -4704,11 +4904,11 @@ identify_locking_dependencies(ArchiveHandle *AH, TocEntry *te) /* * Remove the specified TOC entry from the depCounts of items that depend on * it, thereby possibly making them ready-to-run. Any pending item that - * becomes ready should be moved to the ready_list, if that's provided. + * becomes ready should be moved to the ready_heap, if that's provided. */ static void reduce_dependencies(ArchiveHandle *AH, TocEntry *te, - ParallelReadyList *ready_list) + binaryheap *ready_heap) { int i; @@ -4726,18 +4926,18 @@ reduce_dependencies(ArchiveHandle *AH, TocEntry *te, * the current restore pass, and it is currently a member of the * pending list (that check is needed to prevent double restore in * some cases where a list-file forces out-of-order restoring). - * However, if ready_list == NULL then caller doesn't want any list + * However, if ready_heap == NULL then caller doesn't want any list * memberships changed. */ if (otherte->depCount == 0 && _tocEntryRestorePass(otherte) == AH->restorePass && otherte->pending_prev != NULL && - ready_list != NULL) + ready_heap != NULL) { /* Remove it from pending list ... */ pending_list_remove(otherte); - /* ... and add to ready_list */ - ready_list_insert(ready_list, otherte); + /* ... and add to ready_heap */ + binaryheap_add(ready_heap, otherte); } } } @@ -4790,6 +4990,10 @@ CloneArchive(ArchiveHandle *AH) clone = (ArchiveHandle *) pg_malloc(sizeof(ArchiveHandle)); memcpy(clone, AH, sizeof(ArchiveHandle)); + /* Likewise flat-copy the RestoreOptions, so we can alter them locally */ + clone->public.ropt = (RestoreOptions *) pg_malloc(sizeof(RestoreOptions)); + memcpy(clone->public.ropt, AH->public.ropt, sizeof(RestoreOptions)); + /* Handle format-independent fields */ memset(&(clone->sqlparse), 0, sizeof(clone->sqlparse)); @@ -4808,6 +5012,16 @@ CloneArchive(ArchiveHandle *AH) /* clone has its own error count, too */ clone->public.n_errors = 0; + /* clones should not share lo_buf */ + clone->lo_buf = NULL; + + /* + * Clone connections disregard --transaction-size; they must commit after + * each command so that the results are immediately visible to other + * workers. + */ + clone->public.ropt->txn_size = 0; + /* * Connect our new clone object to the database, using the same connection * parameters used for the original connection. diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h index 18b38c17abcd4..ce5ed1dd395d6 100644 --- a/src/bin/pg_dump/pg_backup_archiver.h +++ b/src/bin/pg_dump/pg_backup_archiver.h @@ -68,10 +68,13 @@ #define K_VERS_1_15 MAKE_ARCHIVE_VERSION(1, 15, 0) /* add * compression_algorithm * in header */ +#define K_VERS_1_16 MAKE_ARCHIVE_VERSION(1, 16, 0) /* BLOB METADATA entries + * and multiple BLOBS, + * relkind */ /* Current archive version number (the format we can output) */ #define K_VERS_MAJOR 1 -#define K_VERS_MINOR 15 +#define K_VERS_MINOR 16 #define K_VERS_REV 0 #define K_VERS_SELF MAKE_ARCHIVE_VERSION(K_VERS_MAJOR, K_VERS_MINOR, K_VERS_REV) @@ -113,7 +116,7 @@ struct ParallelState; typedef enum T_Action { ACT_DUMP, - ACT_RESTORE + ACT_RESTORE, } T_Action; typedef void (*ClosePtrType) (ArchiveHandle *AH); @@ -151,7 +154,7 @@ typedef enum { SQL_SCAN = 0, /* normal */ SQL_IN_SINGLE_QUOTE, /* '...' literal */ - SQL_IN_DOUBLE_QUOTE /* "..." identifier */ + SQL_IN_DOUBLE_QUOTE, /* "..." identifier */ } sqlparseState; typedef struct @@ -166,14 +169,14 @@ typedef enum STAGE_NONE = 0, STAGE_INITIALIZING, STAGE_PROCESSING, - STAGE_FINALIZING + STAGE_FINALIZING, } ArchiverStage; typedef enum { OUTPUT_SQLCMDS = 0, /* emitting general SQL commands */ OUTPUT_COPYDATA, /* writing COPY data */ - OUTPUT_OTHERDATA /* writing data as INSERT commands */ + OUTPUT_OTHERDATA, /* writing data as INSERT commands */ } ArchiverOutput; /* @@ -199,7 +202,7 @@ typedef enum { RESTORE_PASS_MAIN = 0, /* Main pass (most TOC item types) */ RESTORE_PASS_ACL, /* ACL item types */ - RESTORE_PASS_POST_ACL /* Event trigger and matview refresh items */ + RESTORE_PASS_POST_ACL, /* Event trigger and matview refresh items */ #define RESTORE_PASS_LAST RESTORE_PASS_POST_ACL } RestorePass; @@ -312,6 +315,7 @@ struct _archiveHandle pg_compress_specification compression_spec; /* Requested specification for * compression */ bool dosync; /* data requested to be synced on sight */ + DataDirSyncMethod sync_method; ArchiveMode mode; /* File mode - r or w */ void *formatData; /* Header data specific to file format */ @@ -321,6 +325,9 @@ struct _archiveHandle char *currTablespace; /* current tablespace, or NULL */ char *currTableAm; /* current table access method, or NULL */ + /* in --transaction-size mode, this counts objects emitted in cur xact */ + int txnCount; + void *lo_buf; size_t lo_buf_used; size_t lo_buf_size; @@ -347,6 +354,7 @@ struct _tocEntry char *tablespace; /* null if not in a tablespace; empty string * means use database default */ char *tableam; /* table access method, only for TABLE tags */ + char relkind; /* relation kind, only for TABLE tags */ char *owner; char *desc; char *defn; @@ -387,6 +395,7 @@ typedef struct _archiveOpts const char *namespace; const char *tablespace; const char *tableam; + char relkind; const char *owner; const char *description; teSection section; @@ -447,6 +456,9 @@ extern void InitArchiveFmt_Tar(ArchiveHandle *AH); extern bool isValidTarHeader(char *header); extern void ReconnectToServer(ArchiveHandle *AH, const char *dbname); +extern void IssueCommandPerBlob(ArchiveHandle *AH, TocEntry *te, + const char *cmdBegin, const char *cmdEnd); +extern void IssueACLPerBlob(ArchiveHandle *AH, TocEntry *te); extern void DropLOIfExists(ArchiveHandle *AH, Oid oid); void ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH); diff --git a/src/bin/pg_dump/pg_backup_custom.c b/src/bin/pg_dump/pg_backup_custom.c index b576b2992406a..55107b200581b 100644 --- a/src/bin/pg_dump/pg_backup_custom.c +++ b/src/bin/pg_dump/pg_backup_custom.c @@ -140,10 +140,6 @@ InitArchiveFmt_Custom(ArchiveHandle *AH) ctx = (lclContext *) pg_malloc0(sizeof(lclContext)); AH->formatData = (void *) ctx; - /* Initialize LO buffering */ - AH->lo_buf_size = LOBBUFSIZE; - AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE); - /* * Now open the file */ @@ -342,7 +338,7 @@ _EndData(ArchiveHandle *AH, TocEntry *te) } /* - * Called by the archiver when starting to save all BLOB DATA (not schema). + * Called by the archiver when starting to save BLOB DATA (not schema). * This routine should save whatever format-specific information is needed * to read the LOs back into memory. * @@ -402,7 +398,7 @@ _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid) } /* - * Called by the archiver when finishing saving all BLOB DATA. + * Called by the archiver when finishing saving BLOB DATA. * * Optional. */ @@ -902,9 +898,6 @@ _Clone(ArchiveHandle *AH) * share knowledge about where the data blocks are across threads. * _PrintTocData has to be careful about the order of operations on that * state, though. - * - * Note: we do not make a local lo_buf because we expect at most one BLOBS - * entry per archive, so no parallelism is possible. */ } diff --git a/src/bin/pg_dump/pg_backup_db.c b/src/bin/pg_dump/pg_backup_db.c index f766b65059da4..a02841c405026 100644 --- a/src/bin/pg_dump/pg_backup_db.c +++ b/src/bin/pg_dump/pg_backup_db.c @@ -541,29 +541,140 @@ CommitTransaction(Archive *AHX) ExecuteSqlCommand(AH, "COMMIT", "could not commit database transaction"); } +/* + * Issue per-blob commands for the large object(s) listed in the TocEntry + * + * The TocEntry's defn string is assumed to consist of large object OIDs, + * one per line. Wrap these in the given SQL command fragments and issue + * the commands. (cmdEnd need not include a semicolon.) + */ void -DropLOIfExists(ArchiveHandle *AH, Oid oid) +IssueCommandPerBlob(ArchiveHandle *AH, TocEntry *te, + const char *cmdBegin, const char *cmdEnd) { - /* - * If we are not restoring to a direct database connection, we have to - * guess about how to detect whether the LO exists. Assume new-style. - */ - if (AH->connection == NULL || - PQserverVersion(AH->connection) >= 90000) + /* Make a writable copy of the command string */ + char *buf = pg_strdup(te->defn); + RestoreOptions *ropt = AH->public.ropt; + char *st; + char *en; + + st = buf; + while ((en = strchr(st, '\n')) != NULL) { - ahprintf(AH, - "SELECT pg_catalog.lo_unlink(oid) " - "FROM pg_catalog.pg_largeobject_metadata " - "WHERE oid = '%u';\n", - oid); + *en++ = '\0'; + ahprintf(AH, "%s%s%s;\n", cmdBegin, st, cmdEnd); + + /* In --transaction-size mode, count each command as an action */ + if (ropt && ropt->txn_size > 0) + { + if (++AH->txnCount >= ropt->txn_size) + { + if (AH->connection) + { + CommitTransaction(&AH->public); + StartTransaction(&AH->public); + } + else + ahprintf(AH, "COMMIT;\nBEGIN;\n\n"); + AH->txnCount = 0; + } + } + + st = en; } - else + ahprintf(AH, "\n"); + pg_free(buf); +} + +/* + * Process a "LARGE OBJECTS" ACL TocEntry. + * + * To save space in the dump file, the TocEntry contains only one copy + * of the required GRANT/REVOKE commands, written to apply to the first + * blob in the group (although we do not depend on that detail here). + * We must expand the text to generate commands for all the blobs listed + * in the associated BLOB METADATA entry. + */ +void +IssueACLPerBlob(ArchiveHandle *AH, TocEntry *te) +{ + TocEntry *blobte = getTocEntryByDumpId(AH, te->dependencies[0]); + char *buf; + char *st; + char *st2; + char *en; + bool inquotes; + + if (!blobte) + pg_fatal("could not find entry for ID %d", te->dependencies[0]); + Assert(strcmp(blobte->desc, "BLOB METADATA") == 0); + + /* Make a writable copy of the ACL commands string */ + buf = pg_strdup(te->defn); + + /* + * We have to parse out the commands sufficiently to locate the blob OIDs + * and find the command-ending semicolons. The commands should not + * contain anything hard to parse except for double-quoted role names, + * which are easy to ignore. Once we've split apart the first and second + * halves of a command, apply IssueCommandPerBlob. (This means the + * updates on the blobs are interleaved if there's multiple commands, but + * that should cause no trouble.) + */ + inquotes = false; + st = en = buf; + st2 = NULL; + while (*en) { - /* Restoring to pre-9.0 server, so do it the old way */ - ahprintf(AH, - "SELECT CASE WHEN EXISTS(" - "SELECT 1 FROM pg_catalog.pg_largeobject WHERE loid = '%u'" - ") THEN pg_catalog.lo_unlink('%u') END;\n", - oid, oid); + /* Ignore double-quoted material */ + if (*en == '"') + inquotes = !inquotes; + if (inquotes) + { + en++; + continue; + } + /* If we found "LARGE OBJECT", that's the end of the first half */ + if (strncmp(en, "LARGE OBJECT ", 13) == 0) + { + /* Terminate the first-half string */ + en += 13; + Assert(isdigit((unsigned char) *en)); + *en++ = '\0'; + /* Skip the rest of the blob OID */ + while (isdigit((unsigned char) *en)) + en++; + /* Second half starts here */ + Assert(st2 == NULL); + st2 = en; + } + /* If we found semicolon, that's the end of the second half */ + else if (*en == ';') + { + /* Terminate the second-half string */ + *en++ = '\0'; + Assert(st2 != NULL); + /* Issue this command for each blob */ + IssueCommandPerBlob(AH, blobte, st, st2); + /* For neatness, skip whitespace before the next command */ + while (isspace((unsigned char) *en)) + en++; + /* Reset for new command */ + st = en; + st2 = NULL; + } + else + en++; } + pg_free(buf); +} + +void +DropLOIfExists(ArchiveHandle *AH, Oid oid) +{ + ahprintf(AH, + "SELECT pg_catalog.lo_unlink(oid) " + "FROM pg_catalog.pg_largeobject_metadata " + "WHERE oid = '%u';\n", + oid); } diff --git a/src/bin/pg_dump/pg_backup_directory.c b/src/bin/pg_dump/pg_backup_directory.c index 7f2ac7c7fd191..7be8d5487d4b2 100644 --- a/src/bin/pg_dump/pg_backup_directory.c +++ b/src/bin/pg_dump/pg_backup_directory.c @@ -5,8 +5,10 @@ * A directory format dump is a directory, which contains a "toc.dat" file * for the TOC, and a separate file for each data entry, named ".dat". * Large objects are stored in separate files named "blob_.dat", - * and there's a plain-text TOC file for them called "blobs.toc". If - * compression is used, each data file is individually compressed and the + * and there's a plain-text TOC file for each BLOBS TOC entry named + * "blobs_.toc" (or just "blobs.toc" in archive versions before 16). + * + * If compression is used, each data file is individually compressed and the * ".gz" suffix is added to the filenames. The TOC files are never * compressed by pg_dump, however they are accepted with the .gz suffix too, * in case the user has manually compressed them with 'gzip'. @@ -17,7 +19,7 @@ * sync. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 2000, Philip Warner * @@ -51,7 +53,7 @@ typedef struct char *directory; CompressFileHandle *dataFH; /* currently open data file */ - CompressFileHandle *LOsTocFH; /* file handle for blobs.toc */ + CompressFileHandle *LOsTocFH; /* file handle for blobs_NNN.toc */ ParallelState *pstate; /* for parallel backup / restore */ } lclContext; @@ -81,7 +83,7 @@ static void _StartLOs(ArchiveHandle *AH, TocEntry *te); static void _StartLO(ArchiveHandle *AH, TocEntry *te, Oid oid); static void _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid); static void _EndLOs(ArchiveHandle *AH, TocEntry *te); -static void _LoadLOs(ArchiveHandle *AH); +static void _LoadLOs(ArchiveHandle *AH, TocEntry *te); static void _PrepParallelRestore(ArchiveHandle *AH); static void _Clone(ArchiveHandle *AH); @@ -143,10 +145,6 @@ InitArchiveFmt_Directory(ArchiveHandle *AH) ctx->dataFH = NULL; ctx->LOsTocFH = NULL; - /* Initialize LO buffering */ - AH->lo_buf_size = LOBBUFSIZE; - AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE); - /* * Now open the TOC file */ @@ -236,7 +234,10 @@ _ArchiveEntry(ArchiveHandle *AH, TocEntry *te) tctx = (lclTocEntry *) pg_malloc0(sizeof(lclTocEntry)); if (strcmp(te->desc, "BLOBS") == 0) - tctx->filename = pg_strdup("blobs.toc"); + { + snprintf(fn, MAXPGPATH, "blobs_%d.toc", te->dumpId); + tctx->filename = pg_strdup(fn); + } else if (te->dataDumper) { snprintf(fn, MAXPGPATH, "%d.dat", te->dumpId); @@ -419,7 +420,7 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te) return; if (strcmp(te->desc, "BLOBS") == 0) - _LoadLOs(AH); + _LoadLOs(AH, te); else { char fname[MAXPGPATH]; @@ -430,17 +431,23 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te) } static void -_LoadLOs(ArchiveHandle *AH) +_LoadLOs(ArchiveHandle *AH, TocEntry *te) { Oid oid; lclContext *ctx = (lclContext *) AH->formatData; + lclTocEntry *tctx = (lclTocEntry *) te->formatData; CompressFileHandle *CFH; char tocfname[MAXPGPATH]; char line[MAXPGPATH]; StartRestoreLOs(AH); - setFilePath(AH, tocfname, "blobs.toc"); + /* + * Note: before archive v16, there was always only one BLOBS TOC entry, + * now there can be multiple. We don't need to worry what version we are + * reading though, because tctx->filename should be correct either way. + */ + setFilePath(AH, tocfname, tctx->filename); CFH = ctx->LOsTocFH = InitDiscoverCompressFileHandle(tocfname, PG_BINARY_R); @@ -613,7 +620,7 @@ _CloseArchive(ArchiveHandle *AH) * individually. Just recurse once through all the files generated. */ if (AH->dosync) - fsync_dir_recurse(ctx->directory); + sync_dir_recurse(ctx->directory, AH->sync_method); } AH->FH = NULL; } @@ -636,7 +643,7 @@ _ReopenArchive(ArchiveHandle *AH) */ /* - * Called by the archiver when starting to save all BLOB DATA (not schema). + * Called by the archiver when starting to save BLOB DATA (not schema). * It is called just prior to the dumper's DataDumper routine. * * We open the large object TOC file here, so that we can append a line to @@ -646,10 +653,11 @@ static void _StartLOs(ArchiveHandle *AH, TocEntry *te) { lclContext *ctx = (lclContext *) AH->formatData; + lclTocEntry *tctx = (lclTocEntry *) te->formatData; pg_compress_specification compression_spec = {0}; char fname[MAXPGPATH]; - setFilePath(AH, fname, "blobs.toc"); + setFilePath(AH, fname, tctx->filename); /* The LO TOC file is never compressed */ compression_spec.algorithm = PG_COMPRESSION_NONE; @@ -694,7 +702,7 @@ _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid) pg_fatal("could not close LO data file: %m"); ctx->dataFH = NULL; - /* register the LO in blobs.toc */ + /* register the LO in blobs_NNN.toc */ len = snprintf(buf, sizeof(buf), "%u blob_%u.dat\n", oid, oid); if (!CFH->write_func(buf, len, CFH)) { @@ -707,7 +715,7 @@ _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid) } /* - * Called by the archiver when finishing saving all BLOB DATA. + * Called by the archiver when finishing saving BLOB DATA. * * We close the LOs TOC file. */ @@ -799,7 +807,7 @@ _PrepParallelRestore(ArchiveHandle *AH) } /* - * If this is the BLOBS entry, what we stat'd was blobs.toc, which + * If this is a BLOBS entry, what we stat'd was blobs_NNN.toc, which * most likely is a lot smaller than the actual blob data. We don't * have a cheap way to estimate how much smaller, but fortunately it * doesn't matter too much as long as we get the LOs processed @@ -823,8 +831,6 @@ _Clone(ArchiveHandle *AH) ctx = (lclContext *) AH->formatData; /* - * Note: we do not make a local lo_buf because we expect at most one BLOBS - * entry per archive, so no parallelism is possible. Likewise, * TOC-entry-local state isn't an issue because any one TOC entry is * touched by just one worker child. */ diff --git a/src/bin/pg_dump/pg_backup_null.c b/src/bin/pg_dump/pg_backup_null.c index 08f096251b68f..a3257f4fc84dc 100644 --- a/src/bin/pg_dump/pg_backup_null.c +++ b/src/bin/pg_dump/pg_backup_null.c @@ -63,10 +63,6 @@ InitArchiveFmt_Null(ArchiveHandle *AH) AH->ClonePtr = NULL; AH->DeClonePtr = NULL; - /* Initialize LO buffering */ - AH->lo_buf_size = LOBBUFSIZE; - AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE); - /* * Now prevent reading... */ @@ -117,7 +113,7 @@ _EndData(ArchiveHandle *AH, TocEntry *te) } /* - * Called by the archiver when starting to save all BLOB DATA (not schema). + * Called by the archiver when starting to save BLOB DATA (not schema). * This routine should save whatever format-specific information is needed * to read the LOs back into memory. * @@ -174,7 +170,7 @@ _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid) } /* - * Called by the archiver when finishing saving all BLOB DATA. + * Called by the archiver when finishing saving BLOB DATA. * * Optional. */ diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c index db5fb43bae8f7..41ee52b1d69cc 100644 --- a/src/bin/pg_dump/pg_backup_tar.c +++ b/src/bin/pg_dump/pg_backup_tar.c @@ -94,7 +94,7 @@ typedef struct char *filename; } lclTocEntry; -static void _LoadLOs(ArchiveHandle *AH); +static void _LoadLOs(ArchiveHandle *AH, TocEntry *te); static TAR_MEMBER *tarOpen(ArchiveHandle *AH, const char *filename, char mode); static void tarClose(ArchiveHandle *AH, TAR_MEMBER *th); @@ -156,10 +156,6 @@ InitArchiveFmt_Tar(ArchiveHandle *AH) ctx->filePos = 0; ctx->isSpecialScript = 0; - /* Initialize LO buffering */ - AH->lo_buf_size = LOBBUFSIZE; - AH->lo_buf = (void *) pg_malloc(LOBBUFSIZE); - /* * Now open the tar file, and load the TOC if we're in read mode. */ @@ -638,13 +634,13 @@ _PrintTocData(ArchiveHandle *AH, TocEntry *te) } if (strcmp(te->desc, "BLOBS") == 0) - _LoadLOs(AH); + _LoadLOs(AH, te); else _PrintFileData(AH, tctx->filename); } static void -_LoadLOs(ArchiveHandle *AH) +_LoadLOs(ArchiveHandle *AH, TocEntry *te) { Oid oid; lclContext *ctx = (lclContext *) AH->formatData; @@ -655,7 +651,26 @@ _LoadLOs(ArchiveHandle *AH) StartRestoreLOs(AH); - th = tarOpen(AH, NULL, 'r'); /* Open next file */ + /* + * The blobs_NNN.toc or blobs.toc file is fairly useless to us because it + * will appear only after the associated blob_NNN.dat files. For archive + * versions >= 16 we can look at the BLOBS entry's te->tag to discover the + * OID of the first blob we want to restore, and then search forward to + * find the appropriate blob_.dat file. For older versions we rely + * on the knowledge that there was only one BLOBS entry and just search + * for the first blob_.dat file. Once we find the first blob file to + * restore, restore all blobs until we reach the blobs[_NNN].toc file. + */ + if (AH->version >= K_VERS_1_16) + { + /* We rely on atooid to not complain about nnnn..nnnn tags */ + oid = atooid(te->tag); + snprintf(buf, sizeof(buf), "blob_%u.dat", oid); + th = tarOpen(AH, buf, 'r'); /* Advance to first desired file */ + } + else + th = tarOpen(AH, NULL, 'r'); /* Open next file */ + while (th != NULL) { ctx->FH = th; @@ -685,9 +700,9 @@ _LoadLOs(ArchiveHandle *AH) /* * Once we have found the first LO, stop at the first non-LO entry - * (which will be 'blobs.toc'). This coding would eat all the - * rest of the archive if there are no LOs ... but this function - * shouldn't be called at all in that case. + * (which will be 'blobs[_NNN].toc'). This coding would eat all + * the rest of the archive if there are no LOs ... but this + * function shouldn't be called at all in that case. */ if (foundLO) break; @@ -851,7 +866,7 @@ _scriptOut(ArchiveHandle *AH, const void *buf, size_t len) */ /* - * Called by the archiver when starting to save all BLOB DATA (not schema). + * Called by the archiver when starting to save BLOB DATA (not schema). * This routine should save whatever format-specific information is needed * to read the LOs back into memory. * @@ -866,7 +881,7 @@ _StartLOs(ArchiveHandle *AH, TocEntry *te) lclContext *ctx = (lclContext *) AH->formatData; char fname[K_STD_BUF_SIZE]; - sprintf(fname, "blobs.toc"); + sprintf(fname, "blobs_%d.toc", te->dumpId); ctx->loToc = tarOpen(AH, fname, 'w'); } @@ -912,7 +927,7 @@ _EndLO(ArchiveHandle *AH, TocEntry *te, Oid oid) } /* - * Called by the archiver when finishing saving all BLOB DATA. + * Called by the archiver when finishing saving BLOB DATA. * * Optional. * @@ -975,20 +990,20 @@ isValidTarHeader(char *header) int sum; int chk = tarChecksum(header); - sum = read_tar_number(&header[148], 8); + sum = read_tar_number(&header[TAR_OFFSET_CHECKSUM], 8); if (sum != chk) return false; /* POSIX tar format */ - if (memcmp(&header[257], "ustar\0", 6) == 0 && - memcmp(&header[263], "00", 2) == 0) + if (memcmp(&header[TAR_OFFSET_MAGIC], "ustar\0", 6) == 0 && + memcmp(&header[TAR_OFFSET_VERSION], "00", 2) == 0) return true; /* GNU tar format */ - if (memcmp(&header[257], "ustar \0", 8) == 0) + if (memcmp(&header[TAR_OFFSET_MAGIC], "ustar \0", 8) == 0) return true; /* not-quite-POSIX format written by pre-9.3 pg_dump */ - if (memcmp(&header[257], "ustar00\0", 8) == 0) + if (memcmp(&header[TAR_OFFSET_MAGIC], "ustar00\0", 8) == 0) return true; return false; @@ -1151,7 +1166,7 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th) /* Calc checksum */ chk = tarChecksum(h); - sum = read_tar_number(&h[148], 8); + sum = read_tar_number(&h[TAR_OFFSET_CHECKSUM], 8); /* * If the checksum failed, see if it is a null block. If so, silently @@ -1175,9 +1190,9 @@ _tarGetHeader(ArchiveHandle *AH, TAR_MEMBER *th) } /* Name field is 100 bytes, might not be null-terminated */ - strlcpy(tag, &h[0], 100 + 1); + strlcpy(tag, &h[TAR_OFFSET_NAME], 100 + 1); - len = read_tar_number(&h[124], 12); + len = read_tar_number(&h[TAR_OFFSET_SIZE], 12); pg_log_debug("TOC Entry %s at %llu (length %llu, checksum %d)", tag, (unsigned long long) hPos, (unsigned long long) len, sum); diff --git a/src/bin/pg_dump/pg_backup_utils.c b/src/bin/pg_dump/pg_backup_utils.c index 4249584c9b696..a0045cf5e5885 100644 --- a/src/bin/pg_dump/pg_backup_utils.c +++ b/src/bin/pg_dump/pg_backup_utils.c @@ -4,7 +4,7 @@ * Utility routines shared by pg_dump and pg_restore * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/pg_dump/pg_backup_utils.c diff --git a/src/bin/pg_dump/pg_backup_utils.h b/src/bin/pg_dump/pg_backup_utils.h index b4dfff4eaacde..f2677839e3086 100644 --- a/src/bin/pg_dump/pg_backup_utils.h +++ b/src/bin/pg_dump/pg_backup_utils.h @@ -4,7 +4,7 @@ * Utility routines shared by pg_dump and pg_restore. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/pg_dump/pg_backup_utils.h diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 5dab1ba9eae6e..9ed1a856fa3d3 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -4,7 +4,7 @@ * pg_dump is a utility for dumping out a postgres database * into a script file. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * pg_dump will read the system catalogs in a database and dump out a @@ -60,6 +60,7 @@ #include "dumputils.h" #include "fe_utils/option_utils.h" #include "fe_utils/string_utils.h" +#include "filter.h" #include "getopt_long.h" #include "libpq/libpq-fs.h" #include "parallel.h" @@ -95,7 +96,7 @@ typedef enum OidOptions { zeroIsError = 1, zeroAsStar = 2, - zeroAsNone = 4 + zeroAsNone = 4, } OidOptions; /* global decls */ @@ -135,6 +136,9 @@ static SimpleOidList foreign_servers_include_oids = {NULL, NULL}; static SimpleStringList extension_include_patterns = {NULL, NULL}; static SimpleOidList extension_include_oids = {NULL, NULL}; +static SimpleStringList extension_exclude_patterns = {NULL, NULL}; +static SimpleOidList extension_exclude_oids = {NULL, NULL}; + static const CatalogId nilCatalogId = {0, 0}; /* override for standard extra_float_digits setting */ @@ -159,6 +163,13 @@ static int nseclabels = 0; */ #define DUMP_DEFAULT_ROWS_PER_INSERT 1 +/* + * Maximum number of large objects to group into a single ArchiveEntry. + * At some point we might want to make this user-controllable, but for now + * a hard-wired setting will suffice. + */ +#define MAX_BLOBS_PER_ARCHIVE_ENTRY 1000 + /* * Macro for producing quoted, schema-qualified name of a dumpable object. */ @@ -263,7 +274,7 @@ static void dumpDefaultACL(Archive *fout, const DefaultACLInfo *daclinfo); static DumpId dumpACL(Archive *fout, DumpId objDumpId, DumpId altDumpId, const char *type, const char *name, const char *subname, - const char *nspname, const char *owner, + const char *nspname, const char *tag, const char *owner, const DumpableAcl *dacl); static void getDependencies(Archive *fout); @@ -296,6 +307,7 @@ static void dumpPolicy(Archive *fout, const PolicyInfo *polinfo); static void dumpPublication(Archive *fout, const PublicationInfo *pubinfo); static void dumpPublicationTable(Archive *fout, const PublicationRelInfo *pubrinfo); static void dumpSubscription(Archive *fout, const SubscriptionInfo *subinfo); +static void dumpSubscriptionTable(Archive *fout, const SubRelInfo *subrinfo); static void dumpDatabase(Archive *fout); static void dumpDatabaseConfig(Archive *AH, PQExpBuffer outbuf, const char *dbname, Oid dboid); @@ -324,9 +336,11 @@ static bool nonemptyReloptions(const char *reloptions); static void appendReloptionsArrayAH(PQExpBuffer buffer, const char *reloptions, const char *prefix, Archive *fout); static char *get_synchronized_snapshot(Archive *fout); +static void set_restrict_relation_kind(Archive *AH, const char *value); static void setupDumpWorker(Archive *AH); static TableInfo *getRootTableInfo(const TableInfo *tbinfo); static bool forcePartitionRootLoad(const TableInfo *tbinfo); +static void read_dump_filters(const char *filename, DumpOptions *dopt); int @@ -357,6 +371,7 @@ main(int argc, char **argv) char *compression_algorithm_str = "none"; char *error_detail = NULL; bool user_compression_defined = false; + DataDirSyncMethod sync_method = DATA_DIR_SYNC_METHOD_FSYNC; static DumpOptions dopt; @@ -431,6 +446,9 @@ main(int argc, char **argv) {"table-and-children", required_argument, NULL, 12}, {"exclude-table-and-children", required_argument, NULL, 13}, {"exclude-table-data-and-children", required_argument, NULL, 14}, + {"sync-method", required_argument, NULL, 15}, + {"filter", required_argument, NULL, 16}, + {"exclude-extension", required_argument, NULL, 17}, {NULL, 0, NULL, 0} }; @@ -657,6 +675,20 @@ main(int argc, char **argv) optarg); break; + case 15: + if (!parse_sync_method(optarg, &sync_method)) + exit_nicely(1); + break; + + case 16: /* read object filters from file */ + read_dump_filters(optarg, &dopt); + break; + + case 17: /* exclude extension(s) */ + simple_string_list_append(&extension_exclude_patterns, + optarg); + break; + default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -777,7 +809,7 @@ main(int argc, char **argv) /* Open the output file */ fout = CreateArchive(filename, archiveFormat, compression_spec, - dosync, archiveMode, setupDumpWorker); + dosync, archiveMode, setupDumpWorker, sync_method); /* Make dump options accessible right away */ SetArchiveOptions(fout, &dopt, NULL); @@ -875,6 +907,10 @@ main(int argc, char **argv) if (extension_include_oids.head == NULL) pg_fatal("no matching extensions were found"); } + expand_extension_name_patterns(fout, &extension_exclude_patterns, + &extension_exclude_oids, + false); + /* non-matching exclusion patterns aren't an error */ /* * Dumping LOs is the default for dumps where an inclusion switch is not @@ -1068,6 +1104,7 @@ help(const char *progname) " compress as specified\n")); printf(_(" --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n")); printf(_(" --no-sync do not wait for changes to be written safely to disk\n")); + printf(_(" --sync-method=METHOD set method for syncing files to disk\n")); printf(_(" -?, --help show this help, then exit\n")); printf(_("\nOptions controlling the output content:\n")); @@ -1095,6 +1132,7 @@ help(const char *progname) printf(_(" --disable-triggers disable triggers during data-only restore\n")); printf(_(" --enable-row-security enable row security (dump only content user has\n" " access to)\n")); + printf(_(" --exclude-extension=PATTERN do NOT dump the specified extension(s)\n")); printf(_(" --exclude-table-and-children=PATTERN\n" " do NOT dump the specified table(s), including\n" " child and partition tables\n")); @@ -1103,6 +1141,8 @@ help(const char *progname) " do NOT dump data for the specified table(s),\n" " including child and partition tables\n")); printf(_(" --extra-float-digits=NUM override default setting for extra_float_digits\n")); + printf(_(" --filter=FILENAME include or exclude objects and data from dump\n" + " based on expressions in FILENAME\n")); printf(_(" --if-exists use IF EXISTS when dropping objects\n")); printf(_(" --include-foreign-data=PATTERN\n" " include data of foreign tables on foreign\n" @@ -1171,6 +1211,7 @@ setup_connection(Archive *AH, const char *dumpencoding, * we know how to escape strings. */ AH->encoding = PQclientEncoding(conn); + setFmtEncoding(AH->encoding); std_strings = PQparameterStatus(conn, "standard_conforming_strings"); AH->std_strings = (std_strings && strcmp(std_strings, "on") == 0); @@ -1234,6 +1275,8 @@ setup_connection(Archive *AH, const char *dumpencoding, ExecuteSqlStatement(AH, "SET lock_timeout = 0"); if (AH->remoteVersion >= 90600) ExecuteSqlStatement(AH, "SET idle_in_transaction_session_timeout = 0"); + if (AH->remoteVersion >= 170000) + ExecuteSqlStatement(AH, "SET transaction_timeout = 0"); /* * Quote all identifiers, if requested. @@ -1252,6 +1295,13 @@ setup_connection(Archive *AH, const char *dumpencoding, ExecuteSqlStatement(AH, "SET row_security = off"); } + /* + * For security reasons, we restrict the expansion of non-system views and + * access to foreign tables during the pg_dump process. This restriction + * is adjusted when dumping foreign table data. + */ + set_restrict_relation_kind(AH, "view, foreign-table"); + /* * Initialize prepared-query state to "nothing prepared". We do this here * so that a parallel dump worker will have its own state. @@ -1672,13 +1722,10 @@ checkExtensionMembership(DumpableObject *dobj, Archive *fout) addObjectDependency(dobj, ext->dobj.dumpId); /* - * In 9.6 and above, mark the member object to have any non-initial ACL, - * policies, and security labels dumped. - * - * Note that any initial ACLs (see pg_init_privs) will be removed when we - * extract the information about the object. We don't provide support for - * initial policies and security labels and it seems unlikely for those to - * ever exist, but we may have to revisit this later. + * In 9.6 and above, mark the member object to have any non-initial ACLs + * dumped. (Any initial ACLs will be removed later, using data from + * pg_init_privs, so that we'll dump only the delta from the extension's + * initial setup.) * * Prior to 9.6, we do not include any extension member components. * @@ -1686,6 +1733,13 @@ checkExtensionMembership(DumpableObject *dobj, Archive *fout) * individually, since the idea is to exactly reproduce the database * contents rather than replace the extension contents with something * different. + * + * Note: it might be interesting someday to implement storage and delta + * dumping of extension members' RLS policies and/or security labels. + * However there is a pitfall for RLS policies: trying to dump them + * requires getting a lock on their tables, and the calling user might not + * have privileges for that. We need no lock to examine a table's ACLs, + * so the current feature doesn't have a problem of that sort. */ if (fout->dopt->binary_upgrade) dobj->dump = ext->dobj.dump; @@ -1694,9 +1748,7 @@ checkExtensionMembership(DumpableObject *dobj, Archive *fout) if (fout->remoteVersion < 90600) dobj->dump = DUMP_COMPONENT_NONE; else - dobj->dump = ext->dobj.dump_contains & (DUMP_COMPONENT_ACL | - DUMP_COMPONENT_SECLABEL | - DUMP_COMPONENT_POLICY); + dobj->dump = ext->dobj.dump_contains & (DUMP_COMPONENT_ACL); } return true; @@ -1848,7 +1900,7 @@ selectDumpableType(TypeInfo *tyinfo, Archive *fout) return; } - /* skip auto-generated array types */ + /* skip auto-generated array and multirange types */ if (tyinfo->isArray || tyinfo->isMultirange) { tyinfo->dobj.objType = DO_DUMMY_TYPE; @@ -1856,8 +1908,8 @@ selectDumpableType(TypeInfo *tyinfo, Archive *fout) /* * Fall through to set the dump flag; we assume that the subsequent * rules will do the same thing as they would for the array's base - * type. (We cannot reliably look up the base type here, since - * getTypes may not have processed it yet.) + * type or multirange's range type. (We cannot reliably look up the + * base type here, since getTypes may not have processed it yet.) */ } @@ -2006,6 +2058,12 @@ selectDumpableExtension(ExtensionInfo *extinfo, DumpOptions *dopt) extinfo->dobj.dump = extinfo->dobj.dump_contains = dopt->include_everything ? DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE; + + /* check that the extension is not explicitly excluded */ + if (extinfo->dobj.dump && + simple_oid_list_member(&extension_exclude_oids, + extinfo->dobj.catId.oid)) + extinfo->dobj.dump = extinfo->dobj.dump_contains = DUMP_COMPONENT_NONE; } } @@ -2027,6 +2085,26 @@ selectDumpablePublicationObject(DumpableObject *dobj, Archive *fout) DUMP_COMPONENT_ALL : DUMP_COMPONENT_NONE; } +/* + * selectDumpableStatisticsObject: policy-setting subroutine + * Mark an extended statistics object as to be dumped or not + * + * We dump an extended statistics object if the schema it's in and the table + * it's for are being dumped. (This'll need more thought if statistics + * objects ever support cross-table stats.) + */ +static void +selectDumpableStatisticsObject(StatsExtInfo *sobj, Archive *fout) +{ + if (checkExtensionMembership(&sobj->dobj, fout)) + return; /* extension membership overrides all else */ + + sobj->dobj.dump = sobj->dobj.namespace->dobj.dump_contains; + if (sobj->stattable == NULL || + !(sobj->stattable->dobj.dump & DUMP_COMPONENT_DEFINITION)) + sobj->dobj.dump = DUMP_COMPONENT_NONE; +} + /* * selectDumpableObject: policy-setting subroutine * Mark a generic dumpable object as to be dumped or not @@ -2092,6 +2170,10 @@ dumpTableData_copy(Archive *fout, const void *dcontext) */ if (tdinfo->filtercond || tbinfo->relkind == RELKIND_FOREIGN_TABLE) { + /* Temporary allows to access to foreign tables to dump data */ + if (tbinfo->relkind == RELKIND_FOREIGN_TABLE) + set_restrict_relation_kind(fout, "view"); + appendPQExpBufferStr(q, "COPY (SELECT "); /* klugery to get rid of parens in column list */ if (strlen(column_list) > 2) @@ -2203,6 +2285,11 @@ dumpTableData_copy(Archive *fout, const void *dcontext) classname); destroyPQExpBuffer(q); + + /* Revert back the setting */ + if (tbinfo->relkind == RELKIND_FOREIGN_TABLE) + set_restrict_relation_kind(fout, "view, foreign-table"); + return 1; } @@ -2229,6 +2316,10 @@ dumpTableData_insert(Archive *fout, const void *dcontext) int rows_per_statement = dopt->dump_inserts; int rows_this_statement = 0; + /* Temporary allows to access to foreign tables to dump data */ + if (tbinfo->relkind == RELKIND_FOREIGN_TABLE) + set_restrict_relation_kind(fout, "view"); + /* * If we're going to emit INSERTs with column names, the most efficient * way to deal with generated columns is to exclude them entirely. For @@ -2468,6 +2559,10 @@ dumpTableData_insert(Archive *fout, const void *dcontext) destroyPQExpBuffer(insertStmt); free(attgenerated); + /* Revert back the setting */ + if (tbinfo->relkind == RELKIND_FOREIGN_TABLE) + set_restrict_relation_kind(fout, "view, foreign-table"); + return 1; } @@ -2942,7 +3037,7 @@ dumpDatabase(Archive *fout) i_datlocprovider, i_collate, i_ctype, - i_daticulocale, + i_datlocale, i_daticurules, i_frozenxid, i_minmxid, @@ -2961,7 +3056,7 @@ dumpDatabase(Archive *fout) *datlocprovider, *collate, *ctype, - *iculocale, + *locale, *icurules, *datistemplate, *datconnlimit, @@ -2985,10 +3080,12 @@ dumpDatabase(Archive *fout) appendPQExpBufferStr(dbQry, "datminmxid, "); else appendPQExpBufferStr(dbQry, "0 AS datminmxid, "); - if (fout->remoteVersion >= 150000) - appendPQExpBufferStr(dbQry, "datlocprovider, daticulocale, datcollversion, "); + if (fout->remoteVersion >= 170000) + appendPQExpBufferStr(dbQry, "datlocprovider, datlocale, datcollversion, "); + else if (fout->remoteVersion >= 150000) + appendPQExpBufferStr(dbQry, "datlocprovider, daticulocale AS datlocale, datcollversion, "); else - appendPQExpBufferStr(dbQry, "'c' AS datlocprovider, NULL AS daticulocale, NULL AS datcollversion, "); + appendPQExpBufferStr(dbQry, "'c' AS datlocprovider, NULL AS datlocale, NULL AS datcollversion, "); if (fout->remoteVersion >= 160000) appendPQExpBufferStr(dbQry, "daticurules, "); else @@ -3009,7 +3106,7 @@ dumpDatabase(Archive *fout) i_datlocprovider = PQfnumber(res, "datlocprovider"); i_collate = PQfnumber(res, "datcollate"); i_ctype = PQfnumber(res, "datctype"); - i_daticulocale = PQfnumber(res, "daticulocale"); + i_datlocale = PQfnumber(res, "datlocale"); i_daticurules = PQfnumber(res, "daticurules"); i_frozenxid = PQfnumber(res, "datfrozenxid"); i_minmxid = PQfnumber(res, "datminmxid"); @@ -3028,10 +3125,10 @@ dumpDatabase(Archive *fout) datlocprovider = PQgetvalue(res, 0, i_datlocprovider); collate = PQgetvalue(res, 0, i_collate); ctype = PQgetvalue(res, 0, i_ctype); - if (!PQgetisnull(res, 0, i_daticulocale)) - iculocale = PQgetvalue(res, 0, i_daticulocale); + if (!PQgetisnull(res, 0, i_datlocale)) + locale = PQgetvalue(res, 0, i_datlocale); else - iculocale = NULL; + locale = NULL; if (!PQgetisnull(res, 0, i_daticurules)) icurules = PQgetvalue(res, 0, i_daticurules); else @@ -3070,7 +3167,9 @@ dumpDatabase(Archive *fout) } appendPQExpBufferStr(creaQry, " LOCALE_PROVIDER = "); - if (datlocprovider[0] == 'c') + if (datlocprovider[0] == 'b') + appendPQExpBufferStr(creaQry, "builtin"); + else if (datlocprovider[0] == 'c') appendPQExpBufferStr(creaQry, "libc"); else if (datlocprovider[0] == 'i') appendPQExpBufferStr(creaQry, "icu"); @@ -3096,11 +3195,16 @@ dumpDatabase(Archive *fout) appendStringLiteralAH(creaQry, ctype, fout); } } - if (iculocale) + if (locale) { - appendPQExpBufferStr(creaQry, " ICU_LOCALE = "); - appendStringLiteralAH(creaQry, iculocale, fout); + if (datlocprovider[0] == 'b') + appendPQExpBufferStr(creaQry, " BUILTIN_LOCALE = "); + else + appendPQExpBufferStr(creaQry, " ICU_LOCALE = "); + + appendStringLiteralAH(creaQry, locale, fout); } + if (icurules) { appendPQExpBufferStr(creaQry, " ICU_RULES = "); @@ -3220,7 +3324,7 @@ dumpDatabase(Archive *fout) dumpACL(fout, dbDumpId, InvalidDumpId, "DATABASE", qdatname, NULL, NULL, - dba, &dbdacl); + NULL, dba, &dbdacl); /* * Now construct a DATABASE PROPERTIES archive entry to restore any @@ -3255,6 +3359,11 @@ dumpDatabase(Archive *fout) appendPQExpBufferStr(delQry, ";\n"); } + /* + * We do not restore pg_database.dathasloginevt because it is set + * automatically on login event trigger creation. + */ + /* Add database-specific SET options */ dumpDatabaseConfig(fout, creaQry, datname, dbCatId.oid); @@ -3451,7 +3560,7 @@ dumpStdStrings(Archive *AH) const char *stdstrings = AH->std_strings ? "on" : "off"; PQExpBuffer qry = createPQExpBuffer(); - pg_log_info("saving standard_conforming_strings = %s", + pg_log_info("saving \"standard_conforming_strings = %s\"", stdstrings); appendPQExpBuffer(qry, "SET standard_conforming_strings = '%s';\n", @@ -3509,7 +3618,7 @@ dumpSearchPath(Archive *AH) appendStringLiteralAH(qry, path->data, AH); appendPQExpBufferStr(qry, ", false);\n"); - pg_log_info("saving search_path = %s", path->data); + pg_log_info("saving \"search_path = %s\"", path->data); ArchiveEntry(AH, nilCatalogId, createDumpId(), ARCHIVE_OPTS(.tag = "SEARCHPATH", @@ -3536,11 +3645,10 @@ getLOs(Archive *fout) { DumpOptions *dopt = fout->dopt; PQExpBuffer loQry = createPQExpBuffer(); - LoInfo *loinfo; - DumpableObject *lodata; PGresult *res; int ntups; int i; + int n; int i_oid; int i_lomowner; int i_lomacl; @@ -3548,11 +3656,15 @@ getLOs(Archive *fout) pg_log_info("reading large objects"); - /* Fetch LO OIDs, and owner/ACL data */ + /* + * Fetch LO OIDs and owner/ACL data. Order the data so that all the blobs + * with the same owner/ACL appear together. + */ appendPQExpBufferStr(loQry, "SELECT oid, lomowner, lomacl, " "acldefault('L', lomowner) AS acldefault " - "FROM pg_largeobject_metadata"); + "FROM pg_largeobject_metadata " + "ORDER BY lomowner, lomacl::pg_catalog.text, oid"); res = ExecuteSqlQuery(fout, loQry->data, PGRES_TUPLES_OK); @@ -3564,30 +3676,72 @@ getLOs(Archive *fout) ntups = PQntuples(res); /* - * Each large object has its own "BLOB" archive entry. + * Group the blobs into suitably-sized groups that have the same owner and + * ACL setting, and build a metadata and a data DumpableObject for each + * group. (If we supported initprivs for blobs, we'd have to insist that + * groups also share initprivs settings, since the DumpableObject only has + * room for one.) i is the index of the first tuple in the current group, + * and n is the number of tuples we include in the group. */ - loinfo = (LoInfo *) pg_malloc(ntups * sizeof(LoInfo)); + for (i = 0; i < ntups; i += n) + { + Oid thisoid = atooid(PQgetvalue(res, i, i_oid)); + char *thisowner = PQgetvalue(res, i, i_lomowner); + char *thisacl = PQgetvalue(res, i, i_lomacl); + LoInfo *loinfo; + DumpableObject *lodata; + char namebuf[64]; + + /* Scan to find first tuple not to be included in group */ + n = 1; + while (n < MAX_BLOBS_PER_ARCHIVE_ENTRY && i + n < ntups) + { + if (strcmp(thisowner, PQgetvalue(res, i + n, i_lomowner)) != 0 || + strcmp(thisacl, PQgetvalue(res, i + n, i_lomacl)) != 0) + break; + n++; + } - for (i = 0; i < ntups; i++) - { - loinfo[i].dobj.objType = DO_LARGE_OBJECT; - loinfo[i].dobj.catId.tableoid = LargeObjectRelationId; - loinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid)); - AssignDumpId(&loinfo[i].dobj); + /* Build the metadata DumpableObject */ + loinfo = (LoInfo *) pg_malloc(offsetof(LoInfo, looids) + n * sizeof(Oid)); + + loinfo->dobj.objType = DO_LARGE_OBJECT; + loinfo->dobj.catId.tableoid = LargeObjectRelationId; + loinfo->dobj.catId.oid = thisoid; + AssignDumpId(&loinfo->dobj); + + if (n > 1) + snprintf(namebuf, sizeof(namebuf), "%u..%u", thisoid, + atooid(PQgetvalue(res, i + n - 1, i_oid))); + else + snprintf(namebuf, sizeof(namebuf), "%u", thisoid); + loinfo->dobj.name = pg_strdup(namebuf); + loinfo->dacl.acl = pg_strdup(thisacl); + loinfo->dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault)); + loinfo->dacl.privtype = 0; + loinfo->dacl.initprivs = NULL; + loinfo->rolname = getRoleName(thisowner); + loinfo->numlos = n; + loinfo->looids[0] = thisoid; + /* Collect OIDs of the remaining blobs in this group */ + for (int k = 1; k < n; k++) + { + CatalogId extraID; - loinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_oid)); - loinfo[i].dacl.acl = pg_strdup(PQgetvalue(res, i, i_lomacl)); - loinfo[i].dacl.acldefault = pg_strdup(PQgetvalue(res, i, i_acldefault)); - loinfo[i].dacl.privtype = 0; - loinfo[i].dacl.initprivs = NULL; - loinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_lomowner)); + loinfo->looids[k] = atooid(PQgetvalue(res, i + k, i_oid)); + + /* Make sure we can look up loinfo by any of the blobs' OIDs */ + extraID.tableoid = LargeObjectRelationId; + extraID.oid = loinfo->looids[k]; + recordAdditionalCatalogID(extraID, &loinfo->dobj); + } /* LOs have data */ - loinfo[i].dobj.components |= DUMP_COMPONENT_DATA; + loinfo->dobj.components |= DUMP_COMPONENT_DATA; - /* Mark whether LO has an ACL */ + /* Mark whether LO group has a non-empty ACL */ if (!PQgetisnull(res, i, i_lomacl)) - loinfo[i].dobj.components |= DUMP_COMPONENT_ACL; + loinfo->dobj.components |= DUMP_COMPONENT_ACL; /* * In binary-upgrade mode for LOs, we do *not* dump out the LO data, @@ -3597,21 +3751,22 @@ getLOs(Archive *fout) * pg_largeobject_metadata, after the dump is restored. */ if (dopt->binary_upgrade) - loinfo[i].dobj.dump &= ~DUMP_COMPONENT_DATA; - } + loinfo->dobj.dump &= ~DUMP_COMPONENT_DATA; - /* - * If we have any large objects, a "BLOBS" archive entry is needed. This - * is just a placeholder for sorting; it carries no data now. - */ - if (ntups > 0) - { + /* + * Create a "BLOBS" data item for the group, too. This is just a + * placeholder for sorting; it carries no data now. + */ lodata = (DumpableObject *) pg_malloc(sizeof(DumpableObject)); lodata->objType = DO_LARGE_OBJECT_DATA; lodata->catId = nilCatalogId; AssignDumpId(lodata); - lodata->name = pg_strdup("BLOBS"); + lodata->name = pg_strdup(namebuf); lodata->components |= DUMP_COMPONENT_DATA; + /* Set up explicit dependency from data to metadata */ + lodata->dependencies = (DumpId *) pg_malloc(sizeof(DumpId)); + lodata->dependencies[0] = loinfo->dobj.dumpId; + lodata->nDeps = lodata->allocDeps = 1; } PQclear(res); @@ -3621,123 +3776,136 @@ getLOs(Archive *fout) /* * dumpLO * - * dump the definition (metadata) of the given large object + * dump the definition (metadata) of the given large object group */ static void dumpLO(Archive *fout, const LoInfo *loinfo) { PQExpBuffer cquery = createPQExpBuffer(); - PQExpBuffer dquery = createPQExpBuffer(); - appendPQExpBuffer(cquery, - "SELECT pg_catalog.lo_create('%s');\n", - loinfo->dobj.name); - - appendPQExpBuffer(dquery, - "SELECT pg_catalog.lo_unlink('%s');\n", - loinfo->dobj.name); + /* + * The "definition" is just a newline-separated list of OIDs. We need to + * put something into the dropStmt too, but it can just be a comment. + */ + for (int i = 0; i < loinfo->numlos; i++) + appendPQExpBuffer(cquery, "%u\n", loinfo->looids[i]); if (loinfo->dobj.dump & DUMP_COMPONENT_DEFINITION) ArchiveEntry(fout, loinfo->dobj.catId, loinfo->dobj.dumpId, ARCHIVE_OPTS(.tag = loinfo->dobj.name, .owner = loinfo->rolname, - .description = "BLOB", - .section = SECTION_PRE_DATA, + .description = "BLOB METADATA", + .section = SECTION_DATA, .createStmt = cquery->data, - .dropStmt = dquery->data)); - - /* Dump comment if any */ - if (loinfo->dobj.dump & DUMP_COMPONENT_COMMENT) - dumpComment(fout, "LARGE OBJECT", loinfo->dobj.name, - NULL, loinfo->rolname, - loinfo->dobj.catId, 0, loinfo->dobj.dumpId); + .dropStmt = "-- dummy")); - /* Dump security label if any */ - if (loinfo->dobj.dump & DUMP_COMPONENT_SECLABEL) - dumpSecLabel(fout, "LARGE OBJECT", loinfo->dobj.name, - NULL, loinfo->rolname, - loinfo->dobj.catId, 0, loinfo->dobj.dumpId); + /* + * Dump per-blob comments and seclabels if any. We assume these are rare + * enough that it's okay to generate retail TOC entries for them. + */ + if (loinfo->dobj.dump & (DUMP_COMPONENT_COMMENT | + DUMP_COMPONENT_SECLABEL)) + { + for (int i = 0; i < loinfo->numlos; i++) + { + CatalogId catId; + char namebuf[32]; + + /* Build identifying info for this blob */ + catId.tableoid = loinfo->dobj.catId.tableoid; + catId.oid = loinfo->looids[i]; + snprintf(namebuf, sizeof(namebuf), "%u", loinfo->looids[i]); + + if (loinfo->dobj.dump & DUMP_COMPONENT_COMMENT) + dumpComment(fout, "LARGE OBJECT", namebuf, + NULL, loinfo->rolname, + catId, 0, loinfo->dobj.dumpId); + + if (loinfo->dobj.dump & DUMP_COMPONENT_SECLABEL) + dumpSecLabel(fout, "LARGE OBJECT", namebuf, + NULL, loinfo->rolname, + catId, 0, loinfo->dobj.dumpId); + } + } - /* Dump ACL if any */ + /* + * Dump the ACLs if any (remember that all blobs in the group will have + * the same ACL). If there's just one blob, dump a simple ACL entry; if + * there's more, make a "LARGE OBJECTS" entry that really contains only + * the ACL for the first blob. _printTocEntry() will be cued by the tag + * string to emit a mutated version for each blob. + */ if (loinfo->dobj.dump & DUMP_COMPONENT_ACL) - dumpACL(fout, loinfo->dobj.dumpId, InvalidDumpId, "LARGE OBJECT", - loinfo->dobj.name, NULL, - NULL, loinfo->rolname, &loinfo->dacl); + { + char namebuf[32]; + + /* Build identifying info for the first blob */ + snprintf(namebuf, sizeof(namebuf), "%u", loinfo->looids[0]); + + if (loinfo->numlos > 1) + { + char tagbuf[64]; + + snprintf(tagbuf, sizeof(tagbuf), "LARGE OBJECTS %u..%u", + loinfo->looids[0], loinfo->looids[loinfo->numlos - 1]); + + dumpACL(fout, loinfo->dobj.dumpId, InvalidDumpId, + "LARGE OBJECT", namebuf, NULL, NULL, + tagbuf, loinfo->rolname, &loinfo->dacl); + } + else + { + dumpACL(fout, loinfo->dobj.dumpId, InvalidDumpId, + "LARGE OBJECT", namebuf, NULL, NULL, + NULL, loinfo->rolname, &loinfo->dacl); + } + } destroyPQExpBuffer(cquery); - destroyPQExpBuffer(dquery); } /* * dumpLOs: - * dump the data contents of all large objects + * dump the data contents of the large objects in the given group */ static int dumpLOs(Archive *fout, const void *arg) { - const char *loQry; - const char *loFetchQry; + const LoInfo *loinfo = (const LoInfo *) arg; PGconn *conn = GetConnection(fout); - PGresult *res; char buf[LOBBUFSIZE]; - int ntups; - int i; - int cnt; - - pg_log_info("saving large objects"); - /* - * Currently, we re-fetch all LO OIDs using a cursor. Consider scanning - * the already-in-memory dumpable objects instead... - */ - loQry = - "DECLARE looid CURSOR FOR " - "SELECT oid FROM pg_largeobject_metadata ORDER BY 1"; + pg_log_info("saving large objects \"%s\"", loinfo->dobj.name); - ExecuteSqlStatement(fout, loQry); + for (int i = 0; i < loinfo->numlos; i++) + { + Oid loOid = loinfo->looids[i]; + int loFd; + int cnt; - /* Command to fetch from cursor */ - loFetchQry = "FETCH 1000 IN looid"; + /* Open the LO */ + loFd = lo_open(conn, loOid, INV_READ); + if (loFd == -1) + pg_fatal("could not open large object %u: %s", + loOid, PQerrorMessage(conn)); - do - { - /* Do a fetch */ - res = ExecuteSqlQuery(fout, loFetchQry, PGRES_TUPLES_OK); + StartLO(fout, loOid); - /* Process the tuples, if any */ - ntups = PQntuples(res); - for (i = 0; i < ntups; i++) + /* Now read it in chunks, sending data to archive */ + do { - Oid loOid; - int loFd; - - loOid = atooid(PQgetvalue(res, i, 0)); - /* Open the LO */ - loFd = lo_open(conn, loOid, INV_READ); - if (loFd == -1) - pg_fatal("could not open large object %u: %s", + cnt = lo_read(conn, loFd, buf, LOBBUFSIZE); + if (cnt < 0) + pg_fatal("error reading large object %u: %s", loOid, PQerrorMessage(conn)); - StartLO(fout, loOid); - - /* Now read it in chunks, sending data to archive */ - do - { - cnt = lo_read(conn, loFd, buf, LOBBUFSIZE); - if (cnt < 0) - pg_fatal("error reading large object %u: %s", - loOid, PQerrorMessage(conn)); + WriteData(fout, buf, cnt); + } while (cnt > 0); - WriteData(fout, buf, cnt); - } while (cnt > 0); + lo_close(conn, loFd); - lo_close(conn, loFd); - - EndLO(fout, loOid); - } - - PQclear(res); - } while (ntups > 0); + EndLO(fout, loOid); + } return 1; } @@ -4568,6 +4736,28 @@ is_superuser(Archive *fout) return false; } +/* + * Set the given value to restrict_nonsystem_relation_kind value. Since + * restrict_nonsystem_relation_kind is introduced in minor version releases, + * the setting query is effective only where available. + */ +static void +set_restrict_relation_kind(Archive *AH, const char *value) +{ + PQExpBuffer query = createPQExpBuffer(); + PGresult *res; + + appendPQExpBuffer(query, + "SELECT set_config(name, '%s', false) " + "FROM pg_settings " + "WHERE name = 'restrict_nonsystem_relation_kind'", + value); + res = ExecuteSqlQuery(AH, query->data, PGRES_TUPLES_OK); + + PQclear(res); + destroyPQExpBuffer(query); +} + /* * getSubscriptions * get information about subscriptions @@ -4583,16 +4773,20 @@ getSubscriptions(Archive *fout) int i_oid; int i_subname; int i_subowner; + int i_subbinary; int i_substream; int i_subtwophasestate; int i_subdisableonerr; - int i_suborigin; + int i_subpasswordrequired; + int i_subrunasowner; int i_subconninfo; int i_subslotname; int i_subsynccommit; int i_subpublications; - int i_subbinary; - int i_subpasswordrequired; + int i_suborigin; + int i_suboriginremotelsn; + int i_subenabled; + int i_subfailover; int i, ntups; @@ -4646,16 +4840,39 @@ getSubscriptions(Archive *fout) if (fout->remoteVersion >= 160000) appendPQExpBufferStr(query, - " s.suborigin,\n" - " s.subpasswordrequired\n"); + " s.subpasswordrequired,\n" + " s.subrunasowner,\n" + " s.suborigin,\n"); else appendPQExpBuffer(query, - " '%s' AS suborigin,\n" - " 't' AS subpasswordrequired\n", + " 't' AS subpasswordrequired,\n" + " 't' AS subrunasowner,\n" + " '%s' AS suborigin,\n", LOGICALREP_ORIGIN_ANY); + if (dopt->binary_upgrade && fout->remoteVersion >= 170000) + appendPQExpBufferStr(query, " o.remote_lsn AS suboriginremotelsn,\n" + " s.subenabled,\n"); + else + appendPQExpBufferStr(query, " NULL AS suboriginremotelsn,\n" + " false AS subenabled,\n"); + + if (fout->remoteVersion >= 170000) + appendPQExpBufferStr(query, + " s.subfailover\n"); + else + appendPQExpBuffer(query, + " false AS subfailover\n"); + + appendPQExpBufferStr(query, + "FROM pg_subscription s\n"); + + if (dopt->binary_upgrade && fout->remoteVersion >= 170000) + appendPQExpBufferStr(query, + "LEFT JOIN pg_catalog.pg_replication_origin_status o \n" + " ON o.external_id = 'pg_' || s.oid::text \n"); + appendPQExpBufferStr(query, - "FROM pg_subscription s\n" "WHERE s.subdbid = (SELECT oid FROM pg_database\n" " WHERE datname = current_database())"); @@ -4671,16 +4888,20 @@ getSubscriptions(Archive *fout) i_oid = PQfnumber(res, "oid"); i_subname = PQfnumber(res, "subname"); i_subowner = PQfnumber(res, "subowner"); - i_subconninfo = PQfnumber(res, "subconninfo"); - i_subslotname = PQfnumber(res, "subslotname"); - i_subsynccommit = PQfnumber(res, "subsynccommit"); - i_subpublications = PQfnumber(res, "subpublications"); i_subbinary = PQfnumber(res, "subbinary"); i_substream = PQfnumber(res, "substream"); i_subtwophasestate = PQfnumber(res, "subtwophasestate"); i_subdisableonerr = PQfnumber(res, "subdisableonerr"); - i_suborigin = PQfnumber(res, "suborigin"); i_subpasswordrequired = PQfnumber(res, "subpasswordrequired"); + i_subrunasowner = PQfnumber(res, "subrunasowner"); + i_subconninfo = PQfnumber(res, "subconninfo"); + i_subslotname = PQfnumber(res, "subslotname"); + i_subsynccommit = PQfnumber(res, "subsynccommit"); + i_subpublications = PQfnumber(res, "subpublications"); + i_suborigin = PQfnumber(res, "suborigin"); + i_suboriginremotelsn = PQfnumber(res, "suboriginremotelsn"); + i_subenabled = PQfnumber(res, "subenabled"); + i_subfailover = PQfnumber(res, "subfailover"); subinfo = pg_malloc(ntups * sizeof(SubscriptionInfo)); @@ -4693,15 +4914,7 @@ getSubscriptions(Archive *fout) AssignDumpId(&subinfo[i].dobj); subinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_subname)); subinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_subowner)); - subinfo[i].subconninfo = pg_strdup(PQgetvalue(res, i, i_subconninfo)); - if (PQgetisnull(res, i, i_subslotname)) - subinfo[i].subslotname = NULL; - else - subinfo[i].subslotname = pg_strdup(PQgetvalue(res, i, i_subslotname)); - subinfo[i].subsynccommit = - pg_strdup(PQgetvalue(res, i, i_subsynccommit)); - subinfo[i].subpublications = - pg_strdup(PQgetvalue(res, i, i_subpublications)); + subinfo[i].subbinary = pg_strdup(PQgetvalue(res, i, i_subbinary)); subinfo[i].substream = @@ -4710,9 +4923,31 @@ getSubscriptions(Archive *fout) pg_strdup(PQgetvalue(res, i, i_subtwophasestate)); subinfo[i].subdisableonerr = pg_strdup(PQgetvalue(res, i, i_subdisableonerr)); - subinfo[i].suborigin = pg_strdup(PQgetvalue(res, i, i_suborigin)); subinfo[i].subpasswordrequired = pg_strdup(PQgetvalue(res, i, i_subpasswordrequired)); + subinfo[i].subrunasowner = + pg_strdup(PQgetvalue(res, i, i_subrunasowner)); + subinfo[i].subconninfo = + pg_strdup(PQgetvalue(res, i, i_subconninfo)); + if (PQgetisnull(res, i, i_subslotname)) + subinfo[i].subslotname = NULL; + else + subinfo[i].subslotname = + pg_strdup(PQgetvalue(res, i, i_subslotname)); + subinfo[i].subsynccommit = + pg_strdup(PQgetvalue(res, i, i_subsynccommit)); + subinfo[i].subpublications = + pg_strdup(PQgetvalue(res, i, i_subpublications)); + subinfo[i].suborigin = pg_strdup(PQgetvalue(res, i, i_suborigin)); + if (PQgetisnull(res, i, i_suboriginremotelsn)) + subinfo[i].suboriginremotelsn = NULL; + else + subinfo[i].suboriginremotelsn = + pg_strdup(PQgetvalue(res, i, i_suboriginremotelsn)); + subinfo[i].subenabled = + pg_strdup(PQgetvalue(res, i, i_subenabled)); + subinfo[i].subfailover = + pg_strdup(PQgetvalue(res, i, i_subfailover)); /* Decide whether we want to dump it */ selectDumpableObject(&(subinfo[i].dobj), fout); @@ -4722,6 +4957,162 @@ getSubscriptions(Archive *fout) destroyPQExpBuffer(query); } +/* + * getSubscriptionTables + * Get information about subscription membership for dumpable tables. This + * will be used only in binary-upgrade mode for PG17 or later versions. + */ +void +getSubscriptionTables(Archive *fout) +{ + DumpOptions *dopt = fout->dopt; + SubscriptionInfo *subinfo = NULL; + SubRelInfo *subrinfo; + PGresult *res; + int i_srsubid; + int i_srrelid; + int i_srsubstate; + int i_srsublsn; + int ntups; + Oid last_srsubid = InvalidOid; + + if (dopt->no_subscriptions || !dopt->binary_upgrade || + fout->remoteVersion < 170000) + return; + + res = ExecuteSqlQuery(fout, + "SELECT srsubid, srrelid, srsubstate, srsublsn " + "FROM pg_catalog.pg_subscription_rel " + "ORDER BY srsubid", + PGRES_TUPLES_OK); + ntups = PQntuples(res); + if (ntups == 0) + goto cleanup; + + /* Get pg_subscription_rel attributes */ + i_srsubid = PQfnumber(res, "srsubid"); + i_srrelid = PQfnumber(res, "srrelid"); + i_srsubstate = PQfnumber(res, "srsubstate"); + i_srsublsn = PQfnumber(res, "srsublsn"); + + subrinfo = pg_malloc(ntups * sizeof(SubRelInfo)); + for (int i = 0; i < ntups; i++) + { + Oid cur_srsubid = atooid(PQgetvalue(res, i, i_srsubid)); + Oid relid = atooid(PQgetvalue(res, i, i_srrelid)); + TableInfo *tblinfo; + + /* + * If we switched to a new subscription, check if the subscription + * exists. + */ + if (cur_srsubid != last_srsubid) + { + subinfo = findSubscriptionByOid(cur_srsubid); + if (subinfo == NULL) + pg_fatal("subscription with OID %u does not exist", cur_srsubid); + + last_srsubid = cur_srsubid; + } + + tblinfo = findTableByOid(relid); + if (tblinfo == NULL) + pg_fatal("failed sanity check, table with OID %u not found", + relid); + + /* OK, make a DumpableObject for this relationship */ + subrinfo[i].dobj.objType = DO_SUBSCRIPTION_REL; + subrinfo[i].dobj.catId.tableoid = relid; + subrinfo[i].dobj.catId.oid = cur_srsubid; + AssignDumpId(&subrinfo[i].dobj); + subrinfo[i].dobj.name = pg_strdup(subinfo->dobj.name); + subrinfo[i].tblinfo = tblinfo; + subrinfo[i].srsubstate = PQgetvalue(res, i, i_srsubstate)[0]; + if (PQgetisnull(res, i, i_srsublsn)) + subrinfo[i].srsublsn = NULL; + else + subrinfo[i].srsublsn = pg_strdup(PQgetvalue(res, i, i_srsublsn)); + + subrinfo[i].subinfo = subinfo; + + /* Decide whether we want to dump it */ + selectDumpableObject(&(subrinfo[i].dobj), fout); + } + +cleanup: + PQclear(res); +} + +/* + * dumpSubscriptionTable + * Dump the definition of the given subscription table mapping. This will be + * used only in binary-upgrade mode for PG17 or later versions. + */ +static void +dumpSubscriptionTable(Archive *fout, const SubRelInfo *subrinfo) +{ + DumpOptions *dopt = fout->dopt; + SubscriptionInfo *subinfo = subrinfo->subinfo; + PQExpBuffer query; + char *tag; + + /* Do nothing in data-only dump */ + if (dopt->dataOnly) + return; + + Assert(fout->dopt->binary_upgrade && fout->remoteVersion >= 170000); + + tag = psprintf("%s %s", subinfo->dobj.name, subrinfo->dobj.name); + + query = createPQExpBuffer(); + + if (subinfo->dobj.dump & DUMP_COMPONENT_DEFINITION) + { + /* + * binary_upgrade_add_sub_rel_state will add the subscription relation + * to pg_subscription_rel table. This will be used only in + * binary-upgrade mode. + */ + appendPQExpBufferStr(query, + "\n-- For binary upgrade, must preserve the subscriber table.\n"); + appendPQExpBufferStr(query, + "SELECT pg_catalog.binary_upgrade_add_sub_rel_state("); + appendStringLiteralAH(query, subrinfo->dobj.name, fout); + appendPQExpBuffer(query, + ", %u, '%c'", + subrinfo->tblinfo->dobj.catId.oid, + subrinfo->srsubstate); + + if (subrinfo->srsublsn && subrinfo->srsublsn[0] != '\0') + appendPQExpBuffer(query, ", '%s'", subrinfo->srsublsn); + else + appendPQExpBuffer(query, ", NULL"); + + appendPQExpBufferStr(query, ");\n"); + } + + /* + * There is no point in creating a drop query as the drop is done by table + * drop. (If you think to change this, see also _printTocEntry().) + * Although this object doesn't really have ownership as such, set the + * owner field anyway to ensure that the command is run by the correct + * role at restore time. + */ + if (subrinfo->dobj.dump & DUMP_COMPONENT_DEFINITION) + ArchiveEntry(fout, subrinfo->dobj.catId, subrinfo->dobj.dumpId, + ARCHIVE_OPTS(.tag = tag, + .namespace = subrinfo->tblinfo->dobj.namespace->dobj.name, + .owner = subinfo->rolname, + .description = "SUBSCRIPTION TABLE", + .section = SECTION_POST_DATA, + .createStmt = query->data)); + + /* These objects can't currently have comments or seclabels */ + + free(tag); + destroyPQExpBuffer(query); +} + /* * dumpSubscription * dump the definition of the given subscription @@ -4788,17 +5179,60 @@ dumpSubscription(Archive *fout, const SubscriptionInfo *subinfo) if (strcmp(subinfo->subdisableonerr, "t") == 0) appendPQExpBufferStr(query, ", disable_on_error = true"); - if (pg_strcasecmp(subinfo->suborigin, LOGICALREP_ORIGIN_ANY) != 0) - appendPQExpBuffer(query, ", origin = %s", subinfo->suborigin); + if (strcmp(subinfo->subpasswordrequired, "t") != 0) + appendPQExpBuffer(query, ", password_required = false"); + + if (strcmp(subinfo->subrunasowner, "t") == 0) + appendPQExpBufferStr(query, ", run_as_owner = true"); + + if (strcmp(subinfo->subfailover, "t") == 0) + appendPQExpBufferStr(query, ", failover = true"); if (strcmp(subinfo->subsynccommit, "off") != 0) appendPQExpBuffer(query, ", synchronous_commit = %s", fmtId(subinfo->subsynccommit)); - if (strcmp(subinfo->subpasswordrequired, "t") != 0) - appendPQExpBuffer(query, ", password_required = false"); + if (pg_strcasecmp(subinfo->suborigin, LOGICALREP_ORIGIN_ANY) != 0) + appendPQExpBuffer(query, ", origin = %s", subinfo->suborigin); appendPQExpBufferStr(query, ");\n"); + /* + * In binary-upgrade mode, we allow the replication to continue after the + * upgrade. + */ + if (dopt->binary_upgrade && fout->remoteVersion >= 170000) + { + if (subinfo->suboriginremotelsn) + { + /* + * Preserve the remote_lsn for the subscriber's replication + * origin. This value is required to start the replication from + * the position before the upgrade. This value will be stale if + * the publisher gets upgraded before the subscriber node. + * However, this shouldn't be a problem as the upgrade of the + * publisher ensures that all the transactions were replicated + * before upgrading it. + */ + appendPQExpBufferStr(query, + "\n-- For binary upgrade, must preserve the remote_lsn for the subscriber's replication origin.\n"); + appendPQExpBufferStr(query, + "SELECT pg_catalog.binary_upgrade_replorigin_advance("); + appendStringLiteralAH(query, subinfo->dobj.name, fout); + appendPQExpBuffer(query, ", '%s');\n", subinfo->suboriginremotelsn); + } + + if (strcmp(subinfo->subenabled, "t") == 0) + { + /* + * Enable the subscription to allow the replication to continue + * after the upgrade. + */ + appendPQExpBufferStr(query, + "\n-- For binary upgrade, must preserve the subscriber's running state.\n"); + appendPQExpBuffer(query, "ALTER SUBSCRIPTION %s ENABLE;\n", qsubname); + } + } + if (subinfo->dobj.dump & DUMP_COMPONENT_DEFINITION) ArchiveEntry(fout, subinfo->dobj.catId, subinfo->dobj.dumpId, ARCHIVE_OPTS(.tag = subinfo->dobj.name, @@ -4864,7 +5298,7 @@ append_depends_on_extension(Archive *fout, i_extname = PQfnumber(res, "extname"); for (i = 0; i < ntups; i++) { - appendPQExpBuffer(create, "ALTER %s %s DEPENDS ON EXTENSION %s;\n", + appendPQExpBuffer(create, "\nALTER %s %s DEPENDS ON EXTENSION %s;", keyword, nm, fmtId(PQgetvalue(res, i, i_extname))); } @@ -5093,8 +5527,6 @@ binary_upgrade_set_pg_class_oids(Archive *fout, "SELECT pg_catalog.binary_upgrade_set_next_index_relfilenode('%u'::pg_catalog.oid);\n", toast_index_relfilenumber); } - - PQclear(upgrade_res); } else { @@ -5107,6 +5539,8 @@ binary_upgrade_set_pg_class_oids(Archive *fout, relfilenumber); } + PQclear(upgrade_res); + appendPQExpBufferChar(upgrade_buffer, '\n'); destroyPQExpBuffer(upgrade_query); @@ -5478,7 +5912,7 @@ getTypes(Archive *fout, int *numTypes) else tyinfo[i].isArray = false; - if (tyinfo[i].typtype == 'm') + if (tyinfo[i].typtype == TYPTYPE_MULTIRANGE) tyinfo[i].isMultirange = true; else tyinfo[i].isMultirange = false; @@ -6777,20 +7211,15 @@ getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables) seqinfo->owning_tab, seqinfo->dobj.catId.oid); /* - * Only dump identity sequences if we're going to dump the table that - * it belongs to. - */ - if (owning_tab->dobj.dump == DUMP_COMPONENT_NONE && - seqinfo->is_identity_sequence) - { - seqinfo->dobj.dump = DUMP_COMPONENT_NONE; - continue; - } - - /* - * Otherwise we need to dump the components that are being dumped for - * the table and any components which the sequence is explicitly - * marked with. + * For an identity sequence, dump exactly the same components for the + * sequence as for the owning table. This is important because we + * treat the identity sequence as an integral part of the table. For + * example, there is not any DDL command that allows creation of such + * a sequence independently of the table. + * + * For other owned sequences such as serial sequences, we need to dump + * the components that are being dumped for the table and any + * components that the sequence is explicitly marked with. * * We can't simply use the set of components which are being dumped * for the table as the table might be in an extension (and only the @@ -6803,10 +7232,17 @@ getOwnedSeqs(Archive *fout, TableInfo tblinfo[], int numTables) * marked by checkExtensionMembership() and this will be a no-op as * the table will be equivalently marked. */ - seqinfo->dobj.dump = seqinfo->dobj.dump | owning_tab->dobj.dump; + if (seqinfo->is_identity_sequence) + seqinfo->dobj.dump = owning_tab->dobj.dump; + else + seqinfo->dobj.dump |= owning_tab->dobj.dump; + /* Make sure that necessary data is available if we're dumping it */ if (seqinfo->dobj.dump != DUMP_COMPONENT_NONE) + { seqinfo->interesting = true; + owning_tab->interesting = true; + } } } @@ -7255,6 +7691,7 @@ getExtendedStatistics(Archive *fout) int i_stxname; int i_stxnamespace; int i_stxowner; + int i_stxrelid; int i_stattarget; int i; @@ -7266,11 +7703,11 @@ getExtendedStatistics(Archive *fout) if (fout->remoteVersion < 130000) appendPQExpBufferStr(query, "SELECT tableoid, oid, stxname, " - "stxnamespace, stxowner, (-1) AS stxstattarget " + "stxnamespace, stxowner, stxrelid, NULL AS stxstattarget " "FROM pg_catalog.pg_statistic_ext"); else appendPQExpBufferStr(query, "SELECT tableoid, oid, stxname, " - "stxnamespace, stxowner, stxstattarget " + "stxnamespace, stxowner, stxrelid, stxstattarget " "FROM pg_catalog.pg_statistic_ext"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -7282,6 +7719,7 @@ getExtendedStatistics(Archive *fout) i_stxname = PQfnumber(res, "stxname"); i_stxnamespace = PQfnumber(res, "stxnamespace"); i_stxowner = PQfnumber(res, "stxowner"); + i_stxrelid = PQfnumber(res, "stxrelid"); i_stattarget = PQfnumber(res, "stxstattarget"); statsextinfo = (StatsExtInfo *) pg_malloc(ntups * sizeof(StatsExtInfo)); @@ -7296,10 +7734,15 @@ getExtendedStatistics(Archive *fout) statsextinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_stxnamespace))); statsextinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_stxowner)); - statsextinfo[i].stattarget = atoi(PQgetvalue(res, i, i_stattarget)); + statsextinfo[i].stattable = + findTableByOid(atooid(PQgetvalue(res, i, i_stxrelid))); + if (PQgetisnull(res, i, i_stattarget)) + statsextinfo[i].stattarget = -1; + else + statsextinfo[i].stattarget = atoi(PQgetvalue(res, i, i_stattarget)); /* Decide whether we want to dump it */ - selectDumpableObject(&(statsextinfo[i].dobj), fout); + selectDumpableStatisticsObject(&(statsextinfo[i]), fout); } PQclear(res); @@ -7525,7 +7968,7 @@ getDomainConstraints(Archive *fout, TypeInfo *tyinfo) "pg_catalog.pg_get_constraintdef(oid) AS consrc, " "convalidated " "FROM pg_catalog.pg_constraint " - "WHERE contypid = $1 " + "WHERE contypid = $1 AND contype = 'c' " "ORDER BY conname"); ExecuteSqlStatement(fout, query->data); @@ -7709,18 +8152,8 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables) i_oid, i_tgrelid, i_tgname, - i_tgfname, - i_tgtype, - i_tgnargs, - i_tgargs, - i_tgisconstraint, - i_tgconstrname, - i_tgconstrrelid, - i_tgconstrrelname, i_tgenabled, i_tgispartition, - i_tgdeferrable, - i_tginitdeferred, i_tgdef; /* @@ -7759,7 +8192,6 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables) */ appendPQExpBuffer(query, "SELECT t.tgrelid, t.tgname, " - "t.tgfoid::pg_catalog.regproc AS tgfname, " "pg_catalog.pg_get_triggerdef(t.oid, false) AS tgdef, " "t.tgenabled, t.tableoid, t.oid, " "t.tgparentid <> 0 AS tgispartition\n" @@ -7783,7 +8215,6 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables) */ appendPQExpBuffer(query, "SELECT t.tgrelid, t.tgname, " - "t.tgfoid::pg_catalog.regproc AS tgfname, " "pg_catalog.pg_get_triggerdef(t.oid, false) AS tgdef, " "t.tgenabled, t.tableoid, t.oid, t.tgisinternal as tgispartition\n" "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n" @@ -7804,7 +8235,6 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables) */ appendPQExpBuffer(query, "SELECT t.tgrelid, t.tgname, " - "t.tgfoid::pg_catalog.regproc AS tgfname, " "pg_catalog.pg_get_triggerdef(t.oid, false) AS tgdef, " "t.tgenabled, t.tableoid, t.oid, t.tgisinternal as tgispartition " "FROM unnest('%s'::pg_catalog.oid[]) AS src(tbloid)\n" @@ -7823,7 +8253,6 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables) /* See above about pretty=true in pg_get_triggerdef */ appendPQExpBuffer(query, "SELECT t.tgrelid, t.tgname, " - "t.tgfoid::pg_catalog.regproc AS tgfname, " "pg_catalog.pg_get_triggerdef(t.oid, false) AS tgdef, " "t.tgenabled, false as tgispartition, " "t.tableoid, t.oid " @@ -7842,18 +8271,8 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables) i_oid = PQfnumber(res, "oid"); i_tgrelid = PQfnumber(res, "tgrelid"); i_tgname = PQfnumber(res, "tgname"); - i_tgfname = PQfnumber(res, "tgfname"); - i_tgtype = PQfnumber(res, "tgtype"); - i_tgnargs = PQfnumber(res, "tgnargs"); - i_tgargs = PQfnumber(res, "tgargs"); - i_tgisconstraint = PQfnumber(res, "tgisconstraint"); - i_tgconstrname = PQfnumber(res, "tgconstrname"); - i_tgconstrrelid = PQfnumber(res, "tgconstrrelid"); - i_tgconstrrelname = PQfnumber(res, "tgconstrrelname"); i_tgenabled = PQfnumber(res, "tgenabled"); i_tgispartition = PQfnumber(res, "tgispartition"); - i_tgdeferrable = PQfnumber(res, "tgdeferrable"); - i_tginitdeferred = PQfnumber(res, "tginitdeferred"); i_tgdef = PQfnumber(res, "tgdef"); tginfo = (TriggerInfo *) pg_malloc(ntups * sizeof(TriggerInfo)); @@ -7902,57 +8321,7 @@ getTriggers(Archive *fout, TableInfo tblinfo[], int numTables) tginfo[j].tgtable = tbinfo; tginfo[j].tgenabled = *(PQgetvalue(res, j, i_tgenabled)); tginfo[j].tgispartition = *(PQgetvalue(res, j, i_tgispartition)) == 't'; - if (i_tgdef >= 0) - { - tginfo[j].tgdef = pg_strdup(PQgetvalue(res, j, i_tgdef)); - - /* remaining fields are not valid if we have tgdef */ - tginfo[j].tgfname = NULL; - tginfo[j].tgtype = 0; - tginfo[j].tgnargs = 0; - tginfo[j].tgargs = NULL; - tginfo[j].tgisconstraint = false; - tginfo[j].tgdeferrable = false; - tginfo[j].tginitdeferred = false; - tginfo[j].tgconstrname = NULL; - tginfo[j].tgconstrrelid = InvalidOid; - tginfo[j].tgconstrrelname = NULL; - } - else - { - tginfo[j].tgdef = NULL; - - tginfo[j].tgfname = pg_strdup(PQgetvalue(res, j, i_tgfname)); - tginfo[j].tgtype = atoi(PQgetvalue(res, j, i_tgtype)); - tginfo[j].tgnargs = atoi(PQgetvalue(res, j, i_tgnargs)); - tginfo[j].tgargs = pg_strdup(PQgetvalue(res, j, i_tgargs)); - tginfo[j].tgisconstraint = *(PQgetvalue(res, j, i_tgisconstraint)) == 't'; - tginfo[j].tgdeferrable = *(PQgetvalue(res, j, i_tgdeferrable)) == 't'; - tginfo[j].tginitdeferred = *(PQgetvalue(res, j, i_tginitdeferred)) == 't'; - - if (tginfo[j].tgisconstraint) - { - tginfo[j].tgconstrname = pg_strdup(PQgetvalue(res, j, i_tgconstrname)); - tginfo[j].tgconstrrelid = atooid(PQgetvalue(res, j, i_tgconstrrelid)); - if (OidIsValid(tginfo[j].tgconstrrelid)) - { - if (PQgetisnull(res, j, i_tgconstrrelname)) - pg_fatal("query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)", - tginfo[j].dobj.name, - tbinfo->dobj.name, - tginfo[j].tgconstrrelid); - tginfo[j].tgconstrrelname = pg_strdup(PQgetvalue(res, j, i_tgconstrrelname)); - } - else - tginfo[j].tgconstrrelname = NULL; - } - else - { - tginfo[j].tgconstrname = NULL; - tginfo[j].tgconstrrelid = InvalidOid; - tginfo[j].tgconstrrelname = NULL; - } - } + tginfo[j].tgdef = pg_strdup(PQgetvalue(res, j, i_tgdef)); } } @@ -8586,7 +8955,10 @@ getTableAttrs(Archive *fout, TableInfo *tblinfo, int numTables) tbinfo->dobj.name); tbinfo->attnames[j] = pg_strdup(PQgetvalue(res, r, i_attname)); tbinfo->atttypnames[j] = pg_strdup(PQgetvalue(res, r, i_atttypname)); - tbinfo->attstattarget[j] = atoi(PQgetvalue(res, r, i_attstattarget)); + if (PQgetisnull(res, r, i_attstattarget)) + tbinfo->attstattarget[j] = -1; + else + tbinfo->attstattarget[j] = atoi(PQgetvalue(res, r, i_attstattarget)); tbinfo->attstorage[j] = *(PQgetvalue(res, r, i_attstorage)); tbinfo->typstorage[j] = *(PQgetvalue(res, r, i_typstorage)); tbinfo->attidentity[j] = *(PQgetvalue(res, r, i_attidentity)); @@ -10197,28 +10569,34 @@ dumpDumpableObject(Archive *fout, DumpableObject *dobj) case DO_LARGE_OBJECT_DATA: if (dobj->dump & DUMP_COMPONENT_DATA) { + LoInfo *loinfo; TocEntry *te; + loinfo = (LoInfo *) findObjectByDumpId(dobj->dependencies[0]); + if (loinfo == NULL) + pg_fatal("missing metadata for large objects \"%s\"", + dobj->name); + te = ArchiveEntry(fout, dobj->catId, dobj->dumpId, ARCHIVE_OPTS(.tag = dobj->name, + .owner = loinfo->rolname, .description = "BLOBS", .section = SECTION_DATA, - .dumpFn = dumpLOs)); + .deps = dobj->dependencies, + .nDeps = dobj->nDeps, + .dumpFn = dumpLOs, + .dumpArg = loinfo)); /* * Set the TocEntry's dataLength in case we are doing a * parallel dump and want to order dump jobs by table size. * (We need some size estimate for every TocEntry with a * DataDumper function.) We don't currently have any cheap - * way to estimate the size of LOs, but it doesn't matter; - * let's just set the size to a large value so parallel dumps - * will launch this job first. If there's lots of LOs, we - * win, and if there aren't, we don't lose much. (If you want - * to improve on this, really what you should be thinking - * about is allowing LO dumping to be parallelized, not just - * getting a smarter estimate for the single TOC entry.) + * way to estimate the size of LOs, but fortunately it doesn't + * matter too much as long as we get large batches of LOs + * processed reasonably early. Assume 8K per blob. */ - te->dataLength = INT_MAX; + te->dataLength = loinfo->numlos * (pgoff_t) 8192; } break; case DO_POLICY: @@ -10237,6 +10615,9 @@ dumpDumpableObject(Archive *fout, DumpableObject *dobj) case DO_SUBSCRIPTION: dumpSubscription(fout, (const SubscriptionInfo *) dobj); break; + case DO_SUBSCRIPTION_REL: + dumpSubscriptionTable(fout, (const SubRelInfo *) dobj); + break; case DO_PRE_DATA_BOUNDARY: case DO_POST_DATA_BOUNDARY: /* never dumped, nothing to do */ @@ -10313,7 +10694,7 @@ dumpNamespace(Archive *fout, const NamespaceInfo *nspinfo) if (nspinfo->dobj.dump & DUMP_COMPONENT_ACL) dumpACL(fout, nspinfo->dobj.dumpId, InvalidDumpId, "SCHEMA", qnspname, NULL, NULL, - nspinfo->rolname, &nspinfo->dacl); + NULL, nspinfo->rolname, &nspinfo->dacl); free(qnspname); @@ -10610,7 +10991,7 @@ dumpEnumType(Archive *fout, const TypeInfo *tyinfo) dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE", qtypname, NULL, tyinfo->dobj.namespace->dobj.name, - tyinfo->rolname, &tyinfo->dacl); + NULL, tyinfo->rolname, &tyinfo->dacl); PQclear(res); destroyPQExpBuffer(q); @@ -10763,7 +11144,7 @@ dumpRangeType(Archive *fout, const TypeInfo *tyinfo) dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE", qtypname, NULL, tyinfo->dobj.namespace->dobj.name, - tyinfo->rolname, &tyinfo->dacl); + NULL, tyinfo->rolname, &tyinfo->dacl); PQclear(res); destroyPQExpBuffer(q); @@ -10834,7 +11215,7 @@ dumpUndefinedType(Archive *fout, const TypeInfo *tyinfo) dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE", qtypname, NULL, tyinfo->dobj.namespace->dobj.name, - tyinfo->rolname, &tyinfo->dacl); + NULL, tyinfo->rolname, &tyinfo->dacl); destroyPQExpBuffer(q); destroyPQExpBuffer(delq); @@ -11081,7 +11462,7 @@ dumpBaseType(Archive *fout, const TypeInfo *tyinfo) dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE", qtypname, NULL, tyinfo->dobj.namespace->dobj.name, - tyinfo->rolname, &tyinfo->dacl); + NULL, tyinfo->rolname, &tyinfo->dacl); PQclear(res); destroyPQExpBuffer(q); @@ -11236,7 +11617,7 @@ dumpDomain(Archive *fout, const TypeInfo *tyinfo) dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE", qtypname, NULL, tyinfo->dobj.namespace->dobj.name, - tyinfo->rolname, &tyinfo->dacl); + NULL, tyinfo->rolname, &tyinfo->dacl); /* Dump any per-constraint comments */ for (i = 0; i < tyinfo->nDomChecks; i++) @@ -11450,7 +11831,7 @@ dumpCompositeType(Archive *fout, const TypeInfo *tyinfo) dumpACL(fout, tyinfo->dobj.dumpId, InvalidDumpId, "TYPE", qtypname, NULL, tyinfo->dobj.namespace->dobj.name, - tyinfo->rolname, &tyinfo->dacl); + NULL, tyinfo->rolname, &tyinfo->dacl); /* Dump any per-column comments */ if (tyinfo->dobj.dump & DUMP_COMPONENT_COMMENT) @@ -11726,7 +12107,7 @@ dumpProcLang(Archive *fout, const ProcLangInfo *plang) if (plang->lanpltrusted && plang->dobj.dump & DUMP_COMPONENT_ACL) dumpACL(fout, plang->dobj.dumpId, InvalidDumpId, "LANGUAGE", qlanname, NULL, NULL, - plang->lanowner, &plang->dacl); + NULL, plang->lanowner, &plang->dacl); free(qlanname); @@ -12190,7 +12571,7 @@ dumpFunc(Archive *fout, const FuncInfo *finfo) dumpACL(fout, finfo->dobj.dumpId, InvalidDumpId, keyword, funcsig, NULL, finfo->dobj.namespace->dobj.name, - finfo->rolname, &finfo->dacl); + NULL, finfo->rolname, &finfo->dacl); PQclear(res); @@ -13336,12 +13717,12 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) int i_collisdeterministic; int i_collcollate; int i_collctype; - int i_colliculocale; + int i_colllocale; int i_collicurules; const char *collprovider; const char *collcollate; const char *collctype; - const char *colliculocale; + const char *colllocale; const char *collicurules; /* Do nothing in data-only dump */ @@ -13373,12 +13754,15 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) appendPQExpBufferStr(query, "true AS collisdeterministic, "); - if (fout->remoteVersion >= 150000) + if (fout->remoteVersion >= 170000) appendPQExpBufferStr(query, - "colliculocale, "); + "colllocale, "); + else if (fout->remoteVersion >= 150000) + appendPQExpBufferStr(query, + "colliculocale AS colllocale, "); else appendPQExpBufferStr(query, - "NULL AS colliculocale, "); + "NULL AS colllocale, "); if (fout->remoteVersion >= 160000) appendPQExpBufferStr(query, @@ -13400,7 +13784,7 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) i_collisdeterministic = PQfnumber(res, "collisdeterministic"); i_collcollate = PQfnumber(res, "collcollate"); i_collctype = PQfnumber(res, "collctype"); - i_colliculocale = PQfnumber(res, "colliculocale"); + i_colllocale = PQfnumber(res, "colllocale"); i_collicurules = PQfnumber(res, "collicurules"); collprovider = PQgetvalue(res, 0, i_collprovider); @@ -13415,10 +13799,22 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) else collctype = NULL; - if (!PQgetisnull(res, 0, i_colliculocale)) - colliculocale = PQgetvalue(res, 0, i_colliculocale); + /* + * Before version 15, collcollate and collctype were of type NAME and + * non-nullable. Treat empty strings as NULL for consistency. + */ + if (fout->remoteVersion < 150000) + { + if (collcollate[0] == '\0') + collcollate = NULL; + if (collctype[0] == '\0') + collctype = NULL; + } + + if (!PQgetisnull(res, 0, i_colllocale)) + colllocale = PQgetvalue(res, 0, i_colllocale); else - colliculocale = NULL; + colllocale = NULL; if (!PQgetisnull(res, 0, i_collicurules)) collicurules = PQgetvalue(res, 0, i_collicurules); @@ -13432,7 +13828,9 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) fmtQualifiedDumpable(collinfo)); appendPQExpBufferStr(q, "provider = "); - if (collprovider[0] == 'c') + if (collprovider[0] == 'b') + appendPQExpBufferStr(q, "builtin"); + else if (collprovider[0] == 'c') appendPQExpBufferStr(q, "libc"); else if (collprovider[0] == 'i') appendPQExpBufferStr(q, "icu"); @@ -13446,35 +13844,69 @@ dumpCollation(Archive *fout, const CollInfo *collinfo) if (strcmp(PQgetvalue(res, 0, i_collisdeterministic), "f") == 0) appendPQExpBufferStr(q, ", deterministic = false"); - if (colliculocale != NULL) + if (collprovider[0] == 'd') { + if (collcollate || collctype || colllocale || collicurules) + pg_log_warning("invalid collation \"%s\"", qcollname); + + /* no locale -- the default collation cannot be reloaded anyway */ + } + else if (collprovider[0] == 'b') + { + if (collcollate || collctype || !colllocale || collicurules) + pg_log_warning("invalid collation \"%s\"", qcollname); + appendPQExpBufferStr(q, ", locale = "); - appendStringLiteralAH(q, colliculocale, fout); + appendStringLiteralAH(q, colllocale ? colllocale : "", + fout); } - else + else if (collprovider[0] == 'i') + { + if (fout->remoteVersion >= 150000) + { + if (collcollate || collctype || !colllocale) + pg_log_warning("invalid collation \"%s\"", qcollname); + + appendPQExpBufferStr(q, ", locale = "); + appendStringLiteralAH(q, colllocale ? colllocale : "", + fout); + } + else + { + if (!collcollate || !collctype || colllocale || + strcmp(collcollate, collctype) != 0) + pg_log_warning("invalid collation \"%s\"", qcollname); + + appendPQExpBufferStr(q, ", locale = "); + appendStringLiteralAH(q, collcollate ? collcollate : "", fout); + } + + if (collicurules) + { + appendPQExpBufferStr(q, ", rules = "); + appendStringLiteralAH(q, collicurules ? collicurules : "", fout); + } + } + else if (collprovider[0] == 'c') { - Assert(collcollate != NULL); - Assert(collctype != NULL); + if (colllocale || collicurules || !collcollate || !collctype) + pg_log_warning("invalid collation \"%s\"", qcollname); - if (strcmp(collcollate, collctype) == 0) + if (collcollate && collctype && strcmp(collcollate, collctype) == 0) { appendPQExpBufferStr(q, ", locale = "); - appendStringLiteralAH(q, collcollate, fout); + appendStringLiteralAH(q, collcollate ? collcollate : "", fout); } else { appendPQExpBufferStr(q, ", lc_collate = "); - appendStringLiteralAH(q, collcollate, fout); + appendStringLiteralAH(q, collcollate ? collcollate : "", fout); appendPQExpBufferStr(q, ", lc_ctype = "); - appendStringLiteralAH(q, collctype, fout); + appendStringLiteralAH(q, collctype ? collctype : "", fout); } } - - if (collicurules) - { - appendPQExpBufferStr(q, ", rules = "); - appendStringLiteralAH(q, collicurules, fout); - } + else + pg_fatal("unrecognized collation provider: %s", collprovider); /* * For binary upgrade, carry over the collation version. For normal @@ -13999,7 +14431,7 @@ dumpAgg(Archive *fout, const AggInfo *agginfo) dumpACL(fout, agginfo->aggfn.dobj.dumpId, InvalidDumpId, "FUNCTION", aggsig, NULL, agginfo->aggfn.dobj.namespace->dobj.name, - agginfo->aggfn.rolname, &agginfo->aggfn.dacl); + NULL, agginfo->aggfn.rolname, &agginfo->aggfn.dacl); free(aggsig); free(aggfullsig); @@ -14396,7 +14828,7 @@ dumpForeignDataWrapper(Archive *fout, const FdwInfo *fdwinfo) /* Handle the ACL */ if (fdwinfo->dobj.dump & DUMP_COMPONENT_ACL) dumpACL(fout, fdwinfo->dobj.dumpId, InvalidDumpId, - "FOREIGN DATA WRAPPER", qfdwname, NULL, + "FOREIGN DATA WRAPPER", qfdwname, NULL, NULL, NULL, fdwinfo->rolname, &fdwinfo->dacl); free(qfdwname); @@ -14483,7 +14915,7 @@ dumpForeignServer(Archive *fout, const ForeignServerInfo *srvinfo) /* Handle the ACL */ if (srvinfo->dobj.dump & DUMP_COMPONENT_ACL) dumpACL(fout, srvinfo->dobj.dumpId, InvalidDumpId, - "FOREIGN SERVER", qsrvname, NULL, + "FOREIGN SERVER", qsrvname, NULL, NULL, NULL, srvinfo->rolname, &srvinfo->dacl); /* Dump user mappings */ @@ -14683,8 +15115,10 @@ dumpDefaultACL(Archive *fout, const DefaultACLInfo *daclinfo) * 'subname' is the formatted name of the sub-object, if any. Must be quoted. * (Currently we assume that subname is only provided for table columns.) * 'nspname' is the namespace the object is in (NULL if none). + * 'tag' is the tag to use for the ACL TOC entry; typically, this is NULL + * to use the default for the object type. * 'owner' is the owner, NULL if there is no owner (for languages). - * 'dacl' is the DumpableAcl struct fpr the object. + * 'dacl' is the DumpableAcl struct for the object. * * Returns the dump ID assigned to the ACL TocEntry, or InvalidDumpId if * no ACL entry was created. @@ -14693,7 +15127,7 @@ dumpDefaultACL(Archive *fout, const DefaultACLInfo *daclinfo) static DumpId dumpACL(Archive *fout, DumpId objDumpId, DumpId altDumpId, const char *type, const char *name, const char *subname, - const char *nspname, const char *owner, + const char *nspname, const char *tag, const char *owner, const DumpableAcl *dacl) { DumpId aclDumpId = InvalidDumpId; @@ -14765,14 +15199,16 @@ dumpACL(Archive *fout, DumpId objDumpId, DumpId altDumpId, if (sql->len > 0) { - PQExpBuffer tag = createPQExpBuffer(); + PQExpBuffer tagbuf = createPQExpBuffer(); DumpId aclDeps[2]; int nDeps = 0; - if (subname) - appendPQExpBuffer(tag, "COLUMN %s.%s", name, subname); + if (tag) + appendPQExpBufferStr(tagbuf, tag); + else if (subname) + appendPQExpBuffer(tagbuf, "COLUMN %s.%s", name, subname); else - appendPQExpBuffer(tag, "%s %s", type, name); + appendPQExpBuffer(tagbuf, "%s %s", type, name); aclDeps[nDeps++] = objDumpId; if (altDumpId != InvalidDumpId) @@ -14781,7 +15217,7 @@ dumpACL(Archive *fout, DumpId objDumpId, DumpId altDumpId, aclDumpId = createDumpId(); ArchiveEntry(fout, nilCatalogId, aclDumpId, - ARCHIVE_OPTS(.tag = tag->data, + ARCHIVE_OPTS(.tag = tagbuf->data, .namespace = nspname, .owner = owner, .description = "ACL", @@ -14790,7 +15226,7 @@ dumpACL(Archive *fout, DumpId objDumpId, DumpId altDumpId, .deps = aclDeps, .nDeps = nDeps)); - destroyPQExpBuffer(tag); + destroyPQExpBuffer(tagbuf); } destroyPQExpBuffer(sql); @@ -15172,8 +15608,8 @@ dumpTable(Archive *fout, const TableInfo *tbinfo) tableAclDumpId = dumpACL(fout, tbinfo->dobj.dumpId, InvalidDumpId, objtype, namecopy, NULL, - tbinfo->dobj.namespace->dobj.name, tbinfo->rolname, - &tbinfo->dacl); + tbinfo->dobj.namespace->dobj.name, + NULL, tbinfo->rolname, &tbinfo->dacl); } /* @@ -15266,8 +15702,8 @@ dumpTable(Archive *fout, const TableInfo *tbinfo) */ dumpACL(fout, tbinfo->dobj.dumpId, tableAclDumpId, "TABLE", namecopy, attnamecopy, - tbinfo->dobj.namespace->dobj.name, tbinfo->rolname, - &coldacl); + tbinfo->dobj.namespace->dobj.name, + NULL, tbinfo->rolname, &coldacl); free(attnamecopy); } PQclear(res); @@ -15378,6 +15814,7 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo) DumpOptions *dopt = fout->dopt; PQExpBuffer q = createPQExpBuffer(); PQExpBuffer delq = createPQExpBuffer(); + PQExpBuffer extra = createPQExpBuffer(); char *qrelname; char *qualrelname; int numParents; @@ -15444,7 +15881,7 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo) char *partkeydef = NULL; char *ftoptions = NULL; char *srvname = NULL; - char *foreign = ""; + const char *foreign = ""; /* * Set reltypename, and collect any relkind-specific data that we @@ -15802,51 +16239,98 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo) tbinfo->relkind == RELKIND_FOREIGN_TABLE || tbinfo->relkind == RELKIND_PARTITIONED_TABLE)) { + bool firstitem; + + /* + * Drop any dropped columns. Merge the pg_attribute manipulations + * into a single SQL command, so that we don't cause repeated + * relcache flushes on the target table. Otherwise we risk O(N^2) + * relcache bloat while dropping N columns. + */ + resetPQExpBuffer(extra); + firstitem = true; for (j = 0; j < tbinfo->numatts; j++) { if (tbinfo->attisdropped[j]) { - appendPQExpBufferStr(q, "\n-- For binary upgrade, recreate dropped column.\n"); - appendPQExpBuffer(q, "UPDATE pg_catalog.pg_attribute\n" - "SET attlen = %d, " - "attalign = '%c', attbyval = false\n" - "WHERE attname = ", + if (firstitem) + { + appendPQExpBufferStr(q, "\n-- For binary upgrade, recreate dropped columns.\n" + "UPDATE pg_catalog.pg_attribute\n" + "SET attlen = v.dlen, " + "attalign = v.dalign, " + "attbyval = false\n" + "FROM (VALUES "); + firstitem = false; + } + else + appendPQExpBufferStr(q, ",\n "); + appendPQExpBufferChar(q, '('); + appendStringLiteralAH(q, tbinfo->attnames[j], fout); + appendPQExpBuffer(q, ", %d, '%c')", tbinfo->attlen[j], tbinfo->attalign[j]); - appendStringLiteralAH(q, tbinfo->attnames[j], fout); - appendPQExpBufferStr(q, "\n AND attrelid = "); - appendStringLiteralAH(q, qualrelname, fout); - appendPQExpBufferStr(q, "::pg_catalog.regclass;\n"); - - if (tbinfo->relkind == RELKIND_RELATION || - tbinfo->relkind == RELKIND_PARTITIONED_TABLE) - appendPQExpBuffer(q, "ALTER TABLE ONLY %s ", - qualrelname); - else - appendPQExpBuffer(q, "ALTER FOREIGN TABLE ONLY %s ", - qualrelname); - appendPQExpBuffer(q, "DROP COLUMN %s;\n", + /* The ALTER ... DROP COLUMN commands must come after */ + appendPQExpBuffer(extra, "ALTER %sTABLE ONLY %s ", + foreign, qualrelname); + appendPQExpBuffer(extra, "DROP COLUMN %s;\n", fmtId(tbinfo->attnames[j])); } - else if (!tbinfo->attislocal[j]) + } + if (!firstitem) + { + appendPQExpBufferStr(q, ") v(dname, dlen, dalign)\n" + "WHERE attrelid = "); + appendStringLiteralAH(q, qualrelname, fout); + appendPQExpBufferStr(q, "::pg_catalog.regclass\n" + " AND attname = v.dname;\n"); + /* Now we can issue the actual DROP COLUMN commands */ + appendBinaryPQExpBuffer(q, extra->data, extra->len); + } + + /* + * Fix up inherited columns. As above, do the pg_attribute + * manipulations in a single SQL command. + */ + firstitem = true; + for (j = 0; j < tbinfo->numatts; j++) + { + if (!tbinfo->attisdropped[j] && + !tbinfo->attislocal[j]) { - appendPQExpBufferStr(q, "\n-- For binary upgrade, recreate inherited column.\n"); - appendPQExpBufferStr(q, "UPDATE pg_catalog.pg_attribute\n" - "SET attislocal = false\n" - "WHERE attname = "); + if (firstitem) + { + appendPQExpBufferStr(q, "\n-- For binary upgrade, recreate inherited columns.\n"); + appendPQExpBufferStr(q, "UPDATE pg_catalog.pg_attribute\n" + "SET attislocal = false\n" + "WHERE attrelid = "); + appendStringLiteralAH(q, qualrelname, fout); + appendPQExpBufferStr(q, "::pg_catalog.regclass\n" + " AND attname IN ("); + firstitem = false; + } + else + appendPQExpBufferStr(q, ", "); appendStringLiteralAH(q, tbinfo->attnames[j], fout); - appendPQExpBufferStr(q, "\n AND attrelid = "); - appendStringLiteralAH(q, qualrelname, fout); - appendPQExpBufferStr(q, "::pg_catalog.regclass;\n"); } } + if (!firstitem) + appendPQExpBufferStr(q, ");\n"); /* * Add inherited CHECK constraints, if any. * * For partitions, they were already dumped, and conislocal * doesn't need fixing. + * + * As above, issue only one direct manipulation of pg_constraint. + * Although it is tempting to merge the ALTER ADD CONSTRAINT + * commands into one as well, refrain for now due to concern about + * possible backend memory bloat if there are many such + * constraints. */ + resetPQExpBuffer(extra); + firstitem = true; for (k = 0; k < tbinfo->ncheck; k++) { ConstraintInfo *constr = &(tbinfo->checkexprs[k]); @@ -15854,18 +16338,31 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo) if (constr->separate || constr->conislocal || tbinfo->ispartition) continue; - appendPQExpBufferStr(q, "\n-- For binary upgrade, set up inherited constraint.\n"); + if (firstitem) + appendPQExpBufferStr(q, "\n-- For binary upgrade, set up inherited constraints.\n"); appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ADD CONSTRAINT %s %s;\n", foreign, qualrelname, fmtId(constr->dobj.name), constr->condef); - appendPQExpBufferStr(q, "UPDATE pg_catalog.pg_constraint\n" - "SET conislocal = false\n" - "WHERE contype = 'c' AND conname = "); - appendStringLiteralAH(q, constr->dobj.name, fout); - appendPQExpBufferStr(q, "\n AND conrelid = "); - appendStringLiteralAH(q, qualrelname, fout); - appendPQExpBufferStr(q, "::pg_catalog.regclass;\n"); + /* Update pg_constraint after all the ALTER TABLEs */ + if (firstitem) + { + appendPQExpBufferStr(extra, "UPDATE pg_catalog.pg_constraint\n" + "SET conislocal = false\n" + "WHERE contype = 'c' AND conrelid = "); + appendStringLiteralAH(extra, qualrelname, fout); + appendPQExpBufferStr(extra, "::pg_catalog.regclass\n"); + appendPQExpBufferStr(extra, " AND conname IN ("); + firstitem = false; + } + else + appendPQExpBufferStr(extra, ", "); + appendStringLiteralAH(extra, constr->dobj.name, fout); + } + if (!firstitem) + { + appendPQExpBufferStr(extra, ");\n"); + appendBinaryPQExpBuffer(q, extra->data, extra->len); } if (numParents > 0 && !tbinfo->ispartition) @@ -15955,7 +16452,7 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo) /* * If we didn't dump the column definition explicitly above, and - * it is NOT NULL and did not inherit that property from a parent, + * it is not-null and did not inherit that property from a parent, * we have to mark it separately. */ if (!shouldPrintColumn(dopt, tbinfo, j) && @@ -15968,7 +16465,7 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo) /* * Dump per-column statistics information. We only issue an ALTER * TABLE statement if the attstattarget entry for this column is - * non-negative (i.e. it's not the default value) + * not the default value. */ if (tbinfo->attstattarget[j] >= 0) appendPQExpBuffer(q, "ALTER %sTABLE ONLY %s ALTER COLUMN %s SET STATISTICS %d;\n", @@ -16052,7 +16549,7 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo) if (tbinfo->relkind == RELKIND_FOREIGN_TABLE && tbinfo->attfdwoptions[j][0] != '\0') appendPQExpBuffer(q, - "ALTER FOREIGN TABLE %s ALTER COLUMN %s OPTIONS (\n" + "ALTER FOREIGN TABLE ONLY %s ALTER COLUMN %s OPTIONS (\n" " %s\n" ");\n", qualrelname, @@ -16113,7 +16610,8 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo) if (RELKIND_HAS_TABLESPACE(tbinfo->relkind)) tablespace = tbinfo->reltablespace; - if (RELKIND_HAS_TABLE_AM(tbinfo->relkind)) + if (RELKIND_HAS_TABLE_AM(tbinfo->relkind) || + tbinfo->relkind == RELKIND_PARTITIONED_TABLE) tableam = tbinfo->amname; ArchiveEntry(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId, @@ -16121,6 +16619,7 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo) .namespace = tbinfo->dobj.namespace->dobj.name, .tablespace = tablespace, .tableam = tableam, + .relkind = tbinfo->relkind, .owner = tbinfo->rolname, .description = reltypename, .section = tbinfo->postponed_def ? @@ -16151,6 +16650,7 @@ dumpTableSchema(Archive *fout, const TableInfo *tbinfo) destroyPQExpBuffer(q); destroyPQExpBuffer(delq); + destroyPQExpBuffer(extra); free(qrelname); free(qualrelname); } @@ -16433,7 +16933,17 @@ dumpIndex(Archive *fout, const IndxInfo *indxinfo) qindxname); } - appendPQExpBuffer(delq, "DROP INDEX %s;\n", qqindxname); + /* + * If this index is a member of a partitioned index, the backend will + * not allow us to drop it separately, so don't try. It will go away + * automatically when we drop either the index's table or the + * partitioned index. (If, in a selective restore with --clean, we + * drop neither of those, then this index will not be dropped either. + * But that's fine, and even if you think it's not, the backend won't + * let us do differently.) + */ + if (indxinfo->parentidx == 0) + appendPQExpBuffer(delq, "DROP INDEX %s;\n", qqindxname); if (indxinfo->dobj.dump & DUMP_COMPONENT_DEFINITION) ArchiveEntry(fout, indxinfo->dobj.catId, indxinfo->dobj.dumpId, @@ -16486,11 +16996,15 @@ dumpIndexAttach(Archive *fout, const IndexAttachInfo *attachinfo) fmtQualifiedDumpable(attachinfo->partitionIdx)); /* - * There is no point in creating a drop query as the drop is done by - * index drop. (If you think to change this, see also - * _printTocEntry().) Although this object doesn't really have - * ownership as such, set the owner field anyway to ensure that the - * command is run by the correct role at restore time. + * There is no need for a dropStmt since the drop is done implicitly + * when we drop either the index's table or the partitioned index. + * Moreover, since there's no ALTER INDEX DETACH PARTITION command, + * there's no way to do it anyway. (If you think to change this, + * consider also what to do with --if-exists.) + * + * Although this object doesn't really have ownership as such, set the + * owner field anyway to ensure that the command is run by the correct + * role at restore time. */ ArchiveEntry(fout, attachinfo->dobj.catId, attachinfo->dobj.dumpId, ARCHIVE_OPTS(.tag = attachinfo->dobj.name, @@ -16542,8 +17056,7 @@ dumpStatisticsExt(Archive *fout, const StatsExtInfo *statsextinfo) /* * We only issue an ALTER STATISTICS statement if the stxstattarget entry - * for this statistics object is non-negative (i.e. it's not the default - * value). + * for this statistics object is not the default value. */ if (statsextinfo->stattarget >= 0) { @@ -17040,6 +17553,15 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo) appendPQExpBufferStr(query, "BY DEFAULT"); appendPQExpBuffer(query, " AS IDENTITY (\n SEQUENCE NAME %s\n", fmtQualifiedDumpable(tbinfo)); + + /* + * Emit persistence option only if it's different from the owning + * table's. This avoids using this new syntax unnecessarily. + */ + if (tbinfo->relpersistence != owning_tab->relpersistence) + appendPQExpBuffer(query, " %s\n", + tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED ? + "UNLOGGED" : "LOGGED"); } else { @@ -17072,15 +17594,7 @@ dumpSequence(Archive *fout, const TableInfo *tbinfo) cache, (cycled ? "\n CYCLE" : "")); if (tbinfo->is_identity_sequence) - { appendPQExpBufferStr(query, "\n);\n"); - if (tbinfo->relpersistence != owning_tab->relpersistence) - appendPQExpBuffer(query, - "ALTER SEQUENCE %s SET %s;\n", - fmtQualifiedDumpable(tbinfo), - tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED ? - "UNLOGGED" : "LOGGED"); - } else appendPQExpBufferStr(query, ";\n"); @@ -17226,10 +17740,6 @@ dumpTrigger(Archive *fout, const TriggerInfo *tginfo) PQExpBuffer trigprefix; PQExpBuffer trigidentity; char *qtabname; - char *tgargs; - size_t lentgargs; - const char *p; - int findx; char *tag; /* Do nothing in data-only dump */ @@ -17246,121 +17756,9 @@ dumpTrigger(Archive *fout, const TriggerInfo *tginfo) appendPQExpBuffer(trigidentity, "%s ", fmtId(tginfo->dobj.name)); appendPQExpBuffer(trigidentity, "ON %s", fmtQualifiedDumpable(tbinfo)); + appendPQExpBuffer(query, "%s;\n", tginfo->tgdef); appendPQExpBuffer(delqry, "DROP TRIGGER %s;\n", trigidentity->data); - if (tginfo->tgdef) - { - appendPQExpBuffer(query, "%s;\n", tginfo->tgdef); - } - else - { - if (tginfo->tgisconstraint) - { - appendPQExpBufferStr(query, "CREATE CONSTRAINT TRIGGER "); - appendPQExpBufferStr(query, fmtId(tginfo->tgconstrname)); - } - else - { - appendPQExpBufferStr(query, "CREATE TRIGGER "); - appendPQExpBufferStr(query, fmtId(tginfo->dobj.name)); - } - appendPQExpBufferStr(query, "\n "); - - /* Trigger type */ - if (TRIGGER_FOR_BEFORE(tginfo->tgtype)) - appendPQExpBufferStr(query, "BEFORE"); - else if (TRIGGER_FOR_AFTER(tginfo->tgtype)) - appendPQExpBufferStr(query, "AFTER"); - else if (TRIGGER_FOR_INSTEAD(tginfo->tgtype)) - appendPQExpBufferStr(query, "INSTEAD OF"); - else - pg_fatal("unexpected tgtype value: %d", tginfo->tgtype); - - findx = 0; - if (TRIGGER_FOR_INSERT(tginfo->tgtype)) - { - appendPQExpBufferStr(query, " INSERT"); - findx++; - } - if (TRIGGER_FOR_DELETE(tginfo->tgtype)) - { - if (findx > 0) - appendPQExpBufferStr(query, " OR DELETE"); - else - appendPQExpBufferStr(query, " DELETE"); - findx++; - } - if (TRIGGER_FOR_UPDATE(tginfo->tgtype)) - { - if (findx > 0) - appendPQExpBufferStr(query, " OR UPDATE"); - else - appendPQExpBufferStr(query, " UPDATE"); - findx++; - } - if (TRIGGER_FOR_TRUNCATE(tginfo->tgtype)) - { - if (findx > 0) - appendPQExpBufferStr(query, " OR TRUNCATE"); - else - appendPQExpBufferStr(query, " TRUNCATE"); - findx++; - } - appendPQExpBuffer(query, " ON %s\n", - fmtQualifiedDumpable(tbinfo)); - - if (tginfo->tgisconstraint) - { - if (OidIsValid(tginfo->tgconstrrelid)) - { - /* regclass output is already quoted */ - appendPQExpBuffer(query, " FROM %s\n ", - tginfo->tgconstrrelname); - } - if (!tginfo->tgdeferrable) - appendPQExpBufferStr(query, "NOT "); - appendPQExpBufferStr(query, "DEFERRABLE INITIALLY "); - if (tginfo->tginitdeferred) - appendPQExpBufferStr(query, "DEFERRED\n"); - else - appendPQExpBufferStr(query, "IMMEDIATE\n"); - } - - if (TRIGGER_FOR_ROW(tginfo->tgtype)) - appendPQExpBufferStr(query, " FOR EACH ROW\n "); - else - appendPQExpBufferStr(query, " FOR EACH STATEMENT\n "); - - /* regproc output is already sufficiently quoted */ - appendPQExpBuffer(query, "EXECUTE FUNCTION %s(", - tginfo->tgfname); - - tgargs = (char *) PQunescapeBytea((unsigned char *) tginfo->tgargs, - &lentgargs); - p = tgargs; - for (findx = 0; findx < tginfo->tgnargs; findx++) - { - /* find the embedded null that terminates this trigger argument */ - size_t tlen = strlen(p); - - if (p + tlen >= tgargs + lentgargs) - { - /* hm, not found before end of bytea value... */ - pg_fatal("invalid argument string (%s) for trigger \"%s\" on table \"%s\"", - tginfo->tgargs, - tginfo->dobj.name, - tbinfo->dobj.name); - } - - if (findx > 0) - appendPQExpBufferStr(query, ", "); - appendStringLiteralAH(query, p, fout); - p += tlen + 1; - } - free(tgargs); - appendPQExpBufferStr(query, ");\n"); - } - /* Triggers can depend on extensions */ append_depends_on_extension(fout, query, &tginfo->dobj, "pg_catalog.pg_trigger", "TRIGGER", @@ -17849,6 +18247,15 @@ processExtensionTables(Archive *fout, ExtensionInfo extinfo[], curext->dobj.catId.oid)) continue; + /* + * Check if this extension is listed as to exclude in the dump. If + * yes, any table data associated with it is discarded. + */ + if (extension_exclude_oids.head != NULL && + simple_oid_list_member(&extension_exclude_oids, + curext->dobj.catId.oid)) + continue; + if (strlen(extconfig) != 0 || strlen(extcondition) != 0) { int j; @@ -18195,12 +18602,12 @@ addBoundaryDependencies(DumpableObject **dobjs, int numObjs, case DO_FDW: case DO_FOREIGN_SERVER: case DO_TRANSFORM: - case DO_LARGE_OBJECT: /* Pre-data objects: must come before the pre-data boundary */ addObjectDependency(preDataBound, dobj->dumpId); break; case DO_TABLE_DATA: case DO_SEQUENCE_SET: + case DO_LARGE_OBJECT: case DO_LARGE_OBJECT_DATA: /* Data objects: must come between the boundaries */ addObjectDependency(dobj, preDataBound->dumpId); @@ -18218,6 +18625,7 @@ addBoundaryDependencies(DumpableObject **dobjs, int numObjs, case DO_PUBLICATION_REL: case DO_PUBLICATION_TABLE_IN_SCHEMA: case DO_SUBSCRIPTION: + case DO_SUBSCRIPTION_REL: /* Post-data objects: must come after the post-data boundary */ addObjectDependency(dobj, postDataBound->dumpId); break; @@ -18479,3 +18887,114 @@ appendReloptionsArrayAH(PQExpBuffer buffer, const char *reloptions, if (!res) pg_log_warning("could not parse %s array", "reloptions"); } + +/* + * read_dump_filters - retrieve object identifier patterns from file + * + * Parse the specified filter file for include and exclude patterns, and add + * them to the relevant lists. If the filename is "-" then filters will be + * read from STDIN rather than a file. + */ +static void +read_dump_filters(const char *filename, DumpOptions *dopt) +{ + FilterStateData fstate; + char *objname; + FilterCommandType comtype; + FilterObjectType objtype; + + filter_init(&fstate, filename, exit_nicely); + + while (filter_read_item(&fstate, &objname, &comtype, &objtype)) + { + if (comtype == FILTER_COMMAND_TYPE_INCLUDE) + { + switch (objtype) + { + case FILTER_OBJECT_TYPE_NONE: + break; + case FILTER_OBJECT_TYPE_DATABASE: + case FILTER_OBJECT_TYPE_FUNCTION: + case FILTER_OBJECT_TYPE_INDEX: + case FILTER_OBJECT_TYPE_TABLE_DATA: + case FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN: + case FILTER_OBJECT_TYPE_TRIGGER: + pg_log_filter_error(&fstate, _("%s filter for \"%s\" is not allowed"), + "include", + filter_object_type_name(objtype)); + exit_nicely(1); + break; /* unreachable */ + + case FILTER_OBJECT_TYPE_EXTENSION: + simple_string_list_append(&extension_include_patterns, objname); + break; + case FILTER_OBJECT_TYPE_FOREIGN_DATA: + simple_string_list_append(&foreign_servers_include_patterns, objname); + break; + case FILTER_OBJECT_TYPE_SCHEMA: + simple_string_list_append(&schema_include_patterns, objname); + dopt->include_everything = false; + break; + case FILTER_OBJECT_TYPE_TABLE: + simple_string_list_append(&table_include_patterns, objname); + dopt->include_everything = false; + break; + case FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN: + simple_string_list_append(&table_include_patterns_and_children, + objname); + dopt->include_everything = false; + break; + } + } + else if (comtype == FILTER_COMMAND_TYPE_EXCLUDE) + { + switch (objtype) + { + case FILTER_OBJECT_TYPE_NONE: + break; + case FILTER_OBJECT_TYPE_DATABASE: + case FILTER_OBJECT_TYPE_FUNCTION: + case FILTER_OBJECT_TYPE_INDEX: + case FILTER_OBJECT_TYPE_TRIGGER: + case FILTER_OBJECT_TYPE_FOREIGN_DATA: + pg_log_filter_error(&fstate, _("%s filter for \"%s\" is not allowed"), + "exclude", + filter_object_type_name(objtype)); + exit_nicely(1); + break; + + case FILTER_OBJECT_TYPE_EXTENSION: + simple_string_list_append(&extension_exclude_patterns, objname); + break; + case FILTER_OBJECT_TYPE_TABLE_DATA: + simple_string_list_append(&tabledata_exclude_patterns, + objname); + break; + case FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN: + simple_string_list_append(&tabledata_exclude_patterns_and_children, + objname); + break; + case FILTER_OBJECT_TYPE_SCHEMA: + simple_string_list_append(&schema_exclude_patterns, objname); + break; + case FILTER_OBJECT_TYPE_TABLE: + simple_string_list_append(&table_exclude_patterns, objname); + break; + case FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN: + simple_string_list_append(&table_exclude_patterns_and_children, + objname); + break; + } + } + else + { + Assert(comtype == FILTER_COMMAND_TYPE_NONE); + Assert(objtype == FILTER_OBJECT_TYPE_NONE); + } + + if (objname) + free(objname); + } + + filter_free(&fstate); +} diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index bc8f2ec36db30..1d352fe12d1ac 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -3,7 +3,7 @@ * pg_dump.h * Common header file for the pg_dump utility * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/pg_dump/pg_dump.h @@ -82,14 +82,23 @@ typedef enum DO_PUBLICATION, DO_PUBLICATION_REL, DO_PUBLICATION_TABLE_IN_SCHEMA, - DO_SUBSCRIPTION + DO_SUBSCRIPTION, + DO_SUBSCRIPTION_REL, /* see note for SubRelInfo */ } DumpableObjectType; /* * DumpComponents is a bitmask of the potentially dumpable components of * a database object: its core definition, plus optional attributes such - * as ACL, comments, etc. The NONE and ALL symbols are convenient - * shorthands. + * as ACL, comments, etc. + * + * The NONE and ALL symbols are convenient shorthands for assigning values, + * but be careful about using them in tests. For example, a test like + * "if (dobj->dump == DUMP_COMPONENT_NONE)" is probably wrong; you likely want + * "if (!(dobj->dump & DUMP_COMPONENT_DEFINITION))" instead. This is because + * we aren't too careful about the values of irrelevant bits, as indeed can be + * seen in the definition of DUMP_COMPONENT_ALL. It's also possible that an + * object has only subsidiary bits such as DUMP_COMPONENT_ACL set, leading to + * unexpected behavior of a test against NONE. */ typedef uint32 DumpComponents; #define DUMP_COMPONENT_NONE (0) @@ -345,7 +354,7 @@ typedef struct _tableInfo char *attcompression; /* per-attribute compression method */ char **attfdwoptions; /* per-attribute fdw options */ char **attmissingval; /* per attribute missing value */ - bool *notnull; /* NOT NULL constraints on attributes */ + bool *notnull; /* not-null constraints on attributes */ bool *inhNotNull; /* true if NOT NULL is inherited */ struct _attrDefInfo **attrdefs; /* DEFAULT expressions */ struct _constraintInfo *checkexprs; /* CHECK constraints */ @@ -418,7 +427,8 @@ typedef struct _indexAttachInfo typedef struct _statsExtInfo { DumpableObject dobj; - const char *rolname; + const char *rolname; /* owner */ + TableInfo *stattable; /* link to table the stats are for */ int stattarget; /* statistics target */ } StatsExtInfo; @@ -437,18 +447,8 @@ typedef struct _triggerInfo { DumpableObject dobj; TableInfo *tgtable; /* link to table the trigger is for */ - char *tgfname; - int tgtype; - int tgnargs; - char *tgargs; - bool tgisconstraint; - char *tgconstrname; - Oid tgconstrrelid; - char *tgconstrrelname; char tgenabled; bool tgispartition; - bool tgdeferrable; - bool tginitdeferred; char *tgdef; } TriggerInfo; @@ -584,11 +584,21 @@ typedef struct _defaultACLInfo char defaclobjtype; } DefaultACLInfo; +/* + * LoInfo represents a group of large objects (blobs) that share the same + * owner and ACL setting. dobj.components has the DUMP_COMPONENT_COMMENT bit + * set if any blob in the group has a comment; similarly for sec labels. + * If there are many blobs with the same owner/ACL, we can divide them into + * multiple LoInfo groups, which will each spawn a BLOB METADATA and a BLOBS + * (data) TOC entry. This allows more parallelism during restore. + */ typedef struct _loInfo { DumpableObject dobj; DumpableAcl dacl; const char *rolname; + int numlos; + Oid looids[FLEXIBLE_ARRAY_MEMBER]; } LoInfo; /* @@ -655,18 +665,41 @@ typedef struct _SubscriptionInfo { DumpableObject dobj; const char *rolname; - char *subconninfo; - char *subslotname; + char *subenabled; char *subbinary; char *substream; char *subtwophasestate; char *subdisableonerr; - char *suborigin; + char *subpasswordrequired; + char *subrunasowner; + char *subconninfo; + char *subslotname; char *subsynccommit; char *subpublications; - char *subpasswordrequired; + char *suborigin; + char *suboriginremotelsn; + char *subfailover; } SubscriptionInfo; +/* + * The SubRelInfo struct is used to represent a subscription relation. + * + * XXX Currently, the subscription tables are added to the subscription after + * enabling the subscription in binary-upgrade mode. As the apply workers will + * not be started in binary_upgrade mode the ordering of enable subscription + * does not matter. The order of adding the subscription tables to the + * subscription and enabling the subscription should be taken care of if this + * feature will be supported in a non-binary-upgrade mode in the future. + */ +typedef struct _SubRelInfo +{ + DumpableObject dobj; + SubscriptionInfo *subinfo; + TableInfo *tblinfo; + char srsubstate; + char *srsublsn; +} SubRelInfo; + /* * common utility functions */ @@ -674,6 +707,7 @@ typedef struct _SubscriptionInfo extern TableInfo *getSchemaData(Archive *fout, int *numTablesPtr); extern void AssignDumpId(DumpableObject *dobj); +extern void recordAdditionalCatalogID(CatalogId catId, DumpableObject *dobj); extern DumpId createDumpId(void); extern DumpId getMaxDumpId(void); extern DumpableObject *findObjectByDumpId(DumpId dumpId); @@ -691,6 +725,7 @@ extern CollInfo *findCollationByOid(Oid oid); extern NamespaceInfo *findNamespaceByOid(Oid oid); extern ExtensionInfo *findExtensionByOid(Oid oid); extern PublicationInfo *findPublicationByOid(Oid oid); +extern SubscriptionInfo *findSubscriptionByOid(Oid oid); extern void recordExtensionMembership(CatalogId catId, ExtensionInfo *ext); extern ExtensionInfo *findOwningExtension(CatalogId catalogId); @@ -750,5 +785,6 @@ extern void getPublicationNamespaces(Archive *fout); extern void getPublicationTables(Archive *fout, TableInfo tblinfo[], int numTables); extern void getSubscriptions(Archive *fout); +extern void getSubscriptionTables(Archive *fout); #endif /* PG_DUMP_H */ diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c index 523a19c1557d0..4cb754caa55fd 100644 --- a/src/bin/pg_dump/pg_dump_sort.c +++ b/src/bin/pg_dump/pg_dump_sort.c @@ -4,7 +4,7 @@ * Sort the items of a dump into a safe order for dumping * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -16,6 +16,8 @@ #include "postgres_fe.h" #include "catalog/pg_class_d.h" +#include "common/int.h" +#include "lib/binaryheap.h" #include "pg_backup_archiver.h" #include "pg_backup_utils.h" #include "pg_dump.h" @@ -93,6 +95,7 @@ enum dbObjectTypePriorities PRIO_PUBLICATION_REL, PRIO_PUBLICATION_TABLE_IN_SCHEMA, PRIO_SUBSCRIPTION, + PRIO_SUBSCRIPTION_REL, PRIO_DEFAULT_ACL, /* done in ACL pass */ PRIO_EVENT_TRIGGER, /* must be next to last! */ PRIO_REFRESH_MATVIEW /* must be last! */ @@ -101,55 +104,56 @@ enum dbObjectTypePriorities /* This table is indexed by enum DumpableObjectType */ static const int dbObjectTypePriority[] = { - PRIO_NAMESPACE, /* DO_NAMESPACE */ - PRIO_EXTENSION, /* DO_EXTENSION */ - PRIO_TYPE, /* DO_TYPE */ - PRIO_TYPE, /* DO_SHELL_TYPE */ - PRIO_FUNC, /* DO_FUNC */ - PRIO_AGG, /* DO_AGG */ - PRIO_OPERATOR, /* DO_OPERATOR */ - PRIO_ACCESS_METHOD, /* DO_ACCESS_METHOD */ - PRIO_OPFAMILY, /* DO_OPCLASS */ - PRIO_OPFAMILY, /* DO_OPFAMILY */ - PRIO_COLLATION, /* DO_COLLATION */ - PRIO_CONVERSION, /* DO_CONVERSION */ - PRIO_TABLE, /* DO_TABLE */ - PRIO_TABLE_ATTACH, /* DO_TABLE_ATTACH */ - PRIO_ATTRDEF, /* DO_ATTRDEF */ - PRIO_INDEX, /* DO_INDEX */ - PRIO_INDEX_ATTACH, /* DO_INDEX_ATTACH */ - PRIO_STATSEXT, /* DO_STATSEXT */ - PRIO_RULE, /* DO_RULE */ - PRIO_TRIGGER, /* DO_TRIGGER */ - PRIO_CONSTRAINT, /* DO_CONSTRAINT */ - PRIO_FK_CONSTRAINT, /* DO_FK_CONSTRAINT */ - PRIO_PROCLANG, /* DO_PROCLANG */ - PRIO_CAST, /* DO_CAST */ - PRIO_TABLE_DATA, /* DO_TABLE_DATA */ - PRIO_SEQUENCE_SET, /* DO_SEQUENCE_SET */ - PRIO_DUMMY_TYPE, /* DO_DUMMY_TYPE */ - PRIO_TSPARSER, /* DO_TSPARSER */ - PRIO_TSDICT, /* DO_TSDICT */ - PRIO_TSTEMPLATE, /* DO_TSTEMPLATE */ - PRIO_TSCONFIG, /* DO_TSCONFIG */ - PRIO_FDW, /* DO_FDW */ - PRIO_FOREIGN_SERVER, /* DO_FOREIGN_SERVER */ - PRIO_DEFAULT_ACL, /* DO_DEFAULT_ACL */ - PRIO_TRANSFORM, /* DO_TRANSFORM */ - PRIO_LARGE_OBJECT, /* DO_LARGE_OBJECT */ - PRIO_LARGE_OBJECT_DATA, /* DO_LARGE_OBJECT_DATA */ - PRIO_PRE_DATA_BOUNDARY, /* DO_PRE_DATA_BOUNDARY */ - PRIO_POST_DATA_BOUNDARY, /* DO_POST_DATA_BOUNDARY */ - PRIO_EVENT_TRIGGER, /* DO_EVENT_TRIGGER */ - PRIO_REFRESH_MATVIEW, /* DO_REFRESH_MATVIEW */ - PRIO_POLICY, /* DO_POLICY */ - PRIO_PUBLICATION, /* DO_PUBLICATION */ - PRIO_PUBLICATION_REL, /* DO_PUBLICATION_REL */ - PRIO_PUBLICATION_TABLE_IN_SCHEMA, /* DO_PUBLICATION_TABLE_IN_SCHEMA */ - PRIO_SUBSCRIPTION /* DO_SUBSCRIPTION */ + [DO_NAMESPACE] = PRIO_NAMESPACE, + [DO_EXTENSION] = PRIO_EXTENSION, + [DO_TYPE] = PRIO_TYPE, + [DO_SHELL_TYPE] = PRIO_TYPE, + [DO_FUNC] = PRIO_FUNC, + [DO_AGG] = PRIO_AGG, + [DO_OPERATOR] = PRIO_OPERATOR, + [DO_ACCESS_METHOD] = PRIO_ACCESS_METHOD, + [DO_OPCLASS] = PRIO_OPFAMILY, + [DO_OPFAMILY] = PRIO_OPFAMILY, + [DO_COLLATION] = PRIO_COLLATION, + [DO_CONVERSION] = PRIO_CONVERSION, + [DO_TABLE] = PRIO_TABLE, + [DO_TABLE_ATTACH] = PRIO_TABLE_ATTACH, + [DO_ATTRDEF] = PRIO_ATTRDEF, + [DO_INDEX] = PRIO_INDEX, + [DO_INDEX_ATTACH] = PRIO_INDEX_ATTACH, + [DO_STATSEXT] = PRIO_STATSEXT, + [DO_RULE] = PRIO_RULE, + [DO_TRIGGER] = PRIO_TRIGGER, + [DO_CONSTRAINT] = PRIO_CONSTRAINT, + [DO_FK_CONSTRAINT] = PRIO_FK_CONSTRAINT, + [DO_PROCLANG] = PRIO_PROCLANG, + [DO_CAST] = PRIO_CAST, + [DO_TABLE_DATA] = PRIO_TABLE_DATA, + [DO_SEQUENCE_SET] = PRIO_SEQUENCE_SET, + [DO_DUMMY_TYPE] = PRIO_DUMMY_TYPE, + [DO_TSPARSER] = PRIO_TSPARSER, + [DO_TSDICT] = PRIO_TSDICT, + [DO_TSTEMPLATE] = PRIO_TSTEMPLATE, + [DO_TSCONFIG] = PRIO_TSCONFIG, + [DO_FDW] = PRIO_FDW, + [DO_FOREIGN_SERVER] = PRIO_FOREIGN_SERVER, + [DO_DEFAULT_ACL] = PRIO_DEFAULT_ACL, + [DO_TRANSFORM] = PRIO_TRANSFORM, + [DO_LARGE_OBJECT] = PRIO_LARGE_OBJECT, + [DO_LARGE_OBJECT_DATA] = PRIO_LARGE_OBJECT_DATA, + [DO_PRE_DATA_BOUNDARY] = PRIO_PRE_DATA_BOUNDARY, + [DO_POST_DATA_BOUNDARY] = PRIO_POST_DATA_BOUNDARY, + [DO_EVENT_TRIGGER] = PRIO_EVENT_TRIGGER, + [DO_REFRESH_MATVIEW] = PRIO_REFRESH_MATVIEW, + [DO_POLICY] = PRIO_POLICY, + [DO_PUBLICATION] = PRIO_PUBLICATION, + [DO_PUBLICATION_REL] = PRIO_PUBLICATION_REL, + [DO_PUBLICATION_TABLE_IN_SCHEMA] = PRIO_PUBLICATION_TABLE_IN_SCHEMA, + [DO_SUBSCRIPTION] = PRIO_SUBSCRIPTION, + [DO_SUBSCRIPTION_REL] = PRIO_SUBSCRIPTION_REL, }; -StaticAssertDecl(lengthof(dbObjectTypePriority) == (DO_SUBSCRIPTION + 1), +StaticAssertDecl(lengthof(dbObjectTypePriority) == (DO_SUBSCRIPTION_REL + 1), "array length mismatch"); static DumpId preDataBoundId; @@ -161,8 +165,6 @@ static bool TopoSort(DumpableObject **objs, int numObjs, DumpableObject **ordering, int *nOrdering); -static void addHeapElement(int val, int *heap, int heapLength); -static int removeHeapElement(int *heap, int heapLength); static void findDependencyLoops(DumpableObject **objs, int nObjs, int totObjs); static int findLoop(DumpableObject *obj, DumpId startPoint, @@ -174,6 +176,7 @@ static void repairDependencyLoop(DumpableObject **loop, int nLoop); static void describeDumpableObject(DumpableObject *obj, char *buf, int bufsize); +static int int_cmp(void *a, void *b, void *arg); /* @@ -374,11 +377,10 @@ TopoSort(DumpableObject **objs, int *nOrdering) /* output argument */ { DumpId maxDumpId = getMaxDumpId(); - int *pendingHeap; + binaryheap *pendingHeap; int *beforeConstraints; int *idMap; DumpableObject *obj; - int heapLength; int i, j, k; @@ -403,7 +405,7 @@ TopoSort(DumpableObject **objs, return true; /* Create workspace for the above-described heap */ - pendingHeap = (int *) pg_malloc(numObjs * sizeof(int)); + pendingHeap = binaryheap_allocate(numObjs, int_cmp, NULL); /* * Scan the constraints, and for each item in the input, generate a count @@ -434,19 +436,16 @@ TopoSort(DumpableObject **objs, * Now initialize the heap of items-ready-to-output by filling it with the * indexes of items that already have beforeConstraints[id] == 0. * - * The essential property of a heap is heap[(j-1)/2] >= heap[j] for each j - * in the range 1..heapLength-1 (note we are using 0-based subscripts - * here, while the discussion in Knuth assumes 1-based subscripts). So, if - * we simply enter the indexes into pendingHeap[] in decreasing order, we - * a-fortiori have the heap invariant satisfied at completion of this - * loop, and don't need to do any sift-up comparisons. + * We enter the indexes into pendingHeap in decreasing order so that the + * heap invariant is satisfied at the completion of this loop. This + * reduces the amount of work that binaryheap_build() must do. */ - heapLength = 0; for (i = numObjs; --i >= 0;) { if (beforeConstraints[objs[i]->dumpId] == 0) - pendingHeap[heapLength++] = i; + binaryheap_add_unordered(pendingHeap, (void *) (intptr_t) i); } + binaryheap_build(pendingHeap); /*-------------------- * Now emit objects, working backwards in the output list. At each step, @@ -464,10 +463,10 @@ TopoSort(DumpableObject **objs, *-------------------- */ i = numObjs; - while (heapLength > 0) + while (!binaryheap_empty(pendingHeap)) { /* Select object to output by removing largest heap member */ - j = removeHeapElement(pendingHeap, heapLength--); + j = (int) (intptr_t) binaryheap_remove_first(pendingHeap); obj = objs[j]; /* Output candidate to ordering[] */ ordering[--i] = obj; @@ -477,7 +476,7 @@ TopoSort(DumpableObject **objs, int id = obj->dependencies[k]; if ((--beforeConstraints[id]) == 0) - addHeapElement(idMap[id], pendingHeap, heapLength++); + binaryheap_add(pendingHeap, (void *) (intptr_t) idMap[id]); } } @@ -497,79 +496,13 @@ TopoSort(DumpableObject **objs, } /* Done */ - free(pendingHeap); + binaryheap_free(pendingHeap); free(beforeConstraints); free(idMap); return (i == 0); } -/* - * Add an item to a heap (priority queue) - * - * heapLength is the current heap size; caller is responsible for increasing - * its value after the call. There must be sufficient storage at *heap. - */ -static void -addHeapElement(int val, int *heap, int heapLength) -{ - int j; - - /* - * Sift-up the new entry, per Knuth 5.2.3 exercise 16. Note that Knuth is - * using 1-based array indexes, not 0-based. - */ - j = heapLength; - while (j > 0) - { - int i = (j - 1) >> 1; - - if (val <= heap[i]) - break; - heap[j] = heap[i]; - j = i; - } - heap[j] = val; -} - -/* - * Remove the largest item present in a heap (priority queue) - * - * heapLength is the current heap size; caller is responsible for decreasing - * its value after the call. - * - * We remove and return heap[0], which is always the largest element of - * the heap, and then "sift up" to maintain the heap invariant. - */ -static int -removeHeapElement(int *heap, int heapLength) -{ - int result = heap[0]; - int val; - int i; - - if (--heapLength <= 0) - return result; - val = heap[heapLength]; /* value that must be reinserted */ - i = 0; /* i is where the "hole" is */ - for (;;) - { - int j = 2 * i + 1; - - if (j >= heapLength) - break; - if (j + 1 < heapLength && - heap[j] < heap[j + 1]) - j++; - if (val >= heap[j]) - break; - heap[i] = heap[j]; - i = j; - } - heap[i] = val; - return result; -} - /* * findDependencyLoops - identify loops in TopoSort's failure output, * and pass each such loop to repairDependencyLoop() for action @@ -1542,6 +1475,11 @@ describeDumpableObject(DumpableObject *obj, char *buf, int bufsize) "SUBSCRIPTION (ID %d OID %u)", obj->dumpId, obj->catId.oid); return; + case DO_SUBSCRIPTION_REL: + snprintf(buf, bufsize, + "SUBSCRIPTION TABLE (ID %d OID %u)", + obj->dumpId, obj->catId.oid); + return; case DO_PRE_DATA_BOUNDARY: snprintf(buf, bufsize, "PRE-DATA BOUNDARY (ID %d)", @@ -1559,3 +1497,13 @@ describeDumpableObject(DumpableObject *obj, char *buf, int bufsize) (int) obj->objType, obj->dumpId, obj->catId.oid); } + +/* binaryheap comparator that compares "a" and "b" as integers */ +static int +int_cmp(void *a, void *b, void *arg) +{ + int ai = (int) (intptr_t) a; + int bi = (int) (intptr_t) b; + + return pg_cmp_s32(ai, bi); +} diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index 3627b69e2a6b3..d5282ecb17a1a 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -2,7 +2,7 @@ * * pg_dumpall.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * pg_dumpall forces all pg_dump output to be text, since it also outputs @@ -21,19 +21,18 @@ #include "catalog/pg_authid_d.h" #include "common/connect.h" #include "common/file_utils.h" -#include "common/hashfn.h" +#include "common/hashfn_unstable.h" #include "common/logging.h" #include "common/string.h" #include "dumputils.h" #include "fe_utils/string_utils.h" +#include "filter.h" #include "getopt_long.h" #include "pg_backup.h" /* version string we expect back from pg_dump */ #define PGDUMP_VERSIONSTR "pg_dump (PostgreSQL) " PG_VERSION "\n" -static uint32 hash_string_pointer(char *s); - typedef struct { uint32 status; @@ -45,7 +44,7 @@ typedef struct #define SH_ELEMENT_TYPE RoleNameEntry #define SH_KEY_TYPE char * #define SH_KEY rolename -#define SH_HASH_KEY(tb, key) hash_string_pointer(key) +#define SH_HASH_KEY(tb, key) hash_string(key) #define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0) #define SH_STORE_HASH #define SH_GET_HASH(tb, a) (a)->hashval @@ -81,6 +80,7 @@ static PGresult *executeQuery(PGconn *conn, const char *query); static void executeCommand(PGconn *conn, const char *query); static void expand_dbname_patterns(PGconn *conn, SimpleStringList *patterns, SimpleStringList *names); +static void read_dumpall_filters(const char *filename, SimpleStringList *pattern); static char pg_dump_bin[MAXPGPATH]; static const char *progname; @@ -177,6 +177,7 @@ main(int argc, char *argv[]) {"no-unlogged-table-data", no_argument, &no_unlogged_table_data, 1}, {"on-conflict-do-nothing", no_argument, &on_conflict_do_nothing, 1}, {"rows-per-insert", required_argument, NULL, 7}, + {"filter", required_argument, NULL, 8}, {NULL, 0, NULL, 0} }; @@ -360,6 +361,10 @@ main(int argc, char *argv[]) appendShellString(pgdumpopts, optarg); break; + case 8: + read_dumpall_filters(optarg, &database_exclude_patterns); + break; + default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -519,6 +524,7 @@ main(int argc, char *argv[]) * we know how to escape strings. */ encoding = PQclientEncoding(conn); + setFmtEncoding(encoding); std_strings = PQparameterStatus(conn, "standard_conforming_strings"); if (!std_strings) std_strings = "off"; @@ -653,6 +659,7 @@ help(void) printf(_(" --disable-triggers disable triggers during data-only restore\n")); printf(_(" --exclude-database=PATTERN exclude databases whose name matches PATTERN\n")); printf(_(" --extra-float-digits=NUM override default setting for extra_float_digits\n")); + printf(_(" --filter=FILENAME exclude databases based on expressions in FILENAME\n")); printf(_(" --if-exists use IF EXISTS when dropping objects\n")); printf(_(" --inserts dump data as INSERT commands, rather than COPY\n")); printf(_(" --load-via-partition-root load partitions via the root table\n")); @@ -761,28 +768,31 @@ dumpRoles(PGconn *conn) i_is_current_user; int i; - /* note: rolconfig is dumped later */ + /* + * Notes: rolconfig is dumped later, and pg_authid must be used for + * extracting rolcomment regardless of role_catalog. + */ if (server_version >= 90600) printfPQExpBuffer(buf, "SELECT oid, rolname, rolsuper, rolinherit, " "rolcreaterole, rolcreatedb, " "rolcanlogin, rolconnlimit, rolpassword, " "rolvaliduntil, rolreplication, rolbypassrls, " - "pg_catalog.shobj_description(oid, '%s') as rolcomment, " + "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, " "rolname = current_user AS is_current_user " "FROM %s " "WHERE rolname !~ '^pg_' " - "ORDER BY 2", role_catalog, role_catalog); + "ORDER BY 2", role_catalog); else if (server_version >= 90500) printfPQExpBuffer(buf, "SELECT oid, rolname, rolsuper, rolinherit, " "rolcreaterole, rolcreatedb, " "rolcanlogin, rolconnlimit, rolpassword, " "rolvaliduntil, rolreplication, rolbypassrls, " - "pg_catalog.shobj_description(oid, '%s') as rolcomment, " + "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, " "rolname = current_user AS is_current_user " "FROM %s " - "ORDER BY 2", role_catalog, role_catalog); + "ORDER BY 2", role_catalog); else printfPQExpBuffer(buf, "SELECT oid, rolname, rolsuper, rolinherit, " @@ -790,10 +800,10 @@ dumpRoles(PGconn *conn) "rolcanlogin, rolconnlimit, rolpassword, " "rolvaliduntil, rolreplication, " "false as rolbypassrls, " - "pg_catalog.shobj_description(oid, '%s') as rolcomment, " + "pg_catalog.shobj_description(oid, 'pg_authid') as rolcomment, " "rolname = current_user AS is_current_user " "FROM %s " - "ORDER BY 2", role_catalog, role_catalog); + "ORDER BY 2", role_catalog); res = executeQuery(conn, buf->data); @@ -956,6 +966,13 @@ dumpRoleMembership(PGconn *conn) total; bool dump_grantors; bool dump_grant_options; + int i_role; + int i_member; + int i_grantor; + int i_roleid; + int i_memberid; + int i_grantorid; + int i_admin_option; int i_inherit_option; int i_set_option; @@ -965,6 +982,10 @@ dumpRoleMembership(PGconn *conn) * they didn't have ADMIN OPTION on the role, or a user that no longer * existed. To avoid dump and restore failures, don't dump the grantor * when talking to an old server version. + * + * Also, in older versions the roleid and/or member could be role OIDs + * that no longer exist. If we find such cases, print a warning and skip + * the entry. */ dump_grantors = (PQserverVersion(conn) >= 160000); @@ -976,8 +997,10 @@ dumpRoleMembership(PGconn *conn) /* Generate and execute query. */ printfPQExpBuffer(buf, "SELECT ur.rolname AS role, " "um.rolname AS member, " - "ug.oid AS grantorid, " "ug.rolname AS grantor, " + "a.roleid AS roleid, " + "a.member AS memberid, " + "a.grantor AS grantorid, " "a.admin_option"); if (dump_grant_options) appendPQExpBufferStr(buf, ", a.inherit_option, a.set_option"); @@ -986,8 +1009,15 @@ dumpRoleMembership(PGconn *conn) "LEFT JOIN %s um on um.oid = a.member " "LEFT JOIN %s ug on ug.oid = a.grantor " "WHERE NOT (ur.rolname ~ '^pg_' AND um.rolname ~ '^pg_')" - "ORDER BY 1,2,4", role_catalog, role_catalog, role_catalog); + "ORDER BY 1,2,3", role_catalog, role_catalog, role_catalog); res = executeQuery(conn, buf->data); + i_role = PQfnumber(res, "role"); + i_member = PQfnumber(res, "member"); + i_grantor = PQfnumber(res, "grantor"); + i_roleid = PQfnumber(res, "roleid"); + i_memberid = PQfnumber(res, "memberid"); + i_grantorid = PQfnumber(res, "grantorid"); + i_admin_option = PQfnumber(res, "admin_option"); i_inherit_option = PQfnumber(res, "inherit_option"); i_set_option = PQfnumber(res, "set_option"); @@ -1011,24 +1041,32 @@ dumpRoleMembership(PGconn *conn) total = PQntuples(res); while (start < total) { - char *role = PQgetvalue(res, start, 0); + char *role = PQgetvalue(res, start, i_role); int i; bool *done; int remaining; int prev_remaining = 0; rolename_hash *ht; + /* If we hit a null roleid, we're done (nulls sort to the end). */ + if (PQgetisnull(res, start, i_role)) + { + /* translator: %s represents a numeric role OID */ + pg_log_warning("found orphaned pg_auth_members entry for role %s", + PQgetvalue(res, start, i_roleid)); + break; + } + /* All memberships for a single role should be adjacent. */ for (end = start; end < total; ++end) { char *otherrole; - otherrole = PQgetvalue(res, end, 0); + otherrole = PQgetvalue(res, end, i_role); if (strcmp(role, otherrole) != 0) break; } - role = PQgetvalue(res, start, 0); remaining = end - start; done = pg_malloc0(remaining * sizeof(bool)); ht = rolename_create(remaining, NULL); @@ -1068,10 +1106,30 @@ dumpRoleMembership(PGconn *conn) if (done[i - start]) continue; - member = PQgetvalue(res, i, 1); - grantorid = PQgetvalue(res, i, 2); - grantor = PQgetvalue(res, i, 3); - admin_option = PQgetvalue(res, i, 4); + /* Complain about, then ignore, entries with orphaned OIDs. */ + if (PQgetisnull(res, i, i_member)) + { + /* translator: %s represents a numeric role OID */ + pg_log_warning("found orphaned pg_auth_members entry for role %s", + PQgetvalue(res, i, i_memberid)); + done[i - start] = true; + --remaining; + continue; + } + if (PQgetisnull(res, i, i_grantor)) + { + /* translator: %s represents a numeric role OID */ + pg_log_warning("found orphaned pg_auth_members entry for role %s", + PQgetvalue(res, i, i_grantorid)); + done[i - start] = true; + --remaining; + continue; + } + + member = PQgetvalue(res, i, i_member); + grantor = PQgetvalue(res, i, i_grantor); + grantorid = PQgetvalue(res, i, i_grantorid); + admin_option = PQgetvalue(res, i, i_admin_option); if (dump_grant_options) set_option = PQgetvalue(res, i, i_set_option); @@ -1286,7 +1344,16 @@ dumpTablespaces(PGconn *conn) appendPQExpBuffer(buf, " OWNER %s", fmtId(spcowner)); appendPQExpBufferStr(buf, " LOCATION "); - appendStringLiteralConn(buf, spclocation, conn); + + /* + * In-place tablespaces use a relative path, and need to be dumped + * with an empty string as location. + */ + if (is_absolute_path(spclocation)) + appendStringLiteralConn(buf, spclocation, conn); + else + appendStringLiteralConn(buf, "", conn); + appendPQExpBufferStr(buf, ";\n"); if (spcoptions && spcoptions[0] != '\0') @@ -1345,7 +1412,7 @@ dropDBs(PGconn *conn) res = executeQuery(conn, "SELECT datname " "FROM pg_database d " - "WHERE datallowconn " + "WHERE datallowconn AND datconnlimit != -2 " "ORDER BY datname"); if (PQntuples(res) > 0) @@ -1488,7 +1555,7 @@ dumpDatabases(PGconn *conn) res = executeQuery(conn, "SELECT datname " "FROM pg_database d " - "WHERE datallowconn " + "WHERE datallowconn AND datconnlimit != -2 " "ORDER BY (datname <> 'template1'), datname"); if (PQntuples(res) > 0) @@ -1564,11 +1631,14 @@ dumpDatabases(PGconn *conn) static int runPgDump(const char *dbname, const char *create_opts) { - PQExpBuffer connstrbuf = createPQExpBuffer(); - PQExpBuffer cmd = createPQExpBuffer(); + PQExpBufferData connstrbuf; + PQExpBufferData cmd; int ret; - appendPQExpBuffer(cmd, "\"%s\" %s %s", pg_dump_bin, + initPQExpBuffer(&connstrbuf); + initPQExpBuffer(&cmd); + + printfPQExpBuffer(&cmd, "\"%s\" %s %s", pg_dump_bin, pgdumpopts->data, create_opts); /* @@ -1576,27 +1646,27 @@ runPgDump(const char *dbname, const char *create_opts) * format. */ if (filename) - appendPQExpBufferStr(cmd, " -Fa "); + appendPQExpBufferStr(&cmd, " -Fa "); else - appendPQExpBufferStr(cmd, " -Fp "); + appendPQExpBufferStr(&cmd, " -Fp "); /* * Append the database name to the already-constructed stem of connection * string. */ - appendPQExpBuffer(connstrbuf, "%s dbname=", connstr); - appendConnStrVal(connstrbuf, dbname); + appendPQExpBuffer(&connstrbuf, "%s dbname=", connstr); + appendConnStrVal(&connstrbuf, dbname); - appendShellString(cmd, connstrbuf->data); + appendShellString(&cmd, connstrbuf.data); - pg_log_info("running \"%s\"", cmd->data); + pg_log_info("running \"%s\"", cmd.data); fflush(NULL); - ret = system(cmd->data); + ret = system(cmd.data); - destroyPQExpBuffer(cmd); - destroyPQExpBuffer(connstrbuf); + termPQExpBuffer(&cmd); + termPQExpBuffer(&connstrbuf); return ret; } @@ -1916,12 +1986,60 @@ dumpTimestamp(const char *msg) } /* - * Helper function for rolename_hash hash table. + * read_dumpall_filters - retrieve database identifier patterns from file + * + * Parse the specified filter file for include and exclude patterns, and add + * them to the relevant lists. If the filename is "-" then filters will be + * read from STDIN rather than a file. + * + * At the moment, the only allowed filter is for database exclusion. */ -static uint32 -hash_string_pointer(char *s) +static void +read_dumpall_filters(const char *filename, SimpleStringList *pattern) { - unsigned char *ss = (unsigned char *) s; + FilterStateData fstate; + char *objname; + FilterCommandType comtype; + FilterObjectType objtype; + + filter_init(&fstate, filename, exit); + + while (filter_read_item(&fstate, &objname, &comtype, &objtype)) + { + if (comtype == FILTER_COMMAND_TYPE_INCLUDE) + { + pg_log_filter_error(&fstate, _("%s filter for \"%s\" is not allowed"), + "include", + filter_object_type_name(objtype)); + exit_nicely(1); + } + + switch (objtype) + { + case FILTER_OBJECT_TYPE_NONE: + break; + case FILTER_OBJECT_TYPE_FUNCTION: + case FILTER_OBJECT_TYPE_INDEX: + case FILTER_OBJECT_TYPE_TABLE_DATA: + case FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN: + case FILTER_OBJECT_TYPE_TRIGGER: + case FILTER_OBJECT_TYPE_EXTENSION: + case FILTER_OBJECT_TYPE_FOREIGN_DATA: + case FILTER_OBJECT_TYPE_SCHEMA: + case FILTER_OBJECT_TYPE_TABLE: + case FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN: + pg_log_filter_error(&fstate, _("unsupported filter object")); + exit_nicely(1); + break; + + case FILTER_OBJECT_TYPE_DATABASE: + simple_string_list_append(pattern, objname); + break; + } + + if (objname) + free(objname); + } - return hash_bytes(ss, strlen(s)); + filter_free(&fstate); } diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c index 049a100634734..df119591ccaa0 100644 --- a/src/bin/pg_dump/pg_restore.c +++ b/src/bin/pg_dump/pg_restore.c @@ -47,11 +47,13 @@ #include "dumputils.h" #include "fe_utils/option_utils.h" +#include "filter.h" #include "getopt_long.h" #include "parallel.h" #include "pg_backup_utils.h" static void usage(const char *progname); +static void read_restore_filters(const char *filename, RestoreOptions *opts); int main(int argc, char **argv) @@ -118,11 +120,13 @@ main(int argc, char **argv) {"role", required_argument, NULL, 2}, {"section", required_argument, NULL, 3}, {"strict-names", no_argument, &strict_names, 1}, + {"transaction-size", required_argument, NULL, 5}, {"use-set-session-authorization", no_argument, &use_setsessauth, 1}, {"no-comments", no_argument, &no_comments, 1}, {"no-publications", no_argument, &no_publications, 1}, {"no-security-labels", no_argument, &no_security_labels, 1}, {"no-subscriptions", no_argument, &no_subscriptions, 1}, + {"filter", required_argument, NULL, 4}, {NULL, 0, NULL, 0} }; @@ -286,6 +290,18 @@ main(int argc, char **argv) set_dump_section(optarg, &(opts->dumpSections)); break; + case 4: /* filter */ + read_restore_filters(optarg, opts); + break; + + case 5: /* transaction-size */ + if (!option_parse_int(optarg, "--transaction-size", + 1, INT_MAX, + &opts->txn_size)) + exit(1); + opts->exit_on_error = true; + break; + default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -330,6 +346,9 @@ main(int argc, char **argv) if (opts->dataOnly && opts->dropSchema) pg_fatal("options -c/--clean and -a/--data-only cannot be used together"); + if (opts->single_txn && opts->txn_size > 0) + pg_fatal("options -1/--single-transaction and --transaction-size cannot be used together"); + /* * -C is not compatible with -1, because we can't create a database inside * a transaction block. @@ -463,6 +482,8 @@ usage(const char *progname) printf(_(" -1, --single-transaction restore as a single transaction\n")); printf(_(" --disable-triggers disable triggers during data-only restore\n")); printf(_(" --enable-row-security enable row security\n")); + printf(_(" --filter=FILENAME restore or skip objects based on expressions\n" + " in FILENAME\n")); printf(_(" --if-exists use IF EXISTS when dropping objects\n")); printf(_(" --no-comments do not restore comments\n")); printf(_(" --no-data-for-failed-tables do not restore data of tables that could not be\n" @@ -475,6 +496,7 @@ usage(const char *progname) printf(_(" --section=SECTION restore named section (pre-data, data, or post-data)\n")); printf(_(" --strict-names require table and/or schema include patterns to\n" " match at least one entity each\n")); + printf(_(" --transaction-size=N commit after every N objects\n")); printf(_(" --use-set-session-authorization\n" " use SET SESSION AUTHORIZATION commands instead of\n" " ALTER OWNER commands to set ownership\n")); @@ -494,3 +516,103 @@ usage(const char *progname) printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT); printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL); } + +/* + * read_restore_filters - retrieve object identifier patterns from file + * + * Parse the specified filter file for include and exclude patterns, and add + * them to the relevant lists. If the filename is "-" then filters will be + * read from STDIN rather than a file. + */ +static void +read_restore_filters(const char *filename, RestoreOptions *opts) +{ + FilterStateData fstate; + char *objname; + FilterCommandType comtype; + FilterObjectType objtype; + + filter_init(&fstate, filename, exit_nicely); + + while (filter_read_item(&fstate, &objname, &comtype, &objtype)) + { + if (comtype == FILTER_COMMAND_TYPE_INCLUDE) + { + switch (objtype) + { + case FILTER_OBJECT_TYPE_NONE: + break; + case FILTER_OBJECT_TYPE_TABLE_DATA: + case FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN: + case FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN: + case FILTER_OBJECT_TYPE_DATABASE: + case FILTER_OBJECT_TYPE_EXTENSION: + case FILTER_OBJECT_TYPE_FOREIGN_DATA: + pg_log_filter_error(&fstate, _("%s filter for \"%s\" is not allowed"), + "include", + filter_object_type_name(objtype)); + exit_nicely(1); + + case FILTER_OBJECT_TYPE_FUNCTION: + opts->selTypes = 1; + opts->selFunction = 1; + simple_string_list_append(&opts->functionNames, objname); + break; + case FILTER_OBJECT_TYPE_INDEX: + opts->selTypes = 1; + opts->selIndex = 1; + simple_string_list_append(&opts->indexNames, objname); + break; + case FILTER_OBJECT_TYPE_SCHEMA: + simple_string_list_append(&opts->schemaNames, objname); + break; + case FILTER_OBJECT_TYPE_TABLE: + opts->selTypes = 1; + opts->selTable = 1; + simple_string_list_append(&opts->tableNames, objname); + break; + case FILTER_OBJECT_TYPE_TRIGGER: + opts->selTypes = 1; + opts->selTrigger = 1; + simple_string_list_append(&opts->triggerNames, objname); + break; + } + } + else if (comtype == FILTER_COMMAND_TYPE_EXCLUDE) + { + switch (objtype) + { + case FILTER_OBJECT_TYPE_NONE: + break; + case FILTER_OBJECT_TYPE_TABLE_DATA: + case FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN: + case FILTER_OBJECT_TYPE_DATABASE: + case FILTER_OBJECT_TYPE_EXTENSION: + case FILTER_OBJECT_TYPE_FOREIGN_DATA: + case FILTER_OBJECT_TYPE_FUNCTION: + case FILTER_OBJECT_TYPE_INDEX: + case FILTER_OBJECT_TYPE_TABLE: + case FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN: + case FILTER_OBJECT_TYPE_TRIGGER: + pg_log_filter_error(&fstate, _("%s filter for \"%s\" is not allowed"), + "exclude", + filter_object_type_name(objtype)); + exit_nicely(1); + + case FILTER_OBJECT_TYPE_SCHEMA: + simple_string_list_append(&opts->schemaExcludeNames, objname); + break; + } + } + else + { + Assert(comtype == FILTER_COMMAND_TYPE_NONE); + Assert(objtype == FILTER_OBJECT_TYPE_NONE); + } + + if (objname) + free(objname); + } + + filter_free(&fstate); +} diff --git a/src/bin/pg_dump/po/LINGUAS b/src/bin/pg_dump/po/LINGUAS index e75500a22ded1..00f815d2ad2de 100644 --- a/src/bin/pg_dump/po/LINGUAS +++ b/src/bin/pg_dump/po/LINGUAS @@ -1 +1 @@ -cs de el es fr he it ja ka ko pl pt_BR ru sv tr uk zh_CN +cs de el es fr he it ja ka ko pl pt_BR ru sv tr uk zh_CN zh_TW diff --git a/src/bin/pg_dump/po/de.po b/src/bin/pg_dump/po/de.po index cedc211ee5a20..1e45cd26484e6 100644 --- a/src/bin/pg_dump/po/de.po +++ b/src/bin/pg_dump/po/de.po @@ -1,14 +1,14 @@ # German message translation file for pg_dump and friends -# Peter Eisentraut , 2001 - 2023. +# Peter Eisentraut , 2001 - 2025. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 16\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-19 17:21+0000\n" -"PO-Revision-Date: 2023-05-19 20:57+0200\n" +"POT-Creation-Date: 2025-03-10 19:20+0000\n" +"PO-Revision-Date: 2025-03-11 08:50+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -89,32 +89,47 @@ msgstr "Komprimierungsalgorithmus »%s« akzeptiert keine Worker-Anzahl" msgid "compression algorithm \"%s\" does not support long-distance mode" msgstr "Komprimierungsalgorithmus »%s« unterstützt keinen Long-Distance-Modus" -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "ungültige Programmdatei »%s«: %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "konnte Programmdatei »%s« nicht lesen: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "konnte kein »%s« zum Ausführen finden" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "konnte Pfad »%s« nicht in absolute Form auflösen: %m" -#: ../../common/exec.c:412 parallel.c:1609 +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "konnte Befehl »%s« nicht ausführen: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "konnte nicht von Befehl »%s« lesen: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "Befehl »%s« gab keine Daten zurück" + +#: ../../common/exec.c:424 parallel.c:1609 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "Speicher aufgebraucht" @@ -129,6 +144,49 @@ msgstr "Speicher aufgebraucht\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "konnte Datei »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_backup_directory.c:182 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht lesen: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "konnte Datei »%s« nicht fsyncen: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" + #: ../../common/wait_error.c:55 #, c-format msgid "command not executable" @@ -169,227 +227,247 @@ msgstr "ungültiger Wert »%s« für Option %s" msgid "%s must be in range %d..%d" msgstr "%s muss im Bereich %d..%d sein" -#: common.c:132 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "unbekannte Sync-Methode: %s" + +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s«\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "Datenbankname enthält Newline oder Carriage Return: »%s«\n" + +#: common.c:135 #, c-format msgid "reading extensions" msgstr "lese Erweiterungen" -#: common.c:135 +#: common.c:138 #, c-format msgid "identifying extension members" msgstr "identifiziere Erweiterungselemente" -#: common.c:138 +#: common.c:141 #, c-format msgid "reading schemas" msgstr "lese Schemas" -#: common.c:147 +#: common.c:150 #, c-format msgid "reading user-defined tables" msgstr "lese benutzerdefinierte Tabellen" -#: common.c:152 +#: common.c:155 #, c-format msgid "reading user-defined functions" msgstr "lese benutzerdefinierte Funktionen" -#: common.c:156 +#: common.c:159 #, c-format msgid "reading user-defined types" msgstr "lese benutzerdefinierte Typen" -#: common.c:160 +#: common.c:163 #, c-format msgid "reading procedural languages" msgstr "lese prozedurale Sprachen" -#: common.c:163 +#: common.c:166 #, c-format msgid "reading user-defined aggregate functions" msgstr "lese benutzerdefinierte Aggregatfunktionen" -#: common.c:166 +#: common.c:169 #, c-format msgid "reading user-defined operators" msgstr "lese benutzerdefinierte Operatoren" -#: common.c:169 +#: common.c:172 #, c-format msgid "reading user-defined access methods" msgstr "lese benutzerdefinierte Zugriffsmethoden" -#: common.c:172 +#: common.c:175 #, c-format msgid "reading user-defined operator classes" msgstr "lese benutzerdefinierte Operatorklassen" -#: common.c:175 +#: common.c:178 #, c-format msgid "reading user-defined operator families" msgstr "lese benutzerdefinierte Operatorfamilien" -#: common.c:178 +#: common.c:181 #, c-format msgid "reading user-defined text search parsers" msgstr "lese benutzerdefinierte Textsuche-Parser" -#: common.c:181 +#: common.c:184 #, c-format msgid "reading user-defined text search templates" msgstr "lese benutzerdefinierte Textsuche-Templates" -#: common.c:184 +#: common.c:187 #, c-format msgid "reading user-defined text search dictionaries" msgstr "lese benutzerdefinierte Textsuchewörterbücher" -#: common.c:187 +#: common.c:190 #, c-format msgid "reading user-defined text search configurations" msgstr "lese benutzerdefinierte Textsuchekonfigurationen" -#: common.c:190 +#: common.c:193 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "lese benutzerdefinierte Fremddaten-Wrapper" -#: common.c:193 +#: common.c:196 #, c-format msgid "reading user-defined foreign servers" msgstr "lese benutzerdefinierte Fremdserver" -#: common.c:196 +#: common.c:199 #, c-format msgid "reading default privileges" msgstr "lese Vorgabeprivilegien" -#: common.c:199 +#: common.c:202 #, c-format msgid "reading user-defined collations" msgstr "lese benutzerdefinierte Sortierfolgen" -#: common.c:202 +#: common.c:205 #, c-format msgid "reading user-defined conversions" msgstr "lese benutzerdefinierte Konversionen" -#: common.c:205 +#: common.c:208 #, c-format msgid "reading type casts" msgstr "lese Typumwandlungen" -#: common.c:208 +#: common.c:211 #, c-format msgid "reading transforms" msgstr "lese Transformationen" -#: common.c:211 +#: common.c:214 #, c-format msgid "reading table inheritance information" msgstr "lese Tabellenvererbungsinformationen" -#: common.c:214 +#: common.c:217 #, c-format msgid "reading event triggers" msgstr "lese Ereignistrigger" -#: common.c:218 +#: common.c:221 #, c-format msgid "finding extension tables" msgstr "finde Erweiterungstabellen" -#: common.c:222 +#: common.c:225 #, c-format msgid "finding inheritance relationships" msgstr "finde Vererbungsbeziehungen" -#: common.c:225 +#: common.c:228 #, c-format msgid "reading column info for interesting tables" msgstr "lese Spalteninfo für interessante Tabellen" -#: common.c:228 +#: common.c:231 #, c-format msgid "flagging inherited columns in subtables" msgstr "markiere vererbte Spalten in abgeleiteten Tabellen" -#: common.c:231 +#: common.c:234 #, c-format msgid "reading partitioning data" msgstr "lese Partitionierungsdaten" -#: common.c:234 +#: common.c:237 #, c-format msgid "reading indexes" msgstr "lese Indexe" -#: common.c:237 +#: common.c:240 #, c-format msgid "flagging indexes in partitioned tables" msgstr "markiere Indexe in partitionierten Tabellen" -#: common.c:240 +#: common.c:243 #, c-format msgid "reading extended statistics" msgstr "lese erweiterte Statistiken" -#: common.c:243 +#: common.c:246 #, c-format msgid "reading constraints" msgstr "lese Constraints" -#: common.c:246 +#: common.c:249 #, c-format msgid "reading triggers" msgstr "lese Trigger" -#: common.c:249 +#: common.c:252 #, c-format msgid "reading rewrite rules" msgstr "lese Umschreiberegeln" -#: common.c:252 +#: common.c:255 #, c-format msgid "reading policies" msgstr "lese Policies" -#: common.c:255 +#: common.c:258 #, c-format msgid "reading publications" msgstr "lese Publikationen" -#: common.c:258 +#: common.c:261 #, c-format msgid "reading publication membership of tables" msgstr "lese Publikationsmitgliedschaft von Tabellen" -#: common.c:261 +#: common.c:264 #, c-format msgid "reading publication membership of schemas" msgstr "lese Publikationsmitgliedschaft von Schemas" -#: common.c:264 +#: common.c:267 #, c-format msgid "reading subscriptions" msgstr "lese Subskriptionen" -#: common.c:327 +#: common.c:270 +#, c-format +msgid "reading subscription membership of tables" +msgstr "lese Subskriptionsmitgliedschaft von Tabellen" + +#: common.c:333 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "Sanity-Check fehlgeschlagen, Eltern-OID %u von Tabelle »%s« (OID %u) nicht gefunden" -#: common.c:369 +#: common.c:375 #, c-format msgid "invalid number of parents %d for table \"%s\"" msgstr "ungültige Anzahl Eltern %d für Tabelle »%s«" -#: common.c:1049 +#: common.c:1098 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "konnte numerisches Array »%s« nicht parsen: zu viele Zahlen" -#: common.c:1061 +#: common.c:1110 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "konnte numerisches Array »%s« nicht parsen: ungültiges Zeichen in Zahl" @@ -419,15 +497,20 @@ msgstr "konnte Daten nicht dekomprimieren: %s" msgid "could not close compression library: %s" msgstr "konnte Komprimierungsbibliothek nicht schließen: %s" -#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608 -#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140 +#: compress_gzip.c:266 compress_lz4.c:608 compress_lz4.c:628 compress_lz4.c:647 #, c-format msgid "could not read from input file: %s" msgstr "konnte nicht aus Eingabedatei lesen: %s" -#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142 -#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558 -#: pg_backup_tar.c:725 pg_backup_tar.c:748 +#: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 +#: compress_zstd.c:374 pg_backup_custom.c:651 +#, c-format +msgid "could not read from input file: %m" +msgstr "konnte nicht aus Eingabedatei lesen: %m" + +#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:141 +#: compress_zstd.c:372 pg_backup_custom.c:649 pg_backup_directory.c:565 +#: pg_backup_tar.c:740 pg_backup_tar.c:763 #, c-format msgid "could not read from input file: end of file" msgstr "konnte nicht aus Eingabedatei lesen: Dateiende" @@ -467,27 +550,72 @@ msgstr "konnte Dekomprimierung nicht beenden: %s" msgid "could not set compression parameter \"%s\": %s" msgstr "konnte Komprimierungsparameter »%s« nicht setzen: %s" -#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490 -#: compress_zstd.c:498 +#: compress_zstd.c:78 compress_zstd.c:232 compress_zstd.c:491 +#: compress_zstd.c:499 #, c-format msgid "could not initialize compression library" msgstr "konnte Komprimierungsbibliothek nicht initialisieren" -#: compress_zstd.c:194 compress_zstd.c:308 +#: compress_zstd.c:195 compress_zstd.c:309 #, c-format msgid "could not decompress data: %s" msgstr "konnte Daten nicht dekomprimieren: %s" -#: compress_zstd.c:373 pg_backup_custom.c:655 -#, c-format -msgid "could not read from input file: %m" -msgstr "konnte nicht aus Eingabedatei lesen: %m" - -#: compress_zstd.c:501 +#: compress_zstd.c:502 #, c-format msgid "unhandled mode \"%s\"" msgstr "unbehandelter Modus »%s«" +#: filter.c:49 +#, c-format +msgid "could not open filter file \"%s\": %m" +msgstr "konnte Filterdatei »%s« nicht öffnen: %m" + +#: filter.c:72 +#, c-format +msgid "could not close filter file \"%s\": %m" +msgstr "konnte Filterdatei »%s« nicht schließen: %m" + +#: filter.c:165 +#, c-format +msgid "invalid format in filter read from standard input on line %d: %s" +msgstr "ungültiges Format in Filter gelesen von Standardeingabe auf Zeile %d: %s" + +#: filter.c:168 +#, c-format +msgid "invalid format in filter read from file \"%s\" on line %d: %s" +msgstr "ungültiges Format in Filter gelesen aus Datei »%s« auf Zeile %d: %s" + +#: filter.c:241 filter.c:468 +#, c-format +msgid "could not read from filter file \"%s\": %m" +msgstr "konnte nicht aus Filterdatei »%s« lesen: %m" + +#: filter.c:244 +msgid "unexpected end of file" +msgstr "unerwartetes Dateiende" + +#: filter.c:311 +msgid "missing object name pattern" +msgstr "Objektnamenmuster fehlt" + +#: filter.c:422 +msgid "no filter command found (expected \"include\" or \"exclude\")" +msgstr "kein Filterbefehl gefunden (»include« oder »exclude« erwartet)" + +#: filter.c:433 +msgid "invalid filter command (expected \"include\" or \"exclude\")" +msgstr "ungültiger Filterbefehl (»include« oder »exclude« erwartet)" + +#: filter.c:440 +msgid "missing filter object type" +msgstr "Filterobjekttyp fehlt" + +#: filter.c:447 +#, c-format +msgid "unsupported filter object type: \"%.*s\"" +msgstr "nicht unterstützter Filterobjekttyp: »%.*s«" + #: parallel.c:251 #, c-format msgid "%s() failed: error code %d" @@ -567,512 +695,517 @@ msgstr "pgpipe: konnte Socket nicht verbinden: Fehlercode %d" msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: konnte Verbindung nicht annehmen: Fehlercode %d" -#: pg_backup_archiver.c:276 pg_backup_archiver.c:1602 +#: pg_backup_archiver.c:261 pg_backup_archiver.c:1706 #, c-format msgid "could not close output file: %m" msgstr "konnte Ausgabedatei nicht schließen: %m" -#: pg_backup_archiver.c:320 pg_backup_archiver.c:324 +#: pg_backup_archiver.c:305 pg_backup_archiver.c:309 #, c-format msgid "archive items not in correct section order" msgstr "Archivelemente nicht in richtiger Abschnittsreihenfolge" -#: pg_backup_archiver.c:330 +#: pg_backup_archiver.c:315 #, c-format msgid "unexpected section code %d" msgstr "unerwarteter Abschnittscode %d" -#: pg_backup_archiver.c:367 +#: pg_backup_archiver.c:352 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "parallele Wiederherstellung wird von diesem Archivdateiformat nicht unterstützt" -#: pg_backup_archiver.c:371 +#: pg_backup_archiver.c:356 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "parallele Wiederherstellung wird mit Archiven, die mit pg_dump vor 8.0 erstellt worden sind, nicht unterstützt" -#: pg_backup_archiver.c:391 +#: pg_backup_archiver.c:377 #, c-format msgid "cannot restore from compressed archive (%s)" msgstr "kann komprimiertes Archiv nicht wiederherstellen (%s)" -#: pg_backup_archiver.c:411 +#: pg_backup_archiver.c:397 #, c-format msgid "connecting to database for restore" msgstr "verbinde mit der Datenbank zur Wiederherstellung" -#: pg_backup_archiver.c:413 +#: pg_backup_archiver.c:399 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "direkte Datenbankverbindungen sind in Archiven vor Version 1.3 nicht unterstützt" -#: pg_backup_archiver.c:456 +#: pg_backup_archiver.c:442 #, c-format msgid "implied data-only restore" msgstr "implizit werden nur Daten wiederhergestellt" -#: pg_backup_archiver.c:522 +#: pg_backup_archiver.c:510 #, c-format msgid "dropping %s %s" msgstr "entferne %s %s" -#: pg_backup_archiver.c:622 +#: pg_backup_archiver.c:642 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "konnte nicht bestimmen, wo IF EXISTS in die Anweisung »%s« eingefügt werden soll" -#: pg_backup_archiver.c:777 pg_backup_archiver.c:779 +#: pg_backup_archiver.c:828 pg_backup_archiver.c:830 #, c-format msgid "warning from original dump file: %s" msgstr "Warnung aus der ursprünglichen Ausgabedatei: %s" -#: pg_backup_archiver.c:794 +#: pg_backup_archiver.c:864 #, c-format msgid "creating %s \"%s.%s\"" msgstr "erstelle %s »%s.%s«" -#: pg_backup_archiver.c:797 +#: pg_backup_archiver.c:867 #, c-format msgid "creating %s \"%s\"" msgstr "erstelle %s »%s«" -#: pg_backup_archiver.c:847 +#: pg_backup_archiver.c:917 #, c-format msgid "connecting to new database \"%s\"" msgstr "verbinde mit neuer Datenbank »%s«" -#: pg_backup_archiver.c:874 +#: pg_backup_archiver.c:944 #, c-format msgid "processing %s" msgstr "verarbeite %s" -#: pg_backup_archiver.c:896 +#: pg_backup_archiver.c:966 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "verarbeite Daten für Tabelle »%s.%s«" -#: pg_backup_archiver.c:966 +#: pg_backup_archiver.c:1036 #, c-format msgid "executing %s %s" msgstr "führe %s %s aus" -#: pg_backup_archiver.c:1007 +#: pg_backup_archiver.c:1096 #, c-format msgid "disabling triggers for %s" msgstr "schalte Trigger für %s aus" -#: pg_backup_archiver.c:1033 +#: pg_backup_archiver.c:1122 #, c-format msgid "enabling triggers for %s" msgstr "schalte Trigger für %s ein" -#: pg_backup_archiver.c:1098 +#: pg_backup_archiver.c:1187 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "interner Fehler -- WriteData kann nicht außerhalb des Kontexts einer DataDumper-Routine aufgerufen werden" -#: pg_backup_archiver.c:1286 +#: pg_backup_archiver.c:1379 #, c-format msgid "large-object output not supported in chosen format" msgstr "Large-Object-Ausgabe im gewählten Format nicht unterstützt" -#: pg_backup_archiver.c:1344 +#: pg_backup_archiver.c:1442 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "%d Large Object wiederhergestellt" msgstr[1] "%d Large Objects wiederhergestellt" -#: pg_backup_archiver.c:1365 pg_backup_tar.c:668 +#: pg_backup_archiver.c:1469 pg_backup_tar.c:683 #, c-format msgid "restoring large object with OID %u" msgstr "Wiederherstellung von Large Object mit OID %u" -#: pg_backup_archiver.c:1377 +#: pg_backup_archiver.c:1481 #, c-format msgid "could not create large object %u: %s" msgstr "konnte Large Object %u nicht erstellen: %s" -#: pg_backup_archiver.c:1382 pg_dump.c:3718 +#: pg_backup_archiver.c:1486 pg_dump.c:3889 #, c-format msgid "could not open large object %u: %s" msgstr "konnte Large Object %u nicht öffnen: %s" -#: pg_backup_archiver.c:1438 +#: pg_backup_archiver.c:1542 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "konnte Inhaltsverzeichnisdatei »%s« nicht öffnen: %m" -#: pg_backup_archiver.c:1466 +#: pg_backup_archiver.c:1570 #, c-format msgid "line ignored: %s" msgstr "Zeile ignoriert: %s" -#: pg_backup_archiver.c:1473 +#: pg_backup_archiver.c:1577 pg_backup_db.c:609 #, c-format msgid "could not find entry for ID %d" msgstr "konnte Eintrag für ID %d nicht finden" -#: pg_backup_archiver.c:1496 pg_backup_directory.c:221 -#: pg_backup_directory.c:606 +#: pg_backup_archiver.c:1600 pg_backup_directory.c:219 +#: pg_backup_directory.c:613 #, c-format msgid "could not close TOC file: %m" msgstr "konnte Inhaltsverzeichnisdatei nicht schließen: %m" -#: pg_backup_archiver.c:1583 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:593 pg_backup_directory.c:658 -#: pg_backup_directory.c:676 pg_dumpall.c:501 +#: pg_backup_archiver.c:1687 pg_backup_custom.c:152 pg_backup_directory.c:333 +#: pg_backup_directory.c:600 pg_backup_directory.c:666 +#: pg_backup_directory.c:684 pg_dumpall.c:506 #, c-format msgid "could not open output file \"%s\": %m" msgstr "konnte Ausgabedatei »%s« nicht öffnen: %m" -#: pg_backup_archiver.c:1585 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1689 pg_backup_custom.c:158 #, c-format msgid "could not open output file: %m" msgstr "konnte Ausgabedatei nicht öffnen: %m" -#: pg_backup_archiver.c:1668 +#: pg_backup_archiver.c:1772 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" msgstr[0] "%zu Byte Large-Object-Daten geschrieben (Ergebnis = %d)" msgstr[1] "%zu Bytes Large-Object-Daten geschrieben (Ergebnis = %d)" -#: pg_backup_archiver.c:1674 +#: pg_backup_archiver.c:1778 #, c-format msgid "could not write to large object: %s" msgstr "konnte Large Object nicht schreiben: %s" -#: pg_backup_archiver.c:1764 +#: pg_backup_archiver.c:1868 #, c-format msgid "while INITIALIZING:" msgstr "in Phase INITIALIZING:" -#: pg_backup_archiver.c:1769 +#: pg_backup_archiver.c:1873 #, c-format msgid "while PROCESSING TOC:" msgstr "in Phase PROCESSING TOC:" -#: pg_backup_archiver.c:1774 +#: pg_backup_archiver.c:1878 #, c-format msgid "while FINALIZING:" msgstr "in Phase FINALIZING:" -#: pg_backup_archiver.c:1779 +#: pg_backup_archiver.c:1883 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "in Inhaltsverzeichniseintrag %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1855 +#: pg_backup_archiver.c:1959 #, c-format msgid "bad dumpId" msgstr "ungültige DumpId" -#: pg_backup_archiver.c:1876 +#: pg_backup_archiver.c:1980 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "ungültige Tabellen-DumpId für »TABLE DATA«-Eintrag" -#: pg_backup_archiver.c:1968 +#: pg_backup_archiver.c:2072 #, c-format msgid "unexpected data offset flag %d" msgstr "unerwartete Datenoffsetmarkierung %d" -#: pg_backup_archiver.c:1981 +#: pg_backup_archiver.c:2085 #, c-format msgid "file offset in dump file is too large" msgstr "Dateioffset in Dumpdatei ist zu groß" -#: pg_backup_archiver.c:2092 +#: pg_backup_archiver.c:2196 #, c-format msgid "directory name too long: \"%s\"" msgstr "Verzeichnisname zu lang: »%s«" -#: pg_backup_archiver.c:2142 +#: pg_backup_archiver.c:2246 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "Verzeichnis »%s« scheint kein gültiges Archiv zu sein (»toc.dat« existiert nicht)" -#: pg_backup_archiver.c:2150 pg_backup_custom.c:173 pg_backup_custom.c:816 -#: pg_backup_directory.c:206 pg_backup_directory.c:395 +#: pg_backup_archiver.c:2254 pg_backup_custom.c:169 pg_backup_custom.c:812 +#: pg_backup_directory.c:204 pg_backup_directory.c:396 #, c-format msgid "could not open input file \"%s\": %m" msgstr "konnte Eingabedatei »%s« nicht öffnen: %m" -#: pg_backup_archiver.c:2157 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2261 pg_backup_custom.c:175 #, c-format msgid "could not open input file: %m" msgstr "konnte Eingabedatei nicht öffnen: %m" -#: pg_backup_archiver.c:2163 +#: pg_backup_archiver.c:2267 #, c-format msgid "could not read input file: %m" msgstr "konnte Eingabedatei nicht lesen: %m" -#: pg_backup_archiver.c:2165 +#: pg_backup_archiver.c:2269 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "Eingabedatei ist zu kurz (gelesen: %lu, erwartet: 5)" -#: pg_backup_archiver.c:2197 +#: pg_backup_archiver.c:2301 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "Eingabedatei ist anscheinend ein Dump im Textformat. Bitte verwenden Sie psql." -#: pg_backup_archiver.c:2203 +#: pg_backup_archiver.c:2307 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "Eingabedatei scheint kein gültiges Archiv zu sein (zu kurz?)" -#: pg_backup_archiver.c:2209 +#: pg_backup_archiver.c:2313 #, c-format msgid "input file does not appear to be a valid archive" msgstr "Eingabedatei scheint kein gültiges Archiv zu sein" -#: pg_backup_archiver.c:2218 +#: pg_backup_archiver.c:2322 #, c-format msgid "could not close input file: %m" msgstr "konnte Eingabedatei nicht schließen: %m" -#: pg_backup_archiver.c:2296 +#: pg_backup_archiver.c:2401 #, c-format msgid "could not open stdout for appending: %m" msgstr "konnte Standardausgabe nicht zum Anhängen öffnen: %m" -#: pg_backup_archiver.c:2341 +#: pg_backup_archiver.c:2446 #, c-format msgid "unrecognized file format \"%d\"" msgstr "nicht erkanntes Dateiformat »%d«" -#: pg_backup_archiver.c:2422 pg_backup_archiver.c:4445 +#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4648 #, c-format msgid "finished item %d %s %s" msgstr "Element %d %s %s abgeschlossen" -#: pg_backup_archiver.c:2426 pg_backup_archiver.c:4458 +#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4661 #, c-format msgid "worker process failed: exit code %d" msgstr "Arbeitsprozess fehlgeschlagen: Code %d" -#: pg_backup_archiver.c:2547 +#: pg_backup_archiver.c:2653 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "ID %d des Eintrags außerhalb des gültigen Bereichs -- vielleicht ein verfälschtes Inhaltsverzeichnis" -#: pg_backup_archiver.c:2627 +#: pg_backup_archiver.c:2736 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "Wiederherstellung von Tabellen mit WITH OIDS wird nicht mehr unterstützt" -#: pg_backup_archiver.c:2709 +#: pg_backup_archiver.c:2818 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "nicht erkannte Kodierung »%s«" -#: pg_backup_archiver.c:2714 +#: pg_backup_archiver.c:2824 #, c-format msgid "invalid ENCODING item: %s" msgstr "ungültiger ENCODING-Eintrag: %s" -#: pg_backup_archiver.c:2732 +#: pg_backup_archiver.c:2842 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "ungültiger STDSTRINGS-Eintrag: %s" -#: pg_backup_archiver.c:2757 +#: pg_backup_archiver.c:2867 #, c-format msgid "schema \"%s\" not found" msgstr "Schema »%s« nicht gefunden" -#: pg_backup_archiver.c:2764 +#: pg_backup_archiver.c:2874 #, c-format msgid "table \"%s\" not found" msgstr "Tabelle »%s« nicht gefunden" -#: pg_backup_archiver.c:2771 +#: pg_backup_archiver.c:2881 #, c-format msgid "index \"%s\" not found" msgstr "Index »%s« nicht gefunden" -#: pg_backup_archiver.c:2778 +#: pg_backup_archiver.c:2888 #, c-format msgid "function \"%s\" not found" msgstr "Funktion »%s« nicht gefunden" -#: pg_backup_archiver.c:2785 +#: pg_backup_archiver.c:2895 #, c-format msgid "trigger \"%s\" not found" msgstr "Trigger »%s« nicht gefunden" -#: pg_backup_archiver.c:3182 +#: pg_backup_archiver.c:3326 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "konnte Sitzungsbenutzer nicht auf »%s« setzen: %s" -#: pg_backup_archiver.c:3314 +#: pg_backup_archiver.c:3458 #, c-format -msgid "could not set search_path to \"%s\": %s" -msgstr "konnte search_path nicht auf »%s« setzen: %s" +msgid "could not set \"search_path\" to \"%s\": %s" +msgstr "konnte »search_path« nicht auf »%s« setzen: %s" -#: pg_backup_archiver.c:3375 +#: pg_backup_archiver.c:3519 #, c-format -msgid "could not set default_tablespace to %s: %s" -msgstr "konnte default_tablespace nicht auf »%s« setzen: %s" +msgid "could not set \"default_tablespace\" to %s: %s" +msgstr "konnte »default_tablespace« nicht auf »%s« setzen: %s" -#: pg_backup_archiver.c:3424 +#: pg_backup_archiver.c:3568 #, c-format -msgid "could not set default_table_access_method: %s" -msgstr "konnte default_table_access_method nicht setzen: %s" +msgid "could not set \"default_table_access_method\": %s" +msgstr "konnte »default_table_access_method« nicht setzen: %s" -#: pg_backup_archiver.c:3528 +#: pg_backup_archiver.c:3617 +#, c-format +msgid "could not alter table access method: %s" +msgstr "konnte Tabellenzugriffsmethode nicht ändern: %s" + +#: pg_backup_archiver.c:3718 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "kann Eigentümer für Objekttyp »%s« nicht setzen" -#: pg_backup_archiver.c:3749 +#: pg_backup_archiver.c:4005 #, c-format msgid "did not find magic string in file header" msgstr "magische Zeichenkette im Dateikopf nicht gefunden" -#: pg_backup_archiver.c:3763 +#: pg_backup_archiver.c:4019 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "nicht unterstützte Version (%d.%d) im Dateikopf" -#: pg_backup_archiver.c:3768 +#: pg_backup_archiver.c:4024 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "Prüfung der Integer-Größe (%lu) fehlgeschlagen" -#: pg_backup_archiver.c:3772 +#: pg_backup_archiver.c:4028 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "Archiv wurde auf einer Maschine mit größeren Integers erstellt; einige Operationen könnten fehlschlagen" -#: pg_backup_archiver.c:3782 +#: pg_backup_archiver.c:4038 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "erwartetes Format (%d) ist nicht das gleiche wie das in der Datei gefundene (%d)" -#: pg_backup_archiver.c:3804 +#: pg_backup_archiver.c:4060 #, c-format msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available" msgstr "Archiv ist komprimiert, aber diese Installation unterstützt keine Komprimierung (%s) -- keine Daten verfügbar" -#: pg_backup_archiver.c:3840 +#: pg_backup_archiver.c:4096 #, c-format msgid "invalid creation date in header" msgstr "ungültiges Erstellungsdatum im Kopf" -#: pg_backup_archiver.c:3974 +#: pg_backup_archiver.c:4230 #, c-format msgid "processing item %d %s %s" msgstr "verarbeite Element %d %s %s" -#: pg_backup_archiver.c:4049 +#: pg_backup_archiver.c:4315 #, c-format msgid "entering main parallel loop" msgstr "Eintritt in Hauptparallelschleife" -#: pg_backup_archiver.c:4060 +#: pg_backup_archiver.c:4326 #, c-format msgid "skipping item %d %s %s" msgstr "Element %d %s %s wird übersprungen" -#: pg_backup_archiver.c:4069 +#: pg_backup_archiver.c:4335 #, c-format msgid "launching item %d %s %s" msgstr "starte Element %d %s %s" -#: pg_backup_archiver.c:4123 +#: pg_backup_archiver.c:4389 #, c-format msgid "finished main parallel loop" msgstr "Hauptparallelschleife beendet" -#: pg_backup_archiver.c:4159 +#: pg_backup_archiver.c:4425 #, c-format msgid "processing missed item %d %s %s" msgstr "verarbeite verpasstes Element %d %s %s" -#: pg_backup_archiver.c:4764 +#: pg_backup_archiver.c:4967 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "Tabelle »%s« konnte nicht erzeugt werden, ihre Daten werden nicht wiederhergestellt werden" -#: pg_backup_custom.c:380 pg_backup_null.c:147 +#: pg_backup_custom.c:376 pg_backup_null.c:143 #, c-format msgid "invalid OID for large object" msgstr "ungültige OID für Large Object" -#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640 -#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019 +#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:636 +#: pg_backup_custom.c:870 pg_backup_tar.c:1029 pg_backup_tar.c:1034 #, c-format msgid "error during file seek: %m" msgstr "Fehler beim Suchen in Datei: %m" -#: pg_backup_custom.c:484 +#: pg_backup_custom.c:480 #, c-format msgid "data block %d has wrong seek position" msgstr "Datenblock %d hat falsche Seek-Position" -#: pg_backup_custom.c:501 +#: pg_backup_custom.c:497 #, c-format msgid "unrecognized data block type (%d) while searching archive" msgstr "unerkannter Datenblocktyp (%d) beim Suchen im Archiv gefunden" -#: pg_backup_custom.c:523 +#: pg_backup_custom.c:519 #, c-format msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file" msgstr "konnte Block-ID %d nicht im Archiv finden -- möglicherweise wegen Wiederherstellung außer der Reihe, was nicht möglich ist, weil die Eingabedatei kein Suchen unterstützt" -#: pg_backup_custom.c:528 +#: pg_backup_custom.c:524 #, c-format msgid "could not find block ID %d in archive -- possibly corrupt archive" msgstr "konnte Block-ID %d nicht im Archiv finden -- möglicherweise beschädigtes Archiv" -#: pg_backup_custom.c:535 +#: pg_backup_custom.c:531 #, c-format msgid "found unexpected block ID (%d) when reading data -- expected %d" msgstr "unerwartete Block-ID (%d) beim Lesen der Daten gefunden -- erwartet wurde %d" -#: pg_backup_custom.c:549 +#: pg_backup_custom.c:545 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "unerkannter Datenblocktyp %d beim Wiederherstellen des Archivs gefunden" -#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952 -#: pg_backup_tar.c:1017 +#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:945 +#: pg_backup_tar.c:1032 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "konnte Positionszeiger in Archivdatei nicht ermitteln: %m" -#: pg_backup_custom.c:771 pg_backup_custom.c:811 +#: pg_backup_custom.c:767 pg_backup_custom.c:807 #, c-format msgid "could not close archive file: %m" msgstr "konnte Archivdatei nicht schließen: %m" -#: pg_backup_custom.c:794 +#: pg_backup_custom.c:790 #, c-format msgid "can only reopen input archives" msgstr "nur Eingabearchive können neu geöffnet werden" -#: pg_backup_custom.c:801 +#: pg_backup_custom.c:797 #, c-format msgid "parallel restore from standard input is not supported" msgstr "parallele Wiederherstellung aus der Standardeingabe wird nicht unterstützt" -#: pg_backup_custom.c:803 +#: pg_backup_custom.c:799 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "parallele Wiederherstellung aus einer Datei, die kein Suchen ermöglicht, wird nicht unterstützt" -#: pg_backup_custom.c:819 +#: pg_backup_custom.c:815 #, c-format msgid "could not set seek position in archive file: %m" msgstr "konnte Positionszeiger in Archivdatei nicht setzen: %m" -#: pg_backup_custom.c:898 +#: pg_backup_custom.c:894 #, c-format msgid "compressor active" msgstr "Kompressor ist aktiv" @@ -1082,12 +1215,12 @@ msgstr "Kompressor ist aktiv" msgid "could not get server_version from libpq" msgstr "konnte server_version nicht von libpq ermitteln" -#: pg_backup_db.c:53 pg_dumpall.c:1809 +#: pg_backup_db.c:53 pg_dumpall.c:1879 #, c-format msgid "aborting because of server version mismatch" msgstr "Abbruch wegen unpassender Serverversion" -#: pg_backup_db.c:54 pg_dumpall.c:1810 +#: pg_backup_db.c:54 pg_dumpall.c:1880 #, c-format msgid "server version: %s; %s version: %s" msgstr "Version des Servers: %s; Version von %s: %s" @@ -1097,7 +1230,7 @@ msgstr "Version des Servers: %s; Version von %s: %s" msgid "already connected to a database" msgstr "bereits mit einer Datenbank verbunden" -#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1726 pg_dumpall.c:1828 msgid "Password: " msgstr "Passwort: " @@ -1111,18 +1244,18 @@ msgstr "konnte nicht mit der Datenbank verbinden" msgid "reconnection failed: %s" msgstr "Wiederverbindung fehlgeschlagen: %s" -#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dumpall.c:1683 -#: pg_dumpall.c:1767 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:788 pg_dump_sort.c:1213 +#: pg_dump_sort.c:1233 pg_dumpall.c:1753 pg_dumpall.c:1837 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895 +#: pg_backup_db.c:271 pg_dumpall.c:1942 pg_dumpall.c:1965 #, c-format msgid "query failed: %s" msgstr "Anfrage fehlgeschlagen: %s" -#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896 +#: pg_backup_db.c:273 pg_dumpall.c:1943 pg_dumpall.c:1966 #, c-format msgid "Query was: %s" msgstr "Anfrage war: %s" @@ -1158,7 +1291,7 @@ msgstr "Fehler in PQputCopyEnd: %s" msgid "COPY failed for table \"%s\": %s" msgstr "COPY fehlgeschlagen für Tabelle »%s«: %s" -#: pg_backup_db.c:521 pg_dump.c:2202 +#: pg_backup_db.c:521 pg_dump.c:2284 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "unerwartete zusätzliche Ergebnisse während COPY von Tabelle »%s«" @@ -1171,161 +1304,156 @@ msgstr "konnte Datenbanktransaktion nicht starten" msgid "could not commit database transaction" msgstr "konnte Datenbanktransaktion nicht beenden" -#: pg_backup_directory.c:155 +#: pg_backup_directory.c:153 #, c-format msgid "no output directory specified" msgstr "kein Ausgabeverzeichnis angegeben" -#: pg_backup_directory.c:184 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "konnte Verzeichnis »%s« nicht lesen: %m" - -#: pg_backup_directory.c:188 +#: pg_backup_directory.c:186 #, c-format msgid "could not close directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht schließen: %m" -#: pg_backup_directory.c:194 +#: pg_backup_directory.c:192 #, c-format msgid "could not create directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" -#: pg_backup_directory.c:356 pg_backup_directory.c:499 -#: pg_backup_directory.c:537 +#: pg_backup_directory.c:357 pg_backup_directory.c:506 +#: pg_backup_directory.c:544 #, c-format msgid "could not write to output file: %s" msgstr "konnte nicht in Ausgabedatei schreiben: %s" -#: pg_backup_directory.c:374 +#: pg_backup_directory.c:375 #, c-format msgid "could not close data file: %m" msgstr "konnte Datendatei nicht schließen: %m" -#: pg_backup_directory.c:407 +#: pg_backup_directory.c:408 #, c-format msgid "could not close data file \"%s\": %m" msgstr "konnte Datendatei »%s« nicht schließen: %m" -#: pg_backup_directory.c:448 +#: pg_backup_directory.c:455 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "konnte Large-Object-Inhaltsverzeichnisdatei »%s« nicht zur Eingabe öffnen: %m" -#: pg_backup_directory.c:459 +#: pg_backup_directory.c:466 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "ungültige Zeile in Large-Object-Inhaltsverzeichnisdatei »%s«: %s" -#: pg_backup_directory.c:468 +#: pg_backup_directory.c:475 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "Fehler beim Lesen von Large-Object-Inhaltsverzeichnisdatei »%s«" -#: pg_backup_directory.c:472 +#: pg_backup_directory.c:479 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "konnte Large-Object-Inhaltsverzeichnisdatei »%s« nicht schließen: %m" -#: pg_backup_directory.c:694 +#: pg_backup_directory.c:702 #, c-format msgid "could not close LO data file: %m" msgstr "konnte LO-Datendatei nicht schließen: %m" -#: pg_backup_directory.c:704 +#: pg_backup_directory.c:712 #, c-format msgid "could not write to LOs TOC file: %s" msgstr "konnte nicht in LOs-Inhaltsverzeichnisdatei schreiben: %s" -#: pg_backup_directory.c:720 +#: pg_backup_directory.c:728 #, c-format msgid "could not close LOs TOC file: %m" msgstr "konnte LOs-Inhaltsverzeichnisdatei nicht schließen: %m" -#: pg_backup_directory.c:739 +#: pg_backup_directory.c:747 #, c-format msgid "file name too long: \"%s\"" msgstr "Dateiname zu lang: »%s«" -#: pg_backup_null.c:74 +#: pg_backup_null.c:70 #, c-format msgid "this format cannot be read" msgstr "dieses Format kann nicht gelesen werden" -#: pg_backup_tar.c:172 +#: pg_backup_tar.c:168 #, c-format msgid "could not open TOC file \"%s\" for output: %m" msgstr "konnte Inhaltsverzeichnisdatei »%s« nicht zur Ausgabe öffnen: %m" -#: pg_backup_tar.c:179 +#: pg_backup_tar.c:175 #, c-format msgid "could not open TOC file for output: %m" msgstr "konnte Inhaltsverzeichnisdatei nicht zur Ausgabe öffnen: %m" -#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 -#: pg_backup_tar.c:405 pg_backup_tar.c:891 +#: pg_backup_tar.c:194 pg_backup_tar.c:330 pg_backup_tar.c:385 +#: pg_backup_tar.c:401 pg_backup_tar.c:906 #, c-format msgid "compression is not supported by tar archive format" msgstr "Komprimierung ist im Tar-Format nicht unterstützt" -#: pg_backup_tar.c:206 +#: pg_backup_tar.c:202 #, c-format msgid "could not open TOC file \"%s\" for input: %m" msgstr "konnte Inhaltsverzeichnisdatei »%s« nicht zur Eingabe öffnen: %m" -#: pg_backup_tar.c:213 +#: pg_backup_tar.c:209 #, c-format msgid "could not open TOC file for input: %m" msgstr "konnte Inhaltsverzeichnisdatei nicht zur Eingabe öffnen: %m" -#: pg_backup_tar.c:322 +#: pg_backup_tar.c:318 #, c-format msgid "could not find file \"%s\" in archive" msgstr "konnte Datei »%s« nicht im Archiv finden" -#: pg_backup_tar.c:382 +#: pg_backup_tar.c:378 #, c-format msgid "could not generate temporary file name: %m" msgstr "konnte keine temporären Dateinamen erzeugen: %m" -#: pg_backup_tar.c:623 +#: pg_backup_tar.c:619 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "unerwartete Syntax der COPY-Anweisung: »%s«" -#: pg_backup_tar.c:888 +#: pg_backup_tar.c:903 #, c-format msgid "invalid OID for large object (%u)" msgstr "Large Object hat ungültige OID (%u)" -#: pg_backup_tar.c:1033 +#: pg_backup_tar.c:1048 #, c-format msgid "could not close temporary file: %m" msgstr "konnte temporäre Datei nicht schließen: %m" -#: pg_backup_tar.c:1036 +#: pg_backup_tar.c:1051 #, c-format msgid "actual file length (%lld) does not match expected (%lld)" msgstr "tatsächliche Dateilänge (%lld) stimmt nicht mit erwarteter Länge (%lld) überein" -#: pg_backup_tar.c:1082 pg_backup_tar.c:1113 +#: pg_backup_tar.c:1097 pg_backup_tar.c:1128 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "konnte Kopf für Datei »%s« im Tar-Archiv nicht finden" -#: pg_backup_tar.c:1100 +#: pg_backup_tar.c:1115 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "Ausgabe der Daten in anderer Reihenfolge wird in diesem Archivformat nicht unterstützt: »%s« wird benötigt, aber es kommt vor »%s« in der Archivdatei." -#: pg_backup_tar.c:1147 +#: pg_backup_tar.c:1162 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "unvollständiger Tar-Dateikopf gefunden (%lu Byte)" msgstr[1] "unvollständiger Tar-Dateikopf gefunden (%lu Bytes)" -#: pg_backup_tar.c:1186 +#: pg_backup_tar.c:1201 #, c-format msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" msgstr "beschädigter Tar-Kopf in %s gefunden (%d erwartet, %d berechnet), Dateiposition %llu" @@ -1335,10 +1463,10 @@ msgstr "beschädigter Tar-Kopf in %s gefunden (%d erwartet, %d berechnet), Datei msgid "unrecognized section name: \"%s\"" msgstr "unbekannter Abschnittsname: »%s«" -#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365 -#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398 -#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307 -#: pg_restore.c:321 +#: pg_backup_utils.c:55 pg_dump.c:694 pg_dump.c:711 pg_dumpall.c:370 +#: pg_dumpall.c:380 pg_dumpall.c:388 pg_dumpall.c:396 pg_dumpall.c:403 +#: pg_dumpall.c:413 pg_dumpall.c:488 pg_restore.c:307 pg_restore.c:323 +#: pg_restore.c:337 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." @@ -1348,82 +1476,82 @@ msgstr "Versuchen Sie »%s --help« für weitere Informationen." msgid "out of on_exit_nicely slots" msgstr "on_exit_nicely-Slots aufgebraucht" -#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305 +#: pg_dump.c:709 pg_dumpall.c:378 pg_restore.c:321 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_dump.c:696 pg_restore.c:328 +#: pg_dump.c:728 pg_restore.c:344 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "Optionen -s/--schema-only und -a/--data-only können nicht zusammen verwendet werden" -#: pg_dump.c:699 +#: pg_dump.c:731 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "Optionen -s/--schema-only und --include-foreign-data können nicht zusammen verwendet werden" -#: pg_dump.c:702 +#: pg_dump.c:734 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "Option --include-foreign-data wird nicht mit paralleler Sicherung unterstützt" -#: pg_dump.c:705 pg_restore.c:331 +#: pg_dump.c:737 pg_restore.c:347 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "Optionen -c/--clean und -a/--data-only können nicht zusammen verwendet werden" -#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356 +#: pg_dump.c:740 pg_dumpall.c:408 pg_restore.c:375 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "Option --if-exists benötigt Option -c/--clean" -#: pg_dump.c:715 +#: pg_dump.c:747 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "Option --on-conflict-do-nothing benötigt Option --inserts, --rows-per-insert oder --column-inserts" -#: pg_dump.c:744 +#: pg_dump.c:776 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "unbekannter Komprimierungsalgorithmus: »%s«" -#: pg_dump.c:751 +#: pg_dump.c:783 #, c-format msgid "invalid compression specification: %s" msgstr "ungültige Komprimierungsangabe: %s" -#: pg_dump.c:764 +#: pg_dump.c:796 #, c-format msgid "compression option \"%s\" is not currently supported by pg_dump" msgstr "Komprimierungsoption »%s« wird aktuell von pg_dump nicht unterstützt" -#: pg_dump.c:776 +#: pg_dump.c:808 #, c-format msgid "parallel backup only supported by the directory format" msgstr "parallele Sicherung wird nur vom Ausgabeformat »Verzeichnis« unterstützt" -#: pg_dump.c:822 +#: pg_dump.c:854 #, c-format msgid "last built-in OID is %u" msgstr "letzte eingebaute OID ist %u" -#: pg_dump.c:831 +#: pg_dump.c:863 #, c-format msgid "no matching schemas were found" msgstr "keine passenden Schemas gefunden" -#: pg_dump.c:848 +#: pg_dump.c:880 #, c-format msgid "no matching tables were found" msgstr "keine passenden Tabellen gefunden" -#: pg_dump.c:876 +#: pg_dump.c:908 #, c-format msgid "no matching extensions were found" msgstr "keine passenden Erweiterungen gefunden" -#: pg_dump.c:1056 +#: pg_dump.c:1092 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1432,17 +1560,17 @@ msgstr "" "%s gibt eine Datenbank als Textdatei oder in anderen Formaten aus.\n" "\n" -#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433 +#: pg_dump.c:1093 pg_dumpall.c:636 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_dump.c:1058 +#: pg_dump.c:1094 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436 +#: pg_dump.c:1096 pg_dumpall.c:639 pg_restore.c:455 #, c-format msgid "" "\n" @@ -1451,12 +1579,12 @@ msgstr "" "\n" "Allgemeine Optionen:\n" -#: pg_dump.c:1061 +#: pg_dump.c:1097 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=DATEINAME Name der Ausgabedatei oder des -verzeichnisses\n" -#: pg_dump.c:1062 +#: pg_dump.c:1098 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1465,22 +1593,22 @@ msgstr "" " -F, --format=c|d|t|p Ausgabeformat (custom, d=Verzeichnis, tar,\n" " plain text)\n" -#: pg_dump.c:1064 +#: pg_dump.c:1100 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM so viele parallele Jobs zur Sicherung verwenden\n" -#: pg_dump.c:1065 pg_dumpall.c:635 +#: pg_dump.c:1101 pg_dumpall.c:641 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose »Verbose«-Modus\n" -#: pg_dump.c:1066 pg_dumpall.c:636 +#: pg_dump.c:1102 pg_dumpall.c:642 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_dump.c:1067 +#: pg_dump.c:1103 #, c-format msgid "" " -Z, --compress=METHOD[:DETAIL]\n" @@ -1489,24 +1617,31 @@ msgstr "" " -Z, --compress=METHODE[:DETAIL]\n" " wie angegeben komprimieren\n" -#: pg_dump.c:1069 pg_dumpall.c:637 +#: pg_dump.c:1105 pg_dumpall.c:643 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=ZEIT Abbruch nach ZEIT Warten auf Tabellensperre\n" -#: pg_dump.c:1070 pg_dumpall.c:664 +#: pg_dump.c:1106 pg_dumpall.c:671 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " --no-sync nicht warten, bis Änderungen sicher auf\n" " Festplatte geschrieben sind\n" -#: pg_dump.c:1071 pg_dumpall.c:638 +#: pg_dump.c:1107 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr "" +" --sync-method=METHODE Methode zum Synchronisieren von Dateien auf\n" +" Festplatte setzen\n" + +#: pg_dump.c:1108 pg_dumpall.c:644 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_dump.c:1073 pg_dumpall.c:639 +#: pg_dump.c:1110 pg_dumpall.c:645 #, c-format msgid "" "\n" @@ -1515,64 +1650,64 @@ msgstr "" "\n" "Optionen die den Inhalt der Ausgabe kontrollieren:\n" -#: pg_dump.c:1074 pg_dumpall.c:640 +#: pg_dump.c:1111 pg_dumpall.c:646 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only nur Daten ausgeben, nicht das Schema\n" -#: pg_dump.c:1075 +#: pg_dump.c:1112 #, c-format msgid " -b, --large-objects include large objects in dump\n" msgstr " -b, --large-objects Large Objects mit ausgeben\n" -#: pg_dump.c:1076 +#: pg_dump.c:1113 #, c-format msgid " --blobs (same as --large-objects, deprecated)\n" msgstr " --blobs (gleich --large-objects, veraltet)\n" -#: pg_dump.c:1077 +#: pg_dump.c:1114 #, c-format msgid " -B, --no-large-objects exclude large objects in dump\n" msgstr " -B, --no-large-objects Large Objects nicht mit ausgeben\n" -#: pg_dump.c:1078 +#: pg_dump.c:1115 #, c-format msgid " --no-blobs (same as --no-large-objects, deprecated)\n" msgstr " --no-blobs (gleich --no-large-objects, veraltet)\n" -#: pg_dump.c:1079 pg_restore.c:447 +#: pg_dump.c:1116 pg_restore.c:466 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean Datenbankobjekte vor der Wiedererstellung löschen\n" -#: pg_dump.c:1080 +#: pg_dump.c:1117 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr "" " -C, --create Anweisungen zum Erstellen der Datenbank in\n" " Ausgabe einfügen\n" -#: pg_dump.c:1081 +#: pg_dump.c:1118 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr " -e, --extension=MUSTER nur die angegebene(n) Erweiterung(en) ausgeben\n" -#: pg_dump.c:1082 pg_dumpall.c:642 +#: pg_dump.c:1119 pg_dumpall.c:648 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=KODIERUNG Daten in Kodierung KODIERUNG ausgeben\n" -#: pg_dump.c:1083 +#: pg_dump.c:1120 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=MUSTER nur das/die angegebene(n) Schema(s) ausgeben\n" -#: pg_dump.c:1084 +#: pg_dump.c:1121 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=MUSTER das/die angegebene(n) Schema(s) NICHT ausgeben\n" -#: pg_dump.c:1085 +#: pg_dump.c:1122 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1581,58 +1716,58 @@ msgstr "" " -O, --no-owner Wiederherstellung der Objekteigentümerschaft im\n" " »plain text«-Format auslassen\n" -#: pg_dump.c:1087 pg_dumpall.c:646 +#: pg_dump.c:1124 pg_dumpall.c:652 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only nur das Schema, nicht die Daten, ausgeben\n" -#: pg_dump.c:1088 +#: pg_dump.c:1125 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr " -S, --superuser=NAME Superusername für »plain text«-Format\n" -#: pg_dump.c:1089 +#: pg_dump.c:1126 #, c-format msgid " -t, --table=PATTERN dump only the specified table(s)\n" msgstr " -t, --table=MUSTER nur die angegebene(n) Tabelle(n) ausgeben\n" -#: pg_dump.c:1090 +#: pg_dump.c:1127 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=MUSTER die angegebene(n) Tabelle(n) NICHT ausgeben\n" -#: pg_dump.c:1091 pg_dumpall.c:649 +#: pg_dump.c:1128 pg_dumpall.c:655 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges Zugriffsprivilegien (grant/revoke) nicht ausgeben\n" -#: pg_dump.c:1092 pg_dumpall.c:650 +#: pg_dump.c:1129 pg_dumpall.c:656 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade wird nur von Upgrade-Programmen verwendet\n" -#: pg_dump.c:1093 pg_dumpall.c:651 +#: pg_dump.c:1130 pg_dumpall.c:657 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr "" " --column-inserts Daten als INSERT-Anweisungen mit Spaltennamen\n" " ausgeben\n" -#: pg_dump.c:1094 pg_dumpall.c:652 +#: pg_dump.c:1131 pg_dumpall.c:658 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr "" " --disable-dollar-quoting Dollar-Quoting abschalten, normales SQL-Quoting\n" " verwenden\n" -#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464 +#: pg_dump.c:1132 pg_dumpall.c:659 pg_restore.c:483 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr "" " --disable-triggers Trigger während der Datenwiederherstellung\n" " abschalten\n" -#: pg_dump.c:1096 +#: pg_dump.c:1133 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" @@ -1641,7 +1776,12 @@ msgstr "" " --enable-row-security Sicherheit auf Zeilenebene einschalten (nur Daten\n" " ausgeben, auf die der Benutzer Zugriff hat)\n" -#: pg_dump.c:1098 +#: pg_dump.c:1135 +#, c-format +msgid " --exclude-extension=PATTERN do NOT dump the specified extension(s)\n" +msgstr " --exclude-extension=MUSTER die angegebene(n) Erweiterung(en) NICHT ausgeben\n" + +#: pg_dump.c:1136 #, c-format msgid "" " --exclude-table-and-children=PATTERN\n" @@ -1652,12 +1792,12 @@ msgstr "" " die angegebene(n) Tabelle(n) NICHT ausgeben,\n" " einschließlich abgeleiteter und Partitionstabellen\n" -#: pg_dump.c:1101 +#: pg_dump.c:1139 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=MUSTER Daten der angegebenen Tabelle(n) NICHT ausgeben\n" -#: pg_dump.c:1102 +#: pg_dump.c:1140 #, c-format msgid "" " --exclude-table-data-and-children=PATTERN\n" @@ -1668,17 +1808,26 @@ msgstr "" " Daten der angegebenen Tabelle(n) NICHT ausgeben,\n" " einschließlich abgeleiteter und Partitionstabellen\n" -#: pg_dump.c:1105 pg_dumpall.c:655 +#: pg_dump.c:1143 pg_dumpall.c:661 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=ZAHL Einstellung für extra_float_digits\n" -#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466 +#: pg_dump.c:1144 +#, c-format +msgid "" +" --filter=FILENAME include or exclude objects and data from dump\n" +" based on expressions in FILENAME\n" +msgstr "" +" --filter=DATEINAME Objekte und Daten basierend auf Ausdrücken in DATEINAME\n" +" mit sichern oder überspringen\n" + +#: pg_dump.c:1146 pg_dumpall.c:663 pg_restore.c:487 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists IF EXISTS verwenden, wenn Objekte gelöscht werden\n" -#: pg_dump.c:1107 +#: pg_dump.c:1147 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1689,91 +1838,91 @@ msgstr "" " Daten von Fremdtabellen auf Fremdservern, die\n" " mit MUSTER übereinstimmen, mit sichern\n" -#: pg_dump.c:1110 pg_dumpall.c:657 +#: pg_dump.c:1150 pg_dumpall.c:664 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts Daten als INSERT-Anweisungen statt COPY ausgeben\n" -#: pg_dump.c:1111 pg_dumpall.c:658 +#: pg_dump.c:1151 pg_dumpall.c:665 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root Partitionen über die Wurzeltabelle laden\n" -#: pg_dump.c:1112 pg_dumpall.c:659 +#: pg_dump.c:1152 pg_dumpall.c:666 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments Kommentare nicht ausgeben\n" -#: pg_dump.c:1113 pg_dumpall.c:660 +#: pg_dump.c:1153 pg_dumpall.c:667 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications Publikationen nicht ausgeben\n" -#: pg_dump.c:1114 pg_dumpall.c:662 +#: pg_dump.c:1154 pg_dumpall.c:669 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels Security-Label-Zuweisungen nicht ausgeben\n" -#: pg_dump.c:1115 pg_dumpall.c:663 +#: pg_dump.c:1155 pg_dumpall.c:670 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions Subskriptionen nicht ausgeben\n" -#: pg_dump.c:1116 pg_dumpall.c:665 +#: pg_dump.c:1156 pg_dumpall.c:672 #, c-format msgid " --no-table-access-method do not dump table access methods\n" msgstr " --no-table-access-method Tabellenzugriffsmethoden nicht ausgeben\n" -#: pg_dump.c:1117 pg_dumpall.c:666 +#: pg_dump.c:1157 pg_dumpall.c:673 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces Tablespace-Zuordnungen nicht ausgeben\n" -#: pg_dump.c:1118 pg_dumpall.c:667 +#: pg_dump.c:1158 pg_dumpall.c:674 #, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" msgstr " --no-toast-compression TOAST-Komprimierungsmethoden nicht ausgeben\n" -#: pg_dump.c:1119 pg_dumpall.c:668 +#: pg_dump.c:1159 pg_dumpall.c:675 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data Daten in ungeloggten Tabellen nicht ausgeben\n" -#: pg_dump.c:1120 pg_dumpall.c:669 +#: pg_dump.c:1160 pg_dumpall.c:676 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr " --on-conflict-do-nothing INSERT-Befehle mit ON CONFLICT DO NOTHING ausgeben\n" -#: pg_dump.c:1121 pg_dumpall.c:670 +#: pg_dump.c:1161 pg_dumpall.c:677 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr "" " --quote-all-identifiers alle Bezeichner in Anführungszeichen, selbst wenn\n" " kein Schlüsselwort\n" -#: pg_dump.c:1122 pg_dumpall.c:671 +#: pg_dump.c:1162 pg_dumpall.c:678 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=ANZAHL Anzahl Zeilen pro INSERT; impliziert --inserts\n" -#: pg_dump.c:1123 +#: pg_dump.c:1163 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr "" " --section=ABSCHNITT angegebenen Abschnitt ausgeben (pre-data, data\n" " oder post-data)\n" -#: pg_dump.c:1124 +#: pg_dump.c:1164 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr " --serializable-deferrable warten bis der Dump ohne Anomalien laufen kann\n" -#: pg_dump.c:1125 +#: pg_dump.c:1165 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT angegebenen Snapshot für den Dump verwenden\n" -#: pg_dump.c:1126 pg_restore.c:476 +#: pg_dump.c:1166 pg_restore.c:497 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" @@ -1782,7 +1931,7 @@ msgstr "" " --strict-names Tabellen- oder Schemamuster müssen auf mindestens\n" " je ein Objekt passen\n" -#: pg_dump.c:1128 +#: pg_dump.c:1168 #, c-format msgid "" " --table-and-children=PATTERN dump only the specified table(s), including\n" @@ -1791,7 +1940,7 @@ msgstr "" " --table-and-children=MUSTER nur die angegebene(n) Tabelle(n) ausgeben,\n" " einschließlich abgeleiteter und Partitionstabellen\n" -#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478 +#: pg_dump.c:1170 pg_dumpall.c:679 pg_restore.c:500 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1803,7 +1952,7 @@ msgstr "" " OWNER Befehle verwenden, um Eigentümerschaft zu\n" " setzen\n" -#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482 +#: pg_dump.c:1174 pg_dumpall.c:683 pg_restore.c:504 #, c-format msgid "" "\n" @@ -1812,42 +1961,42 @@ msgstr "" "\n" "Verbindungsoptionen:\n" -#: pg_dump.c:1135 +#: pg_dump.c:1175 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAME auszugebende Datenbank\n" -#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483 +#: pg_dump.c:1176 pg_dumpall.c:685 pg_restore.c:505 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484 +#: pg_dump.c:1177 pg_dumpall.c:687 pg_restore.c:506 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT Portnummer des Datenbankservers\n" -#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485 +#: pg_dump.c:1178 pg_dumpall.c:688 pg_restore.c:507 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486 +#: pg_dump.c:1179 pg_dumpall.c:689 pg_restore.c:508 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487 +#: pg_dump.c:1180 pg_dumpall.c:690 pg_restore.c:509 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n" -#: pg_dump.c:1141 pg_dumpall.c:684 +#: pg_dump.c:1181 pg_dumpall.c:691 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLLENNAME vor der Ausgabe SET ROLE ausführen\n" -#: pg_dump.c:1143 +#: pg_dump.c:1183 #, c-format msgid "" "\n" @@ -1860,530 +2009,537 @@ msgstr "" "PGDATABASE verwendet.\n" "\n" -#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494 +#: pg_dump.c:1185 pg_dumpall.c:695 pg_restore.c:516 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Berichten Sie Fehler an <%s>.\n" -#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495 +#: pg_dump.c:1186 pg_dumpall.c:696 pg_restore.c:517 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_dump.c:1165 pg_dumpall.c:513 +#: pg_dump.c:1205 pg_dumpall.c:518 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "ungültige Clientkodierung »%s« angegeben" -#: pg_dump.c:1303 +#: pg_dump.c:1353 #, c-format msgid "parallel dumps from standby servers are not supported by this server version" msgstr "parallele Dumps von Standby-Servern werden von dieser Serverversion nicht unterstützt" -#: pg_dump.c:1368 +#: pg_dump.c:1418 #, c-format msgid "invalid output format \"%s\" specified" msgstr "ungültiges Ausgabeformat »%s« angegeben" -#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449 +#: pg_dump.c:1459 pg_dump.c:1515 pg_dump.c:1568 pg_dumpall.c:1516 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "falscher qualifizierter Name (zu viele Namensteile): %s" -#: pg_dump.c:1417 +#: pg_dump.c:1467 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "keine passenden Schemas für Muster »%s« gefunden" -#: pg_dump.c:1470 +#: pg_dump.c:1520 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "keine passenden Erweiterungen für Muster »%s« gefunden" -#: pg_dump.c:1523 +#: pg_dump.c:1573 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "keine passenden Fremdserver für Muster »%s« gefunden" -#: pg_dump.c:1594 +#: pg_dump.c:1644 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "falscher Relationsname (zu viele Namensteile): %s" -#: pg_dump.c:1616 +#: pg_dump.c:1666 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "keine passenden Tabellen für Muster »%s« gefunden" -#: pg_dump.c:1643 +#: pg_dump.c:1693 #, c-format msgid "You are currently not connected to a database." msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden." -#: pg_dump.c:1646 +#: pg_dump.c:1696 #, c-format msgid "cross-database references are not implemented: %s" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s" -#: pg_dump.c:2077 +#: pg_dump.c:2155 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "gebe Inhalt der Tabelle »%s.%s« aus" -#: pg_dump.c:2183 +#: pg_dump.c:2265 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Ausgabe des Inhalts der Tabelle »%s« fehlgeschlagen: PQgetCopyData() fehlgeschlagen." -#: pg_dump.c:2184 pg_dump.c:2194 +#: pg_dump.c:2266 pg_dump.c:2276 #, c-format msgid "Error message from server: %s" msgstr "Fehlermeldung vom Server: %s" -#: pg_dump.c:2185 pg_dump.c:2195 +#: pg_dump.c:2267 pg_dump.c:2277 #, c-format msgid "Command was: %s" msgstr "Die Anweisung war: %s" -#: pg_dump.c:2193 +#: pg_dump.c:2275 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Ausgabe des Inhalts der Tabelle »%s« fehlgeschlagen: PQgetResult() fehlgeschlagen." -#: pg_dump.c:2275 +#: pg_dump.c:2366 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "falsche Anzahl Felder von Tabelle »%s« erhalten" -#: pg_dump.c:2973 +#: pg_dump.c:3068 #, c-format msgid "saving database definition" msgstr "sichere Datenbankdefinition" -#: pg_dump.c:3078 +#: pg_dump.c:3177 #, c-format msgid "unrecognized locale provider: %s" msgstr "unbekannter Locale-Provider: %s" -#: pg_dump.c:3429 +#: pg_dump.c:3538 #, c-format msgid "saving encoding = %s" msgstr "sichere Kodierung = %s" -#: pg_dump.c:3454 +#: pg_dump.c:3563 #, c-format -msgid "saving standard_conforming_strings = %s" -msgstr "sichere standard_conforming_strings = %s" +msgid "saving \"standard_conforming_strings = %s\"" +msgstr "sichere »standard_conforming_strings = %s«" -#: pg_dump.c:3493 +#: pg_dump.c:3602 #, c-format msgid "could not parse result of current_schemas()" msgstr "konnte Ergebnis von current_schemas() nicht interpretieren" -#: pg_dump.c:3512 +#: pg_dump.c:3621 #, c-format -msgid "saving search_path = %s" -msgstr "sichere search_path = %s" +msgid "saving \"search_path = %s\"" +msgstr "sichere »search_path = %s«" -#: pg_dump.c:3549 +#: pg_dump.c:3657 #, c-format msgid "reading large objects" msgstr "lese Large Objects" -#: pg_dump.c:3687 +#: pg_dump.c:3878 #, c-format -msgid "saving large objects" -msgstr "sichere Large Objects" +msgid "saving large objects \"%s\"" +msgstr "sichere Large Objects »%s«" -#: pg_dump.c:3728 +#: pg_dump.c:3899 #, c-format msgid "error reading large object %u: %s" msgstr "Fehler beim Lesen von Large Object %u: %s" -#: pg_dump.c:3834 +#: pg_dump.c:4002 #, c-format msgid "reading row-level security policies" msgstr "lese Policys für Sicherheit auf Zeilenebene" -#: pg_dump.c:3975 +#: pg_dump.c:4143 #, c-format msgid "unexpected policy command type: %c" msgstr "unerwarteter Policy-Befehlstyp: %c" -#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11982 pg_dump.c:17849 -#: pg_dump.c:17851 pg_dump.c:18472 +#: pg_dump.c:4593 pg_dump.c:5151 pg_dump.c:12365 pg_dump.c:18250 +#: pg_dump.c:18252 pg_dump.c:18874 #, c-format msgid "could not parse %s array" msgstr "konnte %s-Array nicht interpretieren" -#: pg_dump.c:4613 +#: pg_dump.c:4807 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "Subskriptionen werden nicht ausgegeben, weil der aktuelle Benutzer kein Superuser ist" -#: pg_dump.c:5149 +#: pg_dump.c:5013 +#, c-format +msgid "subscription with OID %u does not exist" +msgstr "Subskription mit OID %u existiert nicht" + +#: pg_dump.c:5020 +#, c-format +msgid "failed sanity check, table with OID %u not found" +msgstr "Sanity-Check fehlgeschlagen, Tabelle mit OID %u nicht gefunden" + +#: pg_dump.c:5583 #, c-format msgid "could not find parent extension for %s %s" msgstr "konnte Erweiterung, zu der %s %s gehört, nicht finden" -#: pg_dump.c:5294 +#: pg_dump.c:5728 #, c-format msgid "schema with OID %u does not exist" msgstr "Schema mit OID %u existiert nicht" -#: pg_dump.c:6774 pg_dump.c:17113 +#: pg_dump.c:7210 pg_dump.c:17621 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "Sanity-Check fehlgeschlagen, Elterntabelle mit OID %u von Sequenz mit OID %u nicht gefunden" -#: pg_dump.c:6917 +#: pg_dump.c:7355 #, c-format msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found" msgstr "Sanity-Check fehlgeschlagen, Tabellen-OID %u, die in pg_partitioned_table erscheint, nicht gefunden" -#: pg_dump.c:7148 pg_dump.c:7415 pg_dump.c:7886 pg_dump.c:8550 pg_dump.c:8669 -#: pg_dump.c:8817 +#: pg_dump.c:7586 pg_dump.c:7860 pg_dump.c:8307 pg_dump.c:8921 pg_dump.c:9043 +#: pg_dump.c:9191 #, c-format msgid "unrecognized table OID %u" msgstr "unbekannte Tabellen-OID %u" -#: pg_dump.c:7152 +#: pg_dump.c:7590 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "unerwartete Indexdaten für Tabelle »%s«" -#: pg_dump.c:7647 +#: pg_dump.c:8092 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "Sanity-Check fehlgeschlagen, Elterntabelle mit OID %u von pg_rewrite-Eintrag mit OID %u nicht gefunden" -#: pg_dump.c:7938 -#, c-format -msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" -msgstr "Anfrage ergab NULL als Name der Tabelle auf die sich Fremdschlüssel-Trigger »%s« von Tabelle »%s« bezieht (OID der Tabelle: %u)" - -#: pg_dump.c:8554 +#: pg_dump.c:8925 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "unerwartete Spaltendaten für Tabelle »%s«" -#: pg_dump.c:8583 +#: pg_dump.c:8954 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "ungültige Spaltennummerierung in Tabelle »%s«" -#: pg_dump.c:8631 +#: pg_dump.c:9005 #, c-format msgid "finding table default expressions" msgstr "finde Tabellenvorgabeausdrücke" -#: pg_dump.c:8673 +#: pg_dump.c:9047 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "ungültiger adnum-Wert %d für Tabelle »%s«" -#: pg_dump.c:8767 +#: pg_dump.c:9141 #, c-format msgid "finding table check constraints" msgstr "finde Tabellen-Check-Constraints" -#: pg_dump.c:8821 +#: pg_dump.c:9195 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "%d Check-Constraint für Tabelle %s erwartet, aber %d gefunden" msgstr[1] "%d Check-Constraints für Tabelle %s erwartet, aber %d gefunden" -#: pg_dump.c:8825 +#: pg_dump.c:9199 #, c-format msgid "The system catalogs might be corrupted." msgstr "Die Systemkataloge sind wahrscheinlich verfälscht." -#: pg_dump.c:9515 +#: pg_dump.c:9889 #, c-format msgid "role with OID %u does not exist" msgstr "Rolle mit OID %u existiert nicht" -#: pg_dump.c:9627 pg_dump.c:9656 +#: pg_dump.c:10001 pg_dump.c:10030 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "nicht unterstützter pg_init_privs-Eintrag: %u %u %d" -#: pg_dump.c:10477 +#: pg_dump.c:10577 +#, c-format +msgid "missing metadata for large objects \"%s\"" +msgstr "fehlende Metadaten für Large Objects »%s«" + +#: pg_dump.c:10860 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "typtype des Datentypen »%s« scheint ungültig zu sein" -#: pg_dump.c:12051 +#: pg_dump.c:12434 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "ungültiger provolatile-Wert für Funktion »%s«" -#: pg_dump.c:12101 pg_dump.c:13945 +#: pg_dump.c:12484 pg_dump.c:14380 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "ungültiger proparallel-Wert für Funktion »%s«" -#: pg_dump.c:12230 pg_dump.c:12336 pg_dump.c:12343 +#: pg_dump.c:12614 pg_dump.c:12720 pg_dump.c:12727 #, c-format msgid "could not find function definition for function with OID %u" msgstr "konnte Funktionsdefinition für Funktion mit OID %u nicht finden" -#: pg_dump.c:12269 +#: pg_dump.c:12653 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "unsinniger Wert in Feld pg_cast.castfunc oder pg_cast.castmethod" -#: pg_dump.c:12272 +#: pg_dump.c:12656 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "unsinniger Wert in Feld pg_cast.castmethod" -#: pg_dump.c:12362 +#: pg_dump.c:12746 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "unsinnige Transformationsdefinition, mindestens eins von trffromsql und trftosql sollte nicht null sein" -#: pg_dump.c:12379 +#: pg_dump.c:12763 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "unsinniger Wert in Feld pg_transform.trffromsql" -#: pg_dump.c:12400 +#: pg_dump.c:12784 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "unsinniger Wert in Feld pg_transform.trftosql" -#: pg_dump.c:12545 +#: pg_dump.c:12929 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "Postfix-Operatoren werden nicht mehr unterstützt (Operator »%s«)" -#: pg_dump.c:12715 +#: pg_dump.c:13099 #, c-format msgid "could not find operator with OID %s" msgstr "konnte Operator mit OID %s nicht finden" -#: pg_dump.c:12783 +#: pg_dump.c:13167 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "ungültiger Typ »%c« für Zugriffsmethode »%s«" -#: pg_dump.c:13440 +#: pg_dump.c:13841 pg_dump.c:13909 #, c-format msgid "unrecognized collation provider: %s" msgstr "unbekannter Sortierfolgen-Provider: %s" -#: pg_dump.c:13864 +#: pg_dump.c:13850 pg_dump.c:13857 pg_dump.c:13868 pg_dump.c:13878 +#: pg_dump.c:13893 +#, c-format +msgid "invalid collation \"%s\"" +msgstr "ungültige Sortierfolge »%s«" + +#: pg_dump.c:14299 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "unbekannter aggfinalmodify-Wert für Aggregat »%s«" -#: pg_dump.c:13920 +#: pg_dump.c:14355 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "unbekannter aggmfinalmodify-Wert für Aggregat »%s«" -#: pg_dump.c:14637 +#: pg_dump.c:15072 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "unbekannter Objekttyp in den Vorgabeprivilegien: %d" -#: pg_dump.c:14653 +#: pg_dump.c:15088 #, c-format msgid "could not parse default ACL list (%s)" msgstr "konnte Vorgabe-ACL-Liste (%s) nicht interpretieren" -#: pg_dump.c:14735 +#: pg_dump.c:15172 #, c-format msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "konnte initiale ACL-Liste (%s) oder Default (%s) für Objekt »%s« (%s) nicht interpretieren" -#: pg_dump.c:14760 +#: pg_dump.c:15197 #, c-format msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "konnte ACL-Liste (%s) oder Default (%s) für Objekt »%s« (%s) nicht interpretieren" -#: pg_dump.c:15298 +#: pg_dump.c:15740 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "Anfrage um die Definition der Sicht »%s« zu ermitteln lieferte keine Daten" -#: pg_dump.c:15301 +#: pg_dump.c:15743 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "Anfrage um die Definition der Sicht »%s« zu ermitteln lieferte mehr als eine Definition" -#: pg_dump.c:15308 +#: pg_dump.c:15750 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "Definition der Sicht »%s« scheint leer zu sein (Länge null)" -#: pg_dump.c:15392 +#: pg_dump.c:15835 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS wird nicht mehr unterstützt (Tabelle »%s«)" -#: pg_dump.c:16316 +#: pg_dump.c:16822 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "ungültige Spaltennummer %d in Tabelle »%s«" -#: pg_dump.c:16394 +#: pg_dump.c:16900 #, c-format msgid "could not parse index statistic columns" msgstr "konnte Indexstatistikspalten nicht interpretieren" -#: pg_dump.c:16396 +#: pg_dump.c:16902 #, c-format msgid "could not parse index statistic values" msgstr "konnte Indexstatistikwerte nicht interpretieren" -#: pg_dump.c:16398 +#: pg_dump.c:16904 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "Anzahl Spalten und Werte für Indexstatistiken stimmt nicht überein" -#: pg_dump.c:16614 +#: pg_dump.c:17119 #, c-format msgid "missing index for constraint \"%s\"" msgstr "fehlender Index für Constraint »%s«" -#: pg_dump.c:16847 +#: pg_dump.c:17354 #, c-format msgid "unrecognized constraint type: %c" msgstr "unbekannter Constraint-Typ: %c" -#: pg_dump.c:16948 pg_dump.c:17177 +#: pg_dump.c:17455 pg_dump.c:17685 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "Anfrage nach Daten der Sequenz %s ergab %d Zeile (erwartete 1)" msgstr[1] "Anfrage nach Daten der Sequenz %s ergab %d Zeilen (erwartete 1)" -#: pg_dump.c:16980 +#: pg_dump.c:17487 #, c-format msgid "unrecognized sequence type: %s" msgstr "unbekannter Sequenztyp: %s" -#: pg_dump.c:17269 -#, c-format -msgid "unexpected tgtype value: %d" -msgstr "unerwarteter tgtype-Wert: %d" - -#: pg_dump.c:17341 -#, c-format -msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" -msgstr "fehlerhafte Argumentzeichenkette (%s) für Trigger »%s« von Tabelle »%s«" - -#: pg_dump.c:17610 +#: pg_dump.c:18002 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "Anfrage nach Regel »%s« der Tabelle »%s« fehlgeschlagen: falsche Anzahl Zeilen zurückgegeben" -#: pg_dump.c:17763 +#: pg_dump.c:18155 #, c-format msgid "could not find referenced extension %u" msgstr "konnte referenzierte Erweiterung %u nicht finden" -#: pg_dump.c:17853 +#: pg_dump.c:18254 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "Anzahl Konfigurationen und Bedingungen für Erweiterung stimmt nicht überein" -#: pg_dump.c:17985 +#: pg_dump.c:18386 #, c-format msgid "reading dependency data" msgstr "lese Abhängigkeitsdaten" -#: pg_dump.c:18071 +#: pg_dump.c:18472 #, c-format msgid "no referencing object %u %u" msgstr "kein referenzierendes Objekt %u %u" -#: pg_dump.c:18082 +#: pg_dump.c:18483 #, c-format msgid "no referenced object %u %u" msgstr "kein referenziertes Objekt %u %u" -#: pg_dump_sort.c:422 +#: pg_dump.c:18908 pg_dump.c:18946 pg_dumpall.c:2011 pg_restore.c:551 +#: pg_restore.c:597 +#, c-format +msgid "%s filter for \"%s\" is not allowed" +msgstr "%s-Filter für »%s« ist nicht erlaubt" + +#: pg_dump_sort.c:424 #, c-format msgid "invalid dumpId %d" msgstr "ungültige dumpId %d" -#: pg_dump_sort.c:428 +#: pg_dump_sort.c:430 #, c-format msgid "invalid dependency %d" msgstr "ungültige Abhängigkeit %d" -#: pg_dump_sort.c:661 +#: pg_dump_sort.c:594 #, c-format msgid "could not identify dependency loop" msgstr "konnte Abhängigkeitsschleife nicht bestimmen" -#: pg_dump_sort.c:1232 +#: pg_dump_sort.c:1209 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "Es gibt zirkuläre Fremdschlüssel-Constraints für diese Tabelle:" msgstr[1] "Es gibt zirkuläre Fremdschlüssel-Constraints zwischen diesen Tabellen:" -#: pg_dump_sort.c:1236 pg_dump_sort.c:1256 -#, c-format -msgid " %s" -msgstr " %s" - -#: pg_dump_sort.c:1237 +#: pg_dump_sort.c:1214 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "Möglicherweise kann der Dump nur wiederhergestellt werden, wenn --disable-triggers verwendet wird oder die Constraints vorübergehend entfernt werden." -#: pg_dump_sort.c:1238 +#: pg_dump_sort.c:1215 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "Führen Sie einen vollen Dump statt eines Dumps mit --data-only durch, um dieses Problem zu vermeiden." -#: pg_dump_sort.c:1250 +#: pg_dump_sort.c:1227 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "konnte Abhängigkeitsschleife zwischen diesen Elementen nicht auflösen:" -#: pg_dumpall.c:230 +#: pg_dumpall.c:231 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden" -#: pg_dumpall.c:233 +#: pg_dumpall.c:234 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s" -#: pg_dumpall.c:382 +#: pg_dumpall.c:387 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "Option --exclude-database kann nicht zusammen mit -g/--globals-only, -r/--roles-only oder -t/--tablesspaces-only verwendet werden" -#: pg_dumpall.c:390 +#: pg_dumpall.c:395 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "Optionen -g/--globals-only und -r/--roles-only können nicht zusammen verwendet werden" -#: pg_dumpall.c:397 +#: pg_dumpall.c:402 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "Optionen -g/--globals-only und -t/--tablespaces-only können nicht zusammen verwendet werden" -#: pg_dumpall.c:407 +#: pg_dumpall.c:412 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "Optionen -r/--roles-only und -t/--tablespaces-only können nicht zusammen verwendet werden" -#: pg_dumpall.c:469 pg_dumpall.c:1750 +#: pg_dumpall.c:474 pg_dumpall.c:1820 #, c-format msgid "could not connect to database \"%s\"" msgstr "konnte nicht mit der Datenbank »%s« verbinden" -#: pg_dumpall.c:481 +#: pg_dumpall.c:486 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2392,7 +2548,7 @@ msgstr "" "konnte nicht mit Datenbank »postgres« oder »template1« verbinden\n" "Bitte geben Sie eine alternative Datenbank an." -#: pg_dumpall.c:629 +#: pg_dumpall.c:635 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2401,75 +2557,82 @@ msgstr "" "%s gibt einen PostgreSQL-Datenbankcluster in eine SQL-Skriptdatei aus.\n" "\n" -#: pg_dumpall.c:631 +#: pg_dumpall.c:637 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_dumpall.c:634 +#: pg_dumpall.c:640 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=DATEINAME Name der Ausgabedatei\n" -#: pg_dumpall.c:641 +#: pg_dumpall.c:647 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean Datenbanken vor der Wiedererstellung löschen\n" -#: pg_dumpall.c:643 +#: pg_dumpall.c:649 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr " -g, --globals-only nur globale Objekte ausgeben, keine Datenbanken\n" -#: pg_dumpall.c:644 pg_restore.c:456 +#: pg_dumpall.c:650 pg_restore.c:475 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr "" " -O, --no-owner Wiederherstellung der Objekteigentümerschaft\n" " auslassen\n" -#: pg_dumpall.c:645 +#: pg_dumpall.c:651 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr "" " -r, --roles-only nur Rollen ausgeben, keine Datenbanken oder\n" " Tablespaces\n" -#: pg_dumpall.c:647 +#: pg_dumpall.c:653 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr " -S, --superuser=NAME Superusername für den Dump\n" -#: pg_dumpall.c:648 +#: pg_dumpall.c:654 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr "" " -t, --tablespaces-only nur Tablespaces ausgeben, keine Datenbanken oder\n" " Rollen\n" -#: pg_dumpall.c:654 +#: pg_dumpall.c:660 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr "" " --exclude-database=MUSTER Datenbanken deren Name mit MUSTER übereinstimmt\n" " überspringen\n" -#: pg_dumpall.c:661 +#: pg_dumpall.c:662 +#, c-format +msgid " --filter=FILENAME exclude databases based on expressions in FILENAME\n" +msgstr "" +" --filter=DATEINAME Datenbanken basierend auf Ausdrücken in DATEINAME\n" +" überspringen\n" + +#: pg_dumpall.c:668 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords Rollenpasswörter nicht mit ausgeben\n" -#: pg_dumpall.c:677 +#: pg_dumpall.c:684 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=VERBDG mit angegebenen Verbindungsparametern verbinden\n" -#: pg_dumpall.c:679 +#: pg_dumpall.c:686 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAME alternative Standarddatenbank\n" -#: pg_dumpall.c:686 +#: pg_dumpall.c:693 #, c-format msgid "" "\n" @@ -2482,97 +2645,112 @@ msgstr "" "Standardausgabe geschrieben.\n" "\n" -#: pg_dumpall.c:828 +#: pg_dumpall.c:838 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "mit »pg_« anfangender Rollenname übersprungen (%s)" -#: pg_dumpall.c:1050 +#. translator: %s represents a numeric role OID +#: pg_dumpall.c:1055 pg_dumpall.c:1113 pg_dumpall.c:1122 +#, c-format +msgid "found orphaned pg_auth_members entry for role %s" +msgstr "verwaister pg_auth_members-Eintrag für Rolle %s gefunden" + +#: pg_dumpall.c:1088 #, c-format msgid "could not find a legal dump ordering for memberships in role \"%s\"" msgstr "konnte keine legale Dump-Reihenfolge für Mitgliedschaften in Rolle »%s« finden" -#: pg_dumpall.c:1185 +#: pg_dumpall.c:1243 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "konnte ACL-Zeichenkette (%s) für Parameter »%s« nicht interpretieren" -#: pg_dumpall.c:1303 +#: pg_dumpall.c:1370 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "konnte ACL-Zeichenkette (%s) für Tablespace »%s« nicht interpretieren" -#: pg_dumpall.c:1510 +#: pg_dumpall.c:1577 #, c-format msgid "excluding database \"%s\"" msgstr "Datenbank »%s« übersprungen" -#: pg_dumpall.c:1514 +#: pg_dumpall.c:1581 #, c-format msgid "dumping database \"%s\"" msgstr "Ausgabe der Datenbank »%s«" -#: pg_dumpall.c:1545 +#: pg_dumpall.c:1612 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "pg_dump für Datenbank »%s« fehlgeschlagen; beende" -#: pg_dumpall.c:1551 +#: pg_dumpall.c:1618 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "konnte die Ausgabedatei »%s« nicht neu öffnen: %m" -#: pg_dumpall.c:1592 +#: pg_dumpall.c:1662 #, c-format msgid "running \"%s\"" msgstr "führe »%s« aus" -#: pg_dumpall.c:1793 +#: pg_dumpall.c:1863 #, c-format msgid "could not get server version" msgstr "konnte Version des Servers nicht ermitteln" -#: pg_dumpall.c:1796 +#: pg_dumpall.c:1866 #, c-format msgid "could not parse server version \"%s\"" msgstr "konnte Versionszeichenkette »%s« nicht entziffern" -#: pg_dumpall.c:1866 pg_dumpall.c:1889 +#: pg_dumpall.c:1936 pg_dumpall.c:1959 #, c-format msgid "executing %s" msgstr "führe %s aus" -#: pg_restore.c:313 +#: pg_dumpall.c:2031 +msgid "unsupported filter object" +msgstr "nicht unterstütztes Filterobjekt" + +#: pg_restore.c:329 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "entweder -d/--dbname oder -f/--file muss angegeben werden" -#: pg_restore.c:320 +#: pg_restore.c:336 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "Optionen -d/--dbname und -f/--file können nicht zusammen verwendet werden" -#: pg_restore.c:338 +#: pg_restore.c:350 +#, c-format +msgid "options -1/--single-transaction and --transaction-size cannot be used together" +msgstr "Optionen -1/--single-transaction und --transaction-size können nicht zusammen verwendet werden" + +#: pg_restore.c:357 #, c-format msgid "options -C/--create and -1/--single-transaction cannot be used together" msgstr "Optionen -C/--create und -1/--single-transaction können nicht zusammen verwendet werden" -#: pg_restore.c:342 +#: pg_restore.c:361 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "--single-transaction und mehrere Jobs können nicht zusammen verwendet werden" -#: pg_restore.c:380 +#: pg_restore.c:399 #, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "unbekanntes Archivformat »%s«; bitte »c«, »d« oder »t« angeben" -#: pg_restore.c:419 +#: pg_restore.c:438 #, c-format msgid "errors ignored on restore: %d" msgstr "bei Wiederherstellung ignorierte Fehler: %d" -#: pg_restore.c:432 +#: pg_restore.c:451 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" @@ -2582,47 +2760,47 @@ msgstr "" "gesichert wurde.\n" "\n" -#: pg_restore.c:434 +#: pg_restore.c:453 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [OPTION]... [DATEI]\n" -#: pg_restore.c:437 +#: pg_restore.c:456 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr " -d, --dbname=NAME mit angegebener Datenbank verbinden\n" -#: pg_restore.c:438 +#: pg_restore.c:457 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr " -f, --file=DATEINAME Name der Ausgabedatei (- für stdout)\n" -#: pg_restore.c:439 +#: pg_restore.c:458 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr " -F, --format=c|d|t Format der Backup-Datei (sollte automatisch gehen)\n" -#: pg_restore.c:440 +#: pg_restore.c:459 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list Inhaltsverzeichnis für dieses Archiv anzeigen\n" -#: pg_restore.c:441 +#: pg_restore.c:460 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose »Verbose«-Modus\n" -#: pg_restore.c:442 +#: pg_restore.c:461 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_restore.c:443 +#: pg_restore.c:462 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_restore.c:445 +#: pg_restore.c:464 #, c-format msgid "" "\n" @@ -2631,34 +2809,34 @@ msgstr "" "\n" "Optionen die die Wiederherstellung kontrollieren:\n" -#: pg_restore.c:446 +#: pg_restore.c:465 #, c-format msgid " -a, --data-only restore only the data, no schema\n" msgstr " -a, --data-only nur Daten, nicht das Schema, wiederherstellen\n" -#: pg_restore.c:448 +#: pg_restore.c:467 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create Zieldatenbank erzeugen\n" -#: pg_restore.c:449 +#: pg_restore.c:468 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr " -e, --exit-on-error bei Fehler beenden, Voreinstellung ist fortsetzen\n" -#: pg_restore.c:450 +#: pg_restore.c:469 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NAME benannten Index wiederherstellen\n" -#: pg_restore.c:451 +#: pg_restore.c:470 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr "" " -j, --jobs=NUM so viele parallele Jobs zur Wiederherstellung\n" " verwenden\n" -#: pg_restore.c:452 +#: pg_restore.c:471 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" @@ -2667,64 +2845,73 @@ msgstr "" " -L, --use-list=DATEINAME Inhaltsverzeichnis aus dieser Datei zur Auswahl oder\n" " Sortierung der Ausgabe verwenden\n" -#: pg_restore.c:454 +#: pg_restore.c:473 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr " -n, --schema=NAME nur Objekte in diesem Schema wiederherstellen\n" -#: pg_restore.c:455 +#: pg_restore.c:474 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" msgstr " -N, ---exclude-schema=NAME Objekte in diesem Schema nicht wiederherstellen\n" -#: pg_restore.c:457 +#: pg_restore.c:476 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=NAME(args) benannte Funktion wiederherstellen\n" -#: pg_restore.c:458 +#: pg_restore.c:477 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" msgstr " -s, --schema-only nur das Schema, nicht die Daten, wiederherstellen\n" -#: pg_restore.c:459 +#: pg_restore.c:478 #, c-format msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" msgstr " -S, --superuser=NAME Name des Superusers, um Trigger auszuschalten\n" -#: pg_restore.c:460 +#: pg_restore.c:479 #, c-format msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" msgstr "" " -t, --table=NAME benannte Relation (Tabelle, Sicht, usw.)\n" " wiederherstellen\n" -#: pg_restore.c:461 +#: pg_restore.c:480 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NAME benannten Trigger wiederherstellen\n" -#: pg_restore.c:462 +#: pg_restore.c:481 #, c-format msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" msgstr " -x, --no-privileges Wiederherstellung der Zugriffsprivilegien auslassen\n" -#: pg_restore.c:463 +#: pg_restore.c:482 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction Wiederherstellung als eine einzige Transaktion\n" -#: pg_restore.c:465 +#: pg_restore.c:484 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security Sicherheit auf Zeilenebene einschalten\n" -#: pg_restore.c:467 +#: pg_restore.c:485 +#, c-format +msgid "" +" --filter=FILENAME restore or skip objects based on expressions\n" +" in FILENAME\n" +msgstr "" +" --filter=DATEINAME Objekte basierend auf Ausdrücken in DATEINAME\n" +" wiederherstellen oder überspringen\n" + +#: pg_restore.c:488 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments Kommentare nicht wiederherstellen\n" -#: pg_restore.c:468 +#: pg_restore.c:489 #, c-format msgid "" " --no-data-for-failed-tables do not restore data of tables that could not be\n" @@ -2733,44 +2920,49 @@ msgstr "" " --no-data-for-failed-tables Daten für Tabellen, die nicht erzeugt werden\n" " konnten, nicht wiederherstellen\n" -#: pg_restore.c:470 +#: pg_restore.c:491 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications Publikationen nicht wiederherstellen\n" -#: pg_restore.c:471 +#: pg_restore.c:492 #, c-format msgid " --no-security-labels do not restore security labels\n" msgstr " --no-security-labels Security-Labels nicht wiederherstellen\n" -#: pg_restore.c:472 +#: pg_restore.c:493 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions Subskriptionen nicht wiederherstellen\n" -#: pg_restore.c:473 +#: pg_restore.c:494 #, c-format msgid " --no-table-access-method do not restore table access methods\n" msgstr " --no-table-access-method Tabellenzugriffsmethoden nicht wiederherstellen\n" -#: pg_restore.c:474 +#: pg_restore.c:495 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" msgstr " --no-tablespaces Tablespace-Zuordnungen nicht wiederherstellen\n" -#: pg_restore.c:475 +#: pg_restore.c:496 #, c-format msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" msgstr "" " --section=ABSCHNITT angegebenen Abschnitt wiederherstellen (pre-data,\n" " data oder post-data)\n" -#: pg_restore.c:488 +#: pg_restore.c:499 +#, c-format +msgid " --transaction-size=N commit after every N objects\n" +msgstr " --transaction-size=N jeweils nach N Objekten committen\n" + +#: pg_restore.c:510 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=ROLLENNAME vor der Wiederherstellung SET ROLE ausführen\n" -#: pg_restore.c:490 +#: pg_restore.c:512 #, c-format msgid "" "\n" @@ -2781,7 +2973,7 @@ msgstr "" "Die Optionen -I, -n, -N, -P, -t, -T und --section können kombiniert und mehrfach\n" "angegeben werden, um mehrere Objekte auszuwählen.\n" -#: pg_restore.c:493 +#: pg_restore.c:515 #, c-format msgid "" "\n" diff --git a/src/bin/pg_dump/po/el.po b/src/bin/pg_dump/po/el.po index ae66e0cbac0ef..391412a42f445 100644 --- a/src/bin/pg_dump/po/el.po +++ b/src/bin/pg_dump/po/el.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_dump (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-14 09:19+0000\n" -"PO-Revision-Date: 2023-04-14 13:39+0200\n" +"POT-Creation-Date: 2023-08-14 23:20+0000\n" +"PO-Revision-Date: 2023-08-15 14:32+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -40,82 +40,124 @@ msgstr "λεπτομέÏεια: " msgid "hint: " msgstr "υπόδειξη: " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/compression.c:132 ../../common/compression.c:141 +#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420 +#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25 +#: compress_zstd.c:31 #, c-format -msgid "could not identify current directory: %m" -msgstr "δεν ήταν δυνατή η αναγνώÏιση του Ï„Ïέχοντος καταλόγου: %m" +msgid "this build does not support compression with %s" +msgstr "η παÏοÏσα κατασκευή δεν υποστηÏίζει συμπίεση με %s" -#: ../../common/exec.c:168 +#: ../../common/compression.c:205 +msgid "found empty string where a compression option was expected" +msgstr "βÏέθηκε κενή συμβολοσειÏά όπου αναμενόταν μια επιλογή συμπίεσης" + +#: ../../common/compression.c:244 #, c-format -msgid "invalid binary \"%s\"" -msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»" +msgid "unrecognized compression option: \"%s\"" +msgstr "μη αναγνωÏίσιμη παÏάμετÏος συμπίεσης: «%s»" -#: ../../common/exec.c:218 +#: ../../common/compression.c:283 #, c-format -msgid "could not read binary \"%s\"" -msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»" +msgid "compression option \"%s\" requires a value" +msgstr "η επιλογή συμπίεσης «%s» απαιτεί τιμή" -#: ../../common/exec.c:226 +#: ../../common/compression.c:292 #, c-format -msgid "could not find a \"%s\" to execute" -msgstr "δεν βÏέθηκε το αÏχείο «%s» για να εκτελεστεί" +msgid "value for compression option \"%s\" must be an integer" +msgstr "η τιμή της επιλογής συμπίεσης «%s» Ï€Ïέπει να είναι ακέÏαια" + +#: ../../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "η τιμή της επιλογής συμπίεσης «%s» Ï€Ïέπει να είναι Δυαδική τιμή" + +#: ../../common/compression.c:379 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "ο αλγόÏιθμος συμπίεσης «%s» δεν δέχεται επίπεδο συμπίεσης" + +#: ../../common/compression.c:386 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "ο αλγόÏιθμος συμπίεσης «%s» αναμένει ένα επίπεδο συμπίεσης Î¼ÎµÏ„Î±Î¾Ï %d και %d (Ï€Ïοεπιλογμένο %d)" + +#: ../../common/compression.c:397 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "ο αλγόÏιθμος συμπίεσης «%s» δεν δέχεται μέγεθος εÏγατών" + +#: ../../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "ο αλγόÏιθμος συμπίεσης «%s» δεν υποστηÏίζει λειτουÏγία μεγάλων αποστάσεων" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:172 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" +msgid "invalid binary \"%s\": %m" +msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»: %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:215 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m" +msgid "could not read binary \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»: %m" -#: ../../common/exec.c:422 parallel.c:1611 +#: ../../common/exec.c:223 +#, c-format +msgid "could not find a \"%s\" to execute" +msgstr "δεν βÏέθηκε το αÏχείο «%s» για να εκτελεστεί" + +#: ../../common/exec.c:250 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "δεν δÏναται η επίλυση διαδÏομής «%s» σε απόλυτη μοÏφή: %m" + +#: ../../common/exec.c:412 parallel.c:1609 #, c-format msgid "%s() failed: %m" msgstr "%s() απέτυχε: %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 msgid "out of memory" msgstr "έλλειψη μνήμης" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "έλλειψη μνήμης\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "εντολή μη εκτελέσιμη" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "εντολή δεν βÏέθηκε" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "απόγονος διεÏγασίας τεÏμάτισε με κωδικό εξόδου %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "απόγονος διεÏγασίας τεÏματίστηκε με εξαίÏεση 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "απόγονος διεÏγασίας τεÏματίστηκε με σήμα %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "απόγονος διεÏγασίας τεÏμάτισε με μη αναγνωÏίσιμη κατάσταση %d" @@ -130,304 +172,351 @@ msgstr "μη έγκυÏη τιμή «%s» για την επιλογή %s" msgid "%s must be in range %d..%d" msgstr "%s Ï€Ïέπει να βÏίσκεται εντός εÏÏους %d..%d" -#: common.c:134 +#: common.c:132 #, c-format msgid "reading extensions" msgstr "ανάγνωση επεκτάσεων" -#: common.c:137 +#: common.c:135 #, c-format msgid "identifying extension members" msgstr "Ï€ÏοσδιοÏισμός μελών επέκτασεων" -#: common.c:140 +#: common.c:138 #, c-format msgid "reading schemas" msgstr "ανάγνωση σχημάτων" -#: common.c:149 +#: common.c:147 #, c-format msgid "reading user-defined tables" msgstr "ανάγνωση πινάκων οÏισμένων από το χÏήστη" -#: common.c:154 +#: common.c:152 #, c-format msgid "reading user-defined functions" msgstr "ανάγνωση συναÏτήσεων οÏισμένων από το χÏήστη" -#: common.c:158 +#: common.c:156 #, c-format msgid "reading user-defined types" msgstr "ανάγνωση Ï„Ïπων οÏισμένων από το χÏήστη" -#: common.c:162 +#: common.c:160 #, c-format msgid "reading procedural languages" msgstr "ανάγνωση δομημένων γλωσσών" -#: common.c:165 +#: common.c:163 #, c-format msgid "reading user-defined aggregate functions" msgstr "ανάγνωση συναÏτήσεων συγκεντÏωτικών αποτελεσμάτων οÏισμένων από το χÏήστη" -#: common.c:168 +#: common.c:166 #, c-format msgid "reading user-defined operators" msgstr "ανάγνωση χειÏιστών οÏισμένων από το χÏήστη" -#: common.c:171 +#: common.c:169 #, c-format msgid "reading user-defined access methods" msgstr "ανάγνωση μεθόδων Ï€Ïόσβασης οÏισμένων από το χÏήστη" -#: common.c:174 +#: common.c:172 #, c-format msgid "reading user-defined operator classes" msgstr "ανάγνωση κλάσεων χειÏιστών οÏισμένων από το χÏήστη" -#: common.c:177 +#: common.c:175 #, c-format msgid "reading user-defined operator families" msgstr "ανάγνωση οικογενειών χειÏιστών οÏισμένων από το χÏήστη" -#: common.c:180 +#: common.c:178 #, c-format msgid "reading user-defined text search parsers" msgstr "ανάγνωση αναλυτών αναζήτησης κειμένου οÏισμένων από το χÏήστη" -#: common.c:183 +#: common.c:181 #, c-format msgid "reading user-defined text search templates" msgstr "ανάγνωση Ï€ÏοτÏπων αναζήτησης κειμένου οÏισμένων από το χÏήστη" -#: common.c:186 +#: common.c:184 #, c-format msgid "reading user-defined text search dictionaries" msgstr "ανάγνωση λεξικών αναζήτησης κειμένου οÏισμένων από το χÏήστη" -#: common.c:189 +#: common.c:187 #, c-format msgid "reading user-defined text search configurations" msgstr "ανάγνωση Ïυθμίσεων παÏαμέτÏων αναζήτησης κειμένου οÏισμένων από το χÏήστη" -#: common.c:192 +#: common.c:190 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "ανάγνωση πεÏιτυλίξεων ξενικών δεδομένων οÏισμένων από το χÏήστη" -#: common.c:195 +#: common.c:193 #, c-format msgid "reading user-defined foreign servers" msgstr "ανάγνωση ξενικών διακομιστών οÏισμένων από το χÏήστη" -#: common.c:198 +#: common.c:196 #, c-format msgid "reading default privileges" msgstr "ανάγνωση Ï€Ïοεπιλεγμένων δικαιωμάτων" -#: common.c:201 +#: common.c:199 #, c-format msgid "reading user-defined collations" msgstr "ανάγνωση συÏÏαφών οÏισμένων από το χÏήστη" -#: common.c:204 +#: common.c:202 #, c-format msgid "reading user-defined conversions" msgstr "ανάγνωση μετατÏοπών οÏισμένων από το χÏήστη" -#: common.c:207 +#: common.c:205 #, c-format msgid "reading type casts" msgstr "ανάγνωση Ï„Ïπων καστ" -#: common.c:210 +#: common.c:208 #, c-format msgid "reading transforms" msgstr "ανάγωση μετατÏοπών" -#: common.c:213 +#: common.c:211 #, c-format msgid "reading table inheritance information" msgstr "ανάγωση πληÏοφοÏιών κληÏονομιάς πινάκων" -#: common.c:216 +#: common.c:214 #, c-format msgid "reading event triggers" msgstr "ανάγνωση ενεÏγοποιήσεων συμβάντων" -#: common.c:220 +#: common.c:218 #, c-format msgid "finding extension tables" msgstr "εÏÏεση πινάκων επέκτασης" -#: common.c:224 +#: common.c:222 #, c-format msgid "finding inheritance relationships" msgstr "εÏÏεση σχέσεων κληÏονιμιά" -#: common.c:227 +#: common.c:225 #, c-format msgid "reading column info for interesting tables" msgstr "ανάγνωση πληÏοφοÏιών στήλης για ενδιαφέÏοντες πίνακες" -#: common.c:230 +#: common.c:228 #, c-format msgid "flagging inherited columns in subtables" msgstr "επισήμανση κληÏονομοÏμενων στηλών σε υποπίνακες" -#: common.c:233 +#: common.c:231 #, c-format msgid "reading partitioning data" msgstr "ανάγνωση δεδομένων κατάτμησης" -#: common.c:236 +#: common.c:234 #, c-format msgid "reading indexes" msgstr "ανάγνωση ευÏετηÏίων" -#: common.c:239 +#: common.c:237 #, c-format msgid "flagging indexes in partitioned tables" msgstr "επισήμανση ευÏετηÏίων σε κατατμημένους πινάκες" -#: common.c:242 +#: common.c:240 #, c-format msgid "reading extended statistics" msgstr "ανάγνωση εκτεταμένων στατιστικών στοιχείων" -#: common.c:245 +#: common.c:243 #, c-format msgid "reading constraints" msgstr "ανάγνωση πεÏιοÏισμών" -#: common.c:248 +#: common.c:246 #, c-format msgid "reading triggers" msgstr "ανάγνωση ενεÏγοποιήσεων συμβάντων" -#: common.c:251 +#: common.c:249 #, c-format msgid "reading rewrite rules" msgstr "ανάγνωση κανόνων επανεγγÏαφής" -#: common.c:254 +#: common.c:252 #, c-format msgid "reading policies" msgstr "ανάγνωση πολιτικών" -#: common.c:257 +#: common.c:255 #, c-format msgid "reading publications" msgstr "ανάγνωση δημοσιεÏσεων" -#: common.c:260 +#: common.c:258 #, c-format msgid "reading publication membership of tables" msgstr "ανάγνωση ιδιοτήτων μελών δημοσιεÏσεων πινάκων" -#: common.c:263 +#: common.c:261 #, c-format msgid "reading publication membership of schemas" msgstr "ανάγνωση ιδιοτήτων μελών δημοσιεÏσεων των σχημάτων" -#: common.c:266 +#: common.c:264 #, c-format msgid "reading subscriptions" msgstr "ανάγνωση συνδÏομών" -#: common.c:345 -#, c-format -msgid "invalid number of parents %d for table \"%s\"" -msgstr "μη έγκυÏος αÏιθμός γονέων %d για τον πίνακα «%s»" - -#: common.c:1006 +#: common.c:327 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "απέτυχε ο έλεγχος ακεÏαιότητας, το γονικό OID %u του πίνακα «%s» (OID %u) δεν βÏέθηκε" -#: common.c:1045 +#: common.c:369 +#, c-format +msgid "invalid number of parents %d for table \"%s\"" +msgstr "μη έγκυÏος αÏιθμός γονέων %d για τον πίνακα «%s»" + +#: common.c:1049 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "δεν ήταν δυνατή η ανάλυση της αÏιθμητικής συστοιχίας «%s»: πάÏα πολλοί αÏιθμοί" -#: common.c:1057 +#: common.c:1061 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "δεν ήταν δυνατή η ανάλυση της αÏιθμητικής συστοιχίας «%s»: μη έγκυÏος χαÏακτήÏας σε αÏιθμό" -#: compress_io.c:111 -#, c-format -msgid "invalid compression code: %d" -msgstr "μη έγκυÏος κωδικός συμπίεσης: %d" - -#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504 -#: compress_io.c:547 -#, c-format -msgid "not built with zlib support" -msgstr "δεν έχει κατασκευαστεί με υποστήÏιξη zlib" - -#: compress_io.c:236 compress_io.c:333 +#: compress_gzip.c:69 compress_gzip.c:183 #, c-format msgid "could not initialize compression library: %s" msgstr "δεν ήταν δυνατή η αÏχικοποίηση της βιβλιοθήκης συμπίεσης: %s" -#: compress_io.c:256 +#: compress_gzip.c:93 #, c-format msgid "could not close compression stream: %s" msgstr "δεν ήταν δυνατό το κλείσιμο της Ïοής συμπίεσης: %s" -#: compress_io.c:273 +#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109 #, c-format msgid "could not compress data: %s" msgstr "δεν ήταν δυνατή η συμπίεση δεδομένων: %s" -#: compress_io.c:349 compress_io.c:364 +#: compress_gzip.c:199 compress_gzip.c:214 #, c-format msgid "could not uncompress data: %s" msgstr "δεν ήταν δυνατή η αποσυμπίεση δεδομένων: %s" -#: compress_io.c:371 +#: compress_gzip.c:221 #, c-format msgid "could not close compression library: %s" msgstr "δεν ήταν δυνατό το κλείσιμο της βιβλιοθήκης συμπίεσης: %s" -#: compress_io.c:584 compress_io.c:621 +#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608 +#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140 #, c-format msgid "could not read from input file: %s" msgstr "δεν ήταν δυνατή η ανάγνωση από το αÏχείο εισόδου: %s" -#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553 -#: pg_backup_tar.c:726 pg_backup_tar.c:749 +#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142 +#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558 +#: pg_backup_tar.c:725 pg_backup_tar.c:748 #, c-format msgid "could not read from input file: end of file" msgstr "δεν ήταν δυνατή η ανάγνωση από το αÏχείο εισόδου: τέλος αÏχείου" -#: parallel.c:253 +#: compress_lz4.c:157 +#, c-format +msgid "could not create LZ4 decompression context: %s" +msgstr "δεν ήταν δυνατή η δημιουÏγία LZ4 πεÏιεχομένου αποσυμπίεσης: %s" + +#: compress_lz4.c:180 +#, c-format +msgid "could not decompress: %s" +msgstr "δεν ήταν δυνατή η αποσυμπίεση: %s" + +#: compress_lz4.c:193 +#, c-format +msgid "could not free LZ4 decompression context: %s" +msgstr "δεν ήταν δυνατή η απελευθέÏωση LZ4 πεÏιεχομένου αποσυμπίεσης: %s" + +#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690 +#, c-format +msgid "could not end compression: %s" +msgstr "δεν ήταν δυνατός ο τεÏματισμός συμπίεσης: %s" + +#: compress_lz4.c:301 +#, c-format +msgid "could not initialize LZ4 compression: %s" +msgstr "δεν ήταν δυνατή η αÏχικοποίηση LZ4 συμπίεσης: %s" + +#: compress_lz4.c:697 +#, c-format +msgid "could not end decompression: %s" +msgstr "δεν ήταν δυνατός ο τεÏματισμός αποσυμπίεσης: %s" + +#: compress_zstd.c:66 +#, c-format +msgid "could not set compression parameter \"%s\": %s" +msgstr "δεν ήταν δυνατή η ÏÏθμιση παÏαμέτÏου συμπίεσης «%s»: %s" + +#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490 +#: compress_zstd.c:498 +#, c-format +msgid "could not initialize compression library" +msgstr "δεν ήταν δυνατή η αÏχικοποίηση της βιβλιοθήκης συμπίεσης" + +#: compress_zstd.c:194 compress_zstd.c:308 +#, c-format +msgid "could not decompress data: %s" +msgstr "δεν ήταν δυνατή η αποσυμπίεση δεδομένων: %s" + +#: compress_zstd.c:373 pg_backup_custom.c:655 +#, c-format +msgid "could not read from input file: %m" +msgstr "δεν ήταν δυνατή η ανάγνωση από αÏχείο: %m" + +#: compress_zstd.c:501 +#, c-format +msgid "unhandled mode \"%s\"" +msgstr "μη χειÏισμένη κατάσταση «%s»" + +#: parallel.c:251 #, c-format msgid "%s() failed: error code %d" msgstr "%s() απέτυχε: κωδικός σφάλματος %d" -#: parallel.c:961 +#: parallel.c:959 #, c-format msgid "could not create communication channels: %m" msgstr "δεν ήταν δυνατή η δημιουÏγία καναλιών επικοινωνίας: %m" -#: parallel.c:1018 +#: parallel.c:1016 #, c-format msgid "could not create worker process: %m" msgstr "δεν ήταν δυνατή η δημιουÏγία διεÏγασίας εÏγάτη: %m" -#: parallel.c:1148 +#: parallel.c:1146 #, c-format msgid "unrecognized command received from leader: \"%s\"" msgstr "μη αναγνωÏίσιμη εντολή που ελήφθη από τον αÏχηγό: «%s»" -#: parallel.c:1191 parallel.c:1429 +#: parallel.c:1189 parallel.c:1427 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "άκυÏο μήνυμα που ελήφθη από εÏγάτη: «%s»" -#: parallel.c:1323 +#: parallel.c:1321 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -436,557 +525,557 @@ msgstr "" "δεν ήταν δυνατή η απόκτηση ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Î³Î¹Î± τη σχέση \"%s\"\n" "Αυτό συνήθως σημαίνει ότι κάποιος ζήτησε ένα κλειδί ACCESS EXCLUSIVE στον πίνακα Î±Ï†Î¿Ï Î· γονική διεÏγασία pg_dump είχε ήδη αποκτήσει το αÏχικό κλειδί ACCESS SHARE στον πίνακα." -#: parallel.c:1412 +#: parallel.c:1410 #, c-format msgid "a worker process died unexpectedly" msgstr "μία διεÏγασία εÏγάτη τεÏματίστηκε απÏόσμενα" -#: parallel.c:1534 parallel.c:1652 +#: parallel.c:1532 parallel.c:1650 #, c-format msgid "could not write to the communication channel: %m" msgstr "δεν ήταν δυνατή η εγγÏαφή στο κανάλι επικοινωνίας: %m" -#: parallel.c:1736 +#: parallel.c:1734 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: δεν ήταν δυνατή η δημιουÏγία υποδοχέα: κωδικός σφάλματος %d" -#: parallel.c:1747 +#: parallel.c:1745 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: δεν ήταν δυνατή η δέσμευση: κωδικός σφάλματος %d" -#: parallel.c:1754 +#: parallel.c:1752 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: δεν ήταν δυνατή η ακÏόαση: κωδικός σφάλματος %d" -#: parallel.c:1761 +#: parallel.c:1759 #, c-format msgid "pgpipe: %s() failed: error code %d" msgstr "%s() απέτυχε: κωδικός σφάλματος %d" -#: parallel.c:1772 +#: parallel.c:1770 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: δεν ήταν δυνατή η δημιουÏγία δεÏτεÏης υποδοχής: κωδικός σφάλματος %d" -#: parallel.c:1781 +#: parallel.c:1779 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: δεν ήταν δυνατή η σÏνδεση της υποδοχής: κωδικός σφάλματος %d" -#: parallel.c:1790 +#: parallel.c:1788 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: δεν ήταν δυνατή η αποδοχή σÏνδεσης: κωδικός σφάλματος %d" -#: pg_backup_archiver.c:280 pg_backup_archiver.c:1632 +#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603 #, c-format msgid "could not close output file: %m" msgstr "δεν ήταν δυνατό το κλείσιμο αÏχείου εξόδου: %m" -#: pg_backup_archiver.c:324 pg_backup_archiver.c:328 +#: pg_backup_archiver.c:320 pg_backup_archiver.c:324 #, c-format msgid "archive items not in correct section order" msgstr "αÏχειοθέτηση στοιχείων που δεν βÏίσκονται σε σωστή σειÏά ενότητας" -#: pg_backup_archiver.c:334 +#: pg_backup_archiver.c:330 #, c-format msgid "unexpected section code %d" msgstr "μη αναμενόμενος κώδικας ενότητας %d" -#: pg_backup_archiver.c:371 +#: pg_backup_archiver.c:367 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "η παÏάλληλη επαναφοÏά δεν υποστηÏίζεται από αυτήν τη μοÏφή αÏχείου αÏχειοθέτησης" -#: pg_backup_archiver.c:375 +#: pg_backup_archiver.c:371 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "η παÏάλληλη επαναφοÏά δεν υποστηÏίζεται με αÏχεία που έγιναν από pg_dump Ï€Ïο έκδοσης 8.0" -#: pg_backup_archiver.c:393 +#: pg_backup_archiver.c:392 #, c-format -msgid "cannot restore from compressed archive (compression not supported in this installation)" -msgstr "δεν είναι δυνατή η επαναφοÏά από συμπιεσμένη αÏχειοθήκη (η συμπίεση δεν υποστηÏίζεται σε αυτήν την εγκατάσταση)" +msgid "cannot restore from compressed archive (%s)" +msgstr "δεν είναι δυνατή η επαναφοÏά από συμπιεσμένη αÏχειοθήκη (%s)" -#: pg_backup_archiver.c:410 +#: pg_backup_archiver.c:412 #, c-format msgid "connecting to database for restore" msgstr "σÏνδεση με βάση δεδομένων για επαναφοÏά" -#: pg_backup_archiver.c:412 +#: pg_backup_archiver.c:414 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "οι απευθείας συνδέσεις βάσεων δεδομένων δεν υποστηÏίζονται σε Ï€Ïο-1.3 αÏχεία" -#: pg_backup_archiver.c:455 +#: pg_backup_archiver.c:457 #, c-format msgid "implied data-only restore" msgstr "υποδηλοÏμενη επαναφοÏά μόνο δεδομένων" -#: pg_backup_archiver.c:521 +#: pg_backup_archiver.c:523 #, c-format msgid "dropping %s %s" msgstr "εγκαταλείπει %s: %s" -#: pg_backup_archiver.c:621 +#: pg_backup_archiver.c:623 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "δεν ήταν δυνατή η εÏÏεση του σημείου εισαγωγής IF EXISTS στη δήλωση «%s»" -#: pg_backup_archiver.c:777 pg_backup_archiver.c:779 +#: pg_backup_archiver.c:778 pg_backup_archiver.c:780 #, c-format msgid "warning from original dump file: %s" msgstr "Ï€Ïοειδοποίηση από το αÏχικό αÏχείο απόθεσης: %s" -#: pg_backup_archiver.c:794 +#: pg_backup_archiver.c:795 #, c-format msgid "creating %s \"%s.%s\"" msgstr "δημιουÏγία %s «%s.%s»" -#: pg_backup_archiver.c:797 +#: pg_backup_archiver.c:798 #, c-format msgid "creating %s \"%s\"" msgstr "δημιουÏγία %s «%s»" -#: pg_backup_archiver.c:847 +#: pg_backup_archiver.c:848 #, c-format msgid "connecting to new database \"%s\"" msgstr "σÏνδεση με νέα βάση δεδομένων «%s»" -#: pg_backup_archiver.c:874 +#: pg_backup_archiver.c:875 #, c-format msgid "processing %s" msgstr "επεξεÏγασία %s" -#: pg_backup_archiver.c:896 +#: pg_backup_archiver.c:897 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "επεξεÏγασία δεδομένων για τον πίνακα «%s.%s»" -#: pg_backup_archiver.c:966 +#: pg_backup_archiver.c:967 #, c-format msgid "executing %s %s" msgstr "εκτέλεση %s %s" -#: pg_backup_archiver.c:1005 +#: pg_backup_archiver.c:1008 #, c-format msgid "disabling triggers for %s" msgstr "απενεÏγοποίηση ενεÏγοποιήσεων για %s" -#: pg_backup_archiver.c:1031 +#: pg_backup_archiver.c:1034 #, c-format msgid "enabling triggers for %s" msgstr "ενεÏγοποίηση ενεÏγοποιήσεων για %s" -#: pg_backup_archiver.c:1096 +#: pg_backup_archiver.c:1099 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "εσωτεÏικό σφάλμα -- Δεν είναι δυνατή η κλήση του WriteData εκτός του πεÏιβάλλοντος μιας Ïουτίνας DataDumper" -#: pg_backup_archiver.c:1279 +#: pg_backup_archiver.c:1287 #, c-format msgid "large-object output not supported in chosen format" msgstr "η έξοδος μεγάλου αντικειμένου δεν υποστηÏίζεται στην επιλεγμένη μοÏφή" -#: pg_backup_archiver.c:1337 +#: pg_backup_archiver.c:1345 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "επανέφεÏε %d μεγάλο αντικείμενο" msgstr[1] "επανέφεÏε %d μεγάλα αντικείμενα" -#: pg_backup_archiver.c:1358 pg_backup_tar.c:669 +#: pg_backup_archiver.c:1366 pg_backup_tar.c:668 #, c-format msgid "restoring large object with OID %u" msgstr "επαναφοÏά μεγάλου αντικειμένου με OID %u" -#: pg_backup_archiver.c:1370 +#: pg_backup_archiver.c:1378 #, c-format msgid "could not create large object %u: %s" msgstr "δεν ήταν δυνατή η δημιουÏγία μεγάλου αντικειμένου %u: %s" -#: pg_backup_archiver.c:1375 pg_dump.c:3607 +#: pg_backup_archiver.c:1383 pg_dump.c:3718 #, c-format msgid "could not open large object %u: %s" msgstr "δεν ήταν δυνατό το άνοιγμα μεγάλου αντικειμένου %u: %s" -#: pg_backup_archiver.c:1431 +#: pg_backup_archiver.c:1439 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου TOC «%s»: %m" -#: pg_backup_archiver.c:1459 +#: pg_backup_archiver.c:1467 #, c-format msgid "line ignored: %s" msgstr "παÏαβλέπεται γÏαμμή: %s" -#: pg_backup_archiver.c:1466 +#: pg_backup_archiver.c:1474 #, c-format msgid "could not find entry for ID %d" msgstr "δεν ήταν δυνατή η εÏÏεση καταχώÏησης για ID %d" -#: pg_backup_archiver.c:1489 pg_backup_directory.c:222 -#: pg_backup_directory.c:599 +#: pg_backup_archiver.c:1497 pg_backup_directory.c:221 +#: pg_backup_directory.c:606 #, c-format msgid "could not close TOC file: %m" msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου TOC %m" -#: pg_backup_archiver.c:1603 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:586 pg_backup_directory.c:649 -#: pg_backup_directory.c:668 pg_dumpall.c:476 +#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332 +#: pg_backup_directory.c:593 pg_backup_directory.c:658 +#: pg_backup_directory.c:676 pg_dumpall.c:501 #, c-format msgid "could not open output file \"%s\": %m" msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου εξόδου «%s»: %m" -#: pg_backup_archiver.c:1605 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1586 pg_backup_custom.c:162 #, c-format msgid "could not open output file: %m" msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου εξόδου %m" -#: pg_backup_archiver.c:1699 +#: pg_backup_archiver.c:1669 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" msgstr[0] "έγÏαψε %zu byte δεδομένων μεγάλου αντικειμένου (αποτέλεσμα = %d)" msgstr[1] "έγÏαψε %zu bytes δεδομένων μεγάλου αντικειμένου (αποτέλεσμα = %d)" -#: pg_backup_archiver.c:1705 +#: pg_backup_archiver.c:1675 #, c-format msgid "could not write to large object: %s" msgstr "δεν ήταν δυνατή η εγγÏαφή σε μεγάλο αντικείμενο: %s" -#: pg_backup_archiver.c:1795 +#: pg_backup_archiver.c:1765 #, c-format msgid "while INITIALIZING:" msgstr "ενόσω INITIALIZING:" -#: pg_backup_archiver.c:1800 +#: pg_backup_archiver.c:1770 #, c-format msgid "while PROCESSING TOC:" msgstr "ενόσω PROCESSING TOC:" -#: pg_backup_archiver.c:1805 +#: pg_backup_archiver.c:1775 #, c-format msgid "while FINALIZING:" msgstr "ενόσω FINALIZING:" -#: pg_backup_archiver.c:1810 +#: pg_backup_archiver.c:1780 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "από καταχώÏηση TOC %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1886 +#: pg_backup_archiver.c:1856 #, c-format msgid "bad dumpId" msgstr "εσφαλμένο dumpId" -#: pg_backup_archiver.c:1907 +#: pg_backup_archiver.c:1877 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "εσφαλμένος πίνακας dumpId για στοιχείο TABLE DATA" -#: pg_backup_archiver.c:1999 +#: pg_backup_archiver.c:1969 #, c-format msgid "unexpected data offset flag %d" msgstr "μη αναμενόμενη σημαία όφσετ δεδομένων %d" -#: pg_backup_archiver.c:2012 +#: pg_backup_archiver.c:1982 #, c-format msgid "file offset in dump file is too large" msgstr "το όφσετ αÏχείου στο αÏχείο απόθεσης είναι Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿" -#: pg_backup_archiver.c:2150 pg_backup_archiver.c:2160 +#: pg_backup_archiver.c:2093 #, c-format msgid "directory name too long: \"%s\"" msgstr "Ï€Î¿Î»Ï Î¼Î±ÎºÏÏ ÏŒÎ½Î¿Î¼Î± καταλόγου: «%s»" -#: pg_backup_archiver.c:2168 +#: pg_backup_archiver.c:2143 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "ο κατάλογος «%s» δεν φαίνεται να είναι έγκυÏη αÏχειοθήκη (το «toc.dat» δεν υπάÏχει)" -#: pg_backup_archiver.c:2176 pg_backup_custom.c:173 pg_backup_custom.c:807 -#: pg_backup_directory.c:207 pg_backup_directory.c:395 +#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816 +#: pg_backup_directory.c:206 pg_backup_directory.c:395 #, c-format msgid "could not open input file \"%s\": %m" msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου εισόδου «%s»: %m" -#: pg_backup_archiver.c:2183 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2158 pg_backup_custom.c:179 #, c-format msgid "could not open input file: %m" msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου εισόδου %m" -#: pg_backup_archiver.c:2189 +#: pg_backup_archiver.c:2164 #, c-format msgid "could not read input file: %m" msgstr "δεν ήταν δυνατή η ανάγνωση αÏχείου εισόδου: %m" -#: pg_backup_archiver.c:2191 +#: pg_backup_archiver.c:2166 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "το αÏχείο εισόδου είναι Ï€Î¿Î»Ï ÏƒÏντομο (διάβασε %lu, ανάμενε 5)" -#: pg_backup_archiver.c:2223 +#: pg_backup_archiver.c:2198 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "το αÏχείο εισαγωγής φαίνεται να είναι απόθεση μοÏφής κειμένου. ΠαÏακαλώ χÏησιμοποιήστε το psql." -#: pg_backup_archiver.c:2229 +#: pg_backup_archiver.c:2204 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "το αÏχείο εισόδου δεν φαίνεται να είναι έγκυÏη αÏχειοθήκη (Ï€Î¿Î»Ï ÏƒÏντομο;)" -#: pg_backup_archiver.c:2235 +#: pg_backup_archiver.c:2210 #, c-format msgid "input file does not appear to be a valid archive" msgstr "το αÏχείο εισόδου δεν φαίνεται να είναι έγκυÏη αÏχειοθήκη" -#: pg_backup_archiver.c:2244 +#: pg_backup_archiver.c:2219 #, c-format msgid "could not close input file: %m" msgstr "δεν ήταν δυνατό το κλείσιμο αÏχείου εισόδου: %m" -#: pg_backup_archiver.c:2361 +#: pg_backup_archiver.c:2297 +#, c-format +msgid "could not open stdout for appending: %m" +msgstr "δεν ήταν δυνατό το άνοιγμα τυπικής εξόδου για Ï€ÏοσάÏτηση: %m" + +#: pg_backup_archiver.c:2342 #, c-format msgid "unrecognized file format \"%d\"" msgstr "μη αναγνωÏίσιμη μοÏφή αÏχείου «%d»" -#: pg_backup_archiver.c:2443 pg_backup_archiver.c:4505 +#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4448 #, c-format msgid "finished item %d %s %s" msgstr "τεÏματισμός στοιχείου %d %s %s" -#: pg_backup_archiver.c:2447 pg_backup_archiver.c:4518 +#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4461 #, c-format msgid "worker process failed: exit code %d" msgstr "διεÏγασία εÏγάτη απέτυχε: κωδικός εξόδου %d" -#: pg_backup_archiver.c:2568 +#: pg_backup_archiver.c:2548 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "καταχώÏηση με ID %d εκτός εÏÏους τιμών -- ίσως αλλοιωμένο TOC" -#: pg_backup_archiver.c:2648 +#: pg_backup_archiver.c:2628 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "η επαναφοÏά πινάκων WITH OIDS δεν υποστηÏίζεται πλέον" -#: pg_backup_archiver.c:2730 +#: pg_backup_archiver.c:2710 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "μη αναγνωÏίσιμη κωδικοποίηση «%s»" -#: pg_backup_archiver.c:2735 +#: pg_backup_archiver.c:2715 #, c-format msgid "invalid ENCODING item: %s" msgstr "μη έγκυÏο στοιχείο ENCODING: %s" -#: pg_backup_archiver.c:2753 +#: pg_backup_archiver.c:2733 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "μη έγκυÏο στοιχείο STDSTRINGS: %s" -#: pg_backup_archiver.c:2778 +#: pg_backup_archiver.c:2758 #, c-format msgid "schema \"%s\" not found" msgstr "το σχήμα «%s» δεν βÏέθηκε" -#: pg_backup_archiver.c:2785 +#: pg_backup_archiver.c:2765 #, c-format msgid "table \"%s\" not found" msgstr "ο πίνακας «%s» δεν βÏέθηκε" -#: pg_backup_archiver.c:2792 +#: pg_backup_archiver.c:2772 #, c-format msgid "index \"%s\" not found" msgstr "το ευÏετήÏιο «%s» δεν βÏέθηκε" -#: pg_backup_archiver.c:2799 +#: pg_backup_archiver.c:2779 #, c-format msgid "function \"%s\" not found" msgstr "η συνάÏτηση «%s» δεν βÏέθηκε" -#: pg_backup_archiver.c:2806 +#: pg_backup_archiver.c:2786 #, c-format msgid "trigger \"%s\" not found" msgstr "η ενεÏγοποίηση «%s» δεν βÏέθηκε" -#: pg_backup_archiver.c:3203 +#: pg_backup_archiver.c:3183 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "δεν ήταν δυνατός ο οÏισμός του χÏήστη συνεδÏίας σε «%s»: %s" -#: pg_backup_archiver.c:3340 +#: pg_backup_archiver.c:3315 #, c-format msgid "could not set search_path to \"%s\": %s" msgstr "δεν ήταν δυνατός ο οÏισμός του search_path σε «%s»: %s" -#: pg_backup_archiver.c:3402 +#: pg_backup_archiver.c:3376 #, c-format msgid "could not set default_tablespace to %s: %s" msgstr "δεν ήταν δυνατός ο οÏισμός του default_tablespace σε «%s»: %s" -#: pg_backup_archiver.c:3452 +#: pg_backup_archiver.c:3425 #, c-format msgid "could not set default_table_access_method: %s" msgstr "δεν ήταν δυνατός ο οÏισμός του default_table_access_method: %s" -#: pg_backup_archiver.c:3546 pg_backup_archiver.c:3711 +#: pg_backup_archiver.c:3530 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "δεν γνωÏίζω πώς να οÏιστεί κάτοχος για Ï„Ïπο αντικειμένου «%s»" -#: pg_backup_archiver.c:3814 +#: pg_backup_archiver.c:3752 #, c-format msgid "did not find magic string in file header" msgstr "δεν βÏέθηκε μαγική συμβολοσειÏά στην κεφαλίδα αÏχείου" -#: pg_backup_archiver.c:3828 +#: pg_backup_archiver.c:3766 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "μη υποστηÏιζόμενη έκδοση (%d.%d) στην κεφαλίδα αÏχείου" -#: pg_backup_archiver.c:3833 +#: pg_backup_archiver.c:3771 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "απέτυχε έλεγχος ακεÏαιότητας για μέγεθος ακεÏαίου (%lu)" -#: pg_backup_archiver.c:3837 +#: pg_backup_archiver.c:3775 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "το αÏχείο δημιουÏγήθηκε σε έναν υπολογιστή με μεγαλÏτεÏους ακέÏαιους, οÏισμένες λειτουÏγίες ενδέχεται να αποτÏχουν" -#: pg_backup_archiver.c:3847 +#: pg_backup_archiver.c:3785 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "η αναμενόμενη μοÏφή (%d) διαφέÏει από τη μοÏφή που βÏίσκεται στο αÏχείο (%d)" -#: pg_backup_archiver.c:3862 +#: pg_backup_archiver.c:3807 #, c-format -msgid "archive is compressed, but this installation does not support compression -- no data will be available" -msgstr "το αÏχείο είναι συμπιεσμένο, αλλά αυτή η εγκατάσταση δεν υποστηÏίζει συμπίεση -- δεν θα υπάÏχουν διαθέσιμα δεδομένα" +msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available" +msgstr "το αÏχείο είναι συμπιεσμένο, αλλά αυτή η εγκατάσταση δεν υποστηÏίζει συμπίεση (%s) -- δεν θα υπάÏχουν διαθέσιμα δεδομένα" -#: pg_backup_archiver.c:3896 +#: pg_backup_archiver.c:3843 #, c-format msgid "invalid creation date in header" msgstr "μη έγκυÏη ημεÏομηνία δημιουÏγίας στην κεφαλίδα" -#: pg_backup_archiver.c:4030 +#: pg_backup_archiver.c:3977 #, c-format msgid "processing item %d %s %s" msgstr "επεξεÏγασία στοιχείου %d %s %s" -#: pg_backup_archiver.c:4109 +#: pg_backup_archiver.c:4052 #, c-format msgid "entering main parallel loop" msgstr "εισέÏχεται στο κÏÏιο παÏάλληλο βÏόχο" -#: pg_backup_archiver.c:4120 +#: pg_backup_archiver.c:4063 #, c-format msgid "skipping item %d %s %s" msgstr "παÏάβλεψη στοιχείου %d %s %s" -#: pg_backup_archiver.c:4129 +#: pg_backup_archiver.c:4072 #, c-format msgid "launching item %d %s %s" msgstr "εκκίνηση στοιχείου %d %s %s" -#: pg_backup_archiver.c:4183 +#: pg_backup_archiver.c:4126 #, c-format msgid "finished main parallel loop" msgstr "εξέÏχεται από το κÏÏιο παÏάλληλο βÏόχο" -#: pg_backup_archiver.c:4219 +#: pg_backup_archiver.c:4162 #, c-format msgid "processing missed item %d %s %s" msgstr "επεξεÏγασία παÏαβλεπόμενου στοιχείου %d %s %s" -#: pg_backup_archiver.c:4824 +#: pg_backup_archiver.c:4767 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "δεν ήταν δυνατή η δημιουÏγία του πίνακα «%s», δεν θα επαναφεÏθοÏν τα δεδομένα του" -#: pg_backup_custom.c:376 pg_backup_null.c:147 +#: pg_backup_custom.c:380 pg_backup_null.c:147 #, c-format msgid "invalid OID for large object" msgstr "μη έγκυÏο OID για μεγάλο αντικειμένο" -#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629 -#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021 +#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640 +#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019 #, c-format msgid "error during file seek: %m" msgstr "σφάλμα κατά τη διάÏκεια αναζήτησης σε αÏχείο: %m" -#: pg_backup_custom.c:478 +#: pg_backup_custom.c:484 #, c-format msgid "data block %d has wrong seek position" msgstr "%d μπλοκ δεδομένων έχει εσφαλμένη θέση αναζήτησης" -#: pg_backup_custom.c:495 +#: pg_backup_custom.c:501 #, c-format msgid "unrecognized data block type (%d) while searching archive" msgstr "Ï„Ïπος μπλοκ δεδομένων (%d) που δεν αναγνωÏίζεται κατά την αναζήτηση αÏχειοθέτησης" -#: pg_backup_custom.c:517 +#: pg_backup_custom.c:523 #, c-format msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file" msgstr "δεν ήταν δυνατή η εÏÏεση μπλοκ ID %d στο αÏχείο -- πιθανώς λόγω αίτησης επαναφοÏάς εκτός σειÏάς, η οποία δεν είναι δυνατό να αντιμετωπιστεί λόγω μη αναζητήσιμου αÏχείου εισόδου" -#: pg_backup_custom.c:522 +#: pg_backup_custom.c:528 #, c-format msgid "could not find block ID %d in archive -- possibly corrupt archive" msgstr "δεν ήταν δυνατή η εÏÏεση μπλοκ ID %d στην αÏχειοθήκη -- πιθανώς αλλοιωμένη αÏχειοθήκη" -#: pg_backup_custom.c:529 +#: pg_backup_custom.c:535 #, c-format msgid "found unexpected block ID (%d) when reading data -- expected %d" msgstr "βÏέθηκε μη αναμενόμενο μπλοκ ID (%d) κατά την ανάγνωση δεδομένων -- αναμενόμενο %d" -#: pg_backup_custom.c:543 +#: pg_backup_custom.c:549 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "μη αναγνωÏίσιμος Ï„Ïπος μπλοκ δεδομένων %d κατά την επαναφοÏά της αÏχειοθήκης" -#: pg_backup_custom.c:645 -#, c-format -msgid "could not read from input file: %m" -msgstr "δεν ήταν δυνατή η ανάγνωση από αÏχείο: %m" - -#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943 -#: pg_backup_tar.c:1019 +#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952 +#: pg_backup_tar.c:1017 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "δεν ήταν δυνατός ο Ï€ÏοσδιοÏισμός της θέσης αναζήτησης στην αÏχειοθήκη: %m" -#: pg_backup_custom.c:762 pg_backup_custom.c:802 +#: pg_backup_custom.c:771 pg_backup_custom.c:811 #, c-format msgid "could not close archive file: %m" msgstr "δεν ήταν δυνατό το κλείσιμο της αÏχειοθήκης: %m" -#: pg_backup_custom.c:785 +#: pg_backup_custom.c:794 #, c-format msgid "can only reopen input archives" msgstr "μποÏεί να επα-ανοίξει μόνο αÏχειοθήκες εισόδου" -#: pg_backup_custom.c:792 +#: pg_backup_custom.c:801 #, c-format msgid "parallel restore from standard input is not supported" msgstr "η επαναφοÏά από τυπική είσοδο δεν υποστηÏίζεται" -#: pg_backup_custom.c:794 +#: pg_backup_custom.c:803 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "η παÏάλληλη επαναφοÏά από μη αναζητήσιμο αÏχείο δεν υποστηÏίζεται" -#: pg_backup_custom.c:810 +#: pg_backup_custom.c:819 #, c-format msgid "could not set seek position in archive file: %m" msgstr "δεν ήταν δυνατή η αναζήτηση θέσης στο αÏχείο αÏχειοθέτησης: %m" -#: pg_backup_custom.c:889 +#: pg_backup_custom.c:898 #, c-format msgid "compressor active" msgstr "συμπιεστής ενεÏγός" @@ -996,12 +1085,12 @@ msgstr "συμπιεστής ενεÏγός" msgid "could not get server_version from libpq" msgstr "δεν ήταν δυνατή η απόκτηση server_version από libpq" -#: pg_backup_db.c:53 pg_dumpall.c:1646 +#: pg_backup_db.c:53 pg_dumpall.c:1809 #, c-format msgid "aborting because of server version mismatch" msgstr "ματαίωση λόγω ασυμφωνίας έκδοσης διακομιστή" -#: pg_backup_db.c:54 pg_dumpall.c:1647 +#: pg_backup_db.c:54 pg_dumpall.c:1810 #, c-format msgid "server version: %s; %s version: %s" msgstr "έκδοση διακομιστή: %s; %s έκδοση: %s" @@ -1011,7 +1100,7 @@ msgstr "έκδοση διακομιστή: %s; %s έκδοση: %s" msgid "already connected to a database" msgstr "ήδη συνδεδεμένος σε βάση δεδομένων" -#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758 msgid "Password: " msgstr "Κωδικός Ï€Ïόσβασης: " @@ -1025,92 +1114,93 @@ msgstr "δεν ήταν δυνατή η σÏνδεση σε βάση δεδομ msgid "reconnection failed: %s" msgstr "επανασÏνδεση απέτυχε: %s" -#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280 +#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732 +#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895 #, c-format msgid "query failed: %s" msgstr "το εÏώτημα απέτυχε: %s" -#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733 +#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896 #, c-format msgid "Query was: %s" msgstr "Το εÏώτημα ήταν: %s" -#: pg_backup_db.c:316 +#: pg_backup_db.c:315 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" msgstr[0] "το εÏώτημα επέστÏεψε %d σειÏά αντί μίας: %s" msgstr[1] "το εÏώτημα επέστÏεψε %d σειÏές αντί μίας: %s" -#: pg_backup_db.c:352 +#: pg_backup_db.c:351 #, c-format msgid "%s: %sCommand was: %s" msgstr "%s: %s η εντολή ήταν: %s" -#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489 +#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488 msgid "could not execute query" msgstr "δεν ήταν δυνατή η εκτέλεση εÏωτήματος" -#: pg_backup_db.c:461 +#: pg_backup_db.c:460 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "επιστÏάφηκε σφάλμα από PQputCopyData: %s" -#: pg_backup_db.c:510 +#: pg_backup_db.c:509 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "επιστÏάφηκε σφάλμα από PQputCopyEnd: %s" -#: pg_backup_db.c:516 +#: pg_backup_db.c:515 #, c-format msgid "COPY failed for table \"%s\": %s" msgstr "COPY απέτυχε για πίνακα «%s»: %s" -#: pg_backup_db.c:522 pg_dump.c:2106 +#: pg_backup_db.c:521 pg_dump.c:2202 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "μη αναμενόμενα αποτελέσματα κατά τη διάÏκεια COPY του πίνακα «%s»" -#: pg_backup_db.c:534 +#: pg_backup_db.c:533 msgid "could not start database transaction" msgstr "δεν ήταν δυνατή η εκκίνηση συναλλαγής βάσης δεδομένων" -#: pg_backup_db.c:542 +#: pg_backup_db.c:541 msgid "could not commit database transaction" msgstr "δεν ήταν δυνατή η ολοκλήÏωση της συναλλαγής βάσης δεδομένων" -#: pg_backup_directory.c:156 +#: pg_backup_directory.c:155 #, c-format msgid "no output directory specified" msgstr "δεν οÏίστηκε κατάλογος δεδομένων εξόδου" -#: pg_backup_directory.c:185 +#: pg_backup_directory.c:184 #, c-format msgid "could not read directory \"%s\": %m" msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m" -#: pg_backup_directory.c:189 +#: pg_backup_directory.c:188 #, c-format msgid "could not close directory \"%s\": %m" msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m" -#: pg_backup_directory.c:195 +#: pg_backup_directory.c:194 #, c-format msgid "could not create directory \"%s\": %m" msgstr "δεν ήταν δυνατή η δημιουÏγία του καταλόγου «%s»: %m" -#: pg_backup_directory.c:355 pg_backup_directory.c:497 -#: pg_backup_directory.c:533 +#: pg_backup_directory.c:356 pg_backup_directory.c:499 +#: pg_backup_directory.c:537 #, c-format msgid "could not write to output file: %s" msgstr "δεν ήταν δυνατή η εγγÏαφή εξόδου στο αÏχείο: %s" -#: pg_backup_directory.c:373 +#: pg_backup_directory.c:374 #, c-format msgid "could not close data file: %m" msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου δεδομένων: %m" @@ -1120,42 +1210,42 @@ msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου msgid "could not close data file \"%s\": %m" msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου δεδομένων «%s»: %m" -#: pg_backup_directory.c:447 +#: pg_backup_directory.c:448 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου TOC μεγάλου αντικειμένου «%s» για είσοδο: %m" -#: pg_backup_directory.c:458 +#: pg_backup_directory.c:459 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "μη έγκυÏη γÏαμμή σε αÏχείο TOC μεγάλου αντικειμένου «%s»: «%s»" -#: pg_backup_directory.c:467 +#: pg_backup_directory.c:468 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "σφάλμα κατά την ανάγνωση αÏχείου TOC μεγάλου αντικειμένου «%s»" -#: pg_backup_directory.c:471 +#: pg_backup_directory.c:472 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "δεν ήταν δυνατό το κλείσιμο αÏχείου TOC μεγάλου αντικειμένου «%s»: %m" -#: pg_backup_directory.c:685 +#: pg_backup_directory.c:694 #, c-format -msgid "could not close blob data file: %m" -msgstr "δεν μπόÏεσε να κλείσει το αÏχείο δεδομένων μεγάλων αντικειμένων: %m" +msgid "could not close LO data file: %m" +msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου δεδομένων LO: %m" -#: pg_backup_directory.c:691 +#: pg_backup_directory.c:704 #, c-format -msgid "could not write to blobs TOC file" -msgstr "δεν ήταν δυνατή η εγγÏαφή σε αÏχείο TOC blobs" +msgid "could not write to LOs TOC file: %s" +msgstr "δεν ήταν δυνατή η εγγÏαφή σε αÏχείο LOs TOC: %s" -#: pg_backup_directory.c:705 +#: pg_backup_directory.c:720 #, c-format -msgid "could not close blobs TOC file: %m" -msgstr "δεν ήταν δυνατό το κλείσιμο αÏχείου TOC μεγάλων αντικειμένων: %m" +msgid "could not close LOs TOC file: %m" +msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου LOs TOC %m" -#: pg_backup_directory.c:724 +#: pg_backup_directory.c:739 #, c-format msgid "file name too long: \"%s\"" msgstr "Ï€Î¿Î»Ï Î¼Î±ÎºÏÏ ÏŒÎ½Î¿Î¼Î± αÏχείου: «%s»" @@ -1176,7 +1266,7 @@ msgid "could not open TOC file for output: %m" msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου TOC για έξοδο: %m" #: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 -#: pg_backup_tar.c:405 pg_backup_tar.c:893 +#: pg_backup_tar.c:405 pg_backup_tar.c:891 #, c-format msgid "compression is not supported by tar archive format" msgstr "δεν υποστηÏίζεται συμπίεση από τη μοÏφή αÏχειοθέτησης tar" @@ -1201,44 +1291,44 @@ msgstr "δεν ήταν δυνατή η εÏÏεση του αÏχείου «%s msgid "could not generate temporary file name: %m" msgstr "δεν ήταν δυνατή η δημιουÏγία ονόματος Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου: %m" -#: pg_backup_tar.c:624 +#: pg_backup_tar.c:623 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "μη αναμενόμενη σÏνταξη Ï€Ïότασης COPY: «%s»" -#: pg_backup_tar.c:890 +#: pg_backup_tar.c:888 #, c-format msgid "invalid OID for large object (%u)" msgstr "μη έγκυÏο OID για μεγάλο αντικείμενο (%u)" -#: pg_backup_tar.c:1035 +#: pg_backup_tar.c:1033 #, c-format msgid "could not close temporary file: %m" msgstr "δεν ήταν δυνατό το κλείσιμο Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου: %m" -#: pg_backup_tar.c:1038 +#: pg_backup_tar.c:1036 #, c-format msgid "actual file length (%lld) does not match expected (%lld)" msgstr "το Ï€Ïαγματικό μήκος του αÏχείου (%lld) δεν αντιστοιχεί στο αναμενόμενο (%lld)" -#: pg_backup_tar.c:1084 pg_backup_tar.c:1115 +#: pg_backup_tar.c:1082 pg_backup_tar.c:1113 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "δεν ήταν δυνατή η εÏÏεση κεφαλίδας για το αÏχείο «%s» στο αÏχείο tar" -#: pg_backup_tar.c:1102 +#: pg_backup_tar.c:1100 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "η επαναφοÏά δεδομένων εκτός σειÏάς δεν υποστηÏίζεται σε αυτήν τη μοÏφή αÏχειοθέτησης: απαιτείται «%s», αλλά Ï€Ïοηγείται της «%s» στο αÏχείο αÏχειοθέτησης." -#: pg_backup_tar.c:1149 +#: pg_backup_tar.c:1147 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "βÏέθηκε ατελής κεφαλίδα tar (%lu byte)" msgstr[1] "βÏέθηκε ατελής κεφαλίδα tar (%lu bytes)" -#: pg_backup_tar.c:1188 +#: pg_backup_tar.c:1186 #, c-format msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" msgstr "αλλοιωμένη κεφαλίδα tar βÏέθηκε σε %s (αναμενόμενη %d, υπολογισμένη %d) θέση αÏχείου %llu" @@ -1248,9 +1338,9 @@ msgstr "αλλοιωμένη κεφαλίδα tar βÏέθηκε σε %s (ανα msgid "unrecognized section name: \"%s\"" msgstr "μη αναγνωÏισμένο όνομα τμήματος: «%s»" -#: pg_backup_utils.c:55 pg_dump.c:628 pg_dump.c:645 pg_dumpall.c:340 -#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373 -#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307 +#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365 +#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398 +#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307 #: pg_restore.c:321 #, c-format msgid "Try \"%s --help\" for more information." @@ -1261,72 +1351,82 @@ msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πλη msgid "out of on_exit_nicely slots" msgstr "έλλειψη υποδοχών on_exit_nicely" -#: pg_dump.c:643 pg_dumpall.c:348 pg_restore.c:305 +#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)" -#: pg_dump.c:662 pg_restore.c:328 +#: pg_dump.c:696 pg_restore.c:328 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "οι επιλογές -s/--schema-only και -a/--data-only δεν είναι δυνατό να χÏησιμοποιηθοÏν μαζί" -#: pg_dump.c:665 +#: pg_dump.c:699 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "οι επιλογές -s/--schema-only και --include-foreign-data δεν είναι δυνατό να χÏησιμοποιηθοÏν μαζί" -#: pg_dump.c:668 +#: pg_dump.c:702 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "η επιλογή --include-foreign-data δεν υποστηÏίζεται με παÏάλληλη δημιουÏγία αντιγÏάφων ασφαλείας" -#: pg_dump.c:671 pg_restore.c:331 +#: pg_dump.c:705 pg_restore.c:331 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "οι επιλογές -c/--clean και -a/--data-only δεν είναι δυνατό να χÏησιμοποιηθοÏν μαζί" -#: pg_dump.c:674 pg_dumpall.c:378 pg_restore.c:356 +#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "η επιλογή --if-exists απαιτεί την επιλογή -c/--clean" -#: pg_dump.c:681 +#: pg_dump.c:715 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "η επιλογή --on-conflict-do-nothing απαιτεί την επιλογή --inserts, --rows-per-insert, ή --column-inserts" -#: pg_dump.c:703 +#: pg_dump.c:744 +#, c-format +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "μη αναγνωÏίσιμος αλγόÏιθμος συμπίεσης: «%s»" + +#: pg_dump.c:751 #, c-format -msgid "requested compression not available in this installation -- archive will be uncompressed" -msgstr "η συμπίεση που ζητήθηκε δεν είναι διαθέσιμη σε αυτήν την εγκατάσταση -- η αÏχειοθήκη θα είναι ασυμπίεστη" +msgid "invalid compression specification: %s" +msgstr "μη έγκυÏη Ï€ÏοδιαγÏαφή συμπίεσης: %s" -#: pg_dump.c:716 +#: pg_dump.c:764 +#, c-format +msgid "compression option \"%s\" is not currently supported by pg_dump" +msgstr "η επιλογή συμπίεσης «%s» δεν υποστηÏίζεται ακόμα από το pg_dump" + +#: pg_dump.c:776 #, c-format msgid "parallel backup only supported by the directory format" msgstr "παÏάλληλο αντίγÏαφο ασφαλείας υποστηÏίζεται μόνο από μοÏφή καταλόγου" -#: pg_dump.c:762 +#: pg_dump.c:822 #, c-format msgid "last built-in OID is %u" msgstr "το τελευταίο ενσωματωμένο OID είναι %u" -#: pg_dump.c:771 +#: pg_dump.c:831 #, c-format msgid "no matching schemas were found" msgstr "δεν βÏέθηκαν σχήματα που να ταιÏιάζουν" -#: pg_dump.c:785 +#: pg_dump.c:848 #, c-format msgid "no matching tables were found" msgstr "δεν βÏέθηκαν πίνακες που να ταιÏιάζουν" -#: pg_dump.c:807 +#: pg_dump.c:876 #, c-format msgid "no matching extensions were found" msgstr "δεν βÏέθηκαν επεκτάσεις που να ταιÏιάζουν" -#: pg_dump.c:990 +#: pg_dump.c:1056 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1335,17 +1435,17 @@ msgstr "" "%s αποθέτει μια βάση δεδομένων ως αÏχείο κειμένου ή σε άλλες μοÏφές.\n" "\n" -#: pg_dump.c:991 pg_dumpall.c:605 pg_restore.c:433 +#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433 #, c-format msgid "Usage:\n" msgstr "ΧÏήση:\n" -#: pg_dump.c:992 +#: pg_dump.c:1058 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n" -#: pg_dump.c:994 pg_dumpall.c:608 pg_restore.c:436 +#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436 #, c-format msgid "" "\n" @@ -1354,12 +1454,12 @@ msgstr "" "\n" "Γενικές επιλογές:\n" -#: pg_dump.c:995 +#: pg_dump.c:1061 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=FILENAME αÏχείο εξόδου ή όνομα καταλόγου\n" -#: pg_dump.c:996 +#: pg_dump.c:1062 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1368,42 +1468,46 @@ msgstr "" " -F, --format=c|d|t|p μοÏφή αÏχείου εξόδου (Ï€ÏοσαÏμοσμένη, κατάλογος, tar,\n" " απλό κείμενο (Ï€Ïοεπιλογή))\n" -#: pg_dump.c:998 +#: pg_dump.c:1064 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM χÏησιμοποιήστε τόσες πολλές παÏάλληλες εÏγασίες για απόθεση\n" -#: pg_dump.c:999 pg_dumpall.c:610 +#: pg_dump.c:1065 pg_dumpall.c:635 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose πεÏιφÏαστική λειτουÏγία\n" -#: pg_dump.c:1000 pg_dumpall.c:611 +#: pg_dump.c:1066 pg_dumpall.c:636 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης και, στη συνέχεια, έξοδος\n" -#: pg_dump.c:1001 +#: pg_dump.c:1067 #, c-format -msgid " -Z, --compress=0-9 compression level for compressed formats\n" -msgstr " -Z, --compress=0-9 επίπεδο συμπίεσης για συμπιεσμένες μοÏφές\n" +msgid "" +" -Z, --compress=METHOD[:DETAIL]\n" +" compress as specified\n" +msgstr "" +" -Z, --compress=METHOD[:DETAIL]\n" +" συμπίεσε όπως οÏίζεται\n" -#: pg_dump.c:1002 pg_dumpall.c:612 +#: pg_dump.c:1069 pg_dumpall.c:637 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=TIMEOUT αποτυγχάνει μετά την αναμονή TIMEOUT για το κλείδωμα πίνακα\n" -#: pg_dump.c:1003 pg_dumpall.c:639 +#: pg_dump.c:1070 pg_dumpall.c:664 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync να μην αναμένει την ασφαλή εγγÏαφή αλλαγών στον δίσκο\n" -#: pg_dump.c:1004 pg_dumpall.c:613 +#: pg_dump.c:1071 pg_dumpall.c:638 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, και μετά έξοδος\n" -#: pg_dump.c:1006 pg_dumpall.c:614 +#: pg_dump.c:1073 pg_dumpall.c:639 #, c-format msgid "" "\n" @@ -1412,52 +1516,62 @@ msgstr "" "\n" "Επιλογές που ελέγχουν το πεÏιεχόμενο εξόδου:\n" -#: pg_dump.c:1007 pg_dumpall.c:615 +#: pg_dump.c:1074 pg_dumpall.c:640 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only αποθέτει μόνο τα δεδομένα, όχι το σχήμα\n" -#: pg_dump.c:1008 +#: pg_dump.c:1075 +#, c-format +msgid " -b, --large-objects include large objects in dump\n" +msgstr " -b, --large-objects πεÏιέλαβε μεγάλα αντικείμενα στην απόθεση\n" + +#: pg_dump.c:1076 #, c-format -msgid " -b, --blobs include large objects in dump\n" -msgstr " -b, --blobs πεÏιέλαβε μεγάλα αντικείμενα στην απόθεση\n" +msgid " --blobs (same as --large-objects, deprecated)\n" +msgstr " -b, --blobs (όπως --large-objects, παÏωχημένο)\n" -#: pg_dump.c:1009 +#: pg_dump.c:1077 #, c-format -msgid " -B, --no-blobs exclude large objects in dump\n" +msgid " -B, --no-large-objects exclude large objects in dump\n" msgstr " -B, --no-blobs εξαίÏεσε μεγάλα αντικείμενα στην απόθεση\n" -#: pg_dump.c:1010 pg_restore.c:447 +#: pg_dump.c:1078 +#, c-format +msgid " --no-blobs (same as --no-large-objects, deprecated)\n" +msgstr " --no-blobs (όπως --no-large-objects, παÏωχημένο)\n" + +#: pg_dump.c:1079 pg_restore.c:447 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean καθάÏισε (εγκατάληψε) αντικείμενα βάσης δεδομένων Ï€Ïιν από την αναδημιουÏγία\n" -#: pg_dump.c:1011 +#: pg_dump.c:1080 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr " -C, --create συμπεÏιέλαβε εντολές για τη δημιουÏγία βάσης δεδομένων στην απόθεση\n" -#: pg_dump.c:1012 +#: pg_dump.c:1081 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr " -e, --extension=PATTERN απόÏιψε μόνο τις καθοÏισμένες επεκτάσεις\n" -#: pg_dump.c:1013 pg_dumpall.c:617 +#: pg_dump.c:1082 pg_dumpall.c:642 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=ENCODING απόθεσε τα δεδομένα στην κωδικοποίηση ENCODING\n" -#: pg_dump.c:1014 +#: pg_dump.c:1083 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=PATTERN απόθεση μόνο για τα καθοÏισμένα σχήματα\n" -#: pg_dump.c:1015 +#: pg_dump.c:1084 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=PATTERN να ΜΗΠαποθέσει τα καθοÏισμένα σχήματα\n" -#: pg_dump.c:1016 +#: pg_dump.c:1085 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1466,52 +1580,52 @@ msgstr "" " -O, --no-owner παÏάλειπε την αποκατάσταση της κυÏιότητας των αντικειμένων στη\n" " μοÏφή Î±Ï€Î»Î¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï…\n" -#: pg_dump.c:1018 pg_dumpall.c:621 +#: pg_dump.c:1087 pg_dumpall.c:646 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only απόθεση μόνο το σχήμα, χωÏίς δεδομένα\n" -#: pg_dump.c:1019 +#: pg_dump.c:1088 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr " -S, --superuser=NAME όνομα χÏήστη υπεÏ-χÏήστη που θα χÏησιμοποιηθεί σε μοÏφή Î±Ï€Î»Î¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï…\n" -#: pg_dump.c:1020 +#: pg_dump.c:1089 #, c-format -msgid " -t, --table=PATTERN dump the specified table(s) only\n" +msgid " -t, --table=PATTERN dump only the specified table(s)\n" msgstr " -t, --table=PATTERN απόθεση μόνο των καθοÏισμένων πινάκων\n" -#: pg_dump.c:1021 +#: pg_dump.c:1090 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=PATTERN να ΜΗΠαποθέτει τους καθοÏισμένους πίνακες\n" -#: pg_dump.c:1022 pg_dumpall.c:624 +#: pg_dump.c:1091 pg_dumpall.c:649 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges να ΜΗΠαποθέτει δικαιώματα (εκχώÏηση/ανάκληση)\n" -#: pg_dump.c:1023 pg_dumpall.c:625 +#: pg_dump.c:1092 pg_dumpall.c:650 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade μόνο για χÏήση μόνο από βοηθητικά Ï€ÏογÏάμματα αναβάθμισης\n" -#: pg_dump.c:1024 pg_dumpall.c:626 +#: pg_dump.c:1093 pg_dumpall.c:651 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" -msgstr " --column-inserts αποθέτει δεδομένα ως εντολές INSERT με ονόματα στηλών\n" +msgstr " --column-inserts απόθεσε δεδομένα ως εντολές INSERT με ονόματα στηλών\n" -#: pg_dump.c:1025 pg_dumpall.c:627 +#: pg_dump.c:1094 pg_dumpall.c:652 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr " --disable-dollar-quoting απενεÏγοποίησε την παÏάθεση δολαÏίου, χÏήση τυποποιημένης παÏάθεσης SQL\n" -#: pg_dump.c:1026 pg_dumpall.c:628 pg_restore.c:464 +#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr " --disable-triggers απενεÏγοποίησε τα εναÏσματα κατά την επαναφοÏά δεδομένων-μόνο\n" -#: pg_dump.c:1027 +#: pg_dump.c:1096 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" @@ -1520,22 +1634,44 @@ msgstr "" " --enable-row-security ενεÏγοποιήστε την ασφάλεια σειÏών (απόθεση μόνο του πεÏιεχομένου που ο χÏήστης έχει\n" " Ï€Ïόσβαση)\n" -#: pg_dump.c:1029 +#: pg_dump.c:1098 +#, c-format +msgid "" +" --exclude-table-and-children=PATTERN\n" +" do NOT dump the specified table(s), including\n" +" child and partition tables\n" +msgstr "" +" --exclude-table-and-children=PATTERN\n" +" να ΜΗΠαποθέσει τους οÏισμένους πίνακες, πεÏιλαμβάνοντας\n" +" απογονικοÏÏ‚ και κατατμημένους πίνακες\n" + +#: pg_dump.c:1101 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=PATTERN να ΜΗΠαποθέσει δεδομένα για τους καθοÏισμένους πίνακες\n" -#: pg_dump.c:1030 pg_dumpall.c:630 +#: pg_dump.c:1102 +#, c-format +msgid "" +" --exclude-table-data-and-children=PATTERN\n" +" do NOT dump data for the specified table(s),\n" +" including child and partition tables\n" +msgstr "" +" --exclude-table-data-and-children=PATTERN\n" +" να ΜΗΠαποθέσει δεδομένα για τους οÏισμένους πίνακες,\n" +" πεÏιλαμβάνοντας απογονικοÏÏ‚ και κατατμημένους πίνακες\n" + +#: pg_dump.c:1105 pg_dumpall.c:655 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=NUM παÏάκαμψε την Ï€Ïοεπιλεγμένη ÏÏθμιση για extra_float_digits\n" -#: pg_dump.c:1031 pg_dumpall.c:631 pg_restore.c:466 +#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists χÏησιμοποίησε το IF EXISTS κατά την εγκαταλήψη αντικειμένων\n" -#: pg_dump.c:1032 +#: pg_dump.c:1107 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1546,87 +1682,87 @@ msgstr "" " πεÏιέλαβε δεδομένα ξένων πινάκων για\n" " διακομιστές που ταιÏιάζουν με PATTERN\n" -#: pg_dump.c:1035 pg_dumpall.c:632 +#: pg_dump.c:1110 pg_dumpall.c:657 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts απόθεσε δεδομένα ως εντολές INSERT, αντί για COPY\n" -#: pg_dump.c:1036 pg_dumpall.c:633 +#: pg_dump.c:1111 pg_dumpall.c:658 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root φόÏτωσε διαχωÏίσματα μέσω του Î²Î±ÏƒÎ¹ÎºÎ¿Ï Ï€Î¯Î½Î±ÎºÎ±\n" -#: pg_dump.c:1037 pg_dumpall.c:634 +#: pg_dump.c:1112 pg_dumpall.c:659 #, c-format msgid " --no-comments do not dump comments\n" -msgstr " --no-comments να μην αποθέσεις σχόλια\n" +msgstr " --no-comments να μην αποθέσει σχόλια\n" -#: pg_dump.c:1038 pg_dumpall.c:635 +#: pg_dump.c:1113 pg_dumpall.c:660 #, c-format msgid " --no-publications do not dump publications\n" -msgstr " --no-publications να μην αποθέσεις δημοσιεÏσεις\n" +msgstr " --no-publications να μην αποθέσει δημοσιεÏσεις\n" -#: pg_dump.c:1039 pg_dumpall.c:637 +#: pg_dump.c:1114 pg_dumpall.c:662 #, c-format msgid " --no-security-labels do not dump security label assignments\n" -msgstr " --no-security-labels να μην αποθέσεις αντιστοιχίσεις ετικετών ασφαλείας\n" +msgstr " --no-security-labels να μην αποθέσει αντιστοιχίσεις ετικετών ασφαλείας\n" -#: pg_dump.c:1040 pg_dumpall.c:638 +#: pg_dump.c:1115 pg_dumpall.c:663 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" -msgstr " --no-publications να μην αποθέσεις συνδÏομές\n" +msgstr " --no-publications να μην αποθέσει συνδÏομές\n" -#: pg_dump.c:1041 pg_dumpall.c:640 +#: pg_dump.c:1116 pg_dumpall.c:665 #, c-format msgid " --no-table-access-method do not dump table access methods\n" msgstr " --no-table-access-method να μην αποθέσει μεθόδους Ï€Ïόσβασης πινάκων\n" -#: pg_dump.c:1042 pg_dumpall.c:641 +#: pg_dump.c:1117 pg_dumpall.c:666 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces να μην αποθέσει αναθέσεις πινακοχώÏος\n" -#: pg_dump.c:1043 pg_dumpall.c:642 +#: pg_dump.c:1118 pg_dumpall.c:667 #, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" msgstr " --no-toast-compression να μην αποθέσει τις μεθόδους συμπίεσης TOAST\n" -#: pg_dump.c:1044 pg_dumpall.c:643 +#: pg_dump.c:1119 pg_dumpall.c:668 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data να μην αποθέσει μη δεδομένα μη-καταγÏαμένου πίνακα\n" -#: pg_dump.c:1045 pg_dumpall.c:644 +#: pg_dump.c:1120 pg_dumpall.c:669 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" -msgstr " --on-conflict-do-nothing Ï€Ïοσθέστε ON CONFLICT DO NOTHING στις εντολές INSERT\n" +msgstr " --on-conflict-do-nothing Ï€Ïόσθεσε ON CONFLICT DO NOTHING στις εντολές INSERT\n" -#: pg_dump.c:1046 pg_dumpall.c:645 +#: pg_dump.c:1121 pg_dumpall.c:670 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr " --quote-all-identifiers παÏάθεσε όλα τα αναγνωÏιστικά, ακόμα και αν δεν είναι λέξεις κλειδιά\n" -#: pg_dump.c:1047 pg_dumpall.c:646 +#: pg_dump.c:1122 pg_dumpall.c:671 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NROWS αÏιθμός γÏαμμών ανά INSERT; υπονοεί --inserts\n" -#: pg_dump.c:1048 +#: pg_dump.c:1123 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr " --section=SECTION απόθεσε ονομασμένες ενότητες (Ï€Ïο-δεδομένα, δεδομένα, ή μετα-δεδομένα)\n" -#: pg_dump.c:1049 +#: pg_dump.c:1124 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr " --serializable-deferrable ανάμενε έως ότου η απόθεση να μποÏεί να Ï„Ïέξει χωÏίς ανωμαλίες\n" -#: pg_dump.c:1050 +#: pg_dump.c:1125 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT χÏησιμοποίησε το δοσμένο στιγμιότυπο για την απόθεση\n" -#: pg_dump.c:1051 pg_restore.c:476 +#: pg_dump.c:1126 pg_restore.c:476 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" @@ -1635,7 +1771,16 @@ msgstr "" " --strict-names απαίτησε τα μοτίβα πεÏίληψης πίνακα ή/και σχήματος να\n" " αντιστοιχήσουν τουλάχιστον μία οντότητα το καθένα\n" -#: pg_dump.c:1053 pg_dumpall.c:647 pg_restore.c:478 +#: pg_dump.c:1128 +#, c-format +msgid "" +" --table-and-children=PATTERN dump only the specified table(s), including\n" +" child and partition tables\n" +msgstr "" +" --table-and-children=PATTERN απόθεσε μόνο τους οÏισμένους πίνακες, πεÏιλαμβάνοντας\n" +" απογονικοÏÏ‚ και κατατμημένους πίνακες\n" + +#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1646,7 +1791,7 @@ msgstr "" " χÏησιμοποιήσε τις εντολές SET SESSION AUTHORIZATION αντί των\n" " ALTER OWNER για τον οÏισμό ιδιοκτησίας\n" -#: pg_dump.c:1057 pg_dumpall.c:651 pg_restore.c:482 +#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482 #, c-format msgid "" "\n" @@ -1655,42 +1800,42 @@ msgstr "" "\n" "Επιλογές σÏνδεσης:\n" -#: pg_dump.c:1058 +#: pg_dump.c:1135 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAME βάση δεδομένων για απόθεση\n" -#: pg_dump.c:1059 pg_dumpall.c:653 pg_restore.c:483 +#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n" -#: pg_dump.c:1060 pg_dumpall.c:655 pg_restore.c:484 +#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT θÏÏα διακομιστή βάσης δεδομένων\n" -#: pg_dump.c:1061 pg_dumpall.c:656 pg_restore.c:485 +#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAME σÏνδεση ως ο οÏισμένος χÏήστης βάσης δεδομένων\n" -#: pg_dump.c:1062 pg_dumpall.c:657 pg_restore.c:486 +#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός Ï€Ïόσβασης\n" -#: pg_dump.c:1063 pg_dumpall.c:658 pg_restore.c:487 +#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password αναγκαστική Ï€ÏοτÏοπή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης (Ï€Ïέπει να συμβεί αυτόματα)\n" -#: pg_dump.c:1064 pg_dumpall.c:659 +#: pg_dump.c:1141 pg_dumpall.c:684 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLENAME κάνε SET ROLE Ï€Ïιν την απόθεση\n" -#: pg_dump.c:1066 +#: pg_dump.c:1143 #, c-format msgid "" "\n" @@ -1703,448 +1848,448 @@ msgstr "" "πεÏιβάλλοντος PGDATABASE.\n" "\n" -#: pg_dump.c:1068 pg_dumpall.c:663 pg_restore.c:494 +#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n" -#: pg_dump.c:1069 pg_dumpall.c:664 pg_restore.c:495 +#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495 #, c-format msgid "%s home page: <%s>\n" msgstr "%s αÏχική σελίδα: <%s>\n" -#: pg_dump.c:1088 pg_dumpall.c:488 +#: pg_dump.c:1165 pg_dumpall.c:513 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "καθοÏίστηκε μη έγκυÏη κωδικοποίηση Ï€ÏογÏάμματος-πελάτη «%s»" -#: pg_dump.c:1226 +#: pg_dump.c:1303 #, c-format msgid "parallel dumps from standby servers are not supported by this server version" msgstr "οι παÏάλληλες αποθέσεις δεν υποστηÏίζονται από αυτήν την έκδοση διακομιστή" -#: pg_dump.c:1291 +#: pg_dump.c:1368 #, c-format msgid "invalid output format \"%s\" specified" msgstr "οÏίστηκε μη έγκυÏη μοÏφή εξόδου «%s»" -#: pg_dump.c:1332 pg_dump.c:1388 pg_dump.c:1441 pg_dumpall.c:1282 +#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "ακατάλληλο αναγνωÏισμένο όνομα (πάÏα πολλά διάστικτα ονόματα): %s" -#: pg_dump.c:1340 +#: pg_dump.c:1417 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "δεν βÏέθηκαν σχήματα που να ταιÏιάζουν με το μοτίβο «%s»" -#: pg_dump.c:1393 +#: pg_dump.c:1470 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "δεν βÏέθηκαν επεκτάσεις που ταιÏιάζουν με το μοτίβο «%s»" -#: pg_dump.c:1446 +#: pg_dump.c:1523 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "δεν βÏέθηκαν ξένοι διακομιστές που να ταιÏιάζουν με το μοτίβο «%s»" -#: pg_dump.c:1509 +#: pg_dump.c:1594 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "ακατάλληλο όνομα σχέσης (πολλά διάστικτα ονόματα): %s" -#: pg_dump.c:1520 +#: pg_dump.c:1616 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "δεν βÏέθηκαν πίνακες που να ταιÏιάζουν για το μοτίβο «%s»" -#: pg_dump.c:1547 +#: pg_dump.c:1643 #, c-format msgid "You are currently not connected to a database." msgstr "Αυτή τη στιγμή δεν είστε συνδεδεμένοι σε μία βάση δεδομένων." -#: pg_dump.c:1550 +#: pg_dump.c:1646 #, c-format msgid "cross-database references are not implemented: %s" msgstr "οι παÏαπομπές Î¼ÎµÏ„Î±Î¾Ï Î²Î¬ÏƒÎµÏ‰Î½ δεδομένων δεν είναι υλοποιημένες: %s" -#: pg_dump.c:1981 +#: pg_dump.c:2077 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "αποθέτει τα δεδομένα του πίνακα «%s.%s»" -#: pg_dump.c:2087 +#: pg_dump.c:2183 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Η απόθεση των πεÏιεχομένων του πίνακα «%s» απέτυχε: PQgetCopyData() απέτυχε." -#: pg_dump.c:2088 pg_dump.c:2098 +#: pg_dump.c:2184 pg_dump.c:2194 #, c-format msgid "Error message from server: %s" msgstr "Μήνυμα σφάλματος από διακομιστή: %s" -#: pg_dump.c:2089 pg_dump.c:2099 +#: pg_dump.c:2185 pg_dump.c:2195 #, c-format msgid "Command was: %s" msgstr "Η εντολή ήταν: %s" -#: pg_dump.c:2097 +#: pg_dump.c:2193 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Η απόθεση των πεÏιεχομένων του πίνακα «%s» απέτυχε: PQgetResult() απέτυχε." -#: pg_dump.c:2179 +#: pg_dump.c:2275 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "λανθασμένος αÏιθμός πεδίων που ανακτήθηκαν από τον πίνακα «%s»" -#: pg_dump.c:2875 +#: pg_dump.c:2973 #, c-format msgid "saving database definition" msgstr "αποθήκευση οÏÎ¹ÏƒÎ¼Î¿Ï Î²Î¬ÏƒÎ·Ï‚ δεδομένων" -#: pg_dump.c:2971 +#: pg_dump.c:3078 #, c-format msgid "unrecognized locale provider: %s" msgstr "μη αναγνωÏίσιμος πάÏοχος εντοπιότητας: %s" -#: pg_dump.c:3317 +#: pg_dump.c:3429 #, c-format msgid "saving encoding = %s" msgstr "αποθηκεÏει encoding = %s" -#: pg_dump.c:3342 +#: pg_dump.c:3454 #, c-format msgid "saving standard_conforming_strings = %s" msgstr "αποθηκεÏει standard_conforming_strings = %s" -#: pg_dump.c:3381 +#: pg_dump.c:3493 #, c-format msgid "could not parse result of current_schemas()" msgstr "δεν ήταν δυνατή η ανάλυση του αποτελέσματος της current_schemas()" -#: pg_dump.c:3400 +#: pg_dump.c:3512 #, c-format msgid "saving search_path = %s" msgstr "αποθηκεÏει search_path = %s" -#: pg_dump.c:3438 +#: pg_dump.c:3549 #, c-format msgid "reading large objects" msgstr "ανάγνωση μεγάλων αντικειμένων" -#: pg_dump.c:3576 +#: pg_dump.c:3687 #, c-format msgid "saving large objects" msgstr "αποθηκεÏει μεγάλων αντικειμένων" -#: pg_dump.c:3617 +#: pg_dump.c:3728 #, c-format msgid "error reading large object %u: %s" msgstr "σφάλμα κατά την ανάγνωση %u μεγάλου αντικειμένου: %s" -#: pg_dump.c:3723 +#: pg_dump.c:3834 #, c-format msgid "reading row-level security policies" msgstr "διαβάζει πολιτικές ασφαλείας επιπέδου σειÏάς" -#: pg_dump.c:3864 +#: pg_dump.c:3975 #, c-format msgid "unexpected policy command type: %c" msgstr "μη αναμενόμενος Ï„Ïπος εντολής πολιτικής: %c" -#: pg_dump.c:4314 pg_dump.c:4632 pg_dump.c:11833 pg_dump.c:17684 -#: pg_dump.c:17686 pg_dump.c:18307 +#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11984 pg_dump.c:17857 +#: pg_dump.c:17859 pg_dump.c:18480 #, c-format msgid "could not parse %s array" msgstr "δεν ήταν δυνατή η ανάλυση συστοιχίας %s" -#: pg_dump.c:4500 +#: pg_dump.c:4613 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "οι συνδÏομές δεν αποÏÏίπτονται, επειδή ο Ï„Ïέχων χÏήστης δεν είναι υπεÏχÏήστης" -#: pg_dump.c:5014 +#: pg_dump.c:5149 #, c-format msgid "could not find parent extension for %s %s" msgstr "δεν ήταν δυνατή η εÏÏεση γονικής επέκτασης για %s %s" -#: pg_dump.c:5159 +#: pg_dump.c:5294 #, c-format msgid "schema with OID %u does not exist" msgstr "το σχήμα με %u OID δεν υπάÏχει" -#: pg_dump.c:6613 pg_dump.c:16948 +#: pg_dump.c:6776 pg_dump.c:17121 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "απέτυχε ο έλεγχος ακεÏαιότητας, ο γονικός πίνακας με OID %u της ακολουθίας με OID %u δεν βÏέθηκε" -#: pg_dump.c:6756 +#: pg_dump.c:6919 #, c-format msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found" msgstr "απέτυχε ο έλεγχος ακεÏαιότηταςς, το OID %u πίνακα που εμφανίζεται στο pg_partitioned_table δεν βÏέθηκε" -#: pg_dump.c:6987 pg_dump.c:7254 pg_dump.c:7725 pg_dump.c:8392 pg_dump.c:8513 -#: pg_dump.c:8667 +#: pg_dump.c:7150 pg_dump.c:7417 pg_dump.c:7888 pg_dump.c:8552 pg_dump.c:8671 +#: pg_dump.c:8819 #, c-format msgid "unrecognized table OID %u" msgstr "μη αναγνωÏίσιμο OID %u πίνακα" -#: pg_dump.c:6991 +#: pg_dump.c:7154 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "μη έγκυÏα δεδομένα ευÏετηÏίου για τον πίνακα «%s»" -#: pg_dump.c:7486 +#: pg_dump.c:7649 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "απέτυχε ο έλεγχος ακεÏαιότητας, ο γονικός πίνακας με OID %u της καταχώÏησης pg_rewrite με OID %u δεν βÏέθηκε" -#: pg_dump.c:7777 +#: pg_dump.c:7940 #, c-format msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" msgstr "το εÏώτημα παÏήγαγε null πίνακα αναφοÏάς για το έναυσμα ξένου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Â«%s» στον πίνακα «%s» (OID του πίνακα: %u)" -#: pg_dump.c:8396 +#: pg_dump.c:8556 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "μη έγκυÏα δεδομένα στηλών στον πίνακα «%s»" -#: pg_dump.c:8426 +#: pg_dump.c:8585 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "μη έγκυÏη αÏίθμηση στηλών στον πίνακα «%s»" -#: pg_dump.c:8475 +#: pg_dump.c:8633 #, c-format msgid "finding table default expressions" msgstr "εÏÏεση Ï€Ïοεπιλεγμένων εκφÏάσεων πίνακα" -#: pg_dump.c:8517 +#: pg_dump.c:8675 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "μη έγκυÏη τιμή adnum %d για τον πίνακα «%s»" -#: pg_dump.c:8617 +#: pg_dump.c:8769 #, c-format msgid "finding table check constraints" msgstr "εÏÏεση πεÏιοÏισμών ελέγχου για τον πίνακα" -#: pg_dump.c:8671 +#: pg_dump.c:8823 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "αναμενόμενος %d πεÏιοÏισμός ελέγχου στον πίνακα «%s», αλλά βÏήκε %d" msgstr[1] "αναμενόμενοι %d πεÏιοÏισμοί ελέγχου στον πίνακα «%s», αλλά βÏήκε %d" -#: pg_dump.c:8675 +#: pg_dump.c:8827 #, c-format msgid "The system catalogs might be corrupted." msgstr "Οι κατάλογοι συστήματος ενδέχεται να είναι αλλοιωμένοι." -#: pg_dump.c:9365 +#: pg_dump.c:9517 #, c-format msgid "role with OID %u does not exist" msgstr "το σχήμα με OID %u δεν υπάÏχει" -#: pg_dump.c:9477 pg_dump.c:9506 +#: pg_dump.c:9629 pg_dump.c:9658 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "μη υποστηÏιζόμενα pg_init_privs entry: %u %u %d" -#: pg_dump.c:10327 +#: pg_dump.c:10479 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "typtype του Ï„Ïπου δεδομένων «%s» φαίνεται να μην είναι έγκυÏο" -#: pg_dump.c:11902 +#: pg_dump.c:12053 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "μη αναγνωÏίσιμη τιμή provolatile για τη συνάÏτηση «%s»" -#: pg_dump.c:11952 pg_dump.c:13777 +#: pg_dump.c:12103 pg_dump.c:13948 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "μη αναγνωÏίσιμη τιμή proparallel για τη συνάÏτηση «%s»" -#: pg_dump.c:12083 pg_dump.c:12189 pg_dump.c:12196 +#: pg_dump.c:12233 pg_dump.c:12339 pg_dump.c:12346 #, c-format msgid "could not find function definition for function with OID %u" msgstr "δεν ήταν δυνατή η εÏÏεση οÏÎ¹ÏƒÎ¼Î¿Ï ÏƒÏ…Î½Î¬Î½Ï„Î·ÏƒÎ·Ï‚ για την συνάÏτηση με OID %u" -#: pg_dump.c:12122 +#: pg_dump.c:12272 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "πλαστή τιμή στο πεδίο pg_cast.castfunc ή pg_cast.castmethod" -#: pg_dump.c:12125 +#: pg_dump.c:12275 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "πλαστή τιμή στο πεδίο pg_cast.castmethod" -#: pg_dump.c:12215 +#: pg_dump.c:12365 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "πλαστός οÏισμός μετασχηματισμοÏ, τουλάχιστον μία από trffromsql και trftosql θα Ï€Ïέπει να είναι μη μηδενική" -#: pg_dump.c:12232 +#: pg_dump.c:12382 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "πλαστή τιμή στο πεδίο pg_transform.trffromsql" -#: pg_dump.c:12253 +#: pg_dump.c:12403 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "πλαστή τιμή στο πεδίοpg_transform.trftosql" -#: pg_dump.c:12398 +#: pg_dump.c:12548 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "χειÏιστές postfix δεν υποστηÏίζεται πλέον (χειÏιστής «%s»)" -#: pg_dump.c:12568 +#: pg_dump.c:12718 #, c-format msgid "could not find operator with OID %s" msgstr "δεν ήταν δυνατή η εÏÏεση χειÏιστή με OID %s" -#: pg_dump.c:12636 +#: pg_dump.c:12786 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "μη έγκυÏος Ï„Ïπος «%c» για την μεθόδο Ï€Ïόσβασης «%s»" -#: pg_dump.c:13278 +#: pg_dump.c:13443 #, c-format msgid "unrecognized collation provider: %s" msgstr "μη αναγνωÏίσιμος πάÏοχος συÏÏαφής: %s" -#: pg_dump.c:13696 +#: pg_dump.c:13867 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "μη αναγνωÏίσιμη τιμή aggfinalmodify για το συγκεντÏωτικό «%s»" -#: pg_dump.c:13752 +#: pg_dump.c:13923 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "μη αναγνωÏίσιμη τιμή aggmfinalmodify για το συγκεντÏωτικό «%s»" -#: pg_dump.c:14470 +#: pg_dump.c:14640 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "μη αναγνωÏίσιμος Ï„Ïπος αντικειμένου σε Ï€Ïοεπιλεγμένα δικαιώματα: %d" -#: pg_dump.c:14486 +#: pg_dump.c:14656 #, c-format msgid "could not parse default ACL list (%s)" msgstr "δεν ήταν δυνατή η ανάλυση της Ï€Ïοεπιλεγμένης λίστας ACL (%s)" -#: pg_dump.c:14568 +#: pg_dump.c:14738 #, c-format msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "δεν μπόÏεσε να αναλÏσει την αÏχική λίστα ACL (%s) ή την Ï€Ïοεπιλεγμένη (%s) για το αντικείμενο «%s» (%s)" -#: pg_dump.c:14593 +#: pg_dump.c:14763 #, c-format msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "δεν μπόÏεσε να αναλÏσει τη λίστα ACL (%s) ή την Ï€Ïοεπιλογή (%s) για το αντικείμενο «%s» (%s)" -#: pg_dump.c:15131 +#: pg_dump.c:15304 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "το εÏώτημα για τη λήψη οÏÎ¹ÏƒÎ¼Î¿Ï Ï„Î·Ï‚ όψης «%s» δεν επέστÏεψε δεδομένα" -#: pg_dump.c:15134 +#: pg_dump.c:15307 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "το εÏώτημα για τη λήψη οÏÎ¹ÏƒÎ¼Î¿Ï Ï„Î·Ï‚ όψης «%s» επέστÏεψε πεÏισσότεÏους από έναν οÏισμοÏÏ‚" -#: pg_dump.c:15141 +#: pg_dump.c:15314 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "ο οÏισμός της όψης «%s» φαίνεται να είναι κενός (μηδενικό μήκος)" -#: pg_dump.c:15225 +#: pg_dump.c:15398 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS δεν υποστηÏίζεται πλέον (πίνακας «%s»)" -#: pg_dump.c:16154 +#: pg_dump.c:16322 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "μη έγκυÏος αÏιθμός στήλης %d για τον πίνακα «%s»" -#: pg_dump.c:16232 +#: pg_dump.c:16400 #, c-format msgid "could not parse index statistic columns" msgstr "δεν ήταν δυνατή η ανάλυση στηλών στατιστικής ευÏετηÏίου" -#: pg_dump.c:16234 +#: pg_dump.c:16402 #, c-format msgid "could not parse index statistic values" msgstr "δεν ήταν δυνατή η ανάλυση ευÏετηÏίου στατιστικών τιμών" -#: pg_dump.c:16236 +#: pg_dump.c:16404 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "ασυμφωνία αÏÎ¹Î¸Î¼Î¿Ï ÏƒÏ„Î·Î»ÏŽÎ½ και τιμών για στατιστικά στοιχεία ευÏετηÏίου" -#: pg_dump.c:16454 +#: pg_dump.c:16620 #, c-format msgid "missing index for constraint \"%s\"" msgstr "λείπει ευÏετήÏιο για τον πεÏιοÏισμό «%s»" -#: pg_dump.c:16682 +#: pg_dump.c:16855 #, c-format msgid "unrecognized constraint type: %c" msgstr "μη αναγνωÏίσιμος Ï„Ïπος πεÏιοÏισμοÏ: %c" -#: pg_dump.c:16783 pg_dump.c:17012 +#: pg_dump.c:16956 pg_dump.c:17185 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "εÏώτημα για τη λήψη δεδομένων ακολουθίας «%s» επέστÏεψε %d γÏαμμή (αναμένεται 1)" msgstr[1] "εÏώτημα για τη λήψη δεδομένων ακολουθίας «%s» επέστÏεψε %d γÏαμμές (αναμένεται 1)" -#: pg_dump.c:16815 +#: pg_dump.c:16988 #, c-format msgid "unrecognized sequence type: %s" msgstr "μη αναγνωÏίσιμος Ï„Ïπος ακολουθίας: %s" -#: pg_dump.c:17104 +#: pg_dump.c:17277 #, c-format msgid "unexpected tgtype value: %d" msgstr "μη αναγνωÏίσιμος Ï„Ïπος tgtype: %d" -#: pg_dump.c:17176 +#: pg_dump.c:17349 #, c-format msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" msgstr "μη έγκυÏη συμβολοσειÏά παÏαμέτÏου (%s) για το έναυσμα «%s» στον πίνακα «%s»" -#: pg_dump.c:17445 +#: pg_dump.c:17618 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "εÏώτημα για τη λήψη κανόνα «%s» για τον πίνακα «%s» απέτυχε: επιστÏάφηκε εσφαλμένος αÏιθμός γÏαμμών" -#: pg_dump.c:17598 +#: pg_dump.c:17771 #, c-format msgid "could not find referenced extension %u" msgstr "δεν ήταν δυνατή η εÏÏεση της αναφεÏόμενης επέκτασης %u" -#: pg_dump.c:17688 +#: pg_dump.c:17861 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "ασυμφωνία αÏÎ¹Î¸Î¼Î¿Ï Î´Î¹Î±Î¼Î¿Ïφώσεων και συνθηκών για επέκταση" -#: pg_dump.c:17820 +#: pg_dump.c:17993 #, c-format msgid "reading dependency data" msgstr "ανάγνωση δεδομένων εξάÏτησης" -#: pg_dump.c:17906 +#: pg_dump.c:18079 #, c-format msgid "no referencing object %u %u" msgstr "δεν αναφέÏεται αντικείμενο %u %u" -#: pg_dump.c:17917 +#: pg_dump.c:18090 #, c-format msgid "no referenced object %u %u" msgstr "μη αναφεÏόμενο αντικείμενο %u %u" @@ -2164,69 +2309,64 @@ msgstr "μη έγκυÏη εξάÏτηση %d" msgid "could not identify dependency loop" msgstr "δεν ήταν δυνατός ο Ï€ÏοσδιοÏισμός βÏόχου εξάÏτησης" -#: pg_dump_sort.c:1232 +#: pg_dump_sort.c:1276 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "υπάÏχουν κυκλικοί πεÏιοÏισμοί ξένου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÏƒÎµ αυτόν τον πίνακα:" msgstr[1] "υπάÏχουν κυκλικοί πεÏιοÏισμοί ξένου ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï ÏƒÎµ αυτοÏÏ‚ τους πίνακες:" -#: pg_dump_sort.c:1236 pg_dump_sort.c:1256 -#, c-format -msgid " %s" -msgstr " %s" - -#: pg_dump_sort.c:1237 +#: pg_dump_sort.c:1281 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "Ενδέχεται να μην μποÏείτε να επαναφέÏετε την ένδειξη χωÏίς να χÏησιμοποιήσετε --disable-triggers ή να εγκαταλήψετε Ï€ÏοσωÏινά τους πεÏιοÏισμοÏÏ‚." -#: pg_dump_sort.c:1238 +#: pg_dump_sort.c:1282 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "Εξετάστε το ενδεχόμενο να χÏησιμοποιήσετε μια πλήÏη απόθεση αντί για μια --data-only απόθεση για να αποφÏγετε αυτό το Ï€Ïόβλημα." -#: pg_dump_sort.c:1250 +#: pg_dump_sort.c:1294 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "δεν ήταν δυνατή η επίλυση του βÏόχου εξάÏτησης Î¼ÎµÏ„Î±Î¾Ï Î±Ï…Ï„ÏŽÎ½ των στοιχείων:" -#: pg_dumpall.c:205 +#: pg_dumpall.c:230 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "το Ï€ÏόγÏαμμα «%s» απαιτείται από %s αλλά δεν βÏέθηκε στον ίδιο κατάλογο με το «%s»" -#: pg_dumpall.c:208 +#: pg_dumpall.c:233 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "το Ï€ÏόγÏαμμα «%s» βÏέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s" -#: pg_dumpall.c:357 +#: pg_dumpall.c:382 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "επιλογή --exclude-database δεν μποÏεί να χÏησιμοποιηθεί μαζί με -g/--globals-only, -r/--roles-only, ή -t/--tablespaces-only" -#: pg_dumpall.c:365 +#: pg_dumpall.c:390 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "οι επιλογές -g/--globals-only και -r/--roles-only δεν μποÏοÏν να χÏησιμοποιηθοÏν μαζί" -#: pg_dumpall.c:372 +#: pg_dumpall.c:397 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "οι επιλογές -g/--globals-only μόνο και -t/--tablespaces-only δεν είναι δυνατό να χÏησιμοποιηθοÏν μαζί" -#: pg_dumpall.c:382 +#: pg_dumpall.c:407 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "οι επιλογές -r/--roles-only και -t/--tablespaces-only δεν μποÏοÏν να χÏησιμοποιηθοÏν μαζί" -#: pg_dumpall.c:444 pg_dumpall.c:1587 +#: pg_dumpall.c:469 pg_dumpall.c:1750 #, c-format msgid "could not connect to database \"%s\"" msgstr "δεν ήταν δυνατή η σÏνδεση στη βάση δεδομένων «%s»" -#: pg_dumpall.c:456 +#: pg_dumpall.c:481 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2235,7 +2375,7 @@ msgstr "" "δεν ήταν δυνατή η σÏνδεση με τις βάσεις δεδομένων \"postgres\" ή \"Template1\"\n" "ΠαÏακαλώ καθοÏίστε μία εναλλακτική βάση δεδομένων." -#: pg_dumpall.c:604 +#: pg_dumpall.c:629 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2244,69 +2384,69 @@ msgstr "" "%s εξάγει μία συστάδα βάσεων δεδομένων PostgreSQL σε ένα αÏχείο σεναÏίου SQL.\n" "\n" -#: pg_dumpall.c:606 +#: pg_dumpall.c:631 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [ΕΠΙΛΟΓΗ]...\n" -#: pg_dumpall.c:609 +#: pg_dumpall.c:634 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=FILENAME όνομα αÏχείου εξόδου\n" -#: pg_dumpall.c:616 +#: pg_dumpall.c:641 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean καθάÏισε (εγκατάληψε) βάσεις δεδομένων Ï€Ïιν από την αναδημιουÏγία\n" -#: pg_dumpall.c:618 +#: pg_dumpall.c:643 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr " -g, --globals-only απόθεσε μόνο καθολικά αντικείμενα, όχι βάσεις δεδομένων\n" -#: pg_dumpall.c:619 pg_restore.c:456 +#: pg_dumpall.c:644 pg_restore.c:456 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner παÏάλειψε την αποκατάσταση της κυÏιότητας αντικειμένων\n" -#: pg_dumpall.c:620 +#: pg_dumpall.c:645 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr " -r, --roles-only απόθεσε μόνο Ïόλους, όχι βάσεις δεδομένων ή πινακοχώÏους\n" -#: pg_dumpall.c:622 +#: pg_dumpall.c:647 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr " -S, --superuser=NAME όνομα υπεÏχÏήστη για να χÏησιμοποιηθεί στην απόθεση\n" -#: pg_dumpall.c:623 +#: pg_dumpall.c:648 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr " -t, --tablespaces-only απόθεσε μόνο πινακοχώÏους, όχι βάσεις δεδομένων ή Ïόλους\n" -#: pg_dumpall.c:629 +#: pg_dumpall.c:654 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr " --exclude-database=PATTERN εξαίÏεσε βάσεις δεδομένων των οποίων το όνομα ταιÏιάζει με PATTERN\n" -#: pg_dumpall.c:636 +#: pg_dumpall.c:661 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords να μην αποθέσει κωδικοÏÏ‚ Ï€Ïόσβασης για Ïόλους\n" -#: pg_dumpall.c:652 +#: pg_dumpall.c:677 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=CONNSTR σÏνδεση με χÏήση συμβολοσειÏάς σÏνδεσης\n" -#: pg_dumpall.c:654 +#: pg_dumpall.c:679 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr "" " -l, --database=DBNAME εναλλακτική Ï€Ïοεπιλεγμένη βάση δεδομένων\n" "\n" -#: pg_dumpall.c:661 +#: pg_dumpall.c:686 #, c-format msgid "" "\n" @@ -2319,57 +2459,62 @@ msgstr "" "έξοδο.\n" "\n" -#: pg_dumpall.c:803 +#: pg_dumpall.c:828 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "όνομα Ïόλου που αÏχίζει «pg_» παÏαλείπεται (%s)" -#: pg_dumpall.c:1018 +#: pg_dumpall.c:1050 +#, c-format +msgid "could not find a legal dump ordering for memberships in role \"%s\"" +msgstr "δεν μπόÏεσε να βÏεθεί νόμιμη σειÏά ταξινόμησης για συνδÏομές Ïόλου «%s»" + +#: pg_dumpall.c:1185 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "δεν ήταν δυνατή η ανάλυση της λίστας ACL (%s) για την παÏάμετÏο «%s»" -#: pg_dumpall.c:1136 +#: pg_dumpall.c:1303 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "δεν ήταν δυνατή η ανάλυση της λίστας ACL (%s) για τον πινακοχώÏο «%s»" -#: pg_dumpall.c:1343 +#: pg_dumpall.c:1510 #, c-format msgid "excluding database \"%s\"" msgstr "εξαιÏεί τη βάση δεδομένων «%s»" -#: pg_dumpall.c:1347 +#: pg_dumpall.c:1514 #, c-format msgid "dumping database \"%s\"" msgstr "αποθέτει τη βάση δεδομένων «%s»" -#: pg_dumpall.c:1378 +#: pg_dumpall.c:1545 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "pg_dump απέτυχε στη βάση δεδομένων «%s», εξέÏχεται" -#: pg_dumpall.c:1384 +#: pg_dumpall.c:1551 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "δεν ήταν δυνατό το εκ νέου άνοιγμα του αÏχείου εξόδου «%s»: %m" -#: pg_dumpall.c:1425 +#: pg_dumpall.c:1592 #, c-format msgid "running \"%s\"" msgstr "εκτελείται «%s»" -#: pg_dumpall.c:1630 +#: pg_dumpall.c:1793 #, c-format msgid "could not get server version" msgstr "δεν ήταν δυνατή η απόκτηση έκδοσης διακομιστή" -#: pg_dumpall.c:1633 +#: pg_dumpall.c:1796 #, c-format msgid "could not parse server version \"%s\"" msgstr "δεν ήταν δυνατή η ανάλυση έκδοσης διακομιστή «%s»" -#: pg_dumpall.c:1703 pg_dumpall.c:1726 +#: pg_dumpall.c:1866 pg_dumpall.c:1889 #, c-format msgid "executing %s" msgstr "εκτελείται %s" @@ -2619,9 +2764,15 @@ msgstr "" "Εάν δεν παÏέχεται όνομα αÏχείου εισόδου, τότε χÏησιμοποιείται η τυπική είσοδος.\n" "\n" +#~ msgid " %s" +#~ msgstr " %s" + #~ msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n" #~ msgstr " --no-synchronized-snapshots να μην χÏησιμοποιήσει συγχÏονισμένα στιγμιότυπα σε παÏάλληλες εÏγασίες\n" +#~ msgid " -Z, --compress=0-9 compression level for compressed formats\n" +#~ msgstr " -Z, --compress=0-9 επίπεδο συμπίεσης για συμπιεσμένες μοÏφές\n" + #~ msgid "" #~ "Synchronized snapshots are not supported by this server version.\n" #~ "Run with --no-synchronized-snapshots instead if you do not need\n" @@ -2652,18 +2803,33 @@ msgstr "" #~ msgid "bogus value in proargmodes array" #~ msgstr "πλαστή τιμή στη συστοιχία proargmodes" +#~ msgid "cannot restore from compressed archive (compression not supported in this installation)" +#~ msgstr "δεν είναι δυνατή η επαναφοÏά από συμπιεσμένη αÏχειοθήκη (η συμπίεση δεν υποστηÏίζεται σε αυτήν την εγκατάσταση)" + #~ msgid "compression level must be in range 0..9" #~ msgstr "το επίπεδο συμπίεσης Ï€Ïέπει να βÏίσκεται στο εÏÏος 0..9" #~ msgid "connection to database \"%s\" failed: %s" #~ msgstr "σÏνδεση στη βάση δεδομένων «%s» απέτυχε: %s" +#~ msgid "could not change directory to \"%s\": %m" +#~ msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" + +#~ msgid "could not close blob data file: %m" +#~ msgstr "δεν μπόÏεσε να κλείσει το αÏχείο δεδομένων μεγάλων αντικειμένων: %m" + +#~ msgid "could not close blobs TOC file: %m" +#~ msgstr "δεν ήταν δυνατό το κλείσιμο αÏχείου TOC μεγάλων αντικειμένων: %m" + #~ msgid "could not close tar member" #~ msgstr "δεν ήταν δυνατό το κλείσιμο μέλους tar" #~ msgid "could not connect to database \"%s\": %s" #~ msgstr "δεν ήταν δυνατή η σÏνδεση στη βάση δεδομένων «%s»: %s" +#~ msgid "could not identify current directory: %m" +#~ msgstr "δεν ήταν δυνατή η αναγνώÏιση του Ï„Ïέχοντος καταλόγου: %m" + #~ msgid "could not open temporary file" #~ msgstr "δεν ήταν δυνατό το άνοιγμα του Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου" @@ -2688,6 +2854,12 @@ msgstr "" #~ msgid "could not parse subpublications array" #~ msgstr "δεν ήταν δυνατή η ανάλυση της συστοιχίας υποδημοσιεÏσεων" +#~ msgid "could not read binary \"%s\"" +#~ msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»" + +#~ msgid "could not read symbolic link \"%s\": %m" +#~ msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m" + #~ msgid "could not write to large object (result: %lu, expected: %lu)" #~ msgstr "δεν ήταν δυνατή η εγγÏαφή σε μεγάλο αντικείμενο (αποτέλεσμα: %lu, αναμένεται: %lu)" @@ -2703,12 +2875,21 @@ msgstr "" #~ msgid "finding the columns and types of table \"%s.%s\"" #~ msgstr "εÏÏεση των στηλών και των Ï„Ïπων του πίνακα «%s.%s»" +#~ msgid "invalid binary \"%s\"" +#~ msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»" + +#~ msgid "invalid compression code: %d" +#~ msgstr "μη έγκυÏος κωδικός συμπίεσης: %d" + #~ msgid "invalid number of parallel jobs" #~ msgstr "μη έγκυÏος αÏιθμός παÏάλληλων εÏγασιών" #~ msgid "maximum number of parallel jobs is %d" #~ msgstr "ο μέγιστος αÏιθμός παÏάλληλων εÏγασιών είναι %d" +#~ msgid "not built with zlib support" +#~ msgstr "δεν έχει κατασκευαστεί με υποστήÏιξη zlib" + #~ msgid "owner of aggregate function \"%s\" appears to be invalid" #~ msgstr "ο κάτοχος της συνάÏτησης συγκεντÏωτικών αποτελεσμάτων «%s» φαίνεται να μην είναι έγκυÏος" @@ -2757,6 +2938,9 @@ msgstr "" #~ msgid "reading triggers for table \"%s.%s\"" #~ msgstr "ανάγνωση εναυσμάτων για τον πίνακα «%s.%s»" +#~ msgid "requested compression not available in this installation -- archive will be uncompressed" +#~ msgstr "η συμπίεση που ζητήθηκε δεν είναι διαθέσιμη σε αυτήν την εγκατάσταση -- η αÏχειοθήκη θα είναι ασυμπίεστη" + #~ msgid "rows-per-insert must be in range %d..%d" #~ msgstr "rows-per-insert Ï€Ïέπει να βÏίσκονται στο εÏÏος %d..%d" diff --git a/src/bin/pg_dump/po/es.po b/src/bin/pg_dump/po/es.po index 6a12f4793f06f..b40afd89881bb 100644 --- a/src/bin/pg_dump/po/es.po +++ b/src/bin/pg_dump/po/es.po @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_dump (PostgreSQL) 16\n" +"Project-Id-Version: pg_dump (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:21+0000\n" -"PO-Revision-Date: 2023-05-22 12:05+0200\n" +"POT-Creation-Date: 2025-02-16 19:51+0000\n" +"PO-Revision-Date: 2024-11-16 14:23+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -71,7 +71,6 @@ msgstr "el valor para la opción de compresión «%s» debe ser un entero" #: ../../common/compression.c:331 #, c-format -#| msgid "value for compression option \"%s\" must be a boolean" msgid "value for compression option \"%s\" must be a Boolean value" msgstr "el valor para la opción de compresión «%s» debe ser un booleano" @@ -95,32 +94,47 @@ msgstr "el algoritmo de compresión «%s» no acepta una cantidad de procesos ay msgid "compression algorithm \"%s\" does not support long-distance mode" msgstr "el algoritmo de compresión «%s» no acepta modo de larga distancia" -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "binario «%s» no válido: %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "no se pudo leer el binario «%s»: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "no se pudo encontrar un «%s» para ejecutar" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "no se pudo resolver la ruta «%s» a forma absoluta: %m" -#: ../../common/exec.c:412 parallel.c:1609 +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "no se pudo ejecutar la orden «%s»: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "no se pudo leer desde la orden «%s»: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "la orden «%s» no retornó datos" + +#: ../../common/exec.c:424 parallel.c:1609 #, c-format msgid "%s() failed: %m" msgstr "%s() falló: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "memoria agotada" @@ -135,6 +149,49 @@ msgstr "memoria agotada\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "no se puede duplicar un puntero nulo (error interno)\n" +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "no se pudo abrir el archivo «%s»: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "no se pudo hacer stat al archivo «%s»: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "esta instalación no soporta el método de sync «%s»" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "no se pudo abrir el directorio «%s»: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_backup_directory.c:182 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "no se pudo leer el directorio «%s»: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" + #: ../../common/wait_error.c:55 #, c-format msgid "command not executable" @@ -175,227 +232,247 @@ msgstr "el valor «%s» no es válido para la opción %s" msgid "%s must be in range %d..%d" msgstr "%s debe estar en el rango %d..%d" -#: common.c:132 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "método sync no reconocido: %s" + +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "el argumento de la orden de shell contiene un salto de línea o retorno de carro: «%s»\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "el nombre de base de datos contiene un salto de línea o retorno de carro: «%s»\n" + +#: common.c:135 #, c-format msgid "reading extensions" msgstr "leyendo las extensiones" -#: common.c:135 +#: common.c:138 #, c-format msgid "identifying extension members" msgstr "identificando miembros de extensión" -#: common.c:138 +#: common.c:141 #, c-format msgid "reading schemas" msgstr "leyendo esquemas" -#: common.c:147 +#: common.c:150 #, c-format msgid "reading user-defined tables" msgstr "leyendo las tablas definidas por el usuario" -#: common.c:152 +#: common.c:155 #, c-format msgid "reading user-defined functions" msgstr "leyendo las funciones definidas por el usuario" -#: common.c:156 +#: common.c:159 #, c-format msgid "reading user-defined types" msgstr "leyendo los tipos definidos por el usuario" -#: common.c:160 +#: common.c:163 #, c-format msgid "reading procedural languages" msgstr "leyendo los lenguajes procedurales" -#: common.c:163 +#: common.c:166 #, c-format msgid "reading user-defined aggregate functions" msgstr "leyendo las funciones de agregación definidas por el usuario" -#: common.c:166 +#: common.c:169 #, c-format msgid "reading user-defined operators" msgstr "leyendo los operadores definidos por el usuario" -#: common.c:169 +#: common.c:172 #, c-format msgid "reading user-defined access methods" msgstr "leyendo los métodos de acceso definidos por el usuario" -#: common.c:172 +#: common.c:175 #, c-format msgid "reading user-defined operator classes" msgstr "leyendo las clases de operadores definidos por el usuario" -#: common.c:175 +#: common.c:178 #, c-format msgid "reading user-defined operator families" msgstr "leyendo las familias de operadores definidas por el usuario" -#: common.c:178 +#: common.c:181 #, c-format msgid "reading user-defined text search parsers" msgstr "leyendo los procesadores (parsers) de búsqueda en texto definidos por el usuario" -#: common.c:181 +#: common.c:184 #, c-format msgid "reading user-defined text search templates" msgstr "leyendo las plantillas de búsqueda en texto definidas por el usuario" -#: common.c:184 +#: common.c:187 #, c-format msgid "reading user-defined text search dictionaries" msgstr "leyendo los diccionarios de búsqueda en texto definidos por el usuario" -#: common.c:187 +#: common.c:190 #, c-format msgid "reading user-defined text search configurations" msgstr "leyendo las configuraciones de búsqueda en texto definidas por el usuario" -#: common.c:190 +#: common.c:193 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "leyendo los conectores de datos externos definidos por el usuario" -#: common.c:193 +#: common.c:196 #, c-format msgid "reading user-defined foreign servers" msgstr "leyendo los servidores foráneos definidas por el usuario" -#: common.c:196 +#: common.c:199 #, c-format msgid "reading default privileges" msgstr "leyendo los privilegios por omisión" -#: common.c:199 +#: common.c:202 #, c-format msgid "reading user-defined collations" msgstr "leyendo los ordenamientos definidos por el usuario" -#: common.c:202 +#: common.c:205 #, c-format msgid "reading user-defined conversions" msgstr "leyendo las conversiones definidas por el usuario" -#: common.c:205 +#: common.c:208 #, c-format msgid "reading type casts" msgstr "leyendo conversiones de tipo" -#: common.c:208 +#: common.c:211 #, c-format msgid "reading transforms" msgstr "leyendo las transformaciones" -#: common.c:211 +#: common.c:214 #, c-format msgid "reading table inheritance information" msgstr "leyendo la información de herencia de las tablas" -#: common.c:214 +#: common.c:217 #, c-format msgid "reading event triggers" msgstr "leyendo los disparadores por eventos" -#: common.c:218 +#: common.c:221 #, c-format msgid "finding extension tables" msgstr "buscando tablas de extensión" -#: common.c:222 +#: common.c:225 #, c-format msgid "finding inheritance relationships" msgstr "buscando relaciones de herencia" -#: common.c:225 +#: common.c:228 #, c-format msgid "reading column info for interesting tables" msgstr "leyendo la información de columnas para las tablas interesantes" -#: common.c:228 +#: common.c:231 #, c-format msgid "flagging inherited columns in subtables" msgstr "marcando las columnas heredadas en las subtablas" -#: common.c:231 +#: common.c:234 #, c-format msgid "reading partitioning data" msgstr "leyendo datos de particionamiento" -#: common.c:234 +#: common.c:237 #, c-format msgid "reading indexes" msgstr "leyendo los índices" -#: common.c:237 +#: common.c:240 #, c-format msgid "flagging indexes in partitioned tables" msgstr "marcando índices en las tablas particionadas" -#: common.c:240 +#: common.c:243 #, c-format msgid "reading extended statistics" msgstr "leyendo estadísticas extendidas" -#: common.c:243 +#: common.c:246 #, c-format msgid "reading constraints" msgstr "leyendo las restricciones" -#: common.c:246 +#: common.c:249 #, c-format msgid "reading triggers" msgstr "leyendo los disparadores (triggers)" -#: common.c:249 +#: common.c:252 #, c-format msgid "reading rewrite rules" msgstr "leyendo las reglas de reescritura" -#: common.c:252 +#: common.c:255 #, c-format msgid "reading policies" msgstr "leyendo políticas" -#: common.c:255 +#: common.c:258 #, c-format msgid "reading publications" msgstr "leyendo publicaciones" -#: common.c:258 +#: common.c:261 #, c-format msgid "reading publication membership of tables" msgstr "leyendo membresía de tablas en publicaciones" -#: common.c:261 +#: common.c:264 #, c-format msgid "reading publication membership of schemas" msgstr "leyendo membresía de esquemas en publicaciones" -#: common.c:264 +#: common.c:267 #, c-format msgid "reading subscriptions" msgstr "leyendo las suscripciones" -#: common.c:327 +#: common.c:270 +#, c-format +msgid "reading subscription membership of tables" +msgstr "leyendo membresía de tablas en suscripciones" + +#: common.c:333 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "falló la revisión de integridad, el OID %u del padre de la tabla «%s» (OID %u) no se encontró" -#: common.c:369 +#: common.c:375 #, c-format msgid "invalid number of parents %d for table \"%s\"" msgstr "número de padres %d para la tabla «%s» no es válido" -#: common.c:1049 +#: common.c:1098 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "no se pudo interpretar el arreglo numérico «%s»: demasiados números" -#: common.c:1061 +#: common.c:1110 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "no se pudo interpretar el arreglo numérico «%s»: carácter no válido en número" @@ -425,15 +502,20 @@ msgstr "no se pudo descomprimir datos: %s" msgid "could not close compression library: %s" msgstr "no se pudo cerrar la biblioteca de compresión: %s" -#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608 -#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140 +#: compress_gzip.c:266 compress_lz4.c:608 compress_lz4.c:628 compress_lz4.c:647 #, c-format msgid "could not read from input file: %s" msgstr "no se pudo leer el archivo de entrada: %s" -#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142 -#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558 -#: pg_backup_tar.c:725 pg_backup_tar.c:748 +#: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 +#: compress_zstd.c:374 pg_backup_custom.c:651 +#, c-format +msgid "could not read from input file: %m" +msgstr "no se pudo leer el archivo de entrada: %m" + +#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:141 +#: compress_zstd.c:372 pg_backup_custom.c:649 pg_backup_directory.c:565 +#: pg_backup_tar.c:740 pg_backup_tar.c:763 #, c-format msgid "could not read from input file: end of file" msgstr "no se pudo leer desde el archivo de entrada: fin de archivo" @@ -455,7 +537,6 @@ msgstr "no se pudo liberar el contexto de descompresión LZ4: %s" #: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690 #, c-format -#| msgid "could not end lz4 compression: %s" msgid "could not end compression: %s" msgstr "no se pudo terminar la compresión: %s" @@ -466,7 +547,6 @@ msgstr "no se pudo inicializar la compresión LZ4: %s" #: compress_lz4.c:697 #, c-format -#| msgid "could not end lz4 compression: %s" msgid "could not end decompression: %s" msgstr "no se pudo terminar la descompresión: %s" @@ -475,27 +555,72 @@ msgstr "no se pudo terminar la descompresión: %s" msgid "could not set compression parameter \"%s\": %s" msgstr "no se pudo definir el parámetro de compresión «%s»: %s" -#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490 -#: compress_zstd.c:498 +#: compress_zstd.c:78 compress_zstd.c:232 compress_zstd.c:491 +#: compress_zstd.c:499 #, c-format msgid "could not initialize compression library" msgstr "no se pudo inicializar la biblioteca de compresión" -#: compress_zstd.c:194 compress_zstd.c:308 +#: compress_zstd.c:195 compress_zstd.c:309 #, c-format msgid "could not decompress data: %s" msgstr "no se pudo descomprimir datos: %s" -#: compress_zstd.c:373 pg_backup_custom.c:655 -#, c-format -msgid "could not read from input file: %m" -msgstr "no se pudo leer el archivo de entrada: %m" - -#: compress_zstd.c:501 +#: compress_zstd.c:502 #, c-format msgid "unhandled mode \"%s\"" msgstr "modo «%s» sin manejar" +#: filter.c:49 +#, c-format +msgid "could not open filter file \"%s\": %m" +msgstr "no se pudo abrir el archivo de filtro «%s»: %m" + +#: filter.c:72 +#, c-format +msgid "could not close filter file \"%s\": %m" +msgstr "no se pudo cerrar el archivo de filtro «%s»: %m" + +#: filter.c:165 +#, c-format +msgid "invalid format in filter read from standard input on line %d: %s" +msgstr "formato inválido en filtro leído desde entrada estándar en línea %d: %s" + +#: filter.c:168 +#, c-format +msgid "invalid format in filter read from file \"%s\" on line %d: %s" +msgstr "sintaxis no válida en filtro leído desde archivo «%s», línea %d: %s" + +#: filter.c:241 filter.c:468 +#, c-format +msgid "could not read from filter file \"%s\": %m" +msgstr "no se pudo leer el archivo de filtro «%s»: %m" + +#: filter.c:244 +msgid "unexpected end of file" +msgstr "fin de archivo inesperado" + +#: filter.c:311 +msgid "missing object name pattern" +msgstr "falta el parámetro de nombre de objeto" + +#: filter.c:422 +msgid "no filter command found (expected \"include\" or \"exclude\")" +msgstr "no se encontró orden de filtro (se esperaba «include» o «include»)" + +#: filter.c:433 +msgid "invalid filter command (expected \"include\" or \"exclude\")" +msgstr "orden de filtro no válida (se esperaba «include» o «exclude»)" + +#: filter.c:440 +msgid "missing filter object type" +msgstr "falta el parámetro de tipo de objeto" + +#: filter.c:447 +#, c-format +msgid "unsupported filter object type: \"%.*s\"" +msgstr "tipo de objeto de filtro «%.*s» no soportado" + #: parallel.c:251 #, c-format msgid "%s() failed: error code %d" @@ -575,512 +700,517 @@ msgstr "pgpipe: no se pudo conectar el socket: código de error %d" msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: no se pudo aceptar la conexión: código de error %d" -#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603 +#: pg_backup_archiver.c:261 pg_backup_archiver.c:1706 #, c-format msgid "could not close output file: %m" msgstr "no se pudo cerrar el archivo de salida: %m" -#: pg_backup_archiver.c:320 pg_backup_archiver.c:324 +#: pg_backup_archiver.c:305 pg_backup_archiver.c:309 #, c-format msgid "archive items not in correct section order" msgstr "elementos del archivo no están en el orden correcto de secciones" -#: pg_backup_archiver.c:330 +#: pg_backup_archiver.c:315 #, c-format msgid "unexpected section code %d" msgstr "código de sección %d inesperado" -#: pg_backup_archiver.c:367 +#: pg_backup_archiver.c:352 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "la restauración en paralelo no está soportada con este formato de archivo" -#: pg_backup_archiver.c:371 +#: pg_backup_archiver.c:356 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "la restauración en paralelo no está soportada con archivos construidos con pg_dump anterior a 8.0" -#: pg_backup_archiver.c:392 +#: pg_backup_archiver.c:377 #, c-format msgid "cannot restore from compressed archive (%s)" -msgstr "no se pudo restaurar desde archivo comprimido (%s)" +msgstr "no se puede restaurar del archivo comprimido (%s)" -#: pg_backup_archiver.c:412 +#: pg_backup_archiver.c:397 #, c-format msgid "connecting to database for restore" msgstr "conectando a la base de datos para reestablecimiento" -#: pg_backup_archiver.c:414 +#: pg_backup_archiver.c:399 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "las conexiones directas a la base de datos no están soportadas en archivadores pre-1.3" -#: pg_backup_archiver.c:457 +#: pg_backup_archiver.c:442 #, c-format msgid "implied data-only restore" msgstr "asumiendo reestablecimiento de sólo datos" -#: pg_backup_archiver.c:523 +#: pg_backup_archiver.c:510 #, c-format msgid "dropping %s %s" msgstr "eliminando %s %s" -#: pg_backup_archiver.c:623 +#: pg_backup_archiver.c:642 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "no se pudo encontrar dónde insertar IF EXISTS en la sentencia «%s»" -#: pg_backup_archiver.c:778 pg_backup_archiver.c:780 +#: pg_backup_archiver.c:828 pg_backup_archiver.c:830 #, c-format msgid "warning from original dump file: %s" msgstr "precaución desde el archivo original: %s" -#: pg_backup_archiver.c:795 +#: pg_backup_archiver.c:864 #, c-format msgid "creating %s \"%s.%s\"" msgstr "creando %s «%s.%s»" -#: pg_backup_archiver.c:798 +#: pg_backup_archiver.c:867 #, c-format msgid "creating %s \"%s\"" msgstr "creando %s «%s»" -#: pg_backup_archiver.c:848 +#: pg_backup_archiver.c:917 #, c-format msgid "connecting to new database \"%s\"" msgstr "conectando a nueva base de datos «%s»" -#: pg_backup_archiver.c:875 +#: pg_backup_archiver.c:944 #, c-format msgid "processing %s" msgstr "procesando %s" -#: pg_backup_archiver.c:897 +#: pg_backup_archiver.c:966 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "procesando datos de la tabla «%s.%s»" -#: pg_backup_archiver.c:967 +#: pg_backup_archiver.c:1036 #, c-format msgid "executing %s %s" msgstr "ejecutando %s %s" -#: pg_backup_archiver.c:1008 +#: pg_backup_archiver.c:1096 #, c-format msgid "disabling triggers for %s" msgstr "deshabilitando disparadores (triggers) para %s" -#: pg_backup_archiver.c:1034 +#: pg_backup_archiver.c:1122 #, c-format msgid "enabling triggers for %s" msgstr "habilitando disparadores (triggers) para %s" -#: pg_backup_archiver.c:1099 +#: pg_backup_archiver.c:1187 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "error interno -- WriteData no puede ser llamada fuera del contexto de una rutina DataDumper" -#: pg_backup_archiver.c:1287 +#: pg_backup_archiver.c:1379 #, c-format msgid "large-object output not supported in chosen format" msgstr "la extracción de objetos grandes no está soportada en el formato seleccionado" -#: pg_backup_archiver.c:1345 +#: pg_backup_archiver.c:1442 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "se reestableció %d objeto grande" msgstr[1] "se reestablecieron %d objetos grandes" -#: pg_backup_archiver.c:1366 pg_backup_tar.c:668 +#: pg_backup_archiver.c:1469 pg_backup_tar.c:683 #, c-format msgid "restoring large object with OID %u" msgstr "reestableciendo objeto grande con OID %u" -#: pg_backup_archiver.c:1378 +#: pg_backup_archiver.c:1481 #, c-format msgid "could not create large object %u: %s" msgstr "no se pudo crear el objeto grande %u: %s" -#: pg_backup_archiver.c:1383 pg_dump.c:3718 +#: pg_backup_archiver.c:1486 pg_dump.c:3889 #, c-format msgid "could not open large object %u: %s" msgstr "no se pudo abrir el objeto grande %u: %s" -#: pg_backup_archiver.c:1439 +#: pg_backup_archiver.c:1542 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "no se pudo abrir el archivo TOC «%s»: %m" -#: pg_backup_archiver.c:1467 +#: pg_backup_archiver.c:1570 #, c-format msgid "line ignored: %s" msgstr "línea ignorada: %s" -#: pg_backup_archiver.c:1474 +#: pg_backup_archiver.c:1577 pg_backup_db.c:609 #, c-format msgid "could not find entry for ID %d" msgstr "no se pudo encontrar una entrada para el ID %d" -#: pg_backup_archiver.c:1497 pg_backup_directory.c:221 -#: pg_backup_directory.c:606 +#: pg_backup_archiver.c:1600 pg_backup_directory.c:219 +#: pg_backup_directory.c:613 #, c-format msgid "could not close TOC file: %m" msgstr "no se pudo cerrar el archivo TOC: %m" -#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:593 pg_backup_directory.c:658 -#: pg_backup_directory.c:676 pg_dumpall.c:501 +#: pg_backup_archiver.c:1687 pg_backup_custom.c:152 pg_backup_directory.c:333 +#: pg_backup_directory.c:600 pg_backup_directory.c:666 +#: pg_backup_directory.c:684 pg_dumpall.c:506 #, c-format msgid "could not open output file \"%s\": %m" msgstr "no se pudo abrir el archivo de salida «%s»: %m" -#: pg_backup_archiver.c:1586 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1689 pg_backup_custom.c:158 #, c-format msgid "could not open output file: %m" msgstr "no se pudo abrir el archivo de salida: %m" -#: pg_backup_archiver.c:1669 +#: pg_backup_archiver.c:1772 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" msgstr[0] "se escribió %zu byte de los datos del objeto grande (resultado = %d)" msgstr[1] "se escribieron %zu bytes de los datos del objeto grande (resultado = %d)" -#: pg_backup_archiver.c:1675 +#: pg_backup_archiver.c:1778 #, c-format msgid "could not write to large object: %s" msgstr "no se pudo escribir en objeto grande: %s" -#: pg_backup_archiver.c:1765 +#: pg_backup_archiver.c:1868 #, c-format msgid "while INITIALIZING:" msgstr "durante INICIALIZACIÓN:" -#: pg_backup_archiver.c:1770 +#: pg_backup_archiver.c:1873 #, c-format msgid "while PROCESSING TOC:" msgstr "durante PROCESAMIENTO DE TABLA DE CONTENIDOS:" -#: pg_backup_archiver.c:1775 +#: pg_backup_archiver.c:1878 #, c-format msgid "while FINALIZING:" msgstr "durante FINALIZACIÓN:" -#: pg_backup_archiver.c:1780 +#: pg_backup_archiver.c:1883 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "en entrada de la tabla de contenidos %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1856 +#: pg_backup_archiver.c:1959 #, c-format msgid "bad dumpId" msgstr "dumpId incorrecto" -#: pg_backup_archiver.c:1877 +#: pg_backup_archiver.c:1980 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "dumpId de tabla incorrecto para elemento TABLE DATA" -#: pg_backup_archiver.c:1969 +#: pg_backup_archiver.c:2072 #, c-format msgid "unexpected data offset flag %d" msgstr "bandera de posición inesperada %d" -#: pg_backup_archiver.c:1982 +#: pg_backup_archiver.c:2085 #, c-format msgid "file offset in dump file is too large" msgstr "el posición en el archivo es demasiado grande" -#: pg_backup_archiver.c:2093 +#: pg_backup_archiver.c:2196 #, c-format msgid "directory name too long: \"%s\"" msgstr "nombre de directorio demasiado largo: «%s»" -#: pg_backup_archiver.c:2143 +#: pg_backup_archiver.c:2246 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "el directorio «%s» no parece ser un archivador válido (no existe «toc.dat»)" -#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816 -#: pg_backup_directory.c:206 pg_backup_directory.c:395 +#: pg_backup_archiver.c:2254 pg_backup_custom.c:169 pg_backup_custom.c:812 +#: pg_backup_directory.c:204 pg_backup_directory.c:396 #, c-format msgid "could not open input file \"%s\": %m" msgstr "no se pudo abrir el archivo de entrada «%s»: %m" -#: pg_backup_archiver.c:2158 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2261 pg_backup_custom.c:175 #, c-format msgid "could not open input file: %m" msgstr "no se pudo abrir el archivo de entrada: %m" -#: pg_backup_archiver.c:2164 +#: pg_backup_archiver.c:2267 #, c-format msgid "could not read input file: %m" msgstr "no se pudo leer el archivo de entrada: %m" -#: pg_backup_archiver.c:2166 +#: pg_backup_archiver.c:2269 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "el archivo de entrada es demasiado corto (leidos %lu, esperados 5)" -#: pg_backup_archiver.c:2198 +#: pg_backup_archiver.c:2301 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "el archivo de entrada parece ser un volcado de texto. Por favor use psql." -#: pg_backup_archiver.c:2204 +#: pg_backup_archiver.c:2307 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "el archivo de entrada no parece ser un archivador válido (¿demasiado corto?)" -#: pg_backup_archiver.c:2210 +#: pg_backup_archiver.c:2313 #, c-format msgid "input file does not appear to be a valid archive" msgstr "el archivo de entrada no parece ser un archivador válido" -#: pg_backup_archiver.c:2219 +#: pg_backup_archiver.c:2322 #, c-format msgid "could not close input file: %m" msgstr "no se pudo cerrar el archivo de entrada: %m" -#: pg_backup_archiver.c:2297 +#: pg_backup_archiver.c:2401 #, c-format msgid "could not open stdout for appending: %m" msgstr "no se pudo abrir stdout para agregar datos: %m" -#: pg_backup_archiver.c:2342 +#: pg_backup_archiver.c:2446 #, c-format msgid "unrecognized file format \"%d\"" msgstr "formato de archivo no reconocido «%d»" -#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4448 +#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4648 #, c-format msgid "finished item %d %s %s" msgstr "terminó el elemento %d %s %s" -#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4461 +#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4661 #, c-format msgid "worker process failed: exit code %d" msgstr "el proceso hijo falló: código de salida %d" -#: pg_backup_archiver.c:2548 +#: pg_backup_archiver.c:2653 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "la entrada con ID %d está fuera de rango -- tal vez la tabla de contenido está corrupta" -#: pg_backup_archiver.c:2628 +#: pg_backup_archiver.c:2736 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "restaurar tablas WITH OIDS ya no está soportado" -#: pg_backup_archiver.c:2710 +#: pg_backup_archiver.c:2818 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "no se reconoce la codificación: «%s»" -#: pg_backup_archiver.c:2715 +#: pg_backup_archiver.c:2824 #, c-format msgid "invalid ENCODING item: %s" msgstr "elemento ENCODING no válido: %s" -#: pg_backup_archiver.c:2733 +#: pg_backup_archiver.c:2842 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "elemento STDSTRINGS no válido: %s" -#: pg_backup_archiver.c:2758 +#: pg_backup_archiver.c:2867 #, c-format msgid "schema \"%s\" not found" msgstr "esquema «%s» no encontrado" -#: pg_backup_archiver.c:2765 +#: pg_backup_archiver.c:2874 #, c-format msgid "table \"%s\" not found" msgstr "tabla «%s» no encontrada" -#: pg_backup_archiver.c:2772 +#: pg_backup_archiver.c:2881 #, c-format msgid "index \"%s\" not found" msgstr "índice «%s» no encontrado" -#: pg_backup_archiver.c:2779 +#: pg_backup_archiver.c:2888 #, c-format msgid "function \"%s\" not found" msgstr "función «%s» no encontrada" -#: pg_backup_archiver.c:2786 +#: pg_backup_archiver.c:2895 #, c-format msgid "trigger \"%s\" not found" msgstr "disparador «%s» no encontrado" -#: pg_backup_archiver.c:3183 +#: pg_backup_archiver.c:3326 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "no se pudo establecer el usuario de sesión a «%s»: %s" -#: pg_backup_archiver.c:3315 +#: pg_backup_archiver.c:3458 #, c-format -msgid "could not set search_path to \"%s\": %s" -msgstr "no se pudo definir search_path a «%s»: %s" +msgid "could not set \"search_path\" to \"%s\": %s" +msgstr "no se pudo definir «search_path» a «%s»: %s" -#: pg_backup_archiver.c:3376 +#: pg_backup_archiver.c:3519 #, c-format -msgid "could not set default_tablespace to %s: %s" -msgstr "no se pudo definir default_tablespace a %s: %s" +msgid "could not set \"default_tablespace\" to %s: %s" +msgstr "no se pudo definir «default_tablespace» a %s: %s" -#: pg_backup_archiver.c:3425 +#: pg_backup_archiver.c:3568 #, c-format -msgid "could not set default_table_access_method: %s" -msgstr "no se pudo definir default_table_access_method: %s" +msgid "could not set \"default_table_access_method\": %s" +msgstr "no se pudo definir «default_table_access_method»: %s" -#: pg_backup_archiver.c:3530 +#: pg_backup_archiver.c:3617 +#, c-format +msgid "could not alter table access method: %s" +msgstr "no se pudo alterar el método de acceso a tabla: %s" + +#: pg_backup_archiver.c:3718 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "no se sabe cómo establecer el dueño para el objeto de tipo «%s»" -#: pg_backup_archiver.c:3752 +#: pg_backup_archiver.c:4005 #, c-format msgid "did not find magic string in file header" msgstr "no se encontró la cadena mágica en el encabezado del archivo" -#: pg_backup_archiver.c:3766 +#: pg_backup_archiver.c:4019 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "versión no soportada (%d.%d) en el encabezado del archivo" -#: pg_backup_archiver.c:3771 +#: pg_backup_archiver.c:4024 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "revisión de integridad en el tamaño del entero (%lu) falló" -#: pg_backup_archiver.c:3775 +#: pg_backup_archiver.c:4028 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "el archivador fue hecho en una máquina con enteros más grandes, algunas operaciones podrían fallar" -#: pg_backup_archiver.c:3785 +#: pg_backup_archiver.c:4038 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "el formato esperado (%d) difiere del formato encontrado en el archivo (%d)" -#: pg_backup_archiver.c:3807 +#: pg_backup_archiver.c:4060 #, c-format msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available" msgstr "el archivo está comprimido, pero esta instalación no soporta compresión (%s) -- los datos no estarán disponibles" -#: pg_backup_archiver.c:3843 +#: pg_backup_archiver.c:4096 #, c-format msgid "invalid creation date in header" msgstr "la fecha de creación en el encabezado no es válida" -#: pg_backup_archiver.c:3977 +#: pg_backup_archiver.c:4230 #, c-format msgid "processing item %d %s %s" msgstr "procesando el elemento %d %s %s" -#: pg_backup_archiver.c:4052 +#: pg_backup_archiver.c:4315 #, c-format msgid "entering main parallel loop" msgstr "ingresando al bucle paralelo principal" -#: pg_backup_archiver.c:4063 +#: pg_backup_archiver.c:4326 #, c-format msgid "skipping item %d %s %s" msgstr "saltando el elemento %d %s %s" -#: pg_backup_archiver.c:4072 +#: pg_backup_archiver.c:4335 #, c-format msgid "launching item %d %s %s" msgstr "lanzando el elemento %d %s %s" -#: pg_backup_archiver.c:4126 +#: pg_backup_archiver.c:4389 #, c-format msgid "finished main parallel loop" msgstr "terminó el bucle paralelo principal" -#: pg_backup_archiver.c:4162 +#: pg_backup_archiver.c:4425 #, c-format msgid "processing missed item %d %s %s" msgstr "procesando el elemento saltado %d %s %s" -#: pg_backup_archiver.c:4767 +#: pg_backup_archiver.c:4967 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "la tabla «%s» no pudo ser creada, no se recuperarán sus datos" -#: pg_backup_custom.c:380 pg_backup_null.c:147 +#: pg_backup_custom.c:376 pg_backup_null.c:143 #, c-format msgid "invalid OID for large object" msgstr "OID no válido para objeto grande" -#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640 -#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019 +#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:636 +#: pg_backup_custom.c:870 pg_backup_tar.c:1029 pg_backup_tar.c:1034 #, c-format msgid "error during file seek: %m" msgstr "error durante el posicionamiento (seek) en el archivo: %m" -#: pg_backup_custom.c:484 +#: pg_backup_custom.c:480 #, c-format msgid "data block %d has wrong seek position" msgstr "el bloque de datos %d tiene una posición de búsqueda incorrecta" -#: pg_backup_custom.c:501 +#: pg_backup_custom.c:497 #, c-format msgid "unrecognized data block type (%d) while searching archive" msgstr "tipo de bloque de datos (%d) no conocido al buscar en el archivador" -#: pg_backup_custom.c:523 +#: pg_backup_custom.c:519 #, c-format msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file" msgstr "no se pudo encontrar el bloque con ID %d en archivo -- posiblemente debido a una petición de restauración fuera de orden, la que no puede ser completada debido a que en el archivo de entrada no es reposicionable (seekable)" -#: pg_backup_custom.c:528 +#: pg_backup_custom.c:524 #, c-format msgid "could not find block ID %d in archive -- possibly corrupt archive" msgstr "no se pudo encontrar el bloque con ID %d en archivo -- posiblemente el archivo está corrupto" -#: pg_backup_custom.c:535 +#: pg_backup_custom.c:531 #, c-format msgid "found unexpected block ID (%d) when reading data -- expected %d" msgstr "se encontró un bloque no esperado ID (%d) mientras se leían los datos -- se esperaba %d" -#: pg_backup_custom.c:549 +#: pg_backup_custom.c:545 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "se encontró un bloque tipo %d no reconocido al restablecer el archivador" -#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952 -#: pg_backup_tar.c:1017 +#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:945 +#: pg_backup_tar.c:1032 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "no se pudo determinar la posición (seek) en el archivo del archivador: %m" -#: pg_backup_custom.c:771 pg_backup_custom.c:811 +#: pg_backup_custom.c:767 pg_backup_custom.c:807 #, c-format msgid "could not close archive file: %m" msgstr "no se pudo cerrar el archivo del archivador: %m" -#: pg_backup_custom.c:794 +#: pg_backup_custom.c:790 #, c-format msgid "can only reopen input archives" msgstr "sólo se pueden reabrir archivos de entrada" -#: pg_backup_custom.c:801 +#: pg_backup_custom.c:797 #, c-format msgid "parallel restore from standard input is not supported" msgstr "la restauración en paralelo desde entrada estándar (stdin) no está soportada" -#: pg_backup_custom.c:803 +#: pg_backup_custom.c:799 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "la restauración en paralelo desde un archivo no posicionable no está soportada" -#: pg_backup_custom.c:819 +#: pg_backup_custom.c:815 #, c-format msgid "could not set seek position in archive file: %m" msgstr "no se pudo posicionar (seek) en el archivo del archivador: %m" -#: pg_backup_custom.c:898 +#: pg_backup_custom.c:894 #, c-format msgid "compressor active" msgstr "compresor activo" @@ -1090,12 +1220,12 @@ msgstr "compresor activo" msgid "could not get server_version from libpq" msgstr "no se pudo obtener server_version desde libpq" -#: pg_backup_db.c:53 pg_dumpall.c:1809 +#: pg_backup_db.c:53 pg_dumpall.c:1831 #, c-format msgid "aborting because of server version mismatch" msgstr "abortando debido a que no coincide la versión del servidor" -#: pg_backup_db.c:54 pg_dumpall.c:1810 +#: pg_backup_db.c:54 pg_dumpall.c:1832 #, c-format msgid "server version: %s; %s version: %s" msgstr "versión del servidor: %s; versión de %s: %s" @@ -1105,7 +1235,7 @@ msgstr "versión del servidor: %s; versión de %s: %s" msgid "already connected to a database" msgstr "ya está conectado a una base de datos" -#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1678 pg_dumpall.c:1780 msgid "Password: " msgstr "Contraseña: " @@ -1119,18 +1249,18 @@ msgstr "no se pudo hacer la conexión a la base de datos" msgid "reconnection failed: %s" msgstr "falló la reconexión: %s" -#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dumpall.c:1683 -#: pg_dumpall.c:1767 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:788 pg_dump_sort.c:1213 +#: pg_dump_sort.c:1233 pg_dumpall.c:1705 pg_dumpall.c:1789 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895 +#: pg_backup_db.c:271 pg_dumpall.c:1894 pg_dumpall.c:1917 #, c-format msgid "query failed: %s" msgstr "la consulta falló: %s" -#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896 +#: pg_backup_db.c:273 pg_dumpall.c:1895 pg_dumpall.c:1918 #, c-format msgid "Query was: %s" msgstr "La consulta era: %s" @@ -1166,7 +1296,7 @@ msgstr "PQputCopyEnd regresó un error: %s" msgid "COPY failed for table \"%s\": %s" msgstr "COPY falló para la tabla «%s»: %s" -#: pg_backup_db.c:521 pg_dump.c:2202 +#: pg_backup_db.c:521 pg_dump.c:2284 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "resultados extra inesperados durante el COPY de la tabla «%s»" @@ -1179,161 +1309,156 @@ msgstr "no se pudo iniciar la transacción en la base de datos" msgid "could not commit database transaction" msgstr "no se pudo terminar la transacción a la base de datos" -#: pg_backup_directory.c:155 +#: pg_backup_directory.c:153 #, c-format msgid "no output directory specified" msgstr "no se especificó un directorio de salida" -#: pg_backup_directory.c:184 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "no se pudo leer el directorio «%s»: %m" - -#: pg_backup_directory.c:188 +#: pg_backup_directory.c:186 #, c-format msgid "could not close directory \"%s\": %m" msgstr "no se pudo abrir el directorio «%s»: %m" -#: pg_backup_directory.c:194 +#: pg_backup_directory.c:192 #, c-format msgid "could not create directory \"%s\": %m" msgstr "no se pudo crear el directorio «%s»: %m" -#: pg_backup_directory.c:356 pg_backup_directory.c:499 -#: pg_backup_directory.c:537 +#: pg_backup_directory.c:357 pg_backup_directory.c:506 +#: pg_backup_directory.c:544 #, c-format msgid "could not write to output file: %s" msgstr "no se pudo escribir al archivo de salida: %s" -#: pg_backup_directory.c:374 +#: pg_backup_directory.c:375 #, c-format msgid "could not close data file: %m" msgstr "no se pudo cerrar el archivo de datos: %m" -#: pg_backup_directory.c:407 +#: pg_backup_directory.c:408 #, c-format msgid "could not close data file \"%s\": %m" msgstr "no se pudo cerrar el archivo de datos «%s»: %m" -#: pg_backup_directory.c:448 +#: pg_backup_directory.c:455 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "no se pudo abrir el archivo de la tabla de contenidos de objetos grandes «%s» para su lectura: %m" -#: pg_backup_directory.c:459 +#: pg_backup_directory.c:466 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "línea no válida en el archivo de la tabla de contenido de objetos grandes «%s»: «%s»" -#: pg_backup_directory.c:468 +#: pg_backup_directory.c:475 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "error al leer el archivo de la tabla de contenidos de objetos grandes «%s»" -#: pg_backup_directory.c:472 +#: pg_backup_directory.c:479 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "no se pudo cerrar el archivo de la tabla de contenido de los objetos grandes «%s»: %m" -#: pg_backup_directory.c:694 +#: pg_backup_directory.c:702 #, c-format msgid "could not close LO data file: %m" msgstr "no se pudo cerrar el archivo de datos LO: %m" -#: pg_backup_directory.c:704 +#: pg_backup_directory.c:712 #, c-format msgid "could not write to LOs TOC file: %s" msgstr "no se pudo escribir archivo TOC de LOs: %s" -#: pg_backup_directory.c:720 +#: pg_backup_directory.c:728 #, c-format msgid "could not close LOs TOC file: %m" -msgstr "no se pudo cerrar el archivo TOC de LOs: %m" +msgstr "no se pudo cerrar el archivo TOC: %m" -#: pg_backup_directory.c:739 +#: pg_backup_directory.c:747 #, c-format msgid "file name too long: \"%s\"" msgstr "nombre de archivo demasiado largo: «%s»" -#: pg_backup_null.c:74 +#: pg_backup_null.c:70 #, c-format msgid "this format cannot be read" msgstr "no se puede leer este formato" -#: pg_backup_tar.c:172 +#: pg_backup_tar.c:168 #, c-format msgid "could not open TOC file \"%s\" for output: %m" msgstr "no se pudo abrir el archivo de tabla de contenido «%s» para escribir: %m" -#: pg_backup_tar.c:179 +#: pg_backup_tar.c:175 #, c-format msgid "could not open TOC file for output: %m" msgstr "no se pudo abrir la tabla de contenido para escribir: %m" -#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 -#: pg_backup_tar.c:405 pg_backup_tar.c:891 +#: pg_backup_tar.c:194 pg_backup_tar.c:330 pg_backup_tar.c:385 +#: pg_backup_tar.c:401 pg_backup_tar.c:906 #, c-format msgid "compression is not supported by tar archive format" msgstr "la compresión no está soportada por el formato de salida tar" -#: pg_backup_tar.c:206 +#: pg_backup_tar.c:202 #, c-format msgid "could not open TOC file \"%s\" for input: %m" msgstr "no se pudo abrir el archivo de tabla de contenido «%s» para leer: %m" -#: pg_backup_tar.c:213 +#: pg_backup_tar.c:209 #, c-format msgid "could not open TOC file for input: %m" msgstr "no se pudo abrir la tabla de contenido para leer: %m" -#: pg_backup_tar.c:322 +#: pg_backup_tar.c:318 #, c-format msgid "could not find file \"%s\" in archive" msgstr "no se pudo encontrar el archivo «%s» en el archivador" -#: pg_backup_tar.c:382 +#: pg_backup_tar.c:378 #, c-format msgid "could not generate temporary file name: %m" msgstr "no se pudo generar el nombre de archivo temporal: %m" -#: pg_backup_tar.c:623 +#: pg_backup_tar.c:619 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "sintaxis de sentencia COPY inesperada: «%s»" -#: pg_backup_tar.c:888 +#: pg_backup_tar.c:903 #, c-format msgid "invalid OID for large object (%u)" msgstr "el OID del objeto grande no es válido (%u)" -#: pg_backup_tar.c:1033 +#: pg_backup_tar.c:1048 #, c-format msgid "could not close temporary file: %m" msgstr "no se pudo abrir archivo temporal: %m" -#: pg_backup_tar.c:1036 +#: pg_backup_tar.c:1051 #, c-format msgid "actual file length (%lld) does not match expected (%lld)" msgstr "el tamaño real del archivo (%lld) no coincide con el esperado (%lld)" -#: pg_backup_tar.c:1082 pg_backup_tar.c:1113 +#: pg_backup_tar.c:1097 pg_backup_tar.c:1128 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "no se pudo encontrar el encabezado para el archivo «%s» en el archivo tar" -#: pg_backup_tar.c:1100 +#: pg_backup_tar.c:1115 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "la extracción de datos fuera de orden no está soportada en este formato: se requiere «%s», pero viene antes de «%s» en el archivador." -#: pg_backup_tar.c:1147 +#: pg_backup_tar.c:1162 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "se encontró un encabezado incompleto (%lu byte)" msgstr[1] "se encontró un encabezado incompleto (%lu bytes)" -#: pg_backup_tar.c:1186 +#: pg_backup_tar.c:1201 #, c-format msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" msgstr "se encontró un encabezado corrupto en %s (esperado %d, calculado %d) en la posición %llu" @@ -1343,10 +1468,10 @@ msgstr "se encontró un encabezado corrupto en %s (esperado %d, calculado %d) en msgid "unrecognized section name: \"%s\"" msgstr "nombre de sección «%s» no reconocido" -#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365 -#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398 -#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307 -#: pg_restore.c:321 +#: pg_backup_utils.c:55 pg_dump.c:694 pg_dump.c:711 pg_dumpall.c:370 +#: pg_dumpall.c:380 pg_dumpall.c:388 pg_dumpall.c:396 pg_dumpall.c:403 +#: pg_dumpall.c:413 pg_dumpall.c:488 pg_restore.c:307 pg_restore.c:323 +#: pg_restore.c:337 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." @@ -1356,82 +1481,82 @@ msgstr "Pruebe «%s --help» para mayor información." msgid "out of on_exit_nicely slots" msgstr "elementos on_exit_nicely agotados" -#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305 +#: pg_dump.c:709 pg_dumpall.c:378 pg_restore.c:321 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: pg_dump.c:696 pg_restore.c:328 +#: pg_dump.c:728 pg_restore.c:344 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "las opciones -s/--schema-only y -a/--data-only no pueden usarse juntas" -#: pg_dump.c:699 +#: pg_dump.c:731 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "las opciones -s/--schema-only y --include-foreign-data no pueden usarse juntas" -#: pg_dump.c:702 +#: pg_dump.c:734 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "la opción --include-foreign-data no está soportado con respaldo en paralelo" -#: pg_dump.c:705 pg_restore.c:331 +#: pg_dump.c:737 pg_restore.c:347 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "las opciones -c/--clean y -a/--data-only no pueden usarse juntas" -#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356 +#: pg_dump.c:740 pg_dumpall.c:408 pg_restore.c:375 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "la opción --if-exists requiere la opción -c/--clean" -#: pg_dump.c:715 +#: pg_dump.c:747 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "la opción --on-conflict-do-nothing requiere la opción --inserts, --rows-per-insert o --column-inserts" -#: pg_dump.c:744 +#: pg_dump.c:776 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "algoritmo de compresión no reconocido: «%s»" -#: pg_dump.c:751 +#: pg_dump.c:783 #, c-format msgid "invalid compression specification: %s" msgstr "especificación de compresión no válida: %s" -#: pg_dump.c:764 +#: pg_dump.c:796 #, c-format msgid "compression option \"%s\" is not currently supported by pg_dump" msgstr "la opción de compresión «%s» no está soportada por pg_dump actualmente" -#: pg_dump.c:776 +#: pg_dump.c:808 #, c-format msgid "parallel backup only supported by the directory format" msgstr "el volcado en paralelo sólo está soportado por el formato «directory»" -#: pg_dump.c:822 +#: pg_dump.c:854 #, c-format msgid "last built-in OID is %u" msgstr "el último OID interno es %u" -#: pg_dump.c:831 +#: pg_dump.c:863 #, c-format msgid "no matching schemas were found" msgstr "no se encontraron esquemas coincidentes" -#: pg_dump.c:848 +#: pg_dump.c:880 #, c-format msgid "no matching tables were found" msgstr "no se encontraron tablas coincidentes" -#: pg_dump.c:876 +#: pg_dump.c:908 #, c-format msgid "no matching extensions were found" msgstr "no se encontraron extensiones coincidentes" -#: pg_dump.c:1056 +#: pg_dump.c:1092 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1440,17 +1565,17 @@ msgstr "" "%s extrae una base de datos en formato de texto o en otros formatos.\n" "\n" -#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433 +#: pg_dump.c:1093 pg_dumpall.c:636 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: pg_dump.c:1058 +#: pg_dump.c:1094 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPCIÓN]... [NOMBREDB]\n" -#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436 +#: pg_dump.c:1096 pg_dumpall.c:639 pg_restore.c:455 #, c-format msgid "" "\n" @@ -1459,12 +1584,12 @@ msgstr "" "\n" "Opciones generales:\n" -#: pg_dump.c:1061 +#: pg_dump.c:1097 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=ARCHIVO nombre del archivo o directorio de salida\n" -#: pg_dump.c:1062 +#: pg_dump.c:1098 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1473,26 +1598,23 @@ msgstr "" " -F, --format=c|d|t|p Formato del archivo de salida (c=personalizado, \n" " d=directorio, t=tar, p=texto (por omisión))\n" -#: pg_dump.c:1064 +#: pg_dump.c:1100 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM máximo de procesos paralelos para volcar\n" -#: pg_dump.c:1065 pg_dumpall.c:635 +#: pg_dump.c:1101 pg_dumpall.c:641 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose modo verboso\n" -#: pg_dump.c:1066 pg_dumpall.c:636 +#: pg_dump.c:1102 pg_dumpall.c:642 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de version y salir\n" -#: pg_dump.c:1067 +#: pg_dump.c:1103 #, c-format -#| msgid "" -#| " -Z, --compress=METHOD[:DETAIL]\n" -#| " compress as specified\n" msgid "" " -Z, --compress=METHOD[:DETAIL]\n" " compress as specified\n" @@ -1500,22 +1622,27 @@ msgstr "" " -Z, --compress=MÉTODO[:DETALLE]\n" " comprimir como se indica\n" -#: pg_dump.c:1069 pg_dumpall.c:637 +#: pg_dump.c:1105 pg_dumpall.c:643 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=SEGS espera a lo más SEGS segundos obtener un lock\n" -#: pg_dump.c:1070 pg_dumpall.c:664 +#: pg_dump.c:1106 pg_dumpall.c:671 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync no esperar que los cambios se sincronicen a disco\n" -#: pg_dump.c:1071 pg_dumpall.c:638 +#: pg_dump.c:1107 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=MÉTODO definir método para sincr. archivos a disco\n" + +#: pg_dump.c:1108 pg_dumpall.c:644 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: pg_dump.c:1073 pg_dumpall.c:639 +#: pg_dump.c:1110 pg_dumpall.c:645 #, c-format msgid "" "\n" @@ -1524,76 +1651,64 @@ msgstr "" "\n" "Opciones que controlan el contenido de la salida:\n" -#: pg_dump.c:1074 pg_dumpall.c:640 +#: pg_dump.c:1111 pg_dumpall.c:646 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only extrae sólo los datos, no el esquema\n" -#: pg_dump.c:1075 +#: pg_dump.c:1112 #, c-format -#| msgid "" -#| " -b, --large-objects include large objects in dump\n" -#| " --blobs (same as --large-objects, deprecated)\n" msgid " -b, --large-objects include large objects in dump\n" msgstr " -b, --large-objects incluir “large objects†en la extracción\n" -#: pg_dump.c:1076 +#: pg_dump.c:1113 #, c-format -#| msgid "" -#| " -b, --large-objects include large objects in dump\n" -#| " --blobs (same as --large-objects, deprecated)\n" msgid " --blobs (same as --large-objects, deprecated)\n" msgstr " --blobs (igual que --large-objects, deprecado)\n" -#: pg_dump.c:1077 +#: pg_dump.c:1114 #, c-format -#| msgid "" -#| " -B, --no-large-objects exclude large objects in dump\n" -#| " --no-blobs (same as --no-large-objects, deprecated)\n" msgid " -B, --no-large-objects exclude large objects in dump\n" msgstr " -B, --no-large-objects excluir “large objects†en la extracción\n" -#: pg_dump.c:1078 +#: pg_dump.c:1115 #, c-format -#| msgid "" -#| " -B, --no-large-objects exclude large objects in dump\n" -#| " --no-blobs (same as --no-large-objects, deprecated)\n" msgid " --no-blobs (same as --no-large-objects, deprecated)\n" msgstr " --no-blobs (igual que --no-large-objects, deprecado)\n" -#: pg_dump.c:1079 pg_restore.c:447 +#: pg_dump.c:1116 pg_restore.c:466 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean tira (drop) la base de datos antes de crearla\n" -#: pg_dump.c:1080 +#: pg_dump.c:1117 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr "" " -C, --create incluye órdenes para crear la base de datos\n" " en la extracción\n" -#: pg_dump.c:1081 +#: pg_dump.c:1118 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr " -e, --extension=PATRÓN extrae sólo la o las extensiones nombradas\n" -#: pg_dump.c:1082 pg_dumpall.c:642 +#: pg_dump.c:1119 pg_dumpall.c:648 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=CODIF extrae los datos con la codificación CODIF\n" -#: pg_dump.c:1083 +#: pg_dump.c:1120 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=PATRÓN extrae sólo el o los esquemas nombrados\n" -#: pg_dump.c:1084 +#: pg_dump.c:1121 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=PATRÓN NO extrae el o los esquemas nombrados\n" -#: pg_dump.c:1085 +#: pg_dump.c:1122 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1602,58 +1717,58 @@ msgstr "" " -O, --no-owner en formato de sólo texto, no reestablece\n" " los dueños de los objetos\n" -#: pg_dump.c:1087 pg_dumpall.c:646 +#: pg_dump.c:1124 pg_dumpall.c:652 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only extrae sólo el esquema, no los datos\n" -#: pg_dump.c:1088 +#: pg_dump.c:1125 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr " -S, --superuser=NAME superusuario a utilizar en el volcado de texto\n" -#: pg_dump.c:1089 +#: pg_dump.c:1126 #, c-format msgid " -t, --table=PATTERN dump only the specified table(s)\n" msgstr " -t, --table=PATRÓN extrae sólo la o las tablas nombradas\n" -#: pg_dump.c:1090 +#: pg_dump.c:1127 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=PATRÓN NO extrae la o las tablas nombradas\n" -#: pg_dump.c:1091 pg_dumpall.c:649 +#: pg_dump.c:1128 pg_dumpall.c:655 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges no extrae los privilegios (grant/revoke)\n" -#: pg_dump.c:1092 pg_dumpall.c:650 +#: pg_dump.c:1129 pg_dumpall.c:656 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade sólo para uso de utilidades de upgrade\n" -#: pg_dump.c:1093 pg_dumpall.c:651 +#: pg_dump.c:1130 pg_dumpall.c:657 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr "" " --column-inserts extrae los datos usando INSERT con nombres\n" " de columnas\n" -#: pg_dump.c:1094 pg_dumpall.c:652 +#: pg_dump.c:1131 pg_dumpall.c:658 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr "" " --disable-dollar-quoting deshabilita el uso de «delimitadores de dólar»,\n" " usa delimitadores de cadena estándares\n" -#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464 +#: pg_dump.c:1132 pg_dumpall.c:659 pg_restore.c:483 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr "" " --disable-triggers deshabilita los disparadores (triggers) durante el\n" " restablecimiento de la extracción de sólo-datos\n" -#: pg_dump.c:1096 +#: pg_dump.c:1133 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" @@ -1662,12 +1777,13 @@ msgstr "" " --enable-row-security activa seguridad de filas (volcar sólo el\n" " contenido al que el usuario tiene acceso)\n" -#: pg_dump.c:1098 +#: pg_dump.c:1135 +#, c-format +msgid " --exclude-extension=PATTERN do NOT dump the specified extension(s)\n" +msgstr " --exclude-extension=PATRÓN NO volcar la o las extensiones indicadas\n" + +#: pg_dump.c:1136 #, c-format -#| msgid "" -#| " --exclude-table-and-children=PATTERN\n" -#| " do NOT dump the specified table(s),\n" -#| " including child and partition tables\n" msgid "" " --exclude-table-and-children=PATTERN\n" " do NOT dump the specified table(s), including\n" @@ -1677,12 +1793,12 @@ msgstr "" " NO extrae la o las tablas especificadas,\n" " incluyendo tablas hijas y particiones\n" -#: pg_dump.c:1101 +#: pg_dump.c:1139 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=PATRÓN NO extrae los datos de la(s) tablas nombradas\n" -#: pg_dump.c:1102 +#: pg_dump.c:1140 #, c-format msgid "" " --exclude-table-data-and-children=PATTERN\n" @@ -1693,17 +1809,26 @@ msgstr "" " NO extrae datos para la o las tablas\n" " especificadas, incluyendo hijas y particiones\n" -#: pg_dump.c:1105 pg_dumpall.c:655 +#: pg_dump.c:1143 pg_dumpall.c:661 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=NUM usa este valor para extra_float_digits\n" -#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466 +#: pg_dump.c:1144 +#, c-format +msgid "" +" --filter=FILENAME include or exclude objects and data from dump\n" +" based on expressions in FILENAME\n" +msgstr "" +" --filter=ARCHIVO incluir o excluir objetos y datos basado en\n" +" expresiones en ARCHIVO\n" + +#: pg_dump.c:1146 pg_dumpall.c:663 pg_restore.c:487 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists usa IF EXISTS al eliminar objetos\n" -#: pg_dump.c:1107 +#: pg_dump.c:1147 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1714,93 +1839,93 @@ msgstr "" " incluye datos de tablas foráneas en servidores\n" " que coinciden con PATRÓN\n" -#: pg_dump.c:1110 pg_dumpall.c:657 +#: pg_dump.c:1150 pg_dumpall.c:664 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts extrae los datos usando INSERT, en vez de COPY\n" -#: pg_dump.c:1111 pg_dumpall.c:658 +#: pg_dump.c:1151 pg_dumpall.c:665 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root cargar particiones a través de tabla raíz\n" -#: pg_dump.c:1112 pg_dumpall.c:659 +#: pg_dump.c:1152 pg_dumpall.c:666 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments no volcar los comentarios\n" -#: pg_dump.c:1113 pg_dumpall.c:660 +#: pg_dump.c:1153 pg_dumpall.c:667 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications no volcar las publicaciones\n" -#: pg_dump.c:1114 pg_dumpall.c:662 +#: pg_dump.c:1154 pg_dumpall.c:669 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels no volcar asignaciones de etiquetas de seguridad\n" -#: pg_dump.c:1115 pg_dumpall.c:663 +#: pg_dump.c:1155 pg_dumpall.c:670 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions no volcar las suscripciones\n" -#: pg_dump.c:1116 pg_dumpall.c:665 +#: pg_dump.c:1156 pg_dumpall.c:672 #, c-format msgid " --no-table-access-method do not dump table access methods\n" -msgstr " --no-tablespaces no volcar métodos de acceso de tablas\n" +msgstr " --no-table-access-method no volcar métodos de acceso de tablas\n" -#: pg_dump.c:1117 pg_dumpall.c:666 +#: pg_dump.c:1157 pg_dumpall.c:673 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces no volcar asignaciones de tablespace\n" -#: pg_dump.c:1118 pg_dumpall.c:667 +#: pg_dump.c:1158 pg_dumpall.c:674 #, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" msgstr " --no-toast-compression no volcar métodos de compresión TOAST\n" -#: pg_dump.c:1119 pg_dumpall.c:668 +#: pg_dump.c:1159 pg_dumpall.c:675 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data no volcar datos de tablas unlogged\n" -#: pg_dump.c:1120 pg_dumpall.c:669 +#: pg_dump.c:1160 pg_dumpall.c:676 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr " --on-conflict-do-nothing agregar ON CONFLICT DO NOTHING a órdenes INSERT\n" -#: pg_dump.c:1121 pg_dumpall.c:670 +#: pg_dump.c:1161 pg_dumpall.c:677 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr "" " --quote-all-identifiers entrecomilla todos los identificadores, incluso\n" " si no son palabras clave\n" -#: pg_dump.c:1122 pg_dumpall.c:671 +#: pg_dump.c:1162 pg_dumpall.c:678 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NUMFILAS número de filas por INSERT; implica --inserts\n" -#: pg_dump.c:1123 +#: pg_dump.c:1163 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr "" " --section=SECCIÓN volcar la sección nombrada (pre-data, data,\n" " post-data)\n" -#: pg_dump.c:1124 +#: pg_dump.c:1164 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr "" " --serializable-deferrable espera hasta que el respaldo pueda completarse\n" " sin anomalías\n" -#: pg_dump.c:1125 +#: pg_dump.c:1165 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT use el snapshot dado para la extracción\n" -#: pg_dump.c:1126 pg_restore.c:476 +#: pg_dump.c:1166 pg_restore.c:497 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" @@ -1809,11 +1934,8 @@ msgstr "" " --strict-names requerir al menos una coincidencia para cada patrón\n" " de nombre de tablas y esquemas\n" -#: pg_dump.c:1128 +#: pg_dump.c:1168 #, c-format -#| msgid "" -#| " --table-and-children=PATTERN dump only the specified table(s),\n" -#| " including child and partition tables\n" msgid "" " --table-and-children=PATTERN dump only the specified table(s), including\n" " child and partition tables\n" @@ -1821,7 +1943,7 @@ msgstr "" " --table-and-children=PATRÓN volcar sólo la o las tablas especificadas,\n" " incluyendo tablas hijas y particiones\n" -#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478 +#: pg_dump.c:1170 pg_dumpall.c:679 pg_restore.c:500 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1832,7 +1954,7 @@ msgstr "" " usa órdenes SESSION AUTHORIZATION en lugar de\n" " ALTER OWNER para cambiar los dueño de los objetos\n" -#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482 +#: pg_dump.c:1174 pg_dumpall.c:683 pg_restore.c:504 #, c-format msgid "" "\n" @@ -1841,46 +1963,46 @@ msgstr "" "\n" "Opciones de conexión:\n" -#: pg_dump.c:1135 +#: pg_dump.c:1175 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=NOMBRE nombre de la base de datos que volcar\n" -#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483 +#: pg_dump.c:1176 pg_dumpall.c:685 pg_restore.c:505 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=ANFITRIÓN anfitrión de la base de datos o\n" " directorio del enchufe (socket)\n" -#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484 +#: pg_dump.c:1177 pg_dumpall.c:687 pg_restore.c:506 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PUERTO número del puerto de la base de datos\n" -#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485 +#: pg_dump.c:1178 pg_dumpall.c:688 pg_restore.c:507 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=USUARIO nombre de usuario con el cual conectarse\n" -#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486 +#: pg_dump.c:1179 pg_dumpall.c:689 pg_restore.c:508 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password nunca pedir una contraseña\n" -#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487 +#: pg_dump.c:1180 pg_dumpall.c:690 pg_restore.c:509 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" " -W, --password fuerza un prompt para la contraseña\n" " (debería ser automático)\n" -#: pg_dump.c:1141 pg_dumpall.c:684 +#: pg_dump.c:1181 pg_dumpall.c:691 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROL ejecuta SET ROLE antes del volcado\n" -#: pg_dump.c:1143 +#: pg_dump.c:1183 #, c-format msgid "" "\n" @@ -1893,530 +2015,537 @@ msgstr "" "de la variable de ambiente PGDATABASE.\n" "\n" -#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494 +#: pg_dump.c:1185 pg_dumpall.c:695 pg_restore.c:516 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Reporte errores a <%s>.\n" -#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495 +#: pg_dump.c:1186 pg_dumpall.c:696 pg_restore.c:517 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: pg_dump.c:1165 pg_dumpall.c:513 +#: pg_dump.c:1205 pg_dumpall.c:518 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "la codificación de cliente especificada «%s» no es válida" -#: pg_dump.c:1303 +#: pg_dump.c:1353 #, c-format msgid "parallel dumps from standby servers are not supported by this server version" msgstr "Los volcados en paralelo desde servidores standby no están soportados por esta versión de servidor." -#: pg_dump.c:1368 +#: pg_dump.c:1418 #, c-format msgid "invalid output format \"%s\" specified" msgstr "el formato de salida especificado «%s» no es válido" -#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449 +#: pg_dump.c:1459 pg_dump.c:1515 pg_dump.c:1568 pg_dumpall.c:1468 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "el nombre no es válido (demasiados puntos): %s" -#: pg_dump.c:1417 +#: pg_dump.c:1467 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "no se encontraron esquemas coincidentes para el patrón «%s»" -#: pg_dump.c:1470 +#: pg_dump.c:1520 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "no se encontraron extensiones coincidentes para el patrón «%s»" -#: pg_dump.c:1523 +#: pg_dump.c:1573 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "no se encontraron servidores foráneos coincidentes para el patrón «%s»" -#: pg_dump.c:1594 +#: pg_dump.c:1644 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "el nombre de relación no es válido (demasiados puntos): %s" -#: pg_dump.c:1616 +#: pg_dump.c:1666 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "no se encontraron tablas coincidentes para el patrón «%s»" -#: pg_dump.c:1643 +#: pg_dump.c:1693 #, c-format msgid "You are currently not connected to a database." msgstr "No está conectado a una base de datos." -#: pg_dump.c:1646 +#: pg_dump.c:1696 #, c-format msgid "cross-database references are not implemented: %s" msgstr "no están implementadas las referencias entre bases de datos: %s" -#: pg_dump.c:2077 +#: pg_dump.c:2155 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "extrayendo el contenido de la tabla «%s.%s»" -#: pg_dump.c:2183 +#: pg_dump.c:2265 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Falló la extracción del contenido de la tabla «%s»: PQgetCopyData() falló." -#: pg_dump.c:2184 pg_dump.c:2194 +#: pg_dump.c:2266 pg_dump.c:2276 #, c-format msgid "Error message from server: %s" msgstr "Mensaje de error del servidor: %s" -#: pg_dump.c:2185 pg_dump.c:2195 +#: pg_dump.c:2267 pg_dump.c:2277 #, c-format msgid "Command was: %s" msgstr "La orden era: % s" -#: pg_dump.c:2193 +#: pg_dump.c:2275 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Falló la extracción del contenido de la tabla «%s»: PQgetResult() falló." -#: pg_dump.c:2275 +#: pg_dump.c:2366 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "se obtuvo un número incorrecto de campos de la tabla «%s»" -#: pg_dump.c:2973 +#: pg_dump.c:3068 #, c-format msgid "saving database definition" msgstr "salvando las definiciones de la base de datos" -#: pg_dump.c:3078 +#: pg_dump.c:3177 #, c-format msgid "unrecognized locale provider: %s" msgstr "proveedor de configuración regional no reconocido: %s" -#: pg_dump.c:3429 +#: pg_dump.c:3538 #, c-format msgid "saving encoding = %s" msgstr "salvando codificaciones = %s" -#: pg_dump.c:3454 +#: pg_dump.c:3563 #, c-format -msgid "saving standard_conforming_strings = %s" -msgstr "salvando standard_conforming_strings = %s" +msgid "saving \"standard_conforming_strings = %s\"" +msgstr "salvando «standard_conforming_strings = %s»" -#: pg_dump.c:3493 +#: pg_dump.c:3602 #, c-format msgid "could not parse result of current_schemas()" msgstr "no se pudo interpretar la salida de current_schemas()" -#: pg_dump.c:3512 +#: pg_dump.c:3621 #, c-format -msgid "saving search_path = %s" -msgstr "salvando search_path = %s" +msgid "saving \"search_path = %s\"" +msgstr "salvando «search_path = %s»" -#: pg_dump.c:3549 +#: pg_dump.c:3657 #, c-format msgid "reading large objects" msgstr "leyendo objetos grandes" -#: pg_dump.c:3687 +#: pg_dump.c:3878 #, c-format -msgid "saving large objects" -msgstr "salvando objetos grandes" +msgid "saving large objects \"%s\"" +msgstr "salvando objetos grandes «%s»" -#: pg_dump.c:3728 +#: pg_dump.c:3899 #, c-format msgid "error reading large object %u: %s" msgstr "error al leer el objeto grande %u: %s" -#: pg_dump.c:3834 +#: pg_dump.c:4002 #, c-format msgid "reading row-level security policies" msgstr "leyendo políticas de seguridad a nivel de registros" -#: pg_dump.c:3975 +#: pg_dump.c:4143 #, c-format msgid "unexpected policy command type: %c" msgstr "tipo de orden inesperada en política: %c" -#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11982 pg_dump.c:17854 -#: pg_dump.c:17856 pg_dump.c:18477 +#: pg_dump.c:4593 pg_dump.c:5151 pg_dump.c:12365 pg_dump.c:18250 +#: pg_dump.c:18252 pg_dump.c:18874 #, c-format msgid "could not parse %s array" msgstr "no se pudo interpretar el arreglo %s" -#: pg_dump.c:4613 +#: pg_dump.c:4807 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "no se volcaron las suscripciones porque el usuario actual no es un superusuario" -#: pg_dump.c:5149 +#: pg_dump.c:5013 +#, c-format +msgid "subscription with OID %u does not exist" +msgstr "no existe la suscripción con OID %u" + +#: pg_dump.c:5020 +#, c-format +msgid "failed sanity check, table with OID %u not found" +msgstr "falló la revisión de integridad, tabla con OID %u no se encontró" + +#: pg_dump.c:5583 #, c-format msgid "could not find parent extension for %s %s" msgstr "no se pudo encontrar la extensión padre para %s %s" -#: pg_dump.c:5294 +#: pg_dump.c:5728 #, c-format msgid "schema with OID %u does not exist" msgstr "no existe el esquema con OID %u" -#: pg_dump.c:6774 pg_dump.c:17118 +#: pg_dump.c:7210 pg_dump.c:17621 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "falló la revisión de integridad, no se encontró la tabla padre con OID %u de la secuencia con OID %u" -#: pg_dump.c:6917 +#: pg_dump.c:7355 #, c-format msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found" msgstr "falló la revisión de integridad, el OID %u que aparece en pg_partitioned_table no se encontró" -#: pg_dump.c:7148 pg_dump.c:7415 pg_dump.c:7886 pg_dump.c:8550 pg_dump.c:8669 -#: pg_dump.c:8817 +#: pg_dump.c:7586 pg_dump.c:7860 pg_dump.c:8307 pg_dump.c:8921 pg_dump.c:9043 +#: pg_dump.c:9191 #, c-format msgid "unrecognized table OID %u" msgstr "OID de tabla %u no reconocido" -#: pg_dump.c:7152 +#: pg_dump.c:7590 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "datos de índice inesperados para la tabla «%s»" -#: pg_dump.c:7647 +#: pg_dump.c:8092 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "falló la revisión de integridad, no se encontró la tabla padre con OID %u del elemento con OID %u de pg_rewrite" -#: pg_dump.c:7938 -#, c-format -msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" -msgstr "la consulta produjo un nombre de tabla nulo para la llave foránea del disparador \"%s\" en la tabla «%s» (OID de la tabla: %u)" - -#: pg_dump.c:8554 +#: pg_dump.c:8925 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "información de columnas para la tabla «%s» inesperada" -#: pg_dump.c:8583 +#: pg_dump.c:8954 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "numeración de columnas no válida en la tabla «%s»" -#: pg_dump.c:8631 +#: pg_dump.c:9005 #, c-format msgid "finding table default expressions" msgstr "encontrando expresiones default de tablas" -#: pg_dump.c:8673 +#: pg_dump.c:9047 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "el valor de adnum %d para la tabla «%s» no es válido" -#: pg_dump.c:8767 +#: pg_dump.c:9141 #, c-format msgid "finding table check constraints" msgstr "encontrando restricciones CHECK de tablas" -#: pg_dump.c:8821 +#: pg_dump.c:9195 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "se esperaban %d restricciones CHECK en la tabla «%s» pero se encontraron %d" msgstr[1] "se esperaban %d restricciones CHECK en la tabla «%s» pero se encontraron %d" -#: pg_dump.c:8825 +#: pg_dump.c:9199 #, c-format msgid "The system catalogs might be corrupted." msgstr "Los catálogos del sistema podrían estar corruptos." -#: pg_dump.c:9515 +#: pg_dump.c:9889 #, c-format msgid "role with OID %u does not exist" msgstr "no existe el rol con OID %u" -#: pg_dump.c:9627 pg_dump.c:9656 +#: pg_dump.c:10001 pg_dump.c:10030 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "entrada en pg_init_privs no soportada: %u %u %d" -#: pg_dump.c:10477 +#: pg_dump.c:10577 +#, c-format +msgid "missing metadata for large objects \"%s\"" +msgstr "metadata faltante para los objetos grandes «%s»" + +#: pg_dump.c:10860 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "el typtype del tipo «%s» parece no ser válido" -#: pg_dump.c:12051 +#: pg_dump.c:12434 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "el valor del atributo «provolatile» para la función «%s» es desconocido" -#: pg_dump.c:12101 pg_dump.c:13945 +#: pg_dump.c:12484 pg_dump.c:14380 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "el valor del atributo «proparallel» para la función «%s» es desconocido" -#: pg_dump.c:12230 pg_dump.c:12336 pg_dump.c:12343 +#: pg_dump.c:12614 pg_dump.c:12720 pg_dump.c:12727 #, c-format msgid "could not find function definition for function with OID %u" msgstr "no se encontró la definición de la función con OID %u" -#: pg_dump.c:12269 +#: pg_dump.c:12653 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "valor no válido en los campos pg_cast.castfunc o pg_cast.castmethod" -#: pg_dump.c:12272 +#: pg_dump.c:12656 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "valor no válido en el campo pg_cast.castmethod" -#: pg_dump.c:12362 +#: pg_dump.c:12746 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "definición errónea de transformación; al menos uno de trffromsql y trftosql debe ser distinto de cero" -#: pg_dump.c:12379 +#: pg_dump.c:12763 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "valor erróneo en el campo pg_transform.trffromsql" -#: pg_dump.c:12400 +#: pg_dump.c:12784 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "valor erróneo en el campo pg_transform.trftosql" -#: pg_dump.c:12545 +#: pg_dump.c:12929 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "los operadores postfix ya no están soportados (operador «%s»)" -#: pg_dump.c:12715 +#: pg_dump.c:13099 #, c-format msgid "could not find operator with OID %s" msgstr "no se pudo encontrar el operador con OID %s" -#: pg_dump.c:12783 +#: pg_dump.c:13167 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "el tipo «%c» para el método de acceso «%s» no es válido" -#: pg_dump.c:13440 +#: pg_dump.c:13841 pg_dump.c:13909 #, c-format msgid "unrecognized collation provider: %s" msgstr "proveedor de ordenamiento no reconocido: %s" -#: pg_dump.c:13864 +#: pg_dump.c:13850 pg_dump.c:13857 pg_dump.c:13868 pg_dump.c:13878 +#: pg_dump.c:13893 +#, c-format +msgid "invalid collation \"%s\"" +msgstr "ordenamiento \"%s\" no válido" + +#: pg_dump.c:14299 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "valor de aggfinalmodify no reconocido para la agregación «%s»" -#: pg_dump.c:13920 +#: pg_dump.c:14355 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "valor de aggmfinalmodify no reconocido para la agregación «%s»" -#: pg_dump.c:14637 +#: pg_dump.c:15072 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "tipo de objeto desconocido en privilegios por omisión: %d" -#: pg_dump.c:14653 +#: pg_dump.c:15088 #, c-format msgid "could not parse default ACL list (%s)" msgstr "no se pudo interpretar la lista de ACL (%s)" -#: pg_dump.c:14735 +#: pg_dump.c:15172 #, c-format msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "no se pudo interpretar la lista ACL inicial (%s) o por defecto (%s) para el objeto «%s» (%s)" -#: pg_dump.c:14760 +#: pg_dump.c:15197 #, c-format msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "no se pudo interpretar la lista de ACL (%s) o por defecto (%s) para el objeto «%s» (%s)" -#: pg_dump.c:15301 +#: pg_dump.c:15740 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "la consulta para obtener la definición de la vista «%s» no regresó datos" -#: pg_dump.c:15304 +#: pg_dump.c:15743 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "la consulta para obtener la definición de la vista «%s» regresó más de una definición" -#: pg_dump.c:15311 +#: pg_dump.c:15750 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "la definición de la vista «%s» parece estar vacía (tamaño cero)" -#: pg_dump.c:15395 +#: pg_dump.c:15835 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS ya no está soportado (tabla «%s»)" -#: pg_dump.c:16319 +#: pg_dump.c:16822 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "el número de columna %d no es válido para la tabla «%s»" -#: pg_dump.c:16397 +#: pg_dump.c:16900 #, c-format msgid "could not parse index statistic columns" msgstr "no se pudieron interpretar columnas de estadísticas de índices" -#: pg_dump.c:16399 +#: pg_dump.c:16902 #, c-format msgid "could not parse index statistic values" msgstr "no se pudieron interpretar valores de estadísticas de índices" -#: pg_dump.c:16401 +#: pg_dump.c:16904 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "no coincide el número de columnas con el de valores para estadísticas de índices" -#: pg_dump.c:16617 +#: pg_dump.c:17119 #, c-format msgid "missing index for constraint \"%s\"" msgstr "falta un índice para restricción «%s»" -#: pg_dump.c:16852 +#: pg_dump.c:17354 #, c-format msgid "unrecognized constraint type: %c" msgstr "tipo de restricción inesperado: %c" -#: pg_dump.c:16953 pg_dump.c:17182 +#: pg_dump.c:17455 pg_dump.c:17685 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "la consulta para obtener los datos de la secuencia «%s» regresó %d entrada, pero se esperaba 1" msgstr[1] "la consulta para obtener los datos de la secuencia «%s» regresó %d entradas, pero se esperaba 1" -#: pg_dump.c:16985 +#: pg_dump.c:17487 #, c-format msgid "unrecognized sequence type: %s" msgstr "tipo no reconocido de secuencia: %s" -#: pg_dump.c:17274 -#, c-format -msgid "unexpected tgtype value: %d" -msgstr "tgtype no esperado: %d" - -#: pg_dump.c:17346 -#, c-format -msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" -msgstr "argumento de cadena (%s) no válido para el disparador (trigger) «%s» en la tabla «%s»" - -#: pg_dump.c:17615 +#: pg_dump.c:18002 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "la consulta para obtener la regla «%s» asociada con la tabla «%s» falló: retornó un número incorrecto de renglones" -#: pg_dump.c:17768 +#: pg_dump.c:18155 #, c-format msgid "could not find referenced extension %u" msgstr "no se pudo encontrar la extensión referenciada %u" -#: pg_dump.c:17858 +#: pg_dump.c:18254 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "no coincide el número de configuraciones con el de condiciones para extensión" -#: pg_dump.c:17990 +#: pg_dump.c:18386 #, c-format msgid "reading dependency data" msgstr "obteniendo datos de dependencias" -#: pg_dump.c:18076 +#: pg_dump.c:18472 #, c-format msgid "no referencing object %u %u" msgstr "no existe el objeto referenciante %u %u" -#: pg_dump.c:18087 +#: pg_dump.c:18483 #, c-format msgid "no referenced object %u %u" msgstr "no existe el objeto referenciado %u %u" -#: pg_dump_sort.c:422 +#: pg_dump.c:18908 pg_dump.c:18946 pg_dumpall.c:1963 pg_restore.c:551 +#: pg_restore.c:597 +#, c-format +msgid "%s filter for \"%s\" is not allowed" +msgstr "el filtro %s para «%s» no está permitido" + +#: pg_dump_sort.c:424 #, c-format msgid "invalid dumpId %d" msgstr "dumpId %d no válido" -#: pg_dump_sort.c:428 +#: pg_dump_sort.c:430 #, c-format msgid "invalid dependency %d" msgstr "dependencia %d no válida" -#: pg_dump_sort.c:661 +#: pg_dump_sort.c:594 #, c-format msgid "could not identify dependency loop" msgstr "no se pudo identificar bucle de dependencia" -#: pg_dump_sort.c:1232 +#: pg_dump_sort.c:1209 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "hay restricciones de llave foránea circulares en la siguiente tabla:" msgstr[1] "hay restricciones de llave foránea circulares entre las siguientes tablas:" -#: pg_dump_sort.c:1236 pg_dump_sort.c:1256 -#, c-format -msgid " %s" -msgstr " %s" - -#: pg_dump_sort.c:1237 +#: pg_dump_sort.c:1214 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "Puede no ser capaz de restaurar el respaldo sin usar --disable-triggers o temporalmente eliminar las restricciones." -#: pg_dump_sort.c:1238 +#: pg_dump_sort.c:1215 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "Considere usar un volcado completo en lugar de --data-only para evitar este problema." -#: pg_dump_sort.c:1250 +#: pg_dump_sort.c:1227 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "no se pudo resolver el bucle de dependencias entre los siguientes elementos:" -#: pg_dumpall.c:230 +#: pg_dumpall.c:231 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "el programa «%s» es requerido por %s, pero no fue encontrado en el mismo directorio que «%s»" -#: pg_dumpall.c:233 +#: pg_dumpall.c:234 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "el programa «%s» fue encontrado por «%s», pero no es de la misma versión que %s" -#: pg_dumpall.c:382 +#: pg_dumpall.c:387 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "la opción --exclude-database no puede ser usada junto con -g/--globals-only, -r/--roles-only o -t/--tablespaces-only" -#: pg_dumpall.c:390 +#: pg_dumpall.c:395 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "las opciones -g/--globals-only y -r/--roles-only no pueden usarse juntas" -#: pg_dumpall.c:397 +#: pg_dumpall.c:402 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "las opciones -g/--globals-only y -t/--tablespaces-only no pueden usarse juntas" -#: pg_dumpall.c:407 +#: pg_dumpall.c:412 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "las opciones -r/--roles-only y -t/--tablespaces-only no pueden usarse juntas" -#: pg_dumpall.c:469 pg_dumpall.c:1750 +#: pg_dumpall.c:474 pg_dumpall.c:1772 #, c-format msgid "could not connect to database \"%s\"" msgstr "no se pudo establecer la conexión a la base de datos «%s»" -#: pg_dumpall.c:481 +#: pg_dumpall.c:486 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2425,7 +2554,7 @@ msgstr "" "no se pudo establecer la conexión a las bases de datos «postgres» o\n" "«template1». Por favor especifique una base de datos para conectarse." -#: pg_dumpall.c:629 +#: pg_dumpall.c:635 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2435,73 +2564,78 @@ msgstr "" "guión (script) SQL.\n" "\n" -#: pg_dumpall.c:631 +#: pg_dumpall.c:637 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPCIÓN]...\n" -#: pg_dumpall.c:634 +#: pg_dumpall.c:640 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=ARCHIVO nombre del archivo de salida\n" -#: pg_dumpall.c:641 +#: pg_dumpall.c:647 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean tira (drop) la base de datos antes de crearla\n" -#: pg_dumpall.c:643 +#: pg_dumpall.c:649 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr " -g, --globals-only extrae sólo los objetos globales, no bases de datos\n" -#: pg_dumpall.c:644 pg_restore.c:456 +#: pg_dumpall.c:650 pg_restore.c:475 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner no reestablece los dueños de los objetos\n" -#: pg_dumpall.c:645 +#: pg_dumpall.c:651 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr "" " -r, --roles-only extrae sólo los roles, no bases de datos\n" " ni tablespaces\n" -#: pg_dumpall.c:647 +#: pg_dumpall.c:653 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr "" " -S, --superuser=NAME especifica el nombre del superusuario a usar en\n" " el volcado\n" -#: pg_dumpall.c:648 +#: pg_dumpall.c:654 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr "" " -t, --tablespaces-only extrae sólo los tablespaces, no bases de datos\n" " ni roles\n" -#: pg_dumpall.c:654 +#: pg_dumpall.c:660 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr " --exclude-database=PATRÓN excluir bases de datos cuyos nombres coinciden con el patrón\n" -#: pg_dumpall.c:661 +#: pg_dumpall.c:662 +#, c-format +msgid " --filter=FILENAME exclude databases based on expressions in FILENAME\n" +msgstr " --filter=ARCHIVO excluir bases de datos basado en expresiones en ARCHIVO\n" + +#: pg_dumpall.c:668 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords no extraer contraseñas para roles\n" -#: pg_dumpall.c:677 +#: pg_dumpall.c:684 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=CONNSTR conectar usando la cadena de conexión\n" -#: pg_dumpall.c:679 +#: pg_dumpall.c:686 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=NOMBRE especifica la base de datos a la cual conectarse\n" -#: pg_dumpall.c:686 +#: pg_dumpall.c:693 #, c-format msgid "" "\n" @@ -2513,97 +2647,106 @@ msgstr "" "Si no se usa -f/--file, el volcado de SQL será escrito a la salida estándar.\n" "\n" -#: pg_dumpall.c:828 +#: pg_dumpall.c:838 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "omitido nombre de rol que empieza con «pg_» (%s)" -#: pg_dumpall.c:1050 +#: pg_dumpall.c:1060 #, c-format msgid "could not find a legal dump ordering for memberships in role \"%s\"" msgstr "no se pudo encontrar un orden legal para membresías del rol «%s»" -#: pg_dumpall.c:1185 +#: pg_dumpall.c:1195 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "no se pudo interpretar la lista de control de acceso (%s) del parámetro «%s»" -#: pg_dumpall.c:1303 +#: pg_dumpall.c:1322 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "no se pudo interpretar la lista de control de acceso (%s) del tablespace «%s»" -#: pg_dumpall.c:1510 +#: pg_dumpall.c:1529 #, c-format msgid "excluding database \"%s\"" msgstr "excluyendo base de datos «%s»" -#: pg_dumpall.c:1514 +#: pg_dumpall.c:1533 #, c-format msgid "dumping database \"%s\"" msgstr "extrayendo base de datos «%s»" -#: pg_dumpall.c:1545 +#: pg_dumpall.c:1564 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "pg_dump falló en la base de datos «%s», saliendo" -#: pg_dumpall.c:1551 +#: pg_dumpall.c:1570 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "no se pudo reabrir el archivo de salida «%s»: %m" -#: pg_dumpall.c:1592 +#: pg_dumpall.c:1614 #, c-format msgid "running \"%s\"" msgstr "ejecutando «%s»" -#: pg_dumpall.c:1793 +#: pg_dumpall.c:1815 #, c-format msgid "could not get server version" msgstr "no se pudo obtener la versión del servidor" -#: pg_dumpall.c:1796 +#: pg_dumpall.c:1818 #, c-format msgid "could not parse server version \"%s\"" msgstr "no se pudo interpretar la versión del servidor «%s»" -#: pg_dumpall.c:1866 pg_dumpall.c:1889 +#: pg_dumpall.c:1888 pg_dumpall.c:1911 #, c-format msgid "executing %s" msgstr "ejecutando %s" -#: pg_restore.c:313 +#: pg_dumpall.c:1983 +msgid "unsupported filter object" +msgstr "objeto de filtro no soportado" + +#: pg_restore.c:329 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "una de las opciones -d/--dbname y -f/--file debe especificarse" -#: pg_restore.c:320 +#: pg_restore.c:336 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "las opciones -d/--dbname y -f/--file no pueden usarse juntas" -#: pg_restore.c:338 +#: pg_restore.c:350 +#, c-format +msgid "options -1/--single-transaction and --transaction-size cannot be used together" +msgstr "las opciones -1/--single-transaction y --transaction-size no pueden usarse juntas" + +#: pg_restore.c:357 #, c-format msgid "options -C/--create and -1/--single-transaction cannot be used together" msgstr "las opciones -c/--clean y -1/--single-transaction no pueden usarse juntas" -#: pg_restore.c:342 +#: pg_restore.c:361 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "no se puede especificar --single-transaction junto con múltiples tareas" -#: pg_restore.c:380 +#: pg_restore.c:399 #, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "formato de archivo «%s» no reconocido; por favor especifique «c», «d» o «t»" -#: pg_restore.c:419 +#: pg_restore.c:438 #, c-format msgid "errors ignored on restore: %d" msgstr "errores ignorados durante la recuperación: %d" -#: pg_restore.c:432 +#: pg_restore.c:451 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" @@ -2613,49 +2756,49 @@ msgstr "" "creado por pg_dump.\n" "\n" -#: pg_restore.c:434 +#: pg_restore.c:453 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [OPCIÓN]... [ARCHIVO]\n" -#: pg_restore.c:437 +#: pg_restore.c:456 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr " -d, --dbname=NOMBRE nombre de la base de datos a la que conectarse\n" -#: pg_restore.c:438 +#: pg_restore.c:457 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr " -f, --file=ARCHIVO nombre del archivo de salida (- para stdout)\n" -#: pg_restore.c:439 +#: pg_restore.c:458 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr " -F, --format=c|d|t formato del volcado (debería ser automático)\n" -#: pg_restore.c:440 +#: pg_restore.c:459 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr "" " -l, --list imprime una tabla resumida de contenidos\n" " del archivador\n" -#: pg_restore.c:441 +#: pg_restore.c:460 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose modo verboso\n" -#: pg_restore.c:442 +#: pg_restore.c:461 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión y salir\n" -#: pg_restore.c:443 +#: pg_restore.c:462 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: pg_restore.c:445 +#: pg_restore.c:464 #, c-format msgid "" "\n" @@ -2664,34 +2807,34 @@ msgstr "" "\n" "Opciones que controlan la recuperación:\n" -#: pg_restore.c:446 +#: pg_restore.c:465 #, c-format msgid " -a, --data-only restore only the data, no schema\n" msgstr " -a, --data-only reestablece sólo los datos, no el esquema\n" -#: pg_restore.c:448 +#: pg_restore.c:467 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create crea la base de datos de destino\n" -#: pg_restore.c:449 +#: pg_restore.c:468 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr "" " -e, --exit-on-error abandonar al encontrar un error\n" " por omisión, se continúa la restauración\n" -#: pg_restore.c:450 +#: pg_restore.c:469 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NOMBRE reestablece el índice nombrado\n" -#: pg_restore.c:451 +#: pg_restore.c:470 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr " -j, --jobs=NUM máximo de procesos paralelos para restaurar\n" -#: pg_restore.c:452 +#: pg_restore.c:471 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" @@ -2700,64 +2843,73 @@ msgstr "" " -L, --use-list=ARCHIVO usa la tabla de contenido especificada para ordenar\n" " la salida de este archivo\n" -#: pg_restore.c:454 +#: pg_restore.c:473 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr " -n, --schema=NAME reestablece sólo los objetos en este esquema\n" -#: pg_restore.c:455 +#: pg_restore.c:474 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" msgstr " -N, --exclude-schema=NAME no reestablecer los objetos en este esquema\n" -#: pg_restore.c:457 +#: pg_restore.c:476 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=NOMBRE(args) reestablece la función nombrada\n" -#: pg_restore.c:458 +#: pg_restore.c:477 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" msgstr " -s, --schema-only reestablece el esquema únicamente, no los datos\n" -#: pg_restore.c:459 +#: pg_restore.c:478 #, c-format msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" msgstr "" " -S, --superuser=NOMBRE especifica el nombre del superusuario que se usa\n" " para deshabilitar los disparadores (triggers)\n" -#: pg_restore.c:460 +#: pg_restore.c:479 #, c-format msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" msgstr " -t, --table=NOMBRE reestablece la relación (tabla, vista, etc.) nombrada\n" -#: pg_restore.c:461 +#: pg_restore.c:480 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NOMBRE reestablece el disparador (trigger) nombrado\n" -#: pg_restore.c:462 +#: pg_restore.c:481 #, c-format msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" msgstr " -x, --no-privileges no reestablece los privilegios (grant/revoke)\n" -#: pg_restore.c:463 +#: pg_restore.c:482 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction reestablece en una única transacción\n" -#: pg_restore.c:465 +#: pg_restore.c:484 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security activa seguridad de filas\n" -#: pg_restore.c:467 +#: pg_restore.c:485 +#, c-format +msgid "" +" --filter=FILENAME restore or skip objects based on expressions\n" +" in FILENAME\n" +msgstr "" +" --filter=ARCHIVO restaurar o ignorar objetos basados en\n" +" expresiones en ARCHIVO\n" + +#: pg_restore.c:488 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments no restaurar comentarios\n" -#: pg_restore.c:468 +#: pg_restore.c:489 #, c-format msgid "" " --no-data-for-failed-tables do not restore data of tables that could not be\n" @@ -2766,44 +2918,49 @@ msgstr "" " --no-data-for-failed-tables no reestablece datos de tablas que no pudieron\n" " ser creadas\n" -#: pg_restore.c:470 +#: pg_restore.c:491 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications no restaurar publicaciones\n" -#: pg_restore.c:471 +#: pg_restore.c:492 #, c-format msgid " --no-security-labels do not restore security labels\n" msgstr " --no-security-labels no restaura etiquetas de seguridad\n" -#: pg_restore.c:472 +#: pg_restore.c:493 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions no restaurar suscripciones\n" -#: pg_restore.c:473 +#: pg_restore.c:494 #, c-format msgid " --no-table-access-method do not restore table access methods\n" msgstr " --no-table-access-method no restaura métodos de acceso de tablas\n" -#: pg_restore.c:474 +#: pg_restore.c:495 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" msgstr " --no-tablespaces no restaura asignaciones de tablespace\n" -#: pg_restore.c:475 +#: pg_restore.c:496 #, c-format msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" msgstr "" " --section=SECCIÓN reestablece la sección nombrada (pre-data, data\n" " post-data)\n" -#: pg_restore.c:488 +#: pg_restore.c:499 +#, c-format +msgid " --transaction-size=N commit after every N objects\n" +msgstr " --transaction-size=N comprometer transacción cada N objetos\n" + +#: pg_restore.c:510 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=ROLENAME hace SET ROLE antes de restaurar\n" -#: pg_restore.c:490 +#: pg_restore.c:512 #, c-format msgid "" "\n" @@ -2814,7 +2971,7 @@ msgstr "" "Las opciones -I, -n, -N, -P, -t, -T, y --section pueden ser combinadas y especificadas\n" "varias veces para seleccionar varios objetos.\n" -#: pg_restore.c:493 +#: pg_restore.c:515 #, c-format msgid "" "\n" @@ -2824,7 +2981,3 @@ msgstr "" "\n" "Si no se especifica un archivo de entrada, se usa la entrada estándar.\n" "\n" - -#, c-format -#~ msgid "value for compression option \"%s\" must be a boolean" -#~ msgstr "el valor para la opción de compresión «%s» debe ser un booleano" diff --git a/src/bin/pg_dump/po/fr.po b/src/bin/pg_dump/po/fr.po index 7e7460cac137c..73f909f7059e5 100644 --- a/src/bin/pg_dump/po/fr.po +++ b/src/bin/pg_dump/po/fr.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-14 10:19+0000\n" -"PO-Revision-Date: 2022-05-14 17:16+0200\n" +"POT-Creation-Date: 2025-05-01 11:09+0000\n" +"PO-Revision-Date: 2025-05-01 21:40+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -21,104 +21,204 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.6\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "attention : " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "détail : " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "astuce : " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/compression.c:132 ../../common/compression.c:141 +#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420 +#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25 +#: compress_zstd.c:31 #, c-format -msgid "could not identify current directory: %m" -msgstr "n'a pas pu identifier le répertoire courant : %m" +msgid "this build does not support compression with %s" +msgstr "cette construction ne supporte pas la compression avec %s" -#: ../../common/exec.c:168 +#: ../../common/compression.c:205 +msgid "found empty string where a compression option was expected" +msgstr "a trouvé une chaîne vide alors qu'une option de compression était attendue" + +#: ../../common/compression.c:244 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "option de compression inconnue : « %s »" + +#: ../../common/compression.c:283 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "l'option de compression « %s » requiert une valeur" + +#: ../../common/compression.c:292 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "la valeur pour l'option de compression « %s » doit être un entier" + +#: ../../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "la valeur pour l'option de compression « %s » doit être un booléen" + +#: ../../common/compression.c:379 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "l'algorithme de compression « %s » n'accepte pas un niveau de compression" + +#: ../../common/compression.c:386 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "l'algorithme de compression « %s » attend un niveau de compression compris entre %d et %d (par défaut à %d)" + +#: ../../common/compression.c:397 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "l'algorithme de compression « %s » n'accepte pas un nombre de workers" + +#: ../../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "l'algorithme de compression « %s » n'accepte pas un mode distance longue" + +#: ../../common/exec.c:174 #, c-format -msgid "invalid binary \"%s\"" -msgstr "binaire « %s » invalide" +msgid "invalid binary \"%s\": %m" +msgstr "binaire « %s » invalide : %m" -#: ../../common/exec.c:218 +#: ../../common/exec.c:217 #, c-format -msgid "could not read binary \"%s\"" -msgstr "n'a pas pu lire le binaire « %s »" +msgid "could not read binary \"%s\": %m" +msgstr "n'a pas pu lire le binaire « %s » : %m" -#: ../../common/exec.c:226 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "n'a pas pu trouver un « %s » à exécuter" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "n'a pas pu résoudre le chemin « %s » en sa forme absolue : %m" + +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "n'a pas pu exécuter la commande « %s » : %m" + +#: ../../common/exec.c:394 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "n'a pas pu modifier le répertoire par « %s » : %m" +msgid "could not read from command \"%s\": %m" +msgstr "n'a pas pu lire à partir de la commande « %s » : %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:397 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "n'a pas pu lire le lien symbolique « %s » : %m" +msgid "no data was returned by command \"%s\"" +msgstr "aucune donnée n'a été renvoyée par la commande « %s »" -#: ../../common/exec.c:422 parallel.c:1611 +#: ../../common/exec.c:424 parallel.c:1609 #, c-format msgid "%s() failed: %m" msgstr "échec de %s() : %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "mémoire épuisée" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "mémoire épuisée\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" -#: ../../common/wait_error.c:45 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier « %s » : %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "n'a pas pu tester le fichier « %s » : %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "cette construction ne supporte pas la méthode de synchronisation « %s »" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_backup_directory.c:182 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "n'a pas pu lire le répertoire « %s » : %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" + +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "commande non exécutable" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "commande introuvable" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "le processus fils a quitté avec le code de sortie %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "le processus fils a été terminé par l'exception 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "le processus fils a été terminé par le signal %d : %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "le processus fils a quitté avec un statut %d non reconnu" @@ -133,299 +233,421 @@ msgstr "valeur « %s » invalide pour l'option %s" msgid "%s must be in range %d..%d" msgstr "%s doit être compris entre %d et %d" -#: common.c:134 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "méthode de synchronisation non reconnu : %s" + +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "l'argument de la commande shell contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "le nom de la base contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: common.c:135 #, c-format msgid "reading extensions" msgstr "lecture des extensions" -#: common.c:137 +#: common.c:138 #, c-format msgid "identifying extension members" msgstr "identification des membres d'extension" -#: common.c:140 +#: common.c:141 #, c-format msgid "reading schemas" msgstr "lecture des schémas" -#: common.c:149 +#: common.c:150 #, c-format msgid "reading user-defined tables" msgstr "lecture des tables utilisateur" -#: common.c:154 +#: common.c:155 #, c-format msgid "reading user-defined functions" msgstr "lecture des fonctions utilisateur" -#: common.c:158 +#: common.c:159 #, c-format msgid "reading user-defined types" msgstr "lecture des types utilisateur" -#: common.c:162 +#: common.c:163 #, c-format msgid "reading procedural languages" msgstr "lecture des langages procéduraux" -#: common.c:165 +#: common.c:166 #, c-format msgid "reading user-defined aggregate functions" msgstr "lecture des fonctions d'agrégats utilisateur" -#: common.c:168 +#: common.c:169 #, c-format msgid "reading user-defined operators" msgstr "lecture des opérateurs utilisateur" -#: common.c:171 +#: common.c:172 #, c-format msgid "reading user-defined access methods" msgstr "lecture des méthodes d'accès définis par les utilisateurs" -#: common.c:174 +#: common.c:175 #, c-format msgid "reading user-defined operator classes" msgstr "lecture des classes d'opérateurs utilisateur" -#: common.c:177 +#: common.c:178 #, c-format msgid "reading user-defined operator families" msgstr "lecture des familles d'opérateurs utilisateur" -#: common.c:180 +#: common.c:181 #, c-format msgid "reading user-defined text search parsers" msgstr "lecture des analyseurs utilisateur pour la recherche plein texte" -#: common.c:183 +#: common.c:184 #, c-format msgid "reading user-defined text search templates" msgstr "lecture des modèles utilisateur pour la recherche plein texte" -#: common.c:186 +#: common.c:187 #, c-format msgid "reading user-defined text search dictionaries" msgstr "lecture des dictionnaires utilisateur pour la recherche plein texte" -#: common.c:189 +#: common.c:190 #, c-format msgid "reading user-defined text search configurations" msgstr "lecture des configurations utilisateur pour la recherche plein texte" -#: common.c:192 +#: common.c:193 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "lecture des wrappers de données distantes utilisateur" -#: common.c:195 +#: common.c:196 #, c-format msgid "reading user-defined foreign servers" msgstr "lecture des serveurs distants utilisateur" -#: common.c:198 +#: common.c:199 #, c-format msgid "reading default privileges" msgstr "lecture des droits par défaut" -#: common.c:201 +#: common.c:202 #, c-format msgid "reading user-defined collations" msgstr "lecture des collationnements utilisateurs" -#: common.c:204 +#: common.c:205 #, c-format msgid "reading user-defined conversions" msgstr "lecture des conversions utilisateur" -#: common.c:207 +#: common.c:208 #, c-format msgid "reading type casts" msgstr "lecture des conversions de type" -#: common.c:210 +#: common.c:211 #, c-format msgid "reading transforms" msgstr "lecture des transformations" -#: common.c:213 +#: common.c:214 #, c-format msgid "reading table inheritance information" msgstr "lecture des informations d'héritage des tables" -#: common.c:216 +#: common.c:217 #, c-format msgid "reading event triggers" msgstr "lecture des triggers sur évènement" -#: common.c:220 +#: common.c:221 #, c-format msgid "finding extension tables" msgstr "recherche des tables d'extension" -#: common.c:224 +#: common.c:225 #, c-format msgid "finding inheritance relationships" msgstr "recherche des relations d'héritage" -#: common.c:227 +#: common.c:228 #, c-format msgid "reading column info for interesting tables" msgstr "lecture des informations de colonnes des tables intéressantes" -#: common.c:230 +#: common.c:231 #, c-format msgid "flagging inherited columns in subtables" msgstr "marquage des colonnes héritées dans les sous-tables" -#: common.c:233 +#: common.c:234 +#, c-format +msgid "reading partitioning data" +msgstr "lecture des données de partitionnement" + +#: common.c:237 #, c-format msgid "reading indexes" msgstr "lecture des index" -#: common.c:236 +#: common.c:240 #, c-format msgid "flagging indexes in partitioned tables" msgstr "décrit les index des tables partitionnées" -#: common.c:239 +#: common.c:243 #, c-format msgid "reading extended statistics" msgstr "lecture des statistiques étendues" -#: common.c:242 +#: common.c:246 #, c-format msgid "reading constraints" msgstr "lecture des contraintes" -#: common.c:245 +#: common.c:249 #, c-format msgid "reading triggers" msgstr "lecture des triggers" -#: common.c:248 +#: common.c:252 #, c-format msgid "reading rewrite rules" msgstr "lecture des règles de réécriture" -#: common.c:251 +#: common.c:255 #, c-format msgid "reading policies" msgstr "lecture des politiques" -#: common.c:254 +#: common.c:258 #, c-format msgid "reading publications" msgstr "lecture des publications" -#: common.c:257 +#: common.c:261 #, c-format msgid "reading publication membership of tables" msgstr "lecture des appartenances aux publications des tables" -#: common.c:260 +#: common.c:264 #, c-format msgid "reading publication membership of schemas" msgstr "lecture des appartenances aux publications des schémas" -#: common.c:263 +#: common.c:267 #, c-format msgid "reading subscriptions" msgstr "lecture des souscriptions" -#: common.c:343 +#: common.c:270 #, c-format -msgid "invalid number of parents %d for table \"%s\"" -msgstr "nombre de parents invalide (%d) pour la table « %s »" +msgid "reading subscription membership of tables" +msgstr "lecture des appartenances aux souscriptions des tables" -#: common.c:1004 +#: common.c:333 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "vérification échouée, OID %u parent de la table « %s » (OID %u) introuvable" -#: common.c:1043 +#: common.c:375 +#, c-format +msgid "invalid number of parents %d for table \"%s\"" +msgstr "nombre de parents invalide (%d) pour la table « %s »" + +#: common.c:1098 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "n'a pas pu analyser le tableau numérique « %s » : trop de nombres" -#: common.c:1055 +#: common.c:1110 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "n'a pas pu analyser le tableau numérique « %s » : caractère invalide dans le nombre" -#: compress_io.c:111 -#, c-format -msgid "invalid compression code: %d" -msgstr "code de compression invalide : %d" - -#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504 -#: compress_io.c:547 -#, c-format -msgid "not built with zlib support" -msgstr "pas construit avec le support de zlib" - -#: compress_io.c:236 compress_io.c:333 +#: compress_gzip.c:69 compress_gzip.c:183 #, c-format msgid "could not initialize compression library: %s" msgstr "n'a pas pu initialiser la bibliothèque de compression : %s" -#: compress_io.c:256 +#: compress_gzip.c:93 #, c-format msgid "could not close compression stream: %s" msgstr "n'a pas pu fermer le flux de compression : %s" -#: compress_io.c:273 +#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109 #, c-format msgid "could not compress data: %s" msgstr "n'a pas pu compresser les données : %s" -#: compress_io.c:349 compress_io.c:364 +#: compress_gzip.c:199 compress_gzip.c:214 #, c-format msgid "could not uncompress data: %s" msgstr "n'a pas pu décompresser les données : %s" -#: compress_io.c:371 +#: compress_gzip.c:221 #, c-format msgid "could not close compression library: %s" msgstr "n'a pas pu fermer la bibliothèque de compression : %s" -#: compress_io.c:584 compress_io.c:621 +#: compress_gzip.c:266 compress_lz4.c:608 compress_lz4.c:628 compress_lz4.c:647 #, c-format msgid "could not read from input file: %s" msgstr "n'a pas pu lire à partir du fichier en entrée : %s" -#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553 -#: pg_backup_tar.c:726 pg_backup_tar.c:749 +#: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 +#: compress_zstd.c:374 pg_backup_custom.c:651 +#, c-format +msgid "could not read from input file: %m" +msgstr "n'a pas pu lire à partir du fichier en entrée : %m" + +#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:141 +#: compress_zstd.c:372 pg_backup_custom.c:649 pg_backup_directory.c:565 +#: pg_backup_tar.c:740 pg_backup_tar.c:763 #, c-format msgid "could not read from input file: end of file" msgstr "n'a pas pu lire à partir du fichier en entrée : fin du fichier" -#: parallel.c:253 +#: compress_lz4.c:157 +#, c-format +msgid "could not create LZ4 decompression context: %s" +msgstr "n'a pas pu créer le contexte de décompression LZ4 : %s" + +#: compress_lz4.c:180 +#, c-format +msgid "could not decompress: %s" +msgstr "n'a pas pu décompresser : %s" + +#: compress_lz4.c:193 +#, c-format +msgid "could not free LZ4 decompression context: %s" +msgstr "n'a pas pu libérer le contexte de décompression LZ4 : %s" + +#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690 +#, c-format +msgid "could not end compression: %s" +msgstr "n'a pas pu terminer la compression : %s" + +#: compress_lz4.c:301 +#, c-format +msgid "could not initialize LZ4 compression: %s" +msgstr "n'a pas pu initialiser la bibliothèque de compression LZ4 : %s" + +#: compress_lz4.c:697 +#, c-format +msgid "could not end decompression: %s" +msgstr "n'a pas pu terminer la décompression : %s" + +#: compress_zstd.c:66 +#, c-format +msgid "could not set compression parameter \"%s\": %s" +msgstr "n'a pas pu configurer le paramètre de compression « %s » : %s" + +#: compress_zstd.c:78 compress_zstd.c:232 compress_zstd.c:491 +#: compress_zstd.c:499 +#, c-format +msgid "could not initialize compression library" +msgstr "n'a pas pu initialiser la bibliothèque de compression" + +#: compress_zstd.c:195 compress_zstd.c:309 +#, c-format +msgid "could not decompress data: %s" +msgstr "n'a pas pu décompresser les données : %s" + +#: compress_zstd.c:502 +#, c-format +msgid "unhandled mode \"%s\"" +msgstr "mode « %s » non géré" + +#: filter.c:49 +#, c-format +msgid "could not open filter file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier filtre « %s » : %m" + +#: filter.c:72 +#, c-format +msgid "could not close filter file \"%s\": %m" +msgstr "n'a pas pu fermer le fichier filtre « %s » : %m" + +#: filter.c:165 +#, c-format +msgid "invalid format in filter read from standard input on line %d: %s" +msgstr "format invalide dans la lecture du filtre à partir de l'entrée standard sur la ligne %d : %s" + +#: filter.c:168 +#, c-format +msgid "invalid format in filter read from file \"%s\" on line %d: %s" +msgstr "format invalide dans le filtre lu du fichier « %s » sur la ligne %d : %s" + +#: filter.c:241 filter.c:468 +#, c-format +msgid "could not read from filter file \"%s\": %m" +msgstr "n'a pas pu lire à partir du fichier filtre « %s » : %m" + +#: filter.c:244 +msgid "unexpected end of file" +msgstr "fin de fichier inattendu" + +#: filter.c:311 +msgid "missing object name pattern" +msgstr "motif de nom d'objet manquant" + +#: filter.c:422 +msgid "no filter command found (expected \"include\" or \"exclude\")" +msgstr "aucune commande de filtre (attendait « include » ou « exclude »)" + +#: filter.c:433 +msgid "invalid filter command (expected \"include\" or \"exclude\")" +msgstr "commande de filtre invalide (attendait « include » ou « exclude »)" + +#: filter.c:440 +msgid "missing filter object type" +msgstr "type d'objet filtre manquant" + +#: filter.c:447 +#, c-format +msgid "unsupported filter object type: \"%.*s\"" +msgstr "type d'objet filtre non supporté : « %.*s »" + +#: parallel.c:251 #, c-format msgid "%s() failed: error code %d" msgstr "échec de %s() : code d'erreur %d" -#: parallel.c:961 +#: parallel.c:959 #, c-format msgid "could not create communication channels: %m" msgstr "n'a pas pu créer le canal de communication : %m" -#: parallel.c:1018 +#: parallel.c:1016 #, c-format msgid "could not create worker process: %m" msgstr "n'a pas pu créer le processus worker : %m" -#: parallel.c:1148 +#: parallel.c:1146 #, c-format msgid "unrecognized command received from leader: \"%s\"" msgstr "commande non reconnue reçue du leader : « %s »" -#: parallel.c:1191 parallel.c:1429 +#: parallel.c:1189 parallel.c:1427 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "message invalide reçu du worker: « %s »" -#: parallel.c:1323 +#: parallel.c:1321 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -434,501 +656,511 @@ msgstr "" "impossible d'obtenir un verrou sur la relation « %s »\n" "Cela signifie en général que quelqu'un a demandé un verrou ACCESS EXCLUSIVE sur la table après que pg_dump ait obtenu son verrou ACCESS SHARE initial sur la table." -#: parallel.c:1412 +#: parallel.c:1410 #, c-format msgid "a worker process died unexpectedly" msgstr "un processus worker a subi un arrêt brutal inattendu" -#: parallel.c:1534 parallel.c:1652 +#: parallel.c:1532 parallel.c:1650 #, c-format msgid "could not write to the communication channel: %m" msgstr "n'a pas pu écrire dans le canal de communication: %m" -#: parallel.c:1736 +#: parallel.c:1734 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: n'a pas pu créer le socket: code d'erreur %d" -#: parallel.c:1747 +#: parallel.c:1745 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: n'a pas pu se lier: code d'erreur %d" -#: parallel.c:1754 +#: parallel.c:1752 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe : n'a pas pu se mettre en écoute: code d'erreur %d" -#: parallel.c:1761 +#: parallel.c:1759 #, c-format msgid "pgpipe: %s() failed: error code %d" msgstr "pgpipe: échec de %s() : code d'erreur %d" -#: parallel.c:1772 +#: parallel.c:1770 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: n'a pas pu créer un deuxième socket: code d'erreur %d" -#: parallel.c:1781 +#: parallel.c:1779 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: n'a pas pu se connecter au socket: code d'erreur %d" -#: parallel.c:1790 +#: parallel.c:1788 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: n'a pas pu accepter de connexion: code d'erreur %d" -#: pg_backup_archiver.c:279 pg_backup_archiver.c:1576 +#: pg_backup_archiver.c:261 pg_backup_archiver.c:1706 #, c-format msgid "could not close output file: %m" msgstr "n'a pas pu fermer le fichier en sortie : %m" -#: pg_backup_archiver.c:323 pg_backup_archiver.c:327 +#: pg_backup_archiver.c:305 pg_backup_archiver.c:309 #, c-format msgid "archive items not in correct section order" msgstr "les éléments de l'archive ne sont pas dans l'ordre correct de la section" -#: pg_backup_archiver.c:333 +#: pg_backup_archiver.c:315 #, c-format msgid "unexpected section code %d" msgstr "code de section inattendu %d" -#: pg_backup_archiver.c:370 +#: pg_backup_archiver.c:352 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "la restauration parallélisée n'est pas supportée avec ce format de fichier d'archive" -#: pg_backup_archiver.c:374 +#: pg_backup_archiver.c:356 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "la restauration parallélisée n'est pas supportée avec les archives réalisées par un pg_dump antérieur à la 8.0" -#: pg_backup_archiver.c:392 +#: pg_backup_archiver.c:377 #, c-format -msgid "cannot restore from compressed archive (compression not supported in this installation)" -msgstr "ne peut pas restaurer à partir de l'archive compressée (compression indisponible dans cette installation)" +msgid "cannot restore from compressed archive (%s)" +msgstr "ne peut pas restaurer l'archive compressée (%s)" -#: pg_backup_archiver.c:409 +#: pg_backup_archiver.c:397 #, c-format msgid "connecting to database for restore" msgstr "connexion à la base de données pour la restauration" -#: pg_backup_archiver.c:411 +#: pg_backup_archiver.c:399 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "les connexions directes à la base de données ne sont pas supportées dans les archives pre-1.3" -#: pg_backup_archiver.c:454 +#: pg_backup_archiver.c:442 #, c-format msgid "implied data-only restore" msgstr "a impliqué une restauration des données uniquement" -#: pg_backup_archiver.c:520 +#: pg_backup_archiver.c:510 #, c-format msgid "dropping %s %s" msgstr "suppression de %s %s" -#: pg_backup_archiver.c:615 +#: pg_backup_archiver.c:642 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "n'a pas pu trouver où insérer IF EXISTS dans l'instruction « %s »" -#: pg_backup_archiver.c:771 pg_backup_archiver.c:773 +#: pg_backup_archiver.c:828 pg_backup_archiver.c:830 #, c-format msgid "warning from original dump file: %s" msgstr "message d'avertissement du fichier de sauvegarde original : %s" -#: pg_backup_archiver.c:788 +#: pg_backup_archiver.c:864 #, c-format msgid "creating %s \"%s.%s\"" msgstr "création de %s « %s.%s »" -#: pg_backup_archiver.c:791 +#: pg_backup_archiver.c:867 #, c-format msgid "creating %s \"%s\"" msgstr "création de %s « %s »" -#: pg_backup_archiver.c:841 +#: pg_backup_archiver.c:917 #, c-format msgid "connecting to new database \"%s\"" msgstr "connexion à la nouvelle base de données « %s »" -#: pg_backup_archiver.c:868 +#: pg_backup_archiver.c:944 #, c-format msgid "processing %s" msgstr "traitement de %s" -#: pg_backup_archiver.c:888 +#: pg_backup_archiver.c:966 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "traitement des données de la table « %s.%s »" -#: pg_backup_archiver.c:947 +#: pg_backup_archiver.c:1036 #, c-format msgid "executing %s %s" msgstr "exécution de %s %s" -#: pg_backup_archiver.c:986 +#: pg_backup_archiver.c:1096 #, c-format msgid "disabling triggers for %s" msgstr "désactivation des triggers pour %s" -#: pg_backup_archiver.c:1012 +#: pg_backup_archiver.c:1122 #, c-format msgid "enabling triggers for %s" msgstr "activation des triggers pour %s" -#: pg_backup_archiver.c:1040 +#: pg_backup_archiver.c:1187 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "erreur interne -- WriteData ne peut pas être appelé en dehors du contexte de la routine DataDumper" -#: pg_backup_archiver.c:1223 +#: pg_backup_archiver.c:1379 #, c-format msgid "large-object output not supported in chosen format" msgstr "la sauvegarde des « Large Objects » n'est pas supportée dans le format choisi" -#: pg_backup_archiver.c:1281 +#: pg_backup_archiver.c:1442 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "restauration de %d « Large Object »" msgstr[1] "restauration de %d « Large Objects »" -#: pg_backup_archiver.c:1302 pg_backup_tar.c:669 +#: pg_backup_archiver.c:1469 pg_backup_tar.c:683 #, c-format msgid "restoring large object with OID %u" msgstr "restauration du « Large Object » d'OID %u" -#: pg_backup_archiver.c:1314 +#: pg_backup_archiver.c:1481 #, c-format msgid "could not create large object %u: %s" msgstr "n'a pas pu créer le « Large Object » %u : %s" -#: pg_backup_archiver.c:1319 pg_dump.c:3538 +#: pg_backup_archiver.c:1486 pg_dump.c:3889 #, c-format msgid "could not open large object %u: %s" msgstr "n'a pas pu ouvrir le « Large Object » %u : %s" -#: pg_backup_archiver.c:1375 +#: pg_backup_archiver.c:1542 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier TOC « %s » : %m" -#: pg_backup_archiver.c:1403 +#: pg_backup_archiver.c:1570 #, c-format msgid "line ignored: %s" msgstr "ligne ignorée : %s" -#: pg_backup_archiver.c:1410 +#: pg_backup_archiver.c:1577 pg_backup_db.c:609 #, c-format msgid "could not find entry for ID %d" msgstr "n'a pas pu trouver l'entrée pour l'ID %d" -#: pg_backup_archiver.c:1433 pg_backup_directory.c:222 -#: pg_backup_directory.c:599 +#: pg_backup_archiver.c:1600 pg_backup_directory.c:219 +#: pg_backup_directory.c:613 #, c-format msgid "could not close TOC file: %m" msgstr "n'a pas pu fermer le fichier TOC : %m" -#: pg_backup_archiver.c:1547 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:586 pg_backup_directory.c:649 -#: pg_backup_directory.c:668 pg_dumpall.c:476 +#: pg_backup_archiver.c:1687 pg_backup_custom.c:152 pg_backup_directory.c:333 +#: pg_backup_directory.c:600 pg_backup_directory.c:666 +#: pg_backup_directory.c:684 pg_dumpall.c:506 #, c-format msgid "could not open output file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier de sauvegarde « %s » : %m" -#: pg_backup_archiver.c:1549 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1689 pg_backup_custom.c:158 #, c-format msgid "could not open output file: %m" msgstr "n'a pas pu ouvrir le fichier de sauvegarde : %m" -#: pg_backup_archiver.c:1643 +#: pg_backup_archiver.c:1772 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" msgstr[0] "a écrit %zu octet de données d'un « Large Object » (résultat = %d)" msgstr[1] "a écrit %zu octets de données d'un « Large Object » (résultat = %d)" -#: pg_backup_archiver.c:1649 +#: pg_backup_archiver.c:1778 #, c-format msgid "could not write to large object: %s" msgstr "n'a pas pu écrire dans le « Large Object » : %s" -#: pg_backup_archiver.c:1739 +#: pg_backup_archiver.c:1868 #, c-format msgid "while INITIALIZING:" msgstr "pendant l'initialisation (« INITIALIZING ») :" -#: pg_backup_archiver.c:1744 +#: pg_backup_archiver.c:1873 #, c-format msgid "while PROCESSING TOC:" msgstr "pendant le traitement de la TOC (« PROCESSING TOC ») :" -#: pg_backup_archiver.c:1749 +#: pg_backup_archiver.c:1878 #, c-format msgid "while FINALIZING:" msgstr "pendant la finalisation (« FINALIZING ») :" -#: pg_backup_archiver.c:1754 +#: pg_backup_archiver.c:1883 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "de l'entrée TOC %d ; %u %u %s %s %s" -#: pg_backup_archiver.c:1830 +#: pg_backup_archiver.c:1959 #, c-format msgid "bad dumpId" msgstr "mauvais dumpId" -#: pg_backup_archiver.c:1851 +#: pg_backup_archiver.c:1980 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "mauvais dumpId de table pour l'élément TABLE DATA" -#: pg_backup_archiver.c:1943 +#: pg_backup_archiver.c:2072 #, c-format msgid "unexpected data offset flag %d" msgstr "drapeau de décalage de données inattendu %d" -#: pg_backup_archiver.c:1956 +#: pg_backup_archiver.c:2085 #, c-format msgid "file offset in dump file is too large" msgstr "le décalage dans le fichier de sauvegarde est trop important" -#: pg_backup_archiver.c:2094 pg_backup_archiver.c:2104 +#: pg_backup_archiver.c:2196 #, c-format msgid "directory name too long: \"%s\"" msgstr "nom du répertoire trop long : « %s »" -#: pg_backup_archiver.c:2112 +#: pg_backup_archiver.c:2246 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "le répertoire « %s » ne semble pas être une archive valide (« toc.dat » n'existe pas)" -#: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807 -#: pg_backup_directory.c:207 pg_backup_directory.c:395 +#: pg_backup_archiver.c:2254 pg_backup_custom.c:169 pg_backup_custom.c:812 +#: pg_backup_directory.c:204 pg_backup_directory.c:396 #, c-format msgid "could not open input file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier en entrée « %s » : %m" -#: pg_backup_archiver.c:2127 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2261 pg_backup_custom.c:175 #, c-format msgid "could not open input file: %m" msgstr "n'a pas pu ouvrir le fichier en entrée : %m" -#: pg_backup_archiver.c:2133 +#: pg_backup_archiver.c:2267 #, c-format msgid "could not read input file: %m" msgstr "n'a pas pu lire le fichier en entrée : %m" -#: pg_backup_archiver.c:2135 +#: pg_backup_archiver.c:2269 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "le fichier en entrée est trop petit (%lu lus, 5 attendus)" -#: pg_backup_archiver.c:2167 +#: pg_backup_archiver.c:2301 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "Le fichier en entrée semble être une sauvegarde au format texte. Merci d'utiliser psql." -#: pg_backup_archiver.c:2173 +#: pg_backup_archiver.c:2307 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "le fichier en entrée ne semble pas être une archive valide (trop petit ?)" -#: pg_backup_archiver.c:2179 +#: pg_backup_archiver.c:2313 #, c-format msgid "input file does not appear to be a valid archive" msgstr "le fichier en entrée ne semble pas être une archive valide" -#: pg_backup_archiver.c:2188 +#: pg_backup_archiver.c:2322 #, c-format msgid "could not close input file: %m" msgstr "n'a pas pu fermer le fichier en entrée : %m" -#: pg_backup_archiver.c:2305 +#: pg_backup_archiver.c:2401 +#, c-format +msgid "could not open stdout for appending: %m" +msgstr "n'a pas pu ouvrir stdout pour l'ajout : %m" + +#: pg_backup_archiver.c:2446 #, c-format msgid "unrecognized file format \"%d\"" msgstr "format de fichier « %d » non reconnu" -#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4445 +#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4648 #, c-format msgid "finished item %d %s %s" msgstr "élément terminé %d %s %s" -#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4458 +#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4661 #, c-format msgid "worker process failed: exit code %d" msgstr "échec du processus worker : code de sortie %d" -#: pg_backup_archiver.c:2512 +#: pg_backup_archiver.c:2653 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "ID %d de l'entrée en dehors de la plage -- peut-être un TOC corrompu" -#: pg_backup_archiver.c:2592 +#: pg_backup_archiver.c:2736 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "la restauration des tables avec WITH OIDS n'est plus supportée" -#: pg_backup_archiver.c:2674 +#: pg_backup_archiver.c:2818 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "encodage « %s » non reconnu" -#: pg_backup_archiver.c:2679 +#: pg_backup_archiver.c:2824 #, c-format msgid "invalid ENCODING item: %s" msgstr "élément ENCODING invalide : %s" -#: pg_backup_archiver.c:2697 +#: pg_backup_archiver.c:2842 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "élément STDSTRINGS invalide : %s" -#: pg_backup_archiver.c:2722 +#: pg_backup_archiver.c:2867 #, c-format msgid "schema \"%s\" not found" msgstr "schéma « %s » non trouvé" -#: pg_backup_archiver.c:2729 +#: pg_backup_archiver.c:2874 #, c-format msgid "table \"%s\" not found" msgstr "table « %s » non trouvée" -#: pg_backup_archiver.c:2736 +#: pg_backup_archiver.c:2881 #, c-format msgid "index \"%s\" not found" msgstr "index « %s » non trouvé" -#: pg_backup_archiver.c:2743 +#: pg_backup_archiver.c:2888 #, c-format msgid "function \"%s\" not found" msgstr "fonction « %s » non trouvée" -#: pg_backup_archiver.c:2750 +#: pg_backup_archiver.c:2895 #, c-format msgid "trigger \"%s\" not found" msgstr "trigger « %s » non trouvé" -#: pg_backup_archiver.c:3143 +#: pg_backup_archiver.c:3326 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "n'a pas pu initialiser la session utilisateur à « %s »: %s" -#: pg_backup_archiver.c:3280 +#: pg_backup_archiver.c:3458 #, c-format -msgid "could not set search_path to \"%s\": %s" -msgstr "n'a pas pu configurer search_path à « %s » : %s" +msgid "could not set \"search_path\" to \"%s\": %s" +msgstr "n'a pas pu configurer « search_path » à « %s » : %s" -#: pg_backup_archiver.c:3342 +#: pg_backup_archiver.c:3519 #, c-format -msgid "could not set default_tablespace to %s: %s" -msgstr "n'a pas pu configurer default_tablespace à %s : %s" +msgid "could not set \"default_tablespace\" to %s: %s" +msgstr "n'a pas pu configurer « default_tablespace » à %s : %s" -#: pg_backup_archiver.c:3392 +#: pg_backup_archiver.c:3568 #, c-format -msgid "could not set default_table_access_method: %s" -msgstr "n'a pas pu configurer la méthode default_table_access_method à %s" +msgid "could not set \"default_table_access_method\": %s" +msgstr "n'a pas pu configurer la méthode « default_table_access_method » : %s" -#: pg_backup_archiver.c:3486 pg_backup_archiver.c:3651 +#: pg_backup_archiver.c:3617 +#, c-format +msgid "could not alter table access method: %s" +msgstr "n'a pas pu modifier la méthode d'accès aux tables : %s" + +#: pg_backup_archiver.c:3718 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "ne sait pas comment initialiser le propriétaire du type d'objet « %s »" -#: pg_backup_archiver.c:3754 +#: pg_backup_archiver.c:4005 #, c-format msgid "did not find magic string in file header" msgstr "n'a pas trouver la chaîne magique dans le fichier d'en-tête" -#: pg_backup_archiver.c:3768 +#: pg_backup_archiver.c:4019 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "version non supportée (%d.%d) dans le fichier d'en-tête" -#: pg_backup_archiver.c:3773 +#: pg_backup_archiver.c:4024 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "échec de la vérification sur la taille de l'entier (%lu)" -#: pg_backup_archiver.c:3777 +#: pg_backup_archiver.c:4028 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "l'archive a été créée sur une machine disposant d'entiers plus larges, certaines opérations peuvent échouer" -#: pg_backup_archiver.c:3787 +#: pg_backup_archiver.c:4038 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "le format attendu (%d) diffère du format du fichier (%d)" -#: pg_backup_archiver.c:3802 +#: pg_backup_archiver.c:4060 #, c-format -msgid "archive is compressed, but this installation does not support compression -- no data will be available" -msgstr "l'archive est compressée mais cette installation ne supporte pas la compression -- aucune donnée ne sera disponible" +msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available" +msgstr "l'archive est compressée mais cette installation ne supporte pas la compression (%s) -- aucune donnée ne sera disponible" -#: pg_backup_archiver.c:3836 +#: pg_backup_archiver.c:4096 #, c-format msgid "invalid creation date in header" msgstr "date de création invalide dans l'en-tête" -#: pg_backup_archiver.c:3970 +#: pg_backup_archiver.c:4230 #, c-format msgid "processing item %d %s %s" msgstr "traitement de l'élément %d %s %s" -#: pg_backup_archiver.c:4049 +#: pg_backup_archiver.c:4315 #, c-format msgid "entering main parallel loop" msgstr "entrée dans la boucle parallèle principale" -#: pg_backup_archiver.c:4060 +#: pg_backup_archiver.c:4326 #, c-format msgid "skipping item %d %s %s" msgstr "omission de l'élément %d %s %s" -#: pg_backup_archiver.c:4069 +#: pg_backup_archiver.c:4335 #, c-format msgid "launching item %d %s %s" msgstr "lancement de l'élément %d %s %s" -#: pg_backup_archiver.c:4123 +#: pg_backup_archiver.c:4389 #, c-format msgid "finished main parallel loop" msgstr "fin de la boucle parallèle principale" -#: pg_backup_archiver.c:4159 +#: pg_backup_archiver.c:4425 #, c-format msgid "processing missed item %d %s %s" msgstr "traitement de l'élément manquant %d %s %s" -#: pg_backup_archiver.c:4764 +#: pg_backup_archiver.c:4967 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "la table « %s » n'a pas pu être créée, ses données ne seront pas restaurées" -#: pg_backup_custom.c:376 pg_backup_null.c:147 +#: pg_backup_custom.c:376 pg_backup_null.c:143 #, c-format msgid "invalid OID for large object" msgstr "OID invalide pour le « Large Object »" -#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629 -#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021 +#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:636 +#: pg_backup_custom.c:870 pg_backup_tar.c:1029 pg_backup_tar.c:1034 #, c-format msgid "error during file seek: %m" msgstr "erreur lors de la recherche dans le fichier : %m" -#: pg_backup_custom.c:478 +#: pg_backup_custom.c:480 #, c-format msgid "data block %d has wrong seek position" msgstr "le bloc de données %d a une mauvaise position de recherche" -#: pg_backup_custom.c:495 +#: pg_backup_custom.c:497 #, c-format msgid "unrecognized data block type (%d) while searching archive" msgstr "type de bloc de données non reconnu (%d) lors de la recherche dans l'archive" -#: pg_backup_custom.c:517 +#: pg_backup_custom.c:519 #, c-format msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file" msgstr "" @@ -937,58 +1169,53 @@ msgstr "" "différent, ce qui ne peut pas être géré à cause d'un fichier non gérable en\n" "recherche" -#: pg_backup_custom.c:522 +#: pg_backup_custom.c:524 #, c-format msgid "could not find block ID %d in archive -- possibly corrupt archive" msgstr "n'a pas pu trouver l'identifiant de bloc %d dans l'archive -- possible corruption de l'archive" -#: pg_backup_custom.c:529 +#: pg_backup_custom.c:531 #, c-format msgid "found unexpected block ID (%d) when reading data -- expected %d" msgstr "ID de bloc inattendu (%d) lors de la lecture des données -- %d attendu" -#: pg_backup_custom.c:543 +#: pg_backup_custom.c:545 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "type de bloc de données %d non reconnu lors de la restauration de l'archive" -#: pg_backup_custom.c:645 -#, c-format -msgid "could not read from input file: %m" -msgstr "n'a pas pu lire à partir du fichier en entrée : %m" - -#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943 -#: pg_backup_tar.c:1019 +#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:945 +#: pg_backup_tar.c:1032 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "n'a pas pu déterminer la position de recherche dans le fichier d'archive : %m" -#: pg_backup_custom.c:762 pg_backup_custom.c:802 +#: pg_backup_custom.c:767 pg_backup_custom.c:807 #, c-format msgid "could not close archive file: %m" msgstr "n'a pas pu fermer le fichier d'archive : %m" -#: pg_backup_custom.c:785 +#: pg_backup_custom.c:790 #, c-format msgid "can only reopen input archives" msgstr "peut seulement rouvrir l'archive en entrée" -#: pg_backup_custom.c:792 +#: pg_backup_custom.c:797 #, c-format msgid "parallel restore from standard input is not supported" msgstr "la restauration parallélisée n'est pas supportée à partir de stdin" -#: pg_backup_custom.c:794 +#: pg_backup_custom.c:799 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "la restauration parallélisée n'est pas supportée à partir de fichiers sans table de matière" -#: pg_backup_custom.c:810 +#: pg_backup_custom.c:815 #, c-format msgid "could not set seek position in archive file: %m" msgstr "n'a pas pu initialiser la recherche de position dans le fichier d'archive : %m" -#: pg_backup_custom.c:889 +#: pg_backup_custom.c:894 #, c-format msgid "compressor active" msgstr "compression activée" @@ -998,12 +1225,12 @@ msgstr "compression activée" msgid "could not get server_version from libpq" msgstr "n'a pas pu obtenir server_version de libpq" -#: pg_backup_db.c:53 pg_dumpall.c:1646 +#: pg_backup_db.c:53 pg_dumpall.c:1879 #, c-format msgid "aborting because of server version mismatch" msgstr "annulation à cause de la différence des versions" -#: pg_backup_db.c:54 pg_dumpall.c:1647 +#: pg_backup_db.c:54 pg_dumpall.c:1880 #, c-format msgid "server version: %s; %s version: %s" msgstr "version du serveur : %s ; %s version : %s" @@ -1013,7 +1240,7 @@ msgstr "version du serveur : %s ; %s version : %s" msgid "already connected to a database" msgstr "déjà connecté à une base de données" -#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1726 pg_dumpall.c:1828 msgid "Password: " msgstr "Mot de passe : " @@ -1027,220 +1254,216 @@ msgstr "n'a pas pu se connecter à la base de données" msgid "reconnection failed: %s" msgstr "échec de la reconnexion : %s" -#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:788 pg_dump_sort.c:1213 +#: pg_dump_sort.c:1233 pg_dumpall.c:1753 pg_dumpall.c:1837 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732 +#: pg_backup_db.c:271 pg_dumpall.c:1942 pg_dumpall.c:1965 #, c-format msgid "query failed: %s" msgstr "échec de la requête : %s" -#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733 +#: pg_backup_db.c:273 pg_dumpall.c:1943 pg_dumpall.c:1966 #, c-format msgid "Query was: %s" msgstr "La requête était : %s" -#: pg_backup_db.c:316 +#: pg_backup_db.c:315 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" msgstr[0] "la requête a renvoyé %d ligne au lieu d'une seule : %s" msgstr[1] "la requête a renvoyé %d lignes au lieu d'une seule : %s" -#: pg_backup_db.c:352 +#: pg_backup_db.c:351 #, c-format msgid "%s: %sCommand was: %s" msgstr "%s: %sLa commande était : %s" -#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489 +#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488 msgid "could not execute query" msgstr "n'a pas pu exécuter la requête" -#: pg_backup_db.c:461 +#: pg_backup_db.c:460 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "erreur renvoyée par PQputCopyData : %s" -#: pg_backup_db.c:510 +#: pg_backup_db.c:509 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "erreur renvoyée par PQputCopyEnd : %s" -#: pg_backup_db.c:516 +#: pg_backup_db.c:515 #, c-format msgid "COPY failed for table \"%s\": %s" msgstr "COPY échoué pour la table « %s » : %s" -#: pg_backup_db.c:522 pg_dump.c:2105 +#: pg_backup_db.c:521 pg_dump.c:2284 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "résultats supplémentaires non attendus durant l'exécution de COPY sur la table « %s »" -#: pg_backup_db.c:534 +#: pg_backup_db.c:533 msgid "could not start database transaction" msgstr "n'a pas pu démarrer la transaction de la base de données" -#: pg_backup_db.c:542 +#: pg_backup_db.c:541 msgid "could not commit database transaction" msgstr "n'a pas pu valider la transaction de la base de données" -#: pg_backup_directory.c:156 +#: pg_backup_directory.c:153 #, c-format msgid "no output directory specified" msgstr "aucun répertoire cible indiqué" -#: pg_backup_directory.c:185 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "n'a pas pu lire le répertoire « %s » : %m" - -#: pg_backup_directory.c:189 +#: pg_backup_directory.c:186 #, c-format msgid "could not close directory \"%s\": %m" msgstr "n'a pas pu fermer le répertoire « %s » : %m" -#: pg_backup_directory.c:195 +#: pg_backup_directory.c:192 #, c-format msgid "could not create directory \"%s\": %m" msgstr "n'a pas pu créer le répertoire « %s » : %m" -#: pg_backup_directory.c:355 pg_backup_directory.c:497 -#: pg_backup_directory.c:533 +#: pg_backup_directory.c:357 pg_backup_directory.c:506 +#: pg_backup_directory.c:544 #, c-format msgid "could not write to output file: %s" msgstr "n'a pas pu écrire dans le fichier en sortie : %s" -#: pg_backup_directory.c:373 +#: pg_backup_directory.c:375 #, c-format msgid "could not close data file: %m" msgstr "n'a pas pu fermer le fichier de données : %m" -#: pg_backup_directory.c:407 +#: pg_backup_directory.c:408 #, c-format msgid "could not close data file \"%s\": %m" msgstr "n'a pas pu fermer le fichier de données « %s » : %m" -#: pg_backup_directory.c:447 +#: pg_backup_directory.c:455 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "n'a pas pu ouvrir le fichier TOC « %s » du Large Object en entrée : %m" -#: pg_backup_directory.c:458 +#: pg_backup_directory.c:466 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "ligne invalide dans le fichier TOC du Large Object « %s » : « %s »" -#: pg_backup_directory.c:467 +#: pg_backup_directory.c:475 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "erreur lors de la lecture du TOC du fichier Large Object « %s »" -#: pg_backup_directory.c:471 +#: pg_backup_directory.c:479 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "n'a pas pu fermer le TOC du Large Object « %s » : %m" -#: pg_backup_directory.c:685 +#: pg_backup_directory.c:702 #, c-format -msgid "could not close blob data file: %m" -msgstr "n'a pas pu fermer le fichier de données blob : %m" +msgid "could not close LO data file: %m" +msgstr "n'a pas pu fermer le fichier de données LO : %m" -#: pg_backup_directory.c:691 +#: pg_backup_directory.c:712 #, c-format -msgid "could not write to blobs TOC file" -msgstr "n'a pas pu écrire dans le fichier TOC des Large Objects" +msgid "could not write to LOs TOC file: %s" +msgstr "n'a pas pu écrire dans le fichier TOC des Large Objects : %s" -#: pg_backup_directory.c:705 +#: pg_backup_directory.c:728 #, c-format -msgid "could not close blobs TOC file: %m" -msgstr "n'a pas pu fermer le fichier TOC des blobs : %m" +msgid "could not close LOs TOC file: %m" +msgstr "n'a pas pu fermer le fichier TOC des Large Objects : %m" -#: pg_backup_directory.c:724 +#: pg_backup_directory.c:747 #, c-format msgid "file name too long: \"%s\"" msgstr "nom du fichier trop long : « %s »" -#: pg_backup_null.c:74 +#: pg_backup_null.c:70 #, c-format msgid "this format cannot be read" msgstr "ce format ne peut pas être lu" -#: pg_backup_tar.c:172 +#: pg_backup_tar.c:168 #, c-format msgid "could not open TOC file \"%s\" for output: %m" msgstr "n'a pas pu ouvrir le fichier TOC « %s » en sortie : %m" -#: pg_backup_tar.c:179 +#: pg_backup_tar.c:175 #, c-format msgid "could not open TOC file for output: %m" msgstr "n'a pas pu ouvrir le fichier TOC en sortie : %m" -#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 -#: pg_backup_tar.c:405 pg_backup_tar.c:893 +#: pg_backup_tar.c:194 pg_backup_tar.c:330 pg_backup_tar.c:385 +#: pg_backup_tar.c:401 pg_backup_tar.c:906 #, c-format msgid "compression is not supported by tar archive format" msgstr "compression non supportée par le format des archives tar" -#: pg_backup_tar.c:206 +#: pg_backup_tar.c:202 #, c-format msgid "could not open TOC file \"%s\" for input: %m" msgstr "n'a pas pu ouvrir le fichier TOC « %s » en entrée : %m" -#: pg_backup_tar.c:213 +#: pg_backup_tar.c:209 #, c-format msgid "could not open TOC file for input: %m" msgstr "n'a pas pu ouvrir le fichier TOC en entrée : %m" -#: pg_backup_tar.c:322 +#: pg_backup_tar.c:318 #, c-format msgid "could not find file \"%s\" in archive" msgstr "n'a pas pu trouver le fichier « %s » dans l'archive" -#: pg_backup_tar.c:382 +#: pg_backup_tar.c:378 #, c-format msgid "could not generate temporary file name: %m" msgstr "impossible de créer le nom du fichier temporaire : %m" -#: pg_backup_tar.c:624 +#: pg_backup_tar.c:619 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "syntaxe inattendue de l'instruction COPY : « %s »" -#: pg_backup_tar.c:890 +#: pg_backup_tar.c:903 #, c-format msgid "invalid OID for large object (%u)" msgstr "OID invalide pour le « Large Object » (%u)" -#: pg_backup_tar.c:1035 +#: pg_backup_tar.c:1048 #, c-format msgid "could not close temporary file: %m" msgstr "n'a pas pu fermer le fichier temporaire : m" -#: pg_backup_tar.c:1038 +#: pg_backup_tar.c:1051 #, c-format msgid "actual file length (%lld) does not match expected (%lld)" msgstr "la longueur réelle du fichier (%lld) ne correspond pas à ce qui était attendu (%lld)" -#: pg_backup_tar.c:1084 pg_backup_tar.c:1115 +#: pg_backup_tar.c:1097 pg_backup_tar.c:1128 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "n'a pas pu trouver l'en-tête du fichier « %s » dans l'archive tar" -#: pg_backup_tar.c:1102 +#: pg_backup_tar.c:1115 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "la restauration désordonnée de données n'est pas supportée avec ce format d'archive : « %s » est requis mais vient avant « %s » dans le fichier d'archive." -#: pg_backup_tar.c:1149 +#: pg_backup_tar.c:1162 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "en-tête incomplet du fichier tar (%lu octet)" msgstr[1] "en-tête incomplet du fichier tar (%lu octets)" -#: pg_backup_tar.c:1188 +#: pg_backup_tar.c:1201 #, c-format msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" msgstr "en-tête tar corrompu trouvé dans %s (%d attendu, %d calculé ) à la position %llu du fichier" @@ -1250,10 +1473,10 @@ msgstr "en-tête tar corrompu trouvé dans %s (%d attendu, %d calculé ) à la p msgid "unrecognized section name: \"%s\"" msgstr "nom de section non reconnu : « %s »" -#: pg_backup_utils.c:55 pg_dump.c:627 pg_dump.c:644 pg_dumpall.c:340 -#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373 -#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307 -#: pg_restore.c:321 +#: pg_backup_utils.c:55 pg_dump.c:694 pg_dump.c:711 pg_dumpall.c:370 +#: pg_dumpall.c:380 pg_dumpall.c:388 pg_dumpall.c:396 pg_dumpall.c:403 +#: pg_dumpall.c:413 pg_dumpall.c:488 pg_restore.c:307 pg_restore.c:323 +#: pg_restore.c:337 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." @@ -1263,72 +1486,82 @@ msgstr "Essayez « %s --help » pour plus d'informations." msgid "out of on_exit_nicely slots" msgstr "plus d'emplacements on_exit_nicely" -#: pg_dump.c:642 pg_dumpall.c:348 pg_restore.c:305 +#: pg_dump.c:709 pg_dumpall.c:378 pg_restore.c:321 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_dump.c:661 pg_restore.c:328 +#: pg_dump.c:728 pg_restore.c:344 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "les options « -s/--schema-only » et « -a/--data-only » ne peuvent pas être utilisées ensemble" -#: pg_dump.c:664 +#: pg_dump.c:731 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "les options « -s/--schema-only » et « --include-foreign-data » ne peuvent pas être utilisées ensemble" -#: pg_dump.c:667 +#: pg_dump.c:734 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "l'option --include-foreign-data n'est pas supportée avec une sauvegarde parallélisée" -#: pg_dump.c:670 pg_restore.c:331 +#: pg_dump.c:737 pg_restore.c:347 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "les options « -c/--clean » et « -a/--data-only » ne peuvent pas être utilisées ensemble" -#: pg_dump.c:673 pg_dumpall.c:378 pg_restore.c:356 +#: pg_dump.c:740 pg_dumpall.c:408 pg_restore.c:375 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "l'option --if-exists nécessite l'option -c/--clean" -#: pg_dump.c:680 +#: pg_dump.c:747 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "l'option --on-conflict-do-nothing requiert l'option --inserts, --rows-per-insert, ou --column-inserts" -#: pg_dump.c:702 +#: pg_dump.c:776 +#, c-format +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "algorithme de compression inconnu : « %s »" + +#: pg_dump.c:783 #, c-format -msgid "requested compression not available in this installation -- archive will be uncompressed" -msgstr "la compression requise n'est pas disponible avec cette installation -- l'archive ne sera pas compressée" +msgid "invalid compression specification: %s" +msgstr "spécification de compression invalide : %s" -#: pg_dump.c:715 +#: pg_dump.c:796 +#, c-format +msgid "compression option \"%s\" is not currently supported by pg_dump" +msgstr "l'option de compression « %s » n'est pas actuellement supportée par pg_dump" + +#: pg_dump.c:808 #, c-format msgid "parallel backup only supported by the directory format" msgstr "la sauvegarde parallélisée n'est supportée qu'avec le format directory" -#: pg_dump.c:761 +#: pg_dump.c:854 #, c-format msgid "last built-in OID is %u" msgstr "le dernier OID interne est %u" -#: pg_dump.c:770 +#: pg_dump.c:863 #, c-format msgid "no matching schemas were found" msgstr "aucun schéma correspondant n'a été trouvé" -#: pg_dump.c:784 +#: pg_dump.c:880 #, c-format msgid "no matching tables were found" msgstr "aucune table correspondante n'a été trouvée" -#: pg_dump.c:806 +#: pg_dump.c:908 #, c-format msgid "no matching extensions were found" msgstr "aucune extension correspondante n'a été trouvée" -#: pg_dump.c:989 +#: pg_dump.c:1092 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1338,17 +1571,17 @@ msgstr "" "formats.\n" "\n" -#: pg_dump.c:990 pg_dumpall.c:605 pg_restore.c:433 +#: pg_dump.c:1093 pg_dumpall.c:636 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_dump.c:991 +#: pg_dump.c:1094 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [BASE]\n" -#: pg_dump.c:993 pg_dumpall.c:608 pg_restore.c:436 +#: pg_dump.c:1096 pg_dumpall.c:639 pg_restore.c:455 #, c-format msgid "" "\n" @@ -1357,12 +1590,12 @@ msgstr "" "\n" "Options générales :\n" -#: pg_dump.c:994 +#: pg_dump.c:1097 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=FICHIER nom du fichier ou du répertoire en sortie\n" -#: pg_dump.c:995 +#: pg_dump.c:1098 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1371,50 +1604,57 @@ msgstr "" " -F, --format=c|d|t|p format du fichier de sortie (personnalisé,\n" " répertoire, tar, texte (par défaut))\n" -#: pg_dump.c:997 +#: pg_dump.c:1100 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr "" " -j, --jobs=NOMBRE utilise ce nombre de jobs en parallèle pour la\n" " sauvegarde\n" -#: pg_dump.c:998 pg_dumpall.c:610 +#: pg_dump.c:1101 pg_dumpall.c:641 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose mode verbeux\n" -#: pg_dump.c:999 pg_dumpall.c:611 +#: pg_dump.c:1102 pg_dumpall.c:642 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: pg_dump.c:1000 +#: pg_dump.c:1103 #, c-format -msgid " -Z, --compress=0-9 compression level for compressed formats\n" +msgid "" +" -Z, --compress=METHOD[:DETAIL]\n" +" compress as specified\n" msgstr "" -" -Z, --compress=0-9 niveau de compression pour les formats\n" -" compressés\n" +" -Z, --compress=METHODE[:DETAIL]\n" +" compresse comme indiqué\n" -#: pg_dump.c:1001 pg_dumpall.c:612 +#: pg_dump.c:1105 pg_dumpall.c:643 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr "" " --lock-wait-timeout=DÉLAI échec après l'attente du DÉLAI pour un verrou de\n" " table\n" -#: pg_dump.c:1002 pg_dumpall.c:639 +#: pg_dump.c:1106 pg_dumpall.c:671 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " --no-sync n'attend pas que les modifications soient\n" " proprement écrites sur disque\n" -#: pg_dump.c:1003 pg_dumpall.c:613 +#: pg_dump.c:1107 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHODE configure la méthode pour synchroniser les fichiers sur disque\n" + +#: pg_dump.c:1108 pg_dumpall.c:644 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_dump.c:1005 pg_dumpall.c:614 +#: pg_dump.c:1110 pg_dumpall.c:645 #, c-format msgid "" "\n" @@ -1423,56 +1663,66 @@ msgstr "" "\n" "Options contrôlant le contenu en sortie :\n" -#: pg_dump.c:1006 pg_dumpall.c:615 +#: pg_dump.c:1111 pg_dumpall.c:646 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only sauvegarde uniquement les données, pas le schéma\n" -#: pg_dump.c:1007 +#: pg_dump.c:1112 +#, c-format +msgid " -b, --large-objects include large objects in dump\n" +msgstr " -b, --large-objects inclut les « Large Objects » dans la sauvegarde\n" + +#: pg_dump.c:1113 #, c-format -msgid " -b, --blobs include large objects in dump\n" -msgstr " -b, --blobs inclut les « Large Objects » dans la sauvegarde\n" +msgid " --blobs (same as --large-objects, deprecated)\n" +msgstr " --blobs (comme --large-objects, obsolète)\n" -#: pg_dump.c:1008 +#: pg_dump.c:1114 #, c-format -msgid " -B, --no-blobs exclude large objects in dump\n" -msgstr " -B, --no-blobs exclut les « Large Objects » de la sauvegarde\n" +msgid " -B, --no-large-objects exclude large objects in dump\n" +msgstr " -B, --no-large-objects exclut les « Large Objects » de la sauvegarde\n" -#: pg_dump.c:1009 pg_restore.c:447 +#: pg_dump.c:1115 +#, c-format +msgid " --no-blobs (same as --no-large-objects, deprecated)\n" +msgstr " --no-blobs (comme --no-large-objects, obsolète)\n" + +#: pg_dump.c:1116 pg_restore.c:466 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr "" " -c, --clean nettoie/supprime les objets de la base de données\n" " avant de les créer\n" -#: pg_dump.c:1010 +#: pg_dump.c:1117 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr "" " -C, --create inclut les commandes de création de la base\n" " dans la sauvegarde\n" -#: pg_dump.c:1011 +#: pg_dump.c:1118 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr " -e, --extension=MOTIF sauvegarde uniquement les extensions indiquées\n" -#: pg_dump.c:1012 pg_dumpall.c:617 +#: pg_dump.c:1119 pg_dumpall.c:648 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=ENCODAGE sauvegarde les données dans l'encodage ENCODAGE\n" -#: pg_dump.c:1013 +#: pg_dump.c:1120 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=MOTIF sauvegarde uniquement les schémas indiqués\n" -#: pg_dump.c:1014 +#: pg_dump.c:1121 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=MOTIF ne sauvegarde pas les schémas indiqués\n" -#: pg_dump.c:1015 +#: pg_dump.c:1122 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1481,50 +1731,50 @@ msgstr "" " -O, --no-owner ne sauvegarde pas les propriétaires des objets\n" " lors de l'utilisation du format texte\n" -#: pg_dump.c:1017 pg_dumpall.c:621 +#: pg_dump.c:1124 pg_dumpall.c:652 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr "" " -s, --schema-only sauvegarde uniquement la structure, pas les\n" " données\n" -#: pg_dump.c:1018 +#: pg_dump.c:1125 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr "" " -S, --superuser=NOM indique le nom du super-utilisateur à utiliser\n" " avec le format texte\n" -#: pg_dump.c:1019 +#: pg_dump.c:1126 #, c-format -msgid " -t, --table=PATTERN dump the specified table(s) only\n" +msgid " -t, --table=PATTERN dump only the specified table(s)\n" msgstr " -t, --table=MOTIF sauvegarde uniquement les tables indiquées\n" -#: pg_dump.c:1020 +#: pg_dump.c:1127 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=MOTIF ne sauvegarde pas les tables indiquées\n" -#: pg_dump.c:1021 pg_dumpall.c:624 +#: pg_dump.c:1128 pg_dumpall.c:655 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges ne sauvegarde pas les droits sur les objets\n" -#: pg_dump.c:1022 pg_dumpall.c:625 +#: pg_dump.c:1129 pg_dumpall.c:656 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr "" " --binary-upgrade à n'utiliser que par les outils de mise à jour\n" " seulement\n" -#: pg_dump.c:1023 pg_dumpall.c:626 +#: pg_dump.c:1130 pg_dumpall.c:657 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr "" " --column-inserts sauvegarde les données avec des commandes INSERT\n" " en précisant les noms des colonnes\n" -#: pg_dump.c:1024 pg_dumpall.c:627 +#: pg_dump.c:1131 pg_dumpall.c:658 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr "" @@ -1532,14 +1782,14 @@ msgstr "" " dans le but de respecter le standard SQL en\n" " matière de guillemets\n" -#: pg_dump.c:1025 pg_dumpall.c:628 pg_restore.c:464 +#: pg_dump.c:1132 pg_dumpall.c:659 pg_restore.c:483 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr "" " --disable-triggers désactive les triggers en mode de restauration\n" " des données seules\n" -#: pg_dump.c:1026 +#: pg_dump.c:1133 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" @@ -1549,26 +1799,60 @@ msgstr "" " sauvegarde uniquement le contenu visible par cet\n" " utilisateur)\n" -#: pg_dump.c:1028 +#: pg_dump.c:1135 +#, c-format +msgid " --exclude-extension=PATTERN do NOT dump the specified extension(s)\n" +msgstr " --exclude-extension=MOTIF ne sauvegarde PAS les extensions indiquées\n" + +#: pg_dump.c:1136 +#, c-format +msgid "" +" --exclude-table-and-children=PATTERN\n" +" do NOT dump the specified table(s), including\n" +" child and partition tables\n" +msgstr "" +" --exclude-table-and-children=MOTIF\n" +" ne sauvegarde PAS les tables indiquées, ceci incluant les tables filles et les partitions\n" + +#: pg_dump.c:1139 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=MOTIF ne sauvegarde pas les tables indiquées\n" -#: pg_dump.c:1029 pg_dumpall.c:630 +#: pg_dump.c:1140 +#, c-format +msgid "" +" --exclude-table-data-and-children=PATTERN\n" +" do NOT dump data for the specified table(s),\n" +" including child and partition tables\n" +msgstr "" +" --exclude-table-data-and-children=MOTIF\n" +" ne sauvegarde PAS les données des tables indiquées, ceci incluant les tables filles et les partitions\n" + +#: pg_dump.c:1143 pg_dumpall.c:661 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr "" " --extra-float-digits=NUM surcharge la configuration par défaut de\n" " extra_float_digits\n" -#: pg_dump.c:1030 pg_dumpall.c:631 pg_restore.c:466 +#: pg_dump.c:1144 +#, c-format +msgid "" +" --filter=FILENAME include or exclude objects and data from dump\n" +" based on expressions in FILENAME\n" +msgstr "" +" --filter=NOMFICHIER inclut ou exclut des objets et des données à partir de la sauvegarde\n" +" basée sur les expressions dans NOMFICHIER\n" + +#: pg_dump.c:1146 pg_dumpall.c:663 pg_restore.c:487 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr "" " --if-exists utilise IF EXISTS lors de la suppression des\n" " objets\n" -#: pg_dump.c:1031 +#: pg_dump.c:1147 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1578,103 +1862,103 @@ msgstr "" " --include-foreign-data=MOTIF inclut les données des tables externes pour les\n" " serveurs distants correspondant au motif MOTIF\n" -#: pg_dump.c:1034 pg_dumpall.c:632 +#: pg_dump.c:1150 pg_dumpall.c:664 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr "" " --inserts sauvegarde les données avec des instructions\n" " INSERT plutôt que COPY\n" -#: pg_dump.c:1035 pg_dumpall.c:633 +#: pg_dump.c:1151 pg_dumpall.c:665 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root charger les partitions via la table racine\n" -#: pg_dump.c:1036 pg_dumpall.c:634 +#: pg_dump.c:1152 pg_dumpall.c:666 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments ne sauvegarde pas les commentaires\n" -#: pg_dump.c:1037 pg_dumpall.c:635 +#: pg_dump.c:1153 pg_dumpall.c:667 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications ne sauvegarde pas les publications\n" -#: pg_dump.c:1038 pg_dumpall.c:637 +#: pg_dump.c:1154 pg_dumpall.c:669 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr "" " --no-security-labels ne sauvegarde pas les affectations de labels de\n" " sécurité\n" -#: pg_dump.c:1039 pg_dumpall.c:638 +#: pg_dump.c:1155 pg_dumpall.c:670 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions ne sauvegarde pas les souscriptions\n" -#: pg_dump.c:1040 pg_dumpall.c:640 +#: pg_dump.c:1156 pg_dumpall.c:672 #, c-format msgid " --no-table-access-method do not dump table access methods\n" msgstr " --no-table-access-method ne sauvegarde pas les méthodes d'accès aux tables\n" -#: pg_dump.c:1041 pg_dumpall.c:641 +#: pg_dump.c:1157 pg_dumpall.c:673 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces ne sauvegarde pas les affectations de tablespaces\n" -#: pg_dump.c:1042 pg_dumpall.c:642 +#: pg_dump.c:1158 pg_dumpall.c:674 #, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" msgstr "" " --no-toast-compression ne sauvegarde pas les méthodes de compression de\n" " TOAST\n" -#: pg_dump.c:1043 pg_dumpall.c:643 +#: pg_dump.c:1159 pg_dumpall.c:675 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr "" " --no-unlogged-table-data ne sauvegarde pas les données des tables non\n" " journalisées\n" -#: pg_dump.c:1044 pg_dumpall.c:644 +#: pg_dump.c:1160 pg_dumpall.c:676 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr "" " --on-conflict-do-nothing ajoute ON CONFLICT DO NOTHING aux commandes\n" " INSERT\n" -#: pg_dump.c:1045 pg_dumpall.c:645 +#: pg_dump.c:1161 pg_dumpall.c:677 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr "" " --quote-all-identifiers met entre guillemets tous les identifiants même\n" " s'il ne s'agit pas de mots clés\n" -#: pg_dump.c:1046 pg_dumpall.c:646 +#: pg_dump.c:1162 pg_dumpall.c:678 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NROWS nombre de lignes par INSERT ; implique --inserts\n" -#: pg_dump.c:1047 +#: pg_dump.c:1163 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr "" " --section=SECTION sauvegarde la section indiquée (pre-data, data\n" " ou post-data)\n" -#: pg_dump.c:1048 +#: pg_dump.c:1164 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr "" " --serializable-deferrable attend jusqu'à ce que la sauvegarde puisse\n" " s'exécuter sans anomalies\n" -#: pg_dump.c:1049 +#: pg_dump.c:1165 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT utilise l'image donnée pour la sauvegarde\n" -#: pg_dump.c:1050 pg_restore.c:476 +#: pg_dump.c:1166 pg_restore.c:497 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" @@ -1683,7 +1967,14 @@ msgstr "" " --strict-names requiert que les motifs des tables et/ou schémas\n" " correspondent à au moins une entité de chaque\n" -#: pg_dump.c:1052 pg_dumpall.c:647 pg_restore.c:478 +#: pg_dump.c:1168 +#, c-format +msgid "" +" --table-and-children=PATTERN dump only the specified table(s), including\n" +" child and partition tables\n" +msgstr " --table-and-children=MODÈLE sauvegarde uniquement les tables indiquées, en incluant les tables filles et les partitions\n" + +#: pg_dump.c:1170 pg_dumpall.c:679 pg_restore.c:500 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1695,7 +1986,7 @@ msgstr "" " au lieu des commandes ALTER OWNER pour modifier\n" " les propriétaires\n" -#: pg_dump.c:1056 pg_dumpall.c:651 pg_restore.c:482 +#: pg_dump.c:1174 pg_dumpall.c:683 pg_restore.c:504 #, c-format msgid "" "\n" @@ -1704,46 +1995,46 @@ msgstr "" "\n" "Options de connexion :\n" -#: pg_dump.c:1057 +#: pg_dump.c:1175 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=BASE base de données à sauvegarder\n" -#: pg_dump.c:1058 pg_dumpall.c:653 pg_restore.c:483 +#: pg_dump.c:1176 pg_dumpall.c:685 pg_restore.c:505 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HÔTE hôte du serveur de bases de données ou\n" " répertoire des sockets\n" -#: pg_dump.c:1059 pg_dumpall.c:655 pg_restore.c:484 +#: pg_dump.c:1177 pg_dumpall.c:687 pg_restore.c:506 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT numéro de port du serveur de bases de données\n" -#: pg_dump.c:1060 pg_dumpall.c:656 pg_restore.c:485 +#: pg_dump.c:1178 pg_dumpall.c:688 pg_restore.c:507 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NOM se connecter avec cet utilisateur\n" -#: pg_dump.c:1061 pg_dumpall.c:657 pg_restore.c:486 +#: pg_dump.c:1179 pg_dumpall.c:689 pg_restore.c:508 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ne demande jamais un mot de passe\n" -#: pg_dump.c:1062 pg_dumpall.c:658 pg_restore.c:487 +#: pg_dump.c:1180 pg_dumpall.c:690 pg_restore.c:509 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" " -W, --password force la demande du mot de passe (devrait\n" " survenir automatiquement)\n" -#: pg_dump.c:1063 pg_dumpall.c:659 +#: pg_dump.c:1181 pg_dumpall.c:691 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=NOMROLE exécute SET ROLE avant la sauvegarde\n" -#: pg_dump.c:1065 +#: pg_dump.c:1183 #, c-format msgid "" "\n" @@ -1756,525 +2047,537 @@ msgstr "" "d'environnement PGDATABASE est alors utilisée.\n" "\n" -#: pg_dump.c:1067 pg_dumpall.c:663 pg_restore.c:494 +#: pg_dump.c:1185 pg_dumpall.c:695 pg_restore.c:516 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapporter les bogues à <%s>.\n" -#: pg_dump.c:1068 pg_dumpall.c:664 pg_restore.c:495 +#: pg_dump.c:1186 pg_dumpall.c:696 pg_restore.c:517 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" -#: pg_dump.c:1087 pg_dumpall.c:488 +#: pg_dump.c:1205 pg_dumpall.c:518 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "encodage client indiqué (« %s ») invalide" -#: pg_dump.c:1225 +#: pg_dump.c:1353 #, c-format msgid "parallel dumps from standby servers are not supported by this server version" msgstr "les sauvegardes parallélisées sur un serveur standby ne sont pas supportées par cette version du serveur" -#: pg_dump.c:1290 +#: pg_dump.c:1418 #, c-format msgid "invalid output format \"%s\" specified" msgstr "format de sortie « %s » invalide" -#: pg_dump.c:1331 pg_dump.c:1387 pg_dump.c:1440 pg_dumpall.c:1282 +#: pg_dump.c:1459 pg_dump.c:1515 pg_dump.c:1568 pg_dumpall.c:1516 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s" -#: pg_dump.c:1339 +#: pg_dump.c:1467 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "aucun schéma correspondant n'a été trouvé avec le motif « %s »" -#: pg_dump.c:1392 +#: pg_dump.c:1520 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "aucune extension correspondante n'a été trouvée avec le motif « %s »" -#: pg_dump.c:1445 +#: pg_dump.c:1573 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "aucun serveur distant correspondant n'a été trouvé avec le motif « %s »" -#: pg_dump.c:1508 +#: pg_dump.c:1644 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "nom de relation incorrecte (trop de points entre les noms) : %s" -#: pg_dump.c:1519 +#: pg_dump.c:1666 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "aucune table correspondante n'a été trouvée avec le motif « %s »" -#: pg_dump.c:1546 +#: pg_dump.c:1693 #, c-format msgid "You are currently not connected to a database." msgstr "Vous n'êtes pas connecté à une base de données." -#: pg_dump.c:1549 +#: pg_dump.c:1696 #, c-format msgid "cross-database references are not implemented: %s" msgstr "les références entre bases de données ne sont pas implémentées : %s" -#: pg_dump.c:1980 +#: pg_dump.c:2155 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "sauvegarde du contenu de la table « %s.%s »" -#: pg_dump.c:2086 +#: pg_dump.c:2265 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Sauvegarde du contenu de la table « %s » échouée : échec de PQgetCopyData()." -#: pg_dump.c:2087 pg_dump.c:2097 +#: pg_dump.c:2266 pg_dump.c:2276 #, c-format msgid "Error message from server: %s" msgstr "Message d'erreur du serveur : %s" -#: pg_dump.c:2088 pg_dump.c:2098 +#: pg_dump.c:2267 pg_dump.c:2277 #, c-format msgid "Command was: %s" msgstr "La commande était : %s" -#: pg_dump.c:2096 +#: pg_dump.c:2275 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Sauvegarde du contenu de la table « %s » échouée : échec de PQgetResult()." -#: pg_dump.c:2178 +#: pg_dump.c:2366 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "mauvais nombre de champs récupérés à partir de la table « %s »" -#: pg_dump.c:2836 +#: pg_dump.c:3068 #, c-format msgid "saving database definition" msgstr "sauvegarde de la définition de la base de données" -#: pg_dump.c:2932 +#: pg_dump.c:3177 #, c-format msgid "unrecognized locale provider: %s" msgstr "fournisseur de locale non reconnu : %s" -#: pg_dump.c:3248 +#: pg_dump.c:3538 #, c-format msgid "saving encoding = %s" msgstr "encodage de la sauvegarde = %s" -#: pg_dump.c:3273 +#: pg_dump.c:3563 #, c-format -msgid "saving standard_conforming_strings = %s" -msgstr "sauvegarde de standard_conforming_strings = %s" +msgid "saving \"standard_conforming_strings = %s\"" +msgstr "sauvegarde de « standard_conforming_strings = %s »" -#: pg_dump.c:3312 +#: pg_dump.c:3602 #, c-format msgid "could not parse result of current_schemas()" msgstr "n'a pas pu analyser le résultat de current_schema()" -#: pg_dump.c:3331 +#: pg_dump.c:3621 #, c-format -msgid "saving search_path = %s" -msgstr "sauvegarde de search_path = %s" +msgid "saving \"search_path = %s\"" +msgstr "sauvegarde de « search_path = %s »" -#: pg_dump.c:3369 +#: pg_dump.c:3657 #, c-format msgid "reading large objects" msgstr "lecture des « Large Objects »" -#: pg_dump.c:3507 +#: pg_dump.c:3878 #, c-format -msgid "saving large objects" -msgstr "sauvegarde des « Large Objects »" +msgid "saving large objects \"%s\"" +msgstr "sauvegarde des « Large Objects » « %s »" -#: pg_dump.c:3548 +#: pg_dump.c:3899 #, c-format msgid "error reading large object %u: %s" msgstr "erreur lors de la lecture du « Large Object » %u : %s" -#: pg_dump.c:3654 +#: pg_dump.c:4002 #, c-format msgid "reading row-level security policies" msgstr "lecture des politiques de sécurité au niveau ligne" -#: pg_dump.c:3795 +#: pg_dump.c:4143 #, c-format msgid "unexpected policy command type: %c" msgstr "type de commande inattendu pour la politique : %c" -#: pg_dump.c:4245 pg_dump.c:4563 pg_dump.c:11694 pg_dump.c:17511 -#: pg_dump.c:17513 pg_dump.c:18134 +#: pg_dump.c:4593 pg_dump.c:5151 pg_dump.c:12365 pg_dump.c:18264 +#: pg_dump.c:18266 pg_dump.c:18888 #, c-format msgid "could not parse %s array" msgstr "n'a pas pu analyser le tableau %s" -#: pg_dump.c:4431 +#: pg_dump.c:4807 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "les souscriptions ne sont pas sauvegardées parce que l'utilisateur courant n'est pas un superutilisateur" -#: pg_dump.c:4945 +#: pg_dump.c:5013 +#, c-format +msgid "subscription with OID %u does not exist" +msgstr "la souscription d'OID %u n'existe pas" + +#: pg_dump.c:5020 +#, c-format +msgid "failed sanity check, table with OID %u not found" +msgstr "vérification de santé échouée, table d'OID %u introuvable" + +#: pg_dump.c:5583 #, c-format msgid "could not find parent extension for %s %s" msgstr "n'a pas pu trouver l'extension parent pour %s %s" -#: pg_dump.c:5090 +#: pg_dump.c:5728 #, c-format msgid "schema with OID %u does not exist" msgstr "le schéma d'OID %u n'existe pas" -#: pg_dump.c:6544 pg_dump.c:16775 +#: pg_dump.c:7210 pg_dump.c:17635 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "vérification échouée, OID %u de la table parent de l'OID %u de la séquence introuvable" -#: pg_dump.c:6848 pg_dump.c:7115 pg_dump.c:7586 pg_dump.c:8253 pg_dump.c:8374 -#: pg_dump.c:8528 +#: pg_dump.c:7355 +#, c-format +msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found" +msgstr "vérification échouée, OID de table %u apparaissant dans partitioned introuvable" + +#: pg_dump.c:7586 pg_dump.c:7860 pg_dump.c:8307 pg_dump.c:8921 pg_dump.c:9043 +#: pg_dump.c:9191 #, c-format msgid "unrecognized table OID %u" msgstr "OID de table %u non reconnu" -#: pg_dump.c:6852 +#: pg_dump.c:7590 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "données d'index inattendu pour la table « %s »" -#: pg_dump.c:7347 +#: pg_dump.c:8092 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "vérification échouée, OID %u de la table parent de l'OID %u de l'entrée de pg_rewrite introuvable" -#: pg_dump.c:7638 -#, c-format -msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" -msgstr "la requête a produit une réference de nom de table null pour le trigger de la clé étrangère « %s » sur la table « %s » (OID de la table : %u)" - -#: pg_dump.c:8257 +#: pg_dump.c:8925 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "données de colonne inattendues pour la table « %s »" -#: pg_dump.c:8287 +#: pg_dump.c:8954 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "numérotation des colonnes invalide pour la table « %s »" -#: pg_dump.c:8336 +#: pg_dump.c:9005 #, c-format msgid "finding table default expressions" msgstr "recherche des expressions par défaut de la table" -#: pg_dump.c:8378 +#: pg_dump.c:9047 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "valeur adnum %d invalide pour la table « %s »" -#: pg_dump.c:8478 +#: pg_dump.c:9141 #, c-format msgid "finding table check constraints" msgstr "recherche des contraintes CHECK de la table" -#: pg_dump.c:8532 +#: pg_dump.c:9195 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "%d contrainte de vérification attendue pour la table « %s » mais %d trouvée" msgstr[1] "%d contraintes de vérification attendues pour la table « %s » mais %d trouvée" -#: pg_dump.c:8536 +#: pg_dump.c:9199 #, c-format msgid "The system catalogs might be corrupted." msgstr "Les catalogues système pourraient être corrompus." -#: pg_dump.c:9226 +#: pg_dump.c:9889 #, c-format msgid "role with OID %u does not exist" msgstr "le rôle d'OID %u n'existe pas" -#: pg_dump.c:9338 pg_dump.c:9367 +#: pg_dump.c:10001 pg_dump.c:10030 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "entrée pg_init_privs non supportée : %u %u %d" -#: pg_dump.c:10188 +#: pg_dump.c:10577 +#, c-format +msgid "missing metadata for large objects \"%s\"" +msgstr "métadonnée manquante pour les Large Object « %s »" + +#: pg_dump.c:10860 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "la colonne typtype du type de données « %s » semble être invalide" -#: pg_dump.c:11763 +#: pg_dump.c:12434 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "valeur provolatile non reconnue pour la fonction « %s »" -#: pg_dump.c:11813 pg_dump.c:13604 +#: pg_dump.c:12484 pg_dump.c:14380 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "valeur proparallel non reconnue pour la fonction « %s »" -#: pg_dump.c:11944 pg_dump.c:12050 pg_dump.c:12057 +#: pg_dump.c:12614 pg_dump.c:12720 pg_dump.c:12727 #, c-format msgid "could not find function definition for function with OID %u" msgstr "n'a pas pu trouver la définition de la fonction d'OID %u" -#: pg_dump.c:11983 +#: pg_dump.c:12653 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "valeur erronée dans le champ pg_cast.castfunc ou pg_cast.castmethod" -#: pg_dump.c:11986 +#: pg_dump.c:12656 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "valeur erronée dans pg_cast.castmethod" -#: pg_dump.c:12076 +#: pg_dump.c:12746 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "définition de transformation invalide, au moins un de trffromsql et trftosql ne doit pas valoir 0" -#: pg_dump.c:12093 +#: pg_dump.c:12763 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "valeur erronée dans pg_transform.trffromsql" -#: pg_dump.c:12114 +#: pg_dump.c:12784 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "valeur erronée dans pg_transform.trftosql" -#: pg_dump.c:12259 +#: pg_dump.c:12929 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "les opérateurs postfixes ne sont plus supportés (opérateur « %s »)" -#: pg_dump.c:12429 +#: pg_dump.c:13099 #, c-format msgid "could not find operator with OID %s" msgstr "n'a pas pu trouver l'opérateur d'OID %s" -#: pg_dump.c:12497 +#: pg_dump.c:13167 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "type « %c » invalide de la méthode d'accès « %s »" -#: pg_dump.c:13116 +#: pg_dump.c:13841 pg_dump.c:13909 #, c-format msgid "unrecognized collation provider: %s" msgstr "fournisseur de collationnement non reconnu : %s" -#: pg_dump.c:13523 +#: pg_dump.c:13850 pg_dump.c:13857 pg_dump.c:13868 pg_dump.c:13878 +#: pg_dump.c:13893 +#, c-format +msgid "invalid collation \"%s\"" +msgstr "collation « %s » invalide" + +#: pg_dump.c:14299 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "valeur non reconnue de aggfinalmodify pour l'agrégat « %s »" -#: pg_dump.c:13579 +#: pg_dump.c:14355 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "valeur non reconnue de aggmfinalmodify pour l'agrégat « %s »" -#: pg_dump.c:14297 +#: pg_dump.c:15072 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "type d'objet inconnu dans les droits par défaut : %d" -#: pg_dump.c:14313 +#: pg_dump.c:15088 #, c-format msgid "could not parse default ACL list (%s)" msgstr "n'a pas pu analyser la liste ACL par défaut (%s)" -#: pg_dump.c:14395 +#: pg_dump.c:15172 #, c-format msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "n'a pas pu analyser la liste ACL initiale (%s) ou par défaut (%s) pour l'objet « %s » (%s)" -#: pg_dump.c:14420 +#: pg_dump.c:15197 #, c-format msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "n'a pas pu analyser la liste ACL (%s) ou par défaut (%s) pour l'objet « %s » (%s)" -#: pg_dump.c:14958 +#: pg_dump.c:15740 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "la requête permettant d'obtenir la définition de la vue « %s » n'a renvoyé aucune donnée" -#: pg_dump.c:14961 +#: pg_dump.c:15743 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "la requête permettant d'obtenir la définition de la vue « %s » a renvoyé plusieurs définitions" -#: pg_dump.c:14968 +#: pg_dump.c:15750 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "la définition de la vue « %s » semble être vide (longueur nulle)" -#: pg_dump.c:15052 +#: pg_dump.c:15835 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS n'est plus supporté (table « %s »)" -#: pg_dump.c:15981 +#: pg_dump.c:16822 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "numéro de colonne %d invalide pour la table « %s »" -#: pg_dump.c:16059 +#: pg_dump.c:16900 #, c-format msgid "could not parse index statistic columns" msgstr "n'a pas pu analyser les colonnes statistiques de l'index" -#: pg_dump.c:16061 +#: pg_dump.c:16902 #, c-format msgid "could not parse index statistic values" msgstr "n'a pas pu analyser les valeurs statistiques de l'index" -#: pg_dump.c:16063 +#: pg_dump.c:16904 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "nombre de colonnes et de valeurs différentes pour les statistiques des index" -#: pg_dump.c:16281 +#: pg_dump.c:17133 #, c-format msgid "missing index for constraint \"%s\"" msgstr "index manquant pour la contrainte « %s »" -#: pg_dump.c:16509 +#: pg_dump.c:17368 #, c-format msgid "unrecognized constraint type: %c" msgstr "type de contrainte inconnu : %c" -#: pg_dump.c:16610 pg_dump.c:16839 +#: pg_dump.c:17469 pg_dump.c:17699 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "la requête permettant d'obtenir les données de la séquence « %s » a renvoyé %d ligne (une seule attendue)" msgstr[1] "la requête permettant d'obtenir les données de la séquence « %s » a renvoyé %d ligne (une seule attendue)" -#: pg_dump.c:16642 +#: pg_dump.c:17501 #, c-format msgid "unrecognized sequence type: %s" msgstr "type de séquence non reconnu : « %s »" -#: pg_dump.c:16931 -#, c-format -msgid "unexpected tgtype value: %d" -msgstr "valeur tgtype inattendue : %d" - -#: pg_dump.c:17003 -#, c-format -msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" -msgstr "chaîne argument invalide (%s) pour le trigger « %s » sur la table « %s »" - -#: pg_dump.c:17272 +#: pg_dump.c:18016 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "la requête permettant d'obtenir la règle « %s » associée à la table « %s » a échoué : mauvais nombre de lignes renvoyées" -#: pg_dump.c:17425 +#: pg_dump.c:18169 #, c-format msgid "could not find referenced extension %u" msgstr "n'a pas pu trouver l'extension référencée %u" -#: pg_dump.c:17515 +#: pg_dump.c:18268 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "nombre différent de configurations et de conditions pour l'extension" -#: pg_dump.c:17647 +#: pg_dump.c:18400 #, c-format msgid "reading dependency data" msgstr "lecture des données de dépendance" -#: pg_dump.c:17733 +#: pg_dump.c:18486 #, c-format msgid "no referencing object %u %u" msgstr "pas d'objet référant %u %u" -#: pg_dump.c:17744 +#: pg_dump.c:18497 #, c-format msgid "no referenced object %u %u" msgstr "pas d'objet référencé %u %u" -#: pg_dump_sort.c:422 +#: pg_dump.c:18922 pg_dump.c:18960 pg_dumpall.c:2011 pg_restore.c:551 +#: pg_restore.c:597 +#, c-format +msgid "%s filter for \"%s\" is not allowed" +msgstr "filtre %s pour « %s » n'est pas autorisé" + +#: pg_dump_sort.c:424 #, c-format msgid "invalid dumpId %d" msgstr "dumpId %d invalide" -#: pg_dump_sort.c:428 +#: pg_dump_sort.c:430 #, c-format msgid "invalid dependency %d" msgstr "dépendance invalide %d" -#: pg_dump_sort.c:661 +#: pg_dump_sort.c:594 #, c-format msgid "could not identify dependency loop" msgstr "n'a pas pu identifier la boucle de dépendance" -#: pg_dump_sort.c:1232 +#: pg_dump_sort.c:1209 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" -msgstr[0] "NOTE : il existe des constraintes de clés étrangères circulaires sur cette table :" -msgstr[1] "NOTE : il existe des constraintes de clés étrangères circulaires sur ces tables :" - -#: pg_dump_sort.c:1236 pg_dump_sort.c:1256 -#, c-format -msgid " %s" -msgstr " %s" +msgstr[0] "NOTE : il existe des contraintes de clés étrangères circulaires sur cette table :" +msgstr[1] "NOTE : il existe des contraintes de clés étrangères circulaires sur ces tables :" -#: pg_dump_sort.c:1237 +#: pg_dump_sort.c:1214 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." -msgstr "Il est possible de restaurer la sauvegarde sans utiliser --disable-triggers ou sans supprimer temporairement les constraintes." +msgstr "Il est possible de restaurer la sauvegarde sans utiliser --disable-triggers ou sans supprimer temporairement les contraintes." -#: pg_dump_sort.c:1238 +#: pg_dump_sort.c:1215 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "Considérez l'utilisation d'une sauvegarde complète au lieu d'une sauvegarde des données seulement pour éviter ce problème." -#: pg_dump_sort.c:1250 +#: pg_dump_sort.c:1227 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "n'a pas pu résoudre la boucle de dépendances parmi ces éléments :" -#: pg_dumpall.c:205 +#: pg_dumpall.c:231 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »" -#: pg_dumpall.c:208 +#: pg_dumpall.c:234 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s" -#: pg_dumpall.c:357 +#: pg_dumpall.c:387 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "l'option --exclude-database ne peut pas être utilisée avec -g/--globals-only, -r/--roles-only ou -t/--tablespaces-only" -#: pg_dumpall.c:365 +#: pg_dumpall.c:395 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "les options « -g/--globals-only » et « -r/--roles-only » ne peuvent pas être utilisées ensemble" -#: pg_dumpall.c:372 +#: pg_dumpall.c:402 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "les options « -g/--globals-only » et « -t/--tablespaces-only » ne peuvent pas être utilisées ensemble" -#: pg_dumpall.c:382 +#: pg_dumpall.c:412 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "les options « -r/--roles-only » et « -t/--tablespaces-only » ne peuvent pas être utilisées ensemble" -#: pg_dumpall.c:444 pg_dumpall.c:1587 +#: pg_dumpall.c:474 pg_dumpall.c:1820 #, c-format msgid "could not connect to database \"%s\"" msgstr "n'a pas pu se connecter à la base de données « %s »" -#: pg_dumpall.c:456 +#: pg_dumpall.c:486 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2283,7 +2586,7 @@ msgstr "" "n'a pas pu se connecter aux bases « postgres » et « template1 ».\n" "Merci de préciser une autre base de données." -#: pg_dumpall.c:604 +#: pg_dumpall.c:635 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2293,79 +2596,84 @@ msgstr "" "commandes SQL.\n" "\n" -#: pg_dumpall.c:606 +#: pg_dumpall.c:637 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_dumpall.c:609 +#: pg_dumpall.c:640 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=FICHIER nom du fichier de sortie\n" -#: pg_dumpall.c:616 +#: pg_dumpall.c:647 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr "" " -c, --clean nettoie (supprime) les bases de données avant de\n" " les créer\n" -#: pg_dumpall.c:618 +#: pg_dumpall.c:649 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr "" " -g, --globals-only sauvegarde uniquement les objets système, pas\n" " le contenu des bases de données\n" -#: pg_dumpall.c:619 pg_restore.c:456 +#: pg_dumpall.c:650 pg_restore.c:475 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner omet la restauration des propriétaires des objets\n" -#: pg_dumpall.c:620 +#: pg_dumpall.c:651 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr "" " -r, --roles-only sauvegarde uniquement les rôles, pas les bases\n" " de données ni les tablespaces\n" -#: pg_dumpall.c:622 +#: pg_dumpall.c:653 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr "" " -S, --superuser=NOM indique le nom du super-utilisateur à utiliser\n" " avec le format texte\n" -#: pg_dumpall.c:623 +#: pg_dumpall.c:654 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr "" " -t, --tablespaces-only sauvegarde uniquement les tablespaces, pas les\n" " bases de données ni les rôles\n" -#: pg_dumpall.c:629 +#: pg_dumpall.c:660 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr "" " --exclude-database=MOTIF exclut les bases de données dont le nom\n" " correspond au motif\n" -#: pg_dumpall.c:636 +#: pg_dumpall.c:662 +#, c-format +msgid " --filter=FILENAME exclude databases based on expressions in FILENAME\n" +msgstr " -f, --file=FICHIER exclut les bases indiquées sous forme d'expressions dans FICHIER\n" + +#: pg_dumpall.c:668 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords ne sauvegarde pas les mots de passe des rôles\n" -#: pg_dumpall.c:652 +#: pg_dumpall.c:684 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=CHAINE_CONNEX connexion à l'aide de la chaîne de connexion\n" -#: pg_dumpall.c:654 +#: pg_dumpall.c:686 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=BASE indique une autre base par défaut\n" -#: pg_dumpall.c:661 +#: pg_dumpall.c:693 #, c-format msgid "" "\n" @@ -2378,92 +2686,112 @@ msgstr "" "standard.\n" "\n" -#: pg_dumpall.c:803 +#: pg_dumpall.c:838 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "nom de rôle commençant par « pg_ » ignoré (« %s »)" -#: pg_dumpall.c:1018 +#. translator: %s represents a numeric role OID +#: pg_dumpall.c:1055 pg_dumpall.c:1113 pg_dumpall.c:1122 +#, c-format +msgid "found orphaned pg_auth_members entry for role %s" +msgstr "a trouvé une entrée orpheline dans pg_auth_members pour le rôle %s" + +#: pg_dumpall.c:1088 +#, c-format +msgid "could not find a legal dump ordering for memberships in role \"%s\"" +msgstr "n'a pas pu trouver un ordre de sauvegarde correct pour les appartenances au rôle « %s »" + +#: pg_dumpall.c:1243 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "n'a pas pu analyser la liste d'ACL (%s) pour le paramètre « %s »" -#: pg_dumpall.c:1136 +#: pg_dumpall.c:1370 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "n'a pas pu analyser la liste d'ACL (%s) pour le tablespace « %s »" -#: pg_dumpall.c:1343 +#: pg_dumpall.c:1577 #, c-format msgid "excluding database \"%s\"" msgstr "exclusion de la base de données « %s »" -#: pg_dumpall.c:1347 +#: pg_dumpall.c:1581 #, c-format msgid "dumping database \"%s\"" msgstr "sauvegarde de la base de données « %s »" -#: pg_dumpall.c:1378 +#: pg_dumpall.c:1612 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "échec de pg_dump sur la base de données « %s », quitte" -#: pg_dumpall.c:1384 +#: pg_dumpall.c:1618 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "n'a pas pu ré-ouvrir le fichier de sortie « %s » : %m" -#: pg_dumpall.c:1425 +#: pg_dumpall.c:1662 #, c-format msgid "running \"%s\"" msgstr "exécute « %s »" -#: pg_dumpall.c:1630 +#: pg_dumpall.c:1863 #, c-format msgid "could not get server version" msgstr "n'a pas pu obtenir la version du serveur" -#: pg_dumpall.c:1633 +#: pg_dumpall.c:1866 #, c-format msgid "could not parse server version \"%s\"" msgstr "n'a pas pu analyser la version du serveur « %s »" -#: pg_dumpall.c:1703 pg_dumpall.c:1726 +#: pg_dumpall.c:1936 pg_dumpall.c:1959 #, c-format msgid "executing %s" msgstr "exécution %s" -#: pg_restore.c:313 +#: pg_dumpall.c:2031 +msgid "unsupported filter object" +msgstr "objet de filtre non supporté" + +#: pg_restore.c:329 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "une seule des options -d/--dbname and -f/--file peut être indiquée" -#: pg_restore.c:320 +#: pg_restore.c:336 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "les options « -d/--dbname » et « -f/--file » ne peuvent pas être utilisées ensemble" -#: pg_restore.c:338 +#: pg_restore.c:350 +#, c-format +msgid "options -1/--single-transaction and --transaction-size cannot be used together" +msgstr "les options -1/--single-transaction » et --transaction-size ne peuvent pas être utilisées ensemble" + +#: pg_restore.c:357 #, c-format msgid "options -C/--create and -1/--single-transaction cannot be used together" msgstr "les options « -C/--create » et « -1/--single-transaction » ne peuvent pas être utilisées ensemble" -#: pg_restore.c:342 +#: pg_restore.c:361 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "ne peut pas spécifier à la fois l'option --single-transaction et demander plusieurs jobs" -#: pg_restore.c:380 +#: pg_restore.c:399 #, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "format d'archive « %s » non reconnu ; merci d'indiquer « c », « d » ou « t »" -#: pg_restore.c:419 +#: pg_restore.c:438 #, c-format msgid "errors ignored on restore: %d" msgstr "erreurs ignorées lors de la restauration : %d" -#: pg_restore.c:432 +#: pg_restore.c:451 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" @@ -2473,51 +2801,51 @@ msgstr "" "par pg_dump.\n" "\n" -#: pg_restore.c:434 +#: pg_restore.c:453 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [OPTION]... [FICHIER]\n" -#: pg_restore.c:437 +#: pg_restore.c:456 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr "" " -d, --dbname=NOM nom de la base de données utilisée pour la\n" " connexion\n" -#: pg_restore.c:438 +#: pg_restore.c:457 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr " -f, --file=FICHIER nom du fichier de sortie (- pour stdout)\n" -#: pg_restore.c:439 +#: pg_restore.c:458 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr "" " -F, --format=c|d|t format du fichier de sauvegarde (devrait être\n" " automatique)\n" -#: pg_restore.c:440 +#: pg_restore.c:459 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list affiche la table des matières de l'archive (TOC)\n" -#: pg_restore.c:441 +#: pg_restore.c:460 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose mode verbeux\n" -#: pg_restore.c:442 +#: pg_restore.c:461 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: pg_restore.c:443 +#: pg_restore.c:462 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_restore.c:445 +#: pg_restore.c:464 #, c-format msgid "" "\n" @@ -2526,34 +2854,34 @@ msgstr "" "\n" "Options contrôlant la restauration :\n" -#: pg_restore.c:446 +#: pg_restore.c:465 #, c-format msgid " -a, --data-only restore only the data, no schema\n" msgstr " -a, --data-only restaure uniquement les données, pas la structure\n" -#: pg_restore.c:448 +#: pg_restore.c:467 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create crée la base de données cible\n" -#: pg_restore.c:449 +#: pg_restore.c:468 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr " -e, --exit-on-error quitte en cas d'erreur, continue par défaut\n" -#: pg_restore.c:450 +#: pg_restore.c:469 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NOM restaure l'index indiqué\n" -#: pg_restore.c:451 +#: pg_restore.c:470 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr "" " -j, --jobs=NOMBRE utilise ce nombre de jobs en parallèle pour la\n" " restauration\n" -#: pg_restore.c:452 +#: pg_restore.c:471 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" @@ -2562,66 +2890,75 @@ msgstr "" " -L, --use-list=FICHIER utilise la table des matières à partir de ce\n" " fichier pour sélectionner/trier la sortie\n" -#: pg_restore.c:454 +#: pg_restore.c:473 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr " -n, --schema=NOM restaure uniquement les objets de ce schéma\n" -#: pg_restore.c:455 +#: pg_restore.c:474 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" msgstr " -N, --exclude-schema=NOM ne restaure pas les objets de ce schéma\n" -#: pg_restore.c:457 +#: pg_restore.c:476 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=NOM(args) restaure la fonction indiquée\n" -#: pg_restore.c:458 +#: pg_restore.c:477 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" msgstr " -s, --schema-only restaure uniquement la structure, pas les données\n" -#: pg_restore.c:459 +#: pg_restore.c:478 #, c-format msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" msgstr "" " -S, --superuser=NOM indique le nom du super-utilisateur à utiliser\n" " pour désactiver les triggers\n" -#: pg_restore.c:460 +#: pg_restore.c:479 #, c-format msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" msgstr " -t, --table=NOM restaure la relation indiquée (table, vue, etc)\n" -#: pg_restore.c:461 +#: pg_restore.c:480 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NOM restaure le trigger indiqué\n" -#: pg_restore.c:462 +#: pg_restore.c:481 #, c-format msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" msgstr "" " -x, --no-privileges omet la restauration des droits sur les objets\n" " (grant/revoke)\n" -#: pg_restore.c:463 +#: pg_restore.c:482 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction restaure dans une seule transaction\n" -#: pg_restore.c:465 +#: pg_restore.c:484 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security active la sécurité niveau ligne\n" -#: pg_restore.c:467 +#: pg_restore.c:485 +#, c-format +msgid "" +" --filter=FILENAME restore or skip objects based on expressions\n" +" in FILENAME\n" +msgstr "" +" --filter=NOMFICHIER restaure ou ignore les objets suivant des expressions\n" +" dans NOMFICHIER\n" + +#: pg_restore.c:488 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments ne restaure pas les commentaires\n" -#: pg_restore.c:468 +#: pg_restore.c:489 #, c-format msgid "" " --no-data-for-failed-tables do not restore data of tables that could not be\n" @@ -2630,44 +2967,49 @@ msgstr "" " --no-data-for-failed-tables ne restaure pas les données des tables qui n'ont\n" " pas pu être créées\n" -#: pg_restore.c:470 +#: pg_restore.c:491 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications ne restaure pas les publications\n" -#: pg_restore.c:471 +#: pg_restore.c:492 #, c-format msgid " --no-security-labels do not restore security labels\n" msgstr " --no-security-labels ne restaure pas les labels de sécurité\n" -#: pg_restore.c:472 +#: pg_restore.c:493 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions ne restaure pas les souscriptions\n" -#: pg_restore.c:473 +#: pg_restore.c:494 #, c-format msgid " --no-table-access-method do not restore table access methods\n" msgstr " --no-table-access-method ne restaure pas les méthodes d'accès aux tables\n" -#: pg_restore.c:474 +#: pg_restore.c:495 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" msgstr " --no-tablespaces ne restaure pas les affectations de tablespaces\n" -#: pg_restore.c:475 +#: pg_restore.c:496 #, c-format msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" msgstr "" " --section=SECTION restaure la section indiquée (pre-data, data ou\n" " post-data)\n" -#: pg_restore.c:488 +#: pg_restore.c:499 +#, c-format +msgid " --transaction-size=N commit after every N objects\n" +msgstr " --transaction-size=N valide après N objets\n" + +#: pg_restore.c:510 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=RÔLE exécute SET ROLE avant la restauration\n" -#: pg_restore.c:490 +#: pg_restore.c:512 #, c-format msgid "" "\n" @@ -2678,7 +3020,7 @@ msgstr "" "Les options -I, -n, -N, -P, -t, -T et --section peuvent être combinées et\n" "indiquées plusieurs fois pour sélectionner plusieurs objets.\n" -#: pg_restore.c:493 +#: pg_restore.c:515 #, c-format msgid "" "\n" @@ -2689,701 +3031,3 @@ msgstr "" "Si aucun nom de fichier n'est fourni en entrée, alors l'entrée standard est\n" "utilisée.\n" "\n" - -#~ msgid " --disable-triggers disable triggers during data-only restore\n" -#~ msgstr "" -#~ " --disable-triggers désactiver les déclencheurs lors de la\n" -#~ " restauration des données seules\n" - -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide puis quitte\n" - -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide et quitte\n" - -#, c-format -#~ msgid " --no-synchronized-snapshots do not use synchronized snapshots in parallel jobs\n" -#~ msgstr "" -#~ " --no-synchronized-snapshots n'utilise pas de snapshots synchronisés pour les\n" -#~ " jobs en parallèle\n" - -#~ msgid "" -#~ " --use-set-session-authorization\n" -#~ " use SET SESSION AUTHORIZATION commands instead of\n" -#~ " ALTER OWNER commands to set ownership\n" -#~ msgstr "" -#~ " --use-set-session-authorization\n" -#~ " utilise les commandes SET SESSION AUTHORIZATION\n" -#~ " au lieu des commandes ALTER OWNER pour les\n" -#~ " modifier les propriétaires\n" - -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version puis quitte\n" - -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version et quitte\n" - -#~ msgid " -O, --no-owner skip restoration of object ownership\n" -#~ msgstr "" -#~ " -O, --no-owner omettre la restauration des possessions des\n" -#~ " objets\n" - -#~ msgid " -c, --clean clean (drop) database objects before recreating\n" -#~ msgstr "" -#~ " -c, --clean nettoie/supprime les bases de données avant de\n" -#~ " les créer\n" - -#~ msgid " -o, --oids include OIDs in dump\n" -#~ msgstr " -o, --oids inclut les OID dans la sauvegarde\n" - -#~ msgid "%s: could not connect to database \"%s\": %s" -#~ msgstr "%s : n'a pas pu se connecter à la base de données « %s » : %s" - -#~ msgid "%s: could not open the output file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier de sauvegarde « %s » : %s\n" - -#~ msgid "%s: could not parse ACL list (%s) for database \"%s\"\n" -#~ msgstr "%s : n'a pas pu analyser la liste d'ACL (%s) pour la base de données « %s »\n" - -#~ msgid "%s: could not parse version \"%s\"\n" -#~ msgstr "%s : n'a pas pu analyser la version « %s »\n" - -#~ msgid "%s: executing %s\n" -#~ msgstr "%s : exécute %s\n" - -#~ msgid "%s: invalid -X option -- %s\n" -#~ msgstr "%s : option -X invalide -- %s\n" - -#~ msgid "%s: invalid client encoding \"%s\" specified\n" -#~ msgstr "%s : encodage client indiqué (« %s ») invalide\n" - -#~ msgid "%s: invalid number of parallel jobs\n" -#~ msgstr "%s : nombre de jobs en parallèle invalide\n" - -#~ msgid "%s: option --if-exists requires option -c/--clean\n" -#~ msgstr "%s : l'option --if-exists nécessite l'option -c/--clean\n" - -#~ msgid "%s: options -c/--clean and -a/--data-only cannot be used together\n" -#~ msgstr "" -#~ "%s : les options « -c/--clean » et « -a/--data-only » ne peuvent pas être\n" -#~ "utilisées conjointement\n" - -#~ msgid "%s: options -s/--schema-only and -a/--data-only cannot be used together\n" -#~ msgstr "" -#~ "%s : les options « -s/--schema-only » et « -a/--data-only » ne peuvent pas être\n" -#~ "utilisées conjointement\n" - -#~ msgid "%s: out of memory\n" -#~ msgstr "%s : mémoire épuisée\n" - -#~ msgid "%s: query failed: %s" -#~ msgstr "%s : échec de la requête : %s" - -#~ msgid "%s: query was: %s\n" -#~ msgstr "%s : la requête était : %s\n" - -#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" -#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" - -#~ msgid "(The INSERT command cannot set OIDs.)\n" -#~ msgstr "(La commande INSERT ne peut pas positionner les OID.)\n" - -#~ msgid "*** aborted because of error\n" -#~ msgstr "*** interrompu du fait d'erreurs\n" - -#~ msgid "-C and -1 are incompatible options\n" -#~ msgstr "-C et -1 sont des options incompatibles\n" - -#~ msgid "-C and -c are incompatible options\n" -#~ msgstr "-C et -c sont des options incompatibles\n" - -#~ msgid "LOCK TABLE failed for \"%s\": %s" -#~ msgstr "LOCK TABLE échoué pour la table « %s » : %s" - -#~ msgid "Report bugs to .\n" -#~ msgstr "Rapporter les bogues à .\n" - -#~ msgid "Report bugs to .\n" -#~ msgstr "Rapporter les bogues à .\n" - -#~ msgid "SQL command failed\n" -#~ msgstr "la commande SQL a échoué\n" - -#, c-format -#~ msgid "" -#~ "Synchronized snapshots are not supported by this server version.\n" -#~ "Run with --no-synchronized-snapshots instead if you do not need\n" -#~ "synchronized snapshots." -#~ msgstr "" -#~ "Les snapshots synchronisés ne sont pas supportés par cette version serveur.\n" -#~ "Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n" -#~ "de snapshots synchronisés." - -#~ msgid "" -#~ "Synchronized snapshots are not supported on standby servers.\n" -#~ "Run with --no-synchronized-snapshots instead if you do not need\n" -#~ "synchronized snapshots.\n" -#~ msgstr "" -#~ "Les snapshots synchronisés ne sont pas supportés sur les serveurs de stadby.\n" -#~ "Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n" -#~ "de snapshots synchronisés.\n" - -#, c-format -#~ msgid "" -#~ "Synchronized snapshots on standby servers are not supported by this server version.\n" -#~ "Run with --no-synchronized-snapshots instead if you do not need\n" -#~ "synchronized snapshots." -#~ msgstr "" -#~ "Les snapshots synchronisés sur les serveurs standbys ne sont pas supportés par cette version serveur.\n" -#~ "Lancez avec --no-synchronized-snapshots à la place si vous n'avez pas besoin\n" -#~ "de snapshots synchronisés." - -#~ msgid "TOC Entry %s at %s (length %s, checksum %d)\n" -#~ msgstr "entrée TOC %s à %s (longueur %s, somme de contrôle %d)\n" - -#, c-format -#~ msgid "The command was: %s" -#~ msgstr "La commande était : %s" - -#~ msgid "" -#~ "The program \"pg_dump\" is needed by %s but was not found in the\n" -#~ "same directory as \"%s\".\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « pg_dump » est nécessaire à %s mais n'a pas été trouvé dans le\n" -#~ "même répertoire que « %s ».\n" -#~ "Vérifiez votre installation." - -#~ msgid "" -#~ "The program \"pg_dump\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « pg_dump » a été trouvé par « %s »\n" -#~ "mais n'a pas la même version que %s.\n" -#~ "Vérifiez votre installation." - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayer « %s --help » pour plus d'informations.\n" - -#~ msgid "" -#~ "WARNING:\n" -#~ " This format is for demonstration purposes; it is not intended for\n" -#~ " normal use. Files will be written in the current working directory.\n" -#~ msgstr "" -#~ "ATTENTION :\n" -#~ " Ce format est présent dans un but de démonstration ; il n'est pas prévu\n" -#~ " pour une utilisation normale. Les fichiers seront écrits dans le\n" -#~ " répertoire actuel.\n" - -#~ msgid "WARNING: could not parse reloptions array\n" -#~ msgstr "ATTENTION : n'a pas pu analyser le tableau reloptions\n" - -#~ msgid "WSAStartup failed: %d" -#~ msgstr "WSAStartup a échoué : %d" - -#~ msgid "aggregate function %s could not be dumped correctly for this database version; ignored" -#~ msgstr "la fonction d'aggrégat %s n'a pas pu être sauvegardée correctement avec cette version de la base de données ; ignorée" - -#~ msgid "allocating AH for %s, format %d\n" -#~ msgstr "allocation d'AH pour %s, format %d\n" - -#~ msgid "archive member too large for tar format\n" -#~ msgstr "membre de l'archive trop volumineux pour le format tar\n" - -#~ msgid "archiver" -#~ msgstr "archiveur" - -#~ msgid "archiver (db)" -#~ msgstr "programme d'archivage (db)" - -#~ msgid "attempting to ascertain archive format\n" -#~ msgstr "tentative d'identification du format de l'archive\n" - -#, c-format -#~ msgid "bogus value in proargmodes array" -#~ msgstr "valeur erronée dans le tableau proargmodes" - -#~ msgid "cannot duplicate null pointer\n" -#~ msgstr "ne peut pas dupliquer un pointeur nul\n" - -#~ msgid "cannot reopen non-seekable file\n" -#~ msgstr "ne peut pas rouvrir le fichier non cherchable\n" - -#~ msgid "cannot reopen stdin\n" -#~ msgstr "ne peut pas rouvrir stdin\n" - -#~ msgid "child process was terminated by signal %d" -#~ msgstr "le processus fils a été terminé par le signal %d" - -#~ msgid "child process was terminated by signal %s" -#~ msgstr "le processus fils a été terminé par le signal %s" - -#~ msgid "compress_io" -#~ msgstr "compression_io" - -#, c-format -#~ msgid "compression level must be in range 0..9" -#~ msgstr "le niveau de compression doit être compris entre 0 et 9" - -#~ msgid "compression support is disabled in this format\n" -#~ msgstr "le support de la compression est désactivé avec ce format\n" - -#~ msgid "connecting to database \"%s\" as user \"%s\"" -#~ msgstr "connexion à la base de données « %s » en tant qu'utilisateur « %s »" - -#~ msgid "connection needs password" -#~ msgstr "la connexion nécessite un mot de passe" - -#~ msgid "connection to database \"%s\" failed: %s" -#~ msgstr "la connexion à la base de données « %s » a échoué : %s" - -#~ msgid "could not change directory to \"%s\"" -#~ msgstr "n'a pas pu accéder au répertoire « %s »" - -#~ msgid "could not change directory to \"%s\": %s" -#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s" - -#~ msgid "could not close data file after reading\n" -#~ msgstr "n'a pas pu fermer le fichier de données après lecture\n" - -#~ msgid "could not close directory \"%s\": %s\n" -#~ msgstr "n'a pas pu fermer le répertoire « %s » : %s\n" - -#~ msgid "could not close large object file\n" -#~ msgstr "n'a pas pu fermer le fichier du « Large Object »\n" - -#, c-format -#~ msgid "could not close tar member: %m" -#~ msgstr "n'a pas pu fermer le membre de tar : %m" - -#~ msgid "could not connect to database \"%s\": %s" -#~ msgstr "n'a pas pu se connecter à la base de données « %s » : %s" - -#~ msgid "could not create directory \"%s\": %s\n" -#~ msgstr "n'a pas pu créer le répertoire « %s » : %s\n" - -#~ msgid "could not create worker thread: %s\n" -#~ msgstr "n'a pas pu créer le fil de travail: %s\n" - -#~ msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive" -#~ msgstr "" -#~ "n'a pas pu trouver l'identifiant de bloc %d dans l'archive --\n" -#~ "il est possible que cela soit dû à une demande de restauration dans un ordre\n" -#~ "différent, qui n'a pas pu être géré à cause d'un manque d'information de\n" -#~ "position dans l'archive" - -#~ msgid "could not find entry for pg_indexes in pg_class\n" -#~ msgstr "n'a pas pu trouver l'entrée de pg_indexes dans pg_class\n" - -#~ msgid "could not find slot of finished worker\n" -#~ msgstr "n'a pas pu trouver l'emplacement du worker qui vient de terminer\n" - -#~ msgid "could not get relation name for OID %u: %s\n" -#~ msgstr "n'a pas pu obtenir le nom de la relation pour l'OID %u: %s\n" - -#~ msgid "could not identify current directory: %s" -#~ msgstr "n'a pas pu identifier le répertoire courant : %s" - -#~ msgid "could not open large object TOC for input: %s\n" -#~ msgstr "n'a pas pu ouvrir la TOC du « Large Object » en entrée : %s\n" - -#~ msgid "could not open large object TOC for output: %s\n" -#~ msgstr "n'a pas pu ouvrir la TOC du « Large Object » en sortie : %s\n" - -#~ msgid "could not open output file \"%s\" for writing\n" -#~ msgstr "n'a pas pu ouvrir le fichier de sauvegarde « %s » en écriture\n" - -#, c-format -#~ msgid "could not open temporary file" -#~ msgstr "n'a pas pu ouvrir le fichier temporaire" - -#~ msgid "could not output padding at end of tar member\n" -#~ msgstr "n'a pas pu remplir la fin du membre de tar\n" - -#~ msgid "could not parse ACL (%s) for large object %u" -#~ msgstr "n'a pas pu analyser la liste ACL (%s) du « Large Object » %u" - -#, c-format -#~ msgid "could not parse extension condition array" -#~ msgstr "n'a pas pu analyser le tableau de condition de l'extension" - -#, c-format -#~ msgid "could not parse extension configuration array" -#~ msgstr "n'a pas pu analyser le tableau de configuration des extensions" - -#~ msgid "could not parse index collation name array" -#~ msgstr "n'a pas pu analyser le tableau des noms de collation de l'index" - -#~ msgid "could not parse index collation version array" -#~ msgstr "n'a pas pu analyser le tableau des versions de collation de l'index" - -#, c-format -#~ msgid "could not parse proallargtypes array" -#~ msgstr "n'a pas pu analyser le tableau proallargtypes" - -#, c-format -#~ msgid "could not parse proargmodes array" -#~ msgstr "n'a pas pu analyser le tableau proargmodes" - -#, c-format -#~ msgid "could not parse proargnames array" -#~ msgstr "n'a pas pu analyser le tableau proargnames" - -#, c-format -#~ msgid "could not parse proconfig array" -#~ msgstr "n'a pas pu analyser le tableau proconfig" - -#, c-format -#~ msgid "could not parse subpublications array" -#~ msgstr "n'a pas pu analyser le tableau de sous-publications" - -#~ msgid "could not parse version string \"%s\"\n" -#~ msgstr "n'a pas pu analyser la chaîne de version « %s »\n" - -#~ msgid "could not read directory \"%s\": %s\n" -#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n" - -#~ msgid "could not read symbolic link \"%s\"" -#~ msgstr "n'a pas pu lire le lien symbolique « %s »" - -#~ msgid "could not reconnect to database" -#~ msgstr "n'a pas pu se reconnecter à la base de données" - -#~ msgid "could not reconnect to database: %s" -#~ msgstr "n'a pas pu se reconnecter à la base de données : %s" - -#~ msgid "could not set default_with_oids: %s" -#~ msgstr "n'a pas pu configurer default_with_oids : %s" - -#~ msgid "could not write byte\n" -#~ msgstr "n'a pas pu écrire l'octet\n" - -#~ msgid "could not write byte: %s\n" -#~ msgstr "n'a pas pu écrire un octet : %s\n" - -#~ msgid "could not write null block at end of tar archive\n" -#~ msgstr "n'a pas pu écrire le bloc nul à la fin de l'archive tar\n" - -#~ msgid "could not write to custom output routine\n" -#~ msgstr "n'a pas pu écrire vers la routine de sauvegarde personnalisée\n" - -#~ msgid "could not write to large object (result: %lu, expected: %lu)" -#~ msgstr "n'a pas pu écrire le « Large Object » (résultat : %lu, attendu : %lu)" - -#~ msgid "custom archiver" -#~ msgstr "programme d'archivage personnalisé" - -#~ msgid "directory archiver" -#~ msgstr "archiveur répertoire" - -#~ msgid "dumpBlobs(): could not open large object %u: %s" -#~ msgstr "dumpBlobs() : n'a pas pu ouvrir le « Large Object » %u : %s" - -#~ msgid "dumpDatabase(): could not find pg_largeobject.relfrozenxid\n" -#~ msgstr "dumpDatabase() : n'a pas pu trouver pg_largeobject.relfrozenxid\n" - -#~ msgid "dumpDatabase(): could not find pg_largeobject_metadata.relfrozenxid\n" -#~ msgstr "dumpDatabase() : n'a pas pu trouver pg_largeobject_metadata.relfrozenxid\n" - -#~ msgid "dumping a specific TOC data block out of order is not supported without ID on this input stream (fseek required)\n" -#~ msgstr "" -#~ "la sauvegarde d'un bloc de données spécifique du TOC dans le désordre n'est\n" -#~ "pas supporté sans identifiant sur ce flux d'entrée (fseek requis)\n" - -#~ msgid "entering restore_toc_entries_parallel\n" -#~ msgstr "entrée dans restore_toc_entries_parallel\n" - -#~ msgid "entering restore_toc_entries_postfork\n" -#~ msgstr "entrée dans restore_toc_entries_prefork\n" - -#~ msgid "entering restore_toc_entries_prefork\n" -#~ msgstr "entrée dans restore_toc_entries_prefork\n" - -#~ msgid "error during backup\n" -#~ msgstr "erreur lors de la sauvegarde\n" - -#~ msgid "error in ListenToWorkers(): %s\n" -#~ msgstr "erreur dans ListenToWorkers(): %s\n" - -#~ msgid "error processing a parallel work item\n" -#~ msgstr "erreur durant le traitement en parallèle d'un item\n" - -#, c-format -#~ msgid "extra_float_digits must be in range -15..3" -#~ msgstr "extra_float_digits doit être dans l'intervalle -15 à 3" - -#~ msgid "failed to connect to database\n" -#~ msgstr "n'a pas pu se connecter à la base de données\n" - -#~ msgid "failed to reconnect to database\n" -#~ msgstr "la reconnexion à la base de données a échoué\n" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatal : " - -#~ msgid "file archiver" -#~ msgstr "programme d'archivage de fichiers" - -#, c-format -#~ msgid "finding check constraints for table \"%s.%s\"" -#~ msgstr "recherche des contraintes de vérification pour la table « %s.%s »" - -#, c-format -#~ msgid "finding default expressions of table \"%s.%s\"" -#~ msgstr "recherche des expressions par défaut de la table « %s.%s »" - -#, c-format -#~ msgid "finding the columns and types of table \"%s.%s\"" -#~ msgstr "recherche des colonnes et types de la table « %s.%s »" - -#~ msgid "found more than one entry for pg_indexes in pg_class\n" -#~ msgstr "a trouvé plusieurs entrées pour pg_indexes dans la table pg_class\n" - -#~ msgid "found more than one pg_database entry for this database\n" -#~ msgstr "a trouvé plusieurs entrées dans pg_database pour cette base de données\n" - -#~ msgid "ftell mismatch with expected position -- ftell used" -#~ msgstr "ftell ne correspond pas à la position attendue -- ftell utilisé" - -#~ msgid "internal error -- neither th nor fh specified in _tarReadRaw()" -#~ msgstr "erreur interne -- ni th ni fh ne sont précisés dans _tarReadRaw()" - -#~ msgid "invalid COPY statement -- could not find \"copy\" in string \"%s\"\n" -#~ msgstr "instruction COPY invalide -- n'a pas pu trouver « copy » dans la chaîne « %s »\n" - -#~ msgid "invalid COPY statement -- could not find \"from stdin\" in string \"%s\" starting at position %lu\n" -#~ msgstr "" -#~ "instruction COPY invalide -- n'a pas pu trouver « from stdin » dans la\n" -#~ "chaîne « %s » à partir de la position %lu\n" - -#~ msgid "invalid TOASTCOMPRESSION item: %s" -#~ msgstr "élément TOASTCOMPRESSION invalide : %s" - -#, c-format -#~ msgid "invalid number of parallel jobs" -#~ msgstr "nombre de jobs parallèles invalide" - -#, c-format -#~ msgid "maximum number of parallel jobs is %d" -#~ msgstr "le nombre maximum de jobs en parallèle est %d" - -#~ msgid "mismatch in actual vs. predicted file position (%s vs. %s)\n" -#~ msgstr "" -#~ "pas de correspondance entre la position réelle et celle prévue du fichier\n" -#~ "(%s vs. %s)\n" - -#~ msgid "mismatched number of collation names and versions for index" -#~ msgstr "nombre différent de noms et versions de collation pour l'index" - -#~ msgid "missing pg_database entry for database \"%s\"\n" -#~ msgstr "entrée manquante dans pg_database pour la base de données « %s »\n" - -#~ msgid "missing pg_database entry for this database\n" -#~ msgstr "entrée pg_database manquante pour cette base de données\n" - -#~ msgid "moving from position %s to next member at file position %s\n" -#~ msgstr "déplacement de la position %s vers le prochain membre à la position %s du fichier\n" - -#~ msgid "no item ready\n" -#~ msgstr "aucun élément prêt\n" - -#~ msgid "no label definitions found for enum ID %u\n" -#~ msgstr "aucune définition de label trouvée pour l'ID enum %u\n" - -#~ msgid "now at file position %s\n" -#~ msgstr "maintenant en position %s du fichier\n" - -#~ msgid "option --index-collation-versions-unknown only works in binary upgrade mode" -#~ msgstr "l'option --index-collation-versions-unknown fonctionne seulement dans le mode de mise à jour binaire" - -#~ msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n" -#~ msgstr "" -#~ "les options « --inserts/--column-inserts » et « -o/--oids » ne\n" -#~ "peuvent pas être utilisées conjointement\n" - -#, c-format -#~ msgid "owner of aggregate function \"%s\" appears to be invalid" -#~ msgstr "le propriétaire de la fonction d'agrégat « %s » semble être invalide" - -#, c-format -#~ msgid "owner of data type \"%s\" appears to be invalid" -#~ msgstr "le propriétaire du type de données « %s » semble être invalide" - -#, c-format -#~ msgid "owner of function \"%s\" appears to be invalid" -#~ msgstr "le propriétaire de la fonction « %s » semble être invalide" - -#, c-format -#~ msgid "owner of operator \"%s\" appears to be invalid" -#~ msgstr "le propriétaire de l'opérateur « %s » semble être invalide" - -#, c-format -#~ msgid "owner of operator class \"%s\" appears to be invalid" -#~ msgstr "le propriétaire de la classe d'opérateur « %s » semble être invalide" - -#, c-format -#~ msgid "owner of operator family \"%s\" appears to be invalid" -#~ msgstr "le propriétaire de la famille d'opérateur « %s » semble être invalide" - -#, c-format -#~ msgid "owner of publication \"%s\" appears to be invalid" -#~ msgstr "le propriétaire de la publication « %s » semble être invalide" - -#, c-format -#~ msgid "owner of schema \"%s\" appears to be invalid" -#~ msgstr "le propriétaire du schéma « %s » semble être invalide" - -#, c-format -#~ msgid "owner of subscription \"%s\" appears to be invalid" -#~ msgstr "le propriétaire de la souscription « %s » semble être invalide" - -#, c-format -#~ msgid "owner of table \"%s\" appears to be invalid" -#~ msgstr "le propriétaire de la table « %s » semble être invalide" - -#~ msgid "parallel archiver" -#~ msgstr "archiveur en parallèle" - -#~ msgid "parallel_restore should not return\n" -#~ msgstr "parallel_restore ne devrait pas retourner\n" - -#~ msgid "pclose failed: %m" -#~ msgstr "échec de pclose : %m" - -#~ msgid "pclose failed: %s" -#~ msgstr "échec de pclose : %s" - -#~ msgid "query returned %d foreign server entry for foreign table \"%s\"\n" -#~ msgid_plural "query returned %d foreign server entries for foreign table \"%s\"\n" -#~ msgstr[0] "la requête a renvoyé %d entrée de serveur distant pour la table distante « %s »\n" -#~ msgstr[1] "la requête a renvoyé %d entrées de serveurs distants pour la table distante « %s »\n" - -#~ msgid "query returned %d row instead of one: %s\n" -#~ msgid_plural "query returned %d rows instead of one: %s\n" -#~ msgstr[0] "la requête a renvoyé %d ligne au lieu d'une seule : %s\n" -#~ msgstr[1] "la requête a renvoyé %d lignes au lieu d'une seule : %s\n" - -#~ msgid "query returned %d rows instead of one: %s\n" -#~ msgstr "la requête a renvoyé %d lignes au lieu d'une seule : %s\n" - -#~ msgid "query returned more than one (%d) pg_database entry for database \"%s\"\n" -#~ msgstr "" -#~ "la requête a renvoyé plusieurs (%d) entrées pg_database pour la base de\n" -#~ "données « %s »\n" - -#~ msgid "query returned no rows: %s\n" -#~ msgstr "la requête n'a renvoyé aucune ligne : %s\n" - -#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n" -#~ msgstr "" -#~ "la requête permettant d'obtenir les données de la séquence « %s » a renvoyé\n" -#~ "le nom « %s »\n" - -#~ msgid "query was: %s\n" -#~ msgstr "la requête était : %s\n" - -#~ msgid "read %lu byte into lookahead buffer\n" -#~ msgid_plural "read %lu bytes into lookahead buffer\n" -#~ msgstr[0] "lecture de %lu octet dans le tampon prévisionnel\n" -#~ msgstr[1] "lecture de %lu octets dans le tampon prévisionnel\n" - -#~ msgid "read TOC entry %d (ID %d) for %s %s\n" -#~ msgstr "lecture de l'entrée %d de la TOC (ID %d) pour %s %s\n" - -#~ msgid "reading extended statistics for table \"%s.%s\"\n" -#~ msgstr "lecture des statistiques étendues pour la table « %s.%s »\n" - -#, c-format -#~ msgid "reading foreign key constraints for table \"%s.%s\"" -#~ msgstr "lecture des contraintes de clés étrangères pour la table « %s.%s »" - -#, c-format -#~ msgid "reading indexes for table \"%s.%s\"" -#~ msgstr "lecture des index de la table « %s.%s »" - -#~ msgid "reading policies for table \"%s.%s\"" -#~ msgstr "lecture des politiques pour la table « %s.%s »" - -#~ msgid "reading row security enabled for table \"%s.%s\"" -#~ msgstr "lecture de l'activation de la sécurité niveau ligne pour la table « %s.%s »" - -#, c-format -#~ msgid "reading triggers for table \"%s.%s\"" -#~ msgstr "lecture des triggers pour la table « %s.%s »" - -#~ msgid "reconnection to database \"%s\" failed: %s" -#~ msgstr "reconnexion à la base de données « %s » échouée : %s" - -#~ msgid "reducing dependencies for %d\n" -#~ msgstr "réduction des dépendances pour %d\n" - -#~ msgid "requested %d byte, got %d from lookahead and %d from file\n" -#~ msgid_plural "requested %d bytes, got %d from lookahead and %d from file\n" -#~ msgstr[0] "%d octet requis, %d obtenu de « lookahead » et %d du fichier\n" -#~ msgstr[1] "%d octets requis, %d obtenus de « lookahead » et %d du fichier\n" - -#~ msgid "restoring large object OID %u\n" -#~ msgstr "restauration du « Large Object » d'OID %u\n" - -#, c-format -#~ msgid "rows-per-insert must be in range %d..%d" -#~ msgstr "le nombre de lignes par insertion doit être compris entre %d et %d" - -#~ msgid "saving default_toast_compression = %s" -#~ msgstr "sauvegarde de default_toast_compression = %s" - -#~ msgid "saving large object properties\n" -#~ msgstr "sauvegarde des propriétés des « Large Objects »\n" - -#~ msgid "schema with OID %u does not exist\n" -#~ msgstr "le schéma d'OID %u n'existe pas\n" - -#~ msgid "select() failed: %m" -#~ msgstr "échec de select() : %m" - -#~ msgid "select() failed: %s\n" -#~ msgstr "échec de select() : %s\n" - -#~ msgid "server version must be at least 7.3 to use schema selection switches\n" -#~ msgstr "" -#~ "le serveur doit être de version 7.3 ou supérieure pour utiliser les options\n" -#~ "de sélection du schéma\n" - -#~ msgid "setting owner and privileges for %s \"%s\"\n" -#~ msgstr "réglage du propriétaire et des droits pour %s « %s »\n" - -#~ msgid "setting owner and privileges for %s \"%s.%s\"\n" -#~ msgstr "réglage du propriétaire et des droits pour %s « %s.%s»\n" - -#~ msgid "skipping tar member %s\n" -#~ msgstr "omission du membre %s du tar\n" - -#~ msgid "sorter" -#~ msgstr "tri" - -#~ msgid "tar archiver" -#~ msgstr "archiveur tar" - -#~ msgid "terminated by user\n" -#~ msgstr "terminé par l'utilisateur\n" - -#~ msgid "transferring dependency %d -> %d to %d\n" -#~ msgstr "transfert de la dépendance %d -> %d vers %d\n" - -#~ msgid "unexpected end of file\n" -#~ msgstr "fin de fichier inattendu\n" - -#~ msgid "unrecognized collation provider: %s\n" -#~ msgstr "fournisseur de collationnement non reconnu : %s\n" - -#~ msgid "unrecognized command on communication channel: %s\n" -#~ msgstr "commande inconnue sur le canal de communucation: %s\n" - -#~ msgid "worker is terminating\n" -#~ msgstr "le worker est en cours d'arrêt\n" - -#~ msgid "worker process crashed: status %d\n" -#~ msgstr "crash du processus worker : statut %d\n" diff --git a/src/bin/pg_dump/po/it.po b/src/bin/pg_dump/po/it.po index 0df365b25d3ee..dd30baab99ba5 100644 --- a/src/bin/pg_dump/po/it.po +++ b/src/bin/pg_dump/po/it.po @@ -20,7 +20,7 @@ msgstr "" "Project-Id-Version: pg_dump (Postgresql) 11\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-09-26 08:19+0000\n" -"PO-Revision-Date: 2022-10-06 08:57+0200\n" +"PO-Revision-Date: 2023-09-05 08:21+0200\n" "Last-Translator: Domenico Sgarbossa \n" "Language-Team: https://github.com/dvarrazzo/postgresql-it\n" "Language: it\n" @@ -1451,7 +1451,7 @@ msgstr "" #: pg_dump.c:1011 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" -msgstr " -e, --extension=PATTERN esegue il dump solo delle estensioni specificate\n" +msgstr " -e, --extension=PATTERN esegue il dump solo delle estensioni specificate\n" #: pg_dump.c:1012 pg_dumpall.c:617 #, c-format @@ -1461,12 +1461,12 @@ msgstr " -E, --encoding=CODIFICA scarica i dati nella CODIFICA indicata\n" #: pg_dump.c:1013 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" -msgstr " -n, --schema=PATTERN esegue il dump solo degli schemi specificati\n" +msgstr " -n, --schema=PATTERN esegue il dump solo degli schemi specificati\n" #: pg_dump.c:1014 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" -msgstr " -N, --exclude-schema=PATTERN non esegue il dump degli schemi specificati\n" +msgstr " -N, --exclude-schema=PATTERN non esegue il dump degli schemi specificati\n" #: pg_dump.c:1015 #, c-format @@ -1497,7 +1497,7 @@ msgstr "-t, --table=PATTERN esegue il dump solo delle tabelle spec #: pg_dump.c:1020 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" -msgstr " -T, --exclude-table=PATTERN non esegue il dump delle tabelle specificate\n" +msgstr " -T, --exclude-table=PATTERN non esegue il dump delle tabelle specificate\n" #: pg_dump.c:1021 pg_dumpall.c:624 #, c-format @@ -1542,7 +1542,7 @@ msgstr "" #: pg_dump.c:1028 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" -msgstr " --exclude-table-data=PATTERN non esegue il dump dei dati per le tabelle specificate\n" +msgstr " --exclude-table-data=PATTERN non esegue il dump dei dati per le tabelle specificate\n" #: pg_dump.c:1029 pg_dumpall.c:630 #, c-format @@ -2447,7 +2447,7 @@ msgstr " -d, --dbname=NOME nome del database a cui connettersi\n" #: pg_restore.c:438 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" -msgstr " -f, --file=FILENAME nome del file di output (- per stdout)\n" +msgstr " -f, --file=FILENAME nome del file di output (- per stdout)\n" #: pg_restore.c:439 #, c-format diff --git a/src/bin/pg_dump/po/ja.po b/src/bin/pg_dump/po/ja.po index 42eadefaaea92..8ef1750d6f342 100644 --- a/src/bin/pg_dump/po/ja.po +++ b/src/bin/pg_dump/po/ja.po @@ -1,7 +1,7 @@ # pg_dump.po # Japanese message translation file for pg_dump # -# Copyright (C) 2011-2022 PostgreSQL Global Development Group +# Copyright (C) 2011-2024 PostgreSQL Global Development Group # # Shigehiro Honda , 2005. # @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_dump (PostgreSQL 16)\n" +"Project-Id-Version: pg_dump (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 09:36+0900\n" -"PO-Revision-Date: 2023-05-22 10:25+0900\n" +"POT-Creation-Date: 2025-02-28 10:06+0900\n" +"PO-Revision-Date: 2025-03-03 17:33+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -94,32 +94,47 @@ msgstr "圧縮アルゴリズム\"%s\"ã¯ãƒ¯ãƒ¼ã‚«ãƒ¼æ•°ã‚’å—ã‘付ã‘ã¾ã›ã‚“ msgid "compression algorithm \"%s\" does not support long-distance mode" msgstr "圧縮アルゴリズム\"%s\"ã¯é•·è·é›¢ãƒ¢ãƒ¼ãƒ‰ã‚’サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“" -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "䏿­£ãªãƒã‚¤ãƒŠãƒª\"%s\": %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "ãƒã‚¤ãƒŠãƒª\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "実行ã™ã‚‹\"%s\"ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "パス\"%s\"を絶対パス形å¼ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/exec.c:412 parallel.c:1609 +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "コマンド\"%s\"を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "コマンド\"%s\"ã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "コマンド\"%s\"ãŒãƒ‡ãƒ¼ã‚¿ã‚’è¿”å´ã—ã¾ã›ã‚“ã§ã—ãŸ" + +#: ../../common/exec.c:424 parallel.c:1609 #, c-format msgid "%s() failed: %m" msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "メモリä¸è¶³ã§ã™" @@ -134,6 +149,49 @@ msgstr "メモリä¸è¶³ã§ã™\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ãƒã‚¤ãƒ³ã‚¿ã‚’複製ã§ãã¾ã›ã‚“(内部エラー)。\n" +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "ファイル\"%s\"ã«å¯¾ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã‚’åŒæœŸã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ã“ã®ãƒ“ルドã§ã¯åŒæœŸæ–¹å¼\"%s\"をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_backup_directory.c:182 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + #: ../../common/wait_error.c:55 #, c-format msgid "command not executable" @@ -174,227 +232,247 @@ msgstr "オプション\"%2$s\"ã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\"" msgid "%s must be in range %d..%d" msgstr "%sã¯%d..%dã®ç¯„囲ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: common.c:132 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "èªè­˜ã§ããªã„åŒæœŸæ–¹å¼: %s" + +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "シェルコマンドã®å¼•æ•°ã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "データベースåã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + +#: common.c:135 #, c-format msgid "reading extensions" msgstr "機能拡張を読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:135 +#: common.c:138 #, c-format msgid "identifying extension members" msgstr "æ©Ÿèƒ½æ‹¡å¼µã®æ§‹æˆè¦ç´ ã‚’特定ã—ã¦ã„ã¾ã™" -#: common.c:138 +#: common.c:141 #, c-format msgid "reading schemas" msgstr "スキーマを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:147 +#: common.c:150 #, c-format msgid "reading user-defined tables" msgstr "ユーザー定義テーブルを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:152 +#: common.c:155 #, c-format msgid "reading user-defined functions" msgstr "ユーザー定義関数を読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:156 +#: common.c:159 #, c-format msgid "reading user-defined types" msgstr "ユーザー定義型を読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:160 +#: common.c:163 #, c-format msgid "reading procedural languages" msgstr "手続ã言語を読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:163 +#: common.c:166 #, c-format msgid "reading user-defined aggregate functions" msgstr "ユーザー定義集約関数を読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:166 +#: common.c:169 #, c-format msgid "reading user-defined operators" msgstr "ユーザー定義演算å­ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:169 +#: common.c:172 #, c-format msgid "reading user-defined access methods" msgstr "ユーザー定義アクセスメソッドを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:172 +#: common.c:175 #, c-format msgid "reading user-defined operator classes" msgstr "ユーザー定義演算å­ã‚¯ãƒ©ã‚¹ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:175 +#: common.c:178 #, c-format msgid "reading user-defined operator families" msgstr "ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©æ¼”ç®—å­æ—を読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:178 +#: common.c:181 #, c-format msgid "reading user-defined text search parsers" msgstr "ユーザー定義ã®ãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢ãƒ‘ーサを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:181 +#: common.c:184 #, c-format msgid "reading user-defined text search templates" msgstr "ユーザー定義ã®ãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢ãƒ†ãƒ³ãƒ—レートを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:184 +#: common.c:187 #, c-format msgid "reading user-defined text search dictionaries" msgstr "ユーザー定義ã®ãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢è¾žæ›¸ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:187 +#: common.c:190 #, c-format msgid "reading user-defined text search configurations" msgstr "ユーザー定義ã®ãƒ†ã‚­ã‚¹ãƒˆæ¤œç´¢è¨­å®šã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:190 +#: common.c:193 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "ユーザー定義ã®å¤–部データラッパーを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:193 +#: common.c:196 #, c-format msgid "reading user-defined foreign servers" msgstr "ユーザー定義ã®å¤–部サーãƒãƒ¼ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:196 +#: common.c:199 #, c-format msgid "reading default privileges" msgstr "デフォルト権é™è¨­å®šã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:199 +#: common.c:202 #, c-format msgid "reading user-defined collations" msgstr "ユーザー定義ã®ç…§åˆé †åºã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:202 +#: common.c:205 #, c-format msgid "reading user-defined conversions" msgstr "ユーザー定義ã®å¤‰æ›ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:205 +#: common.c:208 #, c-format msgid "reading type casts" msgstr "型キャストを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:208 +#: common.c:211 #, c-format msgid "reading transforms" msgstr "変æ›ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:211 +#: common.c:214 #, c-format msgid "reading table inheritance information" msgstr "テーブル継承情報を読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:214 +#: common.c:217 #, c-format msgid "reading event triggers" msgstr "イベントトリガを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:218 +#: common.c:221 #, c-format msgid "finding extension tables" msgstr "機能拡張構æˆãƒ†ãƒ¼ãƒ–ルを探ã—ã¦ã„ã¾ã™" -#: common.c:222 +#: common.c:225 #, c-format msgid "finding inheritance relationships" msgstr "継承関係を検索ã—ã¦ã„ã¾ã™" -#: common.c:225 +#: common.c:228 #, c-format msgid "reading column info for interesting tables" msgstr "対象テーブルã®åˆ—情報を読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:228 +#: common.c:231 #, c-format msgid "flagging inherited columns in subtables" msgstr "å­ãƒ†ãƒ¼ãƒ–ルã®ç¶™æ‰¿åˆ—ã«ãƒ•ラグを設定ã—ã¦ã„ã¾ã™" -#: common.c:231 +#: common.c:234 #, c-format msgid "reading partitioning data" msgstr "パーティション情報を読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:234 +#: common.c:237 #, c-format msgid "reading indexes" msgstr "インデックスを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:237 +#: common.c:240 #, c-format msgid "flagging indexes in partitioned tables" msgstr "パーティション親テーブルã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã«ãƒ•ラグを設定ã—ã¦ã„ã¾ã™" -#: common.c:240 +#: common.c:243 #, c-format msgid "reading extended statistics" msgstr "拡張統計情報を読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:243 +#: common.c:246 #, c-format msgid "reading constraints" msgstr "制約を読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:246 +#: common.c:249 #, c-format msgid "reading triggers" msgstr "トリガを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:249 +#: common.c:252 #, c-format msgid "reading rewrite rules" msgstr "æ›¸ãæ›ãˆãƒ«ãƒ¼ãƒ«ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:252 +#: common.c:255 #, c-format msgid "reading policies" msgstr "ãƒãƒªã‚·ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:255 +#: common.c:258 #, c-format msgid "reading publications" msgstr "パブリケーションを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:258 +#: common.c:261 #, c-format msgid "reading publication membership of tables" msgstr "テーブルã®ãƒ‘ブリケーションã¸ã®æ‰€å±žã‚’読ã¿å–ã£ã¦ã„ã¾ã™" -#: common.c:261 +#: common.c:264 #, c-format msgid "reading publication membership of schemas" msgstr "スキーマã®ãƒ‘ブリケーションã¸ã®æ‰€å±žã‚’読ã¿å–ã£ã¦ã„ã¾ã™" -#: common.c:264 +#: common.c:267 #, c-format msgid "reading subscriptions" msgstr "サブスクリプションを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: common.c:327 +#: common.c:270 +#, c-format +msgid "reading subscription membership of tables" +msgstr "テーブルã®ã‚µãƒ–スクリプションã¸ã®æ‰€å±žã‚’読ã¿å–ã£ã¦ã„ã¾ã™" + +#: common.c:333 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "å¥å…¨æ€§æ¤œæŸ»ã«å¤±æ•—ã—ã¾ã—ãŸã€ãƒ†ãƒ¼ãƒ–ル\"%2$s\"(OID %3$u)ã®è¦ªã®OID %1$uãŒã‚りã¾ã›ã‚“" -#: common.c:369 +#: common.c:375 #, c-format msgid "invalid number of parents %d for table \"%s\"" msgstr "テーブル\"%2$s\"用ã®è¦ªãƒ†ãƒ¼ãƒ–ãƒ«ã®æ•°%1$dãŒä¸æ­£ã§ã™" -#: common.c:1049 +#: common.c:1098 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "数値é…列\"%s\"ã®ãƒ‘ースã«å¤±æ•—ã—ã¾ã—ãŸ: è¦ç´ ãŒå¤šã™ãŽã¾ã™" -#: common.c:1061 +#: common.c:1110 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "数値é…列\"%s\"ã®ãƒ‘ースã«å¤±æ•—ã—ã¾ã—ãŸ: 数値ã«ä¸æ­£ãªæ–‡å­—ãŒå«ã¾ã‚Œã¦ã„ã¾ã™" @@ -424,15 +502,20 @@ msgstr "データを伸張ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" msgid "could not close compression library: %s" msgstr "圧縮ライブラリをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608 -#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140 +#: compress_gzip.c:266 compress_lz4.c:608 compress_lz4.c:628 compress_lz4.c:647 #, c-format msgid "could not read from input file: %s" msgstr "入力ファイルã‹ã‚‰èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s" -#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142 -#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558 -#: pg_backup_tar.c:725 pg_backup_tar.c:748 +#: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 +#: compress_zstd.c:374 pg_backup_custom.c:651 +#, c-format +msgid "could not read from input file: %m" +msgstr "入力ファイルã‹ã‚‰èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:141 +#: compress_zstd.c:372 pg_backup_custom.c:649 pg_backup_directory.c:565 +#: pg_backup_tar.c:740 pg_backup_tar.c:763 #, c-format msgid "could not read from input file: end of file" msgstr "入力ファイルã‹ã‚‰èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: ファイルã®çµ‚端" @@ -472,27 +555,72 @@ msgstr "展開を終了ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" msgid "could not set compression parameter \"%s\": %s" msgstr "圧縮パラメータ\"%s\"を設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490 -#: compress_zstd.c:498 +#: compress_zstd.c:78 compress_zstd.c:232 compress_zstd.c:491 +#: compress_zstd.c:499 #, c-format msgid "could not initialize compression library" msgstr "åœ§ç¸®ãƒ©ã‚¤ãƒ–ãƒ©ãƒªã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: compress_zstd.c:194 compress_zstd.c:308 +#: compress_zstd.c:195 compress_zstd.c:309 #, c-format msgid "could not decompress data: %s" msgstr "データを伸張ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: compress_zstd.c:373 pg_backup_custom.c:655 -#, c-format -msgid "could not read from input file: %m" -msgstr "入力ファイルã‹ã‚‰èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: compress_zstd.c:501 +#: compress_zstd.c:502 #, c-format msgid "unhandled mode \"%s\"" msgstr "処ç†ã•れãªã„モード \"%s\"" +#: filter.c:49 +#, c-format +msgid "could not open filter file \"%s\": %m" +msgstr "フィルターファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: filter.c:72 +#, c-format +msgid "could not close filter file \"%s\": %m" +msgstr "フィルターファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: filter.c:165 +#, c-format +msgid "invalid format in filter read from standard input on line %d: %s" +msgstr "標準入力ã‹ã‚‰ã®ãƒ•ィルターã®èª­ã¿å–り中%d行目ã«ç„¡åйãªãƒ•ォーマット: %s" + +#: filter.c:168 +#, c-format +msgid "invalid format in filter read from file \"%s\" on line %d: %s" +msgstr "ファイル\"%s\"ã‹ã‚‰ã®ãƒ•ィルターã®èª­ã¿å–り中%d行目ã«ç„¡åйãªãƒ•ォーマット: %s" + +#: filter.c:241 filter.c:468 +#, c-format +msgid "could not read from filter file \"%s\": %m" +msgstr "フィルターファイル\"%s\"ã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: filter.c:244 +msgid "unexpected end of file" +msgstr "想定外ã®ãƒ•ァイル終端ã§ã™" + +#: filter.c:311 +msgid "missing object name pattern" +msgstr "オブジェクトåã®ãƒ‘ã‚¿ãƒ¼ãƒ³ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" + +#: filter.c:422 +msgid "no filter command found (expected \"include\" or \"exclude\")" +msgstr "フィルタコマンドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ (\"include\" ã¾ãŸã¯\"exclude\"ãŒæŒ‡å®šå¯èƒ½ã§ã™)" + +#: filter.c:433 +msgid "invalid filter command (expected \"include\" or \"exclude\")" +msgstr "䏿­£ãªãƒ•ィルターコマンド (\"include\"ã¾ãŸã¯\"exclude\"ãŒæŒ‡å®šå¯èƒ½ã§ã™)" + +#: filter.c:440 +msgid "missing filter object type" +msgstr "フィルターオブジェクトã®ã‚¿ã‚¤ãƒ—ãŒæŒ‡å®šã•れã¦ã¾ã›ã‚“" + +#: filter.c:447 +#, c-format +msgid "unsupported filter object type: \"%.*s\"" +msgstr "サãƒãƒ¼ãƒˆã•れãªã„フィルターオブジェクトタイプ: \"%.*s\"" + #: parallel.c:251 #, c-format msgid "%s() failed: error code %d" @@ -572,510 +700,515 @@ msgstr "pgpipe: ソケットを接続ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコー msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: 接続をå—ã‘付ã‘られã¾ã›ã‚“ã§ã—ãŸ: エラーコード %d" -#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603 +#: pg_backup_archiver.c:261 pg_backup_archiver.c:1706 #, c-format msgid "could not close output file: %m" msgstr "出力ファイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_archiver.c:320 pg_backup_archiver.c:324 +#: pg_backup_archiver.c:305 pg_backup_archiver.c:309 #, c-format msgid "archive items not in correct section order" msgstr "ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–é …ç›®ãŒæ­£ã—ã„セクション順ã§ã¯ã‚りã¾ã›ã‚“" -#: pg_backup_archiver.c:330 +#: pg_backup_archiver.c:315 #, c-format msgid "unexpected section code %d" msgstr "想定外ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚³ãƒ¼ãƒ‰ %d" -#: pg_backup_archiver.c:367 +#: pg_backup_archiver.c:352 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "ã“ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ファイル形å¼ã§ã®ä¸¦åˆ—リストアã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: pg_backup_archiver.c:371 +#: pg_backup_archiver.c:356 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "8.0 よりå¤ã„ pg_dump ã§ä½œã‚‰ã‚ŒãŸã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã§ã®ä¸¦åˆ—リストアã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: pg_backup_archiver.c:392 +#: pg_backup_archiver.c:377 #, c-format msgid "cannot restore from compressed archive (%s)" msgstr "圧縮アーカイブã‹ã‚‰å¾©å…ƒã§ãã¾ã›ã‚“ã§ã—ãŸ(%s)" -#: pg_backup_archiver.c:412 +#: pg_backup_archiver.c:397 #, c-format msgid "connecting to database for restore" msgstr "リストアã®ãŸã‚ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:414 +#: pg_backup_archiver.c:399 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "1.3よりå¤ã„アーカイブã§ã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¸ã®ç›´æŽ¥æŽ¥ç¶šã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: pg_backup_archiver.c:457 +#: pg_backup_archiver.c:442 #, c-format msgid "implied data-only restore" msgstr "暗黙的ã«ãƒ‡ãƒ¼ã‚¿ã®ã¿ã®ãƒªã‚¹ãƒˆã‚¢ã‚’行ã„ã¾ã™" -#: pg_backup_archiver.c:523 +#: pg_backup_archiver.c:510 #, c-format msgid "dropping %s %s" msgstr "%s %sを削除ã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:623 +#: pg_backup_archiver.c:642 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "æ–‡\"%s\"中㫠IF EXISTS を挿入ã™ã¹ã場所ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã§ã—ãŸ" -#: pg_backup_archiver.c:778 pg_backup_archiver.c:780 +#: pg_backup_archiver.c:828 pg_backup_archiver.c:830 #, c-format msgid "warning from original dump file: %s" msgstr "オリジナルã®ãƒ€ãƒ³ãƒ—ファイルã‹ã‚‰ã®è­¦å‘Š: %s" -#: pg_backup_archiver.c:795 +#: pg_backup_archiver.c:864 #, c-format msgid "creating %s \"%s.%s\"" msgstr "%s \"%s.%s\"を作æˆã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:798 +#: pg_backup_archiver.c:867 #, c-format msgid "creating %s \"%s\"" msgstr "%s \"%s\"を作æˆã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:848 +#: pg_backup_archiver.c:917 #, c-format msgid "connecting to new database \"%s\"" msgstr "æ–°ã—ã„データベース\"%s\"ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:875 +#: pg_backup_archiver.c:944 #, c-format msgid "processing %s" msgstr "%sを処ç†ã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:897 +#: pg_backup_archiver.c:966 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "テーブル\"%s.%s\"ã®ãƒ‡ãƒ¼ã‚¿ã‚’処ç†ã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:967 +#: pg_backup_archiver.c:1036 #, c-format msgid "executing %s %s" msgstr "%s %sを実行ã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:1008 +#: pg_backup_archiver.c:1096 #, c-format msgid "disabling triggers for %s" msgstr "%sã®ãƒˆãƒªã‚¬ã‚’無効ã«ã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:1034 +#: pg_backup_archiver.c:1122 #, c-format msgid "enabling triggers for %s" msgstr "%sã®ãƒˆãƒªã‚¬ã‚’有効ã«ã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:1099 +#: pg_backup_archiver.c:1187 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "内部エラー -- WriteDataã¯DataDumperルーãƒãƒ³ã®ã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆå¤–ã§ã¯å‘¼ã³å‡ºã›ã¾ã›ã‚“" -#: pg_backup_archiver.c:1287 +#: pg_backup_archiver.c:1379 #, c-format msgid "large-object output not supported in chosen format" msgstr "é¸æŠžã—ãŸå½¢å¼ã§ã¯ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ジェクト出力をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: pg_backup_archiver.c:1345 +#: pg_backup_archiver.c:1442 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "%d個ã®ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ジェクトをリストアã—ã¾ã—ãŸ" -#: pg_backup_archiver.c:1366 pg_backup_tar.c:668 +#: pg_backup_archiver.c:1469 pg_backup_tar.c:683 #, c-format msgid "restoring large object with OID %u" msgstr "OID %uã®ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ジェクトをリストアã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:1378 +#: pg_backup_archiver.c:1481 #, c-format msgid "could not create large object %u: %s" msgstr "ラージオブジェクト %u を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_backup_archiver.c:1383 pg_dump.c:3718 +#: pg_backup_archiver.c:1486 pg_dump.c:3889 #, c-format msgid "could not open large object %u: %s" msgstr "ラージオブジェクト %u をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_backup_archiver.c:1439 +#: pg_backup_archiver.c:1542 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "TOCファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸï¼š %m" -#: pg_backup_archiver.c:1467 +#: pg_backup_archiver.c:1570 #, c-format msgid "line ignored: %s" msgstr "行を無視ã—ã¾ã—ãŸ: %s" -#: pg_backup_archiver.c:1474 +#: pg_backup_archiver.c:1577 pg_backup_db.c:609 #, c-format msgid "could not find entry for ID %d" msgstr "ID %dã®ã‚¨ãƒ³ãƒˆãƒªãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: pg_backup_archiver.c:1497 pg_backup_directory.c:221 -#: pg_backup_directory.c:606 +#: pg_backup_archiver.c:1600 pg_backup_directory.c:219 +#: pg_backup_directory.c:613 #, c-format msgid "could not close TOC file: %m" msgstr "TOCファイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:593 pg_backup_directory.c:658 -#: pg_backup_directory.c:676 pg_dumpall.c:501 +#: pg_backup_archiver.c:1687 pg_backup_custom.c:152 pg_backup_directory.c:333 +#: pg_backup_directory.c:600 pg_backup_directory.c:666 +#: pg_backup_directory.c:684 pg_dumpall.c:506 #, c-format msgid "could not open output file \"%s\": %m" msgstr "出力ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_archiver.c:1586 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1689 pg_backup_custom.c:158 #, c-format msgid "could not open output file: %m" msgstr "出力ファイルをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_archiver.c:1669 +#: pg_backup_archiver.c:1772 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" msgstr[0] "ラージオブジェクトデータを%zuãƒã‚¤ãƒˆæ›¸ã出ã—ã¾ã—ãŸ(çµæžœã¯%d)" -#: pg_backup_archiver.c:1675 +#: pg_backup_archiver.c:1778 #, c-format msgid "could not write to large object: %s" msgstr "ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_backup_archiver.c:1765 +#: pg_backup_archiver.c:1868 #, c-format msgid "while INITIALIZING:" msgstr "åˆæœŸåŒ–中:" -#: pg_backup_archiver.c:1770 +#: pg_backup_archiver.c:1873 #, c-format msgid "while PROCESSING TOC:" msgstr "TOC処ç†ä¸­:" -#: pg_backup_archiver.c:1775 +#: pg_backup_archiver.c:1878 #, c-format msgid "while FINALIZING:" msgstr "終了処ç†ä¸­:" -#: pg_backup_archiver.c:1780 +#: pg_backup_archiver.c:1883 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "TOCエントリ%d; %u %u %s %s %s ã‹ã‚‰" -#: pg_backup_archiver.c:1856 +#: pg_backup_archiver.c:1959 #, c-format msgid "bad dumpId" msgstr "䏿­£ãªdumpId" -#: pg_backup_archiver.c:1877 +#: pg_backup_archiver.c:1980 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "TABLE DATAé …ç›®ã«å¯¾ã™ã‚‹ä¸æ­£ãªãƒ†ãƒ¼ãƒ–ルdumpId" -#: pg_backup_archiver.c:1969 +#: pg_backup_archiver.c:2072 #, c-format msgid "unexpected data offset flag %d" msgstr "想定外ã®ãƒ‡ãƒ¼ã‚¿ã‚ªãƒ•セットフラグ %d" -#: pg_backup_archiver.c:1982 +#: pg_backup_archiver.c:2085 #, c-format msgid "file offset in dump file is too large" msgstr "ダンプファイルã®ãƒ•ァイルオフセットãŒå¤§ãã™ãŽã¾ã™" -#: pg_backup_archiver.c:2093 +#: pg_backup_archiver.c:2196 #, c-format msgid "directory name too long: \"%s\"" msgstr "ディレクトリåãŒé•·ã™ãŽã¾ã™: \"%s\"" -#: pg_backup_archiver.c:2143 +#: pg_backup_archiver.c:2246 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "ディレクトリ\"%s\"ã¯æœ‰åйãªã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã§ã¯ãªã„よã†ã§ã™ï¼ˆ\"toc.dat\"ãŒã‚りã¾ã›ã‚“)" -#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816 -#: pg_backup_directory.c:206 pg_backup_directory.c:395 +#: pg_backup_archiver.c:2254 pg_backup_custom.c:169 pg_backup_custom.c:812 +#: pg_backup_directory.c:204 pg_backup_directory.c:396 #, c-format msgid "could not open input file \"%s\": %m" msgstr "入力ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_archiver.c:2158 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2261 pg_backup_custom.c:175 #, c-format msgid "could not open input file: %m" msgstr "入力ファイルをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_archiver.c:2164 +#: pg_backup_archiver.c:2267 #, c-format msgid "could not read input file: %m" msgstr "入力ファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_archiver.c:2166 +#: pg_backup_archiver.c:2269 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "入力ファイルãŒå°ã•ã™ãŽã¾ã™(読ã¿å–り%luã€æƒ³å®šã¯ 5)" -#: pg_backup_archiver.c:2198 +#: pg_backup_archiver.c:2301 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "入力ファイルãŒãƒ†ã‚­ã‚¹ãƒˆå½¢å¼ã®ãƒ€ãƒ³ãƒ—ã®ã‚ˆã†ã§ã™ã€‚psqlを使用ã—ã¦ãã ã•ã„。" -#: pg_backup_archiver.c:2204 +#: pg_backup_archiver.c:2307 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "å…¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ãŒæœ‰åйãªã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã§ã¯ãªã„よã†ã§ã™(å°ã•ã™ãŽã‚‹?)" -#: pg_backup_archiver.c:2210 +#: pg_backup_archiver.c:2313 #, c-format msgid "input file does not appear to be a valid archive" msgstr "å…¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ãŒæœ‰åйãªã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã§ã¯ãªã„よã†ã§ã™" -#: pg_backup_archiver.c:2219 +#: pg_backup_archiver.c:2322 #, c-format msgid "could not close input file: %m" msgstr "入力ファイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_archiver.c:2297 +#: pg_backup_archiver.c:2401 #, c-format msgid "could not open stdout for appending: %m" msgstr "標準出力を追記用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_archiver.c:2342 +#: pg_backup_archiver.c:2446 #, c-format msgid "unrecognized file format \"%d\"" msgstr "èªè­˜ä¸èƒ½ã®ãƒ•ァイル形å¼\"%d\"" -#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4448 +#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4648 #, c-format msgid "finished item %d %s %s" msgstr "é …ç›® %d %s %s ã®å‡¦ç†ãŒå®Œäº†" -#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4461 +#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4661 #, c-format msgid "worker process failed: exit code %d" msgstr "ワーカープロセスã®å‡¦ç†å¤±æ•—: 終了コード %d" -#: pg_backup_archiver.c:2548 +#: pg_backup_archiver.c:2653 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "エントリID%dã¯ç¯„囲外ã§ã™ -- ãŠãらãTOCã®ç ´æã§ã™" -#: pg_backup_archiver.c:2628 +#: pg_backup_archiver.c:2736 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "WITH OIDSã¨å®šç¾©ã•れãŸãƒ†ãƒ¼ãƒ–ルã®ãƒªã‚¹ãƒˆã‚¢ã¯ä»Šå¾Œã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: pg_backup_archiver.c:2710 +#: pg_backup_archiver.c:2818 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "èªè­˜ä¸èƒ½ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°\"%s\"" -#: pg_backup_archiver.c:2715 +#: pg_backup_archiver.c:2824 #, c-format msgid "invalid ENCODING item: %s" msgstr "䏿­£ãªENCODING項目: %s" -#: pg_backup_archiver.c:2733 +#: pg_backup_archiver.c:2842 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "䏿­£ãªSTDSTRINGS項目: %s" -#: pg_backup_archiver.c:2758 +#: pg_backup_archiver.c:2867 #, c-format msgid "schema \"%s\" not found" msgstr "スキーマ \"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_backup_archiver.c:2765 +#: pg_backup_archiver.c:2874 #, c-format msgid "table \"%s\" not found" msgstr "テーブル\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_backup_archiver.c:2772 +#: pg_backup_archiver.c:2881 #, c-format msgid "index \"%s\" not found" msgstr "インデックス\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_backup_archiver.c:2779 +#: pg_backup_archiver.c:2888 #, c-format msgid "function \"%s\" not found" msgstr "関数\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_backup_archiver.c:2786 +#: pg_backup_archiver.c:2895 #, c-format msgid "trigger \"%s\" not found" msgstr "トリガ\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_backup_archiver.c:3183 +#: pg_backup_archiver.c:3326 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "セッションユーザーを\"%s\"ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_backup_archiver.c:3315 +#: pg_backup_archiver.c:3458 +#, c-format +msgid "could not set \"search_path\" to \"%s\": %s" +msgstr "\"search_path\"ã‚’\"%s\"ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pg_backup_archiver.c:3519 #, c-format -msgid "could not set search_path to \"%s\": %s" -msgstr "search_pathã‚’\"%s\"ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not set \"default_tablespace\" to %s: %s" +msgstr "\"default_tablespace\"ã‚’\"%s\"ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_backup_archiver.c:3376 +#: pg_backup_archiver.c:3568 #, c-format -msgid "could not set default_tablespace to %s: %s" -msgstr "default_tablespaceã‚’\"%s\"ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not set \"default_table_access_method\": %s" +msgstr "\"default_table_access_method\"を設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_backup_archiver.c:3425 +#: pg_backup_archiver.c:3617 #, c-format -msgid "could not set default_table_access_method: %s" -msgstr "default_table_access_methodを設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not alter table access method: %s" +msgstr "テーブルアクセスメソッドを変更ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_backup_archiver.c:3530 +#: pg_backup_archiver.c:3718 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "オブジェクトタイプ%sã«å¯¾ã™ã‚‹æ‰€æœ‰è€…ã®è¨­å®šæ–¹æ³•ãŒã‚ã‹ã‚Šã¾ã›ã‚“" -#: pg_backup_archiver.c:3752 +#: pg_backup_archiver.c:4005 #, c-format msgid "did not find magic string in file header" msgstr "ファイルヘッダã«ãƒžã‚¸ãƒƒã‚¯æ–‡å­—列ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: pg_backup_archiver.c:3766 +#: pg_backup_archiver.c:4019 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "ファイルヘッダ内ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³(%d.%d)ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: pg_backup_archiver.c:3771 +#: pg_backup_archiver.c:4024 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "æ•´æ•°ã®ã‚µã‚¤ã‚º(%lu)ã«é–¢ã™ã‚‹å¥å…¨æ€§æ¤œæŸ»ãŒå¤±æ•—ã—ã¾ã—ãŸ" -#: pg_backup_archiver.c:3775 +#: pg_backup_archiver.c:4028 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "アーカイブã¯ã‚ˆã‚Šå¤§ããªã‚µã‚¤ã‚ºã®æ•´æ•°ã‚’æŒã¤ãƒžã‚·ãƒ³ã§ä½œæˆã•れã¾ã—ãŸã€ä¸€éƒ¨ã®æ“作ãŒå¤±æ•—ã™ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™" -#: pg_backup_archiver.c:3785 +#: pg_backup_archiver.c:4038 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "想定ã—ãŸå½¢å¼(%d)ã¯ãƒ•ァイル内ã«ã‚ã‚‹å½¢å¼(%d)ã¨ç•°ãªã‚Šã¾ã™" -#: pg_backup_archiver.c:3807 +#: pg_backup_archiver.c:4060 #, c-format msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available" msgstr "アーカイブã¯åœ§ç¸®ã•れã¦ã„ã¾ã™ãŒã€ã“ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã§ã¯åœ§ç¸®ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“ (%s)-- データã¯åˆ©ç”¨ã§ãã¾ã›ã‚“" -#: pg_backup_archiver.c:3843 +#: pg_backup_archiver.c:4096 #, c-format msgid "invalid creation date in header" msgstr "ヘッダ内ã®ä½œæˆæ—¥ä»˜ãŒä¸æ­£ã§ã™" -#: pg_backup_archiver.c:3977 +#: pg_backup_archiver.c:4230 #, c-format msgid "processing item %d %s %s" msgstr "é …ç›® %d %s %s を処ç†ã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:4052 +#: pg_backup_archiver.c:4315 #, c-format msgid "entering main parallel loop" msgstr "メインã®ä¸¦åˆ—ループã«å…¥ã‚Šã¾ã™" -#: pg_backup_archiver.c:4063 +#: pg_backup_archiver.c:4326 #, c-format msgid "skipping item %d %s %s" msgstr "é …ç›® %d %s %s をスキップã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:4072 +#: pg_backup_archiver.c:4335 #, c-format msgid "launching item %d %s %s" msgstr "é …ç›® %d %s %s ã«ç€æ‰‹ã—ã¾ã™" -#: pg_backup_archiver.c:4126 +#: pg_backup_archiver.c:4389 #, c-format msgid "finished main parallel loop" msgstr "メインã®ä¸¦åˆ—ループãŒçµ‚了ã—ã¾ã—ãŸ" -#: pg_backup_archiver.c:4162 +#: pg_backup_archiver.c:4425 #, c-format msgid "processing missed item %d %s %s" msgstr "やり残ã—é …ç›® %d %s %s を処ç†ã—ã¦ã„ã¾ã™" -#: pg_backup_archiver.c:4767 +#: pg_backup_archiver.c:4967 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "テーブル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€ã“ã®ãƒ†ãƒ¼ãƒ–ルã®ãƒ‡ãƒ¼ã‚¿ã¯å¾©å…ƒã•れã¾ã›ã‚“" -#: pg_backup_custom.c:380 pg_backup_null.c:147 +#: pg_backup_custom.c:376 pg_backup_null.c:143 #, c-format msgid "invalid OID for large object" msgstr "ラージオブジェクトã®OIDãŒä¸æ­£ã§ã™" -#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640 -#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019 +#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:636 +#: pg_backup_custom.c:870 pg_backup_tar.c:1029 pg_backup_tar.c:1034 #, c-format msgid "error during file seek: %m" msgstr "ファイルシーク中ã«ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã—ãŸ: %m" -#: pg_backup_custom.c:484 +#: pg_backup_custom.c:480 #, c-format msgid "data block %d has wrong seek position" msgstr "データブロック%dã®ã‚·ãƒ¼ã‚¯ä½ç½®ãŒé–“é•ã£ã¦ã„ã¾ã™" -#: pg_backup_custom.c:501 +#: pg_backup_custom.c:497 #, c-format msgid "unrecognized data block type (%d) while searching archive" msgstr "ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã®æŽ¢ç´¢ä¸­ã«èªè­˜ä¸èƒ½ã®ãƒ‡ãƒ¼ã‚¿ãƒ–ロックタイプ(%d)ãŒã‚りã¾ã—ãŸ" -#: pg_backup_custom.c:523 +#: pg_backup_custom.c:519 #, c-format msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file" msgstr "アーカイブ中ã«ãƒ–ロックID %d ãŒã‚りã¾ã›ã‚“ -- ãŠãらããƒªã‚¹ãƒˆã‚¢è¦æ±‚ãŒé †ä¸åŒã ã£ãŸãŸã‚ã§ã™ãŒã€å…¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚·ãƒ¼ã‚¯ä¸å¯ãªãŸã‚処ç†ã§ãã¾ã›ã‚“" -#: pg_backup_custom.c:528 +#: pg_backup_custom.c:524 #, c-format msgid "could not find block ID %d in archive -- possibly corrupt archive" msgstr "アーカイブ内ã«ãƒ–ロック ID %d ãŒã‚りã¾ã›ã‚“ã§ã—㟠-- ãŠãらãアーカイブãŒå£Šã‚Œã¦ã„ã¾ã™" -#: pg_backup_custom.c:535 +#: pg_backup_custom.c:531 #, c-format msgid "found unexpected block ID (%d) when reading data -- expected %d" msgstr "データ読ã¿è¾¼ã¿æ™‚ã«æƒ³å®šå¤–ã®ãƒ–ロックID(%d)ãŒã‚りã¾ã—㟠--想定ã¯%d" -#: pg_backup_custom.c:549 +#: pg_backup_custom.c:545 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "アーカイブã®ã‚Šã‚¹ãƒˆã‚¢ä¸­ã«èªè­˜ä¸å¯ã®ãƒ‡ãƒ¼ã‚¿ãƒ–ロックタイプ%dãŒã‚りã¾ã—ãŸ" -#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952 -#: pg_backup_tar.c:1017 +#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:945 +#: pg_backup_tar.c:1032 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "アーカイブファイルã®ã‚·ãƒ¼ã‚¯ä½ç½®ã‚’決定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_custom.c:771 pg_backup_custom.c:811 +#: pg_backup_custom.c:767 pg_backup_custom.c:807 #, c-format msgid "could not close archive file: %m" msgstr "アーカイブファイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_custom.c:794 +#: pg_backup_custom.c:790 #, c-format msgid "can only reopen input archives" msgstr "入力アーカイブã ã‘ãŒå†ã‚ªãƒ¼ãƒ—ンå¯èƒ½ã§ã™" -#: pg_backup_custom.c:801 +#: pg_backup_custom.c:797 #, c-format msgid "parallel restore from standard input is not supported" msgstr "標準入力ã‹ã‚‰ã®ä¸¦åˆ—リストアã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: pg_backup_custom.c:803 +#: pg_backup_custom.c:799 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "シークä¸å¯ã®ãƒ•ァイルã‹ã‚‰ã®ä¸¦åˆ—リストアã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: pg_backup_custom.c:819 +#: pg_backup_custom.c:815 #, c-format msgid "could not set seek position in archive file: %m" msgstr "アーカイブファイルã®ã‚·ãƒ¼ã‚¯ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_custom.c:898 +#: pg_backup_custom.c:894 #, c-format msgid "compressor active" msgstr "圧縮処ç†ãŒæœ‰åйã§ã™" @@ -1085,12 +1218,12 @@ msgstr "圧縮処ç†ãŒæœ‰åйã§ã™" msgid "could not get server_version from libpq" msgstr "libpqã‹ã‚‰server_versionã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_backup_db.c:53 pg_dumpall.c:1809 +#: pg_backup_db.c:53 pg_dumpall.c:1879 #, c-format msgid "aborting because of server version mismatch" msgstr "サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´ã®ãŸã‚処ç†ã‚’中断ã—ã¾ã™" -#: pg_backup_db.c:54 pg_dumpall.c:1810 +#: pg_backup_db.c:54 pg_dumpall.c:1880 #, c-format msgid "server version: %s; %s version: %s" msgstr "サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %sã€%s ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %s" @@ -1100,7 +1233,7 @@ msgstr "サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %sã€%s ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %s" msgid "already connected to a database" msgstr "データベースã¯ã™ã§ã«æŽ¥ç¶šæ¸ˆã¿ã§ã™" -#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1726 pg_dumpall.c:1828 msgid "Password: " msgstr "パスワード: " @@ -1114,18 +1247,18 @@ msgstr "データベースã¸ã®æŽ¥ç¶šãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" msgid "reconnection failed: %s" msgstr "å†æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dumpall.c:1683 -#: pg_dumpall.c:1767 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:788 pg_dump_sort.c:1213 +#: pg_dump_sort.c:1233 pg_dumpall.c:1753 pg_dumpall.c:1837 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895 +#: pg_backup_db.c:271 pg_dumpall.c:1942 pg_dumpall.c:1965 #, c-format msgid "query failed: %s" msgstr "å•ã„åˆã‚ã›ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" -#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896 +#: pg_backup_db.c:273 pg_dumpall.c:1943 pg_dumpall.c:1966 #, c-format msgid "Query was: %s" msgstr "å•ã„åˆã‚ã›: %s" @@ -1160,7 +1293,7 @@ msgstr "PQputCopyEnd ã‹ã‚‰ã‚¨ãƒ©ãƒ¼ãŒè¿”ã•れã¾ã—ãŸ: %s" msgid "COPY failed for table \"%s\": %s" msgstr "テーブル\"%s\"ã¸ã®ã‚³ãƒ”ーã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: pg_backup_db.c:521 pg_dump.c:2202 +#: pg_backup_db.c:521 pg_dump.c:2284 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "ファイル\"%s\"ã‚’COPYä¸­ã«æƒ³å®šã—ã¦ã„ãªã„余分ãªçµæžœãŒã‚りã¾ã—ãŸ" @@ -1173,160 +1306,155 @@ msgstr "データベーストランザクションを開始ã§ãã¾ã›ã‚“ã§ã— msgid "could not commit database transaction" msgstr "データベーストランザクションをコミットã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_backup_directory.c:155 +#: pg_backup_directory.c:153 #, c-format msgid "no output directory specified" msgstr "å‡ºåŠ›ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: pg_backup_directory.c:184 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "ディレクトリ\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: pg_backup_directory.c:188 +#: pg_backup_directory.c:186 #, c-format msgid "could not close directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_directory.c:194 +#: pg_backup_directory.c:192 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_directory.c:356 pg_backup_directory.c:499 -#: pg_backup_directory.c:537 +#: pg_backup_directory.c:357 pg_backup_directory.c:506 +#: pg_backup_directory.c:544 #, c-format msgid "could not write to output file: %s" msgstr "å‡ºåŠ›ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_backup_directory.c:374 +#: pg_backup_directory.c:375 #, c-format msgid "could not close data file: %m" msgstr "データファイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_directory.c:407 +#: pg_backup_directory.c:408 #, c-format msgid "could not close data file \"%s\": %m" msgstr "データファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_directory.c:448 +#: pg_backup_directory.c:455 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "ラージオブジェクトTOCファイル\"%s\"を入力用ã¨ã—ã¦ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_directory.c:459 +#: pg_backup_directory.c:466 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "ラージオブジェクトTOCファイル\"%s\"ã®ä¸­ã«ä¸æ­£ãªè¡ŒãŒã‚りã¾ã—ãŸ: \"%s\"" -#: pg_backup_directory.c:468 +#: pg_backup_directory.c:475 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "ラージオブジェクトTOCファイル\"%s\"ã®èª­ã¿å–り中ã«ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã—ãŸ" -#: pg_backup_directory.c:472 +#: pg_backup_directory.c:479 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "ラージオブジェクトTOCファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_directory.c:694 +#: pg_backup_directory.c:702 #, c-format msgid "could not close LO data file: %m" msgstr "ラージオブジェクトã®ãƒ‡ãƒ¼ã‚¿ãƒ•ァイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_directory.c:704 +#: pg_backup_directory.c:712 #, c-format msgid "could not write to LOs TOC file: %s" msgstr "ラージオブジェクトã®TOCãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_backup_directory.c:720 +#: pg_backup_directory.c:728 #, c-format msgid "could not close LOs TOC file: %m" msgstr "ラージオブジェクトã®TOCファイルをクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_directory.c:739 +#: pg_backup_directory.c:747 #, c-format msgid "file name too long: \"%s\"" msgstr "ファイルåãŒé•·ã™ãŽã¾ã™: \"%s\"" -#: pg_backup_null.c:74 +#: pg_backup_null.c:70 #, c-format msgid "this format cannot be read" msgstr "ã“ã®å½¢å¼ã¯èª­ã¿è¾¼ã‚ã¾ã›ã‚“" -#: pg_backup_tar.c:172 +#: pg_backup_tar.c:168 #, c-format msgid "could not open TOC file \"%s\" for output: %m" msgstr "TOCファイル\"%s\"を出力用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_tar.c:179 +#: pg_backup_tar.c:175 #, c-format msgid "could not open TOC file for output: %m" msgstr "TOCファイルを出力用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 -#: pg_backup_tar.c:405 pg_backup_tar.c:891 +#: pg_backup_tar.c:194 pg_backup_tar.c:330 pg_backup_tar.c:385 +#: pg_backup_tar.c:401 pg_backup_tar.c:906 #, c-format msgid "compression is not supported by tar archive format" msgstr "tar アーカイブ形å¼ã§ã¯åœ§ç¸®ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: pg_backup_tar.c:206 +#: pg_backup_tar.c:202 #, c-format msgid "could not open TOC file \"%s\" for input: %m" msgstr "TOCファイル\"%s\"を入力用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_tar.c:213 +#: pg_backup_tar.c:209 #, c-format msgid "could not open TOC file for input: %m" msgstr "TOCファイルを入力用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_tar.c:322 +#: pg_backup_tar.c:318 #, c-format msgid "could not find file \"%s\" in archive" msgstr "アーカイブ内ã«ãƒ•ァイル\"%s\"ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: pg_backup_tar.c:382 +#: pg_backup_tar.c:378 #, c-format msgid "could not generate temporary file name: %m" msgstr "一時ファイルåを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_backup_tar.c:623 +#: pg_backup_tar.c:619 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "想定外ã®COPYæ–‡ã®æ§‹æ–‡: \"%s\"" -#: pg_backup_tar.c:888 +#: pg_backup_tar.c:903 #, c-format msgid "invalid OID for large object (%u)" msgstr "ラージオブジェクトã®ä¸æ­£ãªOID(%u)" -#: pg_backup_tar.c:1033 +#: pg_backup_tar.c:1048 #, c-format msgid "could not close temporary file: %m" msgstr "一時ファイルを開ã‘ã¾ã›ã‚“ã§ã—ãŸï¼š %m" -#: pg_backup_tar.c:1036 +#: pg_backup_tar.c:1051 #, c-format msgid "actual file length (%lld) does not match expected (%lld)" msgstr "実際ã®ãƒ•ァイル長(%lld)ãŒæƒ³å®š(%lld)ã¨ä¸€è‡´ã—ã¾ã›ã‚“" -#: pg_backup_tar.c:1082 pg_backup_tar.c:1113 +#: pg_backup_tar.c:1097 pg_backup_tar.c:1128 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "tar アーカイブ内ã§ãƒ•ァイル\"%s\"ã®ãƒ˜ãƒƒãƒ€ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: pg_backup_tar.c:1100 +#: pg_backup_tar.c:1115 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "ã“ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–å½¢å¼ã§ã¯ã€é †ä¸åŒã§ã®ãƒ‡ãƒ¼ã‚¿ã®ãƒªã‚¹ãƒˆã‚¢ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“: \"%s\"ã¯å¿…è¦ã§ã™ãŒã€ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ファイル内ã§\"%s\"よりå‰ã«æ¥ã¾ã—ãŸã€‚" -#: pg_backup_tar.c:1147 +#: pg_backup_tar.c:1162 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "ä¸å®Œå…¨ãªtarヘッダãŒã‚りã¾ã—ãŸ(%luãƒã‚¤ãƒˆ)" -#: pg_backup_tar.c:1186 +#: pg_backup_tar.c:1201 #, c-format msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" msgstr "ç ´æã—ãŸtarヘッダãŒ%sã«ã‚りã¾ã—ãŸ(想定 %dã€ç®—å‡ºçµæžœ %d) ファイルä½ç½® %llu" @@ -1336,10 +1464,10 @@ msgstr "ç ´æã—ãŸtarヘッダãŒ%sã«ã‚りã¾ã—ãŸ(想定 %dã€ç®—å‡ºçµæžœ msgid "unrecognized section name: \"%s\"" msgstr "èªè­˜ä¸å¯ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³å: \"%s\"" -#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365 -#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398 -#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307 -#: pg_restore.c:321 +#: pg_backup_utils.c:55 pg_dump.c:694 pg_dump.c:711 pg_dumpall.c:370 +#: pg_dumpall.c:380 pg_dumpall.c:388 pg_dumpall.c:396 pg_dumpall.c:403 +#: pg_dumpall.c:413 pg_dumpall.c:488 pg_restore.c:307 pg_restore.c:323 +#: pg_restore.c:337 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" @@ -1349,82 +1477,82 @@ msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" msgid "out of on_exit_nicely slots" msgstr "on_exit_nicelyスロットãŒè¶³ã‚Šã¾ã›ã‚“" -#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305 +#: pg_dump.c:709 pg_dumpall.c:378 pg_restore.c:321 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™(先頭ã¯\"%s\")" -#: pg_dump.c:696 pg_restore.c:328 +#: pg_dump.c:728 pg_restore.c:344 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "-s/--schema-only 㨠-a/--data-only オプションã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: pg_dump.c:699 +#: pg_dump.c:731 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "-s/--schema-only 㨠--include-foreign-data オプションã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: pg_dump.c:702 +#: pg_dump.c:734 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "オプション --include-foreign-data ã¯ãƒ‘ラレルãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: pg_dump.c:705 pg_restore.c:331 +#: pg_dump.c:737 pg_restore.c:347 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "-c/--clean 㨠-a/--data-only オプションã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356 +#: pg_dump.c:740 pg_dumpall.c:408 pg_restore.c:375 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "--if-exists㯠-c/--clean ã®æŒ‡å®šãŒå¿…è¦ã§ã™" -#: pg_dump.c:715 +#: pg_dump.c:747 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "--on-conflict-do-nothingオプションã¯--insertsã€--rows-per-insert ã¾ãŸã¯ --column-insertsã‚’å¿…è¦ã¨ã—ã¾ã™" -#: pg_dump.c:744 +#: pg_dump.c:776 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "èªè­˜ã§ããªã„圧縮アルゴリズム: \"%s\"" -#: pg_dump.c:751 +#: pg_dump.c:783 #, c-format msgid "invalid compression specification: %s" msgstr "䏿­£ãªåœ§ç¸®æŒ‡å®š: %s" -#: pg_dump.c:764 +#: pg_dump.c:796 #, c-format msgid "compression option \"%s\" is not currently supported by pg_dump" msgstr "圧縮オプション\"%s\"ã¯ç¾æ™‚点ã§ã¯pg_dumpã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: pg_dump.c:776 +#: pg_dump.c:808 #, c-format msgid "parallel backup only supported by the directory format" msgstr "並列ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå½¢å¼ã§ã®ã¿ã‚µãƒãƒ¼ãƒˆã•れã¾ã™" -#: pg_dump.c:822 +#: pg_dump.c:854 #, c-format msgid "last built-in OID is %u" msgstr "最後ã®çµ„ã¿è¾¼ã¿OIDã¯%u" -#: pg_dump.c:831 +#: pg_dump.c:863 #, c-format msgid "no matching schemas were found" msgstr "マッãƒã™ã‚‹ã‚¹ã‚­ãƒ¼ãƒžãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_dump.c:848 +#: pg_dump.c:880 #, c-format msgid "no matching tables were found" msgstr "マッãƒã™ã‚‹ãƒ†ãƒ¼ãƒ–ルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_dump.c:876 +#: pg_dump.c:908 #, c-format msgid "no matching extensions were found" msgstr "åˆè‡´ã™ã‚‹æ©Ÿèƒ½æ‹¡å¼µãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_dump.c:1056 +#: pg_dump.c:1092 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1433,17 +1561,17 @@ msgstr "" "%sã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’テキストファイルã¾ãŸã¯ãã®ä»–ã®å½¢å¼ã§ãƒ€ãƒ³ãƒ—ã—ã¾ã™ã€‚\n" "\n" -#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433 +#: pg_dump.c:1093 pg_dumpall.c:636 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_dump.c:1058 +#: pg_dump.c:1094 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436 +#: pg_dump.c:1096 pg_dumpall.c:639 pg_restore.c:455 #, c-format msgid "" "\n" @@ -1452,12 +1580,12 @@ msgstr "" "\n" "一般的ãªã‚ªãƒ—ション;\n" -#: pg_dump.c:1061 +#: pg_dump.c:1097 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=ファイルå 出力ファイルã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®åå‰\n" -#: pg_dump.c:1062 +#: pg_dump.c:1098 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1466,22 +1594,22 @@ msgstr "" " -F, --format=c|d|t|p 出力ファイルã®å½¢å¼(custom, directory, tar, \n" " plain text(デフォルト))\n" -#: pg_dump.c:1064 +#: pg_dump.c:1100 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM ãƒ€ãƒ³ãƒ—æ™‚ã«æŒ‡å®šã—ãŸæ•°ã®ä¸¦åˆ—ジョブを使用\n" -#: pg_dump.c:1065 pg_dumpall.c:635 +#: pg_dump.c:1101 pg_dumpall.c:641 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose 冗長モード\n" -#: pg_dump.c:1066 pg_dumpall.c:636 +#: pg_dump.c:1102 pg_dumpall.c:642 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: pg_dump.c:1067 +#: pg_dump.c:1103 #, c-format msgid "" " -Z, --compress=METHOD[:DETAIL]\n" @@ -1490,22 +1618,29 @@ msgstr "" " -Z, --compress=æ–¹å¼[:詳細]\n" " 指定ã®ã¨ãŠã‚Šåœ§ç¸®\n" -#: pg_dump.c:1069 pg_dumpall.c:637 +#: pg_dump.c:1105 pg_dumpall.c:643 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=TIMEOUT テーブルロックをTIMEOUTå¾…ã£ã¦ã‹ã‚‰å¤±æ•—\n" -#: pg_dump.c:1070 pg_dumpall.c:664 +#: pg_dump.c:1106 pg_dumpall.c:671 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync 変更ã®ãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®å®‰å…¨ãªæ›¸ã出ã—を待機ã—ãªã„\n" -#: pg_dump.c:1071 pg_dumpall.c:638 +#: pg_dump.c:1107 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr "" +" --sync-method=METHOD ファイルをディスクã«åŒæœŸã•ã›ã‚‹æ–¹æ³•を指定\n" +"\n" + +#: pg_dump.c:1108 pg_dumpall.c:644 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: pg_dump.c:1073 pg_dumpall.c:639 +#: pg_dump.c:1110 pg_dumpall.c:645 #, c-format msgid "" "\n" @@ -1514,66 +1649,66 @@ msgstr "" "\n" "出力内容を制御ã™ã‚‹ãŸã‚ã®ã‚ªãƒ—ション:\n" -#: pg_dump.c:1074 pg_dumpall.c:640 +#: pg_dump.c:1111 pg_dumpall.c:646 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only データã®ã¿ã‚’ダンプã—ã€ã‚¹ã‚­ãƒ¼ãƒžã‚’ダンプã—ãªã„\n" -#: pg_dump.c:1075 +#: pg_dump.c:1112 #, c-format msgid " -b, --large-objects include large objects in dump\n" msgstr "" " -b, --large-objects ダンプã«ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ジェクトをå«ã‚ã‚‹\n" "\n" -#: pg_dump.c:1076 +#: pg_dump.c:1113 #, c-format msgid " --blobs (same as --large-objects, deprecated)\n" msgstr " --blobs (--large-objectsã«åŒã˜ã€éžæŽ¨å¥¨)\n" -#: pg_dump.c:1077 +#: pg_dump.c:1114 #, c-format msgid " -B, --no-large-objects exclude large objects in dump\n" msgstr " -B, --no-large-objects ダンプã«ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ジェクトをå«ã‚ãªã„\n" -#: pg_dump.c:1078 +#: pg_dump.c:1115 #, c-format msgid " --no-blobs (same as --no-large-objects, deprecated)\n" msgstr "" " --no-blobs (--no-large-objectsã«åŒã˜ã€éžæŽ¨å¥¨)\n" "\n" -#: pg_dump.c:1079 pg_restore.c:447 +#: pg_dump.c:1116 pg_restore.c:466 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean å†ä½œæˆå‰ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚ªãƒ–ジェクトを整ç†(削除)\n" -#: pg_dump.c:1080 +#: pg_dump.c:1117 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr " -C, --create ダンプã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç”Ÿæˆç”¨ã‚³ãƒžãƒ³ãƒ‰ã‚’å«ã‚ã‚‹\n" -#: pg_dump.c:1081 +#: pg_dump.c:1118 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr " -e, --extension=PATTERN 指定ã—ãŸæ©Ÿèƒ½æ‹¡å¼µã®ã¿ã‚’ダンプ\n" -#: pg_dump.c:1082 pg_dumpall.c:642 +#: pg_dump.c:1119 pg_dumpall.c:648 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=ENCODING 指定ã—ãŸç¬¦å·åŒ–æ–¹å¼ã§ãƒ‡ãƒ¼ã‚¿ã‚’ダンプ\n" -#: pg_dump.c:1083 +#: pg_dump.c:1120 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=SCHEMA 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒžã®ã¿ã‚’ダンプ\n" -#: pg_dump.c:1084 +#: pg_dump.c:1121 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=SCHEMA 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒžã‚’ダンプã—ãªã„\n" -#: pg_dump.c:1085 +#: pg_dump.c:1122 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1582,56 +1717,56 @@ msgstr "" " -O, --no-owner プレインテキスト形å¼ã§ã€ã‚ªãƒ–ジェクト所有権ã®\n" " 復元を行ã‚ãªã„\n" -#: pg_dump.c:1087 pg_dumpall.c:646 +#: pg_dump.c:1124 pg_dumpall.c:652 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only スキーマã®ã¿ã‚’ダンプã—ã€ãƒ‡ãƒ¼ã‚¿ã¯ãƒ€ãƒ³ãƒ—ã—ãªã„\n" -#: pg_dump.c:1088 +#: pg_dump.c:1125 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr "" " -S, --superuser=NAME プレインテキスト形å¼ã§ä½¿ç”¨ã™ã‚‹ã‚¹ãƒ¼ãƒ‘ーユーザーã®\n" " åå‰\n" -#: pg_dump.c:1089 +#: pg_dump.c:1126 #, c-format msgid " -t, --table=PATTERN dump only the specified table(s)\n" msgstr " -t, --table=PATTERN 指定ã—ãŸãƒ†ãƒ¼ãƒ–ル(群)ã®ã¿ã‚’ダンプ\n" -#: pg_dump.c:1090 +#: pg_dump.c:1127 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=PATTERN 指定ã—ãŸãƒ†ãƒ¼ãƒ–ルをダンプã—ãªã„\n" -#: pg_dump.c:1091 pg_dumpall.c:649 +#: pg_dump.c:1128 pg_dumpall.c:655 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges 権é™(grant/revoke)をダンプã—ãªã„\n" -#: pg_dump.c:1092 pg_dumpall.c:650 +#: pg_dump.c:1129 pg_dumpall.c:656 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade アップグレードユーティリティ専用\n" -#: pg_dump.c:1093 pg_dumpall.c:651 +#: pg_dump.c:1130 pg_dumpall.c:657 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr " --column-inserts åˆ—åæŒ‡å®šã®INSERTコマンドã§ãƒ‡ãƒ¼ã‚¿ã‚’ダンプ\n" -#: pg_dump.c:1094 pg_dumpall.c:652 +#: pg_dump.c:1131 pg_dumpall.c:658 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr "" " --disable-dollar-quoting ドル記å·ã«ã‚ˆã‚‹å¼•用符付ã‘ã‚’ç¦æ­¢ã€SQL標準ã®å¼•用符\n" " 付ã‘を使用\n" -#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464 +#: pg_dump.c:1132 pg_dumpall.c:659 pg_restore.c:483 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr " --disable-triggers データã®ã¿ã®ãƒªã‚¹ãƒˆã‚¢ã®éš›ã«ãƒˆãƒªã‚¬ã‚’無効化\n" -#: pg_dump.c:1096 +#: pg_dump.c:1133 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" @@ -1640,7 +1775,12 @@ msgstr "" " --enable-row-security 行セキュリティを有効化(ユーザーãŒã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãª\n" " 内容ã®ã¿ã‚’ダンプ)\n" -#: pg_dump.c:1098 +#: pg_dump.c:1135 +#, c-format +msgid " --exclude-extension=PATTERN do NOT dump the specified extension(s)\n" +msgstr " --exclude-extension=PATTERN 指定ã—ãŸæ©Ÿèƒ½æ‹¡å¼µã‚’ダンプã—ãªã„\n" + +#: pg_dump.c:1136 #, c-format msgid "" " --exclude-table-and-children=PATTERN\n" @@ -1651,12 +1791,12 @@ msgstr "" " 指定ã—ãŸãƒ†ãƒ¼ãƒ–ル(群)ã‚’å­ãƒ†ãƒ¼ãƒ–ルをå«ã‚ã¦\n" " ダンプã—ãªã„\n" -#: pg_dump.c:1101 +#: pg_dump.c:1139 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=PATTERN 指定ã—ãŸãƒ†ãƒ¼ãƒ–ルã®ãƒ‡ãƒ¼ã‚¿ã‚’ダンプã—ãªã„\n" -#: pg_dump.c:1102 +#: pg_dump.c:1140 #, c-format msgid "" " --exclude-table-data-and-children=PATTERN\n" @@ -1667,17 +1807,26 @@ msgstr "" " 指定ã—ãŸãƒ†ãƒ¼ãƒ–ル(群)ã®ãƒ‡ãƒ¼ã‚¿ã‚’å­ãƒ†ãƒ¼ãƒ–ルをå«ã‚ã¦\n" " ダンプã—ãªã„\n" -#: pg_dump.c:1105 pg_dumpall.c:655 +#: pg_dump.c:1143 pg_dumpall.c:661 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=NUM extra_float_digitsã®è¨­å®šã‚’上書ãã™ã‚‹\n" -#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466 +#: pg_dump.c:1144 +#, c-format +msgid "" +" --filter=FILENAME include or exclude objects and data from dump\n" +" based on expressions in FILENAME\n" +msgstr "" +" --filter=FILENAME ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚„ãƒ‡ãƒ¼ã‚¿ã®æŒ‡å®šã‚„除外を\n" +" FILENAMEã«è¨˜è¿°ã•れãŸå¼ã‚’ã‚‚ã¨ã«è¡Œã†\n" + +#: pg_dump.c:1146 pg_dumpall.c:663 pg_restore.c:487 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists オブジェクト削除ã®éš›ã« IF EXISTS を使用\n" -#: pg_dump.c:1107 +#: pg_dump.c:1147 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1688,91 +1837,91 @@ msgstr "" " PATTERNã«åˆè‡´ã™ã‚‹å¤–部サーãƒãƒ¼ä¸Šã®å¤–部テーブルã®\n" " データをå«ã‚ã‚‹\n" -#: pg_dump.c:1110 pg_dumpall.c:657 +#: pg_dump.c:1150 pg_dumpall.c:664 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts COPYã§ã¯ãªãINSERTコマンドã§ãƒ‡ãƒ¼ã‚¿ã‚’ダンプ\n" -#: pg_dump.c:1111 pg_dumpall.c:658 +#: pg_dump.c:1151 pg_dumpall.c:665 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root å­ãƒ†ãƒ¼ãƒ–ルをルートテーブル経由ã§ãƒ­ãƒ¼ãƒ‰ã™ã‚‹\n" -#: pg_dump.c:1112 pg_dumpall.c:659 +#: pg_dump.c:1152 pg_dumpall.c:666 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments コメントをダンプã—ãªã„\n" -#: pg_dump.c:1113 pg_dumpall.c:660 +#: pg_dump.c:1153 pg_dumpall.c:667 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications パブリケーションをダンプã—ãªã„\n" -#: pg_dump.c:1114 pg_dumpall.c:662 +#: pg_dump.c:1154 pg_dumpall.c:669 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels セキュリティラベルã®å‰²ã‚Šå½“ã¦ã‚’ダンプã—ãªã„\n" -#: pg_dump.c:1115 pg_dumpall.c:663 +#: pg_dump.c:1155 pg_dumpall.c:670 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions サブスクリプションをダンプã—ãªã„\n" -#: pg_dump.c:1116 pg_dumpall.c:665 +#: pg_dump.c:1156 pg_dumpall.c:672 #, c-format msgid " --no-table-access-method do not dump table access methods\n" msgstr " --no-table-access-method テーブルアクセスメソッドをダンプã—ãªã„\n" -#: pg_dump.c:1117 pg_dumpall.c:666 +#: pg_dump.c:1157 pg_dumpall.c:673 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces テーブルスペースã®å‰²ã‚Šå½“ã¦ã‚’ダンプã—ãªã„\n" -#: pg_dump.c:1118 pg_dumpall.c:667 +#: pg_dump.c:1158 pg_dumpall.c:674 #, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" msgstr " --no-toast-compression TOAST圧縮方å¼ã‚’ダンプã—ãªã„\n" -#: pg_dump.c:1119 pg_dumpall.c:668 +#: pg_dump.c:1159 pg_dumpall.c:675 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data éžãƒ­ã‚°ãƒ†ãƒ¼ãƒ–ルã®ãƒ‡ãƒ¼ã‚¿ã‚’ダンプã—ãªã„\n" -#: pg_dump.c:1120 pg_dumpall.c:669 +#: pg_dump.c:1160 pg_dumpall.c:676 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr " --on-conflict-do-nothing INSERTコマンドã«ON CONFLICT DO NOTHINGを付加ã™ã‚‹\n" -#: pg_dump.c:1121 pg_dumpall.c:670 +#: pg_dump.c:1161 pg_dumpall.c:677 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr "" " --quote-all-identifiers ã™ã¹ã¦ã®è­˜åˆ¥å­ã‚’キーワードã§ãªã‹ã£ãŸã¨ã—ã¦ã‚‚\n" " 引用符ã§å›²ã‚€\n" -#: pg_dump.c:1122 pg_dumpall.c:671 +#: pg_dump.c:1162 pg_dumpall.c:678 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NROWS INSERT毎ã®è¡Œæ•°; --insertsã‚’æš—é»™çš„ã«æŒ‡å®šã™ã‚‹\n" -#: pg_dump.c:1123 +#: pg_dump.c:1163 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr "" " --section=SECTION 指定ã—ãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³(pre-dataã€data ã¾ãŸã¯\n" " post-data)をダンプã™ã‚‹\n" -#: pg_dump.c:1124 +#: pg_dump.c:1164 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr " --serializable-deferrable ダンプを異常ãªã実行ã§ãるよã†ã«ãªã‚‹ã¾ã§å¾…機\n" -#: pg_dump.c:1125 +#: pg_dump.c:1165 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT ãƒ€ãƒ³ãƒ—ã«æŒ‡å®šã®ã‚¹ãƒŠãƒƒãƒ—ショットを使用ã™ã‚‹\n" -#: pg_dump.c:1126 pg_restore.c:476 +#: pg_dump.c:1166 pg_restore.c:497 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" @@ -1781,7 +1930,7 @@ msgstr "" " --strict-names テーブル/スキーマã®å¯¾è±¡ãƒ‘ã‚¿ãƒ¼ãƒ³ãŒæœ€ä½Žã§ã‚‚\n" " 一ã¤ã®å®Ÿä½“ã«ãƒžãƒƒãƒã™ã‚‹ã“ã¨ã‚’å¿…é ˆã¨ã™ã‚‹\n" -#: pg_dump.c:1128 +#: pg_dump.c:1168 #, c-format msgid "" " --table-and-children=PATTERN dump only the specified table(s), including\n" @@ -1790,7 +1939,7 @@ msgstr "" " --table-and-children=PATTERN 指定ã—ãŸãƒ†ãƒ¼ãƒ–ル(群)ã®ã¿ã‚’å­ãƒ†ãƒ¼ãƒ–ル\n" " ã‚’å«ã‚ã¦ãƒ€ãƒ³ãƒ—\n" -#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478 +#: pg_dump.c:1170 pg_dumpall.c:679 pg_restore.c:500 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1801,7 +1950,7 @@ msgstr "" " 所有者をセットã™ã‚‹éš›ã€ALTER OWNERコマンドã®ä»£ã‚り\n" " ã«SET SESSION AUTHORIZATIONコマンドを使用ã™ã‚‹\n" -#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482 +#: pg_dump.c:1174 pg_dumpall.c:683 pg_restore.c:504 #, c-format msgid "" "\n" @@ -1810,46 +1959,46 @@ msgstr "" "\n" "接続オプション:\n" -#: pg_dump.c:1135 +#: pg_dump.c:1175 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAME ダンプã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\n" -#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483 +#: pg_dump.c:1176 pg_dumpall.c:685 pg_restore.c:505 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HOSTNAME データベースサーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚½ã‚±ãƒƒãƒˆ\n" " ディレクトリ\n" -#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484 +#: pg_dump.c:1177 pg_dumpall.c:687 pg_restore.c:506 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆç•ªå·\n" -#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485 +#: pg_dump.c:1178 pg_dumpall.c:688 pg_restore.c:507 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAME 指定ã—ãŸãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§æŽ¥ç¶š\n" -#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486 +#: pg_dump.c:1179 pg_dumpall.c:689 pg_restore.c:508 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰å…¥åŠ›ã‚’è¦æ±‚ã—ãªã„\n" -#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487 +#: pg_dump.c:1180 pg_dumpall.c:690 pg_restore.c:509 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" " -W, --password パスワードプロンプトを強制表示\n" " (自動的ã«è¡¨ç¤ºã•れるã¯ãš)\n" -#: pg_dump.c:1141 pg_dumpall.c:684 +#: pg_dump.c:1181 pg_dumpall.c:691 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLENAME ダンプã®å‰ã« SET ROLE を行ã†\n" -#: pg_dump.c:1143 +#: pg_dump.c:1183 #, c-format msgid "" "\n" @@ -1861,527 +2010,534 @@ msgstr "" "データベースåãŒæŒ‡å®šã•れãªã‹ã£ãŸå ´åˆã€ç’°å¢ƒå¤‰æ•°PGDATABASEãŒä½¿ç”¨ã•れã¾ã™\n" "\n" -#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494 +#: pg_dump.c:1185 pg_dumpall.c:695 pg_restore.c:516 #, c-format msgid "Report bugs to <%s>.\n" msgstr "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495 +#: pg_dump.c:1186 pg_dumpall.c:696 pg_restore.c:517 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_dump.c:1165 pg_dumpall.c:513 +#: pg_dump.c:1205 pg_dumpall.c:518 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "䏿­£ãªã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°\"%s\"ãŒæŒ‡å®šã•れã¾ã—ãŸ" -#: pg_dump.c:1303 +#: pg_dump.c:1353 #, c-format msgid "parallel dumps from standby servers are not supported by this server version" msgstr "スタンãƒã‚¤ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰ã®ä¸¦åˆ—ダンプã¯ã“ã®ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: pg_dump.c:1368 +#: pg_dump.c:1418 #, c-format msgid "invalid output format \"%s\" specified" msgstr "䏿­£ãªå‡ºåЛ形å¼\"%s\"ãŒæŒ‡å®šã•れã¾ã—ãŸ" -#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449 +#: pg_dump.c:1459 pg_dump.c:1515 pg_dump.c:1568 pg_dumpall.c:1516 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "修飾åãŒä¸é©åˆ‡ã§ã™(ドット区切りã®åå‰ãŒå¤šã™ãŽã¾ã™): %s" -#: pg_dump.c:1417 +#: pg_dump.c:1467 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "パターン\"%s\"ã«ãƒžãƒƒãƒã™ã‚‹ã‚¹ã‚­ãƒ¼ãƒžãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_dump.c:1470 +#: pg_dump.c:1520 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "パターン\"%s\"ã«åˆè‡´ã™ã‚‹æ©Ÿèƒ½æ‹¡å¼µãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_dump.c:1523 +#: pg_dump.c:1573 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "パターン\"%s\"ã«ãƒžãƒƒãƒã™ã‚‹å¤–部サーãƒãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_dump.c:1594 +#: pg_dump.c:1644 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "リレーションåãŒä¸é©åˆ‡ã§ã™(ドット区切りã®åå‰ãŒå¤šã™ãŽã¾ã™): %s" -#: pg_dump.c:1616 +#: pg_dump.c:1666 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "パターン \"%s\"ã«ãƒžãƒƒãƒã™ã‚‹ãƒ†ãƒ¼ãƒ–ルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_dump.c:1643 +#: pg_dump.c:1693 #, c-format msgid "You are currently not connected to a database." msgstr "ç¾åœ¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã—ã¦ã„ã¾ã›ã‚“。" -#: pg_dump.c:1646 +#: pg_dump.c:1696 #, c-format msgid "cross-database references are not implemented: %s" msgstr "データベース間ã®å‚ç…§ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“: %s" -#: pg_dump.c:2077 +#: pg_dump.c:2155 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "テーブル \"%s.%s\"ã®å†…容をダンプã—ã¦ã„ã¾ã™" -#: pg_dump.c:2183 +#: pg_dump.c:2265 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "テーブル\"%s\"ã®å†…容ã®ãƒ€ãƒ³ãƒ—ã«å¤±æ•—: PQgetCopyData()ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚" -#: pg_dump.c:2184 pg_dump.c:2194 +#: pg_dump.c:2266 pg_dump.c:2276 #, c-format msgid "Error message from server: %s" msgstr "サーãƒãƒ¼ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸: %s" -#: pg_dump.c:2185 pg_dump.c:2195 +#: pg_dump.c:2267 pg_dump.c:2277 #, c-format msgid "Command was: %s" msgstr "コマンド: %s" -#: pg_dump.c:2193 +#: pg_dump.c:2275 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "テーブル\"%s\"ã®å†…容ã®ãƒ€ãƒ³ãƒ—ã«å¤±æ•—: PQgetResult()ãŒå¤±æ•—ã—ã¾ã—ãŸã€‚" -#: pg_dump.c:2275 +#: pg_dump.c:2366 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "テーブル\"%s\"ã‹ã‚‰å–å¾—ã—ãŸãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®æ•°ãŒé–“é•ã£ã¦ã„ã¾ã™" -#: pg_dump.c:2973 +#: pg_dump.c:3068 #, c-format msgid "saving database definition" msgstr "データベース定義をä¿å­˜ã—ã¦ã„ã¾ã™" -#: pg_dump.c:3078 +#: pg_dump.c:3177 #, c-format msgid "unrecognized locale provider: %s" msgstr "èªè­˜ã§ããªã„ç…§åˆé †åºãƒ—ロãƒã‚¤ãƒ€: %s" -#: pg_dump.c:3429 +#: pg_dump.c:3538 #, c-format msgid "saving encoding = %s" msgstr "encoding = %s ã‚’ä¿å­˜ã—ã¦ã„ã¾ã™" -#: pg_dump.c:3454 +#: pg_dump.c:3563 #, c-format -msgid "saving standard_conforming_strings = %s" -msgstr "standard_conforming_strings = %s ã‚’ä¿å­˜ã—ã¦ã„ã¾ã™" +msgid "saving \"standard_conforming_strings = %s\"" +msgstr "\"standard_conforming_strings = %s\" ã‚’ä¿å­˜ã—ã¦ã„ã¾ã™" -#: pg_dump.c:3493 +#: pg_dump.c:3602 #, c-format msgid "could not parse result of current_schemas()" msgstr "current_schemas()ã®çµæžœã‚’パースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dump.c:3512 +#: pg_dump.c:3621 #, c-format -msgid "saving search_path = %s" -msgstr "search_path = %s ã‚’ä¿å­˜ã—ã¦ã„ã¾ã™" +msgid "saving \"search_path = %s\"" +msgstr "\"search_path = %s\" ã‚’ä¿å­˜ã—ã¦ã„ã¾ã™" -#: pg_dump.c:3549 +#: pg_dump.c:3657 #, c-format msgid "reading large objects" msgstr "ラージオブジェクトを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: pg_dump.c:3687 +#: pg_dump.c:3878 #, c-format -msgid "saving large objects" -msgstr "ラージオブジェクトをä¿å­˜ã—ã¦ã„ã¾ã™" +msgid "saving large objects \"%s\"" +msgstr "ラージオブジェクト\"%s\"ã‚’ä¿å­˜ã—ã¦ã„ã¾ã™" -#: pg_dump.c:3728 +#: pg_dump.c:3899 #, c-format msgid "error reading large object %u: %s" msgstr "ラージオブジェクト %u を読ã¿å–り中ã«ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã—ãŸ: %s" -#: pg_dump.c:3834 +#: pg_dump.c:4002 #, c-format msgid "reading row-level security policies" msgstr "行レベルセキュリティãƒãƒªã‚·ãƒ¼ã‚’読ã¿å–りã¾ã™" -#: pg_dump.c:3975 +#: pg_dump.c:4143 #, c-format msgid "unexpected policy command type: %c" msgstr "想定外ã®ãƒãƒªã‚·ã‚³ãƒžãƒ³ãƒ‰ã‚¿ã‚¤ãƒ—: \"%c\"" -#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11982 pg_dump.c:17854 -#: pg_dump.c:17856 pg_dump.c:18477 +#: pg_dump.c:4593 pg_dump.c:5151 pg_dump.c:12365 pg_dump.c:18250 +#: pg_dump.c:18252 pg_dump.c:18874 #, c-format msgid "could not parse %s array" msgstr "%sé…列をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dump.c:4613 +#: pg_dump.c:4807 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚¹ãƒ¼ãƒ‘ーユーザーã§ã¯ãªã„ãŸã‚ã€ã‚µãƒ–スクリプションã¯ãƒ€ãƒ³ãƒ—ã•れã¾ã›ã‚“" -#: pg_dump.c:5149 +#: pg_dump.c:5013 +#, c-format +msgid "subscription with OID %u does not exist" +msgstr "OID %uã®ã‚µãƒ–スクリプションã¯å­˜åœ¨ã—ã¾ã›ã‚“" + +#: pg_dump.c:5020 +#, c-format +msgid "failed sanity check, table with OID %u not found" +msgstr "å¥å…¨æ€§æ¤œæŸ»ã«å¤±æ•—ã—ã¾ã—ãŸã€OID %uã®ãƒ†ãƒ¼ãƒ–ルãŒã‚りã¾ã›ã‚“" + +#: pg_dump.c:5583 #, c-format msgid "could not find parent extension for %s %s" msgstr "%s %sã®è¦ªã¨ãªã‚‹æ©Ÿèƒ½æ‹¡å¼µãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dump.c:5294 +#: pg_dump.c:5728 #, c-format msgid "schema with OID %u does not exist" msgstr "OID %uã®ã‚¹ã‚­ãƒ¼ãƒžã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: pg_dump.c:6774 pg_dump.c:17118 +#: pg_dump.c:7210 pg_dump.c:17621 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "å¥å…¨æ€§æ¤œæŸ»ã«å¤±æ•—ã—ã¾ã—ãŸã€OID %2$u ã§ã‚るシーケンス㮠OID %1$u ã§ã‚る親テーブルãŒã‚りã¾ã›ã‚“" -#: pg_dump.c:6917 +#: pg_dump.c:7355 #, c-format msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found" msgstr "å¥å…¨æ€§æ¤œæŸ»ã«å¤±æ•—ã—ã¾ã—ãŸã€pg_partitioned_tableã«ã‚るテーブルOID %u ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_dump.c:7148 pg_dump.c:7415 pg_dump.c:7886 pg_dump.c:8550 pg_dump.c:8669 -#: pg_dump.c:8817 +#: pg_dump.c:7586 pg_dump.c:7860 pg_dump.c:8307 pg_dump.c:8921 pg_dump.c:9043 +#: pg_dump.c:9191 #, c-format msgid "unrecognized table OID %u" msgstr "èªè­˜ã§ããªã„テーブルOID %u" -#: pg_dump.c:7152 +#: pg_dump.c:7590 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "テーブル\"%s\"ã«å¯¾ã™ã‚‹æƒ³å®šå¤–ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãƒ‡ãƒ¼ã‚¿" -#: pg_dump.c:7647 +#: pg_dump.c:8092 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "å¥å…¨æ€§æ¤œæŸ»ã«å¤±æ•—ã—ã¾ã—ãŸã€OID %2$u ã§ã‚ã‚‹pg_rewriteエントリã®OID %1$u ã§ã‚る親テーブルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_dump.c:7938 -#, c-format -msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" -msgstr "å•ã„åˆã‚ã›ãŒãƒ†ãƒ¼ãƒ–ル\"%2$s\"上ã®å¤–部キートリガ\"%1$s\"ã®å‚照テーブルåã¨ã—ã¦NULLã‚’è¿”ã—ã¾ã—ãŸ(テーブルã®OID: %3$u)" - -#: pg_dump.c:8554 +#: pg_dump.c:8925 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "テーブル\"%s\"ã«å¯¾ã™ã‚‹æƒ³å®šå¤–ã®åˆ—データ" -#: pg_dump.c:8583 +#: pg_dump.c:8954 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "テーブル\"%s\"ã®åˆ—番å·ãŒä¸æ­£ã§ã™" -#: pg_dump.c:8631 +#: pg_dump.c:9005 #, c-format msgid "finding table default expressions" msgstr "テーブルã®ãƒ‡ãƒ•ォルトå¼ã‚’探ã—ã¦ã„ã¾ã™" -#: pg_dump.c:8673 +#: pg_dump.c:9047 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "テーブル\"%2$s\"用ã®adnumã®å€¤%1$dãŒä¸æ­£ã§ã™" -#: pg_dump.c:8767 +#: pg_dump.c:9141 #, c-format msgid "finding table check constraints" msgstr "テーブルã®ãƒã‚§ãƒƒã‚¯åˆ¶ç´„を探ã—ã¦ã„ã¾ã™" -#: pg_dump.c:8821 +#: pg_dump.c:9195 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "テーブル\"%2$s\"ã§æƒ³å®šã™ã‚‹æ¤œæŸ»åˆ¶ç´„ã¯%1$d個ã§ã—ãŸãŒã€%3$dã‚りã¾ã—ãŸ" -#: pg_dump.c:8825 +#: pg_dump.c:9199 #, c-format msgid "The system catalogs might be corrupted." msgstr "システムカタログãŒç ´æã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" -#: pg_dump.c:9515 +#: pg_dump.c:9889 #, c-format msgid "role with OID %u does not exist" msgstr "OID ㌠%u ã§ã‚るロールã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: pg_dump.c:9627 pg_dump.c:9656 +#: pg_dump.c:10001 pg_dump.c:10030 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "éžã‚µãƒãƒ¼ãƒˆã®pg_init_privsエントリ: %u %u %d" -#: pg_dump.c:10477 +#: pg_dump.c:10577 +#, c-format +msgid "missing metadata for large objects \"%s\"" +msgstr "ラージオブジェクト\"%s\"ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã›ã‚“" + +#: pg_dump.c:10860 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "データ型\"%s\"ã®typtypeãŒä¸æ­£ãªã‚ˆã†ã§ã™" -#: pg_dump.c:12051 +#: pg_dump.c:12434 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "関数\"%s\"ã®provolatileã®å€¤ãŒèªè­˜ã§ãã¾ã›ã‚“" -#: pg_dump.c:12101 pg_dump.c:13945 +#: pg_dump.c:12484 pg_dump.c:14380 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "関数\"%s\"ã®proparallel値ãŒèªè­˜ã§ãã¾ã›ã‚“" -#: pg_dump.c:12230 pg_dump.c:12336 pg_dump.c:12343 +#: pg_dump.c:12614 pg_dump.c:12720 pg_dump.c:12727 #, c-format msgid "could not find function definition for function with OID %u" msgstr "OID %uã®é–¢æ•°ã®é–¢æ•°å®šç¾©ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dump.c:12269 +#: pg_dump.c:12653 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "pg_cast.castfuncã¾ãŸã¯pg_cast.castmethodフィールドã®å€¤ãŒãŠã‹ã—ã„ã§ã™" -#: pg_dump.c:12272 +#: pg_dump.c:12656 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "pg_cast.castmethod フィールドã®å€¤ãŒãŠã‹ã—ã„ã§ã™" -#: pg_dump.c:12362 +#: pg_dump.c:12746 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "ãŠã‹ã—ãªå¤‰æ›å®šç¾©ã€trffromsql ã‹ trftosql ã®å°‘ãªãã¨ã‚‚一方ã¯éžã‚¼ãƒ­ã§ã‚ã‚‹ã¯ãšã§ã™" -#: pg_dump.c:12379 +#: pg_dump.c:12763 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "pg_cast.castmethod フィールドã®å€¤ãŒãŠã‹ã—ã„ã§ã™" -#: pg_dump.c:12400 +#: pg_dump.c:12784 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "pg_cast.castmethod フィールドã®å€¤ãŒãŠã‹ã—ã„ã§ã™" -#: pg_dump.c:12545 +#: pg_dump.c:12929 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "後置演算å­ã¯ä»Šå¾Œã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“(演算å­\"%s\")" -#: pg_dump.c:12715 +#: pg_dump.c:13099 #, c-format msgid "could not find operator with OID %s" msgstr "OID %sã®æ¼”ç®—å­ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dump.c:12783 +#: pg_dump.c:13167 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"ã®ä¸æ­£ãªã‚¿ã‚¤ãƒ—\"%1$c\"" -#: pg_dump.c:13440 +#: pg_dump.c:13841 pg_dump.c:13909 #, c-format msgid "unrecognized collation provider: %s" msgstr "èªè­˜ã§ããªã„ã®ç…§åˆé †åºãƒ—ロãƒã‚¤ãƒ€: %s" -#: pg_dump.c:13864 +#: pg_dump.c:13850 pg_dump.c:13857 pg_dump.c:13868 pg_dump.c:13878 +#: pg_dump.c:13893 +#, c-format +msgid "invalid collation \"%s\"" +msgstr "䏿­£ãªç…§åˆé †åº\"%s\"" + +#: pg_dump.c:14299 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "集約\"%s\"ã®aggfinalmodifyã®å€¤ãŒè­˜åˆ¥ã§ãã¾ã›ã‚“" -#: pg_dump.c:13920 +#: pg_dump.c:14355 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "集約\"%s\"ã®aggmfinalmodifyã®å€¤ãŒè­˜åˆ¥ã§ãã¾ã›ã‚“" -#: pg_dump.c:14637 +#: pg_dump.c:15072 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "デフォルト権é™è¨­å®šä¸­ã®èªè­˜ã§ããªã„オブジェクト型: %d" -#: pg_dump.c:14653 +#: pg_dump.c:15088 #, c-format msgid "could not parse default ACL list (%s)" msgstr "デフォルト㮠ACL リスト(%s)をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dump.c:14735 +#: pg_dump.c:15172 #, c-format msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "オブジェクト\"%3$s\"(%4$s)ã®åˆæœŸACLリスト(%1$s)ã¾ãŸã¯ãƒ‡ãƒ•ォルト値(%2$s)をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dump.c:14760 +#: pg_dump.c:15197 #, c-format msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "オブジェクト\"%3$s\"(%4$s)ã®ACLリスト(%1$s)ã¾ãŸã¯ãƒ‡ãƒ•ォルト値(%2$s)をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dump.c:15301 +#: pg_dump.c:15740 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "ビュー\"%s\"ã®å®šç¾©ã‚’å–り出ã™ãŸã‚ã®å•ã„åˆã‚ã›ãŒãƒ‡ãƒ¼ã‚¿ã‚’è¿”å´ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dump.c:15304 +#: pg_dump.c:15743 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "ビュー\"%s\"ã®å®šç¾©ã‚’å–り出ã™ãŸã‚ã®å•ã„åˆã‚ã›ãŒ2ã¤ä»¥ä¸Šã®å®šç¾©ã‚’è¿”å´ã—ã¾ã—ãŸ" -#: pg_dump.c:15311 +#: pg_dump.c:15750 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "ビュー\"%s\"ã®å®šç¾©ãŒç©ºã®ã‚ˆã†ã§ã™(é•·ã•ãŒ0)" -#: pg_dump.c:15395 +#: pg_dump.c:15835 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDSã¯ä»Šå¾Œã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“(テーブル\"%s\")" -#: pg_dump.c:16319 +#: pg_dump.c:16822 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "テーブル\"%2$s\"ã®åˆ—番å·%1$dã¯ä¸æ­£ã§ã™" -#: pg_dump.c:16397 +#: pg_dump.c:16900 #, c-format msgid "could not parse index statistic columns" msgstr "インデックス統計列をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dump.c:16399 +#: pg_dump.c:16902 #, c-format msgid "could not parse index statistic values" msgstr "インデックス統計値をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dump.c:16401 +#: pg_dump.c:16904 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "インデックス統計ã«å¯¾ã—ã¦åˆ—ã¨å€¤ã®æ•°ãŒåˆè‡´ã—ã¾ã›ã‚“" -#: pg_dump.c:16617 +#: pg_dump.c:17119 #, c-format msgid "missing index for constraint \"%s\"" msgstr "制約\"%s\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_dump.c:16852 +#: pg_dump.c:17354 #, c-format msgid "unrecognized constraint type: %c" msgstr "制約ã®ã‚¿ã‚¤ãƒ—ãŒè­˜åˆ¥ã§ãã¾ã›ã‚“: %c" -#: pg_dump.c:16953 pg_dump.c:17182 +#: pg_dump.c:17455 pg_dump.c:17685 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "シーケンス\"%s\"ã®ãƒ‡ãƒ¼ã‚¿ã‚’å¾—ã‚‹ãŸã‚ã®å•ã„åˆã‚ã›ãŒ%d行返å´ã—ã¾ã—ãŸ(想定ã¯1)" -#: pg_dump.c:16985 +#: pg_dump.c:17487 #, c-format msgid "unrecognized sequence type: %s" msgstr "èªè­˜ã•れãªã„シーケンスã®åž‹\"%s\"" -#: pg_dump.c:17274 -#, c-format -msgid "unexpected tgtype value: %d" -msgstr "想定外ã®tgtype値: %d" - -#: pg_dump.c:17346 -#, c-format -msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" -msgstr "テーブル\"%3$s\"上ã®ãƒˆãƒªã‚¬\"%2$s\"ã®å¼•数文字列(%1$s)ãŒä¸æ­£ã§ã™" - -#: pg_dump.c:17615 +#: pg_dump.c:18002 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "テーブル\"%2$s\"ã®ãƒ«ãƒ¼ãƒ«\"%1$s\"ã‚’å¾—ã‚‹ãŸã‚ã®å•ã„åˆã‚ã›ãŒå¤±æ•—ã—ã¾ã—ãŸ: é–“é•ã£ãŸè¡Œæ•°ãŒè¿”å´ã•れã¾ã—ãŸ" -#: pg_dump.c:17768 +#: pg_dump.c:18155 #, c-format msgid "could not find referenced extension %u" msgstr "è¦ªã®æ©Ÿèƒ½æ‹¡å¼µ%uãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pg_dump.c:17858 +#: pg_dump.c:18254 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "機能拡張ã«å¯¾ã—ã¦è¨­å®šã¨æ¡ä»¶ã®æ•°ãŒä¸€è‡´ã—ã¾ã›ã‚“" -#: pg_dump.c:17990 +#: pg_dump.c:18386 #, c-format msgid "reading dependency data" msgstr "データã®ä¾å­˜ãƒ‡ãƒ¼ã‚¿ã‚’読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: pg_dump.c:18076 +#: pg_dump.c:18472 #, c-format msgid "no referencing object %u %u" msgstr "å‚照元オブジェクト%u %uãŒã‚りã¾ã›ã‚“" -#: pg_dump.c:18087 +#: pg_dump.c:18483 #, c-format msgid "no referenced object %u %u" msgstr "å‚照先オブジェクト%u %uãŒã‚りã¾ã›ã‚“" -#: pg_dump_sort.c:422 +#: pg_dump.c:18908 pg_dump.c:18946 pg_dumpall.c:2011 pg_restore.c:551 +#: pg_restore.c:597 +#, c-format +msgid "%s filter for \"%s\" is not allowed" +msgstr "\"%2$s\"ã«å¯¾ã—ã¦ã¯%1$sフィルターを指定ã§ãã¾ã›ã‚“" + +#: pg_dump_sort.c:424 #, c-format msgid "invalid dumpId %d" msgstr "䏿­£ãªdumpId %d" -#: pg_dump_sort.c:428 +#: pg_dump_sort.c:430 #, c-format msgid "invalid dependency %d" msgstr "䏿­£ãªä¾å­˜é–¢ä¿‚ %d" -#: pg_dump_sort.c:661 +#: pg_dump_sort.c:594 #, c-format msgid "could not identify dependency loop" msgstr "ä¾å­˜é–¢ä¿‚ã®ãƒ«ãƒ¼ãƒ—ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dump_sort.c:1232 +#: pg_dump_sort.c:1209 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "次ã®ãƒ†ãƒ¼ãƒ–ルã®ä¸­ã§å¤–部キー制約ã®å¾ªç’°ãŒã‚りã¾ã™: " -#: pg_dump_sort.c:1236 pg_dump_sort.c:1256 -#, c-format -msgid " %s" -msgstr " %s" - -#: pg_dump_sort.c:1237 +#: pg_dump_sort.c:1214 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "--disable-triggersã®ä½¿ç”¨ã¾ãŸã¯ä¸€æ™‚çš„ãªåˆ¶ç´„ã®å‰Šé™¤ã‚’行ã‚ãšã«ã“ã®ãƒ€ãƒ³ãƒ—をリストアã™ã‚‹ã“ã¨ã¯ã§ããªã„ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: pg_dump_sort.c:1238 +#: pg_dump_sort.c:1215 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "ã“ã®å•題を回é¿ã™ã‚‹ãŸã‚ã«--data-onlyダンプã®ä»£ã‚りã«å®Œå…¨ãªãƒ€ãƒ³ãƒ—を使用ã™ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。" -#: pg_dump_sort.c:1250 +#: pg_dump_sort.c:1227 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "以下ã®é …ç›®ã®é–“ã®ä¾å­˜é–¢ä¿‚ã®ãƒ«ãƒ¼ãƒ—を解決ã§ãã¾ã›ã‚“ã§ã—ãŸ:" -#: pg_dumpall.c:230 +#: pg_dumpall.c:231 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "%2$sã«ã¯\"%1$s\"プログラムãŒå¿…è¦ã§ã™ãŒã€\"%3$s\"ã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚" -#: pg_dumpall.c:233 +#: pg_dumpall.c:234 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "\"%2$s\"ãŒãƒ—ログラム\"%1$s\"を見ã¤ã‘ã¾ã—ãŸãŒã€ã“れã¯%3$sã¨åŒã˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚" -#: pg_dumpall.c:382 +#: pg_dumpall.c:387 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "--exclude-database オプション㯠-g/--globals-onlyã€-r/--roles-only ã‚‚ã—ã㯠-t/--tablespaces-only ã¨ä¸€ç·’ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: pg_dumpall.c:390 +#: pg_dumpall.c:395 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "-g/--globals-onlyã¨-r/--roles-onlyオプションã¯åŒæ™‚ã«ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: pg_dumpall.c:397 +#: pg_dumpall.c:402 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "-g/--globals-onlyã¨-t/--tablespaces-onlyオプションã¯åŒæ™‚ã«ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: pg_dumpall.c:407 +#: pg_dumpall.c:412 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "-r/--roles-onlyã¨-t/--tablespaces-onlyオプションã¯åŒæ™‚ã«ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: pg_dumpall.c:469 pg_dumpall.c:1750 +#: pg_dumpall.c:474 pg_dumpall.c:1820 #, c-format msgid "could not connect to database \"%s\"" msgstr "データベース\"%s\"ã¸æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dumpall.c:481 +#: pg_dumpall.c:486 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2390,7 +2546,7 @@ msgstr "" "\"postgres\"ã¾ãŸã¯\"template1\"ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ\n" "代ã‚りã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’指定ã—ã¦ãã ã•ã„。" -#: pg_dumpall.c:629 +#: pg_dumpall.c:635 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2399,75 +2555,80 @@ msgstr "" "%sã¯PostgreSQLデータベースクラスタをSQLスクリプトファイルã«å±•é–‹ã—ã¾ã™ã€‚\n" "\n" -#: pg_dumpall.c:631 +#: pg_dumpall.c:637 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_dumpall.c:634 +#: pg_dumpall.c:640 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=ファイルå 出力ファイルå\n" -#: pg_dumpall.c:641 +#: pg_dumpall.c:647 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean å†ä½œæˆå‰ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’æ•´ç†ï¼ˆå‰Šé™¤ï¼‰\n" -#: pg_dumpall.c:643 +#: pg_dumpall.c:649 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr "" " -g, --globals-only グローãƒãƒ«ã‚ªãƒ–ジェクトã®ã¿ã‚’ダンプã—ã€\n" " データベースをダンプã—ãªã„\n" -#: pg_dumpall.c:644 pg_restore.c:456 +#: pg_dumpall.c:650 pg_restore.c:475 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰æ¨©ã®å¾©å…ƒã‚’çœç•¥\n" -#: pg_dumpall.c:645 +#: pg_dumpall.c:651 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr "" " -r, --roles-only ロールã®ã¿ã‚’ダンプ。\n" " データベースã¨ãƒ†ãƒ¼ãƒ–ル空間をダンプã—ãªã„\n" -#: pg_dumpall.c:647 +#: pg_dumpall.c:653 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr "" " -S, --superuser=NAME ダンプã§ä½¿ç”¨ã™ã‚‹ã‚¹ãƒ¼ãƒ‘ーユーザーã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã‚’\n" " 指定\n" -#: pg_dumpall.c:648 +#: pg_dumpall.c:654 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr "" " -t, --tablespaces-only テーブル空間ã®ã¿ã‚’ダンプ。データベースã¨ãƒ­ãƒ¼ãƒ«ã‚’\n" " ダンプã—ãªã„\n" -#: pg_dumpall.c:654 +#: pg_dumpall.c:660 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr " --exclude-database=PATTERN PATTERNã«åˆè‡´ã™ã‚‹åå‰ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’除外\n" -#: pg_dumpall.c:661 +#: pg_dumpall.c:662 +#, c-format +msgid " --filter=FILENAME exclude databases based on expressions in FILENAME\n" +msgstr " --filter=FILENAME FILENAMEã§æŒ‡å®šã•れãŸå¼ã«åŸºã¥ã„ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’除外ã™ã‚‹\n" + +#: pg_dumpall.c:668 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords ロールã®ãƒ‘スワードをダンプã—ãªã„\n" -#: pg_dumpall.c:677 +#: pg_dumpall.c:684 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=CONSTR 接続文字列を用ã„ãŸæŽ¥ç¶š\n" -#: pg_dumpall.c:679 +#: pg_dumpall.c:686 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAME 代替ã®ãƒ‡ãƒ•ォルトデータベースを指定\n" -#: pg_dumpall.c:686 +#: pg_dumpall.c:693 #, c-format msgid "" "\n" @@ -2479,97 +2640,112 @@ msgstr "" "-f/--file ãŒæŒ‡å®šã•れãªã„å ´åˆã€SQLã‚¹ã‚¯ãƒªãƒ—ãƒˆã¯æ¨™æº–å‡ºåŠ›ã«æ›¸ã出ã•れã¾ã™ã€‚\n" "\n" -#: pg_dumpall.c:828 +#: pg_dumpall.c:838 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "\"pg_\"ã§å§‹ã¾ã‚‹ãƒ­ãƒ¼ãƒ«åã¯ã‚¹ã‚­ãƒƒãƒ—ã•れã¾ã—ãŸ(%s)" -#: pg_dumpall.c:1050 +#. translator: %s represents a numeric role OID +#: pg_dumpall.c:1055 pg_dumpall.c:1113 pg_dumpall.c:1122 +#, c-format +msgid "found orphaned pg_auth_members entry for role %s" +msgstr "ロール %s ã«å¯¾ã™ã‚‹ pg_auth_members エントリãŒã‚りã¾ã—ãŸãŒã€ã“ã®ãƒ­ãƒ¼ãƒ«ã¯å­˜åœ¨ã—ã¾ã›ã‚“" + +#: pg_dumpall.c:1088 #, c-format msgid "could not find a legal dump ordering for memberships in role \"%s\"" msgstr "ロール\"%s\"ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚·ãƒƒãƒ—ã«å¯¾ã—ã¦æ­£å½“ãªãƒ€ãƒ³ãƒ—é †åºãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dumpall.c:1185 +#: pg_dumpall.c:1243 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "パラメータ\"%2$s\"ã®ACLリスト(%1$s)をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dumpall.c:1303 +#: pg_dumpall.c:1370 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "テーブル空間\"%2$s\"ã®ACLリスト(%1$s)をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dumpall.c:1510 +#: pg_dumpall.c:1577 #, c-format msgid "excluding database \"%s\"" msgstr "データベース\"%s\"を除外ã—ã¾ã™" -#: pg_dumpall.c:1514 +#: pg_dumpall.c:1581 #, c-format msgid "dumping database \"%s\"" msgstr "データベース\"%s\"をダンプã—ã¦ã„ã¾ã™" -#: pg_dumpall.c:1545 +#: pg_dumpall.c:1612 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "データベース\"%s\"ã®ãƒ€ãƒ³ãƒ—ãŒå¤±æ•—ã—ã¾ã—ãŸã€çµ‚了ã—ã¾ã™" -#: pg_dumpall.c:1551 +#: pg_dumpall.c:1618 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "出力ファイル\"%s\"ã‚’å†ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_dumpall.c:1592 +#: pg_dumpall.c:1662 #, c-format msgid "running \"%s\"" msgstr "\"%s\"を実行ã—ã¦ã„ã¾ã™" -#: pg_dumpall.c:1793 +#: pg_dumpall.c:1863 #, c-format msgid "could not get server version" msgstr "サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dumpall.c:1796 +#: pg_dumpall.c:1866 #, c-format msgid "could not parse server version \"%s\"" msgstr "サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_dumpall.c:1866 pg_dumpall.c:1889 +#: pg_dumpall.c:1936 pg_dumpall.c:1959 #, c-format msgid "executing %s" msgstr "%s を実行ã—ã¦ã„ã¾ã™" -#: pg_restore.c:313 +#: pg_dumpall.c:2031 +msgid "unsupported filter object" +msgstr "サãƒãƒ¼ãƒˆã•れã¦ã„ãªã„フィルターオブジェクト" + +#: pg_restore.c:329 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "-d/--dbnameã¨-f/--fileã®ã©ã¡ã‚‰ã‹ä¸€æ–¹ãŒæŒ‡å®šã•れã¦ã„ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_restore.c:320 +#: pg_restore.c:336 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "オプション-d/--dbnameã¨-f/--fileã¯åŒæ™‚ã«ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: pg_restore.c:338 +#: pg_restore.c:350 +#, c-format +msgid "options -1/--single-transaction and --transaction-size cannot be used together" +msgstr "オプション -1/--single-transaction 㨠--transaction-size ã¨ã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#: pg_restore.c:357 #, c-format msgid "options -C/--create and -1/--single-transaction cannot be used together" msgstr "オプション-C/--createã¨-1/--single-transactionã¨ã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: pg_restore.c:342 +#: pg_restore.c:361 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "--single-transaction ã¨è¤‡æ•°ã‚¸ãƒ§ãƒ–ã¯åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: pg_restore.c:380 +#: pg_restore.c:399 #, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "アーカイブ形å¼\"%s\"ãŒèªè­˜ã§ãã¾ã›ã‚“; \"c\"ã€\"d\"ã¾ãŸã¯\"t\"を指定ã—ã¦ãã ã•ã„" -#: pg_restore.c:419 +#: pg_restore.c:438 #, c-format msgid "errors ignored on restore: %d" msgstr "リストア中ã«ç„¡è¦–ã•れãŸã‚¨ãƒ©ãƒ¼æ•°: %d" -#: pg_restore.c:432 +#: pg_restore.c:451 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" @@ -2578,49 +2754,49 @@ msgstr "" "%sã¯pg_dumpã§ä½œæˆã—ãŸã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã‹ã‚‰PostgreSQLデータベースをリストアã—ã¾ã™ã€‚\n" "\n" -#: pg_restore.c:434 +#: pg_restore.c:453 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [OPTION]... [FILE]\n" -#: pg_restore.c:437 +#: pg_restore.c:456 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr " -d, --dbname=NAME 接続ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å\n" -#: pg_restore.c:438 +#: pg_restore.c:457 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr " -f, --file=FILENAME 出力ファイルå(- ã§æ¨™æº–出力)\n" -#: pg_restore.c:439 +#: pg_restore.c:458 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr "" " -F, --format=c|d|t ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ファイルã®å½¢å¼\n" " (自動的ã«è¨­å®šã•れるã¯ãšã§ã™ï¼‰\n" -#: pg_restore.c:440 +#: pg_restore.c:459 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list アーカイブã®TOCã®è¦ç´„を表示\n" -#: pg_restore.c:441 +#: pg_restore.c:460 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose 冗長モード\n" -#: pg_restore.c:442 +#: pg_restore.c:461 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã€çµ‚了ã—ã¾ã™\n" -#: pg_restore.c:443 +#: pg_restore.c:462 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã€çµ‚了ã—ã¾ã™\n" -#: pg_restore.c:445 +#: pg_restore.c:464 #, c-format msgid "" "\n" @@ -2629,32 +2805,32 @@ msgstr "" "\n" "リストア制御用ã®ã‚ªãƒ—ション:\n" -#: pg_restore.c:446 +#: pg_restore.c:465 #, c-format msgid " -a, --data-only restore only the data, no schema\n" -msgstr " -a, --data-only データã®ã¿ã‚’リストア。スキーマをリストアã—ã¾ã›ã‚“\n" +msgstr " -a, --data-only データã®ã¿ã‚’リストア。スキーマをリストアã—ãªã„\n" -#: pg_restore.c:448 +#: pg_restore.c:467 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create 対象ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’作æˆ\n" -#: pg_restore.c:449 +#: pg_restore.c:468 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr " -e, --exit-on-error エラー時ã«çµ‚了。デフォルトã¯ç¶™ç¶š\n" -#: pg_restore.c:450 +#: pg_restore.c:469 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NAME 指åã—ãŸã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’リストア\n" -#: pg_restore.c:451 +#: pg_restore.c:470 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr " -j, --jobs=NUM ãƒªã‚¹ãƒˆã‚¢æ™‚ã«æŒ‡å®šã—ãŸæ•°ã®ä¸¦åˆ—ジョブを使用\n" -#: pg_restore.c:452 +#: pg_restore.c:471 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" @@ -2663,106 +2839,120 @@ msgstr "" " -L, --use-list=FILENAME ã“ã®ãƒ•ァイルã®å†…容ã«å¾“ã£ã¦ SELECT ã‚„\n" " 出力ã®ã‚½ãƒ¼ãƒˆã‚’行ã„ã¾ã™\n" -#: pg_restore.c:454 +#: pg_restore.c:473 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr " -n, --schema=NAME 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒžã®ã‚ªãƒ–ジェクトã®ã¿ã‚’リストア\n" -#: pg_restore.c:455 +#: pg_restore.c:474 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" msgstr " -N, --exclude-schema=NAME 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒžã®ã‚ªãƒ–ジェクトã¯ãƒªã‚¹ãƒˆã‚¢ã—ãªã„\n" -#: pg_restore.c:457 +#: pg_restore.c:476 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=NAME(args) 指åã•れãŸé–¢æ•°ã‚’リストア\n" -#: pg_restore.c:458 +#: pg_restore.c:477 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" -msgstr " -s, --schema-only スキーマã®ã¿ã‚’リストア。データをリストアã—ã¾ã›ã‚“\n" +msgstr " -s, --schema-only スキーマã®ã¿ã‚’リストア。データをリストアã—ãªã„\n" -#: pg_restore.c:459 +#: pg_restore.c:478 #, c-format msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" msgstr " -S, --superuser=NAME トリガを無効ã«ã™ã‚‹ãŸã‚ã®ã‚¹ãƒ¼ãƒ‘ーユーザーã®åå‰\n" -#: pg_restore.c:460 +#: pg_restore.c:479 #, c-format msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" msgstr " -t, --table=NAME 指åã—ãŸãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³(テーブルã€ãƒ“ューãªã©)をリストア\n" -#: pg_restore.c:461 +#: pg_restore.c:480 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NAME 指åã—ãŸãƒˆãƒªã‚¬ã‚’リストア\n" -#: pg_restore.c:462 +#: pg_restore.c:481 #, c-format msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" msgstr " -x, --no-privileges アクセス権é™(grant/revoke)ã®å¾©å…ƒã‚’çœç•¥\n" -#: pg_restore.c:463 +#: pg_restore.c:482 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction å˜ä¸€ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¨ã—ã¦ãƒªã‚¹ãƒˆã‚¢\n" -#: pg_restore.c:465 +#: pg_restore.c:484 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security 行セキュリティを有効ã«ã—ã¾ã™\n" -#: pg_restore.c:467 +#: pg_restore.c:485 +#, c-format +msgid "" +" --filter=FILENAME restore or skip objects based on expressions\n" +" in FILENAME\n" +msgstr "" +" --filter=FILENAME オブジェクトã®å¾©å…ƒã¾ãŸã¯ã‚¹ã‚­ãƒƒãƒ—ã‚’FILENAMEã«\n" +" 記述ã•れã¦ã„ã‚‹å¼ã‚’å…ƒã«è¡Œã†\n" + +#: pg_restore.c:488 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments コメントをリストアã—ãªã„\n" -#: pg_restore.c:468 +#: pg_restore.c:489 #, c-format msgid "" " --no-data-for-failed-tables do not restore data of tables that could not be\n" " created\n" msgstr "" " --no-data-for-failed-tables 作æˆã§ããªã‹ã£ãŸãƒ†ãƒ¼ãƒƒãƒ–ルã®ãƒ‡ãƒ¼ã‚¿ã¯ãƒªã‚¹ãƒˆã‚¢\n" -" ã—ã¾ã›ã‚“\n" +" ã—ãªã„\n" -#: pg_restore.c:470 +#: pg_restore.c:491 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications パブリケーションをリストアã—ãªã„\n" -#: pg_restore.c:471 +#: pg_restore.c:492 #, c-format msgid " --no-security-labels do not restore security labels\n" -msgstr " --no-security-labels セキュリティラベルをリストアã—ã¾ã›ã‚“\n" +msgstr " --no-security-labels セキュリティラベルをリストアã—ãªã„\n" -#: pg_restore.c:472 +#: pg_restore.c:493 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions サブスクリプションをリストアã—ãªã„\n" -#: pg_restore.c:473 +#: pg_restore.c:494 #, c-format msgid " --no-table-access-method do not restore table access methods\n" msgstr " --no-table-access-method テーブルアクセスメソッドをリストアã—ãªã„\n" -#: pg_restore.c:474 +#: pg_restore.c:495 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" -msgstr " --no-tablespaces テーブル空間ã®å‰²ã‚Šå½“ã¦ã‚’リストアã—ã¾ã›ã‚“\n" +msgstr " --no-tablespaces テーブル空間ã®å‰²ã‚Šå½“ã¦ã‚’リストアã—ãªã„\n" -#: pg_restore.c:475 +#: pg_restore.c:496 #, c-format msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" msgstr " --section=SECTION 指定ã•れãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³ï¼ˆãƒ‡ãƒ¼ã‚¿å‰éƒ¨ã€ãƒ‡ãƒ¼ã‚¿ã€ãƒ‡ãƒ¼ã‚¿å¾Œéƒ¨ï¼‰ã‚’リストア\n" -#: pg_restore.c:488 +#: pg_restore.c:499 +#, c-format +msgid " --transaction-size=N commit after every N objects\n" +msgstr " --transaction-size=N Nオブジェクトã”ã¨ã«ã‚³ãƒŸãƒƒãƒˆã—ã¾ã™\n" + +#: pg_restore.c:510 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=ROLENAME リストアã«å…ˆç«‹ã£ã¦ SET ROLE ã—ã¾ã™\n" -#: pg_restore.c:490 +#: pg_restore.c:512 #, c-format msgid "" "\n" @@ -2773,7 +2963,7 @@ msgstr "" " -I, -n, -N, -P, -t, -T ãŠã‚ˆã³ --section オプションã¯çµ„ã¿åˆã‚ã›ã¦è¤‡æ•°å›ž\n" "指定ã™ã‚‹ã“ã¨ã§è¤‡æ•°ã®ã‚ªãƒ–ジェクトを指定ã§ãã¾ã™ã€‚\n" -#: pg_restore.c:493 +#: pg_restore.c:515 #, c-format msgid "" "\n" @@ -2783,3 +2973,64 @@ msgstr "" "\n" "入力ファイルåãŒæŒ‡å®šã•れãªã„å ´åˆã€æ¨™æº–入力ãŒä½¿ç”¨ã•れã¾ã™ã€‚\n" "\n" + +#~ msgid " --no-data do not dump data\n" +#~ msgstr " --no-data データをダンプã—ãªã„\n" + +#~ msgid " --no-data do not restore data\n" +#~ msgstr " --no-data データをリストアã—ãªã„\n" + +#~ msgid " --no-schema do not dump schema\n" +#~ msgstr " --no-schema スキーマをダンプã—ãªã„\n" + +#~ msgid " --no-schema do not restore schema\n" +#~ msgstr " --no-schema スキーマをリストアã—ãªã„\n" + +#~ msgid " --no-statistics do not dump statistics\n" +#~ msgstr " --no-statistics 統計情報をダンプã—ãªã„\n" + +#~ msgid " --no-statistics do not restore statistics\n" +#~ msgstr " --no-statistics 統計情報をリストアã—ãªã„\n" + +#~ msgid " --statistics-only dump only the statistics, not schema or data\n" +#~ msgstr "" +#~ " --statistics-only 統計情報ã®ã¿ã‚’ダンプã—ã€ã‚¹ã‚­ãƒ¼ãƒžã¾ãŸã¯ãƒ‡ãƒ¼ã‚¿ã‚’\n" +#~ " ダンプã—ãªã„\n" + +#~ msgid " --statistics-only restore only the statistics, not schema or data\n" +#~ msgstr " --statistics-only 統計情報ã®ã¿ã‚’リストアã€ã‚¹ã‚­ãƒ¼ãƒžã¾ãŸã¯ãƒ‡ãƒ¼ã‚¿ã‚’リストアã—ãªã„\n" + +#~ msgid " -s, --schema-only dump only the schema, no data or statistics\n" +#~ msgstr "" +#~ " -s, --schema-only スキーマã®ã¿ã‚’ダンプã—ã€ãƒ‡ãƒ¼ã‚¿ã¾ãŸã¯çµ±è¨ˆæƒ…報を\n" +#~ " ダンプã—ãªã„\n" + +#~ msgid "archive format \"%s\" is not supported; please use psql" +#~ msgstr "アーカイブ形å¼\"%s\"ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“ã€psqlを使ã£ã¦ãã ã•ã„" + +#~ msgid "attribute stats export query missing field '%s'" +#~ msgstr "属性統計情報ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã‚¯ã‚¨ãƒªã«ãƒ•ィールド '%s' ãŒã‚りã¾ã›ã‚“" + +#~ msgid "cannot dump statistics for relation kind '%c'" +#~ msgstr "リレーション種別\"%c\"ã®çµ±è¨ˆæƒ…å ±ã¯ãƒ€ãƒ³ãƒ—ã§ãã¾ã›ã‚“" + +#~ msgid "options --statistics-only and --no-statistics cannot be used together" +#~ msgstr "オプション --statistics-only 㨠--no-statistics ã¨ã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#~ msgid "options -a/--data-only and --no-data cannot be used together" +#~ msgstr "-a/--data-only 㨠--no-data オプションã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#~ msgid "options -a/--data-only and --statistics-only cannot be used together" +#~ msgstr "-a/--data-only 㨠--statistics-only オプションã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#~ msgid "options -s/--schema-only and --no-schema cannot be used together" +#~ msgstr "-s/--schema-only 㨠--no-schema オプションã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#~ msgid "options -s/--schema-only and --statistics-only cannot be used together" +#~ msgstr "-s/--schema-only ã¨--statistics-only オプションã¯åŒæ™‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#~ msgid "relation stats export query missing field '%s'" +#~ msgstr "リレーション統計情報ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã‚¯ã‚¨ãƒªã«ãƒ•ィールド '%s' ãŒã‚りã¾ã›ã‚“" + +#~ msgid "unrecognized sequence type: %d" +#~ msgstr "èªè­˜ã•れãªã„シーケンスã®åž‹: %d" diff --git a/src/bin/pg_dump/po/ka.po b/src/bin/pg_dump/po/ka.po index 08f245d4c2a21..104ff1fa43b1c 100644 --- a/src/bin/pg_dump/po/ka.po +++ b/src/bin/pg_dump/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_dump (PostgreSQL) 16\n" +"Project-Id-Version: pg_dump (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-19 11:20+0000\n" -"PO-Revision-Date: 2023-04-20 08:19+0200\n" +"POT-Creation-Date: 2024-08-27 16:52+0000\n" +"PO-Revision-Date: 2024-08-28 05:56+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -38,32 +38,99 @@ msgstr "დეტáƒáƒšáƒ”ბი: " msgid "hint: " msgstr "მინიშნებáƒ: " -#: ../../common/exec.c:172 +#: ../../common/compression.c:132 ../../common/compression.c:141 +#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420 +#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25 +#: compress_zstd.c:31 +#, c-format +msgid "this build does not support compression with %s" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ %s-ით შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ áƒ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: ../../common/compression.c:205 +msgid "found empty string where a compression option was expected" +msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრების მáƒáƒ’იერ მáƒáƒ¬áƒáƒ“ებული სტრიქáƒáƒœáƒ˜ ცáƒáƒ áƒ˜áƒ”ლიáƒ" + +#: ../../common/compression.c:244 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "შეკუმშვის უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" + +#: ../../common/compression.c:283 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრ \"%s\"-ს მნიშვნელáƒáƒ‘რსჭირდებáƒ" + +#: ../../common/compression.c:292 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "შემუმშვის პáƒáƒ áƒáƒ›áƒ”ტრ \"%s\"-ის ნიშვნელáƒáƒ‘რმთელი რიცხვი უნდრიყáƒáƒ¡" + +#: ../../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘რ\"%s\" ლáƒáƒ’იკურ მნიშვნელáƒáƒ‘áƒáƒ¡ უნდრწáƒáƒ áƒ›áƒáƒáƒ“გენდეს" + +#: ../../common/compression.c:379 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" შეკუმშვის დáƒáƒœáƒ” áƒáƒ  მიეთითებáƒ" + +#: ../../common/compression.c:386 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" შეკუმშვის დáƒáƒœáƒ” %d-სრდრ%d-ს შáƒáƒ áƒ˜áƒ¡ უნდრიყáƒáƒ¡ (ნáƒáƒ’ულისხებირ%d)" + +#: ../../common/compression.c:397 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სების რáƒáƒáƒ“ენáƒáƒ‘რáƒáƒ  მიეთითებáƒ" + +#: ../../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "შეკუმშვის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მს \"%s\" long-distance რეჟიმის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ \"%s\": %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "გáƒáƒ¡áƒáƒ¨áƒ•ებáƒáƒ“ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" პáƒáƒ•ნრშეუძლებელიáƒ" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "ბილიკის (\"%s\") áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ  ფáƒáƒ áƒ›áƒáƒ¨áƒ˜ áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:412 parallel.c:1609 +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "ბრძáƒáƒœáƒ”ბის (\"%s\") შესრულების შეცდáƒáƒ›áƒ: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "ბრძáƒáƒœáƒ”ბიდáƒáƒœ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "ბრძáƒáƒœáƒ”ბáƒáƒ› \"%s\" მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  დáƒáƒáƒ‘რუნáƒ" + +#: ../../common/exec.c:424 parallel.c:1609 #, c-format msgid "%s() failed: %m" msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" @@ -78,6 +145,49 @@ msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_backup_directory.c:182 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" + #: ../../common/wait_error.c:55 #, c-format msgid "command not executable" @@ -118,227 +228,247 @@ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პრmsgid "%s must be in range %d..%d" msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე" -#: common.c:132 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "უცნáƒáƒ‘ი სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი: %s" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის áƒáƒ áƒ’უმენტი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + +#: common.c:135 #, c-format msgid "reading extensions" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების წáƒáƒ™áƒ˜áƒ—ხვáƒ" -#: common.c:135 +#: common.c:138 #, c-format msgid "identifying extension members" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის ნáƒáƒ›áƒ áƒ”ბის იდენტიფიკáƒáƒªáƒ˜áƒ" -#: common.c:138 +#: common.c:141 #, c-format msgid "reading schemas" msgstr "სქემების კითხვáƒ" -#: common.c:147 +#: common.c:150 #, c-format msgid "reading user-defined tables" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ცხრილების კითხვáƒ" -#: common.c:152 +#: common.c:155 #, c-format msgid "reading user-defined functions" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ფუნქციების კითხვáƒ" -#: common.c:156 +#: common.c:159 #, c-format msgid "reading user-defined types" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ტიპების კითხვáƒ" -#: common.c:160 +#: common.c:163 #, c-format msgid "reading procedural languages" msgstr "პრáƒáƒªáƒ”დურული ენების კითხვáƒ" -#: common.c:163 +#: common.c:166 #, c-format msgid "reading user-defined aggregate functions" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციების კითხვáƒ" -#: common.c:166 +#: common.c:169 #, c-format msgid "reading user-defined operators" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის კითხვáƒ" -#: common.c:169 +#: common.c:172 #, c-format msgid "reading user-defined access methods" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ების კითხვáƒ" -#: common.c:172 +#: common.c:175 #, c-format msgid "reading user-defined operator classes" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ”ბის კითხვáƒ" -#: common.c:175 +#: common.c:178 #, c-format msgid "reading user-defined operator families" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ”ბის კითხვáƒ" -#: common.c:178 +#: common.c:181 #, c-format msgid "reading user-defined text search parsers" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლების კითხვáƒ" -#: common.c:181 +#: common.c:184 #, c-format msgid "reading user-defined text search templates" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ”ბის კითხვáƒ" -#: common.c:184 +#: common.c:187 #, c-format msgid "reading user-defined text search dictionaries" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ტექსტის ძებნის ლექსიკáƒáƒœáƒ”ბის კითხვáƒ" -#: common.c:187 +#: common.c:190 #, c-format msgid "reading user-defined text search configurations" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბის კითხვáƒ" -#: common.c:190 +#: common.c:193 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ”ბის კითხვáƒ" -#: common.c:193 +#: common.c:196 #, c-format msgid "reading user-defined foreign servers" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული გáƒáƒ áƒ” სერვერების კითხვáƒ" -#: common.c:196 +#: common.c:199 #, c-format msgid "reading default privileges" -msgstr "ნáƒáƒ’ულისხმები წვდáƒáƒ›áƒ”ბის კითხვáƒ" +msgstr "ნáƒáƒ’ულისხმევი წვდáƒáƒ›áƒ”ბის კითხვáƒ" -#: common.c:199 +#: common.c:202 #, c-format msgid "reading user-defined collations" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული კáƒáƒšáƒáƒªáƒ˜áƒ”ბის კითხვáƒ" -#: common.c:202 +#: common.c:205 #, c-format msgid "reading user-defined conversions" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ”ბის კითხვáƒ" -#: common.c:205 +#: common.c:208 #, c-format msgid "reading type casts" msgstr "ტიპის კáƒáƒ¡áƒ¢áƒ”ბის კითხვáƒ" -#: common.c:208 +#: common.c:211 #, c-format msgid "reading transforms" msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ”ბის კითხვáƒ" -#: common.c:211 +#: common.c:214 #, c-format msgid "reading table inheritance information" msgstr "ცხრილების მეკვიდრეáƒáƒ‘ითáƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ კითხვáƒ" -#: common.c:214 +#: common.c:217 #, c-format msgid "reading event triggers" msgstr "მáƒáƒ•ლენების ტრიგერების კითხვáƒ" -#: common.c:218 +#: common.c:221 #, c-format msgid "finding extension tables" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის ცხრილების მáƒáƒ«áƒ”ბნáƒ" -#: common.c:222 +#: common.c:225 #, c-format msgid "finding inheritance relationships" msgstr "მემკვიდრეáƒáƒ‘ითი ურთიერთáƒáƒ‘ების მáƒáƒ«áƒ”ბნáƒ" -#: common.c:225 +#: common.c:228 #, c-format msgid "reading column info for interesting tables" msgstr "სáƒáƒ˜áƒœáƒ¢áƒ”რესრცხრილების სვეტების ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ კითხვáƒ" -#: common.c:228 +#: common.c:231 #, c-format msgid "flagging inherited columns in subtables" msgstr "ქვეცხრილებში მემკვიდრეáƒáƒ‘ით სვეტებზე áƒáƒšáƒ›áƒ˜áƒ¡ დáƒáƒ¡áƒ›áƒ" -#: common.c:231 +#: common.c:234 #, c-format msgid "reading partitioning data" msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბის მáƒáƒœáƒáƒªáƒ”მების კითხვáƒ" -#: common.c:234 +#: common.c:237 #, c-format msgid "reading indexes" msgstr "ინდექსების კითხვáƒ" -#: common.c:237 +#: common.c:240 #, c-format msgid "flagging indexes in partitioned tables" msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒš ცხრილებში ინდექსებზე áƒáƒšáƒ›áƒ˜áƒ¡ დáƒáƒ¡áƒ›áƒ" -#: common.c:240 +#: common.c:243 #, c-format msgid "reading extended statistics" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ კითხვáƒ" -#: common.c:243 +#: common.c:246 #, c-format msgid "reading constraints" msgstr "შეზღუდვების კითხვáƒ" -#: common.c:246 +#: common.c:249 #, c-format msgid "reading triggers" msgstr "ტრიგერების კითხვáƒ" -#: common.c:249 +#: common.c:252 #, c-format msgid "reading rewrite rules" msgstr "გáƒáƒ“áƒáƒ¬áƒ”რის წესების კითხვáƒ" -#: common.c:252 +#: common.c:255 #, c-format msgid "reading policies" msgstr "წესების კითხვáƒ" -#: common.c:255 +#: common.c:258 #, c-format msgid "reading publications" msgstr "გáƒáƒ›áƒáƒªáƒ”მების კითხვáƒ" -#: common.c:258 +#: common.c:261 #, c-format msgid "reading publication membership of tables" msgstr "ცხრილების გáƒáƒ›áƒáƒªáƒ”მის წევრáƒáƒ‘ის კითხვáƒ" -#: common.c:261 +#: common.c:264 #, c-format msgid "reading publication membership of schemas" msgstr "სქემების გáƒáƒ›áƒáƒªáƒ”მის წევრáƒáƒ‘ის კითხვáƒ" -#: common.c:264 +#: common.c:267 #, c-format msgid "reading subscriptions" msgstr "გáƒáƒ›áƒáƒ¬áƒ”რების კითხვáƒ" -#: common.c:327 +#: common.c:270 +#, c-format +msgid "reading subscription membership of tables" +msgstr "ცხრილების გáƒáƒ›áƒáƒ¬áƒ”რის წევრáƒáƒ‘ის კითხვáƒ" + +#: common.c:333 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "სისწáƒáƒ áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ. ცხრილის (\"%2$s\", OID %3$u) მშáƒáƒ‘ელი OID (%1$u) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: common.c:369 +#: common.c:375 #, c-format msgid "invalid number of parents %d for table \"%s\"" msgstr "მშáƒáƒ‘ლების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘რ%d ცხრილისთვის \"%s\"" -#: common.c:1049 +#: common.c:1098 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "რიცხვითი მáƒáƒ¡áƒ˜áƒ•ის \"%s\" დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: მეტისმეტáƒáƒ“ ბევრი რიცხვი" -#: common.c:1061 +#: common.c:1110 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "რიცხვითი მáƒáƒ¡áƒ˜áƒ•ის \"%s\" დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: რიცხვში áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ¡ სიმბáƒáƒšáƒáƒ”ბიáƒ" @@ -353,7 +483,7 @@ msgstr "შეკუმშვის ბიბლიáƒáƒ—ეკის ინი msgid "could not close compression stream: %s" msgstr "შეკუმშვის ნáƒáƒ™áƒáƒ“ის დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %s" -#: compress_gzip.c:113 compress_zstd.c:109 +#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109 #, c-format msgid "could not compress data: %s" msgstr "მáƒáƒœáƒáƒªáƒ”მების შეკუმშვრშეუძლებელიáƒ: %s" @@ -368,24 +498,23 @@ msgstr "მáƒáƒœáƒáƒªáƒ”მების გáƒáƒœáƒ¨áƒšáƒ˜áƒ¡ შეცდრmsgid "could not close compression library: %s" msgstr "შეკუმშვის ბიბლიáƒáƒ—ეკის დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %s" -#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:602 -#: compress_lz4.c:622 compress_lz4.c:641 compress_none.c:97 compress_none.c:140 +#: compress_gzip.c:266 compress_lz4.c:608 compress_lz4.c:628 compress_lz4.c:647 #, c-format msgid "could not read from input file: %s" msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s" -#: compress_gzip.c:297 compress_lz4.c:624 compress_none.c:142 -#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558 -#: pg_backup_tar.c:725 pg_backup_tar.c:748 +#: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 +#: compress_zstd.c:373 pg_backup_custom.c:651 #, c-format -msgid "could not read from input file: end of file" -msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" +msgid "could not read from input file: %m" +msgstr "შემáƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: compress_gzip.c:413 compress_gzip.c:420 compress_lz4.c:768 -#: compress_lz4.c:775 compress_zstd.c:25 compress_zstd.c:31 +#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:141 +#: compress_zstd.c:371 pg_backup_custom.c:649 pg_backup_directory.c:565 +#: pg_backup_tar.c:740 pg_backup_tar.c:763 #, c-format -msgid "this build does not support compression with %s" -msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ %s-ით შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ áƒ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" +msgid "could not read from input file: end of file" +msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" #: compress_lz4.c:157 #, c-format @@ -402,14 +531,9 @@ msgstr "მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ› msgid "could not free LZ4 decompression context: %s" msgstr "lz4 შეკუმშვის კáƒáƒœáƒ¢áƒ”ქსტის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ების შეცდáƒáƒ›áƒ: %s" -#: compress_lz4.c:227 -#, c-format -msgid "failed to LZ4 compress data: %s" -msgstr "'LZ4'-ით მáƒáƒœáƒáƒªáƒ”მების შეკუმშვრშეუძლებელიáƒ: %s" - -#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:668 compress_lz4.c:678 +#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690 #, c-format -msgid "failed to end compression: %s" +msgid "could not end compression: %s" msgstr "შეკუმშვის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s" #: compress_lz4.c:301 @@ -417,14 +541,14 @@ msgstr "შეკუმშვის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდ msgid "could not initialize LZ4 compression: %s" msgstr "lz4-ით შეკუმშვის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" -#: compress_lz4.c:685 +#: compress_lz4.c:697 #, c-format -msgid "failed to end decompression: %s" -msgstr "გáƒáƒ¨áƒšáƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s" +msgid "could not end decompression: %s" +msgstr "დეკáƒáƒ›áƒžáƒ áƒ”სიის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s" #: compress_zstd.c:66 #, c-format -msgid "could not set compression parameter: \"%s\": %s" +msgid "could not set compression parameter \"%s\": %s" msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრის (%s) დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" #: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490 @@ -438,15 +562,60 @@ msgstr "შეკუმშვის ბიბლიáƒáƒ—ეკის ინი msgid "could not decompress data: %s" msgstr "მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" -#: compress_zstd.c:373 pg_backup_custom.c:655 +#: compress_zstd.c:501 #, c-format -msgid "could not read from input file: %m" -msgstr "შემáƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" +msgid "unhandled mode \"%s\"" +msgstr "დáƒáƒ£áƒ›áƒ£áƒ¨áƒáƒ•ებელი რეჟიმი \"%s\"" -#: compress_zstd.c:501 +#: filter.c:49 #, c-format -msgid "unhandled mode" -msgstr "დáƒáƒ£áƒ›áƒ£áƒ¨áƒáƒ•ებელი რეჟიმი" +msgid "could not open filter file \"%s\": %m" +msgstr "ფილტრის ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: filter.c:72 +#, c-format +msgid "could not close filter file \"%s\": %m" +msgstr "ფილტრის ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: filter.c:165 +#, c-format +msgid "invalid format in filter read from standard input on line %d: %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ ფილტრში, რáƒáƒ›áƒ”ლიც წáƒáƒ•იკითხე სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ შეყვáƒáƒœáƒ˜áƒ“áƒáƒœ, ხáƒáƒ–ზე %d: %s" + +#: filter.c:168 +#, c-format +msgid "invalid format in filter read from file \"%s\" on line %d: %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ ფილტრში, რáƒáƒ›áƒ”ლიც წáƒáƒ•იკითხე ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ \"%s\", ხáƒáƒ–ზე %d: %s" + +#: filter.c:241 filter.c:468 +#, c-format +msgid "could not read from filter file \"%s\": %m" +msgstr "ფილტრის ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: %m" + +#: filter.c:244 +msgid "unexpected end of file" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" + +#: filter.c:311 +msgid "missing object name pattern" +msgstr "áƒáƒ™áƒšáƒ˜áƒ áƒáƒ‘იექტის სáƒáƒ®áƒ”ლის ნიმუში" + +#: filter.c:422 +msgid "no filter command found (expected \"include\" or \"exclude\")" +msgstr "ფილტრის ბრძáƒáƒœáƒ”ბრვერ ვიპáƒáƒ•ე (მáƒáƒ•ელáƒáƒ“ი \"include\" áƒáƒœ \"exclude\")" + +#: filter.c:433 +msgid "invalid filter command (expected \"include\" or \"exclude\")" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფილტრის ბრძáƒáƒœáƒ”ბრ(მáƒáƒ•ელáƒáƒ“ი \"include\" áƒáƒœ \"exclude\")" + +#: filter.c:440 +msgid "missing filter object type" +msgstr "áƒáƒ™áƒšáƒ˜áƒ ფილტრის áƒáƒ‘იექტის ტიპი" + +#: filter.c:447 +#, c-format +msgid "unsupported filter object type: \"%.*s\"" +msgstr "მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი ფილტრის áƒáƒ‘იექტის ტიპი: \"%.*s\"" #: parallel.c:251 #, c-format @@ -527,512 +696,517 @@ msgstr "pgpipe: სáƒáƒ™áƒ”ტთáƒáƒœ მიერთების შეც msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: შეერთების დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %d" -#: pg_backup_archiver.c:276 pg_backup_archiver.c:1602 +#: pg_backup_archiver.c:261 pg_backup_archiver.c:1706 #, c-format msgid "could not close output file: %m" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: pg_backup_archiver.c:320 pg_backup_archiver.c:324 +#: pg_backup_archiver.c:305 pg_backup_archiver.c:309 #, c-format msgid "archive items not in correct section order" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის ჩáƒáƒœáƒáƒ¬áƒ”რების მიმდევრáƒáƒ‘რáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" -#: pg_backup_archiver.c:330 +#: pg_backup_archiver.c:315 #, c-format msgid "unexpected section code %d" msgstr "სექციის მáƒáƒ£áƒšáƒáƒ“ნელი კáƒáƒ“ი %d" -#: pg_backup_archiver.c:367 +#: pg_backup_archiver.c:352 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ› ფáƒáƒ áƒ›áƒáƒ¢áƒ–ე პáƒáƒ áƒáƒšáƒ”ლური áƒáƒ¦áƒ“გენრმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" -#: pg_backup_archiver.c:371 +#: pg_backup_archiver.c:356 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის ფáƒáƒ˜áƒšáƒ–ე, რáƒáƒ›áƒ”ლიც 8.0 pg_dump-ით áƒáƒœ უფრრძველით შეიქმნáƒ, პáƒáƒ áƒáƒšáƒ”ლური áƒáƒ¦áƒ“გენრმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" -#: pg_backup_archiver.c:391 +#: pg_backup_archiver.c:377 #, c-format msgid "cannot restore from compressed archive (%s)" msgstr "შეკუმშული áƒáƒ áƒ¥áƒ˜áƒ•იდáƒáƒœ (%s) áƒáƒ¦áƒ“გენრშეუძლებელიáƒ" -#: pg_backup_archiver.c:411 +#: pg_backup_archiver.c:397 #, c-format msgid "connecting to database for restore" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•შირებრáƒáƒ¦áƒ“გენისთვის" -#: pg_backup_archiver.c:413 +#: pg_backup_archiver.c:399 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ პირდáƒáƒžáƒ˜áƒ áƒ˜ შეერთებრ1.3 áƒáƒœ უფრრძველ áƒáƒ áƒ¥áƒ˜áƒ•ებში მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" -#: pg_backup_archiver.c:456 +#: pg_backup_archiver.c:442 #, c-format msgid "implied data-only restore" msgstr "მხáƒáƒšáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრáƒáƒ¦áƒ“გენáƒ" -#: pg_backup_archiver.c:522 +#: pg_backup_archiver.c:510 #, c-format msgid "dropping %s %s" msgstr "მáƒáƒªáƒ˜áƒšáƒ”ბრ%s %s" -#: pg_backup_archiver.c:622 +#: pg_backup_archiver.c:642 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "ვერ ვიპáƒáƒ•ე, áƒáƒžáƒ”რáƒáƒªáƒ˜áƒáƒ¨áƒ˜ \"%s\" IF EXISTS სáƒáƒ“ უნდრჩáƒáƒ•სვáƒ" -#: pg_backup_archiver.c:777 pg_backup_archiver.c:779 +#: pg_backup_archiver.c:828 pg_backup_archiver.c:830 #, c-format msgid "warning from original dump file: %s" msgstr "გáƒáƒ¤áƒ áƒ—ხილებრსáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ: %s" -#: pg_backup_archiver.c:794 +#: pg_backup_archiver.c:864 #, c-format msgid "creating %s \"%s.%s\"" msgstr "იქმნებრ%s \"%s.%s\"" -#: pg_backup_archiver.c:797 +#: pg_backup_archiver.c:867 #, c-format msgid "creating %s \"%s\"" msgstr "იქმნებრ%s \"%s\"" -#: pg_backup_archiver.c:847 +#: pg_backup_archiver.c:917 #, c-format msgid "connecting to new database \"%s\"" msgstr "áƒáƒ®áƒáƒš ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებრ\"%s\"" -#: pg_backup_archiver.c:874 +#: pg_backup_archiver.c:944 #, c-format msgid "processing %s" msgstr "დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებრ%s" -#: pg_backup_archiver.c:896 +#: pg_backup_archiver.c:966 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებრცხრილისთვის \"%s.%s\"" -#: pg_backup_archiver.c:966 +#: pg_backup_archiver.c:1036 #, c-format msgid "executing %s %s" msgstr "შესრულებრ%s %s" -#: pg_backup_archiver.c:1007 +#: pg_backup_archiver.c:1096 #, c-format msgid "disabling triggers for %s" msgstr "%s-სთვის ტრიგერების გáƒáƒ›áƒáƒ áƒ—ვáƒ" -#: pg_backup_archiver.c:1033 +#: pg_backup_archiver.c:1122 #, c-format msgid "enabling triggers for %s" msgstr "%s-სთვის ტრიგერების ჩáƒáƒ áƒ—ვáƒ" -#: pg_backup_archiver.c:1098 +#: pg_backup_archiver.c:1187 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "შიდრშეცდáƒáƒ›áƒ -- WriteData-ს DataDumper-ის ქვეპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ კáƒáƒœáƒ¢áƒ”ქსტის გáƒáƒ áƒ”თ ვერ გáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒ”ბთ" -#: pg_backup_archiver.c:1286 +#: pg_backup_archiver.c:1379 #, c-format msgid "large-object output not supported in chosen format" msgstr "áƒáƒ áƒ©áƒ”ულ ფáƒáƒ áƒ›áƒáƒ¢áƒ¡ დიდი áƒáƒ‘იექტების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ”ბრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" -#: pg_backup_archiver.c:1344 +#: pg_backup_archiver.c:1442 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "áƒáƒ¦áƒ“გენილირ%d დიდი áƒáƒ‘იექტი" msgstr[1] "áƒáƒ¦áƒ“გენილირ%d დიდი áƒáƒ‘იექტი" -#: pg_backup_archiver.c:1365 pg_backup_tar.c:668 +#: pg_backup_archiver.c:1469 pg_backup_tar.c:683 #, c-format msgid "restoring large object with OID %u" msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს დიდი áƒáƒ‘იექტის áƒáƒ¦áƒ“გენრOID-ით: %u" -#: pg_backup_archiver.c:1377 +#: pg_backup_archiver.c:1481 #, c-format msgid "could not create large object %u: %s" msgstr "დიდი áƒáƒ‘იექტის (%u) შექმნის შეცდáƒáƒ›áƒ: %s" -#: pg_backup_archiver.c:1382 pg_dump.c:3735 +#: pg_backup_archiver.c:1486 pg_dump.c:3888 #, c-format msgid "could not open large object %u: %s" msgstr "დიდი áƒáƒ‘იექტის (%u) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" -#: pg_backup_archiver.c:1438 +#: pg_backup_archiver.c:1542 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "\"TOC\" ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: pg_backup_archiver.c:1466 +#: pg_backup_archiver.c:1570 #, c-format msgid "line ignored: %s" -msgstr "ხáƒáƒ–ი იგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ: %s" +msgstr "ხáƒáƒ–ი გáƒáƒ›áƒáƒ¢áƒáƒ•ებულიáƒ: %s" -#: pg_backup_archiver.c:1473 +#: pg_backup_archiver.c:1577 pg_backup_db.c:609 #, c-format msgid "could not find entry for ID %d" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რი ID-ით %d áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_backup_archiver.c:1496 pg_backup_directory.c:221 -#: pg_backup_directory.c:606 +#: pg_backup_archiver.c:1600 pg_backup_directory.c:219 +#: pg_backup_directory.c:613 #, c-format msgid "could not close TOC file: %m" msgstr "\"TOC\" ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: pg_backup_archiver.c:1583 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:593 pg_backup_directory.c:658 -#: pg_backup_directory.c:676 pg_dumpall.c:501 +#: pg_backup_archiver.c:1687 pg_backup_custom.c:152 pg_backup_directory.c:333 +#: pg_backup_directory.c:600 pg_backup_directory.c:666 +#: pg_backup_directory.c:684 pg_dumpall.c:506 #, c-format msgid "could not open output file \"%s\": %m" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: pg_backup_archiver.c:1585 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1689 pg_backup_custom.c:158 #, c-format msgid "could not open output file: %m" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: pg_backup_archiver.c:1668 +#: pg_backup_archiver.c:1772 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" msgstr[0] "ჩáƒáƒ¬áƒ”რილირდიდი áƒáƒ‘იექტის მáƒáƒœáƒáƒªáƒ”მების %zu ბáƒáƒ˜áƒ¢áƒ˜ (შედეგი = %d)" msgstr[1] "ჩáƒáƒ¬áƒ”რილირდიდი áƒáƒ‘იექტის მáƒáƒœáƒáƒªáƒ”მების %zu ბáƒáƒ˜áƒ¢áƒ˜ (შედეგი = %d)" -#: pg_backup_archiver.c:1674 +#: pg_backup_archiver.c:1778 #, c-format msgid "could not write to large object: %s" msgstr "დიდი áƒáƒ‘იექტის ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %s" -#: pg_backup_archiver.c:1764 +#: pg_backup_archiver.c:1868 #, c-format msgid "while INITIALIZING:" msgstr "\"INITIALIZING\"-ის დრáƒáƒ¡:" -#: pg_backup_archiver.c:1769 +#: pg_backup_archiver.c:1873 #, c-format msgid "while PROCESSING TOC:" msgstr "\"PROCESSING TOC\"-ის დრáƒáƒ¡:" -#: pg_backup_archiver.c:1774 +#: pg_backup_archiver.c:1878 #, c-format msgid "while FINALIZING:" msgstr "\"FINALIZING\"-ის დრáƒáƒ¡:" -#: pg_backup_archiver.c:1779 +#: pg_backup_archiver.c:1883 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რიდáƒáƒœ %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1855 +#: pg_backup_archiver.c:1959 #, c-format msgid "bad dumpId" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ dumpId" -#: pg_backup_archiver.c:1876 +#: pg_backup_archiver.c:1980 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "ცხრილის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ dumpId-ი TABLE DATA ელემენტისთვის" -#: pg_backup_archiver.c:1968 +#: pg_backup_archiver.c:2072 #, c-format msgid "unexpected data offset flag %d" msgstr "მáƒáƒœáƒáƒªáƒ”მების წáƒáƒœáƒáƒªáƒ•ლების მáƒáƒ£áƒšáƒáƒ“ნელი áƒáƒšáƒáƒ›áƒ˜: %d" -#: pg_backup_archiver.c:1981 +#: pg_backup_archiver.c:2085 #, c-format msgid "file offset in dump file is too large" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒš ფáƒáƒ˜áƒšáƒ¨áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒœáƒáƒªáƒ•ლებრძáƒáƒšáƒ˜áƒáƒœ დიდიáƒ" -#: pg_backup_archiver.c:2092 +#: pg_backup_archiver.c:2196 #, c-format msgid "directory name too long: \"%s\"" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის სáƒáƒ®áƒ”ლი ძáƒáƒšáƒ˜áƒáƒœ გრძელირ: \"%s\"" -#: pg_backup_archiver.c:2142 +#: pg_backup_archiver.c:2246 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" სწáƒáƒ  áƒáƒ áƒ¥áƒ˜áƒ•ს áƒáƒ  ჰგáƒáƒ•ს (\"toc.dat\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს)" -#: pg_backup_archiver.c:2150 pg_backup_custom.c:173 pg_backup_custom.c:816 -#: pg_backup_directory.c:206 pg_backup_directory.c:395 +#: pg_backup_archiver.c:2254 pg_backup_custom.c:169 pg_backup_custom.c:812 +#: pg_backup_directory.c:204 pg_backup_directory.c:396 #, c-format msgid "could not open input file \"%s\": %m" msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: pg_backup_archiver.c:2157 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2261 pg_backup_custom.c:175 #, c-format msgid "could not open input file: %m" msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: pg_backup_archiver.c:2163 +#: pg_backup_archiver.c:2267 #, c-format msgid "could not read input file: %m" msgstr "შემáƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: pg_backup_archiver.c:2165 +#: pg_backup_archiver.c:2269 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ ძáƒáƒšáƒ˜áƒáƒœ მáƒáƒ™áƒšáƒ”რ(წáƒáƒ•იკითხე %lu, მáƒáƒ¡áƒáƒšáƒáƒ“ნელირ5)" -#: pg_backup_archiver.c:2197 +#: pg_backup_archiver.c:2301 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜, რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, áƒáƒ áƒ˜áƒ¡ ტექსტის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ დáƒáƒ›áƒžáƒ˜áƒ. გთხáƒáƒ•თ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ— psql." -#: pg_backup_archiver.c:2203 +#: pg_backup_archiver.c:2307 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "შეყვáƒáƒœáƒ˜áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ სწáƒáƒ  áƒáƒ áƒ¥áƒ˜áƒ•ს áƒáƒ  ჰგáƒáƒ•ს (ძáƒáƒšáƒ˜áƒáƒœ მáƒáƒ™áƒšáƒ”áƒ)" -#: pg_backup_archiver.c:2209 +#: pg_backup_archiver.c:2313 #, c-format msgid "input file does not appear to be a valid archive" msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ სწáƒáƒ  áƒáƒ áƒ¥áƒ˜áƒ•ს áƒáƒ  ჰგáƒáƒ•ს" -#: pg_backup_archiver.c:2218 +#: pg_backup_archiver.c:2322 #, c-format msgid "could not close input file: %m" msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: pg_backup_archiver.c:2296 +#: pg_backup_archiver.c:2401 #, c-format msgid "could not open stdout for appending: %m" msgstr "stdout-ის ბáƒáƒšáƒáƒ¨áƒ˜ მისáƒáƒ¬áƒ”რáƒáƒ“ გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %m" -#: pg_backup_archiver.c:2341 +#: pg_backup_archiver.c:2446 #, c-format msgid "unrecognized file format \"%d\"" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ უცნáƒáƒ‘ი ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ \"%d\"" -#: pg_backup_archiver.c:2422 pg_backup_archiver.c:4445 +#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4647 #, c-format msgid "finished item %d %s %s" msgstr "დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბული ელემენტი %d %s %s" -#: pg_backup_archiver.c:2426 pg_backup_archiver.c:4458 +#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4660 #, c-format msgid "worker process failed: exit code %d" msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის შეცდáƒáƒ›áƒ: გáƒáƒ›áƒáƒ¡áƒ•ლის კáƒáƒ“ი %d" -#: pg_backup_archiver.c:2547 +#: pg_backup_archiver.c:2653 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "ელემენტის ID %d დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ გáƒáƒ áƒ”თáƒáƒ -- შეიძლებრსáƒáƒ áƒ©áƒ”ვი დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ" -#: pg_backup_archiver.c:2627 +#: pg_backup_archiver.c:2736 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "ცხრილების, áƒáƒ¦áƒ¬áƒ”რილი WITH OIDS -ით, áƒáƒ¦áƒ“გენრმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ¦áƒáƒ áƒáƒ" -#: pg_backup_archiver.c:2709 +#: pg_backup_archiver.c:2818 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "უცნáƒáƒ‘ი კáƒáƒ“ირებრ\"%s\"" -#: pg_backup_archiver.c:2714 +#: pg_backup_archiver.c:2823 #, c-format msgid "invalid ENCODING item: %s" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი \"ENCODING\": %s" -#: pg_backup_archiver.c:2732 +#: pg_backup_archiver.c:2841 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი \"STDSTRINGS\": %s" -#: pg_backup_archiver.c:2757 +#: pg_backup_archiver.c:2866 #, c-format msgid "schema \"%s\" not found" msgstr "სქემრ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_backup_archiver.c:2764 +#: pg_backup_archiver.c:2873 #, c-format msgid "table \"%s\" not found" msgstr "ცხრილი %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_backup_archiver.c:2771 +#: pg_backup_archiver.c:2880 #, c-format msgid "index \"%s\" not found" msgstr "ინდექსი %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_backup_archiver.c:2778 +#: pg_backup_archiver.c:2887 #, c-format msgid "function \"%s\" not found" msgstr "ფუნქცირ%s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_backup_archiver.c:2785 +#: pg_backup_archiver.c:2894 #, c-format msgid "trigger \"%s\" not found" msgstr "ტრიგერი %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_backup_archiver.c:3182 +#: pg_backup_archiver.c:3325 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "სესიის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის %s-ზე დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" -#: pg_backup_archiver.c:3314 +#: pg_backup_archiver.c:3457 +#, c-format +msgid "could not set \"search_path\" to \"%s\": %s" +msgstr "\"session_path\"-ის %s-ზე დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" + +#: pg_backup_archiver.c:3518 #, c-format -msgid "could not set search_path to \"%s\": %s" -msgstr "session_path-ის %s-ზე დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" +msgid "could not set \"default_tablespace\" to %s: %s" +msgstr "\"default_tablespace\"-ის %s-ზე დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" -#: pg_backup_archiver.c:3375 +#: pg_backup_archiver.c:3567 #, c-format -msgid "could not set default_tablespace to %s: %s" -msgstr "default_tablespace-ის %s-ზე დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" +msgid "could not set \"default_table_access_method\": %s" +msgstr "\"default_table_access_method\"-ის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" -#: pg_backup_archiver.c:3424 +#: pg_backup_archiver.c:3616 #, c-format -msgid "could not set default_table_access_method: %s" -msgstr "default_table_access_method-ის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" +msgid "could not alter table access method: %s" +msgstr "ცხრილის წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ის შეცვლრშეუძლებელიáƒ: %s" -#: pg_backup_archiver.c:3528 +#: pg_backup_archiver.c:3717 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "áƒáƒ  ვიცი, რáƒáƒ’áƒáƒ  დáƒáƒ•áƒáƒ§áƒ”ნრáƒáƒ‘იექტის მáƒáƒªáƒ”მული ტიპის (%s) მფლáƒáƒ‘ელი" -#: pg_backup_archiver.c:3749 +#: pg_backup_archiver.c:4004 #, c-format msgid "did not find magic string in file header" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ თáƒáƒ•სáƒáƒ áƒ—ში მáƒáƒ’იური სტრიქáƒáƒœáƒ˜ ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" -#: pg_backup_archiver.c:3763 +#: pg_backup_archiver.c:4018 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ თáƒáƒ•სáƒáƒ áƒ—ში áƒáƒ áƒ¡áƒ”ბული ვერსირ(%d.%d) მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" -#: pg_backup_archiver.c:3768 +#: pg_backup_archiver.c:4023 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "მთელი რიცხვის ზáƒáƒ›áƒ˜áƒ¡ (%lu) სისწáƒáƒ áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ" -#: pg_backup_archiver.c:3772 +#: pg_backup_archiver.c:4027 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ი შეიქმნრმáƒáƒœáƒ¥áƒáƒœáƒáƒ–ე, სáƒáƒ“áƒáƒª მთელი რიცხვი უფრრდიდიáƒ. ზáƒáƒ’იერთი áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ შეიძლებრშეცდáƒáƒ›áƒ˜áƒ— დáƒáƒ¡áƒ áƒ£áƒšáƒ“ეს" -#: pg_backup_archiver.c:3782 +#: pg_backup_archiver.c:4037 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "მáƒáƒ¡áƒáƒšáƒáƒ“ნელი ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ (%d) გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•დებრფáƒáƒ˜áƒšáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡áƒ’áƒáƒœ (%d)" -#: pg_backup_archiver.c:3804 +#: pg_backup_archiver.c:4059 #, c-format msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ი შეკუმშულიáƒ, მáƒáƒ’რáƒáƒ› áƒáƒ› ვერსიáƒáƒ¡ შეკუმშვის(%s) მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ -- მáƒáƒœáƒáƒªáƒ”მები მიუწვდáƒáƒ›áƒ”ლი იქნებáƒ" -#: pg_backup_archiver.c:3840 +#: pg_backup_archiver.c:4095 #, c-format msgid "invalid creation date in header" msgstr "თáƒáƒ•სáƒáƒ áƒ—ში áƒáƒ áƒ¡áƒ”ბული შექმნის დრრáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" -#: pg_backup_archiver.c:3974 +#: pg_backup_archiver.c:4229 #, c-format msgid "processing item %d %s %s" msgstr "მუშáƒáƒ•დებრელემენტი %d %s %s" -#: pg_backup_archiver.c:4049 +#: pg_backup_archiver.c:4314 #, c-format msgid "entering main parallel loop" msgstr "მთáƒáƒ•áƒáƒ áƒ˜ პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜" -#: pg_backup_archiver.c:4060 +#: pg_backup_archiver.c:4325 #, c-format msgid "skipping item %d %s %s" msgstr "ელემენტის გáƒáƒ›áƒáƒ¢áƒáƒ•ებრ%d %s %s" -#: pg_backup_archiver.c:4069 +#: pg_backup_archiver.c:4334 #, c-format msgid "launching item %d %s %s" msgstr "ელემენტის გáƒáƒ¨áƒ•ებრ%d %s %s" -#: pg_backup_archiver.c:4123 +#: pg_backup_archiver.c:4388 #, c-format msgid "finished main parallel loop" msgstr "მთáƒáƒ•áƒáƒ áƒ˜ პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" -#: pg_backup_archiver.c:4159 +#: pg_backup_archiver.c:4424 #, c-format msgid "processing missed item %d %s %s" msgstr "გáƒáƒ›áƒáƒ áƒ©áƒ”ნილი ჩáƒáƒœáƒáƒ¬áƒ”რის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებრ%d %s %s" -#: pg_backup_archiver.c:4764 +#: pg_backup_archiver.c:4966 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "ცხრილის (%s) შექმნრშეუძლებელიáƒ. მáƒáƒœáƒáƒªáƒ”მების áƒáƒ¦áƒ“გენრáƒáƒ  მáƒáƒ®áƒ“ებáƒ" -#: pg_backup_custom.c:380 pg_backup_null.c:147 +#: pg_backup_custom.c:376 pg_backup_null.c:143 #, c-format msgid "invalid OID for large object" msgstr "დიდი áƒáƒ‘იექტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ OID" -#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640 -#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019 +#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:636 +#: pg_backup_custom.c:870 pg_backup_tar.c:1029 pg_backup_tar.c:1034 #, c-format msgid "error during file seek: %m" msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ გáƒáƒ“áƒáƒ®áƒ•ევის პრáƒáƒ‘ლემáƒ: %m" -#: pg_backup_custom.c:484 +#: pg_backup_custom.c:480 #, c-format msgid "data block %d has wrong seek position" msgstr "მáƒáƒœáƒáƒªáƒ”მების ბლáƒáƒ™áƒ¡ (%d) áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ“áƒáƒ®áƒ•ევის მდებáƒáƒ áƒ”áƒáƒ‘რგáƒáƒáƒ©áƒœáƒ˜áƒ" -#: pg_backup_custom.c:501 +#: pg_backup_custom.c:497 #, c-format msgid "unrecognized data block type (%d) while searching archive" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის ძებნისáƒáƒ¡ მáƒáƒœáƒáƒªáƒ”მების ბლáƒáƒ™áƒ˜áƒ¡ ტიპი (%d) áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" -#: pg_backup_custom.c:523 +#: pg_backup_custom.c:519 #, c-format msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ში ბლáƒáƒ™áƒ˜áƒ¡ ID-ის (%d) პáƒáƒ•ნრშეუძლებელირ-- შეიძლებრდáƒáƒ£áƒšáƒáƒ’ებელი áƒáƒ¦áƒ“გენის მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ›áƒ, რáƒáƒ›áƒ”ლიც áƒáƒ  შეიძლებრდáƒáƒ›áƒ£áƒ¨áƒáƒ•დეს გáƒáƒ“áƒáƒ£áƒ®áƒ•ევáƒáƒ“ი შეტáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ›áƒ" -#: pg_backup_custom.c:528 +#: pg_backup_custom.c:524 #, c-format msgid "could not find block ID %d in archive -- possibly corrupt archive" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ში ბლáƒáƒ™áƒ˜áƒ¡ ID -ის (%d) პáƒáƒ•ნის შეცდáƒáƒ›áƒ -- შეიძლებრáƒáƒ áƒ¥áƒ˜áƒ•ი დáƒáƒ–იáƒáƒœáƒ”ბულიáƒ" -#: pg_backup_custom.c:535 +#: pg_backup_custom.c:531 #, c-format msgid "found unexpected block ID (%d) when reading data -- expected %d" msgstr "მáƒáƒœáƒáƒªáƒ”მების კითხვისáƒáƒ¡ ვიპáƒáƒ•ე მáƒáƒ£áƒšáƒáƒ“ნელი ბლáƒáƒ™áƒ˜áƒ¡ ID (%d) -- მáƒáƒ•ელáƒáƒ“ი: %d" -#: pg_backup_custom.c:549 +#: pg_backup_custom.c:545 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "უცნáƒáƒ‘ი მáƒáƒœáƒáƒªáƒ”მის ბლáƒáƒ™áƒ˜áƒ¡ ტიპი %d áƒáƒ áƒ¥áƒ˜áƒ•ის áƒáƒ¦áƒ“გენისáƒáƒ¡" -#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952 -#: pg_backup_tar.c:1017 +#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:945 +#: pg_backup_tar.c:1032 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის ფáƒáƒ˜áƒšáƒ¨áƒ˜ გáƒáƒ“áƒáƒ®áƒ•ევის მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ“გენის შეცდáƒáƒ›áƒ: %m" -#: pg_backup_custom.c:771 pg_backup_custom.c:811 +#: pg_backup_custom.c:767 pg_backup_custom.c:807 #, c-format msgid "could not close archive file: %m" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: pg_backup_custom.c:794 +#: pg_backup_custom.c:790 #, c-format msgid "can only reopen input archives" msgstr "შეყვáƒáƒœáƒ˜áƒšáƒ˜ áƒáƒ áƒ¥áƒ˜áƒ•ების თáƒáƒ•იდáƒáƒœ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: pg_backup_custom.c:801 +#: pg_backup_custom.c:797 #, c-format msgid "parallel restore from standard input is not supported" msgstr "სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ შეტáƒáƒœáƒ˜áƒ“áƒáƒœ პáƒáƒ áƒáƒšáƒ”ლური áƒáƒ¦áƒ“გენის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_backup_custom.c:803 +#: pg_backup_custom.c:799 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "გáƒáƒ“áƒáƒ£áƒ®áƒ•ევáƒáƒ“ი ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ პáƒáƒ áƒáƒšáƒ”ლური áƒáƒ¦áƒ“გენის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_backup_custom.c:819 +#: pg_backup_custom.c:815 #, c-format msgid "could not set seek position in archive file: %m" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის ფáƒáƒ˜áƒšáƒ¨áƒ˜ გáƒáƒ“áƒáƒ®áƒ•ევის შეცდáƒáƒ›áƒ:%m" -#: pg_backup_custom.c:898 +#: pg_backup_custom.c:894 #, c-format msgid "compressor active" msgstr "შემკუმშველი áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ" @@ -1042,12 +1216,12 @@ msgstr "შემკუმშველი áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ" msgid "could not get server_version from libpq" msgstr "libpq-დáƒáƒœ server_version-ის მიღების შეცდáƒáƒ›áƒ" -#: pg_backup_db.c:53 pg_dumpall.c:1816 +#: pg_backup_db.c:53 pg_dumpall.c:1830 #, c-format msgid "aborting because of server version mismatch" msgstr "áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ გáƒáƒ£áƒ¥áƒ›áƒ“რსერვერის ვერსიის შეუთáƒáƒ•სებლáƒáƒ‘ის გáƒáƒ›áƒ" -#: pg_backup_db.c:54 pg_dumpall.c:1817 +#: pg_backup_db.c:54 pg_dumpall.c:1831 #, c-format msgid "server version: %s; %s version: %s" msgstr "სერვერის ვერსიáƒ: %s; %s ვერსიáƒ: %s" @@ -1057,7 +1231,7 @@ msgstr "სერვერის ვერსიáƒ: %s; %s ვერსიáƒ: msgid "already connected to a database" msgstr "ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებრუკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1663 pg_dumpall.c:1765 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1677 pg_dumpall.c:1779 msgid "Password: " msgstr "პáƒáƒ áƒáƒšáƒ˜: " @@ -1071,18 +1245,18 @@ msgstr "ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთების შეცდáƒáƒ› msgid "reconnection failed: %s" msgstr "თáƒáƒ•იდáƒáƒœ მიერთების შეცდáƒáƒ›áƒ: %s" -#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:741 pg_dumpall.c:1690 -#: pg_dumpall.c:1774 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:788 pg_dump_sort.c:1213 +#: pg_dump_sort.c:1233 pg_dumpall.c:1704 pg_dumpall.c:1788 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:271 pg_dumpall.c:1879 pg_dumpall.c:1902 +#: pg_backup_db.c:271 pg_dumpall.c:1893 pg_dumpall.c:1916 #, c-format msgid "query failed: %s" msgstr "მáƒáƒ—ხáƒáƒ•ნის შეცდáƒáƒ›áƒ: %s" -#: pg_backup_db.c:273 pg_dumpall.c:1880 pg_dumpall.c:1903 +#: pg_backup_db.c:273 pg_dumpall.c:1894 pg_dumpall.c:1917 #, c-format msgid "Query was: %s" msgstr "მáƒáƒ—ხáƒáƒ•ნის შინáƒáƒáƒ áƒ¡áƒ˜: %s" @@ -1118,7 +1292,7 @@ msgstr "\"PQputCopyEnd\"-ის მიერ დáƒáƒ‘რუნებული msgid "COPY failed for table \"%s\": %s" msgstr "COPY-ის შეცდáƒáƒ›áƒ ცხრილისთვის \"%s\": %s" -#: pg_backup_db.c:521 pg_dump.c:2202 +#: pg_backup_db.c:521 pg_dump.c:2283 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ›áƒáƒ¢áƒ”ბითი შედეგები COPY-ის დრáƒáƒ¡ ცხრილისთვის \"%s\"" @@ -1131,161 +1305,156 @@ msgstr "ბáƒáƒ–ის ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¬áƒ§áƒ”ბი msgid "could not commit database transaction" msgstr "ბáƒáƒ–ის ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ“áƒáƒªáƒ”მის შეცდáƒáƒ›áƒ" -#: pg_backup_directory.c:155 +#: pg_backup_directory.c:153 #, c-format msgid "no output directory specified" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ" -#: pg_backup_directory.c:184 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" - -#: pg_backup_directory.c:188 +#: pg_backup_directory.c:186 #, c-format msgid "could not close directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: pg_backup_directory.c:194 +#: pg_backup_directory.c:192 #, c-format msgid "could not create directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m" -#: pg_backup_directory.c:356 pg_backup_directory.c:499 -#: pg_backup_directory.c:537 +#: pg_backup_directory.c:357 pg_backup_directory.c:506 +#: pg_backup_directory.c:544 #, c-format msgid "could not write to output file: %s" msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœ ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %s" -#: pg_backup_directory.c:374 +#: pg_backup_directory.c:375 #, c-format msgid "could not close data file: %m" msgstr "მáƒáƒœáƒáƒªáƒ”მების ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: pg_backup_directory.c:407 +#: pg_backup_directory.c:408 #, c-format msgid "could not close data file \"%s\": %m" msgstr "მáƒáƒœáƒáƒªáƒ”მების ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: pg_backup_directory.c:448 +#: pg_backup_directory.c:455 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "დიდი áƒáƒ‘იექტის სáƒáƒ áƒ©áƒ”ვის ფáƒáƒ˜áƒšáƒ˜áƒ¡ %s წáƒáƒ¡áƒáƒ™áƒ˜áƒ—ხáƒáƒ“ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: pg_backup_directory.c:459 +#: pg_backup_directory.c:466 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ხáƒáƒ–ი დიდი áƒáƒ‘იექტის ცხრილის ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\": %s" -#: pg_backup_directory.c:468 +#: pg_backup_directory.c:475 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "დიდი áƒáƒ‘იექტის სáƒáƒ áƒ©áƒ”ვის ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s" -#: pg_backup_directory.c:472 +#: pg_backup_directory.c:479 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "დიდი áƒáƒ‘იექტის სáƒáƒ áƒ©áƒ”ვის ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: pg_backup_directory.c:694 +#: pg_backup_directory.c:702 #, c-format msgid "could not close LO data file: %m" msgstr "'LO' მáƒáƒœáƒáƒªáƒ”მების ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: pg_backup_directory.c:700 +#: pg_backup_directory.c:712 #, c-format -msgid "could not write to LOs TOC file" -msgstr "'LO'-ების სáƒáƒ áƒ©áƒ”ვის ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ" +msgid "could not write to LOs TOC file: %s" +msgstr "'LO'-ების სáƒáƒ áƒ©áƒ”ვის ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რრშეუძლებელიáƒ: %s" -#: pg_backup_directory.c:714 +#: pg_backup_directory.c:728 #, c-format msgid "could not close LOs TOC file: %m" msgstr "'LO'-ის სáƒáƒ áƒ©áƒ”ვის ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: pg_backup_directory.c:733 +#: pg_backup_directory.c:747 #, c-format msgid "file name too long: \"%s\"" msgstr "%s: ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" -#: pg_backup_null.c:74 +#: pg_backup_null.c:70 #, c-format msgid "this format cannot be read" msgstr "ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ" -#: pg_backup_tar.c:172 +#: pg_backup_tar.c:168 #, c-format msgid "could not open TOC file \"%s\" for output: %m" msgstr "შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒ—ვის: %m" -#: pg_backup_tar.c:179 +#: pg_backup_tar.c:175 #, c-format msgid "could not open TOC file for output: %m" msgstr "შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒ—ვის: %m" -#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 -#: pg_backup_tar.c:405 pg_backup_tar.c:891 +#: pg_backup_tar.c:194 pg_backup_tar.c:330 pg_backup_tar.c:385 +#: pg_backup_tar.c:401 pg_backup_tar.c:906 #, c-format msgid "compression is not supported by tar archive format" msgstr "tar ფáƒáƒ˜áƒšáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ¡ შეკუმშვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" -#: pg_backup_tar.c:206 +#: pg_backup_tar.c:202 #, c-format msgid "could not open TOC file \"%s\" for input: %m" msgstr "შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შესáƒáƒ§áƒ•áƒáƒœáƒáƒ“ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: %m" -#: pg_backup_tar.c:213 +#: pg_backup_tar.c:209 #, c-format msgid "could not open TOC file for input: %m" msgstr "შინáƒáƒáƒ áƒ¡áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: pg_backup_tar.c:322 +#: pg_backup_tar.c:318 #, c-format msgid "could not find file \"%s\" in archive" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ში ფáƒáƒ˜áƒšáƒ˜áƒ¡ პáƒáƒ•ნრშეუძლებელიáƒ: %s" -#: pg_backup_tar.c:382 +#: pg_backup_tar.c:378 #, c-format msgid "could not generate temporary file name: %m" msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის გენერáƒáƒªáƒ˜áƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: %m" -#: pg_backup_tar.c:623 +#: pg_backup_tar.c:619 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "\"COPY áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი სინტáƒáƒ¥áƒ¡áƒ˜: %s" -#: pg_backup_tar.c:888 +#: pg_backup_tar.c:903 #, c-format msgid "invalid OID for large object (%u)" msgstr "დიდი áƒáƒ‘იექტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ OID: %u" -#: pg_backup_tar.c:1033 +#: pg_backup_tar.c:1048 #, c-format msgid "could not close temporary file: %m" msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•ის პრáƒáƒ‘ლემáƒ: %m" -#: pg_backup_tar.c:1036 +#: pg_backup_tar.c:1051 #, c-format msgid "actual file length (%lld) does not match expected (%lld)" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ რეáƒáƒšáƒ£áƒ áƒ˜ სიგრძე (%lld) áƒáƒ  ემთხვევრმáƒáƒ¡áƒáƒšáƒáƒ“ნელს (%lld)" -#: pg_backup_tar.c:1082 pg_backup_tar.c:1113 +#: pg_backup_tar.c:1097 pg_backup_tar.c:1128 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ში თáƒáƒ•სáƒáƒ áƒ—ი ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\" ვერ ვიპáƒáƒ•ე" -#: pg_backup_tar.c:1100 +#: pg_backup_tar.c:1115 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "დáƒáƒ£áƒšáƒáƒ’ებელი მáƒáƒœáƒáƒªáƒ”მების áƒáƒ¦áƒ“გენრმხáƒáƒ áƒ“áƒáƒ­áƒ”რელირáƒáƒ áƒ¥áƒ˜áƒ•ის áƒáƒ› ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜: \"%s\" áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ, მáƒáƒ’რáƒáƒ› ის áƒáƒ áƒ¥áƒ˜áƒ•ის ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\"-მდეáƒ." -#: pg_backup_tar.c:1147 +#: pg_backup_tar.c:1162 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "tar ფáƒáƒ˜áƒšáƒ˜áƒ¡ თáƒáƒ•სáƒáƒ áƒ—ი áƒáƒ áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ (%lu ბáƒáƒ˜áƒ¢áƒ˜)" msgstr[1] "tar ფáƒáƒ˜áƒšáƒ˜áƒ¡ თáƒáƒ•სáƒáƒ áƒ—ი áƒáƒ áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ (%lu ბáƒáƒ˜áƒ¢áƒ˜)" -#: pg_backup_tar.c:1186 +#: pg_backup_tar.c:1201 #, c-format msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" msgstr "%s-ში ნáƒáƒžáƒáƒ•ნირდáƒáƒ–იáƒáƒœáƒ”ბული თáƒáƒ•სáƒáƒ áƒ—ი (მáƒáƒ•ელáƒáƒ“ი %d, გáƒáƒ›áƒáƒ—ვლილირ%d) ფáƒáƒ˜áƒšáƒ˜áƒ¡ პáƒáƒ–იციáƒáƒ–ე %llu" @@ -1295,10 +1464,10 @@ msgstr "%s-ში ნáƒáƒžáƒáƒ•ნირდáƒáƒ–იáƒáƒœáƒ”ბული თ msgid "unrecognized section name: \"%s\"" msgstr "სექციის უცნáƒáƒ‘ი სáƒáƒ®áƒ”ლი: %s" -#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365 -#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398 -#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307 -#: pg_restore.c:321 +#: pg_backup_utils.c:55 pg_dump.c:694 pg_dump.c:711 pg_dumpall.c:370 +#: pg_dumpall.c:380 pg_dumpall.c:388 pg_dumpall.c:396 pg_dumpall.c:403 +#: pg_dumpall.c:413 pg_dumpall.c:488 pg_restore.c:307 pg_restore.c:323 +#: pg_restore.c:337 #, c-format msgid "Try \"%s --help\" for more information." msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." @@ -1308,82 +1477,82 @@ msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ msgid "out of on_exit_nicely slots" msgstr "on_exit_nicely ტიპის სლáƒáƒ¢áƒ”ბი áƒáƒ¦áƒáƒ  დáƒáƒ áƒ©áƒ" -#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305 +#: pg_dump.c:709 pg_dumpall.c:378 pg_restore.c:321 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")" -#: pg_dump.c:696 pg_restore.c:328 +#: pg_dump.c:728 pg_restore.c:344 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -s/--schema-only დრ-a/--data-only ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" -#: pg_dump.c:699 +#: pg_dump.c:731 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -s/--schema-only დრ--include-foreign-data ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" -#: pg_dump.c:702 +#: pg_dump.c:734 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი --include-foreign-data მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირპáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡" -#: pg_dump.c:705 pg_restore.c:331 +#: pg_dump.c:737 pg_restore.c:347 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -c/--clean დრ-a/--data-only ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" -#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356 +#: pg_dump.c:740 pg_dumpall.c:408 pg_restore.c:375 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "--if-exists -ს -c/--clean პáƒáƒ áƒáƒ›áƒ”ტრი ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ" -#: pg_dump.c:715 +#: pg_dump.c:747 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "--on-conflict-do-nothing -ს --inserts, --rows-per-insert áƒáƒœ --column-inserts ესáƒáƒ­áƒ˜áƒ áƒáƒ”ბáƒ" -#: pg_dump.c:729 +#: pg_dump.c:776 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "შეკუმშვის უცხრáƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მი: \"%s\"" -#: pg_dump.c:736 +#: pg_dump.c:783 #, c-format msgid "invalid compression specification: %s" msgstr "შეკუმშვის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციფიკáƒáƒªáƒ˜áƒ: %s" -#: pg_dump.c:749 +#: pg_dump.c:796 #, c-format msgid "compression option \"%s\" is not currently supported by pg_dump" msgstr "შეკუმშვის პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\"-ი pg_dump-ის მიერ áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" -#: pg_dump.c:776 +#: pg_dump.c:808 #, c-format msgid "parallel backup only supported by the directory format" msgstr "პáƒáƒ áƒáƒšáƒ”ლური მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ მხáƒáƒšáƒáƒ“ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის რეჟიმშირმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი" -#: pg_dump.c:822 +#: pg_dump.c:854 #, c-format msgid "last built-in OID is %u" msgstr "ბáƒáƒšáƒ ჩáƒáƒ¨áƒ”ნებული OID %u" -#: pg_dump.c:831 +#: pg_dump.c:863 #, c-format msgid "no matching schemas were found" msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ სქემები ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" -#: pg_dump.c:848 +#: pg_dump.c:880 #, c-format msgid "no matching tables were found" msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ცხრილები ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" -#: pg_dump.c:876 +#: pg_dump.c:908 #, c-format msgid "no matching extensions were found" msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბები ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" -#: pg_dump.c:1056 +#: pg_dump.c:1092 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1392,17 +1561,17 @@ msgstr "" "%s მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ¡, რáƒáƒ’áƒáƒ áƒª ტექსტურ ფáƒáƒ˜áƒšáƒ¡ áƒáƒœ სხვრფáƒáƒ áƒ›áƒáƒ¢áƒ”ბს.\n" "\n" -#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433 +#: pg_dump.c:1093 pg_dumpall.c:635 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" -#: pg_dump.c:1058 +#: pg_dump.c:1094 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [ბáƒáƒ–ისსáƒáƒ®áƒ”ლი]\n" -#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436 +#: pg_dump.c:1096 pg_dumpall.c:638 pg_restore.c:455 #, c-format msgid "" "\n" @@ -1411,60 +1580,65 @@ msgstr "" "\n" "ზáƒáƒ’áƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_dump.c:1061 +#: pg_dump.c:1097 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=FILENAME გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n" -#: pg_dump.c:1062 +#: pg_dump.c:1098 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" " plain text (default))\n" msgstr "" " -F, --format=c|d|t|p გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ (custom, directory, tar\n" -" უბრáƒáƒšáƒ ტექსტი (ნáƒáƒ’ულისხმები))\n" +" უბრáƒáƒšáƒ ტექსტი (ნáƒáƒ’ულისხმევი))\n" -#: pg_dump.c:1064 +#: pg_dump.c:1100 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის პáƒáƒ áƒáƒšáƒ”ლური დáƒáƒ•áƒáƒšáƒ”ბის გáƒáƒ¨áƒ•ებáƒ\n" -#: pg_dump.c:1065 pg_dumpall.c:635 +#: pg_dump.c:1101 pg_dumpall.c:640 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: pg_dump.c:1066 pg_dumpall.c:636 +#: pg_dump.c:1102 pg_dumpall.c:641 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_dump.c:1067 +#: pg_dump.c:1103 #, c-format msgid "" -" -Z, --compress=METHOD[:LEVEL]\n" +" -Z, --compress=METHOD[:DETAIL]\n" " compress as specified\n" msgstr "" -" -Z, --compress=მეთáƒáƒ“ი[:დáƒáƒœáƒ”]\n" +" -Z, --compress=მეთáƒáƒ“ი[:წვრილმáƒáƒœáƒ˜]\n" " შეკუმშვის მითითებáƒ\n" -#: pg_dump.c:1069 pg_dumpall.c:637 +#: pg_dump.c:1105 pg_dumpall.c:642 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=TIMEOUT ცხრილის დáƒáƒ‘ლáƒáƒ™áƒ•ისáƒáƒ¡ TIMEOUT ის შემდეგ შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ’დებáƒ\n" -#: pg_dump.c:1070 pg_dumpall.c:664 +#: pg_dump.c:1106 pg_dumpall.c:670 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync áƒáƒ  დáƒáƒ•ელáƒáƒ“რცვლილებების დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡\n" -#: pg_dump.c:1071 pg_dumpall.c:638 +#: pg_dump.c:1107 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=მეთáƒáƒ“ი ფáƒáƒ˜áƒšáƒ”ბის დისკზე სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის დáƒáƒ§áƒ”ნებáƒ\n" + +#: pg_dump.c:1108 pg_dumpall.c:643 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_dump.c:1073 pg_dumpall.c:639 +#: pg_dump.c:1110 pg_dumpall.c:644 #, c-format msgid "" "\n" @@ -1473,60 +1647,62 @@ msgstr "" "\n" "პáƒáƒ áƒáƒ›áƒ”ტრები, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბენ გáƒáƒ›áƒáƒ¢áƒáƒœáƒáƒ¡:\n" -#: pg_dump.c:1074 pg_dumpall.c:640 +#: pg_dump.c:1111 pg_dumpall.c:645 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ იქნებრმხáƒáƒšáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მები, სქემის გáƒáƒ áƒ”შე\n" -#: pg_dump.c:1075 +#: pg_dump.c:1112 #, c-format -msgid "" -" -b, --large-objects include large objects in dump\n" -" --blobs (same as --large-objects, deprecated)\n" -msgstr "" -" -b, --large-objects დáƒáƒ›áƒžáƒ¨áƒ˜ დიდი áƒáƒ‘იექტების ჩáƒáƒ¡áƒ›áƒ\n" -" --blobs (იგივე, რáƒáƒª--large-objects, რáƒáƒ›áƒ”ლიც მáƒáƒ«áƒ•ელებულიáƒ)\n" +msgid " -b, --large-objects include large objects in dump\n" +msgstr " -b, --large-objects გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ იქნებრდიდი áƒáƒ‘იექტებიც\n" -#: pg_dump.c:1077 +#: pg_dump.c:1113 #, c-format -msgid "" -" -B, --no-large-objects exclude large objects in dump\n" -" --no-blobs (same as --no-large-objects, deprecated)\n" -msgstr "" -" -B, --no-large-objects დáƒáƒ›áƒžáƒ˜áƒ áƒ“áƒáƒœ დიდი áƒáƒ‘იექტების áƒáƒ›áƒáƒ¦áƒ”ბáƒ\n" -" --no-blobs (იგივე, რáƒáƒª --no-large-objects, რáƒáƒ›áƒ”ლიც მáƒáƒ«áƒ•ელებულიáƒ)\n" +msgid " --blobs (same as --large-objects, deprecated)\n" +msgstr " --blobs (იგივე, რáƒáƒª--large-objects, რáƒáƒ›áƒ”ლიც მáƒáƒ«áƒ•ელებულიáƒ)\n" + +#: pg_dump.c:1114 +#, c-format +msgid " -B, --no-large-objects exclude large objects in dump\n" +msgstr " -B, --no-large-objects დიდი áƒáƒ‘იექტები გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ áƒáƒ  იქნებáƒ\n" -#: pg_dump.c:1079 pg_restore.c:447 +#: pg_dump.c:1115 +#, c-format +msgid " --no-blobs (same as --no-large-objects, deprecated)\n" +msgstr " --no-blobs (იგივე, რáƒáƒª --no-large-objects, რáƒáƒ›áƒ”ლიც მáƒáƒ«áƒ•ელებულიáƒ)\n" + +#: pg_dump.c:1116 pg_restore.c:466 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean ბáƒáƒ–ის áƒáƒ‘იექტების წáƒáƒ¨áƒšáƒ თáƒáƒ•იდáƒáƒœ შექმნáƒáƒ›áƒ“ე\n" -#: pg_dump.c:1080 +#: pg_dump.c:1117 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr " -C, --create გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ¨áƒ˜ ბáƒáƒ–ის შექმნის ბრძáƒáƒœáƒ”ბების მიყáƒáƒšáƒ”ბáƒ\n" -#: pg_dump.c:1081 +#: pg_dump.c:1118 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr " -e, --extension=PATTERN მხáƒáƒšáƒáƒ“ მითითებული გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: pg_dump.c:1082 pg_dumpall.c:642 +#: pg_dump.c:1119 pg_dumpall.c:647 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=ENCODING მხáƒáƒšáƒáƒ“ მითითებული კáƒáƒ“ირების მქáƒáƒœáƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: pg_dump.c:1083 +#: pg_dump.c:1120 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=PATTERN მხáƒáƒšáƒáƒ“ მითითებული სქემების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: pg_dump.c:1084 +#: pg_dump.c:1121 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=PATTERN მითითებული სქემები გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ áƒáƒ  იქნებáƒ\n" -#: pg_dump.c:1085 +#: pg_dump.c:1122 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1535,52 +1711,52 @@ msgstr "" " -O, --no-owner უბრáƒáƒšáƒ ტექსტურ ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜ áƒáƒ‘იექტების მფლáƒáƒ‘ელáƒáƒ‘ის \n" " áƒáƒ¦áƒ“გენის გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ\n" -#: pg_dump.c:1087 pg_dumpall.c:646 +#: pg_dump.c:1124 pg_dumpall.c:651 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only áƒáƒ¦áƒ“გებრმხáƒáƒšáƒáƒ“ სქემები, მáƒáƒœáƒáƒªáƒ”მები კი áƒáƒ áƒ\n" -#: pg_dump.c:1088 +#: pg_dump.c:1125 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr " -S, --superuser=NAME უბრáƒáƒšáƒ ტექსტურ ფáƒáƒ˜áƒšáƒ¨áƒ˜ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: pg_dump.c:1089 +#: pg_dump.c:1126 #, c-format msgid " -t, --table=PATTERN dump only the specified table(s)\n" msgstr " -t, --table=შáƒáƒ‘ლáƒáƒœáƒ˜ მხáƒáƒšáƒáƒ“ მითითებული ცხრილების დáƒáƒ›áƒžáƒ˜\n" -#: pg_dump.c:1090 +#: pg_dump.c:1127 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=PATTERN მითითებული ცხრილები გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ áƒáƒ  იქნებáƒ\n" -#: pg_dump.c:1091 pg_dumpall.c:649 +#: pg_dump.c:1128 pg_dumpall.c:654 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges პრივილეგიები (dump/revoke) გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ áƒáƒ  იქნებáƒ\n" -#: pg_dump.c:1092 pg_dumpall.c:650 +#: pg_dump.c:1129 pg_dumpall.c:655 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრმხáƒáƒšáƒáƒ“ გáƒáƒœáƒáƒ®áƒšáƒ”ბის პრáƒáƒ’რáƒáƒ›áƒ”ბის მიერ\n" -#: pg_dump.c:1093 pg_dumpall.c:651 +#: pg_dump.c:1130 pg_dumpall.c:656 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr " --column-inserts მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ›áƒžáƒ˜ ისე, რáƒáƒ’áƒáƒ áƒª ბრძáƒáƒœáƒ”ბრINSERT, სვეტების სáƒáƒ®áƒ”ლებით\n" -#: pg_dump.c:1094 pg_dumpall.c:652 +#: pg_dump.c:1131 pg_dumpall.c:657 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr " --disable-dollar-quoting დáƒáƒšáƒáƒ áƒ˜áƒ— ციტირების გáƒáƒ›áƒáƒ áƒ—ვáƒ. სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒšáƒ˜ SQL ციტირების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" -#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464 +#: pg_dump.c:1132 pg_dumpall.c:658 pg_restore.c:483 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr " --disable-triggers მხáƒáƒšáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მების áƒáƒ¦áƒ“გენისáƒáƒ¡ ტრიგერების გáƒáƒ›áƒáƒ áƒ—ვáƒ\n" -#: pg_dump.c:1096 +#: pg_dump.c:1133 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" @@ -1589,23 +1765,28 @@ msgstr "" " --enable-row-security მწკრივების უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჩáƒáƒ áƒ—ვრ(მხáƒáƒšáƒáƒ“ იმ მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ›áƒžáƒ˜, \n" " რáƒáƒ–ეც მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს წვდáƒáƒ›áƒ გáƒáƒáƒ©áƒœáƒ˜áƒ)\n" -#: pg_dump.c:1098 +#: pg_dump.c:1135 +#, c-format +msgid " --exclude-extension=PATTERN do NOT dump the specified extension(s)\n" +msgstr " --exclude-extension=PATTERN მითითებული გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბ(ებ)-ი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ *áƒáƒ * იქნებáƒ\n" + +#: pg_dump.c:1136 #, c-format msgid "" " --exclude-table-and-children=PATTERN\n" -" do NOT dump the specified table(s),\n" -" including child and partition tables\n" +" do NOT dump the specified table(s), including\n" +" child and partition tables\n" msgstr "" " --exclude-table-and-children=შáƒáƒ‘ლáƒáƒœáƒ˜ \n" " მითითებული ცხრილები დáƒáƒ›áƒžáƒ¨áƒ˜ áƒáƒ  იქნებáƒ,\n" " შვილი დრდáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილების ჩáƒáƒ—ვლით\n" -#: pg_dump.c:1101 +#: pg_dump.c:1139 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " -T, --exclude-table=შáƒáƒ‘ლáƒáƒœáƒ˜ შáƒáƒ‘ლáƒáƒœáƒ˜áƒ— მითითებული ცხრილები\n" -#: pg_dump.c:1102 +#: pg_dump.c:1140 #, c-format msgid "" " --exclude-table-data-and-children=PATTERN\n" @@ -1616,17 +1797,26 @@ msgstr "" " მითითებული ცხრილების მáƒáƒœáƒáƒªáƒ”მები დáƒáƒ›áƒžáƒ¨áƒ˜ áƒáƒ  იქნებáƒ,\n" " შვილი დრდáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილების ჩáƒáƒ—ვლით\n" -#: pg_dump.c:1105 pg_dumpall.c:655 +#: pg_dump.c:1143 pg_dumpall.c:660 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" -msgstr " --extra-float-digits=NUM extra_float_digits-ის ნáƒáƒ’ულისხმები პáƒáƒ áƒáƒ›áƒ”ტრის გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•áƒ\n" +msgstr " --extra-float-digits=NUM extra_float_digits-ის ნáƒáƒ’ულისხმევი პáƒáƒ áƒáƒ›áƒ”ტრის გáƒáƒ“áƒáƒ¤áƒáƒ áƒ•áƒ\n" -#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466 +#: pg_dump.c:1144 +#, c-format +msgid "" +" --filter=FILENAME include or exclude objects and data from dump\n" +" based on expressions in FILENAME\n" +msgstr "" +" --filter=ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლი დáƒáƒ›áƒžáƒ˜áƒ“áƒáƒœ áƒáƒ‘იექტების დრმáƒáƒœáƒáƒªáƒ”მების, რáƒáƒ›áƒšáƒ”ბიც ემთხვევრმითითებულ\n" +" ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლში მყáƒáƒ¤ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¡, áƒáƒ›áƒáƒ¦áƒ”ბრáƒáƒœ ჩáƒáƒ¡áƒ›áƒ\n" + +#: pg_dump.c:1146 pg_dumpall.c:662 pg_restore.c:487 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists áƒáƒ‘იექტების გáƒáƒ“áƒáƒ§áƒ áƒ˜áƒ¡áƒáƒ¡ IF EXISTS -ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" -#: pg_dump.c:1107 +#: pg_dump.c:1147 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1637,87 +1827,87 @@ msgstr "" " მáƒáƒœáƒáƒªáƒ”მების ჩáƒáƒ¡áƒ›áƒ უცხრსერვერებზე მდებáƒáƒ áƒ” , უცხრცხრილებიდáƒáƒœ, რáƒáƒ›áƒšáƒ”ბიც\n" " შáƒáƒ‘ლáƒáƒœáƒ¡ ემთხვევáƒ\n" -#: pg_dump.c:1110 pg_dumpall.c:657 +#: pg_dump.c:1150 pg_dumpall.c:663 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ›áƒžáƒ˜ INSERT ბრძáƒáƒœáƒ”ბების მსგáƒáƒ•სáƒáƒ“, COPY-ის მáƒáƒ’იერ\n" -#: pg_dump.c:1111 pg_dumpall.c:658 +#: pg_dump.c:1151 pg_dumpall.c:664 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბის root ცხრილს გáƒáƒ•ლით ჩáƒáƒ¢áƒ•ირთვáƒ\n" -#: pg_dump.c:1112 pg_dumpall.c:659 +#: pg_dump.c:1152 pg_dumpall.c:665 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments კáƒáƒ›áƒ”ნტáƒáƒ áƒ”ბის გáƒáƒ áƒ”შე\n" -#: pg_dump.c:1113 pg_dumpall.c:660 +#: pg_dump.c:1153 pg_dumpall.c:666 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications გáƒáƒ›áƒáƒªáƒ”მების გáƒáƒ áƒ”შე\n" -#: pg_dump.c:1114 pg_dumpall.c:662 +#: pg_dump.c:1154 pg_dumpall.c:668 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჭდეების მინიჭებების გáƒáƒ áƒ”შე\n" -#: pg_dump.c:1115 pg_dumpall.c:663 +#: pg_dump.c:1155 pg_dumpall.c:669 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions გáƒáƒ›áƒáƒ¬áƒ”რების გáƒáƒ áƒ”შე\n" -#: pg_dump.c:1116 pg_dumpall.c:665 +#: pg_dump.c:1156 pg_dumpall.c:671 #, c-format msgid " --no-table-access-method do not dump table access methods\n" msgstr " --no-table-access-method ცხრილის წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ები\n" -#: pg_dump.c:1117 pg_dumpall.c:666 +#: pg_dump.c:1157 pg_dumpall.c:672 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces ცხრილის სივრცის მინიჭებები\n" -#: pg_dump.c:1118 pg_dumpall.c:667 +#: pg_dump.c:1158 pg_dumpall.c:673 #, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" msgstr " --no-toast-compression TOAST-ის შეკუმშვის მეთáƒáƒ“ები დáƒáƒ›áƒžáƒ¨áƒ˜ áƒáƒ  ჩáƒáƒ˜áƒ¬áƒ”რებáƒ\n" -#: pg_dump.c:1119 pg_dumpall.c:668 +#: pg_dump.c:1159 pg_dumpall.c:674 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data ის ცხრილები, რáƒáƒ›áƒšáƒ”ბსáƒáƒª ჟურნáƒáƒšáƒ˜ áƒáƒ  áƒáƒ¥áƒ•თ, დáƒáƒ›áƒžáƒ¨áƒ˜ áƒáƒ  ჩáƒáƒ˜áƒ¬áƒ”რებáƒ\n" -#: pg_dump.c:1120 pg_dumpall.c:669 +#: pg_dump.c:1160 pg_dumpall.c:675 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr " --on-conflict-do-nothing INSERT ბრძáƒáƒœáƒ”ბებისთვის ON CONFLICT DO NOTHING -ის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ\n" -#: pg_dump.c:1121 pg_dumpall.c:670 +#: pg_dump.c:1161 pg_dumpall.c:676 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr " --quote-all-identifiers ყველრიდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ციტირებáƒ. მáƒáƒ¨áƒ˜áƒœáƒáƒª კი, თუ ისინი სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ სიტყვები áƒáƒ áƒáƒ\n" -#: pg_dump.c:1122 pg_dumpall.c:671 +#: pg_dump.c:1162 pg_dumpall.c:677 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NROWS მწკრივების რიცხვი თითáƒáƒ”ული INSERT-ისთვის ; áƒáƒ¡áƒ”ვე მიუთითებს --inserts\n" -#: pg_dump.c:1123 +#: pg_dump.c:1163 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr " --section=სექცირმითითებული სექცირ(pre-data, data, áƒáƒœ post-data)\n" -#: pg_dump.c:1124 +#: pg_dump.c:1164 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr " --serializable-deferrable მáƒáƒªáƒ“áƒ, სáƒáƒœáƒáƒ› დáƒáƒ›áƒžáƒ˜áƒ¡ გáƒáƒ¨áƒ•ებრáƒáƒœáƒáƒ›áƒáƒšáƒ˜áƒ”ბის გáƒáƒ áƒ”შე იქნებრშესáƒáƒ«áƒšáƒ”ბელი\n" -#: pg_dump.c:1125 +#: pg_dump.c:1165 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT დáƒáƒ›áƒžáƒ˜áƒ¡áƒ—ვის მითითებული სწრáƒáƒ¤áƒ˜ áƒáƒ¡áƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" -#: pg_dump.c:1126 pg_restore.c:476 +#: pg_dump.c:1166 pg_restore.c:497 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" @@ -1726,16 +1916,16 @@ msgstr "" " --strict-names მáƒáƒ—ხáƒáƒ•ნáƒ, რáƒáƒ› ცხრილი áƒáƒœ/დრსქემრშეიცáƒáƒ•დეს შáƒáƒ‘ლáƒáƒœáƒ”ბს, რáƒáƒ›áƒšáƒ”ბიც\n" " ერთ ელემენტს მáƒáƒ˜áƒœáƒª ემთხვევáƒ\n" -#: pg_dump.c:1128 +#: pg_dump.c:1168 #, c-format msgid "" -" --table-and-children=PATTERN dump only the specified table(s),\n" -" including child and partition tables\n" +" --table-and-children=PATTERN dump only the specified table(s), including\n" +" child and partition tables\n" msgstr "" " --table-and-children=შáƒáƒ‘ლáƒáƒœáƒ˜ მხáƒáƒšáƒáƒ“ მითითებული ცხრილების დáƒáƒ›áƒžáƒ˜,\n" " შვილი დრდáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილების ჩáƒáƒ—ვლით\n" -#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478 +#: pg_dump.c:1170 pg_dumpall.c:678 pg_restore.c:500 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1746,7 +1936,7 @@ msgstr "" " მფლáƒáƒ‘ელáƒáƒ‘ის დáƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ ALTER OWNER ბრძáƒáƒœáƒ”ბების მáƒáƒ’იერ\n" " SET SESSION AUTHORIZATION -ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" -#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482 +#: pg_dump.c:1174 pg_dumpall.c:682 pg_restore.c:504 #, c-format msgid "" "\n" @@ -1755,42 +1945,42 @@ msgstr "" "\n" "შეერთების პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_dump.c:1135 +#: pg_dump.c:1175 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი\n" -#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483 +#: pg_dump.c:1176 pg_dumpall.c:684 pg_restore.c:505 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484 +#: pg_dump.c:1177 pg_dumpall.c:686 pg_restore.c:506 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜\n" -#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485 +#: pg_dump.c:1178 pg_dumpall.c:687 pg_restore.c:507 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486 +#: pg_dump.c:1179 pg_dumpall.c:688 pg_restore.c:508 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password áƒáƒ áƒáƒ¡áƒáƒ“ეს მკითხრპáƒáƒ áƒáƒšáƒ˜\n" -#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487 +#: pg_dump.c:1180 pg_dumpall.c:689 pg_restore.c:509 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password პáƒáƒ áƒáƒšáƒ˜áƒ¡ ყáƒáƒ•ელთვის კითხვრ(áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ უნდრხდებáƒáƒ“ეს)\n" -#: pg_dump.c:1141 pg_dumpall.c:684 +#: pg_dump.c:1181 pg_dumpall.c:690 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLENAME áƒáƒ¦áƒ“გენáƒáƒ›áƒ“ე SET ROLE -ის გáƒáƒ¨áƒ•ებáƒ\n" -#: pg_dump.c:1143 +#: pg_dump.c:1183 #, c-format msgid "" "\n" @@ -1803,530 +1993,537 @@ msgstr "" "ცვლáƒáƒ“ი გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ.\n" "\n" -#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494 +#: pg_dump.c:1185 pg_dumpall.c:694 pg_restore.c:516 #, c-format msgid "Report bugs to <%s>.\n" msgstr "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: <%s>\n" -#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495 +#: pg_dump.c:1186 pg_dumpall.c:695 pg_restore.c:517 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" -#: pg_dump.c:1165 pg_dumpall.c:513 +#: pg_dump.c:1205 pg_dumpall.c:518 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "კლიენტის მითითებული კáƒáƒ“ირებრáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: %s" -#: pg_dump.c:1303 +#: pg_dump.c:1352 #, c-format msgid "parallel dumps from standby servers are not supported by this server version" msgstr "სერვერის áƒáƒ› ვერსიáƒáƒ¨áƒ˜ უქმე სერვერებიდáƒáƒœ პáƒáƒ áƒáƒšáƒ”ლური დáƒáƒ›áƒžáƒ˜ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" -#: pg_dump.c:1368 +#: pg_dump.c:1417 #, c-format msgid "invalid output format \"%s\" specified" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ მითითებული ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: %s" -#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1456 +#: pg_dump.c:1458 pg_dump.c:1514 pg_dump.c:1567 pg_dumpall.c:1467 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სრული სáƒáƒ®áƒ”ლი (ძáƒáƒšáƒ˜áƒáƒœ ბევრი წერტილიáƒáƒœáƒ˜ სáƒáƒ®áƒ”ლი): %s" -#: pg_dump.c:1417 +#: pg_dump.c:1466 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ სქემრშáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡áƒ—ვის \"%s\" ვერ ვიპáƒáƒ•ე" -#: pg_dump.c:1470 +#: pg_dump.c:1519 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრშáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡áƒ—ვის \"%s\" ვერ ვიპáƒáƒ•ე" -#: pg_dump.c:1523 +#: pg_dump.c:1572 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ უცხრსერვერი შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡áƒ—ვის \"%s\" ვერ ვიპáƒáƒ•ე" -#: pg_dump.c:1594 +#: pg_dump.c:1643 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "ურთიერთáƒáƒ‘ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი (ძáƒáƒšáƒ˜áƒáƒœ ბევრი წერტილიáƒáƒœáƒ˜ სáƒáƒ®áƒ”ლი): %s" -#: pg_dump.c:1616 +#: pg_dump.c:1665 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ცხრილი შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡áƒ—ვის \"%s\" ვერ ვიპáƒáƒ•ე" -#: pg_dump.c:1643 +#: pg_dump.c:1692 #, c-format msgid "You are currently not connected to a database." msgstr "áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებული áƒáƒ  ბრძáƒáƒœáƒ“ებით." -#: pg_dump.c:1646 +#: pg_dump.c:1695 #, c-format msgid "cross-database references are not implemented: %s" msgstr "ბáƒáƒ–ებს შáƒáƒ áƒ˜áƒ¡ ბმულები გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ: %s" -#: pg_dump.c:2077 +#: pg_dump.c:2154 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "ცხრილის შემცველáƒáƒ‘ის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ: \"%s.%s\"" -#: pg_dump.c:2183 +#: pg_dump.c:2264 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "ცხრილის (\"%s\") დáƒáƒ›áƒžáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: PQgetCopyData() failed." -#: pg_dump.c:2184 pg_dump.c:2194 +#: pg_dump.c:2265 pg_dump.c:2275 #, c-format msgid "Error message from server: %s" msgstr "შეცდáƒáƒ›áƒ სერვერიდáƒáƒœ: %s" -#: pg_dump.c:2185 pg_dump.c:2195 +#: pg_dump.c:2266 pg_dump.c:2276 #, c-format msgid "Command was: %s" msgstr "ბრძáƒáƒœáƒ”ბრიყáƒ: %s" -#: pg_dump.c:2193 +#: pg_dump.c:2274 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "ცხრილის (\"%s\") დáƒáƒ›áƒžáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: PQgetResult() failed." -#: pg_dump.c:2275 +#: pg_dump.c:2365 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "ცხრილიდáƒáƒœ \"%s\" მიღებულირველების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ" -#: pg_dump.c:2973 +#: pg_dump.c:3067 #, c-format msgid "saving database definition" msgstr "ბáƒáƒ–ის áƒáƒ¦áƒ¬áƒ”რის შენáƒáƒ®áƒ•áƒ" -#: pg_dump.c:3078 +#: pg_dump.c:3176 #, c-format msgid "unrecognized locale provider: %s" msgstr "ენის უცნáƒáƒ‘ი მáƒáƒ›áƒ¬áƒáƒ“ებელი: %s" -#: pg_dump.c:3446 +#: pg_dump.c:3537 #, c-format msgid "saving encoding = %s" msgstr "კáƒáƒ“ირების შენáƒáƒ®áƒ•რ= %s" -#: pg_dump.c:3471 +#: pg_dump.c:3562 #, c-format -msgid "saving standard_conforming_strings = %s" -msgstr "შენáƒáƒ®áƒ•áƒ: standard_conforming_strings = %s" +msgid "saving \"standard_conforming_strings = %s\"" +msgstr "შენáƒáƒ®áƒ•áƒ: \"standard_conforming_strings = %s\"" -#: pg_dump.c:3510 +#: pg_dump.c:3601 #, c-format msgid "could not parse result of current_schemas()" msgstr "current_schemas() -ის შედეგის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" -#: pg_dump.c:3529 +#: pg_dump.c:3620 #, c-format -msgid "saving search_path = %s" -msgstr "შენáƒáƒ®áƒ•áƒ: search_path = %s" +msgid "saving \"search_path = %s\"" +msgstr "შენáƒáƒ®áƒ•áƒ: \"search_path = %s\"" -#: pg_dump.c:3566 +#: pg_dump.c:3656 #, c-format msgid "reading large objects" msgstr "დიდი áƒáƒ‘იექტების კითხვáƒ" -#: pg_dump.c:3704 +#: pg_dump.c:3877 #, c-format -msgid "saving large objects" -msgstr "დიდი áƒáƒ‘იექტების შენáƒáƒ®áƒ•áƒ" +msgid "saving large objects \"%s\"" +msgstr "მიმდინáƒáƒ áƒ”áƒáƒ‘ს შენáƒáƒ®áƒ•რდიდი áƒáƒ‘იექტებისთვის \"%s\"" -#: pg_dump.c:3745 +#: pg_dump.c:3898 #, c-format msgid "error reading large object %u: %s" msgstr "დიდი áƒáƒ‘იექტის (%u) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s" -#: pg_dump.c:3851 +#: pg_dump.c:4001 #, c-format msgid "reading row-level security policies" msgstr "მწკრივის დáƒáƒœáƒ˜áƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის წესების წáƒáƒ™áƒ˜áƒ—ხვáƒ" -#: pg_dump.c:3992 +#: pg_dump.c:4142 #, c-format msgid "unexpected policy command type: %c" msgstr "წესების ბრძáƒáƒœáƒ”ბის მáƒáƒ£áƒšáƒáƒ“ნელი ტიპი: %c" -#: pg_dump.c:4442 pg_dump.c:4777 pg_dump.c:11999 pg_dump.c:17866 -#: pg_dump.c:17868 pg_dump.c:18489 +#: pg_dump.c:4592 pg_dump.c:5150 pg_dump.c:12362 pg_dump.c:18246 +#: pg_dump.c:18248 pg_dump.c:18870 #, c-format msgid "could not parse %s array" msgstr "მáƒáƒ¡áƒ˜áƒ•ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: %s" -#: pg_dump.c:4630 +#: pg_dump.c:4806 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "გáƒáƒ›áƒáƒ¬áƒ”რები დáƒáƒ›áƒžáƒ¨áƒ˜ áƒáƒ  ჩáƒáƒ¬áƒ”რილáƒ. მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ áƒáƒ" -#: pg_dump.c:5166 +#: pg_dump.c:5012 +#, c-format +msgid "subscription with OID %u does not exist" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რრOID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: pg_dump.c:5019 +#, c-format +msgid "failed sanity check, table with OID %u not found" +msgstr "სისწáƒáƒ áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ. ცხრილი OID-ით %u áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ" + +#: pg_dump.c:5582 #, c-format msgid "could not find parent extension for %s %s" msgstr "%s-სთვის მშáƒáƒ‘ელი გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრვერ ვიპáƒáƒ•ე %s" -#: pg_dump.c:5311 +#: pg_dump.c:5727 #, c-format msgid "schema with OID %u does not exist" msgstr "სქემრOID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_dump.c:6791 pg_dump.c:17130 +#: pg_dump.c:7209 pg_dump.c:17617 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "სისწáƒáƒ áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ. მშáƒáƒ‘ელი ცხრილი OID-ით %u მიმდევრáƒáƒ‘იდáƒáƒœ OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_dump.c:6934 +#: pg_dump.c:7352 #, c-format msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found" msgstr "სისწáƒáƒ áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ. pg_parttioned_table-ში მáƒáƒ®áƒ¡áƒ”ნიებული ცხრილი OID-ით %u ვერ ვიპáƒáƒ•ე" -#: pg_dump.c:7165 pg_dump.c:7432 pg_dump.c:7903 pg_dump.c:8567 pg_dump.c:8686 -#: pg_dump.c:8834 +#: pg_dump.c:7583 pg_dump.c:7857 pg_dump.c:8304 pg_dump.c:8918 pg_dump.c:9040 +#: pg_dump.c:9188 #, c-format msgid "unrecognized table OID %u" msgstr "ცხრილის უცნáƒáƒ‘ი OID: %u" -#: pg_dump.c:7169 +#: pg_dump.c:7587 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი ინდექსის მáƒáƒœáƒáƒªáƒ”მები ცხრილისთვის \"%s\"" -#: pg_dump.c:7664 +#: pg_dump.c:8089 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "სისწáƒáƒ áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ. მშáƒáƒ‘ელი ცხრილი OID-ით %u pg_rewrite-ის ელემენტიდáƒáƒœ OID-ით %u ვერ ვიპáƒáƒ•ე" -#: pg_dump.c:7955 -#, c-format -msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" -msgstr "მáƒáƒ—ხáƒáƒ•ნის შედეგირნულáƒáƒ•áƒáƒœáƒ˜ ბმის ცხრილის სáƒáƒ®áƒ”ლის უცხრგáƒáƒ¡áƒáƒ¦áƒ”ბის ტრიგერი \"%s\" ცხრილზე \"%s\" (ცხრილის OID: %u)" - -#: pg_dump.c:8571 +#: pg_dump.c:8922 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "სვეტის მáƒáƒ£áƒšáƒáƒ“ნელი მáƒáƒœáƒáƒªáƒ”მები ცხრილისთვის %s" -#: pg_dump.c:8600 +#: pg_dump.c:8951 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "ცხრილში \"%s\" სვეტები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“áƒáƒ დáƒáƒœáƒáƒ›áƒ áƒ˜áƒšáƒ˜" -#: pg_dump.c:8648 +#: pg_dump.c:9002 #, c-format msgid "finding table default expressions" -msgstr "ვეძებ ცხრილის ნáƒáƒ’ულისხმებ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებს" +msgstr "ვეძებ ცხრილის ნáƒáƒ’ულისხმევ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბებს" -#: pg_dump.c:8690 +#: pg_dump.c:9044 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "adnum -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ%d ცხრილისთვის \"%s\"" -#: pg_dump.c:8784 +#: pg_dump.c:9138 #, c-format msgid "finding table check constraints" msgstr "ვეძებ ცხრილის შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვებს" -#: pg_dump.c:8838 +#: pg_dump.c:9192 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "მáƒáƒ•ელáƒáƒ“ი %d შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვáƒáƒ¡ ცხრილზე \"%s\", მáƒáƒ’რáƒáƒ› %d" msgstr[1] "მáƒáƒ•ელáƒáƒ“ი %d შემáƒáƒ¬áƒ›áƒ”ბის შეზღუდვáƒáƒ¡ ცხრილზე \"%s\", მáƒáƒ’რáƒáƒ› %d" -#: pg_dump.c:8842 +#: pg_dump.c:9196 #, c-format msgid "The system catalogs might be corrupted." msgstr "სისტემის კáƒáƒ¢áƒáƒšáƒáƒ’ი შეიძლებრდáƒáƒ–იáƒáƒœáƒ”ბულიáƒ." -#: pg_dump.c:9532 +#: pg_dump.c:9886 #, c-format msgid "role with OID %u does not exist" msgstr "რáƒáƒšáƒ˜ OID-ით %u áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_dump.c:9644 pg_dump.c:9673 +#: pg_dump.c:9998 pg_dump.c:10027 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "pg_init_privs -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი: %u %u %d" -#: pg_dump.c:10494 +#: pg_dump.c:10574 +#, c-format +msgid "missing metadata for large objects \"%s\"" +msgstr "áƒáƒ™áƒšáƒ˜áƒ მეტáƒáƒ›áƒáƒœáƒáƒªáƒ”მები დიდი áƒáƒ‘იექტებისთვის \"%s\"" + +#: pg_dump.c:10857 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "მáƒáƒœáƒáƒªáƒ”მის ტიპი %s-ის typetype თურმე áƒáƒ áƒáƒ¡áƒáƒ áƒ˜áƒ" -#: pg_dump.c:12068 +#: pg_dump.c:12431 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "უცნáƒáƒ‘ი provolatile მნიშვნელáƒáƒ‘რფუნქციისთვის \"%s\"" -#: pg_dump.c:12118 pg_dump.c:13962 +#: pg_dump.c:12481 pg_dump.c:14377 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "უცნáƒáƒ‘ი proparallel მნიშვნელáƒáƒ‘რფუნქციისთვის \"%s\"" -#: pg_dump.c:12247 pg_dump.c:12353 pg_dump.c:12360 +#: pg_dump.c:12611 pg_dump.c:12717 pg_dump.c:12724 #, c-format msgid "could not find function definition for function with OID %u" msgstr "ფუნქციის áƒáƒ¦áƒ¬áƒ”რრფუნქციისთვის OID-ით %u ვერ ვიპáƒáƒ•ე" -#: pg_dump.c:12286 +#: pg_dump.c:12650 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "pg_cast.castfunc áƒáƒœ pg_cast.castmethod ველების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ" -#: pg_dump.c:12289 +#: pg_dump.c:12653 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "pg_cast.castmethod ველის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ" -#: pg_dump.c:12379 +#: pg_dump.c:12743 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ. ერთ-ერთი, trffromsql áƒáƒœ trftosql ნულს áƒáƒ  უნდრუდრიდეს" -#: pg_dump.c:12396 +#: pg_dump.c:12760 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "pg_transform.trffromsql ველის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ" -#: pg_dump.c:12417 +#: pg_dump.c:12781 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "pg_transform.trftosql ველის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ" -#: pg_dump.c:12562 +#: pg_dump.c:12926 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "postfix áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბი მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ¦áƒáƒ áƒáƒ (áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ \"%s\")" -#: pg_dump.c:12732 +#: pg_dump.c:13096 #, c-format msgid "could not find operator with OID %s" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜ OID-ით %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_dump.c:12800 +#: pg_dump.c:13164 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ის (%2$s) áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %1$c" -#: pg_dump.c:13457 +#: pg_dump.c:13838 pg_dump.c:13906 #, c-format msgid "unrecognized collation provider: %s" msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ უცნáƒáƒ‘ი მáƒáƒ›áƒ¬áƒáƒ“ებელი: %s" -#: pg_dump.c:13881 +#: pg_dump.c:13847 pg_dump.c:13854 pg_dump.c:13865 pg_dump.c:13875 +#: pg_dump.c:13890 +#, c-format +msgid "invalid collation \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒšáƒáƒªáƒ˜áƒ \"%s\"" + +#: pg_dump.c:14296 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ (%s) aggfinalmodify -ის უცნáƒáƒ‘ი ტიპი" -#: pg_dump.c:13937 +#: pg_dump.c:14352 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ (%s) aggmfinalmodify -ის უცნáƒáƒ‘ი ტიპი" -#: pg_dump.c:14654 +#: pg_dump.c:15069 #, c-format msgid "unrecognized object type in default privileges: %d" -msgstr "ნáƒáƒ’ულისხმებ პრივილეგიებში áƒáƒ áƒ¡áƒ”ბული áƒáƒ‘იექტის უცნáƒáƒ‘ი ტიპი: %d" +msgstr "ნáƒáƒ’ულისხმევ პრივილეგიებში áƒáƒ áƒ¡áƒ”ბული áƒáƒ‘იექტის უცნáƒáƒ‘ი ტიპი: %d" -#: pg_dump.c:14670 +#: pg_dump.c:15085 #, c-format msgid "could not parse default ACL list (%s)" msgstr "ნáƒáƒ’ულიხმები ACL სიის áƒáƒœáƒáƒšáƒ˜áƒ–ი შეუძლებელიáƒ: %s" -#: pg_dump.c:14752 +#: pg_dump.c:15169 #, c-format msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" -msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ACL სიის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ áƒáƒœ ნáƒáƒ’ულისხმები (%s) áƒáƒ‘იექტისთვის \"%s\" (%s)" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ACL სიის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ áƒáƒœ ნáƒáƒ’ულისხმევი (%s) áƒáƒ‘იექტისთვის \"%s\" (%s)" -#: pg_dump.c:14777 +#: pg_dump.c:15194 #, c-format msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" -msgstr "შეცდáƒáƒ›áƒ ACL სიის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებისáƒáƒ¡ áƒáƒœ ნáƒáƒ’ულისხმები (%s) áƒáƒ‘იექტისთვის \"%s\" (%s)" +msgstr "შეცდáƒáƒ›áƒ ACL სიის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებისáƒáƒ¡ áƒáƒœ ნáƒáƒ’ულისხმევი (%s) áƒáƒ‘იექტისთვის \"%s\" (%s)" -#: pg_dump.c:15315 +#: pg_dump.c:15737 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "ხედის (%s) áƒáƒ¦áƒ¬áƒ”რის გáƒáƒ›áƒáƒ—ხáƒáƒ•áƒáƒ› მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  დáƒáƒáƒ‘რუნáƒ" -#: pg_dump.c:15318 +#: pg_dump.c:15740 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "ხედის (%s) áƒáƒ¦áƒ¬áƒ”რის გáƒáƒ›áƒáƒ—ხáƒáƒ•áƒáƒ› ერთზე მეტი áƒáƒ¦áƒ¬áƒ”რრდáƒáƒáƒ‘რუნáƒ" -#: pg_dump.c:15325 +#: pg_dump.c:15747 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "ხედის (%s) áƒáƒ¦áƒ¬áƒ”რáƒ, რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, ცáƒáƒ áƒ˜áƒ”ლირ(ნულáƒáƒ•áƒáƒœáƒ˜ სიგრძე)" -#: pg_dump.c:15409 +#: pg_dump.c:15832 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS-ები უკვე მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირ(ცხრილი \"%s\")" -#: pg_dump.c:16333 +#: pg_dump.c:16819 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "სვეტების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რიცხვი %d ცხრილისთვის %s" -#: pg_dump.c:16411 +#: pg_dump.c:16897 #, c-format msgid "could not parse index statistic columns" msgstr "ინდექსის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ სვეტების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" -#: pg_dump.c:16413 +#: pg_dump.c:16899 #, c-format msgid "could not parse index statistic values" msgstr "ინდექსის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მნიშვნელáƒáƒ‘ების დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" -#: pg_dump.c:16415 +#: pg_dump.c:16901 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "ინდექსის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡áƒ—ვის სვეტებისრდრმნიშვნელáƒáƒ‘ების რáƒáƒáƒ“ენáƒáƒ‘რáƒáƒ  ემთხვევáƒ" -#: pg_dump.c:16631 +#: pg_dump.c:17116 #, c-format msgid "missing index for constraint \"%s\"" msgstr "შეზღუდვáƒáƒ¡ ინდექსი áƒáƒ™áƒšáƒ˜áƒ: \"%s\"" -#: pg_dump.c:16864 +#: pg_dump.c:17351 #, c-format msgid "unrecognized constraint type: %c" msgstr "შეზღუდვის უცნáƒáƒ‘ი ტიპი: %c" -#: pg_dump.c:16965 pg_dump.c:17194 +#: pg_dump.c:17452 pg_dump.c:17681 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "მáƒáƒ—ხáƒáƒ•ნáƒáƒ›, რáƒáƒ›áƒ”ლსáƒáƒª მáƒáƒœáƒáƒªáƒ”მები მიმდევრáƒáƒ‘იდáƒáƒœ (%s) უნდრმიეღáƒ, %d მწკრივი დáƒáƒáƒ‘რუნáƒ. (მáƒáƒ•ელáƒáƒ“ი: 1)" msgstr[1] "მáƒáƒ—ხáƒáƒ•ნáƒáƒ›, რáƒáƒ›áƒ”ლსáƒáƒª მáƒáƒœáƒáƒªáƒ”მები მიმდევრáƒáƒ‘იდáƒáƒœ (%s) უნდრმიეღáƒ, %d მწკრივი დáƒáƒáƒ‘რუნáƒ. (მáƒáƒ•ელáƒáƒ“ი: 1)" -#: pg_dump.c:16997 +#: pg_dump.c:17484 #, c-format msgid "unrecognized sequence type: %s" msgstr "მიმდევრáƒáƒ‘ის უცნáƒáƒ‘ი ტიპი: %s" -#: pg_dump.c:17286 -#, c-format -msgid "unexpected tgtype value: %d" -msgstr "tgtype -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: %d" - -#: pg_dump.c:17358 -#, c-format -msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" -msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტის სტრიქáƒáƒœáƒ˜ (%s) ტრიგერისთვის \"%s\" ცხრილზე \"%s\"" - -#: pg_dump.c:17627 +#: pg_dump.c:17998 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "მáƒáƒ—ხáƒáƒ•ნის შეცდáƒáƒ›áƒ, რáƒáƒ›áƒ”ლსáƒáƒª ცხრილისთვის \"%2$s\" წესი \"%1$s\" უნდრმიეღáƒ: დáƒáƒ‘რუნებულირმწკრივების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ" -#: pg_dump.c:17780 +#: pg_dump.c:18151 #, c-format msgid "could not find referenced extension %u" msgstr "მიბმული გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრ(%u) ვერ ვიპáƒáƒ•ე" -#: pg_dump.c:17870 +#: pg_dump.c:18250 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბისრდრპირáƒáƒ‘ების რáƒáƒáƒ“ენáƒáƒ‘რგáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბისთვის áƒáƒ  ემთხვევáƒ" -#: pg_dump.c:18002 +#: pg_dump.c:18382 #, c-format msgid "reading dependency data" msgstr "დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულების მáƒáƒœáƒáƒªáƒ”მების კითხვáƒ" -#: pg_dump.c:18088 +#: pg_dump.c:18468 #, c-format msgid "no referencing object %u %u" msgstr "მიბმáƒáƒ“ი áƒáƒ‘იექტის გáƒáƒ áƒ”შე %u %u" -#: pg_dump.c:18099 +#: pg_dump.c:18479 #, c-format msgid "no referenced object %u %u" msgstr "მიბმული áƒáƒ‘იექტის გáƒáƒ áƒ”შე %u %u" -#: pg_dump_sort.c:422 +#: pg_dump.c:18904 pg_dump.c:18942 pg_dumpall.c:1962 pg_restore.c:551 +#: pg_restore.c:597 +#, c-format +msgid "%s filter for \"%s\" is not allowed" +msgstr "ფილტრი %s \"%s\"-სთვის დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" + +#: pg_dump_sort.c:424 #, c-format msgid "invalid dumpId %d" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ dumpId %d" -#: pg_dump_sort.c:428 +#: pg_dump_sort.c:430 #, c-format msgid "invalid dependency %d" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებრ%d" -#: pg_dump_sort.c:661 +#: pg_dump_sort.c:594 #, c-format msgid "could not identify dependency loop" msgstr "დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებების მáƒáƒ áƒ§áƒ£áƒŸáƒ”ბი ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" -#: pg_dump_sort.c:1232 +#: pg_dump_sort.c:1209 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "ცხრილები, რáƒáƒ›áƒšáƒ”ბშიც áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირწრიული გáƒáƒ áƒ”-გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვები:" msgstr[1] "ცხრილები, რáƒáƒ›áƒšáƒ”ბშიც áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილირწრიული გáƒáƒ áƒ”-გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვები:" -#: pg_dump_sort.c:1236 pg_dump_sort.c:1256 -#, c-format -msgid " %s" -msgstr " %s" - -#: pg_dump_sort.c:1237 +#: pg_dump_sort.c:1214 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "შეიძლებრდáƒáƒ›áƒžáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრ--disable-trigger-ების გáƒáƒ›áƒáƒ áƒ—ვის áƒáƒœ დრáƒáƒ”ბით შეზღუდვების გáƒáƒ“áƒáƒ§áƒ áƒ˜áƒ¡ გáƒáƒ áƒ”შე ვერ შეძლáƒáƒ—." -#: pg_dump_sort.c:1238 +#: pg_dump_sort.c:1215 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "áƒáƒ› პრáƒáƒ‘ლემის áƒáƒ¡áƒáƒ áƒ˜áƒ“ებლáƒáƒ“ უმჯáƒáƒ‘ესირ--data-only -ის მáƒáƒ’იერ სრული დáƒáƒ›áƒžáƒ˜ áƒáƒ˜áƒ¦áƒáƒ—." -#: pg_dump_sort.c:1250 +#: pg_dump_sort.c:1227 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "áƒáƒ› ელემენტებს შáƒáƒ áƒ˜áƒ¡ დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებების მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ:" -#: pg_dumpall.c:230 +#: pg_dumpall.c:231 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "პრáƒáƒ’რáƒáƒ›áƒ \"%s\" სჭირდებრ\"%s\"-ს, მáƒáƒ’რáƒáƒ› იგივე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში, სáƒáƒ“áƒáƒª \"%s\", ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" -#: pg_dumpall.c:233 +#: pg_dumpall.c:234 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "პრáƒáƒ’რáƒáƒ›áƒ „%s“ ნáƒáƒžáƒáƒ•ნირ„%s“-ის მიერ, მáƒáƒ’რáƒáƒ› ვერსიáƒ, იგივერáƒáƒ áƒáƒ, რáƒáƒª %s" -#: pg_dumpall.c:382 +#: pg_dumpall.c:387 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი --exclude-database áƒáƒ  შეიძლებრ-g/--globals-only, -r/--roles-only, დრ-t/--tablespaces-only -სთáƒáƒœ ერთáƒáƒ“ იყáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებული" -#: pg_dumpall.c:390 +#: pg_dumpall.c:395 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -g/--globals-only დრ-r/--roles-only ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" -#: pg_dumpall.c:397 +#: pg_dumpall.c:402 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -g/--globals-only დრ-t/--tablespaces-only ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" -#: pg_dumpall.c:407 +#: pg_dumpall.c:412 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები -r/--roles-only დრ-t/--tablespaces-only ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" -#: pg_dumpall.c:469 pg_dumpall.c:1757 +#: pg_dumpall.c:474 pg_dumpall.c:1771 #, c-format msgid "could not connect to database \"%s\"" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ დáƒáƒ™áƒáƒ•შირებრვერ მáƒáƒ®áƒ”რხდრ\"%s\"" -#: pg_dumpall.c:481 +#: pg_dumpall.c:486 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2335,7 +2532,7 @@ msgstr "" "ვერ დáƒáƒ£áƒ™áƒáƒ•შირდრმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ებს \"postgres\" áƒáƒœ \"template1\"\n" "გთხáƒáƒ•თ მიუთითáƒáƒ— áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒ." -#: pg_dumpall.c:629 +#: pg_dumpall.c:634 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2344,67 +2541,72 @@ msgstr "" "%s-ი PostgreSQL-ის ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რს SQL სკრიპტის ფáƒáƒ˜áƒšáƒ¨áƒ˜ გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ¡.\n" "\n" -#: pg_dumpall.c:631 +#: pg_dumpall.c:636 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]...\n" -#: pg_dumpall.c:634 +#: pg_dumpall.c:639 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=FILENAME გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n" -#: pg_dumpall.c:641 +#: pg_dumpall.c:646 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean ბáƒáƒ–ის წáƒáƒ¨áƒšáƒ თáƒáƒ•იდáƒáƒœ შექმნáƒáƒ›áƒ“ე\n" -#: pg_dumpall.c:643 +#: pg_dumpall.c:648 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr " -g, --globals-only წáƒáƒ˜áƒ¨áƒšáƒ”ბრმხáƒáƒšáƒáƒ“ გლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ áƒáƒ‘იექტები დრáƒáƒ áƒ ბáƒáƒ–ები\n" -#: pg_dumpall.c:644 pg_restore.c:456 +#: pg_dumpall.c:649 pg_restore.c:475 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner áƒáƒ‘იექტების მფლáƒáƒ‘ელáƒáƒ‘ის áƒáƒ¦áƒ“გენის გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ\n" -#: pg_dumpall.c:645 +#: pg_dumpall.c:650 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr " -r, --roles-only გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ¡ მხáƒáƒšáƒáƒ“ რáƒáƒšáƒ”ბს დრáƒáƒ áƒª ბáƒáƒ–ებს დრáƒáƒ áƒª ცხრილების სივრცეებს\n" -#: pg_dumpall.c:647 +#: pg_dumpall.c:652 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr " -S, --superuser=NAME გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებელი ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: pg_dumpall.c:648 +#: pg_dumpall.c:653 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr " -t, --tablespaces-only გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ¡ მხლáƒáƒ“ ცხრილების სივრცეებს დრáƒáƒ áƒª ბáƒáƒ–ებს დრáƒáƒ áƒª რáƒáƒšáƒ”ბს\n" -#: pg_dumpall.c:654 +#: pg_dumpall.c:659 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr " --exclude-database=PATTERN გáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒáƒ•ს ბáƒáƒ–ებს, რáƒáƒ›áƒšáƒ”ბიც PATTERN-ს ემთხვევáƒ\n" #: pg_dumpall.c:661 #, c-format +msgid " --filter=FILENAME exclude databases based on expressions in FILENAME\n" +msgstr " --filter=FILENAME ფáƒáƒ˜áƒšáƒ¨áƒ˜ მითითებული მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ების áƒáƒ›áƒáƒ¦áƒ”ბáƒ\n" + +#: pg_dumpall.c:667 +#, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords რáƒáƒšáƒ”ბის პáƒáƒ áƒáƒšáƒ”ბი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒš áƒáƒ  იქნებáƒ\n" -#: pg_dumpall.c:677 +#: pg_dumpall.c:683 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=CONNSTR კáƒáƒ•შირის სტრიქáƒáƒœáƒ˜\n" -#: pg_dumpall.c:679 +#: pg_dumpall.c:685 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ ბáƒáƒ–ის სáƒáƒ®áƒ”ლი)\n" -#: pg_dumpall.c:686 +#: pg_dumpall.c:692 #, c-format msgid "" "\n" @@ -2417,97 +2619,106 @@ msgstr "" "სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒš გáƒáƒ›áƒáƒ¢áƒáƒœáƒáƒ–ე იქნებრგáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜.\n" "\n" -#: pg_dumpall.c:828 +#: pg_dumpall.c:837 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი, რáƒáƒ›áƒ”ლიც \"pg_\"-ით იწყებáƒ, გáƒáƒ›áƒáƒ¢áƒáƒ•ებულირ(%s)" -#: pg_dumpall.c:1050 +#: pg_dumpall.c:1059 #, c-format msgid "could not find a legal dump ordering for memberships in role \"%s\"" msgstr "სწáƒáƒ áƒ˜ დáƒáƒ›áƒžáƒ˜áƒ¡ მიმდევრáƒáƒ‘რწევრáƒáƒ‘ისთვის რáƒáƒšáƒ¨áƒ˜ \"%s\" áƒáƒ¦áƒ›áƒáƒ©áƒ”ნილი áƒáƒ áƒáƒ" -#: pg_dumpall.c:1184 +#: pg_dumpall.c:1194 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "ვერ გáƒáƒáƒœáƒáƒšáƒ˜áƒ–დრACL სირ(%s) პáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\"" -#: pg_dumpall.c:1302 +#: pg_dumpall.c:1321 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "შეცდáƒáƒ›áƒ ACL-ის სიის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებისთვის ცხრილის სივრცისთვის \"%s\"" -#: pg_dumpall.c:1517 +#: pg_dumpall.c:1528 #, c-format msgid "excluding database \"%s\"" msgstr "გáƒáƒ›áƒáƒ˜áƒ áƒ˜áƒªáƒ®áƒ ბáƒáƒ–რ\"%s\"" -#: pg_dumpall.c:1521 +#: pg_dumpall.c:1532 #, c-format msgid "dumping database \"%s\"" msgstr "დáƒáƒ›áƒžáƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ ბáƒáƒ–ისთვის \"%s\"" -#: pg_dumpall.c:1552 +#: pg_dumpall.c:1563 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "pg_dump -ის შეცდáƒáƒ›áƒ ბáƒáƒ–áƒáƒ–ე \"%s\". დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" -#: pg_dumpall.c:1558 +#: pg_dumpall.c:1569 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ თáƒáƒ•იდáƒáƒœ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m" -#: pg_dumpall.c:1599 +#: pg_dumpall.c:1613 #, c-format msgid "running \"%s\"" msgstr "%s -ის გáƒáƒ¨áƒ•ებáƒ" -#: pg_dumpall.c:1800 +#: pg_dumpall.c:1814 #, c-format msgid "could not get server version" msgstr "სერვერის ვერსიის მღების შეცდáƒáƒ›áƒ" -#: pg_dumpall.c:1803 +#: pg_dumpall.c:1817 #, c-format msgid "could not parse server version \"%s\"" msgstr "შერვერის ვერსიის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: %s" -#: pg_dumpall.c:1873 pg_dumpall.c:1896 +#: pg_dumpall.c:1887 pg_dumpall.c:1910 #, c-format msgid "executing %s" msgstr "%s -ის შესრულებáƒ" -#: pg_restore.c:313 +#: pg_dumpall.c:1982 +msgid "unsupported filter object" +msgstr "მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი ფილტრის áƒáƒ‘იექტი" + +#: pg_restore.c:329 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "-d/--dbname დáƒ-f/--file -დáƒáƒœ მხáƒáƒšáƒáƒ“ ერთ-ერთის მითითებრშეგიძლიáƒáƒ—" -#: pg_restore.c:320 +#: pg_restore.c:336 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "-d/--dbname დáƒ-f/--file ერთáƒáƒ“ áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" -#: pg_restore.c:338 +#: pg_restore.c:350 +#, c-format +msgid "options -1/--single-transaction and --transaction-size cannot be used together" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრებს -1/--single-transaction დრ--transaction-size ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" + +#: pg_restore.c:357 #, c-format msgid "options -C/--create and -1/--single-transaction cannot be used together" msgstr "-C/--create დრ-1/--single-transaction ერთáƒáƒ“ áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" -#: pg_restore.c:342 +#: pg_restore.c:361 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "--single-transaction -ის მითითებრბევრ დáƒáƒ•áƒáƒšáƒ”ბáƒáƒ¡áƒ—áƒáƒœ ერთáƒáƒ“ შეუძლებელიáƒ" -#: pg_restore.c:380 +#: pg_restore.c:399 #, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•ის უცნáƒáƒ‘ი ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ \"%s\"; გთხáƒáƒ•თ მიუთითáƒáƒ— \"გ\", \"დ\", áƒáƒœ \"t\"" -#: pg_restore.c:419 +#: pg_restore.c:438 #, c-format msgid "errors ignored on restore: %d" msgstr "áƒáƒ¦áƒ“გენისáƒáƒ¡ იგნáƒáƒ áƒ˜áƒ áƒ”ბული შეცდáƒáƒ›áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘áƒ: %d" -#: pg_restore.c:432 +#: pg_restore.c:451 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" @@ -2516,47 +2727,47 @@ msgstr "" "%s áƒáƒ¦áƒáƒ“გენს PostgreSQL მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡ pg_dump მიერ შექმნილი áƒáƒ áƒ¥áƒ˜áƒ•იდáƒáƒœ.\n" "\n" -#: pg_restore.c:434 +#: pg_restore.c:453 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [ფáƒáƒ˜áƒšáƒ˜]\n" -#: pg_restore.c:437 +#: pg_restore.c:456 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი\n" -#: pg_restore.c:438 +#: pg_restore.c:457 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr " -f, --file=FILENAME გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი(stdout-ზე გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \"-\")\n" -#: pg_restore.c:439 +#: pg_restore.c:458 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr " -F, --format=c|d|t მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ (áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜ უნდრიყáƒáƒ¡)\n" -#: pg_restore.c:440 +#: pg_restore.c:459 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list áƒáƒ áƒ¥áƒ˜áƒ•ის სáƒáƒ áƒ©áƒ”ვის მიმáƒáƒ®áƒ˜áƒšáƒ•ის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: pg_restore.c:441 +#: pg_restore.c:460 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: pg_restore.c:442 +#: pg_restore.c:461 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_restore.c:443 +#: pg_restore.c:462 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_restore.c:445 +#: pg_restore.c:464 #, c-format msgid "" "\n" @@ -2565,32 +2776,32 @@ msgstr "" "\n" "პáƒáƒ áƒáƒ›áƒ”ტრები, რáƒáƒ›áƒšáƒ”ბიც áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბენ გáƒáƒ›áƒáƒ¢áƒáƒœáƒáƒ¡:\n" -#: pg_restore.c:446 +#: pg_restore.c:465 #, c-format msgid " -a, --data-only restore only the data, no schema\n" msgstr " -a, --data-only áƒáƒ¦áƒ“გებრმხáƒáƒšáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მები, სქემის გáƒáƒ áƒ”შე\n" -#: pg_restore.c:448 +#: pg_restore.c:467 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create სáƒáƒ›áƒ˜áƒ–ნე ბáƒáƒ–ის შექმნáƒ\n" -#: pg_restore.c:449 +#: pg_restore.c:468 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr " -e, --exit-on-error დáƒáƒ£áƒ§áƒáƒ•ნებლივი გáƒáƒ›áƒáƒ¡áƒ•ლრშეცდáƒáƒ›áƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜\n" -#: pg_restore.c:450 +#: pg_restore.c:469 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NAME მითითებული სáƒáƒ®áƒ”ლის მქáƒáƒœáƒ” ინდექსის áƒáƒ¦áƒ“გენáƒ\n" -#: pg_restore.c:451 +#: pg_restore.c:470 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr " -j, --jobs=NUM áƒáƒ¦áƒ“გენისáƒáƒ¡ მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის პáƒáƒ áƒáƒšáƒ”ლური დáƒáƒ•áƒáƒšáƒ”ბის გáƒáƒ¨áƒ•ებáƒ\n" -#: pg_restore.c:452 +#: pg_restore.c:471 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" @@ -2599,62 +2810,71 @@ msgstr "" " -L, --use-list=FILENAME გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ¡áƒáƒ áƒ©áƒ”ვáƒáƒ“/დáƒáƒ¡áƒáƒšáƒáƒ’ებლáƒáƒ“ მითითებული\n" " ფáƒáƒ˜áƒšáƒ˜áƒ¡ შემცველáƒáƒ‘ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" -#: pg_restore.c:454 +#: pg_restore.c:473 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr " -n, --schema=NAME მხáƒáƒšáƒáƒ“ მითითებული სქემის áƒáƒ‘იექტების áƒáƒ¦áƒ“გენáƒ\n" -#: pg_restore.c:455 +#: pg_restore.c:474 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" msgstr " -N, --exclude-schema=სáƒáƒ®áƒ”ლი მითითებული სáƒáƒ®áƒ”ლის მქáƒáƒœáƒ” სქემáƒáƒ¨áƒ˜ áƒáƒ‘იექტები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n" -#: pg_restore.c:457 +#: pg_restore.c:476 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=სáƒáƒ®áƒ”ლი(áƒáƒ áƒ’ები) მითითებული სáƒáƒ®áƒ”ლის მქáƒáƒœáƒ” ფუნქციის áƒáƒ¦áƒ“გენáƒ\n" -#: pg_restore.c:458 +#: pg_restore.c:477 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" msgstr " -s, --schema-only áƒáƒ¦áƒ“გებრმხáƒáƒšáƒáƒ“ სქემები, მáƒáƒœáƒáƒªáƒ”მები კი áƒáƒ áƒ\n" -#: pg_restore.c:459 +#: pg_restore.c:478 #, c-format msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" msgstr " -S, --superuser=NAME ტრიგერების გáƒáƒ›áƒáƒ¡áƒáƒ áƒ—áƒáƒ•áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: pg_restore.c:460 +#: pg_restore.c:479 #, c-format msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" msgstr " -t, --table=NAME მითითებული ურთიერთáƒáƒ‘ის áƒáƒ¦áƒ“გენრ(ცხრილი, ხედი, დრáƒ.შ.)\n" -#: pg_restore.c:461 +#: pg_restore.c:480 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NAME მითითებული ტრიგერის áƒáƒ¦áƒ“გენრ\n" -#: pg_restore.c:462 +#: pg_restore.c:481 #, c-format msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" msgstr " -x, --no-privileges წვდáƒáƒ›áƒ˜áƒ¡ პრივილეგიების áƒáƒ¦áƒ“გენის გáƒáƒ›áƒáƒ¢áƒáƒ•ებრ(grant/revoke)\n" -#: pg_restore.c:463 +#: pg_restore.c:482 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction áƒáƒ¦áƒ“გენის ერთ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ“ გáƒáƒ¨áƒ•ებáƒ\n" -#: pg_restore.c:465 +#: pg_restore.c:484 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security მწკრივების უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჩáƒáƒ áƒ—ვáƒ\n" -#: pg_restore.c:467 +#: pg_restore.c:485 +#, c-format +msgid "" +" --filter=FILENAME restore or skip objects based on expressions\n" +" in FILENAME\n" +msgstr "" +" --filter=FILENAME áƒáƒ‘იექტების áƒáƒ¦áƒ“გენრáƒáƒœ გáƒáƒ›áƒáƒ¢áƒáƒ•ებრფáƒáƒ˜áƒšáƒ¨áƒ˜\n" +" მითითებული გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბების მიხედვით\n" + +#: pg_restore.c:488 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments კáƒáƒ›áƒ”ნტáƒáƒ áƒ”ბი áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n" -#: pg_restore.c:468 +#: pg_restore.c:489 #, c-format msgid "" " --no-data-for-failed-tables do not restore data of tables that could not be\n" @@ -2663,42 +2883,47 @@ msgstr "" " --no-data-for-failed-tables ცხრილების, რáƒáƒ›áƒšáƒ˜áƒ¡ შექმნრშეუძლებელიáƒ,\n" " მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n" -#: pg_restore.c:470 +#: pg_restore.c:491 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications გáƒáƒ›áƒáƒªáƒ”მები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n" -#: pg_restore.c:471 +#: pg_restore.c:492 #, c-format msgid " --no-security-labels do not restore security labels\n" msgstr " --no-security-labels უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჭდეები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n" -#: pg_restore.c:472 +#: pg_restore.c:493 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions გáƒáƒ›áƒáƒ¬áƒ”რები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n" -#: pg_restore.c:473 +#: pg_restore.c:494 #, c-format msgid " --no-table-access-method do not restore table access methods\n" msgstr " --no-table-access-method ცხრილის წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n" -#: pg_restore.c:474 +#: pg_restore.c:495 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" msgstr " --no-tablespaces ცხრილის სივრცის მინიჭებები áƒáƒ  áƒáƒ¦áƒ“გებáƒ\n" -#: pg_restore.c:475 +#: pg_restore.c:496 #, c-format msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" msgstr " --section=სექცირმითითებული სექციის áƒáƒ¦áƒ“გენრ(pre-data, data, áƒáƒœ post-data)\n" -#: pg_restore.c:488 +#: pg_restore.c:499 +#, c-format +msgid " --transaction-size=N commit after every N objects\n" +msgstr " --transaction-size=N გáƒáƒ“áƒáƒªáƒ”მრყáƒáƒ•ელი N áƒáƒ‘იექტის შემდეგ\n" + +#: pg_restore.c:510 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=ROLENAME áƒáƒ¦áƒ“გენáƒáƒ›áƒ“ე SET ROLE -ის გáƒáƒ¨áƒ•ებáƒ\n" -#: pg_restore.c:490 +#: pg_restore.c:512 #, c-format msgid "" "\n" @@ -2709,7 +2934,7 @@ msgstr "" "შესáƒáƒ«áƒšáƒ”ბელირპáƒáƒ áƒáƒ›áƒ”ტრების -I, -n, -N, -P, -t, -T, დრ--section ერთáƒáƒ“ დრმრáƒáƒ•áƒáƒšáƒ¯áƒ”რ მითითებáƒ, მრáƒáƒ•áƒáƒšáƒ˜\n" "áƒáƒ‘იექტის áƒáƒ›áƒáƒ¡áƒáƒ¦áƒ”ბáƒáƒ“.\n" -#: pg_restore.c:493 +#: pg_restore.c:515 #, c-format msgid "" "\n" @@ -2721,16 +2946,20 @@ msgstr "" "\n" #, c-format -#~ msgid " -B, --no-blobs exclude large objects in dump\n" -#~ msgstr " -B, --no-blobs დიდი áƒáƒ‘იექტები გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ áƒáƒ  იქნებáƒ\n" +#~ msgid " %s" +#~ msgstr " %s" #, c-format #~ msgid " -Z, --compress=0-9 compression level for compressed formats\n" #~ msgstr " -Z, --compress=0-9 შეკუმშვის დáƒáƒœáƒ”\n" #, c-format -#~ msgid " -b, --blobs include large objects in dump\n" -#~ msgstr " -b, --blobs გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ იქნებრდიდი áƒáƒ‘იექტებიც\n" +#~ msgid "" +#~ " -Z, --compress=METHOD[:LEVEL]\n" +#~ " compress as specified\n" +#~ msgstr "" +#~ " -Z, --compress=მეთáƒáƒ“ი[:დáƒáƒœáƒ”]\n" +#~ " შეკუმშვის მითითებáƒ\n" #, c-format #~ msgid "cannot restore from compressed archive (compression not supported in this installation)" @@ -2756,6 +2985,22 @@ msgstr "" #~ msgid "could not read symbolic link \"%s\": %m" #~ msgstr "სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმის \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" +#, c-format +#~ msgid "failed to LZ4 compress data: %s" +#~ msgstr "'LZ4'-ით მáƒáƒœáƒáƒªáƒ”მების შეკუმშვრშეუძლებელიáƒ: %s" + +#, c-format +#~ msgid "failed to end compression: %s" +#~ msgstr "შეკუმშვის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#, c-format +#~ msgid "failed to end decompression: %s" +#~ msgstr "გáƒáƒ¨áƒšáƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ: %s" + +#, c-format +#~ msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" +#~ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტის სტრიქáƒáƒœáƒ˜ (%s) ტრიგერისთვის \"%s\" ცხრილზე \"%s\"" + #, c-format #~ msgid "invalid compression code: %d" #~ msgstr "შეკუმშვის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒ“ი: %d" @@ -2764,6 +3009,18 @@ msgstr "" #~ msgid "not built with zlib support" #~ msgstr "áƒáƒ  áƒáƒ áƒ˜áƒ¡ áƒáƒ’ებული zlib მხáƒáƒ áƒ“áƒáƒ­áƒ”რით" +#, c-format +#~ msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" +#~ msgstr "მáƒáƒ—ხáƒáƒ•ნის შედეგირნულáƒáƒ•áƒáƒœáƒ˜ ბმის ცხრილის სáƒáƒ®áƒ”ლის უცხრგáƒáƒ¡áƒáƒ¦áƒ”ბის ტრიგერი \"%s\" ცხრილზე \"%s\" (ცხრილის OID: %u)" + #, c-format #~ msgid "requested compression not available in this installation -- archive will be uncompressed" #~ msgstr "მáƒáƒ—ხáƒáƒ•ნილი შეკუმშვრáƒáƒ› áƒáƒ’ებáƒáƒ¨áƒ˜ მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ. -- áƒáƒ áƒ¥áƒ˜áƒ•ი შეუკუმშáƒáƒ•ი იქნებáƒ" + +#, c-format +#~ msgid "unexpected tgtype value: %d" +#~ msgstr "tgtype -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: %d" + +#, c-format +#~ msgid "unrecognized collation provider '%c'" +#~ msgstr "უცნáƒáƒ‘ი კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ›áƒ¬áƒáƒ“ებელი '%c'" diff --git a/src/bin/pg_dump/po/ko.po b/src/bin/pg_dump/po/ko.po index f533f7e4729de..296f7e5ff487f 100644 --- a/src/bin/pg_dump/po/ko.po +++ b/src/bin/pg_dump/po/ko.po @@ -3,10 +3,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_dump (PostgreSQL) 13\n" +"Project-Id-Version: pg_dump (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 20:46+0000\n" -"PO-Revision-Date: 2020-10-06 13:40+0900\n" +"POT-Creation-Date: 2025-01-17 04:51+0000\n" +"PO-Revision-Date: 2025-01-16 14:55+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean Team \n" "Language: ko\n" @@ -15,386 +15,634 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "심ê°: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + +#: ../../common/compression.c:132 ../../common/compression.c:141 +#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420 +#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25 +#: compress_zstd.c:31 +#, c-format +msgid "this build does not support compression with %s" +msgstr "ì´ í”„ë¡œê·¸ëž¨ì€ %s ì••ì¶• ë¯¸ì§€ì› ìƒíƒœë¡œ 빌드 ë˜ì—ˆìŠµë‹ˆë‹¤" + +#: ../../common/compression.c:205 +msgid "found empty string where a compression option was expected" +msgstr "ì••ì¶• ì˜µì…˜ì„ ì§€ì •í•´ì•¼í•  ê³³ì— ë¹ˆ 문ìžì—´ì„ 지정했습니다" + +#: ../../common/compression.c:244 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "알 수 없는 ì••ì¶• 옵션: \"%s\"" + +#: ../../common/compression.c:283 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "\"%s\" ì••ì¶• ì˜µì…˜ì€ ê°’ì„ í•„ìš”ë¡œ 합니다" + +#: ../../common/compression.c:292 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "\"%s\" ì••ì¶• ì˜µì…˜ì˜ ê°’ì€ ì •ìˆ˜í˜•ì´ì–´ì•¼ 합니다." + +#: ../../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "\"%s\" ì••ì¶• ì˜µì…˜ì˜ ê°’ì€ ë¶€ìš¸ë¦°í˜•ì´ì–´ì•¼ 합니다." + +#: ../../common/compression.c:379 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "\"%s\" ì••ì¶• ì•Œê³ ë¦¬ì¦˜ì€ ì••ì¶• ìˆ˜ì¤€ì„ ì§€ì •í•  수 없습니다" + +#: ../../common/compression.c:386 +#, c-format +msgid "" +"compression algorithm \"%s\" expects a compression level between %d and %d " +"(default at %d)" +msgstr "" +"\"%s\" ì••ì¶• ì•Œê³ ë¦¬ì¦˜ì€ ì••ì¶• 수준으로 %d부터 %d까지만 허용합니다(기본값: %d)." + +#: ../../common/compression.c:397 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "\"%s\" ì••ì¶• ì•Œê³ ë¦¬ì¦˜ì„ ì‚¬ìš©í•  때는 ìž‘ì—…ìž ìˆ˜ë¥¼ 지정할 수 없습니다" + +#: ../../common/compression.c:408 #, c-format -msgid "could not identify current directory: %m" -msgstr "현재 디렉터리를 알 수 ì—†ìŒ: %m" +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "\"%s\" ì••ì¶• ì•Œê³ ë¦¬ì¦˜ì€ ì›ê±°ë¦¬ 모드를 ì§€ì›í•˜ì§€ 않습니다" -#: ../../common/exec.c:156 +#: ../../common/exec.c:174 #, c-format -msgid "invalid binary \"%s\"" -msgstr "ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ íŒŒì¼ \"%s\"" +msgid "invalid binary \"%s\": %m" +msgstr "\"%s\" 파ì¼ì€ ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼ìž„: %m" -#: ../../common/exec.c:206 +#: ../../common/exec.c:217 #, c-format -msgid "could not read binary \"%s\"" -msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ" +msgid "could not read binary \"%s\": %m" +msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: ../../common/exec.c:214 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "실행 í•  \"%s\" 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:252 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "\"%s\" ì´ë¦„ì˜ ë””ë ‰í„°ë¦¬ë¡œ ì´ë™í•  수 없습니다: %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "\"%s\" 경로를 절대경로로 바꿀 수 ì—†ìŒ: %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:382 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "\"%s\" 심볼릭 ë§í¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" +msgid "could not execute command \"%s\": %m" +msgstr "\"%s\" ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ: %m" -#: ../../common/exec.c:410 +#: ../../common/exec.c:394 #, c-format -msgid "pclose failed: %m" -msgstr "pclose 실패: %m" +msgid "could not read from command \"%s\": %m" +msgstr "\"%s\" 명령ì—서 ì½ì„ 수 ì—†ìŒ: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "\"%s\" ëª…ë ¹ì´ ì•„ë¬´ëŸ° ë°ì´í„°ë„ 반환하지 않ìŒ" + +#: ../../common/exec.c:424 parallel.c:1609 +#, c-format +msgid "%s() failed: %m" +msgstr "%s() 실패: %m" + +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "메모리 부족" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "메모리 부족\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "null í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" -#: ../../common/wait_error.c:45 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 위해 íŒŒì¼ ì‹œìŠ¤í…œ ë™ê¸°í™”를 í•  수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ìƒíƒœ 정보를 알 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ì´ ë¹Œë“œëŠ” \"%s\" ë™ê¸°í™” ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ì¼ ìˆ˜ ì—†ìŒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_backup_directory.c:182 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ fsync í•  수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" + +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "해당 명령어 ì—†ìŒ" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, 종료 코드 %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "0x%X 예외처리로 하위 프로세스가 종료ë˜ì—ˆìŒ" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, ì‹œê·¸ë„ %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "하위 프로세스가 종료ë˜ì—ˆìŒ, 알수 없는 ìƒíƒœ %d" -#: common.c:121 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "\"%s\" ê°’ì€ %s 옵션 값으로 유효하지 않ìŒ" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s ê°’ì€ %d부터 %d까지 지정할 수 있습니다." + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "알 수 없는 ë™ê¸°í™” 방법: %s" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "쉘 명령 ì¸ìžì— 줄바꿈 문ìžê°€ 있습니다: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "ë°ì´í„°ë² ì´ìФ ì´ë¦„ì— ì¤„ë°”ê¿ˆ 문ìžê°€ 있습니다: \"%s\"\n" + +#: common.c:135 #, c-format msgid "reading extensions" msgstr "확장 기능 ì½ëŠ” 중" -#: common.c:125 +#: common.c:138 #, c-format msgid "identifying extension members" msgstr "확장 멤버를 ì‹ë³„ 중" -#: common.c:128 +#: common.c:141 #, c-format msgid "reading schemas" msgstr "ìŠ¤í‚¤ë§ˆë“¤ì„ ì½ëŠ” 중" -#: common.c:138 +#: common.c:150 #, c-format msgid "reading user-defined tables" msgstr "ì‚¬ìš©ìž ì •ì˜ í…Œì´ë¸”ë“¤ì„ ì½ëŠ” 중" -#: common.c:145 +#: common.c:155 #, c-format msgid "reading user-defined functions" msgstr "ì‚¬ìš©ìž ì •ì˜ í•¨ìˆ˜ë“¤ ì½ëŠ” 중" -#: common.c:150 +#: common.c:159 #, c-format msgid "reading user-defined types" msgstr "ì‚¬ìš©ìž ì •ì˜ ìžë£Œí˜•ì„ ì½ëŠ” 중" -#: common.c:155 +#: common.c:163 #, c-format msgid "reading procedural languages" msgstr "프로시쥬얼 언어를 ì½ëŠ” 중" -#: common.c:158 +#: common.c:166 #, c-format msgid "reading user-defined aggregate functions" msgstr "ì‚¬ìš©ìž ì •ì˜ ì§‘ê³„ 함수를 ì½ëŠ” 중" -#: common.c:161 +#: common.c:169 #, c-format msgid "reading user-defined operators" msgstr "ì‚¬ìš©ìž ì •ì˜ ì—°ì‚°ìžë¥¼ ì½ëŠ” 중" -#: common.c:165 +#: common.c:172 #, c-format msgid "reading user-defined access methods" msgstr "ì‚¬ìš©ìž ì •ì˜ ì ‘ê·¼ ë°©ë²•ì„ ì½ëŠ” 중" -#: common.c:168 +#: common.c:175 #, c-format msgid "reading user-defined operator classes" msgstr "ì‚¬ìš©ìž ì •ì˜ ì—°ì‚°ìž í´ëž˜ìŠ¤ë¥¼ ì½ëŠ” 중" -#: common.c:171 +#: common.c:178 #, c-format msgid "reading user-defined operator families" msgstr "ì‚¬ìš©ìž ì •ì˜ ì—°ì‚°ìž ë¶€ë¥˜ë“¤ ì½ëŠ” 중" -#: common.c:174 +#: common.c:181 #, c-format msgid "reading user-defined text search parsers" msgstr "ì‚¬ìš©ìž ì •ì˜ í…스트 검색 파서를 ì½ëŠ” 중" -#: common.c:177 +#: common.c:184 #, c-format msgid "reading user-defined text search templates" msgstr "ì‚¬ìš©ìž ì •ì˜ í…스트 검색 í…œí”Œë¦¿ì„ ì½ëŠ” 중" -#: common.c:180 +#: common.c:187 #, c-format msgid "reading user-defined text search dictionaries" msgstr "ì‚¬ìš©ìž ì •ì˜ í…스트 검색 ì‚¬ì „ì„ ì½ëŠ” 중" -#: common.c:183 +#: common.c:190 #, c-format msgid "reading user-defined text search configurations" msgstr "ì‚¬ìš©ìž ì •ì˜ í…스트 검색 êµ¬ì„±ì„ ì½ëŠ” 중" -#: common.c:186 +#: common.c:193 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "ì‚¬ìš©ìž ì •ì˜ ì™¸ë¶€ ë°ì´í„° 래í¼ë¥¼ ì½ëŠ” 중" -#: common.c:189 +#: common.c:196 #, c-format msgid "reading user-defined foreign servers" msgstr "ì‚¬ìš©ìž ì •ì˜ ì™¸ë¶€ 서버를 ì½ëŠ” 중" -#: common.c:192 +#: common.c:199 #, c-format msgid "reading default privileges" msgstr "기본 ì ‘ê·¼ 권한 ì½ëŠ” 중" -#: common.c:195 +#: common.c:202 #, c-format msgid "reading user-defined collations" msgstr "ì‚¬ìš©ìž ì •ì˜ ê¸€ìž ì •ë ¬(collation) ì½ëŠ” 중" -#: common.c:199 +#: common.c:205 #, c-format msgid "reading user-defined conversions" msgstr "ì‚¬ìš©ìž ì •ì˜ ì¸ì½”딩 ë³€í™˜ê·œì¹™ì„ ì½ëŠ” 중" -#: common.c:202 +#: common.c:208 #, c-format msgid "reading type casts" msgstr "형변환ìž(type cast)ë“¤ì„ ì½ëŠ” 중" -#: common.c:205 +#: common.c:211 #, c-format msgid "reading transforms" msgstr "변환ìž(transform) ì½ëŠ” 중" -#: common.c:208 +#: common.c:214 #, c-format msgid "reading table inheritance information" msgstr "í…Œì´ë¸” ìƒì† 정보를 ì½ëŠ” 중" -#: common.c:211 +#: common.c:217 #, c-format msgid "reading event triggers" msgstr "ì´ë²¤íЏ íŠ¸ë¦¬ê±°ë“¤ì„ ì½ëŠ” 중" -#: common.c:215 +#: common.c:221 #, c-format msgid "finding extension tables" msgstr "확장 í…Œì´ë¸”ì„ ì°¾ëŠ” 중" -#: common.c:219 +#: common.c:225 #, c-format msgid "finding inheritance relationships" msgstr "ìƒì† 관계를 조사중" -#: common.c:222 +#: common.c:228 #, c-format msgid "reading column info for interesting tables" msgstr "재미난 í…Œì´ë¸”들(interesting tables)ì„ ìœ„í•´ ì—´ 정보를 ì½ëŠ” 중" -#: common.c:225 +#: common.c:231 #, c-format msgid "flagging inherited columns in subtables" msgstr "하위 í…Œì´ë¸”ì—서 ìƒì†ëœ ì—´ 구분중" -#: common.c:228 +#: common.c:234 +#, c-format +msgid "reading partitioning data" +msgstr "파티션 ìžë£Œ ì½ëŠ” 중" + +#: common.c:237 #, c-format msgid "reading indexes" msgstr "ì¸ë±ìŠ¤ë“¤ì„ ì½ëŠ” 중" -#: common.c:231 +#: common.c:240 #, c-format msgid "flagging indexes in partitioned tables" msgstr "하위 파티션 í…Œì´ë¸”ì—서 ì¸ë±ìŠ¤ë¥¼ 플래그 처리하는 중" -#: common.c:234 +#: common.c:243 #, c-format msgid "reading extended statistics" msgstr "확장 í†µê³„ë“¤ì„ ì½ëŠ” 중" -#: common.c:237 +#: common.c:246 #, c-format msgid "reading constraints" msgstr "제약 ì¡°ê±´ë“¤ì„ ì½ëŠ” 중" -#: common.c:240 +#: common.c:249 #, c-format msgid "reading triggers" msgstr "íŠ¸ë¦¬ê±°ë“¤ì„ ì½ëŠ” 중" -#: common.c:243 +#: common.c:252 #, c-format msgid "reading rewrite rules" msgstr "룰(rule) ì½ëŠ” 중" -#: common.c:246 +#: common.c:255 #, c-format msgid "reading policies" msgstr "ì •ì±… ì½ëŠ” 중" -#: common.c:249 +#: common.c:258 #, c-format msgid "reading publications" msgstr "발행 정보를 ì½ëŠ” 중" -#: common.c:252 +#: common.c:261 #, c-format -msgid "reading publication membership" -msgstr "발행 ë§µë²„ì‰½ì„ ì½ì„ 중" +msgid "reading publication membership of tables" +msgstr "í…Œì´ë¸”ì˜ ë°œí–‰ ë§µë²„ì‰½ì„ ì½ëŠ” 중" -#: common.c:255 +#: common.c:264 +#, c-format +msgid "reading publication membership of schemas" +msgstr "ìŠ¤í‚¤ë§ˆì˜ ë°œí–‰ ë§µë²„ì‰½ì„ ì½ì„ 중" + +#: common.c:267 #, c-format msgid "reading subscriptions" msgstr "구ë…정보를 ì½ëŠ” 중" -#: common.c:1025 +#: common.c:270 +#, c-format +msgid "reading subscription membership of tables" +msgstr "í…Œì´ë¸”ì˜ êµ¬ë… ë§µë²„ì‰½ì„ ì½ëŠ” 중" + +#: common.c:333 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "안전 검사 실패, OID %uì¸ ë¶€ëª¨ 개체가 ì—†ìŒ. 해당 í…Œì´ë¸” \"%s\" (OID %u)" -#: common.c:1067 +#: common.c:375 +#, c-format +msgid "invalid number of parents %d for table \"%s\"" +msgstr "ìž˜ëª»ëœ ë¶€ëª¨ 수: %d, 해당 í…Œì´ë¸” \"%s\"" + +#: common.c:1098 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "\"%s\" ìˆ«ìž ë°°ì—´ì„ ë¶„ì„í•  수 ì—†ìŒ: 너무 ë§Žì€ ìˆ«ìžë“¤ì´ 있ìŒ" -#: common.c:1082 +#: common.c:1110 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "\"%s\" ìˆ«ìž ë°°ì—´ì„ ë¶„ì„í•  수 ì—†ìŒ: 숫ìžì•ˆì— ì´ìƒí•œ 글ìžê°€ 있ìŒ" -#: compress_io.c:111 -#, c-format -msgid "invalid compression code: %d" -msgstr "ìž˜ëª»ëœ ì••ì¶• 수위: %d" - -#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504 -#: compress_io.c:547 -#, c-format -msgid "not built with zlib support" -msgstr "zlib ì§€ì› ê¸°ëŠ¥ì´ ì—†ìŒ" - -#: compress_io.c:236 compress_io.c:333 +#: compress_gzip.c:69 compress_gzip.c:183 #, c-format msgid "could not initialize compression library: %s" msgstr "ì••ì¶• ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 초기화 í•  수 ì—†ìŒ: %s" -#: compress_io.c:256 +#: compress_gzip.c:93 #, c-format msgid "could not close compression stream: %s" msgstr "ì••ì¶• ìŠ¤íŠ¸ë¦¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %s" -#: compress_io.c:273 +#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109 #, c-format msgid "could not compress data: %s" msgstr "ìžë£Œë¥¼ ì••ì¶•í•  수 ì—†ìŒ: %s" -#: compress_io.c:349 compress_io.c:364 +#: compress_gzip.c:199 compress_gzip.c:214 #, c-format msgid "could not uncompress data: %s" msgstr "ìžë£Œ ì••ì¶•ì„ í’€ 수 없습니다: %s" -#: compress_io.c:371 +#: compress_gzip.c:221 #, c-format msgid "could not close compression library: %s" msgstr "ì••ì¶• ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ ë‹«ì„ ìˆ˜ ì—†ìŒ: %s" -#: compress_io.c:584 compress_io.c:621 pg_backup_tar.c:557 pg_backup_tar.c:560 +#: compress_gzip.c:266 compress_lz4.c:608 compress_lz4.c:628 compress_lz4.c:647 #, c-format msgid "could not read from input file: %s" msgstr "ìž…ë ¥ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s" -#: compress_io.c:623 pg_backup_custom.c:646 pg_backup_directory.c:552 -#: pg_backup_tar.c:793 pg_backup_tar.c:816 +#: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 +#: compress_zstd.c:374 pg_backup_custom.c:651 +#, c-format +msgid "could not read from input file: %m" +msgstr "ìž…ë ¥ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" + +#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:141 +#: compress_zstd.c:372 pg_backup_custom.c:649 pg_backup_directory.c:565 +#: pg_backup_tar.c:740 pg_backup_tar.c:763 #, c-format msgid "could not read from input file: end of file" msgstr "ìž…ë ¥ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: íŒŒì¼ ë" -# # search5 ë -# # advance 부분 -#: parallel.c:267 +#: compress_lz4.c:157 +#, c-format +msgid "could not create LZ4 decompression context: %s" +msgstr "LZ4 ì••ì¶• í•´ì œ 컨í…스트를 만들 수 ì—†ìŒ: %s" + +#: compress_lz4.c:180 +#, c-format +msgid "could not decompress: %s" +msgstr "ì••ì¶• 풀기 실패: %s" + +#: compress_lz4.c:193 +#, c-format +msgid "could not free LZ4 decompression context: %s" +msgstr "LZ4 ì••ì¶• í•´ì œ 컨í…스트 반환 실패: %s" + +#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690 +#, c-format +msgid "could not end compression: %s" +msgstr "ì••ì¶• ë내기 실패: %s" + +#: compress_lz4.c:301 +#, c-format +msgid "could not initialize LZ4 compression: %s" +msgstr "LZ4 ì••ì¶• 초기화 í•  수 ì—†ìŒ: %s" + +#: compress_lz4.c:697 +#, c-format +msgid "could not end decompression: %s" +msgstr "ì••ì¶• 풀기 작업 ë내기 실패: %s" + +#: compress_zstd.c:66 +#, c-format +msgid "could not set compression parameter \"%s\": %s" +msgstr "\"%s\" ì••ì¶• 매개 변수를 지정할 수 ì—†ìŒ: %s" + +#: compress_zstd.c:78 compress_zstd.c:232 compress_zstd.c:491 +#: compress_zstd.c:499 +#, c-format +msgid "could not initialize compression library" +msgstr "ì••ì¶• ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 초기화 í•  수 ì—†ìŒ" + +#: compress_zstd.c:195 compress_zstd.c:309 +#, c-format +msgid "could not decompress data: %s" +msgstr "ìžë£Œë¥¼ ì••ì¶• í•´ì œ í•  수 ì—†ìŒ: %s" + +#: compress_zstd.c:502 +#, c-format +msgid "unhandled mode \"%s\"" +msgstr "\"%s\" 모드는 처리할 수 ì—†ìŒ" + +#: filter.c:49 +#, c-format +msgid "could not open filter file \"%s\": %m" +msgstr "\"%s\" í•„í„° 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: filter.c:72 +#, c-format +msgid "could not close filter file \"%s\": %m" +msgstr "\"%s\" í•„í„° 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: filter.c:165 +#, c-format +msgid "invalid format in filter read from standard input on line %d: %s" +msgstr "표준 ìž…ë ¥ì˜ %d 번째 ì¤„ì„ ì½ëŠ”ë° ìž˜ëª»ëœ í•„í„° í¬ë©§: %s" + +#: filter.c:168 +#, c-format +msgid "invalid format in filter read from file \"%s\" on line %d: %s" +msgstr "\"%s\" 파ì¼ì˜ %d 번째 ì¤„ì— ìž˜ëª»ëœ í•„í„° í¬ë©§: %s" + +#: filter.c:241 filter.c:468 +#, c-format +msgid "could not read from filter file \"%s\": %m" +msgstr "\"%s\" í•„í„° 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" + +#: filter.c:244 +msgid "unexpected end of file" +msgstr "예ìƒì¹˜ 못한 íŒŒì¼ ë" + +#: filter.c:311 +msgid "missing object name pattern" +msgstr "ê°ì²´ ì´ë¦„ íŒ¨í„´ì´ ë¹ ì¡ŒìŒ" + +#: filter.c:422 +msgid "no filter command found (expected \"include\" or \"exclude\")" +msgstr "í•„í„° ëª…ë ¹ì´ ì—†ìŒ (\"include\" ë˜ëŠ” \"exclude\" 사용할 수 있ìŒ)" + +#: filter.c:433 +msgid "invalid filter command (expected \"include\" or \"exclude\")" +msgstr "ìž˜ëª»ëœ í•„í„° 명령 (\"include\" ë˜ëŠ” \"exclude\" 사용할 수 있ìŒ)" + +#: filter.c:440 +msgid "missing filter object type" +msgstr "í•„í„° ê°ì²´í˜•ì´ ë¹ ì¡ŒìŒ" + +#: filter.c:447 #, c-format -msgid "WSAStartup failed: %d" -msgstr "WSAStartup 작업 실패: %d" +msgid "unsupported filter object type: \"%.*s\"" +msgstr "ì§€ì›í•˜ì§€ 않는 í•„í„° ê°ì²´í˜•: \"%.*s\"" -#: parallel.c:978 +#: parallel.c:251 +#, c-format +msgid "%s() failed: error code %d" +msgstr "%s() 실패: 오류 코드 %d" + +#: parallel.c:959 #, c-format msgid "could not create communication channels: %m" msgstr "통신 ì²´ë„ì„ ë§Œë“¤ 수 ì—†ìŒ: %m" -#: parallel.c:1035 +#: parallel.c:1016 #, c-format msgid "could not create worker process: %m" msgstr "ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ë¥¼ 만들 수 ì—†ìŒ: %m" -#: parallel.c:1165 +#: parallel.c:1146 #, c-format -msgid "unrecognized command received from master: \"%s\"" -msgstr "마스터ì—서 알 수 없는 ëª…ë ¹ì„ ë°›ìŒ: \"%s\"" +msgid "unrecognized command received from leader: \"%s\"" +msgstr "리ë”로부터 알 수 없는 ëª…ë ¹ì„ ìˆ˜ì‹ í•¨: \"%s\"" -#: parallel.c:1208 parallel.c:1446 +#: parallel.c:1189 parallel.c:1427 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "작업 프로세스로부터 ìž˜ëª»ëœ ë©”ì‹œì§€ë¥¼ ë°›ìŒ: \"%s\"" -#: parallel.c:1340 +#: parallel.c:1321 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -406,436 +654,437 @@ msgstr "" "ì´ ìƒí™©ì€ ì¼ë°˜ì ìœ¼ë¡œ 다른 세션ì—서 해당 í…Œì´ë¸”ì„ ì´ë¯¸ ë¤í”„하고 있거나 기타 다" "른 ì´ìœ ë¡œ 다른 ì„¸ì…˜ì— ì˜í•´ì„œ ì„ ì  ëœ ê²½ìš°ìž…ë‹ˆë‹¤." -#: parallel.c:1429 +#: parallel.c:1410 #, c-format msgid "a worker process died unexpectedly" msgstr "작업 프로세스가 예ìƒì¹˜ 않게 종료ë¨" -#: parallel.c:1551 parallel.c:1669 +#: parallel.c:1532 parallel.c:1650 #, c-format msgid "could not write to the communication channel: %m" msgstr "통신 ì²´ë„ì—ì— ì“¸ 수 ì—†ìŒ: %m" -#: parallel.c:1628 -#, c-format -msgid "select() failed: %m" -msgstr "select() 실패: %m" - -#: parallel.c:1753 +#: parallel.c:1734 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: ì†Œì¼“ì„ ë§Œë“¤ 수 ì—†ìŒ: 오류 코드 %d" -#: parallel.c:1764 +#: parallel.c:1745 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: ë°”ì¸ë”© í•  수 ì—†ìŒ: 오류 코드 %d" -#: parallel.c:1771 +#: parallel.c:1752 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: 리슨 í•  수 ì—†ìŒ: 오류 코드 %d" -#: parallel.c:1778 +#: parallel.c:1759 #, c-format -msgid "pgpipe: getsockname() failed: error code %d" -msgstr "pgpipe: getsockname() 실패: 오류 코드 %d" +msgid "pgpipe: %s() failed: error code %d" +msgstr "pgpipe: %s() 실패: 오류 코드 %d" -#: parallel.c:1789 +#: parallel.c:1770 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: ë‘번째 ì†Œì¼“ì„ ë§Œë“¤ 수 ì—†ìŒ: 오류 코드 %d" -#: parallel.c:1798 +#: parallel.c:1779 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: 소켓 ì ‘ì† ì‹¤íŒ¨: 오류 코드 %d" -#: parallel.c:1807 +#: parallel.c:1788 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: ì ‘ì†ì„ 승ì¸í•  수 ì—†ìŒ: 오류 코드 %d" -#: pg_backup_archiver.c:277 pg_backup_archiver.c:1587 +#: pg_backup_archiver.c:261 pg_backup_archiver.c:1706 #, c-format msgid "could not close output file: %m" msgstr "출력 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: pg_backup_archiver.c:321 pg_backup_archiver.c:325 +#: pg_backup_archiver.c:305 pg_backup_archiver.c:309 #, c-format msgid "archive items not in correct section order" msgstr "ì•„ì¹´ì´ë¸Œ ì•„ì´í…œì˜ 순서가 섹션ì—서 비정ìƒì ìž„" -#: pg_backup_archiver.c:331 +#: pg_backup_archiver.c:315 #, c-format msgid "unexpected section code %d" msgstr "예ìƒì¹˜ 못한 섹션 코드 %d" -#: pg_backup_archiver.c:368 +#: pg_backup_archiver.c:352 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "ì´ ì•„ì¹´ì´ë¸Œ íŒŒì¼ í˜•ì‹ì—서는 병렬 ë³µì›ì´ ì§€ì›ë˜ì§€ 않ìŒ" -#: pg_backup_archiver.c:372 +#: pg_backup_archiver.c:356 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "8.0 ì´ì „ pg_dump로 만든 ì•„ì¹´ì´ë¸Œì—서는 병렬 ë³µì›ì´ ì§€ì›ë˜ì§€ 않ìŒ" -#: pg_backup_archiver.c:390 +#: pg_backup_archiver.c:377 #, c-format -msgid "" -"cannot restore from compressed archive (compression not supported in this " -"installation)" -msgstr "" -"ì••ì¶•ëœ ìžë£ŒíŒŒì¼ì„ ë³µì›ìš©ìœ¼ë¡œ 사용할 수 없습니다(ì••ì¶•ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않고 컴파" -"ì¼ë˜ì—ˆìŒ)" +msgid "cannot restore from compressed archive (%s)" +msgstr "ì••ì¶•ëœ ì•„ì¹´ì´ë¸Œ (%s) ì—서 ë³µì›í•  수 ì—†ìŒ" -#: pg_backup_archiver.c:407 +#: pg_backup_archiver.c:397 #, c-format msgid "connecting to database for restore" msgstr "ë³µì› ìž‘ì—…ì„ ìœ„í•´ ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì† ì¤‘" -#: pg_backup_archiver.c:409 +#: pg_backup_archiver.c:399 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "pre-1.3 archiveì—서 ì§í†µ ë°ì´í„°ë² ì´ìФ ì ‘ì†ì€ ì§€ì›ë˜ì§€ 않ìŒ" -#: pg_backup_archiver.c:452 +#: pg_backup_archiver.c:442 #, c-format msgid "implied data-only restore" msgstr "암묵ì ìœ¼ë¡œ ìžë£Œë§Œ ë³µì›" -#: pg_backup_archiver.c:518 +#: pg_backup_archiver.c:510 #, c-format msgid "dropping %s %s" msgstr "%s %s ì‚­ì œ 중" -#: pg_backup_archiver.c:613 +#: pg_backup_archiver.c:642 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "\"%s\" 구문ì—서 insert IF EXISTS ë¶€ë¶„ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_backup_archiver.c:769 pg_backup_archiver.c:771 +#: pg_backup_archiver.c:828 pg_backup_archiver.c:830 #, c-format msgid "warning from original dump file: %s" msgstr "ì›ë³¸ ë¤í”„ 파ì¼ì—서 ë°œìƒí•œ 경고: %s" -#: pg_backup_archiver.c:786 +#: pg_backup_archiver.c:864 #, c-format msgid "creating %s \"%s.%s\"" msgstr "%s \"%s.%s\" 만드는 중" -#: pg_backup_archiver.c:789 +#: pg_backup_archiver.c:867 #, c-format msgid "creating %s \"%s\"" msgstr "%s \"%s\" 만드는 중" -#: pg_backup_archiver.c:839 +#: pg_backup_archiver.c:917 #, c-format msgid "connecting to new database \"%s\"" msgstr "\"%s\" 새 ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì†ì¤‘" -#: pg_backup_archiver.c:866 +#: pg_backup_archiver.c:944 #, c-format msgid "processing %s" msgstr "%s 처리 중" -#: pg_backup_archiver.c:886 +#: pg_backup_archiver.c:966 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "\"%s.%s\" í…Œì´ë¸”ì˜ ìžë£Œë¥¼ 처리 중" -#: pg_backup_archiver.c:948 +#: pg_backup_archiver.c:1036 #, c-format msgid "executing %s %s" msgstr "실행중: %s %s" -#: pg_backup_archiver.c:987 +#: pg_backup_archiver.c:1096 #, c-format msgid "disabling triggers for %s" msgstr "%s 트리거 ìž‘ë™ì„ 비활성화 하는 중" -#: pg_backup_archiver.c:1013 +#: pg_backup_archiver.c:1122 #, c-format msgid "enabling triggers for %s" msgstr "%s 트리거 ìž‘ë™ì„ 활성화 하는 중" -#: pg_backup_archiver.c:1041 +#: pg_backup_archiver.c:1187 #, c-format msgid "" "internal error -- WriteData cannot be called outside the context of a " "DataDumper routine" msgstr "ë‚´ë¶€ 오류 -- WriteData는 DataDumper 루틴 ì˜ì—­ ë°–ì—서 호출 ë  ìˆ˜ ì—†ìŒ" -#: pg_backup_archiver.c:1224 +#: pg_backup_archiver.c:1379 #, c-format msgid "large-object output not supported in chosen format" msgstr "ì„ íƒí•œ íŒŒì¼ ì–‘ì‹ìœ¼ë¡œëŠ” large-object를 ë¤í”„í•  수 ì—†ìŒ" -#: pg_backup_archiver.c:1282 +#: pg_backup_archiver.c:1442 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "%dê°œì˜ í° ê°œì²´ê°€ ë³µì›ë¨" -#: pg_backup_archiver.c:1303 pg_backup_tar.c:736 +#: pg_backup_archiver.c:1469 pg_backup_tar.c:683 #, c-format msgid "restoring large object with OID %u" msgstr "%u OID large object를 ë³µì›ì¤‘" -#: pg_backup_archiver.c:1315 +#: pg_backup_archiver.c:1481 #, c-format msgid "could not create large object %u: %s" msgstr "%u large object를 만들 수 ì—†ìŒ: %s" -#: pg_backup_archiver.c:1320 pg_dump.c:3548 +#: pg_backup_archiver.c:1486 pg_dump.c:3888 #, c-format msgid "could not open large object %u: %s" msgstr "%u large object를 ì—´ 수 ì—†ìŒ: %s" -#: pg_backup_archiver.c:1377 +#: pg_backup_archiver.c:1542 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "TOC íŒŒì¼ \"%s\"ì„(를) ì—´ 수 ì—†ìŒ: %m" -#: pg_backup_archiver.c:1417 +#: pg_backup_archiver.c:1570 #, c-format msgid "line ignored: %s" msgstr "줄 무시ë¨: %s" -#: pg_backup_archiver.c:1424 +#: pg_backup_archiver.c:1577 pg_backup_db.c:609 #, c-format msgid "could not find entry for ID %d" msgstr "%d IDì— ëŒ€í•œ í•­ëª©ì„ ì°¾ì§€ 못했ìŒ" -#: pg_backup_archiver.c:1445 pg_backup_directory.c:222 -#: pg_backup_directory.c:598 +#: pg_backup_archiver.c:1600 pg_backup_directory.c:219 +#: pg_backup_directory.c:613 #, c-format msgid "could not close TOC file: %m" msgstr "TOC 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: pg_backup_archiver.c:1559 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:585 pg_backup_directory.c:648 -#: pg_backup_directory.c:667 pg_dumpall.c:484 +#: pg_backup_archiver.c:1687 pg_backup_custom.c:152 pg_backup_directory.c:333 +#: pg_backup_directory.c:600 pg_backup_directory.c:666 +#: pg_backup_directory.c:684 pg_dumpall.c:506 #, c-format msgid "could not open output file \"%s\": %m" msgstr "\"%s\" 출력 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: pg_backup_archiver.c:1561 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1689 pg_backup_custom.c:158 #, c-format msgid "could not open output file: %m" msgstr "출력 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: pg_backup_archiver.c:1654 +#: pg_backup_archiver.c:1772 #, c-format -msgid "wrote %lu byte of large object data (result = %lu)" -msgid_plural "wrote %lu bytes of large object data (result = %lu)" -msgstr[0] "%luë°”ì´íŠ¸ì˜ í° ê°œì²´ ë°ì´í„°ë¥¼ 씀(ê²°ê³¼ = %lu)" +msgid "wrote %zu byte of large object data (result = %d)" +msgid_plural "wrote %zu bytes of large object data (result = %d)" +msgstr[0] "%zu ë°”ì´íŠ¸ì˜ í° ê°ì²´ ë°ì´í„°ë¥¼ 씀(ê²°ê³¼ = %d)" -#: pg_backup_archiver.c:1659 +#: pg_backup_archiver.c:1778 #, c-format -msgid "could not write to large object (result: %lu, expected: %lu)" -msgstr "large object를 쓸 수 ì—†ìŒ (결과값: %lu, 예ìƒê°’: %lu)" +msgid "could not write to large object: %s" +msgstr "í° ê°ì²´ë¥¼ 쓸 수 ì—†ìŒ: %s" -#: pg_backup_archiver.c:1749 +#: pg_backup_archiver.c:1868 #, c-format msgid "while INITIALIZING:" msgstr "초기화 작업 중:" -#: pg_backup_archiver.c:1754 +#: pg_backup_archiver.c:1873 #, c-format msgid "while PROCESSING TOC:" msgstr "TOC 처리하는 중:" -#: pg_backup_archiver.c:1759 +#: pg_backup_archiver.c:1878 #, c-format msgid "while FINALIZING:" msgstr "ë’· 마무리 작업 중:" -#: pg_backup_archiver.c:1764 +#: pg_backup_archiver.c:1883 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "%d TOC 항목ì—서; %u %u %s %s %s" -#: pg_backup_archiver.c:1840 +#: pg_backup_archiver.c:1959 #, c-format msgid "bad dumpId" msgstr "ìž˜ëª»ëœ dumpID" -#: pg_backup_archiver.c:1861 +#: pg_backup_archiver.c:1980 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "TABLE DATA ì•„ì´í…œì— 대한 ìž˜ëª»ëœ í…Œì´ë¸” dumpId" -#: pg_backup_archiver.c:1953 +#: pg_backup_archiver.c:2072 #, c-format msgid "unexpected data offset flag %d" msgstr "예ìƒì¹˜ 못한 ìžë£Œ 옵셋 플래그 %d" -#: pg_backup_archiver.c:1966 +#: pg_backup_archiver.c:2085 #, c-format msgid "file offset in dump file is too large" msgstr "ë¤í”„ 파ì¼ì—서 íŒŒì¼ ì˜µì…‹ ê°’ì´ ë„ˆë¬´ í½ë‹ˆë‹¤" -#: pg_backup_archiver.c:2103 pg_backup_archiver.c:2113 +#: pg_backup_archiver.c:2196 #, c-format msgid "directory name too long: \"%s\"" msgstr "디렉터리 ì´ë¦„ì´ ë„ˆë¬´ 긺: \"%s\"" -#: pg_backup_archiver.c:2121 +#: pg_backup_archiver.c:2246 #, c-format msgid "" "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not " "exist)" msgstr "\"%s\" 디렉터리가 ì•Œë§žì€ ì•„ì¹´ì´ë¸Œìš©ì´ 아님 (\"toc.dat\" 파ì¼ì´ ì—†ìŒ)" -#: pg_backup_archiver.c:2129 pg_backup_custom.c:173 pg_backup_custom.c:812 -#: pg_backup_directory.c:207 pg_backup_directory.c:394 +#: pg_backup_archiver.c:2254 pg_backup_custom.c:169 pg_backup_custom.c:812 +#: pg_backup_directory.c:204 pg_backup_directory.c:396 #, c-format msgid "could not open input file \"%s\": %m" msgstr "\"%s\" ìž…ë ¥ 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: pg_backup_archiver.c:2136 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2261 pg_backup_custom.c:175 #, c-format msgid "could not open input file: %m" msgstr "ìž…ë ¥ 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: pg_backup_archiver.c:2142 +#: pg_backup_archiver.c:2267 #, c-format msgid "could not read input file: %m" msgstr "ìž…ë ¥ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: pg_backup_archiver.c:2144 +#: pg_backup_archiver.c:2269 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "ìž…ë ¥ 파ì¼ì´ 너무 짧습니다 (%lu ì½ì—ˆìŒ, 예ìƒì¹˜ 5)" -#: pg_backup_archiver.c:2229 +#: pg_backup_archiver.c:2301 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "ìž…ë ¥ 파ì¼ì€ ì¼ë°˜ í…스트 ë¤í”„ 파ì¼ìž…니다. psql ëª…ë ¹ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: pg_backup_archiver.c:2235 +#: pg_backup_archiver.c:2307 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "ìž…ë ¥ 파ì¼ì—서 타당한 ì•„ì¹´ì´ë¸Œë¥¼ ì°¾ì„ ìˆ˜ 없습니다(너무 ì§§ì€ì§€?)" -#: pg_backup_archiver.c:2241 +#: pg_backup_archiver.c:2313 #, c-format msgid "input file does not appear to be a valid archive" msgstr "ìž…ë ¥ 파ì¼ì—서 타당한 ì•„ì¹´ì´ë¸Œë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_backup_archiver.c:2261 +#: pg_backup_archiver.c:2322 #, c-format msgid "could not close input file: %m" msgstr "ìž…ë ¥ 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: pg_backup_archiver.c:2373 +#: pg_backup_archiver.c:2401 +#, c-format +msgid "could not open stdout for appending: %m" +msgstr "추가용 표준출력 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: pg_backup_archiver.c:2446 #, c-format msgid "unrecognized file format \"%d\"" msgstr "알 수 없는 íŒŒì¼ í¬ë©§: \"%d\"" -#: pg_backup_archiver.c:2455 pg_backup_archiver.c:4458 +#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4647 #, c-format msgid "finished item %d %s %s" msgstr "%d %s %s 항목 마침" -#: pg_backup_archiver.c:2459 pg_backup_archiver.c:4471 +#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4660 #, c-format msgid "worker process failed: exit code %d" msgstr "ìž‘ì—…ìž í”„ë¡œì„¸ìŠ¤ 실패: 종료 코드 %d" -#: pg_backup_archiver.c:2579 +#: pg_backup_archiver.c:2653 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "%d ID í•­ëª©ì€ ë²”ìœ„ë¥¼ ë²—ì–´ë‚¬ìŒ -- TOC ì •ë³´ê°€ ì†ìƒëœ 듯 합니다" -#: pg_backup_archiver.c:2646 +#: pg_backup_archiver.c:2736 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "WITH OIDS ì˜µì…˜ì´ ìžˆëŠ” í…Œì´ë¸”ì˜ ë³µì›ì€ ì´ì œ ì§€ì›í•˜ì§€ 않습니다" -#: pg_backup_archiver.c:2728 +#: pg_backup_archiver.c:2818 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "알 수 없는 ì¸ì½”딩: \"%s\"" -#: pg_backup_archiver.c:2733 +#: pg_backup_archiver.c:2823 #, c-format msgid "invalid ENCODING item: %s" msgstr "ìž˜ëª»ëœ ENCODING 항목: %s" -#: pg_backup_archiver.c:2751 +#: pg_backup_archiver.c:2841 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "ìž˜ëª»ëœ STDSTRINGS 항목: %s" -#: pg_backup_archiver.c:2776 +#: pg_backup_archiver.c:2866 #, c-format msgid "schema \"%s\" not found" msgstr "\"%s\" 스키마를 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_backup_archiver.c:2783 +#: pg_backup_archiver.c:2873 #, c-format msgid "table \"%s\" not found" msgstr "\"%s\" í…Œì´ë¸”ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_backup_archiver.c:2790 +#: pg_backup_archiver.c:2880 #, c-format msgid "index \"%s\" not found" msgstr "\"%s\" ì¸ë±ìŠ¤ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_backup_archiver.c:2797 +#: pg_backup_archiver.c:2887 #, c-format msgid "function \"%s\" not found" msgstr "\"%s\" 함수를 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_backup_archiver.c:2804 +#: pg_backup_archiver.c:2894 #, c-format msgid "trigger \"%s\" not found" msgstr "\"%s\" 트리거를 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_backup_archiver.c:3196 +#: pg_backup_archiver.c:3325 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "\"%s\" 사용ìžë¡œ 세션 사용ìžë¥¼ 지정할 수 ì—†ìŒ: %s" -#: pg_backup_archiver.c:3328 +#: pg_backup_archiver.c:3457 +#, c-format +msgid "could not set \"search_path\" to \"%s\": %s" +msgstr "\"search_path\"를 \"%s\"(으)로 지정할 수 ì—†ìŒ: %s" + +#: pg_backup_archiver.c:3518 #, c-format -msgid "could not set search_path to \"%s\": %s" -msgstr "search_path를 \"%s\"(으)로 지정할 수 ì—†ìŒ: %s" +msgid "could not set \"default_tablespace\" to %s: %s" +msgstr "\"default_tablespace\"로 %s(으)로 지정할 수 ì—†ìŒ: %s" -#: pg_backup_archiver.c:3390 +#: pg_backup_archiver.c:3567 #, c-format -msgid "could not set default_tablespace to %s: %s" -msgstr "default_tablespace로 %s(으)로 지정할 수 ì—†ìŒ: %s" +msgid "could not set \"default_table_access_method\": %s" +msgstr "\"default_table_access_method\"를 지정할 수 ì—†ìŒ: %s" -#: pg_backup_archiver.c:3435 +#: pg_backup_archiver.c:3616 #, c-format -msgid "could not set default_table_access_method: %s" -msgstr "default_table_access_method를 지정할 수 ì—†ìŒ: %s" +msgid "could not alter table access method: %s" +msgstr "alter table access method 실행 í•  수 ì—†ìŒ: %s" -#: pg_backup_archiver.c:3527 pg_backup_archiver.c:3685 +#: pg_backup_archiver.c:3717 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "\"%s\" ê°œì²´ì˜ ì†Œìœ ì£¼ë¥¼ 지정할 수 없습니다" -#: pg_backup_archiver.c:3789 +#: pg_backup_archiver.c:4004 #, c-format msgid "did not find magic string in file header" msgstr "íŒŒì¼ í—¤ë”ì—서 ë§¤ì§ ë¬¸ìžì—´ì„ 찾지 못했습니다" -#: pg_backup_archiver.c:3802 +#: pg_backup_archiver.c:4018 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "íŒŒì¼ í—¤ë”ì— ìžˆëŠ” %d.%d ë²„ì „ì€ ì§€ì›ë˜ì§€ 않습니다" -#: pg_backup_archiver.c:3807 +#: pg_backup_archiver.c:4023 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "정수 í¬ê¸° (%lu) 안전성 검사 실패" -#: pg_backup_archiver.c:3811 +#: pg_backup_archiver.c:4027 #, c-format msgid "" "archive was made on a machine with larger integers, some operations might " @@ -844,67 +1093,67 @@ msgstr "" "ì´ ì•„ì¹´ì´ë¸ŒëŠ” í° ì •ìˆ˜ë¥¼ ì§€ì›í•˜ëŠ” 시스템ì—서 만들어졌습니다. 그래서 몇 ë™ìž‘ì´ " "실패할 ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤." -#: pg_backup_archiver.c:3821 +#: pg_backup_archiver.c:4037 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "예ìƒë˜ëŠ” í¬ë©§ (%d)와 ë°œê²¬ëœ íŒŒì¼ í¬ë©§ (%d)ì´ ì„œë¡œ 다름" -#: pg_backup_archiver.c:3837 +#: pg_backup_archiver.c:4059 #, c-format msgid "" -"archive is compressed, but this installation does not support compression -- " -"no data will be available" +"archive is compressed, but this installation does not support compression " +"(%s) -- no data will be available" msgstr "" -"ì•„ì¹´ì´ë¸ŒëŠ” ì••ì¶•ë˜ì–´ìžˆì§€ë§Œ, ì´ í”„ë¡œê·¸ëž¨ì—서는 ì••ì¶•ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 못합니다 -- " -"ì´ ì•ˆì— ìžˆëŠ” ìžë£Œë¥¼ ëª¨ë‘ ì‚¬ìš©í•  수 없습니다." +"ì•„ì¹´ì´ë¸ŒëŠ” ì••ì¶•ë˜ì–´ìžˆì§€ë§Œ, ì´ í”„ë¡œê·¸ëž¨ì—서는 (%s) ì••ì¶•ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 못합니" +"다 -- ì´ ì•ˆì— ìžˆëŠ” ìžë£Œë¥¼ ëª¨ë‘ ì‚¬ìš©í•  수 없습니다." -#: pg_backup_archiver.c:3855 +#: pg_backup_archiver.c:4095 #, c-format msgid "invalid creation date in header" msgstr "í—¤ë”ì— ìž˜ëª»ëœ ìƒì„± 날짜가 있ìŒ" -#: pg_backup_archiver.c:3983 +#: pg_backup_archiver.c:4229 #, c-format msgid "processing item %d %s %s" msgstr "%d %s %s í•­ëª©ì„ ì²˜ë¦¬í•˜ëŠ” 중" -#: pg_backup_archiver.c:4062 +#: pg_backup_archiver.c:4314 #, c-format msgid "entering main parallel loop" msgstr "기본 병렬 루프로 시작 중" -#: pg_backup_archiver.c:4073 +#: pg_backup_archiver.c:4325 #, c-format msgid "skipping item %d %s %s" msgstr "%d %s %s í•­ëª©ì„ ê±´ë„ˆë›°ëŠ” 중" -#: pg_backup_archiver.c:4082 +#: pg_backup_archiver.c:4334 #, c-format msgid "launching item %d %s %s" msgstr "%d %s %s í•­ëª©ì„ ì‹œìž‘í•˜ëŠ” 중" -#: pg_backup_archiver.c:4136 +#: pg_backup_archiver.c:4388 #, c-format msgid "finished main parallel loop" msgstr "기본 병렬 루프 마침" -#: pg_backup_archiver.c:4172 +#: pg_backup_archiver.c:4424 #, c-format msgid "processing missed item %d %s %s" msgstr "누ë½ëœ %d %s %s 항목 처리 중" -#: pg_backup_archiver.c:4777 +#: pg_backup_archiver.c:4966 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "\"%s\" í…Œì´ë¸”ì„ ë§Œë“¤ 수 없어, 해당 ìžë£ŒëŠ” ë³µì›ë˜ì§€ ì•Šì„ ê²ƒìž…ë‹ˆë‹¤." -#: pg_backup_custom.c:378 pg_backup_null.c:147 +#: pg_backup_custom.c:376 pg_backup_null.c:143 #, c-format msgid "invalid OID for large object" msgstr "ìž˜ëª»ëœ large objectìš© OID" -#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:632 -#: pg_backup_custom.c:870 pg_backup_tar.c:1086 pg_backup_tar.c:1091 +#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:636 +#: pg_backup_custom.c:870 pg_backup_tar.c:1029 pg_backup_tar.c:1034 #, c-format msgid "error during file seek: %m" msgstr "íŒŒì¼ seek 작업하는 ë„중 오류가 ë°œìƒí–ˆìŠµë‹ˆë‹¤: %m" @@ -945,13 +1194,8 @@ msgstr "ìžë£Œë¥¼ ì½ëŠ” ë™ì•ˆ 예ìƒì¹˜ 못한 ID (%d) ë°œê²¬ë¨ -- 예ìƒê°’ msgid "unrecognized data block type %d while restoring archive" msgstr "ì•„ì¹´ì´ë¸Œ ë³µì›í•˜ëŠ” 중ì—, 알 수 없는 ìžë£Œ 블럭 형태 %d 를 발견함" -#: pg_backup_custom.c:648 -#, c-format -msgid "could not read from input file: %m" -msgstr "ìž…ë ¥ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" - -#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:948 -#: pg_backup_tar.c:1089 +#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:945 +#: pg_backup_tar.c:1032 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "ì•„ì¹´ì´ë¸Œ 파ì¼ì—서 검색 위치를 확ì¸í•  수 ì—†ìŒ: %m" @@ -987,240 +1231,237 @@ msgstr "ì•„ì¹´ì´ë¸Œ 파ì¼ì—서 검색 위치를 설정할 수 ì—†ìŒ: %m" msgid "compressor active" msgstr "압축기 사용" -#: pg_backup_db.c:41 +#: pg_backup_db.c:42 #, c-format msgid "could not get server_version from libpq" msgstr "libpqì—서 server_verion ê°’ì„ êµ¬í•  수 ì—†ìŒ" -#: pg_backup_db.c:52 pg_dumpall.c:1826 -#, c-format -msgid "server version: %s; %s version: %s" -msgstr "서버 버전: %s; %s 버전: %s" - -#: pg_backup_db.c:54 pg_dumpall.c:1828 +#: pg_backup_db.c:53 pg_dumpall.c:1830 #, c-format msgid "aborting because of server version mismatch" msgstr "서버 ë²„ì „ì´ ì¼ì¹˜í•˜ì§€ 않아 중단하는 중" -#: pg_backup_db.c:124 +#: pg_backup_db.c:54 pg_dumpall.c:1831 +#, c-format +msgid "server version: %s; %s version: %s" +msgstr "서버 버전: %s; %s 버전: %s" + +#: pg_backup_db.c:120 #, c-format msgid "already connected to a database" msgstr "ë°ì´í„°ë² ì´ìŠ¤ì— ì´ë¯¸ ì ‘ì†í•´ 있ìŒ" -#: pg_backup_db.c:133 pg_backup_db.c:185 pg_dumpall.c:1651 pg_dumpall.c:1764 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1677 pg_dumpall.c:1779 msgid "Password: " msgstr "암호: " -#: pg_backup_db.c:177 +#: pg_backup_db.c:170 #, c-format msgid "could not connect to database" msgstr "ë°ì´í„°ë² ì´ìФ ì ‘ì†ì„ í•  수 ì—†ìŒ" -#: pg_backup_db.c:195 +#: pg_backup_db.c:187 #, c-format -msgid "reconnection to database \"%s\" failed: %s" -msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ ìž¬ì ‘ì† ì‹¤íŒ¨: %s" +msgid "reconnection failed: %s" +msgstr "재연결 실패: %s" -#: pg_backup_db.c:199 -#, c-format -msgid "connection to database \"%s\" failed: %s" -msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì† í•  수 ì—†ìŒ: %s" - -#: pg_backup_db.c:272 pg_dumpall.c:1684 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:788 pg_dump_sort.c:1213 +#: pg_dump_sort.c:1233 pg_dumpall.c:1704 pg_dumpall.c:1788 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:279 pg_dumpall.c:1889 pg_dumpall.c:1912 +#: pg_backup_db.c:271 pg_dumpall.c:1893 pg_dumpall.c:1916 #, c-format msgid "query failed: %s" msgstr "쿼리 실패: %s" -#: pg_backup_db.c:281 pg_dumpall.c:1890 pg_dumpall.c:1913 +#: pg_backup_db.c:273 pg_dumpall.c:1894 pg_dumpall.c:1917 #, c-format -msgid "query was: %s" +msgid "Query was: %s" msgstr "사용한 쿼리: %s" -#: pg_backup_db.c:322 +#: pg_backup_db.c:315 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" msgstr[0] "쿼리ì—서 한 개가 아닌 %dê°œì˜ í–‰ì„ ë°˜í™˜: %s" -#: pg_backup_db.c:358 +#: pg_backup_db.c:351 #, c-format msgid "%s: %sCommand was: %s" msgstr "%s: %sì‚¬ìš©ëœ ëª…ë ¹: %s" -#: pg_backup_db.c:414 pg_backup_db.c:488 pg_backup_db.c:495 +#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488 msgid "could not execute query" msgstr "쿼리를 실행 í•  수 ì—†ìŒ" -#: pg_backup_db.c:467 +#: pg_backup_db.c:460 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "PQputCopyDataì— ì˜í•´ì„œ 오류가 반환ë˜ì—ˆìŒ: %s" -#: pg_backup_db.c:516 +#: pg_backup_db.c:509 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "PQputCopyEndì— ì˜í•´ì„œ 오류가 반환ë˜ì—ˆìŒ: %s" -#: pg_backup_db.c:522 +#: pg_backup_db.c:515 #, c-format msgid "COPY failed for table \"%s\": %s" msgstr "\"%s\" í…Œì´ë¸”ì„ ìœ„í•œ COPY 실패: %s" -#: pg_backup_db.c:528 pg_dump.c:1988 +#: pg_backup_db.c:521 pg_dump.c:2283 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "\"%s\" í…Œì´ë¸” COPY 작업 중 ìž˜ëª»ëœ ë¶€ê°€ 결과가 있ìŒ" -#: pg_backup_db.c:540 +#: pg_backup_db.c:533 msgid "could not start database transaction" msgstr "ë°ì´í„°ë² ì´ìФ íŠ¸ëžœìž­ì…˜ì„ ì‹œìž‘í•  수 ì—†ìŒ" -#: pg_backup_db.c:548 +#: pg_backup_db.c:541 msgid "could not commit database transaction" msgstr "ë°ì´í„°ë² ì´ìФ íŠ¸ëžœìž­ì…˜ì„ commit í•  수 ì—†ìŒ" -#: pg_backup_directory.c:156 +#: pg_backup_directory.c:153 #, c-format msgid "no output directory specified" msgstr "ìžë£Œê°€ ì €ìž¥ë  ë””ë ‰í„°ë¦¬ë¥¼ 지정하지 않았ìŒ" -#: pg_backup_directory.c:185 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" - -#: pg_backup_directory.c:189 +#: pg_backup_directory.c:186 #, c-format msgid "could not close directory \"%s\": %m" msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: pg_backup_directory.c:195 +#: pg_backup_directory.c:192 #, c-format msgid "could not create directory \"%s\": %m" msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m" -#: pg_backup_directory.c:355 pg_backup_directory.c:496 -#: pg_backup_directory.c:532 +#: pg_backup_directory.c:357 pg_backup_directory.c:506 +#: pg_backup_directory.c:544 #, c-format msgid "could not write to output file: %s" msgstr "출력 파ì¼ì„ 쓸 수 ì—†ìŒ: %s" -#: pg_backup_directory.c:406 +#: pg_backup_directory.c:375 +#, c-format +msgid "could not close data file: %m" +msgstr "ìžë£Œ 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: pg_backup_directory.c:408 #, c-format msgid "could not close data file \"%s\": %m" msgstr "\"%s\" ìžë£Œ 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: pg_backup_directory.c:446 +#: pg_backup_directory.c:455 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "입력용 large object TOC 파ì¼(\"%s\")ì„ ì—´ 수 ì—†ìŒ: %m" -#: pg_backup_directory.c:457 +#: pg_backup_directory.c:466 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "large object TOC 파ì¼(\"%s\")ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: \"%s\"" -#: pg_backup_directory.c:466 +#: pg_backup_directory.c:475 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "large object TOC 파ì¼(\"%s\")ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ" -#: pg_backup_directory.c:470 +#: pg_backup_directory.c:479 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "large object TOC 파ì¼(\"%s\")ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: pg_backup_directory.c:689 +#: pg_backup_directory.c:702 +#, c-format +msgid "could not close LO data file: %m" +msgstr "LO ìžë£Œ 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: pg_backup_directory.c:712 #, c-format -msgid "could not write to blobs TOC file" -msgstr "blob TOC 파ì¼ì— 쓸 수 ì—†ìŒ" +msgid "could not write to LOs TOC file: %s" +msgstr "LO TOC 파ì¼ì— 쓸 수 ì—†ìŒ: %s" -#: pg_backup_directory.c:721 +#: pg_backup_directory.c:728 +#, c-format +msgid "could not close LOs TOC file: %m" +msgstr "LO TOC 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: pg_backup_directory.c:747 #, c-format msgid "file name too long: \"%s\"" msgstr "íŒŒì¼ ì´ë¦„ì´ ë„ˆë¬´ 긺: \"%s\"" -#: pg_backup_null.c:74 +#: pg_backup_null.c:70 #, c-format msgid "this format cannot be read" msgstr "ì´ íŒŒì¼ í˜•íƒœëŠ” ì½ì„ 수 ì—†ìŒ" -#: pg_backup_tar.c:177 +#: pg_backup_tar.c:168 #, c-format msgid "could not open TOC file \"%s\" for output: %m" msgstr "출력용 TOC íŒŒì¼ \"%s\"ì„(를) ì—´ 수 ì—†ìŒ: %m" -#: pg_backup_tar.c:184 +#: pg_backup_tar.c:175 #, c-format msgid "could not open TOC file for output: %m" msgstr "출력용 TOC 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: pg_backup_tar.c:203 pg_backup_tar.c:358 +#: pg_backup_tar.c:194 pg_backup_tar.c:330 pg_backup_tar.c:385 +#: pg_backup_tar.c:401 pg_backup_tar.c:906 #, c-format msgid "compression is not supported by tar archive format" msgstr "tar 출력 í¬ë©§ì—서 ì••ì¶• ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: pg_backup_tar.c:211 +#: pg_backup_tar.c:202 #, c-format msgid "could not open TOC file \"%s\" for input: %m" msgstr "입력용 TOC 파ì¼(\"%s\")ì„ ì—´ 수 ì—†ìŒ: %m" -#: pg_backup_tar.c:218 +#: pg_backup_tar.c:209 #, c-format msgid "could not open TOC file for input: %m" msgstr "입력용 TOC 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: pg_backup_tar.c:344 +#: pg_backup_tar.c:318 #, c-format msgid "could not find file \"%s\" in archive" msgstr "ì•„ì¹´ì´ë¸Œì—서 \"%s\" 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_backup_tar.c:410 +#: pg_backup_tar.c:378 #, c-format msgid "could not generate temporary file name: %m" msgstr "임시 íŒŒì¼ ì´ë¦„ì„ ì§“ì§€ 못했습니다: %m" -#: pg_backup_tar.c:421 -#, c-format -msgid "could not open temporary file" -msgstr "임시 파ì¼ì„ ì—´ 수 ì—†ìŒ" - -#: pg_backup_tar.c:448 -#, c-format -msgid "could not close tar member" -msgstr "tar 맴버를 ë‹«ì§€ 못했습니다" - -#: pg_backup_tar.c:691 +#: pg_backup_tar.c:619 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "COPY 구문 오류: \"%s\"" -#: pg_backup_tar.c:958 +#: pg_backup_tar.c:903 #, c-format msgid "invalid OID for large object (%u)" msgstr "ìž˜ëª»ëœ large object OID: %u" -#: pg_backup_tar.c:1105 +#: pg_backup_tar.c:1048 #, c-format msgid "could not close temporary file: %m" msgstr "임시 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: pg_backup_tar.c:1114 +#: pg_backup_tar.c:1051 #, c-format -msgid "actual file length (%s) does not match expected (%s)" -msgstr "실재 íŒŒì¼ ê¸¸ì´(%s)와 예ìƒë˜ëŠ” ê°’(%s)ì´ ë‹¤ë¦…ë‹ˆë‹¤" +msgid "actual file length (%lld) does not match expected (%lld)" +msgstr "실재 íŒŒì¼ ê¸¸ì´(%lld)와 예ìƒë˜ëŠ” ê°’(%lld)ì´ ë‹¤ë¦…ë‹ˆë‹¤" -#: pg_backup_tar.c:1171 pg_backup_tar.c:1201 +#: pg_backup_tar.c:1097 pg_backup_tar.c:1128 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "tar ì•„ì¹´ì´ë¸Œì—서 \"%s\" 파ì¼ì„ 위한 í—¤ë”를 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_backup_tar.c:1189 +#: pg_backup_tar.c:1115 #, c-format msgid "" "restoring data out of order is not supported in this archive format: \"%s\" " @@ -1229,84 +1470,69 @@ msgstr "" "순서를 넘어서는 ìžë£Œ ë¤í”„ ìž‘ì—…ì€ ì´ ì•„ì¹´ì´ë¸Œ í¬ë©§ì—서는 ì§€ì›í•˜ì§€ 않습니다: " "\"%s\" 요구ë˜ì—ˆì§€ë§Œ, ì´ ì•„ì¹´ì´ë¸Œ 파ì¼ì—서는 \"%s\" ì „ì— ì˜µë‹ˆë‹¤." -#: pg_backup_tar.c:1234 +#: pg_backup_tar.c:1162 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "불완전한 tar í—¤ë”ê°€ 있ìŒ(%lu ë°”ì´íЏ)" -#: pg_backup_tar.c:1285 +#: pg_backup_tar.c:1201 #, c-format msgid "" -"corrupt tar header found in %s (expected %d, computed %d) file position %s" -msgstr "%s ì•ˆì— ì†ìƒëœ tar í—¤ë” ë°œê²¬ (예ìƒì¹˜ %d, ê³„ì‚°ëœ ê°’ %d), íŒŒì¼ ìœ„ì¹˜ %s" +"corrupt tar header found in %s (expected %d, computed %d) file position %llu" +msgstr "%s ì•ˆì— ì†ìƒëœ tar í—¤ë” ë°œê²¬ (예ìƒì¹˜ %d, ê³„ì‚°ëœ ê°’ %d), íŒŒì¼ ìœ„ì¹˜ %llu" #: pg_backup_utils.c:54 #, c-format msgid "unrecognized section name: \"%s\"" msgstr "알 수 없는 섹션 ì´ë¦„: \"%s\"" -#: pg_backup_utils.c:55 pg_dump.c:607 pg_dump.c:624 pg_dumpall.c:338 -#: pg_dumpall.c:348 pg_dumpall.c:357 pg_dumpall.c:366 pg_dumpall.c:374 -#: pg_dumpall.c:388 pg_dumpall.c:464 pg_restore.c:284 pg_restore.c:300 -#: pg_restore.c:318 +#: pg_backup_utils.c:55 pg_dump.c:694 pg_dump.c:711 pg_dumpall.c:370 +#: pg_dumpall.c:380 pg_dumpall.c:388 pg_dumpall.c:396 pg_dumpall.c:403 +#: pg_dumpall.c:413 pg_dumpall.c:488 pg_restore.c:307 pg_restore.c:323 +#: pg_restore.c:337 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "보다 ìžì„¸í•œ ì‚¬ìš©ë²•ì€ \"%s --help\"\n" +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." -#: pg_backup_utils.c:68 +#: pg_backup_utils.c:66 #, c-format msgid "out of on_exit_nicely slots" msgstr "on_exit_nicely 슬롯 범위 벗어남" -#: pg_dump.c:533 -#, c-format -msgid "compression level must be in range 0..9" -msgstr "ì••ì¶• 수위는 0부터 9까지 지정할 수 있ìŒ" - -#: pg_dump.c:571 -#, c-format -msgid "extra_float_digits must be in range -15..3" -msgstr "extra_float_digits ê°’ì€ -15..3 사ì´ê°’ì´ì–´ì•¼ 함" - -#: pg_dump.c:594 -#, c-format -msgid "rows-per-insert must be in range %d..%d" -msgstr "rows-per-insert ê°’ì€ %d부터 %d까지 지정할 수 있습니다." - -#: pg_dump.c:622 pg_dumpall.c:346 pg_restore.c:298 +#: pg_dump.c:709 pg_dumpall.c:378 pg_restore.c:321 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ ì§€ì •í–ˆìŒ (시작: \"%s\")" -#: pg_dump.c:643 pg_restore.c:327 +#: pg_dump.c:728 pg_restore.c:344 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "-s/--schema-only 옵션과 -a/--data-only ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" -#: pg_dump.c:648 +#: pg_dump.c:731 #, c-format msgid "" "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "" "-s/--schema-only 옵션과 --include-foreign-data ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" -#: pg_dump.c:651 +#: pg_dump.c:734 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "--include-foreign-data ì˜µì…˜ì€ ë³‘ë ¬ 백업 작업ì—서 ì§€ì›í•˜ì§€ 않ìŒ" -#: pg_dump.c:655 pg_restore.c:333 +#: pg_dump.c:737 pg_restore.c:347 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "-c/--clean 옵션과 -a/--data-only ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" -#: pg_dump.c:660 pg_dumpall.c:381 pg_restore.c:382 +#: pg_dump.c:740 pg_dumpall.c:408 pg_restore.c:375 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "--if-exists ì˜µì…˜ì€ -c/--clean 옵션과 함께 사용해야 함" -#: pg_dump.c:667 +#: pg_dump.c:747 #, c-format msgid "" "option --on-conflict-do-nothing requires option --inserts, --rows-per-" @@ -1315,57 +1541,47 @@ msgstr "" "--on-conflict-do-nothing ì˜µì…˜ì€ --inserts, --rows-per-insert ë˜ëŠ” --column-" "inserts 옵션과 함께 사용해야 함" -#: pg_dump.c:689 -#, c-format -msgid "" -"requested compression not available in this installation -- archive will be " -"uncompressed" -msgstr "" -"요청한 ì••ì¶• ê¸°ëŠ¥ì€ ì´ ì„¤ì¹˜íŒì—서는 사용할 수 없습니다 -- ìžë£Œ 파ì¼ì€ ì••ì¶• ì—†" -"ì´ ë§Œë“¤ì–´ì§ˆ 것입니다" - -#: pg_dump.c:710 pg_restore.c:349 +#: pg_dump.c:776 #, c-format -msgid "invalid number of parallel jobs" -msgstr "ìž˜ëª»ëœ ë³‘ë ¬ 작업 수" +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "알 수 없는 ì••ì¶• 알고리즘: \"%s\"" -#: pg_dump.c:714 +#: pg_dump.c:783 #, c-format -msgid "parallel backup only supported by the directory format" -msgstr "병렬 ë°±ì—…ì€ ë””ë ‰í„°ë¦¬ 기반 ì¶œë ¥ì¼ ë•Œë§Œ 사용할 수 있습니다." +msgid "invalid compression specification: %s" +msgstr "ìž˜ëª»ëœ ì••ì¶• 명세: %s" -#: pg_dump.c:769 +#: pg_dump.c:796 #, c-format -msgid "" -"Synchronized snapshots are not supported by this server version.\n" -"Run with --no-synchronized-snapshots instead if you do not need\n" -"synchronized snapshots." -msgstr "" -"ì´ ì„œë²„ 버전ì—서는 ë™ê¸°í™”ëœ ìŠ¤ëƒ…ìƒ· ê¸°ëŠ¥ì„ ì‚¬ìš©í•  수 ì—†ìŒ.\n" -"ë™ê¸°í™”ëœ ìŠ¤ëƒ…ìƒ· ê¸°ëŠ¥ì´ í•„ìš” 없다면, --no-synchronized-snapshots\n" -"ì˜µì…˜ì„ ì§€ì •í•´ì„œ ë¤í”„í•  수 있습니다." +msgid "compression option \"%s\" is not currently supported by pg_dump" +msgstr "\"%s\" ì••ì¶• ì˜µì…˜ì€ pg_dumpì—서 현재 ì§€ì›í•˜ì§€ 않ìŒ" -#: pg_dump.c:775 +#: pg_dump.c:808 #, c-format -msgid "Exported snapshots are not supported by this server version." -msgstr "ì´ ì„œë²„ëŠ” exported snapshotì„ ì§€ì›í•˜ì§€ 않ìŒ." +msgid "parallel backup only supported by the directory format" +msgstr "병렬 ë°±ì—…ì€ ë””ë ‰í„°ë¦¬ 기반 ì¶œë ¥ì¼ ë•Œë§Œ 사용할 수 있습니다." -#: pg_dump.c:787 +#: pg_dump.c:854 #, c-format msgid "last built-in OID is %u" msgstr "마지막 내장 OID는 %u" -#: pg_dump.c:796 +#: pg_dump.c:863 #, c-format msgid "no matching schemas were found" msgstr "ì¡°ê±´ì— ë§žëŠ” 스키마가 없습니다" -#: pg_dump.c:810 +#: pg_dump.c:880 #, c-format msgid "no matching tables were found" msgstr "ì¡°ê±´ì— ë§žëŠ” í…Œì´ë¸”ì´ ì—†ìŠµë‹ˆë‹¤" -#: pg_dump.c:990 +#: pg_dump.c:908 +#, c-format +msgid "no matching extensions were found" +msgstr "ì¡°ê±´ì— ë§žëŠ” 확장 ëª¨ë“ˆì´ ì—†ìŠµë‹ˆë‹¤" + +#: pg_dump.c:1092 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1375,17 +1591,17 @@ msgstr "" "다른 í˜•íƒœì˜ íŒŒì¼ë¡œ ë¤í”„합니다.\n" "\n" -#: pg_dump.c:991 pg_dumpall.c:617 pg_restore.c:462 +#: pg_dump.c:1093 pg_dumpall.c:635 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "사용법:\n" -#: pg_dump.c:992 +#: pg_dump.c:1094 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [옵션]... [DBì´ë¦„]\n" -#: pg_dump.c:994 pg_dumpall.c:620 pg_restore.c:465 +#: pg_dump.c:1096 pg_dumpall.c:638 pg_restore.c:455 #, c-format msgid "" "\n" @@ -1394,12 +1610,12 @@ msgstr "" "\n" "ì¼ë°˜ 옵션들:\n" -#: pg_dump.c:995 +#: pg_dump.c:1097 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=파ì¼ì´ë¦„ 출력 íŒŒì¼ ë˜ëŠ” 디렉터리 ì´ë¦„\n" -#: pg_dump.c:996 +#: pg_dump.c:1098 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1408,47 +1624,55 @@ msgstr "" " -F, --format=c|d|t|p 출력 íŒŒì¼ í˜•ì‹(ì‚¬ìš©ìž ì§€ì •, 디렉터리, tar,\n" " ì¼ë°˜ í…스트(초기값))\n" -#: pg_dump.c:998 +#: pg_dump.c:1100 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=개수 ë¤í”„ ìž‘ì—…ì„ ë³‘ë ¬ 처리 함\n" -#: pg_dump.c:999 pg_dumpall.c:622 +#: pg_dump.c:1101 pg_dumpall.c:640 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose 작업 ë‚´ì—­ì„ ìžì„¸ížˆ ë´„\n" -#: pg_dump.c:1000 pg_dumpall.c:623 +#: pg_dump.c:1102 pg_dumpall.c:641 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: pg_dump.c:1001 +#: pg_dump.c:1103 #, c-format msgid "" -" -Z, --compress=0-9 compression level for compressed formats\n" -msgstr " -Z, --compress=0-9 출력 ìžë£Œ ì••ì¶• 수위\n" +" -Z, --compress=METHOD[:DETAIL]\n" +" compress as specified\n" +msgstr "" +" -Z, --compress=METHOD[:DETAIL]\n" +" ì••ì¶• 지정\n" -#: pg_dump.c:1002 pg_dumpall.c:624 +#: pg_dump.c:1105 pg_dumpall.c:642 #, c-format msgid "" " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr "" " --lock-wait-timeout=ì´ˆ í…Œì´ë¸” 잠금 시 지정한 ì´ˆë§Œí¼ ê¸°ë‹¤ë¦° 후 실패\n" -#: pg_dump.c:1003 pg_dumpall.c:651 +#: pg_dump.c:1106 pg_dumpall.c:670 #, c-format msgid "" " --no-sync do not wait for changes to be written safely " "to disk\n" msgstr " --no-sync fsync 작업 ìƒëžµ\n" -#: pg_dump.c:1004 pg_dumpall.c:625 +#: pg_dump.c:1107 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD 파ì¼ì„ 디스í¬ì— ë™ê¸°í™”í•  방법 지정\n" + +#: pg_dump.c:1108 pg_dumpall.c:643 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: pg_dump.c:1006 pg_dumpall.c:626 +#: pg_dump.c:1110 pg_dumpall.c:644 #, c-format msgid "" "\n" @@ -1457,22 +1681,34 @@ msgstr "" "\n" "출력 ë‚´ìš©ì„ ë‹¤ë£¨ëŠ” 옵션들:\n" -#: pg_dump.c:1007 pg_dumpall.c:627 +#: pg_dump.c:1111 pg_dumpall.c:645 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only 스키마 빼고 ìžë£Œë§Œ ë¤í”„\n" -#: pg_dump.c:1008 +#: pg_dump.c:1112 +#, c-format +msgid " -b, --large-objects include large objects in dump\n" +msgstr " -b, --large-objects í° ê°ì²´ë¥¼ ë¤í”„ì— í¬í•¨\n" + +#: pg_dump.c:1113 #, c-format -msgid " -b, --blobs include large objects in dump\n" -msgstr " -b, --blobs Large Objectë“¤ë„ í•¨ê»˜ ë¤í”„함\n" +msgid " --blobs (same as --large-objects, deprecated)\n" +msgstr " --blobs (--large-objects 와 ê°™ìŒ, 옛날 옵션)\n" -#: pg_dump.c:1009 +#: pg_dump.c:1114 #, c-format -msgid " -B, --no-blobs exclude large objects in dump\n" -msgstr " -B, --no-blobs Large Objectë“¤ì„ ì œì™¸í•˜ê³  ë¤í”„함\n" +msgid " -B, --no-large-objects exclude large objects in dump\n" +msgstr " -B, --no-large-objects í° ê°ì²´ 빼고 ë¤í”„\n" + +#: pg_dump.c:1115 +#, c-format +msgid "" +" --no-blobs (same as --no-large-objects, deprecated)\n" +msgstr "" +" --no-blobs (--no-large-objects와 ê°™ìŒ, 옛날 옵션)\n" -#: pg_dump.c:1010 pg_restore.c:476 +#: pg_dump.c:1116 pg_restore.c:466 #, c-format msgid "" " -c, --clean clean (drop) database objects before " @@ -1481,29 +1717,34 @@ msgstr "" " -c, --clean 다시 만들기 ì „ì— ë°ì´í„°ë² ì´ìФ 개체 지우기(ì‚­" "ì œ)\n" -#: pg_dump.c:1011 +#: pg_dump.c:1117 #, c-format msgid "" " -C, --create include commands to create database in dump\n" msgstr "" " -C, --create ë°ì´í„°ë² ì´ìФ 만드는 ëª…ë ¹êµ¬ë¬¸ë„ í¬í•¨ì‹œí‚´\n" -#: pg_dump.c:1012 pg_dumpall.c:629 +#: pg_dump.c:1118 +#, c-format +msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" +msgstr " -e, --extension=PATTERN 지정한 확장 모듈들만 ë¤í”„ 함\n" + +#: pg_dump.c:1119 pg_dumpall.c:647 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=ì¸ì½”딩 지정한 ì¸ì½”딩으로 ìžë£Œë¥¼ ë¤í”„ 함\n" -#: pg_dump.c:1013 +#: pg_dump.c:1120 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=PATTERN 지정한 SCHEMA들 ìžë£Œë§Œ ë¤í”„\n" -#: pg_dump.c:1014 +#: pg_dump.c:1121 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=PATTERN 지정한 SCHEMA들만 빼고 ëª¨ë‘ ë¤í”„\n" -#: pg_dump.c:1015 +#: pg_dump.c:1122 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1512,12 +1753,12 @@ msgstr "" " -O, --no-owner ì¼ë°˜ í…스트 형ì‹ì—서\n" " 개체 소유권 ë³µì› ê±´ë„ˆë›°ê¸°\n" -#: pg_dump.c:1017 pg_dumpall.c:633 +#: pg_dump.c:1124 pg_dumpall.c:651 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only ìžë£Œêµ¬ì¡°(스키마)ë§Œ ë¤í”„\n" -#: pg_dump.c:1018 +#: pg_dump.c:1125 #, c-format msgid "" " -S, --superuser=NAME superuser user name to use in plain-text " @@ -1526,28 +1767,28 @@ msgstr "" " -S, --superuser=NAME ì¼ë°˜ í…스트 형ì‹ì—서 사용할 슈í¼ìœ ì € ì‚¬ìš©ìž ì´" "름\n" -#: pg_dump.c:1019 +#: pg_dump.c:1126 #, c-format -msgid " -t, --table=PATTERN dump the specified table(s) only\n" +msgid " -t, --table=PATTERN dump only the specified table(s)\n" msgstr " -t, --table=PATTERN 지정한 ì´ë¦„ì˜ í…Œì´ë¸”들만 ë¤í”„\n" -#: pg_dump.c:1020 +#: pg_dump.c:1127 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=PATTERN 지정한 í…Œì´ë¸”들만 빼고 ë¤í”„\n" -#: pg_dump.c:1021 pg_dumpall.c:636 +#: pg_dump.c:1128 pg_dumpall.c:654 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr "" " -x, --no-privileges ì ‘ê·¼ 권한 (grant/revoke) 정보는 ë¤í”„ 안 함\n" -#: pg_dump.c:1022 pg_dumpall.c:637 +#: pg_dump.c:1129 pg_dumpall.c:655 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade 업그레ì´ë“œ 유틸리티 ì „ìš©\n" -#: pg_dump.c:1023 pg_dumpall.c:638 +#: pg_dump.c:1130 pg_dumpall.c:656 #, c-format msgid "" " --column-inserts dump data as INSERT commands with column " @@ -1555,7 +1796,7 @@ msgid "" msgstr "" " --column-inserts 칼럼 ì´ë¦„ê³¼ 함께 INSERT 명령으로 ìžë£Œ ë¤í”„\n" -#: pg_dump.c:1024 pg_dumpall.c:639 +#: pg_dump.c:1131 pg_dumpall.c:657 #, c-format msgid "" " --disable-dollar-quoting disable dollar quoting, use SQL standard " @@ -1563,13 +1804,13 @@ msgid "" msgstr "" " --disable-dollar-quoting $ ì¸ìš© 구문 사용안함, SQL 표준 따옴표 사용\n" -#: pg_dump.c:1025 pg_dumpall.c:640 pg_restore.c:493 +#: pg_dump.c:1132 pg_dumpall.c:658 pg_restore.c:483 #, c-format msgid "" " --disable-triggers disable triggers during data-only restore\n" msgstr " --disable-triggers ìžë£Œë§Œ ë³µì›í•  때 트리거 ì‚¬ìš©ì„ ì•ˆí•¨\n" -#: pg_dump.c:1026 +#: pg_dump.c:1133 #, c-format msgid "" " --enable-row-security enable row security (dump only content user " @@ -1579,25 +1820,63 @@ msgstr "" " --enable-row-security 로우 보안 활성화 (현재 작업ìžê°€ 접근할 수\n" " 있는 ìžë£Œë§Œ ë¤í”„ 함)\n" -#: pg_dump.c:1028 +#: pg_dump.c:1135 +#, c-format +msgid " --exclude-extension=PATTERN do NOT dump the specified extension(s)\n" +msgstr " --exclude-extension=PATTERN 지정한 확장 ëª¨ë“ˆì€ ë¤í”„하지 않ìŒ\n" + +#: pg_dump.c:1136 +#, c-format +msgid "" +" --exclude-table-and-children=PATTERN\n" +" do NOT dump the specified table(s), " +"including\n" +" child and partition tables\n" +msgstr "" +" --exclude-table-and-children=PATTERN\n" +" ìƒì† 하위, 파티션 하위 í…Œì´ë¸”ì„ í¬í•¨í•˜ëŠ”\n" +" íŒ¨í„´ì˜ í…Œì´ë¸”ë“¤ì€ ë¹¼ê³  ë¤í”„\n" + +#: pg_dump.c:1139 #, c-format msgid "" " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=PATTERN 해당 í…Œì´ë¸” ìžë£ŒëŠ” ë¤í”„ 안함\n" -#: pg_dump.c:1029 pg_dumpall.c:642 +#: pg_dump.c:1140 +#, c-format +msgid "" +" --exclude-table-data-and-children=PATTERN\n" +" do NOT dump data for the specified table(s),\n" +" including child and partition tables\n" +msgstr "" +" --exclude-table-data-and-children=PATTERN\n" +" ìƒì† 하위, 파티션 하위 í…Œì´ë¸”ì„ í¬í•¨í•˜ëŠ”\n" +" íŒ¨í„´ì˜ í…Œì´ë¸”ë“¤ì˜ ìžë£ŒëŠ” 빼고 ë¤í”„\n" + +#: pg_dump.c:1143 pg_dumpall.c:660 #, c-format msgid "" " --extra-float-digits=NUM override default setting for " "extra_float_digits\n" msgstr " --extra-float-digits=NUM 기본 extra_float_digits ê°’ 바꿈\n" -#: pg_dump.c:1030 pg_dumpall.c:643 pg_restore.c:495 +#: pg_dump.c:1144 +#, c-format +msgid "" +" --filter=FILENAME include or exclude objects and data from " +"dump\n" +" based on expressions in FILENAME\n" +msgstr "" +" --filter=FILENAME 지정한 파ì¼ì˜ 규칙대로 í¬í•¨í•˜ê±°ë‚˜ 제외할\n" +" ê°ì²´ë¥¼ ë°˜ì˜í•˜ì—¬ ë¤í”„\n" + +#: pg_dump.c:1146 pg_dumpall.c:662 pg_restore.c:487 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists ê°ì²´ ì‚­ì œ 시 IF EXISTS 구문 사용\n" -#: pg_dump.c:1031 +#: pg_dump.c:1147 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1608,58 +1887,60 @@ msgstr "" " 지정한 패턴과 ì¼ì¹˜í•˜ëŠ” 외부 ì„œë²„ì˜ ì™¸ë¶€\n" " í…Œì´ë¸” ìžë£Œë¥¼ í¬í•¨\n" -#: pg_dump.c:1034 pg_dumpall.c:644 +#: pg_dump.c:1150 pg_dumpall.c:663 #, c-format msgid "" " --inserts dump data as INSERT commands, rather than " "COPY\n" msgstr " --inserts COPY 대신 INSERT 명령으로 ìžë£Œ ë¤í”„\n" -#: pg_dump.c:1035 pg_dumpall.c:645 +#: pg_dump.c:1151 pg_dumpall.c:664 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr "" " --load-via-partition-root ìƒìœ„ í…Œì´ë¸”ì„ í†µí•´ 하위 í…Œì´ë¸”ì„ ë¡œë“œí•¨\n" -#: pg_dump.c:1036 pg_dumpall.c:646 +#: pg_dump.c:1152 pg_dumpall.c:665 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments 코멘트는 ë¤í”„ 안함\n" -#: pg_dump.c:1037 pg_dumpall.c:647 +#: pg_dump.c:1153 pg_dumpall.c:666 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications 발행 정보는 ë¤í”„하지 않ìŒ\n" -#: pg_dump.c:1038 pg_dumpall.c:649 +#: pg_dump.c:1154 pg_dumpall.c:668 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels 보안 ë¼ë²¨ í• ë‹¹ì„ ë¤í”„ 하지 않ìŒ\n" -#: pg_dump.c:1039 pg_dumpall.c:650 +#: pg_dump.c:1155 pg_dumpall.c:669 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions êµ¬ë… ì •ë³´ëŠ” ë¤í”„하지 않ìŒ\n" -#: pg_dump.c:1040 +#: pg_dump.c:1156 pg_dumpall.c:671 #, c-format -msgid "" -" --no-synchronized-snapshots do not use synchronized snapshots in parallel " -"jobs\n" -msgstr "" -" --no-synchronized-snapshots 병렬 작업ì—서 스냅샷 ì¼ê´€ì„±ì„ 맞추지 않ìŒ\n" +msgid " --no-table-access-method do not dump table access methods\n" +msgstr " --no-table-access-method í…Œì´ë¸” ì ‘ê·¼ ë°©ë²•ì€ ë¤í”„하지 않ìŒ\n" -#: pg_dump.c:1041 pg_dumpall.c:652 +#: pg_dump.c:1157 pg_dumpall.c:672 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces í…Œì´ë¸”스페ì´ìФ í• ë‹¹ì„ ë¤í”„하지 않ìŒ\n" -#: pg_dump.c:1042 pg_dumpall.c:653 +#: pg_dump.c:1158 pg_dumpall.c:673 +#, c-format +msgid " --no-toast-compression do not dump TOAST compression methods\n" +msgstr " --no-toast-compression TOAST ì••ì¶• ë°©ë²•ì€ ë¤í”„하지 않ìŒ\n" + +#: pg_dump.c:1159 pg_dumpall.c:674 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data 언로그드 í…Œì´ë¸” ìžë£ŒëŠ” ë¤í”„하지 않ìŒ\n" -#: pg_dump.c:1043 pg_dumpall.c:654 +#: pg_dump.c:1160 pg_dumpall.c:675 #, c-format msgid "" " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT " @@ -1668,14 +1949,14 @@ msgstr "" " --on-conflict-do-nothing INSERT êµ¬ë¬¸ì— ON CONFLICT DO NOTHING 옵션 ì¶”" "ê°€\n" -#: pg_dump.c:1044 pg_dumpall.c:655 +#: pg_dump.c:1161 pg_dumpall.c:676 #, c-format msgid "" " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr "" " --quote-all-identifiers 예약어가 ì•„ë‹ˆì—¬ë„ ëª¨ë“  ì‹ë³„ìžëŠ” 따옴표를 씀\n" -#: pg_dump.c:1045 pg_dumpall.c:656 +#: pg_dump.c:1162 pg_dumpall.c:677 #, c-format msgid "" " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" @@ -1683,7 +1964,7 @@ msgstr "" " --rows-per-insert=NROWS 한 INSERT 명령으로 입력할 로우 수; --inserts\n" " ì˜µì…˜ì„ ì‚¬ìš©í•œ 것으로 가정 함\n" -#: pg_dump.c:1046 +#: pg_dump.c:1163 #, c-format msgid "" " --section=SECTION dump named section (pre-data, data, or post-" @@ -1691,7 +1972,7 @@ msgid "" msgstr "" " --section=SECTION 해당 섹션(pre-data, data, post-data)ë§Œ ë¤í”„\n" -#: pg_dump.c:1047 +#: pg_dump.c:1164 #, c-format msgid "" " --serializable-deferrable wait until the dump can run without " @@ -1700,12 +1981,12 @@ msgstr "" " --serializable-deferrable ìžë£Œ ì •í•©ì„±ì„ ë³´ìž¥í•˜ê¸° 위해 ë¤í”„ 작업ì„\n" " ì§ë ¬í™” 가능한 트랜잭션으로 처리 함\n" -#: pg_dump.c:1048 +#: pg_dump.c:1165 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT 지정한 ìŠ¤ëƒ…ìƒ·ì„ ë¤í”„ 함\n" -#: pg_dump.c:1049 pg_restore.c:504 +#: pg_dump.c:1166 pg_restore.c:497 #, c-format msgid "" " --strict-names require table and/or schema include patterns " @@ -1716,7 +1997,16 @@ msgstr "" "는\n" " ê°ì²´ê°€ ì ì–´ë„ 하나 ì´ìƒ 있어야 함\n" -#: pg_dump.c:1051 pg_dumpall.c:657 pg_restore.c:506 +#: pg_dump.c:1168 +#, c-format +msgid "" +" --table-and-children=PATTERN dump only the specified table(s), including\n" +" child and partition tables\n" +msgstr "" +" --table-and-children=PATTERN 해당 íŒ¨í„´ì˜ ìƒì† 하위, 파티션 하위 í…Œì´ë¸”ë§Œ\n" +" ë¤í”„\n" + +#: pg_dump.c:1170 pg_dumpall.c:678 pg_restore.c:500 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1729,7 +2019,7 @@ msgstr "" "명령\n" " 대신 사용하여 소유권 설정\n" -#: pg_dump.c:1055 pg_dumpall.c:661 pg_restore.c:510 +#: pg_dump.c:1174 pg_dumpall.c:682 pg_restore.c:504 #, c-format msgid "" "\n" @@ -1738,45 +2028,45 @@ msgstr "" "\n" "ì—°ê²° 옵션들:\n" -#: pg_dump.c:1056 +#: pg_dump.c:1175 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAME ë¤í”„í•  ë°ì´í„°ë² ì´ìФ\n" -#: pg_dump.c:1057 pg_dumpall.c:663 pg_restore.c:511 +#: pg_dump.c:1176 pg_dumpall.c:684 pg_restore.c:505 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HOSTNAME ì ‘ì†í•  ë°ì´í„°ë² ì´ìФ 서버 ë˜ëŠ” 소켓 디렉터리\n" -#: pg_dump.c:1058 pg_dumpall.c:665 pg_restore.c:512 +#: pg_dump.c:1177 pg_dumpall.c:686 pg_restore.c:506 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT ë°ì´í„°ë² ì´ìФ ì„œë²„ì˜ í¬íЏ 번호\n" -#: pg_dump.c:1059 pg_dumpall.c:666 pg_restore.c:513 +#: pg_dump.c:1178 pg_dumpall.c:687 pg_restore.c:507 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAME ì—°ê²°í•  ë°ì´í„°ë² ì´ìФ 사용ìž\n" -#: pg_dump.c:1060 pg_dumpall.c:667 pg_restore.c:514 +#: pg_dump.c:1179 pg_dumpall.c:688 pg_restore.c:508 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n" -#: pg_dump.c:1061 pg_dumpall.c:668 pg_restore.c:515 +#: pg_dump.c:1180 pg_dumpall.c:689 pg_restore.c:509 #, c-format msgid "" " -W, --password force password prompt (should happen " "automatically)\n" msgstr " -W, --password 암호 ìž…ë ¥ 프롬프트 ë³´ìž„(ìžë™ìœ¼ë¡œ 처리함)\n" -#: pg_dump.c:1062 pg_dumpall.c:669 +#: pg_dump.c:1181 pg_dumpall.c:690 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLENAME ë¤í”„ ì „ì— SET ROLE 수행\n" -#: pg_dump.c:1064 +#: pg_dump.c:1183 #, c-format msgid "" "\n" @@ -1789,459 +2079,430 @@ msgstr "" "사용합니다.\n" "\n" -#: pg_dump.c:1066 pg_dumpall.c:673 pg_restore.c:522 +#: pg_dump.c:1185 pg_dumpall.c:694 pg_restore.c:516 #, c-format msgid "Report bugs to <%s>.\n" msgstr "ë¬¸ì œì  ë³´ê³  주소 <%s>\n" -#: pg_dump.c:1067 pg_dumpall.c:674 pg_restore.c:523 +#: pg_dump.c:1186 pg_dumpall.c:695 pg_restore.c:517 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페ì´ì§€: <%s>\n" -#: pg_dump.c:1086 pg_dumpall.c:499 +#: pg_dump.c:1205 pg_dumpall.c:518 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "í´ë¼ì´ì–¸íЏ ì¸ì½”딩 ê°’ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤: \"%s\"" -#: pg_dump.c:1232 +#: pg_dump.c:1352 #, c-format msgid "" -"Synchronized snapshots on standby servers are not supported by this server " -"version.\n" -"Run with --no-synchronized-snapshots instead if you do not need\n" -"synchronized snapshots." -msgstr "" -"ì´ ì„œë²„ 버전ì—서는 대기 서버ì—서 ë™ê¸°í™”ëœ ìŠ¤ëƒ…ìƒ· ê¸°ëŠ¥ì„ ì‚¬ìš©í•  수 ì—†ìŒ.\n" -"ë™ê¸°í™”ëœ ìŠ¤ëƒ…ìƒ· ê¸°ëŠ¥ì´ í•„ìš” 없다면, --no-synchronized-snapshots\n" -"ì˜µì…˜ì„ ì§€ì •í•´ì„œ ë¤í”„í•  수 있습니다." +"parallel dumps from standby servers are not supported by this server version" +msgstr "대기 서버ì—서 병렬 ë¤í”„는 ì´ ì„œë²„ 버전ì—서 ì§€ì›í•˜ì§€ 않ìŒ" -#: pg_dump.c:1301 +#: pg_dump.c:1417 #, c-format msgid "invalid output format \"%s\" specified" msgstr "\"%s\" ê°’ì€ ìž˜ëª»ëœ ì¶œë ¥ íŒŒì¼ í˜•íƒœìž…ë‹ˆë‹¤." -#: pg_dump.c:1339 +#: pg_dump.c:1458 pg_dump.c:1514 pg_dump.c:1567 pg_dumpall.c:1467 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "ì ë‹¹í•˜ì§€ ì•Šì€ qualified ì´ë¦„ 입니다 (너무 ë§Žì€ ì ì´ 있네요): %s" + +#: pg_dump.c:1466 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "\"%s\" 검색 ì¡°ê±´ì— ë§Œì¡±í•˜ëŠ” 스키마가 없습니다" -#: pg_dump.c:1386 +#: pg_dump.c:1519 +#, c-format +msgid "no matching extensions were found for pattern \"%s\"" +msgstr "\"%s\" 검색 ì¡°ê±´ì— ë§Œì¡±í•˜ëŠ” 확장 ëª¨ë“ˆì´ ì—†ìŠµë‹ˆë‹¤" + +#: pg_dump.c:1572 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "\"%s\" 검색 ì¡°ê±´ì— ë§Œì¡±í•˜ëŠ” 외부 서버가 없습니다" -#: pg_dump.c:1449 +#: pg_dump.c:1643 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "" +"ì ë‹¹í•˜ì§€ ì•Šì€ ë¦´ë ˆì´ì…˜(relation) ì´ë¦„ 입니다 (너무 ë§Žì€ ì ì´ 있네요): %s" + +#: pg_dump.c:1665 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "\"%s\" 검색 ì¡°ê±´ì— ë§Œì¡±í•˜ëŠ” í…Œì´ë¸”ì´ ì—†ìŠµë‹ˆë‹¤" -#: pg_dump.c:1862 +#: pg_dump.c:1692 +#, c-format +msgid "You are currently not connected to a database." +msgstr "현재 ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°ë˜ì–´ìžˆì§€ 않습니다." + +#: pg_dump.c:1695 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "서로 다른 ë°ì´í„°ë² ì´ìŠ¤ê°„ì˜ ì°¸ì¡°ëŠ” 구현ë˜ì–´ìžˆì§€ 않습니다: %s" + +#: pg_dump.c:2154 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "\"%s.%s\" í…Œì´ë¸”ì˜ ë‚´ìš© ë¤í”„ 중" -#: pg_dump.c:1969 +#: pg_dump.c:2264 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "\"%s\" í…Œì´ë¸” ë‚´ìš©ì„ ë¤í”„하면서 오류 ë°œìƒ: PQgetCopyData() 실패." -#: pg_dump.c:1970 pg_dump.c:1980 +#: pg_dump.c:2265 pg_dump.c:2275 #, c-format msgid "Error message from server: %s" msgstr "서버ì—서 보낸 오류 메시지: %s" -#: pg_dump.c:1971 pg_dump.c:1981 +#: pg_dump.c:2266 pg_dump.c:2276 #, c-format -msgid "The command was: %s" +msgid "Command was: %s" msgstr "ì‚¬ìš©ëœ ëª…ë ¹: %s" -#: pg_dump.c:1979 +#: pg_dump.c:2274 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "\"%s\" í…Œì´ë¸” ë‚´ìš©ì„ ë¤í”„하면서 오류 ë°œìƒ: PQgetResult() 실패." -#: pg_dump.c:2735 +#: pg_dump.c:2365 +#, c-format +msgid "wrong number of fields retrieved from table \"%s\"" +msgstr "\"%s\" í…Œì´ë¸”ì—서 ìž˜ëª»ëœ í•„ë“œ 수" + +#: pg_dump.c:3067 #, c-format msgid "saving database definition" msgstr "ë°ì´í„°ë² ì´ìФ 구성정보를 저장 중" -#: pg_dump.c:3207 +#: pg_dump.c:3176 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "알 수 없는 ë¡œì¼€ì¼ ì œê³µìž ì´ë¦„: %s" + +#: pg_dump.c:3537 #, c-format msgid "saving encoding = %s" msgstr "ì¸ì½”딩 = %s 저장 중" -#: pg_dump.c:3232 +#: pg_dump.c:3562 #, c-format -msgid "saving standard_conforming_strings = %s" -msgstr "standard_conforming_strings = %s 저장 중" +msgid "saving \"standard_conforming_strings = %s\"" +msgstr "\"standard_conforming_strings = %s\" 저장 중" -#: pg_dump.c:3271 +#: pg_dump.c:3601 #, c-format msgid "could not parse result of current_schemas()" msgstr "current_schemas() 결과를 ë¶„ì„í•  수 ì—†ìŒ" -#: pg_dump.c:3290 +#: pg_dump.c:3620 #, c-format -msgid "saving search_path = %s" -msgstr "search_path = %s 저장 중" +msgid "saving \"search_path = %s\"" +msgstr "\"search_path = %s\" 저장 중" -#: pg_dump.c:3330 +#: pg_dump.c:3656 #, c-format msgid "reading large objects" msgstr "large object ì½ëŠ” 중" -#: pg_dump.c:3512 +#: pg_dump.c:3877 #, c-format -msgid "saving large objects" -msgstr "large objectë“¤ì„ ì €ìž¥ 중" +msgid "saving large objects \"%s\"" +msgstr "\"%s\" large objectë“¤ì„ ì €ìž¥ 중" -#: pg_dump.c:3558 +#: pg_dump.c:3898 #, c-format msgid "error reading large object %u: %s" msgstr "%u large object ì½ëŠ” 중 오류: %s" -#: pg_dump.c:3610 +#: pg_dump.c:4001 #, c-format -msgid "reading row security enabled for table \"%s.%s\"" -msgstr "\"%s.%s\" í…Œì´ë¸”ì„ ìœ„í•œ 로우 보안 활성화를 ì½ëŠ” 중" +msgid "reading row-level security policies" +msgstr "로우 단위 보안 ì •ì±… ì½ëŠ” 중" -#: pg_dump.c:3641 -#, c-format -msgid "reading policies for table \"%s.%s\"" -msgstr "\"%s.%s\" í…Œì´ë¸”ì„ ìœ„í•œ ì •ì±… ì½ëŠ” 중" - -#: pg_dump.c:3793 +#: pg_dump.c:4142 #, c-format msgid "unexpected policy command type: %c" msgstr "예ìƒì¹˜ 못한 ì •ì±… 명령 형태: %c" -#: pg_dump.c:3944 +#: pg_dump.c:4592 pg_dump.c:5150 pg_dump.c:12364 pg_dump.c:18249 +#: pg_dump.c:18251 pg_dump.c:18873 #, c-format -msgid "owner of publication \"%s\" appears to be invalid" -msgstr "\"%s\" 구ë…ì˜ ì†Œìœ ì£¼ê°€ ì ë‹¹í•˜ì§€ 않습니다." +msgid "could not parse %s array" +msgstr "%s ë°°ì—´ì„ ë¶„ì„í•  수 ì—†ìŒ" -#: pg_dump.c:4089 -#, c-format -msgid "reading publication membership for table \"%s.%s\"" -msgstr "\"%s.%s\" í…Œì´ë¸”ì„ ìœ„í•œ 발행 ë§µë²„ì‰½ì„ ì½ëŠ” 중" - -#: pg_dump.c:4232 +#: pg_dump.c:4806 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "" "현재 사용ìžê°€ 슈í¼ìœ ì €ê°€ 아니기 ë•Œë¬¸ì— ì„œë¸ŒìŠ¤í¬ë¦½ì…˜ë“¤ì€ ë¤í”„하지 못했ìŒ" -#: pg_dump.c:4286 +#: pg_dump.c:5012 #, c-format -msgid "owner of subscription \"%s\" appears to be invalid" -msgstr "\"%s\" 구ë…ì˜ ì†Œìœ ì£¼ê°€ ì ë‹¹í•˜ì§€ 않습니다." +msgid "subscription with OID %u does not exist" +msgstr "%u OID 구ë…ì´ ì—†ìŒ" -#: pg_dump.c:4330 +#: pg_dump.c:5019 #, c-format -msgid "could not parse subpublications array" -msgstr "êµ¬ë… ë°°ì—´ì„ ë¶„ì„í•  수 ì—†ìŒ" +msgid "failed sanity check, table with OID %u not found" +msgstr "안전 검사 실패, OID %uì¸ í…Œì´ë¸” ì—†ìŒ" -#: pg_dump.c:4652 +#: pg_dump.c:5582 #, c-format msgid "could not find parent extension for %s %s" msgstr "%s %s ê°ì²´ì™€ ê´€ë ¨ëœ ìƒìœ„ 확장 ê¸°ëŠ¥ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_dump.c:4784 -#, c-format -msgid "owner of schema \"%s\" appears to be invalid" -msgstr "\"%s\" ìŠ¤í‚¤ë§ˆì˜ ì†Œìœ ì£¼ê°€ 바르지 않습니다" - -#: pg_dump.c:4807 +#: pg_dump.c:5727 #, c-format msgid "schema with OID %u does not exist" msgstr "OID %u 스키마 ì—†ìŒ" -#: pg_dump.c:5132 -#, c-format -msgid "owner of data type \"%s\" appears to be invalid" -msgstr "\"%s\" ìžë£Œí˜•ì˜ ì†Œìœ ì£¼ê°€ ì ë‹¹í•˜ì§€ 않습니다." - -#: pg_dump.c:5217 -#, c-format -msgid "owner of operator \"%s\" appears to be invalid" -msgstr "\"%s\" ì—°ì‚°ìžì˜ 소유주가 ì ë‹¹í•˜ì§€ 않습니다." - -#: pg_dump.c:5519 -#, c-format -msgid "owner of operator class \"%s\" appears to be invalid" -msgstr "\"%s\" ì—°ì‚°ìž í´ëž˜ìŠ¤ì˜ ì†Œìœ ì£¼ê°€ ì ë‹¹í•˜ì§€ 않습니다." - -#: pg_dump.c:5603 -#, c-format -msgid "owner of operator family \"%s\" appears to be invalid" -msgstr "\"%s\" ì—°ì‚°ìž ë¶€ë¥˜ì˜ ì†Œìœ ì£¼ê°€ ì ë‹¹í•˜ì§€ 않습니다." - -#: pg_dump.c:5772 -#, c-format -msgid "owner of aggregate function \"%s\" appears to be invalid" -msgstr "\"%s\" 집계 í•¨ìˆ˜ì˜ ì†Œìœ ì£¼ê°€ ì ë‹¹í•˜ì§€ 않습니다." - -#: pg_dump.c:6032 -#, c-format -msgid "owner of function \"%s\" appears to be invalid" -msgstr "\"%s\" í•¨ìˆ˜ì˜ ì†Œìœ ì£¼ê°€ ì ë‹¹í•˜ì§€ 않습니다." - -#: pg_dump.c:6860 -#, c-format -msgid "owner of table \"%s\" appears to be invalid" -msgstr "\"%s\" í…Œì´ë¸”ì˜ ì†Œìœ ì£¼ê°€ ì ë‹¹í•˜ì§€ 않습니다." - -#: pg_dump.c:6902 pg_dump.c:17380 +#: pg_dump.c:7209 pg_dump.c:17620 #, c-format msgid "" "failed sanity check, parent table with OID %u of sequence with OID %u not " "found" msgstr "ì˜ì¡´ì„± 검사 실패, 부모 í…Œì´ë¸” OID %u ì—†ìŒ. 해당 시퀀스 개체 OID %u" -#: pg_dump.c:7044 +#: pg_dump.c:7354 #, c-format -msgid "reading indexes for table \"%s.%s\"" -msgstr "\"%s.%s\" í…Œì´ë¸”ì—서 사용하는 ì¸ë±ìŠ¤ë“¤ì„ ì½ëŠ” 중" +msgid "" +"failed sanity check, table OID %u appearing in pg_partitioned_table not found" +msgstr "완전성 검사 실패, OID %uì¸ ê°ì²´ê°€ pg_partitioned_tableì— ì—†ìŒ" -#: pg_dump.c:7459 +#: pg_dump.c:7585 pg_dump.c:7859 pg_dump.c:8306 pg_dump.c:8920 pg_dump.c:9042 +#: pg_dump.c:9190 #, c-format -msgid "reading foreign key constraints for table \"%s.%s\"" -msgstr "\"%s.%s\" í…Œì´ë¸”ì—서 사용하는 참조키 ì œì•½ì¡°ê±´ì„ ì½ëŠ” 중" +msgid "unrecognized table OID %u" +msgstr "알 수 없는 í…Œì´ë¸” OID %u" -#: pg_dump.c:7740 +#: pg_dump.c:7589 +#, c-format +msgid "unexpected index data for table \"%s\"" +msgstr "\"%s\" í…Œì´ë¸”ì˜ ì¸ë±ìФ ìžë£Œë¥¼ 알 수 ì—†ìŒ" + +#: pg_dump.c:8091 #, c-format msgid "" "failed sanity check, parent table with OID %u of pg_rewrite entry with OID " "%u not found" msgstr "ì˜ì¡´ì„± 검사 실패, 부모 í…Œì´ë¸” OID %u ì—†ìŒ. 해당 pg_rewrite 개체 OID %u" -#: pg_dump.c:7823 -#, c-format -msgid "reading triggers for table \"%s.%s\"" -msgstr "\"%s.%s\" í…Œì´ë¸”ì—서 사용하는 íŠ¸ë¦¬ê±°ë“¤ì„ ì½ëŠ” 중" - -#: pg_dump.c:7956 +#: pg_dump.c:8924 #, c-format -msgid "" -"query produced null referenced table name for foreign key trigger \"%s\" on " -"table \"%s\" (OID of table: %u)" -msgstr "" -"쿼리가 참조테ì´ë¸” ì •ë³´ê°€ 없는 \"%s\" 참조키 트리거를 \"%s\" (해당 OID: %u) í…Œ" -"ì´ë¸”ì—서 만들었습니다." +msgid "unexpected column data for table \"%s\"" +msgstr "\"%s\" í…Œì´ë¸”ì˜ ì•Œ 수 없는 칼럼 ìžë£Œ" -#: pg_dump.c:8511 -#, c-format -msgid "finding the columns and types of table \"%s.%s\"" -msgstr "\"%s.%s\" í…Œì´ë¸”ì˜ ì¹¼ëŸ¼ê³¼ ìžë£Œí˜•ì„ ì°¾ëŠ” 중" - -#: pg_dump.c:8647 +#: pg_dump.c:8953 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "\"%s\" í…Œì´ë¸”ì— ë§¤ê²¨ì ¸ 있는 ì—´ 번호가 잘못ë˜ì—ˆìŠµë‹ˆë‹¤" -#: pg_dump.c:8684 +#: pg_dump.c:9004 #, c-format -msgid "finding default expressions of table \"%s.%s\"" -msgstr "\"%s.%s\" í…Œì´ë¸”ì—서 default 표현들 찾는 중" +msgid "finding table default expressions" +msgstr "default í‘œí˜„ì‹ ì°¾ëŠ” 중" -#: pg_dump.c:8706 +#: pg_dump.c:9046 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "ì ë‹¹í•˜ì§€ 않는 adnum ê°’: %d, 해당 í…Œì´ë¸” \"%s\"" -#: pg_dump.c:8771 +#: pg_dump.c:9140 #, c-format -msgid "finding check constraints for table \"%s.%s\"" -msgstr "\"%s.%s\" í…Œì´ë¸”ì—서 사용하는 ì²´í¬ ì œì•½ ì¡°ê±´ì„ ì°¾ëŠ” 중" +msgid "finding table check constraints" +msgstr "í…Œì´ë¸” ì²´í¬ ì œì•½ì¡°ê±´ 찾는 중" -#: pg_dump.c:8820 +#: pg_dump.c:9194 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "" "%dê°œì˜ ì œì•½ ì¡°ê±´ì´ \"%s\" í…Œì´ë¸”ì— ìžˆì„ ê²ƒìœ¼ë¡œ 예ìƒí–ˆìœ¼ë‚˜ %d개를 ì°¾ìŒ" -#: pg_dump.c:8824 -#, c-format -msgid "(The system catalogs might be corrupted.)" -msgstr "(시스템 카탈로그가 ì†ìƒë˜ì—ˆëŠ” 것 같습니다)" - -#: pg_dump.c:10410 -#, c-format -msgid "typtype of data type \"%s\" appears to be invalid" -msgstr "\"%s\" ìžë£Œí˜•ì˜ typtypeê°€ 잘못 ë˜ì–´ 있ìŒ" - -#: pg_dump.c:11764 +#: pg_dump.c:9198 #, c-format -msgid "bogus value in proargmodes array" -msgstr "proargmodes ë°°ì—´ì— ìž˜ëª»ëœ ê°’ì´ ìžˆìŒ" +msgid "The system catalogs might be corrupted." +msgstr "시스템 카탈로그가 ì†ìƒë˜ì—ˆëŠ” 것 같습니다." -#: pg_dump.c:12136 +#: pg_dump.c:9888 #, c-format -msgid "could not parse proallargtypes array" -msgstr "proallargtypes ë°°ì—´ì„ ë¶„ì„í•  수 없습니다" +msgid "role with OID %u does not exist" +msgstr "%u OID ë¡¤ì´ ì—†ìŒ" -#: pg_dump.c:12152 +#: pg_dump.c:10000 pg_dump.c:10029 #, c-format -msgid "could not parse proargmodes array" -msgstr "proargmodes ë°°ì—´ì„ ë¶„ì„í•  수 없습니다" +msgid "unsupported pg_init_privs entry: %u %u %d" +msgstr "ì§€ì›í•˜ì§€ 않는 pg_init_privs 항목: %u %u %d" -#: pg_dump.c:12166 +#: pg_dump.c:10576 #, c-format -msgid "could not parse proargnames array" -msgstr "proargnames ë°°ì—´ì„ ë¶„ì„í•  수 없습니다" +msgid "missing metadata for large objects \"%s\"" +msgstr "\"%s\"large objectì˜ ë©”íƒ€ì •ë³´ê°€ ì—†ìŒ" -#: pg_dump.c:12177 +#: pg_dump.c:10859 #, c-format -msgid "could not parse proconfig array" -msgstr "proconfig ë°°ì—´ì„ êµ¬ë¬¸ ë¶„ì„í•  수 ì—†ìŒ" +msgid "typtype of data type \"%s\" appears to be invalid" +msgstr "\"%s\" ìžë£Œí˜•ì˜ typtypeê°€ 잘못 ë˜ì–´ 있ìŒ" -#: pg_dump.c:12257 +#: pg_dump.c:12433 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "\"%s\" í•¨ìˆ˜ì˜ provolatile ê°’ì´ ìž˜ëª» ë˜ì—ˆìŠµë‹ˆë‹¤" -#: pg_dump.c:12307 pg_dump.c:14365 +#: pg_dump.c:12483 pg_dump.c:14379 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "\"%s\" í•¨ìˆ˜ì˜ proparallel ê°’ì´ ìž˜ëª» ë˜ì—ˆìŠµë‹ˆë‹¤" -#: pg_dump.c:12446 pg_dump.c:12555 pg_dump.c:12562 +#: pg_dump.c:12613 pg_dump.c:12719 pg_dump.c:12726 #, c-format msgid "could not find function definition for function with OID %u" msgstr "%u OID í•¨ìˆ˜ì— ëŒ€í•œ 함수 ì •ì˜ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_dump.c:12485 +#: pg_dump.c:12652 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "pg_cast.castfunc ë˜ëŠ” pg_cast.castmethod í•„ë“œì— ìž˜ëª»ëœ ê°’ì´ ìžˆìŒ" -#: pg_dump.c:12488 +#: pg_dump.c:12655 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "pg_cast.castmethod í•„ë“œì— ìž˜ëª»ëœ ê°’ì´ ìžˆìŒ" -#: pg_dump.c:12581 +#: pg_dump.c:12745 #, c-format msgid "" "bogus transform definition, at least one of trffromsql and trftosql should " "be nonzero" msgstr "ìž˜ëª»ëœ ì „ì†¡ ì •ì˜, trffromsql ë˜ëŠ” trftosql 중 하나는 비어 있으면 안ë¨" -#: pg_dump.c:12598 +#: pg_dump.c:12762 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "pg_transform.trffromsql í•„ë“œì— ìž˜ëª»ëœ ê°’ì´ ìžˆìŒ" -#: pg_dump.c:12619 +#: pg_dump.c:12783 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "pg_transform.trftosql í•„ë“œì— ìž˜ëª»ëœ ê°’ì´ ìžˆìŒ" -#: pg_dump.c:12935 +#: pg_dump.c:12928 +#, c-format +msgid "postfix operators are not supported anymore (operator \"%s\")" +msgstr "postfix ì—°ì‚°ìžëŠ” ë”ì´ìƒ ì§€ì›í•˜ì§€ 않습니다.(\"%s\" ì—°ì‚°ìž)" + +#: pg_dump.c:13098 #, c-format msgid "could not find operator with OID %s" msgstr "%s OIDì˜ ì—°ì‚°ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_dump.c:13003 +#: pg_dump.c:13166 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "\"%c\" ìž˜ëª»ëœ ìžë£Œí˜•, 해당 ì ‘ê·¼ 방법: \"%s\"" -#: pg_dump.c:13757 +#: pg_dump.c:13840 pg_dump.c:13908 #, c-format msgid "unrecognized collation provider: %s" msgstr "알 수 없는 정렬규칙 ì œê³µìž ì´ë¦„: %s" -#: pg_dump.c:14229 +#: pg_dump.c:13849 pg_dump.c:13856 pg_dump.c:13867 pg_dump.c:13877 +#: pg_dump.c:13892 #, c-format -msgid "" -"aggregate function %s could not be dumped correctly for this database " -"version; ignored" -msgstr "" -"%s 집계 함수는 ì´ ë°ì´í„°ë² ì´ìФ 버전ì—서는 바르게 ë¤í”„ë˜ì§ˆ 못했습니다; 무시함" +msgid "invalid collation \"%s\"" +msgstr "ìž˜ëª»ëœ ë¬¸ìžì •렬규칙 \"%s\"" -#: pg_dump.c:14284 +#: pg_dump.c:14298 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "\"%s\" 집계 함수용 aggfinalmodify ê°’ì´ ì´ìƒí•¨" -#: pg_dump.c:14340 +#: pg_dump.c:14354 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "\"%s\" 집계 함수용 aggmfinalmodify ê°’ì´ ì´ìƒí•¨" -#: pg_dump.c:15062 +#: pg_dump.c:15071 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "기본 ì ‘ê·¼ 권한ì—서 알 수 없는 ê°ì²´í˜•ì´ ìžˆìŒ: %d" -#: pg_dump.c:15080 +#: pg_dump.c:15087 #, c-format msgid "could not parse default ACL list (%s)" msgstr "기본 ACL ëª©ë¡ (%s)ì„ ë¶„ì„í•  수 ì—†ìŒ" -#: pg_dump.c:15165 +#: pg_dump.c:15171 #, c-format msgid "" -"could not parse initial GRANT ACL list (%s) or initial REVOKE ACL list (%s) " -"for object \"%s\" (%s)" +"could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "" -"GRANT ACL ëª©ë¡ ì´ˆê¸°ê°’ (%s) ë˜ëŠ” REVOKE ACL ëª©ë¡ ì´ˆê¸°ê°’ (%s) ë¶„ì„í•  수 ì—†ìŒ, " -"해당 ê°ì²´: \"%s\" (%s)" +"초기 ACL ëª©ë¡ (%s) ë˜ëŠ” default (%s) ë¶„ì„í•  수 ì—†ìŒ, 해당 ê°ì²´: \"%s\" (%s)" -#: pg_dump.c:15173 +#: pg_dump.c:15196 #, c-format -msgid "" -"could not parse GRANT ACL list (%s) or REVOKE ACL list (%s) for object \"%s" -"\" (%s)" -msgstr "" -"GRANT ACL ëª©ë¡ (%s) ë˜ëŠ” REVOKE ACL ëª©ë¡ (%s) ë¶„ì„í•  수 ì—†ìŒ, 해당 ê°ì²´: \"%s" -"\" (%s)" +msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" +msgstr "ACL ëª©ë¡ (%s) ë˜ëŠ” default (%s) ë¶„ì„í•  수 ì—†ìŒ, 해당 ê°ì²´: \"%s\" (%s)" -#: pg_dump.c:15688 +#: pg_dump.c:15739 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "\"%s\" ë·° ì •ì˜ ì •ë³´ê°€ 없습니다." -#: pg_dump.c:15691 +#: pg_dump.c:15742 #, c-format msgid "" "query to obtain definition of view \"%s\" returned more than one definition" msgstr "\"%s\" ë·° ì •ì˜ ì •ë³´ê°€ 하나 ì´ìƒ 있습니다." -#: pg_dump.c:15698 +#: pg_dump.c:15749 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "\"%s\" ë·°ì˜ ì •ì˜ ë‚´ìš©ì´ ë¹„ì–´ìžˆìŠµë‹ˆë‹¤." -#: pg_dump.c:15780 +#: pg_dump.c:15834 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS ì˜µì…˜ì€ ë”ì´ìƒ ì§€ì›í•˜ì§€ ì•ŠìŒ (\"%s\" í…Œì´ë¸”)" -#: pg_dump.c:16260 -#, c-format -msgid "invalid number of parents %d for table \"%s\"" -msgstr "ìž˜ëª»ëœ ë¶€ëª¨ 수: %d, 해당 í…Œì´ë¸” \"%s\"" - -#: pg_dump.c:16583 +#: pg_dump.c:16821 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "ìž˜ëª»ëœ ì—´ 번호 %d, 해당 í…Œì´ë¸” \"%s\"" -#: pg_dump.c:16868 +#: pg_dump.c:16899 +#, c-format +msgid "could not parse index statistic columns" +msgstr "ì¸ë±ìФ 통계정보 칼럼 ë¶„ì„ ì‹¤íŒ¨" + +#: pg_dump.c:16901 +#, c-format +msgid "could not parse index statistic values" +msgstr "ì¸ë±ìФ 통계정보 ê°’ ë¶„ì„ ì‹¤íŒ¨" + +#: pg_dump.c:16903 +#, c-format +msgid "mismatched number of columns and values for index statistics" +msgstr "ì¸ë±ìФ 통계정보용 칼럼수와 값수가 ì¼ì¹˜í•˜ì§€ 않ìŒ" + +#: pg_dump.c:17118 #, c-format msgid "missing index for constraint \"%s\"" msgstr "\"%s\" 제약 ì¡°ê±´ì„ ìœ„í•œ ì¸ë±ìŠ¤ê°€ 빠졌습니다" -#: pg_dump.c:17093 +#: pg_dump.c:17353 #, c-format msgid "unrecognized constraint type: %c" msgstr "알 수 없는 제약 ì¡°ê±´ 종류: %c" -#: pg_dump.c:17225 pg_dump.c:17445 +#: pg_dump.c:17454 pg_dump.c:17684 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "" @@ -2249,22 +2510,12 @@ msgid_plural "" msgstr[0] "" "\"%s\" ì‹œí€€ìŠ¤ì˜ ë°ì´í„°ë¥¼ 가져오기 위한 쿼리ì—서 %dê°œì˜ í–‰ 반환(1ê°œ í•„ìš”)" -#: pg_dump.c:17259 +#: pg_dump.c:17486 #, c-format msgid "unrecognized sequence type: %s" msgstr "알 수 없는 시퀀스 형태: %s" -#: pg_dump.c:17543 -#, c-format -msgid "unexpected tgtype value: %d" -msgstr "기대ë˜ì§€ ì•Šì€ tgtype ê°’: %d" - -#: pg_dump.c:17617 -#, c-format -msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" -msgstr "ìž˜ëª»ëœ ì¸ìˆ˜ 문ìžì—´ (%s), 해당 트리거 \"%s\", 사용ë˜ëŠ” í…Œì´ë¸” \"%s\"" - -#: pg_dump.c:17853 +#: pg_dump.c:18001 #, c-format msgid "" "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows " @@ -2272,58 +2523,59 @@ msgid "" msgstr "" "\"%s\" 규칙(\"%s\" í…Œì´ë¸”)ì„ ê°€ì ¸ì˜¤ê¸° 위한 쿼리 실패: ìž˜ëª»ëœ í–‰ 수 반환" -#: pg_dump.c:18015 +#: pg_dump.c:18154 #, c-format msgid "could not find referenced extension %u" msgstr "%u 확장기능과 ê´€ë ¨ëœ ìƒìœ„ 확장 ê¸°ëŠ¥ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_dump.c:18229 +#: pg_dump.c:18253 +#, c-format +msgid "mismatched number of configurations and conditions for extension" +msgstr "확장 모듈용 환경설정 매개변수 수와 ì¡°ê±´ 수가 ì¼ì¹˜ 하지 않ìŒ" + +#: pg_dump.c:18385 #, c-format msgid "reading dependency data" msgstr "ì˜ì¡´ 관계 ìžë£Œ ì½ëŠ” 중" -#: pg_dump.c:18322 +#: pg_dump.c:18471 #, c-format msgid "no referencing object %u %u" msgstr "%u %u ê°œì²´ì˜ í•˜ìœ„ 관련 개체가 ì—†ìŒ" -#: pg_dump.c:18333 +#: pg_dump.c:18482 #, c-format msgid "no referenced object %u %u" msgstr "%u %u ê°œì²´ì˜ ìƒìœ„ 관련 개체가 ì—†ìŒ" -#: pg_dump.c:18706 +#: pg_dump.c:18907 pg_dump.c:18945 pg_dumpall.c:1962 pg_restore.c:551 +#: pg_restore.c:597 #, c-format -msgid "could not parse reloptions array" -msgstr "reloptions ë°°ì—´ì„ ë¶„ì„í•  수 ì—†ìŒ" +msgid "%s filter for \"%s\" is not allowed" +msgstr "%s í•„í„°(ëŒ€ìƒ \"%s\")는 허용하지 않ìŒ" -#: pg_dump_sort.c:360 +#: pg_dump_sort.c:424 #, c-format msgid "invalid dumpId %d" msgstr "ìž˜ëª»ëœ dumpId %d" -#: pg_dump_sort.c:366 +#: pg_dump_sort.c:430 #, c-format msgid "invalid dependency %d" msgstr "ìž˜ëª»ëœ ì˜ì¡´ì„± %d" -#: pg_dump_sort.c:599 +#: pg_dump_sort.c:594 #, c-format msgid "could not identify dependency loop" msgstr "ì˜ì¡´ 관계를 ì‹ë³„ í•  수 ì—†ìŒ" -#: pg_dump_sort.c:1170 +#: pg_dump_sort.c:1209 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "ë‹¤ìŒ ë°ì´ë¸” ê°„ 참조키가 서로 êµì°¨í•˜ê³  있ìŒ:" -#: pg_dump_sort.c:1174 pg_dump_sort.c:1194 -#, c-format -msgid " %s" -msgstr " %s" - -#: pg_dump_sort.c:1175 +#: pg_dump_sort.c:1214 #, c-format msgid "" "You might not be able to restore the dump without using --disable-triggers " @@ -2332,7 +2584,7 @@ msgstr "" "--disable-triggers 옵션으로 ë³µì›í•  수 있습니다. ë˜ëŠ” 임시로 제약 ì¡°ê±´ì„ ì‚­ì œ" "하고 ë³µì›í•˜ì„¸ìš”." -#: pg_dump_sort.c:1176 +#: pg_dump_sort.c:1215 #, c-format msgid "" "Consider using a full dump instead of a --data-only dump to avoid this " @@ -2340,67 +2592,60 @@ msgid "" msgstr "" "ì´ ë¬¸ì œë¥¼ 피하려면, --data-only ë¤í”„ ëŒ€ì‹ ì— ëª¨ë“  ë¤í”„를 사용하길 권합니다." -#: pg_dump_sort.c:1188 +#: pg_dump_sort.c:1227 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "ë‹¤ìŒ í•­ëª© ê°„ ì˜ì¡´ 관계를 ë¶„ì„í•  수 ì—†ìŒ:" -#: pg_dumpall.c:199 +#: pg_dumpall.c:231 #, c-format msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." +"program \"%s\" is needed by %s but was not found in the same directory as " +"\"%s\"" msgstr "" -"\"%s\" í”„ë¡œê·¸ëž¨ì´ %s 작업ì—서 필요로 하지만, \"%s\" 프로그램ì´\n" -"있는 ê°™ì€ ë””ë ‰í„°ë¦¬ì—서 ì°¾ì„ ìˆ˜ 없습니다.\n" -"설치 ìƒíƒœë¥¼ 살펴 보십시오." +"\"%s\" í”„ë¡œê·¸ëž¨ì´ %s 작업ì—서 필요로 하지만, \"%s\" 디렉터리 ì•ˆì— í•¨ê»˜ 있지 " +"않습니다" -#: pg_dumpall.c:204 +#: pg_dumpall.c:234 #, c-format -msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "" -"\"%s\" í”„ë¡œê·¸ëž¨ì´ \"%s\" 작업 ë•Œë¬¸ì— ì°¾ì•˜ì§€ë§Œ, \n" -"%s 버전과 같지 않습니다.\n" -"설치 ìƒíƒœë¥¼ 살펴 보십시오." +"\"%s\" í”„ë¡œê·¸ëž¨ì„ \"%s\" 작업 ë•Œë¬¸ì— ì°¾ì•˜ì§€ë§Œ, %s 버전과 같지 않습니다." -#: pg_dumpall.c:356 +#: pg_dumpall.c:387 #, c-format msgid "" -"option --exclude-database cannot be used together with -g/--globals-only, -" -"r/--roles-only, or -t/--tablespaces-only" +"option --exclude-database cannot be used together with -g/--globals-only, " +"-r/--roles-only, or -t/--tablespaces-only" msgstr "" "--exclude-database ì˜µì…˜ì€ -g/--globals-only, -r/--roles-only, ë˜ëŠ” -t/--" "tablespaces-only 옵션과 함께 쓸 수 ì—†ìŒ" -#: pg_dumpall.c:365 +#: pg_dumpall.c:395 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "-g/--globals-only 옵션과 -r/--roles-only ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" -#: pg_dumpall.c:373 +#: pg_dumpall.c:402 #, c-format msgid "" "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "" "-g/--globals-only 옵션과 -t/--tablespaces-only ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" -#: pg_dumpall.c:387 +#: pg_dumpall.c:412 #, c-format msgid "" "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "" "-r/--roles-only 옵션과 -t/--tablespaces-only ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" -#: pg_dumpall.c:448 pg_dumpall.c:1754 +#: pg_dumpall.c:474 pg_dumpall.c:1771 #, c-format msgid "could not connect to database \"%s\"" msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì†í•  수 ì—†ìŒ" -#: pg_dumpall.c:462 +#: pg_dumpall.c:486 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2409,7 +2654,7 @@ msgstr "" "\"postgres\" ë˜ëŠ” \"template1\" ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°í•  수 없습니다.\n" "다른 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 지정하십시오." -#: pg_dumpall.c:616 +#: pg_dumpall.c:634 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2419,35 +2664,35 @@ msgstr "" "추출하는 프로그램입니다.\n" "\n" -#: pg_dumpall.c:618 +#: pg_dumpall.c:636 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [옵션]...\n" -#: pg_dumpall.c:621 +#: pg_dumpall.c:639 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=파ì¼ì´ë¦„ 출력 íŒŒì¼ ì´ë¦„\n" -#: pg_dumpall.c:628 +#: pg_dumpall.c:646 #, c-format msgid "" " -c, --clean clean (drop) databases before recreating\n" msgstr "" " -c, --clean 다시 만들기 ì „ì— ë°ì´í„°ë² ì´ìФ 지우기(ì‚­ì œ)\n" -#: pg_dumpall.c:630 +#: pg_dumpall.c:648 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr "" " -g, --globals-only ë°ì´í„°ë² ì´ìŠ¤ëŠ” 제외하고 글로벌 개체만 ë¤í”„\n" -#: pg_dumpall.c:631 pg_restore.c:485 +#: pg_dumpall.c:649 pg_restore.c:475 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner 개체 소유권 ë³µì› ê±´ë„ˆë›°ê¸°\n" -#: pg_dumpall.c:632 +#: pg_dumpall.c:650 #, c-format msgid "" " -r, --roles-only dump only roles, no databases or tablespaces\n" @@ -2455,12 +2700,12 @@ msgstr "" " -r, --roles-only ë°ì´í„°ë² ì´ìŠ¤ë‚˜ í…Œì´ë¸”스페ì´ìŠ¤ëŠ” 제외하고 ì—­í• " "ë§Œ ë¤í”„\n" -#: pg_dumpall.c:634 +#: pg_dumpall.c:652 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr " -S, --superuser=NAME ë¤í”„ì— ì‚¬ìš©í•  슈í¼ìœ ì € ì‚¬ìš©ìž ì´ë¦„\n" -#: pg_dumpall.c:635 +#: pg_dumpall.c:653 #, c-format msgid "" " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" @@ -2468,29 +2713,36 @@ msgstr "" " -t, --tablespaces-only ë°ì´í„°ë² ì´ìŠ¤ë‚˜ ì—­í• ì€ ì œì™¸í•˜ê³  í…Œì´ë¸”스페ì´ìФ" "ë§Œ ë¤í”„\n" -#: pg_dumpall.c:641 +#: pg_dumpall.c:659 #, c-format msgid "" " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr "" " --exclude-database=PATTERN 해당 PATTERNì— ì¼ì¹˜í•˜ëŠ” ë°ì´í„°ë² ì´ìФ 제외\n" -#: pg_dumpall.c:648 +#: pg_dumpall.c:661 +#, c-format +msgid "" +" --filter=FILENAME exclude databases based on expressions in " +"FILENAME\n" +msgstr " --filter=FILENAME í•„í„° ì¡°ê±´ì´ ì •ì˜ íŒŒì¼ì„ 사용하여 ë¤í”„\n" + +#: pg_dumpall.c:667 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords 롤용 비밀번호를 ë¤í”„하지 않ìŒ\n" -#: pg_dumpall.c:662 +#: pg_dumpall.c:683 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=ì ‘ì†ë¬¸ìžì—´ 서버 ì ‘ì† ë¬¸ìžì—´\n" -#: pg_dumpall.c:664 +#: pg_dumpall.c:685 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAME 대체용 기본 ë°ì´í„°ë² ì´ìФ\n" -#: pg_dumpall.c:671 +#: pg_dumpall.c:692 #, c-format msgid "" "\n" @@ -2504,99 +2756,111 @@ msgstr "" "ì¶œë ¥ì— ì“°ì—¬ì§‘ë‹ˆë‹¤.\n" "\n" -#: pg_dumpall.c:877 +#: pg_dumpall.c:837 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "롤 ì´ë¦„ì´ \"pg_\"로 시작함, 무시함: (%s)" -#: pg_dumpall.c:1278 +#: pg_dumpall.c:1059 +#, c-format +msgid "could not find a legal dump ordering for memberships in role \"%s\"" +msgstr "\"%s\" ë¡¤ì€ ë¤í”„í•  수 있는 ë¡¤ì„ í¬í•¨í•˜ê³  있지 않습니다" + +#: pg_dumpall.c:1194 +#, c-format +msgid "could not parse ACL list (%s) for parameter \"%s\"" +msgstr "ACL ëª©ë¡ (%s)ì„ ë¶„ì„í•  수 ì—†ìŒ, 해당 매개변수 \"%s\"" + +#: pg_dumpall.c:1321 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "í…Œì´ë¸”스페ì´ìФ ìš© ACL ëª©ë¡ (%s)ì„ ë¶„ì„í•  수 ì—†ìŒ, 해당개체 \"%s\"" -#: pg_dumpall.c:1495 +#: pg_dumpall.c:1528 #, c-format msgid "excluding database \"%s\"" msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 제외하는 중" -#: pg_dumpall.c:1499 +#: pg_dumpall.c:1532 #, c-format msgid "dumping database \"%s\"" msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ ë¤í”„ 중" -#: pg_dumpall.c:1531 +#: pg_dumpall.c:1563 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "\"%s\" ë°ì´í„°ë² ì´ìФì—서 pg_dump 작업 ì¤‘ì— ì˜¤ë¥˜ê°€ ë°œìƒ, ë냅니다." -#: pg_dumpall.c:1540 +#: pg_dumpall.c:1569 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "\"%s\" 출력 파ì¼ì„ 다시 ì—´ 수 ì—†ìŒ: %m" -#: pg_dumpall.c:1584 +#: pg_dumpall.c:1613 #, c-format msgid "running \"%s\"" msgstr "\"%s\" ê°€ë™ì¤‘" -#: pg_dumpall.c:1775 -#, c-format -msgid "could not connect to database \"%s\": %s" -msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì†í•  수 ì—†ìŒ: %s" - -#: pg_dumpall.c:1805 +#: pg_dumpall.c:1814 #, c-format msgid "could not get server version" msgstr "서버 ë²„ì „ì„ ì•Œ 수 ì—†ìŒ" -#: pg_dumpall.c:1811 +#: pg_dumpall.c:1817 #, c-format msgid "could not parse server version \"%s\"" msgstr "\"%s\" 서버 ë²„ì „ì„ ë¶„ì„í•  수 ì—†ìŒ" -#: pg_dumpall.c:1883 pg_dumpall.c:1906 +#: pg_dumpall.c:1887 pg_dumpall.c:1910 #, c-format msgid "executing %s" msgstr "실행중: %s" -#: pg_restore.c:308 +#: pg_dumpall.c:1982 +msgid "unsupported filter object" +msgstr "ì§€ì›í•˜ì§€ 않는 í•„í„° ê°ì²´" + +#: pg_restore.c:329 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "-d/--dbname 옵션 ë˜ëŠ” -f/--file 옵션 중 하나를 지정해야 함" -#: pg_restore.c:317 +#: pg_restore.c:336 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "-d/--dbname 옵션과 -f/--file ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" -#: pg_restore.c:343 +#: pg_restore.c:350 #, c-format -msgid "options -C/--create and -1/--single-transaction cannot be used together" -msgstr "-C/--clean 옵션과 -1/--single-transaction ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" +msgid "" +"options -1/--single-transaction and --transaction-size cannot be used " +"together" +msgstr "" +"-1/--single-transaction 옵션과 --transaction-size ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" #: pg_restore.c:357 #, c-format -msgid "maximum number of parallel jobs is %d" -msgstr "병렬 작업 최대수는 %d 입니다." +msgid "options -C/--create and -1/--single-transaction cannot be used together" +msgstr "-C/--clean 옵션과 -1/--single-transaction ì˜µì…˜ì€ í•¨ê»˜ 사용할 수 ì—†ìŒ" -#: pg_restore.c:366 +#: pg_restore.c:361 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "--single-transaction ë° ë³‘ë ¬ ìž‘ì—…ì„ í•¨ê»˜ 지정할 수는 ì—†ìŒ" -#: pg_restore.c:408 +#: pg_restore.c:399 #, c-format msgid "" "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "" "알 수 없는 ì•„ì¹´ì´ë¸Œ 형ì‹: \"%s\"; 사용할 수 있는 ê°’: \"c\", \"d\", \"t\"" -#: pg_restore.c:448 +#: pg_restore.c:438 #, c-format msgid "errors ignored on restore: %d" msgstr "ë³µì›ìž‘ì—…ì—ì„œì˜ ì˜¤ë¥˜ë“¤ì´ ë¬´ì‹œë˜ì—ˆìŒ: %d" -#: pg_restore.c:461 +#: pg_restore.c:451 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" @@ -2606,47 +2870,47 @@ msgstr "" "ê·¸ ìžë£Œë¥¼ ì¼ê´„ 입력합니다.\n" "\n" -#: pg_restore.c:463 +#: pg_restore.c:453 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [옵션]... [파ì¼]\n" -#: pg_restore.c:466 +#: pg_restore.c:456 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr " -d, --dbname=NAME ì ‘ì†í•  ë°ì´í„°ë² ì´ìФ ì´ë¦„\n" -#: pg_restore.c:467 +#: pg_restore.c:457 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr " -f, --file=FILENAME 출력 íŒŒì¼ ì´ë¦„ (표준 출력: -)\n" -#: pg_restore.c:468 +#: pg_restore.c:458 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr " -F, --format=c|d|t 백업 íŒŒì¼ í˜•ì‹ (지정하지 않으면 ìžë™ë¶„ì„)\n" -#: pg_restore.c:469 +#: pg_restore.c:459 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list ìžë£Œì˜ ìš”ì•½ëœ ëª©ì°¨ë¥¼ 보여줌\n" -#: pg_restore.c:470 +#: pg_restore.c:460 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose ìžì„¸í•œ ì •ë³´ 보여줌\n" -#: pg_restore.c:471 +#: pg_restore.c:461 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: pg_restore.c:472 +#: pg_restore.c:462 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: pg_restore.c:474 +#: pg_restore.c:464 #, c-format msgid "" "\n" @@ -2655,33 +2919,33 @@ msgstr "" "\n" "리스토어 처리를 위한 옵션들:\n" -#: pg_restore.c:475 +#: pg_restore.c:465 #, c-format msgid " -a, --data-only restore only the data, no schema\n" msgstr " -a, --data-only 스키마는 빼고 ìžë£Œë§Œ 입력함\n" -#: pg_restore.c:477 +#: pg_restore.c:467 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create 작업 ëŒ€ìƒ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만듦\n" -#: pg_restore.c:478 +#: pg_restore.c:468 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr "" " -e, --exit-on-error 오류가 ìƒê¸°ë©´ ë냄, ê¸°ë³¸ì€ ê³„ì† ì§„í–‰í•¨\n" -#: pg_restore.c:479 +#: pg_restore.c:469 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NAME 지정한 ì¸ë±ìФ 만듦\n" -#: pg_restore.c:480 +#: pg_restore.c:470 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr " -j, --jobs=NUM 여러 병렬 ìž‘ì—…ì„ ì‚¬ìš©í•˜ì—¬ ë³µì›\n" -#: pg_restore.c:481 +#: pg_restore.c:471 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" @@ -2690,27 +2954,27 @@ msgstr "" " -L, --use-list=FILENAME ì¶œë ¥ì„ ì„ íƒí•˜ê³  해당 순서를 지정하기 위해\n" " ì´ íŒŒì¼ì˜ 목차 사용\n" -#: pg_restore.c:483 +#: pg_restore.c:473 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr " -n, --schema=NAME 해당 ìŠ¤í‚¤ë§ˆì˜ ê°œì²´ë“¤ë§Œ ë³µì›í•¨\n" -#: pg_restore.c:484 +#: pg_restore.c:474 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" msgstr " -N, --exclude-schema=NAME 해당 ìŠ¤í‚¤ë§ˆì˜ ê°œì²´ë“¤ì€ ë³µì› ì•ˆí•¨\n" -#: pg_restore.c:486 +#: pg_restore.c:476 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=NAME(args) 지정한 함수 만듦\n" -#: pg_restore.c:487 +#: pg_restore.c:477 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" msgstr " -s, --schema-only ìžë£Œêµ¬ì¡°(스키마)ë§Œ 만듦\n" -#: pg_restore.c:488 +#: pg_restore.c:478 #, c-format msgid "" " -S, --superuser=NAME superuser user name to use for disabling " @@ -2719,40 +2983,48 @@ msgstr "" " -S, --superuser=NAME 트리거를 사용하지 않기 위해 사용할 슈í¼ìœ ì €\n" " ì‚¬ìš©ìž ì´ë¦„\n" -#: pg_restore.c:489 +#: pg_restore.c:479 #, c-format msgid "" " -t, --table=NAME restore named relation (table, view, etc.)\n" msgstr " -t, --table=NAME ë³µì›í•  ê°ì²´ ì´ë¦„ (í…Œì´ë¸”, ë·°, 기타)\n" -#: pg_restore.c:490 +#: pg_restore.c:480 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NAME 지정한 트리거 만듦\n" -#: pg_restore.c:491 +#: pg_restore.c:481 #, c-format msgid "" " -x, --no-privileges skip restoration of access privileges (grant/" "revoke)\n" msgstr " -x, --no-privileges ì ‘ê·¼ 권한(grant/revoke) 지정 안함\n" -#: pg_restore.c:492 +#: pg_restore.c:482 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction í•˜ë‚˜ì˜ íŠ¸ëžœìž­ì…˜ 작업으로 ë³µì›í•¨\n" -#: pg_restore.c:494 +#: pg_restore.c:484 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security 로우 보안 활성화\n" -#: pg_restore.c:496 +#: pg_restore.c:485 +#, c-format +msgid "" +" --filter=FILENAME restore or skip objects based on expressions\n" +" in FILENAME\n" +msgstr "" +" --filter=FILENAME 지정한 파ì¼ì˜ í•„í„° 조건으로 ê°ì²´ë¥¼ ë³µì›í•¨\n" + +#: pg_restore.c:488 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments 코멘트는 ë³µì›í•˜ì§€ 않ìŒ\n" -#: pg_restore.c:497 +#: pg_restore.c:489 #, c-format msgid "" " --no-data-for-failed-tables do not restore data of tables that could not " @@ -2762,27 +3034,32 @@ msgstr "" " --no-data-for-failed-tables 만들 수 없는 í…Œì´ë¸”ì— ëŒ€í•´ì„œëŠ” ìžë£Œë¥¼ ë¤í”„하" "ì§€ 않ìŒ\n" -#: pg_restore.c:499 +#: pg_restore.c:491 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications 발행 정보는 ë³µì› ì•ˆí•¨\n" -#: pg_restore.c:500 +#: pg_restore.c:492 #, c-format msgid " --no-security-labels do not restore security labels\n" msgstr " --no-security-labels 보안 ë¼ë²¨ì„ ë³µì›í•˜ì§€ 않ìŒ\n" -#: pg_restore.c:501 +#: pg_restore.c:493 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions êµ¬ë… ì •ë³´ëŠ” ë³µì› ì•ˆí•¨\n" -#: pg_restore.c:502 +#: pg_restore.c:494 +#, c-format +msgid " --no-table-access-method do not restore table access methods\n" +msgstr " --no-table-access-method í…Œì´ë¸” ì ‘ê·¼ 방법 ë³µì› ì•ˆí•¨\n" + +#: pg_restore.c:495 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" msgstr " --no-tablespaces í…Œì´ë¸”스페ì´ìФ í• ë‹¹ì„ ë³µì›í•˜ì§€ 않ìŒ\n" -#: pg_restore.c:503 +#: pg_restore.c:496 #, c-format msgid "" " --section=SECTION restore named section (pre-data, data, or " @@ -2791,12 +3068,17 @@ msgstr "" " --section=SECTION 지정한 섹션만 ë³µì›í•¨\n" " 섹션 종류: pre-data, data, post-data\n" -#: pg_restore.c:516 +#: pg_restore.c:499 +#, c-format +msgid " --transaction-size=N commit after every N objects\n" +msgstr " --transaction-size=N N ê°œì˜ ê°ì²´ 다ìŒì—는 í•­ìƒ commit\n" + +#: pg_restore.c:510 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=ROLENAME ë³µì› ì „ì— SET ROLE 수행\n" -#: pg_restore.c:518 +#: pg_restore.c:512 #, c-format msgid "" "\n" @@ -2809,7 +3091,7 @@ msgstr "" "기\n" "위해서 여러번 사용할 수 있습니다.\n" -#: pg_restore.c:521 +#: pg_restore.c:515 #, c-format msgid "" "\n" @@ -2819,3 +3101,23 @@ msgstr "" "\n" "사용할 ìž…ë ¥ 파ì¼ì„ 지정하지 않았다면, 표준 ìž…ë ¥(stdin)ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.\n" "\n" + +#, c-format +#~ msgid "" +#~ "query produced null referenced table name for foreign key trigger \"%s\" " +#~ "on table \"%s\" (OID of table: %u)" +#~ msgstr "" +#~ "쿼리가 참조테ì´ë¸” ì •ë³´ê°€ 없는 \"%s\" 참조키 트리거를 \"%s\" (해당 OID: " +#~ "%u) í…Œì´ë¸”ì—서 만들었습니다." + +#, c-format +#~ msgid "unexpected tgtype value: %d" +#~ msgstr "기대ë˜ì§€ ì•Šì€ tgtype ê°’: %d" + +#, c-format +#~ msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" +#~ msgstr "ìž˜ëª»ëœ ì¸ìˆ˜ 문ìžì—´ (%s), 해당 트리거 \"%s\", 사용ë˜ëŠ” í…Œì´ë¸” \"%s\"" + +#, c-format +#~ msgid " %s" +#~ msgstr " %s" diff --git a/src/bin/pg_dump/po/meson.build b/src/bin/pg_dump/po/meson.build index cc9d368011942..cb4267d613305 100644 --- a/src/bin/pg_dump/po/meson.build +++ b/src/bin/pg_dump/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_dump-' + pg_version_major.to_string())] diff --git a/src/bin/pg_dump/po/ru.po b/src/bin/pg_dump/po/ru.po index ab9cbc6d30410..be7aa381ac119 100644 --- a/src/bin/pg_dump/po/ru.po +++ b/src/bin/pg_dump/po/ru.po @@ -5,13 +5,13 @@ # Oleg Bartunov , 2004. # Sergey Burladyan , 2012. # Dmitriy Olshevskiy , 2014. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022. +# SPDX-FileCopyrightText: 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Alexander Lakhin msgid "" msgstr "" "Project-Id-Version: pg_dump (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-02-02 08:42+0300\n" -"PO-Revision-Date: 2022-09-05 13:35+0300\n" +"POT-Creation-Date: 2025-05-03 16:06+0300\n" +"PO-Revision-Date: 2025-05-03 16:33+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -41,85 +41,189 @@ msgstr "подробноÑти: " msgid "hint: " msgstr "подÑказка: " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/compression.c:132 ../../common/compression.c:141 +#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420 +#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25 +#: compress_zstd.c:31 #, c-format -msgid "could not identify current directory: %m" -msgstr "не удалоÑÑŒ определить текущий каталог: %m" +msgid "this build does not support compression with %s" +msgstr "Ñта Ñборка программы не поддерживает Ñжатие %s" -#: ../../common/exec.c:168 +#: ../../common/compression.c:205 +msgid "found empty string where a compression option was expected" +msgstr "вмеÑто ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð° пуÑÑ‚Ð°Ñ Ñтрока" + +#: ../../common/compression.c:244 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "нераÑпознанный параметр ÑжатиÑ: \"%s\"" + +#: ../../common/compression.c:283 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" требуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ" + +#: ../../common/compression.c:292 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "значение параметра ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" должно быть целочиÑленным" + +#: ../../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "значение параметра ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" должно быть булевÑким" + +#: ../../common/compression.c:379 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ уровень ÑжатиÑ" + +#: ../../common/compression.c:386 +#, c-format +msgid "" +"compression algorithm \"%s\" expects a compression level between %d and %d " +"(default at %d)" +msgstr "" +"Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" ожидаетÑÑ ÑƒÑ€Ð¾Ð²ÐµÐ½ÑŒ ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¾Ñ‚ %d до %d (по " +"умолчанию %d)" + +#: ../../common/compression.c:397 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "Ð´Ð»Ñ Ð°Ð»Ð³Ð¾Ñ€Ð¸Ñ‚Ð¼Ð° ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ñ‚ÑŒ чиÑло потоков" + +#: ../../common/compression.c:408 #, c-format -msgid "invalid binary \"%s\"" -msgstr "неверный иÑполнÑемый файл \"%s\"" +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "алгоритм ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\" не поддерживает режим большой диÑтанции" -#: ../../common/exec.c:218 +#: ../../common/exec.c:174 #, c-format -msgid "could not read binary \"%s\"" -msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\"" +msgid "invalid binary \"%s\": %m" +msgstr "неверный иÑполнÑемый файл \"%s\": %m" -#: ../../common/exec.c:226 +#: ../../common/exec.c:217 +#, c-format +msgid "could not read binary \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\": %m" + +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "не удалоÑÑŒ найти запуÑкаемый файл \"%s\"" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "не удалоÑÑŒ преобразовать отноÑительный путь \"%s\" в абÑолютный: %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:382 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m" +msgid "could not execute command \"%s\": %m" +msgstr "не удалоÑÑŒ выполнить команду \"%s\": %m" -#: ../../common/exec.c:422 parallel.c:1611 +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать вывод команды \"%s\": %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "команда \"%s\" не выдала данные" + +#: ../../common/exec.c:424 parallel.c:1609 #, c-format msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "нехватка памÑти" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "нехватка памÑти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" -#: ../../common/wait_error.c:45 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñта Ñборка программы не поддерживает метод Ñинхронизации \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_backup_directory.c:182 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" + +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "неиÑполнÑÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "команда не найдена" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ возврата %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "дочерний процеÑÑ Ð¿Ñ€ÐµÑ€Ð²Ð°Ð½ иÑключением 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" -msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным ÑоÑтоÑнием %d" +msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным кодом ÑоÑтоÑÐ½Ð¸Ñ %d" #: ../../fe_utils/option_utils.c:69 #, c-format @@ -131,301 +235,428 @@ msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" msgid "%s must be in range %d..%d" msgstr "значение %s должно быть в диапазоне %d..%d" -#: common.c:134 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нераÑпознанный метод Ñинхронизации: %s" + +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "" +"аргумент команды оболочки Ñодержит Ñимвол новой Ñтроки или перевода каретки: " +"\"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "" +"Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ñодержит Ñимвол новой Ñтроки или перевода каретки: \"%s\"\n" + +#: common.c:135 #, c-format msgid "reading extensions" msgstr "чтение раÑширений" -#: common.c:137 +#: common.c:138 #, c-format msgid "identifying extension members" msgstr "выÑвление членов раÑширений" -#: common.c:140 +#: common.c:141 #, c-format msgid "reading schemas" msgstr "чтение Ñхем" -#: common.c:149 +#: common.c:150 #, c-format msgid "reading user-defined tables" msgstr "чтение пользовательÑких таблиц" -#: common.c:154 +#: common.c:155 #, c-format msgid "reading user-defined functions" msgstr "чтение пользовательÑких функций" -#: common.c:158 +#: common.c:159 #, c-format msgid "reading user-defined types" msgstr "чтение пользовательÑких типов" -#: common.c:162 +#: common.c:163 #, c-format msgid "reading procedural languages" msgstr "чтение процедурных Ñзыков" -#: common.c:165 +#: common.c:166 #, c-format msgid "reading user-defined aggregate functions" msgstr "чтение пользовательÑких агрегатных функций" -#: common.c:168 +#: common.c:169 #, c-format msgid "reading user-defined operators" msgstr "чтение пользовательÑких операторов" -#: common.c:171 +#: common.c:172 #, c-format msgid "reading user-defined access methods" msgstr "чтение пользовательÑких методов доÑтупа" -#: common.c:174 +#: common.c:175 #, c-format msgid "reading user-defined operator classes" msgstr "чтение пользовательÑких клаÑÑов операторов" -#: common.c:177 +#: common.c:178 #, c-format msgid "reading user-defined operator families" msgstr "чтение пользовательÑких ÑемейÑтв операторов" -#: common.c:180 +#: common.c:181 #, c-format msgid "reading user-defined text search parsers" msgstr "чтение пользовательÑких анализаторов текÑтового поиÑка" -#: common.c:183 +#: common.c:184 #, c-format msgid "reading user-defined text search templates" msgstr "чтение пользовательÑких шаблонов текÑтового поиÑка" -#: common.c:186 +#: common.c:187 #, c-format msgid "reading user-defined text search dictionaries" msgstr "чтение пользовательÑких Ñловарей текÑтового поиÑка" -#: common.c:189 +#: common.c:190 #, c-format msgid "reading user-defined text search configurations" msgstr "чтение пользовательÑких конфигураций текÑтового поиÑка" -#: common.c:192 +#: common.c:193 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "чтение пользовательÑких оболочек Ñторонних данных" -#: common.c:195 +#: common.c:196 #, c-format msgid "reading user-defined foreign servers" msgstr "чтение пользовательÑких Ñторонних Ñерверов" -#: common.c:198 +#: common.c:199 #, c-format msgid "reading default privileges" msgstr "чтение прав по умолчанию" -#: common.c:201 +#: common.c:202 #, c-format msgid "reading user-defined collations" msgstr "чтение пользовательÑких правил Ñортировки" -#: common.c:204 +#: common.c:205 #, c-format msgid "reading user-defined conversions" msgstr "чтение пользовательÑких преобразований" -#: common.c:207 +#: common.c:208 #, c-format msgid "reading type casts" msgstr "чтение приведений типов" -#: common.c:210 +#: common.c:211 #, c-format msgid "reading transforms" msgstr "чтение преобразований" -#: common.c:213 +#: common.c:214 #, c-format msgid "reading table inheritance information" msgstr "чтение информации о наÑледовании таблиц" -#: common.c:216 +#: common.c:217 #, c-format msgid "reading event triggers" msgstr "чтение Ñобытийных триггеров" -#: common.c:220 +#: common.c:221 #, c-format msgid "finding extension tables" msgstr "поиÑк таблиц раÑширений" -#: common.c:224 +#: common.c:225 #, c-format msgid "finding inheritance relationships" msgstr "поиÑк ÑвÑзей наÑледованиÑ" -#: common.c:227 +#: common.c:228 #, c-format msgid "reading column info for interesting tables" msgstr "чтение информации о Ñтолбцах интереÑующих таблиц" -#: common.c:230 +#: common.c:231 #, c-format msgid "flagging inherited columns in subtables" msgstr "пометка наÑледованных Ñтолбцов в подтаблицах" -#: common.c:233 +#: common.c:234 +#, c-format +msgid "reading partitioning data" +msgstr "чтение информации о Ñекционировании" + +#: common.c:237 #, c-format msgid "reading indexes" msgstr "чтение индекÑов" -#: common.c:236 +#: common.c:240 #, c-format msgid "flagging indexes in partitioned tables" msgstr "пометка индекÑов в Ñекционированных таблицах" -#: common.c:239 +#: common.c:243 #, c-format msgid "reading extended statistics" msgstr "чтение раÑширенной ÑтатиÑтики" -#: common.c:242 +#: common.c:246 #, c-format msgid "reading constraints" msgstr "чтение ограничений" -#: common.c:245 +#: common.c:249 #, c-format msgid "reading triggers" msgstr "чтение триггеров" -#: common.c:248 +#: common.c:252 #, c-format msgid "reading rewrite rules" msgstr "чтение правил перезапиÑи" -#: common.c:251 +#: common.c:255 #, c-format msgid "reading policies" msgstr "чтение политик" -#: common.c:254 +#: common.c:258 #, c-format msgid "reading publications" msgstr "чтение публикаций" -#: common.c:257 +#: common.c:261 #, c-format msgid "reading publication membership of tables" msgstr "чтение информации о таблицах, включённых в публикации" -#: common.c:260 +#: common.c:264 #, c-format msgid "reading publication membership of schemas" msgstr "чтение информации о Ñхемах, включённых в публикации" -#: common.c:263 +#: common.c:267 #, c-format msgid "reading subscriptions" msgstr "чтение подпиÑок" -#: common.c:343 +#: common.c:270 #, c-format -msgid "invalid number of parents %d for table \"%s\"" -msgstr "неверное чиÑло родителей (%d) Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\"" +msgid "reading subscription membership of tables" +msgstr "чтение информации о таблицах, включённых в подпиÑки" -#: common.c:1004 +#: common.c:333 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "" "нарушение целоÑтноÑти: родительÑÐºÐ°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° Ñ OID %u Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\" (OID " "%u) не найдена" -#: common.c:1043 +#: common.c:375 +#, c-format +msgid "invalid number of parents %d for table \"%s\"" +msgstr "неверное чиÑло родителей (%d) Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\"" + +#: common.c:1098 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "не удалоÑÑŒ разобрать чиÑловой маÑÑив \"%s\": Ñлишком много чиÑел" -#: common.c:1055 +#: common.c:1110 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "не удалоÑÑŒ разобрать чиÑловой маÑÑив \"%s\": неверный Ñимвол в чиÑле" -#: compress_io.c:111 -#, c-format -msgid "invalid compression code: %d" -msgstr "неверный код ÑжатиÑ: %d" - -#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504 -#: compress_io.c:547 -#, c-format -msgid "not built with zlib support" -msgstr "программа Ñобрана без поддержки zlib" - -#: compress_io.c:236 compress_io.c:333 +#: compress_gzip.c:69 compress_gzip.c:183 #, c-format msgid "could not initialize compression library: %s" msgstr "не удалоÑÑŒ инициализировать библиотеку ÑжатиÑ: %s" -#: compress_io.c:256 +#: compress_gzip.c:93 #, c-format msgid "could not close compression stream: %s" msgstr "не удалоÑÑŒ закрыть поток Ñжатых данных: %s" -#: compress_io.c:273 +#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109 #, c-format msgid "could not compress data: %s" msgstr "не удалоÑÑŒ Ñжать данные: %s" -#: compress_io.c:349 compress_io.c:364 +#: compress_gzip.c:199 compress_gzip.c:214 #, c-format msgid "could not uncompress data: %s" msgstr "не удалоÑÑŒ раÑпаковать данные: %s" -#: compress_io.c:371 +#: compress_gzip.c:221 #, c-format msgid "could not close compression library: %s" msgstr "не удалоÑÑŒ закрыть библиотеку ÑжатиÑ: %s" -#: compress_io.c:584 compress_io.c:621 +#: compress_gzip.c:266 compress_lz4.c:608 compress_lz4.c:628 compress_lz4.c:647 #, c-format msgid "could not read from input file: %s" msgstr "не удалоÑÑŒ прочитать входной файл: %s" -#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553 -#: pg_backup_tar.c:726 pg_backup_tar.c:749 +#: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 +#: compress_zstd.c:374 pg_backup_custom.c:651 +#, c-format +msgid "could not read from input file: %m" +msgstr "не удалоÑÑŒ прочитать входной файл: %m" + +#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:141 +#: compress_zstd.c:372 pg_backup_custom.c:649 pg_backup_directory.c:565 +#: pg_backup_tar.c:740 pg_backup_tar.c:763 #, c-format msgid "could not read from input file: end of file" msgstr "не удалоÑÑŒ прочитать входной файл: конец файла" -#: parallel.c:253 +#: compress_lz4.c:157 +#, c-format +msgid "could not create LZ4 decompression context: %s" +msgstr "не удалоÑÑŒ Ñоздать контекÑÑ‚ раÑпаковки LZ4: %s" + +#: compress_lz4.c:180 +#, c-format +msgid "could not decompress: %s" +msgstr "не удалоÑÑŒ раÑпаковать данные: %s" + +#: compress_lz4.c:193 +#, c-format +msgid "could not free LZ4 decompression context: %s" +msgstr "не удалоÑÑŒ оÑвободить контекÑÑ‚ раÑпаковки LZ4: %s" + +#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690 +#, c-format +msgid "could not end compression: %s" +msgstr "не удалоÑÑŒ завершить Ñжатие: %s" + +#: compress_lz4.c:301 +#, c-format +msgid "could not initialize LZ4 compression: %s" +msgstr "не удалоÑÑŒ инициализировать LZ4: %s" + +#: compress_lz4.c:697 +#, c-format +msgid "could not end decompression: %s" +msgstr "не удалоÑÑŒ завершить раÑпаковку: %s" + +#: compress_zstd.c:66 +#, c-format +msgid "could not set compression parameter \"%s\": %s" +msgstr "не удалоÑÑŒ задать параметр ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\": %s" + +#: compress_zstd.c:78 compress_zstd.c:232 compress_zstd.c:491 +#: compress_zstd.c:499 +#, c-format +msgid "could not initialize compression library" +msgstr "не удалоÑÑŒ инициализировать библиотеку ÑжатиÑ" + +#: compress_zstd.c:195 compress_zstd.c:309 +#, c-format +msgid "could not decompress data: %s" +msgstr "не удалоÑÑŒ раÑпаковать данные: %s" + +#: compress_zstd.c:502 +#, c-format +msgid "unhandled mode \"%s\"" +msgstr "необрабатываемый режим \"%s\"" + +#: filter.c:49 +#, c-format +msgid "could not open filter file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл фильтра \"%s\": %m" + +#: filter.c:72 +#, c-format +msgid "could not close filter file \"%s\": %m" +msgstr "не удалоÑÑŒ закрыть файл фильтра \"%s\": %m" + +#: filter.c:165 +#, c-format +msgid "invalid format in filter read from standard input on line %d: %s" +msgstr "" +"неверный формат в фильтре, прочитанном из Ñтандартного ввода, в Ñтроке %d: %s" + +#: filter.c:168 +#, c-format +msgid "invalid format in filter read from file \"%s\" on line %d: %s" +msgstr "" +"неверный формат в фильтре, прочитанном из файла \"%s\", в Ñтроке %d: %s" + +#: filter.c:241 filter.c:468 +#, c-format +msgid "could not read from filter file \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать файл фильтра \"%s\": %m" + +#: filter.c:244 +msgid "unexpected end of file" +msgstr "неожиданный конец файла" + +#: filter.c:311 +msgid "missing object name pattern" +msgstr "отÑутÑтвует шаблон имени объекта" + +#: filter.c:422 +msgid "no filter command found (expected \"include\" or \"exclude\")" +msgstr "отÑутÑтвует команда фильтра (ожидалаÑÑŒ \"include\" или \"exclude\")" + +#: filter.c:433 +msgid "invalid filter command (expected \"include\" or \"exclude\")" +msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° фильтра (ожидалаÑÑŒ \"include\" или \"exclude\")" + +#: filter.c:440 +msgid "missing filter object type" +msgstr "отÑутÑтвует тип объекта фильтра" + +#: filter.c:447 +#, c-format +msgid "unsupported filter object type: \"%.*s\"" +msgstr "неподдерживаемый тип объекта фильтра: \"%.*s\"" + +#: parallel.c:251 #, c-format msgid "%s() failed: error code %d" msgstr "ошибка в %s() (код ошибки: %d)" -#: parallel.c:961 +#: parallel.c:959 #, c-format msgid "could not create communication channels: %m" msgstr "не удалоÑÑŒ Ñоздать каналы межпроцеÑÑного взаимодейÑтвиÑ: %m" -#: parallel.c:1018 +#: parallel.c:1016 #, c-format msgid "could not create worker process: %m" msgstr "не удалоÑÑŒ Ñоздать рабочий процеÑÑ: %m" -#: parallel.c:1148 +#: parallel.c:1146 #, c-format msgid "unrecognized command received from leader: \"%s\"" msgstr "от ведущего процеÑÑа получена нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°: \"%s\"" -#: parallel.c:1191 parallel.c:1429 +#: parallel.c:1189 parallel.c:1427 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "от рабочего процеÑÑа получено ошибочное Ñообщение: \"%s\"" -#: parallel.c:1323 +#: parallel.c:1321 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -438,161 +669,157 @@ msgstr "" "Ñтой таблицы поÑле того, как родительÑкий процеÑÑ pg_dump получил Ð´Ð»Ñ Ð½ÐµÑ‘ " "начальную блокировку ACCESS SHARE." -#: parallel.c:1412 +#: parallel.c:1410 #, c-format msgid "a worker process died unexpectedly" msgstr "рабочий процеÑÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾ прервалÑÑ" -#: parallel.c:1534 parallel.c:1652 +#: parallel.c:1532 parallel.c:1650 #, c-format msgid "could not write to the communication channel: %m" msgstr "не удалоÑÑŒ запиÑать в канал взаимодейÑтвиÑ: %m" -#: parallel.c:1736 +#: parallel.c:1734 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: не удалоÑÑŒ Ñоздать Ñокет (код ошибки: %d)" -#: parallel.c:1747 +#: parallel.c:1745 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: не удалоÑÑŒ привÑзатьÑÑ Ðº Ñокету (код ошибки: %d)" -#: parallel.c:1754 +#: parallel.c:1752 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: не удалоÑÑŒ начать приём (код ошибки: %d)" -#: parallel.c:1761 +#: parallel.c:1759 #, c-format msgid "pgpipe: %s() failed: error code %d" msgstr "pgpipe: ошибка в %s() (код ошибки: %d)" -#: parallel.c:1772 +#: parallel.c:1770 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: не удалоÑÑŒ Ñоздать второй Ñокет (код ошибки: %d)" -#: parallel.c:1781 +#: parallel.c:1779 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: не удалоÑÑŒ подключить Ñокет (код ошибки: %d)" -#: parallel.c:1790 +#: parallel.c:1788 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: не удалоÑÑŒ принÑть Ñоединение (код ошибки: %d)" -#: pg_backup_archiver.c:279 pg_backup_archiver.c:1581 +#: pg_backup_archiver.c:261 pg_backup_archiver.c:1706 #, c-format msgid "could not close output file: %m" msgstr "не удалоÑÑŒ закрыть выходной файл: %m" -#: pg_backup_archiver.c:323 pg_backup_archiver.c:327 +#: pg_backup_archiver.c:305 pg_backup_archiver.c:309 #, c-format msgid "archive items not in correct section order" msgstr "в поÑледовательноÑти Ñлементов архива нарушен порÑдок разделов" -#: pg_backup_archiver.c:333 +#: pg_backup_archiver.c:315 #, c-format msgid "unexpected section code %d" msgstr "неожиданный код раздела %d" -#: pg_backup_archiver.c:370 +#: pg_backup_archiver.c:352 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "" "параллельное воÑÑтановление не поддерживаетÑÑ Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ форматом архивного " "файла" -#: pg_backup_archiver.c:374 +#: pg_backup_archiver.c:356 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "" "параллельное воÑÑтановление возможно только Ð´Ð»Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð¾Ð², Ñозданных pg_dump " "верÑии 8.0 и новее" -#: pg_backup_archiver.c:392 +#: pg_backup_archiver.c:377 #, c-format -msgid "" -"cannot restore from compressed archive (compression not supported in this " -"installation)" -msgstr "" -"воÑÑтановить данные из Ñжатого архива Ð½ÐµÐ»ÑŒÐ·Ñ (уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð½Ðµ " -"поддерживает Ñжатие)" +msgid "cannot restore from compressed archive (%s)" +msgstr "воÑÑтановить данные из Ñжатого архива Ð½ÐµÐ»ÑŒÐ·Ñ (%s)" -#: pg_backup_archiver.c:409 +#: pg_backup_archiver.c:397 #, c-format msgid "connecting to database for restore" msgstr "подключение к базе данных Ð´Ð»Ñ Ð²Ð¾ÑÑтановлениÑ" -#: pg_backup_archiver.c:411 +#: pg_backup_archiver.c:399 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "" "прÑмые Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных не поддерживаютÑÑ Ð² архивах до верÑии 1.3" -#: pg_backup_archiver.c:454 +#: pg_backup_archiver.c:442 #, c-format msgid "implied data-only restore" msgstr "подразумеваетÑÑ Ð²Ð¾ÑÑтановление только данных" -#: pg_backup_archiver.c:520 +#: pg_backup_archiver.c:510 #, c-format msgid "dropping %s %s" msgstr "удалÑетÑÑ %s %s" -#: pg_backup_archiver.c:620 +#: pg_backup_archiver.c:642 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "не удалоÑÑŒ определить, куда добавить IF EXISTS в оператор \"%s\"" -#: pg_backup_archiver.c:776 pg_backup_archiver.c:778 +#: pg_backup_archiver.c:828 pg_backup_archiver.c:830 #, c-format msgid "warning from original dump file: %s" msgstr "предупреждение из иÑходного файла: %s" -#: pg_backup_archiver.c:793 +#: pg_backup_archiver.c:864 #, c-format msgid "creating %s \"%s.%s\"" msgstr "ÑоздаётÑÑ %s \"%s.%s\"" -#: pg_backup_archiver.c:796 +#: pg_backup_archiver.c:867 #, c-format msgid "creating %s \"%s\"" msgstr "ÑоздаётÑÑ %s \"%s\"" -#: pg_backup_archiver.c:846 +#: pg_backup_archiver.c:917 #, c-format msgid "connecting to new database \"%s\"" msgstr "подключение к новой базе данных \"%s\"" -#: pg_backup_archiver.c:873 +#: pg_backup_archiver.c:944 #, c-format msgid "processing %s" msgstr "обрабатываетÑÑ %s" -#: pg_backup_archiver.c:893 +#: pg_backup_archiver.c:966 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "обрабатываютÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ таблицы \"%s.%s\"" -#: pg_backup_archiver.c:952 +#: pg_backup_archiver.c:1036 #, c-format msgid "executing %s %s" msgstr "выполнÑетÑÑ %s %s" -#: pg_backup_archiver.c:991 +#: pg_backup_archiver.c:1096 #, c-format msgid "disabling triggers for %s" msgstr "отключаютÑÑ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ñ‹ таблицы %s" -#: pg_backup_archiver.c:1017 +#: pg_backup_archiver.c:1122 #, c-format msgid "enabling triggers for %s" msgstr "включаютÑÑ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ñ‹ таблицы %s" -#: pg_backup_archiver.c:1045 +#: pg_backup_archiver.c:1187 #, c-format msgid "" "internal error -- WriteData cannot be called outside the context of a " @@ -601,12 +828,12 @@ msgstr "" "внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° -- WriteData Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ вне контекÑта процедуры " "DataDumper" -#: pg_backup_archiver.c:1228 +#: pg_backup_archiver.c:1379 #, c-format msgid "large-object output not supported in chosen format" msgstr "выбранный формат не поддерживает выгрузку больших объектов" -#: pg_backup_archiver.c:1286 +#: pg_backup_archiver.c:1442 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" @@ -614,55 +841,55 @@ msgstr[0] "воÑÑтановлен %d большой объект" msgstr[1] "воÑÑтановлено %d больших объекта" msgstr[2] "воÑÑтановлено %d больших объектов" -#: pg_backup_archiver.c:1307 pg_backup_tar.c:669 +#: pg_backup_archiver.c:1469 pg_backup_tar.c:683 #, c-format msgid "restoring large object with OID %u" msgstr "воÑÑтановление большого объекта Ñ OID %u" -#: pg_backup_archiver.c:1319 +#: pg_backup_archiver.c:1481 #, c-format msgid "could not create large object %u: %s" msgstr "не удалоÑÑŒ Ñоздать большой объект %u: %s" -#: pg_backup_archiver.c:1324 pg_dump.c:3568 +#: pg_backup_archiver.c:1486 pg_dump.c:3889 #, c-format msgid "could not open large object %u: %s" msgstr "не удалоÑÑŒ открыть большой объект %u: %s" -#: pg_backup_archiver.c:1380 +#: pg_backup_archiver.c:1542 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "не удалоÑÑŒ открыть файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\": %m" -#: pg_backup_archiver.c:1408 +#: pg_backup_archiver.c:1570 #, c-format msgid "line ignored: %s" msgstr "Ñтрока проигнорирована: %s" -#: pg_backup_archiver.c:1415 +#: pg_backup_archiver.c:1577 pg_backup_db.c:609 #, c-format msgid "could not find entry for ID %d" msgstr "не найдена запиÑÑŒ Ð´Ð»Ñ ID %d" -#: pg_backup_archiver.c:1438 pg_backup_directory.c:222 -#: pg_backup_directory.c:599 +#: pg_backup_archiver.c:1600 pg_backup_directory.c:219 +#: pg_backup_directory.c:613 #, c-format msgid "could not close TOC file: %m" msgstr "не удалоÑÑŒ закрыть файл оглавлениÑ: %m" -#: pg_backup_archiver.c:1552 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:586 pg_backup_directory.c:649 -#: pg_backup_directory.c:668 pg_dumpall.c:476 +#: pg_backup_archiver.c:1687 pg_backup_custom.c:152 pg_backup_directory.c:333 +#: pg_backup_directory.c:600 pg_backup_directory.c:666 +#: pg_backup_directory.c:684 pg_dumpall.c:506 #, c-format msgid "could not open output file \"%s\": %m" msgstr "не удалоÑÑŒ открыть выходной файл \"%s\": %m" -#: pg_backup_archiver.c:1554 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1689 pg_backup_custom.c:158 #, c-format msgid "could not open output file: %m" msgstr "не удалоÑÑŒ открыть выходной файл: %m" -#: pg_backup_archiver.c:1648 +#: pg_backup_archiver.c:1772 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" @@ -670,211 +897,221 @@ msgstr[0] "запиÑан %zu байт данных большого объек msgstr[1] "запиÑано %zu байта данных большого объекта (результат = %d)" msgstr[2] "запиÑано %zu байт данных большого объекта (результат = %d)" -#: pg_backup_archiver.c:1654 +#: pg_backup_archiver.c:1778 #, c-format msgid "could not write to large object: %s" msgstr "не удалоÑÑŒ запиÑать данные в большой объект: %s" -#: pg_backup_archiver.c:1744 +#: pg_backup_archiver.c:1868 #, c-format msgid "while INITIALIZING:" msgstr "при инициализации:" -#: pg_backup_archiver.c:1749 +#: pg_backup_archiver.c:1873 #, c-format msgid "while PROCESSING TOC:" msgstr "при обработке оглавлениÑ:" -#: pg_backup_archiver.c:1754 +#: pg_backup_archiver.c:1878 #, c-format msgid "while FINALIZING:" msgstr "при завершении:" -#: pg_backup_archiver.c:1759 +#: pg_backup_archiver.c:1883 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "из запиÑи Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1835 +#: pg_backup_archiver.c:1959 #, c-format msgid "bad dumpId" msgstr "неверный dumpId" -#: pg_backup_archiver.c:1856 +#: pg_backup_archiver.c:1980 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "неверный dumpId таблицы в Ñлементе TABLE DATA" -#: pg_backup_archiver.c:1948 +#: pg_backup_archiver.c:2072 #, c-format msgid "unexpected data offset flag %d" msgstr "неожиданный флаг ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…: %d" -#: pg_backup_archiver.c:1961 +#: pg_backup_archiver.c:2085 #, c-format msgid "file offset in dump file is too large" msgstr "Ñлишком большое Ñмещение в файле выгрузки" -#: pg_backup_archiver.c:2099 pg_backup_archiver.c:2109 +#: pg_backup_archiver.c:2196 #, c-format msgid "directory name too long: \"%s\"" msgstr "Ñлишком длинное Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°: \"%s\"" -#: pg_backup_archiver.c:2117 +#: pg_backup_archiver.c:2246 #, c-format msgid "" "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not " "exist)" msgstr "каталог \"%s\" не похож на архивный (в нём отÑутÑтвует \"toc.dat\")" -#: pg_backup_archiver.c:2125 pg_backup_custom.c:173 pg_backup_custom.c:807 -#: pg_backup_directory.c:207 pg_backup_directory.c:395 +#: pg_backup_archiver.c:2254 pg_backup_custom.c:169 pg_backup_custom.c:812 +#: pg_backup_directory.c:204 pg_backup_directory.c:396 #, c-format msgid "could not open input file \"%s\": %m" msgstr "не удалоÑÑŒ открыть входной файл \"%s\": %m" -#: pg_backup_archiver.c:2132 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2261 pg_backup_custom.c:175 #, c-format msgid "could not open input file: %m" msgstr "не удалоÑÑŒ открыть входной файл: %m" -#: pg_backup_archiver.c:2138 +#: pg_backup_archiver.c:2267 #, c-format msgid "could not read input file: %m" msgstr "не удалоÑÑŒ прочитать входной файл: %m" -#: pg_backup_archiver.c:2140 +#: pg_backup_archiver.c:2269 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "входной файл Ñлишком короткий (прочитано байт: %lu, ожидалоÑÑŒ: 5)" -#: pg_backup_archiver.c:2172 +#: pg_backup_archiver.c:2301 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "" "входной файл, видимо, имеет текÑтовый формат. Загрузите его Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ psql." -#: pg_backup_archiver.c:2178 +#: pg_backup_archiver.c:2307 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "входной файл не похож на архив (возможно, Ñлишком мал?)" -#: pg_backup_archiver.c:2184 +#: pg_backup_archiver.c:2313 #, c-format msgid "input file does not appear to be a valid archive" msgstr "входной файл не похож на архив" -#: pg_backup_archiver.c:2193 +#: pg_backup_archiver.c:2322 #, c-format msgid "could not close input file: %m" msgstr "не удалоÑÑŒ закрыть входной файл: %m" -#: pg_backup_archiver.c:2310 +#: pg_backup_archiver.c:2401 +#, c-format +msgid "could not open stdout for appending: %m" +msgstr "не удалоÑÑŒ открыть stdout Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð°: %m" + +#: pg_backup_archiver.c:2446 #, c-format msgid "unrecognized file format \"%d\"" msgstr "неопознанный формат файла: \"%d\"" -#: pg_backup_archiver.c:2392 pg_backup_archiver.c:4450 +#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4648 #, c-format msgid "finished item %d %s %s" msgstr "закончен объект %d %s %s" -#: pg_backup_archiver.c:2396 pg_backup_archiver.c:4463 +#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4661 #, c-format msgid "worker process failed: exit code %d" msgstr "рабочий процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ возврата %d" -#: pg_backup_archiver.c:2517 +#: pg_backup_archiver.c:2653 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "ID запиÑи %d вне диапазона - возможно повреждено оглавление" -#: pg_backup_archiver.c:2597 +#: pg_backup_archiver.c:2736 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "воÑÑтановление таблиц Ñо ÑвойÑтвом WITH OIDS больше не поддерживаетÑÑ" -#: pg_backup_archiver.c:2679 +#: pg_backup_archiver.c:2818 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° \"%s\"" -#: pg_backup_archiver.c:2684 +#: pg_backup_archiver.c:2824 #, c-format msgid "invalid ENCODING item: %s" msgstr "неверный Ñлемент ENCODING: %s" -#: pg_backup_archiver.c:2702 +#: pg_backup_archiver.c:2842 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "неверный Ñлемент STDSTRINGS: %s" -#: pg_backup_archiver.c:2727 +#: pg_backup_archiver.c:2867 #, c-format msgid "schema \"%s\" not found" msgstr "Ñхема \"%s\" не найдена" -#: pg_backup_archiver.c:2734 +#: pg_backup_archiver.c:2874 #, c-format msgid "table \"%s\" not found" msgstr "таблица \"%s\" не найдена" -#: pg_backup_archiver.c:2741 +#: pg_backup_archiver.c:2881 #, c-format msgid "index \"%s\" not found" msgstr "Ð¸Ð½Ð´ÐµÐºÑ \"%s\" не найден" -#: pg_backup_archiver.c:2748 +#: pg_backup_archiver.c:2888 #, c-format msgid "function \"%s\" not found" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" не найдена" -#: pg_backup_archiver.c:2755 +#: pg_backup_archiver.c:2895 #, c-format msgid "trigger \"%s\" not found" msgstr "триггер \"%s\" не найден" -#: pg_backup_archiver.c:3148 +#: pg_backup_archiver.c:3326 #, c-format msgid "could not set session user to \"%s\": %s" -msgstr "не удалоÑÑŒ переключить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑеÑÑии на \"%s\": %s" +msgstr "не удалоÑÑŒ переключить Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑеанÑа на \"%s\": %s" + +#: pg_backup_archiver.c:3458 +#, c-format +msgid "could not set \"search_path\" to \"%s\": %s" +msgstr "не удалоÑÑŒ приÑвоить \"search_path\" значение \"%s\": %s" -#: pg_backup_archiver.c:3285 +#: pg_backup_archiver.c:3519 #, c-format -msgid "could not set search_path to \"%s\": %s" -msgstr "не удалоÑÑŒ приÑвоить search_path значение \"%s\": %s" +msgid "could not set \"default_tablespace\" to %s: %s" +msgstr "не удалоÑÑŒ задать Ð´Ð»Ñ \"default_tablespace\" значение %s: %s" -#: pg_backup_archiver.c:3347 +#: pg_backup_archiver.c:3568 #, c-format -msgid "could not set default_tablespace to %s: %s" -msgstr "не удалоÑÑŒ задать Ð´Ð»Ñ default_tablespace значение %s: %s" +msgid "could not set \"default_table_access_method\": %s" +msgstr "не удалоÑÑŒ задать \"default_table_access_method\": %s" -#: pg_backup_archiver.c:3397 +#: pg_backup_archiver.c:3617 #, c-format -msgid "could not set default_table_access_method: %s" -msgstr "не удалоÑÑŒ задать default_table_access_method: %s" +msgid "could not alter table access method: %s" +msgstr "не удалоÑÑŒ изменить табличный метод доÑтупа: %s" -#: pg_backup_archiver.c:3491 pg_backup_archiver.c:3656 +#: pg_backup_archiver.c:3718 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "неизвеÑтно, как назначить владельца Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° типа \"%s\"" -#: pg_backup_archiver.c:3759 +#: pg_backup_archiver.c:4005 #, c-format msgid "did not find magic string in file header" msgstr "в заголовке файла не найдена Ð½ÑƒÐ¶Ð½Ð°Ñ Ñигнатура" -#: pg_backup_archiver.c:3773 +#: pg_backup_archiver.c:4019 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ (%d.%d) в заголовке файла" -#: pg_backup_archiver.c:3778 +#: pg_backup_archiver.c:4024 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "неÑоответÑтвие размера integer (%lu)" -#: pg_backup_archiver.c:3782 +#: pg_backup_archiver.c:4028 #, c-format msgid "" "archive was made on a machine with larger integers, some operations might " @@ -883,82 +1120,82 @@ msgstr "" "архив был Ñделан на компьютере большей разрÑдноÑти -- возможен Ñбой " "некоторых операций" -#: pg_backup_archiver.c:3792 +#: pg_backup_archiver.c:4038 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "ожидаемый формат (%d) отличаетÑÑ Ð¾Ñ‚ формата, указанного в файле (%d)" -#: pg_backup_archiver.c:3807 +#: pg_backup_archiver.c:4060 #, c-format msgid "" -"archive is compressed, but this installation does not support compression -- " -"no data will be available" +"archive is compressed, but this installation does not support compression " +"(%s) -- no data will be available" msgstr "" -"архив Ñжат, но уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð½Ðµ поддерживает Ñжатие -- данные " -"недоÑтупны" +"архив Ñжат, но уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð½Ðµ поддерживает Ñжатие (%s) -- данные " +"будут недоÑтупны" -#: pg_backup_archiver.c:3841 +#: pg_backup_archiver.c:4096 #, c-format msgid "invalid creation date in header" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð² заголовке" -#: pg_backup_archiver.c:3975 +#: pg_backup_archiver.c:4230 #, c-format msgid "processing item %d %s %s" msgstr "обработка объекта %d %s %s" -#: pg_backup_archiver.c:4054 +#: pg_backup_archiver.c:4315 #, c-format msgid "entering main parallel loop" msgstr "вход в оÑновной параллельный цикл" -#: pg_backup_archiver.c:4065 +#: pg_backup_archiver.c:4326 #, c-format msgid "skipping item %d %s %s" msgstr "объект %d %s %s пропуÑкаетÑÑ" -#: pg_backup_archiver.c:4074 +#: pg_backup_archiver.c:4335 #, c-format msgid "launching item %d %s %s" msgstr "объект %d %s %s запуÑкаетÑÑ" -#: pg_backup_archiver.c:4128 +#: pg_backup_archiver.c:4389 #, c-format msgid "finished main parallel loop" msgstr "оÑновной параллельный цикл закончен" -#: pg_backup_archiver.c:4164 +#: pg_backup_archiver.c:4425 #, c-format msgid "processing missed item %d %s %s" msgstr "обработка пропущенного объекта %d %s %s" -#: pg_backup_archiver.c:4769 +#: pg_backup_archiver.c:4967 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "Ñоздать таблицу \"%s\" не удалоÑÑŒ, её данные не будут воÑÑтановлены" -#: pg_backup_custom.c:376 pg_backup_null.c:147 +#: pg_backup_custom.c:376 pg_backup_null.c:143 #, c-format msgid "invalid OID for large object" msgstr "неверный OID большого объекта" -#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629 -#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021 +#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:636 +#: pg_backup_custom.c:870 pg_backup_tar.c:1029 pg_backup_tar.c:1034 #, c-format msgid "error during file seek: %m" msgstr "ошибка при перемещении в файле: %m" -#: pg_backup_custom.c:478 +#: pg_backup_custom.c:480 #, c-format msgid "data block %d has wrong seek position" msgstr "в блоке данных %d задана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ" -#: pg_backup_custom.c:495 +#: pg_backup_custom.c:497 #, c-format msgid "unrecognized data block type (%d) while searching archive" msgstr "нераÑпознанный тип блока данных (%d) при поиÑке архива" -#: pg_backup_custom.c:517 +#: pg_backup_custom.c:519 #, c-format msgid "" "could not find block ID %d in archive -- possibly due to out-of-order " @@ -968,59 +1205,54 @@ msgstr "" "поÑледовательного запроÑа воÑÑтановлениÑ, который Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ñ‚ÑŒ Ñ " "файлом, не допуÑкающим произвольный доÑтуп" -#: pg_backup_custom.c:522 +#: pg_backup_custom.c:524 #, c-format msgid "could not find block ID %d in archive -- possibly corrupt archive" msgstr "не удалоÑÑŒ найти в архиве блок Ñ ID %d -- возможно, архив иÑпорчен" -#: pg_backup_custom.c:529 +#: pg_backup_custom.c:531 #, c-format msgid "found unexpected block ID (%d) when reading data -- expected %d" msgstr "при чтении данных получен неожиданный ID блока (%d) -- ожидалÑÑ: %d" -#: pg_backup_custom.c:543 +#: pg_backup_custom.c:545 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "нераÑпознанный тип блока данных %d при воÑÑтановлении архива" -#: pg_backup_custom.c:645 -#, c-format -msgid "could not read from input file: %m" -msgstr "не удалоÑÑŒ прочитать входной файл: %m" - -#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943 -#: pg_backup_tar.c:1019 +#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:945 +#: pg_backup_tar.c:1032 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "не удалоÑÑŒ определить позицию в файле архива: %m" -#: pg_backup_custom.c:762 pg_backup_custom.c:802 +#: pg_backup_custom.c:767 pg_backup_custom.c:807 #, c-format msgid "could not close archive file: %m" msgstr "не удалоÑÑŒ закрыть файл архива: %m" -#: pg_backup_custom.c:785 +#: pg_backup_custom.c:790 #, c-format msgid "can only reopen input archives" msgstr "повторно открыть можно только входные файлы" -#: pg_backup_custom.c:792 +#: pg_backup_custom.c:797 #, c-format msgid "parallel restore from standard input is not supported" msgstr "параллельное воÑÑтановление из Ñтандартного ввода не поддерживаетÑÑ" -#: pg_backup_custom.c:794 +#: pg_backup_custom.c:799 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "" "параллельное воÑÑтановление возможно только Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ произвольного доÑтупа" -#: pg_backup_custom.c:810 +#: pg_backup_custom.c:815 #, c-format msgid "could not set seek position in archive file: %m" msgstr "не удалоÑÑŒ задать текущую позицию в файле архива: %m" -#: pg_backup_custom.c:889 +#: pg_backup_custom.c:894 #, c-format msgid "compressor active" msgstr "Ñжатие активно" @@ -1030,12 +1262,12 @@ msgstr "Ñжатие активно" msgid "could not get server_version from libpq" msgstr "не удалоÑÑŒ получить верÑию Ñервера из libpq" -#: pg_backup_db.c:53 pg_dumpall.c:1646 +#: pg_backup_db.c:53 pg_dumpall.c:1879 #, c-format msgid "aborting because of server version mismatch" msgstr "продолжение работы Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ верÑией Ñервера невозможно" -#: pg_backup_db.c:54 pg_dumpall.c:1647 +#: pg_backup_db.c:54 pg_dumpall.c:1880 #, c-format msgid "server version: %s; %s version: %s" msgstr "верÑÐ¸Ñ Ñервера: %s; верÑÐ¸Ñ %s: %s" @@ -1045,7 +1277,7 @@ msgstr "верÑÐ¸Ñ Ñервера: %s; верÑÐ¸Ñ %s: %s" msgid "already connected to a database" msgstr "подключение к базе данных уже уÑтановлено" -#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1726 pg_dumpall.c:1828 msgid "Password: " msgstr "Пароль: " @@ -1059,22 +1291,23 @@ msgstr "не удалоÑÑŒ переподключитьÑÑ Ðº базе" msgid "reconnection failed: %s" msgstr "переподключитьÑÑ Ð½Ðµ удалоÑÑŒ: %s" -#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:788 pg_dump_sort.c:1213 +#: pg_dump_sort.c:1233 pg_dumpall.c:1753 pg_dumpall.c:1837 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732 +#: pg_backup_db.c:271 pg_dumpall.c:1942 pg_dumpall.c:1965 #, c-format msgid "query failed: %s" msgstr "ошибка при выполнении запроÑа: %s" -#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733 +#: pg_backup_db.c:273 pg_dumpall.c:1943 pg_dumpall.c:1966 #, c-format msgid "Query was: %s" msgstr "ВыполнÑлÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñ: %s" -#: pg_backup_db.c:316 +#: pg_backup_db.c:315 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" @@ -1083,187 +1316,182 @@ msgstr[1] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d Ñтроки вмеÑто одной: %s msgstr[2] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d Ñтрок вмеÑто одной: %s" # skip-rule: language-mix -#: pg_backup_db.c:352 +#: pg_backup_db.c:351 #, c-format msgid "%s: %sCommand was: %s" msgstr "%s: %sВыполнÑлаÑÑŒ команда: %s" -#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489 +#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488 msgid "could not execute query" msgstr "не удалоÑÑŒ выполнить запроÑ" -#: pg_backup_db.c:461 +#: pg_backup_db.c:460 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "ошибка в PQputCopyData: %s" -#: pg_backup_db.c:510 +#: pg_backup_db.c:509 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "ошибка в PQputCopyEnd: %s" -#: pg_backup_db.c:516 +#: pg_backup_db.c:515 #, c-format msgid "COPY failed for table \"%s\": %s" msgstr "Ñбой команды COPY Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\": %s" -#: pg_backup_db.c:522 pg_dump.c:2105 +#: pg_backup_db.c:521 pg_dump.c:2284 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "неожиданные лишние результаты получены при COPY Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\"" -#: pg_backup_db.c:534 +#: pg_backup_db.c:533 msgid "could not start database transaction" msgstr "не удаётÑÑ Ð½Ð°Ñ‡Ð°Ñ‚ÑŒ транзакцию" -#: pg_backup_db.c:542 +#: pg_backup_db.c:541 msgid "could not commit database transaction" msgstr "не удалоÑÑŒ зафикÑировать транзакцию" -#: pg_backup_directory.c:156 +#: pg_backup_directory.c:153 #, c-format msgid "no output directory specified" msgstr "выходной каталог не указан" -#: pg_backup_directory.c:185 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" - -#: pg_backup_directory.c:189 +#: pg_backup_directory.c:186 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не удалоÑÑŒ закрыть каталог \"%s\": %m" -#: pg_backup_directory.c:195 +#: pg_backup_directory.c:192 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m" -#: pg_backup_directory.c:355 pg_backup_directory.c:497 -#: pg_backup_directory.c:533 +#: pg_backup_directory.c:357 pg_backup_directory.c:506 +#: pg_backup_directory.c:544 #, c-format msgid "could not write to output file: %s" msgstr "не удалоÑÑŒ запиÑать в выходной файл: %s" -#: pg_backup_directory.c:373 +#: pg_backup_directory.c:375 #, c-format msgid "could not close data file: %m" msgstr "не удалоÑÑŒ закрыть файл данных: %m" -#: pg_backup_directory.c:407 +#: pg_backup_directory.c:408 #, c-format msgid "could not close data file \"%s\": %m" msgstr "не удалоÑÑŒ закрыть файл данных \"%s\": %m" -#: pg_backup_directory.c:447 +#: pg_backup_directory.c:455 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "" "не удалоÑÑŒ открыть Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð» Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов \"%s\": %m" -#: pg_backup_directory.c:458 +#: pg_backup_directory.c:466 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтрока в файле Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов \"%s\": \"%s\"" -#: pg_backup_directory.c:467 +#: pg_backup_directory.c:475 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов \"%s\"" -#: pg_backup_directory.c:471 +#: pg_backup_directory.c:479 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "не удалоÑÑŒ закрыть файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов \"%s\": %m" -#: pg_backup_directory.c:685 +#: pg_backup_directory.c:702 #, c-format -msgid "could not close blob data file: %m" -msgstr "не удалоÑÑŒ закрыть файл данных BLOB: %m" +msgid "could not close LO data file: %m" +msgstr "не удалоÑÑŒ закрыть файл данных LO: %m" -#: pg_backup_directory.c:691 +#: pg_backup_directory.c:712 #, c-format -msgid "could not write to blobs TOC file" -msgstr "не удалоÑÑŒ запиÑать в файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов" +msgid "could not write to LOs TOC file: %s" +msgstr "не удалоÑÑŒ запиÑать в файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ LO: %s" -#: pg_backup_directory.c:705 +#: pg_backup_directory.c:728 #, c-format -msgid "could not close blobs TOC file: %m" -msgstr "не удалоÑÑŒ закрыть файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ BLOB: %m" +msgid "could not close LOs TOC file: %m" +msgstr "не удалоÑÑŒ закрыть файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ LO: %m" -#: pg_backup_directory.c:724 +#: pg_backup_directory.c:747 #, c-format msgid "file name too long: \"%s\"" msgstr "Ñлишком длинное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°: \"%s\"" -#: pg_backup_null.c:74 +#: pg_backup_null.c:70 #, c-format msgid "this format cannot be read" msgstr "Ñтот формат Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ" -#: pg_backup_tar.c:172 +#: pg_backup_tar.c:168 #, c-format msgid "could not open TOC file \"%s\" for output: %m" msgstr "не удалоÑÑŒ открыть Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\": %m" -#: pg_backup_tar.c:179 +#: pg_backup_tar.c:175 #, c-format msgid "could not open TOC file for output: %m" msgstr "не удалоÑÑŒ открыть Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи файл оглавлениÑ: %m" -#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 -#: pg_backup_tar.c:405 pg_backup_tar.c:893 +#: pg_backup_tar.c:194 pg_backup_tar.c:330 pg_backup_tar.c:385 +#: pg_backup_tar.c:401 pg_backup_tar.c:906 #, c-format msgid "compression is not supported by tar archive format" msgstr "формат архива tar не поддерживает Ñжатие" -#: pg_backup_tar.c:206 +#: pg_backup_tar.c:202 #, c-format msgid "could not open TOC file \"%s\" for input: %m" msgstr "не удалоÑÑŒ открыть Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð» Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\": %m" -#: pg_backup_tar.c:213 +#: pg_backup_tar.c:209 #, c-format msgid "could not open TOC file for input: %m" msgstr "не удалоÑÑŒ открыть Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð» оглавлениÑ: %m" -#: pg_backup_tar.c:322 +#: pg_backup_tar.c:318 #, c-format msgid "could not find file \"%s\" in archive" msgstr "не удалоÑÑŒ найти файл \"%s\" в архиве" -#: pg_backup_tar.c:382 +#: pg_backup_tar.c:378 #, c-format msgid "could not generate temporary file name: %m" msgstr "не удалоÑÑŒ получить Ð¸Ð¼Ñ Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð³Ð¾ файла: %m" -#: pg_backup_tar.c:624 +#: pg_backup_tar.c:619 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "недопуÑтимый ÑинтакÑÐ¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° COPY: \"%s\"" -#: pg_backup_tar.c:890 +#: pg_backup_tar.c:903 #, c-format msgid "invalid OID for large object (%u)" msgstr "неверный OID Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð³Ð¾ объекта (%u)" -#: pg_backup_tar.c:1035 +#: pg_backup_tar.c:1048 #, c-format msgid "could not close temporary file: %m" msgstr "не удалоÑÑŒ закрыть временный файл: %m" -#: pg_backup_tar.c:1038 +#: pg_backup_tar.c:1051 #, c-format msgid "actual file length (%lld) does not match expected (%lld)" msgstr "дейÑÑ‚Ð²Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° файла (%lld) не равна ожидаемой (%lld)" -#: pg_backup_tar.c:1084 pg_backup_tar.c:1115 +#: pg_backup_tar.c:1097 pg_backup_tar.c:1128 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "в архиве tar не найден заголовок Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\"" -#: pg_backup_tar.c:1102 +#: pg_backup_tar.c:1115 #, c-format msgid "" "restoring data out of order is not supported in this archive format: \"%s\" " @@ -1273,7 +1501,7 @@ msgstr "" "поддерживаетÑÑ: требуетÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚ \"%s\", но в файле архива прежде идёт " "\"%s\"." -#: pg_backup_tar.c:1149 +#: pg_backup_tar.c:1162 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" @@ -1281,7 +1509,7 @@ msgstr[0] "найден неполный заголовок tar (размер %l msgstr[1] "найден неполный заголовок tar (размер %lu байта)" msgstr[2] "найден неполный заголовок tar (размер %lu байт)" -#: pg_backup_tar.c:1188 +#: pg_backup_tar.c:1201 #, c-format msgid "" "corrupt tar header found in %s (expected %d, computed %d) file position %llu" @@ -1294,10 +1522,10 @@ msgstr "" msgid "unrecognized section name: \"%s\"" msgstr "нераÑпознанное Ð¸Ð¼Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð°: \"%s\"" -#: pg_backup_utils.c:55 pg_dump.c:627 pg_dump.c:644 pg_dumpall.c:340 -#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373 -#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307 -#: pg_restore.c:321 +#: pg_backup_utils.c:55 pg_dump.c:694 pg_dump.c:711 pg_dumpall.c:370 +#: pg_dumpall.c:380 pg_dumpall.c:388 pg_dumpall.c:396 pg_dumpall.c:403 +#: pg_dumpall.c:413 pg_dumpall.c:488 pg_restore.c:307 pg_restore.c:323 +#: pg_restore.c:337 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." @@ -1307,41 +1535,41 @@ msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробу msgid "out of on_exit_nicely slots" msgstr "превышен предел обработчиков штатного выхода" -#: pg_dump.c:642 pg_dumpall.c:348 pg_restore.c:305 +#: pg_dump.c:709 pg_dumpall.c:378 pg_restore.c:321 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")" -#: pg_dump.c:661 pg_restore.c:328 +#: pg_dump.c:728 pg_restore.c:344 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "параметры -s/--schema-only и -a/--data-only иÑключают друг друга" -#: pg_dump.c:664 +#: pg_dump.c:731 #, c-format msgid "" "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "" "параметры -s/--schema-only и --include-foreign-data иÑключают друг друга" -#: pg_dump.c:667 +#: pg_dump.c:734 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "" "параметр --include-foreign-data не поддерживаетÑÑ Ð¿Ñ€Ð¸ копировании в " "параллельном режиме" -#: pg_dump.c:670 pg_restore.c:331 +#: pg_dump.c:737 pg_restore.c:347 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "параметры -c/--clean и -a/--data-only иÑключают друг друга" -#: pg_dump.c:673 pg_dumpall.c:378 pg_restore.c:356 +#: pg_dump.c:740 pg_dumpall.c:408 pg_restore.c:375 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "параметр --if-exists требует ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ -c/--clean" -#: pg_dump.c:680 +#: pg_dump.c:747 #, c-format msgid "" "option --on-conflict-do-nothing requires option --inserts, --rows-per-" @@ -1350,43 +1578,49 @@ msgstr "" "параметр --on-conflict-do-nothing требует ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ --inserts, --rows-per-" "insert или --column-inserts" -#: pg_dump.c:702 +#: pg_dump.c:776 #, c-format -msgid "" -"requested compression not available in this installation -- archive will be " -"uncompressed" -msgstr "" -"уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ не поддерживает Ñжатие -- архив не будет " -"ÑжиматьÑÑ" +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "нераÑпознанный алгоритм ÑжатиÑ: \"%s\"" + +#: pg_dump.c:783 +#, c-format +msgid "invalid compression specification: %s" +msgstr "неправильное указание ÑжатиÑ: %s" + +#: pg_dump.c:796 +#, c-format +msgid "compression option \"%s\" is not currently supported by pg_dump" +msgstr "pg_dump в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ поддерживает параметр ÑÐ¶Ð°Ñ‚Ð¸Ñ \"%s\"" -#: pg_dump.c:715 +#: pg_dump.c:808 #, c-format msgid "parallel backup only supported by the directory format" msgstr "" "параллельное резервное копирование поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¾Ð¼ " "\"каталог\"" -#: pg_dump.c:761 +#: pg_dump.c:854 #, c-format msgid "last built-in OID is %u" msgstr "поÑледний ÑиÑтемный OID: %u" -#: pg_dump.c:770 +#: pg_dump.c:863 #, c-format msgid "no matching schemas were found" msgstr "ÑоответÑтвующие Ñхемы не найдены" -#: pg_dump.c:784 +#: pg_dump.c:880 #, c-format msgid "no matching tables were found" msgstr "ÑоответÑтвующие таблицы не найдены" -#: pg_dump.c:806 +#: pg_dump.c:908 #, c-format msgid "no matching extensions were found" msgstr "ÑоответÑтвующие раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ найдены" -#: pg_dump.c:989 +#: pg_dump.c:1092 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1395,17 +1629,17 @@ msgstr "" "%s ÑохранÑет резервную копию БД в текÑтовом файле или другом виде.\n" "\n" -#: pg_dump.c:990 pg_dumpall.c:605 pg_restore.c:433 +#: pg_dump.c:1093 pg_dumpall.c:636 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "ИÑпользование:\n" -#: pg_dump.c:991 +#: pg_dump.c:1094 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [ПÐРÐМЕТР]... [ИМЯ_БД]\n" -#: pg_dump.c:993 pg_dumpall.c:608 pg_restore.c:436 +#: pg_dump.c:1096 pg_dumpall.c:639 pg_restore.c:455 #, c-format msgid "" "\n" @@ -1414,12 +1648,12 @@ msgstr "" "\n" "Общие параметры:\n" -#: pg_dump.c:994 +#: pg_dump.c:1097 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=ИМЯ Ð¸Ð¼Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð¾Ð³Ð¾ файла или каталога\n" -#: pg_dump.c:995 +#: pg_dump.c:1098 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1429,7 +1663,7 @@ msgstr "" " (пользовательÑкий | каталог | tar |\n" " текÑтовый (по умолчанию))\n" -#: pg_dump.c:997 +#: pg_dump.c:1100 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr "" @@ -1437,23 +1671,27 @@ msgstr "" "чиÑло\n" " заданий\n" -#: pg_dump.c:998 pg_dumpall.c:610 +#: pg_dump.c:1101 pg_dumpall.c:641 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose режим подробных Ñообщений\n" -#: pg_dump.c:999 pg_dumpall.c:611 +#: pg_dump.c:1102 pg_dumpall.c:642 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: pg_dump.c:1000 +# well-spelled: ИÐФО +#: pg_dump.c:1103 #, c-format msgid "" -" -Z, --compress=0-9 compression level for compressed formats\n" -msgstr " -Z, --compress=0-9 уровень ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¿Ñ€Ð¸ архивации\n" +" -Z, --compress=METHOD[:DETAIL]\n" +" compress as specified\n" +msgstr "" +" -Z, --compress=МЕТОД[:ДОП_ИÐФО]\n" +" выполнÑть Ñжатие как указано\n" -#: pg_dump.c:1001 pg_dumpall.c:612 +#: pg_dump.c:1105 pg_dumpall.c:643 #, c-format msgid "" " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" @@ -1461,7 +1699,7 @@ msgstr "" " --lock-wait-timeout=ТÐЙМ-ÐУТ прервать операцию при тайм-ауте блокировки " "таблицы\n" -#: pg_dump.c:1002 pg_dumpall.c:639 +#: pg_dump.c:1106 pg_dumpall.c:671 #, c-format msgid "" " --no-sync do not wait for changes to be written safely " @@ -1470,12 +1708,17 @@ msgstr "" " --no-sync не ждать надёжного ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ на " "диÑке\n" -#: pg_dump.c:1003 pg_dumpall.c:613 +#: pg_dump.c:1107 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=МЕТОД метод Ñинхронизации файлов Ñ Ð¤Ð¡\n" + +#: pg_dump.c:1108 pg_dumpall.c:644 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: pg_dump.c:1005 pg_dumpall.c:614 +#: pg_dump.c:1110 pg_dumpall.c:645 #, c-format msgid "" "\n" @@ -1484,22 +1727,35 @@ msgstr "" "\n" "Параметры, управлÑющие выводом:\n" -#: pg_dump.c:1006 pg_dumpall.c:615 +#: pg_dump.c:1111 pg_dumpall.c:646 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only выгрузить только данные, без Ñхемы\n" -#: pg_dump.c:1007 +#: pg_dump.c:1112 +#, c-format +msgid " -b, --large-objects include large objects in dump\n" +msgstr " -b, --large-objects выгрузить большие объекты\n" + +#: pg_dump.c:1113 #, c-format -msgid " -b, --blobs include large objects in dump\n" -msgstr " -b, --blobs выгрузить также большие объекты\n" +msgid " --blobs (same as --large-objects, deprecated)\n" +msgstr "" +" --blobs (уÑÑ‚Ð°Ñ€ÐµÐ²ÑˆÐ°Ñ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð° --large-objects)\n" -#: pg_dump.c:1008 +#: pg_dump.c:1114 #, c-format -msgid " -B, --no-blobs exclude large objects in dump\n" -msgstr " -B, --no-blobs иÑключить из выгрузки большие объекты\n" +msgid " -B, --no-large-objects exclude large objects in dump\n" +msgstr " -B, --no-large-objects иÑключить из выгрузки большие объекты\n" -#: pg_dump.c:1009 pg_restore.c:447 +#: pg_dump.c:1115 +#, c-format +msgid "" +" --no-blobs (same as --no-large-objects, deprecated)\n" +msgstr "" +" --no-blobs (уÑÑ‚Ð°Ñ€ÐµÐ²ÑˆÐ°Ñ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð° --no-large-objects)\n" + +#: pg_dump.c:1116 pg_restore.c:466 #, c-format msgid "" " -c, --clean clean (drop) database objects before " @@ -1508,7 +1764,7 @@ msgstr "" " -c, --clean очиÑтить (удалить) объекты БД при " "воÑÑтановлении\n" -#: pg_dump.c:1010 +#: pg_dump.c:1117 #, c-format msgid "" " -C, --create include commands to create database in dump\n" @@ -1516,28 +1772,28 @@ msgstr "" " -C, --create добавить в копию команды ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð°Ð·Ñ‹ " "данных\n" -#: pg_dump.c:1011 +#: pg_dump.c:1118 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr "" " -e, --extension=ШÐБЛОРвыгрузить только указанное раÑширение(Ñ)\n" -#: pg_dump.c:1012 pg_dumpall.c:617 +#: pg_dump.c:1119 pg_dumpall.c:648 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=КОДИРОВКРвыгружать данные в заданной кодировке\n" -#: pg_dump.c:1013 +#: pg_dump.c:1120 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=ШÐБЛОРвыгрузить только указанную Ñхему(Ñ‹)\n" -#: pg_dump.c:1014 +#: pg_dump.c:1121 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=ШÐБЛОРÐЕ выгружать указанную Ñхему(Ñ‹)\n" -#: pg_dump.c:1015 +#: pg_dump.c:1122 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1546,12 +1802,12 @@ msgstr "" " -O, --no-owner не воÑÑтанавливать владение объектами\n" " при иÑпользовании текÑтового формата\n" -#: pg_dump.c:1017 pg_dumpall.c:621 +#: pg_dump.c:1124 pg_dumpall.c:652 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only выгрузить только Ñхему, без данных\n" -#: pg_dump.c:1018 +#: pg_dump.c:1125 #, c-format msgid "" " -S, --superuser=NAME superuser user name to use in plain-text " @@ -1560,27 +1816,27 @@ msgstr "" " -S, --superuser=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, который будет задейÑтвован\n" " при воÑÑтановлении из текÑтового формата\n" -#: pg_dump.c:1019 +#: pg_dump.c:1126 #, c-format -msgid " -t, --table=PATTERN dump the specified table(s) only\n" +msgid " -t, --table=PATTERN dump only the specified table(s)\n" msgstr " -t, --table=ШÐБЛОРвыгрузить только указанную таблицу(Ñ‹)\n" -#: pg_dump.c:1020 +#: pg_dump.c:1127 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=ШÐБЛОРÐЕ выгружать указанную таблицу(Ñ‹)\n" -#: pg_dump.c:1021 pg_dumpall.c:624 +#: pg_dump.c:1128 pg_dumpall.c:655 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges не выгружать права (назначение/отзыв)\n" -#: pg_dump.c:1022 pg_dumpall.c:625 +#: pg_dump.c:1129 pg_dumpall.c:656 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade только Ð´Ð»Ñ ÑƒÑ‚Ð¸Ð»Ð¸Ñ‚ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð‘Ð”\n" -#: pg_dump.c:1023 pg_dumpall.c:626 +#: pg_dump.c:1130 pg_dumpall.c:657 #, c-format msgid "" " --column-inserts dump data as INSERT commands with column " @@ -1589,7 +1845,7 @@ msgstr "" " --column-inserts выгружать данные в виде INSERT Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ " "Ñтолбцов\n" -#: pg_dump.c:1024 pg_dumpall.c:627 +#: pg_dump.c:1131 pg_dumpall.c:658 #, c-format msgid "" " --disable-dollar-quoting disable dollar quoting, use SQL standard " @@ -1598,7 +1854,7 @@ msgstr "" " --disable-dollar-quoting отключить ÑпецÑтроки Ñ $, выводить Ñтроки\n" " по Ñтандарту SQL\n" -#: pg_dump.c:1025 pg_dumpall.c:628 pg_restore.c:464 +#: pg_dump.c:1132 pg_dumpall.c:659 pg_restore.c:483 #, c-format msgid "" " --disable-triggers disable triggers during data-only restore\n" @@ -1606,7 +1862,7 @@ msgstr "" " --disable-triggers отключить триггеры при воÑÑтановлении\n" " только данных, без Ñхемы\n" -#: pg_dump.c:1026 +#: pg_dump.c:1133 #, c-format msgid "" " --enable-row-security enable row security (dump only content user " @@ -1617,7 +1873,24 @@ msgstr "" "только\n" " те данные, которые доÑтупны пользователю)\n" -#: pg_dump.c:1028 +#: pg_dump.c:1135 +#, c-format +msgid " --exclude-extension=PATTERN do NOT dump the specified extension(s)\n" +msgstr " --exclude-extension=ШÐБЛОРÐЕ выгружать указанное раÑширение(Ñ)\n" + +#: pg_dump.c:1136 +#, c-format +msgid "" +" --exclude-table-and-children=PATTERN\n" +" do NOT dump the specified table(s), " +"including\n" +" child and partition tables\n" +msgstr "" +" --exclude-table-and-children=ШÐБЛОÐ\n" +" ÐЕ выгружать указанную таблицу(Ñ‹), а также\n" +" её Ñекции и дочерние таблицы\n" + +#: pg_dump.c:1139 #, c-format msgid "" " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" @@ -1625,7 +1898,19 @@ msgstr "" " --exclude-table-data=ШÐБЛОРÐЕ выгружать данные указанной таблицы " "(таблиц)\n" -#: pg_dump.c:1029 pg_dumpall.c:630 +#: pg_dump.c:1140 +#, c-format +msgid "" +" --exclude-table-data-and-children=PATTERN\n" +" do NOT dump data for the specified table(s),\n" +" including child and partition tables\n" +msgstr "" +" --exclude-table-data-and-children=ШÐБЛОÐ\n" +" ÐЕ выгружать данные указанной таблицы " +"(таблиц),\n" +" а также её Ñекций и дочерних таблиц\n" + +#: pg_dump.c:1143 pg_dumpall.c:661 #, c-format msgid "" " --extra-float-digits=NUM override default setting for " @@ -1633,13 +1918,24 @@ msgid "" msgstr "" " --extra-float-digits=ЧИСЛО переопределить значение extra_float_digits\n" -#: pg_dump.c:1030 pg_dumpall.c:631 pg_restore.c:466 +#: pg_dump.c:1144 +#, c-format +msgid "" +" --filter=FILENAME include or exclude objects and data from " +"dump\n" +" based on expressions in FILENAME\n" +msgstr "" +" --filter=ИМЯ_ФÐЙЛРвключать или иÑключать объекты и данные из\n" +" дампа в ÑоответÑтвии Ñ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñми в Ñтом " +"файле\n" + +#: pg_dump.c:1146 pg_dumpall.c:663 pg_restore.c:487 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr "" " --if-exists применÑть IF EXISTS при удалении объектов\n" -#: pg_dump.c:1031 +#: pg_dump.c:1147 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1650,7 +1946,7 @@ msgstr "" " включать в копию данные Ñторонних таблиц Ñ\n" " Ñерверов Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸, подпадающими под ШÐБЛОÐ\n" -#: pg_dump.c:1034 pg_dumpall.c:632 +#: pg_dump.c:1150 pg_dumpall.c:664 #, c-format msgid "" " --inserts dump data as INSERT commands, rather than " @@ -1659,57 +1955,57 @@ msgstr "" " --inserts выгрузить данные в виде команд INSERT, не " "COPY\n" -#: pg_dump.c:1035 pg_dumpall.c:633 +#: pg_dump.c:1151 pg_dumpall.c:665 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr "" " --load-via-partition-root загружать Ñекции через главную таблицу\n" -#: pg_dump.c:1036 pg_dumpall.c:634 +#: pg_dump.c:1152 pg_dumpall.c:666 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments не выгружать комментарии\n" -#: pg_dump.c:1037 pg_dumpall.c:635 +#: pg_dump.c:1153 pg_dumpall.c:667 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications не выгружать публикации\n" -#: pg_dump.c:1038 pg_dumpall.c:637 +#: pg_dump.c:1154 pg_dumpall.c:669 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr "" " --no-security-labels не выгружать Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ðº безопаÑноÑти\n" -#: pg_dump.c:1039 pg_dumpall.c:638 +#: pg_dump.c:1155 pg_dumpall.c:670 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions не выгружать подпиÑки\n" -#: pg_dump.c:1040 pg_dumpall.c:640 +#: pg_dump.c:1156 pg_dumpall.c:672 #, c-format msgid " --no-table-access-method do not dump table access methods\n" msgstr " --no-table-access-method не выгружать табличные методы доÑтупа\n" -#: pg_dump.c:1041 pg_dumpall.c:641 +#: pg_dump.c:1157 pg_dumpall.c:673 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr "" " --no-tablespaces не выгружать Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… " "проÑтранÑтв\n" -#: pg_dump.c:1042 pg_dumpall.c:642 +#: pg_dump.c:1158 pg_dumpall.c:674 #, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" msgstr " --no-toast-compression не выгружать методы ÑÐ¶Ð°Ñ‚Ð¸Ñ TOAST\n" -#: pg_dump.c:1043 pg_dumpall.c:643 +#: pg_dump.c:1159 pg_dumpall.c:675 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr "" " --no-unlogged-table-data не выгружать данные нежурналируемых таблиц\n" -#: pg_dump.c:1044 pg_dumpall.c:644 +#: pg_dump.c:1160 pg_dumpall.c:676 #, c-format msgid "" " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT " @@ -1718,7 +2014,7 @@ msgstr "" " --on-conflict-do-nothing добавлÑть ON CONFLICT DO NOTHING в команды " "INSERT\n" -#: pg_dump.c:1045 pg_dumpall.c:645 +#: pg_dump.c:1161 pg_dumpall.c:677 #, c-format msgid "" " --quote-all-identifiers quote all identifiers, even if not key words\n" @@ -1726,7 +2022,7 @@ msgstr "" " --quote-all-identifiers заключать в кавычки вÑе идентификаторы,\n" " а не только ключевые Ñлова\n" -#: pg_dump.c:1046 pg_dumpall.c:646 +#: pg_dump.c:1162 pg_dumpall.c:678 #, c-format msgid "" " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" @@ -1734,7 +2030,7 @@ msgstr "" " --rows-per-insert=ЧИСЛО чиÑло Ñтрок в одном INSERT; подразумевает --" "inserts\n" -#: pg_dump.c:1047 +#: pg_dump.c:1163 #, c-format msgid "" " --section=SECTION dump named section (pre-data, data, or post-" @@ -1743,7 +2039,7 @@ msgstr "" " --section=РÐЗДЕЛ выгрузить заданный раздел\n" " (pre-data, data или post-data)\n" -#: pg_dump.c:1048 +#: pg_dump.c:1164 #, c-format msgid "" " --serializable-deferrable wait until the dump can run without " @@ -1752,13 +2048,13 @@ msgstr "" " --serializable-deferrable дождатьÑÑ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° Ð´Ð»Ñ Ð²Ñ‹Ð³Ñ€ÑƒÐ·ÐºÐ¸ данных без " "аномалий\n" -#: pg_dump.c:1049 +#: pg_dump.c:1165 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr "" " --snapshot=СÐИМОК иÑпользовать при выгрузке заданный Ñнимок\n" -#: pg_dump.c:1050 pg_restore.c:476 +#: pg_dump.c:1166 pg_restore.c:497 #, c-format msgid "" " --strict-names require table and/or schema include patterns " @@ -1771,7 +2067,17 @@ msgstr "" "минимум\n" " один объект\n" -#: pg_dump.c:1052 pg_dumpall.c:647 pg_restore.c:478 +#: pg_dump.c:1168 +#, c-format +msgid "" +" --table-and-children=PATTERN dump only the specified table(s), including\n" +" child and partition tables\n" +msgstr "" +" --table-and-children=ШÐБЛОРвыгрузить только указанную таблицу(Ñ‹), а " +"также\n" +" её Ñекции и дочерние таблицы\n" + +#: pg_dump.c:1170 pg_dumpall.c:679 pg_restore.c:500 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1783,7 +2089,7 @@ msgstr "" " уÑтанавливать владельца, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹\n" " SET SESSION AUTHORIZATION вмеÑто ALTER OWNER\n" -#: pg_dump.c:1056 pg_dumpall.c:651 pg_restore.c:482 +#: pg_dump.c:1174 pg_dumpall.c:683 pg_restore.c:504 #, c-format msgid "" "\n" @@ -1792,33 +2098,34 @@ msgstr "" "\n" "Параметры подключениÑ:\n" -#: pg_dump.c:1057 +#: pg_dump.c:1175 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=БД Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ð´Ð»Ñ Ð²Ñ‹Ð³Ñ€ÑƒÐ·ÐºÐ¸\n" -#: pg_dump.c:1058 pg_dumpall.c:653 pg_restore.c:483 +#: pg_dump.c:1176 pg_dumpall.c:685 pg_restore.c:505 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог Ñокетов\n" +" -h, --host=ИМЯ компьютер Ñ Ñервером баз данных или каталог " +"Ñокетов\n" -#: pg_dump.c:1059 pg_dumpall.c:655 pg_restore.c:484 +#: pg_dump.c:1177 pg_dumpall.c:687 pg_restore.c:506 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=ПОРТ номер порта Ñервера БД\n" -#: pg_dump.c:1060 pg_dumpall.c:656 pg_restore.c:485 +#: pg_dump.c:1178 pg_dumpall.c:688 pg_restore.c:507 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð±Ð°Ð· данных\n" -#: pg_dump.c:1061 pg_dumpall.c:657 pg_restore.c:486 +#: pg_dump.c:1179 pg_dumpall.c:689 pg_restore.c:508 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: pg_dump.c:1062 pg_dumpall.c:658 pg_restore.c:487 +#: pg_dump.c:1180 pg_dumpall.c:690 pg_restore.c:509 #, c-format msgid "" " -W, --password force password prompt (should happen " @@ -1826,12 +2133,12 @@ msgid "" msgstr "" " -W, --password запрашивать пароль вÑегда (обычно не требуетÑÑ)\n" -#: pg_dump.c:1063 pg_dumpall.c:659 +#: pg_dump.c:1181 pg_dumpall.c:691 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ИМЯ_РОЛИ выполнить SET ROLE перед выгрузкой\n" -#: pg_dump.c:1065 +#: pg_dump.c:1183 #, c-format msgid "" "\n" @@ -1844,22 +2151,22 @@ msgstr "" "PGDATABASE.\n" "\n" -#: pg_dump.c:1067 pg_dumpall.c:663 pg_restore.c:494 +#: pg_dump.c:1185 pg_dumpall.c:695 pg_restore.c:516 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: pg_dump.c:1068 pg_dumpall.c:664 pg_restore.c:495 +#: pg_dump.c:1186 pg_dumpall.c:696 pg_restore.c:517 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" -#: pg_dump.c:1087 pg_dumpall.c:488 +#: pg_dump.c:1205 pg_dumpall.c:518 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "указана Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚ÑÐºÐ°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° \"%s\"" -#: pg_dump.c:1225 +#: pg_dump.c:1353 #, c-format msgid "" "parallel dumps from standby servers are not supported by this server version" @@ -1867,160 +2174,170 @@ msgstr "" "выгрузка дампа в параллельном режиме Ñ Ð²ÐµÐ´Ð¾Ð¼Ñ‹Ñ… Ñерверов не поддерживаетÑÑ " "данной верÑией Ñервера" -#: pg_dump.c:1290 +#: pg_dump.c:1418 #, c-format msgid "invalid output format \"%s\" specified" msgstr "указан неверный формат вывода: \"%s\"" -#: pg_dump.c:1331 pg_dump.c:1387 pg_dump.c:1440 pg_dumpall.c:1282 +#: pg_dump.c:1459 pg_dump.c:1515 pg_dump.c:1568 pg_dumpall.c:1516 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неверное полное Ð¸Ð¼Ñ (Ñлишком много компонентов): %s" -#: pg_dump.c:1339 +#: pg_dump.c:1467 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "Ñхемы, ÑоответÑтвующие шаблону \"%s\", не найдены" -#: pg_dump.c:1392 +#: pg_dump.c:1520 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "раÑширениÑ, ÑоответÑтвующие шаблону \"%s\", не найдены" -#: pg_dump.c:1445 +#: pg_dump.c:1573 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "Ñторонние Ñерверы, ÑоответÑтвующие шаблону \"%s\", не найдены" -#: pg_dump.c:1508 +#: pg_dump.c:1644 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "неверное Ð¸Ð¼Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ (Ñлишком много компонентов): %s" -#: pg_dump.c:1519 +#: pg_dump.c:1666 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "таблицы, ÑоответÑтвующие шаблону \"%s\", не найдены" -#: pg_dump.c:1546 +#: pg_dump.c:1693 #, c-format msgid "You are currently not connected to a database." msgstr "Ð’ данный момент вы не подключены к базе данных." -#: pg_dump.c:1549 +#: pg_dump.c:1696 #, c-format msgid "cross-database references are not implemented: %s" msgstr "ÑÑылки между базами не реализованы: %s" -#: pg_dump.c:1980 +#: pg_dump.c:2155 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "выгрузка Ñодержимого таблицы \"%s.%s\"" -#: pg_dump.c:2086 +#: pg_dump.c:2265 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Ошибка выгрузки таблицы \"%s\": Ñбой в PQgetCopyData()." -#: pg_dump.c:2087 pg_dump.c:2097 +#: pg_dump.c:2266 pg_dump.c:2276 #, c-format msgid "Error message from server: %s" msgstr "Сообщение об ошибке Ñ Ñервера: %s" # skip-rule: language-mix -#: pg_dump.c:2088 pg_dump.c:2098 +#: pg_dump.c:2267 pg_dump.c:2277 #, c-format msgid "Command was: %s" msgstr "ВыполнÑлаÑÑŒ команда: %s" -#: pg_dump.c:2096 +#: pg_dump.c:2275 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Ошибка выгрузки таблицы \"%s\": Ñбой в PQgetResult()." -#: pg_dump.c:2178 +#: pg_dump.c:2366 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "из таблицы \"%s\" получено неверное количеÑтво полей" -#: pg_dump.c:2836 +#: pg_dump.c:3068 #, c-format msgid "saving database definition" msgstr "Ñохранение Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных" -#: pg_dump.c:2932 +#: pg_dump.c:3177 #, c-format msgid "unrecognized locale provider: %s" msgstr "нераÑпознанный провайдер локали: %s" -#: pg_dump.c:3278 +#: pg_dump.c:3538 #, c-format msgid "saving encoding = %s" msgstr "Ñохранение кодировки (%s)" -#: pg_dump.c:3303 +#: pg_dump.c:3563 #, c-format -msgid "saving standard_conforming_strings = %s" -msgstr "Ñохранение standard_conforming_strings (%s)" +msgid "saving \"standard_conforming_strings = %s\"" +msgstr "Ñохранение \"standard_conforming_strings = %s\"" -#: pg_dump.c:3342 +#: pg_dump.c:3602 #, c-format msgid "could not parse result of current_schemas()" msgstr "не удалоÑÑŒ разобрать результат current_schemas()" -#: pg_dump.c:3361 +#: pg_dump.c:3621 #, c-format -msgid "saving search_path = %s" -msgstr "Ñохранение search_path = %s" +msgid "saving \"search_path = %s\"" +msgstr "Ñохранение \"search_path = %s\"" -#: pg_dump.c:3399 +#: pg_dump.c:3657 #, c-format msgid "reading large objects" msgstr "чтение больших объектов" -#: pg_dump.c:3537 +#: pg_dump.c:3878 #, c-format -msgid "saving large objects" -msgstr "Ñохранение больших объектов" +msgid "saving large objects \"%s\"" +msgstr "Ñохранение больших объектов \"%s\"" -#: pg_dump.c:3578 +#: pg_dump.c:3899 #, c-format msgid "error reading large object %u: %s" msgstr "ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð³Ð¾ объекта %u: %s" -#: pg_dump.c:3684 +#: pg_dump.c:4002 #, c-format msgid "reading row-level security policies" msgstr "чтение политик защиты на уровне Ñтрок" -#: pg_dump.c:3825 +#: pg_dump.c:4143 #, c-format msgid "unexpected policy command type: %c" msgstr "нераÑпознанный тип команды в политике: %c" -#: pg_dump.c:4275 pg_dump.c:4593 pg_dump.c:11724 pg_dump.c:17575 -#: pg_dump.c:17577 pg_dump.c:18198 +#: pg_dump.c:4593 pg_dump.c:5151 pg_dump.c:12365 pg_dump.c:18264 +#: pg_dump.c:18266 pg_dump.c:18888 #, c-format msgid "could not parse %s array" msgstr "не удалоÑÑŒ разобрать маÑÑив %s" -#: pg_dump.c:4461 +#: pg_dump.c:4807 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "" "подпиÑки не выгружены, так как текущий пользователь не Ñуперпользователь" -#: pg_dump.c:4975 +#: pg_dump.c:5013 +#, c-format +msgid "subscription with OID %u does not exist" +msgstr "подпиÑка Ñ OID %u не ÑущеÑтвует" + +#: pg_dump.c:5020 +#, c-format +msgid "failed sanity check, table with OID %u not found" +msgstr "нарушение целоÑтноÑти: таблица Ñ OID %u не найдена" + +#: pg_dump.c:5583 #, c-format msgid "could not find parent extension for %s %s" msgstr "не удалоÑÑŒ найти родительÑкое раÑширение Ð´Ð»Ñ %s %s" -#: pg_dump.c:5120 +#: pg_dump.c:5728 #, c-format msgid "schema with OID %u does not exist" msgstr "Ñхема Ñ OID %u не ÑущеÑтвует" -#: pg_dump.c:6574 pg_dump.c:16839 +#: pg_dump.c:7210 pg_dump.c:17635 #, c-format msgid "" "failed sanity check, parent table with OID %u of sequence with OID %u not " @@ -2029,18 +2346,26 @@ msgstr "" "нарушение целоÑтноÑти: по OID %u не удалоÑÑŒ найти родительÑкую таблицу " "поÑледовательноÑти Ñ OID %u" -#: pg_dump.c:6878 pg_dump.c:7145 pg_dump.c:7616 pg_dump.c:8283 pg_dump.c:8404 -#: pg_dump.c:8558 +#: pg_dump.c:7355 +#, c-format +msgid "" +"failed sanity check, table OID %u appearing in pg_partitioned_table not found" +msgstr "" +"нарушение целоÑтноÑти: таблица Ñ OID %u, фигурирующим в " +"pg_partitioned_table, не найдена" + +#: pg_dump.c:7586 pg_dump.c:7860 pg_dump.c:8307 pg_dump.c:8921 pg_dump.c:9043 +#: pg_dump.c:9191 #, c-format msgid "unrecognized table OID %u" msgstr "нераÑпознанный OID таблицы %u" -#: pg_dump.c:6882 +#: pg_dump.c:7590 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "неожиданно получены данные индекÑа Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\"" -#: pg_dump.c:7377 +#: pg_dump.c:8092 #, c-format msgid "" "failed sanity check, parent table with OID %u of pg_rewrite entry with OID " @@ -2049,41 +2374,32 @@ msgstr "" "нарушение целоÑтноÑти: по OID %u не удалоÑÑŒ найти родительÑкую таблицу Ð´Ð»Ñ " "запиÑи pg_rewrite Ñ OID %u" -#: pg_dump.c:7668 -#, c-format -msgid "" -"query produced null referenced table name for foreign key trigger \"%s\" on " -"table \"%s\" (OID of table: %u)" -msgstr "" -"Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ð´Ð°Ð» NULL вмеÑто имени целевой таблицы Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° внешнего ключа " -"\"%s\" в таблице \"%s\" (OID целевой таблицы: %u)" - -#: pg_dump.c:8287 +#: pg_dump.c:8925 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "неожиданно получены данные Ñтолбцов Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\"" -#: pg_dump.c:8317 +#: pg_dump.c:8954 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð½ÑƒÐ¼ÐµÑ€Ð°Ñ†Ð¸Ñ Ñтолбцов в таблице \"%s\"" -#: pg_dump.c:8366 +#: pg_dump.c:9005 #, c-format msgid "finding table default expressions" msgstr "поиÑк выражений по умолчанию Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†" -#: pg_dump.c:8408 +#: pg_dump.c:9047 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "неверное значение adnum (%d) в таблице \"%s\"" -#: pg_dump.c:8508 +#: pg_dump.c:9141 #, c-format msgid "finding table check constraints" msgstr "поиÑк ограничений-проверок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†" -#: pg_dump.c:8562 +#: pg_dump.c:9195 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" @@ -2094,54 +2410,59 @@ msgstr[1] "" msgstr[2] "" "ожидалоÑÑŒ %d ограничений-проверок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\", но найдено: %d" -#: pg_dump.c:8566 +#: pg_dump.c:9199 #, c-format msgid "The system catalogs might be corrupted." msgstr "Возможно, повреждены ÑиÑтемные каталоги." -#: pg_dump.c:9256 +#: pg_dump.c:9889 #, c-format msgid "role with OID %u does not exist" msgstr "роль Ñ OID %u не ÑущеÑтвует" -#: pg_dump.c:9368 pg_dump.c:9397 +#: pg_dump.c:10001 pg_dump.c:10030 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ в pg_init_privs: %u %u %d" -#: pg_dump.c:10218 +#: pg_dump.c:10577 +#, c-format +msgid "missing metadata for large objects \"%s\"" +msgstr "отÑутÑтвуют метаданные о больших объектах \"%s\"" + +#: pg_dump.c:10860 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "у типа данных \"%s\" по-видимому неправильный тип типа" # TO REVEIW -#: pg_dump.c:11793 +#: pg_dump.c:12434 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "недопуÑтимое значение provolatile Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ \"%s\"" # TO REVEIW -#: pg_dump.c:11843 pg_dump.c:13668 +#: pg_dump.c:12484 pg_dump.c:14380 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "недопуÑтимое значение proparallel Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ \"%s\"" -#: pg_dump.c:11974 pg_dump.c:12080 pg_dump.c:12087 +#: pg_dump.c:12614 pg_dump.c:12720 pg_dump.c:12727 #, c-format msgid "could not find function definition for function with OID %u" msgstr "не удалоÑÑŒ найти определение функции Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ Ñ OID %u" -#: pg_dump.c:12013 +#: pg_dump.c:12653 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "неприемлемое значение в поле pg_cast.castfunc или pg_cast.castmethod" -#: pg_dump.c:12016 +#: pg_dump.c:12656 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "неприемлемое значение в поле pg_cast.castmethod" -#: pg_dump.c:12106 +#: pg_dump.c:12746 #, c-format msgid "" "bogus transform definition, at least one of trffromsql and trftosql should " @@ -2150,57 +2471,63 @@ msgstr "" "неприемлемое определение Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ (trffromsql или trftosql должно быть " "ненулевым)" -#: pg_dump.c:12123 +#: pg_dump.c:12763 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "неприемлемое значение в поле pg_transform.trffromsql" -#: pg_dump.c:12144 +#: pg_dump.c:12784 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "неприемлемое значение в поле pg_transform.trftosql" -#: pg_dump.c:12289 +#: pg_dump.c:12929 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "поÑтфикÑные операторы больше не поддерживаютÑÑ (оператор \"%s\")" -#: pg_dump.c:12459 +#: pg_dump.c:13099 #, c-format msgid "could not find operator with OID %s" msgstr "оператор Ñ OID %s не найден" -#: pg_dump.c:12527 +#: pg_dump.c:13167 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "неверный тип \"%c\" метода доÑтупа \"%s\"" -#: pg_dump.c:13169 +#: pg_dump.c:13841 pg_dump.c:13909 #, c-format msgid "unrecognized collation provider: %s" msgstr "нераÑпознанный провайдер правил Ñортировки: %s" -#: pg_dump.c:13587 +#: pg_dump.c:13850 pg_dump.c:13857 pg_dump.c:13868 pg_dump.c:13878 +#: pg_dump.c:13893 +#, c-format +msgid "invalid collation \"%s\"" +msgstr "неверное правило Ñортировки \"%s\"" + +#: pg_dump.c:14299 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "нераÑпознанное значение aggfinalmodify Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð° \"%s\"" -#: pg_dump.c:13643 +#: pg_dump.c:14355 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "нераÑпознанное значение aggmfinalmodify Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð° \"%s\"" -#: pg_dump.c:14361 +#: pg_dump.c:15072 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "нераÑпознанный тип объекта в определении прав по умолчанию: %d" -#: pg_dump.c:14377 +#: pg_dump.c:15088 #, c-format msgid "could not parse default ACL list (%s)" msgstr "не удалоÑÑŒ разобрать ÑпиÑок прав по умолчанию (%s)" -#: pg_dump.c:14459 +#: pg_dump.c:15172 #, c-format msgid "" "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" @@ -2208,20 +2535,20 @@ msgstr "" "не удалоÑÑŒ разобрать изначальный ÑпиÑок ACL (%s) или ACL по умолчанию (%s) " "Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° \"%s\" (%s)" -#: pg_dump.c:14484 +#: pg_dump.c:15197 #, c-format msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "" "не удалоÑÑŒ разобрать ÑпиÑок ACL (%s) или ACL по умолчанию (%s) Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð° " "\"%s\" (%s)" -#: pg_dump.c:15022 +#: pg_dump.c:15740 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "" "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° получение Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" не возвратил данные" -#: pg_dump.c:15025 +#: pg_dump.c:15743 #, c-format msgid "" "query to obtain definition of view \"%s\" returned more than one definition" @@ -2229,49 +2556,49 @@ msgstr "" "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° получение Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" возвратил неÑколько " "определений" -#: pg_dump.c:15032 +#: pg_dump.c:15750 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "определение предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ \"%s\" пуÑтое (длина равна нулю)" -#: pg_dump.c:15116 +#: pg_dump.c:15835 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "ÑвойÑтво WITH OIDS больше не поддерживаетÑÑ (таблица \"%s\")" -#: pg_dump.c:16045 +#: pg_dump.c:16822 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "неверный номер Ñтолбца %d Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\"" -#: pg_dump.c:16123 +#: pg_dump.c:16900 #, c-format msgid "could not parse index statistic columns" msgstr "не удалоÑÑŒ разобрать Ñтолбцы ÑтатиÑтики в индекÑе" -#: pg_dump.c:16125 +#: pg_dump.c:16902 #, c-format msgid "could not parse index statistic values" msgstr "не удалоÑÑŒ разобрать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑтатиÑтики в индекÑе" -#: pg_dump.c:16127 +#: pg_dump.c:16904 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "" "Ñтолбцы, задающие ÑтатиÑтику индекÑа, не ÑоответÑтвуют значениÑм по " "количеÑтву" -#: pg_dump.c:16345 +#: pg_dump.c:17133 #, c-format msgid "missing index for constraint \"%s\"" msgstr "отÑутÑтвует Ð¸Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ \"%s\"" -#: pg_dump.c:16573 +#: pg_dump.c:17368 #, c-format msgid "unrecognized constraint type: %c" msgstr "нераÑпознанный тип ограничениÑ: %c" -#: pg_dump.c:16674 pg_dump.c:16903 +#: pg_dump.c:17469 pg_dump.c:17699 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "" @@ -2286,22 +2613,12 @@ msgstr[2] "" "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° получение данных поÑледовательноÑти \"%s\" вернул %d Ñтрок " "(ожидалаÑÑŒ 1)" -#: pg_dump.c:16706 +#: pg_dump.c:17501 #, c-format msgid "unrecognized sequence type: %s" msgstr "нераÑпознанный тип поÑледовательноÑти: %s" -#: pg_dump.c:16995 -#, c-format -msgid "unexpected tgtype value: %d" -msgstr "неожиданное значение tgtype: %d" - -#: pg_dump.c:17067 -#, c-format -msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" -msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтрока аргументов (%s) Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° \"%s\" таблицы \"%s\"" - -#: pg_dump.c:17336 +#: pg_dump.c:18016 #, c-format msgid "" "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows " @@ -2310,47 +2627,53 @@ msgstr "" "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° получение правила \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s\" возвратил неверное " "чиÑло Ñтрок" -#: pg_dump.c:17489 +#: pg_dump.c:18169 #, c-format msgid "could not find referenced extension %u" msgstr "не удалоÑÑŒ найти упомÑнутое раÑширение %u" -#: pg_dump.c:17579 +#: pg_dump.c:18268 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "конфигурации раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ ÑоответÑтвуют уÑловиÑм по количеÑтву" -#: pg_dump.c:17711 +#: pg_dump.c:18400 #, c-format msgid "reading dependency data" msgstr "чтение информации о завиÑимоÑÑ‚ÑÑ…" -#: pg_dump.c:17797 +#: pg_dump.c:18486 #, c-format msgid "no referencing object %u %u" msgstr "нет подчинённого объекта %u %u" -#: pg_dump.c:17808 +#: pg_dump.c:18497 #, c-format msgid "no referenced object %u %u" msgstr "нет вышеÑтоÑщего объекта %u %u" -#: pg_dump_sort.c:422 +#: pg_dump.c:18922 pg_dump.c:18960 pg_dumpall.c:2011 pg_restore.c:551 +#: pg_restore.c:597 +#, c-format +msgid "%s filter for \"%s\" is not allowed" +msgstr "фильтр %s Ð´Ð»Ñ \"%s\" не допуÑкаетÑÑ" + +#: pg_dump_sort.c:424 #, c-format msgid "invalid dumpId %d" msgstr "неверный dumpId %d" -#: pg_dump_sort.c:428 +#: pg_dump_sort.c:430 #, c-format msgid "invalid dependency %d" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð·Ð°Ð²Ð¸ÑимоÑть %d" -#: pg_dump_sort.c:661 +#: pg_dump_sort.c:594 #, c-format msgid "could not identify dependency loop" msgstr "не удалоÑÑŒ определить цикл завиÑимоÑтей" -#: pg_dump_sort.c:1232 +#: pg_dump_sort.c:1209 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" @@ -2358,12 +2681,7 @@ msgstr[0] "в Ñледующей таблице зациклены ограни msgstr[1] "в Ñледующих таблицах зациклены Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ñ… ключей:" msgstr[2] "в Ñледующих таблицах зациклены Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑˆÐ½Ð¸Ñ… ключей:" -#: pg_dump_sort.c:1236 pg_dump_sort.c:1256 -#, c-format -msgid " %s" -msgstr " %s" - -#: pg_dump_sort.c:1237 +#: pg_dump_sort.c:1214 #, c-format msgid "" "You might not be able to restore the dump without using --disable-triggers " @@ -2372,7 +2690,7 @@ msgstr "" "Возможно, Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð°Ð·Ñ‹ потребуетÑÑ Ð¸Ñпользовать --disable-" "triggers или временно удалить ограничениÑ." -#: pg_dump_sort.c:1238 +#: pg_dump_sort.c:1215 #, c-format msgid "" "Consider using a full dump instead of a --data-only dump to avoid this " @@ -2381,26 +2699,26 @@ msgstr "" "Во избежание Ñтой проблемы, вероÑтно, Ñтоит выгружать вÑÑŽ базу данных, а не " "только данные (--data-only)." -#: pg_dump_sort.c:1250 +#: pg_dump_sort.c:1227 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "не удалоÑÑŒ разрешить цикл завиÑимоÑтей Ð´Ð»Ñ Ñледующих объектов:" -#: pg_dumpall.c:205 +#: pg_dumpall.c:231 #, c-format msgid "" "program \"%s\" is needed by %s but was not found in the same directory as " "\"%s\"" msgstr "программа \"%s\" нужна Ð´Ð»Ñ %s, но она не найдена в каталоге \"%s\"" -#: pg_dumpall.c:208 +#: pg_dumpall.c:234 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "" "программа \"%s\" найдена программой \"%s\", но её верÑÐ¸Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð¾Ñ‚ " "верÑии %s" -#: pg_dumpall.c:357 +#: pg_dumpall.c:387 #, c-format msgid "" "option --exclude-database cannot be used together with -g/--globals-only, -" @@ -2409,30 +2727,30 @@ msgstr "" "параметр --exclude-database неÑовмеÑтим Ñ -g/--globals-only, -r/--roles-only " "и -t/--tablespaces-only" -#: pg_dumpall.c:365 +#: pg_dumpall.c:395 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "параметры -g/--globals-only и -r/--roles-only иÑключают друг друга" -#: pg_dumpall.c:372 +#: pg_dumpall.c:402 #, c-format msgid "" "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "" "параметры -g/--globals-only и -t/--tablespaces-only иÑключают друг друга" -#: pg_dumpall.c:382 +#: pg_dumpall.c:412 #, c-format msgid "" "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "параметры -r/--roles-only и -t/--tablespaces-only иÑключают друг друга" -#: pg_dumpall.c:444 pg_dumpall.c:1587 +#: pg_dumpall.c:474 pg_dumpall.c:1820 #, c-format msgid "could not connect to database \"%s\"" msgstr "не удалоÑÑŒ подключитьÑÑ Ðº базе данных: \"%s\"" -#: pg_dumpall.c:456 +#: pg_dumpall.c:486 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2441,7 +2759,7 @@ msgstr "" "не удалоÑÑŒ подключитьÑÑ Ðº базе данных \"postgres\" или \"template1\"\n" "Укажите другую базу данных." -#: pg_dumpall.c:604 +#: pg_dumpall.c:635 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2450,17 +2768,17 @@ msgstr "" "%s ÑкÑпортирует вÑÑ‘ Ñодержимое клаÑтера баз данных PostgreSQL в SQL-Ñкрипт.\n" "\n" -#: pg_dumpall.c:606 +#: pg_dumpall.c:637 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [ПÐРÐМЕТР]...\n" -#: pg_dumpall.c:609 +#: pg_dumpall.c:640 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=ИМЯ_ФÐÐ™Ð›Ð Ð¸Ð¼Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð¾Ð³Ð¾ файла\n" -#: pg_dumpall.c:616 +#: pg_dumpall.c:647 #, c-format msgid "" " -c, --clean clean (drop) databases before recreating\n" @@ -2468,18 +2786,18 @@ msgstr "" " -c, --clean очиÑтить (удалить) базы данных перед\n" " воÑÑтановлением\n" -#: pg_dumpall.c:618 +#: pg_dumpall.c:649 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr "" " -g, --globals-only выгрузить только глобальные объекты, без баз\n" -#: pg_dumpall.c:619 pg_restore.c:456 +#: pg_dumpall.c:650 pg_restore.c:475 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner не воÑÑтанавливать владение объектами\n" -#: pg_dumpall.c:620 +#: pg_dumpall.c:651 #, c-format msgid "" " -r, --roles-only dump only roles, no databases or tablespaces\n" @@ -2487,13 +2805,13 @@ msgstr "" " -r, --roles-only выгрузить только роли, без баз данных\n" " и табличных проÑтранÑтв\n" -#: pg_dumpall.c:622 +#: pg_dumpall.c:653 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr "" " -S, --superuser=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð³Ñ€ÑƒÐ·ÐºÐ¸\n" -#: pg_dumpall.c:623 +#: pg_dumpall.c:654 #, c-format msgid "" " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" @@ -2501,7 +2819,7 @@ msgstr "" " -t, --tablespaces-only выгружать только табличные проÑтранÑтва,\n" " без баз данных и ролей\n" -#: pg_dumpall.c:629 +#: pg_dumpall.c:660 #, c-format msgid "" " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" @@ -2509,22 +2827,31 @@ msgstr "" " --exclude-database=ШÐБЛОРиÑключить базы Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸, подпадающими под " "шаблон\n" -#: pg_dumpall.c:636 +#: pg_dumpall.c:662 +#, c-format +msgid "" +" --filter=FILENAME exclude databases based on expressions in " +"FILENAME\n" +msgstr "" +" --filter=ИМЯ_ФÐЙЛРиÑключать базы данных в ÑоответÑтвии Ñ\n" +" выражениÑми в Ñтом файле\n" + +#: pg_dumpall.c:668 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords не выгружать пароли ролей\n" -#: pg_dumpall.c:652 +#: pg_dumpall.c:684 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=СТРОКРподключитьÑÑ Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ Ñтрокой подключениÑ\n" -#: pg_dumpall.c:654 +#: pg_dumpall.c:686 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=ИМЯ_БД выбор другой базы данных по умолчанию\n" -#: pg_dumpall.c:661 +#: pg_dumpall.c:693 #, c-format msgid "" "\n" @@ -2538,97 +2865,120 @@ msgstr "" "вывод.\n" "\n" -#: pg_dumpall.c:803 +#: pg_dumpall.c:838 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "Ð¸Ð¼Ñ Ñ€Ð¾Ð»Ð¸, начинающееÑÑ Ñ \"pg_\", пропущено (%s)" -#: pg_dumpall.c:1018 +#. translator: %s represents a numeric role OID +#: pg_dumpall.c:1055 pg_dumpall.c:1113 pg_dumpall.c:1122 +#, c-format +msgid "found orphaned pg_auth_members entry for role %s" +msgstr "обнаружена потерÑÐ½Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ pg_auth_members Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ %s" + +#: pg_dumpall.c:1088 +#, c-format +msgid "could not find a legal dump ordering for memberships in role \"%s\"" +msgstr "не удалоÑÑŒ найти подходÑщий порÑдок выгрузки Ð´Ð»Ñ Ñ‡Ð»ÐµÐ½Ð¾Ð² роли \"%s\"" + +#: pg_dumpall.c:1243 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "не удалоÑÑŒ разобрать ÑпиÑок ACL (%s) Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\"" -#: pg_dumpall.c:1136 +#: pg_dumpall.c:1370 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "" "не удалоÑÑŒ разобрать ÑпиÑок ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупом (%s) Ð´Ð»Ñ Ñ‚Ð°Ð±Ð». проÑтранÑтва " "\"%s\"" -#: pg_dumpall.c:1343 +#: pg_dumpall.c:1577 #, c-format msgid "excluding database \"%s\"" msgstr "база данных \"%s\" иÑключаетÑÑ" -#: pg_dumpall.c:1347 +#: pg_dumpall.c:1581 #, c-format msgid "dumping database \"%s\"" msgstr "выгрузка базы данных \"%s\"" -#: pg_dumpall.c:1378 +#: pg_dumpall.c:1612 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "ошибка при обработке базы \"%s\", pg_dump завершаетÑÑ" -#: pg_dumpall.c:1384 +#: pg_dumpall.c:1618 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "не удалоÑÑŒ повторно открыть выходной файл \"%s\": %m" -#: pg_dumpall.c:1425 +#: pg_dumpall.c:1662 #, c-format msgid "running \"%s\"" msgstr "выполнÑетÑÑ \"%s\"" -#: pg_dumpall.c:1630 +#: pg_dumpall.c:1863 #, c-format msgid "could not get server version" msgstr "не удалоÑÑŒ узнать верÑию Ñервера" -#: pg_dumpall.c:1633 +#: pg_dumpall.c:1866 #, c-format msgid "could not parse server version \"%s\"" msgstr "не удалоÑÑŒ разобрать Ñтроку верÑии Ñервера \"%s\"" -#: pg_dumpall.c:1703 pg_dumpall.c:1726 +#: pg_dumpall.c:1936 pg_dumpall.c:1959 #, c-format msgid "executing %s" msgstr "выполнÑетÑÑ %s" +#: pg_dumpall.c:2031 +msgid "unsupported filter object" +msgstr "неподдерживаемый объект фильтра" + # TO REVEIW -#: pg_restore.c:313 +#: pg_restore.c:329 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "необходимо указать -d/--dbname или -f/--file" # TO REVEIW -#: pg_restore.c:320 +#: pg_restore.c:336 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "параметры -d/--dbname и -f/--file иÑключают друг друга" -#: pg_restore.c:338 +#: pg_restore.c:350 +#, c-format +msgid "" +"options -1/--single-transaction and --transaction-size cannot be used " +"together" +msgstr "" +"параметры -1/--single-transaction и --transaction-size иÑключают друг друга" + +#: pg_restore.c:357 #, c-format msgid "options -C/--create and -1/--single-transaction cannot be used together" msgstr "параметры -C/--create и -1/--single-transaction иÑключают друг друга" -#: pg_restore.c:342 +#: pg_restore.c:361 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "параметр --single-transaction допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ Ð¾Ð´Ð½Ð¸Ð¼ заданием" -#: pg_restore.c:380 +#: pg_restore.c:399 #, c-format msgid "" "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "нераÑпознанный формат архива \"%s\"; укажите \"c\", \"d\" или \"t\"" -#: pg_restore.c:419 +#: pg_restore.c:438 #, c-format msgid "errors ignored on restore: %d" msgstr "при воÑÑтановлении проигнорировано ошибок: %d" -#: pg_restore.c:432 +#: pg_restore.c:451 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" @@ -2638,49 +2988,49 @@ msgstr "" "pg_dump.\n" "\n" -#: pg_restore.c:434 +#: pg_restore.c:453 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [ПÐРÐМЕТР]... [ФÐЙЛ]\n" -#: pg_restore.c:437 +#: pg_restore.c:456 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr " -d, --dbname=БД подключитьÑÑ Ðº указанной базе данных\n" -#: pg_restore.c:438 +#: pg_restore.c:457 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr "" " -f, --file=ИМЯ_ФÐÐ™Ð›Ð Ð¸Ð¼Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ð¾Ð³Ð¾ файла (или - Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° в stdout)\n" -#: pg_restore.c:439 +#: pg_restore.c:458 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr "" " -F, --format=c|d|t формат файла (должен определÑтьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки)\n" -#: pg_restore.c:440 +#: pg_restore.c:459 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list вывеÑти краткое оглавление архива\n" -#: pg_restore.c:441 +#: pg_restore.c:460 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose выводить подробные ÑообщениÑ\n" -#: pg_restore.c:442 +#: pg_restore.c:461 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: pg_restore.c:443 +#: pg_restore.c:462 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: pg_restore.c:445 +#: pg_restore.c:464 #, c-format msgid "" "\n" @@ -2689,35 +3039,35 @@ msgstr "" "\n" "Параметры, управлÑющие воÑÑтановлением:\n" -#: pg_restore.c:446 +#: pg_restore.c:465 #, c-format msgid " -a, --data-only restore only the data, no schema\n" msgstr " -a, --data-only воÑÑтановить только данные, без Ñхемы\n" -#: pg_restore.c:448 +#: pg_restore.c:467 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create Ñоздать целевую базу данных\n" -#: pg_restore.c:449 +#: pg_restore.c:468 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr "" " -e, --exit-on-error выйти при ошибке (по умолчанию - продолжать)\n" -#: pg_restore.c:450 +#: pg_restore.c:469 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=ИМЯ воÑÑтановить указанный индекÑ\n" -#: pg_restore.c:451 +#: pg_restore.c:470 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr "" " -j, --jobs=ЧИСЛО раÑпараллелить воÑÑтановление на указанное " "чиÑло заданий\n" -#: pg_restore.c:452 +#: pg_restore.c:471 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" @@ -2726,13 +3076,13 @@ msgstr "" " -L, --use-list=ИМЯ_ФÐЙЛРиÑпользовать оглавление из Ñтого файла длÑ\n" " чтениÑ/упорÑÐ´Ð¾Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…\n" -#: pg_restore.c:454 +#: pg_restore.c:473 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr "" " -n, --schema=ИМЯ воÑÑтановить объекты только в Ñтой Ñхеме\n" -#: pg_restore.c:455 +#: pg_restore.c:474 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" msgstr "" @@ -2740,17 +3090,17 @@ msgstr "" # skip-rule: no-space-before-parentheses # well-spelled: арг -#: pg_restore.c:457 +#: pg_restore.c:476 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=ИМЯ(арг-ты) воÑÑтановить заданную функцию\n" -#: pg_restore.c:458 +#: pg_restore.c:477 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" msgstr " -s, --schema-only воÑÑтановить только Ñхему, без данных\n" -#: pg_restore.c:459 +#: pg_restore.c:478 #, c-format msgid "" " -S, --superuser=NAME superuser user name to use for disabling " @@ -2759,7 +3109,7 @@ msgstr "" " -S, --superuser=ИМЯ Ð¸Ð¼Ñ ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ " "триггеров\n" -#: pg_restore.c:460 +#: pg_restore.c:479 #, c-format msgid "" " -t, --table=NAME restore named relation (table, view, etc.)\n" @@ -2767,12 +3117,12 @@ msgstr "" " -t, --table=ИМЯ воÑÑтановить заданное отношение (таблицу, " "предÑтавление и Ñ‚. п.)\n" -#: pg_restore.c:461 +#: pg_restore.c:480 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=ИМЯ воÑÑтановить заданный триггер\n" -#: pg_restore.c:462 +#: pg_restore.c:481 #, c-format msgid "" " -x, --no-privileges skip restoration of access privileges (grant/" @@ -2781,23 +3131,32 @@ msgstr "" " -x, --no-privileges не воÑÑтанавливать права доÑтупа\n" " (назначение/отзыв)\n" -#: pg_restore.c:463 +#: pg_restore.c:482 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr "" " -1, --single-transaction выполнить воÑÑтановление в одной транзакции\n" -#: pg_restore.c:465 +#: pg_restore.c:484 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security включить защиту на уровне Ñтрок\n" -#: pg_restore.c:467 +#: pg_restore.c:485 +#, c-format +msgid "" +" --filter=FILENAME restore or skip objects based on expressions\n" +" in FILENAME\n" +msgstr "" +" --filter=ИМЯ_ФÐЙЛРвоÑÑтанавливать или пропуÑкать объекты\n" +" в ÑоответÑтвии Ñ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñми в Ñтом файле\n" + +#: pg_restore.c:488 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments не воÑÑтанавливать комментарии\n" -#: pg_restore.c:468 +#: pg_restore.c:489 #, c-format msgid "" " --no-data-for-failed-tables do not restore data of tables that could not " @@ -2807,35 +3166,35 @@ msgstr "" " --no-data-for-failed-tables не воÑÑтанавливать данные таблиц, которые\n" " не удалоÑÑŒ Ñоздать\n" -#: pg_restore.c:470 +#: pg_restore.c:491 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications не воÑÑтанавливать публикации\n" -#: pg_restore.c:471 +#: pg_restore.c:492 #, c-format msgid " --no-security-labels do not restore security labels\n" msgstr " --no-security-labels не воÑÑтанавливать метки безопаÑноÑти\n" -#: pg_restore.c:472 +#: pg_restore.c:493 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions не воÑÑтанавливать подпиÑки\n" -#: pg_restore.c:473 +#: pg_restore.c:494 #, c-format msgid " --no-table-access-method do not restore table access methods\n" msgstr "" " --no-table-access-method не воÑÑтанавливать табличные методы доÑтупа\n" -#: pg_restore.c:474 +#: pg_restore.c:495 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" msgstr "" " --no-tablespaces не воÑÑтанавливать Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð». " "проÑтранÑтв\n" -#: pg_restore.c:475 +#: pg_restore.c:496 #, c-format msgid "" " --section=SECTION restore named section (pre-data, data, or " @@ -2844,12 +3203,18 @@ msgstr "" " --section=РÐЗДЕЛ воÑÑтановить заданный раздел\n" " (pre-data, data или post-data)\n" -#: pg_restore.c:488 +#: pg_restore.c:499 +#, c-format +msgid " --transaction-size=N commit after every N objects\n" +msgstr "" +" --transaction-size=N выполнÑть COMMIT поÑле каждых N объектов\n" + +#: pg_restore.c:510 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=ИМЯ_РОЛИ выполнить SET ROLE перед воÑÑтановлением\n" -#: pg_restore.c:490 +#: pg_restore.c:512 #, c-format msgid "" "\n" @@ -2862,7 +3227,7 @@ msgstr "" "указывать\n" "неÑколько раз Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° неÑкольких объектов.\n" -#: pg_restore.c:493 +#: pg_restore.c:515 #, c-format msgid "" "\n" @@ -2874,6 +3239,67 @@ msgstr "" "ввода.\n" "\n" +#, c-format +#~ msgid "" +#~ "query produced null referenced table name for foreign key trigger \"%s\" " +#~ "on table \"%s\" (OID of table: %u)" +#~ msgstr "" +#~ "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ð´Ð°Ð» NULL вмеÑто имени целевой таблицы Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° внешнего " +#~ "ключа \"%s\" в таблице \"%s\" (OID целевой таблицы: %u)" + +#, c-format +#~ msgid "unexpected tgtype value: %d" +#~ msgstr "неожиданное значение tgtype: %d" + +#, c-format +#~ msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" +#~ msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтрока аргументов (%s) Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð° \"%s\" таблицы \"%s\"" + +#, c-format +#~ msgid "unrecognized collation provider '%c'" +#~ msgstr "нераÑпознанный провайдер правил Ñортировки '%c'" + +#, c-format +#~ msgid "could not identify current directory: %m" +#~ msgstr "не удалоÑÑŒ определить текущий каталог: %m" + +#, c-format +#~ msgid "could not change directory to \"%s\": %m" +#~ msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m" + +#, c-format +#~ msgid "could not read symbolic link \"%s\": %m" +#~ msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m" + +#, c-format +#~ msgid "not built with zlib support" +#~ msgstr "программа Ñобрана без поддержки zlib" + +#, c-format +#~ msgid "could not close blob data file: %m" +#~ msgstr "не удалоÑÑŒ закрыть файл данных BLOB: %m" + +#, c-format +#~ msgid "could not close blobs TOC file: %m" +#~ msgstr "не удалоÑÑŒ закрыть файл Ð¾Ð³Ð»Ð°Ð²Ð»ÐµÐ½Ð¸Ñ BLOB: %m" + +#, c-format +#~ msgid "" +#~ "requested compression not available in this installation -- archive will " +#~ "be uncompressed" +#~ msgstr "" +#~ "уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ не поддерживает Ñжатие -- архив не будет " +#~ "ÑжиматьÑÑ" + +#, c-format +#~ msgid "" +#~ " -Z, --compress=0-9 compression level for compressed formats\n" +#~ msgstr " -Z, --compress=0-9 уровень ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¿Ñ€Ð¸ архивации\n" + +#, c-format +#~ msgid " %s" +#~ msgstr " %s" + #~ msgid "fatal: " #~ msgstr "важно: " @@ -3026,9 +3452,6 @@ msgstr "" #~ msgid "could not reconnect to database" #~ msgstr "не удалоÑÑŒ переподключитьÑÑ Ðº базе" -#~ msgid "could not reconnect to database: %s" -#~ msgstr "не удалоÑÑŒ переподключитьÑÑ Ðº базе: %s" - #~ msgid "connection needs password" #~ msgstr "Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼ пароль" @@ -3192,9 +3615,6 @@ msgstr "" #~ "ЕÑли они вам не нужны, укажите при запуÑке ключ\n" #~ "--no-synchronized-snapshots.\n" -#~ msgid "reading partition information\n" -#~ msgstr "чтение информации о ÑекциÑÑ…\n" - #~ msgid "finding partition relationships\n" #~ msgstr "обнаружение взаимоÑвÑзей Ñекций\n" @@ -3259,9 +3679,6 @@ msgstr "" #~ msgid "could not write to custom output routine\n" #~ msgstr "не удалоÑÑŒ вывеÑти данную в пользовательÑкую процедуру\n" -#~ msgid "unexpected end of file\n" -#~ msgstr "неожиданный конец файла\n" - #~ msgid "could not write byte: %s\n" #~ msgstr "не удалоÑÑŒ запиÑать байт: %s\n" @@ -3364,9 +3781,6 @@ msgstr "" #~ msgid "missing pg_database entry for this database\n" #~ msgstr "Ð´Ð»Ñ Ñтой базы данных отÑутÑтвует запиÑÑŒ в pg_database\n" -#~ msgid "found more than one pg_database entry for this database\n" -#~ msgstr "Ð´Ð»Ñ Ñтой базы данных найдено неÑколько запиÑей в pg_database\n" - #~ msgid "could not find entry for pg_indexes in pg_class\n" #~ msgstr "Ð´Ð»Ñ pg_indexes не найдена запиÑÑŒ в pg_class\n" diff --git a/src/bin/pg_dump/po/sv.po b/src/bin/pg_dump/po/sv.po index af5c00af1e84f..8fbe8b3636b56 100644 --- a/src/bin/pg_dump/po/sv.po +++ b/src/bin/pg_dump/po/sv.po @@ -1,13 +1,13 @@ # Swedish message translation file for pg_dump # Peter Eisentraut , 2001, 2009, 2010. -# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023. +# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-09 18:50+0000\n" -"PO-Revision-Date: 2023-03-09 22:37+0100\n" +"POT-Creation-Date: 2024-08-27 15:52+0000\n" +"PO-Revision-Date: 2024-08-27 18:32+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -16,102 +16,202 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "varning: " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "detalj: " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "tips: " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/compression.c:132 ../../common/compression.c:141 +#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420 +#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25 +#: compress_zstd.c:31 #, c-format -msgid "could not identify current directory: %m" -msgstr "kunde inte identifiera aktuell katalog: %m" +msgid "this build does not support compression with %s" +msgstr "detta bygge stöder inte komprimering med %s" -#: ../../common/exec.c:168 +#: ../../common/compression.c:205 +msgid "found empty string where a compression option was expected" +msgstr "hittade en tom sträng där en komprimeringsinställning förväntades" + +#: ../../common/compression.c:244 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "okänd komprimeringsflagga: \"%s\"" + +#: ../../common/compression.c:283 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "komprimeringsmetoden \"%s\" kräver ett värde" + +#: ../../common/compression.c:292 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "värdet pÃ¥ komprimeringsflaggan \"%s\" mÃ¥ste vara ett heltal" + +#: ../../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "värdet pÃ¥ komprimeringsflaggan \"%s\" mÃ¥ste vara en boolean" + +#: ../../common/compression.c:379 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "komprimeringsalgoritmen \"%s\" har ingen komprimeringsnivÃ¥ som kan sättas" + +#: ../../common/compression.c:386 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "komprimeringsalgoritmen \"%s\" förväntar sig en komprimeringsnivÃ¥ mellan %d och %d (standard är %d)" + +#: ../../common/compression.c:397 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "komprimeringsalgoritm \"%s\" stöder inte ett arbetarantal" + +#: ../../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "komprimeringsalgoritmen \"%s\" stöder inte lÃ¥ngdistansläge" + +#: ../../common/exec.c:174 #, c-format -msgid "invalid binary \"%s\"" -msgstr "ogiltig binär \"%s\"" +msgid "invalid binary \"%s\": %m" +msgstr "ogiltig binär \"%s\": %m" -#: ../../common/exec.c:218 +#: ../../common/exec.c:217 #, c-format -msgid "could not read binary \"%s\"" -msgstr "kunde inte läsa binär \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "kunde inte läsa binär \"%s\": %m" -#: ../../common/exec.c:226 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "kunde inte hitta en \"%s\" att köra" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "kunde inte konvertera sökvägen \"%s\" till en absolut sökväg: %m" + +#: ../../common/exec.c:382 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "kunde inte köra kommandot \"%s\": %m" + +#: ../../common/exec.c:394 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "kunde inte byta katalog till \"%s\": %m" +msgid "could not read from command \"%s\": %m" +msgstr "kunde inte läsa frÃ¥n kommando \"%s\": %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:397 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "kan inte läsa symbolisk länk \"%s\": %m" +msgid "no data was returned by command \"%s\"" +msgstr "ingen data returnerades frÃ¥n kommandot \"%s\"" -#: ../../common/exec.c:422 parallel.c:1611 +#: ../../common/exec.c:424 parallel.c:1609 #, c-format msgid "%s() failed: %m" msgstr "%s() misslyckades: %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "slut pÃ¥ minne" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "slut pÃ¥ minne\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" -#: ../../common/wait_error.c:45 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "kunde inte öppna fil \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "detta bygge stöder inte synkmetod \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "kunde inte öppna katalog \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_backup_directory.c:182 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "kunde inte läsa katalog \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "kunde inte fsync:a fil \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" + +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "kommandot är inte körbart" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "kommandot kan ej hittas" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "barnprocess avslutade med kod %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "barnprocess terminerades med avbrott 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "barnprocess terminerades av signal %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "barnprocess avslutade med okänd statuskod %d" @@ -126,299 +226,421 @@ msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" msgid "%s must be in range %d..%d" msgstr "%s mÃ¥ste vara i intervallet %d..%d" -#: common.c:134 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "okänd synkmetod: %s" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "shell-kommandots argument innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "databasnamnet innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: common.c:135 #, c-format msgid "reading extensions" msgstr "läser utökningar" -#: common.c:137 +#: common.c:138 #, c-format msgid "identifying extension members" msgstr "identifierar utökningsmedlemmar" -#: common.c:140 +#: common.c:141 #, c-format msgid "reading schemas" msgstr "läser scheman" -#: common.c:149 +#: common.c:150 #, c-format msgid "reading user-defined tables" msgstr "läser användardefinierade tabeller" -#: common.c:154 +#: common.c:155 #, c-format msgid "reading user-defined functions" msgstr "läser användardefinierade funktioner" -#: common.c:158 +#: common.c:159 #, c-format msgid "reading user-defined types" msgstr "läser användardefinierade typer" -#: common.c:162 +#: common.c:163 #, c-format msgid "reading procedural languages" msgstr "läser procedursprÃ¥k" -#: common.c:165 +#: common.c:166 #, c-format msgid "reading user-defined aggregate functions" msgstr "läser användardefinierade aggregatfunktioner" -#: common.c:168 +#: common.c:169 #, c-format msgid "reading user-defined operators" msgstr "läser användardefinierade operatorer" -#: common.c:171 +#: common.c:172 #, c-format msgid "reading user-defined access methods" msgstr "läser användardefinierade accessmetoder" -#: common.c:174 +#: common.c:175 #, c-format msgid "reading user-defined operator classes" msgstr "läser användardefinierade operatorklasser" -#: common.c:177 +#: common.c:178 #, c-format msgid "reading user-defined operator families" msgstr "läser användardefinierade operator-familjer" -#: common.c:180 +#: common.c:181 #, c-format msgid "reading user-defined text search parsers" msgstr "läser användardefinierade textsöktolkare" -#: common.c:183 +#: common.c:184 #, c-format msgid "reading user-defined text search templates" msgstr "läser användardefinierade textsökmallar" -#: common.c:186 +#: common.c:187 #, c-format msgid "reading user-defined text search dictionaries" msgstr "läser användardefinierade textsökordlistor" -#: common.c:189 +#: common.c:190 #, c-format msgid "reading user-defined text search configurations" msgstr "läser användardefinierade textsökkonfigurationer" -#: common.c:192 +#: common.c:193 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "läser användardefinierade främmande data-omvandlare" -#: common.c:195 +#: common.c:196 #, c-format msgid "reading user-defined foreign servers" msgstr "läser användardefinierade främmande servrar" -#: common.c:198 +#: common.c:199 #, c-format msgid "reading default privileges" msgstr "läser standardrättigheter" -#: common.c:201 +#: common.c:202 #, c-format msgid "reading user-defined collations" msgstr "läser användardefinierade jämförelser" -#: common.c:204 +#: common.c:205 #, c-format msgid "reading user-defined conversions" msgstr "läser användardefinierade konverteringar" -#: common.c:207 +#: common.c:208 #, c-format msgid "reading type casts" msgstr "läser typomvandlingar" -#: common.c:210 +#: common.c:211 #, c-format msgid "reading transforms" msgstr "läser transformer" -#: common.c:213 +#: common.c:214 #, c-format msgid "reading table inheritance information" msgstr "läser information om arv av tabeller" -#: common.c:216 +#: common.c:217 #, c-format msgid "reading event triggers" msgstr "läser händelsetriggrar" -#: common.c:220 +#: common.c:221 #, c-format msgid "finding extension tables" msgstr "hittar utökningstabeller" -#: common.c:224 +#: common.c:225 #, c-format msgid "finding inheritance relationships" msgstr "hittar arvrelationer" -#: common.c:227 +#: common.c:228 #, c-format msgid "reading column info for interesting tables" msgstr "läser kolumninfo flr intressanta tabeller" -#: common.c:230 +#: common.c:231 #, c-format msgid "flagging inherited columns in subtables" msgstr "markerar ärvda kolumner i undertabeller" -#: common.c:233 +#: common.c:234 +#, c-format +msgid "reading partitioning data" +msgstr "läser partitioneringsdata" + +#: common.c:237 #, c-format msgid "reading indexes" msgstr "läser index" -#: common.c:236 +#: common.c:240 #, c-format msgid "flagging indexes in partitioned tables" msgstr "flaggar index i partitionerade tabeller" -#: common.c:239 +#: common.c:243 #, c-format msgid "reading extended statistics" msgstr "läser utökad statistik" -#: common.c:242 +#: common.c:246 #, c-format msgid "reading constraints" msgstr "läser integritetsvillkor" -#: common.c:245 +#: common.c:249 #, c-format msgid "reading triggers" msgstr "läser triggrar" -#: common.c:248 +#: common.c:252 #, c-format msgid "reading rewrite rules" msgstr "läser omskrivningsregler" -#: common.c:251 +#: common.c:255 #, c-format msgid "reading policies" msgstr "läser policys" -#: common.c:254 +#: common.c:258 #, c-format msgid "reading publications" msgstr "läser publiceringar" -#: common.c:257 +#: common.c:261 #, c-format msgid "reading publication membership of tables" msgstr "läser publiceringsmedlemskap för tabeller" -#: common.c:260 +#: common.c:264 #, c-format msgid "reading publication membership of schemas" msgstr "läser publiceringsmedlemskap för scheman" -#: common.c:263 +#: common.c:267 #, c-format msgid "reading subscriptions" msgstr "läser prenumerationer" -#: common.c:343 +#: common.c:270 #, c-format -msgid "invalid number of parents %d for table \"%s\"" -msgstr "ogiltigt antal (%d) föräldrar för tabell \"%s\"" +msgid "reading subscription membership of tables" +msgstr "läser prenumerationsmedlemskap för tabeller" -#: common.c:1004 +#: common.c:333 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "misslyckades med riktighetskontroll, hittade inte förälder-OID %u för tabell \"%s\" (OID %u)" -#: common.c:1043 +#: common.c:375 +#, c-format +msgid "invalid number of parents %d for table \"%s\"" +msgstr "ogiltigt antal (%d) föräldrar för tabell \"%s\"" + +#: common.c:1098 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "kunde inte tolka numerisk array \"%s\": för mÃ¥nga nummer" -#: common.c:1055 +#: common.c:1110 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "kunde inte tolka numerisk array \"%s\": ogiltigt tecken i nummer" -#: compress_io.c:111 -#, c-format -msgid "invalid compression code: %d" -msgstr "ogiltig komprimeringskod: %d" - -#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504 -#: compress_io.c:547 -#, c-format -msgid "not built with zlib support" -msgstr "ej byggt med zlib-stöd" - -#: compress_io.c:236 compress_io.c:333 +#: compress_gzip.c:69 compress_gzip.c:183 #, c-format msgid "could not initialize compression library: %s" msgstr "kunde inte initiera komprimeringsbibliotek: %s" -#: compress_io.c:256 +#: compress_gzip.c:93 #, c-format msgid "could not close compression stream: %s" msgstr "kunde inte stänga komprimeringsströmmen: %s" -#: compress_io.c:273 +#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109 #, c-format msgid "could not compress data: %s" msgstr "kunde inte komprimera data: %s" -#: compress_io.c:349 compress_io.c:364 +#: compress_gzip.c:199 compress_gzip.c:214 #, c-format msgid "could not uncompress data: %s" msgstr "kunde inte packa upp data: %s" -#: compress_io.c:371 +#: compress_gzip.c:221 #, c-format msgid "could not close compression library: %s" msgstr "kunde inte stänga komprimeringsbiblioteket: %s" -#: compress_io.c:584 compress_io.c:621 +#: compress_gzip.c:266 compress_lz4.c:608 compress_lz4.c:628 compress_lz4.c:647 #, c-format msgid "could not read from input file: %s" msgstr "kunde inte läsa frÃ¥n infilen: %s" -#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553 -#: pg_backup_tar.c:726 pg_backup_tar.c:749 +#: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 +#: compress_zstd.c:373 pg_backup_custom.c:651 +#, c-format +msgid "could not read from input file: %m" +msgstr "kunde inte läsa frÃ¥n infilen: %m" + +#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:141 +#: compress_zstd.c:371 pg_backup_custom.c:649 pg_backup_directory.c:565 +#: pg_backup_tar.c:740 pg_backup_tar.c:763 #, c-format msgid "could not read from input file: end of file" msgstr "kunde inte läsa frÃ¥n infilen: slut pÃ¥ filen" -#: parallel.c:253 +#: compress_lz4.c:157 +#, c-format +msgid "could not create LZ4 decompression context: %s" +msgstr "kunde inte skapa kontext för LZ4-dekomprimering: %s" + +#: compress_lz4.c:180 +#, c-format +msgid "could not decompress: %s" +msgstr "kunde inte dekomprimera: %s" + +#: compress_lz4.c:193 +#, c-format +msgid "could not free LZ4 decompression context: %s" +msgstr "kunde inte frigöra kontext för LZ4-dekomprimering: %s" + +#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690 +#, c-format +msgid "could not end compression: %s" +msgstr "kunde inte avsluta komprimering: %s" + +#: compress_lz4.c:301 +#, c-format +msgid "could not initialize LZ4 compression: %s" +msgstr "kunde inte initiera LZ4-komprimering: %s" + +#: compress_lz4.c:697 +#, c-format +msgid "could not end decompression: %s" +msgstr "kunde inte avsluta dekomprimering: %s" + +#: compress_zstd.c:66 +#, c-format +msgid "could not set compression parameter \"%s\": %s" +msgstr "kunde inte sätta komprimeringsparameter \"%s\": %s" + +#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490 +#: compress_zstd.c:498 +#, c-format +msgid "could not initialize compression library" +msgstr "kunde inte initierar komprimeringsbibliotek" + +#: compress_zstd.c:194 compress_zstd.c:308 +#, c-format +msgid "could not decompress data: %s" +msgstr "kunde inte dekomprimera data: %s" + +#: compress_zstd.c:501 +#, c-format +msgid "unhandled mode \"%s\"" +msgstr "kan inte hantera läget \"%s\"" + +#: filter.c:49 +#, c-format +msgid "could not open filter file \"%s\": %m" +msgstr "kunde inte öppna filterfil \"%s\": %m" + +#: filter.c:72 +#, c-format +msgid "could not close filter file \"%s\": %m" +msgstr "kunde inte stänga filterfil \"%s\": %m" + +#: filter.c:165 +#, c-format +msgid "invalid format in filter read from standard input on line %d: %s" +msgstr "ogiltigt format i filter som lästs frÃ¥n standard input pÃ¥ rad %d: %s" + +#: filter.c:168 +#, c-format +msgid "invalid format in filter read from file \"%s\" on line %d: %s" +msgstr "ogiltigt format i filter som lästs frÃ¥n fil \"%s\" pÃ¥ rad %d: %s" + +#: filter.c:241 filter.c:468 +#, c-format +msgid "could not read from filter file \"%s\": %m" +msgstr "kunde inte läsa frÃ¥n filterfil \"%s\": %m" + +#: filter.c:244 +msgid "unexpected end of file" +msgstr "oväntat slut pÃ¥ fil" + +#: filter.c:311 +msgid "missing object name pattern" +msgstr "saknar mall för objektnamn" + +#: filter.c:422 +msgid "no filter command found (expected \"include\" or \"exclude\")" +msgstr "hittade inte filterkommandon (förväntade \"include\" eller \"exclude\")" + +#: filter.c:433 +msgid "invalid filter command (expected \"include\" or \"exclude\")" +msgstr "ogiltigt filterkommando (förväntade \"include\" eller \"exclude\")" + +#: filter.c:440 +msgid "missing filter object type" +msgstr "saknas typ pÃ¥ filterobjekt" + +#: filter.c:447 +#, c-format +msgid "unsupported filter object type: \"%.*s\"" +msgstr "typen för filterobjekt stöd ej: \"%.*s\"" + +#: parallel.c:251 #, c-format msgid "%s() failed: error code %d" msgstr "%s() misslyckades: felkod %d" -#: parallel.c:961 +#: parallel.c:959 #, c-format msgid "could not create communication channels: %m" msgstr "kunde inte skapa kommunikationskanaler: %m" -#: parallel.c:1018 +#: parallel.c:1016 #, c-format msgid "could not create worker process: %m" msgstr "kunde inte skapa arbetsprocess: %m" -#: parallel.c:1148 +#: parallel.c:1146 #, c-format msgid "unrecognized command received from leader: \"%s\"" msgstr "okänt kommando mottaget frÃ¥n ledare: \"%s\"" -#: parallel.c:1191 parallel.c:1429 +#: parallel.c:1189 parallel.c:1427 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "ogiltigt meddelande mottaget frÃ¥n arbetare: \"%s\"" -#: parallel.c:1323 +#: parallel.c:1321 #, c-format msgid "" "could not obtain lock on relation \"%s\"\n" @@ -428,557 +650,562 @@ msgstr "" "Dette beror oftast pÃ¥ att nÃ¥gon tagit ett ACCESS EXCLUSIVE-lÃ¥s pÃ¥ tabellen\n" "efter att pg_dumps föräldraprocess tagit ett ACCESS SHARE-lÃ¥s pÃ¥ tabellen." -#: parallel.c:1412 +#: parallel.c:1410 #, c-format msgid "a worker process died unexpectedly" msgstr "en arbetsprocess dog oväntat" -#: parallel.c:1534 parallel.c:1652 +#: parallel.c:1532 parallel.c:1650 #, c-format msgid "could not write to the communication channel: %m" msgstr "kunde inte skriva till kommunikationskanal: %m" -#: parallel.c:1736 +#: parallel.c:1734 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: kunde inte skapa uttag (socket): felkod %d" -#: parallel.c:1747 +#: parallel.c:1745 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: kunde inte göra \"bind\": felkod %d" -#: parallel.c:1754 +#: parallel.c:1752 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: kunde inte göra \"listen\": felkod %d" -#: parallel.c:1761 +#: parallel.c:1759 #, c-format msgid "pgpipe: %s() failed: error code %d" msgstr "pgpipe: %s() misslyckades: felkod %d" -#: parallel.c:1772 +#: parallel.c:1770 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: kunde inte skapa ett andra uttag (socket): felkod %d" -#: parallel.c:1781 +#: parallel.c:1779 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: kunde itne ansluta till uttag (socket): felkod %d" -#: parallel.c:1790 +#: parallel.c:1788 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: kunde inte acceptera anslutning: felkod %d" -#: pg_backup_archiver.c:279 pg_backup_archiver.c:1576 +#: pg_backup_archiver.c:261 pg_backup_archiver.c:1706 #, c-format msgid "could not close output file: %m" msgstr "kunde inte stänga utdatafilen: %m" -#: pg_backup_archiver.c:323 pg_backup_archiver.c:327 +#: pg_backup_archiver.c:305 pg_backup_archiver.c:309 #, c-format msgid "archive items not in correct section order" msgstr "arkivobjekten är inte i korrekt sektionsordning" -#: pg_backup_archiver.c:333 +#: pg_backup_archiver.c:315 #, c-format msgid "unexpected section code %d" msgstr "oväntad sektionskod %d" -#: pg_backup_archiver.c:370 +#: pg_backup_archiver.c:352 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "parallell Ã¥terställning stöds inte med detta arkivformat" -#: pg_backup_archiver.c:374 +#: pg_backup_archiver.c:356 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "parallell Ã¥terställning stöds inte med arkiv som skapats av en pre-8.0 pg_dump" -#: pg_backup_archiver.c:392 +#: pg_backup_archiver.c:377 #, c-format -msgid "cannot restore from compressed archive (compression not supported in this installation)" -msgstr "kan inte Ã¥terställa frÃ¥n komprimerat arkiv (inte konfigurerad med stöd för komprimering)" +msgid "cannot restore from compressed archive (%s)" +msgstr "kan inte Ã¥terställa frÃ¥n komprimerat arkiv (%s)" -#: pg_backup_archiver.c:409 +#: pg_backup_archiver.c:397 #, c-format msgid "connecting to database for restore" msgstr "kopplar upp mot databas för Ã¥terställning" -#: pg_backup_archiver.c:411 +#: pg_backup_archiver.c:399 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "direkta databasuppkopplingar stöds inte i arkiv frÃ¥n före version 1.3" -#: pg_backup_archiver.c:454 +#: pg_backup_archiver.c:442 #, c-format msgid "implied data-only restore" msgstr "implicerad Ã¥terställning av enbart data" -#: pg_backup_archiver.c:520 +#: pg_backup_archiver.c:510 #, c-format msgid "dropping %s %s" msgstr "tar bort %s %s" -#: pg_backup_archiver.c:615 +#: pg_backup_archiver.c:642 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "kunde inte hitta var IF EXISTS skulle stoppas in i sats \"%s\"" -#: pg_backup_archiver.c:771 pg_backup_archiver.c:773 +#: pg_backup_archiver.c:828 pg_backup_archiver.c:830 #, c-format msgid "warning from original dump file: %s" msgstr "varning frÃ¥n orginaldumpfilen: %s" -#: pg_backup_archiver.c:788 +#: pg_backup_archiver.c:864 #, c-format msgid "creating %s \"%s.%s\"" msgstr "skapar %s \"%s.%s\"" -#: pg_backup_archiver.c:791 +#: pg_backup_archiver.c:867 #, c-format msgid "creating %s \"%s\"" msgstr "skapar %s \"%s\"" -#: pg_backup_archiver.c:841 +#: pg_backup_archiver.c:917 #, c-format msgid "connecting to new database \"%s\"" msgstr "kopplar upp mot ny databas \"%s\"" -#: pg_backup_archiver.c:868 +#: pg_backup_archiver.c:944 #, c-format msgid "processing %s" msgstr "processar %s" -#: pg_backup_archiver.c:888 +#: pg_backup_archiver.c:966 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "processar data för tabell \"%s.%s\"" -#: pg_backup_archiver.c:947 +#: pg_backup_archiver.c:1036 #, c-format msgid "executing %s %s" msgstr "kör %s %s" -#: pg_backup_archiver.c:986 +#: pg_backup_archiver.c:1096 #, c-format msgid "disabling triggers for %s" msgstr "stänger av trigger för %s" -#: pg_backup_archiver.c:1012 +#: pg_backup_archiver.c:1122 #, c-format msgid "enabling triggers for %s" msgstr "slÃ¥r pÃ¥ trigger för %s" -#: pg_backup_archiver.c:1040 +#: pg_backup_archiver.c:1187 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "internt fel -- WriteData kan inte anropas utanför kontexten av en DataDumper-rutin" -#: pg_backup_archiver.c:1223 +#: pg_backup_archiver.c:1379 #, c-format msgid "large-object output not supported in chosen format" msgstr "utmatning av stora objekt stöds inte i det valda formatet" -#: pg_backup_archiver.c:1281 +#: pg_backup_archiver.c:1442 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" msgstr[0] "Ã¥terställde %d stor objekt" msgstr[1] "Ã¥terställde %d stora objekt" -#: pg_backup_archiver.c:1302 pg_backup_tar.c:669 +#: pg_backup_archiver.c:1469 pg_backup_tar.c:683 #, c-format msgid "restoring large object with OID %u" msgstr "Ã¥terställer stort objekt med OID %u" -#: pg_backup_archiver.c:1314 +#: pg_backup_archiver.c:1481 #, c-format msgid "could not create large object %u: %s" msgstr "kunde inte skapa stort objekt %u: %s" -#: pg_backup_archiver.c:1319 pg_dump.c:3538 +#: pg_backup_archiver.c:1486 pg_dump.c:3888 #, c-format msgid "could not open large object %u: %s" msgstr "kunde inte öppna stort objekt %u: %s" -#: pg_backup_archiver.c:1375 +#: pg_backup_archiver.c:1542 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "kunde inte öppna TOC-filen \"%s\": %m" -#: pg_backup_archiver.c:1403 +#: pg_backup_archiver.c:1570 #, c-format msgid "line ignored: %s" msgstr "rad ignorerad: %s" -#: pg_backup_archiver.c:1410 +#: pg_backup_archiver.c:1577 pg_backup_db.c:609 #, c-format msgid "could not find entry for ID %d" msgstr "kunde inte hitta en post för ID %d" -#: pg_backup_archiver.c:1433 pg_backup_directory.c:222 -#: pg_backup_directory.c:599 +#: pg_backup_archiver.c:1600 pg_backup_directory.c:219 +#: pg_backup_directory.c:613 #, c-format msgid "could not close TOC file: %m" msgstr "kunde inte stänga TOC-filen: %m" -#: pg_backup_archiver.c:1547 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:586 pg_backup_directory.c:649 -#: pg_backup_directory.c:668 pg_dumpall.c:476 +#: pg_backup_archiver.c:1687 pg_backup_custom.c:152 pg_backup_directory.c:333 +#: pg_backup_directory.c:600 pg_backup_directory.c:666 +#: pg_backup_directory.c:684 pg_dumpall.c:506 #, c-format msgid "could not open output file \"%s\": %m" msgstr "kunde inte öppna utdatafilen \"%s\": %m" -#: pg_backup_archiver.c:1549 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1689 pg_backup_custom.c:158 #, c-format msgid "could not open output file: %m" msgstr "kunde inte öppna utdatafilen: %m" -#: pg_backup_archiver.c:1643 +#: pg_backup_archiver.c:1772 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" msgstr[0] "skrev %zu byte data av stort objekt (resultat = %d)" msgstr[1] "skrev %zu bytes data av stort objekt (resultat = %d)" -#: pg_backup_archiver.c:1649 +#: pg_backup_archiver.c:1778 #, c-format msgid "could not write to large object: %s" msgstr "kunde inte skriva till stort objekt: %s" -#: pg_backup_archiver.c:1739 +#: pg_backup_archiver.c:1868 #, c-format msgid "while INITIALIZING:" msgstr "vid INITIERING:" -#: pg_backup_archiver.c:1744 +#: pg_backup_archiver.c:1873 #, c-format msgid "while PROCESSING TOC:" msgstr "vid HANTERING AV TOC:" -#: pg_backup_archiver.c:1749 +#: pg_backup_archiver.c:1878 #, c-format msgid "while FINALIZING:" msgstr "vid SLUTFÖRANDE:" -#: pg_backup_archiver.c:1754 +#: pg_backup_archiver.c:1883 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "frÃ¥n TOC-post %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1830 +#: pg_backup_archiver.c:1959 #, c-format msgid "bad dumpId" msgstr "felaktigt dumpId" -#: pg_backup_archiver.c:1851 +#: pg_backup_archiver.c:1980 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "felaktig tabell-dumpId för TABLE DATA-objekt" -#: pg_backup_archiver.c:1943 +#: pg_backup_archiver.c:2072 #, c-format msgid "unexpected data offset flag %d" msgstr "oväntad data-offset-flagga %d" -#: pg_backup_archiver.c:1956 +#: pg_backup_archiver.c:2085 #, c-format msgid "file offset in dump file is too large" msgstr "fil-offset i dumpfilen är för stort" -#: pg_backup_archiver.c:2094 pg_backup_archiver.c:2104 +#: pg_backup_archiver.c:2196 #, c-format msgid "directory name too long: \"%s\"" msgstr "katalognamn för lÃ¥ngt: \"%s\"" -#: pg_backup_archiver.c:2112 +#: pg_backup_archiver.c:2246 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "katalogen \"%s\" verkar inte vara ett giltigt arkiv (\"toc.dat\" finns inte)" -#: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807 -#: pg_backup_directory.c:207 pg_backup_directory.c:395 +#: pg_backup_archiver.c:2254 pg_backup_custom.c:169 pg_backup_custom.c:812 +#: pg_backup_directory.c:204 pg_backup_directory.c:396 #, c-format msgid "could not open input file \"%s\": %m" msgstr "kunde inte öppna indatafilen \"%s\": %m" -#: pg_backup_archiver.c:2127 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2261 pg_backup_custom.c:175 #, c-format msgid "could not open input file: %m" msgstr "kan inte öppna infil: %m" -#: pg_backup_archiver.c:2133 +#: pg_backup_archiver.c:2267 #, c-format msgid "could not read input file: %m" msgstr "kan inte läsa infilen: %m" -#: pg_backup_archiver.c:2135 +#: pg_backup_archiver.c:2269 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "indatafilen är för kort (läste %lu, förväntade 5)" -#: pg_backup_archiver.c:2167 +#: pg_backup_archiver.c:2301 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "indatafilen verkar vara en dump i textformat. Använd psql." -#: pg_backup_archiver.c:2173 +#: pg_backup_archiver.c:2307 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "indatafilen verkar inte vara ett korrekt arkiv (för kort?)" -#: pg_backup_archiver.c:2179 +#: pg_backup_archiver.c:2313 #, c-format msgid "input file does not appear to be a valid archive" msgstr "indatafilen verkar inte vara ett korrekt arkiv" -#: pg_backup_archiver.c:2188 +#: pg_backup_archiver.c:2322 #, c-format msgid "could not close input file: %m" msgstr "kunde inte stänga indatafilen: %m" -#: pg_backup_archiver.c:2305 +#: pg_backup_archiver.c:2401 +#, c-format +msgid "could not open stdout for appending: %m" +msgstr "kunde inte öppna stdout för append: %m" + +#: pg_backup_archiver.c:2446 #, c-format msgid "unrecognized file format \"%d\"" msgstr "känner inte igen filformat \"%d\"" -#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4445 +#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4647 #, c-format msgid "finished item %d %s %s" msgstr "klar med objekt %d %s %s" -#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4458 +#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4660 #, c-format msgid "worker process failed: exit code %d" msgstr "arbetsprocess misslyckades: felkod %d" -#: pg_backup_archiver.c:2512 +#: pg_backup_archiver.c:2653 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "post-ID %d utanför sitt intervall -- kanske en trasig TOC" -#: pg_backup_archiver.c:2592 +#: pg_backup_archiver.c:2736 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "Ã¥tereställa tabeller med WITH OIDS stöds inte längre" -#: pg_backup_archiver.c:2674 +#: pg_backup_archiver.c:2818 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "okänd teckenkodning \"%s\"" -#: pg_backup_archiver.c:2679 +#: pg_backup_archiver.c:2823 #, c-format msgid "invalid ENCODING item: %s" msgstr "ogiltigt ENCODING-val: %s" -#: pg_backup_archiver.c:2697 +#: pg_backup_archiver.c:2841 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "ogiltigt STDSTRINGS-val: %s" -#: pg_backup_archiver.c:2722 +#: pg_backup_archiver.c:2866 #, c-format msgid "schema \"%s\" not found" msgstr "schema \"%s\" hittades inte" -#: pg_backup_archiver.c:2729 +#: pg_backup_archiver.c:2873 #, c-format msgid "table \"%s\" not found" msgstr "tabell \"%s\" hittades inte" -#: pg_backup_archiver.c:2736 +#: pg_backup_archiver.c:2880 #, c-format msgid "index \"%s\" not found" msgstr "index \"%s\" hittades inte" -#: pg_backup_archiver.c:2743 +#: pg_backup_archiver.c:2887 #, c-format msgid "function \"%s\" not found" msgstr "funktion \"%s\" hittades inte" -#: pg_backup_archiver.c:2750 +#: pg_backup_archiver.c:2894 #, c-format msgid "trigger \"%s\" not found" msgstr "trigger \"%s\" hittades inte" -#: pg_backup_archiver.c:3143 +#: pg_backup_archiver.c:3325 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "kunde inte sätta sessionsanvändare till \"%s\": %s" -#: pg_backup_archiver.c:3280 +#: pg_backup_archiver.c:3457 #, c-format -msgid "could not set search_path to \"%s\": %s" -msgstr "kunde inte sätta search_path till \"%s\": %s" +msgid "could not set \"search_path\" to \"%s\": %s" +msgstr "kunde inte sätta \"search_path\" till \"%s\": %s" -#: pg_backup_archiver.c:3342 +#: pg_backup_archiver.c:3518 #, c-format -msgid "could not set default_tablespace to %s: %s" -msgstr "kunde inte sätta default_tablespace till %s: %s" +msgid "could not set \"default_tablespace\" to %s: %s" +msgstr "kunde inte sätta \"default_tablespace\" till %s: %s" -#: pg_backup_archiver.c:3392 +#: pg_backup_archiver.c:3567 #, c-format -msgid "could not set default_table_access_method: %s" -msgstr "kunde inte sätta default_table_access_method: %s" +msgid "could not set \"default_table_access_method\": %s" +msgstr "kunde inte sätta \"default_table_access_method\": %s" -#: pg_backup_archiver.c:3486 pg_backup_archiver.c:3651 +#: pg_backup_archiver.c:3616 +#, c-format +msgid "could not alter table access method: %s" +msgstr "kunde inte ändra tabellaccessmetod: %s" + +#: pg_backup_archiver.c:3717 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "vet inte hur man sätter ägare för objekttyp \"%s\"" -#: pg_backup_archiver.c:3754 +#: pg_backup_archiver.c:4004 #, c-format msgid "did not find magic string in file header" msgstr "kunde inte hitta den magiska strängen i filhuvudet" -#: pg_backup_archiver.c:3768 +#: pg_backup_archiver.c:4018 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "ej supportad version (%d.%d) i filhuvudet" -#: pg_backup_archiver.c:3773 +#: pg_backup_archiver.c:4023 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "riktighetskontroll pÃ¥ heltalsstorlek (%lu) misslyckades" -#: pg_backup_archiver.c:3777 +#: pg_backup_archiver.c:4027 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "arkivet skapades pÃ¥ en maskin med större heltal, en del operationer kan misslyckas" -#: pg_backup_archiver.c:3787 +#: pg_backup_archiver.c:4037 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "förväntat format (%d) skiljer sig frÃ¥n formatet som fanns i filen (%d)" -#: pg_backup_archiver.c:3802 +#: pg_backup_archiver.c:4059 #, c-format -msgid "archive is compressed, but this installation does not support compression -- no data will be available" -msgstr "arkivet är komprimerat, men denna installation stödjer inte komprimering -- ingen data kommer kunna läsas" +msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available" +msgstr "arkivet är komprimerat, men denna installation stödjer inte komprimering (%s) -- ingen data kommer kunna läsas" -#: pg_backup_archiver.c:3836 +#: pg_backup_archiver.c:4095 #, c-format msgid "invalid creation date in header" msgstr "ogiltig skapandedatum i huvud" -#: pg_backup_archiver.c:3970 +#: pg_backup_archiver.c:4229 #, c-format msgid "processing item %d %s %s" msgstr "processar objekt %d %s %s" -#: pg_backup_archiver.c:4049 +#: pg_backup_archiver.c:4314 #, c-format msgid "entering main parallel loop" msgstr "gÃ¥r in i parallella huvudloopen" -#: pg_backup_archiver.c:4060 +#: pg_backup_archiver.c:4325 #, c-format msgid "skipping item %d %s %s" msgstr "hoppar över objekt %d %s %s" -#: pg_backup_archiver.c:4069 +#: pg_backup_archiver.c:4334 #, c-format msgid "launching item %d %s %s" msgstr "startar objekt %d %s %s" -#: pg_backup_archiver.c:4123 +#: pg_backup_archiver.c:4388 #, c-format msgid "finished main parallel loop" msgstr "klar med parallella huvudloopen" -#: pg_backup_archiver.c:4159 +#: pg_backup_archiver.c:4424 #, c-format msgid "processing missed item %d %s %s" msgstr "processar saknat objekt %d %s %s" -#: pg_backup_archiver.c:4764 +#: pg_backup_archiver.c:4966 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "tabell \"%s\" kunde inte skapas, dess data kommer ej Ã¥terställas" -#: pg_backup_custom.c:376 pg_backup_null.c:147 +#: pg_backup_custom.c:376 pg_backup_null.c:143 #, c-format msgid "invalid OID for large object" msgstr "ogiltig OID för stort objekt" -#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629 -#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021 +#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:636 +#: pg_backup_custom.c:870 pg_backup_tar.c:1029 pg_backup_tar.c:1034 #, c-format msgid "error during file seek: %m" msgstr "fel vid sökning: %m" -#: pg_backup_custom.c:478 +#: pg_backup_custom.c:480 #, c-format msgid "data block %d has wrong seek position" msgstr "datablock %d har fel sökposition" -#: pg_backup_custom.c:495 +#: pg_backup_custom.c:497 #, c-format msgid "unrecognized data block type (%d) while searching archive" msgstr "känner inte igen datablocktyp (%d) vid genomsökning av arkiv" -#: pg_backup_custom.c:517 +#: pg_backup_custom.c:519 #, c-format msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file" msgstr "kunde inte hitta block ID %d i arkiv -- kanske pÃ¥ grund av en Ã¥terställningbegäran i oordning vilket inte kan hanteras dÃ¥ inputfilen inte är sökbar" -#: pg_backup_custom.c:522 +#: pg_backup_custom.c:524 #, c-format msgid "could not find block ID %d in archive -- possibly corrupt archive" msgstr "kunde inte hitta block ID %d i arkiv -- möjligen ett trasigt arkiv" -#: pg_backup_custom.c:529 +#: pg_backup_custom.c:531 #, c-format msgid "found unexpected block ID (%d) when reading data -- expected %d" msgstr "hittade oväntat block-ID (%d) vid läsning av data -- förväntade %d" -#: pg_backup_custom.c:543 +#: pg_backup_custom.c:545 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "ej igenkänd datablockstyp %d vid Ã¥terställande av arkiv" -#: pg_backup_custom.c:645 -#, c-format -msgid "could not read from input file: %m" -msgstr "kunde inte läsa frÃ¥n infilen: %m" - -#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943 -#: pg_backup_tar.c:1019 +#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:945 +#: pg_backup_tar.c:1032 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "kunde inte bestämma sökposition i arkivfil: %m" -#: pg_backup_custom.c:762 pg_backup_custom.c:802 +#: pg_backup_custom.c:767 pg_backup_custom.c:807 #, c-format msgid "could not close archive file: %m" msgstr "kan inte stänga arkivfilen: %m" -#: pg_backup_custom.c:785 +#: pg_backup_custom.c:790 #, c-format msgid "can only reopen input archives" msgstr "kan inte Ã¥teröppna indataarkiven" -#: pg_backup_custom.c:792 +#: pg_backup_custom.c:797 #, c-format msgid "parallel restore from standard input is not supported" msgstr "parallell Ã¥terställning frÃ¥n standard in stöds inte" -#: pg_backup_custom.c:794 +#: pg_backup_custom.c:799 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "parallell Ã¥terställning för en icke sökbar fil stöds inte" -#: pg_backup_custom.c:810 +#: pg_backup_custom.c:815 #, c-format msgid "could not set seek position in archive file: %m" msgstr "kunde inte söka till rätt position i arkivfilen: %m" -#: pg_backup_custom.c:889 +#: pg_backup_custom.c:894 #, c-format msgid "compressor active" msgstr "komprimerare aktiv" @@ -988,12 +1215,12 @@ msgstr "komprimerare aktiv" msgid "could not get server_version from libpq" msgstr "kunde inte hämta serverversionen frÃ¥n libpq" -#: pg_backup_db.c:53 pg_dumpall.c:1646 +#: pg_backup_db.c:53 pg_dumpall.c:1830 #, c-format msgid "aborting because of server version mismatch" msgstr "avbryter dÃ¥ serverversionerna i matchar" -#: pg_backup_db.c:54 pg_dumpall.c:1647 +#: pg_backup_db.c:54 pg_dumpall.c:1831 #, c-format msgid "server version: %s; %s version: %s" msgstr "server version: %s; %s version: %s" @@ -1003,7 +1230,7 @@ msgstr "server version: %s; %s version: %s" msgid "already connected to a database" msgstr "är redan uppkopplad mot en databas" -#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1677 pg_dumpall.c:1779 msgid "Password: " msgstr "Lösenord: " @@ -1017,220 +1244,216 @@ msgstr "kunde inte ansluta till databasen" msgid "reconnection failed: %s" msgstr "Ã¥teranslutning misslyckades: %s" -#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:788 pg_dump_sort.c:1213 +#: pg_dump_sort.c:1233 pg_dumpall.c:1704 pg_dumpall.c:1788 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732 +#: pg_backup_db.c:271 pg_dumpall.c:1893 pg_dumpall.c:1916 #, c-format msgid "query failed: %s" msgstr "frÃ¥ga misslyckades: %s" -#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733 +#: pg_backup_db.c:273 pg_dumpall.c:1894 pg_dumpall.c:1917 #, c-format msgid "Query was: %s" msgstr "FrÃ¥gan var: %s" -#: pg_backup_db.c:316 +#: pg_backup_db.c:315 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" msgstr[0] "frÃ¥ga gav %d rad istället för en: %s" msgstr[1] "frÃ¥ga gav %d rader istället för en: %s" -#: pg_backup_db.c:352 +#: pg_backup_db.c:351 #, c-format msgid "%s: %sCommand was: %s" msgstr "%s: %sKommandot var: %s" -#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489 +#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488 msgid "could not execute query" msgstr "kunde inte utföra frÃ¥ga" -#: pg_backup_db.c:461 +#: pg_backup_db.c:460 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "fel returnerat av PQputCopyData: %s" -#: pg_backup_db.c:510 +#: pg_backup_db.c:509 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "fel returnerat av PQputCopyEnd: %s" -#: pg_backup_db.c:516 +#: pg_backup_db.c:515 #, c-format msgid "COPY failed for table \"%s\": %s" msgstr "COPY misslyckades för tabell \"%s\": %s" -#: pg_backup_db.c:522 pg_dump.c:2105 +#: pg_backup_db.c:521 pg_dump.c:2283 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "oväntade extraresultat under kopiering (COPY) av tabell \"%s\"" -#: pg_backup_db.c:534 +#: pg_backup_db.c:533 msgid "could not start database transaction" msgstr "kunde inte starta databastransaktionen" -#: pg_backup_db.c:542 +#: pg_backup_db.c:541 msgid "could not commit database transaction" msgstr "kunde inte genomföra databastransaktionen" -#: pg_backup_directory.c:156 +#: pg_backup_directory.c:153 #, c-format msgid "no output directory specified" msgstr "ingen utdatakatalog angiven" -#: pg_backup_directory.c:185 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "kunde inte läsa katalog \"%s\": %m" - -#: pg_backup_directory.c:189 +#: pg_backup_directory.c:186 #, c-format msgid "could not close directory \"%s\": %m" msgstr "kunde inte stänga katalog \"%s\": %m" -#: pg_backup_directory.c:195 +#: pg_backup_directory.c:192 #, c-format msgid "could not create directory \"%s\": %m" msgstr "kunde inte skapa katalog \"%s\": %m" -#: pg_backup_directory.c:355 pg_backup_directory.c:497 -#: pg_backup_directory.c:533 +#: pg_backup_directory.c:357 pg_backup_directory.c:506 +#: pg_backup_directory.c:544 #, c-format msgid "could not write to output file: %s" msgstr "kunde inte skriva till utdatafil: %s" -#: pg_backup_directory.c:373 +#: pg_backup_directory.c:375 #, c-format msgid "could not close data file: %m" msgstr "kan inte stänga datafil: %m" -#: pg_backup_directory.c:407 +#: pg_backup_directory.c:408 #, c-format msgid "could not close data file \"%s\": %m" msgstr "kan inte stänga datafil \"%s\": %m" -#: pg_backup_directory.c:447 +#: pg_backup_directory.c:455 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "kunde inte öppna stora objekts TOC-fil \"%s\" för läsning: %m" -#: pg_backup_directory.c:458 +#: pg_backup_directory.c:466 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "ogiltig rad i stora objekts TOC-fil \"%s\": \"%s\"" -#: pg_backup_directory.c:467 +#: pg_backup_directory.c:475 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "fel vid lösning av stora objekts TOC-fil \"%s\"" -#: pg_backup_directory.c:471 +#: pg_backup_directory.c:479 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "kunde inte stänga stora objekts TOC-fil \"%s\": %m" -#: pg_backup_directory.c:685 +#: pg_backup_directory.c:702 #, c-format -msgid "could not close blob data file: %m" -msgstr "kan inte stänga blobbars datafil: %m" +msgid "could not close LO data file: %m" +msgstr "kan inte stänga LO-datafil: %m" -#: pg_backup_directory.c:691 +#: pg_backup_directory.c:712 #, c-format -msgid "could not write to blobs TOC file" -msgstr "kunde inte skriva till blobbars TOC-fil" +msgid "could not write to LOs TOC file: %s" +msgstr "kunde inte skriva till TOC-fil för LO: %s" -#: pg_backup_directory.c:705 +#: pg_backup_directory.c:728 #, c-format -msgid "could not close blobs TOC file: %m" -msgstr "kunde inte stänga blobbars TOC-fil: %m" +msgid "could not close LOs TOC file: %m" +msgstr "kunde inte stänga TOC-fil för LO: %m" -#: pg_backup_directory.c:724 +#: pg_backup_directory.c:747 #, c-format msgid "file name too long: \"%s\"" msgstr "filnamnet är för lÃ¥ngt: \"%s\"" -#: pg_backup_null.c:74 +#: pg_backup_null.c:70 #, c-format msgid "this format cannot be read" msgstr "detta format kan inte läsas" -#: pg_backup_tar.c:172 +#: pg_backup_tar.c:168 #, c-format msgid "could not open TOC file \"%s\" for output: %m" msgstr "kunde inte öppna TOC-filen \"%s\" för utmatning: %m" -#: pg_backup_tar.c:179 +#: pg_backup_tar.c:175 #, c-format msgid "could not open TOC file for output: %m" msgstr "kunde inte öppna TOC-filen för utmatning: %m" -#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 -#: pg_backup_tar.c:405 pg_backup_tar.c:893 +#: pg_backup_tar.c:194 pg_backup_tar.c:330 pg_backup_tar.c:385 +#: pg_backup_tar.c:401 pg_backup_tar.c:906 #, c-format msgid "compression is not supported by tar archive format" msgstr "komprimering är stödjs inte av arkivformatet tar" -#: pg_backup_tar.c:206 +#: pg_backup_tar.c:202 #, c-format msgid "could not open TOC file \"%s\" for input: %m" msgstr "kunde inte öppna TOC-fil \"%s\" för läsning: %m" -#: pg_backup_tar.c:213 +#: pg_backup_tar.c:209 #, c-format msgid "could not open TOC file for input: %m" msgstr "kunde inte öppna TOC-fil för läsning: %m" -#: pg_backup_tar.c:322 +#: pg_backup_tar.c:318 #, c-format msgid "could not find file \"%s\" in archive" msgstr "kunde inte hitta fil \"%s\" i arkiv" -#: pg_backup_tar.c:382 +#: pg_backup_tar.c:378 #, c-format msgid "could not generate temporary file name: %m" msgstr "kunde inte generera temporärt filnamn: %m" -#: pg_backup_tar.c:624 +#: pg_backup_tar.c:619 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "oväntad COPY-satssyntax: \"%s\"" -#: pg_backup_tar.c:890 +#: pg_backup_tar.c:903 #, c-format msgid "invalid OID for large object (%u)" msgstr "ogiltig OID för stort objekt (%u)" -#: pg_backup_tar.c:1035 +#: pg_backup_tar.c:1048 #, c-format msgid "could not close temporary file: %m" msgstr "kunde inte stänga temporär fil: %m" -#: pg_backup_tar.c:1038 +#: pg_backup_tar.c:1051 #, c-format msgid "actual file length (%lld) does not match expected (%lld)" msgstr "verklig fillängd (%lld) matchar inte det förväntade (%lld)" -#: pg_backup_tar.c:1084 pg_backup_tar.c:1115 +#: pg_backup_tar.c:1097 pg_backup_tar.c:1128 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "kunde inte hitta filhuvud för fil \"%s\" i tar-arkiv" -#: pg_backup_tar.c:1102 +#: pg_backup_tar.c:1115 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "dumpa data i oordning stöds inte av detta arkivformat: \"%s\" krävs, men kommer före \"%s\" i denna arkivfil." -#: pg_backup_tar.c:1149 +#: pg_backup_tar.c:1162 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" msgstr[0] "inkomplett tar-huvud hittat (%lu byte)" msgstr[1] "inkomplett tar-huvud hittat (%lu bytes)" -#: pg_backup_tar.c:1188 +#: pg_backup_tar.c:1201 #, c-format msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" msgstr "trasigt tar-huvud hittat i %s (förväntade %d, beräknad %d) filposition %llu" @@ -1240,10 +1463,10 @@ msgstr "trasigt tar-huvud hittat i %s (förväntade %d, beräknad %d) filpositio msgid "unrecognized section name: \"%s\"" msgstr "okänt sektionsnamn: \"%s\"" -#: pg_backup_utils.c:55 pg_dump.c:627 pg_dump.c:644 pg_dumpall.c:340 -#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373 -#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307 -#: pg_restore.c:321 +#: pg_backup_utils.c:55 pg_dump.c:694 pg_dump.c:711 pg_dumpall.c:370 +#: pg_dumpall.c:380 pg_dumpall.c:388 pg_dumpall.c:396 pg_dumpall.c:403 +#: pg_dumpall.c:413 pg_dumpall.c:488 pg_restore.c:307 pg_restore.c:323 +#: pg_restore.c:337 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." @@ -1253,72 +1476,82 @@ msgstr "Försök med \"%s --help\" för mer information." msgid "out of on_exit_nicely slots" msgstr "slut pÃ¥ on_exit_nicely-slottar" -#: pg_dump.c:642 pg_dumpall.c:348 pg_restore.c:305 +#: pg_dump.c:709 pg_dumpall.c:378 pg_restore.c:321 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")" -#: pg_dump.c:661 pg_restore.c:328 +#: pg_dump.c:728 pg_restore.c:344 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "flaggorna \"bara schema\" (-s) och \"bara data\" (-a) kan inte användas tillsammans" -#: pg_dump.c:664 +#: pg_dump.c:731 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "flaggorna -s/--schema-only och --include-foreign-data kan inte användas tillsammans" -#: pg_dump.c:667 +#: pg_dump.c:734 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "flaggan --include-foreign-data stöds inte med parallell backup" -#: pg_dump.c:670 pg_restore.c:331 +#: pg_dump.c:737 pg_restore.c:347 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "flaggorna \"nollställ\" (-c) och \"bara data\" (-a) kan inte användas tillsammans" -#: pg_dump.c:673 pg_dumpall.c:378 pg_restore.c:356 +#: pg_dump.c:740 pg_dumpall.c:408 pg_restore.c:375 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "flaggan --if-exists kräver flaggan -c/--clean" -#: pg_dump.c:680 +#: pg_dump.c:747 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "flagga --on-conflict-do-nothing kräver --inserts, --rows-per-insert eller --column-inserts" -#: pg_dump.c:702 +#: pg_dump.c:776 +#, c-format +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "okänd komprimeringsalgoritm: \"%s\"" + +#: pg_dump.c:783 +#, c-format +msgid "invalid compression specification: %s" +msgstr "ogiltig inställning för komprimering: %s" + +#: pg_dump.c:796 #, c-format -msgid "requested compression not available in this installation -- archive will be uncompressed" -msgstr "efterfrÃ¥gad komprimering finns inte i denna installation -- arkivet kommer sparas okomprimerat" +msgid "compression option \"%s\" is not currently supported by pg_dump" +msgstr "komprimeringsflaggan \"%s\" stöds inte än av pg_dump" -#: pg_dump.c:715 +#: pg_dump.c:808 #, c-format msgid "parallel backup only supported by the directory format" msgstr "parallell backup stöds bara med katalogformat" -#: pg_dump.c:761 +#: pg_dump.c:854 #, c-format msgid "last built-in OID is %u" msgstr "sista inbyggda OID är %u" -#: pg_dump.c:770 +#: pg_dump.c:863 #, c-format msgid "no matching schemas were found" msgstr "hittade inga matchande scheman" -#: pg_dump.c:784 +#: pg_dump.c:880 #, c-format msgid "no matching tables were found" msgstr "hittade inga matchande tabeller" -#: pg_dump.c:806 +#: pg_dump.c:908 #, c-format msgid "no matching extensions were found" msgstr "hittade inga matchande utökningar" -#: pg_dump.c:989 +#: pg_dump.c:1092 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1327,17 +1560,17 @@ msgstr "" "%s dumpar en databas som en textfil eller i andra format.\n" "\n" -#: pg_dump.c:990 pg_dumpall.c:605 pg_restore.c:433 +#: pg_dump.c:1093 pg_dumpall.c:635 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_dump.c:991 +#: pg_dump.c:1094 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [FLAGGA]... [DBNAMN]\n" -#: pg_dump.c:993 pg_dumpall.c:608 pg_restore.c:436 +#: pg_dump.c:1096 pg_dumpall.c:638 pg_restore.c:455 #, c-format msgid "" "\n" @@ -1346,12 +1579,12 @@ msgstr "" "\n" "Allmänna flaggor:\n" -#: pg_dump.c:994 +#: pg_dump.c:1097 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=FILENAME fil eller katalognamn för utdata\n" -#: pg_dump.c:995 +#: pg_dump.c:1098 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1360,42 +1593,51 @@ msgstr "" " -F, --format=c|d|t|p utdatans filformat (egen (c), katalog (d), tar (t),\n" " ren text (p) (standard))\n" -#: pg_dump.c:997 +#: pg_dump.c:1100 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM använd sÃ¥ här mÃ¥nga parellella job för att dumpa\n" -#: pg_dump.c:998 pg_dumpall.c:610 +#: pg_dump.c:1101 pg_dumpall.c:640 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose visa mer information\n" -#: pg_dump.c:999 pg_dumpall.c:611 +#: pg_dump.c:1102 pg_dumpall.c:641 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_dump.c:1000 +#: pg_dump.c:1103 #, c-format -msgid " -Z, --compress=0-9 compression level for compressed formats\n" -msgstr " -Z, --compress=0-9 komprimeringsnivÃ¥ för komprimerade format\n" +msgid "" +" -Z, --compress=METHOD[:DETAIL]\n" +" compress as specified\n" +msgstr "" +" -Z, --compress=METOD[:DETALJ]\n" +" komprimera som angivet\n" -#: pg_dump.c:1001 pg_dumpall.c:612 +#: pg_dump.c:1105 pg_dumpall.c:642 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=TIMEOUT misslyckas efter att ha väntat i TIMEOUT pÃ¥ tabellÃ¥s\n" -#: pg_dump.c:1002 pg_dumpall.c:639 +#: pg_dump.c:1106 pg_dumpall.c:670 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync vänta inte pÃ¥ att ändingar säkert skrivits till disk\n" -#: pg_dump.c:1003 pg_dumpall.c:613 +#: pg_dump.c:1107 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METOD sätt synkmetod för att synka filer till disk\n" + +#: pg_dump.c:1108 pg_dumpall.c:643 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_dump.c:1005 pg_dumpall.c:614 +#: pg_dump.c:1110 pg_dumpall.c:644 #, c-format msgid "" "\n" @@ -1404,52 +1646,62 @@ msgstr "" "\n" "Flaggor som styr utmatning:\n" -#: pg_dump.c:1006 pg_dumpall.c:615 +#: pg_dump.c:1111 pg_dumpall.c:645 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only dumpa bara data, inte schema\n" -#: pg_dump.c:1007 +#: pg_dump.c:1112 +#, c-format +msgid " -b, --large-objects include large objects in dump\n" +msgstr " -b, --large-objects inkludera stora objekt i dumpen\n" + +#: pg_dump.c:1113 +#, c-format +msgid " --blobs (same as --large-objects, deprecated)\n" +msgstr " --blobs (samma som --large-objects, obsolet)\n" + +#: pg_dump.c:1114 #, c-format -msgid " -b, --blobs include large objects in dump\n" -msgstr " -b, --blobs inkludera stora objekt i dumpen\n" +msgid " -B, --no-large-objects exclude large objects in dump\n" +msgstr " -B, --no-large-objects exkludera stora objekt i dumpen\n" -#: pg_dump.c:1008 +#: pg_dump.c:1115 #, c-format -msgid " -B, --no-blobs exclude large objects in dump\n" -msgstr " -B, --no-blobs exkludera stora objekt i dumpen\n" +msgid " --no-blobs (same as --no-large-objects, deprecated)\n" +msgstr " --no-blobs (samma som --no-large-objects, obsolet)\n" -#: pg_dump.c:1009 pg_restore.c:447 +#: pg_dump.c:1116 pg_restore.c:466 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean nollställ (drop) databasobjekt innan Ã¥terskapande\n" -#: pg_dump.c:1010 +#: pg_dump.c:1117 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr " -C, --create inkludera kommandon för att skapa databasen i dumpen\n" -#: pg_dump.c:1011 +#: pg_dump.c:1118 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr " -e, --extension=MALL dumpa bara de angivna utökningarna\n" -#: pg_dump.c:1012 pg_dumpall.c:617 +#: pg_dump.c:1119 pg_dumpall.c:647 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=KODNING dumpa data i teckenkodning KODNING\n" -#: pg_dump.c:1013 +#: pg_dump.c:1120 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=MALL dumpa bara de angivna scheman\n" -#: pg_dump.c:1014 +#: pg_dump.c:1121 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=MALL dumpa INTE de angivna scheman\n" -#: pg_dump.c:1015 +#: pg_dump.c:1122 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1458,52 +1710,52 @@ msgstr "" " -O, --no-owner hoppa över Ã¥terställande av objektägare i\n" " textformatdumpar\n" -#: pg_dump.c:1017 pg_dumpall.c:621 +#: pg_dump.c:1124 pg_dumpall.c:651 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only dumpa bara scheman, inte data\n" -#: pg_dump.c:1018 +#: pg_dump.c:1125 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr " -S, --superuser=NAME namn pÃ¥ superuser för textformatdumpar\n" -#: pg_dump.c:1019 +#: pg_dump.c:1126 #, c-format -msgid " -t, --table=PATTERN dump the specified table(s) only\n" +msgid " -t, --table=PATTERN dump only the specified table(s)\n" msgstr " -t, --table=MALL dumpa bara de angivna tabellerna\n" -#: pg_dump.c:1020 +#: pg_dump.c:1127 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=MALL dumpa INTE de angivna tabellerna\n" -#: pg_dump.c:1021 pg_dumpall.c:624 +#: pg_dump.c:1128 pg_dumpall.c:654 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges dumpa inte rättigheter (grant/revoke)\n" -#: pg_dump.c:1022 pg_dumpall.c:625 +#: pg_dump.c:1129 pg_dumpall.c:655 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade används bara av uppgraderingsverktyg\n" -#: pg_dump.c:1023 pg_dumpall.c:626 +#: pg_dump.c:1130 pg_dumpall.c:656 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr " --column-inserts dumpa data som INSERT med kolumnnamn\n" -#: pg_dump.c:1024 pg_dumpall.c:627 +#: pg_dump.c:1131 pg_dumpall.c:657 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr " --disable-dollar-quoting slÃ¥ av dollar-citering, använd standard SQL-citering\n" -#: pg_dump.c:1025 pg_dumpall.c:628 pg_restore.c:464 +#: pg_dump.c:1132 pg_dumpall.c:658 pg_restore.c:483 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr " --disable-triggers slÃ¥ av triggrar vid Ã¥terställning av enbart data\n" -#: pg_dump.c:1026 +#: pg_dump.c:1133 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" @@ -1512,22 +1764,59 @@ msgstr "" " --enable-row-security slÃ¥ pÃ¥ radsäkerhet (dumpa bara data användaren\n" " har rätt till)\n" -#: pg_dump.c:1028 +#: pg_dump.c:1135 +#, c-format +msgid " --exclude-extension=PATTERN do NOT dump the specified extension(s)\n" +msgstr " --exclude-extension=MALL dumpa INTE de angivna utökningarna\n" + +#: pg_dump.c:1136 +#, c-format +msgid "" +" --exclude-table-and-children=PATTERN\n" +" do NOT dump the specified table(s), including\n" +" child and partition tables\n" +msgstr "" +" --exclude-table-and-children=MALL\n" +" dumpa INTE angivna tabeller, inklusive\n" +" barn och partitionstabeller\n" + +#: pg_dump.c:1139 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=MALL dumpa INTE data för de angivna tabellerna\n" -#: pg_dump.c:1029 pg_dumpall.c:630 +#: pg_dump.c:1140 +#, c-format +msgid "" +" --exclude-table-data-and-children=PATTERN\n" +" do NOT dump data for the specified table(s),\n" +" including child and partition tables\n" +msgstr "" +" --exclude-table-data-and-children=MALL\n" +" dumpa INTE data för angivna tabeller,\n" +" inklusive barn och partitionstabeller\n" + +#: pg_dump.c:1143 pg_dumpall.c:660 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=NUM övertrumfa standardinställningen för extra_float_digits\n" -#: pg_dump.c:1030 pg_dumpall.c:631 pg_restore.c:466 +#: pg_dump.c:1144 +#, c-format +msgid "" +" --filter=FILENAME include or exclude objects and data from dump\n" +" based on expressions in FILENAME\n" +msgstr "" +" --filter=FILENAMN inkludera eller exkludera objekt och data\n" +" frÃ¥n dump baserat pÃ¥ uttryck i FILNAMN\n" +"\n" + +#: pg_dump.c:1146 pg_dumpall.c:662 pg_restore.c:487 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists använd IF EXISTS när objekt droppas\n" -#: pg_dump.c:1031 +#: pg_dump.c:1147 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1538,87 +1827,87 @@ msgstr "" " inkludera data i främmande tabeller frÃ¥n\n" " främmande servrar som matchar MALL\n" -#: pg_dump.c:1034 pg_dumpall.c:632 +#: pg_dump.c:1150 pg_dumpall.c:663 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts dumpa data som INSERT, istället för COPY\n" -#: pg_dump.c:1035 pg_dumpall.c:633 +#: pg_dump.c:1151 pg_dumpall.c:664 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root ladda partitioner via root-tabellen\n" -#: pg_dump.c:1036 pg_dumpall.c:634 +#: pg_dump.c:1152 pg_dumpall.c:665 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments dumpa inte kommentarer\n" -#: pg_dump.c:1037 pg_dumpall.c:635 +#: pg_dump.c:1153 pg_dumpall.c:666 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications dumpa inte publiceringar\n" -#: pg_dump.c:1038 pg_dumpall.c:637 +#: pg_dump.c:1154 pg_dumpall.c:668 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels dumpa inte tilldelning av säkerhetsetiketter\n" -#: pg_dump.c:1039 pg_dumpall.c:638 +#: pg_dump.c:1155 pg_dumpall.c:669 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions dumpa inte prenumereringar\n" -#: pg_dump.c:1040 pg_dumpall.c:640 +#: pg_dump.c:1156 pg_dumpall.c:671 #, c-format msgid " --no-table-access-method do not dump table access methods\n" msgstr " --no-table-access-method dumpa inte tabellaccessmetoder\n" -#: pg_dump.c:1041 pg_dumpall.c:641 +#: pg_dump.c:1157 pg_dumpall.c:672 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces dumpa inte användning av tabellutymmen\n" -#: pg_dump.c:1042 pg_dumpall.c:642 +#: pg_dump.c:1158 pg_dumpall.c:673 #, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" msgstr " --no-toast-compression dumpa inte komprimeringsmetoder för TOAST\n" -#: pg_dump.c:1043 pg_dumpall.c:643 +#: pg_dump.c:1159 pg_dumpall.c:674 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data dumpa inte ologgad tabelldata\n" -#: pg_dump.c:1044 pg_dumpall.c:644 +#: pg_dump.c:1160 pg_dumpall.c:675 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr " --on-conflict-do-nothing addera ON CONFLICT DO NOTHING till INSERT-kommandon\n" -#: pg_dump.c:1045 pg_dumpall.c:645 +#: pg_dump.c:1161 pg_dumpall.c:676 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr " --quote-all-identifiers citera alla identifierar, även om de inte är nyckelord\n" -#: pg_dump.c:1046 pg_dumpall.c:646 +#: pg_dump.c:1162 pg_dumpall.c:677 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NRADER antal rader per INSERT; implicerar --inserts\n" -#: pg_dump.c:1047 +#: pg_dump.c:1163 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr " --section=SEKTION dumpa namngiven sektion (pre-data, data eller post-data)\n" -#: pg_dump.c:1048 +#: pg_dump.c:1164 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr " --serializable-deferrable wait until the dump can run without anomalies\n" -#: pg_dump.c:1049 +#: pg_dump.c:1165 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT använda namngivet snapshot för att dumpa\n" -#: pg_dump.c:1050 pg_restore.c:476 +#: pg_dump.c:1166 pg_restore.c:497 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" @@ -1627,7 +1916,16 @@ msgstr "" " --strict-names kräv att mallar för tabeller och/eller scheman matchar\n" " minst en sak var\n" -#: pg_dump.c:1052 pg_dumpall.c:647 pg_restore.c:478 +#: pg_dump.c:1168 +#, c-format +msgid "" +" --table-and-children=PATTERN dump only the specified table(s), including\n" +" child and partition tables\n" +msgstr "" +" --table-and-children=MALL dumpa bara angivna tabell(er), inklusive\n" +" barn och partitionstabeller\n" + +#: pg_dump.c:1170 pg_dumpall.c:678 pg_restore.c:500 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1638,7 +1936,7 @@ msgstr "" " använd kommandot SET SESSION AUTHORIZATION istället för\n" " kommandot ALTER OWNER för att sätta ägare\n" -#: pg_dump.c:1056 pg_dumpall.c:651 pg_restore.c:482 +#: pg_dump.c:1174 pg_dumpall.c:682 pg_restore.c:504 #, c-format msgid "" "\n" @@ -1647,42 +1945,42 @@ msgstr "" "\n" "Flaggor för anslutning:\n" -#: pg_dump.c:1057 +#: pg_dump.c:1175 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAMN databasens som skall dumpas\n" -#: pg_dump.c:1058 pg_dumpall.c:653 pg_restore.c:483 +#: pg_dump.c:1176 pg_dumpall.c:684 pg_restore.c:505 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n" -#: pg_dump.c:1059 pg_dumpall.c:655 pg_restore.c:484 +#: pg_dump.c:1177 pg_dumpall.c:686 pg_restore.c:506 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT databasens värdport\n" -#: pg_dump.c:1060 pg_dumpall.c:656 pg_restore.c:485 +#: pg_dump.c:1178 pg_dumpall.c:687 pg_restore.c:507 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAMN anslut med datta användarnamn mot databasen\n" -#: pg_dump.c:1061 pg_dumpall.c:657 pg_restore.c:486 +#: pg_dump.c:1179 pg_dumpall.c:688 pg_restore.c:508 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password frÃ¥ga aldrig efter lösenord\n" -#: pg_dump.c:1062 pg_dumpall.c:658 pg_restore.c:487 +#: pg_dump.c:1180 pg_dumpall.c:689 pg_restore.c:509 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password frÃ¥ga om lösenord (borde ske automatiskt)\n" -#: pg_dump.c:1063 pg_dumpall.c:659 +#: pg_dump.c:1181 pg_dumpall.c:690 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLLNAMN gör SET ROLE innan dumpen\n" -#: pg_dump.c:1065 +#: pg_dump.c:1183 #, c-format msgid "" "\n" @@ -1695,525 +1993,537 @@ msgstr "" "PGDATABASE att användas.\n" "\n" -#: pg_dump.c:1067 pg_dumpall.c:663 pg_restore.c:494 +#: pg_dump.c:1185 pg_dumpall.c:694 pg_restore.c:516 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapportera fel till <%s>.\n" -#: pg_dump.c:1068 pg_dumpall.c:664 pg_restore.c:495 +#: pg_dump.c:1186 pg_dumpall.c:695 pg_restore.c:517 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_dump.c:1087 pg_dumpall.c:488 +#: pg_dump.c:1205 pg_dumpall.c:518 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "ogiltig klientteckenkodning \"%s\" angiven" -#: pg_dump.c:1225 +#: pg_dump.c:1352 #, c-format msgid "parallel dumps from standby servers are not supported by this server version" msgstr "parallella dumpar frÃ¥n standby-server stöds inte av denna serverversion" -#: pg_dump.c:1290 +#: pg_dump.c:1417 #, c-format msgid "invalid output format \"%s\" specified" msgstr "ogiltigt utdataformat \"%s\" angivet" -#: pg_dump.c:1331 pg_dump.c:1387 pg_dump.c:1440 pg_dumpall.c:1282 +#: pg_dump.c:1458 pg_dump.c:1514 pg_dump.c:1567 pg_dumpall.c:1467 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "ej korrekt kvalificerat namn (för mÃ¥nga namn med punkt): %s" -#: pg_dump.c:1339 +#: pg_dump.c:1466 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "hittade inga matchande scheman för mallen \"%s\"" -#: pg_dump.c:1392 +#: pg_dump.c:1519 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "hittade inga matchande utökningar för mallen \"%s\"" -#: pg_dump.c:1445 +#: pg_dump.c:1572 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "hittade inga matchande främmande servrar för mallen \"%s\"" -#: pg_dump.c:1508 +#: pg_dump.c:1643 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "ej korrekt relationsnamn (för mÃ¥nga namn med punkt): %s" -#: pg_dump.c:1519 +#: pg_dump.c:1665 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "hittade inga matchande tabeller för mallen \"%s\"" -#: pg_dump.c:1546 +#: pg_dump.c:1692 #, c-format msgid "You are currently not connected to a database." msgstr "Du är för närvarande inte uppkopplad mot en databas." -#: pg_dump.c:1549 +#: pg_dump.c:1695 #, c-format msgid "cross-database references are not implemented: %s" msgstr "referenser till andra databaser är inte implementerat: %s" -#: pg_dump.c:1980 +#: pg_dump.c:2154 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "dumpar innehÃ¥llet i tabell \"%s.%s\"" -#: pg_dump.c:2086 +#: pg_dump.c:2264 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Dumpning av innehÃ¥llet i tabellen \"%s\" misslyckades: PQendcopy() misslyckades." -#: pg_dump.c:2087 pg_dump.c:2097 +#: pg_dump.c:2265 pg_dump.c:2275 #, c-format msgid "Error message from server: %s" msgstr "Felmeddelandet frÃ¥n servern: %s" -#: pg_dump.c:2088 pg_dump.c:2098 +#: pg_dump.c:2266 pg_dump.c:2276 #, c-format msgid "Command was: %s" msgstr "Kommandot var: %s" -#: pg_dump.c:2096 +#: pg_dump.c:2274 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Dumpning av innehÃ¥llet i tabellen \"%s\" misslyckades: PQgetResult() misslyckades." -#: pg_dump.c:2178 +#: pg_dump.c:2365 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "fel antal fält hämtades för tabell \"%s\"" -#: pg_dump.c:2836 +#: pg_dump.c:3067 #, c-format msgid "saving database definition" msgstr "sparar databasdefinition" -#: pg_dump.c:2932 +#: pg_dump.c:3176 #, c-format msgid "unrecognized locale provider: %s" msgstr "okänd lokalleverantör: %s" -#: pg_dump.c:3248 +#: pg_dump.c:3537 #, c-format msgid "saving encoding = %s" msgstr "sparar kodning = %s" -#: pg_dump.c:3273 +#: pg_dump.c:3562 #, c-format -msgid "saving standard_conforming_strings = %s" -msgstr "sparar standard_conforming_strings = %s" +msgid "saving \"standard_conforming_strings = %s\"" +msgstr "sparar \"standard_conforming_strings = %s\"" -#: pg_dump.c:3312 +#: pg_dump.c:3601 #, c-format msgid "could not parse result of current_schemas()" msgstr "kunde inte parsa resultat frÃ¥n current_schemas()" -#: pg_dump.c:3331 +#: pg_dump.c:3620 #, c-format -msgid "saving search_path = %s" -msgstr "sparar search_path = %s" +msgid "saving \"search_path = %s\"" +msgstr "sparar \"search_path = %s\"" -#: pg_dump.c:3369 +#: pg_dump.c:3656 #, c-format msgid "reading large objects" msgstr "läser stora objekt" -#: pg_dump.c:3507 +#: pg_dump.c:3877 #, c-format -msgid "saving large objects" -msgstr "sparar stora objekt" +msgid "saving large objects \"%s\"" +msgstr "sparar stora objekt \"%s\"" -#: pg_dump.c:3548 +#: pg_dump.c:3898 #, c-format msgid "error reading large object %u: %s" msgstr "fel vid läsning av stort objekt %u: %s" -#: pg_dump.c:3654 +#: pg_dump.c:4001 #, c-format msgid "reading row-level security policies" msgstr "läser säkerhetspolicy pÃ¥ radnivÃ¥" -#: pg_dump.c:3795 +#: pg_dump.c:4142 #, c-format msgid "unexpected policy command type: %c" msgstr "oväntad kommandotyp för policy: %c" -#: pg_dump.c:4245 pg_dump.c:4562 pg_dump.c:11693 pg_dump.c:17510 -#: pg_dump.c:17512 pg_dump.c:18133 +#: pg_dump.c:4592 pg_dump.c:5150 pg_dump.c:12362 pg_dump.c:18246 +#: pg_dump.c:18248 pg_dump.c:18870 #, c-format msgid "could not parse %s array" msgstr "kunde inte parsa arrayen %s" -#: pg_dump.c:4430 +#: pg_dump.c:4806 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "prenumerationer har inte dumpats fÃ¥ aktuell användare inte är en superuser" -#: pg_dump.c:4944 +#: pg_dump.c:5012 +#, c-format +msgid "subscription with OID %u does not exist" +msgstr "prenumeration med OID %u existerar inte" + +#: pg_dump.c:5019 +#, c-format +msgid "failed sanity check, table with OID %u not found" +msgstr "misslyckades med riktighetskontroll, hittade inte tabell med OID %u" + +#: pg_dump.c:5582 #, c-format msgid "could not find parent extension for %s %s" msgstr "kunde inte hitta föräldrautökning för %s %s" -#: pg_dump.c:5089 +#: pg_dump.c:5727 #, c-format msgid "schema with OID %u does not exist" msgstr "schema med OID %u existerar inte" -#: pg_dump.c:6543 pg_dump.c:16774 +#: pg_dump.c:7209 pg_dump.c:17617 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "misslyckades med riktighetskontroll, föräldratabell med OID %u för sekvens med OID %u hittas inte" -#: pg_dump.c:6847 pg_dump.c:7114 pg_dump.c:7585 pg_dump.c:8252 pg_dump.c:8373 -#: pg_dump.c:8527 +#: pg_dump.c:7352 +#, c-format +msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found" +msgstr "misslyckades med riktighetskontroll, hittade inte tabell med OID %u i pg_partitioned_table" + +#: pg_dump.c:7583 pg_dump.c:7857 pg_dump.c:8304 pg_dump.c:8918 pg_dump.c:9040 +#: pg_dump.c:9188 #, c-format msgid "unrecognized table OID %u" msgstr "okänt tabell-OID %u" -#: pg_dump.c:6851 +#: pg_dump.c:7587 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "oväntat indexdata för tabell \"%s\"" -#: pg_dump.c:7346 +#: pg_dump.c:8089 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "misslyckades med riktighetskontroll, föräldratabell med OID %u för pg_rewrite-rad med OID %u hittades inte" -#: pg_dump.c:7637 -#, c-format -msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" -msgstr "frÃ¥ga producerade null som refererad tabell för främmande nyckel-trigger \"%s\" i tabell \"%s\" (OID för tabell : %u)" - -#: pg_dump.c:8256 +#: pg_dump.c:8922 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "oväntad kolumndata för tabell \"%s\"" -#: pg_dump.c:8286 +#: pg_dump.c:8951 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "ogiltigt kolumnnumrering i tabell \"%s\"" -#: pg_dump.c:8335 +#: pg_dump.c:9002 #, c-format msgid "finding table default expressions" msgstr "hittar tabellers default-uttryck" -#: pg_dump.c:8377 +#: pg_dump.c:9044 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "felaktigt adnum-värde %d för tabell \"%s\"" -#: pg_dump.c:8477 +#: pg_dump.c:9138 #, c-format msgid "finding table check constraints" msgstr "hittar tabellers check-villkor" -#: pg_dump.c:8531 +#: pg_dump.c:9192 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" msgstr[0] "förväntade %d check-villkor för tabell \"%s\" men hittade %d" msgstr[1] "förväntade %d check-villkor för tabell \"%s\" men hittade %d" -#: pg_dump.c:8535 +#: pg_dump.c:9196 #, c-format msgid "The system catalogs might be corrupted." msgstr "Systemkatalogerna kan vara trasiga." -#: pg_dump.c:9225 +#: pg_dump.c:9886 #, c-format msgid "role with OID %u does not exist" msgstr "roll med OID %u existerar inte" -#: pg_dump.c:9337 pg_dump.c:9366 +#: pg_dump.c:9998 pg_dump.c:10027 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "ogiltig pg_init_privs-post: %u %u %d" -#: pg_dump.c:10187 +#: pg_dump.c:10574 +#, c-format +msgid "missing metadata for large objects \"%s\"" +msgstr "saknar metadata för stort objekt \"%s\"" + +#: pg_dump.c:10857 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "typtype för datatyp \"%s\" verkar vara ogiltig" -#: pg_dump.c:11762 +#: pg_dump.c:12431 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "okänt provolatile-värde för funktion \"%s\"" -#: pg_dump.c:11812 pg_dump.c:13603 +#: pg_dump.c:12481 pg_dump.c:14377 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "okänt proparallel-värde för funktion \"%s\"" -#: pg_dump.c:11943 pg_dump.c:12049 pg_dump.c:12056 +#: pg_dump.c:12611 pg_dump.c:12717 pg_dump.c:12724 #, c-format msgid "could not find function definition for function with OID %u" msgstr "kunde inte hitta funktionsdefinitionen för funktion med OID %u" -#: pg_dump.c:11982 +#: pg_dump.c:12650 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "felaktigt värde i fältet pg_cast.castfunc eller pg_cast.castmethod" -#: pg_dump.c:11985 +#: pg_dump.c:12653 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "felaktigt värde i fältet pg_cast.castmethod" -#: pg_dump.c:12075 +#: pg_dump.c:12743 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "felaktig transform-definition, minst en av trffromsql och trftosql mÃ¥ste vara ickenoll" -#: pg_dump.c:12092 +#: pg_dump.c:12760 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "felaktigt värde i fältet pg_transform.trffromsql" -#: pg_dump.c:12113 +#: pg_dump.c:12781 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "felaktigt värde i fältet pg_transform.trftosql" -#: pg_dump.c:12258 +#: pg_dump.c:12926 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "postfix-operatorer stöds inte längre (operator \"%s\")" -#: pg_dump.c:12428 +#: pg_dump.c:13096 #, c-format msgid "could not find operator with OID %s" msgstr "kunde inte hitta en operator med OID %s." -#: pg_dump.c:12496 +#: pg_dump.c:13164 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "ogiltig typ \"%c\" för accessmetod \"%s\"" -#: pg_dump.c:13115 +#: pg_dump.c:13838 pg_dump.c:13906 #, c-format msgid "unrecognized collation provider: %s" msgstr "okänd jämförelseleverantör: %s" -#: pg_dump.c:13522 +#: pg_dump.c:13847 pg_dump.c:13854 pg_dump.c:13865 pg_dump.c:13875 +#: pg_dump.c:13890 +#, c-format +msgid "invalid collation \"%s\"" +msgstr "ogiltig jämförelse \"%s\"" + +#: pg_dump.c:14296 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "okänt aggfinalmodify-värde för aggregat \"%s\"" -#: pg_dump.c:13578 +#: pg_dump.c:14352 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "okänt aggmfinalmodify-värde för aggregat \"%s\"" -#: pg_dump.c:14296 +#: pg_dump.c:15069 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "okänd objekttyp i standardrättigheter: %d" -#: pg_dump.c:14312 +#: pg_dump.c:15085 #, c-format msgid "could not parse default ACL list (%s)" msgstr "kunde inte parsa standard-ACL-lista (%s)" -#: pg_dump.c:14394 +#: pg_dump.c:15169 #, c-format msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "kunde inte parsa initial ACL-lista (%s) eller default (%s) för objekt \"%s\" (%s)" -#: pg_dump.c:14419 +#: pg_dump.c:15194 #, c-format msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "kunde inte parsa ACL-lista (%s) eller default (%s) för objekt \"%s\" (%s)" -#: pg_dump.c:14957 +#: pg_dump.c:15737 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "frÃ¥ga för att hämta definition av vy \"%s\" returnerade ingen data" -#: pg_dump.c:14960 +#: pg_dump.c:15740 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "frÃ¥ga för att hämta definition av vy \"%s\" returnerade mer än en definition" -#: pg_dump.c:14967 +#: pg_dump.c:15747 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "definition av vy \"%s\" verkar vara tom (längd noll)" -#: pg_dump.c:15051 +#: pg_dump.c:15832 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS stöds inte längre (tabell \"%s\")" -#: pg_dump.c:15980 +#: pg_dump.c:16819 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "ogiltigt kolumnnummer %d för tabell \"%s\"" -#: pg_dump.c:16058 +#: pg_dump.c:16897 #, c-format msgid "could not parse index statistic columns" msgstr "kunde inte parsa kolumn i indexstatistik" -#: pg_dump.c:16060 +#: pg_dump.c:16899 #, c-format msgid "could not parse index statistic values" msgstr "kunde inte parsa värden i indexstatistik" -#: pg_dump.c:16062 +#: pg_dump.c:16901 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "antal kolumner och värden stämmer inte i indexstatistik" -#: pg_dump.c:16280 +#: pg_dump.c:17116 #, c-format msgid "missing index for constraint \"%s\"" msgstr "saknar index för integritetsvillkor \"%s\"" -#: pg_dump.c:16508 +#: pg_dump.c:17351 #, c-format msgid "unrecognized constraint type: %c" msgstr "oväntad integritetsvillkorstyp: %c" -#: pg_dump.c:16609 pg_dump.c:16838 +#: pg_dump.c:17452 pg_dump.c:17681 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" msgstr[0] "frÃ¥ga för att hämta data för sekvens \"%s\" returnerade %d rad (förväntade 1)" msgstr[1] "frÃ¥ga för att hämta data för sekvens \"%s\" returnerade %d rader (förväntade 1)" -#: pg_dump.c:16641 +#: pg_dump.c:17484 #, c-format msgid "unrecognized sequence type: %s" msgstr "okänd sekvenstyp: %s" -#: pg_dump.c:16930 -#, c-format -msgid "unexpected tgtype value: %d" -msgstr "oväntat tgtype-värde: %d" - -#: pg_dump.c:17002 -#, c-format -msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" -msgstr "felaktig argumentsträng (%s) för trigger \"%s\" i tabell \"%s\"" - -#: pg_dump.c:17271 +#: pg_dump.c:17998 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "frÃ¥ga för att hämta regel \"%s\" för tabell \"%s\" misslyckades: fel antal rader returnerades" -#: pg_dump.c:17424 +#: pg_dump.c:18151 #, c-format msgid "could not find referenced extension %u" msgstr "kunde inte hitta refererad utökning %u" -#: pg_dump.c:17514 +#: pg_dump.c:18250 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "antal konfigurationer och villkor stämmer inte för utökning" -#: pg_dump.c:17646 +#: pg_dump.c:18382 #, c-format msgid "reading dependency data" msgstr "läser beroendedata" -#: pg_dump.c:17732 +#: pg_dump.c:18468 #, c-format msgid "no referencing object %u %u" msgstr "inget refererande objekt %u %u" -#: pg_dump.c:17743 +#: pg_dump.c:18479 #, c-format msgid "no referenced object %u %u" msgstr "inget refererat objekt %u %u" -#: pg_dump_sort.c:422 +#: pg_dump.c:18904 pg_dump.c:18942 pg_dumpall.c:1962 pg_restore.c:551 +#: pg_restore.c:597 +#, c-format +msgid "%s filter for \"%s\" is not allowed" +msgstr "%s-filter för \"%s\" tillÃ¥ts inte" + +#: pg_dump_sort.c:424 #, c-format msgid "invalid dumpId %d" msgstr "ogiltigt dumpId %d" -#: pg_dump_sort.c:428 +#: pg_dump_sort.c:430 #, c-format msgid "invalid dependency %d" msgstr "ogiltigt beroende %d" -#: pg_dump_sort.c:661 +#: pg_dump_sort.c:594 #, c-format msgid "could not identify dependency loop" msgstr "kunde inte fastställa beroendeloop" -#: pg_dump_sort.c:1232 +#: pg_dump_sort.c:1209 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" msgstr[0] "det finns cirkulära främmande nyckelberoenden för denna tabell:" msgstr[1] "det finns cirkulära främmande nyckelberoenden för dessa tabeller:" -#: pg_dump_sort.c:1236 pg_dump_sort.c:1256 -#, c-format -msgid " %s" -msgstr " %s" - -#: pg_dump_sort.c:1237 +#: pg_dump_sort.c:1214 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "Du kan eventiellt inte Ã¥terställa dumpen utan att använda --disable-triggers eller temporärt droppa vilkoren." -#: pg_dump_sort.c:1238 +#: pg_dump_sort.c:1215 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "Överväg att göra en full dump istället för --data-only för att undvika detta problem." -#: pg_dump_sort.c:1250 +#: pg_dump_sort.c:1227 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "kunde inte räta ut beroendeloopen för dessa saker:" -#: pg_dumpall.c:205 +#: pg_dumpall.c:231 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"" -#: pg_dumpall.c:208 +#: pg_dumpall.c:234 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s" -#: pg_dumpall.c:357 +#: pg_dumpall.c:387 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "flaggan --exclude-database kan inte användas tillsammans med -g/--globals-only, -r/--roles-only eller -t/--tablespaces-only" -#: pg_dumpall.c:365 +#: pg_dumpall.c:395 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "flaggorna \"bara gobala\" (-g) och \"bara roller\" (-r) kan inte användas tillsammans" -#: pg_dumpall.c:372 +#: pg_dumpall.c:402 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "flaggorna \"bara globala\" (-g) och \"bara tabellutrymmen\" (-t) kan inte användas tillsammans" -#: pg_dumpall.c:382 +#: pg_dumpall.c:412 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "flaggorna \"bara roller\" (-r) och \"bara tabellutrymmen\" (-t) kan inte användas tillsammans" -#: pg_dumpall.c:444 pg_dumpall.c:1587 +#: pg_dumpall.c:474 pg_dumpall.c:1771 #, c-format msgid "could not connect to database \"%s\"" msgstr "kunde inte ansluta till databasen \"%s\"" -#: pg_dumpall.c:456 +#: pg_dumpall.c:486 #, c-format msgid "" "could not connect to databases \"postgres\" or \"template1\"\n" @@ -2222,7 +2532,7 @@ msgstr "" "kunde inte ansluta till databasen \"postgres\" eller \"template1\"\n" "Ange en annan databas." -#: pg_dumpall.c:604 +#: pg_dumpall.c:634 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2231,67 +2541,72 @@ msgstr "" "%s extraherar ett PostgreSQL databaskluster till en SQL-scriptfil.\n" "\n" -#: pg_dumpall.c:606 +#: pg_dumpall.c:636 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [FLAGGA]...\n" -#: pg_dumpall.c:609 +#: pg_dumpall.c:639 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=FILENAME utdatafilnamn\n" -#: pg_dumpall.c:616 +#: pg_dumpall.c:646 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean nollställ (drop) databaser innan Ã¥terskapning\n" -#: pg_dumpall.c:618 +#: pg_dumpall.c:648 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr " -g, --globals-only dumpa bara globala objekt, inte databaser\n" -#: pg_dumpall.c:619 pg_restore.c:456 +#: pg_dumpall.c:649 pg_restore.c:475 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner Ã¥terställ inte objektägare\n" -#: pg_dumpall.c:620 +#: pg_dumpall.c:650 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr " -r, --roles-only dumpa endast roller, inte databaser eller tabellutrymmen\n" -#: pg_dumpall.c:622 +#: pg_dumpall.c:652 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr " -S, --superuser=NAMN namn pÃ¥ superuser för användning i dumpen\n" -#: pg_dumpall.c:623 +#: pg_dumpall.c:653 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr " -t, --tablespaces-only dumpa endasdt tabellutrymmen, inte databaser eller roller\n" -#: pg_dumpall.c:629 +#: pg_dumpall.c:659 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr " --exclude-database=MALL uteslut databaser vars namn matchar MALL\n" -#: pg_dumpall.c:636 +#: pg_dumpall.c:661 +#, c-format +msgid " --filter=FILENAME exclude databases based on expressions in FILENAME\n" +msgstr " --filter=FILENAMN exkludera databaser givet uttryck i FILENAMN\n" + +#: pg_dumpall.c:667 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords dumpa inte lösenord för roller\n" -#: pg_dumpall.c:652 +#: pg_dumpall.c:683 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=ANSLSTR anslut med anslutningssträng\n" -#: pg_dumpall.c:654 +#: pg_dumpall.c:685 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAMN alternativ standarddatabas\n" -#: pg_dumpall.c:661 +#: pg_dumpall.c:692 #, c-format msgid "" "\n" @@ -2303,92 +2618,106 @@ msgstr "" "Om -f/--file inte används sÃ¥ kommer SQL-skriptet skriva till standard ut.\n" "\n" -#: pg_dumpall.c:803 +#: pg_dumpall.c:837 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "rollnamn som startar med \"pg_\" hoppas över (%s)" -#: pg_dumpall.c:1018 +#: pg_dumpall.c:1059 +#, c-format +msgid "could not find a legal dump ordering for memberships in role \"%s\"" +msgstr "kunde inte hitta en korrekt dumpordning för medlemskap i rollen \"%s\"" + +#: pg_dumpall.c:1194 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "kunde inte parsa ACL-listan (%s) för parameter \"%s\"" -#: pg_dumpall.c:1136 +#: pg_dumpall.c:1321 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "kunde inte tolka ACL-listan (%s) för tabellutrymme \"%s\"" -#: pg_dumpall.c:1343 +#: pg_dumpall.c:1528 #, c-format msgid "excluding database \"%s\"" msgstr "utesluter databas \"%s\"" -#: pg_dumpall.c:1347 +#: pg_dumpall.c:1532 #, c-format msgid "dumping database \"%s\"" msgstr "dumpar databas \"%s\"" -#: pg_dumpall.c:1378 +#: pg_dumpall.c:1563 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "pg_dump misslyckades med databas \"%s\", avslutar" -#: pg_dumpall.c:1384 +#: pg_dumpall.c:1569 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "kunde inte öppna om utdatafilen \"%s\": %m" -#: pg_dumpall.c:1425 +#: pg_dumpall.c:1613 #, c-format msgid "running \"%s\"" msgstr "kör \"%s\"" -#: pg_dumpall.c:1630 +#: pg_dumpall.c:1814 #, c-format msgid "could not get server version" msgstr "kunde inte hämta serverversionen" -#: pg_dumpall.c:1633 +#: pg_dumpall.c:1817 #, c-format msgid "could not parse server version \"%s\"" msgstr "kunde inte tolka versionsträngen \"%s\"" -#: pg_dumpall.c:1703 pg_dumpall.c:1726 +#: pg_dumpall.c:1887 pg_dumpall.c:1910 #, c-format msgid "executing %s" msgstr "kör: %s" -#: pg_restore.c:313 +#: pg_dumpall.c:1982 +msgid "unsupported filter object" +msgstr "filterobjektet stöds inte" + +#: pg_restore.c:329 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "en av flaggorna -d/--dbname och -f/--file mÃ¥ste anges" -#: pg_restore.c:320 +#: pg_restore.c:336 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "flaggorna -d/--dbname och -f/--file kan inte användas ihop" -#: pg_restore.c:338 +#: pg_restore.c:350 +#, c-format +msgid "options -1/--single-transaction and --transaction-size cannot be used together" +msgstr "flaggorna -1/--single-transaction och --transaction-size kan inte användas tillsammans" + +#: pg_restore.c:357 #, c-format msgid "options -C/--create and -1/--single-transaction cannot be used together" msgstr "flaggorna -C/--create och -1/--single-transaction kan inte användas tillsammans" -#: pg_restore.c:342 +#: pg_restore.c:361 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "kan inte ange bÃ¥de --single-transaction och multipla job" -#: pg_restore.c:380 +#: pg_restore.c:399 #, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "okänt arkivformat \"%s\"; vänligen ange \"c\", \"d\" eller \"t\"" -#: pg_restore.c:419 +#: pg_restore.c:438 #, c-format msgid "errors ignored on restore: %d" msgstr "fel ignorerade vid Ã¥terställande: %d" -#: pg_restore.c:432 +#: pg_restore.c:451 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" @@ -2397,47 +2726,47 @@ msgstr "" "%s Ã¥terställer en PostgreSQL-databas frÃ¥n ett arkiv skapat av pg_dump.\n" "\n" -#: pg_restore.c:434 +#: pg_restore.c:453 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [FLAGGA]... [FIL]\n" -#: pg_restore.c:437 +#: pg_restore.c:456 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr " -d, --dbname=NAMN koppla upp med databasnamn\n" -#: pg_restore.c:438 +#: pg_restore.c:457 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr " -f, --file=FILNAMN utdatafilnamn (- för stdout)\n" -#: pg_restore.c:439 +#: pg_restore.c:458 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr " -F, --format=c|d|t backupens filformat (bör ske automatiskt)\n" -#: pg_restore.c:440 +#: pg_restore.c:459 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list skriv ut summerad TOC för arkivet\n" -#: pg_restore.c:441 +#: pg_restore.c:460 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose visa mer information\n" -#: pg_restore.c:442 +#: pg_restore.c:461 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_restore.c:443 +#: pg_restore.c:462 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_restore.c:445 +#: pg_restore.c:464 #, c-format msgid "" "\n" @@ -2446,32 +2775,32 @@ msgstr "" "\n" "Flaggor som styr Ã¥terställning:\n" -#: pg_restore.c:446 +#: pg_restore.c:465 #, c-format msgid " -a, --data-only restore only the data, no schema\n" msgstr " -a, --data-only Ã¥terställ bara data, inte scheman\n" -#: pg_restore.c:448 +#: pg_restore.c:467 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create skapa mÃ¥ldatabasen\n" -#: pg_restore.c:449 +#: pg_restore.c:468 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr " -e, --exit-on-error avsluta vid fel, standard är att fortsätta\n" -#: pg_restore.c:450 +#: pg_restore.c:469 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NAMN Ã¥terställ namngivet index\n" -#: pg_restore.c:451 +#: pg_restore.c:470 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr " -j, --jobs=NUM använda sÃ¥ här mÃ¥nga parallella job för Ã¥terställning\n" -#: pg_restore.c:452 +#: pg_restore.c:471 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" @@ -2480,62 +2809,71 @@ msgstr "" " -L, --use-list=FILNAMN använd innehÃ¥llsförteckning frÃ¥n denna fil för\n" " att välja/sortera utdata\n" -#: pg_restore.c:454 +#: pg_restore.c:473 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr " -n, --schema=NAMN Ã¥terställ enbart objekt i detta schema\n" -#: pg_restore.c:455 +#: pg_restore.c:474 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" msgstr " -N, --exclude-schema=NAMN Ã¥terställ inte objekt i detta schema\n" -#: pg_restore.c:457 +#: pg_restore.c:476 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=NAMN(arg) Ã¥terställ namngiven funktion\n" -#: pg_restore.c:458 +#: pg_restore.c:477 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" msgstr " -s, --schema-only Ã¥terställ bara scheman, inte data\n" -#: pg_restore.c:459 +#: pg_restore.c:478 #, c-format msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" msgstr " -S, --superuser=NAMN namn pÃ¥ superuser för att slÃ¥ av triggrar\n" -#: pg_restore.c:460 +#: pg_restore.c:479 #, c-format msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" msgstr " -t, --table=NAMN Ã¥terställ namngiven relation (tabell, vy, osv.)\n" -#: pg_restore.c:461 +#: pg_restore.c:480 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NAMN Ã¥terställ namngiven trigger\n" -#: pg_restore.c:462 +#: pg_restore.c:481 #, c-format msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" msgstr " -x, --no-privileges Ã¥terställ inte Ã¥tkomsträttigheter (grant/revoke)\n" -#: pg_restore.c:463 +#: pg_restore.c:482 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction Ã¥terställ i en enda transaktion\n" -#: pg_restore.c:465 +#: pg_restore.c:484 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security aktivera radsäkerhet\n" -#: pg_restore.c:467 +#: pg_restore.c:485 +#, c-format +msgid "" +" --filter=FILENAME restore or skip objects based on expressions\n" +" in FILENAME\n" +msgstr "" +" --filter=FILENAMN Ã¥terställ eller hoppa över objekt\n" +" baserat pÃ¥ uttryck i FILENAMN\n" + +#: pg_restore.c:488 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments Ã¥terställ inte kommentarer\n" -#: pg_restore.c:468 +#: pg_restore.c:489 #, c-format msgid "" " --no-data-for-failed-tables do not restore data of tables that could not be\n" @@ -2544,42 +2882,47 @@ msgstr "" " --no-data-for-failed-tables Ã¥terställ inte data för tabeller som\n" " inte kunde skapas\n" -#: pg_restore.c:470 +#: pg_restore.c:491 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications Ã¥terställ inte publiceringar\n" -#: pg_restore.c:471 +#: pg_restore.c:492 #, c-format msgid " --no-security-labels do not restore security labels\n" msgstr " --no-security-labels Ã¥terställ inte säkerhetsetiketter\n" -#: pg_restore.c:472 +#: pg_restore.c:493 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions Ã¥terställ inte prenumerationer\n" -#: pg_restore.c:473 +#: pg_restore.c:494 #, c-format msgid " --no-table-access-method do not restore table access methods\n" msgstr " --no-table-access-method Ã¥terställ inte tabellaccessmetoder\n" -#: pg_restore.c:474 +#: pg_restore.c:495 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" msgstr " --no-tablespaces Ã¥terställ inte användning av tabellutymmen\n" -#: pg_restore.c:475 +#: pg_restore.c:496 #, c-format msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" msgstr " --section=SEKTION Ã¥terställ namngiven sektion (pre-data, data eller post-data)\n" -#: pg_restore.c:488 +#: pg_restore.c:499 +#, c-format +msgid " --transaction-size=N commit after every N objects\n" +msgstr " --transaction-size=N gör commit efter var N:e objekt\n" + +#: pg_restore.c:510 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=ROLENAME gör SET ROLE innan Ã¥terställning\n" -#: pg_restore.c:490 +#: pg_restore.c:512 #, c-format msgid "" "\n" @@ -2590,7 +2933,7 @@ msgstr "" "Flaggorna -I, -n, -N, -P, -t, -T och --section kan kombineras och anges\n" "mÃ¥nga gÃ¥nger för att välja flera objekt.\n" -#: pg_restore.c:493 +#: pg_restore.c:515 #, c-format msgid "" "\n" diff --git a/src/bin/pg_dump/po/uk.po b/src/bin/pg_dump/po/uk.po index ec09a537d7951..4714c9e0e826d 100644 --- a/src/bin/pg_dump/po/uk.po +++ b/src/bin/pg_dump/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:50+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2025-03-29 10:40+0000\n" +"PO-Revision-Date: 2025-04-01 13:47\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pg_dump.pot\n" -"X-Crowdin-File-ID: 918\n" +"X-Crowdin-File: /REL_17_STABLE/pg_dump.pot\n" +"X-Crowdin-File-ID: 986\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,82 +37,182 @@ msgstr "деталі: " msgid "hint: " msgstr "підказка: " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/compression.c:132 ../../common/compression.c:141 +#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420 +#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25 +#: compress_zstd.c:31 #, c-format -msgid "could not identify current directory: %m" -msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ поточний каталог: %m" +msgid "this build does not support compression with %s" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð· %s" -#: ../../common/exec.c:168 +#: ../../common/compression.c:205 +msgid "found empty string where a compression option was expected" +msgstr "знайдено порожній Ñ€Ñдок, де очікувавÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ ÑтиÑканнÑ" + +#: ../../common/compression.c:244 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "нерозпізнаний алгоритм ÑтиÑканнÑ: \"%s\"" + +#: ../../common/compression.c:283 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "параметр ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" потребує значеннÑ" + +#: ../../common/compression.c:292 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" має бути цілим чиÑлом" + +#: ../../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" має бути логічним значеннÑм" + +#: ../../common/compression.c:379 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" не приймає рівень ÑтиÑканнÑ" + +#: ../../common/compression.c:386 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "алгоритм ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\" очікує рівень ÑтиÑÐºÐ°Ð½Ð½Ñ Ð¼Ñ–Ð¶ %d Ñ– %d (за замовчуваннÑм %d)" + +#: ../../common/compression.c:397 #, c-format -msgid "invalid binary \"%s\"" -msgstr "невірний бінарний файл \"%s\"" +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "алгоритм ÑтиÑÐ½ÐµÐ½Ð½Ñ \"%s\" не приймає кількіÑть працівників" -#: ../../common/exec.c:218 +#: ../../common/compression.c:408 #, c-format -msgid "could not read binary \"%s\"" -msgstr "неможливо прочитати бінарний файл \"%s\"" +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "алгоритм ÑтиÑÐ½ÐµÐ½Ð½Ñ \"%s\" не підтримує режим довгої відÑтані" -#: ../../common/exec.c:226 +#: ../../common/exec.c:174 +#, c-format +msgid "invalid binary \"%s\": %m" +msgstr "невірний бінарний файл \"%s\": %m" + +#: ../../common/exec.c:217 +#, c-format +msgid "could not read binary \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ бінарний файл \"%s\": %m" + +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "неможливо знайти \"%s\" Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ каталог на \"%s\": %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ абÑолютний шлÑÑ… \"%s\": %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:382 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "не можливо прочитати Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m" +msgid "could not execute command \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ команду \"%s\": %m" -#: ../../common/exec.c:422 parallel.c:1611 +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ виÑновок команди \"%s\": %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "команда \"%s\" не повернула жодних даних" + +#: ../../common/exec.c:424 parallel.c:1609 #, c-format msgid "%s() failed: %m" msgstr "%s() помилка: %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "недоÑтатньо пам'Ñті" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "недоÑтатньо пам'Ñті\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" -#: ../../common/wait_error.c:45 +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не можливо відкрити файл \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не вдалоÑÑ Ñинхронізувати файлову ÑиÑтему Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує метод Ñинхронізації \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_backup_directory.c:182 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не вдалоÑÑ fsync файл \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" + +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "неможливо виконати команду" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "команду не знайдено" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· кодом виходу %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через помилку 0Ñ…%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через Ñигнал %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· невизнаним ÑтатуÑом %d" @@ -127,461 +227,583 @@ msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ msgid "%s must be in range %d..%d" msgstr "%s має бути в діапазоні %d..%d" -#: common.c:134 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нерозпізнаний метод Ñинхронізації: %s" + +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "аргумент командної оболонки міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "назва бази даних міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: common.c:135 #, c-format msgid "reading extensions" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½ÑŒ" -#: common.c:137 +#: common.c:138 #, c-format msgid "identifying extension members" msgstr "Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ‡Ð»ÐµÐ½Ñ–Ð² розширеннÑ" -#: common.c:140 +#: common.c:141 #, c-format msgid "reading schemas" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñхемів" -#: common.c:149 +#: common.c:150 #, c-format msgid "reading user-defined tables" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких таблиць" -#: common.c:154 +#: common.c:155 #, c-format msgid "reading user-defined functions" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких функцій" -#: common.c:158 +#: common.c:159 #, c-format msgid "reading user-defined types" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких типів" -#: common.c:162 +#: common.c:163 #, c-format msgid "reading procedural languages" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð½Ð¸Ñ… мов" -#: common.c:165 +#: common.c:166 #, c-format msgid "reading user-defined aggregate functions" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких агрегатних функцій" -#: common.c:168 +#: common.c:169 #, c-format msgid "reading user-defined operators" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких операторів" -#: common.c:171 +#: common.c:172 #, c-format msgid "reading user-defined access methods" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких методів доÑтупу" -#: common.c:174 +#: common.c:175 #, c-format msgid "reading user-defined operator classes" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких клаÑів операторів" -#: common.c:177 +#: common.c:178 #, c-format msgid "reading user-defined operator families" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких ÑімейÑтв операторів" -#: common.c:180 +#: common.c:181 #, c-format msgid "reading user-defined text search parsers" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких парÑерів текÑтового пошуку" -#: common.c:183 +#: common.c:184 #, c-format msgid "reading user-defined text search templates" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких шаблонів текÑтового пошуку" -#: common.c:186 +#: common.c:187 #, c-format msgid "reading user-defined text search dictionaries" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких Ñловників текÑтового пошуку" -#: common.c:189 +#: common.c:190 #, c-format msgid "reading user-defined text search configurations" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких конфігурацій текÑтового пошуку" -#: common.c:192 +#: common.c:193 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких джерел Ñторонніх даних" -#: common.c:195 +#: common.c:196 #, c-format msgid "reading user-defined foreign servers" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких Ñторонніх Ñерверів" -#: common.c:198 +#: common.c:199 #, c-format msgid "reading default privileges" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð² за замовчуваннÑм" -#: common.c:201 +#: common.c:202 #, c-format msgid "reading user-defined collations" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких Ñортувань" -#: common.c:204 +#: common.c:205 #, c-format msgid "reading user-defined conversions" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацьких перетворень" -#: common.c:207 +#: common.c:208 #, c-format msgid "reading type casts" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ приведеннÑ" -#: common.c:210 +#: common.c:211 #, c-format msgid "reading transforms" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½ÑŒ" -#: common.c:213 +#: common.c:214 #, c-format msgid "reading table inheritance information" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про уÑÐ¿Ð°Ð´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–" -#: common.c:216 +#: common.c:217 #, c-format msgid "reading event triggers" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² подій" -#: common.c:220 +#: common.c:221 #, c-format msgid "finding extension tables" msgstr "пошук таблиць розширень" -#: common.c:224 +#: common.c:225 #, c-format msgid "finding inheritance relationships" msgstr "пошук відноÑин уÑпадкуваннÑ" -#: common.c:227 +#: common.c:228 #, c-format msgid "reading column info for interesting tables" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ— про Ñтовпці цікавлÑчої таблиці" -#: common.c:230 +#: common.c:231 #, c-format msgid "flagging inherited columns in subtables" msgstr "помітка уÑпадкованих Ñтовпців в підтаблицÑÑ…" -#: common.c:233 +#: common.c:234 +#, c-format +msgid "reading partitioning data" +msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… Ñекції" + +#: common.c:237 #, c-format msgid "reading indexes" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑів" -#: common.c:236 +#: common.c:240 #, c-format msgid "flagging indexes in partitioned tables" msgstr "помітка індекÑів в Ñекційних таблицÑÑ…" -#: common.c:239 +#: common.c:243 #, c-format msgid "reading extended statistics" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¾Ñ— ÑтатиÑтики" -#: common.c:242 +#: common.c:246 #, c-format msgid "reading constraints" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½ÑŒ" -#: common.c:245 +#: common.c:249 #, c-format msgid "reading triggers" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð²" -#: common.c:248 +#: common.c:252 #, c-format msgid "reading rewrite rules" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð» перезапиÑуваннÑ" -#: common.c:251 +#: common.c:255 #, c-format msgid "reading policies" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸Ðº" -#: common.c:254 +#: common.c:258 #, c-format msgid "reading publications" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ð¹" -#: common.c:257 +#: common.c:261 #, c-format msgid "reading publication membership of tables" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‡Ð»ÐµÐ½Ñтва публікації Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ" -#: common.c:260 +#: common.c:264 #, c-format msgid "reading publication membership of schemas" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ‡Ð»ÐµÐ½Ñтва публікації Ð´Ð»Ñ Ñхем" -#: common.c:263 +#: common.c:267 #, c-format msgid "reading subscriptions" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñок" -#: common.c:343 +#: common.c:270 #, c-format -msgid "invalid number of parents %d for table \"%s\"" -msgstr "неприпуÑтиме чиÑло батьківÑьких елементів %d Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" +msgid "reading subscription membership of tables" +msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки членÑтва таблиць" -#: common.c:1004 +#: common.c:333 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "помилка перевірки, батьківÑький елемент ідентифікатора OID %u Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\" (ідентифікатор OID %u) не знайдено" -#: common.c:1043 +#: common.c:375 +#, c-format +msgid "invalid number of parents %d for table \"%s\"" +msgstr "неприпуÑтиме чиÑло батьківÑьких елементів %d Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" + +#: common.c:1098 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ чиÑловий маÑив \"%s\": забагато чиÑел" -#: common.c:1055 +#: common.c:1110 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ чиÑловий маÑив \"%s\": неприпуÑтимий характер чиÑла" -#: compress_io.c:111 -#, c-format -msgid "invalid compression code: %d" -msgstr "невірний код ÑтиÑненнÑ: %d" - -#: compress_io.c:134 compress_io.c:170 compress_io.c:188 compress_io.c:504 -#: compress_io.c:547 -#, c-format -msgid "not built with zlib support" -msgstr "зібрано без підтримки zlib" - -#: compress_io.c:236 compress_io.c:333 +#: compress_gzip.c:69 compress_gzip.c:183 #, c-format msgid "could not initialize compression library: %s" msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ бібліотеку ÑтиÑненнÑ: %s" -#: compress_io.c:256 +#: compress_gzip.c:93 #, c-format msgid "could not close compression stream: %s" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ потік ÑтиÑненнÑ: %s" -#: compress_io.c:273 +#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109 #, c-format msgid "could not compress data: %s" msgstr "не вдалоÑÑ ÑтиÑнути дані: %s" -#: compress_io.c:349 compress_io.c:364 +#: compress_gzip.c:199 compress_gzip.c:214 #, c-format msgid "could not uncompress data: %s" msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ дані: %s" -#: compress_io.c:371 +#: compress_gzip.c:221 #, c-format msgid "could not close compression library: %s" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ бібліотеку ÑтиÑненнÑ: %s" -#: compress_io.c:584 compress_io.c:621 +#: compress_gzip.c:266 compress_lz4.c:608 compress_lz4.c:628 compress_lz4.c:647 #, c-format msgid "could not read from input file: %s" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з вхідного файлу: %s" -#: compress_io.c:623 pg_backup_custom.c:643 pg_backup_directory.c:553 -#: pg_backup_tar.c:726 pg_backup_tar.c:749 +#: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 +#: compress_zstd.c:374 pg_backup_custom.c:651 +#, c-format +msgid "could not read from input file: %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з вхідного файлу: %m" + +#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:141 +#: compress_zstd.c:372 pg_backup_custom.c:649 pg_backup_directory.c:565 +#: pg_backup_tar.c:740 pg_backup_tar.c:763 #, c-format msgid "could not read from input file: end of file" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з вхідного файлу: кінець файлу" -#: parallel.c:253 +#: compress_lz4.c:157 +#, c-format +msgid "could not create LZ4 decompression context: %s" +msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ декомпреÑÑ–Ñ— LZ4: %s" + +#: compress_lz4.c:180 +#, c-format +msgid "could not decompress: %s" +msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸: %s" + +#: compress_lz4.c:193 +#, c-format +msgid "could not free LZ4 decompression context: %s" +msgstr "не вдалоÑÑ Ð·Ð²Ñ–Ð»ÑŒÐ½Ð¸Ñ‚Ð¸ контекÑÑ‚ декомпреÑÑ–Ñ— LZ4: %s" + +#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690 +#, c-format +msgid "could not end compression: %s" +msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ñ‚Ð¸ ÑтиÑканнÑ: %s" + +#: compress_lz4.c:301 +#, c-format +msgid "could not initialize LZ4 compression: %s" +msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑтиÑÐºÐ°Ð½Ð½Ñ LZ4: %s" + +#: compress_lz4.c:697 +#, c-format +msgid "could not end decompression: %s" +msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ–Ð½Ñ‡Ð¸Ñ‚Ð¸ розпакуваннÑ: %s" + +#: compress_zstd.c:66 +#, c-format +msgid "could not set compression parameter \"%s\": %s" +msgstr "не вдалоÑÑ Ð²Ñтановити параметр ÑтиÑÐºÐ°Ð½Ð½Ñ \"%s\": %s" + +#: compress_zstd.c:78 compress_zstd.c:232 compress_zstd.c:491 +#: compress_zstd.c:499 +#, c-format +msgid "could not initialize compression library" +msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ бібліотеку ÑтиÑканнÑ" + +#: compress_zstd.c:195 compress_zstd.c:309 +#, c-format +msgid "could not decompress data: %s" +msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ дані: %s" + +#: compress_zstd.c:502 +#, c-format +msgid "unhandled mode \"%s\"" +msgstr "непідтримуваний режим \"%s\"" + +#: filter.c:49 +#, c-format +msgid "could not open filter file \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл фільтра \"%s\": %m" + +#: filter.c:72 +#, c-format +msgid "could not close filter file \"%s\": %m" +msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл фільтра \"%s\": %m" + +#: filter.c:165 +#, c-format +msgid "invalid format in filter read from standard input on line %d: %s" +msgstr "неприпуÑтимий формат у фільтрі прочитаний з Ñтандартного Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð² Ñ€Ñдку %d: %s" + +#: filter.c:168 +#, c-format +msgid "invalid format in filter read from file \"%s\" on line %d: %s" +msgstr "неприпуÑтимий формат прочитанний у файлі \"%s\" в Ñ€Ñдку %d: %s" + +#: filter.c:241 filter.c:468 +#, c-format +msgid "could not read from filter file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу фільтра %s: %m" + +#: filter.c:244 +msgid "unexpected end of file" +msgstr "неÑподіваний кінець файлу" + +#: filter.c:311 +msgid "missing object name pattern" +msgstr "відÑутній шаблон назви об'єкта" + +#: filter.c:422 +msgid "no filter command found (expected \"include\" or \"exclude\")" +msgstr "не знайдено команди фільтрів (очікувалоÑÑ \"include\" або \"exclude\")" + +#: filter.c:433 +msgid "invalid filter command (expected \"include\" or \"exclude\")" +msgstr "неприпуÑтима команда фільтра (очікувалаÑÑŒ \"include\" або \"exclude\")" + +#: filter.c:440 +msgid "missing filter object type" +msgstr "відÑутній тип об'єкту фільтру" + +#: filter.c:447 +#, c-format +msgid "unsupported filter object type: \"%.*s\"" +msgstr "непідтримуваний тип об'єкта фільтру: \"%.*s\"" + +#: parallel.c:251 #, c-format msgid "%s() failed: error code %d" msgstr "%s() помилка: код помилки %d" -#: parallel.c:961 +#: parallel.c:959 #, c-format msgid "could not create communication channels: %m" msgstr "не вдалоÑÑ Ñтворити канали зв'Ñзку: %m" -#: parallel.c:1018 +#: parallel.c:1016 #, c-format msgid "could not create worker process: %m" msgstr "не вдалоÑÑ Ñтворити робочий процеÑ: %m" -#: parallel.c:1148 +#: parallel.c:1146 #, c-format msgid "unrecognized command received from leader: \"%s\"" msgstr "нерозпізнана команда отримана від лідера: \"%s\"" -#: parallel.c:1191 parallel.c:1429 +#: parallel.c:1189 parallel.c:1427 #, c-format msgid "invalid message received from worker: \"%s\"" msgstr "отримане невірне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ робочого процеÑу: \"%s\"" -#: parallel.c:1323 +#: parallel.c:1321 #, c-format msgid "could not obtain lock on relation \"%s\"\n" "This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table." msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\"\n" "Це, зазвичай, означає, що хтоÑÑŒ зробив запит на монопольне Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– піÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾, Ñк батьківÑький Ð¿Ñ€Ð¾Ñ†ÐµÑ pg_dump отримав початкове Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñпільного доÑтупу Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–." -#: parallel.c:1412 +#: parallel.c:1410 #, c-format msgid "a worker process died unexpectedly" msgstr "робочий Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð½ÐµÑподівано" -#: parallel.c:1534 parallel.c:1652 +#: parallel.c:1532 parallel.c:1650 #, c-format msgid "could not write to the communication channel: %m" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до каналу зв'Ñзку: %m" -#: parallel.c:1736 +#: parallel.c:1734 #, c-format msgid "pgpipe: could not create socket: error code %d" msgstr "pgpipe: не вдалоÑÑ Ñтворити Ñокет: код помилки %d" -#: parallel.c:1747 +#: parallel.c:1745 #, c-format msgid "pgpipe: could not bind: error code %d" msgstr "pgpipe: не вдалоÑÑ Ð¿Ñ€Ð¸Ð²'Ñзати: код помилки %d" -#: parallel.c:1754 +#: parallel.c:1752 #, c-format msgid "pgpipe: could not listen: error code %d" msgstr "pgpipe: не вдалоÑÑ Ð¿Ñ€Ð¾Ñлухати: код помилки %d" -#: parallel.c:1761 +#: parallel.c:1759 #, c-format msgid "pgpipe: %s() failed: error code %d" msgstr "pgpipe: %s() помилка: код помилки %d" -#: parallel.c:1772 +#: parallel.c:1770 #, c-format msgid "pgpipe: could not create second socket: error code %d" msgstr "pgpipe: не вдалоÑÑ Ñтворити другий Ñокет: код помилки %d" -#: parallel.c:1781 +#: parallel.c:1779 #, c-format msgid "pgpipe: could not connect socket: error code %d" msgstr "pgpipe: не вдалоÑÑ Ð·Ð²'ÑзатиÑÑ Ð· Ñокетом: код помилки %d" -#: parallel.c:1790 +#: parallel.c:1788 #, c-format msgid "pgpipe: could not accept connection: error code %d" msgstr "pgpipe: не вдалоÑÑ Ð¿Ñ€Ð¸Ð¹Ð½Ñти зв'Ñзок: код помилки %d" -#: pg_backup_archiver.c:279 pg_backup_archiver.c:1576 +#: pg_backup_archiver.c:261 pg_backup_archiver.c:1706 #, c-format msgid "could not close output file: %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ вихідний файл: %m" -#: pg_backup_archiver.c:323 pg_backup_archiver.c:327 +#: pg_backup_archiver.c:305 pg_backup_archiver.c:309 #, c-format msgid "archive items not in correct section order" msgstr "елементи архіву в неправильному порÑдку" -#: pg_backup_archiver.c:333 +#: pg_backup_archiver.c:315 #, c-format msgid "unexpected section code %d" msgstr "неочікуваний код розділу %d" -#: pg_backup_archiver.c:370 +#: pg_backup_archiver.c:352 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "паралельне Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ підтримуєтьÑÑ Ð· цим файлом архівного формату" -#: pg_backup_archiver.c:374 +#: pg_backup_archiver.c:356 #, c-format msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" msgstr "паралельне Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ðµ підтримуєтьÑÑ Ð· архівами, зробленими pre-8.0 pg_dump" -#: pg_backup_archiver.c:392 +#: pg_backup_archiver.c:377 #, c-format -msgid "cannot restore from compressed archive (compression not supported in this installation)" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ зі ÑтиÑнутого архіву (вÑтановлена верÑÑ–Ñ Ð½Ðµ підтримує ÑтиÑканнÑ)" +msgid "cannot restore from compressed archive (%s)" +msgstr "не можна відновити зі ÑтиÑнутого архіву (%s)" -#: pg_backup_archiver.c:409 +#: pg_backup_archiver.c:397 #, c-format msgid "connecting to database for restore" msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ" -#: pg_backup_archiver.c:411 +#: pg_backup_archiver.c:399 #, c-format msgid "direct database connections are not supported in pre-1.3 archives" msgstr "прÑмі з'Ð´Ð½Ð°Ð½Ð½Ñ Ð· базою даних не підтримуютьÑÑ Ð² архівах у верÑÑ–ÑÑ… до 1.3" -#: pg_backup_archiver.c:454 +#: pg_backup_archiver.c:442 #, c-format msgid "implied data-only restore" msgstr "маєтьÑÑ Ð½Ð° увазі Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð»Ð¸ÑˆÐµ даних" -#: pg_backup_archiver.c:520 +#: pg_backup_archiver.c:510 #, c-format msgid "dropping %s %s" msgstr "Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ %s %s" -#: pg_backup_archiver.c:615 +#: pg_backup_archiver.c:642 #, c-format msgid "could not find where to insert IF EXISTS in statement \"%s\"" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸, куди вÑтавити IF EXISTS в інÑтрукції \"%s\"" -#: pg_backup_archiver.c:771 pg_backup_archiver.c:773 +#: pg_backup_archiver.c:828 pg_backup_archiver.c:830 #, c-format msgid "warning from original dump file: %s" msgstr "Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Ð· оригінального файлу дамп: %s" -#: pg_backup_archiver.c:788 +#: pg_backup_archiver.c:864 #, c-format msgid "creating %s \"%s.%s\"" msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %s \"%s.%s\"" -#: pg_backup_archiver.c:791 +#: pg_backup_archiver.c:867 #, c-format msgid "creating %s \"%s\"" msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ %s \" \"%s\"" -#: pg_backup_archiver.c:841 +#: pg_backup_archiver.c:917 #, c-format msgid "connecting to new database \"%s\"" msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ нової бази даних \"%s\"" -#: pg_backup_archiver.c:868 +#: pg_backup_archiver.c:944 #, c-format msgid "processing %s" msgstr "обробка %s" -#: pg_backup_archiver.c:888 +#: pg_backup_archiver.c:966 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "обробка даних Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s.%s\"" -#: pg_backup_archiver.c:947 +#: pg_backup_archiver.c:1036 #, c-format msgid "executing %s %s" msgstr "Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ %s %s" -#: pg_backup_archiver.c:986 +#: pg_backup_archiver.c:1096 #, c-format msgid "disabling triggers for %s" msgstr "Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² Ð´Ð»Ñ %s" -#: pg_backup_archiver.c:1012 +#: pg_backup_archiver.c:1122 #, c-format msgid "enabling triggers for %s" msgstr "ÑƒÐ²Ñ–Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð² Ð´Ð»Ñ %s" -#: pg_backup_archiver.c:1040 +#: pg_backup_archiver.c:1187 #, c-format msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" msgstr "Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° - WriteData не може бути викликана поза контекÑтом підпрограми DataDumper " -#: pg_backup_archiver.c:1223 +#: pg_backup_archiver.c:1379 #, c-format msgid "large-object output not supported in chosen format" msgstr "вивід великих об'єктів не підтримуєтьÑÑ Ñƒ вибраному форматі" -#: pg_backup_archiver.c:1281 +#: pg_backup_archiver.c:1442 #, c-format msgid "restored %d large object" msgid_plural "restored %d large objects" @@ -590,55 +812,55 @@ msgstr[1] "відновлено %d великих об'єкти" msgstr[2] "відновлено %d великих об'єктів" msgstr[3] "відновлено %d великих об'єктів" -#: pg_backup_archiver.c:1302 pg_backup_tar.c:669 +#: pg_backup_archiver.c:1469 pg_backup_tar.c:683 #, c-format msgid "restoring large object with OID %u" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об'єкту з OID %u" -#: pg_backup_archiver.c:1314 +#: pg_backup_archiver.c:1481 #, c-format msgid "could not create large object %u: %s" msgstr "не вдалоÑÑ Ñтворити великий об'єкт %u: %s" -#: pg_backup_archiver.c:1319 pg_dump.c:3568 +#: pg_backup_archiver.c:1486 pg_dump.c:3889 #, c-format msgid "could not open large object %u: %s" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ великий об'єкт %u: %s" -#: pg_backup_archiver.c:1375 +#: pg_backup_archiver.c:1542 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл TOC \"%s\": %m" -#: pg_backup_archiver.c:1403 +#: pg_backup_archiver.c:1570 #, c-format msgid "line ignored: %s" msgstr "Ñ€Ñдок проігноровано: %s" -#: pg_backup_archiver.c:1410 +#: pg_backup_archiver.c:1577 pg_backup_db.c:609 #, c-format msgid "could not find entry for ID %d" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð»Ñ ID %d" -#: pg_backup_archiver.c:1433 pg_backup_directory.c:222 -#: pg_backup_directory.c:599 +#: pg_backup_archiver.c:1600 pg_backup_directory.c:219 +#: pg_backup_directory.c:613 #, c-format msgid "could not close TOC file: %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл TOC: %m" -#: pg_backup_archiver.c:1547 pg_backup_custom.c:156 pg_backup_directory.c:332 -#: pg_backup_directory.c:586 pg_backup_directory.c:649 -#: pg_backup_directory.c:668 pg_dumpall.c:476 +#: pg_backup_archiver.c:1687 pg_backup_custom.c:152 pg_backup_directory.c:333 +#: pg_backup_directory.c:600 pg_backup_directory.c:666 +#: pg_backup_directory.c:684 pg_dumpall.c:506 #, c-format msgid "could not open output file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вихідний файл \"%s\": %m" -#: pg_backup_archiver.c:1549 pg_backup_custom.c:162 +#: pg_backup_archiver.c:1689 pg_backup_custom.c:158 #, c-format msgid "could not open output file: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вихідний файл: %m" -#: pg_backup_archiver.c:1643 +#: pg_backup_archiver.c:1772 #, c-format msgid "wrote %zu byte of large object data (result = %d)" msgid_plural "wrote %zu bytes of large object data (result = %d)" @@ -647,340 +869,345 @@ msgstr[1] "запиÑано %zu байти даних великого об'єк msgstr[2] "запиÑано %zu байтів даних великого об'єкта (результат = %d)" msgstr[3] "запиÑано %zu байтів даних великого об'єкта (результат = %d)" -#: pg_backup_archiver.c:1649 +#: pg_backup_archiver.c:1778 #, c-format msgid "could not write to large object: %s" msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до великого об'єкту: %s" -#: pg_backup_archiver.c:1739 +#: pg_backup_archiver.c:1868 #, c-format msgid "while INITIALIZING:" msgstr "при ІÐІЦІÐЛІЗÐЦІЇ:" -#: pg_backup_archiver.c:1744 +#: pg_backup_archiver.c:1873 #, c-format msgid "while PROCESSING TOC:" msgstr "при ОБРОБЦІ TOC:" -#: pg_backup_archiver.c:1749 +#: pg_backup_archiver.c:1878 #, c-format msgid "while FINALIZING:" msgstr "при ЗÐВЕРШЕÐÐІ:" -#: pg_backup_archiver.c:1754 +#: pg_backup_archiver.c:1883 #, c-format msgid "from TOC entry %d; %u %u %s %s %s" msgstr "зі Ð²Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð´Ð¾ TOC %d; %u %u %s %s %s" -#: pg_backup_archiver.c:1830 +#: pg_backup_archiver.c:1959 #, c-format msgid "bad dumpId" msgstr "невірний dumpId" -#: pg_backup_archiver.c:1851 +#: pg_backup_archiver.c:1980 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "невірна Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ dumpId Ð´Ð»Ñ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚Ñƒ даних таблиці" -#: pg_backup_archiver.c:1943 +#: pg_backup_archiver.c:2072 #, c-format msgid "unexpected data offset flag %d" msgstr "неочікувана позначка зÑуву даних %d" -#: pg_backup_archiver.c:1956 +#: pg_backup_archiver.c:2085 #, c-format msgid "file offset in dump file is too large" msgstr "зÑув файлу у файлі дампу завеликий" -#: pg_backup_archiver.c:2094 pg_backup_archiver.c:2104 +#: pg_backup_archiver.c:2196 #, c-format msgid "directory name too long: \"%s\"" msgstr "ім'Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ задовге: \"%s\"" -#: pg_backup_archiver.c:2112 +#: pg_backup_archiver.c:2246 #, c-format msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" msgstr "каталог \"%s\" не Ñхожий на архівний (\"toc.dat\" не Ñ–Ñнує)" -#: pg_backup_archiver.c:2120 pg_backup_custom.c:173 pg_backup_custom.c:807 -#: pg_backup_directory.c:207 pg_backup_directory.c:395 +#: pg_backup_archiver.c:2254 pg_backup_custom.c:169 pg_backup_custom.c:812 +#: pg_backup_directory.c:204 pg_backup_directory.c:396 #, c-format msgid "could not open input file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вхідний файл \"%s\": %m" -#: pg_backup_archiver.c:2127 pg_backup_custom.c:179 +#: pg_backup_archiver.c:2261 pg_backup_custom.c:175 #, c-format msgid "could not open input file: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вхідний файл: %m" -#: pg_backup_archiver.c:2133 +#: pg_backup_archiver.c:2267 #, c-format msgid "could not read input file: %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ вхідний файл: %m" -#: pg_backup_archiver.c:2135 +#: pg_backup_archiver.c:2269 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "вхідний файл закороткий (прочитано %lu, очікувалоÑÑŒ 5)" -#: pg_backup_archiver.c:2167 +#: pg_backup_archiver.c:2301 #, c-format msgid "input file appears to be a text format dump. Please use psql." msgstr "вхідний файл Ñхожий на дамп текÑтового формату. Будь лаÑка, викориÑтайте psql." -#: pg_backup_archiver.c:2173 +#: pg_backup_archiver.c:2307 #, c-format msgid "input file does not appear to be a valid archive (too short?)" msgstr "вхідний файл не Ñхожий на архівний (закороткий?)" -#: pg_backup_archiver.c:2179 +#: pg_backup_archiver.c:2313 #, c-format msgid "input file does not appear to be a valid archive" msgstr "вхідний файл не Ñхожий на архівний" -#: pg_backup_archiver.c:2188 +#: pg_backup_archiver.c:2322 #, c-format msgid "could not close input file: %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ вхідний файл: %m" -#: pg_backup_archiver.c:2305 +#: pg_backup_archiver.c:2401 +#, c-format +msgid "could not open stdout for appending: %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ stdout Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ: %m" + +#: pg_backup_archiver.c:2446 #, c-format msgid "unrecognized file format \"%d\"" msgstr "нерозпізнаний формат файлу \"%d\"" -#: pg_backup_archiver.c:2387 pg_backup_archiver.c:4445 +#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4648 #, c-format msgid "finished item %d %s %s" msgstr "завершений об'єкт %d %s %s" -#: pg_backup_archiver.c:2391 pg_backup_archiver.c:4458 +#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4661 #, c-format msgid "worker process failed: exit code %d" msgstr "помилка при робочому процеÑÑ–: код виходу %d" -#: pg_backup_archiver.c:2512 +#: pg_backup_archiver.c:2653 #, c-format msgid "entry ID %d out of range -- perhaps a corrupt TOC" msgstr "Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ð° %d поза діапазоном -- можливо, зміÑÑ‚ пошкоджений" -#: pg_backup_archiver.c:2592 +#: pg_backup_archiver.c:2736 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ WITH OIDS більше не підтримуєтьÑÑ" -#: pg_backup_archiver.c:2674 +#: pg_backup_archiver.c:2818 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "нерозпізнане ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"" -#: pg_backup_archiver.c:2679 +#: pg_backup_archiver.c:2824 #, c-format msgid "invalid ENCODING item: %s" msgstr "невірний об'єкт КОДУВÐÐÐЯ: %s" -#: pg_backup_archiver.c:2697 +#: pg_backup_archiver.c:2842 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "невірний об'єкт STDSTRINGS: %s" -#: pg_backup_archiver.c:2722 +#: pg_backup_archiver.c:2867 #, c-format msgid "schema \"%s\" not found" msgstr "Ñхему \"%s\" не знайдено" -#: pg_backup_archiver.c:2729 +#: pg_backup_archiver.c:2874 #, c-format msgid "table \"%s\" not found" msgstr "таблицю \"%s\" не знайдено" -#: pg_backup_archiver.c:2736 +#: pg_backup_archiver.c:2881 #, c-format msgid "index \"%s\" not found" msgstr "Ñ–Ð½Ð´ÐµÐºÑ \"%s\" не знайдено" -#: pg_backup_archiver.c:2743 +#: pg_backup_archiver.c:2888 #, c-format msgid "function \"%s\" not found" msgstr "функцію \"%s\" не знайдено" -#: pg_backup_archiver.c:2750 +#: pg_backup_archiver.c:2895 #, c-format msgid "trigger \"%s\" not found" msgstr "тригер \"%s\" не знайдено" -#: pg_backup_archiver.c:3143 +#: pg_backup_archiver.c:3326 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "не вдалоÑÑ Ð²Ñтановити кориÑтувача ÑеанÑу Ð´Ð»Ñ \"%s\": %s" -#: pg_backup_archiver.c:3280 +#: pg_backup_archiver.c:3458 +#, c-format +msgid "could not set \"search_path\" to \"%s\": %s" +msgstr "не вдалоÑÑ Ð²Ñтановити \"search_path\" Ð´Ð»Ñ \"%s\": %s" + +#: pg_backup_archiver.c:3519 #, c-format -msgid "could not set search_path to \"%s\": %s" -msgstr "не вдалоÑÑ Ð²Ñтановити search_path Ð´Ð»Ñ \"%s\": %s" +msgid "could not set \"default_tablespace\" to %s: %s" +msgstr "не вдалоÑÑ Ð²Ñтановити \"default_tablespace\" Ð´Ð»Ñ %s: %s" -#: pg_backup_archiver.c:3342 +#: pg_backup_archiver.c:3568 #, c-format -msgid "could not set default_tablespace to %s: %s" -msgstr "не вдалоÑÑ Ð²Ñтановити default_tablespace Ð´Ð»Ñ %s: %s" +msgid "could not set \"default_table_access_method\": %s" +msgstr "не вдалоÑÑ Ð²Ñтановити \"default_table_access_method\" длÑ: %s" -#: pg_backup_archiver.c:3392 +#: pg_backup_archiver.c:3617 #, c-format -msgid "could not set default_table_access_method: %s" -msgstr "не вдалоÑÑ Ð²Ñтановити default_table_access_method Ð´Ð»Ñ : %s" +msgid "could not alter table access method: %s" +msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ метод доÑтупу до таблиці: %s" -#: pg_backup_archiver.c:3486 pg_backup_archiver.c:3651 +#: pg_backup_archiver.c:3718 #, c-format msgid "don't know how to set owner for object type \"%s\"" msgstr "невідомо, Ñк вÑтановити влаÑника об'єкту типу \"%s\"" -#: pg_backup_archiver.c:3754 +#: pg_backup_archiver.c:4005 #, c-format msgid "did not find magic string in file header" msgstr "в заголовку файлу не знайдено магічного Ñ€Ñдка" -#: pg_backup_archiver.c:3768 +#: pg_backup_archiver.c:4019 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "в заголовку непідтримувана верÑÑ–Ñ (%d.%d)" -#: pg_backup_archiver.c:3773 +#: pg_backup_archiver.c:4024 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "перевірка на розмір цілого чиÑла (%lu) не вдалаÑÑ" -#: pg_backup_archiver.c:3777 +#: pg_backup_archiver.c:4028 #, c-format msgid "archive was made on a machine with larger integers, some operations might fail" msgstr "архів зроблено на архітектурі з більшими цілими чиÑлами, деÑкі операції можуть не виконуватиÑÑ" -#: pg_backup_archiver.c:3787 +#: pg_backup_archiver.c:4038 #, c-format msgid "expected format (%d) differs from format found in file (%d)" msgstr "очікуваний формат (%d) відрізнÑєтьÑÑ Ð²Ñ–Ð´ знайденого формату у файлі (%d)" -#: pg_backup_archiver.c:3802 +#: pg_backup_archiver.c:4060 #, c-format -msgid "archive is compressed, but this installation does not support compression -- no data will be available" -msgstr "архів ÑтиÑнено, але Ñ†Ñ Ñ–Ð½ÑталÑÑ†Ñ–Ñ Ð½Ðµ підтримує ÑтиÑÐºÐ°Ð½Ð½Ñ -- дані не будуть доÑтупними " +msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available" +msgstr "архів ÑтиÑнено, але Ñ†Ñ Ñ–Ð½ÑталÑÑ†Ñ–Ñ Ð½Ðµ підтримує ÑтиÑÐºÐ°Ð½Ð½Ñ (%s) -- дані не будуть доÑтупними" -#: pg_backup_archiver.c:3836 +#: pg_backup_archiver.c:4096 #, c-format msgid "invalid creation date in header" msgstr "неприпуÑтима дата ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñƒ заголовку" -#: pg_backup_archiver.c:3970 +#: pg_backup_archiver.c:4230 #, c-format msgid "processing item %d %s %s" msgstr "обробка елементу %d %s %s" -#: pg_backup_archiver.c:4049 +#: pg_backup_archiver.c:4315 #, c-format msgid "entering main parallel loop" msgstr "Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ð³Ð¾ паралельного циклу" -#: pg_backup_archiver.c:4060 +#: pg_backup_archiver.c:4326 #, c-format msgid "skipping item %d %s %s" msgstr "пропуÑкаєтьÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚ %d %s %s " -#: pg_backup_archiver.c:4069 +#: pg_backup_archiver.c:4335 #, c-format msgid "launching item %d %s %s" msgstr "запуÑк елементу %d %s %s " -#: pg_backup_archiver.c:4123 +#: pg_backup_archiver.c:4389 #, c-format msgid "finished main parallel loop" msgstr "головний паралельний цикл завершивÑÑ" -#: pg_backup_archiver.c:4159 +#: pg_backup_archiver.c:4425 #, c-format msgid "processing missed item %d %s %s" msgstr "обробка втраченого елементу %d %s %s" -#: pg_backup_archiver.c:4764 +#: pg_backup_archiver.c:4967 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "не вдалоÑÑ Ñтворити таблицю \"%s\", дані не будуть відновлені" -#: pg_backup_custom.c:376 pg_backup_null.c:147 +#: pg_backup_custom.c:376 pg_backup_null.c:143 #, c-format msgid "invalid OID for large object" msgstr "неприпуÑтимий ідентифікатор OID Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об’єкту" -#: pg_backup_custom.c:439 pg_backup_custom.c:505 pg_backup_custom.c:629 -#: pg_backup_custom.c:865 pg_backup_tar.c:1016 pg_backup_tar.c:1021 +#: pg_backup_custom.c:441 pg_backup_custom.c:507 pg_backup_custom.c:636 +#: pg_backup_custom.c:870 pg_backup_tar.c:1029 pg_backup_tar.c:1034 #, c-format msgid "error during file seek: %m" msgstr "помилка під Ñ‡Ð°Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ файлу oobe. xml: %m" -#: pg_backup_custom.c:478 +#: pg_backup_custom.c:480 #, c-format msgid "data block %d has wrong seek position" msgstr "блок даних %d має неправильну позицію пошуку" -#: pg_backup_custom.c:495 +#: pg_backup_custom.c:497 #, c-format msgid "unrecognized data block type (%d) while searching archive" msgstr "нерозпізнаний тип блоку даних (%d) під Ñ‡Ð°Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ архіву" -#: pg_backup_custom.c:517 +#: pg_backup_custom.c:519 #, c-format msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file" msgstr "не вдалоÑÑ Ð·Ð°Ð¹Ñ‚Ð¸ в архіві блок з ідентифікатором %d -- можливо, через непоÑлідовніÑть запиту відновленнÑ, Ñкий не можна обробити через файл, що не допуÑкає довільний вхід" -#: pg_backup_custom.c:522 +#: pg_backup_custom.c:524 #, c-format msgid "could not find block ID %d in archive -- possibly corrupt archive" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ в архіві блок з ідентифікатором %d -- можливо, архів пошкоджений" -#: pg_backup_custom.c:529 +#: pg_backup_custom.c:531 #, c-format msgid "found unexpected block ID (%d) when reading data -- expected %d" msgstr "знайдено неочікуваний блок з ідентифікатором (%d) під Ñ‡Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… -- очікувалоÑÑ %d" -#: pg_backup_custom.c:543 +#: pg_backup_custom.c:545 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "нерозпізнаний тип блоку даних %d при відновленні архіву" -#: pg_backup_custom.c:645 -#, c-format -msgid "could not read from input file: %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з вхідного файлу: %m" - -#: pg_backup_custom.c:746 pg_backup_custom.c:798 pg_backup_custom.c:943 -#: pg_backup_tar.c:1019 +#: pg_backup_custom.c:751 pg_backup_custom.c:803 pg_backup_custom.c:945 +#: pg_backup_tar.c:1032 #, c-format msgid "could not determine seek position in archive file: %m" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ позицію пошуку у файлі архіву: %m" -#: pg_backup_custom.c:762 pg_backup_custom.c:802 +#: pg_backup_custom.c:767 pg_backup_custom.c:807 #, c-format msgid "could not close archive file: %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ архівний файл: %m" -#: pg_backup_custom.c:785 +#: pg_backup_custom.c:790 #, c-format msgid "can only reopen input archives" msgstr "можливо повторно відкрити лише вхідні архіви" -#: pg_backup_custom.c:792 +#: pg_backup_custom.c:797 #, c-format msgid "parallel restore from standard input is not supported" msgstr "паралельне Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ñ– Ñтандартного вводу не підтримуєтьÑÑ" -#: pg_backup_custom.c:794 +#: pg_backup_custom.c:799 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "паралельне Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð· файлу без вільного доÑтупу не підтримуєтьÑÑ" -#: pg_backup_custom.c:810 +#: pg_backup_custom.c:815 #, c-format msgid "could not set seek position in archive file: %m" msgstr "не вдалоÑÑ Ð½Ð°Ð±Ñ€Ð°Ñ‚Ð¸ позицію пошуку у файлі архіву: %m" -#: pg_backup_custom.c:889 +#: pg_backup_custom.c:894 #, c-format msgid "compressor active" msgstr "ущільнювач активний" @@ -990,12 +1217,12 @@ msgstr "ущільнювач активний" msgid "could not get server_version from libpq" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ верÑÑ–ÑŽ Ñерверу з libpq" -#: pg_backup_db.c:53 pg_dumpall.c:1646 +#: pg_backup_db.c:53 pg_dumpall.c:1879 #, c-format msgid "aborting because of server version mismatch" msgstr "Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ñ‡ÐµÑ€ÐµÐ· невідповідніÑть верÑÑ–Ñ— Ñерверу" -#: pg_backup_db.c:54 pg_dumpall.c:1647 +#: pg_backup_db.c:54 pg_dumpall.c:1880 #, c-format msgid "server version: %s; %s version: %s" msgstr "верÑÑ–Ñ Ñерверу: %s; верÑÑ–Ñ %s: %s" @@ -1005,7 +1232,7 @@ msgstr "верÑÑ–Ñ Ñерверу: %s; верÑÑ–Ñ %s: %s" msgid "already connected to a database" msgstr "вже під'єднано до бази даних" -#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1490 pg_dumpall.c:1595 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1726 pg_dumpall.c:1828 msgid "Password: " msgstr "Пароль: " @@ -1019,22 +1246,23 @@ msgstr "не вдалоÑÑ Ð·Ð²'ÑзатиÑÑ Ð· базою даних" msgid "reconnection failed: %s" msgstr "помилка повторного підключеннÑ: %s" -#: pg_backup_db.c:190 pg_backup_db.c:265 pg_dumpall.c:1520 pg_dumpall.c:1604 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:788 pg_dump_sort.c:1213 +#: pg_dump_sort.c:1233 pg_dumpall.c:1753 pg_dumpall.c:1837 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:272 pg_dumpall.c:1709 pg_dumpall.c:1732 +#: pg_backup_db.c:271 pg_dumpall.c:1942 pg_dumpall.c:1965 #, c-format msgid "query failed: %s" msgstr "запит не вдавÑÑ: %s" -#: pg_backup_db.c:274 pg_dumpall.c:1710 pg_dumpall.c:1733 +#: pg_backup_db.c:273 pg_dumpall.c:1943 pg_dumpall.c:1966 #, c-format msgid "Query was: %s" msgstr "Запит був: %s" -#: pg_backup_db.c:316 +#: pg_backup_db.c:315 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" @@ -1043,191 +1271,186 @@ msgstr[1] "запит повернув %d Ñ€Ñдки заміÑть одного msgstr[2] "запит повернув %d Ñ€Ñдків заміÑть одного: %s" msgstr[3] "запит повернув %d Ñ€Ñдків заміÑть одного: %s" -#: pg_backup_db.c:352 +#: pg_backup_db.c:351 #, c-format msgid "%s: %sCommand was: %s" msgstr "%s:%sКоманда була: %s" -#: pg_backup_db.c:408 pg_backup_db.c:482 pg_backup_db.c:489 +#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488 msgid "could not execute query" msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ запит" -#: pg_backup_db.c:461 +#: pg_backup_db.c:460 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "помилка повернулаÑÑ Ð²Ñ–Ð´ PQputCopyData: %s" -#: pg_backup_db.c:510 +#: pg_backup_db.c:509 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "помилка повернулаÑÑ Ð²Ñ–Ð´ PQputCopyEnd: %s" -#: pg_backup_db.c:516 +#: pg_backup_db.c:515 #, c-format msgid "COPY failed for table \"%s\": %s" msgstr "КОПІЮВÐÐÐЯ Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\" не вдалоÑÑ: %s" -#: pg_backup_db.c:522 pg_dump.c:2105 +#: pg_backup_db.c:521 pg_dump.c:2284 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "неочікувані зайві результати під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: pg_backup_db.c:534 +#: pg_backup_db.c:533 msgid "could not start database transaction" msgstr "не вдалоÑÑ Ð¿Ð¾Ñ‡Ð°Ñ‚Ð¸ транзакцію бази даних" -#: pg_backup_db.c:542 +#: pg_backup_db.c:541 msgid "could not commit database transaction" msgstr "не вдалоÑÑ Ð·Ð°Ñ‚Ð²ÐµÑ€Ð´Ð¸Ñ‚Ð¸ транзакцію бази даних" -#: pg_backup_directory.c:156 +#: pg_backup_directory.c:153 #, c-format msgid "no output directory specified" msgstr "вихідний каталог не вказано" -#: pg_backup_directory.c:185 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" - -#: pg_backup_directory.c:189 +#: pg_backup_directory.c:186 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" -#: pg_backup_directory.c:195 +#: pg_backup_directory.c:192 #, c-format msgid "could not create directory \"%s\": %m" msgstr "не вдалоÑÑ Ñтворити каталог \"%s\": %m" -#: pg_backup_directory.c:355 pg_backup_directory.c:497 -#: pg_backup_directory.c:533 +#: pg_backup_directory.c:357 pg_backup_directory.c:506 +#: pg_backup_directory.c:544 #, c-format msgid "could not write to output file: %s" msgstr "не можливо запиÑати у вихідний файл: %s" -#: pg_backup_directory.c:373 +#: pg_backup_directory.c:375 #, c-format msgid "could not close data file: %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл даних: %m" -#: pg_backup_directory.c:407 +#: pg_backup_directory.c:408 #, c-format msgid "could not close data file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл даних \"%s\": %m" -#: pg_backup_directory.c:447 +#: pg_backup_directory.c:455 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ великий об'єкт файлу TOC \"%s\" Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ñƒ: %m" -#: pg_backup_directory.c:458 +#: pg_backup_directory.c:466 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "невірна Ð»Ñ–Ð½Ñ–Ñ Ñƒ великому об'єкті файлу TOC \"%s\": \"%s\"" -#: pg_backup_directory.c:467 +#: pg_backup_directory.c:475 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об'єкту файлу TOC \"%s\"" -#: pg_backup_directory.c:471 +#: pg_backup_directory.c:479 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ великий об'єкт файлу TOC \"%s\" %m" -#: pg_backup_directory.c:685 +#: pg_backup_directory.c:702 #, c-format -msgid "could not close blob data file: %m" -msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл бінарних даних: %m" +msgid "could not close LO data file: %m" +msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл даних LO: %m" -#: pg_backup_directory.c:691 +#: pg_backup_directory.c:712 #, c-format -msgid "could not write to blobs TOC file" -msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати зміÑÑ‚ у файл oobe. xml" +msgid "could not write to LOs TOC file: %s" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати в файл LO TOC: %s" -#: pg_backup_directory.c:705 +#: pg_backup_directory.c:728 #, c-format -msgid "could not close blobs TOC file: %m" -msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл TOC бінарних даних: %m" +msgid "could not close LOs TOC file: %m" +msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ файл LO TOC: %m" -#: pg_backup_directory.c:724 +#: pg_backup_directory.c:747 #, c-format msgid "file name too long: \"%s\"" msgstr "ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ задовге: \"%s\"" -#: pg_backup_null.c:74 +#: pg_backup_null.c:70 #, c-format msgid "this format cannot be read" msgstr "цей формат не може бути прочитаним" -#: pg_backup_tar.c:172 +#: pg_backup_tar.c:168 #, c-format msgid "could not open TOC file \"%s\" for output: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл TOC \"%s\" Ð´Ð»Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ: %m" -#: pg_backup_tar.c:179 +#: pg_backup_tar.c:175 #, c-format msgid "could not open TOC file for output: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл TOC Ð´Ð»Ñ Ð²Ð¸Ð²Ð¾Ð´Ñƒ: %m" -#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 -#: pg_backup_tar.c:405 pg_backup_tar.c:893 +#: pg_backup_tar.c:194 pg_backup_tar.c:330 pg_backup_tar.c:385 +#: pg_backup_tar.c:401 pg_backup_tar.c:906 #, c-format msgid "compression is not supported by tar archive format" msgstr "ÑтиÑÐ½ÐµÐ½Ð½Ñ Ð½Ðµ підтримуєтьÑÑ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¾Ð¼ архіватора tar" -#: pg_backup_tar.c:206 +#: pg_backup_tar.c:202 #, c-format msgid "could not open TOC file \"%s\" for input: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл TOC \"%s\" Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ñƒ: %m" -#: pg_backup_tar.c:213 +#: pg_backup_tar.c:209 #, c-format msgid "could not open TOC file for input: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл TOC Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ñƒ: %m" -#: pg_backup_tar.c:322 +#: pg_backup_tar.c:318 #, c-format msgid "could not find file \"%s\" in archive" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файл \"%s\" в архіві" -#: pg_backup_tar.c:382 +#: pg_backup_tar.c:378 #, c-format msgid "could not generate temporary file name: %m" msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ тимчаÑове ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ: %m" -#: pg_backup_tar.c:624 +#: pg_backup_tar.c:619 #, c-format msgid "unexpected COPY statement syntax: \"%s\"" msgstr "неочікуваний ÑинтакÑÐ¸Ñ Ñ–Ð½Ñтрукції копіюваннÑ: \"%s\"" -#: pg_backup_tar.c:890 +#: pg_backup_tar.c:903 #, c-format msgid "invalid OID for large object (%u)" msgstr "неприпуÑтимий ідентифікатор OID Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об’єктів (%u)" -#: pg_backup_tar.c:1035 +#: pg_backup_tar.c:1048 #, c-format msgid "could not close temporary file: %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ тимчаÑовий файл oobe. xml: %m" -#: pg_backup_tar.c:1038 +#: pg_backup_tar.c:1051 #, c-format msgid "actual file length (%lld) does not match expected (%lld)" msgstr "фактична довжина файлу (%lld) не відповідає очікуваній (%lld)" -#: pg_backup_tar.c:1084 pg_backup_tar.c:1115 +#: pg_backup_tar.c:1097 pg_backup_tar.c:1128 #, c-format msgid "could not find header for file \"%s\" in tar archive" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ верхній колонтитул Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ oobe. xml \"%s\" в архіві tar" -#: pg_backup_tar.c:1102 +#: pg_backup_tar.c:1115 #, c-format msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." msgstr "Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… поза замовленнÑм не підтримуєтьÑÑ Ñƒ цьому форматі архіву: вимагаєтÑÑŒÑ \"%s\", але перед цим іде \"%s\" у файлі архіву." -#: pg_backup_tar.c:1149 +#: pg_backup_tar.c:1162 #, c-format msgid "incomplete tar header found (%lu byte)" msgid_plural "incomplete tar header found (%lu bytes)" @@ -1236,7 +1459,7 @@ msgstr[1] "знайдено незавершений tar-заголовок (%lu msgstr[2] "знайдено незавершений tar-заголовок (%lu байт)" msgstr[3] "знайдено незавершений tar-заголовок (%lu байт)" -#: pg_backup_tar.c:1188 +#: pg_backup_tar.c:1201 #, c-format msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" msgstr "знайдено пошкоджений заголовок tar у %s (очікувалоÑÑ %d, обчиÑлено %d) позиції файлу %llu" @@ -1246,10 +1469,10 @@ msgstr "знайдено пошкоджений заголовок tar у %s (о msgid "unrecognized section name: \"%s\"" msgstr "нерозпізнане Ñ–Ð¼â€™Ñ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ñƒ: \"%s\"" -#: pg_backup_utils.c:55 pg_dump.c:627 pg_dump.c:644 pg_dumpall.c:340 -#: pg_dumpall.c:350 pg_dumpall.c:358 pg_dumpall.c:366 pg_dumpall.c:373 -#: pg_dumpall.c:383 pg_dumpall.c:458 pg_restore.c:291 pg_restore.c:307 -#: pg_restore.c:321 +#: pg_backup_utils.c:55 pg_dump.c:694 pg_dump.c:711 pg_dumpall.c:370 +#: pg_dumpall.c:380 pg_dumpall.c:388 pg_dumpall.c:396 pg_dumpall.c:403 +#: pg_dumpall.c:413 pg_dumpall.c:488 pg_restore.c:307 pg_restore.c:323 +#: pg_restore.c:337 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." @@ -1259,267 +1482,324 @@ msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інфор msgid "out of on_exit_nicely slots" msgstr "перевищено межу on_exit_nicely Ñлотів" -#: pg_dump.c:642 pg_dumpall.c:348 pg_restore.c:305 +#: pg_dump.c:709 pg_dumpall.c:378 pg_restore.c:321 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")" -#: pg_dump.c:661 pg_restore.c:328 +#: pg_dump.c:728 pg_restore.c:344 #, c-format msgid "options -s/--schema-only and -a/--data-only cannot be used together" msgstr "параметри -s/--schema-only Ñ– -a/--data-only не можуть викориÑтовуватиÑÑŒ разом" -#: pg_dump.c:664 +#: pg_dump.c:731 #, c-format msgid "options -s/--schema-only and --include-foreign-data cannot be used together" msgstr "параметри -s/--schema-only Ñ– --include-foreign-data не можуть викориÑтовуватиÑÑŒ разом" -#: pg_dump.c:667 +#: pg_dump.c:734 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "параметр --include-foreign-data не підтримуєтьÑÑ Ð· паралельним резервним копіюваннÑм" -#: pg_dump.c:670 pg_restore.c:331 +#: pg_dump.c:737 pg_restore.c:347 #, c-format msgid "options -c/--clean and -a/--data-only cannot be used together" msgstr "параметри -c/--clean Ñ– -a/--data-only не можна викориÑтовувати разом" -#: pg_dump.c:673 pg_dumpall.c:378 pg_restore.c:356 +#: pg_dump.c:740 pg_dumpall.c:408 pg_restore.c:375 #, c-format msgid "option --if-exists requires option -c/--clean" msgstr "параметр --if-exists потребує параметр -c/--clean" -#: pg_dump.c:680 +#: pg_dump.c:747 #, c-format msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" msgstr "параметр --on-conflict-do-nothing вимагає опції --inserts, --rows-per-insert або --column-inserts" -#: pg_dump.c:702 +#: pg_dump.c:776 +#, c-format +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "нерозпізнаний алгоритм ÑтиÑканнÑ: \"%s\"" + +#: pg_dump.c:783 #, c-format -msgid "requested compression not available in this installation -- archive will be uncompressed" -msgstr "затребуване ÑтиÑÐºÐ°Ð½Ð½Ñ Ð½ÐµÐ´Ð¾Ñтупне на цій ÑиÑтемі -- архів не буде ÑтиÑкатиÑÑ" +msgid "invalid compression specification: %s" +msgstr "неприпуÑтима ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ ÑтиÑканнÑ: %s" -#: pg_dump.c:715 +#: pg_dump.c:796 +#, c-format +msgid "compression option \"%s\" is not currently supported by pg_dump" +msgstr "параметр ÑтиÑÐ½ÐµÐ½Ð½Ñ \"%s\" в даний Ñ‡Ð°Ñ Ð½Ðµ підтримуєтьÑÑ pg_dump" + +#: pg_dump.c:808 #, c-format msgid "parallel backup only supported by the directory format" msgstr "паралельне резервне ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð¿Ñ–Ð´Ñ‚Ñ€Ð¸Ð¼ÑƒÑ”Ñ‚ÑŒÑÑ Ð»Ð¸ÑˆÐµ з форматом \"каталог\"" -#: pg_dump.c:761 +#: pg_dump.c:854 #, c-format msgid "last built-in OID is %u" msgstr "оÑтанній вбудований OID %u" -#: pg_dump.c:770 +#: pg_dump.c:863 #, c-format msgid "no matching schemas were found" msgstr "відповідних Ñхем не знайдено" -#: pg_dump.c:784 +#: pg_dump.c:880 #, c-format msgid "no matching tables were found" msgstr "відповідних таблиць не знайдено" -#: pg_dump.c:806 +#: pg_dump.c:908 #, c-format msgid "no matching extensions were found" msgstr "не знайдено відповідних розширень" -#: pg_dump.c:989 +#: pg_dump.c:1092 #, c-format msgid "%s dumps a database as a text file or to other formats.\n\n" msgstr "%s зберігає резервну копію бази даних в текÑтовому файлі або в інших форматах.\n\n" -#: pg_dump.c:990 pg_dumpall.c:605 pg_restore.c:433 +#: pg_dump.c:1093 pg_dumpall.c:636 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "ВикориÑтаннÑ:\n" -#: pg_dump.c:991 +#: pg_dump.c:1094 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: pg_dump.c:993 pg_dumpall.c:608 pg_restore.c:436 +#: pg_dump.c:1096 pg_dumpall.c:639 pg_restore.c:455 #, c-format msgid "\n" "General options:\n" msgstr "\n" "ОÑновні налаштуваннÑ:\n" -#: pg_dump.c:994 +#: pg_dump.c:1097 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=FILENAME ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ виводу або каталогу\n" -#: pg_dump.c:995 +#: pg_dump.c:1098 #, c-format msgid " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" " plain text (default))\n" msgstr " -F, --format=c|d|t|p формат файлу виводу (Ñпеціальний, каталог, tar,\n" " звичайний текÑÑ‚ (за замовчуваннÑм))\n" -#: pg_dump.c:997 +#: pg_dump.c:1100 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM викориÑтовувати ці паралельні Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ\n" -#: pg_dump.c:998 pg_dumpall.c:610 +#: pg_dump.c:1101 pg_dumpall.c:641 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose детальний режим\n" -#: pg_dump.c:999 pg_dumpall.c:611 +#: pg_dump.c:1102 pg_dumpall.c:642 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n" -#: pg_dump.c:1000 +#: pg_dump.c:1103 #, c-format -msgid " -Z, --compress=0-9 compression level for compressed formats\n" -msgstr " -Z, --compress=0-9 рівень ÑтиÑÐºÐ°Ð½Ð½Ñ Ð´Ð»Ñ ÑтиÑнутих форматів\n" +msgid " -Z, --compress=METHOD[:DETAIL]\n" +" compress as specified\n" +msgstr " -Z, --compress=METHOD[:DETAIL]\n" +" ÑтиÑкати Ñк вказано\n" -#: pg_dump.c:1001 pg_dumpall.c:612 +#: pg_dump.c:1105 pg_dumpall.c:643 #, c-format msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" msgstr " --lock-wait-timeout=TIMEOUT помилка піÑÐ»Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ TIMEOUT Ð´Ð»Ñ Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–\n" -#: pg_dump.c:1002 pg_dumpall.c:639 +#: pg_dump.c:1106 pg_dumpall.c:671 #, c-format msgid " --no-sync do not wait for changes to be written safely to disk\n" msgstr " --no-sync не чекати безпечного Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ на диÑк\n" -#: pg_dump.c:1003 pg_dumpall.c:613 +#: pg_dump.c:1107 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD вÑтановити метод Ð´Ð»Ñ Ñинхронізації файлів на диÑк\n" + +#: pg_dump.c:1108 pg_dumpall.c:644 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: pg_dump.c:1005 pg_dumpall.c:614 +#: pg_dump.c:1110 pg_dumpall.c:645 #, c-format msgid "\n" "Options controlling the output content:\n" msgstr "\n" "Параметри, що керують вихідним вміÑтом:\n" -#: pg_dump.c:1006 pg_dumpall.c:615 +#: pg_dump.c:1111 pg_dumpall.c:646 #, c-format msgid " -a, --data-only dump only the data, not the schema\n" msgstr " -a, --data-only вивантажити лише дані, без Ñхеми\n" -#: pg_dump.c:1007 +#: pg_dump.c:1112 #, c-format -msgid " -b, --blobs include large objects in dump\n" -msgstr " -b, --blobs включити у Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÑ– об'єкти\n" +msgid " -b, --large-objects include large objects in dump\n" +msgstr " -b, --large-objects включити у Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÑ– об'єкти\n" -#: pg_dump.c:1008 +#: pg_dump.c:1113 #, c-format -msgid " -B, --no-blobs exclude large objects in dump\n" -msgstr " -B, --no-blobs виключити з Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÑ– об'єкти\n" +msgid " --blobs (same as --large-objects, deprecated)\n" +msgstr " --blobs (те Ñаме, що --large-objects, заÑтарілий)\n" -#: pg_dump.c:1009 pg_restore.c:447 +#: pg_dump.c:1114 +#, c-format +msgid " -B, --no-large-objects exclude large objects in dump\n" +msgstr " -b, --no-large-objects виключити з Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÑ– об'єкти\n" + +#: pg_dump.c:1115 +#, c-format +msgid " --no-blobs (same as --no-large-objects, deprecated)\n" +msgstr " --no-blobs (те Ñаме, що --no-large-objects, заÑтарілий)\n" + +#: pg_dump.c:1116 pg_restore.c:466 #, c-format msgid " -c, --clean clean (drop) database objects before recreating\n" msgstr " -c, --clean видалити об'єкти бази даних перед перед повторним ÑтвореннÑм\n" -#: pg_dump.c:1010 +#: pg_dump.c:1117 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr " -C, --create включити у Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ Ð´Ð»Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних\n" -#: pg_dump.c:1011 +#: pg_dump.c:1118 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr " -e, --extension=PATTERN вивантажити лише вказане(Ñ–) розширеннÑ\n" -#: pg_dump.c:1012 pg_dumpall.c:617 +#: pg_dump.c:1119 pg_dumpall.c:648 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=ENCODING вивантажити дані в кодуванні ENCODING\n" -#: pg_dump.c:1013 +#: pg_dump.c:1120 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=PATTERN вивантажити лише вказану Ñхему(и)\n" -#: pg_dump.c:1014 +#: pg_dump.c:1121 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=PATTERN ÐЕ вивантажувати вказану Ñхему(и)\n" -#: pg_dump.c:1015 +#: pg_dump.c:1122 #, c-format msgid " -O, --no-owner skip restoration of object ownership in\n" " plain-text format\n" msgstr " -O, --no-owner пропуÑкати Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð¾Ð»Ð¾Ð´Ñ–Ð½Ð½Ñ Ð¾Ð±'єктами\n" " при викориÑтанні текÑтового формату\n" -#: pg_dump.c:1017 pg_dumpall.c:621 +#: pg_dump.c:1124 pg_dumpall.c:652 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr " -s, --schema-only вивантажити лише Ñхему, без даних\n" -#: pg_dump.c:1018 +#: pg_dump.c:1125 #, c-format msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" msgstr " -S, --superuser=NAME ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача, Ñке буде викориÑтовуватиÑÑŒ у звичайних текÑтових форматах\n" -#: pg_dump.c:1019 +#: pg_dump.c:1126 #, c-format -msgid " -t, --table=PATTERN dump the specified table(s) only\n" +msgid " -t, --table=PATTERN dump only the specified table(s)\n" msgstr " -t, --table=PATTERN вивантажити лише вказані таблиці\n" -#: pg_dump.c:1020 +#: pg_dump.c:1127 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=PATTERN ÐЕ вивантажувати вказані таблиці\n" -#: pg_dump.c:1021 pg_dumpall.c:624 +#: pg_dump.c:1128 pg_dumpall.c:655 #, c-format msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" msgstr " -x, --no-privileges не вивантажувати права (наданнÑ/відкликаннÑ)\n" -#: pg_dump.c:1022 pg_dumpall.c:625 +#: pg_dump.c:1129 pg_dumpall.c:656 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð»Ð¸ÑˆÐµ утилітами оновленнÑ\n" -#: pg_dump.c:1023 pg_dumpall.c:626 +#: pg_dump.c:1130 pg_dumpall.c:657 #, c-format msgid " --column-inserts dump data as INSERT commands with column names\n" msgstr " --column-inserts вивантажити дані у виглÑді команд INSERT з іменами Ñтовпців\n" -#: pg_dump.c:1024 pg_dumpall.c:627 +#: pg_dump.c:1131 pg_dumpall.c:658 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr " --disable-dollar-quoting вимкнути цінову пропозицію $, викориÑтовувати SQL Ñтандартну цінову пропозицію\n" -#: pg_dump.c:1025 pg_dumpall.c:628 pg_restore.c:464 +#: pg_dump.c:1132 pg_dumpall.c:659 pg_restore.c:483 #, c-format msgid " --disable-triggers disable triggers during data-only restore\n" msgstr " --disable-triggers вимкнути тригери лише під Ñ‡Ð°Ñ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…\n" -#: pg_dump.c:1026 +#: pg_dump.c:1133 #, c-format msgid " --enable-row-security enable row security (dump only content user has\n" " access to)\n" msgstr " --enable-row-security активувати захиÑÑ‚ на рівні Ñ€Ñдків (вивантажити лише той вміÑÑ‚, до Ñкого\n" " кориÑтувач має доÑтуп)\n" -#: pg_dump.c:1028 +#: pg_dump.c:1135 +#, c-format +msgid " --exclude-extension=PATTERN do NOT dump the specified extension(s)\n" +msgstr " --exclude-extension=PATTERN ÐЕ вивантажувати вказане розширеннÑ\n" + +#: pg_dump.c:1136 +#, c-format +msgid " --exclude-table-and-children=PATTERN\n" +" do NOT dump the specified table(s), including\n" +" child and partition tables\n" +msgstr " --exclude-table-and-children=PATTERN\n" +" не вивантажувати зазначені таблиці, включно\n" +" з дочірніми та Ñекціонованими таблицÑми\n" + +#: pg_dump.c:1139 #, c-format msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" msgstr " --exclude-table-data=PATTERN ÐЕ вивантажувати дані вказаних таблиць\n" -#: pg_dump.c:1029 pg_dumpall.c:630 +#: pg_dump.c:1140 +#, c-format +msgid " --exclude-table-data-and-children=PATTERN\n" +" do NOT dump data for the specified table(s),\n" +" including child and partition tables\n" +msgstr " --exclude-table-data-and-children=PATTERN\n" +" не вивантажувати дані зазначених таблиць,\n" +" включно з дочірніми та Ñекціонованими таблицÑми\n" + +#: pg_dump.c:1143 pg_dumpall.c:661 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr " --extra-float-digits=NUM змінити параметр за замовчуваннÑм Ð´Ð»Ñ extra_float_digits\n" -#: pg_dump.c:1030 pg_dumpall.c:631 pg_restore.c:466 +#: pg_dump.c:1144 +#, c-format +msgid " --filter=FILENAME include or exclude objects and data from dump\n" +" based on expressions in FILENAME\n" +msgstr " --filter=FILENAME включати або виключати об'єкти та дані з дампу\n" +" на оÑнові виразів у FILENAME\n" + +#: pg_dump.c:1146 pg_dumpall.c:663 pg_restore.c:487 #, c-format msgid " --if-exists use IF EXISTS when dropping objects\n" msgstr " --if-exists викориÑтовувати IF EXISTS під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¾Ð±'єктів\n" -#: pg_dump.c:1031 +#: pg_dump.c:1147 #, c-format msgid " --include-foreign-data=PATTERN\n" " include data of foreign tables on foreign\n" @@ -1528,94 +1808,101 @@ msgstr " --include-foreign-data=ШÐБЛОÐ\n" " включають дані підлеглих таблиць на підлеглих\n" " Ñервери, що відповідають ШÐБЛОÐУ\n" -#: pg_dump.c:1034 pg_dumpall.c:632 +#: pg_dump.c:1150 pg_dumpall.c:664 #, c-format msgid " --inserts dump data as INSERT commands, rather than COPY\n" msgstr " --inserts вивантажити дані у виглÑді команд INSERT, не COPY\n" -#: pg_dump.c:1035 pg_dumpall.c:633 +#: pg_dump.c:1151 pg_dumpall.c:665 #, c-format msgid " --load-via-partition-root load partitions via the root table\n" msgstr " --load-via-partition-root завантажувати Ñекції через головну таблицю\n" -#: pg_dump.c:1036 pg_dumpall.c:634 +#: pg_dump.c:1152 pg_dumpall.c:666 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments не вивантажувати коментарі\n" -#: pg_dump.c:1037 pg_dumpall.c:635 +#: pg_dump.c:1153 pg_dumpall.c:667 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications не вивантажувати публікації\n" -#: pg_dump.c:1038 pg_dumpall.c:637 +#: pg_dump.c:1154 pg_dumpall.c:669 #, c-format msgid " --no-security-labels do not dump security label assignments\n" msgstr " --no-security-labels не вивантажувати Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¼Ñ–Ñ‚Ð¾Ðº безпеки\n" -#: pg_dump.c:1039 pg_dumpall.c:638 +#: pg_dump.c:1155 pg_dumpall.c:670 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions не вивантажувати підпиÑки\n" -#: pg_dump.c:1040 pg_dumpall.c:640 +#: pg_dump.c:1156 pg_dumpall.c:672 #, c-format msgid " --no-table-access-method do not dump table access methods\n" msgstr " --no-table-access-method не вивантажувати табличні методи доÑтупу\n" -#: pg_dump.c:1041 pg_dumpall.c:641 +#: pg_dump.c:1157 pg_dumpall.c:673 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces не вивантажувати Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¸Ñ… проÑторів\n" -#: pg_dump.c:1042 pg_dumpall.c:642 +#: pg_dump.c:1158 pg_dumpall.c:674 #, c-format msgid " --no-toast-compression do not dump TOAST compression methods\n" msgstr " --no-toast-compression не вивантажувати методи ÑтиÑÐ½ÐµÐ½Ð½Ñ TOAST\n" -#: pg_dump.c:1043 pg_dumpall.c:643 +#: pg_dump.c:1159 pg_dumpall.c:675 #, c-format msgid " --no-unlogged-table-data do not dump unlogged table data\n" msgstr " --no-unlogged-table-data не вивантажувати дані таблиць, Ñкі не журналюютьÑÑ\n" -#: pg_dump.c:1044 pg_dumpall.c:644 +#: pg_dump.c:1160 pg_dumpall.c:676 #, c-format msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" msgstr " --on-conflict-do-nothing додавати ON CONFLICT DO NOTHING до команди INSERT\n" -#: pg_dump.c:1045 pg_dumpall.c:645 +#: pg_dump.c:1161 pg_dumpall.c:677 #, c-format msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" msgstr " --quote-all-identifiers укладати в лапки вÑÑ– ідентифікатори, а не тільки ключові Ñлова\n" -#: pg_dump.c:1046 pg_dumpall.c:646 +#: pg_dump.c:1162 pg_dumpall.c:678 #, c-format msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" msgstr " --rows-per-insert=NROWS кількіÑть Ñ€Ñдків Ð´Ð»Ñ INSERT; вимагає параметру --inserts\n" -#: pg_dump.c:1047 +#: pg_dump.c:1163 #, c-format msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" msgstr " --section=SECTION вивантажити вказану Ñекцію (pre-data, data або post-data)\n" -#: pg_dump.c:1048 +#: pg_dump.c:1164 #, c-format msgid " --serializable-deferrable wait until the dump can run without anomalies\n" msgstr " --serializable-deferrable чекати коли Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶Ð½Ð° буде виконати без аномалій\n" -#: pg_dump.c:1049 +#: pg_dump.c:1165 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT викориÑтовувати під Ñ‡Ð°Ñ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ð°Ð½Ð¸Ð¹ знімок\n" -#: pg_dump.c:1050 pg_restore.c:476 +#: pg_dump.c:1166 pg_restore.c:497 #, c-format msgid " --strict-names require table and/or schema include patterns to\n" " match at least one entity each\n" msgstr " --strict-names потребувати, щоб при вказівці шаблону включеннÑ\n" " таблиці Ñ–/або Ñхеми йому відповідав мінімум один об'єкт\n" -#: pg_dump.c:1052 pg_dumpall.c:647 pg_restore.c:478 +#: pg_dump.c:1168 +#, c-format +msgid " --table-and-children=PATTERN dump only the specified table(s), including\n" +" child and partition tables\n" +msgstr " --table-and-children=PATTERN вивантажувати лише зазначені таблиці,\n" +" включно з дочірніми та Ñекціонованими таблицÑми\n" + +#: pg_dump.c:1170 pg_dumpall.c:679 pg_restore.c:500 #, c-format msgid " --use-set-session-authorization\n" " use SET SESSION AUTHORIZATION commands instead of\n" @@ -1624,49 +1911,49 @@ msgstr " --use-set-session-authorization\n" " щоб вÑтановити влаÑника, викориÑтати команди SET SESSION AUTHORIZATION,\n" " заміÑть команд ALTER OWNER\n" -#: pg_dump.c:1056 pg_dumpall.c:651 pg_restore.c:482 +#: pg_dump.c:1174 pg_dumpall.c:683 pg_restore.c:504 #, c-format msgid "\n" "Connection options:\n" msgstr "\n" "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·'єднаннÑ:\n" -#: pg_dump.c:1057 +#: pg_dump.c:1175 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAME ім'Ñ Ð±Ð°Ð·Ð¸ даних Ð´Ð»Ñ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ\n" -#: pg_dump.c:1058 pg_dumpall.c:653 pg_restore.c:483 +#: pg_dump.c:1176 pg_dumpall.c:685 pg_restore.c:505 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME хоÑÑ‚ Ñерверу баз даних або каталог Ñокетів\n" -#: pg_dump.c:1059 pg_dumpall.c:655 pg_restore.c:484 +#: pg_dump.c:1177 pg_dumpall.c:687 pg_restore.c:506 #, c-format msgid " -p, --port=PORT database server port number\n" msgstr " -p, --port=PORT номер порту Ñервера бази даних\n" -#: pg_dump.c:1060 pg_dumpall.c:656 pg_restore.c:485 +#: pg_dump.c:1178 pg_dumpall.c:688 pg_restore.c:507 #, c-format msgid " -U, --username=NAME connect as specified database user\n" msgstr " -U, --username=NAME підключатиÑÑŒ Ñк вказаний кориÑтувач бази даних\n" -#: pg_dump.c:1061 pg_dumpall.c:657 pg_restore.c:486 +#: pg_dump.c:1179 pg_dumpall.c:689 pg_restore.c:508 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ніколи не запитувати пароль\n" -#: pg_dump.c:1062 pg_dumpall.c:658 pg_restore.c:487 +#: pg_dump.c:1180 pg_dumpall.c:690 pg_restore.c:509 #, c-format msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password запитувати пароль завжди (повинно траплÑтиÑÑŒ автоматично)\n" -#: pg_dump.c:1063 pg_dumpall.c:659 +#: pg_dump.c:1181 pg_dumpall.c:691 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLENAME виконати SET ROLE до вивантаженнÑ\n" -#: pg_dump.c:1065 +#: pg_dump.c:1183 #, c-format msgid "\n" "If no database name is supplied, then the PGDATABASE environment\n" @@ -1674,229 +1961,239 @@ msgid "\n" msgstr "\n" "Якщо ім'Ñ Ð±Ð°Ð·Ð¸ даних не вказано, тоді викориÑтовуєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ— Ñередовища PGDATABASE.\n\n" -#: pg_dump.c:1067 pg_dumpall.c:663 pg_restore.c:494 +#: pg_dump.c:1185 pg_dumpall.c:695 pg_restore.c:516 #, c-format msgid "Report bugs to <%s>.\n" msgstr "ПовідомлÑти про помилки на <%s>.\n" -#: pg_dump.c:1068 pg_dumpall.c:664 pg_restore.c:495 +#: pg_dump.c:1186 pg_dumpall.c:696 pg_restore.c:517 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" -#: pg_dump.c:1087 pg_dumpall.c:488 +#: pg_dump.c:1205 pg_dumpall.c:518 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "вказано неприпуÑтиме клієнтÑьке ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"" -#: pg_dump.c:1225 +#: pg_dump.c:1353 #, c-format msgid "parallel dumps from standby servers are not supported by this server version" msgstr "паралельні Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¸Ñ… Ñерверів не підтримуютьÑÑ Ñ†Ñ–Ñ”ÑŽ верÑÑ–ÑŽ Ñервера" -#: pg_dump.c:1290 +#: pg_dump.c:1418 #, c-format msgid "invalid output format \"%s\" specified" msgstr "вказано неприпуÑтимий формат виводу \"%s\"" -#: pg_dump.c:1331 pg_dump.c:1387 pg_dump.c:1440 pg_dumpall.c:1282 +#: pg_dump.c:1459 pg_dump.c:1515 pg_dump.c:1568 pg_dumpall.c:1516 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неправильне повне ім'Ñ (забагато компонентів): %s" -#: pg_dump.c:1339 +#: pg_dump.c:1467 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "не знайдено відповідних Ñхем Ð´Ð»Ñ Ð²Ñ–Ð·ÐµÑ€ÑƒÐ½ÐºÑƒ \"%s\"" -#: pg_dump.c:1392 +#: pg_dump.c:1520 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "не знайдено відповідних розширень Ð´Ð»Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ñƒ \"%s\"" -#: pg_dump.c:1445 +#: pg_dump.c:1573 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "не знайдено відповідних підлеглих Ñерверів Ð´Ð»Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ñƒ \"%s\"" -#: pg_dump.c:1508 +#: pg_dump.c:1644 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "неправильне ім'Ñ Ð·Ð²'Ñзку (забагато компонентів): %s" -#: pg_dump.c:1519 +#: pg_dump.c:1666 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "не знайдено відповідних таблиць Ð´Ð»Ñ Ð²Ñ–Ð·ÐµÑ€ÑƒÐ½ÐºÑƒ\"%s\"" -#: pg_dump.c:1546 +#: pg_dump.c:1693 #, c-format msgid "You are currently not connected to a database." msgstr "Ðа даний момент ви від'єднанні від бази даних." -#: pg_dump.c:1549 +#: pg_dump.c:1696 #, c-format msgid "cross-database references are not implemented: %s" msgstr "міжбазові поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ðµ реалізовані: %s" -#: pg_dump.c:1980 +#: pg_dump.c:2155 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ñту таблиці \"%s.%s\"" -#: pg_dump.c:2086 +#: pg_dump.c:2265 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Помилка Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ñту таблиці \"%s\": помилка в PQgetCopyData()." -#: pg_dump.c:2087 pg_dump.c:2097 +#: pg_dump.c:2266 pg_dump.c:2276 #, c-format msgid "Error message from server: %s" msgstr "ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку від Ñервера: %s" -#: pg_dump.c:2088 pg_dump.c:2098 +#: pg_dump.c:2267 pg_dump.c:2277 #, c-format msgid "Command was: %s" msgstr "Команда була: %s" -#: pg_dump.c:2096 +#: pg_dump.c:2275 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Помилка Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ñту таблиці \"%s\": помилка в PQgetResult(). " -#: pg_dump.c:2178 +#: pg_dump.c:2366 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "неправильна кількіÑть полів отриманих з таблиці \"%s\"" -#: pg_dump.c:2836 +#: pg_dump.c:3068 #, c-format msgid "saving database definition" msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних" -#: pg_dump.c:2932 +#: pg_dump.c:3177 #, c-format msgid "unrecognized locale provider: %s" msgstr "нерозпізнаний поÑтачальник локалів: %s" -#: pg_dump.c:3278 +#: pg_dump.c:3538 #, c-format msgid "saving encoding = %s" msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ = %s" -#: pg_dump.c:3303 +#: pg_dump.c:3563 #, c-format -msgid "saving standard_conforming_strings = %s" -msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ standard_conforming_strings = %s" +msgid "saving \"standard_conforming_strings = %s\"" +msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ \"standard_conforming_strings = %s\"" -#: pg_dump.c:3342 +#: pg_dump.c:3602 #, c-format msgid "could not parse result of current_schemas()" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ результат current_schemas()" -#: pg_dump.c:3361 +#: pg_dump.c:3621 #, c-format -msgid "saving search_path = %s" -msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ search_path = %s" +msgid "saving \"search_path = %s\"" +msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ \"search_path = %s\"" -#: pg_dump.c:3399 +#: pg_dump.c:3657 #, c-format msgid "reading large objects" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об’єктів" -#: pg_dump.c:3537 +#: pg_dump.c:3878 #, c-format -msgid "saving large objects" -msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об’єктів" +msgid "saving large objects \"%s\"" +msgstr "Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об’єктів \"%s\"" -#: pg_dump.c:3578 +#: pg_dump.c:3899 #, c-format msgid "error reading large object %u: %s" msgstr "помилка Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об’єктів %u: %s" -#: pg_dump.c:3684 +#: pg_dump.c:4002 #, c-format msgid "reading row-level security policies" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸Ðº безпеки на рівні Ñ€Ñдків" -#: pg_dump.c:3825 +#: pg_dump.c:4143 #, c-format msgid "unexpected policy command type: %c" msgstr "неочікуваний тип команди в політиці: %c" -#: pg_dump.c:4275 pg_dump.c:4593 pg_dump.c:11724 pg_dump.c:17541 -#: pg_dump.c:17543 pg_dump.c:18164 +#: pg_dump.c:4593 pg_dump.c:5151 pg_dump.c:12365 pg_dump.c:18250 +#: pg_dump.c:18252 pg_dump.c:18874 #, c-format msgid "could not parse %s array" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ маÑив %s" -#: pg_dump.c:4461 +#: pg_dump.c:4807 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "підпиÑки не вивантажені через те, що чинний кориÑтувач не Ñ” ÑуперкориÑтувачем" -#: pg_dump.c:4975 +#: pg_dump.c:5013 +#, c-format +msgid "subscription with OID %u does not exist" +msgstr "підпиÑки %u з OID не Ñ–Ñнує" + +#: pg_dump.c:5020 +#, c-format +msgid "failed sanity check, table with OID %u not found" +msgstr "помилка ціліÑноÑті, Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð· OID %u не знайдена" + +#: pg_dump.c:5583 #, c-format msgid "could not find parent extension for %s %s" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ батьківÑький елемент Ð´Ð»Ñ %s %s" -#: pg_dump.c:5120 +#: pg_dump.c:5728 #, c-format msgid "schema with OID %u does not exist" msgstr "Ñхема з OID %u не Ñ–Ñнує" -#: pg_dump.c:6574 pg_dump.c:16805 +#: pg_dump.c:7210 pg_dump.c:17621 #, c-format msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" msgstr "помилка ціліÑноÑті, за OID %u не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ батьківÑьку таблицю поÑлідовноÑті з OID %u" -#: pg_dump.c:6878 pg_dump.c:7145 pg_dump.c:7616 pg_dump.c:8283 pg_dump.c:8404 -#: pg_dump.c:8558 +#: pg_dump.c:7355 +#, c-format +msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found" +msgstr "помилка ціліÑноÑті, OID %u не знайдено в таблиці pg_partitioned_table" + +#: pg_dump.c:7586 pg_dump.c:7860 pg_dump.c:8307 pg_dump.c:8921 pg_dump.c:9043 +#: pg_dump.c:9191 #, c-format msgid "unrecognized table OID %u" msgstr "нерозпізнаний OID таблиці %u" -#: pg_dump.c:6882 +#: pg_dump.c:7590 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "неочікувані дані індекÑу Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: pg_dump.c:7377 +#: pg_dump.c:8092 #, c-format msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" msgstr "помилка ціліÑноÑті, за OID %u не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ батьківÑьку таблицю Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу pg_rewrite з OID %u" -#: pg_dump.c:7668 -#, c-format -msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" -msgstr "запит не повернув ім'Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ñ— таблиці Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ð° зовнішнього ключа \"%s\" в таблиці \"%s\" (OID цільової таблиці: %u)" - -#: pg_dump.c:8287 +#: pg_dump.c:8925 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "неочікувані дані ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: pg_dump.c:8317 +#: pg_dump.c:8954 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "неприпуÑтима Ð½ÑƒÐ¼ÐµÑ€Ð°Ñ†Ñ–Ñ Ñтовпців у таблиці \"%s\"" -#: pg_dump.c:8366 +#: pg_dump.c:9005 #, c-format msgid "finding table default expressions" msgstr "пошук виразів за замовчуваннÑм Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–" -#: pg_dump.c:8408 +#: pg_dump.c:9047 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ adnum %d Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: pg_dump.c:8508 +#: pg_dump.c:9141 #, c-format msgid "finding table check constraints" msgstr "пошук перевірочних обмежень таблиці" -#: pg_dump.c:8562 +#: pg_dump.c:9195 #, c-format msgid "expected %d check constraint on table \"%s\" but found %d" msgid_plural "expected %d check constraints on table \"%s\" but found %d" @@ -1905,167 +2202,178 @@ msgstr[1] "очікувалоÑÑŒ %d обмеженнÑ-перевірки дл msgstr[2] "очікувалоÑÑŒ %d обмежень-перевірок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\", але знайдено %d" msgstr[3] "очікувалоÑÑŒ %d обмежень-перевірок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\", але знайдено %d" -#: pg_dump.c:8566 +#: pg_dump.c:9199 #, c-format msgid "The system catalogs might be corrupted." msgstr "СиÑтемні каталоги можуть бути пошкоджені." -#: pg_dump.c:9256 +#: pg_dump.c:9889 #, c-format msgid "role with OID %u does not exist" msgstr "роль з OID %u не Ñ–Ñнує" -#: pg_dump.c:9368 pg_dump.c:9397 +#: pg_dump.c:10001 pg_dump.c:10030 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "непідтримуваний Ð·Ð°Ð¿Ð¸Ñ Ð² pg_init_privs: %u %u %d" -#: pg_dump.c:10218 +#: pg_dump.c:10577 +#, c-format +msgid "missing metadata for large objects \"%s\"" +msgstr "відÑутні метадані Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об'єктів \"%s\"" + +#: pg_dump.c:10860 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "typtype типу даних \"%s\" має неприпуÑтимий виглÑд" -#: pg_dump.c:11793 +#: pg_dump.c:12434 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ provolatile Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— \"%s\"" -#: pg_dump.c:11843 pg_dump.c:13634 +#: pg_dump.c:12484 pg_dump.c:14380 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ proparallel Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— \"%s\"" -#: pg_dump.c:11974 pg_dump.c:12080 pg_dump.c:12087 +#: pg_dump.c:12614 pg_dump.c:12720 pg_dump.c:12727 #, c-format msgid "could not find function definition for function with OID %u" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— з OID %u" -#: pg_dump.c:12013 +#: pg_dump.c:12653 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі pg_cast.castfunc або pg_cast.castmethod" -#: pg_dump.c:12016 +#: pg_dump.c:12656 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі pg_cast.castmethod" -#: pg_dump.c:12106 +#: pg_dump.c:12746 #, c-format msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" msgstr "неприпуÑтиме Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ, Ñк мінімум одне з trffromsql Ñ– trftosql повинно бути ненульовим" -#: pg_dump.c:12123 +#: pg_dump.c:12763 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі pg_transform.trffromsql" -#: pg_dump.c:12144 +#: pg_dump.c:12784 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² полі pg_transform.trftosql" -#: pg_dump.c:12289 +#: pg_dump.c:12929 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "поÑтфікÑні оператори більше не підтримуютьÑÑ (оператор \"%s\")" -#: pg_dump.c:12459 +#: pg_dump.c:13099 #, c-format msgid "could not find operator with OID %s" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ оператора з OID %s" -#: pg_dump.c:12527 +#: pg_dump.c:13167 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "неприпуÑтимий тип \"%c\" методу доÑтупу \"%s\"" -#: pg_dump.c:13146 +#: pg_dump.c:13841 pg_dump.c:13909 #, c-format msgid "unrecognized collation provider: %s" msgstr "нерозпізнаний поÑтачальник правил ÑортуваннÑ: %s" -#: pg_dump.c:13553 +#: pg_dump.c:13850 pg_dump.c:13857 pg_dump.c:13868 pg_dump.c:13878 +#: pg_dump.c:13893 +#, c-format +msgid "invalid collation \"%s\"" +msgstr "неприпуÑтиме правило ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\"" + +#: pg_dump.c:14299 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ aggfinalmodify Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ñƒ \"%s\"" -#: pg_dump.c:13609 +#: pg_dump.c:14355 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ aggmfinalmodify Ð´Ð»Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ñƒ \"%s\"" -#: pg_dump.c:14327 +#: pg_dump.c:15072 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "нерозпізнаний тип об’єкта у Ñтандартному праві: %d" -#: pg_dump.c:14343 +#: pg_dump.c:15088 #, c-format msgid "could not parse default ACL list (%s)" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ñтандартний ACL ÑпиÑок (%s)" -#: pg_dump.c:14425 +#: pg_dump.c:15172 #, c-format msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ початковий ÑпиÑок ACL (%s) або за замовченнÑм (%s) Ð´Ð»Ñ Ð¾Ð±'єкта \"%s\" (%s)" -#: pg_dump.c:14450 +#: pg_dump.c:15197 #, c-format msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑпиÑок ACL (%s) або за замовчуваннÑм (%s) Ð´Ð»Ñ Ð¾Ð±'єкту \"%s\" (%s)" -#: pg_dump.c:14988 +#: pg_dump.c:15740 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "запит на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду \"%s\" не повернув дані" -#: pg_dump.c:14991 +#: pg_dump.c:15743 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "запит на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду \"%s\" повернув більше, ніж одне визначеннÑ" -#: pg_dump.c:14998 +#: pg_dump.c:15750 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду \"%s\" пуÑте (довжина нуль)" -#: pg_dump.c:15082 +#: pg_dump.c:15835 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS більше не підтримуєтьÑÑ (таблицÑ\"%s\")" -#: pg_dump.c:16011 +#: pg_dump.c:16822 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "неприпуÑтиме чиÑло Ñтовпців %d Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\"" -#: pg_dump.c:16089 +#: pg_dump.c:16900 #, c-format msgid "could not parse index statistic columns" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ñтовпці ÑтатиÑтики індекÑів" -#: pg_dump.c:16091 +#: pg_dump.c:16902 #, c-format msgid "could not parse index statistic values" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑтатиÑтики індекÑів" -#: pg_dump.c:16093 +#: pg_dump.c:16904 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "невідповідна кількіÑть Ñтовпців Ñ– значень Ð´Ð»Ñ ÑтатиÑтики індекÑів" -#: pg_dump.c:16311 +#: pg_dump.c:17119 #, c-format msgid "missing index for constraint \"%s\"" msgstr "пропущено Ñ–Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ \"%s\"" -#: pg_dump.c:16539 +#: pg_dump.c:17354 #, c-format msgid "unrecognized constraint type: %c" msgstr "нерозпізнаний тип обмеженнÑ: %c" -#: pg_dump.c:16640 pg_dump.c:16869 +#: pg_dump.c:17455 pg_dump.c:17685 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" @@ -2074,67 +2382,63 @@ msgstr[1] "запит на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… поÑÐ»Ñ–Ð´Ð¾Ð²Ð½Ð¾Ñ msgstr[2] "запит на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… поÑлідовноÑті \"%s\" повернув %d Ñ€Ñдків (очікувалоÑÑ 1)" msgstr[3] "запит на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… поÑлідовноÑті \"%s\" повернув %d Ñ€Ñдків (очікувалоÑÑ 1)" -#: pg_dump.c:16672 +#: pg_dump.c:17487 #, c-format msgid "unrecognized sequence type: %s" msgstr "нерозпізнаний тип поÑлідовноÑті: %s" -#: pg_dump.c:16961 -#, c-format -msgid "unexpected tgtype value: %d" -msgstr "неочікуване Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ tgtype: %d" - -#: pg_dump.c:17033 -#, c-format -msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" -msgstr "неприпуÑтимий Ñ€Ñдок аргументу (%s) Ð´Ð»Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ð° \"%s\" у таблиці \"%s\"" - -#: pg_dump.c:17302 +#: pg_dump.c:18002 #, c-format msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" msgstr "помилка запиту на Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° \"%s\" Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s\": повернено неправильне чиÑло Ñ€Ñдків " -#: pg_dump.c:17455 +#: pg_dump.c:18155 #, c-format msgid "could not find referenced extension %u" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ згадане Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ %u" -#: pg_dump.c:17545 +#: pg_dump.c:18254 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "невідповідна кількіÑть конфігурацій Ñ– умов Ð´Ð»Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ" -#: pg_dump.c:17677 +#: pg_dump.c:18386 #, c-format msgid "reading dependency data" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… залежноÑті" -#: pg_dump.c:17763 +#: pg_dump.c:18472 #, c-format msgid "no referencing object %u %u" msgstr "немає об’єкту поÑÐ¸Ð»Ð°Ð½Ð½Ñ %u %u" -#: pg_dump.c:17774 +#: pg_dump.c:18483 #, c-format msgid "no referenced object %u %u" msgstr "немає поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° об'єкт %u %u" -#: pg_dump_sort.c:422 +#: pg_dump.c:18908 pg_dump.c:18946 pg_dumpall.c:2011 pg_restore.c:551 +#: pg_restore.c:597 +#, c-format +msgid "%s filter for \"%s\" is not allowed" +msgstr "фільтр %s Ð´Ð»Ñ \"%s\" не дозволений" + +#: pg_dump_sort.c:424 #, c-format msgid "invalid dumpId %d" msgstr "неприпуÑтимий dumpId %d" -#: pg_dump_sort.c:428 +#: pg_dump_sort.c:430 #, c-format msgid "invalid dependency %d" msgstr "неприпуÑтима залежніÑть %d" -#: pg_dump_sort.c:661 +#: pg_dump_sort.c:594 #, c-format msgid "could not identify dependency loop" msgstr "не вдалоÑÑ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÑƒÐ²Ð°Ñ‚Ð¸ цикл залежноÑті" -#: pg_dump_sort.c:1232 +#: pg_dump_sort.c:1209 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" @@ -2143,134 +2447,134 @@ msgstr[1] "у наÑтупних таблицÑÑ… зациклені зовні msgstr[2] "у наÑтупних таблицÑÑ… зациклені зовнішні ключі:" msgstr[3] "у наÑтупних таблицÑÑ… зациклені зовнішні ключі:" -#: pg_dump_sort.c:1236 pg_dump_sort.c:1256 -#, c-format -msgid " %s" -msgstr " %s" - -#: pg_dump_sort.c:1237 +#: pg_dump_sort.c:1214 #, c-format msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." msgstr "Ви не зможете відновити дамп без викориÑÑ‚Ð°Ð½Ð½Ñ --disable-triggers або тимчаÑово розірвати обмеженнÑ." -#: pg_dump_sort.c:1238 +#: pg_dump_sort.c:1215 #, c-format msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." msgstr "Можливо, викориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ð½Ð¾Ð³Ð¾ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ñ–Ñть --data-only Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð¶Ðµ уникнути цієї проблеми." -#: pg_dump_sort.c:1250 +#: pg_dump_sort.c:1227 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "не вдалоÑÑ Ð²Ð¸Ñ€Ñ–ÑˆÐ¸Ñ‚Ð¸ цикл залежноÑті Ñеред цих елементів:" -#: pg_dumpall.c:205 +#: pg_dumpall.c:231 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "програма \"%s\" потрібна Ð´Ð»Ñ %s, але не знайдена в тому ж каталозі, що й \"%s\"" -#: pg_dumpall.c:208 +#: pg_dumpall.c:234 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "програма \"%s\" знайдена Ð´Ð»Ñ \"%s\", але має відмінну верÑÑ–ÑŽ від %s" -#: pg_dumpall.c:357 +#: pg_dumpall.c:387 #, c-format msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" msgstr "параметр --exclude-database не можна викориÑтовувати разом з -g/--globals-only, -r/--roles-only або -t/--tablespaces-only" -#: pg_dumpall.c:365 +#: pg_dumpall.c:395 #, c-format msgid "options -g/--globals-only and -r/--roles-only cannot be used together" msgstr "параметри -g/--globals-only Ñ– -r/--roles-only не можна викориÑтовувати разом" -#: pg_dumpall.c:372 +#: pg_dumpall.c:402 #, c-format msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" msgstr "параметри -g/--globals-only Ñ– -t/--tablespaces-only не можна викориÑтовувати разом" -#: pg_dumpall.c:382 +#: pg_dumpall.c:412 #, c-format msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "параметри -r/--roles-only Ñ– -t/--tablespaces-only не можна викориÑтовувати разом" -#: pg_dumpall.c:444 pg_dumpall.c:1587 +#: pg_dumpall.c:474 pg_dumpall.c:1820 #, c-format msgid "could not connect to database \"%s\"" msgstr "не вдалоÑÑ Ð·Ð²'ÑзатиÑÑ Ð· базою даних \"%s\"" -#: pg_dumpall.c:456 +#: pg_dumpall.c:486 #, c-format msgid "could not connect to databases \"postgres\" or \"template1\"\n" "Please specify an alternative database." msgstr "не вдалоÑÑ Ð·Ð²'ÑзатиÑÑ Ð· базами даних \"postgres\" або \"template1\"\n" "Будь лаÑка, вкажіть альтернативну базу даних." -#: pg_dumpall.c:604 +#: pg_dumpall.c:635 #, c-format msgid "%s extracts a PostgreSQL database cluster into an SQL script file.\n\n" msgstr "%s екÑпортує клаÑтер баз даних PostgreSQL до SQL-Ñкрипту.\n\n" -#: pg_dumpall.c:606 +#: pg_dumpall.c:637 #, c-format msgid " %s [OPTION]...\n" msgstr " %s: [OPTION]...\n" -#: pg_dumpall.c:609 +#: pg_dumpall.c:640 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=FILENAME ім'Ñ Ð²Ð¸Ñ…Ñ–Ð´Ð½Ð¾Ð³Ð¾ файлу\n" -#: pg_dumpall.c:616 +#: pg_dumpall.c:647 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean очиÑтити (видалити) бази даних перед відтвореннÑм\n" -#: pg_dumpall.c:618 +#: pg_dumpall.c:649 #, c-format msgid " -g, --globals-only dump only global objects, no databases\n" msgstr " -g, --globals-only вивантажувати лише глобальні об’єкти, не бази даних\n" -#: pg_dumpall.c:619 pg_restore.c:456 +#: pg_dumpall.c:650 pg_restore.c:475 #, c-format msgid " -O, --no-owner skip restoration of object ownership\n" msgstr " -O, --no-owner пропуÑкаєтьÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ„Ð¾Ñ€Ð¼Ð¸ влаÑноÑті об’єктом\n" -#: pg_dumpall.c:620 +#: pg_dumpall.c:651 #, c-format msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" msgstr " -r, --roles-only вивантажувати лише ролі, не бази даних або табличні проÑтори\n" -#: pg_dumpall.c:622 +#: pg_dumpall.c:653 #, c-format msgid " -S, --superuser=NAME superuser user name to use in the dump\n" msgstr " -S, --superuser=NAME ім'Ñ ÑуперкориÑтувача Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ вивантажуванні\n" -#: pg_dumpall.c:623 +#: pg_dumpall.c:654 #, c-format msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" msgstr " -t, --tablespaces-only вивантажувати лише табличні проÑтори, не бази даних або ролі\n" -#: pg_dumpall.c:629 +#: pg_dumpall.c:660 #, c-format msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" msgstr " --exclude-database=PATTERN виключити бази даних, ім'Ñ Ñких відповідає PATTERN\n" -#: pg_dumpall.c:636 +#: pg_dumpall.c:662 +#, c-format +msgid " --filter=FILENAME exclude databases based on expressions in FILENAME\n" +msgstr " --filter=FILENAME виключити бази даних, на оÑнові виразів у FILENAME\n" + +#: pg_dumpall.c:668 #, c-format msgid " --no-role-passwords do not dump passwords for roles\n" msgstr " --no-role-passwords не вивантажувати паролі Ð´Ð»Ñ Ñ€Ð¾Ð»ÐµÐ¹\n" -#: pg_dumpall.c:652 +#: pg_dumpall.c:684 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=CONNSTR Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð· викориÑтаннÑм Ñ€Ñдку Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ \n" -#: pg_dumpall.c:654 +#: pg_dumpall.c:686 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAME альтернативна база даних за замовчуваннÑм\n" -#: pg_dumpall.c:661 +#: pg_dumpall.c:693 #, c-format msgid "\n" "If -f/--file is not used, then the SQL script will be written to the standard\n" @@ -2278,272 +2582,304 @@ msgid "\n" msgstr "\n" "Якщо -f/--file не викориÑтовуєтьÑÑ, тоді SQL- Ñценарій буде запиÑаний до Ñтандартного виводу.\n\n" -#: pg_dumpall.c:803 +#: pg_dumpall.c:838 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "пропущено Ñ–Ð¼â€™Ñ Ñ€Ð¾Ð»Ñ–, що починаєтьÑÑ Ð· \"pg_\" (%s)" -#: pg_dumpall.c:1018 +#. translator: %s represents a numeric role OID +#: pg_dumpall.c:1055 pg_dumpall.c:1113 pg_dumpall.c:1122 +#, c-format +msgid "found orphaned pg_auth_members entry for role %s" +msgstr "знайдено забутий Ð·Ð°Ð¿Ð¸Ñ Ð² pg_auth_members Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ– %s" + +#: pg_dumpall.c:1088 +#, c-format +msgid "could not find a legal dump ordering for memberships in role \"%s\"" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ правильний порÑдок Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ‡Ð»ÐµÐ½Ñтва в ролі \"%s\"" + +#: pg_dumpall.c:1243 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑпиÑок ACL (%s) Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\"" -#: pg_dumpall.c:1136 +#: pg_dumpall.c:1370 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ÑпиÑок ACL (%s) Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору \"%s\"" -#: pg_dumpall.c:1343 +#: pg_dumpall.c:1577 #, c-format msgid "excluding database \"%s\"" msgstr "виключаємо базу даних \"%s\"" -#: pg_dumpall.c:1347 +#: pg_dumpall.c:1581 #, c-format msgid "dumping database \"%s\"" msgstr "вивантажуємо базу даних \"%s\"" -#: pg_dumpall.c:1378 +#: pg_dumpall.c:1612 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "помилка pg_dump Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних \"%s\", Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸" -#: pg_dumpall.c:1384 +#: pg_dumpall.c:1618 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ відкрити файл виводу \"%s\": %m" -#: pg_dumpall.c:1425 +#: pg_dumpall.c:1662 #, c-format msgid "running \"%s\"" msgstr "виконуєтьÑÑ \"%s\"" -#: pg_dumpall.c:1630 +#: pg_dumpall.c:1863 #, c-format msgid "could not get server version" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ верÑÑ–ÑŽ Ñерверу" -#: pg_dumpall.c:1633 +#: pg_dumpall.c:1866 #, c-format msgid "could not parse server version \"%s\"" msgstr "не вдалоÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ верÑÑ–ÑŽ Ñерверу \"%s\"" -#: pg_dumpall.c:1703 pg_dumpall.c:1726 +#: pg_dumpall.c:1936 pg_dumpall.c:1959 #, c-format msgid "executing %s" msgstr "виконуєтьÑÑ %s" -#: pg_restore.c:313 +#: pg_dumpall.c:2031 +msgid "unsupported filter object" +msgstr "непідтримуваний об'єкт фільтру" + +#: pg_restore.c:329 #, c-format msgid "one of -d/--dbname and -f/--file must be specified" msgstr "необхідно вказати один з -d/--dbname або -f/--file" -#: pg_restore.c:320 +#: pg_restore.c:336 #, c-format msgid "options -d/--dbname and -f/--file cannot be used together" msgstr "параметри -d/--dbname Ñ– -f/--file не можуть викориÑтовуватиÑÑŒ разом" -#: pg_restore.c:338 +#: pg_restore.c:350 +#, c-format +msgid "options -1/--single-transaction and --transaction-size cannot be used together" +msgstr "параметри -1/--single-transaction Ñ– --transaction-size не можуть викориÑтовуватиÑÑŒ разом" + +#: pg_restore.c:357 #, c-format msgid "options -C/--create and -1/--single-transaction cannot be used together" msgstr "параметри -C/--create Ñ– -1/--single-transaction не можуть викориÑтовуватиÑÑŒ разом" -#: pg_restore.c:342 +#: pg_restore.c:361 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "параметр --single-transaction допуÑкаєтьÑÑ Ð»Ð¸ÑˆÐµ з одним завданнÑм" -#: pg_restore.c:380 +#: pg_restore.c:399 #, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "нерозпізнаний формат архіву \"%s\"; будь лаÑка, вкажіть \"c\", \"d\" або \"t\"" -#: pg_restore.c:419 +#: pg_restore.c:438 #, c-format msgid "errors ignored on restore: %d" msgstr "при відновленні проігноровано помилок: %d" -#: pg_restore.c:432 +#: pg_restore.c:451 #, c-format msgid "%s restores a PostgreSQL database from an archive created by pg_dump.\n\n" msgstr "%s відновлює базу даних PostgreSQL з архіву, Ñтвореного командою pg_dump.\n\n" -#: pg_restore.c:434 +#: pg_restore.c:453 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [OPTION]... [FILE]\n" -#: pg_restore.c:437 +#: pg_restore.c:456 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr " -d, --dbname=NAME підключитиÑÑŒ до вказаної бази даних\n" -#: pg_restore.c:438 +#: pg_restore.c:457 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr " -f, --file=FILENAME ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ виводу (- Ð´Ð»Ñ stdout)\n" -#: pg_restore.c:439 +#: pg_restore.c:458 #, c-format msgid " -F, --format=c|d|t backup file format (should be automatic)\n" msgstr " -F, --format=c|d|t формат файлу резервної копії (розпізнаєтьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾)\n" -#: pg_restore.c:440 +#: pg_restore.c:459 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list вивеÑти короткий зміÑÑ‚ архіву\n" -#: pg_restore.c:441 +#: pg_restore.c:460 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose детальний режим\n" -#: pg_restore.c:442 +#: pg_restore.c:461 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n" -#: pg_restore.c:443 +#: pg_restore.c:462 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: pg_restore.c:445 +#: pg_restore.c:464 #, c-format msgid "\n" "Options controlling the restore:\n" msgstr "\n" "Параметри, що керують відновленнÑм:\n" -#: pg_restore.c:446 +#: pg_restore.c:465 #, c-format msgid " -a, --data-only restore only the data, no schema\n" msgstr " -a, --data-only відновити лише дані, без Ñхеми\n" -#: pg_restore.c:448 +#: pg_restore.c:467 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create Ñтворити цільову базу даних\n" -#: pg_restore.c:449 +#: pg_restore.c:468 #, c-format msgid " -e, --exit-on-error exit on error, default is to continue\n" msgstr " -e, --exit-on-error вийти при помилці, продовжувати за замовчуваннÑм\n" -#: pg_restore.c:450 +#: pg_restore.c:469 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NAME відновити вказаний індекÑ\n" -#: pg_restore.c:451 +#: pg_restore.c:470 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" msgstr " -j, --jobs=NUM щоб виконати відновленнÑ, викориÑтайте ці паралельні завданнÑ\n" -#: pg_restore.c:452 +#: pg_restore.c:471 #, c-format msgid " -L, --use-list=FILENAME use table of contents from this file for\n" " selecting/ordering output\n" msgstr " -L, --use-list=FILENAME викориÑтовувати зміÑÑ‚ з цього файлу Ð´Ð»Ñ \n" " вибору/упорÑÐ´ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…\n" -#: pg_restore.c:454 +#: pg_restore.c:473 #, c-format msgid " -n, --schema=NAME restore only objects in this schema\n" msgstr " -n, --schema=NAME відновити об'єкти лише в цій Ñхемі\n" -#: pg_restore.c:455 +#: pg_restore.c:474 #, c-format msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" msgstr " -N, --exclude-schema=NAME не відновлювати об'єкти в цій Ñхемі\n" -#: pg_restore.c:457 +#: pg_restore.c:476 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=NAME(args) відновити вказану функцію\n" -#: pg_restore.c:458 +#: pg_restore.c:477 #, c-format msgid " -s, --schema-only restore only the schema, no data\n" msgstr " -s, --schema-only відновити лише Ñхему, без даних\n" -#: pg_restore.c:459 +#: pg_restore.c:478 #, c-format msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" msgstr " -S, --superuser=NAME ім'Ñ ÑуперкориÑтувача Ð´Ð»Ñ Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñ–Ð²\n" -#: pg_restore.c:460 +#: pg_restore.c:479 #, c-format msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" msgstr " -t, --table=NAME відновити вказане Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ (таблицю, Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ñ– Ñ‚. д.)\n" -#: pg_restore.c:461 +#: pg_restore.c:480 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NAME відновити вказаний тригер\n" -#: pg_restore.c:462 +#: pg_restore.c:481 #, c-format msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" msgstr " -x, --no-privileges пропуÑтити Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð² доÑтупу (grant/revoke)\n" -#: pg_restore.c:463 +#: pg_restore.c:482 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction відновити в одній транзакції\n" -#: pg_restore.c:465 +#: pg_restore.c:484 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security активувати захиÑÑ‚ на рівні Ñ€Ñдків\n" -#: pg_restore.c:467 +#: pg_restore.c:485 +#, c-format +msgid " --filter=FILENAME restore or skip objects based on expressions\n" +" in FILENAME\n" +msgstr " --filter=FILENAME відновлювати або пропуÑкати об'єкти на оÑнові виразів\n" +" у FILENAME\n" + +#: pg_restore.c:488 #, c-format msgid " --no-comments do not restore comments\n" msgstr " --no-comments не відновлювати коментарі\n" -#: pg_restore.c:468 +#: pg_restore.c:489 #, c-format msgid " --no-data-for-failed-tables do not restore data of tables that could not be\n" " created\n" msgstr " --no-data-for-failed-tables не відновлювати дані таблиць, Ñкі не вдалоÑÑ Ñтворити\n" -#: pg_restore.c:470 +#: pg_restore.c:491 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications не відновлювати публікації \n" -#: pg_restore.c:471 +#: pg_restore.c:492 #, c-format msgid " --no-security-labels do not restore security labels\n" msgstr " --no-security-labels не відновлювати мітки безпеки \n" -#: pg_restore.c:472 +#: pg_restore.c:493 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions не відновлювати підпиÑки\n" -#: pg_restore.c:473 +#: pg_restore.c:494 #, c-format msgid " --no-table-access-method do not restore table access methods\n" msgstr " --no-table-access-method не відновлювати табличний метод доÑтупу\n" -#: pg_restore.c:474 +#: pg_restore.c:495 #, c-format msgid " --no-tablespaces do not restore tablespace assignments\n" msgstr " --no-tablespaces не відновлювати Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору\n" -#: pg_restore.c:475 +#: pg_restore.c:496 #, c-format msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" msgstr " --section=SECTION відновлювати названий розділ (pre-data, data або post-data)\n" -#: pg_restore.c:488 +#: pg_restore.c:499 +#, c-format +msgid " --transaction-size=N commit after every N objects\n" +msgstr " --transaction-size=N затверджувати транзакцію піÑÐ»Ñ N об'єктів\n" + +#: pg_restore.c:510 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=ROLENAME виконати SET ROLE перед відновленнÑм\n" -#: pg_restore.c:490 +#: pg_restore.c:512 #, c-format msgid "\n" "The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n" @@ -2552,7 +2888,7 @@ msgstr "\n" "Параметри -I, -n, -N, -P, -t, -T, Ñ– --section можна групувати Ñ– вказувати\n" "декілька разів Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ декількох об'єктів.\n" -#: pg_restore.c:493 +#: pg_restore.c:515 #, c-format msgid "\n" "If no input file name is supplied, then standard input is used.\n\n" diff --git a/src/bin/pg_dump/po/zh_TW.po b/src/bin/pg_dump/po/zh_TW.po new file mode 100644 index 0000000000000..03726f1d93257 --- /dev/null +++ b/src/bin/pg_dump/po/zh_TW.po @@ -0,0 +1,3300 @@ +# Traditional Chinese message translation file for pg_dump +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_dump (PostgreSQL) package. +# 2004-12-13 Zhenbang Wei +# +msgid "" +msgstr "" +"Project-Id-Version: pg_dump (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-07 05:51+0000\n" +"PO-Revision-Date: 2023-11-06 08:49+0800\n" +"Last-Translator: Zhenbang Wei \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.4.1\n" + +# libpq/be-secure.c:294 libpq/be-secure.c:387 +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "錯誤: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "警告: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "詳細內容: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "æç¤º: " + +#: ../../common/compression.c:132 ../../common/compression.c:141 +#: ../../common/compression.c:150 compress_gzip.c:413 compress_gzip.c:420 +#: compress_io.c:109 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25 +#: compress_zstd.c:31 +#, c-format +msgid "this build does not support compression with %s" +msgstr "æ­¤ç‰ˆæœ¬ä¸æ”¯æ´ä½¿ç”¨ %s 進行壓縮" + +#: ../../common/compression.c:205 +msgid "found empty string where a compression option was expected" +msgstr "åœ¨é æœŸå£“縮é¸é …的地方發ç¾ç©ºå­—串" + +#: ../../common/compression.c:244 +#, c-format +msgid "unrecognized compression option: \"%s\"" +msgstr "無法辨識的壓縮é¸é …: %s" + +# bootstrap/bootstrap.c:304 postmaster/postmaster.c:500 tcop/postgres.c:2507 +#: ../../common/compression.c:283 +#, c-format +msgid "compression option \"%s\" requires a value" +msgstr "壓縮é¸é … \"%s\" éœ€è¦æä¾›æ•¸å€¼" + +# commands/define.c:233 +#: ../../common/compression.c:292 +#, c-format +msgid "value for compression option \"%s\" must be an integer" +msgstr "壓縮é¸é … \"%s\" 的數值必須是整數" + +# commands/define.c:233 +#: ../../common/compression.c:331 +#, c-format +msgid "value for compression option \"%s\" must be a Boolean value" +msgstr "壓縮é¸é … \"%s\" 的數值必須是布林值" + +# commands/indexcmds.c:623 +#: ../../common/compression.c:379 +#, c-format +msgid "compression algorithm \"%s\" does not accept a compression level" +msgstr "壓縮演算法 \"%s\" 䏿ޥå—壓縮等級" + +#: ../../common/compression.c:386 +#, c-format +msgid "compression algorithm \"%s\" expects a compression level between %d and %d (default at %d)" +msgstr "壓縮演算法 \"%s\" é æœŸçš„壓縮等級應在 %d 到 %d 之間(é è¨­å€¼ %d)" + +# commands/indexcmds.c:623 +#: ../../common/compression.c:397 +#, c-format +msgid "compression algorithm \"%s\" does not accept a worker count" +msgstr "壓縮演算法 \"%s\" 䏿”¯æ´å·¥ä½œåŸ·è¡Œç·’數目設定" + +# commands/indexcmds.c:224 +#: ../../common/compression.c:408 +#, c-format +msgid "compression algorithm \"%s\" does not support long-distance mode" +msgstr "壓縮演算法 \"%s\" 䏿”¯æ´é•·è·é›¢æ¨¡å¼" + +# command.c:122 +#: ../../common/exec.c:172 +#, c-format +msgid "invalid binary \"%s\": %m" +msgstr "無效的執行檔 \"%s\": %m" + +# command.c:1103 +#: ../../common/exec.c:215 +#, c-format +msgid "could not read binary \"%s\": %m" +msgstr "無法讀å–執行檔 \"%s\": %m" + +#: ../../common/exec.c:223 +#, c-format +msgid "could not find a \"%s\" to execute" +msgstr "找ä¸åˆ°å¯åŸ·è¡Œçš„ \"%s\"" + +# utils/error/elog.c:1128 +#: ../../common/exec.c:250 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "無法將路徑 \"%s\" è§£æžç‚ºçµ•å°è·¯å¾‘: %m" + +# fe-misc.c:991 +#: ../../common/exec.c:412 parallel.c:1609 +#, c-format +msgid "%s() failed: %m" +msgstr "%s() 失敗: %m" + +# commands/sequence.c:798 executor/execGrouping.c:328 +# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43 +# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006 +# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527 +# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623 +# postmaster/postmaster.c:755 postmaster/postmaster.c:1625 +# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139 +# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766 +# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138 +# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297 +# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73 +# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191 +# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164 +# utils/cache/relcache.c:178 utils/cache/relcache.c:1130 +# utils/cache/typcache.c:165 utils/cache/typcache.c:487 +# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532 +# utils/init/miscinit.c:213 utils/init/miscinit.c:234 +# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911 +# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503 +# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75 +#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +msgid "out of memory" +msgstr "記憶體ä¸è¶³" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "記憶體ä¸è¶³\n" + +# common.c:78 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "無法複製 null 指標(內部錯誤)\n" + +#: ../../common/wait_error.c:55 +#, c-format +msgid "command not executable" +msgstr "無法執行的命令" + +#: ../../common/wait_error.c:59 +#, c-format +msgid "command not found" +msgstr "找ä¸åˆ°å‘½ä»¤" + +#: ../../common/wait_error.c:64 +#, c-format +msgid "child process exited with exit code %d" +msgstr "å­è¡Œç¨‹çµæŸï¼ŒçµæŸç¢¼ %d" + +#: ../../common/wait_error.c:72 +#, c-format +msgid "child process was terminated by exception 0x%X" +msgstr "å­è¡Œç¨‹å› ç•°å¸¸ 0x%X è€Œåœæ­¢" + +#: ../../common/wait_error.c:76 +#, c-format +msgid "child process was terminated by signal %d: %s" +msgstr "å­è¡Œç¨‹å› ä¿¡è™Ÿ %d è€Œåœæ­¢: %s" + +#: ../../common/wait_error.c:82 +#, c-format +msgid "child process exited with unrecognized status %d" +msgstr "å­è¡Œç¨‹å› ä¸æ˜Žç‹€æ…‹ %d è€Œåœæ­¢" + +# utils/adt/formatting.c:2044 +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "é¸é … %2$s 的值 \"%1$s\" 無效" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s å¿…é ˆåœ¨ç¯„åœ %d..%d å…§" + +#: common.c:132 +#, c-format +msgid "reading extensions" +msgstr "è®€å–æ“´å……模組" + +#: common.c:135 +#, c-format +msgid "identifying extension members" +msgstr "識別擴充模組æˆå“¡" + +#: common.c:138 +#, c-format +msgid "reading schemas" +msgstr "è®€å– schema" + +#: common.c:147 +#, c-format +msgid "reading user-defined tables" +msgstr "讀å–使用者自定資料表" + +#: common.c:152 +#, c-format +msgid "reading user-defined functions" +msgstr "讀å–使用者自定函數" + +#: common.c:156 +#, c-format +msgid "reading user-defined types" +msgstr "讀å–使用者自定資料型別" + +#: common.c:160 +#, c-format +msgid "reading procedural languages" +msgstr "讀å–程åºèªžè¨€" + +#: common.c:163 +#, c-format +msgid "reading user-defined aggregate functions" +msgstr "讀å–使用者自定èšåˆå‡½æ•¸" + +#: common.c:166 +#, c-format +msgid "reading user-defined operators" +msgstr "讀å–使用者自定æ“作符" + +#: common.c:169 +#, c-format +msgid "reading user-defined access methods" +msgstr "讀å–ä½¿ç”¨è€…è‡ªå®šå­˜å–æ–¹å¼" + +#: common.c:172 +#, c-format +msgid "reading user-defined operator classes" +msgstr "讀å–使用者自定æ“作符類別" + +#: common.c:175 +#, c-format +msgid "reading user-defined operator families" +msgstr "讀å–使用者自定æ“作符æ—群" + +#: common.c:178 +#, c-format +msgid "reading user-defined text search parsers" +msgstr "讀å–使用者自定文字æœå°‹è§£æžå™¨" + +#: common.c:181 +#, c-format +msgid "reading user-defined text search templates" +msgstr "讀å–使用者自定文字æœå°‹ç¯„本" + +#: common.c:184 +#, c-format +msgid "reading user-defined text search dictionaries" +msgstr "讀å–使用者自定文字æœå°‹å­—å…¸" + +# sql_help.h:129 +#: common.c:187 +#, c-format +msgid "reading user-defined text search configurations" +msgstr "讀å–使用者自定文字æœå°‹çµ„æ…‹" + +#: common.c:190 +#, c-format +msgid "reading user-defined foreign-data wrappers" +msgstr "讀å–使用者自定外部資料å°è£ç¨‹å¼" + +#: common.c:193 +#, c-format +msgid "reading user-defined foreign servers" +msgstr "讀å–使用者自定外部伺æœå™¨" + +#: common.c:196 +#, c-format +msgid "reading default privileges" +msgstr "讀å–é è¨­æ¬Šé™" + +#: common.c:199 +#, c-format +msgid "reading user-defined collations" +msgstr "讀å–使用者自定定åº" + +#: common.c:202 +#, c-format +msgid "reading user-defined conversions" +msgstr "讀å–使用者自定轉æ›è¦å‰‡" + +#: common.c:205 +#, c-format +msgid "reading type casts" +msgstr "讀å–轉型" + +#: common.c:208 +#, c-format +msgid "reading transforms" +msgstr "è®€å– transform" + +#: common.c:211 +#, c-format +msgid "reading table inheritance information" +msgstr "讀å–資料表繼承資訊" + +#: common.c:214 +#, c-format +msgid "reading event triggers" +msgstr "讀å–事件觸發器" + +#: common.c:218 +#, c-format +msgid "finding extension tables" +msgstr "尋找擴充模組資料表" + +#: common.c:222 +#, c-format +msgid "finding inheritance relationships" +msgstr "尋找繼承關係" + +#: common.c:225 +#, c-format +msgid "reading column info for interesting tables" +msgstr "è®€å–æ‰€é—œæ³¨çš„資料表欄ä½è³‡è¨Š" + +#: common.c:228 +#, c-format +msgid "flagging inherited columns in subtables" +msgstr "在å­è³‡æ–™è¡¨ä¸­æ¨™ç¤ºç¹¼æ‰¿çš„æ¬„ä½" + +#: common.c:231 +#, c-format +msgid "reading partitioning data" +msgstr "讀å–分å€è³‡æ–™" + +#: common.c:234 +#, c-format +msgid "reading indexes" +msgstr "讀å–索引" + +#: common.c:237 +#, c-format +msgid "flagging indexes in partitioned tables" +msgstr "標示分å€è³‡æ–™è¡¨ä¸­çš„索引" + +#: common.c:240 +#, c-format +msgid "reading extended statistics" +msgstr "è®€å–æ“´å±•統計資料" + +#: common.c:243 +#, c-format +msgid "reading constraints" +msgstr "讀å–ç´„æŸæ¢ä»¶" + +#: common.c:246 +#, c-format +msgid "reading triggers" +msgstr "讀å–觸發器" + +#: common.c:249 +#, c-format +msgid "reading rewrite rules" +msgstr "讀å–é‡å¯«è¦å‰‡" + +#: common.c:252 +#, c-format +msgid "reading policies" +msgstr "è®€å–æ”¿ç­–" + +#: common.c:255 +#, c-format +msgid "reading publications" +msgstr "讀å–發布" + +#: common.c:258 +#, c-format +msgid "reading publication membership of tables" +msgstr "讀å–資料表的發布æˆå“¡" + +#: common.c:261 +#, c-format +msgid "reading publication membership of schemas" +msgstr "è®€å– schema 的發布æˆå“¡" + +#: common.c:264 +#, c-format +msgid "reading subscriptions" +msgstr "讀å–訂閱" + +#: common.c:327 +#, c-format +msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" +msgstr "未通éŽå®Œæ•´æ€§æª¢æŸ¥ï¼Œæ‰¾ä¸åˆ°è³‡æ–™è¡¨ \"%2$s\"(OID %3$u)的父 OID %1$u" + +#: common.c:369 +#, c-format +msgid "invalid number of parents %d for table \"%s\"" +msgstr "" + +#: common.c:1049 +#, c-format +msgid "could not parse numeric array \"%s\": too many numbers" +msgstr "ç„¡æ³•è§£æžæ•¸å­—陣列 \"%s\": 數字éŽå¤š" + +#: common.c:1061 +#, c-format +msgid "could not parse numeric array \"%s\": invalid character in number" +msgstr "ç„¡æ³•è§£æžæ•¸å­—陣列\"%s\": 數字中有無效字元" + +#: compress_gzip.c:69 compress_gzip.c:183 +#, c-format +msgid "could not initialize compression library: %s" +msgstr "無法åˆå§‹åŒ–壓縮程å¼åº«: %s" + +#: compress_gzip.c:93 +#, c-format +msgid "could not close compression stream: %s" +msgstr "無法關閉壓縮串æµ: %s" + +#: compress_gzip.c:113 compress_lz4.c:227 compress_zstd.c:109 +#, c-format +msgid "could not compress data: %s" +msgstr "無法壓縮資料: %s" + +#: compress_gzip.c:199 compress_gzip.c:214 +#, c-format +msgid "could not uncompress data: %s" +msgstr "無法解壓縮資料: %s" + +#: compress_gzip.c:221 +#, c-format +msgid "could not close compression library: %s" +msgstr "無法關閉壓縮程å¼åº«: %s" + +# input.c:210 +#: compress_gzip.c:266 compress_gzip.c:295 compress_lz4.c:608 +#: compress_lz4.c:628 compress_lz4.c:647 compress_none.c:97 compress_none.c:140 +#, c-format +msgid "could not read from input file: %s" +msgstr "無法從輸入檔讀å–: %s" + +# input.c:210 +#: compress_gzip.c:297 compress_lz4.c:630 compress_none.c:142 +#: compress_zstd.c:371 pg_backup_custom.c:653 pg_backup_directory.c:558 +#: pg_backup_tar.c:725 pg_backup_tar.c:748 +#, c-format +msgid "could not read from input file: end of file" +msgstr "無法從輸入檔讀å–: æª”æ¡ˆçµæŸ" + +# libpq/be-secure.c:649 +#: compress_lz4.c:157 +#, c-format +msgid "could not create LZ4 decompression context: %s" +msgstr "無法建立 LZ4 解壓縮內容: %s" + +#: compress_lz4.c:180 +#, c-format +msgid "could not decompress: %s" +msgstr "無法解壓縮: %s" + +#: compress_lz4.c:193 +#, c-format +msgid "could not free LZ4 decompression context: %s" +msgstr "無法釋放 LZ4 解壓縮 context: %s" + +#: compress_lz4.c:259 compress_lz4.c:266 compress_lz4.c:680 compress_lz4.c:690 +#, c-format +msgid "could not end compression: %s" +msgstr "ç„¡æ³•çµæŸå£“縮: %s" + +#: compress_lz4.c:301 +#, c-format +msgid "could not initialize LZ4 compression: %s" +msgstr "無法åˆå§‹åŒ– LZ4 壓縮: %s" + +#: compress_lz4.c:697 +#, c-format +msgid "could not end decompression: %s" +msgstr "ç„¡æ³•çµæŸè§£å£“縮: %s" + +#: compress_zstd.c:66 +#, c-format +msgid "could not set compression parameter \"%s\": %s" +msgstr "ç„¡æ³•è¨­å®šå£“ç¸®åƒæ•¸ \"%s\": %s" + +#: compress_zstd.c:78 compress_zstd.c:231 compress_zstd.c:490 +#: compress_zstd.c:498 +#, c-format +msgid "could not initialize compression library" +msgstr "無法åˆå§‹åŒ–壓縮程å¼åº«" + +#: compress_zstd.c:194 compress_zstd.c:308 +#, c-format +msgid "could not decompress data: %s" +msgstr "無法解壓縮資料: %s" + +# input.c:210 +#: compress_zstd.c:373 pg_backup_custom.c:655 +#, c-format +msgid "could not read from input file: %m" +msgstr "無法從輸入檔讀å–: %m" + +#: compress_zstd.c:501 +#, c-format +msgid "unhandled mode \"%s\"" +msgstr "未處ç†çš„æ¨¡å¼ \"%s\"" + +#: parallel.c:251 +#, c-format +msgid "%s() failed: error code %d" +msgstr "%s() 失敗: 錯誤碼 %d" + +# access/transam/xlog.c:3132 +#: parallel.c:959 +#, c-format +msgid "could not create communication channels: %m" +msgstr "無法建立通訊通é“: %m" + +# fe-connect.c:1197 +#: parallel.c:1016 +#, c-format +msgid "could not create worker process: %m" +msgstr "無法建立工作行程: %m" + +# access/transam/xlog.c:3720 +#: parallel.c:1146 +#, c-format +msgid "unrecognized command received from leader: \"%s\"" +msgstr "從領導者接收到無法識別的命令: \"%s\"" + +# libpq/hba.c:1437 +#: parallel.c:1189 parallel.c:1427 +#, c-format +msgid "invalid message received from worker: \"%s\"" +msgstr "從工作行程接收到無效的訊æ¯:\"%s\"" + +#: parallel.c:1321 +#, c-format +msgid "" +"could not obtain lock on relation \"%s\"\n" +"This usually means that someone requested an ACCESS EXCLUSIVE lock on the table after the pg_dump parent process had gotten the initial ACCESS SHARE lock on the table." +msgstr "" +"無法在關è¯\"%s\" 上ç²å¾—鎖定\n" +"這通常表示在 pg_dump 的父行程ç²å¾—資料表的åˆå§‹ ACCESS SHARE éŽ–å®šä¹‹å¾Œï¼Œæœ‰äººè¦æ±‚å°è©²è³‡æ–™è¡¨é€²è¡Œ ACCESS EXCLUSIVE 鎖定。" + +#: parallel.c:1410 +#, c-format +msgid "a worker process died unexpectedly" +msgstr "工作行程æ„外終止" + +# access/transam/xlog.c:3143 access/transam/xlog.c:3330 +#: parallel.c:1532 parallel.c:1650 +#, c-format +msgid "could not write to the communication channel: %m" +msgstr "無法寫入到通訊通é“: %m" + +# port/pg_sema.c:117 port/sysv_sema.c:117 +#: parallel.c:1734 +#, c-format +msgid "pgpipe: could not create socket: error code %d" +msgstr "pgpipe: 無法建立 socket: 錯誤碼 %d" + +# libpq/be-secure.c:789 +#: parallel.c:1745 +#, c-format +msgid "pgpipe: could not bind: error code %d" +msgstr "pgpipe: ç¶å®šå¤±æ•—: 錯誤碼 %d" + +# port/win32/security.c:39 +#: parallel.c:1752 +#, c-format +msgid "pgpipe: could not listen: error code %d" +msgstr "pgpipe: 無法監è½: 錯誤碼 %d" + +#: parallel.c:1759 +#, c-format +msgid "pgpipe: %s() failed: error code %d" +msgstr "pgpipe: %s() 失敗: 錯誤碼 %d" + +# port/win32/signal.c:239 +#: parallel.c:1770 +#, c-format +msgid "pgpipe: could not create second socket: error code %d" +msgstr "pgpipe: 無法建立第二個 socket: 錯誤碼 %d" + +# port/win32/signal.c:239 +#: parallel.c:1779 +#, c-format +msgid "pgpipe: could not connect socket: error code %d" +msgstr "pgpipe: 無法連線 socket: 錯誤碼 %d" + +# libpq/be-secure.c:807 +#: parallel.c:1788 +#, c-format +msgid "pgpipe: could not accept connection: error code %d" +msgstr "pgpipe: 無法接å—連線: 錯誤碼 %d" + +#: pg_backup_archiver.c:276 pg_backup_archiver.c:1603 +#, c-format +msgid "could not close output file: %m" +msgstr "無法關閉輸出檔案: %m" + +#: pg_backup_archiver.c:320 pg_backup_archiver.c:324 +#, c-format +msgid "archive items not in correct section order" +msgstr "å°å­˜é …ç›®æœªæŒ‰æ­£ç¢ºçš„å€æ®µé †åºæŽ’列" + +# utils/adt/rowtypes.c:178 utils/adt/rowtypes.c:186 +#: pg_backup_archiver.c:330 +#, c-format +msgid "unexpected section code %d" +msgstr "éžé æœŸçš„倿®µç¢¼ %d" + +# input.c:213 +#: pg_backup_archiver.c:367 +#, c-format +msgid "parallel restore is not supported with this archive file format" +msgstr "å°å­˜æª”案格å¼ä¸æ”¯æ´ä¸¦è¡Œé‚„原" + +#: pg_backup_archiver.c:371 +#, c-format +msgid "parallel restore is not supported with archives made by pre-8.0 pg_dump" +msgstr "pg_dump 8.0ç‰ˆä»¥å‰æ‰€å»ºç«‹çš„å°å­˜æª”䏿”¯æ´ä¸¦è¡Œé‚„原" + +#: pg_backup_archiver.c:392 +#, c-format +msgid "cannot restore from compressed archive (%s)" +msgstr "無法從壓縮å°å­˜æª”案(%s)還原" + +#: pg_backup_archiver.c:412 +#, c-format +msgid "connecting to database for restore" +msgstr "連線至資料庫以進行還原" + +#: pg_backup_archiver.c:414 +#, c-format +msgid "direct database connections are not supported in pre-1.3 archives" +msgstr "直接資料庫連線在1.3以å‰ç‰ˆæœ¬çš„å°å­˜æª”䏿”¯æ´" + +#: pg_backup_archiver.c:457 +#, c-format +msgid "implied data-only restore" +msgstr "æ„味著還原 data-only 備份" + +#: pg_backup_archiver.c:523 +#, c-format +msgid "dropping %s %s" +msgstr "刪除 %s %s" + +#: pg_backup_archiver.c:623 +#, c-format +msgid "could not find where to insert IF EXISTS in statement \"%s\"" +msgstr "ç„¡æ³•æ‰¾åˆ°åœ¨é™³è¿°å¼ \"%s\" 中æ’å…¥ IF EXISTS çš„ä½ç½®" + +#: pg_backup_archiver.c:778 pg_backup_archiver.c:780 +#, c-format +msgid "warning from original dump file: %s" +msgstr "來自原始備份檔的警告: %s" + +#: pg_backup_archiver.c:795 +#, c-format +msgid "creating %s \"%s.%s\"" +msgstr "建立 %s \"%s.%s\"" + +#: pg_backup_archiver.c:798 +#, c-format +msgid "creating %s \"%s\"" +msgstr "建立 %s \"%s\"" + +#: pg_backup_archiver.c:848 +#, c-format +msgid "connecting to new database \"%s\"" +msgstr "連線至新資料庫 \"%s\"" + +#: pg_backup_archiver.c:875 +#, c-format +msgid "processing %s" +msgstr "è™•ç† %s" + +#: pg_backup_archiver.c:897 +#, c-format +msgid "processing data for table \"%s.%s\"" +msgstr "處ç†è³‡æ–™è¡¨ \"%s.%s\" 的資料" + +#: pg_backup_archiver.c:967 +#, c-format +msgid "executing %s %s" +msgstr "執行 %s %s" + +#: pg_backup_archiver.c:1008 +#, c-format +msgid "disabling triggers for %s" +msgstr "åœç”¨ %s 的觸發器" + +#: pg_backup_archiver.c:1034 +#, c-format +msgid "enabling triggers for %s" +msgstr "啟動 %s 的觸發器" + +#: pg_backup_archiver.c:1099 +#, c-format +msgid "internal error -- WriteData cannot be called outside the context of a DataDumper routine" +msgstr "內部錯誤 - WriteData ä¸å¯åœ¨ DataDumper 程åºçš„ context 之外呼å«" + +#: pg_backup_archiver.c:1287 +#, c-format +msgid "large-object output not supported in chosen format" +msgstr "æ‰€é¸æ ¼å¼ä¸æ”¯æ´å¤§ç‰©ä»¶çš„輸出" + +#: pg_backup_archiver.c:1345 +#, c-format +msgid "restored %d large object" +msgid_plural "restored %d large objects" +msgstr[0] "已還原 %d 個大物件" + +#: pg_backup_archiver.c:1366 pg_backup_tar.c:668 +#, c-format +msgid "restoring large object with OID %u" +msgstr "還原 OID 為 %u 的大物件" + +#: pg_backup_archiver.c:1378 +#, c-format +msgid "could not create large object %u: %s" +msgstr "無法建立大物件 %u: %s" + +# fe-lobj.c:410 +# fe-lobj.c:495 +#: pg_backup_archiver.c:1383 pg_dump.c:3718 +#, c-format +msgid "could not open large object %u: %s" +msgstr "無法開啟大型物件 %u: %s" + +# fe-lobj.c:410 +# fe-lobj.c:495 +#: pg_backup_archiver.c:1439 +#, c-format +msgid "could not open TOC file \"%s\": %m" +msgstr "無法開啟 TOC 檔 \"%s\": %m" + +#: pg_backup_archiver.c:1467 +#, c-format +msgid "line ignored: %s" +msgstr "忽略行: %s" + +#: pg_backup_archiver.c:1474 +#, c-format +msgid "could not find entry for ID %d" +msgstr "找ä¸åˆ° ID 為 %d 的項目" + +#: pg_backup_archiver.c:1497 pg_backup_directory.c:221 +#: pg_backup_directory.c:606 +#, c-format +msgid "could not close TOC file: %m" +msgstr "無法關閉 TOC 檔: %m" + +#: pg_backup_archiver.c:1584 pg_backup_custom.c:156 pg_backup_directory.c:332 +#: pg_backup_directory.c:593 pg_backup_directory.c:658 +#: pg_backup_directory.c:676 pg_dumpall.c:501 +#, c-format +msgid "could not open output file \"%s\": %m" +msgstr "無法開啟輸出檔 \"%s\": %m" + +#: pg_backup_archiver.c:1586 pg_backup_custom.c:162 +#, c-format +msgid "could not open output file: %m" +msgstr "無法開啟輸出檔: %m" + +#: pg_backup_archiver.c:1669 +#, c-format +msgid "wrote %zu byte of large object data (result = %d)" +msgid_plural "wrote %zu bytes of large object data (result = %d)" +msgstr[0] "已寫入 %zu ä½å…ƒçµ„的大物件資料(çµæžœ = %d)" + +#: pg_backup_archiver.c:1675 +#, c-format +msgid "could not write to large object: %s" +msgstr "無法寫入大物件: %s" + +#: pg_backup_archiver.c:1765 +#, c-format +msgid "while INITIALIZING:" +msgstr "ç•¶ INITIALIZING:" + +#: pg_backup_archiver.c:1770 +#, c-format +msgid "while PROCESSING TOC:" +msgstr "ç•¶ PROCESSING TOC:" + +#: pg_backup_archiver.c:1775 +#, c-format +msgid "while FINALIZING:" +msgstr "ç•¶ FINALIZING:" + +#: pg_backup_archiver.c:1780 +#, c-format +msgid "from TOC entry %d; %u %u %s %s %s" +msgstr "從 TOC é …ç›® %d; %u %u %s %s %s" + +#: pg_backup_archiver.c:1856 +#, c-format +msgid "bad dumpId" +msgstr "䏿­£ç¢ºçš„ dumpId" + +#: pg_backup_archiver.c:1877 +#, c-format +msgid "bad table dumpId for TABLE DATA item" +msgstr "TABLE DATA 項目的資料表 dumpId 䏿­£ç¢º" + +#: pg_backup_archiver.c:1969 +#, c-format +msgid "unexpected data offset flag %d" +msgstr "éžé æœŸçš„資料ä½ç§»æ¨™è¨˜ %d" + +#: pg_backup_archiver.c:1982 +#, c-format +msgid "file offset in dump file is too large" +msgstr "備份檔中的檔案ä½ç§»éŽå¤§" + +# utils/mb/encnames.c:445 +#: pg_backup_archiver.c:2093 +#, c-format +msgid "directory name too long: \"%s\"" +msgstr "目錄å稱éŽé•·: \"%s\"" + +#: pg_backup_archiver.c:2143 +#, c-format +msgid "directory \"%s\" does not appear to be a valid archive (\"toc.dat\" does not exist)" +msgstr "目錄 \"%s\" ä¼¼ä¹Žä¸æ˜¯æœ‰æ•ˆçš„å°å­˜æª”(\"toc.dat\" ä¸å­˜åœ¨)" + +#: pg_backup_archiver.c:2151 pg_backup_custom.c:173 pg_backup_custom.c:816 +#: pg_backup_directory.c:206 pg_backup_directory.c:395 +#, c-format +msgid "could not open input file \"%s\": %m" +msgstr "無法開啟輸入檔 \"%s\": %m" + +#: pg_backup_archiver.c:2158 pg_backup_custom.c:179 +#, c-format +msgid "could not open input file: %m" +msgstr "無法開啟輸入檔: %m" + +#: pg_backup_archiver.c:2164 +#, c-format +msgid "could not read input file: %m" +msgstr "無法讀å–輸入檔: %m" + +#: pg_backup_archiver.c:2166 +#, c-format +msgid "input file is too short (read %lu, expected 5)" +msgstr "輸入檔éŽçŸ­(è®€å– %luï¼Œé æœŸ 5)" + +#: pg_backup_archiver.c:2198 +#, c-format +msgid "input file appears to be a text format dump. Please use psql." +msgstr "輸入檔似乎是文字格å¼å‚™ä»½ï¼Œè«‹ç”¨ psql。" + +#: pg_backup_archiver.c:2204 +#, c-format +msgid "input file does not appear to be a valid archive (too short?)" +msgstr "è¼¸å…¥æª”ä¼¼ä¹Žä¸æ˜¯æœ‰æ•ˆçš„å°å­˜æª”(太短?)" + +#: pg_backup_archiver.c:2210 +#, c-format +msgid "input file does not appear to be a valid archive" +msgstr "è¼¸å…¥æª”ä¼¼ä¹Žä¸æ˜¯æœ‰æ•ˆçš„å°å­˜æª”" + +#: pg_backup_archiver.c:2219 +#, c-format +msgid "could not close input file: %m" +msgstr "無法關閉輸入檔: %m" + +# commands/copy.c:1031 +#: pg_backup_archiver.c:2297 +#, c-format +msgid "could not open stdout for appending: %m" +msgstr "無法開啟 stdout 以追加內容: %m" + +#: pg_backup_archiver.c:2342 +#, c-format +msgid "unrecognized file format \"%d\"" +msgstr "ç„¡æ³•è¾¨è­˜çš„æª”æ¡ˆæ ¼å¼ \"%d\"" + +#: pg_backup_archiver.c:2423 pg_backup_archiver.c:4448 +#, c-format +msgid "finished item %d %s %s" +msgstr "已完æˆé …ç›® %d %s %s" + +#: pg_backup_archiver.c:2427 pg_backup_archiver.c:4461 +#, c-format +msgid "worker process failed: exit code %d" +msgstr "工作行程失敗: çµæŸç¢¼ %d" + +#: pg_backup_archiver.c:2548 +#, c-format +msgid "entry ID %d out of range -- perhaps a corrupt TOC" +msgstr "é …ç›® ID %d è¶…å‡ºç¯„åœ - å¯èƒ½æ˜¯ TOC æå£ž" + +# commands/dbcommands.c:138 +#: pg_backup_archiver.c:2628 +#, c-format +msgid "restoring tables WITH OIDS is not supported anymore" +msgstr "ä¸å†æ”¯æ´é‚„原 WITH OIDS 的資料表" + +# utils/adt/encode.c:55 utils/adt/encode.c:91 +#: pg_backup_archiver.c:2710 +#, c-format +msgid "unrecognized encoding \"%s\"" +msgstr "無法識別的編碼 \"%s\"" + +#: pg_backup_archiver.c:2715 +#, c-format +msgid "invalid ENCODING item: %s" +msgstr "無效的 ENCODING é …ç›®: %s" + +#: pg_backup_archiver.c:2733 +#, c-format +msgid "invalid STDSTRINGS item: %s" +msgstr "無效的 STDSTRINGS é …ç›®: %s" + +#: pg_backup_archiver.c:2758 +#, c-format +msgid "schema \"%s\" not found" +msgstr "找ä¸åˆ° schema \"%s\"" + +# utils/adt/date.c:2510 utils/adt/timestamp.c:3793 utils/adt/timestamp.c:3942 +#: pg_backup_archiver.c:2765 +#, c-format +msgid "table \"%s\" not found" +msgstr "找ä¸åˆ°è³‡æ–™è¡¨ \"%s\"" + +# utils/adt/date.c:2510 utils/adt/timestamp.c:3793 utils/adt/timestamp.c:3942 +#: pg_backup_archiver.c:2772 +#, c-format +msgid "index \"%s\" not found" +msgstr "找ä¸åˆ°ç´¢å¼• \"%s\"" + +# utils/adt/date.c:2510 utils/adt/timestamp.c:3793 utils/adt/timestamp.c:3942 +#: pg_backup_archiver.c:2779 +#, c-format +msgid "function \"%s\" not found" +msgstr "找ä¸åˆ°å‡½æ•¸ \"%s\"" + +# utils/adt/date.c:2510 utils/adt/timestamp.c:3793 utils/adt/timestamp.c:3942 +#: pg_backup_archiver.c:2786 +#, c-format +msgid "trigger \"%s\" not found" +msgstr "找ä¸åˆ°è§¸ç™¼å™¨ \"%s\"" + +#: pg_backup_archiver.c:3183 +#, c-format +msgid "could not set session user to \"%s\": %s" +msgstr "無法將工作階段使用者設為 \"%s\": %s" + +#: pg_backup_archiver.c:3315 +#, c-format +msgid "could not set search_path to \"%s\": %s" +msgstr "無法將 search_path 設為 \"%s\": %s" + +# access/transam/slru.c:930 commands/tablespace.c:529 +# commands/tablespace.c:694 utils/adt/misc.c:174 +#: pg_backup_archiver.c:3376 +#, c-format +msgid "could not set default_tablespace to %s: %s" +msgstr "無法將 default_tablespace 設為 %s: %s" + +#: pg_backup_archiver.c:3425 +#, c-format +msgid "could not set default_table_access_method: %s" +msgstr "無法設定 default_table_access_method: %s" + +#: pg_backup_archiver.c:3530 +#, c-format +msgid "don't know how to set owner for object type \"%s\"" +msgstr "ä¸çŸ¥é“如何設定物件型別 \"%s\" çš„æ“æœ‰è€…" + +#: pg_backup_archiver.c:3752 +#, c-format +msgid "did not find magic string in file header" +msgstr "檔案標頭中找ä¸åˆ°é­”術字串" + +#: pg_backup_archiver.c:3766 +#, c-format +msgid "unsupported version (%d.%d) in file header" +msgstr "檔案標頭中的版本ä¸å—支æ´(%d.%d)" + +#: pg_backup_archiver.c:3771 +#, c-format +msgid "sanity check on integer size (%lu) failed" +msgstr "整數大å°(%lu)的完整性檢查失敗" + +#: pg_backup_archiver.c:3775 +#, c-format +msgid "archive was made on a machine with larger integers, some operations might fail" +msgstr "å°å­˜æª”是在支æ´è¼ƒå¤§æ•´æ•¸çš„電腦上建立的,æŸäº›æ“作å¯èƒ½æœƒå¤±æ•—" + +#: pg_backup_archiver.c:3785 +#, c-format +msgid "expected format (%d) differs from format found in file (%d)" +msgstr "é æœŸçš„æ ¼å¼(%d)與檔案中找到的格å¼(%d)ä¸åŒ" + +#: pg_backup_archiver.c:3807 +#, c-format +msgid "archive is compressed, but this installation does not support compression (%s) -- no data will be available" +msgstr "å°å­˜æª”已被壓縮,但是程å¼ä¸æ”¯æ´å£“縮法(%s) -- 無法讀å–資料" + +#: pg_backup_archiver.c:3843 +#, c-format +msgid "invalid creation date in header" +msgstr "標頭中的建立日期無效" + +#: pg_backup_archiver.c:3977 +#, c-format +msgid "processing item %d %s %s" +msgstr "處ç†é …ç›® %d %s %s" + +#: pg_backup_archiver.c:4052 +#, c-format +msgid "entering main parallel loop" +msgstr "進入主è¦ä¸¦è¡Œè¿´åœˆ" + +#: pg_backup_archiver.c:4063 +#, c-format +msgid "skipping item %d %s %s" +msgstr "è·³éŽé …ç›® %d %s %s" + +#: pg_backup_archiver.c:4072 +#, c-format +msgid "launching item %d %s %s" +msgstr "啟動項目 %d %s %s" + +#: pg_backup_archiver.c:4126 +#, c-format +msgid "finished main parallel loop" +msgstr "完æˆä¸»è¦ä¸¦è¡Œè¿´åœˆ" + +#: pg_backup_archiver.c:4162 +#, c-format +msgid "processing missed item %d %s %s" +msgstr "處ç†éºæ¼çš„é …ç›® %d %s %s" + +#: pg_backup_archiver.c:4767 +#, c-format +msgid "table \"%s\" could not be created, will not restore its data" +msgstr "無法建立資料表 \"%s\"ï¼Œå°‡ä¸æœƒé‚„原資料" + +#: pg_backup_custom.c:380 pg_backup_null.c:147 +#, c-format +msgid "invalid OID for large object" +msgstr "大物件的 OID 無效" + +#: pg_backup_custom.c:445 pg_backup_custom.c:511 pg_backup_custom.c:640 +#: pg_backup_custom.c:874 pg_backup_tar.c:1014 pg_backup_tar.c:1019 +#, c-format +msgid "error during file seek: %m" +msgstr "檔案 seek 時發生錯誤: %m" + +#: pg_backup_custom.c:484 +#, c-format +msgid "data block %d has wrong seek position" +msgstr "資料å€å¡Š %d çš„ seek ä½ç½®éŒ¯èª¤" + +#: pg_backup_custom.c:501 +#, c-format +msgid "unrecognized data block type (%d) while searching archive" +msgstr "æœå°‹å°å­˜æª”時發ç¾ç„¡æ³•識別的資料å€å¡Šé¡žåž‹(%d)" + +#: pg_backup_custom.c:523 +#, c-format +msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to non-seekable input file" +msgstr "無法在å°å­˜æª”中找到å€å¡Š ID %d -- å¯èƒ½æ˜¯å› ç‚ºéžå¾ªåºé‚„原請求,因ä¸èƒ½ seek 輸入檔導致無法處ç†" + +#: pg_backup_custom.c:528 +#, c-format +msgid "could not find block ID %d in archive -- possibly corrupt archive" +msgstr "無法在å°å­˜æª”中找到å€å¡Šç·¨è™Ÿ %d -- å¯èƒ½æ˜¯å› ç‚ºå°å­˜æª”æå£ž" + +#: pg_backup_custom.c:535 +#, c-format +msgid "found unexpected block ID (%d) when reading data -- expected %d" +msgstr "讀å–資料時發ç¾éžé æœŸçš„å€å¡Š ID (%d) -- é æœŸæ˜¯ %d" + +#: pg_backup_custom.c:549 +#, c-format +msgid "unrecognized data block type %d while restoring archive" +msgstr "還原å°å­˜æª”時發ç¾ç„¡æ³•識別的資料å€å¡Šé¡žåž‹ %d" + +#: pg_backup_custom.c:755 pg_backup_custom.c:807 pg_backup_custom.c:952 +#: pg_backup_tar.c:1017 +#, c-format +msgid "could not determine seek position in archive file: %m" +msgstr "無法確定å°å­˜æª”中的 seek ä½ç½®: %m" + +#: pg_backup_custom.c:771 pg_backup_custom.c:811 +#, c-format +msgid "could not close archive file: %m" +msgstr "無法關閉å°å­˜æª”: %m" + +#: pg_backup_custom.c:794 +#, c-format +msgid "can only reopen input archives" +msgstr "åªèƒ½é‡æ–°é–‹å•Ÿè¼¸å…¥å°å­˜æª”" + +#: pg_backup_custom.c:801 +#, c-format +msgid "parallel restore from standard input is not supported" +msgstr "䏿”¯æ´ä¾†è‡ªæ¨™æº–輸入的並行還原" + +#: pg_backup_custom.c:803 +#, c-format +msgid "parallel restore from non-seekable file is not supported" +msgstr "䏿”¯æ´å¾žä¸å¯ seek 的檔案進行並行還原" + +#: pg_backup_custom.c:819 +#, c-format +msgid "could not set seek position in archive file: %m" +msgstr "無法設定å°å­˜æª”çš„ seek ä½ç½®: %m" + +#: pg_backup_custom.c:898 +#, c-format +msgid "compressor active" +msgstr "壓縮器啟用" + +#: pg_backup_db.c:42 +#, c-format +msgid "could not get server_version from libpq" +msgstr "無法從 libpq å–å¾— server_version" + +#: pg_backup_db.c:53 pg_dumpall.c:1809 +#, c-format +msgid "aborting because of server version mismatch" +msgstr "因伺æœå™¨ç‰ˆæœ¬ä¸ä¸€è‡´è€Œä¸­æ­¢" + +#: pg_backup_db.c:54 pg_dumpall.c:1810 +#, c-format +msgid "server version: %s; %s version: %s" +msgstr "伺æœå™¨ç‰ˆæœ¬: %s; %s 版本: %s" + +#: pg_backup_db.c:120 +#, c-format +msgid "already connected to a database" +msgstr "已連線至資料庫" + +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1656 pg_dumpall.c:1758 +msgid "Password: " +msgstr "密碼: " + +#: pg_backup_db.c:170 +#, c-format +msgid "could not connect to database" +msgstr "無法連線至資料庫" + +# postmaster/postmaster.c:2603 +#: pg_backup_db.c:187 +#, c-format +msgid "reconnection failed: %s" +msgstr "釿–°é€£ç·šå¤±æ•—: %s" + +# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770 +# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:756 pg_dump_sort.c:1280 +#: pg_dump_sort.c:1300 pg_dumpall.c:1683 pg_dumpall.c:1767 +#, c-format +msgid "%s" +msgstr "" + +#: pg_backup_db.c:271 pg_dumpall.c:1872 pg_dumpall.c:1895 +#, c-format +msgid "query failed: %s" +msgstr "查詢失敗: %s" + +#: pg_backup_db.c:273 pg_dumpall.c:1873 pg_dumpall.c:1896 +#, c-format +msgid "Query was: %s" +msgstr "查詢是: %s" + +#: pg_backup_db.c:315 +#, c-format +msgid "query returned %d row instead of one: %s" +msgid_plural "query returned %d rows instead of one: %s" +msgstr[0] "查詢回傳 %d 筆資料,而éžä¸€ç­†è³‡æ–™: %s" + +#: pg_backup_db.c:351 +#, c-format +msgid "%s: %sCommand was: %s" +msgstr "%s: %s命令是: %s" + +#: pg_backup_db.c:407 pg_backup_db.c:481 pg_backup_db.c:488 +msgid "could not execute query" +msgstr "無法執行查詢" + +#: pg_backup_db.c:460 +#, c-format +msgid "error returned by PQputCopyData: %s" +msgstr "PQputCopyData 回傳的錯誤: %s" + +#: pg_backup_db.c:509 +#, c-format +msgid "error returned by PQputCopyEnd: %s" +msgstr "PQputCopyEnd 回傳的錯誤: %s" + +# describe.c:933 +#: pg_backup_db.c:515 +#, c-format +msgid "COPY failed for table \"%s\": %s" +msgstr "COPY 資料表 \"%s\" 失敗: %s" + +# commands/copy.c:453 +#: pg_backup_db.c:521 pg_dump.c:2202 +#, c-format +msgid "unexpected extra results during COPY of table \"%s\"" +msgstr "在 COPY 資料表 \"%s\" 時出ç¾éžé æœŸçš„é¡å¤–çµæžœ" + +#: pg_backup_db.c:533 +msgid "could not start database transaction" +msgstr "無法開始資料庫交易" + +#: pg_backup_db.c:541 +msgid "could not commit database transaction" +msgstr "無法æäº¤è³‡æ–™åº«äº¤æ˜“" + +#: pg_backup_directory.c:155 +#, c-format +msgid "no output directory specified" +msgstr "未指定輸出目錄" + +# access/transam/slru.c:967 commands/tablespace.c:577 +# commands/tablespace.c:721 +#: pg_backup_directory.c:184 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "無法讀å–目錄 \"%s\": %m" + +# access/transam/slru.c:930 commands/tablespace.c:529 +# commands/tablespace.c:694 utils/adt/misc.c:174 +#: pg_backup_directory.c:188 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "無法關閉目錄 \"%s\": %m" + +# commands/tablespace.c:154 commands/tablespace.c:162 +# commands/tablespace.c:168 +#: pg_backup_directory.c:194 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "無法建立目錄 \"%s\": %m" + +#: pg_backup_directory.c:356 pg_backup_directory.c:499 +#: pg_backup_directory.c:537 +#, c-format +msgid "could not write to output file: %s" +msgstr "無法寫入輸出檔: %s" + +#: pg_backup_directory.c:374 +#, c-format +msgid "could not close data file: %m" +msgstr "無法關閉資料檔: %m" + +# access/transam/slru.c:680 access/transam/xlog.c:1567 +# access/transam/xlog.c:1691 access/transam/xlog.c:3013 +#: pg_backup_directory.c:407 +#, c-format +msgid "could not close data file \"%s\": %m" +msgstr "無法關閉資料檔 \"%s\": %m" + +#: pg_backup_directory.c:448 +#, c-format +msgid "could not open large object TOC file \"%s\" for input: %m" +msgstr "無法開啟大物件 TOC 檔 \"%s\" 進行輸入: %m" + +#: pg_backup_directory.c:459 +#, c-format +msgid "invalid line in large object TOC file \"%s\": \"%s\"" +msgstr "大物件 TOC 檔 \"%s\" 中有無效的行: \"%s\"" + +#: pg_backup_directory.c:468 +#, c-format +msgid "error reading large object TOC file \"%s\"" +msgstr "無法讀å–大物件檔 \"%s\"" + +#: pg_backup_directory.c:472 +#, c-format +msgid "could not close large object TOC file \"%s\": %m" +msgstr "無法關閉大物件 TOC 檔 \"%s\": %m" + +#: pg_backup_directory.c:694 +#, c-format +msgid "could not close LO data file: %m" +msgstr "無法關閉 LO 資料檔: %m" + +# postmaster/syslogger.c:703 +#: pg_backup_directory.c:704 +#, c-format +msgid "could not write to LOs TOC file: %s" +msgstr "無法寫入 LO TOC 檔: %s" + +#: pg_backup_directory.c:720 +#, c-format +msgid "could not close LOs TOC file: %m" +msgstr "無法關閉 LO TOC 檔: %m" + +# utils/mb/encnames.c:445 +#: pg_backup_directory.c:739 +#, c-format +msgid "file name too long: \"%s\"" +msgstr "檔案å稱éŽé•·: \"%s\"" + +#: pg_backup_null.c:74 +#, c-format +msgid "this format cannot be read" +msgstr "ç„¡æ³•è®€å–æ­¤æ ¼å¼" + +#: pg_backup_tar.c:172 +#, c-format +msgid "could not open TOC file \"%s\" for output: %m" +msgstr "無法開啟 TOC 檔 \"%s\" 進行輸出: %m" + +#: pg_backup_tar.c:179 +#, c-format +msgid "could not open TOC file for output: %m" +msgstr "無法開啟 TOC 檔進行輸出: %m" + +#: pg_backup_tar.c:198 pg_backup_tar.c:334 pg_backup_tar.c:389 +#: pg_backup_tar.c:405 pg_backup_tar.c:891 +#, c-format +msgid "compression is not supported by tar archive format" +msgstr "å£“ç¸®ä¸¦ä¸æ”¯æ´ tar å°å­˜æª”æ ¼å¼" + +#: pg_backup_tar.c:206 +#, c-format +msgid "could not open TOC file \"%s\" for input: %m" +msgstr "無法開啟 TOC 檔 \"%s\" 進行輸入: %m" + +#: pg_backup_tar.c:213 +#, c-format +msgid "could not open TOC file for input: %m" +msgstr "無法開啟 TOC 檔進行輸入: %m" + +#: pg_backup_tar.c:322 +#, c-format +msgid "could not find file \"%s\" in archive" +msgstr "無法在å°å­˜æª”中找到檔案 \"%s\"" + +#: pg_backup_tar.c:382 +#, c-format +msgid "could not generate temporary file name: %m" +msgstr "無法產生暫存檔å: %m" + +#: pg_backup_tar.c:623 +#, c-format +msgid "unexpected COPY statement syntax: \"%s\"" +msgstr "éžé æœŸçš„ COPY 敘述語法: \"%s\"" + +#: pg_backup_tar.c:888 +#, c-format +msgid "invalid OID for large object (%u)" +msgstr "大物件(%u)çš„ OID 無效" + +# command.c:1148 +#: pg_backup_tar.c:1033 +#, c-format +msgid "could not close temporary file: %m" +msgstr "無法關閉暫存檔: %m" + +#: pg_backup_tar.c:1036 +#, c-format +msgid "actual file length (%lld) does not match expected (%lld)" +msgstr "實際檔案長度(%lld)èˆ‡é æœŸé•·åº¦(%lld)ä¸ä¸€è‡´" + +#: pg_backup_tar.c:1082 pg_backup_tar.c:1113 +#, c-format +msgid "could not find header for file \"%s\" in tar archive" +msgstr "在 tar å°å­˜æª”中找ä¸åˆ°æª”案 \"%s\" 的標頭" + +#: pg_backup_tar.c:1100 +#, c-format +msgid "restoring data out of order is not supported in this archive format: \"%s\" is required, but comes before \"%s\" in the archive file." +msgstr "這種å°å­˜æª”æ ¼å¼ä¸æ”¯æ´éžå¾ªåºé‚„原: 需è¦çš„æ˜¯ \"%s\",但在å°å­˜æª”案中å»å‡ºç¾åœ¨ \"%s\" 之å‰ã€‚" + +#: pg_backup_tar.c:1147 +#, c-format +msgid "incomplete tar header found (%lu byte)" +msgid_plural "incomplete tar header found (%lu bytes)" +msgstr[0] "找到ä¸å®Œæ•´çš„ tar 標頭(%lu ä½å…ƒçµ„)" + +#: pg_backup_tar.c:1186 +#, c-format +msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" +msgstr "在 %s ä¸­ç™¼ç¾æå£žçš„ tar 標頭(é æœŸæ˜¯ %d,計算得到 %d)檔案ä½ç½® %llu" + +# commands/variable.c:403 +#: pg_backup_utils.c:54 +#, c-format +msgid "unrecognized section name: \"%s\"" +msgstr "ç„¡æ³•è­˜åˆ¥çš„å€æ®µå稱: \" %s \"" + +# tcop/postgres.c:2636 tcop/postgres.c:2652 +#: pg_backup_utils.c:55 pg_dump.c:662 pg_dump.c:679 pg_dumpall.c:365 +#: pg_dumpall.c:375 pg_dumpall.c:383 pg_dumpall.c:391 pg_dumpall.c:398 +#: pg_dumpall.c:408 pg_dumpall.c:483 pg_restore.c:291 pg_restore.c:307 +#: pg_restore.c:321 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "用 \"%s --help\" å–得更多資訊。" + +#: pg_backup_utils.c:66 +#, c-format +msgid "out of on_exit_nicely slots" +msgstr "on_exit_nicely 槽已用盡" + +#: pg_dump.c:677 pg_dumpall.c:373 pg_restore.c:305 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "命令列引數éŽå¤š(第一個是 \"%s\")" + +#: pg_dump.c:696 pg_restore.c:328 +#, c-format +msgid "options -s/--schema-only and -a/--data-only cannot be used together" +msgstr "ç„¡æ³•åŒæ™‚使用é¸é … -s/--schema-only å’Œ -a/--data-only" + +#: pg_dump.c:699 +#, c-format +msgid "options -s/--schema-only and --include-foreign-data cannot be used together" +msgstr "ç„¡æ³•åŒæ™‚使用é¸é … -s/--schema-only å’Œ --include-foreign-data" + +#: pg_dump.c:702 +#, c-format +msgid "option --include-foreign-data is not supported with parallel backup" +msgstr "é¸é … --include-foreign-data 䏿”¯æ´ä¸¦è¡Œå‚™ä»½" + +#: pg_dump.c:705 pg_restore.c:331 +#, c-format +msgid "options -c/--clean and -a/--data-only cannot be used together" +msgstr "ç„¡æ³•åŒæ™‚使用é¸é … -c/--clean å’Œ -a/--data-only" + +#: pg_dump.c:708 pg_dumpall.c:403 pg_restore.c:356 +#, c-format +msgid "option --if-exists requires option -c/--clean" +msgstr "é¸é … --if-exists 需è¦é¸é … -c/--clean" + +#: pg_dump.c:715 +#, c-format +msgid "option --on-conflict-do-nothing requires option --inserts, --rows-per-insert, or --column-inserts" +msgstr "é¸é … --on-conflict-do-nothing 需è¦é¸é … --inserts 或 --rows-per-insert 或 --column-inserts" + +# access/transam/xlog.c:3720 +#: pg_dump.c:744 +#, c-format +msgid "unrecognized compression algorithm: \"%s\"" +msgstr "無法識別的壓縮演算法: \" %s \"" + +# fe-connect.c:2675 +#: pg_dump.c:751 +#, c-format +msgid "invalid compression specification: %s" +msgstr "ç„¡æ•ˆçš„å£“ç¸®è¦æ ¼: %s" + +#: pg_dump.c:764 +#, c-format +msgid "compression option \"%s\" is not currently supported by pg_dump" +msgstr "pg_dump ç›®å‰ä¸æ”¯æ´å£“縮é¸é … \"%s\"" + +# input.c:213 +#: pg_dump.c:776 +#, c-format +msgid "parallel backup only supported by the directory format" +msgstr "ä¸¦è¡Œå‚™ä»½åªæ”¯æ´ç›®éŒ„æ ¼å¼" + +#: pg_dump.c:822 +#, c-format +msgid "last built-in OID is %u" +msgstr "最後的內建 OID 為 %u" + +# describe.c:1542 +#: pg_dump.c:831 +#, c-format +msgid "no matching schemas were found" +msgstr "找ä¸åˆ°ç¬¦åˆçš„ schema" + +# describe.c:1542 +#: pg_dump.c:848 +#, c-format +msgid "no matching tables were found" +msgstr "找ä¸åˆ°ç¬¦åˆçš„資料表" + +# describe.c:1542 +#: pg_dump.c:876 +#, c-format +msgid "no matching extensions were found" +msgstr "找ä¸åˆ°ç¬¦åˆçš„æ“´å……模組" + +#: pg_dump.c:1056 +#, c-format +msgid "" +"%s dumps a database as a text file or to other formats.\n" +"\n" +msgstr "" +"%s 會將資料庫備份為文字檔或其他格å¼ã€‚\n" +"\n" + +#: pg_dump.c:1057 pg_dumpall.c:630 pg_restore.c:433 +#, c-format +msgid "Usage:\n" +msgstr "用法:\n" + +#: pg_dump.c:1058 +#, c-format +msgid " %s [OPTION]... [DBNAME]\n" +msgstr "" + +#: pg_dump.c:1060 pg_dumpall.c:633 pg_restore.c:436 +#, c-format +msgid "" +"\n" +"General options:\n" +msgstr "" +"\n" +"一般é¸é …:\n" + +#: pg_dump.c:1061 +#, c-format +msgid " -f, --file=FILENAME output file or directory name\n" +msgstr " -f, --file=FILENAME 輸出檔案或目錄的å稱\n" + +#: pg_dump.c:1062 +#, c-format +msgid "" +" -F, --format=c|d|t|p output file format (custom, directory, tar,\n" +" plain text (default))\n" +msgstr " -F, --format=c|d|t|p 輸出檔案格å¼(自訂ã€ç›®éŒ„ã€tarã€ç´”文字(é è¨­))\n" + +#: pg_dump.c:1064 +#, c-format +msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" +msgstr " -j, --jobs=NUM 使用這麼多並行作業來備份\n" + +#: pg_dump.c:1065 pg_dumpall.c:635 +#, c-format +msgid " -v, --verbose verbose mode\n" +msgstr " -v, --verbose 詳細模å¼\n" + +#: pg_dump.c:1066 pg_dumpall.c:636 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version é¡¯ç¤ºç‰ˆæœ¬ï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_dump.c:1067 +#, c-format +msgid "" +" -Z, --compress=METHOD[:DETAIL]\n" +" compress as specified\n" +msgstr "" +" -Z, --compress=METHOD[:DETAIL]\n" +" 根據指定的方å¼å£“縮\n" + +#: pg_dump.c:1069 pg_dumpall.c:637 +#, c-format +msgid " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" +msgstr " --lock-wait-timeout=TIMEOUT ç­‰å¾…è³‡æ–™è¡¨éŽ–å®šè¶…éŽ TIMEOUT 後失敗\n" + +#: pg_dump.c:1070 pg_dumpall.c:664 +#, c-format +msgid " --no-sync do not wait for changes to be written safely to disk\n" +msgstr " --no-sync ä¸ç­‰å¾…變更安全寫入ç£ç¢Ÿ\n" + +#: pg_dump.c:1071 pg_dumpall.c:638 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help é¡¯ç¤ºèªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_dump.c:1073 pg_dumpall.c:639 +#, c-format +msgid "" +"\n" +"Options controlling the output content:\n" +msgstr "" +"\n" +"控制輸出內容的é¸é …:\n" + +#: pg_dump.c:1074 pg_dumpall.c:640 +#, c-format +msgid " -a, --data-only dump only the data, not the schema\n" +msgstr " -a, --data-only åªå‚™ä»½è³‡æ–™ï¼Œä¸å« schema\n" + +#: pg_dump.c:1075 +#, c-format +msgid " -b, --large-objects include large objects in dump\n" +msgstr " -b, --large-objects 在備份中包å«å¤§ç‰©ä»¶\n" + +#: pg_dump.c:1076 +#, c-format +msgid " --blobs (same as --large-objects, deprecated)\n" +msgstr " --blobs (åŒ --large-objects,已作廢)\n" + +#: pg_dump.c:1077 +#, c-format +msgid " -B, --no-large-objects exclude large objects in dump\n" +msgstr " -B, --no-large-objects 在備份中排除大物件\n" + +#: pg_dump.c:1078 +#, c-format +msgid " --no-blobs (same as --no-large-objects, deprecated)\n" +msgstr " --no-blobs (åŒ --no-large-objects,已作廢)\n" + +#: pg_dump.c:1079 pg_restore.c:447 +#, c-format +msgid " -c, --clean clean (drop) database objects before recreating\n" +msgstr " -c, --clean é‡å»ºå‰æ¸…ç†(刪除)資料庫物件\n" + +#: pg_dump.c:1080 +#, c-format +msgid " -C, --create include commands to create database in dump\n" +msgstr " -C, --create 在備份中包å«å»ºç«‹è³‡æ–™åº«çš„命令\n" + +#: pg_dump.c:1081 +#, c-format +msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" +msgstr " -e, --extension=PATTERN åªå‚™ä»½æŒ‡å®šçš„æ“´å……功能\n" + +#: pg_dump.c:1082 pg_dumpall.c:642 +#, c-format +msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" +msgstr " -E, --encoding=ENCODING 以編碼 ENCODING 備份資料\n" + +#: pg_dump.c:1083 +#, c-format +msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" +msgstr " -n, --schema=PATTERN åªå‚™ä»½æŒ‡å®šçš„ schema\n" + +#: pg_dump.c:1084 +#, c-format +msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" +msgstr " -N, --exclude-schema=PATTERN ä¸è¦å‚™ä»½æŒ‡å®šçš„ schema\n" + +#: pg_dump.c:1085 +#, c-format +msgid "" +" -O, --no-owner skip restoration of object ownership in\n" +" plain-text format\n" +msgstr " -O, --no-owner 在純文字格å¼è·³éŽé‚„åŽŸç‰©ä»¶æ“æœ‰æ¬Š\n" + +#: pg_dump.c:1087 pg_dumpall.c:646 +#, c-format +msgid " -s, --schema-only dump only the schema, no data\n" +msgstr " -s, --schema-only åªå‚™ä»½ schema,ä¸å«è³‡æ–™\n" + +#: pg_dump.c:1088 +#, c-format +msgid " -S, --superuser=NAME superuser user name to use in plain-text format\n" +msgstr " -S, --superuser=NAME 在純文字格å¼ä½¿ç”¨çš„超級使用者å稱\n" + +#: pg_dump.c:1089 +#, c-format +msgid " -t, --table=PATTERN dump only the specified table(s)\n" +msgstr " -t, --table=PATTERN åªå‚™ä»½æŒ‡å®šçš„資料表\n" + +#: pg_dump.c:1090 +#, c-format +msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" +msgstr " -T, --exclude-table=PATTERN ä¸è¦å‚™ä»½æŒ‡å®šçš„資料表\n" + +#: pg_dump.c:1091 pg_dumpall.c:649 +#, c-format +msgid " -x, --no-privileges do not dump privileges (grant/revoke)\n" +msgstr " -x, --no-privileges ä¸è¦å‚™ä»½æ¬Šé™(grant/revoke)\n" + +#: pg_dump.c:1092 pg_dumpall.c:650 +#, c-format +msgid " --binary-upgrade for use by upgrade utilities only\n" +msgstr " --binary-upgrade åªä¾›å‡ç´šå·¥å…·ä½¿ç”¨\n" + +#: pg_dump.c:1093 pg_dumpall.c:651 +#, c-format +msgid " --column-inserts dump data as INSERT commands with column names\n" +msgstr " --column-inserts å°‡è³‡æ–™å‚™ä»½ç‚ºåŒ…å«æ¬„ä½å稱的 INSERT 命令\n" + +#: pg_dump.c:1094 pg_dumpall.c:652 +#, c-format +msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" +msgstr " --disable-dollar-quoting åœç”¨éŒ¢è™Ÿå¼•號,使用 SQL 標準引號\n" + +#: pg_dump.c:1095 pg_dumpall.c:653 pg_restore.c:464 +#, c-format +msgid " --disable-triggers disable triggers during data-only restore\n" +msgstr " --disable-triggers 還原 data-only 備份時åœç”¨è§¸ç™¼å™¨\n" + +#: pg_dump.c:1096 +#, c-format +msgid "" +" --enable-row-security enable row security (dump only content user has\n" +" access to)\n" +msgstr " --enable-row-security 啟用列安全性(åªå‚™ä»½ä½¿ç”¨è€…æœ‰å­˜å–æ¬Šçš„內容)\n" + +#: pg_dump.c:1098 +#, c-format +msgid "" +" --exclude-table-and-children=PATTERN\n" +" do NOT dump the specified table(s), including\n" +" child and partition tables\n" +msgstr "" +" --exclude-table-and-children=PATTERN\n" +" ä¸è¦å‚™ä»½æŒ‡å®šçš„資料表,包括\n" +" å­è³‡æ–™è¡¨å’Œåˆ†å‰²è³‡æ–™è¡¨\n" + +#: pg_dump.c:1101 +#, c-format +msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" +msgstr " --exclude-table-data=PATTERN ä¸è¦å‚™ä»½æŒ‡å®šè³‡æ–™è¡¨çš„資料\n" + +#: pg_dump.c:1102 +#, c-format +msgid "" +" --exclude-table-data-and-children=PATTERN\n" +" do NOT dump data for the specified table(s),\n" +" including child and partition tables\n" +msgstr "" +" --exclude-table-data-and-children=PATTERN\n" +" ä¸è¦å‚™ä»½æŒ‡å®šè³‡æ–™è¡¨çš„資料,包括\n" +" å­è³‡æ–™è¡¨å’Œåˆ†å‰²è³‡æ–™è¡¨\n" +"\n" + +#: pg_dump.c:1105 pg_dumpall.c:655 +#, c-format +msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" +msgstr " --extra-float-digits=NUM 覆蓋 extra_float_digits çš„é è¨­è¨­å®š\n" + +#: pg_dump.c:1106 pg_dumpall.c:656 pg_restore.c:466 +#, c-format +msgid " --if-exists use IF EXISTS when dropping objects\n" +msgstr " --if-exists 刪除物件時使用 IF EXISTS\n" + +#: pg_dump.c:1107 +#, c-format +msgid "" +" --include-foreign-data=PATTERN\n" +" include data of foreign tables on foreign\n" +" servers matching PATTERN\n" +msgstr "" +" --include-foreign-data=PATTERN\n" +" å«åŒ…ç¬¦åˆ PATTERN 的外部伺æœå™¨ä¸Šçš„\n" +" 外部資料表中的資料\n" + +#: pg_dump.c:1110 pg_dumpall.c:657 +#, c-format +msgid " --inserts dump data as INSERT commands, rather than COPY\n" +msgstr " --inserts 備份資料為 INSERT å‘½ä»¤ï¼Œè€Œä¸æ˜¯ COPY\n" + +#: pg_dump.c:1111 pg_dumpall.c:658 +#, c-format +msgid " --load-via-partition-root load partitions via the root table\n" +msgstr " --load-via-partition-root é€éŽä¸»è³‡æ–™è¡¨è¼‰å…¥åˆ†å‰²è³‡æ–™è¡¨\n" + +#: pg_dump.c:1112 pg_dumpall.c:659 +#, c-format +msgid " --no-comments do not dump comments\n" +msgstr " --no-comments ä¸å‚™ä»½è¨»è§£\n" + +#: pg_dump.c:1113 pg_dumpall.c:660 +#, c-format +msgid " --no-publications do not dump publications\n" +msgstr " --no-publications ä¸å‚™ä»½ç™¼å¸ƒ\n" + +#: pg_dump.c:1114 pg_dumpall.c:662 +#, c-format +msgid " --no-security-labels do not dump security label assignments\n" +msgstr " --no-security-labels ä¸å‚™ä»½å®‰å…¨æ€§æ¨™ç±¤\n" + +#: pg_dump.c:1115 pg_dumpall.c:663 +#, c-format +msgid " --no-subscriptions do not dump subscriptions\n" +msgstr " --no-subscriptions ä¸å‚™ä»½è¨‚é–±\n" + +#: pg_dump.c:1116 pg_dumpall.c:665 +#, c-format +msgid " --no-table-access-method do not dump table access methods\n" +msgstr " --no-table-access-method ä¸å‚™ä»½è³‡æ–™è¡¨å­˜å–æ–¹å¼\n" + +#: pg_dump.c:1117 pg_dumpall.c:666 +#, c-format +msgid " --no-tablespaces do not dump tablespace assignments\n" +msgstr " --no-tablespaces ä¸å‚™ä»½è¡¨ç©ºé–“\n" + +#: pg_dump.c:1118 pg_dumpall.c:667 +#, c-format +msgid " --no-toast-compression do not dump TOAST compression methods\n" +msgstr " --no-toast-compression ä¸å‚™ä»½ TOAST 壓縮方法\n" + +#: pg_dump.c:1119 pg_dumpall.c:668 +#, c-format +msgid " --no-unlogged-table-data do not dump unlogged table data\n" +msgstr " --no-unlogged-table-data ä¸å‚™ä»½ç„¡æ—¥èªŒè³‡æ–™è¡¨çš„資料\n" + +#: pg_dump.c:1120 pg_dumpall.c:669 +#, c-format +msgid " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n" +msgstr " --on-conflict-do-nothing 在 INSERT 命令加上 ON CONFLICT DO NOTHING\n" + +#: pg_dump.c:1121 pg_dumpall.c:670 +#, c-format +msgid " --quote-all-identifiers quote all identifiers, even if not key words\n" +msgstr " --quote-all-identifiers 所有識別å稱加引號,å³ä½¿ä¸æ˜¯é—œéµå­—\n" + +#: pg_dump.c:1122 pg_dumpall.c:671 +#, c-format +msgid " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" +msgstr " --rows-per-insert=NROWS æ¯å€‹ INSERT 的資料筆數;æ„味著使用 --inserts\n" + +#: pg_dump.c:1123 +#, c-format +msgid " --section=SECTION dump named section (pre-data, data, or post-data)\n" +msgstr " --section=SECTION å‚™ä»½æŒ‡å®šçš„å€æ®µ(pre-dataã€data 或 post-data)\n" + +#: pg_dump.c:1124 +#, c-format +msgid " --serializable-deferrable wait until the dump can run without anomalies\n" +msgstr " --serializable-deferrable 等待備份å¯åœ¨ç„¡ç•°å¸¸ç‹€æ³ä¸‹åŸ·è¡Œ\n" + +#: pg_dump.c:1125 +#, c-format +msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" +msgstr " --snapshot=SNAPSHOT 使用指定的快照進行備份\n" + +#: pg_dump.c:1126 pg_restore.c:476 +#, c-format +msgid "" +" --strict-names require table and/or schema include patterns to\n" +" match at least one entity each\n" +msgstr "" +" --strict-names 比å°è³‡æ–™è¡¨å’Œschemaçš„PATTERN必需\n" +" æ‰¾åˆ°ç¬¦åˆæ¢ä»¶çš„å°è±¡\n" + +#: pg_dump.c:1128 +#, c-format +msgid "" +" --table-and-children=PATTERN dump only the specified table(s), including\n" +" child and partition tables\n" +msgstr "" +" --table-and-children=PATTERN åªå‚™ä»½æŒ‡å®šçš„資料表,包括\n" +" å­è³‡æ–™è¡¨å’Œåˆ†å‰²è³‡æ–™è¡¨\n" + +#: pg_dump.c:1130 pg_dumpall.c:672 pg_restore.c:478 +#, c-format +msgid "" +" --use-set-session-authorization\n" +" use SET SESSION AUTHORIZATION commands instead of\n" +" ALTER OWNER commands to set ownership\n" +msgstr "" +" --use-set-session-authorization\n" +" 使用 SET SESSION AUTHORIZATION 命令而éž\n" +" ALTER OWNER å‘½ä»¤ä¾†è¨­å®šæ“æœ‰æ¬Š\n" + +#: pg_dump.c:1134 pg_dumpall.c:676 pg_restore.c:482 +#, c-format +msgid "" +"\n" +"Connection options:\n" +msgstr "" +"\n" +"連線é¸é …:\n" + +#: pg_dump.c:1135 +#, c-format +msgid " -d, --dbname=DBNAME database to dump\n" +msgstr " -d, --dbname=DBNAME è¦å‚™ä»½çš„資料庫\n" + +#: pg_dump.c:1136 pg_dumpall.c:678 pg_restore.c:483 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=HOSTNAME 資料庫伺æœå™¨ä¸»æ©Ÿæˆ–socket目錄\n" + +#: pg_dump.c:1137 pg_dumpall.c:680 pg_restore.c:484 +#, c-format +msgid " -p, --port=PORT database server port number\n" +msgstr " -p, --port=PORT 資料庫伺æœå™¨é€£æŽ¥åŸ \n" + +#: pg_dump.c:1138 pg_dumpall.c:681 pg_restore.c:485 +#, c-format +msgid " -U, --username=NAME connect as specified database user\n" +msgstr " -U, --username=NAME 以指定的資料庫使用者連線\n" + +#: pg_dump.c:1139 pg_dumpall.c:682 pg_restore.c:486 +#, c-format +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, --no-password ä¸è©¢å•密碼\n" + +#: pg_dump.c:1140 pg_dumpall.c:683 pg_restore.c:487 +#, c-format +msgid " -W, --password force password prompt (should happen automatically)\n" +msgstr " -W, --password è¦æ±‚輸入密碼(應該是自動的)\n" + +#: pg_dump.c:1141 pg_dumpall.c:684 +#, c-format +msgid " --role=ROLENAME do SET ROLE before dump\n" +msgstr " --role=ROLENAME å‚™ä»½ä¹‹å‰ SET ROLE\n" + +#: pg_dump.c:1143 +#, c-format +msgid "" +"\n" +"If no database name is supplied, then the PGDATABASE environment\n" +"variable value is used.\n" +"\n" +msgstr "" +"\n" +"若未æä¾›è³‡æ–™åº«å稱,則使用環境變數 PGDATABASE 的內容。\n" +"\n" + +#: pg_dump.c:1145 pg_dumpall.c:688 pg_restore.c:494 +#, c-format +msgid "Report bugs to <%s>.\n" +msgstr "回報錯誤至 <%s>。\n" + +#: pg_dump.c:1146 pg_dumpall.c:689 pg_restore.c:495 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s ç¶²é : <%s>\n" + +#: pg_dump.c:1165 pg_dumpall.c:513 +#, c-format +msgid "invalid client encoding \"%s\" specified" +msgstr "指定的客戶端編碼 \"%s\" 無效" + +#: pg_dump.c:1303 +#, c-format +msgid "parallel dumps from standby servers are not supported by this server version" +msgstr "伺æœå™¨ç‰ˆæœ¬ä¸æ”¯æ´ä¾†è‡ªå¾…命伺æœå™¨çš„並行備份" + +#: pg_dump.c:1368 +#, c-format +msgid "invalid output format \"%s\" specified" +msgstr "æŒ‡å®šçš„è¼¸å‡ºæ ¼å¼ \"%s\" 無效" + +# catalog/namespace.c:1201 gram.y:2516 gram.y:7422 parser/parse_expr.c:1183 +# parser/parse_target.c:734 +#: pg_dump.c:1409 pg_dump.c:1465 pg_dump.c:1518 pg_dumpall.c:1449 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "ä¸åˆé©çš„完整å稱(太多點號å稱): %s" + +# describe.c:1542 +#: pg_dump.c:1417 +#, c-format +msgid "no matching schemas were found for pattern \"%s\"" +msgstr "找ä¸åˆ°ç¬¦åˆæ¨¡å¼ \"%s\" çš„ schema" + +# describe.c:1542 +#: pg_dump.c:1470 +#, c-format +msgid "no matching extensions were found for pattern \"%s\"" +msgstr "找ä¸åˆ°ç¬¦åˆæ¨¡å¼ \"%s\" 的擴充功能" + +#: pg_dump.c:1523 +#, c-format +msgid "no matching foreign servers were found for pattern \"%s\"" +msgstr "找ä¸åˆ°ç¬¦åˆæ¨¡å¼ \"%s\" 的外部伺æœå™¨" + +# catalog/namespace.c:1313 +#: pg_dump.c:1594 +#, c-format +msgid "improper relation name (too many dotted names): %s" +msgstr "ä¸åˆé©çš„é—œè¯å稱(太多點號å稱): %s" + +# describe.c:1542 +#: pg_dump.c:1616 +#, c-format +msgid "no matching tables were found for pattern \"%s\"" +msgstr "找ä¸åˆ°ç¬¦åˆæ¨¡å¼ \"%s\" 的資料表" + +# common.c:636 +# common.c:871 +#: pg_dump.c:1643 +#, c-format +msgid "You are currently not connected to a database." +msgstr "ç›®å‰å°šæœªé€£ç·šè‡³è³‡æ–™åº«ã€‚" + +# catalog/namespace.c:1195 parser/parse_expr.c:1157 parser/parse_target.c:725 +#: pg_dump.c:1646 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "尚未實作跨資料庫åƒè€ƒ: %s" + +#: pg_dump.c:2077 +#, c-format +msgid "dumping contents of table \"%s.%s\"" +msgstr "備份資料表 \"%s.%s\" 的內容" + +#: pg_dump.c:2183 +#, c-format +msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." +msgstr "備份資料表 \"%s\" 的內容失敗: PQgetCopyData() 失敗。" + +#: pg_dump.c:2184 pg_dump.c:2194 +#, c-format +msgid "Error message from server: %s" +msgstr "伺æœå™¨éŒ¯èª¤è¨Šæ¯: %s" + +#: pg_dump.c:2185 pg_dump.c:2195 +#, c-format +msgid "Command was: %s" +msgstr "命令是: %s" + +#: pg_dump.c:2193 +#, c-format +msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." +msgstr "備份資料表 \"%s\" 的內容失敗: PQgetResult() 失敗。" + +# utils/init/miscinit.c:792 utils/misc/guc.c:5074 +#: pg_dump.c:2275 +#, c-format +msgid "wrong number of fields retrieved from table \"%s\"" +msgstr "從資料表 \"%s\" å–å¾—çš„æ¬„ä½æ•¸ä¸æ­£ç¢º" + +#: pg_dump.c:2973 +#, c-format +msgid "saving database definition" +msgstr "儲存資料庫定義" + +#: pg_dump.c:3078 +#, c-format +msgid "unrecognized locale provider: %s" +msgstr "無法識別的å€åŸŸæä¾›è€…: %s" + +#: pg_dump.c:3429 +#, c-format +msgid "saving encoding = %s" +msgstr "儲存 encoding = %s" + +#: pg_dump.c:3454 +#, c-format +msgid "saving standard_conforming_strings = %s" +msgstr "儲存 standard_conforming_strings = %s" + +#: pg_dump.c:3493 +#, c-format +msgid "could not parse result of current_schemas()" +msgstr "ç„¡æ³•è§£æž current_schemas() çš„çµæžœ" + +#: pg_dump.c:3512 +#, c-format +msgid "saving search_path = %s" +msgstr "儲存 search_path = %s" + +#: pg_dump.c:3549 +#, c-format +msgid "reading large objects" +msgstr "讀å–大物件" + +#: pg_dump.c:3687 +#, c-format +msgid "saving large objects" +msgstr "儲存大物件" + +#: pg_dump.c:3728 +#, c-format +msgid "error reading large object %u: %s" +msgstr "讀å–大物件 %u 時發生錯誤: %s" + +#: pg_dump.c:3834 +#, c-format +msgid "reading row-level security policies" +msgstr "讀å–列層級安全政策" + +# utils/adt/regproc.c:1209 +#: pg_dump.c:3975 +#, c-format +msgid "unexpected policy command type: %c" +msgstr "éžé æœŸçš„æ”¿ç­–命令類型: %c" + +#: pg_dump.c:4425 pg_dump.c:4760 pg_dump.c:11984 pg_dump.c:17894 +#: pg_dump.c:17896 pg_dump.c:18517 +#, c-format +msgid "could not parse %s array" +msgstr "ç„¡æ³•è§£æž %s 陣列" + +# utils/misc/guc.c:434 +#: pg_dump.c:4613 +#, c-format +msgid "subscriptions not dumped because current user is not a superuser" +msgstr "未備份訂閱,因為目å‰ä½¿ç”¨è€…䏿˜¯è¶…級使用者" + +# catalog/dependency.c:152 +#: pg_dump.c:5149 +#, c-format +msgid "could not find parent extension for %s %s" +msgstr "找ä¸åˆ° %s %s 的父擴充功能" + +# catalog/aclchk.c:1689 catalog/aclchk.c:2001 +#: pg_dump.c:5294 +#, c-format +msgid "schema with OID %u does not exist" +msgstr "OID 為 %u çš„ schema ä¸å­˜åœ¨" + +#: pg_dump.c:6776 pg_dump.c:17158 +#, c-format +msgid "failed sanity check, parent table with OID %u of sequence with OID %u not found" +msgstr "完整性檢查失敗,找ä¸åˆ° OID 為 %u çš„åºåˆ—(父資料表 OID 為 %u)" + +#: pg_dump.c:6919 +#, c-format +msgid "failed sanity check, table OID %u appearing in pg_partitioned_table not found" +msgstr "完整性檢查失敗,在 pg_partitioned_table 中找ä¸åˆ° OID 為 %u 的資料表" + +#: pg_dump.c:7150 pg_dump.c:7417 pg_dump.c:7888 pg_dump.c:8552 pg_dump.c:8671 +#: pg_dump.c:8819 +#, c-format +msgid "unrecognized table OID %u" +msgstr "無法辨識的資料表 OID %u" + +#: pg_dump.c:7154 +#, c-format +msgid "unexpected index data for table \"%s\"" +msgstr "éžé æœŸçš„資料表 \"%s\" 索引資料" + +#: pg_dump.c:7649 +#, c-format +msgid "failed sanity check, parent table with OID %u of pg_rewrite entry with OID %u not found" +msgstr "完整性檢查失敗,找ä¸åˆ° OID 為 %u 的父資料表(pg_rewrite é …ç›® OID 為 %u)" + +#: pg_dump.c:7940 +#, c-format +msgid "query produced null referenced table name for foreign key trigger \"%s\" on table \"%s\" (OID of table: %u)" +msgstr "查詢產生空的åƒè€ƒè³‡æ–™è¡¨å稱給資料表 \"%2$s\"(資料表 OID:%3$u)上的外éµè§¸ç™¼å™¨ \"%1$s\" " + +#: pg_dump.c:8556 +#, c-format +msgid "unexpected column data for table \"%s\"" +msgstr "éžé æœŸçš„資料表 \"%s\" 欄ä½è³‡æ–™" + +#: pg_dump.c:8585 +#, c-format +msgid "invalid column numbering in table \"%s\"" +msgstr "資料表 \"%s\" 中的欄ä½ç·¨è™Ÿç„¡æ•ˆ" + +# commands/typecmds.c:637 +#: pg_dump.c:8633 +#, c-format +msgid "finding table default expressions" +msgstr "尋找資料表的é è¨­è¡¨é”å¼" + +#: pg_dump.c:8675 +#, c-format +msgid "invalid adnum value %d for table \"%s\"" +msgstr "資料表 \"%2$s\" çš„ adnum 值 %1$d 的無效" + +#: pg_dump.c:8769 +#, c-format +msgid "finding table check constraints" +msgstr "尋找表格的檢查約æŸ" + +#: pg_dump.c:8823 +#, c-format +msgid "expected %d check constraint on table \"%s\" but found %d" +msgid_plural "expected %d check constraints on table \"%s\" but found %d" +msgstr[0] "é æœŸåœ¨è³‡æ–™è¡¨ \"%2$s\" 上有 %1$d 個檢查約æŸï¼Œä½†æ‰¾åˆ° %3$d 個" + +#: pg_dump.c:8827 +#, c-format +msgid "The system catalogs might be corrupted." +msgstr "系統目錄å¯èƒ½å·²ææ¯€" + +# catalog/aclchk.c:1917 +#: pg_dump.c:9517 +#, c-format +msgid "role with OID %u does not exist" +msgstr "OID 為 %u 的角色ä¸å­˜åœ¨" + +#: pg_dump.c:9629 pg_dump.c:9658 +#, c-format +msgid "unsupported pg_init_privs entry: %u %u %d" +msgstr "䏿”¯æ´çš„ pg_init_privs 項目:%u %u %d" + +#: pg_dump.c:10479 +#, c-format +msgid "typtype of data type \"%s\" appears to be invalid" +msgstr "資料型別 \"%s\" çš„ typtype 似乎無效" + +#: pg_dump.c:12053 +#, c-format +msgid "unrecognized provolatile value for function \"%s\"" +msgstr "函數 \"%s\" çš„ provolatile 值無法識別" + +#: pg_dump.c:12103 pg_dump.c:13985 +#, c-format +msgid "unrecognized proparallel value for function \"%s\"" +msgstr "函數 \"%s\" çš„ proparallel 值無法識別" + +# access/heap/heapam.c:495 +#: pg_dump.c:12233 pg_dump.c:12339 pg_dump.c:12346 +#, c-format +msgid "could not find function definition for function with OID %u" +msgstr "找ä¸åˆ° OID 為 %u 的函數定義" + +#: pg_dump.c:12272 +#, c-format +msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" +msgstr "pg_cast.castfunc 或 pg_cast.castmethod 欄ä½çš„內容是å½é€ çš„" + +#: pg_dump.c:12275 +#, c-format +msgid "bogus value in pg_cast.castmethod field" +msgstr "pg_cast.castmethod 欄ä½çš„內容是å½é€ çš„" + +#: pg_dump.c:12365 +#, c-format +msgid "bogus transform definition, at least one of trffromsql and trftosql should be nonzero" +msgstr "轉æ›å®šç¾©æ˜¯å½é€ çš„,trffromsql å’Œ trftosql 至少其中一個應為éžé›¶å€¼" + +#: pg_dump.c:12382 +#, c-format +msgid "bogus value in pg_transform.trffromsql field" +msgstr "pg_transform.trffromsql 欄ä½çš„內容是å½é€ çš„" + +#: pg_dump.c:12403 +#, c-format +msgid "bogus value in pg_transform.trftosql field" +msgstr "pg_transform.trftosql 欄ä½çš„內容是å½é€ çš„" + +# catalog/pg_proc.c:487 +#: pg_dump.c:12548 +#, c-format +msgid "postfix operators are not supported anymore (operator \"%s\")" +msgstr "ä¸å†æ”¯æ´å¾Œç½®é‹ç®—符(é‹ç®—符 \"%s\")" + +#: pg_dump.c:12718 +#, c-format +msgid "could not find operator with OID %s" +msgstr "找ä¸åˆ° OID 為 %s çš„é‹ç®—符" + +# parser/parse_type.c:372 parser/parse_type.c:467 +#: pg_dump.c:12786 +#, c-format +msgid "invalid type \"%c\" of access method \"%s\"" +msgstr "å­˜å–æ–¹æ³• \"%2$s\" 的類型 \"%1$c\" 無效" + +# utils/misc/guc.c:3281 utils/misc/guc.c:3970 utils/misc/guc.c:4006 +# utils/misc/guc.c:4062 utils/misc/guc.c:4399 utils/misc/guc.c:4548 +#: pg_dump.c:13455 pg_dump.c:13514 +#, c-format +msgid "unrecognized collation provider: %s" +msgstr "ç„¡æ³•è­˜åˆ¥çš„å®šåºæä¾›è€…: %s" + +#: pg_dump.c:13464 pg_dump.c:13473 pg_dump.c:13483 pg_dump.c:13498 +#, c-format +msgid "invalid collation \"%s\"" +msgstr "ç„¡æ•ˆçš„å®šåº \"%s\"" + +#: pg_dump.c:13904 +#, c-format +msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" +msgstr "èšåˆå‡½æ•¸ \"%s\" çš„ aggfinalmodify 值無法識別" + +#: pg_dump.c:13960 +#, c-format +msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" +msgstr "èšåˆå‡½æ•¸ \"%s\" çš„ aggmfinalmodify 值無法識別" + +#: pg_dump.c:14677 +#, c-format +msgid "unrecognized object type in default privileges: %d" +msgstr "無法識別物件類型給é è¨­æ¬Šé™: %d" + +#: pg_dump.c:14693 +#, c-format +msgid "could not parse default ACL list (%s)" +msgstr "無法解æžé è¨­ ACL 清單(%s)" + +#: pg_dump.c:14775 +#, c-format +msgid "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" +msgstr "無法解æžé è¨­åˆå§‹ ACL 清單(%s)或é è¨­(%s)給物件 \"%s\"(%s)" + +#: pg_dump.c:14800 +#, c-format +msgid "could not parse ACL list (%s) or default (%s) for object \"%s\" (%s)" +msgstr "無法解æžé è¨­ ACL 清單(%s)或é è¨­(%s)給物件 \"%s\"(%s)" + +#: pg_dump.c:15341 +#, c-format +msgid "query to obtain definition of view \"%s\" returned no data" +msgstr "å–得檢視表 \"%s\" 定義的查詢未回傳資料" + +#: pg_dump.c:15344 +#, c-format +msgid "query to obtain definition of view \"%s\" returned more than one definition" +msgstr "å–得檢視表 \"%s\" 定義的查詢回傳一筆以上定義" + +#: pg_dump.c:15351 +#, c-format +msgid "definition of view \"%s\" appears to be empty (length zero)" +msgstr "檢視表 \"%s\" 的定義似乎是空的(長度為 0)" + +# commands/dbcommands.c:138 +#: pg_dump.c:15435 +#, c-format +msgid "WITH OIDS is not supported anymore (table \"%s\")" +msgstr "ä¸å†æ”¯æ´ WITH OIDS(資料表 \"%s\")" + +#: pg_dump.c:16359 +#, c-format +msgid "invalid column number %d for table \"%s\"" +msgstr "表格 \"%2$s\" 的欄ä½ç·¨è™Ÿ %1$d 無效" + +# postmaster/pgstat.c:1908 +#: pg_dump.c:16437 +#, c-format +msgid "could not parse index statistic columns" +msgstr "無法解æžç´¢å¼•統計欄ä½" + +# postmaster/pgstat.c:2234 +#: pg_dump.c:16439 +#, c-format +msgid "could not parse index statistic values" +msgstr "無法解æžç´¢å¼•統計內容" + +#: pg_dump.c:16441 +#, c-format +msgid "mismatched number of columns and values for index statistics" +msgstr "索引統計欄ä½å’Œå…§å®¹çš„æ•¸é‡ä¸ä¸€è‡´" + +#: pg_dump.c:16657 +#, c-format +msgid "missing index for constraint \"%s\"" +msgstr "ç¼ºå°‘ç´„æŸ \"%s\" 的索引" + +#: pg_dump.c:16892 +#, c-format +msgid "unrecognized constraint type: %c" +msgstr "無法識別的約æŸé¡žåž‹: %c" + +#: pg_dump.c:16993 pg_dump.c:17222 +#, c-format +msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" +msgid_plural "query to get data of sequence \"%s\" returned %d rows (expected 1)" +msgstr[0] "å–å¾—åºåˆ— \"%s\" 資料的查詢回傳 %d 筆資料(é æœŸ 1 ç­†)" + +# utils/adt/acl.c:1261 utils/adt/acl.c:1486 utils/adt/acl.c:1698 +# utils/adt/acl.c:1902 utils/adt/acl.c:2106 utils/adt/acl.c:2315 +# utils/adt/acl.c:2516 +#: pg_dump.c:17025 +#, c-format +msgid "unrecognized sequence type: %s" +msgstr "無法辨識的åºåˆ—類型: %s" + +# fe-exec.c:1204 +#: pg_dump.c:17314 +#, c-format +msgid "unexpected tgtype value: %d" +msgstr "éžé æœŸçš„ tgtype 值: %d" + +#: pg_dump.c:17386 +#, c-format +msgid "invalid argument string (%s) for trigger \"%s\" on table \"%s\"" +msgstr "觸發器 \"%2$s\" 在表格 \"%3$s\" ä¸Šçš„åƒæ•¸å­—串無效(%1$s)" + +#: pg_dump.c:17655 +#, c-format +msgid "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows returned" +msgstr "å–得資料表 \"%s\" çš„è¦å‰‡ \"%s\" 的查詢失敗: 回傳的資料筆數錯誤" + +# catalog/dependency.c:152 +#: pg_dump.c:17808 +#, c-format +msgid "could not find referenced extension %u" +msgstr "找ä¸åˆ°åƒè€ƒçš„æ“´å……功能 %u" + +#: pg_dump.c:17898 +#, c-format +msgid "mismatched number of configurations and conditions for extension" +msgstr "擴充功能的é…置和æ¢ä»¶çš„æ•¸é‡ä¸ä¸€è‡´" + +#: pg_dump.c:18030 +#, c-format +msgid "reading dependency data" +msgstr "讀å–ç›¸ä¾æ€§è³‡æ–™" + +#: pg_dump.c:18116 +#, c-format +msgid "no referencing object %u %u" +msgstr "沒有åƒè€ƒç‰©ä»¶ %u %u" + +#: pg_dump.c:18127 +#, c-format +msgid "no referenced object %u %u" +msgstr "沒有被åƒè€ƒç‰©ä»¶ %u %u" + +# commands/user.c:240 commands/user.c:371 +#: pg_dump_sort.c:422 +#, c-format +msgid "invalid dumpId %d" +msgstr "無效的 dumpId %d" + +# commands/dbcommands.c:263 +#: pg_dump_sort.c:428 +#, c-format +msgid "invalid dependency %d" +msgstr "ç„¡æ•ˆçš„ç›¸ä¾æ€§ %d" + +#: pg_dump_sort.c:661 +#, c-format +msgid "could not identify dependency loop" +msgstr "ç„¡æ³•è­˜åˆ¥ç›¸ä¾æ€§è¿´åœˆ" + +#: pg_dump_sort.c:1276 +#, c-format +msgid "there are circular foreign-key constraints on this table:" +msgid_plural "there are circular foreign-key constraints among these tables:" +msgstr[0] "資料表存在循環的外éµç´„æŸ:" + +#: pg_dump_sort.c:1281 +#, c-format +msgid "You might not be able to restore the dump without using --disable-triggers or temporarily dropping the constraints." +msgstr "è‹¥ä¸ä½¿ç”¨ --disable-triggers æˆ–è€…æš«æ™‚åˆªé™¤ç´„æŸæ¢ä»¶å¯èƒ½å°Žè‡´ç„¡æ³•還原備份" + +#: pg_dump_sort.c:1282 +#, c-format +msgid "Consider using a full dump instead of a --data-only dump to avoid this problem." +msgstr "è€ƒæ…®ä½¿ç”¨å®Œæ•´å‚™ä»½è€Œä¸æ˜¯ --data-only 備份以é¿å…這個å•題" + +#: pg_dump_sort.c:1294 +#, c-format +msgid "could not resolve dependency loop among these items:" +msgstr "無法解決這些項目之間的相ä¾è¿´åœˆ:" + +#: pg_dumpall.c:230 +#, c-format +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "ç¨‹å¼ \"%s\" 被 %s 需è¦ï¼Œä½†åœ¨ç›¸åŒç›®éŒ„下找ä¸åˆ° \"%s\"。" + +#: pg_dumpall.c:233 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "ç¨‹å¼ \"%s\" 被 \"%s\" 找到,但版本與 %s ä¸åŒ" + +#: pg_dumpall.c:382 +#, c-format +msgid "option --exclude-database cannot be used together with -g/--globals-only, -r/--roles-only, or -t/--tablespaces-only" +msgstr "é¸é … --exclude-database ä¸èƒ½èˆ‡ -g/--globals-only 或 -r/--roles-only 或 -t/--tablespaces-only 一起使用" + +#: pg_dumpall.c:390 +#, c-format +msgid "options -g/--globals-only and -r/--roles-only cannot be used together" +msgstr "é¸é … -g/--globals-only å’Œ -r/--roles-only ä¸èƒ½ä¸€èµ·ä½¿ç”¨" + +#: pg_dumpall.c:397 +#, c-format +msgid "options -g/--globals-only and -t/--tablespaces-only cannot be used together" +msgstr "é¸é … -g/--globals-only å’Œ -t/--tablespaces-only ä¸èƒ½ä¸€èµ·ä½¿ç”¨" + +#: pg_dumpall.c:407 +#, c-format +msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" +msgstr "é¸é … -r/--roles-only å’Œ -t/--tablespaces-only ä¸èƒ½ä¸€èµ·ä½¿ç”¨" + +#: pg_dumpall.c:469 pg_dumpall.c:1750 +#, c-format +msgid "could not connect to database \"%s\"" +msgstr "無法連線至資料庫\"%s\"" + +#: pg_dumpall.c:481 +#, c-format +msgid "" +"could not connect to databases \"postgres\" or \"template1\"\n" +"Please specify an alternative database." +msgstr "" +"無法連線至資料庫 \"postgres\" 或 \"template1\"\n" +"請指定å¦ä¸€å€‹è³‡æ–™åº«ã€‚" + +#: pg_dumpall.c:629 +#, c-format +msgid "" +"%s extracts a PostgreSQL database cluster into an SQL script file.\n" +"\n" +msgstr "" +"%s å°‡ PostgreSQL 資料庫å¢é›†æå–æˆ SQL 腳本檔\n" +"\n" + +#: pg_dumpall.c:631 +#, c-format +msgid " %s [OPTION]...\n" +msgstr "" + +#: pg_dumpall.c:634 +#, c-format +msgid " -f, --file=FILENAME output file name\n" +msgstr " -f, --file=FILENAME 輸出檔å稱\n" + +#: pg_dumpall.c:641 +#, c-format +msgid " -c, --clean clean (drop) databases before recreating\n" +msgstr " -c, --clean é‡å»ºä¹‹å‰æ¸…除(刪除)資料庫\n" + +#: pg_dumpall.c:643 +#, c-format +msgid " -g, --globals-only dump only global objects, no databases\n" +msgstr " -g, --globals-only åªå‚™ä»½å…¨åŸŸç‰©ä»¶ï¼Œä¸åŒ…括資料庫\n" + +#: pg_dumpall.c:644 pg_restore.c:456 +#, c-format +msgid " -O, --no-owner skip restoration of object ownership\n" +msgstr " -O, --no-owner è·³éŽç‰©ä»¶æ‰€æœ‰æ¬Šçš„還原\n" + +#: pg_dumpall.c:645 +#, c-format +msgid " -r, --roles-only dump only roles, no databases or tablespaces\n" +msgstr " -r, --roles-only åªå‚™ä»½è§’色,ä¸åŒ…括資料庫或表空間\n" + +#: pg_dumpall.c:647 +#, c-format +msgid " -S, --superuser=NAME superuser user name to use in the dump\n" +msgstr " -S, --superuser=NAME 備份時使用的超級使用者å稱\n" + +#: pg_dumpall.c:648 +#, c-format +msgid " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" +msgstr " -t, --tablespaces-only åªå‚™ä»½è¡¨ç©ºé–“,ä¸åŒ…括資料庫或角色\n" + +#: pg_dumpall.c:654 +#, c-format +msgid " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" +msgstr " --exclude-database=PATTERN 排除å稱符åˆPATTERN的資料庫\n" + +#: pg_dumpall.c:661 +#, c-format +msgid " --no-role-passwords do not dump passwords for roles\n" +msgstr " --no-role-passwords ä¸è¦å‚™ä»½è§’色的密碼\n" + +#: pg_dumpall.c:677 +#, c-format +msgid " -d, --dbname=CONNSTR connect using connection string\n" +msgstr " -d, --dbname=CONNSTR 用連線字串進行連線\n" + +#: pg_dumpall.c:679 +#, c-format +msgid " -l, --database=DBNAME alternative default database\n" +msgstr " -l, --database=DBNAME 替代的é è¨­è³‡æ–™åº«\n" + +#: pg_dumpall.c:686 +#, c-format +msgid "" +"\n" +"If -f/--file is not used, then the SQL script will be written to the standard\n" +"output.\n" +"\n" +msgstr "" +"\n" +"若未使用 -f/--file é¸é …,SQL 腳本將被寫入標準輸出。\n" +"\n" + +#: pg_dumpall.c:828 +#, c-format +msgid "role name starting with \"pg_\" skipped (%s)" +msgstr "è·³éŽä»¥ \"pg_\" 開頭的角色å稱(%s)" + +#: pg_dumpall.c:1050 +#, c-format +msgid "could not find a legal dump ordering for memberships in role \"%s\"" +msgstr "無法為角色 \"%s\" çš„æˆå“¡æ‰¾åˆ°åˆæ³•的備份順åº" + +#: pg_dumpall.c:1185 +#, c-format +msgid "could not parse ACL list (%s) for parameter \"%s\"" +msgstr "無法解æžåƒæ•¸ \"%2$s\" çš„ ACL 清單 (%1$s)" + +#: pg_dumpall.c:1303 +#, c-format +msgid "could not parse ACL list (%s) for tablespace \"%s\"" +msgstr "無法解æžè¡¨ç©ºé–“ \"%2$s\" çš„ ACL 清單 (%1$s)" + +#: pg_dumpall.c:1510 +#, c-format +msgid "excluding database \"%s\"" +msgstr "排除資料庫 \"%s\"" + +#: pg_dumpall.c:1514 +#, c-format +msgid "dumping database \"%s\"" +msgstr "備份資料庫\"%s\"" + +#: pg_dumpall.c:1545 +#, c-format +msgid "pg_dump failed on database \"%s\", exiting" +msgstr "pg_dump 資料庫 \"%s\" å¤±æ•—ï¼ŒçµæŸ" + +# command.c:1148 +#: pg_dumpall.c:1551 +#, c-format +msgid "could not re-open the output file \"%s\": %m" +msgstr "ç„¡æ³•é‡æ–°é–‹å•Ÿè¼¸å‡ºæª” \"%s\": %m" + +#: pg_dumpall.c:1592 +#, c-format +msgid "running \"%s\"" +msgstr "執行 \"%s\"" + +#: pg_dumpall.c:1793 +#, c-format +msgid "could not get server version" +msgstr "無法å–得伺æœå™¨ç‰ˆæœ¬" + +#: pg_dumpall.c:1796 +#, c-format +msgid "could not parse server version \"%s\"" +msgstr "無法解æžä¼ºæœå™¨ç‰ˆæœ¬\"%s\"" + +#: pg_dumpall.c:1866 pg_dumpall.c:1889 +#, c-format +msgid "executing %s" +msgstr "執行 %s" + +#: pg_restore.c:313 +#, c-format +msgid "one of -d/--dbname and -f/--file must be specified" +msgstr "必須指定 -d/--dbname å’Œ -f/--file 其中之一" + +#: pg_restore.c:320 +#, c-format +msgid "options -d/--dbname and -f/--file cannot be used together" +msgstr "ä¸èƒ½åŒæ™‚使用 -d/--dbname å’Œ -f/--file é¸é …" + +#: pg_restore.c:338 +#, c-format +msgid "options -C/--create and -1/--single-transaction cannot be used together" +msgstr "ä¸èƒ½åŒæ™‚使用 -C/--create å’Œ -1/--single-transaction é¸é …" + +#: pg_restore.c:342 +#, c-format +msgid "cannot specify both --single-transaction and multiple jobs" +msgstr "ä¸èƒ½åŒæ™‚指定 --single-transaction 和多個工作" + +#: pg_restore.c:380 +#, c-format +msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" +msgstr "無法識別的å°å­˜æª”æ ¼å¼ \"%s\",請指定 \"c\" 或 \"d\" 或 \"t\"" + +#: pg_restore.c:419 +#, c-format +msgid "errors ignored on restore: %d" +msgstr "還原時忽略的錯誤: %d" + +#: pg_restore.c:432 +#, c-format +msgid "" +"%s restores a PostgreSQL database from an archive created by pg_dump.\n" +"\n" +msgstr "" +"%s 從 pg_dump 所產生的å°å­˜æª”還原 PostgreSQL 資料庫。\n" +"\n" + +#: pg_restore.c:434 +#, c-format +msgid " %s [OPTION]... [FILE]\n" +msgstr "" + +#: pg_restore.c:437 +#, c-format +msgid " -d, --dbname=NAME connect to database name\n" +msgstr " -d, --dbname=NAME 連線至資料庫å稱\n" + +#: pg_restore.c:438 +#, c-format +msgid " -f, --file=FILENAME output file name (- for stdout)\n" +msgstr " -f, --file=FILENAME 輸出檔å(- 代表標準輸出)\n" + +#: pg_restore.c:439 +#, c-format +msgid " -F, --format=c|d|t backup file format (should be automatic)\n" +msgstr " -F, --format=c|d|t 備份檔格å¼(æ‡‰æœƒè‡ªå‹•é¸æ“‡)\n" + +#: pg_restore.c:440 +#, c-format +msgid " -l, --list print summarized TOC of the archive\n" +msgstr " -l, --list 顯示å°å­˜æª”çš„ TOC 摘è¦\n" + +#: pg_restore.c:441 +#, c-format +msgid " -v, --verbose verbose mode\n" +msgstr " -v, --verbose 詳細模å¼\n" + +#: pg_restore.c:442 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version é¡¯ç¤ºç‰ˆæœ¬ï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_restore.c:443 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help é¡¯ç¤ºèªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_restore.c:445 +#, c-format +msgid "" +"\n" +"Options controlling the restore:\n" +msgstr "" +"\n" +"還原控制é¸é …:\n" + +#: pg_restore.c:446 +#, c-format +msgid " -a, --data-only restore only the data, no schema\n" +msgstr " -a, --data-only åªé‚„原資料,ä¸åŒ…括 schema\n" + +#: pg_restore.c:448 +#, c-format +msgid " -C, --create create the target database\n" +msgstr " -C, --create 建立目標資料庫\n" + +#: pg_restore.c:449 +#, c-format +msgid " -e, --exit-on-error exit on error, default is to continue\n" +msgstr " -e, --exit-on-error ç™¼ç”ŸéŒ¯èª¤å°±çµæŸï¼Œé è¨­æ˜¯ç¹¼çºŒåŸ·è¡Œ\n" + +#: pg_restore.c:450 +#, c-format +msgid " -I, --index=NAME restore named index\n" +msgstr " -I, --index=NAME 還原指定的索引\n" + +#: pg_restore.c:451 +#, c-format +msgid " -j, --jobs=NUM use this many parallel jobs to restore\n" +msgstr " -j, --jobs=NUM 用這麼多並行工作進行還原\n" + +#: pg_restore.c:452 +#, c-format +msgid "" +" -L, --use-list=FILENAME use table of contents from this file for\n" +" selecting/ordering output\n" +msgstr " -L, --use-list=FILENAME ç”¨æª”æ¡ˆä¸­çš„ç›®éŒ„è¡¨ä¾†é¸æ“‡/排åºè¼¸å‡º\n" + +#: pg_restore.c:454 +#, c-format +msgid " -n, --schema=NAME restore only objects in this schema\n" +msgstr " -n, --schema=NAME åªé‚„原指定 schema 中的物件\n" + +#: pg_restore.c:455 +#, c-format +msgid " -N, --exclude-schema=NAME do not restore objects in this schema\n" +msgstr " -N, --exclude-schema=NAME ä¸è¦é‚„原指定 schema 中的物件\n" + +#: pg_restore.c:457 +#, c-format +msgid " -P, --function=NAME(args) restore named function\n" +msgstr " -P, --function=NAME(args) 還原指定的函數\n" + +#: pg_restore.c:458 +#, c-format +msgid " -s, --schema-only restore only the schema, no data\n" +msgstr " -s, --schema-only åªé‚„原 schema,ä¸åŒ…å«è³‡æ–™\n" + +#: pg_restore.c:459 +#, c-format +msgid " -S, --superuser=NAME superuser user name to use for disabling triggers\n" +msgstr " -S, --superuser=NAME 用於åœç”¨è§¸ç™¼å™¨çš„超級使用者å稱\n" + +#: pg_restore.c:460 +#, c-format +msgid " -t, --table=NAME restore named relation (table, view, etc.)\n" +msgstr " -t, --table=NAME 還原指定的關è¯(è³‡æ–™è¡¨ã€æª¢è¦–表等)\n" + +#: pg_restore.c:461 +#, c-format +msgid " -T, --trigger=NAME restore named trigger\n" +msgstr " -T, --trigger=NAME 還原指定的觸發器\n" + +#: pg_restore.c:462 +#, c-format +msgid " -x, --no-privileges skip restoration of access privileges (grant/revoke)\n" +msgstr " -x, --no-privileges ä¸é‚„åŽŸå­˜å–æ¬Šé™(grant/revoke)\n" + +#: pg_restore.c:463 +#, c-format +msgid " -1, --single-transaction restore as a single transaction\n" +msgstr " -1, --single-transaction 用一個交易還原\n" + +#: pg_restore.c:465 +#, c-format +msgid " --enable-row-security enable row security\n" +msgstr " --enable-row-security 啟動列層級安全性\n" + +#: pg_restore.c:467 +#, c-format +msgid " --no-comments do not restore comments\n" +msgstr " --no-comments ä¸è¦é‚„原註釋\n" + +#: pg_restore.c:468 +#, c-format +msgid "" +" --no-data-for-failed-tables do not restore data of tables that could not be\n" +" created\n" +msgstr " --no-data-for-failed-tables ä¸è¦ç‚ºç„¡æ³•建立的資料表還原資料\n" + +#: pg_restore.c:470 +#, c-format +msgid " --no-publications do not restore publications\n" +msgstr " --no-publications ä¸è¦é‚„原發布\n" + +#: pg_restore.c:471 +#, c-format +msgid " --no-security-labels do not restore security labels\n" +msgstr " --no-security-labels ä¸è¦é‚„原安全性標籤\n" + +#: pg_restore.c:472 +#, c-format +msgid " --no-subscriptions do not restore subscriptions\n" +msgstr " --no-subscriptions ä¸è¦é‚„原訂閱\n" + +#: pg_restore.c:473 +#, c-format +msgid " --no-table-access-method do not restore table access methods\n" +msgstr " --no-table-access-method ä¸è¦é‚„åŽŸè³‡æ–™è¡¨å­˜å–æ–¹å¼\n" + +#: pg_restore.c:474 +#, c-format +msgid " --no-tablespaces do not restore tablespace assignments\n" +msgstr " --no-tablespaces ä¸è¦é‚„原表空間分é…\n" + +#: pg_restore.c:475 +#, c-format +msgid " --section=SECTION restore named section (pre-data, data, or post-data)\n" +msgstr "" +" --section=SECTION é‚„åŽŸæŒ‡å®šçš„å€æ®µ(pre-dataã€data 或 post-data)\n" +"\n" + +#: pg_restore.c:488 +#, c-format +msgid " --role=ROLENAME do SET ROLE before restore\n" +msgstr " --role=ROLENAME é‚„åŽŸä¹‹å‰ SET ROLE\n" + +#: pg_restore.c:490 +#, c-format +msgid "" +"\n" +"The options -I, -n, -N, -P, -t, -T, and --section can be combined and specified\n" +"multiple times to select multiple objects.\n" +msgstr "" +"\n" +"é¸é … -Iã€-nã€-Nã€-Pã€-tã€-T å’Œ --section å¯ä»¥åŒæ™‚ä½¿ç”¨ä¸¦å¤šæ¬¡æŒ‡å®šï¼Œä»¥é¸æ“‡å¤šå€‹ç‰©ä»¶\n" + +#: pg_restore.c:493 +#, c-format +msgid "" +"\n" +"If no input file name is supplied, then standard input is used.\n" +"\n" +msgstr "" +"\n" +"若未æä¾›è¼¸å…¥æª”å則會使用標準輸入。\n" +"\n" + +#, c-format +#~ msgid " --disable-triggers disable triggers during data-only restore\n" +#~ msgstr " --disable-triggers 在 data-only 還原期間åœç”¨è§¸ç™¼ç¨‹åº\n" + +#, c-format +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help é¡¯ç¤ºæ­¤èªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" + +#, c-format +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help é¡¯ç¤ºé€™ä»½èªªæ˜Žç„¶å¾ŒçµæŸ\n" + +#, c-format +#~ msgid "" +#~ " --use-set-session-authorization\n" +#~ " use SET SESSION AUTHORIZATION commands instead of\n" +#~ " ALTER OWNER commands to set ownership\n" +#~ msgstr "" +#~ " --use-set-session-authorization\n" +#~ " 使用 SET SESSION AUTHORIZATION 指令而éž\n" +#~ " ALTER OWNER æŒ‡ä»¤ä¾†è¨­å®šæ“æœ‰é—œä¿‚\n" + +#, c-format +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version è¼¸å‡ºç‰ˆæœ¬è³‡è¨Šï¼Œç„¶å¾ŒçµæŸ\n" + +#, c-format +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version é¡¯ç¤ºç‰ˆæœ¬è³‡è¨Šç„¶å¾ŒçµæŸ\n" + +#, c-format +#~ msgid " -O, --no-owner skip restoration of object ownership\n" +#~ msgstr " -O, --no-owner å¿½ç•¥è¨­å®šç‰©ä»¶æ“æœ‰é—œä¿‚的命令\n" + +#, c-format +#~ msgid " -Z, --compress=0-9 compression level for compressed formats\n" +#~ msgstr " -Z, --compress=0-9 壓縮格å¼çš„壓縮層級\n" + +#, c-format +#~ msgid " -c, --clean clean (drop) database objects before recreating\n" +#~ msgstr " -c, --clean é‡å»ºä¹‹å‰æ¸…除 (æ¨æ£„) 資料庫物件\n" + +#, c-format +#~ msgid " -o, --oids include OIDs in dump\n" +#~ msgstr " -o, --oids å°‡ OID 包å«åœ¨å‚™ä»½ä¸­\n" + +#, c-format +#~ msgid "%s: could not connect to database \"%s\": %s\n" +#~ msgstr "%s: 無法連線至資料庫\"%s\": %s\n" + +# command.c:1148 +#, c-format +#~ msgid "%s: could not open the output file \"%s\": %s\n" +#~ msgstr "%s: 無法開啟輸出檔 \"%s\":%s\n" + +#, c-format +#~ msgid "%s: could not parse version \"%s\"\n" +#~ msgstr "%s: 無法解譯版本 \"%s\"\n" + +#, c-format +#~ msgid "%s: executing %s\n" +#~ msgstr "%s: 執行 %s\n" + +#~ msgid "%s: invalid -X option -- %s\n" +#~ msgstr "%s: 無效的 -X é¸é … -- %s\n" + +#, c-format +#~ msgid "%s: out of memory\n" +#~ msgstr "%s: 記憶體用盡\n" + +#~ msgid "(The INSERT command cannot set OIDs.)\n" +#~ msgstr "(INSERT命令ä¸èƒ½è¨­å®šOID。)\n" + +#~ msgid "*** aborted because of error\n" +#~ msgstr "*** 因為發生錯誤而中止\n" + +#~ msgid "-C and -1 are incompatible options\n" +#~ msgstr "-C å’Œ -1 是ä¸ç›¸å®¹é¸é …\n" + +#~ msgid "-C and -c are incompatible options\n" +#~ msgstr "-C å’Œ -c é¸é …ä¸å¯ä»¥åŒæ™‚使?\n" + +#~ msgid "SQL command failed\n" +#~ msgstr "SQL命令失敗\n" + +#, c-format +#~ msgid "TOC Entry %s at %s (length %lu, checksum %d)\n" +#~ msgstr "TOC Entry %s æ–¼ %s (長度 %lu,checksum %d)\n" + +#, c-format +#~ msgid "" +#~ "The program \"pg_dump\" is needed by %s but was not found in the\n" +#~ "same directory as \"%s\".\n" +#~ "Check your installation.\n" +#~ msgstr "" +#~ "%s 需è¦\"pg_dump\"程å¼ï¼Œä½†æ˜¯åœ¨èˆ‡\"%s\"相åŒçš„目錄中找ä¸åˆ°ã€‚\n" +#~ "請檢查你的安è£ã€‚\n" + +#, c-format +#~ msgid "" +#~ "The program \"pg_dump\" was found by \"%s\"\n" +#~ "but was not the same version as %s.\n" +#~ "Check your installation.\n" +#~ msgstr "" +#~ "%s 已找到\"pg_dump\"程å¼ï¼Œä½†æ˜¯èˆ‡\"%s\"版本ä¸ç¬¦ã€‚\n" +#~ "請檢查你的安è£ã€‚\n" + +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "執行 \"%s --help\" 以顯示更多資訊。\n" + +#~ msgid "" +#~ "WARNING:\n" +#~ " This format is for demonstration purposes; it is not intended for\n" +#~ " normal use. Files will be written in the current working directory.\n" +#~ msgstr "" +#~ "警告: \n" +#~ " 這種格å¼åƒ…ç”¨æ–¼ç¤ºç¯„ï¼Œä¸æ˜¯ç”¨ä¾†åšä¸€èˆ¬å‚™ä»½ï¼Œæª”案會被\n" +#~ " 寫至目å‰çš„工作目錄\n" + +#, c-format +#~ msgid "WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n" +#~ msgstr "警告: 此資料庫版本無法正確備份aggregate function %s,予以忽略\n" + +#~ msgid "WARNING: bogus value in proargmodes array\n" +#~ msgstr "警告: proargmodes 陣列中有å½å€¼\n" + +#~ msgid "WARNING: could not parse proallargtypes array\n" +#~ msgstr "警告: 無法解譯 proallargtypes 陣列\n" + +#~ msgid "WARNING: could not parse proargnames array\n" +#~ msgstr "警告: 無法解讀proargnames陣列\n" + +#~ msgid "WARNING: could not parse proconfig array\n" +#~ msgstr "警告: 無法解譯 proconfig 陣列\n" + +#~ msgid "WARNING: ftell mismatch with expected position -- ftell used\n" +#~ msgstr "警告: ftellèˆ‡é æœŸä½ç½®ä¸ç¬¦ -- 已使用ftell\n" + +#, c-format +#~ msgid "WARNING: owner of aggregate function \"%s\" appears to be invalid\n" +#~ msgstr "警告: aggregate function \"%s\"çš„æ“æœ‰è€…無效\n" + +#, c-format +#~ msgid "WARNING: owner of function \"%s\" appears to be invalid\n" +#~ msgstr "警告: 函å¼\"%s\"çš„æ“æœ‰è€…無效\n" + +#, c-format +#~ msgid "WARNING: owner of operator \"%s\" appears to be invalid\n" +#~ msgstr "警告: operator \"%s\"çš„æ“æœ‰è€…無效\n" + +#, c-format +#~ msgid "WARNING: owner of operator class \"%s\" appears to be invalid\n" +#~ msgstr "警告: operator class \"%s\"çš„æ“æœ‰è€…無效\n" + +#, c-format +#~ msgid "WARNING: owner of operator family \"%s\" appears to be invalid\n" +#~ msgstr "警告: é‹ç®—å­å®¶æ— \"%s\" çš„æ“æœ‰è€…無效\n" + +#, c-format +#~ msgid "WARNING: owner of schema \"%s\" appears to be invalid\n" +#~ msgstr "警告: schema \"%s\"çš„æ“æœ‰è€…無效\n" + +#, c-format +#~ msgid "WARNING: owner of table \"%s\" appears to be invalid\n" +#~ msgstr "警告: 資料表\"%s\"çš„æ“æœ‰è€…無效\n" + +#~ msgid "WARNING: requested compression not available in this installation -- archive will be uncompressed\n" +#~ msgstr "警告: 程å¼ä¸æ”¯æ´è¦æ±‚使用的壓縮法 -- å‚™ä»½æª”å°‡ä¸æœƒè¢«å£“縮\n" + +#, c-format +#~ msgid "allocating AH for %s, format %d\n" +#~ msgstr "為 %s é…ç½®AHï¼Œæ ¼å¼ %d\n" + +#~ msgid "archive member too large for tar format\n" +#~ msgstr "taræ ¼å¼ä¸­çš„備份檔æˆå“¡å¤ªå¤§\n" + +#~ msgid "archiver" +#~ msgstr "壓縮器" + +#~ msgid "archiver (db)" +#~ msgstr "壓縮器(db)" + +#~ msgid "attempting to ascertain archive format\n" +#~ msgstr "嘗試確èªå‚™ä»½æª”æ ¼å¼\n" + +# fe-exec.c:653 +# fe-exec.c:705 +# fe-exec.c:745 +#~ msgid "cannot duplicate null pointer\n" +#~ msgstr "無法複製 Null 指標\n" + +#~ msgid "cannot reopen non-seekable file\n" +#~ msgstr "ç„¡æ³•é‡æ–°é–‹å•Ÿä¸å¯æœå°‹çš„æª”案\n" + +#~ msgid "cannot reopen stdin\n" +#~ msgstr "ç„¡æ³•é‡æ–°é–‹å•Ÿ stdin\n" + +#, c-format +#~ msgid "child process was terminated by signal %s" +#~ msgstr "å­é€²ç¨‹è¢«ä¿¡è™Ÿ %s 終止" + +#~ msgid "compression support is disabled in this format\n" +#~ msgstr "此種備份格å¼çš„壓縮支æ´è¢«é—œé–‰\n" + +#, c-format +#~ msgid "connecting to database \"%s\" as user \"%s\"\n" +#~ msgstr "連線至資料庫\"%s\"以使用者\"%s\"\n" + +# fe-misc.c:544 +# fe-misc.c:748 +#~ msgid "connection needs password\n" +#~ msgstr "連線需è¦å¯†ç¢¼\n" + +#, c-format +#~ msgid "connection to database \"%s\" failed: %s" +#~ msgstr "連線至資料庫\"%s\"失敗: %s" + +#, c-format +#~ msgid "could not change directory to \"%s\"" +#~ msgstr "無法切æ›ç›®éŒ„至\"%s\"" + +#~ msgid "could not close data file after reading\n" +#~ msgstr "讀å–後無法開啟資料檔\n" + +#~ msgid "could not close large object file\n" +#~ msgstr "無法關閉large object檔\n" + +#~ msgid "could not close tar member\n" +#~ msgstr "無法關閉taræˆå“¡\n" + +# fe-connect.c:1197 +#, c-format +#~ msgid "could not create worker thread: %s\n" +#~ msgstr "無法建立工作者執行緒:%s\n" + +#, c-format +#~ msgid "could not find block ID %d in archive -- possibly due to out-of-order restore request, which cannot be handled due to lack of data offsets in archive\n" +#~ msgstr "在å°å­˜æª”中找ä¸åˆ°å€å¡Š ID %d,å¯èƒ½æ˜¯å¤±åºçš„é‚„åŽŸè¦æ±‚所致,因為å°å­˜æª”中缺ä¹è³‡æ–™ä½ç§»ï¼Œæ‰€ä»¥ç„¡æ³•加以處ç†\n" + +#~ msgid "could not find entry for pg_indexes in pg_class\n" +#~ msgstr "pg_class中找ä¸åˆ°pg_indexes\n" + +#~ msgid "could not find slot of finished worker\n" +#~ msgstr "找ä¸åˆ°å®Œæˆçš„工作者ä½ç½®\n" + +#~ msgid "could not open large object\n" +#~ msgstr "無法開啟large object\n" + +#, c-format +#~ msgid "could not open large object TOC for input: %s\n" +#~ msgstr "無法開啟large object TOCåšè¼¸å…¥: %s\n" + +#, c-format +#~ msgid "could not open large object TOC for output: %s\n" +#~ msgstr "無法開啟large object TOCåšè¼¸å‡º: %s\n" + +#, c-format +#~ msgid "could not open output file \"%s\" for writing\n" +#~ msgstr "無法開啟並寫入備份檔\"%s\"\n" + +#~ msgid "could not open temporary file\n" +#~ msgstr "無法開啟暫存檔\n" + +#~ msgid "could not output padding at end of tar member\n" +#~ msgstr "無法輸出填充內容至taræˆå“¡ä¹‹å¾Œ\n" + +#, c-format +#~ msgid "could not parse version string \"%s\"\n" +#~ msgstr "無法解讀版本字串\"%s\"\n" + +#, c-format +#~ msgid "could not read symbolic link \"%s\"" +#~ msgstr "無法讀å–符號連çµ\"%s\"" + +#~ msgid "could not write byte\n" +#~ msgstr "無法寫入ä½å…ƒçµ„\n" + +#, c-format +#~ msgid "could not write byte: %s\n" +#~ msgstr "無法寫入ä½å…ƒçµ„: %s\n" + +#~ msgid "could not write null block at end of tar archive\n" +#~ msgstr "無法在tar備份檔寫入空å€å¡Š\n" + +#~ msgid "could not write to custom output routine\n" +#~ msgstr "無法寫入自定備份函å¼\n" + +#, c-format +#~ msgid "could not write to large object (result: %lu, expected: %lu)\n" +#~ msgstr "無法寫至large object(çµæžœ: %luï¼Œé æœŸ: %lu)\n" + +#~ msgid "custom archiver" +#~ msgstr "自定壓縮器" + +#~ msgid "dumpBlobs(): could not open large object: %s" +#~ msgstr "dumpBlobs(): 無法開啟large object: %s" + +#~ msgid "dumpDatabase(): could not find pg_largeobject.relfrozenxid\n" +#~ msgstr "dumpDatabase(): 找ä¸åˆ° pg_largeobject.relfrozenxid\n" + +#~ msgid "dumpDatabase(): could not find pg_largeobject_metadata.relfrozenxid\n" +#~ msgstr "dumpDatabase(): 找ä¸åˆ° pg_largeobject_metadata.relfrozenxid\n" + +#~ msgid "entering restore_toc_entries_parallel\n" +#~ msgstr "正在輸入 restore_toc_entries_parallel\n" + +#~ msgid "failed to connect to database\n" +#~ msgstr "連線至資料庫失敗\n" + +#~ msgid "failed to reconnect to database\n" +#~ msgstr "釿–°é€£ç·šè‡³è³‡æ–™åº«å¤±æ•—\n" + +#~ msgid "file archiver" +#~ msgstr "檔案壓縮器" + +#, c-format +#~ msgid "finding default expressions of table \"%s\"\n" +#~ msgstr "尋找資料表\"%s\"çš„é è¨­expressions\n" + +#, c-format +#~ msgid "finding the columns and types of table \"%s\"\n" +#~ msgstr "尋找資料表\"%s\"的欄ä½å’Œåž‹åˆ¥\n" + +#~ msgid "found more than one entry for pg_indexes in pg_class\n" +#~ msgstr "pg_class中發ç¾ä¸€å€‹ä»¥ä¸Šçš„pg_indexes\n" + +#~ msgid "found more than one pg_database entry for this database\n" +#~ msgstr "資料庫中發ç¾ä¸€å€‹ä»¥ä¸Šçš„pg_database\n" + +#~ msgid "internal error -- neither th nor fh specified in tarReadRaw()\n" +#~ msgstr "內部錯誤 -- tarReadRaw()中未指定th或fh\n" + +#, c-format +#~ msgid "invalid COPY statement -- could not find \"copy\" in string \"%s\"\n" +#~ msgstr "éžæ³•çš„COPY敘述 -- 在字串\"%s\"中找ä¸åˆ°\"copy\"\n" + +#, c-format +#~ msgid "invalid COPY statement -- could not find \"from stdin\" in string \"%s\" starting at position %lu\n" +#~ msgstr "無效的COPY敘述 -- 找ä¸åˆ°\"from stdin\"於字串\"%s\"çš„ä½ç½® %lu\n" + +#, c-format +#~ msgid "mismatch in actual vs. predicted file position (%s vs. %s)\n" +#~ msgstr "實際檔案ä½ç½®(%s)èˆ‡é æœŸä½ç½®(%s)ä¸ç¬¦\n" + +#, c-format +#~ msgid "missing pg_database entry for database \"%s\"\n" +#~ msgstr "資料庫\"%s\"中沒有pg_database\n" + +#~ msgid "missing pg_database entry for this database\n" +#~ msgstr "資料庫中沒有pg_database\n" + +#, c-format +#~ msgid "moving from position %s to next member at file position %s\n" +#~ msgstr "從ä½ç½® %s ç§»è‡³ä½æ–¼æª”案ä½ç½® %s 的下一個æˆå“¡\n" + +#~ msgid "no item ready\n" +#~ msgstr "項目皆未就緒\n" + +#~ msgid "no label definitions found for enum ID %u\n" +#~ msgstr "找ä¸åˆ° enum ID %u 的標籤定義\n" + +#, c-format +#~ msgid "now at file position %s\n" +#~ msgstr "ç›®å‰åœ¨æª”案ä½ç½® %s\n" + +#~ msgid "options --inserts/--column-inserts and -o/--oids cannot be used together\n" +#~ msgstr "é¸é … --inserts/--column-inserts å’Œ -o/--oids ä¸èƒ½ä¸€èµ·ä½¿ç”¨\n" + +#~ msgid "parallel_restore should not return\n" +#~ msgstr "parallel_restore 䏿‡‰å‚³å›ž\n" + +#, c-format +#~ msgid "query returned more than one (%d) pg_database entry for database \"%s\"\n" +#~ msgstr "查詢傳回一個以上(%d)çš„pg_database於資料庫\"%s\"\n" + +#~ msgid "query returned no rows: %s\n" +#~ msgstr "查詢未傳回資料列:%s\n" + +#, c-format +#~ msgid "query to get data of sequence \"%s\" returned name \"%s\"\n" +#~ msgstr "å–å¾—sequence \"%s\"資料的查詢傳回å稱\"%s\"\n" + +#, c-format +#~ msgid "read TOC entry %d (ID %d) for %s %s\n" +#~ msgstr "讀å–TOC entry %d (ID %d)給%s %s\n" + +#, c-format +#~ msgid "reading triggers for table \"%s\"\n" +#~ msgstr "為資料表\"%s\"讀å–triggers\n" + +#, c-format +#~ msgid "reducing dependencies for %d\n" +#~ msgstr "正在減少 %d çš„ç›¸ä¾æ€§\n" + +#, c-format +#~ msgid "restoring large object OID %u\n" +#~ msgstr "還原large object OID %u\n" + +#~ msgid "saving large object comments\n" +#~ msgstr "正在儲存大型物件註解\n" + +#, c-format +#~ msgid "schema with OID %u does not exist\n" +#~ msgstr "OID為%uçš„schemaä¸å­˜åœ¨\n" + +#~ msgid "server version must be at least 7.3 to use schema selection switches\n" +#~ msgstr "伺æœå™¨ç‰ˆæœ¬å¿…須至少是 7.3,æ‰èƒ½ä½¿ç”¨ç¶²è¦é¸å–åƒæ•¸\n" + +#, c-format +#~ msgid "setting owner and privileges for %s %s\n" +#~ msgstr "為 %s %s è¨­å®šæ“æœ‰è€…和權é™\n" + +#, c-format +#~ msgid "skipping tar member %s\n" +#~ msgstr "è·³éŽtaræˆå“¡ %s\n" + +#~ msgid "tar archiver" +#~ msgstr "tar壓縮器" + +#, c-format +#~ msgid "transferring dependency %d -> %d to %d\n" +#~ msgstr "正在轉é€ç›¸ä¾æ€§ %d -> %d 到 %d\n" + +# utils/adt/rowtypes.c:178 utils/adt/rowtypes.c:186 +#~ msgid "unexpected end of file\n" +#~ msgstr "éžé æœŸçš„æª”案çµå°¾\n" + +#, c-format +#~ msgid "worker process crashed: status %d\n" +#~ msgstr "背景工作處ç†åºå·²ææ¯€: 狀態 %d\n" diff --git a/src/bin/pg_dump/t/001_basic.pl b/src/bin/pg_dump/t/001_basic.pl index 8c63d31cb662e..b9d13a0e1dee8 100644 --- a/src/bin/pg_dump/t/001_basic.pl +++ b/src/bin/pg_dump/t/001_basic.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index 63bb4689d448c..5bcc2244d5831 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -109,11 +109,11 @@ '--format=directory', '--compress=gzip:1', "--file=$tempdir/compression_gzip_dir", 'postgres', ], - # Give coverage for manually compressed blob.toc files during + # Give coverage for manually compressed blobs.toc files during # restore. compress_cmd => { program => $ENV{'GZIP_PROGRAM'}, - args => [ '-f', "$tempdir/compression_gzip_dir/blobs.toc", ], + args => [ '-f', "$tempdir/compression_gzip_dir/blobs_*.toc", ], }, # Verify that only data files were compressed glob_patterns => [ @@ -172,16 +172,6 @@ '--format=directory', '--compress=lz4:1', "--file=$tempdir/compression_lz4_dir", 'postgres', ], - # Give coverage for manually compressed blob.toc files during - # restore. - compress_cmd => { - program => $ENV{'LZ4'}, - args => [ - '-z', '-f', '--rm', - "$tempdir/compression_lz4_dir/blobs.toc", - "$tempdir/compression_lz4_dir/blobs.toc.lz4", - ], - }, # Verify that data files were compressed glob_patterns => [ "$tempdir/compression_lz4_dir/toc.dat", @@ -242,14 +232,13 @@ '--format=directory', '--compress=zstd:1', "--file=$tempdir/compression_zstd_dir", 'postgres', ], - # Give coverage for manually compressed blob.toc files during + # Give coverage for manually compressed blobs.toc files during # restore. compress_cmd => { program => $ENV{'ZSTD'}, args => [ '-z', '-f', - '--rm', "$tempdir/compression_zstd_dir/blobs.toc", - "-o", "$tempdir/compression_zstd_dir/blobs.toc.zst", + '--rm', "$tempdir/compression_zstd_dir/blobs_*.toc", ], }, # Verify that data files were compressed @@ -413,7 +402,7 @@ }, glob_patterns => [ "$tempdir/defaults_dir_format/toc.dat", - "$tempdir/defaults_dir_format/blobs.toc", + "$tempdir/defaults_dir_format/blobs_*.toc", $supports_gzip ? "$tempdir/defaults_dir_format/*.dat.gz" : "$tempdir/defaults_dir_format/*.dat", ], @@ -818,7 +807,7 @@ regexp => qr/^\QALTER COLLATION public.test0 OWNER TO \E.+;/m, collation => 1, like => { %full_runs, section_pre_data => 1, }, - unlike => { %dump_test_schema_runs, no_owner => 1, }, + unlike => { no_owner => 1, }, }, 'ALTER FOREIGN DATA WRAPPER dummy OWNER TO' => { @@ -923,7 +912,7 @@ column_inserts => 1, data_only => 1, inserts => 1, - section_pre_data => 1, + section_data => 1, test_schema_plus_large_objects => 1, }, unlike => { @@ -977,7 +966,7 @@ create_sql => 'ALTER SCHEMA public OWNER TO "regress_quoted \"" role";', regexp => qr/^(GRANT|REVOKE)/m, - unlike => { defaults_public_owner => 1 }, + like => {}, }, 'ALTER SEQUENCE test_table_col1_seq' => { @@ -1165,7 +1154,7 @@ 'ALTER FOREIGN TABLE foreign_table ALTER COLUMN c1 OPTIONS' => { regexp => qr/^ - \QALTER FOREIGN TABLE dump_test.foreign_table ALTER COLUMN c1 OPTIONS (\E\n + \QALTER FOREIGN TABLE ONLY dump_test.foreign_table ALTER COLUMN c1 OPTIONS (\E\n \s+\Qcolumn_name 'col1'\E\n \Q);\E\n /xm, @@ -1285,9 +1274,7 @@ { %full_runs, %dump_test_schema_runs, section_pre_data => 1, }, unlike => { exclude_dump_test_schema => 1, - only_dump_test_table => 1, no_owner => 1, - role => 1, only_dump_measurement => 1, }, }, @@ -1302,7 +1289,7 @@ column_inserts => 1, data_only => 1, inserts => 1, - section_pre_data => 1, + section_data => 1, test_schema_plus_large_objects => 1, }, unlike => { @@ -1351,7 +1338,6 @@ binary_upgrade => 1, no_large_objects => 1, schema_only => 1, - section_pre_data => 1, }, }, @@ -1511,7 +1497,7 @@ column_inserts => 1, data_only => 1, inserts => 1, - section_pre_data => 1, + section_data => 1, test_schema_plus_large_objects => 1, }, unlike => { @@ -1907,6 +1893,33 @@ }, }, + 'CREATE TABLESPACE regress_dump_tablespace' => { + create_order => 2, + create_sql => q( + SET allow_in_place_tablespaces = on; + CREATE TABLESPACE regress_dump_tablespace + OWNER regress_dump_test_role LOCATION ''), + regexp => + qr/^CREATE TABLESPACE regress_dump_tablespace OWNER regress_dump_test_role LOCATION '';/m, + like => { + pg_dumpall_dbprivs => 1, + pg_dumpall_exclude => 1, + pg_dumpall_globals => 1, + pg_dumpall_globals_clean => 1, + }, + }, + + 'CREATE DATABASE regression_invalid...' => { + create_order => 1, + create_sql => q( + CREATE DATABASE regression_invalid; + UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid'), + regexp => qr/^CREATE DATABASE regression_invalid/m, + + # invalid databases should never be dumped + like => {}, + }, + 'CREATE ACCESS METHOD gist2' => { create_order => 52, create_sql => @@ -3183,7 +3196,6 @@ binary_upgrade => 1, exclude_dump_test_schema => 1, schema_only => 1, - only_dump_measurement => 1, }, }, @@ -3430,7 +3442,6 @@ 'Disabled trigger on partition is not created' => { regexp => qr/CREATE TRIGGER test_trigger.*ON dump_test_second_schema/, like => {}, - unlike => { %full_runs, %dump_test_schema_runs }, }, # Triggers on partitions should not be dropped individually @@ -3720,14 +3731,15 @@ 'CREATE STATISTICS extended_stats_no_options' => { create_order => 97, create_sql => 'CREATE STATISTICS dump_test.test_ext_stats_no_options - ON col1, col2 FROM dump_test.test_fifth_table', + ON col1, col2 FROM dump_test.test_table', regexp => qr/^ - \QCREATE STATISTICS dump_test.test_ext_stats_no_options ON col1, col2 FROM dump_test.test_fifth_table;\E + \QCREATE STATISTICS dump_test.test_ext_stats_no_options ON col1, col2 FROM dump_test.test_table;\E /xms, like => { %full_runs, %dump_test_schema_runs, section_post_data => 1, }, unlike => { exclude_dump_test_schema => 1, + exclude_test_table => 1, only_dump_measurement => 1, }, }, @@ -3807,35 +3819,10 @@ \QCREATE INDEX measurement_city_id_logdate_idx ON ONLY dump_test.measurement USING\E /xm, like => { - binary_upgrade => 1, - clean => 1, - clean_if_exists => 1, - compression => 1, - createdb => 1, - defaults => 1, - exclude_test_table => 1, - exclude_test_table_data => 1, - no_toast_compression => 1, - no_large_objects => 1, - no_privs => 1, - no_owner => 1, - no_table_access_method => 1, - only_dump_test_schema => 1, - pg_dumpall_dbprivs => 1, - pg_dumpall_exclude => 1, - schema_only => 1, - section_post_data => 1, - test_schema_plus_large_objects => 1, - only_dump_measurement => 1, - exclude_measurement_data => 1, + %full_runs, %dump_test_schema_runs, section_post_data => 1, }, unlike => { exclude_dump_test_schema => 1, - only_dump_test_table => 1, - pg_dumpall_globals => 1, - pg_dumpall_globals_clean => 1, - role => 1, - section_pre_data => 1, exclude_measurement => 1, }, }, @@ -3886,7 +3873,6 @@ role => 1, section_post_data => 1, only_dump_measurement => 1, - exclude_measurement_data => 1, }, unlike => { exclude_measurement => 1, @@ -3900,35 +3886,12 @@ \QALTER INDEX dump_test.measurement_pkey ATTACH PARTITION dump_test_second_schema.measurement_y2006m2_pkey\E /xm, like => { - binary_upgrade => 1, - clean => 1, - clean_if_exists => 1, - compression => 1, - createdb => 1, - defaults => 1, - exclude_dump_test_schema => 1, - exclude_test_table => 1, - exclude_test_table_data => 1, - no_toast_compression => 1, - no_large_objects => 1, - no_privs => 1, - no_owner => 1, - no_table_access_method => 1, - pg_dumpall_dbprivs => 1, - pg_dumpall_exclude => 1, + %full_runs, role => 1, - schema_only => 1, section_post_data => 1, only_dump_measurement => 1, - exclude_measurement_data => 1, }, unlike => { - only_dump_test_schema => 1, - only_dump_test_table => 1, - pg_dumpall_globals => 1, - pg_dumpall_globals_clean => 1, - section_pre_data => 1, - test_schema_plus_large_objects => 1, exclude_measurement => 1, }, }, @@ -4218,11 +4181,13 @@ 'GRANT SELECT ON TABLE measurement' => { create_order => 91, - create_sql => 'GRANT SELECT ON - TABLE dump_test.measurement - TO regress_dump_test_role;', + create_sql => 'GRANT SELECT ON TABLE dump_test.measurement + TO regress_dump_test_role; + GRANT SELECT(city_id) ON TABLE dump_test.measurement + TO "regress_quoted \"" role";', regexp => - qr/^\QGRANT SELECT ON TABLE dump_test.measurement TO regress_dump_test_role;\E/m, + qr/^\QGRANT SELECT ON TABLE dump_test.measurement TO regress_dump_test_role;\E\n.* + ^\QGRANT SELECT(city_id) ON TABLE dump_test.measurement TO "regress_quoted \"" role";\E/xms, like => { %full_runs, %dump_test_schema_runs, @@ -4275,7 +4240,7 @@ column_inserts => 1, data_only => 1, inserts => 1, - section_pre_data => 1, + section_data => 1, test_schema_plus_large_objects => 1, binary_upgrade => 1, }, @@ -4573,6 +4538,41 @@ no_table_access_method => 1, only_dump_measurement => 1, }, + }, + + # CREATE TABLE with partitioned table and various AMs. One + # partition uses the same default as the parent, and a second + # uses its own AM. + 'CREATE TABLE regress_pg_dump_table_part' => { + create_order => 19, + create_sql => ' + CREATE TABLE dump_test.regress_pg_dump_table_am_parent (id int) PARTITION BY LIST (id); + ALTER TABLE dump_test.regress_pg_dump_table_am_parent SET ACCESS METHOD regress_table_am; + CREATE TABLE dump_test.regress_pg_dump_table_am_child_1 + PARTITION OF dump_test.regress_pg_dump_table_am_parent FOR VALUES IN (1); + CREATE TABLE dump_test.regress_pg_dump_table_am_child_2 + PARTITION OF dump_test.regress_pg_dump_table_am_parent FOR VALUES IN (2) USING heap;', + regexp => qr/^ + \n\QCREATE TABLE dump_test.regress_pg_dump_table_am_parent (\E + (\n(?!SET[^;]+;)[^\n]*)* + \QALTER TABLE dump_test.regress_pg_dump_table_am_parent SET ACCESS METHOD regress_table_am;\E + (.*\n)* + \QSET default_table_access_method = regress_table_am;\E + (\n(?!SET[^;]+;)[^\n]*)* + \n\QCREATE TABLE dump_test.regress_pg_dump_table_am_child_1 (\E + (.*\n)* + \QSET default_table_access_method = heap;\E + (\n(?!SET[^;]+;)[^\n]*)* + \n\QCREATE TABLE dump_test.regress_pg_dump_table_am_child_2 (\E + (.*\n)*/xm, + like => { + %full_runs, %dump_test_schema_runs, section_pre_data => 1, + }, + unlike => { + exclude_dump_test_schema => 1, + no_table_access_method => 1, + only_dump_measurement => 1, + }, }); ######################################### @@ -4690,6 +4690,14 @@ qr/pg_dump: error: connection to server .* failed: FATAL: database "qqq" does not exist/, 'connecting to a non-existent database'); +######################################### +# Test connecting to an invalid database + +$node->command_fails_like( + [ 'pg_dump', '-d', 'regression_invalid' ], + qr/pg_dump: error: connection to server .* failed: FATAL: cannot connect to invalid database "regression_invalid"/, + 'connecting to an invalid database'); + ######################################### # Test connecting with an unprivileged user @@ -4734,6 +4742,12 @@ qr/pg_dumpall: error: improper qualified name \(too many dotted names\): myhost\.mydb/, 'pg_dumpall: option --exclude-database rejects multipart database names'); +############################################################## +# Test dumping pg_catalog (for research -- cannot be reloaded) + +$node->command_ok([ 'pg_dump', '-p', "$port", '-n', 'pg_catalog' ], + 'pg_dump: option -n pg_catalog'); + ######################################### # Test valid database exclusion patterns @@ -4828,8 +4842,13 @@ # not defined. next if (!defined($compress_program) || $compress_program eq ''); - my @full_compress_cmd = - ($compress_cmd->{program}, @{ $compress_cmd->{args} }); + # Arguments may require globbing. + my @full_compress_cmd = ($compress_program); + foreach my $arg (@{ $compress_cmd->{args} }) + { + push @full_compress_cmd, glob($arg); + } + command_ok(\@full_compress_cmd, "$run: compression commands"); } @@ -4884,6 +4903,22 @@ $test_db = $tests{$test}->{database}; } + # Check for proper test definitions + # + # There should be a "like" list, even if it is empty. (This + # makes the test more self-documenting.) + if (!defined($tests{$test}->{like})) + { + die "missing \"like\" in test \"$test\""; + } + # Check for useless entries in "unlike" list. Runs that are + # not listed in "like" don't need to be excluded in "unlike". + if ($tests{$test}->{unlike}->{$test_key} + && !defined($tests{$test}->{like}->{$test_key})) + { + die "useless \"unlike\" entry \"$test_key\" in test \"$test\""; + } + # Skip any collation-related commands if there is no collation support if (!$collation_support && defined($tests{$test}->{collation})) { diff --git a/src/bin/pg_dump/t/003_pg_dump_with_server.pl b/src/bin/pg_dump/t/003_pg_dump_with_server.pl index ab025c44a4325..b5a144555074d 100644 --- a/src/bin/pg_dump/t/003_pg_dump_with_server.pl +++ b/src/bin/pg_dump/t/003_pg_dump_with_server.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_dump/t/004_pg_dump_parallel.pl b/src/bin/pg_dump/t/004_pg_dump_parallel.pl index c4b461ed87fbb..a36ba8cf54887 100644 --- a/src/bin/pg_dump/t/004_pg_dump_parallel.pl +++ b/src/bin/pg_dump/t/004_pg_dump_parallel.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_dump/t/005_pg_dump_filterfile.pl b/src/bin/pg_dump/t/005_pg_dump_filterfile.pl new file mode 100644 index 0000000000000..a80e13a0d36f5 --- /dev/null +++ b/src/bin/pg_dump/t/005_pg_dump_filterfile.pl @@ -0,0 +1,799 @@ + +# Copyright (c) 2023-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $tempdir = PostgreSQL::Test::Utils::tempdir; +my $inputfile; + +my $node = PostgreSQL::Test::Cluster->new('main'); +my $port = $node->port; +my $backupdir = $node->backup_dir; +my $plainfile = "$backupdir/plain.sql"; + +$node->init; +$node->start; + +# Generate test objects +$node->safe_psql('postgres', 'CREATE FOREIGN DATA WRAPPER dummy;'); +$node->safe_psql('postgres', + 'CREATE SERVER dummyserver FOREIGN DATA WRAPPER dummy;'); + +$node->safe_psql('postgres', "CREATE TABLE table_one(a varchar)"); +$node->safe_psql('postgres', "CREATE TABLE table_two(a varchar)"); +$node->safe_psql('postgres', "CREATE TABLE table_three(a varchar)"); +$node->safe_psql('postgres', "CREATE TABLE table_three_one(a varchar)"); +$node->safe_psql('postgres', "CREATE TABLE footab(a varchar)"); +$node->safe_psql('postgres', "CREATE TABLE bootab() inherits (footab)"); +$node->safe_psql( + 'postgres', "CREATE TABLE \"strange aaa +name\"(a varchar)"); +$node->safe_psql( + 'postgres', "CREATE TABLE \" +t +t +\"(a int)"); + +$node->safe_psql('postgres', + "INSERT INTO table_one VALUES('*** TABLE ONE ***')"); +$node->safe_psql('postgres', + "INSERT INTO table_two VALUES('*** TABLE TWO ***')"); +$node->safe_psql('postgres', + "INSERT INTO table_three VALUES('*** TABLE THREE ***')"); +$node->safe_psql('postgres', + "INSERT INTO table_three_one VALUES('*** TABLE THREE_ONE ***')"); +$node->safe_psql('postgres', "INSERT INTO bootab VALUES(10)"); + +$node->safe_psql('postgres', "CREATE DATABASE sourcedb"); +$node->safe_psql('postgres', "CREATE DATABASE targetdb"); + +$node->safe_psql('sourcedb', + 'CREATE FUNCTION foo1(a int) RETURNS int AS $$ select $1 $$ LANGUAGE sql' +); +$node->safe_psql('sourcedb', + 'CREATE FUNCTION foo2(a int) RETURNS int AS $$ select $1 $$ LANGUAGE sql' +); +$node->safe_psql('sourcedb', + 'CREATE FUNCTION foo3(a double precision, b int) RETURNS double precision AS $$ select $1 + $2 $$ LANGUAGE sql' +); +$node->safe_psql('sourcedb', + 'CREATE FUNCTION foo_trg() RETURNS trigger AS $$ BEGIN RETURN NEW; END $$ LANGUAGE plpgsql' +); +$node->safe_psql('sourcedb', 'CREATE SCHEMA s1'); +$node->safe_psql('sourcedb', 'CREATE SCHEMA s2'); +$node->safe_psql('sourcedb', 'CREATE TABLE s1.t1(a int)'); +$node->safe_psql('sourcedb', 'CREATE SEQUENCE s1.s1'); +$node->safe_psql('sourcedb', 'CREATE TABLE s2.t2(a int)'); +$node->safe_psql('sourcedb', 'CREATE TABLE t1(a int, b int)'); +$node->safe_psql('sourcedb', 'CREATE TABLE t2(a int, b int)'); +$node->safe_psql('sourcedb', 'CREATE INDEX t1_idx1 ON t1(a)'); +$node->safe_psql('sourcedb', 'CREATE INDEX t1_idx2 ON t1(b)'); +$node->safe_psql('sourcedb', + 'CREATE TRIGGER trg1 BEFORE INSERT ON t1 EXECUTE FUNCTION foo_trg()'); +$node->safe_psql('sourcedb', + 'CREATE TRIGGER trg2 BEFORE INSERT ON t1 EXECUTE FUNCTION foo_trg()'); + +# +# Test interaction of correctly specified filter file +# +my ($cmd, $stdout, $stderr, $result); + +# Empty filterfile +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "\n # a comment and nothing more\n\n"; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "filter file without patterns"); + +my $dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE TABLE public\.table_one/m, "table one dumped"); +ok($dump =~ qr/^CREATE TABLE public\.table_two/m, "table two dumped"); +ok($dump =~ qr/^CREATE TABLE public\.table_three/m, "table three dumped"); +ok($dump =~ qr/^CREATE TABLE public\.table_three_one/m, + "table three one dumped"); + +# Test various combinations of whitespace, comments and correct filters +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile " include table table_one #comment\n"; +print $inputfile "include table table_two\n"; +print $inputfile "# skip this line\n"; +print $inputfile "\n"; +print $inputfile "\t\n"; +print $inputfile " \t# another comment\n"; +print $inputfile "exclude table_data table_one\n"; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "dump tables with filter patterns as well as comments and whitespace"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE TABLE public\.table_one/m, "dumped table one"); +ok($dump =~ qr/^CREATE TABLE public\.table_two/m, "dumped table two"); +ok($dump !~ qr/^CREATE TABLE public\.table_three/m, "table three not dumped"); +ok($dump !~ qr/^CREATE TABLE public\.table_three_one/m, + "table three_one not dumped"); +ok( $dump !~ qr/^COPY public\.table_one/m, + "content of table one is not included"); +ok($dump =~ qr/^COPY public\.table_two/m, "content of table two is included"); + +# Test dumping tables specified by qualified names +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include table public.table_one\n"; +print $inputfile "include table \"public\".\"table_two\"\n"; +print $inputfile "include table \"public\". table_three\n"; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "filter file without patterns"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE TABLE public\.table_one/m, "dumped table one"); +ok($dump =~ qr/^CREATE TABLE public\.table_two/m, "dumped table two"); +ok($dump =~ qr/^CREATE TABLE public\.table_three/m, "dumped table three"); + +# Test dumping all tables except one +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "exclude table table_one\n"; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "dump tables with exclusion of a single table"); + +$dump = slurp_file($plainfile); + +ok($dump !~ qr/^CREATE TABLE public\.table_one/m, "table one not dumped"); +ok($dump =~ qr/^CREATE TABLE public\.table_two/m, "dumped table two"); +ok($dump =~ qr/^CREATE TABLE public\.table_three/m, "dumped table three"); +ok($dump =~ qr/^CREATE TABLE public\.table_three_one/m, + "dumped table three_one"); + +# Test dumping tables with a wildcard pattern +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include table table_thre*\n"; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "dump tables with wildcard in pattern"); + +$dump = slurp_file($plainfile); + +ok($dump !~ qr/^CREATE TABLE public\.table_one/m, "table one not dumped"); +ok($dump !~ qr/^CREATE TABLE public\.table_two/m, "table two not dumped"); +ok($dump =~ qr/^CREATE TABLE public\.table_three/m, "dumped table three"); +ok($dump =~ qr/^CREATE TABLE public\.table_three_one/m, + "dumped table three_one"); + +# Test dumping table with multiline quoted tablename +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include table \"strange aaa +name\""; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "dump tables with multiline names requiring quoting"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE TABLE public.\"strange aaa/m, + "dump table with new line in name"); + +# Test excluding multiline quoted tablename from dump +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "exclude table \"strange aaa\\nname\""; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "dump tables with filter"); + +$dump = slurp_file($plainfile); + +ok($dump !~ qr/^CREATE TABLE public.\"strange aaa/m, + "dump table with new line in name"); + +# Test excluding an entire schema +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "exclude schema public\n"; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "exclude the public schema"); + +$dump = slurp_file($plainfile); + +ok($dump !~ qr/^CREATE TABLE/m, "no table dumped"); + +# Test including and excluding an entire schema by multiple filterfiles +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include schema public\n"; +close $inputfile; + +open my $alt_inputfile, '>', "$tempdir/inputfile2.txt" + or die "unable to open filterfile for writing"; +print $alt_inputfile "exclude schema public\n"; +close $alt_inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", + "--filter=$tempdir/inputfile2.txt", 'postgres' + ], + "exclude the public schema with multiple filters"); + +$dump = slurp_file($plainfile); + +ok($dump !~ qr/^CREATE TABLE/m, "no table dumped"); + +# Test dumping a table with a single leading newline on a row +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include table \" +t +t +\""; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "dump tables with filter"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE TABLE public.\"\nt\nt\n\" \($/ms, + "dump table with multiline strange name"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include table \"\\nt\\nt\\n\""; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "dump tables with filter"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE TABLE public.\"\nt\nt\n\" \($/ms, + "dump table with multiline strange name"); + +######################################### +# Test foreign_data + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include foreign_data doesnt_exists\n"; +close $inputfile; + +command_fails_like( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + qr/pg_dump: error: no matching foreign servers were found for pattern/, + "dump nonexisting foreign server"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile, "include foreign_data dummyserver\n"; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "dump foreign_data with filter"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE SERVER dummyserver/m, "dump foreign server"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "exclude foreign_data dummy*\n"; +close $inputfile; + +command_fails_like( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + qr/exclude filter for "foreign data" is not allowed/, + "erroneously exclude foreign server"); + +######################################### +# Test broken input format + +# Test invalid filter command +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "k"; +close $inputfile; + +command_fails_like( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + qr/invalid filter command/, + "invalid syntax: incorrect filter command"); + +# Test invalid object type +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include xxx"; +close $inputfile; + +command_fails_like( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + qr/unsupported filter object type: "xxx"/, + "invalid syntax: invalid object type specified, should be table, schema, foreign_data or data" +); + +# Test missing object identifier pattern +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include table"; +close $inputfile; + +command_fails_like( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + qr/missing object name/, + "invalid syntax: missing object identifier pattern"); + +# Test adding extra content after the object identifier pattern +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include table table one"; +close $inputfile; + +command_fails_like( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + qr/no matching tables were found/, + "invalid syntax: extra content after object identifier pattern"); + +######################################### +# Combined with --strict-names + +# First ensure that a matching filter works +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include table table_one\n"; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", + '--strict-names', 'postgres' + ], + "strict names with matching pattern"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE TABLE public\.table_one/m, "no table dumped"); + +# Now append a pattern to the filter file which doesn't resolve +open $inputfile, '>>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include table table_nonexisting_name"; +close $inputfile; + +command_fails_like( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", + '--strict-names', 'postgres' + ], + qr/no matching tables were found/, + "inclusion of non-existing objects with --strict names"); + +######################################### +# pg_dumpall tests + +########################### +# Test dumping all tables except one +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "exclude database postgres\n"; +close $inputfile; + +command_ok( + [ + 'pg_dumpall', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt" + ], + "dump tables with exclusion of a database"); + +$dump = slurp_file($plainfile); + +ok($dump !~ qr/^\\connect postgres/m, "database postgres is not dumped"); +ok($dump =~ qr/^\\connect template1/m, "database template1 is dumped"); + +# Make sure this option dont break the existing limitation of using +# --globals-only with exclusions +command_fails_like( + [ + 'pg_dumpall', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", + '--globals-only' + ], + qr/\Qpg_dumpall: error: option --exclude-database cannot be used together with -g\/--globals-only\E/, + 'pg_dumpall: option --exclude-database cannot be used together with -g/--globals-only' +); + +# Test invalid filter command +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "k"; +close $inputfile; + +command_fails_like( + [ + 'pg_dumpall', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt" + ], + qr/invalid filter command/, + "invalid syntax: incorrect filter command"); + +# Test invalid object type +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "exclude xxx"; +close $inputfile; + +command_fails_like( + [ + 'pg_dumpall', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt" + ], + qr/unsupported filter object type: "xxx"/, + "invalid syntax: exclusion of non-existing object type"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "exclude table foo"; +close $inputfile; + +command_fails_like( + [ + 'pg_dumpall', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt" + ], + qr/pg_dumpall: error: invalid format in filter/, + "invalid syntax: exclusion of unsupported object type"); + +######################################### +# pg_restore tests + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', "$tempdir/filter_test.dump", + "-Fc", 'postgres' + ], + "dump all tables"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include table table_two"; +close $inputfile; + +command_ok( + [ + 'pg_restore', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", + "-Fc", "$tempdir/filter_test.dump" + ], + "restore tables with filter"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE TABLE public\.table_two/m, "wanted table restored"); +ok($dump !~ qr/^CREATE TABLE public\.table_one/m, + "unwanted table is not restored"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include table_data xxx"; +close $inputfile; + +command_fails_like( + [ + 'pg_restore', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt" + ], + qr/include filter for "table data" is not allowed/, + "invalid syntax: inclusion of unallowed object"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include extension xxx"; +close $inputfile; + +command_fails_like( + [ + 'pg_restore', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt" + ], + qr/include filter for "extension" is not allowed/, + "invalid syntax: inclusion of unallowed object"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "exclude extension xxx"; +close $inputfile; + +command_fails_like( + [ + 'pg_restore', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt" + ], + qr/exclude filter for "extension" is not allowed/, + "invalid syntax: exclusion of unallowed object"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "exclude table_data xxx"; +close $inputfile; + +command_fails_like( + [ + 'pg_restore', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt" + ], + qr/exclude filter for "table data" is not allowed/, + "invalid syntax: exclusion of unallowed object"); + +######################################### +# test restore of other objects + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', "$tempdir/filter_test.dump", + "-Fc", 'sourcedb' + ], + "dump all objects from sourcedb"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include function foo1(integer)"; +close $inputfile; + +command_ok( + [ + 'pg_restore', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", + "-Fc", "$tempdir/filter_test.dump" + ], + "restore function with filter"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE FUNCTION public\.foo1/m, "wanted function restored"); +ok( $dump !~ qr/^CREATE TABLE public\.foo2/m, + "unwanted function is not restored"); + +# this should be white space tolerant (against the -P argument) + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include function foo3 ( double precision , integer) "; +close $inputfile; + +command_ok( + [ + 'pg_restore', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", + "-Fc", "$tempdir/filter_test.dump" + ], + "restore function with filter"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE FUNCTION public\.foo3/m, "wanted function restored"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include index t1_idx1\n"; + +# attention! this hit pg_restore bug - correct name of trigger is "trg1" +# not "t1 trg1". Should be fixed when pg_restore will be fixed +print $inputfile "include trigger t1 trg1\n"; +close $inputfile; + +command_ok( + [ + 'pg_restore', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", + "-Fc", "$tempdir/filter_test.dump" + ], + "restore function with filter"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE INDEX t1_idx1/m, "wanted index restored"); +ok($dump !~ qr/^CREATE INDEX t2_idx2/m, "unwanted index are not restored"); +ok($dump =~ qr/^CREATE TRIGGER trg1/m, "wanted trigger restored"); +ok($dump !~ qr/^CREATE TRIGGER trg2/m, "unwanted trigger is not restored"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include schema s1\n"; +close $inputfile; + +command_ok( + [ + 'pg_restore', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", + "-Fc", "$tempdir/filter_test.dump" + ], + "restore function with filter"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE TABLE s1\.t1/m, "wanted table from schema restored"); +ok( $dump =~ qr/^CREATE SEQUENCE s1\.s1/m, + "wanted sequence from schema restored"); +ok($dump !~ qr/^CREATE TABLE s2\t2/m, "unwanted table is not restored"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "exclude schema s1\n"; +close $inputfile; + +command_ok( + [ + 'pg_restore', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", + "-Fc", "$tempdir/filter_test.dump" + ], + "restore function with filter"); + +$dump = slurp_file($plainfile); + +ok($dump !~ qr/^CREATE TABLE s1\.t1/m, + "unwanted table from schema is not restored"); +ok($dump !~ qr/^CREATE SEQUENCE s1\.s1/m, + "unwanted sequence from schema is not restored"); +ok($dump =~ qr/^CREATE TABLE s2\.t2/m, "wanted table restored"); +ok($dump =~ qr/^CREATE TABLE public\.t1/m, "wanted table restored"); + +######################################### +# test of supported syntax + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; + +print $inputfile "include table_and_children footab\n"; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "filter file without patterns"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE TABLE public\.bootab/m, "dumped children table"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; + +print $inputfile "exclude table_and_children footab\n"; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "filter file without patterns"); + +$dump = slurp_file($plainfile); + +ok($dump !~ qr/^CREATE TABLE public\.bootab/m, + "exclude dumped children table"); + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; + +print $inputfile "exclude table_data_and_children footab\n"; +close $inputfile; + +command_ok( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + "filter file without patterns"); + +$dump = slurp_file($plainfile); + +ok($dump =~ qr/^CREATE TABLE public\.bootab/m, "dumped children table"); +ok($dump !~ qr/^COPY public\.bootab/m, "exclude dumped children table"); + +######################################### +# Test extension + +open $inputfile, '>', "$tempdir/inputfile.txt" + or die "unable to open filterfile for writing"; +print $inputfile "include extension doesnt_exists\n"; +close $inputfile; + +command_fails_like( + [ + 'pg_dump', '-p', $port, '-f', $plainfile, + "--filter=$tempdir/inputfile.txt", 'postgres' + ], + qr/pg_dump: error: no matching extensions were found/, + "dump nonexisting extension"); + + +done_testing(); diff --git a/src/bin/pg_dump/t/010_dump_connstr.pl b/src/bin/pg_dump/t/010_dump_connstr.pl index ed86c332ef967..54e2e08cc20bf 100644 --- a/src/bin/pg_dump/t/010_dump_connstr.pl +++ b/src/bin/pg_dump/t/010_dump_connstr.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_resetwal/Makefile b/src/bin/pg_resetwal/Makefile index a363b948b53cd..4228a5a772a9f 100644 --- a/src/bin/pg_resetwal/Makefile +++ b/src/bin/pg_resetwal/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/pg_resetwal # -# Copyright (c) 1998-2023, PostgreSQL Global Development Group +# Copyright (c) 1998-2024, PostgreSQL Global Development Group # # src/bin/pg_resetwal/Makefile # @@ -15,6 +15,8 @@ subdir = src/bin/pg_resetwal top_builddir = ../../.. include $(top_builddir)/src/Makefile.global +LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils + OBJS = \ $(WIN32RES) \ pg_resetwal.o @@ -33,7 +35,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_resetwal$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_resetwal$(X) $(OBJS) rm -rf tmp_check diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build index 3f08a819bbc44..c1239528db27f 100644 --- a/src/bin/pg_resetwal/meson.build +++ b/src/bin/pg_resetwal/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_resetwal_sources = files( 'pg_resetwal.c', diff --git a/src/bin/pg_resetwal/nls.mk b/src/bin/pg_resetwal/nls.mk index 7fc84f0825d74..694d5420a2923 100644 --- a/src/bin/pg_resetwal/nls.mk +++ b/src/bin/pg_resetwal/nls.mk @@ -2,6 +2,10 @@ CATALOG_NAME = pg_resetwal GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ pg_resetwal.c \ - ../../common/restricted_token.c + ../../common/controldata_utils.c \ + ../../common/fe_memutils.c \ + ../../common/file_utils.c \ + ../../common/restricted_token.c \ + ../../fe_utils/option_utils.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/pg_resetwal/pg_resetwal.c b/src/bin/pg_resetwal/pg_resetwal.c index e7ef2b8bd0c8b..e9dcb5a6d89d1 100644 --- a/src/bin/pg_resetwal/pg_resetwal.c +++ b/src/bin/pg_resetwal/pg_resetwal.c @@ -6,8 +6,7 @@ * * The theory of operation is fairly simple: * 1. Read the existing pg_control (which will include the last - * checkpoint record). If it is an old format then update to - * current format. + * checkpoint record). * 2. If pg_control is corrupt, attempt to intuit reasonable values, * by scanning the old xlog if necessary. * 3. Modify pg_control to reflect a "shutdown" state with a checkpoint @@ -20,7 +19,7 @@ * step 2 ... * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/pg_resetwal/pg_resetwal.c @@ -55,6 +54,7 @@ #include "common/logging.h" #include "common/restricted_token.h" #include "common/string.h" +#include "fe_utils/option_utils.h" #include "getopt_long.h" #include "pg_getopt.h" #include "storage/large_object.h" @@ -85,6 +85,7 @@ static void RewriteControlFile(void); static void FindEndOfXLOG(void); static void KillExistingXLOG(void); static void KillExistingArchiveStatus(void); +static void KillExistingWALSummaries(void); static void WriteEmptyXLOG(void); static void usage(void); @@ -211,13 +212,13 @@ main(int argc, char *argv[]) exit(1); } - if (set_oldest_commit_ts_xid < 2 && - set_oldest_commit_ts_xid != 0) - pg_fatal("transaction ID (-c) must be either 0 or greater than or equal to 2"); + if (set_oldest_commit_ts_xid < FirstNormalTransactionId && + set_oldest_commit_ts_xid != InvalidTransactionId) + pg_fatal("transaction ID (-c) must be either %u or greater than or equal to %u", InvalidTransactionId, FirstNormalTransactionId); - if (set_newest_commit_ts_xid < 2 && - set_newest_commit_ts_xid != 0) - pg_fatal("transaction ID (-c) must be either 0 or greater than or equal to 2"); + if (set_newest_commit_ts_xid < FirstNormalTransactionId && + set_newest_commit_ts_xid != InvalidTransactionId) + pg_fatal("transaction ID (-c) must be either %u or greater than or equal to %u", InvalidTransactionId, FirstNormalTransactionId); break; case 'o': @@ -290,13 +291,16 @@ main(int argc, char *argv[]) break; case 1: - errno = 0; - set_wal_segsize = strtol(optarg, &endptr, 10) * 1024 * 1024; - if (endptr == optarg || *endptr != '\0' || errno != 0) - pg_fatal("argument of --wal-segsize must be a number"); - if (!IsValidWalSegSize(set_wal_segsize)) - pg_fatal("argument of --wal-segsize must be a power of 2 between 1 and 1024"); - break; + { + int wal_segsize_mb; + + if (!option_parse_int(optarg, "--wal-segsize", 1, 1024, &wal_segsize_mb)) + exit(1); + set_wal_segsize = wal_segsize_mb * 1024 * 1024; + if (!IsValidWalSegSize(set_wal_segsize)) + pg_fatal("argument of %s must be a power of two between 1 and 1024", "--wal-segsize"); + break; + } default: /* getopt_long already emitted a complaint */ @@ -455,20 +459,22 @@ main(int argc, char *argv[]) if (minXlogSegNo > newXlogSegNo) newXlogSegNo = minXlogSegNo; + if (noupdate) + { + PrintNewControlValues(); + exit(0); + } + /* * If we had to guess anything, and -f was not given, just print the - * guessed values and exit. Also print if -n is given. + * guessed values and exit. */ - if ((guessed && !force) || noupdate) + if (guessed && !force) { PrintNewControlValues(); - if (!noupdate) - { - printf(_("\nIf these values seem acceptable, use -f to force reset.\n")); - exit(1); - } - else - exit(0); + pg_log_error("not proceeding because control file values were guessed"); + pg_log_error_hint("If these values seem acceptable, use -f to force reset."); + exit(1); } /* @@ -476,9 +482,9 @@ main(int argc, char *argv[]) */ if (ControlFile.state != DB_SHUTDOWNED && !force) { - printf(_("The database server was not shut down cleanly.\n" - "Resetting the write-ahead log might cause data to be lost.\n" - "If you want to proceed anyway, use -f to force reset.\n")); + pg_log_error("database server was not shut down cleanly"); + pg_log_error_detail("Resetting the write-ahead log might cause data to be lost."); + pg_log_error_hint("If you want to proceed anyway, use -f to force reset."); exit(1); } @@ -488,6 +494,7 @@ main(int argc, char *argv[]) RewriteControlFile(); KillExistingXLOG(); KillExistingArchiveStatus(); + KillExistingWALSummaries(); WriteEmptyXLOG(); printf(_("Write-ahead log reset\n")); @@ -1029,6 +1036,40 @@ KillExistingArchiveStatus(void) pg_fatal("could not close directory \"%s\": %m", ARCHSTATDIR); } +/* + * Remove existing WAL summary files + */ +static void +KillExistingWALSummaries(void) +{ +#define WALSUMMARYDIR XLOGDIR "/summaries" +#define WALSUMMARY_NHEXCHARS 40 + + DIR *xldir; + struct dirent *xlde; + char path[MAXPGPATH + sizeof(WALSUMMARYDIR)]; + + xldir = opendir(WALSUMMARYDIR); + if (xldir == NULL) + pg_fatal("could not open directory \"%s\": %m", WALSUMMARYDIR); + + while (errno = 0, (xlde = readdir(xldir)) != NULL) + { + if (strspn(xlde->d_name, "0123456789ABCDEF") == WALSUMMARY_NHEXCHARS && + strcmp(xlde->d_name + WALSUMMARY_NHEXCHARS, ".summary") == 0) + { + snprintf(path, sizeof(path), "%s/%s", WALSUMMARYDIR, xlde->d_name); + if (unlink(path) < 0) + pg_fatal("could not delete file \"%s\": %m", path); + } + } + + if (errno) + pg_fatal("could not read directory \"%s\": %m", WALSUMMARYDIR); + + if (closedir(xldir)) + pg_fatal("could not close directory \"%s\": %m", ARCHSTATDIR); +} /* * Write an empty XLOG file, containing only the checkpoint record @@ -1125,24 +1166,30 @@ static void usage(void) { printf(_("%s resets the PostgreSQL write-ahead log.\n\n"), progname); - printf(_("Usage:\n %s [OPTION]... DATADIR\n\n"), progname); - printf(_("Options:\n")); + printf(_("Usage:\n")); + printf(_(" %s [OPTION]... DATADIR\n"), progname); + + printf(_("\nOptions:\n")); + printf(_(" [-D, --pgdata=]DATADIR data directory\n")); + printf(_(" -f, --force force update to be done even after unclean shutdown or\n" + " if pg_control values had to be guessed\n")); + printf(_(" -n, --dry-run no update, just show what would be done\n")); + printf(_(" -V, --version output version information, then exit\n")); + printf(_(" -?, --help show this help, then exit\n")); + + printf(_("\nOptions to override control file values:\n")); printf(_(" -c, --commit-timestamp-ids=XID,XID\n" " set oldest and newest transactions bearing\n" " commit timestamp (zero means no change)\n")); - printf(_(" [-D, --pgdata=]DATADIR data directory\n")); printf(_(" -e, --epoch=XIDEPOCH set next transaction ID epoch\n")); - printf(_(" -f, --force force update to be done\n")); printf(_(" -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n")); printf(_(" -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n")); - printf(_(" -n, --dry-run no update, just show what would be done\n")); printf(_(" -o, --next-oid=OID set next OID\n")); printf(_(" -O, --multixact-offset=OFFSET set next multitransaction offset\n")); printf(_(" -u, --oldest-transaction-id=XID set oldest transaction ID\n")); - printf(_(" -V, --version output version information, then exit\n")); printf(_(" -x, --next-transaction-id=XID set next transaction ID\n")); printf(_(" --wal-segsize=SIZE size of WAL segments, in megabytes\n")); - printf(_(" -?, --help show this help, then exit\n")); + printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL); } diff --git a/src/bin/pg_resetwal/po/de.po b/src/bin/pg_resetwal/po/de.po index 6a7cf3a7763e7..28af25d939ed2 100644 --- a/src/bin/pg_resetwal/po/de.po +++ b/src/bin/pg_resetwal/po/de.po @@ -1,14 +1,14 @@ # German message translation file for pg_resetwal -# Peter Eisentraut , 2002 - 2022. +# Peter Eisentraut , 2002 - 2024. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-08 07:49+0000\n" -"PO-Revision-Date: 2022-05-08 14:16+0200\n" +"POT-Creation-Date: 2024-06-16 07:51+0000\n" +"PO-Revision-Date: 2024-03-26 11:01+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -17,225 +17,319 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "Warnung: " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "Detail: " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "Tipp: " -#: ../../common/restricted_token.c:64 +#: ../../common/controldata_utils.c:97 pg_resetwal.c:370 pg_resetwal.c:525 +#: pg_resetwal.c:573 #, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "konnte Bibliothek »%s« nicht laden: Fehlercode %lu" +msgid "could not open file \"%s\" for reading: %m" +msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" + +#: ../../common/controldata_utils.c:110 pg_resetwal.c:534 pg_resetwal.c:588 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "konnte Datei »%s« nicht lesen: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schließen: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "falsche Byte-Reihenfolge" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"möglicherweise falsche Byte-Reihenfolge\n" +"Die Byte-Reihenfolge, die zur Speicherung der Datei pg_control verwendet wurde,\n" +"stimmt möglicherweise nicht mit der von diesem Programm verwendeten überein. In\n" +"diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n" +"wäre inkompatibel mit diesem Datenverzeichnis." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_resetwal.c:1134 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "konnte Datei »%s« nicht öffnen: %m" + +#: ../../common/controldata_utils.c:249 pg_resetwal.c:1142 pg_resetwal.c:1154 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schreiben: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "konnte Datei »%s« nicht fsyncen: %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "Speicher aufgebraucht\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_resetwal.c:928 pg_resetwal.c:981 pg_resetwal.c:1016 pg_resetwal.c:1054 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: ../../common/restricted_token.c:73 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 pg_resetwal.c:1068 #, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "auf dieser Plattform können keine beschränkten Token erzeugt werden: Fehlercode %lu" +msgid "could not read directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht lesen: %m" -#: ../../common/restricted_token.c:82 +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" + +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "konnte Prozess-Token nicht öffnen: Fehlercode %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "konnte SIDs nicht erzeugen: Fehlercode %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "konnte beschränktes Token nicht erzeugen: Fehlercode %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "konnte Prozess für Befehl »%s« nicht starten: Fehlercode %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "konnte Prozess nicht mit beschränktem Token neu starten: Fehlercode %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ungültiger Wert »%s« für Option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s muss im Bereich %d..%d sein" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "unbekannte Sync-Methode: %s" + #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202 -#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249 -#: pg_resetwal.c:269 pg_resetwal.c:280 +#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 +#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 +#: pg_resetwal.c:270 pg_resetwal.c:281 #, c-format msgid "invalid argument for option %s" msgstr "ungültiges Argument für Option %s" -#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 -#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 -#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316 -#: pg_resetwal.c:323 +#: pg_resetwal.c:165 pg_resetwal.c:178 pg_resetwal.c:191 pg_resetwal.c:204 +#: pg_resetwal.c:211 pg_resetwal.c:230 pg_resetwal.c:243 pg_resetwal.c:251 +#: pg_resetwal.c:271 pg_resetwal.c:282 pg_resetwal.c:307 pg_resetwal.c:320 +#: pg_resetwal.c:327 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_resetwal.c:168 +#: pg_resetwal.c:169 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "Transaktions-ID-Epoche (-e) darf nicht -1 sein" -#: pg_resetwal.c:181 +#: pg_resetwal.c:182 #, c-format msgid "oldest transaction ID (-u) must be greater than or equal to %u" msgstr "älteste Transaktions-ID (-u) muss größer oder gleich %u sein" -#: pg_resetwal.c:194 +#: pg_resetwal.c:195 #, c-format msgid "transaction ID (-x) must be greater than or equal to %u" msgstr "Transaktions-ID (-x) muss größer oder gleich %u sein" -#: pg_resetwal.c:216 pg_resetwal.c:220 +#: pg_resetwal.c:217 pg_resetwal.c:221 #, c-format -msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" -msgstr "Transaktions-ID (-c) muss entweder 0 oder größer oder gleich 2 sein" +msgid "transaction ID (-c) must be either %u or greater than or equal to %u" +msgstr "Transaktions-ID (-c) muss entweder %u oder größer oder gleich %u sein" -#: pg_resetwal.c:233 +#: pg_resetwal.c:234 #, c-format msgid "OID (-o) must not be 0" msgstr "OID (-o) darf nicht 0 sein" -#: pg_resetwal.c:254 +#: pg_resetwal.c:255 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "Multitransaktions-ID (-m) darf nicht 0 sein" -#: pg_resetwal.c:261 +#: pg_resetwal.c:262 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "älteste Multitransaktions-ID (-m) darf nicht 0 sein" -#: pg_resetwal.c:274 +#: pg_resetwal.c:275 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "Multitransaktions-Offset (-O) darf nicht -1 sein" -#: pg_resetwal.c:296 -#, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "Argument von --wal-segsize muss eine Zahl sein" - -#: pg_resetwal.c:298 +#: pg_resetwal.c:301 #, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "Argument von --wal-segsize muss eine Zweierpotenz zwischen 1 und 1024 sein" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "Argument von %s muss eine Zweierpotenz zwischen 1 und 1024 sein" -#: pg_resetwal.c:314 +#: pg_resetwal.c:318 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_resetwal.c:322 +#: pg_resetwal.c:326 #, c-format msgid "no data directory specified" msgstr "kein Datenverzeichnis angegeben" -#: pg_resetwal.c:336 +#: pg_resetwal.c:340 #, c-format msgid "cannot be executed by \"root\"" msgstr "kann nicht von »root« ausgeführt werden" -#: pg_resetwal.c:337 +#: pg_resetwal.c:341 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Sie müssen %s als PostgreSQL-Superuser ausführen." -#: pg_resetwal.c:347 +#: pg_resetwal.c:351 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %m" -#: pg_resetwal.c:353 +#: pg_resetwal.c:357 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "konnte nicht in Verzeichnis »%s« wechseln: %m" -#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" - -#: pg_resetwal.c:371 +#: pg_resetwal.c:375 #, c-format msgid "lock file \"%s\" exists" msgstr "Sperrdatei »%s« existiert" -#: pg_resetwal.c:372 +#: pg_resetwal.c:376 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "Läuft der Server? Wenn nicht, dann Sperrdatei löschen und nochmal versuchen." -#: pg_resetwal.c:467 +#: pg_resetwal.c:475 #, c-format -msgid "" -"\n" -"If these values seem acceptable, use -f to force reset.\n" -msgstr "" -"\n" -"Wenn diese Werte akzeptabel scheinen, dann benutzen Sie -f um das\n" -"Zurücksetzen zu erzwingen.\n" +msgid "not proceeding because control file values were guessed" +msgstr "es wird nicht fortgefahren, weil Kontrolldateiwerte geschätzt wurden" -#: pg_resetwal.c:479 +#: pg_resetwal.c:476 #, c-format -msgid "" -"The database server was not shut down cleanly.\n" -"Resetting the write-ahead log might cause data to be lost.\n" -"If you want to proceed anyway, use -f to force reset.\n" -msgstr "" -"Der Datenbankserver wurde nicht sauber heruntergefahren.\n" -"Beim Zurücksetzen des Write-Ahead-Logs können Daten verloren gehen.\n" -"Wenn Sie trotzdem weiter machen wollen, benutzen Sie -f, um das\n" -"Zurücksetzen zu erzwingen.\n" +msgid "If these values seem acceptable, use -f to force reset." +msgstr "Wenn diese Werte akzeptabel scheinen, dann benutzen Sie -f, um das Zurücksetzen zu erzwingen." -#: pg_resetwal.c:493 +#: pg_resetwal.c:485 +#, c-format +msgid "database server was not shut down cleanly" +msgstr "Datenbankserver wurde nicht sauber heruntergefahren" + +#: pg_resetwal.c:486 +#, c-format +msgid "Resetting the write-ahead log might cause data to be lost." +msgstr "Beim Zurücksetzen des Write-Ahead-Logs können Daten verloren gehen." + +#: pg_resetwal.c:487 +#, c-format +msgid "If you want to proceed anyway, use -f to force reset." +msgstr "Wenn Sie trotzdem weiter machen wollen, dann benutzen Sie -f, um das Zurücksetzen zu erzwingen." + +#: pg_resetwal.c:500 #, c-format msgid "Write-ahead log reset\n" msgstr "Write-Ahead-Log wurde zurückgesetzt\n" -#: pg_resetwal.c:525 +#: pg_resetwal.c:532 #, c-format msgid "unexpected empty file \"%s\"" msgstr "unerwartete leere Datei »%s«" -#: pg_resetwal.c:527 pg_resetwal.c:581 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "konnte Datei »%s« nicht lesen: %m" - -#: pg_resetwal.c:535 +#: pg_resetwal.c:542 #, c-format msgid "data directory is of wrong version" msgstr "Datenverzeichnis hat falsche Version" -#: pg_resetwal.c:536 +#: pg_resetwal.c:543 #, c-format msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." msgstr "Datei »%s« enthält »%s«, was nicht mit der Version dieses Programms »%s« kompatibel ist." -#: pg_resetwal.c:569 +#: pg_resetwal.c:576 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -246,24 +340,24 @@ msgstr "" " touch %s\n" "aus und versuchen Sie es erneut." -#: pg_resetwal.c:597 +#: pg_resetwal.c:604 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "pg_control existiert, aber mit ungültiger CRC; mit Vorsicht fortfahren" -#: pg_resetwal.c:606 +#: pg_resetwal.c:613 #, c-format msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" msgstr[0] "pg_control gibt ungültige WAL-Segmentgröße an (%d Byte); mit Vorsicht fortfahren" msgstr[1] "pg_control gibt ungültige WAL-Segmentgröße an (%d Bytes); mit Vorsicht fortfahren" -#: pg_resetwal.c:617 +#: pg_resetwal.c:624 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "pg_control existiert, aber ist kaputt oder hat falsche Version; wird ignoriert" -#: pg_resetwal.c:712 +#: pg_resetwal.c:719 #, c-format msgid "" "Guessed pg_control values:\n" @@ -272,7 +366,7 @@ msgstr "" "Geschätzte pg_control-Werte:\n" "\n" -#: pg_resetwal.c:714 +#: pg_resetwal.c:721 #, c-format msgid "" "Current pg_control values:\n" @@ -281,167 +375,167 @@ msgstr "" "Aktuelle pg_control-Werte:\n" "\n" -#: pg_resetwal.c:716 +#: pg_resetwal.c:723 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_control-Versionsnummer: %u\n" -#: pg_resetwal.c:718 +#: pg_resetwal.c:725 #, c-format msgid "Catalog version number: %u\n" msgstr "Katalogversionsnummer: %u\n" -#: pg_resetwal.c:720 +#: pg_resetwal.c:727 #, c-format msgid "Database system identifier: %llu\n" msgstr "Datenbanksystemidentifikation: %llu\n" -#: pg_resetwal.c:722 +#: pg_resetwal.c:729 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "TimeLineID des letzten Checkpoints: %u\n" -#: pg_resetwal.c:724 +#: pg_resetwal.c:731 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "full_page_writes des letzten Checkpoints: %s\n" -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "off" msgstr "aus" -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "on" msgstr "an" -#: pg_resetwal.c:726 +#: pg_resetwal.c:733 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID des letzten Checkpoints: %u:%u\n" -#: pg_resetwal.c:729 +#: pg_resetwal.c:736 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID des letzten Checkpoints: %u\n" -#: pg_resetwal.c:731 +#: pg_resetwal.c:738 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId des letzten Checkpoints: %u\n" -#: pg_resetwal.c:733 +#: pg_resetwal.c:740 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset des letzten Checkpoints: %u\n" -#: pg_resetwal.c:735 +#: pg_resetwal.c:742 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID des letzten Checkpoints: %u\n" -#: pg_resetwal.c:737 +#: pg_resetwal.c:744 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "DB der oldestXID des letzten Checkpoints: %u\n" -#: pg_resetwal.c:739 +#: pg_resetwal.c:746 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID des letzten Checkpoints: %u\n" -#: pg_resetwal.c:741 +#: pg_resetwal.c:748 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid des letzten Checkpoints: %u\n" -#: pg_resetwal.c:743 +#: pg_resetwal.c:750 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "DB des oldestMulti des letzten Checkpoints: %u\n" -#: pg_resetwal.c:745 +#: pg_resetwal.c:752 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid des letzten Checkpoints: %u\n" -#: pg_resetwal.c:747 +#: pg_resetwal.c:754 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid des letzten Checkpoints: %u\n" -#: pg_resetwal.c:749 +#: pg_resetwal.c:756 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Maximale Datenausrichtung (Alignment): %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:759 #, c-format msgid "Database block size: %u\n" msgstr "Datenbankblockgröße: %u\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:761 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Blöcke pro Segment: %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:763 #, c-format msgid "WAL block size: %u\n" msgstr "WAL-Blockgröße: %u\n" -#: pg_resetwal.c:758 pg_resetwal.c:844 +#: pg_resetwal.c:765 pg_resetwal.c:851 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Bytes pro WAL-Segment: %u\n" -#: pg_resetwal.c:760 +#: pg_resetwal.c:767 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Maximale Bezeichnerlänge: %u\n" -#: pg_resetwal.c:762 +#: pg_resetwal.c:769 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Maximale Spalten in einem Index: %u\n" -#: pg_resetwal.c:764 +#: pg_resetwal.c:771 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Maximale Größe eines Stücks TOAST: %u\n" -#: pg_resetwal.c:766 +#: pg_resetwal.c:773 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Größe eines Large-Object-Chunks: %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:776 #, c-format msgid "Date/time type storage: %s\n" msgstr "Speicherung von Datum/Zeit-Typen: %s\n" -#: pg_resetwal.c:770 +#: pg_resetwal.c:777 msgid "64-bit integers" msgstr "64-Bit-Ganzzahlen" -#: pg_resetwal.c:771 +#: pg_resetwal.c:778 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Übergabe von Float8-Argumenten: %s\n" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by reference" msgstr "Referenz" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by value" msgstr "Wert" -#: pg_resetwal.c:773 +#: pg_resetwal.c:780 #, c-format msgid "Data page checksum version: %u\n" msgstr "Datenseitenprüfsummenversion: %u\n" -#: pg_resetwal.c:787 +#: pg_resetwal.c:794 #, c-format msgid "" "\n" @@ -454,102 +548,82 @@ msgstr "" "Zu ändernde Werte:\n" "\n" -#: pg_resetwal.c:791 +#: pg_resetwal.c:798 #, c-format msgid "First log segment after reset: %s\n" msgstr "Erstes Logdateisegment nach Zurücksetzen: %s\n" -#: pg_resetwal.c:795 +#: pg_resetwal.c:802 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:797 +#: pg_resetwal.c:804 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:799 +#: pg_resetwal.c:806 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "OldestMulti's DB: %u\n" -#: pg_resetwal.c:805 +#: pg_resetwal.c:812 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:811 +#: pg_resetwal.c:818 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:817 +#: pg_resetwal.c:824 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:826 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:821 +#: pg_resetwal.c:828 #, c-format msgid "OldestXID's DB: %u\n" msgstr "OldestXID's DB: %u\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:834 #, c-format msgid "NextXID epoch: %u\n" msgstr "NextXID-Epoche: %u\n" -#: pg_resetwal.c:833 +#: pg_resetwal.c:840 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:838 +#: pg_resetwal.c:845 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" - -#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "konnte Verzeichnis »%s« nicht lesen: %m" - -#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 +#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 pg_resetwal.c:1071 #, c-format msgid "could not close directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht schließen: %m" -#: pg_resetwal.c:990 pg_resetwal.c:1028 +#: pg_resetwal.c:990 pg_resetwal.c:1028 pg_resetwal.c:1063 #, c-format msgid "could not delete file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" -#: pg_resetwal.c:1100 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "konnte Datei »%s« nicht öffnen: %m" - -#: pg_resetwal.c:1108 pg_resetwal.c:1120 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "konnte Datei »%s« nicht schreiben: %m" - -#: pg_resetwal.c:1125 +#: pg_resetwal.c:1159 #, c-format msgid "fsync error: %m" msgstr "fsync-Fehler: %m" -#: pg_resetwal.c:1134 +#: pg_resetwal.c:1168 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -558,23 +632,64 @@ msgstr "" "%s setzt den PostgreSQL-Write-Ahead-Log zurück.\n" "\n" -#: pg_resetwal.c:1135 +#: pg_resetwal.c:1169 +#, c-format +msgid "Usage:\n" +msgstr "Aufruf:\n" + +#: pg_resetwal.c:1170 +#, c-format +msgid " %s [OPTION]... DATADIR\n" +msgstr " %s [OPTION]... DATENVERZEICHNIS\n" + +#: pg_resetwal.c:1172 #, c-format msgid "" -"Usage:\n" -" %s [OPTION]... DATADIR\n" "\n" +"Options:\n" msgstr "" -"Aufruf:\n" -" %s [OPTION]... DATENVERZEICHNIS\n" "\n" +"Optionen:\n" + +#: pg_resetwal.c:1173 +#, c-format +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]VERZ Datenbankverzeichnis\n" + +#: pg_resetwal.c:1174 +#, c-format +msgid "" +" -f, --force force update to be done even after unclean shutdown or\n" +" if pg_control values had to be guessed\n" +msgstr "" +" -f, --force Änderung erzwingen, auch nach unsauberem Herunterfahren\n" +" oder wenn pg_control-Werte geschätzt werden mussten\n" + +#: pg_resetwal.c:1176 +#, c-format +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr " -n, --dry-run keine Änderungen; nur zeigen, was gemacht werden würde\n" + +#: pg_resetwal.c:1177 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_resetwal.c:1136 +#: pg_resetwal.c:1178 #, c-format -msgid "Options:\n" -msgstr "Optionen:\n" +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_resetwal.c:1137 +#: pg_resetwal.c:1180 +#, c-format +msgid "" +"\n" +"Options to override control file values:\n" +msgstr "" +"\n" +"Optionen um Kontrolldateiwerte setzen:\n" + +#: pg_resetwal.c:1181 #, c-format msgid "" " -c, --commit-timestamp-ids=XID,XID\n" @@ -585,74 +700,47 @@ msgstr "" " älteste und neuste Transaktion mit Commit-\n" " Timestamp setzen (Null bedeutet keine Änderung)\n" -#: pg_resetwal.c:1140 -#, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]VERZ Datenbankverzeichnis\n" - -#: pg_resetwal.c:1141 +#: pg_resetwal.c:1184 #, c-format msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" msgstr " -e, --epoch=XIDEPOCHE nächste Transaktions-ID-Epoche setzen\n" -#: pg_resetwal.c:1142 -#, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force Änderung erzwingen\n" - -#: pg_resetwal.c:1143 +#: pg_resetwal.c:1185 #, c-format msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" msgstr " -l, --next-wal-file=WALDATEI minimale Startposition für neuen WAL setzen\n" -#: pg_resetwal.c:1144 +#: pg_resetwal.c:1186 #, c-format msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" msgstr " -m, --multixact-ids=MXID,MXID nächste und älteste Multitransaktions-ID setzen\n" -#: pg_resetwal.c:1145 -#, c-format -msgid " -n, --dry-run no update, just show what would be done\n" -msgstr "" -" -n, --dry-run keine Änderungen; nur zeigen, was gemacht\n" -" werden würde\n" - -#: pg_resetwal.c:1146 +#: pg_resetwal.c:1187 #, c-format msgid " -o, --next-oid=OID set next OID\n" msgstr " -o, --next-oid=OID nächste OID setzen\n" -#: pg_resetwal.c:1147 +#: pg_resetwal.c:1188 #, c-format msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" msgstr " -O, --multixact-offset=OFFSET nächsten Multitransaktions-Offset setzen\n" -#: pg_resetwal.c:1148 +#: pg_resetwal.c:1189 #, c-format msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" msgstr " -u, --oldest-transaction-id=XID älteste Transaktions-ID setzen\n" -#: pg_resetwal.c:1149 -#, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" - -#: pg_resetwal.c:1150 +#: pg_resetwal.c:1190 #, c-format msgid " -x, --next-transaction-id=XID set next transaction ID\n" msgstr " -x, --next-transaction-id=XID nächste Transaktions-ID setzen\n" -#: pg_resetwal.c:1151 +#: pg_resetwal.c:1191 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=ZAHL Größe eines WAL-Segments, in Megabytes\n" -#: pg_resetwal.c:1152 -#, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" - -#: pg_resetwal.c:1153 +#: pg_resetwal.c:1193 #, c-format msgid "" "\n" @@ -661,7 +749,7 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_resetwal.c:1154 +#: pg_resetwal.c:1194 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" diff --git a/src/bin/pg_resetwal/po/es.po b/src/bin/pg_resetwal/po/es.po index 6a4c958782db6..ed1ed5e5c86e2 100644 --- a/src/bin/pg_resetwal/po/es.po +++ b/src/bin/pg_resetwal/po/es.po @@ -4,16 +4,16 @@ # This file is distributed under the same license as the PostgreSQL package. # # Ivan Hernandez , 2003. -# Alvaro Herrera , 2004-2014 +# Alvaro Herrera , 2004-2014, 2024 # Jaime Casanova , 2005 # Martín Marqués , 2013-2014 # msgid "" msgstr "" -"Project-Id-Version: pg_resetwal (PostgreSQL) 16\n" +"Project-Id-Version: pg_resetwal (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:20+0000\n" -"PO-Revision-Date: 2023-05-22 12:05+0200\n" +"POT-Creation-Date: 2025-02-16 19:50+0000\n" +"PO-Revision-Date: 2024-11-16 14:23+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -43,6 +43,107 @@ msgstr "detalle: " msgid "hint: " msgstr "consejo: " +#: ../../common/controldata_utils.c:97 pg_resetwal.c:370 pg_resetwal.c:525 +#: pg_resetwal.c:573 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "no se pudo abrir archivo «%s» para lectura: %m" + +#: ../../common/controldata_utils.c:110 pg_resetwal.c:534 pg_resetwal.c:588 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "no se pudo leer el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "no se pudo cerrar el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "discordancia en orden de bytes" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"posible discordancia en orden de bytes\n" +"El ordenamiento de bytes usado para almacenar el archivo pg_control puede no\n" +"coincidir con el usado por este programa. En tal caso los resultados de abajo\n" +"serían erróneos, y la instalación de PostgreSQL sería incompatible con este\n" +"directorio de datos." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_resetwal.c:1134 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "no se pudo abrir el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:249 pg_resetwal.c:1142 pg_resetwal.c:1154 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "no se pudo escribir el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "memoria agotada\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "no se puede duplicar un puntero nulo (error interno)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "no se pudo hacer stat al archivo «%s»: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "esta instalación no soporta el método de sync «%s»" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_resetwal.c:928 pg_resetwal.c:981 pg_resetwal.c:1016 pg_resetwal.c:1054 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "no se pudo abrir el directorio «%s»: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 pg_resetwal.c:1068 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "no se pudo leer el directorio «%s»: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" + #: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" @@ -73,163 +174,168 @@ msgstr "no se pudo re-ejecutar con el token restringido: código de error %lu" msgid "could not get exit code from subprocess: error code %lu" msgstr "no se pudo obtener el código de salida del subproceso»: código de error %lu" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "el valor «%s» no es válido para la opción %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s debe estar en el rango %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "método de sync no reconocido: %s" + #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202 -#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249 -#: pg_resetwal.c:269 pg_resetwal.c:280 +#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 +#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 +#: pg_resetwal.c:270 pg_resetwal.c:281 #, c-format msgid "invalid argument for option %s" msgstr "argumento no válido para la opción %s" -#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 -#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 -#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316 -#: pg_resetwal.c:323 +#: pg_resetwal.c:165 pg_resetwal.c:178 pg_resetwal.c:191 pg_resetwal.c:204 +#: pg_resetwal.c:211 pg_resetwal.c:230 pg_resetwal.c:243 pg_resetwal.c:251 +#: pg_resetwal.c:271 pg_resetwal.c:282 pg_resetwal.c:307 pg_resetwal.c:320 +#: pg_resetwal.c:327 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: pg_resetwal.c:168 +#: pg_resetwal.c:169 #, c-format msgid "transaction ID epoch (-e) must not be -1" -msgstr "el «epoch» de ID de transacción (-e) no debe ser -1" +msgstr "el \"epoch\" de ID de transacción (-e) no debe ser -1" -#: pg_resetwal.c:181 +#: pg_resetwal.c:182 #, c-format msgid "oldest transaction ID (-u) must be greater than or equal to %u" msgstr "el ID de transacción más antiguo (-u) debe ser mayor o igual a %u" -#: pg_resetwal.c:194 +#: pg_resetwal.c:195 #, c-format msgid "transaction ID (-x) must be greater than or equal to %u" msgstr "el ID de transacción (-x) debe ser mayor o igual a %u" -#: pg_resetwal.c:216 pg_resetwal.c:220 +#: pg_resetwal.c:217 pg_resetwal.c:221 #, c-format -msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" -msgstr "el ID de transacción (-c) debe ser 0 o bien mayor o igual a 2" +msgid "transaction ID (-c) must be either %u or greater than or equal to %u" +msgstr "el ID de transacción (-c) debe ser %u o bien mayor o igual a %u" -#: pg_resetwal.c:233 +#: pg_resetwal.c:234 #, c-format msgid "OID (-o) must not be 0" msgstr "OID (-o) no debe ser cero" -#: pg_resetwal.c:254 +#: pg_resetwal.c:255 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "el ID de multitransacción (-m) no debe ser 0" -#: pg_resetwal.c:261 +#: pg_resetwal.c:262 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "el ID de multitransacción más antiguo (-m) no debe ser 0" -#: pg_resetwal.c:274 +#: pg_resetwal.c:275 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "la posición de multitransacción (-O) no debe ser -1" -#: pg_resetwal.c:296 +#: pg_resetwal.c:301 #, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "el argumento de --wal-segsize debe ser un número" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "el argumento de %s debe ser una potencia de dos entre 1 y 1024" -#: pg_resetwal.c:298 -#, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "el argumento de --wal-segsize debe ser una potencia de 2 entre 1 y 1024" - -#: pg_resetwal.c:314 +#: pg_resetwal.c:318 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: pg_resetwal.c:322 +#: pg_resetwal.c:326 #, c-format msgid "no data directory specified" msgstr "directorio de datos no especificado" -#: pg_resetwal.c:336 +#: pg_resetwal.c:340 #, c-format msgid "cannot be executed by \"root\"" msgstr "no puede ser ejecutado con el usuario «root»" -#: pg_resetwal.c:337 +#: pg_resetwal.c:341 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Debe ejecutar %s con el superusuario de PostgreSQL." -#: pg_resetwal.c:347 +#: pg_resetwal.c:351 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "no se pudo obtener los permisos del directorio «%s»: %m" -#: pg_resetwal.c:353 +#: pg_resetwal.c:357 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "no se pudo cambiar al directorio «%s»: %m" -#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "no se pudo abrir archivo «%s» para lectura: %m" - -#: pg_resetwal.c:371 +#: pg_resetwal.c:375 #, c-format msgid "lock file \"%s\" exists" msgstr "el archivo candado «%s» existe" -#: pg_resetwal.c:372 +#: pg_resetwal.c:376 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "¿Hay un servidor corriendo? Si no, borre el archivo candado e inténtelo de nuevo." -#: pg_resetwal.c:467 +#: pg_resetwal.c:475 #, c-format -msgid "" -"\n" -"If these values seem acceptable, use -f to force reset.\n" -msgstr "" -"\n" -"Si estos valores parecen aceptables, use -f para forzar reinicio.\n" +msgid "not proceeding because control file values were guessed" +msgstr "no continuando porque los valores del archivo de control fueron asumidos" -#: pg_resetwal.c:479 +#: pg_resetwal.c:476 #, c-format -msgid "" -"The database server was not shut down cleanly.\n" -"Resetting the write-ahead log might cause data to be lost.\n" -"If you want to proceed anyway, use -f to force reset.\n" -msgstr "" -"El servidor de bases de datos no se apagó limpiamente.\n" -"Restablecer el WAL puede causar pérdida de datos.\n" -"Si quiere continuar de todas formas, use -f para forzar el restablecimiento.\n" +msgid "If these values seem acceptable, use -f to force reset." +msgstr "Si estos valores parecen aceptables, use -f para forzar reinicio." + +#: pg_resetwal.c:485 +#, c-format +msgid "database server was not shut down cleanly" +msgstr "el directorio de destino no fue apagado limpiamente" + +#: pg_resetwal.c:486 +#, c-format +msgid "Resetting the write-ahead log might cause data to be lost." +msgstr "Reiniciar el \"write-ahead log\" puede causar pérdida de datos." + +#: pg_resetwal.c:487 +#, c-format +msgid "If you want to proceed anyway, use -f to force reset." +msgstr "Si quiere proceder de todas formas, use -f para forzar reinicio." -#: pg_resetwal.c:493 +#: pg_resetwal.c:500 #, c-format msgid "Write-ahead log reset\n" -msgstr "«Write-ahead log» restablecido\n" +msgstr "\"Write-ahead log\" restablecido\n" -#: pg_resetwal.c:525 +#: pg_resetwal.c:532 #, c-format msgid "unexpected empty file \"%s\"" msgstr "archivo vacío inesperado «%s»" -#: pg_resetwal.c:527 pg_resetwal.c:581 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "no se pudo leer el archivo «%s»: %m" - -#: pg_resetwal.c:535 +#: pg_resetwal.c:542 #, c-format msgid "data directory is of wrong version" msgstr "el directorio de datos tiene la versión equivocada" -#: pg_resetwal.c:536 +#: pg_resetwal.c:543 #, c-format msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." msgstr "El archivo «%s» contiene «%s», que no es compatible con la versión «%s» de este programa." -#: pg_resetwal.c:569 +#: pg_resetwal.c:576 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -240,24 +346,24 @@ msgstr "" " touch %s\n" "y pruebe de nuevo." -#: pg_resetwal.c:597 +#: pg_resetwal.c:604 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "existe pg_control pero tiene un CRC no válido, proceda con precaución" -#: pg_resetwal.c:606 +#: pg_resetwal.c:613 #, c-format msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" msgstr[0] "pg_control especifica un tamaño de segmento de WAL no válido (%d byte), proceda con precaución" msgstr[1] "pg_control especifica un tamaño de segmento de WAL no válido (%d bytes), proceda con precaución" -#: pg_resetwal.c:617 +#: pg_resetwal.c:624 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "existe pg_control pero está roto o tiene la versión equivocada; ignorándolo" -#: pg_resetwal.c:712 +#: pg_resetwal.c:719 #, c-format msgid "" "Guessed pg_control values:\n" @@ -266,7 +372,7 @@ msgstr "" "Valores de pg_control asumidos:\n" "\n" -#: pg_resetwal.c:714 +#: pg_resetwal.c:721 #, c-format msgid "" "Current pg_control values:\n" @@ -275,167 +381,167 @@ msgstr "" "Valores actuales de pg_control:\n" "\n" -#: pg_resetwal.c:716 +#: pg_resetwal.c:723 #, c-format msgid "pg_control version number: %u\n" msgstr "Número de versión de pg_control: %u\n" -#: pg_resetwal.c:718 +#: pg_resetwal.c:725 #, c-format msgid "Catalog version number: %u\n" msgstr "Número de versión de catálogo: %u\n" -#: pg_resetwal.c:720 +#: pg_resetwal.c:727 #, c-format msgid "Database system identifier: %llu\n" -msgstr "Identificador de sistema: %llu\n" +msgstr "Identificador de sistema: %llu\n" -#: pg_resetwal.c:722 +#: pg_resetwal.c:729 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "TimeLineID del checkpoint más reciente: %u\n" -#: pg_resetwal.c:724 +#: pg_resetwal.c:731 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "full_page_writes del checkpoint más reciente: %s\n" -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "off" msgstr "desactivado" -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "on" msgstr "activado" -#: pg_resetwal.c:726 +#: pg_resetwal.c:733 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID del checkpoint más reciente: %u:%u\n" -#: pg_resetwal.c:729 +#: pg_resetwal.c:736 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID del checkpoint más reciente: %u\n" -#: pg_resetwal.c:731 +#: pg_resetwal.c:738 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId del checkpoint más reciente: %u\n" -#: pg_resetwal.c:733 +#: pg_resetwal.c:740 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset del checkpoint más reciente: %u\n" -#: pg_resetwal.c:735 +#: pg_resetwal.c:742 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID del checkpoint más reciente: %u\n" -#: pg_resetwal.c:737 +#: pg_resetwal.c:744 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "BD del oldestXID del checkpoint más reciente: %u\n" -#: pg_resetwal.c:739 +#: pg_resetwal.c:746 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID del checkpoint más reciente: %u\n" -#: pg_resetwal.c:741 +#: pg_resetwal.c:748 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid del checkpoint más reciente: %u\n" -#: pg_resetwal.c:743 +#: pg_resetwal.c:750 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "BD del oldestMultiXid del checkpt. más reciente: %u\n" -#: pg_resetwal.c:745 +#: pg_resetwal.c:752 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid del último checkpoint: %u\n" -#: pg_resetwal.c:747 +#: pg_resetwal.c:754 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid del último checkpoint: %u\n" -#: pg_resetwal.c:749 +#: pg_resetwal.c:756 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Máximo alineamiento de datos: %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:759 #, c-format msgid "Database block size: %u\n" msgstr "Tamaño del bloque de la base de datos: %u\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:761 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Bloques por segmento de relación grande: %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:763 #, c-format msgid "WAL block size: %u\n" msgstr "Tamaño del bloque de WAL: %u\n" -#: pg_resetwal.c:758 pg_resetwal.c:844 +#: pg_resetwal.c:765 pg_resetwal.c:851 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Bytes por segmento WAL: %u\n" -#: pg_resetwal.c:760 +#: pg_resetwal.c:767 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Longitud máxima de identificadores: %u\n" -#: pg_resetwal.c:762 +#: pg_resetwal.c:769 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Máximo número de columnas en un índice: %u\n" -#: pg_resetwal.c:764 +#: pg_resetwal.c:771 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Longitud máxima de un trozo TOAST: %u\n" -#: pg_resetwal.c:766 +#: pg_resetwal.c:773 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Longitud máxima de un trozo de objeto grande: %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:776 #, c-format msgid "Date/time type storage: %s\n" msgstr "Tipo de almacenamiento hora/fecha: %s\n" -#: pg_resetwal.c:770 +#: pg_resetwal.c:777 msgid "64-bit integers" msgstr "enteros de 64 bits" -#: pg_resetwal.c:771 +#: pg_resetwal.c:778 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Paso de parámetros float8: %s\n" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by reference" msgstr "por referencia" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by value" msgstr "por valor" -#: pg_resetwal.c:773 +#: pg_resetwal.c:780 #, c-format msgid "Data page checksum version: %u\n" msgstr "Versión de suma de verificación de datos: %u\n" -#: pg_resetwal.c:787 +#: pg_resetwal.c:794 #, c-format msgid "" "\n" @@ -448,127 +554,149 @@ msgstr "" "Valores a cambiar:\n" "\n" -#: pg_resetwal.c:791 +#: pg_resetwal.c:798 #, c-format msgid "First log segment after reset: %s\n" msgstr "Primer segmento de log después de reiniciar: %s\n" -#: pg_resetwal.c:795 +#: pg_resetwal.c:802 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:797 +#: pg_resetwal.c:804 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:799 +#: pg_resetwal.c:806 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "Base de datos del OldestMulti: %u\n" -#: pg_resetwal.c:805 +#: pg_resetwal.c:812 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:811 +#: pg_resetwal.c:818 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:817 +#: pg_resetwal.c:824 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:826 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:821 +#: pg_resetwal.c:828 #, c-format msgid "OldestXID's DB: %u\n" msgstr "Base de datos del OldestXID: %u\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:834 #, c-format msgid "NextXID epoch: %u\n" msgstr "Epoch del NextXID: %u\n" -#: pg_resetwal.c:833 +#: pg_resetwal.c:840 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:838 +#: pg_resetwal.c:845 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:921 pg_resetwal.c:974 pg_resetwal.c:1009 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "no se pudo abrir el directorio «%s»: %m" - -#: pg_resetwal.c:947 pg_resetwal.c:988 pg_resetwal.c:1026 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "no se pudo leer el directorio «%s»: %m" - -#: pg_resetwal.c:950 pg_resetwal.c:991 pg_resetwal.c:1029 +#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 pg_resetwal.c:1071 #, c-format msgid "could not close directory \"%s\": %m" msgstr "no se pudo abrir el directorio «%s»: %m" -#: pg_resetwal.c:983 pg_resetwal.c:1021 +#: pg_resetwal.c:990 pg_resetwal.c:1028 pg_resetwal.c:1063 #, c-format msgid "could not delete file \"%s\": %m" msgstr "no se pudo borrar el archivo «%s»: %m" -#: pg_resetwal.c:1093 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "no se pudo abrir el archivo «%s»: %m" - -#: pg_resetwal.c:1101 pg_resetwal.c:1113 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "no se pudo escribir el archivo «%s»: %m" - -#: pg_resetwal.c:1118 +#: pg_resetwal.c:1159 #, c-format msgid "fsync error: %m" msgstr "error de fsync: %m" -#: pg_resetwal.c:1127 +#: pg_resetwal.c:1168 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" "\n" msgstr "" -"%s restablece el WAL («write-ahead log») de PostgreSQL.\n" +"%s restablece el WAL (\"write-ahead log\") de PostgreSQL.\n" "\n" -#: pg_resetwal.c:1128 +#: pg_resetwal.c:1169 +#, c-format +msgid "Usage:\n" +msgstr "Empleo:\n" + +#: pg_resetwal.c:1170 +#, c-format +msgid " %s [OPTION]... DATADIR\n" +msgstr " %s [OPCIÓN]... DATADIR\n" + +#: pg_resetwal.c:1172 #, c-format msgid "" -"Usage:\n" -" %s [OPTION]... DATADIR\n" "\n" +"Options:\n" msgstr "" -"Uso:\n" -" %s [OPCIÓN]... DATADIR\n" "\n" +"Opciones:\n" -#: pg_resetwal.c:1129 +#: pg_resetwal.c:1173 #, c-format -msgid "Options:\n" -msgstr "Opciones:\n" +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]DATADIR directorio de datos\n" -#: pg_resetwal.c:1130 +#: pg_resetwal.c:1174 +#, c-format +msgid "" +" -f, --force force update to be done even after unclean shutdown or\n" +" if pg_control values had to be guessed\n" +msgstr "" +" -f, --force forzar que la actualización se haga incluso después\n" +" de un apagado no limpio o si los valores de pg_control\n" +" tuvieron que asumirse\n" + +#: pg_resetwal.c:1176 +#, c-format +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr " -n, --dry-run no actualiza, sólo muestra lo que se haría\n" + +#: pg_resetwal.c:1177 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version mostrar información de versión, luego salir\n" + +#: pg_resetwal.c:1178 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostrar esta ayuda, luego salir\n" + +#: pg_resetwal.c:1180 +#, c-format +msgid "" +"\n" +"Options to override control file values:\n" +msgstr "" +"\n" +"Opciones para sobreescribir valores del archivo de control:\n" + +#: pg_resetwal.c:1181 #, c-format msgid "" " -c, --commit-timestamp-ids=XID,XID\n" @@ -576,87 +704,57 @@ msgid "" " commit timestamp (zero means no change)\n" msgstr "" " -c, --commit-timestamp-ids=XID,XID\n" -" definir la más antigua y la más nueva transacciones\n" -" que llevan timestamp de commit (cero significa no\n" -" cambiar)\n" +" definir la más antigua y la más nueva\n" +" transacciones que llevan timestamp de commit\n" +" (cero significa no cambiar)\n" -#: pg_resetwal.c:1133 -#, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]DATADIR directorio de datos\n" - -#: pg_resetwal.c:1134 +#: pg_resetwal.c:1184 #, c-format msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" -msgstr " -e, --epoch=XIDEPOCH asigna el siguiente «epoch» de ID de transacción\n" - -#: pg_resetwal.c:1135 -#, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force fuerza que la actualización sea hecha\n" +msgstr "" +" -e, --epoch=XIDEPOCH asigna el siguiente \"epoch\" de ID de\n" +" transacción\n" -#: pg_resetwal.c:1136 +#: pg_resetwal.c:1185 #, c-format msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" msgstr "" -" -l, --next-wal-file=ARCHIVOWAL\n" -" fuerza una ubicación inicial mínima para nuevo WAL\n" +" -l, --next-wal-file=ARCHIVOWAL fuerza una ubicación inicial mínima para\n" +" nuevo WAL\n" -#: pg_resetwal.c:1137 +#: pg_resetwal.c:1186 #, c-format msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" msgstr "" -" -m, --multixact-ids=MXID,MXID\n" -" asigna el siguiente ID de multitransacción y\n" -" el más antiguo\n" +" -m, --multixact-ids=MXID,MXID asigna el siguiente ID de multitransacción\n" +" y el más antiguo\n" -#: pg_resetwal.c:1138 -#, c-format -msgid " -n, --dry-run no update, just show what would be done\n" -msgstr " -n, --dry-run no actualiza, sólo muestra lo que se haría\n" - -#: pg_resetwal.c:1139 +#: pg_resetwal.c:1187 #, c-format msgid " -o, --next-oid=OID set next OID\n" -msgstr " -o, --next-oid=OID asigna el siguiente OID\n" +msgstr " -o, --next-oid=OID asigna el siguiente OID\n" -#: pg_resetwal.c:1140 +#: pg_resetwal.c:1188 #, c-format msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" -msgstr "" -" -O, --multixact-offset=OFFSET\n" -" asigna la siguiente posición de multitransacción\n" +msgstr " -O, --multixact-offset=OFFSET asigna la siguiente pos. de multitransacción\n" -#: pg_resetwal.c:1141 +#: pg_resetwal.c:1189 #, c-format msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" -msgstr "" -" -u, --oldest-transaction-id=XID\n" -" asigna el ID de transacción más antiguo\n" +msgstr " -u, --oldest-transaction-id=XID asigna el ID de transacción más antiguo\n" -#: pg_resetwal.c:1142 -#, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version mostrar información de versión y salir\n" - -#: pg_resetwal.c:1143 +#: pg_resetwal.c:1190 #, c-format msgid " -x, --next-transaction-id=XID set next transaction ID\n" -msgstr "" -" -x, --next-transaction-id=XID\n" -" asigna el siguiente ID de transacción\n" +msgstr " -x, --next-transaction-id=XID asigna el siguiente ID de transacción\n" -#: pg_resetwal.c:1144 +#: pg_resetwal.c:1191 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " --wal-segsize=TAMAÑO tamaño de segmentos de WAL, en megabytes\n" - -#: pg_resetwal.c:1145 -#, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help mostrar esta ayuda y salir\n" +msgstr " --wal-segsize=TAMAÑO tamaño de segmentos de WAL, en megabytes\n" -#: pg_resetwal.c:1146 +#: pg_resetwal.c:1193 #, c-format msgid "" "\n" @@ -665,7 +763,7 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: pg_resetwal.c:1147 +#: pg_resetwal.c:1194 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" diff --git a/src/bin/pg_resetwal/po/fr.po b/src/bin/pg_resetwal/po/fr.po index 1010616c30108..dac983a2a57ca 100644 --- a/src/bin/pg_resetwal/po/fr.po +++ b/src/bin/pg_resetwal/po/fr.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-12 05:16+0000\n" -"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"POT-Creation-Date: 2024-08-22 10:21+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -21,228 +21,321 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:280 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "attention : " -#: ../../../src/common/logging.c:291 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "détail : " -#: ../../../src/common/logging.c:298 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "astuce : " -#: ../../common/restricted_token.c:64 +#: ../../common/controldata_utils.c:97 pg_resetwal.c:370 pg_resetwal.c:525 +#: pg_resetwal.c:573 #, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "n'a pas pu charger la bibliothèque « %s » : code d'erreur %lu" +msgid "could not open file \"%s\" for reading: %m" +msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" + +#: ../../common/controldata_utils.c:110 pg_resetwal.c:534 pg_resetwal.c:588 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "n'a pas pu lire le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "n'a pas pu fermer le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "différence de l'ordre des octets" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"possible incohérence dans l'ordre des octets\n" +"L'ordre des octets utilisé pour enregistrer le fichier pg_control peut ne\n" +"pas correspondre à celui utilisé par ce programme. Dans ce cas, les\n" +"résultats ci-dessous sont incorrects, et l'installation de PostgreSQL\n" +"est incompatible avec ce répertoire des données." -#: ../../common/restricted_token.c:73 +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_resetwal.c:1134 #, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "ne peut pas créer les jetons restreints sur cette plateforme : code d'erreur %lu" +msgid "could not open file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier « %s » : %m" -#: ../../common/restricted_token.c:82 +#: ../../common/controldata_utils.c:249 pg_resetwal.c:1142 pg_resetwal.c:1154 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "impossible d'écrire le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "mémoire épuisée\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "n'a pas pu tester le fichier « %s » : %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "cette construction ne supporte pas la méthode de synchronisation « %s »" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_resetwal.c:928 pg_resetwal.c:981 pg_resetwal.c:1016 pg_resetwal.c:1054 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 pg_resetwal.c:1068 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "n'a pas pu lire le répertoire « %s » : %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" + +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "n'a pas pu ouvrir le jeton du processus : code d'erreur %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "n'a pas pu allouer les SID : code d'erreur %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "n'a pas pu créer le jeton restreint : code d'erreur %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "valeur « %s » invalide pour l'option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s doit être compris entre %d et %d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "méthode de synchronisation non reconnu : %s" + #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202 -#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249 -#: pg_resetwal.c:269 pg_resetwal.c:280 +#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 +#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 +#: pg_resetwal.c:270 pg_resetwal.c:281 #, c-format msgid "invalid argument for option %s" msgstr "argument invalide pour l'option %s" -#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 -#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 -#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316 -#: pg_resetwal.c:323 +#: pg_resetwal.c:165 pg_resetwal.c:178 pg_resetwal.c:191 pg_resetwal.c:204 +#: pg_resetwal.c:211 pg_resetwal.c:230 pg_resetwal.c:243 pg_resetwal.c:251 +#: pg_resetwal.c:271 pg_resetwal.c:282 pg_resetwal.c:307 pg_resetwal.c:320 +#: pg_resetwal.c:327 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_resetwal.c:168 +#: pg_resetwal.c:169 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "la valeur epoch de l'identifiant de transaction (-e) ne doit pas être -1" -#: pg_resetwal.c:181 +#: pg_resetwal.c:182 #, c-format msgid "oldest transaction ID (-u) must be greater than or equal to %u" msgstr "l'identifiant de transaction le plus ancien (-u) doit être supérieur ou égal à %u" -#: pg_resetwal.c:194 +#: pg_resetwal.c:195 #, c-format msgid "transaction ID (-x) must be greater than or equal to %u" msgstr "l'identifiant de transaction (-x) doit être supérieur ou égal à %u" -#: pg_resetwal.c:216 pg_resetwal.c:220 +#: pg_resetwal.c:217 pg_resetwal.c:221 #, c-format -msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" -msgstr "l'identifiant de transaction (-c) doit être 0 ou supérieur ou égal à 2" +msgid "transaction ID (-c) must be either %u or greater than or equal to %u" +msgstr "l'identifiant de transaction (-c) doit être %u ou supérieur ou égal à %u" -#: pg_resetwal.c:233 +#: pg_resetwal.c:234 #, c-format msgid "OID (-o) must not be 0" msgstr "l'OID (-o) ne doit pas être 0" -#: pg_resetwal.c:254 +#: pg_resetwal.c:255 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "l'identifiant de multi-transaction (-m) ne doit pas être 0" -#: pg_resetwal.c:261 +#: pg_resetwal.c:262 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "l'identifiant de multi-transaction le plus ancien (-m) ne doit pas être 0" -#: pg_resetwal.c:274 +#: pg_resetwal.c:275 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "le décalage de multi-transaction (-O) ne doit pas être -1" -#: pg_resetwal.c:296 -#, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "l'argument de --wal-segsize doit être un nombre" - -#: pg_resetwal.c:298 +#: pg_resetwal.c:301 #, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "l'argument de --wal-segsize doit être une puissance de 2 comprise entre 1 et 1024" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "l'argument de %s doit être une puissance de 2 comprise entre 1 et 1024" -#: pg_resetwal.c:314 +#: pg_resetwal.c:318 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_resetwal.c:322 +#: pg_resetwal.c:326 #, c-format msgid "no data directory specified" msgstr "aucun répertoire de données indiqué" -#: pg_resetwal.c:336 +#: pg_resetwal.c:340 #, c-format msgid "cannot be executed by \"root\"" msgstr "ne peut pas être exécuté par « root »" -#: pg_resetwal.c:337 +#: pg_resetwal.c:341 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL." -#: pg_resetwal.c:347 +#: pg_resetwal.c:351 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "n'a pas pu lire les droits du répertoire « %s » : %m" -#: pg_resetwal.c:353 +#: pg_resetwal.c:357 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "n'a pas pu modifier le répertoire par « %s » : %m" -#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" - -#: pg_resetwal.c:371 +#: pg_resetwal.c:375 #, c-format msgid "lock file \"%s\" exists" msgstr "le fichier verrou « %s » existe" -#: pg_resetwal.c:372 +#: pg_resetwal.c:376 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "Le serveur est-il démarré ? Sinon, supprimer le fichier verrou et réessayer." -#: pg_resetwal.c:467 +#: pg_resetwal.c:475 #, c-format -msgid "" -"\n" -"If these values seem acceptable, use -f to force reset.\n" -msgstr "" -"\n" -"Si ces valeurs semblent acceptables, utiliser -f pour forcer la\n" -"réinitialisation.\n" +msgid "not proceeding because control file values were guessed" +msgstr "ne continue pas car les valeurs du fichier de contrôle devraient être devinées" -#: pg_resetwal.c:479 +#: pg_resetwal.c:476 #, c-format -msgid "" -"The database server was not shut down cleanly.\n" -"Resetting the write-ahead log might cause data to be lost.\n" -"If you want to proceed anyway, use -f to force reset.\n" -msgstr "" -"Le serveur de bases de données n'a pas été arrêté proprement.\n" -"Ré-initialiser le journal des transactions peut occasionner des pertes de\n" -"données.\n" -"Pour continuer malgré tout, utiliser -f pour forcer la\n" -"réinitialisation.\n" +msgid "If these values seem acceptable, use -f to force reset." +msgstr "Si ces valeurs semblent acceptables, utiliser -f pour forcer la réinitialisation." + +#: pg_resetwal.c:485 +#, c-format +msgid "database server was not shut down cleanly" +msgstr "le serveur de bases de données n'a pas été arrêté proprement" + +#: pg_resetwal.c:486 +#, c-format +msgid "Resetting the write-ahead log might cause data to be lost." +msgstr "Réinitialiser les journaux de transactions pourrait causer des pertes de données." + +#: pg_resetwal.c:487 +#, c-format +msgid "If you want to proceed anyway, use -f to force reset." +msgstr "Si vous voulez continuer malgré tout, utiliser -f pour forcer la réinitialisation." -#: pg_resetwal.c:493 +#: pg_resetwal.c:500 #, c-format msgid "Write-ahead log reset\n" msgstr "Réinitialisation des journaux de transactions\n" -#: pg_resetwal.c:525 +#: pg_resetwal.c:532 #, c-format msgid "unexpected empty file \"%s\"" msgstr "fichier vide inattendu « %s »" -#: pg_resetwal.c:527 pg_resetwal.c:581 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "n'a pas pu lire le fichier « %s » : %m" - -#: pg_resetwal.c:535 +#: pg_resetwal.c:542 #, c-format msgid "data directory is of wrong version" msgstr "le répertoire des données a une mauvaise version" -#: pg_resetwal.c:536 +#: pg_resetwal.c:543 #, c-format msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." msgstr "Le fichier « %s » contient « %s », qui n'est pas compatible avec la version « %s » de ce programme." -#: pg_resetwal.c:569 +#: pg_resetwal.c:576 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -253,24 +346,24 @@ msgstr "" " touch %s\n" "et réessayer." -#: pg_resetwal.c:597 +#: pg_resetwal.c:604 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "pg_control existe mais son CRC est invalide ; agir avec précaution" -#: pg_resetwal.c:606 +#: pg_resetwal.c:613 #, c-format msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" msgstr[0] "pg_control spécifie une taille invalide de segment WAL (%d octet) ; agir avec précaution" msgstr[1] "pg_control spécifie une taille invalide de segment WAL (%d octets) ; agir avec précaution" -#: pg_resetwal.c:617 +#: pg_resetwal.c:624 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "pg_control existe mais est corrompu ou de mauvaise version ; ignoré" -#: pg_resetwal.c:712 +#: pg_resetwal.c:719 #, c-format msgid "" "Guessed pg_control values:\n" @@ -279,7 +372,7 @@ msgstr "" "Valeurs de pg_control devinées :\n" "\n" -#: pg_resetwal.c:714 +#: pg_resetwal.c:721 #, c-format msgid "" "Current pg_control values:\n" @@ -288,167 +381,167 @@ msgstr "" "Valeurs actuelles de pg_control :\n" "\n" -#: pg_resetwal.c:716 +#: pg_resetwal.c:723 #, c-format msgid "pg_control version number: %u\n" msgstr "Numéro de version de pg_control : %u\n" -#: pg_resetwal.c:718 +#: pg_resetwal.c:725 #, c-format msgid "Catalog version number: %u\n" msgstr "Numéro de version du catalogue : %u\n" -#: pg_resetwal.c:720 +#: pg_resetwal.c:727 #, c-format msgid "Database system identifier: %llu\n" msgstr "Identifiant du système de base de données : %llu\n" -#: pg_resetwal.c:722 +#: pg_resetwal.c:729 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "Dernier TimeLineID du point de contrôle : %u\n" -#: pg_resetwal.c:724 +#: pg_resetwal.c:731 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Dernier full_page_writes du point de contrôle : %s\n" -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "off" msgstr "désactivé" -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "on" msgstr "activé" -#: pg_resetwal.c:726 +#: pg_resetwal.c:733 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "Dernier NextXID du point de contrôle : %u:%u\n" -#: pg_resetwal.c:729 +#: pg_resetwal.c:736 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "Dernier NextOID du point de contrôle : %u\n" -#: pg_resetwal.c:731 +#: pg_resetwal.c:738 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "Dernier NextMultiXactId du point de contrôle : %u\n" -#: pg_resetwal.c:733 +#: pg_resetwal.c:740 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "Dernier NextMultiOffset du point de contrôle : %u\n" -#: pg_resetwal.c:735 +#: pg_resetwal.c:742 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "Dernier oldestXID du point de contrôle : %u\n" -#: pg_resetwal.c:737 +#: pg_resetwal.c:744 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "Dernier oldestXID du point de contrôle de la base : %u\n" -#: pg_resetwal.c:739 +#: pg_resetwal.c:746 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "Dernier oldestActiveXID du point de contrôle : %u\n" -#: pg_resetwal.c:741 +#: pg_resetwal.c:748 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" -msgstr "Dernier oldestMultiXID du point de contrôle : %u\n" +msgstr "Dernier oldestMultiXid du point de contrôle : %u\n" -#: pg_resetwal.c:743 +#: pg_resetwal.c:750 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" -msgstr "Dernier oldestMulti du point de contrôle de la base : %u\n" +msgstr "Dernier oldestMulti du point de contrôle de la base : %u\n" -#: pg_resetwal.c:745 +#: pg_resetwal.c:752 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "Dernier oldestCommitTsXid du point de contrôle : %u\n" -#: pg_resetwal.c:747 +#: pg_resetwal.c:754 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "Dernier newestCommitTsXid du point de contrôle : %u\n" -#: pg_resetwal.c:749 +#: pg_resetwal.c:756 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Alignement maximal des données : %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:759 #, c-format msgid "Database block size: %u\n" msgstr "Taille du bloc de la base de données : %u\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:761 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Blocs par segment des relations volumineuses : %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:763 #, c-format msgid "WAL block size: %u\n" msgstr "Taille de bloc du journal de transaction : %u\n" -#: pg_resetwal.c:758 pg_resetwal.c:844 +#: pg_resetwal.c:765 pg_resetwal.c:851 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Octets par segment du journal de transaction : %u\n" -#: pg_resetwal.c:760 +#: pg_resetwal.c:767 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Longueur maximale des identifiants : %u\n" -#: pg_resetwal.c:762 +#: pg_resetwal.c:769 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Nombre maximum de colonnes d'un index: %u\n" -#: pg_resetwal.c:764 +#: pg_resetwal.c:771 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Longueur maximale d'un morceau TOAST : %u\n" -#: pg_resetwal.c:766 +#: pg_resetwal.c:773 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Taille d'un morceau de Large Object : %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:776 #, c-format msgid "Date/time type storage: %s\n" msgstr "Stockage du type date/heure : %s\n" -#: pg_resetwal.c:770 +#: pg_resetwal.c:777 msgid "64-bit integers" msgstr "entiers 64-bits" -#: pg_resetwal.c:771 +#: pg_resetwal.c:778 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Passage d'argument float8 : %s\n" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by reference" msgstr "par référence" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by value" msgstr "par valeur" -#: pg_resetwal.c:773 +#: pg_resetwal.c:780 #, c-format msgid "Data page checksum version: %u\n" -msgstr "Version des sommes de contrôle des pages de données : %u\n" +msgstr "Version des sommes de contrôle des pages de données : %u\n" -#: pg_resetwal.c:787 +#: pg_resetwal.c:794 #, c-format msgid "" "\n" @@ -461,102 +554,82 @@ msgstr "" "Valeurs à changer :\n" "\n" -#: pg_resetwal.c:791 +#: pg_resetwal.c:798 #, c-format msgid "First log segment after reset: %s\n" msgstr "Premier segment du journal après réinitialisation : %s\n" -#: pg_resetwal.c:795 +#: pg_resetwal.c:802 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:797 +#: pg_resetwal.c:804 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:799 +#: pg_resetwal.c:806 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "OldestMulti's DB: %u\n" -#: pg_resetwal.c:805 +#: pg_resetwal.c:812 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:811 +#: pg_resetwal.c:818 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:817 +#: pg_resetwal.c:824 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:826 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:821 +#: pg_resetwal.c:828 #, c-format msgid "OldestXID's DB: %u\n" msgstr "OldestXID's DB: %u\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:834 #, c-format msgid "NextXID epoch: %u\n" msgstr "NextXID Epoch: %u\n" -#: pg_resetwal.c:833 +#: pg_resetwal.c:840 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:838 +#: pg_resetwal.c:845 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" - -#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "n'a pas pu lire le répertoire « %s » : %m" - -#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 +#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 pg_resetwal.c:1071 #, c-format msgid "could not close directory \"%s\": %m" msgstr "n'a pas pu fermer le répertoire « %s » : %m" -#: pg_resetwal.c:990 pg_resetwal.c:1028 +#: pg_resetwal.c:990 pg_resetwal.c:1028 pg_resetwal.c:1063 #, c-format msgid "could not delete file \"%s\": %m" msgstr "n'a pas pu supprimer le fichier « %s » : %m" -#: pg_resetwal.c:1100 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "n'a pas pu ouvrir le fichier « %s » : %m" - -#: pg_resetwal.c:1108 pg_resetwal.c:1120 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "impossible d'écrire le fichier « %s » : %m" - -#: pg_resetwal.c:1125 +#: pg_resetwal.c:1159 #, c-format msgid "fsync error: %m" msgstr "erreur fsync : %m" -#: pg_resetwal.c:1134 +#: pg_resetwal.c:1168 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -565,23 +638,64 @@ msgstr "" "%s réinitialise le journal des transactions PostgreSQL.\n" "\n" -#: pg_resetwal.c:1135 +#: pg_resetwal.c:1169 +#, c-format +msgid "Usage:\n" +msgstr "Usage :\n" + +#: pg_resetwal.c:1170 +#, c-format +msgid " %s [OPTION]... DATADIR\n" +msgstr " %s [OPTION]... [RÉP_DONNÉES]\n" + +#: pg_resetwal.c:1172 #, c-format msgid "" -"Usage:\n" -" %s [OPTION]... DATADIR\n" "\n" +"Options:\n" msgstr "" -"Usage :\n" -" %s [OPTION]... RÉP_DONNÉES\n" "\n" +"Options :\n" + +#: pg_resetwal.c:1173 +#, c-format +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata] RÉP_DONNEES répertoire de la base de données\n" + +#: pg_resetwal.c:1174 +#, c-format +msgid "" +" -f, --force force update to be done even after unclean shutdown or\n" +" if pg_control values had to be guessed\n" +msgstr " -i, --interactive force la mise à jour, y compris un arrêt pas propre ou si les valeurs de pg_control doivent être devinées\n" + +#: pg_resetwal.c:1176 +#, c-format +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr "" +" -n, --dry-run pas de mise à jour, affiche\n" +" simplement ce qui sera fait\n" -#: pg_resetwal.c:1136 +#: pg_resetwal.c:1177 #, c-format -msgid "Options:\n" -msgstr "Options :\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version affiche la version puis quitte\n" + +#: pg_resetwal.c:1178 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_resetwal.c:1137 +#: pg_resetwal.c:1180 +#, c-format +msgid "" +"\n" +"Options to override control file values:\n" +msgstr "" +"\n" +"Options contrôlant les valeurs du fichier de contrôle :\n" + +#: pg_resetwal.c:1181 #, c-format msgid "" " -c, --commit-timestamp-ids=XID,XID\n" @@ -593,86 +707,59 @@ msgstr "" " et la plus récente contenant les dates/heures\n" " de validation (zéro signifie aucun changement)\n" -#: pg_resetwal.c:1140 -#, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]RÉP_DONNEES répertoire de la base de données\n" - -#: pg_resetwal.c:1141 +#: pg_resetwal.c:1184 #, c-format msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" msgstr "" " -e, --epoch=XIDEPOCH configure la valeur epoch du prochain\n" " identifiant de transaction\n" -#: pg_resetwal.c:1142 -#, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force force la mise à jour\n" - -#: pg_resetwal.c:1143 +#: pg_resetwal.c:1185 #, c-format msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" msgstr "" " -l, --next-wal-file=FICHIERWAL configure l'emplacement minimal de début\n" " des WAL du nouveau journal de transactions\n" -#: pg_resetwal.c:1144 +#: pg_resetwal.c:1186 #, c-format msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" msgstr "" " -m, --multixact-ids=MXID,MXID configure le prochain et le plus ancien\n" " identifiants multi-transactions\n" -#: pg_resetwal.c:1145 -#, c-format -msgid " -n, --dry-run no update, just show what would be done\n" -msgstr "" -" -n, --dry-run pas de mise à jour, affiche\n" -" simplement ce qui sera fait\n" - -#: pg_resetwal.c:1146 +#: pg_resetwal.c:1187 #, c-format msgid " -o, --next-oid=OID set next OID\n" msgstr " -o, --next-oid=OID configure le prochain OID\n" -#: pg_resetwal.c:1147 +#: pg_resetwal.c:1188 #, c-format msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" msgstr "" " -O, --multixact-offset=DÉCALAGE configure le prochain décalage\n" " multitransaction\n" -#: pg_resetwal.c:1148 +#: pg_resetwal.c:1189 #, c-format msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" msgstr "" " -u, --oldest-transaction-id=XID configure l'identifiant de transaction le\n" " plus ancien\n" -#: pg_resetwal.c:1149 -#, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version affiche la version puis quitte\n" - -#: pg_resetwal.c:1150 +#: pg_resetwal.c:1190 #, c-format msgid " -x, --next-transaction-id=XID set next transaction ID\n" msgstr "" " -x, --next-transaction-id=XID configure le prochain identifiant de\n" " transaction\n" -#: pg_resetwal.c:1151 +#: pg_resetwal.c:1191 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=TAILLE configure la taille des segments WAL, en Mo\n" -#: pg_resetwal.c:1152 -#, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help affiche cette aide puis quitte\n" - -#: pg_resetwal.c:1153 +#: pg_resetwal.c:1193 #, c-format msgid "" "\n" @@ -681,159 +768,7 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_resetwal.c:1154 +#: pg_resetwal.c:1194 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" - -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" - -#~ msgid " (zero in either value means no change)\n" -#~ msgstr " (zéro dans l'une des deux valeurs signifie aucun changement)\n" - -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide et quitte\n" - -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version afficherla version et quitte\n" - -#~ msgid " -?, --help show this help, then exit\n" -#~ msgstr " -?, --help affiche cette aide, puis quitte\n" - -#~ msgid " -?, --help show this help, then exit\n" -#~ msgstr " -?, --help affiche cette aide et quitte\n" - -#~ msgid " -V, --version output version information, then exit\n" -#~ msgstr " -V, --version affiche la version, puis quitte\n" - -#~ msgid " -V, --version output version information, then exit\n" -#~ msgstr " -V, --version affiche la version et quitte\n" - -#~ msgid " -c XID,XID set oldest and newest transactions bearing commit timestamp\n" -#~ msgstr " -c XID,XID configure la plus ancienne et la plus récente transaction\n" - -#~ msgid " -x XID set next transaction ID\n" -#~ msgstr " -x XID fixe le prochain identifiant de transaction\n" - -#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n" -#~ msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n" - -#~ msgid "%s: argument of --wal-segsize must be a number\n" -#~ msgstr "%s : l'argument de --wal-segsize doit être un nombre\n" - -#~ msgid "%s: argument of --wal-segsize must be a power of 2 between 1 and 1024\n" -#~ msgstr "%s : l'argument de --wal-segsize doit être une puissance de 2 entre 1 et 1024\n" - -#~ msgid "%s: cannot be executed by \"root\"\n" -#~ msgstr "%s : ne peut pas être exécuté par « root »\n" - -#~ msgid "%s: could not allocate SIDs: error code %lu\n" -#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n" - -#~ msgid "%s: could not change directory to \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu accéder au répertoire « %s » : %s\n" - -#~ msgid "%s: could not close directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu fermer le répertoire « %s » : %s\n" - -#~ msgid "%s: could not create pg_control file: %s\n" -#~ msgstr "%s : n'a pas pu créer le fichier pg_control : %s\n" - -#~ msgid "%s: could not create restricted token: error code %lu\n" -#~ msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n" - -#~ msgid "%s: could not delete file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu supprimer le fichier « %s » : %s\n" - -#~ msgid "%s: could not get exit code from subprocess: error code %lu\n" -#~ msgstr "%s : n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu\n" - -#~ msgid "%s: could not open directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n" - -#~ msgid "%s: could not open file \"%s\" for reading: %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » en lecture : %s\n" - -#~ msgid "%s: could not open file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" - -#~ msgid "%s: could not open process token: error code %lu\n" -#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n" - -#~ msgid "%s: could not re-execute with restricted token: error code %lu\n" -#~ msgstr "%s : n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu\n" - -#~ msgid "%s: could not read directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" - -#~ msgid "%s: could not read file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le fichier « %s » : %s\n" - -#~ msgid "%s: could not read from directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire le répertoire « %s » : %s\n" - -#~ msgid "%s: could not read permissions of directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire les droits sur le répertoire « %s » : %s\n" - -#~ msgid "%s: could not start process for command \"%s\": error code %lu\n" -#~ msgstr "%s : n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu\n" - -#~ msgid "%s: could not write file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu écrire le fichier « %s » : %s\n" - -#~ msgid "%s: could not write pg_control file: %s\n" -#~ msgstr "%s : n'a pas pu écrire le fichier pg_control : %s\n" - -#~ msgid "%s: internal error -- sizeof(ControlFileData) is too large ... fix PG_CONTROL_SIZE\n" -#~ msgstr "" -#~ "%s : erreur interne -- sizeof(ControlFileData) est trop important...\n" -#~ "corrigez PG_CONTROL_SIZE\n" - -#~ msgid "%s: invalid argument for option -O\n" -#~ msgstr "%s : argument invalide pour l'option -O\n" - -#~ msgid "%s: invalid argument for option -l\n" -#~ msgstr "%s : argument invalide pour l'option -l\n" - -#~ msgid "%s: invalid argument for option -m\n" -#~ msgstr "%s : argument invalide pour l'option -m\n" - -#~ msgid "%s: invalid argument for option -o\n" -#~ msgstr "%s : argument invalide pour l'option -o\n" - -#~ msgid "%s: invalid argument for option -x\n" -#~ msgstr "%s : argument invalide pour l'option -x\n" - -#~ msgid "%s: no data directory specified\n" -#~ msgstr "%s : aucun répertoire de données indiqué\n" - -#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" -#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" - -#~ msgid "First log file ID after reset: %u\n" -#~ msgstr "Premier identifiant du journal après réinitialisation : %u\n" - -#~ msgid "Float4 argument passing: %s\n" -#~ msgstr "Passage d'argument float4 : %s\n" - -#~ msgid "Transaction log reset\n" -#~ msgstr "Réinitialisation du journal des transactions\n" - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayer « %s --help » pour plus d'informations.\n" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatal : " - -#~ msgid "floating-point numbers" -#~ msgstr "nombres à virgule flottante" - -#~ msgid "transaction ID (-x) must not be 0" -#~ msgstr "l'identifiant de la transaction (-x) ne doit pas être 0" diff --git a/src/bin/pg_resetwal/po/it.po b/src/bin/pg_resetwal/po/it.po index 55ed8f89e24ce..3e6852fbab9cf 100644 --- a/src/bin/pg_resetwal/po/it.po +++ b/src/bin/pg_resetwal/po/it.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-09-26 08:18+0000\n" -"PO-Revision-Date: 2022-10-02 19:06+0200\n" +"PO-Revision-Date: 2023-09-05 08:20+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: it\n" @@ -589,67 +589,67 @@ msgstr "" #: pg_resetwal.c:1140 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]DATADIR directory dei dati\n" +msgstr " [-D, --pgdata=]DATADIR directory dei dati\n" #: pg_resetwal.c:1141 #, c-format msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" -msgstr " -e, --epoch=XIDEPOCH imposta l'epoca dell'ID transazione successiva\n" +msgstr " -e, --epoch=XIDEPOCH imposta l'epoca dell'ID transazione successiva\n" #: pg_resetwal.c:1142 #, c-format msgid " -f, --force force update to be done\n" -msgstr " -f, --force forza l'aggiornamento da eseguire\n" +msgstr " -f, --force forza l'aggiornamento da eseguire\n" #: pg_resetwal.c:1143 #, c-format msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" -msgstr " -l, --next-wal-file=WALFILE imposta la posizione iniziale minima per il nuovo WAL\n" +msgstr " -l, --next-wal-file=WALFILE imposta la posizione iniziale minima per il nuovo WAL\n" #: pg_resetwal.c:1144 #, c-format msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" -msgstr " -m, --multixact-ids=MXID,MXID imposta l'ID multitransazione successivo e meno recente\n" +msgstr " -m, --multixact-ids=MXID,MXID imposta l'ID multitransazione successivo e meno recente\n" #: pg_resetwal.c:1145 #, c-format msgid " -n, --dry-run no update, just show what would be done\n" -msgstr " -n, --dry-run nessun aggiornamento, mostra solo cosa sarebbe stato fatto\n" +msgstr " -n, --dry-run nessun aggiornamento, mostra solo cosa sarebbe stato fatto\n" #: pg_resetwal.c:1146 #, c-format msgid " -o, --next-oid=OID set next OID\n" -msgstr " -o, --next-oid=OID imposta l'OID successivo\n" +msgstr " -o, --next-oid=OID imposta l'OID successivo\n" #: pg_resetwal.c:1147 #, c-format msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" -msgstr " -O, --multixact-offset=OFFSET imposta l'offset multitransazione successivo\n" +msgstr " -O, --multixact-offset=OFFSET imposta l'offset multitransazione successivo\n" #: pg_resetwal.c:1148 #, c-format msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" -msgstr " -u, --oldest-transaction-id=XID imposta l'ID transazione più vecchio\n" +msgstr " -u, --oldest-transaction-id=XID imposta l'ID transazione più vecchio\n" #: pg_resetwal.c:1149 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version restituisce le informazioni sulla versione, quindi esci\n" +msgstr " -V, --version restituisce le informazioni sulla versione, quindi esci\n" #: pg_resetwal.c:1150 #, c-format msgid " -x, --next-transaction-id=XID set next transaction ID\n" -msgstr " -x, --next-transaction-id=XID imposta l'ID transazione successiva\n" +msgstr " -x, --next-transaction-id=XID imposta l'ID transazione successiva\n" #: pg_resetwal.c:1151 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " --wal-segsize=SIZE dimensione dei segmenti WAL, in megabyte \n" +msgstr " --wal-segsize=SIZE dimensione dei segmenti WAL, in megabyte \n" #: pg_resetwal.c:1152 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help mostra questo aiuto, quindi esci\n" +msgstr " -?, --help mostra questo aiuto, quindi esci\n" #: pg_resetwal.c:1153 #, c-format diff --git a/src/bin/pg_resetwal/po/ja.po b/src/bin/pg_resetwal/po/ja.po index 09bbde4e2b36e..c229e1eb4ba26 100644 --- a/src/bin/pg_resetwal/po/ja.po +++ b/src/bin/pg_resetwal/po/ja.po @@ -1,7 +1,7 @@ # pg_resetwal.po # Japanese message translation file for pg_resetwal # -# Copyright (C) 2005-2022 PostgreSQL Global Development Group +# Copyright (C) 2005-2024 PostgreSQL Global Development Group # # Shigehiro Honda , 2005. # @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_resetwal (PostgreSQL 16)\n" +"Project-Id-Version: pg_resetwal (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-26 11:15+0900\n" -"PO-Revision-Date: 2022-09-26 15:10+0900\n" +"POT-Creation-Date: 2023-10-11 09:39+0900\n" +"PO-Revision-Date: 2023-10-11 11:00+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -82,8 +82,8 @@ msgstr "オプション%sã®å¼•æ•°ãŒä¸æ­£ã§ã™" #: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 #: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 -#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316 -#: pg_resetwal.c:323 +#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:306 pg_resetwal.c:319 +#: pg_resetwal.c:326 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" @@ -105,8 +105,8 @@ msgstr "トランザクションID(-x)ã¯%uã‚‚ã—ãã¯ãれ以上ã§ãªã‘れ #: pg_resetwal.c:216 pg_resetwal.c:220 #, c-format -msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" -msgstr "トランザクションID(-c)ã¯0ã‚‚ã—ãã¯2以上ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" +msgid "transaction ID (-c) must be either %u or greater than or equal to %u" +msgstr "トランザクションID(-c)ã¯%uã¾ãŸã¯%u以上ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" #: pg_resetwal.c:233 #, c-format @@ -128,107 +128,107 @@ msgstr "最å¤ã®ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ID(-m)ã¯0ã«ã¯ã§ãã¾ã› msgid "multitransaction offset (-O) must not be -1" msgstr "マルãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚ªãƒ•セット(-O)ã¯-1ã«ã¯ã§ãã¾ã›ã‚“" -#: pg_resetwal.c:296 +#: pg_resetwal.c:300 #, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "--wal-segsizã®å¼•æ•°ã¯æ•°å€¤ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "%sã®å¼•æ•°ã¯1ã‹ã‚‰1024ã¾ã§ã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_resetwal.c:298 -#, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "--wal-segsizeã®å¼•æ•°ã¯1ã‹ã‚‰1024ã®é–“ã®2ã®ã¹ãä¹—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" - -#: pg_resetwal.c:314 +#: pg_resetwal.c:317 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")" -#: pg_resetwal.c:322 +#: pg_resetwal.c:325 #, c-format msgid "no data directory specified" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: pg_resetwal.c:336 +#: pg_resetwal.c:339 #, c-format msgid "cannot be executed by \"root\"" msgstr "\"root\"ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: pg_resetwal.c:337 +#: pg_resetwal.c:340 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "PostgreSQLã®ã‚¹ãƒ¼ãƒ‘ーユーザーã§%sを実行ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_resetwal.c:347 +#: pg_resetwal.c:350 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"ã®æ¨©é™ã‚’読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_resetwal.c:353 +#: pg_resetwal.c:356 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "ディレクトリ\"%s\"ã«ç§»å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566 +#: pg_resetwal.c:369 pg_resetwal.c:523 pg_resetwal.c:571 #, c-format msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読ã¿å–り用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_resetwal.c:371 +#: pg_resetwal.c:374 #, c-format msgid "lock file \"%s\" exists" msgstr "ロックファイル\"%s\"ãŒå­˜åœ¨ã—ã¾ã™" -#: pg_resetwal.c:372 +#: pg_resetwal.c:375 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "サーãƒãƒ¼ãŒç¨¼å‹•ã—ã¦ã„ã¾ã›ã‚“ã‹? ãã†ã§ãªã‘れã°ãƒ­ãƒƒã‚¯ãƒ•ァイルを削除ã—å†å®Ÿè¡Œã—ã¦ãã ã•ã„。" -#: pg_resetwal.c:467 +#: pg_resetwal.c:474 #, c-format -msgid "" -"\n" -"If these values seem acceptable, use -f to force reset.\n" -msgstr "" -"\n" -"ã“ã®å€¤ãŒé©åˆ‡ã ã¨æ€ã‚れるã®ã§ã‚れã°ã€-fを使用ã—ã¦å¼·åˆ¶ãƒªã‚»ãƒƒãƒˆã—ã¦ãã ã•ã„。\n" +msgid "not proceeding because control file values were guessed" +msgstr "制御ファイルã®å€¤ãŒæŽ¨æ¸¬å€¤ã§ã‚ã‚‹ãŸã‚ã€å‡¦ç†ã‚’ã“ã“ã§çµ‚了ã—ã¾ã™" -#: pg_resetwal.c:479 +#: pg_resetwal.c:475 #, c-format -msgid "" -"The database server was not shut down cleanly.\n" -"Resetting the write-ahead log might cause data to be lost.\n" -"If you want to proceed anyway, use -f to force reset.\n" -msgstr "" -"データベースサーãƒãƒ¼ãŒæ­£ã—ãシャットダウンã•れã¦ã„ã¾ã›ã‚“ã§ã—ãŸã€‚\n" -"先行書ãè¾¼ã¿ãƒ­ã‚°ã®ãƒªã‚»ãƒƒãƒˆã«ã¯ãƒ‡ãƒ¼ã‚¿æå¤±ã®æã‚ŒãŒã‚りã¾ã™ã€‚\n" -"ã¨ã«ã‹ã処ç†ã—ãŸã„ã®ã§ã‚れã°ã€-fã§ãƒªã‚»ãƒƒãƒˆã‚’強制ã—ã¦ãã ã•ã„。\n" +msgid "If these values seem acceptable, use -f to force reset." +msgstr "ã“ã®å€¤ã‚’許容ã§ãã‚‹å ´åˆã¯ã€-fを使用ã—ã¦å¼·åˆ¶ãƒªã‚»ãƒƒãƒˆã—ã¦ãã ã•ã„。" + +#: pg_resetwal.c:484 +#, c-format +msgid "database server was not shut down cleanly" +msgstr "ターゲットサーãƒãƒ¼ã¯ã‚¯ãƒªãƒ¼ãƒ³ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•れã¦ã„ã¾ã›ã‚“" + +#: pg_resetwal.c:485 +#, c-format +msgid "Resetting the write-ahead log might cause data to be lost." +msgstr "先行書ãè¾¼ã¿ãƒ­(WAL)グをリセットã™ã‚‹ã¨ã€ãƒ‡ãƒ¼ã‚¿ãŒå¤±ã‚れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" -#: pg_resetwal.c:493 +#: pg_resetwal.c:486 +#, c-format +msgid "If you want to proceed anyway, use -f to force reset." +msgstr "ã¨ã«ã‹ã続行ã—ãŸã„ã¨ã„ã†å ´åˆã«ã¯ã€-f ã§ãƒªã‚»ãƒƒãƒˆã‚’強行ã§ãã¾ã™ã€‚" + +#: pg_resetwal.c:498 #, c-format msgid "Write-ahead log reset\n" msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ãŒãƒªã‚»ãƒƒãƒˆã•れã¾ã—ãŸ\n" -#: pg_resetwal.c:525 +#: pg_resetwal.c:530 #, c-format msgid "unexpected empty file \"%s\"" msgstr "想定外ã®ç©ºã®ãƒ•ァイル\"%s\"" -#: pg_resetwal.c:527 pg_resetwal.c:581 +#: pg_resetwal.c:532 pg_resetwal.c:586 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"ã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: pg_resetwal.c:535 +#: pg_resetwal.c:540 #, c-format msgid "data directory is of wrong version" msgstr "データディレクトリã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒé•ã„ã¾ã™" -#: pg_resetwal.c:536 +#: pg_resetwal.c:541 #, c-format msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." msgstr "ファイル\"%s\"ã§ã¯\"%s\"ã¨ãªã£ã¦ã„ã¾ã™ã€ã“れã¯ã“ã®ãƒ—ログラムã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³\"%s\"ã¨äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: pg_resetwal.c:569 +#: pg_resetwal.c:574 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -239,23 +239,23 @@ msgstr "" " touch %s\n" "ã®å¾Œã«å†å®Ÿè¡Œã—ã¦ãã ã•ã„。" -#: pg_resetwal.c:597 +#: pg_resetwal.c:602 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "pg_controlãŒã‚りã¾ã—ãŸãŒã€CRCãŒä¸æ­£ã§ã—ãŸ; 注æ„ã—ã¦é€²ã‚ã¦ãã ã•ã„" -#: pg_resetwal.c:606 +#: pg_resetwal.c:611 #, c-format msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" msgstr[0] "pg_controlã«ã‚ã‚‹WALセグメントサイズ(%dãƒã‚¤ãƒˆ)ã¯ä¸æ­£ã§ã™; 注æ„ã—ã¦é€²ã‚ã¦ãã ã•ã„" -#: pg_resetwal.c:617 +#: pg_resetwal.c:622 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "pg_controlãŒã‚りã¾ã—ãŸãŒã€ç ´æã‚ã‚‹ã„ã¯é–“é•ã£ãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™; 無視ã—ã¾ã™" -#: pg_resetwal.c:712 +#: pg_resetwal.c:717 #, c-format msgid "" "Guessed pg_control values:\n" @@ -264,7 +264,7 @@ msgstr "" "pg_controlã®æŽ¨æ¸¬å€¤:\n" "\n" -#: pg_resetwal.c:714 +#: pg_resetwal.c:719 #, c-format msgid "" "Current pg_control values:\n" @@ -273,167 +273,167 @@ msgstr "" "ç¾åœ¨ã®pg_controlã®å€¤:\n" "\n" -#: pg_resetwal.c:716 +#: pg_resetwal.c:721 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_controlãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·: %u\n" -#: pg_resetwal.c:718 +#: pg_resetwal.c:723 #, c-format msgid "Catalog version number: %u\n" msgstr "カタログãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·: %u\n" -#: pg_resetwal.c:720 +#: pg_resetwal.c:725 #, c-format msgid "Database system identifier: %llu\n" msgstr "データベースシステム識別å­: %llu\n" -#: pg_resetwal.c:722 +#: pg_resetwal.c:727 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®æ™‚系列ID: %u\n" -#: pg_resetwal.c:724 +#: pg_resetwal.c:729 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®full_page_writes: %s\n" -#: pg_resetwal.c:725 +#: pg_resetwal.c:730 msgid "off" msgstr "オフ" -#: pg_resetwal.c:725 +#: pg_resetwal.c:730 msgid "on" msgstr "オン" -#: pg_resetwal.c:726 +#: pg_resetwal.c:731 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextXID: %u:%u\n" -#: pg_resetwal.c:729 +#: pg_resetwal.c:734 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextOID: %u\n" -#: pg_resetwal.c:731 +#: pg_resetwal.c:736 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextMultiXactId: %u\n" -#: pg_resetwal.c:733 +#: pg_resetwal.c:738 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®NextMultiOffset: %u\n" -#: pg_resetwal.c:735 +#: pg_resetwal.c:740 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestXID: %u\n" -#: pg_resetwal.c:737 +#: pg_resetwal.c:742 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestXIDã®DB: %u\n" -#: pg_resetwal.c:739 +#: pg_resetwal.c:744 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestActiveXID: %u\n" -#: pg_resetwal.c:741 +#: pg_resetwal.c:746 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestMultiXid: %u\n" -#: pg_resetwal.c:743 +#: pg_resetwal.c:748 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestMultiã®DB: %u\n" -#: pg_resetwal.c:745 +#: pg_resetwal.c:750 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®oldestCommitTsXid: %u\n" -#: pg_resetwal.c:747 +#: pg_resetwal.c:752 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "最終ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã®newestCommitTsXid: %u\n" -#: pg_resetwal.c:749 +#: pg_resetwal.c:754 #, c-format msgid "Maximum data alignment: %u\n" msgstr "最大データアラインメント: %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:757 #, c-format msgid "Database block size: %u\n" msgstr "データベースã®ãƒ–ロックサイズ: %u\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:759 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "大ããªãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆæ¯Žã®ãƒ–ロック数:%u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:761 #, c-format msgid "WAL block size: %u\n" msgstr "WALã®ãƒ–ロックサイズ: %u\n" -#: pg_resetwal.c:758 pg_resetwal.c:844 +#: pg_resetwal.c:763 pg_resetwal.c:849 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "WALセグメント当ãŸã‚Šã®ãƒã‚¤ãƒˆæ•°: %u\n" -#: pg_resetwal.c:760 +#: pg_resetwal.c:765 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "識別å­ã®æœ€å¤§é•·: %u\n" -#: pg_resetwal.c:762 +#: pg_resetwal.c:767 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†…ã®æœ€å¤§åˆ—æ•°: %u\n" -#: pg_resetwal.c:764 +#: pg_resetwal.c:769 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "TOASTãƒãƒ£ãƒ³ã‚¯ã®æœ€å¤§ã‚µã‚¤ã‚º: %u\n" -#: pg_resetwal.c:766 +#: pg_resetwal.c:771 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "ラージオブジェクトãƒãƒ£ãƒ³ã‚¯ã®ã‚µã‚¤ã‚º: %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:774 #, c-format msgid "Date/time type storage: %s\n" msgstr "日付/æ™‚åˆ»åž‹ã®æ ¼ç´æ–¹å¼: %s\n" -#: pg_resetwal.c:770 +#: pg_resetwal.c:775 msgid "64-bit integers" msgstr "64ビット整数" -#: pg_resetwal.c:771 +#: pg_resetwal.c:776 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Float8å¼•æ•°ã®æ¸¡ã—æ–¹: %s\n" -#: pg_resetwal.c:772 +#: pg_resetwal.c:777 msgid "by reference" msgstr "å‚照渡ã—" -#: pg_resetwal.c:772 +#: pg_resetwal.c:777 msgid "by value" msgstr "値渡ã—" -#: pg_resetwal.c:773 +#: pg_resetwal.c:778 #, c-format msgid "Data page checksum version: %u\n" msgstr "データベージãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³: %u\n" -#: pg_resetwal.c:787 +#: pg_resetwal.c:792 #, c-format msgid "" "\n" @@ -446,102 +446,102 @@ msgstr "" "変更ã•れる値:\n" "\n" -#: pg_resetwal.c:791 +#: pg_resetwal.c:796 #, c-format msgid "First log segment after reset: %s\n" msgstr "リセット後最åˆã®WALセグメント: %s\n" -#: pg_resetwal.c:795 +#: pg_resetwal.c:800 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:797 +#: pg_resetwal.c:802 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:799 +#: pg_resetwal.c:804 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "OldestMultiã®DB: %u\n" -#: pg_resetwal.c:805 +#: pg_resetwal.c:810 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:811 +#: pg_resetwal.c:816 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:817 +#: pg_resetwal.c:822 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:824 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:821 +#: pg_resetwal.c:826 #, c-format msgid "OldestXID's DB: %u\n" msgstr "OldestXIDã®DB: %u\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:832 #, c-format msgid "NextXID epoch: %u\n" msgstr "NextXID基点: %u\n" -#: pg_resetwal.c:833 +#: pg_resetwal.c:838 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:838 +#: pg_resetwal.c:843 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016 +#: pg_resetwal.c:926 pg_resetwal.c:979 pg_resetwal.c:1014 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 +#: pg_resetwal.c:952 pg_resetwal.c:993 pg_resetwal.c:1031 #, c-format msgid "could not read directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 +#: pg_resetwal.c:955 pg_resetwal.c:996 pg_resetwal.c:1034 #, c-format msgid "could not close directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_resetwal.c:990 pg_resetwal.c:1028 +#: pg_resetwal.c:988 pg_resetwal.c:1026 #, c-format msgid "could not delete file \"%s\": %m" msgstr "ファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_resetwal.c:1100 +#: pg_resetwal.c:1098 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_resetwal.c:1108 pg_resetwal.c:1120 +#: pg_resetwal.c:1106 pg_resetwal.c:1118 #, c-format msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_resetwal.c:1125 +#: pg_resetwal.c:1123 #, c-format msgid "fsync error: %m" msgstr "fsyncエラー: %m" -#: pg_resetwal.c:1134 +#: pg_resetwal.c:1132 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -550,23 +550,64 @@ msgstr "" "%sã¯PostgreSQLã®å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ã‚’リセットã—ã¾ã™ã€‚\n" "\n" -#: pg_resetwal.c:1135 +#: pg_resetwal.c:1133 +#, c-format +msgid "Usage:\n" +msgstr "使用方法:\n" + +#: pg_resetwal.c:1134 +#, c-format +msgid " %s [OPTION]... DATADIR\n" +msgstr " %s [OPTION]... DATADIR\n" + +#: pg_resetwal.c:1136 #, c-format msgid "" -"Usage:\n" -" %s [OPTION]... DATADIR\n" "\n" +"Options:\n" msgstr "" -"使用方法:\n" -" %s [OPTION]... DATADIR\n" "\n" +"オプション:\n" -#: pg_resetwal.c:1136 +#: pg_resetwal.c:1137 #, c-format -msgid "Options:\n" -msgstr "オプション:\n" +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]DATADIR データディレクトリ\n" -#: pg_resetwal.c:1137 +#: pg_resetwal.c:1138 +#, c-format +msgid "" +" -f, --force force update to be done even after unclean shutdown or\n" +" if pg_control values had to be guessed\n" +msgstr "" +" -f, --force クリーンã§ã¯ãªã„シャットダウンã®å¾Œã€ã‚‚ã—ãã¯pg_controlã®å€¤ã®æŽ¨å®šãŒ\n" +" å¿…è¦ã¨ãªã£ãŸå ´åˆã§ã‚‚更新を強行ã™ã‚‹\n" + +#: pg_resetwal.c:1140 +#, c-format +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr " -n, --dry-run æ›´æ–°ã‚’ã›ãšã€å˜ã«ä½•ãŒè¡Œãªã‚れるã‹ã‚’表示\n" + +#: pg_resetwal.c:1141 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" + +#: pg_resetwal.c:1142 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" + +#: pg_resetwal.c:1144 +#, c-format +msgid "" +"\n" +"Options to override control file values:\n" +msgstr "" +"\n" +"制御ファイルã®å€¤ã‚’上書ãã™ã‚‹ãŸã‚ã®ã‚ªãƒ—ション:\n" + +#: pg_resetwal.c:1145 #, c-format msgid "" " -c, --commit-timestamp-ids=XID,XID\n" @@ -577,72 +618,47 @@ msgstr "" " コミットタイムスタンプをæŒã¤æœ€å¤ã¨æœ€æ–°ã®\n" " トランザクション(0ã¯å¤‰æ›´ã—ãªã„ã“ã¨ã‚’æ„味ã™ã‚‹)\n" -#: pg_resetwal.c:1140 -#, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]DATADIR データディレクトリ\n" - -#: pg_resetwal.c:1141 +#: pg_resetwal.c:1148 #, c-format msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" msgstr " -e, --epoch=XIDEPOCH 次ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDã®åŸºç‚¹ã‚’設定\n" -#: pg_resetwal.c:1142 -#, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force å¼·åˆ¶çš„ã«æ›´æ–°ã‚’実施\n" - -#: pg_resetwal.c:1143 +#: pg_resetwal.c:1149 #, c-format msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" msgstr " -l, --next-wal-file=WALFILE æ–°ã—ã„WALã®æœ€å°é–‹å§‹ãƒã‚¤ãƒ³ãƒˆã‚’設定\n" -#: pg_resetwal.c:1144 +#: pg_resetwal.c:1150 #, c-format msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" msgstr " -m, --multixact-ids=MXID,MXID 次ãŠã‚ˆã³æœ€å¤ã®ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDを設定\n" -#: pg_resetwal.c:1145 -#, c-format -msgid " -n, --dry-run no update, just show what would be done\n" -msgstr " -n, --dry-run æ›´æ–°ã‚’ã›ãšã€å˜ã«ä½•ãŒè¡Œãªã‚れるã‹ã‚’表示\n" - -#: pg_resetwal.c:1146 +#: pg_resetwal.c:1151 #, c-format msgid " -o, --next-oid=OID set next OID\n" msgstr " -o, --next-oid=OID 次ã®OIDを設定\n" -#: pg_resetwal.c:1147 +#: pg_resetwal.c:1152 #, c-format msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" msgstr " -O, --multixact-offset=OFFSET 次ã®ãƒžãƒ«ãƒãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚ªãƒ•セットを設定\n" -#: pg_resetwal.c:1148 +#: pg_resetwal.c:1153 #, c-format msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" msgstr " -u, --oldest-transaction-id=XID 最å¤ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDを設定\n" -#: pg_resetwal.c:1149 -#, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" - -#: pg_resetwal.c:1150 +#: pg_resetwal.c:1154 #, c-format msgid " -x, --next-transaction-id=XID set next transaction ID\n" msgstr " -x, --next-transaction-id=XID 次ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDを設定\n" -#: pg_resetwal.c:1151 +#: pg_resetwal.c:1155 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=SIZE WALセグメントã®ã‚µã‚¤ã‚ºã€å˜ä½ã¯ãƒ¡ã‚¬ãƒã‚¤ãƒˆ\n" -#: pg_resetwal.c:1152 -#, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" - -#: pg_resetwal.c:1153 +#: pg_resetwal.c:1157 #, c-format msgid "" "\n" @@ -651,7 +667,7 @@ msgstr "" "\n" "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: pg_resetwal.c:1154 +#: pg_resetwal.c:1158 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" diff --git a/src/bin/pg_resetwal/po/ka.po b/src/bin/pg_resetwal/po/ka.po index ae1c30252af7a..c23cc82e9405c 100644 --- a/src/bin/pg_resetwal/po/ka.po +++ b/src/bin/pg_resetwal/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_resetwal (PostgreSQL) 15\n" +"Project-Id-Version: pg_resetwal (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-02 04:49+0000\n" -"PO-Revision-Date: 2022-07-04 18:29+0200\n" +"POT-Creation-Date: 2024-07-01 03:51+0000\n" +"PO-Revision-Date: 2024-02-11 16:08+0100\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.1\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -38,243 +38,325 @@ msgstr "დეტáƒáƒšáƒ”ბი: " msgid "hint: " msgstr "მინიშნებáƒ: " -#: ../../common/restricted_token.c:64 +#: ../../common/controldata_utils.c:97 pg_resetwal.c:370 pg_resetwal.c:525 +#: pg_resetwal.c:573 #, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "ბიბლიáƒáƒ—ეკის (\"%s\") ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu" +msgid "could not open file \"%s\" for reading: %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:110 pg_resetwal.c:534 pg_resetwal.c:588 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\"-ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %zu-დáƒáƒœ" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რáƒáƒ  ემთხვევáƒ" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘ის შესáƒáƒ«áƒšáƒ შეუსáƒáƒ‘áƒáƒ›áƒáƒ‘რpg_control ფáƒáƒ˜áƒšáƒ˜áƒ¡ შესáƒáƒœáƒáƒ®áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული \n" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რშესáƒáƒ«áƒšáƒáƒ áƒáƒ  ემთხვეáƒáƒ“ეს áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ მიერ გáƒáƒ›áƒáƒ§áƒ”ნებულს. áƒáƒ› შემთხვევáƒáƒ¨áƒ˜ ქვემáƒáƒ— \n" +"მáƒáƒªáƒ”მული შედეგები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იქნებრდრPostgreSQL ეს áƒáƒ’ებრáƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ შეუთáƒáƒ•სებელი იქნებáƒ." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_resetwal.c:1134 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:249 pg_resetwal.c:1142 pg_resetwal.c:1154 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_resetwal.c:928 pg_resetwal.c:981 pg_resetwal.c:1016 pg_resetwal.c:1054 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 pg_resetwal.c:1068 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: ../../common/restricted_token.c:73 +#: ../../common/file_utils.c:498 #, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე შეზღუდული კáƒáƒ“ების შექმნრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" -#: ../../common/restricted_token.c:82 +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "პრáƒáƒªáƒ”სის კáƒáƒ“ის გáƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "შეცდáƒáƒ›áƒ SSID-ების გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "შეზღუდული კáƒáƒ“ის შექმნრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "„%s“ ბრძáƒáƒœáƒ”ბის პრáƒáƒªáƒ”სის დáƒáƒ¬áƒ§áƒ”ბრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "შეზღუდულ კáƒáƒ“ის ხელáƒáƒ®áƒšáƒ შესრულებრვერ მáƒáƒ®áƒ”რხდáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "ქვეპრáƒáƒªáƒ”სიდáƒáƒœ გáƒáƒ¡áƒáƒ¡áƒ•ლელი კáƒáƒ“ი ვერ მივიღე: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრისთვის %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "უცნáƒáƒ‘ი სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი: \"%s\"" + #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202 -#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249 -#: pg_resetwal.c:269 pg_resetwal.c:280 +#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 +#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 +#: pg_resetwal.c:270 pg_resetwal.c:281 #, c-format msgid "invalid argument for option %s" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი პáƒáƒ áƒáƒ›áƒ”ტრისთვის: %s" -#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 -#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 -#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316 -#: pg_resetwal.c:323 +#: pg_resetwal.c:165 pg_resetwal.c:178 pg_resetwal.c:191 pg_resetwal.c:204 +#: pg_resetwal.c:211 pg_resetwal.c:230 pg_resetwal.c:243 pg_resetwal.c:251 +#: pg_resetwal.c:271 pg_resetwal.c:282 pg_resetwal.c:307 pg_resetwal.c:320 +#: pg_resetwal.c:327 #, c-format msgid "Try \"%s --help\" for more information." msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." -#: pg_resetwal.c:168 +#: pg_resetwal.c:169 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის ეპáƒáƒ¥áƒ (-e) -1 áƒáƒ  უნდრიყáƒáƒ¡" -#: pg_resetwal.c:181 +#: pg_resetwal.c:182 #, c-format msgid "oldest transaction ID (-u) must be greater than or equal to %u" msgstr "ძველი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID (-u) %u-ზე მეტი áƒáƒœ ტáƒáƒšáƒ˜ უნდრიყáƒáƒ¡" -#: pg_resetwal.c:194 +#: pg_resetwal.c:195 #, c-format msgid "transaction ID (-x) must be greater than or equal to %u" msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID (-x) %u_ზე მეტი áƒáƒœ ტáƒáƒšáƒ˜ უნდრიყáƒáƒ¡" -#: pg_resetwal.c:216 pg_resetwal.c:220 +#: pg_resetwal.c:217 pg_resetwal.c:221 #, c-format -msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" -msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID (-c) áƒáƒœ 0 უნდრიყáƒáƒ¡, áƒáƒœ 2-ზე მეტი áƒáƒœ ტáƒáƒšáƒ˜" +msgid "transaction ID (-c) must be either %u or greater than or equal to %u" +msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID (-c) áƒáƒœ %u უნდრიყáƒáƒ¡, áƒáƒœ %u-ზე მეტი áƒáƒœ ტáƒáƒšáƒ˜" -#: pg_resetwal.c:233 +#: pg_resetwal.c:234 #, c-format msgid "OID (-o) must not be 0" msgstr "OID (-o) 0 áƒáƒ  უნდრიყáƒáƒ¡" -#: pg_resetwal.c:254 +#: pg_resetwal.c:255 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID (-m) 0 áƒáƒ  უნდრიყáƒ" -#: pg_resetwal.c:261 +#: pg_resetwal.c:262 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "უძველესი მულტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID (-m) 0 áƒáƒ  უნდრიყáƒáƒ¡" -#: pg_resetwal.c:274 +#: pg_resetwal.c:275 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "მულიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ წáƒáƒœáƒáƒªáƒ•ლებრ(-O) -1 áƒáƒ  უნდრიყáƒáƒ¡" -#: pg_resetwal.c:296 +#: pg_resetwal.c:301 #, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "--wal-segisze -ის áƒáƒ áƒ’უმენტი რიცხვი უნდრიყáƒáƒ¡" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "%s-ის áƒáƒ áƒ’უმენტი 2-ის ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡ 1-1024 შუáƒáƒšáƒ”დიდáƒáƒœ" -#: pg_resetwal.c:298 -#, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "--wal-segsize -ის áƒáƒ áƒ’უმენტი 2-ის ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡ 1-1024 დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ“áƒáƒœ" - -#: pg_resetwal.c:314 +#: pg_resetwal.c:318 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")" -#: pg_resetwal.c:322 +#: pg_resetwal.c:326 #, c-format msgid "no data directory specified" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ" -#: pg_resetwal.c:336 +#: pg_resetwal.c:340 #, c-format msgid "cannot be executed by \"root\"" msgstr "root-ით ვერ გáƒáƒ”შვებáƒ" -#: pg_resetwal.c:337 +#: pg_resetwal.c:341 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "%s PostgreSQL-ის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლით უნდრგáƒáƒ£áƒ¨áƒ•áƒáƒ—." -#: pg_resetwal.c:347 +#: pg_resetwal.c:351 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წვდáƒáƒ›áƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელირ\"%s\": %m" -#: pg_resetwal.c:353 +#: pg_resetwal.c:357 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე შეცვლის შეცდáƒáƒ›áƒ: %m" -#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" - -#: pg_resetwal.c:371 +#: pg_resetwal.c:375 #, c-format msgid "lock file \"%s\" exists" msgstr "ბლáƒáƒ™áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %s" -#: pg_resetwal.c:372 +#: pg_resetwal.c:376 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "სერვერი გáƒáƒ¨áƒ•ებულიáƒ? თუ áƒáƒ áƒ, წáƒáƒ¨áƒáƒšáƒ”თ ბლáƒáƒ™áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ დრთáƒáƒ•იდáƒáƒœ სცáƒáƒ“ეთ." -#: pg_resetwal.c:467 +#: pg_resetwal.c:475 #, c-format -msgid "" -"\n" -"If these values seem acceptable, use -f to force reset.\n" -msgstr "" -"\n" -"თუ ეს მნიშვნელáƒáƒ‘ები მისáƒáƒ¦áƒ”ბიáƒ, ძáƒáƒšáƒ˜áƒ— დáƒáƒ¡áƒáƒ‘რუნებლáƒáƒ“ -f გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ.\n" +msgid "not proceeding because control file values were guessed" +msgstr "áƒáƒ  გáƒáƒ•áƒáƒ’რძელებ, რáƒáƒ“გáƒáƒœ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ მნიშვნელáƒáƒ‘ებს ჩემით მივხვდი" -#: pg_resetwal.c:479 +#: pg_resetwal.c:476 #, c-format -msgid "" -"The database server was not shut down cleanly.\n" -"Resetting the write-ahead log might cause data to be lost.\n" -"If you want to proceed anyway, use -f to force reset.\n" -msgstr "" -"მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერი სუფთáƒáƒ“ áƒáƒ  გáƒáƒ›áƒáƒ áƒ—ულáƒ.\n" -"წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ სáƒáƒ¬áƒ§áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ–ე დáƒáƒ‘რუნებáƒáƒ› შეიძლებრ" -"მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ™áƒáƒ áƒ’ვრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡.\n" -"თუ გáƒáƒ’რძელებრმáƒáƒ˜áƒœáƒª გნებáƒáƒ•თ, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ -f.\n" +msgid "If these values seem acceptable, use -f to force reset." +msgstr "თუ ეს მნიშვნელáƒáƒ‘ები მისáƒáƒ¦áƒ”ბიáƒ, ძáƒáƒšáƒ˜áƒ— ჩáƒáƒ›áƒáƒ¡áƒáƒ§áƒ áƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ -f ." + +#: pg_resetwal.c:485 +#, c-format +msgid "database server was not shut down cleanly" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რწესების დáƒáƒªáƒ•ით áƒáƒ  გáƒáƒ—იშულáƒ" -#: pg_resetwal.c:493 +#: pg_resetwal.c:486 +#, c-format +msgid "Resetting the write-ahead log might cause data to be lost." +msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒ›áƒáƒ§áƒ áƒáƒ›, შეიძლებáƒ, მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ™áƒáƒ áƒ’ვრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡." + +#: pg_resetwal.c:487 +#, c-format +msgid "If you want to proceed anyway, use -f to force reset." +msgstr "თუ ეს მნიშვნელáƒáƒ‘ები მისáƒáƒ¦áƒ”ბიáƒ, ძáƒáƒšáƒ˜áƒ— ჩáƒáƒ›áƒáƒ¡áƒáƒ§áƒ áƒ”ლáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ -f ." + +#: pg_resetwal.c:500 #, c-format msgid "Write-ahead log reset\n" msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რი ჟურნáƒáƒšáƒ˜áƒ¡ სáƒáƒ¬áƒ§áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ–ე დáƒáƒ‘რუნებáƒ\n" -#: pg_resetwal.c:525 +#: pg_resetwal.c:532 #, c-format msgid "unexpected empty file \"%s\"" msgstr "მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ ფáƒáƒ˜áƒšáƒ˜ ცáƒáƒ áƒ˜áƒ”ლიáƒ: \"%s\"" -#: pg_resetwal.c:527 pg_resetwal.c:581 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" - -#: pg_resetwal.c:535 +#: pg_resetwal.c:542 #, c-format msgid "data directory is of wrong version" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  ვერსიáƒáƒ¡ ეკუთვნის" -#: pg_resetwal.c:536 +#: pg_resetwal.c:543 #, c-format -msgid "" -"File \"%s\" contains \"%s\", which is not compatible with this program's " -"version \"%s\"." -msgstr "" -"ფáƒáƒ˜áƒšáƒ˜ \"%s\" შეიცáƒáƒ•ს \"%s\"-ს, რáƒáƒ›áƒ”ლიც áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ ვერსიáƒáƒ¡áƒ—áƒáƒœ (%s) " -"შეუთáƒáƒ•სებელიáƒ." +msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" შეიცáƒáƒ•ს \"%s\"-ს, რáƒáƒ›áƒ”ლიც áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ ვერსიáƒáƒ¡áƒ—áƒáƒœ (%s) შეუთáƒáƒ•სებელიáƒ." -#: pg_resetwal.c:569 +#: pg_resetwal.c:576 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" " touch %s\n" "and try again." msgstr "" -"თუ დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ”ბული ბრძáƒáƒœáƒ“ებით, რáƒáƒ› მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ბილიკი სწáƒáƒ áƒ˜áƒ, " -"გáƒáƒ£áƒ¨áƒ•ით\n" +"თუ დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ”ბული ბრძáƒáƒœáƒ“ებით, რáƒáƒ› მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ბილიკი სწáƒáƒ áƒ˜áƒ, გáƒáƒ£áƒ¨áƒ•ით\n" " touch %s\n" "დრთáƒáƒ•იდáƒáƒœ სცáƒáƒ“ეთ." -#: pg_resetwal.c:597 +#: pg_resetwal.c:604 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "pg_control áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› გáƒáƒáƒ©áƒœáƒ˜áƒ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ CRC; ფრთხილáƒáƒ“" -#: pg_resetwal.c:606 +#: pg_resetwal.c:613 #, c-format -msgid "" -"pg_control specifies invalid WAL segment size (%d byte); proceed with caution" -msgid_plural "" -"pg_control specifies invalid WAL segment size (%d bytes); proceed with " -"caution" -msgstr[0] "" -"pg_control WAL-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სეგმენტის ზáƒáƒ›áƒáƒ¡ (%d ბáƒáƒ˜áƒ¢áƒ˜) მიუთითებს; ფრთხილáƒáƒ“" -msgstr[1] "" -"pg_control WAL-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სეგმენტის ზáƒáƒ›áƒáƒ¡ (%d ბáƒáƒ˜áƒ¢áƒ˜) მიუთითებს; ფრთხილáƒáƒ“" +msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" +msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" +msgstr[0] "pg_control WAL-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სეგმენტის ზáƒáƒ›áƒáƒ¡ (%d ბáƒáƒ˜áƒ¢áƒ˜) მიუთითებს; ფრთხილáƒáƒ“" +msgstr[1] "pg_control WAL-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სეგმენტის ზáƒáƒ›áƒáƒ¡ (%d ბáƒáƒ˜áƒ¢áƒ˜) მიუთითებს; ფრთხილáƒáƒ“" -#: pg_resetwal.c:617 +#: pg_resetwal.c:624 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" -msgstr "" -"pg_control áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› áƒáƒœ გáƒáƒ¤áƒ£áƒ­áƒ”ბულიáƒ, áƒáƒœ ძველი ვერსიáƒ; იგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ" +msgstr "pg_control áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› áƒáƒœ გáƒáƒ¤áƒ£áƒ­áƒ”ბულიáƒ, áƒáƒœ ძველი ვერსიáƒ; იგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ" -#: pg_resetwal.c:712 +#: pg_resetwal.c:719 #, c-format msgid "" "Guessed pg_control values:\n" @@ -283,7 +365,7 @@ msgstr "" "Pg_control გáƒáƒ›áƒáƒªáƒœáƒáƒ‘ილი მნიშვნელáƒáƒ‘ები:\n" "\n" -#: pg_resetwal.c:714 +#: pg_resetwal.c:721 #, c-format msgid "" "Current pg_control values:\n" @@ -292,167 +374,167 @@ msgstr "" "Pg_control მიმდინáƒáƒ áƒ” მნიშვნელáƒáƒ‘ები:\n" "\n" -#: pg_resetwal.c:716 +#: pg_resetwal.c:723 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_control ვერსიის ნáƒáƒ›áƒ”რი: %u\n" -#: pg_resetwal.c:718 +#: pg_resetwal.c:725 #, c-format msgid "Catalog version number: %u\n" msgstr "კáƒáƒ¢áƒáƒšáƒáƒ’ის ვერსიის ნáƒáƒ›áƒ”რი: %u\n" -#: pg_resetwal.c:720 +#: pg_resetwal.c:727 #, c-format msgid "Database system identifier: %llu\n" msgstr "ბáƒáƒ–ის სისტემური იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜: %llu\n" -#: pg_resetwal.c:722 +#: pg_resetwal.c:729 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილისTimeLineID: %u\n" -#: pg_resetwal.c:724 +#: pg_resetwal.c:731 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "უáƒáƒ®áƒšáƒ”სი უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის full_page_writes: %s\n" -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "off" msgstr "გáƒáƒ›áƒáƒ áƒ—ული" -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "on" msgstr "ჩáƒáƒ áƒ—" -#: pg_resetwal.c:726 +#: pg_resetwal.c:733 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextXID: %u:%u\n" -#: pg_resetwal.c:729 +#: pg_resetwal.c:736 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextOID: %u\n" -#: pg_resetwal.c:731 +#: pg_resetwal.c:738 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextMultiXactId: %u\n" -#: pg_resetwal.c:733 +#: pg_resetwal.c:740 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის NextMultiOffset: %u\n" -#: pg_resetwal.c:735 +#: pg_resetwal.c:742 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestXID: %u\n" -#: pg_resetwal.c:737 +#: pg_resetwal.c:744 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestXID's DB: %u\n" -#: pg_resetwal.c:739 +#: pg_resetwal.c:746 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestActiveXID: %u\n" -#: pg_resetwal.c:741 +#: pg_resetwal.c:748 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestMultiXid: %u\n" -#: pg_resetwal.c:743 +#: pg_resetwal.c:750 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestMulti's DB: %u\n" -#: pg_resetwal.c:745 +#: pg_resetwal.c:752 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის oldestCommitTsXid:%u\n" -#: pg_resetwal.c:747 +#: pg_resetwal.c:754 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის newestCommitTsXid:%u\n" -#: pg_resetwal.c:749 +#: pg_resetwal.c:756 #, c-format msgid "Maximum data alignment: %u\n" msgstr "მáƒáƒœáƒáƒªáƒ”მების სწáƒáƒ áƒ”ბის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ˜: %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:759 #, c-format msgid "Database block size: %u\n" msgstr "ბáƒáƒ–ის ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ: %u\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:761 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "დიდი ურთიერთáƒáƒ‘ის სეგმენტები თითáƒáƒ”ულ ბლáƒáƒ™áƒ¨áƒ˜: %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:763 #, c-format msgid "WAL block size: %u\n" msgstr "WAL ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ: %u\n" -#: pg_resetwal.c:758 pg_resetwal.c:844 +#: pg_resetwal.c:765 pg_resetwal.c:851 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "ბáƒáƒ˜áƒ¢áƒ”ბი თითáƒáƒ”ულ WAL სეგმენტში: %u\n" -#: pg_resetwal.c:760 +#: pg_resetwal.c:767 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "იდენტიფიკáƒáƒ¢áƒáƒ áƒ”ბის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიგრძე: %u\n" -#: pg_resetwal.c:762 +#: pg_resetwal.c:769 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "ინდექსში სვეტების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ: %u\n" -#: pg_resetwal.c:764 +#: pg_resetwal.c:771 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "TOAST ნáƒáƒ’ლეჯის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ზáƒáƒ›áƒ: %u\n" -#: pg_resetwal.c:766 +#: pg_resetwal.c:773 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "დიდი áƒáƒ‘იექტის ნáƒáƒ’ლეჯის ზáƒáƒ›áƒ: %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:776 #, c-format msgid "Date/time type storage: %s\n" msgstr "თáƒáƒ áƒ˜áƒ¦áƒ˜áƒ¡ ტიპის სáƒáƒªáƒáƒ•ი: %s\n" -#: pg_resetwal.c:770 +#: pg_resetwal.c:777 msgid "64-bit integers" msgstr "64-ბიტიáƒáƒœáƒ˜ მთელ რიცხვები" -#: pg_resetwal.c:771 +#: pg_resetwal.c:778 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Float8 áƒáƒ áƒ’უმენტის გáƒáƒ“áƒáƒªáƒ”მáƒ: %s\n" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by reference" msgstr "ბმით" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by value" msgstr "მნიშვნელáƒáƒ‘ით" -#: pg_resetwal.c:773 +#: pg_resetwal.c:780 #, c-format msgid "Data page checksum version: %u\n" msgstr "მáƒáƒœáƒáƒªáƒ”მების გვერდის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ვერსიáƒ: %u\n" -#: pg_resetwal.c:787 +#: pg_resetwal.c:794 #, c-format msgid "" "\n" @@ -465,103 +547,82 @@ msgstr "" "შესáƒáƒªáƒ•ლელი მნიშვნელáƒáƒ‘ები:\n" "\n" -#: pg_resetwal.c:791 +#: pg_resetwal.c:798 #, c-format msgid "First log segment after reset: %s\n" -msgstr "" -"სáƒáƒ¬áƒ§áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ–ე დáƒáƒ‘რუნების შემდეგ ჟურნáƒáƒšáƒ˜áƒ¡ პირველი სეგმენტი: %s\n" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ–ე დáƒáƒ‘რუნების შემდეგ ჟურნáƒáƒšáƒ˜áƒ¡ პირველი სეგმენტი: %s\n" -#: pg_resetwal.c:795 +#: pg_resetwal.c:802 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:797 +#: pg_resetwal.c:804 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:799 +#: pg_resetwal.c:806 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "OldestMulti's DB: %u\n" -#: pg_resetwal.c:805 +#: pg_resetwal.c:812 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:811 +#: pg_resetwal.c:818 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:817 +#: pg_resetwal.c:824 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:826 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:821 +#: pg_resetwal.c:828 #, c-format msgid "OldestXID's DB: %u\n" msgstr "OldestXID's DB: %u\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:834 #, c-format msgid "NextXID epoch: %u\n" msgstr "NextXID epoch: %u\n" -#: pg_resetwal.c:833 +#: pg_resetwal.c:840 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:838 +#: pg_resetwal.c:845 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" - -#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" - -#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 +#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 pg_resetwal.c:1071 #, c-format msgid "could not close directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: pg_resetwal.c:990 pg_resetwal.c:1028 +#: pg_resetwal.c:990 pg_resetwal.c:1028 pg_resetwal.c:1063 #, c-format msgid "could not delete file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: pg_resetwal.c:1100 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" - -#: pg_resetwal.c:1108 pg_resetwal.c:1120 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" - -#: pg_resetwal.c:1125 +#: pg_resetwal.c:1159 #, c-format msgid "fsync error: %m" msgstr "fsync error: %m" -#: pg_resetwal.c:1134 +#: pg_resetwal.c:1168 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -570,119 +631,115 @@ msgstr "" "%s PostgreSQL-ის წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ ჟურნáƒáƒšáƒ¡ სáƒáƒ¬áƒ§áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ–ე áƒáƒ‘რუნებს.\n" "\n" -#: pg_resetwal.c:1135 +#: pg_resetwal.c:1169 +#, c-format +msgid "Usage:\n" +msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" + +#: pg_resetwal.c:1170 +#, c-format +msgid " %s [OPTION]... DATADIR\n" +msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე]\n" + +#: pg_resetwal.c:1172 #, c-format msgid "" -"Usage:\n" -" %s [OPTION]... DATADIR\n" "\n" +"Options:\n" msgstr "" -"გáƒáƒ›áƒáƒ§áƒ”ნებáƒ: \n" -" %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე]\n" "\n" +"პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_resetwal.c:1136 +#: pg_resetwal.c:1173 #, c-format -msgid "Options:\n" -msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები:\n" +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]DATADIR მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: pg_resetwal.c:1137 +#: pg_resetwal.c:1174 #, c-format msgid "" -" -c, --commit-timestamp-ids=XID,XID\n" -" set oldest and newest transactions " -"bearing\n" -" commit timestamp (zero means no change)\n" +" -f, --force force update to be done even after unclean shutdown or\n" +" if pg_control values had to be guessed\n" msgstr "" -" -c, --commit-timestamp-ids=XID,XID\n" -" უáƒáƒ®áƒšáƒ”სი დრუძველესი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის " -"მითითებáƒ,\n" -" დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜áƒ¡ მáƒáƒ¢áƒáƒ áƒ”ბლით(0 ნიშნáƒáƒ•ს, რáƒáƒ› " -"áƒáƒ  შეიცვლებáƒ)\n" +" -f, --force ნáƒáƒ«áƒáƒšáƒáƒ“ევი გáƒáƒœáƒáƒ®áƒšáƒ”ბის შესრულებáƒáƒ¡ მáƒáƒ¡ შემდეგáƒáƒª კი, თუ პრáƒáƒªáƒ”სი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ გáƒáƒ˜áƒ—იშáƒ,\n" +" áƒáƒœ, თუ pg_control-ის მნიშვნელáƒáƒ‘ების მიხვედრრმáƒáƒ›áƒ˜áƒ¬áƒ˜áƒ\n" -#: pg_resetwal.c:1140 +#: pg_resetwal.c:1176 #, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]DATADIR მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr " -n, --dry-run გáƒáƒœáƒáƒ®áƒšáƒ”ბის გáƒáƒ áƒ”შე. უბრáƒáƒšáƒáƒ“ ნáƒáƒ©áƒ•ენები იქნებáƒ, რრმáƒáƒ®áƒ“ებáƒáƒ“áƒ\n" -#: pg_resetwal.c:1141 +#: pg_resetwal.c:1177 #, c-format -msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" -msgstr "" -" -e, --epoch=XIDEPOCH შემდეგი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის ეპáƒáƒ¥áƒ¡áƒ˜ " -"დáƒáƒ§áƒ”ნებáƒ\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_resetwal.c:1142 +#: pg_resetwal.c:1178 #, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force ნáƒáƒ«áƒáƒšáƒáƒ“ევი გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ\n" +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_resetwal.c:1143 +#: pg_resetwal.c:1180 #, c-format msgid "" -" -l, --next-wal-file=WALFILE set minimum starting location for new " -"WAL\n" +"\n" +"Options to override control file values:\n" msgstr "" -" -l, --next-wal-file=WALFILE áƒáƒ®áƒáƒšáƒ˜ WAL-ის მინიმáƒáƒšáƒ£áƒ áƒ˜ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ " -"მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ\n" +"\n" +"პáƒáƒ áƒáƒ›áƒ”ტრები კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ მნიშვნელáƒáƒ‘ის გáƒáƒ“áƒáƒ¡áƒáƒ¤áƒáƒ áƒáƒ“:\n" -#: pg_resetwal.c:1144 +#: pg_resetwal.c:1181 #, c-format msgid "" -" -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" +" -c, --commit-timestamp-ids=XID,XID\n" +" set oldest and newest transactions bearing\n" +" commit timestamp (zero means no change)\n" msgstr "" -" -m, --multixact-ids=MXID,MXID შემდეგი დრუძველესი მულტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-" -"ების დáƒáƒ§áƒ”ნებáƒ\n" +" -c, --commit-timestamp-ids=XID,XID\n" +" უáƒáƒ®áƒšáƒ”სი დრუძველესი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის მითითებáƒ,\n" +" დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜áƒ¡ მáƒáƒ¢áƒáƒ áƒ”ბლით(0 ნიშნáƒáƒ•ს, რáƒáƒ› áƒáƒ  შეიცვლებáƒ)\n" -#: pg_resetwal.c:1145 +#: pg_resetwal.c:1184 #, c-format -msgid "" -" -n, --dry-run no update, just show what would be done\n" -msgstr "" -" -n, --dry-run გáƒáƒœáƒáƒ®áƒšáƒ”ბის გáƒáƒ áƒ”შე. უბრáƒáƒšáƒáƒ“ ნáƒáƒ©áƒ•ენები " -"იქნებáƒ, რრმáƒáƒ®áƒ“ებáƒáƒ“áƒ\n" +msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" +msgstr " -e, --epoch=XIDEPOCH შემდეგი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის ეპáƒáƒ¥áƒ¡áƒ˜ დáƒáƒ§áƒ”ნებáƒ\n" + +#: pg_resetwal.c:1185 +#, c-format +msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" +msgstr " -l, --next-wal-file=WALFILE áƒáƒ®áƒáƒšáƒ˜ WAL-ის მინიმáƒáƒšáƒ£áƒ áƒ˜ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘ის დáƒáƒ§áƒ”ნებáƒ\n" -#: pg_resetwal.c:1146 +#: pg_resetwal.c:1186 +#, c-format +msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" +msgstr " -m, --multixact-ids=MXID,MXID შემდეგი დრუძველესი მულტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ების დáƒáƒ§áƒ”ნებáƒ\n" + +#: pg_resetwal.c:1187 #, c-format msgid " -o, --next-oid=OID set next OID\n" msgstr " -o, --next-oid=OID შემდეგი OID-ის დáƒáƒ§áƒ”ნებáƒ\n" -#: pg_resetwal.c:1147 +#: pg_resetwal.c:1188 #, c-format msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" -msgstr "" -" -O, --multixact-offset=წáƒáƒœáƒáƒªáƒ•ლებრშემდეგი მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ წáƒáƒœáƒáƒªáƒ•ლების " -"დáƒáƒ§áƒ”ნებáƒ\n" +msgstr " -O, --multixact-offset=წáƒáƒœáƒáƒªáƒ•ლებრშემდეგი მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ წáƒáƒœáƒáƒªáƒ•ლების დáƒáƒ§áƒ”ნებáƒ\n" -#: pg_resetwal.c:1148 +#: pg_resetwal.c:1189 #, c-format msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" -msgstr "" -" -u, --oldest-transaction-id=XID უძველესი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის დáƒáƒ§áƒ”ნებáƒ\n" - -#: pg_resetwal.c:1149 -#, c-format -msgid "" -" -V, --version output version information, then exit\n" -msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" +msgstr " -u, --oldest-transaction-id=XID უძველესი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის დáƒáƒ§áƒ”ნებáƒ\n" -#: pg_resetwal.c:1150 +#: pg_resetwal.c:1190 #, c-format msgid " -x, --next-transaction-id=XID set next transaction ID\n" -msgstr "" -" -x, --next-transaction-id=XID შემდეგი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის დáƒáƒ§áƒ”ნებáƒ\n" +msgstr " -x, --next-transaction-id=XID შემდეგი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის დáƒáƒ§áƒ”ნებáƒ\n" -#: pg_resetwal.c:1151 +#: pg_resetwal.c:1191 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=ზáƒáƒ›áƒ WAL სეგმენტების ზáƒáƒ›áƒ, მეგáƒáƒ‘áƒáƒ˜áƒ¢áƒ”ბში\n" -#: pg_resetwal.c:1152 -#, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" - -#: pg_resetwal.c:1153 +#: pg_resetwal.c:1193 #, c-format msgid "" "\n" @@ -691,7 +748,59 @@ msgstr "" "\n" "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n" -#: pg_resetwal.c:1154 +#: pg_resetwal.c:1194 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" + +#, c-format +#~ msgid " -?, --help show this help, then exit\n" +#~ msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" + +#, c-format +#~ msgid " -V, --version output version information, then exit\n" +#~ msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" + +#, c-format +#~ msgid " -f, --force force update to be done\n" +#~ msgstr " -f, --force ნáƒáƒ«áƒáƒšáƒáƒ“ევი გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ\n" + +#, c-format +#~ msgid " [-D, --pgdata=]DATADIR data directory\n" +#~ msgstr " [-D, --pgdata=]DATADIR მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" + +#, c-format +#~ msgid "Options:\n" +#~ msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები:\n" + +#, c-format +#~ msgid "" +#~ "The database server was not shut down cleanly.\n" +#~ "Resetting the write-ahead log might cause data to be lost.\n" +#~ "If you want to proceed anyway, use -f to force reset.\n" +#~ msgstr "" +#~ "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერი სუფთáƒáƒ“ áƒáƒ  გáƒáƒ›áƒáƒ áƒ—ულáƒ.\n" +#~ "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ სáƒáƒ¬áƒ§áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ–ე დáƒáƒ‘რუნებáƒáƒ› შეიძლებრმáƒáƒœáƒáƒªáƒ”მების დáƒáƒ™áƒáƒ áƒ’ვრგáƒáƒ›áƒáƒ˜áƒ¬áƒ•იáƒáƒ¡.\n" +#~ "თუ გáƒáƒ’რძელებრმáƒáƒ˜áƒœáƒª გნებáƒáƒ•თ, გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ -f.\n" + +#, c-format +#~ msgid "" +#~ "Usage:\n" +#~ " %s [OPTION]... DATADIR\n" +#~ "\n" +#~ msgstr "" +#~ "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ: \n" +#~ " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [მáƒáƒœáƒáƒªáƒ”მებისსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე]\n" +#~ "\n" + +#, c-format +#~ msgid "argument of --wal-segsize must be a number" +#~ msgstr "--wal-segisze -ის áƒáƒ áƒ’უმენტი რიცხვი უნდრიყáƒáƒ¡" + +#, c-format +#~ msgid "cannot create restricted tokens on this platform: error code %lu" +#~ msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე შეზღუდული კáƒáƒ“ების შექმნრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#, c-format +#~ msgid "could not load library \"%s\": error code %lu" +#~ msgstr "ბიბლიáƒáƒ—ეკის (\"%s\") ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu" diff --git a/src/bin/pg_resetwal/po/ko.po b/src/bin/pg_resetwal/po/ko.po index 03e30bc6d88cf..c27ba3a26276e 100644 --- a/src/bin/pg_resetwal/po/ko.po +++ b/src/bin/pg_resetwal/po/ko.po @@ -3,10 +3,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_resetwal (PostgreSQL) 13\n" +"Project-Id-Version: pg_resetwal (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 20:45+0000\n" -"PO-Revision-Date: 2020-10-06 13:44+0900\n" +"POT-Creation-Date: 2025-01-17 04:50+0000\n" +"PO-Revision-Date: 2025-01-16 16:15+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean Team \n" "Language: ko\n" @@ -15,102 +15,220 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "심ê°: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " -#: ../../common/restricted_token.c:64 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + +#: ../../common/controldata_utils.c:97 pg_resetwal.c:370 pg_resetwal.c:525 +#: pg_resetwal.c:573 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "\"%s\" íŒŒì¼ ì¼ê¸° 모드로 열기 실패: %m" + +#: ../../common/controldata_utils.c:110 pg_resetwal.c:534 pg_resetwal.c:588 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d / %zu ì½ì—ˆìŒ" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ë°”ì´íЏ 순서 불ì¼ì¹˜" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, " +"and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ë°”ì´íЏ 순서 ì¼ì¹˜í•˜ì§€ 않는 문제\n" +"ë°”ì´íЏ 순서 정보는 pg_control 파ì¼ì„ 저장할 때 사용ë˜ëŠ”ë°,\n" +"ì´ íŒŒì¼ì˜ ë°”ì´íЏ 순서 정보와 ì´ í”„ë¡œê·¸ëž¨ì—서 사용하는 순서 ì •ë³´ê°€ 다릅니다.\n" +"ì´ëŸ´ 경우, 출력 결과가 바르지 ì•Šì„ ìˆ˜ 있고,\n" +"ì„¤ì¹˜ëœ PostgreSQL 프로그램과 ë°ì´í„° 디렉터리가 호환ë˜ì§€ ì•Šì„ ìˆ˜ 있습니다." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_resetwal.c:1134 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:249 pg_resetwal.c:1142 pg_resetwal.c:1154 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ fsync í•  수 ì—†ìŒ: %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "메모리 부족\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ë„ í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ íŒŒì¼ ì‹œìŠ¤í…œ ë™ê¸°í™”를 í•  수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ìƒíƒœ 정보를 구할 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ì´ ë¹Œë“œëŠ” \"%s\" ë™ê¸°í™” ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_resetwal.c:928 pg_resetwal.c:981 pg_resetwal.c:1016 pg_resetwal.c:1054 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 pg_resetwal.c:1068 #, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "\"%s\" ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 로드할 수 ì—†ìŒ: 오류 코드 %lu" +msgid "could not read directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" -#: ../../common/restricted_token.c:73 +#: ../../common/file_utils.c:498 #, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "ì´ ìš´ì˜ì²´ì œì—서 restricted tokenì„ ë§Œë“¤ 수 ì—†ìŒ: 오류 코드 %lu" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" -#: ../../common/restricted_token.c:82 +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "프로세스 토í°ì„ ì—´ 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "SID를 할당할 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "ìƒì†ëœ 토í°ì„ 만들 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "\"%s\" 명령용 프로세스를 시작할 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "ìƒì†ëœ 토í°ìœ¼ë¡œ 재실행할 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:194 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "하위 í”„ë¡œì„¸ìŠ¤ì˜ ì¢…ë£Œ 코드를 구할 수 ì—†ìŒ: 오류 코드 %lu" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "\"%s\" ê°’ì´ ìž˜ 못ë¨, 해당 옵션: %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s ê°’ì˜ í—ˆìš© 범위: %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "알 수 없는 ë™ê¸°í™” 방법: %s" + #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:160 pg_resetwal.c:175 pg_resetwal.c:190 pg_resetwal.c:197 -#: pg_resetwal.c:221 pg_resetwal.c:236 pg_resetwal.c:244 pg_resetwal.c:269 -#: pg_resetwal.c:283 +#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 +#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 +#: pg_resetwal.c:270 pg_resetwal.c:281 #, c-format msgid "invalid argument for option %s" msgstr "%s ì˜µì…˜ì˜ ìž˜ëª»ëœ ì¸ìž" -#: pg_resetwal.c:161 pg_resetwal.c:176 pg_resetwal.c:191 pg_resetwal.c:198 -#: pg_resetwal.c:222 pg_resetwal.c:237 pg_resetwal.c:245 pg_resetwal.c:270 -#: pg_resetwal.c:284 pg_resetwal.c:310 pg_resetwal.c:323 pg_resetwal.c:331 +#: pg_resetwal.c:165 pg_resetwal.c:178 pg_resetwal.c:191 pg_resetwal.c:204 +#: pg_resetwal.c:211 pg_resetwal.c:230 pg_resetwal.c:243 pg_resetwal.c:251 +#: pg_resetwal.c:271 pg_resetwal.c:282 pg_resetwal.c:307 pg_resetwal.c:320 +#: pg_resetwal.c:327 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "ìžì„¸í•œ ì‚¬ìš©ë²•ì€ \"%s --help\"\n" +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." -#: pg_resetwal.c:166 +#: pg_resetwal.c:169 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "트랜잭션 ID epoch (-e) ê°’ì€ -1ì´ ì•„ë‹ˆì—¬ì•¼í•¨" -#: pg_resetwal.c:181 +#: pg_resetwal.c:182 #, c-format -msgid "transaction ID (-x) must not be 0" -msgstr "트랜잭션 ID (-x) ê°’ì€ 0ì´ ì•„ë‹ˆì—¬ì•¼í•¨" +msgid "oldest transaction ID (-u) must be greater than or equal to %u" +msgstr "ì œì¼ ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ ID (-u)는 %u 보다 í¬ê±°ë‚˜ 같아야 함" -#: pg_resetwal.c:205 pg_resetwal.c:212 +#: pg_resetwal.c:195 #, c-format -msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" -msgstr "-c 옵션으로 지정한 트랜잭션 ID는 0ì´ê±°ë‚˜ 2ì´ìƒì´ì–´ì•¼ 함" +msgid "transaction ID (-x) must be greater than or equal to %u" +msgstr "트랜잭션 ID (-x)는 %u 보다 í¬ê±°ë‚˜ 같아야 함" -#: pg_resetwal.c:227 +#: pg_resetwal.c:217 pg_resetwal.c:221 +#, c-format +msgid "transaction ID (-c) must be either %u or greater than or equal to %u" +msgstr "-c 옵션으로 지정한 트랜잭션 ID는 %uì´ê±°ë‚˜ %uì´ìƒì´ì–´ì•¼ 함" + +#: pg_resetwal.c:234 #, c-format msgid "OID (-o) must not be 0" msgstr "OID (-o) ê°’ì€ 0ì´ ì•„ë‹ˆì—¬ì•¼í•¨" -#: pg_resetwal.c:250 +#: pg_resetwal.c:255 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "멀티트랜잭션 ID (-m) ê°’ì€ 0ì´ ì•„ë‹ˆì—¬ì•¼í•¨" -#: pg_resetwal.c:260 +#: pg_resetwal.c:262 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "ì œì¼ ì˜¤ëž˜ëœ ë©€í‹°íŠ¸ëžœìž­ì…˜ ID (-m) ê°’ì€ 0ì´ ì•„ë‹ˆì—¬ì•¼í•¨" @@ -120,110 +238,101 @@ msgstr "ì œì¼ ì˜¤ëž˜ëœ ë©€í‹°íŠ¸ëžœìž­ì…˜ ID (-m) ê°’ì€ 0ì´ ì•„ë‹ˆì—¬ì•¼í•¨" msgid "multitransaction offset (-O) must not be -1" msgstr "멀티트랜잭션 옵셋 (-O) ê°’ì€ -1ì´ ì•„ë‹ˆì—¬ì•¼í•¨" -#: pg_resetwal.c:299 +#: pg_resetwal.c:301 #, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "--wal-segsize ê°’ì€ ìˆ«ìžì—¬ì•¼ 합니다" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "%s ê°’ì€ 1부터 1024ì‚¬ì´ 2^n ê°’ì´ì–´ì•¼ 합니다" -#: pg_resetwal.c:304 -#, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "--wal-segsize ê°’ì€ 1부터 1024ì‚¬ì´ 2^n ê°’ì´ì–´ì•¼ 합니다" - -#: pg_resetwal.c:321 +#: pg_resetwal.c:318 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")" -#: pg_resetwal.c:330 +#: pg_resetwal.c:326 #, c-format msgid "no data directory specified" msgstr "ë°ì´í„° 디렉터리를 지정하지 않았ìŒ" -#: pg_resetwal.c:344 +#: pg_resetwal.c:340 #, c-format msgid "cannot be executed by \"root\"" msgstr "\"root\" 계정으로는 실행 í•  수 ì—†ìŒ" -#: pg_resetwal.c:345 +#: pg_resetwal.c:341 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "PostgreSQL superuser로 %s í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•˜ì‹­ì‹œì˜¤." -#: pg_resetwal.c:356 +#: pg_resetwal.c:351 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "\"%s\" 디렉터리 ì½ê¸° 권한 ì—†ìŒ: %m" -#: pg_resetwal.c:365 +#: pg_resetwal.c:357 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "\"%s\" ì´ë¦„ì˜ ë””ë ‰í„°ë¦¬ë¡œ ì´ë™í•  수 없습니다: %m" -#: pg_resetwal.c:381 pg_resetwal.c:544 pg_resetwal.c:595 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "\"%s\" íŒŒì¼ ì¼ê¸° 모드로 열기 실패: %m" - -#: pg_resetwal.c:388 +#: pg_resetwal.c:375 #, c-format msgid "lock file \"%s\" exists" msgstr "\"%s\" 잠금 파ì¼ì´ 있ìŒ" -#: pg_resetwal.c:389 +#: pg_resetwal.c:376 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "" "서버가 ê°€ë™ì¤‘ì¸ê°€ìš”? 그렇지 않다면, ì´ íŒŒì¼ì„ 지우고 다시 시ë„하십시오." -#: pg_resetwal.c:492 +#: pg_resetwal.c:475 #, c-format -msgid "" -"\n" -"If these values seem acceptable, use -f to force reset.\n" -msgstr "" -"\n" -"ì´ ì„¤ì •ê°’ë“¤ì´ íƒ€ë‹¹í•˜ë‹¤ê³  íŒë‹¨ë˜ë©´, 강제로 갱신하려면, -f ì˜µì…˜ì„ ì“°ì„¸ìš”.\n" +msgid "not proceeding because control file values were guessed" +msgstr "컨트롤 íŒŒì¼ ê°’ë“¤ì´ ì¶”ì •ë˜ì—ˆê¸°ì— ë” ì´ìƒ 진행하지 않습니다." -#: pg_resetwal.c:504 +#: pg_resetwal.c:476 #, c-format -msgid "" -"The database server was not shut down cleanly.\n" -"Resetting the write-ahead log might cause data to be lost.\n" -"If you want to proceed anyway, use -f to force reset.\n" +msgid "If these values seem acceptable, use -f to force reset." msgstr "" -"ì´ ë°ì´í„°ë² ì´ìФ 서버는 ì •ìƒì ìœ¼ë¡œ 중지ë˜ì§€ 못했습니다.\n" -"트랜잭션 로그를 다시 설정하는 ê²ƒì€ ìžë£Œ ì†ì‹¤ì„ 야기할 수 있습니다.\n" -"그럼ì—ë„ ë¶ˆêµ¬í•˜ê³  진행하려면, -f ì˜µì…˜ì„ ì‚¬ìš©í•´ì„œ ê°•ì œ ì„¤ì •ì„ í•˜ì‹­ì‹œì˜¤.\n" +"ì´ ì„¤ì •ê°’ë“¤ì´ íƒ€ë‹¹í•˜ë‹¤ê³  íŒë‹¨ë˜ë©´, 강제로 갱신하려면, -f ì˜µì…˜ì„ ì“°ì„¸ìš”." + +#: pg_resetwal.c:485 +#, c-format +msgid "database server was not shut down cleanly" +msgstr "ë°ì´í„°ë² ì´ìФ 서버가 ê¹”ë”하게 중지 ë˜ì§€ 못했습니다." -#: pg_resetwal.c:518 +#: pg_resetwal.c:486 +#, c-format +msgid "Resetting the write-ahead log might cause data to be lost." +msgstr "미리 쓰기 로그를 리셋하면 ìžë£Œë¥¼ 잃어버릴 수 있습니다." + +#: pg_resetwal.c:487 +#, c-format +msgid "If you want to proceed anyway, use -f to force reset." +msgstr "ì´ ì„¤ì •ê°’ë“¤ë¡œ 강제로 갱신하려면, -f ì˜µì…˜ì„ ì“°ì„¸ìš”." + +#: pg_resetwal.c:500 #, c-format msgid "Write-ahead log reset\n" msgstr "트랜잭션 로그 재설정\n" -#: pg_resetwal.c:553 +#: pg_resetwal.c:532 #, c-format msgid "unexpected empty file \"%s\"" msgstr "\"%s\" 파ì¼ì€ 예ìƒì¹˜ 않게 비었ìŒ" -#: pg_resetwal.c:555 pg_resetwal.c:611 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" - -#: pg_resetwal.c:564 +#: pg_resetwal.c:542 #, c-format msgid "data directory is of wrong version" msgstr "ìž˜ëª»ëœ ë²„ì „ì˜ ë°ì´í„° 디렉터리입니다." -#: pg_resetwal.c:565 +#: pg_resetwal.c:543 #, c-format msgid "" "File \"%s\" contains \"%s\", which is not compatible with this program's " "version \"%s\"." msgstr "\"%s\" íŒŒì¼ ë²„ì „ì€ \"%s\", ì´ í”„ë¡œê·¸ëž¨ ë²„ì „ì€ \"%s\"." -#: pg_resetwal.c:598 +#: pg_resetwal.c:576 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -234,12 +343,12 @@ msgstr "" "보십시오.\n" " touch %s" -#: pg_resetwal.c:629 +#: pg_resetwal.c:604 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "pg_control 파ì¼ì´ 있지만, CRCê°’ì´ ìž˜ëª»ë˜ì—ˆìŠµë‹ˆë‹¤; 경고와 함께 진행함" -#: pg_resetwal.c:638 +#: pg_resetwal.c:613 #, c-format msgid "" "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" @@ -250,12 +359,12 @@ msgstr[0] "" "pg_control 파ì¼ì— ìž˜ëª»ëœ WAL ì¡°ê° íŒŒì¼ í¬ê¸°(%d ë°”ì´íЏ)ê°€ 지정ë¨; 경고와 함께 " "진행함" -#: pg_resetwal.c:649 +#: pg_resetwal.c:624 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "pg_control 파ì¼ì´ 있지만, ì†ìƒë˜ì—ˆê±°ë‚˜ ë²„ì „ì„ ì•Œ 수 ì—†ìŒ; 무시함" -#: pg_resetwal.c:744 +#: pg_resetwal.c:719 #, c-format msgid "" "Guessed pg_control values:\n" @@ -264,7 +373,7 @@ msgstr "" "ì¶”ì¸¡ëœ pg_control 설정값들:\n" "\n" -#: pg_resetwal.c:746 +#: pg_resetwal.c:721 #, c-format msgid "" "Current pg_control values:\n" @@ -273,167 +382,167 @@ msgstr "" "현재 pg_control 설정값들:\n" "\n" -#: pg_resetwal.c:748 +#: pg_resetwal.c:723 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_control 버전 번호: %u\n" -#: pg_resetwal.c:750 +#: pg_resetwal.c:725 #, c-format msgid "Catalog version number: %u\n" msgstr "카탈로그 버전 번호: %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:727 #, c-format msgid "Database system identifier: %llu\n" msgstr "ë°ì´í„°ë² ì´ìФ 시스템 ì‹ë³„ìž: %llu\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:729 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ TimeLineID: %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:731 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ full_page_writes: %s\n" -#: pg_resetwal.c:757 +#: pg_resetwal.c:732 msgid "off" msgstr "off" -#: pg_resetwal.c:757 +#: pg_resetwal.c:732 msgid "on" msgstr "on" -#: pg_resetwal.c:758 +#: pg_resetwal.c:733 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ NextXID: %u:%u\n" -#: pg_resetwal.c:761 +#: pg_resetwal.c:736 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ NextOID: %u\n" -#: pg_resetwal.c:763 +#: pg_resetwal.c:738 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ NextMultiXactId: %u\n" -#: pg_resetwal.c:765 +#: pg_resetwal.c:740 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ NextMultiOffset: %u\n" -#: pg_resetwal.c:767 +#: pg_resetwal.c:742 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ ì œì¼ ì˜¤ëž˜ëœ XID: %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:744 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ ì œì¼ ì˜¤ëž˜ëœ XIDì˜ DB:%u\n" -#: pg_resetwal.c:771 +#: pg_resetwal.c:746 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ ì œì¼ ì˜¤ëž˜ëœ ActiveXID:%u\n" -#: pg_resetwal.c:773 +#: pg_resetwal.c:748 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ ì œì¼ ì˜¤ëž˜ëœ MultiXid:%u\n" -#: pg_resetwal.c:775 +#: pg_resetwal.c:750 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ ì œì¼ ì˜¤ëž˜ëœ MultiXidì˜ DB:%u\n" -#: pg_resetwal.c:777 +#: pg_resetwal.c:752 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ ì œì¼ ì˜¤ëž˜ëœ CommitTsXid:%u\n" -#: pg_resetwal.c:779 +#: pg_resetwal.c:754 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "마지막 ì²´í¬í¬ì¸íЏ 최신 CommitTsXid: %u\n" -#: pg_resetwal.c:781 +#: pg_resetwal.c:756 #, c-format msgid "Maximum data alignment: %u\n" msgstr "최대 ìžë£Œ ì •ë ¬: %u\n" -#: pg_resetwal.c:784 +#: pg_resetwal.c:759 #, c-format msgid "Database block size: %u\n" msgstr "ë°ì´í„°ë² ì´ìФ ë¸”ë¡ í¬ê¸°: %u\n" -#: pg_resetwal.c:786 +#: pg_resetwal.c:761 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "대형 릴레ì´ì…˜ì˜ 세그먼트당 블럭 갯수: %u\n" -#: pg_resetwal.c:788 +#: pg_resetwal.c:763 #, c-format msgid "WAL block size: %u\n" msgstr "WAL ë¸”ë¡ í¬ê¸°: %u\n" -#: pg_resetwal.c:790 pg_resetwal.c:876 +#: pg_resetwal.c:765 pg_resetwal.c:851 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "WAL ì„¸ê·¸ë¨¼íŠ¸ì˜ í¬ê¸°(byte): %u\n" -#: pg_resetwal.c:792 +#: pg_resetwal.c:767 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "ì‹ë³„ìž ìµœëŒ€ 길ì´: %u\n" -#: pg_resetwal.c:794 +#: pg_resetwal.c:769 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "ì¸ë±ìФì—서 사용하는 최대 ì—´ 수: %u\n" -#: pg_resetwal.c:796 +#: pg_resetwal.c:771 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "TOAST ì²­í¬ì˜ 최대 í¬ê¸°: %u\n" -#: pg_resetwal.c:798 +#: pg_resetwal.c:773 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "대형ê°ì²´ ì²­í¬ì˜ 최대 í¬ê¸°: %u\n" -#: pg_resetwal.c:801 +#: pg_resetwal.c:776 #, c-format msgid "Date/time type storage: %s\n" msgstr "ë‚ ì§œ/시간형 ìžë£Œì˜ 저장방ì‹: %s\n" -#: pg_resetwal.c:802 +#: pg_resetwal.c:777 msgid "64-bit integers" msgstr "64-비트 정수" -#: pg_resetwal.c:803 +#: pg_resetwal.c:778 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Float8 ì¸ìˆ˜ 전달: %s\n" -#: pg_resetwal.c:804 +#: pg_resetwal.c:779 msgid "by reference" msgstr "참조별" -#: pg_resetwal.c:804 +#: pg_resetwal.c:779 msgid "by value" msgstr "값별" -#: pg_resetwal.c:805 +#: pg_resetwal.c:780 #, c-format msgid "Data page checksum version: %u\n" msgstr "ë°ì´í„° 페ì´ì§€ ì²´í¬ì„¬ 버전: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:794 #, c-format msgid "" "\n" @@ -446,102 +555,82 @@ msgstr "" "ë³€ê²½ë  ê°’:\n" "\n" -#: pg_resetwal.c:823 +#: pg_resetwal.c:798 #, c-format msgid "First log segment after reset: %s\n" msgstr "리셋 ë’¤ 첫 로그 세그먼트: %s\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:802 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:829 +#: pg_resetwal.c:804 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:831 +#: pg_resetwal.c:806 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "OldestMultiXidì˜ DB: %u\n" -#: pg_resetwal.c:837 +#: pg_resetwal.c:812 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:843 +#: pg_resetwal.c:818 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:849 +#: pg_resetwal.c:824 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:851 +#: pg_resetwal.c:826 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:853 +#: pg_resetwal.c:828 #, c-format msgid "OldestXID's DB: %u\n" msgstr "OldestXIDì˜ DB: %u\n" -#: pg_resetwal.c:859 +#: pg_resetwal.c:834 #, c-format msgid "NextXID epoch: %u\n" msgstr "NextXID epoch: %u\n" -#: pg_resetwal.c:865 +#: pg_resetwal.c:840 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "ì œì¼ ì˜¤ëž˜ëœ CommitTsXid: %u\n" -#: pg_resetwal.c:870 +#: pg_resetwal.c:845 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "최근 CommitTsXid: %u\n" -#: pg_resetwal.c:956 pg_resetwal.c:1024 pg_resetwal.c:1071 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m" - -#: pg_resetwal.c:991 pg_resetwal.c:1044 pg_resetwal.c:1094 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" - -#: pg_resetwal.c:997 pg_resetwal.c:1050 pg_resetwal.c:1100 +#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 pg_resetwal.c:1071 #, c-format msgid "could not close directory \"%s\": %m" msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: pg_resetwal.c:1036 pg_resetwal.c:1086 +#: pg_resetwal.c:990 pg_resetwal.c:1028 pg_resetwal.c:1063 #, c-format msgid "could not delete file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ 지울 수 ì—†ìŒ: %m" -#: pg_resetwal.c:1167 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" - -#: pg_resetwal.c:1177 pg_resetwal.c:1190 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m" - -#: pg_resetwal.c:1197 +#: pg_resetwal.c:1159 #, c-format msgid "fsync error: %m" msgstr "fsync 오류: %m" -#: pg_resetwal.c:1208 +#: pg_resetwal.c:1168 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -550,104 +639,124 @@ msgstr "" "%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL 트랜잭션 로그를 다시 설정합니다.\n" "\n" -#: pg_resetwal.c:1209 +#: pg_resetwal.c:1169 +#, c-format +msgid "Usage:\n" +msgstr "사용법:\n" + +#: pg_resetwal.c:1170 +#, c-format +msgid " %s [OPTION]... DATADIR\n" +msgstr " %s [옵션]... DATADIR\n" + +#: pg_resetwal.c:1172 #, c-format msgid "" -"Usage:\n" -" %s [OPTION]... DATADIR\n" "\n" +"Options:\n" msgstr "" -"사용법:\n" -" %s [옵션]... DATADIR\n" "\n" +"옵션들:\n" -#: pg_resetwal.c:1210 +#: pg_resetwal.c:1173 #, c-format -msgid "Options:\n" -msgstr "옵션들:\n" +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]DATADIR ë°ì´í„° 디렉터리\n" -#: pg_resetwal.c:1211 +#: pg_resetwal.c:1174 #, c-format msgid "" -" -c, --commit-timestamp-ids=XID,XID\n" -" set oldest and newest transactions bearing\n" -" commit timestamp (zero means no change)\n" +" -f, --force force update to be done even after unclean shutdown " +"or\n" +" if pg_control values had to be guessed\n" msgstr "" -" -c, --commit-timestamp-ids=XID,XID\n" -" 커밋 타임스탬프를 사용할 최소,최대 트랜잭" -"ì…˜\n" -" ID ê°’ (0ì´ë©´ 바꾸지 않ìŒ)\n" +" -f, --force 비정ìƒì ìœ¼ë¡œ 종료ë˜ì—ˆê±°ë‚˜ pg_control ê°’ì„ ì¶”ì¸¡í•´ì•¼\n" +" 하는 경우ì—ë„ ê°•ì œë¡œ 갱신함\n" -#: pg_resetwal.c:1214 +#: pg_resetwal.c:1176 #, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]DATADIR ë°ì´í„° 디렉터리\n" +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr " -n, --dry-run 갱신하지 않ìŒ, 컨트롤 ê°’ë“¤ì„ ë³´ì—¬ì£¼ê¸°ë§Œí•¨\n" -#: pg_resetwal.c:1215 +#: pg_resetwal.c:1177 #, c-format -msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" -msgstr " -e, --epoch=XIDEPOCH ë‹¤ìŒ íŠ¸ëž™ìž­ì…˜ ID epoch 지정\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: pg_resetwal.c:1216 +#: pg_resetwal.c:1178 #, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force 강제로 갱신함\n" +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ì´ ë„움ë§ì„ 표시하고 종료\n" -#: pg_resetwal.c:1217 +#: pg_resetwal.c:1180 #, c-format msgid "" -" -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" +"\n" +"Options to override control file values:\n" msgstr "" -" -l, --next-wal-file=WALFILE 새 트랜잭션 로그를 위한 WAL 최소 시작 위치" -"를 강제로 지정\n" +"\n" +"컨트롤 íŒŒì¼ ê°’ì„ ë°”ê¿€ 옵션들:\n" -#: pg_resetwal.c:1218 +#: pg_resetwal.c:1181 #, c-format msgid "" -" -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" +" -c, --commit-timestamp-ids=XID,XID\n" +" set oldest and newest transactions " +"bearing\n" +" commit timestamp (zero means no change)\n" msgstr "" -" -m, --multixact-ids=MXID,MXID ë‹¤ìŒ ì œì¼ ì˜¤ëž˜ëœ ë©€í‹°íŠ¸ëžœìž­ì…˜ ID 지정\n" +" -c, --commit-timestamp-ids=XID,XID\n" +" 커밋 타임스탬프를 사용할 최소,최대 트랜잭" +"ì…˜\n" +" ID ê°’ (0ì´ë©´ 바꾸지 않ìŒ)\n" -#: pg_resetwal.c:1219 +#: pg_resetwal.c:1184 +#, c-format +msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" +msgstr " -e, --epoch=XIDEPOCH ë‹¤ìŒ íŠ¸ëž™ìž­ì…˜ ID epoch 지정\n" + +#: pg_resetwal.c:1185 #, c-format msgid "" -" -n, --dry-run no update, just show what would be done\n" +" -l, --next-wal-file=WALFILE set minimum starting location for new " +"WAL\n" msgstr "" -" -n, --dry-run 갱신하지 않ìŒ, 컨트롤 ê°’ë“¤ì„ ë³´ì—¬ì£¼ê¸°ë§Œ 함" -"(테스트용)\n" +" -l, --next-wal-file=WALFILE 새 트랜잭션 로그를 위한 WAL 최소 시작 위치" +"를 강제로 지정\n" -#: pg_resetwal.c:1220 +#: pg_resetwal.c:1186 #, c-format -msgid " -o, --next-oid=OID set next OID\n" -msgstr " -o, --next-oid=OID ë‹¤ìŒ OID 지정\n" +msgid "" +" -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" +msgstr "" +" -m, --multixact-ids=MXID,MXID ë‹¤ìŒ ì œì¼ ì˜¤ëž˜ëœ ë©€í‹°íŠ¸ëžœìž­ì…˜ ID 지정\n" -#: pg_resetwal.c:1221 +#: pg_resetwal.c:1187 #, c-format -msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" -msgstr " -O, --multixact-offset=OFFSET ë‹¤ìŒ ë©€í‹°íŠ¸ëžœìž­ì…˜ 옵셋 지정\n" +msgid " -o, --next-oid=OID set next OID\n" +msgstr " -o, --next-oid=OID ë‹¤ìŒ OID 지정\n" -#: pg_resetwal.c:1222 +#: pg_resetwal.c:1188 #, c-format -msgid "" -" -V, --version output version information, then exit\n" -msgstr " -V, --version 버전 정보를 보여주고 마침\n" +msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" +msgstr " -O, --multixact-offset=OFFSET ë‹¤ìŒ ë©€í‹°íŠ¸ëžœìž­ì…˜ 옵셋 지정\n" -#: pg_resetwal.c:1223 +#: pg_resetwal.c:1189 #, c-format -msgid " -x, --next-transaction-id=XID set next transaction ID\n" -msgstr " -x, --next-transaction-id=XID ë‹¤ìŒ íŠ¸ëžœìž­ì…˜ ID 지정\n" +msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" +msgstr " -u, --oldest-transaction-id=XID ì œì¼ ì˜¤ëž˜ëœ íŠ¸ëžœìž­ì…˜ ID 지정\n" -#: pg_resetwal.c:1224 +#: pg_resetwal.c:1190 #, c-format -msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" -msgstr " --wal-segsize=SIZE WAL ì¡°ê° íŒŒì¼ í¬ê¸°, MB 단위\n" +msgid " -x, --next-transaction-id=XID set next transaction ID\n" +msgstr " -x, --next-transaction-id=XID ë‹¤ìŒ íŠ¸ëžœìž­ì…˜ ID 지정\n" -#: pg_resetwal.c:1225 +#: pg_resetwal.c:1191 #, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" +msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" +msgstr " --wal-segsize=SIZE WAL ì¡°ê° íŒŒì¼ í¬ê¸°, MB 단위\n" -#: pg_resetwal.c:1226 +#: pg_resetwal.c:1193 #, c-format msgid "" "\n" @@ -656,7 +765,25 @@ msgstr "" "\n" "ë¬¸ì œì  ë³´ê³  주소: <%s>\n" -#: pg_resetwal.c:1227 +#: pg_resetwal.c:1194 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페ì´ì§€: <%s>\n" + +#, c-format +#~ msgid "argument of --wal-segsize must be a number" +#~ msgstr "--wal-segsize ê°’ì€ ìˆ«ìžì—¬ì•¼ 합니다" + +#, c-format +#~ msgid "" +#~ "The database server was not shut down cleanly.\n" +#~ "Resetting the write-ahead log might cause data to be lost.\n" +#~ "If you want to proceed anyway, use -f to force reset.\n" +#~ msgstr "" +#~ "ì´ ë°ì´í„°ë² ì´ìФ 서버는 ì •ìƒì ìœ¼ë¡œ 중지ë˜ì§€ 못했습니다.\n" +#~ "트랜잭션 로그를 다시 설정하는 ê²ƒì€ ìžë£Œ ì†ì‹¤ì„ 야기할 수 있습니다.\n" +#~ "그럼ì—ë„ ë¶ˆêµ¬í•˜ê³  진행하려면, -f ì˜µì…˜ì„ ì‚¬ìš©í•´ì„œ ê°•ì œ ì„¤ì •ì„ í•˜ì‹­ì‹œì˜¤.\n" + +#, c-format +#~ msgid " -f, --force force update to be done\n" +#~ msgstr " -f, --force 강제로 갱신함\n" diff --git a/src/bin/pg_resetwal/po/meson.build b/src/bin/pg_resetwal/po/meson.build index fa75d28752685..2f474d8f3480d 100644 --- a/src/bin/pg_resetwal/po/meson.build +++ b/src/bin/pg_resetwal/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_resetwal-' + pg_version_major.to_string())] diff --git a/src/bin/pg_resetwal/po/pt_BR.po b/src/bin/pg_resetwal/po/pt_BR.po index 952b83eb38956..a9f84a5d1385c 100644 --- a/src/bin/pg_resetwal/po/pt_BR.po +++ b/src/bin/pg_resetwal/po/pt_BR.po @@ -1,17 +1,17 @@ # Brazilian Portuguese message translation file for pg_resetwal # -# Copyright (C) 2002-2022 PostgreSQL Global Development Group +# Copyright (C) 2002-2023 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Cesar Suga , 2002. # Roberto Mello , 2002. -# Euler Taveira , 2003-2022. +# Euler Taveira , 2003-2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-27 13:15-0300\n" +"POT-Creation-Date: 2024-01-02 13:01-0300\n" "PO-Revision-Date: 2022-09-27 20:17-0300\n" "Last-Translator: Euler Taveira \n" "Language-Team: Brazilian Portuguese \n" @@ -41,42 +41,32 @@ msgstr "detalhe: " msgid "hint: " msgstr "dica: " -#: ../../common/restricted_token.c:64 -#, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "não pôde carregar biblioteca \"%s\": código de erro %lu" - -#: ../../common/restricted_token.c:73 -#, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "não pode criar informações restritas nessa plataforma: código de erro %lu" - -#: ../../common/restricted_token.c:82 +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "não pôde abrir informação sobre processo: código de erro %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "não pôde alocar SIDs: código de erro %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "não pôde criar informação restrita: código de erro %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "não pôde iniciar processo para comando \"%s\": código de erro %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "não pôde executar novamente com informação restrita: código de erro %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "não pôde obter código de saída de subprocesso: código de erro %lu" @@ -144,8 +134,8 @@ msgstr "argumento de --wal-segsize deve ser um número" #: pg_resetwal.c:298 #, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "argumento de --wal-segsize deve ser uma potência de 2 entre 1 e 1024" +msgid "argument of --wal-segsize must be a power of two between 1 and 1024" +msgstr "argumento de --wal-segsize deve ser uma potência de dois entre 1 e 1024" #: pg_resetwal.c:314 #, c-format @@ -516,42 +506,42 @@ msgstr "oldestCommitTsXid: %u\n" msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016 +#: pg_resetwal.c:921 pg_resetwal.c:974 pg_resetwal.c:1009 #, c-format msgid "could not open directory \"%s\": %m" msgstr "não pôde abrir diretório \"%s\": %m" -#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 +#: pg_resetwal.c:947 pg_resetwal.c:988 pg_resetwal.c:1026 #, c-format msgid "could not read directory \"%s\": %m" msgstr "não pôde ler diretório \"%s\": %m" -#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 +#: pg_resetwal.c:950 pg_resetwal.c:991 pg_resetwal.c:1029 #, c-format msgid "could not close directory \"%s\": %m" msgstr "não pôde fechar diretório \"%s\": %m" -#: pg_resetwal.c:990 pg_resetwal.c:1028 +#: pg_resetwal.c:983 pg_resetwal.c:1021 #, c-format msgid "could not delete file \"%s\": %m" msgstr "não pôde excluir arquivo \"%s\": %m" -#: pg_resetwal.c:1100 +#: pg_resetwal.c:1093 #, c-format msgid "could not open file \"%s\": %m" msgstr "não pôde abrir arquivo \"%s\": %m" -#: pg_resetwal.c:1108 pg_resetwal.c:1120 +#: pg_resetwal.c:1101 pg_resetwal.c:1113 #, c-format msgid "could not write file \"%s\": %m" msgstr "não pôde escrever no arquivo \"%s\": %m" -#: pg_resetwal.c:1125 +#: pg_resetwal.c:1118 #, c-format msgid "fsync error: %m" msgstr "erro ao executar fsync: %m" -#: pg_resetwal.c:1134 +#: pg_resetwal.c:1127 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -560,7 +550,7 @@ msgstr "" "%s reinicia o log de transação do PostgreSQL.\n" "\n" -#: pg_resetwal.c:1135 +#: pg_resetwal.c:1128 #, c-format msgid "" "Usage:\n" @@ -571,12 +561,12 @@ msgstr "" " %s [OPÇÃO]... DIRDADOS\n" "\n" -#: pg_resetwal.c:1136 +#: pg_resetwal.c:1129 #, c-format msgid "Options:\n" msgstr "Opções:\n" -#: pg_resetwal.c:1137 +#: pg_resetwal.c:1130 #, c-format msgid "" " -c, --commit-timestamp-ids=XID,XID\n" @@ -587,72 +577,72 @@ msgstr "" " define as transações mais antiga e mais nova\n" " timestamp de efetivação (zero significa nenhuma mudança)\n" -#: pg_resetwal.c:1140 +#: pg_resetwal.c:1133 #, c-format msgid " [-D, --pgdata=]DATADIR data directory\n" msgstr " [-D, --pgdata=]DIRDADOS diretório de dados\n" -#: pg_resetwal.c:1141 +#: pg_resetwal.c:1134 #, c-format msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" msgstr " -e, --epoch=ÉPOCA_XID define próxima época do ID de transação\n" -#: pg_resetwal.c:1142 +#: pg_resetwal.c:1135 #, c-format msgid " -f, --force force update to be done\n" msgstr " -f, --force força atualização ser feita\n" -#: pg_resetwal.c:1143 +#: pg_resetwal.c:1136 #, c-format msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" msgstr " -l, --next-wal-file=ARQUIVOWAL define local inicial mínimo do WAL para novo log de transação\n" -#: pg_resetwal.c:1144 +#: pg_resetwal.c:1137 #, c-format msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" msgstr " -m, --multixact-ids=MXID,MXID define próximo e mais velho ID de multitransação\n" -#: pg_resetwal.c:1145 +#: pg_resetwal.c:1138 #, c-format msgid " -n, --dry-run no update, just show what would be done\n" msgstr " -n, --dry-run sem atualização, mostra o que seria feito\n" -#: pg_resetwal.c:1146 +#: pg_resetwal.c:1139 #, c-format msgid " -o, --next-oid=OID set next OID\n" msgstr " -o, --next-oid=OID define próximo OID\n" -#: pg_resetwal.c:1147 +#: pg_resetwal.c:1140 #, c-format msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" msgstr " -O, --multixact-offset=POSIÇÃO define próxima posição de multitransação\n" -#: pg_resetwal.c:1148 +#: pg_resetwal.c:1141 #, c-format msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" msgstr " -u, --oldest-transaction-id=XID define ID de transação mais antigo\n" -#: pg_resetwal.c:1149 +#: pg_resetwal.c:1142 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostra informação sobre a versão e termina\n" -#: pg_resetwal.c:1150 +#: pg_resetwal.c:1143 #, c-format msgid " -x, --next-transaction-id=XID set next transaction ID\n" msgstr " -x, --next-transaction-id=XID define próximo ID de transação\n" -#: pg_resetwal.c:1151 +#: pg_resetwal.c:1144 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=TAMANHO tamanho dos segmentos do WAL, em megabytes\n" -#: pg_resetwal.c:1152 +#: pg_resetwal.c:1145 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostra essa ajuda e termina\n" -#: pg_resetwal.c:1153 +#: pg_resetwal.c:1146 #, c-format msgid "" "\n" @@ -661,7 +651,7 @@ msgstr "" "\n" "Relate erros a <%s>.\n" -#: pg_resetwal.c:1154 +#: pg_resetwal.c:1147 #, c-format msgid "%s home page: <%s>\n" msgstr "página web do %s: <%s>\n" diff --git a/src/bin/pg_resetwal/po/ru.po b/src/bin/pg_resetwal/po/ru.po index bba0ad1ed215d..c26776baad267 100644 --- a/src/bin/pg_resetwal/po/ru.po +++ b/src/bin/pg_resetwal/po/ru.po @@ -5,21 +5,21 @@ # Oleg Bartunov , 2004. # Sergey Burladyan , 2009. # Dmitriy Olshevskiy , 2014. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: pg_resetxlog (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-27 14:52+0300\n" -"PO-Revision-Date: 2022-09-05 13:36+0300\n" +"POT-Creation-Date: 2024-09-02 09:29+0300\n" +"PO-Revision-Date: 2024-09-05 12:19+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../../../src/common/logging.c:276 #, c-format @@ -41,200 +41,301 @@ msgstr "подробноÑти: " msgid "hint: " msgstr "подÑказка: " -#: ../../common/restricted_token.c:64 +#: ../../common/controldata_utils.c:97 pg_resetwal.c:370 pg_resetwal.c:525 +#: pg_resetwal.c:573 #, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "не удалоÑÑŒ загрузить библиотеку \"%s\" (код ошибки: %lu)" +msgid "could not open file \"%s\" for reading: %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m" + +#: ../../common/controldata_utils.c:110 pg_resetwal.c:534 pg_resetwal.c:588 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %zu)" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неÑоответÑтвие порÑдка байт" -#: ../../common/restricted_token.c:73 +#: ../../common/controldata_utils.c:170 #, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры (код ошибки: %lu)" +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, " +"and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"возможно неÑоответÑтвие порÑдка байт\n" +"ПорÑдок байт в файле pg_control может не ÑоответÑтвовать иÑпользуемому\n" +"Ñтой программой. Ð’ Ñтом Ñлучае результаты будут неверными и\n" +"уÑтановленный PostgreSQL будет неÑовмеÑтим Ñ Ñтим каталогом данных." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_resetwal.c:1134 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" + +#: ../../common/controldata_utils.c:249 pg_resetwal.c:1142 pg_resetwal.c:1154 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "нехватка памÑти\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñта Ñборка программы не поддерживает метод Ñинхронизации \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_resetwal.c:928 pg_resetwal.c:981 pg_resetwal.c:1016 pg_resetwal.c:1054 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 pg_resetwal.c:1068 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" -#: ../../common/restricted_token.c:82 +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" + +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "не удалоÑÑŒ открыть маркер процеÑÑа (код ошибки: %lu)" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "не удалоÑÑŒ подготовить Ñтруктуры SID (код ошибки: %lu)" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "не удалоÑÑŒ Ñоздать ограниченный маркер (код ошибки: %lu)" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "не удалоÑÑŒ запуÑтить процеÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ \"%s\" (код ошибки: %lu)" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "не удалоÑÑŒ перезапуÑтитьÑÑ Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ маркером (код ошибки: %lu)" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "не удалоÑÑŒ получить код выхода от подпроцеÑÑа (код ошибки: %lu)" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "значение %s должно быть в диапазоне %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нераÑпознанный метод Ñинхронизации: %s" + #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202 -#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249 -#: pg_resetwal.c:269 pg_resetwal.c:280 +#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 +#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 +#: pg_resetwal.c:270 pg_resetwal.c:281 #, c-format msgid "invalid argument for option %s" msgstr "недопуÑтимый аргумент параметра %s" -#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 -#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 -#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316 -#: pg_resetwal.c:323 +#: pg_resetwal.c:165 pg_resetwal.c:178 pg_resetwal.c:191 pg_resetwal.c:204 +#: pg_resetwal.c:211 pg_resetwal.c:230 pg_resetwal.c:243 pg_resetwal.c:251 +#: pg_resetwal.c:271 pg_resetwal.c:282 pg_resetwal.c:307 pg_resetwal.c:320 +#: pg_resetwal.c:327 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." -#: pg_resetwal.c:168 +#: pg_resetwal.c:169 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "Ñпоха ID транзакции (-e) не должна быть равна -1" -#: pg_resetwal.c:181 +#: pg_resetwal.c:182 #, c-format msgid "oldest transaction ID (-u) must be greater than or equal to %u" msgstr "ID Ñтарейшей транзакции (-u) должен быть больше или равен %u" -#: pg_resetwal.c:194 +#: pg_resetwal.c:195 #, c-format msgid "transaction ID (-x) must be greater than or equal to %u" msgstr "ID транзакции (-x) должен быть больше или равен %u" -#: pg_resetwal.c:216 pg_resetwal.c:220 +#: pg_resetwal.c:217 pg_resetwal.c:221 #, c-format -msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" -msgstr "ID транзакции (-c) должен быть равен 0, либо больше или равен 2" +msgid "transaction ID (-c) must be either %u or greater than or equal to %u" +msgstr "ID транзакции (-c) должен быть равен %u, либо больше или равен %u" -#: pg_resetwal.c:233 +#: pg_resetwal.c:234 #, c-format msgid "OID (-o) must not be 0" msgstr "OID (-o) не должен быть равен 0" -#: pg_resetwal.c:254 +#: pg_resetwal.c:255 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "ID мультитранзакции (-m) не должен быть равен 0" -#: pg_resetwal.c:261 +#: pg_resetwal.c:262 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "ID Ñтарейшей мультитранзакции (-m) не должен быть равен 0" -#: pg_resetwal.c:274 +#: pg_resetwal.c:275 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "Ñмещение мультитранзакции (-O) не должно быть равно -1" -#: pg_resetwal.c:296 +#: pg_resetwal.c:301 #, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "аргументом --wal-segsize должно быть чиÑло" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "аргументом %s должна быть Ñтепень двух от 1 до 1024" -#: pg_resetwal.c:298 -#, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "аргументом --wal-segsize должна быть Ñтепень 2 от 1 до 1024" - -#: pg_resetwal.c:314 +#: pg_resetwal.c:318 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")" -#: pg_resetwal.c:322 +#: pg_resetwal.c:326 #, c-format msgid "no data directory specified" msgstr "каталог данных не указан" -#: pg_resetwal.c:336 +#: pg_resetwal.c:340 #, c-format msgid "cannot be executed by \"root\"" msgstr "программу не должен запуÑкать root" -#: pg_resetwal.c:337 +#: pg_resetwal.c:341 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "ЗапуÑкать %s нужно от имени ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PostgreSQL." -#: pg_resetwal.c:347 +#: pg_resetwal.c:351 #, c-format msgid "could not read permissions of directory \"%s\": %m" -msgstr "не удалоÑÑŒ Ñчитать права на каталог \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать права на каталог \"%s\": %m" -#: pg_resetwal.c:353 +#: pg_resetwal.c:357 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m" -#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m" - -#: pg_resetwal.c:371 +#: pg_resetwal.c:375 #, c-format msgid "lock file \"%s\" exists" msgstr "файл блокировки \"%s\" ÑущеÑтвует" -#: pg_resetwal.c:372 +#: pg_resetwal.c:376 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "" "Возможно, Ñервер запущен? ЕÑли нет, удалите Ñтот файл и попробуйте Ñнова." -#: pg_resetwal.c:467 +#: pg_resetwal.c:475 #, c-format -msgid "" -"\n" -"If these values seem acceptable, use -f to force reset.\n" +msgid "not proceeding because control file values were guessed" msgstr "" -"\n" -"ЕÑли Ñти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð»ÐµÐ¼Ñ‹, выполните ÑÐ±Ñ€Ð¾Ñ Ð¿Ñ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾, добавив ключ -f." -"\n" +"выполнение прервано, так как Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð· контрольного файла ÑвлÑÑŽÑ‚ÑÑ " +"предполагаемыми" -#: pg_resetwal.c:479 +#: pg_resetwal.c:476 #, c-format -msgid "" -"The database server was not shut down cleanly.\n" -"Resetting the write-ahead log might cause data to be lost.\n" -"If you want to proceed anyway, use -f to force reset.\n" +msgid "If these values seem acceptable, use -f to force reset." +msgstr "" +"ЕÑли Ñти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²ÑÑ‘ же приемлемы, выполните ÑÐ±Ñ€Ð¾Ñ Ð¿Ñ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾, добавив " +"ключ -f." + +#: pg_resetwal.c:485 +#, c-format +msgid "database server was not shut down cleanly" +msgstr "Ñервер баз данных не был оÑтановлен штатно" + +#: pg_resetwal.c:486 +#, c-format +msgid "Resetting the write-ahead log might cause data to be lost." +msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° предзапиÑи может привеÑти к потере данных." + +#: pg_resetwal.c:487 +#, c-format +msgid "If you want to proceed anyway, use -f to force reset." msgstr "" -"Сервер баз данных был оÑтановлен некорректно.\n" -"Ð¡Ð±Ñ€Ð¾Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° предзапиÑи может привеÑти к потере данных.\n" -"ЕÑли вы хотите ÑброÑить его, неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° Ñто, добавьте ключ -f.\n" +"ЕÑли вы вÑÑ‘ же хотите продолжить, выполните ÑÐ±Ñ€Ð¾Ñ Ð¿Ñ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾, добавив " +"ключ -f." -#: pg_resetwal.c:493 +#: pg_resetwal.c:500 #, c-format msgid "Write-ahead log reset\n" msgstr "Журнал предзапиÑи Ñброшен\n" -#: pg_resetwal.c:525 +#: pg_resetwal.c:532 #, c-format msgid "unexpected empty file \"%s\"" msgstr "файл \"%s\" оказалÑÑ Ð¿ÑƒÑтым" -#: pg_resetwal.c:527 pg_resetwal.c:581 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" - -#: pg_resetwal.c:535 +#: pg_resetwal.c:542 #, c-format msgid "data directory is of wrong version" msgstr "каталог данных имеет неверную верÑию" -#: pg_resetwal.c:536 +#: pg_resetwal.c:543 #, c-format msgid "" "File \"%s\" contains \"%s\", which is not compatible with this program's " @@ -242,7 +343,7 @@ msgid "" msgstr "" "Файл \"%s\" Ñодержит Ñтроку \"%s\", а ожидаетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ \"%s\"." -#: pg_resetwal.c:569 +#: pg_resetwal.c:576 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -253,14 +354,14 @@ msgstr "" " touch %s\n" "и повторите попытку." -#: pg_resetwal.c:597 +#: pg_resetwal.c:604 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "" "pg_control ÑущеÑтвует, но его ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма неверна; продолжайте Ñ " "оÑторожноÑтью" -#: pg_resetwal.c:606 +#: pg_resetwal.c:613 #, c-format msgid "" "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" @@ -277,14 +378,14 @@ msgstr[2] "" "в pg_control указан некорректный размер Ñегмента WAL (%d Б); продолжайте Ñ " "оÑторожноÑтью" -#: pg_resetwal.c:617 +#: pg_resetwal.c:624 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "" "pg_control иÑпорчен или имеет неизвеÑтную либо недопуÑтимую верÑию; " "игнорируетÑÑ..." -#: pg_resetwal.c:712 +#: pg_resetwal.c:719 #, c-format msgid "" "Guessed pg_control values:\n" @@ -293,7 +394,7 @@ msgstr "" "Предполагаемые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ pg_control:\n" "\n" -#: pg_resetwal.c:714 +#: pg_resetwal.c:721 #, c-format msgid "" "Current pg_control values:\n" @@ -302,181 +403,181 @@ msgstr "" "Текущие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ pg_control:\n" "\n" -#: pg_resetwal.c:716 +#: pg_resetwal.c:723 #, c-format msgid "pg_control version number: %u\n" msgstr "Ðомер верÑии pg_control: %u\n" -#: pg_resetwal.c:718 +#: pg_resetwal.c:725 #, c-format msgid "Catalog version number: %u\n" msgstr "Ðомер верÑии каталога: %u\n" -#: pg_resetwal.c:720 +#: pg_resetwal.c:727 #, c-format msgid "Database system identifier: %llu\n" msgstr "Идентификатор ÑиÑтемы баз данных: %llu\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:722 +#: pg_resetwal.c:729 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "Ð›Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ поÑледней конт. точки: %u\n" # skip-rule: no-space-after-period -#: pg_resetwal.c:724 +#: pg_resetwal.c:731 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Режим full_page_writes поÑледней к.Ñ‚: %s\n" -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "off" msgstr "выкл." -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "on" msgstr "вкл." # skip-rule: capital-letter-first -#: pg_resetwal.c:726 +#: pg_resetwal.c:733 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID поÑледней конт. точки: %u:%u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:729 +#: pg_resetwal.c:736 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID поÑледней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:731 +#: pg_resetwal.c:738 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId поÑлед. конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:733 +#: pg_resetwal.c:740 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset поÑлед. конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:735 +#: pg_resetwal.c:742 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID поÑледней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:737 +#: pg_resetwal.c:744 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "БД Ñ oldestXID поÑледней конт. точки: %u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:739 +#: pg_resetwal.c:746 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID поÑледней к. Ñ‚.: %u\n" # skip-rule: capital-letter-first -#: pg_resetwal.c:741 +#: pg_resetwal.c:748 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid поÑледней конт. точки: %u\n" # skip-rule: capital-letter-first, double-space -#: pg_resetwal.c:743 +#: pg_resetwal.c:750 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "БД Ñ oldestMulti поÑледней к. Ñ‚.: %u\n" # skip-rule: capital-letter-first, double-space -#: pg_resetwal.c:745 +#: pg_resetwal.c:752 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid поÑледней к. Ñ‚.: %u\n" # skip-rule: capital-letter-first, double-space -#: pg_resetwal.c:747 +#: pg_resetwal.c:754 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid поÑледней к. Ñ‚.: %u\n" -#: pg_resetwal.c:749 +#: pg_resetwal.c:756 #, c-format msgid "Maximum data alignment: %u\n" msgstr "МакÑ. предел Ð²Ñ‹Ñ€Ð°Ð²Ð½Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…: %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:759 #, c-format msgid "Database block size: %u\n" msgstr "Размер блока БД: %u\n" # skip-rule: double-space -#: pg_resetwal.c:754 +#: pg_resetwal.c:761 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Блоков в макÑ. Ñегменте отношений: %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:763 #, c-format msgid "WAL block size: %u\n" msgstr "Размер блока WAL: %u\n" -#: pg_resetwal.c:758 pg_resetwal.c:844 +#: pg_resetwal.c:765 pg_resetwal.c:851 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Байт в Ñегменте WAL: %u\n" -#: pg_resetwal.c:760 +#: pg_resetwal.c:767 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° идентификаторов: %u\n" -#: pg_resetwal.c:762 +#: pg_resetwal.c:769 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "МакÑ. чиÑло Ñтолбцов в индекÑе: %u\n" -#: pg_resetwal.c:764 +#: pg_resetwal.c:771 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "МакÑимальный размер порции TOAST: %u\n" -#: pg_resetwal.c:766 +#: pg_resetwal.c:773 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Размер порции большого объекта: %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:776 #, c-format msgid "Date/time type storage: %s\n" msgstr "Формат Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚Ñ‹/времени: %s\n" -#: pg_resetwal.c:770 +#: pg_resetwal.c:777 msgid "64-bit integers" msgstr "64-битные целые" -#: pg_resetwal.c:771 +#: pg_resetwal.c:778 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Передача аргумента float8: %s\n" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by reference" msgstr "по ÑÑылке" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by value" msgstr "по значению" -#: pg_resetwal.c:773 +#: pg_resetwal.c:780 #, c-format msgid "Data page checksum version: %u\n" msgstr "ВерÑÐ¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… Ñумм Ñтраниц: %u\n" -#: pg_resetwal.c:787 +#: pg_resetwal.c:794 #, c-format msgid "" "\n" @@ -489,102 +590,82 @@ msgstr "" "ЗначениÑ, которые будут изменены:\n" "\n" -#: pg_resetwal.c:791 +#: pg_resetwal.c:798 #, c-format msgid "First log segment after reset: %s\n" msgstr "Первый Ñегмент журнала поÑле ÑброÑа: %s\n" -#: pg_resetwal.c:795 +#: pg_resetwal.c:802 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:797 +#: pg_resetwal.c:804 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:799 +#: pg_resetwal.c:806 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "БД Ñ oldestMultiXid: %u\n" -#: pg_resetwal.c:805 +#: pg_resetwal.c:812 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:811 +#: pg_resetwal.c:818 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:817 +#: pg_resetwal.c:824 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:826 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:821 +#: pg_resetwal.c:828 #, c-format msgid "OldestXID's DB: %u\n" msgstr "БД Ñ oldestXID: %u\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:834 #, c-format msgid "NextXID epoch: %u\n" msgstr "Эпоха NextXID: %u\n" -#: pg_resetwal.c:833 +#: pg_resetwal.c:840 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:838 +#: pg_resetwal.c:845 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" - -#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" - -#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 +#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 pg_resetwal.c:1071 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не удалоÑÑŒ закрыть каталог \"%s\": %m" -#: pg_resetwal.c:990 pg_resetwal.c:1028 +#: pg_resetwal.c:990 pg_resetwal.c:1028 pg_resetwal.c:1063 #, c-format msgid "could not delete file \"%s\": %m" msgstr "ошибка ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": %m" -#: pg_resetwal.c:1100 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" - -#: pg_resetwal.c:1108 pg_resetwal.c:1120 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m" - -#: pg_resetwal.c:1125 +#: pg_resetwal.c:1159 #, c-format msgid "fsync error: %m" msgstr "ошибка Ñинхронизации Ñ Ð¤Ð¡: %m" -#: pg_resetwal.c:1134 +#: pg_resetwal.c:1168 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -593,23 +674,69 @@ msgstr "" "%s ÑбраÑывает журнал предзапиÑи PostgreSQL.\n" "\n" -#: pg_resetwal.c:1135 +#: pg_resetwal.c:1169 +#, c-format +msgid "Usage:\n" +msgstr "ИÑпользование:\n" + +#: pg_resetwal.c:1170 +#, c-format +msgid " %s [OPTION]... DATADIR\n" +msgstr " %s [ПÐРÐМЕТР]... КÐТ_ДÐÐÐЫХ\n" + +#: pg_resetwal.c:1172 #, c-format msgid "" -"Usage:\n" -" %s [OPTION]... DATADIR\n" "\n" +"Options:\n" msgstr "" -"ИÑпользование:\n" -" %s [ПÐРÐМЕТР]... КÐТ_ДÐÐÐЫХ\n" "\n" +"Параметры:\n" + +#: pg_resetwal.c:1173 +#, c-format +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]КÐТ_ДÐÐÐЫХ каталог данных\n" + +#: pg_resetwal.c:1174 +#, c-format +msgid "" +" -f, --force force update to be done even after unclean shutdown " +"or\n" +" if pg_control values had to be guessed\n" +msgstr "" +" -f, --force принудительно произвеÑти изменениÑ, даже в Ñлучае\n" +" недоÑтоверных значений pg_control или поÑле " +"нештатного\n" +" Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñервера\n" + +#: pg_resetwal.c:1176 +#, c-format +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr "" +" -n, --dry-run показать, какие дейÑÑ‚Ð²Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ выполнены, но не\n" +" выполнÑть их\n" + +#: pg_resetwal.c:1177 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version показать верÑию и выйти\n" + +#: pg_resetwal.c:1178 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: pg_resetwal.c:1136 +#: pg_resetwal.c:1180 #, c-format -msgid "Options:\n" -msgstr "Параметры:\n" +msgid "" +"\n" +"Options to override control file values:\n" +msgstr "" +"\n" +"Параметры, переопределÑющие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð· контрольного файла:\n" -#: pg_resetwal.c:1137 +#: pg_resetwal.c:1181 #, c-format msgid "" " -c, --commit-timestamp-ids=XID,XID\n" @@ -621,24 +748,13 @@ msgstr "" " задать Ñтарейшую и новейшую транзакции,\n" " неÑущие метки времени (0 — не менÑть)\n" -#: pg_resetwal.c:1140 -#, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]КÐТ_ДÐÐÐЫХ каталог данных\n" - -#: pg_resetwal.c:1141 +#: pg_resetwal.c:1184 #, c-format msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" msgstr "" " -e, --epoch=XIDEPOCH задать Ñпоху Ð´Ð»Ñ ID Ñледующей транзакции\n" -#: pg_resetwal.c:1142 -#, c-format -msgid " -f, --force force update to be done\n" -msgstr "" -" -f, --force принудительное выполнение операции\n" - -#: pg_resetwal.c:1143 +#: pg_resetwal.c:1185 #, c-format msgid "" " -l, --next-wal-file=WALFILE set minimum starting location for new " @@ -647,7 +763,7 @@ msgstr "" " -l, --next-wal-file=ФÐЙЛ_WAL задать минимальное начальное положение\n" " Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ WAL\n" -#: pg_resetwal.c:1144 +#: pg_resetwal.c:1186 #, c-format msgid "" " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" @@ -655,55 +771,35 @@ msgstr "" " -m, --multixact-ids=MXID,MXID задать ID Ñледующей и Ñтарейшей\n" " мультитранзакции\n" -#: pg_resetwal.c:1145 -#, c-format -msgid "" -" -n, --dry-run no update, just show what would be done\n" -msgstr "" -" -n, --dry-run показать, какие дейÑÑ‚Ð²Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ выполнены," -"\n" -" но не выполнÑть их\n" - -#: pg_resetwal.c:1146 +#: pg_resetwal.c:1187 #, c-format msgid " -o, --next-oid=OID set next OID\n" msgstr " -o, --next-oid=OID задать Ñледующий OID\n" -#: pg_resetwal.c:1147 +#: pg_resetwal.c:1188 #, c-format msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" msgstr "" " -O, --multixact-offset=СМЕЩЕÐИЕ задать Ñмещение Ñледующей " "мультитранзакции\n" -#: pg_resetwal.c:1148 +#: pg_resetwal.c:1189 #, c-format msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" msgstr " -u, --oldest-transaction-id=XID задать ID Ñтарейшей ID\n" -#: pg_resetwal.c:1149 -#, c-format -msgid "" -" -V, --version output version information, then exit\n" -msgstr " -V, --version показать верÑию и выйти\n" - -#: pg_resetwal.c:1150 +#: pg_resetwal.c:1190 #, c-format msgid " -x, --next-transaction-id=XID set next transaction ID\n" msgstr " -x, --next-transaction-id=XID задать ID Ñледующей транзакции\n" -#: pg_resetwal.c:1151 +#: pg_resetwal.c:1191 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr "" " --wal-segsize=РÐЗМЕР размер Ñегментов WAL (в мегабайтах)\n" -#: pg_resetwal.c:1152 -#, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help показать Ñту Ñправку и выйти\n" - -#: pg_resetwal.c:1153 +#: pg_resetwal.c:1193 #, c-format msgid "" "\n" @@ -712,11 +808,38 @@ msgstr "" "\n" "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: pg_resetwal.c:1154 +#: pg_resetwal.c:1194 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" +#, c-format +#~ msgid "argument of --wal-segsize must be a number" +#~ msgstr "аргументом --wal-segsize должно быть чиÑло" + +#, c-format +#~ msgid "" +#~ "The database server was not shut down cleanly.\n" +#~ "Resetting the write-ahead log might cause data to be lost.\n" +#~ "If you want to proceed anyway, use -f to force reset.\n" +#~ msgstr "" +#~ "Сервер баз данных был оÑтановлен некорректно.\n" +#~ "Ð¡Ð±Ñ€Ð¾Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° предзапиÑи может привеÑти к потере данных.\n" +#~ "ЕÑли вы хотите ÑброÑить его, неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° Ñто, добавьте ключ -f.\n" + +#, c-format +#~ msgid " -f, --force force update to be done\n" +#~ msgstr "" +#~ " -f, --force принудительное выполнение операции\n" + +#, c-format +#~ msgid "could not load library \"%s\": error code %lu" +#~ msgstr "не удалоÑÑŒ загрузить библиотеку \"%s\" (код ошибки: %lu)" + +#, c-format +#~ msgid "cannot create restricted tokens on this platform: error code %lu" +#~ msgstr "в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры (код ошибки: %lu)" + #~ msgid "fatal: " #~ msgstr "важно: " diff --git a/src/bin/pg_resetwal/po/sv.po b/src/bin/pg_resetwal/po/sv.po index 0cdd2f2c44aaf..71529e5ebf276 100644 --- a/src/bin/pg_resetwal/po/sv.po +++ b/src/bin/pg_resetwal/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for resetxlog. -# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. +# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # Peter Eisentraut , 2010. # Mats Erik Andersson , 2014. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-11 19:48+0000\n" -"PO-Revision-Date: 2022-04-11 22:01+0200\n" +"POT-Creation-Date: 2024-07-12 17:51+0000\n" +"PO-Revision-Date: 2024-07-12 23:47+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,224 +17,318 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:280 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "varning: " -#: ../../../src/common/logging.c:291 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "detalj: " -#: ../../../src/common/logging.c:298 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "tips: " -#: ../../common/restricted_token.c:64 +#: ../../common/controldata_utils.c:97 pg_resetwal.c:370 pg_resetwal.c:525 +#: pg_resetwal.c:573 #, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "kunde inte ladda länkbibliotek \"%s\": felkod %lu" +msgid "could not open file \"%s\" for reading: %m" +msgstr "kunde inte öppna filen \"%s\" för läsning: %m" + +#: ../../common/controldata_utils.c:110 pg_resetwal.c:534 pg_resetwal.c:588 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "kunde inte läsa fil \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "kunde inte stänga fil \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "byte-ordning stämmer inte" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"möjligt fel i byteordning\n" +"Den byteordning som filen frÃ¥n pg_control lagrats med passar kanske\n" +"inte detta program. I sÃ¥ fall kan nedanstÃ¥ende resultat vara felaktiga\n" +"och PostgreSQL-installationen vara inkompatibel med databaskatalogen." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_resetwal.c:1134 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "kunde inte öppna fil \"%s\": %m" + +#: ../../common/controldata_utils.c:249 pg_resetwal.c:1142 pg_resetwal.c:1154 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "kunde inte skriva fil \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "kunde inte fsync:a fil \"%s\": %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "slut pÃ¥ minne\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kan inte duplicera null-pekare (internt fel)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "detta bygge stöder inte synkmetod \"%s\"" -#: ../../common/restricted_token.c:73 +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_resetwal.c:928 pg_resetwal.c:981 pg_resetwal.c:1016 pg_resetwal.c:1054 #, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "kan inte skapa token för begränsad Ã¥tkomst pÃ¥ denna plattorm: felkod %lu" +msgid "could not open directory \"%s\": %m" +msgstr "kunde inte öppna katalog \"%s\": %m" -#: ../../common/restricted_token.c:82 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 pg_resetwal.c:1068 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "kunde inte läsa katalog \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" + +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "kunde inte öppna process-token: felkod %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "kunde inte allokera SID: felkod %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "kunde inte skapa token för begränsad Ã¥tkomst: felkod %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "kunde inte starta process för kommando \"%s\": felkod %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "kunde inte köra igen med token för begränsad Ã¥tkomst: felkod %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "kunde inte hämta statuskod för underprocess: felkod %lu" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s mÃ¥ste vara i intervallet %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "okänd synkmetod: %s" + #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202 -#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249 -#: pg_resetwal.c:269 pg_resetwal.c:280 +#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 +#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 +#: pg_resetwal.c:270 pg_resetwal.c:281 #, c-format msgid "invalid argument for option %s" msgstr "ogiltigt argument för flaggan %s" -#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 -#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 -#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316 -#: pg_resetwal.c:323 +#: pg_resetwal.c:165 pg_resetwal.c:178 pg_resetwal.c:191 pg_resetwal.c:204 +#: pg_resetwal.c:211 pg_resetwal.c:230 pg_resetwal.c:243 pg_resetwal.c:251 +#: pg_resetwal.c:271 pg_resetwal.c:282 pg_resetwal.c:307 pg_resetwal.c:320 +#: pg_resetwal.c:327 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: pg_resetwal.c:168 +#: pg_resetwal.c:169 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "Epoch (-e) för transaktions-ID fÃ¥r inte vara -1." -#: pg_resetwal.c:181 +#: pg_resetwal.c:182 #, c-format msgid "oldest transaction ID (-u) must be greater than or equal to %u" msgstr "äldsta transaktions-ID (-u) mÃ¥ste vara större än eller lika med %u" -#: pg_resetwal.c:194 +#: pg_resetwal.c:195 #, c-format msgid "transaction ID (-x) must be greater than or equal to %u" msgstr "transaktions-ID (-x) mÃ¥ste vara större än eller lika med %u" -#: pg_resetwal.c:216 pg_resetwal.c:220 +#: pg_resetwal.c:217 pg_resetwal.c:221 #, c-format -msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" -msgstr "transaktions-ID (-c) mÃ¥ste antingen vara 0 eller större än eller lika med 2" +msgid "transaction ID (-c) must be either %u or greater than or equal to %u" +msgstr "transaktions-ID (-c) mÃ¥ste antingen vara %u eller större än eller lika med %u" -#: pg_resetwal.c:233 +#: pg_resetwal.c:234 #, c-format msgid "OID (-o) must not be 0" msgstr "OID (-o) fÃ¥r inte vara 0." -#: pg_resetwal.c:254 +#: pg_resetwal.c:255 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "Multitransaktions-ID (-m) fÃ¥r inte vara 0." -#: pg_resetwal.c:261 +#: pg_resetwal.c:262 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "Äldsta multitransaktions-ID (-m) fÃ¥r inte vara 0." -#: pg_resetwal.c:274 +#: pg_resetwal.c:275 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "Multitransaktionsoffset (-O) fÃ¥r inte vara -1." -#: pg_resetwal.c:296 +#: pg_resetwal.c:301 #, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "argumentet till --wal-segsize mÃ¥ste vara ett tal" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "argumentet till %s mÃ¥ste vara en tvÃ¥potens mellan 1 och 1024" -#: pg_resetwal.c:298 -#, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "argumentet till --wal-segsize mÃ¥ste vara en tvÃ¥potens mellan 1 och 1024" - -#: pg_resetwal.c:314 +#: pg_resetwal.c:318 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")" -#: pg_resetwal.c:322 +#: pg_resetwal.c:326 #, c-format msgid "no data directory specified" msgstr "ingen datakatalog angiven" -#: pg_resetwal.c:336 +#: pg_resetwal.c:340 #, c-format msgid "cannot be executed by \"root\"" msgstr "kan inte köras av \"root\"" -#: pg_resetwal.c:337 +#: pg_resetwal.c:341 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Du mÃ¥ste köra %s som PostgreSQL:s superuser." -#: pg_resetwal.c:347 +#: pg_resetwal.c:351 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "kunde inte läsa rättigheter pÃ¥ katalog \"%s\": %m" -#: pg_resetwal.c:353 +#: pg_resetwal.c:357 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "kunde inte byta katalog till \"%s\": %m" -#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "kunde inte öppna filen \"%s\" för läsning: %m" - -#: pg_resetwal.c:371 +#: pg_resetwal.c:375 #, c-format msgid "lock file \"%s\" exists" msgstr "lÃ¥sfil med namn \"%s\" finns redan" -#: pg_resetwal.c:372 +#: pg_resetwal.c:376 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "Kör servern redan? Om inte, radera lÃ¥sfilen och försök igen." -#: pg_resetwal.c:467 +#: pg_resetwal.c:475 #, c-format -msgid "" -"\n" -"If these values seem acceptable, use -f to force reset.\n" -msgstr "" -"\n" -"Om dessa värden verkar godtagbara, använd dÃ¥ -f för att\n" -"framtvinga Ã¥terställning.\n" +msgid "not proceeding because control file values were guessed" +msgstr "fortsätter inte eftersom kontrollfilens värden har gissats" -#: pg_resetwal.c:479 +#: pg_resetwal.c:476 #, c-format -msgid "" -"The database server was not shut down cleanly.\n" -"Resetting the write-ahead log might cause data to be lost.\n" -"If you want to proceed anyway, use -f to force reset.\n" -msgstr "" -"Databasservern stängdes inte av ordentligt. Att Ã¥terställa\n" -"write-ahead-loggen kan medföra att data förloras. Om du ändÃ¥\n" -"vill fortsätta, använd -f för att framtvinga Ã¥terställning.\n" +msgid "If these values seem acceptable, use -f to force reset." +msgstr "Om dessa värden verkar godtagbara, använd dÃ¥ -f för att framtvinga Ã¥terställning." + +#: pg_resetwal.c:485 +#, c-format +msgid "database server was not shut down cleanly" +msgstr "databasservern stÃ¥ngdes inte ner utan fel" + +#: pg_resetwal.c:486 +#, c-format +msgid "Resetting the write-ahead log might cause data to be lost." +msgstr "Nollställa write-ahead-loggen kan göra att data förloras." + +#: pg_resetwal.c:487 +#, c-format +msgid "If you want to proceed anyway, use -f to force reset." +msgstr "Om du vill fortsätta ändÃ¥, använd -f för att framtvinga Ã¥terställning." -#: pg_resetwal.c:493 +#: pg_resetwal.c:500 #, c-format msgid "Write-ahead log reset\n" msgstr "Ã…terställning av write-ahead-log\n" -#: pg_resetwal.c:525 +#: pg_resetwal.c:532 #, c-format msgid "unexpected empty file \"%s\"" msgstr "oväntad tom fil \"%s\"" -#: pg_resetwal.c:527 pg_resetwal.c:581 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "kunde inte läsa fil \"%s\": %m" - -#: pg_resetwal.c:535 +#: pg_resetwal.c:542 #, c-format msgid "data directory is of wrong version" msgstr "datakatalogen har fel version" -#: pg_resetwal.c:536 +#: pg_resetwal.c:543 #, c-format msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." msgstr "Filen \"%s\" innehÃ¥ller \"%s\", vilket inte är kompatibelt med detta programmets version \"%s\"." -#: pg_resetwal.c:569 +#: pg_resetwal.c:576 #, c-format msgid "" "If you are sure the data directory path is correct, execute\n" @@ -244,24 +338,24 @@ msgstr "" "Om du är säker pÃ¥ att sökvägen till datakatalogen är riktig,\n" "utför dÃ¥ \"touch %s\" och försök sedan igen." -#: pg_resetwal.c:597 +#: pg_resetwal.c:604 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "pg_control existerar men har ogiltig CRC. Fortsätt med varsamhet." -#: pg_resetwal.c:606 +#: pg_resetwal.c:613 #, c-format msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" msgstr[0] "pg_control anger ogiltig WAL-segmentstorlek (%d byte); fortsätt med varsamhet." msgstr[1] "pg_control anger ogiltig WAL-segmentstorlek (%d byte); fortsätt med varsamhet." -#: pg_resetwal.c:617 +#: pg_resetwal.c:624 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "pg_control existerar men är trasig eller har fel version. Den ignoreras." -#: pg_resetwal.c:712 +#: pg_resetwal.c:719 #, c-format msgid "" "Guessed pg_control values:\n" @@ -270,7 +364,7 @@ msgstr "" "Gissade värden för pg_control:\n" "\n" -#: pg_resetwal.c:714 +#: pg_resetwal.c:721 #, c-format msgid "" "Current pg_control values:\n" @@ -282,168 +376,168 @@ msgstr "" # November 26th, 2014: Insert six additional space characters # for best alignment with Swedish translation. # Translations should be checked against those of pg_controldata. -#: pg_resetwal.c:716 +#: pg_resetwal.c:723 #, c-format msgid "pg_control version number: %u\n" msgstr "Versionsnummer för pg_control: %u\n" -#: pg_resetwal.c:718 +#: pg_resetwal.c:725 #, c-format msgid "Catalog version number: %u\n" msgstr "Katalogversion: %u\n" -#: pg_resetwal.c:720 +#: pg_resetwal.c:727 #, c-format msgid "Database system identifier: %llu\n" msgstr "Databasens systemidentifierare: %llu\n" -#: pg_resetwal.c:722 +#: pg_resetwal.c:729 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "TimeLineID vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:724 +#: pg_resetwal.c:731 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "Senaste kontrollpunktens full_page_writes: %s\n" -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "off" msgstr "av" -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "on" msgstr "pÃ¥" -#: pg_resetwal.c:726 +#: pg_resetwal.c:733 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "NextXID vid senaste kontrollpunkt: %u:%u\n" -#: pg_resetwal.c:729 +#: pg_resetwal.c:736 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "NextOID vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:731 +#: pg_resetwal.c:738 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "NextMultiXactId vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:733 +#: pg_resetwal.c:740 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "NextMultiOffset vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:735 +#: pg_resetwal.c:742 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "oldestXID vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:737 +#: pg_resetwal.c:744 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "DB för oldestXID vid senaste kontrollpunkt: %u\n" # FIXME: too wide -#: pg_resetwal.c:739 +#: pg_resetwal.c:746 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "oldestActiveXID vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:741 +#: pg_resetwal.c:748 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "oldestMultiXid vid senaste kontrollpunkt: %u\n" -#: pg_resetwal.c:743 +#: pg_resetwal.c:750 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "DB för oldestMulti vid senaste kontrollpkt: %u\n" -#: pg_resetwal.c:745 +#: pg_resetwal.c:752 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "oldestCommitTsXid vid senaste kontrollpunkt:%u\n" -#: pg_resetwal.c:747 +#: pg_resetwal.c:754 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "newestCommitTsXid vid senaste kontrollpunkt:%u\n" -#: pg_resetwal.c:749 +#: pg_resetwal.c:756 #, c-format msgid "Maximum data alignment: %u\n" msgstr "Maximal jämkning av data (alignment): %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:759 #, c-format msgid "Database block size: %u\n" msgstr "Databasens blockstorlek: %u\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:761 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Block per segment i en stor relation: %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:763 #, c-format msgid "WAL block size: %u\n" msgstr "Blockstorlek i transaktionsloggen: %u\n" -#: pg_resetwal.c:758 pg_resetwal.c:844 +#: pg_resetwal.c:765 pg_resetwal.c:851 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Segmentstorlek i transaktionsloggen: %u\n" -#: pg_resetwal.c:760 +#: pg_resetwal.c:767 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "Maximal längd för identifierare: %u\n" -#: pg_resetwal.c:762 +#: pg_resetwal.c:769 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "Maximalt antal kolonner i ett index: %u\n" -#: pg_resetwal.c:764 +#: pg_resetwal.c:771 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "Maximal storlek för en TOAST-enhet: %u\n" -#: pg_resetwal.c:766 +#: pg_resetwal.c:773 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Storlek för large-object-enheter: %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:776 #, c-format msgid "Date/time type storage: %s\n" msgstr "Representation av dag och tid: %s\n" -#: pg_resetwal.c:770 +#: pg_resetwal.c:777 msgid "64-bit integers" msgstr "64-bitars heltal" -#: pg_resetwal.c:771 +#: pg_resetwal.c:778 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Ã…tkomst till float8-argument: %s\n" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by reference" msgstr "referens" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by value" msgstr "värdeÃ¥tkomst" -#: pg_resetwal.c:773 +#: pg_resetwal.c:780 #, c-format msgid "Data page checksum version: %u\n" msgstr "Checksummaversion för datasidor: %u\n" -#: pg_resetwal.c:787 +#: pg_resetwal.c:794 #, c-format msgid "" "\n" @@ -458,102 +552,82 @@ msgstr "" # November 26th, 2014: Insert additional spacing to fit # with the first translated text, which uses most characters. -#: pg_resetwal.c:791 +#: pg_resetwal.c:798 #, c-format msgid "First log segment after reset: %s\n" msgstr "Första loggsegment efter Ã¥terställning: %s\n" -#: pg_resetwal.c:795 +#: pg_resetwal.c:802 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:797 +#: pg_resetwal.c:804 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:799 +#: pg_resetwal.c:806 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "DB för OldestMulti: %u\n" -#: pg_resetwal.c:805 +#: pg_resetwal.c:812 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:811 +#: pg_resetwal.c:818 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:817 +#: pg_resetwal.c:824 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:826 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:821 +#: pg_resetwal.c:828 #, c-format msgid "OldestXID's DB: %u\n" msgstr "DB för OldestXID: %u\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:834 #, c-format msgid "NextXID epoch: %u\n" msgstr "Epoch för NextXID: %u\n" -#: pg_resetwal.c:833 +#: pg_resetwal.c:840 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:838 +#: pg_resetwal.c:845 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "kunde inte öppna katalog \"%s\": %m" - -#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "kunde inte läsa katalog \"%s\": %m" - -#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 +#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 pg_resetwal.c:1071 #, c-format msgid "could not close directory \"%s\": %m" msgstr "kunde inte stänga katalog \"%s\": %m" -#: pg_resetwal.c:990 pg_resetwal.c:1028 +#: pg_resetwal.c:990 pg_resetwal.c:1028 pg_resetwal.c:1063 #, c-format msgid "could not delete file \"%s\": %m" msgstr "kunde inte radera fil \"%s\": %m" -#: pg_resetwal.c:1100 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "kunde inte öppna fil \"%s\": %m" - -#: pg_resetwal.c:1108 pg_resetwal.c:1120 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "kunde inte skriva fil \"%s\": %m" - -#: pg_resetwal.c:1125 +#: pg_resetwal.c:1159 #, c-format msgid "fsync error: %m" msgstr "misslyckad fsync: %m" -#: pg_resetwal.c:1134 +#: pg_resetwal.c:1168 #, c-format msgid "" "%s resets the PostgreSQL write-ahead log.\n" @@ -562,23 +636,62 @@ msgstr "" "%s Ã¥terställer write-ahead-log för PostgreSQL.\n" "\n" -#: pg_resetwal.c:1135 +#: pg_resetwal.c:1169 +#, c-format +msgid "Usage:\n" +msgstr "Användning:\n" + +#: pg_resetwal.c:1170 +#, c-format +msgid " %s [OPTION]... DATADIR\n" +msgstr " %s [FLAGGA]... DATAKATALOG\n" + +#: pg_resetwal.c:1172 #, c-format msgid "" -"Usage:\n" -" %s [OPTION]... DATADIR\n" "\n" +"Options:\n" msgstr "" -"Användning:\n" -" %s [FLAGGA]... DATAKATALOG\n" "\n" +"Flaggor:\n" -#: pg_resetwal.c:1136 +#: pg_resetwal.c:1173 #, c-format -msgid "Options:\n" -msgstr "Flaggor:\n" +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]DATADIR datakatalog\n" -#: pg_resetwal.c:1137 +#: pg_resetwal.c:1174 +#, c-format +msgid "" +" -f, --force force update to be done even after unclean shutdown or\n" +" if pg_control values had to be guessed\n" +msgstr "" +" -f, --force tvinga uppdatering även om servern inte stängts ner\n" +" korrekt eller om värden i pg_control har gissats\n" + +#: pg_resetwal.c:1176 +#, c-format +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr " -n, --dry-run ingen updatering; visa bara planerade Ã¥tgärder\n" + +#: pg_resetwal.c:1177 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version visa versionsinformation, avsluta sedan\n" + +#: pg_resetwal.c:1178 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help visa den här hjälpen, avsluta sedan\n" + +#: pg_resetwal.c:1180 +#, c-format +msgid "" +"\n" +"Options to override control file values:\n" +msgstr "\nFlaggor som övertrumfar värden i kontrollfilen:\n" + +#: pg_resetwal.c:1181 #, c-format msgid "" " -c, --commit-timestamp-ids=XID,XID\n" @@ -590,72 +703,47 @@ msgstr "" " kan ha commit-tidstämpel (noll betyder\n" " ingen ändring)\n" -#: pg_resetwal.c:1140 -#, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]DATADIR datakatalog\n" - -#: pg_resetwal.c:1141 +#: pg_resetwal.c:1184 #, c-format msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" msgstr " -e, --epoch=XIDEPOCH sätter epoch för nästa transaktions-ID\n" -#: pg_resetwal.c:1142 -#, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force framtvinga uppdatering\n" - -#: pg_resetwal.c:1143 +#: pg_resetwal.c:1185 #, c-format msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" msgstr " -l, --next-wal-file=WALFIL sätt minsta startposition för ny WAL\n" -#: pg_resetwal.c:1144 +#: pg_resetwal.c:1186 #, c-format msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" msgstr " -m, --multixact-ids=MXID,MXID sätt nästa och äldsta multitransaktions-ID\n" -#: pg_resetwal.c:1145 -#, c-format -msgid " -n, --dry-run no update, just show what would be done\n" -msgstr " -n, --dry-run ingen updatering; visa bara planerade Ã¥tgärder\n" - -#: pg_resetwal.c:1146 +#: pg_resetwal.c:1187 #, c-format msgid " -o, --next-oid=OID set next OID\n" msgstr " -o, --next-oid=OID sätt nästa OID\n" -#: pg_resetwal.c:1147 +#: pg_resetwal.c:1188 #, c-format msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" msgstr " -O, --multixact-offset=OFFSET sätt nästa multitransaktionsoffset\n" -#: pg_resetwal.c:1148 +#: pg_resetwal.c:1189 #, c-format msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" msgstr " -u, --oldest-transaction-id=XID sätt äldsta transaktions-ID\n" -#: pg_resetwal.c:1149 -#, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version visa versionsinformation, avsluta sedan\n" - -#: pg_resetwal.c:1150 +#: pg_resetwal.c:1190 #, c-format msgid " -x, --next-transaction-id=XID set next transaction ID\n" msgstr " -x, --next-transaction-id=XID sätt nästa transaktions-ID\n" -#: pg_resetwal.c:1151 +#: pg_resetwal.c:1191 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=STORLEK storlek pÃ¥ WAL-segment i megabyte\n" -#: pg_resetwal.c:1152 -#, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help visa denna hjälp, avsluta sedan\n" - -#: pg_resetwal.c:1153 +#: pg_resetwal.c:1193 #, c-format msgid "" "\n" @@ -664,7 +752,7 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_resetwal.c:1154 +#: pg_resetwal.c:1194 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" diff --git a/src/bin/pg_resetwal/po/uk.po b/src/bin/pg_resetwal/po/uk.po index be458735c242f..0b18f98387d88 100644 --- a/src/bin/pg_resetwal/po/uk.po +++ b/src/bin/pg_resetwal/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:49+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:21+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pg_resetwal.pot\n" -"X-Crowdin-File-ID: 880\n" +"X-Crowdin-File: /REL_17_STABLE/pg_resetwal.pot\n" +"X-Crowdin-File-ID: 1010\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,199 +37,294 @@ msgstr "деталі: " msgid "hint: " msgstr "підказка: " -#: ../../common/restricted_token.c:64 +#: ../../common/controldata_utils.c:97 pg_resetwal.c:370 pg_resetwal.c:525 +#: pg_resetwal.c:573 #, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ бібліотеку \"%s\": код помилки %lu" +msgid "could not open file \"%s\" for reading: %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m" + +#: ../../common/controldata_utils.c:110 pg_resetwal.c:534 pg_resetwal.c:588 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "неможливо закрити файл \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неправильний порÑдок байтів" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "можлива помилка у поÑлідовноÑті байтів.\n" +"ПорÑдок байтів, що викориÑтовують Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ pg_control, може не відповідати тому, Ñкий викориÑтовуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ програмою. У такому випадку результати нижче будуть неправильним, Ñ– інÑталÑÑ†Ñ–Ñ PostgreSQL буде неÑуміÑною з цим каталогом даних." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 pg_resetwal.c:1134 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не можливо відкрити файл \"%s\": %m" -#: ../../common/restricted_token.c:73 +#: ../../common/controldata_utils.c:249 pg_resetwal.c:1142 pg_resetwal.c:1154 #, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "не вдалоÑÑ Ñтворити обмежені токени на цій платформі: код помилки %lu" +msgid "could not write file \"%s\": %m" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m" -#: ../../common/restricted_token.c:82 +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не вдалоÑÑ fsync файл \"%s\": %m" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "недоÑтатньо пам'Ñті\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не вдалоÑÑ Ñинхронізувати файлову ÑиÑтему Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує метод Ñинхронізації \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_resetwal.c:928 pg_resetwal.c:981 pg_resetwal.c:1016 pg_resetwal.c:1054 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 pg_resetwal.c:1068 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" + +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ токен процеÑу: код помилки %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ SID: код помилки %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "не вдалоÑÑ Ñтворити обмежений токен: код помилки %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ \"%s\": код помилки %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑтити з обмеженим токеном: код помилки %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑу: код помилки %lu" +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s має бути в діапазоні %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нерозпізнаний метод Ñинхронізації: %s" + #. translator: the second %s is a command line argument (-e, etc) -#: pg_resetwal.c:163 pg_resetwal.c:176 pg_resetwal.c:189 pg_resetwal.c:202 -#: pg_resetwal.c:209 pg_resetwal.c:228 pg_resetwal.c:241 pg_resetwal.c:249 -#: pg_resetwal.c:269 pg_resetwal.c:280 +#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 +#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 +#: pg_resetwal.c:270 pg_resetwal.c:281 #, c-format msgid "invalid argument for option %s" msgstr "неприпуÑтимий аргумент Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ %s" -#: pg_resetwal.c:164 pg_resetwal.c:177 pg_resetwal.c:190 pg_resetwal.c:203 -#: pg_resetwal.c:210 pg_resetwal.c:229 pg_resetwal.c:242 pg_resetwal.c:250 -#: pg_resetwal.c:270 pg_resetwal.c:281 pg_resetwal.c:303 pg_resetwal.c:316 -#: pg_resetwal.c:323 +#: pg_resetwal.c:165 pg_resetwal.c:178 pg_resetwal.c:191 pg_resetwal.c:204 +#: pg_resetwal.c:211 pg_resetwal.c:230 pg_resetwal.c:243 pg_resetwal.c:251 +#: pg_resetwal.c:271 pg_resetwal.c:282 pg_resetwal.c:307 pg_resetwal.c:320 +#: pg_resetwal.c:327 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." -#: pg_resetwal.c:168 +#: pg_resetwal.c:169 #, c-format msgid "transaction ID epoch (-e) must not be -1" msgstr "епоха ID транзакції (-e) не повинна бути -1" -#: pg_resetwal.c:181 +#: pg_resetwal.c:182 #, c-format msgid "oldest transaction ID (-u) must be greater than or equal to %u" msgstr "найÑтаріший ID транзакції (-u) має бути більший або рівним %u" -#: pg_resetwal.c:194 +#: pg_resetwal.c:195 #, c-format msgid "transaction ID (-x) must be greater than or equal to %u" msgstr "ID транзакції (-x) має бути більшим чи рівним %u" -#: pg_resetwal.c:216 pg_resetwal.c:220 +#: pg_resetwal.c:217 pg_resetwal.c:221 #, c-format -msgid "transaction ID (-c) must be either 0 or greater than or equal to 2" -msgstr "ID транзакції (-c) повинен дорівнювати 0, бути більшим за або дорівнювати 2" +msgid "transaction ID (-c) must be either %u or greater than or equal to %u" +msgstr "ідентифікатор транзакції (-c) має бути або %u, або більше чи дорівнювати %u" -#: pg_resetwal.c:233 +#: pg_resetwal.c:234 #, c-format msgid "OID (-o) must not be 0" msgstr "OID (-o) не може бути 0" -#: pg_resetwal.c:254 +#: pg_resetwal.c:255 #, c-format msgid "multitransaction ID (-m) must not be 0" msgstr "ID мультитранзакції (-m) не повинен бути 0" -#: pg_resetwal.c:261 +#: pg_resetwal.c:262 #, c-format msgid "oldest multitransaction ID (-m) must not be 0" msgstr "найÑтарший ID мультитранзакції (-m) не повинен бути 0" -#: pg_resetwal.c:274 +#: pg_resetwal.c:275 #, c-format msgid "multitransaction offset (-O) must not be -1" msgstr "зÑув мультитранзакції (-O) не повинен бути -1" -#: pg_resetwal.c:296 +#: pg_resetwal.c:301 #, c-format -msgid "argument of --wal-segsize must be a number" -msgstr "аргумент --wal-segsize повинен бути чиÑлом" +msgid "argument of %s must be a power of two between 1 and 1024" +msgstr "аргумент %s має бути Ñтупенем двійки в діапазоні від 1 до 1024" -#: pg_resetwal.c:298 -#, c-format -msgid "argument of --wal-segsize must be a power of 2 between 1 and 1024" -msgstr "аргумент --wal-segsize повинен бути Ñтупенем 2 між 1 Ñ– 1024" - -#: pg_resetwal.c:314 +#: pg_resetwal.c:318 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")" -#: pg_resetwal.c:322 +#: pg_resetwal.c:326 #, c-format msgid "no data directory specified" msgstr "каталог даних не вказано" -#: pg_resetwal.c:336 +#: pg_resetwal.c:340 #, c-format msgid "cannot be executed by \"root\"" msgstr "\"root\" не може це виконувати" -#: pg_resetwal.c:337 +#: pg_resetwal.c:341 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "ЗапуÑкати %s треба від ÑуперкориÑтувача PostgreSQL." -#: pg_resetwal.c:347 +#: pg_resetwal.c:351 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ дозволи на каталог \"%s\": %m" -#: pg_resetwal.c:353 +#: pg_resetwal.c:357 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ каталог на \"%s\": %m" -#: pg_resetwal.c:366 pg_resetwal.c:518 pg_resetwal.c:566 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m" - -#: pg_resetwal.c:371 +#: pg_resetwal.c:375 #, c-format msgid "lock file \"%s\" exists" msgstr "файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" вже Ñ–Ñнує" -#: pg_resetwal.c:372 +#: pg_resetwal.c:376 #, c-format msgid "Is a server running? If not, delete the lock file and try again." msgstr "Чи запущений Ñервер? Якщо ні, видаліть файл Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ñ– Ñпробуйте знову." -#: pg_resetwal.c:467 +#: pg_resetwal.c:475 #, c-format -msgid "\n" -"If these values seem acceptable, use -f to force reset.\n" -msgstr "\n" -"Якщо ці Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ð³Ð»Ñдають допуÑтимими, викориÑтайте -f, щоб провеÑти перевÑтановленнÑ.\n" +msgid "not proceeding because control file values were guessed" +msgstr "не виконуєтьÑÑ, оÑкільки Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð³Ð¾ файлу були вгадані" -#: pg_resetwal.c:479 +#: pg_resetwal.c:476 #, c-format -msgid "The database server was not shut down cleanly.\n" -"Resetting the write-ahead log might cause data to be lost.\n" -"If you want to proceed anyway, use -f to force reset.\n" -msgstr "Сервер баз даних був зупинений некоректно.\n" -"ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ передзапиÑу може привеÑти до втрати даних.\n" -"Якщо ви вÑе одно хочете продовжити, викориÑтайте параметр -f.\n" +msgid "If these values seem acceptable, use -f to force reset." +msgstr "Якщо ці Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð´Ð°ÑŽÑ‚ÑŒÑÑ Ð¿Ñ€Ð¸Ð¹Ð½Ñтними, викориÑтовуйте -f Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÑƒÑового ÑкиданнÑ." -#: pg_resetwal.c:493 +#: pg_resetwal.c:485 +#, c-format +msgid "database server was not shut down cleanly" +msgstr "Ñервер бази даних завершив роботу некоректно" + +#: pg_resetwal.c:486 +#, c-format +msgid "Resetting the write-ahead log might cause data to be lost." +msgstr "Ð¡ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ñƒ попереднього запиÑу може призвеÑти до втрати даних." + +#: pg_resetwal.c:487 +#, c-format +msgid "If you want to proceed anyway, use -f to force reset." +msgstr "Якщо ви вÑе одно хочете продовжити, викориÑтовуйте -f Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÑƒÑового ÑкиданнÑ." + +#: pg_resetwal.c:500 #, c-format msgid "Write-ahead log reset\n" msgstr "Журнал передзапиÑу Ñкинуто\n" -#: pg_resetwal.c:525 +#: pg_resetwal.c:532 #, c-format msgid "unexpected empty file \"%s\"" msgstr "неочікуваний порожній файл \"%s\"" -#: pg_resetwal.c:527 pg_resetwal.c:581 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" - -#: pg_resetwal.c:535 +#: pg_resetwal.c:542 #, c-format msgid "data directory is of wrong version" msgstr "каталог даних неправильної верÑÑ–Ñ—" -#: pg_resetwal.c:536 +#: pg_resetwal.c:543 #, c-format msgid "File \"%s\" contains \"%s\", which is not compatible with this program's version \"%s\"." msgstr "Файл \"%s\" міÑтить \"%s\", Ñкий не ÑуміÑний з верÑією цієї програми \"%s\"." -#: pg_resetwal.c:569 +#: pg_resetwal.c:576 #, c-format msgid "If you are sure the data directory path is correct, execute\n" " touch %s\n" @@ -238,12 +333,12 @@ msgstr "Якщо Ви впевнені, що шлÑÑ… каталогу дани " touch %s\n" "Ñ– Ñпробуйте знову." -#: pg_resetwal.c:597 +#: pg_resetwal.c:604 #, c-format msgid "pg_control exists but has invalid CRC; proceed with caution" msgstr "pg_control Ñ–Ñнує, але має недопуÑтимий CRC; продовжуйте з обережніÑтю" -#: pg_resetwal.c:606 +#: pg_resetwal.c:613 #, c-format msgid "pg_control specifies invalid WAL segment size (%d byte); proceed with caution" msgid_plural "pg_control specifies invalid WAL segment size (%d bytes); proceed with caution" @@ -252,301 +347,320 @@ msgstr[1] "pg_control вказує неприпуÑтимий розмір Ñе msgstr[2] "pg_control вказує неприпуÑтимий розмір Ñегмента WAL (%d байтів); продовжуйте з обережніÑтю" msgstr[3] "pg_control вказує неприпуÑтимий розмір Ñегмента WAL (%d байтів); продовжуйте з обережніÑтю" -#: pg_resetwal.c:617 +#: pg_resetwal.c:624 #, c-format msgid "pg_control exists but is broken or wrong version; ignoring it" msgstr "pg_control Ñ–Ñнує, але зламаний або неправильної верÑÑ–Ñ—; ігноруєтьÑÑ" -#: pg_resetwal.c:712 +#: pg_resetwal.c:719 #, c-format msgid "Guessed pg_control values:\n\n" msgstr "ПрипуÑтимі Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ pg_control:\n\n" -#: pg_resetwal.c:714 +#: pg_resetwal.c:721 #, c-format msgid "Current pg_control values:\n\n" msgstr "Поточні Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ pg_control:\n\n" -#: pg_resetwal.c:716 +#: pg_resetwal.c:723 #, c-format msgid "pg_control version number: %u\n" msgstr "pg_control номер верÑÑ–Ñ—: %u\n" -#: pg_resetwal.c:718 +#: pg_resetwal.c:725 #, c-format msgid "Catalog version number: %u\n" msgstr "Ðомер верÑÑ–Ñ— каталогу: %u\n" -#: pg_resetwal.c:720 +#: pg_resetwal.c:727 #, c-format msgid "Database system identifier: %llu\n" msgstr "СиÑтемний ідентифікатор бази даних: %llu\n" -#: pg_resetwal.c:722 +#: pg_resetwal.c:729 #, c-format msgid "Latest checkpoint's TimeLineID: %u\n" msgstr "ОÑтанній TimeLineID контрольної точки: %u\n" -#: pg_resetwal.c:724 +#: pg_resetwal.c:731 #, c-format msgid "Latest checkpoint's full_page_writes: %s\n" msgstr "ОÑтанній full_page_writes контрольної точки: %s\n" -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "off" msgstr "вимк" -#: pg_resetwal.c:725 +#: pg_resetwal.c:732 msgid "on" msgstr "увімк" -#: pg_resetwal.c:726 +#: pg_resetwal.c:733 #, c-format msgid "Latest checkpoint's NextXID: %u:%u\n" msgstr "ОÑтанній NextXID контрольної точки: %u%u\n" -#: pg_resetwal.c:729 +#: pg_resetwal.c:736 #, c-format msgid "Latest checkpoint's NextOID: %u\n" msgstr "ОÑтанній NextOID контрольної точки: %u\n" -#: pg_resetwal.c:731 +#: pg_resetwal.c:738 #, c-format msgid "Latest checkpoint's NextMultiXactId: %u\n" msgstr "ОÑтанній NextMultiXactId контрольної точки: %u\n" -#: pg_resetwal.c:733 +#: pg_resetwal.c:740 #, c-format msgid "Latest checkpoint's NextMultiOffset: %u\n" msgstr "ОÑтанній NextMultiOffset контрольної точки: %u\n" -#: pg_resetwal.c:735 +#: pg_resetwal.c:742 #, c-format msgid "Latest checkpoint's oldestXID: %u\n" msgstr "ОÑтанній oldestXID контрольної точки: %u\n" -#: pg_resetwal.c:737 +#: pg_resetwal.c:744 #, c-format msgid "Latest checkpoint's oldestXID's DB: %u\n" msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ DB оÑтаннього oldestXID контрольної точки: %u\n" -#: pg_resetwal.c:739 +#: pg_resetwal.c:746 #, c-format msgid "Latest checkpoint's oldestActiveXID: %u\n" msgstr "ОÑтанній oldestActiveXID контрольної точки: %u\n" -#: pg_resetwal.c:741 +#: pg_resetwal.c:748 #, c-format msgid "Latest checkpoint's oldestMultiXid: %u\n" msgstr "ОÑтанній oldestMultiXid контрольної точки: %u \n" -#: pg_resetwal.c:743 +#: pg_resetwal.c:750 #, c-format msgid "Latest checkpoint's oldestMulti's DB: %u\n" msgstr "ОÑÑ‚Ð°Ð½Ð½Ñ DB оÑтанньої oldestMulti контрольної точки: %u\n" -#: pg_resetwal.c:745 +#: pg_resetwal.c:752 #, c-format msgid "Latest checkpoint's oldestCommitTsXid:%u\n" msgstr "ОÑтанній oldestCommitTsXid контрольної точки:%u\n" -#: pg_resetwal.c:747 +#: pg_resetwal.c:754 #, c-format msgid "Latest checkpoint's newestCommitTsXid:%u\n" msgstr "ОÑтанній newestCommitTsXid контрольної точки: %u\n" -#: pg_resetwal.c:749 +#: pg_resetwal.c:756 #, c-format msgid "Maximum data alignment: %u\n" msgstr "МакÑимальне Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…: %u\n" -#: pg_resetwal.c:752 +#: pg_resetwal.c:759 #, c-format msgid "Database block size: %u\n" msgstr "Розмір блоку бази даних: %u\n" -#: pg_resetwal.c:754 +#: pg_resetwal.c:761 #, c-format msgid "Blocks per segment of large relation: %u\n" msgstr "Блоків на Ñегмент великого відношеннÑ: %u\n" -#: pg_resetwal.c:756 +#: pg_resetwal.c:763 #, c-format msgid "WAL block size: %u\n" msgstr "Pозмір блоку WAL: %u\n" -#: pg_resetwal.c:758 pg_resetwal.c:844 +#: pg_resetwal.c:765 pg_resetwal.c:851 #, c-format msgid "Bytes per WAL segment: %u\n" msgstr "Байтів на Ñегмент WAL: %u\n" -#: pg_resetwal.c:760 +#: pg_resetwal.c:767 #, c-format msgid "Maximum length of identifiers: %u\n" msgstr "МакÑимальна довжина ідентифікаторів: %u\n" -#: pg_resetwal.c:762 +#: pg_resetwal.c:769 #, c-format msgid "Maximum columns in an index: %u\n" msgstr "МакÑимальна кількіÑть Ñтовпців в індекÑÑ–: %u\n" -#: pg_resetwal.c:764 +#: pg_resetwal.c:771 #, c-format msgid "Maximum size of a TOAST chunk: %u\n" msgstr "МакÑимальний розмір Ñегменту TOAST: %u\n" -#: pg_resetwal.c:766 +#: pg_resetwal.c:773 #, c-format msgid "Size of a large-object chunk: %u\n" msgstr "Розмір Ñегменту великих обїєктів: %u\n" -#: pg_resetwal.c:769 +#: pg_resetwal.c:776 #, c-format msgid "Date/time type storage: %s\n" msgstr "Дата/Ñ‡Ð°Ñ Ñ‚Ð¸Ð¿Ñƒ Ñховища: %s\n" -#: pg_resetwal.c:770 +#: pg_resetwal.c:777 msgid "64-bit integers" msgstr "64-бітні цілі" -#: pg_resetwal.c:771 +#: pg_resetwal.c:778 #, c-format msgid "Float8 argument passing: %s\n" msgstr "Передача аргументу Float8: %s\n" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by reference" msgstr "за поÑиланнÑм" -#: pg_resetwal.c:772 +#: pg_resetwal.c:779 msgid "by value" msgstr "за значеннÑм" -#: pg_resetwal.c:773 +#: pg_resetwal.c:780 #, c-format msgid "Data page checksum version: %u\n" msgstr "ВерÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум Ñторінок даних: %u\n" -#: pg_resetwal.c:787 +#: pg_resetwal.c:794 #, c-format msgid "\n\n" "Values to be changed:\n\n" msgstr "\n\n" "ЗначеннÑ, що потребують зміни:\n\n" -#: pg_resetwal.c:791 +#: pg_resetwal.c:798 #, c-format msgid "First log segment after reset: %s\n" msgstr "Перший Ñегмент журналу піÑÐ»Ñ ÑкиданнÑ: %s\n" -#: pg_resetwal.c:795 +#: pg_resetwal.c:802 #, c-format msgid "NextMultiXactId: %u\n" msgstr "NextMultiXactId: %u\n" -#: pg_resetwal.c:797 +#: pg_resetwal.c:804 #, c-format msgid "OldestMultiXid: %u\n" msgstr "OldestMultiXid: %u\n" -#: pg_resetwal.c:799 +#: pg_resetwal.c:806 #, c-format msgid "OldestMulti's DB: %u\n" msgstr "OldestMulti's DB: %u\n" -#: pg_resetwal.c:805 +#: pg_resetwal.c:812 #, c-format msgid "NextMultiOffset: %u\n" msgstr "NextMultiOffset: %u\n" -#: pg_resetwal.c:811 +#: pg_resetwal.c:818 #, c-format msgid "NextOID: %u\n" msgstr "NextOID: %u\n" -#: pg_resetwal.c:817 +#: pg_resetwal.c:824 #, c-format msgid "NextXID: %u\n" msgstr "NextXID: %u\n" -#: pg_resetwal.c:819 +#: pg_resetwal.c:826 #, c-format msgid "OldestXID: %u\n" msgstr "OldestXID: %u\n" -#: pg_resetwal.c:821 +#: pg_resetwal.c:828 #, c-format msgid "OldestXID's DB: %u\n" msgstr "OldestXID's DB: %u\n" -#: pg_resetwal.c:827 +#: pg_resetwal.c:834 #, c-format msgid "NextXID epoch: %u\n" msgstr "Епоха NextXID: %u\n" -#: pg_resetwal.c:833 +#: pg_resetwal.c:840 #, c-format msgid "oldestCommitTsXid: %u\n" msgstr "oldestCommitTsXid: %u\n" -#: pg_resetwal.c:838 +#: pg_resetwal.c:845 #, c-format msgid "newestCommitTsXid: %u\n" msgstr "newestCommitTsXid: %u\n" -#: pg_resetwal.c:922 pg_resetwal.c:981 pg_resetwal.c:1016 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" - -#: pg_resetwal.c:954 pg_resetwal.c:995 pg_resetwal.c:1033 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" - -#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 +#: pg_resetwal.c:957 pg_resetwal.c:998 pg_resetwal.c:1036 pg_resetwal.c:1071 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" -#: pg_resetwal.c:990 pg_resetwal.c:1028 +#: pg_resetwal.c:990 pg_resetwal.c:1028 pg_resetwal.c:1063 #, c-format msgid "could not delete file \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл \"%s\": %m" -#: pg_resetwal.c:1100 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "не можливо відкрити файл \"%s\": %m" - -#: pg_resetwal.c:1108 pg_resetwal.c:1120 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m" - -#: pg_resetwal.c:1125 +#: pg_resetwal.c:1159 #, c-format msgid "fsync error: %m" msgstr "помилка fsync: %m" -#: pg_resetwal.c:1134 +#: pg_resetwal.c:1168 #, c-format msgid "%s resets the PostgreSQL write-ahead log.\n\n" msgstr "%s Ñкидає журнал передзапиÑу PostgreSQL.\n\n" -#: pg_resetwal.c:1135 +#: pg_resetwal.c:1169 #, c-format msgid "Usage:\n" -" %s [OPTION]... DATADIR\n\n" msgstr "ВикориÑтаннÑ:\n" -" %s [OPTION]... КÐТÐЛОГ_ДÐÐИХ\n\n" -#: pg_resetwal.c:1136 +#: pg_resetwal.c:1170 +#, c-format +msgid " %s [OPTION]... DATADIR\n" +msgstr " %s [OPTION]... DATADIR\n" + +#: pg_resetwal.c:1172 +#, c-format +msgid "\n" +"Options:\n" +msgstr "\n" +"Параметри:\n" + +#: pg_resetwal.c:1173 +#, c-format +msgid " [-D, --pgdata=]DATADIR data directory\n" +msgstr " [-D, --pgdata=]DATADIR каталог з даними\n" + +#: pg_resetwal.c:1174 +#, c-format +msgid " -f, --force force update to be done even after unclean shutdown or\n" +" if pg_control values had to be guessed\n" +msgstr " -f, --force змуÑити Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ¾Ð½ÑƒÐ²Ð°Ñ‚Ð¸ÑÑ Ð½Ð°Ð²Ñ–Ñ‚ÑŒ піÑÐ»Ñ Ð½ÐµÑ‡Ð¸Ñтого Ð²Ð¸Ð¼ÐºÐ½ÐµÐ½Ð½Ñ Ð°Ð±Ð¾\n" +" Ñкщо Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ pg_control потрібно було вгадувати\n" + +#: pg_resetwal.c:1176 +#, c-format +msgid " -n, --dry-run no update, just show what would be done\n" +msgstr " -n, --dry-run не оновлювати, проÑто показати, що було б зроблено\n" + +#: pg_resetwal.c:1177 #, c-format -msgid "Options:\n" -msgstr "Параметри:\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" -#: pg_resetwal.c:1137 +#: pg_resetwal.c:1178 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help показати цю довідку потім вийти\n" + +#: pg_resetwal.c:1180 +#, c-format +msgid "\n" +"Options to override control file values:\n" +msgstr "\n" +"Опції Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ контрольного файлу:\n" + +#: pg_resetwal.c:1181 #, c-format msgid " -c, --commit-timestamp-ids=XID,XID\n" " set oldest and newest transactions bearing\n" @@ -555,79 +669,54 @@ msgstr " -c, --commit-timestamp-ids=XID,XID\n" " вÑтановити найÑтарішу та найновішу транзакції\n" " затвердити позначку чаÑу (нуль означає залишити без змін)\n" -#: pg_resetwal.c:1140 -#, c-format -msgid " [-D, --pgdata=]DATADIR data directory\n" -msgstr " [-D, --pgdata=]DATADIR каталог даних\n" - -#: pg_resetwal.c:1141 +#: pg_resetwal.c:1184 #, c-format msgid " -e, --epoch=XIDEPOCH set next transaction ID epoch\n" msgstr " -e, --epoch=XIDEPOCH вÑтановити наÑтупну епоху ID транзакцій\n" -#: pg_resetwal.c:1142 -#, c-format -msgid " -f, --force force update to be done\n" -msgstr " -f, --force примуÑово виконати оновленнÑ\n" - -#: pg_resetwal.c:1143 +#: pg_resetwal.c:1185 #, c-format msgid " -l, --next-wal-file=WALFILE set minimum starting location for new WAL\n" msgstr " -l, --next-wal-file=WALFILE задати мінімальне початкове Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ WAL\n" -#: pg_resetwal.c:1144 +#: pg_resetwal.c:1186 #, c-format msgid " -m, --multixact-ids=MXID,MXID set next and oldest multitransaction ID\n" msgstr " -m, --multixact-ids=MXID,MXID задати ID наÑтупної Ñ– найÑтарішої мультитранзакції\n" -#: pg_resetwal.c:1145 -#, c-format -msgid " -n, --dry-run no update, just show what would be done\n" -msgstr " -n, --dry-run без оновлень, проÑто показати, що буде зроблено\n" - -#: pg_resetwal.c:1146 +#: pg_resetwal.c:1187 #, c-format msgid " -o, --next-oid=OID set next OID\n" msgstr " -o, --next-oid=OID задати наÑтупний OID\n" -#: pg_resetwal.c:1147 +#: pg_resetwal.c:1188 #, c-format msgid " -O, --multixact-offset=OFFSET set next multitransaction offset\n" msgstr " -O, --multixact-offset=OFFSET задати зÑув наÑтупної мультитранзакції\n" -#: pg_resetwal.c:1148 +#: pg_resetwal.c:1189 #, c-format msgid " -u, --oldest-transaction-id=XID set oldest transaction ID\n" msgstr " -u, --oldest-transaction-id=XID задати ID найÑтарішої транзакції\n" -#: pg_resetwal.c:1149 -#, c-format -msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" - -#: pg_resetwal.c:1150 +#: pg_resetwal.c:1190 #, c-format msgid " -x, --next-transaction-id=XID set next transaction ID\n" msgstr " -x, --next-transaction-id=XID задати ID наÑтупної транзакції\n" -#: pg_resetwal.c:1151 +#: pg_resetwal.c:1191 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=SIZE розмір Ñегментів WAL, у мегабайтах\n" -#: pg_resetwal.c:1152 -#, c-format -msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help показати цю довідку Ñ– вийти\n" - -#: pg_resetwal.c:1153 +#: pg_resetwal.c:1193 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "ПовідомлÑти про помилки на <%s>.\n" -#: pg_resetwal.c:1154 +#: pg_resetwal.c:1194 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" diff --git a/src/bin/pg_resetwal/t/001_basic.pl b/src/bin/pg_resetwal/t/001_basic.pl index 7e5efbf56b5a0..9829e48106eca 100644 --- a/src/bin/pg_resetwal/t/001_basic.pl +++ b/src/bin/pg_resetwal/t/001_basic.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -14,6 +14,7 @@ my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; +$node->append_conf('postgresql.conf', 'track_commit_timestamp = on'); command_like([ 'pg_resetwal', '-n', $node->data_dir ], qr/checkpoint/, 'pg_resetwal -n produces output'); @@ -29,4 +30,207 @@ 'check PGDATA permissions'); } +command_ok([ 'pg_resetwal', '-D', $node->data_dir ], 'pg_resetwal runs'); +$node->start; +is($node->safe_psql("postgres", "SELECT 1;"), + 1, 'server running and working after reset'); + +command_fails_like( + [ 'pg_resetwal', $node->data_dir ], + qr/lock file .* exists/, + 'fails if server running'); + +$node->stop('immediate'); +command_fails_like( + [ 'pg_resetwal', $node->data_dir ], + qr/database server was not shut down cleanly/, + 'does not run after immediate shutdown'); +command_ok( + [ 'pg_resetwal', '-f', $node->data_dir ], + 'runs after immediate shutdown with force'); +$node->start; +is($node->safe_psql("postgres", "SELECT 1;"), + 1, 'server running and working after forced reset'); + +$node->stop; + +# check various command-line handling + +# Note: This test intends to check that a nonexistent data directory +# gives a reasonable error message. Because of the way the code is +# currently structured, you get an error about readings permissions, +# which is perhaps suboptimal, so feel free to update this test if +# this gets improved. +command_fails_like( + [ 'pg_resetwal', 'foo' ], + qr/error: could not read permissions of directory/, + 'fails with nonexistent data directory'); + +command_fails_like( + [ 'pg_resetwal', 'foo', 'bar' ], + qr/too many command-line arguments/, + 'fails with too many command-line arguments'); + +$ENV{PGDATA} = $node->data_dir; # not used +command_fails_like( + ['pg_resetwal'], + qr/no data directory specified/, + 'fails with too few command-line arguments'); + +# error cases +# -c +command_fails_like( + [ 'pg_resetwal', '-c', 'foo', $node->data_dir ], + qr/error: invalid argument for option -c/, + 'fails with incorrect -c option'); +command_fails_like( + [ 'pg_resetwal', '-c', '10,bar', $node->data_dir ], + qr/error: invalid argument for option -c/, + 'fails with incorrect -c option part 2'); +command_fails_like( + [ 'pg_resetwal', '-c', '1,10', $node->data_dir ], + qr/greater than/, + 'fails with -c value 1 part 1'); +command_fails_like( + [ 'pg_resetwal', '-c', '10,1', $node->data_dir ], + qr/greater than/, + 'fails with -c value 1 part 2'); +# -e +command_fails_like( + [ 'pg_resetwal', '-e', 'foo', $node->data_dir ], + qr/error: invalid argument for option -e/, + 'fails with incorrect -e option'); +command_fails_like( + [ 'pg_resetwal', '-e', '-1', $node->data_dir ], + qr/must not be -1/, + 'fails with -e value -1'); +# -l +command_fails_like( + [ 'pg_resetwal', '-l', 'foo', $node->data_dir ], + qr/error: invalid argument for option -l/, + 'fails with incorrect -l option'); +# -m +command_fails_like( + [ 'pg_resetwal', '-m', 'foo', $node->data_dir ], + qr/error: invalid argument for option -m/, + 'fails with incorrect -m option'); +command_fails_like( + [ 'pg_resetwal', '-m', '10,bar', $node->data_dir ], + qr/error: invalid argument for option -m/, + 'fails with incorrect -m option part 2'); +command_fails_like( + [ 'pg_resetwal', '-m', '0,10', $node->data_dir ], + qr/must not be 0/, + 'fails with -m value 0 part 1'); +command_fails_like( + [ 'pg_resetwal', '-m', '10,0', $node->data_dir ], + qr/must not be 0/, + 'fails with -m value 0 part 2'); +# -o +command_fails_like( + [ 'pg_resetwal', '-o', 'foo', $node->data_dir ], + qr/error: invalid argument for option -o/, + 'fails with incorrect -o option'); +command_fails_like( + [ 'pg_resetwal', '-o', '0', $node->data_dir ], + qr/must not be 0/, + 'fails with -o value 0'); +# -O +command_fails_like( + [ 'pg_resetwal', '-O', 'foo', $node->data_dir ], + qr/error: invalid argument for option -O/, + 'fails with incorrect -O option'); +command_fails_like( + [ 'pg_resetwal', '-O', '-1', $node->data_dir ], + qr/must not be -1/, + 'fails with -O value -1'); +# --wal-segsize +command_fails_like( + [ 'pg_resetwal', '--wal-segsize', 'foo', $node->data_dir ], + qr/error: invalid value/, + 'fails with incorrect --wal-segsize option'); +command_fails_like( + [ 'pg_resetwal', '--wal-segsize', '13', $node->data_dir ], + qr/must be a power/, + 'fails with invalid --wal-segsize value'); +# -u +command_fails_like( + [ 'pg_resetwal', '-u', 'foo', $node->data_dir ], + qr/error: invalid argument for option -u/, + 'fails with incorrect -u option'); +command_fails_like( + [ 'pg_resetwal', '-u', '1', $node->data_dir ], + qr/must be greater than/, + 'fails with -u value too small'); +# -x +command_fails_like( + [ 'pg_resetwal', '-x', 'foo', $node->data_dir ], + qr/error: invalid argument for option -x/, + 'fails with incorrect -x option'); +command_fails_like( + [ 'pg_resetwal', '-x', '1', $node->data_dir ], + qr/must be greater than/, + 'fails with -x value too small'); + +# run with control override options + +my $out = (run_command([ 'pg_resetwal', '-n', $node->data_dir ]))[0]; +$out =~ /^Database block size: *(\d+)$/m or die; +my $blcksz = $1; + +my @cmd = ('pg_resetwal', '-D', $node->data_dir); + +# some not-so-critical hardcoded values +push @cmd, '-e', 1; +push @cmd, '-l', '00000001000000320000004B'; +push @cmd, '-o', 100_000; +push @cmd, '--wal-segsize', 1; + +# these use the guidance from the documentation + +sub get_slru_files +{ + opendir(my $dh, $node->data_dir . '/' . $_[0]) or die $!; + my @files = sort grep { /[0-9A-F]+/ } readdir $dh; + closedir $dh; + return @files; +} + +my (@files, $mult); + +@files = get_slru_files('pg_commit_ts'); +# XXX: Should there be a multiplier, similar to the other options? +# -c argument is "old,new" +push @cmd, + '-c', + sprintf("%d,%d", hex($files[0]) == 0 ? 3 : hex($files[0]), hex($files[-1])); + +@files = get_slru_files('pg_multixact/offsets'); +$mult = 32 * $blcksz / 4; +# -m argument is "new,old" +push @cmd, '-m', + sprintf("%d,%d", + (hex($files[-1]) + 1) * $mult, + hex($files[0]) == 0 ? 1 : hex($files[0] * $mult)); + +@files = get_slru_files('pg_multixact/members'); +$mult = 32 * int($blcksz / 20) * 4; +push @cmd, '-O', (hex($files[-1]) + 1) * $mult; + +@files = get_slru_files('pg_xact'); +$mult = 32 * $blcksz * 4; +push @cmd, + '-u', (hex($files[0]) == 0 ? 3 : hex($files[0]) * $mult), + '-x', ((hex($files[-1]) + 1) * $mult); + +command_ok([ @cmd, '-n' ], 'runs with control override options, dry run'); +command_ok(\@cmd, 'runs with control override options'); +command_like( + [ 'pg_resetwal', '-n', $node->data_dir ], + qr/^Latest checkpoint's NextOID: *100000$/m, + 'spot check that control changes were applied'); + +$node->start; +ok(1, 'server started after reset'); + done_testing(); diff --git a/src/bin/pg_resetwal/t/002_corrupted.pl b/src/bin/pg_resetwal/t/002_corrupted.pl index 6d19a1efd5adc..c5e09bbb688c8 100644 --- a/src/bin/pg_resetwal/t/002_corrupted.pl +++ b/src/bin/pg_resetwal/t/002_corrupted.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests for handling a corrupted pg_control use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -14,14 +14,14 @@ $node->init; my $pg_control = $node->data_dir . '/global/pg_control'; -my $size = (stat($pg_control))[7]; +my $size = -s $pg_control; # Read out the head of the file to get PG_CONTROL_VERSION in # particular. my $data; open my $fh, '<', $pg_control or BAIL_OUT($!); binmode $fh; -read $fh, $data, 16; +read $fh, $data, 16 or die $!; close $fh; # Fill pg_control with zeros @@ -55,4 +55,12 @@ ], 'processes zero WAL segment size'); +# now try to run it +command_fails_like( + [ 'pg_resetwal', $node->data_dir ], + qr/not proceeding because control file values were guessed/, + 'does not run when control file values were guessed'); +command_ok([ 'pg_resetwal', '-f', $node->data_dir ], + 'runs with force when control file values were guessed'); + done_testing(); diff --git a/src/bin/pg_rewind/Makefile b/src/bin/pg_rewind/Makefile index bed05f1609c5e..12b138b2f2ce3 100644 --- a/src/bin/pg_rewind/Makefile +++ b/src/bin/pg_rewind/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/pg_rewind # -# Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group # # src/bin/pg_rewind/Makefile # @@ -49,7 +49,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_rewind$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_rewind$(X) $(OBJS) xlogreader.c rm -rf tmp_check diff --git a/src/bin/pg_rewind/datapagemap.c b/src/bin/pg_rewind/datapagemap.c index 59ccb31d9310b..1d8be25320c6c 100644 --- a/src/bin/pg_rewind/datapagemap.c +++ b/src/bin/pg_rewind/datapagemap.c @@ -5,7 +5,7 @@ * * This is a fairly simple bitmap. * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ diff --git a/src/bin/pg_rewind/datapagemap.h b/src/bin/pg_rewind/datapagemap.h index a911d3e47e72c..49124834508dc 100644 --- a/src/bin/pg_rewind/datapagemap.h +++ b/src/bin/pg_rewind/datapagemap.h @@ -2,7 +2,7 @@ * * datapagemap.h * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ diff --git a/src/bin/pg_rewind/file_ops.c b/src/bin/pg_rewind/file_ops.c index 25996b4da479b..d93580bb41913 100644 --- a/src/bin/pg_rewind/file_ops.c +++ b/src/bin/pg_rewind/file_ops.c @@ -8,7 +8,7 @@ * do nothing if it's enabled. You should avoid accessing the target files * directly but if you do, make sure you honor the --dry-run mode! * - * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ @@ -286,9 +286,9 @@ remove_target_symlink(const char *path) * * We do this once, for the whole data directory, for performance reasons. At * the end of pg_rewind's run, the kernel is likely to already have flushed - * most dirty buffers to disk. Additionally fsync_pgdata uses a two-pass - * approach (only initiating writeback in the first pass), which often reduces - * the overall amount of IO noticeably. + * most dirty buffers to disk. Additionally sync_pgdata uses a two-pass + * approach when fsync is specified (only initiating writeback in the first + * pass), which often reduces the overall amount of IO noticeably. */ void sync_target_dir(void) @@ -296,7 +296,7 @@ sync_target_dir(void) if (!do_sync || dry_run) return; - fsync_pgdata(datadir_target, PG_VERSION_NUM); + sync_pgdata(datadir_target, PG_VERSION_NUM, sync_method); } diff --git a/src/bin/pg_rewind/file_ops.h b/src/bin/pg_rewind/file_ops.h index 427cf8e0b583d..8a14d9cd351b7 100644 --- a/src/bin/pg_rewind/file_ops.h +++ b/src/bin/pg_rewind/file_ops.h @@ -3,7 +3,7 @@ * file_ops.h * Helper functions for operating on files * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ diff --git a/src/bin/pg_rewind/filemap.c b/src/bin/pg_rewind/filemap.c index bd5c598e2008e..aff6f37cca5d0 100644 --- a/src/bin/pg_rewind/filemap.c +++ b/src/bin/pg_rewind/filemap.c @@ -16,7 +16,7 @@ * for each file. Finally, it sorts the array to the final order that the * actions should be executed in. * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ @@ -27,26 +27,25 @@ #include #include "catalog/pg_tablespace_d.h" -#include "common/hashfn.h" +#include "common/file_utils.h" +#include "common/hashfn_unstable.h" #include "common/string.h" #include "datapagemap.h" #include "filemap.h" #include "pg_rewind.h" -#include "storage/fd.h" /* * Define a hash table which we can use to store information about the files * appearing in source and target systems. */ -static uint32 hash_string_pointer(const char *s); -#define SH_PREFIX filehash -#define SH_ELEMENT_TYPE file_entry_t -#define SH_KEY_TYPE const char * -#define SH_KEY path -#define SH_HASH_KEY(tb, key) hash_string_pointer(key) +#define SH_PREFIX filehash +#define SH_ELEMENT_TYPE file_entry_t +#define SH_KEY_TYPE const char * +#define SH_KEY path +#define SH_HASH_KEY(tb, key) hash_string(key) #define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0) -#define SH_SCOPE static inline -#define SH_RAW_ALLOCATOR pg_malloc0 +#define SH_SCOPE static inline +#define SH_RAW_ALLOCATOR pg_malloc0 #define SH_DECLARE #define SH_DEFINE #include "lib/simplehash.h" @@ -61,7 +60,36 @@ static char *datasegpath(RelFileLocator rlocator, ForkNumber forknum, static file_entry_t *insert_filehash_entry(const char *path); static file_entry_t *lookup_filehash_entry(const char *path); + +/* + * A separate hash table which tracks WAL files that must not be deleted. + */ +typedef struct keepwal_entry +{ + const char *path; + uint32 status; +} keepwal_entry; + +#define SH_PREFIX keepwal +#define SH_ELEMENT_TYPE keepwal_entry +#define SH_KEY_TYPE const char * +#define SH_KEY path +#define SH_HASH_KEY(tb, key) hash_string(key) +#define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0) +#define SH_SCOPE static inline +#define SH_RAW_ALLOCATOR pg_malloc0 +#define SH_DECLARE +#define SH_DEFINE +#include "lib/simplehash.h" + +#define KEEPWAL_INITIAL_SIZE 1000 + + +static keepwal_hash *keepwal = NULL; +static bool keepwal_entry_exists(const char *path); + static int final_filemap_cmp(const void *a, const void *b); + static bool check_file_excluded(const char *path, bool is_source); /* @@ -85,7 +113,7 @@ struct exclude_list_item * they are defined in backend-only headers. So this list is maintained * with a best effort in mind. */ -static const char *excludeDirContents[] = +static const char *const excludeDirContents[] = { /* * Skip temporary statistics files. PG_STAT_TMP_DIR must be skipped @@ -207,6 +235,39 @@ lookup_filehash_entry(const char *path) return filehash_lookup(filehash, path); } +/* + * Initialize a hash table to store WAL file names that must be kept. + */ +void +keepwal_init(void) +{ + /* An initial hash size out of thin air */ + keepwal = keepwal_create(KEEPWAL_INITIAL_SIZE, NULL); +} + +/* Mark the given file to prevent its removal */ +void +keepwal_add_entry(const char *path) +{ + keepwal_entry *entry; + bool found; + + /* Should only be called with keepwal initialized */ + Assert(keepwal != NULL); + + entry = keepwal_insert(keepwal, path, &found); + + if (!found) + entry->path = pg_strdup(path); +} + +/* Return true if file is marked as not to be removed, false otherwise */ +static bool +keepwal_entry_exists(const char *path) +{ + return keepwal_lookup(keepwal, path) != NULL; +} + /* * Callback for processing source file list. * @@ -647,6 +708,10 @@ decide_file_action(file_entry_t *entry) if (strcmp(path, "global/pg_control") == 0) return FILE_ACTION_NONE; + /* Skip macOS system files */ + if (strstr(path, ".DS_Store") != NULL) + return FILE_ACTION_NONE; + /* * Remove all files matching the exclusion filters in the target. */ @@ -682,7 +747,15 @@ decide_file_action(file_entry_t *entry) } else if (entry->target_exists && !entry->source_exists) { - /* File exists in target, but not source. Remove it. */ + /* + * For files that exist in target but not in source, we check the + * keepwal hash table; any files listed therein must not be removed. + */ + if (keepwal_entry_exists(path)) + { + pg_log_debug("Not removing file \"%s\" because it is required for recovery", path); + return FILE_ACTION_NONE; + } return FILE_ACTION_REMOVE; } else if (!entry->target_exists && !entry->source_exists) @@ -817,15 +890,3 @@ decide_file_actions(void) return filemap; } - - -/* - * Helper function for filemap hash table. - */ -static uint32 -hash_string_pointer(const char *s) -{ - unsigned char *ss = (unsigned char *) s; - - return hash_bytes(ss, strlen(s)); -} diff --git a/src/bin/pg_rewind/filemap.h b/src/bin/pg_rewind/filemap.h index 48f240dff12ae..5fceaeb64df95 100644 --- a/src/bin/pg_rewind/filemap.h +++ b/src/bin/pg_rewind/filemap.h @@ -2,7 +2,7 @@ * * filemap.h * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group *------------------------------------------------------------------------- */ #ifndef FILEMAP_H @@ -24,7 +24,7 @@ typedef enum FILE_ACTION_NONE, /* no action (we might still copy modified * blocks based on the parsed WAL) */ FILE_ACTION_TRUNCATE, /* truncate local file to 'newsize' bytes */ - FILE_ACTION_REMOVE /* remove local file / directory / symlink */ + FILE_ACTION_REMOVE, /* remove local file / directory / symlink */ } file_action_t; typedef enum @@ -33,7 +33,7 @@ typedef enum FILE_TYPE_REGULAR, FILE_TYPE_DIRECTORY, - FILE_TYPE_SYMLINK + FILE_TYPE_SYMLINK, } file_type_t; /* @@ -110,4 +110,7 @@ extern filemap_t *decide_file_actions(void); extern void calculate_totals(filemap_t *filemap); extern void print_filemap(filemap_t *filemap); +extern void keepwal_init(void); +extern void keepwal_add_entry(const char *path); + #endif /* FILEMAP_H */ diff --git a/src/bin/pg_rewind/libpq_source.c b/src/bin/pg_rewind/libpq_source.c index 0d8e9ee2d1a73..9378266d28e2f 100644 --- a/src/bin/pg_rewind/libpq_source.c +++ b/src/bin/pg_rewind/libpq_source.c @@ -3,7 +3,7 @@ * libpq_source.c * Functions for fetching files from a remote server via libpq. * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ @@ -117,6 +117,7 @@ init_libpq_conn(PGconn *conn) run_simple_command(conn, "SET statement_timeout = 0"); run_simple_command(conn, "SET lock_timeout = 0"); run_simple_command(conn, "SET idle_in_transaction_session_timeout = 0"); + run_simple_command(conn, "SET transaction_timeout = 0"); /* * we don't intend to do any updates, put the connection in read-only mode @@ -127,7 +128,7 @@ init_libpq_conn(PGconn *conn) /* secure search_path */ res = PQexec(conn, ALWAYS_SECURE_SEARCH_PATH_SQL); if (PQresultStatus(res) != PGRES_TUPLES_OK) - pg_fatal("could not clear search_path: %s", + pg_fatal("could not clear \"search_path\": %s", PQresultErrorMessage(res)); PQclear(res); @@ -138,7 +139,7 @@ init_libpq_conn(PGconn *conn) */ str = run_simple_query(conn, "SHOW full_page_writes"); if (strcmp(str, "on") != 0) - pg_fatal("full_page_writes must be enabled in the source server"); + pg_fatal("\"full_page_writes\" must be enabled in the source server"); pg_free(str); /* Prepare a statement we'll use to fetch files */ @@ -298,7 +299,16 @@ libpq_traverse_files(rewind_source *source, process_file_callback_t callback) link_target = PQgetvalue(res, i, 3); if (link_target[0]) - type = FILE_TYPE_SYMLINK; + { + /* + * In-place tablespaces are directories located in pg_tblspc/ with + * relative paths. + */ + if (is_absolute_path(link_target)) + type = FILE_TYPE_SYMLINK; + else + type = FILE_TYPE_DIRECTORY; + } else if (isdir) type = FILE_TYPE_DIRECTORY; else diff --git a/src/bin/pg_rewind/local_source.c b/src/bin/pg_rewind/local_source.c index 9bd43cba74816..46c6b72bd71e3 100644 --- a/src/bin/pg_rewind/local_source.c +++ b/src/bin/pg_rewind/local_source.c @@ -3,7 +3,7 @@ * local_source.c * Functions for using a local data directory as the source. * - * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build index fd22818be4d4f..200ebf84eb9e1 100644 --- a/src/bin/pg_rewind/meson.build +++ b/src/bin/pg_rewind/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_rewind_sources = files( 'datapagemap.c', @@ -43,6 +43,7 @@ tests += { 't/007_standby_source.pl', 't/008_min_recovery_point.pl', 't/009_growing_files.pl', + 't/010_keep_recycled_wals.pl', ], }, } diff --git a/src/bin/pg_rewind/nls.mk b/src/bin/pg_rewind/nls.mk index d2de8596fa61f..475ed2e416a90 100644 --- a/src/bin/pg_rewind/nls.mk +++ b/src/bin/pg_rewind/nls.mk @@ -10,11 +10,16 @@ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ pg_rewind.c \ timeline.c \ xlogreader.c \ + ../../common/controldata_utils.c \ ../../common/fe_memutils.c \ + ../../common/file_utils.c \ ../../common/percentrepl.c \ ../../common/restricted_token.c \ ../../fe_utils/archive.c \ - ../../fe_utils/recovery_gen.c -GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) report_invalid_record:2 + ../../fe_utils/option_utils.c \ + ../../fe_utils/recovery_gen.c \ + ../../fe_utils/string_utils.c +GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \ + report_invalid_record:2 GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \ - report_invalid_record:2:c-format + report_invalid_record:2:c-format diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c index 27782237d0577..242326c97a70e 100644 --- a/src/bin/pg_rewind/parsexlog.c +++ b/src/bin/pg_rewind/parsexlog.c @@ -3,7 +3,7 @@ * parsexlog.c * Functions for reading Write-Ahead-Log * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * *------------------------------------------------------------------------- @@ -31,7 +31,7 @@ #define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup,mask,decode) \ name, -static const char *RmgrNames[RM_MAX_ID + 1] = { +static const char *const RmgrNames[RM_MAX_ID + 1] = { #include "access/rmgrlist.h" }; @@ -175,6 +175,8 @@ findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex, XLogReaderState *xlogreader; char *errormsg; XLogPageReadPrivate private; + XLogSegNo current_segno = 0; + TimeLineID current_tli = 0; /* * The given fork pointer points to the end of the last common record, @@ -217,6 +219,25 @@ findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex, LSN_FORMAT_ARGS(searchptr)); } + /* Detect if a new WAL file has been opened */ + if (xlogreader->seg.ws_tli != current_tli || + xlogreader->seg.ws_segno != current_segno) + { + char xlogfname[MAXFNAMELEN]; + + snprintf(xlogfname, MAXFNAMELEN, XLOGDIR "/"); + + /* update curent values */ + current_tli = xlogreader->seg.ws_tli; + current_segno = xlogreader->seg.ws_segno; + + XLogFileName(xlogfname + sizeof(XLOGDIR), + current_tli, current_segno, WalSegSz); + + /* Track this filename as one to not remove */ + keepwal_add_entry(xlogfname); + } + /* * Check if it is a checkpoint record. This checkpoint record needs to * be the latest checkpoint before WAL forked and not the checkpoint diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c index f7f3b8227fd62..53eb49abdeaf6 100644 --- a/src/bin/pg_rewind/pg_rewind.c +++ b/src/bin/pg_rewind/pg_rewind.c @@ -3,7 +3,7 @@ * pg_rewind.c * Synchronizes a PostgreSQL data directory to a new timeline * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ @@ -22,6 +22,7 @@ #include "common/file_perm.h" #include "common/restricted_token.h" #include "common/string.h" +#include "fe_utils/option_utils.h" #include "fe_utils/recovery_gen.h" #include "fe_utils/string_utils.h" #include "file_ops.h" @@ -74,6 +75,7 @@ bool showprogress = false; bool dry_run = false; bool do_sync = true; bool restore_wal = false; +DataDirSyncMethod sync_method = DATA_DIR_SYNC_METHOD_FSYNC; /* Target history */ TimeLineHistoryEntry *targetHistory; @@ -92,7 +94,7 @@ usage(const char *progname) printf(_("%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n\n"), progname); printf(_("Usage:\n %s [OPTION]...\n\n"), progname); printf(_("Options:\n")); - printf(_(" -c, --restore-target-wal use restore_command in target configuration to\n" + printf(_(" -c, --restore-target-wal use \"restore_command\" in target configuration to\n" " retrieve WAL files from archives\n")); printf(_(" -D, --target-pgdata=DIRECTORY existing data directory to modify\n")); printf(_(" --source-pgdata=DIRECTORY source data directory to synchronize with\n")); @@ -107,6 +109,7 @@ usage(const char *progname) " file when running target cluster\n")); printf(_(" --debug write a lot of debug messages\n")); printf(_(" --no-ensure-shutdown do not automatically fix unclean shutdown\n")); + printf(_(" --sync-method=METHOD set method for syncing files to disk\n")); printf(_(" -V, --version output version information, then exit\n")); printf(_(" -?, --help show this help, then exit\n")); printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); @@ -131,6 +134,7 @@ main(int argc, char **argv) {"no-sync", no_argument, NULL, 'N'}, {"progress", no_argument, NULL, 'P'}, {"debug", no_argument, NULL, 3}, + {"sync-method", required_argument, NULL, 6}, {NULL, 0, NULL, 0} }; int option_index; @@ -218,6 +222,11 @@ main(int argc, char **argv) config_file = pg_strdup(optarg); break; + case 6: + if (!parse_sync_method(optarg, &sync_method)) + exit(1); + break; + default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -442,10 +451,13 @@ main(int argc, char **argv) pg_log_info("no rewind required"); if (writerecoveryconf && !dry_run) WriteRecoveryConfig(conn, datadir_target, - GenerateRecoveryConfig(conn, NULL)); + GenerateRecoveryConfig(conn, NULL, NULL)); exit(0); } + /* Initialize hashtable that tracks WAL files protected from removal */ + keepwal_init(); + findLastCheckpoint(datadir_target, divergerec, lastcommontliIndex, &chkptrec, &chkpttli, &chkptredo, restore_command); pg_log_info("rewinding from last common checkpoint at %X/%X on timeline %u", @@ -516,7 +528,7 @@ main(int argc, char **argv) /* Also update the standby configuration, if requested. */ if (writerecoveryconf && !dry_run) WriteRecoveryConfig(conn, datadir_target, - GenerateRecoveryConfig(conn, NULL)); + GenerateRecoveryConfig(conn, NULL, NULL)); /* don't need the source connection anymore */ source->destroy(source); @@ -873,6 +885,7 @@ getTimelineHistory(TimeLineID tli, bool is_source, int *nentries) pg_free(histfile); } + /* In debugging mode, print what we read */ if (debug) { int i; @@ -882,10 +895,7 @@ getTimelineHistory(TimeLineID tli, bool is_source, int *nentries) else pg_log_debug("Target timeline history:"); - /* - * Print the target timeline history. - */ - for (i = 0; i < targetNentries; i++) + for (i = 0; i < *nentries; i++) { TimeLineHistoryEntry *entry; @@ -1023,10 +1033,14 @@ digestControlFile(ControlFileData *ControlFile, const char *content, WalSegSz = ControlFile->xlog_seg_size; if (!IsValidWalSegSize(WalSegSz)) - pg_fatal(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte", - "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes", - WalSegSz), - WalSegSz); + { + pg_log_error(ngettext("invalid WAL segment size in control file (%d byte)", + "invalid WAL segment size in control file (%d bytes)", + WalSegSz), + WalSegSz); + pg_log_error_detail("The WAL segment size must be a power of two between 1 MB and 1 GB."); + exit(1); + } /* Additional checks on control file */ checkControlFile(ControlFile); @@ -1042,8 +1056,7 @@ static void getRestoreCommand(const char *argv0) { int rc; - char postgres_exec_path[MAXPGPATH], - cmd_output[MAXPGPATH]; + char postgres_exec_path[MAXPGPATH]; PQExpBuffer postgres_cmd; if (!restore_wal) @@ -1092,17 +1105,16 @@ getRestoreCommand(const char *argv0) /* add -C switch, for restore_command */ appendPQExpBufferStr(postgres_cmd, " -C restore_command"); - if (!pipe_read_line(postgres_cmd->data, cmd_output, sizeof(cmd_output))) - exit(1); - - (void) pg_strip_crlf(cmd_output); + restore_command = pipe_read_line(postgres_cmd->data); + if (restore_command == NULL) + pg_fatal("could not read restore_command from target cluster"); - if (strcmp(cmd_output, "") == 0) - pg_fatal("restore_command is not set in the target cluster"); + (void) pg_strip_crlf(restore_command); - restore_command = pg_strdup(cmd_output); + if (strcmp(restore_command, "") == 0) + pg_fatal("\"restore_command\" is not set in the target cluster"); - pg_log_debug("using for rewind restore_command = \'%s\'", + pg_log_debug("using for rewind \"restore_command = \'%s\'\"", restore_command); destroyPQExpBuffer(postgres_cmd); @@ -1117,7 +1129,6 @@ static void ensureCleanShutdown(const char *argv0) { int ret; -#define MAXCMDLEN (2 * MAXPGPATH) char exec_path[MAXPGPATH]; PQExpBuffer postgres_cmd; diff --git a/src/bin/pg_rewind/pg_rewind.h b/src/bin/pg_rewind/pg_rewind.h index ef8bdc1fbb812..ec43cbe2c67de 100644 --- a/src/bin/pg_rewind/pg_rewind.h +++ b/src/bin/pg_rewind/pg_rewind.h @@ -3,7 +3,7 @@ * pg_rewind.h * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * *------------------------------------------------------------------------- @@ -13,6 +13,7 @@ #include "access/timeline.h" #include "common/logging.h" +#include "common/file_utils.h" #include "datapagemap.h" #include "libpq-fe.h" #include "storage/block.h" @@ -24,6 +25,7 @@ extern bool showprogress; extern bool dry_run; extern bool do_sync; extern int WalSegSz; +extern DataDirSyncMethod sync_method; /* Target history */ extern TimeLineHistoryEntry *targetHistory; diff --git a/src/bin/pg_rewind/po/LINGUAS b/src/bin/pg_rewind/po/LINGUAS index f6b21537d5dfb..6fccaad2994e3 100644 --- a/src/bin/pg_rewind/po/LINGUAS +++ b/src/bin/pg_rewind/po/LINGUAS @@ -1 +1 @@ -cs de el es fr it ja ka ko pl pt_BR ru sv tr uk zh_CN +cs de el es fr it ja ka ko pl pt_BR ru sv tr uk zh_CN zh_TW diff --git a/src/bin/pg_rewind/po/de.po b/src/bin/pg_rewind/po/de.po index aea5e300e6ba9..65fcb16d94d72 100644 --- a/src/bin/pg_rewind/po/de.po +++ b/src/bin/pg_rewind/po/de.po @@ -1,13 +1,13 @@ # German message translation file for pg_rewind -# Copyright (C) 2015-2023 PostgreSQL Global Development Group +# Copyright (C) 2015-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: pg_rewind (PostgreSQL) 16\n" +"Project-Id-Version: pg_rewind (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-19 17:22+0000\n" -"PO-Revision-Date: 2023-05-19 20:50+0200\n" +"POT-Creation-Date: 2024-08-28 04:23+0000\n" +"PO-Revision-Date: 2024-08-28 07:51+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -36,6 +36,65 @@ msgstr "Detail: " msgid "hint: " msgstr "Tipp: " +#: ../../common/controldata_utils.c:97 file_ops.c:326 file_ops.c:330 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" + +#: ../../common/controldata_utils.c:110 file_ops.c:341 local_source.c:104 +#: local_source.c:163 parsexlog.c:350 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "konnte Datei »%s« nicht lesen: %m" + +#: ../../common/controldata_utils.c:119 file_ops.c:344 parsexlog.c:352 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: local_source.c:121 local_source.c:172 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schließen: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "falsche Byte-Reihenfolge" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"möglicherweise falsche Byte-Reihenfolge\n" +"Die Byte-Reihenfolge, die zur Speicherung der Datei pg_control verwendet wurde,\n" +"stimmt möglicherweise nicht mit der von diesem Programm verwendeten überein. In\n" +"diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n" +"wäre inkompatibel mit diesem Datenverzeichnis." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: parsexlog.c:312 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "konnte Datei »%s« nicht öffnen: %m" + +#: ../../common/controldata_utils.c:249 file_ops.c:117 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schreiben: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "konnte Datei »%s« nicht fsyncen: %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format @@ -47,6 +106,38 @@ msgstr "Speicher aufgebraucht\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: ../../fe_utils/archive.c:86 file_ops.c:417 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:388 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:462 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht lesen: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" + #: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" @@ -102,43 +193,58 @@ msgstr "unerwartete Dateigröße für »%s«: %lld statt %lld" msgid "could not open file \"%s\" restored from archive: %m" msgstr "konnte aus dem Archiv wiederhergestellte Datei »%s« nicht öffnen: %m" -#: ../../fe_utils/archive.c:86 file_ops.c:417 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" - #: ../../fe_utils/archive.c:98 #, c-format -msgid "restore_command failed: %s" -msgstr "restore_command fehlgeschlagen: %s" +msgid "\"restore_command\" failed: %s" +msgstr "»restore_command« fehlgeschlagen: %s" #: ../../fe_utils/archive.c:105 #, c-format msgid "could not restore file \"%s\" from archive" msgstr "konnte Datei »%s« nicht aus Archiv wiederherstellen" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 +#: ../../fe_utils/option_utils.c:69 #, c-format -msgid "out of memory" -msgstr "Speicher aufgebraucht" +msgid "invalid value \"%s\" for option %s" +msgstr "ungültiger Wert »%s« für Option %s" -#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312 +#: ../../fe_utils/option_utils.c:76 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "konnte Datei »%s« nicht öffnen: %m" +msgid "%s must be in range %d..%d" +msgstr "%s muss im Bereich %d..%d sein" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "unbekannte Sync-Methode: %s" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 +#, c-format +msgid "out of memory" +msgstr "Speicher aufgebraucht" -#: ../../fe_utils/recovery_gen.c:124 +#: ../../fe_utils/recovery_gen.c:143 #, c-format msgid "could not write to file \"%s\": %m" msgstr "konnte nicht in Datei »%s« schreiben: %m" -#: ../../fe_utils/recovery_gen.c:133 +#: ../../fe_utils/recovery_gen.c:152 #, c-format msgid "could not create file \"%s\": %m" msgstr "konnte Datei »%s« nicht erstellen: %m" +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s«\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "Datenbankname enthält Newline oder Carriage Return: »%s«\n" + #: file_ops.c:67 #, c-format msgid "could not open target file \"%s\": %m" @@ -154,11 +260,6 @@ msgstr "konnte Zieldatei »%s« nicht schließen: %m" msgid "could not seek in target file \"%s\": %m" msgstr "konnte Positionszeiger in Zieldatei »%s« nicht setzen: %m" -#: file_ops.c:117 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "konnte Datei »%s« nicht schreiben: %m" - #: file_ops.c:150 file_ops.c:177 #, c-format msgid "undefined file type for \"%s\"" @@ -204,26 +305,6 @@ msgstr "konnte symbolische Verknüpfung »%s« nicht erstellen: %m" msgid "could not remove symbolic link \"%s\": %m" msgstr "konnte symbolische Verknüpfung »%s« nicht löschen: %m" -#: file_ops.c:326 file_ops.c:330 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" - -#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "konnte Datei »%s« nicht lesen: %m" - -#: file_ops.c:344 parsexlog.c:352 -#, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" - -#: file_ops.c:388 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" - #: file_ops.c:441 #, c-format msgid "could not read symbolic link \"%s\": %m" @@ -234,162 +315,157 @@ msgstr "konnte symbolische Verknüpfung »%s« nicht lesen: %m" msgid "symbolic link \"%s\" target is too long" msgstr "Ziel für symbolische Verknüpfung »%s« ist zu lang" -#: file_ops.c:462 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "konnte Verzeichnis »%s« nicht lesen: %m" - #: file_ops.c:466 #, c-format msgid "could not close directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht schließen: %m" -#: filemap.c:236 +#: filemap.c:235 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "Datendatei »%s« in der Quelle ist keine normale Datei" -#: filemap.c:241 filemap.c:274 +#: filemap.c:240 filemap.c:273 #, c-format msgid "duplicate source file \"%s\"" msgstr "doppelte Quelldatei »%s«" -#: filemap.c:329 +#: filemap.c:328 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "unerwartete Seitenänderung für nicht normale Datei »%s«" -#: filemap.c:679 filemap.c:773 +#: filemap.c:682 filemap.c:776 #, c-format msgid "unknown file type for \"%s\"" msgstr "unbekannter Dateityp für »%s«" -#: filemap.c:706 +#: filemap.c:709 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "Datei »%s« hat unterschiedlichen Typ in Quelle und Ziel" -#: filemap.c:778 +#: filemap.c:781 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "konnte nicht entscheiden, was mit Datei »%s« zu tun ist" -#: libpq_source.c:130 +#: libpq_source.c:131 #, c-format -msgid "could not clear search_path: %s" -msgstr "konnte search_path nicht auf leer setzen: %s" +msgid "could not clear \"search_path\": %s" +msgstr "konnte »search_path« nicht auf leer setzen: %s" -#: libpq_source.c:141 +#: libpq_source.c:142 #, c-format -msgid "full_page_writes must be enabled in the source server" -msgstr "full_page_writes muss im Quell-Server eingeschaltet sein" +msgid "\"full_page_writes\" must be enabled in the source server" +msgstr "»full_page_writes« muss im Quell-Server eingeschaltet sein" -#: libpq_source.c:152 +#: libpq_source.c:153 #, c-format msgid "could not prepare statement to fetch file contents: %s" msgstr "konnte Anfrage zum Holen des Dateiinhalts nicht vorbereiten: %s" -#: libpq_source.c:171 +#: libpq_source.c:172 #, c-format msgid "error running query (%s) on source server: %s" msgstr "Fehler beim Ausführen einer Anfrage (%s) auf dem Quellserver: %s" -#: libpq_source.c:176 +#: libpq_source.c:177 #, c-format msgid "unexpected result set from query" msgstr "Anfrage ergab unerwartete Ergebnismenge" -#: libpq_source.c:198 +#: libpq_source.c:199 #, c-format msgid "error running query (%s) in source server: %s" msgstr "Fehler beim Ausführen einer Anfrage (%s) im Quellserver: %s" -#: libpq_source.c:219 +#: libpq_source.c:220 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "unbekanntes Ergebnis »%s« für aktuelle WAL-Einfügeposition" -#: libpq_source.c:270 +#: libpq_source.c:271 #, c-format msgid "could not fetch file list: %s" msgstr "konnte Dateiliste nicht holen: %s" -#: libpq_source.c:275 +#: libpq_source.c:276 #, c-format msgid "unexpected result set while fetching file list" msgstr "unerwartete Ergebnismenge beim Holen der Dateiliste" -#: libpq_source.c:467 +#: libpq_source.c:477 #, c-format msgid "could not send query: %s" msgstr "konnte Anfrage nicht senden: %s" -#: libpq_source.c:470 +#: libpq_source.c:480 #, c-format msgid "could not set libpq connection to single row mode" msgstr "konnte libpq-Verbindung nicht in den Einzelzeilenmodus setzen" -#: libpq_source.c:500 +#: libpq_source.c:510 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "unerwartetes Ergebnis beim Holen von fernen Dateien: %s" -#: libpq_source.c:505 +#: libpq_source.c:515 #, c-format msgid "received more data chunks than requested" msgstr "mehr Daten-Chunks erhalten als verlangt" -#: libpq_source.c:509 +#: libpq_source.c:519 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "unerwartete Ergebnismengengröße beim Holen von fernen Dateien" -#: libpq_source.c:515 +#: libpq_source.c:525 #, c-format msgid "unexpected data types in result set while fetching remote files: %u %u %u" msgstr "unerwartete Datentypen in Ergebnismenge beim Holen von fernen Dateien: %u %u %u" -#: libpq_source.c:523 +#: libpq_source.c:533 #, c-format msgid "unexpected result format while fetching remote files" msgstr "unerwartetes Ergebnisformat beim Holen von fernen Dateien" -#: libpq_source.c:529 +#: libpq_source.c:539 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "unerwartete NULL-Werte im Ergebnis beim Holen von fernen Dateien" -#: libpq_source.c:533 +#: libpq_source.c:543 #, c-format msgid "unexpected result length while fetching remote files" msgstr "unerwartete Ergebnislänge beim Holen von fernen Dateien" -#: libpq_source.c:566 +#: libpq_source.c:576 #, c-format msgid "received data for file \"%s\", when requested for \"%s\"" msgstr "Daten für Datei »%s« erhalten, aber »%s« wurde verlangt" -#: libpq_source.c:570 +#: libpq_source.c:580 #, c-format msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" msgstr "Daten für Offset %lld von Datei »%s« erhalten, aber Offset %lld wurde verlangt" -#: libpq_source.c:582 +#: libpq_source.c:592 #, c-format msgid "received more than requested for file \"%s\"" msgstr "mehr als verlangt erhalten für Datei »%s«" -#: libpq_source.c:595 +#: libpq_source.c:605 #, c-format msgid "unexpected number of data chunks received" msgstr "unerwartete Anzahl Daten-Chunks erhalten" -#: libpq_source.c:638 +#: libpq_source.c:648 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "konnte ferne Datei »%s« nicht holen: %s" -#: libpq_source.c:643 +#: libpq_source.c:653 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "unerwartete Ergebnismenge beim Holen der fernen Datei »%s«" @@ -404,11 +480,6 @@ msgstr "konnte Quelldatei »%s« nicht öffnen: %m" msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied" msgstr "Größe der Quelldatei »%s« nebenläufig verändert: %d Bytes erwartet, %d kopiert" -#: local_source.c:121 local_source.c:172 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "konnte Datei »%s« nicht schließen: %m" - #: local_source.c:146 #, c-format msgid "could not seek in source file: %m" @@ -459,7 +530,7 @@ msgstr "konnte Positionszeiger in Datei »%s« nicht setzen: %m" msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" msgstr "WAL-Eintrag modifiziert eine Relation, aber Typ des Eintrags wurde nicht erkannt: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" -#: pg_rewind.c:92 +#: pg_rewind.c:94 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" @@ -468,7 +539,7 @@ msgstr "" "%s resynchronisiert einen PostgreSQL-Cluster mit einer Kopie des Clusters.\n" "\n" -#: pg_rewind.c:93 +#: pg_rewind.c:95 #, c-format msgid "" "Usage:\n" @@ -479,43 +550,43 @@ msgstr "" " %s [OPTION]...\n" "\n" -#: pg_rewind.c:94 +#: pg_rewind.c:96 #, c-format msgid "Options:\n" msgstr "Optionen:\n" -#: pg_rewind.c:95 +#: pg_rewind.c:97 #, c-format msgid "" -" -c, --restore-target-wal use restore_command in target configuration to\n" +" -c, --restore-target-wal use \"restore_command\" in target configuration to\n" " retrieve WAL files from archives\n" msgstr "" -" -c, --restore-target-wal restore_command in der Zielkonfiguration zum\n" +" -c, --restore-target-wal »restore_command« in der Zielkonfiguration zum\n" " Laden von WAL-Dateien aus Archiv verwenden\n" -#: pg_rewind.c:97 +#: pg_rewind.c:99 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=VERZ bestehendes zu modifizierendes Datenverzeichnis\n" -#: pg_rewind.c:98 +#: pg_rewind.c:100 #, c-format msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" msgstr "" " --source-pgdata=VERZ Quelldatenverzeichnis, mit dem synchronisiert\n" " werden soll\n" -#: pg_rewind.c:99 +#: pg_rewind.c:101 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr " --source-server=VERB Quellserver, mit dem synchronisiert werden soll\n" -#: pg_rewind.c:100 +#: pg_rewind.c:102 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run anhalten, bevor etwas geändert wird\n" -#: pg_rewind.c:101 +#: pg_rewind.c:103 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" @@ -524,12 +595,12 @@ msgstr "" " -N, --no-sync nicht warten, bis Änderungen sicher auf\n" " Festplatte geschrieben sind\n" -#: pg_rewind.c:103 +#: pg_rewind.c:105 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress Fortschrittsmeldungen ausgeben\n" -#: pg_rewind.c:104 +#: pg_rewind.c:106 #, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" @@ -538,7 +609,7 @@ msgstr "" " -R, --write-recovery-conf Konfiguration für Replikation schreiben\n" " (benötigt --source-server)\n" -#: pg_rewind.c:106 +#: pg_rewind.c:108 #, c-format msgid "" " --config-file=FILENAME use specified main server configuration\n" @@ -547,27 +618,34 @@ msgstr "" " --config-file=DATEINAME angegebene Serverkonfigurationsdatei zum\n" " Starten des Ziel-Clusters verwenden\n" -#: pg_rewind.c:108 +#: pg_rewind.c:110 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug viele Debug-Meldungen ausgeben\n" -#: pg_rewind.c:109 +#: pg_rewind.c:111 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" msgstr " --no-ensure-shutdown unsauberen Shutdown nicht automatisch reparieren\n" -#: pg_rewind.c:110 +#: pg_rewind.c:112 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr "" +" --sync-method=METHODE Methode zum Synchronisieren von Dateien auf\n" +" Festplatte setzen\n" + +#: pg_rewind.c:113 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_rewind.c:111 +#: pg_rewind.c:114 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_rewind.c:112 +#: pg_rewind.c:115 #, c-format msgid "" "\n" @@ -576,425 +654,420 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_rewind.c:113 +#: pg_rewind.c:116 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245 -#: pg_rewind.c:252 pg_rewind.c:260 +#: pg_rewind.c:232 pg_rewind.c:240 pg_rewind.c:247 pg_rewind.c:254 +#: pg_rewind.c:261 pg_rewind.c:269 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_rewind.c:230 +#: pg_rewind.c:239 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "keine Quelle angegeben (--source-pgdata oder --source-server)" -#: pg_rewind.c:237 +#: pg_rewind.c:246 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "--source-pgdata und --source-server können nicht zusammen angegeben werden" -#: pg_rewind.c:244 +#: pg_rewind.c:253 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "kein Zielverzeichnis angegeben (--target-pgdata)" -#: pg_rewind.c:251 +#: pg_rewind.c:260 #, c-format msgid "no source server information (--source-server) specified for --write-recovery-conf" msgstr "kein Quellserver (--source-server) angegeben für --write-recovery-conf" -#: pg_rewind.c:258 +#: pg_rewind.c:267 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_rewind.c:273 +#: pg_rewind.c:282 #, c-format msgid "cannot be executed by \"root\"" msgstr "kann nicht von »root« ausgeführt werden" -#: pg_rewind.c:274 +#: pg_rewind.c:283 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Sie müssen %s als PostgreSQL-Superuser ausführen." -#: pg_rewind.c:284 +#: pg_rewind.c:293 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %m" -#: pg_rewind.c:302 +#: pg_rewind.c:311 #, c-format msgid "%s" msgstr "%s" -#: pg_rewind.c:305 +#: pg_rewind.c:314 #, c-format msgid "connected to server" msgstr "mit Server verbunden" -#: pg_rewind.c:366 +#: pg_rewind.c:375 #, c-format msgid "source and target cluster are on the same timeline" msgstr "Quell- und Ziel-Cluster sind auf der gleichen Zeitleiste" -#: pg_rewind.c:387 +#: pg_rewind.c:396 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "Server divergierten bei WAL-Position %X/%X auf Zeitleiste %u" -#: pg_rewind.c:442 +#: pg_rewind.c:451 #, c-format msgid "no rewind required" msgstr "kein Rückspulen nötig" -#: pg_rewind.c:451 +#: pg_rewind.c:460 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "Rückspulen ab letztem gemeinsamen Checkpoint bei %X/%X auf Zeitleiste %u" -#: pg_rewind.c:461 +#: pg_rewind.c:470 #, c-format msgid "reading source file list" msgstr "lese Quelldateiliste" -#: pg_rewind.c:465 +#: pg_rewind.c:474 #, c-format msgid "reading target file list" msgstr "lese Zieldateiliste" -#: pg_rewind.c:474 +#: pg_rewind.c:483 #, c-format msgid "reading WAL in target" msgstr "lese WAL im Ziel-Cluster" -#: pg_rewind.c:495 +#: pg_rewind.c:504 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "%lu MB müssen kopiert werden (Gesamtgröße des Quellverzeichnisses ist %lu MB)" -#: pg_rewind.c:513 +#: pg_rewind.c:522 #, c-format msgid "syncing target data directory" msgstr "synchronisiere Zieldatenverzeichnis" -#: pg_rewind.c:529 +#: pg_rewind.c:538 #, c-format msgid "Done!" msgstr "Fertig!" -#: pg_rewind.c:609 +#: pg_rewind.c:618 #, c-format msgid "no action decided for file \"%s\"" msgstr "keine Aktion bestimmt für Datei »%s«" -#: pg_rewind.c:641 +#: pg_rewind.c:650 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "Quellsystem wurde verändert, während pg_rewind lief" -#: pg_rewind.c:645 +#: pg_rewind.c:654 #, c-format msgid "creating backup label and updating control file" msgstr "erzeuge Backup-Label und aktualisiere Kontrolldatei" -#: pg_rewind.c:695 +#: pg_rewind.c:704 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "Quellsystem war in einem unerwarteten Zustand am Ende des Rückspulens" -#: pg_rewind.c:727 +#: pg_rewind.c:736 #, c-format msgid "source and target clusters are from different systems" msgstr "Quell- und Ziel-Cluster sind von verschiedenen Systemen" -#: pg_rewind.c:735 +#: pg_rewind.c:744 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "die Cluster sind nicht mit dieser Version von pg_rewind kompatibel" -#: pg_rewind.c:745 +#: pg_rewind.c:754 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "Zielserver muss entweder Datenprüfsummen oder »wal_log_hints = on« verwenden" -#: pg_rewind.c:756 +#: pg_rewind.c:765 #, c-format msgid "target server must be shut down cleanly" msgstr "Zielserver muss sauber heruntergefahren worden sein" -#: pg_rewind.c:766 +#: pg_rewind.c:775 #, c-format msgid "source data directory must be shut down cleanly" msgstr "Quelldatenverzeichnis muss sauber heruntergefahren worden sein" -#: pg_rewind.c:813 +#: pg_rewind.c:822 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s kB (%d%%) kopiert" -#: pg_rewind.c:941 +#: pg_rewind.c:948 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "konnte keinen gemeinsamen Anfangspunkt in den Zeitleisten von Quell- und Ziel-Cluster finden" -#: pg_rewind.c:982 +#: pg_rewind.c:989 #, c-format msgid "backup label buffer too small" msgstr "Puffer für Backup-Label ist zu klein" -#: pg_rewind.c:1005 +#: pg_rewind.c:1012 #, c-format msgid "unexpected control file CRC" msgstr "unerwartete CRC in Kontrolldatei" -#: pg_rewind.c:1017 +#: pg_rewind.c:1024 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "unerwartete Kontrolldateigröße %d, erwartet wurde %d" -#: pg_rewind.c:1026 +#: pg_rewind.c:1034 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" -msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Byte an" -msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber die Kontrolldatei gibt %d Bytes an" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "ungültige WAL-Segmentgröße in Kontrolldatei (%d Byte)" +msgstr[1] "ungültige WAL-Segmentgröße in Kontrolldatei (%d Bytes)" -#: pg_rewind.c:1065 pg_rewind.c:1135 +#: pg_rewind.c:1038 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "Die WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein." + +#: pg_rewind.c:1075 pg_rewind.c:1143 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden" -#: pg_rewind.c:1068 pg_rewind.c:1138 +#: pg_rewind.c:1078 pg_rewind.c:1146 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s" -#: pg_rewind.c:1101 +#: pg_rewind.c:1107 +#, c-format +msgid "could not read restore_command from target cluster" +msgstr "konnte restore_command des Ziel-Clusters nicht lesen" + +#: pg_rewind.c:1112 #, c-format -msgid "restore_command is not set in the target cluster" -msgstr "restore_command ist im Ziel-Cluster nicht gesetzt" +msgid "\"restore_command\" is not set in the target cluster" +msgstr "»restore_command« ist im Ziel-Cluster nicht gesetzt" -#: pg_rewind.c:1142 +#: pg_rewind.c:1150 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "führe »%s« für Zielserver aus, um Wiederherstellung abzuschließen" -#: pg_rewind.c:1180 +#: pg_rewind.c:1188 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "postgres im Einzelbenutzermodus im Ziel-Cluster fehlgeschlagen" -#: pg_rewind.c:1181 +#: pg_rewind.c:1189 #, c-format msgid "Command was: %s" msgstr "Die Anweisung war: %s" -#: timeline.c:75 timeline.c:81 +#: timeline.c:74 timeline.c:80 #, c-format msgid "syntax error in history file: %s" msgstr "Syntaxfehler in History-Datei: %s" -#: timeline.c:76 +#: timeline.c:75 #, c-format msgid "Expected a numeric timeline ID." msgstr "Eine numerische Zeitleisten-ID wurde erwartet." -#: timeline.c:82 +#: timeline.c:81 #, c-format msgid "Expected a write-ahead log switchpoint location." msgstr "Eine Write-Ahead-Log-Switchpoint-Position wurde erwartet." -#: timeline.c:87 +#: timeline.c:86 #, c-format msgid "invalid data in history file: %s" msgstr "ungültige Daten in History-Datei: %s" -#: timeline.c:88 +#: timeline.c:87 #, c-format msgid "Timeline IDs must be in increasing sequence." msgstr "Zeitleisten-IDs müssen in aufsteigender Folge sein." -#: timeline.c:108 +#: timeline.c:107 #, c-format msgid "invalid data in history file" msgstr "ungültige Daten in History-Datei" -#: timeline.c:109 +#: timeline.c:108 #, c-format msgid "Timeline IDs must be less than child timeline's ID." msgstr "Zeitleisten-IDs müssen kleiner als die Zeitleisten-ID des Kindes sein." -#: xlogreader.c:626 +#: xlogreader.c:619 #, c-format msgid "invalid record offset at %X/%X: expected at least %u, got %u" msgstr "ungültiger Datensatz-Offset bei %X/%X: mindestens %u erwartet, %u erhalten" -#: xlogreader.c:635 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "Contrecord angefordert von %X/%X" -#: xlogreader.c:676 xlogreader.c:1123 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "ungültige Datensatzlänge bei %X/%X: mindestens %u erwartet, %u erhalten" -#: xlogreader.c:705 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "Speicher aufgebraucht beim Versuch einen Datensatz mit Länge %u zu dekodieren" - -#: xlogreader.c:727 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "Datensatzlänge %u bei %X/%X ist zu lang" - -#: xlogreader.c:776 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "keine Contrecord-Flag bei %X/%X" -#: xlogreader.c:789 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "ungültige Contrecord-Länge %u (erwartet %lld) bei %X/%X" -#: xlogreader.c:924 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "Contrecord fehlt bei %X/%X" - -#: xlogreader.c:1131 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ungültige Resource-Manager-ID %u bei %X/%X" -#: xlogreader.c:1144 xlogreader.c:1160 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "Datensatz mit falschem Prev-Link %X/%X bei %X/%X" -#: xlogreader.c:1196 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "ungültige Resource-Manager-Datenprüfsumme in Datensatz bei %X/%X" -#: xlogreader.c:1230 +#: xlogreader.c:1243 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "ungültige magische Zahl %04X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1245 xlogreader.c:1287 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "ungültige Info-Bits %04X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1261 +#: xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: Datenbanksystemidentifikator in WAL-Datei ist %llu, Datenbanksystemidentifikator in pg_control ist %llu" -#: xlogreader.c:1269 +#: xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche Segmentgröße im Seitenkopf" -#: xlogreader.c:1275 +#: xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche XLOG_BLCKSZ im Seitenkopf" -#: xlogreader.c:1307 +#: xlogreader.c:1320 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "unerwartete Pageaddr %X/%X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1333 +#: xlogreader.c:1346 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "Zeitleisten-ID %u außer der Reihe (nach %u) in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1739 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u außer der Reihe bei %X/%X" -#: xlogreader.c:1763 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA gesetzt, aber keine Daten enthalten bei %X/%X" -#: xlogreader.c:1770 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA nicht gesetzt, aber Datenlänge ist %u bei %X/%X" -#: xlogreader.c:1806 +#: xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE gesetzt, aber Loch Offset %u Länge %u Block-Abbild-Länge %u bei %X/%X" -#: xlogreader.c:1822 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE nicht gesetzt, aber Loch Offset %u Länge %u bei %X/%X" -#: xlogreader.c:1836 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X" -#: xlogreader.c:1851 +#: xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X" -#: xlogreader.c:1867 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL gesetzt, aber keine vorangehende Relation bei %X/%X" -#: xlogreader.c:1879 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ungültige block_id %u bei %X/%X" -#: xlogreader.c:1946 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "Datensatz mit ungültiger Länge bei %X/%X" -#: xlogreader.c:1972 +#: xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "konnte Backup-Block mit ID %d nicht im WAL-Eintrag finden" -#: xlogreader.c:2056 +#: xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "konnte Abbild bei %X/%X mit ungültigem angegebenen Block %d nicht wiederherstellen" -#: xlogreader.c:2063 +#: xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "konnte Abbild mit ungültigem Zustand bei %X/%X nicht wiederherstellen, Block %d" -#: xlogreader.c:2090 xlogreader.c:2107 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit %s, nicht unterstützt von dieser Installation, Block %d" -#: xlogreader.c:2116 +#: xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit unbekannter Methode, Block %d" -#: xlogreader.c:2124 +#: xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d" diff --git a/src/bin/pg_rewind/po/el.po b/src/bin/pg_rewind/po/el.po index 44cfc690b6ea3..bea1edafacdc5 100644 --- a/src/bin/pg_rewind/po/el.po +++ b/src/bin/pg_rewind/po/el.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_rewind (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-14 09:20+0000\n" -"PO-Revision-Date: 2023-04-14 14:32+0200\n" +"POT-Creation-Date: 2023-08-14 23:21+0000\n" +"PO-Revision-Date: 2023-08-15 15:11+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -41,82 +41,82 @@ msgid "hint: " msgstr "υπόδειξη: " #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "έλλειψη μνήμης\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n" -#: ../../common/restricted_token.c:64 +#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118 #, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "δεν ήταν δυνατή η φόÏτωση της βιβλιοθήκης «%s»: κωδικός σφάλματος %lu" +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "άκυÏη τιμή για την παÏάμετÏο «%s»: «%s»" -#: ../../common/restricted_token.c:73 +#: ../../common/percentrepl.c:80 #, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "δεν ήταν δυνατή η δημιουÏγία διακÏιτικών πεÏιοÏÎ¹ÏƒÎ¼Î¿Ï ÏƒÏ„Î·Î½ παÏοÏσα πλατφόÏμα: κωδικός σφάλματος %lu" +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "Η συμβολοσειÏά τεÏματίζει απÏοσδόκητα μετά τον χαÏακτήÏα διαφυγής «%%»." -#: ../../common/restricted_token.c:82 +#: ../../common/percentrepl.c:119 +#, c-format +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "Η συμβολοσειÏά πεÏιέχει μη αναμενόμενο σÏμβολο αναμονής «%%%c»." + +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "δεν ήταν δυνατό το άνοιγμα διακÏÎ¹Ï„Î¹ÎºÎ¿Ï Î´Î¹ÎµÏγασίας: κωδικός σφάλματος %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "δεν ήταν δυνατή η εκχώÏηση SID: κωδικός σφάλματος %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "δεν ήταν δυνατή η δημιουÏγία διακÏÎ¹Ï„Î¹ÎºÎ¿Ï Î´Î¹ÎµÏγασίας: κωδικός σφάλματος %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "δεν ήταν δυνατή η εκκίνηση διεÏγασίας για την εντολή «%s»: κωδικός σφάλματος %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "δεν ήταν δυνατή η επανεκκίνηση με διακÏιτικό πεÏιοÏισμοÏ: κωδικός σφάλματος %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "δεν ήταν δυνατή η απόκτηση ÎºÏ‰Î´Î¹ÎºÎ¿Ï ÎµÎ¾ÏŒÎ´Î¿Ï… από την υποδιεÏγασία: κωδικός σφάλματος %lu" -#: ../../fe_utils/archive.c:52 -#, c-format -msgid "cannot use restore_command with %%r placeholder" -msgstr "δεν είναι δυνατή η χÏήση restore_command μαζί με %%r placeholder" - -#: ../../fe_utils/archive.c:70 +#: ../../fe_utils/archive.c:69 #, c-format msgid "unexpected file size for \"%s\": %lld instead of %lld" msgstr "μη αναμενόμενο μέγεθος αÏχείου για «%s»: %lld αντί για %lld" -#: ../../fe_utils/archive.c:78 +#: ../../fe_utils/archive.c:77 #, c-format msgid "could not open file \"%s\" restored from archive: %m" msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s» που έχει επαναφεÏθεί από την αÏχειοθήκη: %m" -#: ../../fe_utils/archive.c:87 file_ops.c:417 +#: ../../fe_utils/archive.c:86 file_ops.c:417 #, c-format msgid "could not stat file \"%s\": %m" msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο «%s»: %m" -#: ../../fe_utils/archive.c:99 +#: ../../fe_utils/archive.c:98 #, c-format msgid "restore_command failed: %s" msgstr "restore_command απέτυχε: %s" -#: ../../fe_utils/archive.c:106 +#: ../../fe_utils/archive.c:105 #, c-format msgid "could not restore file \"%s\" from archive" msgstr "δεν ήταν δυνατή η επαναφοÏά του αÏχείου «%s» από την αÏχειοθήκη" @@ -228,27 +228,22 @@ msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου msgid "could not open directory \"%s\": %m" msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m" -#: file_ops.c:446 +#: file_ops.c:441 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m" -#: file_ops.c:449 +#: file_ops.c:444 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "ο συμβολικός σÏνδεσμος «%s» είναι Ï€Î¿Î»Ï Î¼Î±ÎºÏÏÏ‚" -#: file_ops.c:464 -#, c-format -msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform" -msgstr "«%s» είναι ένας συμβολικός σÏνδεσμος, αλλά οι συμβολικοί σÏνδεσμοι δεν υποστηÏίζονται σε αυτήν την πλατφόÏμα" - -#: file_ops.c:471 +#: file_ops.c:462 #, c-format msgid "could not read directory \"%s\": %m" msgstr "δεν ήταν δυνατή η ανάγνωση του καταλόγου «%s»: %m" -#: file_ops.c:475 +#: file_ops.c:466 #, c-format msgid "could not close directory \"%s\": %m" msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m" @@ -468,7 +463,7 @@ msgstr "δεν ήταν δυνατή η αναζήτηση στο αÏχείο msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" msgstr "Η εγγÏαφή WAL Ï„Ïοποποιεί μια σχέση, αλλά ο Ï„Ïπος εγγÏαφής δεν αναγνωÏίζεται: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" -#: pg_rewind.c:86 +#: pg_rewind.c:92 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" @@ -477,7 +472,7 @@ msgstr "" "%s επανασυγχÏονίζει μία συστάδα PostgreSQL με ένα άλλο αντίγÏαφο της συστάδας.\n" "\n" -#: pg_rewind.c:87 +#: pg_rewind.c:93 #, c-format msgid "" "Usage:\n" @@ -488,12 +483,12 @@ msgstr "" " %s [ΕΠΙΛΟΓΗ]...\n" "\n" -#: pg_rewind.c:88 +#: pg_rewind.c:94 #, c-format msgid "Options:\n" msgstr "Επιλογές:\n" -#: pg_rewind.c:89 +#: pg_rewind.c:95 #, c-format msgid "" " -c, --restore-target-wal use restore_command in target configuration to\n" @@ -502,39 +497,39 @@ msgstr "" " -c, --restore-target-wal χÏησιμοποίησε restore_command στη ÏÏθμιση Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Î³Î¹Î± την\n" " ανάκτηση αÏχείων WAL από αÏχειοθήκες\n" -#: pg_rewind.c:91 +#: pg_rewind.c:97 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=DIRECTORY υπάÏχον κατάλογος δεδομένων Ï€Ïος Ï„Ïοποποιήση\n" -#: pg_rewind.c:92 +#: pg_rewind.c:98 #, c-format msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" msgstr " --source-pgdata=DIRECTORY κατάλογος δεδομένων Ï€Ïοέλευσης για συγχÏονισμό\n" -#: pg_rewind.c:93 +#: pg_rewind.c:99 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr " --source-server=CONNSTR διακομιστής Ï€Ïοέλευσης για συγχÏονισμό\n" -#: pg_rewind.c:94 +#: pg_rewind.c:100 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run τεÏματισμός Ï€Ïιν να Ï„Ïοποποιηθεί οτιδήποτε\n" -#: pg_rewind.c:95 +#: pg_rewind.c:101 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" " safely to disk\n" msgstr " -N, --no-sync να μην αναμένει την ασφαλή εγγÏαφή αλλαγών στον δίσκο\n" -#: pg_rewind.c:97 +#: pg_rewind.c:103 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress εμφάνισε πληÏοφοÏίες Ï€Ïοόδου\n" -#: pg_rewind.c:98 +#: pg_rewind.c:104 #, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" @@ -543,7 +538,7 @@ msgstr "" " -R, --write-recovery-conf εγγÏαφή των Ïυθμίσεων αναπαÏαγωγής\n" " (απαιτεί --source-server)\n" -#: pg_rewind.c:100 +#: pg_rewind.c:106 #, c-format msgid "" " --config-file=FILENAME use specified main server configuration\n" @@ -552,27 +547,27 @@ msgstr "" " --config-file=FILENAME χÏησιμοποίησε το οÏισμένο αÏχείο Ïυθμίσεων του Î²Î±ÏƒÎ¹ÎºÎ¿Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏƒÏ„Î®\n" " κατά την εκτέλεση συστάδας Ï€ÏοοÏισμοÏ\n" -#: pg_rewind.c:102 +#: pg_rewind.c:108 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug εγγÏαφή πολλών μηνÏματων ÎµÎ½Ï„Î¿Ï€Î¹ÏƒÎ¼Î¿Ï ÏƒÏ†Î±Î»Î¼Î¬Ï„Ï‰Î½\n" -#: pg_rewind.c:103 +#: pg_rewind.c:109 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" msgstr " --no-ensure-shutdown να μην διοÏθώνει αυτόματα ακάθαÏτο τεÏματισμό\n" -#: pg_rewind.c:104 +#: pg_rewind.c:110 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n" -#: pg_rewind.c:105 +#: pg_rewind.c:111 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" -#: pg_rewind.c:106 +#: pg_rewind.c:112 #, c-format msgid "" "\n" @@ -581,225 +576,220 @@ msgstr "" "\n" "Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n" -#: pg_rewind.c:107 +#: pg_rewind.c:113 #, c-format msgid "%s home page: <%s>\n" msgstr "%s αÏχική σελίδα: <%s>\n" -#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237 -#: pg_rewind.c:244 pg_rewind.c:252 +#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245 +#: pg_rewind.c:252 pg_rewind.c:260 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες." -#: pg_rewind.c:222 +#: pg_rewind.c:230 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "δεν καθοÏίστηκε Ï€Ïοέλευση (--source-pgdata ή --source-server)" -#: pg_rewind.c:229 +#: pg_rewind.c:237 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "μόνο ένα από τα --source-pgdata ή --source-server μποÏεί να καθοÏιστεί" -#: pg_rewind.c:236 +#: pg_rewind.c:244 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "δεν καθοÏίστηκε κατάλογος δεδομένων Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï (--target-pgdata)" -#: pg_rewind.c:243 +#: pg_rewind.c:251 #, c-format msgid "no source server information (--source-server) specified for --write-recovery-conf" msgstr "δεν καθοÏίστηκαν πληÏοφοÏίες διακομιστή Ï€Ïοέλευσης (--source-server) για --write-recovery-conf" -#: pg_rewind.c:250 +#: pg_rewind.c:258 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)" -#: pg_rewind.c:265 +#: pg_rewind.c:273 #, c-format msgid "cannot be executed by \"root\"" msgstr "δεν είναι δυνατή η εκτέλεση από «root»" -#: pg_rewind.c:266 +#: pg_rewind.c:274 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "ΠÏέπει να εκτελέσετε %s ως υπεÏχÏήστης PostgreSQL." -#: pg_rewind.c:276 +#: pg_rewind.c:284 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "δεν ήταν δυνατή η ανάγνωση δικαιωμάτων του καταλόγου «%s»: %m" -#: pg_rewind.c:294 +#: pg_rewind.c:302 #, c-format msgid "%s" msgstr "%s" -#: pg_rewind.c:297 +#: pg_rewind.c:305 #, c-format msgid "connected to server" msgstr "συνδεδεμένος στον διακομιστή" -#: pg_rewind.c:344 +#: pg_rewind.c:366 #, c-format msgid "source and target cluster are on the same timeline" msgstr "συστάδες Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï ÎºÎ±Î¹ Ï€Ïοέλευσης βÏίσκονται στην ίδια χÏονογÏαμμή" -#: pg_rewind.c:353 +#: pg_rewind.c:387 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "οι διακομιστές αποκλίνουν στην τοποθεσία WAL %X/%X στη χÏονογÏαμμή %u" -#: pg_rewind.c:401 +#: pg_rewind.c:442 #, c-format msgid "no rewind required" msgstr "δεν απαιτείται επαναφοÏά" -#: pg_rewind.c:410 +#: pg_rewind.c:451 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "επαναφοÏά από το τελευταίο κοινό σημείο ελέγχου στο %X/%X στη χÏονογÏαμμή %u" -#: pg_rewind.c:420 +#: pg_rewind.c:461 #, c-format msgid "reading source file list" msgstr "ανάγνωση λίστας αÏχείων Ï€Ïοέλευσης" -#: pg_rewind.c:424 +#: pg_rewind.c:465 #, c-format msgid "reading target file list" msgstr "ανάγνωση λίστας αÏχείων Ï€ÏοοÏισμοÏ" -#: pg_rewind.c:433 +#: pg_rewind.c:474 #, c-format msgid "reading WAL in target" msgstr "ανάγνωση WAL στον Ï€ÏοοÏισμό" -#: pg_rewind.c:454 +#: pg_rewind.c:495 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "Ï€Ïέπει να αντιγÏαφοÏν %lu MB (το συνολικό μέγεθος καταλόγου Ï€Ïοέλευσης είναι %lu MB)" -#: pg_rewind.c:472 +#: pg_rewind.c:513 #, c-format msgid "syncing target data directory" msgstr "συγχÏονισμός καταλόγου δεδομένων Ï€ÏοοÏισμοÏ" -#: pg_rewind.c:488 +#: pg_rewind.c:529 #, c-format msgid "Done!" msgstr "ΟλοκληÏώθηκε!" -#: pg_rewind.c:568 +#: pg_rewind.c:609 #, c-format msgid "no action decided for file \"%s\"" msgstr "καμία ενέÏγεια δεν αποφασίστηκε για το αÏχείο «%s»" -#: pg_rewind.c:600 +#: pg_rewind.c:641 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "το σÏστημα Ï€Ïοέλευσης Ï„Ïοποποιήθηκε κατά την εκτέλεση του pg_rewind" -#: pg_rewind.c:604 +#: pg_rewind.c:645 #, c-format msgid "creating backup label and updating control file" msgstr "δημιουÏγία ετικέτας αντιγÏάφων ασφαλείας και ενημέÏωση αÏχείου ελέγχου" -#: pg_rewind.c:654 +#: pg_rewind.c:695 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "το σÏστημα Ï€Ïοέλευσης βÏισκόταν σε μη αναμενόμενη κατάσταση στο τέλος της επαναφοÏάς" -#: pg_rewind.c:685 +#: pg_rewind.c:727 #, c-format msgid "source and target clusters are from different systems" msgstr "οι συστάδες Ï€Ïοέλευσης και Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï€ÏοέÏχονται από διαφοÏετικά συστήματα" -#: pg_rewind.c:693 +#: pg_rewind.c:735 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "η συστάδα δεν είναι συμβατή με αυτήν την έκδοση pg_rewind" -#: pg_rewind.c:703 +#: pg_rewind.c:745 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "ο διακομιστής Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï€Ïέπει να χÏησιμοποιεί είτε άθÏοισμα ελέγχου δεδομένων είτε «wal_log_hints = on»" -#: pg_rewind.c:714 +#: pg_rewind.c:756 #, c-format msgid "target server must be shut down cleanly" msgstr "ο διακομιστής Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Ï€Ïέπει να τεÏματιστεί καθαÏά" -#: pg_rewind.c:724 +#: pg_rewind.c:766 #, c-format msgid "source data directory must be shut down cleanly" msgstr "ο κατάλογος δεδομένων Ï€Ïοέλευσης Ï€Ïέπει να τεÏματιστεί καθαÏά" -#: pg_rewind.c:771 +#: pg_rewind.c:813 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s kB (%d%%) αντιγÏάφηκαν" -#: pg_rewind.c:834 -#, c-format -msgid "invalid control file" -msgstr "μη έγκυÏο αÏχείο ελέγχου" - -#: pg_rewind.c:918 +#: pg_rewind.c:941 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "δεν ήταν δυνατή η εÏÏεση ÎºÎ¿Î¹Î½Î¿Ï Ï€Ïογόνου των χÏονογÏαμμών των συστάδων Ï€Ïοέλευσης και Ï€ÏοοÏισμοÏ" -#: pg_rewind.c:959 +#: pg_rewind.c:982 #, c-format msgid "backup label buffer too small" msgstr "ενδιάμεση μνήμη ετικέτας αντιγÏάφων ασφαλείας Ï€Î¿Î»Ï Î¼Î¹ÎºÏή" -#: pg_rewind.c:982 +#: pg_rewind.c:1005 #, c-format msgid "unexpected control file CRC" msgstr "μη αναμενόμενο αÏχείο ελέγχου CRC" -#: pg_rewind.c:994 +#: pg_rewind.c:1017 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "μη αναμενόμενο μέγεθος αÏχείου ελέγχου %d, αναμένεται %d" -#: pg_rewind.c:1003 +#: pg_rewind.c:1026 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" msgstr[0] "η τιμή του μεγέθους τμήματος WAL Ï€Ïέπει να ανήκει σε δÏναμη του δÏο Î¼ÎµÏ„Î±Î¾Ï 1 MB και 1 GB, αλλά το αÏχείο ελέγχου καθοÏίζει %d byte" msgstr[1] "η τιμή του μεγέθους τμήματος WAL Ï€Ïέπει να ανήκει σε δÏναμη του δÏο Î¼ÎµÏ„Î±Î¾Ï 1 MB και 1 GB, αλλά το αÏχείο ελέγχου καθοÏίζει %d bytes" -#: pg_rewind.c:1042 pg_rewind.c:1112 +#: pg_rewind.c:1065 pg_rewind.c:1135 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "το Ï€ÏόγÏαμμα «%s» απαιτείται από %s αλλά δεν βÏέθηκε στον ίδιο κατάλογο με το «%s»" -#: pg_rewind.c:1045 pg_rewind.c:1115 +#: pg_rewind.c:1068 pg_rewind.c:1138 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "το Ï€ÏόγÏαμμα «%s» βÏέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s" -#: pg_rewind.c:1078 +#: pg_rewind.c:1101 #, c-format msgid "restore_command is not set in the target cluster" msgstr "η εντολή restore_command δεν έχει οÏιστεί στη συστάδα Ï€ÏοοÏισμοÏ" -#: pg_rewind.c:1119 +#: pg_rewind.c:1142 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "εκτέλεση «%s» για την ολοκλήÏωση της αποκατάστασης σφαλμάτων του διακομιστή Ï€ÏοοÏισμοÏ" -#: pg_rewind.c:1156 +#: pg_rewind.c:1180 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "λειτουÏγία μοναδικοÏ-χÏήστη postgres στο σÏμπλεγμα Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Î±Ï€Î­Ï„Ï…Ï‡Îµ" -#: pg_rewind.c:1157 +#: pg_rewind.c:1181 #, c-format msgid "Command was: %s" msgstr "Η εντολή ήταν: %s" @@ -839,95 +829,90 @@ msgstr "μη έγκυÏα δεδομένα στο αÏχείο ιστοÏικο msgid "Timeline IDs must be less than child timeline's ID." msgstr "Τα ID χÏονογÏαμμής Ï€Ïέπει να είναι λιγότεÏα από τα ID της χÏονογÏαμμής απογόνου." -#: xlogreader.c:625 +#: xlogreader.c:626 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "μη έγκυÏη μετατόπιση εγγÏαφών σε %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "μη έγκυÏη μετατόπιση εγγÏαφής σε %X/%X: πεÏίμενε τουλάχιστον %u, έλαβε %u" -#: xlogreader.c:633 +#: xlogreader.c:635 #, c-format msgid "contrecord is requested by %X/%X" msgstr "contrecord ζητείται από %X/%X" -#: xlogreader.c:674 xlogreader.c:1121 +#: xlogreader.c:676 xlogreader.c:1119 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "μη έγκυÏο μήκος εγγÏαφής σε %X/%X: χÏειαζόταν %u, έλαβε %u" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "μη έγκυÏο μήκος εγγÏαφής σε %X/%X: πεÏίμενε τουλάχιστον %u, έλαβε %u" -#: xlogreader.c:703 +#: xlogreader.c:705 #, c-format msgid "out of memory while trying to decode a record of length %u" msgstr "έλλειψη μνήμης κατά την Ï€Ïοσπάθεια αποκωδικοποίησης εγγÏαφής με μήκος %u" -#: xlogreader.c:725 +#: xlogreader.c:727 #, c-format msgid "record length %u at %X/%X too long" msgstr "μήκος εγγÏαφής %u σε %X/%X Ï€Î¿Î»Ï Î¼Î±ÎºÏÏ" -#: xlogreader.c:774 +#: xlogreader.c:776 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "δεν υπάÏχει σημαία contrecord στο %X/%X" -#: xlogreader.c:787 +#: xlogreader.c:789 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "μη έγκυÏο μήκος contrecord %u (αναμένεται %lld) σε %X/%X" -#: xlogreader.c:922 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "λείπει contrecord στο %X/%X" - -#: xlogreader.c:1129 +#: xlogreader.c:1127 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "μη έγκυÏο ID %u διαχειÏιστή πόÏων στο %X/%X" -#: xlogreader.c:1142 xlogreader.c:1158 +#: xlogreader.c:1140 xlogreader.c:1156 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "εγγÏαφή με εσφαλμένο prev-link %X/%X σε %X/%X" -#: xlogreader.c:1194 +#: xlogreader.c:1192 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "εσφαλμένο άθÏοισμα ελέγχου δεδομένων διαχειÏιστή πόÏων σε εγγÏαφή στο %X/%X" -#: xlogreader.c:1231 +#: xlogreader.c:1226 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "μη έγκυÏος μαγικός αÏιθμός %04X στο τμήμα καταγÏαφής %s, μετατόπιση %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "μη έγκυÏος μαγικός αÏιθμός %04X στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u" -#: xlogreader.c:1245 xlogreader.c:1286 +#: xlogreader.c:1241 xlogreader.c:1283 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "μη έγκυÏα info bits %04X στο τμήμα καταγÏαφής %s, μετατόπιση %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "μη έγκυÏα info bits %04X στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u" -#: xlogreader.c:1260 +#: xlogreader.c:1257 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL αÏχείο Ï€ÏοέÏχεται από διαφοÏετικό σÏστημα βάσης δεδομένων: το WAL αναγνωÏιστικό συστήματος βάσης δεδομένων αÏχείων είναι %llu, το pg_control αναγνωÏιστικό συστήματος βάσης δεδομένων είναι %llu" -#: xlogreader.c:1268 +#: xlogreader.c:1265 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL αÏχείο Ï€ÏοέÏχεται από διαφοÏετικό σÏστημα βάσης δεδομένων: εσφαλμένο μέγεθος τμήματος στην κεφαλίδα σελίδας" -#: xlogreader.c:1274 +#: xlogreader.c:1271 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL αÏχείο Ï€ÏοέÏχεται από διαφοÏετικό σÏστημα βάσης δεδομένων: εσφαλμένο XLOG_BLCKSZ στην κεφαλίδα σελίδας" -#: xlogreader.c:1305 +#: xlogreader.c:1303 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "μη αναμενόμενο pageaddr %X/%X στο τμήμα καταγÏαφής %s, μετατόπιση %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "μη αναμενόμενο pageaddr %X/%X στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u" -#: xlogreader.c:1330 +#: xlogreader.c:1329 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "εκτός ακολουθίας ID χÏονογÏαμμής %u (μετά %u) στο τμήμα καταγÏαφής %s, μετατόπιση %u" +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "εκτός ακολουθίας ID χÏονογÏαμμής %u (μετά %u) στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u" #: xlogreader.c:1735 #, c-format @@ -979,38 +964,59 @@ msgstr "μη έγκυÏο block_id %u στο %X/%X" msgid "record with invalid length at %X/%X" msgstr "εγγÏαφή με μη έγκυÏο μήκος στο %X/%X" -#: xlogreader.c:1967 +#: xlogreader.c:1968 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "δεν ήταν δυνατή η εÏÏεση μπλοκ αντιγÏάφου με ID %d στην εγγÏαφή WAL" -#: xlogreader.c:2051 +#: xlogreader.c:2052 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας στο %X/%X με οÏισμένο άκυÏο μπλοκ %d" -#: xlogreader.c:2058 +#: xlogreader.c:2059 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας στο %X/%X με άκυÏη κατάσταση, μπλοκ %d" -#: xlogreader.c:2085 xlogreader.c:2102 +#: xlogreader.c:2086 xlogreader.c:2103 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας σε %X/%X συμπιεσμένη με %s που δεν υποστηÏίζεται από την υλοποίηση, μπλοκ %d" -#: xlogreader.c:2111 +#: xlogreader.c:2112 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας σε %X/%X συμπιεσμένη με άγνωστη μέθοδο, μπλοκ %d" -#: xlogreader.c:2119 +#: xlogreader.c:2120 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "δεν ήταν δυνατή η αποσυμπιέση εικόνας στο %X/%X, μπλοκ %d" +#~ msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform" +#~ msgstr "«%s» είναι ένας συμβολικός σÏνδεσμος, αλλά οι συμβολικοί σÏνδεσμοι δεν υποστηÏίζονται σε αυτήν την πλατφόÏμα" + #~ msgid "You must run %s as the PostgreSQL superuser.\n" #~ msgstr "ΠÏέπει να εκτελέσετε %s ως υπεÏχÏήστης PostgreSQL.\n" +#~ msgid "cannot create restricted tokens on this platform: error code %lu" +#~ msgstr "δεν ήταν δυνατή η δημιουÏγία διακÏιτικών πεÏιοÏÎ¹ÏƒÎ¼Î¿Ï ÏƒÏ„Î·Î½ παÏοÏσα πλατφόÏμα: κωδικός σφάλματος %lu" + +#~ msgid "cannot use restore_command with %%r placeholder" +#~ msgstr "δεν είναι δυνατή η χÏήση restore_command μαζί με %%r placeholder" + +#~ msgid "could not load library \"%s\": error code %lu" +#~ msgstr "δεν ήταν δυνατή η φόÏτωση της βιβλιοθήκης «%s»: κωδικός σφάλματος %lu" + #~ msgid "fatal: " #~ msgstr "κÏίσιμο: " + +#~ msgid "invalid control file" +#~ msgstr "μη έγκυÏο αÏχείο ελέγχου" + +#~ msgid "invalid record offset at %X/%X" +#~ msgstr "μη έγκυÏη μετατόπιση εγγÏαφών σε %X/%X" + +#~ msgid "missing contrecord at %X/%X" +#~ msgstr "λείπει contrecord στο %X/%X" diff --git a/src/bin/pg_rewind/po/es.po b/src/bin/pg_rewind/po/es.po index ea4152f7a9187..794c991edcdc3 100644 --- a/src/bin/pg_rewind/po/es.po +++ b/src/bin/pg_rewind/po/es.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_rewind (PostgreSQL) 16\n" +"Project-Id-Version: pg_rewind (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:22+0000\n" -"PO-Revision-Date: 2023-05-22 12:06+0200\n" +"POT-Creation-Date: 2025-02-16 19:52+0000\n" +"PO-Revision-Date: 2024-11-16 14:24+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -41,6 +41,65 @@ msgstr "detalle: " msgid "hint: " msgstr "consejo: " +#: ../../common/controldata_utils.c:97 file_ops.c:326 file_ops.c:330 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "no se pudo abrir archivo «%s» para lectura: %m" + +#: ../../common/controldata_utils.c:110 file_ops.c:341 local_source.c:104 +#: local_source.c:163 parsexlog.c:371 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "no se pudo leer el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:119 file_ops.c:344 parsexlog.c:373 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: local_source.c:121 local_source.c:172 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "no se pudo cerrar el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "discordancia en orden de bytes" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"posible discordancia en orden de bytes\n" +"El ordenamiento de bytes usado para almacenar el archivo pg_control puede no\n" +"coincidir con el usado por este programa. En tal caso los resultados de abajo\n" +"serían erróneos, y la instalación de PostgreSQL sería incompatible con este\n" +"directorio de datos." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: parsexlog.c:333 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "no se pudo abrir el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:249 file_ops.c:117 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "no se pudo escribir el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format @@ -52,6 +111,38 @@ msgstr "memoria agotada\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "no se puede duplicar un puntero nulo (error interno)\n" +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: ../../fe_utils/archive.c:86 file_ops.c:417 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "no se pudo hacer stat al archivo «%s»: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "esta instalación no soporta el método de sync «%s»" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:388 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "no se pudo abrir el directorio «%s»: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:462 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "no se pudo leer el directorio «%s»: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" + #: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" @@ -64,7 +155,6 @@ msgstr "La cadena termina inesperadamente luego del carácter de escape: «%%»" #: ../../common/percentrepl.c:119 #, c-format -#| msgid "String contains unexpected escape sequence \"%c\"." msgid "String contains unexpected placeholder \"%%%c\"." msgstr "La cadena contiene la secuencia de reemplazo inesperada «%c»." @@ -108,43 +198,58 @@ msgstr "el archivo «%s» tiene tamaño inesperado: %lld en lugar de %lld" msgid "could not open file \"%s\" restored from archive: %m" msgstr "no se pudo abrir el archivo «%s» restaurado del archivo: %m" -#: ../../fe_utils/archive.c:86 file_ops.c:417 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "no se pudo hacer stat al archivo «%s»: %m" - #: ../../fe_utils/archive.c:98 #, c-format -msgid "restore_command failed: %s" -msgstr "restore_command falló: %s" +msgid "\"restore_command\" failed: %s" +msgstr "«restore_command» falló: %s" #: ../../fe_utils/archive.c:105 #, c-format msgid "could not restore file \"%s\" from archive" msgstr "no se pudo recuperar el archivo «%s» del archivo" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 +#: ../../fe_utils/option_utils.c:69 #, c-format -msgid "out of memory" -msgstr "memoria agotada" +msgid "invalid value \"%s\" for option %s" +msgstr "el valor «%s» no es válido para la opción %s" -#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312 +#: ../../fe_utils/option_utils.c:76 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "no se pudo abrir el archivo «%s»: %m" +msgid "%s must be in range %d..%d" +msgstr "%s debe estar en el rango %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "método sync no reconocido: %s" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 +#, c-format +msgid "out of memory" +msgstr "memoria agotada" -#: ../../fe_utils/recovery_gen.c:124 +#: ../../fe_utils/recovery_gen.c:143 #, c-format msgid "could not write to file \"%s\": %m" msgstr "no se pudo escribir a archivo «%s»: %m" -#: ../../fe_utils/recovery_gen.c:133 +#: ../../fe_utils/recovery_gen.c:152 #, c-format msgid "could not create file \"%s\": %m" msgstr "no se pudo crear archivo «%s»: %m" +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "el argumento de la orden de shell contiene un salto de línea o retorno de carro: «%s»\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "el nombre de base de datos contiene un salto de línea o retorno de carro: «%s»\n" + #: file_ops.c:67 #, c-format msgid "could not open target file \"%s\": %m" @@ -160,11 +265,6 @@ msgstr "no se pudo cerrar el archivo de destino «%s»: %m" msgid "could not seek in target file \"%s\": %m" msgstr "no se pudo posicionar en archivo de destino «%s»: %m" -#: file_ops.c:117 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "no se pudo escribir el archivo «%s»: %m" - #: file_ops.c:150 file_ops.c:177 #, c-format msgid "undefined file type for \"%s\"" @@ -210,26 +310,6 @@ msgstr "no se pudo crear el link simbólico en «%s»: %m" msgid "could not remove symbolic link \"%s\": %m" msgstr "no se pudo eliminar el enlace simbólico «%s»: %m" -#: file_ops.c:326 file_ops.c:330 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "no se pudo abrir archivo «%s» para lectura: %m" - -#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "no se pudo leer el archivo «%s»: %m" - -#: file_ops.c:344 parsexlog.c:352 -#, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu" - -#: file_ops.c:388 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "no se pudo abrir el directorio «%s»: %m" - #: file_ops.c:441 #, c-format msgid "could not read symbolic link \"%s\": %m" @@ -240,162 +320,157 @@ msgstr "no se pudo leer el enlace simbólico «%s»: %m" msgid "symbolic link \"%s\" target is too long" msgstr "la ruta «%s» del enlace simbólico es demasiado larga" -#: file_ops.c:462 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "no se pudo leer el directorio «%s»: %m" - #: file_ops.c:466 #, c-format msgid "could not close directory \"%s\": %m" msgstr "no se pudo abrir el directorio «%s»: %m" -#: filemap.c:236 +#: filemap.c:297 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "el archivo de datos «%s» en el origen no es un archivo regular" -#: filemap.c:241 filemap.c:274 +#: filemap.c:302 filemap.c:335 #, c-format msgid "duplicate source file \"%s\"" msgstr "archivo origen duplicado «%s»" -#: filemap.c:329 +#: filemap.c:390 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "modificación de página inesperada para el archivo no regular «%s»" -#: filemap.c:679 filemap.c:773 +#: filemap.c:744 filemap.c:846 #, c-format msgid "unknown file type for \"%s\"" msgstr "tipo de archivo desconocido para «%s»" -#: filemap.c:706 +#: filemap.c:779 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "el archivo «%s» tiene un tipo diferente en el origen y en el destino" -#: filemap.c:778 +#: filemap.c:851 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "no se pudo decidir qué hacer con el archivo «%s»" -#: libpq_source.c:130 +#: libpq_source.c:131 #, c-format -msgid "could not clear search_path: %s" -msgstr "no se pudo limpiar search_path: %s" +msgid "could not clear \"search_path\": %s" +msgstr "no se pudo limpiar «search_path»: %s" -#: libpq_source.c:141 +#: libpq_source.c:142 #, c-format -msgid "full_page_writes must be enabled in the source server" -msgstr "full_page_writes debe estar activado en el servidor de origen" +msgid "\"full_page_writes\" must be enabled in the source server" +msgstr "«full_page_writes» debe estar activado en el servidor de origen" -#: libpq_source.c:152 +#: libpq_source.c:153 #, c-format msgid "could not prepare statement to fetch file contents: %s" msgstr "no se pudo preparar sentencia para obtener el contenido del archivo: %s" -#: libpq_source.c:171 +#: libpq_source.c:172 #, c-format msgid "error running query (%s) on source server: %s" msgstr "error ejecutando consulta (%s) en el servidor de origen: %s" -#: libpq_source.c:176 +#: libpq_source.c:177 #, c-format msgid "unexpected result set from query" msgstr "conjunto de resultados inesperados de la consulta" -#: libpq_source.c:198 +#: libpq_source.c:199 #, c-format msgid "error running query (%s) in source server: %s" msgstr "error ejecutando consulta (%s) en el servidor de origen: %s" -#: libpq_source.c:219 +#: libpq_source.c:220 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "resultado «%s» no reconocido para la ubicación de inserción WAL actual" -#: libpq_source.c:270 +#: libpq_source.c:271 #, c-format msgid "could not fetch file list: %s" msgstr "no se pudo obtener el listado de archivos: %s" -#: libpq_source.c:275 +#: libpq_source.c:276 #, c-format msgid "unexpected result set while fetching file list" msgstr "conjunto de resultados inesperado mientras se obtenía el listado de archivos" -#: libpq_source.c:467 +#: libpq_source.c:477 #, c-format msgid "could not send query: %s" msgstr "no se pudo enviar la consulta: %s" -#: libpq_source.c:470 +#: libpq_source.c:480 #, c-format msgid "could not set libpq connection to single row mode" msgstr "no se pudo establecer la coneción libpq a modo «single row»" -#: libpq_source.c:500 +#: libpq_source.c:510 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "resultados inesperados mientras se obtenían archivos remotos: %s" -#: libpq_source.c:505 +#: libpq_source.c:515 #, c-format msgid "received more data chunks than requested" msgstr "se recibieron más trozos de datos que los solicitados" -#: libpq_source.c:509 +#: libpq_source.c:519 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "tamaño del conjunto de resultados inesperado mientras se obtenían archivos remotos" -#: libpq_source.c:515 +#: libpq_source.c:525 #, c-format msgid "unexpected data types in result set while fetching remote files: %u %u %u" msgstr "tipos de dato inesperados en el conjunto de resultados mientras se obtenían archivos remotos: %u %u %u" -#: libpq_source.c:523 +#: libpq_source.c:533 #, c-format msgid "unexpected result format while fetching remote files" msgstr "formato de resultados inesperado mientras se obtenían archivos remotos" -#: libpq_source.c:529 +#: libpq_source.c:539 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "valores nulos inesperados en el resultado mientras se obtenían archivos remotos" -#: libpq_source.c:533 +#: libpq_source.c:543 #, c-format msgid "unexpected result length while fetching remote files" msgstr "largo del resultado inesperado mientras se obtenían los archivos remotos" -#: libpq_source.c:566 +#: libpq_source.c:576 #, c-format msgid "received data for file \"%s\", when requested for \"%s\"" msgstr "se recibieron datos para el archivo «%s», cuando se solicitó para «%s»" -#: libpq_source.c:570 +#: libpq_source.c:580 #, c-format msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" msgstr "se recibieron datos en la posición %lld del archivo «%s», cuando se solicitó para la posición %lld" -#: libpq_source.c:582 +#: libpq_source.c:592 #, c-format msgid "received more than requested for file \"%s\"" msgstr "se recibió más de lo solicitado para el archivo «%s»" -#: libpq_source.c:595 +#: libpq_source.c:605 #, c-format msgid "unexpected number of data chunks received" msgstr "se recibió un número inesperado de trozos de datos" -#: libpq_source.c:638 +#: libpq_source.c:648 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "no se pudo obtener el archivo remoto «%s»: %s" -#: libpq_source.c:643 +#: libpq_source.c:653 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "conjunto de resultados inesperado mientras se obtenía el archivo remoto «%s»" @@ -410,11 +485,6 @@ msgstr "no se pudo abrir el archivo de origen «%s»: %m" msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied" msgstr "el tamaño del archivo de origen «%s» cambió concurrentemente: se esperaban %d bytes, se copiaron %d" -#: local_source.c:121 local_source.c:172 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "no se pudo cerrar el archivo «%s»: %m" - #: local_source.c:146 #, c-format msgid "could not seek in source file: %m" @@ -425,7 +495,7 @@ msgstr "no se pudo posicionar en archivo de origen: %m" msgid "unexpected EOF while reading file \"%s\"" msgstr "EOF inesperado mientras se leía el archivo «%s»" -#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199 +#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:201 #, c-format msgid "out of memory while allocating a WAL reading processor" msgstr "memoria agotada mientras se emplazaba un procesador de lectura de WAL" @@ -445,27 +515,27 @@ msgstr "no se pudo leer el registro WAL en %X/%X" msgid "end pointer %X/%X is not a valid end point; expected %X/%X" msgstr "el puntero de término %X/%X no es un punto válido; se esperaba %X/%X" -#: parsexlog.c:212 +#: parsexlog.c:214 #, c-format msgid "could not find previous WAL record at %X/%X: %s" msgstr "no se pudo encontrar el registro WAL anterior en %X/%X: %s" -#: parsexlog.c:216 +#: parsexlog.c:218 #, c-format msgid "could not find previous WAL record at %X/%X" msgstr "no se pudo encontrar el registro WAL anterior en %X/%X" -#: parsexlog.c:341 +#: parsexlog.c:362 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "no se pudo posicionar (seek) el archivo «%s»: %m" -#: parsexlog.c:440 +#: parsexlog.c:461 #, c-format msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" msgstr "el registro WAL modifica una relación, pero el tipo de registro no es reconocido: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" -#: pg_rewind.c:92 +#: pg_rewind.c:94 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" @@ -474,7 +544,7 @@ msgstr "" "%s resincroniza un cluster PostgreSQL con otra copia del cluster.\n" "\n" -#: pg_rewind.c:93 +#: pg_rewind.c:95 #, c-format msgid "" "Usage:\n" @@ -485,53 +555,53 @@ msgstr "" " %s [OPCION]...\n" "\n" -#: pg_rewind.c:94 +#: pg_rewind.c:96 #, c-format msgid "Options:\n" msgstr "Opciones:\n" -#: pg_rewind.c:95 +#: pg_rewind.c:97 #, c-format msgid "" -" -c, --restore-target-wal use restore_command in target configuration to\n" +" -c, --restore-target-wal use \"restore_command\" in target configuration to\n" " retrieve WAL files from archives\n" msgstr "" -" -c, --restore-target-wal utilizar restore_command de la configuración\n" +" -c, --restore-target-wal utilizar «restore_command» de la configuración\n" " de destino para obtener archivos WAL\n" -#: pg_rewind.c:97 +#: pg_rewind.c:99 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=DIRECTORIO directorio de datos existente a modificar\n" -#: pg_rewind.c:98 +#: pg_rewind.c:100 #, c-format msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" msgstr " --source-pgdata=DIRECTORIO directorio de datos de origen a sincronizar\n" -#: pg_rewind.c:99 +#: pg_rewind.c:101 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr " --source-server=CONN servidor de origen a sincronizar\n" -#: pg_rewind.c:100 +#: pg_rewind.c:102 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run detener antes de modificar nada\n" -#: pg_rewind.c:101 +#: pg_rewind.c:103 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" " safely to disk\n" msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n" -#: pg_rewind.c:103 +#: pg_rewind.c:105 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress escribir mensajes de progreso\n" -#: pg_rewind.c:104 +#: pg_rewind.c:106 #, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" @@ -540,7 +610,7 @@ msgstr "" " -R, --write-recovery-conf escribe configuración para replicación\n" " (requiere --source-server)\n" -#: pg_rewind.c:106 +#: pg_rewind.c:108 #, c-format msgid "" " --config-file=FILENAME use specified main server configuration\n" @@ -549,29 +619,34 @@ msgstr "" " --config-file=ARCHIVO utilizar el archivo de configuración del servidor\n" " principal especificado al ejecutar el clúster de destino\n" -#: pg_rewind.c:108 +#: pg_rewind.c:110 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug escribir muchos mensajes de depuración\n" -#: pg_rewind.c:109 +#: pg_rewind.c:111 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" msgstr "" " --no-ensure-shutdown no corregir automáticamente un apagado\n" " no-limpio\n" -#: pg_rewind.c:110 +#: pg_rewind.c:112 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=MÉTODO definir el método para sincr. archivos a disco\n" + +#: pg_rewind.c:113 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión y salir\n" -#: pg_rewind.c:111 +#: pg_rewind.c:114 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: pg_rewind.c:112 +#: pg_rewind.c:115 #, c-format msgid "" "\n" @@ -580,425 +655,420 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: pg_rewind.c:113 +#: pg_rewind.c:116 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245 -#: pg_rewind.c:252 pg_rewind.c:260 +#: pg_rewind.c:232 pg_rewind.c:240 pg_rewind.c:247 pg_rewind.c:254 +#: pg_rewind.c:261 pg_rewind.c:269 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: pg_rewind.c:230 +#: pg_rewind.c:239 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "no se especificó origen (--source-pgdata o --source-server)" -#: pg_rewind.c:237 +#: pg_rewind.c:246 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "sólo uno de --source-pgdata o --source-server puede ser especificado" -#: pg_rewind.c:244 +#: pg_rewind.c:253 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "no se especificó directorio de datos de destino (--target-pgdata)" -#: pg_rewind.c:251 +#: pg_rewind.c:260 #, c-format msgid "no source server information (--source-server) specified for --write-recovery-conf" msgstr "no se especificó información de servidor de origen (--source-server) para --write-recovery-conf" -#: pg_rewind.c:258 +#: pg_rewind.c:267 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: pg_rewind.c:273 +#: pg_rewind.c:282 #, c-format msgid "cannot be executed by \"root\"" msgstr "no puede ser ejecutado por «root»" -#: pg_rewind.c:274 +#: pg_rewind.c:283 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Debe ejecutar %s con el superusuario de PostgreSQL." -#: pg_rewind.c:284 +#: pg_rewind.c:293 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "no se pudo obtener los permisos del directorio «%s»: %m" -#: pg_rewind.c:302 +#: pg_rewind.c:311 #, c-format msgid "%s" msgstr "%s" -#: pg_rewind.c:305 +#: pg_rewind.c:314 #, c-format msgid "connected to server" msgstr "conectado al servidor" -#: pg_rewind.c:366 +#: pg_rewind.c:375 #, c-format msgid "source and target cluster are on the same timeline" msgstr "el cluster de origen y destino están en el mismo timeline" -#: pg_rewind.c:387 +#: pg_rewind.c:396 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "servidores divergieron en la posición de WAL %X/%X en el timeline %u" -#: pg_rewind.c:442 +#: pg_rewind.c:451 #, c-format msgid "no rewind required" msgstr "no se requiere rebobinar" -#: pg_rewind.c:451 +#: pg_rewind.c:463 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "rebobinando desde el último checkpoint común en %X/%X en el timeline %u" -#: pg_rewind.c:461 +#: pg_rewind.c:473 #, c-format msgid "reading source file list" msgstr "leyendo la lista de archivos de origen" -#: pg_rewind.c:465 +#: pg_rewind.c:477 #, c-format msgid "reading target file list" msgstr "leyendo la lista de archivos de destino" -#: pg_rewind.c:474 +#: pg_rewind.c:486 #, c-format msgid "reading WAL in target" msgstr "leyendo WAL en destino" -#: pg_rewind.c:495 +#: pg_rewind.c:507 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "se necesitan copiar %lu MB (tamaño total de directorio de origen es %lu MB)" -#: pg_rewind.c:513 +#: pg_rewind.c:525 #, c-format msgid "syncing target data directory" msgstr "sincronizando directorio de datos de destino" -#: pg_rewind.c:529 +#: pg_rewind.c:541 #, c-format msgid "Done!" msgstr "¡Listo!" -#: pg_rewind.c:609 +#: pg_rewind.c:621 #, c-format msgid "no action decided for file \"%s\"" msgstr "no se decidió una acción para el archivo «%s»" -#: pg_rewind.c:641 +#: pg_rewind.c:653 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "el sistema origen fue modificado mientras pg_rewind estaba en ejecución" -#: pg_rewind.c:645 +#: pg_rewind.c:657 #, c-format msgid "creating backup label and updating control file" msgstr "creando etiqueta de respaldo y actualizando archivo de control" -#: pg_rewind.c:695 +#: pg_rewind.c:707 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "el sistema origen estaba en un estado inesperado al final del rebobinado" -#: pg_rewind.c:727 +#: pg_rewind.c:739 #, c-format msgid "source and target clusters are from different systems" msgstr "clusters de origen y destino son de sistemas diferentes" -#: pg_rewind.c:735 +#: pg_rewind.c:747 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "los clusters no son compatibles con esta versión de pg_rewind" -#: pg_rewind.c:745 +#: pg_rewind.c:757 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "el servidor de destino necesita tener sumas de verificación de datos o «wal_log_hints» activados" -#: pg_rewind.c:756 +#: pg_rewind.c:768 #, c-format msgid "target server must be shut down cleanly" msgstr "el directorio de destino debe estar apagado limpiamente" -#: pg_rewind.c:766 +#: pg_rewind.c:778 #, c-format msgid "source data directory must be shut down cleanly" msgstr "el directorio de origen debe estar apagado limpiamente" -#: pg_rewind.c:813 +#: pg_rewind.c:825 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s kB (%d%%) copiados" -#: pg_rewind.c:941 +#: pg_rewind.c:951 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "no se pudo encontrar un ancestro común en el timeline de los clusters de origen y destino" -#: pg_rewind.c:982 +#: pg_rewind.c:992 #, c-format msgid "backup label buffer too small" msgstr "el búfer del backup label es demasiado pequeño" -#: pg_rewind.c:1005 +#: pg_rewind.c:1015 #, c-format msgid "unexpected control file CRC" msgstr "CRC de archivo de control inesperado" -#: pg_rewind.c:1017 +#: pg_rewind.c:1027 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "tamaño del archivo de control %d inesperado, se esperaba %d" -#: pg_rewind.c:1026 +#: pg_rewind.c:1037 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" -msgstr[0] "El tamaño del segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el archivo de control especifica %d byte" -msgstr[1] "El tamaño del segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero el archivo de control especifica %d bytes" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "tamaño de segmento de WAL no válido (%d byte) en archivo de control" +msgstr[1] "tamaño de segmento de WAL no válido (%d bytes) en archivo de control" -#: pg_rewind.c:1065 pg_rewind.c:1135 +#: pg_rewind.c:1041 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "El tamaño de segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB." + +#: pg_rewind.c:1078 pg_rewind.c:1146 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "el programa «%s» es requerido por %s, pero no se encontró en el mismo directorio que «%s»" -#: pg_rewind.c:1068 pg_rewind.c:1138 +#: pg_rewind.c:1081 pg_rewind.c:1149 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "el programa «%s» fue encontrado por «%s» pero no es de la misma versión que %s" -#: pg_rewind.c:1101 +#: pg_rewind.c:1110 +#, c-format +msgid "could not read restore_command from target cluster" +msgstr "no se pudo leer restore_command en el clúster de destino" + +#: pg_rewind.c:1115 #, c-format -msgid "restore_command is not set in the target cluster" -msgstr "restore_command no está definido en el clúster de destino" +msgid "\"restore_command\" is not set in the target cluster" +msgstr "«restore_command» no está definido en el clúster de destino" -#: pg_rewind.c:1142 +#: pg_rewind.c:1153 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "ejecutando «%s» en el servidor de destino para completar la recuperación de caídas" -#: pg_rewind.c:1180 +#: pg_rewind.c:1191 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "el modo «single-user» en el servidor de destino falló" -#: pg_rewind.c:1181 +#: pg_rewind.c:1192 #, c-format msgid "Command was: %s" msgstr "La orden era: % s" -#: timeline.c:75 timeline.c:81 +#: timeline.c:74 timeline.c:80 #, c-format msgid "syntax error in history file: %s" msgstr "error de sintaxis en archivo de historia: %s" -#: timeline.c:76 +#: timeline.c:75 #, c-format msgid "Expected a numeric timeline ID." msgstr "Se esperaba un ID numérico de timeline." -#: timeline.c:82 +#: timeline.c:81 #, c-format msgid "Expected a write-ahead log switchpoint location." msgstr "Se esperaba una ubicación de punto de cambio del «write-ahead log»." -#: timeline.c:87 +#: timeline.c:86 #, c-format msgid "invalid data in history file: %s" msgstr "datos no válidos en archivo de historia: %s" -#: timeline.c:88 +#: timeline.c:87 #, c-format msgid "Timeline IDs must be in increasing sequence." msgstr "IDs de timeline deben ser una secuencia creciente." -#: timeline.c:108 +#: timeline.c:107 #, c-format msgid "invalid data in history file" msgstr "datos no válidos en archivo de historia" -#: timeline.c:109 +#: timeline.c:108 #, c-format msgid "Timeline IDs must be less than child timeline's ID." msgstr "IDs de timeline deben ser menores que el ID de timeline del hijo." -#: xlogreader.c:626 +#: xlogreader.c:619 #, c-format msgid "invalid record offset at %X/%X: expected at least %u, got %u" msgstr "desplazamiento de registro no válido en %X/%X: se esperaba al menos %u, se obtuvo %u" -#: xlogreader.c:635 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "contrecord solicitado por %X/%X" -#: xlogreader.c:676 xlogreader.c:1123 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "largo de registro no válido en %X/%X: se esperaba al menos %u, se obtuvo %u" -#: xlogreader.c:705 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "memoria agotada mientras se intentaba decodificar un registro de largo %u" - -#: xlogreader.c:727 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "largo de registro %u en %X/%X demasiado largo" - -#: xlogreader.c:776 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "no hay bandera de contrecord en %X/%X" -#: xlogreader.c:789 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "largo de contrecord %u no válido (se esperaba %lld) en %X/%X" -#: xlogreader.c:924 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "falta un contrecord en %X/%X" - -#: xlogreader.c:1131 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ID de gestor de recursos %u no válido en %X/%X" -#: xlogreader.c:1144 xlogreader.c:1160 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "registro con prev-link %X/%X incorrecto en %X/%X" -#: xlogreader.c:1196 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "suma de verificación de los datos del gestor de recursos incorrecta en el registro en %X/%X" -#: xlogreader.c:1230 +#: xlogreader.c:1243 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "número mágico %04X no válido en segmento WAL %s, LSN %X/%X, posición %u" -#: xlogreader.c:1245 xlogreader.c:1287 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "info bits %04X no válidos en segment WAL %s, LSN %X/%X, posición %u" -#: xlogreader.c:1261 +#: xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "archivo WAL es de un sistema de bases de datos distinto: identificador de sistema en archivo WAL es %llu, identificador en pg_control es %llu" -#: xlogreader.c:1269 +#: xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "archivo WAL es de un sistema de bases de datos distinto: tamaño de segmento incorrecto en cabecera de paǵina" -#: xlogreader.c:1275 +#: xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "archivo WAL es de un sistema de bases de datos distinto: XLOG_BLCKSZ incorrecto en cabecera de paǵina" -#: xlogreader.c:1307 +#: xlogreader.c:1320 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "pageaddr %X/%X inesperado en segmento WAL %s, LSN %X/%X, posición %u" -#: xlogreader.c:1333 +#: xlogreader.c:1346 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "ID de timeline %u fuera de secuencia (después de %u) en segmento WAL %s, LSN %X/%X, posición %u" -#: xlogreader.c:1739 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u fuera de orden en %X/%X" -#: xlogreader.c:1763 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA está definido, pero no hay datos en %X/%X" -#: xlogreader.c:1770 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA no está definido, pero el largo de los datos es %u en %X/%X" -#: xlogreader.c:1806 +#: xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE está definido, pero posición del agujero es %u largo %u largo de imagen %u en %X/%X" -#: xlogreader.c:1822 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE no está definido, pero posición del agujero es %u largo %u en %X/%X" -#: xlogreader.c:1836 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED definido, pero largo de imagen de bloque es %u en %X/%X" -#: xlogreader.c:1851 +#: xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED están definidos, pero el largo de imagen de bloque es %u en %X/%X" -#: xlogreader.c:1867 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL está definido, pero no hay «rel» anterior en %X/%X " -#: xlogreader.c:1879 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "block_id %u no válido en %X/%X" -#: xlogreader.c:1946 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "registro con largo no válido en %X/%X" -#: xlogreader.c:1972 +#: xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "no se pudo localizar un bloque de respaldo con ID %d en el registro WAL" -#: xlogreader.c:2056 +#: xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "no se pudo restaurar la imagen en %X/%X con bloque especificado %d no válido" -#: xlogreader.c:2063 +#: xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "no se pudo restaurar la imagen en %X/%X con estado no válido, bloque %d" -#: xlogreader.c:2090 xlogreader.c:2107 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "no se pudo restaurar la imagen en %X/%X comprimida con %s que no está soportado por esta instalación, bloque %d" -#: xlogreader.c:2116 +#: xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "no se pudo restaurar la imagen en %X/%X comprimida con un método desconocido, bloque %d" -#: xlogreader.c:2124 +#: xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "no se pudo descomprimir la imagen en %X/%X, bloque %d" diff --git a/src/bin/pg_rewind/po/fr.po b/src/bin/pg_rewind/po/fr.po index fda28699efe13..da4f2e145203e 100644 --- a/src/bin/pg_rewind/po/fr.po +++ b/src/bin/pg_rewind/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-26 08:20+0000\n" -"PO-Revision-Date: 2022-09-26 14:16+0200\n" +"POT-Creation-Date: 2024-08-29 17:53+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.1.1\n" +"X-Generator: Poedit 3.5\n" #: ../../../src/common/logging.c:276 #, c-format @@ -41,109 +41,215 @@ msgstr "détail : " msgid "hint: " msgstr "astuce : " +#: ../../common/controldata_utils.c:97 file_ops.c:326 file_ops.c:330 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" + +#: ../../common/controldata_utils.c:110 file_ops.c:341 local_source.c:104 +#: local_source.c:163 parsexlog.c:350 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "n'a pas pu lire le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:119 file_ops.c:344 parsexlog.c:352 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: local_source.c:121 local_source.c:172 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "n'a pas pu fermer le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "différence de l'ordre des octets" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"possible incohérence dans l'ordre des octets\n" +"L'ordre des octets utilisé pour enregistrer le fichier pg_control peut ne\n" +"pas correspondre à celui utilisé par ce programme. Dans ce cas, les\n" +"résultats ci-dessous sont incorrects, et l'installation de PostgreSQL\n" +"est incompatible avec ce répertoire des données." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: parsexlog.c:312 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:249 file_ops.c:117 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "impossible d'écrire le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "mémoire épuisée\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" -#: ../../common/restricted_token.c:64 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: ../../fe_utils/archive.c:86 file_ops.c:417 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "n'a pas pu tester le fichier « %s » : %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "cette construction ne supporte pas la méthode de synchronisation « %s »" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:388 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:462 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "n'a pas pu lire le répertoire « %s » : %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" + +#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118 +#, c-format +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "valeur invalide pour le paramètre « %s » : « %s »" + +#: ../../common/percentrepl.c:80 #, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "n'a pas pu charger la bibliothèque « %s » : code d'erreur %lu" +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "La chaîne se termine de façon inattendue après le caractère d'échappement : « %% »" -#: ../../common/restricted_token.c:73 +#: ../../common/percentrepl.c:119 #, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "ne peut pas créer les jetons restreints sur cette plateforme : code d'erreur %lu" +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "La chaîne contient un joker inattendu « %%%c »." -#: ../../common/restricted_token.c:82 +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "n'a pas pu ouvrir le jeton du processus : code d'erreur %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "n'a pas pu allouer les SID : code d'erreur %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "n'a pas pu créer le jeton restreint : code d'erreur %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu" -#: ../../fe_utils/archive.c:52 -#, c-format -msgid "cannot use restore_command with %%r placeholder" -msgstr "ne peut pas utiliser restore_command avec le joker %%r" - -#: ../../fe_utils/archive.c:70 +#: ../../fe_utils/archive.c:69 #, c-format msgid "unexpected file size for \"%s\": %lld instead of %lld" msgstr "taille de fichier inattendu pour « %s » : %lld au lieu de %lld" -#: ../../fe_utils/archive.c:78 +#: ../../fe_utils/archive.c:77 #, c-format msgid "could not open file \"%s\" restored from archive: %m" msgstr "n'a pas pu ouvrir le fichier « %s » à partir de l'archive : %m" -#: ../../fe_utils/archive.c:87 file_ops.c:417 +#: ../../fe_utils/archive.c:98 #, c-format -msgid "could not stat file \"%s\": %m" -msgstr "n'a pas pu tester le fichier « %s » : %m" +msgid "\"restore_command\" failed: %s" +msgstr "échec de « restore_command » : %s" -#: ../../fe_utils/archive.c:99 -#, c-format -msgid "restore_command failed: %s" -msgstr "échec de la restore_command : %s" - -#: ../../fe_utils/archive.c:106 +#: ../../fe_utils/archive.c:105 #, c-format msgid "could not restore file \"%s\" from archive" msgstr "n'a pas pu restaurer le fichier « %s » à partir de l'archive" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 +#: ../../fe_utils/option_utils.c:69 #, c-format -msgid "out of memory" -msgstr "mémoire épuisée" +msgid "invalid value \"%s\" for option %s" +msgstr "valeur « %s » invalide pour l'option %s" -#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312 +#: ../../fe_utils/option_utils.c:76 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "n'a pas pu ouvrir le fichier « %s » : %m" +msgid "%s must be in range %d..%d" +msgstr "%s doit être compris entre %d et %d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "méthode de synchronisation non reconnu : %s" -#: ../../fe_utils/recovery_gen.c:124 +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 +#, c-format +msgid "out of memory" +msgstr "mémoire épuisée" + +#: ../../fe_utils/recovery_gen.c:143 #, c-format msgid "could not write to file \"%s\": %m" msgstr "n'a pas pu écrire dans le fichier « %s » : %m" -#: ../../fe_utils/recovery_gen.c:133 +#: ../../fe_utils/recovery_gen.c:152 #, c-format msgid "could not create file \"%s\": %m" msgstr "n'a pas pu créer le fichier « %s » : %m" +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "l'argument de la commande shell contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "le nom de la base contient un retour à la ligne ou un retour chariot : « %s »\n" + #: file_ops.c:67 #, c-format msgid "could not open target file \"%s\": %m" @@ -159,11 +265,6 @@ msgstr "n'a pas pu fermer le fichier cible « %s » : %m" msgid "could not seek in target file \"%s\": %m" msgstr "n'a pas pu chercher dans le fichier cible « %s » : %m" -#: file_ops.c:117 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "impossible d'écrire le fichier « %s » : %m" - #: file_ops.c:150 file_ops.c:177 #, c-format msgid "undefined file type for \"%s\"" @@ -182,7 +283,7 @@ msgstr "n'a pas pu supprimer le fichier « %s » : %m" #: file_ops.c:218 #, c-format msgid "could not open file \"%s\" for truncation: %m" -msgstr "n'a pas pu ouvrir le fichier « %s » pour le troncage : %m" +msgstr "n'a pas pu ouvrir le fichier « %s » pour le tronquage : %m" #: file_ops.c:222 #, c-format @@ -209,197 +310,167 @@ msgstr "n'a pas pu créer le lien symbolique à « %s » : %m" msgid "could not remove symbolic link \"%s\": %m" msgstr "n'a pas pu supprimer le lien symbolique « %s » : %m" -#: file_ops.c:326 file_ops.c:330 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" - -#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "n'a pas pu lire le fichier « %s » : %m" - -#: file_ops.c:344 parsexlog.c:352 -#, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" - -#: file_ops.c:388 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" - -#: file_ops.c:446 +#: file_ops.c:441 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "n'a pas pu lire le lien symbolique « %s » : %m" -#: file_ops.c:449 +#: file_ops.c:444 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "la cible du lien symbolique « %s » est trop longue" -#: file_ops.c:464 -#, c-format -msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform" -msgstr "« %s » est un lien symbolique mais les liens symboliques ne sont pas supportés sur cette plateforme" - -#: file_ops.c:471 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "n'a pas pu lire le répertoire « %s » : %m" - -#: file_ops.c:475 +#: file_ops.c:466 #, c-format msgid "could not close directory \"%s\": %m" msgstr "n'a pas pu fermer le répertoire « %s » : %m" -#: filemap.c:236 +#: filemap.c:235 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "le fichier de données « %s » en source n'est pas un fichier standard" -#: filemap.c:241 filemap.c:274 +#: filemap.c:240 filemap.c:273 #, c-format msgid "duplicate source file \"%s\"" msgstr "fichier source « %s » dupliqué" -#: filemap.c:329 +#: filemap.c:328 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "modification inattendue de page pour le fichier non standard « %s »" -#: filemap.c:679 filemap.c:773 +#: filemap.c:682 filemap.c:776 #, c-format msgid "unknown file type for \"%s\"" msgstr "type de fichier inconnu pour « %s »" -#: filemap.c:706 +#: filemap.c:709 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "le fichier « %s » a un type différent pour la source et la cible" -#: filemap.c:778 +#: filemap.c:781 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "n'a pas pu décider que faire avec le fichier « %s » : %m" -#: libpq_source.c:130 +#: libpq_source.c:131 #, c-format -msgid "could not clear search_path: %s" -msgstr "n'a pas pu effacer search_path : %s" +msgid "could not clear \"search_path\": %s" +msgstr "n'a pas pu effacer « search_path » : %s" -#: libpq_source.c:141 +#: libpq_source.c:142 #, c-format -msgid "full_page_writes must be enabled in the source server" -msgstr "full_page_writes doit être activé sur le serveur source" +msgid "\"full_page_writes\" must be enabled in the source server" +msgstr "« full_page_writes » doit être activé sur le serveur source" -#: libpq_source.c:152 +#: libpq_source.c:153 #, c-format msgid "could not prepare statement to fetch file contents: %s" msgstr "n'a pas pu préparer l'instruction pour récupérer le contenu du fichier : %s" -#: libpq_source.c:171 +#: libpq_source.c:172 #, c-format msgid "error running query (%s) on source server: %s" msgstr "erreur lors de l'exécution de la requête (%s) sur le serveur source : %s" -#: libpq_source.c:176 +#: libpq_source.c:177 #, c-format msgid "unexpected result set from query" msgstr "ensemble de résultats inattendu provenant de la requête" -#: libpq_source.c:198 +#: libpq_source.c:199 #, c-format msgid "error running query (%s) in source server: %s" msgstr "erreur lors de l'exécution de la requête (%s) dans le serveur source : %s" -#: libpq_source.c:219 +#: libpq_source.c:220 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "résultat non reconnu « %s » pour l'emplacement d'insertion actuel dans les WAL" -#: libpq_source.c:270 +#: libpq_source.c:271 #, c-format msgid "could not fetch file list: %s" msgstr "n'a pas pu récupérer la liste des fichiers : %s" -#: libpq_source.c:275 +#: libpq_source.c:276 #, c-format msgid "unexpected result set while fetching file list" msgstr "ensemble de résultats inattendu lors de la récupération de la liste des fichiers" -#: libpq_source.c:467 +#: libpq_source.c:477 #, c-format msgid "could not send query: %s" msgstr "n'a pas pu envoyer la requête : %s" -#: libpq_source.c:470 +#: libpq_source.c:480 #, c-format msgid "could not set libpq connection to single row mode" msgstr "n'a pas pu configurer la connexion libpq en mode ligne seule" -#: libpq_source.c:500 +#: libpq_source.c:510 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "résultat inattendu lors de la récupération des fichiers cibles : %s" -#: libpq_source.c:505 +#: libpq_source.c:515 #, c-format msgid "received more data chunks than requested" msgstr "a reçu plus de morceaux de données que demandé" -#: libpq_source.c:509 +#: libpq_source.c:519 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "taille inattendue de l'ensemble de résultats lors de la récupération des fichiers distants" -#: libpq_source.c:515 +#: libpq_source.c:525 #, c-format msgid "unexpected data types in result set while fetching remote files: %u %u %u" msgstr "types de données inattendus dans l'ensemble de résultats lors de la récupération des fichiers distants : %u %u %u" -#: libpq_source.c:523 +#: libpq_source.c:533 #, c-format msgid "unexpected result format while fetching remote files" msgstr "format de résultat inattendu lors de la récupération des fichiers distants" -#: libpq_source.c:529 +#: libpq_source.c:539 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "valeurs NULL inattendues dans le résultat lors de la récupération des fichiers distants" -#: libpq_source.c:533 +#: libpq_source.c:543 #, c-format msgid "unexpected result length while fetching remote files" msgstr "longueur de résultats inattendu lors de la récupération des fichiers distants" -#: libpq_source.c:566 +#: libpq_source.c:576 #, c-format msgid "received data for file \"%s\", when requested for \"%s\"" msgstr "a reçu des données du fichier « %s » alors que « %s » était demandé" -#: libpq_source.c:570 +#: libpq_source.c:580 #, c-format msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" msgstr "a reçu des données au décalage %lld du fichier « %s » alors que le décalage %lld était demandé" -#: libpq_source.c:582 +#: libpq_source.c:592 #, c-format msgid "received more than requested for file \"%s\"" msgstr "a reçu plus que demandé pour le fichier « %s »" -#: libpq_source.c:595 +#: libpq_source.c:605 #, c-format msgid "unexpected number of data chunks received" msgstr "nombre de morceaux de données reçus inattendu" -#: libpq_source.c:638 +#: libpq_source.c:648 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "n'a pas pu récupérer le fichier distant « %s » : %s" -#: libpq_source.c:643 +#: libpq_source.c:653 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "ensemble de résultats inattendu lors de la récupération du fichier distant « %s »" @@ -414,11 +485,6 @@ msgstr "n'a pas pu ouvrir le fichier source « %s » : %m" msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied" msgstr "la taille du fichier source « %s » a changé : %d octets attendus, %d copiés" -#: local_source.c:121 local_source.c:172 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "n'a pas pu fermer le fichier « %s » : %m" - #: local_source.c:146 #, c-format msgid "could not seek in source file: %m" @@ -469,7 +535,7 @@ msgstr "n'a pas pu parcourir le fichier « %s » : %m" msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" msgstr "l'enregistrement WAL modifie une relation mais le type d'enregistrement n'est pas reconnu : lsn : %X/%X, rmid : %d, rmgr : %s, info : %02X" -#: pg_rewind.c:86 +#: pg_rewind.c:94 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" @@ -479,7 +545,7 @@ msgstr "" "l'instance.\n" "\n" -#: pg_rewind.c:87 +#: pg_rewind.c:95 #, c-format msgid "" "Usage:\n" @@ -490,42 +556,42 @@ msgstr "" " %s [OPTION]...\n" "\n" -#: pg_rewind.c:88 +#: pg_rewind.c:96 #, c-format msgid "Options:\n" msgstr "Options :\n" -#: pg_rewind.c:89 +#: pg_rewind.c:97 #, c-format msgid "" -" -c, --restore-target-wal use restore_command in target configuration to\n" +" -c, --restore-target-wal use \"restore_command\" in target configuration to\n" " retrieve WAL files from archives\n" msgstr "" -" -c, --restore-target-wal utilise restore_command pour la configuration\n" +" -c, --restore-target-wal utilise « restore_command » pour la configuration\n" " cible de récupération des fichiers WAL des\n" " archives\n" -#: pg_rewind.c:91 +#: pg_rewind.c:99 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=RÉPERTOIRE répertoire de données existant à modifier\n" -#: pg_rewind.c:92 +#: pg_rewind.c:100 #, c-format msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" msgstr " --source-pgdata=RÉPERTOIRE répertoire des données source\n" -#: pg_rewind.c:93 +#: pg_rewind.c:101 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr " --source-server=CHAÃŽNE serveur source pour la synchronisation\n" -#: pg_rewind.c:94 +#: pg_rewind.c:102 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run arrête avant de modifier quoi que ce soit\n" -#: pg_rewind.c:95 +#: pg_rewind.c:103 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" @@ -534,12 +600,12 @@ msgstr "" " -N, --nosync n'attend pas que les modifications soient\n" " proprement écrites sur disque\n" -#: pg_rewind.c:97 +#: pg_rewind.c:105 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress écrit les messages de progression\n" -#: pg_rewind.c:98 +#: pg_rewind.c:106 #, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" @@ -547,9 +613,8 @@ msgid "" msgstr "" " -R, --write-recovery-conf écrit la configuration pour la réplication\n" " (requiert --source-server)\n" -"\n" -#: pg_rewind.c:100 +#: pg_rewind.c:108 #, c-format msgid "" " --config-file=FILENAME use specified main server configuration\n" @@ -559,29 +624,34 @@ msgstr "" " du serveur principal lors de l'exécution de\n" " l'instance cible\n" -#: pg_rewind.c:102 +#: pg_rewind.c:110 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug écrit beaucoup de messages de débogage\n" -#: pg_rewind.c:103 +#: pg_rewind.c:111 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" msgstr "" " --no-ensure-shutdown ne corrige pas automatiquement l'arrêt non\n" " propre\n" -#: pg_rewind.c:104 +#: pg_rewind.c:112 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHODE configure la méthode pour synchroniser les fichiers sur disque\n" + +#: pg_rewind.c:113 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version, puis quitte\n" -#: pg_rewind.c:105 +#: pg_rewind.c:114 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide, puis quitte\n" -#: pg_rewind.c:106 +#: pg_rewind.c:115 #, c-format msgid "" "\n" @@ -590,711 +660,424 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_rewind.c:107 +#: pg_rewind.c:116 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" -#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237 -#: pg_rewind.c:244 pg_rewind.c:252 +#: pg_rewind.c:232 pg_rewind.c:240 pg_rewind.c:247 pg_rewind.c:254 +#: pg_rewind.c:261 pg_rewind.c:269 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_rewind.c:222 +#: pg_rewind.c:239 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "aucune source indiquée (--source-pgdata ou --source-server)" -#: pg_rewind.c:229 +#: pg_rewind.c:246 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "une seule des options --source-pgdata et --source-server peut être indiquée" -#: pg_rewind.c:236 +#: pg_rewind.c:253 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "aucun répertoire de données cible indiqué (--target-pgdata)" -#: pg_rewind.c:243 +#: pg_rewind.c:260 #, c-format msgid "no source server information (--source-server) specified for --write-recovery-conf" msgstr "aucune information sur le serveur source (--source-server) indiquée pour --write-recovery-conf" -#: pg_rewind.c:250 +#: pg_rewind.c:267 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_rewind.c:265 +#: pg_rewind.c:282 #, c-format msgid "cannot be executed by \"root\"" msgstr "ne peut pas être exécuté par « root »" -#: pg_rewind.c:266 +#: pg_rewind.c:283 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL." -#: pg_rewind.c:276 +#: pg_rewind.c:293 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "n'a pas pu lire les droits du répertoire « %s » : %m" -#: pg_rewind.c:294 +#: pg_rewind.c:311 #, c-format msgid "%s" msgstr "%s" -#: pg_rewind.c:297 +#: pg_rewind.c:314 #, c-format msgid "connected to server" msgstr "connecté au serveur" -#: pg_rewind.c:344 +#: pg_rewind.c:375 #, c-format msgid "source and target cluster are on the same timeline" msgstr "les instances source et cible sont sur la même ligne de temps" -#: pg_rewind.c:353 +#: pg_rewind.c:396 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "les serveurs ont divergé à la position %X/%X des WAL sur la timeline %u" -#: pg_rewind.c:401 +#: pg_rewind.c:451 #, c-format msgid "no rewind required" msgstr "pas de retour en arrière requis" -#: pg_rewind.c:410 +#: pg_rewind.c:460 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "retour en arrière depuis le dernier checkpoint commun à %X/%X sur la ligne de temps %u" -#: pg_rewind.c:420 +#: pg_rewind.c:470 #, c-format msgid "reading source file list" msgstr "lecture de la liste des fichiers sources" -#: pg_rewind.c:424 +#: pg_rewind.c:474 #, c-format msgid "reading target file list" msgstr "lecture de la liste des fichiers cibles" -#: pg_rewind.c:433 +#: pg_rewind.c:483 #, c-format msgid "reading WAL in target" msgstr "lecture du WAL dans la cible" -#: pg_rewind.c:454 +#: pg_rewind.c:504 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "a besoin de copier %lu Mo (la taille totale du répertoire source est %lu Mo)" -#: pg_rewind.c:472 +#: pg_rewind.c:522 #, c-format msgid "syncing target data directory" msgstr "synchronisation du répertoire des données cible" -#: pg_rewind.c:488 +#: pg_rewind.c:538 #, c-format msgid "Done!" msgstr "Terminé !" -#: pg_rewind.c:568 +#: pg_rewind.c:618 #, c-format msgid "no action decided for file \"%s\"" msgstr "aucune action décidée pour le fichier « %s »" -#: pg_rewind.c:600 +#: pg_rewind.c:650 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "le système source a été modifié alors que pg_rewind était en cours d'exécution" -#: pg_rewind.c:604 +#: pg_rewind.c:654 #, c-format msgid "creating backup label and updating control file" msgstr "création du fichier backup_label et mise à jour du fichier contrôle" -#: pg_rewind.c:654 +#: pg_rewind.c:704 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "le système source était dans un état inattendu en fin de rewind" -#: pg_rewind.c:685 +#: pg_rewind.c:736 #, c-format msgid "source and target clusters are from different systems" msgstr "les instances source et cible proviennent de systèmes différents" -#: pg_rewind.c:693 +#: pg_rewind.c:744 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "les instances ne sont pas compatibles avec cette version de pg_rewind" -#: pg_rewind.c:703 +#: pg_rewind.c:754 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "le serveur cible doit soit utiliser les sommes de contrôle sur les données soit avoir wal_log_hints configuré à on" -#: pg_rewind.c:714 +#: pg_rewind.c:765 #, c-format msgid "target server must be shut down cleanly" msgstr "le serveur cible doit être arrêté proprement" -#: pg_rewind.c:724 +#: pg_rewind.c:775 #, c-format msgid "source data directory must be shut down cleanly" msgstr "le répertoire de données source doit être arrêté proprement" -#: pg_rewind.c:771 +#: pg_rewind.c:822 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s Ko (%d%%) copiés" -#: pg_rewind.c:834 -#, c-format -msgid "invalid control file" -msgstr "fichier de contrôle invalide" - -#: pg_rewind.c:918 +#: pg_rewind.c:948 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "n'a pas pu trouver l'ancêtre commun des lignes de temps des instances source et cible" -#: pg_rewind.c:959 +#: pg_rewind.c:989 #, c-format msgid "backup label buffer too small" msgstr "tampon du label de sauvegarde trop petit" -#: pg_rewind.c:982 +#: pg_rewind.c:1012 #, c-format msgid "unexpected control file CRC" msgstr "CRC inattendu pour le fichier de contrôle" -#: pg_rewind.c:994 +#: pg_rewind.c:1024 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "taille %d inattendue du fichier de contrôle, %d attendu" -#: pg_rewind.c:1003 +#: pg_rewind.c:1034 +#, c-format +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "taille invalide du segment WAL dans le fichier de contrôle (%d octet)" +msgstr[1] "taille invalide du segment WAL dans le fichier de contrôle (%d octets)" + +#: pg_rewind.c:1038 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" -msgstr[0] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octet" -msgstr[1] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octets" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go." -#: pg_rewind.c:1042 pg_rewind.c:1112 +#: pg_rewind.c:1075 pg_rewind.c:1143 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »" -#: pg_rewind.c:1045 pg_rewind.c:1115 +#: pg_rewind.c:1078 pg_rewind.c:1146 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s" -#: pg_rewind.c:1078 +#: pg_rewind.c:1107 #, c-format -msgid "restore_command is not set in the target cluster" -msgstr "restore_command n'est pas configuré sur l'instance cible" +msgid "could not read restore_command from target cluster" +msgstr "n'a pas pu lire restore_command à partir de l'instance cible" -#: pg_rewind.c:1119 +#: pg_rewind.c:1112 +#, c-format +msgid "\"restore_command\" is not set in the target cluster" +msgstr "« restore_command» n'est pas configuré sur l'instance cible" + +#: pg_rewind.c:1150 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "exécution de « %s » pour terminer la restauration après crash du serveur cible" -#: pg_rewind.c:1156 +#: pg_rewind.c:1188 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "le mot simple-utilisateur de postgres a échoué pour l'instance cible" -#: pg_rewind.c:1157 +#: pg_rewind.c:1189 #, c-format msgid "Command was: %s" msgstr "La commande était : %s" -#: timeline.c:75 timeline.c:81 +#: timeline.c:74 timeline.c:80 #, c-format msgid "syntax error in history file: %s" msgstr "erreur de syntaxe dans le fichier historique : %s" -#: timeline.c:76 +#: timeline.c:75 #, c-format msgid "Expected a numeric timeline ID." msgstr "Attendait un identifiant timeline numérique." -#: timeline.c:82 +#: timeline.c:81 #, c-format msgid "Expected a write-ahead log switchpoint location." msgstr "Attendait un emplacement de bascule de journal de transactions." -#: timeline.c:87 +#: timeline.c:86 #, c-format msgid "invalid data in history file: %s" msgstr "données invalides dans le fichier historique : %s" -#: timeline.c:88 +#: timeline.c:87 #, c-format msgid "Timeline IDs must be in increasing sequence." msgstr "Les identifiants timeline doivent être en ordre croissant." -#: timeline.c:108 +#: timeline.c:107 #, c-format msgid "invalid data in history file" msgstr "données invalides dans le fichier historique" -#: timeline.c:109 +#: timeline.c:108 #, c-format msgid "Timeline IDs must be less than child timeline's ID." msgstr "" "Les identifiants timeline doivent être plus petits que les enfants des\n" "identifiants timeline." -#: xlogreader.c:625 +#: xlogreader.c:619 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "décalage invalide de l'enregistrement %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "décalage invalide de l'enregistrement à %X/%X : attendait au moins %u, a eu %u" -#: xlogreader.c:633 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "« contrecord » est requis par %X/%X" -#: xlogreader.c:674 xlogreader.c:1121 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "longueur invalide de l'enregistrement à %X/%X : voulait %u, a eu %u" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "longueur invalide de l'enregistrement à %X/%X : attendait au moins %u, a eu %u" -#: xlogreader.c:703 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "manque mémoire lors de la tentative de décodage d'un enregistrement de longueur %u" - -#: xlogreader.c:725 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "longueur trop importante de l'enregistrement %u à %X/%X" - -#: xlogreader.c:774 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "il n'existe pas de drapeau contrecord à %X/%X" -#: xlogreader.c:787 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "longueur %u invalide du contrecord (%lld attendu) à %X/%X" -#: xlogreader.c:922 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "contrecord manquant à %X/%X" - -#: xlogreader.c:1129 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "identifiant du gestionnaire de ressources invalide %u à %X/%X" -#: xlogreader.c:1142 xlogreader.c:1158 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "enregistrement avec prev-link %X/%X incorrect à %X/%X" -#: xlogreader.c:1194 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" "somme de contrôle des données du gestionnaire de ressources incorrecte à\n" "l'enregistrement %X/%X" -#: xlogreader.c:1231 +#: xlogreader.c:1243 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "numéro magique invalide %04X dans le segment %s, décalage %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "numéro magique invalide %04X dans le segment WAL %s, LSN %X/%X, décalage %u" -#: xlogreader.c:1245 xlogreader.c:1286 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "bits d'information %04X invalides dans le segment %s, décalage %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "bits d'information %04X invalides dans le segment WAL %s, LSN %X/%X, décalage %u" -#: xlogreader.c:1260 +#: xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "Le fichier WAL provient d'une instance différente : l'identifiant système de la base dans le fichier WAL est %llu, alors que l'identifiant système de la base dans pg_control est %llu" -#: xlogreader.c:1268 +#: xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "Le fichier WAL provient d'une instance différente : taille invalide du segment dans l'en-tête de page" -#: xlogreader.c:1274 +#: xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "Le fichier WAL provient d'une instance différente : XLOG_BLCKSZ incorrect dans l'en-tête de page" -#: xlogreader.c:1305 +#: xlogreader.c:1320 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "pageaddr %X/%X inattendue dans le journal de transactions %s, segment %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "pageaddr %X/%X inattendue dans le journal de transactions %s, LSN %X/%X, segment %u" -#: xlogreader.c:1330 +#: xlogreader.c:1346 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "identifiant timeline %u hors de la séquence (après %u) dans le segment %s, décalage %u" +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "identifiant timeline %u hors de la séquence (après %u) dans le segment WAL %s, LSN %X/%X, décalage %u" -#: xlogreader.c:1735 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u désordonné à %X/%X" -#: xlogreader.c:1759 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA configuré, mais aucune donnée inclus à %X/%X" -#: xlogreader.c:1766 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA non configuré, mais la longueur des données est %u à %X/%X" -#: xlogreader.c:1802 +#: xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE activé, mais décalage trou %u longueur %u longueur image bloc %u à %X/%X" -#: xlogreader.c:1818 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE désactivé, mais décalage trou %u longueur %u à %X/%X" -#: xlogreader.c:1832 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" -#: xlogreader.c:1847 +#: xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" -#: xlogreader.c:1863 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL configuré, mais pas de relation précédente à %X/%X" -#: xlogreader.c:1875 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "block_id %u invalide à %X/%X" -#: xlogreader.c:1942 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "enregistrement de longueur invalide à %X/%X" -#: xlogreader.c:1967 +#: xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "n'a pas pu localiser le bloc de sauvegarde d'ID %d dans l'enregistrement WAL" -#: xlogreader.c:2051 +#: xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" -msgstr "n'a pas pu restaurer l'image ) %X/%X avec le bloc invalide %d indiqué" +msgstr "n'a pas pu restaurer l'image à %X/%X avec le bloc invalide %d indiqué" -#: xlogreader.c:2058 +#: xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "n'a pas pu restaurer l'image à %X/%X avec un état invalide, bloc %d" -#: xlogreader.c:2085 xlogreader.c:2102 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec %s, qui est non supporté par le serveur, bloc %d" -#: xlogreader.c:2111 +#: xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec une méthode inconnue, bloc %d" -#: xlogreader.c:2119 +#: xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "n'a pas pu décompresser l'image à %X/%X, bloc %d" - -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" - -#~ msgid " block %u\n" -#~ msgstr " bloc %u\n" - -#~ msgid "\"%s\" is not a directory" -#~ msgstr "« %s » n'est pas un répertoire" - -#~ msgid "\"%s\" is not a regular file" -#~ msgstr "« %s » n'est pas un fichier standard" - -#~ msgid "\"%s\" is not a symbolic link" -#~ msgstr "« %s » n'est pas un lien symbolique" - -#~ msgid "%d: %X/%X - %X/%X\n" -#~ msgstr "%d : %X/%X - %X/%X\n" - -#~ msgid "%s (%s)\n" -#~ msgstr "%s (%s)\n" - -#~ msgid "%s: WARNING: cannot create restricted tokens on this platform\n" -#~ msgstr "%s : ATTENTION : ne peut pas créer les jetons restreints sur cette plateforme\n" - -#~ msgid "%s: could not allocate SIDs: error code %lu\n" -#~ msgstr "%s : n'a pas pu allouer les SID : code d'erreur %lu\n" - -#~ msgid "%s: could not create restricted token: error code %lu\n" -#~ msgstr "%s : n'a pas pu créer le jeton restreint : code d'erreur %lu\n" - -#~ msgid "%s: could not get exit code from subprocess: error code %lu\n" -#~ msgstr "%s : n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu\n" - -#~ msgid "%s: could not open process token: error code %lu\n" -#~ msgstr "%s : n'a pas pu ouvrir le jeton du processus : code d'erreur %lu\n" - -#~ msgid "%s: could not re-execute with restricted token: error code %lu\n" -#~ msgstr "%s : n'a pas pu ré-exécuter le jeton restreint : code d'erreur %lu\n" - -#~ msgid "%s: could not read permissions of directory \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu lire les droits sur le répertoire « %s » : %s\n" - -#~ msgid "%s: could not start process for command \"%s\": error code %lu\n" -#~ msgstr "%s : n'a pas pu démarrer le processus pour la commande « %s » : code d'erreur %lu\n" - -#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" -#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" - -#~ msgid "Expected a numeric timeline ID.\n" -#~ msgstr "Attendait un identifiant numérique de ligne de temps.\n" - -#~ msgid "Expected a write-ahead log switchpoint location.\n" -#~ msgstr "Attendait un emplacement de bascule de journal de transactions.\n" - -#~ msgid "Failure, exiting\n" -#~ msgstr "Échec, sortie\n" - -#~ msgid "Source timeline history:\n" -#~ msgstr "Historique de la ligne de temps source :\n" - -#~ msgid "Target timeline history:\n" -#~ msgstr "Historique de la ligne de temps cible :\n" - -#~ msgid "" -#~ "The program \"%s\" is needed by %s but was\n" -#~ "not found in the same directory as \"%s\".\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé\n" -#~ "dans le même répertoire que « %s ».\n" -#~ "Vérifiez votre installation." - -#~ msgid "" -#~ "The program \"%s\" was found by \"%s\" but was\n" -#~ "not the same version as %s.\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « %s » a été trouvé par « %s » mais n'était pas de la même version\n" -#~ "que %s.\n" -#~ "Vérifiez votre installation." - -#~ msgid "" -#~ "The program \"initdb\" is needed by %s but was\n" -#~ "not found in the same directory as \"%s\".\n" -#~ "Check your installation.\n" -#~ msgstr "" -#~ "Le programme « initdb » est nécessaire pour %s, mais n'a pas été trouvé\n" -#~ "dans le même répertoire que « %s ».\n" -#~ "Vérifiez votre installation.\n" - -#~ msgid "" -#~ "The program \"initdb\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation.\n" -#~ msgstr "" -#~ "Le programme « initdb » a été trouvé par « %s », mais n'est pas de la même version\n" -#~ "que %s.\n" -#~ "Vérifiez votre installation.\n" - -#~ msgid "" -#~ "The program \"postgres\" is needed by %s but was not found in the\n" -#~ "same directory as \"%s\".\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « postgres » est nécessaire à %s mais n'a pas été trouvé dans\n" -#~ "le même répertoire que « %s ».\n" -#~ "Vérifiez votre installation." - -#~ msgid "" -#~ "The program \"postgres\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Le programme « postgres » a été trouvé par « %s » mais n'est pas de la même\n" -#~ "version que « %s ».\n" -#~ "Vérifiez votre installation." - -#~ msgid "Timeline IDs must be in increasing sequence.\n" -#~ msgstr "Les identifiants de ligne de temps doivent être dans une séquence croissante.\n" - -#~ msgid "Timeline IDs must be less than child timeline's ID.\n" -#~ msgstr "Les identifiants de ligne de temps doivent être inférieurs à l'identifiant de la ligne de temps enfant.\n" - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" - -#~ msgid "WAL file is from different database system: incorrect XLOG_SEG_SIZE in page header" -#~ msgstr "le fichier WAL provient d'un système différent : XLOG_SEG_SIZE invalide dans l'en-tête de page" - -#~ msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte\n" -#~ msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes\n" -#~ msgstr[0] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octet\n" -#~ msgstr[1] "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go, mais le fichier de contrôle indique %d octets\n" - -#, c-format -#~ msgid "You must run %s as the PostgreSQL superuser.\n" -#~ msgstr "Vous devez exécuter %s en tant que super-utilisateur PostgreSQL.\n" - -#~ msgid "could not close directory \"%s\": %s\n" -#~ msgstr "n'a pas pu fermer le répertoire « %s » : %s\n" - -#~ msgid "could not close file \"%s\": %s\n" -#~ msgstr "n'a pas pu fermer le fichier « %s » : %s\n" - -#~ msgid "could not connect to server: %s" -#~ msgstr "n'a pas pu se connecter au serveur : %s" - -#~ msgid "could not create directory \"%s\": %s\n" -#~ msgstr "n'a pas pu créer le répertoire « %s » : %s\n" - -#~ msgid "could not create temporary table: %s" -#~ msgstr "n'a pas pu créer la table temporaire : %s" - -#~ msgid "could not open directory \"%s\": %s\n" -#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s\n" - -#~ msgid "could not open file \"%s\" for reading: %s\n" -#~ msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %s\n" - -#~ msgid "could not open file \"%s\": %s\n" -#~ msgstr "n'a pas pu ouvrir le fichier « %s » : %s\n" - -#~ msgid "could not read directory \"%s\": %s\n" -#~ msgstr "n'a pas pu lire le répertoire « %s » : %s\n" - -#~ msgid "could not read file \"%s\": %s\n" -#~ msgstr "n'a pas pu lire le fichier « %s » : %s\n" - -#~ msgid "could not read from file \"%s\": %s\n" -#~ msgstr "n'a pas pu lire le fichier « %s » : %s\n" - -#~ msgid "could not read symbolic link \"%s\": %s\n" -#~ msgstr "n'a pas pu lire le lien symbolique « %s » : %s\n" - -#~ msgid "could not remove directory \"%s\": %s\n" -#~ msgstr "n'a pas pu supprimer le répertoire « %s » : %s\n" - -#~ msgid "could not remove file \"%s\": %s\n" -#~ msgstr "n'a pas pu supprimer le fichier « %s » : %s\n" - -#~ msgid "could not remove symbolic link \"%s\": %s\n" -#~ msgstr "n'a pas pu supprimer le lien symbolique « %s » : %s\n" - -#~ msgid "could not seek in file \"%s\": %s\n" -#~ msgstr "n'a pas pu chercher dans le fichier « %s » : %s\n" - -#~ msgid "could not send COPY data: %s" -#~ msgstr "n'a pas pu envoyer les données COPY : %s" - -#~ msgid "could not send end-of-COPY: %s" -#~ msgstr "n'a pas pu envoyer end-of-COPY : %s" - -#~ msgid "could not send file list: %s" -#~ msgstr "n'a pas pu envoyer la liste de fichiers : %s" - -#~ msgid "could not set up connection context: %s" -#~ msgstr "n'a pas pu initialiser le contexte de connexion : « %s »" - -#~ msgid "could not stat file \"%s\": %s\n" -#~ msgstr "n'a pas pu tester le fichier « %s » : %s\n" - -#~ msgid "could not truncate file \"%s\" to %u: %s\n" -#~ msgstr "n'a pas pu tronquer le fichier « %s » à %u : %s\n" - -#~ msgid "could not write file \"%s\": %s\n" -#~ msgstr "n'a pas pu écrire le fichier « %s » : %s\n" - -#~ msgid "entry \"%s\" excluded from source file list\n" -#~ msgstr "enregistrement « %s » exclus de la liste des fichiers sources\n" - -#~ msgid "entry \"%s\" excluded from target file list\n" -#~ msgstr "enregistrement « %s » exclus de la liste des fichiers cibles\n" - -#, c-format -#~ msgid "failed to locate backup block with ID %d in WAL record" -#~ msgstr "échec de localisation du bloc de sauvegarde d'ID %d dans l'enregistrement WAL" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatal : " - -#~ msgid "fetched file \"%s\", length %d\n" -#~ msgstr "fichier récupéré « %s », longueur %d\n" - -#~ msgid "getting file chunks\n" -#~ msgstr "récupération des parties de fichier\n" - -#, c-format -#~ msgid "image at %X/%X compressed with %s not supported by build, block %d" -#~ msgstr "image à %X/%X compressé avec %s, non supporté, bloc %d" - -#, c-format -#~ msgid "image at %X/%X compressed with unknown method, block %d" -#~ msgstr "image à %X/%X compressé avec une méthode inconnue, bloc %d" - -#, c-format -#~ msgid "invalid compressed image at %X/%X, block %d" -#~ msgstr "image compressée invalide à %X/%X, bloc %d" - -#~ msgid "invalid contrecord length %u at %X/%X reading %X/%X, expected %u" -#~ msgstr "longueur %u invalide du contrecord à %X/%X en lisant %X/%X, attendait %u" - -#~ msgid "invalid data in history file: %s\n" -#~ msgstr "données invalides dans le fichier historique : %s\n" - -#~ msgid "received data at offset " -#~ msgstr "a reçu des données au décalage " - -#~ msgid "received null value for chunk for file \"%s\", file has been deleted\n" -#~ msgstr "a reçu une valeur NULL pour une partie du fichier « %s », le fichier a été supprimé\n" - -#~ msgid "source file list is empty" -#~ msgstr "la liste de fichiers sources est vide" - -#~ msgid "source server must not be in recovery mode" -#~ msgstr "le serveur source ne doit pas être en mode restauration" - -#~ msgid "symbolic link \"%s\" target is too long\n" -#~ msgstr "la cible du lien symbolique « %s » est trop long\n" - -#~ msgid "sync of target directory failed\n" -#~ msgstr "échec de la synchronisation du répertoire cible\n" - -#~ msgid "syntax error in history file: %s\n" -#~ msgstr "erreur de syntaxe dans le fichier historique : %s\n" - -#~ msgid "there is no contrecord flag at %X/%X reading %X/%X" -#~ msgstr "il n'existe pas de drapeau contrecord à %X/%X en lisant %X/%X" - -#~ msgid "unexpected result while sending file list: %s" -#~ msgstr "résultat inattendu lors de l'envoi de la liste de fichiers : %s" diff --git a/src/bin/pg_rewind/po/it.po b/src/bin/pg_rewind/po/it.po index b0d41902080c2..0a1c3d443858c 100644 --- a/src/bin/pg_rewind/po/it.po +++ b/src/bin/pg_rewind/po/it.po @@ -17,7 +17,7 @@ msgstr "" "Project-Id-Version: pg_rewind (PostgreSQL) 11\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-09-26 08:20+0000\n" -"PO-Revision-Date: 2022-10-05 13:58+0200\n" +"PO-Revision-Date: 2023-09-05 08:23+0200\n" "Last-Translator: Domenico Sgarbossa \n" "Language-Team: https://github.com/dvarrazzo/postgresql-it\n" "Language: it\n" @@ -507,7 +507,7 @@ msgid "" " -c, --restore-target-wal use restore_command in target configuration to\n" " retrieve WAL files from archives\n" msgstr "" -" -c, --restore-target-wal usa restore_command nella configurazione di destinazione in\n" +" -c, --restore-target-wal usa restore_command nella configurazione di destinazione in\n" " recuperare i file WAL dagli archivi\n" #: pg_rewind.c:91 @@ -536,8 +536,8 @@ msgid "" " -N, --no-sync do not wait for changes to be written\n" " safely to disk\n" msgstr "" -" -N, --no-sync non aspettare che i dati siano scritti con sicurezza\n" -" sul disco\n" +" -N, --no-sync non aspettare che i dati siano scritti con sicurezza\n" +" sul disco\n" #: pg_rewind.c:97 #, c-format @@ -550,7 +550,7 @@ msgid "" " -R, --write-recovery-conf write configuration for replication\n" " (requires --source-server)\n" msgstr "" -" -R, --write-recovery-conf configurazione di scrittura per la replica\n" +" -R, --write-recovery-conf configurazione di scrittura per la replica\n" " (richiede --source-server)\n" #: pg_rewind.c:100 @@ -559,7 +559,7 @@ msgid "" " --config-file=FILENAME use specified main server configuration\n" " file when running target cluster\n" msgstr "" -" --config-file=FILENAME utilizza la configurazione del server principale specificata\n" +" --config-file=FILENAME utilizza la configurazione del server principale specificata\n" " file durante l'esecuzione del cluster di destinazione\n" #: pg_rewind.c:102 @@ -570,7 +570,7 @@ msgstr " --debug stampa una gran quantità di messaggi d #: pg_rewind.c:103 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" -msgstr " --no-ensure-shutdown non corregge automaticamente l'arresto non pulito\n" +msgstr " --no-ensure-shutdown non corregge automaticamente l'arresto non pulito\n" #: pg_rewind.c:104 #, c-format diff --git a/src/bin/pg_rewind/po/ja.po b/src/bin/pg_rewind/po/ja.po index 810b3c556baa5..ebe05304628e4 100644 --- a/src/bin/pg_rewind/po/ja.po +++ b/src/bin/pg_rewind/po/ja.po @@ -1,16 +1,16 @@ # pg_rewind.po # Japanese message translation file for pg_rewind # -# Copyright (C) 2016-2022 PostgreSQL Global Development Group +# Copyright (C) 2016-2024 PostgreSQL Global Development Group # # This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: pg_rewind (PostgreSQL 16)\n" +"Project-Id-Version: pg_rewind (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-18 10:09+0900\n" -"PO-Revision-Date: 2023-05-18 10:38+0900\n" +"POT-Creation-Date: 2025-02-28 10:06+0900\n" +"PO-Revision-Date: 2025-03-03 17:33+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -40,6 +40,64 @@ msgstr "詳細: " msgid "hint: " msgstr "ヒント: " +#: ../../common/controldata_utils.c:97 file_ops.c:326 file_ops.c:330 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ファイル\"%s\"を読ã¿å–り用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:110 file_ops.c:341 local_source.c:104 +#: local_source.c:163 parsexlog.c:371 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ファイル\"%s\"ã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:119 file_ops.c:344 parsexlog.c:373 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$zuãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: local_source.c:121 local_source.c:172 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒåˆã£ã¦ã„ã¾ã›ã‚“" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒç•°ãªã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚\n" +"pg_controlファイルを格ç´ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒæœ¬ãƒ—ログラムã§ä½¿ç”¨\n" +"ã•れるもã®ã¨ä¸€è‡´ã—ãªã„よã†ã§ã™ã€‚ã“ã®å ´åˆä»¥ä¸‹ã®çµæžœã¯ä¸æ­£ç¢ºã«ãªã‚Šã¾ã™ã€‚ã¾ãŸã€\n" +"PostgreSQLインストレーションã¯ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨äº’æ›æ€§ãŒãªããªã‚Šã¾ã™ã€‚" + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: parsexlog.c:333 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:249 file_ops.c:117 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format @@ -51,6 +109,38 @@ msgstr "メモリä¸è¶³ã§ã™\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ãƒã‚¤ãƒ³ã‚¿ã‚’複製ã§ãã¾ã›ã‚“(内部エラー)\n" +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "ファイル\"%s\"ã«å¯¾ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã‚’åŒæœŸã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: ../../fe_utils/archive.c:86 file_ops.c:417 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ã“ã®ãƒ“ルドã§ã¯åŒæœŸæ–¹å¼\"%s\"をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:388 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:462 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + #: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" @@ -106,43 +196,58 @@ msgstr "想定外ã®\"%1$s\"ã®ãƒ•ァイルサイズ: %3$lld ã§ã¯ãªã %2$lld msgid "could not open file \"%s\" restored from archive: %m" msgstr "アーカイブã‹ã‚‰ãƒªã‚¹ãƒˆã‚¢ã•れãŸãƒ•ァイル\"%s\"ã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: ../../fe_utils/archive.c:86 file_ops.c:417 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m" - #: ../../fe_utils/archive.c:98 #, c-format -msgid "restore_command failed: %s" -msgstr "restore_commandãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" +msgid "\"restore_command\" failed: %s" +msgstr "\"restore_command\"ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" #: ../../fe_utils/archive.c:105 #, c-format msgid "could not restore file \"%s\" from archive" msgstr "ファイル\"%s\"をアーカイブã‹ã‚‰ãƒªã‚¹ãƒˆã‚¢ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 +#: ../../fe_utils/option_utils.c:69 #, c-format -msgid "out of memory" -msgstr "メモリä¸è¶³ã§ã™" +msgid "invalid value \"%s\" for option %s" +msgstr "オプション%2$sã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\"" -#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312 +#: ../../fe_utils/option_utils.c:76 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" +msgid "%s must be in range %d..%d" +msgstr "%sã¯%d..%dã®ç¯„囲ã«ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "èªè­˜ã§ããªã„åŒæœŸæ–¹å¼: %s" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 +#, c-format +msgid "out of memory" +msgstr "メモリä¸è¶³ã§ã™" -#: ../../fe_utils/recovery_gen.c:124 +#: ../../fe_utils/recovery_gen.c:143 #, c-format msgid "could not write to file \"%s\": %m" msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../fe_utils/recovery_gen.c:133 +#: ../../fe_utils/recovery_gen.c:152 #, c-format msgid "could not create file \"%s\": %m" msgstr "ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "シェルコマンドã®å¼•æ•°ã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "データベースåã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + #: file_ops.c:67 #, c-format msgid "could not open target file \"%s\": %m" @@ -158,11 +263,6 @@ msgstr "ターゲットファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—㟠msgid "could not seek in target file \"%s\": %m" msgstr "ターゲットファイル\"%s\"をシークã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: file_ops.c:117 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" - #: file_ops.c:150 file_ops.c:177 #, c-format msgid "undefined file type for \"%s\"" @@ -208,26 +308,6 @@ msgstr "\"%s\"ã«ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: % msgid "could not remove symbolic link \"%s\": %m" msgstr "シンボリックリンク\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: file_ops.c:326 file_ops.c:330 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "ファイル\"%s\"を読ã¿å–り用ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "ファイル\"%s\"ã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ: %m" - -#: file_ops.c:344 parsexlog.c:352 -#, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$zuãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" - -#: file_ops.c:388 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - #: file_ops.c:441 #, c-format msgid "could not read symbolic link \"%s\": %m" @@ -238,162 +318,157 @@ msgstr "シンボリックリンク\"%s\"を読ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" msgid "symbolic link \"%s\" target is too long" msgstr "シンボリックリンク\"%s\"ã®å‚ç…§å…ˆãŒé•·ã™ãŽã¾ã™" -#: file_ops.c:462 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "ディレクトリ\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" - #: file_ops.c:466 #, c-format msgid "could not close directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: filemap.c:236 +#: filemap.c:297 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "ソースã®ãƒ‡ãƒ¼ã‚¿ãƒ•ァイル\"%s\"ã¯é€šå¸¸ã®ãƒ•ァイルã§ã¯ã‚りã¾ã›ã‚“" -#: filemap.c:241 filemap.c:274 +#: filemap.c:302 filemap.c:335 #, c-format msgid "duplicate source file \"%s\"" msgstr "ソースファイル\"%s\"ãŒé‡è¤‡ã—ã¦ã„ã¾ã™" -#: filemap.c:329 +#: filemap.c:390 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "éžé€šå¸¸ãƒ•ァイル\"%s\"ã«å¯¾ã™ã‚‹æƒ³å®šå¤–ã®ãƒšãƒ¼ã‚¸ã®æ›¸ãæ›ãˆã§ã™" -#: filemap.c:679 filemap.c:773 +#: filemap.c:744 filemap.c:846 #, c-format msgid "unknown file type for \"%s\"" msgstr "\"%s\"ã«å¯¾ã™ã‚‹æœªçŸ¥ã®ãƒ•ァイルタイプ" -#: filemap.c:706 +#: filemap.c:779 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "ファイル\"%s\"ã¯ã‚½ãƒ¼ã‚¹ã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã¨ã§ç•°ãªã‚‹ã‚¿ã‚¤ãƒ—ã§ã™" -#: filemap.c:778 +#: filemap.c:851 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "ファイル\"%s\"ã®å‡¦ç†ã‚’決定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq_source.c:130 +#: libpq_source.c:131 #, c-format -msgid "could not clear search_path: %s" -msgstr "search_pathを消去ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not clear \"search_path\": %s" +msgstr "\"search_path\"を消去ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq_source.c:141 +#: libpq_source.c:142 #, c-format -msgid "full_page_writes must be enabled in the source server" -msgstr "ソースサーãƒãƒ¼ã§ã¯full_pate_writesã¯æœ‰åйã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" +msgid "\"full_page_writes\" must be enabled in the source server" +msgstr "ソースサーãƒãƒ¼ã§ã¯\"full_pate_writes\"ã¯æœ‰åйã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: libpq_source.c:152 +#: libpq_source.c:153 #, c-format msgid "could not prepare statement to fetch file contents: %s" msgstr "ファイル内容をå–å¾—ã™ã‚‹ãŸã‚ã®æ–‡ã‚’準備ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq_source.c:171 +#: libpq_source.c:172 #, c-format msgid "error running query (%s) on source server: %s" msgstr "ソースサーãƒãƒ¼ã§å®Ÿè¡Œä¸­ã®ã‚¯ã‚¨ãƒª(%s)ã§ã‚¨ãƒ©ãƒ¼: %s" -#: libpq_source.c:176 +#: libpq_source.c:177 #, c-format msgid "unexpected result set from query" msgstr "クエリã‹ã‚‰æƒ³å®šå¤–ã®çµæžœã‚»ãƒƒãƒˆ" -#: libpq_source.c:198 +#: libpq_source.c:199 #, c-format msgid "error running query (%s) in source server: %s" msgstr "ソースサーãƒãƒ¼ã®å®Ÿè¡Œä¸­ã®ã‚¯ã‚¨ãƒª(%s)ã§ã‚¨ãƒ©ãƒ¼: %s" -#: libpq_source.c:219 +#: libpq_source.c:220 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "ç¾åœ¨ã®WAL挿入ä½ç½®ã¨ã—ã¦èªè­˜ä¸å¯ã®çµæžœ\"%s\"" -#: libpq_source.c:270 +#: libpq_source.c:271 #, c-format msgid "could not fetch file list: %s" msgstr "ファイルリストをフェッãƒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq_source.c:275 +#: libpq_source.c:276 #, c-format msgid "unexpected result set while fetching file list" msgstr "ファイルリストã®ãƒ•ェッãƒä¸­ã«æƒ³å®šå¤–ã®çµæžœã‚»ãƒƒãƒˆ" -#: libpq_source.c:467 +#: libpq_source.c:477 #, c-format msgid "could not send query: %s" msgstr "クエリをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq_source.c:470 +#: libpq_source.c:480 #, c-format msgid "could not set libpq connection to single row mode" msgstr "libpq接続をå˜ä¸€è¡Œãƒ¢ãƒ¼ãƒ‰ã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: libpq_source.c:500 +#: libpq_source.c:510 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "リモートファイルをフェッãƒä¸­ã«æƒ³å®šå¤–ã®çµæžœ: %s" -#: libpq_source.c:505 +#: libpq_source.c:515 #, c-format msgid "received more data chunks than requested" msgstr "è¦æ±‚よりも多ãã®ãƒ‡ãƒ¼ã‚¿ãƒãƒ£ãƒ³ã‚¯ãŒåˆ°ç€ã—ã¾ã—ãŸ" -#: libpq_source.c:509 +#: libpq_source.c:519 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "リモートファイルã®ãƒ•ェッãƒä¸­ã«æƒ³å®šå¤–ã®çµæžœã‚»ãƒƒãƒˆã‚µã‚¤ã‚º" -#: libpq_source.c:515 +#: libpq_source.c:525 #, c-format msgid "unexpected data types in result set while fetching remote files: %u %u %u" msgstr "リモートファイルã®ãƒ•ェッãƒä¸­ã®çµæžœã‚»ãƒƒãƒˆã«æƒ³å®šå¤–ã®ãƒ‡ãƒ¼ã‚¿åž‹: %u %u %u" -#: libpq_source.c:523 +#: libpq_source.c:533 #, c-format msgid "unexpected result format while fetching remote files" msgstr "リモートファイルã®ãƒ•ェッãƒä¸­ã«æƒ³å®šå¤–ã®çµæžœå½¢å¼" -#: libpq_source.c:529 +#: libpq_source.c:539 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "リモートファイルã®ãƒ•ェッãƒä¸­ã®çµæžœã«æƒ³å®šå¤–ã®NULL値" -#: libpq_source.c:533 +#: libpq_source.c:543 #, c-format msgid "unexpected result length while fetching remote files" msgstr "リモートファイルã®ãƒ•ェッãƒä¸­ã«æƒ³å®šå¤–ã®çµæžœã®é•·ã•" -#: libpq_source.c:566 +#: libpq_source.c:576 #, c-format msgid "received data for file \"%s\", when requested for \"%s\"" msgstr "ファイル\"%s\"ã¸ã®è¦æ±‚ã«å¯¾ã—ã¦ãƒ•ァイル\"%s\"ã®ãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã—ã¾ã—ãŸ" -#: libpq_source.c:570 +#: libpq_source.c:580 #, c-format msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" msgstr "ファイル\"%2$s\"ã®ã‚ªãƒ•セット%3$lldã¸ã®è¦æ±‚ã«å¯¾ã—ã¦ã‚ªãƒ•セット%1$lldã®ãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã—ã¾ã—ãŸ" -#: libpq_source.c:582 +#: libpq_source.c:592 #, c-format msgid "received more than requested for file \"%s\"" msgstr "ファイルâ€%s\"ã«å¯¾ã—ã¦è¦æ±‚よりも多é‡ã®ãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã—ã¾ã—ãŸ" -#: libpq_source.c:595 +#: libpq_source.c:605 #, c-format msgid "unexpected number of data chunks received" msgstr "æƒ³å®šå¤–ã®æ•°ã®ãƒ‡ãƒ¼ã‚¿ãƒãƒ£ãƒ³ã‚¯ã‚’å—ä¿¡ã—ã¾ã—ãŸ" -#: libpq_source.c:638 +#: libpq_source.c:648 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "リモートファイル\"%s\"をフェッãƒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: libpq_source.c:643 +#: libpq_source.c:653 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "リモートファイル\"%s\"ã®ãƒ•ェッãƒä¸­ã«æƒ³å®šå¤–ã®çµæžœã‚»ãƒƒãƒˆ" @@ -408,11 +483,6 @@ msgstr "ソースファイル\"%s\"をオープンã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied" msgstr "ファイル\"%s\"ã®ã‚µã‚¤ã‚ºãŒåŒæ™‚ã«å¤‰æ›´ã•れã¾ã—ãŸã€‚%dãƒã‚¤ãƒˆã‚’期待ã—ã¦ã„ã¾ã—ãŸãŒã€%dãƒã‚¤ãƒˆã‚³ãƒ”ーã•れã¾ã—ãŸ" -#: local_source.c:121 local_source.c:172 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - #: local_source.c:146 #, c-format msgid "could not seek in source file: %m" @@ -423,7 +493,7 @@ msgstr "ソースファイルをシークã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—㟠msgid "unexpected EOF while reading file \"%s\"" msgstr "ファイル\"%s\"を読ã¿è¾¼ã¿ä¸­ã«æƒ³å®šå¤–ã®EOF" -#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199 +#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:201 #, c-format msgid "out of memory while allocating a WAL reading processor" msgstr "WAL読ã¿å–り機構ã®ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ä¸­ã«ãƒ¡ãƒ¢ãƒªä¸è¶³" @@ -443,27 +513,27 @@ msgstr "%X/%Xã®WALレコードを読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ" msgid "end pointer %X/%X is not a valid end point; expected %X/%X" msgstr "終了点%X/%Xã¯å¦¥å½“ãªçµ‚了点ã§ã¯ã‚りã¾ã›ã‚“; %X/%Xを期待ã—ã¦ã„ã¾ã—ãŸ" -#: parsexlog.c:212 +#: parsexlog.c:214 #, c-format msgid "could not find previous WAL record at %X/%X: %s" msgstr "%X/%Xã®å‰ã®WALレコードãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %s" -#: parsexlog.c:216 +#: parsexlog.c:218 #, c-format msgid "could not find previous WAL record at %X/%X" msgstr "%X/%Xã®å‰ã®WALレコードãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: parsexlog.c:341 +#: parsexlog.c:362 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "ファイル\"%s\"をシークã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: parsexlog.c:440 +#: parsexlog.c:461 #, c-format msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" msgstr "WALレコードã¯ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’æ›´æ–°ã—ã¾ã™ãŒã€ãƒ¬ã‚³ãƒ¼ãƒ‰ã®åž‹ã‚’èªè­˜ã§ãã¾ã›ã‚“: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" -#: pg_rewind.c:92 +#: pg_rewind.c:94 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" @@ -472,7 +542,7 @@ msgstr "" "%s ã¯PostgreSQLクラスタをãã®ã‚¯ãƒ©ã‚¹ã‚¿ã®ã‚³ãƒ”ーã§å†åŒæœŸã—ã¾ã™ã€‚\n" "\n" -#: pg_rewind.c:93 +#: pg_rewind.c:95 #, c-format msgid "" "Usage:\n" @@ -483,53 +553,53 @@ msgstr "" " %s [オプション]...\n" "\n" -#: pg_rewind.c:94 +#: pg_rewind.c:96 #, c-format msgid "Options:\n" msgstr "オプション:\n" -#: pg_rewind.c:95 +#: pg_rewind.c:97 #, c-format msgid "" -" -c, --restore-target-wal use restore_command in target configuration to\n" +" -c, --restore-target-wal use \"restore_command\" in target configuration to\n" " retrieve WAL files from archives\n" msgstr "" -" -c, --restore-target-wal ターゲットã®è¨­å®šã®ä¸­ã®restore_commandを使用ã—ã¦\n" +" -c, --restore-target-wal ターゲットã®è¨­å®šã®ä¸­ã®\"restore_command\"を使用ã—ã¦\n" " アーカイブã‹ã‚‰WALファイルをå–å¾—ã™ã‚‹\n" -#: pg_rewind.c:97 +#: pg_rewind.c:99 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=DIRECTORY ä¿®æ­£ã‚’è¡Œã†æ—¢å­˜ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n" -#: pg_rewind.c:98 +#: pg_rewind.c:100 #, c-format msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" msgstr " --source-pgdata=DIRECTORY åŒæœŸå…ƒã¨ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n" -#: pg_rewind.c:99 +#: pg_rewind.c:101 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr " --source-server=CONNSTR åŒæœŸå…ƒã¨ã™ã‚‹ã‚µãƒ¼ãƒãƒ¼\n" -#: pg_rewind.c:100 +#: pg_rewind.c:102 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run 修正を始ã‚ã‚‹å‰ã«åœæ­¢ã™ã‚‹\n" -#: pg_rewind.c:101 +#: pg_rewind.c:103 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" " safely to disk\n" msgstr " -N, --no-sync 変更ã®ãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®å®‰å…¨ãªæ›¸ã出ã—を待機ã—ãªã„\n" -#: pg_rewind.c:103 +#: pg_rewind.c:105 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress 進æ—メッセージを出力\n" -#: pg_rewind.c:104 +#: pg_rewind.c:106 #, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" @@ -538,7 +608,7 @@ msgstr "" " -R, --write-recovery-conf レプリケーションã®ãŸã‚ã®è¨­å®šã‚’書ã込む\n" " (--source-server ãŒå¿…è¦ã¨ãªã‚Šã¾ã™)\n" -#: pg_rewind.c:106 +#: pg_rewind.c:108 #, c-format msgid "" " --config-file=FILENAME use specified main server configuration\n" @@ -547,29 +617,34 @@ msgstr "" " --config-file=FILENAME ターゲットã®ã‚¯ãƒ©ã‚¹ã‚¿ã®å®Ÿè¡Œæ™‚ã«æŒ‡å®šã—ãŸ\n" " 主サーãƒãƒ¼è¨­å®šãƒ•ァイルを使用ã™ã‚‹\n" -#: pg_rewind.c:108 +#: pg_rewind.c:110 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug 多é‡ã®ãƒ‡ãƒãƒƒã‚°ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’出力\n" -#: pg_rewind.c:109 +#: pg_rewind.c:111 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" msgstr "" " --no-ensure-shutdown éžã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³å¾Œã®ä¿®æ­£ã‚’自動ã§\n" " 行ã‚ãªã„\n" -#: pg_rewind.c:110 +#: pg_rewind.c:112 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD ファイルをディスクã«åŒæœŸã•ã›ã‚‹æ–¹æ³•を指定\n" + +#: pg_rewind.c:113 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: pg_rewind.c:111 +#: pg_rewind.c:114 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: pg_rewind.c:112 +#: pg_rewind.c:115 #, c-format msgid "" "\n" @@ -578,424 +653,419 @@ msgstr "" "\n" "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: pg_rewind.c:113 +#: pg_rewind.c:116 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245 -#: pg_rewind.c:252 pg_rewind.c:260 +#: pg_rewind.c:232 pg_rewind.c:240 pg_rewind.c:247 pg_rewind.c:254 +#: pg_rewind.c:261 pg_rewind.c:269 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" -#: pg_rewind.c:230 +#: pg_rewind.c:239 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "ã‚½ãƒ¼ã‚¹ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“(--source-pgdata ã¾ãŸã¯ --source-server)" -#: pg_rewind.c:237 +#: pg_rewind.c:246 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "--source-pgdataã‹--source-server ã¯ã„ãšã‚Œã‹ä¸€æ–¹ã®ã¿æŒ‡å®šå¯èƒ½ã§ã™" -#: pg_rewind.c:244 +#: pg_rewind.c:253 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“(--target-pgdata)" -#: pg_rewind.c:251 +#: pg_rewind.c:260 #, c-format msgid "no source server information (--source-server) specified for --write-recovery-conf" msgstr "--write-recovery-confã«ã‚½ãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼æƒ…å ±(--source-server)ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: pg_rewind.c:258 +#: pg_rewind.c:267 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr " コマンドライン引数ãŒå¤šã™ãŽã¾ã™(先頭ã¯\"%s\")" -#: pg_rewind.c:273 +#: pg_rewind.c:282 #, c-format msgid "cannot be executed by \"root\"" msgstr "\"root\"ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: pg_rewind.c:274 +#: pg_rewind.c:283 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "PostgreSQLã®ã‚¹ãƒ¼ãƒ‘ーユーザーã§%sを実行ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_rewind.c:284 +#: pg_rewind.c:293 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"ã®æ¨©é™ã‚’読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_rewind.c:302 +#: pg_rewind.c:311 #, c-format msgid "%s" msgstr "%s" -#: pg_rewind.c:305 +#: pg_rewind.c:314 #, c-format msgid "connected to server" msgstr "サーãƒãƒ¼ã¸æŽ¥ç¶šã—ã¾ã—ãŸ" -#: pg_rewind.c:366 +#: pg_rewind.c:375 #, c-format msgid "source and target cluster are on the same timeline" msgstr "ソースã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã®ã‚¯ãƒ©ã‚¹ã‚¿ãŒåŒä¸€ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ä¸Šã«ã‚りã¾ã™" -#: pg_rewind.c:387 +#: pg_rewind.c:396 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "タイムライン%3$uã®WALä½ç½®%1$X/%2$Xã§ä¸¡ã‚µãƒ¼ãƒãƒ¼ãŒåˆ†å²ã—ã¦ã„ã¾ã™" -#: pg_rewind.c:442 +#: pg_rewind.c:451 #, c-format msgid "no rewind required" msgstr "å·»ãæˆ»ã—ã¯å¿…è¦ã‚りã¾ã›ã‚“" -#: pg_rewind.c:451 +#: pg_rewind.c:463 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "タイムライン%3$uã®%1$X/%2$Xã«ã‚る最新ã®å…±é€šãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã‹ã‚‰å·»ã戻ã—ã¦ã„ã¾ã™" -#: pg_rewind.c:461 +#: pg_rewind.c:473 #, c-format msgid "reading source file list" msgstr "ソースファイルリストを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: pg_rewind.c:465 +#: pg_rewind.c:477 #, c-format msgid "reading target file list" msgstr "ターゲットファイルリストを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: pg_rewind.c:474 +#: pg_rewind.c:486 #, c-format msgid "reading WAL in target" msgstr "ターゲットã§WALを読ã¿è¾¼ã‚“ã§ã„ã¾ã™" -#: pg_rewind.c:495 +#: pg_rewind.c:507 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "%lu MBコピーã™ã‚‹å¿…è¦ãŒã‚りã¾ã™(ソースディレクトリã®åˆè¨ˆã‚µã‚¤ã‚ºã¯%lu MBã§ã™)" -#: pg_rewind.c:513 +#: pg_rewind.c:525 #, c-format msgid "syncing target data directory" msgstr "ã‚¿ãƒ¼ã‚²ãƒƒãƒˆãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’åŒæœŸã—ã¦ã„ã¾ã™" -#: pg_rewind.c:529 +#: pg_rewind.c:541 #, c-format msgid "Done!" msgstr "完了!" -#: pg_rewind.c:609 +#: pg_rewind.c:621 #, c-format msgid "no action decided for file \"%s\"" msgstr "ファイル\"%s\"ã«å¯¾ã™ã‚‹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ãŒæ±ºå®šã•れã¦ã„ã¾ã›ã‚“" -#: pg_rewind.c:641 +#: pg_rewind.c:653 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "pg_rewindã®å®Ÿè¡Œä¸­ã«ã‚½ãƒ¼ã‚¹ã‚·ã‚¹7ãƒ†ãƒ ãŒæ›´æ–°ã•れã¾ã—ãŸ" -#: pg_rewind.c:645 +#: pg_rewind.c:657 #, c-format msgid "creating backup label and updating control file" msgstr "backup labelを作æˆã—ã¦åˆ¶å¾¡ãƒ•ァイルを更新ã—ã¦ã„ã¾ã™" -#: pg_rewind.c:695 +#: pg_rewind.c:707 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "å·»ãæˆ»ã—完了時点ã®ã‚½ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ãŒæƒ³å®šå¤–ã®çŠ¶æ…‹ã§ã—ãŸ" -#: pg_rewind.c:727 +#: pg_rewind.c:739 #, c-format msgid "source and target clusters are from different systems" msgstr "ソースクラスタã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚¯ãƒ©ã‚¹ã‚¿ã¯ç•°ãªã‚‹ã‚·ã‚¹ãƒ†ãƒ ã®ã‚‚ã®ã§ã™" -#: pg_rewind.c:735 +#: pg_rewind.c:747 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "クラスタã¯ã€ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®pg_rewindã¨ã®äº’æ›æ€§ãŒã‚りã¾ã›ã‚“" -#: pg_rewind.c:745 +#: pg_rewind.c:757 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "ターゲットサーãƒãƒ¼ã¯ãƒ‡ãƒ¼ã‚¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’利用ã—ã¦ã„ã‚‹ã€ã¾ãŸã¯\"wal_log_hints = on\"ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: pg_rewind.c:756 +#: pg_rewind.c:768 #, c-format msgid "target server must be shut down cleanly" msgstr "ターゲットサーãƒãƒ¼ã¯ãれã„ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•れã¦ã„ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_rewind.c:766 +#: pg_rewind.c:778 #, c-format msgid "source data directory must be shut down cleanly" msgstr "ソースデータディレクトリã¯ãれã„ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•れã¦ã„ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_rewind.c:813 +#: pg_rewind.c:825 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s kB (%d%%) コピーã—ã¾ã—ãŸ" -#: pg_rewind.c:941 +#: pg_rewind.c:951 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "ソースクラスタã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚¯ãƒ©ã‚¹ã‚¿ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ã®å…±é€šã®ç¥–先を見ã¤ã‘られã¾ã›ã‚“" -#: pg_rewind.c:982 +#: pg_rewind.c:992 #, c-format msgid "backup label buffer too small" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ラベルã®ãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¾ã™" -#: pg_rewind.c:1005 +#: pg_rewind.c:1015 #, c-format msgid "unexpected control file CRC" msgstr "想定外ã®åˆ¶å¾¡ãƒ•ァイルCRCã§ã™" -#: pg_rewind.c:1017 +#: pg_rewind.c:1027 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "想定外ã®åˆ¶å¾¡ãƒ•ァイルã®ã‚µã‚¤ã‚º%dã€æƒ³å®šã¯%d" -#: pg_rewind.c:1026 +#: pg_rewind.c:1037 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" -msgstr[0] "WALセグメントã®ã‚µã‚¤ã‚ºæŒ‡å®šã¯1MBã¨1GBã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“ã€ã—ã‹ã—コントロールファイルã§ã¯%dãƒã‚¤ãƒˆã¨ãªã£ã¦ã„ã¾ã™" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "制御ファイル中ã®ä¸æ­£ãªWALセグメントサイズ (%dãƒã‚¤ãƒˆ)" -#: pg_rewind.c:1065 pg_rewind.c:1135 +#: pg_rewind.c:1041 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WALセグメントサイズã¯1MBã‹ã‚‰1GBã¾ã§ã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" + +#: pg_rewind.c:1078 pg_rewind.c:1146 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "%2$sã«ã¯\"%1$s\"プログラムãŒå¿…è¦ã§ã™ãŒã€\"%3$s\"ã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚" -#: pg_rewind.c:1068 pg_rewind.c:1138 +#: pg_rewind.c:1081 pg_rewind.c:1149 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "\"%2$s\"ãŒãƒ—ログラム\"%1$s\"を見ã¤ã‘ã¾ã—ãŸãŒã€ã“れã¯%3$sã¨åŒã˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚" -#: pg_rewind.c:1101 +#: pg_rewind.c:1110 +#, c-format +msgid "could not read restore_command from target cluster" +msgstr "ターゲットクラスタã‹ã‚‰ restore_command ãŒèª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ" + +#: pg_rewind.c:1115 #, c-format -msgid "restore_command is not set in the target cluster" -msgstr "ターゲットクラスタã§restore_commandãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" +msgid "\"restore_command\" is not set in the target cluster" +msgstr "ターゲットクラスタã§\"restore_command\"ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“" -#: pg_rewind.c:1142 +#: pg_rewind.c:1153 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "ターゲットサーãƒãƒ¼ã«å¯¾ã—ã¦\"%s\"を実行ã—ã¦ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ãƒªã‚«ãƒãƒªã‚’完了ã•ã›ã¾ã™" -#: pg_rewind.c:1180 +#: pg_rewind.c:1191 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "ターゲットクラスタã§ã®postgresコマンドã®ã‚·ãƒ³ã‚°ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ¢ãƒ¼ãƒ‰å®Ÿè¡Œã«å¤±æ•—ã—ã¾ã—ãŸ" -#: pg_rewind.c:1181 +#: pg_rewind.c:1192 #, c-format msgid "Command was: %s" msgstr "コマンド: %s" -#: timeline.c:75 timeline.c:81 +#: timeline.c:74 timeline.c:80 #, c-format msgid "syntax error in history file: %s" msgstr "å±¥æ­´ãƒ•ã‚¡ã‚¤ãƒ«å†…ã®æ§‹æ–‡ã‚¨ãƒ©ãƒ¼: %s" -#: timeline.c:76 +#: timeline.c:75 #, c-format msgid "Expected a numeric timeline ID." msgstr "æ•°å­—ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³IDを想定ã—ã¾ã—ãŸã€‚" -#: timeline.c:82 +#: timeline.c:81 #, c-format msgid "Expected a write-ahead log switchpoint location." msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ã®åˆ‡ã‚Šæ›¿ãˆç‚¹ã®å ´æ‰€ãŒã‚ã‚‹ã¯ãšã§ã—ãŸã€‚" -#: timeline.c:87 +#: timeline.c:86 #, c-format msgid "invalid data in history file: %s" msgstr "履歴ファイル内ã®ä¸æ­£ãªãƒ‡ãƒ¼ã‚¿: %s" -#: timeline.c:88 +#: timeline.c:87 #, c-format msgid "Timeline IDs must be in increasing sequence." msgstr "タイムラインIDã¯æ˜‡é †ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: timeline.c:108 +#: timeline.c:107 #, c-format msgid "invalid data in history file" msgstr "履歴ファイル内ã®ç„¡åйãªãƒ‡ãƒ¼ã‚¿" -#: timeline.c:109 +#: timeline.c:108 #, c-format msgid "Timeline IDs must be less than child timeline's ID." msgstr "タイムラインIDã¯å­ã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³IDよりå°ã•ããªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: xlogreader.c:626 +#: xlogreader.c:619 #, c-format msgid "invalid record offset at %X/%X: expected at least %u, got %u" msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚ªãƒ•セットãŒç„¡åйã§ã™:最低ã§ã‚‚%uを期待ã—ã¦ã„ã¾ã—ãŸãŒã€å®Ÿéš›ã¯%uã§ã—ãŸ" -#: xlogreader.c:635 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "%X/%Xã§ã¯contrecordãŒå¿…è¦ã§ã™" -#: xlogreader.c:676 xlogreader.c:1123 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰é•·ãŒç„¡åйã§ã™:最低ã§ã‚‚%uを期待ã—ã¦ã„ã¾ã—ãŸãŒã€å®Ÿéš›ã¯%uã§ã—ãŸ" -#: xlogreader.c:705 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "é•·ã•%uã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ä¸­ã®ãƒ¡ãƒ¢ãƒªä¸è¶³" - -#: xlogreader.c:727 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "%2$X/%3$Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰é•·%1$uãŒå¤§ãã™ãŽã¾ã™" - -#: xlogreader.c:776 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "%X/%Xã§ contrecord フラグãŒã‚りã¾ã›ã‚“" -#: xlogreader.c:789 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "%3$X/%4$Xã®ç¶™ç¶šãƒ¬ã‚³ãƒ¼ãƒ‰ã®é•·ã•%1$u(æ­£ã—ãã¯%2$lld)ã¯ä¸æ­£ã§ã™" -#: xlogreader.c:924 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "%X/%Xã«ç¶™ç¶šãƒ¬ã‚³ãƒ¼ãƒ‰ãŒã‚りã¾ã›ã‚“" - -#: xlogreader.c:1131 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "%2$X/%3$Xã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ID %1$uãŒç„¡åйã§ã™" -#: xlogreader.c:1144 xlogreader.c:1160 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "ç›´å‰ã®ãƒªãƒ³ã‚¯%1$X/%2$XãŒä¸æ­£ãªãƒ¬ã‚³ãƒ¼ãƒ‰ãŒ%3$X/%4$Xã«ã‚りã¾ã™" -#: xlogreader.c:1196 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰å†…ã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ‡ãƒ¼ã‚¿ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸æ­£ã§ã™" -#: xlogreader.c:1230 +#: xlogreader.c:1243 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%2$sã€LSN %3$X/%4$Xã€ã‚ªãƒ•セット%5$uã§ä¸æ­£ãªãƒžã‚¸ãƒƒã‚¯ãƒŠãƒ³ãƒãƒ¼%1$04X" -#: xlogreader.c:1245 xlogreader.c:1287 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント %2$sã€LSN %3$X/%4$Xã€ã‚ªãƒ•セット%5$uã§ä¸æ­£ãªæƒ…報ビット列%1$04X" -#: xlogreader.c:1261 +#: xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WALファイルã¯ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ç”±æ¥ã®ã‚‚ã®ã§ã™: WALファイルã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ã¯ %lluã§ã€pg_control ã«ãŠã‘るデータベースシステム識別å­ã¯ %lluã§ã™" -#: xlogreader.c:1269 +#: xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL ファイルã¯ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ç”±æ¥ã®ã‚‚ã®ã§ã™: ページヘッダーã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚ºãŒæ­£ã—ãã‚りã¾ã›ã‚“" -#: xlogreader.c:1275 +#: xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL ファイルã¯ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ç”±æ¥ã®ã‚‚ã®ã§ã™: ページヘッダーã®XLOG_BLCKSZãŒæ­£ã—ãã‚りã¾ã›ã‚“" -#: xlogreader.c:1307 +#: xlogreader.c:1320 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%3$sã€LSN %4$X/%5$Xã€ã‚ªãƒ•セット%6$uã§æƒ³å®šå¤–ã®ãƒšãƒ¼ã‚¸ã‚¢ãƒ‰ãƒ¬ã‚¹%1$X/%2$X" -#: xlogreader.c:1333 +#: xlogreader.c:1346 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%3$sã€LSN %4$X/%5$Xã€ã‚ªãƒ•セット%6$uã§ç•°å¸¸ãªé †åºã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ID %1$u(%2$uã®å¾Œ)" -#: xlogreader.c:1739 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %uãŒ%X/%Xã§ç„¡åйã§ã™" -#: xlogreader.c:1763 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATAãŒè¨­å®šã•れã¦ã„ã¾ã™ãŒã€%X/%Xã«ãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã›ã‚“" -#: xlogreader.c:1770 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATAãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“ãŒã€%2$X/%3$Xã®ãƒ‡ãƒ¼ã‚¿é•·ã¯%1$u" -#: xlogreader.c:1806 +#: xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEãŒè¨­å®šã•れã¦ã„ã¾ã™ãŒã€%4$X/%5$Xã§ãƒ›ãƒ¼ãƒ«ã‚ªãƒ•セット%1$uã€é•·ã•%2$uã€ãƒ–ロックイメージ長%3$u" -#: xlogreader.c:1822 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“ãŒã€%3$X/%4$Xã«ãƒ›ãƒ¼ãƒ«ã‚ªãƒ•セット%1$uã€é•·ã•%2$u" -#: xlogreader.c:1836 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSEDãŒè¨­å®šã•れã¦ã„ã¾ã™ãŒã€%2$X/%3$Xã«ãŠã„ã¦ãƒ–ロックイメージ長ãŒ%1$uã§ã™" -#: xlogreader.c:1851 +#: xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEã‚‚BKPIMAGE_COMPRESSEDも設定ã•れã¦ã„ã¾ã›ã‚“ãŒã€%2$X/%3$Xã«ãŠã„ã¦ãƒ–ロックイメージ長ãŒ%1$uã§ã™" -#: xlogreader.c:1867 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_RELãŒè¨­å®šã•れã¦ã„ã¾ã™ãŒã€%X/%Xã«ãŠã„ã¦ä»¥å‰ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã›ã‚“" -#: xlogreader.c:1879 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "%2$X/%3$Xã«ãŠã‘ã‚‹block_id %1$uãŒç„¡åйã§ã™" -#: xlogreader.c:1946 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã‚µã‚¤ã‚ºãŒç„¡åйã§ã™" -#: xlogreader.c:1972 +#: xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "WALレコード中ã®ID %dã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ブロックを特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: xlogreader.c:2056 +#: xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "%X/%Xã§ä¸æ­£ãªãƒ–ロック%dãŒæŒ‡å®šã•れã¦ã„ã‚‹ãŸã‚イメージãŒå¾©å…ƒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: xlogreader.c:2063 +#: xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "%X/%Xã§ãƒ–ロック%dã®ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒä¸æ­£ãªçŠ¶æ…‹ã§ã‚ã‚‹ãŸã‚復元ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: xlogreader.c:2090 xlogreader.c:2107 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "%1$X/%2$Xã§ã€ãƒ–ロック%4$dãŒã“ã®ãƒ“ルドã§ã‚µãƒãƒ¼ãƒˆã•れãªã„圧縮方å¼%3$sã§åœ§ç¸®ã•れã¦ã„ã‚‹ãŸã‚復元ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: xlogreader.c:2116 +#: xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "%X/%Xã§ãƒ–ロック%dã®ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒä¸æ˜Žãªæ–¹å¼ã§åœ§ç¸®ã•れã¦ã„ã‚‹ãŸã‚復元ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: xlogreader.c:2124 +#: xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "%X/%Xã®ãƒ–ロック%dãŒä¼¸å¼µã§ãã¾ã›ã‚“ã§ã—ãŸ" diff --git a/src/bin/pg_rewind/po/ka.po b/src/bin/pg_rewind/po/ka.po index fc945a4a36394..8552e456f8c96 100644 --- a/src/bin/pg_rewind/po/ka.po +++ b/src/bin/pg_rewind/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_rewind (PostgreSQL) 16\n" +"Project-Id-Version: pg_rewind (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-19 11:21+0000\n" -"PO-Revision-Date: 2023-04-20 08:19+0200\n" +"POT-Creation-Date: 2024-08-27 16:53+0000\n" +"PO-Revision-Date: 2024-08-28 05:56+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -38,6 +38,63 @@ msgstr "დეტáƒáƒšáƒ”ბი: " msgid "hint: " msgstr "მინიშნებáƒ: " +#: ../../common/controldata_utils.c:97 file_ops.c:326 file_ops.c:330 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:110 file_ops.c:341 local_source.c:104 +#: local_source.c:163 parsexlog.c:350 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:119 file_ops.c:344 parsexlog.c:352 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\"-ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %zu-დáƒáƒœ" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: local_source.c:121 local_source.c:172 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რáƒáƒ  ემთხვევáƒ" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘ის შესáƒáƒ«áƒšáƒ შეუსáƒáƒ‘áƒáƒ›áƒáƒ‘რpg_control ფáƒáƒ˜áƒšáƒ˜áƒ¡ შესáƒáƒœáƒáƒ®áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული \n" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რშესáƒáƒ«áƒšáƒáƒ áƒáƒ  ემთხვეáƒáƒ“ეს áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ მიერ გáƒáƒ›áƒáƒ§áƒ”ნებულს. áƒáƒ› შემთხვევáƒáƒ¨áƒ˜ ქვემáƒáƒ— \n" +"მáƒáƒªáƒ”მული შედეგები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იქნებრდრPostgreSQL ეს áƒáƒ’ებრáƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ შეუთáƒáƒ•სებელი იქნებáƒ." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: parsexlog.c:312 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:249 file_ops.c:117 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format @@ -49,6 +106,38 @@ msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: ../../fe_utils/archive.c:86 file_ops.c:417 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:388 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:462 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" + #: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" @@ -61,8 +150,8 @@ msgstr "სტრიქáƒáƒœáƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ სრულ #: ../../common/percentrepl.c:119 #, c-format -msgid "String contains unexpected escape sequence \"%c\"." -msgstr "სტრიქáƒáƒœáƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელ სპეციáƒáƒšáƒ£áƒ áƒ˜ სიმბáƒáƒšáƒáƒ”ბის მიმდევრáƒáƒ‘áƒáƒ¡ \"%c\" შეიცáƒáƒ•ს." +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "სტრიქáƒáƒœáƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელ áƒáƒ“გილმჭერს \"%%%c\" შეიცáƒáƒ•ს." #: ../../common/restricted_token.c:60 #, c-format @@ -104,43 +193,58 @@ msgstr "\"%s\"-ის მáƒáƒ£áƒšáƒáƒ“ნელი ზáƒáƒ›áƒ: %lld %lld-ი msgid "could not open file \"%s\" restored from archive: %m" msgstr "áƒáƒ áƒ¥áƒ˜áƒ•იდáƒáƒœ áƒáƒ¦áƒ“გენილი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: ../../fe_utils/archive.c:86 file_ops.c:417 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" - #: ../../fe_utils/archive.c:98 #, c-format -msgid "restore_command failed: %s" -msgstr "áƒáƒ¦áƒ“გენის_ბრძáƒáƒœáƒ”ბის შეცდáƒáƒ›áƒ: %s" +msgid "\"restore_command\" failed: %s" +msgstr "\"restore_command\" ჩáƒáƒ•áƒáƒ áƒ“áƒ: %s" #: ../../fe_utils/archive.c:105 #, c-format msgid "could not restore file \"%s\" from archive" msgstr "\"%s\"-ის áƒáƒ áƒ¥áƒ˜áƒ•იდáƒáƒœ áƒáƒ¦áƒ“გენის შეცდáƒáƒ›áƒ" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 +#: ../../fe_utils/option_utils.c:69 #, c-format -msgid "out of memory" -msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" +msgid "invalid value \"%s\" for option %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრისთვის %s" -#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312 +#: ../../fe_utils/option_utils.c:76 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" +msgid "%s must be in range %d..%d" +msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე" -#: ../../fe_utils/recovery_gen.c:124 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "უცნáƒáƒ‘ი სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი: \"%s\"" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 +#, c-format +msgid "out of memory" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" + +#: ../../fe_utils/recovery_gen.c:143 #, c-format msgid "could not write to file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" -#: ../../fe_utils/recovery_gen.c:133 +#: ../../fe_utils/recovery_gen.c:152 #, c-format msgid "could not create file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %m" +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის áƒáƒ áƒ’უმენტი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + #: file_ops.c:67 #, c-format msgid "could not open target file \"%s\": %m" @@ -156,11 +260,6 @@ msgstr "სáƒáƒ›áƒ˜áƒ–ნე ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის msgid "could not seek in target file \"%s\": %m" msgstr "სáƒáƒ›áƒ˜áƒ–ნე ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) გáƒáƒ“áƒáƒ®áƒ•ევის შეცდáƒáƒ›áƒ: %m" -#: file_ops.c:117 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" - #: file_ops.c:150 file_ops.c:177 #, c-format msgid "undefined file type for \"%s\"" @@ -206,26 +305,6 @@ msgstr "სიმბმულის შექმნის შეცდáƒáƒ›áƒ msgid "could not remove symbolic link \"%s\": %m" msgstr "სიმბმულის წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ %s: %m" -#: file_ops.c:326 file_ops.c:330 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" - -#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" - -#: file_ops.c:344 parsexlog.c:352 -#, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "\"%s\"-ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %zu-დáƒáƒœ" - -#: file_ops.c:388 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" - #: file_ops.c:441 #, c-format msgid "could not read symbolic link \"%s\": %m" @@ -236,162 +315,157 @@ msgstr "სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმის \"%s\" წáƒáƒ™áƒ˜áƒ—ხვი msgid "symbolic link \"%s\" target is too long" msgstr "%s: სიმბმული ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" -#: file_ops.c:462 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" - #: file_ops.c:466 #, c-format msgid "could not close directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: filemap.c:236 +#: filemap.c:235 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "წყáƒáƒ áƒáƒ¨áƒ˜ áƒáƒ áƒ¡áƒ”ბული მáƒáƒœáƒáƒªáƒ”მების ფáƒáƒšáƒ˜ \"%s\" ჩვეულებრივი ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒáƒ" -#: filemap.c:241 filemap.c:274 +#: filemap.c:240 filemap.c:273 #, c-format msgid "duplicate source file \"%s\"" msgstr "დუბლირებული სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ფáƒáƒ˜áƒšáƒ˜ : \"%s\"" -#: filemap.c:329 +#: filemap.c:328 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "áƒáƒ áƒáƒ©áƒ•ეულებრივი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გვერდების მáƒáƒ£áƒšáƒáƒ“ნელი ცვლილებáƒ" -#: filemap.c:679 filemap.c:773 +#: filemap.c:682 filemap.c:776 #, c-format msgid "unknown file type for \"%s\"" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ უცნáƒáƒ‘ი ტიპი \"%s\"." -#: filemap.c:706 +#: filemap.c:709 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "ფáƒáƒ˜áƒšáƒ˜ %s წყáƒáƒ áƒáƒ¨áƒ˜ დრსáƒáƒ›áƒ˜áƒ–ნეში სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რტიპისáƒáƒ" -#: filemap.c:778 +#: filemap.c:781 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "ვერ გáƒáƒ“áƒáƒ•წყვიტე, ფáƒáƒ˜áƒšáƒ¡ რრვუყáƒ: %s" -#: libpq_source.c:130 +#: libpq_source.c:131 #, c-format -msgid "could not clear search_path: %s" -msgstr "search_path-ის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ების პრáƒáƒ‘ლემáƒ: %s" +msgid "could not clear \"search_path\": %s" +msgstr "\"search_path\"-ის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ების პრáƒáƒ‘ლემáƒ: %s" -#: libpq_source.c:141 +#: libpq_source.c:142 #, c-format -msgid "full_page_writes must be enabled in the source server" -msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡ სერვერზე full_page_writes-ის ჩáƒáƒ áƒ—ვრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" +msgid "\"full_page_writes\" must be enabled in the source server" +msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡ სერვერზე \"full_page_writes\"-ის ჩáƒáƒ áƒ—ვრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" -#: libpq_source.c:152 +#: libpq_source.c:153 #, c-format msgid "could not prepare statement to fetch file contents: %s" msgstr "შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ შემცველáƒáƒ‘ის გáƒáƒ›áƒáƒ¡áƒáƒ—ხáƒáƒ•ელი áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბის მáƒáƒ›áƒ–áƒáƒ“ებისáƒáƒ¡: %s" -#: libpq_source.c:171 +#: libpq_source.c:172 #, c-format msgid "error running query (%s) on source server: %s" msgstr "შეცდáƒáƒ›áƒ სერვერზე (%2$s) მáƒáƒ—ხáƒáƒ•ნის (%1$s) შესრულებისáƒáƒ¡" -#: libpq_source.c:176 +#: libpq_source.c:177 #, c-format msgid "unexpected result set from query" msgstr "მáƒáƒ—ხáƒáƒ•ნის მáƒáƒ£áƒšáƒáƒ“ნელი სედეგი" -#: libpq_source.c:198 +#: libpq_source.c:199 #, c-format msgid "error running query (%s) in source server: %s" msgstr "შეცდáƒáƒ›áƒ სერვერში (%2$s) მáƒáƒ—ხáƒáƒ•ნის (%1$s) შესრულებისáƒáƒ¡" -#: libpq_source.c:219 +#: libpq_source.c:220 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "უცნáƒáƒ‘ი პáƒáƒ¡áƒ£áƒ®áƒ˜ მიმდინáƒáƒ áƒ” WAL ჩáƒáƒ¡áƒ›áƒ˜áƒ¡ მდებáƒáƒ áƒ”áƒáƒ‘ისთვის: %s" -#: libpq_source.c:270 +#: libpq_source.c:271 #, c-format msgid "could not fetch file list: %s" msgstr "ფáƒáƒ˜áƒšáƒ”ბის სიის მიღების პრáƒáƒ‘ლემáƒ: %s" -#: libpq_source.c:275 +#: libpq_source.c:276 #, c-format msgid "unexpected result set while fetching file list" msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი პáƒáƒ¡áƒ£áƒ®áƒ˜ ფáƒáƒ˜áƒšáƒ”ბის სიის მიღებისáƒáƒ¡" -#: libpq_source.c:467 +#: libpq_source.c:477 #, c-format msgid "could not send query: %s" msgstr "მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ’ზáƒáƒ•ნის პრáƒáƒ‘ლემáƒ: %s" -#: libpq_source.c:470 +#: libpq_source.c:480 #, c-format msgid "could not set libpq connection to single row mode" msgstr "ერთმწკრივიáƒáƒœ რეჟიმში libpq შეერთების დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ" -#: libpq_source.c:500 +#: libpq_source.c:510 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ”ბის მიღების მáƒáƒ£áƒšáƒáƒ“ნელი შედეგი: %s" -#: libpq_source.c:505 +#: libpq_source.c:515 #, c-format msgid "received more data chunks than requested" msgstr "მიღებულირმეტი ნáƒáƒ’ლეჯი, ვიდრე მáƒáƒ•ითხáƒáƒ•ე" -#: libpq_source.c:509 +#: libpq_source.c:519 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ›áƒáƒ—ხáƒáƒ•ისáƒáƒ¡ მიღებული შედეგების სეტის მáƒáƒ£áƒšáƒáƒ“ნელი ზáƒáƒ›áƒ" -#: libpq_source.c:515 +#: libpq_source.c:525 #, c-format msgid "unexpected data types in result set while fetching remote files: %u %u %u" msgstr "მáƒáƒœáƒáƒªáƒ”მების მáƒáƒ£áƒšáƒáƒ“ნელი ტიპები დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ›áƒáƒ—ხáƒáƒ•ისáƒáƒ¡ შედეგების სეტში: %u %u %u" -#: libpq_source.c:523 +#: libpq_source.c:533 #, c-format msgid "unexpected result format while fetching remote files" msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ”ბის მიღებისáƒáƒ¡ მიღებული ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელიáƒ" -#: libpq_source.c:529 +#: libpq_source.c:539 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ”ბის მიღების შედეგი მáƒáƒ£áƒšáƒáƒ“ნელ ნულáƒáƒ•áƒáƒœ მნიშვნელáƒáƒ‘ებს შეიცáƒáƒ•ს" -#: libpq_source.c:533 +#: libpq_source.c:543 #, c-format msgid "unexpected result length while fetching remote files" msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ მიღებისáƒáƒ¡ მიღებული შედეგის სიგრძე áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" -#: libpq_source.c:566 +#: libpq_source.c:576 #, c-format msgid "received data for file \"%s\", when requested for \"%s\"" msgstr "მიღებულირმáƒáƒœáƒáƒªáƒ”მები ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\", მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ მáƒáƒ•ითხáƒáƒ•ე \"%s\"" -#: libpq_source.c:570 +#: libpq_source.c:580 #, c-format msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" msgstr "მáƒáƒœáƒáƒªáƒ”მები მიღებულირწáƒáƒœáƒáƒªáƒ•ლებისთვის %lld ფáƒáƒ˜áƒšáƒ¨áƒ˜ %s მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ მáƒáƒ—ხáƒáƒ•ნილი იყრწáƒáƒœáƒáƒªáƒ•ლებისთვის %lld" -#: libpq_source.c:582 +#: libpq_source.c:592 #, c-format msgid "received more than requested for file \"%s\"" msgstr "მიღებულირმეტი, ვიდრე მáƒáƒ—ხáƒáƒ•ნილირფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის: %s" -#: libpq_source.c:595 +#: libpq_source.c:605 #, c-format msgid "unexpected number of data chunks received" msgstr "მáƒáƒœáƒáƒªáƒ”მების მიღებული ნáƒáƒ¬áƒ˜áƒšáƒ”ბის რიცხვი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" -#: libpq_source.c:638 +#: libpq_source.c:648 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) მიღების შეცდáƒáƒ›áƒ: %s" -#: libpq_source.c:643 +#: libpq_source.c:653 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი პáƒáƒ¡áƒ£áƒ®áƒ˜ დáƒáƒ¨áƒáƒ áƒ”ბული ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) მიღებისáƒáƒ¡" @@ -406,11 +480,6 @@ msgstr "წყáƒáƒ áƒáƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შ msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) ზáƒáƒ›áƒ პáƒáƒ áƒáƒšáƒ”ლურáƒáƒ“ შეიცვáƒáƒšáƒ: მáƒáƒ•ელáƒáƒ“ი %d ბáƒáƒ˜áƒ¢áƒ¡. დáƒáƒ™áƒáƒžáƒ˜áƒ áƒ“რ%d" -#: local_source.c:121 local_source.c:172 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" - #: local_source.c:146 #, c-format msgid "could not seek in source file: %m" @@ -461,7 +530,7 @@ msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) გáƒáƒ“áƒáƒ®áƒ•ევის პრáƒáƒ‘ლ msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" msgstr "WAL ჩáƒáƒœáƒáƒ¬áƒ”რი ცვლის ურთიერთáƒáƒ‘áƒáƒ¡, მáƒáƒ’რáƒáƒ› ჩáƒáƒœáƒáƒ¬áƒ”რის ტიპი უცნáƒáƒ‘იáƒ: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" -#: pg_rewind.c:92 +#: pg_rewind.c:94 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" @@ -470,7 +539,7 @@ msgstr "" "%s PostgreSQL კლáƒáƒ¡áƒ¢áƒ”რის მის áƒáƒ¡áƒšáƒ—áƒáƒœ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒáƒ¡ áƒáƒ®áƒ“ენს.\n" "\n" -#: pg_rewind.c:93 +#: pg_rewind.c:95 #, c-format msgid "" "Usage:\n" @@ -481,41 +550,41 @@ msgstr "" " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]..\n" "\n" -#: pg_rewind.c:94 +#: pg_rewind.c:96 #, c-format msgid "Options:\n" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_rewind.c:95 +#: pg_rewind.c:97 #, c-format msgid "" -" -c, --restore-target-wal use restore_command in target configuration to\n" +" -c, --restore-target-wal use \"restore_command\" in target configuration to\n" " retrieve WAL files from archives\n" msgstr "" " -c, --restore-target-wal áƒáƒ áƒ¥áƒ˜áƒ•იდáƒáƒœ WAL ფáƒáƒ˜áƒšáƒ”ბის მისáƒáƒ¦áƒ”ბáƒáƒ“ სáƒáƒ›áƒ˜áƒ–ნე კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒáƒ¨áƒ˜ \n" -" restore_command -ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" +" \"restore_command\" -ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" -#: pg_rewind.c:97 +#: pg_rewind.c:99 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე ჩáƒáƒ¡áƒáƒ¡áƒ¬áƒáƒ áƒ”ბლáƒáƒ“\n" -#: pg_rewind.c:98 +#: pg_rewind.c:100 #, c-format msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" msgstr " --source-pgdata=სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ედáƒáƒ¡áƒáƒ¡áƒ˜áƒœáƒ¥áƒ áƒáƒœáƒ”ბელი სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: pg_rewind.c:99 +#: pg_rewind.c:101 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr " --source-server=CONNSTR დáƒáƒ¡áƒáƒ¡áƒ˜áƒœáƒ¥áƒ áƒáƒœáƒ”ბელი სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სერვერი\n" -#: pg_rewind.c:100 +#: pg_rewind.c:102 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run გáƒáƒ©áƒ”რებáƒ, სáƒáƒœáƒáƒ› რáƒáƒ›áƒ” შეიცვლებáƒ\n" -#: pg_rewind.c:101 +#: pg_rewind.c:103 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" @@ -524,12 +593,12 @@ msgstr "" " -N, --no-sync áƒáƒ  დáƒáƒ•ელáƒáƒ“რცვლილებების\n" " დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡\n" -#: pg_rewind.c:103 +#: pg_rewind.c:105 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress მიმდინáƒáƒ áƒ”áƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებáƒ\n" -#: pg_rewind.c:104 +#: pg_rewind.c:106 #, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" @@ -538,7 +607,7 @@ msgstr "" " -R, --write-recovery-conf რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ჩáƒáƒ¬áƒ”რáƒ\n" " (მáƒáƒ˜áƒ—ხáƒáƒ•ს --source-server)\n" -#: pg_rewind.c:106 +#: pg_rewind.c:108 #, c-format msgid "" " --config-file=FILENAME use specified main server configuration\n" @@ -548,27 +617,32 @@ msgstr "" " სერვერის მითითებული კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¡áƒ˜ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" "\n" -#: pg_rewind.c:108 +#: pg_rewind.c:110 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ›áƒáƒ áƒ—ი შეტყáƒáƒ‘ინებების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: pg_rewind.c:109 +#: pg_rewind.c:111 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" msgstr " --no-ensure-shutdown áƒáƒ  სცáƒáƒ“რáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ გáƒáƒ›áƒáƒ áƒ—ვის შედეგების გáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ\n" -#: pg_rewind.c:110 +#: pg_rewind.c:112 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=მეთáƒáƒ“ი ფáƒáƒ˜áƒšáƒ”ბის დისკზე სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის დáƒáƒ§áƒ”ნებáƒ\n" + +#: pg_rewind.c:113 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_rewind.c:111 +#: pg_rewind.c:114 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_rewind.c:112 +#: pg_rewind.c:115 #, c-format msgid "" "\n" @@ -577,425 +651,420 @@ msgstr "" "\n" "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n" -#: pg_rewind.c:113 +#: pg_rewind.c:116 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" -#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245 -#: pg_rewind.c:252 pg_rewind.c:260 +#: pg_rewind.c:232 pg_rewind.c:240 pg_rewind.c:247 pg_rewind.c:254 +#: pg_rewind.c:261 pg_rewind.c:269 #, c-format msgid "Try \"%s --help\" for more information." msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." -#: pg_rewind.c:230 +#: pg_rewind.c:239 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "წყáƒáƒ áƒ მითითებული áƒáƒ áƒáƒ (--source-pgdata áƒáƒœ --source-server)" -#: pg_rewind.c:237 +#: pg_rewind.c:246 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "შეიძლებრმხáƒáƒšáƒáƒ“ ერთის, --source-pgdata áƒáƒœ --source-server -ის მითითებáƒ" -#: pg_rewind.c:244 +#: pg_rewind.c:253 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "სáƒáƒ›áƒ˜áƒ–ნე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ (--target-pgdata)" -#: pg_rewind.c:251 +#: pg_rewind.c:260 #, c-format msgid "no source server information (--source-server) specified for --write-recovery-conf" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სერვერის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ (--source-server) პáƒáƒ áƒáƒ›áƒ”ტრსთვის --write-recovery-conf მითითებული áƒáƒ áƒáƒ" -#: pg_rewind.c:258 +#: pg_rewind.c:267 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")" -#: pg_rewind.c:273 +#: pg_rewind.c:282 #, c-format msgid "cannot be executed by \"root\"" msgstr "root-ით ვერ გáƒáƒ”შვებáƒ" -#: pg_rewind.c:274 +#: pg_rewind.c:283 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "%s PostgreSQL-ის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლით უნდრგáƒáƒ£áƒ¨áƒ•áƒáƒ—." -#: pg_rewind.c:284 +#: pg_rewind.c:293 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წვდáƒáƒ›áƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელირ\"%s\": %m" -#: pg_rewind.c:302 +#: pg_rewind.c:311 #, c-format msgid "%s" msgstr "%s" -#: pg_rewind.c:305 +#: pg_rewind.c:314 #, c-format msgid "connected to server" msgstr "სერვერთáƒáƒœ მიერთებრწáƒáƒ áƒ›áƒáƒ¢áƒ”ბულიáƒ" -#: pg_rewind.c:366 +#: pg_rewind.c:375 #, c-format msgid "source and target cluster are on the same timeline" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ დრსáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რები იგივე დრáƒáƒ˜áƒ¡ ხáƒáƒ–ზეáƒ" -#: pg_rewind.c:387 +#: pg_rewind.c:396 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "სერვერი დáƒáƒ¨áƒáƒ áƒ“რWAL-ს მდებáƒáƒ áƒ”áƒáƒ‘áƒáƒ–ე %X/%X დრáƒáƒ˜áƒ¡ ხáƒáƒ–ზე %u" -#: pg_rewind.c:442 +#: pg_rewind.c:451 #, c-format msgid "no rewind required" msgstr "გáƒáƒ“áƒáƒ®áƒ•ევრსáƒáƒ­áƒ˜áƒ áƒ áƒáƒ áƒáƒ" -#: pg_rewind.c:451 +#: pg_rewind.c:460 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "გáƒáƒ“áƒáƒ®áƒ•ევრბáƒáƒšáƒ სáƒáƒ”რთრსáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილიდáƒáƒœ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X დრáƒáƒ˜áƒ¡ ხáƒáƒ–ზე %u" -#: pg_rewind.c:461 +#: pg_rewind.c:470 #, c-format msgid "reading source file list" msgstr "ფáƒáƒ˜áƒšáƒ”ბის წყáƒáƒ áƒáƒ¡ სიის კითხვáƒ" -#: pg_rewind.c:465 +#: pg_rewind.c:474 #, c-format msgid "reading target file list" msgstr "სáƒáƒ›áƒ˜áƒ–ნის ფáƒáƒ˜áƒšáƒ”ბის სიის კითხვáƒ" -#: pg_rewind.c:474 +#: pg_rewind.c:483 #, c-format msgid "reading WAL in target" msgstr "სáƒáƒ›áƒ˜áƒ–ნეში მყáƒáƒ¤áƒ˜ WAL-ის კითხვáƒ" -#: pg_rewind.c:495 +#: pg_rewind.c:504 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ %lu მბ-ის კáƒáƒžáƒ˜áƒ áƒ”ბრ(სáƒáƒ¬áƒ§áƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის სრული ზáƒáƒ›áƒáƒ %lu მბ)" -#: pg_rewind.c:513 +#: pg_rewind.c:522 #, c-format msgid "syncing target data directory" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ›áƒ˜áƒ–ე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ" -#: pg_rewind.c:529 +#: pg_rewind.c:538 #, c-format msgid "Done!" msgstr "შესრულებულიáƒ!" -#: pg_rewind.c:609 +#: pg_rewind.c:618 #, c-format msgid "no action decided for file \"%s\"" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის %s ქმედებრáƒáƒ áƒ©áƒ”ული áƒáƒ áƒáƒ" -#: pg_rewind.c:641 +#: pg_rewind.c:650 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ფáƒáƒ˜áƒšáƒ˜ შეიცვáƒáƒšáƒ, სáƒáƒœáƒáƒ› pg_rewind იყრგáƒáƒ¨áƒ•ებული" -#: pg_rewind.c:645 +#: pg_rewind.c:654 #, c-format msgid "creating backup label and updating control file" msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ ჭდის შექმნრდრსáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ" -#: pg_rewind.c:695 +#: pg_rewind.c:704 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სისტემრგáƒáƒ“áƒáƒ®áƒ•ევისáƒáƒ¡ გáƒáƒ£áƒ áƒ™áƒ•ეველ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒáƒ¨áƒ˜ áƒáƒ¦áƒ›áƒáƒ©áƒœáƒ“áƒ" -#: pg_rewind.c:727 +#: pg_rewind.c:736 #, c-format msgid "source and target clusters are from different systems" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ დრსáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რები სხვáƒáƒ“áƒáƒ¡áƒáƒ®áƒ•რსისტემებიდáƒáƒœáƒáƒ" -#: pg_rewind.c:735 +#: pg_rewind.c:744 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "კლáƒáƒ¡áƒ¢áƒ”რები pg_rewind-ის áƒáƒ› ვერსიáƒáƒ¡áƒ—áƒáƒœ შეუთáƒáƒ•სებელიáƒ" -#: pg_rewind.c:745 +#: pg_rewind.c:754 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "სáƒáƒ›áƒ–ნე სერვერზე სáƒáƒ­áƒ˜áƒ áƒáƒ áƒáƒœ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ, áƒáƒœ \"wal_log_hints = on\"" -#: pg_rewind.c:756 +#: pg_rewind.c:765 #, c-format msgid "target server must be shut down cleanly" msgstr "სáƒáƒ›áƒ˜áƒ–ნე ბáƒáƒ–რწესების დáƒáƒªáƒ•ით უნდრიყáƒáƒ¡ გáƒáƒ›áƒáƒ áƒ—ული" -#: pg_rewind.c:766 +#: pg_rewind.c:775 #, c-format msgid "source data directory must be shut down cleanly" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ბáƒáƒ–რწესების დáƒáƒªáƒ•ით უნდრიყáƒáƒ¡ გáƒáƒ›áƒáƒ áƒ—ული" -#: pg_rewind.c:813 +#: pg_rewind.c:822 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s კბ (%d%%) დáƒáƒ™áƒáƒžáƒ˜áƒ áƒ“áƒ" -#: pg_rewind.c:941 +#: pg_rewind.c:948 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ დრსáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რების დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის სáƒáƒ”რთრწინáƒáƒžáƒ áƒ˜áƒ¡ პáƒáƒ•ნრშეუძლებელიáƒ" -#: pg_rewind.c:982 +#: pg_rewind.c:989 #, c-format msgid "backup label buffer too small" msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ ჭდის ბáƒáƒ¤áƒ”რი ძáƒáƒšáƒ˜áƒáƒœ პáƒáƒ¢áƒáƒ áƒáƒ" -#: pg_rewind.c:1005 +#: pg_rewind.c:1012 #, c-format msgid "unexpected control file CRC" msgstr "კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი CRC" -#: pg_rewind.c:1017 +#: pg_rewind.c:1024 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე: %d. უნდრიყáƒáƒ¡: %d" -#: pg_rewind.c:1026 +#: pg_rewind.c:1034 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" -msgstr[0] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ მითითებულირ%d ბáƒáƒ˜áƒ¢áƒ˜" -msgstr[1] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ მითითებულირ%d ბáƒáƒ˜áƒ¢áƒ˜" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%d ბáƒáƒ˜áƒ¢áƒ˜)" +msgstr[1] "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%d ბáƒáƒ˜áƒ¢áƒ˜)" -#: pg_rewind.c:1065 pg_rewind.c:1135 +#: pg_rewind.c:1038 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, შუáƒáƒšáƒ”დიდáƒáƒœ 1მბ-1გბ." + +#: pg_rewind.c:1075 pg_rewind.c:1143 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "პრáƒáƒ’რáƒáƒ›áƒ \"%s\" სჭირდებრ\"%s\"-ს, მáƒáƒ’რáƒáƒ› იგივე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში, სáƒáƒ“áƒáƒª \"%s\", ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" -#: pg_rewind.c:1068 pg_rewind.c:1138 +#: pg_rewind.c:1078 pg_rewind.c:1146 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "პრáƒáƒ’რáƒáƒ›áƒ „%s“ ნáƒáƒžáƒáƒ•ნირ„%s“-ის მიერ, მáƒáƒ’რáƒáƒ› ვერსიáƒ, იგივერáƒáƒ áƒáƒ, რáƒáƒª %s" -#: pg_rewind.c:1101 +#: pg_rewind.c:1107 #, c-format -msgid "restore_command is not set in the target cluster" -msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ”რში restore_command დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" +msgid "could not read restore_command from target cluster" +msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რიდáƒáƒœ restore_command-ის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ" -#: pg_rewind.c:1142 +#: pg_rewind.c:1112 +#, c-format +msgid "\"restore_command\" is not set in the target cluster" +msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რში \"restore_command\" დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ" + +#: pg_rewind.c:1150 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ“áƒáƒœ სრულáƒáƒ“ áƒáƒ¦áƒ“გენისთვის სáƒáƒ›áƒ˜áƒ–ნე სერვერზე %s-ის შესრულდებáƒ" -#: pg_rewind.c:1180 +#: pg_rewind.c:1188 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რში postgres-ის ერთმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლიáƒáƒœáƒ˜ რეჟიმის შეცდáƒáƒ›áƒ" -#: pg_rewind.c:1181 +#: pg_rewind.c:1189 #, c-format msgid "Command was: %s" msgstr "ბრძáƒáƒœáƒ”ბრიყáƒ: %s" -#: timeline.c:75 timeline.c:81 +#: timeline.c:74 timeline.c:80 #, c-format msgid "syntax error in history file: %s" msgstr "სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ შეცდáƒáƒ›áƒ ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜: %s" -#: timeline.c:76 +#: timeline.c:75 #, c-format msgid "Expected a numeric timeline ID." msgstr "მáƒáƒ•ელáƒáƒ“ი დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის რიცხვáƒáƒ‘რივ ID-ს." -#: timeline.c:82 +#: timeline.c:81 #, c-format msgid "Expected a write-ahead log switchpoint location." msgstr "მáƒáƒ•ელáƒáƒ“ი წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ გáƒáƒ“áƒáƒ áƒ—ვის წერტილის მდებáƒáƒ áƒ”áƒáƒ‘áƒáƒ¡." -#: timeline.c:87 +#: timeline.c:86 #, c-format msgid "invalid data in history file: %s" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მები ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\"" -#: timeline.c:88 +#: timeline.c:87 #, c-format msgid "Timeline IDs must be in increasing sequence." msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID-ები ზრდáƒáƒ“áƒáƒ‘ით უნდრიყáƒáƒ¡ დáƒáƒšáƒáƒ’ებული." -#: timeline.c:108 +#: timeline.c:107 #, c-format msgid "invalid data in history file" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მები ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜" -#: timeline.c:109 +#: timeline.c:108 #, c-format msgid "Timeline IDs must be less than child timeline's ID." msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID-ები შვილეული დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID-ზე ნáƒáƒ™áƒšáƒ”ბი უნდრიყáƒáƒ¡." -#: xlogreader.c:626 +#: xlogreader.c:619 #, c-format msgid "invalid record offset at %X/%X: expected at least %u, got %u" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წáƒáƒœáƒáƒªáƒ•ლებრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X: მინდáƒáƒ“რ%u, მივიღე %u" -#: xlogreader.c:635 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "contrecord მáƒáƒ—ხáƒáƒ•ნილირ%X/%X-ის მიერ" -#: xlogreader.c:676 xlogreader.c:1123 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X: მáƒáƒ•ელáƒáƒ“ი მინიმუმ %u, მივიღე %u" -#: xlogreader.c:705 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "%u სიგრძის მქáƒáƒœáƒ” ჩáƒáƒœáƒáƒ¬áƒ”რის დეკáƒáƒ“ირებისთვის მეხსიერებრსáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒ áƒáƒ" - -#: xlogreader.c:727 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის სიგრძე %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" - -#: xlogreader.c:776 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "contrecord áƒáƒšáƒáƒ›áƒ˜ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: xlogreader.c:789 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "contrecord -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე %u (მáƒáƒ•ელáƒáƒ“ი %lld) მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:924 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "contrecord მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" - -#: xlogreader.c:1131 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "რესურსის მმáƒáƒ áƒ—ველის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ID %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1144 xlogreader.c:1160 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წინრბმულით %X/%X მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1196 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "რესურსის მმáƒáƒ áƒ—ველის მáƒáƒœáƒáƒªáƒ”მების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ რიცხვი ჩáƒáƒœáƒáƒ¬áƒ”რში მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1230 +#: xlogreader.c:1243 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ’იური რიცხვი %04X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u" -#: xlogreader.c:1245 xlogreader.c:1287 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ˜áƒœáƒ¤áƒáƒ áƒ›áƒáƒªáƒ˜áƒ ბიტები %04X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u" -#: xlogreader.c:1261 +#: xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL ფáƒáƒ˜áƒšáƒ˜ სხვრბáƒáƒ–იდáƒáƒœáƒáƒ: WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ ბáƒáƒ–ის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ %llu, pg_control-ის ბáƒáƒ–ის სისტემის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ კი %llu" -#: xlogreader.c:1269 +#: xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL ფáƒáƒ˜áƒšáƒ˜ სხვრბáƒáƒ–ის სიტემიდáƒáƒœáƒáƒ: სეგმáƒáƒœáƒ¢áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ გვერდის თáƒáƒ•სáƒáƒ áƒ—ში" -#: xlogreader.c:1275 +#: xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL ფáƒáƒ˜áƒšáƒ˜ სხვრმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემიდáƒáƒœáƒáƒ: გვერდის თáƒáƒ•სáƒáƒ áƒ—ში მითითებული XLOG_BLKSZ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" -#: xlogreader.c:1307 +#: xlogreader.c:1320 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი pageaddr %X/%X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u" -#: xlogreader.c:1333 +#: xlogreader.c:1346 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "მიმდევრáƒáƒ‘ის-გáƒáƒ áƒ” დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID %u (%u-ის შემდეგ) ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u" -#: xlogreader.c:1739 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "ურიგრblock_id %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1763 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› მáƒáƒœáƒáƒªáƒ”მები მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: xlogreader.c:1770 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს მáƒáƒœáƒáƒªáƒ”მები სიგრძით %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1806 +#: xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› ნáƒáƒ®áƒ•რეტის წáƒáƒœáƒáƒªáƒ•ლებრ%u სიგრძე %u ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძე %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1822 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ, მáƒáƒ’რáƒáƒ› ნáƒáƒ®áƒ•რეტის წáƒáƒœáƒáƒªáƒ•ლებრ%u სიგრძე %u მისáƒáƒœáƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1836 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძერ%u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1851 +#: xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "áƒáƒ áƒª BKPIMAGE_HAS_HOLE დრáƒáƒ áƒª BKPIMAGE_COMPRESSED დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ, მáƒáƒ’რáƒáƒ› ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძე %u-áƒ, მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1867 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› წინრმნიშვნელáƒáƒ‘რმითითებული áƒáƒ áƒáƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1879 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ block_id %u %X/%X" -#: xlogreader.c:1946 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძით მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1972 +#: xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "შეცდáƒáƒ›áƒ WAL ჩáƒáƒœáƒáƒ¬áƒ”რში მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ ბლáƒáƒ™áƒ˜áƒ¡, ID-ით %d, მáƒáƒ«áƒ”ბნისáƒáƒ¡" -#: xlogreader.c:2056 +#: xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, რáƒáƒªáƒ მითითებულირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბლáƒáƒ™áƒ˜ %d" -#: xlogreader.c:2063 +#: xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ით, ბლáƒáƒ™áƒ˜ %d" -#: xlogreader.c:2090 xlogreader.c:2107 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "%3$s მეთáƒáƒ“ით შეკუმშული áƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %1$X/%2$X, ბლáƒáƒ™áƒ˜ %4$d შეუძლებელიáƒ. მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირáƒáƒ› áƒáƒ’ების მიერ" -#: xlogreader.c:2116 +#: xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, შეკუმშულირუცნáƒáƒ‘ი მეთáƒáƒ“ით, ბლáƒáƒ™áƒ˜ %d" -#: xlogreader.c:2124 +#: xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ გáƒáƒ¨áƒšáƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, ბლáƒáƒ™áƒ˜ %d" @@ -1004,6 +1073,12 @@ msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ გáƒáƒ¨áƒšáƒ მი #~ msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform" #~ msgstr "%s სიმბმულიáƒ, მáƒáƒ’რáƒáƒ› სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმულები áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" +#, c-format +#~ msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" +#~ msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" +#~ msgstr[0] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ მითითებულირ%d ბáƒáƒ˜áƒ¢áƒ˜" +#~ msgstr[1] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1გბ-ს შáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ მითითებულირ%d ბáƒáƒ˜áƒ¢áƒ˜" + #, c-format #~ msgid "cannot create restricted tokens on this platform: error code %lu" #~ msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე შეზღუდული კáƒáƒ“ების შექმნრშეუძლებელიáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" @@ -1023,3 +1098,15 @@ msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ გáƒáƒ¨áƒšáƒ მი #, c-format #~ msgid "invalid record offset at %X/%X" #~ msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წáƒáƒœáƒáƒªáƒ•ლებრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" + +#, c-format +#~ msgid "missing contrecord at %X/%X" +#~ msgstr "contrecord მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#, c-format +#~ msgid "out of memory while trying to decode a record of length %u" +#~ msgstr "%u სიგრძის მქáƒáƒœáƒ” ჩáƒáƒœáƒáƒ¬áƒ”რის დეკáƒáƒ“ირებისთვის მეხსიერებრსáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒ áƒáƒ" + +#, c-format +#~ msgid "record length %u at %X/%X too long" +#~ msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის სიგრძე %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" diff --git a/src/bin/pg_rewind/po/ko.po b/src/bin/pg_rewind/po/ko.po index 4be7bf25e3178..459bbd714014e 100644 --- a/src/bin/pg_rewind/po/ko.po +++ b/src/bin/pg_rewind/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_rewind (PostgreSQL) 12\n" +"Project-Id-Version: pg_rewind (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-02-09 20:16+0000\n" -"PO-Revision-Date: 2019-10-31 17:52+0900\n" +"POT-Creation-Date: 2025-01-17 04:53+0000\n" +"PO-Revision-Date: 2025-01-16 16:58+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -17,397 +17,530 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:188 -#, c-format -msgid "fatal: " -msgstr "심ê°: " - -#: ../../../src/common/logging.c:195 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../../../src/common/logging.c:202 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + +#: ../../common/controldata_utils.c:97 file_ops.c:326 file_ops.c:330 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "\"%s\" íŒŒì¼ ì¼ê¸° 모드로 열기 실패: %m" + +#: ../../common/controldata_utils.c:110 file_ops.c:341 local_source.c:104 +#: local_source.c:163 parsexlog.c:371 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:119 file_ops.c:344 parsexlog.c:373 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: local_source.c:121 local_source.c:172 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ë°”ì´íЏ 순서 불ì¼ì¹˜" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, " +"and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ë°”ì´íЏ 순서 ì¼ì¹˜í•˜ì§€ 않는 문제\n" +"ë°”ì´íЏ 순서 정보는 pg_control 파ì¼ì„ 저장할 때 사용ë˜ëŠ”ë°,\n" +"ì´ íŒŒì¼ì˜ ë°”ì´íЏ 순서 정보와 ì´ í”„ë¡œê·¸ëž¨ì—서 사용하는 순서 ì •ë³´ê°€ 다릅니다.\n" +"ì´ëŸ´ 경우, 출력 결과가 바르지 ì•Šì„ ìˆ˜ 있고,\n" +"ì„¤ì¹˜ëœ PostgreSQL 프로그램과 ë°ì´í„° 디렉터리가 호환ë˜ì§€ ì•Šì„ ìˆ˜ 있습니다." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: parsexlog.c:333 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:249 file_ops.c:117 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ fsync í•  수 ì—†ìŒ: %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "메모리 부족\n" -#: ../../common/fe_memutils.c:92 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "null í¬ì¸í„°ë¥¼ 복제할 수 ì—†ìŒ(ë‚´ë¶€ 오류)\n" -#: ../../common/restricted_token.c:69 +#: ../../common/file_utils.c:76 #, c-format -msgid "cannot create restricted tokens on this platform" -msgstr "restricted tokenì„ ì´ ìš´ì˜ì²´ì œì—서는 만들 수 ì—†ìŒ" +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 위한 íŒŒì¼ ì‹œìŠ¤í…œ ë™ê¸°í™” 실패: %m" -#: ../../common/restricted_token.c:78 +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: ../../fe_utils/archive.c:86 file_ops.c:417 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ì´ ë¹Œë“œëŠ” \"%s\" ë™ê¸°í™” ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:388 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:462 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" + +#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118 +#, c-format +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "\"%s\" 매개 변수용 ê°’ì´ ìž˜ëª»ë¨: \"%s\"" + +#: ../../common/percentrepl.c:80 +#, c-format +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "\"%%\" ì´ìŠ¤ì¼€ì´í”„ ë¬¸ìž ë’¤ì— ì •ìƒ ë¬¸ìžì—´ì´ ì—†ìŒ" + +#: ../../common/percentrepl.c:119 +#, c-format +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "\"%%%c\" ì–‘ì‹ì„ 쓸 문ìžì—´ì´ 아님" + +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "프로세스 토í°ì„ ì—´ 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:91 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "SID를 할당할 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:110 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "restricted tokenì„ ë§Œë“¤ 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:131 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "\"%s\" ëª…ë ¹ì„ ìœ„í•œ 프로세스를 시작할 수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:169 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "restricted tokenì„ ìž¬ì‹¤í–‰ í•  수 ì—†ìŒ: 오류 코드 %lu" -#: ../../common/restricted_token.c:185 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "하위 í”„ë¡œì„¸ìŠ¤ì˜ ì¢…ë£Œ 코드를 구할 수 ì—†ìŒ: 오류 코드 %lu" -#: copy_fetch.c:59 +#: ../../fe_utils/archive.c:69 #, c-format -msgid "could not open directory \"%s\": %m" -msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m" +msgid "unexpected file size for \"%s\": %lld instead of %lld" +msgstr "\"%s\" íŒŒì¼ í¬ê¸°ê°€ ì´ìƒí•¨: %lld 로 비정ìƒ, ì •ìƒê°’ %lld" -#: copy_fetch.c:88 filemap.c:187 filemap.c:348 +#: ../../fe_utils/archive.c:77 #, c-format -msgid "could not stat file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m" +msgid "could not open file \"%s\" restored from archive: %m" +msgstr "ì•„ì¹´ì´ë¸Œì—서 \"%s\" íŒŒì¼ ë³µì› ì‹¤íŒ¨: %m" -#: copy_fetch.c:117 +#: ../../fe_utils/archive.c:98 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "\"%s\" 심볼릭 ë§í¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" +msgid "\"restore_command\" failed: %s" +msgstr "\"restore_command\" 실패: %s" -#: copy_fetch.c:120 +#: ../../fe_utils/archive.c:105 #, c-format -msgid "symbolic link \"%s\" target is too long" -msgstr "\"%s\" 심볼릭 ë§í¬ì˜ 대ìƒì´ 너무 긺" +msgid "could not restore file \"%s\" from archive" +msgstr "ì•„ì¹´ì´ë¸Œì—서 \"%s\" íŒŒì¼ ë³µì› ì‹¤íŒ¨" -#: copy_fetch.c:135 +#: ../../fe_utils/option_utils.c:69 #, c-format -msgid "" -"\"%s\" is a symbolic link, but symbolic links are not supported on this " -"platform" -msgstr "" -"\"%s\" 파ì¼ì€ 심볼릭 ë§í¬ 파ì¼ì´ì§€ë§Œ ì´ ìš´ì˜ì²´ì œëŠ” 심볼릭 ë§í¬ 파ì¼ì„ ì§€ì›í•˜" -"ì§€ 않ìŒ" +msgid "invalid value \"%s\" for option %s" +msgstr "\"%s\" ê°’ì´ ìž˜ëª»ë¨, 해당 옵션: %s" -#: copy_fetch.c:142 +#: ../../fe_utils/option_utils.c:76 #, c-format -msgid "could not read directory \"%s\": %m" -msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" +msgid "%s must be in range %d..%d" +msgstr "%s ê°’ì€ %d..%d 범위 ì•ˆì— ìžˆì–´ì•¼ 함" -#: copy_fetch.c:146 +#: ../../fe_utils/option_utils.c:106 #, c-format -msgid "could not close directory \"%s\": %m" -msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" +msgid "unrecognized sync method: %s" +msgstr "알 수 없는 ë™ê¸°í™” 방법: %s" -#: copy_fetch.c:166 +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 #, c-format -msgid "could not open source file \"%s\": %m" -msgstr "\"%s\" ì›ë³¸ 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" +msgid "out of memory" +msgstr "메모리 부족" -#: copy_fetch.c:170 +#: ../../fe_utils/recovery_gen.c:143 #, c-format -msgid "could not seek in source file: %m" -msgstr "ì›ë³¸ 파ì¼ì—서 seek ìž‘ì—…ì„ í•  수 ì—†ìŒ: %m" +msgid "could not write to file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m" -#: copy_fetch.c:187 file_ops.c:311 parsexlog.c:314 +#: ../../fe_utils/recovery_gen.c:152 #, c-format -msgid "could not read file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" +msgid "could not create file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %m" -#: copy_fetch.c:190 +#: ../../fe_utils/string_utils.c:434 #, c-format -msgid "unexpected EOF while reading file \"%s\"" -msgstr "\"%s\" 파ì¼ì„ ì½ëŠ” 중 예ìƒì¹˜ 못한 EOF" +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "쉘 명령 ì¸ìžì— 줄바꿈 문ìžê°€ 있ìŒ: \"%s\"\n" -#: copy_fetch.c:197 +#: ../../fe_utils/string_utils.c:607 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "ë°ì´í„°ë² ì´ìФ ì´ë¦„ì— ì¤„ë°”ê¿ˆ 문ìžê°€ 있ìŒ: \"%s\"\n" -#: file_ops.c:62 +#: file_ops.c:67 #, c-format msgid "could not open target file \"%s\": %m" msgstr "\"%s\" ëŒ€ìƒ íŒŒì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: file_ops.c:76 +#: file_ops.c:81 #, c-format msgid "could not close target file \"%s\": %m" msgstr "\"%s\" ëŒ€ìƒ íŒŒì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: file_ops.c:96 +#: file_ops.c:101 #, c-format msgid "could not seek in target file \"%s\": %m" msgstr "\"%s\" ëŒ€ìƒ íŒŒì¼ì—서 seek ìž‘ì—…ì„ í•  수 ì—†ìŒ: %m" -#: file_ops.c:112 +#: file_ops.c:150 file_ops.c:177 #, c-format -msgid "could not write file \"%s\": %m" -msgstr "\"%s\" íŒŒì¼ ì“°ê¸° 실패: %m" +msgid "undefined file type for \"%s\"" +msgstr "알 수 없는 íŒŒì¼ í¬ë©§: \"%s\"" -#: file_ops.c:162 +#: file_ops.c:173 #, c-format msgid "invalid action (CREATE) for regular file" msgstr "ì¼ë°˜ 파ì¼ì— 대한 잘못 ëœ ìž‘ì—… (CREATE)" -#: file_ops.c:185 +#: file_ops.c:200 #, c-format msgid "could not remove file \"%s\": %m" msgstr "\"%s\" 파ì¼ì„ 삭제할 수 ì—†ìŒ: %m" -#: file_ops.c:203 +#: file_ops.c:218 #, c-format msgid "could not open file \"%s\" for truncation: %m" msgstr "íŠ¸ëž™ìž­ì…˜ì„ ìœ„í•œ \"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: file_ops.c:207 +#: file_ops.c:222 #, c-format msgid "could not truncate file \"%s\" to %u: %m" msgstr "\"%s\" 파ì¼ì„ %u í¬ê¸°ë¡œ 정리할 수 ì—†ìŒ: %m" -#: file_ops.c:223 +#: file_ops.c:238 #, c-format msgid "could not create directory \"%s\": %m" msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m" -#: file_ops.c:237 +#: file_ops.c:252 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "\"%s\" 디렉터리를 삭제할 수 ì—†ìŒ: %m" -#: file_ops.c:251 +#: file_ops.c:266 #, c-format msgid "could not create symbolic link at \"%s\": %m" msgstr "\"%s\"ì— ëŒ€í•œ 심볼릭 ë§í¬ë¥¼ 만들 수 ì—†ìŒ: %m" -#: file_ops.c:265 +#: file_ops.c:280 #, c-format msgid "could not remove symbolic link \"%s\": %m" msgstr "\"%s\" 심벌릭 ë§í¬ë¥¼ 삭제할 수 ì—†ìŒ: %m" -#: file_ops.c:296 file_ops.c:300 +#: file_ops.c:441 #, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "\"%s\" íŒŒì¼ ì¼ê¸° 모드로 열기 실패: %m" +msgid "could not read symbolic link \"%s\": %m" +msgstr "\"%s\" 심볼릭 ë§í¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: file_ops.c:314 parsexlog.c:316 +#: file_ops.c:444 #, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %zu" +msgid "symbolic link \"%s\" target is too long" +msgstr "\"%s\" 심볼릭 ë§í¬ì˜ 대ìƒì´ 너무 긺" -#: filemap.c:179 +#: file_ops.c:466 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: filemap.c:297 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "\"%s\" ìžë£Œ 파ì¼ì€ ì¼ë°˜ 파ì¼ì´ 아님" -#: filemap.c:201 +#: filemap.c:302 filemap.c:335 #, c-format -msgid "\"%s\" is not a directory" -msgstr "\"%s\" 디렉터리가 아님" +msgid "duplicate source file \"%s\"" +msgstr "\"%s\" 소스 파ì¼ì„ ë‘ ë²ˆ 지정했습니다" -#: filemap.c:224 +#: filemap.c:390 #, c-format -msgid "\"%s\" is not a symbolic link" -msgstr "\"%s\" 심볼릭 ë§í¬ê°€ 아님" +msgid "unexpected page modification for non-regular file \"%s\"" +msgstr "\"%s\" 비ì¼ë°˜ 파ì¼ì˜ 페ì´ì§€ 변경 ì •ë³´ê°€ 잘못ë¨" -#: filemap.c:236 +#: filemap.c:744 filemap.c:846 #, c-format -msgid "\"%s\" is not a regular file" -msgstr "\"%s\" ì¼ë°˜ 파ì¼ì´ 아님" +msgid "unknown file type for \"%s\"" +msgstr "\"%s\" íŒŒì¼ í˜•ì‹ì„ 알 수 ì—†ìŒ" -#: filemap.c:360 +#: filemap.c:779 #, c-format -msgid "source file list is empty" -msgstr "ì›ë³¸ íŒŒì¼ ëª©ë¡ì´ 비었ìŒ" +msgid "file \"%s\" is of different type in source and target" +msgstr "\"%s\" íŒŒì¼ í˜•ì‹ì´ 소스와 íƒ€ì¼“ì´ ì„œë¡œ 다름" -#: filemap.c:475 +#: filemap.c:851 #, c-format -msgid "unexpected page modification for directory or symbolic link \"%s\"" -msgstr "ë””í…터리나 심볼릭 ë§í¬ \"%s\" ì˜ íŽ˜ì´ì§€ 변경 ì •ë³´ê°€ 잘못 ë¨" +msgid "could not decide what to do with file \"%s\"" +msgstr "\"%s\" 파ì¼ë¡œ ë­˜ 해야할지 ê²°ì •í•  수 ì—†ìŒ" -#: libpq_fetch.c:52 +#: libpq_source.c:131 #, c-format -msgid "could not connect to server: %s" -msgstr "서버 ì ‘ì† ì‹¤íŒ¨: %s" +msgid "could not clear \"search_path\": %s" +msgstr "\"search_path\"를 지울 수 ì—†ìŒ: %s" -#: libpq_fetch.c:56 +#: libpq_source.c:142 #, c-format -msgid "connected to server" -msgstr "서버 ì ‘ì† ì™„ë£Œ" +msgid "\"full_page_writes\" must be enabled in the source server" +msgstr "ì›ë³¸ 서버는 \"full_page_writes\" 옵션으로 ìš´ì˜ë˜ì–´ì•¼ 함" -#: libpq_fetch.c:65 +#: libpq_source.c:153 #, c-format -msgid "could not clear search_path: %s" -msgstr "search_path를 지울 수 ì—†ìŒ: %s" +msgid "could not prepare statement to fetch file contents: %s" +msgstr "íŒŒì¼ ë‚´ìš©ì„ ë½‘ê¸° 위한 êµ¬ë¬¸ì„ ì¤€ë¹„í•  수 ì—†ìŒ: %s" -#: libpq_fetch.c:77 +#: libpq_source.c:172 #, c-format -msgid "source server must not be in recovery mode" -msgstr "ì›ë³¸ 서버는 복구 모드가 아니여야 함" +msgid "error running query (%s) on source server: %s" +msgstr "ì›ë³¸ 서버ì—서 쿼리 (%s) 실행 오류: %s" -#: libpq_fetch.c:87 +#: libpq_source.c:177 #, c-format -msgid "full_page_writes must be enabled in the source server" -msgstr "ì›ë³¸ 서버는 full_page_writes 옵션으로 ìš´ì˜ë˜ì–´ì•¼ 함" +msgid "unexpected result set from query" +msgstr "쿼리 결과가 바르지 않ìŒ" -#: libpq_fetch.c:113 libpq_fetch.c:139 +#: libpq_source.c:199 #, c-format msgid "error running query (%s) in source server: %s" msgstr "ì›ë³¸ì—서ì—서 쿼리(%s) 실행 오류: %s" -#: libpq_fetch.c:118 -#, c-format -msgid "unexpected result set from query" -msgstr "쿼리 결과가 바르지 않ìŒ" - -#: libpq_fetch.c:159 +#: libpq_source.c:220 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "현재 WAL 삽입 위치를 위한 결과가 ìž˜ëª»ë¨ : \"%s\"" -#: libpq_fetch.c:209 +#: libpq_source.c:271 #, c-format msgid "could not fetch file list: %s" msgstr "íŒŒì¼ ëª©ë¡ì„ 가져올 수 ì—†ìŒ: %s" -#: libpq_fetch.c:214 +#: libpq_source.c:276 #, c-format msgid "unexpected result set while fetching file list" msgstr "íŒŒì¼ ëª©ë¡ì„ 가져온 결과가 잘못 ë¨" -#: libpq_fetch.c:262 +#: libpq_source.c:477 #, c-format msgid "could not send query: %s" msgstr "쿼리를 보낼 수 ì—†ìŒ: %s" -#: libpq_fetch.c:267 +#: libpq_source.c:480 #, c-format msgid "could not set libpq connection to single row mode" msgstr "libpq ì—°ê²°ì„ ë‹¨ì¼ ë¡œìš° 모드로 지정할 수 ì—†ìŒ" -#: libpq_fetch.c:288 +#: libpq_source.c:510 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "ì›ê²© 파ì¼ì„ 가져오는 ë„중 결과가 잘못ë¨: %s" -#: libpq_fetch.c:294 +#: libpq_source.c:515 +#, c-format +msgid "received more data chunks than requested" +msgstr "용천 ëœ ê²ƒë³´ë‹¤ ë§Žì€ ë°ì´í„° ì²­í¬ë¥¼ 받았ìŒ" + +#: libpq_source.c:519 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "ì›ê²© 파ì¼ì„ 가져오는 ë„중 ê²°ê³¼ ì§‘í•©ì˜ í¬ê¸°ê°€ 잘못 ë¨" -#: libpq_fetch.c:300 +#: libpq_source.c:525 #, c-format msgid "" "unexpected data types in result set while fetching remote files: %u %u %u" msgstr "ì›ê²© 파ì¼ì„ 가져오는 ë„중 ê²°ê³¼ ì§‘í•©ì˜ ìžë£Œí˜•ì´ ìž˜ëª» ë¨: %u %u %u" -#: libpq_fetch.c:308 +#: libpq_source.c:533 #, c-format msgid "unexpected result format while fetching remote files" msgstr "ì›ê²© 파ì¼ì„ 가져오는 중 예ìƒì¹˜ 못한 ê²°ê³¼ í˜•ì‹ ë°œê²¬" -#: libpq_fetch.c:314 +#: libpq_source.c:539 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "ì›ê²© 파ì¼ì„ 가져오는 ë„중 ê²°ê³¼ì•ˆì— null ê°’ì´ ìž˜ëª»ë¨" -#: libpq_fetch.c:318 +#: libpq_source.c:543 #, c-format msgid "unexpected result length while fetching remote files" msgstr "ì›ê²© 파ì¼ì„ 가져오는 ë„중 ê²°ê³¼ 길ì´ê°€ 잘못ë¨" -#: libpq_fetch.c:384 +#: libpq_source.c:576 +#, c-format +msgid "received data for file \"%s\", when requested for \"%s\"" +msgstr "\"%s\" 파ì¼ìš© ë°ì´í„°ë¥¼ 받았ìŒ, \"%s\" 요청 처리용" + +#: libpq_source.c:580 +#, c-format +msgid "" +"received data at offset %lld of file \"%s\", when requested for offset %lld" +msgstr "" +"%lld 오프셋(해당파ì¼: \"%s\")ì— ë°ì´í„°ë¥¼ 받았ìŒ, %lld 오프셋 요청 처리용" + +#: libpq_source.c:592 +#, c-format +msgid "received more than requested for file \"%s\"" +msgstr "\"%s\" 파ì¼ì„ 위한 보다 ë§Žì€ ìš”ì²­ì„ ë°›ì•˜ìŒ" + +#: libpq_source.c:605 +#, c-format +msgid "unexpected number of data chunks received" +msgstr "ë°ì´í„° ì²­í¬ ìˆ˜ì‹  숫ìžê°€ ì´ìƒí•¨" + +#: libpq_source.c:648 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "\"%s\" ì›ê²© 파ì¼ì„ 가져올 수 ì—†ìŒ: %s" -#: libpq_fetch.c:389 +#: libpq_source.c:653 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "\"%s\" ì›ê²©íŒŒì¼ì„ 가져오는 ë„중 ê²°ê³¼ ì§‘í•©ì´ ìž˜ëª» ë¨" -#: libpq_fetch.c:433 +#: local_source.c:90 local_source.c:142 #, c-format -msgid "could not send COPY data: %s" -msgstr "COPY ìžë£Œë¥¼ 보낼 수 ì—†ìŒ: %s" +msgid "could not open source file \"%s\": %m" +msgstr "\"%s\" ì›ë³¸ 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: libpq_fetch.c:462 +#: local_source.c:117 #, c-format -msgid "could not send file list: %s" -msgstr "íŒŒì¼ ëª©ë¡ì„ 보낼 수 ì—†ìŒ: %s" +msgid "" +"size of source file \"%s\" changed concurrently: %d bytes expected, %d copied" +msgstr "\"%s\" 소스 íŒŒì¼ í¬ê¸°ê°€ 현재 변경 ë˜ì—ˆìŒ: 기대값: %d, 실재값 %d" -#: libpq_fetch.c:504 +#: local_source.c:146 #, c-format -msgid "could not send end-of-COPY: %s" -msgstr "COPYëì„ ë³´ë‚¼ 수 ì—†ìŒ: %s" +msgid "could not seek in source file: %m" +msgstr "ì›ë³¸ 파ì¼ì—서 seek ìž‘ì—…ì„ í•  수 ì—†ìŒ: %m" -#: libpq_fetch.c:510 +#: local_source.c:165 #, c-format -msgid "unexpected result while sending file list: %s" -msgstr "íŒŒì¼ ëª©ë¡ì„ 보내는 ë„중 결과가 잘못 ë¨: %s" +msgid "unexpected EOF while reading file \"%s\"" +msgstr "\"%s\" 파ì¼ì„ ì½ëŠ” 중 예ìƒì¹˜ 못한 EOF" -#: parsexlog.c:74 parsexlog.c:127 parsexlog.c:185 +#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:201 #, c-format -msgid "out of memory" -msgstr "메모리 부족" +msgid "out of memory while allocating a WAL reading processor" +msgstr "WAL ì½ê¸° 프로세서를 할당하는 중 메모리 부족" -#: parsexlog.c:87 parsexlog.c:133 +#: parsexlog.c:92 parsexlog.c:146 #, c-format msgid "could not read WAL record at %X/%X: %s" msgstr "%X/%X 위치ì—서 WAL 레코드를 ì½ì„ 수 ì—†ìŒ: %s" -#: parsexlog.c:91 parsexlog.c:136 +#: parsexlog.c:96 parsexlog.c:149 #, c-format msgid "could not read WAL record at %X/%X" msgstr "%X/%X 위치ì—서 WAL 레코드를 ì½ì„ 수 ì—†ìŒ" -#: parsexlog.c:197 +#: parsexlog.c:108 +#, c-format +msgid "end pointer %X/%X is not a valid end point; expected %X/%X" +msgstr "%X/%X ë í¬ì¸í„°ëŠ” ë°”ë¥¸ê°’ì´ ì•„ë‹˜; 기대값: %X/%X" + +#: parsexlog.c:214 #, c-format msgid "could not find previous WAL record at %X/%X: %s" msgstr "%X/%X 위치ì—서 ì´ì „ WAL 레코드를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" -#: parsexlog.c:201 +#: parsexlog.c:218 #, c-format msgid "could not find previous WAL record at %X/%X" msgstr "%X/%X 위치ì—서 ì´ì „ WAL 레코드를 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: parsexlog.c:292 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" - -#: parsexlog.c:305 +#: parsexlog.c:362 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "\"%s\" 파ì¼ì—서 seek ìž‘ì—…ì„ í•  수 ì—†ìŒ: %m" -#: parsexlog.c:385 +#: parsexlog.c:461 #, c-format msgid "" "WAL record modifies a relation, but record type is not recognized: lsn: %X/" -"%X, rmgr: %s, info: %02X" +"%X, rmid: %d, rmgr: %s, info: %02X" msgstr "" -"WAL 레코드가 릴레ì´ì…˜ì„ 변경하려고 하지만, 레코드 형태가 올바르지 않ìŒ\n" -"lsn: %X/%X, rmgr: %s, info: %02X" +"WAL 레코드가 릴레ì´ì…˜ì„ 변경하려고 하지만, 레코드 형태가 바르지 않ìŒ: lsn: " +"%X/%X, rmid: %d, rmgr: %s, info: %02X" -#: pg_rewind.c:72 +#: pg_rewind.c:94 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" @@ -417,7 +550,7 @@ msgstr "" "니다.\n" "\n" -#: pg_rewind.c:73 +#: pg_rewind.c:95 #, c-format msgid "" "Usage:\n" @@ -428,33 +561,43 @@ msgstr "" " %s [옵션]...\n" "\n" -#: pg_rewind.c:74 +#: pg_rewind.c:96 #, c-format msgid "Options:\n" msgstr "옵션들:\n" -#: pg_rewind.c:75 +#: pg_rewind.c:97 +#, c-format +msgid "" +" -c, --restore-target-wal use \"restore_command\" in target " +"configuration to\n" +" retrieve WAL files from archives\n" +msgstr "" +" -c, --restore-target-wal ì•„ì¹´ì´ë¸Œì—서 WAL 파ì¼ì„ 가져오기 위해\n" +" ëŒ€ìƒ í™˜ê²½ 설정 \"restore_command\" 사용\n" + +#: pg_rewind.c:99 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=디렉터리 변경하려는 ë°ì´í„° 디렉터리\n" -#: pg_rewind.c:76 +#: pg_rewind.c:100 #, c-format msgid "" " --source-pgdata=DIRECTORY source data directory to synchronize with\n" msgstr " --source-pgdata=디렉터리 ë™ê¸°í™” ì›ë³¸ì´ ë˜ëŠ” ë°ì´í„° 디렉터리\n" -#: pg_rewind.c:77 +#: pg_rewind.c:101 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr " --source-server=연결문ìžì—´ ì›ë³¸ 서버 ì ‘ì† ì •ë³´\n" -#: pg_rewind.c:78 +#: pg_rewind.c:102 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run 변경 작업 ì „ì— ë©ˆì¶¤(검사, 확ì¸ìš©)\n" -#: pg_rewind.c:79 +#: pg_rewind.c:103 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" @@ -463,145 +606,213 @@ msgstr "" " -N, --no-sync 작업 완료 ë’¤ ë””ìŠ¤í¬ ë™ê¸°í™” ìž‘ì—…ì„ í•˜ì§€ 않" "ìŒ\n" -#: pg_rewind.c:81 +#: pg_rewind.c:105 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress ì§„í–‰ 과정 메시지를 보여줌\n" -#: pg_rewind.c:82 +#: pg_rewind.c:106 +#, c-format +msgid "" +" -R, --write-recovery-conf write configuration for replication\n" +" (requires --source-server)\n" +msgstr "" +" -R, --write-recovery-conf 복제를 위한 환경 설정 함\n" +" (--source-server 설정 필요함)\n" + +#: pg_rewind.c:108 +#, c-format +msgid "" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr "" +" --config-file=파ì¼ì´ë¦„ ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ë¥¼ 실행할 때 사용할\n" +" 서버 환경 설정 íŒŒì¼ ì§€ì •\n" + +#: pg_rewind.c:110 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug 디버그 메시지를 보여줌\n" -#: pg_rewind.c:83 +#: pg_rewind.c:111 +#, c-format +msgid "" +" --no-ensure-shutdown do not automatically fix unclean shutdown\n" +msgstr "" +" --no-ensure-shutdown ë¹„ì •ìƒ ì¢…ë£Œ 시 ìžë™ 뒷정리 작업 안함\n" + +#: pg_rewind.c:112 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr "" +" --sync-method=METHOD 파ì¼ì„ 디스í¬ì— ë™ê¸°í™” 하는 방법 지정\n" + +#: pg_rewind.c:113 #, c-format msgid "" " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: pg_rewind.c:84 +#: pg_rewind.c:114 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: pg_rewind.c:85 +#: pg_rewind.c:115 #, c-format msgid "" "\n" -"Report bugs to .\n" +"Report bugs to <%s>.\n" msgstr "" "\n" -"오류보고: .\n" +"ë¬¸ì œì  ë³´ê³  주소: <%s>\n" + +#: pg_rewind.c:116 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 홈페ì´ì§€: <%s>\n" -#: pg_rewind.c:142 pg_rewind.c:178 pg_rewind.c:185 pg_rewind.c:192 -#: pg_rewind.c:200 +#: pg_rewind.c:232 pg_rewind.c:240 pg_rewind.c:247 pg_rewind.c:254 +#: pg_rewind.c:261 pg_rewind.c:269 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "ìžì œí•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보십시오.\n" +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." -#: pg_rewind.c:177 +#: pg_rewind.c:239 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "" "ì›ë³¸ì„ 지정하지 ì•Šì•˜ìŒ (--source-pgdata ë˜ëŠ” --source-server ì˜µì…˜ì„ ì§€ì • í•´" "야 함)" -#: pg_rewind.c:184 +#: pg_rewind.c:246 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "--source-pgdata ë˜ëŠ” --source-server 옵션 중 하나만 지정해야 함" -#: pg_rewind.c:191 +#: pg_rewind.c:253 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "ëŒ€ìƒ ë°ì´í„° 디렉토리가 지정ë˜ì§€ ì•Šì•˜ìŒ (--target-pgdata 옵션 사용)" -#: pg_rewind.c:198 +#: pg_rewind.c:260 +#, c-format +msgid "" +"no source server information (--source-server) specified for --write-" +"recovery-conf" +msgstr "--write-recovery-conf ìš© ì›ë³´ 서버 ì •ë³´(--source-server) ì—†ìŒ" + +#: pg_rewind.c:267 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")" -#: pg_rewind.c:213 +#: pg_rewind.c:282 #, c-format msgid "cannot be executed by \"root\"" msgstr "\"root\" 계정으로는 실행 í•  수 ì—†ìŒ" -#: pg_rewind.c:214 +#: pg_rewind.c:283 #, c-format -msgid "You must run %s as the PostgreSQL superuser.\n" -msgstr "PostgreSQL superuser로 %s í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•˜ì‹­ì‹œì˜¤.\n" +msgid "You must run %s as the PostgreSQL superuser." +msgstr "PostgreSQL superuser로 %s í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•˜ì‹­ì‹œì˜¤." -#: pg_rewind.c:225 +#: pg_rewind.c:293 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "\"%s\" 디렉터리 ì½ê¸° 권한 ì—†ìŒ: %m" -#: pg_rewind.c:256 +#: pg_rewind.c:311 +#, c-format +msgid "%s" +msgstr "%s" + +#: pg_rewind.c:314 +#, c-format +msgid "connected to server" +msgstr "서버 ì ‘ì† ì™„ë£Œ" + +#: pg_rewind.c:375 #, c-format msgid "source and target cluster are on the same timeline" msgstr "ì›ë³¸ê³¼ ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ì˜ íƒ€ìž„ë¼ì¸ì´ ê°™ìŒ" -#: pg_rewind.c:262 +#: pg_rewind.c:396 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "서버 분기 WAL 위치: %X/%X, 타임ë¼ì¸ %u" -#: pg_rewind.c:299 +#: pg_rewind.c:451 #, c-format msgid "no rewind required" msgstr "ë˜ê°ì„ í•„ìš” ì—†ìŒ" -#: pg_rewind.c:306 +#: pg_rewind.c:463 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "재ë™ê¸°í™” 시작함, 마지막 ì²´í¬í¬ì¸íЏ 위치 %X/%X, 타임ë¼ì¸ %u" -#: pg_rewind.c:315 +#: pg_rewind.c:473 #, c-format msgid "reading source file list" msgstr "ì›ë³¸ íŒŒì¼ ëª©ë¡ ì½ëŠ” 중" -#: pg_rewind.c:318 +#: pg_rewind.c:477 #, c-format msgid "reading target file list" msgstr "ëŒ€ìƒ íŒŒì¼ ëª©ë¡ ì½ëŠ” 중" -#: pg_rewind.c:329 +#: pg_rewind.c:486 #, c-format msgid "reading WAL in target" msgstr "ëŒ€ìƒ ì„œë²„ì—서 WAL ì½ëŠ” 중" -#: pg_rewind.c:346 +#: pg_rewind.c:507 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "복사를 위해서 %lu MB 필요함 (ì›ë³¸ 디렉토리 ì „ì²´ í¬ê¸°ëŠ” %lu MB)" -#: pg_rewind.c:365 -#, c-format -msgid "creating backup label and updating control file" -msgstr "백업 ë¼ë²¨ì„ 만들고, 컨트롤 파ì¼ì„ 갱신 중" - -#: pg_rewind.c:395 +#: pg_rewind.c:525 #, c-format msgid "syncing target data directory" msgstr "ëŒ€ìƒ ë°ì´í„° 디렉터리 ë™ê¸°í™” 중" -#: pg_rewind.c:398 +#: pg_rewind.c:541 #, c-format msgid "Done!" msgstr "완료!" -#: pg_rewind.c:410 +#: pg_rewind.c:621 +#, c-format +msgid "no action decided for file \"%s\"" +msgstr "%s 외부 í…Œì´ë¸” ì ‘ê·¼ 권한 ì—†ìŒ" + +#: pg_rewind.c:653 +#, c-format +msgid "source system was modified while pg_rewind was running" +msgstr "pg_rewind 실행 ë˜ê³  있는 ì¤‘ì— ì›ë³¸ ì‹œìŠ¤í…œì´ ë³€ê²½ ë˜ì—ˆìŒ" + +#: pg_rewind.c:657 +#, c-format +msgid "creating backup label and updating control file" +msgstr "백업 ë¼ë²¨ì„ 만들고, 컨트롤 파ì¼ì„ 갱신 중" + +#: pg_rewind.c:707 +#, c-format +msgid "source system was in unexpected state at end of rewind" +msgstr "rewind ëì— ì›ë³¸ ì‹œìŠ¤í…œì˜ ìƒíƒœê°€ 예ìƒê°’ê³¼ 다름" + +#: pg_rewind.c:739 #, c-format msgid "source and target clusters are from different systems" msgstr "ì›ë³¸ê³¼ ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ê°€ 서로 다른 시스템임" -#: pg_rewind.c:418 +#: pg_rewind.c:747 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "해당 í´ëŸ¬ìŠ¤í„°ëŠ” ì´ pg_rewind 버전으로 작업할 수 ì—†ìŒ" -#: pg_rewind.c:428 +#: pg_rewind.c:757 #, c-format msgid "" "target server needs to use either data checksums or \"wal_log_hints = on\"" @@ -609,159 +820,189 @@ msgstr "" "ëŒ€ìƒ ì„œë²„ì˜ ë°ì´í„° í´ëŸ¬ìŠ¤í„°ê°€ ë°ì´í„° ì²´í¬ì„¬ ê¸°ëŠ¥ì„ ì¼°ê±°ë‚˜, \"wal_log_hints " "= on\" ì„¤ì •ì´ ë˜ì–´ì•¼ 함" -#: pg_rewind.c:439 +#: pg_rewind.c:768 #, c-format msgid "target server must be shut down cleanly" msgstr "ëŒ€ìƒ ì„œë²„ëŠ” ì •ìƒ ì¢…ë£Œë˜ì–´ì•¼ 함" -#: pg_rewind.c:449 +#: pg_rewind.c:778 #, c-format msgid "source data directory must be shut down cleanly" msgstr "ì›ë³¸ ë°ì´í„° 디렉토리는 ì •ìƒì ìœ¼ë¡œ 종료ë˜ì–´ì•¼ 함" -#: pg_rewind.c:498 +#: pg_rewind.c:825 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s kB (%d%%) 복사ë¨" -#: pg_rewind.c:559 -#, c-format -msgid "invalid control file" -msgstr "ìž˜ëª»ëœ ì»¨íŠ¸ë¡¤ 파ì¼" - -#: pg_rewind.c:643 +#: pg_rewind.c:951 #, c-format msgid "" "could not find common ancestor of the source and target cluster's timelines" msgstr "ì›ë³¸ê³¼ ëŒ€ìƒ ì„œë²„ì˜ ê³µí†µëœ ìƒìœ„ 타임ë¼ì¸ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_rewind.c:684 +#: pg_rewind.c:992 #, c-format msgid "backup label buffer too small" msgstr "백업 ë¼ë²¨ 버í¼ê°€ 너무 ìž‘ìŒ" -#: pg_rewind.c:707 +#: pg_rewind.c:1015 #, c-format msgid "unexpected control file CRC" msgstr "컨트롤 íŒŒì¼ CRC 오류" -#: pg_rewind.c:717 +#: pg_rewind.c:1027 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "컨트롤 파ì¼ì˜ í¬ê¸°ê°€ %d 로 비정ìƒ, ì •ìƒê°’ %d" -#: pg_rewind.c:726 +#: pg_rewind.c:1037 +#, c-format +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "컨트롤 íŒŒì¼ ì•ˆì— ìž˜ëª»ëœ WAL ì¡°ê° í¬ê¸° (%d ë°”ì´íЏ)" + +#: pg_rewind.c:1041 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL ì¡°ê° íŒŒì¼ì€ 1MB부터 1GB ì‚¬ì´ 2^n í¬ê¸°ì—¬ì•¼ 함" + +#: pg_rewind.c:1078 pg_rewind.c:1146 #, c-format msgid "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the " -"control file specifies %d byte" -msgid_plural "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the " -"control file specifies %d bytes" -msgstr[0] "" -"WAL ì¡°ê° íŒŒì¼ì€ 1MB부터 1GB ì‚¬ì´ 2^n í¬ê¸°ì—¬ì•¼ 하지만, 컨트롤 파ì¼ì—는 %d ë°”ì´" -"트로 지정ë˜ì—ˆìŒ" +"program \"%s\" is needed by %s but was not found in the same directory as " +"\"%s\"" +msgstr "" +"\"%s\" í”„ë¡œê·¸ëž¨ì´ %s 작업ì—서 필요합니다. 그런ë°, ì´ íŒŒì¼ì´ \"%s\" 파ì¼ì´ 있" +"는 ë””ë ‰í„°ë¦¬ì•ˆì— ì—†ìŠµë‹ˆë‹¤." -#: timeline.c:76 timeline.c:82 +#: pg_rewind.c:1081 pg_rewind.c:1149 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "" +"\"%s\" í”„ë¡œê·¸ëž¨ì„ \"%s\" 작업 ë•Œë¬¸ì— ì°¾ì•˜ì§€ë§Œ ì´ íŒŒì¼ì€ %s í”„ë¡œê·¸ëž¨ì˜ ë²„ì „ê³¼ " +"다릅니다." + +#: pg_rewind.c:1110 +#, c-format +msgid "could not read restore_command from target cluster" +msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ì— restore_command ì„¤ì •ì„ ì½ì„ 수 ì—†ìŒ" + +#: pg_rewind.c:1115 +#, c-format +msgid "\"restore_command\" is not set in the target cluster" +msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ì— \"restore_command\" ì„¤ì •ì´ ì—†ìŒ" + +#: pg_rewind.c:1153 +#, c-format +msgid "executing \"%s\" for target server to complete crash recovery" +msgstr "ëŒ€ìƒ ì„œë²„ì—서 ë¹„ì •ìƒ ì¢…ë£Œ 후 복구 ìž‘ì—…ì„ ìœ„í•´ \"%s\" 실행 중" + +#: pg_rewind.c:1191 +#, c-format +msgid "postgres single-user mode in target cluster failed" +msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ë¥¼ ë‹¨ì¼ ì‚¬ìš©ìž ëª¨ë“œë¡œ postgres 실행 실패" + +#: pg_rewind.c:1192 +#, c-format +msgid "Command was: %s" +msgstr "ì‚¬ìš©ëœ ëª…ë ¹: %s" + +#: timeline.c:74 timeline.c:80 #, c-format msgid "syntax error in history file: %s" msgstr "히스토리 파ì¼ì—서 문법오류: %s" -#: timeline.c:77 +#: timeline.c:75 #, c-format msgid "Expected a numeric timeline ID." msgstr "ìˆ«ìž íƒ€ìž„ë¼ì¸ IDê°€ 필요합니다." -#: timeline.c:83 +#: timeline.c:81 #, c-format msgid "Expected a write-ahead log switchpoint location." msgstr "트랜잭션 로그 전환 위치 ê°’ì´ ìžˆì–´ì•¼ 함" -#: timeline.c:88 +#: timeline.c:86 #, c-format msgid "invalid data in history file: %s" msgstr "작업내역 파ì¼ì— ìž˜ëª»ëœ ìžë£Œê°€ 있ìŒ: %s" -#: timeline.c:89 +#: timeline.c:87 #, c-format msgid "Timeline IDs must be in increasing sequence." msgstr "타임ë¼ì¸ ID ê°’ì€ ê·¸ ê°’ì´ ì¦ê°€í•˜ëŠ” 순번값ì´ì–´ì•¼í•©ë‹ˆë‹¤." -#: timeline.c:109 +#: timeline.c:107 #, c-format msgid "invalid data in history file" msgstr "ë‚´ì—­ 파ì¼ì— ìž˜ëª»ëœ ìžë£Œê°€ 있ìŒ" -#: timeline.c:110 +#: timeline.c:108 #, c-format msgid "Timeline IDs must be less than child timeline's ID." msgstr "타임ë¼ì¸ ID는 하위 타임ë¼ì¸ ID보다 작아야 합니다." -#: xlogreader.c:299 +#: xlogreader.c:619 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 위치: %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 오프셋:위치 %X/%X, 기대값 %u, 실재값 %u" -#: xlogreader.c:307 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "%X/%Xì—서 contrecord를 필요로 함" -#: xlogreader.c:348 xlogreader.c:645 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 길ì´: %X/%X, 기대값 %u, 실재값 %u" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 길ì´:위치 %X/%X, 기대값 %u, 실재값 %u" -#: xlogreader.c:372 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "너무 긴 길ì´(%u)ì˜ ë ˆì½”ë“œê°€ %X/%Xì— ìžˆìŒ" - -#: xlogreader.c:404 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "%X/%X ìœ„ì¹˜ì— contrecord 플래그가 ì—†ìŒ" -#: xlogreader.c:417 +#: xlogreader.c:771 #, c-format -msgid "invalid contrecord length %u at %X/%X" -msgstr "ìž˜ëª»ëœ contrecord ê¸¸ì´ %u, 위치 %X/%X" +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "ìž˜ëª»ëœ contrecord ê¸¸ì´ %u (기대값: %lld), 위치 %X/%X" -#: xlogreader.c:653 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ìž˜ëª»ëœ ìžì› 관리 ID %u, 위치: %X/%X" -#: xlogreader.c:667 xlogreader.c:684 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "ë ˆì½”ë“œì˜ ìž˜ëª»ëœ í”„ë¦¬ë§í¬ %X/%X, 해당 레코드 %X/%X" -#: xlogreader.c:721 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "ìž˜ëª»ëœ ìžì›ê´€ë¦¬ìž ë°ì´í„° ì²´í¬ì„¬, 위치: %X/%X 레코드" -#: xlogreader.c:758 +#: xlogreader.c:1243 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "%04X ë§¤ì§ ë²ˆí˜¸ê°€ 잘못ë¨, 로그 íŒŒì¼ %s, 위치 %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "%04X ë§¤ì§ ë²ˆí˜¸ê°€ 잘못ë¨, WAL ì¡°ê°íŒŒì¼: %s, LSN %X/%X, 오프셋 %u" -#: xlogreader.c:772 xlogreader.c:823 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "ìž˜ëª»ëœ ì •ë³´ 비트 %04X, 로그 íŒŒì¼ %s, 위치 %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "ìž˜ëª»ëœ ì •ë³´ 비트 %04X, WAL ì¡°ê°íŒŒì¼: %s, LSN %X/%X, 오프셋 %u" -#: xlogreader.c:798 +#: xlogreader.c:1274 #, c-format msgid "" "WAL file is from different database system: WAL file database system " -"identifier is %s, pg_control database system identifier is %s" +"identifier is %llu, pg_control database system identifier is %llu" msgstr "" -"WAL 파ì¼ì´ 다른 ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤. WAL 파ì¼ì˜ 시스템 ì‹ë³„ìžëŠ” %s, pg_control " -"ì˜ ì‹ë³„ìžëŠ” %s" +"WAL 파ì¼ì´ 다른 ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤. WAL 파ì¼ì˜ 시스템 ì‹ë³„ìžëŠ” %llu, " +"pg_control ì˜ ì‹ë³„ìžëŠ” %llu" -#: xlogreader.c:805 +#: xlogreader.c:1282 #, c-format msgid "" "WAL file is from different database system: incorrect segment size in page " @@ -770,7 +1011,7 @@ msgstr "" "WAL 파ì¼ì´ 다른 ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤: 페ì´ì§€ í—¤ë”ì— ì§€ì •ëœ ê°’ì´ ìž˜" "ëª»ëœ ì¡°ê° í¬ê¸°ìž„" -#: xlogreader.c:811 +#: xlogreader.c:1288 #, c-format msgid "" "WAL file is from different database system: incorrect XLOG_BLCKSZ in page " @@ -779,32 +1020,36 @@ msgstr "" "WAL 파ì¼ì´ 다른 ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤: 페ì´ì§€ í—¤ë”ì˜ XLOG_BLCKSZ ê°’" "ì´ ë°”ë¥´ì§€ 않ìŒ" -#: xlogreader.c:842 +#: xlogreader.c:1320 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "ìž˜ëª»ëœ íŽ˜ì´ì§€ 주소 %X/%X, 로그 íŒŒì¼ %s, 위치 %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "ìž˜ëª»ëœ íŽ˜ì´ì§€ 주소 %X/%X, WAL ì¡°ê°íŒŒì¼: %s, LSN %X/%X, 오프셋 %u" -#: xlogreader.c:867 +#: xlogreader.c:1346 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "타임ë¼ì¸ 범위 벗어남 %u (ì´ì „ 번호 %u), 로그 íŒŒì¼ %s, 위치 %u" +msgid "" +"out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, " +"offset %u" +msgstr "" +"타임ë¼ì¸ 범위 벗어남 %u (ì´ì „ 번호 %u), WAL ì¡°ê°íŒŒì¼: %s, LSN %X/%X, 오프셋 " +"%u" -#: xlogreader.c:1112 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "%u block_id는 범위를 벗어남, 위치 %X/%X" -#: xlogreader.c:1135 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA 지정했지만, %X/%X ì— ìžë£Œê°€ ì—†ìŒ" -#: xlogreader.c:1142 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA 지정 않았지만, %u 길ì´ì˜ ìžë£Œê°€ 있ìŒ, 위치 %X/%X" -#: xlogreader.c:1178 +#: xlogreader.c:1816 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -813,43 +1058,85 @@ msgstr "" "BKPIMAGE_HAS_HOLE ì„¤ì •ì´ ë˜ì–´ 있지만, 옵셋: %u, 길ì´: %u, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´: " "%u, 대ìƒ: %X/%X" -#: xlogreader.c:1194 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "" "BKPIMAGE_HAS_HOLE ì„¤ì •ì´ ì•ˆë˜ì–´ 있지만, 옵셋: %u, 길ì´: %u, 대ìƒ: %X/%X" -#: xlogreader.c:1209 +#: xlogreader.c:1846 #, c-format -msgid "BKPIMAGE_IS_COMPRESSED set, but block image length %u at %X/%X" +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "" -"BKPIMAGE_IS_COMPRESSED ì„¤ì •ì´ ë˜ì–´ 있지만, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´: %u, 대ìƒ: %X/%X" +"BKPIMAGE_COMPRESSED ì„¤ì •ì´ ë˜ì–´ 있지만, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´: %u, 대ìƒ: %X/%X" -#: xlogreader.c:1224 +#: xlogreader.c:1861 #, c-format msgid "" -"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_IS_COMPRESSED set, but block image " +"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " "length is %u at %X/%X" msgstr "" -"BKPIMAGE_HAS_HOLE, BKPIMAGE_IS_COMPRESSED 지정 안ë˜ì–´ 있으나, ë¸”ë¡ ì´ë¯¸ì§€ 길" -"ì´ëŠ” %u, 대ìƒ: %X/%X" +"BKPIMAGE_HAS_HOLE, BKPIMAGE_COMPRESSED 지정 안ë˜ì–´ 있으나, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´" +"는 %u, 대ìƒ: %X/%X" -#: xlogreader.c:1240 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL ì„¤ì •ì´ ë˜ì–´ 있지만, %X/%X ì— ì´ì „ 릴레ì´ì…˜ ì—†ìŒ" -#: xlogreader.c:1252 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ìž˜ëª»ëœ block_id %u, 위치 %X/%X" -#: xlogreader.c:1341 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 길ì´, 위치 %X/%X" -#: xlogreader.c:1430 +#: xlogreader.c:1982 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "WAL ë ˆì½”ë“œì— %d ID 백업 블ë¡ì´ ì—†ìŒ" + +#: xlogreader.c:2066 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "%X/%X ìœ„ì¹˜ì— ì´ë¯¸ì§€ ë³µì› ì‹¤íŒ¨(%d 블ë¡ì´ 바르지 않ìŒ)" + +#: xlogreader.c:2073 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "%X/%X ì— ìž˜ëª»ëœ ìƒíƒœê°’으로 ì´ë¯¸ì§€ ë³µì› ì‹¤íŒ¨, ë¸”ë¡ %d" + +#: xlogreader.c:2100 xlogreader.c:2117 +#, c-format +msgid "" +"could not restore image at %X/%X compressed with %s not supported by build, " +"block %d" +msgstr "" +"%X/%X ìœ„ì¹˜ì— %s ì••ì¶•ëœ ì´ë¯¸ì§€ ë³µì› ì‹¤íŒ¨, 해당 ì—”ì§„ì´ ì§€ì›í•˜ì§€ 않ìŒ, 해당블" +"ë¡: %d" + +#: xlogreader.c:2126 +#, c-format +msgid "" +"could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "%X/%X ìœ„ì¹˜ì— ì•Œìˆ˜ 없는 ì••ì¶• ë°©ì‹ì˜ ì´ë¯¸ì§€ ë³µì› ì‹¤íŒ¨, 해당블ë¡: %d" + +#: xlogreader.c:2134 +#, c-format +msgid "could not decompress image at %X/%X, block %d" +msgstr "%X/%X ì—서 ì´ë¯¸ ì••ì¶• 풀기 실패, ë¸”ë¡ %d" + +#, c-format +#~ msgid "missing contrecord at %X/%X" +#~ msgstr "%X/%X ìœ„ì¹˜ì— contrecord ì—†ìŒ" + +#, c-format +#~ msgid "out of memory while trying to decode a record of length %u" +#~ msgstr "%u 길ì´ì˜ 레코드를 디코딩 하는 중 메모리 부족" + #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "ìž˜ëª»ëœ ì••ì¶• ì´ë¯¸ì§€, 위치 %X/%X, ë¸”ë¡ %d" +#~ msgid "record length %u at %X/%X too long" +#~ msgstr "너무 긴 길ì´(%u)ì˜ ë ˆì½”ë“œê°€ %X/%Xì— ìžˆìŒ" diff --git a/src/bin/pg_rewind/po/meson.build b/src/bin/pg_rewind/po/meson.build index bffe7debea907..152f1caeb60e4 100644 --- a/src/bin/pg_rewind/po/meson.build +++ b/src/bin/pg_rewind/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_rewind-' + pg_version_major.to_string())] diff --git a/src/bin/pg_rewind/po/ru.po b/src/bin/pg_rewind/po/ru.po index debef96f6de16..fef2d25775b31 100644 --- a/src/bin/pg_rewind/po/ru.po +++ b/src/bin/pg_rewind/po/ru.po @@ -1,21 +1,21 @@ # Russian message translation file for pg_rewind # Copyright (C) 2015-2016 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2015-2017, 2018, 2019, 2020, 2021, 2022. +# Alexander Lakhin , 2015-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: pg_rewind (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-29 10:17+0300\n" -"PO-Revision-Date: 2022-09-29 14:17+0300\n" +"POT-Creation-Date: 2025-05-03 16:06+0300\n" +"PO-Revision-Date: 2024-09-07 13:07+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,109 +37,218 @@ msgstr "подробноÑти: " msgid "hint: " msgstr "подÑказка: " +#: ../../common/controldata_utils.c:97 file_ops.c:326 file_ops.c:330 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m" + +#: ../../common/controldata_utils.c:110 file_ops.c:341 local_source.c:104 +#: local_source.c:163 parsexlog.c:371 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" + +#: ../../common/controldata_utils.c:119 file_ops.c:344 parsexlog.c:373 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %zu)" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: local_source.c:121 local_source.c:172 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неÑоответÑтвие порÑдка байт" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, " +"and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"возможно неÑоответÑтвие порÑдка байт\n" +"ПорÑдок байт в файле pg_control может не ÑоответÑтвовать иÑпользуемому\n" +"Ñтой программой. Ð’ Ñтом Ñлучае результаты будут неверными и\n" +"уÑтановленный PostgreSQL будет неÑовмеÑтим Ñ Ñтим каталогом данных." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: parsexlog.c:333 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" + +#: ../../common/controldata_utils.c:249 file_ops.c:117 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "нехватка памÑти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" -#: ../../common/restricted_token.c:64 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: ../../fe_utils/archive.c:86 file_ops.c:417 #, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "не удалоÑÑŒ загрузить библиотеку \"%s\" (код ошибки: %lu)" +msgid "could not stat file \"%s\": %m" +msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñта Ñборка программы не поддерживает метод Ñинхронизации \"%s\"" -#: ../../common/restricted_token.c:73 +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:388 #, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры (код ошибки: %lu)" +msgid "could not open directory \"%s\": %m" +msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" -#: ../../common/restricted_token.c:82 +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:462 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" + +#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118 +#, c-format +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "неверное значение Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\": \"%s\"" + +#: ../../common/percentrepl.c:80 +#, c-format +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "Строка неожиданно закончилаÑÑŒ поÑле ÑпецÑимвола \"%%\"." + +#: ../../common/percentrepl.c:119 +#, c-format +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "Строка Ñодержит неожиданный меÑтозаполнитель \"%%%c\"." + +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "не удалоÑÑŒ открыть маркер процеÑÑа (код ошибки: %lu)" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "не удалоÑÑŒ подготовить Ñтруктуры SID (код ошибки: %lu)" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "не удалоÑÑŒ Ñоздать ограниченный маркер (код ошибки: %lu)" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "не удалоÑÑŒ запуÑтить процеÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ \"%s\" (код ошибки: %lu)" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "не удалоÑÑŒ перезапуÑтитьÑÑ Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ñ‹Ð¼ маркером (код ошибки: %lu)" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "не удалоÑÑŒ получить код выхода от подпроцеÑÑа (код ошибки: %lu)" -#: ../../fe_utils/archive.c:52 -#, c-format -msgid "cannot use restore_command with %%r placeholder" -msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать restore_command Ñо знаком подÑтановки %%r" - -#: ../../fe_utils/archive.c:70 +#: ../../fe_utils/archive.c:69 #, c-format msgid "unexpected file size for \"%s\": %lld instead of %lld" msgstr "неподходÑщий размер файла \"%s\": %lld вмеÑто %lld байт" -#: ../../fe_utils/archive.c:78 +#: ../../fe_utils/archive.c:77 #, c-format msgid "could not open file \"%s\" restored from archive: %m" msgstr "не удалоÑÑŒ открыть файл \"%s\", воÑÑтановленный из архива: %m" -#: ../../fe_utils/archive.c:87 file_ops.c:417 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" - -#: ../../fe_utils/archive.c:99 +#: ../../fe_utils/archive.c:98 #, c-format -msgid "restore_command failed: %s" -msgstr "ошибка при выполнении restore_command: %s" +msgid "\"restore_command\" failed: %s" +msgstr "ошибка при выполнении \"restore_command\": %s" -#: ../../fe_utils/archive.c:106 +#: ../../fe_utils/archive.c:105 #, c-format msgid "could not restore file \"%s\" from archive" msgstr "воÑÑтановить файл \"%s\" из архива не удалоÑÑŒ" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 +#: ../../fe_utils/option_utils.c:69 #, c-format -msgid "out of memory" -msgstr "нехватка памÑти" +msgid "invalid value \"%s\" for option %s" +msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" -#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312 +#: ../../fe_utils/option_utils.c:76 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" +msgid "%s must be in range %d..%d" +msgstr "значение %s должно быть в диапазоне %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нераÑпознанный метод Ñинхронизации: %s" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 +#, c-format +msgid "out of memory" +msgstr "нехватка памÑти" -#: ../../fe_utils/recovery_gen.c:124 +#: ../../fe_utils/recovery_gen.c:143 #, c-format msgid "could not write to file \"%s\": %m" msgstr "не удалоÑÑŒ запиÑать в файл \"%s\": %m" -#: ../../fe_utils/recovery_gen.c:133 +#: ../../fe_utils/recovery_gen.c:152 #, c-format msgid "could not create file \"%s\": %m" msgstr "не удалоÑÑŒ Ñоздать файл \"%s\": %m" +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "" +"аргумент команды оболочки Ñодержит Ñимвол новой Ñтроки или перевода каретки: " +"\"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "" +"Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ñодержит Ñимвол новой Ñтроки или перевода каретки: \"%s\"\n" + #: file_ops.c:67 #, c-format msgid "could not open target file \"%s\": %m" @@ -155,11 +264,6 @@ msgstr "не удалоÑÑŒ закрыть целевой файл \"%s\": %m" msgid "could not seek in target file \"%s\": %m" msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ð² целевом файле \"%s\": %m" -#: file_ops.c:117 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m" - #: file_ops.c:150 file_ops.c:177 #, c-format msgid "undefined file type for \"%s\"" @@ -205,157 +309,123 @@ msgstr "не удалоÑÑŒ Ñоздать ÑимволичеÑкую ÑÑылк msgid "could not remove symbolic link \"%s\": %m" msgstr "ошибка при удалении ÑимволичеÑкой ÑÑылки \"%s\": %m" -#: file_ops.c:326 file_ops.c:330 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m" - -#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" - -#: file_ops.c:344 parsexlog.c:352 -#, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %zu)" - -#: file_ops.c:388 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" - -#: file_ops.c:446 +#: file_ops.c:441 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m" -#: file_ops.c:449 +#: file_ops.c:444 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "целевой путь ÑимволичеÑкой ÑÑылки \"%s\" Ñлишком длинный" -#: file_ops.c:464 -#, c-format -msgid "" -"\"%s\" is a symbolic link, but symbolic links are not supported on this " -"platform" -msgstr "" -"\"%s\" — ÑимволичеÑÐºÐ°Ñ ÑÑылка, но в Ñтой ОС ÑимволичеÑкие ÑÑылки не " -"поддерживаютÑÑ" - -#: file_ops.c:471 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" - -#: file_ops.c:475 +#: file_ops.c:466 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не удалоÑÑŒ закрыть каталог \"%s\": %m" -#: filemap.c:236 +#: filemap.c:297 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "файл данных \"%s\" в иÑточнике не ÑвлÑетÑÑ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ð¼ файлом" -#: filemap.c:241 filemap.c:274 +#: filemap.c:302 filemap.c:335 #, c-format msgid "duplicate source file \"%s\"" msgstr "повторный иÑходный файл \"%s\"" -#: filemap.c:329 +#: filemap.c:390 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñтраницы Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° оÑобого вида \"%s\"" -#: filemap.c:679 filemap.c:773 +#: filemap.c:744 filemap.c:846 #, c-format msgid "unknown file type for \"%s\"" msgstr "неизвеÑтный тип файла \"%s\"" -#: filemap.c:706 +#: filemap.c:779 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "файл \"%s\" имеет разный тип в иÑходном и целевом клаÑтере" -#: filemap.c:778 +#: filemap.c:851 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "не удалоÑÑŒ определить, что делать Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ \"%s\"" -#: libpq_source.c:130 +#: libpq_source.c:131 #, c-format -msgid "could not clear search_path: %s" -msgstr "не удалоÑÑŒ очиÑтить search_path: %s" +msgid "could not clear \"search_path\": %s" +msgstr "не удалоÑÑŒ очиÑтить \"search_path\": %s" -#: libpq_source.c:141 +#: libpq_source.c:142 #, c-format -msgid "full_page_writes must be enabled in the source server" -msgstr "на иÑходном Ñервере должен быть включён режим full_page_writes" +msgid "\"full_page_writes\" must be enabled in the source server" +msgstr "на иÑходном Ñервере должен быть включён режим \"full_page_writes\"" -#: libpq_source.c:152 +#: libpq_source.c:153 #, c-format msgid "could not prepare statement to fetch file contents: %s" msgstr "не удалоÑÑŒ подготовить оператор Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ñодержимого файла: %s" -#: libpq_source.c:171 +#: libpq_source.c:172 #, c-format msgid "error running query (%s) on source server: %s" msgstr "ошибка Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа (%s) на иÑходном Ñервере: %s" -#: libpq_source.c:176 +#: libpq_source.c:177 #, c-format msgid "unexpected result set from query" msgstr "неожиданный результат запроÑа" -#: libpq_source.c:198 +#: libpq_source.c:199 #, c-format msgid "error running query (%s) in source server: %s" msgstr "ошибка Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа (%s) на иÑходном Ñервере: %s" -#: libpq_source.c:219 +#: libpq_source.c:220 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "" "нераÑпознанный результат \"%s\" вмеÑто текущей позиции Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² WAL" -#: libpq_source.c:270 +#: libpq_source.c:271 #, c-format msgid "could not fetch file list: %s" msgstr "не удалоÑÑŒ получить ÑпиÑок файлов: %s" -#: libpq_source.c:275 +#: libpq_source.c:276 #, c-format msgid "unexpected result set while fetching file list" msgstr "неожиданный результат при получении ÑпиÑка файлов" -#: libpq_source.c:467 +#: libpq_source.c:477 #, c-format msgid "could not send query: %s" msgstr "не удалоÑÑŒ отправить запроÑ: %s" -#: libpq_source.c:470 +#: libpq_source.c:480 #, c-format msgid "could not set libpq connection to single row mode" msgstr "не удалоÑÑŒ перевеÑти подключение libpq в одноÑтрочный режим" -#: libpq_source.c:500 +#: libpq_source.c:510 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "неожиданный результат при получении файлов Ñ Ñервера: %s" -#: libpq_source.c:505 +#: libpq_source.c:515 #, c-format msgid "received more data chunks than requested" msgstr "получено больше Ñегментов данных, чем запрошено" -#: libpq_source.c:509 +#: libpq_source.c:519 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "неожиданный размер набора результатов при получении файлов Ñ Ñервера" -#: libpq_source.c:515 +#: libpq_source.c:525 #, c-format msgid "" "unexpected data types in result set while fetching remote files: %u %u %u" @@ -363,27 +433,27 @@ msgstr "" "неожиданные типы данных в наборе результатов при получении файлов Ñ Ñервера: " "%u %u %u" -#: libpq_source.c:523 +#: libpq_source.c:533 #, c-format msgid "unexpected result format while fetching remote files" msgstr "неожиданный формат результата при получении файлов Ñ Ñервера" -#: libpq_source.c:529 +#: libpq_source.c:539 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "неожиданные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ NULL в результате при получении файлов Ñ Ñервера" -#: libpq_source.c:533 +#: libpq_source.c:543 #, c-format msgid "unexpected result length while fetching remote files" msgstr "Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° результата при получении файлов Ñ Ñервера" -#: libpq_source.c:566 +#: libpq_source.c:576 #, c-format msgid "received data for file \"%s\", when requested for \"%s\"" msgstr "получены данные Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\", а запрашивалиÑÑŒ данные Ð´Ð»Ñ \"%s\"" -#: libpq_source.c:570 +#: libpq_source.c:580 #, c-format msgid "" "received data at offset %lld of file \"%s\", when requested for offset %lld" @@ -391,22 +461,22 @@ msgstr "" "получены данные по Ñмещению %lld в файле \"%s\", а запрашивалиÑÑŒ по Ñмещению " "%lld" -#: libpq_source.c:582 +#: libpq_source.c:592 #, c-format msgid "received more than requested for file \"%s\"" msgstr "получено больше данных, чем запрошено Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\"" -#: libpq_source.c:595 +#: libpq_source.c:605 #, c-format msgid "unexpected number of data chunks received" msgstr "получено неожиданное количеÑтво Ñегментов данных" -#: libpq_source.c:638 +#: libpq_source.c:648 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "не удалоÑÑŒ получить Ñ Ñервера файл \"%s\": %s" -#: libpq_source.c:643 +#: libpq_source.c:653 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "неожиданный набор результатов при получении файла \"%s\" Ñ Ñервера" @@ -423,11 +493,6 @@ msgid "" msgstr "" "размер иÑходного файла \"%s\" изменилÑÑ, ожидалоÑÑŒ байт: %d, Ñкопировано: %d" -#: local_source.c:121 local_source.c:172 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m" - #: local_source.c:146 #, c-format msgid "could not seek in source file: %m" @@ -438,7 +503,7 @@ msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ð² иÑходном фа msgid "unexpected EOF while reading file \"%s\"" msgstr "неожиданный конец файла при чтении \"%s\"" -#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199 +#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:201 #, c-format msgid "out of memory while allocating a WAL reading processor" msgstr "не удалоÑÑŒ выделить памÑть Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ WAL" @@ -459,22 +524,22 @@ msgid "end pointer %X/%X is not a valid end point; expected %X/%X" msgstr "" "конечный указатель %X/%X неверно задаёт конечную точку; ожидаетÑÑ %X/%X" -#: parsexlog.c:212 +#: parsexlog.c:214 #, c-format msgid "could not find previous WAL record at %X/%X: %s" msgstr "не удалоÑÑŒ найти предыдущую запиÑÑŒ WAL в позиции %X/%X: %s" -#: parsexlog.c:216 +#: parsexlog.c:218 #, c-format msgid "could not find previous WAL record at %X/%X" msgstr "не удалоÑÑŒ найти предыдущую запиÑÑŒ WAL в позиции %X/%X" -#: parsexlog.c:341 +#: parsexlog.c:362 #, c-format msgid "could not seek in file \"%s\": %m" msgstr "не удалоÑÑŒ перемеÑтитьÑÑ Ð² файле \"%s\": %m" -#: parsexlog.c:440 +#: parsexlog.c:461 #, c-format msgid "" "WAL record modifies a relation, but record type is not recognized: lsn: %X/" @@ -483,7 +548,7 @@ msgstr "" "ЗапиÑÑŒ WAL модифицирует отношение, но тип запиÑи не раÑпознан: lsn: %X/%X, " "rmid: %d, rmgr: %s, info: %02X" -#: pg_rewind.c:86 +#: pg_rewind.c:94 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" @@ -492,7 +557,7 @@ msgstr "" "%s Ñинхронизирует клаÑтер PostgreSQL Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ копией клаÑтера.\n" "\n" -#: pg_rewind.c:87 +#: pg_rewind.c:95 #, c-format msgid "" "Usage:\n" @@ -503,30 +568,31 @@ msgstr "" " %s [ПÐРÐМЕТР]...\n" "\n" -#: pg_rewind.c:88 +#: pg_rewind.c:96 #, c-format msgid "Options:\n" msgstr "Параметры:\n" -#: pg_rewind.c:89 +#: pg_rewind.c:97 #, c-format msgid "" -" -c, --restore-target-wal use restore_command in target configuration " -"to\n" +" -c, --restore-target-wal use \"restore_command\" in target " +"configuration to\n" " retrieve WAL files from archives\n" msgstr "" " -c, --restore-target-wal иÑпользовать Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² WAL из\n" -" архива команду restore_command из целевой\n" +" архивов команду \"restore_command\" из " +"целевой\n" " конфигурации\n" -#: pg_rewind.c:91 +#: pg_rewind.c:99 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr "" " -D, --target-pgdata=КÐТÐЛОГ ÑущеÑтвующий каталог, куда будут запиÑаны " "данные\n" -#: pg_rewind.c:92 +#: pg_rewind.c:100 #, c-format msgid "" " --source-pgdata=DIRECTORY source data directory to synchronize with\n" @@ -535,21 +601,21 @@ msgstr "" "ÑинхронизациÑ\n" # well-spelled: ПОДКЛ -#: pg_rewind.c:93 +#: pg_rewind.c:101 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr "" " --source-server=СТР_ПОДКЛ Ñервер, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ будет проведена " "ÑинхронизациÑ\n" -#: pg_rewind.c:94 +#: pg_rewind.c:102 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr "" " -n, --dry-run оÑтановитьÑÑ Ð´Ð¾ внеÑÐµÐ½Ð¸Ñ ÐºÐ°ÐºÐ¸Ñ…-либо " "изменений\n" -#: pg_rewind.c:95 +#: pg_rewind.c:103 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" @@ -558,12 +624,12 @@ msgstr "" " -N, --no-sync не ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… на " "диÑке\n" -#: pg_rewind.c:97 +#: pg_rewind.c:105 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress выводить ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾ ходе процеÑÑа\n" -#: pg_rewind.c:98 +#: pg_rewind.c:106 #, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" @@ -572,7 +638,7 @@ msgstr "" " -R, --write-recovery-conf запиÑать конфигурацию Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸\n" " (требуетÑÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ðµ --source-server)\n" -#: pg_rewind.c:100 +#: pg_rewind.c:108 #, c-format msgid "" " --config-file=FILENAME use specified main server configuration\n" @@ -582,13 +648,13 @@ msgstr "" " конфигурации Ñервера при запуÑке целевого\n" " клаÑтера\n" -#: pg_rewind.c:102 +#: pg_rewind.c:110 #, c-format msgid " --debug write a lot of debug messages\n" msgstr "" " --debug выдавать множеÑтво отладочных Ñообщений\n" -#: pg_rewind.c:103 +#: pg_rewind.c:111 #, c-format msgid "" " --no-ensure-shutdown do not automatically fix unclean shutdown\n" @@ -596,18 +662,23 @@ msgstr "" " --no-ensure-shutdown не иÑправлÑть автоматичеÑки ÑоÑтоÑние,\n" " возникающее при нештатном отключении\n" -#: pg_rewind.c:104 +#: pg_rewind.c:112 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=МЕТОД метод Ñинхронизации файлов Ñ Ð¤Ð¡\n" + +#: pg_rewind.c:113 #, c-format msgid "" " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: pg_rewind.c:105 +#: pg_rewind.c:114 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: pg_rewind.c:106 +#: pg_rewind.c:115 #, c-format msgid "" "\n" @@ -616,33 +687,33 @@ msgstr "" "\n" "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: pg_rewind.c:107 +#: pg_rewind.c:116 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" -#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237 -#: pg_rewind.c:244 pg_rewind.c:252 +#: pg_rewind.c:232 pg_rewind.c:240 pg_rewind.c:247 pg_rewind.c:254 +#: pg_rewind.c:261 pg_rewind.c:269 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." -#: pg_rewind.c:222 +#: pg_rewind.c:239 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "иÑточник не указан (требуетÑÑ --source-pgdata или --source-server)" -#: pg_rewind.c:229 +#: pg_rewind.c:246 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "указать можно только --source-pgdata либо --source-server" -#: pg_rewind.c:236 +#: pg_rewind.c:253 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "целевой каталог данных не указан (--target-pgdata)" -#: pg_rewind.c:243 +#: pg_rewind.c:260 #, c-format msgid "" "no source server information (--source-server) specified for --write-" @@ -651,119 +722,119 @@ msgstr "" "отÑутÑтвует Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± иÑходном Ñервере (--source-server) Ð´Ð»Ñ --write-" "recovery-conf" -#: pg_rewind.c:250 +#: pg_rewind.c:267 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")" -#: pg_rewind.c:265 +#: pg_rewind.c:282 #, c-format msgid "cannot be executed by \"root\"" msgstr "программу не должен запуÑкать root" -#: pg_rewind.c:266 +#: pg_rewind.c:283 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "ЗапуÑкать %s нужно от имени ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PostgreSQL." -#: pg_rewind.c:276 +#: pg_rewind.c:293 #, c-format msgid "could not read permissions of directory \"%s\": %m" -msgstr "не удалоÑÑŒ Ñчитать права на каталог \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать права на каталог \"%s\": %m" -#: pg_rewind.c:294 +#: pg_rewind.c:311 #, c-format msgid "%s" msgstr "%s" -#: pg_rewind.c:297 +#: pg_rewind.c:314 #, c-format msgid "connected to server" msgstr "подключение к Ñерверу уÑтановлено" -#: pg_rewind.c:344 +#: pg_rewind.c:375 #, c-format msgid "source and target cluster are on the same timeline" msgstr "иÑходный и целевой клаÑтер уже на одной линии времени" -#: pg_rewind.c:353 +#: pg_rewind.c:396 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "Ñерверы разошлиÑÑŒ в позиции WAL %X/%X на линии времени %u" -#: pg_rewind.c:401 +#: pg_rewind.c:451 #, c-format msgid "no rewind required" msgstr "перемотка не требуетÑÑ" -#: pg_rewind.c:410 +#: pg_rewind.c:463 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "" "перемотка от поÑледней общей контрольной точки в позиции %X/%X на линии " "времени %u" -#: pg_rewind.c:420 +#: pg_rewind.c:473 #, c-format msgid "reading source file list" msgstr "чтение ÑпиÑка иÑходных файлов" -#: pg_rewind.c:424 +#: pg_rewind.c:477 #, c-format msgid "reading target file list" msgstr "чтение ÑпиÑка целевых файлов" -#: pg_rewind.c:433 +#: pg_rewind.c:486 #, c-format msgid "reading WAL in target" msgstr "чтение WAL в целевом клаÑтере" -#: pg_rewind.c:454 +#: pg_rewind.c:507 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "требуетÑÑ Ñкопировать %lu МБ (общий размер иÑходного каталога: %lu МБ)" -#: pg_rewind.c:472 +#: pg_rewind.c:525 #, c-format msgid "syncing target data directory" msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð³Ð¾ каталога данных" -#: pg_rewind.c:488 +#: pg_rewind.c:541 #, c-format msgid "Done!" msgstr "Готово!" -#: pg_rewind.c:568 +#: pg_rewind.c:621 #, c-format msgid "no action decided for file \"%s\"" msgstr "дейÑтвие не определено Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\"" -#: pg_rewind.c:600 +#: pg_rewind.c:653 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "в иÑходной ÑиÑтеме произошли Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² процеÑÑе работы pg_rewind" -#: pg_rewind.c:604 +#: pg_rewind.c:657 #, c-format msgid "creating backup label and updating control file" msgstr "Ñоздание метки копии и Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющего файла" -#: pg_rewind.c:654 +#: pg_rewind.c:707 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "иÑÑ…Ð¾Ð´Ð½Ð°Ñ ÑиÑтема оказалаÑÑŒ в неожиданном ÑоÑтоÑнии поÑле перемотки" -#: pg_rewind.c:685 +#: pg_rewind.c:739 #, c-format msgid "source and target clusters are from different systems" msgstr "иÑходный и целевой клаÑтеры отноÑÑÑ‚ÑÑ Ðº разным ÑиÑтемам" -#: pg_rewind.c:693 +#: pg_rewind.c:747 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "клаÑтеры неÑовмеÑтимы Ñ Ñтой верÑией pg_rewind" -#: pg_rewind.c:703 +#: pg_rewind.c:757 #, c-format msgid "" "target server needs to use either data checksums or \"wal_log_hints = on\"" @@ -771,207 +842,192 @@ msgstr "" "на целевом Ñервере должны быть контрольные Ñуммы данных или \"wal_log_hints " "= on\"" -#: pg_rewind.c:714 +#: pg_rewind.c:768 #, c-format msgid "target server must be shut down cleanly" msgstr "целевой Ñервер должен быть выключен штатно" -#: pg_rewind.c:724 +#: pg_rewind.c:778 #, c-format msgid "source data directory must be shut down cleanly" msgstr "работа Ñ Ð¸Ñходным каталогом данных должна быть завершена штатно" -#: pg_rewind.c:771 +#: pg_rewind.c:825 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s КБ (%d%%) Ñкопировано" -#: pg_rewind.c:834 -#, c-format -msgid "invalid control file" -msgstr "неверный управлÑющий файл" - -#: pg_rewind.c:918 +#: pg_rewind.c:951 #, c-format msgid "" "could not find common ancestor of the source and target cluster's timelines" msgstr "" "не удалоÑÑŒ найти общего предка линий времени иÑходного и целевого клаÑтеров" -#: pg_rewind.c:959 +#: pg_rewind.c:992 #, c-format msgid "backup label buffer too small" msgstr "буфер Ð´Ð»Ñ Ð¼ÐµÑ‚ÐºÐ¸ копии Ñлишком мал" -#: pg_rewind.c:982 +#: pg_rewind.c:1015 #, c-format msgid "unexpected control file CRC" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма управлÑющего файла" -#: pg_rewind.c:994 +#: pg_rewind.c:1027 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "неверный размер управлÑющего файла (%d), ожидалоÑÑŒ: %d" -#: pg_rewind.c:1003 +#: pg_rewind.c:1037 #, c-format -msgid "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the " -"control file specifies %d byte" -msgid_plural "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the " -"control file specifies %d bytes" -msgstr[0] "" -"размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 " -"ГБ, но в управлÑющем файле указано значение: %d" -msgstr[1] "" -"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 " -"ГБ, но в управлÑющем файле указано значение: %d" -msgstr[2] "" -"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 " -"ГБ, но в управлÑющем файле указано значение: %d" - -#: pg_rewind.c:1042 pg_rewind.c:1112 +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "управлÑющий файл Ñодержит неверный размер Ñегмента WAL (%d Б)" +msgstr[1] "управлÑющий файл Ñодержит неверный размер Ñегмента WAL (%d Б)" +msgstr[2] "управлÑющий файл Ñодержит неверный размер Ñегмента WAL (%d Б)" + +#: pg_rewind.c:1041 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "" +"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 ГБ." + +#: pg_rewind.c:1078 pg_rewind.c:1146 #, c-format msgid "" -"program \"%s\" is needed by %s but was not found in the same directory as \"" -"%s\"" +"program \"%s\" is needed by %s but was not found in the same directory as " +"\"%s\"" msgstr "программа \"%s\" нужна Ð´Ð»Ñ %s, но она не найдена в каталоге \"%s\"" -#: pg_rewind.c:1045 pg_rewind.c:1115 +#: pg_rewind.c:1081 pg_rewind.c:1149 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "" "программа \"%s\" найдена программой \"%s\", но её верÑÐ¸Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð¾Ñ‚ " "верÑии %s" -#: pg_rewind.c:1078 +#: pg_rewind.c:1110 +#, c-format +msgid "could not read restore_command from target cluster" +msgstr "не удалоÑÑŒ прочитать параметр \"restore_command\" в целевом клаÑтере" + +#: pg_rewind.c:1115 #, c-format -msgid "restore_command is not set in the target cluster" -msgstr "команда restore_command в целевом клаÑтере не определена" +msgid "\"restore_command\" is not set in the target cluster" +msgstr "параметр \"restore_command\" в целевом клаÑтере не определён" -#: pg_rewind.c:1119 +#: pg_rewind.c:1153 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "" "выполнение \"%s\" Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑоглаÑованноÑти на целевом Ñервере" -#: pg_rewind.c:1156 +#: pg_rewind.c:1191 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "" "не удалоÑÑŒ запуÑтить postgres в целевом клаÑтере в однопользовательÑком " "режиме" -#: pg_rewind.c:1157 +#: pg_rewind.c:1192 #, c-format msgid "Command was: %s" msgstr "ВыполнÑлаÑÑŒ команда: %s" -#: timeline.c:75 timeline.c:81 +#: timeline.c:74 timeline.c:80 #, c-format msgid "syntax error in history file: %s" msgstr "ÑинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в файле иÑтории: %s" -#: timeline.c:76 +#: timeline.c:75 #, c-format msgid "Expected a numeric timeline ID." msgstr "ОжидаетÑÑ Ñ‡Ð¸Ñловой идентификатор линии времени." -#: timeline.c:82 +#: timeline.c:81 #, c-format msgid "Expected a write-ahead log switchpoint location." msgstr "ОжидаетÑÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ точки Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° предзапиÑи." -#: timeline.c:87 +#: timeline.c:86 #, c-format msgid "invalid data in history file: %s" msgstr "неверные данные в файле иÑтории: %s" -#: timeline.c:88 +#: timeline.c:87 #, c-format msgid "Timeline IDs must be in increasing sequence." msgstr "Идентификаторы линий времени должны возраÑтать." -#: timeline.c:108 +#: timeline.c:107 #, c-format msgid "invalid data in history file" msgstr "неверные данные в файле иÑтории" -#: timeline.c:109 +#: timeline.c:108 #, c-format msgid "Timeline IDs must be less than child timeline's ID." msgstr "" "Идентификаторы линий времени должны быть меньше идентификатора линии-потомка." -#: xlogreader.c:625 +#: xlogreader.c:619 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "неверное Ñмещение запиÑи: %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "" +"неверное Ñмещение запиÑи в позиции %X/%X: ожидалоÑÑŒ минимум %u, получено %u" -#: xlogreader.c:633 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" -msgstr "по Ñмещению %X/%X запрошено продолжение запиÑи" - -#: xlogreader.c:674 xlogreader.c:1121 -#, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° запиÑи по Ñмещению %X/%X: ожидалоÑÑŒ %u, получено %u" +msgstr "в позиции %X/%X запрошено продолжение запиÑи" -#: xlogreader.c:703 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "не удалоÑÑŒ выделить памÑть Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи длины %u" - -#: xlogreader.c:725 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "длина запиÑи %u по Ñмещению %X/%X Ñлишком велика" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "" +"Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° запиÑи в позиции %X/%X: ожидалоÑÑŒ минимум %u, получено %u" -#: xlogreader.c:774 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "нет флага contrecord в позиции %X/%X" -#: xlogreader.c:787 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° contrecord: %u (ожидалаÑÑŒ %lld) в позиции %X/%X" -#: xlogreader.c:922 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "нет запиÑи contrecord в %X/%X" - -#: xlogreader.c:1129 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" -msgstr "неверный ID менеджера реÑурÑов %u по Ñмещению %X/%X" +msgstr "неверный ID менеджера реÑурÑов %u в позиции %X/%X" -#: xlogreader.c:1142 xlogreader.c:1158 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "запиÑÑŒ Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ ÑÑылкой назад %X/%X по Ñмещению %X/%X" +msgstr "запиÑÑŒ Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ ÑÑылкой назад %X/%X в позиции %X/%X" -#: xlogreader.c:1194 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" -"Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма данных менеджера реÑурÑов в запиÑи по " -"Ñмещению %X/%X" +"Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма данных менеджера реÑурÑов в запиÑи в позиции " +"%X/%X" -#: xlogreader.c:1231 +#: xlogreader.c:1243 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "неверное магичеÑкое чиÑло %04X в Ñегменте журнала %s, Ñмещение %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "" +"неверное магичеÑкое чиÑло %04X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u" -#: xlogreader.c:1245 xlogreader.c:1286 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "неверные информационные биты %04X в Ñегменте журнала %s, Ñмещение %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "" +"неверные информационные биты %04X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u" -#: xlogreader.c:1260 +#: xlogreader.c:1274 #, c-format msgid "" "WAL file is from different database system: WAL file database system " @@ -980,7 +1036,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: в нём указан идентификатор ÑиÑтемы БД " "%llu, а идентификатор ÑиÑтемы pg_control: %llu" -#: xlogreader.c:1268 +#: xlogreader.c:1282 #, c-format msgid "" "WAL file is from different database system: incorrect segment size in page " @@ -989,7 +1045,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный размер Ñегмента в заголовке " "Ñтраницы" -#: xlogreader.c:1274 +#: xlogreader.c:1288 #, c-format msgid "" "WAL file is from different database system: incorrect XLOG_BLCKSZ in page " @@ -998,35 +1054,37 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке " "Ñтраницы" -#: xlogreader.c:1305 +#: xlogreader.c:1320 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "неожиданный pageaddr %X/%X в Ñегменте журнала %s, Ñмещение %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "неожиданный pageaddr %X/%X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u" -#: xlogreader.c:1330 +#: xlogreader.c:1346 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" +msgid "" +"out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, " +"offset %u" msgstr "" -"нарушение поÑледовательноÑти ID линии времени %u (поÑле %u) в Ñегменте " -"журнала %s, Ñмещение %u" +"нарушение поÑледовательноÑти ID линии времени %u (поÑле %u) в Ñегменте WAL " +"%s, LSN %X/%X, Ñмещение %u" -#: xlogreader.c:1735 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порÑдку в позиции %X/%X" -#: xlogreader.c:1759 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA уÑтановлен, но данных в позиции %X/%X нет" -#: xlogreader.c:1766 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "" "BKPBLOCK_HAS_DATA не уÑтановлен, но длина данных равна %u в позиции %X/%X" -#: xlogreader.c:1802 +#: xlogreader.c:1816 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -1035,21 +1093,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE уÑтановлен, но Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑка заданы Ñмещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: xlogreader.c:1818 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "" "BKPIMAGE_HAS_HOLE не уÑтановлен, но Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑка заданы Ñмещение %u и длина " "%u в позиции %X/%X" -#: xlogreader.c:1832 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "" "BKPIMAGE_COMPRESSED уÑтановлен, но длина образа блока равна %u в позиции %X/" "%X" -#: xlogreader.c:1847 +#: xlogreader.c:1861 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " @@ -1058,41 +1116,41 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не уÑтановлены, но длина образа " "блока равна %u в позиции %X/%X" -#: xlogreader.c:1863 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" "BKPBLOCK_SAME_REL уÑтановлен, но предыдущее значение не задано в позиции %X/" "%X" -#: xlogreader.c:1875 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: xlogreader.c:1942 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "запиÑÑŒ Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ длиной в позиции %X/%X" -#: xlogreader.c:1967 +#: xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "не удалоÑÑŒ найти копию блока Ñ ID %d в запиÑи журнала WAL" -#: xlogreader.c:2051 +#: xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "" "не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ неверным блоком %d" -#: xlogreader.c:2058 +#: xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "" "не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¼ ÑоÑтоÑнием, блок %d" -#: xlogreader.c:2085 xlogreader.c:2102 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format msgid "" "could not restore image at %X/%X compressed with %s not supported by build, " @@ -1101,7 +1159,7 @@ msgstr "" "не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X, Ñжатый методом %s, который не " "поддерживаетÑÑ Ñтой Ñборкой, блок %d" -#: xlogreader.c:2111 +#: xlogreader.c:2126 #, c-format msgid "" "could not restore image at %X/%X compressed with unknown method, block %d" @@ -1109,11 +1167,51 @@ msgstr "" "не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X, Ñжатый неизвеÑтным методом, " "блок %d" -#: xlogreader.c:2119 +#: xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "не удалоÑÑŒ развернуть образ в позиции %X/%X, блок %d" +#, c-format +#~ msgid "out of memory while trying to decode a record of length %u" +#~ msgstr "не удалоÑÑŒ выделить памÑть Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи длины %u" + +#, c-format +#~ msgid "record length %u at %X/%X too long" +#~ msgstr "длина запиÑи %u в позиции %X/%X Ñлишком велика" + +#, c-format +#~ msgid "could not load library \"%s\": error code %lu" +#~ msgstr "не удалоÑÑŒ загрузить библиотеку \"%s\" (код ошибки: %lu)" + +#, c-format +#~ msgid "cannot create restricted tokens on this platform: error code %lu" +#~ msgstr "в Ñтой ОС Ð½ÐµÐ»ÑŒÐ·Ñ Ñоздавать ограниченные маркеры (код ошибки: %lu)" + +#, c-format +#~ msgid "cannot use restore_command with %%r placeholder" +#~ msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать restore_command Ñо знаком подÑтановки %%r" + +#, c-format +#~ msgid "" +#~ "\"%s\" is a symbolic link, but symbolic links are not supported on this " +#~ "platform" +#~ msgstr "" +#~ "\"%s\" — ÑимволичеÑÐºÐ°Ñ ÑÑылка, но в Ñтой ОС ÑимволичеÑкие ÑÑылки не " +#~ "поддерживаютÑÑ" + +#, c-format +#~ msgid "invalid control file" +#~ msgstr "неверный управлÑющий файл" + +#, c-format +#~ msgid "invalid record offset at %X/%X" +#~ msgstr "неверное Ñмещение запиÑи: %X/%X" + +#, c-format +#~ msgid "missing contrecord at %X/%X" +#~ msgstr "нет запиÑи contrecord в %X/%X" + #~ msgid "fatal: " #~ msgstr "важно: " diff --git a/src/bin/pg_rewind/po/sv.po b/src/bin/pg_rewind/po/sv.po index d283f81d5c44c..7894e029f203e 100644 --- a/src/bin/pg_rewind/po/sv.po +++ b/src/bin/pg_rewind/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_rewind # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-29 11:51+0000\n" -"PO-Revision-Date: 2022-09-29 21:42+0200\n" +"POT-Creation-Date: 2024-08-27 15:53+0000\n" +"PO-Revision-Date: 2024-08-27 18:32+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -37,108 +37,213 @@ msgstr "detalj: " msgid "hint: " msgstr "tips: " +#: ../../common/controldata_utils.c:97 file_ops.c:326 file_ops.c:330 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "kunde inte öppna filen \"%s\" för läsning: %m" + +#: ../../common/controldata_utils.c:110 file_ops.c:341 local_source.c:104 +#: local_source.c:163 parsexlog.c:350 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "kunde inte läsa fil \"%s\": %m" + +#: ../../common/controldata_utils.c:119 file_ops.c:344 parsexlog.c:352 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: local_source.c:121 local_source.c:172 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "kunde inte stänga fil \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "byte-ordning stämmer inte" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"möjligt fel i byteordning\n" +"Den byteordning som filen frÃ¥n pg_control lagrats med passar kanske\n" +"inte detta program. I sÃ¥ fall kan nedanstÃ¥ende resultat vara felaktiga\n" +"och PostgreSQL-installationen vara inkompatibel med databaskatalogen." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: parsexlog.c:312 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "kunde inte öppna fil \"%s\": %m" + +#: ../../common/controldata_utils.c:249 file_ops.c:117 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "kunde inte skriva fil \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "kunde inte fsync:a fil \"%s\": %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "slut pÃ¥ minne\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" -#: ../../common/restricted_token.c:64 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: ../../fe_utils/archive.c:86 file_ops.c:417 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "detta bygge stöder inte synkmetod \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:388 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "kunde inte öppna katalog \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:462 #, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "kunde inte ladda länkbibliotek \"%s\": felkod %lu" +msgid "could not read directory \"%s\": %m" +msgstr "kunde inte läsa katalog \"%s\": %m" -#: ../../common/restricted_token.c:73 +#: ../../common/file_utils.c:498 #, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "kan inte skapa token för begränsad Ã¥tkomst pÃ¥ denna plattorm: felkod %lu" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" -#: ../../common/restricted_token.c:82 +#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118 +#, c-format +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "ogiltigt värde för parameter \"%s\": \"%s\"" + +#: ../../common/percentrepl.c:80 +#, c-format +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "Sträng avslutas oväntat efter escape-tecken \"%%\"." + +#: ../../common/percentrepl.c:119 +#, c-format +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "Sträng innehÃ¥ller oväntad platshÃ¥llare \"%%%c\"." + +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "kunde inte öppna process-token: felkod %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "kunde inte allokera SID: felkod %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "kunde inte skapa token för begränsad Ã¥tkomst: felkod %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "kunde inte starta process för kommando \"%s\": felkod %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "kunde inte köra igen med token för begränsad Ã¥tkomst: felkod %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "kunde inte hämta statuskod för underprocess: felkod %lu" -#: ../../fe_utils/archive.c:52 -#, c-format -msgid "cannot use restore_command with %%r placeholder" -msgstr "kan inte använda restore_command med %%r-platshÃ¥llare" - -#: ../../fe_utils/archive.c:70 +#: ../../fe_utils/archive.c:69 #, c-format msgid "unexpected file size for \"%s\": %lld instead of %lld" msgstr "oväntad filstorlek pÃ¥ \"%s\": %lld istället för %lld" -#: ../../fe_utils/archive.c:78 +#: ../../fe_utils/archive.c:77 #, c-format msgid "could not open file \"%s\" restored from archive: %m" msgstr "kunde inte öppna fil \"%s\" Ã¥terställd frÃ¥n arkiv: %m" -#: ../../fe_utils/archive.c:87 file_ops.c:417 +#: ../../fe_utils/archive.c:98 #, c-format -msgid "could not stat file \"%s\": %m" -msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" +msgid "\"restore_command\" failed: %s" +msgstr "\"restore_command\" misslyckades: %s" -#: ../../fe_utils/archive.c:99 -#, c-format -msgid "restore_command failed: %s" -msgstr "restore_command misslyckades: %s" - -#: ../../fe_utils/archive.c:106 +#: ../../fe_utils/archive.c:105 #, c-format msgid "could not restore file \"%s\" from archive" msgstr "kunde inte Ã¥terställa fil \"%s\" frÃ¥n arkiv" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 +#: ../../fe_utils/option_utils.c:69 #, c-format -msgid "out of memory" -msgstr "slut pÃ¥ minne" +msgid "invalid value \"%s\" for option %s" +msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" -#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312 +#: ../../fe_utils/option_utils.c:76 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "kunde inte öppna fil \"%s\": %m" +msgid "%s must be in range %d..%d" +msgstr "%s mÃ¥ste vara i intervallet %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "okänd synkmetod: %s" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 +#, c-format +msgid "out of memory" +msgstr "slut pÃ¥ minne" -#: ../../fe_utils/recovery_gen.c:124 +#: ../../fe_utils/recovery_gen.c:143 #, c-format msgid "could not write to file \"%s\": %m" msgstr "kunde inte skriva till fil \"%s\": %m" -#: ../../fe_utils/recovery_gen.c:133 +#: ../../fe_utils/recovery_gen.c:152 #, c-format msgid "could not create file \"%s\": %m" -msgstr "kan inte skapa fil \"%s\": %m" +msgstr "kunde inte skapa fil \"%s\": %m" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "shell-kommandots argument innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "databasnamnet innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" #: file_ops.c:67 #, c-format @@ -155,11 +260,6 @@ msgstr "kunde inte stänga mÃ¥lfil \"%s\": %m" msgid "could not seek in target file \"%s\": %m" msgstr "kunde inte söka i mÃ¥lfil \"%s\": %m" -#: file_ops.c:117 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "kunde inte skriva fil \"%s\": %m" - #: file_ops.c:150 file_ops.c:177 #, c-format msgid "undefined file type for \"%s\"" @@ -205,197 +305,167 @@ msgstr "kunde inte skapa en symnbolisk länk vid \"%s\": %m" msgid "could not remove symbolic link \"%s\": %m" msgstr "kan inte ta bort symbolisk länk \"%s\": %m" -#: file_ops.c:326 file_ops.c:330 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "kunde inte öppna filen \"%s\" för läsning: %m" - -#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "kunde inte läsa fil \"%s\": %m" - -#: file_ops.c:344 parsexlog.c:352 -#, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" - -#: file_ops.c:388 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "kunde inte öppna katalog \"%s\": %m" - -#: file_ops.c:446 +#: file_ops.c:441 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "kan inte läsa symbolisk länk \"%s\": %m" -#: file_ops.c:449 +#: file_ops.c:444 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "mÃ¥l för symbolisk länk \"%s\" är för lÃ¥ng" -#: file_ops.c:464 -#, c-format -msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform" -msgstr "\"%s\" är en symbolisk länk men symboliska länkar stöds inte pÃ¥ denna plattform" - -#: file_ops.c:471 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "kunde inte läsa katalog \"%s\": %m" - -#: file_ops.c:475 +#: file_ops.c:466 #, c-format msgid "could not close directory \"%s\": %m" msgstr "kunde inte stänga katalog \"%s\": %m" -#: filemap.c:236 +#: filemap.c:235 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "datafil \"%s\" i källan är inte en vanlig fil" -#: filemap.c:241 filemap.c:274 +#: filemap.c:240 filemap.c:273 #, c-format msgid "duplicate source file \"%s\"" msgstr "duplicerad källflagga \"%s\"" -#: filemap.c:329 +#: filemap.c:328 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "oväntad sidmodifiering för icke-regulär fil \"%s\"" -#: filemap.c:679 filemap.c:773 +#: filemap.c:682 filemap.c:776 #, c-format msgid "unknown file type for \"%s\"" msgstr "okänd filtyp pÃ¥ \"%s\"" -#: filemap.c:706 +#: filemap.c:709 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "filen \"%s\" har olika typ i källa och mÃ¥l" -#: filemap.c:778 +#: filemap.c:781 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "kunde inte bestämma vad som skulle göras med filen \"%s\"" -#: libpq_source.c:130 +#: libpq_source.c:131 #, c-format -msgid "could not clear search_path: %s" -msgstr "kunde inte nollställa search_path: %s" +msgid "could not clear \"search_path\": %s" +msgstr "kunde inte nollställa \"search_path\": %s" -#: libpq_source.c:141 +#: libpq_source.c:142 #, c-format -msgid "full_page_writes must be enabled in the source server" -msgstr "full_page_writes mÃ¥ste vara pÃ¥slagen i källservern" +msgid "\"full_page_writes\" must be enabled in the source server" +msgstr "\"full_page_writes\" mÃ¥ste vara pÃ¥slagen i källservern" -#: libpq_source.c:152 +#: libpq_source.c:153 #, c-format msgid "could not prepare statement to fetch file contents: %s" msgstr "kunde inte förbereda satsen för att hämta filinnehÃ¥ll: %s" -#: libpq_source.c:171 +#: libpq_source.c:172 #, c-format msgid "error running query (%s) on source server: %s" msgstr "fel vid körande av frÃ¥ga (%s) pÃ¥ källserver: %s" -#: libpq_source.c:176 +#: libpq_source.c:177 #, c-format msgid "unexpected result set from query" msgstr "oväntad resultatmängd frÃ¥n frÃ¥ga" -#: libpq_source.c:198 +#: libpq_source.c:199 #, c-format msgid "error running query (%s) in source server: %s" msgstr "fel vid körande av frÃ¥ga (%s) i källserver: %s" -#: libpq_source.c:219 +#: libpq_source.c:220 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "oväntat resultat \"%s\" för nuvarande WAL-insättningsposition" -#: libpq_source.c:270 +#: libpq_source.c:271 #, c-format msgid "could not fetch file list: %s" msgstr "kunde inte hämta fillista: %s" -#: libpq_source.c:275 +#: libpq_source.c:276 #, c-format msgid "unexpected result set while fetching file list" msgstr "oväntad resultatmängd vid hämtning av fillista" -#: libpq_source.c:467 +#: libpq_source.c:477 #, c-format msgid "could not send query: %s" msgstr "kunde inte skicka frÃ¥ga: %s" -#: libpq_source.c:470 +#: libpq_source.c:480 #, c-format msgid "could not set libpq connection to single row mode" msgstr "kunde inte sätta libpq-anslutning till enradsläge" -#: libpq_source.c:500 +#: libpq_source.c:510 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "oväntat resultat vid hämtning av extern fil: %s" -#: libpq_source.c:505 +#: libpq_source.c:515 #, c-format msgid "received more data chunks than requested" msgstr "tog emot fler datastycken än efterfrÃ¥gat" -#: libpq_source.c:509 +#: libpq_source.c:519 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "oväntad resultatmängdstorlek vid hämtning av externa filer" -#: libpq_source.c:515 +#: libpq_source.c:525 #, c-format msgid "unexpected data types in result set while fetching remote files: %u %u %u" msgstr "oväntade datayper i resultatmängd vid hämtning av externa filer: %u %u %u" -#: libpq_source.c:523 +#: libpq_source.c:533 #, c-format msgid "unexpected result format while fetching remote files" msgstr "oväntat resultatformat vid hämtning av externa filer" -#: libpq_source.c:529 +#: libpq_source.c:539 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "oväntade null-värden i resultat vid hämtning av externa filer" -#: libpq_source.c:533 +#: libpq_source.c:543 #, c-format msgid "unexpected result length while fetching remote files" msgstr "oväntad resultatlängd vid hämtning av externa filer" -#: libpq_source.c:566 +#: libpq_source.c:576 #, c-format msgid "received data for file \"%s\", when requested for \"%s\"" msgstr "fick data för filen \"%s\", men efterfrÃ¥gade för \"%s\"" -#: libpq_source.c:570 +#: libpq_source.c:580 #, c-format msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" msgstr "fick data frÃ¥n offset %lld i fil \"%s\", men efterfrÃ¥gade offset %lld" -#: libpq_source.c:582 +#: libpq_source.c:592 #, c-format msgid "received more than requested for file \"%s\"" msgstr "tog emot mer än efterfrÃ¥gat för filen \"%s\"" -#: libpq_source.c:595 +#: libpq_source.c:605 #, c-format msgid "unexpected number of data chunks received" msgstr "oväntat antal datastycken togs emot" -#: libpq_source.c:638 +#: libpq_source.c:648 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "kunde inte hämta extern fil \"%s\": %s" -#: libpq_source.c:643 +#: libpq_source.c:653 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "oväntat resultatmängd vid hämtning av extern fil \"%s\"" @@ -410,11 +480,6 @@ msgstr "kunde inte öppna källfil \"%s\": %m" msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied" msgstr "storleken pÃ¥ källfilen \"%s\" ändrades under körning: %d byte förväntades, %d kopierades" -#: local_source.c:121 local_source.c:172 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "kunde inte stänga fil \"%s\": %m" - #: local_source.c:146 #, c-format msgid "could not seek in source file: %m" @@ -465,7 +530,7 @@ msgstr "kunde inte söka (seek) i fil \"%s\": %m" msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" msgstr "WAL-post modifierar en relation, men posttypen känns inte igen: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" -#: pg_rewind.c:86 +#: pg_rewind.c:94 #, c-format msgid "" "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" @@ -474,7 +539,7 @@ msgstr "" "%s resynkroniserar ett PostgreSQL-kluster med en annan kopia av klustret.\n" "\n" -#: pg_rewind.c:87 +#: pg_rewind.c:95 #, c-format msgid "" "Usage:\n" @@ -485,41 +550,41 @@ msgstr "" " %s [FLAGGA]...\n" "\n" -#: pg_rewind.c:88 +#: pg_rewind.c:96 #, c-format msgid "Options:\n" msgstr "Flaggor:\n" -#: pg_rewind.c:89 +#: pg_rewind.c:97 #, c-format msgid "" -" -c, --restore-target-wal use restore_command in target configuration to\n" +" -c, --restore-target-wal use \"restore_command\" in target configuration to\n" " retrieve WAL files from archives\n" msgstr "" -" -c, --restore-target-wal använd restore_command i mÃ¥lkonfigurationen\n" -" för att hämta WAL-filer frÃ¥n arkiv\n" +" -c, --restore-target-wal använd \"restore_command\" i mÃ¥lkonfigurationen\n" +" för att hämta WAL-filer frÃ¥n arkiven\n" -#: pg_rewind.c:91 +#: pg_rewind.c:99 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=KATALOG existerande datakatalog att modifiera\n" -#: pg_rewind.c:92 +#: pg_rewind.c:100 #, c-format msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" msgstr " --source-pgdata=KATALOG källdatakatalog att synkronisera med\n" -#: pg_rewind.c:93 +#: pg_rewind.c:101 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr " --source-server=ANSLSTR källserver att synkronisera med\n" -#: pg_rewind.c:94 +#: pg_rewind.c:102 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run stoppa innan nÃ¥got modifieras\n" -#: pg_rewind.c:95 +#: pg_rewind.c:103 #, c-format msgid "" " -N, --no-sync do not wait for changes to be written\n" @@ -528,22 +593,21 @@ msgstr "" " -N, --no-sync vänta inte pÃ¥ att ändingar säkert\n" " skrivits till disk\n" -#: pg_rewind.c:97 +#: pg_rewind.c:105 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress skriv ut förloppmeddelanden\n" -#: pg_rewind.c:98 +#: pg_rewind.c:106 #, c-format msgid "" " -R, --write-recovery-conf write configuration for replication\n" " (requires --source-server)\n" msgstr "" -" -R, --write-recovery-conf\n" -" skriv konfiguration för replikering\n" -" (kräver --source-server)\n" +" -R, --write-recovery-conf skriv konfiguration för replikering\n" +" (kräver --source-server)\n" -#: pg_rewind.c:100 +#: pg_rewind.c:108 #, c-format msgid "" " --config-file=FILENAME use specified main server configuration\n" @@ -552,27 +616,32 @@ msgstr "" " --config-file=FILNAMN använd angiven serverkonfiguration när\n" " mÃ¥lklustret körs\n" -#: pg_rewind.c:102 +#: pg_rewind.c:110 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug skriv ut en massa debugmeddelanden\n" -#: pg_rewind.c:103 +#: pg_rewind.c:111 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" msgstr " --no-ensure-shutdown ingen automatisk hantering av trasig nedstängning\n" -#: pg_rewind.c:104 +#: pg_rewind.c:112 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METOD sätt synkmetod för att synka filer till disk\n" + +#: pg_rewind.c:113 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version skriv ut versioninformation och avsluta sedan\n" -#: pg_rewind.c:105 +#: pg_rewind.c:114 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp och avsluta sedan\n" -#: pg_rewind.c:106 +#: pg_rewind.c:115 #, c-format msgid "" "\n" @@ -581,430 +650,420 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_rewind.c:107 +#: pg_rewind.c:116 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237 -#: pg_rewind.c:244 pg_rewind.c:252 +#: pg_rewind.c:232 pg_rewind.c:240 pg_rewind.c:247 pg_rewind.c:254 +#: pg_rewind.c:261 pg_rewind.c:269 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: pg_rewind.c:222 +#: pg_rewind.c:239 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "ingen källa angavs (--source-pgdata eller --source-server)" -#: pg_rewind.c:229 +#: pg_rewind.c:246 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "bara en av --source-pgdata och --source-server fÃ¥r anges" -#: pg_rewind.c:236 +#: pg_rewind.c:253 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "ingen mÃ¥ldatakatalog angiven (--target-pgdata)" -#: pg_rewind.c:243 +#: pg_rewind.c:260 #, c-format msgid "no source server information (--source-server) specified for --write-recovery-conf" msgstr "ingen källserverinformation (--source-server) angiven för --write-recovery-conf" -#: pg_rewind.c:250 +#: pg_rewind.c:267 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")" -#: pg_rewind.c:265 +#: pg_rewind.c:282 #, c-format msgid "cannot be executed by \"root\"" msgstr "kan inte köras av \"root\"" -#: pg_rewind.c:266 +#: pg_rewind.c:283 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Du mÃ¥ste köra %s som PostgreSQL:s superuser." -#: pg_rewind.c:276 +#: pg_rewind.c:293 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "kunde inte läsa rättigheter pÃ¥ katalog \"%s\": %m" -#: pg_rewind.c:294 +#: pg_rewind.c:311 #, c-format msgid "%s" msgstr "%s" -#: pg_rewind.c:297 +#: pg_rewind.c:314 #, c-format msgid "connected to server" msgstr "ansluten till server" -#: pg_rewind.c:344 +#: pg_rewind.c:375 #, c-format msgid "source and target cluster are on the same timeline" msgstr "källa och mÃ¥lkluster är pÃ¥ samma tidslinje" -#: pg_rewind.c:353 +#: pg_rewind.c:396 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "servrarna divergerade vid WAL-position %X/%X pÃ¥ tidslinje %u" -#: pg_rewind.c:401 +#: pg_rewind.c:451 #, c-format msgid "no rewind required" msgstr "ingen rewind krävs" -#: pg_rewind.c:410 +#: pg_rewind.c:460 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "rewind frÃ¥n senaste gemensamma checkpoint vid %X/%X pÃ¥ tidslinje %u" -#: pg_rewind.c:420 +#: pg_rewind.c:470 #, c-format msgid "reading source file list" msgstr "läser källfillista" -#: pg_rewind.c:424 +#: pg_rewind.c:474 #, c-format msgid "reading target file list" msgstr "läser mÃ¥lfillista" -#: pg_rewind.c:433 +#: pg_rewind.c:483 #, c-format msgid "reading WAL in target" msgstr "läser WAL i mÃ¥let" -#: pg_rewind.c:454 +#: pg_rewind.c:504 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "behöver kopiera %lu MB (total källkatalogstorlek är %lu MB)" -#: pg_rewind.c:472 +#: pg_rewind.c:522 #, c-format msgid "syncing target data directory" msgstr "synkar mÃ¥ldatakatalog" -#: pg_rewind.c:488 +#: pg_rewind.c:538 #, c-format msgid "Done!" msgstr "Klar!" -#: pg_rewind.c:568 +#: pg_rewind.c:618 #, c-format msgid "no action decided for file \"%s\"" msgstr "ingen Ã¥tgärd beslutades för filen \"%s\"" -#: pg_rewind.c:600 +#: pg_rewind.c:650 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "källsystemet ändrades samtidigt som pg_rewind kördes" -#: pg_rewind.c:604 +#: pg_rewind.c:654 #, c-format msgid "creating backup label and updating control file" msgstr "skapar backupetikett och uppdaterar kontrollfil" -#: pg_rewind.c:654 +#: pg_rewind.c:704 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "källsystemet var i ett oväntat tillstÃ¥nd vid slutet av Ã¥terspolningen" -#: pg_rewind.c:685 +#: pg_rewind.c:736 #, c-format msgid "source and target clusters are from different systems" msgstr "källa och mÃ¥lkluster är frÃ¥n olika system" -#: pg_rewind.c:693 +#: pg_rewind.c:744 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "klustren är inte kompatibla med denna version av pg_rewind" -#: pg_rewind.c:703 +#: pg_rewind.c:754 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "mÃ¥lservern behöver använda antingen datachecksums eller \"wal_log_hints = on\"" -#: pg_rewind.c:714 +#: pg_rewind.c:765 #, c-format msgid "target server must be shut down cleanly" msgstr "mÃ¥lserver mÃ¥ste stängas ner utan fel" -#: pg_rewind.c:724 +#: pg_rewind.c:775 #, c-format msgid "source data directory must be shut down cleanly" msgstr "mÃ¥ldatakatalog mÃ¥ste stängas ner utan fel" -#: pg_rewind.c:771 +#: pg_rewind.c:822 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s kB (%d%%) kopierad" -#: pg_rewind.c:834 -#, c-format -msgid "invalid control file" -msgstr "ogiltig kontrollfil" - -#: pg_rewind.c:918 +#: pg_rewind.c:948 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "kunde inte finna en gemensam anfader av källa och mÃ¥lklusterets tidslinjer" -#: pg_rewind.c:959 +#: pg_rewind.c:989 #, c-format msgid "backup label buffer too small" msgstr "backupetikett-buffer för liten" -#: pg_rewind.c:982 +#: pg_rewind.c:1012 #, c-format msgid "unexpected control file CRC" msgstr "oväntad kontrollfil-CRC" -#: pg_rewind.c:994 +#: pg_rewind.c:1024 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "oväntad kontrollfilstorlek %d, förväntade %d" -#: pg_rewind.c:1003 +#: pg_rewind.c:1034 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" -msgstr[0] "WAL-segmentstorlek mÃ¥ste vara en tvÃ¥potens mellan 1MB och 1GB men kontrollfilen anger %d byte" -msgstr[1] "WAL-segmentstorlek mÃ¥ste vara en tvÃ¥potens mellan 1MB och 1GB men kontrollfilen anger %d byte" +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "ogiltigt WAL-segmentstorlek i kontrollfil (%d byte)" +msgstr[1] "ogiltigt WAL-segmentstorlek i kontrollfil (%d byte)" -#: pg_rewind.c:1042 pg_rewind.c:1112 +#: pg_rewind.c:1038 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL-segmentstorleken mÃ¥ste vara en tvÃ¥potens mellan 1 MB och 1 GB." + +#: pg_rewind.c:1075 pg_rewind.c:1143 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"" -#: pg_rewind.c:1045 pg_rewind.c:1115 +#: pg_rewind.c:1078 pg_rewind.c:1146 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s" -#: pg_rewind.c:1078 +#: pg_rewind.c:1107 #, c-format -msgid "restore_command is not set in the target cluster" -msgstr "restore_command är inte satt i mÃ¥lklustret" +msgid "could not read restore_command from target cluster" +msgstr "kunde inte läsa restore_command frÃ¥n mÃ¥lklustret" -#: pg_rewind.c:1119 +#: pg_rewind.c:1112 +#, c-format +msgid "\"restore_command\" is not set in the target cluster" +msgstr "\"restore_command\" är inte satt i mÃ¥lklustret" + +#: pg_rewind.c:1150 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "kör \"%s\" för mÃ¥lservern för att slutföra krashÃ¥terställning" -#: pg_rewind.c:1156 +#: pg_rewind.c:1188 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "postgres enanvändarläge misslyckades i mÃ¥lklustret" -#: pg_rewind.c:1157 +#: pg_rewind.c:1189 #, c-format msgid "Command was: %s" msgstr "Kommandot var: %s" -#: timeline.c:75 timeline.c:81 +#: timeline.c:74 timeline.c:80 #, c-format msgid "syntax error in history file: %s" msgstr "syntaxfel i history-fil: %s" -#: timeline.c:76 +#: timeline.c:75 #, c-format msgid "Expected a numeric timeline ID." msgstr "Förväntade ett numeriskt tidslinje-ID." -#: timeline.c:82 +#: timeline.c:81 #, c-format msgid "Expected a write-ahead log switchpoint location." msgstr "Förväntade en write-ahead-logg:s switchpoint-position." -#: timeline.c:87 +#: timeline.c:86 #, c-format msgid "invalid data in history file: %s" msgstr "felaktig data i history-fil: %s" -#: timeline.c:88 +#: timeline.c:87 #, c-format msgid "Timeline IDs must be in increasing sequence." msgstr "Tidslinje-ID mÃ¥ste komma i en stigande sekvens." -#: timeline.c:108 +#: timeline.c:107 #, c-format msgid "invalid data in history file" msgstr "ogiltig data i historikfil" -#: timeline.c:109 +#: timeline.c:108 #, c-format msgid "Timeline IDs must be less than child timeline's ID." msgstr "Tidslinje-ID:er mÃ¥ste vara mindre än barnens tidslinje-ID:er." -#: xlogreader.c:625 +#: xlogreader.c:619 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "ogiltig postoffset vid %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "ogiltig postlängd vid %X/%X: förväntade minst %u, fick %u" -#: xlogreader.c:633 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "contrecord är begärd vid %X/%X" -#: xlogreader.c:674 xlogreader.c:1121 -#, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "ogiltig postlängd vid %X/%X: förväntade %u, fick %u" - -#: xlogreader.c:703 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "slut pÃ¥ minne vid avkodning av post med längden %u" - -#: xlogreader.c:725 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "postlängd %u vid %X/%X är för lÃ¥ng" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "ogiltig postlängd vid %X/%X: förväntade minst %u, fick %u" -#: xlogreader.c:774 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "det finns ingen contrecord-flagga vid %X/%X" -#: xlogreader.c:787 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "ogiltig contrecord-längd %u (förväntade %lld) vid %X/%X" -#: xlogreader.c:922 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "det finns ingen contrecord vid %X/%X" - -#: xlogreader.c:1129 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ogiltigt resurshanterar-ID %u vid %X/%X" -#: xlogreader.c:1142 xlogreader.c:1158 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "post med inkorrekt prev-link %X/%X vid %X/%X" -#: xlogreader.c:1194 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "felaktig resurshanterardatakontrollsumma i post vid %X/%X" -#: xlogreader.c:1231 +#: xlogreader.c:1243 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "felaktigt magiskt nummer %04X i loggsegment %s, offset %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "felaktigt magiskt nummer %04X i WAL-segment %s, LSN %X/%X, offset %u" -#: xlogreader.c:1245 xlogreader.c:1286 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "ogiltiga infobitar %04X i loggsegment %s, offset %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "ogiltiga infobitar %04X i WAL-segment %s, LSN %X/%X, offset %u" -#: xlogreader.c:1260 +#: xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL-fil är frÃ¥n ett annat databassystem: WAL-filens databassystemidentifierare är %llu, pg_control databassystemidentifierare är %llu" -#: xlogreader.c:1268 +#: xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL-fil är frÃ¥n ett annat databassystem: inkorrekt segmentstorlek i sidhuvud" -#: xlogreader.c:1274 +#: xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL-fil är frÃ¥n ett annat databassystem: inkorrekt XLOG_BLCKSZ i sidhuvud" -#: xlogreader.c:1305 +#: xlogreader.c:1320 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "oväntad sidadress %X/%X i loggsegment %s, offset %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "oväntad sidadress %X/%X i WAL-segment %s, LSN %X/%X, offset %u" -#: xlogreader.c:1330 +#: xlogreader.c:1346 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "ej-i-sekvens för tidslinje-ID %u (efter %u) i loggsegment %s, offset %u" +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "ej-i-sekvens för tidslinje-ID %u (efter %u) i WAL-segment %s, LSN %X/%X, offset %u" -#: xlogreader.c:1735 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "ej-i-sekvens block_id %u vid %X/%X" -#: xlogreader.c:1759 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" -msgstr "BKPBLOCK_HAS_DATA satt, men ingen data inkluderad vid %X/%X" +msgstr "BKPBLOCK_HAS_DATA är satt men ingen data inkluderad vid %X/%X" -#: xlogreader.c:1766 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" -msgstr "BKPBLOCK_HAS_DATA ej satt, men datalängd är %u vid %X/%X" +msgstr "BKPBLOCK_HAS_DATA är ej satt men datalängden är %u vid %X/%X" -#: xlogreader.c:1802 +#: xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLE satt, men hÃ¥loffset %u längd %u block-image-längd %u vid %X/%X" +msgstr "BKPIMAGE_HAS_HOLE är satt men hÃ¥loffset %u längd %u blockavbildlängd %u vid %X/%X" -#: xlogreader.c:1818 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLE ej satt, men hÃ¥loffset %u längd %u vid %X/%X" +msgstr "BKPIMAGE_HAS_HOLE är inte satt men hÃ¥loffset %u längd %u vid %X/%X" -#: xlogreader.c:1832 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" -msgstr "BKPIMAGE_COMPRESSED satt, men blockavbildlängd %u vid %X/%X" +msgstr "BKPIMAGE_COMPRESSED är satt men blockavbildlängd %u vid %X/%X" -#: xlogreader.c:1847 +#: xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" -msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED satt, men blockavbildlängd är %u vid %X/%X" +msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED är satt men blockavbildlängd är %u vid %X/%X" -#: xlogreader.c:1863 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" -msgstr "BKPBLOCK_SAME_REL satt men ingen tidigare rel vid %X/%X" +msgstr "BKPBLOCK_SAME_REL är satt men ingen tidigare rel vid %X/%X" -#: xlogreader.c:1875 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ogiltig block_id %u vid %X/%X" -#: xlogreader.c:1942 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "post med ogiltig längd vid %X/%X" -#: xlogreader.c:1967 +#: xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "kunde inte hitta backup-block med ID %d i WAL-post" -#: xlogreader.c:2051 +#: xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "kunde inte Ã¥terställa avbild vid %X/%X med ogiltigt block %d angivet" -#: xlogreader.c:2058 +#: xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" -msgstr "kunde inte Ã¥terställa avbild vid %X/%X med ogiltigt state, block %d" +msgstr "kunde inte Ã¥terställa avbild vid %X/%X med ogiltigt state, block %d" -#: xlogreader.c:2085 xlogreader.c:2102 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" -msgstr "kunde inte Ã¥terställa avbild vid %X/%X komprimerade med %s stöds inte av bygget, block %d" +msgstr "kunde inte Ã¥terställa avbild vid %X/%X, komprimerad med %s stöds inte av bygget, block %d" -#: xlogreader.c:2111 +#: xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" -msgstr "kunde inte Ã¥terställa avbild vid %X/%X komprimerad med okänd metod, block %d" +msgstr "kunde inte Ã¥terställa avbild vid %X/%X, komprimerad med okänd metod, block %d" -#: xlogreader.c:2119 +#: xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "kunde inte packa upp avbild vid %X/%X, block %d" diff --git a/src/bin/pg_rewind/po/uk.po b/src/bin/pg_rewind/po/uk.po index 13fc3503a59a9..dfcc9ac3269e6 100644 --- a/src/bin/pg_rewind/po/uk.po +++ b/src/bin/pg_rewind/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:51+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:23+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pg_rewind.pot\n" -"X-Crowdin-File-ID: 908\n" +"X-Crowdin-File: /REL_17_STABLE/pg_rewind.pot\n" +"X-Crowdin-File-ID: 1030\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,109 +37,210 @@ msgstr "деталі: " msgid "hint: " msgstr "підказка: " +#: ../../common/controldata_utils.c:97 file_ops.c:326 file_ops.c:330 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m" + +#: ../../common/controldata_utils.c:110 file_ops.c:341 local_source.c:104 +#: local_source.c:163 parsexlog.c:350 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" + +#: ../../common/controldata_utils.c:119 file_ops.c:344 parsexlog.c:352 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: local_source.c:121 local_source.c:172 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "неможливо закрити файл \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неправильний порÑдок байтів" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "можлива помилка у поÑлідовноÑті байтів.\n" +"ПорÑдок байтів, що викориÑтовують Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ pg_control, може не відповідати тому, Ñкий викориÑтовуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ програмою. У такому випадку результати нижче будуть неправильним, Ñ– інÑталÑÑ†Ñ–Ñ PostgreSQL буде неÑуміÑною з цим каталогом даних." + +#: ../../common/controldata_utils.c:230 ../../common/file_utils.c:70 +#: ../../common/file_utils.c:347 ../../common/file_utils.c:406 +#: ../../common/file_utils.c:480 ../../fe_utils/recovery_gen.c:140 +#: parsexlog.c:312 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не можливо відкрити файл \"%s\": %m" + +#: ../../common/controldata_utils.c:249 file_ops.c:117 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m" + +#: ../../common/controldata_utils.c:268 ../../common/file_utils.c:418 +#: ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не вдалоÑÑ fsync файл \"%s\": %m" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "недоÑтатньо пам'Ñті\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" -#: ../../common/restricted_token.c:64 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не вдалоÑÑ Ñинхронізувати файлову ÑиÑтему Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#: ../../fe_utils/archive.c:86 file_ops.c:417 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує метод Ñинхронізації \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 file_ops.c:388 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 file_ops.c:462 #, c-format -msgid "could not load library \"%s\": error code %lu" -msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ бібліотеку \"%s\": код помилки %lu" +msgid "could not read directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" -#: ../../common/restricted_token.c:73 +#: ../../common/file_utils.c:498 #, c-format -msgid "cannot create restricted tokens on this platform: error code %lu" -msgstr "не вдалоÑÑ Ñтворити обмежені токени на цій платформі: код помилки %lu" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" -#: ../../common/restricted_token.c:82 +#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118 +#, c-format +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ \"%s\": \"%s\"" + +#: ../../common/percentrepl.c:80 +#, c-format +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "РÑдок неÑподівано завершуєтьÑÑ Ð¿Ñ–ÑÐ»Ñ Ñпеціального Ñимволу \"%%\"." + +#: ../../common/percentrepl.c:119 +#, c-format +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "РÑдок міÑтить неочікуваний заповнювач \"%%%c\"." + +#: ../../common/restricted_token.c:60 #, c-format msgid "could not open process token: error code %lu" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ токен процеÑу: код помилки %lu" -#: ../../common/restricted_token.c:97 +#: ../../common/restricted_token.c:74 #, c-format msgid "could not allocate SIDs: error code %lu" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ SID: код помилки %lu" -#: ../../common/restricted_token.c:119 +#: ../../common/restricted_token.c:94 #, c-format msgid "could not create restricted token: error code %lu" msgstr "не вдалоÑÑ Ñтворити обмежений токен: код помилки %lu" -#: ../../common/restricted_token.c:140 +#: ../../common/restricted_token.c:115 #, c-format msgid "could not start process for command \"%s\": error code %lu" msgstr "не вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ \"%s\": код помилки %lu" -#: ../../common/restricted_token.c:178 +#: ../../common/restricted_token.c:153 #, c-format msgid "could not re-execute with restricted token: error code %lu" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑтити з обмеженим токеном: код помилки %lu" -#: ../../common/restricted_token.c:193 +#: ../../common/restricted_token.c:168 #, c-format msgid "could not get exit code from subprocess: error code %lu" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑу: код помилки %lu" -#: ../../fe_utils/archive.c:52 -#, c-format -msgid "cannot use restore_command with %%r placeholder" -msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтати restore_command із заповнювачем %%r" - -#: ../../fe_utils/archive.c:70 +#: ../../fe_utils/archive.c:69 #, c-format msgid "unexpected file size for \"%s\": %lld instead of %lld" msgstr "неочікуваний розмір файлу Ð´Ð»Ñ \"%s\": %lld заміÑть %lld" -#: ../../fe_utils/archive.c:78 +#: ../../fe_utils/archive.c:77 #, c-format msgid "could not open file \"%s\" restored from archive: %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" відновлений з архіву: %m" -#: ../../fe_utils/archive.c:87 file_ops.c:417 -#, c-format -msgid "could not stat file \"%s\": %m" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" - -#: ../../fe_utils/archive.c:99 +#: ../../fe_utils/archive.c:98 #, c-format -msgid "restore_command failed: %s" -msgstr "помилка restore_command: %s" +msgid "\"restore_command\" failed: %s" +msgstr "помилка \"restore_command\": %s" -#: ../../fe_utils/archive.c:106 +#: ../../fe_utils/archive.c:105 #, c-format msgid "could not restore file \"%s\" from archive" msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ файл \"%s\" з архіву" -#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 -#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 -#: ../../fe_utils/recovery_gen.c:149 +#: ../../fe_utils/option_utils.c:69 #, c-format -msgid "out of memory" -msgstr "недоÑтатньо пам'Ñті" +msgid "invalid value \"%s\" for option %s" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" -#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312 +#: ../../fe_utils/option_utils.c:76 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "не можливо відкрити файл \"%s\": %m" +msgid "%s must be in range %d..%d" +msgstr "%s має бути в діапазоні %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нерозпізнаний метод Ñинхронізації: %s" + +#: ../../fe_utils/recovery_gen.c:39 ../../fe_utils/recovery_gen.c:50 +#: ../../fe_utils/recovery_gen.c:89 ../../fe_utils/recovery_gen.c:109 +#: ../../fe_utils/recovery_gen.c:168 +#, c-format +msgid "out of memory" +msgstr "недоÑтатньо пам'Ñті" -#: ../../fe_utils/recovery_gen.c:124 +#: ../../fe_utils/recovery_gen.c:143 #, c-format msgid "could not write to file \"%s\": %m" msgstr "неможливо запиÑати до файлу \"%s\": %m" -#: ../../fe_utils/recovery_gen.c:133 +#: ../../fe_utils/recovery_gen.c:152 #, c-format msgid "could not create file \"%s\": %m" msgstr "неможливо Ñтворити файл \"%s\": %m" +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "аргумент командної оболонки міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "назва бази даних міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + #: file_ops.c:67 #, c-format msgid "could not open target file \"%s\": %m" @@ -155,11 +256,6 @@ msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ цільовий файл \"%s\": %m" msgid "could not seek in target file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ в цільовому файлі \"%s\": %m" -#: file_ops.c:117 -#, c-format -msgid "could not write file \"%s\": %m" -msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m" - #: file_ops.c:150 file_ops.c:177 #, c-format msgid "undefined file type for \"%s\"" @@ -205,197 +301,167 @@ msgstr "неможливо Ñтворити Ñимволічне поÑланн msgid "could not remove symbolic link \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ Ñимвольне поÑÐ¸Ð»Ð°Ð½Ð½Ñ \"%s\": %m" -#: file_ops.c:326 file_ops.c:330 -#, c-format -msgid "could not open file \"%s\" for reading: %m" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m" - -#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" - -#: file_ops.c:344 parsexlog.c:352 -#, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %zu" - -#: file_ops.c:388 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" - -#: file_ops.c:446 +#: file_ops.c:441 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "не можливо прочитати Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m" -#: file_ops.c:449 +#: file_ops.c:444 #, c-format msgid "symbolic link \"%s\" target is too long" msgstr "таргет Ñимволічного поÑÐ¸Ð»Ð°Ð½Ð½Ñ \"%s\" задовгий" -#: file_ops.c:464 -#, c-format -msgid "\"%s\" is a symbolic link, but symbolic links are not supported on this platform" -msgstr "\"%s\"Ñ” Ñимволічним поÑиланнÑм, але Ñимволічні поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ðµ підтримуютьÑÑ Ð½Ð° даній платформі" - -#: file_ops.c:471 -#, c-format -msgid "could not read directory \"%s\": %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" - -#: file_ops.c:475 +#: file_ops.c:466 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" -#: filemap.c:236 +#: filemap.c:235 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "файл даних \"%s\" в джерелі не Ñ” регулÑрним файлом" -#: filemap.c:241 filemap.c:274 +#: filemap.c:240 filemap.c:273 #, c-format msgid "duplicate source file \"%s\"" msgstr "дублікат вихідного файлу \"%s\"" -#: filemap.c:329 +#: filemap.c:328 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "неочікувана Ð¼Ð¾Ð´Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñторінки Ð´Ð»Ñ Ð½ÐµÑ€ÐµÐ³ÑƒÐ»Ñрного файлу \"%s\"" -#: filemap.c:679 filemap.c:773 +#: filemap.c:682 filemap.c:776 #, c-format msgid "unknown file type for \"%s\"" msgstr "невідомий тип файлу Ð´Ð»Ñ \"%s\"" -#: filemap.c:706 +#: filemap.c:709 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "файл \"%s\" має різні типи у джерелі та цілі" -#: filemap.c:778 +#: filemap.c:781 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "не вдалоÑÑ Ð²Ð¸Ñ€Ñ–ÑˆÐ¸Ñ‚Ð¸, що робити з файлом \"%s\"" -#: libpq_source.c:130 +#: libpq_source.c:131 #, c-format -msgid "could not clear search_path: %s" -msgstr "не вдалоÑÑ Ð¾Ñ‡Ð¸Ñтити search_path: %s" +msgid "could not clear \"search_path\": %s" +msgstr "не вдалоÑÑ Ð¾Ñ‡Ð¸Ñтити \"search_path\": %s" -#: libpq_source.c:141 +#: libpq_source.c:142 #, c-format -msgid "full_page_writes must be enabled in the source server" -msgstr "на початковому Ñервері повинно бути увімкнено full_page_writes" +msgid "\"full_page_writes\" must be enabled in the source server" +msgstr "\"full_page_writes\" Ñлід ввімкнути на вихідному Ñервері" -#: libpq_source.c:152 +#: libpq_source.c:153 #, c-format msgid "could not prepare statement to fetch file contents: %s" msgstr "не вдалоÑÑ Ð¿Ñ–Ð´Ð³Ð¾Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸ інÑтрукцію щоб отримати вміÑÑ‚ файлу: %s" -#: libpq_source.c:171 +#: libpq_source.c:172 #, c-format msgid "error running query (%s) on source server: %s" msgstr "помилка при виконанні запиту (%s) на вихідному Ñервері: %s" -#: libpq_source.c:176 +#: libpq_source.c:177 #, c-format msgid "unexpected result set from query" msgstr "неочікуваний результат запиту" -#: libpq_source.c:198 +#: libpq_source.c:199 #, c-format msgid "error running query (%s) in source server: %s" msgstr "помилка при виконанні запиту (%s) на початковому Ñервері: %s" -#: libpq_source.c:219 +#: libpq_source.c:220 #, c-format msgid "unrecognized result \"%s\" for current WAL insert location" msgstr "нерозпізнаний результат \"%s\" заміÑть поточної добавленої позиції WAL" -#: libpq_source.c:270 +#: libpq_source.c:271 #, c-format msgid "could not fetch file list: %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑпиÑок файлів: %s" -#: libpq_source.c:275 +#: libpq_source.c:276 #, c-format msgid "unexpected result set while fetching file list" msgstr "неочікуваний результат при отриманні ÑпиÑку файлів" -#: libpq_source.c:467 +#: libpq_source.c:477 #, c-format msgid "could not send query: %s" msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати запит: %s" -#: libpq_source.c:470 +#: libpq_source.c:480 #, c-format msgid "could not set libpq connection to single row mode" msgstr "не вдалоÑÑ Ð²Ñтановити libpq з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ñ€Ñдкового режиму" -#: libpq_source.c:500 +#: libpq_source.c:510 #, c-format msgid "unexpected result while fetching remote files: %s" msgstr "неочікуваний результат при отриманні віддалених файлів: %s" -#: libpq_source.c:505 +#: libpq_source.c:515 #, c-format msgid "received more data chunks than requested" msgstr "отримано більше фрагментів даних, ніж запитувалоÑÑŒ" -#: libpq_source.c:509 +#: libpq_source.c:519 #, c-format msgid "unexpected result set size while fetching remote files" msgstr "неочікуваний розмір набору результатів при отриманні віддалених файлів" -#: libpq_source.c:515 +#: libpq_source.c:525 #, c-format msgid "unexpected data types in result set while fetching remote files: %u %u %u" msgstr "неочікувані типи даних в результаті при отриманні віддалених файлів: %u %u %u" -#: libpq_source.c:523 +#: libpq_source.c:533 #, c-format msgid "unexpected result format while fetching remote files" msgstr "неочікуваний формат результату при отриманні віддалених файлів" -#: libpq_source.c:529 +#: libpq_source.c:539 #, c-format msgid "unexpected null values in result while fetching remote files" msgstr "неочікувані нульові Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² результаті при отриманні віддалених файлів" -#: libpq_source.c:533 +#: libpq_source.c:543 #, c-format msgid "unexpected result length while fetching remote files" msgstr "неочікувана довжина результату при отриманні віддалених файлів" -#: libpq_source.c:566 +#: libpq_source.c:576 #, c-format msgid "received data for file \"%s\", when requested for \"%s\"" msgstr "отримані дані Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\", коли запитувалоÑÑŒ Ð´Ð»Ñ \"%s\"" -#: libpq_source.c:570 +#: libpq_source.c:580 #, c-format msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" msgstr "отримано дані по зÑуву %lld файлу \"%s\", коли запитувалоÑÑŒ про зÑув %lld" -#: libpq_source.c:582 +#: libpq_source.c:592 #, c-format msgid "received more than requested for file \"%s\"" msgstr "отримано більше, ніж запитувалоÑÑŒ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\"" -#: libpq_source.c:595 +#: libpq_source.c:605 #, c-format msgid "unexpected number of data chunks received" msgstr "отримано неочікувану кількіÑть фрагментів даних" -#: libpq_source.c:638 +#: libpq_source.c:648 #, c-format msgid "could not fetch remote file \"%s\": %s" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ віддалений файл \"%s\": %s" -#: libpq_source.c:643 +#: libpq_source.c:653 #, c-format msgid "unexpected result set while fetching remote file \"%s\"" msgstr "неочікуваний набір результатів при отриманні віддаленого файлу \"%s\"" @@ -410,11 +476,6 @@ msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ вихідний файл \"%s\": % msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied" msgstr "розмір вихідного файлу \"%s\" паралельно змінивÑÑ: очікувалоÑÑ %d байт, %d Ñкопійовано" -#: local_source.c:121 local_source.c:172 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "неможливо закрити файл \"%s\": %m" - #: local_source.c:146 #, c-format msgid "could not seek in source file: %m" @@ -465,514 +526,524 @@ msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ в файлі \"%s\": %m" msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" msgstr "WAL модифікує відношеннÑ, але тип запиÑу не розпізнано: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" -#: pg_rewind.c:86 +#: pg_rewind.c:94 #, c-format msgid "%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n\n" msgstr "%s Ñинхронізує клаÑтер PostgreSQL з іншою копією клаÑтеру.\n\n" -#: pg_rewind.c:87 +#: pg_rewind.c:95 #, c-format msgid "Usage:\n" " %s [OPTION]...\n\n" msgstr "ВикориÑтаннÑ:\n" " %s [OPTION]...\n\n" -#: pg_rewind.c:88 +#: pg_rewind.c:96 #, c-format msgid "Options:\n" msgstr "Параметри:\n" -#: pg_rewind.c:89 +#: pg_rewind.c:97 #, c-format -msgid " -c, --restore-target-wal use restore_command in target configuration to\n" +msgid " -c, --restore-target-wal use \"restore_command\" in target configuration to\n" " retrieve WAL files from archives\n" -msgstr " -c, --restore-target-wal викориÑтовує restore_command в цільовій конфігурації, щоб\n" +msgstr " -c, --restore-target-wal викориÑтовує \"restore_command\" в цільовій конфігурації, щоб\n" " отримати файли WAL з архівів\n" -#: pg_rewind.c:91 +#: pg_rewind.c:99 #, c-format msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" msgstr " -D, --target-pgdata=DIRECTORY Ñ–Ñнуючий каталог Ð´Ð»Ñ Ð·Ð¼Ñ–Ð½\n" -#: pg_rewind.c:92 +#: pg_rewind.c:100 #, c-format msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" msgstr " --source-pgdata=DIRECTORY початковий каталог даних Ð´Ð»Ñ Ñинхронізації\n" -#: pg_rewind.c:93 +#: pg_rewind.c:101 #, c-format msgid " --source-server=CONNSTR source server to synchronize with\n" msgstr " --source-server=CONNSTR початковий Ñервер Ð´Ð»Ñ Ñинхронізації\n" -#: pg_rewind.c:94 +#: pg_rewind.c:102 #, c-format msgid " -n, --dry-run stop before modifying anything\n" msgstr " -n, --dry-run зупинитиÑÑ Ð´Ð¾ внеÑÐµÐ½Ð½Ñ Ð±ÑƒÐ´ÑŒ-Ñких змін\n" -#: pg_rewind.c:95 +#: pg_rewind.c:103 #, c-format msgid " -N, --no-sync do not wait for changes to be written\n" " safely to disk\n" msgstr " -N, --no-sync не чекати поки зміни будуть запиÑані на диÑк\n" -#: pg_rewind.c:97 +#: pg_rewind.c:105 #, c-format msgid " -P, --progress write progress messages\n" msgstr " -P, --progress повідомлÑти про хід процеÑу\n" -#: pg_rewind.c:98 +#: pg_rewind.c:106 #, c-format msgid " -R, --write-recovery-conf write configuration for replication\n" " (requires --source-server)\n" msgstr " -R, --write-recovery-conf запиÑує конфігурацію Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ— \n" " (потребує --source-server)\n" -#: pg_rewind.c:100 +#: pg_rewind.c:108 #, c-format msgid " --config-file=FILENAME use specified main server configuration\n" " file when running target cluster\n" msgstr " --config-file=FILENAME викориÑтовувати заданий оÑновний файл конфігурації Ñервера\n" " при запуÑку цільового клаÑтера\n" -#: pg_rewind.c:102 +#: pg_rewind.c:110 #, c-format msgid " --debug write a lot of debug messages\n" msgstr " --debug виводити багато налагоджувальних повідомлень\n" -#: pg_rewind.c:103 +#: pg_rewind.c:111 #, c-format msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" msgstr " --no-ensure-shutdown не виправлÑти автоматично неочищене Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸\n" -#: pg_rewind.c:104 +#: pg_rewind.c:112 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD вÑтановити метод Ñинхронізації файлів на диÑк\n" + +#: pg_rewind.c:113 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" -#: pg_rewind.c:105 +#: pg_rewind.c:114 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати довідку, потім вийти\n" -#: pg_rewind.c:106 +#: pg_rewind.c:115 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "ПовідомлÑти про помилки на <%s>.\n" -#: pg_rewind.c:107 +#: pg_rewind.c:116 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" -#: pg_rewind.c:215 pg_rewind.c:223 pg_rewind.c:230 pg_rewind.c:237 -#: pg_rewind.c:244 pg_rewind.c:252 +#: pg_rewind.c:232 pg_rewind.c:240 pg_rewind.c:247 pg_rewind.c:254 +#: pg_rewind.c:261 pg_rewind.c:269 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." -#: pg_rewind.c:222 +#: pg_rewind.c:239 #, c-format msgid "no source specified (--source-pgdata or --source-server)" msgstr "джерело не вказано (--source-pgdata чи --source-server)" -#: pg_rewind.c:229 +#: pg_rewind.c:246 #, c-format msgid "only one of --source-pgdata or --source-server can be specified" msgstr "може бути вказано лише --source-pgdata чи --source-server" -#: pg_rewind.c:236 +#: pg_rewind.c:253 #, c-format msgid "no target data directory specified (--target-pgdata)" msgstr "не вказано жодного каталогу цільових даних (--target-pgdata)" -#: pg_rewind.c:243 +#: pg_rewind.c:260 #, c-format msgid "no source server information (--source-server) specified for --write-recovery-conf" msgstr "немає інформації про вихідний Ñервер (--source-server) вказаної Ð´Ð»Ñ --write-recovery-conf" -#: pg_rewind.c:250 +#: pg_rewind.c:267 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")" -#: pg_rewind.c:265 +#: pg_rewind.c:282 #, c-format msgid "cannot be executed by \"root\"" msgstr "\"root\" не може це виконувати" -#: pg_rewind.c:266 +#: pg_rewind.c:283 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "ЗапуÑкати %s треба від ÑуперкориÑтувача PostgreSQL." -#: pg_rewind.c:276 +#: pg_rewind.c:293 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ дозволи на каталог \"%s\": %m" -#: pg_rewind.c:294 +#: pg_rewind.c:311 #, c-format msgid "%s" msgstr "%s" -#: pg_rewind.c:297 +#: pg_rewind.c:314 #, c-format msgid "connected to server" msgstr "під'єднано до Ñерверу" -#: pg_rewind.c:344 +#: pg_rewind.c:375 #, c-format msgid "source and target cluster are on the same timeline" msgstr "початковий Ñ– цільовий клаÑтери знаходÑтьÑÑ Ð½Ð° одній лінії чаÑу" -#: pg_rewind.c:353 +#: pg_rewind.c:396 #, c-format msgid "servers diverged at WAL location %X/%X on timeline %u" msgstr "Ñервери розійшлиÑÑŒ в позиції WAL %X/%X на лінії чаÑу %u" -#: pg_rewind.c:401 +#: pg_rewind.c:451 #, c-format msgid "no rewind required" msgstr "Ð¿ÐµÑ€ÐµÐ¼Ð¾Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ потрібне" -#: pg_rewind.c:410 +#: pg_rewind.c:460 #, c-format msgid "rewinding from last common checkpoint at %X/%X on timeline %u" msgstr "Ð¿ÐµÑ€ÐµÐ¼Ð¾Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´ оÑтанньої Ñпільної контрольної точки на %X/%X на лінії чаÑу %u" -#: pg_rewind.c:420 +#: pg_rewind.c:470 #, c-format msgid "reading source file list" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÑпиÑку файлів із джерела" -#: pg_rewind.c:424 +#: pg_rewind.c:474 #, c-format msgid "reading target file list" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ ÑпиÑку цільових файлів" -#: pg_rewind.c:433 +#: pg_rewind.c:483 #, c-format msgid "reading WAL in target" msgstr "Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ WAL у цілі" -#: pg_rewind.c:454 +#: pg_rewind.c:504 #, c-format msgid "need to copy %lu MB (total source directory size is %lu MB)" msgstr "треба Ñкопіювати %lu МБ (загальний розмір каталогу джерела Ñтановить %lu МБ)" -#: pg_rewind.c:472 +#: pg_rewind.c:522 #, c-format msgid "syncing target data directory" msgstr "ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ каталогу даних" -#: pg_rewind.c:488 +#: pg_rewind.c:538 #, c-format msgid "Done!" msgstr "Готово!" -#: pg_rewind.c:568 +#: pg_rewind.c:618 #, c-format msgid "no action decided for file \"%s\"" msgstr "жодних дій щодо файлу \"%s\" не прийнÑто" -#: pg_rewind.c:600 +#: pg_rewind.c:650 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "вихідну ÑиÑтему було змінено під Ñ‡Ð°Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ pg_rewind" -#: pg_rewind.c:604 +#: pg_rewind.c:654 #, c-format msgid "creating backup label and updating control file" msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¼Ñ–Ñ‚ÐºÐ¸ резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ– Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð³Ð¾ файлу" -#: pg_rewind.c:654 +#: pg_rewind.c:704 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "вихідна ÑиÑтема була в неочікуваному Ñтані наприкінці перемотуваннÑ" -#: pg_rewind.c:685 +#: pg_rewind.c:736 #, c-format msgid "source and target clusters are from different systems" msgstr "початковий Ñ– цільовий клаÑтер належать до різних ÑиÑтем" -#: pg_rewind.c:693 +#: pg_rewind.c:744 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "клаÑтери не ÑуміÑні з даною верÑією pg_rewind" -#: pg_rewind.c:703 +#: pg_rewind.c:754 #, c-format msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" msgstr "цільовий Ñервер потребує викориÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ñ— Ñуми даних або \"wal_log_hints = on\"" -#: pg_rewind.c:714 +#: pg_rewind.c:765 #, c-format msgid "target server must be shut down cleanly" msgstr "цільовий Ñервер повинен бути вимкненим штатно" -#: pg_rewind.c:724 +#: pg_rewind.c:775 #, c-format msgid "source data directory must be shut down cleanly" msgstr "робота з початковим каталогом даних повинна бути завершена штатно" -#: pg_rewind.c:771 +#: pg_rewind.c:822 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "Ñкопійовано %*s/%s кБ (%d%%)" -#: pg_rewind.c:834 -#, c-format -msgid "invalid control file" -msgstr "неприпуÑтимий контрольний файл" - -#: pg_rewind.c:918 +#: pg_rewind.c:948 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ñпільного предка ліній чаÑу початкового та цільового клаÑтерів" -#: pg_rewind.c:959 +#: pg_rewind.c:989 #, c-format msgid "backup label buffer too small" msgstr "буфер Ð´Ð»Ñ Ð¼Ñ–Ñ‚ÐºÐ¸ резервного ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ð°Ð»Ð¸Ð¹" -#: pg_rewind.c:982 +#: pg_rewind.c:1012 #, c-format msgid "unexpected control file CRC" msgstr "неочікуваний контрольний файл CRC" -#: pg_rewind.c:994 +#: pg_rewind.c:1024 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "неочікуваний розмір контрольного файлу %d, очікувалоÑÑ %d" -#: pg_rewind.c:1003 +#: pg_rewind.c:1034 +#, c-format +msgid "invalid WAL segment size in control file (%d byte)" +msgid_plural "invalid WAL segment size in control file (%d bytes)" +msgstr[0] "невірний розмір Ñегменту WAL у файлі ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ (%d байт)" +msgstr[1] "невірний розмір Ñегмента WAL у файлі ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ (%d байтів)" +msgstr[2] "невірний розмір Ñегмента WAL у файлі ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ (%d байтів)" +msgstr[3] "невірний розмір Ñегмента WAL у файлі ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ (%d байтів)" + +#: pg_rewind.c:1038 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" -msgstr[0] "Розмір Ñегменту WAL повинен задаватиÑÑŒ Ñтупенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d" -msgstr[1] "Розмір Ñегменту WAL повинен задаватиÑÑŒ Ñтупенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d" -msgstr[2] "Розмір Ñегменту WAL повинен задаватиÑÑŒ Ñтупенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d" -msgstr[3] "Розмір Ñегменту WAL повинен задаватиÑÑŒ Ñтупенем 2 в інтервалі від 1 МБ до 1 ГБ, але в керуючому файлі вказано Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %d" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "Розмір Ñегмента WAL повинен бути Ñтепенем двійки від 1 МБ до 1 ГБ." -#: pg_rewind.c:1042 pg_rewind.c:1112 +#: pg_rewind.c:1075 pg_rewind.c:1143 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "програма \"%s\" потрібна Ð´Ð»Ñ %s, але не знайдена в тому ж каталозі, що й \"%s\"" -#: pg_rewind.c:1045 pg_rewind.c:1115 +#: pg_rewind.c:1078 pg_rewind.c:1146 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "програма \"%s\" знайдена Ð´Ð»Ñ \"%s\", але має відмінну верÑÑ–ÑŽ від %s" -#: pg_rewind.c:1078 +#: pg_rewind.c:1107 #, c-format -msgid "restore_command is not set in the target cluster" -msgstr "команда restore_command не вÑтановлена в цільовому клаÑтері" +msgid "could not read restore_command from target cluster" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ \"restore_command\" з цільового клаÑтеру" -#: pg_rewind.c:1119 +#: pg_rewind.c:1112 +#, c-format +msgid "\"restore_command\" is not set in the target cluster" +msgstr "команда \"restore_command\" не вÑтановлена в цільовому клаÑтері" + +#: pg_rewind.c:1150 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ \"%s\" Ð´Ð»Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ Ñерверу, щоб завершити Ð²Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾Ð³Ð¾ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸" -#: pg_rewind.c:1156 +#: pg_rewind.c:1188 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "не вдалоÑÑ Ð²Ð²Ñ–Ð¼ÐºÐ½ÑƒÑ‚Ð¸ однокориÑтувацький режим postgres в цільовому клаÑтері" -#: pg_rewind.c:1157 +#: pg_rewind.c:1189 #, c-format msgid "Command was: %s" msgstr "Команда була: %s" -#: timeline.c:75 timeline.c:81 +#: timeline.c:74 timeline.c:80 #, c-format msgid "syntax error in history file: %s" msgstr "ÑинтакÑична помилка у файлі Ñ–Ñторії: %s" -#: timeline.c:76 +#: timeline.c:75 #, c-format msgid "Expected a numeric timeline ID." msgstr "ОчікуєтьÑÑ Ñ‡Ð¸Ñловий ідентифікатор лінії чаÑу." -#: timeline.c:82 +#: timeline.c:81 #, c-format msgid "Expected a write-ahead log switchpoint location." msgstr "ОчікуєтьÑÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ випереджувального журналюваннÑ." -#: timeline.c:87 +#: timeline.c:86 #, c-format msgid "invalid data in history file: %s" msgstr "неприпуÑтимі дані у файлу Ñ–Ñторії: %s" -#: timeline.c:88 +#: timeline.c:87 #, c-format msgid "Timeline IDs must be in increasing sequence." msgstr "Ідентифікатори ліній чаÑу повинні збільшуватиÑÑŒ." -#: timeline.c:108 +#: timeline.c:107 #, c-format msgid "invalid data in history file" msgstr "неприпуÑтимі дані у файлі Ñ–Ñторії" -#: timeline.c:109 +#: timeline.c:108 #, c-format msgid "Timeline IDs must be less than child timeline's ID." msgstr "Ідентифікатори ліній чаÑу повинні бути меншими від ідентифікатора дочірньої лінії." -#: xlogreader.c:621 +#: xlogreader.c:619 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "невірний зÑув запиÑу: %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "неприпуÑтиме Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу в %X/%X: очікувалоÑÑŒ хоча б %u, отримано %u" -#: xlogreader.c:629 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "по зÑуву %X/%X запитано Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу" -#: xlogreader.c:670 xlogreader.c:1102 -#, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "невірна довжина запиÑу по зÑуву %X/%X: очікувалоÑÑŒ %u, отримано %u" - -#: xlogreader.c:699 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "не виÑтачило пам'Ñті під Ñ‡Ð°Ñ Ñпроби Ð·Ð°ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу довжиною %u" - -#: xlogreader.c:721 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "довжина запиÑу %u на %X/%X Ñ” задовгою" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "неприпуÑтима довжина запиÑу %X/%X: очікувалаÑÑŒ мінімум %u, отримано %u" -#: xlogreader.c:770 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "немає Ð¿Ñ€Ð°Ð¿Ð¾Ñ€Ñ†Ñ contrecord в позиції %X/%X" -#: xlogreader.c:783 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "неприпуÑтима довжина contrecord %u (очікувалоÑÑŒ %lld) на %X/%X" -#: xlogreader.c:1110 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "невірний ID менеджера реÑурÑів %u в %X/%X" -#: xlogreader.c:1123 xlogreader.c:1139 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð· неправильним попереднім поÑиланнÑм %X/%X на %X/%X" -#: xlogreader.c:1175 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "некоректна контрольна Ñума даних менеджера реÑурÑів у запиÑу по зÑуву %X/%X" -#: xlogreader.c:1212 +#: xlogreader.c:1243 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "невірне магічне чиÑло %04X в Ñегменті журналу %s, зÑув %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "невірне магічне чиÑло %04X в Ñегменті WAL %s, LSN %X/%X, зÑув %u" -#: xlogreader.c:1226 xlogreader.c:1267 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "невірні інформаційні біти %04X в Ñегменті журналу %s, зÑув %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "невірні інформаційні біти %04X в Ñегменті WAL %s, LSN %X/%X, зÑув %u" -#: xlogreader.c:1241 +#: xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL файл належить іншій ÑиÑтемі баз даних: ідентифікатор ÑиÑтеми баз даних де міÑтитьÑÑ WAL файл - %llu, а ідентифікатор ÑиÑтеми баз даних pg_control - %llu" -#: xlogreader.c:1249 +#: xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "Файл WAL належить іншій ÑиÑтемі баз даних: некоректний розмір Ñегменту в заголовку Ñторінки" -#: xlogreader.c:1255 +#: xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "Файл WAL належить іншій ÑиÑтемі баз даних: некоректний XLOG_BLCKSZ в заголовку Ñторінки" -#: xlogreader.c:1286 +#: xlogreader.c:1320 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "неочікуваний pageaddr %X/%X в Ñегменті журналу %s, зÑув %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "неочікуваний pageaddr %X/%X у Ñегменті WAL %s, LSN %X/%X, Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ %u" -#: xlogreader.c:1311 +#: xlogreader.c:1346 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð¿Ð¾ÑлідовноÑті ID лінії чаÑу %u (піÑÐ»Ñ %u) в Ñегменті журналу %s, зÑув %u" +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð¿Ð¾ÑлідовноÑті ID лінії чаÑу %u (піÑÐ»Ñ %u) у Ñегменті WAL %s, LSN %X/%X, зÑув %u" -#: xlogreader.c:1706 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "ідентифікатор блока %u out-of-order в позиції %X/%X" -#: xlogreader.c:1730 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA вÑтановлений, але немає даних в позиції %X/%X" -#: xlogreader.c:1737 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA вÑтановлений, але довжина даних дорівнює %u в позиції %X/%X" -#: xlogreader.c:1773 +#: xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE вÑтановлений, але Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку задані: зÑув %u, довжина %u, при довжині образу блока %u в позиції %X/%X" -#: xlogreader.c:1789 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE не вÑтановлений, але Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку задані: зÑув %u, довжина %u в позиції %X/%X" -#: xlogreader.c:1803 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED вÑтановлений, але довжина образу блока дорівнює %u в позиції %X/%X" -#: xlogreader.c:1818 +#: xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "ні BKPIMAGE_HAS_HOLE, ні BKPIMAGE_COMPRESSED не вÑтановлені, але довжина образу блока дорівнює %u в позиції %X/%X" -#: xlogreader.c:1834 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL вÑтановлений, але попереднє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ задано в позиції %X/%X" -#: xlogreader.c:1846 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "невірний ідентифікатор блоку %u в позиції %X/%X" -#: xlogreader.c:1913 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð· невірною довжиною на %X/%X" -#: xlogreader.c:1938 +#: xlogreader.c:1982 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ блок резервної копії з ID %d у запиÑÑ– WAL" + +#: xlogreader.c:2066 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X з недійÑним вказаним блоком %d" + +#: xlogreader.c:2073 #, c-format -msgid "failed to locate backup block with ID %d in WAL record" -msgstr "не вдалоÑÑзнайти блок резервної копії з ID %d у запиÑÑ– WAL" +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X з недійÑним Ñтаном, блок %d" -#: xlogreader.c:2044 xlogreader.c:2061 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format -msgid "image at %X/%X compressed with %s not supported by build, block %d" -msgstr "образ в позиції %X/%X, Ñкий ÑтиÑнено за допомогою %s не підтримуєтьÑÑ Ð·Ð±Ñ–Ñ€ÐºÐ¾ÑŽ, блок %d" +msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð² %X/%X, ÑтиÑнуте %s, не підтримуєтьÑÑ Ð·Ð±Ñ–Ñ€ÐºÐ¾ÑŽ, блок %d" -#: xlogreader.c:2070 +#: xlogreader.c:2126 #, c-format -msgid "image at %X/%X compressed with unknown method, block %d" -msgstr "образ в позиції %X/%X ÑтиÑнено невідомим методом, блок %d" +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X ÑтиÑнуте з невідомим методом, блок %d" -#: xlogreader.c:2078 +#: xlogreader.c:2134 #, c-format -msgid "invalid compressed image at %X/%X, block %d" -msgstr "невірно ÑтиÑнутий образ в позиції %X/%X, блок %d" +msgid "could not decompress image at %X/%X, block %d" +msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° %X/%X, блок %d" diff --git a/src/bin/pg_rewind/po/zh_TW.po b/src/bin/pg_rewind/po/zh_TW.po new file mode 100644 index 0000000000000..d4593b94d5022 --- /dev/null +++ b/src/bin/pg_rewind/po/zh_TW.po @@ -0,0 +1,1093 @@ +# Traditional Chinese message translation file for pg_rewind +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_rewind (PostgreSQL) package. +# Zhenbang Wei , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_rewind (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-11 20:51+0000\n" +"PO-Revision-Date: 2023-11-06 08:49+0800\n" +"Last-Translator: Zhenbang Wei \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.4.1\n" + +# libpq/be-secure.c:294 libpq/be-secure.c:387 +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "錯誤: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "警告: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "詳細內容: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "æç¤º: " + +# commands/sequence.c:798 executor/execGrouping.c:328 +# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43 +# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006 +# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527 +# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623 +# postmaster/postmaster.c:755 postmaster/postmaster.c:1625 +# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139 +# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766 +# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138 +# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297 +# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73 +# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191 +# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164 +# utils/cache/relcache.c:178 utils/cache/relcache.c:1130 +# utils/cache/typcache.c:165 utils/cache/typcache.c:487 +# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532 +# utils/init/miscinit.c:213 utils/init/miscinit.c:234 +# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911 +# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503 +# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "記憶體用盡\n" + +# common.c:78 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "無法複製 null 指標(內部錯誤)\n" + +# utils/misc/guc.c:3792 +#: ../../common/percentrepl.c:79 ../../common/percentrepl.c:118 +#, c-format +msgid "invalid value for parameter \"%s\": \"%s\"" +msgstr "çµ¦åƒæ•¸\"%s\"的值ä¸åˆæ³•: \"%s\"" + +#: ../../common/percentrepl.c:80 +#, c-format +msgid "String ends unexpectedly after escape character \"%%\"." +msgstr "字串在轉義字元 \"%%\" 後æ„å¤–çµæŸã€‚" + +#: ../../common/percentrepl.c:119 +#, c-format +msgid "String contains unexpected placeholder \"%%%c\"." +msgstr "字串包å«éžé æœŸçš„ä½”ä½ç¬¦ \"%%%c\"。" + +# port/win32/security.c:39 +#: ../../common/restricted_token.c:60 +#, c-format +msgid "could not open process token: error code %lu" +msgstr "無法開啟行程 token: 錯誤碼 %lu" + +# port/pg_sema.c:117 port/sysv_sema.c:117 +#: ../../common/restricted_token.c:74 +#, c-format +msgid "could not allocate SIDs: error code %lu" +msgstr "無法é…ç½® SID: 錯誤碼 %lu" + +# port/win32/signal.c:239 +#: ../../common/restricted_token.c:94 +#, c-format +msgid "could not create restricted token: error code %lu" +msgstr "無法建立å—é™ token: 錯誤碼 %lu" + +#: ../../common/restricted_token.c:115 +#, c-format +msgid "could not start process for command \"%s\": error code %lu" +msgstr "無法為指令 \"%s\" 啟動行程: 錯誤碼 %lu" + +# port/win32/signal.c:239 +#: ../../common/restricted_token.c:153 +#, c-format +msgid "could not re-execute with restricted token: error code %lu" +msgstr "無法使用å—é™ token 釿–°åŸ·è¡Œ: 錯誤碼 %lu" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "無法從å­è¡Œç¨‹å–å¾—çµæŸç¢¼: 錯誤碼 %lu" + +#: ../../fe_utils/archive.c:69 +#, c-format +msgid "unexpected file size for \"%s\": %lld instead of %lld" +msgstr "\"%s\" 的檔案大å°èˆ‡é æœŸä¸åŒ: %lld è€Œä¸æ˜¯ %lld" + +#: ../../fe_utils/archive.c:77 +#, c-format +msgid "could not open file \"%s\" restored from archive: %m" +msgstr "無法開啟從å°å­˜æª”還原的檔案 \"%s\": %m" + +# access/transam/xlog.c:1936 access/transam/xlog.c:2038 +# access/transam/xlog.c:5291 +#: ../../fe_utils/archive.c:86 file_ops.c:417 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "無法å–得檔案 \"%s\" 的狀態: %m" + +#: ../../fe_utils/archive.c:98 +#, c-format +msgid "restore_command failed: %s" +msgstr "restore_command 失敗: %s" + +#: ../../fe_utils/archive.c:105 +#, c-format +msgid "could not restore file \"%s\" from archive" +msgstr "無法從å°å­˜æª”還原檔案 \"%s\"" + +# commands/sequence.c:798 executor/execGrouping.c:328 +# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43 +# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006 +# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527 +# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623 +# postmaster/postmaster.c:755 postmaster/postmaster.c:1625 +# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139 +# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766 +# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138 +# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297 +# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73 +# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191 +# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164 +# utils/cache/relcache.c:178 utils/cache/relcache.c:1130 +# utils/cache/typcache.c:165 utils/cache/typcache.c:487 +# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532 +# utils/init/miscinit.c:213 utils/init/miscinit.c:234 +# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911 +# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503 +# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75 +#: ../../fe_utils/recovery_gen.c:34 ../../fe_utils/recovery_gen.c:45 +#: ../../fe_utils/recovery_gen.c:70 ../../fe_utils/recovery_gen.c:90 +#: ../../fe_utils/recovery_gen.c:149 +#, c-format +msgid "out of memory" +msgstr "記憶體ä¸è¶³" + +# access/transam/slru.c:638 access/transam/xlog.c:1631 +# access/transam/xlog.c:2742 access/transam/xlog.c:2832 +# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935 +# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889 +# utils/misc/database.c:68 +#: ../../fe_utils/recovery_gen.c:121 parsexlog.c:312 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "無法開啟檔案 \"%s\": %m" + +# access/transam/xlog.c:1555 access/transam/xlog.c:1679 +# access/transam/xlog.c:2964 access/transam/xlog.c:3002 commands/copy.c:1117 +# commands/tablespace.c:668 commands/tablespace.c:674 +# postmaster/postmaster.c:3430 utils/init/miscinit.c:832 +# utils/init/miscinit.c:841 utils/misc/guc.c:4934 utils/misc/guc.c:4998 +#: ../../fe_utils/recovery_gen.c:124 +#, c-format +msgid "could not write to file \"%s\": %m" +msgstr "無法寫入檔案 \"%s\": %m" + +# access/transam/slru.c:645 access/transam/xlog.c:1526 +# access/transam/xlog.c:1646 access/transam/xlog.c:2911 +# access/transam/xlog.c:5308 access/transam/xlog.c:5426 +# postmaster/postmaster.c:3366 +#: ../../fe_utils/recovery_gen.c:133 +#, c-format +msgid "could not create file \"%s\": %m" +msgstr "無法建立檔案 \"%s\": %m" + +#: file_ops.c:67 +#, c-format +msgid "could not open target file \"%s\": %m" +msgstr "無法開啟目標檔 \"%s\": %m" + +#: file_ops.c:81 +#, c-format +msgid "could not close target file \"%s\": %m" +msgstr "無法關閉目標檔 \"%s\": %m" + +#: file_ops.c:101 +#, c-format +msgid "could not seek in target file \"%s\": %m" +msgstr "無法在目標檔 \"%s\" 中 seek: %m" + +# access/transam/xlog.c:5319 access/transam/xlog.c:5439 +#: file_ops.c:117 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "無法寫入檔案 \"%s\": %m" + +#: file_ops.c:150 file_ops.c:177 +#, c-format +msgid "undefined file type for \"%s\"" +msgstr "\"%s\" 的檔案類型未定義" + +#: file_ops.c:173 +#, c-format +msgid "invalid action (CREATE) for regular file" +msgstr "å°æ–¼ä¸€èˆ¬æª”案無效的動作(CREATE)" + +# access/transam/xlog.c:1944 access/transam/xlog.c:5453 +# access/transam/xlog.c:5607 postmaster/postmaster.c:3504 +#: file_ops.c:200 +#, c-format +msgid "could not remove file \"%s\": %m" +msgstr "無法刪除檔案 \"%s\": %m" + +#: file_ops.c:218 +#, c-format +msgid "could not open file \"%s\" for truncation: %m" +msgstr "無法開啟檔案 \"%s\" 進行縮短: %m" + +#: file_ops.c:222 +#, c-format +msgid "could not truncate file \"%s\" to %u: %m" +msgstr "無法將檔案 \"%s\" 縮短到 %u: %m" + +# commands/tablespace.c:154 commands/tablespace.c:162 +# commands/tablespace.c:168 +#: file_ops.c:238 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "無法建立目錄 \"%s\": %m" + +# commands/tablespace.c:610 +#: file_ops.c:252 +#, c-format +msgid "could not remove directory \"%s\": %m" +msgstr "無法刪除目錄 \"%s\": %m" + +#: file_ops.c:266 +#, c-format +msgid "could not create symbolic link at \"%s\": %m" +msgstr "無法在 \"%s\" 建立符號連çµ: %m" + +# commands/tablespace.c:355 commands/tablespace.c:984 +#: file_ops.c:280 +#, c-format +msgid "could not remove symbolic link \"%s\": %m" +msgstr "無法刪除symbolic link \"%s\": %m" + +# commands/copy.c:1031 +#: file_ops.c:326 file_ops.c:330 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "無法開啟檔案 \"%s\" 進行讀å–: %m" + +# access/transam/xlog.c:1659 access/transam/xlog.c:2942 +# access/transam/xlog.c:5397 access/transam/xlog.c:5448 +# access/transam/xlog.c:5520 access/transam/xlog.c:5545 +# access/transam/xlog.c:5583 +#: file_ops.c:341 local_source.c:104 local_source.c:163 parsexlog.c:350 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ç„¡æ³•è®€å–æª”案 \"%s\": %m" + +#: file_ops.c:344 parsexlog.c:352 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "ç„¡æ³•è®€å–æª”案 \"%s\": å·²è®€å– %d / %zu" + +# access/transam/slru.c:930 commands/tablespace.c:529 +# commands/tablespace.c:694 utils/adt/misc.c:174 +#: file_ops.c:388 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "無法開啟目錄 \"%s\": %m" + +# commands/tablespace.c:355 commands/tablespace.c:984 +#: file_ops.c:441 +#, c-format +msgid "could not read symbolic link \"%s\": %m" +msgstr "無法讀å–ç¬¦è™Ÿé€£çµ \"%s\": %m" + +#: file_ops.c:444 +#, c-format +msgid "symbolic link \"%s\" target is too long" +msgstr "ç¬¦è™Ÿé€£çµ \"%s\" 的目標太長" + +# access/transam/slru.c:967 commands/tablespace.c:577 +# commands/tablespace.c:721 +#: file_ops.c:462 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "無法讀å–目錄\"%s\": %m" + +# access/transam/slru.c:930 commands/tablespace.c:529 +# commands/tablespace.c:694 utils/adt/misc.c:174 +#: file_ops.c:466 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "無法關閉目錄 \"%s\": %m" + +#: filemap.c:236 +#, c-format +msgid "data file \"%s\" in source is not a regular file" +msgstr "來æºçš„資料檔 \"%s\" 䏿˜¯ä¸€èˆ¬æª”案" + +#: filemap.c:241 filemap.c:274 +#, c-format +msgid "duplicate source file \"%s\"" +msgstr "é‡è¤‡çš„ä¾†æºæª” \"%s\"" + +#: filemap.c:329 +#, c-format +msgid "unexpected page modification for non-regular file \"%s\"" +msgstr "éžä¸€èˆ¬æª”案 \"%s\" 的資料é å‡ºç¾éžé æœŸçš„修改" + +#: filemap.c:679 filemap.c:773 +#, c-format +msgid "unknown file type for \"%s\"" +msgstr "\"%s\" 的檔案類型未知" + +#: filemap.c:706 +#, c-format +msgid "file \"%s\" is of different type in source and target" +msgstr "檔案 \"%s\" 在來æºå’Œç›®æ¨™ä¸­çš„類型ä¸åŒ" + +#: filemap.c:778 +#, c-format +msgid "could not decide what to do with file \"%s\"" +msgstr "ç„¡æ³•æ±ºå®šå¦‚ä½•è™•ç†æª”案 \"%s\"" + +#: libpq_source.c:130 +#, c-format +msgid "could not clear search_path: %s" +msgstr "無法清除 search_path: %s" + +#: libpq_source.c:141 +#, c-format +msgid "full_page_writes must be enabled in the source server" +msgstr "來æºä¼ºæœå™¨å¿…須啟動 full_page_writes" + +#: libpq_source.c:152 +#, c-format +msgid "could not prepare statement to fetch file contents: %s" +msgstr "ç„¡æ³•æº–å‚™ç”¨ä¾†æ“·å–æª”案內容的陳述å¼: %s" + +#: libpq_source.c:171 +#, c-format +msgid "error running query (%s) on source server: %s" +msgstr "來æºä¼ºæœå™¨åŸ·è¡ŒæŸ¥è©¢(%s)時發生錯誤: %s" + +#: libpq_source.c:176 +#, c-format +msgid "unexpected result set from query" +msgstr "查詢出ç¾éžé æœŸçš„çµæžœé›†" + +#: libpq_source.c:198 +#, c-format +msgid "error running query (%s) in source server: %s" +msgstr "來æºä¼ºæœå™¨åŸ·è¡ŒæŸ¥è©¢(%s)時發生錯誤: %s" + +#: libpq_source.c:219 +#, c-format +msgid "unrecognized result \"%s\" for current WAL insert location" +msgstr "ç„¡æ³•è­˜åˆ¥ç›®å‰ WAL æ’å…¥ä½ç½®çš„çµæžœ \"%s\"" + +#: libpq_source.c:270 +#, c-format +msgid "could not fetch file list: %s" +msgstr "ç„¡æ³•æ“·å–æª”案清單: %s" + +#: libpq_source.c:275 +#, c-format +msgid "unexpected result set while fetching file list" +msgstr "æ“·å–æª”案清單時出ç¾éžé æœŸçš„çµæžœé›†" + +#: libpq_source.c:467 +#, c-format +msgid "could not send query: %s" +msgstr "ç„¡æ³•å‚³é€æŸ¥è©¢: %s" + +#: libpq_source.c:470 +#, c-format +msgid "could not set libpq connection to single row mode" +msgstr "無法將 libpq 連線設為單列模å¼" + +#: libpq_source.c:500 +#, c-format +msgid "unexpected result while fetching remote files: %s" +msgstr "æ“·å–é ç«¯æª”案時出ç¾éžé æœŸçš„çµæžœ: %s" + +#: libpq_source.c:505 +#, c-format +msgid "received more data chunks than requested" +msgstr "收到比請求更多的資料塊" + +#: libpq_source.c:509 +#, c-format +msgid "unexpected result set size while fetching remote files" +msgstr "æ“·å–é ç«¯æª”案時出ç¾éžé æœŸçš„çµæžœé›†å¤§å°" + +#: libpq_source.c:515 +#, c-format +msgid "unexpected data types in result set while fetching remote files: %u %u %u" +msgstr "æ“·å–é ç«¯æª”æ¡ˆæ™‚çµæžœé›†å‡ºç¾éžé æœŸçš„資料型別: %u %u %u" + +#: libpq_source.c:523 +#, c-format +msgid "unexpected result format while fetching remote files" +msgstr "æ“·å–é ç«¯æª”案時出ç¾éžé æœŸçš„çµæžœæ ¼å¼" + +#: libpq_source.c:529 +#, c-format +msgid "unexpected null values in result while fetching remote files" +msgstr "æ“·å–é ç«¯æª”æ¡ˆæ™‚çµæžœä¸­å‡ºç¾éžé æœŸçš„ null 值" + +#: libpq_source.c:533 +#, c-format +msgid "unexpected result length while fetching remote files" +msgstr "æ“·å–é ç«¯æª”案時出ç¾éžé æœŸçš„çµæžœé•·åº¦" + +#: libpq_source.c:566 +#, c-format +msgid "received data for file \"%s\", when requested for \"%s\"" +msgstr "收到檔案 \"%s\" 的資料,但請求的是 \"%s\" 的資料" + +#: libpq_source.c:570 +#, c-format +msgid "received data at offset %lld of file \"%s\", when requested for offset %lld" +msgstr "收到檔案 \"%2$s\" ä½ç§» %1$lld 處的資料,但請求的是ä½ç§» %3$lld 的資料" + +#: libpq_source.c:582 +#, c-format +msgid "received more than requested for file \"%s\"" +msgstr "收到的資料超éŽå°æª”案 \"%s\" 的請求" + +#: libpq_source.c:595 +#, c-format +msgid "unexpected number of data chunks received" +msgstr "收到éžé æœŸæ•¸é‡çš„資料塊" + +#: libpq_source.c:638 +#, c-format +msgid "could not fetch remote file \"%s\": %s" +msgstr "無法擷å–é ç«¯æª”案 \"%s\": %s" + +#: libpq_source.c:643 +#, c-format +msgid "unexpected result set while fetching remote file \"%s\"" +msgstr "æ“·å–é ç«¯æª”案 \"%s\" 時出ç¾éžé æœŸçš„çµæžœé›†" + +#: local_source.c:90 local_source.c:142 +#, c-format +msgid "could not open source file \"%s\": %m" +msgstr "ç„¡æ³•é–‹å•Ÿä¾†æºæª” \"%s\": %m" + +#: local_source.c:117 +#, c-format +msgid "size of source file \"%s\" changed concurrently: %d bytes expected, %d copied" +msgstr "ä¾†æºæª” \"%s\" 的大å°åŒæ™‚發生變化: é æœŸ %d ä½å…ƒçµ„,已複製 %d ä½å…ƒçµ„" + +# access/transam/slru.c:680 access/transam/xlog.c:1567 +# access/transam/xlog.c:1691 access/transam/xlog.c:3013 +#: local_source.c:121 local_source.c:172 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "無法關閉檔案 \"%s\": %m" + +#: local_source.c:146 +#, c-format +msgid "could not seek in source file: %m" +msgstr "ç„¡æ³•åœ¨ä¾†æºæª”中 seek: %m" + +#: local_source.c:165 +#, c-format +msgid "unexpected EOF while reading file \"%s\"" +msgstr "è®€å–æª”案 \"%s\" æ™‚ç™¼ç”Ÿé æœŸå¤–çš„ EOF" + +#: parsexlog.c:80 parsexlog.c:139 parsexlog.c:199 +#, c-format +msgid "out of memory while allocating a WAL reading processor" +msgstr "é…ç½® WAL 讀å–處ç†å™¨æ™‚耗盡記憶體" + +#: parsexlog.c:92 parsexlog.c:146 +#, c-format +msgid "could not read WAL record at %X/%X: %s" +msgstr "無法讀å–å…ˆå‰çš„ WAL 紀錄,ä½ç½® %X/%X: %s" + +#: parsexlog.c:96 parsexlog.c:149 +#, c-format +msgid "could not read WAL record at %X/%X" +msgstr "無法讀å–å…ˆå‰çš„ WAL 紀錄,ä½ç½® %X/%X" + +#: parsexlog.c:108 +#, c-format +msgid "end pointer %X/%X is not a valid end point; expected %X/%X" +msgstr "çµæŸæŒ‡æ¨™ %X/%X 䏿˜¯æœ‰æ•ˆçš„çµæŸé»žï¼Œé æœŸæ˜¯ %X/%X" + +#: parsexlog.c:212 +#, c-format +msgid "could not find previous WAL record at %X/%X: %s" +msgstr "無法找到先å‰çš„ WAL 紀錄,ä½ç½® %X/%X: %s" + +#: parsexlog.c:216 +#, c-format +msgid "could not find previous WAL record at %X/%X" +msgstr "無法找到先å‰çš„ WAL 紀錄,ä½ç½® %X/%X" + +# access/transam/slru.c:638 access/transam/xlog.c:1631 +# access/transam/xlog.c:2742 access/transam/xlog.c:2832 +# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935 +# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889 +# utils/misc/database.c:68 +#: parsexlog.c:341 +#, c-format +msgid "could not seek in file \"%s\": %m" +msgstr "無法 seek 檔案 \"%s\": %m" + +#: parsexlog.c:440 +#, c-format +msgid "WAL record modifies a relation, but record type is not recognized: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" +msgstr "WAL 紀錄修改了關è¯ï¼Œä½†ç„¡æ³•識別記錄類型: lsn: %X/%X, rmid: %d, rmgr: %s, info: %02X" + +#: pg_rewind.c:92 +#, c-format +msgid "" +"%s resynchronizes a PostgreSQL cluster with another copy of the cluster.\n" +"\n" +msgstr "" +"%s å°‡ PostgreSQL å¢é›†èˆ‡å¦ä¸€å€‹å¢é›†é‡æ–°åŒæ­¥\n" +"\n" + +# postmaster/postmaster.c:1016 +#: pg_rewind.c:93 +#, c-format +msgid "" +"Usage:\n" +" %s [OPTION]...\n" +"\n" +msgstr "" +"用法: \n" +" %s [OPTION]...\n" +"\n" + +# postmaster/postmaster.c:1017 tcop/postgres.c:2115 +#: pg_rewind.c:94 +#, c-format +msgid "Options:\n" +msgstr "é¸é …: \n" + +#: pg_rewind.c:95 +#, c-format +msgid "" +" -c, --restore-target-wal use restore_command in target configuration to\n" +" retrieve WAL files from archives\n" +msgstr "" +" -c, --restore-target-wal 使用目標設定中的 restore_command 來擷å–\n" +" å°å­˜æª”中的 WAL 檔\n" + +#: pg_rewind.c:97 +#, c-format +msgid " -D, --target-pgdata=DIRECTORY existing data directory to modify\n" +msgstr " -D, --target-pgdata=DIRECTORY è¦ä¿®æ”¹çš„ç¾æœ‰è³‡æ–™ç›®éŒ„\n" + +#: pg_rewind.c:98 +#, c-format +msgid " --source-pgdata=DIRECTORY source data directory to synchronize with\n" +msgstr " --source-pgdata=DIRECTORY è¦åŒæ­¥çš„來æºè³‡æ–™ç›®éŒ„\n" + +#: pg_rewind.c:99 +#, c-format +msgid " --source-server=CONNSTR source server to synchronize with\n" +msgstr " --source-server=CONNSTR è¦åŒæ­¥çš„來æºä¼ºæœå™¨\n" + +#: pg_rewind.c:100 +#, c-format +msgid " -n, --dry-run stop before modifying anything\n" +msgstr " -n, --dry-run 在修改任何內容之å‰åœæ­¢\n" + +#: pg_rewind.c:101 +#, c-format +msgid "" +" -N, --no-sync do not wait for changes to be written\n" +" safely to disk\n" +msgstr " -N, --no-sync ä¸ç­‰å¾…變更安全寫入ç£ç¢Ÿ\n" + +#: pg_rewind.c:103 +#, c-format +msgid " -P, --progress write progress messages\n" +msgstr " -P, --progress 顯示進度資訊\n" + +#: pg_rewind.c:104 +#, c-format +msgid "" +" -R, --write-recovery-conf write configuration for replication\n" +" (requires --source-server)\n" +msgstr " -R, --write-recovery-conf 寫入複寫組態(éœ€è¦ --source-server)\n" + +#: pg_rewind.c:106 +#, c-format +msgid "" +" --config-file=FILENAME use specified main server configuration\n" +" file when running target cluster\n" +msgstr " --config-file=FILENAME 執行目標å¢é›†æ™‚使用指定的主伺æœå™¨çµ„æ…‹\n" + +#: pg_rewind.c:108 +#, c-format +msgid " --debug write a lot of debug messages\n" +msgstr " --debug 輸出大é‡é™¤éŒ¯è¨Šæ¯\n" + +#: pg_rewind.c:109 +#, c-format +msgid " --no-ensure-shutdown do not automatically fix unclean shutdown\n" +msgstr " --no-ensure-shutdown ä¸è‡ªå‹•ä¿®å¾©ä¸æ­£å¸¸åœæ­¢\n" + +#: pg_rewind.c:110 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version é¡¯ç¤ºç‰ˆæœ¬ï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_rewind.c:111 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help é¡¯ç¤ºèªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_rewind.c:112 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"回報錯誤至 <%s>。\n" + +#: pg_rewind.c:113 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 網站: <%s>\n" + +# tcop/postgres.c:2636 tcop/postgres.c:2652 +#: pg_rewind.c:223 pg_rewind.c:231 pg_rewind.c:238 pg_rewind.c:245 +#: pg_rewind.c:252 pg_rewind.c:260 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "用 \"%s --help\" å–得更多資訊。" + +#: pg_rewind.c:230 +#, c-format +msgid "no source specified (--source-pgdata or --source-server)" +msgstr "未指定來æº(--source-pgdata 或 --source-server)" + +#: pg_rewind.c:237 +#, c-format +msgid "only one of --source-pgdata or --source-server can be specified" +msgstr "åªèƒ½æŒ‡å®š --source-pgdata 或 --source-server 中的其中一個" + +#: pg_rewind.c:244 +#, c-format +msgid "no target data directory specified (--target-pgdata)" +msgstr "未指定目標資料目錄(--target-pgdata)" + +#: pg_rewind.c:251 +#, c-format +msgid "no source server information (--source-server) specified for --write-recovery-conf" +msgstr "未指定 --write-recovery-conf 的來æºä¼ºæœå™¨è³‡è¨Š(--source-server)" + +#: pg_rewind.c:258 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "å‘½ä»¤åˆ—åƒæ•¸éŽå¤š(第一個是 \"%s\")" + +#: pg_rewind.c:273 +#, c-format +msgid "cannot be executed by \"root\"" +msgstr "無法用 \"root\" 執行" + +#: pg_rewind.c:274 +#, c-format +msgid "You must run %s as the PostgreSQL superuser." +msgstr "您必須以 PostgreSQL 超級使用者身分執行 %s。" + +# postmaster/postmaster.c:897 +#: pg_rewind.c:284 +#, c-format +msgid "could not read permissions of directory \"%s\": %m" +msgstr "無法讀å–目錄\"%s\"的權é™: %m" + +# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770 +# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285 +#: pg_rewind.c:302 +#, c-format +msgid "%s" +msgstr "%s" + +#: pg_rewind.c:305 +#, c-format +msgid "connected to server" +msgstr "已連線至伺æœå™¨" + +#: pg_rewind.c:366 +#, c-format +msgid "source and target cluster are on the same timeline" +msgstr "來æºå’Œç›®æ¨™å¢é›†åœ¨ç›¸åŒçš„æ™‚間軸上" + +#: pg_rewind.c:387 +#, c-format +msgid "servers diverged at WAL location %X/%X on timeline %u" +msgstr "伺æœå™¨åˆ†å²ï¼ŒWAL ä½ç½® %X/%X,時間軸 %u" + +#: pg_rewind.c:442 +#, c-format +msgid "no rewind required" +msgstr "無需回溯" + +#: pg_rewind.c:451 +#, c-format +msgid "rewinding from last common checkpoint at %X/%X on timeline %u" +msgstr "å¾žæœ€å¾Œçš„å…±åŒæª¢æŸ¥é»žå›žæº¯ï¼Œä½ç½® %X/%X,時間軸 %u" + +#: pg_rewind.c:461 +#, c-format +msgid "reading source file list" +msgstr "讀å–ä¾†æºæª”案清單" + +#: pg_rewind.c:465 +#, c-format +msgid "reading target file list" +msgstr "讀å–目標檔案清單" + +#: pg_rewind.c:474 +#, c-format +msgid "reading WAL in target" +msgstr "讀å–目標的 WAL" + +#: pg_rewind.c:495 +#, c-format +msgid "need to copy %lu MB (total source directory size is %lu MB)" +msgstr "需è¦è¤‡è£½ %lu MB(來æºç›®éŒ„的總大å°ç‚º %lu MB)" + +#: pg_rewind.c:513 +#, c-format +msgid "syncing target data directory" +msgstr "åŒæ­¥ç›®æ¨™è³‡æ–™ç›®éŒ„" + +#: pg_rewind.c:529 +#, c-format +msgid "Done!" +msgstr "完æˆ!" + +#: pg_rewind.c:609 +#, c-format +msgid "no action decided for file \"%s\"" +msgstr "å°šæœªæ±ºå®šå°æª”案 \"%s\" 採å–任何動作" + +#: pg_rewind.c:641 +#, c-format +msgid "source system was modified while pg_rewind was running" +msgstr "來æºç³»çµ±åœ¨ pg_rewind 執行期間被修改" + +#: pg_rewind.c:645 +#, c-format +msgid "creating backup label and updating control file" +msgstr "建立備份標籤並更新控制檔" + +#: pg_rewind.c:695 +#, c-format +msgid "source system was in unexpected state at end of rewind" +msgstr "來æºç³»çµ±åœ¨å›žæº¯çµæŸæ™‚處於éžé æœŸçš„狀態" + +#: pg_rewind.c:727 +#, c-format +msgid "source and target clusters are from different systems" +msgstr "來æºå’Œç›®æ¨™å¢é›†ä¾†è‡ªä¸åŒçš„系統" + +#: pg_rewind.c:735 +#, c-format +msgid "clusters are not compatible with this version of pg_rewind" +msgstr "å¢é›†èˆ‡æ­¤ç‰ˆæœ¬çš„ pg_rewind ä¸ç›¸å®¹" + +#: pg_rewind.c:745 +#, c-format +msgid "target server needs to use either data checksums or \"wal_log_hints = on\"" +msgstr "目標伺æœå™¨éœ€è¦ä½¿ç”¨è³‡æ–™æª¢æŸ¥ç¢¼æˆ– \"wal_log_hints = on\"" + +#: pg_rewind.c:756 +#, c-format +msgid "target server must be shut down cleanly" +msgstr "目標伺æœå™¨å¿…須被乾淨地關閉" + +#: pg_rewind.c:766 +#, c-format +msgid "source data directory must be shut down cleanly" +msgstr "來æºè³‡æ–™ç›®éŒ„必須被乾淨地關閉" + +#: pg_rewind.c:813 +#, c-format +msgid "%*s/%s kB (%d%%) copied" +msgstr "%*s/%s kB (%d%%) 已被複製" + +#: pg_rewind.c:941 +#, c-format +msgid "could not find common ancestor of the source and target cluster's timelines" +msgstr "找ä¸åˆ°ä¾†æºå¢é›†å’Œç›®æ¨™å¢é›†æ™‚間軸的共åŒç¥–å…ˆ" + +#: pg_rewind.c:982 +#, c-format +msgid "backup label buffer too small" +msgstr "備份標籤緩è¡å€éŽå°" + +#: pg_rewind.c:1005 +#, c-format +msgid "unexpected control file CRC" +msgstr "éžé æœŸçš„æŽ§åˆ¶æª” CRC" + +#: pg_rewind.c:1017 +#, c-format +msgid "unexpected control file size %d, expected %d" +msgstr "éžé æœŸçš„æŽ§åˆ¶æª”å¤§å° %dï¼Œé æœŸç‚º %d" + +#: pg_rewind.c:1026 +#, c-format +msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d byte" +msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the control file specifies %d bytes" +msgstr[0] "WAL 片段大å°å¿…須為介於 1 MB 到 1 GB 之間的二的次方數,但是控制檔指定了 %d ä½å…ƒçµ„" + +#: pg_rewind.c:1065 pg_rewind.c:1135 +#, c-format +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "\"%s\" 需è¦ç¨‹å¼ \"%s\",但在相åŒç›®éŒ„中找ä¸åˆ° \"%s\"" + +#: pg_rewind.c:1068 pg_rewind.c:1138 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "\"%2$s\" æ‰¾åˆ°ç¨‹å¼ \"%1$s\"ï¼Œä½†ç‰ˆæœ¬ä¸æ˜¯ %3$s" + +#: pg_rewind.c:1101 +#, c-format +msgid "restore_command is not set in the target cluster" +msgstr "目標å¢é›†ä¸­æœªè¨­å®š restore_command" + +#: pg_rewind.c:1142 +#, c-format +msgid "executing \"%s\" for target server to complete crash recovery" +msgstr "執行 \"%s\" 以完æˆç›®æ¨™ä¼ºæœå™¨çš„崩潰還原" + +#: pg_rewind.c:1180 +#, c-format +msgid "postgres single-user mode in target cluster failed" +msgstr "目標å¢é›†ä¸­çš„ PostgreSQL 單使用者模å¼å¤±æ•—" + +#: pg_rewind.c:1181 +#, c-format +msgid "Command was: %s" +msgstr "命令是: %s" + +# access/transam/xlog.c:2771 +#: timeline.c:75 timeline.c:81 +#, c-format +msgid "syntax error in history file: %s" +msgstr "æ­·å²æª”中的語法錯誤: %s" + +# access/transam/xlog.c:2772 +#: timeline.c:76 +#, c-format +msgid "Expected a numeric timeline ID." +msgstr "é æœŸæ•¸å­—時間軸 ID。" + +#: timeline.c:82 +#, c-format +msgid "Expected a write-ahead log switchpoint location." +msgstr "é æœŸçš„ write-ahead 日誌切æ›é»žä½ç½®ã€‚" + +# access/transam/xlog.c:2777 +#: timeline.c:87 +#, c-format +msgid "invalid data in history file: %s" +msgstr "æ­·å²æª”中的資料無效: %s" + +# access/transam/xlog.c:2778 +#: timeline.c:88 +#, c-format +msgid "Timeline IDs must be in increasing sequence." +msgstr "時間軸 ID 必須是éžå¢žåºåˆ—。" + +#: timeline.c:108 +#, c-format +msgid "invalid data in history file" +msgstr "æ­·å²æª”中的資料無效" + +# access/transam/xlog.c:2792 +#: timeline.c:109 +#, c-format +msgid "Timeline IDs must be less than child timeline's ID." +msgstr "時間軸 ID å¿…é ˆå°æ–¼å­æ™‚間軸的 ID。" + +#: xlogreader.c:626 +#, c-format +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "使–¼ %X/%X 的記錄 offset 無效: é æœŸè‡³å°‘ %u,實際為 %u" + +# access/transam/xlog.c:2443 +#: xlogreader.c:635 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "%X/%X è¦æ±‚ contrecord" + +#: xlogreader.c:676 xlogreader.c:1119 +#, c-format +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "使–¼ %X/%X 的記錄長度無效: é æœŸè‡³å°‘ %u,實際為 %u" + +#: xlogreader.c:705 +#, c-format +msgid "out of memory while trying to decode a record of length %u" +msgstr "嘗試解碼長度為 %u 的記錄時耗盡記憶體" + +# access/transam/xlog.c:2503 +#: xlogreader.c:727 +#, c-format +msgid "record length %u at %X/%X too long" +msgstr "使–¼ %X/%X 的記錄長度 %u éŽé•·" + +#: xlogreader.c:776 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "使–¼ %X/%X 沒有 contrecord 標誌" + +#: xlogreader.c:789 +#, c-format +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "使–¼ %3$X/%4$X çš„ contrecord 長度 %1$u 無效(é æœŸç‚º %2$lld)" + +# access/transam/xlog.c:2465 +#: xlogreader.c:1127 +#, c-format +msgid "invalid resource manager ID %u at %X/%X" +msgstr "使–¼ %2$X/%3$X 的無效 block_id %1$u" + +# access/transam/xlog.c:2458 +#: xlogreader.c:1140 xlogreader.c:1156 +#, c-format +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "使–¼ %3$X/%4$X çš„è¨˜éŒ„æœ‰ä¸æ­£ç¢ºçš„ prev-link %1$X/%2$X" + +# access/transam/xlog.c:2269 +#: xlogreader.c:1192 +#, c-format +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "使–¼ %X/%X 的記錄中資æºç®¡ç†å“¡è³‡æ–™æª¢æŸ¥ç¢¼ä¸æ­£ç¢º" + +#: xlogreader.c:1226 +#, c-format +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "WAL 片段 %2$s 中的魔數數字 %1$04X 無效,LSN %3$X/%4$X,ä½ç§» %5$u" + +#: xlogreader.c:1241 xlogreader.c:1283 +#, c-format +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "WAL 片段 %2$s 中的資訊ä½å…ƒ %1$04X 無效,LSN %3$X/%4$X,ä½ç§» %5$u" + +#: xlogreader.c:1257 +#, c-format +msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" +msgstr "WAL 檔案來自ä¸åŒçš„資料庫系統: WAL 檔案的資料庫系統識別碼為 %llu,而 pg_control 的資料庫系統識別碼為 %llu" + +#: xlogreader.c:1265 +#, c-format +msgid "WAL file is from different database system: incorrect segment size in page header" +msgstr "WAL 檔案來自ä¸åŒçš„資料庫系統: è³‡æ–™é æ¨™é ­ä¸­çš„片段大å°ä¸æ­£ç¢º" + +#: xlogreader.c:1271 +#, c-format +msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" +msgstr "WAL 檔案來自ä¸åŒçš„資料庫系統: è³‡æ–™é æ¨™é ­ä¸­çš„ XLOG_BLCKSZ 䏿­£ç¢º" + +#: xlogreader.c:1303 +#, c-format +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "éžé æœŸçš„ pageaddr %X/%X 使–¼ WAL 片段 %s,LSN %X/%X,ä½ç§» %u" + +#: xlogreader.c:1329 +#, c-format +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "éžä¾åº timeline ID %u(在 %u 之後)使–¼ WAL 片段 %s,LSN %X/%X,ä½ç§» %u" + +#: xlogreader.c:1735 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "éžå¾ªåº block_id %u 使–¼ %X/%X" + +#: xlogreader.c:1759 +#, c-format +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "設定了 BKPBLOCK_HAS_DATA,但在 %X/%X 的沒有包å«ä»»ä½•資料" + +#: xlogreader.c:1766 +#, c-format +msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" +msgstr "未設定 BKPBLOCK_HAS_DATA,但在 %2$X/%3$X 的資料長度為 %1$u" + +#: xlogreader.c:1802 +#, c-format +msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" +msgstr "設定了 BKPIMAGE_HAS_HOLE,但在 %4$X/%5$X 有 offset %1$u 長度 %2$u å½±åƒé•·åº¦ %3$u 的空洞" + +#: xlogreader.c:1818 +#, c-format +msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" +msgstr "未設定 BKPIMAGE_HAS_HOLE,但在 %3$X/%4$X 有 offset %1$u 長度 %2$u 的空洞" + +#: xlogreader.c:1832 +#, c-format +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "設定了 BKPIMAGE_COMPRESSED,但在 %2$X/%3$X çš„å€å¡Šå½±åƒé•·åº¦ç‚º %1$u" + +#: xlogreader.c:1847 +#, c-format +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "未設定 BKPIMAGE_HAS_HOLE å’Œ BKPIMAGE_COMPRESSED,但在 %2$X/%3$X çš„å€å¡Šå½±åƒé•·åº¦ç‚º %1$u" + +#: xlogreader.c:1863 +#, c-format +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "設定了 BKPBLOCK_SAME_REL,但在 %X/%X 沒有先å‰çš„ rel" + +#: xlogreader.c:1875 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "使–¼ %2$X/%3$X 的無效 block_id %1$u" + +#: xlogreader.c:1942 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "使–¼ %X/%X 的記錄長度無效" + +#: xlogreader.c:1968 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "在 WAL 記錄中找ä¸åˆ°å…·æœ‰ ID %d 的備份å€å¡Š" + +#: xlogreader.c:2052 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "無法還原指定了無效å€å¡Š %3$d 的影åƒï¼Œä½ç½® %1$X/%2$X" + +#: xlogreader.c:2059 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "無法還原處於無效狀態的影åƒï¼Œä½ç½® %X/%X,å€å¡Š %d" + +#: xlogreader.c:2086 xlogreader.c:2103 +#, c-format +msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "ç„¡æ³•é‚„åŽŸç”¨æ­¤ç‰ˆæœ¬ä¸æ”¯æ´çš„壓縮方法 %3$s 壓縮的影åƒï¼Œä½ç½® %1$X/%2$X,å€å¡Š %4$d" + +#: xlogreader.c:2112 +#, c-format +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "無法還原使用未知方法壓縮的影åƒï¼Œä½ç½® %X/%X,å€å¡Š %d" + +#: xlogreader.c:2120 +#, c-format +msgid "could not decompress image at %X/%X, block %d" +msgstr "無法解壓縮影åƒï¼Œä½ç½® %X/%X,å€å¡Š %d" diff --git a/src/bin/pg_rewind/rewind_source.h b/src/bin/pg_rewind/rewind_source.h index 98af3b58ee387..9c4f0aa173a72 100644 --- a/src/bin/pg_rewind/rewind_source.h +++ b/src/bin/pg_rewind/rewind_source.h @@ -8,7 +8,7 @@ * operations to fetch data from the source system, so that the rest of * the code doesn't need to care what kind of a source its dealing with. * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ diff --git a/src/bin/pg_rewind/t/001_basic.pl b/src/bin/pg_rewind/t/001_basic.pl index 031594e14e686..d2cc4d22f0ed4 100644 --- a/src/bin/pg_rewind/t/001_basic.pl +++ b/src/bin/pg_rewind/t/001_basic.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; @@ -18,6 +18,12 @@ sub run_test RewindTest::setup_cluster($test_mode); RewindTest::start_primary(); + # Create an in-place tablespace with some data on it. + primary_psql("CREATE TABLESPACE space_test LOCATION ''"); + primary_psql("CREATE TABLE space_tbl (d text) TABLESPACE space_test"); + primary_psql( + "INSERT INTO space_tbl VALUES ('in primary, before promotion')"); + # Create a test table and insert a row in primary. primary_psql("CREATE TABLE tbl1 (d text)"); primary_psql("INSERT INTO tbl1 VALUES ('in primary')"); @@ -54,7 +60,7 @@ sub run_test # Insert a row in the old primary. This causes the primary and standby # to have "diverged", it's no longer possible to just apply the - # standy's logs over primary directory - you need to rewind. + # standby's logs over primary directory - you need to rewind. primary_psql("INSERT INTO tbl1 VALUES ('in primary, after promotion')"); # Also insert a new row in the standby, which won't be present in the @@ -78,6 +84,13 @@ sub run_test "insert into drop_tbl values ('in primary, after promotion')"); primary_psql("DROP TABLE drop_tbl"); + # Insert some data in the in-place tablespace for the old primary and + # the standby. + primary_psql( + "INSERT INTO space_tbl VALUES ('in primary, after promotion')"); + standby_psql( + "INSERT INTO space_tbl VALUES ('in standby, after promotion')"); + # Before running pg_rewind, do a couple of extra tests with several # option combinations. As the code paths taken by those tests # do not change for the "local" and "remote" modes, just run them @@ -145,6 +158,13 @@ sub run_test RewindTest::run_pg_rewind($test_mode); + check_query( + 'SELECT * FROM space_tbl ORDER BY d', + qq(in primary, before promotion +in standby, after promotion +), + 'table content'); + check_query( 'SELECT * FROM tbl1', qq(in primary diff --git a/src/bin/pg_rewind/t/002_databases.pl b/src/bin/pg_rewind/t/002_databases.pl index 0d480aedb48ba..755ea80e332f9 100644 --- a/src/bin/pg_rewind/t/002_databases.pl +++ b/src/bin/pg_rewind/t/002_databases.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; @@ -60,7 +60,7 @@ sub run_test SKIP: { skip "unix-style permissions not supported on Windows", 1 - if ($windows_os); + if ($windows_os || $Config::Config{osname} eq 'cygwin'); ok(check_mode_recursive($node_primary->data_dir(), 0750, 0640), 'check PGDATA permissions'); diff --git a/src/bin/pg_rewind/t/003_extrafiles.pl b/src/bin/pg_rewind/t/003_extrafiles.pl index fd2bee5d208a3..097b0fde9d90a 100644 --- a/src/bin/pg_rewind/t/003_extrafiles.pl +++ b/src/bin/pg_rewind/t/003_extrafiles.pl @@ -1,10 +1,11 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test how pg_rewind reacts to extra files and directories in the data dirs. use strict; -use warnings; +use warnings FATAL => 'all'; +use Config; use PostgreSQL::Test::Utils; use Test::More; @@ -53,6 +54,10 @@ sub run_test append_to_file "$test_standby_datadir/tst_standby_dir/standby_subdir/standby_file4", "in standby4"; + # Skip testing .DS_Store files on macOS to avoid risk of side effects + append_to_file "$test_standby_datadir/tst_standby_dir/.DS_Store", + "macOS system file" + unless ($Config{osname} eq 'darwin'); mkdir "$test_primary_datadir/tst_primary_dir"; append_to_file "$test_primary_datadir/tst_primary_dir/primary_file1", @@ -78,6 +83,19 @@ sub run_test }, $test_primary_datadir); @paths = sort @paths; + + # File::Find converts backslashes to slashes in the newer Perl + # versions. To support all Perl versions, do the same conversion + # for Windows before comparing the paths. + if ($windows_os) + { + for my $filename (@paths) + { + $filename =~ s{\\}{/}g; + } + $test_primary_datadir =~ s{\\}{/}g; + } + is_deeply( \@paths, [ diff --git a/src/bin/pg_rewind/t/004_pg_xlog_symlink.pl b/src/bin/pg_rewind/t/004_pg_xlog_symlink.pl index 5fb7fa9077c2f..8f63b3707ee07 100644 --- a/src/bin/pg_rewind/t/004_pg_xlog_symlink.pl +++ b/src/bin/pg_rewind/t/004_pg_xlog_symlink.pl @@ -1,11 +1,11 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # # Test pg_rewind when the target's pg_wal directory is a symlink. # use strict; -use warnings; +use warnings FATAL => 'all'; use File::Copy; use File::Path qw(rmtree); use PostgreSQL::Test::Utils; @@ -52,7 +52,7 @@ sub run_test # Insert a row in the old primary. This causes the primary and standby # to have "diverged", it's no longer possible to just apply the - # standy's logs over primary directory - you need to rewind. + # standby's logs over primary directory - you need to rewind. primary_psql("INSERT INTO tbl1 VALUES ('in primary, after promotion')"); # Also insert a new row in the standby, which won't be present in the diff --git a/src/bin/pg_rewind/t/005_same_timeline.pl b/src/bin/pg_rewind/t/005_same_timeline.pl index b4ef05e56078a..c8f5365ee7b0c 100644 --- a/src/bin/pg_rewind/t/005_same_timeline.pl +++ b/src/bin/pg_rewind/t/005_same_timeline.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # # Test that running pg_rewind with the source and target clusters # on the same timeline runs successfully. # use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_rewind/t/006_options.pl b/src/bin/pg_rewind/t/006_options.pl index 4b6e39a47c768..5917bb741d510 100644 --- a/src/bin/pg_rewind/t/006_options.pl +++ b/src/bin/pg_rewind/t/006_options.pl @@ -1,11 +1,11 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # # Test checking options of pg_rewind. # use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_rewind/t/007_standby_source.pl b/src/bin/pg_rewind/t/007_standby_source.pl index 4fd1ed001cf70..7084622758134 100644 --- a/src/bin/pg_rewind/t/007_standby_source.pl +++ b/src/bin/pg_rewind/t/007_standby_source.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # # Test using a standby server as the source. @@ -25,7 +25,7 @@ # as is. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; @@ -86,7 +86,7 @@ # Insert a row in A. This causes A/B and C to have "diverged", so that it's -# no longer possible to just apply the standy's logs over primary directory +# no longer possible to just apply the standby's logs over primary directory # - you need to rewind. $node_a->safe_psql('postgres', "INSERT INTO tbl1 VALUES ('in A, after C was promoted')"); diff --git a/src/bin/pg_rewind/t/008_min_recovery_point.pl b/src/bin/pg_rewind/t/008_min_recovery_point.pl index d4c89451e65aa..65b66df6333e7 100644 --- a/src/bin/pg_rewind/t/008_min_recovery_point.pl +++ b/src/bin/pg_rewind/t/008_min_recovery_point.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # # Test situation where a target data directory contains @@ -31,7 +31,7 @@ # nodes. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_rewind/t/009_growing_files.pl b/src/bin/pg_rewind/t/009_growing_files.pl index cf60a04ae7131..8e59ad6996168 100644 --- a/src/bin/pg_rewind/t/009_growing_files.pl +++ b/src/bin/pg_rewind/t/009_growing_files.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; @@ -28,7 +28,7 @@ RewindTest::promote_standby(); # Insert a row in the old primary. This causes the primary and standby to have -# "diverged", it's no longer possible to just apply the standy's logs over +# "diverged", it's no longer possible to just apply the standby's logs over # primary directory - you need to rewind. Also insert a new row in the # standby, which won't be present in the old primary. primary_psql("INSERT INTO tbl1 VALUES ('in primary, after promotion')"); @@ -69,7 +69,7 @@ # Extract the last line from the verbose output as that should have the error # message for the unexpected file size my $last; -open my $f, '<', "$standby_pgdata/tst_both_dir/file1"; +open my $f, '<', "$standby_pgdata/tst_both_dir/file1" or die $!; $last = $_ while (<$f>); close $f; like($last, qr/error: size of source file/, "Check error message"); diff --git a/src/bin/pg_rewind/t/010_keep_recycled_wals.pl b/src/bin/pg_rewind/t/010_keep_recycled_wals.pl new file mode 100644 index 0000000000000..bf0084d3bc358 --- /dev/null +++ b/src/bin/pg_rewind/t/010_keep_recycled_wals.pl @@ -0,0 +1,62 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group +# +# Test situation where a target data directory contains +# WAL files that were already recycled by the new primary. +# + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Utils; +use Test::More; + +use FindBin; +use lib $FindBin::RealBin; +use RewindTest; + +RewindTest::setup_cluster(); +$node_primary->enable_archiving(); +RewindTest::start_primary(); + +RewindTest::create_standby(); +$node_standby->enable_restoring($node_primary, 0); +$node_standby->reload(); + +RewindTest::primary_psql("CHECKPOINT"); # last common checkpoint + +# We use `perl -e "exit(1)"` as an alternative to "false", because the latter +# might not be available on Windows. +my $false = "$^X -e \"exit(1)\""; +$node_primary->append_conf( + 'postgresql.conf', qq( +archive_command = '$false' +)); +$node_primary->reload(); + +# advance WAL on primary; this WAL segment will never make it to the archive +RewindTest::primary_psql("CREATE TABLE t(a int)"); +RewindTest::primary_psql("INSERT INTO t VALUES(0)"); +RewindTest::primary_psql("SELECT pg_switch_wal()"); + +RewindTest::promote_standby; + +# new primary loses diverging WAL segment +RewindTest::standby_psql("INSERT INTO t values(0)"); +RewindTest::standby_psql("SELECT pg_switch_wal()"); + +$node_standby->stop(); +$node_primary->stop(); + +my ($stdout, $stderr) = run_command( + [ + 'pg_rewind', '--debug', + '--source-pgdata', $node_standby->data_dir, + '--target-pgdata', $node_primary->data_dir, + '--no-sync', + ]); + +like( + $stderr, + qr/Not removing file .* because it is required for recovery/, + "some WAL files were skipped"); + +done_testing(); diff --git a/src/bin/pg_rewind/t/RewindTest.pm b/src/bin/pg_rewind/t/RewindTest.pm index 4957791e94dfc..0bf59db997359 100644 --- a/src/bin/pg_rewind/t/RewindTest.pm +++ b/src/bin/pg_rewind/t/RewindTest.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group package RewindTest; @@ -32,7 +32,7 @@ package RewindTest; # to run psql against the primary and standby servers, respectively. use strict; -use warnings; +use warnings FATAL => 'all'; use Carp; use Exporter 'import'; @@ -131,6 +131,7 @@ sub setup_cluster $node_primary->append_conf( 'postgresql.conf', qq( wal_keep_size = 320MB +allow_in_place_tablespaces = on )); return; } @@ -310,8 +311,8 @@ sub run_pg_rewind # Make sure that directories have the right umask as this is # required by a follow-up check on permissions, and better # safe than sorry. - chmod(0700, $node_primary->archive_dir); - chmod(0700, $node_primary->data_dir . "/pg_wal"); + chmod(0700, $node_primary->archive_dir) or die $!; + chmod(0700, $node_primary->data_dir . "/pg_wal") or die $!; # Add appropriate restore_command to the target cluster $node_primary->enable_restoring($node_primary, 0); diff --git a/src/bin/pg_rewind/timeline.c b/src/bin/pg_rewind/timeline.c index 2d445dac32fe8..765b7c7661f5b 100644 --- a/src/bin/pg_rewind/timeline.c +++ b/src/bin/pg_rewind/timeline.c @@ -3,14 +3,13 @@ * timeline.c * timeline-related functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ #include "postgres_fe.h" #include "access/timeline.h" -#include "access/xlog_internal.h" #include "pg_rewind.h" /* diff --git a/src/bin/pg_test_fsync/Makefile b/src/bin/pg_test_fsync/Makefile index 631d0f38a8e09..4c5e518125033 100644 --- a/src/bin/pg_test_fsync/Makefile +++ b/src/bin/pg_test_fsync/Makefile @@ -31,6 +31,6 @@ installcheck: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_test_fsync$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_test_fsync$(X) $(OBJS) rm -rf tmp_check diff --git a/src/bin/pg_test_fsync/meson.build b/src/bin/pg_test_fsync/meson.build index aaf65c310eed5..b7f35009de6e5 100644 --- a/src/bin/pg_test_fsync/meson.build +++ b/src/bin/pg_test_fsync/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_fsync_sources = files( 'pg_test_fsync.c', diff --git a/src/bin/pg_test_fsync/nls.mk b/src/bin/pg_test_fsync/nls.mk index a50782036ca66..cfe4779071e3c 100644 --- a/src/bin/pg_test_fsync/nls.mk +++ b/src/bin/pg_test_fsync/nls.mk @@ -1,5 +1,5 @@ # src/bin/pg_test_fsync/nls.mk CATALOG_NAME = pg_test_fsync -GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_test_fsync.c +GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) pg_test_fsync.c ../../common/fe_memutils.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) die GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/pg_test_fsync/pg_test_fsync.c b/src/bin/pg_test_fsync/pg_test_fsync.c index 435df8d808de7..cbf587116eafb 100644 --- a/src/bin/pg_test_fsync/pg_test_fsync.c +++ b/src/bin/pg_test_fsync/pg_test_fsync.c @@ -1,6 +1,12 @@ -/* - * pg_test_fsync.c - * tests all supported fsync() methods +/*------------------------------------------------------------------------- + * + * pg_test_fsync --- tests all supported fsync() methods + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * + * src/bin/pg_test_fsync/pg_test_fsync.c + * + *------------------------------------------------------------------------- */ #include "postgres_fe.h" @@ -292,7 +298,7 @@ test_sync(int writes_per_op) printf(_("\nCompare file sync methods using one %dkB write:\n"), XLOG_BLCKSZ_K); else printf(_("\nCompare file sync methods using two %dkB writes:\n"), XLOG_BLCKSZ_K); - printf(_("(in wal_sync_method preference order, except fdatasync is Linux's default)\n")); + printf(_("(in \"wal_sync_method\" preference order, except fdatasync is Linux's default)\n")); /* * Test open_datasync if available @@ -592,12 +598,15 @@ test_non_sync(void) static void signal_cleanup(SIGNAL_ARGS) { + int rc; + /* Delete the file if it exists. Ignore errors */ if (needs_unlink) unlink(filename); /* Finish incomplete line on stdout */ - puts(""); - exit(1); + rc = write(STDOUT_FILENO, "\n", 1); + (void) rc; /* silence compiler warnings */ + _exit(1); } #ifdef HAVE_FSYNC_WRITETHROUGH @@ -605,9 +614,7 @@ signal_cleanup(SIGNAL_ARGS) static int pg_fsync_writethrough(int fd) { -#ifdef WIN32 - return _commit(fd); -#elif defined(F_FULLFSYNC) +#if defined(F_FULLFSYNC) return (fcntl(fd, F_FULLFSYNC, 0) == -1) ? -1 : 0; #else errno = ENOSYS; diff --git a/src/bin/pg_test_fsync/po/LINGUAS b/src/bin/pg_test_fsync/po/LINGUAS index 312956920df20..4cc8bed767c42 100644 --- a/src/bin/pg_test_fsync/po/LINGUAS +++ b/src/bin/pg_test_fsync/po/LINGUAS @@ -1 +1 @@ -cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN +cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN zh_TW diff --git a/src/bin/pg_test_fsync/po/de.po b/src/bin/pg_test_fsync/po/de.po index 906080ea09263..c3635a758869b 100644 --- a/src/bin/pg_test_fsync/po/de.po +++ b/src/bin/pg_test_fsync/po/de.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-11 15:51+0000\n" -"PO-Revision-Date: 2022-05-11 22:41+0200\n" +"POT-Creation-Date: 2024-06-16 07:54+0000\n" +"PO-Revision-Date: 2024-05-26 22:03+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,108 +16,119 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "Fehler: " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "Warnung: " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "Detail: " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "Tipp: " +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "Speicher aufgebraucht\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" + #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:32 +#: pg_test_fsync.c:38 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr " %13.3f Op./s %6.0f µs/Op.\n" -#: pg_test_fsync.c:50 +#: pg_test_fsync.c:56 #, c-format msgid "could not create thread for alarm" msgstr "konnte Thread für Alarm nicht erzeugen" -#: pg_test_fsync.c:95 +#: pg_test_fsync.c:101 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: pg_test_fsync.c:159 +#: pg_test_fsync.c:165 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "Aufruf: %s [-f DATEINAME] [-s SEK-PRO-TEST]\n" -#: pg_test_fsync.c:185 +#: pg_test_fsync.c:191 #, c-format msgid "invalid argument for option %s" msgstr "ungültiges Argument für Option %s" -#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207 +#: pg_test_fsync.c:192 pg_test_fsync.c:204 pg_test_fsync.c:213 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_test_fsync.c:192 +#: pg_test_fsync.c:198 #, c-format msgid "%s must be in range %u..%u" msgstr "%s muss im Bereich %u..%u sein" -#: pg_test_fsync.c:205 +#: pg_test_fsync.c:211 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_test_fsync.c:211 +#: pg_test_fsync.c:217 #, c-format msgid "%u second per test\n" msgid_plural "%u seconds per test\n" msgstr[0] "%u Sekunde pro Test\n" msgstr[1] "%u Sekunden pro Test\n" -#: pg_test_fsync.c:216 +#: pg_test_fsync.c:222 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "O_DIRECT wird auf dieser Plattform für open_datasync und open_sync unterstützt.\n" -#: pg_test_fsync.c:218 +#: pg_test_fsync.c:224 #, c-format msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" msgstr "F_NOCACHE wird auf dieser Plattform für open_datasync und open_sync unterstützt.\n" -#: pg_test_fsync.c:220 +#: pg_test_fsync.c:226 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "Direct-I/O wird auf dieser Plattform nicht unterstützt.\n" -#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361 -#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541 -#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585 +#: pg_test_fsync.c:251 pg_test_fsync.c:341 pg_test_fsync.c:363 +#: pg_test_fsync.c:387 pg_test_fsync.c:531 pg_test_fsync.c:543 +#: pg_test_fsync.c:559 pg_test_fsync.c:565 pg_test_fsync.c:587 msgid "could not open output file" msgstr "konnte Ausgabedatei nicht öffnen" -#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345 -#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433 -#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559 -#: pg_test_fsync.c:590 +#: pg_test_fsync.c:255 pg_test_fsync.c:325 pg_test_fsync.c:350 +#: pg_test_fsync.c:372 pg_test_fsync.c:396 pg_test_fsync.c:435 +#: pg_test_fsync.c:494 pg_test_fsync.c:533 pg_test_fsync.c:561 +#: pg_test_fsync.c:592 msgid "write failed" msgstr "Schreiben fehlgeschlagen" -#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396 -#: pg_test_fsync.c:533 pg_test_fsync.c:565 +#: pg_test_fsync.c:259 pg_test_fsync.c:374 pg_test_fsync.c:398 +#: pg_test_fsync.c:535 pg_test_fsync.c:567 msgid "fsync failed" msgstr "fsync fehlgeschlagen" -#: pg_test_fsync.c:292 +#: pg_test_fsync.c:298 #, c-format msgid "" "\n" @@ -126,7 +137,7 @@ msgstr "" "\n" "Vergleich von Datei-Sync-Methoden bei einem Schreibvorgang aus %dkB:\n" -#: pg_test_fsync.c:294 +#: pg_test_fsync.c:300 #, c-format msgid "" "\n" @@ -135,21 +146,21 @@ msgstr "" "\n" "Vergleich von Datei-Sync-Methoden bei zwei Schreibvorgängen aus je %dkB:\n" -#: pg_test_fsync.c:295 +#: pg_test_fsync.c:301 #, c-format -msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n" -msgstr "(in Rangordnung von wal_sync_method, außer dass fdatasync auf Linux Standard ist)\n" +msgid "(in \"wal_sync_method\" preference order, except fdatasync is Linux's default)\n" +msgstr "(in Rangordnung von »wal_sync_method«, außer dass fdatasync auf Linux Standard ist)\n" -#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480 +#: pg_test_fsync.c:312 pg_test_fsync.c:415 pg_test_fsync.c:482 msgid "n/a*" msgstr "entf.*" -#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401 -#: pg_test_fsync.c:439 pg_test_fsync.c:498 +#: pg_test_fsync.c:331 pg_test_fsync.c:403 pg_test_fsync.c:441 +#: pg_test_fsync.c:500 msgid "n/a" msgstr "entf." -#: pg_test_fsync.c:444 +#: pg_test_fsync.c:446 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -158,7 +169,7 @@ msgstr "" "* Dieses Dateisystem und die Mount-Optionen unterstützen kein Direct-I/O,\n" " z.B. ext4 im Journaled-Modus.\n" -#: pg_test_fsync.c:452 +#: pg_test_fsync.c:454 #, c-format msgid "" "\n" @@ -167,7 +178,7 @@ msgstr "" "\n" "Vergleich von open_sync mit verschiedenen Schreibgrößen:\n" -#: pg_test_fsync.c:453 +#: pg_test_fsync.c:455 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -176,27 +187,27 @@ msgstr "" "(Damit werden die Kosten für das Schreiben von 16kB in verschieden Größen mit\n" "open_sync verglichen.)\n" -#: pg_test_fsync.c:456 +#: pg_test_fsync.c:458 msgid " 1 * 16kB open_sync write" msgstr " 1 * 16kB open_sync schreiben" -#: pg_test_fsync.c:457 +#: pg_test_fsync.c:459 msgid " 2 * 8kB open_sync writes" msgstr " 2 * 8kB open_sync schreiben" -#: pg_test_fsync.c:458 +#: pg_test_fsync.c:460 msgid " 4 * 4kB open_sync writes" msgstr " 4 * 4kB open_sync schreiben" -#: pg_test_fsync.c:459 +#: pg_test_fsync.c:461 msgid " 8 * 2kB open_sync writes" msgstr " 8 * 2kB open_sync schreiben" -#: pg_test_fsync.c:460 +#: pg_test_fsync.c:462 msgid "16 * 1kB open_sync writes" msgstr "16 * 1kB open_sync schreiben" -#: pg_test_fsync.c:514 +#: pg_test_fsync.c:516 #, c-format msgid "" "\n" @@ -205,7 +216,7 @@ msgstr "" "\n" "Probe ob fsync auf einem anderen Dateideskriptor funktioniert:\n" -#: pg_test_fsync.c:515 +#: pg_test_fsync.c:517 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -214,7 +225,7 @@ msgstr "" "(Wenn die Zeiten ähnlich sind, dann kann fsync() auf einem anderen Deskriptor\n" "geschriebene Daten syncen.)\n" -#: pg_test_fsync.c:580 +#: pg_test_fsync.c:582 #, c-format msgid "" "\n" diff --git a/src/bin/pg_test_fsync/po/es.po b/src/bin/pg_test_fsync/po/es.po index b522bdd5b2043..dff84abf1237b 100644 --- a/src/bin/pg_test_fsync/po/es.po +++ b/src/bin/pg_test_fsync/po/es.po @@ -7,10 +7,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_test_fsync (PostgreSQL) 16\n" +"Project-Id-Version: pg_test_fsync (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:22+0000\n" -"PO-Revision-Date: 2023-05-22 12:06+0200\n" +"POT-Creation-Date: 2025-02-16 19:53+0000\n" +"PO-Revision-Date: 2024-11-16 14:24+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -40,88 +40,99 @@ msgstr "detalle: " msgid "hint: " msgstr "consejo: " +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "memoria agotada\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "no se puede duplicar un puntero nulo (error interno)\n" + #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:32 +#: pg_test_fsync.c:38 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr "%13.3f ops/seg %6.0f usegs/op\n" -#: pg_test_fsync.c:50 +#: pg_test_fsync.c:56 #, c-format msgid "could not create thread for alarm" msgstr "no se pudo crear el thread para la alarma" -#: pg_test_fsync.c:95 +#: pg_test_fsync.c:101 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: pg_test_fsync.c:159 +#: pg_test_fsync.c:165 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "Empleo: %s [-f ARCHIVO] [-s SEG-POR-PRUEBA]\n" -#: pg_test_fsync.c:185 +#: pg_test_fsync.c:191 #, c-format msgid "invalid argument for option %s" msgstr "argumento no válido para la opción %s" -#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207 +#: pg_test_fsync.c:192 pg_test_fsync.c:204 pg_test_fsync.c:213 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: pg_test_fsync.c:192 +#: pg_test_fsync.c:198 #, c-format msgid "%s must be in range %u..%u" msgstr "%s debe estar en el rango %u..%u" -#: pg_test_fsync.c:205 +#: pg_test_fsync.c:211 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: pg_test_fsync.c:211 +#: pg_test_fsync.c:217 #, c-format msgid "%u second per test\n" msgid_plural "%u seconds per test\n" msgstr[0] "%u segundo por prueba\n" msgstr[1] "%u segundos por prueba\n" -#: pg_test_fsync.c:216 +#: pg_test_fsync.c:222 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "O_DIRECT tiene soporte en esta plataforma para open_datasync y open_sync.\n" -#: pg_test_fsync.c:218 +#: pg_test_fsync.c:224 #, c-format msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" msgstr "F_NOCACHE tiene soporte en esta plataforma para open_datasync y open_sync.\n" -#: pg_test_fsync.c:220 +#: pg_test_fsync.c:226 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "Direct I/O no está soportado en esta plataforma.\n" -#: pg_test_fsync.c:245 pg_test_fsync.c:335 pg_test_fsync.c:357 -#: pg_test_fsync.c:381 pg_test_fsync.c:525 pg_test_fsync.c:537 -#: pg_test_fsync.c:553 pg_test_fsync.c:559 pg_test_fsync.c:581 +#: pg_test_fsync.c:251 pg_test_fsync.c:341 pg_test_fsync.c:363 +#: pg_test_fsync.c:387 pg_test_fsync.c:531 pg_test_fsync.c:543 +#: pg_test_fsync.c:559 pg_test_fsync.c:565 pg_test_fsync.c:587 msgid "could not open output file" msgstr "no se pudo abrir el archivo de salida" -#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:344 -#: pg_test_fsync.c:366 pg_test_fsync.c:390 pg_test_fsync.c:429 -#: pg_test_fsync.c:488 pg_test_fsync.c:527 pg_test_fsync.c:555 -#: pg_test_fsync.c:586 +#: pg_test_fsync.c:255 pg_test_fsync.c:325 pg_test_fsync.c:350 +#: pg_test_fsync.c:372 pg_test_fsync.c:396 pg_test_fsync.c:435 +#: pg_test_fsync.c:494 pg_test_fsync.c:533 pg_test_fsync.c:561 +#: pg_test_fsync.c:592 msgid "write failed" msgstr "escritura falló" -#: pg_test_fsync.c:253 pg_test_fsync.c:368 pg_test_fsync.c:392 -#: pg_test_fsync.c:529 pg_test_fsync.c:561 +#: pg_test_fsync.c:259 pg_test_fsync.c:374 pg_test_fsync.c:398 +#: pg_test_fsync.c:535 pg_test_fsync.c:567 msgid "fsync failed" msgstr "fsync falló" -#: pg_test_fsync.c:292 +#: pg_test_fsync.c:298 #, c-format msgid "" "\n" @@ -130,7 +141,7 @@ msgstr "" "\n" "Comparar métodos de sincronización de archivos usando una escritura de %dkB:\n" -#: pg_test_fsync.c:294 +#: pg_test_fsync.c:300 #, c-format msgid "" "\n" @@ -139,21 +150,21 @@ msgstr "" "\n" "Comparar métodos de sincronización de archivos usando dos escrituras de %dkB:\n" -#: pg_test_fsync.c:295 +#: pg_test_fsync.c:301 #, c-format -msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n" -msgstr "(en orden de preferencia de wal_sync_method, excepto en Linux donde fdatasync es el predeterminado)\n" +msgid "(in \"wal_sync_method\" preference order, except fdatasync is Linux's default)\n" +msgstr "(en orden de preferencia de «wal_sync_method», excepto en Linux donde fdatasync es el predeterminado)\n" -#: pg_test_fsync.c:306 pg_test_fsync.c:409 pg_test_fsync.c:476 +#: pg_test_fsync.c:312 pg_test_fsync.c:415 pg_test_fsync.c:482 msgid "n/a*" msgstr "n/a*" -#: pg_test_fsync.c:325 pg_test_fsync.c:397 pg_test_fsync.c:435 -#: pg_test_fsync.c:494 +#: pg_test_fsync.c:331 pg_test_fsync.c:403 pg_test_fsync.c:441 +#: pg_test_fsync.c:500 msgid "n/a" msgstr "n/a" -#: pg_test_fsync.c:440 +#: pg_test_fsync.c:446 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -162,7 +173,7 @@ msgstr "" "* Este sistema de archivos con sus opciones de montaje no soportan\n" " Direct I/O, e.g. ext4 en modo journal.\n" -#: pg_test_fsync.c:448 +#: pg_test_fsync.c:454 #, c-format msgid "" "\n" @@ -171,7 +182,7 @@ msgstr "" "\n" "Comparar open_sync con diferentes tamaños de escritura:\n" -#: pg_test_fsync.c:449 +#: pg_test_fsync.c:455 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -180,27 +191,27 @@ msgstr "" "(Esto está diseñado para comparar el costo de escribir 16kB en diferentes\n" "tamaños de escrituras open_sync.)\n" -#: pg_test_fsync.c:452 +#: pg_test_fsync.c:458 msgid " 1 * 16kB open_sync write" msgstr " 1 * 16kB escritura open_sync" -#: pg_test_fsync.c:453 +#: pg_test_fsync.c:459 msgid " 2 * 8kB open_sync writes" msgstr " 2 * 8kB escrituras open_sync" -#: pg_test_fsync.c:454 +#: pg_test_fsync.c:460 msgid " 4 * 4kB open_sync writes" msgstr " 4 * 4kB escrituras open_sync" -#: pg_test_fsync.c:455 +#: pg_test_fsync.c:461 msgid " 8 * 2kB open_sync writes" msgstr " 8 * 2kB escrituras open_sync" -#: pg_test_fsync.c:456 +#: pg_test_fsync.c:462 msgid "16 * 1kB open_sync writes" msgstr "16 * 1kB escrituras open_sync" -#: pg_test_fsync.c:510 +#: pg_test_fsync.c:516 #, c-format msgid "" "\n" @@ -209,7 +220,7 @@ msgstr "" "\n" "Probar si se respeta fsync en un descriptor de archivo que no es de escritura:\n" -#: pg_test_fsync.c:511 +#: pg_test_fsync.c:517 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -218,7 +229,7 @@ msgstr "" "(Si los tiempos son similares, fsync() puede sincronizar datos escritos\n" "en un descriptor diferente.)\n" -#: pg_test_fsync.c:576 +#: pg_test_fsync.c:582 #, c-format msgid "" "\n" diff --git a/src/bin/pg_test_fsync/po/fr.po b/src/bin/pg_test_fsync/po/fr.po index dfedfe84e78a1..464f9c6968730 100644 --- a/src/bin/pg_test_fsync/po/fr.po +++ b/src/bin/pg_test_fsync/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-14 10:20+0000\n" -"PO-Revision-Date: 2022-05-14 17:17+0200\n" +"POT-Creation-Date: 2024-08-22 10:24+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,110 +19,121 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "attention : " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "détail : " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "astuce : " +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "mémoire épuisée\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" + #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:32 +#: pg_test_fsync.c:38 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr "%13.3f ops/sec %6.0f usecs/op\n" -#: pg_test_fsync.c:50 +#: pg_test_fsync.c:56 #, c-format msgid "could not create thread for alarm" msgstr "n'a pas pu créer un thread pour l'alarme" -#: pg_test_fsync.c:95 +#: pg_test_fsync.c:101 #, c-format msgid "%s: %m" msgstr "%s : %m" -#: pg_test_fsync.c:159 +#: pg_test_fsync.c:165 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "Usage: %s [-f NOMFICHIER] [-s SECS-PAR-TEST]\n" -#: pg_test_fsync.c:185 +#: pg_test_fsync.c:191 #, c-format msgid "invalid argument for option %s" msgstr "argument invalide pour l'option %s" -#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207 +#: pg_test_fsync.c:192 pg_test_fsync.c:204 pg_test_fsync.c:213 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_test_fsync.c:192 +#: pg_test_fsync.c:198 #, c-format msgid "%s must be in range %u..%u" msgstr "%s doit être compris entre %u et %u" -#: pg_test_fsync.c:205 +#: pg_test_fsync.c:211 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_test_fsync.c:211 +#: pg_test_fsync.c:217 #, c-format msgid "%u second per test\n" msgid_plural "%u seconds per test\n" msgstr[0] "%u seconde par test\n" msgstr[1] "%u secondes par test\n" -#: pg_test_fsync.c:216 +#: pg_test_fsync.c:222 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "O_DIRECT supporté sur cette plateforme pour open_datasync et open_sync.\n" -#: pg_test_fsync.c:218 +#: pg_test_fsync.c:224 #, c-format msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" msgstr "F_NOCACHE supporté sur cette plateforme pour open_datasync et open_sync.\n" -#: pg_test_fsync.c:220 +#: pg_test_fsync.c:226 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "Direct I/O n'est pas supporté sur cette plateforme.\n" -#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361 -#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541 -#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585 +#: pg_test_fsync.c:251 pg_test_fsync.c:341 pg_test_fsync.c:363 +#: pg_test_fsync.c:387 pg_test_fsync.c:531 pg_test_fsync.c:543 +#: pg_test_fsync.c:559 pg_test_fsync.c:565 pg_test_fsync.c:587 msgid "could not open output file" msgstr "n'a pas pu ouvrir le fichier en sortie" -#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345 -#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433 -#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559 -#: pg_test_fsync.c:590 +#: pg_test_fsync.c:255 pg_test_fsync.c:325 pg_test_fsync.c:350 +#: pg_test_fsync.c:372 pg_test_fsync.c:396 pg_test_fsync.c:435 +#: pg_test_fsync.c:494 pg_test_fsync.c:533 pg_test_fsync.c:561 +#: pg_test_fsync.c:592 msgid "write failed" msgstr "échec en écriture" -#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396 -#: pg_test_fsync.c:533 pg_test_fsync.c:565 +#: pg_test_fsync.c:259 pg_test_fsync.c:374 pg_test_fsync.c:398 +#: pg_test_fsync.c:535 pg_test_fsync.c:567 msgid "fsync failed" msgstr "échec de la synchronisation (fsync)" -#: pg_test_fsync.c:292 +#: pg_test_fsync.c:298 #, c-format msgid "" "\n" @@ -131,7 +142,7 @@ msgstr "" "\n" "Comparer les méthodes de synchronisation de fichier en utilisant une écriture de %d Ko :\n" -#: pg_test_fsync.c:294 +#: pg_test_fsync.c:300 #, c-format msgid "" "\n" @@ -140,21 +151,21 @@ msgstr "" "\n" "Comparer les méthodes de synchronisation de fichier sur disque en utilisant deux écritures de %d Ko :\n" -#: pg_test_fsync.c:295 +#: pg_test_fsync.c:301 #, c-format -msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n" -msgstr "(dans l'ordre de préférence de wal_sync_method, sauf fdatasync qui est la valeur par défaut sous Linux)\n" +msgid "(in \"wal_sync_method\" preference order, except fdatasync is Linux's default)\n" +msgstr "(dans l'ordre de préférence de « wal_sync_method », sauf fdatasync qui est la valeur par défaut sous Linux)\n" -#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480 +#: pg_test_fsync.c:312 pg_test_fsync.c:415 pg_test_fsync.c:482 msgid "n/a*" msgstr "n/a*" -#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401 -#: pg_test_fsync.c:439 pg_test_fsync.c:498 +#: pg_test_fsync.c:331 pg_test_fsync.c:403 pg_test_fsync.c:441 +#: pg_test_fsync.c:500 msgid "n/a" msgstr "n/a" -#: pg_test_fsync.c:444 +#: pg_test_fsync.c:446 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -163,7 +174,7 @@ msgstr "" "* Ce système de fichiers et ses options de montage ne supportent pas les\n" " I/O directes, par exemple ext4 en journalisé.\n" -#: pg_test_fsync.c:452 +#: pg_test_fsync.c:454 #, c-format msgid "" "\n" @@ -172,7 +183,7 @@ msgstr "" "\n" "Comparer open_sync avec différentes tailles d'écriture :\n" -#: pg_test_fsync.c:453 +#: pg_test_fsync.c:455 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -181,27 +192,27 @@ msgstr "" "(Ceci est conçu pour comparer le coût d'écriture de 16 Ko dans différentes tailles\n" "d'écritures open_sync.)\n" -#: pg_test_fsync.c:456 +#: pg_test_fsync.c:458 msgid " 1 * 16kB open_sync write" msgstr " 1 * 16 Ko, écriture avec open_sync" -#: pg_test_fsync.c:457 +#: pg_test_fsync.c:459 msgid " 2 * 8kB open_sync writes" msgstr " 2 * 8 Ko, écriture avec open_sync" -#: pg_test_fsync.c:458 +#: pg_test_fsync.c:460 msgid " 4 * 4kB open_sync writes" msgstr " 4 * 4 Ko, écriture avec open_sync" -#: pg_test_fsync.c:459 +#: pg_test_fsync.c:461 msgid " 8 * 2kB open_sync writes" msgstr " 8 * 2 Ko, écriture avec open_sync" -#: pg_test_fsync.c:460 +#: pg_test_fsync.c:462 msgid "16 * 1kB open_sync writes" msgstr " 16 * 1 Ko, écriture avec open_sync" -#: pg_test_fsync.c:514 +#: pg_test_fsync.c:516 #, c-format msgid "" "\n" @@ -210,7 +221,7 @@ msgstr "" "\n" "Teste si fsync est honoré sur un descripteur de fichiers sans écriture :\n" -#: pg_test_fsync.c:515 +#: pg_test_fsync.c:517 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -219,7 +230,7 @@ msgstr "" "(Si les temps sont similaires, fsync() peut synchroniser sur disque les données écrites sur\n" "un descripteur différent.)\n" -#: pg_test_fsync.c:580 +#: pg_test_fsync.c:582 #, c-format msgid "" "\n" @@ -227,16 +238,3 @@ msgid "" msgstr "" "\n" "%d Ko d'écritures non synchronisées :\n" - -#~ msgid "%s: %s\n" -#~ msgstr "%s : %s\n" - -#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" -#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" - -#~ msgid "seek failed" -#~ msgstr "seek échoué" diff --git a/src/bin/pg_test_fsync/po/ja.po b/src/bin/pg_test_fsync/po/ja.po index b775b3bcac2d0..210595d1859ba 100644 --- a/src/bin/pg_test_fsync/po/ja.po +++ b/src/bin/pg_test_fsync/po/ja.po @@ -1,15 +1,15 @@ # LANGUAGE message translation file for pg_test_fsync -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package. # FIRST AUTHOR , 2018. # msgid "" msgstr "" -"Project-Id-Version: pg_test_fsync (PostgreSQL 16)\n" +"Project-Id-Version: pg_test_fsync (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-14 10:48+0900\n" -"PO-Revision-Date: 2022-05-10 15:25+0900\n" -"Last-Translator: Michihide Hotta \n" +"POT-Creation-Date: 2024-05-20 14:21+0900\n" +"PO-Revision-Date: 2024-05-20 16:41+0900\n" +"Last-Translator: Kyotaro Horiguchi \n" "Language-Team: \n" "Language: ja\n" "MIME-Version: 1.0\n" @@ -39,86 +39,86 @@ msgid "hint: " msgstr "ヒント: " #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:32 +#: pg_test_fsync.c:38 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr "%13.3f æ“作/ç§’ %6.0f マイクロ秒/æ“作\n" -#: pg_test_fsync.c:50 +#: pg_test_fsync.c:56 #, c-format msgid "could not create thread for alarm" msgstr "アラーム用ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_test_fsync.c:95 +#: pg_test_fsync.c:101 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: pg_test_fsync.c:159 +#: pg_test_fsync.c:165 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "使用法: %s [-f ファイルå] [-s テストã‚ãŸã‚Šã®ç§’æ•°]\n" -#: pg_test_fsync.c:185 +#: pg_test_fsync.c:191 #, c-format msgid "invalid argument for option %s" msgstr "オプション%sã®å¼•æ•°ãŒä¸æ­£ã§ã™" -#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207 +#: pg_test_fsync.c:192 pg_test_fsync.c:204 pg_test_fsync.c:213 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" -#: pg_test_fsync.c:192 +#: pg_test_fsync.c:198 #, c-format msgid "%s must be in range %u..%u" msgstr "%sã¯%u..%uã®ç¯„囲ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_test_fsync.c:205 +#: pg_test_fsync.c:211 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")" -#: pg_test_fsync.c:211 +#: pg_test_fsync.c:217 #, c-format msgid "%u second per test\n" msgid_plural "%u seconds per test\n" msgstr[0] "テスト1件ã‚ãŸã‚Š %uç§’\n" -#: pg_test_fsync.c:216 +#: pg_test_fsync.c:222 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "ã“ã®ãƒ—ラットフォームã§ã¯ open_datasync 㨠open_sync ã«ã¤ã„㦠O_DIRECT ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™ã€‚\n" -#: pg_test_fsync.c:218 +#: pg_test_fsync.c:224 #, c-format msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" msgstr "ã“ã®ãƒ—ラットフォームã§ã¯ open_datasync 㨠open_sync ã«ã¤ã„㦠F_NOCACHE ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™ã€‚\n" -#: pg_test_fsync.c:220 +#: pg_test_fsync.c:226 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "ã“ã®ãƒ—ラットフォームã§ã¯ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ I/O ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。\n" -#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361 -#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541 -#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585 +#: pg_test_fsync.c:251 pg_test_fsync.c:341 pg_test_fsync.c:363 +#: pg_test_fsync.c:387 pg_test_fsync.c:531 pg_test_fsync.c:543 +#: pg_test_fsync.c:559 pg_test_fsync.c:565 pg_test_fsync.c:587 msgid "could not open output file" msgstr "出力ファイルをオープンã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345 -#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433 -#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559 -#: pg_test_fsync.c:590 +#: pg_test_fsync.c:255 pg_test_fsync.c:325 pg_test_fsync.c:350 +#: pg_test_fsync.c:372 pg_test_fsync.c:396 pg_test_fsync.c:435 +#: pg_test_fsync.c:494 pg_test_fsync.c:533 pg_test_fsync.c:561 +#: pg_test_fsync.c:592 msgid "write failed" msgstr "書ãè¾¼ã¿ã«å¤±æ•—" -#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396 -#: pg_test_fsync.c:533 pg_test_fsync.c:565 +#: pg_test_fsync.c:259 pg_test_fsync.c:374 pg_test_fsync.c:398 +#: pg_test_fsync.c:535 pg_test_fsync.c:567 msgid "fsync failed" msgstr "fsync ã«å¤±æ•—" -#: pg_test_fsync.c:292 +#: pg_test_fsync.c:298 #, c-format msgid "" "\n" @@ -127,7 +127,7 @@ msgstr "" "\n" "1個㮠%dkB write を使ã£ã¦ãƒ•ã‚¡ã‚¤ãƒ«åŒæœŸãƒ¡ã‚½ãƒƒãƒ‰ã‚’比較ã—ã¾ã™:\n" -#: pg_test_fsync.c:294 +#: pg_test_fsync.c:300 #, c-format msgid "" "\n" @@ -136,21 +136,21 @@ msgstr "" "\n" "2個㮠%dkB write を使ã£ã¦ãƒ•ã‚¡ã‚¤ãƒ«åŒæœŸãƒ¡ã‚½ãƒƒãƒ‰ã‚’比較ã—ã¾ã™:\n" -#: pg_test_fsync.c:295 +#: pg_test_fsync.c:301 #, c-format -msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n" -msgstr "(wal_sync_method ã®æŒ‡å®šé †ã®ä¸­ã§ã€Linux ã®ãƒ‡ãƒ•ォルトã§ã‚ã‚‹ fdatasync ã¯é™¤ãã¾ã™ï¼‰\n" +msgid "(in \"wal_sync_method\" preference order, except fdatasync is Linux's default)\n" +msgstr "(\"wal_sync_method\"ã®æŒ‡å®šé †ã§ã€Linux ã®ãƒ‡ãƒ•ォルトã§ã‚ã‚‹ fdatasync ã¯é™¤ãã¾ã™ï¼‰\n" -#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480 +#: pg_test_fsync.c:312 pg_test_fsync.c:415 pg_test_fsync.c:482 msgid "n/a*" msgstr "利用ä¸å¯*" -#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401 -#: pg_test_fsync.c:439 pg_test_fsync.c:498 +#: pg_test_fsync.c:331 pg_test_fsync.c:403 pg_test_fsync.c:441 +#: pg_test_fsync.c:500 msgid "n/a" msgstr "利用ä¸å¯" -#: pg_test_fsync.c:444 +#: pg_test_fsync.c:446 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -159,7 +159,7 @@ msgstr "" "* ã“ã®ãƒ•ァイルシステムã¨ãã®ãƒžã‚¦ãƒ³ãƒˆã‚ªãƒ—ションã§ã¯ãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆ I/O をサãƒãƒ¼ãƒˆ\n" " ã—ã¦ã„ã¾ã›ã‚“。例)ジャーナルモード㮠ext4。\n" -#: pg_test_fsync.c:452 +#: pg_test_fsync.c:454 #, c-format msgid "" "\n" @@ -168,7 +168,7 @@ msgstr "" "\n" "open_sync ã‚’ç•°ãªã£ãŸ write ã‚µã‚¤ã‚ºã§æ¯”較ã—ã¾ã™:\n" -#: pg_test_fsync.c:453 +#: pg_test_fsync.c:455 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -177,27 +177,27 @@ msgstr "" "(ã“れ㯠open_sync ã® write サイズを変ãˆãªãŒã‚‰ã€16kB write ã®ã‚³ã‚¹ãƒˆã‚’\n" "比較ã™ã‚‹ã‚ˆã†æŒ‡å®šã•れã¦ã„ã¾ã™ã€‚)\n" -#: pg_test_fsync.c:456 +#: pg_test_fsync.c:458 msgid " 1 * 16kB open_sync write" msgstr " 1 * 16kB open_sync write" -#: pg_test_fsync.c:457 +#: pg_test_fsync.c:459 msgid " 2 * 8kB open_sync writes" msgstr " 2 * 8kB open_sync writes" -#: pg_test_fsync.c:458 +#: pg_test_fsync.c:460 msgid " 4 * 4kB open_sync writes" msgstr " 4 * 4kB open_sync writes" -#: pg_test_fsync.c:459 +#: pg_test_fsync.c:461 msgid " 8 * 2kB open_sync writes" msgstr " 8 * 2kB open_sync writes" -#: pg_test_fsync.c:460 +#: pg_test_fsync.c:462 msgid "16 * 1kB open_sync writes" msgstr "16 * 1kB open_sync writes" -#: pg_test_fsync.c:514 +#: pg_test_fsync.c:516 #, c-format msgid "" "\n" @@ -206,7 +206,7 @@ msgstr "" "\n" "書ãè¾¼ã¿ãªã—ã®ãƒ•ァイルディスクリプタ上㮠fsync ã®æ–¹ãŒå„ªã‚Œã¦ã„ã‚‹ã‹ã‚’テストã—ã¾ã™:\n" -#: pg_test_fsync.c:515 +#: pg_test_fsync.c:517 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -215,7 +215,7 @@ msgstr "" "(もã—実行時間ãŒåŒç­‰ã§ã‚れã°ã€fsync() ã¯ç•°ãªã£ãŸãƒ•ァイルディスクリプタ上ã§\n" "データを sync ã§ãã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚)\n" -#: pg_test_fsync.c:580 +#: pg_test_fsync.c:582 #, c-format msgid "" "\n" @@ -224,14 +224,14 @@ msgstr "" "\n" "%dkB ã® sync ãªã— write:\n" -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "\"%s --help\" ã§è©³ç´°ã‚’確èªã—ã¦ãã ã•ã„。\n" +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" #~ msgid "%s: too many command-line arguments (first is \"%s\")\n" #~ msgstr "%s: コマンドライン引数ãŒå¤šã™ãŽã¾ã™ï¼ˆå…ˆé ­ã¯ \"%s\")\n" +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "\"%s --help\" ã§è©³ç´°ã‚’確èªã—ã¦ãã ã•ã„。\n" + #~ msgid "seek failed" #~ msgstr "seek 失敗" - -#~ msgid "%s: %s\n" -#~ msgstr "%s: %s\n" diff --git a/src/bin/pg_test_fsync/po/ka.po b/src/bin/pg_test_fsync/po/ka.po index b151f708bf098..7377b96f94c64 100644 --- a/src/bin/pg_test_fsync/po/ka.po +++ b/src/bin/pg_test_fsync/po/ka.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_test_fsync (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-02 04:51+0000\n" -"PO-Revision-Date: 2022-07-05 05:20+0200\n" +"POT-Creation-Date: 2024-07-01 03:54+0000\n" +"PO-Revision-Date: 2024-05-19 07:15+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.1\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -38,88 +38,99 @@ msgstr "დეტáƒáƒšáƒ”ბი: " msgid "hint: " msgstr "მინიშნებáƒ: " +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" + #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:32 +#: pg_test_fsync.c:38 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr "%13.3f áƒáƒž/წმ %6.0f მკწმ/áƒáƒž\n" -#: pg_test_fsync.c:50 +#: pg_test_fsync.c:56 #, c-format msgid "could not create thread for alarm" msgstr "გáƒáƒ¤áƒ áƒ—ხილების ძáƒáƒ¤áƒ˜áƒ¡ შექმნრშეუძლებელიáƒ" -#: pg_test_fsync.c:95 +#: pg_test_fsync.c:101 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: pg_test_fsync.c:159 +#: pg_test_fsync.c:165 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ: %s [-f ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლი] [-s წáƒáƒ›áƒ˜áƒ¢áƒ”სტი]\n" -#: pg_test_fsync.c:185 +#: pg_test_fsync.c:191 #, c-format msgid "invalid argument for option %s" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ áƒ’უმენტი პáƒáƒ áƒáƒ›áƒ”ტრისთვის: %s" -#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207 +#: pg_test_fsync.c:192 pg_test_fsync.c:204 pg_test_fsync.c:213 #, c-format msgid "Try \"%s --help\" for more information." msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." -#: pg_test_fsync.c:192 +#: pg_test_fsync.c:198 #, c-format msgid "%s must be in range %u..%u" msgstr "%s- %u-დáƒáƒœ %u-მდე დიáƒáƒžáƒáƒ–áƒáƒœáƒ¨áƒ˜ უნდრიყáƒáƒ¡" -#: pg_test_fsync.c:205 +#: pg_test_fsync.c:211 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")" -#: pg_test_fsync.c:211 +#: pg_test_fsync.c:217 #, c-format msgid "%u second per test\n" msgid_plural "%u seconds per test\n" msgstr[0] "%u second per test\n" msgstr[1] "%u seconds per test\n" -#: pg_test_fsync.c:216 +#: pg_test_fsync.c:222 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე O_DIRECT მხáƒáƒ áƒ“áƒáƒ­áƒ”რილირopen_datasync დრopen_sync-სთვის.\n" -#: pg_test_fsync.c:218 +#: pg_test_fsync.c:224 #, c-format msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე F_NOCACHE მხáƒáƒ áƒ“áƒáƒ­áƒ”რილირopen_datasync დრopen_sync-სთვის.\n" -#: pg_test_fsync.c:220 +#: pg_test_fsync.c:226 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "DIRECT I/O áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ.\n" -#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361 -#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541 -#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585 +#: pg_test_fsync.c:251 pg_test_fsync.c:341 pg_test_fsync.c:363 +#: pg_test_fsync.c:387 pg_test_fsync.c:531 pg_test_fsync.c:543 +#: pg_test_fsync.c:559 pg_test_fsync.c:565 pg_test_fsync.c:587 msgid "could not open output file" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345 -#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433 -#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559 -#: pg_test_fsync.c:590 +#: pg_test_fsync.c:255 pg_test_fsync.c:325 pg_test_fsync.c:350 +#: pg_test_fsync.c:372 pg_test_fsync.c:396 pg_test_fsync.c:435 +#: pg_test_fsync.c:494 pg_test_fsync.c:533 pg_test_fsync.c:561 +#: pg_test_fsync.c:592 msgid "write failed" msgstr "ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ" -#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396 -#: pg_test_fsync.c:533 pg_test_fsync.c:565 +#: pg_test_fsync.c:259 pg_test_fsync.c:374 pg_test_fsync.c:398 +#: pg_test_fsync.c:535 pg_test_fsync.c:567 msgid "fsync failed" msgstr "fsync-ის შეცდáƒáƒ›áƒ" -#: pg_test_fsync.c:292 +#: pg_test_fsync.c:298 #, c-format msgid "" "\n" @@ -128,7 +139,7 @@ msgstr "" "\n" "სინქრნიზáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ების შედáƒáƒ áƒ”ბრერთი %dკბ ჩáƒáƒ¬áƒ”რით:\n" -#: pg_test_fsync.c:294 +#: pg_test_fsync.c:300 #, c-format msgid "" "\n" @@ -137,21 +148,21 @@ msgstr "" "\n" "სინქრნიზáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ების შედáƒáƒ áƒ”ბრáƒáƒ áƒ˜ %dკბ ჩáƒáƒ¬áƒ”რით:\n" -#: pg_test_fsync.c:295 +#: pg_test_fsync.c:301 #, c-format -msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n" -msgstr "(wal_sync_method -ის რჩეული მიმდევრáƒáƒ‘ით, fdatasync-ის გáƒáƒ áƒ“áƒ, რáƒáƒ›áƒ”ლიც ლინუქსზე ნáƒáƒ’ულისხმებიáƒ)\n" +msgid "(in \"wal_sync_method\" preference order, except fdatasync is Linux's default)\n" +msgstr "(\"wal_sync_method\"-ის რჩეული მიმდევრáƒáƒ‘ით, fdatasync-ის გáƒáƒ áƒ“áƒ, რáƒáƒ›áƒ”ლიც ლინუქსზე ნáƒáƒ’ულისხმევიáƒ)\n" -#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480 +#: pg_test_fsync.c:312 pg_test_fsync.c:415 pg_test_fsync.c:482 msgid "n/a*" msgstr "n/a*" -#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401 -#: pg_test_fsync.c:439 pg_test_fsync.c:498 +#: pg_test_fsync.c:331 pg_test_fsync.c:403 pg_test_fsync.c:441 +#: pg_test_fsync.c:500 msgid "n/a" msgstr "n/a" -#: pg_test_fsync.c:444 +#: pg_test_fsync.c:446 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -160,7 +171,7 @@ msgstr "" "* áƒáƒ› ფáƒáƒ˜áƒšáƒ£áƒ  სისტემáƒáƒ¡ დრმის მიმáƒáƒ’რების პáƒáƒ áƒáƒ›áƒ”ტრებს პირდáƒáƒžáƒ˜áƒ áƒ˜ შეტáƒáƒœáƒ/გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡\n" "მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒáƒ—. მáƒáƒ’: ext4 ჟურნáƒáƒšáƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რით.\n" -#: pg_test_fsync.c:452 +#: pg_test_fsync.c:454 #, c-format msgid "" "\n" @@ -169,7 +180,7 @@ msgstr "" "\n" "open_sync-ის შედáƒáƒ áƒ”ბრჩáƒáƒ¬áƒ”რის სხვáƒáƒ¤áƒáƒ¡áƒ®áƒ•რზáƒáƒ›áƒ”ბით:\n" -#: pg_test_fsync.c:453 +#: pg_test_fsync.c:455 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -178,27 +189,27 @@ msgstr "" "(გáƒáƒœáƒ™áƒ£áƒ—ვნილირ16კბ-ის ჩáƒáƒ¬áƒ”რის ფáƒáƒ¡áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ áƒ™áƒ•ევáƒáƒ“ \n" "open_sync-ის სხვáƒáƒ“სხვრზáƒáƒ›áƒ”ბის დრáƒáƒ¡.)\n" -#: pg_test_fsync.c:456 +#: pg_test_fsync.c:458 msgid " 1 * 16kB open_sync write" msgstr " 1 * 16კბ open_sync ჩáƒáƒ¬áƒ”რáƒ" -#: pg_test_fsync.c:457 +#: pg_test_fsync.c:459 msgid " 2 * 8kB open_sync writes" msgstr " 2 * 8კბ open_sync ჩáƒáƒ¬áƒ”რáƒ" -#: pg_test_fsync.c:458 +#: pg_test_fsync.c:460 msgid " 4 * 4kB open_sync writes" msgstr " 4 * 4კბ open_sync ჩáƒáƒ¬áƒ”რáƒ" -#: pg_test_fsync.c:459 +#: pg_test_fsync.c:461 msgid " 8 * 2kB open_sync writes" msgstr " 8 * 2კბ open_sync ჩáƒáƒ¬áƒ”რáƒ" -#: pg_test_fsync.c:460 +#: pg_test_fsync.c:462 msgid "16 * 1kB open_sync writes" msgstr "16 * 1კბ open_sync ჩáƒáƒ¬áƒ”რáƒ" -#: pg_test_fsync.c:514 +#: pg_test_fsync.c:516 #, c-format msgid "" "\n" @@ -207,7 +218,7 @@ msgstr "" "\n" "შემáƒáƒ¬áƒ›áƒ”ბáƒ, ხდებრთუ áƒáƒ áƒ fsync ფáƒáƒ˜áƒšáƒ˜áƒ¡ მითითებით, რáƒáƒ›áƒ”ლიც კთხვისთვისáƒáƒ გáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜.\n" -#: pg_test_fsync.c:515 +#: pg_test_fsync.c:517 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -216,7 +227,7 @@ msgstr "" "(თუ დრáƒáƒ”ბი ჰგვáƒáƒœáƒáƒœ, fsync()-ს შეუძლირმáƒáƒœáƒáƒªáƒ”მების სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ,\n" "რáƒáƒ›áƒ”ლიც სხვრდესკრიპტáƒáƒ áƒ˜áƒ— ჩáƒáƒ˜áƒ¬áƒ”რáƒ)\n" -#: pg_test_fsync.c:580 +#: pg_test_fsync.c:582 #, c-format msgid "" "\n" diff --git a/src/bin/pg_test_fsync/po/ko.po b/src/bin/pg_test_fsync/po/ko.po index a3aee6bfd9f97..787414df1a533 100644 --- a/src/bin/pg_test_fsync/po/ko.po +++ b/src/bin/pg_test_fsync/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_test_fsync (PostgreSQL) 12\n" +"Project-Id-Version: pg_test_fsync (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-02-09 20:17+0000\n" -"PO-Revision-Date: 2020-02-10 09:58+0900\n" +"POT-Creation-Date: 2025-01-17 04:54+0000\n" +"PO-Revision-Date: 2025-01-16 11:05+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -17,58 +17,120 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "오류: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "경고: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "메모리 부족\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ë„ í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" + #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:31 +#: pg_test_fsync.c:38 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr "%13.3f ops/sec %6.0f usecs/op\n" -#: pg_test_fsync.c:157 +#: pg_test_fsync.c:56 +#, c-format +msgid "could not create thread for alarm" +msgstr "알람용 쓰레드를 만들 수 ì—†ìŒ" + +#: pg_test_fsync.c:101 +#, c-format +msgid "%s: %m" +msgstr "%s: %m" + +#: pg_test_fsync.c:165 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "사용법: %s [-f 파ì¼ì´ë¦„] [-s 검사초]\n" -#: pg_test_fsync.c:181 pg_test_fsync.c:192 +#: pg_test_fsync.c:191 +#, c-format +msgid "invalid argument for option %s" +msgstr "%s ì˜µì…˜ì˜ ìž˜ëª»ëœ ì¸ìž" + +#: pg_test_fsync.c:192 pg_test_fsync.c:204 pg_test_fsync.c:213 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." + +#: pg_test_fsync.c:198 +#, c-format +msgid "%s must be in range %u..%u" +msgstr "%s ê°’ì€ %u부터 %u까지 지정할 수 있습니다." + +#: pg_test_fsync.c:211 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "ìžì„¸í•œ ì‚¬ìš©ë²•ì€ \"%s --help\" ëª…ë ¹ì„ ì´ìš©í•˜ì„¸ìš”.\n" +msgid "too many command-line arguments (first is \"%s\")" +msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")" -#: pg_test_fsync.c:197 +#: pg_test_fsync.c:217 #, c-format -msgid "%d second per test\n" -msgid_plural "%d seconds per test\n" -msgstr[0] "검사 간격: %d ì´ˆ\n" +msgid "%u second per test\n" +msgid_plural "%u seconds per test\n" +msgstr[0] "검사 간격: %uì´ˆ\n" -#: pg_test_fsync.c:202 +#: pg_test_fsync.c:222 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "" "ì´ í”Œëž«í¼ì—서는 open_datasync, open_sync ì—서 O_DIRECT ì˜µì…˜ì„ ì§€ì›í•¨.\n" -#: pg_test_fsync.c:204 +#: pg_test_fsync.c:224 +#, c-format +msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" +msgstr "" +"ì´ í”Œëž«í¼ì—서는 open_datasync, open_sync ì—서 F_NOCACHE ì˜µì…˜ì„ ì§€ì›í•¨.\n" + +#: pg_test_fsync.c:226 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "ì´ í”Œëž«í¼ì€ direct I/O ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않ìŒ.\n" -#: pg_test_fsync.c:229 pg_test_fsync.c:294 pg_test_fsync.c:318 -#: pg_test_fsync.c:341 pg_test_fsync.c:482 pg_test_fsync.c:494 -#: pg_test_fsync.c:510 pg_test_fsync.c:516 pg_test_fsync.c:541 +#: pg_test_fsync.c:251 pg_test_fsync.c:341 pg_test_fsync.c:363 +#: pg_test_fsync.c:387 pg_test_fsync.c:531 pg_test_fsync.c:543 +#: pg_test_fsync.c:559 pg_test_fsync.c:565 pg_test_fsync.c:587 msgid "could not open output file" msgstr "출력 파ì¼ì„ ì—´ 수 ì—†ìŒ" -#: pg_test_fsync.c:233 pg_test_fsync.c:275 pg_test_fsync.c:300 -#: pg_test_fsync.c:324 pg_test_fsync.c:347 pg_test_fsync.c:385 -#: pg_test_fsync.c:443 pg_test_fsync.c:484 pg_test_fsync.c:512 -#: pg_test_fsync.c:543 +#: pg_test_fsync.c:255 pg_test_fsync.c:325 pg_test_fsync.c:350 +#: pg_test_fsync.c:372 pg_test_fsync.c:396 pg_test_fsync.c:435 +#: pg_test_fsync.c:494 pg_test_fsync.c:533 pg_test_fsync.c:561 +#: pg_test_fsync.c:592 msgid "write failed" msgstr "쓰기 실패" -#: pg_test_fsync.c:237 pg_test_fsync.c:326 pg_test_fsync.c:349 -#: pg_test_fsync.c:486 pg_test_fsync.c:518 +#: pg_test_fsync.c:259 pg_test_fsync.c:374 pg_test_fsync.c:398 +#: pg_test_fsync.c:535 pg_test_fsync.c:567 msgid "fsync failed" msgstr "fsync 실패" -#: pg_test_fsync.c:251 +#: pg_test_fsync.c:298 #, c-format msgid "" "\n" @@ -77,7 +139,7 @@ msgstr "" "\n" "í•˜ë‚˜ì˜ %dkB ì“°ê¸°ì— ëŒ€í•œ íŒŒì¼ ì‹±í¬ ë°©ë²• 비êµ:\n" -#: pg_test_fsync.c:253 +#: pg_test_fsync.c:300 #, c-format msgid "" "\n" @@ -86,29 +148,25 @@ msgstr "" "\n" "ë‘ê°œì˜ %dkB ì“°ê¸°ì— ëŒ€í•œ íŒŒì¼ ì‹±í¬ ë°©ë²• 비êµ:\n" -#: pg_test_fsync.c:254 +#: pg_test_fsync.c:301 #, c-format msgid "" -"(in wal_sync_method preference order, except fdatasync is Linux's default)\n" +"(in \"wal_sync_method\" preference order, except fdatasync is Linux's " +"default)\n" msgstr "" -"(fdatasyncê°€ 리눅스 기본값ì´ê¸°ì— 제외하고, wal_sync_method 우선으로 처리 " +"(fdatasyncê°€ 리눅스 기본값ì´ê¸°ì— 제외하고, \"wal_sync_method\" 우선으로 처리 " "함)\n" -#: pg_test_fsync.c:265 pg_test_fsync.c:368 pg_test_fsync.c:434 +#: pg_test_fsync.c:312 pg_test_fsync.c:415 pg_test_fsync.c:482 msgid "n/a*" msgstr "n/a*" -#: pg_test_fsync.c:277 pg_test_fsync.c:303 pg_test_fsync.c:328 -#: pg_test_fsync.c:351 pg_test_fsync.c:387 pg_test_fsync.c:445 -msgid "seek failed" -msgstr "찾기 실패" - -#: pg_test_fsync.c:283 pg_test_fsync.c:308 pg_test_fsync.c:356 -#: pg_test_fsync.c:393 pg_test_fsync.c:451 +#: pg_test_fsync.c:331 pg_test_fsync.c:403 pg_test_fsync.c:441 +#: pg_test_fsync.c:500 msgid "n/a" msgstr "n/a" -#: pg_test_fsync.c:398 +#: pg_test_fsync.c:446 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -117,7 +175,7 @@ msgstr "" "* ì´ íŒŒì¼ ì‹œìŠ¤í…œê³¼ 마운트 ì˜µì…˜ì´ direct I/O ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않ìŒ\n" " 예: journaled modeì—서 ext4\n" -#: pg_test_fsync.c:406 +#: pg_test_fsync.c:454 #, c-format msgid "" "\n" @@ -126,7 +184,7 @@ msgstr "" "\n" "서로 다른 쓰기량으로 open_sync 비êµ:\n" -#: pg_test_fsync.c:407 +#: pg_test_fsync.c:455 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -134,27 +192,27 @@ msgid "" msgstr "" "(서로 다른 í¬ê¸°ë¡œ 16kB를 쓰는ë°, open_sync ì˜µì…˜ì„ ì‚¬ìš©í•  ë•Œì˜ ë¹„ìš© 비êµ)\n" -#: pg_test_fsync.c:410 +#: pg_test_fsync.c:458 msgid " 1 * 16kB open_sync write" msgstr " 1 * 16kB open_sync 쓰기" -#: pg_test_fsync.c:411 +#: pg_test_fsync.c:459 msgid " 2 * 8kB open_sync writes" msgstr " 2 * 8kB open_sync 쓰기" -#: pg_test_fsync.c:412 +#: pg_test_fsync.c:460 msgid " 4 * 4kB open_sync writes" msgstr " 4 * 4kB open_sync 쓰기" -#: pg_test_fsync.c:413 +#: pg_test_fsync.c:461 msgid " 8 * 2kB open_sync writes" msgstr " 8 * 2kB open_sync 쓰기" -#: pg_test_fsync.c:414 +#: pg_test_fsync.c:462 msgid "16 * 1kB open_sync writes" msgstr "16 * 1kB open_sync 쓰기" -#: pg_test_fsync.c:467 +#: pg_test_fsync.c:516 #, c-format msgid "" "\n" @@ -163,7 +221,7 @@ msgstr "" "\n" "쓰기 ë°©ì§€ 파ì¼ì—서 fsync ìž‘ë™ ì—¬ë¶€ 검사:\n" -#: pg_test_fsync.c:468 +#: pg_test_fsync.c:517 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -172,7 +230,7 @@ msgstr "" "(ì´ ê°’ì´ ë¹„ìŠ·í•˜ë‹¤ë©´, fsync() 호출로 여러 íŒŒì¼ ìƒíƒœì— 대해서 sync를 사용\n" "í•  수 있ìŒ.)\n" -#: pg_test_fsync.c:533 +#: pg_test_fsync.c:582 #, c-format msgid "" "\n" @@ -180,12 +238,3 @@ msgid "" msgstr "" "\n" "Non-sync %dkB 쓰기:\n" - -#~ msgid "Could not create thread for alarm\n" -#~ msgstr "알람용 쓰레드를 만들 수 ì—†ìŒ\n" - -#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" -#~ msgstr "%s: 너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ ì§€ì •í–ˆìŒ (ì‹œìž‘ì€ \"%s\")\n" - -#~ msgid "%s: %s\n" -#~ msgstr "%s: %s\n" diff --git a/src/bin/pg_test_fsync/po/meson.build b/src/bin/pg_test_fsync/po/meson.build index 46d0ac587e2f1..5e286a9fc293e 100644 --- a/src/bin/pg_test_fsync/po/meson.build +++ b/src/bin/pg_test_fsync/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_test_fsync-' + pg_version_major.to_string())] diff --git a/src/bin/pg_test_fsync/po/pt_BR.po b/src/bin/pg_test_fsync/po/pt_BR.po index f80976641c356..e75dcd25f2c22 100644 --- a/src/bin/pg_test_fsync/po/pt_BR.po +++ b/src/bin/pg_test_fsync/po/pt_BR.po @@ -1,16 +1,16 @@ # Brazilian Portuguese message translation file for pg_test_fsync # -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2023 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # -# Euler Taveira , 2022. +# Euler Taveira , 2023-2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-27 13:15-0300\n" -"PO-Revision-Date: 2022-09-27 18:50-0300\n" +"POT-Creation-Date: 2024-01-02 13:02-0300\n" +"PO-Revision-Date: 2023-09-27 18:50-0300\n" "Last-Translator: Euler Taveira \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" @@ -102,21 +102,21 @@ msgstr "F_NOCACHE suportado nesta plataforma para open_datasync e open_sync.\n" msgid "Direct I/O is not supported on this platform.\n" msgstr "Direct I/O não é suportado nesta plataforma.\n" -#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361 -#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541 -#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585 +#: pg_test_fsync.c:245 pg_test_fsync.c:335 pg_test_fsync.c:357 +#: pg_test_fsync.c:381 pg_test_fsync.c:525 pg_test_fsync.c:537 +#: pg_test_fsync.c:553 pg_test_fsync.c:559 pg_test_fsync.c:581 msgid "could not open output file" msgstr "não pôde abrir arquivo de saída" -#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345 -#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433 -#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559 -#: pg_test_fsync.c:590 +#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:344 +#: pg_test_fsync.c:366 pg_test_fsync.c:390 pg_test_fsync.c:429 +#: pg_test_fsync.c:488 pg_test_fsync.c:527 pg_test_fsync.c:555 +#: pg_test_fsync.c:586 msgid "write failed" msgstr "escrita falhou" -#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396 -#: pg_test_fsync.c:533 pg_test_fsync.c:565 +#: pg_test_fsync.c:253 pg_test_fsync.c:368 pg_test_fsync.c:392 +#: pg_test_fsync.c:529 pg_test_fsync.c:561 msgid "fsync failed" msgstr "fsync falhou" @@ -143,16 +143,16 @@ msgstr "" msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n" msgstr "(em ordem de preferência do wal_sync_method, exceto fdatasync que é o padrão do Linux)\n" -#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480 +#: pg_test_fsync.c:306 pg_test_fsync.c:409 pg_test_fsync.c:476 msgid "n/a*" msgstr "n/a*" -#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401 -#: pg_test_fsync.c:439 pg_test_fsync.c:498 +#: pg_test_fsync.c:325 pg_test_fsync.c:397 pg_test_fsync.c:435 +#: pg_test_fsync.c:494 msgid "n/a" msgstr "n/a" -#: pg_test_fsync.c:444 +#: pg_test_fsync.c:440 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -161,7 +161,7 @@ msgstr "" "* Este sistema de arquivos e suas opções de montagem não suportam\n" " direct I/O, e.g. ext4 em modo journal.\n" -#: pg_test_fsync.c:452 +#: pg_test_fsync.c:448 #, c-format msgid "" "\n" @@ -170,7 +170,7 @@ msgstr "" "\n" "Compara open_sync com diferentes tamanhos de escrita:\n" -#: pg_test_fsync.c:453 +#: pg_test_fsync.c:449 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -179,27 +179,27 @@ msgstr "" "(Isso é projetado para comparar o custo de escrita de 16jB em diferentes tamanhos\n" "de escrita com open_sync.)\n" -#: pg_test_fsync.c:456 +#: pg_test_fsync.c:452 msgid " 1 * 16kB open_sync write" msgstr " 1 * escrita de 16kB open_sync" -#: pg_test_fsync.c:457 +#: pg_test_fsync.c:453 msgid " 2 * 8kB open_sync writes" msgstr " 2 * escritas de 8kB open_sync" -#: pg_test_fsync.c:458 +#: pg_test_fsync.c:454 msgid " 4 * 4kB open_sync writes" msgstr " 4 * escritas de 4kB open_sync" -#: pg_test_fsync.c:459 +#: pg_test_fsync.c:455 msgid " 8 * 2kB open_sync writes" msgstr " 8 * escritas de 2kB open_sync" -#: pg_test_fsync.c:460 +#: pg_test_fsync.c:456 msgid "16 * 1kB open_sync writes" msgstr "16 * escritas de 1kB open_sync" -#: pg_test_fsync.c:514 +#: pg_test_fsync.c:510 #, c-format msgid "" "\n" @@ -208,7 +208,7 @@ msgstr "" "\n" "Testar se o fsync em um descritor de arquivo sem escrita é respeitado:\n" -#: pg_test_fsync.c:515 +#: pg_test_fsync.c:511 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -217,7 +217,7 @@ msgstr "" "(Se os tempos são similares, fsync() pode sincronizar dados escritos em um\n" "descritor diferente.)\n" -#: pg_test_fsync.c:580 +#: pg_test_fsync.c:576 #, c-format msgid "" "\n" diff --git a/src/bin/pg_test_fsync/po/ru.po b/src/bin/pg_test_fsync/po/ru.po index 4b5be6d018af7..c6fccd00352bf 100644 --- a/src/bin/pg_test_fsync/po/ru.po +++ b/src/bin/pg_test_fsync/po/ru.po @@ -1,21 +1,21 @@ # Russian message translation file for pg_test_fsync # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2017, 2021, 2022. +# Alexander Lakhin , 2017, 2021, 2022, 2024. msgid "" msgstr "" "Project-Id-Version: pg_test_fsync (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-27 14:52+0300\n" -"PO-Revision-Date: 2022-09-05 13:36+0300\n" +"POT-Creation-Date: 2024-09-02 09:29+0300\n" +"PO-Revision-Date: 2024-09-04 18:11+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,48 +37,59 @@ msgstr "подробноÑти: " msgid "hint: " msgstr "подÑказка: " +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "нехватка памÑти\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" + #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:32 +#: pg_test_fsync.c:38 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr "%13.3f оп/Ñ %6.0f мкÑ/оп\n" -#: pg_test_fsync.c:50 +#: pg_test_fsync.c:56 #, c-format msgid "could not create thread for alarm" msgstr "не удалоÑÑŒ Ñоздать поток Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ Ñигналов" -#: pg_test_fsync.c:95 +#: pg_test_fsync.c:101 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: pg_test_fsync.c:159 +#: pg_test_fsync.c:165 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "ИÑпользование: %s [-f ИМЯ_ФÐЙЛР] [-s ТЕСТ_СЕК]\n" -#: pg_test_fsync.c:185 +#: pg_test_fsync.c:191 #, c-format msgid "invalid argument for option %s" msgstr "недопуÑтимый аргумент параметра %s" -#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207 +#: pg_test_fsync.c:192 pg_test_fsync.c:204 pg_test_fsync.c:213 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." -#: pg_test_fsync.c:192 +#: pg_test_fsync.c:198 #, c-format msgid "%s must be in range %u..%u" msgstr "значение %s должно быть в диапазоне %u..%u" -#: pg_test_fsync.c:205 +#: pg_test_fsync.c:211 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")" -#: pg_test_fsync.c:211 +#: pg_test_fsync.c:217 #, c-format msgid "%u second per test\n" msgid_plural "%u seconds per test\n" @@ -86,42 +97,42 @@ msgstr[0] "на теÑÑ‚ отводитÑÑ %u Ñек.\n" msgstr[1] "на теÑÑ‚ отводитÑÑ %u Ñек.\n" msgstr[2] "на теÑÑ‚ отводитÑÑ %u Ñек.\n" -#: pg_test_fsync.c:216 +#: pg_test_fsync.c:222 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "" "O_DIRECT на Ñтой платформе не поддерживаетÑÑ Ð´Ð»Ñ open_datasync и open_sync.\n" -#: pg_test_fsync.c:218 +#: pg_test_fsync.c:224 #, c-format msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" msgstr "" "F_NOCACHE на Ñтой платформе поддерживаетÑÑ Ð´Ð»Ñ open_datasync и open_sync.\n" -#: pg_test_fsync.c:220 +#: pg_test_fsync.c:226 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "ПрÑмой ввод/вывод не поддерживаетÑÑ Ð½Ð° Ñтой платформе.\n" -#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361 -#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541 -#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585 +#: pg_test_fsync.c:251 pg_test_fsync.c:341 pg_test_fsync.c:363 +#: pg_test_fsync.c:387 pg_test_fsync.c:531 pg_test_fsync.c:543 +#: pg_test_fsync.c:559 pg_test_fsync.c:565 pg_test_fsync.c:587 msgid "could not open output file" msgstr "не удалоÑÑŒ открыть выходной файл" -#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345 -#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433 -#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559 -#: pg_test_fsync.c:590 +#: pg_test_fsync.c:255 pg_test_fsync.c:325 pg_test_fsync.c:350 +#: pg_test_fsync.c:372 pg_test_fsync.c:396 pg_test_fsync.c:435 +#: pg_test_fsync.c:494 pg_test_fsync.c:533 pg_test_fsync.c:561 +#: pg_test_fsync.c:592 msgid "write failed" msgstr "ошибка запиÑи" -#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396 -#: pg_test_fsync.c:533 pg_test_fsync.c:565 +#: pg_test_fsync.c:259 pg_test_fsync.c:374 pg_test_fsync.c:398 +#: pg_test_fsync.c:535 pg_test_fsync.c:567 msgid "fsync failed" msgstr "ошибка Ñинхронизации Ñ Ð¤Ð¡" -#: pg_test_fsync.c:292 +#: pg_test_fsync.c:298 #, c-format msgid "" "\n" @@ -130,7 +141,7 @@ msgstr "" "\n" "Сравнение методов Ñинхронизации файлов при однократной запиÑи %d КБ:\n" -#: pg_test_fsync.c:294 +#: pg_test_fsync.c:300 #, c-format msgid "" "\n" @@ -139,24 +150,25 @@ msgstr "" "\n" "Сравнение методов Ñинхронизации файлов при двухкратной запиÑи %d КБ:\n" -#: pg_test_fsync.c:295 +#: pg_test_fsync.c:301 #, c-format msgid "" -"(in wal_sync_method preference order, except fdatasync is Linux's default)\n" +"(in \"wal_sync_method\" preference order, except fdatasync is Linux's " +"default)\n" msgstr "" -"(в порÑдке Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð´Ð»Ñ wal_sync_method, без учёта наибольшего " -"Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ fdatasync в Linux)\n" +"(в порÑдке Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð´Ð»Ñ \"wal_sync_method\", за иÑключением того, что в " +"Linux предпочитаетÑÑ fdatasync)\n" -#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480 +#: pg_test_fsync.c:312 pg_test_fsync.c:415 pg_test_fsync.c:482 msgid "n/a*" msgstr "н/д*" -#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401 -#: pg_test_fsync.c:439 pg_test_fsync.c:498 +#: pg_test_fsync.c:331 pg_test_fsync.c:403 pg_test_fsync.c:441 +#: pg_test_fsync.c:500 msgid "n/a" msgstr "н/д" -#: pg_test_fsync.c:444 +#: pg_test_fsync.c:446 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -165,7 +177,7 @@ msgstr "" "* Эта Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼Ð¸ параметрами Ð¼Ð¾Ð½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ поддерживает\n" " прÑмой ввод/вывод, как например, ext4 в режиме журналированиÑ.\n" -#: pg_test_fsync.c:452 +#: pg_test_fsync.c:454 #, c-format msgid "" "\n" @@ -174,7 +186,7 @@ msgstr "" "\n" "Сравнение open_sync при различных объёмах запиÑываемых данных:\n" -#: pg_test_fsync.c:453 +#: pg_test_fsync.c:455 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -185,27 +197,27 @@ msgstr "" "запиÑи Ñ open_sync.)\n" # skip-rule: double-space -#: pg_test_fsync.c:456 +#: pg_test_fsync.c:458 msgid " 1 * 16kB open_sync write" msgstr "запиÑÑŒ Ñ open_sync 1 * 16 КБ" -#: pg_test_fsync.c:457 +#: pg_test_fsync.c:459 msgid " 2 * 8kB open_sync writes" msgstr "запиÑÑŒ Ñ open_sync 2 * 8 КБ" -#: pg_test_fsync.c:458 +#: pg_test_fsync.c:460 msgid " 4 * 4kB open_sync writes" msgstr "запиÑÑŒ Ñ open_sync 4 * 4 КБ" -#: pg_test_fsync.c:459 +#: pg_test_fsync.c:461 msgid " 8 * 2kB open_sync writes" msgstr "запиÑÑŒ Ñ open_sync 8 * 2 КБ" -#: pg_test_fsync.c:460 +#: pg_test_fsync.c:462 msgid "16 * 1kB open_sync writes" msgstr "запиÑÑŒ Ñ open_sync 16 * 1 КБ" -#: pg_test_fsync.c:514 +#: pg_test_fsync.c:516 #, c-format msgid "" "\n" @@ -215,7 +227,7 @@ msgstr "" "Проверка, производитÑÑ Ð»Ð¸ fsync Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»ÐµÐ¼ файла, открытого не Ð´Ð»Ñ " "запиÑи:\n" -#: pg_test_fsync.c:515 +#: pg_test_fsync.c:517 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -225,7 +237,7 @@ msgstr "" "данные,\n" "запиÑанные через другой деÑкриптор.)\n" -#: pg_test_fsync.c:580 +#: pg_test_fsync.c:582 #, c-format msgid "" "\n" diff --git a/src/bin/pg_test_fsync/po/sv.po b/src/bin/pg_test_fsync/po/sv.po index 45f059e9db55d..3d03f5afe8c47 100644 --- a/src/bin/pg_test_fsync/po/sv.po +++ b/src/bin/pg_test_fsync/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_test_fsync # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-09 18:51+0000\n" -"PO-Revision-Date: 2022-05-09 21:44+0200\n" +"POT-Creation-Date: 2024-07-12 14:25+0000\n" +"PO-Revision-Date: 2024-07-12 19:06+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,108 +17,119 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "varning: " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "detalj: " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "tips: " +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "slut pÃ¥ minne\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kan inte duplicera null-pekare (internt fel)\n" + #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:32 +#: pg_test_fsync.c:38 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr "%13.3f ops/sek %6.0f useks/op\n" -#: pg_test_fsync.c:50 +#: pg_test_fsync.c:56 #, c-format msgid "could not create thread for alarm" msgstr "kunde inte skapa alarmtrÃ¥d" -#: pg_test_fsync.c:95 +#: pg_test_fsync.c:101 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: pg_test_fsync.c:159 +#: pg_test_fsync.c:165 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "Användning: %s [-f FILENAMN] [-s SEK-PER-TEST]\n" -#: pg_test_fsync.c:185 +#: pg_test_fsync.c:191 #, c-format msgid "invalid argument for option %s" msgstr "ogiltigt argument för flaggan %s" -#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207 +#: pg_test_fsync.c:192 pg_test_fsync.c:204 pg_test_fsync.c:213 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: pg_test_fsync.c:192 +#: pg_test_fsync.c:198 #, c-format msgid "%s must be in range %u..%u" msgstr "%s mÃ¥ste vara i intervallet %u..%u" -#: pg_test_fsync.c:205 +#: pg_test_fsync.c:211 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")" -#: pg_test_fsync.c:211 +#: pg_test_fsync.c:217 #, c-format msgid "%u second per test\n" msgid_plural "%u seconds per test\n" msgstr[0] "%u sekund per test\n" msgstr[1] "%u sekunder per test\n" -#: pg_test_fsync.c:216 +#: pg_test_fsync.c:222 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "O_DIRECT stöds pÃ¥ denna plattform för open_datasync och open_sync.\n" -#: pg_test_fsync.c:218 +#: pg_test_fsync.c:224 #, c-format msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" msgstr "F_NOCACHE stöds pÃ¥ denna plattform för open_datasync och open_sync.\n" -#: pg_test_fsync.c:220 +#: pg_test_fsync.c:226 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "Direkt I/O stöds inte pÃ¥ denna plattform.\n" -#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361 -#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541 -#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585 +#: pg_test_fsync.c:251 pg_test_fsync.c:341 pg_test_fsync.c:363 +#: pg_test_fsync.c:387 pg_test_fsync.c:531 pg_test_fsync.c:543 +#: pg_test_fsync.c:559 pg_test_fsync.c:565 pg_test_fsync.c:587 msgid "could not open output file" msgstr "kunde inte öppna utdatafil" -#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345 -#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433 -#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559 -#: pg_test_fsync.c:590 +#: pg_test_fsync.c:255 pg_test_fsync.c:325 pg_test_fsync.c:350 +#: pg_test_fsync.c:372 pg_test_fsync.c:396 pg_test_fsync.c:435 +#: pg_test_fsync.c:494 pg_test_fsync.c:533 pg_test_fsync.c:561 +#: pg_test_fsync.c:592 msgid "write failed" msgstr "skrivning misslyckades" -#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396 -#: pg_test_fsync.c:533 pg_test_fsync.c:565 +#: pg_test_fsync.c:259 pg_test_fsync.c:374 pg_test_fsync.c:398 +#: pg_test_fsync.c:535 pg_test_fsync.c:567 msgid "fsync failed" msgstr "fsync misslyckades" -#: pg_test_fsync.c:292 +#: pg_test_fsync.c:298 #, c-format msgid "" "\n" @@ -127,7 +138,7 @@ msgstr "" "\n" "Jämför filsynkningsmetoder genom att använda en %dkB-skrivning:\n" -#: pg_test_fsync.c:294 +#: pg_test_fsync.c:300 #, c-format msgid "" "\n" @@ -136,21 +147,21 @@ msgstr "" "\n" "Jämför filsynkningsmetoder genom att använda tvÃ¥ %dkB-skrivningar:\n" -#: pg_test_fsync.c:295 +#: pg_test_fsync.c:301 #, c-format -msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n" -msgstr "(i wal_sync_method inställningsordning, förutom att fdatasync är standard i Linux)\n" +msgid "(in \"wal_sync_method\" preference order, except fdatasync is Linux's default)\n" +msgstr "(i \"wal_sync_method\" inställningsordning, förutom att fdatasync är standard i Linux)\n" -#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480 +#: pg_test_fsync.c:312 pg_test_fsync.c:415 pg_test_fsync.c:482 msgid "n/a*" msgstr "ej tillämpbar*" -#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401 -#: pg_test_fsync.c:439 pg_test_fsync.c:498 +#: pg_test_fsync.c:331 pg_test_fsync.c:403 pg_test_fsync.c:441 +#: pg_test_fsync.c:500 msgid "n/a" msgstr "ej tillämpbar" -#: pg_test_fsync.c:444 +#: pg_test_fsync.c:446 #, c-format msgid "" "* This file system and its mount options do not support direct\n" @@ -159,7 +170,7 @@ msgstr "" "* Detta filsystem och dess monteringsflaffor stöder inte\n" " direkt I/O, t.ex. ext4 i journalläge.\n" -#: pg_test_fsync.c:452 +#: pg_test_fsync.c:454 #, c-format msgid "" "\n" @@ -168,7 +179,7 @@ msgstr "" "\n" "Jämför open_sync med olika skrivstorlekar:\n" -#: pg_test_fsync.c:453 +#: pg_test_fsync.c:455 #, c-format msgid "" "(This is designed to compare the cost of writing 16kB in different write\n" @@ -177,27 +188,27 @@ msgstr "" "(Detta är gjort för att jämföra kostnaden att skriva 16kB med olika\n" "open_sync skrivstorlekar.)\n" -#: pg_test_fsync.c:456 +#: pg_test_fsync.c:458 msgid " 1 * 16kB open_sync write" msgstr " 1 * 16kB open_sync skrivning" -#: pg_test_fsync.c:457 +#: pg_test_fsync.c:459 msgid " 2 * 8kB open_sync writes" msgstr " 2 * 8kB open_sync skrivningar" -#: pg_test_fsync.c:458 +#: pg_test_fsync.c:460 msgid " 4 * 4kB open_sync writes" msgstr " 4 * 4kB open_sync skrivningar" -#: pg_test_fsync.c:459 +#: pg_test_fsync.c:461 msgid " 8 * 2kB open_sync writes" msgstr " 8 * 2kB open_sync skrivningar" -#: pg_test_fsync.c:460 +#: pg_test_fsync.c:462 msgid "16 * 1kB open_sync writes" msgstr "16 * 1kB open_sync skrivningar" -#: pg_test_fsync.c:514 +#: pg_test_fsync.c:516 #, c-format msgid "" "\n" @@ -206,7 +217,7 @@ msgstr "" "\n" "Testa om fsync pÃ¥ en icke skrivbar fildeskriptor respekteras:\n" -#: pg_test_fsync.c:515 +#: pg_test_fsync.c:517 #, c-format msgid "" "(If the times are similar, fsync() can sync data written on a different\n" @@ -215,7 +226,7 @@ msgstr "" "(Om tiderna är liknande, sÃ¥ kan fsync() synka data skriven pÃ¥\n" "olika deskriptorer.)\n" -#: pg_test_fsync.c:580 +#: pg_test_fsync.c:582 #, c-format msgid "" "\n" @@ -223,7 +234,3 @@ msgid "" msgstr "" "\n" "Icke-synkade %dkB-skrivningar:\n" - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Försök med \"%s --help\" för mer information.\n" diff --git a/src/bin/pg_test_fsync/po/uk.po b/src/bin/pg_test_fsync/po/uk.po index 00a789b1a426b..a633ea634bef1 100644 --- a/src/bin/pg_test_fsync/po/uk.po +++ b/src/bin/pg_test_fsync/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:51+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:24+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pg_test_fsync.pot\n" -"X-Crowdin-File-ID: 886\n" +"X-Crowdin-File: /REL_17_STABLE/pg_test_fsync.pot\n" +"X-Crowdin-File-ID: 1020\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,48 +37,59 @@ msgstr "деталі: " msgid "hint: " msgstr "підказка: " +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "недоÑтатньо пам'Ñті\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" + #. translator: maintain alignment with NA_FORMAT -#: pg_test_fsync.c:32 +#: pg_test_fsync.c:38 #, c-format msgid "%13.3f ops/sec %6.0f usecs/op\n" msgstr "%13.3f оп/Ñ %6.0f мкÑ/оп\n" -#: pg_test_fsync.c:50 +#: pg_test_fsync.c:56 #, c-format msgid "could not create thread for alarm" msgstr "не вдалоÑÑ Ñтворити потік Ð´Ð»Ñ Ñигналізації" -#: pg_test_fsync.c:95 +#: pg_test_fsync.c:101 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: pg_test_fsync.c:159 +#: pg_test_fsync.c:165 #, c-format msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" msgstr "ВикориÑтаннÑ: %s [-f FILENAME] [-s SECS-PER-TEST]\n" -#: pg_test_fsync.c:185 +#: pg_test_fsync.c:191 #, c-format msgid "invalid argument for option %s" msgstr "неприпуÑтимий аргумент Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ %s" -#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207 +#: pg_test_fsync.c:192 pg_test_fsync.c:204 pg_test_fsync.c:213 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." -#: pg_test_fsync.c:192 +#: pg_test_fsync.c:198 #, c-format msgid "%s must be in range %u..%u" msgstr "%s має бути в діапазоні %u..%u" -#: pg_test_fsync.c:205 +#: pg_test_fsync.c:211 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")" -#: pg_test_fsync.c:211 +#: pg_test_fsync.c:217 #, c-format msgid "%u second per test\n" msgid_plural "%u seconds per test\n" @@ -87,122 +98,122 @@ msgstr[1] "%u Ñекунди на теÑÑ‚\n" msgstr[2] "%u Ñекунд на теÑÑ‚\n" msgstr[3] "%u Ñекунд на теÑÑ‚\n" -#: pg_test_fsync.c:216 +#: pg_test_fsync.c:222 #, c-format msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" msgstr "O_DIRECT на цій платформі підтримуєтьÑÑ Ð´Ð»Ñ open_datasync Ñ– open_sync.\n" -#: pg_test_fsync.c:218 +#: pg_test_fsync.c:224 #, c-format msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" msgstr "F_NOCACHE підтримуєтьÑÑ Ð½Ð° цій платформі Ð´Ð»Ñ open_datasync Ñ– open_sync.\n" -#: pg_test_fsync.c:220 +#: pg_test_fsync.c:226 #, c-format msgid "Direct I/O is not supported on this platform.\n" msgstr "ПрÑме введеннÑ/Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð½Ðµ підтримуєтьÑÑ Ð½Ð° цій платформі.\n" -#: pg_test_fsync.c:245 pg_test_fsync.c:336 pg_test_fsync.c:361 -#: pg_test_fsync.c:385 pg_test_fsync.c:529 pg_test_fsync.c:541 -#: pg_test_fsync.c:557 pg_test_fsync.c:563 pg_test_fsync.c:585 +#: pg_test_fsync.c:251 pg_test_fsync.c:341 pg_test_fsync.c:363 +#: pg_test_fsync.c:387 pg_test_fsync.c:531 pg_test_fsync.c:543 +#: pg_test_fsync.c:559 pg_test_fsync.c:565 pg_test_fsync.c:587 msgid "could not open output file" msgstr "неможливо відкрити файл виводу" -#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:345 -#: pg_test_fsync.c:370 pg_test_fsync.c:394 pg_test_fsync.c:433 -#: pg_test_fsync.c:492 pg_test_fsync.c:531 pg_test_fsync.c:559 -#: pg_test_fsync.c:590 +#: pg_test_fsync.c:255 pg_test_fsync.c:325 pg_test_fsync.c:350 +#: pg_test_fsync.c:372 pg_test_fsync.c:396 pg_test_fsync.c:435 +#: pg_test_fsync.c:494 pg_test_fsync.c:533 pg_test_fsync.c:561 +#: pg_test_fsync.c:592 msgid "write failed" msgstr "запиÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ вдалоÑÑ" -#: pg_test_fsync.c:253 pg_test_fsync.c:372 pg_test_fsync.c:396 -#: pg_test_fsync.c:533 pg_test_fsync.c:565 +#: pg_test_fsync.c:259 pg_test_fsync.c:374 pg_test_fsync.c:398 +#: pg_test_fsync.c:535 pg_test_fsync.c:567 msgid "fsync failed" msgstr "помилка fsync" -#: pg_test_fsync.c:292 +#: pg_test_fsync.c:298 #, c-format msgid "\n" "Compare file sync methods using one %dkB write:\n" msgstr "\n" "ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñ–Ð² Ñинхронізації файлу, викориÑтовуючи один Ð·Ð°Ð¿Ð¸Ñ %dkB:\n" -#: pg_test_fsync.c:294 +#: pg_test_fsync.c:300 #, c-format msgid "\n" "Compare file sync methods using two %dkB writes:\n" msgstr "\n" "ÐŸÐ¾Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñ–Ð² Ñинхронізації файлу, викориÑтовуючи два запиÑи %dkB: \n" -#: pg_test_fsync.c:295 +#: pg_test_fsync.c:301 #, c-format -msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n" -msgstr "(в порÑдку переваги Ð´Ð»Ñ wal_sync_method, окрім переваги fdatasync в Linux)\n" +msgid "(in \"wal_sync_method\" preference order, except fdatasync is Linux's default)\n" +msgstr "(в порÑдку переваги Ð´Ð»Ñ \"wal_sync_method\", окрім fdatasync за замовчуваннÑм в Linux)\n" -#: pg_test_fsync.c:306 pg_test_fsync.c:413 pg_test_fsync.c:480 +#: pg_test_fsync.c:312 pg_test_fsync.c:415 pg_test_fsync.c:482 msgid "n/a*" msgstr "н/д*" -#: pg_test_fsync.c:325 pg_test_fsync.c:351 pg_test_fsync.c:401 -#: pg_test_fsync.c:439 pg_test_fsync.c:498 +#: pg_test_fsync.c:331 pg_test_fsync.c:403 pg_test_fsync.c:441 +#: pg_test_fsync.c:500 msgid "n/a" msgstr "н/д" -#: pg_test_fsync.c:444 +#: pg_test_fsync.c:446 #, c-format msgid "* This file system and its mount options do not support direct\n" " I/O, e.g. ext4 in journaled mode.\n" msgstr "* Ð¦Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð° ÑиÑтема з поточними параметрами Ð¼Ð¾Ð½Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ підтримує\n" " прÑме введеннÑ/виведеннÑ, наприклад, ext4 в режимі журналюваннÑ.\n" -#: pg_test_fsync.c:452 +#: pg_test_fsync.c:454 #, c-format msgid "\n" "Compare open_sync with different write sizes:\n" msgstr "\n" "ПорівнÑÐ½Ð½Ñ open_sync з різними розмірами запиÑуваннÑ:\n" -#: pg_test_fsync.c:453 +#: pg_test_fsync.c:455 #, c-format msgid "(This is designed to compare the cost of writing 16kB in different write\n" "open_sync sizes.)\n" msgstr "(Це Ñтворено Ð´Ð»Ñ Ð¿Ð¾Ñ€Ñ–Ð²Ð½ÑÐ½Ð½Ñ Ð²Ð°Ñ€Ñ‚Ð¾Ñті запиÑу 16 КБ з різними розмірами\n" "запиÑÑƒÐ²Ð°Ð½Ð½Ñ open_sync.)\n" -#: pg_test_fsync.c:456 +#: pg_test_fsync.c:458 msgid " 1 * 16kB open_sync write" msgstr " Ð·Ð°Ð¿Ð¸Ñ Ð· open_sync 1 * 16 КБ" -#: pg_test_fsync.c:457 +#: pg_test_fsync.c:459 msgid " 2 * 8kB open_sync writes" msgstr " Ð·Ð°Ð¿Ð¸Ñ Ð· open_sync 2 * 8 КБ" -#: pg_test_fsync.c:458 +#: pg_test_fsync.c:460 msgid " 4 * 4kB open_sync writes" msgstr " Ð·Ð°Ð¿Ð¸Ñ Ð· open_sync 4 * 4 КБ" -#: pg_test_fsync.c:459 +#: pg_test_fsync.c:461 msgid " 8 * 2kB open_sync writes" msgstr " Ð·Ð°Ð¿Ð¸Ñ Ð· open_sync 8 * 2 КБ" -#: pg_test_fsync.c:460 +#: pg_test_fsync.c:462 msgid "16 * 1kB open_sync writes" msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð· open_sync 16 * 1 КБ" -#: pg_test_fsync.c:514 +#: pg_test_fsync.c:516 #, c-format msgid "\n" "Test if fsync on non-write file descriptor is honored:\n" msgstr "\n" "Перевірка, чи здійÑнюєтьÑÑ fsync з деÑкриптором файлу, відкритого не Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу:\n" -#: pg_test_fsync.c:515 +#: pg_test_fsync.c:517 #, c-format msgid "(If the times are similar, fsync() can sync data written on a different\n" "descriptor.)\n" msgstr "(Якщо Ñ‡Ð°Ñ Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ð¸Ð¹, fsync() може Ñинхронізувати дані, запиÑані іншим деÑкриптором.)\n" -#: pg_test_fsync.c:580 +#: pg_test_fsync.c:582 #, c-format msgid "\n" "Non-sync'ed %dkB writes:\n" diff --git a/src/bin/pg_test_fsync/po/zh_TW.po b/src/bin/pg_test_fsync/po/zh_TW.po new file mode 100644 index 0000000000000..2a7853543d5ee --- /dev/null +++ b/src/bin/pg_test_fsync/po/zh_TW.po @@ -0,0 +1,221 @@ +# Traditional Chinese message translation file for pg_test_fsync +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_test_fsync (PostgreSQL) package. +# Zhenbang Wei , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_test_fsync (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-11 20:52+0000\n" +"PO-Revision-Date: 2023-11-06 08:49+0800\n" +"Last-Translator: Zhenbang Wei \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.4.1\n" + +# libpq/be-secure.c:294 libpq/be-secure.c:387 +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "錯誤: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "警告: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "詳細內容: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "æç¤º: " + +#. translator: maintain alignment with NA_FORMAT +#: pg_test_fsync.c:32 +#, c-format +msgid "%13.3f ops/sec %6.0f usecs/op\n" +msgstr "%13.3f ops/sec %6.0f usecs/op\n" + +#: pg_test_fsync.c:50 +#, c-format +msgid "could not create thread for alarm" +msgstr "無法為警報建立執行緒" + +#: pg_test_fsync.c:95 +#, c-format +msgid "%s: %m" +msgstr "%s: %m" + +#: pg_test_fsync.c:159 +#, c-format +msgid "Usage: %s [-f FILENAME] [-s SECS-PER-TEST]\n" +msgstr "用法: %s [-f FILENAME] [-s SECS-PER-TEST]\n" + +#: pg_test_fsync.c:185 +#, c-format +msgid "invalid argument for option %s" +msgstr "é¸é … %s çš„åƒæ•¸ç„¡æ•ˆ" + +# tcop/postgres.c:2636 tcop/postgres.c:2652 +#: pg_test_fsync.c:186 pg_test_fsync.c:198 pg_test_fsync.c:207 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "用 \"%s --help\" å–得更多資訊。" + +#: pg_test_fsync.c:192 +#, c-format +msgid "%s must be in range %u..%u" +msgstr "%s å¿…é ˆåœ¨ç¯„åœ %u..%u å…§" + +#: pg_test_fsync.c:205 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "å‘½ä»¤åˆ—åƒæ•¸éŽå¤š(第一個是 \"%s\")" + +#: pg_test_fsync.c:211 +#, c-format +msgid "%u second per test\n" +msgid_plural "%u seconds per test\n" +msgstr[0] "æ¯å€‹æ¸¬è©¦ %u ç§’\n" + +#: pg_test_fsync.c:216 +#, c-format +msgid "O_DIRECT supported on this platform for open_datasync and open_sync.\n" +msgstr "此平臺的 open_datasync å’Œ open_sync æ”¯æ´ O_DIRECT。\n" + +#: pg_test_fsync.c:218 +#, c-format +msgid "F_NOCACHE supported on this platform for open_datasync and open_sync.\n" +msgstr "此平臺的 open_datasync å’Œ open_sync æ”¯æ´ F_NOCACHE。\n" + +#: pg_test_fsync.c:220 +#, c-format +msgid "Direct I/O is not supported on this platform.\n" +msgstr "æ­¤å¹³è‡ºä¸æ”¯æ´ç›´æŽ¥ I/O。\n" + +#: pg_test_fsync.c:245 pg_test_fsync.c:335 pg_test_fsync.c:357 +#: pg_test_fsync.c:381 pg_test_fsync.c:525 pg_test_fsync.c:537 +#: pg_test_fsync.c:553 pg_test_fsync.c:559 pg_test_fsync.c:581 +msgid "could not open output file" +msgstr "無法開啟輸出檔" + +#: pg_test_fsync.c:249 pg_test_fsync.c:319 pg_test_fsync.c:344 +#: pg_test_fsync.c:366 pg_test_fsync.c:390 pg_test_fsync.c:429 +#: pg_test_fsync.c:488 pg_test_fsync.c:527 pg_test_fsync.c:555 +#: pg_test_fsync.c:586 +msgid "write failed" +msgstr "寫入失敗" + +#: pg_test_fsync.c:253 pg_test_fsync.c:368 pg_test_fsync.c:392 +#: pg_test_fsync.c:529 pg_test_fsync.c:561 +msgid "fsync failed" +msgstr "fsync 失敗" + +#: pg_test_fsync.c:292 +#, c-format +msgid "" +"\n" +"Compare file sync methods using one %dkB write:\n" +msgstr "" +"\n" +"比較使用一個 %dkB å¯«å…¥çš„æª”æ¡ˆåŒæ­¥æ–¹å¼:\n" + +#: pg_test_fsync.c:294 +#, c-format +msgid "" +"\n" +"Compare file sync methods using two %dkB writes:\n" +msgstr "" +"\n" +"比較使用兩個 %dkB å¯«å…¥çš„æª”æ¡ˆåŒæ­¥æ–¹å¼:\n" + +#: pg_test_fsync.c:295 +#, c-format +msgid "(in wal_sync_method preference order, except fdatasync is Linux's default)\n" +msgstr "(按照 wal_sync_method 的優先順åºï¼Œé™¤äº† fdatasync 是 Linux çš„é è¨­é¸é …)\n" + +#: pg_test_fsync.c:306 pg_test_fsync.c:409 pg_test_fsync.c:476 +msgid "n/a*" +msgstr "n/a*" + +#: pg_test_fsync.c:325 pg_test_fsync.c:397 pg_test_fsync.c:435 +#: pg_test_fsync.c:494 +msgid "n/a" +msgstr "n/a" + +#: pg_test_fsync.c:440 +#, c-format +msgid "" +"* This file system and its mount options do not support direct\n" +" I/O, e.g. ext4 in journaled mode.\n" +msgstr "* 這個檔案系統åŠå…¶æŽ›è¼‰é¸é …䏿”¯æ´ç›´æŽ¥ I/O,例如 ext4 的日誌模å¼ã€‚\n" + +#: pg_test_fsync.c:448 +#, c-format +msgid "" +"\n" +"Compare open_sync with different write sizes:\n" +msgstr "" +"\n" +"比較使用ä¸åŒå¯«å…¥å¤§å°çš„ open_sync:\n" + +#: pg_test_fsync.c:449 +#, c-format +msgid "" +"(This is designed to compare the cost of writing 16kB in different write\n" +"open_sync sizes.)\n" +msgstr "(這是為了比較在ä¸åŒçš„ open_sync 寫入大å°ä¸‹å¯«å…¥ 16kB çš„æˆæœ¬è€Œè¨­è¨ˆçš„。)\n" + +#: pg_test_fsync.c:452 +msgid " 1 * 16kB open_sync write" +msgstr " 1 * 16kB open_sync 寫入" + +#: pg_test_fsync.c:453 +msgid " 2 * 8kB open_sync writes" +msgstr " 2 * 8kB open_sync 寫入" + +#: pg_test_fsync.c:454 +msgid " 4 * 4kB open_sync writes" +msgstr " 4 * 4kB open_sync 寫入" + +#: pg_test_fsync.c:455 +msgid " 8 * 2kB open_sync writes" +msgstr " 8 * 2kB open_sync 寫入" + +#: pg_test_fsync.c:456 +msgid "16 * 1kB open_sync writes" +msgstr "16 * 1kB open_sync 寫入" + +#: pg_test_fsync.c:510 +#, c-format +msgid "" +"\n" +"Test if fsync on non-write file descriptor is honored:\n" +msgstr "" +"\n" +"測試 fsync éžå¯«å…¥æª”案æè¿°ç¬¦æ˜¯å¦è¢«å°Šé‡:\n" + +#: pg_test_fsync.c:511 +#, c-format +msgid "" +"(If the times are similar, fsync() can sync data written on a different\n" +"descriptor.)\n" +msgstr "(如果時間相近,fsync() å¯ä»¥åŒæ­¥è¢«å¯«å…¥ä¸åŒæè¿°ç¬¦çš„資料。)\n" + +#: pg_test_fsync.c:576 +#, c-format +msgid "" +"\n" +"Non-sync'ed %dkB writes:\n" +msgstr "" +"\n" +"ä¸ä½¿ç”¨åŒæ­¥çš„ %dkB 寫入:\n" diff --git a/src/bin/pg_test_fsync/t/001_basic.pl b/src/bin/pg_test_fsync/t/001_basic.pl index 401ad2c07ca95..e9d2e5261dfe6 100644 --- a/src/bin/pg_test_fsync/t/001_basic.pl +++ b/src/bin/pg_test_fsync/t/001_basic.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_test_timing/Makefile b/src/bin/pg_test_timing/Makefile index 84d84c38aa86d..7f677edadb30f 100644 --- a/src/bin/pg_test_timing/Makefile +++ b/src/bin/pg_test_timing/Makefile @@ -31,6 +31,6 @@ installcheck: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_test_timing$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_test_timing$(X) $(OBJS) rm -rf tmp_check diff --git a/src/bin/pg_test_timing/meson.build b/src/bin/pg_test_timing/meson.build index 02f4a5c641ef7..6dd3274d697bb 100644 --- a/src/bin/pg_test_timing/meson.build +++ b/src/bin/pg_test_timing/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_test_timing_sources = files( 'pg_test_timing.c' diff --git a/src/bin/pg_test_timing/nls.mk b/src/bin/pg_test_timing/nls.mk index 331931c591f7d..c1255db64cd8f 100644 --- a/src/bin/pg_test_timing/nls.mk +++ b/src/bin/pg_test_timing/nls.mk @@ -1,3 +1,3 @@ # src/bin/pg_test_timing/nls.mk CATALOG_NAME = pg_test_timing -GETTEXT_FILES = pg_test_timing.c +GETTEXT_FILES = pg_test_timing.c ../../common/fe_memutils.c diff --git a/src/bin/pg_test_timing/po/LINGUAS b/src/bin/pg_test_timing/po/LINGUAS index 312956920df20..4cc8bed767c42 100644 --- a/src/bin/pg_test_timing/po/LINGUAS +++ b/src/bin/pg_test_timing/po/LINGUAS @@ -1 +1 @@ -cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN +cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN zh_TW diff --git a/src/bin/pg_test_timing/po/de.po b/src/bin/pg_test_timing/po/de.po index 6bcbc73064caf..288d7e6af2dea 100644 --- a/src/bin/pg_test_timing/po/de.po +++ b/src/bin/pg_test_timing/po/de.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_test_timing (PostgreSQL) 13\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-04-12 14:17+0000\n" +"POT-Creation-Date: 2024-06-16 07:51+0000\n" "PO-Revision-Date: 2021-04-12 16:37+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" @@ -18,6 +18,17 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "Speicher aufgebraucht\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" + #: pg_test_timing.c:59 #, c-format msgid "Usage: %s [-d DURATION]\n" diff --git a/src/bin/pg_test_timing/po/es.po b/src/bin/pg_test_timing/po/es.po index 47cb27d9a0f69..c8de0f2c870c4 100644 --- a/src/bin/pg_test_timing/po/es.po +++ b/src/bin/pg_test_timing/po/es.po @@ -7,10 +7,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_test_timing (PostgreSQL) 16\n" +"Project-Id-Version: pg_test_timing (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:19+0000\n" -"PO-Revision-Date: 2023-05-22 12:06+0200\n" +"POT-Creation-Date: 2025-02-16 19:50+0000\n" +"PO-Revision-Date: 2024-11-16 14:24+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -20,6 +20,17 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Poedit 2.4.2\n" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "memoria agotada\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "no se puede duplicar un puntero nulo (error interno)\n" + #: pg_test_timing.c:59 #, c-format msgid "Usage: %s [-d DURATION]\n" diff --git a/src/bin/pg_test_timing/po/fr.po b/src/bin/pg_test_timing/po/fr.po index f97ebee84bdce..3be64c4b32ae5 100644 --- a/src/bin/pg_test_timing/po/fr.po +++ b/src/bin/pg_test_timing/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-12 05:16+0000\n" -"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"POT-Creation-Date: 2024-08-22 10:20+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,7 +19,18 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "mémoire épuisée\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" #: pg_test_timing.c:59 #, c-format @@ -85,6 +96,3 @@ msgstr "nombre" #, c-format msgid "Histogram of timing durations:\n" msgstr "Histogramme des durées de chronométrage\n" - -#~ msgid "%s: duration must be a positive integer (duration is \"%d\")\n" -#~ msgstr "%s : la durée doit être un entier positif (la durée est « %d »)\n" diff --git a/src/bin/pg_test_timing/po/ja.po b/src/bin/pg_test_timing/po/ja.po index 6a34b3d4b9701..b20da6b9d4ddb 100644 --- a/src/bin/pg_test_timing/po/ja.po +++ b/src/bin/pg_test_timing/po/ja.po @@ -1,11 +1,11 @@ # LANGUAGE message translation file for pg_test_timing -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_test_timing (PostgreSQL) package. # FIRST AUTHOR , 2018. # msgid "" msgstr "" -"Project-Id-Version: pg_test_timing (PostgreSQL 16)\n" +"Project-Id-Version: pg_test_timing (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-07-14 10:48+0900\n" "PO-Revision-Date: 2022-05-10 15:27+0900\n" diff --git a/src/bin/pg_test_timing/po/ka.po b/src/bin/pg_test_timing/po/ka.po index a472b6c8bd75e..6fb64047ee36c 100644 --- a/src/bin/pg_test_timing/po/ka.po +++ b/src/bin/pg_test_timing/po/ka.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_test_timing (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-02 04:48+0000\n" +"POT-Creation-Date: 2024-07-01 03:51+0000\n" "PO-Revision-Date: 2022-07-04 11:40+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" @@ -18,6 +18,17 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.1\n" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" + #: pg_test_timing.c:59 #, c-format msgid "Usage: %s [-d DURATION]\n" diff --git a/src/bin/pg_test_timing/po/ko.po b/src/bin/pg_test_timing/po/ko.po index a0a7527b003ef..69ac14f128670 100644 --- a/src/bin/pg_test_timing/po/ko.po +++ b/src/bin/pg_test_timing/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_test_timing (PostgreSQL) 12\n" +"Project-Id-Version: pg_test_timing (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-02-09 20:15+0000\n" -"PO-Revision-Date: 2020-02-10 09:59+0900\n" +"POT-Creation-Date: 2025-01-17 04:50+0000\n" +"PO-Revision-Date: 2025-01-16 11:07+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -17,61 +17,77 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: pg_test_timing.c:55 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "메모리 부족\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ë„ í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" + +#: pg_test_timing.c:59 #, c-format msgid "Usage: %s [-d DURATION]\n" msgstr "사용법: %s [-d 간격]\n" -#: pg_test_timing.c:75 pg_test_timing.c:87 pg_test_timing.c:104 +#: pg_test_timing.c:81 +#, c-format +msgid "%s: invalid argument for option %s\n" +msgstr "%s: %s ì˜µì…˜ì˜ ìž˜ëª»ëœ ì¸ìž\n" + +#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "ë” ìžì„¸í•œ 정보는 \"%s --help\" ëª…ë ¹ì„ ì´ìš©í•˜ì„¸ìš”.\n" -#: pg_test_timing.c:85 +#: pg_test_timing.c:90 #, c-format -msgid "%s: too many command-line arguments (first is \"%s\")\n" -msgstr "%s: 너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 사용했습니다 (ì‹œìž‘ì€ \"%s\")\n" +msgid "%s: %s must be in range %u..%u\n" +msgstr "%s: %s ê°’ì€ %u부터 %u까지 지정할 수 있습니다.\n" -#: pg_test_timing.c:94 +#: pg_test_timing.c:107 #, c-format -msgid "Testing timing overhead for %d second.\n" -msgid_plural "Testing timing overhead for %d seconds.\n" -msgstr[0] "%dì´ˆ ë™ì•ˆ 타ì´ë° ì˜¤ë²„í•´ë” ê²€ì‚¬.\n" +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: 너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 사용했습니다 (ì‹œìž‘ì€ \"%s\")\n" -#: pg_test_timing.c:102 +#: pg_test_timing.c:115 #, c-format -msgid "%s: duration must be a positive integer (duration is \"%d\")\n" -msgstr "%s: ê°„ê²©ì€ ì–‘ìˆ˜ì—¬ì•¼ 합니다. (간격: \"%d\")\n" +msgid "Testing timing overhead for %u second.\n" +msgid_plural "Testing timing overhead for %u seconds.\n" +msgstr[0] "%uì´ˆ ë™ì•ˆ 타ì´ë° ì˜¤ë²„í•´ë” ê²€ì‚¬.\n" -#: pg_test_timing.c:140 +#: pg_test_timing.c:151 #, c-format msgid "Detected clock going backwards in time.\n" msgstr "거꾸로 í른 ê°ì§€ëœ í´ëŸ­.\n" -#: pg_test_timing.c:141 +#: pg_test_timing.c:152 #, c-format msgid "Time warp: %d ms\n" msgstr "간격: %d ms\n" -#: pg_test_timing.c:164 +#: pg_test_timing.c:175 #, c-format msgid "Per loop time including overhead: %0.2f ns\n" msgstr "오버헤ë”를 í¬í•¨í•œ 루프 시간: %0.2f ns\n" -#: pg_test_timing.c:175 +#: pg_test_timing.c:186 msgid "< us" msgstr "< us" -#: pg_test_timing.c:176 +#: pg_test_timing.c:187 #, no-c-format msgid "% of total" msgstr "% of total" -#: pg_test_timing.c:177 +#: pg_test_timing.c:188 msgid "count" msgstr "회" -#: pg_test_timing.c:186 +#: pg_test_timing.c:197 #, c-format msgid "Histogram of timing durations:\n" msgstr "타ì´ë° 간견 히스토그램:\n" diff --git a/src/bin/pg_test_timing/po/meson.build b/src/bin/pg_test_timing/po/meson.build index 7bc84d5c7ff7d..7bf27e012bdec 100644 --- a/src/bin/pg_test_timing/po/meson.build +++ b/src/bin/pg_test_timing/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_test_timing-' + pg_version_major.to_string())] diff --git a/src/bin/pg_test_timing/po/pt_BR.po b/src/bin/pg_test_timing/po/pt_BR.po index 9cd9ded0eb218..3737734a56dc6 100644 --- a/src/bin/pg_test_timing/po/pt_BR.po +++ b/src/bin/pg_test_timing/po/pt_BR.po @@ -1,16 +1,16 @@ # Brazilian Portuguese message translation file for pg_test_timing # -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2023 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # -# Euler Taveira , 2022. +# Euler Taveira , 2023-2024. # msgid "" msgstr "" "Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-27 13:15-0300\n" -"PO-Revision-Date: 2022-09-27 18:43-0300\n" +"POT-Creation-Date: 2024-01-02 13:02-0300\n" +"PO-Revision-Date: 2023-09-27 18:43-0300\n" "Last-Translator: Euler Taveira \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" diff --git a/src/bin/pg_test_timing/po/ru.po b/src/bin/pg_test_timing/po/ru.po index 2bc6ad39144d8..6fdaef839baae 100644 --- a/src/bin/pg_test_timing/po/ru.po +++ b/src/bin/pg_test_timing/po/ru.po @@ -1,21 +1,32 @@ # Russian message translation file for pg_test_timing # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2017, 2021. +# Alexander Lakhin , 2017, 2021, 2024. msgid "" msgstr "" "Project-Id-Version: pg_test_timing (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-08-14 06:29+0300\n" -"PO-Revision-Date: 2021-09-04 12:18+0300\n" +"POT-Creation-Date: 2024-09-02 09:29+0300\n" +"PO-Revision-Date: 2024-09-04 19:59+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "нехватка памÑти\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" #: pg_test_timing.c:59 #, c-format diff --git a/src/bin/pg_test_timing/po/sv.po b/src/bin/pg_test_timing/po/sv.po index 92c130dced6c3..d1fcae77547e8 100644 --- a/src/bin/pg_test_timing/po/sv.po +++ b/src/bin/pg_test_timing/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_test_timing # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020, 2021. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-11-06 17:16+0000\n" -"PO-Revision-Date: 2021-11-06 21:59+0100\n" +"POT-Creation-Date: 2024-07-12 14:21+0000\n" +"PO-Revision-Date: 2024-07-12 19:07+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,6 +17,17 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "slut pÃ¥ minne\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kan inte duplicera null-pekare (internt fel)\n" + #: pg_test_timing.c:59 #, c-format msgid "Usage: %s [-d DURATION]\n" diff --git a/src/bin/pg_test_timing/po/uk.po b/src/bin/pg_test_timing/po/uk.po index 53135933aa4bf..52837fbbda2c1 100644 --- a/src/bin/pg_test_timing/po/uk.po +++ b/src/bin/pg_test_timing/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:49+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:21+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,19 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pg_test_timing.pot\n" -"X-Crowdin-File-ID: 912\n" +"X-Crowdin-File: /REL_17_STABLE/pg_test_timing.pot\n" +"X-Crowdin-File-ID: 1002\n" + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "недоÑтатньо пам'Ñті\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" #: pg_test_timing.c:59 #, c-format diff --git a/src/bin/pg_test_timing/po/zh_TW.po b/src/bin/pg_test_timing/po/zh_TW.po new file mode 100644 index 0000000000000..762938782f218 --- /dev/null +++ b/src/bin/pg_test_timing/po/zh_TW.po @@ -0,0 +1,84 @@ +# Traditional Chinese message translation file for pg_test_timing +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_test_timing (PostgreSQL) package. +# Zhenbang Wei , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_test_timing (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-11 20:49+0000\n" +"PO-Revision-Date: 2023-11-06 08:50+0800\n" +"Last-Translator: Zhenbang Wei \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.4.1\n" + +#: pg_test_timing.c:59 +#, c-format +msgid "Usage: %s [-d DURATION]\n" +msgstr "用法: %s [-d DURATION]\n" + +#: pg_test_timing.c:81 +#, c-format +msgid "%s: invalid argument for option %s\n" +msgstr "%s: é¸é … %s çš„åƒæ•¸ç„¡æ•ˆ\n" + +# postmaster/postmaster.c:512 postmaster/postmaster.c:525 +#: pg_test_timing.c:83 pg_test_timing.c:97 pg_test_timing.c:109 +#, c-format +msgid "Try \"%s --help\" for more information.\n" +msgstr "用 \"%s --help\" å–得更多資訊。\n" + +#: pg_test_timing.c:90 +#, c-format +msgid "%s: %s must be in range %u..%u\n" +msgstr "%s: %s å¿…é ˆåœ¨ç¯„åœ %u..%u å…§\n" + +#: pg_test_timing.c:107 +#, c-format +msgid "%s: too many command-line arguments (first is \"%s\")\n" +msgstr "%s: å‘½ä»¤åˆ—åƒæ•¸éŽå¤š(第一個是 \"%s\")\n" + +#: pg_test_timing.c:115 +#, c-format +msgid "Testing timing overhead for %u second.\n" +msgid_plural "Testing timing overhead for %u seconds.\n" +msgstr[0] "測試 %u 秒的計時é¡å¤–負擔。\n" + +#: pg_test_timing.c:151 +#, c-format +msgid "Detected clock going backwards in time.\n" +msgstr "嵿¸¬åˆ°æ™‚é˜æ™‚間倒退。\n" + +#: pg_test_timing.c:152 +#, c-format +msgid "Time warp: %d ms\n" +msgstr "時間扭曲: %d 毫秒\n" + +#: pg_test_timing.c:175 +#, c-format +msgid "Per loop time including overhead: %0.2f ns\n" +msgstr "æ¯å€‹å¾ªç’°æ™‚間,包括é¡å¤–è² æ“”: %0.2f ns\n" + +#: pg_test_timing.c:186 +msgid "< us" +msgstr "< us" + +#: pg_test_timing.c:187 +#, no-c-format +msgid "% of total" +msgstr "佔總數 %" + +#: pg_test_timing.c:188 +msgid "count" +msgstr "次數" + +#: pg_test_timing.c:197 +#, c-format +msgid "Histogram of timing durations:\n" +msgstr "計時期間的 histogram:\n" diff --git a/src/bin/pg_test_timing/t/001_basic.pl b/src/bin/pg_test_timing/t/001_basic.pl index 43bc68cb37de3..e472954b14e3b 100644 --- a/src/bin/pg_test_timing/t/001_basic.pl +++ b/src/bin/pg_test_timing/t/001_basic.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_upgrade/IMPLEMENTATION b/src/bin/pg_upgrade/IMPLEMENTATION index 229399a45ae05..f47deee90c14e 100644 --- a/src/bin/pg_upgrade/IMPLEMENTATION +++ b/src/bin/pg_upgrade/IMPLEMENTATION @@ -48,9 +48,9 @@ HOW IT WORKS To use pg_upgrade during an upgrade, start by installing a fresh cluster using the newest version in a new directory. When you've finished installation, the new cluster will contain the new executables -and the usual template0, template1, and postgres, but no user-defined -tables. At this point, you can shut down the old and new postmasters and -invoke pg_upgrade. +and the usual template0, template1, and postgres databases, but no +user-defined tables. At this point, you can shut down the old and new +postmasters and invoke pg_upgrade. When pg_upgrade starts, it ensures that all required executables are present and contain the expected version numbers. The verification diff --git a/src/bin/pg_upgrade/Makefile b/src/bin/pg_upgrade/Makefile index 5834513add407..bde91e2beb82c 100644 --- a/src/bin/pg_upgrade/Makefile +++ b/src/bin/pg_upgrade/Makefile @@ -3,6 +3,9 @@ PGFILEDESC = "pg_upgrade - an in-place binary upgrade utility" PGAPPICON = win32 +# required for 003_upgrade_logical_replication_slots.pl +EXTRA_INSTALL=contrib/test_decoding + subdir = src/bin/pg_upgrade top_builddir = ../../.. include $(top_builddir)/src/Makefile.global @@ -46,7 +49,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_upgrade$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_upgrade$(X) $(OBJS) rm -rf delete_old_cluster.sh log/ tmp_check/ \ reindex_hash.sql diff --git a/src/bin/pg_upgrade/TESTING b/src/bin/pg_upgrade/TESTING index 81a4324a76d58..00842ac6ec3ab 100644 --- a/src/bin/pg_upgrade/TESTING +++ b/src/bin/pg_upgrade/TESTING @@ -20,8 +20,8 @@ export oldinstall=...otherversion/ (old version's install base path) See DETAILS below for more information about creation of the dump. You can also test the different transfer modes (--copy, --link, ---clone) by setting the environment variable PG_TEST_PG_UPGRADE_MODE -to the respective command-line option, like +--clone, --copy-file-range) by setting the environment variable +PG_TEST_PG_UPGRADE_MODE to the respective command-line option, like make check PG_TEST_PG_UPGRADE_MODE=--link diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c index 64024e3b9ec00..1cf84cc1bb5e3 100644 --- a/src/bin/pg_upgrade/check.c +++ b/src/bin/pg_upgrade/check.c @@ -3,13 +3,14 @@ * * server checks and output routines * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/check.c */ #include "postgres_fe.h" #include "catalog/pg_authid_d.h" +#include "catalog/pg_class_d.h" #include "catalog/pg_collation.h" #include "fe_utils/string_utils.h" #include "mb/pg_wchar.h" @@ -23,14 +24,507 @@ static void check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster); static void check_for_user_defined_postfix_ops(ClusterInfo *cluster); static void check_for_incompatible_polymorphics(ClusterInfo *cluster); static void check_for_tables_with_oids(ClusterInfo *cluster); -static void check_for_composite_data_type_usage(ClusterInfo *cluster); -static void check_for_reg_data_type_usage(ClusterInfo *cluster); -static void check_for_aclitem_data_type_usage(ClusterInfo *cluster); -static void check_for_jsonb_9_4_usage(ClusterInfo *cluster); static void check_for_pg_role_prefix(ClusterInfo *cluster); -static void check_for_new_tablespace_dir(ClusterInfo *new_cluster); +static void check_for_new_tablespace_dir(void); static void check_for_user_defined_encoding_conversions(ClusterInfo *cluster); +static void check_new_cluster_logical_replication_slots(void); +static void check_new_cluster_subscription_configuration(void); +static void check_old_cluster_for_valid_slots(bool live_check); +static void check_old_cluster_subscription_state(void); +/* + * DataTypesUsageChecks - definitions of data type checks for the old cluster + * in order to determine if an upgrade can be performed. See the comment on + * data_types_usage_checks below for a more detailed description. + */ +typedef struct +{ + /* Status line to print to the user */ + const char *status; + /* Filename to store report to */ + const char *report_filename; + /* Query to extract the oid of the datatype */ + const char *base_query; + /* Text to store to report in case of error */ + const char *report_text; + /* The latest version where the check applies */ + int threshold_version; + /* A function pointer for determining if the check applies */ + DataTypesUsageVersionCheck version_hook; +} DataTypesUsageChecks; + +/* + * Special values for threshold_version for indicating that a check applies to + * all versions, or that a custom function needs to be invoked to determine + * if the check applies. + */ +#define MANUAL_CHECK 1 +#define ALL_VERSIONS -1 + +/*-- + * Data type usage checks. Each check for problematic data type usage is + * defined in this array with metadata, SQL query for finding the data type + * and functionality for deciding if the check is applicable to the version + * of the old cluster. The struct members are described in detail below: + * + * status A oneline string which can be printed to the user to + * inform about progress. Should not end with newline. + * report_filename The filename in which the list of problems detected by + * the check will be printed. + * base_query A query which extracts the Oid of the datatype checked + * for. + * report_text The text which will be printed to the user to explain + * what the check did, and why it failed. The text should + * end with a newline, and does not need to refer to the + * report_filename as that is automatically appended to + * the report with the path to the log folder. + * threshold_version The major version of PostgreSQL for which to run the + * check. Iff the old cluster is less than, or equal to, + * the threshold version then the check will be executed. + * If the old version is greater than the threshold then + * the check is skipped. If the threshold_version is set + * to ALL_VERSIONS then it will be run unconditionally, + * if set to MANUAL_CHECK then the version_hook function + * will be executed in order to determine whether or not + * to run. + * version_hook A function pointer to a version check function of type + * DataTypesUsageVersionCheck which is used to determine + * if the check is applicable to the old cluster. If the + * version_hook returns true then the check will be run, + * else it will be skipped. The function will only be + * executed iff threshold_version is set to MANUAL_CHECK. + */ +static DataTypesUsageChecks data_types_usage_checks[] = +{ + /* + * Look for composite types that were made during initdb *or* belong to + * information_schema; that's important in case information_schema was + * dropped and reloaded. + * + * The cutoff OID here should match the source cluster's value of + * FirstNormalObjectId. We hardcode it rather than using that C #define + * because, if that #define is ever changed, our own version's value is + * NOT what to use. Eventually we may need a test on the source cluster's + * version to select the correct value. + */ + { + .status = gettext_noop("Checking for system-defined composite types in user tables"), + .report_filename = "tables_using_composite.txt", + .base_query = + "SELECT t.oid FROM pg_catalog.pg_type t " + "LEFT JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid " + " WHERE typtype = 'c' AND (t.oid < 16384 OR nspname = 'information_schema')", + .report_text = + gettext_noop("Your installation contains system-defined composite types in user tables.\n" + "These type OIDs are not stable across PostgreSQL versions,\n" + "so this cluster cannot currently be upgraded. You can drop the\n" + "problem columns and restart the upgrade.\n"), + .threshold_version = ALL_VERSIONS + }, + + /* + * 9.3 -> 9.4 Fully implement the 'line' data type in 9.4, which + * previously returned "not enabled" by default and was only functionally + * enabled with a compile-time switch; as of 9.4 "line" has a different + * on-disk representation format. + */ + { + .status = gettext_noop("Checking for incompatible \"line\" data type"), + .report_filename = "tables_using_line.txt", + .base_query = + "SELECT 'pg_catalog.line'::pg_catalog.regtype AS oid", + .report_text = + gettext_noop("Your installation contains the \"line\" data type in user tables.\n" + "This data type changed its internal and input/output format\n" + "between your old and new versions so this\n" + "cluster cannot currently be upgraded. You can\n" + "drop the problem columns and restart the upgrade.\n"), + .threshold_version = 903 + }, + + /* + * pg_upgrade only preserves these system values: pg_class.oid pg_type.oid + * pg_enum.oid + * + * Many of the reg* data types reference system catalog info that is not + * preserved, and hence these data types cannot be used in user tables + * upgraded by pg_upgrade. + */ + { + .status = gettext_noop("Checking for reg* data types in user tables"), + .report_filename = "tables_using_reg.txt", + + /* + * Note: older servers will not have all of these reg* types, so we + * have to write the query like this rather than depending on casts to + * regtype. + */ + .base_query = + "SELECT oid FROM pg_catalog.pg_type t " + "WHERE t.typnamespace = " + " (SELECT oid FROM pg_catalog.pg_namespace " + " WHERE nspname = 'pg_catalog') " + " AND t.typname IN ( " + /* pg_class.oid is preserved, so 'regclass' is OK */ + " 'regcollation', " + " 'regconfig', " + " 'regdictionary', " + " 'regnamespace', " + " 'regoper', " + " 'regoperator', " + " 'regproc', " + " 'regprocedure' " + /* pg_authid.oid is preserved, so 'regrole' is OK */ + /* pg_type.oid is (mostly) preserved, so 'regtype' is OK */ + " )", + .report_text = + gettext_noop("Your installation contains one of the reg* data types in user tables.\n" + "These data types reference system OIDs that are not preserved by\n" + "pg_upgrade, so this cluster cannot currently be upgraded. You can\n" + "drop the problem columns and restart the upgrade.\n"), + .threshold_version = ALL_VERSIONS + }, + + /* + * PG 16 increased the size of the 'aclitem' type, which breaks the + * on-disk format for existing data. + */ + { + .status = gettext_noop("Checking for incompatible \"aclitem\" data type"), + .report_filename = "tables_using_aclitem.txt", + .base_query = + "SELECT 'pg_catalog.aclitem'::pg_catalog.regtype AS oid", + .report_text = + gettext_noop("Your installation contains the \"aclitem\" data type in user tables.\n" + "The internal format of \"aclitem\" changed in PostgreSQL version 16\n" + "so this cluster cannot currently be upgraded. You can drop the\n" + "problem columns and restart the upgrade.\n"), + .threshold_version = 1500 + }, + + /* + * It's no longer allowed to create tables or views with "unknown"-type + * columns. We do not complain about views with such columns, because + * they should get silently converted to "text" columns during the DDL + * dump and reload; it seems unlikely to be worth making users do that by + * hand. However, if there's a table with such a column, the DDL reload + * will fail, so we should pre-detect that rather than failing + * mid-upgrade. Worse, if there's a matview with such a column, the DDL + * reload will silently change it to "text" which won't match the on-disk + * storage (which is like "cstring"). So we *must* reject that. + */ + { + .status = gettext_noop("Checking for invalid \"unknown\" user columns"), + .report_filename = "tables_using_unknown.txt", + .base_query = + "SELECT 'pg_catalog.unknown'::pg_catalog.regtype AS oid", + .report_text = + gettext_noop("Your installation contains the \"unknown\" data type in user tables.\n" + "This data type is no longer allowed in tables, so this cluster\n" + "cannot currently be upgraded. You can drop the problem columns\n" + "and restart the upgrade.\n"), + .threshold_version = 906 + }, + + /* + * PG 12 changed the 'sql_identifier' type storage to be based on name, + * not varchar, which breaks on-disk format for existing data. So we need + * to prevent upgrade when used in user objects (tables, indexes, ...). In + * 12, the sql_identifier data type was switched from name to varchar, + * which does affect the storage (name is by-ref, but not varlena). This + * means user tables using sql_identifier for columns are broken because + * the on-disk format is different. + */ + { + .status = gettext_noop("Checking for invalid \"sql_identifier\" user columns"), + .report_filename = "tables_using_sql_identifier.txt", + .base_query = + "SELECT 'information_schema.sql_identifier'::pg_catalog.regtype AS oid", + .report_text = + gettext_noop("Your installation contains the \"sql_identifier\" data type in user tables.\n" + "The on-disk format for this data type has changed, so this\n" + "cluster cannot currently be upgraded. You can drop the problem\n" + "columns and restart the upgrade.\n"), + .threshold_version = 1100 + }, + + /* + * JSONB changed its storage format during 9.4 beta, so check for it. + */ + { + .status = gettext_noop("Checking for incompatible \"jsonb\" data type in user tables"), + .report_filename = "tables_using_jsonb.txt", + .base_query = + "SELECT 'pg_catalog.jsonb'::pg_catalog.regtype AS oid", + .report_text = + gettext_noop("Your installation contains the \"jsonb\" data type in user tables.\n" + "The internal format of \"jsonb\" changed during 9.4 beta so this\n" + "cluster cannot currently be upgraded. You can drop the problem \n" + "columns and restart the upgrade.\n"), + .threshold_version = MANUAL_CHECK, + .version_hook = jsonb_9_4_check_applicable + }, + + /* + * PG 12 removed types abstime, reltime, tinterval. + */ + { + .status = gettext_noop("Checking for removed \"abstime\" data type in user tables"), + .report_filename = "tables_using_abstime.txt", + .base_query = + "SELECT 'pg_catalog.abstime'::pg_catalog.regtype AS oid", + .report_text = + gettext_noop("Your installation contains the \"abstime\" data type in user tables.\n" + "The \"abstime\" type has been removed in PostgreSQL version 12,\n" + "so this cluster cannot currently be upgraded. You can drop the\n" + "problem columns, or change them to another data type, and restart\n" + "the upgrade.\n"), + .threshold_version = 1100 + }, + { + .status = gettext_noop("Checking for removed \"reltime\" data type in user tables"), + .report_filename = "tables_using_reltime.txt", + .base_query = + "SELECT 'pg_catalog.reltime'::pg_catalog.regtype AS oid", + .report_text = + gettext_noop("Your installation contains the \"reltime\" data type in user tables.\n" + "The \"reltime\" type has been removed in PostgreSQL version 12,\n" + "so this cluster cannot currently be upgraded. You can drop the\n" + "problem columns, or change them to another data type, and restart\n" + "the upgrade.\n"), + .threshold_version = 1100 + }, + { + .status = gettext_noop("Checking for removed \"tinterval\" data type in user tables"), + .report_filename = "tables_using_tinterval.txt", + .base_query = + "SELECT 'pg_catalog.tinterval'::pg_catalog.regtype AS oid", + .report_text = + gettext_noop("Your installation contains the \"tinterval\" data type in user tables.\n" + "The \"tinterval\" type has been removed in PostgreSQL version 12,\n" + "so this cluster cannot currently be upgraded. You can drop the\n" + "problem columns, or change them to another data type, and restart\n" + "the upgrade.\n"), + .threshold_version = 1100 + }, + + /* End of checks marker, must remain last */ + { + NULL, NULL, NULL, NULL, 0, NULL + } +}; + +/* + * check_for_data_types_usage() + * Detect whether there are any stored columns depending on given type(s) + * + * If so, write a report to the given file name and signal a failure to the + * user. + * + * The checks to run are defined in a DataTypesUsageChecks structure where + * each check has a metadata for explaining errors to the user, a base_query, + * a report filename and a function pointer hook for validating if the check + * should be executed given the cluster at hand. + * + * base_query should be a SELECT yielding a single column named "oid", + * containing the pg_type OIDs of one or more types that are known to have + * inconsistent on-disk representations across server versions. + * + * We check for the type(s) in tables, matviews, and indexes, but not views; + * there's no storage involved in a view. + */ +static void +check_for_data_types_usage(ClusterInfo *cluster, DataTypesUsageChecks *checks) +{ + bool found = false; + bool *results; + PQExpBufferData report; + DataTypesUsageChecks *tmp = checks; + int n_data_types_usage_checks = 0; + + prep_status("Checking data type usage"); + + /* Gather number of checks to perform */ + while (tmp->status != NULL) + { + n_data_types_usage_checks++; + tmp++; + } + + /* Prepare an array to store the results of checks in */ + results = pg_malloc0(sizeof(bool) * n_data_types_usage_checks); + + /* + * Connect to each database in the cluster and run all defined checks + * against that database before trying the next one. + */ + for (int dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++) + { + DbInfo *active_db = &cluster->dbarr.dbs[dbnum]; + PGconn *conn = connectToServer(cluster, active_db->db_name); + + for (int checknum = 0; checknum < n_data_types_usage_checks; checknum++) + { + PGresult *res; + int ntups; + int i_nspname; + int i_relname; + int i_attname; + FILE *script = NULL; + bool db_used = false; + char output_path[MAXPGPATH]; + DataTypesUsageChecks *cur_check = &checks[checknum]; + + if (cur_check->threshold_version == MANUAL_CHECK) + { + Assert(cur_check->version_hook); + + /* + * Make sure that the check applies to the current cluster + * version and skip if not. If no check hook has been defined + * we run the check for all versions. + */ + if (!cur_check->version_hook(cluster)) + continue; + } + else if (cur_check->threshold_version != ALL_VERSIONS) + { + if (GET_MAJOR_VERSION(cluster->major_version) > cur_check->threshold_version) + continue; + } + else + Assert(cur_check->threshold_version == ALL_VERSIONS); + + snprintf(output_path, sizeof(output_path), "%s/%s", + log_opts.basedir, + cur_check->report_filename); + + /* + * The type(s) of interest might be wrapped in a domain, array, + * composite, or range, and these container types can be nested + * (to varying extents depending on server version, but that's not + * of concern here). To handle all these cases we need a + * recursive CTE. + */ + res = executeQueryOrDie(conn, + "WITH RECURSIVE oids AS ( " + /* start with the type(s) returned by base_query */ + " %s " + " UNION ALL " + " SELECT * FROM ( " + /* inner WITH because we can only reference the CTE once */ + " WITH x AS (SELECT oid FROM oids) " + /* domains on any type selected so far */ + " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typbasetype = x.oid AND typtype = 'd' " + " UNION ALL " + /* arrays over any type selected so far */ + " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typelem = x.oid AND typtype = 'b' " + " UNION ALL " + /* composite types containing any type selected so far */ + " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_class c, pg_catalog.pg_attribute a, x " + " WHERE t.typtype = 'c' AND " + " t.oid = c.reltype AND " + " c.oid = a.attrelid AND " + " NOT a.attisdropped AND " + " a.atttypid = x.oid " + " UNION ALL " + /* ranges containing any type selected so far */ + " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_range r, x " + " WHERE t.typtype = 'r' AND r.rngtypid = t.oid AND r.rngsubtype = x.oid" + " ) foo " + ") " + /* now look for stored columns of any such type */ + "SELECT n.nspname, c.relname, a.attname " + "FROM pg_catalog.pg_class c, " + " pg_catalog.pg_namespace n, " + " pg_catalog.pg_attribute a " + "WHERE c.oid = a.attrelid AND " + " NOT a.attisdropped AND " + " a.atttypid IN (SELECT oid FROM oids) AND " + " c.relkind IN (" + CppAsString2(RELKIND_RELATION) ", " + CppAsString2(RELKIND_MATVIEW) ", " + CppAsString2(RELKIND_INDEX) ") AND " + " c.relnamespace = n.oid AND " + /* exclude possible orphaned temp tables */ + " n.nspname !~ '^pg_temp_' AND " + " n.nspname !~ '^pg_toast_temp_' AND " + /* exclude system catalogs, too */ + " n.nspname NOT IN ('pg_catalog', 'information_schema')", + cur_check->base_query); + + ntups = PQntuples(res); + + /* + * The datatype was found, so extract the data and log to the + * requested filename. We need to open the file for appending + * since the check might have already found the type in another + * database earlier in the loop. + */ + if (ntups) + { + /* + * Make sure we have a buffer to save reports to now that we + * found a first failing check. + */ + if (!found) + initPQExpBuffer(&report); + found = true; + + /* + * If this is the first time we see an error for the check in + * question then print a status message of the failure. + */ + if (!results[checknum]) + { + pg_log(PG_REPORT, "failed check: %s", _(cur_check->status)); + appendPQExpBuffer(&report, "\n%s\n%s %s\n", + _(cur_check->report_text), + _("A list of the problem columns is in the file:"), + output_path); + } + results[checknum] = true; + + i_nspname = PQfnumber(res, "nspname"); + i_relname = PQfnumber(res, "relname"); + i_attname = PQfnumber(res, "attname"); + + for (int rowno = 0; rowno < ntups; rowno++) + { + if (script == NULL && (script = fopen_priv(output_path, "a")) == NULL) + pg_fatal("could not open file \"%s\": %m", output_path); + + if (!db_used) + { + fprintf(script, "In database: %s\n", active_db->db_name); + db_used = true; + } + fprintf(script, " %s.%s.%s\n", + PQgetvalue(res, rowno, i_nspname), + PQgetvalue(res, rowno, i_relname), + PQgetvalue(res, rowno, i_attname)); + } + + if (script) + { + fclose(script); + script = NULL; + } + } + + PQclear(res); + } + + PQfinish(conn); + } + + if (found) + pg_fatal("Data type checks failed: %s", report.data); + + pg_free(results); + + check_ok(); +} /* * fix_path_separator @@ -86,8 +580,11 @@ check_and_dump_old_cluster(bool live_check) if (!live_check) start_postmaster(&old_cluster, true); - /* Extract a list of databases and tables from the old cluster */ - get_db_and_rel_infos(&old_cluster); + /* + * Extract a list of databases, tables, and logical replication slots from + * the old cluster. + */ + get_db_rel_and_slot_infos(&old_cluster, live_check); init_tablespaces(); @@ -100,16 +597,26 @@ check_and_dump_old_cluster(bool live_check) check_is_install_user(&old_cluster); check_proper_datallowconn(&old_cluster); check_for_prepared_transactions(&old_cluster); - check_for_composite_data_type_usage(&old_cluster); - check_for_reg_data_type_usage(&old_cluster); check_for_isn_and_int8_passing_mismatch(&old_cluster); - /* - * PG 16 increased the size of the 'aclitem' type, which breaks the - * on-disk format for existing data. - */ - if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1500) - check_for_aclitem_data_type_usage(&old_cluster); + if (GET_MAJOR_VERSION(old_cluster.major_version) >= 1700) + { + /* + * Logical replication slots can be migrated since PG17. See comments + * atop get_old_cluster_logical_slot_infos(). + */ + check_old_cluster_for_valid_slots(live_check); + + /* + * Subscriptions and their dependencies can be migrated since PG17. + * Before that the logical slots are not upgraded, so we will not be + * able to upgrade the logical replication clusters completely. + */ + get_subscription_count(&old_cluster); + check_old_cluster_subscription_state(); + } + + check_for_data_types_usage(&old_cluster, data_types_usage_checks); /* * PG 14 changed the function signature of encoding conversion functions. @@ -141,21 +648,12 @@ check_and_dump_old_cluster(bool live_check) if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100) check_for_tables_with_oids(&old_cluster); - /* - * PG 12 changed the 'sql_identifier' type storage to be based on name, - * not varchar, which breaks on-disk format for existing data. So we need - * to prevent upgrade when used in user objects (tables, indexes, ...). - */ - if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100) - old_11_check_for_sql_identifier_data_type_usage(&old_cluster); - /* * Pre-PG 10 allowed tables with 'unknown' type columns and non WAL logged * hash indexes */ if (GET_MAJOR_VERSION(old_cluster.major_version) <= 906) { - old_9_6_check_for_unknown_data_type_usage(&old_cluster); if (user_opts.check) old_9_6_invalidate_hash_indexes(&old_cluster, true); } @@ -164,14 +662,6 @@ check_and_dump_old_cluster(bool live_check) if (GET_MAJOR_VERSION(old_cluster.major_version) <= 905) check_for_pg_role_prefix(&old_cluster); - if (GET_MAJOR_VERSION(old_cluster.major_version) == 904 && - old_cluster.controldata.cat_ver < JSONB_FORMAT_CHANGE_CAT_VER) - check_for_jsonb_9_4_usage(&old_cluster); - - /* Pre-PG 9.4 had a different 'line' data type internal format */ - if (GET_MAJOR_VERSION(old_cluster.major_version) <= 903) - old_9_3_check_for_line_data_type_usage(&old_cluster); - /* * While not a check option, we do this now because this is the only time * the old server is running. @@ -187,7 +677,7 @@ check_and_dump_old_cluster(bool live_check) void check_new_cluster(void) { - get_db_and_rel_infos(&new_cluster); + get_db_rel_and_slot_infos(&new_cluster, false); check_new_cluster_is_empty(); @@ -200,6 +690,9 @@ check_new_cluster(void) break; case TRANSFER_MODE_COPY: break; + case TRANSFER_MODE_COPY_FILE_RANGE: + check_copy_file_range(); + break; case TRANSFER_MODE_LINK: check_hard_link(); break; @@ -209,7 +702,11 @@ check_new_cluster(void) check_for_prepared_transactions(&new_cluster); - check_for_new_tablespace_dir(&new_cluster); + check_for_new_tablespace_dir(); + + check_new_cluster_logical_replication_slots(); + + check_new_cluster_subscription_configuration(); } @@ -377,7 +874,7 @@ check_new_cluster_is_empty(void) * during schema restore. */ static void -check_for_new_tablespace_dir(ClusterInfo *new_cluster) +check_for_new_tablespace_dir(void) { int tblnum; char new_tablespace_dir[MAXPGPATH]; @@ -390,7 +887,7 @@ check_for_new_tablespace_dir(ClusterInfo *new_cluster) snprintf(new_tablespace_dir, MAXPGPATH, "%s%s", os_info.old_tablespaces[tblnum], - new_cluster->tablespace_suffix); + new_cluster.tablespace_suffix); if (stat(new_tablespace_dir, &statbuf) == 0 || errno != ENOENT) pg_fatal("new cluster tablespace directory already exists: \"%s\"", @@ -463,8 +960,8 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name) prep_status("Creating script to delete old cluster"); if ((script = fopen_priv(*deletion_script_file_name, "w")) == NULL) - pg_fatal("could not open file \"%s\": %s", - *deletion_script_file_name, strerror(errno)); + pg_fatal("could not open file \"%s\": %m", + *deletion_script_file_name); #ifndef WIN32 /* add shebang header */ @@ -514,8 +1011,8 @@ create_script_for_old_cluster_deletion(char **deletion_script_file_name) #ifndef WIN32 if (chmod(*deletion_script_file_name, S_IRWXU) != 0) - pg_fatal("could not add execute permission to file \"%s\": %s", - *deletion_script_file_name, strerror(errno)); + pg_fatal("could not add execute permission to file \"%s\": %m", + *deletion_script_file_name); #endif check_ok(); @@ -636,8 +1133,7 @@ check_proper_datallowconn(ClusterInfo *cluster) if (strcmp(datallowconn, "f") == 0) { if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) - pg_fatal("could not open file \"%s\": %s", - output_path, strerror(errno)); + pg_fatal("could not open file \"%s\": %m", output_path); fprintf(script, "%s\n", datname); } @@ -752,8 +1248,7 @@ check_for_isn_and_int8_passing_mismatch(ClusterInfo *cluster) for (rowno = 0; rowno < ntups; rowno++) { if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) - pg_fatal("could not open file \"%s\": %s", - output_path, strerror(errno)); + pg_fatal("could not open file \"%s\": %m", output_path); if (!db_used) { fprintf(script, "In database: %s\n", active_db->db_name); @@ -847,8 +1342,7 @@ check_for_user_defined_postfix_ops(ClusterInfo *cluster) { if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) - pg_fatal("could not open file \"%s\": %s", - output_path, strerror(errno)); + pg_fatal("could not open file \"%s\": %m", output_path); if (!db_used) { fprintf(script, "In database: %s\n", active_db->db_name); @@ -976,8 +1470,7 @@ check_for_incompatible_polymorphics(ClusterInfo *cluster) { if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) - pg_fatal("could not open file \"%s\": %s", - output_path, strerror(errno)); + pg_fatal("could not open file \"%s\": %m", output_path); if (!db_used) { fprintf(script, "In database: %s\n", active_db->db_name); @@ -1053,8 +1546,7 @@ check_for_tables_with_oids(ClusterInfo *cluster) for (rowno = 0; rowno < ntups; rowno++) { if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) - pg_fatal("could not open file \"%s\": %s", - output_path, strerror(errno)); + pg_fatal("could not open file \"%s\": %m", output_path); if (!db_used) { fprintf(script, "In database: %s\n", active_db->db_name); @@ -1085,184 +1577,6 @@ check_for_tables_with_oids(ClusterInfo *cluster) } -/* - * check_for_composite_data_type_usage() - * Check for system-defined composite types used in user tables. - * - * The OIDs of rowtypes of system catalogs and information_schema views - * can change across major versions; unlike user-defined types, we have - * no mechanism for forcing them to be the same in the new cluster. - * Hence, if any user table uses one, that's problematic for pg_upgrade. - */ -static void -check_for_composite_data_type_usage(ClusterInfo *cluster) -{ - bool found; - Oid firstUserOid; - char output_path[MAXPGPATH]; - char *base_query; - - prep_status("Checking for system-defined composite types in user tables"); - - snprintf(output_path, sizeof(output_path), "%s/%s", - log_opts.basedir, - "tables_using_composite.txt"); - - /* - * Look for composite types that were made during initdb *or* belong to - * information_schema; that's important in case information_schema was - * dropped and reloaded. - * - * The cutoff OID here should match the source cluster's value of - * FirstNormalObjectId. We hardcode it rather than using that C #define - * because, if that #define is ever changed, our own version's value is - * NOT what to use. Eventually we may need a test on the source cluster's - * version to select the correct value. - */ - firstUserOid = 16384; - - base_query = psprintf("SELECT t.oid FROM pg_catalog.pg_type t " - "LEFT JOIN pg_catalog.pg_namespace n ON t.typnamespace = n.oid " - " WHERE typtype = 'c' AND (t.oid < %u OR nspname = 'information_schema')", - firstUserOid); - - found = check_for_data_types_usage(cluster, base_query, output_path); - - free(base_query); - - if (found) - { - pg_log(PG_REPORT, "fatal"); - pg_fatal("Your installation contains system-defined composite type(s) in user tables.\n" - "These type OIDs are not stable across PostgreSQL versions,\n" - "so this cluster cannot currently be upgraded. You can\n" - "drop the problem columns and restart the upgrade.\n" - "A list of the problem columns is in the file:\n" - " %s", output_path); - } - else - check_ok(); -} - -/* - * check_for_reg_data_type_usage() - * pg_upgrade only preserves these system values: - * pg_class.oid - * pg_type.oid - * pg_enum.oid - * - * Many of the reg* data types reference system catalog info that is - * not preserved, and hence these data types cannot be used in user - * tables upgraded by pg_upgrade. - */ -static void -check_for_reg_data_type_usage(ClusterInfo *cluster) -{ - bool found; - char output_path[MAXPGPATH]; - - prep_status("Checking for reg* data types in user tables"); - - snprintf(output_path, sizeof(output_path), "%s/%s", - log_opts.basedir, - "tables_using_reg.txt"); - - /* - * Note: older servers will not have all of these reg* types, so we have - * to write the query like this rather than depending on casts to regtype. - */ - found = check_for_data_types_usage(cluster, - "SELECT oid FROM pg_catalog.pg_type t " - "WHERE t.typnamespace = " - " (SELECT oid FROM pg_catalog.pg_namespace " - " WHERE nspname = 'pg_catalog') " - " AND t.typname IN ( " - /* pg_class.oid is preserved, so 'regclass' is OK */ - " 'regcollation', " - " 'regconfig', " - " 'regdictionary', " - " 'regnamespace', " - " 'regoper', " - " 'regoperator', " - " 'regproc', " - " 'regprocedure' " - /* pg_authid.oid is preserved, so 'regrole' is OK */ - /* pg_type.oid is (mostly) preserved, so 'regtype' is OK */ - " )", - output_path); - - if (found) - { - pg_log(PG_REPORT, "fatal"); - pg_fatal("Your installation contains one of the reg* data types in user tables.\n" - "These data types reference system OIDs that are not preserved by\n" - "pg_upgrade, so this cluster cannot currently be upgraded. You can\n" - "drop the problem columns and restart the upgrade.\n" - "A list of the problem columns is in the file:\n" - " %s", output_path); - } - else - check_ok(); -} - -/* - * check_for_aclitem_data_type_usage - * - * aclitem changed its storage format in 16, so check for it. - */ -static void -check_for_aclitem_data_type_usage(ClusterInfo *cluster) -{ - char output_path[MAXPGPATH]; - - prep_status("Checking for incompatible \"aclitem\" data type in user tables"); - - snprintf(output_path, sizeof(output_path), "tables_using_aclitem.txt"); - - if (check_for_data_type_usage(cluster, "pg_catalog.aclitem", output_path)) - { - pg_log(PG_REPORT, "fatal"); - pg_fatal("Your installation contains the \"aclitem\" data type in user tables.\n" - "The internal format of \"aclitem\" changed in PostgreSQL version 16\n" - "so this cluster cannot currently be upgraded. You can drop the\n" - "problem columns and restart the upgrade. A list of the problem\n" - "columns is in the file:\n" - " %s", output_path); - } - else - check_ok(); -} - -/* - * check_for_jsonb_9_4_usage() - * - * JSONB changed its storage format during 9.4 beta, so check for it. - */ -static void -check_for_jsonb_9_4_usage(ClusterInfo *cluster) -{ - char output_path[MAXPGPATH]; - - prep_status("Checking for incompatible \"jsonb\" data type"); - - snprintf(output_path, sizeof(output_path), "%s/%s", - log_opts.basedir, - "tables_using_jsonb.txt"); - - if (check_for_data_type_usage(cluster, "pg_catalog.jsonb", output_path)) - { - pg_log(PG_REPORT, "fatal"); - pg_fatal("Your installation contains the \"jsonb\" data type in user tables.\n" - "The internal format of \"jsonb\" changed during 9.4 beta so this\n" - "cluster cannot currently be upgraded. You can\n" - "drop the problem columns and restart the upgrade.\n" - "A list of the problem columns is in the file:\n" - " %s", output_path); - } - else - check_ok(); -} - /* * check_for_pg_role_prefix() * @@ -1296,8 +1610,7 @@ check_for_pg_role_prefix(ClusterInfo *cluster) for (int rowno = 0; rowno < ntups; rowno++) { if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) - pg_fatal("could not open file \"%s\": %s", - output_path, strerror(errno)); + pg_fatal("could not open file \"%s\": %m", output_path); fprintf(script, "%s (oid=%s)\n", PQgetvalue(res, rowno, i_rolname), PQgetvalue(res, rowno, i_roloid)); @@ -1370,8 +1683,7 @@ check_for_user_defined_encoding_conversions(ClusterInfo *cluster) { if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) - pg_fatal("could not open file \"%s\": %s", - output_path, strerror(errno)); + pg_fatal("could not open file \"%s\": %m", output_path); if (!db_used) { fprintf(script, "In database: %s\n", active_db->db_name); @@ -1402,3 +1714,317 @@ check_for_user_defined_encoding_conversions(ClusterInfo *cluster) else check_ok(); } + +/* + * check_new_cluster_logical_replication_slots() + * + * Verify that there are no logical replication slots on the new cluster and + * that the parameter settings necessary for creating slots are sufficient. + */ +static void +check_new_cluster_logical_replication_slots(void) +{ + PGresult *res; + PGconn *conn; + int nslots_on_old; + int nslots_on_new; + int max_replication_slots; + char *wal_level; + + /* Logical slots can be migrated since PG17. */ + if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1600) + return; + + nslots_on_old = count_old_cluster_logical_slots(); + + /* Quick return if there are no logical slots to be migrated. */ + if (nslots_on_old == 0) + return; + + conn = connectToServer(&new_cluster, "template1"); + + prep_status("Checking for new cluster logical replication slots"); + + res = executeQueryOrDie(conn, "SELECT count(*) " + "FROM pg_catalog.pg_replication_slots " + "WHERE slot_type = 'logical' AND " + "temporary IS FALSE;"); + + if (PQntuples(res) != 1) + pg_fatal("could not count the number of logical replication slots"); + + nslots_on_new = atoi(PQgetvalue(res, 0, 0)); + + if (nslots_on_new) + pg_fatal("expected 0 logical replication slots but found %d", + nslots_on_new); + + PQclear(res); + + res = executeQueryOrDie(conn, "SELECT setting FROM pg_settings " + "WHERE name IN ('wal_level', 'max_replication_slots') " + "ORDER BY name DESC;"); + + if (PQntuples(res) != 2) + pg_fatal("could not determine parameter settings on new cluster"); + + wal_level = PQgetvalue(res, 0, 0); + + if (strcmp(wal_level, "logical") != 0) + pg_fatal("\"wal_level\" must be \"logical\" but is set to \"%s\"", + wal_level); + + max_replication_slots = atoi(PQgetvalue(res, 1, 0)); + + if (nslots_on_old > max_replication_slots) + pg_fatal("\"max_replication_slots\" (%d) must be greater than or equal to the number of " + "logical replication slots (%d) on the old cluster", + max_replication_slots, nslots_on_old); + + PQclear(res); + PQfinish(conn); + + check_ok(); +} + +/* + * check_new_cluster_subscription_configuration() + * + * Verify that the max_replication_slots configuration specified is enough for + * creating the subscriptions. This is required to create the replication + * origin for each subscription. + */ +static void +check_new_cluster_subscription_configuration(void) +{ + PGresult *res; + PGconn *conn; + int max_replication_slots; + + /* Subscriptions and their dependencies can be migrated since PG17. */ + if (GET_MAJOR_VERSION(old_cluster.major_version) < 1700) + return; + + /* Quick return if there are no subscriptions to be migrated. */ + if (old_cluster.nsubs == 0) + return; + + prep_status("Checking for new cluster configuration for subscriptions"); + + conn = connectToServer(&new_cluster, "template1"); + + res = executeQueryOrDie(conn, "SELECT setting FROM pg_settings " + "WHERE name = 'max_replication_slots';"); + + if (PQntuples(res) != 1) + pg_fatal("could not determine parameter settings on new cluster"); + + max_replication_slots = atoi(PQgetvalue(res, 0, 0)); + if (old_cluster.nsubs > max_replication_slots) + pg_fatal("\"max_replication_slots\" (%d) must be greater than or equal to the number of " + "subscriptions (%d) on the old cluster", + max_replication_slots, old_cluster.nsubs); + + PQclear(res); + PQfinish(conn); + + check_ok(); +} + +/* + * check_old_cluster_for_valid_slots() + * + * Verify that all the logical slots are valid and have consumed all the WAL + * before shutdown. + */ +static void +check_old_cluster_for_valid_slots(bool live_check) +{ + char output_path[MAXPGPATH]; + FILE *script = NULL; + + prep_status("Checking for valid logical replication slots"); + + snprintf(output_path, sizeof(output_path), "%s/%s", + log_opts.basedir, + "invalid_logical_slots.txt"); + + for (int dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++) + { + LogicalSlotInfoArr *slot_arr = &old_cluster.dbarr.dbs[dbnum].slot_arr; + + for (int slotnum = 0; slotnum < slot_arr->nslots; slotnum++) + { + LogicalSlotInfo *slot = &slot_arr->slots[slotnum]; + + /* Is the slot usable? */ + if (slot->invalid) + { + if (script == NULL && + (script = fopen_priv(output_path, "w")) == NULL) + pg_fatal("could not open file \"%s\": %m", output_path); + + fprintf(script, "The slot \"%s\" is invalid\n", + slot->slotname); + + continue; + } + + /* + * Do additional check to ensure that all logical replication + * slots have consumed all the WAL before shutdown. + * + * Note: This can be satisfied only when the old cluster has been + * shut down, so we skip this for live checks. + */ + if (!live_check && !slot->caught_up) + { + if (script == NULL && + (script = fopen_priv(output_path, "w")) == NULL) + pg_fatal("could not open file \"%s\": %m", output_path); + + fprintf(script, + "The slot \"%s\" has not consumed the WAL yet\n", + slot->slotname); + } + } + } + + if (script) + { + fclose(script); + + pg_log(PG_REPORT, "fatal"); + pg_fatal("Your installation contains logical replication slots that cannot be upgraded.\n" + "You can remove invalid slots and/or consume the pending WAL for other slots,\n" + "and then restart the upgrade.\n" + "A list of the problematic slots is in the file:\n" + " %s", output_path); + } + + check_ok(); +} + +/* + * check_old_cluster_subscription_state() + * + * Verify that the replication origin corresponding to each of the + * subscriptions are present and each of the subscribed tables is in + * 'i' (initialize) or 'r' (ready) state. + */ +static void +check_old_cluster_subscription_state(void) +{ + FILE *script = NULL; + char output_path[MAXPGPATH]; + int ntup; + + prep_status("Checking for subscription state"); + + snprintf(output_path, sizeof(output_path), "%s/%s", + log_opts.basedir, + "subs_invalid.txt"); + for (int dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++) + { + PGresult *res; + DbInfo *active_db = &old_cluster.dbarr.dbs[dbnum]; + PGconn *conn = connectToServer(&old_cluster, active_db->db_name); + + /* We need to check for pg_replication_origin only once. */ + if (dbnum == 0) + { + /* + * Check that all the subscriptions have their respective + * replication origin. + */ + res = executeQueryOrDie(conn, + "SELECT d.datname, s.subname " + "FROM pg_catalog.pg_subscription s " + "LEFT OUTER JOIN pg_catalog.pg_replication_origin o " + " ON o.roname = 'pg_' || s.oid " + "INNER JOIN pg_catalog.pg_database d " + " ON d.oid = s.subdbid " + "WHERE o.roname IS NULL;"); + + ntup = PQntuples(res); + for (int i = 0; i < ntup; i++) + { + if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) + pg_fatal("could not open file \"%s\": %m", output_path); + fprintf(script, "The replication origin is missing for database:\"%s\" subscription:\"%s\"\n", + PQgetvalue(res, i, 0), + PQgetvalue(res, i, 1)); + } + PQclear(res); + } + + /* + * We don't allow upgrade if there is a risk of dangling slot or + * origin corresponding to initial sync after upgrade. + * + * A slot/origin not created yet refers to the 'i' (initialize) state, + * while 'r' (ready) state refers to a slot/origin created previously + * but already dropped. These states are supported for pg_upgrade. The + * other states listed below are not supported: + * + * a) SUBREL_STATE_DATASYNC: A relation upgraded while in this state + * would retain a replication slot, which could not be dropped by the + * sync worker spawned after the upgrade because the subscription ID + * used for the slot name won't match anymore. + * + * b) SUBREL_STATE_SYNCDONE: A relation upgraded while in this state + * would retain the replication origin when there is a failure in + * tablesync worker immediately after dropping the replication slot in + * the publisher. + * + * c) SUBREL_STATE_FINISHEDCOPY: A tablesync worker spawned to work on + * a relation upgraded while in this state would expect an origin ID + * with the OID of the subscription used before the upgrade, causing + * it to fail. + * + * d) SUBREL_STATE_SYNCWAIT, SUBREL_STATE_CATCHUP and + * SUBREL_STATE_UNKNOWN: These states are not stored in the catalog, + * so we need not allow these states. + */ + res = executeQueryOrDie(conn, + "SELECT r.srsubstate, s.subname, n.nspname, c.relname " + "FROM pg_catalog.pg_subscription_rel r " + "LEFT JOIN pg_catalog.pg_subscription s" + " ON r.srsubid = s.oid " + "LEFT JOIN pg_catalog.pg_class c" + " ON r.srrelid = c.oid " + "LEFT JOIN pg_catalog.pg_namespace n" + " ON c.relnamespace = n.oid " + "WHERE r.srsubstate NOT IN ('i', 'r') " + "ORDER BY s.subname"); + + ntup = PQntuples(res); + for (int i = 0; i < ntup; i++) + { + if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) + pg_fatal("could not open file \"%s\": %m", output_path); + + fprintf(script, "The table sync state \"%s\" is not allowed for database:\"%s\" subscription:\"%s\" schema:\"%s\" relation:\"%s\"\n", + PQgetvalue(res, i, 0), + active_db->db_name, + PQgetvalue(res, i, 1), + PQgetvalue(res, i, 2), + PQgetvalue(res, i, 3)); + } + + PQclear(res); + PQfinish(conn); + } + + if (script) + { + fclose(script); + pg_log(PG_REPORT, "fatal"); + pg_fatal("Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n" + "You can allow the initial sync to finish for all relations and then restart the upgrade.\n" + "A list of the problematic subscriptions is in the file:\n" + " %s", output_path); + } + else + check_ok(); +} diff --git a/src/bin/pg_upgrade/controldata.c b/src/bin/pg_upgrade/controldata.c index 9071a6fd457b2..1f0ccea3ed19b 100644 --- a/src/bin/pg_upgrade/controldata.c +++ b/src/bin/pg_upgrade/controldata.c @@ -3,7 +3,7 @@ * * controldata functions * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/controldata.c */ @@ -11,8 +11,8 @@ #include -#include "pg_upgrade.h" #include "common/string.h" +#include "pg_upgrade.h" /* @@ -126,8 +126,7 @@ get_control_data(ClusterInfo *cluster, bool live_check) fflush(NULL); if ((output = popen(cmd, "r")) == NULL) - pg_fatal("could not get control data using %s: %s", - cmd, strerror(errno)); + pg_fatal("could not get control data using %s: %m", cmd); /* we have the result of cmd in "output". so parse it line by line now */ while (fgets(bufin, sizeof(bufin), output)) @@ -149,22 +148,23 @@ get_control_data(ClusterInfo *cluster, bool live_check) * the server was shut down cleanly, from the controldata * perspective. */ - /* remove leading spaces */ + /* Remove trailing newline and leading spaces */ + (void) pg_strip_crlf(p); while (*p == ' ') p++; - if (strcmp(p, "shut down in recovery\n") == 0) + if (strcmp(p, "shut down in recovery") == 0) { if (cluster == &old_cluster) pg_fatal("The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."); else pg_fatal("The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary."); } - else if (strcmp(p, "shut down\n") != 0) + else if (strcmp(p, "shut down") != 0) { if (cluster == &old_cluster) - pg_fatal("The source cluster was not shut down cleanly."); + pg_fatal("The source cluster was not shut down cleanly, state reported as: \"%s\"", p); else - pg_fatal("The target cluster was not shut down cleanly."); + pg_fatal("The target cluster was not shut down cleanly, state reported as: \"%s\"", p); } got_cluster_state = true; } @@ -196,8 +196,7 @@ get_control_data(ClusterInfo *cluster, bool live_check) fflush(NULL); if ((output = popen(cmd, "r")) == NULL) - pg_fatal("could not get control data using %s: %s", - cmd, strerror(errno)); + pg_fatal("could not get control data using %s: %m", cmd); /* Only in <= 9.2 */ if (GET_MAJOR_VERSION(cluster->major_version) <= 902) diff --git a/src/bin/pg_upgrade/dump.c b/src/bin/pg_upgrade/dump.c index 6c8c82dca89a1..29fb45b928923 100644 --- a/src/bin/pg_upgrade/dump.c +++ b/src/bin/pg_upgrade/dump.c @@ -3,7 +3,7 @@ * * dump functions * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/dump.c */ diff --git a/src/bin/pg_upgrade/exec.c b/src/bin/pg_upgrade/exec.c index 5b2edebe413ee..058530ab3e9e6 100644 --- a/src/bin/pg_upgrade/exec.c +++ b/src/bin/pg_upgrade/exec.c @@ -3,7 +3,7 @@ * * execution functions * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/exec.c */ @@ -44,8 +44,7 @@ get_bin_version(ClusterInfo *cluster) if ((output = popen(cmd, "r")) == NULL || fgets(cmd_output, sizeof(cmd_output), output) == NULL) - pg_fatal("could not get pg_ctl version data using %s: %s", - cmd, strerror(errno)); + pg_fatal("could not get pg_ctl version data using %s: %m", cmd); rc = pclose(output); if (rc != 0) @@ -242,8 +241,7 @@ pid_lock_file_exists(const char *datadir) { /* ENOTDIR means we will throw a more useful error later */ if (errno != ENOENT && errno != ENOTDIR) - pg_fatal("could not open file \"%s\" for reading: %s", - path, strerror(errno)); + pg_fatal("could not open file \"%s\" for reading: %m", path); return false; } @@ -322,8 +320,8 @@ check_single_dir(const char *pg_data, const char *subdir) subdir); if (stat(subDirName, &statBuf) != 0) - report_status(PG_FATAL, "check for \"%s\" failed: %s", - subDirName, strerror(errno)); + report_status(PG_FATAL, "check for \"%s\" failed: %m", + subDirName); else if (!S_ISDIR(statBuf.st_mode)) report_status(PG_FATAL, "\"%s\" is not a directory", subDirName); @@ -388,8 +386,8 @@ check_bin_dir(ClusterInfo *cluster, bool check_versions) /* check bindir */ if (stat(cluster->bindir, &statBuf) != 0) - report_status(PG_FATAL, "check for \"%s\" failed: %s", - cluster->bindir, strerror(errno)); + report_status(PG_FATAL, "check for \"%s\" failed: %m", + cluster->bindir); else if (!S_ISDIR(statBuf.st_mode)) report_status(PG_FATAL, "\"%s\" is not a directory", cluster->bindir); @@ -431,7 +429,7 @@ static void check_exec(const char *dir, const char *program, bool check_version) { char path[MAXPGPATH]; - char line[MAXPGPATH]; + char *line; char cmd[MAXPGPATH]; char versionstr[128]; @@ -442,7 +440,7 @@ check_exec(const char *dir, const char *program, bool check_version) snprintf(cmd, sizeof(cmd), "\"%s\" -V", path); - if (!pipe_read_line(cmd, line, sizeof(line))) + if ((line = pipe_read_line(cmd)) == NULL) pg_fatal("check for \"%s\" failed: cannot execute", path); @@ -456,4 +454,6 @@ check_exec(const char *dir, const char *program, bool check_version) pg_fatal("check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"", path, line, versionstr); } + + pg_free(line); } diff --git a/src/bin/pg_upgrade/file.c b/src/bin/pg_upgrade/file.c index d1736028826f0..73932504caefa 100644 --- a/src/bin/pg_upgrade/file.c +++ b/src/bin/pg_upgrade/file.c @@ -3,13 +3,14 @@ * * file system operations * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/file.c */ #include "postgres_fe.h" #include +#include #include #ifdef HAVE_COPYFILE_H #include @@ -40,20 +41,20 @@ cloneFile(const char *src, const char *dst, { #if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE) if (copyfile(src, dst, NULL, COPYFILE_CLONE_FORCE) < 0) - pg_fatal("error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s", - schemaName, relName, src, dst, strerror(errno)); + pg_fatal("error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %m", + schemaName, relName, src, dst); #elif defined(__linux__) && defined(FICLONE) int src_fd; int dest_fd; if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0) - pg_fatal("error while cloning relation \"%s.%s\": could not open file \"%s\": %s", - schemaName, relName, src, strerror(errno)); + pg_fatal("error while cloning relation \"%s.%s\": could not open file \"%s\": %m", + schemaName, relName, src); if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, pg_file_create_mode)) < 0) - pg_fatal("error while cloning relation \"%s.%s\": could not create file \"%s\": %s", - schemaName, relName, dst, strerror(errno)); + pg_fatal("error while cloning relation \"%s.%s\": could not create file \"%s\": %m", + schemaName, relName, dst); if (ioctl(dest_fd, FICLONE, src_fd) < 0) { @@ -87,13 +88,13 @@ copyFile(const char *src, const char *dst, char *buffer; if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0) - pg_fatal("error while copying relation \"%s.%s\": could not open file \"%s\": %s", - schemaName, relName, src, strerror(errno)); + pg_fatal("error while copying relation \"%s.%s\": could not open file \"%s\": %m", + schemaName, relName, src); if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, pg_file_create_mode)) < 0) - pg_fatal("error while copying relation \"%s.%s\": could not create file \"%s\": %s", - schemaName, relName, dst, strerror(errno)); + pg_fatal("error while copying relation \"%s.%s\": could not create file \"%s\": %m", + schemaName, relName, dst); /* copy in fairly large chunks for best efficiency */ #define COPY_BUF_SIZE (50 * BLCKSZ) @@ -106,8 +107,8 @@ copyFile(const char *src, const char *dst, ssize_t nbytes = read(src_fd, buffer, COPY_BUF_SIZE); if (nbytes < 0) - pg_fatal("error while copying relation \"%s.%s\": could not read file \"%s\": %s", - schemaName, relName, src, strerror(errno)); + pg_fatal("error while copying relation \"%s.%s\": could not read file \"%s\": %m", + schemaName, relName, src); if (nbytes == 0) break; @@ -118,8 +119,8 @@ copyFile(const char *src, const char *dst, /* if write didn't set errno, assume problem is no disk space */ if (errno == 0) errno = ENOSPC; - pg_fatal("error while copying relation \"%s.%s\": could not write file \"%s\": %s", - schemaName, relName, dst, strerror(errno)); + pg_fatal("error while copying relation \"%s.%s\": could not write file \"%s\": %m", + schemaName, relName, dst); } } @@ -132,14 +133,53 @@ copyFile(const char *src, const char *dst, if (CopyFile(src, dst, true) == 0) { _dosmaperr(GetLastError()); - pg_fatal("error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s", - schemaName, relName, src, dst, strerror(errno)); + pg_fatal("error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %m", + schemaName, relName, src, dst); } #endif /* WIN32 */ } +/* + * copyFileByRange() + * + * Copies a relation file from src to dst. + * schemaName/relName are relation's SQL name (used for error messages only). + */ +void +copyFileByRange(const char *src, const char *dst, + const char *schemaName, const char *relName) +{ +#ifdef HAVE_COPY_FILE_RANGE + int src_fd; + int dest_fd; + ssize_t nbytes; + + if ((src_fd = open(src, O_RDONLY | PG_BINARY, 0)) < 0) + pg_fatal("error while copying relation \"%s.%s\": could not open file \"%s\": %m", + schemaName, relName, src); + + if ((dest_fd = open(dst, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, + pg_file_create_mode)) < 0) + pg_fatal("error while copying relation \"%s.%s\": could not create file \"%s\": %m", + schemaName, relName, dst); + + do + { + nbytes = copy_file_range(src_fd, NULL, dest_fd, NULL, SSIZE_MAX, 0); + if (nbytes < 0) + pg_fatal("error while copying relation \"%s.%s\": could not copy file range from \"%s\" to \"%s\": %m", + schemaName, relName, src, dst); + } + while (nbytes > 0); + + close(src_fd); + close(dest_fd); +#endif +} + + /* * linkFile() * @@ -151,8 +191,8 @@ linkFile(const char *src, const char *dst, const char *schemaName, const char *relName) { if (link(src, dst) < 0) - pg_fatal("error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s", - schemaName, relName, src, dst, strerror(errno)); + pg_fatal("error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %m", + schemaName, relName, src, dst); } @@ -190,17 +230,17 @@ rewriteVisibilityMap(const char *fromfile, const char *tofile, rewriteVmBytesPerPage = (BLCKSZ - SizeOfPageHeaderData) / 2; if ((src_fd = open(fromfile, O_RDONLY | PG_BINARY, 0)) < 0) - pg_fatal("error while copying relation \"%s.%s\": could not open file \"%s\": %s", - schemaName, relName, fromfile, strerror(errno)); + pg_fatal("error while copying relation \"%s.%s\": could not open file \"%s\": %m", + schemaName, relName, fromfile); if (fstat(src_fd, &statbuf) != 0) - pg_fatal("error while copying relation \"%s.%s\": could not stat file \"%s\": %s", - schemaName, relName, fromfile, strerror(errno)); + pg_fatal("error while copying relation \"%s.%s\": could not stat file \"%s\": %m", + schemaName, relName, fromfile); if ((dst_fd = open(tofile, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, pg_file_create_mode)) < 0) - pg_fatal("error while copying relation \"%s.%s\": could not create file \"%s\": %s", - schemaName, relName, tofile, strerror(errno)); + pg_fatal("error while copying relation \"%s.%s\": could not create file \"%s\": %m", + schemaName, relName, tofile); /* Save old file size */ src_filesize = statbuf.st_size; @@ -223,8 +263,8 @@ rewriteVisibilityMap(const char *fromfile, const char *tofile, if ((bytesRead = read(src_fd, buffer.data, BLCKSZ)) != BLCKSZ) { if (bytesRead < 0) - pg_fatal("error while copying relation \"%s.%s\": could not read file \"%s\": %s", - schemaName, relName, fromfile, strerror(errno)); + pg_fatal("error while copying relation \"%s.%s\": could not read file \"%s\": %m", + schemaName, relName, fromfile); else pg_fatal("error while copying relation \"%s.%s\": partial page found in file \"%s\"", schemaName, relName, fromfile); @@ -301,8 +341,8 @@ rewriteVisibilityMap(const char *fromfile, const char *tofile, /* if write didn't set errno, assume problem is no disk space */ if (errno == 0) errno = ENOSPC; - pg_fatal("error while copying relation \"%s.%s\": could not write file \"%s\": %s", - schemaName, relName, tofile, strerror(errno)); + pg_fatal("error while copying relation \"%s.%s\": could not write file \"%s\": %m", + schemaName, relName, tofile); } /* Advance for next new page */ @@ -328,25 +368,23 @@ check_file_clone(void) #if defined(HAVE_COPYFILE) && defined(COPYFILE_CLONE_FORCE) if (copyfile(existing_file, new_link_file, NULL, COPYFILE_CLONE_FORCE) < 0) - pg_fatal("could not clone file between old and new data directories: %s", - strerror(errno)); + pg_fatal("could not clone file between old and new data directories: %m"); #elif defined(__linux__) && defined(FICLONE) { int src_fd; int dest_fd; if ((src_fd = open(existing_file, O_RDONLY | PG_BINARY, 0)) < 0) - pg_fatal("could not open file \"%s\": %s", - existing_file, strerror(errno)); + pg_fatal("could not open file \"%s\": %m", + existing_file); if ((dest_fd = open(new_link_file, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, pg_file_create_mode)) < 0) - pg_fatal("could not create file \"%s\": %s", - new_link_file, strerror(errno)); + pg_fatal("could not create file \"%s\": %m", + new_link_file); if (ioctl(dest_fd, FICLONE, src_fd) < 0) - pg_fatal("could not clone file between old and new data directories: %s", - strerror(errno)); + pg_fatal("could not clone file between old and new data directories: %m"); close(src_fd); close(dest_fd); @@ -358,6 +396,43 @@ check_file_clone(void) unlink(new_link_file); } +void +check_copy_file_range(void) +{ + char existing_file[MAXPGPATH]; + char new_link_file[MAXPGPATH]; + + snprintf(existing_file, sizeof(existing_file), "%s/PG_VERSION", old_cluster.pgdata); + snprintf(new_link_file, sizeof(new_link_file), "%s/PG_VERSION.copy_file_range_test", new_cluster.pgdata); + unlink(new_link_file); /* might fail */ + +#if defined(HAVE_COPY_FILE_RANGE) + { + int src_fd; + int dest_fd; + + if ((src_fd = open(existing_file, O_RDONLY | PG_BINARY, 0)) < 0) + pg_fatal("could not open file \"%s\": %m", + existing_file); + + if ((dest_fd = open(new_link_file, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, + pg_file_create_mode)) < 0) + pg_fatal("could not create file \"%s\": %m", + new_link_file); + + if (copy_file_range(src_fd, NULL, dest_fd, NULL, SSIZE_MAX, 0) < 0) + pg_fatal("could not copy file range between old and new data directories: %m"); + + close(src_fd); + close(dest_fd); + } +#else + pg_fatal("copy_file_range not supported on this platform"); +#endif + + unlink(new_link_file); +} + void check_hard_link(void) { @@ -369,9 +444,8 @@ check_hard_link(void) unlink(new_link_file); /* might fail */ if (link(existing_file, new_link_file) < 0) - pg_fatal("could not create hard link between old and new data directories: %s\n" - "In link mode the old and new data directories must be on the same file system.", - strerror(errno)); + pg_fatal("could not create hard link between old and new data directories: %m\n" + "In link mode the old and new data directories must be on the same file system."); unlink(new_link_file); } diff --git a/src/bin/pg_upgrade/function.c b/src/bin/pg_upgrade/function.c index dc8800c7cdeeb..7e3abed0985d5 100644 --- a/src/bin/pg_upgrade/function.c +++ b/src/bin/pg_upgrade/function.c @@ -3,7 +3,7 @@ * * server-side function support * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/function.c */ @@ -11,6 +11,7 @@ #include "access/transam.h" #include "catalog/pg_language_d.h" +#include "common/int.h" #include "pg_upgrade.h" /* @@ -29,24 +30,25 @@ library_name_compare(const void *p1, const void *p2) { const char *str1 = ((const LibraryInfo *) p1)->name; const char *str2 = ((const LibraryInfo *) p2)->name; - int slen1 = strlen(str1); - int slen2 = strlen(str2); + size_t slen1 = strlen(str1); + size_t slen2 = strlen(str2); int cmp = strcmp(str1, str2); if (slen1 != slen2) - return slen1 - slen2; + return pg_cmp_size(slen1, slen2); if (cmp != 0) return cmp; - else - return ((const LibraryInfo *) p1)->dbnum - - ((const LibraryInfo *) p2)->dbnum; + return pg_cmp_s32(((const LibraryInfo *) p1)->dbnum, + ((const LibraryInfo *) p2)->dbnum); } /* * get_loadable_libraries() * - * Fetch the names of all old libraries containing C-language functions. + * Fetch the names of all old libraries containing either C-language functions + * or are corresponding to logical replication output plugins. + * * We will later check that they all exist in the new installation. */ void @@ -55,6 +57,7 @@ get_loadable_libraries(void) PGresult **ress; int totaltups; int dbnum; + int n_libinfos; ress = (PGresult **) pg_malloc(old_cluster.dbarr.ndbs * sizeof(PGresult *)); totaltups = 0; @@ -81,7 +84,12 @@ get_loadable_libraries(void) PQfinish(conn); } - os_info.libraries = (LibraryInfo *) pg_malloc(totaltups * sizeof(LibraryInfo)); + /* + * Allocate memory for required libraries and logical replication output + * plugins. + */ + n_libinfos = totaltups + count_old_cluster_logical_slots(); + os_info.libraries = (LibraryInfo *) pg_malloc(sizeof(LibraryInfo) * n_libinfos); totaltups = 0; for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++) @@ -89,6 +97,7 @@ get_loadable_libraries(void) PGresult *res = ress[dbnum]; int ntups; int rowno; + LogicalSlotInfoArr *slot_arr = &old_cluster.dbarr.dbs[dbnum].slot_arr; ntups = PQntuples(res); for (rowno = 0; rowno < ntups; rowno++) @@ -101,6 +110,23 @@ get_loadable_libraries(void) totaltups++; } PQclear(res); + + /* + * Store the names of output plugins as well. There is a possibility + * that duplicated plugins are set, but the consumer function + * check_loadable_libraries() will avoid checking the same library, so + * we do not have to consider their uniqueness here. + */ + for (int slotno = 0; slotno < slot_arr->nslots; slotno++) + { + if (slot_arr->slots[slotno].invalid) + continue; + + os_info.libraries[totaltups].name = pg_strdup(slot_arr->slots[slotno].plugin); + os_info.libraries[totaltups].dbnum = dbnum; + + totaltups++; + } } pg_free(ress); @@ -160,8 +186,7 @@ check_loadable_libraries(void) was_load_failure = true; if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) - pg_fatal("could not open file \"%s\": %s", - output_path, strerror(errno)); + pg_fatal("could not open file \"%s\": %m", output_path); fprintf(script, _("could not load library \"%s\": %s"), lib, PQerrorMessage(conn)); diff --git a/src/bin/pg_upgrade/info.c b/src/bin/pg_upgrade/info.c index a9988abfe1578..5c041fa06e052 100644 --- a/src/bin/pg_upgrade/info.c +++ b/src/bin/pg_upgrade/info.c @@ -3,7 +3,7 @@ * * information support functions * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/info.c */ @@ -26,6 +26,8 @@ static void get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo); static void free_rel_infos(RelInfoArr *rel_arr); static void print_db_infos(DbInfoArr *db_arr); static void print_rel_infos(RelInfoArr *rel_arr); +static void print_slot_infos(LogicalSlotInfoArr *slot_arr); +static void get_old_cluster_logical_slot_infos(DbInfo *dbinfo, bool live_check); /* @@ -266,13 +268,15 @@ report_unmatched_relation(const RelInfo *rel, const DbInfo *db, bool is_new_db) } /* - * get_db_and_rel_infos() + * get_db_rel_and_slot_infos() * * higher level routine to generate dbinfos for the database running * on the given "port". Assumes that server is already running. + * + * live_check would be used only when the target is the old cluster. */ void -get_db_and_rel_infos(ClusterInfo *cluster) +get_db_rel_and_slot_infos(ClusterInfo *cluster, bool live_check) { int dbnum; @@ -283,7 +287,14 @@ get_db_and_rel_infos(ClusterInfo *cluster) get_db_infos(cluster); for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++) - get_rel_infos(cluster, &cluster->dbarr.dbs[dbnum]); + { + DbInfo *pDbInfo = &cluster->dbarr.dbs[dbnum]; + + get_rel_infos(cluster, pDbInfo); + + if (cluster == &old_cluster) + get_old_cluster_logical_slot_infos(pDbInfo, live_check); + } if (cluster == &old_cluster) pg_log(PG_VERBOSE, "\nsource databases:"); @@ -309,18 +320,24 @@ get_template0_info(ClusterInfo *cluster) int i_datlocprovider; int i_datcollate; int i_datctype; - int i_daticulocale; + int i_datlocale; - if (GET_MAJOR_VERSION(cluster->major_version) >= 1500) + if (GET_MAJOR_VERSION(cluster->major_version) >= 1700) + dbres = executeQueryOrDie(conn, + "SELECT encoding, datlocprovider, " + " datcollate, datctype, datlocale " + "FROM pg_catalog.pg_database " + "WHERE datname='template0'"); + else if (GET_MAJOR_VERSION(cluster->major_version) >= 1500) dbres = executeQueryOrDie(conn, "SELECT encoding, datlocprovider, " - " datcollate, datctype, daticulocale " + " datcollate, datctype, daticulocale AS datlocale " "FROM pg_catalog.pg_database " "WHERE datname='template0'"); else dbres = executeQueryOrDie(conn, "SELECT encoding, 'c' AS datlocprovider, " - " datcollate, datctype, NULL AS daticulocale " + " datcollate, datctype, NULL AS datlocale " "FROM pg_catalog.pg_database " "WHERE datname='template0'"); @@ -334,16 +351,16 @@ get_template0_info(ClusterInfo *cluster) i_datlocprovider = PQfnumber(dbres, "datlocprovider"); i_datcollate = PQfnumber(dbres, "datcollate"); i_datctype = PQfnumber(dbres, "datctype"); - i_daticulocale = PQfnumber(dbres, "daticulocale"); + i_datlocale = PQfnumber(dbres, "datlocale"); locale->db_encoding = atoi(PQgetvalue(dbres, 0, i_datencoding)); locale->db_collprovider = PQgetvalue(dbres, 0, i_datlocprovider)[0]; locale->db_collate = pg_strdup(PQgetvalue(dbres, 0, i_datcollate)); locale->db_ctype = pg_strdup(PQgetvalue(dbres, 0, i_datctype)); - if (PQgetisnull(dbres, 0, i_daticulocale)) - locale->db_iculocale = NULL; + if (PQgetisnull(dbres, 0, i_datlocale)) + locale->db_locale = NULL; else - locale->db_iculocale = pg_strdup(PQgetvalue(dbres, 0, i_daticulocale)); + locale->db_locale = pg_strdup(PQgetvalue(dbres, 0, i_datlocale)); cluster->template0 = locale; @@ -373,12 +390,15 @@ get_db_infos(ClusterInfo *cluster) snprintf(query, sizeof(query), "SELECT d.oid, d.datname, d.encoding, d.datcollate, d.datctype, "); - if (GET_MAJOR_VERSION(cluster->major_version) < 1500) + if (GET_MAJOR_VERSION(cluster->major_version) >= 1700) snprintf(query + strlen(query), sizeof(query) - strlen(query), - "'c' AS datlocprovider, NULL AS daticulocale, "); + "datlocprovider, datlocale, "); + else if (GET_MAJOR_VERSION(cluster->major_version) >= 1500) + snprintf(query + strlen(query), sizeof(query) - strlen(query), + "datlocprovider, daticulocale AS datlocale, "); else snprintf(query + strlen(query), sizeof(query) - strlen(query), - "datlocprovider, daticulocale, "); + "'c' AS datlocprovider, NULL AS datlocale, "); snprintf(query + strlen(query), sizeof(query) - strlen(query), "pg_catalog.pg_tablespace_location(t.oid) AS spclocation " "FROM pg_catalog.pg_database d " @@ -394,7 +414,7 @@ get_db_infos(ClusterInfo *cluster) i_spclocation = PQfnumber(res, "spclocation"); ntups = PQntuples(res); - dbinfos = (DbInfo *) pg_malloc(sizeof(DbInfo) * ntups); + dbinfos = (DbInfo *) pg_malloc0(sizeof(DbInfo) * ntups); for (tupnum = 0; tupnum < ntups; tupnum++) { @@ -600,6 +620,144 @@ get_rel_infos(ClusterInfo *cluster, DbInfo *dbinfo) dbinfo->rel_arr.nrels = num_rels; } +/* + * get_old_cluster_logical_slot_infos() + * + * Gets the LogicalSlotInfos for all the logical replication slots of the + * database referred to by "dbinfo". The status of each logical slot is gotten + * here, but they are used at the checking phase. See + * check_old_cluster_for_valid_slots(). + * + * Note: This function will not do anything if the old cluster is pre-PG17. + * This is because before that the logical slots are not saved at shutdown, so + * there is no guarantee that the latest confirmed_flush_lsn is saved to disk + * which can lead to data loss. It is still not guaranteed for manually created + * slots in PG17, so subsequent checks done in + * check_old_cluster_for_valid_slots() would raise a FATAL error if such slots + * are included. + */ +static void +get_old_cluster_logical_slot_infos(DbInfo *dbinfo, bool live_check) +{ + PGconn *conn; + PGresult *res; + LogicalSlotInfo *slotinfos = NULL; + int num_slots; + + /* Logical slots can be migrated since PG17. */ + if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1600) + return; + + conn = connectToServer(&old_cluster, dbinfo->db_name); + + /* + * Fetch the logical replication slot information. The check whether the + * slot is considered caught up is done by an upgrade function. This + * regards the slot as caught up if we don't find any decodable changes. + * See binary_upgrade_logical_slot_has_caught_up(). + * + * Note that we can't ensure whether the slot is caught up during + * live_check as the new WAL records could be generated. + * + * We intentionally skip checking the WALs for invalidated slots as the + * corresponding WALs could have been removed for such slots. + * + * The temporary slots are explicitly ignored while checking because such + * slots cannot exist after the upgrade. During the upgrade, clusters are + * started and stopped several times causing any temporary slots to be + * removed. + */ + res = executeQueryOrDie(conn, "SELECT slot_name, plugin, two_phase, failover, " + "%s as caught_up, invalidation_reason IS NOT NULL as invalid " + "FROM pg_catalog.pg_replication_slots " + "WHERE slot_type = 'logical' AND " + "database = current_database() AND " + "temporary IS FALSE;", + live_check ? "FALSE" : + "(CASE WHEN invalidation_reason IS NOT NULL THEN FALSE " + "ELSE (SELECT pg_catalog.binary_upgrade_logical_slot_has_caught_up(slot_name)) " + "END)"); + + num_slots = PQntuples(res); + + if (num_slots) + { + int i_slotname; + int i_plugin; + int i_twophase; + int i_failover; + int i_caught_up; + int i_invalid; + + slotinfos = (LogicalSlotInfo *) pg_malloc(sizeof(LogicalSlotInfo) * num_slots); + + i_slotname = PQfnumber(res, "slot_name"); + i_plugin = PQfnumber(res, "plugin"); + i_twophase = PQfnumber(res, "two_phase"); + i_failover = PQfnumber(res, "failover"); + i_caught_up = PQfnumber(res, "caught_up"); + i_invalid = PQfnumber(res, "invalid"); + + for (int slotnum = 0; slotnum < num_slots; slotnum++) + { + LogicalSlotInfo *curr = &slotinfos[slotnum]; + + curr->slotname = pg_strdup(PQgetvalue(res, slotnum, i_slotname)); + curr->plugin = pg_strdup(PQgetvalue(res, slotnum, i_plugin)); + curr->two_phase = (strcmp(PQgetvalue(res, slotnum, i_twophase), "t") == 0); + curr->failover = (strcmp(PQgetvalue(res, slotnum, i_failover), "t") == 0); + curr->caught_up = (strcmp(PQgetvalue(res, slotnum, i_caught_up), "t") == 0); + curr->invalid = (strcmp(PQgetvalue(res, slotnum, i_invalid), "t") == 0); + } + } + + PQclear(res); + PQfinish(conn); + + dbinfo->slot_arr.slots = slotinfos; + dbinfo->slot_arr.nslots = num_slots; +} + + +/* + * count_old_cluster_logical_slots() + * + * Returns the number of logical replication slots for all databases. + * + * Note: this function always returns 0 if the old_cluster is PG16 and prior + * because we gather slot information only for cluster versions greater than or + * equal to PG17. See get_old_cluster_logical_slot_infos(). + */ +int +count_old_cluster_logical_slots(void) +{ + int slot_count = 0; + + for (int dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++) + slot_count += old_cluster.dbarr.dbs[dbnum].slot_arr.nslots; + + return slot_count; +} + +/* + * get_subscription_count() + * + * Gets the number of subscriptions in the cluster. + */ +void +get_subscription_count(ClusterInfo *cluster) +{ + PGconn *conn; + PGresult *res; + + conn = connectToServer(cluster, "template1"); + res = executeQueryOrDie(conn, "SELECT count(*) " + "FROM pg_catalog.pg_subscription"); + cluster->nsubs = atoi(PQgetvalue(res, 0, 0)); + + PQclear(res); + PQfinish(conn); +} static void free_db_and_rel_infos(DbInfoArr *db_arr) @@ -642,8 +800,11 @@ print_db_infos(DbInfoArr *db_arr) for (dbnum = 0; dbnum < db_arr->ndbs; dbnum++) { - pg_log(PG_VERBOSE, "Database: %s", db_arr->dbs[dbnum].db_name); - print_rel_infos(&db_arr->dbs[dbnum].rel_arr); + DbInfo *pDbInfo = &db_arr->dbs[dbnum]; + + pg_log(PG_VERBOSE, "Database: \"%s\"", pDbInfo->db_name); + print_rel_infos(&pDbInfo->rel_arr); + print_slot_infos(&pDbInfo->slot_arr); } } @@ -654,9 +815,29 @@ print_rel_infos(RelInfoArr *rel_arr) int relnum; for (relnum = 0; relnum < rel_arr->nrels; relnum++) - pg_log(PG_VERBOSE, "relname: %s.%s: reloid: %u reltblspace: %s", + pg_log(PG_VERBOSE, "relname: \"%s.%s\", reloid: %u, reltblspace: \"%s\"", rel_arr->rels[relnum].nspname, rel_arr->rels[relnum].relname, rel_arr->rels[relnum].reloid, rel_arr->rels[relnum].tablespace); } + +static void +print_slot_infos(LogicalSlotInfoArr *slot_arr) +{ + /* Quick return if there are no logical slots. */ + if (slot_arr->nslots == 0) + return; + + pg_log(PG_VERBOSE, "Logical replication slots in the database:"); + + for (int slotnum = 0; slotnum < slot_arr->nslots; slotnum++) + { + LogicalSlotInfo *slot_info = &slot_arr->slots[slotnum]; + + pg_log(PG_VERBOSE, "slot name: \"%s\", output plugin: \"%s\", two_phase: %s", + slot_info->slotname, + slot_info->plugin, + slot_info->two_phase ? "true" : "false"); + } +} diff --git a/src/bin/pg_upgrade/meson.build b/src/bin/pg_upgrade/meson.build index 12a97f84e299e..9825fa3305466 100644 --- a/src/bin/pg_upgrade/meson.build +++ b/src/bin/pg_upgrade/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_upgrade_sources = files( 'check.c', @@ -42,6 +42,8 @@ tests += { 'tests': [ 't/001_basic.pl', 't/002_pg_upgrade.pl', + 't/003_logical_slots.pl', + 't/004_subscription.pl', ], 'test_kwargs': {'priority': 40}, # pg_upgrade tests are slow }, diff --git a/src/bin/pg_upgrade/nls.mk b/src/bin/pg_upgrade/nls.mk index 9e2c1386e20d5..db5aa18013b05 100644 --- a/src/bin/pg_upgrade/nls.mk +++ b/src/bin/pg_upgrade/nls.mk @@ -14,11 +14,20 @@ GETTEXT_FILES = check.c \ server.c \ tablespace.c \ util.c \ - version.c -GETTEXT_TRIGGERS = pg_fatal pg_log:2 prep_status prep_status_progress report_status:2 -GETTEXT_FLAGS = \ - pg_fatal:1:c-format \ - pg_log:2:c-format \ - prep_status:1:c-format \ - prep_status_progress:1:c-format \ - report_status:2:c-format + version.c \ + ../../common/fe_memutils.c \ + ../../common/file_utils.c \ + ../../common/restricted_token.c \ + ../../common/username.c \ + ../../fe_utils/option_utils.c \ + ../../fe_utils/string_utils.c +GETTEXT_TRIGGERS = pg_fatal \ + pg_log:2 \ + prep_status \ + prep_status_progress \ + report_status:2 +GETTEXT_FLAGS = pg_fatal:1:c-format \ + pg_log:2:c-format \ + prep_status:1:c-format \ + prep_status_progress:1:c-format \ + report_status:2:c-format diff --git a/src/bin/pg_upgrade/option.c b/src/bin/pg_upgrade/option.c index 640361009e30a..548ea4e623656 100644 --- a/src/bin/pg_upgrade/option.c +++ b/src/bin/pg_upgrade/option.c @@ -3,7 +3,7 @@ * * options functions * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/option.c */ @@ -14,6 +14,7 @@ #endif #include "common/string.h" +#include "fe_utils/option_utils.h" #include "getopt_long.h" #include "pg_upgrade.h" #include "utils/pidfile.h" @@ -57,12 +58,15 @@ parseCommandLine(int argc, char *argv[]) {"verbose", no_argument, NULL, 'v'}, {"clone", no_argument, NULL, 1}, {"copy", no_argument, NULL, 2}, + {"copy-file-range", no_argument, NULL, 3}, + {"sync-method", required_argument, NULL, 4}, {NULL, 0, NULL, 0} }; int option; /* Command line option */ int optindex = 0; /* used by getopt_long */ int os_user_effective_id; + DataDirSyncMethod unused; user_opts.do_sync = true; user_opts.transfer_mode = TRANSFER_MODE_COPY; @@ -199,6 +203,15 @@ parseCommandLine(int argc, char *argv[]) user_opts.transfer_mode = TRANSFER_MODE_COPY; break; + case 3: + user_opts.transfer_mode = TRANSFER_MODE_COPY_FILE_RANGE; + break; + case 4: + if (!parse_sync_method(optarg, &unused)) + exit(1); + user_opts.sync_method = pg_strdup(optarg); + break; + default: fprintf(stderr, _("Try \"%s --help\" for more information.\n"), os_info.progname); @@ -209,6 +222,9 @@ parseCommandLine(int argc, char *argv[]) if (optind < argc) pg_fatal("too many command-line arguments (first is \"%s\")", argv[optind]); + if (!user_opts.sync_method) + user_opts.sync_method = pg_strdup("fsync"); + if (log_opts.verbose) pg_log(PG_REPORT, "Running in verbose mode"); @@ -289,6 +305,8 @@ usage(void) printf(_(" -V, --version display version information, then exit\n")); printf(_(" --clone clone instead of copying files to new cluster\n")); printf(_(" --copy copy files to new cluster (default)\n")); + printf(_(" --copy-file-range copy files to new cluster with copy_file_range\n")); + printf(_(" --sync-method=METHOD set method for syncing files to disk\n")); printf(_(" -?, --help show this help, then exit\n")); printf(_("\n" "Before running pg_upgrade you must:\n" @@ -427,8 +445,7 @@ adjust_data_dir(ClusterInfo *cluster) if ((output = popen(cmd, "r")) == NULL || fgets(cmd_output, sizeof(cmd_output), output) == NULL) - pg_fatal("could not get data directory using %s: %s", - cmd, strerror(errno)); + pg_fatal("could not get data directory using %s: %m", cmd); rc = pclose(output); if (rc != 0) @@ -473,16 +490,15 @@ get_sock_dir(ClusterInfo *cluster, bool live_check) snprintf(filename, sizeof(filename), "%s/postmaster.pid", cluster->pgdata); if ((fp = fopen(filename, "r")) == NULL) - pg_fatal("could not open file \"%s\": %s", - filename, strerror(errno)); + pg_fatal("could not open file \"%s\": %m", filename); for (lineno = 1; lineno <= Max(LOCK_FILE_LINE_PORT, LOCK_FILE_LINE_SOCKET_DIR); lineno++) { if (fgets(line, sizeof(line), fp) == NULL) - pg_fatal("could not read line %d from file \"%s\": %s", - lineno, filename, strerror(errno)); + pg_fatal("could not read line %d from file \"%s\": %m", + lineno, filename); /* potentially overwrite user-supplied value */ if (lineno == LOCK_FILE_LINE_PORT) diff --git a/src/bin/pg_upgrade/parallel.c b/src/bin/pg_upgrade/parallel.c index eaf0f0afefa93..05313a9b15641 100644 --- a/src/bin/pg_upgrade/parallel.c +++ b/src/bin/pg_upgrade/parallel.c @@ -3,7 +3,7 @@ * * multi-process support * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/parallel.c */ @@ -124,7 +124,7 @@ parallel_exec_prog(const char *log_file, const char *opt_log_file, _exit(!exec_prog(log_file, opt_log_file, true, true, "%s", cmd)); else if (child < 0) /* fork failed */ - pg_fatal("could not create worker process: %s", strerror(errno)); + pg_fatal("could not create worker process: %m"); #else /* empty array element are always at the end */ new_arg = exec_thread_args[parallel_jobs - 1]; @@ -140,7 +140,7 @@ parallel_exec_prog(const char *log_file, const char *opt_log_file, child = (HANDLE) _beginthreadex(NULL, 0, (void *) win32_exec_prog, new_arg, 0, NULL); if (child == 0) - pg_fatal("could not create worker thread: %s", strerror(errno)); + pg_fatal("could not create worker thread: %m"); thread_handles[parallel_jobs - 1] = child; #endif @@ -232,7 +232,7 @@ parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr, } else if (child < 0) /* fork failed */ - pg_fatal("could not create worker process: %s", strerror(errno)); + pg_fatal("could not create worker process: %m"); #else /* empty array element are always at the end */ new_arg = transfer_thread_args[parallel_jobs - 1]; @@ -250,7 +250,7 @@ parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr, child = (HANDLE) _beginthreadex(NULL, 0, (void *) win32_transfer_all_new_dbs, new_arg, 0, NULL); if (child == 0) - pg_fatal("could not create worker thread: %s", strerror(errno)); + pg_fatal("could not create worker thread: %m"); thread_handles[parallel_jobs - 1] = child; #endif @@ -291,7 +291,7 @@ reap_child(bool wait_for_child) #ifndef WIN32 child = waitpid(-1, &work_status, wait_for_child ? 0 : WNOHANG); if (child == (pid_t) -1) - pg_fatal("%s() failed: %s", "waitpid", strerror(errno)); + pg_fatal("%s() failed: %m", "waitpid"); if (child == 0) return false; /* no children, or no dead children */ if (work_status != 0) @@ -310,7 +310,7 @@ reap_child(bool wait_for_child) /* get the result */ GetExitCodeThread(thread_handles[thread_num], &res); if (res != 0) - pg_fatal("child worker exited abnormally: %s", strerror(errno)); + pg_fatal("child worker exited abnormally: %m"); /* dispose of handle to stop leaks */ CloseHandle(thread_handles[thread_num]); diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c index 4562dafcff561..bb5a223e1c6a1 100644 --- a/src/bin/pg_upgrade/pg_upgrade.c +++ b/src/bin/pg_upgrade/pg_upgrade.c @@ -3,7 +3,7 @@ * * main source file * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/pg_upgrade.c */ @@ -51,6 +51,13 @@ #include "fe_utils/string_utils.h" #include "pg_upgrade.h" +/* + * Maximum number of pg_restore actions (TOC entries) to process within one + * transaction. At some point we might want to make this user-controllable, + * but for now a hard-wired setting will suffice. + */ +#define RESTORE_TRANSACTION_SIZE 1000 + static void set_locale_and_encoding(void); static void prepare_new_cluster(void); static void prepare_new_globals(void); @@ -59,6 +66,7 @@ static void copy_xact_xlog_xid(void); static void set_frozenxids(bool minmxid_only); static void make_outputdirs(char *pgdata); static void setup(char *argv0, bool *live_check); +static void create_logical_replication_slots(void); ClusterInfo old_cluster, new_cluster; @@ -104,8 +112,8 @@ main(int argc, char **argv) * output directories with correct permissions. */ if (!GetDataDirectoryCreatePerm(new_cluster.pgdata)) - pg_fatal("could not read permissions of directory \"%s\": %s", - new_cluster.pgdata, strerror(errno)); + pg_fatal("could not read permissions of directory \"%s\": %m", + new_cluster.pgdata); umask(pg_mode_mask); @@ -188,12 +196,29 @@ main(int argc, char **argv) new_cluster.pgdata); check_ok(); + /* + * Migrate the logical slots to the new cluster. Note that we need to do + * this after resetting WAL because otherwise the required WAL would be + * removed and slots would become unusable. There is a possibility that + * background processes might generate some WAL before we could create the + * slots in the new cluster but we can ignore that WAL as that won't be + * required downstream. + */ + if (count_old_cluster_logical_slots()) + { + start_postmaster(&new_cluster, true); + create_logical_replication_slots(); + stop_postmaster(false); + } + if (user_opts.do_sync) { prep_status("Sync data directory to disk"); exec_prog(UTILITY_LOG_FILE, NULL, true, true, - "\"%s/initdb\" --sync-only \"%s\"", new_cluster.bindir, - new_cluster.pgdata); + "\"%s/initdb\" --sync-only \"%s\" --sync-method %s", + new_cluster.bindir, + new_cluster.pgdata, + user_opts.sync_method); check_ok(); } @@ -373,7 +398,7 @@ setup(char *argv0, bool *live_check) * Copy locale and encoding information into the new cluster's template0. * * We need to copy the encoding, datlocprovider, datcollate, datctype, and - * daticulocale. We don't need datcollversion because that's never set for + * datlocale. We don't need datcollversion because that's never set for * template0. */ static void @@ -382,7 +407,7 @@ set_locale_and_encoding(void) PGconn *conn_new_template1; char *datcollate_literal; char *datctype_literal; - char *daticulocale_literal = NULL; + char *datlocale_literal = NULL; DbLocaleInfo *locale = old_cluster.template0; prep_status("Setting locale and encoding for new cluster"); @@ -396,15 +421,30 @@ set_locale_and_encoding(void) datctype_literal = PQescapeLiteral(conn_new_template1, locale->db_ctype, strlen(locale->db_ctype)); - if (locale->db_iculocale) - daticulocale_literal = PQescapeLiteral(conn_new_template1, - locale->db_iculocale, - strlen(locale->db_iculocale)); + + if (locale->db_locale) + datlocale_literal = PQescapeLiteral(conn_new_template1, + locale->db_locale, + strlen(locale->db_locale)); else - daticulocale_literal = pg_strdup("NULL"); + datlocale_literal = "NULL"; /* update template0 in new cluster */ - if (GET_MAJOR_VERSION(new_cluster.major_version) >= 1500) + if (GET_MAJOR_VERSION(new_cluster.major_version) >= 1700) + PQclear(executeQueryOrDie(conn_new_template1, + "UPDATE pg_catalog.pg_database " + " SET encoding = %d, " + " datlocprovider = '%c', " + " datcollate = %s, " + " datctype = %s, " + " datlocale = %s " + " WHERE datname = 'template0' ", + locale->db_encoding, + locale->db_collprovider, + datcollate_literal, + datctype_literal, + datlocale_literal)); + else if (GET_MAJOR_VERSION(new_cluster.major_version) >= 1500) PQclear(executeQueryOrDie(conn_new_template1, "UPDATE pg_catalog.pg_database " " SET encoding = %d, " @@ -417,7 +457,7 @@ set_locale_and_encoding(void) locale->db_collprovider, datcollate_literal, datctype_literal, - daticulocale_literal)); + datlocale_literal)); else PQclear(executeQueryOrDie(conn_new_template1, "UPDATE pg_catalog.pg_database " @@ -431,7 +471,8 @@ set_locale_and_encoding(void) PQfreemem(datcollate_literal); PQfreemem(datctype_literal); - PQfreemem(daticulocale_literal); + if (locale->db_locale) + PQfreemem(datlocale_literal); PQfinish(conn_new_template1); @@ -530,10 +571,12 @@ create_new_objects(void) true, true, "\"%s/pg_restore\" %s %s --exit-on-error --verbose " + "--transaction-size=%d " "--dbname postgres \"%s/%s\"", new_cluster.bindir, cluster_conn_opts(&new_cluster), create_opts, + RESTORE_TRANSACTION_SIZE, log_opts.dumpdir, sql_file_name); @@ -546,6 +589,7 @@ create_new_objects(void) log_file_name[MAXPGPATH]; DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum]; const char *create_opts; + int txn_size; /* Skip template1 in this pass */ if (strcmp(old_db->db_name, "template1") == 0) @@ -565,13 +609,28 @@ create_new_objects(void) else create_opts = "--create"; + /* + * In parallel mode, reduce the --transaction-size of each restore job + * so that the total number of locks that could be held across all the + * jobs stays in bounds. + */ + txn_size = RESTORE_TRANSACTION_SIZE; + if (user_opts.jobs > 1) + { + txn_size /= user_opts.jobs; + /* Keep some sanity if -j is huge */ + txn_size = Max(txn_size, 10); + } + parallel_exec_prog(log_file_name, NULL, "\"%s/pg_restore\" %s %s --exit-on-error --verbose " + "--transaction-size=%d " "--dbname template1 \"%s/%s\"", new_cluster.bindir, cluster_conn_opts(&new_cluster), create_opts, + txn_size, log_opts.dumpdir, sql_file_name); } @@ -591,7 +650,7 @@ create_new_objects(void) set_frozenxids(true); /* update new_cluster info now that we have objects in the databases */ - get_db_and_rel_infos(&new_cluster); + get_db_rel_and_slot_infos(&new_cluster, false); } /* @@ -860,3 +919,61 @@ set_frozenxids(bool minmxid_only) check_ok(); } + +/* + * create_logical_replication_slots() + * + * Similar to create_new_objects() but only restores logical replication slots. + */ +static void +create_logical_replication_slots(void) +{ + prep_status_progress("Restoring logical replication slots in the new cluster"); + + for (int dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++) + { + DbInfo *old_db = &old_cluster.dbarr.dbs[dbnum]; + LogicalSlotInfoArr *slot_arr = &old_db->slot_arr; + PGconn *conn; + PQExpBuffer query; + + /* Skip this database if there are no slots */ + if (slot_arr->nslots == 0) + continue; + + conn = connectToServer(&new_cluster, old_db->db_name); + query = createPQExpBuffer(); + + pg_log(PG_STATUS, "%s", old_db->db_name); + + for (int slotnum = 0; slotnum < slot_arr->nslots; slotnum++) + { + LogicalSlotInfo *slot_info = &slot_arr->slots[slotnum]; + + /* Constructs a query for creating logical replication slots */ + appendPQExpBuffer(query, + "SELECT * FROM " + "pg_catalog.pg_create_logical_replication_slot("); + appendStringLiteralConn(query, slot_info->slotname, conn); + appendPQExpBuffer(query, ", "); + appendStringLiteralConn(query, slot_info->plugin, conn); + + appendPQExpBuffer(query, ", false, %s, %s);", + slot_info->two_phase ? "true" : "false", + slot_info->failover ? "true" : "false"); + + PQclear(executeQueryOrDie(conn, "%s", query->data)); + + resetPQExpBuffer(query); + } + + PQfinish(conn); + + destroyPQExpBuffer(query); + } + + end_progress_output(); + check_ok(); + + return; +} diff --git a/src/bin/pg_upgrade/pg_upgrade.h b/src/bin/pg_upgrade/pg_upgrade.h index 3eea0139c74bd..e2b99b49fabe6 100644 --- a/src/bin/pg_upgrade/pg_upgrade.h +++ b/src/bin/pg_upgrade/pg_upgrade.h @@ -1,7 +1,7 @@ /* * pg_upgrade.h * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/pg_upgrade.h */ @@ -22,7 +22,7 @@ #define MAX_STRING 1024 #define QUERY_ALLOC 8192 -#define MESSAGE_WIDTH 60 +#define MESSAGE_WIDTH 62 #define GET_MAJOR_VERSION(v) ((v) / 100) @@ -150,6 +150,26 @@ typedef struct int nrels; } RelInfoArr; +/* + * Structure to store logical replication slot information. + */ +typedef struct +{ + char *slotname; /* slot name */ + char *plugin; /* plugin */ + bool two_phase; /* can the slot decode 2PC? */ + bool caught_up; /* has the slot caught up to latest changes? */ + bool invalid; /* if true, the slot is unusable */ + bool failover; /* is the slot designated to be synced to the + * physical standby? */ +} LogicalSlotInfo; + +typedef struct +{ + int nslots; /* number of logical slot infos */ + LogicalSlotInfo *slots; /* array of logical slot infos */ +} LogicalSlotInfoArr; + /* * The following structure represents a relation mapping. */ @@ -176,6 +196,7 @@ typedef struct char db_tablespace[MAXPGPATH]; /* database default tablespace * path */ RelInfoArr rel_arr; /* array of all user relinfos */ + LogicalSlotInfoArr slot_arr; /* array of all LogicalSlotInfo */ } DbInfo; /* @@ -186,7 +207,7 @@ typedef struct char *db_collate; char *db_ctype; char db_collprovider; - char *db_iculocale; + char *db_locale; int db_encoding; } DbLocaleInfo; @@ -234,7 +255,8 @@ typedef enum { TRANSFER_MODE_CLONE, TRANSFER_MODE_COPY, - TRANSFER_MODE_LINK + TRANSFER_MODE_COPY_FILE_RANGE, + TRANSFER_MODE_LINK, } transferMode; /* @@ -247,7 +269,7 @@ typedef enum PG_REPORT_NONL, /* these too */ PG_REPORT, PG_WARNING, - PG_FATAL + PG_FATAL, } eLogType; @@ -273,6 +295,7 @@ typedef struct char major_version_str[64]; /* string PG_VERSION of cluster */ uint32 bin_version; /* version returned from pg_ctl */ const char *tablespace_suffix; /* directory specification */ + int nsubs; /* number of subscriptions */ } ClusterInfo; @@ -298,12 +321,12 @@ typedef struct */ typedef struct { - bool check; /* true -> ask user for permission to make - * changes */ + bool check; /* check clusters only, don't change any data */ bool do_sync; /* flush changes to disk */ transferMode transfer_mode; /* copy files or link them? */ int jobs; /* number of processes/threads to use */ char *socketdir; /* directory to use for Unix sockets */ + char *sync_method; } UserOpts; typedef struct @@ -328,6 +351,9 @@ typedef struct } OSInfo; +/* Function signature for data type check version hook */ +typedef bool (*DataTypesUsageVersionCheck) (ClusterInfo *cluster); + /* * Global variables */ @@ -379,11 +405,14 @@ void cloneFile(const char *src, const char *dst, const char *schemaName, const char *relName); void copyFile(const char *src, const char *dst, const char *schemaName, const char *relName); +void copyFileByRange(const char *src, const char *dst, + const char *schemaName, const char *relName); void linkFile(const char *src, const char *dst, const char *schemaName, const char *relName); void rewriteVisibilityMap(const char *fromfile, const char *tofile, const char *schemaName, const char *relName); void check_file_clone(void); +void check_copy_file_range(void); void check_hard_link(void); /* fopen_priv() is no longer different from fopen() */ @@ -399,7 +428,9 @@ void check_loadable_libraries(void); FileNameMap *gen_db_file_maps(DbInfo *old_db, DbInfo *new_db, int *nmaps, const char *old_pgdata, const char *new_pgdata); -void get_db_and_rel_infos(ClusterInfo *cluster); +void get_db_rel_and_slot_infos(ClusterInfo *cluster, bool live_check); +int count_old_cluster_logical_slots(void); +void get_subscription_count(ClusterInfo *cluster); /* option.c */ @@ -450,18 +481,10 @@ unsigned int str2uint(const char *str); /* version.c */ -bool check_for_data_types_usage(ClusterInfo *cluster, - const char *base_query, - const char *output_path); -bool check_for_data_type_usage(ClusterInfo *cluster, - const char *type_name, - const char *output_path); -void old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster); -void old_9_6_check_for_unknown_data_type_usage(ClusterInfo *cluster); +bool jsonb_9_4_check_applicable(ClusterInfo *cluster); void old_9_6_invalidate_hash_indexes(ClusterInfo *cluster, bool check_mode); -void old_11_check_for_sql_identifier_data_type_usage(ClusterInfo *cluster); void report_extension_updates(ClusterInfo *cluster); /* parallel.c */ diff --git a/src/bin/pg_upgrade/po/de.po b/src/bin/pg_upgrade/po/de.po index 50b1882a9d1b4..545eab9df793e 100644 --- a/src/bin/pg_upgrade/po/de.po +++ b/src/bin/pg_upgrade/po/de.po @@ -1,13 +1,13 @@ # German message translation file for pg_upgrade -# Copyright (C) 2023 PostgreSQL Global Development Group +# Copyright (C) 2024 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: pg_upgrade (PostgreSQL) 16\n" +"Project-Id-Version: pg_upgrade (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-19 17:19+0000\n" -"PO-Revision-Date: 2023-05-19 20:51+0200\n" +"POT-Creation-Date: 2024-10-30 10:50+0000\n" +"PO-Revision-Date: 2024-10-30 16:05+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -15,7 +15,248 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: check.c:69 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "Speicher aufgebraucht\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "konnte effektive Benutzer-ID %ld nicht nachschlagen: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "Benutzer existiert nicht" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s«\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "Datenbankname enthält Newline oder Carriage Return: »%s«\n" + +#: check.c:111 +msgid "Checking for system-defined composite types in user tables" +msgstr "Prüfe auf systemdefinierte zusammengesetzte Typen in Benutzertabellen" + +#: check.c:118 +msgid "" +"Your installation contains system-defined composite types in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"Ihre Installation enthält systemdefinierte zusammengesetzte Typen in\n" +"Benutzertabellen. Die OIDs dieser Typen sind nicht über\n" +"PostgreSQL-Versionen stabil und daher kann dieser Cluster gegenwärtig\n" +"nicht aktualisiert werden. Sie können die Problemspalten löschen\n" +"und das Upgrade neu starten.\n" + +#: check.c:132 +msgid "Checking for incompatible \"line\" data type" +msgstr "Prüfe auf inkompatiblen Datentyp »line«" + +#: check.c:137 +msgid "" +"Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"Ihre Installation enthält den Datentyp »line« in Benutzertabellen. Das\n" +"interne Format und das Eingabe-/Ausgabeformat dieses Datentyps wurden\n" +"zwischen Ihrem alten und neuen Cluster geändert und daher kann dieser\n" +"Cluster gegenwärtig nicht aktualisiert werden. Sie können die\n" +"Problemspalten löschen und das Upgrade neu starten.\n" + +#: check.c:154 +msgid "Checking for reg* data types in user tables" +msgstr "Prüfe auf reg*-Datentypen in Benutzertabellen" + +#: check.c:181 +msgid "" +"Your installation contains one of the reg* data types in user tables.\n" +"These data types reference system OIDs that are not preserved by\n" +"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"Ihre Installation enthält einen der reg*-Datentypen in\n" +"Benutzertabellen. Diese Datentypen verweisen auf System-OIDs, die von\n" +"pg_upgrade nicht erhalten werden. Daher kann dieser Cluster\n" +"gegenwärtig nicht aktualiert werden. Sie können die Problemspalten\n" +"löschen und das Upgrade neu starten.\n" + +#: check.c:193 +msgid "Checking for incompatible \"aclitem\" data type" +msgstr "Prüfe auf inkompatiblen Datentyp »aclitem«" + +#: check.c:198 +msgid "" +"Your installation contains the \"aclitem\" data type in user tables.\n" +"The internal format of \"aclitem\" changed in PostgreSQL version 16\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"Ihre Installation enthält den Datentyp »aclitem« in\n" +"Benutzertabellen. Das interne Format von »aclitem« wurde in PostgreSQL\n" +"16 geändert. Daher kann dieser Cluster gegenwärtig nicht aktualisiert\n" +"werden. Sie können die Problemspalten löschen und das Upgrade neu\n" +"starten.\n" + +#: check.c:217 +msgid "Checking for invalid \"unknown\" user columns" +msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »unknown«" + +#: check.c:222 +msgid "" +"Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this cluster\n" +"cannot currently be upgraded. You can drop the problem columns\n" +"and restart the upgrade.\n" +msgstr "" +"Ihre Installation enthält den Datentyp »unknown« in\n" +"Benutzertabellen. Dieser Datentyp ist nicht mehr in Tabellen erlaubt\n" +"und daher kann dieser Cluster gegenwärtig nicht aktualisiert\n" +"werden. Sie können die Problemspalten löschen und das Upgrade neu\n" +"starten.\n" + +#: check.c:239 +msgid "Checking for invalid \"sql_identifier\" user columns" +msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »sql_identifier«" + +#: check.c:244 +msgid "" +"Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can drop the problem\n" +"columns and restart the upgrade.\n" +msgstr "" +"Ihre Installation enthält den Datentyp »sql_identifier« in\n" +"Benutzertabellen. Das Speicherformat dieses Datentyps wurde geändert\n" +"und daher kann dieser Cluster gegenwärtig nicht aktualisiert\n" +"werden. Sie können die Problemspalten löschen und das Upgrade neu\n" +"starten.\n" + +#: check.c:255 +msgid "Checking for incompatible \"jsonb\" data type in user tables" +msgstr "Prüfe auf inkompatiblen Datentyp »jsonb« in Benutzertabellen" + +#: check.c:260 +msgid "" +"Your installation contains the \"jsonb\" data type in user tables.\n" +"The internal format of \"jsonb\" changed during 9.4 beta so this\n" +"cluster cannot currently be upgraded. You can drop the problem \n" +"columns and restart the upgrade.\n" +msgstr "" +"Ihre Installation enthält den Datentyp »jsonb« in\n" +"Benutzertabellen. Das interne Format von »jsonb« wurde während 9.4\n" +"Beta geändert. Daher kann dieser Cluster gegenwärtig nicht\n" +"aktualisiert werden. Sie können die Problemspalten löschen und das\n" +"Upgrade neu starten.\n" + +#: check.c:272 +msgid "Checking for removed \"abstime\" data type in user tables" +msgstr "Prüfe auf entfernten Datentyp »abstime« in Benutzertabellen" + +#: check.c:277 +msgid "" +"Your installation contains the \"abstime\" data type in user tables.\n" +"The \"abstime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Ihre Installation enthält den Datentyp »abstime« in Benutzertabellen. Der\n" +"Typ »abstime« wurde in PostgreSQL 12 entfernt. Daher kann dieser Cluster\n" +"gegenwärtig nicht aktualisiert werden. Sie können die Problemspalten\n" +"löschen oder in einen anderen Datentyp ändern und das Upgrade neu\n" +"starten.\n" + +#: check.c:285 +msgid "Checking for removed \"reltime\" data type in user tables" +msgstr "Prüfe auf entfernten Datentyp »reltime« in Benutzertabellen" + +#: check.c:290 +msgid "" +"Your installation contains the \"reltime\" data type in user tables.\n" +"The \"reltime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Ihre Installation enthält den Datentyp »reltime« in Benutzertabellen. Der\n" +"Typ »reltime« wurde in PostgreSQL 12 entfernt. Daher kann dieser Cluster\n" +"gegenwärtig nicht aktualisiert werden. Sie können die Problemspalten\n" +"löschen oder in einen anderen Datentyp ändern und das Upgrade neu\n" +"starten.\n" + +#: check.c:298 +msgid "Checking for removed \"tinterval\" data type in user tables" +msgstr "Prüfe auf entfernten Datentyp »tinterval« in Benutzertabellen" + +#: check.c:303 +msgid "" +"Your installation contains the \"tinterval\" data type in user tables.\n" +"The \"tinterval\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Ihre Installation enthält den Datentyp »tinterval« in Benutzertabellen. Der\n" +"Typ »tinterval« wurde in PostgreSQL 12 entfernt. Daher kann dieser Cluster\n" +"gegenwärtig nicht aktualisiert werden. Sie können die Problemspalten\n" +"löschen oder in einen anderen Datentyp ändern und das Upgrade neu\n" +"starten.\n" + +#: check.c:345 +#, c-format +msgid "Checking data type usage" +msgstr "Prüfe Verwendung von Datentypen" + +#: check.c:480 +#, c-format +msgid "failed check: %s" +msgstr "fehlgeschlagene Prüfung: %s" + +#: check.c:483 +msgid "A list of the problem columns is in the file:" +msgstr "Eine Liste der Problemspalten ist in der Datei:" + +#: check.c:495 check.c:963 check.c:1136 check.c:1251 check.c:1345 check.c:1473 +#: check.c:1549 check.c:1613 check.c:1686 check.c:1865 check.c:1884 +#: check.c:1953 check.c:2005 file.c:378 file.c:415 function.c:189 option.c:493 +#: version.c:79 version.c:177 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "konnte Datei »%s« nicht öffnen: %m" + +#: check.c:522 +#, c-format +msgid "Data type checks failed: %s" +msgstr "Datentypprüfungen fehlgeschlagen: %s" + +#: check.c:563 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -24,7 +265,7 @@ msgstr "" "Führe Konsistenzprüfungen am alten laufenden Server durch\n" "---------------------------------------------------------" -#: check.c:75 +#: check.c:569 #, c-format msgid "" "Performing Consistency Checks\n" @@ -33,7 +274,7 @@ msgstr "" "Führe Konsistenzprüfungen durch\n" "-------------------------------" -#: check.c:221 +#: check.c:718 #, c-format msgid "" "\n" @@ -42,7 +283,7 @@ msgstr "" "\n" "*Cluster sind kompatibel*" -#: check.c:229 +#: check.c:726 #, c-format msgid "" "\n" @@ -54,7 +295,7 @@ msgstr "" "neuen Cluster neu mit initdb initialisieren, bevor fortgesetzt\n" "werden kann." -#: check.c:270 +#: check.c:767 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -65,7 +306,7 @@ msgstr "" "den neuen Server starten, sollte Sie diesen Befehl ausführen:\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:276 +#: check.c:773 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -74,7 +315,7 @@ msgstr "" "Mit diesem Skript können die Dateien des alten Clusters gelöscht werden:\n" " %s" -#: check.c:281 +#: check.c:778 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -87,57 +328,57 @@ msgstr "" "Datenverzeichnis des neuen Clusters im alten Cluster-Verzeichnis\n" "liegen. Der Inhalt des alten Clusters muss von Hand gelöscht werden." -#: check.c:293 +#: check.c:790 #, c-format msgid "Checking cluster versions" msgstr "Prüfe Cluster-Versionen" -#: check.c:305 +#: check.c:802 #, c-format msgid "This utility can only upgrade from PostgreSQL version %s and later." msgstr "Dieses Programm kann nur Upgrades von PostgreSQL Version %s oder später durchführen." -#: check.c:310 +#: check.c:807 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s." msgstr "Dieses Programm kann nur Upgrades auf PostgreSQL Version %s durchführen." -#: check.c:319 +#: check.c:816 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions." msgstr "Dieses Programm kann keine Downgrades auf ältere Hauptversionen von PostgreSQL durchführen." -#: check.c:324 +#: check.c:821 #, c-format msgid "Old cluster data and binary directories are from different major versions." msgstr "Die Daten- und Programmverzeichnisse des alten Clusters stammen von verschiedenen Hauptversionen." -#: check.c:327 +#: check.c:824 #, c-format msgid "New cluster data and binary directories are from different major versions." msgstr "Die Daten- und Programmverzeichnisse des neuen Clusters stammen von verschiedenen Hauptversionen." -#: check.c:342 +#: check.c:839 #, c-format msgid "When checking a live server, the old and new port numbers must be different." msgstr "Wenn ein laufender Server geprüft wird, müssen die alte und die neue Portnummer verschieden sein." -#: check.c:362 +#: check.c:859 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" msgstr "Datenbank »%s« im neuen Cluster ist nicht leer: Relation »%s.%s« gefunden" -#: check.c:385 +#: check.c:882 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Prüfe Tablespace-Verzeichnisse des neuen Clusters" -#: check.c:396 +#: check.c:893 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "Tablespace-Verzeichnis für neuen Cluster existiert bereits: »%s«" -#: check.c:429 +#: check.c:926 #, c-format msgid "" "\n" @@ -146,7 +387,7 @@ msgstr "" "\n" "WARNUNG: das neue Datenverzeichnis sollte nicht im alten Datenverzeichnis, d.h. %s, liegen" -#: check.c:453 +#: check.c:950 #, c-format msgid "" "\n" @@ -155,61 +396,53 @@ msgstr "" "\n" "WARNUNG: benutzerdefinierte Tablespace-Pfade sollten nicht im Datenverzeichnis, d.h. %s, liegen" -#: check.c:463 +#: check.c:960 #, c-format msgid "Creating script to delete old cluster" msgstr "Erzeuge Skript zum Löschen des alten Clusters" -#: check.c:466 check.c:639 check.c:755 check.c:850 check.c:979 check.c:1056 -#: check.c:1299 check.c:1373 file.c:339 function.c:163 option.c:476 -#: version.c:116 version.c:292 version.c:426 -#, c-format -msgid "could not open file \"%s\": %s" -msgstr "konnte Datei »%s« nicht öffnen: %s" - -#: check.c:517 +#: check.c:1014 #, c-format -msgid "could not add execute permission to file \"%s\": %s" -msgstr "konnte Datei »%s« nicht ausführbar machen: %s" +msgid "could not add execute permission to file \"%s\": %m" +msgstr "konnte Datei »%s« nicht ausführbar machen: %m" -#: check.c:537 +#: check.c:1034 #, c-format msgid "Checking database user is the install user" msgstr "Prüfe ob der Datenbankbenutzer der Installationsbenutzer ist" -#: check.c:553 +#: check.c:1050 #, c-format msgid "database user \"%s\" is not the install user" msgstr "Datenbankbenutzer »%s« ist nicht der Installationsbenutzer" -#: check.c:564 +#: check.c:1061 #, c-format msgid "could not determine the number of users" msgstr "konnte die Anzahl der Benutzer nicht ermitteln" -#: check.c:572 +#: check.c:1069 #, c-format msgid "Only the install user can be defined in the new cluster." msgstr "Nur der Installationsbenutzer darf im neuen Cluster definiert sein." -#: check.c:601 +#: check.c:1098 #, c-format msgid "Checking database connection settings" msgstr "Prüfe Verbindungseinstellungen der Datenbank" -#: check.c:627 +#: check.c:1124 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false" msgstr "template0 darf keine Verbindungen erlauben, d.h. ihr pg_database.datallowconn muss falsch sein" -#: check.c:654 check.c:775 check.c:873 check.c:999 check.c:1076 check.c:1135 -#: check.c:1196 check.c:1224 check.c:1254 check.c:1313 check.c:1394 -#: function.c:185 version.c:192 version.c:232 version.c:378 +#: check.c:1150 check.c:1270 check.c:1367 check.c:1492 check.c:1568 +#: check.c:1626 check.c:1706 check.c:1897 check.c:2022 function.c:210 #, c-format msgid "fatal" msgstr "fatal" -#: check.c:655 +#: check.c:1151 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -229,27 +462,27 @@ msgstr "" "in der Datei:\n" " %s" -#: check.c:680 +#: check.c:1176 #, c-format msgid "Checking for prepared transactions" msgstr "Prüfe auf vorbereitete Transaktionen" -#: check.c:689 +#: check.c:1185 #, c-format msgid "The source cluster contains prepared transactions" msgstr "Der alte Cluster enthält vorbereitete Transaktionen" -#: check.c:691 +#: check.c:1187 #, c-format msgid "The target cluster contains prepared transactions" msgstr "Der neue Cluster enthält vorbereitete Transaktionen" -#: check.c:716 +#: check.c:1212 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Prüfe auf contrib/isn mit unpassender bigint-Übergabe" -#: check.c:776 +#: check.c:1271 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -269,12 +502,12 @@ msgstr "" "der problematischen Funktionen ist in der Datei:\n" " %s" -#: check.c:798 +#: check.c:1293 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Prüfe auf benutzerdefinierte Postfix-Operatoren" -#: check.c:874 +#: check.c:1368 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -289,12 +522,12 @@ msgstr "" "Liste der benutzerdefinierten Postfixoperatoren ist in der Datei:\n" " %s" -#: check.c:898 +#: check.c:1392 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "Prüfe auf inkompatible polymorphische Funktionen" -#: check.c:1000 +#: check.c:1493 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -315,12 +548,12 @@ msgstr "" "Eine Liste der problematischen Objekte ist in der Datei:\n" " %s" -#: check.c:1024 +#: check.c:1517 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Prüfe auf Tabellen mit WITH OIDS" -#: check.c:1077 +#: check.c:1569 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -335,102 +568,12 @@ msgstr "" "Eine Liste der Tabellen mit dem Problem ist in der Datei:\n" " %s" -#: check.c:1105 -#, c-format -msgid "Checking for system-defined composite types in user tables" -msgstr "Prüfe auf systemdefinierte zusammengesetzte Typen in Benutzertabellen" - -#: check.c:1136 -#, c-format -msgid "" -"Your installation contains system-defined composite type(s) in user tables.\n" -"These type OIDs are not stable across PostgreSQL versions,\n" -"so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"Ihre Installation enthält systemdefinierte zusammengesetzte Typen in\n" -"Benutzertabellen. Die OIDs dieser Typen sind nicht über\n" -"PostgreSQL-Versionen stabil und daher kann dieser Cluster gegenwärtig\n" -"nicht aktualisiert werden. Sie können die Problemspalten löschen\n" -"und das Upgrade neu starten. Eine Liste der Problemspalten ist in der\n" -"Datei:\n" -" %s" - -#: check.c:1164 -#, c-format -msgid "Checking for reg* data types in user tables" -msgstr "Prüfe auf reg*-Datentypen in Benutzertabellen" - -#: check.c:1197 -#, c-format -msgid "" -"Your installation contains one of the reg* data types in user tables.\n" -"These data types reference system OIDs that are not preserved by\n" -"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"Ihre Installation enthält einen der reg*-Datentypen in\n" -"Benutzertabellen. Diese Datentypen verweisen auf System-OIDs, die von\n" -"pg_upgrade nicht erhalten werden. Daher kann dieser Cluster\n" -"gegenwärtig nicht aktualiert werden. Sie können die Problemspalten\n" -"löschen und das Upgrade neu starten. Eine Liste der Problemspalten\n" -"ist in der Datei:\n" -" %s" - -#: check.c:1218 -#, c-format -msgid "Checking for incompatible \"aclitem\" data type in user tables" -msgstr "Prüfe auf inkompatiblen Datentyp »aclitem« in Benutzertabellen" - -#: check.c:1225 -#, c-format -msgid "" -"Your installation contains the \"aclitem\" data type in user tables.\n" -"The internal format of \"aclitem\" changed in PostgreSQL version 16\n" -"so this cluster cannot currently be upgraded. You can drop the\n" -"problem columns and restart the upgrade. A list of the problem\n" -"columns is in the file:\n" -" %s" -msgstr "" -"Ihre Installation enthält den Datentyp »aclitem« in\n" -"Benutzertabellen. Das interne Format von »aclitem« wurde in PostgreSQL\n" -"16 geändert. Daher kann dieser Cluster gegenwärtig nicht aktualisiert\n" -"werden. Sie können die Problemspalten löschen und das Upgrade neu\n" -"starten. Eine Liste der Problemspalten ist in der Datei:\n" -" %s" - -#: check.c:1246 -#, c-format -msgid "Checking for incompatible \"jsonb\" data type" -msgstr "Prüfe auf inkompatiblen Datentyp »jsonb«" - -#: check.c:1255 -#, c-format -msgid "" -"Your installation contains the \"jsonb\" data type in user tables.\n" -"The internal format of \"jsonb\" changed during 9.4 beta so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"Ihre Installation enthält den Datentyp »jsonb« in\n" -"Benutzertabellen. Das interne Format von »jsonb« wurde während 9.4\n" -"Beta geändert. Daher kann dieser Cluster gegenwärtig nicht\n" -"aktualisiert werden. Sie können die Problemspalten löschen und das\n" -"Upgrade neu starten. Eine Liste der Problemspalten ist in der Datei:\n" -" %s" - -#: check.c:1282 +#: check.c:1596 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Prüfe auf Rollen, die mit »pg_« anfangen" -#: check.c:1314 +#: check.c:1627 #, c-format msgid "" "Your installation contains roles starting with \"pg_\".\n" @@ -445,12 +588,12 @@ msgstr "" "Eine Liste der Rollen, die mit »pg_« anfangen, ist in der Datei:\n" " %s" -#: check.c:1334 +#: check.c:1647 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "Prüfe auf benutzerdefinierte Kodierungsumwandlungen" -#: check.c:1395 +#: check.c:1707 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -469,12 +612,93 @@ msgstr "" "in der Datei:\n" " %s" -#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508 +#: check.c:1746 #, c-format -msgid "could not get control data using %s: %s" -msgstr "konnte Kontrolldaten mit %s nicht ermitteln: %s" +msgid "Checking for new cluster logical replication slots" +msgstr "Prüfe logische Replikations-Slots des neuen Clusters" + +#: check.c:1754 +#, c-format +msgid "could not count the number of logical replication slots" +msgstr "konnte Anzahl der logischen Replikations-Slots nicht zählen" + +#: check.c:1759 +#, c-format +msgid "expected 0 logical replication slots but found %d" +msgstr "0 logische Replikations-Slots erwartet aber %d gefunden" + +#: check.c:1769 check.c:1820 +#, c-format +msgid "could not determine parameter settings on new cluster" +msgstr "konnte Parametereinstellung im neuen Cluster nicht ermitteln" + +#: check.c:1774 +#, c-format +msgid "\"wal_level\" must be \"logical\" but is set to \"%s\"" +msgstr "»wal_level« muss »logical« sein, aber es ist auf »%s« gesetzt" + +#: check.c:1780 +#, c-format +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of logical replication slots (%d) on the old cluster" +msgstr "»max_replication_slots« (%d) muss größer als oder gleich der Anzahl der logischen Replikations-Slots (%d) im alten Cluster sein" + +#: check.c:1812 +#, c-format +msgid "Checking for new cluster configuration for subscriptions" +msgstr "Prüfe Konfiguration für Subskriptionen im neuen Cluster" + +#: check.c:1824 +#, c-format +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of subscriptions (%d) on the old cluster" +msgstr "»max_replication_slots« (%d) muss größer als oder gleich der Anzahl der Subskriptionen (%d) im alten Cluster sein" + +#: check.c:1846 +#, c-format +msgid "Checking for valid logical replication slots" +msgstr "Prüfe auf gültige logische Replikations-Slots" + +#: check.c:1898 +#, c-format +msgid "" +"Your installation contains logical replication slots that cannot be upgraded.\n" +"You can remove invalid slots and/or consume the pending WAL for other slots,\n" +"and then restart the upgrade.\n" +"A list of the problematic slots is in the file:\n" +" %s" +msgstr "" +"Ihre Installation enthält logische Replikations-Slots, die nicht\n" +"aktualisiert werden können. Sie können ungültige Slots entfernen\n" +"und/oder den noch nicht erledigten WAL der anderen Slots konsumieren\n" +"und dann das Upgrade neu starten.\n" +"Eine Liste der problematischen Slots ist in der Datei:\n" +" %s" + +#: check.c:1922 +#, c-format +msgid "Checking for subscription state" +msgstr "Prüfe Subskriptionszustand" + +#: check.c:2023 +#, c-format +msgid "" +"Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n" +"You can allow the initial sync to finish for all relations and then restart the upgrade.\n" +"A list of the problematic subscriptions is in the file:\n" +" %s" +msgstr "" +"Ihre Installation enthält Subskriptionen ohne Origin oder mit\n" +"Relationen, die nicht im Zustand i (initialize) oder r (ready) sind.\n" +"Sie können die initiale Synchronisierung abschließen lassen und dann\n" +"das Upgrade neu starten. Eine Liste der problematischen\n" +"Subskriptionen ist in der Datei:\n" +" %s" -#: controldata.c:140 +#: controldata.c:129 controldata.c:199 +#, c-format +msgid "could not get control data using %s: %m" +msgstr "konnte Kontrolldaten mit %s nicht ermitteln: %m" + +#: controldata.c:139 #, c-format msgid "%d: database cluster state problem" msgstr "%d: Problem mit dem Zustand des Clusters" @@ -491,13 +715,18 @@ msgstr "Der neue Cluster wurde im Wiederherstellungsmodus heruntergefahren. Um i #: controldata.c:165 #, c-format -msgid "The source cluster was not shut down cleanly." -msgstr "Der alte Cluster wurde nicht sauber heruntergefahren." +msgid "The source cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "Der alte Cluster wurde nicht sauber heruntergefahren, gemeldeter Status: »%s«" #: controldata.c:167 #, c-format -msgid "The target cluster was not shut down cleanly." -msgstr "Der neue Cluster wurde nicht sauber heruntergefahren." +msgid "The target cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "Der neue Cluster wurde nicht sauber heruntergefahren, gemeldeter Status: »%s«" + +#: controldata.c:175 controldata.c:507 +#, c-format +msgid "could not get control data using %s: %s" +msgstr "konnte Kontrolldaten mit %s nicht ermitteln: %s" #: controldata.c:181 #, c-format @@ -509,139 +738,139 @@ msgstr "Im alten Cluster fehlen Cluster-Zustandsinformationen:" msgid "The target cluster lacks cluster state information:" msgstr "Im neuen Cluster fehlen Cluster-Zustandsinformationen:" -#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554 -#: relfilenumber.c:231 server.c:34 util.c:337 +#: controldata.c:213 dump.c:50 exec.c:118 pg_upgrade.c:556 pg_upgrade.c:596 +#: pg_upgrade.c:945 relfilenumber.c:233 server.c:34 util.c:337 #, c-format msgid "%s" msgstr "%s" -#: controldata.c:221 +#: controldata.c:220 #, c-format msgid "%d: pg_resetwal problem" msgstr "%d: Problem mit pg_resetwal" -#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263 -#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315 -#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359 -#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388 -#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432 -#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476 -#: controldata.c:487 controldata.c:498 +#: controldata.c:230 controldata.c:240 controldata.c:251 controldata.c:262 +#: controldata.c:273 controldata.c:292 controldata.c:303 controldata.c:314 +#: controldata.c:325 controldata.c:336 controldata.c:347 controldata.c:358 +#: controldata.c:361 controldata.c:365 controldata.c:375 controldata.c:387 +#: controldata.c:398 controldata.c:409 controldata.c:420 controldata.c:431 +#: controldata.c:442 controldata.c:453 controldata.c:464 controldata.c:475 +#: controldata.c:486 controldata.c:497 #, c-format msgid "%d: controldata retrieval problem" msgstr "%d: Problem beim Ermitteln der Kontrolldaten" -#: controldata.c:579 +#: controldata.c:578 #, c-format msgid "The source cluster lacks some required control information:" msgstr "Im alten Cluster fehlen einige notwendige Kontrollinformationen:" -#: controldata.c:582 +#: controldata.c:581 #, c-format msgid "The target cluster lacks some required control information:" msgstr "Im neuen Cluster fehlen einige notwendige Kontrollinformationen:" -#: controldata.c:585 +#: controldata.c:584 #, c-format msgid " checkpoint next XID" msgstr " Checkpoint nächste XID" -#: controldata.c:588 +#: controldata.c:587 #, c-format msgid " latest checkpoint next OID" msgstr " NextOID des letzten Checkpoints" -#: controldata.c:591 +#: controldata.c:590 #, c-format msgid " latest checkpoint next MultiXactId" msgstr " NextMultiXactId des letzten Checkpoints" -#: controldata.c:595 +#: controldata.c:594 #, c-format msgid " latest checkpoint oldest MultiXactId" msgstr " oldestMultiXid des letzten Checkpoints" -#: controldata.c:598 +#: controldata.c:597 #, c-format msgid " latest checkpoint oldestXID" msgstr " oldestXID des letzten Checkpoints" -#: controldata.c:601 +#: controldata.c:600 #, c-format msgid " latest checkpoint next MultiXactOffset" msgstr " NextMultiOffset des letzten Checkpoints" -#: controldata.c:604 +#: controldata.c:603 #, c-format msgid " first WAL segment after reset" msgstr " erstes WAL-Segment nach dem Reset" -#: controldata.c:607 +#: controldata.c:606 #, c-format msgid " float8 argument passing method" msgstr " Übergabe von Float8-Argumenten" -#: controldata.c:610 +#: controldata.c:609 #, c-format msgid " maximum alignment" msgstr " maximale Ausrichtung (Alignment)" -#: controldata.c:613 +#: controldata.c:612 #, c-format msgid " block size" msgstr " Blockgröße" -#: controldata.c:616 +#: controldata.c:615 #, c-format msgid " large relation segment size" msgstr " Segmentgröße für große Relationen" -#: controldata.c:619 +#: controldata.c:618 #, c-format msgid " WAL block size" msgstr " WAL-Blockgröße" -#: controldata.c:622 +#: controldata.c:621 #, c-format msgid " WAL segment size" msgstr " WAL-Segmentgröße" -#: controldata.c:625 +#: controldata.c:624 #, c-format msgid " maximum identifier length" msgstr " maximale Bezeichnerlänge" -#: controldata.c:628 +#: controldata.c:627 #, c-format msgid " maximum number of indexed columns" msgstr " maximale Anzahl indizierter Spalten" -#: controldata.c:631 +#: controldata.c:630 #, c-format msgid " maximum TOAST chunk size" msgstr " maximale TOAST-Chunk-Größe" -#: controldata.c:635 +#: controldata.c:634 #, c-format msgid " large-object chunk size" msgstr " Large-Object-Chunk-Größe" -#: controldata.c:638 +#: controldata.c:637 #, c-format msgid " dates/times are integers?" msgstr " Datum/Zeit sind Ganzzahlen?" -#: controldata.c:642 +#: controldata.c:641 #, c-format msgid " data checksum version" msgstr " Datenprüfsummenversion" -#: controldata.c:644 +#: controldata.c:643 #, c-format msgid "Cannot continue without required control information, terminating" msgstr "Kann ohne die benötigten Kontrollinformationen nicht fortsetzen, Programm wird beendet" -#: controldata.c:659 +#: controldata.c:658 #, c-format msgid "" "old and new pg_controldata alignments are invalid or do not match.\n" @@ -650,77 +879,77 @@ msgstr "" "altes und neues Alignment in pg_controldata ist ungültig oder stimmt nicht überein\n" "Wahrscheinlich ist ein Cluster eine 32-Bit-Installation und der andere 64-Bit" -#: controldata.c:663 +#: controldata.c:662 #, c-format msgid "old and new pg_controldata block sizes are invalid or do not match" msgstr "alte und neue Blockgrößen von pg_controldata sind ungültig oder stimmen nicht überein" -#: controldata.c:666 +#: controldata.c:665 #, c-format msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match" msgstr "alte und neue maximale Relationssegmentgrößen von pg_controldata sind ungültig oder stimmen nicht überein" -#: controldata.c:669 +#: controldata.c:668 #, c-format msgid "old and new pg_controldata WAL block sizes are invalid or do not match" msgstr "alte und neue WAL-Blockgrößen von pg_controldata sind ungültig oder stimmen nicht überein" -#: controldata.c:672 +#: controldata.c:671 #, c-format msgid "old and new pg_controldata WAL segment sizes are invalid or do not match" msgstr "alte und neue WAL-Segmentgrößen von pg_controldata sind ungültig oder stimmen nicht überein" -#: controldata.c:675 +#: controldata.c:674 #, c-format msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match" msgstr "alte und neue maximale Bezeichnerlängen von pg_controldata sind ungültig oder stimmen nicht überein" -#: controldata.c:678 +#: controldata.c:677 #, c-format msgid "old and new pg_controldata maximum indexed columns are invalid or do not match" msgstr "alte und neue Maximalzahlen indizierter Spalten von pg_controldata sind ungültig oder stimmen nicht überein" -#: controldata.c:681 +#: controldata.c:680 #, c-format msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match" msgstr "alte und neue maximale TOAST-Chunk-Größen von pg_controldata sind ungültig oder stimmen nicht überein" -#: controldata.c:686 +#: controldata.c:685 #, c-format msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match" msgstr "alte und neue Large-Object-Chunk-Größen von pg_controldata sind ungültig oder stimmen nicht überein" -#: controldata.c:689 +#: controldata.c:688 #, c-format msgid "old and new pg_controldata date/time storage types do not match" msgstr "alte und neue Speicherung von Datums- und Zeittypen von pg_controldata ist ungültig oder stimmt nicht überein" -#: controldata.c:702 +#: controldata.c:701 #, c-format msgid "old cluster does not use data checksums but the new one does" msgstr "der alte Cluster verwendet keine Datenprüfsummen, aber der neue verwendet sie" -#: controldata.c:705 +#: controldata.c:704 #, c-format msgid "old cluster uses data checksums but the new one does not" msgstr "die alte Cluster verwendet Datenprüfsummen, aber der neue nicht" -#: controldata.c:707 +#: controldata.c:706 #, c-format msgid "old and new cluster pg_controldata checksum versions do not match" msgstr "Prüfsummenversionen im alten und neuen Cluster stimmen nicht überein" -#: controldata.c:718 +#: controldata.c:717 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "Füge Endung ».old« an altes global/pg_control an" -#: controldata.c:723 +#: controldata.c:722 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" -#: controldata.c:727 +#: controldata.c:726 #, c-format msgid "" "\n" @@ -745,27 +974,32 @@ msgstr "Erzeuge Dump der globalen Objekte" msgid "Creating dump of database schemas" msgstr "Erzeuge Dump der Datenbankschemas" -#: exec.c:47 exec.c:52 +#: exec.c:47 +#, c-format +msgid "could not get pg_ctl version data using %s: %m" +msgstr "konnte pg_ctl-Versionsdaten mit %s nicht ermitteln: %m" + +#: exec.c:51 #, c-format msgid "could not get pg_ctl version data using %s: %s" msgstr "konnte pg_ctl-Versionsdaten mit %s nicht ermitteln: %s" -#: exec.c:56 +#: exec.c:55 #, c-format msgid "could not get pg_ctl version output from %s" msgstr "konnte pg_ctl-Version nicht ermitteln von %s" -#: exec.c:113 exec.c:117 +#: exec.c:112 exec.c:116 #, c-format msgid "command too long" msgstr "Befehl zu lang" -#: exec.c:161 pg_upgrade.c:286 +#: exec.c:160 pg_upgrade.c:311 #, c-format msgid "could not open log file \"%s\": %m" msgstr "konnte Logdatei »%s« nicht öffnen: %m" -#: exec.c:193 +#: exec.c:192 #, c-format msgid "" "\n" @@ -774,12 +1008,12 @@ msgstr "" "\n" "*fehlgeschlagen*" -#: exec.c:196 +#: exec.c:195 #, c-format msgid "There were problems executing \"%s\"" msgstr "Probleme beim Ausführen von »%s«" -#: exec.c:199 +#: exec.c:198 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" @@ -788,7 +1022,7 @@ msgstr "" "Prüfen Sie die letzten Zeilen von »%s« oder »%s« für den\n" "wahrscheinlichen Grund für das Scheitern." -#: exec.c:204 +#: exec.c:203 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" @@ -797,141 +1031,156 @@ msgstr "" "Prüfen Sie die letzten Zeilen von »%s« für den\n" "wahrscheinlichen Grund für das Scheitern." -#: exec.c:219 pg_upgrade.c:296 +#: exec.c:218 pg_upgrade.c:321 #, c-format msgid "could not write to log file \"%s\": %m" msgstr "konnte nicht in Logdatei »%s «schreiben: %m" -#: exec.c:245 +#: exec.c:244 #, c-format -msgid "could not open file \"%s\" for reading: %s" -msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %s" +msgid "could not open file \"%s\" for reading: %m" +msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" -#: exec.c:272 +#: exec.c:270 #, c-format msgid "You must have read and write access in the current directory." msgstr "Sie müssen Lese- und Schreibzugriff im aktuellen Verzeichnis haben." -#: exec.c:325 exec.c:391 +#: exec.c:323 exec.c:389 exec.c:439 #, c-format -msgid "check for \"%s\" failed: %s" -msgstr "Prüfen von »%s« fehlgeschlagen: %s" +msgid "check for \"%s\" failed: %m" +msgstr "Prüfen von »%s« fehlgeschlagen: %m" -#: exec.c:328 exec.c:394 +#: exec.c:326 exec.c:392 #, c-format msgid "\"%s\" is not a directory" msgstr "»%s« ist kein Verzeichnis" -#: exec.c:441 -#, c-format -msgid "check for \"%s\" failed: %m" -msgstr "Prüfen von »%s« fehlgeschlagen: %m" - -#: exec.c:446 +#: exec.c:444 #, c-format msgid "check for \"%s\" failed: cannot execute" msgstr "Prüfen von »%s« fehlgeschlagen: kann nicht ausgeführt werden" -#: exec.c:456 +#: exec.c:454 #, c-format msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"" msgstr "Prüfen von »%s« fehlgeschlagen: falsche Version: gefunden »%s«, erwartet »%s«" -#: file.c:43 file.c:64 +#: file.c:44 #, c-format -msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "Fehler beim Klonen von Relation »%s.%s« (»%s« nach »%s«): %s" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "Fehler beim Klonen von Relation »%s.%s« (»%s« nach »%s«): %m" + +#: file.c:51 +#, c-format +msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "Fehler beim Klonen von Relation »%s.%s«: konnte Datei »%s« nicht öffnen: %m" + +#: file.c:56 +#, c-format +msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "Fehler beim Klonen von Relation »%s.%s«: konnte Datei »%s« nicht erzeugen: %m" -#: file.c:50 +#: file.c:65 #, c-format -msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s" -msgstr "Fehler beim Klonen von Relation »%s.%s«: konnte Datei »%s« nicht öffnen: %s" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s" +msgstr "Fehler beim Klonen von Relation »%s.%s« (»%s« nach »%s«): %s" -#: file.c:55 +#: file.c:91 file.c:160 file.c:233 #, c-format -msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s" -msgstr "Fehler beim Klonen von Relation »%s.%s«: konnte Datei »%s« nicht erzeugen: %s" +msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht öffnen: %m" -#: file.c:90 file.c:193 +#: file.c:96 file.c:165 file.c:242 #, c-format -msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s" -msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht öffnen: %s" +msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht erzeugen: %m" -#: file.c:95 file.c:202 +#: file.c:110 file.c:266 #, c-format -msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s" -msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht erzeugen: %s" +msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %m" +msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht lesen: %m" -#: file.c:109 file.c:226 +#: file.c:122 file.c:344 #, c-format -msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s" -msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht lesen: %s" +msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %m" +msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht schreiben: %m" -#: file.c:121 file.c:304 +#: file.c:136 #, c-format -msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s" -msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Datei »%s« nicht schreiben: %s" +msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "Fehler beim Kopieren von Relation »%s.%s« (»%s« nach »%s«): %m" -#: file.c:135 +#: file.c:172 #, c-format -msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "Fehler beim Kopieren von Relation »%s.%s« (»%s« nach »%s«): %s" +msgid "error while copying relation \"%s.%s\": could not copy file range from \"%s\" to \"%s\": %m" +msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte Dateibereich nicht von »%s« nach »%s« kopieren: %m" -#: file.c:154 +#: file.c:194 #, c-format -msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "Fehler beim Erzeugen einer Verknüpfung für Relation »%s.%s« (»%s« nach »%s«): %s" +msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "Fehler beim Erzeugen einer Verknüpfung für Relation »%s.%s« (»%s« nach »%s«): %m" -#: file.c:197 +#: file.c:237 #, c-format -msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s" -msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte »stat« für Datei »%s« nicht ausführen: %s" +msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %m" +msgstr "Fehler beim Kopieren von Relation »%s.%s«: konnte »stat« für Datei »%s« nicht ausführen: %m" -#: file.c:229 +#: file.c:269 #, c-format msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"" msgstr "Fehler beim Kopieren von Relation »%s.%s«: unvollständige Seite gefunden in Datei »%s«" -#: file.c:331 file.c:348 +#: file.c:371 file.c:387 #, c-format -msgid "could not clone file between old and new data directories: %s" -msgstr "konnte Datei nicht vom alten in das neue Datenverzeichnis klonen: %s" +msgid "could not clone file between old and new data directories: %m" +msgstr "konnte Datei nicht vom alten in das neue Datenverzeichnis klonen: %m" -#: file.c:344 +#: file.c:383 file.c:420 #, c-format -msgid "could not create file \"%s\": %s" -msgstr "konnte Datei »%s« nicht erstellen: %s" +msgid "could not create file \"%s\": %m" +msgstr "konnte Datei »%s« nicht erstellen: %m" -#: file.c:355 +#: file.c:393 #, c-format msgid "file cloning not supported on this platform" msgstr "Klonen von Dateien wird auf dieser Plattform nicht unterstützt" -#: file.c:372 +#: file.c:424 +#, c-format +msgid "could not copy file range between old and new data directories: %m" +msgstr "konnte Dateibereich nicht vom alten in das neue Datenverzeichnis kopieren: %m" + +#: file.c:430 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "copy_file_range wird auf dieser Plattform nicht unterstützt" + +#: file.c:447 #, c-format msgid "" -"could not create hard link between old and new data directories: %s\n" +"could not create hard link between old and new data directories: %m\n" "In link mode the old and new data directories must be on the same file system." msgstr "" -"konnte Hard-Link-Verknüpfung zwischen altem und neuen Datenverzeichnis nicht erzeugen: %s\n" +"konnte Hard-Link-Verknüpfung zwischen altem und neuen Datenverzeichnis nicht erzeugen: %m\n" "Im Link-Modus müssen das alte und das neue Datenverzeichnis im selben Dateisystem liegen." -#: function.c:128 +#: function.c:154 #, c-format msgid "Checking for presence of required libraries" msgstr "Prüfe das Vorhandensein benötigter Bibliotheken" -#: function.c:165 +#: function.c:190 #, c-format msgid "could not load library \"%s\": %s" msgstr "konnte Bibliothek »%s« nicht laden: %s" -#: function.c:176 +#: function.c:201 #, c-format msgid "In database: %s\n" msgstr "In Datenbank: %s\n" -#: function.c:186 +#: function.c:211 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" @@ -947,47 +1196,47 @@ msgstr "" "Datei:\n" " %s" -#: info.c:126 +#: info.c:128 #, c-format msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"" msgstr "Relationsnamen für OID %u in Datenbank »%s« stimmen nicht überein: alten Name »%s.%s«, neuer Name »%s.%s«" -#: info.c:146 +#: info.c:148 #, c-format msgid "Failed to match up old and new tables in database \"%s\"" msgstr "Alte und neue Tabellen in Datenbank »%s« konnten nicht gepaart werden" -#: info.c:227 +#: info.c:229 #, c-format msgid " which is an index on \"%s.%s\"" msgstr ", ein Index für »%s.%s«" -#: info.c:237 +#: info.c:239 #, c-format msgid " which is an index on OID %u" msgstr ", ein Index für OID %u" -#: info.c:249 +#: info.c:251 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr ", eine TOAST-Tabelle für »%s.%s«" -#: info.c:257 +#: info.c:259 #, c-format msgid " which is the TOAST table for OID %u" msgstr ", eine TOAST-Tabelle für OID %u" -#: info.c:261 +#: info.c:263 #, c-format msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s" msgstr "Keine Übereinstimmung gefunden im alten Cluster für neue Relation mit OID %u in Datenbank »%s«: %s" -#: info.c:264 +#: info.c:266 #, c-format msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s" msgstr "Keine Übereinstimmung gefunden im neuen Cluster für alte Relation mit OID %u in Datenbank »%s«: %s" -#: info.c:289 +#: info.c:300 #, c-format msgid "" "\n" @@ -996,7 +1245,7 @@ msgstr "" "\n" "Quelldatenbanken:" -#: info.c:291 +#: info.c:302 #, c-format msgid "" "\n" @@ -1005,82 +1254,92 @@ msgstr "" "\n" "Zieldatenbanken:" -#: info.c:329 +#: info.c:346 #, c-format msgid "template0 not found" msgstr "template0 nicht gefunden" -#: info.c:645 +#: info.c:805 +#, c-format +msgid "Database: \"%s\"" +msgstr "Datenbank: »%s«" + +#: info.c:818 +#, c-format +msgid "relname: \"%s.%s\", reloid: %u, reltblspace: \"%s\"" +msgstr "relname: »%s.%s«, reloid: %u, reltblspace: »%s«" + +#: info.c:832 #, c-format -msgid "Database: %s" -msgstr "Datenbank: %s" +msgid "Logical replication slots in the database:" +msgstr "Logische Replikations-Slots in der Datenbank:" -#: info.c:657 +#: info.c:838 #, c-format -msgid "relname: %s.%s: reloid: %u reltblspace: %s" -msgstr "relname: %s.%s: reloid: %u reltblspace: %s" +msgid "slot name: \"%s\", output plugin: \"%s\", two_phase: %s" +msgstr "Slot-Name: »%s«, Ausgabe-Plugin: »%s«, two_phase: %s" -#: option.c:101 +#: option.c:105 #, c-format msgid "%s: cannot be run as root" msgstr "%s: kann nicht als root ausgeführt werden" -#: option.c:168 +#: option.c:172 #, c-format msgid "invalid old port number" msgstr "ungültige alte Portnummer" -#: option.c:173 +#: option.c:177 #, c-format msgid "invalid new port number" msgstr "ungültige neue Portnummer" -#: option.c:203 +#: option.c:216 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" -#: option.c:210 +#: option.c:223 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: option.c:213 +#: option.c:229 #, c-format msgid "Running in verbose mode" msgstr "Ausführung im Verbose-Modus" -#: option.c:231 +#: option.c:247 msgid "old cluster binaries reside" msgstr "die Programmdateien des alten Clusters liegen" -#: option.c:233 +#: option.c:249 msgid "new cluster binaries reside" msgstr "die Programmdateien des neuen Clusters liegen" -#: option.c:235 +#: option.c:251 msgid "old cluster data resides" msgstr "die Daten das alten Clusters liegen" -#: option.c:237 +#: option.c:253 msgid "new cluster data resides" msgstr "die Daten des neuen Clusters liegen" -#: option.c:239 +#: option.c:255 msgid "sockets will be created" msgstr "die Sockets erzeugt werden sollen" -#: option.c:256 option.c:356 +#: option.c:272 option.c:374 #, c-format msgid "could not determine current directory" msgstr "konnte aktuelles Verzeichnis nicht ermitteln" -#: option.c:259 +#: option.c:275 #, c-format msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows" msgstr "auf Windows kann pg_upgrade nicht von innerhalb des Cluster-Datenverzeichnisses ausgeführt werden" -#: option.c:268 +#: option.c:284 #, c-format msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" @@ -1089,12 +1348,12 @@ msgstr "" "pg_upgrade aktualisiert einen PostgreSQL-Cluster auf eine neue Hauptversion.\n" "\n" -#: option.c:269 +#: option.c:285 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: option.c:270 +#: option.c:286 #, c-format msgid "" " pg_upgrade [OPTION]...\n" @@ -1103,17 +1362,17 @@ msgstr "" " pg_upgrade [OPTION]...\n" "\n" -#: option.c:271 +#: option.c:287 #, c-format msgid "Options:\n" msgstr "Optionen:\n" -#: option.c:272 +#: option.c:288 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" msgstr " -b, --old-bindir=BINVERZ Programmverzeichnis des alten Clusters\n" -#: option.c:273 +#: option.c:289 #, c-format msgid "" " -B, --new-bindir=BINDIR new cluster executable directory (default\n" @@ -1122,99 +1381,111 @@ msgstr "" " -B, --new-bindir=BINVERZ Programmverzeichnis des neuen Clusters\n" " (Standard: gleiches Verzeichnis wie pg_upgrade)\n" -#: option.c:275 +#: option.c:291 #, c-format msgid " -c, --check check clusters only, don't change any data\n" msgstr " -c, --check nur Cluster prüfen, keine Daten ändern\n" -#: option.c:276 +#: option.c:292 #, c-format msgid " -d, --old-datadir=DATADIR old cluster data directory\n" msgstr " -d, --old-datadir=DATENVERZ Datenverzeichnis des alten Clusters\n" -#: option.c:277 +#: option.c:293 #, c-format msgid " -D, --new-datadir=DATADIR new cluster data directory\n" msgstr " -D, --new-datadir=DATENVERZ Datenverzeichnis des neuen Clusters\n" -#: option.c:278 +#: option.c:294 #, c-format msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" msgstr " -j, --jobs=NUM Anzahl paralleler Prozesse oder Threads\n" -#: option.c:279 +#: option.c:295 #, c-format msgid " -k, --link link instead of copying files to new cluster\n" msgstr " -k, --link Dateien in den neuen Cluster verknüpfen statt kopieren\n" -#: option.c:280 +#: option.c:296 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n" " geschrieben sind\n" -#: option.c:281 +#: option.c:297 #, c-format msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n" msgstr " -o, --old-options=OPTIONEN Serveroptionen für den alten Cluster\n" -#: option.c:282 +#: option.c:298 #, c-format msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n" msgstr " -O, --new-options=OPTIONEN Serveroptionen für den neuen Cluster\n" -#: option.c:283 +#: option.c:299 #, c-format msgid " -p, --old-port=PORT old cluster port number (default %d)\n" msgstr " -p, --old-port=PORT Portnummer für den alten Cluster (Standard: %d)\n" -#: option.c:284 +#: option.c:300 #, c-format msgid " -P, --new-port=PORT new cluster port number (default %d)\n" msgstr " -P, --new-port=PORT Portnummer für den neuen Cluster (Standard: %d)\n" -#: option.c:285 +#: option.c:301 #, c-format msgid " -r, --retain retain SQL and log files after success\n" msgstr " -r, --retain SQL- und Logdateien bei Erfolg aufheben\n" -#: option.c:286 +#: option.c:302 #, c-format msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" msgstr " -s, --socketdir=VERZ Verzeichnis für Socket (Standard: aktuelles Verz.)\n" -#: option.c:287 +#: option.c:303 #, c-format msgid " -U, --username=NAME cluster superuser (default \"%s\")\n" msgstr " -U, --username=NAME Cluster-Superuser (Standard: »%s«)\n" -#: option.c:288 +#: option.c:304 #, c-format msgid " -v, --verbose enable verbose internal logging\n" msgstr " -v, --verbose »Verbose«-Modus einschalten\n" -#: option.c:289 +#: option.c:305 #, c-format msgid " -V, --version display version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: option.c:290 +#: option.c:306 #, c-format msgid " --clone clone instead of copying files to new cluster\n" msgstr " --clone Dateien in den neuen Cluster klonen statt kopieren\n" -#: option.c:291 +#: option.c:307 #, c-format msgid " --copy copy files to new cluster (default)\n" msgstr " --copy Dateien in den neuen Cluster kopieren (Voreinstellung)\n" -#: option.c:292 +#: option.c:308 +#, c-format +msgid " --copy-file-range copy files to new cluster with copy_file_range\n" +msgstr " --copy-file-range Dateien mit copy_file_range in den neuen Cluster kopieren\n" + +#: option.c:309 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr "" +" --sync-method=METHODE Methode zum Synchronisieren von Dateien auf\n" +" Festplatte setzen\n" + +#: option.c:310 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: option.c:293 +#: option.c:311 #, c-format msgid "" "\n" @@ -1229,7 +1500,7 @@ msgstr "" " den Postmaster für den alten Cluster anhalten\n" " den Postmaster für den neuen Cluster anhalten\n" -#: option.c:298 +#: option.c:316 #, c-format msgid "" "\n" @@ -1246,7 +1517,7 @@ msgstr "" " das »bin«-Verzeichnis der alten Version (-b BINVERZ)\n" " das »bin«-Verzeichnis der neuen Version (-B BINVERZ)\n" -#: option.c:304 +#: option.c:322 #, c-format msgid "" "\n" @@ -1259,7 +1530,7 @@ msgstr "" " pg_upgrade -d alterCluster/data -D neuerCluster/data -b alterCluster/bin -B neuerCluster/bin\n" "oder\n" -#: option.c:309 +#: option.c:327 #, c-format msgid "" " $ export PGDATAOLD=oldCluster/data\n" @@ -1274,7 +1545,7 @@ msgstr "" " $ export PGBINNEW=neuerCluster/bin\n" " $ pg_upgrade\n" -#: option.c:315 +#: option.c:333 #, c-format msgid "" " C:\\> set PGDATAOLD=oldCluster/data\n" @@ -1289,7 +1560,7 @@ msgstr "" " C:\\> set PGBINNEW=neuerCluster/bin\n" " C:\\> pg_upgrade\n" -#: option.c:321 +#: option.c:339 #, c-format msgid "" "\n" @@ -1298,12 +1569,12 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: option.c:322 +#: option.c:340 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: option.c:362 +#: option.c:380 #, c-format msgid "" "You must identify the directory where the %s.\n" @@ -1312,45 +1583,50 @@ msgstr "" "Sie müssen das Verzeichnis angeben, wo %s.\n" "Bitte verwenden Sie die Kommandzeilenoption %s oder die Umgebungsvariable %s." -#: option.c:415 +#: option.c:433 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "Suche das tatsächliche Datenverzeichnis des alten Clusters" -#: option.c:417 +#: option.c:435 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "Suche das tatsächliche Datenverzeichnis des neuen Clusters" -#: option.c:430 option.c:435 +#: option.c:448 +#, c-format +msgid "could not get data directory using %s: %m" +msgstr "konnte Datenverzeichnis mit %s nicht ermitteln: %m" + +#: option.c:452 #, c-format msgid "could not get data directory using %s: %s" msgstr "konnte Datenverzeichnis mit %s nicht ermitteln: %s" -#: option.c:484 +#: option.c:500 #, c-format -msgid "could not read line %d from file \"%s\": %s" -msgstr "konnte Zeile %d aus Datei »%s« nicht lesen: %s" +msgid "could not read line %d from file \"%s\": %m" +msgstr "konnte Zeile %d aus Datei »%s« nicht lesen: %m" -#: option.c:501 +#: option.c:517 #, c-format msgid "user-supplied old port number %hu corrected to %hu" msgstr "vom Benutzer angegebene Portnummer %hu wurde auf %hu korrigiert" #: parallel.c:127 parallel.c:235 #, c-format -msgid "could not create worker process: %s" -msgstr "konnte Arbeitsprozess nicht erzeugen: %s" +msgid "could not create worker process: %m" +msgstr "konnte Arbeitsprozess nicht erzeugen: %m" #: parallel.c:143 parallel.c:253 #, c-format -msgid "could not create worker thread: %s" -msgstr "konnte Arbeits-Thread nicht erzeugen: %s" +msgid "could not create worker thread: %m" +msgstr "konnte Arbeits-Thread nicht erzeugen: %m" #: parallel.c:294 #, c-format -msgid "%s() failed: %s" -msgstr "%s() fehlgeschlagen: %s" +msgid "%s() failed: %m" +msgstr "%s() fehlgeschlagen: %m" #: parallel.c:298 #, c-format @@ -1359,15 +1635,15 @@ msgstr "Kindprozess wurde abnormal beendet: Status %d" #: parallel.c:313 #, c-format -msgid "child worker exited abnormally: %s" -msgstr "Kindprozess wurde abnormal beendet: %s" +msgid "child worker exited abnormally: %m" +msgstr "Kindprozess wurde abnormal beendet: %m" -#: pg_upgrade.c:107 +#: pg_upgrade.c:115 #, c-format -msgid "could not read permissions of directory \"%s\": %s" -msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %s" +msgid "could not read permissions of directory \"%s\": %m" +msgstr "konnte Zugriffsrechte von Verzeichnis »%s« nicht lesen: %m" -#: pg_upgrade.c:139 +#: pg_upgrade.c:147 #, c-format msgid "" "\n" @@ -1378,17 +1654,17 @@ msgstr "" "Führe Upgrade durch\n" "-------------------" -#: pg_upgrade.c:184 +#: pg_upgrade.c:192 #, c-format msgid "Setting next OID for new cluster" msgstr "Setze nächste OID im neuen Cluster" -#: pg_upgrade.c:193 +#: pg_upgrade.c:216 #, c-format msgid "Sync data directory to disk" msgstr "Synchronisiere Datenverzeichnis auf Festplatte" -#: pg_upgrade.c:205 +#: pg_upgrade.c:230 #, c-format msgid "" "\n" @@ -1399,23 +1675,23 @@ msgstr "" "Upgrade abgeschlossen\n" "---------------------" -#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265 -#: pg_upgrade.c:283 pg_upgrade.c:294 +#: pg_upgrade.c:263 pg_upgrade.c:276 pg_upgrade.c:283 pg_upgrade.c:290 +#: pg_upgrade.c:308 pg_upgrade.c:319 #, c-format msgid "directory path for new cluster is too long" msgstr "Verzeichnispfad für neuen Cluster ist zu lang" -#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278 +#: pg_upgrade.c:297 pg_upgrade.c:299 pg_upgrade.c:301 pg_upgrade.c:303 #, c-format msgid "could not create directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht erzeugen: %m" -#: pg_upgrade.c:327 +#: pg_upgrade.c:352 #, c-format msgid "%s: could not find own program executable" msgstr "%s: konnte eigene Programmdatei nicht finden" -#: pg_upgrade.c:353 +#: pg_upgrade.c:378 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" @@ -1424,7 +1700,7 @@ msgstr "" "Es läuft scheinbar ein Postmaster für den alten Cluster.\n" "Bitte beenden Sie diesen Postmaster und versuchen Sie es erneut." -#: pg_upgrade.c:366 +#: pg_upgrade.c:391 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" @@ -1433,81 +1709,86 @@ msgstr "" "Es läuft scheinbar ein Postmaster für den neuen Cluster.\n" "Bitte beenden Sie diesen Postmaster und versuchen Sie es erneut." -#: pg_upgrade.c:388 +#: pg_upgrade.c:413 #, c-format msgid "Setting locale and encoding for new cluster" msgstr "Setze Locale und Kodierung für neuen Cluster" -#: pg_upgrade.c:450 +#: pg_upgrade.c:489 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Analysiere alle Zeilen im neuen Cluster" -#: pg_upgrade.c:463 +#: pg_upgrade.c:502 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Friere alle Zeilen im neuen Cluster ein" -#: pg_upgrade.c:483 +#: pg_upgrade.c:522 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Stelle globale Objekte im neuen Cluster wieder her" -#: pg_upgrade.c:499 +#: pg_upgrade.c:538 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "Stelle Datenbankschemas im neuen Cluster wieder her" -#: pg_upgrade.c:605 +#: pg_upgrade.c:662 #, c-format msgid "Deleting files from new %s" msgstr "Lösche Dateien aus neuem %s" -#: pg_upgrade.c:609 +#: pg_upgrade.c:666 #, c-format msgid "could not delete directory \"%s\"" msgstr "konnte Verzeichnis »%s« nicht löschen" -#: pg_upgrade.c:628 +#: pg_upgrade.c:685 #, c-format msgid "Copying old %s to new server" msgstr "Kopiere altes %s zum neuen Server" -#: pg_upgrade.c:654 +#: pg_upgrade.c:711 #, c-format msgid "Setting oldest XID for new cluster" msgstr "Setze älteste XID im neuen Cluster" -#: pg_upgrade.c:662 +#: pg_upgrade.c:719 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "Setze nächste Transaktions-ID und -epoche im neuen Cluster" -#: pg_upgrade.c:692 +#: pg_upgrade.c:749 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "Setze nächste Multixact-ID und nächstes Offset im neuen Cluster" -#: pg_upgrade.c:716 +#: pg_upgrade.c:773 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Setze älteste Multixact-ID im neuen Cluster" -#: pg_upgrade.c:736 +#: pg_upgrade.c:793 #, c-format msgid "Resetting WAL archives" msgstr "Setze WAL-Archive zurück" -#: pg_upgrade.c:779 +#: pg_upgrade.c:836 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Setze frozenxid und minmxid im neuen Cluster" -#: pg_upgrade.c:781 +#: pg_upgrade.c:838 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Setze minmxid im neuen Cluster" +#: pg_upgrade.c:929 +#, c-format +msgid "Restoring logical replication slots in the new cluster" +msgstr "Stelle logische Replikations-Slots im neuen Cluster wieder her" + #: relfilenumber.c:35 #, c-format msgid "Cloning user relation files" @@ -1520,35 +1801,45 @@ msgstr "Kopiere Benutzertabellendateien" #: relfilenumber.c:41 #, c-format +msgid "Copying user relation files with copy_file_range" +msgstr "Kopiere Benutzertabellendateien mit copy_file_range" + +#: relfilenumber.c:44 +#, c-format msgid "Linking user relation files" msgstr "Verknüpfe Benutzertabellendateien" -#: relfilenumber.c:115 +#: relfilenumber.c:118 #, c-format msgid "old database \"%s\" not found in the new cluster" msgstr "alte Datenbank »%s« nicht im neuen Cluster gefunden" -#: relfilenumber.c:218 +#: relfilenumber.c:221 #, c-format -msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "Fehler beim Prüfen auf Existenz der Datei für »%s.%s« (»%s« nach »%s«): %s" +msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "Fehler beim Prüfen auf Existenz der Datei für »%s.%s« (»%s« nach »%s«): %m" -#: relfilenumber.c:236 +#: relfilenumber.c:238 #, c-format msgid "rewriting \"%s\" to \"%s\"" msgstr "konvertiere »%s« nach »%s«" -#: relfilenumber.c:244 +#: relfilenumber.c:246 #, c-format msgid "cloning \"%s\" to \"%s\"" msgstr "klone »%s« nach »%s«" -#: relfilenumber.c:249 +#: relfilenumber.c:251 #, c-format msgid "copying \"%s\" to \"%s\"" msgstr "kopiere »%s« nach »%s«" -#: relfilenumber.c:254 +#: relfilenumber.c:256 +#, c-format +msgid "copying \"%s\" to \"%s\" with copy_file_range" +msgstr "kopiere »%s« nach »%s« mit copy_file_range" + +#: relfilenumber.c:261 #, c-format msgid "linking \"%s\" to \"%s\"" msgstr "verknüpfe »%s« nach »%s«" @@ -1584,7 +1875,7 @@ msgstr "konnte Versionsdatei »%s« nicht öffnen: %m" msgid "could not parse version file \"%s\"" msgstr "konnte Versionsdatei »%s« nicht interpretieren" -#: server.c:288 +#: server.c:310 #, c-format msgid "" "\n" @@ -1593,7 +1884,7 @@ msgstr "" "\n" "%s" -#: server.c:292 +#: server.c:314 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -1602,7 +1893,7 @@ msgstr "" "konnte nicht mit dem Postmaster für den alten Cluster verbinden, gestartet mit dem Befehl:\n" "%s" -#: server.c:296 +#: server.c:318 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -1611,22 +1902,22 @@ msgstr "" "konnte nicht mit dem Postmaster für den neuen Cluster verbinden, gestartet mit dem Befehl:\n" "%s" -#: server.c:310 +#: server.c:332 #, c-format msgid "pg_ctl failed to start the source server, or connection failed" msgstr "pg_ctl konnte den Quellserver nicht starten, oder Verbindung fehlgeschlagen" -#: server.c:312 +#: server.c:334 #, c-format msgid "pg_ctl failed to start the target server, or connection failed" msgstr "pg_ctl konnte den Zielserver nicht starten, oder Verbindung fehlgeschlagen" -#: server.c:357 +#: server.c:379 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" -#: server.c:370 +#: server.c:392 #, c-format msgid "libpq environment variable %s has a non-local server value: %s" msgstr "libpq-Umgebungsvariable %s hat einen nicht lokalen Serverwert: %s" @@ -1647,8 +1938,8 @@ msgstr "Tablespace-Verzeichnis »%s« existiert nicht" #: tablespace.c:87 #, c-format -msgid "could not stat tablespace directory \"%s\": %s" -msgstr "konnte »stat« für Tablespace-Verzeichnis »%s« nicht ausführen: %s" +msgid "could not stat tablespace directory \"%s\": %m" +msgstr "konnte »stat« für Tablespace-Verzeichnis »%s« nicht ausführen: %m" #: tablespace.c:92 #, c-format @@ -1670,63 +1961,17 @@ msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" msgid "ok" msgstr "ok" -#: version.c:184 -#, c-format -msgid "Checking for incompatible \"line\" data type" -msgstr "Prüfe auf inkompatiblen Datentyp »line«" - -#: version.c:193 -#, c-format -msgid "" -"Your installation contains the \"line\" data type in user tables.\n" -"This data type changed its internal and input/output format\n" -"between your old and new versions so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"Ihre Installation enthält den Datentyp »line« in Benutzertabellen. Das\n" -"interne Format und das Eingabe-/Ausgabeformat dieses Datentyps wurden\n" -"zwischen Ihrem alten und neuen Cluster geändert und daher kann dieser\n" -"Cluster gegenwärtig nicht aktualisiert werden. Sie können die\n" -"Problemspalten löschen und das Upgrade neu starten. Eine Liste der\n" -"Problemspalten ist in der Datei:\n" -" %s" - -#: version.c:224 -#, c-format -msgid "Checking for invalid \"unknown\" user columns" -msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »unknown«" - -#: version.c:233 -#, c-format -msgid "" -"Your installation contains the \"unknown\" data type in user tables.\n" -"This data type is no longer allowed in tables, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"Ihre Installation enthält den Datentyp »unknown« in\n" -"Benutzertabellen. Dieser Datentyp ist nicht mehr in Tabellen erlaubt\n" -"und daher kann dieser Cluster gegenwärtig nicht aktualisiert\n" -"werden. Sie können die Problemspalten löschen und das Upgrade neu\n" -"starten. Eine Liste der Problemspalten ist in der Datei:\n" -" %s" - -#: version.c:257 +#: version.c:44 #, c-format msgid "Checking for hash indexes" msgstr "Prüfe auf Hash-Indexe" -#: version.c:335 +#: version.c:121 #, c-format msgid "warning" msgstr "Warnung" -#: version.c:337 +#: version.c:123 #, c-format msgid "" "\n" @@ -1741,7 +1986,7 @@ msgstr "" "daher mit dem Befehl REINDEX reindiziert werden. Nach dem Upgrade\n" "werden Sie Anweisungen zum REINDEX erhalten." -#: version.c:343 +#: version.c:129 #, c-format msgid "" "\n" @@ -1761,39 +2006,17 @@ msgstr "" "ungültigen Indexe neu zu erzeugen. Bis dahin werden diese Indexe nicht\n" "verwendet werden." -#: version.c:369 -#, c-format -msgid "Checking for invalid \"sql_identifier\" user columns" -msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »sql_identifier«" - -#: version.c:379 -#, c-format -msgid "" -"Your installation contains the \"sql_identifier\" data type in user tables.\n" -"The on-disk format for this data type has changed, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"Ihre Installation enthält den Datentyp »sql_identifier« in\n" -"Benutzertabellen. Das Speicherformat dieses Datentyps wurde geändert\n" -"und daher kann dieser Cluster gegenwärtig nicht aktualisiert\n" -"werden. Sie können die Problemspalten löschen und das Upgrade neu\n" -"starten. Eine Liste der Problemspalten ist in der Datei:\n" -" %s" - -#: version.c:402 +#: version.c:153 #, c-format msgid "Checking for extension updates" msgstr "Prüfe auf Aktualisierungen von Erweiterungen" -#: version.c:450 +#: version.c:200 #, c-format msgid "notice" msgstr "Hinweis" -#: version.c:451 +#: version.c:201 #, c-format msgid "" "\n" diff --git a/src/bin/pg_upgrade/po/es.po b/src/bin/pg_upgrade/po/es.po index b5f6055b2a48f..ea5213cd854ea 100644 --- a/src/bin/pg_upgrade/po/es.po +++ b/src/bin/pg_upgrade/po/es.po @@ -1,18 +1,18 @@ # spanish message translation file for pg_upgrade # -# Copyright (c) 2017-2021, PostgreSQL Global Development Group +# Copyright (c) 2017-2024, PostgreSQL Global Development Group # # This file is distributed under the same license as the PostgreSQL package. -# Ãlvaro Herrera , 2017. +# Ãlvaro Herrera , 2017, 2024. # Carlos Chapi , 2021. # msgid "" msgstr "" -"Project-Id-Version: pg_upgrade (PostgreSQL) 16\n" +"Project-Id-Version: pg_upgrade (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:19+0000\n" -"PO-Revision-Date: 2023-05-22 12:06+0200\n" -"Last-Translator: Carlos Chapi \n" +"POT-Creation-Date: 2025-02-16 19:49+0000\n" +"PO-Revision-Date: 2024-11-16 09:10+0100\n" +"Last-Translator: Ãlvaro Herrera \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" "MIME-Version: 1.0\n" @@ -20,7 +20,243 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: BlackCAT 1.1\n" -#: check.c:69 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "memoria agotada\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "no se puede duplicar un puntero nulo (error interno)\n" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "no se pudo obtener el código de salida del subproceso: código de error %lu" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "no se pudo buscar el ID de usuario efectivo %ld: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "el usuario no existe" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "fallo en la búsqueda de nombre de usuario: código de error %lu" + +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "el argumento de la orden de shell contiene un salto de línea o retorno de carro: «%s»\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "el nombre de base de datos contiene un salto de línea o retorno de carro: «%s»\n" + +#: check.c:111 +msgid "Checking for system-defined composite types in user tables" +msgstr "Verificando tipos compuestos definidos por el sistema en tablas de usuario" + +#: check.c:118 +msgid "" +"Your installation contains system-defined composite types in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"Su instalación contiene tipos compuestos definidos por el sistema en\n" +"tablas de usuario. Los OIDs de estos tipos no son estables entre diferentes\n" +"versiones de PostgreSQL, por lo que este clúster no puede ser actualizado.\n" +"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n" + +#: check.c:132 +msgid "Checking for incompatible \"line\" data type" +msgstr "Verificando datos de usuario de tipo «line» incompatible" + +#: check.c:137 +msgid "" +"Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"Su instalación contiene el tipo de dato «line» en tablas de usuario. Este\n" +"tipo de dato cambió su formato interno y de entrada/salida entre las\n" +"versiones de sus clústers antiguo y nuevo, por lo que este clúster no puede\n" +"actualmente ser actualizado. Puede eliminar las columnas problemáticas y\n" +"reiniciar la actualización.\n" + +#: check.c:154 +msgid "Checking for reg* data types in user tables" +msgstr "Verificando tipos de datos reg* en datos de usuario" + +#: check.c:181 +msgid "" +"Your installation contains one of the reg* data types in user tables.\n" +"These data types reference system OIDs that are not preserved by\n" +"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"Su instalación contiene uno de los tipos reg* en tablas de usuario. Estos tipos\n" +"de dato hacen referencia a OIDs de sistema que no son preservados por pg_upgrade,\n" +"por lo que este clúster no puede ser actualizado.\n" +"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n" + +#: check.c:193 +msgid "Checking for incompatible \"aclitem\" data type" +msgstr "Verificando datos de usuario de tipo «aclitem» incompatible" + +#: check.c:198 +msgid "" +"Your installation contains the \"aclitem\" data type in user tables.\n" +"The internal format of \"aclitem\" changed in PostgreSQL version 16\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"Su instalación contiene el tipo «aclitem» en tablas de usuario.\n" +"El formato interno de «aclitem» cambió en PostgreSQL versión 16,\n" +"por lo que este clúster no puede ser actualizado.\n" +"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n" + +#: check.c:217 +msgid "Checking for invalid \"unknown\" user columns" +msgstr "Verificando columnas de usuario del tipo no válido «unknown»" + +#: check.c:222 +msgid "" +"Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this cluster\n" +"cannot currently be upgraded. You can drop the problem columns\n" +"and restart the upgrade.\n" +msgstr "" +"Su instalación contiene el tipo «unknown» en tablas de usuario.\n" +"Este tipo ya no es permitido en tablas,\n" +"por lo que este clúster no puede ser actualizado. Puede\n" +"eliminar las columnas problemáticas y reiniciar la actualización.\n" + +#: check.c:239 +msgid "Checking for invalid \"sql_identifier\" user columns" +msgstr "Verificando columnas de usuario del tipo «sql_identifier»" + +#: check.c:244 +msgid "" +"Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can drop the problem\n" +"columns and restart the upgrade.\n" +msgstr "" +"Su instalación contiene el tipo de dato «sql_identifier» en tablas de usuario.\n" +"El formato en disco para este tipo de dato ha cambiado, por lo que\n" +"este clúster no puede ser actualizado.\n" +"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n" + +#: check.c:255 +msgid "Checking for incompatible \"jsonb\" data type in user tables" +msgstr "Verificando datos de usuario de tipo «jsonb» incompatible" + +#: check.c:260 +msgid "" +"Your installation contains the \"jsonb\" data type in user tables.\n" +"The internal format of \"jsonb\" changed during 9.4 beta so this\n" +"cluster cannot currently be upgraded. You can drop the problem \n" +"columns and restart the upgrade.\n" +msgstr "" +"Su instalación contiene el tipo «jsonb» en tablas de usuario.\n" +"El formato interno de «jsonb» cambió durante 9.4 beta,\n" +"por lo que este clúster no puede ser actualizado.\n" +"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n" + +#: check.c:272 +msgid "Checking for removed \"abstime\" data type in user tables" +msgstr "Verificando tipo de datos «abstime» eliminado en tablas de usuario" + +#: check.c:277 +msgid "" +"Your installation contains the \"abstime\" data type in user tables.\n" +"The \"abstime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Su instalación contiene el tipo «abstime» en tablas de usuario.\n" +"El tipo «abstime» fue eliminado en la versión 12 de PostgreSQL,\n" +"por lo que este clúster no puede ser actualizado.\n" +"Puede eliminar las columnas problemáticas, o cambiarlas a otro\n" +"tipo de dato, y reiniciar la actualización.\n" + +#: check.c:285 +msgid "Checking for removed \"reltime\" data type in user tables" +msgstr "Verificando tipo de datos «reltime» eliminado en tablas de usuario" + +#: check.c:290 +msgid "" +"Your installation contains the \"reltime\" data type in user tables.\n" +"The \"reltime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Su instalación contiene el tipo «reltime» en tablas de usuario.\n" +"El tipo «reltime» fue eliminado en la versión 12 de PostgreSQL,\n" +"por lo que este clúster no puede ser actualizado.\n" +"Puede eliminar las columnas problemáticas, o cambiarlas a otro\n" +"tipo de dato, y reiniciar la actualización.\n" + +#: check.c:298 +msgid "Checking for removed \"tinterval\" data type in user tables" +msgstr "Verificando tipo de datos «tinterval» eliminado en tablas de usuario" + +#: check.c:303 +msgid "" +"Your installation contains the \"tinterval\" data type in user tables.\n" +"The \"tinterval\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Su instalación contiene el tipo «tinterval» en tablas de usuario.\n" +"El tipo «tinterval» fue eliminado en la versión 12 de PostgreSQL,\n" +"por lo que este clúster no puede ser actualizado.\n" +"Puede eliminar las columnas problemáticas, o cambiarlas a otro\n" +"tipo de dato, y reiniciar la actualización.\n" + +#: check.c:345 +#, c-format +msgid "Checking data type usage" +msgstr "Verificando el uso de tipos de datos" + +#: check.c:480 +#, c-format +msgid "failed check: %s" +msgstr "falló la comprobación: %s" + +#: check.c:483 +msgid "A list of the problem columns is in the file:" +msgstr "Una lista de las columnas problemáticas está en el archivo:" + +#: check.c:495 check.c:963 check.c:1136 check.c:1251 check.c:1345 check.c:1473 +#: check.c:1549 check.c:1613 check.c:1686 check.c:1865 check.c:1884 +#: check.c:1953 check.c:2005 file.c:378 file.c:415 function.c:189 option.c:493 +#: version.c:79 version.c:177 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "no se pudo abrir el archivo «%s»: %m" + +# FIXME this should probably use plural msgfmt +#: check.c:522 +#, c-format +msgid "Data type checks failed: %s" +msgstr "Verificaciones de tipos de datos fallidas: %s" + +#: check.c:563 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -29,7 +265,7 @@ msgstr "" "Verificando Consistencia en Vivo en el Servidor Antiguo\n" "-------------------------------------------------------" -#: check.c:75 +#: check.c:569 #, c-format msgid "" "Performing Consistency Checks\n" @@ -38,7 +274,7 @@ msgstr "" "Verificando Consistencia\n" "------------------------" -#: check.c:221 +#: check.c:718 #, c-format msgid "" "\n" @@ -47,7 +283,7 @@ msgstr "" "\n" "*Los clústers son compatibles*" -#: check.c:229 +#: check.c:726 #, c-format msgid "" "\n" @@ -58,7 +294,7 @@ msgstr "" "Si pg_upgrade falla a partir de este punto, deberá re-ejecutar initdb\n" "en el clúster nuevo antes de continuar." -#: check.c:270 +#: check.c:767 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -69,7 +305,7 @@ msgstr "" "Una vez que inicie el servidor nuevo, considere ejecutar:\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:276 +#: check.c:773 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -78,7 +314,7 @@ msgstr "" "Ejecutando este script se borrarán los archivos de datos del servidor antiguo:\n" " %s" -#: check.c:281 +#: check.c:778 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -91,57 +327,57 @@ msgstr "" "o el directorio de datos del servidor nuevo. El contenido del servidor\n" "antiguo debe ser borrado manualmente." -#: check.c:293 +#: check.c:790 #, c-format msgid "Checking cluster versions" msgstr "Verificando las versiones de los clústers" -#: check.c:305 +#: check.c:802 #, c-format msgid "This utility can only upgrade from PostgreSQL version %s and later." msgstr "Este programa sólo puede actualizar desde PostgreSQL versión %s y posterior." -#: check.c:310 +#: check.c:807 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s." msgstr "Este programa sólo puede actualizar a PostgreSQL versión %s." -#: check.c:319 +#: check.c:816 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions." msgstr "Este programa no puede usarse para volver a versiones anteriores de PostgreSQL." -#: check.c:324 +#: check.c:821 #, c-format msgid "Old cluster data and binary directories are from different major versions." msgstr "El directorio de datos antiguo y el directorio de binarios antiguo son de versiones diferentes." -#: check.c:327 +#: check.c:824 #, c-format msgid "New cluster data and binary directories are from different major versions." msgstr "El directorio de datos nuevo y el directorio de binarios nuevo son de versiones diferentes." -#: check.c:342 +#: check.c:839 #, c-format msgid "When checking a live server, the old and new port numbers must be different." msgstr "Al verificar servidores en caliente, los números de port antiguo y nuevo deben ser diferentes." -#: check.c:362 +#: check.c:859 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" msgstr "La base de datos «%s» del clúster nuevo no está vacía: se encontró la relación «%s.%s»" -#: check.c:385 +#: check.c:882 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Verificando los directorios de tablespaces para el nuevo clúster" -#: check.c:396 +#: check.c:893 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "directorio de tablespace para el nuevo clúster ya existe: «%s»" -#: check.c:429 +#: check.c:926 #, c-format msgid "" "\n" @@ -151,7 +387,7 @@ msgstr "" "ADVERTENCIA: el directorio de datos nuevo no debería estar dentro del directorio antiguo,\n" "esto es, %s" -#: check.c:453 +#: check.c:950 #, c-format msgid "" "\n" @@ -160,61 +396,53 @@ msgstr "" "\n" "ADVERTENCIA: las ubicaciones de tablespaces definidos por el usuario no deberían estar dentro del directorio de datos, esto es, %s" -#: check.c:463 +#: check.c:960 #, c-format msgid "Creating script to delete old cluster" msgstr "Creando un script para borrar el clúster antiguo" -#: check.c:466 check.c:639 check.c:755 check.c:850 check.c:979 check.c:1056 -#: check.c:1299 check.c:1373 file.c:339 function.c:163 option.c:476 -#: version.c:116 version.c:292 version.c:426 +#: check.c:1014 #, c-format -msgid "could not open file \"%s\": %s" -msgstr "no se pudo abrir el archivo «%s»: %s" +msgid "could not add execute permission to file \"%s\": %m" +msgstr "no se pudo agregar permisos de ejecución al archivo «%s»: %m" -#: check.c:517 -#, c-format -msgid "could not add execute permission to file \"%s\": %s" -msgstr "no se pudo agregar permisos de ejecución al archivo «%s»: %s" - -#: check.c:537 +#: check.c:1034 #, c-format msgid "Checking database user is the install user" msgstr "Verificando que el usuario de base de datos es el usuario de instalación" -#: check.c:553 +#: check.c:1050 #, c-format msgid "database user \"%s\" is not the install user" msgstr "el usuario de base de datos «%s» no es el usuario de instalación" -#: check.c:564 +#: check.c:1061 #, c-format msgid "could not determine the number of users" msgstr "no se pudo determinar el número de usuarios" -#: check.c:572 +#: check.c:1069 #, c-format msgid "Only the install user can be defined in the new cluster." msgstr "Sólo el usuario de instalación puede estar definido en el nuevo clúster." -#: check.c:601 +#: check.c:1098 #, c-format msgid "Checking database connection settings" msgstr "Verificando los parámetros de conexión de bases de datos" -#: check.c:627 +#: check.c:1124 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false" msgstr "template0 no debe permitir conexiones, es decir su pg_database.datallowconn debe ser «false»" -#: check.c:654 check.c:775 check.c:873 check.c:999 check.c:1076 check.c:1135 -#: check.c:1196 check.c:1224 check.c:1254 check.c:1313 check.c:1394 -#: function.c:185 version.c:192 version.c:232 version.c:378 +#: check.c:1150 check.c:1270 check.c:1367 check.c:1492 check.c:1568 +#: check.c:1626 check.c:1706 check.c:1897 check.c:2022 function.c:210 #, c-format msgid "fatal" msgstr "fatal" -#: check.c:655 +#: check.c:1151 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -233,27 +461,27 @@ msgstr "" "conexión. Un listado de las bases de datos con el problema se encuentra en:\n" " %s" -#: check.c:680 +#: check.c:1176 #, c-format msgid "Checking for prepared transactions" msgstr "Verificando transacciones preparadas" -#: check.c:689 +#: check.c:1185 #, c-format msgid "The source cluster contains prepared transactions" msgstr "El clúster de origen contiene transacciones preparadas" -#: check.c:691 +#: check.c:1187 #, c-format msgid "The target cluster contains prepared transactions" msgstr "El clúster de destino contiene transacciones preparadas" -#: check.c:716 +#: check.c:1212 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Verificando contrib/isn con discordancia en mecanismo de paso de bigint" -#: check.c:776 +#: check.c:1271 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -272,12 +500,12 @@ msgstr "" "Un listado de funciones problemáticas está en el archivo:\n" " %s" -#: check.c:798 +#: check.c:1293 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Verificando operadores postfix definidos por el usuario" -#: check.c:874 +#: check.c:1368 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -292,12 +520,12 @@ msgstr "" "Una lista de operadores postfix definidos por el usuario aparece en el archivo:\n" " %s" -#: check.c:898 +#: check.c:1392 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "Verificando funciones polimórficas incompatibles" -#: check.c:1000 +#: check.c:1493 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -316,12 +544,12 @@ msgstr "" "«anycompatible». Una lista de los objetos problemáticos está en el archivo:\n" " %s" -#: check.c:1024 +#: check.c:1517 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Verificando tablas WITH OIDS" -#: check.c:1077 +#: check.c:1569 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -336,149 +564,132 @@ msgstr "" "Una lista de tablas con este problema aparece en el archivo:\n" " %s" -#: check.c:1105 +#: check.c:1596 #, c-format -msgid "Checking for system-defined composite types in user tables" -msgstr "Verificando tipos compuestos definidos por el sistema en tablas de usuario" +msgid "Checking for roles starting with \"pg_\"" +msgstr "Verificando roles que empiecen con «pg_»" -#: check.c:1136 +#: check.c:1627 #, c-format msgid "" -"Your installation contains system-defined composite type(s) in user tables.\n" -"These type OIDs are not stable across PostgreSQL versions,\n" -"so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" +"Your installation contains roles starting with \"pg_\".\n" +"\"pg_\" is a reserved prefix for system roles. The cluster\n" +"cannot be upgraded until these roles are renamed.\n" +"A list of roles starting with \"pg_\" is in the file:\n" " %s" msgstr "" -"Su instalación contiene uno o varios tipos compuestos definidos por el sistema en\n" -"tablas de usuario. Los OIDs de estos tipos no son estables entre diferentes\n" -"versiones de PostgreSQL, por lo que este clúster no puede ser actualizado.\n" -"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n" -"Un listado de las columnas problemáticas está en el archivo:\n" +"Su instalación contiene nombres de rol que comienzan con «pg_».\n" +"«pg_» es un prefijo reservado para roles de sistema. El clúster\n" +"no puede ser actualizado hasta que esos roles hayan sido renombrados.\n" +"Un listado de los roles que empiezan con «pg_» está en el archivo:\n" " %s" -#: check.c:1164 +#: check.c:1647 #, c-format -msgid "Checking for reg* data types in user tables" -msgstr "Verificando tipos de datos reg* en datos de usuario" +msgid "Checking for user-defined encoding conversions" +msgstr "Verificando conversiones de codificación definidas por el usuario" -#: check.c:1197 +#: check.c:1707 #, c-format msgid "" -"Your installation contains one of the reg* data types in user tables.\n" -"These data types reference system OIDs that are not preserved by\n" -"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" +"Your installation contains user-defined encoding conversions.\n" +"The conversion function parameters changed in PostgreSQL version 14\n" +"so this cluster cannot currently be upgraded. You can remove the\n" +"encoding conversions in the old cluster and restart the upgrade.\n" +"A list of user-defined encoding conversions is in the file:\n" " %s" msgstr "" -"Su instalación contiene uno de los tipos reg* en tablas de usuario. Estos tipos\n" -"de dato hacen referencia a OIDs de sistema que no son preservados por pg_upgrade,\n" -"por lo que este clúster no puede ser actualizado.\n" -"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n" -"Un listado de las columnas problemáticas está en el archivo:\n" +"Su instalación contiene conversiones de codificación definidas por el usuario.\n" +"Los parámetros de la función de conversión cambiaron en PostgreSQL 14\n" +"por lo que este clúster no puede ser actualizado. Puede eliminar\n" +"las conversiones de codificación en el clúster antiguo y reiniciar la actualización.\n" +"Un listado de las conversiones de codificación definidas por el usuario está en el archivo:\n" " %s" -#: check.c:1218 +#: check.c:1746 #, c-format -#| msgid "Checking for incompatible aclitem data type in user tables" -msgid "Checking for incompatible \"aclitem\" data type in user tables" -msgstr "Verificando datos de usuario de tipo «aclitem» incompatible" +msgid "Checking for new cluster logical replication slots" +msgstr "Verificando slots de replicación lógica en el clúster nuevo" -#: check.c:1225 +#: check.c:1754 #, c-format -msgid "" -"Your installation contains the \"aclitem\" data type in user tables.\n" -"The internal format of \"aclitem\" changed in PostgreSQL version 16\n" -"so this cluster cannot currently be upgraded. You can drop the\n" -"problem columns and restart the upgrade. A list of the problem\n" -"columns is in the file:\n" -" %s" -msgstr "" -"Su instalación contiene el tipo «jsonb» en tablas de usuario.\n" -"El formato interno de «jsonb» cambió durante 9.4 beta,\n" -"por lo que este clúster no puede ser actualizado.\n" -"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n" -"Un listado de las columnas problemáticas está en el archivo:\n" -" %s" +msgid "could not count the number of logical replication slots" +msgstr "no se pudo contar el número de slots de replicación lógica" -#: check.c:1246 +#: check.c:1759 #, c-format -msgid "Checking for incompatible \"jsonb\" data type" -msgstr "Verificando datos de usuario en tipo «jsonb» incompatible" +msgid "expected 0 logical replication slots but found %d" +msgstr "se esperaban 0 slots de replicación lógica pero se encontraron %d" -#: check.c:1255 +#: check.c:1769 check.c:1820 #, c-format -msgid "" -"Your installation contains the \"jsonb\" data type in user tables.\n" -"The internal format of \"jsonb\" changed during 9.4 beta so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"Su instalación contiene el tipo «jsonb» en tablas de usuario.\n" -"El formato interno de «jsonb» cambió durante 9.4 beta,\n" -"por lo que este clúster no puede ser actualizado.\n" -"Puede eliminar las columnas problemáticas y reiniciar la actualización.\n" -"Un listado de las columnas problemáticas está en el archivo:\n" -" %s" +msgid "could not determine parameter settings on new cluster" +msgstr "no se pudo determinar el valor de los parámetros en el clúster nuevo" -#: check.c:1282 +#: check.c:1774 #, c-format -msgid "Checking for roles starting with \"pg_\"" -msgstr "Verificando roles que empiecen con «pg_»" +msgid "\"wal_level\" must be \"logical\" but is set to \"%s\"" +msgstr "«wal_level» debe ser «logical», pero está definido a «%s»" + +#: check.c:1780 +#, c-format +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of logical replication slots (%d) on the old cluster" +msgstr "«max_replicacion_slots» (%d) debe ser mayor o igual al número de slots de replicación lógica en el cluster antiguo (%d)" + +#: check.c:1812 +#, c-format +msgid "Checking for new cluster configuration for subscriptions" +msgstr "Verificando configuraciones del clúster nuevo para suscripciones" -#: check.c:1314 +#: check.c:1824 +#, c-format +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of subscriptions (%d) on the old cluster" +msgstr "«max_replication_slots» (%d) debe ser mayor o igual al número de suscripciones en el clúster antiguo (%d)" + +#: check.c:1846 +#, c-format +msgid "Checking for valid logical replication slots" +msgstr "Verificando los slots de replicación lógica válidos" + +#: check.c:1898 #, c-format -#| msgid "" -#| "Your installation contains roles starting with \"pg_\".\n" -#| "\"pg_\" is a reserved prefix for system roles, the cluster\n" -#| "cannot be upgraded until these roles are renamed.\n" -#| "A list of roles starting with \"pg_\" is in the file:\n" -#| " %s" msgid "" -"Your installation contains roles starting with \"pg_\".\n" -"\"pg_\" is a reserved prefix for system roles. The cluster\n" -"cannot be upgraded until these roles are renamed.\n" -"A list of roles starting with \"pg_\" is in the file:\n" +"Your installation contains logical replication slots that cannot be upgraded.\n" +"You can remove invalid slots and/or consume the pending WAL for other slots,\n" +"and then restart the upgrade.\n" +"A list of the problematic slots is in the file:\n" " %s" msgstr "" -"Su instalación contiene nombres de rol que comienzan con «pg_».\n" -"«pg_» es un prefijo reservado para roles de sistema. El clúster\n" -"no puede ser actualizado hasta que esos roles hayan sido renombrados.\n" -"Un listado de los roles que empiezan con «pg_» está en el archivo:\n" +"Su instalación contiene slots de replicación lógica que no pueden ser actualizados.\n" +"Puede eliminar slots inválidos y/o consumir el WAL pendiente en los otros slots,\n" +"y reiniciar la actualización.\n" +"Un listado de los slots problemáticos está en el archivo:\n" " %s" -#: check.c:1334 +#: check.c:1922 #, c-format -msgid "Checking for user-defined encoding conversions" -msgstr "Verificando conversiones de codificación definidas por el usuario" +msgid "Checking for subscription state" +msgstr "Verificando el estado de suscripción" -#: check.c:1395 +#: check.c:2023 #, c-format msgid "" -"Your installation contains user-defined encoding conversions.\n" -"The conversion function parameters changed in PostgreSQL version 14\n" -"so this cluster cannot currently be upgraded. You can remove the\n" -"encoding conversions in the old cluster and restart the upgrade.\n" -"A list of user-defined encoding conversions is in the file:\n" +"Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n" +"You can allow the initial sync to finish for all relations and then restart the upgrade.\n" +"A list of the problematic subscriptions is in the file:\n" " %s" msgstr "" -"Su instalación contiene conversiones de codificación definidas por el usuario.\n" -"Los parámetros de la función de conversión cambiaron en PostgreSQL 14\n" -"por lo que este clúster no puede ser actualizado. Puede eliminar\n" -"las conversiones de codificación en el clúster antiguo y reiniciar la actualización.\n" -"Un listado de las conversiones de codificación definidas por el usuario está en el archivo:\n" +"Su instalación contiene suscripciones sin origen o que tiene relaciones que no están en estado i (inicializar) o r (listo).\n" +"Puede permitir que la sincronización inicial termine para todas las relaciones y luego reiniciar la actualización.\n" +"Una lista de las suscripciones problemáticas está en el archivo:\n" " %s" -#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508 +#: controldata.c:129 controldata.c:199 #, c-format -msgid "could not get control data using %s: %s" -msgstr "no se pudo obtener datos de control usando %s: %s" +msgid "could not get control data using %s: %m" +msgstr "no se pudo obtener datos de control usando %s: %m" -#: controldata.c:140 +#: controldata.c:139 #, c-format msgid "%d: database cluster state problem" msgstr "%d: problema de estado del clúster" @@ -495,13 +706,18 @@ msgstr "El clúster de destino fue apagado mientras estaba en modo de recuperaci #: controldata.c:165 #, c-format -msgid "The source cluster was not shut down cleanly." -msgstr "El clúster de origen no fue apagado limpiamente." +msgid "The source cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "El clúster de origen no fue apagado limpiamente, el estado fue reportado como: «%s»" #: controldata.c:167 #, c-format -msgid "The target cluster was not shut down cleanly." -msgstr "El clúster de destino no fue apagado limpiamente." +msgid "The target cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "El clúster de destino no fue apagado limpiamente, el estado fue reportado como: «%s»" + +#: controldata.c:175 controldata.c:507 +#, c-format +msgid "could not get control data using %s: %s" +msgstr "no se pudo obtener datos de control usando %s: %s" #: controldata.c:181 #, c-format @@ -513,139 +729,139 @@ msgstr "Al clúster de origen le falta información de estado:" msgid "The target cluster lacks cluster state information:" msgstr "Al cluster de destino le falta información de estado:" -#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554 -#: relfilenumber.c:231 server.c:34 util.c:337 +#: controldata.c:213 dump.c:50 exec.c:118 pg_upgrade.c:556 pg_upgrade.c:596 +#: pg_upgrade.c:945 relfilenumber.c:233 server.c:34 util.c:337 #, c-format msgid "%s" msgstr "%s" -#: controldata.c:221 +#: controldata.c:220 #, c-format msgid "%d: pg_resetwal problem" msgstr "%d: problema en pg_resetwal" -#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263 -#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315 -#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359 -#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388 -#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432 -#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476 -#: controldata.c:487 controldata.c:498 +#: controldata.c:230 controldata.c:240 controldata.c:251 controldata.c:262 +#: controldata.c:273 controldata.c:292 controldata.c:303 controldata.c:314 +#: controldata.c:325 controldata.c:336 controldata.c:347 controldata.c:358 +#: controldata.c:361 controldata.c:365 controldata.c:375 controldata.c:387 +#: controldata.c:398 controldata.c:409 controldata.c:420 controldata.c:431 +#: controldata.c:442 controldata.c:453 controldata.c:464 controldata.c:475 +#: controldata.c:486 controldata.c:497 #, c-format msgid "%d: controldata retrieval problem" msgstr "%d: problema de extracción de controldata" -#: controldata.c:579 +#: controldata.c:578 #, c-format msgid "The source cluster lacks some required control information:" msgstr "Al clúster de origen le falta información de control requerida:" -#: controldata.c:582 +#: controldata.c:581 #, c-format msgid "The target cluster lacks some required control information:" msgstr "Al clúster de destino le falta información de control requerida:" -#: controldata.c:585 +#: controldata.c:584 #, c-format msgid " checkpoint next XID" msgstr " siguiente XID del último checkpoint" -#: controldata.c:588 +#: controldata.c:587 #, c-format msgid " latest checkpoint next OID" msgstr " siguiente OID del último checkpoint" -#: controldata.c:591 +#: controldata.c:590 #, c-format msgid " latest checkpoint next MultiXactId" msgstr " siguiente MultiXactId del último checkpoint" -#: controldata.c:595 +#: controldata.c:594 #, c-format msgid " latest checkpoint oldest MultiXactId" msgstr " MultiXactId más antiguo del último checkpoint" -#: controldata.c:598 +#: controldata.c:597 #, c-format msgid " latest checkpoint oldestXID" msgstr " XID más antiguo del último checkpoint" -#: controldata.c:601 +#: controldata.c:600 #, c-format msgid " latest checkpoint next MultiXactOffset" msgstr " siguiente MultiXactOffset del siguiente checkpoint" -#: controldata.c:604 +#: controldata.c:603 #, c-format msgid " first WAL segment after reset" msgstr " primer segmento de WAL después del reinicio" -#: controldata.c:607 +#: controldata.c:606 #, c-format msgid " float8 argument passing method" msgstr " método de paso de argumentos float8" -#: controldata.c:610 +#: controldata.c:609 #, c-format msgid " maximum alignment" msgstr " alineamiento máximo" -#: controldata.c:613 +#: controldata.c:612 #, c-format msgid " block size" msgstr " tamaño de bloques" -#: controldata.c:616 +#: controldata.c:615 #, c-format msgid " large relation segment size" msgstr " tamaño de segmento de relación grande" -#: controldata.c:619 +#: controldata.c:618 #, c-format msgid " WAL block size" msgstr " tamaño de bloque de WAL" -#: controldata.c:622 +#: controldata.c:621 #, c-format msgid " WAL segment size" msgstr " tamaño de segmento de WAL" -#: controldata.c:625 +#: controldata.c:624 #, c-format msgid " maximum identifier length" msgstr " máximo largo de identificadores" -#: controldata.c:628 +#: controldata.c:627 #, c-format msgid " maximum number of indexed columns" msgstr " máximo número de columnas indexadas" -#: controldata.c:631 +#: controldata.c:630 #, c-format msgid " maximum TOAST chunk size" msgstr " tamaño máximo de trozos TOAST" -#: controldata.c:635 +#: controldata.c:634 #, c-format msgid " large-object chunk size" msgstr " tamaño de trozos de objetos grandes" -#: controldata.c:638 +#: controldata.c:637 #, c-format msgid " dates/times are integers?" msgstr " fechas/horas son enteros?" -#: controldata.c:642 +#: controldata.c:641 #, c-format msgid " data checksum version" msgstr " versión del checksum de datos" -#: controldata.c:644 +#: controldata.c:643 #, c-format msgid "Cannot continue without required control information, terminating" msgstr "No se puede continuar sin la información de control requerida. Terminando" -#: controldata.c:659 +#: controldata.c:658 #, c-format msgid "" "old and new pg_controldata alignments are invalid or do not match.\n" @@ -654,77 +870,77 @@ msgstr "" "Alineamientos de pg_controldata antiguo y nuevo no son válidos o no coinciden.\n" "Seguramente un clúster es 32-bit y el otro es 64-bit" -#: controldata.c:663 +#: controldata.c:662 #, c-format msgid "old and new pg_controldata block sizes are invalid or do not match" msgstr "Los tamaños de bloque antiguo y nuevo no son válidos o no coinciden" -#: controldata.c:666 +#: controldata.c:665 #, c-format msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match" msgstr "El tamaño máximo de segmento de relación antiguo y nuevo no son válidos o no coinciden" -#: controldata.c:669 +#: controldata.c:668 #, c-format msgid "old and new pg_controldata WAL block sizes are invalid or do not match" msgstr "El tamaño de bloques de WAL antiguo y nuevo no son válidos o no coinciden" -#: controldata.c:672 +#: controldata.c:671 #, c-format msgid "old and new pg_controldata WAL segment sizes are invalid or do not match" msgstr "El tamaño de segmentos de WAL antiguo y nuevo no son válidos o no coinciden" -#: controldata.c:675 +#: controldata.c:674 #, c-format msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match" msgstr "Los máximos largos de identificador antiguo y nuevo no son válidos o no coinciden" -#: controldata.c:678 +#: controldata.c:677 #, c-format msgid "old and new pg_controldata maximum indexed columns are invalid or do not match" msgstr "La cantidad máxima de columnas indexadas antigua y nueva no son válidos o no coinciden" -#: controldata.c:681 +#: controldata.c:680 #, c-format msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match" msgstr "Los máximos de trozos TOAST antiguo y nuevo no son válidos o no coinciden" -#: controldata.c:686 +#: controldata.c:685 #, c-format msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match" msgstr "Los tamaños de trozos de objetos grandes antiguo y nuevo no son válidos o no coinciden" -#: controldata.c:689 +#: controldata.c:688 #, c-format msgid "old and new pg_controldata date/time storage types do not match" msgstr "Los tipos de almacenamiento de fecha/hora antiguo y nuevo no coinciden" -#: controldata.c:702 +#: controldata.c:701 #, c-format msgid "old cluster does not use data checksums but the new one does" msgstr "El clúster antiguo no usa checksums de datos pero el nuevo sí" -#: controldata.c:705 +#: controldata.c:704 #, c-format msgid "old cluster uses data checksums but the new one does not" msgstr "El clúster antiguo usa checksums de datos pero el nuevo no" -#: controldata.c:707 +#: controldata.c:706 #, c-format msgid "old and new cluster pg_controldata checksum versions do not match" msgstr "Las versiones de checksum de datos antigua y nueva no coinciden" -#: controldata.c:718 +#: controldata.c:717 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "Agregando el sufijo «.old» a global/pg_control" -#: controldata.c:723 +#: controldata.c:722 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" -#: controldata.c:727 +#: controldata.c:726 #, c-format msgid "" "\n" @@ -749,27 +965,32 @@ msgstr "Creando el volcado de objetos globales" msgid "Creating dump of database schemas" msgstr "Creando el volcado de esquemas de bases de datos" -#: exec.c:47 exec.c:52 +#: exec.c:47 +#, c-format +msgid "could not get pg_ctl version data using %s: %m" +msgstr "no se pudo obtener datos de versión de pg_ctl usando %s: %m" + +#: exec.c:51 #, c-format msgid "could not get pg_ctl version data using %s: %s" msgstr "no se pudo obtener datos de versión de pg_ctl usando %s: %s" -#: exec.c:56 +#: exec.c:55 #, c-format msgid "could not get pg_ctl version output from %s" msgstr "no se pudo obtener la salida de versión de pg_ctl de %s" -#: exec.c:113 exec.c:117 +#: exec.c:112 exec.c:116 #, c-format msgid "command too long" msgstr "orden demasiado larga" -#: exec.c:161 pg_upgrade.c:286 +#: exec.c:160 pg_upgrade.c:311 #, c-format msgid "could not open log file \"%s\": %m" msgstr "no se pudo abrir el archivo de registro «%s»: %m" -#: exec.c:193 +#: exec.c:192 #, c-format msgid "" "\n" @@ -778,12 +999,12 @@ msgstr "" "\n" "*falló*" -#: exec.c:196 +#: exec.c:195 #, c-format msgid "There were problems executing \"%s\"" msgstr "Hubo problemas ejecutando «%s»" -#: exec.c:199 +#: exec.c:198 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" @@ -792,7 +1013,7 @@ msgstr "" "Consulte las últimas línea de «%s» o «%s» para\n" "saber la causa probable de la falla." -#: exec.c:204 +#: exec.c:203 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" @@ -801,141 +1022,156 @@ msgstr "" "Consulte las últimas líneas de «%s» para saber\n" "la causa probable de la falla." -#: exec.c:219 pg_upgrade.c:296 +#: exec.c:218 pg_upgrade.c:321 #, c-format msgid "could not write to log file \"%s\": %m" msgstr "no se pudo escribir al archivo de log «%s»" -#: exec.c:245 +#: exec.c:244 #, c-format -msgid "could not open file \"%s\" for reading: %s" -msgstr "no se pudo abrir el archivo «%s» para lectura: %s" +msgid "could not open file \"%s\" for reading: %m" +msgstr "no se pudo abrir archivo «%s» para lectura: %m" -#: exec.c:272 +#: exec.c:270 #, c-format msgid "You must have read and write access in the current directory." msgstr "Debe tener privilegios de lectura y escritura en el directorio actual." -#: exec.c:325 exec.c:391 +#: exec.c:323 exec.c:389 exec.c:439 #, c-format -msgid "check for \"%s\" failed: %s" -msgstr "la comprobación de «%s» falló: %s" +msgid "check for \"%s\" failed: %m" +msgstr "la comprobación de «%s» falló: %m" -#: exec.c:328 exec.c:394 +#: exec.c:326 exec.c:392 #, c-format msgid "\"%s\" is not a directory" msgstr "«%s» no es un directorio" -#: exec.c:441 -#, c-format -msgid "check for \"%s\" failed: %m" -msgstr "la comprobación de «%s» falló: %m" - -#: exec.c:446 +#: exec.c:444 #, c-format msgid "check for \"%s\" failed: cannot execute" msgstr "La comprobación de «%s» falló: no se puede ejecutar" -#: exec.c:456 +#: exec.c:454 #, c-format msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"" msgstr "La comprobación de «%s» falló: versión incorrecta: se encontró «%s», se esperaba «%s»" -#: file.c:43 file.c:64 +#: file.c:44 #, c-format -msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "error mientras se clonaba la relación «%s.%s» («%s» a «%s»): %s" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "error mientras se clonaba la relación «%s.%s» («%s» a «%s»): %m" + +#: file.c:51 +#, c-format +msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "error mientras se clonaba la relación «%s.%s»: no se pudo abrir el archivo «%s»: %m" -#: file.c:50 +#: file.c:56 #, c-format -msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s" -msgstr "error mientras se clonaba la relación «%s.%s»: no se pudo abrir el archivo «%s»: %s" +msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "error mientras se clonaba la relación «%s.%s»: no se pudo crear el archivo «%s»: %m" -#: file.c:55 +#: file.c:65 #, c-format -msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s" -msgstr "error mientras se clonaba la relación «%s.%s»: no se pudo crear el archivo «%s»: %s" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s" +msgstr "error mientras se clonaba la relación «%s.%s» («%s» a «%s»): %s" -#: file.c:90 file.c:193 +#: file.c:91 file.c:160 file.c:233 #, c-format -msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s" -msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo leer el archivo «%s»: %s" +msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo abrir el archivo «%s»: %m" -#: file.c:95 file.c:202 +#: file.c:96 file.c:165 file.c:242 #, c-format -msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s" -msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo crear el archivo «%s»: %s" +msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo crear el archivo «%s»: %m" -#: file.c:109 file.c:226 +#: file.c:110 file.c:266 #, c-format -msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s" -msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo leer el archivo «%s»: %s" +msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %m" +msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo leer el archivo «%s»: %m" -#: file.c:121 file.c:304 +#: file.c:122 file.c:344 #, c-format -msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s" -msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo escribir el archivo «%s»: %s" +msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %m" +msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo escribir el archivo «%s»: %m" -#: file.c:135 +#: file.c:136 #, c-format -msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "error mientras se copiaba la relación «%s.%s» («%s» a «%s»): %s" +msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "error mientras se copiaba la relación «%s.%s» («%s» a «%s»): %m" -#: file.c:154 +#: file.c:172 #, c-format -msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "error mientras se creaba el link para la relación «%s.%s» («%s» a «%s»): %s" +msgid "error while copying relation \"%s.%s\": could not copy file range from \"%s\" to \"%s\": %m" +msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo copiar el rango desde «%s» a «%s»: %m" -#: file.c:197 +#: file.c:194 #, c-format -msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s" -msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo hacer stat a «%s»: %s" +msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "error mientras se creaba el link para la relación «%s.%s» («%s» a «%s»): %m" -#: file.c:229 +#: file.c:237 +#, c-format +msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %m" +msgstr "error mientras se copiaba la relación «%s.%s»: no se pudo hacer stat a «%s»: %m" + +#: file.c:269 #, c-format msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"" msgstr "error mientras se copiaba la relación «%s.%s»: se encontró una página parcial en el archivo «%s»" -#: file.c:331 file.c:348 +#: file.c:371 file.c:387 #, c-format -msgid "could not clone file between old and new data directories: %s" -msgstr "no se pudo clonar el archivo entre los directorios viejo y nuevo: %s" +msgid "could not clone file between old and new data directories: %m" +msgstr "no se pudo clonar el archivo entre los directorios viejo y nuevo: %m" -#: file.c:344 +#: file.c:383 file.c:420 #, c-format -msgid "could not create file \"%s\": %s" -msgstr "no se pudo crear el archivo «%s»: %s" +msgid "could not create file \"%s\": %m" +msgstr "no se pudo crear archivo «%s»: %m" -#: file.c:355 +#: file.c:393 #, c-format msgid "file cloning not supported on this platform" msgstr "el clonado de archivos no está soportado en esta plataforma" -#: file.c:372 +#: file.c:424 +#, c-format +msgid "could not copy file range between old and new data directories: %m" +msgstr "no se pudo clonar el archivo entre los directorios viejo y nuevo: %m" + +#: file.c:430 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "copy_file_range no está soportado en esta plataforma" + +#: file.c:447 #, c-format msgid "" -"could not create hard link between old and new data directories: %s\n" +"could not create hard link between old and new data directories: %m\n" "In link mode the old and new data directories must be on the same file system." msgstr "" -"No se pudo crear un link duro entre los directorios de datos nuevo y antiguo: %s\n" +"No se pudo crear un link duro entre los directorios de datos nuevo y antiguo: %m\n" "En modo link los directorios de dato nuevo y antiguo deben estar en el mismo sistema de archivos." -#: function.c:128 +#: function.c:154 #, c-format msgid "Checking for presence of required libraries" msgstr "Verificando la presencia de las bibliotecas requeridas" -#: function.c:165 +#: function.c:190 #, c-format msgid "could not load library \"%s\": %s" msgstr "no se pudo cargar la biblioteca «%s»: %s" -#: function.c:176 +#: function.c:201 #, c-format msgid "In database: %s\n" msgstr "En la base de datos: %s\n" -#: function.c:186 +#: function.c:211 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" @@ -950,51 +1186,51 @@ msgstr "" "de las bibliotecas problemáticas está en el archivo:\n" " %s" -#: info.c:126 +#: info.c:128 #, c-format msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"" msgstr "Los nombres de relación para OID %u en la base de datos «%s» no coinciden: nombre antiguo «%s.%s», nombre nuevo «%s.%s»" -#: info.c:146 +#: info.c:148 #, c-format msgid "Failed to match up old and new tables in database \"%s\"" msgstr "No hubo coincidencia en las tablas nueva y antigua en la base de datos «%s»" -#: info.c:227 +#: info.c:229 #, c-format msgid " which is an index on \"%s.%s\"" msgstr " que es un índice en «%s.%s»" -#: info.c:237 +#: info.c:239 #, c-format msgid " which is an index on OID %u" msgstr " que es un índice en el OID %u" -#: info.c:249 +#: info.c:251 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr " que es la tabla TOAST para «%s.%s»" -#: info.c:257 +#: info.c:259 #, c-format msgid " which is the TOAST table for OID %u" msgstr " que es la tabla TOAST para el OID %u" -#: info.c:261 +#: info.c:263 #, c-format msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s" msgstr "" "No se encontró equivalente en el clúster antiguo para la relación nueva con OID %u\n" "en la base de datos «%s»: %s" -#: info.c:264 +#: info.c:266 #, c-format msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s" msgstr "" "No se encontró equivalente en el clúster nuevo para la antigua relación con OID %u\n" "en la base de datos «%s»: %s" -#: info.c:289 +#: info.c:300 #, c-format msgid "" "\n" @@ -1003,7 +1239,7 @@ msgstr "" "\n" "bases de datos de origen:" -#: info.c:291 +#: info.c:302 #, c-format msgid "" "\n" @@ -1012,94 +1248,104 @@ msgstr "" "\n" "bases de datos de destino:" -#: info.c:329 +#: info.c:346 #, c-format msgid "template0 not found" msgstr "template0 no encontrado" -#: info.c:645 +#: info.c:805 #, c-format -msgid "Database: %s" -msgstr "Base de datos: %s" +msgid "Database: \"%s\"" +msgstr "Base de datos: «%s»" -#: info.c:657 +#: info.c:818 #, c-format -msgid "relname: %s.%s: reloid: %u reltblspace: %s" -msgstr "relname: %s.%s: reloid: %u reltblspace: %s" +msgid "relname: \"%s.%s\", reloid: %u, reltblspace: \"%s\"" +msgstr "relname: «%s.%s»: reloid: %u reltblspace: «%s»" -#: option.c:101 +#: info.c:832 +#, c-format +msgid "Logical replication slots in the database:" +msgstr "Slots de replicación lógica en la base de datos:" + +#: info.c:838 +#, c-format +msgid "slot name: \"%s\", output plugin: \"%s\", two_phase: %s" +msgstr "nombre de slot: «%s», plugin de salida: «%s», two_phase: %s" + +#: option.c:105 #, c-format msgid "%s: cannot be run as root" msgstr "%s: no puede ejecutarse como root" -#: option.c:168 +#: option.c:172 #, c-format msgid "invalid old port number" msgstr "número de puerto antiguo no válido" -#: option.c:173 +#: option.c:177 #, c-format msgid "invalid new port number" msgstr "número de puerto nuevo no válido" -#: option.c:203 +#: option.c:216 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Pruebe «%s --help» para mayor información.\n" -#: option.c:210 +#: option.c:223 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: option.c:213 +#: option.c:229 #, c-format msgid "Running in verbose mode" msgstr "Ejecutando en modo verboso" -#: option.c:231 +#: option.c:247 msgid "old cluster binaries reside" msgstr "residen los binarios del clúster antiguo" -#: option.c:233 +#: option.c:249 msgid "new cluster binaries reside" msgstr "residen los binarios del clúster nuevo" -#: option.c:235 +#: option.c:251 msgid "old cluster data resides" msgstr "residen los datos del clúster antiguo" -#: option.c:237 +#: option.c:253 msgid "new cluster data resides" msgstr "residen los datos del clúster nuevo" -#: option.c:239 +#: option.c:255 msgid "sockets will be created" msgstr "se crearán los sockets" -#: option.c:256 option.c:356 +#: option.c:272 option.c:374 #, c-format msgid "could not determine current directory" msgstr "no se pudo identificar el directorio actual" -#: option.c:259 +#: option.c:275 #, c-format msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows" msgstr "no se puede ejecutar pg_upgrade desde dentro del directorio de datos del clúster nuevo en Windows" -#: option.c:268 +#: option.c:284 #, c-format msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" "\n" msgstr "pg_upgrade actualiza un clúster PostgreSQL a una versión «mayor» diferente.\n" -#: option.c:269 +#: option.c:285 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: option.c:270 +#: option.c:286 #, c-format msgid "" " pg_upgrade [OPTION]...\n" @@ -1108,17 +1354,17 @@ msgstr "" " pg_upgrade [OPCIÓN]...\n" "\n" -#: option.c:271 +#: option.c:287 #, c-format msgid "Options:\n" msgstr "Opciones:\n" -#: option.c:272 +#: option.c:288 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" msgstr " -b, --old-bindir=BINDIR directorio de ejecutables del clúster antiguo\n" -#: option.c:273 +#: option.c:289 #, c-format msgid "" " -B, --new-bindir=BINDIR new cluster executable directory (default\n" @@ -1127,97 +1373,107 @@ msgstr "" " -B, --new-bindir=BINDIR directorio de ejecutables del clúster nuevo\n" " (por omisión el mismo directorio que pg_upgrade)\n" -#: option.c:275 +#: option.c:291 #, c-format msgid " -c, --check check clusters only, don't change any data\n" msgstr " -c, --check sólo verificar clústers, no cambiar datos\n" -#: option.c:276 +#: option.c:292 #, c-format msgid " -d, --old-datadir=DATADIR old cluster data directory\n" msgstr " -d, --old-datadir=DATADIR directorio de datos del clúster antiguo\n" -#: option.c:277 +#: option.c:293 #, c-format msgid " -D, --new-datadir=DATADIR new cluster data directory\n" msgstr " -D, --new-datadir=DATADIR directorio de datos del clúster nuevo\n" -#: option.c:278 +#: option.c:294 #, c-format msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" msgstr " -j, --jobs=NUM máximo de procesos paralelos para restaurar\n" -#: option.c:279 +#: option.c:295 #, c-format msgid " -k, --link link instead of copying files to new cluster\n" msgstr " -k, --link enlazar (link) archivos en vez de copiarlos\n" -#: option.c:280 +#: option.c:296 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n" -#: option.c:281 +#: option.c:297 #, c-format msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n" msgstr " -o, --old-options=OPCIONES opciones a pasar al servidor antiguo\n" -#: option.c:282 +#: option.c:298 #, c-format msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n" msgstr " -O, --new-options=OPCIONES opciones a pasar al servidor nuevo\n" -#: option.c:283 +#: option.c:299 #, c-format msgid " -p, --old-port=PORT old cluster port number (default %d)\n" msgstr " -p, --old-port=PUERTO número de puerto del clúster antiguo (def. %d)\n" -#: option.c:284 +#: option.c:300 #, c-format msgid " -P, --new-port=PORT new cluster port number (default %d)\n" msgstr " -P, --new-port=PUERTO número de puerto del clúster nuevo (def. %d)\n" -#: option.c:285 +#: option.c:301 #, c-format msgid " -r, --retain retain SQL and log files after success\n" msgstr " -r, --retain preservar archivos SQL y logs en caso de éxito\n" -#: option.c:286 +#: option.c:302 #, c-format msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" msgstr " -s, --socketdir=DIR directorio de sockets a usar (omisión: dir. actual)\n" -#: option.c:287 +#: option.c:303 #, c-format msgid " -U, --username=NAME cluster superuser (default \"%s\")\n" msgstr " -U, --username=NOMBRE superusuario del clúster (def. «%s»)\n" -#: option.c:288 +#: option.c:304 #, c-format msgid " -v, --verbose enable verbose internal logging\n" msgstr " -v, --verbose activar registro interno verboso\n" -#: option.c:289 +#: option.c:305 #, c-format msgid " -V, --version display version information, then exit\n" msgstr " -V, --version mostrar información de versión y salir\n" -#: option.c:290 +#: option.c:306 #, c-format msgid " --clone clone instead of copying files to new cluster\n" msgstr " --clone clonar los archivos en vez de copiarlos\n" -#: option.c:291 +#: option.c:307 #, c-format msgid " --copy copy files to new cluster (default)\n" msgstr " --copy copiar los archivos al clúster nuevo (por omisión)\n" -#: option.c:292 +#: option.c:308 +#, c-format +msgid " --copy-file-range copy files to new cluster with copy_file_range\n" +msgstr " --copy-file-range copiar archivos usando copy_file_range\n" + +#: option.c:309 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=MÉTODO definir método de sincronizar archivos a disco\n" + +#: option.c:310 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: option.c:293 +#: option.c:311 #, c-format msgid "" "\n" @@ -1232,7 +1488,7 @@ msgstr "" " apagar el postmaster que atiende al clúster antiguo\n" " apagar el postmaster que atiende al clúster nuevo\n" -#: option.c:298 +#: option.c:316 #, c-format msgid "" "\n" @@ -1249,7 +1505,7 @@ msgstr "" " el directorio «bin» para la versión antigua (-b BINDIR)\n" " el directorio «bin» para la versión nueva (-B BINDIR)\n" -#: option.c:304 +#: option.c:322 #, c-format msgid "" "\n" @@ -1262,7 +1518,7 @@ msgstr "" " pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n" "o\n" -#: option.c:309 +#: option.c:327 #, c-format msgid "" " $ export PGDATAOLD=oldCluster/data\n" @@ -1277,7 +1533,7 @@ msgstr "" " $ export PGBINNEW=clusterNuevo/bin\n" " $ pg_upgrade\n" -#: option.c:315 +#: option.c:333 #, c-format msgid "" " C:\\> set PGDATAOLD=oldCluster/data\n" @@ -1292,7 +1548,7 @@ msgstr "" " C:\\> set PGBINNEW=clusterNuevo/bin\n" " C:\\> pg_upgrade\n" -#: option.c:321 +#: option.c:339 #, c-format msgid "" "\n" @@ -1301,12 +1557,12 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: option.c:322 +#: option.c:340 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: option.c:362 +#: option.c:380 #, c-format msgid "" "You must identify the directory where the %s.\n" @@ -1315,45 +1571,50 @@ msgstr "" "Debe identificar el directorio donde %s.\n" "Por favor use la opción %s o la variable de ambiente %s." -#: option.c:415 +#: option.c:433 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "Buscando el directorio de datos real para el clúster de origen" -#: option.c:417 +#: option.c:435 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "Buscando el directorio de datos real para el clúster de destino" -#: option.c:430 option.c:435 +#: option.c:448 +#, c-format +msgid "could not get data directory using %s: %m" +msgstr "no se pudo obtener el directorio de datos usando %s: %m" + +#: option.c:452 #, c-format msgid "could not get data directory using %s: %s" msgstr "no se pudo obtener el directorio de datos usando %s: %s" -#: option.c:484 +#: option.c:500 #, c-format -msgid "could not read line %d from file \"%s\": %s" -msgstr "no se pudo leer la línea %d del archivo «%s»: %s" +msgid "could not read line %d from file \"%s\": %m" +msgstr "no se pudo leer la línea %d del archivo «%s»: %m" -#: option.c:501 +#: option.c:517 #, c-format msgid "user-supplied old port number %hu corrected to %hu" msgstr "número de port entregado por el usuario %hu corregido a %hu" #: parallel.c:127 parallel.c:235 #, c-format -msgid "could not create worker process: %s" -msgstr "no se pudo crear el proceso hijo: %s" +msgid "could not create worker process: %m" +msgstr "no se pudo crear el proceso hijo: %m" #: parallel.c:143 parallel.c:253 #, c-format -msgid "could not create worker thread: %s" -msgstr "no se pudo crear el thread: %s" +msgid "could not create worker thread: %m" +msgstr "no se pudo crear el thread trabajador: %m" #: parallel.c:294 #, c-format -msgid "%s() failed: %s" -msgstr "%s() falló: %s" +msgid "%s() failed: %m" +msgstr "%s() falló: %m" #: parallel.c:298 #, c-format @@ -1362,15 +1623,15 @@ msgstr "el proceso hijo terminó anormalmente: estado %d" #: parallel.c:313 #, c-format -msgid "child worker exited abnormally: %s" -msgstr "el thread terminó anormalmente: %s" +msgid "child worker exited abnormally: %m" +msgstr "el hijo trabajador terminó anormalmente: %m" -#: pg_upgrade.c:107 +#: pg_upgrade.c:115 #, c-format -msgid "could not read permissions of directory \"%s\": %s" -msgstr "no se pudo obtener los permisos del directorio «%s»: %s" +msgid "could not read permissions of directory \"%s\": %m" +msgstr "no se pudo obtener los permisos del directorio «%s»: %m" -#: pg_upgrade.c:139 +#: pg_upgrade.c:147 #, c-format msgid "" "\n" @@ -1381,17 +1642,17 @@ msgstr "" "Llevando a cabo el Upgrade\n" "--------------------------" -#: pg_upgrade.c:184 +#: pg_upgrade.c:192 #, c-format msgid "Setting next OID for new cluster" msgstr "Seteando siguiente OID para el nuevo clúster" -#: pg_upgrade.c:193 +#: pg_upgrade.c:216 #, c-format msgid "Sync data directory to disk" msgstr "Sincronizando directorio de datos a disco" -#: pg_upgrade.c:205 +#: pg_upgrade.c:230 #, c-format msgid "" "\n" @@ -1402,23 +1663,23 @@ msgstr "" "Actualización Completa\n" "----------------------" -#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265 -#: pg_upgrade.c:283 pg_upgrade.c:294 +#: pg_upgrade.c:263 pg_upgrade.c:276 pg_upgrade.c:283 pg_upgrade.c:290 +#: pg_upgrade.c:308 pg_upgrade.c:319 #, c-format msgid "directory path for new cluster is too long" msgstr "nombre de directorio para el nuevo clúster es demasiado largo" -#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278 +#: pg_upgrade.c:297 pg_upgrade.c:299 pg_upgrade.c:301 pg_upgrade.c:303 #, c-format msgid "could not create directory \"%s\": %m" msgstr "no se pudo crear el directorio «%s»: %m" -#: pg_upgrade.c:327 +#: pg_upgrade.c:352 #, c-format msgid "%s: could not find own program executable" msgstr "%s: no se pudo encontrar el ejecutable propio" -#: pg_upgrade.c:353 +#: pg_upgrade.c:378 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" @@ -1427,7 +1688,7 @@ msgstr "" "Parece haber un postmaster sirviendo el clúster antiguo.\n" "Por favor detenga ese postmaster e inténtelo nuevamente." -#: pg_upgrade.c:366 +#: pg_upgrade.c:391 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" @@ -1436,81 +1697,86 @@ msgstr "" "Parece haber un postmaster sirviendo el clúster nuevo.\n" "Por favor detenga ese postmaster e inténtelo nuevamente." -#: pg_upgrade.c:388 +#: pg_upgrade.c:413 #, c-format msgid "Setting locale and encoding for new cluster" msgstr "Estableciendo la configuración regional y codificación para el nuevo clúster" -#: pg_upgrade.c:450 +#: pg_upgrade.c:489 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Analizando todas las filas en el clúster nuevo" -#: pg_upgrade.c:463 +#: pg_upgrade.c:502 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Congelando todas las filas en el nuevo clúster" -#: pg_upgrade.c:483 +#: pg_upgrade.c:522 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Restaurando objetos globales en el nuevo clúster" -#: pg_upgrade.c:499 +#: pg_upgrade.c:538 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "Restaurando esquemas de bases de datos en el clúster nuevo" -#: pg_upgrade.c:605 +#: pg_upgrade.c:662 #, c-format msgid "Deleting files from new %s" msgstr "Eliminando archivos del nuevo %s" -#: pg_upgrade.c:609 +#: pg_upgrade.c:666 #, c-format msgid "could not delete directory \"%s\"" msgstr "no se pudo eliminar directorio «%s»" -#: pg_upgrade.c:628 +#: pg_upgrade.c:685 #, c-format msgid "Copying old %s to new server" msgstr "Copiando el %s antiguo al nuevo servidor" -#: pg_upgrade.c:654 +#: pg_upgrade.c:711 #, c-format msgid "Setting oldest XID for new cluster" msgstr "Estableciendo XID más antiguo para el nuevo clúster" -#: pg_upgrade.c:662 +#: pg_upgrade.c:719 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "Seteando el ID de transacción y «época» siguientes en el nuevo clúster" -#: pg_upgrade.c:692 +#: pg_upgrade.c:749 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "Seteando el multixact ID y offset siguientes en el nuevo clúster" -#: pg_upgrade.c:716 +#: pg_upgrade.c:773 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Seteando el multixact ID más antiguo en el nuevo clúster" -#: pg_upgrade.c:736 +#: pg_upgrade.c:793 #, c-format msgid "Resetting WAL archives" msgstr "Reseteando los archivos de WAL" -#: pg_upgrade.c:779 +#: pg_upgrade.c:836 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Seteando contadores frozenxid y minmxid en el clúster nuevo" -#: pg_upgrade.c:781 +#: pg_upgrade.c:838 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Seteando contador minmxid en el clúster nuevo" +#: pg_upgrade.c:929 +#, c-format +msgid "Restoring logical replication slots in the new cluster" +msgstr "Restaurando slots de replicación lógica en el nuevo clúster" + #: relfilenumber.c:35 #, c-format msgid "Cloning user relation files" @@ -1523,35 +1789,45 @@ msgstr "Copiando archivos de relaciones de usuario" #: relfilenumber.c:41 #, c-format +msgid "Copying user relation files with copy_file_range" +msgstr "Copiando archivos de relaciones de usuario con copy_file_range" + +#: relfilenumber.c:44 +#, c-format msgid "Linking user relation files" msgstr "Enlazando archivos de relaciones de usuario" -#: relfilenumber.c:115 +#: relfilenumber.c:118 #, c-format msgid "old database \"%s\" not found in the new cluster" msgstr "la base de datos «%s» no se encontró en el clúster nuevo" -#: relfilenumber.c:218 +#: relfilenumber.c:221 #, c-format -msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "error mientras se comprobaba la existencia del archivo «%s.%s» («%s» a «%s»); %s" +msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "error mientras se comprobaba la existencia del archivo «%s.%s» («%s» a «%s»); %m" -#: relfilenumber.c:236 +#: relfilenumber.c:238 #, c-format msgid "rewriting \"%s\" to \"%s\"" msgstr "reescribiendo «%s» a «%s»" -#: relfilenumber.c:244 +#: relfilenumber.c:246 #, c-format msgid "cloning \"%s\" to \"%s\"" msgstr "clonando «%s» a «%s»" -#: relfilenumber.c:249 +#: relfilenumber.c:251 #, c-format msgid "copying \"%s\" to \"%s\"" msgstr "copiando «%s» a «%s»" -#: relfilenumber.c:254 +#: relfilenumber.c:256 +#, c-format +msgid "copying \"%s\" to \"%s\" with copy_file_range" +msgstr "copiando «%s» a «%s» con copy_file_range" + +#: relfilenumber.c:261 #, c-format msgid "linking \"%s\" to \"%s\"" msgstr "enlazando «%s» a «%s»" @@ -1587,7 +1863,7 @@ msgstr "no se pudo abrir el archivo de versión «%s»: %m" msgid "could not parse version file \"%s\"" msgstr "no se pudo interpretar el archivo de versión «%s»" -#: server.c:288 +#: server.c:310 #, c-format msgid "" "\n" @@ -1596,7 +1872,7 @@ msgstr "" "\n" "%s" -#: server.c:292 +#: server.c:314 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -1605,7 +1881,7 @@ msgstr "" "no se pudo conectar al postmaster de origen iniciado con la orden:\n" "%s" -#: server.c:296 +#: server.c:318 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -1614,22 +1890,22 @@ msgstr "" "no se pudo conectar al postmaster de destino iniciado con la orden:\n" "%s" -#: server.c:310 +#: server.c:332 #, c-format msgid "pg_ctl failed to start the source server, or connection failed" msgstr "pg_ctl no pudo iniciar el servidor de origen, o la conexión falló" -#: server.c:312 +#: server.c:334 #, c-format msgid "pg_ctl failed to start the target server, or connection failed" msgstr "pg_ctl no pudo iniciar el servidor de destino, o la conexión falló" -#: server.c:357 +#: server.c:379 #, c-format msgid "out of memory" msgstr "memoria agotada" -#: server.c:370 +#: server.c:392 #, c-format msgid "libpq environment variable %s has a non-local server value: %s" msgstr "la variable de ambiente libpq %s tiene un valor de servidor no-local: %s" @@ -1650,8 +1926,8 @@ msgstr "el directorio de tablespace «%s» no existe" #: tablespace.c:87 #, c-format -msgid "could not stat tablespace directory \"%s\": %s" -msgstr "no se pudo hace stat al directorio de tablespace «%s»: %s" +msgid "could not stat tablespace directory \"%s\": %m" +msgstr "no se pudo hace stat al directorio de tablespace «%s»: %m" #: tablespace.c:92 #, c-format @@ -1673,63 +1949,17 @@ msgstr "no se pudo acceder al directorio «%s»: %m" msgid "ok" msgstr "éxito" -#: version.c:184 -#, c-format -msgid "Checking for incompatible \"line\" data type" -msgstr "Verificando datos de usuario de tipo «line» incompatible" - -#: version.c:193 -#, c-format -msgid "" -"Your installation contains the \"line\" data type in user tables.\n" -"This data type changed its internal and input/output format\n" -"between your old and new versions so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"Su instalación contiene el tipo de dato «line» en tablas de usuario. Este\n" -"tipo de dato cambió su formato interno y de entrada/salida entre las\n" -"versiones de sus clústers antiguo y nuevo, por lo que este clúster no puede\n" -"actualmente ser actualizado. Puede eliminar las columnas problemáticas y\n" -"reiniciar la actualización. Un listado de las columnas problemáticas está\n" -"en el archivo:\n" -" %s" - -#: version.c:224 -#, c-format -msgid "Checking for invalid \"unknown\" user columns" -msgstr "Verificando columnas de usuario del tipo no válido «unknown»" - -#: version.c:233 -#, c-format -msgid "" -"Your installation contains the \"unknown\" data type in user tables.\n" -"This data type is no longer allowed in tables, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"Su instalación contiene el tipo «unknown» en tablas de usuario.\n" -"Este tipo ya no es permitido en tablas,\n" -"por lo que este clúster no puede ser actualizado. Puede\n" -"eliminar las columnas problemáticas y reiniciar la actualización.\n" -"Un listado de las columnas problemáticas está en el archivo:\n" -" %s" - -#: version.c:257 +#: version.c:44 #, c-format msgid "Checking for hash indexes" msgstr "Verificando índices hash" -#: version.c:335 +#: version.c:121 #, c-format msgid "warning" msgstr "atención" -#: version.c:337 +#: version.c:123 #, c-format msgid "" "\n" @@ -1744,7 +1974,7 @@ msgstr "" "con la orden REINDEX. Después de la actualización, se le entregarán\n" "instrucciones de REINDEX." -#: version.c:343 +#: version.c:129 #, c-format msgid "" "\n" @@ -1763,39 +1993,17 @@ msgstr "" "cuando se ejecute en psql con el superusuario de la base de datos recreará\n" "los índices no válidos; hasta entonces, ninguno de esos índices será usado." -#: version.c:369 -#, c-format -msgid "Checking for invalid \"sql_identifier\" user columns" -msgstr "Verificando columnas de usuario del tipo «sql_identifier»" - -#: version.c:379 -#, c-format -msgid "" -"Your installation contains the \"sql_identifier\" data type in user tables.\n" -"The on-disk format for this data type has changed, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"Su instalación contiene el tipo de dato «sql_identifier» en tablas de usuario.\n" -"El formato en disco para este tipo de dato ha cambiado, por lo que\n" -"este clúster no puede ser actualizado.\n" -"Puede eliminar las columnas problemáticas y reiniciar la actualización\n" -"Un listado de las columnas problemáticas está en el archivo:\n" -" %s" - -#: version.c:402 +#: version.c:153 #, c-format msgid "Checking for extension updates" msgstr "Verificando actualizaciones para extensiones" -#: version.c:450 +#: version.c:200 #, c-format msgid "notice" msgstr "aviso" -#: version.c:451 +#: version.c:201 #, c-format msgid "" "\n" diff --git a/src/bin/pg_upgrade/po/fr.po b/src/bin/pg_upgrade/po/fr.po index 3155bf06c5d09..6117d1fb48d91 100644 --- a/src/bin/pg_upgrade/po/fr.po +++ b/src/bin/pg_upgrade/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-12 05:16+0000\n" -"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"POT-Creation-Date: 2024-10-29 18:20+0000\n" +"PO-Revision-Date: 2024-10-30 07:41+0100\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,231 +19,430 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: check.c:71 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "mémoire épuisée\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "n'a pas pu récupérer le code de statut du sous-processus : code d'erreur %lu" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "n'a pas pu trouver l'identifiant réel %ld de l'utilisateur : %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "l'utilisateur n'existe pas" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "l'argument de la commande shell contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "le nom de la base contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: check.c:111 +msgid "Checking for system-defined composite types in user tables" +msgstr "Vérification des types composites définis par le système dans les tables utilisateurs" + +#: check.c:118 +msgid "" +"Your installation contains system-defined composite types in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"Votre installation contient des types composites définis par le système dans vos tables\n" +"utilisateurs. Les OID de ces types ne sont pas stables entre différentes versions\n" +"de PostgreSQL, donc cette instance ne peut pas être mise à jour actuellement. Vous pouvez\n" +"supprimer les colonnes problématiques, puis relancer la mise à jour.\n" + +#: check.c:132 +msgid "Checking for incompatible \"line\" data type" +msgstr "Vérification des types de données line incompatibles" + +#: check.c:137 +msgid "" +"Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"Votre installation contient le type de données « line » dans vos tables utilisateurs.\n" +"Ce type de données a changé de format interne et en entrée/sortie entre vos ancienne\n" +"et nouvelle versions, donc cette instance ne peut pas être mise à jour\n" +"actuellement. Vous pouvez supprimer les colonnes problématiques et relancer la mise à jour.\n" + +#: check.c:154 +msgid "Checking for reg* data types in user tables" +msgstr "Vérification des types de données reg* dans les tables utilisateurs" + +#: check.c:181 +msgid "" +"Your installation contains one of the reg* data types in user tables.\n" +"These data types reference system OIDs that are not preserved by\n" +"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"Votre installation contient un des types de données reg* dans vos tables\n" +"utilisateurs. Ces types de données référencent des OID système qui ne sont\n" +"pas préservés par pg_upgrade, donc cette instance ne peut pas être mise à\n" +"jour actuellement. Vous pouvez supprimer les colonnes problématiques et relancer\n" +"la mise à jour.\n" + +#: check.c:193 +msgid "Checking for incompatible \"aclitem\" data type" +msgstr "Vérification des types de données « aclitem » incompatibles" + +#: check.c:198 +msgid "" +"Your installation contains the \"aclitem\" data type in user tables.\n" +"The internal format of \"aclitem\" changed in PostgreSQL version 16\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"Votre installation contient un type de données « aclitem » dans vos tables utilisateurs.\n" +"Le format interne de « aclitem » a changé lors du développement de la version 16, donc\n" +"cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer les\n" +"colonnes problématiques et relancer la mise à jour.\n" + +#: check.c:217 +msgid "Checking for invalid \"unknown\" user columns" +msgstr "Vérification des colonnes utilisateurs « unknown » invalides" + +#: check.c:222 +msgid "" +"Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this cluster\n" +"cannot currently be upgraded. You can drop the problem columns\n" +"and restart the upgrade.\n" +msgstr "" +"Votre installation contient le type de données « unknown » dans vos tables\n" +"utilisateurs. Ce type de données n'est plus autorisé dans les tables, donc\n" +"cette instance ne peut pas être mise à jour pour l'instant. Vous pouvez\n" +"supprimer les colonnes problématiques, puis relancer la mise à jour.\n" + +#: check.c:239 +msgid "Checking for invalid \"sql_identifier\" user columns" +msgstr "Vérification des colonnes utilisateurs « sql_identifier » invalides" + +#: check.c:244 +msgid "" +"Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can drop the problem\n" +"columns and restart the upgrade.\n" +msgstr "" +"Votre installation contient le type de données « sql_identifier » dans les tables\n" +"utilisateurs. Le format sur disque pour ce type de données a changé,\n" +"donc cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer\n" +"les colonnes problématiques, puis relancer la mise à jour.\n" + +#: check.c:255 +msgid "Checking for incompatible \"jsonb\" data type in user tables" +msgstr "Vérification du type de données « json » incompatible dans les tables utilisateurs" + +#: check.c:260 +msgid "" +"Your installation contains the \"jsonb\" data type in user tables.\n" +"The internal format of \"jsonb\" changed during 9.4 beta so this\n" +"cluster cannot currently be upgraded. You can drop the problem \n" +"columns and restart the upgrade.\n" +msgstr "" +"Votre installation contient un type de données « jsonb » dans vos tables utilisateurs.\n" +"Le format interne de « jsonb » a changé lors du développement de la version 9.4 beta, donc\n" +"cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer les\n" +"colonnes problématiques et relancer la mise à jour.\n" + +#: check.c:272 +msgid "Checking for removed \"abstime\" data type in user tables" +msgstr "Vérification du type de données « abstime » supprimé dans les tables utilisateurs" + +#: check.c:277 +msgid "" +"Your installation contains the \"abstime\" data type in user tables.\n" +"The \"abstime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Votre installation contient le type de données « abstime » dans les tables utilisateurs.\n" +"Le type «abstime » a été supprimé dans PostgreSQL version 12,\n" +"donc cette instance ne peut pas être mise à jour pour l'instant. Vous pouvez\n" +"supprimer les colonnes problématiques ou les convertir en un autre type de données,\n" +"et relancer la mise à jour.\n" + +#: check.c:285 +msgid "Checking for removed \"reltime\" data type in user tables" +msgstr "Vérification du type de données « reltime » supprimé dans les tables utilisateurs" + +#: check.c:290 +msgid "" +"Your installation contains the \"reltime\" data type in user tables.\n" +"The \"reltime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Votre installation contient le type de données « reltime » dans les tables utilisateurs.\n" +"Le type «reltime » a été supprimé dans PostgreSQL version 12,\n" +"donc cette instance ne peut pas être mise à jour pour l'instant. Vous pouvez\n" +"supprimer les colonnes problématiques ou les convertir en un autre type de données,\n" +"et relancer la mise à jour.\n" + +#: check.c:298 +msgid "Checking for removed \"tinterval\" data type in user tables" +msgstr "Vérification du type de données « tinterval » supprimé dans les tables utilisateurs" + +#: check.c:303 +msgid "" +"Your installation contains the \"tinterval\" data type in user tables.\n" +"The \"tinterval\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Votre installation contient le type de données « tinterval » dans les tables utilisateurs.\n" +"Le type « tinterval » a été supprimé dans PostgreSQL version 12,\n" +"donc cette instance ne peut pas être mise à jour pour l'instant. Vous pouvez\n" +"supprimer les colonnes problématiques ou les convertir en un autre type de données,\n" +"et relancer la mise à jour.\n" + +#: check.c:345 +#, c-format +msgid "Checking data type usage" +msgstr "Vérification de l'utilisation du type de données" + +#: check.c:480 +#, c-format +msgid "failed check: %s" +msgstr "vérification échouée : %s" + +#: check.c:483 +msgid "A list of the problem columns is in the file:" +msgstr "Une liste des colonnes problématiques se trouve dans le fichier :" + +#: check.c:495 check.c:963 check.c:1136 check.c:1251 check.c:1345 check.c:1473 +#: check.c:1549 check.c:1613 check.c:1686 check.c:1865 check.c:1884 +#: check.c:1953 check.c:2005 file.c:378 file.c:415 function.c:189 option.c:493 +#: version.c:79 version.c:177 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier « %s » : %m" + +#: check.c:522 +#, c-format +msgid "Data type checks failed: %s" +msgstr "Échec de la vérification des types de données : %s" + +#: check.c:563 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" -"------------------------------------------------\n" +"------------------------------------------------" msgstr "" "Exécution de tests de cohérence sur l'ancien serveur\n" -"----------------------------------------------------\n" +"----------------------------------------------------" -#: check.c:77 +#: check.c:569 #, c-format msgid "" "Performing Consistency Checks\n" -"-----------------------------\n" +"-----------------------------" msgstr "" "Exécution de tests de cohérence\n" -"-------------------------------\n" +"-------------------------------" -#: check.c:210 +#: check.c:718 #, c-format msgid "" "\n" -"*Clusters are compatible*\n" +"*Clusters are compatible*" msgstr "" "\n" -"*Les instances sont compatibles*\n" +"*Les instances sont compatibles*" -#: check.c:216 +#: check.c:726 #, c-format msgid "" "\n" "If pg_upgrade fails after this point, you must re-initdb the\n" -"new cluster before continuing.\n" +"new cluster before continuing." msgstr "" "\n" "Si pg_upgrade échoue après cela, vous devez ré-exécuter initdb\n" -"sur la nouvelle instance avant de continuer.\n" +"sur la nouvelle instance avant de continuer." -#: check.c:257 +#: check.c:767 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" "Once you start the new server, consider running:\n" -" %s/vacuumdb %s--all --analyze-in-stages\n" -"\n" +" %s/vacuumdb %s--all --analyze-in-stages" msgstr "" "Les statistiques de l'optimiseur ne sont pas transférées par pg_upgrade.\n" "Une fois le nouveau serveur démarré, pensez à exécuter :\n" -" %s/vacuumdb %s--all --analyze-in-stages\n" -"\n" +" %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:263 +#: check.c:773 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" -" %s\n" +" %s" msgstr "" -"Exécuter ce script supprimera les fichiers de données de l'ancienne\n" -"instance :\n" -" %s\n" +"Exécuter ce script supprimera les fichiers de données de l'ancienne instance :\n" +" %s" -#: check.c:268 +#: check.c:778 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" "because user-defined tablespaces or the new cluster's data directory\n" "exist in the old cluster directory. The old cluster's contents must\n" -"be deleted manually.\n" +"be deleted manually." msgstr "" "N'a pas pu créer un script pour supprimer les fichiers de données\n" "de l'ancienne instance parce que les tablespaces définis par l'utilisateur\n" "ou le répertoire de données de la nouvelle instance existent dans le répertoire\n" "de l'ancienne instance. Le contenu de l'ancienne instance doit être supprimé\n" -"manuellement.\n" +"manuellement." -#: check.c:280 +#: check.c:790 #, c-format msgid "Checking cluster versions" msgstr "Vérification des versions des instances" -#: check.c:292 -#, c-format -msgid "This utility can only upgrade from PostgreSQL version 9.2 and later.\n" -msgstr "Cet outil peut seulement mettre à jour les versions 9.2 et ultérieures de PostgreSQL.\n" - -#: check.c:296 -#, c-format -msgid "This utility can only upgrade to PostgreSQL version %s.\n" -msgstr "Cet outil peut seulement mettre à jour vers la version %s de PostgreSQL.\n" - -#: check.c:305 -#, c-format -msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n" -msgstr "Cet outil ne peut pas être utilisé pour mettre à jour vers des versions majeures plus anciennes de PostgreSQL.\n" - -#: check.c:310 -#, c-format -msgid "Old cluster data and binary directories are from different major versions.\n" -msgstr "Les répertoires des données de l'ancienne instance et des binaires sont de versions majeures différentes.\n" - -#: check.c:313 +#: check.c:802 #, c-format -msgid "New cluster data and binary directories are from different major versions.\n" -msgstr "Les répertoires des données de la nouvelle instance et des binaires sont de versions majeures différentes.\n" +msgid "This utility can only upgrade from PostgreSQL version %s and later." +msgstr "Cet outil peut seulement mettre à jour les versions %s et ultérieures de PostgreSQL." -#: check.c:328 +#: check.c:807 #, c-format -msgid "When checking a live server, the old and new port numbers must be different.\n" -msgstr "Lors de la vérification d'un serveur en production, l'ancien numéro de port doit être différent du nouveau.\n" +msgid "This utility can only upgrade to PostgreSQL version %s." +msgstr "Cet outil peut seulement mettre à jour vers la version %s de PostgreSQL." -#: check.c:343 +#: check.c:816 #, c-format -msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "les encodages de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n" +msgid "This utility cannot be used to downgrade to older major PostgreSQL versions." +msgstr "Cet outil ne peut pas être utilisé pour mettre à jour vers des versions majeures plus anciennes de PostgreSQL." -#: check.c:348 +#: check.c:821 #, c-format -msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "les valeurs de lc_collate de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n" +msgid "Old cluster data and binary directories are from different major versions." +msgstr "Les répertoires des données de l'ancienne instance et des binaires sont de versions majeures différentes." -#: check.c:351 -#, c-format -msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "les valeurs de lc_ctype de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n" - -#: check.c:354 +#: check.c:824 #, c-format -msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "les fournisseurs de locale pour la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n" +msgid "New cluster data and binary directories are from different major versions." +msgstr "Les répertoires des données de la nouvelle instance et des binaires sont de versions majeures différentes." -#: check.c:361 +#: check.c:839 #, c-format -msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "les valeurs de la locale ICU de la base de données « %s » ne correspondent pas : ancien « %s », nouveau « %s »\n" +msgid "When checking a live server, the old and new port numbers must be different." +msgstr "Lors de la vérification d'un serveur en production, l'ancien numéro de port doit être différent du nouveau." -#: check.c:436 +#: check.c:859 #, c-format -msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" -msgstr "La nouvelle instance « %s » n'est pas vide : relation « %s.%s » trouvée\n" +msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" +msgstr "La nouvelle instance « %s » n'est pas vide : relation « %s.%s » trouvée" -#: check.c:488 +#: check.c:882 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Vérification des répertoires de tablespace de la nouvelle instance" -#: check.c:499 +#: check.c:893 #, c-format -msgid "new cluster tablespace directory already exists: \"%s\"\n" -msgstr "le répertoire du tablespace de la nouvelle instance existe déjà : « %s »\n" +msgid "new cluster tablespace directory already exists: \"%s\"" +msgstr "le répertoire du tablespace de la nouvelle instance existe déjà : « %s »" -#: check.c:532 +#: check.c:926 #, c-format msgid "" "\n" -"WARNING: new data directory should not be inside the old data directory, e.g. %s\n" +"WARNING: new data directory should not be inside the old data directory, i.e. %s" msgstr "" "\n" -"AVERTISSEMENT : le nouveau répertoire de données ne doit pas être à l'intérieur de l'ancien répertoire de données, %s\n" +"AVERTISSEMENT : le nouveau répertoire de données ne doit pas être à l'intérieur de l'ancien répertoire de données, %s" -#: check.c:556 +#: check.c:950 #, c-format msgid "" "\n" -"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n" +"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s" msgstr "" "\n" -"AVERTISSEMENT : les emplacements de tablespaces utilisateurs ne doivent pas être à l'intérieur du répertoire de données, %s\n" +"AVERTISSEMENT : les emplacements des tablespaces utilisateurs ne doivent pas être à l'intérieur du répertoire de données, %s" -#: check.c:566 +#: check.c:960 #, c-format msgid "Creating script to delete old cluster" msgstr "Création du script pour supprimer l'ancienne instance" -#: check.c:569 check.c:744 check.c:864 check.c:963 check.c:1043 check.c:1306 -#: file.c:336 function.c:165 option.c:465 version.c:116 version.c:288 -#: version.c:423 +#: check.c:1014 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "n'a pas pu ouvrir le fichier « %s » : %s\n" +msgid "could not add execute permission to file \"%s\": %m" +msgstr "n'a pas pu ajouter les droits d'exécution pour le fichier « %s » : %m" -#: check.c:620 -#, c-format -msgid "could not add execute permission to file \"%s\": %s\n" -msgstr "n'a pas pu ajouter les droits d'exécution pour le fichier « %s » : %s\n" - -#: check.c:640 +#: check.c:1034 #, c-format msgid "Checking database user is the install user" msgstr "Vérification que l'utilisateur de la base de données est l'utilisateur d'installation" -#: check.c:656 +#: check.c:1050 #, c-format -msgid "database user \"%s\" is not the install user\n" -msgstr "l'utilisateur de la base de données « %s » n'est pas l'utilisateur d'installation\n" +msgid "database user \"%s\" is not the install user" +msgstr "l'utilisateur de la base de données « %s » n'est pas l'utilisateur d'installation" -#: check.c:667 +#: check.c:1061 #, c-format -msgid "could not determine the number of users\n" -msgstr "n'a pas pu déterminer le nombre d'utilisateurs\n" +msgid "could not determine the number of users" +msgstr "n'a pas pu déterminer le nombre d'utilisateurs" -#: check.c:675 +#: check.c:1069 #, c-format -msgid "Only the install user can be defined in the new cluster.\n" -msgstr "Seul l'utilisateur d'installation peut être défini dans la nouvelle instance.\n" +msgid "Only the install user can be defined in the new cluster." +msgstr "Seul l'utilisateur d'installation peut être défini dans la nouvelle instance." -#: check.c:705 +#: check.c:1098 #, c-format msgid "Checking database connection settings" msgstr "Vérification des paramètres de connexion de la base de données" -#: check.c:731 +#: check.c:1124 #, c-format -msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n" -msgstr "template0 ne doit pas autoriser les connexions, ie pg_database.datallowconn doit valoir false\n" +msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false" +msgstr "template0 ne doit pas autoriser les connexions, ie pg_database.datallowconn doit valoir false" -#: check.c:761 check.c:886 check.c:988 check.c:1065 check.c:1122 check.c:1181 -#: check.c:1210 check.c:1329 function.c:187 version.c:190 version.c:228 -#: version.c:372 +#: check.c:1150 check.c:1270 check.c:1367 check.c:1492 check.c:1568 +#: check.c:1626 check.c:1706 check.c:1897 check.c:2022 function.c:210 #, c-format -msgid "fatal\n" -msgstr "fatal\n" +msgid "fatal" +msgstr "fatal" -#: check.c:762 +#: check.c:1151 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -252,8 +451,7 @@ msgid "" "false. Consider allowing connection for all non-template0 databases\n" "or drop the databases which do not allow connections. A list of\n" "databases with the problem is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Tous les bases de données, en dehors de template0, doivent autoriser les connexions,\n" "autrement dit leur pg_database.datallowconn doit être à true. Votre installation contient\n" @@ -261,30 +459,29 @@ msgstr "" "Autorisez les connections aux bases, hors template0, ou supprimez les bases qui\n" "n'autorisent pas les connexions. Une liste des bases problématiques se trouve dans\n" "le fichier :\n" -" %s\n" -"\n" +" %s" -#: check.c:787 +#: check.c:1176 #, c-format msgid "Checking for prepared transactions" msgstr "Vérification des transactions préparées" -#: check.c:796 +#: check.c:1185 #, c-format -msgid "The source cluster contains prepared transactions\n" -msgstr "L'instance source contient des transactions préparées\n" +msgid "The source cluster contains prepared transactions" +msgstr "L'instance source contient des transactions préparées" -#: check.c:798 +#: check.c:1187 #, c-format -msgid "The target cluster contains prepared transactions\n" -msgstr "L'instance cible contient des transactions préparées\n" +msgid "The target cluster contains prepared transactions" +msgstr "L'instance cible contient des transactions préparées" -#: check.c:824 +#: check.c:1212 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Vérification de contrib/isn avec une différence sur le passage des bigint" -#: check.c:887 +#: check.c:1271 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -293,8 +490,7 @@ msgid "" "manually dump databases in the old cluster that use \"contrib/isn\"\n" "facilities, drop them, perform the upgrade, and then restore them. A\n" "list of the problem functions is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Votre installation contient les fonctions « contrib/isn » qui se basent sur le\n" "type de données bigint. Vos ancienne et nouvelle instances passent les valeurs\n" @@ -304,478 +500,502 @@ msgstr "" "relancer la mise à jour, puis les restaurer. Une liste des fonctions\n" "problématiques est disponible\n" "dans le fichier :\n" -" %s\n" -"\n" +" %s" -#: check.c:910 +#: check.c:1293 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Vérification des opérateurs postfixes définis par les utilisateurs" -#: check.c:989 +#: check.c:1368 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" "supported anymore. Consider dropping the postfix operators and replacing\n" "them with prefix operators or function calls.\n" "A list of user-defined postfix operators is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Votre installation contient des opérateurs postfixes définis par des utilisateurs,\n" "qui ne sont plus supportés. Supprimez les opérateurs postfixes et remplacez-les\n" "avec des opérateurs préfixes ou des appels de fonctions.\n" "Une liste des opérateurs postfixes définis par les utilisateurs se trouve dans le fichier :\n" -" %s\n" +" %s" + +#: check.c:1392 +#, c-format +msgid "Checking for incompatible polymorphic functions" +msgstr "Vérification des fonctions polymorphiques incompatibles" -#: check.c:1010 +#: check.c:1493 +#, c-format +msgid "" +"Your installation contains user-defined objects that refer to internal\n" +"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n" +"These user-defined objects must be dropped before upgrading and restored\n" +"afterwards, changing them to refer to the new corresponding functions with\n" +"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n" +"A list of the problematic objects is in the file:\n" +" %s" +msgstr "" +"Votre installation contient des objets définis par les utilisateurs qui font\n" +"référence à des fonctions polymorphiques internes avec des arguments de\n" +"type « anyarray » ou « anyelement ». Ces objets doivent être supprimés\n" +"avant de mettre à jour, puis ils pourront être restaurés, en les changeant\n" +"pour faire référence aux nouvelles fonctions correspondantes avec des\n" +"arguments de type « anycompatiblearray » et « anycompatible ». Une liste\n" +"des objets problématiques se trouve dans le fichier\n" +" %s" + +#: check.c:1517 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Vérification des tables WITH OIDS" -#: check.c:1066 +#: check.c:1569 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" "supported anymore. Consider removing the oid column using\n" " ALTER TABLE ... SET WITHOUT OIDS;\n" "A list of tables with the problem is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Votre installation contient des tables déclarées avec WITH OIDS, ce qui n'est plus supporté.\n" "Pensez à supprimer la colonne oid en utilisant\n" " ALTER TABLE ... SET WITHOUT OIDS;\n" "Une liste des tables ayant ce problème se trouve dans le fichier :\n" -" %s\n" +" %s" -#: check.c:1094 +#: check.c:1596 #, c-format -msgid "Checking for system-defined composite types in user tables" -msgstr "Vérification des types composites définis par le système dans les tables utilisateurs" +msgid "Checking for roles starting with \"pg_\"" +msgstr "Vérification des rôles commençant avec « pg_ »" -#: check.c:1123 +#: check.c:1627 #, c-format msgid "" -"Your installation contains system-defined composite type(s) in user tables.\n" -"These type OIDs are not stable across PostgreSQL versions,\n" -"so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" +"Your installation contains roles starting with \"pg_\".\n" +"\"pg_\" is a reserved prefix for system roles. The cluster\n" +"cannot be upgraded until these roles are renamed.\n" +"A list of roles starting with \"pg_\" is in the file:\n" +" %s" msgstr "" -"Votre installation contient des types composites définis par le système dans vos tables\n" -"utilisateurs. Les OID de ces types ne sont pas stables entre différentes versions majeures\n" -"de PostgreSQL, donc cette instance ne peut pas être mise à jour actuellement. Vous pouvez\n" -"supprimer les colonnes problématiques, puis relancer la mise à jour. Vous trouverez\n" -"une liste des colonnes problématiques dans le fichier :\n" -" %s\n" -"\n" +"Votre installation contient des rôles commençant par « pg_ ».\n" +"\"pg_\" est un préfixe réservé aux rôles systèmes. L'instance\n" +"ne peut pas être mise à jour tant que ces rôles ne sont pas renommés.\n" +"Une liste des rôles commençant par « pg_ » se trouve dans le fichier :\n" +" %s" -#: check.c:1151 +#: check.c:1647 #, c-format -msgid "Checking for reg* data types in user tables" -msgstr "Vérification des types de données reg* dans les tables utilisateurs" +msgid "Checking for user-defined encoding conversions" +msgstr "Vérification des conversions d'encodage définies par les utilisateurs" -#: check.c:1182 +#: check.c:1707 #, c-format msgid "" -"Your installation contains one of the reg* data types in user tables.\n" -"These data types reference system OIDs that are not preserved by\n" -"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" +"Your installation contains user-defined encoding conversions.\n" +"The conversion function parameters changed in PostgreSQL version 14\n" +"so this cluster cannot currently be upgraded. You can remove the\n" +"encoding conversions in the old cluster and restart the upgrade.\n" +"A list of user-defined encoding conversions is in the file:\n" +" %s" msgstr "" -"Votre installation contient un des types de données reg* dans vos tables\n" -"utilisateurs. Ces types de données référencent des OID système qui ne sont\n" -"pas préservés par pg_upgrade, donc cette instance ne peut pas être mise à\n" -"jour actuellement. Vous pouvez supprimer les colonnes problématiques et relancer\n" -"la mise à jour. Une liste des colonnes problématiques est disponible dans le\n" -"fichier :\n" -" %s\n" -"\n" +"Votre installation contient des conversions définies par un utilisateur.\n" +"Les paramètres des fonctions de conversion ont changé dans PostgreSQL version 14\n" +"donc cette instance ne peut pas être mise à jour actuellement. Vous devez supprimer\n" +"les conversions d'encodage de l'ancienne instance puis relancer la mise à jour.\n" +"Une liste des conversions d'encodage définies par l'utilisateur se trouve dans le fichier :\n" +" %s" -#: check.c:1204 +#: check.c:1746 #, c-format -msgid "Checking for incompatible \"jsonb\" data type" -msgstr "Vérification des types de données « jsonb » incompatibles" +msgid "Checking for new cluster logical replication slots" +msgstr "Vérification des slots de réplication logique de la nouvelle instance" -#: check.c:1211 +#: check.c:1754 #, c-format -msgid "" -"Your installation contains the \"jsonb\" data type in user tables.\n" -"The internal format of \"jsonb\" changed during 9.4 beta so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Votre installation contient un type de données « jsonb » dans vos tables utilisateurs.\n" -"Le format interne de « jsonb » a changé lors du développement de la version 9.4 beta, donc\n" -"cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer les\n" -"colonnes problématiques et relancer la mise à jour. Une liste des colonnes problématiques\n" -"est disponible dans le fichier :\n" -" %s\n" -"\n" +msgid "could not count the number of logical replication slots" +msgstr "n'a pas pu compter le nombre de slots de réplication logique" -#: check.c:1233 +#: check.c:1759 #, c-format -msgid "Checking for roles starting with \"pg_\"" -msgstr "Vérification des rôles commençant avec « pg_ »" +msgid "expected 0 logical replication slots but found %d" +msgstr "attendait 0 slot de réplication logique mais en a trouvé %d" -#: check.c:1243 +#: check.c:1769 check.c:1820 #, c-format -msgid "The source cluster contains roles starting with \"pg_\"\n" -msgstr "L'instance source contient des rôles commençant avec « pg_ »\n" +msgid "could not determine parameter settings on new cluster" +msgstr "n'a pas pu déterminer la configuration sur la nouvelle instance" -#: check.c:1245 +#: check.c:1774 #, c-format -msgid "The target cluster contains roles starting with \"pg_\"\n" -msgstr "L'instance cible contient des rôles commençant avec « pg_ »\n" +msgid "\"wal_level\" must be \"logical\" but is set to \"%s\"" +msgstr "« wal_level » doit être configuré à « logical » mais est configuré à « %s »" -#: check.c:1266 +#: check.c:1780 #, c-format -msgid "Checking for user-defined encoding conversions" -msgstr "Vérification des conversions d'encodage définies par les utilisateurs" +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of logical replication slots (%d) on the old cluster" +msgstr "« max_replication_slots » (%d) doit être supérieur ou égal au nombre de slots de réplication logique (%d) sur l'ancienne instance" -#: check.c:1330 +#: check.c:1812 #, c-format -msgid "" -"Your installation contains user-defined encoding conversions.\n" -"The conversion function parameters changed in PostgreSQL version 14\n" -"so this cluster cannot currently be upgraded. You can remove the\n" -"encoding conversions in the old cluster and restart the upgrade.\n" -"A list of user-defined encoding conversions is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Votre installation contient des conversions définies par un utilisateur.\n" -"Les paramètres des fonctions de conversion ont changé dans PostgreSQL version 14\n" -"donc cette instance ne peut pas être mise à jour actuellement. Vous devez supprimer\n" -"les conversions d'encodage de l'ancienne instance puis relancer la mise à jour.\n" -"Une liste des conversions d'encodage définies par l'utilisateur se trouve dans le fichier :\n" -" %s\n" -"\n" +msgid "Checking for new cluster configuration for subscriptions" +msgstr "Vérification de la configuration de la nouvelle instance pour les souscriptions" + +#: check.c:1824 +#, c-format +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of subscriptions (%d) on the old cluster" +msgstr "« max_replication_slots » (%d) doit être supérieur ou égal au nombre de souscriptions (%d) sur l'ancienne instance" -#: check.c:1357 +#: check.c:1846 #, c-format -msgid "failed to get the current locale\n" -msgstr "a échoué pour obtenir la locale courante\n" +msgid "Checking for valid logical replication slots" +msgstr "Vérification des slots de réplication logique valides" -#: check.c:1366 +#: check.c:1898 #, c-format -msgid "failed to get system locale name for \"%s\"\n" -msgstr "a échoué pour obtenir le nom de la locale système « %s »\n" +msgid "" +"Your installation contains logical replication slots that cannot be upgraded.\n" +"You can remove invalid slots and/or consume the pending WAL for other slots,\n" +"and then restart the upgrade.\n" +"A list of the problematic slots is in the file:\n" +" %s" +msgstr "" +"Votre installation contient des slots de réplication logique qui ne peuvent pas\n" +"être mis à jour. Vous pouvez supprimer les slots invalides et/ou consommer le\n" +"WAL en attente pour les autres slots, puis relancer la mise à jour. Vous trouverez\n" +"une liste des slots problématiques dans le fichier :\n" +" %s" -#: check.c:1372 +#: check.c:1922 #, c-format -msgid "failed to restore old locale \"%s\"\n" -msgstr "a échoué pour restaurer l'ancienne locale « %s »\n" +msgid "Checking for subscription state" +msgstr "Vérification de l'état de souscription" -#: controldata.c:128 controldata.c:196 +#: check.c:2023 #, c-format -msgid "could not get control data using %s: %s\n" +msgid "" +"Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n" +"You can allow the initial sync to finish for all relations and then restart the upgrade.\n" +"A list of the problematic subscriptions is in the file:\n" +" %s" msgstr "" -"n'a pas pu obtenir les données de contrôle en utilisant %s : %s\n" -"\n" +"Votre installation contient des souscriptions sans origine ou ont des relations qui\n" +"ne sont ni dans l'état « initialize » ni dans l'état « ready ». Vous pouvez permettre la\n" +"réalisation de la synchronisation initiale pour toutes les relations, puis relancer la\n" +"mise à jour. Vous trouverez une liste des souscriptions problématiques dans le fichier :\n" +" %s" -#: controldata.c:139 +#: controldata.c:129 controldata.c:199 #, c-format -msgid "%d: database cluster state problem\n" -msgstr "%d : problème sur l'état de l'instance de la base de données\n" +msgid "could not get control data using %s: %m" +msgstr "n'a pas pu obtenir les données de contrôle en utilisant %s : %m" -#: controldata.c:157 +#: controldata.c:139 #, c-format -msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" -msgstr "L'instance source a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire.\n" +msgid "%d: database cluster state problem" +msgstr "%d : problème sur l'état de l'instance de la base de données" -#: controldata.c:159 +#: controldata.c:158 #, c-format -msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" -msgstr "L'instance cible a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire.\n" +msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary." +msgstr "L'instance source a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire." -#: controldata.c:164 +#: controldata.c:160 #, c-format -msgid "The source cluster was not shut down cleanly.\n" -msgstr "L'instance source n'a pas été arrêtée proprement.\n" +msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary." +msgstr "L'instance cible a été arrêté alors qu'elle était en mode restauration. Pour mettre à jour, utilisez « rsync » comme documenté ou arrêtez-la en tant que serveur primaire." -#: controldata.c:166 +#: controldata.c:165 #, c-format -msgid "The target cluster was not shut down cleanly.\n" -msgstr "L'instance cible n'a pas été arrêtée proprement.\n" +msgid "The source cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "L'instance source n'a pas été arrêtée proprement, état reporté comme : « %s »" -#: controldata.c:177 +#: controldata.c:167 #, c-format -msgid "The source cluster lacks cluster state information:\n" -msgstr "Il manque certaines informations d'état requises sur l'instance source :\n" +msgid "The target cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "L'instance cible n'a pas été arrêtée proprement, état reporté comme : « %s »" -#: controldata.c:179 +#: controldata.c:175 controldata.c:507 #, c-format -msgid "The target cluster lacks cluster state information:\n" -msgstr "Il manque certaines informations d'état requises sur l'instance cible :\n" +msgid "could not get control data using %s: %s" +msgstr "n'a pas pu obtenir les données de contrôle en utilisant %s : %s" -#: controldata.c:209 dump.c:50 pg_upgrade.c:402 pg_upgrade.c:439 -#: relfilenode.c:231 server.c:34 +#: controldata.c:181 #, c-format -msgid "%s" -msgstr "%s" +msgid "The source cluster lacks cluster state information:" +msgstr "Il manque certaines informations d'état requises sur l'instance source :" -#: controldata.c:216 +#: controldata.c:183 #, c-format -msgid "%d: pg_resetwal problem\n" -msgstr "%d : problème avec pg_resetwal\n" +msgid "The target cluster lacks cluster state information:" +msgstr "Il manque certaines informations d'état requises sur l'instance cible :" -#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258 -#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310 -#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354 -#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383 -#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427 -#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471 -#: controldata.c:482 controldata.c:493 +#: controldata.c:213 dump.c:50 exec.c:118 pg_upgrade.c:556 pg_upgrade.c:596 +#: pg_upgrade.c:945 relfilenumber.c:233 server.c:34 util.c:337 #, c-format -msgid "%d: controldata retrieval problem\n" -msgstr "%d : problème de récupération des controldata\n" +msgid "%s" +msgstr "%s" -#: controldata.c:572 +#: controldata.c:220 #, c-format -msgid "The source cluster lacks some required control information:\n" -msgstr "Il manque certaines informations de contrôle requises sur l'instance source :\n" +msgid "%d: pg_resetwal problem" +msgstr "%d : problème avec pg_resetwal" -#: controldata.c:575 +#: controldata.c:230 controldata.c:240 controldata.c:251 controldata.c:262 +#: controldata.c:273 controldata.c:292 controldata.c:303 controldata.c:314 +#: controldata.c:325 controldata.c:336 controldata.c:347 controldata.c:358 +#: controldata.c:361 controldata.c:365 controldata.c:375 controldata.c:387 +#: controldata.c:398 controldata.c:409 controldata.c:420 controldata.c:431 +#: controldata.c:442 controldata.c:453 controldata.c:464 controldata.c:475 +#: controldata.c:486 controldata.c:497 #, c-format -msgid "The target cluster lacks some required control information:\n" -msgstr "Il manque certaines informations de contrôle requises sur l'instance cible :\n" +msgid "%d: controldata retrieval problem" +msgstr "%d : problème de récupération des controldata" #: controldata.c:578 #, c-format -msgid " checkpoint next XID\n" -msgstr " XID du prochain checkpoint\n" +msgid "The source cluster lacks some required control information:" +msgstr "Il manque certaines informations de contrôle requises sur l'instance source :" #: controldata.c:581 #, c-format -msgid " latest checkpoint next OID\n" -msgstr " prochain OID du dernier checkpoint\n" +msgid "The target cluster lacks some required control information:" +msgstr "Il manque certaines informations de contrôle requises sur l'instance cible :" #: controldata.c:584 #, c-format -msgid " latest checkpoint next MultiXactId\n" -msgstr " prochain MultiXactId du dernier checkpoint\n" +msgid " checkpoint next XID" +msgstr " XID du prochain checkpoint" -#: controldata.c:588 +#: controldata.c:587 #, c-format -msgid " latest checkpoint oldest MultiXactId\n" -msgstr " plus ancien MultiXactId du dernier checkpoint\n" +msgid " latest checkpoint next OID" +msgstr " prochain OID du dernier checkpoint" -#: controldata.c:591 +#: controldata.c:590 #, c-format -msgid " latest checkpoint oldestXID\n" -msgstr " oldestXID du dernier checkpoint\n" +msgid " latest checkpoint next MultiXactId" +msgstr " prochain MultiXactId du dernier checkpoint" #: controldata.c:594 #, c-format -msgid " latest checkpoint next MultiXactOffset\n" -msgstr " prochain MultiXactOffset du dernier checkpoint\n" +msgid " latest checkpoint oldest MultiXactId" +msgstr " plus ancien MultiXactId du dernier checkpoint" #: controldata.c:597 #, c-format -msgid " first WAL segment after reset\n" -msgstr " premier segment WAL après réinitialisation\n" +msgid " latest checkpoint oldestXID" +msgstr " oldestXID du dernier checkpoint" #: controldata.c:600 #, c-format -msgid " float8 argument passing method\n" -msgstr " méthode de passage de arguments float8\n" +msgid " latest checkpoint next MultiXactOffset" +msgstr " prochain MultiXactOffset du dernier checkpoint" #: controldata.c:603 #, c-format -msgid " maximum alignment\n" -msgstr " alignement maximale\n" +msgid " first WAL segment after reset" +msgstr " premier segment WAL après réinitialisation" #: controldata.c:606 #, c-format -msgid " block size\n" -msgstr " taille de bloc\n" +msgid " float8 argument passing method" +msgstr " méthode de passage de arguments float8" #: controldata.c:609 #, c-format -msgid " large relation segment size\n" -msgstr " taille de segment des relations\n" +msgid " maximum alignment" +msgstr " alignement maximale" #: controldata.c:612 #, c-format -msgid " WAL block size\n" -msgstr " taille de bloc d'un WAL\n" +msgid " block size" +msgstr " taille de bloc" #: controldata.c:615 #, c-format -msgid " WAL segment size\n" -msgstr " taille d'un segment WAL\n" +msgid " large relation segment size" +msgstr " taille de segment des relations" #: controldata.c:618 #, c-format -msgid " maximum identifier length\n" -msgstr " longueur maximum d'un identifiant\n" +msgid " WAL block size" +msgstr " taille de bloc d'un WAL" #: controldata.c:621 #, c-format -msgid " maximum number of indexed columns\n" -msgstr " nombre maximum de colonnes indexées\n" +msgid " WAL segment size" +msgstr " taille d'un segment WAL" #: controldata.c:624 #, c-format -msgid " maximum TOAST chunk size\n" -msgstr " taille maximale d'un morceau de TOAST\n" +msgid " maximum identifier length" +msgstr " longueur maximum d'un identifiant" -#: controldata.c:628 +#: controldata.c:627 #, c-format -msgid " large-object chunk size\n" -msgstr " taille d'un morceau Large-Object\n" +msgid " maximum number of indexed columns" +msgstr " nombre maximum de colonnes indexées" -#: controldata.c:631 +#: controldata.c:630 #, c-format -msgid " dates/times are integers?\n" -msgstr " les dates/heures sont-ils des integers?\n" +msgid " maximum TOAST chunk size" +msgstr " taille maximale d'un morceau de TOAST" -#: controldata.c:635 +#: controldata.c:634 #, c-format -msgid " data checksum version\n" -msgstr " version des sommes de contrôle des données\n" +msgid " large-object chunk size" +msgstr " taille d'un morceau Large-Object" #: controldata.c:637 #, c-format -msgid "Cannot continue without required control information, terminating\n" -msgstr "Ne peut pas continuer sans les informations de contrôle requises, en arrêt\n" +msgid " dates/times are integers?" +msgstr " les dates/heures sont-ils des integers?" -#: controldata.c:652 +#: controldata.c:641 #, c-format -msgid "" -"old and new pg_controldata alignments are invalid or do not match\n" -"Likely one cluster is a 32-bit install, the other 64-bit\n" -msgstr "" -"les alignements sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" -"Il est probable qu'une installation soit en 32 bits et l'autre en 64 bits.\n" +msgid " data checksum version" +msgstr " version des sommes de contrôle des données" -#: controldata.c:656 +#: controldata.c:643 #, c-format -msgid "old and new pg_controldata block sizes are invalid or do not match\n" -msgstr "les tailles de bloc sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" +msgid "Cannot continue without required control information, terminating" +msgstr "Ne peut pas continuer sans les informations de contrôle requises, en arrêt" -#: controldata.c:659 +#: controldata.c:658 #, c-format -msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n" -msgstr "les tailles maximales de segment de relation sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" +msgid "" +"old and new pg_controldata alignments are invalid or do not match.\n" +"Likely one cluster is a 32-bit install, the other 64-bit" +msgstr "" +"les alignements sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" +"Il est probable qu'une installation soit en 32 bits et l'autre en 64 bits." #: controldata.c:662 #, c-format -msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n" -msgstr "les tailles de bloc des WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" +msgid "old and new pg_controldata block sizes are invalid or do not match" +msgstr "les tailles de bloc sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata." #: controldata.c:665 #, c-format -msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n" -msgstr "les tailles de segment de WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" +msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match" +msgstr "les tailles maximales de segment de relation sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata." #: controldata.c:668 #, c-format -msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n" -msgstr "les longueurs maximales des identifiants sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" +msgid "old and new pg_controldata WAL block sizes are invalid or do not match" +msgstr "les tailles de bloc des WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata." #: controldata.c:671 #, c-format -msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n" -msgstr "les nombres maximums de colonnes indexées sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" +msgid "old and new pg_controldata WAL segment sizes are invalid or do not match" +msgstr "les tailles de segment de WAL sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata." #: controldata.c:674 #, c-format -msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n" -msgstr "les tailles maximales de morceaux des TOAST sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" +msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match" +msgstr "les longueurs maximales des identifiants sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata." + +#: controldata.c:677 +#, c-format +msgid "old and new pg_controldata maximum indexed columns are invalid or do not match" +msgstr "les nombres maximums de colonnes indexées sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata." + +#: controldata.c:680 +#, c-format +msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match" +msgstr "les tailles maximales de morceaux des TOAST sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata." -#: controldata.c:679 +#: controldata.c:685 #, c-format -msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n" -msgstr "les tailles des morceaux de Large Objects sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" +msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match" +msgstr "les tailles des morceaux de Large Objects sont invalides ou ne correspondent pas entre l'ancien et le nouveau pg_controldata." -#: controldata.c:682 +#: controldata.c:688 #, c-format -msgid "old and new pg_controldata date/time storage types do not match\n" -msgstr "les types de stockage date/heure ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" +msgid "old and new pg_controldata date/time storage types do not match" +msgstr "les types de stockage date/heure ne correspondent pas entre l'ancien et le nouveau pg_controldata." -#: controldata.c:695 +#: controldata.c:701 #, c-format -msgid "old cluster does not use data checksums but the new one does\n" -msgstr "l'ancienne instance n'utilise pas les sommes de contrôle alors que la nouvelle les utilise\n" +msgid "old cluster does not use data checksums but the new one does" +msgstr "l'ancienne instance n'utilise pas les sommes de contrôle alors que la nouvelle les utilise" -#: controldata.c:698 +#: controldata.c:704 #, c-format -msgid "old cluster uses data checksums but the new one does not\n" -msgstr "l'ancienne instance utilise les sommes de contrôle alors que la nouvelle ne les utilise pas\n" +msgid "old cluster uses data checksums but the new one does not" +msgstr "l'ancienne instance utilise les sommes de contrôle alors que la nouvelle ne les utilise pas" -#: controldata.c:700 +#: controldata.c:706 #, c-format -msgid "old and new cluster pg_controldata checksum versions do not match\n" -msgstr "les versions des sommes de contrôle ne correspondent pas entre l'ancien et le nouveau pg_controldata.\n" +msgid "old and new cluster pg_controldata checksum versions do not match" +msgstr "les versions des sommes de contrôle ne correspondent pas entre l'ancien et le nouveau pg_controldata." -#: controldata.c:711 +#: controldata.c:717 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "Ajout du suffixe « .old » à l'ancien global/pg_control" -#: controldata.c:716 +#: controldata.c:722 #, c-format -msgid "Unable to rename %s to %s.\n" -msgstr "Incapable de renommer %s à %s.\n" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" -#: controldata.c:719 +#: controldata.c:726 #, c-format msgid "" "\n" "If you want to start the old cluster, you will need to remove\n" "the \".old\" suffix from %s/global/pg_control.old.\n" "Because \"link\" mode was used, the old cluster cannot be safely\n" -"started once the new cluster has been started.\n" -"\n" +"started once the new cluster has been started." msgstr "" "\n" -"Si vous voulez démarrer l'ancienne instance, vous devez supprimer le suffixe « .old » du fichier %s/global/pg_control.old.\n" -"\n" -"Comme le mode lien était utilisé, l'ancienne instance ne peut pas être démarré proprement une fois que la nouvelle instance a été démarrée.\n" +"Si vous voulez démarrer l'ancienne instance, vous devez supprimer\n" +"le suffixe « .old » du fichier %s/global/pg_control.old.\n" "\n" +"Comme le mode lien était utilisé, l'ancienne instance ne peut pas\n" +"être démarré proprement une fois que la nouvelle instance a été démarrée." #: dump.c:20 #, c-format msgid "Creating dump of global objects" msgstr "Création de la sauvegarde des objets globaux" -#: exec.c:45 +#: dump.c:32 +#, c-format +msgid "Creating dump of database schemas" +msgstr "Création de la sauvegarde des schémas des bases" + +#: exec.c:47 #, c-format -msgid "could not get pg_ctl version data using %s: %s\n" -msgstr "n'a pas pu obtenir la version de pg_ctl en utilisant %s : %s\n" +msgid "could not get pg_ctl version data using %s: %m" +msgstr "n'a pas pu obtenir la version de pg_ctl en utilisant %s : %m" #: exec.c:51 #, c-format -msgid "could not get pg_ctl version output from %s\n" -msgstr "n'a pas pu obtenir la version de pg_ctl à partir de %s\n" +msgid "could not get pg_ctl version data using %s: %s" +msgstr "n'a pas pu obtenir la version de pg_ctl en utilisant %s : %s" -#: exec.c:108 exec.c:112 +#: exec.c:55 #, c-format -msgid "command too long\n" -msgstr "commande trop longue\n" +msgid "could not get pg_ctl version output from %s" +msgstr "n'a pas pu obtenir la version de pg_ctl à partir de %s" -#: exec.c:114 util.c:37 util.c:264 +#: exec.c:112 exec.c:116 #, c-format -msgid "%s\n" -msgstr "%s\n" +msgid "command too long" +msgstr "commande trop longue" -#: exec.c:153 pg_upgrade.c:242 +#: exec.c:160 pg_upgrade.c:311 #, c-format -msgid "could not open log file \"%s\": %m\n" -msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m\n" +msgid "could not open log file \"%s\": %m" +msgstr "n'a pas pu ouvrir le journal applicatif « %s » : %m" -#: exec.c:182 +#: exec.c:192 #, c-format msgid "" "\n" @@ -784,321 +1004,343 @@ msgstr "" "\n" "*échec*" -#: exec.c:185 +#: exec.c:195 #, c-format -msgid "There were problems executing \"%s\"\n" -msgstr "Il y a eu des problèmes lors de l'exécution de « %s »\n" +msgid "There were problems executing \"%s\"" +msgstr "Il y a eu des problèmes lors de l'exécution de « %s »" -#: exec.c:188 +#: exec.c:198 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" -"the probable cause of the failure.\n" -msgstr "Consultez les dernières lignes de « %s » ou « %s » pour trouver la cause probable de l'échec.\n" +"the probable cause of the failure." +msgstr "" +"Consultez les dernières lignes de « %s » ou « %s » pour\n" +"trouver la cause probable de l'échec." -#: exec.c:193 +#: exec.c:203 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" -"the probable cause of the failure.\n" -msgstr "Consultez les dernières lignes de « %s » pour trouver la cause probable de l'échec.\n" +"the probable cause of the failure." +msgstr "" +"Consultez les dernières lignes de « %s » pour\n" +"trouver la cause probable de l'échec." -#: exec.c:208 pg_upgrade.c:250 +#: exec.c:218 pg_upgrade.c:321 #, c-format -msgid "could not write to log file \"%s\": %m\n" -msgstr "n'a pas pu écrire dans le fichier de traces « %s »\n" +msgid "could not write to log file \"%s\": %m" +msgstr "n'a pas pu écrire dans le fichier de traces « %s »" -#: exec.c:234 +#: exec.c:244 #, c-format -msgid "could not open file \"%s\" for reading: %s\n" -msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %s\n" +msgid "could not open file \"%s\" for reading: %m" +msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" -#: exec.c:261 +#: exec.c:270 #, c-format -msgid "You must have read and write access in the current directory.\n" -msgstr "Vous devez avoir les droits de lecture et d'écriture dans le répertoire actuel.\n" +msgid "You must have read and write access in the current directory." +msgstr "Vous devez avoir les droits de lecture et d'écriture dans le répertoire actuel." -#: exec.c:314 exec.c:380 +#: exec.c:323 exec.c:389 exec.c:439 #, c-format -msgid "check for \"%s\" failed: %s\n" -msgstr "échec de la vérification de « %s » : %s\n" +msgid "check for \"%s\" failed: %m" +msgstr "échec de la vérification de « %s » : %m" -#: exec.c:317 exec.c:383 +#: exec.c:326 exec.c:392 #, c-format -msgid "\"%s\" is not a directory\n" -msgstr "« %s » n'est pas un répertoire\n" +msgid "\"%s\" is not a directory" +msgstr "« %s » n'est pas un répertoire" -#: exec.c:433 +#: exec.c:444 #, c-format -msgid "check for \"%s\" failed: not a regular file\n" -msgstr "échec de la vérification de « %s » : pas un fichier régulier\n" +msgid "check for \"%s\" failed: cannot execute" +msgstr "échec de la vérification de « %s » : ne peut pas exécuter" -#: exec.c:436 +#: exec.c:454 #, c-format -msgid "check for \"%s\" failed: cannot execute (permission denied)\n" -msgstr "échec de la vérification de « %s » : ne peut pas exécuter (droit refusé)\n" +msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"" +msgstr "échec de la vérification de « %s » : version incorrecte : « %s » trouvée, « %s » attendue" -#: exec.c:442 +#: file.c:44 #, c-format -msgid "check for \"%s\" failed: cannot execute\n" -msgstr "échec de la vérification de « %s » : ne peut pas exécuter\n" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "erreur lors du clonage de la relation « %s.%s » (« %s » à « %s ») : %m" -#: exec.c:452 +#: file.c:51 #, c-format -msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n" -msgstr "" -"échec de la vérification de « %s » : version incorrect : « %s » trouvée, « %s » attendue\n" -"\n" +msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "erreur lors du clonage de la relation « %s.%s » : n'a pas pu ouvrir le fichier « %s » : %m" -#: file.c:43 file.c:61 +#: file.c:56 #, c-format -msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "erreur lors du clonage de la relation « %s.%s » (« %s » à « %s ») : %s\n" +msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "erreur lors du clonage de la relation « %s.%s » : n'a pas pu créer le fichier « %s » : %m" -#: file.c:50 +#: file.c:65 #, c-format -msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n" -msgstr "erreur lors du clonage de la relation « %s.%s » : n'a pas pu ouvrir le fichier « %s » : %s\n" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s" +msgstr "erreur lors du clonage de la relation « %s.%s » (« %s » à « %s ») : %s" -#: file.c:55 +#: file.c:91 file.c:160 file.c:233 #, c-format -msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n" -msgstr "erreur lors du clonage de la relation « %s.%s » : n'a pas pu créer le fichier « %s » : %s\n" +msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu ouvrir le fichier « %s » : %m" -#: file.c:87 file.c:190 +#: file.c:96 file.c:165 file.c:242 #, c-format -msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n" -msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu ouvrir le fichier « %s » : %s\n" +msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu créer le fichier « %s » : %m" -#: file.c:92 file.c:199 +#: file.c:110 file.c:266 #, c-format -msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n" -msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu créer le fichier « %s » : %s\n" +msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %m" +msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu lire le fichier « %s » : %m" -#: file.c:106 file.c:223 +#: file.c:122 file.c:344 #, c-format -msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n" -msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu lire le fichier « %s » : %s\n" +msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %m" +msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu écrire le fichier « %s » : %m" -#: file.c:118 file.c:301 +#: file.c:136 #, c-format -msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n" -msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu écrire le fichier « %s » : %s\n" +msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "erreur lors de la copie de la relation « %s.%s » (« %s » à « %s ») : %m" -#: file.c:132 +#: file.c:172 #, c-format -msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "erreur lors de la copie de la relation « %s.%s » (« %s » à « %s ») : %s\n" +msgid "error while copying relation \"%s.%s\": could not copy file range from \"%s\" to \"%s\": %m" +msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu exécuter copy_file_range du fichier « %s » au fichier « %s » : %m" -#: file.c:151 +#: file.c:194 #, c-format -msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "erreur lors de la création du lien pour la relation « %s.%s » (« %s » à « %s ») : %s\n" +msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "erreur lors de la création du lien pour la relation « %s.%s » (« %s » à « %s ») : %m" -#: file.c:194 +#: file.c:237 +#, c-format +msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %m" +msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu tester le fichier « %s » : %m" + +#: file.c:269 +#, c-format +msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"" +msgstr "erreur lors de la copie de la relation « %s.%s » : page partielle trouvée dans le fichier « %s »" + +#: file.c:371 file.c:387 #, c-format -msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n" -msgstr "erreur lors de la copie de la relation « %s.%s » : n'a pas pu tester le fichier « %s » : %s\n" +msgid "could not clone file between old and new data directories: %m" +msgstr "n'a pas pu cloner le fichier entre l'ancien et le nouveau répertoires de données : %m" -#: file.c:226 +#: file.c:383 file.c:420 #, c-format -msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n" -msgstr "erreur lors de la copie de la relation « %s.%s » : page partielle trouvée dans le fichier « %s »\n" +msgid "could not create file \"%s\": %m" +msgstr "n'a pas pu créer le fichier « %s » : %m" -#: file.c:328 file.c:345 +#: file.c:393 #, c-format -msgid "could not clone file between old and new data directories: %s\n" -msgstr "n'a pas pu cloner le fichier entre l'ancien et le nouveau répertoires : %s\n" +msgid "file cloning not supported on this platform" +msgstr "clonage de fichiers non supporté sur cette plateforme" -#: file.c:341 +#: file.c:424 #, c-format -msgid "could not create file \"%s\": %s\n" -msgstr "n'a pas pu créer le fichier « %s » : %s\n" +msgid "could not copy file range between old and new data directories: %m" +msgstr "n'a pas pu exécuter copy_file_range entre l'ancien et le nouveau répertoires de données : %m" -#: file.c:352 +#: file.c:430 #, c-format -msgid "file cloning not supported on this platform\n" -msgstr "clonage de fichiers non supporté sur cette plateforme\n" +msgid "copy_file_range not supported on this platform" +msgstr "copy_file_range non supporté sur cette plateforme" -#: file.c:369 +#: file.c:447 #, c-format msgid "" -"could not create hard link between old and new data directories: %s\n" -"In link mode the old and new data directories must be on the same file system.\n" +"could not create hard link between old and new data directories: %m\n" +"In link mode the old and new data directories must be on the same file system." msgstr "" -"n'a pas pu créer le lien physique entre l'ancien et le nouveau répertoires de données : %s\n" -"Dans le mode lien, les ancien et nouveau répertoires de données doivent être sur le même système de fichiers.\n" +"n'a pas pu créer le lien physique entre l'ancien et le nouveau répertoires de données : %m\n" +"Dans le mode lien, les ancien et nouveau répertoires de données doivent être sur le même système de fichiers." -#: function.c:129 +#: function.c:154 #, c-format msgid "Checking for presence of required libraries" msgstr "Vérification de la présence des bibliothèques requises" -#: function.c:167 +#: function.c:190 #, c-format msgid "could not load library \"%s\": %s" msgstr "n'a pas pu charger la bibliothèque « %s » : %s" -#: function.c:178 +#: function.c:201 #, c-format msgid "In database: %s\n" msgstr "Dans la base de données : %s\n" -#: function.c:188 +#: function.c:211 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" "new installation. You can add these libraries to the new installation,\n" "or remove the functions using them from the old installation. A list of\n" "problem libraries is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Votre installation référence des bibliothèques chargeables, mais manquantes sur\n" "la nouvelle installation. Vous pouvez ajouter ces bibliothèques à la nouvelle\n" "installation ou supprimer les fonctions les utilisant dans l'ancienne installation.\n" -"Une liste des biblioth_ques problématiques est disponible dans le fichier :\n" -" %s\n" -"\n" +"Une liste des bibliothèques problématiques est disponible dans le fichier :\n" +" %s" -#: info.c:125 +#: info.c:128 #, c-format -msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n" -msgstr "Les noms de relation pour l'OID %u dans la base de données « %s » ne correspondent pas : ancien nom « %s.%s », nouveau nom « %s.%s »\n" +msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"" +msgstr "Les noms de relation pour l'OID %u dans la base de données « %s » ne correspondent pas : ancien nom « %s.%s », nouveau nom « %s.%s »" -#: info.c:145 +#: info.c:148 #, c-format -msgid "Failed to match up old and new tables in database \"%s\"\n" -msgstr "Échec de correspondance des anciennes et nouvelles tables dans la base de données « %s »\n" +msgid "Failed to match up old and new tables in database \"%s\"" +msgstr "Échec de correspondance des anciennes et nouvelles tables dans la base de données « %s »" -#: info.c:226 +#: info.c:229 #, c-format msgid " which is an index on \"%s.%s\"" msgstr " qui est un index sur \"%s.%s\"" -#: info.c:236 +#: info.c:239 #, c-format msgid " which is an index on OID %u" msgstr " qui est un index sur l'OID %u" -#: info.c:248 +#: info.c:251 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr " qui est la table TOAST pour « %s.%s »" -#: info.c:256 +#: info.c:259 #, c-format msgid " which is the TOAST table for OID %u" msgstr " qui est la table TOAST pour l'OID %u" -#: info.c:260 +#: info.c:263 #, c-format -msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n" -msgstr "Aucune correspondance trouvée dans l'ancienne instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s\n" +msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s" +msgstr "Aucune correspondance trouvée dans l'ancienne instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s" -#: info.c:263 +#: info.c:266 #, c-format -msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n" -msgstr "Aucune correspondance trouvée dans la nouvelle instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s\n" +msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s" +msgstr "Aucune correspondance trouvée dans la nouvelle instance pour la nouvelle relation d'OID %u dans la base de données « %s » : %s" -#: info.c:287 +#: info.c:300 #, c-format msgid "" "\n" -"source databases:\n" +"source databases:" msgstr "" "\n" -"bases de données sources :\n" +"bases de données sources :" -#: info.c:289 +#: info.c:302 #, c-format msgid "" "\n" -"target databases:\n" +"target databases:" msgstr "" "\n" -"bases de données cibles :\n" +"bases de données cibles :" -#: info.c:605 +# /* SQL2003 mandates this error if there was no ELSE clause */ +# if (!stmt->have_else) +# ereport(ERROR, +# (errcode(ERRCODE_CASE_NOT_FOUND), +# errmsg("case not found"), +# errhint("CASE statement is missing ELSE part."))); +#: info.c:346 #, c-format -msgid "Database: %s\n" -msgstr "Base de données : %s\n" +msgid "template0 not found" +msgstr "template0 introuvable" -#: info.c:607 +#: info.c:805 #, c-format -msgid "" -"\n" -"\n" -msgstr "" -"\n" -"\n" +msgid "Database: \"%s\"" +msgstr "Base de données : « %s »" -#: info.c:618 +#: info.c:818 #, c-format -msgid "relname: %s.%s: reloid: %u reltblspace: %s\n" -msgstr "relname : %s.%s : reloid : %u reltblspace : %s\n" +msgid "relname: \"%s.%s\", reloid: %u, reltblspace: \"%s\"" +msgstr "relname : « %s.%s », reloid : %u, reltblspace : « %s »" -#: option.c:100 +#: info.c:832 #, c-format -msgid "%s: cannot be run as root\n" -msgstr "%s : ne peut pas être exécuté en tant que root\n" +msgid "Logical replication slots in the database:" +msgstr "Les slots de réplication logique dans la base de données :" -#: option.c:167 +#: info.c:838 #, c-format -msgid "invalid old port number\n" -msgstr "ancien numéro de port invalide\n" +msgid "slot name: \"%s\", output plugin: \"%s\", two_phase: %s" +msgstr "nom du slot « %s », plugin de sortie « %s », two_phase %s" + +#: option.c:105 +#, c-format +msgid "%s: cannot be run as root" +msgstr "%s : ne peut pas être exécuté en tant que root" #: option.c:172 #, c-format -msgid "invalid new port number\n" -msgstr "nouveau numéro de port invalide\n" +msgid "invalid old port number" +msgstr "ancien numéro de port invalide" + +#: option.c:177 +#, c-format +msgid "invalid new port number" +msgstr "nouveau numéro de port invalide" -#: option.c:198 +#: option.c:216 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Essayez « %s --help » pour plus d'informations.\n" -#: option.c:205 +#: option.c:223 #, c-format -msgid "too many command-line arguments (first is \"%s\")\n" -msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)\n" +msgid "too many command-line arguments (first is \"%s\")" +msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: option.c:208 +#: option.c:229 #, c-format -msgid "Running in verbose mode\n" -msgstr "Exécution en mode verbeux\n" +msgid "Running in verbose mode" +msgstr "Exécution en mode verbeux" -#: option.c:226 +#: option.c:247 msgid "old cluster binaries reside" msgstr "les binaires de l'ancienne instance résident" -#: option.c:228 +#: option.c:249 msgid "new cluster binaries reside" msgstr "les binaires de la nouvelle instance résident" -#: option.c:230 +#: option.c:251 msgid "old cluster data resides" msgstr "les données de l'ancienne instance résident" -#: option.c:232 +#: option.c:253 msgid "new cluster data resides" msgstr "les données de la nouvelle instance résident" -#: option.c:234 +#: option.c:255 msgid "sockets will be created" msgstr "les sockets seront créés" -#: option.c:251 option.c:350 +#: option.c:272 option.c:374 #, c-format -msgid "could not determine current directory\n" -msgstr "n'a pas pu déterminer le répertoire courant\n" +msgid "could not determine current directory" +msgstr "n'a pas pu déterminer le répertoire courant" -#: option.c:254 +#: option.c:275 #, c-format -msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n" -msgstr "ne peut pas exécuter pg_upgrade depuis le répertoire de données de la nouvelle instance sur Windows\n" +msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows" +msgstr "ne peut pas exécuter pg_upgrade depuis le répertoire de données de la nouvelle instance sur Windows" -#: option.c:263 +#: option.c:284 #, c-format msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" @@ -1107,12 +1349,12 @@ msgstr "" "pg_upgrade met à jour une instance PostgreSQL vers une version majeure\n" "différente.\n" -#: option.c:264 +#: option.c:285 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: option.c:265 +#: option.c:286 #, c-format msgid "" " pg_upgrade [OPTION]...\n" @@ -1121,19 +1363,19 @@ msgstr "" " pg_upgrade [OPTION]...\n" "\n" -#: option.c:266 +#: option.c:287 #, c-format msgid "Options:\n" msgstr "Options :\n" -#: option.c:267 +#: option.c:288 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" msgstr "" " -b, --old-bindir=RÉP_BIN répertoire des exécutables de l'ancienne\n" " instance\n" -#: option.c:268 +#: option.c:289 #, c-format msgid "" " -B, --new-bindir=BINDIR new cluster executable directory (default\n" @@ -1143,116 +1385,131 @@ msgstr "" " instance (par défaut, le même répertoire que\n" " pg_upgrade)\n" -#: option.c:270 +#: option.c:291 #, c-format msgid " -c, --check check clusters only, don't change any data\n" msgstr "" " -c, --check vérifie seulement les instances, pas de\n" " modifications\n" -#: option.c:271 +#: option.c:292 #, c-format msgid " -d, --old-datadir=DATADIR old cluster data directory\n" msgstr " -d, --old-datadir=RÉP_DONNÉES répertoire des données de l'ancienne instance\n" -#: option.c:272 +#: option.c:293 #, c-format msgid " -D, --new-datadir=DATADIR new cluster data directory\n" msgstr " -D, --new-datadir=RÉP_DONNÉES répertoire des données de la nouvelle instance\n" -#: option.c:273 +#: option.c:294 #, c-format msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" msgstr "" " -j, --jobs=NUM nombre de processus ou threads simultanés à\n" " utiliser\n" -#: option.c:274 +#: option.c:295 #, c-format msgid " -k, --link link instead of copying files to new cluster\n" msgstr "" " -k, --link lie les fichiers au lieu de les copier vers la\n" " nouvelle instance\n" -#: option.c:275 +#: option.c:296 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr "" " -N, --nosync n'attend pas que les modifications soient proprement\n" " écrites sur disque\n" -#: option.c:276 +#: option.c:297 #, c-format msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n" msgstr "" " -o, --old-options=OPTIONS options à passer au serveur de l'ancienne\n" " instance\n" -#: option.c:277 +#: option.c:298 #, c-format msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n" msgstr "" " -O, --new-options=OPTIONS options à passer au serveur de la nouvelle\n" " instance\n" -#: option.c:278 +#: option.c:299 #, c-format msgid " -p, --old-port=PORT old cluster port number (default %d)\n" msgstr "" " -p, --old-port=PORT numéro de port de l'ancienne instance (par\n" " défaut %d)\n" -#: option.c:279 +#: option.c:300 #, c-format msgid " -P, --new-port=PORT new cluster port number (default %d)\n" msgstr "" " -P, --new-port=PORT numéro de port de la nouvelle instance (par\n" " défaut %d)\n" -#: option.c:280 +#: option.c:301 #, c-format msgid " -r, --retain retain SQL and log files after success\n" msgstr "" " -r, --retain conserve les fichiers SQL et de traces en cas\n" " de succès\n" -#: option.c:281 +#: option.c:302 #, c-format msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" msgstr "" " -s, --socketdir=RÉP_SOCKET répertoire de la socket à utiliser (par défaut\n" " le répertoire courant)\n" -#: option.c:282 +#: option.c:303 #, c-format msgid " -U, --username=NAME cluster superuser (default \"%s\")\n" msgstr "" " -U, --username=NOM super-utilisateur de l'instance (par défaut\n" " « %s »)\n" -#: option.c:283 +#: option.c:304 #, c-format msgid " -v, --verbose enable verbose internal logging\n" msgstr " -v, --verbose active des traces internes verbeuses\n" -#: option.c:284 +#: option.c:305 #, c-format msgid " -V, --version display version information, then exit\n" msgstr " -V, --version affiche la version, puis quitte\n" -#: option.c:285 +#: option.c:306 #, c-format msgid " --clone clone instead of copying files to new cluster\n" msgstr "" " --clone clone au lieu de copier les fichiers vers la\n" " nouvelle instance\n" -#: option.c:286 +#: option.c:307 +#, c-format +msgid " --copy copy files to new cluster (default)\n" +msgstr " --copy copie les fichiers vers la nouvelle instance (par défaut)\n" + +#: option.c:308 +#, c-format +msgid " --copy-file-range copy files to new cluster with copy_file_range\n" +msgstr " --copy-file-range copie les fichiers vers la nouvelle instance avec copy_file_range\n" + +#: option.c:309 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHODE configure la méthode pour synchroniser les fichiers sur disque\n" + +#: option.c:310 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide, puis quitte\n" -#: option.c:287 +#: option.c:311 #, c-format msgid "" "\n" @@ -1268,7 +1525,7 @@ msgstr "" " arrêter le postmaster de la nouvelle instance\n" "\n" -#: option.c:292 +#: option.c:316 #, c-format msgid "" "\n" @@ -1285,7 +1542,7 @@ msgstr "" " le répertoire « bin » pour l'ancienne version (-b RÉP_BIN)\n" " le répertoire « bin » pour la nouvelle version (-B RÉP_BIN)\n" -#: option.c:298 +#: option.c:322 #, c-format msgid "" "\n" @@ -1298,7 +1555,7 @@ msgstr "" " pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n" "ou\n" -#: option.c:303 +#: option.c:327 #, c-format msgid "" " $ export PGDATAOLD=oldCluster/data\n" @@ -1313,7 +1570,7 @@ msgstr "" " $ export PGBINNEW=newCluster/bin\n" " $ pg_upgrade\n" -#: option.c:309 +#: option.c:333 #, c-format msgid "" " C:\\> set PGDATAOLD=oldCluster/data\n" @@ -1328,7 +1585,7 @@ msgstr "" " C:\\> set PGBINNEW=newCluster/bin\n" " C:\\> pg_upgrade\n" -#: option.c:315 +#: option.c:339 #, c-format msgid "" "\n" @@ -1337,239 +1594,290 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: option.c:316 +#: option.c:340 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" -#: option.c:356 +#: option.c:380 #, c-format msgid "" "You must identify the directory where the %s.\n" -"Please use the %s command-line option or the %s environment variable.\n" +"Please use the %s command-line option or the %s environment variable." msgstr "" "Vous devez identifier le répertoire où le %s.\n" -"Merci d'utiliser l'option en ligne de commande %s ou la variable d'environnement %s.\n" +"Merci d'utiliser l'option en ligne de commande %s ou la variable d'environnement %s." -#: option.c:408 +#: option.c:433 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "Recherche du vrai répertoire des données pour l'instance source" -#: option.c:410 +#: option.c:435 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "Recherche du vrai répertoire des données pour l'instance cible" -#: option.c:422 +#: option.c:448 +#, c-format +msgid "could not get data directory using %s: %m" +msgstr "n'a pas pu obtenir le répertoire des données en utilisant %s : %m" + +#: option.c:452 #, c-format -msgid "could not get data directory using %s: %s\n" -msgstr "n'a pas pu obtenir le répertoire des données en utilisant %s : %s\n" +msgid "could not get data directory using %s: %s" +msgstr "n'a pas pu obtenir le répertoire des données en utilisant %s : %s" -#: option.c:473 +#: option.c:500 #, c-format -msgid "could not read line %d from file \"%s\": %s\n" -msgstr "n'a pas pu lire la ligne %d du fichier « %s » : %s\n" +msgid "could not read line %d from file \"%s\": %m" +msgstr "n'a pas pu lire la ligne %d du fichier « %s » : %m" -#: option.c:490 +#: option.c:517 #, c-format -msgid "user-supplied old port number %hu corrected to %hu\n" -msgstr "ancien numéro de port %hu fourni par l'utilisateur corrigé en %hu\n" +msgid "user-supplied old port number %hu corrected to %hu" +msgstr "ancien numéro de port %hu fourni par l'utilisateur corrigé en %hu" -#: parallel.c:127 parallel.c:238 +#: parallel.c:127 parallel.c:235 #, c-format -msgid "could not create worker process: %s\n" -msgstr "n'a pas pu créer le processus de travail : %s\n" +msgid "could not create worker process: %m" +msgstr "n'a pas pu créer le processus worker : %m" -#: parallel.c:146 parallel.c:259 +#: parallel.c:143 parallel.c:253 #, c-format -msgid "could not create worker thread: %s\n" -msgstr "n'a pas pu créer le fil de travail: %s\n" +msgid "could not create worker thread: %m" +msgstr "n'a pas pu créer le fil de travail: %m" -#: parallel.c:300 +#: parallel.c:294 #, c-format -msgid "%s() failed: %s\n" -msgstr "échec de %s() : %s\n" +msgid "%s() failed: %m" +msgstr "échec de %s() : %m" -#: parallel.c:304 +#: parallel.c:298 #, c-format -msgid "child process exited abnormally: status %d\n" -msgstr "le processus fils a quitté anormalement : statut %d\n" +msgid "child process exited abnormally: status %d" +msgstr "le processus fils a quitté anormalement : statut %d" -#: parallel.c:319 +#: parallel.c:313 #, c-format -msgid "child worker exited abnormally: %s\n" -msgstr "le processus fils a quitté anormalement : %s\n" +msgid "child worker exited abnormally: %m" +msgstr "le processus fils a quitté anormalement : %m" -#: pg_upgrade.c:103 +#: pg_upgrade.c:115 #, c-format -msgid "could not read permissions of directory \"%s\": %s\n" -msgstr "n'a pas pu lire les droits du répertoire « %s » : %s\n" +msgid "could not read permissions of directory \"%s\": %m" +msgstr "n'a pas pu lire les droits du répertoire « %s » : %m" -#: pg_upgrade.c:135 +#: pg_upgrade.c:147 #, c-format msgid "" "\n" "Performing Upgrade\n" -"------------------\n" +"------------------" msgstr "" "\n" "Réalisation de la mise à jour\n" -"-----------------------------\n" +"-----------------------------" -#: pg_upgrade.c:178 +#: pg_upgrade.c:192 #, c-format msgid "Setting next OID for new cluster" msgstr "Configuration du prochain OID sur la nouvelle instance" -#: pg_upgrade.c:187 +#: pg_upgrade.c:216 #, c-format msgid "Sync data directory to disk" msgstr "Synchronisation du répertoire des données sur disque" -#: pg_upgrade.c:199 +#: pg_upgrade.c:230 #, c-format msgid "" "\n" "Upgrade Complete\n" -"----------------\n" +"----------------" msgstr "" "\n" "Mise à jour terminée\n" -"--------------------\n" +"--------------------" + +#: pg_upgrade.c:263 pg_upgrade.c:276 pg_upgrade.c:283 pg_upgrade.c:290 +#: pg_upgrade.c:308 pg_upgrade.c:319 +#, c-format +msgid "directory path for new cluster is too long" +msgstr "le chemin du répertoire pour la nouvelle instance est trop long" -#: pg_upgrade.c:233 pg_upgrade.c:235 pg_upgrade.c:237 +#: pg_upgrade.c:297 pg_upgrade.c:299 pg_upgrade.c:301 pg_upgrade.c:303 #, c-format -msgid "could not create directory \"%s\": %m\n" -msgstr "n'a pas pu créer le répertoire « %s » : %m\n" +msgid "could not create directory \"%s\": %m" +msgstr "n'a pas pu créer le répertoire « %s » : %m" -#: pg_upgrade.c:282 +#: pg_upgrade.c:352 #, c-format -msgid "%s: could not find own program executable\n" -msgstr "%s : n'a pas pu trouver l'exécutable du programme\n" +msgid "%s: could not find own program executable" +msgstr "%s : n'a pas pu trouver l'exécutable du programme" -#: pg_upgrade.c:308 +#: pg_upgrade.c:378 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" -"Please shutdown that postmaster and try again.\n" +"Please shutdown that postmaster and try again." msgstr "" "Il semble qu'un postmaster est démarré sur l'ancienne instance.\n" -"Merci d'arrêter ce postmaster et d'essayer de nouveau.\n" +"Merci d'arrêter ce postmaster et d'essayer de nouveau." -#: pg_upgrade.c:321 +#: pg_upgrade.c:391 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" -"Please shutdown that postmaster and try again.\n" +"Please shutdown that postmaster and try again." msgstr "" "Il semble qu'un postmaster est démarré sur la nouvelle instance.\n" -"Merci d'arrêter ce postmaster et d'essayer de nouveau.\n" +"Merci d'arrêter ce postmaster et d'essayer de nouveau." -#: pg_upgrade.c:335 +#: pg_upgrade.c:413 +#, c-format +msgid "Setting locale and encoding for new cluster" +msgstr "Configuration de la locale et de l'encodage pour la nouvelle instance" + +#: pg_upgrade.c:489 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Analyse de toutes les lignes dans la nouvelle instance" -#: pg_upgrade.c:348 +#: pg_upgrade.c:502 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Gel de toutes les lignes dans la nouvelle instance" -#: pg_upgrade.c:368 +#: pg_upgrade.c:522 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Restauration des objets globaux dans la nouvelle instance" -#: pg_upgrade.c:490 +#: pg_upgrade.c:538 +#, c-format +msgid "Restoring database schemas in the new cluster" +msgstr "Restauration des schémas des bases de données dans la nouvelle instance" + +#: pg_upgrade.c:662 #, c-format msgid "Deleting files from new %s" msgstr "Suppression des fichiers à partir du nouveau %s" -#: pg_upgrade.c:494 +#: pg_upgrade.c:666 #, c-format -msgid "could not delete directory \"%s\"\n" -msgstr "n'a pas pu supprimer le répertoire « %s »\n" +msgid "could not delete directory \"%s\"" +msgstr "n'a pas pu supprimer le répertoire « %s »" -#: pg_upgrade.c:513 +#: pg_upgrade.c:685 #, c-format msgid "Copying old %s to new server" msgstr "Copie de l'ancien %s vers le nouveau serveur" -#: pg_upgrade.c:539 +#: pg_upgrade.c:711 #, c-format msgid "Setting oldest XID for new cluster" msgstr "Configuration du plus ancien XID sur la nouvelle instance" -#: pg_upgrade.c:547 +#: pg_upgrade.c:719 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "Configuration du prochain identifiant de transaction et de l'epoch pour la nouvelle instance" -#: pg_upgrade.c:577 +#: pg_upgrade.c:749 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "Configuration du prochain MultiXactId et décalage pour la nouvelle instance" -#: pg_upgrade.c:601 +#: pg_upgrade.c:773 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Configuration du plus ancien identifiant multixact sur la nouvelle instance" -#: pg_upgrade.c:621 +#: pg_upgrade.c:793 #, c-format msgid "Resetting WAL archives" msgstr "Réinitialisation des archives WAL" -#: pg_upgrade.c:664 +#: pg_upgrade.c:836 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Configuration des compteurs frozenxid et minmxid dans la nouvelle instance" -#: pg_upgrade.c:666 +#: pg_upgrade.c:838 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Configuration du compteur minmxid dans la nouvelle instance" -#: relfilenode.c:115 +#: pg_upgrade.c:929 +#, c-format +msgid "Restoring logical replication slots in the new cluster" +msgstr "Restauration des slots de réplication logique dans la nouvelle instance" + +#: relfilenumber.c:35 +#, c-format +msgid "Cloning user relation files" +msgstr "Clonage des fichiers des relations utilisateurs" + +#: relfilenumber.c:38 +#, c-format +msgid "Copying user relation files" +msgstr "Copie des fichiers des relations utilisateurs" + +#: relfilenumber.c:41 +#, c-format +msgid "Copying user relation files with copy_file_range" +msgstr "Copie des fichiers des relations utilisateurs avec copy_file_range" + +#: relfilenumber.c:44 #, c-format -msgid "old database \"%s\" not found in the new cluster\n" -msgstr "ancienne base de données « %s » introuvable dans la nouvelle instance\n" +msgid "Linking user relation files" +msgstr "Création des liens pour les fichiers des relations utilisateurs" -#: relfilenode.c:218 +#: relfilenumber.c:118 #, c-format -msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "erreur lors de la vérification de l'existence du fichier « %s.%s » (« %s » vers « %s ») : %s\n" +msgid "old database \"%s\" not found in the new cluster" +msgstr "ancienne base de données « %s » introuvable dans la nouvelle instance" -#: relfilenode.c:236 +#: relfilenumber.c:221 #, c-format -msgid "rewriting \"%s\" to \"%s\"\n" -msgstr "réécriture de « %s » en « %s »\n" +msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "erreur lors de la vérification de l'existence du fichier « %s.%s » (« %s » vers « %s ») : %m" -#: relfilenode.c:244 +#: relfilenumber.c:238 #, c-format -msgid "cloning \"%s\" to \"%s\"\n" -msgstr "clonage de « %s » en « %s »\n" +msgid "rewriting \"%s\" to \"%s\"" +msgstr "réécriture de « %s » en « %s »" -#: relfilenode.c:249 +#: relfilenumber.c:246 #, c-format -msgid "copying \"%s\" to \"%s\"\n" -msgstr "copie de « %s » en « %s »\n" +msgid "cloning \"%s\" to \"%s\"" +msgstr "clonage de « %s » en « %s »" -#: relfilenode.c:254 +#: relfilenumber.c:251 #, c-format -msgid "linking \"%s\" to \"%s\"\n" -msgstr "lien de « %s » vers « %s »\n" +msgid "copying \"%s\" to \"%s\"" +msgstr "copie de « %s » en « %s »" -#: server.c:39 server.c:143 util.c:174 util.c:204 +#: relfilenumber.c:256 +#, c-format +msgid "copying \"%s\" to \"%s\" with copy_file_range" +msgstr "copie de « %s » en « %s » avec copy_file_range" + +#: relfilenumber.c:261 +#, c-format +msgid "linking \"%s\" to \"%s\"" +msgstr "lien de « %s » vers « %s »" + +#: server.c:39 server.c:143 util.c:248 util.c:278 #, c-format msgid "Failure, exiting\n" msgstr "Échec, sortie\n" #: server.c:133 #, c-format -msgid "executing: %s\n" -msgstr "exécution : %s\n" +msgid "executing: %s" +msgstr "exécution : %s" #: server.c:139 #, c-format @@ -1584,15 +1892,15 @@ msgstr "" #: server.c:169 #, c-format -msgid "could not open version file \"%s\": %m\n" -msgstr "n'a pas pu ouvrir le fichier de version « %s » : %m\n" +msgid "could not open version file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier de version « %s » : %m" #: server.c:173 #, c-format -msgid "could not parse version file \"%s\"\n" -msgstr "n'a pas pu analyser le fichier de version « %s »\n" +msgid "could not parse version file \"%s\"" +msgstr "n'a pas pu analyser le fichier de version « %s »" -#: server.c:291 +#: server.c:310 #, c-format msgid "" "\n" @@ -1601,158 +1909,109 @@ msgstr "" "\n" "%s" -#: server.c:295 +#: server.c:314 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" -"%s\n" +"%s" msgstr "" "n'a pas pu se connecter au postmaster source lancé avec la commande :\n" -"%s\n" +"%s" -#: server.c:299 +#: server.c:318 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" -"%s\n" +"%s" msgstr "" "n'a pas pu se connecter au postmaster cible lancé avec la commande :\n" -"%s\n" +"%s" -#: server.c:313 +#: server.c:332 #, c-format -msgid "pg_ctl failed to start the source server, or connection failed\n" -msgstr "pg_ctl a échoué à démarrer le serveur source ou connexion échouée\n" +msgid "pg_ctl failed to start the source server, or connection failed" +msgstr "pg_ctl a échoué à démarrer le serveur source ou connexion échouée" -#: server.c:315 +#: server.c:334 #, c-format -msgid "pg_ctl failed to start the target server, or connection failed\n" -msgstr "pg_ctl a échoué à démarrer le serveur cible ou connexion échouée\n" +msgid "pg_ctl failed to start the target server, or connection failed" +msgstr "pg_ctl a échoué à démarrer le serveur cible ou connexion échouée" -#: server.c:360 +#: server.c:379 #, c-format -msgid "out of memory\n" -msgstr "mémoire épuisée\n" +msgid "out of memory" +msgstr "mémoire épuisée" -#: server.c:373 +#: server.c:392 #, c-format -msgid "libpq environment variable %s has a non-local server value: %s\n" -msgstr "la variable d'environnement libpq %s a une valeur serveur non locale : %s\n" +msgid "libpq environment variable %s has a non-local server value: %s" +msgstr "la variable d'environnement libpq %s a une valeur serveur non locale : %s" #: tablespace.c:28 #, c-format msgid "" "Cannot upgrade to/from the same system catalog version when\n" -"using tablespaces.\n" -msgstr "Ne peut pas mettre à jour vers ou à partir de la même version de catalogue système quand des tablespaces sont utilisés.\n" +"using tablespaces." +msgstr "" +"Ne peut pas mettre à jour vers ou à partir de la même version de\n" +"catalogue système quand des tablespaces sont utilisés." #: tablespace.c:83 #, c-format -msgid "tablespace directory \"%s\" does not exist\n" -msgstr "le répertoire « %s » du tablespace n'existe pas\n" +msgid "tablespace directory \"%s\" does not exist" +msgstr "le répertoire « %s » du tablespace n'existe pas" #: tablespace.c:87 #, c-format -msgid "could not stat tablespace directory \"%s\": %s\n" -msgstr "n'a pas pu tester le répertoire « %s » du tablespace : %s\n" +msgid "could not stat tablespace directory \"%s\": %m" +msgstr "n'a pas pu tester le répertoire « %s » du tablespace : %m" #: tablespace.c:92 #, c-format -msgid "tablespace path \"%s\" is not a directory\n" -msgstr "le chemin « %s » du tablespace n'est pas un répertoire\n" +msgid "tablespace path \"%s\" is not a directory" +msgstr "le chemin « %s » du tablespace n'est pas un répertoire" -#: util.c:52 util.c:82 util.c:115 +#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172 #, c-format msgid "%-*s" msgstr "%-*s" -#: util.c:113 +#: util.c:107 #, c-format -msgid "%-*s\n" -msgstr "%-*s\n" +msgid "could not access directory \"%s\": %m" +msgstr "n'a pas pu accéder au répertoire « %s » : %m" -#: util.c:213 +#: util.c:287 #, c-format msgid "ok" msgstr "ok" -#: version.c:184 -#, c-format -msgid "Checking for incompatible \"line\" data type" -msgstr "Vérification des types de données line incompatibles" - -#: version.c:191 -#, c-format -msgid "" -"Your installation contains the \"line\" data type in user tables.\n" -"This data type changed its internal and input/output format\n" -"between your old and new versions so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Votre installation contient le type de données « line » dans vos tables utilisateurs.\n" -"Ce type de données a changé de format interne et en entrée/sortie entre vos ancienne\n" -"et nouvelle versions, donc cette instance ne peut pas être mise à jour\n" -"actuellement. Vous pouvez supprimer les colonnes problématiques et relancer la mise à jour.\n" -"Une liste des colonnes problématiques se trouve dans le fichier :\n" -" %s\n" -"\n" - -#: version.c:222 -#, c-format -msgid "Checking for invalid \"unknown\" user columns" -msgstr "Vérification des colonnes utilisateurs « unknown » invalides" - -#: version.c:229 -#, c-format -msgid "" -"Your installation contains the \"unknown\" data type in user tables.\n" -"This data type is no longer allowed in tables, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Votre installation contient le type de données « unknown » dans vos tables\n" -"utilisateurs. Ce type de données n'est plus autorisé dans les tables, donc\n" -"cette instance ne peut pas être mise à jour pour l'instant. Vous pouvez\n" -"supprimer les colonnes problématiques, puis relancer la mise à jour. Vous trouverez\n" -"une liste des colonnes problématiques dans le fichier :\n" -" %s\n" -"\n" - -#: version.c:253 +#: version.c:44 #, c-format msgid "Checking for hash indexes" msgstr "Vérification des index hash" -#: version.c:331 +#: version.c:121 #, c-format msgid "warning" msgstr "attention" -#: version.c:333 +#: version.c:123 #, c-format msgid "" "\n" "Your installation contains hash indexes. These indexes have different\n" "internal formats between your old and new clusters, so they must be\n" "reindexed with the REINDEX command. After upgrading, you will be given\n" -"REINDEX instructions.\n" -"\n" +"REINDEX instructions." msgstr "" "\n" "Votre installation contient des index hashs. Ces index ont des formats\n" -"internes différents entre l'ancienne et la nouvelle instance, dont ils doivent\n" +"internes différents entre l'ancienne et la nouvelle instance, donc ils doivent\n" "être recréés avec la commande REINDEX. Après la mise à jour, les instructions\n" -"REINDEX vous seront données.\n" -"\n" +"REINDEX vous seront données." -#: version.c:339 +#: version.c:129 #, c-format msgid "" "\n" @@ -1761,54 +2020,27 @@ msgid "" "reindexed with the REINDEX command. The file\n" " %s\n" "when executed by psql by the database superuser will recreate all invalid\n" -"indexes; until then, none of these indexes will be used.\n" -"\n" +"indexes; until then, none of these indexes will be used." msgstr "" "\n" -"Votre installation contient des index hashs. Ces index ont des formats\n" +"Votre installation contient des index hash. Ces index ont des formats\n" "internes différents entre l'ancienne et la nouvelle instance, donc ils doivent\n" "être recréés avec la commande REINDEX. Le fichier :\n" " %s\n" "une fois exécuté par psql en tant que superutilisateur va recréer tous les\n" -"index invalides. Avant cela, aucun de ces index ne sera utilisé.\n" -"\n" - -#: version.c:365 -#, c-format -msgid "Checking for invalid \"sql_identifier\" user columns" -msgstr "Vérification des colonnes utilisateurs « sql_identifier » invalides" - -#: version.c:373 -#, c-format -msgid "" -"Your installation contains the \"sql_identifier\" data type in user tables.\n" -"The on-disk format for this data type has changed, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Votre installation contient le type de données « sql_identifier » dans les tables\n" -"utilisateurs. Le format sur disque pour ce type de données a changé,\n" -"donc cette instance ne peut pas être mise à jour actuellement. Vous pouvez supprimer\n" -"les colonnes problématiques, puis relancer la mise à jour.\n" -"\n" -"Une liste des colonnes problématiques se trouve dans le fichier :\n" -" %s\n" -"\n" +"index invalides. Avant cela, aucun de ces index ne sera utilisé." -#: version.c:397 +#: version.c:153 #, c-format msgid "Checking for extension updates" msgstr "Vérification des mises à jour d'extension" -#: version.c:449 +#: version.c:200 #, c-format msgid "notice" msgstr "notice" -#: version.c:450 +#: version.c:201 #, c-format msgid "" "\n" @@ -1816,229 +2048,11 @@ msgid "" "with the ALTER EXTENSION command. The file\n" " %s\n" "when executed by psql by the database superuser will update\n" -"these extensions.\n" -"\n" +"these extensions." msgstr "" "\n" -"Your installation contains extensions that should be updated\n" -"with the ALTER EXTENSION command. The file\n" +"Votre installation contient des extensions qui doivent être\n" +"mises à jour avec la commande ALTER EXTENSION. Le fichier\n" " %s\n" -"when executed by psql by the database superuser will update\n" -"these extensions.\n" -"\n" - -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" - -#, c-format -#~ msgid "" -#~ "\n" -#~ "The old cluster has a \"plpython_call_handler\" function defined\n" -#~ "in the \"public\" schema which is a duplicate of the one defined\n" -#~ "in the \"pg_catalog\" schema. You can confirm this by executing\n" -#~ "in psql:\n" -#~ "\n" -#~ " \\df *.plpython_call_handler\n" -#~ "\n" -#~ "The \"public\" schema version of this function was created by a\n" -#~ "pre-8.1 install of plpython, and must be removed for pg_upgrade\n" -#~ "to complete because it references a now-obsolete \"plpython\"\n" -#~ "shared object file. You can remove the \"public\" schema version\n" -#~ "of this function by running the following command:\n" -#~ "\n" -#~ " DROP FUNCTION public.plpython_call_handler()\n" -#~ "\n" -#~ "in each affected database:\n" -#~ "\n" -#~ msgstr "" -#~ "\n" -#~ "L'ancienne instance comprend une fonction « plpython_call_handler »\n" -#~ "définie dans le schéma « public » qui est un duplicat de celle définie\n" -#~ "dans le schéma « pg_catalog ». Vous pouvez confirmer cela en\n" -#~ "exécutant dans psql :\n" -#~ "\n" -#~ " \\df *.plpython_call_handler\n" -#~ "\n" -#~ "La version de cette fonction dans le schéma « public » a été créée\n" -#~ "par une installation de plpython antérieure à la version 8.1 et doit\n" -#~ "être supprimée pour que pg_upgrade puisse termine parce qu'elle\n" -#~ "référence un fichier objet partagé « plpython » maintenant obsolète.\n" -#~ "Vous pouvez supprimer la version de cette fonction dans le schéma\n" -#~ "« public » en exécutant la commande suivante :\n" -#~ "\n" -#~ " DROP FUNCTION public.plpython_call_handler()\n" -#~ "\n" -#~ "dans chaque base de données affectée :\n" -#~ "\n" - -#, c-format -#~ msgid "" -#~ "\n" -#~ "Your installation contains large objects. The new database has an\n" -#~ "additional large object permission table, so default permissions must be\n" -#~ "defined for all large objects. The file\n" -#~ " %s\n" -#~ "when executed by psql by the database superuser will set the default\n" -#~ "permissions.\n" -#~ "\n" -#~ msgstr "" -#~ "\n" -#~ "Votre installation contient des Large Objects. La nouvelle base de données\n" -#~ "a une table de droit supplémentaire pour les Large Objects, donc les droits\n" -#~ "par défaut doivent être définies pour tous les Large Objects. Le fichier\n" -#~ " %s\n" -#~ "une fois exécuté par psql avec un superutilisateur définira les droits par\n" -#~ "défaut.\n" -#~ "\n" - -#, c-format -#~ msgid "" -#~ "\n" -#~ "Your installation contains large objects. The new database has an\n" -#~ "additional large object permission table. After upgrading, you will be\n" -#~ "given a command to populate the pg_largeobject_metadata table with\n" -#~ "default permissions.\n" -#~ "\n" -#~ msgstr "" -#~ "\n" -#~ "Votre installation contient des Large Objects. La nouvelle base de données a une table de droit supplémentaire sur les Large Objects.\n" -#~ "Après la mise à jour, vous disposerez d'une commande pour peupler la table pg_largeobject_metadata avec les droits par défaut.\n" -#~ "\n" - -#~ msgid "" -#~ "\n" -#~ "connection to database failed: %s" -#~ msgstr "" -#~ "\n" -#~ "échec de la connexion à la base de données : %s" - -#, c-format -#~ msgid " " -#~ msgstr " " - -#, c-format -#~ msgid " %s\n" -#~ msgstr " %s\n" - -#~ msgid "" -#~ " --index-collation-versions-unknown\n" -#~ " mark text indexes as needing to be rebuilt\n" -#~ msgstr "" -#~ " --index-collation-versions-unknown\n" -#~ " marque les index de colonnes de type text comme nécessitant une reconstruction\n" - -#~ msgid "%s is not a directory\n" -#~ msgstr "%s n'est pas un répertoire\n" - -#, c-format -#~ msgid "%s.%s: %u to %u\n" -#~ msgstr "%s.%s : %u vers %u\n" - -#~ msgid "----------------\n" -#~ msgstr "----------------\n" - -#~ msgid "------------------\n" -#~ msgstr "------------------\n" - -#~ msgid "-----------------------------\n" -#~ msgstr "-----------------------------\n" - -#~ msgid "------------------------------------------------\n" -#~ msgstr "------------------------------------------------\n" - -#, c-format -#~ msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n" -#~ msgstr "Toutes les bases de données, autre que template0, doivent autoriser les connexions, ie pg_database.datallowconn doit valoir true\n" - -#~ msgid "Cannot open file %s: %m\n" -#~ msgstr "Ne peut pas ouvrir le fichier %s : %m\n" - -#~ msgid "Cannot read line %d from %s: %m\n" -#~ msgstr "Ne peut pas lire la ligne %d à partir de %s : %m\n" - -#, c-format -#~ msgid "Checking for large objects" -#~ msgstr "Vérification des Large Objects" - -#, c-format -#~ msgid "Cloning user relation files\n" -#~ msgstr "Clonage des fichiers des relations utilisateurs\n" - -#, c-format -#~ msgid "Copying user relation files\n" -#~ msgstr "Copie des fichiers des relations utilisateurs\n" - -#, c-format -#~ msgid "Creating dump of database schemas\n" -#~ msgstr "Création de la sauvegarde des schémas des bases\n" - -#~ msgid "Creating script to analyze new cluster" -#~ msgstr "Création d'un script pour analyser la nouvelle instance" - -#, c-format -#~ msgid "Linking user relation files\n" -#~ msgstr "Création des liens pour les fichiers des relations utilisateurs\n" - -#~ msgid "" -#~ "Optimizer statistics and free space information are not transferred\n" -#~ "by pg_upgrade so, once you start the new server, consider running:\n" -#~ " %s\n" -#~ "\n" -#~ msgstr "" -#~ "Les statistiques de l'optimiseur et les informations sur l'espace libre\n" -#~ "ne sont pas transférées par pg_upgrade, donc une fois le nouveau\n" -#~ "serveur démarré, pensez à exécuter :\n" -#~ " %s\n" -#~ "\n" - -#, c-format -#~ msgid "Remove the problem functions from the old cluster to continue.\n" -#~ msgstr "Supprimez les fonctions problématiques de l'ancienne instance pour continuer.\n" - -#, c-format -#~ msgid "Restoring database schemas in the new cluster\n" -#~ msgstr "Restauration des schémas des bases de données dans la nouvelle instance\n" - -#~ msgid "" -#~ "This utility can only upgrade to PostgreSQL version 9.0 after 2010-01-11\n" -#~ "because of backend API changes made during development.\n" -#~ msgstr "" -#~ "Cet outil peut seulement mettre à jour à partir de la version 9.0 de PostgreSQL (après le 11 janvier 2010)\n" -#~ "à cause de changements dans l'API du moteur fait lors du développement.\n" - -#, c-format -#~ msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n" -#~ msgstr "Lors de la vérification d'un serveur antérieur à la 9.1, vous devez spécifier le numéro de port de l'ancien serveur.\n" - -#~ msgid "cannot find current directory\n" -#~ msgstr "ne peut pas trouver le répertoire courant\n" - -#~ msgid "cannot write to log file %s\n" -#~ msgstr "ne peut pas écrire dans le fichier de traces %s\n" - -#~ msgid "check for \"%s\" failed: cannot read file (permission denied)\n" -#~ msgstr "échec de la vérification de « %s » : ne peut pas lire le fichier (droit refusé)\n" - -#~ msgid "connection to database failed: %s" -#~ msgstr "échec de la connexion à la base de données : %s" - -#~ msgid "" -#~ "could not load library \"%s\":\n" -#~ "%s\n" -#~ msgstr "" -#~ "n'a pas pu charger la biblothèque « %s »:\n" -#~ "%s\n" - -#~ msgid "could not parse PG_VERSION file from %s\n" -#~ msgstr "n'a pas pu analyser le fichier PG_VERSION à partir de %s\n" - -#, c-format -#~ msgid "mappings for database \"%s\":\n" -#~ msgstr "correspondances pour la base de données « %s » :\n" - -#~ msgid "waitpid() failed: %s\n" -#~ msgstr "échec de waitpid() : %s\n" +"une fois exécuté par psql par le superutilisateur mettre à jour\n" +"ces extensions." diff --git a/src/bin/pg_upgrade/po/ja.po b/src/bin/pg_upgrade/po/ja.po index 264b240466463..5570cf122fe50 100644 --- a/src/bin/pg_upgrade/po/ja.po +++ b/src/bin/pg_upgrade/po/ja.po @@ -1,16 +1,16 @@ # pg_upgrade.po # Japanese message translation file for pg_upgrade # -# Copyright (C) 2011-2022 PostgreSQL Global Development Group +# Copyright (C) 2011-2024 PostgreSQL Global Development Group # # This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: pg_upgrade (PostgreSQL 16)\n" +"Project-Id-Version: pg_upgrade (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 09:36+0900\n" -"PO-Revision-Date: 2023-05-22 10:05+0900\n" +"POT-Creation-Date: 2025-02-28 11:39+0900\n" +"PO-Revision-Date: 2025-03-03 17:36+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -20,7 +20,239 @@ msgstr "" "X-Generator: Poedit 1.8.13\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: check.c:69 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "メモリä¸è¶³ã§ã™\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "nullãƒã‚¤ãƒ³ã‚¿ã¯è¤‡è£½ã§ãã¾ã›ã‚“(内部エラー)\n" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "サブプロセスã®çµ‚了コードをå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: エラーコード %lu" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "実効ユーザーID %ld ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "ユーザーãŒå­˜åœ¨ã—ã¾ã›ã‚“" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "ユーザーåã®å‚ç…§ã«å¤±æ•—: エラーコード %lu" + +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "シェルコマンドã®å¼•æ•°ã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "データベースåã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + +#: check.c:111 +msgid "Checking for system-defined composite types in user tables" +msgstr "ユーザーテーブル内ã®ã‚·ã‚¹ãƒ†ãƒ å®šç¾©è¤‡åˆåž‹ã‚’確èªã—ã¦ã„ã¾ã™" + +#: check.c:118 +msgid "" +"Your installation contains system-defined composite types in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«ã‚·ã‚¹ãƒ†ãƒ å®šç¾©ã®è¤‡åˆãƒ‡ãƒ¼ã‚¿åž‹ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" +"ã“れらã®åž‹ã®OIDã¯PostgreSQLã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³é–“ã«ã‚ãŸã£ã¦ä¸å¤‰ã§ã¯ãªã„ãŸã‚ã€\n" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点ã§ã¯ã‚¢ãƒƒãƒ—グレードã§ãã¾ã›ã‚“。å•題ã®åˆ—を削除ã—ãŸã®ã¡ã«\n" +"アップグレードをå†å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n" + +#: check.c:132 +msgid "Checking for incompatible \"line\" data type" +msgstr "éžäº’æ›ã® \"line\" データ型を確èªã—ã¦ã„ã¾ã™" + +#: check.c:137 +msgid "" +"Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«\"line\"データ型ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" +"ã“ã®ãƒ‡ãƒ¼ã‚¿åž‹ã¯æ–°æ—§ã®ã‚¯ãƒ©ã‚¹ã‚¿é–“ã§å†…部形å¼ãŠã‚ˆã³å…¥å‡ºåŠ›ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒ\n" +"変更ã•れã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点ã§ã¯ã‚¢ãƒƒãƒ—グレードã§ãã¾ã›ã‚“。\n" +"å•題ã®åˆ—を削除ã—ãŸã®ã¡ã«ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n" + +#: check.c:154 +msgid "Checking for reg* data types in user tables" +msgstr "ユーザーテーブル内㮠reg * データ型をãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™" + +#: check.c:181 +msgid "" +"Your installation contains one of the reg* data types in user tables.\n" +"These data types reference system OIDs that are not preserved by\n" +"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«reg*データ型ã®ã²ã¨ã¤ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" +"ã“れらã®ãƒ‡ãƒ¼ã‚¿åž‹ã¯ã‚·ã‚¹ãƒ†ãƒ OIDã‚’å‚ç…§ã—ã¾ã™ãŒã€ã“れ㯠pg_upgradeã§ã¯\n" +"ä¿å­˜ã•れãªã„ãŸã‚ã€ç¾æ™‚点ã§ã¯ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’アップグレードã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。\n" +"å•題ã®åˆ—を削除ã—ãŸã®ã¡ã€ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n" + +#: check.c:193 +msgid "Checking for incompatible \"aclitem\" data type" +msgstr "éžäº’æ›ã®\"aclitem\"データ型を確èªã—ã¦ã„ã¾ã™" + +#: check.c:198 +msgid "" +"Your installation contains the \"aclitem\" data type in user tables.\n" +"The internal format of \"aclitem\" changed in PostgreSQL version 16\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«\"aclitem\"データ型ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" +"ã“ã®åž‹ã®å†…部フォーマットã¯PostgreSQL ãƒãƒ¼ã‚¸ãƒ§ãƒ³16ã§å¤‰æ›´ã•れã¦ã„ã‚‹ãŸã‚ã€\n" +"ç¾æ™‚点ã§ã¯ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’アップグレードã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。\n" +"å•題ã®åˆ—を削除ã—ãŸã®ã¡ã€ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n" + +#: check.c:217 +msgid "Checking for invalid \"unknown\" user columns" +msgstr "無効ãª\"unknown\"ユーザー列をãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™" + +#: check.c:222 +msgid "" +"Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this cluster\n" +"cannot currently be upgraded. You can drop the problem columns\n" +"and restart the upgrade.\n" +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ル㫠\"unknown\" データ型ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" +"ã“ã®ãƒ‡ãƒ¼ã‚¿åž‹ã¯ã‚‚ã¯ã‚„テーブル内ã§ã¯åˆ©ç”¨ã§ããªã„ãŸã‚ã€ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点\n" +"ã§ã¯ã‚¢ãƒƒãƒ—グレードã§ãã¾ã›ã‚“。å•題ã®åˆ—を削除ã—ãŸã®ã¡ã€ã‚¢ãƒƒãƒ—グレードを\n" +"å†å®Ÿè¡Œã§ãã¾ã™ã€‚\n" + +#: check.c:239 +msgid "Checking for invalid \"sql_identifier\" user columns" +msgstr "無効ãª\"sql_identifier\"ユーザー列を確èªã—ã¦ã„ã¾ã™" + +#: check.c:244 +msgid "" +"Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can drop the problem\n" +"columns and restart the upgrade.\n" +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«â€sql_identifierâ€ãƒ‡ãƒ¼ã‚¿åž‹ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" +"ã“ã®ãƒ‡ãƒ¼ã‚¿åž‹ã®ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã§ã®å½¢å¼ã¯å¤‰æ›´ã•れã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点ã§ã¯\n" +"アップグレードã§ãã¾ã›ã‚“。å•題ã®ã‚る列を削除ã—ãŸå¾Œã«ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã™ã‚‹\n" +"ã“ã¨ãŒã§ãã¾ã™ã€‚\n" + +#: check.c:255 +msgid "Checking for incompatible \"jsonb\" data type in user tables" +msgstr "ユーザーテーブル内ã®éžäº’æ›ã®\"jsonb\"データ型を確èªã—ã¦ã„ã¾ã™" + +#: check.c:260 +msgid "" +"Your installation contains the \"jsonb\" data type in user tables.\n" +"The internal format of \"jsonb\" changed during 9.4 beta so this\n" +"cluster cannot currently be upgraded. You can drop the problem \n" +"columns and restart the upgrade.\n" +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«\"jsonb\"データ型ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" +"ã“ã®åž‹ã®å†…部フォーマットã¯9.4ベータã®é–“ã«å¤‰æ›´ã•れã¦ã„ã‚‹ãŸã‚ã€ç¾æ™‚点ã§ã¯ã“ã®\n" +"クラスタをアップグレードã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 å•題ã®åˆ—を削除ã—ãŸã®ã¡ã€\n" +"アップグレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n" + +#: check.c:272 +msgid "Checking for removed \"abstime\" data type in user tables" +msgstr "ユーザーテーブル内ã®å‰Šé™¤ã•れãŸ\"abstime\"データ型を確èªã—ã¦ã„ã¾ã™" + +#: check.c:277 +msgid "" +"Your installation contains the \"abstime\" data type in user tables.\n" +"The \"abstime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«ãƒ‡ãƒ¼ã‚¿åž‹\"abstime\"ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" +"ã“ã®\"abstime\"åž‹ã¯PostgreSQLãƒãƒ¼ã‚¸ãƒ§ãƒ³12ã§ã¯å‰Šé™¤ã•れã¦ã„ã¾ã™ã€‚\n" +"ãã®ãŸã‚ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点ã§ã¯ã‚¢ãƒƒãƒ—グレードã§ãã¾ã›ã‚“。\n" +"å•題ã®åˆ—を削除ã™ã‚‹ã‹ã€ä»–ã®ãƒ‡ãƒ¼ã‚¿åž‹ã«å¤‰æ›´ã—ãŸå¾Œã«ã‚¢ãƒƒãƒ—グレードを\n" +"å†å®Ÿè¡Œã§ãã¾ã™ã€‚\n" + +#: check.c:285 +msgid "Checking for removed \"reltime\" data type in user tables" +msgstr "ユーザーテーブル中内ã®å‰Šé™¤ã•れãŸ\"reltime\"データ型を確èªã—ã¦ã„ã¾ã™" + +#: check.c:290 +msgid "" +"Your installation contains the \"reltime\" data type in user tables.\n" +"The \"reltime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«ãƒ‡ãƒ¼ã‚¿åž‹\"reltime\"ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" +"ã“ã®\"reltime\"åž‹ã¯PostgreSQLãƒãƒ¼ã‚¸ãƒ§ãƒ³12ã§ã¯å‰Šé™¤ã•れã¦ã„ã¾ã™ã€ãã®ãŸã‚\n" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点ã§ã¯ã‚¢ãƒƒãƒ—グレードã§ãã¾ã›ã‚“。å•題ã®åˆ—を削除ã™ã‚‹ã‹ã€\n" +"ä»–ã®ãƒ‡ãƒ¼ã‚¿åž‹ã«å¤‰æ›´ã—ãŸå¾Œã«ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n" + +#: check.c:298 +msgid "Checking for removed \"tinterval\" data type in user tables" +msgstr "ユーザーテーブル内ã®å‰Šé™¤ã•れãŸ\"tinterval\"データ型を確èªã—ã¦ã„ã¾ã™" + +#: check.c:303 +msgid "" +"Your installation contains the \"tinterval\" data type in user tables.\n" +"The \"tinterval\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«ãƒ‡ãƒ¼ã‚¿åž‹\"tinterval\"ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" +"ã“ã®\"tinterval\"åž‹ã¯PostgreSQLãƒãƒ¼ã‚¸ãƒ§ãƒ³12ã§ã¯å‰Šé™¤ã•れã¦ã„ã¾ã™ã€ãã®ãŸã‚\n" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点ã§ã¯ã‚¢ãƒƒãƒ—グレードã§ãã¾ã›ã‚“。å•題ã®åˆ—を削除ã™ã‚‹ã‹ã€\n" +"ä»–ã®ãƒ‡ãƒ¼ã‚¿åž‹ã«å¤‰æ›´ã—ãŸå¾Œã«ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n" + +#: check.c:345 +#, c-format +msgid "Checking data type usage" +msgstr "データ型ã®ä½¿ç”¨ã‚’確èªã—ã¦ã„ã¾ã™" + +#: check.c:480 +#, c-format +msgid "failed check: %s" +msgstr "å•題を検出ã—ãŸé …ç›®: %s" + +#: check.c:483 +msgid "A list of the problem columns is in the file:" +msgstr "å•題ã®åˆ—ã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™:" + +#: check.c:495 check.c:963 check.c:1136 check.c:1251 check.c:1345 check.c:1473 +#: check.c:1549 check.c:1613 check.c:1686 check.c:1865 check.c:1884 +#: check.c:1953 check.c:2005 file.c:378 file.c:415 function.c:189 option.c:493 +#: version.c:79 version.c:177 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: check.c:522 +#, c-format +msgid "Data type checks failed: %s" +msgstr "å•題を検出ã—ãŸãƒ‡ãƒ¼ã‚¿åž‹ç¢ºèªé …ç›®: %s" + +#: check.c:563 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -29,7 +261,7 @@ msgstr "" "å…ƒã®å®Ÿè¡Œä¸­ã‚µãƒ¼ãƒãƒ¼ã®ä¸€è²«æ€§ãƒã‚§ãƒƒã‚¯ã‚’実行ã—ã¦ã„ã¾ã™ã€‚\n" "--------------------------------------------------" -#: check.c:75 +#: check.c:569 #, c-format msgid "" "Performing Consistency Checks\n" @@ -38,7 +270,7 @@ msgstr "" "æ•´åˆæ€§ãƒã‚§ãƒƒã‚¯ã‚’実行ã—ã¦ã„ã¾ã™ã€‚\n" "-----------------------------" -#: check.c:221 +#: check.c:718 #, c-format msgid "" "\n" @@ -47,7 +279,7 @@ msgstr "" "\n" "* クラスタã¯äº’æ›æ€§ãŒã‚りã¾ã™ *" -#: check.c:229 +#: check.c:726 #, c-format msgid "" "\n" @@ -58,7 +290,7 @@ msgstr "" "ã“ã®å¾Œpg_upgradeãŒå¤±æ•—ã—ãŸå ´åˆã¯ã€ç¶šã‘ã‚‹å‰ã«æ–°ã—ã„クラスタを\n" "initdbã§å†ä½œæˆã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: check.c:270 +#: check.c:767 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -69,7 +301,7 @@ msgstr "" "新サーãƒãƒ¼ã‚’èµ·å‹•ã—ãŸå¾Œã€ä»¥ä¸‹ã‚’行ã†ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:276 +#: check.c:773 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -78,7 +310,7 @@ msgstr "" "ã“ã®ã‚¹ã‚¯ãƒªãƒ—トを実行ã™ã‚‹ã¨ã€æ—§ã‚¯ãƒ©ã‚¹ã‚¿ã®ãƒ‡ãƒ¼ã‚¿ãƒ•ァイルãŒå‰Šé™¤ã•れã¾ã™:\n" " %s" -#: check.c:281 +#: check.c:778 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -91,57 +323,57 @@ msgstr "" "ファイルを削除ã™ã‚‹ãŸã‚ã®ã‚¹ã‚¯ãƒªãƒ—トを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ å¤ã„\n" "クラスタã®å†…å®¹ã¯æ‰‹å‹•ã§å‰Šé™¤ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: check.c:293 +#: check.c:790 #, c-format msgid "Checking cluster versions" msgstr "クラスタã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’確èªã—ã¦ã„ã¾ã™" -#: check.c:305 +#: check.c:802 #, c-format msgid "This utility can only upgrade from PostgreSQL version %s and later." msgstr "ã“ã®ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã§ã¯PostgreSQLãƒãƒ¼ã‚¸ãƒ§ãƒ³%s以é™ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‹ã‚‰ã®ã¿ã‚¢ãƒƒãƒ—グレードã§ãã¾ã™ã€‚" -#: check.c:310 +#: check.c:807 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s." msgstr "ã“ã®ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã¯ã€PostgreSQLãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã«ã®ã¿ã‚¢ãƒƒãƒ—グレードã§ãã¾ã™ã€‚" -#: check.c:319 +#: check.c:816 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions." msgstr "ã“ã®ãƒ¦ãƒ¼ãƒ†ã‚£ãƒªãƒ†ã‚£ã¯ PostgreSQL ã®éŽåŽ»ã®ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ãƒ€ã‚¦ãƒ³ã‚°ãƒ¬ãƒ¼ãƒ‰ã™ã‚‹ç”¨é€”ã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。" -#: check.c:324 +#: check.c:821 #, c-format msgid "Old cluster data and binary directories are from different major versions." msgstr "旧クラスタã®ãƒ‡ãƒ¼ã‚¿ã¨ãƒã‚¤ãƒŠãƒªã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ç•°ãªã‚‹ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚‚ã®ã§ã™ã€‚" -#: check.c:327 +#: check.c:824 #, c-format msgid "New cluster data and binary directories are from different major versions." msgstr "新クラスタã®ãƒ‡ãƒ¼ã‚¿ã¨ãƒã‚¤ãƒŠãƒªã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ç•°ãªã‚‹ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚‚ã®ã§ã™ã€‚" -#: check.c:342 +#: check.c:839 #, c-format msgid "When checking a live server, the old and new port numbers must be different." msgstr "稼åƒä¸­ã®ã‚µãƒ¼ãƒãƒ¼ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹å ´åˆã€æ–°æ—§ã®ãƒãƒ¼ãƒˆç•ªå·ãŒç•°ãªã£ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: check.c:362 +#: check.c:859 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" msgstr "新クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%s\"ãŒç©ºã§ã¯ã‚りã¾ã›ã‚“: リレーション\"%s.%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ" -#: check.c:385 +#: check.c:882 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "æ–°ã—ã„クラスタã®ãƒ†ãƒ¼ãƒ–ル空間ディレクトリを確èªã—ã¦ã„ã¾ã™" -#: check.c:396 +#: check.c:893 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "æ–°ã—ã„クラスタã®ãƒ†ãƒ¼ãƒ–ル空間ディレクトリã¯ã™ã§ã«å­˜åœ¨ã—ã¾ã™: \"%s\"" -#: check.c:429 +#: check.c:926 #, c-format msgid "" "\n" @@ -150,7 +382,7 @@ msgstr "" "\n" "警告: æ–°ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæ—§ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ã¤ã¾ã‚Š %sã®ä¸­ã«ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: check.c:453 +#: check.c:950 #, c-format msgid "" "\n" @@ -159,61 +391,53 @@ msgstr "" "\n" "警告: ユーザー定義テーブル空間ã®å ´æ‰€ãŒãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ã¤ã¾ã‚Š %s ã®ä¸­ã«ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“。" -#: check.c:463 +#: check.c:960 #, c-format msgid "Creating script to delete old cluster" msgstr "旧クラスタを削除ã™ã‚‹ã‚¹ã‚¯ãƒªãƒ—トを作æˆã—ã¦ã„ã¾ã™" -#: check.c:466 check.c:639 check.c:755 check.c:850 check.c:979 check.c:1056 -#: check.c:1299 check.c:1373 file.c:339 function.c:163 option.c:476 -#: version.c:116 version.c:292 version.c:426 +#: check.c:1014 #, c-format -msgid "could not open file \"%s\": %s" -msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not add execute permission to file \"%s\": %m" +msgstr "ファイル\"%s\"ã«å®Ÿè¡Œæ¨©é™ã‚’追加ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: check.c:517 -#, c-format -msgid "could not add execute permission to file \"%s\": %s" -msgstr "ファイル\"%s\"ã«å®Ÿè¡Œæ¨©é™ã‚’追加ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" - -#: check.c:537 +#: check.c:1034 #, c-format msgid "Checking database user is the install user" msgstr "データベースユーザーãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‹ã©ã†ã‹ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™" -#: check.c:553 +#: check.c:1050 #, c-format msgid "database user \"%s\" is not the install user" msgstr "データベースユーザー\"%s\"ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã§ã¯ã‚りã¾ã›ã‚“" -#: check.c:564 +#: check.c:1061 #, c-format msgid "could not determine the number of users" msgstr "ユーザー数を特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: check.c:572 +#: check.c:1069 #, c-format msgid "Only the install user can be defined in the new cluster." msgstr "新クラスタ内ã§å®šç¾©ã§ãã‚‹ã®ã¯ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã¿ã§ã™ã€‚" -#: check.c:601 +#: check.c:1098 #, c-format msgid "Checking database connection settings" msgstr "データベース接続ã®è¨­å®šã‚’確èªã—ã¦ã„ã¾ã™" -#: check.c:627 +#: check.c:1124 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false" msgstr "template0 ã«ã¯æŽ¥ç¶šã‚’許å¯ã—ã¦ã¯ãªã‚Šã¾ã›ã‚“。ã™ãªã‚ã¡ã€pg_database.datallowconn 㯠false ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: check.c:654 check.c:775 check.c:873 check.c:999 check.c:1076 check.c:1135 -#: check.c:1196 check.c:1224 check.c:1254 check.c:1313 check.c:1394 -#: function.c:185 version.c:192 version.c:232 version.c:378 +#: check.c:1150 check.c:1270 check.c:1367 check.c:1492 check.c:1568 +#: check.c:1626 check.c:1706 check.c:1897 check.c:2022 function.c:210 #, c-format msgid "fatal" msgstr "致命的" -#: check.c:655 +#: check.c:1151 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -228,31 +452,31 @@ msgstr "" "pg_database.datallowconnãŒtrueã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯\n" "pg_database.datallowconnãŒfalseã¨ãªã£ã¦ã„ã‚‹template0以外ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãŒ\n" "存在ã—ã¦ã„ã¾ã™ã€‚template0以外ã®ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¸ã®æŽ¥ç¶šã‚’許å¯ã™ã‚‹ã‹ã€æŽ¥ç¶šãŒ\n" -"許å¯ã•れãªã„データベースをã™ã¹ã¦å‰Šé™¤ã™ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。å•題ã®ã‚るデータベースã®\n" +"許å¯ã•れãªã„データベースを削除ã™ã‚‹ã“ã¨ã‚’検討ã—ã¦ãã ã•ã„。å•題ã®ã‚るデータベースã®\n" "一覧ãŒä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™:\n" " %s" -#: check.c:680 +#: check.c:1176 #, c-format msgid "Checking for prepared transactions" msgstr "準備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™" -#: check.c:689 +#: check.c:1185 #, c-format msgid "The source cluster contains prepared transactions" msgstr "ç§»è¡Œå…ƒã‚¯ãƒ©ã‚¹ã‚¿ã«æº–備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã™" -#: check.c:691 +#: check.c:1187 #, c-format msgid "The target cluster contains prepared transactions" msgstr "ç§»è¡Œå…ˆã‚¯ãƒ©ã‚¹ã‚¿ã«æº–備済ã¿ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã™" -#: check.c:716 +#: check.c:1212 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "bigint を渡ã™éš›ã«ãƒŸã‚¹ãƒžãƒƒãƒãŒç™ºç”Ÿã™ã‚‹ contrib/isn ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™" -#: check.c:776 +#: check.c:1271 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -272,12 +496,12 @@ msgstr "" "å•題ã®ã‚る関数ã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™:\n" " %s" -#: check.c:798 +#: check.c:1293 #, c-format msgid "Checking for user-defined postfix operators" msgstr "ユーザー定義ã®å¾Œç½®æ¼”ç®—å­ã‚’確èªã—ã¦ã„ã¾ã™" -#: check.c:874 +#: check.c:1368 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -292,12 +516,12 @@ msgstr "" "以下ã®ãƒ•ァイルã«ãƒ¦ãƒ¼ã‚¶ãƒ¼å®šç¾©å¾Œç½®æ¼”ç®—å­ã®ä¸€è¦§ãŒã‚りã¾ã™:\n" " %s" -#: check.c:898 +#: check.c:1392 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "éžäº’æ›ã®å¤šæ…‹é–¢æ•°ã‚’確èªã—ã¦ã„ã¾ã™" -#: check.c:1000 +#: check.c:1493 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -315,12 +539,12 @@ msgstr "" "å•題ã¨ãªã‚‹ã‚ªãƒ–ジェクトã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™:\n" " %s" -#: check.c:1024 +#: check.c:1517 #, c-format msgid "Checking for tables WITH OIDS" msgstr "WITH OIDS宣言ã•れãŸãƒ†ãƒ¼ãƒ–ルをãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™" -#: check.c:1077 +#: check.c:1569 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -335,100 +559,12 @@ msgstr "" "以下ã®ãƒ•ァイルã«ã“ã®å•題を抱ãˆã‚‹ãƒ†ãƒ¼ãƒ–ルã®ä¸€è¦§ãŒã‚りã¾ã™:\n" " %s" -#: check.c:1105 -#, c-format -msgid "Checking for system-defined composite types in user tables" -msgstr "ユーザーテーブル内ã®ã‚·ã‚¹ãƒ†ãƒ å®šç¾©è¤‡åˆåž‹ã‚’確èªã—ã¦ã„ã¾ã™" - -#: check.c:1136 -#, c-format -msgid "" -"Your installation contains system-defined composite type(s) in user tables.\n" -"These type OIDs are not stable across PostgreSQL versions,\n" -"so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿å†…ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«ã¯ã€ã‚·ã‚¹ãƒ†ãƒ å®šç¾©ã®è¤‡åˆãƒ‡ãƒ¼ã‚¿åž‹ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" -"ã“れらã®ãƒ‡ãƒ¼ã‚¿åž‹ã®OIDã¯PostgreSQLã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³é–“ã«ã‚ãŸã£ã¦ä¸å¤‰ã§ã¯ãªã„ãŸã‚ã€\n" -"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点ã§ã¯ã‚¢ãƒƒãƒ—グレードã§ãã¾ã›ã‚“。å•題ã®åˆ—を削除ã—ãŸã®ã¡ã«\n" -"アップグレードをå†å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n" -"å•題ã®ã‚る列ã®ä¸€è¦§ã¯ã€ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™: \n" -" %s" - -#: check.c:1164 -#, c-format -msgid "Checking for reg* data types in user tables" -msgstr "ユーザーテーブル内㮠reg * データ型をãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™" - -#: check.c:1197 -#, c-format -msgid "" -"Your installation contains one of the reg* data types in user tables.\n" -"These data types reference system OIDs that are not preserved by\n" -"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«reg*データ型ã®ã²ã¨ã¤ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" -"ã“れらã®ãƒ‡ãƒ¼ã‚¿åž‹ã¯ã‚·ã‚¹ãƒ†ãƒ OIDã‚’å‚ç…§ã—ã¾ã™ãŒã€ã“れ㯠pg_upgradeã§ã¯\n" -"ä¿å­˜ã•れãªã„ãŸã‚ã€ç¾æ™‚点ã§ã¯ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’アップグレードã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。\n" -"å•題ã®åˆ—を削除ã—ãŸã®ã¡ã€ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n" -"å•題ã®ã‚る列ã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™:\n" -" %s" - -#: check.c:1218 -#, c-format -msgid "Checking for incompatible \"aclitem\" data type in user tables" -msgstr "ユーザーテーブル内ã®éžäº’æ›ã®aclitemデータ型を確èªã—ã¦ã„ã¾ã™" - -#: check.c:1225 -#, c-format -msgid "" -"Your installation contains the \"aclitem\" data type in user tables.\n" -"The internal format of \"aclitem\" changed in PostgreSQL version 16\n" -"so this cluster cannot currently be upgraded. You can drop the\n" -"problem columns and restart the upgrade. A list of the problem\n" -"columns is in the file:\n" -" %s" -msgstr "" -"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«\"aclitem\"データ型ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" -"ã“ã®åž‹ã®å†…部フォーマットã¯PostgreSQL ãƒãƒ¼ã‚¸ãƒ§ãƒ³16ã§å¤‰æ›´ã•れã¦ã„ã‚‹ãŸã‚ã€\n" -"ç¾æ™‚点ã§ã¯ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’アップグレードã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。\n" -"å•題ã®åˆ—を削除ã—ãŸã®ã¡ã€ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n" -"å•題ã®ã‚る列ã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™:\n" -" %s" - -#: check.c:1246 -#, c-format -msgid "Checking for incompatible \"jsonb\" data type" -msgstr "äº’æ›æ€§ã®ãªã„\"jsonb\"データ型をãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™" - -#: check.c:1255 -#, c-format -msgid "" -"Your installation contains the \"jsonb\" data type in user tables.\n" -"The internal format of \"jsonb\" changed during 9.4 beta so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«\"jsonb\"データ型ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" -"ã“ã®åž‹ã®å†…部フォーマットã¯9.4ベータã®é–“ã«å¤‰æ›´ã•れã¦ã„ã‚‹ãŸã‚ã€ç¾æ™‚点ã§ã¯ã“ã®\n" -"クラスタをアップグレードã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。\n" -"å•題ã®åˆ—を削除ã—ãŸã®ã¡ã€ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n" -"å•題ã®ã‚る列ã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™:\n" -" %s" - -#: check.c:1282 +#: check.c:1596 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "'pg_' ã§å§‹ã¾ã‚‹ãƒ­ãƒ¼ãƒ«ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™" -#: check.c:1314 +#: check.c:1627 #, c-format msgid "" "Your installation contains roles starting with \"pg_\".\n" @@ -444,12 +580,12 @@ msgstr "" "\"pg_\"ã§å§‹ã¾ã‚‹ãƒ­ãƒ¼ãƒ«ã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™:\n" " %s" -#: check.c:1334 +#: check.c:1647 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "ユーザー定義ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°å¤‰æ›ã‚’確èªã—ã¦ã„ã¾ã™" -#: check.c:1395 +#: check.c:1707 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -467,12 +603,91 @@ msgstr "" "ユーザー定義ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°å¤‰æ›ã®ä¸€è¦§ã¯ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™:\n" " %s" -#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508 +#: check.c:1746 #, c-format -msgid "could not get control data using %s: %s" -msgstr "%s ã§åˆ¶å¾¡æƒ…å ±ãŒå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚: %s" +msgid "Checking for new cluster logical replication slots" +msgstr "æ–°ã—ã„クラスタã®è«–ç†ãƒ¬ãƒ—リケーションスロットを確èªã—ã¦ã„ã¾ã™" + +#: check.c:1754 +#, c-format +msgid "could not count the number of logical replication slots" +msgstr "è«–ç†ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ãƒ­ãƒƒãƒˆã®æ•°ã‚’æ•°ãˆã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ" -#: controldata.c:140 +#: check.c:1759 +#, c-format +msgid "expected 0 logical replication slots but found %d" +msgstr "è«–ç†ãƒ¬ãƒ—リケーションスロット数ã¯0ã§ã‚ã‚‹ã“ã¨ã‚’期待ã—ã¦ã„ã¾ã—ãŸãŒã€%d個ã‚りã¾ã—ãŸ" + +#: check.c:1769 check.c:1820 +#, c-format +msgid "could not determine parameter settings on new cluster" +msgstr "新クラスタ上ã®ãƒ‘ラメータ設定を決定ã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: check.c:1774 +#, c-format +msgid "\"wal_level\" must be \"logical\" but is set to \"%s\"" +msgstr "\"wal_level\"ã¯\"logical\"ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“ãŒ\"%s\"ã«è¨­å®šã•れã¦ã„ã¾ã™" + +#: check.c:1780 +#, c-format +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of logical replication slots (%d) on the old cluster" +msgstr "\"max_replication_slots\" (%d) ã¯æ—§ã‚¯ãƒ©ã‚¹ã‚¿ã«ãŠã‘ã‚‹è«–ç†ãƒ¬ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚¹ãƒ­ãƒƒãƒˆã®æ•°(%d)以上ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#: check.c:1812 +#, c-format +msgid "Checking for new cluster configuration for subscriptions" +msgstr "æ–°ã—ã„ã‚¯ãƒ©ã‚¹ã‚¿ã®æ§‹æˆã®ã‚µãƒ–スクリプションを確èªã—ã¦ã„ã¾ã™" + +#: check.c:1824 +#, c-format +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of subscriptions (%d) on the old cluster" +msgstr "\"max_replication_slots\" (%d) ã¯æ—§ã‚¯ãƒ©ã‚¹ã‚¿ã«ãŠã‘ã‚‹ã‚µãƒ–ã‚¹ã‚¯ãƒªãƒ—ã‚·ãƒ§ãƒ³ã®æ•°(%d)以上ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#: check.c:1846 +#, c-format +msgid "Checking for valid logical replication slots" +msgstr "有効ãªè«–ç†ãƒ¬ãƒ—リケーションスロットを確èªã—ã¦ã„ã¾ã™" + +#: check.c:1898 +#, c-format +msgid "" +"Your installation contains logical replication slots that cannot be upgraded.\n" +"You can remove invalid slots and/or consume the pending WAL for other slots,\n" +"and then restart the upgrade.\n" +"A list of the problematic slots is in the file:\n" +" %s" +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯ã‚¢ãƒƒãƒ—グレードã§ããªã„è«–ç†ãƒ¬ãƒ—リケーションスロットãŒã‚りã¾ã™ã€‚\n" +"無効ãªã‚¹ãƒ­ãƒƒãƒˆã‚’削除ã™ã‚‹ã‹ã€ä»–ã®ã‚¹ãƒ­ãƒƒãƒˆã§ä¿ç•™ä¸­ã®WALを消費ã—ã¦ã‹ã‚‰ã€\n" +"アップグレードをå†å®Ÿè¡Œã—ã¦ãã ã•ã„。\n" +"å•題ã®ã‚る列ã®ä¸€è¦§ã¯ã€ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™: \n" +" %s" + +#: check.c:1922 +#, c-format +msgid "Checking for subscription state" +msgstr "サブスクリプション状態を確èªã—ã¦ã„ã¾ã™" + +#: check.c:2023 +#, c-format +msgid "" +"Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n" +"You can allow the initial sync to finish for all relations and then restart the upgrade.\n" +"A list of the problematic subscriptions is in the file:\n" +" %s" +msgstr "" +"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã«ã¯ã€èµ·æºãŒãªã„ã‹ã€i(åˆæœŸåŒ–中)ã‚„ r(準備完了)ã®çŠ¶æ…‹ã«ãªã„\n" +"リレーションをå«ã‚€ã‚µãƒ–スクリプションãŒã‚りã¾ã™ã€‚\n" +"å…¨ã¦ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã§åˆæœŸåŒæœŸã‚’完了ã•ã›ãŸå¾Œã«ã‚¢ãƒƒãƒ—グレードをå†é–‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™\n" +"å•題ã®ã‚るサブスクリプションã®ä¸€è¦§ã¯ã€ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™: \n" +" %s" + +#: controldata.c:129 controldata.c:199 +#, c-format +msgid "could not get control data using %s: %m" +msgstr "%sã§åˆ¶å¾¡æƒ…å ±ãŒå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: controldata.c:139 #, c-format msgid "%d: database cluster state problem" msgstr "%d: データベースクラスタã®çŠ¶æ…‹ç•°å¸¸" @@ -489,13 +704,18 @@ msgstr "移行先クラスタã¯ãƒªã‚«ãƒãƒªãƒ¢ãƒ¼ãƒ‰ä¸­ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ #: controldata.c:165 #, c-format -msgid "The source cluster was not shut down cleanly." -msgstr "移行元クラスタã¯ã‚¯ãƒªãƒ¼ãƒ³ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•れã¦ã„ã¾ã›ã‚“。" +msgid "The source cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "移行元クラスタã¯ã‚¯ãƒªãƒ¼ãƒ³ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•れã¦ã„ã¾ã›ã‚“ã€çŠ¶æ…‹ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«å ±å‘Šã•れã¦ã„ã¾ã™: \"%s\"" #: controldata.c:167 #, c-format -msgid "The target cluster was not shut down cleanly." -msgstr "移行先クラスタã¯ã‚¯ãƒªãƒ¼ãƒ³ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•れã¦ã„ã¾ã›ã‚“。" +msgid "The target cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "移行先クラスタã¯ã‚¯ãƒªãƒ¼ãƒ³ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã•れã¦ã„ã¾ã›ã‚“ã€çŠ¶æ…‹ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«å ±å‘Šã•れã¦ã„ã¾ã™: \"%s\"" + +#: controldata.c:175 controldata.c:507 +#, c-format +msgid "could not get control data using %s: %s" +msgstr "%s ã§åˆ¶å¾¡æƒ…å ±ãŒå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚: %s" #: controldata.c:181 #, c-format @@ -507,139 +727,139 @@ msgstr "移行元クラスタã«ã‚¯ãƒ©ã‚¹ã‚¿çŠ¶æ…‹æƒ…å ±ãŒã‚りã¾ã›ã‚“:" msgid "The target cluster lacks cluster state information:" msgstr "移行先クラスタã«ã‚¯ãƒ©ã‚¹ã‚¿çŠ¶æ…‹æƒ…å ±ãŒã‚りã¾ã›ã‚“:" -#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554 -#: relfilenumber.c:231 server.c:34 util.c:337 +#: controldata.c:213 dump.c:50 exec.c:118 pg_upgrade.c:555 pg_upgrade.c:595 +#: pg_upgrade.c:944 relfilenumber.c:233 server.c:34 util.c:337 #, c-format msgid "%s" msgstr "%s" -#: controldata.c:221 +#: controldata.c:220 #, c-format msgid "%d: pg_resetwal problem" msgstr "%d: pg_resetwal ã§å•題発生" -#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263 -#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315 -#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359 -#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388 -#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432 -#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476 -#: controldata.c:487 controldata.c:498 +#: controldata.c:230 controldata.c:240 controldata.c:251 controldata.c:262 +#: controldata.c:273 controldata.c:292 controldata.c:303 controldata.c:314 +#: controldata.c:325 controldata.c:336 controldata.c:347 controldata.c:358 +#: controldata.c:361 controldata.c:365 controldata.c:375 controldata.c:387 +#: controldata.c:398 controldata.c:409 controldata.c:420 controldata.c:431 +#: controldata.c:442 controldata.c:453 controldata.c:464 controldata.c:475 +#: controldata.c:486 controldata.c:497 #, c-format msgid "%d: controldata retrieval problem" msgstr "%d: 制御情報ã®å–å¾—ã§å•題発生" -#: controldata.c:579 +#: controldata.c:578 #, c-format msgid "The source cluster lacks some required control information:" msgstr "移行元クラスタã«å¿…è¦ãªåˆ¶å¾¡æƒ…å ±ã®ä¸€éƒ¨ãŒã‚りã¾ã›ã‚“:" -#: controldata.c:582 +#: controldata.c:581 #, c-format msgid "The target cluster lacks some required control information:" msgstr "移行先クラスタã«å¿…è¦ãªåˆ¶å¾¡æƒ…å ±ã®ä¸€éƒ¨ãŒã‚りã¾ã›ã‚“:" -#: controldata.c:585 +#: controldata.c:584 #, c-format msgid " checkpoint next XID" msgstr " ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã‘る次ã®XID" -#: controldata.c:588 +#: controldata.c:587 #, c-format msgid " latest checkpoint next OID" msgstr " 最新ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã‘る次ã®OID" -#: controldata.c:591 +#: controldata.c:590 #, c-format msgid " latest checkpoint next MultiXactId" msgstr " 最新ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã‘る次ã®MultiXactId" -#: controldata.c:595 +#: controldata.c:594 #, c-format msgid " latest checkpoint oldest MultiXactId" msgstr " 最新ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã‘る最å¤ã®MultiXactId" -#: controldata.c:598 +#: controldata.c:597 #, c-format msgid " latest checkpoint oldestXID" msgstr " 最新ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã‘る最å¤ã®XID" -#: controldata.c:601 +#: controldata.c:600 #, c-format msgid " latest checkpoint next MultiXactOffset" msgstr " 最新ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã«ãŠã‘る次ã®MultiXactOffset" -#: controldata.c:604 +#: controldata.c:603 #, c-format msgid " first WAL segment after reset" msgstr " ãƒªã‚»ãƒƒãƒˆå¾Œã®æœ€åˆã®WALセグメント" -#: controldata.c:607 +#: controldata.c:606 #, c-format msgid " float8 argument passing method" msgstr " float8引数ã®å¼•ãæ¸¡ã—方法" -#: controldata.c:610 +#: controldata.c:609 #, c-format msgid " maximum alignment" msgstr " 最大アラインメント" -#: controldata.c:613 +#: controldata.c:612 #, c-format msgid " block size" msgstr " ブロックサイズ" -#: controldata.c:616 +#: controldata.c:615 #, c-format msgid " large relation segment size" msgstr " 大ããªãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã®ã‚µã‚¤ã‚º" -#: controldata.c:619 +#: controldata.c:618 #, c-format msgid " WAL block size" msgstr " WALã®ãƒ–ロックサイズ" -#: controldata.c:622 +#: controldata.c:621 #, c-format msgid " WAL segment size" msgstr " WALã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚º" -#: controldata.c:625 +#: controldata.c:624 #, c-format msgid " maximum identifier length" msgstr " 識別å­ã®æœ€å¤§é•·" -#: controldata.c:628 +#: controldata.c:627 #, c-format msgid " maximum number of indexed columns" msgstr " ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å¯¾è±¡ã‚«ãƒ©ãƒ ã®æœ€å¤§æ•°" -#: controldata.c:631 +#: controldata.c:630 #, c-format msgid " maximum TOAST chunk size" msgstr " 最大ã®TOASTãƒãƒ£ãƒ³ã‚¯ã‚µã‚¤ã‚º" -#: controldata.c:635 +#: controldata.c:634 #, c-format msgid " large-object chunk size" msgstr " ラージオブジェクトã®ãƒãƒ£ãƒ³ã‚¯ã‚µã‚¤ã‚º" -#: controldata.c:638 +#: controldata.c:637 #, c-format msgid " dates/times are integers?" msgstr " 日付/æ™‚é–“ãŒæ•´æ•°?" -#: controldata.c:642 +#: controldata.c:641 #, c-format msgid " data checksum version" msgstr " データãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³" -#: controldata.c:644 +#: controldata.c:643 #, c-format msgid "Cannot continue without required control information, terminating" msgstr "å¿…è¦ãªåˆ¶å¾¡æƒ…å ±ãŒãªã„ã®ã§ç¶šè¡Œã§ãã¾ã›ã‚“。終了ã—ã¾ã™" -#: controldata.c:659 +#: controldata.c:658 #, c-format msgid "" "old and new pg_controldata alignments are invalid or do not match.\n" @@ -648,77 +868,77 @@ msgstr "" "æ–°æ—§ã®pg_controldataã®ã‚¢ãƒ©ã‚¤ãƒ³ãƒ¡ãƒ³ãƒˆãŒä¸æ­£ã§ã‚ã‚‹ã‹ã‹ã¾ãŸã¯ä¸€è‡´ã—ã¾ã›ã‚“\n" "一方ã®ã‚¯ãƒ©ã‚¹ã‚¿ãŒ32ビットã§ã€ä»–æ–¹ãŒ64ビットã§ã‚ã‚‹å¯èƒ½æ€§ãŒé«˜ã„ã§ã™" -#: controldata.c:663 +#: controldata.c:662 #, c-format msgid "old and new pg_controldata block sizes are invalid or do not match" msgstr "æ–°æ—§ã® pg_controldata ã«ãŠã‘ã‚‹ãƒ–ãƒ­ãƒƒã‚¯ã‚µã‚¤ã‚ºãŒæœ‰åйã§ãªã„ã‹ã¾ãŸã¯ä¸€è‡´ã—ã¾ã›ã‚“" -#: controldata.c:666 +#: controldata.c:665 #, c-format msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match" msgstr "æ–°æ—§ã® pg_controldata ã«ãŠã‘ã‚‹ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã®æœ€å¤§ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚ºãŒæœ‰åйã§ãªã„ã‹ä¸€è‡´ã—ã¾ã›ã‚“" -#: controldata.c:669 +#: controldata.c:668 #, c-format msgid "old and new pg_controldata WAL block sizes are invalid or do not match" msgstr "æ–°æ—§ã® pg_controldata ã«ãŠã‘ã‚‹ WAL ãƒ–ãƒ­ãƒƒã‚¯ã‚µã‚¤ã‚ºãŒæœ‰åйã§ãªã„ã‹ä¸€è‡´ã—ã¾ã›ã‚“" -#: controldata.c:672 +#: controldata.c:671 #, c-format msgid "old and new pg_controldata WAL segment sizes are invalid or do not match" msgstr "æ–°æ—§ã® pg_controldata ã«ãŠã‘ã‚‹WALã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚ºãŒæœ‰åйã§ãªã„ã‹ä¸€è‡´ã—ã¾ã›ã‚“" -#: controldata.c:675 +#: controldata.c:674 #, c-format msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match" msgstr "æ–°æ—§ã® pg_controldata ã«ãŠã‘る識別å­ã®æœ€å¤§é•·ãŒæœ‰åйã§ãªã„ã‹ä¸€è‡´ã—ã¾ã›ã‚“" -#: controldata.c:678 +#: controldata.c:677 #, c-format msgid "old and new pg_controldata maximum indexed columns are invalid or do not match" msgstr "æ–°æ—§ã® pg_controldata ã«ãŠã‘るインデックス付ãåˆ—ã®æœ€å¤§æ•°ãŒæœ‰åйã§ãªã„ã‹ä¸€è‡´ã—ã¾ã›ã‚“" -#: controldata.c:681 +#: controldata.c:680 #, c-format msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match" msgstr "æ–°æ—§ã® pg_controldata ã«ãŠã‘ã‚‹TOASTãƒãƒ£ãƒ³ã‚¯ã‚µã‚¤ã‚ºã®æœ€å¤§å€¤ãŒæœ‰åйã§ãªã„ã‹ä¸€è‡´ã—ã¾ã›ã‚“" -#: controldata.c:686 +#: controldata.c:685 #, c-format msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match" msgstr "æ–°æ—§ã® pg_controldata ã«ãŠã‘るラージオブジェクトã®ãƒãƒ£ãƒ³ã‚¯ã‚µã‚¤ã‚ºãŒæœ‰åйã§ãªã„ã‹ã¾ãŸã¯ä¸€è‡´ã—ã¾ã›ã‚“" -#: controldata.c:689 +#: controldata.c:688 #, c-format msgid "old and new pg_controldata date/time storage types do not match" msgstr "æ–°æ—§ã® pg_controldata ã«ãŠã‘る日付/時刻型データã®ä¿å­˜ãƒã‚¤ãƒˆæ•°ãŒä¸€è‡´ã—ã¾ã›ã‚“" -#: controldata.c:702 +#: controldata.c:701 #, c-format msgid "old cluster does not use data checksums but the new one does" msgstr "旧クラスタã§ã¯ãƒ‡ãƒ¼ã‚¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’使用ã—ã¦ã„ã¾ã›ã‚“ãŒã€æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ä½¿ç”¨ã—ã¦ã„ã¾ã™" -#: controldata.c:705 +#: controldata.c:704 #, c-format msgid "old cluster uses data checksums but the new one does not" msgstr "旧クラスタã§ã¯ãƒ‡ãƒ¼ã‚¿ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’使用ã—ã¦ã„ã¾ã™ãŒã€æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ä½¿ç”¨ã—ã¦ã„ã¾ã›ã‚“" -#: controldata.c:707 +#: controldata.c:706 #, c-format msgid "old and new cluster pg_controldata checksum versions do not match" msgstr "æ–°æ—§ã® pg_controldata é–“ã§ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒä¸€è‡´ã—ã¾ã›ã‚“" -#: controldata.c:718 +#: controldata.c:717 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "æ—§ã® global/pg_control ã« \".old\" サフィックスを追加ã—ã¦ã„ã¾ã™" -#: controldata.c:723 +#: controldata.c:722 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: controldata.c:727 +#: controldata.c:726 #, c-format msgid "" "\n" @@ -743,27 +963,32 @@ msgstr "グローãƒãƒ«ã‚ªãƒ–ジェクトã®ãƒ€ãƒ³ãƒ—を作æˆã—ã¦ã„ã¾ã™" msgid "Creating dump of database schemas" msgstr "データベーススキーマã®ãƒ€ãƒ³ãƒ—を作æˆã—ã¦ã„ã¾ã™ã€‚" -#: exec.c:47 exec.c:52 +#: exec.c:47 +#, c-format +msgid "could not get pg_ctl version data using %s: %m" +msgstr "%sã§pg_ctlã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: exec.c:51 #, c-format msgid "could not get pg_ctl version data using %s: %s" msgstr "%s ã§pg_ctlã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒ‡ãƒ¼ã‚¿ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚: %s" -#: exec.c:56 +#: exec.c:55 #, c-format msgid "could not get pg_ctl version output from %s" msgstr "%s ã‹ã‚‰pg_ctlã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³å‡ºåŠ›ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: exec.c:113 exec.c:117 +#: exec.c:112 exec.c:116 #, c-format msgid "command too long" msgstr "コマンドãŒé•·ã™ãŽã¾ã™" -#: exec.c:161 pg_upgrade.c:286 +#: exec.c:160 pg_upgrade.c:311 #, c-format msgid "could not open log file \"%s\": %m" msgstr "ロックファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: exec.c:193 +#: exec.c:192 #, c-format msgid "" "\n" @@ -772,162 +997,177 @@ msgstr "" "\n" "*失敗*" -#: exec.c:196 +#: exec.c:195 #, c-format msgid "There were problems executing \"%s\"" msgstr "" "\"%s実行ã§å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸ\n" "`1" -#: exec.c:199 +#: exec.c:198 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" "the probable cause of the failure." msgstr "ã‚りã†ã‚‹å¤±æ•—ã®åŽŸå› ã«ã¤ã„ã¦ã¯\"%s\"ã¾ãŸã¯\"%s\"ã®æœ€å¾Œã®æ•°è¡Œã‚’å‚ç…§ã—ã¦ãã ã•ã„。" -#: exec.c:204 +#: exec.c:203 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" "the probable cause of the failure." msgstr "ã‚りã†ã‚‹å¤±æ•—ã®åŽŸå› ã«ã¤ã„ã¦ã¯ã€\"%s\"ã®æœ€å¾Œã®æ•°è¡Œã‚’å‚ç…§ã—ã¦ãã ã•ã„。" -#: exec.c:219 pg_upgrade.c:296 +#: exec.c:218 pg_upgrade.c:321 #, c-format msgid "could not write to log file \"%s\": %m" msgstr "ログファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: exec.c:245 +#: exec.c:244 #, c-format -msgid "could not open file \"%s\" for reading: %s" -msgstr "ファイル\"%s\"を読ã¿å–り用ã¨ã—ã¦ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ:%s" +msgid "could not open file \"%s\" for reading: %m" +msgstr "ファイル\"%s\"を読ã¿è¾¼ã¿ç”¨ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: exec.c:272 +#: exec.c:270 #, c-format msgid "You must have read and write access in the current directory." msgstr "カレントディレクトリã«å¯¾ã—ã¦èª­ã¿æ›¸ãå¯èƒ½ãªã‚¢ã‚¯ã‚»ã‚¹æ¨©ãŒå¿…è¦ã§ã™ã€‚" -#: exec.c:325 exec.c:391 +#: exec.c:323 exec.c:389 exec.c:439 #, c-format -msgid "check for \"%s\" failed: %s" -msgstr "\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" +msgid "check for \"%s\" failed: %m" +msgstr "\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: exec.c:328 exec.c:394 +#: exec.c:326 exec.c:392 #, c-format msgid "\"%s\" is not a directory" msgstr "\"%s\"ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚りã¾ã›ã‚“" -#: exec.c:441 -#, c-format -msgid "check for \"%s\" failed: %m" -msgstr "\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã«å¤±æ•—ã—ã¾ã—ãŸ: %m" - -#: exec.c:446 +#: exec.c:444 #, c-format msgid "check for \"%s\" failed: cannot execute" msgstr "\"%s\"ã®ç¢ºèªã«å¤±æ•—ã—ã¾ã—ãŸ: 実行ã§ãã¾ã›ã‚“" -#: exec.c:456 +#: exec.c:454 #, c-format msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"" msgstr "\"%s\"ã®ç¢ºèªã«å¤±æ•—ã—ã¾ã—ãŸ: é–“é•ã£ãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³: 検出\"%s\"ã€æƒ³å®š\"%s\"" -#: file.c:43 file.c:64 +#: file.c:44 #, c-format -msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "リレーション\"%s.%s\"ã®(\"%s\"ã‹ã‚‰\"%s\"ã¸ã®)クローン中ã«ã‚¨ãƒ©ãƒ¼: %s" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "リレーション\"%s.%s\"(\"%s\"ã‹ã‚‰\"%s\"ã¸)ã®ã‚¯ãƒ­ãƒ¼ãƒ³ä¸­ã®ã‚¨ãƒ©ãƒ¼: %m" + +#: file.c:51 +#, c-format +msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "リレーション\"%s.%s\"ã®ã‚¯ãƒ­ãƒ¼ãƒ³ä¸­ã®ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: file.c:56 +#, c-format +msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "リレーション\"%s.%s\"ã®ã‚¯ãƒ­ãƒ¼ãƒ³ä¸­ã®ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: file.c:50 +#: file.c:65 #, c-format -msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s" -msgstr "リレーション\"%s.%s\"ã®ã‚¯ãƒ­ãƒ¼ãƒ³ä¸­ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s" +msgstr "リレーション\"%s.%s\"ã®(\"%s\"ã‹ã‚‰\"%s\"ã¸ã®)クローン中ã«ã‚¨ãƒ©ãƒ¼: %s" -#: file.c:55 +#: file.c:91 file.c:160 file.c:233 #, c-format -msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s" -msgstr "リレーション\"%s.%s\"ã®ã‚¯ãƒ­ãƒ¼ãƒ³ä¸­ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã®ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: file.c:90 file.c:193 +#: file.c:96 file.c:165 file.c:242 #, c-format -msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s" -msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã®ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: file.c:95 file.c:202 +#: file.c:110 file.c:266 #, c-format -msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s" -msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %m" +msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã®ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"を読ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: file.c:109 file.c:226 +#: file.c:122 file.c:344 #, c-format -msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s" -msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"を読ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %m" +msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã®ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: file.c:121 file.c:304 +#: file.c:136 #, c-format -msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s" -msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "リレーション\"%s.%s\"(\"%s\"ã‹ã‚‰\"%s\"ã¸)ã®ã‚³ãƒ”ー中ã®ã‚¨ãƒ©ãƒ¼: %m" -#: file.c:135 +#: file.c:172 #, c-format -msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "リレーション\"%s.%s\"ã®(\"%s\"ã‹ã‚‰\"%s\"ã¸ã®)コピー中ã«ã‚¨ãƒ©ãƒ¼: %s" +msgid "error while copying relation \"%s.%s\": could not copy file range from \"%s\" to \"%s\": %m" +msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã®ã‚¨ãƒ©ãƒ¼: \"%s\"ã‹ã‚‰\"%s\"ã¸ã®ãƒ•ァイルã®ç¯„囲コピーãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: file.c:154 +#: file.c:194 #, c-format -msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "リレーション\"%s.%s\"ã®(\"%s\"ã‹ã‚‰\"%s\"ã¸ã®)リンク作æˆä¸­ã«ã‚¨ãƒ©ãƒ¼: %s" +msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "リレーション\"%s.%s\"(\"%s\"ã‹ã‚‰\"%s\"ã¸)ã®ãƒªãƒ³ã‚¯ä½œæˆä¸­ã®ã‚¨ãƒ©ãƒ¼: %m" -#: file.c:197 +#: file.c:237 #, c-format -msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s" -msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"ã‚’statã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %m" +msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã®ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"ã‚’statã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: file.c:229 +#: file.c:269 #, c-format msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"" msgstr "リレーション\"%s.%s\"ã®ã‚³ãƒ”ー中ã«ã‚¨ãƒ©ãƒ¼: ファイル\"%s\"中ã«ä¸å®Œå…¨ãªãƒšãƒ¼ã‚¸ãŒã‚りã¾ã—ãŸ" -#: file.c:331 file.c:348 +#: file.c:371 file.c:387 #, c-format -msgid "could not clone file between old and new data directories: %s" -msgstr "新旧ディレクトリ間ã®ãƒ•ァイルã®ã‚¯ãƒ­ãƒ¼ãƒ³ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not clone file between old and new data directories: %m" +msgstr "新旧ディレクトリ間ã®ãƒ•ァイルã®ã‚¯ãƒ­ãƒ¼ãƒ³ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: file.c:344 +#: file.c:383 file.c:420 #, c-format -msgid "could not create file \"%s\": %s" -msgstr "ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not create file \"%s\": %m" +msgstr "ファイル\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: file.c:355 +#: file.c:393 #, c-format msgid "file cloning not supported on this platform" msgstr "ã“ã®ãƒ—ラットフォームã§ã¯ãƒ•ァイルã®ã‚¯ãƒ­ãƒ¼ãƒ³ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: file.c:372 +#: file.c:424 +#, c-format +msgid "could not copy file range between old and new data directories: %m" +msgstr "新旧ディレクトリ間ã®ãƒ•ァイルã®ç¯„囲コピーãŒã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: file.c:430 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "ã“ã®ãƒ—ラットフォームã§ã¯copy_file_rangeã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" + +#: file.c:447 #, c-format msgid "" -"could not create hard link between old and new data directories: %s\n" +"could not create hard link between old and new data directories: %m\n" "In link mode the old and new data directories must be on the same file system." msgstr "" -"æ–°æ—§ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé–“ã§ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" -"リンクモードã§ã¯ã€æ–°æ—§ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒåŒã˜ãƒ•ァイルシステム上ã«å­˜åœ¨ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" +"æ–°æ—§ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé–“ã§ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ã‚’作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" +"リンクモードã§ã¯ã€æ–°æ—§ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒåŒã˜ãƒ•ァイルシステム上ã«ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" -#: function.c:128 +#: function.c:154 #, c-format msgid "Checking for presence of required libraries" msgstr "å¿…è¦ãªãƒ©ã‚¤ãƒ–ãƒ©ãƒªã®æœ‰ç„¡ã‚’確èªã—ã¦ã„ã¾ã™" -#: function.c:165 +#: function.c:190 #, c-format msgid "could not load library \"%s\": %s" msgstr "ライブラリ\"%s\"をロードã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: function.c:176 +#: function.c:201 #, c-format msgid "In database: %s\n" msgstr "データベース: %s\n" -#: function.c:186 +#: function.c:211 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" @@ -942,47 +1182,47 @@ msgstr "" "以下ã®ãƒ•ァイルã«å…¥ã£ã¦ã„ã¾ã™:\n" " %s" -#: info.c:126 +#: info.c:128 #, c-format msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"" msgstr "データベース\"%2$s\"ã§ OID %1$u ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³åãŒä¸€è‡´ã—ã¾ã›ã‚“: å…ƒã®åå‰ \"%3$s.%4$s\"ã€æ–°ã—ã„åå‰ \"%5$s.%6$s\"" -#: info.c:146 +#: info.c:148 #, c-format msgid "Failed to match up old and new tables in database \"%s\"" msgstr "データベース\"%s\"ã§æ–°æ—§ã®ãƒ†ãƒ¼ãƒ–ルã®ç…§åˆã«å¤±æ•—ã—ã¾ã—ãŸ" -#: info.c:227 +#: info.c:229 #, c-format msgid " which is an index on \"%s.%s\"" msgstr " ã“れ㯠\"%s.%s\" 上ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã™" -#: info.c:237 +#: info.c:239 #, c-format msgid " which is an index on OID %u" msgstr " ã“れ㯠OID %u 上ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã§ã™" -#: info.c:249 +#: info.c:251 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr " ã“れ㯠\"%s.%s\" ã® TOAST テーブルã§ã™" -#: info.c:257 +#: info.c:259 #, c-format msgid " which is the TOAST table for OID %u" msgstr " ã“れ㯠OID %u ã® TOAST テーブルã§ã™" -#: info.c:261 +#: info.c:263 #, c-format msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s" msgstr "データベース\"%2$s\"ã§OID%1$uã‚’æŒã¤æ–°ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã«å¯¾å¿œã™ã‚‹ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒæ—§ã‚¯ãƒ©ã‚¹ã‚¿å†…ã«ã‚りã¾ã›ã‚“: %3$s" -#: info.c:264 +#: info.c:266 #, c-format msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s" msgstr "データベース\"%2$s\"ã§OID %1$uã‚’æŒã¤æ—§ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã«å¯¾å¿œã™ã‚‹ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒæ–°ã‚¯ãƒ©ã‚¹ã‚¿å†…ã«ã‚りã¾ã›ã‚“: %3$s" -#: info.c:289 +#: info.c:300 #, c-format msgid "" "\n" @@ -991,7 +1231,7 @@ msgstr "" "\n" "移行元データベース:" -#: info.c:291 +#: info.c:302 #, c-format msgid "" "\n" @@ -1000,82 +1240,92 @@ msgstr "" "\n" "移行先データベース:" -#: info.c:329 +#: info.c:346 #, c-format msgid "template0 not found" msgstr "template0ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: info.c:645 +#: info.c:805 +#, c-format +msgid "Database: \"%s\"" +msgstr "データベース: \"%s\"" + +#: info.c:818 +#, c-format +msgid "relname: \"%s.%s\", reloid: %u, reltblspace: \"%s\"" +msgstr "relname: \"%s.%s\": reloid: %u reltblspace: \"%s\"" + +#: info.c:832 #, c-format -msgid "Database: %s" -msgstr "データベース: %s" +msgid "Logical replication slots in the database:" +msgstr "ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®è«–ç†ãƒ¬ãƒ—リケーションスロット: " -#: info.c:657 +#: info.c:838 #, c-format -msgid "relname: %s.%s: reloid: %u reltblspace: %s" -msgstr "relname: %s.%s: reloid: %u reltblspace: %s" +msgid "slot name: \"%s\", output plugin: \"%s\", two_phase: %s" +msgstr "スロットå: \"%s\", 出力プラグイン: \"%s\", two_phase: %s" -#: option.c:101 +#: option.c:105 #, c-format msgid "%s: cannot be run as root" msgstr "%s: rootã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: option.c:168 +#: option.c:172 #, c-format msgid "invalid old port number" msgstr "䏿­£ãªæ—§ãƒãƒ¼ãƒˆç•ªå·" -#: option.c:173 +#: option.c:177 #, c-format msgid "invalid new port number" msgstr "䏿­£ãªæ–°ãƒãƒ¼ãƒˆç•ªå·" -#: option.c:203 +#: option.c:216 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "詳細ã¯\"%s --help\"ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n" -#: option.c:210 +#: option.c:223 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")" -#: option.c:213 +#: option.c:229 #, c-format msgid "Running in verbose mode" msgstr "詳細表示モードã§å®Ÿè¡Œã—ã¦ã„ã¾ã™" -#: option.c:231 +#: option.c:247 msgid "old cluster binaries reside" msgstr "旧クラスタã®ãƒã‚¤ãƒŠãƒªãŒç½®ã‹ã‚Œã¦ã„ã‚‹" -#: option.c:233 +#: option.c:249 msgid "new cluster binaries reside" msgstr "新クラスタã®ãƒã‚¤ãƒŠãƒªãŒç½®ã‹ã‚Œã¦ã„ã‚‹" -#: option.c:235 +#: option.c:251 msgid "old cluster data resides" msgstr "旧クラスタã®ãƒ‡ãƒ¼ã‚¿ãŒç½®ã‹ã‚Œã¦ã„ã‚‹" -#: option.c:237 +#: option.c:253 msgid "new cluster data resides" msgstr "新クラスタã®ãƒ‡ãƒ¼ã‚¿ãŒç½®ã‹ã‚Œã¦ã„ã‚‹" -#: option.c:239 +#: option.c:255 msgid "sockets will be created" msgstr "ソケットãŒä½œæˆã•れる" -#: option.c:256 option.c:356 +#: option.c:272 option.c:374 #, c-format msgid "could not determine current directory" msgstr "カレントディレクトリを特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: option.c:259 +#: option.c:275 #, c-format msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows" msgstr "Windowsã§ã¯ã€æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ä¸­ã§pg_upgradeを実行ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: option.c:268 +#: option.c:284 #, c-format msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" @@ -1084,12 +1334,12 @@ msgstr "" "pg_upgradeã¯ã€PostgreSQLã®ã‚¯ãƒ©ã‚¹ã‚¿ã‚’別ã®ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚¢ãƒƒãƒ—グレードã—ã¾ã™ã€‚\n" "\n" -#: option.c:269 +#: option.c:285 #, c-format msgid "Usage:\n" msgstr "ä½¿ã„æ–¹:\n" -#: option.c:270 +#: option.c:286 #, c-format msgid "" " pg_upgrade [OPTION]...\n" @@ -1098,17 +1348,17 @@ msgstr "" " pg_upgrade [オプション]...\n" "\n" -#: option.c:271 +#: option.c:287 #, c-format msgid "Options:\n" msgstr "オプション:\n" -#: option.c:272 +#: option.c:288 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" msgstr " -b, --old-bindir=BINDIR 旧クラスタã®å®Ÿè¡Œãƒ•ァイルディレクトリ\n" -#: option.c:273 +#: option.c:289 #, c-format msgid "" " -B, --new-bindir=BINDIR new cluster executable directory (default\n" @@ -1117,103 +1367,117 @@ msgstr "" " -B, --new-bindir=BINDIR 新クラスタã®å®Ÿè¡Œãƒ•ァイルディレクトリ(デフォルト\n" " ã¯pg_upgradeã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª)\n" -#: option.c:275 +#: option.c:291 #, c-format msgid " -c, --check check clusters only, don't change any data\n" msgstr " -c, --check クラスタã®ãƒã‚§ãƒƒã‚¯ã®ã¿ã€ãƒ‡ãƒ¼ã‚¿ã‚’一切変更ã—ãªã„\n" -#: option.c:276 +#: option.c:292 #, c-format msgid " -d, --old-datadir=DATADIR old cluster data directory\n" msgstr " -d, --old-datadir=DATADIR 旧クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n" -#: option.c:277 +#: option.c:293 #, c-format msgid " -D, --new-datadir=DATADIR new cluster data directory\n" msgstr " -D, --new-datadir=DATADIR 新クラスタã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n" -#: option.c:278 +#: option.c:294 #, c-format msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" msgstr " -j, --jobs 使用ã™ã‚‹åŒæ™‚実行プロセスã¾ãŸã¯ã‚¹ãƒ¬ãƒƒãƒ‰ã®æ•°\n" -#: option.c:279 +#: option.c:295 #, c-format msgid " -k, --link link instead of copying files to new cluster\n" msgstr "" " -k, --link 新クラスタã«ãƒ•ァイルをコピーã™ã‚‹ä»£ã‚りã«\n" " リンクã™ã‚‹\n" -#: option.c:280 +#: option.c:296 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync 変更ã®ãƒ‡ã‚£ã‚¹ã‚¯ã¸ã®ç¢ºå®Ÿãªæ›¸ã出ã—を待機ã—ãªã„\n" -#: option.c:281 +#: option.c:297 #, c-format msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n" msgstr " -o, --old-options=OPTIONS サーãƒãƒ¼ã«æ¸¡ã™æ—§ã‚¯ãƒ©ã‚¹ã‚¿ã®ã‚ªãƒ—ション\n" -#: option.c:282 +#: option.c:298 #, c-format msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n" msgstr " -O, --new-options=OPTIONS サーãƒãƒ¼ã«æ¸¡ã™æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã®ã‚ªãƒ—ション\n" -#: option.c:283 +#: option.c:299 #, c-format msgid " -p, --old-port=PORT old cluster port number (default %d)\n" msgstr " -p, --old-port=PORT 旧クラスタã®ãƒãƒ¼ãƒˆç•ªå·(デフォルト %d)\n" -#: option.c:284 +#: option.c:300 #, c-format msgid " -P, --new-port=PORT new cluster port number (default %d)\n" msgstr " -P, --new-port=PORT 新クラスタã®ãƒãƒ¼ãƒˆç•ªå·(デフォルト %d)\n" -#: option.c:285 +#: option.c:301 #, c-format msgid " -r, --retain retain SQL and log files after success\n" msgstr " -r, --retain SQLã¨ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ã€æˆåŠŸå¾Œã‚‚æ¶ˆã•ãšã«æ®‹ã™\n" -#: option.c:286 +#: option.c:302 #, c-format msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" msgstr "" " -s, --socketdir=DIR 使用ã™ã‚‹ã‚½ã‚±ãƒƒãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª(デフォルトã¯\n" " カレントディレクトリ)\n" -#: option.c:287 +#: option.c:303 #, c-format msgid " -U, --username=NAME cluster superuser (default \"%s\")\n" msgstr " -U, --username=NAME クラスタã®ã‚¹ãƒ¼ãƒ‘ーユーザー(デフォルト\"%s\")\n" -#: option.c:288 +#: option.c:304 #, c-format msgid " -v, --verbose enable verbose internal logging\n" msgstr " -v, --verbose 詳細ãªå†…部ログを有効化\n" -#: option.c:289 +#: option.c:305 #, c-format msgid " -V, --version display version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: option.c:290 +#: option.c:306 #, c-format msgid " --clone clone instead of copying files to new cluster\n" msgstr "" " --clone 新クラスタã«ãƒ•ァイルをコピーã™ã‚‹ä»£ã‚りã«\n" " クローンã™ã‚‹\n" -#: option.c:291 +#: option.c:307 #, c-format msgid " --copy copy files to new cluster (default)\n" msgstr " --copy 新クラスタã«ãƒ•ァイルをコピーã™ã‚‹(デフォルト)\n" -#: option.c:292 +#: option.c:308 +#, c-format +msgid " --copy-file-range copy files to new cluster with copy_file_range\n" +msgstr "" +" --copy-file-range ãƒ•ã‚¡ã‚¤ãƒ«ã®æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã¸ã®ã‚³ãƒ”ーをcopy_file_range\n" +" ã§è¡Œã†\n" + +#: option.c:309 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr "" +" --sync-method=METHOD ファイルをディスクã«åŒæœŸã•ã›ã‚‹æ–¹æ³•を指定\n" +"\n" + +#: option.c:310 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: option.c:293 +#: option.c:311 #, c-format msgid "" "\n" @@ -1228,7 +1492,7 @@ msgstr "" " 旧クラスタã®postmasterをシャットダウンã™ã‚‹\n" " 新クラスタã®postmasterをシャットダウンã™ã‚‹\n" -#: option.c:298 +#: option.c:316 #, c-format msgid "" "\n" @@ -1245,7 +1509,7 @@ msgstr "" " æ—§ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®\"bin\"ディレクトリ (-b BINDIR)\n" " æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®\"bin\"ディレクトリ(-B BINDIR)\n" -#: option.c:304 +#: option.c:322 #, c-format msgid "" "\n" @@ -1258,7 +1522,7 @@ msgstr "" " pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n" "ã¾ãŸã¯\n" -#: option.c:309 +#: option.c:327 #, c-format msgid "" " $ export PGDATAOLD=oldCluster/data\n" @@ -1273,7 +1537,7 @@ msgstr "" " $ export PGBINNEW=newCluster/bin\n" " $ pg_upgrade\n" -#: option.c:315 +#: option.c:333 #, c-format msgid "" " C:\\> set PGDATAOLD=oldCluster/data\n" @@ -1288,7 +1552,7 @@ msgstr "" " C:\\> set PGBINNEW=newCluster/bin\n" " C:\\> pg_upgrade\n" -#: option.c:321 +#: option.c:339 #, c-format msgid "" "\n" @@ -1297,12 +1561,12 @@ msgstr "" "\n" "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: option.c:322 +#: option.c:340 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: option.c:362 +#: option.c:380 #, c-format msgid "" "You must identify the directory where the %s.\n" @@ -1311,45 +1575,50 @@ msgstr "" "%sディレクトリを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚\n" "コマンドラインオプション %s ã¾ãŸã¯ç’°å¢ƒå¤‰æ•° %s を使用ã—ã¦ãã ã•ã„。" -#: option.c:415 +#: option.c:433 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "移行元クラスタã®å®Ÿéš›ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’探ã—ã¦ã„ã¾ã™" -#: option.c:417 +#: option.c:435 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "移行先クラスタã®å®Ÿéš›ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’探ã—ã¦ã„ã¾ã™" -#: option.c:430 option.c:435 +#: option.c:448 +#, c-format +msgid "could not get data directory using %s: %m" +msgstr "%sã§ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚: %m" + +#: option.c:452 #, c-format msgid "could not get data directory using %s: %s" msgstr "%s ã§ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚: %s" -#: option.c:484 +#: option.c:500 #, c-format -msgid "could not read line %d from file \"%s\": %s" -msgstr "ファイル\"%2$s\"ã®%1$d行目を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %3$s" +msgid "could not read line %d from file \"%s\": %m" +msgstr "ファイル\"%2$s\"ã®%1$d行目を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %3$m" -#: option.c:501 +#: option.c:517 #, c-format msgid "user-supplied old port number %hu corrected to %hu" msgstr "ãƒ¦ãƒ¼ã‚¶ãƒ¼æŒ‡å®šã®æ—§ãƒãƒ¼ãƒˆç•ªå·%huã¯%huã«è¨‚æ­£ã•れã¾ã—ãŸ" #: parallel.c:127 parallel.c:235 #, c-format -msgid "could not create worker process: %s" -msgstr "ワーカープロセスを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not create worker process: %m" +msgstr "ワーカープロセスを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" #: parallel.c:143 parallel.c:253 #, c-format -msgid "could not create worker thread: %s" -msgstr "ワーカースレッドを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not create worker thread: %m" +msgstr "ワーカースレッドを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" #: parallel.c:294 #, c-format -msgid "%s() failed: %s" -msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" +msgid "%s() failed: %m" +msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" #: parallel.c:298 #, c-format @@ -1358,15 +1627,15 @@ msgstr "å­ãƒ—ロセスãŒç•°å¸¸çµ‚了ã—ã¾ã—ãŸ: ステータス %d" #: parallel.c:313 #, c-format -msgid "child worker exited abnormally: %s" -msgstr "å­ãƒ¯ãƒ¼ã‚«ãƒ¼ãŒç•°å¸¸çµ‚了ã—ã¾ã—ãŸ: %s" +msgid "child worker exited abnormally: %m" +msgstr "å­ãƒ¯ãƒ¼ã‚«ãƒ¼ãŒç•°å¸¸çµ‚了ã—ã¾ã—ãŸ: %m" -#: pg_upgrade.c:107 +#: pg_upgrade.c:115 #, c-format -msgid "could not read permissions of directory \"%s\": %s" -msgstr "ディレクトリ\"%s\"ã®æ¨©é™ã‚’読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not read permissions of directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"ã®æ¨©é™ã‚’読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_upgrade.c:139 +#: pg_upgrade.c:147 #, c-format msgid "" "\n" @@ -1377,17 +1646,17 @@ msgstr "" "アップグレードを実行ã—ã¦ã„ã¾ã™ã€‚\n" "------------------" -#: pg_upgrade.c:184 +#: pg_upgrade.c:192 #, c-format msgid "Setting next OID for new cluster" msgstr "新クラスタã®ã€æ¬¡ã® OID を設定ã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:193 +#: pg_upgrade.c:216 #, c-format msgid "Sync data directory to disk" msgstr "データディレクトリをディスクã«åŒæœŸã—ã¾ã™" -#: pg_upgrade.c:205 +#: pg_upgrade.c:230 #, c-format msgid "" "\n" @@ -1398,23 +1667,23 @@ msgstr "" "アップグレードãŒå®Œäº†ã—ã¾ã—ãŸ\n" "----------------" -#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265 -#: pg_upgrade.c:283 pg_upgrade.c:294 +#: pg_upgrade.c:263 pg_upgrade.c:276 pg_upgrade.c:283 pg_upgrade.c:290 +#: pg_upgrade.c:308 pg_upgrade.c:319 #, c-format msgid "directory path for new cluster is too long" msgstr "新クラスタã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ»ãƒ‘スãŒé•·ã™ãŽã¾ã™" -#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278 +#: pg_upgrade.c:297 pg_upgrade.c:299 pg_upgrade.c:301 pg_upgrade.c:303 #, c-format msgid "could not create directory \"%s\": %m" msgstr "ディレクトリ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_upgrade.c:327 +#: pg_upgrade.c:352 #, c-format msgid "%s: could not find own program executable" msgstr "%s: 自身ã®å®Ÿè¡Œãƒ•ァイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: pg_upgrade.c:353 +#: pg_upgrade.c:378 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" @@ -1423,7 +1692,7 @@ msgstr "" "旧クラスタã§ç¨¼åƒä¸­ã®postmasterãŒã‚るよã†ã§ã™ã€‚\n" "ãã®postmasterをシャットダウンã—ãŸã®ã¡ã«ã‚„り直ã—ã¦ãã ã•ã„。" -#: pg_upgrade.c:366 +#: pg_upgrade.c:391 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" @@ -1432,81 +1701,86 @@ msgstr "" "新クラスタã§ç¨¼åƒä¸­ã®postmasterãŒã‚るよã†ã§ã™ã€‚\n" "ãã®postmasterをシャットダウンã—ãŸã®ã¡ã‚„り直ã—ã¦ãã ã•ã„。" -#: pg_upgrade.c:388 +#: pg_upgrade.c:414 #, c-format msgid "Setting locale and encoding for new cluster" msgstr "新クラスタã®ã€ãƒ­ã‚±ãƒ¼ãƒ«ã¨ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’設定ã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:450 +#: pg_upgrade.c:488 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "新クラスタ内ã®ã™ã¹ã¦ã®è¡Œã‚’分æžã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:463 +#: pg_upgrade.c:501 #, c-format msgid "Freezing all rows in the new cluster" msgstr "新クラスタ内ã®ã™ã¹ã¦ã®è¡Œã‚’å‡çµã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:483 +#: pg_upgrade.c:521 #, c-format msgid "Restoring global objects in the new cluster" msgstr "新クラスタ内ã®ã‚°ãƒ­ãƒ¼ãƒãƒ«ã‚ªãƒ–ジェクトを復元ã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:499 +#: pg_upgrade.c:537 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "新クラスタ内ã«ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¹ã‚­ãƒ¼ãƒžã‚’復元ã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:605 +#: pg_upgrade.c:661 #, c-format msgid "Deleting files from new %s" msgstr "æ–°ã—ã„ %s ã‹ã‚‰ãƒ•ァイルを削除ã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:609 +#: pg_upgrade.c:665 #, c-format msgid "could not delete directory \"%s\"" msgstr "ディレクトリ\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_upgrade.c:628 +#: pg_upgrade.c:684 #, c-format msgid "Copying old %s to new server" msgstr "æ—§ã® %s を新サーãƒãƒ¼ã«ã‚³ãƒ”ーã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:654 +#: pg_upgrade.c:710 #, c-format msgid "Setting oldest XID for new cluster" msgstr "新クラスタã®ã€æœ€å¤ã®XIDを設定ã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:662 +#: pg_upgrade.c:718 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "新クラスタã®ã€æ¬¡ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³IDã¨åŸºç‚¹ã‚’設定ã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:692 +#: pg_upgrade.c:748 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "新クラスタã®ã€æ¬¡ã®multixact IDã¨ã‚ªãƒ•セットを設定ã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:716 +#: pg_upgrade.c:772 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "æ–°ã‚¯ãƒ©ã‚¹ã‚¿ã®æœ€å¤ã®multixact IDを設定ã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:736 +#: pg_upgrade.c:792 #, c-format msgid "Resetting WAL archives" msgstr "WAL アーカイブをリセットã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:779 +#: pg_upgrade.c:835 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "新クラスタã®frozenxidã¨minmxidカウンタを設定ã—ã¦ã„ã¾ã™" -#: pg_upgrade.c:781 +#: pg_upgrade.c:837 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "新クラスタã®minmxidカウンタを設定ã—ã¦ã„ã¾ã™" +#: pg_upgrade.c:928 +#, c-format +msgid "Restoring logical replication slots in the new cluster" +msgstr "新クラスタ内ã®è«–ç†ãƒ¬ãƒ—リケーションスロットを復元ã—ã¦ã„ã¾ã™" + #: relfilenumber.c:35 #, c-format msgid "Cloning user relation files" @@ -1519,35 +1793,45 @@ msgstr "ユーザーリレーションã®ãƒ•ァイルをコピーã—ã¦ã„ã¾ã™ #: relfilenumber.c:41 #, c-format +msgid "Copying user relation files with copy_file_range" +msgstr "ユーザーリレーションã®ãƒ•ァイルをcopy_file_rangeを使ã£ã¦ã‚³ãƒ”ーã—ã¦ã„ã¾ã™" + +#: relfilenumber.c:44 +#, c-format msgid "Linking user relation files" msgstr "ユーザーリレーションã®ãƒ•ァイルをリンクã—ã¦ã„ã¾ã™" -#: relfilenumber.c:115 +#: relfilenumber.c:118 #, c-format msgid "old database \"%s\" not found in the new cluster" msgstr "æ–°ã‚¯ãƒ©ã‚¹ã‚¿å†…ã«æ—§ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: relfilenumber.c:218 +#: relfilenumber.c:221 #, c-format -msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "\"%s.%s\"ファイル (\"%s\"ã‹ã‚‰\"%s\")ã®å­˜åœ¨ç¢ºèªä¸­ã«ã‚¨ãƒ©ãƒ¼: %s" +msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "\"%s.%s\"ファイル (\"%s\"ã‹ã‚‰\"%s\")ã®å­˜åœ¨ç¢ºèªä¸­ã®ã‚¨ãƒ©ãƒ¼: %m" -#: relfilenumber.c:236 +#: relfilenumber.c:238 #, c-format msgid "rewriting \"%s\" to \"%s\"" msgstr "\"%s\"ã‚’\"%s\"ã«æ›¸ãæ›ãˆã¦ã„ã¾ã™" -#: relfilenumber.c:244 +#: relfilenumber.c:246 #, c-format msgid "cloning \"%s\" to \"%s\"" msgstr "\"%s\"ã‹ã‚‰\"%s\"ã¸ã‚¯ãƒ­ãƒ¼ãƒ³ã—ã¦ã„ã¾ã™" -#: relfilenumber.c:249 +#: relfilenumber.c:251 #, c-format msgid "copying \"%s\" to \"%s\"" msgstr "\"%s\"ã‚’\"%s\"ã«ã‚³ãƒ”ーã—ã¦ã„ã¾ã™" -#: relfilenumber.c:254 +#: relfilenumber.c:256 +#, c-format +msgid "copying \"%s\" to \"%s\" with copy_file_range" +msgstr "\"%s\"ã‚’\"%s\"ã«copy_file_rangeを使ã£ã¦ã‚³ãƒ”ーã—ã¦ã„ã¾ã™" + +#: relfilenumber.c:261 #, c-format msgid "linking \"%s\" to \"%s\"" msgstr "\"%s\"ã‹ã‚‰\"%s\"ã¸ãƒªãƒ³ã‚¯ã‚’作æˆã—ã¦ã„ã¾ã™" @@ -1583,7 +1867,7 @@ msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒ•ァイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—㟠msgid "could not parse version file \"%s\"" msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãƒ•ァイル\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: server.c:288 +#: server.c:310 #, c-format msgid "" "\n" @@ -1592,7 +1876,7 @@ msgstr "" "\n" "%s" -#: server.c:292 +#: server.c:314 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -1601,7 +1885,7 @@ msgstr "" "以下ã®ã‚³ãƒžãƒ³ãƒ‰ã§èµ·å‹•ã—ãŸç§»è¡Œå…ƒpostmasterã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ:\n" "%s" -#: server.c:296 +#: server.c:318 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -1610,22 +1894,22 @@ msgstr "" "以下ã®ã‚³ãƒžãƒ³ãƒ‰ã§èµ·å‹•ã—ãŸç§»è¡Œå…ˆpostmasterã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸ:\n" "%s" -#: server.c:310 +#: server.c:332 #, c-format msgid "pg_ctl failed to start the source server, or connection failed" msgstr "pg_ctl ãŒç§»è¡Œå…ƒã‚µãƒ¼ãƒãƒ¼ã®èµ·å‹•ã«å¤±æ•—ã—ãŸã€ã‚ã‚‹ã„ã¯æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸ" -#: server.c:312 +#: server.c:334 #, c-format msgid "pg_ctl failed to start the target server, or connection failed" msgstr "pg_ctl ãŒç§»è¡Œå…ˆã‚µãƒ¼ãƒãƒ¼ã®èµ·å‹•ã«å¤±æ•—ã—ãŸã€ã‚ã‚‹ã„ã¯æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸ" -#: server.c:357 +#: server.c:379 #, c-format msgid "out of memory" msgstr "メモリä¸è¶³ã§ã™" -#: server.c:370 +#: server.c:392 #, c-format msgid "libpq environment variable %s has a non-local server value: %s" msgstr "libpq ã®ç’°å¢ƒå¤‰æ•° %s ã§ã€ãƒ­ãƒ¼ã‚«ãƒ«ã§ãªã„サーãƒãƒ¼å€¤ãŒè¨­å®šã•れã¦ã„ã¾ã™: %s" @@ -1646,8 +1930,8 @@ msgstr "テーブル空間ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"ãŒå­˜åœ¨ã—ã¾ã›ã‚“" #: tablespace.c:87 #, c-format -msgid "could not stat tablespace directory \"%s\": %s" -msgstr "テーブル空間ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"ã‚’ stat ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not stat tablespace directory \"%s\": %m" +msgstr "テーブル空間ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\"%s\"ã‚’statã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" #: tablespace.c:92 #, c-format @@ -1669,62 +1953,17 @@ msgstr "ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" msgid "ok" msgstr "ok" -#: version.c:184 -#, c-format -msgid "Checking for incompatible \"line\" data type" -msgstr "éžäº’æ›ã® \"line\" データ型を確èªã—ã¦ã„ã¾ã™" - -#: version.c:193 -#, c-format -msgid "" -"Your installation contains the \"line\" data type in user tables.\n" -"This data type changed its internal and input/output format\n" -"between your old and new versions so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«\"line\"データ型ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" -"ã“ã®ãƒ‡ãƒ¼ã‚¿åž‹ã¯æ–°æ—§ã®ã‚¯ãƒ©ã‚¹ã‚¿é–“ã§å†…部形å¼ãŠã‚ˆã³å…¥å‡ºåŠ›ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒ\n" -"変更ã•れã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点ã§ã¯ã‚¢ãƒƒãƒ—グレードã§ãã¾ã›ã‚“。\n" -"å•題ã®åˆ—を削除ã—ãŸã®ã¡ã«ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã§ãã¾ã™ã€‚\n" -"å•題ã®ã‚る列ã®ä¸€è¦§ã¯ã€ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™: \n" -" %s" - -#: version.c:224 -#, c-format -msgid "Checking for invalid \"unknown\" user columns" -msgstr "無効ãª\"unknown\"ユーザー列をãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™" - -#: version.c:233 -#, c-format -msgid "" -"Your installation contains the \"unknown\" data type in user tables.\n" -"This data type is no longer allowed in tables, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ル㫠\"unknown\" データ型ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" -"ã“ã®ãƒ‡ãƒ¼ã‚¿åž‹ã¯ã‚‚ã¯ã‚„テーブル内ã§ã¯åˆ©ç”¨ã§ããªã„ãŸã‚ã€ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点\n" -"ã§ã¯ã‚¢ãƒƒãƒ—グレードã§ãã¾ã›ã‚“。å•題ã®åˆ—を削除ã—ãŸã®ã¡ã€ã‚¢ãƒƒãƒ—グレードを\n" -"å†å®Ÿè¡Œã§ãã¾ã™ã€‚\n" -"å•題ã®ã‚る列ã®ä¸€è¦§ã¯ã€ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™: \n" -" %s" - -#: version.c:257 +#: version.c:44 #, c-format msgid "Checking for hash indexes" msgstr "ãƒãƒƒã‚·ãƒ¥ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’ãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™" -#: version.c:335 +#: version.c:121 #, c-format msgid "warning" msgstr "警告" -#: version.c:337 +#: version.c:123 #, c-format msgid "" "\n" @@ -1738,7 +1977,7 @@ msgstr "" "内部フォーマットãŒç•°ãªã‚‹ãŸã‚ã€REINDEX コマンドを使ã£ã¦å†æ§‹ç¯‰ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚\n" "アップグレードãŒçµ‚ã‚ã£ãŸã‚‰ã€REINDEX を使ã£ãŸæ“ä½œæ–¹æ³•ãŒæŒ‡ç¤ºã•れã¾ã™ã€‚" -#: version.c:343 +#: version.c:129 #, c-format msgid "" "\n" @@ -1758,39 +1997,17 @@ msgstr "" "ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’å†æ§‹ç¯‰ã§ãã¾ã™ã€‚\n" "ãれã¾ã§ã¯ã€ã“れらã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¯ä½¿ç”¨ã•れã¾ã›ã‚“。" -#: version.c:369 -#, c-format -msgid "Checking for invalid \"sql_identifier\" user columns" -msgstr "無効ãª\"sql_identifier\"ユーザー列を確èªã—ã¦ã„ã¾ã™" - -#: version.c:379 -#, c-format -msgid "" -"Your installation contains the \"sql_identifier\" data type in user tables.\n" -"The on-disk format for this data type has changed, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã§ã¯ã§ã¯â€sql_identifierâ€ãƒ‡ãƒ¼ã‚¿åž‹ãŒãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ†ãƒ¼ãƒ–ルã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚\n" -"ã“ã®ãƒ‡ãƒ¼ã‚¿åž‹ã®ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã§ã®å½¢å¼ã¯å¤‰æ›´ã•れã¦ã„ã‚‹ãŸã‚ã€ã“ã®ã‚¯ãƒ©ã‚¹ã‚¿ã¯ç¾æ™‚点ã§ã¯\n" -"アップグレードã§ãã¾ã›ã‚“。å•題ã®ã‚る列を削除ã—ãŸå¾Œã«ã‚¢ãƒƒãƒ—グレードをå†å®Ÿè¡Œã™ã‚‹\n" -"ã“ã¨ãŒã§ãã¾ã™ã€‚\n" -"å•題ã®ã‚る列ã®ä¸€è¦§ã¯ã€ä»¥ä¸‹ã®ãƒ•ァイルã«ã‚りã¾ã™: \n" -" %s" - -#: version.c:402 +#: version.c:153 #, c-format msgid "Checking for extension updates" msgstr "機能拡張ã®ã‚¢ãƒƒãƒ—デートを確èªã—ã¦ã„ã¾ã™" -#: version.c:450 +#: version.c:200 #, c-format msgid "notice" msgstr "注æ„" -#: version.c:451 +#: version.c:201 #, c-format msgid "" "\n" @@ -1805,3 +2022,6 @@ msgstr "" "ã‚りã¾ã™ã€‚以下ã®ãƒ•ァイルをpsqlを使ã£ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ã‚¹ãƒ¼ãƒ‘ーユーザーã¨ã—ã¦å®Ÿè¡Œã™ã‚‹ã“ã¨ã§\n" "ã“ã‚Œã‚‰ã®æ©Ÿèƒ½æ‹¡å¼µã‚’アップデートã§ãã¾ã™ã€‚\n" " %s" + +#~ msgid " --no-statistics do not import statistics from old cluster\n" +#~ msgstr " --no-statistics 旧クラスタã‹ã‚‰çµ±è¨ˆæƒ…報をインãƒãƒ¼ãƒˆã—ãªã„\n" diff --git a/src/bin/pg_upgrade/po/ka.po b/src/bin/pg_upgrade/po/ka.po index bc33d30853eeb..43276dae50b7b 100644 --- a/src/bin/pg_upgrade/po/ka.po +++ b/src/bin/pg_upgrade/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_upgrade (PostgreSQL) 16\n" +"Project-Id-Version: pg_upgrade (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-19 11:19+0000\n" -"PO-Revision-Date: 2023-04-20 08:19+0200\n" +"POT-Creation-Date: 2024-10-12 00:20+0000\n" +"PO-Revision-Date: 2024-10-12 06:50+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,9 +16,244 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.5\n" -#: check.c:69 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "ქვეპრáƒáƒªáƒ”სიდáƒáƒœ გáƒáƒ¡áƒáƒ¡áƒ•ლელი კáƒáƒ“ი ვერ მივიღე: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ეფექტური ID-ის (%ld) áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "მáƒáƒ›áƒ®áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის áƒáƒ áƒ’უმენტი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + +#: check.c:111 +msgid "Checking for system-defined composite types in user tables" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში სისტემის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული კáƒáƒ›áƒžáƒáƒ–იტური ტიპების შემáƒáƒ¬áƒ›áƒ”ბáƒ" + +#: check.c:118 +msgid "" +"Your installation contains system-defined composite types in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში სისტემის მიერ áƒáƒ¦áƒ¬áƒ”რილ კáƒáƒ›áƒžáƒáƒ–იტურ ტიპებს შეიცáƒáƒ•ს.\n" +"áƒáƒ› ტიპის OID-ები PostgreSQL-ის ვერსიებს შáƒáƒ áƒ˜áƒ¡ მუდმივი áƒáƒ áƒáƒ, áƒáƒ›áƒ˜áƒ¢áƒáƒ›,\n" +"áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“ შეუძლებელირშეგიძლიáƒáƒ—\n" +"წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" + +#: check.c:132 +msgid "Checking for incompatible \"line\" data type" +msgstr "შეუთáƒáƒ•სებელი \"line\" მáƒáƒœáƒáƒªáƒ”მთრტიპის შემáƒáƒ¬áƒ›áƒ”ბáƒ" + +#: check.c:137 +msgid "" +"Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"თქვენი პáƒáƒ™áƒ”ტი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში \"line\" მáƒáƒœáƒáƒªáƒ”მის ტიპს შეიცáƒáƒ•ს.\n" +"ეს მáƒáƒœáƒáƒªáƒ”მის ტიპი შეიცვáƒáƒšáƒ შიგნიდáƒáƒœ. áƒáƒ¡áƒ”ვე შეიცვáƒáƒšáƒ მისი \n" +"შეყვáƒáƒœáƒ/გáƒáƒ›áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ თქვენს ძველსრდრáƒáƒ®áƒáƒš ვერსიáƒáƒ¡ შáƒáƒ áƒ˜áƒ¡. áƒáƒ›áƒ˜áƒ¢áƒáƒ›, თქვენი\n" +"კლáƒáƒ¡áƒ¢áƒ”რის ძველი ვერსიის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“ შეუძლებელიáƒ. შეგიძლიáƒáƒ—\n" +"წáƒáƒ¨áƒáƒšáƒáƒ— ეს სვეტები დრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ— გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ.\n" + +#: check.c:154 +msgid "Checking for reg* data types in user tables" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში reg* მáƒáƒœáƒáƒªáƒ”მის ტიპების შემáƒáƒ¬áƒ›áƒ”ბáƒ" + +#: check.c:181 +msgid "" +"Your installation contains one of the reg* data types in user tables.\n" +"These data types reference system OIDs that are not preserved by\n" +"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში reg* მáƒáƒœáƒáƒªáƒ”მების ტიპს შეიცáƒáƒ•ს\n" +"áƒáƒ› მáƒáƒœáƒáƒªáƒ”მების ტიპის სისტემური OID-ები pg_upgrade-ის მიერ áƒáƒ  ნáƒáƒ áƒ©áƒ£áƒœáƒ“ებáƒ, áƒáƒ›áƒ˜áƒ¢áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის \n" +"გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელიáƒ. პრáƒáƒ‘ლემის მáƒáƒ¡áƒáƒ’ვáƒáƒ áƒ”ბლáƒáƒ“,\n" +"შეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜áƒ¡ სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" + +#: check.c:193 +msgid "Checking for incompatible \"aclitem\" data type" +msgstr "შეუთáƒáƒ•სებელი \"aclitem\" მáƒáƒœáƒáƒªáƒ”მთრტიპის შემáƒáƒ¬áƒ›áƒ”ბáƒ" + +#: check.c:198 +msgid "" +"Your installation contains the \"aclitem\" data type in user tables.\n" +"The internal format of \"aclitem\" changed in PostgreSQL version 16\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში მáƒáƒœáƒáƒªáƒ”მების \"jsonb\" ტიპს შეიცáƒáƒ•ს.\n" +"\"jsonb\"-ის შიდრფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შეიცვáƒáƒšáƒ 9.4 ბეტáƒáƒ¡ დრáƒáƒ¡, áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n" +"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური\n" +"სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" + +#: check.c:217 +msgid "Checking for invalid \"unknown\" user columns" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ \"unknown\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სვეტების შემáƒáƒ¬áƒ›áƒ”ბáƒ" + +#: check.c:222 +msgid "" +"Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this cluster\n" +"cannot currently be upgraded. You can drop the problem columns\n" +"and restart the upgrade.\n" +msgstr "" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში მáƒáƒœáƒáƒªáƒ”მების \"unknown\" ტიპს შეიცáƒáƒ•ს.\n" +"ეს მáƒáƒœáƒáƒªáƒ”მის ტიპი ცხრილებში დáƒáƒ¨áƒ•ებული áƒáƒ¦áƒáƒ áƒáƒ, áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n" +"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური\n" +"სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" + +#: check.c:239 +msgid "Checking for invalid \"sql_identifier\" user columns" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ \"sql_identifier\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სვეტების შემáƒáƒ¬áƒ›áƒ”ბáƒ" + +#: check.c:244 +msgid "" +"Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can drop the problem\n" +"columns and restart the upgrade.\n" +msgstr "" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში \"sql_identifier\" მáƒáƒœáƒáƒªáƒ”მების ტიპს შეიცáƒáƒ•ს.\n" +"მáƒáƒœáƒáƒªáƒ”მის áƒáƒ› ტიპის დისკზე შენáƒáƒ®áƒ•ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შეიცვáƒáƒšáƒ, áƒáƒ¡áƒ” რáƒáƒ›,\n" +"áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელიáƒ.\n" +"შეგიძლიáƒáƒ—, წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური სვეტები დრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ— გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ.\n" + +#: check.c:255 +msgid "Checking for incompatible \"jsonb\" data type in user tables" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში შეუთáƒáƒ•სებელი \"jsonb\" მáƒáƒœáƒáƒªáƒ”მების ტიპის შემáƒáƒ¬áƒ›áƒ”ბáƒ" + +#: check.c:260 +msgid "" +"Your installation contains the \"jsonb\" data type in user tables.\n" +"The internal format of \"jsonb\" changed during 9.4 beta so this\n" +"cluster cannot currently be upgraded. You can drop the problem \n" +"columns and restart the upgrade.\n" +msgstr "" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში მáƒáƒœáƒáƒªáƒ”მების \"jsonb\" ტიპს შეიცáƒáƒ•ს.\n" +"\"jsonb\"-ის შიდრფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შეიცვáƒáƒšáƒ 9.4 ბეტáƒáƒ¡ დრáƒáƒ¡, áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n" +"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური\n" +"სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" + +#: check.c:272 +msgid "Checking for removed \"abstime\" data type in user tables" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ \"abstime\" მáƒáƒœáƒáƒªáƒ”მის ტიპების შემáƒáƒ¬áƒ›áƒ”ბáƒ" + +#: check.c:277 +msgid "" +"Your installation contains the \"abstime\" data type in user tables.\n" +"The \"abstime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში მáƒáƒœáƒáƒªáƒ”მების \"%s\" ტიპს შეიცáƒáƒ•ს.\n" +"ტიპი \"%s\" გáƒáƒ£áƒ¥áƒ›áƒ“რPostgreSQL-ის %s-ე ვერსიáƒáƒ¨áƒ˜\n" +"áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n" +"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური სვეტები,\n" +"áƒáƒœ შეცვáƒáƒšáƒáƒ— მáƒáƒ—ი ტიპი დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" + +#: check.c:285 +msgid "Checking for removed \"reltime\" data type in user tables" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ \"reltime\" მáƒáƒœáƒáƒªáƒ”მის ტიპების შემáƒáƒ¬áƒ›áƒ”ბáƒ" + +#: check.c:290 +msgid "" +"Your installation contains the \"reltime\" data type in user tables.\n" +"The \"reltime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში მáƒáƒœáƒáƒªáƒ”მების \"%s\" ტიპს შეიცáƒáƒ•ს.\n" +"ტიპი \"%s\" გáƒáƒ£áƒ¥áƒ›áƒ“რPostgreSQL-ის %s-ე ვერსიáƒáƒ¨áƒ˜\n" +"áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n" +"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური სვეტები,\n" +"áƒáƒœ შეცვáƒáƒšáƒáƒ— მáƒáƒ—ი ტიპი დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" + +#: check.c:298 +msgid "Checking for removed \"tinterval\" data type in user tables" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში წáƒáƒ¨áƒšáƒ˜áƒšáƒ˜ \"tinterval\" მáƒáƒœáƒáƒªáƒ”მის ტიპების შემáƒáƒ¬áƒ›áƒ”ბáƒ" + +#: check.c:303 +msgid "" +"Your installation contains the \"tinterval\" data type in user tables.\n" +"The \"tinterval\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში მáƒáƒœáƒáƒªáƒ”მების \"%s\" ტიპს შეიცáƒáƒ•ს.\n" +"ტიპი \"%s\" გáƒáƒ£áƒ¥áƒ›áƒ“რPostgreSQL-ის %s-ე ვერსიáƒáƒ¨áƒ˜\n" +"áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n" +"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური სვეტები,\n" +"áƒáƒœ შეცვáƒáƒšáƒáƒ— მáƒáƒ—ი ტიპი დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" + +#: check.c:345 +#, c-format +msgid "Checking data type usage" +msgstr "მáƒáƒœáƒáƒªáƒ”მის ტიპის გáƒáƒ›áƒáƒ§áƒ”ნების შემáƒáƒ¬áƒ›áƒ”ბáƒ" + +#: check.c:480 +#, c-format +msgid "failed check: %s" +msgstr "ჩáƒáƒ•áƒáƒ áƒ“რშემáƒáƒ¬áƒ›áƒ”ბáƒ: %s" + +#: check.c:483 +msgid "A list of the problem columns is in the file:" +msgstr "პრáƒáƒ‘ლემური სვეტების სირáƒáƒ áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜:" + +#: check.c:495 check.c:963 check.c:1136 check.c:1251 check.c:1345 check.c:1473 +#: check.c:1549 check.c:1613 check.c:1686 check.c:1865 check.c:1884 +#: check.c:1953 check.c:2005 file.c:378 file.c:415 function.c:189 option.c:493 +#: version.c:79 version.c:177 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: check.c:522 +#, c-format +msgid "Data type checks failed: %s" +msgstr "მáƒáƒœáƒáƒªáƒ”მის ტიპის შემáƒáƒ¬áƒ›áƒ”ბები ჩáƒáƒ•áƒáƒ áƒ“áƒ: %s" + +#: check.c:563 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -27,7 +262,7 @@ msgstr "" "თáƒáƒœáƒ›áƒ˜áƒ›áƒ“ევრულáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბის შესრულებრძველ ცáƒáƒªáƒ®áƒáƒš სერვერზე\n" "------------------------------------------------" -#: check.c:75 +#: check.c:569 #, c-format msgid "" "Performing Consistency Checks\n" @@ -36,7 +271,7 @@ msgstr "" "თáƒáƒœáƒ›áƒ˜áƒ›áƒ“ევრულáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბის ჩáƒáƒ¢áƒáƒ áƒ”ბáƒ\n" "-----------------------------" -#: check.c:221 +#: check.c:718 #, c-format msgid "" "\n" @@ -45,7 +280,7 @@ msgstr "" "\n" "*კლáƒáƒ¡áƒ¢áƒ”რები თáƒáƒ•სებáƒáƒ“ირ*" -#: check.c:229 +#: check.c:726 #, c-format msgid "" "\n" @@ -56,7 +291,7 @@ msgstr "" "თუ áƒáƒ› წერტილის შემდეგ pg_upgrade áƒáƒ•áƒáƒ áƒ˜áƒ£áƒšáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“ებáƒ, გáƒáƒ’რძელებáƒáƒ›áƒ“ე\n" "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის init-db-ის გáƒáƒ™áƒ”თებრშეიძლებრთáƒáƒ•იდáƒáƒœ მáƒáƒ’იწიáƒáƒ—." -#: check.c:270 +#: check.c:767 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -67,7 +302,7 @@ msgstr "" "რáƒáƒªáƒ áƒáƒ®áƒáƒš სერვერს გáƒáƒ£áƒ¨áƒ•ებთ, შეáƒáƒ¡áƒ áƒ£áƒšáƒ”თ ბრძáƒáƒœáƒ”ბáƒ:\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:276 +#: check.c:773 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -76,7 +311,7 @@ msgstr "" "áƒáƒ› სკრიპტის გáƒáƒ¨áƒ•ებრძველი კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მების ფáƒáƒ˜áƒšáƒ”ბს წáƒáƒ¨áƒšáƒ˜áƒ¡:\n" " %s" -#: check.c:281 +#: check.c:778 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -89,57 +324,57 @@ msgstr "" "ძველი კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მების წáƒáƒ¨áƒšáƒ˜áƒ¡ სკრიპტის შექმნრშეუძლებელიáƒ. ძველი კლáƒáƒ¡áƒ¢áƒ”რის\n" " შემცველáƒáƒ‘რხელით უნდრწáƒáƒ¨áƒáƒšáƒáƒ—." -#: check.c:293 +#: check.c:790 #, c-format msgid "Checking cluster versions" msgstr "კლáƒáƒ¡áƒ¢áƒ”რის ვერსიების შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: check.c:305 +#: check.c:802 #, c-format msgid "This utility can only upgrade from PostgreSQL version %s and later." msgstr "áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒáƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბრPostgreSQL-ის ვერსიის %s-დáƒáƒœ დრზემáƒáƒ— შეუძლიáƒ." -#: check.c:310 +#: check.c:807 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s." msgstr "áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒáƒ¡ შეუძლირმხáƒáƒšáƒáƒ“ PostgreSQL ვერსიáƒáƒ–ე გáƒáƒ“áƒáƒ¡áƒ•ლრ%s." -#: check.c:319 +#: check.c:816 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions." msgstr "ეს პრáƒáƒ’რáƒáƒ›áƒ áƒáƒ  შეიძლებრგáƒáƒ›áƒáƒ§áƒ”ნებულ იქნáƒáƒ¡ უფრრძველი ძირითáƒáƒ“ი PostgreSQL ვერსიების ჩáƒáƒ›áƒáƒ¡áƒáƒ¬áƒ”ვáƒáƒ“." -#: check.c:324 +#: check.c:821 #, c-format msgid "Old cluster data and binary directories are from different major versions." msgstr "ძველი კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მები დრგáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეები სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რძირითáƒáƒ“ი ვერსიიდáƒáƒœáƒáƒ." -#: check.c:327 +#: check.c:824 #, c-format msgid "New cluster data and binary directories are from different major versions." msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მებისრდრგáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეები სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რძირითáƒáƒ“ ვერსიებს მიეკუთვნებáƒ." -#: check.c:342 +#: check.c:839 #, c-format msgid "When checking a live server, the old and new port numbers must be different." msgstr "ცáƒáƒªáƒ®áƒáƒšáƒ˜ სერვერის შემáƒáƒ¬áƒ›áƒ”ბისáƒáƒ¡ ძველი დრáƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒ¢áƒ˜áƒ¡ ნáƒáƒ›áƒ áƒ”ბი სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რუნდრიყáƒáƒ¡." -#: check.c:362 +#: check.c:859 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რული მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რ\"%s\" ცáƒáƒ áƒ˜áƒ”ლი áƒáƒ áƒáƒ: ნáƒáƒžáƒáƒ•ნირურთიერთáƒáƒ‘რ\"%s.%s\"" -#: check.c:385 +#: check.c:882 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის ცხრილების სივრცის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეების შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: check.c:396 +#: check.c:893 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის ცხრილების სივრცის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე უკვე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" -#: check.c:429 +#: check.c:926 #, c-format msgid "" "\n" @@ -148,7 +383,7 @@ msgstr "" "\n" "გáƒáƒ¤áƒ áƒ—ხილებáƒ: áƒáƒ®áƒáƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე ძველი მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შიგნით áƒáƒ  უნდრიყáƒáƒ¡. მáƒáƒ’: %s" -#: check.c:453 +#: check.c:950 #, c-format msgid "" "\n" @@ -157,61 +392,53 @@ msgstr "" "\n" "გáƒáƒ¤áƒ áƒ—ხილებáƒ: მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილი ცხრილის სივრცეების მდებáƒáƒ áƒ”áƒáƒ‘ები მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შიგნით áƒáƒ  უნდრიყáƒáƒ¡. მáƒáƒ’: %s" -#: check.c:463 +#: check.c:960 #, c-format msgid "Creating script to delete old cluster" msgstr "ძველი კლáƒáƒ¡áƒ¢áƒ”რის წáƒáƒ¡áƒáƒ¨áƒšáƒ”ლáƒáƒ“ სკრიპტის შექმნáƒ" -#: check.c:466 check.c:639 check.c:755 check.c:850 check.c:979 check.c:1056 -#: check.c:1299 check.c:1373 file.c:339 function.c:163 option.c:476 -#: version.c:116 version.c:292 version.c:426 -#, c-format -msgid "could not open file \"%s\": %s" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %s" - -#: check.c:517 +#: check.c:1014 #, c-format -msgid "could not add execute permission to file \"%s\": %s" -msgstr "ფáƒáƒ˜áƒšáƒ–ე \"%s\" გáƒáƒ¨áƒ•ების წვდáƒáƒ›áƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბის შეცდáƒáƒ›áƒ: %s" +msgid "could not add execute permission to file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ–ე \"%s\" გáƒáƒ¨áƒ•ების წვდáƒáƒ›áƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბის შეცდáƒáƒ›áƒ: %m" -#: check.c:537 +#: check.c:1034 #, c-format msgid "Checking database user is the install user" msgstr "შემáƒáƒ¬áƒ›áƒ”ბáƒ, დáƒáƒ›áƒ§áƒ”ნებელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი დáƒáƒ§áƒ”ნების მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს თუ უდრის" -#: check.c:553 +#: check.c:1050 #, c-format msgid "database user \"%s\" is not the install user" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" áƒáƒ  áƒáƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნების მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი" -#: check.c:564 +#: check.c:1061 #, c-format msgid "could not determine the number of users" msgstr "ვერ დáƒáƒ“გინდრმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელთრრáƒáƒáƒ“ენáƒáƒ‘áƒ" -#: check.c:572 +#: check.c:1069 #, c-format msgid "Only the install user can be defined in the new cluster." msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რისთვის მხáƒáƒšáƒáƒ“ დáƒáƒ§áƒ”ნების მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მითითებáƒáƒ შესáƒáƒ«áƒšáƒ”ბელი." -#: check.c:601 +#: check.c:1098 #, c-format msgid "Checking database connection settings" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კáƒáƒ•შირის პáƒáƒ áƒáƒ›áƒ”ტრების შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: check.c:627 +#: check.c:1124 #, c-format msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false" msgstr "template0-თáƒáƒœ დáƒáƒ™áƒáƒ•შირებრშეუძლებელი უნდრიყáƒáƒ¡. áƒáƒœáƒ£, მისი pg_database.datallowconn პáƒáƒ áƒáƒ›áƒ”ტრი false უნდრიყáƒáƒ¡" -#: check.c:654 check.c:775 check.c:873 check.c:999 check.c:1076 check.c:1135 -#: check.c:1196 check.c:1224 check.c:1254 check.c:1313 check.c:1394 -#: function.c:185 version.c:192 version.c:232 version.c:378 +#: check.c:1150 check.c:1270 check.c:1367 check.c:1492 check.c:1568 +#: check.c:1626 check.c:1706 check.c:1897 check.c:2022 function.c:210 #, c-format msgid "fatal" msgstr "ფáƒáƒ¢áƒáƒšáƒ£áƒ áƒ˜" -#: check.c:655 +#: check.c:1151 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -230,27 +457,27 @@ msgstr "" "პრáƒáƒ‘ლემური ბáƒáƒ–ების სიის ნáƒáƒ®áƒ•რშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" " %s" -#: check.c:680 +#: check.c:1176 #, c-format msgid "Checking for prepared transactions" msgstr "მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: check.c:689 +#: check.c:1185 #, c-format msgid "The source cluster contains prepared transactions" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ კლáƒáƒ¡áƒ¢áƒ”რი მáƒáƒ›áƒ–áƒáƒ“ებულ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბს შეიცáƒáƒ•ს" -#: check.c:691 +#: check.c:1187 #, c-format msgid "The target cluster contains prepared transactions" msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რი მáƒáƒ›áƒ–áƒáƒ“ებულ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბს შეიცáƒáƒ•ს" -#: check.c:716 +#: check.c:1212 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "\"contrib/isn\"-ის bgint-passing-ის áƒáƒ -დáƒáƒ›áƒ—ხვევáƒáƒ–ე შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: check.c:776 +#: check.c:1271 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -267,12 +494,12 @@ msgstr "" ", გáƒáƒœáƒáƒáƒ®áƒšáƒáƒ— ბáƒáƒ–რდრáƒáƒ¦áƒáƒ“გინáƒáƒ— ფუნქციები. პრáƒáƒ‘ლემური ფუნქციების სირშეგიძლიáƒáƒ— იხილáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" " %s" -#: check.c:798 +#: check.c:1293 #, c-format msgid "Checking for user-defined postfix operators" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილი postfix áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: check.c:874 +#: check.c:1368 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -287,12 +514,12 @@ msgstr "" "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილი postfix áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის სიის ნáƒáƒ®áƒ•რშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" " %s" -#: check.c:898 +#: check.c:1392 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "შეუთáƒáƒ•სებელი პáƒáƒšáƒ˜áƒ›áƒáƒ áƒ¤áƒ£áƒšáƒ˜ ფუნქციების áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: check.c:1000 +#: check.c:1493 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -311,12 +538,12 @@ msgstr "" "ფáƒáƒ˜áƒšáƒ¨áƒ˜ áƒáƒ áƒ¡áƒ”ბული პრáƒáƒ‘ლემური áƒáƒ‘იექტები:\n" " %s" -#: check.c:1024 +#: check.c:1517 #, c-format msgid "Checking for tables WITH OIDS" msgstr "WITH OIDS ცხრილების შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: check.c:1077 +#: check.c:1569 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -331,138 +558,131 @@ msgstr "" "ცხრილების სიáƒ, რáƒáƒ›áƒ”ლსáƒáƒª ეს პრáƒáƒ‘ლემრგáƒáƒáƒ©áƒœáƒ˜áƒáƒ—, შეგიძლიáƒáƒ— იხილáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" " %s" -#: check.c:1105 +#: check.c:1596 #, c-format -msgid "Checking for system-defined composite types in user tables" -msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში სისტემის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული კáƒáƒ›áƒžáƒáƒ–იტური ტიპების შემáƒáƒ¬áƒ›áƒ”ბáƒ" +msgid "Checking for roles starting with \"pg_\"" +msgstr "რáƒáƒšáƒ”ბის შემáƒáƒ¬áƒ›áƒ”ბáƒ, რáƒáƒ›áƒšáƒ”ბიც \"pg_\"-ით იწყებáƒ" -#: check.c:1136 +#: check.c:1627 #, c-format msgid "" -"Your installation contains system-defined composite type(s) in user tables.\n" -"These type OIDs are not stable across PostgreSQL versions,\n" -"so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" +"Your installation contains roles starting with \"pg_\".\n" +"\"pg_\" is a reserved prefix for system roles. The cluster\n" +"cannot be upgraded until these roles are renamed.\n" +"A list of roles starting with \"pg_\" is in the file:\n" " %s" msgstr "" -"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში სისტემის მიერ áƒáƒ¦áƒ¬áƒ”რილ კáƒáƒ›áƒžáƒáƒ–იტურ ტიპებს შეიცáƒáƒ•ს.\n" -"áƒáƒ› ტიპის OID-ები PostgreSQL-ის ვერსიებს შáƒáƒ áƒ˜áƒ¡ მუდმივი áƒáƒ áƒáƒ, áƒáƒ›áƒ˜áƒ¢áƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“ შეუძლებელირშეგიძლიáƒáƒ—\n" -"წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" -"პრáƒáƒ‘ლემური სვეტების სიის ხილვრშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" -" %s" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირშეიცáƒáƒ•ს რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბიც\n" +"\"pg_\" სუფიქსით იწყებáƒ. ეს კი სისტემური რáƒáƒšáƒ”ბისთვის შემáƒáƒœáƒáƒ®áƒ£áƒšáƒ˜ რáƒáƒšáƒ”ბიáƒ.\n" +"კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელირმáƒáƒœáƒáƒ›áƒ“ე, სáƒáƒœáƒáƒ› áƒáƒ› რáƒáƒšáƒ”ბს სáƒáƒ®áƒ”ლს áƒáƒ  გáƒáƒ“áƒáƒáƒ áƒ¥áƒ›áƒ”ვთ.\n" +"რáƒáƒšáƒ”ბის სიáƒ, რáƒáƒ›áƒšáƒ”ბიც \"pg_\"-ით იწყებიáƒáƒœ, შეგიძლიáƒáƒ— იპáƒáƒ•áƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" +" %s" -#: check.c:1164 +#: check.c:1647 #, c-format -msgid "Checking for reg* data types in user tables" -msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში reg* მáƒáƒœáƒáƒªáƒ”მის ტიპების შემáƒáƒ¬áƒ›áƒ”ბáƒ" +msgid "Checking for user-defined encoding conversions" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული კáƒáƒ“ირების კáƒáƒœáƒ•ერტáƒáƒªáƒ˜áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: check.c:1197 +#: check.c:1707 #, c-format msgid "" -"Your installation contains one of the reg* data types in user tables.\n" -"These data types reference system OIDs that are not preserved by\n" -"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" +"Your installation contains user-defined encoding conversions.\n" +"The conversion function parameters changed in PostgreSQL version 14\n" +"so this cluster cannot currently be upgraded. You can remove the\n" +"encoding conversions in the old cluster and restart the upgrade.\n" +"A list of user-defined encoding conversions is in the file:\n" " %s" msgstr "" -"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში reg* მáƒáƒœáƒáƒªáƒ”მების ტიპს შეიცáƒáƒ•ს\n" -"áƒáƒ› მáƒáƒœáƒáƒªáƒ”მების ტიპის სისტემური OID-ები pg_upgrade-ის იერ áƒáƒ  ნáƒáƒ áƒ©áƒ£áƒœáƒ“ებáƒ, áƒáƒ›áƒ˜áƒ¢áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის\n" -"გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელიáƒ. პრáƒáƒ‘ლემის მáƒáƒ¡áƒáƒ’ვáƒáƒ áƒ”ბლáƒáƒ“ შეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜áƒ¡ სვეტები\n" -"დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" -"პრáƒáƒ‘ლემური სვეტების სიის ნáƒáƒ®áƒ•რშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" -" %s" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილ გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ”ბს შეიცáƒáƒ•ს.\n" +"\"jsonb\"-ის შიდრფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შეიცვáƒáƒšáƒ 14-ე ვერსიáƒáƒ¨áƒ˜, áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n" +"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" +"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილი გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ”ბის ნáƒáƒ®áƒ•რშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" +" %s" -#: check.c:1218 +#: check.c:1746 #, c-format -msgid "Checking for incompatible aclitem data type in user tables" -msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში შეუთáƒáƒ•სებელი aclitem ტიპის მáƒáƒœáƒáƒªáƒ”მების შემáƒáƒ¬áƒ›áƒ”ბáƒ" +msgid "Checking for new cluster logical replication slots" +msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: check.c:1225 +#: check.c:1754 #, c-format -msgid "" -"Your installation contains the \"aclitem\" data type in user tables.\n" -"The internal format of \"aclitem\" changed in PostgreSQL version 16\n" -"so this cluster cannot currently be upgraded. You can drop the\n" -"problem columns and restart the upgrade. A list of the problem\n" -"columns is in the file:\n" -" %s" -msgstr "" -"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში მáƒáƒœáƒáƒªáƒ”მების \"jsonb\" ტიპს შეიცáƒáƒ•ს.\n" -"\"jsonb\"-ის შიდრფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შეიცვáƒáƒšáƒ 9.4 ბეტáƒáƒ¡ დრáƒáƒ¡, áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n" -"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემული სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" -"პრáƒáƒ‘ლემური სვეტების ნáƒáƒ®áƒ•რშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" -" %s" +msgid "could not count the number of logical replication slots" +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘ის დáƒáƒ—ვლრშეუძლებელიáƒ" -#: check.c:1246 +#: check.c:1759 #, c-format -msgid "Checking for incompatible \"jsonb\" data type" -msgstr "შეუთáƒáƒ•სებელი \"jsonb\" მáƒáƒœáƒáƒªáƒ”მთრტიპის შემáƒáƒ¬áƒ›áƒ”ბáƒ" +msgid "expected 0 logical replication slots but found %d" +msgstr "მáƒáƒ•ელáƒáƒ“ი 0 ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ¡, მáƒáƒ’რáƒáƒ›, მივიღე %d" -#: check.c:1255 +#: check.c:1769 check.c:1820 #, c-format -msgid "" -"Your installation contains the \"jsonb\" data type in user tables.\n" -"The internal format of \"jsonb\" changed during 9.4 beta so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში მáƒáƒœáƒáƒªáƒ”მების \"jsonb\" ტიპს შეიცáƒáƒ•ს.\n" -"\"jsonb\"-ის შიდრფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შეიცვáƒáƒšáƒ 9.4 ბეტáƒáƒ¡ დრáƒáƒ¡, áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n" -"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემული სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" -"პრáƒáƒ‘ლემური სვეტების ნáƒáƒ®áƒ•რშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" -" %s" +msgid "could not determine parameter settings on new cluster" +msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რზე პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘ების დáƒáƒ“გენრშეუძლებელიáƒ" -#: check.c:1282 +#: check.c:1774 #, c-format -msgid "Checking for roles starting with \"pg_\"" -msgstr "რáƒáƒšáƒ”ბის შემáƒáƒ¬áƒ›áƒ”ბáƒ, რáƒáƒ›áƒšáƒ”ბიც \"pg_\"-ით იწყებáƒ" +msgid "\"wal_level\" must be \"logical\" but is set to \"%s\"" +msgstr "\"wal_level\" უნდრიყáƒáƒ¡ \"logical\", მáƒáƒ’რáƒáƒ› მნიშვნელáƒáƒ‘áƒáƒ \"%s\"" -#: check.c:1314 +#: check.c:1780 +#, c-format +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of logical replication slots (%d) on the old cluster" +msgstr "\"max_replication_slots\" (%d) ძველი კლáƒáƒ¡áƒ¢áƒ”რის ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ”ბის სლáƒáƒ¢áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ–ე (%d) მეტი áƒáƒœ ტáƒáƒšáƒ˜ უნდრიყáƒáƒ¡" + +#: check.c:1812 +#, c-format +msgid "Checking for new cluster configuration for subscriptions" +msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¬áƒ”რებზე შემáƒáƒ¬áƒ›áƒ”ბáƒ" + +#: check.c:1824 +#, c-format +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of subscriptions (%d) on the old cluster" +msgstr "\"max_replication_slots\" (%d) ძველი კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒ›áƒáƒ¬áƒ”რების რáƒáƒáƒ“ენáƒáƒ‘áƒáƒ–ე (%d) მეტი áƒáƒœ ტáƒáƒšáƒ˜ უნდრიყáƒáƒ¡" + +#: check.c:1846 +#, c-format +msgid "Checking for valid logical replication slots" +msgstr "სწáƒáƒ  ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბზე შემáƒáƒ¬áƒ›áƒ”ბáƒ" + +#: check.c:1898 #, c-format msgid "" -"Your installation contains roles starting with \"pg_\".\n" -"\"pg_\" is a reserved prefix for system roles, the cluster\n" -"cannot be upgraded until these roles are renamed.\n" -"A list of roles starting with \"pg_\" is in the file:\n" +"Your installation contains logical replication slots that cannot be upgraded.\n" +"You can remove invalid slots and/or consume the pending WAL for other slots,\n" +"and then restart the upgrade.\n" +"A list of the problematic slots is in the file:\n" " %s" msgstr "" -"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირშეიცáƒáƒ•ს რáƒáƒšáƒ”ბს, რáƒáƒ›áƒšáƒ”ბიც\n" -"\"pg_\" სუფიქსით იწყებáƒ. ეს კი სისტემური რáƒáƒšáƒ”ბისთვის შემáƒáƒœáƒáƒ®áƒ£áƒšáƒ˜ რáƒáƒšáƒ”ბიáƒ.\n" -"კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელირმáƒáƒœáƒáƒ›áƒ“ე, სáƒáƒœáƒáƒ› áƒáƒ› რáƒáƒšáƒ”ბს სáƒáƒ®áƒ”ლს áƒáƒ  გáƒáƒ“áƒáƒáƒ áƒ¥áƒ›áƒ”ვთ.\n" -"რáƒáƒšáƒ”ბის სიáƒ, რáƒáƒ›áƒšáƒ”ბიც \"pg_\"-ით იწყებიáƒáƒœ, შეგიძლიáƒáƒ— იპáƒáƒ•áƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბს შეიცáƒáƒ•ს, რáƒáƒ›áƒšáƒ˜áƒ¡ ვერსიის áƒáƒ¬áƒ”ვáƒáƒª შეუძლებელიáƒ.\n" +"შეგიძლიáƒáƒ—, წáƒáƒ¨áƒáƒšáƒáƒ— áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სლáƒáƒ¢áƒ”ბი áƒáƒœ/დრდáƒáƒáƒ›áƒ£áƒ¨áƒáƒáƒ— დáƒáƒ áƒ©áƒ”ნილი WAL სხვრსლáƒáƒ¢áƒ”ბისთვის\n" +"დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" +"პრáƒáƒ‘ლემური სლáƒáƒ¢áƒ”ბის ნáƒáƒ®áƒ•რშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" " %s" -#: check.c:1334 +#: check.c:1922 #, c-format -msgid "Checking for user-defined encoding conversions" -msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ გáƒáƒœáƒ¡áƒáƒ–ღვრული კáƒáƒ“ირების კáƒáƒœáƒ•ერტáƒáƒªáƒ˜áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბáƒ" +msgid "Checking for subscription state" +msgstr "გáƒáƒ›áƒáƒ¬áƒ”რის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: check.c:1395 +#: check.c:2023 #, c-format msgid "" -"Your installation contains user-defined encoding conversions.\n" -"The conversion function parameters changed in PostgreSQL version 14\n" -"so this cluster cannot currently be upgraded. You can remove the\n" -"encoding conversions in the old cluster and restart the upgrade.\n" -"A list of user-defined encoding conversions is in the file:\n" +"Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n" +"You can allow the initial sync to finish for all relations and then restart the upgrade.\n" +"A list of the problematic subscriptions is in the file:\n" " %s" msgstr "" -"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილ გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ”ბს შეიცáƒáƒ•ს.\n" -"\"jsonb\"-ის შიდრფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შეიცვáƒáƒšáƒ 14-ე ვერსიáƒáƒ¨áƒ˜, áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n" -"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემული სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" -"მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ áƒáƒ¦áƒ¬áƒ”რილი გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ”ბის ნáƒáƒ®áƒ•რშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" +"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსიáƒáƒ¨áƒ”იცáƒáƒ•ს გáƒáƒ›áƒáƒ¬áƒ”რებს წყáƒáƒ áƒáƒ¡ გáƒáƒ áƒ”შე áƒáƒœ áƒáƒ¥áƒ•ს ურთიერთáƒáƒ‘ები áƒáƒ áƒª i (ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡) დრáƒáƒ áƒª r (მზáƒáƒ“áƒáƒ) მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒáƒ¨áƒ˜.\n" +"შეგიძლიáƒáƒ— დáƒáƒ£áƒ¨áƒ•áƒáƒ— სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბრყველრურთიერთáƒáƒ‘ისთვის დრშემდეგ ვერსიის გáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—\n" +"პრáƒáƒ‘ლემური სვეტების ნáƒáƒ®áƒ•რშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" " %s" -#: controldata.c:129 controldata.c:175 controldata.c:199 controldata.c:508 +#: controldata.c:129 controldata.c:199 #, c-format -msgid "could not get control data using %s: %s" -msgstr "%s-სთვის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ მáƒáƒœáƒáƒªáƒ”მების მიღების შეცდáƒáƒ›áƒ: %s" +msgid "could not get control data using %s: %m" +msgstr "%s-ის გáƒáƒ›áƒáƒ§áƒ”ნებით სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ მáƒáƒœáƒáƒªáƒ”მების მიღებრშეუძლებელიáƒ: %m" -#: controldata.c:140 +#: controldata.c:139 #, c-format msgid "%d: database cluster state problem" msgstr "%d: ბáƒáƒ–ის კლáƒáƒ¡áƒ¢áƒ”რის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის პრáƒáƒ‘ლემáƒ" @@ -479,13 +699,18 @@ msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რი áƒáƒ¦áƒ“გენის #: controldata.c:165 #, c-format -msgid "The source cluster was not shut down cleanly." -msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ბáƒáƒ–რწესების დáƒáƒªáƒ•ით áƒáƒ  გáƒáƒ›áƒáƒ áƒ—ულáƒ." +msgid "The source cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "წყáƒáƒ áƒ კლáƒáƒ¡áƒ¢áƒ”რი წესების დáƒáƒªáƒ•ით áƒáƒ  გáƒáƒ›áƒáƒ áƒ—ულáƒ. მიღებული მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒáƒ: \"%s\"" #: controldata.c:167 #, c-format -msgid "The target cluster was not shut down cleanly." -msgstr "სáƒáƒ›áƒ˜áƒ–ნე ბáƒáƒ–რწესების დáƒáƒªáƒ•ით áƒáƒ  გáƒáƒ›áƒáƒ áƒ—ულáƒ." +msgid "The target cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რი წესების დáƒáƒªáƒ•ით áƒáƒ  გáƒáƒ›áƒáƒ áƒ—ულáƒ. მიღებული მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒáƒ: \"%s\"" + +#: controldata.c:175 controldata.c:507 +#, c-format +msgid "could not get control data using %s: %s" +msgstr "%s-სთვის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ მáƒáƒœáƒáƒªáƒ”მების მიღების შეცდáƒáƒ›áƒ: %s" #: controldata.c:181 #, c-format @@ -497,139 +722,139 @@ msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡ კლáƒáƒ¡áƒ¢áƒ”რს მდგáƒáƒ›áƒáƒ áƒ”რmsgid "The target cluster lacks cluster state information:" msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რს მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ:" -#: controldata.c:214 dump.c:50 exec.c:119 pg_upgrade.c:517 pg_upgrade.c:554 -#: relfilenumber.c:231 server.c:34 util.c:337 +#: controldata.c:213 dump.c:50 exec.c:118 pg_upgrade.c:556 pg_upgrade.c:596 +#: pg_upgrade.c:945 relfilenumber.c:233 server.c:34 util.c:337 #, c-format msgid "%s" msgstr "%s" -#: controldata.c:221 +#: controldata.c:220 #, c-format msgid "%d: pg_resetwal problem" msgstr "%d: pg_resetwal -ის პრáƒáƒ‘ლემáƒ" -#: controldata.c:231 controldata.c:241 controldata.c:252 controldata.c:263 -#: controldata.c:274 controldata.c:293 controldata.c:304 controldata.c:315 -#: controldata.c:326 controldata.c:337 controldata.c:348 controldata.c:359 -#: controldata.c:362 controldata.c:366 controldata.c:376 controldata.c:388 -#: controldata.c:399 controldata.c:410 controldata.c:421 controldata.c:432 -#: controldata.c:443 controldata.c:454 controldata.c:465 controldata.c:476 -#: controldata.c:487 controldata.c:498 +#: controldata.c:230 controldata.c:240 controldata.c:251 controldata.c:262 +#: controldata.c:273 controldata.c:292 controldata.c:303 controldata.c:314 +#: controldata.c:325 controldata.c:336 controldata.c:347 controldata.c:358 +#: controldata.c:361 controldata.c:365 controldata.c:375 controldata.c:387 +#: controldata.c:398 controldata.c:409 controldata.c:420 controldata.c:431 +#: controldata.c:442 controldata.c:453 controldata.c:464 controldata.c:475 +#: controldata.c:486 controldata.c:497 #, c-format msgid "%d: controldata retrieval problem" msgstr "%d: controldata -ის მიღების შეცდáƒáƒ›áƒ" -#: controldata.c:579 +#: controldata.c:578 #, c-format msgid "The source cluster lacks some required control information:" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡ კლáƒáƒ¡áƒ¢áƒ”რს ზáƒáƒ’იერთი სáƒáƒ­áƒ˜áƒ áƒ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ:" -#: controldata.c:582 +#: controldata.c:581 #, c-format msgid "The target cluster lacks some required control information:" msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რს ზáƒáƒ’იერთი სáƒáƒ­áƒ˜áƒ áƒ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ:" -#: controldata.c:585 +#: controldata.c:584 #, c-format msgid " checkpoint next XID" msgstr " სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის შემდეგი XID" -#: controldata.c:588 +#: controldata.c:587 #, c-format msgid " latest checkpoint next OID" msgstr " უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის შემდეგი OID" -#: controldata.c:591 +#: controldata.c:590 #, c-format msgid " latest checkpoint next MultiXactId" msgstr " უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის შემდეგი MultiXactId" -#: controldata.c:595 +#: controldata.c:594 #, c-format msgid " latest checkpoint oldest MultiXactId" msgstr " უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის უძველესი MultiXactId" -#: controldata.c:598 +#: controldata.c:597 #, c-format msgid " latest checkpoint oldestXID" msgstr " უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის უძველესი XID" -#: controldata.c:601 +#: controldata.c:600 #, c-format msgid " latest checkpoint next MultiXactOffset" msgstr " უáƒáƒ®áƒšáƒ”სი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის შემდეგი MultiXactOffset" -#: controldata.c:604 +#: controldata.c:603 #, c-format msgid " first WAL segment after reset" msgstr " პირველი WAL სეგმენტი გáƒáƒ“áƒáƒ¢áƒ•ირთვის შემდეგ" -#: controldata.c:607 +#: controldata.c:606 #, c-format msgid " float8 argument passing method" msgstr " float8 áƒáƒ áƒ’უმენტი გáƒáƒ•ლის მეთáƒáƒ“ი" -#: controldata.c:610 +#: controldata.c:609 #, c-format msgid " maximum alignment" msgstr " მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სწáƒáƒ áƒ”ბáƒ" -#: controldata.c:613 +#: controldata.c:612 #, c-format msgid " block size" msgstr " ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ" -#: controldata.c:616 +#: controldata.c:615 #, c-format msgid " large relation segment size" msgstr " დიდი ურთიერთáƒáƒ‘ის სეგმენტის ზáƒáƒ›áƒ" -#: controldata.c:619 +#: controldata.c:618 #, c-format msgid " WAL block size" msgstr " WAL ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ" -#: controldata.c:622 +#: controldata.c:621 #, c-format msgid " WAL segment size" msgstr " WAL-ის სეგმენტის ზáƒáƒ›áƒ" -#: controldata.c:625 +#: controldata.c:624 #, c-format msgid " maximum identifier length" msgstr " იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიგრძე" -#: controldata.c:628 +#: controldata.c:627 #, c-format msgid " maximum number of indexed columns" msgstr " ინდექსირებული სვეტების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ" -#: controldata.c:631 +#: controldata.c:630 #, c-format msgid " maximum TOAST chunk size" msgstr " TOAST ნáƒáƒ’ლეჯის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ზáƒáƒ›áƒ" -#: controldata.c:635 +#: controldata.c:634 #, c-format msgid " large-object chunk size" msgstr " დიდი áƒáƒ‘იექტის ნáƒáƒ’ლეჯის ზáƒáƒ›áƒ" -#: controldata.c:638 +#: controldata.c:637 #, c-format msgid " dates/times are integers?" msgstr " დრáƒáƒ”ბი დრთáƒáƒ áƒ˜áƒ¦áƒ”ბი მთელი რიცხვებიáƒ?" -#: controldata.c:642 +#: controldata.c:641 #, c-format msgid " data checksum version" msgstr " მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ვერსიáƒ" -#: controldata.c:644 +#: controldata.c:643 #, c-format msgid "Cannot continue without required control information, terminating" msgstr "ვერ გáƒáƒ’რძელდებრსáƒáƒ­áƒ˜áƒ áƒ კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ áƒ”შე, დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბáƒ" -#: controldata.c:659 +#: controldata.c:658 #, c-format msgid "" "old and new pg_controldata alignments are invalid or do not match.\n" @@ -638,77 +863,77 @@ msgstr "" "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata სწáƒáƒ áƒ”ბები ბáƒáƒ—ილირáƒáƒœ áƒáƒ  ემთხვევáƒ\n" "სáƒáƒ•áƒáƒ áƒáƒ£áƒ“áƒáƒ“, ერთი კლáƒáƒ¡áƒ¢áƒ”რი 32-ბიტიáƒáƒœáƒ˜áƒ, დáƒáƒœáƒáƒ áƒ©áƒ”ნი კი 64" -#: controldata.c:663 +#: controldata.c:662 #, c-format msgid "old and new pg_controldata block sizes are invalid or do not match" msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ”ბი ბáƒáƒ—ილირáƒáƒœ áƒáƒ  ემთხვევáƒ" -#: controldata.c:666 +#: controldata.c:665 #, c-format msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match" msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ურთიერთáƒáƒ‘ის სეგმენტის ზáƒáƒ›áƒ”ბი ბáƒáƒ—ილირáƒáƒœ áƒáƒ  ემთხვევáƒ" -#: controldata.c:669 +#: controldata.c:668 #, c-format msgid "old and new pg_controldata WAL block sizes are invalid or do not match" msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის WAL-ის ბლáƒáƒ™áƒ˜áƒ¡ ზáƒáƒ›áƒ”ბი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ áƒáƒ  ემთხვევáƒ" -#: controldata.c:672 +#: controldata.c:671 #, c-format msgid "old and new pg_controldata WAL segment sizes are invalid or do not match" msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის WAL-ის სეგმენტის ზáƒáƒ›áƒ”ბი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ áƒáƒ  ემთხვევáƒ" -#: controldata.c:675 +#: controldata.c:674 #, c-format msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match" msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ სიგრძეები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ áƒáƒ  ემთხვევáƒ" -#: controldata.c:678 +#: controldata.c:677 #, c-format msgid "old and new pg_controldata maximum indexed columns are invalid or do not match" msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ინდექსირებული სვეტები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ áƒáƒ  ემთხვევáƒ" -#: controldata.c:681 +#: controldata.c:680 #, c-format msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match" msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის TOAST-ის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ ნáƒáƒ’ლეჯის ზáƒáƒ›áƒ”ბი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ áƒáƒ  ემთხვევáƒ" -#: controldata.c:686 +#: controldata.c:685 #, c-format msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match" msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის დიდი áƒáƒ‘იექტის ნáƒáƒ’ლეჯის ზáƒáƒ›áƒ”ბი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ áƒáƒœ áƒáƒ  ემთხვევáƒ" -#: controldata.c:689 +#: controldata.c:688 #, c-format msgid "old and new pg_controldata date/time storage types do not match" msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ pg_controldata-ის თáƒáƒ áƒ˜áƒ¦áƒ˜/დრáƒáƒ˜áƒ¡ შენáƒáƒ®áƒ•ის ტიპები áƒáƒ  ემთხვევáƒ" -#: controldata.c:702 +#: controldata.c:701 #, c-format msgid "old cluster does not use data checksums but the new one does" msgstr "ძველი კლáƒáƒ¡áƒ¢áƒ”რი áƒáƒ  იყენებს მáƒáƒœáƒáƒªáƒ”მთრშემáƒáƒ¬áƒ›áƒ”ბáƒáƒ¡, მáƒáƒ’რáƒáƒ› áƒáƒ®áƒáƒšáƒ˜ áƒáƒ™áƒ”თებს" -#: controldata.c:705 +#: controldata.c:704 #, c-format msgid "old cluster uses data checksums but the new one does not" msgstr "ძველი კლáƒáƒ¡áƒ¢áƒ”რი იყენებს მáƒáƒœáƒáƒªáƒ”მთრშემáƒáƒ¬áƒ›áƒ”ბáƒáƒ¡, áƒáƒ®áƒáƒšáƒ˜ კი áƒáƒ áƒ" -#: controldata.c:707 +#: controldata.c:706 #, c-format msgid "old and new cluster pg_controldata checksum versions do not match" msgstr "ძველი დრáƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რების pg_controldata -ის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ვერსიები áƒáƒ  ემთხვევáƒ" -#: controldata.c:718 +#: controldata.c:717 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "ძველ გლáƒáƒ‘áƒáƒšáƒ£áƒ /pg_control-ზე \".old\" სუფიქსის დáƒáƒ›áƒáƒ¢áƒ”ბáƒ" -#: controldata.c:723 +#: controldata.c:722 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" -#: controldata.c:727 +#: controldata.c:726 #, c-format msgid "" "\n" @@ -733,27 +958,32 @@ msgstr "გლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ áƒáƒ‘იექტების დáƒáƒ›áƒž msgid "Creating dump of database schemas" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სქემების დáƒáƒ›áƒžáƒ˜áƒ¡ შექმნáƒ" -#: exec.c:47 exec.c:52 +#: exec.c:47 +#, c-format +msgid "could not get pg_ctl version data using %s: %m" +msgstr "%s გáƒáƒ›áƒáƒ§áƒ”ნებით pg_ctl ვერსიის მáƒáƒœáƒáƒªáƒ”მები ვერ მივიღე: %m" + +#: exec.c:51 #, c-format msgid "could not get pg_ctl version data using %s: %s" msgstr "%s გáƒáƒ›áƒáƒ§áƒ”ნებით pg_ctl ვერსიის მáƒáƒœáƒáƒªáƒ”მები ვერ მივიღე: %s" -#: exec.c:56 +#: exec.c:55 #, c-format msgid "could not get pg_ctl version output from %s" msgstr "%s გáƒáƒ›áƒáƒ§áƒ”ნებით pg_ctl ვერსირვერ მივიღე" -#: exec.c:113 exec.c:117 +#: exec.c:112 exec.c:116 #, c-format msgid "command too long" msgstr "ბრძáƒáƒœáƒ”ბრძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" -#: exec.c:161 pg_upgrade.c:286 +#: exec.c:160 pg_upgrade.c:311 #, c-format msgid "could not open log file \"%s\": %m" msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m" -#: exec.c:193 +#: exec.c:192 #, c-format msgid "" "\n" @@ -762,12 +992,12 @@ msgstr "" "\n" "*შეცდáƒáƒ›áƒ" -#: exec.c:196 +#: exec.c:195 #, c-format msgid "There were problems executing \"%s\"" msgstr "%s-ის შესრულების პრáƒáƒ‘ლემáƒ" -#: exec.c:199 +#: exec.c:198 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" @@ -776,7 +1006,7 @@ msgstr "" "áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ¡ მიზეზის გáƒáƒ›áƒáƒ¡áƒáƒ•ლენáƒáƒ“ გáƒáƒ“áƒáƒáƒ•ლეთ თვáƒáƒšáƒ˜ \n" "\"%s\"-ის áƒáƒœ \"%s\"-ის ბáƒáƒšáƒ რáƒáƒ›áƒ“ენიმე ფáƒáƒ˜áƒšáƒ¡." -#: exec.c:204 +#: exec.c:203 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" @@ -785,141 +1015,156 @@ msgstr "" "áƒáƒ•áƒáƒ áƒ˜áƒ˜áƒ¡ მიზეზის გáƒáƒ›áƒáƒ¡áƒáƒ•ლენáƒáƒ“ გáƒáƒ“áƒáƒáƒ•ლეთ თვáƒáƒšáƒ˜\n" "\"%s\"-ის ბáƒáƒšáƒ რáƒáƒ›áƒ“ენიმე ხáƒáƒ–ს." -#: exec.c:219 pg_upgrade.c:296 +#: exec.c:218 pg_upgrade.c:321 #, c-format msgid "could not write to log file \"%s\": %m" msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" -#: exec.c:245 +#: exec.c:244 #, c-format -msgid "could not open file \"%s\" for reading: %s" -msgstr "შეცდáƒáƒ›áƒ %s-ის წáƒáƒ¡áƒáƒ™áƒ˜áƒ—ხáƒáƒ“ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡áƒáƒ¡: %s" +msgid "could not open file \"%s\" for reading: %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: exec.c:272 +#: exec.c:270 #, c-format msgid "You must have read and write access in the current directory." msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში ჩáƒáƒ¬áƒ”რáƒ/წáƒáƒ™áƒ˜áƒ—ხვის წვდáƒáƒ›áƒ”ბი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ." -#: exec.c:325 exec.c:391 +#: exec.c:323 exec.c:389 exec.c:439 #, c-format -msgid "check for \"%s\" failed: %s" -msgstr "\"%s\" შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: %s" +msgid "check for \"%s\" failed: %m" +msgstr "\"%s\" შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: %m" -#: exec.c:328 exec.c:394 +#: exec.c:326 exec.c:392 #, c-format msgid "\"%s\" is not a directory" msgstr "%s სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" -#: exec.c:441 -#, c-format -msgid "check for \"%s\" failed: %m" -msgstr "\"%s\" შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: %m" - -#: exec.c:446 +#: exec.c:444 #, c-format msgid "check for \"%s\" failed: cannot execute" msgstr "\"%s\" შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: გáƒáƒ¨áƒ•ების შეცდáƒáƒ›áƒ" -#: exec.c:456 +#: exec.c:454 #, c-format msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"" msgstr "\"%s\" შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ვერსიáƒ: ვიპáƒáƒ•ე \"%s\" მáƒáƒ•ელáƒáƒ“ი \"%s\"" -#: file.c:43 file.c:64 +#: file.c:44 #, c-format -msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კლáƒáƒœáƒ˜áƒ áƒ”ბისáƒáƒ¡ (\"%s\"-დáƒáƒœ \"%s\"-მდე): %s" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) დáƒáƒ™áƒšáƒáƒœáƒ•ისáƒáƒ¡ (\"%s\"-დáƒáƒœ \"%s\"-მდე): %m" -#: file.c:50 +#: file.c:51 #, c-format -msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s" -msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კლáƒáƒœáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" +msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) დáƒáƒ™áƒšáƒáƒœáƒ•ისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: file.c:55 +#: file.c:56 #, c-format -msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s" -msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კლáƒáƒœáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შექმნის შეცდáƒáƒ›áƒ: %s" +msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) დáƒáƒ™áƒšáƒáƒœáƒ•ისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შექმნის შეცდáƒáƒ›áƒ: %m" -#: file.c:90 file.c:193 +#: file.c:65 #, c-format -msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s" -msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡ : ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s" +msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კლáƒáƒœáƒ˜áƒ áƒ”ბისáƒáƒ¡ (\"%s\"-დáƒáƒœ \"%s\"-მდე): %s" + +#: file.c:91 file.c:160 file.c:233 +#, c-format +msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡ : ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: file.c:96 file.c:165 file.c:242 +#, c-format +msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შექმნის შეცდáƒáƒ›áƒ: %m" -#: file.c:95 file.c:202 +#: file.c:110 file.c:266 #, c-format -msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s" -msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შექმნის შეცდáƒáƒ›áƒ: %s" +msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %m" +msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: file.c:109 file.c:226 +#: file.c:122 file.c:344 #, c-format -msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s" -msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s" +msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %m" +msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" -#: file.c:121 file.c:304 +#: file.c:136 #, c-format -msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s" -msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %s" +msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡ (\"%s\"-დáƒáƒœ \"%s\"-მდე): %m" -#: file.c:135 +#: file.c:172 #, c-format -msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡ (\"%s\"-დáƒáƒœ \"%s\"-მდე): %s" +msgid "error while copying relation \"%s.%s\": could not copy file range from \"%s\" to \"%s\": %m" +msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ შუáƒáƒšáƒ”დის კáƒáƒžáƒ˜áƒ áƒ”ბრ\"%s\"-დáƒáƒœ \"%s\"-მდე შეუძლებელიáƒ: %m" -#: file.c:154 +#: file.c:194 #, c-format -msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) ბმულის შექმნისáƒáƒ¡ (\"%s\"-დáƒáƒœ \"%s\"-მდე): %s" +msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) ბმულის შექმნისáƒáƒ¡ (\"%s\"-დáƒáƒœ \"%s\"-მდე): %m" -#: file.c:197 +#: file.c:237 #, c-format -msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s" -msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") áƒáƒ¦áƒ›áƒáƒ©áƒ”ნის შეცდáƒáƒ›áƒ: %s" +msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %m" +msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის (%s.%s) კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") áƒáƒ¦áƒ›áƒáƒ©áƒ”ნის შეცდáƒáƒ›áƒ: %m" -#: file.c:229 +#: file.c:269 #, c-format msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"" msgstr "შეცდáƒáƒ›áƒ ურთიერთáƒáƒ‘ის \"%s.%s\" კáƒáƒžáƒ˜áƒ áƒ”ბისáƒáƒ¡: ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ნáƒáƒžáƒáƒ•ნირნáƒáƒ¬áƒ˜áƒšáƒáƒ‘რივი გვერდი" -#: file.c:331 file.c:348 +#: file.c:371 file.c:387 #, c-format -msgid "could not clone file between old and new data directories: %s" -msgstr "მáƒáƒœáƒáƒªáƒ”მების ძველ დრáƒáƒ®áƒáƒš სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეებს შáƒáƒ áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ კლáƒáƒœáƒ˜áƒ áƒ”ბის შეცდáƒáƒ›áƒ: %s" +msgid "could not clone file between old and new data directories: %m" +msgstr "მáƒáƒœáƒáƒªáƒ”მების ძველ დრáƒáƒ®áƒáƒš სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეებს შáƒáƒ áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ™áƒšáƒáƒœáƒ•ის შეცდáƒáƒ›áƒ: %m" -#: file.c:344 +#: file.c:383 file.c:420 #, c-format -msgid "could not create file \"%s\": %s" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %s" +msgid "could not create file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %m" -#: file.c:355 +#: file.c:393 #, c-format msgid "file cloning not supported on this platform" msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე კლáƒáƒœáƒ˜áƒ áƒ”ბრმხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" -#: file.c:372 +#: file.c:424 +#, c-format +msgid "could not copy file range between old and new data directories: %m" +msgstr "მáƒáƒœáƒáƒªáƒ”მების ძველ დრáƒáƒ®áƒáƒš სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეებს შáƒáƒ áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ შუáƒáƒšáƒ”დის კáƒáƒžáƒ˜áƒ áƒ”ბრშეუძლებელიáƒ: %m" + +#: file.c:430 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე copy_file_range მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" + +#: file.c:447 #, c-format msgid "" -"could not create hard link between old and new data directories: %s\n" +"could not create hard link between old and new data directories: %m\n" "In link mode the old and new data directories must be on the same file system." msgstr "" -"ძველი დრáƒáƒ®áƒáƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეებს შურმყáƒáƒ áƒ˜ ბმულის შექმნრშეუძლებელიáƒ: %s\n" +"ძველი დრáƒáƒ®áƒáƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეებს შურმყáƒáƒ áƒ˜ ბმულის შექმნრშეუძლებელიáƒ: %m\n" "ბმულის რეჟიმში ძველი დრáƒáƒ®áƒáƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეები ერთი დრიგივე ფáƒáƒ˜áƒšáƒ£áƒ  სისტემáƒáƒ–ე უნდრიყáƒáƒ¡." -#: function.c:128 +#: function.c:154 #, c-format msgid "Checking for presence of required libraries" msgstr "სáƒáƒ­áƒ˜áƒ áƒ ბიბლიáƒáƒ—ეკების áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: function.c:165 +#: function.c:190 #, c-format msgid "could not load library \"%s\": %s" msgstr "ბიბლიáƒáƒ—ეკის (\"%s\") ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ: %s" -#: function.c:176 +#: function.c:201 #, c-format msgid "In database: %s\n" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜: %s\n" -#: function.c:186 +#: function.c:211 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" @@ -934,47 +1179,47 @@ msgstr "" "პრáƒáƒ‘ლემური ბიბლიáƒáƒ—ეკების სიის ნáƒáƒ®áƒ•რშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" " %s" -#: info.c:126 +#: info.c:128 #, c-format msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"" msgstr "ურთიერთáƒáƒ‘ის სáƒáƒ®áƒ”ლები OID-ით %u ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\" áƒáƒ  ემთხვევáƒ: ძველი სáƒáƒ®áƒ”ლი \"%s.%s.\", áƒáƒ®áƒáƒšáƒ˜ კი \"%s.%s\"" -#: info.c:146 +#: info.c:148 #, c-format msgid "Failed to match up old and new tables in database \"%s\"" msgstr "შეცდáƒáƒ›áƒ ძველ დრáƒáƒ®áƒáƒš ცხრილებს შáƒáƒ áƒ˜áƒ¡ დáƒáƒ›áƒ—ხვევისáƒáƒ¡ ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\"" -#: info.c:227 +#: info.c:229 #, c-format msgid " which is an index on \"%s.%s\"" msgstr " რáƒáƒ›áƒ”ლიც ინდექსირ\"%s.%s\"" -#: info.c:237 +#: info.c:239 #, c-format msgid " which is an index on OID %u" msgstr " რáƒáƒª áƒáƒ áƒ˜áƒ¡ ინდექსი OID-ზე %u" -#: info.c:249 +#: info.c:251 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr " რáƒáƒ›áƒ”ლიც TOAST ცხრილირ\"%s.%s\"-სთვის" -#: info.c:257 +#: info.c:259 #, c-format msgid " which is the TOAST table for OID %u" msgstr " რáƒáƒ›áƒ”ლიც TOAST ცხრილირ%u-ე OID-სთვის" -#: info.c:261 +#: info.c:263 #, c-format msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s" msgstr "ძველ კლáƒáƒ¡áƒ¢áƒ”რში áƒáƒ®áƒáƒšáƒ˜ ურთიერთáƒáƒ‘ისთვის OID -ით %u ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\" დáƒáƒ›áƒ—ხვევრვერ ვიპáƒáƒ•ე: %s" -#: info.c:264 +#: info.c:266 #, c-format msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s" msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ძველი ურთიერთáƒáƒ‘ისთვის OID -ით %u ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\" დáƒáƒ›áƒ—ხვევრვერ ვიპáƒáƒ•ე: %s" -#: info.c:289 +#: info.c:300 #, c-format msgid "" "\n" @@ -983,7 +1228,7 @@ msgstr "" "\n" "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ ბáƒáƒ–ები:" -#: info.c:291 +#: info.c:302 #, c-format msgid "" "\n" @@ -992,82 +1237,92 @@ msgstr "" "\n" "სáƒáƒ›áƒ˜áƒ–ნე ბáƒáƒ–ები:" -#: info.c:329 +#: info.c:346 #, c-format msgid "template0 not found" msgstr "template0 ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" -#: info.c:645 +#: info.c:805 +#, c-format +msgid "Database: \"%s\"" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜: \"%s\"" + +#: info.c:818 +#, c-format +msgid "relname: \"%s.%s\", reloid: %u, reltblspace: \"%s\"" +msgstr "relname: \"%s.%s\", reloid: %u, reltblspace: \"%s\"" + +#: info.c:832 #, c-format -msgid "Database: %s" -msgstr "ბáƒáƒ–áƒ: %s" +msgid "Logical replication slots in the database:" +msgstr "ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბი მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¨áƒ˜:" -#: info.c:657 +#: info.c:838 #, c-format -msgid "relname: %s.%s: reloid: %u reltblspace: %s" -msgstr "relname: %s.%s: reloid: %u reltblspace: %s" +msgid "slot name: \"%s\", output plugin: \"%s\", two_phase: %s" +msgstr "სლáƒáƒ¢áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\", გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბáƒ: \"%s\", two_phase: %s" -#: option.c:101 +#: option.c:105 #, c-format msgid "%s: cannot be run as root" msgstr "%s: root-ით ვერ გáƒáƒ£áƒ¨áƒ•ებთ" -#: option.c:168 +#: option.c:172 #, c-format msgid "invalid old port number" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ძველი პáƒáƒ áƒ¢áƒ˜áƒ¡ ნáƒáƒ›áƒ”რი" -#: option.c:173 +#: option.c:177 #, c-format msgid "invalid new port number" msgstr "áƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒ¢áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი" -#: option.c:203 +#: option.c:216 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'.\n" -#: option.c:210 +#: option.c:223 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")" -#: option.c:213 +#: option.c:229 #, c-format msgid "Running in verbose mode" msgstr "დáƒáƒ›áƒáƒ¢áƒ”ბითი შეტყáƒáƒ‘ინებების ჩáƒáƒ áƒ—ვáƒ" -#: option.c:231 +#: option.c:247 msgid "old cluster binaries reside" msgstr "ძველი კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ”ბი მდებáƒáƒ áƒ”áƒáƒ‘ს" -#: option.c:233 +#: option.c:249 msgid "new cluster binaries reside" msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ”ბი მდებáƒáƒ áƒ”áƒáƒ‘ს" -#: option.c:235 +#: option.c:251 msgid "old cluster data resides" msgstr "ძველი კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მები მდებáƒáƒ áƒ”áƒáƒ‘ს" -#: option.c:237 +#: option.c:253 msgid "new cluster data resides" msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მები მდებáƒáƒ áƒ”áƒáƒ‘ს" -#: option.c:239 +#: option.c:255 msgid "sockets will be created" msgstr "სáƒáƒ™áƒ”ტები შეიქმნებáƒ" -#: option.c:256 option.c:356 +#: option.c:272 option.c:374 #, c-format msgid "could not determine current directory" msgstr "მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ" -#: option.c:259 +#: option.c:275 #, c-format msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows" msgstr "pg_upgrade-ის გáƒáƒ¨áƒ•ებრWindows-ზე áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“იდáƒáƒœ შეუძლებელიáƒ" -#: option.c:268 +#: option.c:284 #, c-format msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" @@ -1076,12 +1331,12 @@ msgstr "" "pg_upgrade -ი PostgreSQL კლáƒáƒ¡áƒ¢áƒ”რს სხვრმთáƒáƒ•áƒáƒ  ვერსიáƒáƒ–ე გáƒáƒœáƒáƒáƒ®áƒšáƒ”ბს.\n" "\n" -#: option.c:269 +#: option.c:285 #, c-format msgid "Usage:\n" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" -#: option.c:270 +#: option.c:286 #, c-format msgid "" " pg_upgrade [OPTION]...\n" @@ -1090,17 +1345,17 @@ msgstr "" " pg_upgrade [პáƒáƒ áƒáƒ›áƒ”ტრი]...\n" "\n" -#: option.c:271 +#: option.c:287 #, c-format msgid "Options:\n" -msgstr "პáƒáƒ áƒáƒ›áƒ”რები:\n" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: option.c:272 +#: option.c:288 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" msgstr " -b, --old-bindir=BINDIR ძველი კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: option.c:273 +#: option.c:289 #, c-format msgid "" " -B, --new-bindir=BINDIR new cluster executable directory (default\n" @@ -1109,97 +1364,107 @@ msgstr "" " -B, --new-bindir=BINDIR áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (ნáƒáƒ’ულისხმები\n" " იგივე სáƒáƒ¥áƒáƒ¦áƒšáƒ“ე, რáƒáƒª pg_upgrade)\n" -#: option.c:275 +#: option.c:291 #, c-format msgid " -c, --check check clusters only, don't change any data\n" msgstr " -c, --check კლáƒáƒ¡áƒ¢áƒ”რების მხáƒáƒšáƒáƒ“ შემáƒáƒ¬áƒ›áƒ”ბáƒ. მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  შეიცვლებáƒ\n" -#: option.c:276 +#: option.c:292 #, c-format msgid " -d, --old-datadir=DATADIR old cluster data directory\n" msgstr " -d, --old-datadir=DATADIR ძველი კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: option.c:277 +#: option.c:293 #, c-format msgid " -D, --new-datadir=DATADIR new cluster data directory\n" msgstr " -D, --new-datadir=DATADIR áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: option.c:278 +#: option.c:294 #, c-format msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" msgstr " -j, --jobs=NUM ერთდრáƒáƒ£áƒšáƒáƒ“ გáƒáƒ¡áƒáƒ¨áƒ•ები პრáƒáƒªáƒ”სების áƒáƒœ ნáƒáƒ™áƒáƒ“ების რიცხვი\n" -#: option.c:279 +#: option.c:295 #, c-format msgid " -k, --link link instead of copying files to new cluster\n" msgstr " -k, --link áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ“áƒáƒ‘მáƒ, კáƒáƒžáƒ˜áƒ áƒ”ბის ნáƒáƒªáƒ•ლáƒáƒ“\n" -#: option.c:280 +#: option.c:296 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync áƒáƒ  დáƒáƒ•ელáƒáƒ“რცვლილებების დისკზე უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ ჩáƒáƒ¬áƒ”რáƒáƒ¡\n" -#: option.c:281 +#: option.c:297 #, c-format msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n" msgstr " -o, -old-options=OPTIONS სერვერზე გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მი ძველი კლáƒáƒ¡áƒ¢áƒ”რის პáƒáƒ áƒáƒ›áƒ”ტრები\n" -#: option.c:282 +#: option.c:298 #, c-format msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n" msgstr " -O, -new-options=OPTIONS სერვერზე გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მი áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის პáƒáƒ áƒáƒ›áƒ”ტრები\n" -#: option.c:283 +#: option.c:299 #, c-format msgid " -p, --old-port=PORT old cluster port number (default %d)\n" msgstr " -p, -old-port=PORT ძველი კლáƒáƒ¡áƒ¢áƒ”რის პáƒáƒ áƒ¢áƒ˜áƒ¡ ნáƒáƒ›áƒ”რი (ნáƒáƒ’ულისხმები %d)\n" -#: option.c:284 +#: option.c:300 #, c-format msgid " -P, --new-port=PORT new cluster port number (default %d)\n" msgstr " -P, --new-port=PORT áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის პáƒáƒ áƒ¢áƒ˜áƒ¡ ნáƒáƒ›áƒ”რი (ნáƒáƒ’ულისხმები %d)\n" -#: option.c:285 +#: option.c:301 #, c-format msgid " -r, --retain retain SQL and log files after success\n" msgstr " -r, --retain SQL დრჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბს დáƒáƒ¢áƒáƒ•ებრწáƒáƒ áƒ›áƒáƒ¢áƒ”ბის შემდეგ \n" -#: option.c:286 +#: option.c:302 #, c-format msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" msgstr " -s, --socketdir=DIR სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (ნáƒáƒ’ულისხმებირმიმდინáƒáƒ áƒ”.)\n" -#: option.c:287 +#: option.c:303 #, c-format msgid " -U, --username=NAME cluster superuser (default \"%s\")\n" msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი კლáƒáƒ¡áƒ¢áƒ”რის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი (ნáƒáƒ’ულისხმები: \"%s\")\n" -#: option.c:288 +#: option.c:304 #, c-format msgid " -v, --verbose enable verbose internal logging\n" msgstr " -v, --verbose შიდრდáƒáƒ›áƒáƒ¢áƒ”ბითი ჟურნáƒáƒšáƒ˜áƒ¡ ჩáƒáƒ áƒ—ვáƒ\n" -#: option.c:289 +#: option.c:305 #, c-format msgid " -V, --version display version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: option.c:290 +#: option.c:306 #, c-format msgid " --clone clone instead of copying files to new cluster\n" msgstr " --clone áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ფáƒáƒ˜áƒšáƒ”ბის კლáƒáƒœáƒ˜áƒ áƒ”ბრკáƒáƒžáƒ˜áƒ áƒ”ბის ნáƒáƒªáƒ•ლáƒáƒ“ \n" -#: option.c:291 +#: option.c:307 #, c-format msgid " --copy copy files to new cluster (default)\n" msgstr " --clone áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ფáƒáƒ˜áƒšáƒ”ბის კლáƒáƒœáƒ˜áƒ áƒ”ბრკáƒáƒžáƒ˜áƒ áƒ”ბის ნáƒáƒªáƒ•ლáƒáƒ“ (ნáƒáƒ’ულისხმები)\n" -#: option.c:292 +#: option.c:308 +#, c-format +msgid " --copy-file-range copy files to new cluster with copy_file_range\n" +msgstr " --copy-file-range ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბრáƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში copy_file_range-ით\n" + +#: option.c:309 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=მეთáƒáƒ“ი ფáƒáƒ˜áƒšáƒ”ბის დისკზე სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის დáƒáƒ§áƒ”ნებáƒ\n" + +#: option.c:310 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: option.c:293 +#: option.c:311 #, c-format msgid "" "\n" @@ -1214,7 +1479,7 @@ msgstr "" " გáƒáƒ›áƒáƒ áƒ—áƒáƒ— postmaster სერვისი ძველ კლáƒáƒ¡áƒ¢áƒ”რზე\n" " გáƒáƒ›áƒáƒ áƒ—áƒáƒ— postmaster სერვისი áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რზე\n" -#: option.c:298 +#: option.c:316 #, c-format msgid "" "\n" @@ -1231,7 +1496,7 @@ msgstr "" " ძველი ვერსიის \"bin\" სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (-b BINDIR)\n" " áƒáƒ®áƒáƒšáƒ˜ ვერსიის \"bin\" სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (-B BINDIR)\n" -#: option.c:304 +#: option.c:322 #, c-format msgid "" "\n" @@ -1244,7 +1509,7 @@ msgstr "" " pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin\n" "áƒáƒœ\n" -#: option.c:309 +#: option.c:327 #, c-format msgid "" " $ export PGDATAOLD=oldCluster/data\n" @@ -1259,7 +1524,7 @@ msgstr "" " $ export PGBINNEW=newCluster/bin\n" " $ pg_upgrade\n" -#: option.c:315 +#: option.c:333 #, c-format msgid "" " C:\\> set PGDATAOLD=oldCluster/data\n" @@ -1274,7 +1539,7 @@ msgstr "" " C:\\> set PGBINNEW=newCluster/bin\n" " C:\\> pg_upgrade\n" -#: option.c:321 +#: option.c:339 #, c-format msgid "" "\n" @@ -1283,12 +1548,12 @@ msgstr "" "\n" "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n" -#: option.c:322 +#: option.c:340 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" -#: option.c:362 +#: option.c:380 #, c-format msgid "" "You must identify the directory where the %s.\n" @@ -1297,50 +1562,50 @@ msgstr "" "%s-ის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის იდენტიფიკáƒáƒªáƒ˜áƒ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ.\n" "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ %s პáƒáƒ áƒáƒ›áƒ”ტრი áƒáƒœ გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ი %s." -#: option.c:415 +#: option.c:433 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის რეáƒáƒšáƒ£áƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის პáƒáƒ•ნáƒ" -#: option.c:417 +#: option.c:435 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "სáƒáƒ›áƒ˜áƒ–ნე კლáƒáƒ¡áƒ¢áƒ”რის რეáƒáƒšáƒ£áƒ áƒ˜ მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის პáƒáƒ•ნáƒ" -#: option.c:430 +#: option.c:448 #, c-format -msgid "could not get data directory using %s: %s" -msgstr "ვერ მივიღე მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე %s გáƒáƒ›áƒáƒ§áƒ”ნებით: %s" +msgid "could not get data directory using %s: %m" +msgstr "ვერ მივიღე მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე %s გáƒáƒ›áƒáƒ§áƒ”ნებით: %m" -#: option.c:435 +#: option.c:452 #, c-format -msgid "could not get control data directory using %s: %s" +msgid "could not get data directory using %s: %s" msgstr "ვერ მივიღე მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე %s გáƒáƒ›áƒáƒ§áƒ”ნებით: %s" -#: option.c:484 +#: option.c:500 #, c-format -msgid "could not read line %d from file \"%s\": %s" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ (%2$s) %1$d-ე ხáƒáƒ–ის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: %3$s" +msgid "could not read line %d from file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ (%2$s) %1$d-ე ხáƒáƒ–ის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: %3$m" -#: option.c:501 +#: option.c:517 #, c-format msgid "user-supplied old port number %hu corrected to %hu" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ მáƒáƒ¬áƒáƒ“ებული ძველი პáƒáƒ áƒ¢áƒ˜áƒ¡ ნáƒáƒ›áƒ”რი %hu შესწáƒáƒ áƒ”ბულირ%hu" #: parallel.c:127 parallel.c:235 #, c-format -msgid "could not create worker process: %s" -msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის შექმნრშეუძლებელიáƒ: %s" +msgid "could not create worker process: %m" +msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის შექმნრშეუძლებელიáƒ: %m" #: parallel.c:143 parallel.c:253 #, c-format -msgid "could not create worker thread: %s" -msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” ნáƒáƒ™áƒáƒ“ის შექმნრშეუძლებელიáƒ: %s" +msgid "could not create worker thread: %m" +msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” ნáƒáƒ™áƒáƒ“ის შექმნრშეუძლებელიáƒ: %m" #: parallel.c:294 #, c-format -msgid "%s() failed: %s" -msgstr "%s()-ის შეცდáƒáƒ›áƒ: %s" +msgid "%s() failed: %m" +msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m" #: parallel.c:298 #, c-format @@ -1349,15 +1614,15 @@ msgstr "შვილი პრáƒáƒªáƒ”სი áƒáƒ áƒáƒœáƒáƒ áƒ›áƒáƒšáƒ£áƒ  #: parallel.c:313 #, c-format -msgid "child worker exited abnormally: %s" -msgstr "შვილი დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” áƒáƒ áƒáƒœáƒáƒ áƒ›áƒáƒšáƒ£áƒ áƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“რსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %s" +msgid "child worker exited abnormally: %m" +msgstr "შვილი დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სი áƒáƒ áƒáƒœáƒáƒ áƒ›áƒáƒšáƒ£áƒ áƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“რსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %m" -#: pg_upgrade.c:107 +#: pg_upgrade.c:115 #, c-format -msgid "could not read permissions of directory \"%s\": %s" -msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წვდáƒáƒ›áƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელირ\"%s\": %s" +msgid "could not read permissions of directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წვდáƒáƒ›áƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელირ\"%s\": %m" -#: pg_upgrade.c:139 +#: pg_upgrade.c:147 #, c-format msgid "" "\n" @@ -1368,17 +1633,17 @@ msgstr "" "მიმდინáƒáƒ áƒ”áƒáƒ‘ს გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ\n" "------------------" -#: pg_upgrade.c:184 +#: pg_upgrade.c:192 #, c-format msgid "Setting next OID for new cluster" msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რისთვის შემდეგი OID დáƒáƒ§áƒ”ნებáƒ" -#: pg_upgrade.c:193 +#: pg_upgrade.c:216 #, c-format msgid "Sync data directory to disk" msgstr "მáƒáƒœáƒáƒªáƒ”მების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის დისკთáƒáƒœ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ" -#: pg_upgrade.c:205 +#: pg_upgrade.c:230 #, c-format msgid "" "\n" @@ -1389,23 +1654,23 @@ msgstr "" "გáƒáƒœáƒáƒ®áƒšáƒ”ბრდáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულიáƒ\n" "----------------" -#: pg_upgrade.c:238 pg_upgrade.c:251 pg_upgrade.c:258 pg_upgrade.c:265 -#: pg_upgrade.c:283 pg_upgrade.c:294 +#: pg_upgrade.c:263 pg_upgrade.c:276 pg_upgrade.c:283 pg_upgrade.c:290 +#: pg_upgrade.c:308 pg_upgrade.c:319 #, c-format msgid "directory path for new cluster is too long" msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის ბილიკი ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" -#: pg_upgrade.c:272 pg_upgrade.c:274 pg_upgrade.c:276 pg_upgrade.c:278 +#: pg_upgrade.c:297 pg_upgrade.c:299 pg_upgrade.c:301 pg_upgrade.c:303 #, c-format msgid "could not create directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m" -#: pg_upgrade.c:327 +#: pg_upgrade.c:352 #, c-format msgid "%s: could not find own program executable" msgstr "%s: სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ˜áƒ¡ პáƒáƒ•ნრშეუძლებელიáƒ" -#: pg_upgrade.c:353 +#: pg_upgrade.c:378 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" @@ -1414,7 +1679,7 @@ msgstr "" "რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, ძველ კლáƒáƒ¡áƒ¢áƒ”რს postmaster ჯერ კიდევ ემსáƒáƒ®áƒ£áƒ áƒ”ბáƒ.\n" "გáƒáƒ›áƒáƒ áƒ—ეთ postmaster დრთáƒáƒ•იდáƒáƒœ სცáƒáƒ“ეთ." -#: pg_upgrade.c:366 +#: pg_upgrade.c:391 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" @@ -1423,81 +1688,86 @@ msgstr "" "რáƒáƒ’áƒáƒ áƒª ჩáƒáƒœáƒ¡, áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რს postmaster ემსáƒáƒ®áƒ£áƒ áƒ”ბáƒ.\n" "გáƒáƒ›áƒáƒ áƒ—ეთ postmaster დრთáƒáƒ•იდáƒáƒœ სცáƒáƒ“ეთ." -#: pg_upgrade.c:388 +#: pg_upgrade.c:413 #, c-format msgid "Setting locale and encoding for new cluster" msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რის ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ დრკáƒáƒ“ირების დáƒáƒ§áƒ”ნებáƒ" -#: pg_upgrade.c:450 +#: pg_upgrade.c:489 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ყველრმწკრივის áƒáƒœáƒáƒšáƒ˜áƒ–ი" -#: pg_upgrade.c:463 +#: pg_upgrade.c:502 #, c-format msgid "Freezing all rows in the new cluster" msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ყველრმწკრივის გáƒáƒ§áƒ˜áƒœáƒ•áƒ" -#: pg_upgrade.c:483 +#: pg_upgrade.c:522 #, c-format msgid "Restoring global objects in the new cluster" msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რში გლáƒáƒ‘áƒáƒšáƒ£áƒ áƒ˜ áƒáƒ‘იექტების áƒáƒ¦áƒ“გენáƒ" -#: pg_upgrade.c:499 +#: pg_upgrade.c:538 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში ბáƒáƒ–ის სქემების áƒáƒ¦áƒ“გენáƒ" -#: pg_upgrade.c:605 +#: pg_upgrade.c:662 #, c-format msgid "Deleting files from new %s" msgstr "ფáƒáƒ˜áƒšáƒ”ბის წáƒáƒ¨áƒšáƒ áƒáƒ®áƒáƒšáƒ˜ %s-დáƒáƒœ" -#: pg_upgrade.c:609 +#: pg_upgrade.c:666 #, c-format msgid "could not delete directory \"%s\"" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (\"%s\") წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: pg_upgrade.c:628 +#: pg_upgrade.c:685 #, c-format msgid "Copying old %s to new server" msgstr "ძველი %s -ის კáƒáƒžáƒ˜áƒ áƒ”ბრáƒáƒ®áƒáƒš სერვერზე" -#: pg_upgrade.c:654 +#: pg_upgrade.c:711 #, c-format msgid "Setting oldest XID for new cluster" msgstr "უძველესი XID დáƒáƒ§áƒ”ნებრáƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რისთვის" -#: pg_upgrade.c:662 +#: pg_upgrade.c:719 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რისთვის შემდეგი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ეპáƒáƒ¥áƒ˜áƒ¡áƒ დრID-ის დáƒáƒ§áƒ”ნებáƒ" -#: pg_upgrade.c:692 +#: pg_upgrade.c:749 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რისთვის შემდეგი მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ წáƒáƒœáƒáƒªáƒ•ლებისრდრID-ის დáƒáƒ§áƒ”ნებáƒ" -#: pg_upgrade.c:716 +#: pg_upgrade.c:773 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში უძველესი მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის დáƒáƒ§áƒ”ნებáƒ" -#: pg_upgrade.c:736 +#: pg_upgrade.c:793 #, c-format msgid "Resetting WAL archives" msgstr "WAL áƒáƒ áƒ¥áƒ˜áƒ•ების გáƒáƒ“áƒáƒ¢áƒ•ირთვáƒ" -#: pg_upgrade.c:779 +#: pg_upgrade.c:836 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში frozenxid დრminmxid მთვლელების დáƒáƒ§áƒ”ნებáƒ" -#: pg_upgrade.c:781 +#: pg_upgrade.c:838 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში minmxid მთვლელის დáƒáƒ§áƒ”ნებáƒ" +#: pg_upgrade.c:929 +#, c-format +msgid "Restoring logical replication slots in the new cluster" +msgstr "áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ¢áƒ”რში ლáƒáƒ’იკური რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ სლáƒáƒ¢áƒ”ბის áƒáƒ¦áƒ“გენáƒ" + #: relfilenumber.c:35 #, c-format msgid "Cloning user relation files" @@ -1510,35 +1780,45 @@ msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ურთიერთáƒáƒ‘ის #: relfilenumber.c:41 #, c-format +msgid "Copying user relation files with copy_file_range" +msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ურთიერთáƒáƒ‘ის ფáƒáƒ˜áƒšáƒ”ბის კáƒáƒžáƒ˜áƒ áƒ”ბრcopy_file_range-ით" + +#: relfilenumber.c:44 +#, c-format msgid "Linking user relation files" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ურთიერთáƒáƒ‘ის ფáƒáƒ˜áƒšáƒ”ბის გáƒáƒ“áƒáƒ‘მáƒ" -#: relfilenumber.c:115 +#: relfilenumber.c:118 #, c-format msgid "old database \"%s\" not found in the new cluster" msgstr "ძველი მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–რ\"%s\" áƒáƒ®áƒáƒš კლáƒáƒ¡áƒ¢áƒ”რში áƒáƒ  áƒáƒ áƒ˜áƒ¡ ნáƒáƒžáƒáƒ•ნი" -#: relfilenumber.c:218 +#: relfilenumber.c:221 #, c-format -msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s" -msgstr "შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბისáƒáƒ¡ \"%s.%s\" (\"%s\" \"%s\"): %s" +msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "შეცდáƒáƒ›áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ის შემáƒáƒ¬áƒ›áƒ”ბისáƒáƒ¡ \"%s.%s\" (\"%s\" \"%s\"): %m" -#: relfilenumber.c:236 +#: relfilenumber.c:238 #, c-format msgid "rewriting \"%s\" to \"%s\"" msgstr "გáƒáƒ“áƒáƒ¬áƒ”რრ\"%s\"-დáƒáƒœ \"%s\"-მდე" -#: relfilenumber.c:244 +#: relfilenumber.c:246 #, c-format msgid "cloning \"%s\" to \"%s\"" msgstr "კლáƒáƒœáƒ˜áƒ áƒ”ბრ\"%s\"-დáƒáƒœ \"%s\"-მდე" -#: relfilenumber.c:249 +#: relfilenumber.c:251 #, c-format msgid "copying \"%s\" to \"%s\"" msgstr "კáƒáƒžáƒ˜áƒ áƒ”ბრ\"%s\"-დáƒáƒœ \"%s\"-მდე" -#: relfilenumber.c:254 +#: relfilenumber.c:256 +#, c-format +msgid "copying \"%s\" to \"%s\" with copy_file_range" +msgstr "კáƒáƒžáƒ˜áƒ áƒ”ბრ\"%s\"-დáƒáƒœ \"%s\"-მდე copy_file_range-ით" + +#: relfilenumber.c:261 #, c-format msgid "linking \"%s\" to \"%s\"" msgstr "ბმრ\"%s\"-დáƒáƒœ \"%s\"-მდე" @@ -1574,7 +1854,7 @@ msgstr "ვერსიის ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეც msgid "could not parse version file \"%s\"" msgstr "ვერსიის ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ \"%s\"" -#: server.c:291 +#: server.c:310 #, c-format msgid "" "\n" @@ -1583,7 +1863,7 @@ msgstr "" "\n" "%s" -#: server.c:295 +#: server.c:314 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -1592,7 +1872,7 @@ msgstr "" "ვერ ვუკáƒáƒ•შირდები სáƒáƒ¬áƒ§áƒ˜áƒ¡ postmaster-ს, რáƒáƒ›áƒ”ლიც შემდეგი ბრძáƒáƒœáƒ”ბით გáƒáƒ”შვáƒ:\n" "%s" -#: server.c:299 +#: server.c:318 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -1601,22 +1881,22 @@ msgstr "" "ვერ ვუკáƒáƒ•შირდები სáƒáƒ›áƒ˜áƒ–ნე postmaster-ს, რáƒáƒ›áƒ”ლიც შემდეგი ბრძáƒáƒœáƒ”ბით გáƒáƒ”შვáƒ:\n" "%s" -#: server.c:313 +#: server.c:332 #, c-format msgid "pg_ctl failed to start the source server, or connection failed" msgstr "pg_ctl-ის შეცდáƒáƒ›áƒ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სერვერის გáƒáƒ¨áƒ•ებისáƒáƒ¡ áƒáƒœ შეერთების შეცდáƒáƒ›áƒ" -#: server.c:315 +#: server.c:334 #, c-format msgid "pg_ctl failed to start the target server, or connection failed" msgstr "pg_ctl-ის შეცდáƒáƒ›áƒ სáƒáƒ›áƒ˜áƒ–ნე სერვერის გáƒáƒ¨áƒ•ებისáƒáƒ¡ áƒáƒœ შეერთების შეცდáƒáƒ›áƒ" -#: server.c:360 +#: server.c:379 #, c-format msgid "out of memory" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" -#: server.c:373 +#: server.c:392 #, c-format msgid "libpq environment variable %s has a non-local server value: %s" msgstr "libpq-ის გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ %s-ს áƒáƒ áƒáƒšáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ სერვერის მნიშვნელáƒáƒ‘áƒ: %s გáƒáƒáƒ©áƒœáƒ˜áƒ" @@ -1637,8 +1917,8 @@ msgstr "ცხრილების სივრცის სáƒáƒ¥áƒáƒ¦áƒáƒš #: tablespace.c:87 #, c-format -msgid "could not stat tablespace directory \"%s\": %s" -msgstr "ცხრილების სივრცის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის \"%s\" áƒáƒ¦áƒ›áƒáƒ©áƒ”ნის შეცდáƒáƒ›áƒ: %s" +msgid "could not stat tablespace directory \"%s\": %m" +msgstr "ცხრილების სივრცის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის \"%s\" áƒáƒ¦áƒ›áƒáƒ©áƒ”ნის შეცდáƒáƒ›áƒ: %m" #: tablespace.c:92 #, c-format @@ -1660,61 +1940,17 @@ msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდ msgid "ok" msgstr "დიáƒáƒ®" -#: version.c:184 -#, c-format -msgid "Checking for incompatible \"line\" data type" -msgstr "შეუთáƒáƒ•სებელი \"line\" მáƒáƒœáƒáƒªáƒ”მთრტიპის შემáƒáƒ¬áƒ›áƒ”ბáƒ" - -#: version.c:193 -#, c-format -msgid "" -"Your installation contains the \"line\" data type in user tables.\n" -"This data type changed its internal and input/output format\n" -"between your old and new versions so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"თქვენი პáƒáƒ™áƒ”ტი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში \"line\" მáƒáƒœáƒáƒªáƒ”მის ტიპს შეიცáƒáƒ•ს.\n" -"ეს მáƒáƒœáƒáƒªáƒ”მის ტიპი შეიცვáƒáƒšáƒ შიგნიდáƒáƒœ. áƒáƒ¡áƒ”ვე შეცვáƒáƒšáƒ მისი შეყვáƒáƒœáƒ/გáƒáƒ›áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜. áƒáƒ›áƒ˜áƒ¢áƒáƒ› თქვენი\n" -"კლáƒáƒ¡áƒ¢áƒ”რის ძველი ვერსიის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“ შეუძლებელიáƒ. შეგიძლიáƒáƒ—\n" -"წáƒáƒ¨áƒáƒšáƒáƒ— ეს სვეტები დრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ— გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ.\n" -"პრáƒáƒ‘ლენული სვეტების სირშეგიძლიáƒáƒ— იხილáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" -" %s" - -#: version.c:224 -#, c-format -msgid "Checking for invalid \"unknown\" user columns" -msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ \"unknown\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სვეტების შემáƒáƒ¬áƒ›áƒ”ბáƒ" - -#: version.c:233 -#, c-format -msgid "" -"Your installation contains the \"unknown\" data type in user tables.\n" -"This data type is no longer allowed in tables, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში მáƒáƒœáƒáƒªáƒ”მების \"unknown\" ტიპს შეიცáƒáƒ•ს.\n" -"ეს მáƒáƒœáƒáƒªáƒ”მის ტიპი ცხრილებში დáƒáƒ¨áƒ•ებული áƒáƒ¦áƒáƒ áƒáƒ, áƒáƒ¡áƒ”, რáƒáƒ› áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒ›áƒŸáƒáƒ›áƒáƒ“\n" -"შეუძლებელირშეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემული სვეტები დრგáƒáƒœáƒáƒ®áƒšáƒ”ბრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ—.\n" -"პრáƒáƒ‘ლემური სვეტების ნáƒáƒ®áƒ•რშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" -" %s" - -#: version.c:257 +#: version.c:44 #, c-format msgid "Checking for hash indexes" msgstr "ჰეშის ინდექსების შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: version.c:335 +#: version.c:121 #, c-format msgid "warning" msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ" -#: version.c:337 +#: version.c:123 #, c-format msgid "" "\n" @@ -1729,7 +1965,7 @@ msgstr "" "რეინდექსი REINDEX ბრძáƒáƒœáƒ”ბის სáƒáƒ¨áƒ£áƒáƒšáƒ”ბით. გáƒáƒœáƒáƒ®áƒšáƒ”ბის შემდეგ\n" "REINDEX-ის ინსტრუქციებიც გáƒáƒ“მáƒáƒ’ეცემáƒáƒ—." -#: version.c:343 +#: version.c:129 #, c-format msgid "" "\n" @@ -1748,38 +1984,17 @@ msgstr "" ", შესრულებული psql-ით მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის მიერ, თáƒáƒ•იდáƒáƒœ შექნის ყველáƒ\n" "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  ინდექსს. მáƒáƒœáƒáƒ›áƒ“ე კი, áƒáƒ› ინდექსებიდáƒáƒœ áƒáƒ áƒª ერთი გáƒáƒ›áƒáƒ§áƒ”ნებული áƒáƒ  იქნებáƒ." -#: version.c:369 -#, c-format -msgid "Checking for invalid \"sql_identifier\" user columns" -msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ \"sql_identifier\" მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სვეტების შემáƒáƒ¬áƒ›áƒ”ბáƒ" - -#: version.c:379 -#, c-format -msgid "" -"Your installation contains the \"sql_identifier\" data type in user tables.\n" -"The on-disk format for this data type has changed, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s" -msgstr "" -"პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ თქვენი ვერსირმáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ცხრილებში \"sql_identifier\" მáƒáƒœáƒáƒªáƒ”მების ტიპს შეიცáƒáƒ•ს.\n" -"მáƒáƒœáƒáƒªáƒ”მის áƒáƒ› ტიპის დისკზე შენáƒáƒ®áƒ•ის ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ შეიცვáƒáƒšáƒ, áƒáƒ¡áƒ” რáƒáƒ›, áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ áƒáƒ› კლáƒáƒ¡áƒ¢áƒ”რის გáƒáƒœáƒáƒ®áƒšáƒ”ბრშეუძლებელიáƒ.\n" -"შეგიძლიáƒáƒ— წáƒáƒ¨áƒáƒšáƒáƒ— პრáƒáƒ‘ლემური სვეტები დრთáƒáƒ•იდáƒáƒœ გáƒáƒ£áƒ¨áƒ•áƒáƒ— გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ.\n" -"პრáƒáƒ‘ლემური ცხრილების სიის ხილვრშეგიძლიáƒáƒ— ფáƒáƒ˜áƒšáƒ¨áƒ˜:\n" -" %s" - -#: version.c:402 +#: version.c:153 #, c-format msgid "Checking for extension updates" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის გáƒáƒœáƒáƒ®áƒšáƒ”ბების შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: version.c:450 +#: version.c:200 #, c-format msgid "notice" msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ" -#: version.c:451 +#: version.c:201 #, c-format msgid "" "\n" @@ -1812,6 +2027,14 @@ msgstr "" #~ msgid "%s\n" #~ msgstr "%s\n" +#, c-format +#~ msgid "%s() failed: %s" +#~ msgstr "%s()-ის შეცდáƒáƒ›áƒ: %s" + +#, c-format +#~ msgid "Checking for incompatible \"jsonb\" data type" +#~ msgstr "შეუთáƒáƒ•სებელი \"jsonb\" მáƒáƒœáƒáƒªáƒ”მთრტიპის შემáƒáƒ¬áƒ›áƒ”ბáƒ" + #, c-format #~ msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" #~ msgstr "ICU-ს ენის მნიშვნელáƒáƒ‘ები მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ისთვის \"%s\" áƒáƒ  ემთხვევáƒ: ძველი \"%s\", áƒáƒ®áƒáƒšáƒ˜ \"%s\"\n" @@ -1828,6 +2051,10 @@ msgstr "" #~ msgid "Unable to rename %s to %s.\n" #~ msgstr "%s-ის %s-áƒáƒ“ გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ.\n" +#, c-format +#~ msgid "check for \"%s\" failed: %s" +#~ msgstr "\"%s\" შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: %s" + #, c-format #~ msgid "check for \"%s\" failed: cannot execute (permission denied)\n" #~ msgstr "\"%s\" შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: გáƒáƒ¨áƒ•ების შეცდáƒáƒ›áƒ (წვდáƒáƒ›áƒ áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜áƒ)\n" @@ -1844,6 +2071,26 @@ msgstr "" #~ msgid "could not create directory \"%s\": %m\n" #~ msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) შექმნის შეცდáƒáƒ›áƒ: %m\n" +#, c-format +#~ msgid "could not create file \"%s\": %s" +#~ msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) შექმნის შეცდáƒáƒ›áƒ: %s" + +#, c-format +#~ msgid "could not create worker process: %s" +#~ msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის შექმნრშეუძლებელიáƒ: %s" + +#, c-format +#~ msgid "could not get control data directory using %s: %s" +#~ msgstr "ვერ მივიღე მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე %s გáƒáƒ›áƒáƒ§áƒ”ნებით: %s" + +#, c-format +#~ msgid "could not open file \"%s\" for reading: %s" +#~ msgstr "შეცდáƒáƒ›áƒ %s-ის წáƒáƒ¡áƒáƒ™áƒ˜áƒ—ხáƒáƒ“ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡áƒáƒ¡: %s" + +#, c-format +#~ msgid "could not open file \"%s\": %s" +#~ msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %s" + #, c-format #~ msgid "could not open file \"%s\": %s\n" #~ msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %s\n" @@ -1852,6 +2099,10 @@ msgstr "" #~ msgid "could not open log file \"%s\": %m\n" #~ msgstr "ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m\n" +#, c-format +#~ msgid "could not read permissions of directory \"%s\": %s" +#~ msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის წვდáƒáƒ›áƒ”ბის წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელირ\"%s\": %s" + #, c-format #~ msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" #~ msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კáƒáƒ“ირებრ\"%s\" áƒáƒ  ემთხვევáƒ: ძველი \"%s\", áƒáƒ®áƒáƒšáƒ˜ \"%s\"\n" @@ -1880,10 +2131,6 @@ msgstr "" #~ msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n" #~ msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის \"%s\" ენის მáƒáƒ›áƒ¬áƒáƒ“ებლები áƒáƒ  ემთხვევáƒ: ძველი \"%s\", áƒáƒ®áƒáƒšáƒ˜ \"%s\"\n" -#, c-format -#~ msgid "out of memory\n" -#~ msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" - #, c-format #~ msgid "too many command-line arguments (first is \"%s\")\n" #~ msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")\n" diff --git a/src/bin/pg_upgrade/po/ko.po b/src/bin/pg_upgrade/po/ko.po index 5fa498a22035a..800eb1a2f0fea 100644 --- a/src/bin/pg_upgrade/po/ko.po +++ b/src/bin/pg_upgrade/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_upgrade (PostgreSQL) 13\n" +"Project-Id-Version: pg_upgrade (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 20:45+0000\n" -"PO-Revision-Date: 2020-10-06 14:02+0900\n" +"POT-Creation-Date: 2025-01-17 04:50+0000\n" +"PO-Revision-Date: 2025-01-17 15:47+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -17,286 +17,477 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: check.c:66 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "메모리 부족\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ë„ í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "하위 í”„ë¡œì„¸ìŠ¤ì˜ ì¢…ë£Œ 코드를 못 받았ìŒ: 오류 코드 %lu" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "%ld ì‚¬ìš©ìž IDì— ëŒ€í•œ 사용ìžë¥¼ 찾지 못함: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "ì‚¬ìš©ìž ì—†ìŒ" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "ì‚¬ìš©ìž ì´ë¦„ 찾기 실패: 오류 코드 %lu" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "쉘 명령 ì¸ìžì— 줄바꿈 문ìžê°€ 있ìŒ: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "ë°ì´í„°ë² ì´ìФ ì´ë¦„ì— ì¤„ë°”ê¿ˆ 문ìžê°€ 있ìŒ: \"%s\"\n" + +#: check.c:111 +msgid "Checking for system-defined composite types in user tables" +msgstr "사용ìžê°€ 만든 í…Œì´ë¸”ì— ë‚´ìž¥ 복합 ìžë£Œí˜•ì„ ì“°ëŠ”ì§€ í™•ì¸ ì¤‘" + +#: check.c:118 +msgid "" +"Your installation contains system-defined composite types in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"해당 ë°ì´í„°ë² ì´ìФ 사용ìžê°€ 만든 í…Œì´ë¸”ì—서 내장 복합 ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³  있습니" +"다.\n" +"ì´ ìžë£Œí˜•ì˜ OID ê°’ì´ PostgreSQL 버전별로 다를 수 있어,\n" +"업그레ì´ë“œ í•  수 없습니다. 해당 ì¹¼ëŸ¼ì„ ì‚­ì œí•œ ë’¤ 다시 업그레ì´ë“œí•˜ì„¸ìš”.\n" + +#: check.c:132 +msgid "Checking for incompatible \"line\" data type" +msgstr "\"line\" ìžë£Œí˜• 호환성 í™•ì¸ ì¤‘" + +#: check.c:137 +msgid "" +"Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"해당 ë°ì´í„°ë² ì´ìФì—서 \"line\" ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ëŠ” í…Œì´ë¸”ì´ ìžˆìŠµë‹ˆë‹¤.\n" +"ì´ ìžë£Œí˜•ì˜ ìž…ì¶œë ¥ ë°©ì‹ì´ 옛 버전과 새 버전ì—서 서로 호환하지 않습니다.\n" +"먼저 ì´ ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ëŠ” í…Œì´ë¸”ì„ ì‚­ì œ 후 업그레ì´ë“œ ìž‘ì—…ì„ í•˜ì„¸ìš”.\n" + +#: check.c:154 +msgid "Checking for reg* data types in user tables" +msgstr "사용ìžê°€ 만든 í…Œì´ë¸”ì— reg* ìžë£Œí˜•ì„ ì“°ëŠ”ì§€ í™•ì¸ ì¤‘" + +#: check.c:181 +msgid "" +"Your installation contains one of the reg* data types in user tables.\n" +"These data types reference system OIDs that are not preserved by\n" +"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"옛 서버ì—서 사용ìžê°€ 만든 í…Œì´ë¸”ì—서 reg* ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³  있습니다.\n" +"ì´ ìžë£Œí˜•ë“¤ì€ pg_upgrade 명령으로 ë‚´ì •ëœ ì‹œìŠ¤í…œ OID를 사용하지 못할 수\n" +"있습니다. 그래서 업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•  수 없습니다.\n" +"사용하고 있는 ì¹¼ëŸ¼ì„ ì§€ìš°ê³  업그레ì´ë“œ ìž‘ì—…ì„ ë‹¤ì‹œ 시ë„하세요.\n" + +#: check.c:193 +msgid "Checking for incompatible \"aclitem\" data type" +msgstr "\"aclitem\" ìžë£Œí˜• 호환성 í™•ì¸ ì¤‘" + +#: check.c:198 +msgid "" +"Your installation contains the \"aclitem\" data type in user tables.\n" +"The internal format of \"aclitem\" changed in PostgreSQL version 16\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"ì‚¬ìš©ìž í…Œì´ë¸”ì—서 \"jsonb\" ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³  있습니다.\n" +"9.4 베타 비전 ì´í›„ \"jsonb\" ë‚´ë¶€ ìžë£Œ 구조가 바뀌었습니다.\n" +"그래서, 업그레ì´ë“œ ìž‘ì—…ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤.\n" +"해당 ì¹¼ëŸ¼ë“¤ì„ ì§€ìš°ê³  업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”.\n" + +#: check.c:217 +msgid "Checking for invalid \"unknown\" user columns" +msgstr "ìž˜ëª»ëœ \"unknown\" ì‚¬ìš©ìž ì¹¼ëŸ¼ì„ í™•ì¸ ì¤‘" + +#: check.c:222 +msgid "" +"Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this cluster\n" +"cannot currently be upgraded. You can drop the problem columns\n" +"and restart the upgrade.\n" +msgstr "" +"해당 ë°ì´í„°ë² ì´ìФì—서 ì‚¬ìš©ìž í…Œì´ë¸”ì—서 \"unknown\" ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³  있습니" +"다.\n" +"ì´ ìžë£Œí˜•ì€ ë” ì´ìƒ 사용할 수 없습니다. ì´ ë¬¸ì œë¥¼ 옛 버전ì—서 먼저 정리하고\n" +"업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”.\n" + +#: check.c:239 +msgid "Checking for invalid \"sql_identifier\" user columns" +msgstr "ìž˜ëª»ëœ \"sql_identifier\" ì‚¬ìš©ìž ì¹¼ëŸ¼ì„ í™•ì¸ ì¤‘" + +#: check.c:244 +msgid "" +"Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can drop the problem\n" +"columns and restart the upgrade.\n" +msgstr "" +"ì‚¬ìš©ìž í…Œì´ë¸” ë˜ëŠ” ì¸ë±ìŠ¤ì— \"sql_identifier\" ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³ \n" +"있습니다. ì´ ìžë£Œí˜•ì˜ ì €ìž¥ ì–‘ì‹ì´ 바뀌었기ì—, 업그레ì´ë“œ í•  수\n" +"없습니다. 해당 í…Œì´ë¸”ì˜ ì¹¼ëŸ¼ì„ ì§€ìš°ê³  다시 업그레ì´ë“œ 하십시오.\n" + +#: check.c:255 +msgid "Checking for incompatible \"jsonb\" data type in user tables" +msgstr "ì‚¬ìš©ìž í…Œì´ë¸”ì—서 \"jsonb\" ìžë£Œí˜• 호환성 검사 중" + +#: check.c:260 +msgid "" +"Your installation contains the \"jsonb\" data type in user tables.\n" +"The internal format of \"jsonb\" changed during 9.4 beta so this\n" +"cluster cannot currently be upgraded. You can drop the problem \n" +"columns and restart the upgrade.\n" +msgstr "" +"ì‚¬ìš©ìž í…Œì´ë¸”ì—서 \"jsonb\" ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³  있습니다.\n" +"9.4 베타 비전 ì´í›„ \"jsonb\" ë‚´ë¶€ ìžë£Œ 구조가 바뀌었습니다.\n" +"그래서, 업그레ì´ë“œ ìž‘ì—…ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤.\n" +"해당 ì¹¼ëŸ¼ë“¤ì„ ì§€ìš°ê³  업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”.\n" + +#: check.c:272 +msgid "Checking for removed \"abstime\" data type in user tables" +msgstr "사용ìžê°€ 만든 í…Œì´ë¸”ì— \"abstime\" ìžë£Œí˜•ì„ ì“°ëŠ”ì§€ í™•ì¸ ì¤‘" + +#: check.c:277 +msgid "" +"Your installation contains the \"abstime\" data type in user tables.\n" +"The \"abstime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"ì‚¬ìš©ìž í…Œì´ë¸”ì—서 \"abstime\" ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³  있습니다.\n" +"12 비전 ì´í›„ \"abstime\" ìžë£Œí˜•ì„ ì§€ì›í•˜ì§€ 않습니다.\n" +"그래서, 업그레ì´ë“œ ìž‘ì—…ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤.\n" +"해당 ì¹¼ëŸ¼ë“¤ì„ ì§€ìš°ê±°ë‚˜, 다른 ìžë£Œí˜•으로 바꾼 ë’¤,\n" +"업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”.\n" + +#: check.c:285 +msgid "Checking for removed \"reltime\" data type in user tables" +msgstr "사용ìžê°€ 만든 í…Œì´ë¸”ì— \"reltime\" ìžë£Œí˜•ì„ ì“°ëŠ”ì§€ í™•ì¸ ì¤‘" + +#: check.c:290 +msgid "" +"Your installation contains the \"reltime\" data type in user tables.\n" +"The \"reltime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"ì‚¬ìš©ìž í…Œì´ë¸”ì—서 \"reltime\" ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³  있습니다.\n" +"12 비전 ì´í›„ \"reltime\" ìžë£Œí˜•ì„ ì§€ì›í•˜ì§€ 않습니다.\n" +"그래서, 업그레ì´ë“œ ìž‘ì—…ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤.\n" +"해당 ì¹¼ëŸ¼ë“¤ì„ ì§€ìš°ê±°ë‚˜, 다른 ìžë£Œí˜•으로 바꾼 ë’¤,\n" +"업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”.\n" + +#: check.c:298 +msgid "Checking for removed \"tinterval\" data type in user tables" +msgstr "사용ìžê°€ 만든 í…Œì´ë¸”ì— \"tinterval\" ìžë£Œí˜•ì„ ì“°ëŠ”ì§€ í™•ì¸ ì¤‘" + +#: check.c:303 +msgid "" +"Your installation contains the \"tinterval\" data type in user tables.\n" +"The \"tinterval\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"ì‚¬ìš©ìž í…Œì´ë¸”ì—서 \"tinterval\" ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³  있습니다.\n" +"12 비전 ì´í›„ \"tinterval\" ìžë£Œí˜•ì„ ì§€ì›í•˜ì§€ 않습니다.\n" +"그래서, 업그레ì´ë“œ ìž‘ì—…ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤.\n" +"해당 ì¹¼ëŸ¼ë“¤ì„ ì§€ìš°ê±°ë‚˜, 다른 ìžë£Œí˜•으로 바꾼 ë’¤,\n" +"업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”.\n" + +#: check.c:345 +#, c-format +msgid "Checking data type usage" +msgstr "ìžë£Œí˜• 사용 현황 검사 중" + +#: check.c:480 +#, c-format +msgid "failed check: %s" +msgstr "검사 실패: %s" + +#: check.c:483 +msgid "A list of the problem columns is in the file:" +msgstr "문제 칼럼 목ë¡ì„ ë‹¤ìŒ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:" + +#: check.c:495 check.c:963 check.c:1136 check.c:1251 check.c:1345 check.c:1473 +#: check.c:1549 check.c:1613 check.c:1686 check.c:1865 check.c:1884 +#: check.c:1953 check.c:2005 file.c:378 file.c:415 function.c:189 option.c:493 +#: version.c:79 version.c:177 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: check.c:522 +#, c-format +msgid "Data type checks failed: %s" +msgstr "ìžë£Œí˜• 검사 실패: %s" + +#: check.c:563 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" -"------------------------------------------------\n" +"------------------------------------------------" msgstr "" "옛 ìš´ì˜ ì„œë²„ì—서 ì¼ê´€ì„± 검사를 진행합니다.\n" -"------------------------------------------\n" +"------------------------------------------" -#: check.c:72 +#: check.c:569 #, c-format msgid "" "Performing Consistency Checks\n" -"-----------------------------\n" +"-----------------------------" msgstr "" "ì¼ê´€ì„± 검사 수행중\n" -"------------------\n" +"------------------" -#: check.c:190 +#: check.c:718 #, c-format msgid "" "\n" -"*Clusters are compatible*\n" +"*Clusters are compatible*" msgstr "" "\n" -"*í´ëŸ¬ìŠ¤í„° 호환성*\n" +"*í´ëŸ¬ìŠ¤í„° 호환성*" -#: check.c:196 +#: check.c:726 #, c-format msgid "" "\n" "If pg_upgrade fails after this point, you must re-initdb the\n" -"new cluster before continuing.\n" +"new cluster before continuing." msgstr "" "\n" "여기서 pg_upgrade ìž‘ì—…ì„ ì‹¤íŒ¨í•œë‹¤ë©´, ìž¬ì‹œë„ í•˜ê¸° ì „ì— ë¨¼ì €\n" -"새 í´ëŸ¬ìŠ¤í„°ë¥¼ 처ìŒë¶€í„° 다시 만들어 진행해야 합니다.\n" +"새 í´ëŸ¬ìŠ¤í„°ë¥¼ 처ìŒë¶€í„° 다시 만들어 진행해야 합니다." -#: check.c:232 +#: check.c:767 #, c-format msgid "" -"Optimizer statistics are not transferred by pg_upgrade so,\n" -"once you start the new server, consider running:\n" -" %s\n" -"\n" +"Optimizer statistics are not transferred by pg_upgrade.\n" +"Once you start the new server, consider running:\n" +" %s/vacuumdb %s--all --analyze-in-stages" msgstr "" "pg_upgrade 작업ì—서는 최ì í™”기를 위한 통계 정보까지 업그레ì´ë“œ\n" "하지는 않습니다. 새 서버가 실행 ë  ë•Œ, ë‹¤ìŒ ëª…ë ¹ì„ ìˆ˜í–‰í•˜ê¸¸ 권합니다:\n" -" %s\n" -"\n" +" %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:237 -#, c-format -msgid "" -"Optimizer statistics and free space information are not transferred\n" -"by pg_upgrade so, once you start the new server, consider running:\n" -" %s\n" -"\n" -msgstr "" -"pg_upgrade 작업으로는 통계 정보와 빈 공간 정보는 업그레ì´ë“œ ë˜ì§€\n" -"않습니다. 새 서버가 실행 ë  ë•Œ, ë‹¤ìŒ ëª…ë ¹ì„ ìˆ˜í–‰í•˜ê¸¸ 권합니다:\n" -" %s\n" -"\n" - -#: check.c:244 +#: check.c:773 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" -" %s\n" +" %s" msgstr "" "아래 스í¬ë¦½íŠ¸ë¥¼ 실행하면, 옛 í´ëŸ¬ìŠ¤í„° ìžë£Œë¥¼ 지울 것입니다:\n" -" %s\n" +" %s" -#: check.c:249 +#: check.c:778 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" "because user-defined tablespaces or the new cluster's data directory\n" "exist in the old cluster directory. The old cluster's contents must\n" -"be deleted manually.\n" +"be deleted manually." msgstr "" "옛 í´ëŸ¬ìŠ¤í„° ìžë£Œ 파ì¼ì„ 지우는 스í¬ë¦½íŠ¸ë¥¼ 만들지 못했습니다.\n" "ì‚¬ìš©ìž ì •ì˜ í…Œì´ë¸”스페ì´ìŠ¤ë‚˜, 새 í´ëŸ¬ìŠ¤í„°ê°€ 옛 í´ëŸ¬ìŠ¤í„° 안ì—\n" -"있기 때문입니다. 옛 í´ëŸ¬ìŠ¤í„° ìžë£ŒëŠ” ì§ì ‘ 찾아서 지우세요.\n" +"있기 때문입니다. 옛 í´ëŸ¬ìŠ¤í„° ìžë£ŒëŠ” ì§ì ‘ 찾아서 지우세요." -#: check.c:259 +#: check.c:790 #, c-format msgid "Checking cluster versions" msgstr "í´ëŸ¬ìŠ¤í„° 버전 검사 중" -#: check.c:271 +#: check.c:802 #, c-format -msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n" -msgstr "ì´ ë„구는 PostgreSQL 8.4 ì´ìƒ 버전ì—서 사용할 수 있습니다.\n" +msgid "This utility can only upgrade from PostgreSQL version %s and later." +msgstr "ì´ ë„구는 PostgreSQL %s ê³¼ ê·¸ ì´ìƒ 버전ì—서 사용할 수 있습니다." -#: check.c:275 +#: check.c:807 #, c-format -msgid "This utility can only upgrade to PostgreSQL version %s.\n" -msgstr "ì´ ë„구는 PostgreSQL %s 버전으로만 업그레ì´ë“œ í•  수 있습니다.\n" +msgid "This utility can only upgrade to PostgreSQL version %s." +msgstr "ì´ ë„구는 PostgreSQL %s 버전으로만 업그레ì´ë“œ í•  수 있습니다." -#: check.c:284 +#: check.c:816 #, c-format msgid "" -"This utility cannot be used to downgrade to older major PostgreSQL " -"versions.\n" +"This utility cannot be used to downgrade to older major PostgreSQL versions." msgstr "" "ì´ ë„구는 ë” ë‚®ì€ ë©”ì´ì ¸ PostgreSQL 버전으로 다운그레ì´ë“œí•˜ëŠ”ë° ì‚¬ìš©í•  수 ì—†" -"습니다.\n" +"습니다." -#: check.c:289 +#: check.c:821 #, c-format msgid "" -"Old cluster data and binary directories are from different major versions.\n" -msgstr "옛 í´ëŸ¬ìŠ¤í„° ìžë£Œì™€ ì‹¤í–‰íŒŒì¼ ë””ë ‰í„°ë¦¬ê°€ 서로 ë©”ì´ì ¸ ë²„ì „ì´ ë‹¤ë¦…ë‹ˆë‹¤.\n" +"Old cluster data and binary directories are from different major versions." +msgstr "옛 í´ëŸ¬ìŠ¤í„° ìžë£Œì™€ ì‹¤í–‰íŒŒì¼ ë””ë ‰í„°ë¦¬ê°€ 서로 ë©”ì´ì ¸ ë²„ì „ì´ ë‹¤ë¦…ë‹ˆë‹¤." -#: check.c:292 +#: check.c:824 #, c-format msgid "" -"New cluster data and binary directories are from different major versions.\n" -msgstr "새 í´ëŸ¬ìŠ¤í„° ìžë£Œì™€ ì‹¤í–‰íŒŒì¼ ë””ë ‰í„°ë¦¬ê°€ 서로 ë©”ì´ì ¸ ë²„ì „ì´ ë‹¤ë¦…ë‹ˆë‹¤.\n" +"New cluster data and binary directories are from different major versions." +msgstr "새 í´ëŸ¬ìŠ¤í„° ìžë£Œì™€ ì‹¤í–‰íŒŒì¼ ë””ë ‰í„°ë¦¬ê°€ 서로 ë©”ì´ì ¸ ë²„ì „ì´ ë‹¤ë¦…ë‹ˆë‹¤." -#: check.c:309 +#: check.c:839 #, c-format msgid "" -"When checking a pre-PG 9.1 live old server, you must specify the old " -"server's port number.\n" +"When checking a live server, the old and new port numbers must be different." msgstr "" -"옛 서버가 9.1 버전 ì´ì „ ì´ë¼ë©´ 옛 ì„œë²„ì˜ í¬íŠ¸ë¥¼ 반드시 지정해야 합니다.\n" +"ìš´ì˜ ì„œë²„ 검사를 í•  때는, 옛 서버, 새 ì„œë²„ì˜ í¬íŠ¸ë¥¼ 다르게 지정해야 합니다." -#: check.c:313 +#: check.c:859 #, c-format -msgid "" -"When checking a live server, the old and new port numbers must be " -"different.\n" +msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" msgstr "" -"ìš´ì˜ ì„œë²„ 검사를 í•  때는, 옛 서버, 새 ì„œë²„ì˜ í¬íŠ¸ë¥¼ 다르게 지정해야 합니다.\n" +"\"%s\" 새 ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ê°€ 비어있지 않ìŒ: \"%s.%s\" 릴레ì´ì…˜ì„ 찾았ìŒ" -#: check.c:328 +#: check.c:882 #, c-format -msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "" -"\"%s\" ë°ì´í„°ë² ì´ìŠ¤ì˜ ì¸ì½”ë”©ì´ ì„œë¡œ 다릅니다: 옛 서버 \"%s\", 새 서버 \"%s" -"\"\n" +msgid "Checking for new cluster tablespace directories" +msgstr "새 í´ëŸ¬ìŠ¤í„° í…Œì´ë¸”스페ì´ìФ 디렉터리 검사 중" -#: check.c:333 +#: check.c:893 #, c-format -msgid "" -"lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "" -"\"%s\" ë°ì´í„°ë² ì´ìŠ¤ì˜ lc_collate ê°’ì´ ì„œë¡œ 다릅니다: 옛 서버 \"%s\", 새 서버 " -"\"%s\"\n" +msgid "new cluster tablespace directory already exists: \"%s\"" +msgstr "새 í´ëŸ¬ìŠ¤í„° í…Œì´ë¸”스페ì´ìФ 디렉터리가 ì´ë¯¸ 있ìŒ: \"%s\"" -#: check.c:336 -#, c-format -msgid "" -"lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "" -"\"%s\" ë°ì´í„°ë² ì´ìŠ¤ì˜ lc_ctype ê°’ì´ ì„œë¡œ 다릅니다: 옛 서버 \"%s\", 새 서버 " -"\"%s\"\n" - -#: check.c:409 -#, c-format -msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" -msgstr "" -"\"%s\" 새 ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„°ê°€ 비어있지 않습니다.\n" -" -- \"%s.%s\" 릴레ì´ì…˜ì„ 찾았ìŒ\n" - -#: check.c:458 -#, c-format -msgid "Creating script to analyze new cluster" -msgstr "새 í´ëŸ¬ìŠ¤í„° 통계정보 수집 스í¬ë¦½íŠ¸ë¥¼ 만듭니다" - -#: check.c:472 check.c:600 check.c:864 check.c:943 check.c:1053 check.c:1144 -#: file.c:336 function.c:240 option.c:497 version.c:54 version.c:199 -#: version.c:341 -#, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s\n" - -#: check.c:527 check.c:656 -#, c-format -msgid "could not add execute permission to file \"%s\": %s\n" -msgstr "\"%s\" 파ì¼ì— 실행 ê¶Œí•œì„ ì¶”ê°€ í•  수 ì—†ìŒ: %s\n" - -#: check.c:563 +#: check.c:926 #, c-format msgid "" "\n" -"WARNING: new data directory should not be inside the old data directory, e." -"g. %s\n" +"WARNING: new data directory should not be inside the old data directory, " +"i.e. %s" msgstr "" "\n" -"경고: 새 ë°ì´í„° 디렉터리는 옛 ë°ì´í„° 디렉터리 ì•ˆì— ë‘˜ 수 없습니다, 예: %s\n" +"경고: 새 ë°ì´í„° 디렉터리는 옛 ë°ì´í„° 디렉터리 ì•ˆì— ë‘˜ 수 없습니다, 예: %s" -#: check.c:587 +#: check.c:950 #, c-format msgid "" "\n" "WARNING: user-defined tablespace locations should not be inside the data " -"directory, e.g. %s\n" +"directory, i.e. %s" msgstr "" "\n" "경고: ì‚¬ìš©ìž ì •ì˜ í…Œì´ë¸”스페ì´ìФ 위치를 ë°ì´í„° 디렉터리 ì•ˆì— ë‘˜ 수 없습니다, " -"예: %s\n" +"예: %s" -#: check.c:597 +#: check.c:960 #, c-format msgid "Creating script to delete old cluster" msgstr "옛 í´ëŸ¬ìŠ¤í„°ë¥¼ 지우는 스í¬ë¦½íŠ¸ë¥¼ 만듭니다" -#: check.c:676 +#: check.c:1014 +#, c-format +msgid "could not add execute permission to file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì— 실행 ê¶Œí•œì„ ì¶”ê°€ í•  수 ì—†ìŒ: %m" + +#: check.c:1034 #, c-format msgid "Checking database user is the install user" msgstr "ë°ì´í„°ë² ì´ìФ 사용ìžê°€ 설치 ìž‘ì—…ì„ í•œ 사용ìžì¸ì§€ 확ì¸í•©ë‹ˆë‹¤" -#: check.c:692 +#: check.c:1050 #, c-format -msgid "database user \"%s\" is not the install user\n" -msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ 사용ìžëŠ” 설치 ìž‘ì—…ì„ í•œ 사용ìžê°€ 아닙니다\n" +msgid "database user \"%s\" is not the install user" +msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ 사용ìžëŠ” 설치 ìž‘ì—…ì„ í•œ 사용ìžê°€ 아닙니다" -#: check.c:703 +#: check.c:1061 #, c-format -msgid "could not determine the number of users\n" -msgstr "ì‚¬ìš©ìž ìˆ˜ë¥¼ 확ì¸í•  수 ì—†ìŒ\n" +msgid "could not determine the number of users" +msgstr "ì‚¬ìš©ìž ìˆ˜ë¥¼ 확ì¸í•  수 ì—†ìŒ" -#: check.c:711 +#: check.c:1069 #, c-format -msgid "Only the install user can be defined in the new cluster.\n" -msgstr "새 í´ëŸ¬ìŠ¤í„°ì—서만 설치 사용 사용ìžê°€ ì •ì˜ë  수 있ìŒ\n" +msgid "Only the install user can be defined in the new cluster." +msgstr "새 í´ëŸ¬ìŠ¤í„°ì—서만 설치 사용 사용ìžê°€ ì •ì˜ë  수 있ìŒ" -#: check.c:731 +#: check.c:1098 #, c-format msgid "Checking database connection settings" msgstr "ë°ì´í„°ë² ì´ìФ ì—°ê²° ì„¤ì •ì„ í™•ì¸ ì¤‘" -#: check.c:753 +#: check.c:1124 #, c-format msgid "" "template0 must not allow connections, i.e. its pg_database.datallowconn must " -"be false\n" +"be false" msgstr "" "template0 ë°ì´í„°ë² ì´ìФ ì ‘ì†ì„ 금지해야 합니다. 예: 해당 ë°ì´í„°ë² ì´ìŠ¤ì˜ " -"pg_database.datallowconn ê°’ì´ false여야 합니다.\n" +"pg_database.datallowconn ê°’ì´ false여야 합니다." + +#: check.c:1150 check.c:1270 check.c:1367 check.c:1492 check.c:1568 +#: check.c:1626 check.c:1706 check.c:1897 check.c:2022 function.c:210 +#, c-format +msgid "fatal" +msgstr "ì¹˜ëª…ì  ì˜¤ë¥˜" -#: check.c:763 +#: check.c:1151 #, c-format msgid "" -"All non-template0 databases must allow connections, i.e. their pg_database." -"datallowconn must be true\n" +"All non-template0 databases must allow connections, i.e. their\n" +"pg_database.datallowconn must be true. Your installation contains\n" +"non-template0 databases with their pg_database.datallowconn set to\n" +"false. Consider allowing connection for all non-template0 databases\n" +"or drop the databases which do not allow connections. A list of\n" +"databases with the problem is in the file:\n" +" %s" msgstr "" -"template0 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 제외한 다른 모든 ë°ì´í„°ë² ì´ìŠ¤ëŠ” ì ‘ì†ì´ 가능해야합니" -"다. 예: ê·¸ë“¤ì˜ pg_database.datallowconn ê°’ì€ true여야 합니다.\n" +"template0ì´ ì•„ë‹Œ 모든 ë°ì´í„°ë² ì´ìŠ¤ëŠ” ì—°ê²°ì„ í—ˆìš©í•´ì•¼í•˜ë©°, 즉 \n" +"pg_database.datallowconn ê°’ì´ true여야합니다. ì„¤ì¹˜ëœ ë°ì´í„°ë² ì´ìФ\n" +"중 pg_database.datallowconn ê°’ì´ false로 ì„¤ì •ëœ template0ì´ ì•„ë‹Œ\n" +"ë°ì´í„°ë² ì´ìŠ¤ê°€ 있습니다. template0ì´ ì•„ë‹Œ ë°ì´í„°ë² ì´ìŠ¤ì˜ ëª¨ë“  ì—°ê²°ì„\n" +"허용하거나 ì—°ê²°ì„ í—ˆìš©í•˜ì§€ 않는 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 삭제하는 ê²ƒì´ ì¢‹ìŠµë‹ˆë‹¤.\n" +"문제가 있는 ë°ì´í„°ë² ì´ìФ 목ë¡ì€ ë‹¤ìŒ íŒŒì¼ì— 기ë¡í•´ ë‘었습니다:\n" +" %s" -#: check.c:788 +#: check.c:1176 #, c-format msgid "Checking for prepared transactions" msgstr "미리 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì„ í™•ì¸ ì¤‘" -#: check.c:797 +#: check.c:1185 #, c-format -msgid "The source cluster contains prepared transactions\n" -msgstr "옛 í´ëŸ¬ìŠ¤í„°ì— ë¯¸ë¦¬ ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì´ ìžˆìŒ\n" +msgid "The source cluster contains prepared transactions" +msgstr "옛 í´ëŸ¬ìŠ¤í„°ì— ë¯¸ë¦¬ ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì´ ìžˆìŒ" -#: check.c:799 +#: check.c:1187 #, c-format -msgid "The target cluster contains prepared transactions\n" -msgstr "새 í´ëŸ¬ìŠ¤í„°ì— ë¯¸ë¦¬ ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì´ ìžˆìŒ\n" +msgid "The target cluster contains prepared transactions" +msgstr "새 í´ëŸ¬ìŠ¤í„°ì— ë¯¸ë¦¬ ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì´ ìžˆìŒ" -#: check.c:825 +#: check.c:1212 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "contrib/isn ëª¨ë“ˆì˜ bigint 처리가 서로 ê°™ì€ì§€ í™•ì¸ ì¤‘" -#: check.c:886 check.c:965 check.c:1076 check.c:1167 function.c:262 -#: version.c:245 version.c:282 version.c:425 -#, c-format -msgid "fatal\n" -msgstr "ì¹˜ëª…ì  ì˜¤ë¥˜\n" - -#: check.c:887 +#: check.c:1271 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -305,444 +496,547 @@ msgid "" "manually dump databases in the old cluster that use \"contrib/isn\"\n" "facilities, drop them, perform the upgrade, and then restore them. A\n" "list of the problem functions is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "설치ë˜ì–´ 있는 \"contrib/isn\" ëª¨ë“ˆì€ bigint ìžë£Œí˜•ì„ ì‚¬ìš©í•©ë‹ˆë‹¤.\n" "ì´ bigint ìžë£Œí˜•ì˜ ì²˜ë¦¬ ë°©ì‹ì´ 새 버전과 옛 버전 ì‚¬ì´ í˜¸í™˜ì„±ì´ ì—†ì–´,\n" "ì´ í´ëŸ¬ìŠ¤í„° 업그레ì´ë“œë¥¼ í•  수 없습니다. 먼저 수ë™ìœ¼ë¡œ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ \n" "ë¤í”„하고, 해당 ëª¨ë“ˆì„ ì‚­ì œí•˜ê³ , 업그레ì´ë“œ 한 ë’¤ 다시 ë¤í”„ 파ì¼ì„ ì´ìš©í•´\n" "ë³µì›í•  수 있습니다. 문제가 있는 함수는 아래 íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n" -" %s\n" -"\n" +" %s" + +#: check.c:1293 +#, c-format +msgid "Checking for user-defined postfix operators" +msgstr "ì‚¬ìš©ìž ì •ì˜ postfix ì—°ì‚°ìžë¥¼ 검사 중" + +#: check.c:1368 +#, c-format +msgid "" +"Your installation contains user-defined postfix operators, which are not\n" +"supported anymore. Consider dropping the postfix operators and replacing\n" +"them with prefix operators or function calls.\n" +"A list of user-defined postfix operators is in the file:\n" +" %s" +msgstr "" +"ë” ì´ìƒ ì‚¬ìš©ìž ì •ì˜ postfix ì—°ì‚°ìžë¥¼ ì§€ì›í•˜ì§€ 않습니다.\n" +"해당 ì—°ì‚°ìžë¥¼ 지우고, prefix ì—°ì‚°ìžë¡œ 바꾸거나, 함수 호출\n" +"ë°©ì‹ìœ¼ë¡œ 바꾸는 ê²ƒì„ ê³ ë ¤í•´ 보십시오.\n" +"관련 ì‚¬ìš©ìž ì •ì˜ postfix ì—°ì‚°ìž ëª©ë¡ì€ 아래 íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n" +" %s" + +#: check.c:1392 +#, c-format +msgid "Checking for incompatible polymorphic functions" +msgstr "불완전한 다형 함수를 확ì¸í•©ë‹ˆë‹¤" -#: check.c:911 +#: check.c:1493 +#, c-format +msgid "" +"Your installation contains user-defined objects that refer to internal\n" +"polymorphic functions with arguments of type \"anyarray\" or " +"\"anyelement\".\n" +"These user-defined objects must be dropped before upgrading and restored\n" +"afterwards, changing them to refer to the new corresponding functions with\n" +"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n" +"A list of the problematic objects is in the file:\n" +" %s" +msgstr "" +"ì´ ì„œë²„ì—는 \"anyarray\" ë˜ëŠ” \"anyelement\" ìœ í˜•ì˜ ì¸ìˆ˜ë¥¼ 사용하는 \n" +"ë‚´ë¶€ 다형 함수를 참조하는 ì‚¬ìš©ìž ì •ì˜ ê°ì²´ê°€ 있습니다. \n" +"ì´ëŸ¬í•œ ì‚¬ìš©ìž ì •ì˜ ê°ì²´ëŠ” 업그레ì´ë“œí•˜ê¸° ì „ì— ì‚­ì œí•˜ê³ , \n" +"\"anycompatiblearray\" ë˜ëŠ” \"anycompatible\" ìœ í˜•ì˜ ìƒˆë¡œìš´ ëŒ€ì‘ í•¨ìˆ˜ë¥¼\n" +"참조하ë„ë¡ ë³€ê²½í•œ 후 다시 ë³µì›í•´ì•¼í•©ë‹ˆë‹¤. 문제가 있는 ê°ì²´ 목ë¡ì€\n" +"ë‹¤ìŒ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n" +" %s" + +#: check.c:1517 #, c-format msgid "Checking for tables WITH OIDS" msgstr "WITH OIDS 옵션 있는 í…Œì´ë¸” í™•ì¸ ì¤‘" -#: check.c:966 +#: check.c:1569 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" "supported anymore. Consider removing the oid column using\n" " ALTER TABLE ... SET WITHOUT OIDS;\n" "A list of tables with the problem is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "ë” ì´ìƒ WITH OIDS ì˜µì…˜ì„ ì‚¬ìš©í•˜ëŠ” í…Œì´ë¸”ì„ ì§€ì›í•˜ì§€ 않습니다.\n" "먼저 oid ì¹¼ëŸ¼ì´ ìžˆëŠ” 기존 í…Œì´ë¸”ì„ ëŒ€ìƒìœ¼ë¡œ ë‹¤ìŒ ëª…ë ¹ì„ ì‹¤í–‰í•´ì„œ\n" "ì´ ì˜µì…˜ì„ ëº„ ê²ƒì„ ê³ ë ¤í•´ 보십시오.\n" " ALTER TABLE ... SET WITHOUT OIDS;\n" "관련 í…Œì´ë¸” 목ë¡ì€ 아래 íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n" -" %s\n" -"\n" +" %s" -#: check.c:996 +#: check.c:1596 #, c-format -msgid "Checking for reg* data types in user tables" -msgstr "사용ìžê°€ 만든 í…Œì´ë¸”ì— reg* ìžë£Œí˜•ì„ ì“°ëŠ”ì§€ í™•ì¸ ì¤‘" +msgid "Checking for roles starting with \"pg_\"" +msgstr "\"pg_\"로 시작하는 롤 í™•ì¸ ì¤‘" -#: check.c:1077 +#: check.c:1627 #, c-format msgid "" -"Your installation contains one of the reg* data types in user tables.\n" -"These data types reference system OIDs that are not preserved by\n" -"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"remove the problem tables and restart the upgrade. A list of the\n" -"problem columns is in the file:\n" -" %s\n" -"\n" +"Your installation contains roles starting with \"pg_\".\n" +"\"pg_\" is a reserved prefix for system roles. The cluster\n" +"cannot be upgraded until these roles are renamed.\n" +"A list of roles starting with \"pg_\" is in the file:\n" +" %s" msgstr "" -"옛 서버ì—서 사용ìžê°€ 만든 í…Œì´ë¸”ì—서 reg* ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³  있습니다.\n" -"ì´ ìžë£Œí˜•ë“¤ì€ pg_upgrade 명령으로 ë‚´ì •ëœ ì‹œìŠ¤í…œ OID를 사용하지 못할 수\n" -"있습니다. 그래서 업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•  수 없습니다.\n" -"사용하고 있는 í…Œì´ë¸”ë“¤ì„ ì§€ìš°ê³  업그레ì´ë“œ ìž‘ì—…ì„ ë‹¤ì‹œ 시ë„하세요.\n" -"ì´ëŸ° ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ëŠ” ì¹¼ëŸ¼ë“¤ì€ ì•„ëž˜ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n" -" %s\n" -"\n" +"기존 ë°ì´í„°ë² ì´ìŠ¤ì— ì‚¬ìš©ìžê°€ 만든 \"pg_\"로 시작하는 롤ì´\n" +"있습니다. \"pg_\"는 시스템 롤로 ì˜ˆì•½ëœ ì ‘ë‘어입니다.\n" +"ì´ ë¡¤ë“¤ì„ ë‹¤ë¥¸ ì´ë¦„으로 바꿔야 업그레ì´ë“œê°€ 가능합니다.\n" +"\"pg_\"로 시작하는 롤 ì´ë¦„ 목ë¡ì€ ë‹¤ìŒ íŒŒì¼ì— 있습니다:\n" +" %s" -#: check.c:1102 +#: check.c:1647 #, c-format -msgid "Checking for incompatible \"jsonb\" data type" -msgstr "\"jsonb\" ìžë£Œí˜• 호환성 í™•ì¸ ì¤‘" +msgid "Checking for user-defined encoding conversions" +msgstr "ì‚¬ìš©ìž ì •ì˜ ì¸ì½”딩 ë³€í™˜ê·œì¹™ì„ ê²€ì‚¬ 중" -#: check.c:1168 +#: check.c:1707 #, c-format msgid "" -"Your installation contains the \"jsonb\" data type in user tables.\n" -"The internal format of \"jsonb\" changed during 9.4 beta so this\n" -"cluster cannot currently be upgraded. You can remove the problem\n" -"tables and restart the upgrade. A list of the problem columns is\n" -"in the file:\n" -" %s\n" -"\n" +"Your installation contains user-defined encoding conversions.\n" +"The conversion function parameters changed in PostgreSQL version 14\n" +"so this cluster cannot currently be upgraded. You can remove the\n" +"encoding conversions in the old cluster and restart the upgrade.\n" +"A list of user-defined encoding conversions is in the file:\n" +" %s" msgstr "" -"ì‚¬ìš©ìž í…Œì´ë¸”ì—서 \"jsonb\" ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³  있습니다.\n" -"9.4 베타 비전 ì´í›„ JSONB ë‚´ë¶€ ìžë£Œ 구조가 바뀌었습니다.\n" +"ì‚¬ìš©ìž ì •ì˜ ì¸ì½”딩 변환 규칙용 변환 함수 매개 변수가\n" +"PostgreSQL 14 비전 ì´í›„ 바뀌었습니다.\n" "그래서, 업그레ì´ë“œ ìž‘ì—…ì´ ë¶ˆê°€ëŠ¥í•©ë‹ˆë‹¤.\n" -"해당 í…Œì´ë¸”ë“¤ì„ ì§€ìš°ê³  업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”\n" -"해당 ìžë£Œí˜•ì„ ì¹¼ëŸ¼ë“¤ì€ ì•„ëž˜ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n" -" %s\n" -"\n" +"먼저 ì´ëŸ° 변환 ê·œì¹™ì„ ì˜› 서버ì—서 지우고 다시 시ë„하세요.\n" +"해당 변환 규칙 목ë¡ì€ 아래 íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n" +" %s" -#: check.c:1190 +#: check.c:1746 #, c-format -msgid "Checking for roles starting with \"pg_\"" -msgstr "\"pg_\"로 시작하는 롤 í™•ì¸ ì¤‘" +msgid "Checking for new cluster logical replication slots" +msgstr "새 í´ëŸ¬ìŠ¤í„° 논리 복제 슬롯 검사 중" + +#: check.c:1754 +#, c-format +msgid "could not count the number of logical replication slots" +msgstr "논리 복제 슬롯 개수를 파악할 수 ì—†ìŒ" + +#: check.c:1759 +#, c-format +msgid "expected 0 logical replication slots but found %d" +msgstr "논리 복제 ìŠ¬ë¡¯ì´ ì—†ë‹¤ê³  íŒë‹¨í–ˆëŠ”ë°, %dê°œ 발견 ë¨" + +#: check.c:1769 check.c:1820 +#, c-format +msgid "could not determine parameter settings on new cluster" +msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© 매개변수 ì„¤ì •ì„ ì¡°ì‚¬ í•  수 ì—†ìŒ" + +#: check.c:1774 +#, c-format +msgid "\"wal_level\" must be \"logical\" but is set to \"%s\"" +msgstr "\"wal_level\" ì„¤ì •ê°’ì€ \"logical\"ì´ì–´ì•¼ 하는ë°, \"%s\"ìž„" -#: check.c:1200 +#: check.c:1780 #, c-format -msgid "The source cluster contains roles starting with \"pg_\"\n" -msgstr "옛 í´ëŸ¬ìŠ¤í„°ì— \"pg_\" 시작하는 ë¡¤ì´ ìžˆìŠµë‹ˆë‹¤.\n" +msgid "" +"\"max_replication_slots\" (%d) must be greater than or equal to the number " +"of logical replication slots (%d) on the old cluster" +msgstr "" +"\"max_replication_slots\" 설정값(%d)ì´ ì˜› í´ëŸ¬ìŠ¤í„° 논리 복제 슬롯 수(%d)와 ê°™" +"거나 커야 함" -#: check.c:1202 +#: check.c:1812 #, c-format -msgid "The target cluster contains roles starting with \"pg_\"\n" -msgstr "새 í´ëŸ¬ìŠ¤í„°ì— \"pg_\"로 시작하는 ë¡¤ì´ ìžˆìŠµë‹ˆë‹¤.\n" +msgid "Checking for new cluster configuration for subscriptions" +msgstr "구ë…ì„ ìœ„í•œ 새 í´ëŸ¬ìŠ¤í„° 환경 ì„¤ì •ì„ ê²€ì‚¬ 중" -#: check.c:1228 +#: check.c:1824 #, c-format -msgid "failed to get the current locale\n" -msgstr "현재 로케ì¼ì„ í™•ì¸ í•  수 ì—†ìŒ\n" +msgid "" +"\"max_replication_slots\" (%d) must be greater than or equal to the number " +"of subscriptions (%d) on the old cluster" +msgstr "" +"\"max_replication_slots\" 설정값(%d)ì´ ì˜› í´ëŸ¬ìŠ¤í„° êµ¬ë… ìˆ˜(%d)와 같거나 커야 " +"함" -#: check.c:1237 +#: check.c:1846 #, c-format -msgid "failed to get system locale name for \"%s\"\n" -msgstr "\"%s\"ìš© 시스템 ë¡œì¼€ì¼ ì´ë¦„ì„ ì•Œ 수 ì—†ìŒ\n" +msgid "Checking for valid logical replication slots" +msgstr "논리 복제 슬롯 유효성 검사 중" -#: check.c:1243 +#: check.c:1898 #, c-format -msgid "failed to restore old locale \"%s\"\n" -msgstr "\"%s\" 옛 로케ì¼ì„ ë³µì›í•  수 ì—†ìŒ\n" +msgid "" +"Your installation contains logical replication slots that cannot be " +"upgraded.\n" +"You can remove invalid slots and/or consume the pending WAL for other " +"slots,\n" +"and then restart the upgrade.\n" +"A list of the problematic slots is in the file:\n" +" %s" +msgstr "" +"옛 í´ëŸ¬ìŠ¤í„°ì— ì—…ê·¸ë ˆì´ë“œ í•  수 없는 논리 복제 ìŠ¬ë¡¯ì´ ìžˆìŠµë‹ˆë‹¤.\n" +"í•„ìš” 없는 ìŠ¬ë¡¯ì„ ì§€ìš°ê±°ë‚˜ ì§€ì—°ëœ WAL 소비를 한 ë’¤ì—,\n" +"업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”.\n" +"해당 ë¬¸ì œì˜ ìŠ¬ë¡¯ 목ë¡ì€ ë‹¤ìŒ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n" +" %s" + +#: check.c:1922 +#, c-format +msgid "Checking for subscription state" +msgstr "êµ¬ë… ìƒíƒœ 검사 중" + +#: check.c:2023 +#, c-format +msgid "" +"Your installation contains subscriptions without origin or having relations " +"not in i (initialize) or r (ready) state.\n" +"You can allow the initial sync to finish for all relations and then restart " +"the upgrade.\n" +"A list of the problematic subscriptions is in the file:\n" +" %s" +msgstr "" +"오리진 없는 구ë…ì´ ìžˆê±°ë‚˜, i(초기화), r(준비) ìƒíƒœê°€ 아닌 릴레ì´ì…˜ì„ í¬í•¨í•˜" +"는 구ë…ì´ ìžˆìŠµë‹ˆë‹¤.\n" +"구ë…ì˜ ìžë£Œ ì¼ê´€ì„±ì„ ëª¨ë‘ ë§žì¶˜ ë‹¤ìŒ ì—…ê·¸ë ˆì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”.\n" +"해당 ë¬¸ì œì˜ êµ¬ë… ëª©ë¡ì€ ë‹¤ìŒ íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤:\n" +" %s" -#: controldata.c:127 controldata.c:195 +#: controldata.c:129 controldata.c:199 #, c-format -msgid "could not get control data using %s: %s\n" -msgstr "%s 사용하는 컨트롤 ìžë£Œë¥¼ 구할 수 ì—†ìŒ: %s\n" +msgid "could not get control data using %s: %m" +msgstr "%s 사용하는 컨트롤 ìžë£Œë¥¼ 구할 수 ì—†ìŒ: %m" -#: controldata.c:138 +#: controldata.c:139 #, c-format -msgid "%d: database cluster state problem\n" -msgstr "%d: ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„° ìƒíƒœ 문제\n" +msgid "%d: database cluster state problem" +msgstr "%d: ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„° ìƒíƒœ 문제" -#: controldata.c:156 +#: controldata.c:158 #, c-format msgid "" "The source cluster was shut down while in recovery mode. To upgrade, use " -"\"rsync\" as documented or shut it down as a primary.\n" +"\"rsync\" as documented or shut it down as a primary." msgstr "" "ì›ë³¸ í´ëŸ¬ìŠ¤í„°ëŠ” 복구 모드(대기 서버 모드나, 복구 중) ìƒíƒœì—서 중지 ë˜ì—ˆìŠµë‹ˆ" "다. 업그레ì´ë“œ 하려면, ë¬¸ì„œì— ì–¸ê¸‰í•œ 것 처럼 \"rsync\"를 사용하든가, ê·¸ 서버" -"를 ìš´ì˜ ì„œë²„ 모드로 바꾼 ë’¤ 중지하고 작업하십시오.\n" +"를 ìš´ì˜ ì„œë²„ 모드로 바꾼 ë’¤ 중지하고 작업하십시오." -#: controldata.c:158 +#: controldata.c:160 #, c-format msgid "" "The target cluster was shut down while in recovery mode. To upgrade, use " -"\"rsync\" as documented or shut it down as a primary.\n" +"\"rsync\" as documented or shut it down as a primary." msgstr "" "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ëŠ” 복구 모드(대기 서버 모드나, 복구 중) ìƒíƒœì—서 중지 ë˜ì—ˆìŠµë‹ˆ" "다. 업그레ì´ë“œ 하려면, ë¬¸ì„œì— ì–¸ê¸‰í•œ 것 처럼 \"rsync\"를 사용하든가, ê·¸ 서버" -"를 ìš´ì˜ ì„œë²„ 모드로 바꾼 ë’¤ 중지하고 작업하십시오.\n" +"를 ìš´ì˜ ì„œë²„ 모드로 바꾼 ë’¤ 중지하고 작업하십시오." -#: controldata.c:163 +#: controldata.c:165 #, c-format -msgid "The source cluster was not shut down cleanly.\n" -msgstr "ì›ë³¸ í´ëŸ¬ìŠ¤í„°ëŠ” ì •ìƒì ìœ¼ë¡œ 종료ë˜ì–´ì•¼ 함\n" +msgid "The source cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "ì›ë³¸ í´ëŸ¬ìŠ¤í„°ëŠ” ì •ìƒì ìœ¼ë¡œ 종료ë˜ì–´ì•¼ 함, 종료 ìƒíƒœê°’: \"%s\"" -#: controldata.c:165 +#: controldata.c:167 #, c-format -msgid "The target cluster was not shut down cleanly.\n" -msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ëŠ” ì •ìƒ ì¢…ë£Œë˜ì–´ì•¼ 함\n" +msgid "The target cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ëŠ” ì •ìƒ ì¢…ë£Œë˜ì–´ì•¼ 함, 종료 ìƒíƒœê°’: \"%s\"" -#: controldata.c:176 +#: controldata.c:175 controldata.c:507 #, c-format -msgid "The source cluster lacks cluster state information:\n" -msgstr "ì›ë³¸ í´ëŸ¬ìŠ¤í„°ì— í´ëŸ¬ìŠ¤í„° ìƒíƒœ ì •ë³´ê°€ ì—†ìŒ:\n" +msgid "could not get control data using %s: %s" +msgstr "%s 사용하는 컨트롤 ìžë£Œë¥¼ 구할 수 ì—†ìŒ: %s" -#: controldata.c:178 +#: controldata.c:181 #, c-format -msgid "The target cluster lacks cluster state information:\n" -msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ì— í´ëŸ¬ìŠ¤í„° ìƒíƒœ ì •ë³´ê°€ ì—†ìŒ:\n" +msgid "The source cluster lacks cluster state information:" +msgstr "ì›ë³¸ í´ëŸ¬ìŠ¤í„°ì— í´ëŸ¬ìŠ¤í„° ìƒíƒœ ì •ë³´ê°€ ì—†ìŒ:" -#: controldata.c:208 dump.c:49 pg_upgrade.c:339 pg_upgrade.c:375 -#: relfilenode.c:247 util.c:79 +#: controldata.c:183 +#, c-format +msgid "The target cluster lacks cluster state information:" +msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ì— í´ëŸ¬ìŠ¤í„° ìƒíƒœ ì •ë³´ê°€ ì—†ìŒ:" + +#: controldata.c:213 dump.c:50 exec.c:118 pg_upgrade.c:556 pg_upgrade.c:596 +#: pg_upgrade.c:945 relfilenumber.c:233 server.c:34 util.c:337 #, c-format msgid "%s" msgstr "%s" -#: controldata.c:215 +#: controldata.c:220 #, c-format -msgid "%d: pg_resetwal problem\n" -msgstr "%d: pg_resetwal 문제\n" +msgid "%d: pg_resetwal problem" +msgstr "%d: pg_resetwal 문제" -#: controldata.c:225 controldata.c:235 controldata.c:246 controldata.c:257 -#: controldata.c:268 controldata.c:287 controldata.c:298 controldata.c:309 -#: controldata.c:320 controldata.c:331 controldata.c:342 controldata.c:345 -#: controldata.c:349 controldata.c:359 controldata.c:371 controldata.c:382 -#: controldata.c:393 controldata.c:404 controldata.c:415 controldata.c:426 -#: controldata.c:437 controldata.c:448 controldata.c:459 controldata.c:470 -#: controldata.c:481 +#: controldata.c:230 controldata.c:240 controldata.c:251 controldata.c:262 +#: controldata.c:273 controldata.c:292 controldata.c:303 controldata.c:314 +#: controldata.c:325 controldata.c:336 controldata.c:347 controldata.c:358 +#: controldata.c:361 controldata.c:365 controldata.c:375 controldata.c:387 +#: controldata.c:398 controldata.c:409 controldata.c:420 controldata.c:431 +#: controldata.c:442 controldata.c:453 controldata.c:464 controldata.c:475 +#: controldata.c:486 controldata.c:497 #, c-format -msgid "%d: controldata retrieval problem\n" -msgstr "%d: controldata ë³µì› ë¬¸ì œ\n" +msgid "%d: controldata retrieval problem" +msgstr "%d: controldata ë³µì› ë¬¸ì œ" -#: controldata.c:546 +#: controldata.c:578 #, c-format -msgid "The source cluster lacks some required control information:\n" -msgstr "옛 í´ëŸ¬ìŠ¤í„°ì— í•„ìš”í•œ 컨트롤 ì •ë³´ê°€ 몇몇 빠져있ìŒ:\n" +msgid "The source cluster lacks some required control information:" +msgstr "옛 í´ëŸ¬ìŠ¤í„°ì— í•„ìš”í•œ 컨트롤 ì •ë³´ê°€ 몇몇 빠져있ìŒ:" -#: controldata.c:549 +#: controldata.c:581 #, c-format -msgid "The target cluster lacks some required control information:\n" -msgstr "새 í´ëŸ¬ìŠ¤í„°ì— í•„ìš”í•œ 컨트롤 ì •ë³´ê°€ 몇몇 빠져있ìŒ:\n" +msgid "The target cluster lacks some required control information:" +msgstr "새 í´ëŸ¬ìŠ¤í„°ì— í•„ìš”í•œ 컨트롤 ì •ë³´ê°€ 몇몇 빠져있ìŒ:" -#: controldata.c:552 +#: controldata.c:584 #, c-format -msgid " checkpoint next XID\n" -msgstr " ì²´í¬í¬ì¸íЏ ë‹¤ìŒ XID\n" +msgid " checkpoint next XID" +msgstr " ì²´í¬í¬ì¸íЏ ë‹¤ìŒ XID" -#: controldata.c:555 +#: controldata.c:587 #, c-format -msgid " latest checkpoint next OID\n" -msgstr " 마지막 ì²´í¬í¬ì¸íЏ ë‹¤ìŒ OID\n" +msgid " latest checkpoint next OID" +msgstr " 마지막 ì²´í¬í¬ì¸íЏ ë‹¤ìŒ OID" -#: controldata.c:558 +#: controldata.c:590 #, c-format -msgid " latest checkpoint next MultiXactId\n" -msgstr " 마지막 ì²´í¬í¬ì¸íЏ ë‹¤ìŒ MultiXactId\n" +msgid " latest checkpoint next MultiXactId" +msgstr " 마지막 ì²´í¬í¬ì¸íЏ ë‹¤ìŒ MultiXactId" -#: controldata.c:562 +#: controldata.c:594 #, c-format -msgid " latest checkpoint oldest MultiXactId\n" -msgstr " 마지막 ì²´í¬í¬ì¸íЏ ì œì¼ ì˜¤ëž˜ëœ MultiXactId\n" +msgid " latest checkpoint oldest MultiXactId" +msgstr " 마지막 ì²´í¬í¬ì¸íЏ ì œì¼ ì˜¤ëž˜ëœ MultiXactId" -#: controldata.c:565 +#: controldata.c:597 #, c-format -msgid " latest checkpoint next MultiXactOffset\n" -msgstr " 마지막 ì²´í¬í¬ì¸íЏ ë‹¤ìŒ MultiXactOffset\n" +msgid " latest checkpoint oldestXID" +msgstr " 마지막 ì²´í¬í¬ì¸íЏ ì œì¼ ì˜¤ëž˜ëœ XID" -#: controldata.c:568 +#: controldata.c:600 #, c-format -msgid " first WAL segment after reset\n" -msgstr " 리셋 ë’¤ 첫 WAL ì¡°ê°\n" +msgid " latest checkpoint next MultiXactOffset" +msgstr " 마지막 ì²´í¬í¬ì¸íЏ ë‹¤ìŒ MultiXactOffset" -#: controldata.c:571 +#: controldata.c:603 #, c-format -msgid " float8 argument passing method\n" -msgstr " float8 ì¸ìž 처리 ë°©ì‹\n" +msgid " first WAL segment after reset" +msgstr " 리셋 ë’¤ 첫 WAL ì¡°ê°" -#: controldata.c:574 +#: controldata.c:606 #, c-format -msgid " maximum alignment\n" -msgstr " 최대 ì •ë ¬\n" +msgid " float8 argument passing method" +msgstr " float8 ì¸ìž 처리 ë°©ì‹" -#: controldata.c:577 +#: controldata.c:609 #, c-format -msgid " block size\n" -msgstr " ë¸”ë¡ í¬ê¸°\n" +msgid " maximum alignment" +msgstr " 최대 ì •ë ¬" -#: controldata.c:580 +#: controldata.c:612 #, c-format -msgid " large relation segment size\n" -msgstr " 대형 릴레ì´ì…˜ ì¡°ê° í¬ê¸°\n" +msgid " block size" +msgstr " ë¸”ë¡ í¬ê¸°" -#: controldata.c:583 +#: controldata.c:615 #, c-format -msgid " WAL block size\n" -msgstr " WAL ë¸”ë¡ í¬ê¸°\n" +msgid " large relation segment size" +msgstr " 대형 릴레ì´ì…˜ ì¡°ê° í¬ê¸°" -#: controldata.c:586 +#: controldata.c:618 #, c-format -msgid " WAL segment size\n" -msgstr " WAL ì¡°ê° í¬ê¸°\n" +msgid " WAL block size" +msgstr " WAL ë¸”ë¡ í¬ê¸°" -#: controldata.c:589 +#: controldata.c:621 #, c-format -msgid " maximum identifier length\n" -msgstr " 최대 ì‹ë³„ìž ê¸¸ì´\n" +msgid " WAL segment size" +msgstr " WAL ì¡°ê° í¬ê¸°" -#: controldata.c:592 +#: controldata.c:624 #, c-format -msgid " maximum number of indexed columns\n" -msgstr " 최대 ì¸ë±ìФ 칼럼 수\n" +msgid " maximum identifier length" +msgstr " 최대 ì‹ë³„ìž ê¸¸ì´" -#: controldata.c:595 +#: controldata.c:627 #, c-format -msgid " maximum TOAST chunk size\n" -msgstr " 최대 토스트 ì¡°ê° í¬ê¸°\n" +msgid " maximum number of indexed columns" +msgstr " 최대 ì¸ë±ìФ 칼럼 수" -#: controldata.c:599 +#: controldata.c:630 #, c-format -msgid " large-object chunk size\n" -msgstr " 대형 ê°ì²´ ì¡°ê° í¬ê¸°\n" +msgid " maximum TOAST chunk size" +msgstr " 최대 토스트 ì¡°ê° í¬ê¸°" -#: controldata.c:602 +#: controldata.c:634 #, c-format -msgid " dates/times are integers?\n" -msgstr " date/time ìžë£Œí˜•ì„ ì •ìˆ˜ë¡œ?\n" +msgid " large-object chunk size" +msgstr " 대형 ê°ì²´ ì¡°ê° í¬ê¸°" -#: controldata.c:606 +#: controldata.c:637 #, c-format -msgid " data checksum version\n" -msgstr " ìžë£Œ ì²´í¬ì„¬ 버전\n" +msgid " dates/times are integers?" +msgstr " date/time ìžë£Œí˜•ì„ ì •ìˆ˜ë¡œ?" -#: controldata.c:608 +#: controldata.c:641 #, c-format -msgid "Cannot continue without required control information, terminating\n" -msgstr "필요한 컨트롤 ì •ë³´ ì—†ì´ëŠ” 진행할 수 ì—†ìŒ, 중지 함\n" +msgid " data checksum version" +msgstr " ìžë£Œ ì²´í¬ì„¬ 버전" -#: controldata.c:623 +#: controldata.c:643 +#, c-format +msgid "Cannot continue without required control information, terminating" +msgstr "필요한 컨트롤 ì •ë³´ ì—†ì´ëŠ” 진행할 수 ì—†ìŒ, 중지 함" + +#: controldata.c:658 #, c-format msgid "" -"old and new pg_controldata alignments are invalid or do not match\n" -"Likely one cluster is a 32-bit install, the other 64-bit\n" +"old and new pg_controldata alignments are invalid or do not match.\n" +"Likely one cluster is a 32-bit install, the other 64-bit" msgstr "" "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata ì •ë ¬ì´ ì„œë¡œ 다릅니다.\n" -"하나는 32비트고, 하나는 64ë¹„íŠ¸ì¸ ê²½ìš° 같습니다\n" +"하나는 32비트고, 하나는 64ë¹„íŠ¸ì¸ ê²½ìš° 같습니다." -#: controldata.c:627 +#: controldata.c:662 #, c-format -msgid "old and new pg_controldata block sizes are invalid or do not match\n" -msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata ë¸”ë¡ í¬ê¸°ê°€ 서로 다릅니다.\n" +msgid "old and new pg_controldata block sizes are invalid or do not match" +msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata ë¸”ë¡ í¬ê¸°ê°€ 서로 다릅니다." -#: controldata.c:630 +#: controldata.c:665 #, c-format msgid "" "old and new pg_controldata maximum relation segment sizes are invalid or do " -"not match\n" -msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 최대 릴레ì´ì…˜ ì¡°ê° í¬ê°€ê°€ 서로 다릅니다.\n" +"not match" +msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 최대 릴레ì´ì…˜ ì¡°ê° í¬ê°€ê°€ 서로 다릅니다." -#: controldata.c:633 +#: controldata.c:668 #, c-format -msgid "" -"old and new pg_controldata WAL block sizes are invalid or do not match\n" -msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata WAL ë¸”ë¡ í¬ê¸°ê°€ 서로 다릅니다.\n" +msgid "old and new pg_controldata WAL block sizes are invalid or do not match" +msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata WAL ë¸”ë¡ í¬ê¸°ê°€ 서로 다릅니다." -#: controldata.c:636 +#: controldata.c:671 #, c-format msgid "" -"old and new pg_controldata WAL segment sizes are invalid or do not match\n" -msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata WAL ì¡°ê° í¬ê¸°ê°€ 서로 다릅니다.\n" +"old and new pg_controldata WAL segment sizes are invalid or do not match" +msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata WAL ì¡°ê° í¬ê¸°ê°€ 서로 다릅니다." -#: controldata.c:639 +#: controldata.c:674 #, c-format msgid "" "old and new pg_controldata maximum identifier lengths are invalid or do not " -"match\n" -msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 최대 ì‹ë³„ìž ê¸¸ì´ê°€ 서로 다릅니다.\n" +"match" +msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 최대 ì‹ë³„ìž ê¸¸ì´ê°€ 서로 다릅니다." -#: controldata.c:642 +#: controldata.c:677 #, c-format msgid "" "old and new pg_controldata maximum indexed columns are invalid or do not " -"match\n" -msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 최대 ì¸ë±ìФ 칼럼수가 서로 다릅니다.\n" +"match" +msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 최대 ì¸ë±ìФ 칼럼수가 서로 다릅니다." -#: controldata.c:645 +#: controldata.c:680 #, c-format msgid "" "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not " -"match\n" -msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 최대 토스트 ì¡°ê° í¬ê¸°ê°€ 서로 다릅니다.\n" +"match" +msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 최대 토스트 ì¡°ê° í¬ê¸°ê°€ 서로 다릅니다." -#: controldata.c:650 +#: controldata.c:685 #, c-format msgid "" "old and new pg_controldata large-object chunk sizes are invalid or do not " -"match\n" -msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 대형 ê°ì²´ ì¡°ê° í¬ê¸°ê°€ 서로 다릅니다.\n" +"match" +msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata 대형 ê°ì²´ ì¡°ê° í¬ê¸°ê°€ 서로 다릅니다." -#: controldata.c:653 +#: controldata.c:688 #, c-format -msgid "old and new pg_controldata date/time storage types do not match\n" -msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata date/time 저장 í¬ê¸°ê°€ 서로 다릅니다.\n" +msgid "old and new pg_controldata date/time storage types do not match" +msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata date/time 저장 í¬ê¸°ê°€ 서로 다릅니다." -#: controldata.c:666 +#: controldata.c:701 #, c-format -msgid "old cluster does not use data checksums but the new one does\n" +msgid "old cluster does not use data checksums but the new one does" msgstr "" "옛 í´ëŸ¬ìŠ¤í„°ëŠ” ë°ì´í„° ì²´í¬ì„¬ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ì§€ 않고, 새 í´ëŸ¬ìŠ¤í„°ëŠ” 사용하고 있습" -"니다.\n" +"니다." -#: controldata.c:669 +#: controldata.c:704 #, c-format -msgid "old cluster uses data checksums but the new one does not\n" +msgid "old cluster uses data checksums but the new one does not" msgstr "" "옛 í´ëŸ¬ìŠ¤í„°ëŠ” ë°ì´í„° ì²´í¬ì„¬ ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ê³ , 새 í´ëŸ¬ìŠ¤í„°ëŠ” 사용하고 있지 않습" -"니다.\n" +"니다." -#: controldata.c:671 +#: controldata.c:706 #, c-format -msgid "old and new cluster pg_controldata checksum versions do not match\n" -msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata ì²´í¬ì„¬ ë²„ì „ì´ ì„œë¡œ 다릅니다.\n" +msgid "old and new cluster pg_controldata checksum versions do not match" +msgstr "í´ëŸ¬ìŠ¤í„°ê°„ pg_controldata ì²´í¬ì„¬ ë²„ì „ì´ ì„œë¡œ 다릅니다." -#: controldata.c:682 +#: controldata.c:717 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "옛 global/pg_control 파ì¼ì— \".old\" ì´ë¦„ì„ ë§ë¶™ìž…니다." -#: controldata.c:687 +#: controldata.c:722 #, c-format -msgid "Unable to rename %s to %s.\n" -msgstr "%s ì´ë¦„ì„ %s ì´ë¦„으로 바꿀 수 ì—†ìŒ.\n" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" -#: controldata.c:690 +#: controldata.c:726 #, c-format msgid "" "\n" "If you want to start the old cluster, you will need to remove\n" "the \".old\" suffix from %s/global/pg_control.old.\n" "Because \"link\" mode was used, the old cluster cannot be safely\n" -"started once the new cluster has been started.\n" -"\n" +"started once the new cluster has been started." msgstr "" "\n" "옛 버전으로 옛 í´ëŸ¬ìŠ¤í„°ë¥¼ 사용해서 서버를 실행하려면,\n" "%s/global/pg_control.old 파ì¼ì˜ ì´ë¦„ì„ \".old\" 빼고 바꾸어\n" "사용해야합니다. 업그레ì´ë“œë¥¼ \"link\" 모드로 했기 때문ì—,\n" "한번ì´ë¼ë„ 새 ë²„ì „ì˜ ì„œë²„ê°€ ì´ í´ëŸ¬ìŠ¤í„°ë¥¼ ì´ìš©í•´ì„œ 실행ë˜ì—ˆë‹¤ë©´,\n" -"ì´ íŒŒì¼ì´ ë” ì´ìƒ 안전하지 않기 때문입니다.\n" -"\n" +"ì´ íŒŒì¼ì´ ë” ì´ìƒ 안전하지 않기 때문입니다." #: dump.c:20 #, c-format msgid "Creating dump of global objects" msgstr "ì „ì—­ ê°ì²´ ë¤í”„를 만듭니다" -#: dump.c:31 +#: dump.c:32 #, c-format -msgid "Creating dump of database schemas\n" -msgstr "ë°ì´í„°ë² ì´ìФ 스키마 ë¤í”„를 만듭니다\n" +msgid "Creating dump of database schemas" +msgstr "ë°ì´í„°ë² ì´ìФ 스키마 ë¤í”„를 만듭니다" -#: exec.c:44 +#: exec.c:47 #, c-format -msgid "could not get pg_ctl version data using %s: %s\n" -msgstr "%s ëª…ë ¹ì„ ì‚¬ìš©í•´ì„œ pg_ctl 버전 ìžë£Œë¥¼ 구할 수 ì—†ìŒ: %s\n" +msgid "could not get pg_ctl version data using %s: %m" +msgstr "%s ëª…ë ¹ì„ ì‚¬ìš©í•´ì„œ pg_ctl 버전 ìžë£Œë¥¼ 구할 수 ì—†ìŒ: %m" -#: exec.c:50 +#: exec.c:51 #, c-format -msgid "could not get pg_ctl version output from %s\n" -msgstr "%sì—서 pg_ctl ë²„ì „ì„ ì•Œ 수 ì—†ìŒ\n" +msgid "could not get pg_ctl version data using %s: %s" +msgstr "%s ëª…ë ¹ì„ ì‚¬ìš©í•´ì„œ pg_ctl 버전 ìžë£Œë¥¼ 구할 수 ì—†ìŒ: %s" -#: exec.c:104 exec.c:108 +#: exec.c:55 #, c-format -msgid "command too long\n" -msgstr "ëª…ë ¹ì´ ë„ˆë¬´ 긺\n" +msgid "could not get pg_ctl version output from %s" +msgstr "%sì—서 pg_ctl ë²„ì „ì„ ì•Œ 수 ì—†ìŒ" -#: exec.c:110 util.c:37 util.c:225 +#: exec.c:112 exec.c:116 #, c-format -msgid "%s\n" -msgstr "%s\n" +msgid "command too long" +msgstr "ëª…ë ¹ì´ ë„ˆë¬´ 긺" -#: exec.c:149 option.c:217 +#: exec.c:160 pg_upgrade.c:311 #, c-format -msgid "could not open log file \"%s\": %m\n" -msgstr "\"%s\" 로그 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m\n" +msgid "could not open log file \"%s\": %m" +msgstr "\"%s\" 로그 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: exec.c:178 +#: exec.c:192 #, c-format msgid "" "\n" @@ -751,414 +1045,371 @@ msgstr "" "\n" "*실패*" -#: exec.c:181 +#: exec.c:195 #, c-format -msgid "There were problems executing \"%s\"\n" -msgstr "\"%s\" 실행ì—서 문제 ë°œìƒ\n" +msgid "There were problems executing \"%s\"" +msgstr "\"%s\" 실행ì—서 문제 ë°œìƒ" -#: exec.c:184 +#: exec.c:198 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" -"the probable cause of the failure.\n" +"the probable cause of the failure." msgstr "" "\"%s\" ë˜ëŠ” \"%s\" 파ì¼ì˜ 마지막 ë¶€ë¶„ì„ ì‚´íŽ´ë³´ë©´\n" -"ì´ ë¬¸ì œë¥¼ í’€ 실마리가 ë³´ì¼ ê²ƒìž…ë‹ˆë‹¤.\n" +"ì´ ë¬¸ì œë¥¼ í’€ 실마리가 ë³´ì¼ ê²ƒìž…ë‹ˆë‹¤." -#: exec.c:189 +#: exec.c:203 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" -"the probable cause of the failure.\n" +"the probable cause of the failure." msgstr "" "\"%s\" 파ì¼ì˜ 마지막 ë¶€ë¶„ì„ ì‚´íŽ´ë³´ë©´\n" -"ì´ ë¬¸ì œë¥¼ í’€ 실마리가 ë³´ì¼ ê²ƒìž…ë‹ˆë‹¤.\n" +"ì´ ë¬¸ì œë¥¼ í’€ 실마리가 ë³´ì¼ ê²ƒìž…ë‹ˆë‹¤." -#: exec.c:204 option.c:226 +#: exec.c:218 pg_upgrade.c:321 #, c-format -msgid "could not write to log file \"%s\": %m\n" -msgstr "\"%s\" 로그 파ì¼ì„ 쓸 수 ì—†ìŒ: %m\n" +msgid "could not write to log file \"%s\": %m" +msgstr "\"%s\" 로그 파ì¼ì„ 쓸 수 ì—†ìŒ: %m" -#: exec.c:230 +#: exec.c:244 #, c-format -msgid "could not open file \"%s\" for reading: %s\n" -msgstr "\"%s\" 파ì¼ì„ ì½ê¸° 위해 ì—´ 수 없습니다: %s\n" +msgid "could not open file \"%s\" for reading: %m" +msgstr "\"%s\" 파ì¼ì„ ì½ê¸° 위해 ì—´ 수 없습니다: %m" -#: exec.c:257 +#: exec.c:270 #, c-format -msgid "You must have read and write access in the current directory.\n" -msgstr "현재 ë””ë ‰í„°ë¦¬ì˜ ì½ê¸° 쓰기 ê¶Œí•œì„ ë¶€ì—¬í•˜ì„¸ìš”.\n" +msgid "You must have read and write access in the current directory." +msgstr "현재 ë””ë ‰í„°ë¦¬ì˜ ì½ê¸° 쓰기 ê¶Œí•œì„ ë¶€ì—¬í•˜ì„¸ìš”." -#: exec.c:310 exec.c:372 exec.c:436 +#: exec.c:323 exec.c:389 exec.c:439 #, c-format -msgid "check for \"%s\" failed: %s\n" -msgstr "\"%s\" 검사 실패: %s\n" +msgid "check for \"%s\" failed: %m" +msgstr "\"%s\" 검사 실패: %m" -#: exec.c:313 exec.c:375 +#: exec.c:326 exec.c:392 #, c-format -msgid "\"%s\" is not a directory\n" -msgstr "\"%s\" 파ì¼ì€ 디렉터리가 아닙니다.\n" +msgid "\"%s\" is not a directory" +msgstr "\"%s\" 파ì¼ì€ 디렉터리가 아닙니다." -#: exec.c:439 +#: exec.c:444 #, c-format -msgid "check for \"%s\" failed: not a regular file\n" -msgstr "\"%s\" 검사 실패: ì¼ë°˜ 파ì¼ì´ 아닙니다\n" +msgid "check for \"%s\" failed: cannot execute" +msgstr "\"%s\" 검사 실패: 실행할 수 ì—†ìŒ" -#: exec.c:451 +#: exec.c:454 #, c-format -msgid "check for \"%s\" failed: cannot read file (permission denied)\n" -msgstr "\"%s\" 검사 실패: 해당 파ì¼ì„ ì½ì„ 수 ì—†ìŒ (ì ‘ê·¼ 권한 ì—†ìŒ)\n" +msgid "" +"check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"" +msgstr "\"%s\" 검사 실패: ìž˜ëª»ëœ ë²„ì „: 현재 \"%s\", 기대값 \"%s\"" -#: exec.c:459 +#: file.c:44 #, c-format -msgid "check for \"%s\" failed: cannot execute (permission denied)\n" -msgstr "\"%s\" 검사 실패: 실행할 수 ì—†ìŒ (ì ‘ê·¼ 권한 ì—†ìŒ)\n" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레ì´ì…˜ í´ë¡  중 오류: %m" -#: file.c:43 file.c:61 +#: file.c:51 #, c-format -msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레ì´ì…˜ í´ë¡  중 오류: %s\n" +msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "\"%s.%s\" 릴레ì´ì…˜ í´ë¡  중 오류: \"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: file.c:50 +#: file.c:56 #, c-format msgid "" -"error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n" -msgstr "\"%s.%s\" 릴레ì´ì…˜ í´ë¡  중 오류: \"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s\n" +"error while cloning relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "\"%s.%s\" 릴레ì´ì…˜ í´ë¡  중 오류: \"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %m" -#: file.c:55 +#: file.c:65 #, c-format -msgid "" -"error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n" -msgstr "\"%s.%s\" 릴레ì´ì…˜ í´ë¡  중 오류: \"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %s\n" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s" +msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레ì´ì…˜ í´ë¡  중 오류: %s" -#: file.c:87 file.c:190 +#: file.c:91 file.c:160 file.c:233 #, c-format -msgid "" -"error while copying relation \"%s.%s\": could not open file \"%s\": %s\n" -msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s\n" +msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: file.c:92 file.c:199 +#: file.c:96 file.c:165 file.c:242 #, c-format msgid "" -"error while copying relation \"%s.%s\": could not create file \"%s\": %s\n" -msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %s\n" +"error while copying relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %m" -#: file.c:106 file.c:223 +#: file.c:110 file.c:266 #, c-format -msgid "" -"error while copying relation \"%s.%s\": could not read file \"%s\": %s\n" -msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s\n" +msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %m" +msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: file.c:118 file.c:301 +#: file.c:122 file.c:344 #, c-format -msgid "" -"error while copying relation \"%s.%s\": could not write file \"%s\": %s\n" -msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì„ 쓸 수 ì—†ìŒ: %s\n" +msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %m" +msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì„ 쓸 수 ì—†ìŒ: %m" -#: file.c:132 +#: file.c:136 #, c-format -msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레ì´ì…˜ 복사 중 오류: %s\n" +msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레ì´ì…˜ 복사 중 오류: %m" -#: file.c:151 +#: file.c:172 #, c-format msgid "" -"error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레ì´ì…˜ ë§í¬ 만드는 중 오류: %s\n" +"error while copying relation \"%s.%s\": could not copy file range from " +"\"%s\" to \"%s\": %m" +msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: 실패 복사 범위: \"%s\" - \"%s\": %m" #: file.c:194 #, c-format -msgid "" -"error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n" +msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "\"%s.%s\" (\"%s\" / \"%s\") 릴레ì´ì…˜ ë§í¬ 만드는 중 오류: %m" + +#: file.c:237 +#, c-format +msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %m" msgstr "" -"\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" íŒŒì¼ ìƒíƒœ 정보를 알 수 ì—†ìŒ: %s\n" +"\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" íŒŒì¼ ìƒíƒœ 정보를 알 수 ì—†ìŒ: %m" -#: file.c:226 +#: file.c:269 #, c-format msgid "" -"error while copying relation \"%s.%s\": partial page found in file \"%s\"\n" -msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì— 페ì´ì§€ê°€ ì†ìƒë˜ì—ˆìŒ\n" +"error while copying relation \"%s.%s\": partial page found in file \"%s\"" +msgstr "\"%s.%s\" 릴레ì´ì…˜ 복사 중 오류: \"%s\" 파ì¼ì— 페ì´ì§€ê°€ ì†ìƒë˜ì—ˆìŒ" -#: file.c:328 file.c:345 +#: file.c:371 file.c:387 #, c-format -msgid "could not clone file between old and new data directories: %s\n" -msgstr "옛 ë°ì´í„° 디렉터리와 새 ë°ì´í„° 디렉터리 ì‚¬ì´ íŒŒì¼ í´ë¡  실패: %s\n" +msgid "could not clone file between old and new data directories: %m" +msgstr "옛 ë°ì´í„° 디렉터리와 새 ë°ì´í„° 디렉터리 ì‚¬ì´ íŒŒì¼ í´ë¡  실패: %m" -#: file.c:341 +#: file.c:383 file.c:420 #, c-format -msgid "could not create file \"%s\": %s\n" -msgstr "\"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %s\n" +msgid "could not create file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 만들 수 ì—†ìŒ: %m" -#: file.c:352 +#: file.c:393 #, c-format -msgid "file cloning not supported on this platform\n" -msgstr "ì´ ìš´ì˜ì²´ì œëŠ” íŒŒì¼ í´ë¡  ê¸°ëŠ¥ì„ ì œê³µí•˜ì§€ 않습니다.\n" +msgid "file cloning not supported on this platform" +msgstr "ì´ ìš´ì˜ì²´ì œëŠ” íŒŒì¼ í´ë¡  ê¸°ëŠ¥ì„ ì œê³µí•˜ì§€ 않습니다." -#: file.c:369 +#: file.c:424 #, c-format -msgid "" -"could not create hard link between old and new data directories: %s\n" -"In link mode the old and new data directories must be on the same file " -"system.\n" -msgstr "" -"ë°ì´í„° 디렉터리간 하드 ë§í¬ë¥¼ 만들 수 ì—†ìŒ: %s\n" -"하드 ë§í¬ë¥¼ 사용하려면, ë‘ ë””ë ‰í„°ë¦¬ê°€ ê°™ì€ ì‹œìŠ¤í…œ 볼륨 ì•ˆì— ìžˆì–´ì•¼ 합니다.\n" +msgid "could not copy file range between old and new data directories: %m" +msgstr "옛 ë°ì´í„° 디렉터리와 새 ë°ì´í„° 디렉터리 ì‚¬ì´ íŒŒì¼ í´ë¡  실패: %m" -#: function.c:114 +#: file.c:430 #, c-format -msgid "" -"\n" -"The old cluster has a \"plpython_call_handler\" function defined\n" -"in the \"public\" schema which is a duplicate of the one defined\n" -"in the \"pg_catalog\" schema. You can confirm this by executing\n" -"in psql:\n" -"\n" -" \\df *.plpython_call_handler\n" -"\n" -"The \"public\" schema version of this function was created by a\n" -"pre-8.1 install of plpython, and must be removed for pg_upgrade\n" -"to complete because it references a now-obsolete \"plpython\"\n" -"shared object file. You can remove the \"public\" schema version\n" -"of this function by running the following command:\n" -"\n" -" DROP FUNCTION public.plpython_call_handler()\n" -"\n" -"in each affected database:\n" -"\n" -msgstr "" -"\n" -"옛 í´ëŸ¬ìŠ¤í„°ëŠ” \"plpython_call_handler\" 함수가 \"public\" 스키마 안ì—\n" -"ì •ì˜ ë˜ì–´ìžˆìŠµë‹ˆë‹¤. ì´ í•¨ìˆ˜ëŠ” \"pg_catalog\" 스키마 ì•ˆì— ìžˆì–´ì•¼í•©ë‹ˆë‹¤.\n" -"psqlì—서 ë‹¤ìŒ ëª…ë ¹ìœ¼ë¡œ ì´ í•¨ìˆ˜ì˜ ìœ„ì¹˜ë¥¼ 살펴 ë³¼ 수 있습니다:\n" -"\n" -" \\df *.plpython_call_handler\n" -"\n" -"\"public\" 스키마 ì•ˆì— ì´ í•¨ìˆ˜ê°€ 있는 경우는 8.1 버전 ì´ì „ 버전ì´ì—ˆìŠµë‹ˆë‹¤.\n" -"업그레ì´ë“œ ìž‘ì—…ì„ ì •ìƒì ìœ¼ë¡œ 마치려면, 먼저 \"plpython\" 관련 ê°ì²´ë“¤ì„ 먼저\n" -"ëª¨ë‘ ì§€ìš°ê³ , 새 버전용 ëª¨ë“ˆì„ ì„¤ì¹˜í•´ì„œ 사용해야 합니다.\n" -"ì´ ì‚­ì œ ìž‘ì—…ì€ ë‹¤ìŒê³¼ ê°™ì´ ì§„í–‰í•©ë‹ˆë‹¤:\n" -"\n" -" DROP FUNCTION public.plpython_call_handler()\n" -"\n" -"ì´ ìž‘ì—…ì€ ê´€ë ¨ 모든 ë°ì´í„°ë² ì´ìФ 단위로 ì§„í–‰ë˜ì–´ì•¼ 합니다.\n" -"\n" +msgid "copy_file_range not supported on this platform" +msgstr "ì´ ìš´ì˜ì²´ì œëŠ” copy_file_range ê¸°ëŠ¥ì„ ì œê³µí•˜ì§€ 않습니다." -#: function.c:132 +#: file.c:447 #, c-format -msgid " %s\n" -msgstr " %s\n" - -#: function.c:142 -#, c-format -msgid "Remove the problem functions from the old cluster to continue.\n" -msgstr "옛 í´ëŸ¬ìŠ¤í„°ì—서 문제가 있는 í•¨ìˆ˜ë“¤ì„ ì‚­ì œí•˜ê³  진행하세요.\n" +msgid "" +"could not create hard link between old and new data directories: %m\n" +"In link mode the old and new data directories must be on the same file " +"system." +msgstr "" +"ë°ì´í„° 디렉터리간 하드 ë§í¬ë¥¼ 만들 수 ì—†ìŒ: %m\n" +"하드 ë§í¬ë¥¼ 사용하려면, ë‘ ë””ë ‰í„°ë¦¬ê°€ ê°™ì€ ì‹œìŠ¤í…œ 볼륨 ì•ˆì— ìžˆì–´ì•¼ 합니다." -#: function.c:189 +#: function.c:154 #, c-format msgid "Checking for presence of required libraries" msgstr "필요한 ë¼ì´ë¸ŒëŸ¬ë¦¬ í™•ì¸ ì¤‘" -#: function.c:242 +#: function.c:190 #, c-format msgid "could not load library \"%s\": %s" msgstr "\"%s\" ë¼ì´ë¸ŒëŸ¬ë¦¬ 로드 실패: %s" -#: function.c:253 +#: function.c:201 #, c-format msgid "In database: %s\n" msgstr "ë°ì´í„°ë² ì´ìФ: %s\n" -#: function.c:263 +#: function.c:211 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" "new installation. You can add these libraries to the new installation,\n" "or remove the functions using them from the old installation. A list of\n" "problem libraries is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "옛 버전ì—는 있고, 새 버전ì—는 없는 ë¼ì´ë¸ŒëŸ¬ë¦¬ë“¤ì´ 있습니다. 새 버전ì—\n" "해당 ë¼ì´ë¸ŒëŸ¬ë¦¬ë“¤ì„ 설치하거나, 옛 버전ì—서 해당 ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 삭제하고,\n" "업그레ì´ë“œ ìž‘ì—…ì„ í•´ì•¼í•©ë‹ˆë‹¤. 문제가 있는 ë¼ì´ë¸ŒëŸ¬ë¦¬ë“¤ì€ 다ìŒê³¼ 같습니다:\n" -" %s\n" -"\n" +" %s" -#: info.c:131 +#: info.c:128 #, c-format msgid "" -"Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s" -"\", new name \"%s.%s\"\n" +"Relation names for OID %u in database \"%s\" do not match: old name \"%s." +"%s\", new name \"%s.%s\"" msgstr "" "%u OIDì— ëŒ€í•œ \"%s\" ë°ì´í„°ë² ì´ìФ ì´ë¦„ì´ ì„œë¡œ 다릅니다: 옛 ì´ë¦„: \"%s.%s\", " -"새 ì´ë¦„: \"%s.%s\"\n" +"새 ì´ë¦„: \"%s.%s\"" -#: info.c:151 +#: info.c:148 #, c-format -msgid "Failed to match up old and new tables in database \"%s\"\n" -msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ ë‚´ í…Œì´ë¸” ì´ë¦„ì´ ì„œë¡œ 다릅니다:\n" +msgid "Failed to match up old and new tables in database \"%s\"" +msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ ë‚´ í…Œì´ë¸” ì´ë¦„ì´ ì„œë¡œ 다릅니다" -#: info.c:240 +#: info.c:229 #, c-format msgid " which is an index on \"%s.%s\"" msgstr " 해당 ì¸ë±ìФ: \"%s.%s\"" -#: info.c:250 +#: info.c:239 #, c-format msgid " which is an index on OID %u" msgstr " 해당 ì¸ë±ìŠ¤ì˜ OID: %u" -#: info.c:262 +#: info.c:251 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr " \"%s.%s\" ê°ì²´ì˜ 토스트 í…Œì´ë¸”" -#: info.c:270 +#: info.c:259 #, c-format msgid " which is the TOAST table for OID %u" msgstr " 해당 토스트 ë² ì´ë¸”ì˜ OID: %u" -#: info.c:274 +#: info.c:263 #, c-format msgid "" -"No match found in old cluster for new relation with OID %u in database \"%s" -"\": %s\n" +"No match found in old cluster for new relation with OID %u in database " +"\"%s\": %s" msgstr "" -"새 í´ëŸ¬ìŠ¤í„°ì˜ %u OID (해당 ë°ì´í„°ë² ì´ìФ: \"%s\")ê°€ 옛 í´ëŸ¬ìŠ¤í„°ì— ì—†ìŒ: %s\n" +"새 í´ëŸ¬ìŠ¤í„°ì˜ %u OID (해당 ë°ì´í„°ë² ì´ìФ: \"%s\")ê°€ 옛 í´ëŸ¬ìŠ¤í„°ì— ì—†ìŒ: %s" -#: info.c:277 +#: info.c:266 #, c-format msgid "" -"No match found in new cluster for old relation with OID %u in database \"%s" -"\": %s\n" +"No match found in new cluster for old relation with OID %u in database " +"\"%s\": %s" msgstr "" -"옛 í´ëŸ¬ìŠ¤í„°ì˜ %u OID (해당 ë°ì´í„°ë² ì´ìФ: \"%s\")ê°€ 새 í´ëŸ¬ìŠ¤í„°ì— ì—†ìŒ: %s\n" +"옛 í´ëŸ¬ìŠ¤í„°ì˜ %u OID (해당 ë°ì´í„°ë² ì´ìФ: \"%s\")ê°€ 새 í´ëŸ¬ìŠ¤í„°ì— ì—†ìŒ: %s" -#: info.c:289 -#, c-format -msgid "mappings for database \"%s\":\n" -msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ 맵핑 중:\n" - -#: info.c:292 -#, c-format -msgid "%s.%s: %u to %u\n" -msgstr "%s.%s: %u / %u\n" - -#: info.c:297 info.c:633 +#: info.c:300 #, c-format msgid "" "\n" -"\n" +"source databases:" msgstr "" "\n" -"\n" +"ì›ë³¸ ë°ì´í„°ë² ì´ìФ:" -#: info.c:322 +#: info.c:302 #, c-format msgid "" "\n" -"source databases:\n" +"target databases:" msgstr "" "\n" -"ì›ë³¸ ë°ì´í„°ë² ì´ìФ:\n" +"ëŒ€ìƒ ë°ì´í„°ë² ì´ìФ:" -#: info.c:324 +#: info.c:346 #, c-format -msgid "" -"\n" -"target databases:\n" -msgstr "" -"\n" -"ëŒ€ìƒ ë°ì´í„°ë² ì´ìФ:\n" +msgid "template0 not found" +msgstr "template0 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: info.c:631 +#: info.c:805 #, c-format -msgid "Database: %s\n" -msgstr "ë°ì´í„°ë² ì´ìФ: %s\n" +msgid "Database: \"%s\"" +msgstr "ë°ì´í„°ë² ì´ìФ: \"%s\"" + +#: info.c:818 +#, c-format +msgid "relname: \"%s.%s\", reloid: %u, reltblspace: \"%s\"" +msgstr "relname: \"%s.%s\": reloid: %u reltblspace: \"%s\"" -#: info.c:644 +#: info.c:832 #, c-format -msgid "relname: %s.%s: reloid: %u reltblspace: %s\n" -msgstr "relname: %s.%s: reloid: %u reltblspace: %s\n" +msgid "Logical replication slots in the database:" +msgstr "해당 ë°ì´í„°ë² ì´ìФ ì•ˆì— ìžˆëŠ” 논리 복제 슬롯들:" -#: option.c:102 +#: info.c:838 #, c-format -msgid "%s: cannot be run as root\n" -msgstr "%s: root 권한으로 실행할 수 ì—†ìŒ\n" +msgid "slot name: \"%s\", output plugin: \"%s\", two_phase: %s" +msgstr "슬롯 ì´ë¦„: \"%s\", 출력 플러그ì¸: \"%s\", two_phase: %s" -#: option.c:170 +#: option.c:105 #, c-format -msgid "invalid old port number\n" -msgstr "ìž˜ëª»ëœ ì˜› í¬íЏ 번호\n" +msgid "%s: cannot be run as root" +msgstr "%s: root 권한으로 실행할 수 ì—†ìŒ" -#: option.c:175 +#: option.c:172 #, c-format -msgid "invalid new port number\n" -msgstr "ìž˜ëª»ëœ ìƒˆ í¬íЏ 번호\n" +msgid "invalid old port number" +msgstr "ìž˜ëª»ëœ ì˜› í¬íЏ 번호" -#: option.c:207 +#: option.c:177 +#, c-format +msgid "invalid new port number" +msgstr "ìž˜ëª»ëœ ìƒˆ í¬íЏ 번호" + +#: option.c:216 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "보다 ìžì„¸í•œ ì‚¬ìš©ë²•ì€ \"%s --help\" ëª…ë ¹ì„ ì´ìš©í•˜ì„¸ìš”.\n" -#: option.c:214 +#: option.c:223 #, c-format -msgid "too many command-line arguments (first is \"%s\")\n" -msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정 í–ˆìŒ (시작: \"%s\")\n" +msgid "too many command-line arguments (first is \"%s\")" +msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정 í–ˆìŒ (시작: \"%s\")" -#: option.c:220 +#: option.c:229 #, c-format -msgid "Running in verbose mode\n" -msgstr "작업 ë‚´ì—­ì„ ìžì„¸ížˆ ë´„\n" +msgid "Running in verbose mode" +msgstr "작업 ë‚´ì—­ì„ ìžì„¸ížˆ ë´„" -#: option.c:251 +#: option.c:247 msgid "old cluster binaries reside" msgstr "옛 í´ëŸ¬ìŠ¤í„° ì‹¤í–‰íŒŒì¼ ìœ„ì¹˜" -#: option.c:253 +#: option.c:249 msgid "new cluster binaries reside" msgstr "새 í´ëŸ¬ìŠ¤í„° ì‹¤íŒ½íŒŒì¼ ìœ„ì¹˜" -#: option.c:255 +#: option.c:251 msgid "old cluster data resides" msgstr "옛 í´ëŸ¬ìŠ¤í„° ìžë£Œ 위치" -#: option.c:257 +#: option.c:253 msgid "new cluster data resides" msgstr "새 í´ëŸ¬ìŠ¤í„° ìžë£Œ 위치" -#: option.c:259 +#: option.c:255 msgid "sockets will be created" msgstr "소켓 íŒŒì¼ ë§Œë“¤ 위치" -#: option.c:276 option.c:374 +#: option.c:272 option.c:374 #, c-format -msgid "could not determine current directory\n" -msgstr "현재 디렉터리 위치를 알 수 ì—†ìŒ\n" +msgid "could not determine current directory" +msgstr "현재 디렉터리 위치를 알 수 ì—†ìŒ" -#: option.c:279 +#: option.c:275 #, c-format msgid "" -"cannot run pg_upgrade from inside the new cluster data directory on Windows\n" +"cannot run pg_upgrade from inside the new cluster data directory on Windows" msgstr "" "윈ë„우즈 환경ì—서는 pg_upgrade ëª…ë ¹ì€ ìƒˆ í´ëŸ¬ìŠ¤í„° ë°ì´í„° 디렉터리 안ì—서는 실" -"행할 수 ì—†ìŒ\n" +"행할 수 ì—†ìŒ" -#: option.c:288 +#: option.c:284 #, c-format msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" "\n" msgstr "" -"새 ë°ì´í„° í´ëŸ¬ìŠ¤í„° 버전과 pg_upgrade ë²„ì „ì˜ ë©”ì´ì € ë²„ì „ì´ ì„œë¡œ 다릅니다.\n" +"pg_upgrade는 다른 ë©”ì´ì € 버전으로 PostgreSQL í´ëŸ¬ìŠ¤í„°ë¥¼ 업그레ì´ë“œí•©ë‹ˆë‹¤.\n" "\n" -#: option.c:289 +#: option.c:285 #, c-format msgid "Usage:\n" msgstr "사용법:\n" -#: option.c:290 +#: option.c:286 #, c-format msgid "" " pg_upgrade [OPTION]...\n" @@ -1167,17 +1418,17 @@ msgstr "" " pg_upgrade [옵션]...\n" "\n" -#: option.c:291 +#: option.c:287 #, c-format msgid "Options:\n" msgstr "옵션:\n" -#: option.c:292 +#: option.c:288 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" msgstr " -b, --old-bindir=BINDIR 옛 í´ëŸ¬ìŠ¤í„° 실행 파ì¼ì˜ 디렉터리\n" -#: option.c:293 +#: option.c:289 #, c-format msgid "" " -B, --new-bindir=BINDIR new cluster executable directory (default\n" @@ -1186,23 +1437,23 @@ msgstr "" " -B, --new-bindir=BINDIR 새 í´ëŸ¬ìŠ¤í„° 실행 파ì¼ì˜ 디렉터리 (기본값:\n" " pg_upgradeê°€ 있는 디렉터리)\n" -#: option.c:295 +#: option.c:291 #, c-format msgid "" " -c, --check check clusters only, don't change any data\n" msgstr " -c, --check 실 작업 ì—†ì´, 그냥 검사만\n" -#: option.c:296 +#: option.c:292 #, c-format msgid " -d, --old-datadir=DATADIR old cluster data directory\n" msgstr " -d, --old-datadir=DATADIR 옛 í´ëŸ¬ìŠ¤í„° ë°ì´í„° 디렉터리\n" -#: option.c:297 +#: option.c:293 #, c-format msgid " -D, --new-datadir=DATADIR new cluster data directory\n" msgstr " -D, --new-datadir=DATADIR 새 í´ëŸ¬ìŠ¤í„° ë°ì´í„° 디렉터리\n" -#: option.c:298 +#: option.c:294 #, c-format msgid "" " -j, --jobs=NUM number of simultaneous processes or threads " @@ -1210,7 +1461,7 @@ msgid "" msgstr "" " -j, --jobs=NUM ë™ì‹œì— 작업할 프로세스 ë˜ëŠ” 쓰레드 수\n" -#: option.c:299 +#: option.c:295 #, c-format msgid "" " -k, --link link instead of copying files to new " @@ -1218,36 +1469,44 @@ msgid "" msgstr "" " -k, --link 새 í´ëŸ¬ìŠ¤í„° êµ¬ì¶•ì„ ë³µì‚¬ 대신 ë§í¬ 사용\n" -#: option.c:300 +#: option.c:296 +#, c-format +msgid "" +" -N, --no-sync do not wait for changes to be written safely " +"to disk\n" +msgstr "" +" -N, --no-sync 작업 완료 ë’¤ ë””ìŠ¤í¬ ë™ê¸°í™” ìž‘ì—…ì„ í•˜ì§€ 않ìŒ\n" + +#: option.c:297 #, c-format msgid "" " -o, --old-options=OPTIONS old cluster options to pass to the server\n" msgstr " -o, --old-options=옵션 옛 서버ì—서 사용할 서버 옵션들\n" -#: option.c:301 +#: option.c:298 #, c-format msgid "" " -O, --new-options=OPTIONS new cluster options to pass to the server\n" msgstr " -O, --new-options=옵션 새 서버ì—서 사용할 서버 옵션들\n" -#: option.c:302 +#: option.c:299 #, c-format msgid " -p, --old-port=PORT old cluster port number (default %d)\n" msgstr " -p, --old-port=PORT 옛 í´ëŸ¬ìŠ¤í„° í¬íЏ 번호 (기본값 %d)\n" -#: option.c:303 +#: option.c:300 #, c-format msgid " -P, --new-port=PORT new cluster port number (default %d)\n" msgstr " -P, --new-port=PORT 새 í´ëŸ¬ìŠ¤í„° í¬íЏ 번호 (기본값 %d)\n" -#: option.c:304 +#: option.c:301 #, c-format msgid "" " -r, --retain retain SQL and log files after success\n" msgstr "" " -r, --retain 작업 완료 후 ì‚¬ìš©í–ˆë˜ SQLê³¼ 로그 íŒŒì¼ ë‚¨ê¹€\n" -#: option.c:305 +#: option.c:302 #, c-format msgid "" " -s, --socketdir=DIR socket directory to use (default current " @@ -1256,23 +1515,23 @@ msgstr "" " -s, --socketdir=DIR 사용할 소켓 디렉터리 (기본값: 현재 디렉터" "리)\n" -#: option.c:306 +#: option.c:303 #, c-format msgid " -U, --username=NAME cluster superuser (default \"%s\")\n" msgstr " -U, --username=ì´ë¦„ í´ëŸ¬ìŠ¤í„° 슈í¼ìœ ì € (기본값 \"%s\")\n" -#: option.c:307 +#: option.c:304 #, c-format msgid " -v, --verbose enable verbose internal logging\n" msgstr " -v, --verbose 작업 ë‚´ì—­ì„ ìžì„¸ížˆ 남김\n" -#: option.c:308 +#: option.c:305 #, c-format msgid "" " -V, --version display version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: option.c:309 +#: option.c:306 #, c-format msgid "" " --clone clone instead of copying files to new " @@ -1280,6 +1539,24 @@ msgid "" msgstr "" " --clone 새 í´ëŸ¬ìŠ¤í„° êµ¬ì¶•ì„ ë³µì‚¬ 대신 í´ë¡  사용\n" +#: option.c:307 +#, c-format +msgid " --copy copy files to new cluster (default)\n" +msgstr " --copy 새 í´ëŸ¬ìŠ¤í„°ë¡œ íŒŒì¼ ë³µì‚¬ (기본값)\n" + +#: option.c:308 +#, c-format +msgid "" +" --copy-file-range copy files to new cluster with " +"copy_file_range\n" +msgstr " --copy-file-range copy_file_range ê¸°ëŠ¥ì„ ì´ìš©í•´ì„œ 복사\n" + +#: option.c:309 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr "" +" --sync-method=METHOD 파ì¼ì„ 디스í¬ì— ë™ê¸°í™” 하는 방법 지정\n" + #: option.c:310 #, c-format msgid " -?, --help show this help, then exit\n" @@ -1330,7 +1607,7 @@ msgstr "" "사용예:\n" " pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B " "newCluster/bin\n" -"or\n" +"ë˜ëŠ”\n" #: option.c:327 #, c-format @@ -1380,248 +1657,284 @@ msgstr "%s 홈페ì´ì§€: <%s>\n" #, c-format msgid "" "You must identify the directory where the %s.\n" -"Please use the %s command-line option or the %s environment variable.\n" +"Please use the %s command-line option or the %s environment variable." msgstr "" "%s ìœ„ì¹˜ì˜ ë””ë ‰í„°ë¦¬ë¥¼ 알고 있어야 함.\n" -"%s 명령행 옵션ì´ë‚˜, %s 환경 변수를 사용하세요.\n" +"%s 명령행 옵션ì´ë‚˜, %s 환경 변수를 사용하세요." -#: option.c:432 +#: option.c:433 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "ì›ë³¸ í´ëŸ¬ìŠ¤í„°ìš© 실 ë°ì´í„° 디렉터리를 찾는 중" -#: option.c:434 +#: option.c:435 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "ëŒ€ìƒ í´ëŸ¬ìŠ¤í„°ìš© 실 ë°ì´í„° 디렉터리를 찾는 중" -#: option.c:446 +#: option.c:448 +#, c-format +msgid "could not get data directory using %s: %m" +msgstr "%s 지정한 ë°ì´í„° 디렉터리를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %m" + +#: option.c:452 #, c-format -msgid "could not get data directory using %s: %s\n" -msgstr "%s 지정한 ë°ì´í„° 디렉터리를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s\n" +msgid "could not get data directory using %s: %s" +msgstr "%s 지정한 ë°ì´í„° 디렉터리를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" -#: option.c:505 +#: option.c:500 #, c-format -msgid "could not read line %d from file \"%s\": %s\n" -msgstr "%d 번째 ì¤„ì„ \"%s\" 파ì¼ì—서 ì½ì„ 수 ì—†ìŒ: %s\n" +msgid "could not read line %d from file \"%s\": %m" +msgstr "%d 번째 ì¤„ì„ \"%s\" 파ì¼ì—서 ì½ì„ 수 ì—†ìŒ: %m" -#: option.c:522 +#: option.c:517 #, c-format -msgid "user-supplied old port number %hu corrected to %hu\n" -msgstr "지정한 %hu 옛 í¬íЏ 번호를 %hu 번호로 바꿈\n" +msgid "user-supplied old port number %hu corrected to %hu" +msgstr "지정한 %hu 옛 í¬íЏ 번호를 %hu 번호로 바꿈" -#: parallel.c:127 parallel.c:238 +#: parallel.c:127 parallel.c:235 #, c-format -msgid "could not create worker process: %s\n" -msgstr "작업용 프로세스를 만들 수 ì—†ìŒ: %s\n" +msgid "could not create worker process: %m" +msgstr "작업용 프로세스를 만들 수 ì—†ìŒ: %m" -#: parallel.c:146 parallel.c:259 +#: parallel.c:143 parallel.c:253 #, c-format -msgid "could not create worker thread: %s\n" -msgstr "작업용 쓰레드를 만들 수 ì—†ìŒ: %s\n" +msgid "could not create worker thread: %m" +msgstr "작업용 쓰레드를 만들 수 ì—†ìŒ: %m" -#: parallel.c:300 +#: parallel.c:294 #, c-format -msgid "waitpid() failed: %s\n" -msgstr "waitpid() 실패: %s\n" +msgid "%s() failed: %m" +msgstr "%s() 실패: %m" -#: parallel.c:304 +#: parallel.c:298 #, c-format -msgid "child process exited abnormally: status %d\n" -msgstr "하위 작업ìžê°€ ë¹„ì •ìƒ ì¢…ë£Œë¨: ìƒíƒœê°’ %d\n" +msgid "child process exited abnormally: status %d" +msgstr "하위 작업ìžê°€ ë¹„ì •ìƒ ì¢…ë£Œë¨: ìƒíƒœê°’ %d" -#: parallel.c:319 +#: parallel.c:313 #, c-format -msgid "child worker exited abnormally: %s\n" -msgstr "하위 작업ìžê°€ ë¹„ì •ìƒ ì¢…ë£Œë¨: %s\n" +msgid "child worker exited abnormally: %m" +msgstr "하위 작업ìžê°€ ë¹„ì •ìƒ ì¢…ë£Œë¨: %m" -#: pg_upgrade.c:108 +#: pg_upgrade.c:115 #, c-format -msgid "could not read permissions of directory \"%s\": %s\n" -msgstr "\"%s\" 디렉터리 ì½ê¸° 권한 ì—†ìŒ: %s\n" +msgid "could not read permissions of directory \"%s\": %m" +msgstr "\"%s\" 디렉터리 ì ‘ê·¼ê¶Œí•œì„ ì½ì„ 수 ì—†ìŒ: %m" -#: pg_upgrade.c:123 +#: pg_upgrade.c:147 #, c-format msgid "" "\n" "Performing Upgrade\n" -"------------------\n" +"------------------" msgstr "" "\n" "업그레ì´ë“œ ì§„í–‰ 중\n" -"------------------\n" +"------------------" -#: pg_upgrade.c:166 +#: pg_upgrade.c:192 #, c-format msgid "Setting next OID for new cluster" msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© ë‹¤ìŒ OID 설정 중" -#: pg_upgrade.c:173 +#: pg_upgrade.c:216 #, c-format msgid "Sync data directory to disk" msgstr "ë°ì´í„° 디렉터리 fsync 작업 중" -#: pg_upgrade.c:185 +#: pg_upgrade.c:230 #, c-format msgid "" "\n" "Upgrade Complete\n" -"----------------\n" +"----------------" msgstr "" "\n" -"업그레ì´ë“œ 완료\n" -"---------------\n" +"업그레ì´ë“œ 마침\n" +"---------------" + +#: pg_upgrade.c:263 pg_upgrade.c:276 pg_upgrade.c:283 pg_upgrade.c:290 +#: pg_upgrade.c:308 pg_upgrade.c:319 +#, c-format +msgid "directory path for new cluster is too long" +msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© 디렉터리 ì´ë¦„ì´ ë„ˆë¬´ ê¹€" + +#: pg_upgrade.c:297 pg_upgrade.c:299 pg_upgrade.c:301 pg_upgrade.c:303 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m" -#: pg_upgrade.c:220 +#: pg_upgrade.c:352 #, c-format -msgid "%s: could not find own program executable\n" -msgstr "%s: 실행할 í”„ë¡œê·¸ëž¨ì„ ì°¾ì„ ìˆ˜ 없습니다.\n" +msgid "%s: could not find own program executable" +msgstr "%s: 실행할 í”„ë¡œê·¸ëž¨ì„ ì°¾ì„ ìˆ˜ 없습니다." -#: pg_upgrade.c:246 +#: pg_upgrade.c:378 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" -"Please shutdown that postmaster and try again.\n" +"Please shutdown that postmaster and try again." msgstr "" "옛 서버가 현재 ìš´ì˜ ë˜ê³  있습니다.\n" -"먼저 서버를 중지하고 진행하세요.\n" +"먼저 서버를 중지하고 진행하세요." -#: pg_upgrade.c:259 +#: pg_upgrade.c:391 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" -"Please shutdown that postmaster and try again.\n" +"Please shutdown that postmaster and try again." msgstr "" "새 서버가 현재 ìš´ì˜ ë˜ê³  있습니다.\n" -"먼저 서버를 중지하고 진행하세요.\n" +"먼저 서버를 중지하고 진행하세요." -#: pg_upgrade.c:273 +#: pg_upgrade.c:413 +#, c-format +msgid "Setting locale and encoding for new cluster" +msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© 로케ì¼ê³¼ ì¸ì½”딩 설정 중" + +#: pg_upgrade.c:489 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "새 í´ëŸ¬ìŠ¤í„°ì˜ ëª¨ë“  ë¡œìš°ì— ëŒ€í•´ì„œ 통계 ì •ë³´ 수집 중" -#: pg_upgrade.c:286 +#: pg_upgrade.c:502 #, c-format msgid "Freezing all rows in the new cluster" msgstr "새 í´ëŸ¬ìŠ¤í„°ì˜ ëª¨ë“  ë¡œìš°ì— ëŒ€í•´ì„œ ì˜êµ¬ 격리(freeze) 중" -#: pg_upgrade.c:306 +#: pg_upgrade.c:522 #, c-format msgid "Restoring global objects in the new cluster" msgstr "새 í´ëŸ¬ìŠ¤í„°ì— ì „ì—­ ê°ì²´ë¥¼ ë³µì› ì¤‘" -#: pg_upgrade.c:321 +#: pg_upgrade.c:538 #, c-format -msgid "Restoring database schemas in the new cluster\n" -msgstr "새 í´ëŸ¬ìŠ¤í„°ì— ë°ì´í„°ë² ì´ìФ 스키마 ë³µì› ì¤‘\n" +msgid "Restoring database schemas in the new cluster" +msgstr "새 í´ëŸ¬ìŠ¤í„°ì— ë°ì´í„°ë² ì´ìФ 스키마 ë³µì› ì¤‘" -#: pg_upgrade.c:425 +#: pg_upgrade.c:662 #, c-format msgid "Deleting files from new %s" msgstr "새 %sì—서 íŒŒì¼ ì§€ìš°ëŠ” 중" -#: pg_upgrade.c:429 +#: pg_upgrade.c:666 #, c-format -msgid "could not delete directory \"%s\"\n" -msgstr "\"%s\" 디렉터리를 ì‚­ì œ í•  수 ì—†ìŒ\n" +msgid "could not delete directory \"%s\"" +msgstr "\"%s\" 디렉터리를 ì‚­ì œ í•  수 ì—†ìŒ" -#: pg_upgrade.c:448 +#: pg_upgrade.c:685 #, c-format msgid "Copying old %s to new server" msgstr "옛 %s ê°ì²´ë¥¼ 새 서버로 복사 중" -#: pg_upgrade.c:475 +#: pg_upgrade.c:711 +#, c-format +msgid "Setting oldest XID for new cluster" +msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© ì œì¼ ì˜¤ëž˜ëœ XID 설정 중" + +#: pg_upgrade.c:719 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© ë‹¤ìŒ íŠ¸ëžœìž­ì…˜ ID와 epoch ê°’ 설정 중" -#: pg_upgrade.c:505 +#: pg_upgrade.c:749 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© ë‹¤ìŒ ë©€í‹° 트랜잭션 ID와 위치 ê°’ 설정 중" -#: pg_upgrade.c:529 +#: pg_upgrade.c:773 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "새 í´ëŸ¬ìŠ¤í„°ìš© ì œì¼ ì˜¤ëž˜ëœ ë©€í‹° 트랜잭션 ID 설정 중" -#: pg_upgrade.c:549 +#: pg_upgrade.c:793 #, c-format msgid "Resetting WAL archives" msgstr "WAL ì•„ì¹´ì´ë¸Œ 재설정 중" -#: pg_upgrade.c:592 +#: pg_upgrade.c:836 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "새 í´ëŸ¬ìŠ¤í„°ì—서 frozenxid, minmxid ê°’ 설정 중" -#: pg_upgrade.c:594 +#: pg_upgrade.c:838 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "새 í´ëŸ¬ìŠ¤í„°ì—서 minmxid ê°’ 설정 중" -#: relfilenode.c:35 +#: pg_upgrade.c:929 #, c-format -msgid "Cloning user relation files\n" -msgstr "ì‚¬ìš©ìž ë¦´ë ˆì´ì…˜ íŒŒì¼ í´ë¡  중\n" +msgid "Restoring logical replication slots in the new cluster" +msgstr "새 í´ëŸ¬ìŠ¤í„°ì— ë…¼ë¦¬ 복제 ìŠ¬ë¡¯ì„ ë³µì› ì¤‘" -#: relfilenode.c:38 +#: relfilenumber.c:35 #, c-format -msgid "Copying user relation files\n" -msgstr "ì‚¬ìš©ìž ë¦´ë ˆì´ì…˜ íŒŒì¼ ë³µì‚¬ 중\n" +msgid "Cloning user relation files" +msgstr "ì‚¬ìš©ìž ë¦´ë ˆì´ì…˜ íŒŒì¼ í´ë¡  중" -#: relfilenode.c:41 +#: relfilenumber.c:38 #, c-format -msgid "Linking user relation files\n" -msgstr "ì‚¬ìš©ìž ë¦´ë ˆì´ì…˜ íŒŒì¼ ë§í¬ 중\n" +msgid "Copying user relation files" +msgstr "ì‚¬ìš©ìž ë¦´ë ˆì´ì…˜ íŒŒì¼ ë³µì‚¬ 중" -#: relfilenode.c:115 +#: relfilenumber.c:41 #, c-format -msgid "old database \"%s\" not found in the new cluster\n" -msgstr "\"%s\" ì´ë¦„ì˜ ì˜› ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 새 í´ëŸ¬ìŠ¤í„°ì—서 ì°¾ì„ ìˆ˜ ì—†ìŒ\n" +msgid "Copying user relation files with copy_file_range" +msgstr "ì‚¬ìš©ìž ë¦´ë ˆì´ì…˜ 파ì¼ì„ copy_file_range 기능으로 복사 중" -#: relfilenode.c:234 +#: relfilenumber.c:44 +#, c-format +msgid "Linking user relation files" +msgstr "ì‚¬ìš©ìž ë¦´ë ˆì´ì…˜ íŒŒì¼ ë§í¬ 중" + +#: relfilenumber.c:118 +#, c-format +msgid "old database \"%s\" not found in the new cluster" +msgstr "\"%s\" ì´ë¦„ì˜ ì˜› ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 새 í´ëŸ¬ìŠ¤í„°ì—서 ì°¾ì„ ìˆ˜ ì—†ìŒ" + +#: relfilenumber.c:221 #, c-format msgid "" -"error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "\"%s.%s\" (\"%s\" / \"%s\") 파ì¼ì´ 있는지 í™•ì¸ ë„중 오류 ë°œìƒ: %s\n" +"error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "\"%s.%s\" (\"%s\" / \"%s\") 파ì¼ì´ 있는지 í™•ì¸ ë„중 오류 ë°œìƒ: %m" -#: relfilenode.c:252 +#: relfilenumber.c:238 #, c-format -msgid "rewriting \"%s\" to \"%s\"\n" -msgstr "\"%s\" ê°ì²´ë¥¼ \"%s\" ê°ì²´ë¡œ 다시 쓰는 중\n" +msgid "rewriting \"%s\" to \"%s\"" +msgstr "\"%s\" ê°ì²´ë¥¼ \"%s\" ê°ì²´ë¡œ 다시 쓰는 중" -#: relfilenode.c:260 +#: relfilenumber.c:246 #, c-format -msgid "cloning \"%s\" to \"%s\"\n" -msgstr "\"%s\" ê°ì²´ë¥¼ \"%s\" ê°ì²´ë¡œ í´ë¡  중\n" +msgid "cloning \"%s\" to \"%s\"" +msgstr "\"%s\" ê°ì²´ë¥¼ \"%s\" ê°ì²´ë¡œ í´ë¡  중" -#: relfilenode.c:265 +#: relfilenumber.c:251 #, c-format -msgid "copying \"%s\" to \"%s\"\n" -msgstr "\"%s\" ê°ì²´ë¥¼ \"%s\" ê°ì²´ë¡œ 복사 중\n" +msgid "copying \"%s\" to \"%s\"" +msgstr "\"%s\" ê°ì²´ë¥¼ \"%s\" ê°ì²´ë¡œ 복사 중" -#: relfilenode.c:270 +#: relfilenumber.c:256 #, c-format -msgid "linking \"%s\" to \"%s\"\n" -msgstr "\"%s\" ê°ì²´ë¥¼ \"%s\" ê°ì²´ë¡œ ë§í¬ 중\n" +msgid "copying \"%s\" to \"%s\" with copy_file_range" +msgstr "\"%s\" ê°ì²´ë¥¼ \"%s\" ê°ì²´ë¡œ copy_file_range 기능으로 복사 중" -#: server.c:33 +#: relfilenumber.c:261 #, c-format -msgid "connection to database failed: %s" -msgstr "ë°ì´í„°ë² ì´ìФ ì—°ê²° 실패: %s" +msgid "linking \"%s\" to \"%s\"" +msgstr "\"%s\" ê°ì²´ë¥¼ \"%s\" ê°ì²´ë¡œ ë§í¬ 중" -#: server.c:39 server.c:141 util.c:135 util.c:165 +#: server.c:39 server.c:143 util.c:248 util.c:278 #, c-format msgid "Failure, exiting\n" msgstr "실패, 종료함\n" -#: server.c:131 +#: server.c:133 #, c-format -msgid "executing: %s\n" -msgstr "실행중: %s\n" +msgid "executing: %s" +msgstr "실행중: %s" -#: server.c:137 +#: server.c:139 #, c-format msgid "" "SQL command failed\n" @@ -1632,218 +1945,128 @@ msgstr "" "%s\n" "%s" -#: server.c:167 +#: server.c:169 #, c-format -msgid "could not open version file \"%s\": %m\n" -msgstr "\"%s\" 버전 íŒŒì¼ ì—´ê¸° 실패: %m\n" +msgid "could not open version file \"%s\": %m" +msgstr "\"%s\" 버전 íŒŒì¼ ì—´ê¸° 실패: %m" -#: server.c:171 +#: server.c:173 #, c-format -msgid "could not parse version file \"%s\"\n" -msgstr "\"%s\" 버전 íŒŒì¼ êµ¬ë¬¸ ë¶„ì„ ì‹¤íŒ¨\n" +msgid "could not parse version file \"%s\"" +msgstr "\"%s\" 버전 íŒŒì¼ êµ¬ë¬¸ ë¶„ì„ ì‹¤íŒ¨" -#: server.c:297 +#: server.c:310 #, c-format msgid "" "\n" -"connection to database failed: %s" +"%s" msgstr "" "\n" -"ë°ì´í„°ë² ì´ìФ ì—°ê²° 실패: %s" +"%s" -#: server.c:302 +#: server.c:314 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" -"%s\n" +"%s" msgstr "" "ë‹¤ìŒ ëª…ë ¹ìœ¼ë¡œ ì‹¤í–‰ëœ ì›ë³¸ 서버로 ì ‘ì†í•  수 ì—†ìŒ:\n" -"%s\n" +"%s" -#: server.c:306 +#: server.c:318 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" -"%s\n" +"%s" msgstr "" "ë‹¤ìŒ ëª…ë ¹ìœ¼ë¡œ ì‹¤í–‰ëœ ëŒ€ìƒ ì„œë²„ë¡œ ì ‘ì†í•  수 ì—†ìŒ:\n" -"%s\n" +"%s" -#: server.c:320 +#: server.c:332 #, c-format -msgid "pg_ctl failed to start the source server, or connection failed\n" -msgstr "ì›ë³¸ 서버를 실행하는 pg_ctl 작업 실패, ë˜ëŠ” ì—°ê²° 실패\n" +msgid "pg_ctl failed to start the source server, or connection failed" +msgstr "ì›ë³¸ 서버를 실행하는 pg_ctl 작업 실패, ë˜ëŠ” ì—°ê²° 실패" -#: server.c:322 +#: server.c:334 #, c-format -msgid "pg_ctl failed to start the target server, or connection failed\n" -msgstr "ëŒ€ìƒ ì„œë²„ë¥¼ 실행하는 pg_ctl 작업 실패, ë˜ëŠ” ì—°ê²° 실패\n" +msgid "pg_ctl failed to start the target server, or connection failed" +msgstr "ëŒ€ìƒ ì„œë²„ë¥¼ 실행하는 pg_ctl 작업 실패, ë˜ëŠ” ì—°ê²° 실패" -#: server.c:367 +#: server.c:379 #, c-format -msgid "out of memory\n" -msgstr "메모리 부족\n" +msgid "out of memory" +msgstr "메모리 부족" -#: server.c:380 +#: server.c:392 #, c-format -msgid "libpq environment variable %s has a non-local server value: %s\n" -msgstr "%s libpq 환경 변수가 로컬 서버 ê°’ì´ ì•„ë‹˜: %s\n" +msgid "libpq environment variable %s has a non-local server value: %s" +msgstr "%s libpq 환경 변수가 로컬 서버 ê°’ì´ ì•„ë‹˜: %s" #: tablespace.c:28 #, c-format msgid "" "Cannot upgrade to/from the same system catalog version when\n" -"using tablespaces.\n" +"using tablespaces." msgstr "" "ì‚¬ìš©ìž ì •ì˜ í…Œì´ë¸”스페ì´ìŠ¤ë¥¼ 사용하는 경우 ê°™ì€ ì‹œìŠ¤í…œ 카탈로그 버전으로\n" -"업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•  수 없습니다.\n" +"업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•  수 없습니다." -#: tablespace.c:86 +#: tablespace.c:83 #, c-format -msgid "tablespace directory \"%s\" does not exist\n" -msgstr "\"%s\" ì´ë¦„ì˜ í…Œì´ë¸”스페ì´ìФ 디렉터리가 ì—†ìŒ\n" +msgid "tablespace directory \"%s\" does not exist" +msgstr "\"%s\" ì´ë¦„ì˜ í…Œì´ë¸”스페ì´ìФ 디렉터리가 ì—†ìŒ" -#: tablespace.c:90 +#: tablespace.c:87 #, c-format -msgid "could not stat tablespace directory \"%s\": %s\n" -msgstr "\"%s\" í…Œì´ë¸”스페ì´ìФ ë””ë ‰í„°ë¦¬ì˜ ìƒíƒœ 정보를 구할 수 ì—†ìŒ: %s\n" +msgid "could not stat tablespace directory \"%s\": %m" +msgstr "\"%s\" í…Œì´ë¸”스페ì´ìФ ë””ë ‰í„°ë¦¬ì˜ ìƒíƒœ 정보를 구할 수 ì—†ìŒ: %m" -#: tablespace.c:95 +#: tablespace.c:92 #, c-format -msgid "tablespace path \"%s\" is not a directory\n" -msgstr "\"%s\" í…Œì´ë¸”스페ì´ìФ 경로는 디렉터리가 아님\n" +msgid "tablespace path \"%s\" is not a directory" +msgstr "\"%s\" í…Œì´ë¸”스페ì´ìФ 경로는 디렉터리가 아님" -#: util.c:49 -#, c-format -msgid " " -msgstr " " - -#: util.c:82 +#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172 #, c-format msgid "%-*s" msgstr "%-*s" -#: util.c:174 +#: util.c:107 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 액세스할 수 없습니다: %m" + +#: util.c:287 #, c-format msgid "ok" msgstr "ok" -#: version.c:29 +#: version.c:44 #, c-format -msgid "Checking for large objects" -msgstr "대형 ê°ì²´ í™•ì¸ ì¤‘" +msgid "Checking for hash indexes" +msgstr "해쉬 ì¸ë±ìФ í™•ì¸ ì¤‘" -#: version.c:77 version.c:384 +#: version.c:121 #, c-format msgid "warning" msgstr "경고" -#: version.c:79 -#, c-format -msgid "" -"\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table. After upgrading, you will be\n" -"given a command to populate the pg_largeobject_metadata table with\n" -"default permissions.\n" -"\n" -msgstr "" -"\n" -"ì´ ë°ì´í„°ë² ì´ìŠ¤ëŠ” 대형 ê°ì²´ë¥¼ 사용하고 있습니다. 새 ë°ì´í„°ë² ì´ìФì—서는\n" -"ì´ë“¤ì˜ ì ‘ê·¼ 권한 제어를 위해 추가ì ì¸ í…Œì´ë¸”ì„ ì‚¬ìš©í•©ë‹ˆë‹¤. 업그레ì´ë“œ 후\n" -"ì´ ê°ì²´ë“¤ì˜ ì ‘ê·¼ ê¶Œí•œì€ pg_largeobject_metadata í…Œì´ë¸”ì— ê¸°ë³¸ê°’ìœ¼ë¡œ 지정ë©ë‹ˆ" -"다.\n" -"\n" - -#: version.c:85 -#, c-format -msgid "" -"\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table, so default permissions must be\n" -"defined for all large objects. The file\n" -" %s\n" -"when executed by psql by the database superuser will set the default\n" -"permissions.\n" -"\n" -msgstr "" -"\n" -"ì´ ë°ì´í„°ë² ì´ìŠ¤ëŠ” 대형 ê°ì²´ë¥¼ 사용하고 있습니다. 새 ë°ì´í„°ë² ì´ìФì—서는\n" -"ì´ë“¤ì˜ ì ‘ê·¼ 권한 제어를 위해 추가ì ì¸ í…Œì´ë¸”ì„ ì‚¬ìš©í•©ë‹ˆë‹¤. 그래서\n" -"ì´ë“¤ì˜ ì ‘ê·¼ ê¶Œí•œì„ ê¸°ë³¸ê°’ìœ¼ë¡œ 설정하려면,\n" -" %s\n" -"파ì¼ì„ 새 서버가 실행 ë˜ì—ˆì„ 때 슈í¼ìœ ì € 권한으로 psql 명령으로\n" -"실행 하세요.\n" -"\n" - -#: version.c:239 -#, c-format -msgid "Checking for incompatible \"line\" data type" -msgstr "\"line\" ìžë£Œí˜• 호환성 í™•ì¸ ì¤‘" - -#: version.c:246 -#, c-format -msgid "" -"Your installation contains the \"line\" data type in user tables. This\n" -"data type changed its internal and input/output format between your old\n" -"and new clusters so this cluster cannot currently be upgraded. You can\n" -"remove the problem tables and restart the upgrade. A list of the problem\n" -"columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"해당 ë°ì´í„°ë² ì´ìФì—서 \"line\" ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ëŠ” ì¹¼ëŸ¼ì´ ìžˆìŠµë‹ˆë‹¤.\n" -"ì´ ìžë£Œí˜•ì˜ ìž…ì¶œë ¥ ë°©ì‹ì´ 옛 버전과 새 버전ì—서 서로 호환하지 않습니다.\n" -"먼저 ì´ ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ëŠ” í…Œì´ë¸”ì„ ì‚­ì œ 후 업그레ì´ë“œ ìž‘ì—…ì„ í•˜ê³ ,\n" -"수ë™ìœ¼ë¡œ ë³µì› ìž‘ì—…ì„ í•´ì•¼ 합니다. 해당 파ì¼ë“¤ì€ 다ìŒê³¼ 같습니다:\n" -" %s\n" -"\n" - -#: version.c:276 -#, c-format -msgid "Checking for invalid \"unknown\" user columns" -msgstr "ìž˜ëª»ëœ \"unknown\" ì‚¬ìš©ìž ì¹¼ëŸ¼ì„ í™•ì¸ ì¤‘" - -#: version.c:283 -#, c-format -msgid "" -"Your installation contains the \"unknown\" data type in user tables. This\n" -"data type is no longer allowed in tables, so this cluster cannot currently\n" -"be upgraded. You can remove the problem tables and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"해당 ë°ì´í„°ë² ì´ìФì—서 ì‚¬ìš©ìž í…Œì´ë¸”ì—서 \"unknown\" ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³  있습니" -"다.\n" -"ì´ ìžë£Œí˜•ì€ ë” ì´ìƒ 사용할 수 없습니다. ì´ ë¬¸ì œë¥¼ 옛 버전ì—서 먼저 정리하고\n" -"업그레ì´ë“œ ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”. 해당 파ì¼ì€ 다ìŒê³¼ 같습니다:\n" -" %s\n" -"\n" - -#: version.c:306 -#, c-format -msgid "Checking for hash indexes" -msgstr "해쉬 ì¸ë±ìФ í™•ì¸ ì¤‘" - -#: version.c:386 +#: version.c:123 #, c-format msgid "" "\n" "Your installation contains hash indexes. These indexes have different\n" "internal formats between your old and new clusters, so they must be\n" "reindexed with the REINDEX command. After upgrading, you will be given\n" -"REINDEX instructions.\n" -"\n" +"REINDEX instructions." msgstr "" "\n" "해당 ë°ì´í„°ë² ì´ìФì—서 해쉬 ì¸ë±ìŠ¤ë¥¼ 사용하고 있습니다. 해쉬 ì¸ë±ìФ ìžë£Œêµ¬ì¡°" "ê°€\n" "새 버전ì—서 호환ë˜ì§€ 않습니다. 업그레ì´ë“œ í›„ì— í•´ë‹¹ ì¸ë±ìŠ¤ë“¤ì„\n" -"REINDEX 명령으로 다시 만들어야 합니다.\n" -"\n" +"REINDEX 명령으로 다시 만들어야 합니다." -#: version.c:392 +#: version.c:129 #, c-format msgid "" "\n" @@ -1852,8 +2075,7 @@ msgid "" "reindexed with the REINDEX command. The file\n" " %s\n" "when executed by psql by the database superuser will recreate all invalid\n" -"indexes; until then, none of these indexes will be used.\n" -"\n" +"indexes; until then, none of these indexes will be used." msgstr "" "\n" "해당 ë°ì´í„°ë² ì´ìФì—서 해쉬 ì¸ë±ìŠ¤ë¥¼ 사용하고 있습니다. 해쉬 ì¸ë±ìФ ìžë£Œêµ¬ì¡°" @@ -1861,29 +2083,35 @@ msgstr "" "새 버전ì—서 호환ë˜ì§€ 않습니다. 업그레ì´ë“œ 후 ë‹¤ìŒ íŒŒì¼ì„\n" "슈í¼ìœ ì € 권한으로 실행한 psqlì—서 실행해서, REINDEX ìž‘ì—…ì„ ì§„í–‰í•˜ì„¸ìš”:\n" " %s\n" -"ì´ ìž‘ì—…ì´ ìžˆê¸° 전까지는 해당 ì¸ë±ìŠ¤ëŠ” invalid ìƒíƒœë¡œ 사용할 수 없게 ë©ë‹ˆë‹¤.\n" -"\n" +"ì´ ìž‘ì—…ì´ ìžˆê¸° 전까지는 해당 ì¸ë±ìŠ¤ëŠ” invalid ìƒíƒœë¡œ 사용할 수 없게 ë©ë‹ˆë‹¤." -#: version.c:418 +#: version.c:153 #, c-format -msgid "Checking for invalid \"sql_identifier\" user columns" -msgstr "ìž˜ëª»ëœ \"sql_identifier\" ì‚¬ìš©ìž ì¹¼ëŸ¼ì„ í™•ì¸ ì¤‘" +msgid "Checking for extension updates" +msgstr "확장 모듈 ì—…ë°ì´íЏ í™•ì¸ ì¤‘" + +#: version.c:200 +#, c-format +msgid "notice" +msgstr "알림" -#: version.c:426 +#: version.c:201 #, c-format msgid "" -"Your installation contains the \"sql_identifier\" data type in user tables\n" -"and/or indexes. The on-disk format for this data type has changed, so this\n" -"cluster cannot currently be upgraded. You can remove the problem tables or\n" -"change the data type to \"name\" and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" "\n" -msgstr "" -"ì‚¬ìš©ìž í…Œì´ë¸” ë˜ëŠ”/ì´ë‚˜ ì¸ë±ìŠ¤ì— \"sql_identifier\" ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ê³ \n" -"있습니다. ì´ ìžë£Œí˜•ì˜ ì €ìž¥ ì–‘ì‹ì´ 바뀌었기ì—, ì´ í´ëŸ¬ìŠ¤í„°ëŠ” 업그레ì´ë“œ\n" -"ë˜ì–´ì•¼í•©ë‹ˆë‹¤. 해당 í…Œì´ë¸”ì„ ì§€ìš°ê±°ë‚˜, 해당 ì¹¼ëŸ¼ì˜ ìžë£Œí˜•ì„ \"name\" 형으로\n" -"바꾸고, 서버를 재실행 한 ë’¤ 업그레ì´ë“œ 하십시오.\n" -"ë¬¸ì œì˜ ì¹¼ëŸ¼ì´ ìžˆëŠ” 파ì¼ë“¤ì€ 다ìŒê³¼ 같습니다:\n" +"Your installation contains extensions that should be updated\n" +"with the ALTER EXTENSION command. The file\n" " %s\n" +"when executed by psql by the database superuser will update\n" +"these extensions." +msgstr "" "\n" +"해당 서버ì—는 ì—…ë°ì´íЏ 해야하는 확장 ëª¨ë“ˆì´ ìžˆìŠµë‹ˆë‹¤.\n" +"ì´ ìž‘ì—…ì€ ALTER EXTENSION 명령으로 í•  수 있으며, 작업 명령ì€\n" +" %s\n" +"íŒŒì¼ ì•ˆì— ìžˆìŠµë‹ˆë‹¤. ë°ì´í„°ë² ì´ìФ 슈í¼ìœ ì €ë¡œ psql로 ì ‘ì†í•´ì„œ\n" +"ì´ íŒŒì¼ ì•ˆì— ìžˆëŠ” ëª…ë ¹ì„ ìˆ˜í–‰í•˜ë©´ 확장 ëª¨ë“ˆì„ ì—…ë°ì´íЏ í•  수 있습니다." + +#, c-format +#~ msgid "Checking for incompatible \"jsonb\" data type" +#~ msgstr "\"jsonb\" ìžë£Œí˜• 호환성 í™•ì¸ ì¤‘" diff --git a/src/bin/pg_upgrade/po/meson.build b/src/bin/pg_upgrade/po/meson.build index 8531c3b31ef56..30ec8337ebc7f 100644 --- a/src/bin/pg_upgrade/po/meson.build +++ b/src/bin/pg_upgrade/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_upgrade-' + pg_version_major.to_string())] diff --git a/src/bin/pg_upgrade/po/ru.po b/src/bin/pg_upgrade/po/ru.po index e26ade17a167f..353f7bef008de 100644 --- a/src/bin/pg_upgrade/po/ru.po +++ b/src/bin/pg_upgrade/po/ru.po @@ -1,306 +1,532 @@ # Russian message translation file for pg_upgrade # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2017, 2018, 2019, 2020, 2021, 2022. +# Alexander Lakhin , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # Maxim Yablokov , 2021. msgid "" msgstr "" "Project-Id-Version: pg_upgrade (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-08-14 06:29+0300\n" -"PO-Revision-Date: 2022-01-19 16:26+0300\n" +"POT-Creation-Date: 2025-05-03 16:06+0300\n" +"PO-Revision-Date: 2024-11-02 08:31+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: check.c:70 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "нехватка памÑти\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "не удалоÑÑŒ получить код выхода от подпроцеÑÑа (код ошибки: %lu)" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "выÑÑнить Ñффективный идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (%ld) не удалоÑÑŒ: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "пользователь не ÑущеÑтвует" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "раÑпознать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалоÑÑŒ (код ошибки: %lu)" + +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "" +"аргумент команды оболочки Ñодержит Ñимвол новой Ñтроки или перевода каретки: " +"\"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "" +"Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ñодержит Ñимвол новой Ñтроки или перевода каретки: \"%s\"\n" + +#: check.c:111 +msgid "Checking for system-defined composite types in user tables" +msgstr "Проверка ÑиÑтемных ÑоÑтавных типов в пользовательÑких таблицах" + +#: check.c:118 +msgid "" +"Your installation contains system-defined composite types in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют ÑиÑтемные ÑоÑтавные\n" +"типы. OID таких типов могут различатьÑÑ Ð² разных верÑиÑÑ… PostgreSQL, поÑтому " +"в\n" +"наÑтоÑщем ÑоÑтоÑнии обновить клаÑтер невозможно. Ð’Ñ‹ можете удалить " +"проблемные\n" +"Ñтолбцы и перезапуÑтить обновление.\n" + +#: check.c:132 +msgid "Checking for incompatible \"line\" data type" +msgstr "Проверка неÑовмеÑтимого типа данных \"line\"" + +#: check.c:137 +msgid "" +"Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных " +"\"line\".\n" +"Ð’ Ñтаром клаÑтере внутренний формат и формат ввода/вывода Ñтого типа " +"отличаетÑÑ\n" +"от нового, поÑтому в наÑтоÑщем ÑоÑтоÑнии обновить клаÑтер невозможно. Ð’Ñ‹ " +"можете\n" +"удалить проблемные Ñтолбцы и перезапуÑтить обновление.\n" + +#: check.c:154 +msgid "Checking for reg* data types in user tables" +msgstr "Проверка типов данных reg* в пользовательÑких таблицах" + +#: check.c:181 +msgid "" +"Your installation contains one of the reg* data types in user tables.\n" +"These data types reference system OIDs that are not preserved by\n" +"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"Ð’ вашей инÑталлÑции пользовательÑкие таблицы Ñодержат один из типов reg*.\n" +"Эти типы данных ÑÑылаютÑÑ Ð½Ð° ÑиÑтемные OID, которые не ÑохранÑÑŽÑ‚ÑÑ ÑƒÑ‚Ð¸Ð»Ð¸Ñ‚Ð¾Ð¹\n" +"pg_upgrade, так что обновление клаÑтера в текущем ÑоÑтоÑнии невозможно. Ð’Ñ‹\n" +"можете удалить проблемные Ñтолбцы и перезапуÑтить обновление.\n" + +#: check.c:193 +msgid "Checking for incompatible \"aclitem\" data type" +msgstr "Проверка неÑовмеÑтимого типа данных \"aclitem\"" + +#: check.c:198 +msgid "" +"Your installation contains the \"aclitem\" data type in user tables.\n" +"The internal format of \"aclitem\" changed in PostgreSQL version 16\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных " +"\"aclitem\".\n" +"Внутренний формат \"aclitem\" изменилÑÑ Ð² PostgreSQL верÑии 16, поÑтому " +"обновить\n" +"клаÑтер в текущем ÑоÑтоÑнии невозможно. Ð’Ñ‹ можете удалить проблемные Ñтолбцы " +"и\n" +"перезапуÑтить обновление.\n" + +#: check.c:217 +msgid "Checking for invalid \"unknown\" user columns" +msgstr "Проверка неправильных пользовательÑких Ñтолбцов типа \"unknown\"" + +#: check.c:222 +msgid "" +"Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this cluster\n" +"cannot currently be upgraded. You can drop the problem columns\n" +"and restart the upgrade.\n" +msgstr "" +"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных " +"\"unknown\".\n" +"Теперь иÑпользование Ñтого типа данных в таблицах не допуÑкаетÑÑ, поÑтому\n" +"в наÑтоÑщем ÑоÑтоÑнии обновить клаÑтер невозможно. Ð’Ñ‹ можете удалить " +"проблемные\n" +"Ñтолбцы и перезапуÑтить обновление.\n" + +#: check.c:239 +msgid "Checking for invalid \"sql_identifier\" user columns" +msgstr "" +"Проверка неправильных пользовательÑких Ñтолбцов типа \"sql_identifier\"" + +#: check.c:244 +msgid "" +"Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can drop the problem\n" +"columns and restart the upgrade.\n" +msgstr "" +"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных\n" +"\"sql_identifier\". Формат Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð°ÐºÐ¸Ñ… данных на диÑке поменÑлÑÑ,\n" +"поÑтому обновить данный клаÑтер невозможно. Ð’Ñ‹ можете удалить проблемные\n" +"Ñтолбцы и перезапуÑтить обновление.\n" + +#: check.c:255 +msgid "Checking for incompatible \"jsonb\" data type in user tables" +msgstr "" +"Проверка неÑовмеÑтимого типа данных \"jsonb\" в пользовательÑких таблицах" + +#: check.c:260 +msgid "" +"Your installation contains the \"jsonb\" data type in user tables.\n" +"The internal format of \"jsonb\" changed during 9.4 beta so this\n" +"cluster cannot currently be upgraded. You can drop the problem \n" +"columns and restart the upgrade.\n" +msgstr "" +"Ð’ вашей инÑталлÑции таблицы иÑпользуют тип данных \"jsonb\".\n" +"Внутренний формат \"jsonb\" изменилÑÑ Ð² верÑии 9.4 beta, поÑтому обновить\n" +"клаÑтер в текущем ÑоÑтоÑнии невозможно. Ð’Ñ‹ можете удалить проблемные Ñтолбцы " +"и\n" +"перезапуÑтить обновление.\n" + +#: check.c:272 +msgid "Checking for removed \"abstime\" data type in user tables" +msgstr "" +"Проверка удалённого типа данных \"abstime\" в пользовательÑких таблицах" + +#: check.c:277 +msgid "" +"Your installation contains the \"abstime\" data type in user tables.\n" +"The \"abstime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных " +"\"abstime\".\n" +"Тип \"abstime\" был удалён в PostgreSQL верÑии 12, поÑтому обновить клаÑтер " +"в\n" +"текущем ÑоÑтоÑнии невозможно. Ð’Ñ‹ можете удалить проблемные Ñтолбцы или " +"поменÑть\n" +"их тип на другой, а затем перезапуÑтить обновление.\n" + +#: check.c:285 +msgid "Checking for removed \"reltime\" data type in user tables" +msgstr "" +"Проверка удалённого типа данных \"reltime\" в пользовательÑких таблицах" + +#: check.c:290 +msgid "" +"Your installation contains the \"reltime\" data type in user tables.\n" +"The \"reltime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных " +"\"reltime\".\n" +"Тип \"reltime\" был удалён в PostgreSQL верÑии 12, поÑтому обновить клаÑтер " +"в\n" +"текущем ÑоÑтоÑнии невозможно. Ð’Ñ‹ можете удалить проблемные Ñтолбцы или " +"поменÑть\n" +"их тип на другой, а затем перезапуÑтить обновление.\n" + +#: check.c:298 +msgid "Checking for removed \"tinterval\" data type in user tables" +msgstr "" +"Проверка удалённого типа данных \"tinterval\" в пользовательÑких таблицах" + +#: check.c:303 +msgid "" +"Your installation contains the \"tinterval\" data type in user tables.\n" +"The \"tinterval\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных " +"\"tinterval\".\n" +"Тип \"tinterval\" был удалён в PostgreSQL верÑии 12, поÑтому обновить " +"клаÑтер в\n" +"текущем ÑоÑтоÑнии невозможно. Ð’Ñ‹ можете удалить проблемные Ñтолбцы или " +"поменÑть\n" +"их тип на другой, а затем перезапуÑтить обновление.\n" + +#: check.c:345 +#, c-format +msgid "Checking data type usage" +msgstr "Проверка иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð¸Ð¿Ð¾Ð² данных" + +#: check.c:480 +#, c-format +msgid "failed check: %s" +msgstr "не пройдена проверка: %s" + +#: check.c:483 +msgid "A list of the problem columns is in the file:" +msgstr "СпиÑок проблемных Ñтолбцов приведён в файле:" + +#: check.c:495 check.c:963 check.c:1136 check.c:1251 check.c:1345 check.c:1473 +#: check.c:1549 check.c:1613 check.c:1686 check.c:1865 check.c:1884 +#: check.c:1953 check.c:2005 file.c:378 file.c:415 function.c:189 option.c:493 +#: version.c:79 version.c:177 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" + +#: check.c:522 +#, c-format +msgid "Data type checks failed: %s" +msgstr "Проверки типов данных не пройдены: %s" + +#: check.c:563 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" -"------------------------------------------------\n" +"------------------------------------------------" msgstr "" "Проверка целоÑтноÑти на Ñтаром работающем Ñервере\n" -"-------------------------------------------------\n" +"-------------------------------------------------" -#: check.c:76 +#: check.c:569 #, c-format msgid "" "Performing Consistency Checks\n" -"-----------------------------\n" +"-----------------------------" msgstr "" "Проведение проверок целоÑтноÑти\n" -"-------------------------------\n" +"-------------------------------" -#: check.c:213 +#: check.c:718 #, c-format msgid "" "\n" -"*Clusters are compatible*\n" +"*Clusters are compatible*" msgstr "" "\n" -"*КлаÑтеры ÑовмеÑтимы*\n" +"*КлаÑтеры ÑовмеÑтимы*" -#: check.c:219 +#: check.c:726 #, c-format msgid "" "\n" "If pg_upgrade fails after this point, you must re-initdb the\n" -"new cluster before continuing.\n" +"new cluster before continuing." msgstr "" "\n" "ЕÑли работа pg_upgrade поÑле Ñтого прервётÑÑ, вы должны заново выполнить " "initdb\n" -"Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера, чтобы продолжить.\n" +"Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера, чтобы продолжить." -#: check.c:264 +#: check.c:767 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" "Once you start the new server, consider running:\n" -" %s/vacuumdb %s--all --analyze-in-stages\n" -"\n" +" %s/vacuumdb %s--all --analyze-in-stages" msgstr "" "СтатиÑтика оптимизатора утилитой pg_upgrade не переноÑитÑÑ.\n" "ЗапуÑтив новый Ñервер, имеет ÑмыÑл выполнить:\n" -" %s/vacuumdb %s--all --analyze-in-stages\n" -"\n" +" %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:270 +#: check.c:773 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" -" %s\n" +" %s" msgstr "" "При запуÑке Ñтого Ñкрипта будут удалены файлы данных Ñтарого клаÑтера:\n" -" %s\n" +" %s" -#: check.c:275 +#: check.c:778 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" "because user-defined tablespaces or the new cluster's data directory\n" "exist in the old cluster directory. The old cluster's contents must\n" -"be deleted manually.\n" +"be deleted manually." msgstr "" "Ðе удалоÑÑŒ Ñоздать Ñкрипт Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² данных Ñтарого клаÑтера,\n" "так как каталог Ñтарого клаÑтера Ñодержит пользовательÑкие табличные\n" "проÑтранÑтва или каталог данных нового клаÑтера.\n" -"Содержимое Ñтарого клаÑтера нужно будет удалить вручную.\n" +"Содержимое Ñтарого клаÑтера нужно будет удалить вручную." -#: check.c:287 +#: check.c:790 #, c-format msgid "Checking cluster versions" msgstr "Проверка верÑий клаÑтеров" -#: check.c:299 +#: check.c:802 #, c-format -msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n" +msgid "This utility can only upgrade from PostgreSQL version %s and later." msgstr "" -"Эта утилита может производить обновление только Ñ Ð²ÐµÑ€Ñии PostgreSQL 8.4 и " -"новее.\n" +"Эта утилита может производить обновление только Ñ Ð²ÐµÑ€Ñии PostgreSQL %s и " +"новее." -#: check.c:303 +#: check.c:807 #, c-format -msgid "This utility can only upgrade to PostgreSQL version %s.\n" -msgstr "Эта утилита может только повышать верÑию PostgreSQL до %s.\n" +msgid "This utility can only upgrade to PostgreSQL version %s." +msgstr "Эта утилита может повышать верÑию PostgreSQL только до %s." -#: check.c:312 +#: check.c:816 #, c-format msgid "" -"This utility cannot be used to downgrade to older major PostgreSQL " -"versions.\n" +"This utility cannot be used to downgrade to older major PostgreSQL versions." msgstr "" "Эта утилита не может понижать верÑию до более Ñтарой оÑновной верÑии " -"PostgreSQL.\n" +"PostgreSQL." -#: check.c:317 +#: check.c:821 #, c-format msgid "" -"Old cluster data and binary directories are from different major versions.\n" +"Old cluster data and binary directories are from different major versions." msgstr "" "Каталоги данных и иÑполнÑемых файлов Ñтарого клаÑтера отноÑÑÑ‚ÑÑ Ðº разным " -"оÑновным верÑиÑм.\n" +"оÑновным верÑиÑм." -#: check.c:320 +#: check.c:824 #, c-format msgid "" -"New cluster data and binary directories are from different major versions.\n" +"New cluster data and binary directories are from different major versions." msgstr "" "Каталоги данных и иÑполнÑемых файлов нового клаÑтера отноÑÑÑ‚ÑÑ Ðº разным " -"оÑновным верÑиÑм.\n" - -#: check.c:337 -#, c-format -msgid "" -"When checking a pre-PG 9.1 live old server, you must specify the old " -"server's port number.\n" -msgstr "" -"Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ Ñтарого работающего Ñервера верÑии до 9.1 необходимо указать " -"номер порта Ñтого Ñервера.\n" +"оÑновным верÑиÑм." -#: check.c:341 +#: check.c:839 #, c-format msgid "" -"When checking a live server, the old and new port numbers must be " -"different.\n" +"When checking a live server, the old and new port numbers must be different." msgstr "" "Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ работающего Ñервера новый номер порта должен отличатьÑÑ Ð¾Ñ‚ " -"Ñтарого.\n" - -#: check.c:356 -#, c-format -msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "" -"кодировки в базе данных \"%s\" различаютÑÑ: ÑÑ‚Ð°Ñ€Ð°Ñ - \"%s\", Ð½Ð¾Ð²Ð°Ñ - \"%s" -"\"\n" - -#: check.c:361 -#, c-format -msgid "" -"lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "" -"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ lc_collate в базе данных \"%s\" различаютÑÑ: Ñтарое - \"%s\", " -"новое - \"%s\"\n" - -#: check.c:364 -#, c-format -msgid "" -"lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "" -"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ lc_ctype в базе данных \"%s\" различаютÑÑ: Ñтарое - \"%s\", новое " -"- \"%s\"\n" +"Ñтарого." -#: check.c:437 +#: check.c:859 #, c-format -msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" +msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" msgstr "" -"ÐÐ¾Ð²Ð°Ñ Ð±Ð°Ð·Ð° данных клаÑтера \"%s\" не пуÑтаÑ: найдено отношение \"%s.%s\"\n" +"ÐÐ¾Ð²Ð°Ñ Ð±Ð°Ð·Ð° данных клаÑтера \"%s\" не пуÑтаÑ: найдено отношение \"%s.%s\"" -#: check.c:494 +#: check.c:882 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Проверка каталогов табличных проÑтранÑтв в новом клаÑтере" -#: check.c:505 +#: check.c:893 #, c-format -msgid "new cluster tablespace directory already exists: \"%s\"\n" +msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "" -"каталог табличного проÑтранÑтва в новом клаÑтере уже ÑущеÑтвует: \"%s\"\n" +"каталог табличного проÑтранÑтва в новом клаÑтере уже ÑущеÑтвует: \"%s\"" -#: check.c:538 +#: check.c:926 #, c-format msgid "" "\n" -"WARNING: new data directory should not be inside the old data directory, e." -"g. %s\n" +"WARNING: new data directory should not be inside the old data directory, i." +"e. %s" msgstr "" "\n" "ПРЕДУПРЕЖДЕÐИЕ: новый каталог данных не должен раÑполагатьÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ Ñтарого " -"каталога данных, то еÑть, в %s\n" +"каталога данных, то еÑть, в %s" -#: check.c:562 +#: check.c:950 #, c-format msgid "" "\n" "WARNING: user-defined tablespace locations should not be inside the data " -"directory, e.g. %s\n" +"directory, i.e. %s" msgstr "" "\n" "ПРЕДУПРЕЖДЕÐИЕ: пользовательÑкие табличные проÑтранÑтва не должны " -"раÑполагатьÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ каталога данных, то еÑть, в %s\n" +"раÑполагатьÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ каталога данных, то еÑть, в %s" -#: check.c:572 +#: check.c:960 #, c-format msgid "Creating script to delete old cluster" msgstr "Создание Ñкрипта Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ñтарого клаÑтера" -#: check.c:575 check.c:839 check.c:937 check.c:1016 check.c:1278 file.c:336 -#: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376 -#: version.c:511 +#: check.c:1014 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "не удалоÑÑŒ открыть файл \"%s\": %s\n" +msgid "could not add execute permission to file \"%s\": %m" +msgstr "не удалоÑÑŒ добавить право Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": %m" -#: check.c:631 -#, c-format -msgid "could not add execute permission to file \"%s\": %s\n" -msgstr "не удалоÑÑŒ добавить право Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": %s\n" - -#: check.c:651 +#: check.c:1034 #, c-format msgid "Checking database user is the install user" msgstr "Проверка, ÑвлÑетÑÑ Ð»Ð¸ пользователь БД Ñтартовым пользователем" -#: check.c:667 +#: check.c:1050 #, c-format -msgid "database user \"%s\" is not the install user\n" -msgstr "пользователь БД \"%s\" не ÑвлÑетÑÑ Ñтартовым пользователем\n" +msgid "database user \"%s\" is not the install user" +msgstr "пользователь БД \"%s\" не ÑвлÑетÑÑ Ñтартовым пользователем" -#: check.c:678 +#: check.c:1061 #, c-format -msgid "could not determine the number of users\n" -msgstr "не удалоÑÑŒ определить количеÑтво пользователей\n" +msgid "could not determine the number of users" +msgstr "не удалоÑÑŒ определить количеÑтво пользователей" -#: check.c:686 +#: check.c:1069 #, c-format -msgid "Only the install user can be defined in the new cluster.\n" -msgstr "Ð’ новом клаÑтере может быть определён только Ñтартовый пользователь.\n" +msgid "Only the install user can be defined in the new cluster." +msgstr "Ð’ новом клаÑтере может быть определён только Ñтартовый пользователь." -#: check.c:706 +#: check.c:1098 #, c-format msgid "Checking database connection settings" msgstr "Проверка параметров Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных" -#: check.c:728 +#: check.c:1124 #, c-format msgid "" "template0 must not allow connections, i.e. its pg_database.datallowconn must " -"be false\n" +"be false" msgstr "" -"База template0 не должна допуÑкать подключениÑ, то еÑть её ÑвойÑтво " -"pg_database.datallowconn должно быть false\n" +"база template0 не должна допуÑкать подключениÑ, то еÑть её ÑвойÑтво " +"pg_database.datallowconn должно быть false" + +#: check.c:1150 check.c:1270 check.c:1367 check.c:1492 check.c:1568 +#: check.c:1626 check.c:1706 check.c:1897 check.c:2022 function.c:210 +#, c-format +msgid "fatal" +msgstr "Ñбой" -#: check.c:738 +#: check.c:1151 #, c-format msgid "" -"All non-template0 databases must allow connections, i.e. their pg_database." -"datallowconn must be true\n" +"All non-template0 databases must allow connections, i.e. their\n" +"pg_database.datallowconn must be true. Your installation contains\n" +"non-template0 databases with their pg_database.datallowconn set to\n" +"false. Consider allowing connection for all non-template0 databases\n" +"or drop the databases which do not allow connections. A list of\n" +"databases with the problem is in the file:\n" +" %s" msgstr "" "Ð’Ñе базы, кроме template0, должны допуÑкать подключениÑ, то еÑть их ÑвойÑтво " -"pg_database.datallowconn должно быть true\n" +"pg_database.datallowconn должно быть true. Ð’ вашей инÑталлÑции ÑодержатÑÑ\n" +"базы (не ÑÑ‡Ð¸Ñ‚Ð°Ñ template0), у которых pg_database.datallowconn — false.\n" +"Имеет ÑмыÑл разрешить Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ñех баз данных, кроме template0,\n" +"или удалить базы, к которым Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°Ñ‚ÑŒÑÑ. СпиÑок баз данных\n" +"Ñ Ñтой проблемой ÑодержитÑÑ Ð² файле:\n" +" %s" -#: check.c:763 +#: check.c:1176 #, c-format msgid "Checking for prepared transactions" msgstr "Проверка Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñ‚Ð¾Ð²Ð»ÐµÐ½Ð½Ñ‹Ñ… транзакций" -#: check.c:772 +#: check.c:1185 #, c-format -msgid "The source cluster contains prepared transactions\n" -msgstr "ИÑходный клаÑтер Ñодержит подготовленные транзакции\n" +msgid "The source cluster contains prepared transactions" +msgstr "ИÑходный клаÑтер Ñодержит подготовленные транзакции" -#: check.c:774 +#: check.c:1187 #, c-format -msgid "The target cluster contains prepared transactions\n" -msgstr "Целевой клаÑтер Ñодержит подготовленные транзакции\n" +msgid "The target cluster contains prepared transactions" +msgstr "Целевой клаÑтер Ñодержит подготовленные транзакции" -#: check.c:800 +#: check.c:1212 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Проверка неÑоответÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð¸ передаче bigint в contrib/isn" -#: check.c:861 check.c:962 check.c:1038 check.c:1095 check.c:1154 check.c:1183 -#: check.c:1301 function.c:262 version.c:278 version.c:316 version.c:460 -#, c-format -msgid "fatal\n" -msgstr "Ñбой\n" - -#: check.c:862 +#: check.c:1271 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -309,8 +535,7 @@ msgid "" "manually dump databases in the old cluster that use \"contrib/isn\"\n" "facilities, drop them, perform the upgrade, and then restore them. A\n" "list of the problem functions is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Ð’ вашей инÑталлÑции имеютÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ \"contrib/isn\", задейÑтвующие тип " "biging.\n" @@ -321,537 +546,569 @@ msgstr "" "или удалить \"contrib/isn\" из Ñтарого клаÑтера и перезапуÑтить обновление. " "СпиÑок\n" "проблемных функций приведён в файле:\n" -" %s\n" -"\n" +" %s" -#: check.c:885 +#: check.c:1293 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Проверка пользовательÑких поÑтфикÑных операторов" -#: check.c:963 +#: check.c:1368 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" "supported anymore. Consider dropping the postfix operators and replacing\n" "them with prefix operators or function calls.\n" "A list of user-defined postfix operators is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Ð’ вашей инÑталлÑции ÑодержатÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкие поÑтфикÑные операторы, " "которые\n" "теперь не поддерживаютÑÑ. Их Ñледует удалить и иÑпользовать вмеÑто них\n" "префикÑные операторы или функции.\n" "СпиÑок пользовательÑких поÑтфикÑных операторов приведён в файле:\n" -" %s\n" -"\n" +" %s" -#: check.c:984 +#: check.c:1392 +#, c-format +msgid "Checking for incompatible polymorphic functions" +msgstr "Проверка неÑовмеÑтимых полиморфных функций" + +#: check.c:1493 +#, c-format +msgid "" +"Your installation contains user-defined objects that refer to internal\n" +"polymorphic functions with arguments of type \"anyarray\" or " +"\"anyelement\".\n" +"These user-defined objects must be dropped before upgrading and restored\n" +"afterwards, changing them to refer to the new corresponding functions with\n" +"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n" +"A list of the problematic objects is in the file:\n" +" %s" +msgstr "" +"Ð’ вашей инÑталлÑции ÑодержатÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкие объекты, обращающиеÑÑ\n" +"к внутренним полиморфным функциÑм Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ð¼Ð¸ типа \"anyarray\" или " +"\"anyelement\".\n" +"Такие объекты необходимо удалить перед процедурой Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ воÑÑтановить\n" +"поÑле, изменив их так, чтобы они обращалиÑÑŒ к новым аналогичным функциÑм\n" +"Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ð¼Ð¸ типа \"anycompatiblearray\" и \"anycompatible\".\n" +"СпиÑок проблемных объектов приведён в файле:\n" +" %s" + +#: check.c:1517 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Проверка таблиц Ñо ÑвойÑтвом WITH OIDS" -#: check.c:1039 +#: check.c:1569 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" "supported anymore. Consider removing the oid column using\n" " ALTER TABLE ... SET WITHOUT OIDS;\n" "A list of tables with the problem is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Ð’ вашей инÑталлÑции ÑодержатÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ Ñо ÑвойÑтвом WITH OIDS, которое " "теперь\n" "не поддерживаетÑÑ. ОтказатьÑÑ Ð¾Ñ‚ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтолбцов oid можно так:\n" " ALTER TABLE ... SET WITHOUT OIDS;\n" "СпиÑок проблемных таблиц приведён в файле:\n" -" %s\n" -"\n" +" %s" -#: check.c:1067 +#: check.c:1596 #, c-format -msgid "Checking for system-defined composite types in user tables" -msgstr "Проверка ÑиÑтемных ÑоÑтавных типов в пользовательÑких таблицах" +msgid "Checking for roles starting with \"pg_\"" +msgstr "Проверка ролей Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸, начинающимиÑÑ Ñ \"pg_\"" -#: check.c:1096 +#: check.c:1627 #, c-format msgid "" -"Your installation contains system-defined composite type(s) in user tables.\n" -"These type OIDs are not stable across PostgreSQL versions,\n" -"so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" +"Your installation contains roles starting with \"pg_\".\n" +"\"pg_\" is a reserved prefix for system roles. The cluster\n" +"cannot be upgraded until these roles are renamed.\n" +"A list of roles starting with \"pg_\" is in the file:\n" +" %s" msgstr "" -"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют ÑиÑтемные ÑоÑтавные " -"типы.\n" -"OID таких типов могут различатьÑÑ Ð² разных верÑиÑÑ… PostgreSQL, в наÑтоÑщем\n" -"ÑоÑтоÑнии обновить клаÑтер невозможно. Ð’Ñ‹ можете удалить проблемные Ñтолбцы\n" -"и перезапуÑтить обновление. СпиÑок проблемных Ñтолбцов приведён в файле:\n" -" %s\n" -"\n" +"Ð’ вашей инÑталлÑции имеютÑÑ Ñ€Ð¾Ð»Ð¸ Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸, начинающимиÑÑ Ñ \"pg_\".\n" +"ÐŸÑ€ÐµÑ„Ð¸ÐºÑ \"pg_\" зарезервирован Ð´Ð»Ñ ÑиÑтемных ролей. Пока Ñти роли\n" +"не будут переименованы, обновить клаÑтер невозможно.\n" +"СпиÑок ролей Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑом \"pg_\" приведён в файле:\n" +" %s" -#: check.c:1124 +#: check.c:1647 #, c-format -msgid "Checking for reg* data types in user tables" -msgstr "Проверка типов данных reg* в пользовательÑких таблицах" +msgid "Checking for user-defined encoding conversions" +msgstr "Проверка пользовательÑких перекодировок" -#: check.c:1155 +#: check.c:1707 #, c-format msgid "" -"Your installation contains one of the reg* data types in user tables.\n" -"These data types reference system OIDs that are not preserved by\n" -"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" +"Your installation contains user-defined encoding conversions.\n" +"The conversion function parameters changed in PostgreSQL version 14\n" +"so this cluster cannot currently be upgraded. You can remove the\n" +"encoding conversions in the old cluster and restart the upgrade.\n" +"A list of user-defined encoding conversions is in the file:\n" +" %s" msgstr "" -"Ð’ вашей инÑталлÑции пользовательÑкие таблицы Ñодержат один из типов reg*.\n" -"Эти типы данных ÑÑылаютÑÑ Ð½Ð° ÑиÑтемные OID, которые не ÑохранÑÑŽÑ‚ÑÑ ÑƒÑ‚Ð¸Ð»Ð¸Ñ‚Ð¾Ð¹\n" -"pg_upgrade, так что обновление клаÑтера в текущем ÑоÑтоÑнии невозможно. Ð’Ñ‹\n" -"можете удалить проблемные Ñтолбцы и перезапуÑтить обновление. СпиÑок " -"проблемных\n" -"Ñтолбцов приведён в файле:\n" -" %s\n" -"\n" +"Ð’ вашей инÑталлÑции имеютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкие перекодировки.\n" +"У функций перекодировок в PostgreSQL 14 поменÑлиÑÑŒ параметры, поÑтому\n" +"в наÑтоÑщем ÑоÑтоÑнии обновить клаÑтер невозможно. Ð’Ñ‹ можете удалить\n" +"перекодировки в Ñтаром клаÑтере и перезапуÑтить обновление.\n" +"СпиÑок пользовательÑких перекодировок приведён в файле:\n" +" %s" -#: check.c:1177 +#: check.c:1746 #, c-format -msgid "Checking for incompatible \"jsonb\" data type" -msgstr "Проверка неÑовмеÑтимого типа данных \"jsonb\"" +msgid "Checking for new cluster logical replication slots" +msgstr "Проверка Ñлотов логичеÑкой репликации в новом клаÑтере" -#: check.c:1184 +#: check.c:1754 #, c-format -msgid "" -"Your installation contains the \"jsonb\" data type in user tables.\n" -"The internal format of \"jsonb\" changed during 9.4 beta so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Ð’ вашей инÑталлÑции таблицы иÑпользуют тип данных jsonb.\n" -"Внутренний формат \"jsonb\" изменилÑÑ Ð² верÑии 9.4 beta, поÑтому обновить " -"клаÑтер\n" -"в текущем ÑоÑтоÑнии невозможно. Ð’Ñ‹ можете удалить проблемные Ñтолбцы и\n" -"перезапуÑтить обновление. СпиÑок проблемных Ñтолбцов приведён в файле:\n" -" %s\n" -"\n" +msgid "could not count the number of logical replication slots" +msgstr "не удалоÑÑŒ получить количеÑтво Ñлотов логичеÑкой репликации" -#: check.c:1206 +#: check.c:1759 #, c-format -msgid "Checking for roles starting with \"pg_\"" -msgstr "Проверка ролей Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸, начинающимиÑÑ Ñ \"pg_\"" +msgid "expected 0 logical replication slots but found %d" +msgstr "обнаружено Ñлотов логичеÑкой репликации: %d, тогда как ожидалоÑÑŒ 0" -#: check.c:1216 +#: check.c:1769 check.c:1820 #, c-format -msgid "The source cluster contains roles starting with \"pg_\"\n" -msgstr "Ð’ иÑходном клаÑтере еÑть роли, имена которых начинаютÑÑ Ñ \"pg_\"\n" +msgid "could not determine parameter settings on new cluster" +msgstr "не удалоÑÑŒ получить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð² в новом клаÑтере" -#: check.c:1218 +#: check.c:1774 #, c-format -msgid "The target cluster contains roles starting with \"pg_\"\n" -msgstr "Ð’ целевом клаÑтере еÑть роли, имена которых начинаютÑÑ Ñ \"pg_\"\n" +msgid "\"wal_level\" must be \"logical\" but is set to \"%s\"" +msgstr "\"wal_level\" должен иметь значение \"logical\", а имеет \"%s\"" -#: check.c:1239 +#: check.c:1780 #, c-format -msgid "Checking for user-defined encoding conversions" -msgstr "Проверка пользовательÑких перекодировок" +msgid "" +"\"max_replication_slots\" (%d) must be greater than or equal to the number " +"of logical replication slots (%d) on the old cluster" +msgstr "" +"значение \"max_replication_slots\" (%d) должно быть больше или равно чиÑлу " +"Ñлотов логичеÑкой репликации (%d) в Ñтаром клаÑтере" -#: check.c:1302 +#: check.c:1812 +#, c-format +msgid "Checking for new cluster configuration for subscriptions" +msgstr "Проверка конфигурации нового клаÑтера Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñок" + +#: check.c:1824 #, c-format msgid "" -"Your installation contains user-defined encoding conversions.\n" -"The conversion function parameters changed in PostgreSQL version 14\n" -"so this cluster cannot currently be upgraded. You can remove the\n" -"encoding conversions in the old cluster and restart the upgrade.\n" -"A list of user-defined encoding conversions is in the file:\n" -" %s\n" -"\n" +"\"max_replication_slots\" (%d) must be greater than or equal to the number " +"of subscriptions (%d) on the old cluster" msgstr "" -"Ð’ вашей инÑталлÑции имеютÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑкие перекодировки.\n" -"У функций перекодировок в PostgreSQL 14 поменÑлиÑÑŒ параметры, поÑтому\n" -"в наÑтоÑщем ÑоÑтоÑнии обновить клаÑтер невозможно. Ð’Ñ‹ можете удалить\n" -"перекодировки в Ñтаром клаÑтере и перезапуÑтить обновление.\n" -"СпиÑок пользовательÑких перекодировок приведён в файле:\n" -" %s\n" -"\n" +"значение \"max_replication_slots\" (%d) должно быть больше или равно чиÑлу " +"подпиÑок (%d) в Ñтаром клаÑтере" -#: check.c:1329 +#: check.c:1846 #, c-format -msgid "failed to get the current locale\n" -msgstr "не удалоÑÑŒ получить текущую локаль\n" +msgid "Checking for valid logical replication slots" +msgstr "Проверка корректноÑти Ñлотов логичеÑкой репликации" -#: check.c:1338 +#: check.c:1898 #, c-format -msgid "failed to get system locale name for \"%s\"\n" -msgstr "не удалоÑÑŒ получить ÑиÑтемное Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ Ð´Ð»Ñ \"%s\"\n" +msgid "" +"Your installation contains logical replication slots that cannot be " +"upgraded.\n" +"You can remove invalid slots and/or consume the pending WAL for other " +"slots,\n" +"and then restart the upgrade.\n" +"A list of the problematic slots is in the file:\n" +" %s" +msgstr "" +"Ð’ вашей инÑталлÑции иÑпользуютÑÑ Ñлоты логичеÑкой репликации, которые " +"нельзÑ\n" +"обновить. Ð’Ñ‹ можете удалить неподходÑщие Ñлоты и/или добитьÑÑ, чтобы другие\n" +"Ñлоты прочитали ожидающий обработки WAL, а затем перезапуÑтить обновление.\n" +"СпиÑок проблемных Ñлотов приведён в файле:\n" +" %s" -#: check.c:1344 +#: check.c:1922 #, c-format -msgid "failed to restore old locale \"%s\"\n" -msgstr "не удалоÑÑŒ воÑÑтановить Ñтарую локаль \"%s\"\n" +msgid "Checking for subscription state" +msgstr "Проверка ÑоÑтоÑÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñок" -#: controldata.c:128 controldata.c:196 +#: check.c:2023 #, c-format -msgid "could not get control data using %s: %s\n" -msgstr "не удалоÑÑŒ получить управлÑющие данные, выполнив %s: %s\n" +msgid "" +"Your installation contains subscriptions without origin or having relations " +"not in i (initialize) or r (ready) state.\n" +"You can allow the initial sync to finish for all relations and then restart " +"the upgrade.\n" +"A list of the problematic subscriptions is in the file:\n" +" %s" +msgstr "" +"Ð’ вашей инÑталлÑции имеютÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñки Ñ Ð¾Ñ‚ÑутÑтвующим иÑточником или Ñ\n" +"отношениÑми, находÑщимиÑÑ Ð½Ðµ в ÑоÑтоÑнии i (инициализировано) или r " +"(готово).\n" +"Ð’Ñ‹ можете добитьÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð¾Ð¹ Ñинхронизации Ð´Ð»Ñ Ð²Ñех отношений, а\n" +"затем перезапуÑтить обновление.\n" +"СпиÑок проблемных подпиÑок приведён в файле:\n" +" %s" + +#: controldata.c:129 controldata.c:199 +#, c-format +msgid "could not get control data using %s: %m" +msgstr "не удалоÑÑŒ получить управлÑющие данные, выполнив %s: %m" #: controldata.c:139 #, c-format -msgid "%d: database cluster state problem\n" -msgstr "%d: недопуÑтимое ÑоÑтоÑние клаÑтера баз данных\n" +msgid "%d: database cluster state problem" +msgstr "%d: недопуÑтимое ÑоÑтоÑние клаÑтера баз данных" -#: controldata.c:157 +#: controldata.c:158 #, c-format msgid "" "The source cluster was shut down while in recovery mode. To upgrade, use " -"\"rsync\" as documented or shut it down as a primary.\n" +"\"rsync\" as documented or shut it down as a primary." msgstr "" "ИÑходный клаÑтер был отключён в режиме воÑÑтановлениÑ. Чтобы произвеÑти " "обновление, иÑпользуйте документированный ÑпоÑоб Ñ rsync или отключите его в " -"режиме главного Ñервера.\n" +"режиме главного Ñервера." -#: controldata.c:159 +#: controldata.c:160 #, c-format msgid "" "The target cluster was shut down while in recovery mode. To upgrade, use " -"\"rsync\" as documented or shut it down as a primary.\n" +"\"rsync\" as documented or shut it down as a primary." msgstr "" "Целевой клаÑтер был отключён в режиме воÑÑтановлениÑ. Чтобы произвеÑти " "обновление, иÑпользуйте документированный ÑпоÑоб Ñ rsync или отключите его в " -"режиме главного Ñервера.\n" +"режиме главного Ñервера." -#: controldata.c:164 +#: controldata.c:165 #, c-format -msgid "The source cluster was not shut down cleanly.\n" -msgstr "ИÑходный клаÑтер не был отключён штатным образом.\n" - -#: controldata.c:166 -#, c-format -msgid "The target cluster was not shut down cleanly.\n" -msgstr "Целевой клаÑтер не был отключён штатным образом.\n" +msgid "The source cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "" +"ИÑходный клаÑтер не был отключён штатным образом, запиÑанное ÑоÑтоÑние: " +"\"%s\"" -#: controldata.c:177 +#: controldata.c:167 #, c-format -msgid "The source cluster lacks cluster state information:\n" -msgstr "Ð’ иÑходном клаÑтере не хватает информации о ÑоÑтоÑнии клаÑтера:\n" +msgid "The target cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "" +"Целевой клаÑтер не был отключён штатным образом, запиÑанное ÑоÑтоÑние: \"%s\"" -#: controldata.c:179 +#: controldata.c:175 controldata.c:507 #, c-format -msgid "The target cluster lacks cluster state information:\n" -msgstr "Ð’ целевом клаÑтере не хватает информации о ÑоÑтоÑнии клаÑтера:\n" +msgid "could not get control data using %s: %s" +msgstr "не удалоÑÑŒ получить управлÑющие данные, выполнив %s: %s" -#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371 -#: relfilenode.c:243 server.c:33 util.c:79 +#: controldata.c:181 #, c-format -msgid "%s" -msgstr "%s" +msgid "The source cluster lacks cluster state information:" +msgstr "Ð’ иÑходном клаÑтере не хватает информации о ÑоÑтоÑнии клаÑтера:" -#: controldata.c:216 +#: controldata.c:183 #, c-format -msgid "%d: pg_resetwal problem\n" -msgstr "%d: проблема Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð¾Ð¼ pg_resetwal\n" +msgid "The target cluster lacks cluster state information:" +msgstr "Ð’ целевом клаÑтере не хватает информации о ÑоÑтоÑнии клаÑтера:" -#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258 -#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310 -#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354 -#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383 -#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427 -#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471 -#: controldata.c:482 controldata.c:493 +#: controldata.c:213 dump.c:50 exec.c:118 pg_upgrade.c:558 pg_upgrade.c:598 +#: pg_upgrade.c:947 relfilenumber.c:233 server.c:34 util.c:337 #, c-format -msgid "%d: controldata retrieval problem\n" -msgstr "%d: проблема Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸ÐµÐ¼ управлÑющих данных\n" +msgid "%s" +msgstr "%s" -#: controldata.c:572 +#: controldata.c:220 #, c-format -msgid "The source cluster lacks some required control information:\n" -msgstr "Ð’ иÑходном клаÑтере не хватает необходимой управлÑющей информации:\n" +msgid "%d: pg_resetwal problem" +msgstr "%d: проблема Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð¾Ð¼ pg_resetwal" -#: controldata.c:575 +#: controldata.c:230 controldata.c:240 controldata.c:251 controldata.c:262 +#: controldata.c:273 controldata.c:292 controldata.c:303 controldata.c:314 +#: controldata.c:325 controldata.c:336 controldata.c:347 controldata.c:358 +#: controldata.c:361 controldata.c:365 controldata.c:375 controldata.c:387 +#: controldata.c:398 controldata.c:409 controldata.c:420 controldata.c:431 +#: controldata.c:442 controldata.c:453 controldata.c:464 controldata.c:475 +#: controldata.c:486 controldata.c:497 #, c-format -msgid "The target cluster lacks some required control information:\n" -msgstr "Ð’ целевом клаÑтере не хватает необходимой управлÑющей информации:\n" +msgid "%d: controldata retrieval problem" +msgstr "%d: проблема Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸ÐµÐ¼ управлÑющих данных" -# skip-rule: capital-letter-first #: controldata.c:578 #, c-format -msgid " checkpoint next XID\n" -msgstr " Ñледующий XID поÑледней конт. точки\n" +msgid "The source cluster lacks some required control information:" +msgstr "Ð’ иÑходном клаÑтере не хватает необходимой управлÑющей информации:" -# skip-rule: capital-letter-first #: controldata.c:581 #, c-format -msgid " latest checkpoint next OID\n" -msgstr " Ñледующий OID поÑледней конт. точки\n" +msgid "The target cluster lacks some required control information:" +msgstr "Ð’ целевом клаÑтере не хватает необходимой управлÑющей информации:" # skip-rule: capital-letter-first #: controldata.c:584 #, c-format -msgid " latest checkpoint next MultiXactId\n" -msgstr " Ñледующий MultiXactId поÑледней конт. точки\n" +msgid " checkpoint next XID" +msgstr " Ñледующий XID конт. точки" # skip-rule: capital-letter-first -#: controldata.c:588 +#: controldata.c:587 #, c-format -msgid " latest checkpoint oldest MultiXactId\n" -msgstr " Ñтарейший MultiXactId поÑледней конт. точки\n" +msgid " latest checkpoint next OID" +msgstr " Ñледующий OID поÑледней конт. точки" # skip-rule: capital-letter-first -#: controldata.c:591 +#: controldata.c:590 #, c-format -msgid " latest checkpoint oldestXID\n" -msgstr " oldestXID поÑледней конт. точки\n" +msgid " latest checkpoint next MultiXactId" +msgstr " Ñледующий MultiXactId поÑледней конт. точки" # skip-rule: capital-letter-first #: controldata.c:594 #, c-format -msgid " latest checkpoint next MultiXactOffset\n" -msgstr " Ñледующий MultiXactOffset поÑледней конт. точки\n" +msgid " latest checkpoint oldest MultiXactId" +msgstr " Ñтарейший MultiXactId поÑледней конт. точки" +# skip-rule: capital-letter-first #: controldata.c:597 #, c-format -msgid " first WAL segment after reset\n" -msgstr " первый Ñегмент WAL поÑле ÑброÑа\n" +msgid " latest checkpoint oldestXID" +msgstr " oldestXID поÑледней конт. точки" +# skip-rule: capital-letter-first #: controldata.c:600 #, c-format -msgid " float8 argument passing method\n" -msgstr " метод передачи аргумента float8\n" +msgid " latest checkpoint next MultiXactOffset" +msgstr " Ñледующий MultiXactOffset поÑледней конт. точки" #: controldata.c:603 #, c-format -msgid " maximum alignment\n" -msgstr " макÑимальное выравнивание\n" +msgid " first WAL segment after reset" +msgstr " первый Ñегмент WAL поÑле ÑброÑа" #: controldata.c:606 #, c-format -msgid " block size\n" -msgstr " размер блока\n" +msgid " float8 argument passing method" +msgstr " метод передачи аргумента float8" #: controldata.c:609 #, c-format -msgid " large relation segment size\n" -msgstr " размер Ñегмента большого отношениÑ\n" +msgid " maximum alignment" +msgstr " макÑимальное выравнивание" #: controldata.c:612 #, c-format -msgid " WAL block size\n" -msgstr " размер блока WAL\n" +msgid " block size" +msgstr " размер блока" #: controldata.c:615 #, c-format -msgid " WAL segment size\n" -msgstr " размер Ñегмента WAL\n" +msgid " large relation segment size" +msgstr " размер Ñегмента большого отношениÑ" #: controldata.c:618 #, c-format -msgid " maximum identifier length\n" -msgstr " макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° идентификатора\n" +msgid " WAL block size" +msgstr " размер блока WAL" #: controldata.c:621 #, c-format -msgid " maximum number of indexed columns\n" -msgstr " макÑимальное чиÑло Ñтолбцов в индекÑе\n" +msgid " WAL segment size" +msgstr " размер Ñегмента WAL" #: controldata.c:624 #, c-format -msgid " maximum TOAST chunk size\n" -msgstr " макÑимальный размер порции TOAST\n" +msgid " maximum identifier length" +msgstr " макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° идентификатора" -#: controldata.c:628 +#: controldata.c:627 #, c-format -msgid " large-object chunk size\n" -msgstr " размер порции большого объекта\n" +msgid " maximum number of indexed columns" +msgstr " макÑимальное чиÑло Ñтолбцов в индекÑе" -#: controldata.c:631 +#: controldata.c:630 #, c-format -msgid " dates/times are integers?\n" -msgstr " дата/Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€ÐµÐ´Ñтавлены целыми чиÑлами?\n" +msgid " maximum TOAST chunk size" +msgstr " макÑимальный размер порции TOAST" -#: controldata.c:635 +#: controldata.c:634 #, c-format -msgid " data checksum version\n" -msgstr " верÑÐ¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… Ñумм данных\n" +msgid " large-object chunk size" +msgstr " размер порции большого объекта" #: controldata.c:637 #, c-format -msgid "Cannot continue without required control information, terminating\n" +msgid " dates/times are integers?" +msgstr " дата/Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€ÐµÐ´Ñтавлены целыми чиÑлами?" + +#: controldata.c:641 +#, c-format +msgid " data checksum version" +msgstr " верÑÐ¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… Ñумм данных" + +#: controldata.c:643 +#, c-format +msgid "Cannot continue without required control information, terminating" msgstr "" -"Ðет необходимой управлÑющей информации Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ, работа прерываетÑÑ\n" +"Ðет необходимой управлÑющей информации Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ, работа прерываетÑÑ" -#: controldata.c:652 +#: controldata.c:658 #, c-format msgid "" -"old and new pg_controldata alignments are invalid or do not match\n" -"Likely one cluster is a 32-bit install, the other 64-bit\n" +"old and new pg_controldata alignments are invalid or do not match.\n" +"Likely one cluster is a 32-bit install, the other 64-bit" msgstr "" "Ñтарое и новое выравнивание в pg_controldata различаютÑÑ Ð¸Ð»Ð¸ некорректны\n" -"ВероÑтно, один клаÑтер уÑтановлен в 32-битной ÑиÑтеме, а другой ~ в 64-" -"битной\n" +"ВероÑтно, один клаÑтер уÑтановлен в 32-битной ÑиÑтеме, а другой ~ в 64-битной" -#: controldata.c:656 +#: controldata.c:662 #, c-format -msgid "old and new pg_controldata block sizes are invalid or do not match\n" +msgid "old and new pg_controldata block sizes are invalid or do not match" msgstr "" -"Ñтарый и новый размер блоков в pg_controldata различаютÑÑ Ð¸Ð»Ð¸ некорректны\n" +"Ñтарый и новый размер блоков в pg_controldata различаютÑÑ Ð¸Ð»Ð¸ некорректны" -#: controldata.c:659 +#: controldata.c:665 #, c-format msgid "" "old and new pg_controldata maximum relation segment sizes are invalid or do " -"not match\n" +"not match" msgstr "" "Ñтарый и новый макÑимальный размер Ñегментов отношений в pg_controldata " -"различаютÑÑ Ð¸Ð»Ð¸ некорректны\n" +"различаютÑÑ Ð¸Ð»Ð¸ некорректны" -#: controldata.c:662 +#: controldata.c:668 #, c-format -msgid "" -"old and new pg_controldata WAL block sizes are invalid or do not match\n" +msgid "old and new pg_controldata WAL block sizes are invalid or do not match" msgstr "" -"Ñтарый и новый размер блоков WAL в pg_controldata различаютÑÑ Ð¸Ð»Ð¸ " -"некорректны\n" +"Ñтарый и новый размер блоков WAL в pg_controldata различаютÑÑ Ð¸Ð»Ð¸ некорректны" -#: controldata.c:665 +#: controldata.c:671 #, c-format msgid "" -"old and new pg_controldata WAL segment sizes are invalid or do not match\n" +"old and new pg_controldata WAL segment sizes are invalid or do not match" msgstr "" "Ñтарый и новый размер Ñегментов WAL в pg_controldata различаютÑÑ Ð¸Ð»Ð¸ " -"некорректны\n" +"некорректны" -#: controldata.c:668 +#: controldata.c:674 #, c-format msgid "" "old and new pg_controldata maximum identifier lengths are invalid or do not " -"match\n" +"match" msgstr "" "ÑÑ‚Ð°Ñ€Ð°Ñ Ð¸ Ð½Ð¾Ð²Ð°Ñ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° идентификаторов в pg_controldata " -"различаютÑÑ Ð¸Ð»Ð¸ некорректны\n" +"различаютÑÑ Ð¸Ð»Ð¸ некорректны" -#: controldata.c:671 +#: controldata.c:677 #, c-format msgid "" "old and new pg_controldata maximum indexed columns are invalid or do not " -"match\n" +"match" msgstr "" "Ñтарый и новый макÑимум чиÑла Ñтолбцов, ÑоÑтавлÑющих индекÑÑ‹, в " -"pg_controldata различаютÑÑ Ð¸Ð»Ð¸ некорректны\n" +"pg_controldata различаютÑÑ Ð¸Ð»Ð¸ некорректны" -#: controldata.c:674 +#: controldata.c:680 #, c-format msgid "" "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not " -"match\n" +"match" msgstr "" "Ñтарый и новый макÑимальный размер порции TOAST в pg_controldata различаютÑÑ " -"или некорректны\n" +"или некорректны" -#: controldata.c:679 +#: controldata.c:685 #, c-format msgid "" "old and new pg_controldata large-object chunk sizes are invalid or do not " -"match\n" +"match" msgstr "" -"Ñтарый и новый размер порции большого объекта различаютÑÑ Ð¸Ð»Ð¸ некорректны\n" +"Ñтарый и новый размер порции большого объекта различаютÑÑ Ð¸Ð»Ð¸ некорректны" -#: controldata.c:682 +#: controldata.c:688 #, c-format -msgid "old and new pg_controldata date/time storage types do not match\n" +msgid "old and new pg_controldata date/time storage types do not match" msgstr "" "Ñтарый и новый тип Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚Ñ‹/времени в pg_controldata различаютÑÑ Ð¸Ð»Ð¸ " -"некорректны\n" +"некорректны" -#: controldata.c:695 +#: controldata.c:701 #, c-format -msgid "old cluster does not use data checksums but the new one does\n" +msgid "old cluster does not use data checksums but the new one does" msgstr "" "в Ñтаром клаÑтере не применÑлиÑÑŒ контрольные Ñуммы данных, но в новом они " -"еÑть\n" +"еÑть" -#: controldata.c:698 +#: controldata.c:704 #, c-format -msgid "old cluster uses data checksums but the new one does not\n" +msgid "old cluster uses data checksums but the new one does not" msgstr "" -"в Ñтаром клаÑтере применÑлиÑÑŒ контрольные Ñуммы данных, но в новом их нет\n" +"в Ñтаром клаÑтере применÑлиÑÑŒ контрольные Ñуммы данных, но в новом их нет" -#: controldata.c:700 +#: controldata.c:706 #, c-format -msgid "old and new cluster pg_controldata checksum versions do not match\n" +msgid "old and new cluster pg_controldata checksum versions do not match" msgstr "" -"ÑÑ‚Ð°Ñ€Ð°Ñ Ð¸ Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… Ñумм клаÑтера в pg_controldata " -"различаютÑÑ\n" +"ÑÑ‚Ð°Ñ€Ð°Ñ Ð¸ Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ñ‹Ñ… Ñумм клаÑтера в pg_controldata различаютÑÑ" -#: controldata.c:711 +#: controldata.c:717 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "Добавление раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ \".old\" к Ñтарому файлу global/pg_control" -#: controldata.c:716 +#: controldata.c:722 #, c-format -msgid "Unable to rename %s to %s.\n" -msgstr "Ðе удалоÑÑŒ переименовать %s в %s.\n" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" -#: controldata.c:719 +#: controldata.c:726 #, c-format msgid "" "\n" "If you want to start the old cluster, you will need to remove\n" "the \".old\" suffix from %s/global/pg_control.old.\n" "Because \"link\" mode was used, the old cluster cannot be safely\n" -"started once the new cluster has been started.\n" -"\n" +"started once the new cluster has been started." msgstr "" "\n" "ЕÑли вы захотите запуÑтить Ñтарый клаÑтер, вам нужно будет убрать\n" "раÑширение \".old\" у файла %s/global/pg_control.old.\n" "Так как применÑлÑÑ Ñ€ÐµÐ¶Ð¸Ð¼ \"ÑÑылок\", работа Ñтарого клаÑтера\n" -"поÑле того, как будет запущен новый, не гарантируетÑÑ.\n" -"\n" +"поÑле того, как будет запущен новый, не гарантируетÑÑ." #: dump.c:20 #, c-format msgid "Creating dump of global objects" msgstr "Формирование выгрузки глобальных объектов" -#: dump.c:31 +#: dump.c:32 #, c-format -msgid "Creating dump of database schemas\n" -msgstr "Формирование выгрузки Ñхем базы данных\n" +msgid "Creating dump of database schemas" +msgstr "Формирование выгрузки Ñхем базы данных" -#: exec.c:45 +#: exec.c:47 #, c-format -msgid "could not get pg_ctl version data using %s: %s\n" -msgstr "не удалоÑÑŒ получить данные верÑии pg_ctl, выполнив %s: %s\n" +msgid "could not get pg_ctl version data using %s: %m" +msgstr "не удалоÑÑŒ получить данные верÑии pg_ctl, выполнив %s: %m" #: exec.c:51 #, c-format -msgid "could not get pg_ctl version output from %s\n" -msgstr "не удалоÑÑŒ получить верÑию pg_ctl из результата %s\n" +msgid "could not get pg_ctl version data using %s: %s" +msgstr "не удалоÑÑŒ получить данные верÑии pg_ctl, выполнив %s: %s" -#: exec.c:105 exec.c:109 +#: exec.c:55 #, c-format -msgid "command too long\n" -msgstr "команда Ñлишком длиннаÑ\n" +msgid "could not get pg_ctl version output from %s" +msgstr "не удалоÑÑŒ получить верÑию pg_ctl из результата %s" -#: exec.c:111 util.c:37 util.c:225 +#: exec.c:112 exec.c:116 #, c-format -msgid "%s\n" -msgstr "%s\n" +msgid "command too long" +msgstr "команда Ñлишком длиннаÑ" -#: exec.c:150 option.c:217 +#: exec.c:160 pg_upgrade.c:311 #, c-format -msgid "could not open log file \"%s\": %m\n" -msgstr "не удалоÑÑŒ открыть файл протокола \"%s\": %m\n" +msgid "could not open log file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл протокола \"%s\": %m" -#: exec.c:179 +#: exec.c:192 #, c-format msgid "" "\n" @@ -860,432 +1117,382 @@ msgstr "" "\n" "*ошибка*" -#: exec.c:182 +#: exec.c:195 #, c-format -msgid "There were problems executing \"%s\"\n" -msgstr "При выполнении \"%s\" возникли проблемы\n" +msgid "There were problems executing \"%s\"" +msgstr "При выполнении \"%s\" возникли проблемы" -#: exec.c:185 +#: exec.c:198 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" -"the probable cause of the failure.\n" +"the probable cause of the failure." msgstr "" "Чтобы понÑть причину ошибки, проÑмотрите поÑледние неÑколько Ñтрок\n" -"файла \"%s\" или \"%s\".\n" +"файла \"%s\" или \"%s\"." -#: exec.c:190 +#: exec.c:203 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" -"the probable cause of the failure.\n" +"the probable cause of the failure." msgstr "" "Чтобы понÑть причину ошибки, проÑмотрите поÑледние неÑколько Ñтрок\n" -"файла \"%s\".\n" +"файла \"%s\"." -#: exec.c:205 option.c:226 +#: exec.c:218 pg_upgrade.c:321 #, c-format -msgid "could not write to log file \"%s\": %m\n" -msgstr "не удалоÑÑŒ запиÑать в файл протокола \"%s\": %m\n" +msgid "could not write to log file \"%s\": %m" +msgstr "не удалоÑÑŒ запиÑать в файл протокола \"%s\": %m" -#: exec.c:231 +#: exec.c:244 #, c-format -msgid "could not open file \"%s\" for reading: %s\n" -msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %s\n" +msgid "could not open file \"%s\" for reading: %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m" -#: exec.c:258 +#: exec.c:270 #, c-format -msgid "You must have read and write access in the current directory.\n" -msgstr "У Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ быть права на чтение и запиÑÑŒ в текущем каталоге.\n" +msgid "You must have read and write access in the current directory." +msgstr "У Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ быть права на чтение и запиÑÑŒ в текущем каталоге." -#: exec.c:311 exec.c:377 +#: exec.c:323 exec.c:389 exec.c:439 #, c-format -msgid "check for \"%s\" failed: %s\n" -msgstr "проверка ÑущеÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ \"%s\" не пройдена: %s\n" +msgid "check for \"%s\" failed: %m" +msgstr "файл \"%s\" не прошёл проверку: %m" -#: exec.c:314 exec.c:380 +#: exec.c:326 exec.c:392 #, c-format -msgid "\"%s\" is not a directory\n" -msgstr "\"%s\" не ÑвлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼\n" +msgid "\"%s\" is not a directory" +msgstr "\"%s\" не ÑвлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼" -#: exec.c:430 +#: exec.c:444 #, c-format -msgid "check for \"%s\" failed: not a regular file\n" -msgstr "программа \"%s\" не прошла проверку: Ñто не обычный файл\n" +msgid "check for \"%s\" failed: cannot execute" +msgstr "программа \"%s\" не прошла проверку: ошибка выполнениÑ" -#: exec.c:433 -#, c-format -msgid "check for \"%s\" failed: cannot execute (permission denied)\n" -msgstr "программа \"%s\" не прошла проверку: ошибка Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ (нет доÑтупа)\n" - -#: exec.c:439 -#, c-format -msgid "check for \"%s\" failed: cannot execute\n" -msgstr "программа \"%s\" не прошла проверку: ошибка выполнениÑ\n" - -#: exec.c:449 +#: exec.c:454 #, c-format msgid "" -"check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n" +"check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"" msgstr "" "программа \"%s\" не прошла проверку: получена Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ \"%s\", " -"ожидалаÑÑŒ \"%s\"\n" +"ожидалаÑÑŒ \"%s\"" -#: file.c:43 file.c:61 +#: file.c:44 #, c-format -msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "ошибка при клонировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" (из \"%s\" в \"%s\"): %s\n" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "ошибка при клонировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" (из \"%s\" в \"%s\"): %m" -#: file.c:50 +#: file.c:51 #, c-format -msgid "" -"error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n" +msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %m" msgstr "" "ошибка при клонировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ открыть файл \"%s\": " -"%s\n" +"%m" -#: file.c:55 +#: file.c:56 #, c-format msgid "" -"error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n" +"error while cloning relation \"%s.%s\": could not create file \"%s\": %m" msgstr "" "ошибка при клонировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ Ñоздать файл \"%s\": " -"%s\n" +"%m" -#: file.c:87 file.c:190 +#: file.c:65 #, c-format -msgid "" -"error while copying relation \"%s.%s\": could not open file \"%s\": %s\n" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s" +msgstr "ошибка при клонировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" (из \"%s\" в \"%s\"): %s" + +#: file.c:91 file.c:160 file.c:233 +#, c-format +msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %m" msgstr "" "ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ открыть файл \"%s\": " -"%s\n" +"%m" -#: file.c:92 file.c:199 +#: file.c:96 file.c:165 file.c:242 #, c-format msgid "" -"error while copying relation \"%s.%s\": could not create file \"%s\": %s\n" +"error while copying relation \"%s.%s\": could not create file \"%s\": %m" msgstr "" "ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ Ñоздать файл \"%s\": " -"%s\n" +"%m" -#: file.c:106 file.c:223 +#: file.c:110 file.c:266 #, c-format -msgid "" -"error while copying relation \"%s.%s\": could not read file \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %m" msgstr "" -"ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ прочитать файл \"%s" -"\": %s\n" +"ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ прочитать файл " +"\"%s\": %m" -#: file.c:118 file.c:301 +#: file.c:122 file.c:344 #, c-format -msgid "" -"error while copying relation \"%s.%s\": could not write file \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %m" msgstr "" -"ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ запиÑать в файл \"%s" -"\": %s\n" +"ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ запиÑать файл \"%s\": " +"%m" -#: file.c:132 +#: file.c:136 #, c-format -msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" (из \"%s\" в \"%s\"): %s\n" +msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" (из \"%s\" в \"%s\"): %m" -#: file.c:151 +#: file.c:172 #, c-format msgid "" -"error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" +"error while copying relation \"%s.%s\": could not copy file range from " +"\"%s\" to \"%s\": %m" msgstr "" -"ошибка при Ñоздании ÑÑылки Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" (из \"%s\" в \"%s\"): %s\n" +"ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ Ñкопировать фрагмент " +"файла \"%s\" в \"%s\": %m" #: file.c:194 #, c-format -msgid "" -"error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n" +msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "" +"ошибка при Ñоздании ÑÑылки Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" (из \"%s\" в \"%s\"): %m" + +#: file.c:237 +#, c-format +msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %m" msgstr "" "ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": не удалоÑÑŒ получить информацию о " -"файле \"%s\": %s\n" +"файле \"%s\": %m" -#: file.c:226 +#: file.c:269 #, c-format msgid "" -"error while copying relation \"%s.%s\": partial page found in file \"%s\"\n" +"error while copying relation \"%s.%s\": partial page found in file \"%s\"" msgstr "" "ошибка при копировании Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\": в файле \"%s\" обнаружена " -"Ð½ÐµÐ¿Ð¾Ð»Ð½Ð°Ñ Ñтраница\n" +"Ð½ÐµÐ¿Ð¾Ð»Ð½Ð°Ñ Ñтраница" -#: file.c:328 file.c:345 +#: file.c:371 file.c:387 #, c-format -msgid "could not clone file between old and new data directories: %s\n" -msgstr "не удалоÑÑŒ клонировать файл из Ñтарого каталога данных в новый: %s\n" +msgid "could not clone file between old and new data directories: %m" +msgstr "не удалоÑÑŒ клонировать файл из Ñтарого каталога данных в новый: %m" -#: file.c:341 +#: file.c:383 file.c:420 #, c-format -msgid "could not create file \"%s\": %s\n" -msgstr "не удалоÑÑŒ Ñоздать файл \"%s\": %s\n" +msgid "could not create file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñоздать файл \"%s\": %m" -#: file.c:352 +#: file.c:393 #, c-format -msgid "file cloning not supported on this platform\n" -msgstr "клонирование файлов не поддерживаетÑÑ Ð² Ñтой ОС\n" +msgid "file cloning not supported on this platform" +msgstr "клонирование файлов не поддерживаетÑÑ Ð² Ñтой ОС" -#: file.c:369 +#: file.c:424 #, c-format -msgid "" -"could not create hard link between old and new data directories: %s\n" -"In link mode the old and new data directories must be on the same file " -"system.\n" +msgid "could not copy file range between old and new data directories: %m" msgstr "" -"не удалоÑÑŒ Ñоздать жёÑткую ÑÑылку между Ñтарым и новым каталогами данных: " -"%s\n" -"Ð’ режиме \"ÑÑылок\" Ñтарый и новый каталоги данных должны находитьÑÑ Ð² одной " -"файловой ÑиÑтеме.\n" - -#: function.c:114 -#, c-format -msgid "" -"\n" -"The old cluster has a \"plpython_call_handler\" function defined\n" -"in the \"public\" schema which is a duplicate of the one defined\n" -"in the \"pg_catalog\" schema. You can confirm this by executing\n" -"in psql:\n" -"\n" -" \\df *.plpython_call_handler\n" -"\n" -"The \"public\" schema version of this function was created by a\n" -"pre-8.1 install of plpython, and must be removed for pg_upgrade\n" -"to complete because it references a now-obsolete \"plpython\"\n" -"shared object file. You can remove the \"public\" schema version\n" -"of this function by running the following command:\n" -"\n" -" DROP FUNCTION public.plpython_call_handler()\n" -"\n" -"in each affected database:\n" -"\n" -msgstr "" -"\n" -"Ð’ Ñтаром клаÑтере имеетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"plpython_call_handler\",\n" -"Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ð°Ñ Ð² Ñхеме \"public\", предÑтавлÑÑŽÑ‰Ð°Ñ Ñобой копию функции,\n" -"определённой в Ñхеме \"pg_catalog\". Ð’Ñ‹ можете убедитьÑÑ Ð² Ñтом,\n" -"выполнив в psql:\n" -"\n" -" \\df *.plpython_call_handler\n" -"\n" -"ВерÑÐ¸Ñ Ñтой функции в Ñхеме \"public\" была Ñоздана инÑталлÑцией\n" -"plpython верÑии до 8.1 и должна быть удалена Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹\n" -"pg_upgrade, так как она ÑÑылаетÑÑ Ð½Ð° Ñтавший уÑтаревшим\n" -"разделÑемый объектный файл \"plpython\". Ð’Ñ‹ можете удалить верÑию Ñтой " -"функции\n" -"из Ñхемы \"public\", выполнив Ñледующую команду:\n" -"\n" -" DROP FUNCTION public.plpython_call_handler()\n" -"\n" -"в каждой затронутой базе данных:\n" -"\n" +"не удалоÑÑŒ Ñкопировать фрагмент файла из Ñтарого каталога данных в новый: %m" -#: function.c:132 +#: file.c:430 #, c-format -msgid " %s\n" -msgstr " %s\n" +msgid "copy_file_range not supported on this platform" +msgstr "copy_file_range не поддерживаетÑÑ Ð² Ñтой ОС" -#: function.c:142 +#: file.c:447 #, c-format -msgid "Remove the problem functions from the old cluster to continue.\n" -msgstr "Удалите проблемные функции из Ñтарого клаÑтера Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ.\n" +msgid "" +"could not create hard link between old and new data directories: %m\n" +"In link mode the old and new data directories must be on the same file " +"system." +msgstr "" +"не удалоÑÑŒ Ñоздать жёÑткую ÑÑылку между Ñтарым и новым каталогами данных: " +"%m\n" +"Ð’ режиме \"ÑÑылок\" Ñтарый и новый каталоги данных должны находитьÑÑ Ð² одной " +"файловой ÑиÑтеме." -#: function.c:189 +#: function.c:154 #, c-format msgid "Checking for presence of required libraries" msgstr "Проверка Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÐ¼Ñ‹Ñ… библиотек" -#: function.c:242 +#: function.c:190 #, c-format msgid "could not load library \"%s\": %s" msgstr "загрузить библиотеку \"%s\" не удалоÑÑŒ: %s" -#: function.c:253 +#: function.c:201 #, c-format msgid "In database: %s\n" msgstr "Ð’ базе данных: %s\n" -#: function.c:263 +#: function.c:211 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" "new installation. You can add these libraries to the new installation,\n" "or remove the functions using them from the old installation. A list of\n" "problem libraries is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Ð’ вашей инÑталлÑции еÑть ÑÑылки на загружаемые библиотеки, отÑутÑтвующие\n" "в новой инÑталлÑции. Ð’Ñ‹ можете добавить Ñти библиотеки в новую инÑталлÑцию\n" "или удалить функции, иÑпользующие их, из Ñтарой. СпиÑок проблемных\n" "библиотек приведён в файле:\n" -" %s\n" -"\n" +" %s" -#: info.c:131 +#: info.c:128 #, c-format msgid "" -"Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s" -"\", new name \"%s.%s\"\n" +"Relation names for OID %u in database \"%s\" do not match: old name \"%s." +"%s\", new name \"%s.%s\"" msgstr "" "Имена Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ OID %u в базе данных \"%s\" различаютÑÑ: Ñтарое Ð¸Ð¼Ñ - \"%s." -"%s\", новое - \"%s.%s\"\n" +"%s\", новое - \"%s.%s\"" -#: info.c:151 +#: info.c:148 #, c-format -msgid "Failed to match up old and new tables in database \"%s\"\n" -msgstr "Ðе удалоÑÑŒ ÑопоÑтавить Ñтарые таблицы Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ в базе данных \"%s\"\n" +msgid "Failed to match up old and new tables in database \"%s\"" +msgstr "Ðе удалоÑÑŒ ÑопоÑтавить Ñтарые таблицы Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ в базе данных \"%s\"" -#: info.c:240 +#: info.c:229 #, c-format msgid " which is an index on \"%s.%s\"" msgstr " Ñто Ð¸Ð½Ð´ÐµÐºÑ Ð² \"%s.%s\"" -#: info.c:250 +#: info.c:239 #, c-format msgid " which is an index on OID %u" msgstr " Ñто Ð¸Ð½Ð´ÐµÐºÑ Ð² отношении Ñ OID %u" -#: info.c:262 +#: info.c:251 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr " Ñто TOAST-таблица Ð´Ð»Ñ \"%s.%s\"" -#: info.c:270 +#: info.c:259 #, c-format msgid " which is the TOAST table for OID %u" msgstr " Ñто TOAST-таблица Ð´Ð»Ñ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ OID %u" -#: info.c:274 +#: info.c:263 #, c-format msgid "" -"No match found in old cluster for new relation with OID %u in database \"%s" -"\": %s\n" +"No match found in old cluster for new relation with OID %u in database " +"\"%s\": %s" msgstr "" "Ð’ Ñтаром клаÑтере не нашлоÑÑŒ ÑоответÑÑ‚Ð²Ð¸Ñ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ OID %u в " -"базе данных \"%s\": %s\n" +"базе данных \"%s\": %s" -#: info.c:277 +#: info.c:266 #, c-format msgid "" -"No match found in new cluster for old relation with OID %u in database \"%s" -"\": %s\n" +"No match found in new cluster for old relation with OID %u in database " +"\"%s\": %s" msgstr "" "Ð’ новом клаÑтере не нашлоÑÑŒ ÑоответÑÑ‚Ð²Ð¸Ñ Ð´Ð»Ñ Ñтарого Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñ OID %u в " -"базе данных \"%s\": %s\n" - -#: info.c:289 -#, c-format -msgid "mappings for database \"%s\":\n" -msgstr "Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных \"%s\":\n" - -#: info.c:292 -#, c-format -msgid "%s.%s: %u to %u\n" -msgstr "%s.%s: %u в %u\n" +"базе данных \"%s\": %s" -#: info.c:297 info.c:633 +#: info.c:300 #, c-format msgid "" "\n" -"\n" +"source databases:" msgstr "" "\n" -"\n" +"иÑходные базы данных:" -#: info.c:322 +#: info.c:302 #, c-format msgid "" "\n" -"source databases:\n" +"target databases:" msgstr "" "\n" -"иÑходные базы данных:\n" +"целевые базы данных:" -#: info.c:324 +#: info.c:346 #, c-format -msgid "" -"\n" -"target databases:\n" -msgstr "" -"\n" -"целевые базы данных:\n" +msgid "template0 not found" +msgstr "база template0 не найдена" + +#: info.c:805 +#, c-format +msgid "Database: \"%s\"" +msgstr "База данных: \"%s\"" -#: info.c:631 +#: info.c:818 #, c-format -msgid "Database: %s\n" -msgstr "База данных: %s\n" +msgid "relname: \"%s.%s\", reloid: %u, reltblspace: \"%s\"" +msgstr "имÑ_отношениÑ: \"%s.%s\", oid_отношениÑ: %u, табл_проÑтранÑтво: %s\"" -#: info.c:644 +#: info.c:832 #, c-format -msgid "relname: %s.%s: reloid: %u reltblspace: %s\n" -msgstr "имÑ_отношениÑ: %s.%s: oid_отношениÑ: %u табл_проÑтранÑтво: %s\n" +msgid "Logical replication slots in the database:" +msgstr "Слоты логичеÑкой репликации в базе данных:" -#: option.c:102 +#: info.c:838 #, c-format -msgid "%s: cannot be run as root\n" -msgstr "%s: программу не должен запуÑкать root\n" +msgid "slot name: \"%s\", output plugin: \"%s\", two_phase: %s" +msgstr "Ñлот: \"%s\", модуль вывода: \"%s\", двухфазный: %s" -#: option.c:170 +#: option.c:105 #, c-format -msgid "invalid old port number\n" -msgstr "неверный Ñтарый номер порта\n" +msgid "%s: cannot be run as root" +msgstr "%s: программу не должен запуÑкать root" -#: option.c:175 +#: option.c:172 #, c-format -msgid "invalid new port number\n" -msgstr "неверный новый номер порта\n" +msgid "invalid old port number" +msgstr "неверный Ñтарый номер порта" -#: option.c:207 +#: option.c:177 +#, c-format +msgid "invalid new port number" +msgstr "неверный новый номер порта" + +#: option.c:216 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\".\n" -#: option.c:214 +#: option.c:223 #, c-format -msgid "too many command-line arguments (first is \"%s\")\n" -msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")\n" +msgid "too many command-line arguments (first is \"%s\")" +msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")" -#: option.c:220 +#: option.c:229 #, c-format -msgid "Running in verbose mode\n" -msgstr "Программа запущена в режиме подробных Ñообщений\n" +msgid "Running in verbose mode" +msgstr "Программа запущена в режиме подробных Ñообщений" -#: option.c:251 +#: option.c:247 msgid "old cluster binaries reside" msgstr "раÑположение иÑполнÑемых файлов Ñтарого клаÑтера" -#: option.c:253 +#: option.c:249 msgid "new cluster binaries reside" msgstr "раÑположение иÑполнÑемых файлов нового клаÑтера" -#: option.c:255 +#: option.c:251 msgid "old cluster data resides" msgstr "раÑположение данных Ñтарого клаÑтера" -#: option.c:257 +#: option.c:253 msgid "new cluster data resides" msgstr "раÑположение данных нового клаÑтера" -#: option.c:259 +#: option.c:255 msgid "sockets will be created" msgstr "раÑположение Ñокетов" -#: option.c:276 option.c:374 +#: option.c:272 option.c:374 #, c-format -msgid "could not determine current directory\n" -msgstr "не удалоÑÑŒ определить текущий каталог\n" +msgid "could not determine current directory" +msgstr "не удалоÑÑŒ определить текущий каталог" -#: option.c:279 +#: option.c:275 #, c-format msgid "" -"cannot run pg_upgrade from inside the new cluster data directory on Windows\n" +"cannot run pg_upgrade from inside the new cluster data directory on Windows" msgstr "" -"в Windows Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð¿ÑƒÑтить pg_upgrade внутри каталога данных нового " -"клаÑтера\n" +"в Windows Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð¿ÑƒÑтить pg_upgrade внутри каталога данных нового клаÑтера" -#: option.c:288 +#: option.c:284 #, c-format msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" @@ -1294,12 +1501,12 @@ msgstr "" "pg_upgrade обновлÑет клаÑтер PostgreSQL до другой оÑновной верÑии.\n" "\n" -#: option.c:289 +#: option.c:285 #, c-format msgid "Usage:\n" msgstr "ИÑпользование:\n" -#: option.c:290 +#: option.c:286 #, c-format msgid "" " pg_upgrade [OPTION]...\n" @@ -1308,18 +1515,18 @@ msgstr "" " pg_upgrade [ПÐРÐМЕТР]...\n" "\n" -#: option.c:291 +#: option.c:287 #, c-format msgid "Options:\n" msgstr "Параметры:\n" -#: option.c:292 +#: option.c:288 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" msgstr "" " -b, --old-bindir=КÐТ_BIN каталог иÑполнÑемых файлов Ñтарого клаÑтера\n" -#: option.c:293 +#: option.c:289 #, c-format msgid "" " -B, --new-bindir=BINDIR new cluster executable directory (default\n" @@ -1328,7 +1535,7 @@ msgstr "" " -B, --new-bindir=КÐТ_BIN каталог иÑполнÑемых файлов нового клаÑтера\n" " (по умолчанию каталог программы pg_upgrade)\n" -#: option.c:295 +#: option.c:291 #, c-format msgid "" " -c, --check check clusters only, don't change any data\n" @@ -1336,17 +1543,17 @@ msgstr "" " -c, --check только проверить клаÑтеры, не менÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ " "данные\n" -#: option.c:296 +#: option.c:292 #, c-format msgid " -d, --old-datadir=DATADIR old cluster data directory\n" -msgstr " -d, --old-datadir=КÐТ_DATA каталог данных Ñтарого клаÑтера\n" +msgstr " -d, --old-datadir=КÐТ_ДÐÐÐЫХ каталог данных Ñтарого клаÑтера\n" -#: option.c:297 +#: option.c:293 #, c-format msgid " -D, --new-datadir=DATADIR new cluster data directory\n" -msgstr " -D, --new-datadir=КÐТ_DATA каталог данных нового клаÑтера\n" +msgstr " -D, --new-datadir=КÐТ_ДÐÐÐЫХ каталог данных нового клаÑтера\n" -#: option.c:298 +#: option.c:294 #, c-format msgid "" " -j, --jobs=NUM number of simultaneous processes or threads " @@ -1356,7 +1563,7 @@ msgstr "" "или\n" " потоков\n" -#: option.c:299 +#: option.c:295 #, c-format msgid "" " -k, --link link instead of copying files to new " @@ -1366,7 +1573,16 @@ msgstr "" "файлов\n" " в новый клаÑтер\n" -#: option.c:300 +#: option.c:296 +#, c-format +msgid "" +" -N, --no-sync do not wait for changes to be written safely " +"to disk\n" +msgstr "" +" -N, --no-sync не ждать Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… на " +"диÑке\n" + +#: option.c:297 #, c-format msgid "" " -o, --old-options=OPTIONS old cluster options to pass to the server\n" @@ -1374,7 +1590,7 @@ msgstr "" " -o, --old-options=ПÐРÐМЕТРЫ параметры Ñтарого клаÑтера, передаваемые " "Ñерверу\n" -#: option.c:301 +#: option.c:298 #, c-format msgid "" " -O, --new-options=OPTIONS new cluster options to pass to the server\n" @@ -1382,21 +1598,21 @@ msgstr "" " -O, --new-options=ПÐРÐМЕТРЫ параметры нового клаÑтера, передаваемые " "Ñерверу\n" -#: option.c:302 +#: option.c:299 #, c-format msgid " -p, --old-port=PORT old cluster port number (default %d)\n" msgstr "" " -p, --old-port=ПОРТ номер порта Ñтарого клаÑтера (по умолчанию " "%d)\n" -#: option.c:303 +#: option.c:300 #, c-format msgid " -P, --new-port=PORT new cluster port number (default %d)\n" msgstr "" " -P, --new-port=ПОРТ номер порта нового клаÑтера (по умолчанию " "%d)\n" -#: option.c:304 +#: option.c:301 #, c-format msgid "" " -r, --retain retain SQL and log files after success\n" @@ -1404,7 +1620,7 @@ msgstr "" " -r, --retain Ñохранить файлы журналов и SQL в Ñлучае " "уÑпеха\n" -#: option.c:305 +#: option.c:302 #, c-format msgid "" " -s, --socketdir=DIR socket directory to use (default current " @@ -1412,27 +1628,27 @@ msgid "" msgstr "" " -s, --socketdir=КÐТÐЛОГ каталог Ñокетов (по умолчанию текущий)\n" -#: option.c:306 +#: option.c:303 #, c-format msgid " -U, --username=NAME cluster superuser (default \"%s\")\n" msgstr "" -" -U, --username=ИМЯ Ñуперпользователь клаÑтера (по умолчанию \"%s" -"\")\n" +" -U, --username=ИМЯ Ñуперпользователь клаÑтера (по умолчанию " +"\"%s\")\n" -#: option.c:307 +#: option.c:304 #, c-format msgid " -v, --verbose enable verbose internal logging\n" msgstr "" " -v, --verbose включить вывод подробных внутренних " "Ñообщений\n" -#: option.c:308 +#: option.c:305 #, c-format msgid "" " -V, --version display version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: option.c:309 +#: option.c:306 #, c-format msgid "" " --clone clone instead of copying files to new " @@ -1441,6 +1657,27 @@ msgstr "" " --clone клонировать, а не копировать файлы в новый " "клаÑтер\n" +#: option.c:307 +#, c-format +msgid " --copy copy files to new cluster (default)\n" +msgstr "" +" --copy копировать файлы в новый клаÑтер (по " +"умолчанию)\n" + +#: option.c:308 +#, c-format +msgid "" +" --copy-file-range copy files to new cluster with " +"copy_file_range\n" +msgstr "" +" --copy-file-range копировать файлы в новый клаÑтер, иÑпользуÑ\n" +" функцию copy_file_range\n" + +#: option.c:309 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=МЕТОД метод Ñинхронизации файлов Ñ Ð¤Ð¡\n" + #: option.c:310 #, c-format msgid " -?, --help show this help, then exit\n" @@ -1541,254 +1778,291 @@ msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" #, c-format msgid "" "You must identify the directory where the %s.\n" -"Please use the %s command-line option or the %s environment variable.\n" +"Please use the %s command-line option or the %s environment variable." msgstr "" "Ð’Ñ‹ должны указать каталог, где находитÑÑ %s.\n" "ВоÑпользуйтеÑÑŒ Ð´Ð»Ñ Ñтого ключом командной Ñтроки %s или переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ " -"%s.\n" +"%s." -#: option.c:432 +#: option.c:433 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "ПоиÑк фактичеÑкого каталога данных Ð´Ð»Ñ Ð¸Ñходного клаÑтера" -#: option.c:434 +#: option.c:435 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "ПоиÑк фактичеÑкого каталога данных Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð³Ð¾ клаÑтера" -#: option.c:446 +#: option.c:448 #, c-format -msgid "could not get data directory using %s: %s\n" -msgstr "не удалоÑÑŒ получить каталог данных, выполнив %s: %s\n" +msgid "could not get data directory using %s: %m" +msgstr "не удалоÑÑŒ получить каталог данных, выполнив %s: %m" -#: option.c:505 +#: option.c:452 #, c-format -msgid "could not read line %d from file \"%s\": %s\n" -msgstr "не удалоÑÑŒ прочитать Ñтроку %d из файла \"%s\": %s\n" +msgid "could not get data directory using %s: %s" +msgstr "не удалоÑÑŒ получить каталог данных, выполнив %s: %s" -#: option.c:522 +#: option.c:500 #, c-format -msgid "user-supplied old port number %hu corrected to %hu\n" -msgstr "заданный пользователем Ñтарый номер порта %hu изменён на %hu\n" +msgid "could not read line %d from file \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать Ñтроку %d из файла \"%s\": %m" -#: parallel.c:127 parallel.c:238 +#: option.c:517 #, c-format -msgid "could not create worker process: %s\n" -msgstr "не удалоÑÑŒ Ñоздать рабочий процеÑÑ: %s\n" +msgid "user-supplied old port number %hu corrected to %hu" +msgstr "заданный пользователем Ñтарый номер порта %hu изменён на %hu" -#: parallel.c:146 parallel.c:259 +#: parallel.c:127 parallel.c:235 #, c-format -msgid "could not create worker thread: %s\n" -msgstr "не удалоÑÑŒ Ñоздать рабочий поток: %s\n" +msgid "could not create worker process: %m" +msgstr "не удалоÑÑŒ Ñоздать рабочий процеÑÑ: %m" -#: parallel.c:300 +#: parallel.c:143 parallel.c:253 #, c-format -msgid "%s() failed: %s\n" -msgstr "ошибка в %s(): %s\n" +msgid "could not create worker thread: %m" +msgstr "не удалоÑÑŒ Ñоздать рабочий поток: %m" -#: parallel.c:304 +#: parallel.c:294 #, c-format -msgid "child process exited abnormally: status %d\n" -msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ð½ÐµÑˆÑ‚Ð°Ñ‚Ð½Ð¾ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ %d\n" +msgid "%s() failed: %m" +msgstr "ошибка в %s(): %m" -#: parallel.c:319 +#: parallel.c:298 #, c-format -msgid "child worker exited abnormally: %s\n" -msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ð°Ð²Ð°Ñ€Ð¸Ð¹Ð½Ð¾: %s\n" +msgid "child process exited abnormally: status %d" +msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ð½ÐµÑˆÑ‚Ð°Ñ‚Ð½Ð¾ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ %d" -#: pg_upgrade.c:107 +#: parallel.c:313 #, c-format -msgid "could not read permissions of directory \"%s\": %s\n" -msgstr "не удалоÑÑŒ Ñчитать права на каталог \"%s\": %s\n" +msgid "child worker exited abnormally: %m" +msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ð°Ð²Ð°Ñ€Ð¸Ð¹Ð½Ð¾: %m" -#: pg_upgrade.c:122 +#: pg_upgrade.c:115 +#, c-format +msgid "could not read permissions of directory \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать права на каталог \"%s\": %m" + +#: pg_upgrade.c:147 #, c-format msgid "" "\n" "Performing Upgrade\n" -"------------------\n" +"------------------" msgstr "" "\n" "Выполнение обновлениÑ\n" -"---------------------\n" +"---------------------" -#: pg_upgrade.c:165 +#: pg_upgrade.c:192 #, c-format msgid "Setting next OID for new cluster" msgstr "УÑтановка Ñледующего OID Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера" -#: pg_upgrade.c:172 +#: pg_upgrade.c:216 #, c-format msgid "Sync data directory to disk" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° данных Ñ Ð¤Ð¡" -#: pg_upgrade.c:183 +#: pg_upgrade.c:230 #, c-format msgid "" "\n" "Upgrade Complete\n" -"----------------\n" +"----------------" msgstr "" "\n" "Обновление завершено\n" -"--------------------\n" +"--------------------" -#: pg_upgrade.c:216 +#: pg_upgrade.c:263 pg_upgrade.c:276 pg_upgrade.c:283 pg_upgrade.c:290 +#: pg_upgrade.c:308 pg_upgrade.c:319 +#, c-format +msgid "directory path for new cluster is too long" +msgstr "путь к каталогу данных нового клаÑтера Ñлишком длинный" + +#: pg_upgrade.c:297 pg_upgrade.c:299 pg_upgrade.c:301 pg_upgrade.c:303 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m" + +#: pg_upgrade.c:352 #, c-format -msgid "%s: could not find own program executable\n" -msgstr "%s: не удалоÑÑŒ найти Ñвой иÑполнÑемый файл\n" +msgid "%s: could not find own program executable" +msgstr "%s: не удалоÑÑŒ найти Ñвой иÑполнÑемый файл" -#: pg_upgrade.c:242 +#: pg_upgrade.c:378 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" -"Please shutdown that postmaster and try again.\n" +"Please shutdown that postmaster and try again." msgstr "" "Видимо, запущен процеÑÑ postmaster, обÑлуживающий Ñтарый клаÑтер.\n" -"ОÑтановите его и попробуйте ещё раз.\n" +"ОÑтановите его и попробуйте ещё раз." -#: pg_upgrade.c:255 +#: pg_upgrade.c:391 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" -"Please shutdown that postmaster and try again.\n" +"Please shutdown that postmaster and try again." msgstr "" "Видимо, запущен процеÑÑ postmaster, обÑлуживающий новый клаÑтер.\n" -"ОÑтановите его и попробуйте ещё раз.\n" +"ОÑтановите его и попробуйте ещё раз." -#: pg_upgrade.c:269 +#: pg_upgrade.c:413 +#, c-format +msgid "Setting locale and encoding for new cluster" +msgstr "УÑтановка локали и кодировки Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера" + +#: pg_upgrade.c:491 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Ðнализ вÑех Ñтрок в новом клаÑтере" -#: pg_upgrade.c:282 +#: pg_upgrade.c:504 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Замораживание вÑех Ñтрок в новом клаÑтере" -#: pg_upgrade.c:302 +#: pg_upgrade.c:524 #, c-format msgid "Restoring global objects in the new cluster" msgstr "ВоÑÑтановление глобальных объектов в новом клаÑтере" -#: pg_upgrade.c:317 +#: pg_upgrade.c:540 #, c-format -msgid "Restoring database schemas in the new cluster\n" -msgstr "ВоÑÑтановление Ñхем баз данных в новом клаÑтере\n" +msgid "Restoring database schemas in the new cluster" +msgstr "ВоÑÑтановление Ñхем баз данных в новом клаÑтере" -#: pg_upgrade.c:421 +#: pg_upgrade.c:664 #, c-format msgid "Deleting files from new %s" msgstr "Удаление файлов из нового каталога %s" -#: pg_upgrade.c:425 +#: pg_upgrade.c:668 #, c-format -msgid "could not delete directory \"%s\"\n" -msgstr "ошибка при удалении каталога \"%s\"\n" +msgid "could not delete directory \"%s\"" +msgstr "ошибка при удалении каталога \"%s\"" -#: pg_upgrade.c:444 +#: pg_upgrade.c:687 #, c-format msgid "Copying old %s to new server" msgstr "Копирование Ñтарого каталога %s на новый Ñервер" -#: pg_upgrade.c:470 +#: pg_upgrade.c:713 #, c-format msgid "Setting oldest XID for new cluster" msgstr "УÑтановка Ñтарейшего OID Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера" -#: pg_upgrade.c:478 +#: pg_upgrade.c:721 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "" "УÑтановка Ñледующего идентификатора транзакции и Ñпохи Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера" -#: pg_upgrade.c:508 +#: pg_upgrade.c:751 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "" "УÑтановка Ñледующего идентификатора и ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ " "клаÑтера" -#: pg_upgrade.c:532 +#: pg_upgrade.c:775 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "УÑтановка Ñтарейшего идентификатора мультитранзакции в новом клаÑтере" -#: pg_upgrade.c:552 +#: pg_upgrade.c:795 #, c-format msgid "Resetting WAL archives" msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð¾Ð² WAL" -#: pg_upgrade.c:595 +#: pg_upgrade.c:838 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "УÑтановка Ñчётчиков frozenxid и minmxid в новом клаÑтере" -#: pg_upgrade.c:597 +#: pg_upgrade.c:840 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "УÑтановка Ñчётчика minmxid в новом клаÑтере" -#: relfilenode.c:35 +#: pg_upgrade.c:931 +#, c-format +msgid "Restoring logical replication slots in the new cluster" +msgstr "ВоÑÑтановление Ñлотов логичеÑкой репликации в новом клаÑтере" + +#: relfilenumber.c:35 #, c-format -msgid "Cloning user relation files\n" -msgstr "Клонирование файлов пользовательÑких отношений\n" +msgid "Cloning user relation files" +msgstr "Клонирование файлов пользовательÑких отношений" -#: relfilenode.c:38 +#: relfilenumber.c:38 #, c-format -msgid "Copying user relation files\n" -msgstr "Копирование файлов пользовательÑких отношений\n" +msgid "Copying user relation files" +msgstr "Копирование файлов пользовательÑких отношений" -#: relfilenode.c:41 +#: relfilenumber.c:41 #, c-format -msgid "Linking user relation files\n" -msgstr "Подключение файлов пользовательÑких отношений ÑÑылками\n" +msgid "Copying user relation files with copy_file_range" +msgstr "" +"Копирование файлов пользовательÑких отношений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ copy_file_range" + +#: relfilenumber.c:44 +#, c-format +msgid "Linking user relation files" +msgstr "Подключение файлов пользовательÑких отношений ÑÑылками" -#: relfilenode.c:115 +#: relfilenumber.c:118 #, c-format -msgid "old database \"%s\" not found in the new cluster\n" -msgstr "ÑÑ‚Ð°Ñ€Ð°Ñ Ð±Ð°Ð·Ð° данных \"%s\" не найдена в новом клаÑтере\n" +msgid "old database \"%s\" not found in the new cluster" +msgstr "ÑÑ‚Ð°Ñ€Ð°Ñ Ð±Ð°Ð·Ð° данных \"%s\" не найдена в новом клаÑтере" -#: relfilenode.c:230 +#: relfilenumber.c:221 #, c-format msgid "" -"error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n" +"error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %m" msgstr "" -"ошибка при проверке ÑущеÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ \"%s.%s\" (Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ \"%s\" " -"в \"%s\"): %s\n" +"ошибка при проверке ÑущеÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s.%s\" (Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ \"%s\" в \"%s\"): " +"%m" + +#: relfilenumber.c:238 +#, c-format +msgid "rewriting \"%s\" to \"%s\"" +msgstr "перепиÑывание \"%s\" в \"%s\"" -#: relfilenode.c:248 +#: relfilenumber.c:246 #, c-format -msgid "rewriting \"%s\" to \"%s\"\n" -msgstr "перепиÑывание \"%s\" в \"%s\"\n" +msgid "cloning \"%s\" to \"%s\"" +msgstr "клонирование \"%s\" в \"%s\"" -#: relfilenode.c:256 +#: relfilenumber.c:251 #, c-format -msgid "cloning \"%s\" to \"%s\"\n" -msgstr "клонирование \"%s\" в \"%s\"\n" +msgid "copying \"%s\" to \"%s\"" +msgstr "копирование \"%s\" в \"%s\"" -#: relfilenode.c:261 +#: relfilenumber.c:256 #, c-format -msgid "copying \"%s\" to \"%s\"\n" -msgstr "копирование \"%s\" в \"%s\"\n" +msgid "copying \"%s\" to \"%s\" with copy_file_range" +msgstr "копирование \"%s\" в \"%s\" Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ copy_file_range" -#: relfilenode.c:266 +#: relfilenumber.c:261 #, c-format -msgid "linking \"%s\" to \"%s\"\n" -msgstr "Ñоздание ÑÑылки на \"%s\" в \"%s\"\n" +msgid "linking \"%s\" to \"%s\"" +msgstr "Ñоздание ÑÑылки на \"%s\" в \"%s\"" -#: server.c:38 server.c:142 util.c:135 util.c:165 +#: server.c:39 server.c:143 util.c:248 util.c:278 #, c-format msgid "Failure, exiting\n" msgstr "Ошибка, выполнÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´\n" -#: server.c:132 +#: server.c:133 #, c-format -msgid "executing: %s\n" -msgstr "выполнÑетÑÑ: %s\n" +msgid "executing: %s" +msgstr "выполнÑетÑÑ: %s" -#: server.c:138 +#: server.c:139 #, c-format msgid "" "SQL command failed\n" @@ -1799,17 +2073,17 @@ msgstr "" "%s\n" "%s" -#: server.c:168 +#: server.c:169 #, c-format -msgid "could not open version file \"%s\": %m\n" -msgstr "не удалоÑÑŒ открыть файл Ñ Ð²ÐµÑ€Ñией \"%s\": %m\n" +msgid "could not open version file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл Ñ Ð²ÐµÑ€Ñией \"%s\": %m" -#: server.c:172 +#: server.c:173 #, c-format -msgid "could not parse version file \"%s\"\n" -msgstr "не удалоÑÑŒ разобрать файл Ñ Ð²ÐµÑ€Ñией \"%s\"\n" +msgid "could not parse version file \"%s\"" +msgstr "не удалоÑÑŒ разобрать файл Ñ Ð²ÐµÑ€Ñией \"%s\"" -#: server.c:298 +#: server.c:310 #, c-format msgid "" "\n" @@ -1818,217 +2092,117 @@ msgstr "" "\n" "%s" -#: server.c:302 +#: server.c:314 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" -"%s\n" +"%s" msgstr "" "не удалоÑÑŒ подключитьÑÑ Ðº главному процеÑÑу иÑходного Ñервера, запущенному " "командой:\n" -"%s\n" +"%s" -#: server.c:306 +#: server.c:318 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" -"%s\n" +"%s" msgstr "" "не удалоÑÑŒ подключитьÑÑ Ðº главному процеÑÑу целевого Ñервера, запущенному " "командой:\n" -"%s\n" +"%s" -#: server.c:320 +#: server.c:332 #, c-format -msgid "pg_ctl failed to start the source server, or connection failed\n" +msgid "pg_ctl failed to start the source server, or connection failed" msgstr "" "программа pg_ctl не Ñмогла запуÑтить иÑходный Ñервер, либо к нему не удалоÑÑŒ " -"подключитьÑÑ\n" +"подключитьÑÑ" -#: server.c:322 +#: server.c:334 #, c-format -msgid "pg_ctl failed to start the target server, or connection failed\n" +msgid "pg_ctl failed to start the target server, or connection failed" msgstr "" "программа pg_ctl не Ñмогла запуÑтить целевой Ñервер, либо к нему не удалоÑÑŒ " -"подключитьÑÑ\n" +"подключитьÑÑ" -#: server.c:367 +#: server.c:379 #, c-format -msgid "out of memory\n" -msgstr "нехватка памÑти\n" +msgid "out of memory" +msgstr "нехватка памÑти" -#: server.c:380 +#: server.c:392 #, c-format -msgid "libpq environment variable %s has a non-local server value: %s\n" -msgstr "в переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ libpq %s задано не локальное значение: %s\n" +msgid "libpq environment variable %s has a non-local server value: %s" +msgstr "" +"в переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ %s Ð´Ð»Ñ libpq указан Ð°Ð´Ñ€ÐµÑ Ð½Ðµ локального Ñервера: %s" #: tablespace.c:28 #, c-format msgid "" "Cannot upgrade to/from the same system catalog version when\n" -"using tablespaces.\n" +"using tablespaces." msgstr "" "Обновление в рамках одной верÑии ÑиÑтемного каталога невозможно,\n" -"еÑли иÑпользуютÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ñ‹Ðµ проÑтранÑтва.\n" +"еÑли иÑпользуютÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ñ‹Ðµ проÑтранÑтва." -#: tablespace.c:86 +#: tablespace.c:83 #, c-format -msgid "tablespace directory \"%s\" does not exist\n" -msgstr "каталог табличного проÑтранÑтва \"%s\" не ÑущеÑтвует\n" +msgid "tablespace directory \"%s\" does not exist" +msgstr "каталог табличного проÑтранÑтва \"%s\" не ÑущеÑтвует" -#: tablespace.c:90 +#: tablespace.c:87 #, c-format -msgid "could not stat tablespace directory \"%s\": %s\n" +msgid "could not stat tablespace directory \"%s\": %m" msgstr "" -"не удалоÑÑŒ получить информацию о каталоге табличного проÑтранÑтва \"%s\": " -"%s\n" - -#: tablespace.c:95 -#, c-format -msgid "tablespace path \"%s\" is not a directory\n" -msgstr "путь табличного проÑтранÑтва \"%s\" не указывает на каталог\n" +"не удалоÑÑŒ получить информацию о каталоге табличного проÑтранÑтва \"%s\": %m" -#: util.c:49 +#: tablespace.c:92 #, c-format -msgid " " -msgstr " " +msgid "tablespace path \"%s\" is not a directory" +msgstr "путь табличного проÑтранÑтва \"%s\" не указывает на каталог" -#: util.c:82 +#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172 #, c-format msgid "%-*s" msgstr "%-*s" -#: util.c:174 +#: util.c:107 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "ошибка при обращении к каталогу \"%s\": %m" + +#: util.c:287 #, c-format msgid "ok" msgstr "ок" -#: version.c:29 +#: version.c:44 #, c-format -msgid "Checking for large objects" -msgstr "Проверка больших объектов" +msgid "Checking for hash indexes" +msgstr "Проверка хеш-индекÑов" -#: version.c:77 version.c:419 +#: version.c:121 #, c-format msgid "warning" msgstr "предупреждение" -#: version.c:79 -#, c-format -msgid "" -"\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table. After upgrading, you will be\n" -"given a command to populate the pg_largeobject_metadata table with\n" -"default permissions.\n" -"\n" -msgstr "" -"\n" -"Ð’ вашей инÑталлÑции иÑпользуютÑÑ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ðµ объекты. Ð’ новой базе данных\n" -"имеетÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов. ПоÑле " -"обновлениÑ\n" -"вам будет предÑтавлена команда Ð´Ð»Ñ Ð½Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ прав\n" -"pg_largeobject_metadata правами по умолчанию.\n" -"\n" - -#: version.c:85 -#, c-format -msgid "" -"\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table, so default permissions must be\n" -"defined for all large objects. The file\n" -" %s\n" -"when executed by psql by the database superuser will set the default\n" -"permissions.\n" -"\n" -msgstr "" -"\n" -"Ð’ вашей инÑталлÑции иÑпользуютÑÑ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ðµ объекты. Ð’ новой базе данных\n" -"имеетÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов, поÑтому\n" -"Ð´Ð»Ñ Ð²Ñех больших объектов должны определÑтьÑÑ Ð¿Ñ€Ð°Ð²Ð° по умолчанию. Скрипт\n" -" %s\n" -"будучи выполненным админиÑтратором БД в psql, уÑтановит нужные права\n" -"по умолчанию.\n" -"\n" - -#: version.c:272 -#, c-format -msgid "Checking for incompatible \"line\" data type" -msgstr "Проверка неÑовмеÑтимого типа данных \"line\"" - -#: version.c:279 -#, c-format -msgid "" -"Your installation contains the \"line\" data type in user tables.\n" -"This data type changed its internal and input/output format\n" -"between your old and new versions so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных \"line" -"\".\n" -"Ð’ Ñтаром клаÑтере внутренний формат и формат ввода/вывода Ñтого типа " -"отличаетÑÑ\n" -"от нового, поÑтому в наÑтоÑщем ÑоÑтоÑнии обновить клаÑтер невозможно. Ð’Ñ‹ " -"можете\n" -"удалить проблемные Ñтолбцы и перезапуÑтить обновление. СпиÑок проблемных\n" -"Ñтолбцов приведён в файле:\n" -" %s\n" -"\n" - -#: version.c:310 -#, c-format -msgid "Checking for invalid \"unknown\" user columns" -msgstr "Проверка неправильных пользовательÑких Ñтолбцов типа \"unknown\"" - -#: version.c:317 -#, c-format -msgid "" -"Your installation contains the \"unknown\" data type in user tables.\n" -"This data type is no longer allowed in tables, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных \"unknown" -"\".\n" -"Теперь иÑпользование Ñтого типа данных в таблицах не допуÑкаетÑÑ, поÑтому\n" -"в наÑтоÑщем ÑоÑтоÑнии обновить клаÑтер невозможно. Ð’Ñ‹ можете удалить " -"проблемные\n" -"Ñтолбцы и перезапуÑтить обновление. СпиÑок проблемных Ñтолбцов приведён в " -"файле:\n" -" %s\n" -"\n" - -#: version.c:341 -#, c-format -msgid "Checking for hash indexes" -msgstr "Проверка хеш-индекÑов" - -#: version.c:421 +#: version.c:123 #, c-format msgid "" "\n" "Your installation contains hash indexes. These indexes have different\n" "internal formats between your old and new clusters, so they must be\n" "reindexed with the REINDEX command. After upgrading, you will be given\n" -"REINDEX instructions.\n" -"\n" +"REINDEX instructions." msgstr "" "\n" "Ð’ вашей инÑталлÑции иÑпользуютÑÑ Ñ…ÐµÑˆ-индекÑÑ‹. Эти индекÑÑ‹ имеют разные\n" "внутренние форматы в Ñтаром и новом клаÑтерах, поÑтому их необходимо\n" "переÑтроить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды REINDEX. По завершении Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñ‹ получите\n" -"инÑтрукции по выполнению REINDEX.\n" -"\n" +"инÑтрукции по выполнению REINDEX." -#: version.c:427 +#: version.c:129 #, c-format msgid "" "\n" @@ -2037,8 +2211,7 @@ msgid "" "reindexed with the REINDEX command. The file\n" " %s\n" "when executed by psql by the database superuser will recreate all invalid\n" -"indexes; until then, none of these indexes will be used.\n" -"\n" +"indexes; until then, none of these indexes will be used." msgstr "" "\n" "Ð’ вашей инÑталлÑции иÑпользуютÑÑ Ñ…ÐµÑˆ-индекÑÑ‹. Эти индекÑÑ‹ имеют разные\n" @@ -2046,45 +2219,19 @@ msgstr "" "переÑтроить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды REINDEX. Скрипт\n" " %s\n" "будучи выполненным админиÑтратором БД в psql, переÑоздаÑÑ‚ вÑе неправильные\n" -"индекÑÑ‹; до Ñтого никакие хеш-индекÑÑ‹ не будут иÑпользоватьÑÑ.\n" -"\n" - -#: version.c:453 -#, c-format -msgid "Checking for invalid \"sql_identifier\" user columns" -msgstr "" -"Проверка неправильных пользовательÑких Ñтолбцов типа \"sql_identifier\"" - -#: version.c:461 -#, c-format -msgid "" -"Your installation contains the \"sql_identifier\" data type in user tables.\n" -"The on-disk format for this data type has changed, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Ð’ вашей инÑталлÑции пользовательÑкие таблицы иÑпользуют тип данных\n" -"\"sql_identifier\". Формат Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð°ÐºÐ¸Ñ… данных на диÑке поменÑлÑÑ,\n" -"поÑтому обновить данный клаÑтер невозможно. Ð’Ñ‹ можете удалить проблемные\n" -"Ñтолбцы и перезапуÑтить обновление.\n" -"СпиÑок проблемных Ñтолбцов приведён в файле:\n" -" %s\n" -"\n" +"индекÑÑ‹; до Ñтого никакие хеш-индекÑÑ‹ не будут иÑпользоватьÑÑ." -#: version.c:485 +#: version.c:153 #, c-format msgid "Checking for extension updates" msgstr "Проверка обновлённых раÑширений" -#: version.c:537 +#: version.c:200 #, c-format msgid "notice" msgstr "замечание" -#: version.c:538 +#: version.c:201 #, c-format msgid "" "\n" @@ -2092,16 +2239,210 @@ msgid "" "with the ALTER EXTENSION command. The file\n" " %s\n" "when executed by psql by the database superuser will update\n" -"these extensions.\n" -"\n" +"these extensions." msgstr "" "\n" "Ð’ вашей инÑталлÑции еÑть раÑширениÑ, которые надо обновить\n" "командой ALTER EXTENSION. Скрипт\n" " %s\n" "будучи выполненным админиÑтратором БД в psql, обновит вÑе\n" -"Ñти раÑширениÑ.\n" -"\n" +"Ñти раÑширениÑ." + +#, c-format +#~ msgid "Checking for incompatible \"jsonb\" data type" +#~ msgstr "Проверка неÑовмеÑтимого типа данных \"jsonb\"" + +#, c-format +#~ msgid "" +#~ "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" +#~ msgstr "" +#~ "кодировки в базе данных \"%s\" различаютÑÑ: ÑÑ‚Ð°Ñ€Ð°Ñ - \"%s\", Ð½Ð¾Ð²Ð°Ñ - " +#~ "\"%s\"\n" + +#, c-format +#~ msgid "" +#~ "lc_collate values for database \"%s\" do not match: old \"%s\", new " +#~ "\"%s\"\n" +#~ msgstr "" +#~ "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ lc_collate в базе данных \"%s\" различаютÑÑ: Ñтарое - \"%s\", " +#~ "новое - \"%s\"\n" + +#, c-format +#~ msgid "" +#~ "lc_ctype values for database \"%s\" do not match: old \"%s\", new " +#~ "\"%s\"\n" +#~ msgstr "" +#~ "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ lc_ctype в базе данных \"%s\" различаютÑÑ: Ñтарое - \"%s\", " +#~ "новое - \"%s\"\n" + +#, c-format +#~ msgid "" +#~ "locale providers for database \"%s\" do not match: old \"%s\", new " +#~ "\"%s\"\n" +#~ msgstr "" +#~ "провайдеры локали в базе данных \"%s\" различаютÑÑ: Ñтарый - \"%s\", " +#~ "новый - \"%s\"\n" + +#, c-format +#~ msgid "" +#~ "ICU locale values for database \"%s\" do not match: old \"%s\", new " +#~ "\"%s\"\n" +#~ msgstr "" +#~ "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ ICU Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных \"%s\" различаютÑÑ: Ñтарое - \"%s\", " +#~ "новое - \"%s\"\n" + +#, c-format +#~ msgid "The source cluster contains roles starting with \"pg_\"\n" +#~ msgstr "Ð’ иÑходном клаÑтере еÑть роли, имена которых начинаютÑÑ Ñ \"pg_\"\n" + +#, c-format +#~ msgid "The target cluster contains roles starting with \"pg_\"\n" +#~ msgstr "Ð’ целевом клаÑтере еÑть роли, имена которых начинаютÑÑ Ñ \"pg_\"\n" + +#, c-format +#~ msgid "failed to get the current locale\n" +#~ msgstr "не удалоÑÑŒ получить текущую локаль\n" + +#, c-format +#~ msgid "failed to get system locale name for \"%s\"\n" +#~ msgstr "не удалоÑÑŒ получить ÑиÑтемное Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»Ð¸ Ð´Ð»Ñ \"%s\"\n" + +#, c-format +#~ msgid "failed to restore old locale \"%s\"\n" +#~ msgstr "не удалоÑÑŒ воÑÑтановить Ñтарую локаль \"%s\"\n" + +#, c-format +#~ msgid "Unable to rename %s to %s.\n" +#~ msgstr "Ðе удалоÑÑŒ переименовать %s в %s.\n" + +#, c-format +#~ msgid "%s\n" +#~ msgstr "%s\n" + +#, c-format +#~ msgid "check for \"%s\" failed: not a regular file\n" +#~ msgstr "программа \"%s\" не прошла проверку: Ñто не обычный файл\n" + +#, c-format +#~ msgid "check for \"%s\" failed: cannot execute (permission denied)\n" +#~ msgstr "" +#~ "программа \"%s\" не прошла проверку: ошибка Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ (нет доÑтупа)\n" + +#, c-format +#~ msgid "" +#~ "\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "\n" + +#, c-format +#~ msgid "%-*s\n" +#~ msgstr "%-*s\n" + +#~ msgid "" +#~ "When checking a pre-PG 9.1 live old server, you must specify the old " +#~ "server's port number.\n" +#~ msgstr "" +#~ "Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ Ñтарого работающего Ñервера верÑии до 9.1 необходимо указать " +#~ "номер порта Ñтого Ñервера.\n" + +#~ msgid "" +#~ "All non-template0 databases must allow connections, i.e. their " +#~ "pg_database.datallowconn must be true\n" +#~ msgstr "" +#~ "Ð’Ñе базы, кроме template0, должны допуÑкать подключениÑ, то еÑть их " +#~ "ÑвойÑтво pg_database.datallowconn должно быть true\n" + +#~ msgid "" +#~ "\n" +#~ "The old cluster has a \"plpython_call_handler\" function defined\n" +#~ "in the \"public\" schema which is a duplicate of the one defined\n" +#~ "in the \"pg_catalog\" schema. You can confirm this by executing\n" +#~ "in psql:\n" +#~ "\n" +#~ " \\df *.plpython_call_handler\n" +#~ "\n" +#~ "The \"public\" schema version of this function was created by a\n" +#~ "pre-8.1 install of plpython, and must be removed for pg_upgrade\n" +#~ "to complete because it references a now-obsolete \"plpython\"\n" +#~ "shared object file. You can remove the \"public\" schema version\n" +#~ "of this function by running the following command:\n" +#~ "\n" +#~ " DROP FUNCTION public.plpython_call_handler()\n" +#~ "\n" +#~ "in each affected database:\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Ð’ Ñтаром клаÑтере имеетÑÑ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"plpython_call_handler\",\n" +#~ "Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ð°Ñ Ð² Ñхеме \"public\", предÑтавлÑÑŽÑ‰Ð°Ñ Ñобой копию функции,\n" +#~ "определённой в Ñхеме \"pg_catalog\". Ð’Ñ‹ можете убедитьÑÑ Ð² Ñтом,\n" +#~ "выполнив в psql:\n" +#~ "\n" +#~ " \\df *.plpython_call_handler\n" +#~ "\n" +#~ "ВерÑÐ¸Ñ Ñтой функции в Ñхеме \"public\" была Ñоздана инÑталлÑцией\n" +#~ "plpython верÑии до 8.1 и должна быть удалена Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹\n" +#~ "pg_upgrade, так как она ÑÑылаетÑÑ Ð½Ð° Ñтавший уÑтаревшим\n" +#~ "разделÑемый объектный файл \"plpython\". Ð’Ñ‹ можете удалить верÑию Ñтой " +#~ "функции\n" +#~ "из Ñхемы \"public\", выполнив Ñледующую команду:\n" +#~ "\n" +#~ " DROP FUNCTION public.plpython_call_handler()\n" +#~ "\n" +#~ "в каждой затронутой базе данных:\n" +#~ "\n" + +#~ msgid " %s\n" +#~ msgstr " %s\n" + +#~ msgid "Remove the problem functions from the old cluster to continue.\n" +#~ msgstr "Удалите проблемные функции из Ñтарого клаÑтера Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ.\n" + +#~ msgid "mappings for database \"%s\":\n" +#~ msgstr "Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных \"%s\":\n" + +#~ msgid "%s.%s: %u to %u\n" +#~ msgstr "%s.%s: %u в %u\n" + +#~ msgid " " +#~ msgstr " " + +#~ msgid "" +#~ "\n" +#~ "Your installation contains large objects. The new database has an\n" +#~ "additional large object permission table. After upgrading, you will be\n" +#~ "given a command to populate the pg_largeobject_metadata table with\n" +#~ "default permissions.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Ð’ вашей инÑталлÑции иÑпользуютÑÑ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ðµ объекты. Ð’ новой базе данных\n" +#~ "имеетÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов. ПоÑле " +#~ "обновлениÑ\n" +#~ "вам будет предÑтавлена команда Ð´Ð»Ñ Ð½Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ прав\n" +#~ "pg_largeobject_metadata правами по умолчанию.\n" +#~ "\n" + +#~ msgid "" +#~ "\n" +#~ "Your installation contains large objects. The new database has an\n" +#~ "additional large object permission table, so default permissions must be\n" +#~ "defined for all large objects. The file\n" +#~ " %s\n" +#~ "when executed by psql by the database superuser will set the default\n" +#~ "permissions.\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "Ð’ вашей инÑталлÑции иÑпользуютÑÑ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ðµ объекты. Ð’ новой базе данных\n" +#~ "имеетÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов, поÑтому\n" +#~ "Ð´Ð»Ñ Ð²Ñех больших объектов должны определÑтьÑÑ Ð¿Ñ€Ð°Ð²Ð° по умолчанию. Скрипт\n" +#~ " %s\n" +#~ "будучи выполненным админиÑтратором БД в psql, уÑтановит нужные права\n" +#~ "по умолчанию.\n" +#~ "\n" #~ msgid "Creating script to analyze new cluster" #~ msgstr "Создание Ñкрипта Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° нового клаÑтера" diff --git a/src/bin/pg_upgrade/po/sv.po b/src/bin/pg_upgrade/po/sv.po index 5ad54f47d0270..51ad41bff555c 100644 --- a/src/bin/pg_upgrade/po/sv.po +++ b/src/bin/pg_upgrade/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_upgrade # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-19 03:18+0000\n" -"PO-Revision-Date: 2022-05-19 05:34+0200\n" +"POT-Creation-Date: 2025-02-12 13:50+0000\n" +"PO-Revision-Date: 2025-02-12 20:38+0100\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,227 +17,424 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: check.c:71 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "slut pÃ¥ minne\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kan inte duplicera null-pekare (internt fel)\n" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "kunde inte hämta statuskod för underprocess: felkod %lu" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "kunde inte slÃ¥ upp effektivt användar-id %ld: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "användaren finns inte" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "misslyckad sökning efter användarnamn: felkod %lu" + +#: ../../fe_utils/string_utils.c:608 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "shell-kommandots argument innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:781 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "databasnamnet innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: check.c:111 +msgid "Checking for system-defined composite types in user tables" +msgstr "Letar i användartabeller efter systemdefinierade typer av sorten \"composite\"" + +#: check.c:118 +msgid "" +"Your installation contains system-defined composite types in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"Din installation innehÃ¥ller användartabeller med systemdefinierade typer\n" +"av sorten \"composite\". OID:er för dessa typer är inte stabila över\n" +"PostgreSQL-versioner sÃ¥ detta kluster kan inte uppgraderas för tillfället.\n" +"Du kan slänga problemkolumnerna och Ã¥terstarta uppgraderingen.\n" + +#: check.c:132 +msgid "Checking for incompatible \"line\" data type" +msgstr "Letar efter inkompatibel \"line\"-datatyp" + +#: check.c:137 +msgid "" +"Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"Din installation innehÃ¥ller datatypen \"line\" i användartabeller. Denna\n" +"datatype har ändrat sitt interna format samt sitt in/ut-format mellan din\n" +"gamla och nya version sÃ¥ detta kluster kan för närvarande inte uppgraderas.\n" +"Du kan radera problemkolumnerna och Ã¥terstarta uppgraderingen.\n" + +# FIXME: is this msgid correct? +#: check.c:154 +msgid "Checking for reg* data types in user tables" +msgstr "Letar efter reg*-datatyper i användartabeller" + +#: check.c:181 +msgid "" +"Your installation contains one of the reg* data types in user tables.\n" +"These data types reference system OIDs that are not preserved by\n" +"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "" +"Din installation använder en av reg*-datatyperna i en användartabell.\n" +"Dessa datatyper refererar system-OID:er som inte bevaras av pg_upgrade\n" +"sÃ¥ detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n" +"problemkolumnerna och starta om uppgraderingen.\n" + +#: check.c:193 +msgid "Checking for incompatible \"aclitem\" data type" +msgstr "Letar efter inkompatibel datatype \"aclitem\"" + +#: check.c:198 +msgid "" +"Your installation contains the \"aclitem\" data type in user tables.\n" +"The internal format of \"aclitem\" changed in PostgreSQL version 16\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "" +"Din installation innehÃ¥ller datatypen \"aclitem\" i användartabeller.\n" +"Interna formatet för \"aclitem\" ändrades i PostgreSQL 16 sÃ¥ detta kluster\n" +"kan för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna\n" +"och starta om uppgraderingen.\n" + +#: check.c:217 +msgid "Checking for invalid \"unknown\" user columns" +msgstr "Letar efter ogiltiga användarkolumner av typen \"unknown\"" + +#: check.c:222 +msgid "" +"Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this cluster\n" +"cannot currently be upgraded. You can drop the problem columns\n" +"and restart the upgrade.\n" +msgstr "" +"Din installation innehÃ¥ller datatypen \"unknown\" i användartabeller.\n" +"Denna datatyp tillÃ¥ts inte längre i tabeller sÃ¥ detta kluster kan\n" +"för närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n" +"Ã¥terstarta uppgraderingen.\n" + +#: check.c:239 +msgid "Checking for invalid \"sql_identifier\" user columns" +msgstr "Letar efter ogiltiga användarkolumner av typen \"sql_identifier\"" + +#: check.c:244 +msgid "" +"Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can drop the problem\n" +"columns and restart the upgrade.\n" +msgstr "" +"Din installation innehÃ¥ller datatypen \"sql_identifier\" i användartabeller.\n" +"Formatet pÃ¥ disk för denna datatyp har ändrats sÃ¥ detta kluster kan för\n" +"närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n" +"Ã¥terstarta uppgraderingen.\n" + +#: check.c:255 +msgid "Checking for incompatible \"jsonb\" data type in user tables" +msgstr "Letar efter inkompatibel datatyp \"jsonb\"-datatyp i användartabeller" + +#: check.c:260 +msgid "" +"Your installation contains the \"jsonb\" data type in user tables.\n" +"The internal format of \"jsonb\" changed during 9.4 beta so this\n" +"cluster cannot currently be upgraded. You can drop the problem \n" +"columns and restart the upgrade.\n" +msgstr "" +"Din installation innehÃ¥ller datatypen \"jsonb\" i användartabeller.\n" +"Interna formatet för \"jsonb\" ändrades under 9.4-betan sÃ¥ detta kluster kan\n" +"för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna och\n" +"starta om uppgraderingen.\n" + +#: check.c:272 +msgid "Checking for removed \"abstime\" data type in user tables" +msgstr "Letar efter borttagen datatype \"abstime\" i användartabeller" + +#: check.c:277 +msgid "" +"Your installation contains the \"abstime\" data type in user tables.\n" +"The \"abstime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Din installation innehÃ¥ller datatypen \"abstime\" i användartabeller.\n" +"Datatypen \"abstime\" togs bort i PostgreSQL version 12 sÃ¥ detta kluster\n" +"kan för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna\n" +"eller ändra dem till en annan datatype och starta om uppgraderingen.\n" + +#: check.c:285 +msgid "Checking for removed \"reltime\" data type in user tables" +msgstr "Letar efter borttagen datatype \"reltime\" i användartabeller" + +#: check.c:290 +msgid "" +"Your installation contains the \"reltime\" data type in user tables.\n" +"The \"reltime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Din installation innehÃ¥ller datatypen \"reltime\" i användartabeller.\n" +"Datatypen \"reltime\" togs bort i PostgreSQL version 12 sÃ¥ detta kluster\n" +"kan för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna\n" +"eller ändra dem till en annan datatype och starta om uppgraderingen.\n" + +#: check.c:298 +msgid "Checking for removed \"tinterval\" data type in user tables" +msgstr "Letar efter borttagen datatype \"tinterval\" i användartabeller" + +#: check.c:303 +msgid "" +"Your installation contains the \"tinterval\" data type in user tables.\n" +"The \"tinterval\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "" +"Din installation innehÃ¥ller datatypen \"tinterval\" i användartabeller.\n" +"Datatypen \"tinterval\" togs bort i PostgreSQL version 12 sÃ¥ detta kluster\n" +"kan för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna\n" +"eller ändra dem till en annan datatype och starta om uppgraderingen.\n" + +#: check.c:345 +#, c-format +msgid "Checking data type usage" +msgstr "Letar efter användning av datatyp" + +#: check.c:480 +#, c-format +msgid "failed check: %s" +msgstr "misslyckad kontroll: %s" + +#: check.c:483 +msgid "A list of the problem columns is in the file:" +msgstr "En lista med problemkolumner finns i filen:" + +#: check.c:495 check.c:963 check.c:1136 check.c:1251 check.c:1345 check.c:1473 +#: check.c:1549 check.c:1613 check.c:1686 check.c:1865 check.c:1884 +#: check.c:1953 check.c:2005 file.c:378 file.c:415 function.c:189 option.c:493 +#: version.c:79 version.c:177 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "kunde inte öppna fil \"%s\": %m" + +#: check.c:522 +#, c-format +msgid "Data type checks failed: %s" +msgstr "Kontroll av datatyper misslyckades: %s" + +#: check.c:563 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" -"------------------------------------------------\n" +"------------------------------------------------" msgstr "" "Utför konsistenskontroller pÃ¥ gamla live-servern\n" -"------------------------------------------------\n" +"------------------------------------------------" -#: check.c:77 +#: check.c:569 #, c-format msgid "" "Performing Consistency Checks\n" -"-----------------------------\n" +"-----------------------------" msgstr "" "Utför konsistenskontroller\n" -"--------------------------\n" +"--------------------------" -#: check.c:210 +#: check.c:718 #, c-format msgid "" "\n" -"*Clusters are compatible*\n" +"*Clusters are compatible*" msgstr "" "\n" -"*Klustren är kompatibla*\n" +"*Klustren är kompatibla*" -#: check.c:216 +#: check.c:726 #, c-format msgid "" "\n" "If pg_upgrade fails after this point, you must re-initdb the\n" -"new cluster before continuing.\n" +"new cluster before continuing." msgstr "" "\n" "Om pg_upgrade misslyckas efter denna punkt sÃ¥ mÃ¥ste du\n" -"köra om initdb pÃ¥ nya klustret innan du fortsätter.\n" +"köra om initdb pÃ¥ nya klustret innan du fortsätter." -#: check.c:257 +#: check.c:767 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" "Once you start the new server, consider running:\n" -" %s/vacuumdb %s--all --analyze-in-stages\n" -"\n" +" %s/vacuumdb %s--all --analyze-in-stages" msgstr "" "Optimeringsstatistik överförs inte av pg_upgrade.\n" "När du startar nya servern sÃ¥ vill du nog köra:\n" -" %s/vacuumdb %s--all --analyze-in-stages\n" -"\n" +" %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:263 +#: check.c:773 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" -" %s\n" +" %s" msgstr "" "När detta skript körs sÃ¥ raderas gamla klustrets datafiler:\n" -" %s\n" +" %s" -#: check.c:268 +#: check.c:778 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" "because user-defined tablespaces or the new cluster's data directory\n" "exist in the old cluster directory. The old cluster's contents must\n" -"be deleted manually.\n" +"be deleted manually." msgstr "" "Kunde inte skapa ett script som raderar gamla klustrets datafiler\n" "dÃ¥ användardefinierade tabellutrymmen eller nya klustrets datakatalog\n" "ligger i gamla klusterkatalogen. Det gamla klustrets innehÃ¥ll\n" -"mÃ¥ste raderas för hand.\n" +"mÃ¥ste raderas för hand." -#: check.c:280 +#: check.c:790 #, c-format msgid "Checking cluster versions" msgstr "Kontrollerar klustrets versioner" -#: check.c:292 -#, c-format -msgid "This utility can only upgrade from PostgreSQL version 9.2 and later.\n" -msgstr "Detta verktyg kan bara uppgradera frÃ¥n PostgreSQL version 9.2 eller nyare.\n" - -#: check.c:296 -#, c-format -msgid "This utility can only upgrade to PostgreSQL version %s.\n" -msgstr "Detta verktyg kan bara uppgradera till PostgreSQL version %s.\n" - -#: check.c:305 -#, c-format -msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n" -msgstr "Detta verktyg kan inte användas för att nergradera till äldre major-versioner av PostgreSQL.\n" - -#: check.c:310 -#, c-format -msgid "Old cluster data and binary directories are from different major versions.\n" -msgstr "Gammal klusterdata och binära kataloger är frÃ¥n olika major-versioner.\n" - -#: check.c:313 -#, c-format -msgid "New cluster data and binary directories are from different major versions.\n" -msgstr "Nya klusterdata och binära kataloger är frÃ¥n olika major-versioner.\n" - -#: check.c:328 +#: check.c:802 #, c-format -msgid "When checking a live server, the old and new port numbers must be different.\n" -msgstr "Vid kontroll av en live-server sÃ¥ mÃ¥ste gamla och nya portnumren vara olika.\n" +msgid "This utility can only upgrade from PostgreSQL version %s and later." +msgstr "Detta verktyg kan bara uppgradera frÃ¥n PostgreSQL version %s eller senare." -#: check.c:343 +#: check.c:807 #, c-format -msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "kodning för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n" +msgid "This utility can only upgrade to PostgreSQL version %s." +msgstr "Detta verktyg kan bara uppgradera till PostgreSQL version %s." -#: check.c:348 +#: check.c:816 #, c-format -msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "lc_collate-värden för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n" +msgid "This utility cannot be used to downgrade to older major PostgreSQL versions." +msgstr "Detta verktyg kan inte användas för att nergradera till äldre major-versioner av PostgreSQL." -#: check.c:351 +#: check.c:821 #, c-format -msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "lc_ctype-värden för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n" +msgid "Old cluster data and binary directories are from different major versions." +msgstr "Gammal klusterdata och binära kataloger är frÃ¥n olika major-versioner." -#: check.c:354 +#: check.c:824 #, c-format -msgid "locale providers for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "localleverantörer för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n" +msgid "New cluster data and binary directories are from different major versions." +msgstr "Nya klusterdata och binära kataloger är frÃ¥n olika major-versioner." -#: check.c:361 +#: check.c:839 #, c-format -msgid "ICU locale values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "inställning av ICU-lokal för databasen \"%s\" matchar inte: gammal \"%s\", ny \"%s\"\n" +msgid "When checking a live server, the old and new port numbers must be different." +msgstr "Vid kontroll av en live-server sÃ¥ mÃ¥ste gamla och nya portnumren vara olika." -#: check.c:436 +#: check.c:859 #, c-format -msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" -msgstr "Nya databasklustret \"%s\" är inte tomt: hittade relation \"%s.%s\"\n" +msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" +msgstr "Nya databasklustret \"%s\" är inte tomt: hittade relation \"%s.%s\"" -#: check.c:488 +#: check.c:882 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Letar efter nya tablespace-kataloger i klustret" -#: check.c:499 +#: check.c:893 #, c-format -msgid "new cluster tablespace directory already exists: \"%s\"\n" -msgstr "i klustret finns redan ny tablespace-katalog: \"%s\"\n" +msgid "new cluster tablespace directory already exists: \"%s\"" +msgstr "i klustret finns redan ny tablespace-katalog: \"%s\"" -#: check.c:532 +#: check.c:926 #, c-format msgid "" "\n" -"WARNING: new data directory should not be inside the old data directory, e.g. %s\n" +"WARNING: new data directory should not be inside the old data directory, i.e. %s" msgstr "" "\n" -"VARNING: nya datakatalogen skall inte ligga inuti den gamla datakatalogen, dvs. %s\n" +"VARNING: nya datakatalogen skall inte ligga inuti den gamla datakatalogen, dvs. %s" -#: check.c:556 +#: check.c:950 #, c-format msgid "" "\n" -"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n" +"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s" msgstr "" "\n" -"VARNING: användardefinierade tabellutrymmens position skall inte vara i datakatalogen, dvs. %s\n" +"VARNING: användardefinierade tabellutrymmens plats skall inte vara i datakatalogen, dvs. %s" -#: check.c:566 +#: check.c:960 #, c-format msgid "Creating script to delete old cluster" msgstr "Skapar skript för att radera gamla klustret" -#: check.c:569 check.c:744 check.c:864 check.c:963 check.c:1043 check.c:1306 -#: file.c:336 function.c:165 option.c:465 version.c:116 version.c:288 -#: version.c:423 +#: check.c:1014 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "kan inte öppna fil \"%s\": %s\n" +msgid "could not add execute permission to file \"%s\": %m" +msgstr "kunde inte lägga till rättigheten \"körbar\" pÃ¥ filen \"%s\": %m" -#: check.c:620 -#, c-format -msgid "could not add execute permission to file \"%s\": %s\n" -msgstr "kan inte sätta rättigheten \"körbar\" pÃ¥ filen \"%s\": %s\n" - -#: check.c:640 +#: check.c:1034 #, c-format msgid "Checking database user is the install user" msgstr "Kontrollerar att databasanvändaren är installationsanvändaren" -#: check.c:656 +#: check.c:1050 #, c-format -msgid "database user \"%s\" is not the install user\n" -msgstr "databasanvändare \"%s\" är inte installationsanvändaren\n" +msgid "database user \"%s\" is not the install user" +msgstr "databasanvändare \"%s\" är inte installationsanvändaren" -#: check.c:667 +#: check.c:1061 #, c-format -msgid "could not determine the number of users\n" -msgstr "kunde inte bestämma antalet användare\n" +msgid "could not determine the number of users" +msgstr "kunde inte bestämma antalet användare" -#: check.c:675 +#: check.c:1069 #, c-format -msgid "Only the install user can be defined in the new cluster.\n" -msgstr "Bara installationsanvändaren fÃ¥r finnas i nya klustret.\n" +msgid "Only the install user can be defined in the new cluster." +msgstr "Bara installationsanvändaren fÃ¥r finnas i nya klustret." -#: check.c:705 +#: check.c:1098 #, c-format msgid "Checking database connection settings" msgstr "Kontrollerar databasens anslutningsinställningar" -#: check.c:731 +#: check.c:1124 #, c-format -msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n" -msgstr "template0 fÃ¥r inte tillÃ¥ta anslutningar, dvs dess pg_database.datallowconn mÃ¥ste vara false\n" +msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false" +msgstr "template0 fÃ¥r inte tillÃ¥ta anslutningar, dvs dess pg_database.datallowconn mÃ¥ste vara false" -#: check.c:761 check.c:886 check.c:988 check.c:1065 check.c:1122 check.c:1181 -#: check.c:1210 check.c:1329 function.c:187 version.c:190 version.c:228 -#: version.c:372 +#: check.c:1150 check.c:1270 check.c:1367 check.c:1492 check.c:1568 +#: check.c:1626 check.c:1706 check.c:1897 check.c:2022 function.c:210 #, c-format -msgid "fatal\n" -msgstr "fatalt\n" +msgid "fatal" +msgstr "fatalt" -#: check.c:762 +#: check.c:1151 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -246,39 +443,37 @@ msgid "" "false. Consider allowing connection for all non-template0 databases\n" "or drop the databases which do not allow connections. A list of\n" "databases with the problem is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Alla databaser förutom template0 mÃ¥ste tillÃ¥ta anslutningar, dvs deras\n" -"pg_database.datallowconn mÃ¥ste vara true. Din installation har andra\n" +"pg_database.datallowconn mÃ¥ste vara true. Din installation har andra\n" "databaser än template0 som har pg_database.datallowconn sat till false\n" "Överväg att tillÃ¥ta anslutningar för alla databaser förutom template0\n" -"eller släng de databaser som inte tillÃ¥ter anslutningar. En lista med\n" +"eller släng de databaser som inte tillÃ¥ter anslutningar. En lista med\n" "problemdatabaser finns i filen:\n" -" %s\n" -"\n" +" %s" -#: check.c:787 +#: check.c:1176 #, c-format msgid "Checking for prepared transactions" msgstr "Letar efter förberedda transaktioner" -#: check.c:796 +#: check.c:1185 #, c-format -msgid "The source cluster contains prepared transactions\n" -msgstr "Källklustret innehÃ¥ller förberedda transaktioner\n" +msgid "The source cluster contains prepared transactions" +msgstr "Källklustret innehÃ¥ller förberedda transaktioner" -#: check.c:798 +#: check.c:1187 #, c-format -msgid "The target cluster contains prepared transactions\n" -msgstr "MÃ¥lklustret innehÃ¥ller förberedda transaktioner\n" +msgid "The target cluster contains prepared transactions" +msgstr "MÃ¥lklustret innehÃ¥ller förberedda transaktioner" -#: check.c:824 +#: check.c:1212 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Letar efter contrib/isn med bigint-anropsfel" -#: check.c:887 +#: check.c:1271 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -287,8 +482,7 @@ msgid "" "manually dump databases in the old cluster that use \"contrib/isn\"\n" "facilities, drop them, perform the upgrade, and then restore them. A\n" "list of the problem functions is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Din installation innehÃ¥ller \"contrib/isn\"-funktioner son beror pÃ¥\n" "datatypen bigint. Ditt gamla och nya kluster skickar bigint-värden\n" @@ -296,449 +490,466 @@ msgstr "" "kan manuellt dumpa databaser i gamla klustret som använder \"contrib/isn\"-finesser,\n" "radera dessa databaser, utföra uppgraderingen och sedan Ã¥terställa databaserna.\n" "En lista med problemfunktionerna finns i filen:\n" -" %s\n" -"\n" +" %s" -#: check.c:910 +#: check.c:1293 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Letar efter användardefinierade postfix-operatorer" -#: check.c:989 +#: check.c:1368 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" "supported anymore. Consider dropping the postfix operators and replacing\n" "them with prefix operators or function calls.\n" "A list of user-defined postfix operators is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Din installation innehÃ¥ller användardefinierade postfix-operatorer, vilket\n" "inte stöds längre. Överväg att ta bort postfix-operatorer och ersätt dem\n" "med prefix-operatorer eller funktionsanrrop.\n" "En lista med användardefinierade postfix-operatorer finns i filen:\n" -" %s\n" -"\n" +" %s" + +#: check.c:1392 +#, c-format +msgid "Checking for incompatible polymorphic functions" +msgstr "Letar efter inkompatibla polymorfa funktioner" -#: check.c:1010 +#: check.c:1493 +#, c-format +msgid "" +"Your installation contains user-defined objects that refer to internal\n" +"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n" +"These user-defined objects must be dropped before upgrading and restored\n" +"afterwards, changing them to refer to the new corresponding functions with\n" +"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n" +"A list of the problematic objects is in the file:\n" +" %s" +msgstr "" +"Din installation innehÃ¥ller användardefinierade objekt som\n" +"refererar till interna polymorfa funktioner med argument av\n" +"typen \"anyarray\" eller \"anyelement\".\n" +"Dessa användardefinierade objekt mÃ¥ste slängas innan uppgradering\n" +"och kan Ã¥terskapas efterÃ¥t efter att de ändrats till att referera till\n" +"motsvarande nya funktioner med argument av typerna \"anycompatiblearray\"\n" +"and \"anycompatible\".\n" +"En lista med problemobjekten finns i filen:\n" +" %s" + +#: check.c:1517 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Letar efter tabeller med WITH OIDS" -#: check.c:1066 +#: check.c:1569 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" "supported anymore. Consider removing the oid column using\n" " ALTER TABLE ... SET WITHOUT OIDS;\n" "A list of tables with the problem is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Din installation innehÃ¥ller tabeller deklarerade med WITH OIDS som inte\n" "stöds längre. Överväg att ta bort oid-kolumnen med\n" " ALTER TABLE ... SET WITHOUT OIDS;\n" "En lista över tabeller med detta problem finns i filen:\n" -" %s\n" -"\n" +" %s" -# FIXME: is this msgid correct? -#: check.c:1094 +#: check.c:1596 #, c-format -msgid "Checking for system-defined composite types in user tables" -msgstr "Letar i användartabeller efter systemdefinierade typer av sorten \"composite\"" +msgid "Checking for roles starting with \"pg_\"" +msgstr "Letar efter roller som startar med \"pg_\"" -#: check.c:1123 +#: check.c:1627 #, c-format msgid "" -"Your installation contains system-defined composite type(s) in user tables.\n" -"These type OIDs are not stable across PostgreSQL versions,\n" -"so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" +"Your installation contains roles starting with \"pg_\".\n" +"\"pg_\" is a reserved prefix for system roles. The cluster\n" +"cannot be upgraded until these roles are renamed.\n" +"A list of roles starting with \"pg_\" is in the file:\n" +" %s" msgstr "" -"Din installation innehÃ¥ller användartabeller med systemdefinierade typer\n" -"av sorten \"composite\". OID:er för dessa typer är inte stabila över\n" -"PostgreSQL-versioner sÃ¥ detta kluster kan inte uppgraderas för tillfället.\n" -"Du kan slänga problemkolumnerna och Ã¥terstarta uppgraderingen.\n" -"En lista med problemkolumner finns i filen:\n" -" %s\n" -"\n" +"Din installation innehÃ¥ller roller som startar pÃ¥ \"pg_\".\n" +"\"pg_\" är ett reserverat prefix för systemroller. Klustret\n" +"kan inte uppgraderas innan dessa roller har bytt namn.\n" +"En lista med rollerna som startar pÃ¥ \"pg_\" finns i denna fil:\n" +" %s" -# FIXME: is this msgid correct? -#: check.c:1151 +#: check.c:1647 #, c-format -msgid "Checking for reg* data types in user tables" -msgstr "Letar efter reg*-datatyper i användartabeller" +msgid "Checking for user-defined encoding conversions" +msgstr "Letar efter användardefinierade teckenkodkonverteringar" -#: check.c:1182 +#: check.c:1707 #, c-format msgid "" -"Your installation contains one of the reg* data types in user tables.\n" -"These data types reference system OIDs that are not preserved by\n" -"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" +"Your installation contains user-defined encoding conversions.\n" +"The conversion function parameters changed in PostgreSQL version 14\n" +"so this cluster cannot currently be upgraded. You can remove the\n" +"encoding conversions in the old cluster and restart the upgrade.\n" +"A list of user-defined encoding conversions is in the file:\n" +" %s" msgstr "" -"Din installation använder en av reg*-datatyperna i en användartabell.\n" -"Dessa datatyper refererar system-OID:er som inte bevaras av pg_upgrade\n" -"sÃ¥ detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n" -"problemkolumnerna och starta om uppgraderingen.\n" -"En lista med problemkolumner finns i filen:\n" -" %s\n" -"\n" +"Din installation innehÃ¥ller användardefinierade teckenkodkonverteringar.\n" +"Parametrar till konverteringsfunktioner ändrades i PostgreSQL 14 sÃ¥\n" +"detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n" +"teckenkodkonverteringarna i gamla klustret och starta om uppgraderingen.\n" +"En lista med användardefinierade teckenkodkonverteringar finns i filen:\n" +" %s" -# FIXME: is this msgid correct? -#: check.c:1204 +#: check.c:1746 #, c-format -msgid "Checking for incompatible \"jsonb\" data type" -msgstr "Letar efter inkompatibel \"jsonb\"-datatyp" +msgid "Checking for new cluster logical replication slots" +msgstr "Letar efter replikeringsslottar i nya klustret" -#: check.c:1211 +#: check.c:1754 #, c-format -msgid "" -"Your installation contains the \"jsonb\" data type in user tables.\n" -"The internal format of \"jsonb\" changed during 9.4 beta so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Din installation innehÃ¥ller \"jsonb\"-datatypen i användartabeller.\n" -"Interna formatet för \"jsonb\" ändrades under 9.4-betan sÃ¥ detta kluster kan\n" -"för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna och\n" -"starta om uppgraderingen.\n" -"En lista med problemkolumner finns i filen:\n" -" %s\n" -"\n" +msgid "could not count the number of logical replication slots" +msgstr "kunde inte räkna antalet logiska replikeringsslottar" -#: check.c:1233 +#: check.c:1759 #, c-format -msgid "Checking for roles starting with \"pg_\"" -msgstr "Letar efter roller som startar med \"pg_\"" +msgid "expected 0 logical replication slots but found %d" +msgstr "förväntade 0 logiska replikeringsslottar men hittade %d." -#: check.c:1243 +#: check.c:1769 check.c:1820 #, c-format -msgid "The source cluster contains roles starting with \"pg_\"\n" -msgstr "Källklustret innehÃ¥ller roller som startar med \"pg_\"\n" +msgid "could not determine parameter settings on new cluster" +msgstr "kunde inte plocka fram inställningar i det nya klustret" -#: check.c:1245 +#: check.c:1774 #, c-format -msgid "The target cluster contains roles starting with \"pg_\"\n" -msgstr "MÃ¥lklustret innehÃ¥ller roller som startar med \"pg_\"\n" +msgid "\"wal_level\" must be \"logical\" but is set to \"%s\"" +msgstr "\"wal_level\" mÃ¥ste vara satt till \"logical\" men är satt som \"%s\"" -#: check.c:1266 +#: check.c:1780 #, c-format -msgid "Checking for user-defined encoding conversions" -msgstr "Letar efter användardefinierade teckenkodkonverteringar" +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of logical replication slots (%d) on the old cluster" +msgstr "\"max_replication_slots\" (%d) mÃ¥ste vara större än eller lika med antalet logiska replikeringsslottar (%d) i gamla klustret" -#: check.c:1330 +#: check.c:1812 #, c-format -msgid "" -"Your installation contains user-defined encoding conversions.\n" -"The conversion function parameters changed in PostgreSQL version 14\n" -"so this cluster cannot currently be upgraded. You can remove the\n" -"encoding conversions in the old cluster and restart the upgrade.\n" -"A list of user-defined encoding conversions is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Din installation innehÃ¥ller användardefinierade teckenkodkonverteringar.\n" -"Parametrar till konverteringsfunktioner ändrades i PostgreSQL 14 sÃ¥\n" -"detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n" -"teckenkodkonverteringarna i gamla klustret och starta om uppgraderingen.\n" -"En lista med användardefinierade teckenkodkonverteringar finns i filen:\n" -" %s\n" -"\n" +msgid "Checking for new cluster configuration for subscriptions" +msgstr "Letar efter konfiguration för prenumerationer i nya klustret" -#: check.c:1357 +#: check.c:1824 #, c-format -msgid "failed to get the current locale\n" -msgstr "misslyckades med att hämta aktuell lokal\n" +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of subscriptions (%d) on the old cluster" +msgstr "\"max_replication_slots\" (%d) mÃ¥ste vara större än eller lika med antaler prenumerationer (%d) i gamla klustret" -#: check.c:1366 +#: check.c:1846 #, c-format -msgid "failed to get system locale name for \"%s\"\n" -msgstr "misslyckades med att hämta systemlokalnamn för \"%s\"\n" +msgid "Checking for valid logical replication slots" +msgstr "Letar efter giltiga logiska replikeringsslottar" -#: check.c:1372 +#: check.c:1898 #, c-format -msgid "failed to restore old locale \"%s\"\n" -msgstr "misslyckades med att Ã¥terställa gamla lokalen \"%s\"\n" +msgid "" +"Your installation contains logical replication slots that cannot be upgraded.\n" +"You can remove invalid slots and/or consume the pending WAL for other slots,\n" +"and then restart the upgrade.\n" +"A list of the problematic slots is in the file:\n" +" %s" +msgstr "" +"Din installation innehÃ¥ller logiska replikeringsslottar som inte\n" +"kan uppgraderas. Du kan ta bort ogiltiga slottar och/eller konsumera\n" +"köad WAL för andra slottar och sedan Ã¥terstarta uppgraderingen.\n" +"En lista med problemkolumner finns i filen:\n" +" %s" -#: controldata.c:128 controldata.c:196 +#: check.c:1922 #, c-format -msgid "could not get control data using %s: %s\n" -msgstr "kunde inte hämta kontrolldata med %s: %s\n" +msgid "Checking for subscription state" +msgstr "Kontrollerar läget för prenumerationer" -#: controldata.c:139 +#: check.c:2023 #, c-format -msgid "%d: database cluster state problem\n" -msgstr "%d: state-problem för databaskluster\n" +msgid "" +"Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n" +"You can allow the initial sync to finish for all relations and then restart the upgrade.\n" +"A list of the problematic subscriptions is in the file:\n" +" %s" +msgstr "" +"Din installation innehÃ¥ller prenumerationer utan origin eller har\n" +"relationer som inte är i läget i (initialize) eller r (ready).\n" +"Du kan lÃ¥ta den initiala synken gÃ¥ klart för alla relationer och\n" +"sedan Ã¥teruppta uppgraderingen.\n" +"En lista med problemkolumner finns i filen:\n" +" %s" -#: controldata.c:157 +#: controldata.c:129 controldata.c:199 #, c-format -msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" -msgstr "Källklustret stängdes ner när det var i Ã¥terställningsläge. För att uppgradera sÃ¥ använd \"rsync\" enligt dokumentation eller stäng ner den som en primär.\n" +msgid "could not get control data using %s: %m" +msgstr "kunde inte hämta kontrolldata med %s: %m" -#: controldata.c:159 +#: controldata.c:139 #, c-format -msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" -msgstr "MÃ¥lklustret stängdes ner när det var i Ã¥terställningsläge. För att uppgradera sÃ¥ använd \"rsync\" enligt dokumentation eller stäng ner den som en primär.\n" +msgid "%d: database cluster state problem" +msgstr "%d: state-problem för databaskluster" -#: controldata.c:164 +#: controldata.c:158 #, c-format -msgid "The source cluster was not shut down cleanly.\n" -msgstr "Källklustret har inte stängts ner pÃ¥ ett korrekt sätt.\n" +msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary." +msgstr "Källklustret stängdes ner när det var i Ã¥terställningsläge. För att uppgradera sÃ¥ använd \"rsync\" enligt dokumentation eller stäng ner den som en primär." -#: controldata.c:166 +#: controldata.c:160 #, c-format -msgid "The target cluster was not shut down cleanly.\n" -msgstr "MÃ¥lklustret har inte stängts ner pÃ¥ ett korrekt sätt.\n" +msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary." +msgstr "MÃ¥lklustret stängdes ner när det var i Ã¥terställningsläge. För att uppgradera sÃ¥ använd \"rsync\" enligt dokumentation eller stäng ner den som en primär." -#: controldata.c:177 +#: controldata.c:165 #, c-format -msgid "The source cluster lacks cluster state information:\n" -msgstr "Källklustret saknar information om kluster-state:\n" +msgid "The source cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "Källklustret har inte stängts ner pÃ¥ ett korrekt sätt, dess tillstÃ¥nd rapporteras som: \"%s\"" -#: controldata.c:179 +#: controldata.c:167 #, c-format -msgid "The target cluster lacks cluster state information:\n" -msgstr "MÃ¥lklustret saknar information om kluster-state:\n" +msgid "The target cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "MÃ¥lklustret har inte stängts ner pÃ¥ ett korrekt sätt, dess tillstÃ¥nd rapporteras som: \"%s\"." -#: controldata.c:209 dump.c:50 pg_upgrade.c:402 pg_upgrade.c:439 -#: relfilenode.c:231 server.c:34 +#: controldata.c:175 controldata.c:507 #, c-format -msgid "%s" -msgstr "%s" +msgid "could not get control data using %s: %s" +msgstr "kunde inte hämta kontrolldata med %s: %s" + +#: controldata.c:181 +#, c-format +msgid "The source cluster lacks cluster state information:" +msgstr "Källklustret saknar information om kluster-state:" -#: controldata.c:216 +#: controldata.c:183 #, c-format -msgid "%d: pg_resetwal problem\n" -msgstr "%d: pg_resetwal-problem\n" +msgid "The target cluster lacks cluster state information:" +msgstr "MÃ¥lklustret saknar information om kluster-state:" -#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258 -#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310 -#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354 -#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383 -#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427 -#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471 -#: controldata.c:482 controldata.c:493 +#: controldata.c:213 dump.c:50 exec.c:118 pg_upgrade.c:556 pg_upgrade.c:596 +#: pg_upgrade.c:945 relfilenumber.c:233 server.c:34 util.c:337 #, c-format -msgid "%d: controldata retrieval problem\n" -msgstr "%d: problem vid hämtning av kontrolldata\n" +msgid "%s" +msgstr "%s" -#: controldata.c:572 +#: controldata.c:220 #, c-format -msgid "The source cluster lacks some required control information:\n" -msgstr "Källklustret saknar lite kontrolldata som krävs:\n" +msgid "%d: pg_resetwal problem" +msgstr "%d: pg_resetwal-problem" -#: controldata.c:575 +#: controldata.c:230 controldata.c:240 controldata.c:251 controldata.c:262 +#: controldata.c:273 controldata.c:292 controldata.c:303 controldata.c:314 +#: controldata.c:325 controldata.c:336 controldata.c:347 controldata.c:358 +#: controldata.c:361 controldata.c:365 controldata.c:375 controldata.c:387 +#: controldata.c:398 controldata.c:409 controldata.c:420 controldata.c:431 +#: controldata.c:442 controldata.c:453 controldata.c:464 controldata.c:475 +#: controldata.c:486 controldata.c:497 #, c-format -msgid "The target cluster lacks some required control information:\n" -msgstr "MÃ¥lklustret saknar lite kontrolldata som krävs:\n" +msgid "%d: controldata retrieval problem" +msgstr "%d: problem vid hämtning av kontrolldata" #: controldata.c:578 #, c-format -msgid " checkpoint next XID\n" -msgstr " checkpoint nästa-XID\n" +msgid "The source cluster lacks some required control information:" +msgstr "Källklustret saknar lite kontrolldata som krävs:" #: controldata.c:581 #, c-format -msgid " latest checkpoint next OID\n" -msgstr " senaste checkpoint nästa-OID\n" +msgid "The target cluster lacks some required control information:" +msgstr "MÃ¥lklustret saknar lite kontrolldata som krävs:" #: controldata.c:584 #, c-format -msgid " latest checkpoint next MultiXactId\n" -msgstr " senaster checkpoint nästa-MultiXactId\n" +msgid " checkpoint next XID" +msgstr " checkpoint nästa-XID" -#: controldata.c:588 +#: controldata.c:587 #, c-format -msgid " latest checkpoint oldest MultiXactId\n" -msgstr " senaste checkpoint äldsta-MultiXactId\n" +msgid " latest checkpoint next OID" +msgstr " senaste checkpoint nästa-OID" -#: controldata.c:591 +#: controldata.c:590 #, c-format -msgid " latest checkpoint oldestXID\n" -msgstr " senaste checkpoint äldsta-XID\n" +msgid " latest checkpoint next MultiXactId" +msgstr " senaster checkpoint nästa-MultiXactId" #: controldata.c:594 #, c-format -msgid " latest checkpoint next MultiXactOffset\n" -msgstr " senaste checkpoint nästa-MultiXactOffset\n" +msgid " latest checkpoint oldest MultiXactId" +msgstr " senaste checkpoint äldsta-MultiXactId" #: controldata.c:597 #, c-format -msgid " first WAL segment after reset\n" -msgstr " första WAL-segmentet efter reset\n" +msgid " latest checkpoint oldestXID" +msgstr " senaste checkpoint äldsta-XID" #: controldata.c:600 #, c-format -msgid " float8 argument passing method\n" -msgstr " float8 argumentöverföringsmetod\n" +msgid " latest checkpoint next MultiXactOffset" +msgstr " senaste checkpoint nästa-MultiXactOffset" #: controldata.c:603 #, c-format -msgid " maximum alignment\n" -msgstr " maximal alignment\n" +msgid " first WAL segment after reset" +msgstr " första WAL-segmentet efter reset" #: controldata.c:606 #, c-format -msgid " block size\n" -msgstr " blockstorlek\n" +msgid " float8 argument passing method" +msgstr " float8 argumentöverföringsmetod" #: controldata.c:609 #, c-format -msgid " large relation segment size\n" -msgstr " stora relationers segmentstorlek\n" +msgid " maximum alignment" +msgstr " maximal alignment" #: controldata.c:612 #, c-format -msgid " WAL block size\n" -msgstr " WAL-blockstorlek\n" +msgid " block size" +msgstr " blockstorlek" #: controldata.c:615 #, c-format -msgid " WAL segment size\n" -msgstr " WAL-segmentstorlek\n" +msgid " large relation segment size" +msgstr " stora relationers segmentstorlek" #: controldata.c:618 #, c-format -msgid " maximum identifier length\n" -msgstr " maximal identifierarlängd\n" +msgid " WAL block size" +msgstr " WAL-blockstorlek" #: controldata.c:621 #, c-format -msgid " maximum number of indexed columns\n" -msgstr " maximalt antal indexerade kolumner\n" +msgid " WAL segment size" +msgstr " WAL-segmentstorlek" #: controldata.c:624 #, c-format -msgid " maximum TOAST chunk size\n" -msgstr " maximal TOAST-chunkstorlek\n" +msgid " maximum identifier length" +msgstr " maximal identifierarlängd" -#: controldata.c:628 +#: controldata.c:627 #, c-format -msgid " large-object chunk size\n" -msgstr " stora-objekt chunkstorlek\n" +msgid " maximum number of indexed columns" +msgstr " maximalt antal indexerade kolumner" -#: controldata.c:631 +#: controldata.c:630 #, c-format -msgid " dates/times are integers?\n" -msgstr " datum/tid är heltal?\n" +msgid " maximum TOAST chunk size" +msgstr " maximal TOAST-chunkstorlek" -#: controldata.c:635 +#: controldata.c:634 #, c-format -msgid " data checksum version\n" -msgstr " datachecksumversion\n" +msgid " large-object chunk size" +msgstr " stora-objekt chunkstorlek" #: controldata.c:637 #, c-format -msgid "Cannot continue without required control information, terminating\n" -msgstr "Kan inte fortsätta utan kontrollinformation som krävs, avslutar\n" +msgid " dates/times are integers?" +msgstr " datum/tid är heltal?" -#: controldata.c:652 +#: controldata.c:641 #, c-format -msgid "" -"old and new pg_controldata alignments are invalid or do not match\n" -"Likely one cluster is a 32-bit install, the other 64-bit\n" -msgstr "" -"gamla och nya pg_controldata-alignments är ogiltiga eller matchar inte.\n" -"Troligen är ett kluster en 32-bitars-installation och den andra 64-bitars\n" +msgid " data checksum version" +msgstr " datachecksumversion" -#: controldata.c:656 +#: controldata.c:643 #, c-format -msgid "old and new pg_controldata block sizes are invalid or do not match\n" -msgstr "gamla och nya pg_controldata-blockstorlekar är ogiltiga eller matchar inte\n" +msgid "Cannot continue without required control information, terminating" +msgstr "Kan inte fortsätta utan kontrollinformation som krävs, avslutar" -#: controldata.c:659 +#: controldata.c:658 #, c-format -msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n" -msgstr "gamla och nya pg_controldata maximala relationssegmentstorlekar är ogiltiga eller matchar inte\n" +msgid "" +"old and new pg_controldata alignments are invalid or do not match.\n" +"Likely one cluster is a 32-bit install, the other 64-bit" +msgstr "" +"gamla och nya pg_controldata-alignments är ogiltiga eller matchar inte.\n" +"Troligen är ett kluster en 32-bitars-installation och den andra 64-bitars" #: controldata.c:662 #, c-format -msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n" -msgstr "gamla och nya pg_controldata WAL-blockstorlekar är ogiltiga eller matchar inte\n" +msgid "old and new pg_controldata block sizes are invalid or do not match" +msgstr "gamla och nya pg_controldata-blockstorlekar är ogiltiga eller matchar inte" #: controldata.c:665 #, c-format -msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n" -msgstr "gamla och nya pg_controldata WAL-segmentstorlekar är ogiltiga eller matchar inte\n" +msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match" +msgstr "gamla och nya pg_controldata maximala relationssegmentstorlekar är ogiltiga eller matchar inte" #: controldata.c:668 #, c-format -msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n" -msgstr "gamla och nya pg_controldata maximal identifierarlängder är ogiltiga eller matchar inte\n" +msgid "old and new pg_controldata WAL block sizes are invalid or do not match" +msgstr "gamla och nya pg_controldata WAL-blockstorlekar är ogiltiga eller matchar inte" #: controldata.c:671 #, c-format -msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n" -msgstr "gamla och nya pg_controldata maxilmalt indexerade kolumner ogiltiga eller matchar inte\n" +msgid "old and new pg_controldata WAL segment sizes are invalid or do not match" +msgstr "gamla och nya pg_controldata WAL-segmentstorlekar är ogiltiga eller matchar inte" #: controldata.c:674 #, c-format -msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n" -msgstr "gamla och nya pg_controldata maximal TOAST-chunkstorlek ogiltiga eller matchar inte\n" +msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match" +msgstr "gamla och nya pg_controldata maximal identifierarlängder är ogiltiga eller matchar inte" + +#: controldata.c:677 +#, c-format +msgid "old and new pg_controldata maximum indexed columns are invalid or do not match" +msgstr "gamla och nya pg_controldata maximalt indexerade kolumner ogiltiga eller matchar inte" + +#: controldata.c:680 +#, c-format +msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match" +msgstr "gamla och nya pg_controldata maximal TOAST-chunkstorlek ogiltiga eller matchar inte" -#: controldata.c:679 +#: controldata.c:685 #, c-format -msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n" -msgstr "gamla och nya pg_controldata stora-objekt-chunkstorlekar är ogiltiga eller matchar inte\n" +msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match" +msgstr "gamla och nya pg_controldata stora-objekt-chunkstorlekar är ogiltiga eller matchar inte" -#: controldata.c:682 +#: controldata.c:688 #, c-format -msgid "old and new pg_controldata date/time storage types do not match\n" -msgstr "gamla och nya pg_controldata datum/tid-lagringstyper matchar inte\n" +msgid "old and new pg_controldata date/time storage types do not match" +msgstr "gamla och nya pg_controldata datum/tid-lagringstyper matchar inte" -#: controldata.c:695 +#: controldata.c:701 #, c-format -msgid "old cluster does not use data checksums but the new one does\n" -msgstr "gamla klustret använder inte datachecksummor men nya gör det\n" +msgid "old cluster does not use data checksums but the new one does" +msgstr "gamla klustret använder inte datachecksummor men nya gör det" -#: controldata.c:698 +#: controldata.c:704 #, c-format -msgid "old cluster uses data checksums but the new one does not\n" -msgstr "gamla klustret använder datachecksummor men nya gör inte det\n" +msgid "old cluster uses data checksums but the new one does not" +msgstr "gamla klustret använder datachecksummor men nya gör inte det" -#: controldata.c:700 +#: controldata.c:706 #, c-format -msgid "old and new cluster pg_controldata checksum versions do not match\n" -msgstr "gamla och nya klustrets pg_controldata checksumversioner matchar inte\n" +msgid "old and new cluster pg_controldata checksum versions do not match" +msgstr "gamla och nya klustrets pg_controldata checksumversioner matchar inte" -#: controldata.c:711 +#: controldata.c:717 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "Lägger till \".old\"-suffix till gamla global/pg_control" -#: controldata.c:716 +#: controldata.c:722 #, c-format -msgid "Unable to rename %s to %s.\n" -msgstr "Kan inte byta namn pÃ¥ %s till %s.\n" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" -#: controldata.c:719 +#: controldata.c:726 #, c-format msgid "" "\n" "If you want to start the old cluster, you will need to remove\n" "the \".old\" suffix from %s/global/pg_control.old.\n" "Because \"link\" mode was used, the old cluster cannot be safely\n" -"started once the new cluster has been started.\n" -"\n" +"started once the new cluster has been started." msgstr "" "\n" "Om du vill starta gamla klustret sÃ¥ mÃ¥ste du ta bort\n" "\".old\"-suffixet frÃ¥n %s/global/pg_control.old.\n" "Detta dÃ¥ \"link\"-läge användes och gamla klustret kan inte\n" -"startas pÃ¥ ett säkert sätt efter att nya klustret startats.\n" -"\n" +"startas pÃ¥ ett säkert sätt efter att nya klustret startats." #: dump.c:20 #, c-format @@ -750,32 +961,32 @@ msgstr "Skapar dump med globala objekt" msgid "Creating dump of database schemas" msgstr "Skapar dump innehÃ¥llande databasscheman" -#: exec.c:45 +#: exec.c:47 #, c-format -msgid "could not get pg_ctl version data using %s: %s\n" -msgstr "kunde inte hämta pg_ctl versionsdata med %s: %s\n" +msgid "could not get pg_ctl version data using %s: %m" +msgstr "kunde inte hämta pg_ctl versionsdata med %s: %m" #: exec.c:51 #, c-format -msgid "could not get pg_ctl version output from %s\n" -msgstr "kunde inte läsa versionutdata för pg_ctl frÃ¥n %s\n" +msgid "could not get pg_ctl version data using %s: %s" +msgstr "kunde inte hämta pg_ctl versionsdata med %s: %s" -#: exec.c:108 exec.c:112 +#: exec.c:55 #, c-format -msgid "command too long\n" -msgstr "kommandot för lÃ¥ngt\n" +msgid "could not get pg_ctl version output from %s" +msgstr "kunde inte läsa versionutdata för pg_ctl frÃ¥n %s" -#: exec.c:114 util.c:37 util.c:265 +#: exec.c:112 exec.c:116 #, c-format -msgid "%s\n" -msgstr "%s\n" +msgid "command too long" +msgstr "kommandot för lÃ¥ngt" -#: exec.c:153 pg_upgrade.c:242 +#: exec.c:160 pg_upgrade.c:311 #, c-format -msgid "could not open log file \"%s\": %m\n" -msgstr "kunde inte öppna loggfil \"%s\": %m\n" +msgid "could not open log file \"%s\": %m" +msgstr "kunde inte öppna loggfil \"%s\": %m" -#: exec.c:182 +#: exec.c:192 #, c-format msgid "" "\n" @@ -784,324 +995,338 @@ msgstr "" "\n" "*misslyckande*" -#: exec.c:185 +#: exec.c:195 #, c-format -msgid "There were problems executing \"%s\"\n" -msgstr "Det var problem med att köra \"%s\"\n" +msgid "There were problems executing \"%s\"" +msgstr "Det var problem med att köra \"%s\"" -#: exec.c:188 +#: exec.c:198 #, c-format msgid "" "Consult the last few lines of \"%s\" or \"%s\" for\n" -"the probable cause of the failure.\n" +"the probable cause of the failure." msgstr "" "Se de sista raderna i \"%s\" eller \"%s\" för\n" -"en trolig orsak till misslyckandet.\n" +"en trolig orsak till misslyckandet." -#: exec.c:193 +#: exec.c:203 #, c-format msgid "" "Consult the last few lines of \"%s\" for\n" -"the probable cause of the failure.\n" +"the probable cause of the failure." msgstr "" "Se de sista raderna i \"%s\" för\n" -"en trolig orsak till misslyckandet.\n" +"en trolig orsak till misslyckandet." + +#: exec.c:218 pg_upgrade.c:321 +#, c-format +msgid "could not write to log file \"%s\": %m" +msgstr "kunde inte skriva till loggfil \"%s\": %m" -#: exec.c:208 pg_upgrade.c:250 +#: exec.c:244 #, c-format -msgid "could not write to log file \"%s\": %m\n" -msgstr "kunde inte skriva till loggfil \"%s\": %m\n" +msgid "could not open file \"%s\" for reading: %m" +msgstr "kunde inte öppna filen \"%s\" för läsning: %m" -#: exec.c:234 +#: exec.c:270 #, c-format -msgid "could not open file \"%s\" for reading: %s\n" -msgstr "kunde inte öppna fil \"%s\" för läsning: %s\n" +msgid "You must have read and write access in the current directory." +msgstr "Du mÃ¥ste ha läs och skrivrättigheter till den aktuella katalogen." -#: exec.c:261 +#: exec.c:323 exec.c:389 exec.c:439 #, c-format -msgid "You must have read and write access in the current directory.\n" -msgstr "Du mÃ¥ste ha läs och skrivrättigheter till den aktuella katalogen.\n" +msgid "check for \"%s\" failed: %m" +msgstr "kontroll av \"%s\" misslyckades: %m" -#: exec.c:314 exec.c:380 +#: exec.c:326 exec.c:392 #, c-format -msgid "check for \"%s\" failed: %s\n" -msgstr "kontroll av \"%s\" misslyckades: %s\n" +msgid "\"%s\" is not a directory" +msgstr "\"%s\" är inte en katalog" -#: exec.c:317 exec.c:383 +#: exec.c:444 #, c-format -msgid "\"%s\" is not a directory\n" -msgstr "\"%s\" är inte en katalog\n" +msgid "check for \"%s\" failed: cannot execute" +msgstr "kontroll av \"%s\" misslyckades: kan inte exekvera" -#: exec.c:433 +#: exec.c:454 #, c-format -msgid "check for \"%s\" failed: not a regular file\n" -msgstr "kontroll av \"%s\" misslyckades: inte en vanlig fil\n" +msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"" +msgstr "kontroll av \"%s\" misslyckades: hittade felaktig version \"%s\", förväntade \"%s\"" -#: exec.c:436 +#: file.c:44 #, c-format -msgid "check for \"%s\" failed: cannot execute (permission denied)\n" -msgstr "kontroll av \"%s\" misslyckades: kan inte exekvera (rättighet saknas)\n" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "fel vid kloning av relation \"%s.%s\" (\"%s\" till \"%s\"): %m" -#: exec.c:442 +#: file.c:51 #, c-format -msgid "check for \"%s\" failed: cannot execute\n" -msgstr "kontroll av \"%s\" misslyckades: kan inte exekvera\n" +msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "fel vid kloning av relation \"%s.%s\": kunde inte öppna filen \"%s\": %m" -#: exec.c:452 +#: file.c:56 #, c-format -msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n" -msgstr "kontroll av \"%s\" misslyckades: hittade felaktig version \"%s\", förväntade \"%s\"\n" +msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "fel vid kloning av relation \"%s.%s\": kunde inte skapa filen \"%s\": %m" -#: file.c:43 file.c:61 +#: file.c:65 #, c-format -msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "fel vid kloning av relation \"%s.%s\" (\"%s\" till \"%s\"): %s\n" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s" +msgstr "fel vid kloning av relation \"%s.%s\" (\"%s\" till \"%s\"): %s" -#: file.c:50 +#: file.c:91 file.c:160 file.c:233 #, c-format -msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n" -msgstr "fel vid kloning av relation \"%s.%s\": kunde inte öppna filen \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte öppna filen \"%s\": %m" -#: file.c:55 +#: file.c:96 file.c:165 file.c:242 #, c-format -msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n" -msgstr "fel vid kloning av relation \"%s.%s\": kunde inte skapa filen \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte skapa filen \"%s\": %m" -#: file.c:87 file.c:190 +#: file.c:110 file.c:266 #, c-format -msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n" -msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte öppna filen \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %m" +msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte läsa filen \"%s\": %m" -#: file.c:92 file.c:199 +#: file.c:122 file.c:344 #, c-format -msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n" -msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte skapa filen \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %m" +msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte skriva filen \"%s\": %m" -#: file.c:106 file.c:223 +#: file.c:136 #, c-format -msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n" -msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte läsa filen \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "fel vid kopiering av relation \"%s.%s\" (\"%s\" till \"%s\"): %m" -#: file.c:118 file.c:301 +#: file.c:172 #, c-format -msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n" -msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte skriva filen \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\": could not copy file range from \"%s\" to \"%s\": %m" +msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte kopiera filintervall frÃ¥n \"%s\" till \"%s\": %m" -#: file.c:132 +#: file.c:194 #, c-format -msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "fel vid kopiering av relation \"%s.%s\" (\"%s\" till \"%s\"): %s\n" +msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "fel vid skapande av länk för relation \"%s.%s\" (\"%s\" till \"%s\"): %m" -#: file.c:151 +#: file.c:237 #, c-format -msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "fel vid skapande av länk för relation \"%s.%s\" (\"%s\" till \"%s\"): %s\n" +msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %m" +msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte göra stat pÃ¥ file \"%s\": %m" -#: file.c:194 +#: file.c:269 #, c-format -msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n" -msgstr "fel vid kopiering av relation \"%s.%s\": kunde inte göra stat pÃ¥ file \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"" +msgstr "fel vid kopiering av relation \"%s.%s\": partiell sida hittad i fil \"%s\"" -#: file.c:226 +#: file.c:371 file.c:387 #, c-format -msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n" -msgstr "fel vid kopiering av relation \"%s.%s\": partiell sida hittad i fil \"%s\"\n" +msgid "could not clone file between old and new data directories: %m" +msgstr "kunde inte klona fil mellan gamla och nya datakatalogen: %m" -#: file.c:328 file.c:345 +#: file.c:383 file.c:420 #, c-format -msgid "could not clone file between old and new data directories: %s\n" -msgstr "kunde inte klona fil mellan gamla och nya datakatalogen: %s\n" +msgid "could not create file \"%s\": %m" +msgstr "kunde inte skapa fil \"%s\": %m" -#: file.c:341 +#: file.c:393 #, c-format -msgid "could not create file \"%s\": %s\n" -msgstr "kan inte skapa fil \"%s\": %s\n" +msgid "file cloning not supported on this platform" +msgstr "filkloning stöds inte pÃ¥ denna plattform" -#: file.c:352 +#: file.c:424 #, c-format -msgid "file cloning not supported on this platform\n" -msgstr "filkloning stöds inte pÃ¥ denna plattform\n" +msgid "could not copy file range between old and new data directories: %m" +msgstr "kunde inte kopiera filintervall mellan gamla och nya datakatalogerna: %m" -#: file.c:369 +#: file.c:430 +#, c-format +msgid "copy_file_range not supported on this platform" +msgstr "copy_file_range stöds inte pÃ¥ denna plattform" + +#: file.c:447 #, c-format msgid "" -"could not create hard link between old and new data directories: %s\n" -"In link mode the old and new data directories must be on the same file system.\n" +"could not create hard link between old and new data directories: %m\n" +"In link mode the old and new data directories must be on the same file system." msgstr "" -"kunde inte skapa hÃ¥rd länk mellan gamla och nya datakatalogerna: %s\n" -"I länk-läge mÃ¥ste gamla och nya datakatalogerna vara i samma filsystem.\n" +"kunde inte skapa hÃ¥rd länk mellan gamla och nya datakatalogerna: %m\n" +"I länk-läge mÃ¥ste gamla och nya datakatalogerna vara i samma filsystem." -#: function.c:129 +#: function.c:154 #, c-format msgid "Checking for presence of required libraries" msgstr "Kontrollerar att krävda länkbibliotek finns" -#: function.c:167 +#: function.c:190 #, c-format msgid "could not load library \"%s\": %s" msgstr "kunde inte ladda länkbibliotek \"%s\": %s" -#: function.c:178 +#: function.c:201 #, c-format msgid "In database: %s\n" msgstr "I databas: %s\n" -#: function.c:188 +#: function.c:211 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" "new installation. You can add these libraries to the new installation,\n" "or remove the functions using them from the old installation. A list of\n" "problem libraries is in the file:\n" -" %s\n" -"\n" +" %s" msgstr "" "Din installation refererar till laddbara bibliotek som saknas i nya\n" "installationen. Du kan lägga till dessa itll nya installationen eller\n" "ta bort funktionerna som använder dem i gamla installationen. En lista\n" "med problembiblioteken finns i filen:\n" -" %s\n" -"\n" +" %s" -#: info.c:125 +#: info.c:128 #, c-format -msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n" -msgstr "Relationsname för OID %u i databas \"%s\" matchar inte: gammalt namn \"%s.%s\", nytt namn \"%s.%s\"\n" +msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"" +msgstr "Relationsname för OID %u i databas \"%s\" matchar inte: gammalt namn \"%s.%s\", nytt namn \"%s.%s\"" -#: info.c:145 +#: info.c:148 #, c-format -msgid "Failed to match up old and new tables in database \"%s\"\n" -msgstr "Misslyckades med att matcha ihop gamla och nya tabeller i databas \"%s\"\n" +msgid "Failed to match up old and new tables in database \"%s\"" +msgstr "Misslyckades med att matcha ihop gamla och nya tabeller i databas \"%s\"" -#: info.c:226 +#: info.c:229 #, c-format msgid " which is an index on \"%s.%s\"" msgstr " vilket är ett index för \"%s.%s\"" -#: info.c:236 +#: info.c:239 #, c-format msgid " which is an index on OID %u" msgstr " vilket är ett index för OID %u" -#: info.c:248 +#: info.c:251 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr " vilket är TOAST-tabellen för \"%s.%s\"" -#: info.c:256 +#: info.c:259 #, c-format msgid " which is the TOAST table for OID %u" msgstr " vilket är TOAST-tabellen för OID %u" -#: info.c:260 +#: info.c:263 #, c-format -msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n" -msgstr "Ingen träff hittad i gamla klustret för ny relation med OID %u i databas \"%s\": %s\n" +msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s" +msgstr "Ingen träff hittad i gamla klustret för ny relation med OID %u i databas \"%s\": %s" -#: info.c:263 +#: info.c:266 #, c-format -msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n" -msgstr "Ingen träff hittad i nya klustret för gammal relation med OID %u i databas \"%s\": %s\n" +msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s" +msgstr "Ingen träff hittad i nya klustret för gammal relation med OID %u i databas \"%s\": %s" -#: info.c:287 +#: info.c:300 #, c-format msgid "" "\n" -"source databases:\n" +"source databases:" msgstr "" "\n" -"källdatabaser:\n" +"källdatabaser:" -#: info.c:289 +#: info.c:302 #, c-format msgid "" "\n" -"target databases:\n" +"target databases:" msgstr "" "\n" -"mÃ¥ldatabaser:\n" +"mÃ¥ldatabaser:" -#: info.c:605 +#: info.c:346 #, c-format -msgid "Database: %s\n" -msgstr "Databas: %s\n" +msgid "template0 not found" +msgstr "hittade inte template0" -#: info.c:607 +#: info.c:805 #, c-format -msgid "" -"\n" -"\n" -msgstr "" -"\n" -"\n" +msgid "Database: \"%s\"" +msgstr "Databas: \"%s\"" + +#: info.c:818 +#, c-format +msgid "relname: \"%s.%s\", reloid: %u, reltblspace: \"%s\"" +msgstr "relnamn: \"%s.%s\": reloid: %u reltblutrymme: \"%s\"" -#: info.c:618 +#: info.c:832 #, c-format -msgid "relname: %s.%s: reloid: %u reltblspace: %s\n" -msgstr "relnamn: %s.%s: reloid: %u reltblutrymme: %s\n" +msgid "Logical replication slots in the database:" +msgstr "Logiska replikeringsslottar i databasen:" -#: option.c:100 +#: info.c:838 #, c-format -msgid "%s: cannot be run as root\n" -msgstr "%s: kan inte köras som root\n" +msgid "slot name: \"%s\", output plugin: \"%s\", two_phase: %s" +msgstr "slot_name \"%s\", utdata-plugin \"%s\", two_phase \"%s\"" -#: option.c:167 +#: option.c:105 #, c-format -msgid "invalid old port number\n" -msgstr "ogiltigt gammalt portnummer\n" +msgid "%s: cannot be run as root" +msgstr "%s: kan inte köras som root" #: option.c:172 #, c-format -msgid "invalid new port number\n" -msgstr "ogiltigt nytt portnummer\n" +msgid "invalid old port number" +msgstr "ogiltigt gammalt portnummer" -#: option.c:198 +#: option.c:177 +#, c-format +msgid "invalid new port number" +msgstr "ogiltigt nytt portnummer" + +#: option.c:216 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Försök med \"%s --help\" för mer information.\n" -#: option.c:205 +#: option.c:223 #, c-format -msgid "too many command-line arguments (first is \"%s\")\n" -msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")\n" +msgid "too many command-line arguments (first is \"%s\")" +msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")" -#: option.c:208 +#: option.c:229 #, c-format -msgid "Running in verbose mode\n" -msgstr "Kör i utförligt läge\n" +msgid "Running in verbose mode" +msgstr "Kör i utförligt läge" # FIXME: the source code need to be fixed here. it paste words together -#: option.c:226 +#: option.c:247 msgid "old cluster binaries reside" msgstr "gamla klusterbinärer är i" -#: option.c:228 +#: option.c:249 msgid "new cluster binaries reside" msgstr "nya klusterbinärer är i" -#: option.c:230 +#: option.c:251 msgid "old cluster data resides" msgstr "gamla klusterdatan är i" -#: option.c:232 +#: option.c:253 msgid "new cluster data resides" msgstr "nya klusterdatan är i" -#: option.c:234 +#: option.c:255 msgid "sockets will be created" msgstr "uttag kommer skapas" -#: option.c:251 option.c:350 +#: option.c:272 option.c:374 #, c-format -msgid "could not determine current directory\n" -msgstr "kunde inte bestämma aktuell katalog\n" +msgid "could not determine current directory" +msgstr "kunde inte bestämma aktuell katalog" -#: option.c:254 +#: option.c:275 #, c-format -msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n" -msgstr "kan inte köra pg_upgrade inifrÃ¥n nya klusterdatakatalogen i Windows\n" +msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows" +msgstr "kan inte köra pg_upgrade inifrÃ¥n nya klusterdatakatalogen i Windows" -#: option.c:263 +#: option.c:284 #, c-format msgid "" "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n" @@ -1110,12 +1335,12 @@ msgstr "" "pg_upgrade uppgraderar ett PostgreSQL-kluster till en annan major-version.\n" "\n" -#: option.c:264 +#: option.c:285 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: option.c:265 +#: option.c:286 #, c-format msgid "" " pg_upgrade [OPTION]...\n" @@ -1124,17 +1349,17 @@ msgstr "" " pg_upgrade [FLAGGA]...\n" "\n" -#: option.c:266 +#: option.c:287 #, c-format msgid "Options:\n" msgstr "Flaggor:\n" -#: option.c:267 +#: option.c:288 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" msgstr " -b, --old-bindir=BINKAT gamla klustrets katalog för körbara filer\n" -#: option.c:268 +#: option.c:289 #, c-format msgid "" " -B, --new-bindir=BINDIR new cluster executable directory (default\n" @@ -1143,92 +1368,107 @@ msgstr "" " -B, --new-bindir=BINKAT nya klustrets katalog för körbara filer\n" " (standard är samma som för pg_upgrade)\n" -#: option.c:270 +#: option.c:291 #, c-format msgid " -c, --check check clusters only, don't change any data\n" msgstr " -c, --check testa klustren bara, ändra ingen data\n" -#: option.c:271 +#: option.c:292 #, c-format msgid " -d, --old-datadir=DATADIR old cluster data directory\n" msgstr " -d, --old-datadir=DATAKAT gamla klustrets datakatalog\n" -#: option.c:272 +#: option.c:293 #, c-format msgid " -D, --new-datadir=DATADIR new cluster data directory\n" msgstr " -D, --new-datadir=DATAKAT nya klustrets datakatalog\n" -#: option.c:273 +#: option.c:294 #, c-format msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" msgstr " -j, --jobs=NUM antal samtidiga processer eller trÃ¥dar att använda\n" -#: option.c:274 +#: option.c:295 #, c-format msgid " -k, --link link instead of copying files to new cluster\n" msgstr " -k, --link länka istället för att kopiera filer till nya klustret\n" -#: option.c:275 +#: option.c:296 #, c-format msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" msgstr " -N, --no-sync vänta inte pÃ¥ att ändingar säkert skrivits till disk\n" -#: option.c:276 +#: option.c:297 #, c-format msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n" msgstr " -o, --old-options=FLAGGOR serverflaggor för gamla klustret\n" -#: option.c:277 +#: option.c:298 #, c-format msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n" msgstr " -O, --new-options=FLAGGOR serverflaggor för nya klustret\n" -#: option.c:278 +#: option.c:299 #, c-format msgid " -p, --old-port=PORT old cluster port number (default %d)\n" msgstr " -p, --old-port=PORT gamla klustrets portnummer (standard %d)\n" -#: option.c:279 +#: option.c:300 #, c-format msgid " -P, --new-port=PORT new cluster port number (default %d)\n" msgstr " -P, --new-port=PORT nya klustrets portnummer (standard %d)\n" -#: option.c:280 +#: option.c:301 #, c-format msgid " -r, --retain retain SQL and log files after success\n" msgstr " -r, --retain behÃ¥ll SQL och loggfiler efter lyckad uppgradering\n" -#: option.c:281 +#: option.c:302 #, c-format msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" msgstr " -s, --socketdir=KAT uttagskatalog (standard är aktuell katalog.)\n" -#: option.c:282 +#: option.c:303 #, c-format msgid " -U, --username=NAME cluster superuser (default \"%s\")\n" msgstr " -U, --username=NAMN klustrets superuser (standard \"%s\")\n" -#: option.c:283 +#: option.c:304 #, c-format msgid " -v, --verbose enable verbose internal logging\n" msgstr " -v, --verbose slÃ¥ pÃ¥ utförligt intern loggning\n" -#: option.c:284 +#: option.c:305 #, c-format msgid " -V, --version display version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: option.c:285 +#: option.c:306 #, c-format msgid " --clone clone instead of copying files to new cluster\n" msgstr " -clone klona istället för att kopiera filer till nya klustret\n" -#: option.c:286 +#: option.c:307 +#, c-format +msgid " --copy copy files to new cluster (default)\n" +msgstr " --copy kopiera filer till nya klustret (standard)\n" + +#: option.c:308 +#, c-format +msgid " --copy-file-range copy files to new cluster with copy_file_range\n" +msgstr " --copy-file-range kopiera filer till nya klustret med copy_file_range\n" + +#: option.c:309 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METOD sätt synkmetod för att synka filer till disk\n" + +#: option.c:310 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denns hjälp, avsluta sedan\n" -#: option.c:287 +#: option.c:311 #, c-format msgid "" "\n" @@ -1243,7 +1483,7 @@ msgstr "" " stänga ner den postmaster som hanterar gamla klustret\n" " stänga ner den postmaster som hanterar nya klustret\n" -#: option.c:292 +#: option.c:316 #, c-format msgid "" "\n" @@ -1260,7 +1500,7 @@ msgstr "" " \"bin\"-katalogen för gamla versionen (-b BINKAT)\n" " \"bin\"-katalogen för nya versionen (-B BINKAT)\n" -#: option.c:298 +#: option.c:322 #, c-format msgid "" "\n" @@ -1273,7 +1513,7 @@ msgstr "" " pg_upgrade -d gammaltKluster/data -D nyttKluster/data -b gammaltKluster/bin -B nyttKluster/bin\n" "eller\n" -#: option.c:303 +#: option.c:327 #, c-format msgid "" " $ export PGDATAOLD=oldCluster/data\n" @@ -1288,7 +1528,7 @@ msgstr "" " $ export PGBINNEW=nyttKluster/bin\n" " $ pg_upgrade\n" -#: option.c:309 +#: option.c:333 #, c-format msgid "" " C:\\> set PGDATAOLD=oldCluster/data\n" @@ -1303,7 +1543,7 @@ msgstr "" " C:\\> set PGBINNEW=nyttKluster/bin\n" " C:\\> pg_upgrade\n" -#: option.c:315 +#: option.c:339 #, c-format msgid "" "\n" @@ -1312,259 +1552,290 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: option.c:316 +#: option.c:340 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: option.c:356 +#: option.c:380 #, c-format msgid "" "You must identify the directory where the %s.\n" -"Please use the %s command-line option or the %s environment variable.\n" +"Please use the %s command-line option or the %s environment variable." msgstr "" "Du mÃ¥ste identifiera katalogen där %s.\n" -"Använd kommandoradsflaggan %s eller omgivningsvariabeln %s.\n" +"Använd kommandoradsflaggan %s eller omgivningsvariabeln %s." -#: option.c:408 +#: option.c:433 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "Letar efter den riktiga datakatalogen i källklustret" -#: option.c:410 +#: option.c:435 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "Letar efter den riktiga datakatalogen för mÃ¥lklustret" -#: option.c:422 +#: option.c:448 #, c-format -msgid "could not get data directory using %s: %s\n" -msgstr "kunde inte hämta datakatalogen med %s: %s\n" +msgid "could not get data directory using %s: %m" +msgstr "kunde inte hämta datakatalogen med %s: %m" -#: option.c:473 +#: option.c:452 #, c-format -msgid "could not read line %d from file \"%s\": %s\n" -msgstr "kunde inte läsa rad %d frÃ¥n fil \"%s\": %s\n" +msgid "could not get data directory using %s: %s" +msgstr "kunde inte hämta datakatalogen med %s: %s" -#: option.c:490 +#: option.c:500 #, c-format -msgid "user-supplied old port number %hu corrected to %hu\n" -msgstr "användarangivet gammalt portnummer %hu korrigerat till %hu\n" +msgid "could not read line %d from file \"%s\": %m" +msgstr "kunde inte läsa rad %d frÃ¥n fil \"%s\": %m" -#: parallel.c:127 parallel.c:238 +#: option.c:517 #, c-format -msgid "could not create worker process: %s\n" -msgstr "kunde inte skapa arbetsprocess: %s\n" +msgid "user-supplied old port number %hu corrected to %hu" +msgstr "användarangivet gammalt portnummer %hu korrigerat till %hu" -#: parallel.c:146 parallel.c:259 +#: parallel.c:127 parallel.c:235 #, c-format -msgid "could not create worker thread: %s\n" -msgstr "kunde inte skapa arbetstrÃ¥d: %s\n" +msgid "could not create worker process: %m" +msgstr "kunde inte skapa arbetsprocess: %m" -#: parallel.c:300 +#: parallel.c:143 parallel.c:253 #, c-format -msgid "%s() failed: %s\n" -msgstr "%s() misslyckades: %s\n" +msgid "could not create worker thread: %m" +msgstr "kunde inte skapa arbetstrÃ¥d: %m" -#: parallel.c:304 +#: parallel.c:294 #, c-format -msgid "child process exited abnormally: status %d\n" -msgstr "barnprocess avslutade felaktigt: status %d\n" +msgid "%s() failed: %m" +msgstr "%s() misslyckades: %m" -#: parallel.c:319 +#: parallel.c:298 #, c-format -msgid "child worker exited abnormally: %s\n" -msgstr "barnprocess avslutade felaktigt: %s\n" +msgid "child process exited abnormally: status %d" +msgstr "barnprocess avslutade felaktigt: status %d" -#: pg_upgrade.c:103 +#: parallel.c:313 #, c-format -msgid "could not read permissions of directory \"%s\": %s\n" -msgstr "kunde inte läsa rättigheter pÃ¥ katalog \"%s\": %s\n" +msgid "child worker exited abnormally: %m" +msgstr "barnprocess avslutade felaktigt: %m" -#: pg_upgrade.c:135 +#: pg_upgrade.c:115 +#, c-format +msgid "could not read permissions of directory \"%s\": %m" +msgstr "kunde inte läsa rättigheter pÃ¥ katalog \"%s\": %m" + +#: pg_upgrade.c:147 #, c-format msgid "" "\n" "Performing Upgrade\n" -"------------------\n" +"------------------" msgstr "" "\n" "Utför uppgradering\n" -"------------------\n" +"------------------" -#: pg_upgrade.c:178 +#: pg_upgrade.c:192 #, c-format msgid "Setting next OID for new cluster" msgstr "Sätter nästa OID för nya klustret" -#: pg_upgrade.c:187 +#: pg_upgrade.c:216 #, c-format msgid "Sync data directory to disk" msgstr "Synkar datakatalog till disk" -#: pg_upgrade.c:199 +#: pg_upgrade.c:230 #, c-format msgid "" "\n" "Upgrade Complete\n" -"----------------\n" +"----------------" msgstr "" "\n" "Uppgradering klar\n" -"-----------------\n" +"-----------------" + +#: pg_upgrade.c:263 pg_upgrade.c:276 pg_upgrade.c:283 pg_upgrade.c:290 +#: pg_upgrade.c:308 pg_upgrade.c:319 +#, c-format +msgid "directory path for new cluster is too long" +msgstr "katalogsökväg för nytt kluster är för lÃ¥ng" -#: pg_upgrade.c:233 pg_upgrade.c:235 pg_upgrade.c:237 +#: pg_upgrade.c:297 pg_upgrade.c:299 pg_upgrade.c:301 pg_upgrade.c:303 #, c-format -msgid "could not create directory \"%s\": %m\n" -msgstr "kunde inte skapa katalog \"%s\": %m\n" +msgid "could not create directory \"%s\": %m" +msgstr "kunde inte skapa katalog \"%s\": %m" -#: pg_upgrade.c:282 +#: pg_upgrade.c:352 #, c-format -msgid "%s: could not find own program executable\n" -msgstr "%s: kunde inte hitta det egna programmets körbara fil\n" +msgid "%s: could not find own program executable" +msgstr "%s: kunde inte hitta det egna programmets körbara fil" -#: pg_upgrade.c:308 +#: pg_upgrade.c:378 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" -"Please shutdown that postmaster and try again.\n" +"Please shutdown that postmaster and try again." msgstr "" "Det verkar vara en postmaster igÃ¥ng som hanterar gamla klustret.\n" -"Stänga ner den postmastern och försök igen.\n" +"Stänga ner den postmastern och försök igen." -#: pg_upgrade.c:321 +#: pg_upgrade.c:391 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" -"Please shutdown that postmaster and try again.\n" +"Please shutdown that postmaster and try again." msgstr "" "Det verkar vara en postmaster igÃ¥ng som hanterar nya klustret.\n" -"Stänga ner den postmastern och försök igen.\n" +"Stänga ner den postmastern och försök igen." + +#: pg_upgrade.c:413 +#, c-format +msgid "Setting locale and encoding for new cluster" +msgstr "Sätter lokal och teckenkodning för nya klustret" -#: pg_upgrade.c:335 +#: pg_upgrade.c:489 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Analyserar alla rader i nya klustret" -#: pg_upgrade.c:348 +#: pg_upgrade.c:502 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Fryser alla rader i nya klustret" -#: pg_upgrade.c:368 +#: pg_upgrade.c:522 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Ã…terställer globala objekt i nya klustret" -#: pg_upgrade.c:384 +#: pg_upgrade.c:538 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "Ã…terställer databasscheman i nya klustret" -#: pg_upgrade.c:490 +#: pg_upgrade.c:662 #, c-format msgid "Deleting files from new %s" msgstr "Raderar filer frÃ¥n ny %s" -#: pg_upgrade.c:494 +#: pg_upgrade.c:666 #, c-format -msgid "could not delete directory \"%s\"\n" -msgstr "kunde inte ta bort katalog \"%s\"\n" +msgid "could not delete directory \"%s\"" +msgstr "kunde inte ta bort katalog \"%s\"" -#: pg_upgrade.c:513 +#: pg_upgrade.c:685 #, c-format msgid "Copying old %s to new server" msgstr "Kopierar gammal %s till ny server" -#: pg_upgrade.c:539 +#: pg_upgrade.c:711 #, c-format msgid "Setting oldest XID for new cluster" msgstr "Sätter äldsta XID för nya klustret" -#: pg_upgrade.c:547 +#: pg_upgrade.c:719 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "Sätter nästa transaktions-ID och epoch för nytt kluster" -#: pg_upgrade.c:577 +#: pg_upgrade.c:749 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "Sätter nästa multixact-ID och offset för nytt kluster" -#: pg_upgrade.c:601 +#: pg_upgrade.c:773 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Sätter äldsta multixact-ID i nytt kluster" -#: pg_upgrade.c:621 +#: pg_upgrade.c:793 #, c-format msgid "Resetting WAL archives" msgstr "Resettar WAL-arkiv" -#: pg_upgrade.c:664 +#: pg_upgrade.c:836 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Sätter räknarna frozenxid och minmxid för nytt kluster" -#: pg_upgrade.c:666 +#: pg_upgrade.c:838 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Sätter räknarenm minmxid för nytt kluster" -#: relfilenode.c:35 +#: pg_upgrade.c:929 +#, c-format +msgid "Restoring logical replication slots in the new cluster" +msgstr "Ã…terställer logiska replikeringsslottar i nya klustret" + +#: relfilenumber.c:35 #, c-format msgid "Cloning user relation files" msgstr "Klonar användarens relationsfiler" -#: relfilenode.c:38 +#: relfilenumber.c:38 #, c-format msgid "Copying user relation files" msgstr "Kopierar användarens relationsfiler" -#: relfilenode.c:41 +#: relfilenumber.c:41 +#, c-format +msgid "Copying user relation files with copy_file_range" +msgstr "Kopierar användarens relationsfiler med copy_file_range" + +#: relfilenumber.c:44 #, c-format msgid "Linking user relation files" msgstr "Länkar användarens relationsfiler" -#: relfilenode.c:115 +#: relfilenumber.c:118 #, c-format -msgid "old database \"%s\" not found in the new cluster\n" -msgstr "gamla databasen \"%s\" kan inte hittas i nya klustret\n" +msgid "old database \"%s\" not found in the new cluster" +msgstr "gamla databasen \"%s\" kan inte hittas i nya klustret" -#: relfilenode.c:218 +#: relfilenumber.c:221 #, c-format -msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "fel vid kontroll av filexistens \"%s.%s\" (\"%s\" till \"%s\"): %s\n" +msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "fel vid kontroll av filexistens \"%s.%s\" (\"%s\" till \"%s\"): %m" -#: relfilenode.c:236 +#: relfilenumber.c:238 #, c-format -msgid "rewriting \"%s\" to \"%s\"\n" -msgstr "skriver om \"%s\" till \"%s\"\n" +msgid "rewriting \"%s\" to \"%s\"" +msgstr "skriver om \"%s\" till \"%s\"" -#: relfilenode.c:244 +#: relfilenumber.c:246 #, c-format -msgid "cloning \"%s\" to \"%s\"\n" -msgstr "klonar \"%s\" till \"%s\"\n" +msgid "cloning \"%s\" to \"%s\"" +msgstr "klonar \"%s\" till \"%s\"" -#: relfilenode.c:249 +#: relfilenumber.c:251 #, c-format -msgid "copying \"%s\" to \"%s\"\n" -msgstr "kopierar \"%s\" till \"%s\"\n" +msgid "copying \"%s\" to \"%s\"" +msgstr "kopierar \"%s\" till \"%s\"" -#: relfilenode.c:254 +#: relfilenumber.c:256 #, c-format -msgid "linking \"%s\" to \"%s\"\n" -msgstr "länkar \"%s\" till \"%s\"\n" +msgid "copying \"%s\" to \"%s\" with copy_file_range" +msgstr "kopierar \"%s\" till \"%s\" med copy_file_range" -#: server.c:39 server.c:143 util.c:175 util.c:205 +#: relfilenumber.c:261 +#, c-format +msgid "linking \"%s\" to \"%s\"" +msgstr "länkar \"%s\" till \"%s\"" + +#: server.c:39 server.c:143 util.c:248 util.c:278 #, c-format msgid "Failure, exiting\n" msgstr "Misslyckades, avslutar\n" #: server.c:133 #, c-format -msgid "executing: %s\n" -msgstr "kör: %s\n" +msgid "executing: %s" +msgstr "kör: %s" #: server.c:139 #, c-format @@ -1579,15 +1850,15 @@ msgstr "" #: server.c:169 #, c-format -msgid "could not open version file \"%s\": %m\n" -msgstr "kunde inte öppna versionsfil \"%s\": %m\n" +msgid "could not open version file \"%s\": %m" +msgstr "kunde inte öppna versionsfil \"%s\": %m" #: server.c:173 #, c-format -msgid "could not parse version file \"%s\"\n" -msgstr "kunde inte tolka versionsfil \"%s\"\n" +msgid "could not parse version file \"%s\"" +msgstr "kunde inte tolka versionsfil \"%s\"" -#: server.c:291 +#: server.c:310 #, c-format msgid "" "\n" @@ -1596,161 +1867,109 @@ msgstr "" "\n" "%s" -#: server.c:295 +#: server.c:314 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" -"%s\n" +"%s" msgstr "" "kunde inte ansluta till käll-postmaster som startats med kommandot:\n" -"%s\n" +"%s" -#: server.c:299 +#: server.c:318 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" -"%s\n" +"%s" msgstr "" "kunde inte ansluta till mÃ¥l-postmaster som startats med kommandot:\n" -"%s\n" +"%s" -#: server.c:313 +#: server.c:332 #, c-format -msgid "pg_ctl failed to start the source server, or connection failed\n" -msgstr "pg_ctl misslyckades att start källservern eller sÃ¥ misslyckades anslutningen\n" +msgid "pg_ctl failed to start the source server, or connection failed" +msgstr "pg_ctl misslyckades att start källservern eller sÃ¥ misslyckades anslutningen" -#: server.c:315 +#: server.c:334 #, c-format -msgid "pg_ctl failed to start the target server, or connection failed\n" -msgstr "pg_ctl misslyckades att start mÃ¥lservern eller sÃ¥ misslyckades anslutningen\n" +msgid "pg_ctl failed to start the target server, or connection failed" +msgstr "pg_ctl misslyckades att start mÃ¥lservern eller sÃ¥ misslyckades anslutningen" -#: server.c:360 +#: server.c:379 #, c-format -msgid "out of memory\n" -msgstr "slut pÃ¥ minne\n" +msgid "out of memory" +msgstr "slut pÃ¥ minne" -#: server.c:373 +#: server.c:392 #, c-format -msgid "libpq environment variable %s has a non-local server value: %s\n" -msgstr "libpq:s omgivningsvariabel %s har ett icke-lokalt servervärde: %s\n" +msgid "libpq environment variable %s has a non-local server value: %s" +msgstr "libpq:s omgivningsvariabel %s har ett icke-lokalt servervärde: %s" #: tablespace.c:28 #, c-format msgid "" "Cannot upgrade to/from the same system catalog version when\n" -"using tablespaces.\n" +"using tablespaces." msgstr "" "Kan inte uppgradera till/frÃ¥n samma systemkatalogversion när\n" -"man använder tablespace.\n" +"man använder tablespace." #: tablespace.c:83 #, c-format -msgid "tablespace directory \"%s\" does not exist\n" -msgstr "tablespace-katalogen \"%s\" finns inte\n" +msgid "tablespace directory \"%s\" does not exist" +msgstr "tablespace-katalogen \"%s\" finns inte" #: tablespace.c:87 #, c-format -msgid "could not stat tablespace directory \"%s\": %s\n" -msgstr "kunde inte göra stat pÃ¥ tablespace-katalog \"%s\": %s\n" +msgid "could not stat tablespace directory \"%s\": %m" +msgstr "kunde inte göra stat pÃ¥ tablespace-katalog \"%s\": %m" #: tablespace.c:92 #, c-format -msgid "tablespace path \"%s\" is not a directory\n" -msgstr "tablespace-sökväg \"%s\" är inte en katalog\n" +msgid "tablespace path \"%s\" is not a directory" +msgstr "tablespace-sökväg \"%s\" är inte en katalog" -#: util.c:52 util.c:82 util.c:115 +#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172 #, c-format msgid "%-*s" msgstr "%-*s" -#: util.c:113 +#: util.c:107 #, c-format -msgid "%-*s\n" -msgstr "%-*s\n" +msgid "could not access directory \"%s\": %m" +msgstr "kunde inte komma Ã¥t katalog \"%s\": %m" -#: util.c:214 +#: util.c:287 #, c-format msgid "ok" msgstr "ok" -# FIXME: is this msgid correct? -#: version.c:184 -#, c-format -msgid "Checking for incompatible \"line\" data type" -msgstr "Letar efter inkompatibel \"line\"-datatyp" - -#: version.c:191 -#, c-format -msgid "" -"Your installation contains the \"line\" data type in user tables.\n" -"This data type changed its internal and input/output format\n" -"between your old and new versions so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Din installation innehÃ¥ller datatypen \"line\" i användartabeller. Denna\n" -"datatype har ändrat sitt interna format samt sitt in/ut-format mellan din\n" -"gamla och nya version sÃ¥ detta kluster kan för närvarande inte uppgraderas.\n" -"Du kan radera problemkolumnerna och Ã¥terstarta uppgraderingen.\n" -"En lista med problemkolumner finns i filen:\n" -" %s\n" -"\n" - -#: version.c:222 -#, c-format -msgid "Checking for invalid \"unknown\" user columns" -msgstr "Letar efter ogiltiga användarkolumner av typen \"unknown\"" - -#: version.c:229 -#, c-format -msgid "" -"Your installation contains the \"unknown\" data type in user tables.\n" -"This data type is no longer allowed in tables, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Din installation innehÃ¥ller datatypen \"unknown\" i användartabeller.\n" -"Denna datatyp tillÃ¥ts inte längre i tabeller sÃ¥ detta kluster kan\n" -"för närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n" -"Ã¥terstarta uppgraderingen.\n" -"En lista med problemkolumner finns i filen:\n" -" %s\n" -"\n" - -#: version.c:253 +#: version.c:44 #, c-format msgid "Checking for hash indexes" msgstr "Letar efter hash-index" -#: version.c:331 +#: version.c:121 #, c-format msgid "warning" msgstr "varning" -#: version.c:333 +#: version.c:123 #, c-format msgid "" "\n" "Your installation contains hash indexes. These indexes have different\n" "internal formats between your old and new clusters, so they must be\n" "reindexed with the REINDEX command. After upgrading, you will be given\n" -"REINDEX instructions.\n" -"\n" +"REINDEX instructions." msgstr "" "\n" "Din installation innehÃ¥ller hash-index. Dessa index har olika internt\n" "format i ditt gamla och nya kluster sÃ¥ de mÃ¥ste omindexeras med\n" "kommandot REINDEX. Efter uppgraderingen sÃ¥ kommer du fÃ¥\n" -"REINDEX-instruktioner.\n" -"\n" +"REINDEX-instruktioner." -#: version.c:339 +#: version.c:129 #, c-format msgid "" "\n" @@ -1759,8 +1978,7 @@ msgid "" "reindexed with the REINDEX command. The file\n" " %s\n" "when executed by psql by the database superuser will recreate all invalid\n" -"indexes; until then, none of these indexes will be used.\n" -"\n" +"indexes; until then, none of these indexes will be used." msgstr "" "\n" "Din installation innehÃ¥ller hash-index. Dessa index har olika internt\n" @@ -1768,44 +1986,19 @@ msgstr "" "kommandot REINDEX. Filen\n" " %s\n" "kan köras med psql av databasens superuser och kommer Ã¥terskapa alla\n" -"ogiltiga index; innan dess sÃ¥ kommer inget av dess index användas.\n" -"\n" - -#: version.c:365 -#, c-format -msgid "Checking for invalid \"sql_identifier\" user columns" -msgstr "Letar efter ogiltiga användarkolumner av typen \"sql_identifier\"" +"ogiltiga index; innan dess sÃ¥ kommer inget av dess index användas." -#: version.c:373 -#, c-format -msgid "" -"Your installation contains the \"sql_identifier\" data type in user tables.\n" -"The on-disk format for this data type has changed, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n" -"\n" -msgstr "" -"Din installation innehÃ¥ller datatypen \"sql_identifier\" i användartabeller.\n" -"Formatet pÃ¥ disk för denna datatyp har ändrats sÃ¥ detta kluster kan för\n" -"närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n" -"Ã¥terstarta uppgraderingen.\n" -"En lista med problemkolumner finns i filen:\n" -" %s\n" -"\n" - -#: version.c:397 +#: version.c:153 #, c-format msgid "Checking for extension updates" msgstr "Letar efter uppdatering av utökningar" -#: version.c:449 +#: version.c:200 #, c-format msgid "notice" msgstr "notis" -#: version.c:450 +#: version.c:201 #, c-format msgid "" "\n" @@ -1813,12 +2006,11 @@ msgid "" "with the ALTER EXTENSION command. The file\n" " %s\n" "when executed by psql by the database superuser will update\n" -"these extensions.\n" -"\n" +"these extensions." msgstr "" "\n" "Din installation innehÃ¥ller utökningar som skall updateras med kommandot\n" "ALTER EXTENSION. Filen\n" " %s\n" "kan köras med psql av databasens superuser och kommer uppdatera\n" -"dessa utökningar.\n" +"dessa utökningar." diff --git a/src/bin/pg_upgrade/po/uk.po b/src/bin/pg_upgrade/po/uk.po index dc300e50bc4e0..2eb0912ec274d 100644 --- a/src/bin/pg_upgrade/po/uk.po +++ b/src/bin/pg_upgrade/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-08-17 08:46+0000\n" -"PO-Revision-Date: 2021-08-17 11:18\n" +"POT-Creation-Date: 2025-03-29 10:38+0000\n" +"PO-Revision-Date: 2025-04-01 15:40\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,229 +14,425 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_14_DEV/pg_upgrade.pot\n" -"X-Crowdin-File-ID: 778\n" +"X-Crowdin-File: /REL_17_STABLE/pg_upgrade.pot\n" +"X-Crowdin-File-ID: 1028\n" -#: check.c:70 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "недоÑтатньо пам'Ñті\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" + +#: ../../common/restricted_token.c:168 +#, c-format +msgid "could not get exit code from subprocess: error code %lu" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ñ†ÐµÑу: код помилки %lu" + +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "не можу знайти кориÑтувача з ефективним ID %ld: %s" + +#: ../../common/username.c:45 +msgid "user does not exist" +msgstr "кориÑтувача не Ñ–Ñнує" + +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "невдала підÑтановка імені кориÑтувача: код помилки %lu" + +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "аргумент командної оболонки міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "назва бази даних міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: check.c:111 +msgid "Checking for system-defined composite types in user tables" +msgstr "Перевірка Ñкладених типів визначених ÑиÑтемою у таблицÑÑ… кориÑтувача" + +#: check.c:118 +msgid "Your installation contains system-defined composite types in user tables.\n" +"These type OIDs are not stable across PostgreSQL versions,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить ÑиÑтемно визначені Ñкладені типи у таблицÑÑ… кориÑтувачів.\n" +"OID цих типів не Ñтабільні між верÑÑ–Ñми PostgreSQL, тому цей клаÑтер наразі не може бути оновлений.\n" +"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n" + +#: check.c:132 +msgid "Checking for incompatible \"line\" data type" +msgstr "Перевірка неÑуміÑного типу даних \"line\"" + +#: check.c:137 +msgid "Your installation contains the \"line\" data type in user tables.\n" +"This data type changed its internal and input/output format\n" +"between your old and new versions so this\n" +"cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить тип даних \"line\" в таблицÑÑ… кориÑтувача.\n" +"Внутрішній формат та формат вводу/виводу цього типу даних змінено між вашою Ñтарою та новими верÑÑ–Ñми,\n" +"тому цей клаÑтер наразі не може бути оновлений.\n" +"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n" + +#: check.c:154 +msgid "Checking for reg* data types in user tables" +msgstr "Перевірка типів даних reg* в кориÑтувацьких таблицÑÑ…" + +#: check.c:181 +msgid "Your installation contains one of the reg* data types in user tables.\n" +"These data types reference system OIDs that are not preserved by\n" +"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" +"drop the problem columns and restart the upgrade.\n" +msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить один з типів даних reg* у таблицÑÑ… кориÑтувача.\n" +"Ці типи даних поÑилаютьÑÑ Ð½Ð° OID ÑиÑтеми, Ñкі не зберігаютьÑÑ Ð·Ð° допомогою pg_upgrade, тому цей клаÑтер наразі не може бути оновлений.\n" +"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n" + +#: check.c:193 +msgid "Checking for incompatible \"aclitem\" data type" +msgstr "Перевірка неÑуміÑного типу даних \"aclitem\"" + +#: check.c:198 +msgid "Your installation contains the \"aclitem\" data type in user tables.\n" +"The internal format of \"aclitem\" changed in PostgreSQL version 16\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns and restart the upgrade.\n" +msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить тип даних \"aclitem\" у таблицÑÑ… кориÑтувача. Внутрішній формат \"aclitem\" змінено під Ñ‡Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ— 16,\n" +"тому цей клаÑтер наразі не може бути оновлений.\n" +"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n" + +#: check.c:217 +msgid "Checking for invalid \"unknown\" user columns" +msgstr "Перевірка неприпуÑтимих кориÑтувацьких Ñтовпців \"unknown\"" + +#: check.c:222 +msgid "Your installation contains the \"unknown\" data type in user tables.\n" +"This data type is no longer allowed in tables, so this cluster\n" +"cannot currently be upgraded. You can drop the problem columns\n" +"and restart the upgrade.\n" +msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить \"unknown\" тип даних у таблицÑÑ… кориÑтувача.\n" +"Цей тип даних більше не допуÑкаєтьÑÑ Ð² таблицÑÑ…,\n" +"тому цей клаÑтер наразі не може бути оновлений.\n" +"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n" + +#: check.c:239 +msgid "Checking for invalid \"sql_identifier\" user columns" +msgstr "Перевірка неприпуÑтимих кориÑтувацьких Ñтовпців \"sql_identifier\"" + +#: check.c:244 +msgid "Your installation contains the \"sql_identifier\" data type in user tables.\n" +"The on-disk format for this data type has changed, so this\n" +"cluster cannot currently be upgraded. You can drop the problem\n" +"columns and restart the upgrade.\n" +msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить \"sql_identifier\" тип даних у таблицÑÑ… кориÑтувача.\n" +"Формат Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу даних змінено,\n" +"тому цей клаÑтер наразі не може бути оновлений.\n" +"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n" + +#: check.c:255 +msgid "Checking for incompatible \"jsonb\" data type in user tables" +msgstr "Перевірка неÑуміÑного типу даних \"jsonb\" в кориÑтувацьких таблицÑÑ…" + +#: check.c:260 +msgid "Your installation contains the \"jsonb\" data type in user tables.\n" +"The internal format of \"jsonb\" changed during 9.4 beta so this\n" +"cluster cannot currently be upgraded. You can drop the problem \n" +"columns and restart the upgrade.\n" +msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить тип даних \"jsonb\" у таблицÑÑ… кориÑтувача.\n" +"Внутрішній формат \"jsonb\" змінено під Ñ‡Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ— 9.4 beta,\n" +"тому цей клаÑтер наразі не може бути оновлений.\n" +"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n" + +#: check.c:272 +msgid "Checking for removed \"abstime\" data type in user tables" +msgstr "Перевірка видаленого типу даних \"abstime\" в кориÑтувацьких таблицÑÑ…" + +#: check.c:277 +msgid "Your installation contains the \"abstime\" data type in user tables.\n" +"The \"abstime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "КориÑтувацькі таблиці у вашій інÑталÑції міÑÑ‚Ñть тип даних \"abstime\".\n" +"Тип \"abstime\" був видалений з верÑÑ–Ñ— PostgreSQL 12, тому цей клаÑтер \n" +"наразі не може бути оновлений. Ви можете видалите проблемні \n" +"Ñтовпці або змінити Ñ—Ñ… на інший тип даних, Ñ– перезапуÑтити\n" +"оновленнÑ.\n" + +#: check.c:285 +msgid "Checking for removed \"reltime\" data type in user tables" +msgstr "Перевірка видаленого типу даних \"reltime\" в кориÑтувацьких таблицÑÑ…" + +#: check.c:290 +msgid "Your installation contains the \"reltime\" data type in user tables.\n" +"The \"reltime\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "КориÑтувацькі таблиці у вашій інÑталÑції міÑÑ‚Ñть тип даних \"reltime\".\n" +"Тип \"reltime\" був видалений з верÑÑ–Ñ— PostgreSQL 12, тому цей клаÑтер \n" +"наразі не може бути оновлений. Ви можете видалите проблемні \n" +"Ñтовпці або змінити Ñ—Ñ… на інший тип даних, Ñ– перезапуÑтити\n" +"оновленнÑ.\n" + +#: check.c:298 +msgid "Checking for removed \"tinterval\" data type in user tables" +msgstr "Перевірка видаленого типу даних \"tinterval\" в кориÑтувацьких таблицÑÑ…" + +#: check.c:303 +msgid "Your installation contains the \"tinterval\" data type in user tables.\n" +"The \"tinterval\" type has been removed in PostgreSQL version 12,\n" +"so this cluster cannot currently be upgraded. You can drop the\n" +"problem columns, or change them to another data type, and restart\n" +"the upgrade.\n" +msgstr "КориÑтувацькі таблиці у вашій інÑталÑції міÑÑ‚Ñть тип даних \"tinterval\".\n" +"Тип \"tinterval\" був видалений з верÑÑ–Ñ— PostgreSQL 12, тому цей клаÑтер \n" +"наразі не може бути оновлений. Ви можете видалите проблемні \n" +"Ñтовпці або змінити Ñ—Ñ… на інший тип даних, Ñ– перезапуÑтити\n" +"оновленнÑ.\n" + +#: check.c:345 +#, c-format +msgid "Checking data type usage" +msgstr "Перевірка викориÑÑ‚Ð°Ð½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð² даних" + +#: check.c:480 +#, c-format +msgid "failed check: %s" +msgstr "помилка перевірки: %s" + +#: check.c:483 +msgid "A list of the problem columns is in the file:" +msgstr "СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:" + +#: check.c:495 check.c:963 check.c:1136 check.c:1251 check.c:1345 check.c:1473 +#: check.c:1549 check.c:1613 check.c:1686 check.c:1865 check.c:1884 +#: check.c:1953 check.c:2005 file.c:378 file.c:415 function.c:189 option.c:493 +#: version.c:79 version.c:177 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не можливо відкрити файл \"%s\": %m" + +#: check.c:522 +#, c-format +msgid "Data type checks failed: %s" +msgstr "Помилка перевірки типів даних: %s" + +#: check.c:563 #, c-format msgid "Performing Consistency Checks on Old Live Server\n" -"------------------------------------------------\n" +"------------------------------------------------" msgstr "Перевірка ціліÑтноÑті на Ñтарому працюючому Ñервері\n" -"------------------------------------------------\n" +"------------------------------------------------" -#: check.c:76 +#: check.c:569 #, c-format msgid "Performing Consistency Checks\n" -"-----------------------------\n" +"-----------------------------" msgstr "ÐŸÑ€Ð¾Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¾Ðº ціліÑтноÑті\n" -"-----------------------------\n" +"-----------------------------" -#: check.c:213 +#: check.c:718 #, c-format msgid "\n" -"*Clusters are compatible*\n" +"*Clusters are compatible*" msgstr "\n" -"*КлаÑтери ÑуміÑні*\n" +"*КлаÑтери ÑуміÑні*" -#: check.c:219 +#: check.c:726 #, c-format msgid "\n" "If pg_upgrade fails after this point, you must re-initdb the\n" -"new cluster before continuing.\n" +"new cluster before continuing." msgstr "\n" "Якщо робота pg_upgrade піÑÐ»Ñ Ñ†Ñ–Ñ”Ñ— точки перерветьÑÑ, вам потрібно буде заново виконати initdb \n" -"Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера, перед продовженнÑм.\n" +"Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера, перед продовженнÑм." -#: check.c:264 +#: check.c:767 #, c-format msgid "Optimizer statistics are not transferred by pg_upgrade.\n" "Once you start the new server, consider running:\n" -" %s/vacuumdb %s--all --analyze-in-stages\n\n" +" %s/vacuumdb %s--all --analyze-in-stages" msgstr "СтатиÑтика оптимізатора не передаєтьÑÑ Ð·Ð° допомогою pg_upgrade.\n" -"ПіÑÐ»Ñ Ð·Ð°Ð¿ÑƒÑку нового Ñерверу, розглÑньте можливіÑть запуÑку:\n" -" %s/vacuumdb %s--all --analyze-in-stages\n\n" +"ПіÑÐ»Ñ Ð·Ð°Ð¿ÑƒÑку нового Ñерверу розглÑньте можливіÑть запуÑку:\n" +" %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:270 +#: check.c:773 #, c-format msgid "Running this script will delete the old cluster's data files:\n" -" %s\n" +" %s" msgstr "При запуÑку цього Ñкрипту файли даних Ñтарого клаÑтера будуть видалені:\n" -" %s\n" +" %s" -#: check.c:275 +#: check.c:778 #, c-format msgid "Could not create a script to delete the old cluster's data files\n" "because user-defined tablespaces or the new cluster's data directory\n" "exist in the old cluster directory. The old cluster's contents must\n" -"be deleted manually.\n" +"be deleted manually." msgstr "Ðе вдалоÑÑ Ñтворити Ñкрипт Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² даних Ñтарого клаÑтеру,\n" "тому що каталог даних Ñтарого клаÑтера міÑтить кориÑтувацькі табличні\n" "проÑтори або каталог даних нового клаÑтера. ВміÑÑ‚ Ñтарого клаÑтера\n" -"треба буде видалити вручну.\n" +"треба буде видалити вручну." -#: check.c:287 +#: check.c:790 #, c-format msgid "Checking cluster versions" msgstr "Перевірка верÑій клаÑтерів" -#: check.c:299 +#: check.c:802 #, c-format -msgid "This utility can only upgrade from PostgreSQL version 8.4 and later.\n" -msgstr "Ð¦Ñ ÑƒÑ‚Ð¸Ð»Ñ–Ñ‚Ð° може виконувати Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ з верÑÑ–Ñ— PostgreSQL 8.4 Ñ– новіше.\n" +msgid "This utility can only upgrade from PostgreSQL version %s and later." +msgstr "Ð¦Ñ ÑƒÑ‚Ð¸Ð»Ñ–Ñ‚Ð° може виконувати Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñ‚Ñ–Ð»ÑŒÐºÐ¸ з верÑÑ–Ñ— PostgreSQL %s Ñ– новіше." -#: check.c:303 +#: check.c:807 #, c-format -msgid "This utility can only upgrade to PostgreSQL version %s.\n" -msgstr "Ð¦Ñ ÑƒÑ‚Ð¸Ð»Ñ–Ñ‚Ð° може тільки підвищувати верÑÑ–ÑŽ PostgreSQL до %s.\n" +msgid "This utility can only upgrade to PostgreSQL version %s." +msgstr "Ð¦Ñ ÑƒÑ‚Ð¸Ð»Ñ–Ñ‚Ð° може тільки підвищувати верÑÑ–ÑŽ PostgreSQL до верÑÑ–Ñ— %s." -#: check.c:312 +#: check.c:816 #, c-format -msgid "This utility cannot be used to downgrade to older major PostgreSQL versions.\n" -msgstr "Ð¦Ñ ÑƒÑ‚Ð¸Ð»Ñ–Ñ‚Ð° не може не може викориÑтовуватиÑÑŒ щоб понижувати верÑÑ–ÑŽ до більш Ñтарих оÑновних верÑій PostgreSQL.\n" +msgid "This utility cannot be used to downgrade to older major PostgreSQL versions." +msgstr "Ð¦Ñ ÑƒÑ‚Ð¸Ð»Ñ–Ñ‚Ð° не може викориÑтовуватиÑÑŒ Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ñ Ð²ÐµÑ€ÑÑ–Ñ— до більш Ñтарих оÑновних верÑій PostgreSQL." -#: check.c:317 +#: check.c:821 #, c-format -msgid "Old cluster data and binary directories are from different major versions.\n" -msgstr "Каталог даних Ñ– двійковий каталог Ñтарого клаÑтера з різних оÑновних верÑій.\n" +msgid "Old cluster data and binary directories are from different major versions." +msgstr "Каталог даних Ñ– двійковий каталог Ñтарого клаÑтера з різних оÑновних верÑій." -#: check.c:320 +#: check.c:824 #, c-format -msgid "New cluster data and binary directories are from different major versions.\n" -msgstr "Каталог даних Ñ– двійковий каталог нового клаÑтера з різних оÑновних верÑій.\n" +msgid "New cluster data and binary directories are from different major versions." +msgstr "Каталог даних нового клаÑтера Ñ– двійковий каталог з різних оÑновних верÑій." -#: check.c:337 +#: check.c:839 #, c-format -msgid "When checking a pre-PG 9.1 live old server, you must specify the old server's port number.\n" -msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ Ñтарого працюючого Ñервера до верÑÑ–Ñ— 9.1, вам необхідно вказати номер порта цього Ñервера.\n" +msgid "When checking a live server, the old and new port numbers must be different." +msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ працюючого Ñервера, Ñтарий Ñ– новий номер порта повинні бути різними." -#: check.c:341 +#: check.c:859 #, c-format -msgid "When checking a live server, the old and new port numbers must be different.\n" -msgstr "Ð”Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ працюючого Ñервера, Ñтарий Ñ– новий номер порта повинні бути різними.\n" +msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" +msgstr "Ðовий клаÑтер бази даних \"%s\" не порожній: знайдено Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\"" -#: check.c:356 -#, c-format -msgid "encodings for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних \"%s\" не збігаютьÑÑ: Ñтаре \"%s\", нове \"%s\"\n" - -#: check.c:361 -#, c-format -msgid "lc_collate values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ lc_collate Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних \"%s\" не збігаютьÑÑ: Ñтаре \"%s\", нове \"%s\"\n" - -#: check.c:364 -#, c-format -msgid "lc_ctype values for database \"%s\" do not match: old \"%s\", new \"%s\"\n" -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ lc_ctype Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних \"%s\" не збігаютьÑÑ: Ñтаре \"%s\", нове \"%s\"\n" - -#: check.c:437 -#, c-format -msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"\n" -msgstr "Ðовий клаÑтер бази даних \"%s\" не порожній: знайдено Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\"\n" - -#: check.c:494 +#: check.c:882 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Перевірка каталогів табличних проÑторів клаÑтера" -#: check.c:505 +#: check.c:893 #, c-format -msgid "new cluster tablespace directory already exists: \"%s\"\n" -msgstr "каталог нового клаÑтерного табличного проÑтору вже Ñ–Ñнує: \"%s\"\n" +msgid "new cluster tablespace directory already exists: \"%s\"" +msgstr "каталог нового клаÑтерного табличного проÑтору вже Ñ–Ñнує: \"%s\"" -#: check.c:538 +#: check.c:926 #, c-format msgid "\n" -"WARNING: new data directory should not be inside the old data directory, e.g. %s\n" +"WARNING: new data directory should not be inside the old data directory, i.e. %s" msgstr "\n" -"ПОПЕРЕДЖЕÐÐЯ: новий каталог даних не повинен бути вÑередині Ñтарого каталогу даних, наприклад %s\n" +"ПОПЕРЕДЖЕÐÐЯ: новий каталог даних не повинен бути вÑередині Ñтарого каталогу даних, наприклад %s" -#: check.c:562 +#: check.c:950 #, c-format msgid "\n" -"WARNING: user-defined tablespace locations should not be inside the data directory, e.g. %s\n" +"WARNING: user-defined tablespace locations should not be inside the data directory, i.e. %s" msgstr "\n" -"ПОПЕРЕДЖЕÐÐЯ: кориÑтувацькі Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¸Ñ… проÑторів не повинні бути вÑередині каталогу даних, наприклад %s\n" +"ПОПЕРЕДЖЕÐÐЯ: кориÑтувацькі Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¸Ñ… проÑторів не повинні бути вÑередині каталогу даних, наприклад %s" -#: check.c:572 +#: check.c:960 #, c-format msgid "Creating script to delete old cluster" msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ñкрипту Ð´Ð»Ñ Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñтарого клаÑтеру" -#: check.c:575 check.c:839 check.c:937 check.c:1016 check.c:1278 file.c:336 -#: function.c:240 option.c:497 version.c:54 version.c:204 version.c:376 -#: version.c:511 +#: check.c:1014 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %s\n" +msgid "could not add execute permission to file \"%s\": %m" +msgstr "не вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ право Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" -#: check.c:631 -#, c-format -msgid "could not add execute permission to file \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð´Ð¾Ð´Ð°Ñ‚Ð¸ право Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %s\n" - -#: check.c:651 +#: check.c:1034 #, c-format msgid "Checking database user is the install user" msgstr "Перевірка, чи Ñ” кориÑтувач бази даних Ñтартовим кориÑтувачем" -#: check.c:667 +#: check.c:1050 #, c-format -msgid "database user \"%s\" is not the install user\n" -msgstr "кориÑтувач бази даних \"%s\" не Ñ” Ñтартовим кориÑтувачем\n" +msgid "database user \"%s\" is not the install user" +msgstr "кориÑтувач бази даних \"%s\" не Ñ” Ñтартовим кориÑтувачем" -#: check.c:678 +#: check.c:1061 #, c-format -msgid "could not determine the number of users\n" -msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ кількіÑть кориÑтувачів\n" +msgid "could not determine the number of users" +msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ кількіÑть кориÑтувачів" -#: check.c:686 +#: check.c:1069 #, c-format -msgid "Only the install user can be defined in the new cluster.\n" -msgstr "Ð’ новому клаÑтері може бути визначеним тільки Ñтартовий кориÑтувач.\n" +msgid "Only the install user can be defined in the new cluster." +msgstr "Ð’ новому клаÑтері може бути визначеним тільки Ñтартовий кориÑтувач." -#: check.c:706 +#: check.c:1098 #, c-format msgid "Checking database connection settings" msgstr "Перевірка параметрів Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних" -#: check.c:728 +#: check.c:1124 +#, c-format +msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false" +msgstr "template0 не повинна дозволÑти підключеннÑ, тобто pg_database.datallowconn повинно бути false" + +#: check.c:1150 check.c:1270 check.c:1367 check.c:1492 check.c:1568 +#: check.c:1626 check.c:1706 check.c:1897 check.c:2022 function.c:210 #, c-format -msgid "template0 must not allow connections, i.e. its pg_database.datallowconn must be false\n" -msgstr "template0 не повинна дозволÑти підключеннÑ, тобто pg_database.datallowconn повинно бути false\n" +msgid "fatal" +msgstr "збій" -#: check.c:738 +#: check.c:1151 #, c-format -msgid "All non-template0 databases must allow connections, i.e. their pg_database.datallowconn must be true\n" -msgstr "Ð’ÑÑ– бази даних, окрім template0, повинні дозволÑти підключеннÑ, тобто pg_database.datallowconn повинно бути true\n" +msgid "All non-template0 databases must allow connections, i.e. their\n" +"pg_database.datallowconn must be true. Your installation contains\n" +"non-template0 databases with their pg_database.datallowconn set to\n" +"false. Consider allowing connection for all non-template0 databases\n" +"or drop the databases which do not allow connections. A list of\n" +"databases with the problem is in the file:\n" +" %s" +msgstr "Ð’ÑÑ– бази даних, окрім template0, повинні дозволÑти підключеннÑ, тобто\n" +"pg_database.datallowconn повинно бути true. Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить\n" +"бази даних окрім template0 Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ pg_database.datallowconn Ñких дорівнює \n" +"false. РозглÑньте можливіÑть надати дозвіл на Ð·â€™Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²ÑÑ–Ñ… баз даних, \n" +"Ñкі не Ñ” шаблоном, або видалити баз даних, Ñкі не дозволÑють з’єднаннÑ. \n" +"СпиÑок баз даних з проблемою знаходитьÑÑ Ñƒ файлі:\n" +" %s" -#: check.c:763 +#: check.c:1176 #, c-format msgid "Checking for prepared transactions" msgstr "Перевірка підготовлених транзакцій" -#: check.c:772 +#: check.c:1185 #, c-format -msgid "The source cluster contains prepared transactions\n" -msgstr "Початковий клаÑтер міÑтить підготовлені транзакції\n" +msgid "The source cluster contains prepared transactions" +msgstr "Початковий клаÑтер міÑтить підготовлені транзакції" -#: check.c:774 +#: check.c:1187 #, c-format -msgid "The target cluster contains prepared transactions\n" -msgstr "Цільовий клаÑтер міÑтить підготовлені транзакції\n" +msgid "The target cluster contains prepared transactions" +msgstr "Цільовий клаÑтер міÑтить підготовлені транзакції" -#: check.c:800 +#: check.c:1212 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Перевірка невідповідноÑті при передаванні bigint в contrib/isn" -#: check.c:861 check.c:962 check.c:1038 check.c:1095 check.c:1154 check.c:1183 -#: check.c:1301 function.c:262 version.c:278 version.c:316 version.c:460 -#, c-format -msgid "fatal\n" -msgstr "збій\n" - -#: check.c:862 +#: check.c:1271 #, c-format msgid "Your installation contains \"contrib/isn\" functions which rely on the\n" "bigint data type. Your old and new clusters pass bigint values\n" @@ -244,909 +440,932 @@ msgid "Your installation contains \"contrib/isn\" functions which rely on the\n" "manually dump databases in the old cluster that use \"contrib/isn\"\n" "facilities, drop them, perform the upgrade, and then restore them. A\n" "list of the problem functions is in the file:\n" -" %s\n\n" +" %s" msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить функції \"contrib/isn\", що викориÑтовують тип даних bigint. Старі та нові клаÑтери передають Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ bigint по-різному, тому цей клаÑтер наразі неможливо оновити. Ви можете вручну вивантажити бази даних зі Ñтарого клаÑтеру, що викориÑтовує заÑоби \"contrib/isn\", видалити Ñ—Ñ…, виконати оновленнÑ, а потім відновити Ñ—Ñ…. СпиÑок проблемних функцій подано у файлі:\n" -" %s\n\n" +" %s" -#: check.c:885 +#: check.c:1293 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Перевірка поÑтфікÑних операторів визначених кориÑтувачем" -#: check.c:963 +#: check.c:1368 #, c-format msgid "Your installation contains user-defined postfix operators, which are not\n" "supported anymore. Consider dropping the postfix operators and replacing\n" "them with prefix operators or function calls.\n" "A list of user-defined postfix operators is in the file:\n" -" %s\n\n" +" %s" msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить кориÑтувацькі поÑтфікÑні оператори, що більше не підтримуютьÑÑ.\n" "РозглÑньте можливіÑть Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ð¿Ð¾ÑтфікÑних операторів та заміни Ñ—Ñ… на префікÑні оператори або виклики функцій.\n" "СпиÑок кориÑтувацьких поÑтфікÑних операторів знаходитьÑÑ Ñƒ файлі:\n" -" %s\n\n" +" %s" + +#: check.c:1392 +#, c-format +msgid "Checking for incompatible polymorphic functions" +msgstr "Перевірка неÑуміÑних поліморфних функцій" -#: check.c:984 +#: check.c:1493 +#, c-format +msgid "Your installation contains user-defined objects that refer to internal\n" +"polymorphic functions with arguments of type \"anyarray\" or \"anyelement\".\n" +"These user-defined objects must be dropped before upgrading and restored\n" +"afterwards, changing them to refer to the new corresponding functions with\n" +"arguments of type \"anycompatiblearray\" and \"anycompatible\".\n" +"A list of the problematic objects is in the file:\n" +" %s" +msgstr "У вашій інÑталÑції міÑÑ‚ÑтьÑÑ ÐºÐ¾Ñ€Ð¸Ñтувацькі об'єкти, Ñкі поÑилаютьÑÑ Ð½Ð° внутрішні\n" +"поліморфні функції з аргументами типу \"anyarray\" або \"anyelement\".\n" +"Ці кориÑтувацькі об'єкти повинні бути видалені перед оновленнÑм Ñ– відновлені\n" +"піÑÐ»Ñ Ñ†ÑŒÐ¾Ð³Ð¾, змінивши Ñ—Ñ… поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° нові відповідні функції з\n" +"аргументами типу \"anycompatiblearray\" Ñ– \"anycompatible\".\n" +"СпиÑок проблемних об'єктів знаходитьÑÑ Ñƒ файлі:\n" +" %s" + +#: check.c:1517 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Перевірка таблиць WITH OIDS" -#: check.c:1039 +#: check.c:1569 #, c-format msgid "Your installation contains tables declared WITH OIDS, which is not\n" "supported anymore. Consider removing the oid column using\n" " ALTER TABLE ... SET WITHOUT OIDS;\n" "A list of tables with the problem is in the file:\n" -" %s\n\n" +" %s" msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить таблиці, Ñтворені Ñк WITH OIDS, що більше не підтримуютьÑÑ. РозглÑньте Ð²Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñтовпців, що міÑÑ‚Ñть oid за допомогою\n" " ALTER TABLE ... SET WITHOUT OIDS;\n" "СпиÑок проблемних таблиць подано у файлі:\n" -" %s\n\n" +" %s" -#: check.c:1067 -#, c-format -msgid "Checking for system-defined composite types in user tables" -msgstr "Перевірка Ñкладених типів визначених ÑиÑтемою у таблицÑÑ… кориÑтувача" - -#: check.c:1096 -#, c-format -msgid "Your installation contains system-defined composite type(s) in user tables.\n" -"These type OIDs are not stable across PostgreSQL versions,\n" -"so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n\n" -msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить Ñкладені типи визначені ÑиÑтемою у таблицÑÑ… кориÑтувача.\n" -"Ці типи OID не Ñтабільні між верÑÑ–Ñми PostgreSQL, тому цей клаÑтер наразі не може бути оновлений.\n" -"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n" -"СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:\n" -" %s\n\n" - -#: check.c:1124 -#, c-format -msgid "Checking for reg* data types in user tables" -msgstr "Перевірка типів даних reg* в кориÑтувацьких таблицÑÑ…" - -#: check.c:1155 -#, c-format -msgid "Your installation contains one of the reg* data types in user tables.\n" -"These data types reference system OIDs that are not preserved by\n" -"pg_upgrade, so this cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n\n" -msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить один з типів даних reg* у таблицÑÑ… кориÑтувача.\n" -"Ці типи даних поÑилаютьÑÑ Ð½Ð° OID ÑиÑтеми, Ñкі не зберігаютьÑÑ Ð·Ð° допомогою pg_upgrade, тому цей клаÑтер наразі не може бути оновлений.\n" -"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n" -"СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:\n" -" %s\n\n" - -#: check.c:1177 -#, c-format -msgid "Checking for incompatible \"jsonb\" data type" -msgstr "Перевірка неÑуміÑного типу даних \"jsonb\"" - -#: check.c:1184 -#, c-format -msgid "Your installation contains the \"jsonb\" data type in user tables.\n" -"The internal format of \"jsonb\" changed during 9.4 beta so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n\n" -msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить тип даних \"jsonb\" у таблицÑÑ… кориÑтувача.\n" -"Внутрішній формат \"jsonb\" змінено під Ñ‡Ð°Ñ Ð²ÐµÑ€ÑÑ–Ñ— 9.4 beta,\n" -"тому цей клаÑтер наразі не може бути оновлений.\n" -"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n" -"СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:\n" -" %s\n\n" - -#: check.c:1206 +#: check.c:1596 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Перевірка ролей, Ñкі починаютьÑÑ Ð· \"pg_\"" -#: check.c:1216 -#, c-format -msgid "The source cluster contains roles starting with \"pg_\"\n" -msgstr "Початковий клаÑтер міÑтить ролі, Ñкі починаютьÑÑ Ð· \"pg_\"\n" - -#: check.c:1218 +#: check.c:1627 #, c-format -msgid "The target cluster contains roles starting with \"pg_\"\n" -msgstr "Цільовий клаÑтер міÑтить ролі, Ñкі починаютьÑÑ Ð· \"pg_\"\n" +msgid "Your installation contains roles starting with \"pg_\".\n" +"\"pg_\" is a reserved prefix for system roles. The cluster\n" +"cannot be upgraded until these roles are renamed.\n" +"A list of roles starting with \"pg_\" is in the file:\n" +" %s" +msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить ролі, Ñкі починаютьÑÑ Ð· \"pg_\".\n" +"\"pg_\" Ñ” зарезервованим префікÑом Ð´Ð»Ñ ÑиÑтемних ролей. КлаÑтер\n" +"не може бути оновлений, поки ці ролі не будуть перейменовані.\n" +"СпиÑок ролей, Ñкі починаютьÑÑ Ð· \"pg_\" у файлі:\n" +" %s" -#: check.c:1239 +#: check.c:1647 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "Перевірка кориÑтувацьких Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½ÑŒ" -#: check.c:1302 +#: check.c:1707 #, c-format msgid "Your installation contains user-defined encoding conversions.\n" "The conversion function parameters changed in PostgreSQL version 14\n" "so this cluster cannot currently be upgraded. You can remove the\n" "encoding conversions in the old cluster and restart the upgrade.\n" "A list of user-defined encoding conversions is in the file:\n" -" %s\n\n" +" %s" msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить кориÑтувацькі Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½ÑŒ.\n" "Параметри функції Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ÐµÐ½Ð¾ у верÑÑ–Ñ— PostgreSQL 14,\n" "тому цей клаÑтер наразі не може бути оновлений.\n" "Ви можете видалити Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½ÑŒ в Ñтарому клаÑтері та перезапуÑтити оновленнÑ.\n" "СпиÑок перетворень кодувань знаходитьÑÑ Ñƒ файлі:\n" -" %s\n\n" +" %s" -#: check.c:1329 +#: check.c:1746 #, c-format -msgid "failed to get the current locale\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ поточну локаль\n" +msgid "Checking for new cluster logical replication slots" +msgstr "Перевірка наÑвноÑті нових Ñлотів логічної реплікації клаÑтера" -#: check.c:1338 +#: check.c:1754 #, c-format -msgid "failed to get system locale name for \"%s\"\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑиÑтемне ім'Ñ Ð»Ð¾ÐºÐ°Ð»Ñ– Ð´Ð»Ñ \"%s\"\n" +msgid "could not count the number of logical replication slots" +msgstr "не вдалоÑÑ Ð¿Ð¾Ñ€Ð°Ñ…ÑƒÐ²Ð°Ñ‚Ð¸ кількіÑть Ñлотів логічної реплікації" -#: check.c:1344 +#: check.c:1759 #, c-format -msgid "failed to restore old locale \"%s\"\n" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ñтару локаль \"%s\"\n" +msgid "expected 0 logical replication slots but found %d" +msgstr "очікувалоÑÑ 0 Ñлотів логічної реплікації, але знайдено %d" -#: controldata.c:128 controldata.c:196 +#: check.c:1769 check.c:1820 #, c-format -msgid "could not get control data using %s: %s\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ контрольні дані за допомогою %s: %s\n" +msgid "could not determine parameter settings on new cluster" +msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð² на новому клаÑтері" -#: controldata.c:139 +#: check.c:1774 #, c-format -msgid "%d: database cluster state problem\n" -msgstr "%d: неприпуÑтимий Ñтан клаÑтера баз даних\n" +msgid "\"wal_level\" must be \"logical\" but is set to \"%s\"" +msgstr "\"wal_level\" має бути \"logical\", але вÑтановлено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\"" -#: controldata.c:157 +#: check.c:1780 #, c-format -msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" -msgstr "Початковий клаÑтер завершив роботу в режимі відновленнÑ. Щоб виконати оновленнÑ, викориÑтайте документований ÑпоÑіб з \"rsync\" або вимкніть його в режимі головного Ñервера.\n" +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of logical replication slots (%d) on the old cluster" +msgstr "\"max_replication_slots\" (%d) має бути більше або дорівнювати кількоÑті Ñлотів логічної реплікації (%d) на Ñтарому клаÑтері" -#: controldata.c:159 +#: check.c:1812 #, c-format -msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary.\n" -msgstr "Цільовий клаÑтер завершив роботу в режимі відновленнÑ. Щоб виконати оновленнÑ, викориÑтайте документований ÑпоÑіб з \"rsync\" або вимкніть його в режимі головного Ñервера.\n" +msgid "Checking for new cluster configuration for subscriptions" +msgstr "Перевірка нової конфігурації клаÑтера Ð´Ð»Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñок" -#: controldata.c:164 +#: check.c:1824 #, c-format -msgid "The source cluster was not shut down cleanly.\n" -msgstr "Початковий клаÑтер завершив роботу некоректно.\n" +msgid "\"max_replication_slots\" (%d) must be greater than or equal to the number of subscriptions (%d) on the old cluster" +msgstr "\"max_replication_slots\" (%d) має бути більше або дорівнювати кількоÑті підпиÑок (%d) на Ñтарому клаÑтері" -#: controldata.c:166 +#: check.c:1846 #, c-format -msgid "The target cluster was not shut down cleanly.\n" -msgstr "Цільовий клаÑтер завершив роботу некоректно.\n" +msgid "Checking for valid logical replication slots" +msgstr "Перевірка дійÑних Ñлотів логічної реплікації" -#: controldata.c:177 +#: check.c:1898 #, c-format -msgid "The source cluster lacks cluster state information:\n" -msgstr "Ð’ початковому клаÑтері відÑÑƒÑ‚Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñтан клаÑтеру:\n" +msgid "Your installation contains logical replication slots that cannot be upgraded.\n" +"You can remove invalid slots and/or consume the pending WAL for other slots,\n" +"and then restart the upgrade.\n" +"A list of the problematic slots is in the file:\n" +" %s" +msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить Ñлоти логічної реплікації, Ñкі не можуть бути оновлені.\n" +"Ви можете видалити недійÑні Ñлоти та/або викориÑтати відкладений WAL Ð´Ð»Ñ Ñ–Ð½ÑˆÐ¸Ñ… Ñлотів,\n" +"Ñ– потім перезавантажити оновленнÑ.\n" +"СпиÑок проблемних Ñлотів знаходитьÑÑ Ñƒ файлі:\n" +" %s" -#: controldata.c:179 +#: check.c:1922 #, c-format -msgid "The target cluster lacks cluster state information:\n" -msgstr "Ð’ цільовому клаÑтері відÑÑƒÑ‚Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñтан клаÑтеру:\n" +msgid "Checking for subscription state" +msgstr "Перевірка Ñтану підпиÑки" -#: controldata.c:209 dump.c:49 pg_upgrade.c:335 pg_upgrade.c:371 -#: relfilenode.c:243 server.c:33 util.c:79 +#: check.c:2023 #, c-format -msgid "%s" -msgstr "%s" +msgid "Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n" +"You can allow the initial sync to finish for all relations and then restart the upgrade.\n" +"A list of the problematic subscriptions is in the file:\n" +" %s" +msgstr "У вашій інÑталÑції Ñ” підпиÑки, Ñкі не мають Ð¿Ð¾Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð°Ð±Ð¾ мають зв'Ñзки, що не перебувають у Ñтані i (ініціалізаціÑ) або r (готовніÑть).\n" +"Ви можете дозволити початковій Ñинхронізації завершитиÑÑ Ð´Ð»Ñ Ð²ÑÑ–Ñ… зв'Ñзків, а потім перезапуÑтити оновленнÑ.\n" +"СпиÑок проблемних підпиÑок знаходитьÑÑ Ñƒ файлі:\n" +" %s" + +#: controldata.c:129 controldata.c:199 +#, c-format +msgid "could not get control data using %s: %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ контрольні дані за допомогою %s: %m" + +#: controldata.c:139 +#, c-format +msgid "%d: database cluster state problem" +msgstr "%d: неприпуÑтимий Ñтан клаÑтера баз даних" + +#: controldata.c:158 +#, c-format +msgid "The source cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary." +msgstr "Початковий клаÑтер завершив роботу в режимі відновленнÑ. Щоб виконати оновленнÑ, викориÑтайте документований ÑпоÑіб з \"rsync\" або вимкніть його в режимі головного Ñерверу." + +#: controldata.c:160 +#, c-format +msgid "The target cluster was shut down while in recovery mode. To upgrade, use \"rsync\" as documented or shut it down as a primary." +msgstr "Цільовий клаÑтер завершив роботу в режимі відновленнÑ. Щоб виконати оновленнÑ, викориÑтайте документований ÑпоÑіб з \"rsync\" або вимкніть його в режимі головного Ñерверу." -#: controldata.c:216 +#: controldata.c:165 #, c-format -msgid "%d: pg_resetwal problem\n" -msgstr "%d: проблема pg_resetwal\n" +msgid "The source cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "КлаÑтер джерел не був вимкнений повніÑтю, про що повідомлÑлоÑÑ Ñƒ звітах Ñтану: \"%s\"" -#: controldata.c:226 controldata.c:236 controldata.c:247 controldata.c:258 -#: controldata.c:269 controldata.c:288 controldata.c:299 controldata.c:310 -#: controldata.c:321 controldata.c:332 controldata.c:343 controldata.c:354 -#: controldata.c:357 controldata.c:361 controldata.c:371 controldata.c:383 -#: controldata.c:394 controldata.c:405 controldata.c:416 controldata.c:427 -#: controldata.c:438 controldata.c:449 controldata.c:460 controldata.c:471 -#: controldata.c:482 controldata.c:493 +#: controldata.c:167 #, c-format -msgid "%d: controldata retrieval problem\n" -msgstr "%d: проблема з отриманнÑм контрольних даних\n" +msgid "The target cluster was not shut down cleanly, state reported as: \"%s\"" +msgstr "Цільовий клаÑтер не був закритий \"чиÑто\", про що повідомив Ñтан: \"%s\"" -#: controldata.c:572 +#: controldata.c:175 controldata.c:507 #, c-format -msgid "The source cluster lacks some required control information:\n" -msgstr "У початковому клаÑтері відÑÑƒÑ‚Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð° контрольна інформаціÑ:\n" +msgid "could not get control data using %s: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ контрольні дані за допомогою %s: %s" -#: controldata.c:575 +#: controldata.c:181 #, c-format -msgid "The target cluster lacks some required control information:\n" -msgstr "У цільовому клаÑтері відÑÑƒÑ‚Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð° контрольна інформаціÑ:\n" +msgid "The source cluster lacks cluster state information:" +msgstr "Ð’ початковому клаÑтері відÑÑƒÑ‚Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñтан клаÑтера:" + +#: controldata.c:183 +#, c-format +msgid "The target cluster lacks cluster state information:" +msgstr "Ð’ цільовому клаÑтері відÑÑƒÑ‚Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ Ñтан клаÑтера:" + +#: controldata.c:213 dump.c:50 exec.c:118 pg_upgrade.c:555 pg_upgrade.c:595 +#: pg_upgrade.c:944 relfilenumber.c:233 server.c:34 util.c:337 +#, c-format +msgid "%s" +msgstr "%s" + +#: controldata.c:220 +#, c-format +msgid "%d: pg_resetwal problem" +msgstr "%d: проблема pg_resetwal" + +#: controldata.c:230 controldata.c:240 controldata.c:251 controldata.c:262 +#: controldata.c:273 controldata.c:292 controldata.c:303 controldata.c:314 +#: controldata.c:325 controldata.c:336 controldata.c:347 controldata.c:358 +#: controldata.c:361 controldata.c:365 controldata.c:375 controldata.c:387 +#: controldata.c:398 controldata.c:409 controldata.c:420 controldata.c:431 +#: controldata.c:442 controldata.c:453 controldata.c:464 controldata.c:475 +#: controldata.c:486 controldata.c:497 +#, c-format +msgid "%d: controldata retrieval problem" +msgstr "%d: проблема з отриманнÑм контрольних даних" #: controldata.c:578 #, c-format -msgid " checkpoint next XID\n" -msgstr " наÑтупний XID контрольної точки\n" +msgid "The source cluster lacks some required control information:" +msgstr "У початковому клаÑтері відÑÑƒÑ‚Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð° контрольна інформаціÑ:" #: controldata.c:581 #, c-format -msgid " latest checkpoint next OID\n" -msgstr " наÑтупний OID оÑтанньої контрольної точки\n" +msgid "The target cluster lacks some required control information:" +msgstr "У цільовому клаÑтері відÑÑƒÑ‚Ð½Ñ Ð½ÐµÐ¾Ð±Ñ…Ñ–Ð´Ð½Ð° контрольна інформаціÑ:" #: controldata.c:584 #, c-format -msgid " latest checkpoint next MultiXactId\n" -msgstr " наÑтупний MultiXactId оÑтанньої контрольної точки\n" +msgid " checkpoint next XID" +msgstr " наÑтупний XID контрольної точки" -#: controldata.c:588 +#: controldata.c:587 #, c-format -msgid " latest checkpoint oldest MultiXactId\n" -msgstr " найÑтарший MultiXactId оÑтанньої контрольної точки\n" +msgid " latest checkpoint next OID" +msgstr " наÑтупний OID оÑтанньої контрольної точки" -#: controldata.c:591 +#: controldata.c:590 #, c-format -msgid " latest checkpoint oldestXID\n" -msgstr " найÑтарший oldestXID оÑтанньої контрольної точки\n" +msgid " latest checkpoint next MultiXactId" +msgstr " наÑтупний MultiXactId оÑтанньої контрольної точки" #: controldata.c:594 #, c-format -msgid " latest checkpoint next MultiXactOffset\n" -msgstr " наÑтупний MultiXactOffset оÑтанньої контрольної точки\n" +msgid " latest checkpoint oldest MultiXactId" +msgstr " найÑтарший MultiXactId оÑтанньої контрольної точки" #: controldata.c:597 #, c-format -msgid " first WAL segment after reset\n" -msgstr " перший Ñегмет WAL піÑÐ»Ñ ÑкиданнÑ\n" +msgid " latest checkpoint oldestXID" +msgstr " найÑтарший oldestXID оÑтанньої контрольної точки" #: controldata.c:600 #, c-format -msgid " float8 argument passing method\n" -msgstr " метод передачі аргументу float8\n" +msgid " latest checkpoint next MultiXactOffset" +msgstr " наÑтупний MultiXactOffset оÑтанньої контрольної точки" #: controldata.c:603 #, c-format -msgid " maximum alignment\n" -msgstr " макÑимальне вирівнюваннÑ\n" +msgid " first WAL segment after reset" +msgstr " перший Ñегмет WAL піÑÐ»Ñ ÑкиданнÑ" #: controldata.c:606 #, c-format -msgid " block size\n" -msgstr " розмір блоку\n" +msgid " float8 argument passing method" +msgstr " метод передачі аргументу float8" #: controldata.c:609 #, c-format -msgid " large relation segment size\n" -msgstr " розмір Ñегменту великого відношеннÑ\n" +msgid " maximum alignment" +msgstr " макÑимальне вирівнюваннÑ" #: controldata.c:612 #, c-format -msgid " WAL block size\n" -msgstr " розмір блоку WAL\n" +msgid " block size" +msgstr " розмір блоку" #: controldata.c:615 #, c-format -msgid " WAL segment size\n" -msgstr " розмір Ñегменту WAL\n" +msgid " large relation segment size" +msgstr " розмір Ñегменту великого відношеннÑ" #: controldata.c:618 #, c-format -msgid " maximum identifier length\n" -msgstr " макÑимальна довжина ідентифікатора\n" +msgid " WAL block size" +msgstr " розмір блоку WAL" #: controldata.c:621 #, c-format -msgid " maximum number of indexed columns\n" -msgstr " макÑимальна кількіÑть індекÑованих Ñтовпців\n" +msgid " WAL segment size" +msgstr " розмір Ñегменту WAL" #: controldata.c:624 #, c-format -msgid " maximum TOAST chunk size\n" -msgstr " макÑимальний розмір порції TOAST\n" +msgid " maximum identifier length" +msgstr " макÑимальна довжина ідентифікатора" -#: controldata.c:628 +#: controldata.c:627 #, c-format -msgid " large-object chunk size\n" -msgstr " розмір порції великого об'єкту\n" +msgid " maximum number of indexed columns" +msgstr " макÑимальна кількіÑть індекÑованих Ñтовпців" -#: controldata.c:631 +#: controldata.c:630 #, c-format -msgid " dates/times are integers?\n" -msgstr " дата/Ñ‡Ð°Ñ Ð¿Ñ€ÐµÐ´Ñтавлені цілими чиÑлами?\n" +msgid " maximum TOAST chunk size" +msgstr " макÑимальний розмір порції TOAST" -#: controldata.c:635 +#: controldata.c:634 #, c-format -msgid " data checksum version\n" -msgstr " верÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум даних\n" +msgid " large-object chunk size" +msgstr " розмір порції великого об'єкту" #: controldata.c:637 #, c-format -msgid "Cannot continue without required control information, terminating\n" -msgstr "Ðе можна продовжити без необхідної контрольної інформації, завершеннÑ\n" +msgid " dates/times are integers?" +msgstr " дата/Ñ‡Ð°Ñ Ð¿Ñ€ÐµÐ´Ñтавлені цілими чиÑлами?" -#: controldata.c:652 +#: controldata.c:641 #, c-format -msgid "old and new pg_controldata alignments are invalid or do not match\n" -"Likely one cluster is a 32-bit install, the other 64-bit\n" -msgstr "Ñтаре Ñ– нове Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð² pg_controldata неприпуÑтимі або не збігаютьÑÑ\n" -"Ймовірно, один клаÑтер вÑтановлений у 32-бітній ÑиÑтемі, а інший - у 64-бітній\n" +msgid " data checksum version" +msgstr " верÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум даних" -#: controldata.c:656 +#: controldata.c:643 #, c-format -msgid "old and new pg_controldata block sizes are invalid or do not match\n" -msgstr "Ñтарий Ñ– новий розмір блоків в pg_controldata неприпуÑтимі або не збігаютьÑÑ\n" +msgid "Cannot continue without required control information, terminating" +msgstr "Ðе можна продовжити без необхідної контрольної інформації, завершеннÑ" -#: controldata.c:659 +#: controldata.c:658 #, c-format -msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match\n" -msgstr "Ñтарий Ñ– новий макÑимальний розмір Ñегментів відношень в pg_controldata неприпуÑтимі або не збігаютьÑÑ\n" +msgid "old and new pg_controldata alignments are invalid or do not match.\n" +"Likely one cluster is a 32-bit install, the other 64-bit" +msgstr "Ñтаре Ñ– нове Ð²Ð¸Ñ€Ñ–Ð²Ð½ÑŽÐ²Ð°Ð½Ð½Ñ Ð² pg_controldata неприпуÑтимі або не збігаютьÑÑ\n" +"Ймовірно, один клаÑтер вÑтановлений у 32-бітній ÑиÑтемі, а інший - у 64-бітній" #: controldata.c:662 #, c-format -msgid "old and new pg_controldata WAL block sizes are invalid or do not match\n" -msgstr "Ñтарий Ñ– новий розмір блоків WAL в pg_controldata неприпуÑтимі або не збігаютьÑÑ\n" +msgid "old and new pg_controldata block sizes are invalid or do not match" +msgstr "Ñтарий Ñ– новий розмір блоків в pg_controldata неприпуÑтимі або не збігаютьÑÑ" #: controldata.c:665 #, c-format -msgid "old and new pg_controldata WAL segment sizes are invalid or do not match\n" -msgstr "Ñтарий Ñ– новий розмір Ñегментів WAL в pg_controldata неприпуÑтимі або не збігаютьÑÑ\n" +msgid "old and new pg_controldata maximum relation segment sizes are invalid or do not match" +msgstr "Ñтарий Ñ– новий макÑимальний розмір Ñегментів відношень в pg_controldata неприпуÑтимі або не збігаютьÑÑ" #: controldata.c:668 #, c-format -msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match\n" -msgstr "Ñтара Ñ– нова макÑимальна довжина ідентифікаторів в pg_controldata неприпуÑтимі або не збігаютьÑÑ\n" +msgid "old and new pg_controldata WAL block sizes are invalid or do not match" +msgstr "Ñтарий Ñ– новий розмір блоків WAL в pg_controldata неприпуÑтимі або не збігаютьÑÑ" #: controldata.c:671 #, c-format -msgid "old and new pg_controldata maximum indexed columns are invalid or do not match\n" -msgstr "Ñтара Ñ– нова макÑимальна кількіÑть індекÑованих Ñтовпців в pg_controldata неприпуÑтимі або не збігаютьÑÑ\n" +msgid "old and new pg_controldata WAL segment sizes are invalid or do not match" +msgstr "Ñтарий Ñ– новий розмір Ñегментів WAL в pg_controldata неприпуÑтимі або не збігаютьÑÑ" #: controldata.c:674 #, c-format -msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match\n" -msgstr "Ñтарий Ñ– новий макÑимальний розмір порції TOAST в pg_controldata неприпуÑтимі або не збігаютьÑÑ\n" +msgid "old and new pg_controldata maximum identifier lengths are invalid or do not match" +msgstr "Ñтара Ñ– нова макÑимальна довжина ідентифікаторів в pg_controldata неприпуÑтимі або не збігаютьÑÑ" + +#: controldata.c:677 +#, c-format +msgid "old and new pg_controldata maximum indexed columns are invalid or do not match" +msgstr "Ñтара Ñ– нова макÑимальна кількіÑть індекÑованих Ñтовпців в pg_controldata неприпуÑтимі або не збігаютьÑÑ" + +#: controldata.c:680 +#, c-format +msgid "old and new pg_controldata maximum TOAST chunk sizes are invalid or do not match" +msgstr "Ñтарий Ñ– новий макÑимальний розмір порції TOAST в pg_controldata неприпуÑтимі або не збігаютьÑÑ" -#: controldata.c:679 +#: controldata.c:685 #, c-format -msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match\n" -msgstr "Ñтарий Ñ– новий розмір порції великого об'єкту в pg_controldata неприпуÑтимі або не збігаютьÑÑ\n" +msgid "old and new pg_controldata large-object chunk sizes are invalid or do not match" +msgstr "Ñтарий Ñ– новий розмір порції великого об'єкту в pg_controldata неприпуÑтимі або не збігаютьÑÑ" -#: controldata.c:682 +#: controldata.c:688 #, c-format -msgid "old and new pg_controldata date/time storage types do not match\n" -msgstr "Ñтарий Ñ– новий тип Ñховища дати/чаÑу в pg_controldata неприпуÑтимі або не збігаютьÑÑ\n" +msgid "old and new pg_controldata date/time storage types do not match" +msgstr "Ñтарий Ñ– новий тип Ñховища дати/чаÑу в pg_controldata неприпуÑтимі або не збігаютьÑÑ" -#: controldata.c:695 +#: controldata.c:701 #, c-format -msgid "old cluster does not use data checksums but the new one does\n" -msgstr "Ñтарий клаÑтер не викориÑтовує контрольні Ñуми даних, але новий викориÑтовує\n" +msgid "old cluster does not use data checksums but the new one does" +msgstr "Ñтарий клаÑтер не викориÑтовує контрольні Ñуми даних, але новий викориÑтовує" -#: controldata.c:698 +#: controldata.c:704 #, c-format -msgid "old cluster uses data checksums but the new one does not\n" -msgstr "Ñтарий клаÑтер викориÑтовує контрольні Ñуми даних, але новий не викориÑтовує\n" +msgid "old cluster uses data checksums but the new one does not" +msgstr "Ñтарий клаÑтер викориÑтовує контрольні Ñуми даних, але новий не викориÑтовує" -#: controldata.c:700 +#: controldata.c:706 #, c-format -msgid "old and new cluster pg_controldata checksum versions do not match\n" -msgstr "Ñтара Ñ– нова верÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум клаÑтера в pg_controldata не збігаютьÑÑ\n" +msgid "old and new cluster pg_controldata checksum versions do not match" +msgstr "Ñтара Ñ– нова верÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¸Ñ… Ñум клаÑтера в pg_controldata не збігаютьÑÑ" -#: controldata.c:711 +#: controldata.c:717 #, c-format msgid "Adding \".old\" suffix to old global/pg_control" msgstr "Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ ÑуфікÑа \".old\" до Ñтарого файла global/pg_control" -#: controldata.c:716 +#: controldata.c:722 #, c-format -msgid "Unable to rename %s to %s.\n" -msgstr "Ðе вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ %s на %s.\n" +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" -#: controldata.c:719 +#: controldata.c:726 #, c-format msgid "\n" "If you want to start the old cluster, you will need to remove\n" "the \".old\" suffix from %s/global/pg_control.old.\n" "Because \"link\" mode was used, the old cluster cannot be safely\n" -"started once the new cluster has been started.\n\n" +"started once the new cluster has been started." msgstr "\n" "Якщо ви хочете запуÑтити Ñтарий клаÑтер, вам необхідно видалити\n" "ÑÑƒÑ„Ñ–ÐºÑ \".old\" з файлу %s/global/pg_control.old. Через викориÑтаннÑ\n" "режиму \"link\" робота Ñтарого клаÑтера піÑÐ»Ñ Ð·Ð°Ð¿ÑƒÑку нового може бути\n" -"небезпечна.\n\n" +"небезпечна." #: dump.c:20 #, c-format msgid "Creating dump of global objects" msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¸Ñ… об'єктів" -#: dump.c:31 +#: dump.c:32 #, c-format -msgid "Creating dump of database schemas\n" -msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñхем бази даних\n" +msgid "Creating dump of database schemas" +msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð´Ð°Ð¼Ð¿Ñƒ Ñхем бази даних" -#: exec.c:45 +#: exec.c:47 #, c-format -msgid "could not get pg_ctl version data using %s: %s\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані верÑÑ–Ñ— pg_ctl, виконавши %s: %s\n" +msgid "could not get pg_ctl version data using %s: %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані верÑÑ–Ñ— pg_ctl, виконавши %s: %m" #: exec.c:51 #, c-format -msgid "could not get pg_ctl version output from %s\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ верÑÑ–ÑŽ pg_ctl з результату %s\n" +msgid "could not get pg_ctl version data using %s: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані верÑÑ–Ñ— pg_ctl, виконавши %s: %s" -#: exec.c:105 exec.c:109 +#: exec.c:55 #, c-format -msgid "command too long\n" -msgstr "команда занадто довга\n" +msgid "could not get pg_ctl version output from %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ верÑÑ–ÑŽ pg_ctl з результату %s" -#: exec.c:111 util.c:37 util.c:225 +#: exec.c:112 exec.c:116 #, c-format -msgid "%s\n" -msgstr "%s\n" +msgid "command too long" +msgstr "команда занадто довга" -#: exec.c:150 option.c:217 +#: exec.c:160 pg_upgrade.c:311 #, c-format -msgid "could not open log file \"%s\": %m\n" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу \"%s\": %m\n" +msgid "could not open log file \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу \"%s\": %m" -#: exec.c:179 +#: exec.c:192 #, c-format msgid "\n" "*failure*" msgstr "\n" "*неполадка*" -#: exec.c:182 +#: exec.c:195 #, c-format -msgid "There were problems executing \"%s\"\n" -msgstr "Під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ \"%s\" виникли проблеми\n" +msgid "There were problems executing \"%s\"" +msgstr "Під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ \"%s\" виникли проблеми" -#: exec.c:185 +#: exec.c:198 #, c-format msgid "Consult the last few lines of \"%s\" or \"%s\" for\n" -"the probable cause of the failure.\n" +"the probable cause of the failure." msgstr "Щоб зрозуміти причину неполадки, звернітьÑÑ Ð´Ð¾ декількох оÑтанніх Ñ€Ñдків\n" -"файлу \"%s\" або \"%s\".\n" +"файлу \"%s\" або \"%s\"." -#: exec.c:190 +#: exec.c:203 #, c-format msgid "Consult the last few lines of \"%s\" for\n" -"the probable cause of the failure.\n" +"the probable cause of the failure." msgstr "Щоб зрозуміти причину неполадки, звернітьÑÑ Ð´Ð¾ декількох оÑтанніх Ñ€Ñдків\n" -"файлу \"%s\".\n" +"файлу \"%s\"." -#: exec.c:205 option.c:226 +#: exec.c:218 pg_upgrade.c:321 #, c-format -msgid "could not write to log file \"%s\": %m\n" -msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файлу журналу \"%s\": %m\n" +msgid "could not write to log file \"%s\": %m" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файлу журналу \"%s\": %m" -#: exec.c:231 +#: exec.c:244 #, c-format -msgid "could not open file \"%s\" for reading: %s\n" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %s\n" +msgid "could not open file \"%s\" for reading: %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m" -#: exec.c:258 +#: exec.c:270 #, c-format -msgid "You must have read and write access in the current directory.\n" -msgstr "Ви повинні мати права на Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ– Ð·Ð°Ð¿Ð¸Ñ Ð² поточному каталозі.\n" +msgid "You must have read and write access in the current directory." +msgstr "Ви повинні мати права на Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ Ñ– Ð·Ð°Ð¿Ð¸Ñ Ð² поточному каталозі." -#: exec.c:311 exec.c:377 +#: exec.c:323 exec.c:389 exec.c:439 #, c-format -msgid "check for \"%s\" failed: %s\n" -msgstr "перевірка \"%s\" провалена: %s\n" +msgid "check for \"%s\" failed: %m" +msgstr "перевірка \"%s\" провалена: %m" -#: exec.c:314 exec.c:380 +#: exec.c:326 exec.c:392 #, c-format -msgid "\"%s\" is not a directory\n" -msgstr "\"%s\" не Ñ” каталогом\n" +msgid "\"%s\" is not a directory" +msgstr "\"%s\" не Ñ” каталогом" -#: exec.c:430 +#: exec.c:444 #, c-format -msgid "check for \"%s\" failed: not a regular file\n" -msgstr "перевірка \"%s\" провалена: це не звичайний файл\n" +msgid "check for \"%s\" failed: cannot execute" +msgstr "помилка перевірки \"%s\": не можна виконати" -#: exec.c:433 +#: exec.c:454 #, c-format -msgid "check for \"%s\" failed: cannot execute (permission denied)\n" -msgstr "перевірка \"%s\" провалена: Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð½ÐµÐ¼Ð¾Ð¶Ð»Ð¸Ð²Ðµ (немає доÑтупу)\n" +msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"" +msgstr "помилка перевірки \"%s\": неправильна верÑÑ–Ñ: знайдено \"%s\", очікувалоÑÑŒ \"%s\"" -#: exec.c:439 +#: file.c:44 #, c-format -msgid "check for \"%s\" failed: cannot execute\n" -msgstr "помилка перевірки \"%s\": не можна виконати\n" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "помилка при клонуванні Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" (\"%s\" до \"%s\"): %m" -#: exec.c:449 +#: file.c:51 #, c-format -msgid "check for \"%s\" failed: incorrect version: found \"%s\", expected \"%s\"\n" -msgstr "помилка перевірки \"%s\": неправильна верÑÑ–Ñ: знайдено \"%s\", очікувалоÑÑŒ \"%s\"\n" +msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "помилка при клонуванні Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %m" -#: file.c:43 file.c:61 +#: file.c:56 #, c-format -msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "помилка при клонуванні Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" (\"%s\" до \"%s\"): %s\n" +msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "помилка при клонуванні Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ñтворити файл \"%s\": %m" -#: file.c:50 +#: file.c:65 #, c-format -msgid "error while cloning relation \"%s.%s\": could not open file \"%s\": %s\n" -msgstr "помилка при клонуванні Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %s\n" +msgid "error while cloning relation \"%s.%s\" (\"%s\" to \"%s\"): %s" +msgstr "помилка при клонуванні Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" (\"%s\" до \"%s\"): %s" -#: file.c:55 +#: file.c:91 file.c:160 file.c:233 #, c-format -msgid "error while cloning relation \"%s.%s\": could not create file \"%s\": %s\n" -msgstr "помилка при клонуванні Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ñтворити файл \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %m" +msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %m" -#: file.c:87 file.c:190 +#: file.c:96 file.c:165 file.c:242 #, c-format -msgid "error while copying relation \"%s.%s\": could not open file \"%s\": %s\n" -msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %m" +msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ñтворити файл \"%s\": %m" -#: file.c:92 file.c:199 +#: file.c:110 file.c:266 #, c-format -msgid "error while copying relation \"%s.%s\": could not create file \"%s\": %s\n" -msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ñтворити файл \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %m" +msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" -#: file.c:106 file.c:223 +#: file.c:122 file.c:344 #, c-format -msgid "error while copying relation \"%s.%s\": could not read file \"%s\": %s\n" -msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %m" +msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файлу \"%s\": %m" -#: file.c:118 file.c:301 +#: file.c:136 #, c-format -msgid "error while copying relation \"%s.%s\": could not write file \"%s\": %s\n" -msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати до файлу \"%s\": %s\n" +msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" ( з \"%s\" в \"%s\"): %m" -#: file.c:132 +#: file.c:172 #, c-format -msgid "error while copying relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" ( з \"%s\" в \"%s\"): %s\n" - -#: file.c:151 -#, c-format -msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "помилка під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" ( з \"%s\" в \"%s\"): %s\n" +msgid "error while copying relation \"%s.%s\": could not copy file range from \"%s\" to \"%s\": %m" +msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ñкопіювати діапазон файлу з \"%s\" до \"%s\": %m" #: file.c:194 #, c-format -msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %s\n" -msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ñтан файлу \"%s\": %s\n" +msgid "error while creating link for relation \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "помилка під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\" ( з \"%s\" в \"%s\"): %m" -#: file.c:226 +#: file.c:237 #, c-format -msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"\n" -msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": у файлі \"%s\" знайдена чаÑткова Ñторінка\n" +msgid "error while copying relation \"%s.%s\": could not stat file \"%s\": %m" +msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ñтан файлу \"%s\": %m" -#: file.c:328 file.c:345 +#: file.c:269 #, c-format -msgid "could not clone file between old and new data directories: %s\n" -msgstr "не вдалоÑÑ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ñ‚Ð¸ файл між Ñтарим Ñ– новим каталогами даних: %s\n" +msgid "error while copying relation \"%s.%s\": partial page found in file \"%s\"" +msgstr "помилка під Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s.%s\": у файлі \"%s\" знайдена чаÑткова Ñторінка" -#: file.c:341 +#: file.c:371 file.c:387 #, c-format -msgid "could not create file \"%s\": %s\n" -msgstr "не можливо Ñтворити файл \"%s\": %s\n" +msgid "could not clone file between old and new data directories: %m" +msgstr "не вдалоÑÑ ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ñ‚Ð¸ файл між Ñтарим Ñ– новим каталогами даних: %m" -#: file.c:352 +#: file.c:383 file.c:420 #, c-format -msgid "file cloning not supported on this platform\n" -msgstr "ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² не підтримуєтьÑÑ Ð½Ð° цій платформі\n" +msgid "could not create file \"%s\": %m" +msgstr "неможливо Ñтворити файл \"%s\": %m" -#: file.c:369 +#: file.c:393 #, c-format -msgid "could not create hard link between old and new data directories: %s\n" -"In link mode the old and new data directories must be on the same file system.\n" -msgstr "не вдалоÑÑ Ñтворити жорÑтке поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ Ñтарим Ñ– новим каталогами даних: %s\n" -"Ð’ режимі поÑилань Ñтарий Ñ– новий каталоги даних повинні знаходитиÑÑŒ в одній файловій ÑиÑтемі.\n" +msgid "file cloning not supported on this platform" +msgstr "ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² не підтримуєтьÑÑ Ð½Ð° цій платформі" -#: function.c:114 +#: file.c:424 #, c-format -msgid "\n" -"The old cluster has a \"plpython_call_handler\" function defined\n" -"in the \"public\" schema which is a duplicate of the one defined\n" -"in the \"pg_catalog\" schema. You can confirm this by executing\n" -"in psql:\n\n" -" \\df *.plpython_call_handler\n\n" -"The \"public\" schema version of this function was created by a\n" -"pre-8.1 install of plpython, and must be removed for pg_upgrade\n" -"to complete because it references a now-obsolete \"plpython\"\n" -"shared object file. You can remove the \"public\" schema version\n" -"of this function by running the following command:\n\n" -" DROP FUNCTION public.plpython_call_handler()\n\n" -"in each affected database:\n\n" -msgstr "\n" -"Старий клаÑтер має функцію \"plpython_call_handler\", визначену в Ñхемі\n" -"\"public\", Ñка Ñ” дублікатом функції, визначеної в Ñхемі \"pg_catalog\". Ви\n" -"можете переконатиÑÑ Ð² цьому, виконавши в psql:\n\n" -" \\df *.plpython_call_handler\n\n" -"ВерÑÑ–Ñ Ñ†Ñ–Ñ”Ñ— функції в Ñхемі \"public\" була Ñтворена вÑтановленнÑм plpython \n" -"верÑÑ–Ñ— до 8.1 Ñ– повинна бути видалена до Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸ pg_upgrade,\n" -"адже вона поÑилаєтьÑÑ Ð½Ð° заÑтарілий Ñпільний об'єктний файл \"plpython\". Ви\n" -"можете видалити верÑÑ–ÑŽ цієї функції зі Ñхеми \"public\", виконавши наÑтупну\n" -"команду:\n\n" -" DROP FUNCTION public.plpython_call_handler()\n\n" -"у кожній базі даних, Ñкої це ÑтоÑуєтьÑÑ:\n\n" +msgid "could not copy file range between old and new data directories: %m" +msgstr "не вдалоÑÑ Ñкопіювати діапазон файлу між Ñтарим Ñ– новим каталогами даних: %m" -#: function.c:132 +#: file.c:430 #, c-format -msgid " %s\n" -msgstr " %s\n" +msgid "copy_file_range not supported on this platform" +msgstr "copy_file_range не підтримуєтьÑÑ Ð½Ð° цій платформі" -#: function.c:142 +#: file.c:447 #, c-format -msgid "Remove the problem functions from the old cluster to continue.\n" -msgstr "Видаліть проблемні функції Ñтарого клаÑтера Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ.\n" +msgid "could not create hard link between old and new data directories: %m\n" +"In link mode the old and new data directories must be on the same file system." +msgstr "не вдалоÑÑ Ñтворити жорÑтке поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¼Ñ–Ð¶ Ñтарим Ñ– новим каталогами даних: %m\n" +"Ð’ режимі поÑилань Ñтарий Ñ– новий каталоги даних повинні знаходитиÑÑŒ в одній файловій ÑиÑтемі." -#: function.c:189 +#: function.c:154 #, c-format msgid "Checking for presence of required libraries" msgstr "Перевірка наÑвноÑті необхідних бібліотек" -#: function.c:242 +#: function.c:190 #, c-format msgid "could not load library \"%s\": %s" msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ бібліотеку \"%s\": %s" -#: function.c:253 +#: function.c:201 #, c-format msgid "In database: %s\n" msgstr "У базі даних: %s\n" -#: function.c:263 +#: function.c:211 #, c-format msgid "Your installation references loadable libraries that are missing from the\n" "new installation. You can add these libraries to the new installation,\n" "or remove the functions using them from the old installation. A list of\n" "problem libraries is in the file:\n" -" %s\n\n" +" %s" msgstr "У вашій інÑталÑції Ñ” поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° завантажувані бібліотеки, що \n" "відÑутні в новій інÑталÑції. Ви можете додати ці бібліотеки до нової інÑталÑції\n" "або видалити функції, Ñкі викориÑтовують Ñ—Ñ… зі Ñтарої інÑталÑції. СпиÑок\n" "проблемних бібліотек подано у файлі:\n" -" %s\n\n" +" %s" -#: info.c:131 +#: info.c:128 #, c-format -msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"\n" -msgstr "Імена відношень з OID %u в базі даних \"%s\" не збігаютьÑÑ: Ñтаре ім'Ñ \"%s.%s\", нове ім'Ñ \"%s.%s\"\n" +msgid "Relation names for OID %u in database \"%s\" do not match: old name \"%s.%s\", new name \"%s.%s\"" +msgstr "Імена відношень з OID %u в базі даних \"%s\" не збігаютьÑÑ: Ñтаре ім'Ñ \"%s.%s\", нове ім'Ñ \"%s.%s\"" -#: info.c:151 +#: info.c:148 #, c-format -msgid "Failed to match up old and new tables in database \"%s\"\n" -msgstr "Ðе вдалоÑÑ Ð·Ñ–Ñтавити Ñтарі таблиці з новими в базі даних \"%s\"\n" +msgid "Failed to match up old and new tables in database \"%s\"" +msgstr "Ðе вдалоÑÑ Ð·Ñ–Ñтавити Ñтарі таблиці з новими в базі даних \"%s\"" -#: info.c:240 +#: info.c:229 #, c-format msgid " which is an index on \"%s.%s\"" msgstr " це Ñ–Ð½Ð´ÐµÐºÑ Ð² \"%s.%s\"" -#: info.c:250 +#: info.c:239 #, c-format msgid " which is an index on OID %u" msgstr " це Ñ–Ð½Ð´ÐµÐºÑ Ñƒ відношенні з OID %u" -#: info.c:262 +#: info.c:251 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr " це TOAST-Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð»Ñ \"%s.%s\"" -#: info.c:270 +#: info.c:259 #, c-format msgid " which is the TOAST table for OID %u" msgstr " це TOAST-Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð´Ð»Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· OID %u" -#: info.c:274 +#: info.c:263 #, c-format -msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s\n" -msgstr "У Ñтарому клаÑтері не знайдено відповідноÑті Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· OID %u в базі даних %s\": %s\n" +msgid "No match found in old cluster for new relation with OID %u in database \"%s\": %s" +msgstr "У Ñтарому клаÑтері не знайдено відповідноÑті Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· OID %u в базі даних %s\": %s" -#: info.c:277 +#: info.c:266 #, c-format -msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s\n" -msgstr "У новому клаÑтері не знайдено відповідноÑті Ð´Ð»Ñ Ñтарого Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· OID %u в базі даних \"%s\": %s\n" +msgid "No match found in new cluster for old relation with OID %u in database \"%s\": %s" +msgstr "У новому клаÑтері не знайдено відповідноÑті Ð´Ð»Ñ Ñтарого Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· OID %u в базі даних \"%s\": %s" -#: info.c:289 +#: info.c:300 #, c-format -msgid "mappings for database \"%s\":\n" -msgstr "Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних \"%s\":\n" +msgid "\n" +"source databases:" +msgstr "\n" +"вихідні бази даних:" -#: info.c:292 +#: info.c:302 #, c-format -msgid "%s.%s: %u to %u\n" -msgstr "%s.%s: %u в %u\n" +msgid "\n" +"target databases:" +msgstr "\n" +"цільові бази даних:" -#: info.c:297 info.c:633 +#: info.c:346 #, c-format -msgid "\n\n" -msgstr "\n\n" +msgid "template0 not found" +msgstr "template0 не знайдено" -#: info.c:322 +#: info.c:805 #, c-format -msgid "\n" -"source databases:\n" -msgstr "\n" -"вихідні бази даних:\n" +msgid "Database: \"%s\"" +msgstr "База даних: %s\"" -#: info.c:324 +#: info.c:818 #, c-format -msgid "\n" -"target databases:\n" -msgstr "\n" -"цільові бази даних:\n" +msgid "relname: \"%s.%s\", reloid: %u, reltblspace: \"%s\"" +msgstr "relname: \"%s.%s\", reloid: %u, reltblspace: \"%s\"" -#: info.c:631 +#: info.c:832 #, c-format -msgid "Database: %s\n" -msgstr "База даних: %s\n" +msgid "Logical replication slots in the database:" +msgstr "Логічні Ñлоти реплікації в базі даних:" -#: info.c:644 +#: info.c:838 #, c-format -msgid "relname: %s.%s: reloid: %u reltblspace: %s\n" -msgstr "ім'Ñ_відношеннÑ: %s.%s: oid_відношеннÑ: %u табл_проÑтір: %s\n" +msgid "slot name: \"%s\", output plugin: \"%s\", two_phase: %s" +msgstr "назва Ñлоту: \"%s\", плагін виводу: \"%s\", two_phase: %s" -#: option.c:102 +#: option.c:105 #, c-format -msgid "%s: cannot be run as root\n" -msgstr "%s: не може виконуватиÑÑŒ Ñк root\n" +msgid "%s: cannot be run as root" +msgstr "%s: не можна запуÑтити Ñк root" -#: option.c:170 +#: option.c:172 #, c-format -msgid "invalid old port number\n" -msgstr "неприпуÑтимий Ñтарий номер порту\n" +msgid "invalid old port number" +msgstr "неприпуÑтимий Ñтарий номер порту" -#: option.c:175 +#: option.c:177 #, c-format -msgid "invalid new port number\n" -msgstr "неприпуÑтимий новий номер порту\n" +msgid "invalid new port number" +msgstr "неприпуÑтимий новий номер порту" -#: option.c:207 +#: option.c:216 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації.\n" -#: option.c:214 +#: option.c:223 #, c-format -msgid "too many command-line arguments (first is \"%s\")\n" -msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")\n" +msgid "too many command-line arguments (first is \"%s\")" +msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")" -#: option.c:220 +#: option.c:229 #, c-format -msgid "Running in verbose mode\n" -msgstr "ВиконуєтьÑÑ Ð² детальному режимі\n" +msgid "Running in verbose mode" +msgstr "ВиконуєтьÑÑ Ð² детальному режимі" -#: option.c:251 +#: option.c:247 msgid "old cluster binaries reside" msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð²Ñ–Ð¹ÐºÐ¾Ð²Ð¸Ñ… даних Ñтарого клаÑтера" -#: option.c:253 +#: option.c:249 msgid "new cluster binaries reside" msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð²Ñ–Ð¹ÐºÐ¾Ð²Ð¸Ñ… даних нового клаÑтера" -#: option.c:255 +#: option.c:251 msgid "old cluster data resides" msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… Ñтарого клаÑтера" -#: option.c:257 +#: option.c:253 msgid "new cluster data resides" msgstr "Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ… нового клаÑтера" -#: option.c:259 +#: option.c:255 msgid "sockets will be created" msgstr "Ñокети будуть Ñтворені" -#: option.c:276 option.c:374 +#: option.c:272 option.c:374 #, c-format -msgid "could not determine current directory\n" -msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ поточний каталог\n" +msgid "could not determine current directory" +msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ поточний каталог" -#: option.c:279 +#: option.c:275 #, c-format -msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows\n" -msgstr "у Windows не можна виконати pg_upgrade вÑередині каталогу даних нового клаÑтера\n" +msgid "cannot run pg_upgrade from inside the new cluster data directory on Windows" +msgstr "у Windows не можна виконати pg_upgrade вÑередині каталогу даних нового клаÑтера" -#: option.c:288 +#: option.c:284 #, c-format msgid "pg_upgrade upgrades a PostgreSQL cluster to a different major version.\n\n" msgstr "pg_upgrade оновлює клаÑтер PostgreSQL до іншої оÑновної верÑÑ–Ñ—.\n\n" -#: option.c:289 +#: option.c:285 #, c-format msgid "Usage:\n" msgstr "ВикориÑтаннÑ:\n" -#: option.c:290 +#: option.c:286 #, c-format msgid " pg_upgrade [OPTION]...\n\n" msgstr " pg_upgrade [OPTION]...\n\n" -#: option.c:291 +#: option.c:287 #, c-format msgid "Options:\n" msgstr "Параметри:\n" -#: option.c:292 +#: option.c:288 #, c-format msgid " -b, --old-bindir=BINDIR old cluster executable directory\n" msgstr " -b, --old-bindir=BINDIR каталог виконуваних файлів Ñтарого клаÑтера\n" -#: option.c:293 +#: option.c:289 #, c-format msgid " -B, --new-bindir=BINDIR new cluster executable directory (default\n" " same directory as pg_upgrade)\n" msgstr " -B, --new-bindir=BINDIR каталог виконуваних файлів нового клаÑтера (за замовчуваннÑм\n" " той Ñамий каталог, що Ñ– pg_upgrade)\n" -#: option.c:295 +#: option.c:291 #, c-format msgid " -c, --check check clusters only, don't change any data\n" msgstr " -c, --check тільки перевірити клаÑтери, не змінювати ніÑкі дані\n" -#: option.c:296 +#: option.c:292 #, c-format msgid " -d, --old-datadir=DATADIR old cluster data directory\n" msgstr " -d, --old-datadir=DATADIR каталог даних Ñтарого клаÑтера\n" -#: option.c:297 +#: option.c:293 #, c-format msgid " -D, --new-datadir=DATADIR new cluster data directory\n" msgstr " -D, --new-datadir=DATADIR каталог даних нового клаÑтера\n" -#: option.c:298 +#: option.c:294 #, c-format msgid " -j, --jobs=NUM number of simultaneous processes or threads to use\n" msgstr " -j, --jobs=NUM чиÑло одночаÑних процеÑів або потоків Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ\n" -#: option.c:299 +#: option.c:295 #, c-format msgid " -k, --link link instead of copying files to new cluster\n" msgstr " -k, --link вÑтановлювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð°Ð¼Ñ–Ñть ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² до нового клаÑтера\n" -#: option.c:300 +#: option.c:296 +#, c-format +msgid " -N, --no-sync do not wait for changes to be written safely to disk\n" +msgstr " -N, --no-sync не чекати Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½ на диÑку\n" + +#: option.c:297 #, c-format msgid " -o, --old-options=OPTIONS old cluster options to pass to the server\n" msgstr " -o, --old-options=OPTIONS параметри Ñтарого клаÑтера, Ñкі передаютьÑÑ Ñерверу\n" -#: option.c:301 +#: option.c:298 #, c-format msgid " -O, --new-options=OPTIONS new cluster options to pass to the server\n" msgstr " -O, --new-options=OPTIONS параметри нового клаÑтера, Ñкі передаютьÑÑ Ñерверу\n" -#: option.c:302 +#: option.c:299 #, c-format msgid " -p, --old-port=PORT old cluster port number (default %d)\n" msgstr " -p, --old-port=PORT номер порту Ñтарого клаÑтера (за замовчуваннÑм %d)\n" -#: option.c:303 +#: option.c:300 #, c-format msgid " -P, --new-port=PORT new cluster port number (default %d)\n" msgstr " -P, --new-port=PORT номер порту нового клаÑтера (за замовчуваннÑм %d)\n" -#: option.c:304 +#: option.c:301 #, c-format msgid " -r, --retain retain SQL and log files after success\n" msgstr " -r, --retain зберегти файли журналів Ñ– SQL піÑÐ»Ñ ÑƒÑпішного завершеннÑ\n" -#: option.c:305 +#: option.c:302 #, c-format msgid " -s, --socketdir=DIR socket directory to use (default current dir.)\n" msgstr " -s, --socketdir=DIR Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ñ–Ñ Ñокету Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ (за Ð·Ð°Ð¼Ð¾Ð²Ñ‡ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð° директоріÑ)\n" -#: option.c:306 +#: option.c:303 #, c-format msgid " -U, --username=NAME cluster superuser (default \"%s\")\n" msgstr " -U, --username=NAME ÑуперкориÑтувач клаÑтера (за замовчуваннÑм \"%s\")\n" -#: option.c:307 +#: option.c:304 #, c-format msgid " -v, --verbose enable verbose internal logging\n" msgstr " -v, --verbose активувати Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´ÐµÑ‚Ð°Ð»ÑŒÐ½Ð¸Ñ… внутрішніх повідомлень\n" -#: option.c:308 +#: option.c:305 #, c-format msgid " -V, --version display version information, then exit\n" msgstr " -V, --version відобразити інформацію про верÑÑ–ÑŽ, потім вийти\n" -#: option.c:309 +#: option.c:306 #, c-format msgid " --clone clone instead of copying files to new cluster\n" msgstr " --clone клонувати заміÑть ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² до нового клаÑтера\n" +#: option.c:307 +#, c-format +msgid " --copy copy files to new cluster (default)\n" +msgstr " --copy копіювати файли до нового клаÑтеру (за замовчуваннÑм)\n" + +#: option.c:308 +#, c-format +msgid " --copy-file-range copy files to new cluster with copy_file_range\n" +msgstr " --copy-file-range копіювати файли в новий клаÑтер за допомогою copy_file_range\n" + +#: option.c:309 +#, c-format +msgid " --sync-method=METHOD set method for syncing files to disk\n" +msgstr " --sync-method=METHOD вÑтановити метод Ñинхронізації файлів на диÑк\n" + #: option.c:310 #, c-format msgid " -?, --help show this help, then exit\n" @@ -1232,238 +1451,274 @@ msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" #: option.c:380 #, c-format msgid "You must identify the directory where the %s.\n" -"Please use the %s command-line option or the %s environment variable.\n" +"Please use the %s command-line option or the %s environment variable." msgstr "Ви повинні визначити каталог, де знаходитьÑÑ %s.\n" -"Будь лаÑка, викориÑтайте параметр командного Ñ€Ñдка %s або змінну Ñередовища %s.\n" +"Будь лаÑка, викориÑтайте параметр командного Ñ€Ñдка %s або змінну Ñередовища %s." -#: option.c:432 +#: option.c:433 #, c-format msgid "Finding the real data directory for the source cluster" msgstr "Пошук дійÑного каталогу даних Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ð³Ð¾ клаÑтера" -#: option.c:434 +#: option.c:435 #, c-format msgid "Finding the real data directory for the target cluster" msgstr "Пошук дійÑного каталогу даних Ð´Ð»Ñ Ñ†Ñ–Ð»ÑŒÐ¾Ð²Ð¾Ð³Ð¾ клаÑтера" -#: option.c:446 +#: option.c:448 +#, c-format +msgid "could not get data directory using %s: %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ каталог даних, виконавши %s: %m" + +#: option.c:452 #, c-format -msgid "could not get data directory using %s: %s\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ каталог даних, виконавши %s: %s\n" +msgid "could not get data directory using %s: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ каталог даних, виконавши %s: %s" -#: option.c:505 +#: option.c:500 #, c-format -msgid "could not read line %d from file \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñ€Ñдок %d з файлу \"%s\": %s\n" +msgid "could not read line %d from file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ñ€Ñдок %d з файлу \"%s\": %m" -#: option.c:522 +#: option.c:517 #, c-format -msgid "user-supplied old port number %hu corrected to %hu\n" -msgstr "вказаний кориÑтувачем Ñтарий номер порту %hu змінений на %hu\n" +msgid "user-supplied old port number %hu corrected to %hu" +msgstr "вказаний кориÑтувачем Ñтарий номер порту %hu змінений на %hu" -#: parallel.c:127 parallel.c:238 +#: parallel.c:127 parallel.c:235 #, c-format -msgid "could not create worker process: %s\n" -msgstr "не вдалоÑÑ Ñтворити робочий процеÑ: %s\n" +msgid "could not create worker process: %m" +msgstr "не вдалоÑÑ Ñтворити робочий процеÑ: %m" -#: parallel.c:146 parallel.c:259 +#: parallel.c:143 parallel.c:253 #, c-format -msgid "could not create worker thread: %s\n" -msgstr "не вдалоÑÑ Ñтворити робочий потік: %s\n" +msgid "could not create worker thread: %m" +msgstr "не вдалоÑÑ Ñтворити робочий потік: %m" -#: parallel.c:300 +#: parallel.c:294 #, c-format -msgid "%s() failed: %s\n" -msgstr "%s() помилка: %s\n" +msgid "%s() failed: %m" +msgstr "%s() помилка: %m" -#: parallel.c:304 +#: parallel.c:298 #, c-format -msgid "child process exited abnormally: status %d\n" -msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð½ÐµÐ½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð¾: ÑÑ‚Ð°Ñ‚ÑƒÑ %d\n" +msgid "child process exited abnormally: status %d" +msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð½ÐµÐ½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð¾: ÑÑ‚Ð°Ñ‚ÑƒÑ %d" -#: parallel.c:319 +#: parallel.c:313 #, c-format -msgid "child worker exited abnormally: %s\n" -msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾: %s\n" +msgid "child worker exited abnormally: %m" +msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð°Ð²Ð°Ñ€Ñ–Ð¹Ð½Ð¾: %m" -#: pg_upgrade.c:107 +#: pg_upgrade.c:115 #, c-format -msgid "could not read permissions of directory \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ права на каталог \"%s\": %s\n" +msgid "could not read permissions of directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ дозволи на каталог \"%s\": %m" -#: pg_upgrade.c:122 +#: pg_upgrade.c:147 #, c-format msgid "\n" "Performing Upgrade\n" -"------------------\n" +"------------------" msgstr "\n" "Ð’Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ\n" -"------------------\n" +"------------------" -#: pg_upgrade.c:165 +#: pg_upgrade.c:192 #, c-format msgid "Setting next OID for new cluster" msgstr "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ñтупного OID Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера" -#: pg_upgrade.c:172 +#: pg_upgrade.c:216 #, c-format msgid "Sync data directory to disk" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ñ–Ð·Ð°Ñ†Ñ–Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ñƒ даних на диÑк" -#: pg_upgrade.c:183 +#: pg_upgrade.c:230 #, c-format msgid "\n" "Upgrade Complete\n" -"----------------\n" +"----------------" msgstr "\n" "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾\n" -"----------------\n" +"----------------" -#: pg_upgrade.c:216 +#: pg_upgrade.c:263 pg_upgrade.c:276 pg_upgrade.c:283 pg_upgrade.c:290 +#: pg_upgrade.c:308 pg_upgrade.c:319 +#, c-format +msgid "directory path for new cluster is too long" +msgstr "шлÑÑ… каталогу Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтеру занадто довгий" + +#: pg_upgrade.c:297 pg_upgrade.c:299 pg_upgrade.c:301 pg_upgrade.c:303 #, c-format -msgid "%s: could not find own program executable\n" -msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ехе файл влаÑної програми\n" +msgid "could not create directory \"%s\": %m" +msgstr "не вдалоÑÑ Ñтворити каталог \"%s\": %m" -#: pg_upgrade.c:242 +#: pg_upgrade.c:352 +#, c-format +msgid "%s: could not find own program executable" +msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файл Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð²Ð»Ð°Ñної програми" + +#: pg_upgrade.c:378 #, c-format msgid "There seems to be a postmaster servicing the old cluster.\n" -"Please shutdown that postmaster and try again.\n" +"Please shutdown that postmaster and try again." msgstr "Мабуть, запущений Ð¿Ñ€Ð¾Ñ†ÐµÑ postmaster, Ñкий обÑлуговує Ñтарий клаÑтер.\n" -"Будь лаÑка, завершіть роботу процеÑу Ñ– Ñпробуйте знову.\n" +"Будь лаÑка, завершіть роботу процеÑу Ñ– Ñпробуйте знову." -#: pg_upgrade.c:255 +#: pg_upgrade.c:391 #, c-format msgid "There seems to be a postmaster servicing the new cluster.\n" -"Please shutdown that postmaster and try again.\n" +"Please shutdown that postmaster and try again." msgstr "Мабуть, запущений Ð¿Ñ€Ð¾Ñ†ÐµÑ postmaster, Ñкий обÑлуговує новий клаÑтер.\n" -"Будь лаÑка, завершіть роботу процеÑу Ñ– Ñпробуйте знову.\n" +"Будь лаÑка, завершіть роботу процеÑу Ñ– Ñпробуйте знову." + +#: pg_upgrade.c:414 +#, c-format +msgid "Setting locale and encoding for new cluster" +msgstr "УÑтановка локалі та ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтеру" -#: pg_upgrade.c:269 +#: pg_upgrade.c:488 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Ðналіз вÑÑ–Ñ… Ñ€Ñдків у новому клаÑтері" -#: pg_upgrade.c:282 +#: pg_upgrade.c:501 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Ð—Ð°ÐºÑ€Ñ–Ð¿Ð»ÐµÐ½Ð½Ñ Ð²ÑÑ–Ñ… Ñ€Ñдків у новому клаÑтері" -#: pg_upgrade.c:302 +#: pg_upgrade.c:521 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¸Ñ… об'єктів у новому клаÑтері" -#: pg_upgrade.c:317 +#: pg_upgrade.c:537 #, c-format -msgid "Restoring database schemas in the new cluster\n" -msgstr "Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñхем баз даних у новому клаÑтері\n" +msgid "Restoring database schemas in the new cluster" +msgstr "Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñхем баз даних у новому клаÑтері" -#: pg_upgrade.c:421 +#: pg_upgrade.c:661 #, c-format msgid "Deleting files from new %s" msgstr "Ð’Ð¸Ð´Ð°Ð»ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² з нового %s" -#: pg_upgrade.c:425 +#: pg_upgrade.c:665 #, c-format -msgid "could not delete directory \"%s\"\n" -msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ каталог \"%s\"\n" +msgid "could not delete directory \"%s\"" +msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ каталог \"%s\"" -#: pg_upgrade.c:444 +#: pg_upgrade.c:684 #, c-format msgid "Copying old %s to new server" msgstr "ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñтарого %s до нового Ñерверу" -#: pg_upgrade.c:470 +#: pg_upgrade.c:710 #, c-format msgid "Setting oldest XID for new cluster" msgstr "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð½Ð°Ð¹Ñтарішого XID Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтеру" -#: pg_upgrade.c:478 +#: pg_upgrade.c:718 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "УÑтановка наÑтупного ID транзакції й епохи Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера" -#: pg_upgrade.c:508 +#: pg_upgrade.c:748 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "УÑтановка наÑтупного ID Ñ– зÑуву мультитранзакції Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ клаÑтера" -#: pg_upgrade.c:532 +#: pg_upgrade.c:772 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "УÑтановка найÑтаршого ID мультитранзакції в новому клаÑтері" -#: pg_upgrade.c:552 +#: pg_upgrade.c:792 #, c-format msgid "Resetting WAL archives" msgstr "Ð¡ÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ð°Ñ€Ñ…Ñ–Ð²Ñ–Ð² WAL" -#: pg_upgrade.c:595 +#: pg_upgrade.c:835 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "УÑтановка лічильників frozenxid Ñ– minmxid у новому клаÑтері" -#: pg_upgrade.c:597 +#: pg_upgrade.c:837 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "УÑтановка лічильника minmxid у новому клаÑтері" -#: relfilenode.c:35 +#: pg_upgrade.c:928 +#, c-format +msgid "Restoring logical replication slots in the new cluster" +msgstr "Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ñлотів логічної реплікації в новому клаÑтері" + +#: relfilenumber.c:35 #, c-format -msgid "Cloning user relation files\n" -msgstr "ÐšÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² кориÑтувацьких відношень\n" +msgid "Cloning user relation files" +msgstr "ÐšÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² кориÑтувацьких відношень" -#: relfilenode.c:38 +#: relfilenumber.c:38 #, c-format -msgid "Copying user relation files\n" -msgstr "ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² кориÑтувацьких відношень\n" +msgid "Copying user relation files" +msgstr "ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² кориÑтувацьких відношень" -#: relfilenode.c:41 +#: relfilenumber.c:41 #, c-format -msgid "Linking user relation files\n" -msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² кориÑтувацьких відношень поÑиланнÑми\n" +msgid "Copying user relation files with copy_file_range" +msgstr "ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² кориÑтувацьких відношень за допомогою copy_file_range" -#: relfilenode.c:115 +#: relfilenumber.c:44 #, c-format -msgid "old database \"%s\" not found in the new cluster\n" -msgstr "Ñтара база даних \"%s\" не знайдена в новому клаÑтері\n" +msgid "Linking user relation files" +msgstr "ÐŸÑ€Ð¸Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² кориÑтувацьких відношень" -#: relfilenode.c:230 +#: relfilenumber.c:118 #, c-format -msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s\n" -msgstr "помилка під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ Ñ–ÑÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s.%s\" (з \"%s\" в \"%s\"): %s\n" +msgid "old database \"%s\" not found in the new cluster" +msgstr "Ñтара база даних \"%s\" не знайдена в новому клаÑтері" -#: relfilenode.c:248 +#: relfilenumber.c:221 #, c-format -msgid "rewriting \"%s\" to \"%s\"\n" -msgstr "перезапиÑÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" в \"%s\"\n" +msgid "error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %m" +msgstr "помилка під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ Ñ–ÑÐ½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s.%s\" (з \"%s\" в \"%s\"): %m" -#: relfilenode.c:256 +#: relfilenumber.c:238 #, c-format -msgid "cloning \"%s\" to \"%s\"\n" -msgstr "ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" до \"%s\"\n" +msgid "rewriting \"%s\" to \"%s\"" +msgstr "перепиÑÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" на \"%s\"" -#: relfilenode.c:261 +#: relfilenumber.c:246 #, c-format -msgid "copying \"%s\" to \"%s\"\n" -msgstr "ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\" в \"%s\"\n" +msgid "cloning \"%s\" to \"%s\"" +msgstr "ÐºÐ»Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ \"%s\" до \"%s\"" -#: relfilenode.c:266 +#: relfilenumber.c:251 #, c-format -msgid "linking \"%s\" to \"%s\"\n" -msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° \"%s\" в \"%s\"\n" +msgid "copying \"%s\" to \"%s\"" +msgstr "ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\" в \"%s\"" -#: server.c:38 server.c:142 util.c:135 util.c:165 +#: relfilenumber.c:256 +#, c-format +msgid "copying \"%s\" to \"%s\" with copy_file_range" +msgstr "ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ \"%s\" в \"%s\" з copy_file_range" + +#: relfilenumber.c:261 +#, c-format +msgid "linking \"%s\" to \"%s\"" +msgstr "ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ð¾ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° \"%s\" в \"%s\"" + +#: server.c:39 server.c:143 util.c:248 util.c:278 #, c-format msgid "Failure, exiting\n" msgstr "Помилка, вихід\n" -#: server.c:132 +#: server.c:133 #, c-format -msgid "executing: %s\n" -msgstr "виконуєтьÑÑ: %s\n" +msgid "executing: %s" +msgstr "виконуєтьÑÑ: %s" -#: server.c:138 +#: server.c:139 #, c-format msgid "SQL command failed\n" "%s\n" @@ -1472,192 +1727,117 @@ msgstr "Помилка SQL-команди\n" "%s\n" "%s" -#: server.c:168 +#: server.c:169 #, c-format -msgid "could not open version file \"%s\": %m\n" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл верÑÑ–Ñ— \"%s\": %m\n" +msgid "could not open version file \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл верÑÑ–Ñ— \"%s\": %m" -#: server.c:172 +#: server.c:173 #, c-format -msgid "could not parse version file \"%s\"\n" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ файл верÑÑ–Ñ— \"%s\"\n" +msgid "could not parse version file \"%s\"" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ файл верÑÑ–Ñ— \"%s\"" -#: server.c:298 +#: server.c:310 #, c-format msgid "\n" "%s" msgstr "\n" "%s" -#: server.c:302 +#: server.c:314 #, c-format msgid "could not connect to source postmaster started with the command:\n" -"%s\n" +"%s" msgstr "не вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ початкового процеÑу postmaster, запущеного командою:\n" -"%s\n" +"%s" -#: server.c:306 +#: server.c:318 #, c-format msgid "could not connect to target postmaster started with the command:\n" -"%s\n" +"%s" msgstr "не вдалоÑÑ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚Ð¸ÑÑ Ð´Ð¾ цільового процеÑу postmaster, запущеного командою:\n" -"%s\n" +"%s" -#: server.c:320 +#: server.c:332 #, c-format -msgid "pg_ctl failed to start the source server, or connection failed\n" -msgstr "pg_ctl не зміг запуÑтити початковий Ñервер або ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° підключеннÑ\n" +msgid "pg_ctl failed to start the source server, or connection failed" +msgstr "pg_ctl не зміг запуÑтити початковий Ñервер або ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° підключеннÑ" -#: server.c:322 +#: server.c:334 #, c-format -msgid "pg_ctl failed to start the target server, or connection failed\n" -msgstr "pg_ctl не зміг запуÑтити цільовий Ñервер або ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° підключеннÑ\n" +msgid "pg_ctl failed to start the target server, or connection failed" +msgstr "pg_ctl не зміг запуÑтити цільовий Ñервер або ÑталаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° підключеннÑ" -#: server.c:367 +#: server.c:379 #, c-format -msgid "out of memory\n" -msgstr "недоÑтатньо пам'Ñті\n" +msgid "out of memory" +msgstr "недоÑтатньо пам'Ñті" -#: server.c:380 +#: server.c:392 #, c-format -msgid "libpq environment variable %s has a non-local server value: %s\n" -msgstr "у змінній Ñередовища Ð´Ð»Ñ libpq %s задано не локальне значеннÑ: %s\n" +msgid "libpq environment variable %s has a non-local server value: %s" +msgstr "у змінній Ñередовища Ð´Ð»Ñ libpq %s задано не локальне значеннÑ: %s" #: tablespace.c:28 #, c-format msgid "Cannot upgrade to/from the same system catalog version when\n" -"using tablespaces.\n" +"using tablespaces." msgstr "ÐžÐ½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð² межах однієї верÑÑ–Ñ— ÑиÑтемного каталогу неможливе,\n" -"Ñкщо викориÑтовуютьÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ñ– проÑтори.\n" +"Ñкщо викориÑтовуютьÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ñ– проÑтори." -#: tablespace.c:86 +#: tablespace.c:83 #, c-format -msgid "tablespace directory \"%s\" does not exist\n" -msgstr "каталог табличного проÑтору \"%s\" не Ñ–Ñнує\n" +msgid "tablespace directory \"%s\" does not exist" +msgstr "каталог табличного проÑтору \"%s\" не Ñ–Ñнує" -#: tablespace.c:90 +#: tablespace.c:87 #, c-format -msgid "could not stat tablespace directory \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ñтан каталогу табличного проÑтору \"%s\": %s\n" +msgid "could not stat tablespace directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ñтан каталогу табличного проÑтору \"%s\": %m" -#: tablespace.c:95 +#: tablespace.c:92 #, c-format -msgid "tablespace path \"%s\" is not a directory\n" -msgstr "шлÑÑ… табличного проÑтору \"%s\" не вказує на каталог\n" +msgid "tablespace path \"%s\" is not a directory" +msgstr "шлÑÑ… табличного проÑтору \"%s\" не вказує на каталог" -#: util.c:49 -#, c-format -msgid " " -msgstr " " - -#: util.c:82 +#: util.c:53 util.c:56 util.c:139 util.c:170 util.c:172 #, c-format msgid "%-*s" msgstr "%-*s" -#: util.c:174 +#: util.c:107 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "немає доÑтупу до каталогу \"%s\": %m" + +#: util.c:287 #, c-format msgid "ok" msgstr "ok" -#: version.c:29 +#: version.c:44 #, c-format -msgid "Checking for large objects" -msgstr "Перевірка великих об'єктів" +msgid "Checking for hash indexes" +msgstr "Перевірка геш-індекÑів" -#: version.c:77 version.c:419 +#: version.c:121 #, c-format msgid "warning" msgstr "попередженнÑ" -#: version.c:79 -#, c-format -msgid "\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table. After upgrading, you will be\n" -"given a command to populate the pg_largeobject_metadata table with\n" -"default permissions.\n\n" -msgstr "\n" -"Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить великі об'єкти. Ðова база даних має\n" -"додаткову таблицю з правами Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об'єктів. ПіÑÐ»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð¸ отримаєте команду Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– pg_largeobject_metadata \n" -"з правами за замовчуваннÑм.\n\n" - -#: version.c:85 -#, c-format -msgid "\n" -"Your installation contains large objects. The new database has an\n" -"additional large object permission table, so default permissions must be\n" -"defined for all large objects. The file\n" -" %s\n" -"when executed by psql by the database superuser will set the default\n" -"permissions.\n\n" -msgstr "\n" -"Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить великі об'єкти. Ðова база даних має\n" -"додаткову таблицю з правами Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об'єктів, тож Ð´Ð»Ñ Ð²ÑÑ–Ñ…\n" -"великих об'єктів повинні визначатиÑÑŒ права за замовчуваннÑм. Файл\n" -" %s\n" -"дозволÑÑ” вÑтановити такі права (він призначений Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð² psql\n" -"ÑуперкориÑтувачем бази даних).\n\n" - -#: version.c:272 -#, c-format -msgid "Checking for incompatible \"line\" data type" -msgstr "Перевірка неÑуміÑного типу даних \"line\"" - -#: version.c:279 -#, c-format -msgid "Your installation contains the \"line\" data type in user tables.\n" -"This data type changed its internal and input/output format\n" -"between your old and new versions so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n\n" -msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить тип даних \"line\" в таблицÑÑ… кориÑтувача.\n" -"Внутрішній формат та формат вводу/виводу цього типу даних змінено між вашою Ñтарою та новими верÑÑ–Ñми,\n" -"тому цей клаÑтер наразі не може бути оновлений.\n" -"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n" -"СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:\n" -" %s\n\n" - -#: version.c:310 -#, c-format -msgid "Checking for invalid \"unknown\" user columns" -msgstr "Перевірка неприпуÑтимих кориÑтувацьких Ñтовпців \"unknown\"" - -#: version.c:317 -#, c-format -msgid "Your installation contains the \"unknown\" data type in user tables.\n" -"This data type is no longer allowed in tables, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n\n" -msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить \"unknown\" тип даних у таблицÑÑ… кориÑтувача.\n" -"Цей тип даних більше не допуÑкаєтьÑÑ Ð² таблицÑÑ…,\n" -"тому цей клаÑтер наразі не може бути оновлений.\n" -"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n" -"СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:\n" -" %s\n\n" - -#: version.c:341 -#, c-format -msgid "Checking for hash indexes" -msgstr "Перевірка геш-індекÑів" - -#: version.c:421 +#: version.c:123 #, c-format msgid "\n" "Your installation contains hash indexes. These indexes have different\n" "internal formats between your old and new clusters, so they must be\n" "reindexed with the REINDEX command. After upgrading, you will be given\n" -"REINDEX instructions.\n\n" +"REINDEX instructions." msgstr "\n" "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить геш-індекÑи. Ці індекÑи мають різні внутрішні\n" "формати в Ñтарому Ñ– новому клаÑтерах, тож Ñ—Ñ… потрібно повторно індекÑувати\n" -"за допомогою команди REINDEX. ПіÑÐ»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð°Ð¼ буде надано інÑтрукції REINDEX.\n\n" +"за допомогою команди REINDEX. ПіÑÐ»Ñ Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð²Ð°Ð¼ буде надано інÑтрукції REINDEX." -#: version.c:427 +#: version.c:129 #, c-format msgid "\n" "Your installation contains hash indexes. These indexes have different\n" @@ -1665,57 +1845,37 @@ msgid "\n" "reindexed with the REINDEX command. The file\n" " %s\n" "when executed by psql by the database superuser will recreate all invalid\n" -"indexes; until then, none of these indexes will be used.\n\n" +"indexes; until then, none of these indexes will be used." msgstr "\n" "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить геш-індекÑи. Ці індекÑи мають різні внутрішні\n" "формати в Ñтарому Ñ– новому клаÑтерах, тож Ñ—Ñ… потрібно повторно індекÑувати\n" "за допомогою команди REINDEX. Файл\n" " %s\n" "піÑÐ»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÑуперкориÑтувачем бази даних в psql, повторно Ñтворить\n" -"вÑÑ– неприпуÑтимі індекÑи; до цього ніÑкі геш-індекÑи не будуть викориÑтовуватиÑÑŒ.\n\n" - -#: version.c:453 -#, c-format -msgid "Checking for invalid \"sql_identifier\" user columns" -msgstr "Перевірка неприпуÑтимих кориÑтувацьких Ñтовпців \"sql_identifier\"" - -#: version.c:461 -#, c-format -msgid "Your installation contains the \"sql_identifier\" data type in user tables.\n" -"The on-disk format for this data type has changed, so this\n" -"cluster cannot currently be upgraded. You can\n" -"drop the problem columns and restart the upgrade.\n" -"A list of the problem columns is in the file:\n" -" %s\n\n" -msgstr "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить \"sql_identifier\" тип даних у таблицÑÑ… кориÑтувача.\n" -"Формат Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу даних змінено,\n" -"тому цей клаÑтер наразі не може бути оновлений.\n" -"Ви можете видалити проблемні Ñтовпці та перезапуÑтити оновленнÑ.\n" -"СпиÑок проблемних Ñтовпців знаходитьÑÑ Ñƒ файлі:\n" -" %s\n\n" +"вÑÑ– неприпуÑтимі індекÑи; до цього ніÑкі геш-індекÑи не будуть викориÑтовуватиÑÑŒ." -#: version.c:485 +#: version.c:153 #, c-format msgid "Checking for extension updates" msgstr "Перевірка оновлень розширеннÑ" -#: version.c:537 +#: version.c:200 #, c-format msgid "notice" msgstr "повідомленнÑ" -#: version.c:538 +#: version.c:201 #, c-format msgid "\n" "Your installation contains extensions that should be updated\n" "with the ALTER EXTENSION command. The file\n" " %s\n" "when executed by psql by the database superuser will update\n" -"these extensions.\n\n" +"these extensions." msgstr "\n" "Ваша інÑталÑÑ†Ñ–Ñ Ð¼Ñ–Ñтить розширеннÑ, Ñкі потрібно оновити\n" -"командою ALTER EXTENSION . Файл\n" +"командою ALTER EXTENSION. Файл\n" " %s,\n" "коли виконуєтьÑÑ ÑуперкориÑтувачем бази даних за допомогою\n" -"psql, оновить ці розширеннÑ.\n\n" +"psql, оновить ці розширеннÑ." diff --git a/src/bin/pg_upgrade/relfilenumber.c b/src/bin/pg_upgrade/relfilenumber.c index 34bc9c150425a..1d3054d78bdb1 100644 --- a/src/bin/pg_upgrade/relfilenumber.c +++ b/src/bin/pg_upgrade/relfilenumber.c @@ -3,7 +3,7 @@ * * relfilenumber functions * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/relfilenumber.c */ @@ -37,6 +37,9 @@ transfer_all_new_tablespaces(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr, case TRANSFER_MODE_COPY: prep_status_progress("Copying user relation files"); break; + case TRANSFER_MODE_COPY_FILE_RANGE: + prep_status_progress("Copying user relation files with copy_file_range"); + break; case TRANSFER_MODE_LINK: prep_status_progress("Linking user relation files"); break; @@ -215,9 +218,8 @@ transfer_relfile(FileNameMap *map, const char *type_suffix, bool vm_must_add_fro if (errno == ENOENT) return; else - pg_fatal("error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %s", - map->nspname, map->relname, old_file, new_file, - strerror(errno)); + pg_fatal("error while checking for file existence \"%s.%s\" (\"%s\" to \"%s\"): %m", + map->nspname, map->relname, old_file, new_file); } /* If file is empty, just return */ @@ -250,6 +252,11 @@ transfer_relfile(FileNameMap *map, const char *type_suffix, bool vm_must_add_fro old_file, new_file); copyFile(old_file, new_file, map->nspname, map->relname); break; + case TRANSFER_MODE_COPY_FILE_RANGE: + pg_log(PG_VERBOSE, "copying \"%s\" to \"%s\" with copy_file_range", + old_file, new_file); + copyFileByRange(old_file, new_file, map->nspname, map->relname); + break; case TRANSFER_MODE_LINK: pg_log(PG_VERBOSE, "linking \"%s\" to \"%s\"", old_file, new_file); diff --git a/src/bin/pg_upgrade/server.c b/src/bin/pg_upgrade/server.c index 0bc3d2806b870..91bcb4dbc7e69 100644 --- a/src/bin/pg_upgrade/server.c +++ b/src/bin/pg_upgrade/server.c @@ -3,7 +3,7 @@ * * database server functions * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/server.c */ @@ -201,6 +201,7 @@ start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error) PGconn *conn; bool pg_ctl_return = false; char socket_string[MAXPGPATH + 200]; + PQExpBufferData pgoptions; static bool exit_hook_registered = false; @@ -227,23 +228,44 @@ start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error) cluster->sockdir); #endif + initPQExpBuffer(&pgoptions); + /* - * Use -b to disable autovacuum. + * Construct a parameter string which is passed to the server process. * * Turn off durability requirements to improve object creation speed, and * we only modify the new cluster, so only use it there. If there is a * crash, the new cluster has to be recreated anyway. fsync=off is a big * win on ext4. */ + if (cluster == &new_cluster) + appendPQExpBufferStr(&pgoptions, " -c synchronous_commit=off -c fsync=off -c full_page_writes=off"); + + /* + * Use max_slot_wal_keep_size as -1 to prevent the WAL removal by the + * checkpointer process. If WALs required by logical replication slots + * are removed, the slots are unusable. This setting prevents the + * invalidation of slots during the upgrade. We set this option when + * cluster is PG17 or later because logical replication slots can only be + * migrated since then. Besides, max_slot_wal_keep_size is added in PG13. + */ + if (GET_MAJOR_VERSION(cluster->major_version) >= 1700) + appendPQExpBufferStr(&pgoptions, " -c max_slot_wal_keep_size=-1"); + + /* + * Use -b to disable autovacuum and logical replication launcher + * (effective in PG17 or later for the latter). + */ snprintf(cmd, sizeof(cmd), "\"%s/pg_ctl\" -w -l \"%s/%s\" -D \"%s\" -o \"-p %d -b%s %s%s\" start", cluster->bindir, log_opts.logdir, SERVER_LOG_FILE, cluster->pgconfig, cluster->port, - (cluster == &new_cluster) ? - " -c synchronous_commit=off -c fsync=off -c full_page_writes=off" : "", + pgoptions.data, cluster->pgopts ? cluster->pgopts : "", socket_string); + termPQExpBuffer(&pgoptions); + /* * Don't throw an error right away, let connecting throw the error because * it might supply a reason for the failure. diff --git a/src/bin/pg_upgrade/t/001_basic.pl b/src/bin/pg_upgrade/t/001_basic.pl index ceac4e0851bc8..e8e2edb58dc1b 100644 --- a/src/bin/pg_upgrade/t/001_basic.pl +++ b/src/bin/pg_upgrade/t/001_basic.pl @@ -1,7 +1,7 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl index 41fce089d68a3..78bd776f5be2f 100644 --- a/src/bin/pg_upgrade/t/002_pg_upgrade.pl +++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # Set of tests for pg_upgrade, including cross-version checks. use strict; -use warnings; +use warnings FATAL => 'all'; use Cwd qw(abs_path); use File::Basename qw(dirname); @@ -104,32 +104,80 @@ sub filter_dump push @custom_opts, '--allow-group-access'; } +my $old_provider_field; +my $old_datlocale_field; + +# account for field additions and changes +if ($oldnode->pg_version >= 15) +{ + $old_provider_field = "datlocprovider"; + if ($oldnode->pg_version >= '17devel') + { + $old_datlocale_field = "datlocale"; + } + else + { + $old_datlocale_field = "daticulocale AS datlocale"; + } +} +else +{ + $old_provider_field = "'c' AS datlocprovider"; + $old_datlocale_field = "NULL AS datlocale"; +} + # Set up the locale settings for the original cluster, so that we # can test that pg_upgrade copies the locale settings of template0 # from the old to the new cluster. -my $original_encoding = "6"; # UTF-8 -my $original_provider = "c"; -my $original_locale = "C"; -my $original_iculocale = ""; -my $provider_field = "'c' AS datlocprovider"; -my $iculocale_field = "NULL AS daticulocale"; -if ($oldnode->pg_version >= 15 && $ENV{with_icu} eq 'yes') +my $original_enc_name; +my $original_provider; +my $original_datcollate = "C"; +my $original_datctype = "C"; +my $original_datlocale; + +if ($oldnode->pg_version >= '17devel') +{ + $original_enc_name = "UTF-8"; + $original_provider = "b"; + $original_datlocale = "C.UTF-8"; +} +elsif ($oldnode->pg_version >= 15 && $ENV{with_icu} eq 'yes') { - $provider_field = "datlocprovider"; - $iculocale_field = "daticulocale"; + $original_enc_name = "UTF-8"; $original_provider = "i"; - $original_iculocale = "fr-CA"; + $original_datlocale = "fr-CA"; } +else +{ + $original_enc_name = "SQL_ASCII"; + $original_provider = "c"; + $original_datlocale = ""; +} + +my %encodings = ('UTF-8' => 6, 'SQL_ASCII' => 0); +my $original_encoding = $encodings{$original_enc_name}; my @initdb_params = @custom_opts; -push @initdb_params, ('--encoding', 'UTF-8'); -push @initdb_params, ('--locale', $original_locale); -if ($original_provider eq "i") +push @initdb_params, ('--encoding', $original_enc_name); +push @initdb_params, ('--lc-collate', $original_datcollate); +push @initdb_params, ('--lc-ctype', $original_datctype); + +# add --locale-provider, if supported +my %provider_name = ('b' => 'builtin', 'i' => 'icu', 'c' => 'libc'); +if ($oldnode->pg_version >= 15) { - push @initdb_params, ('--locale-provider', 'icu'); - push @initdb_params, ('--icu-locale', 'fr-CA'); + push @initdb_params, + ('--locale-provider', $provider_name{$original_provider}); + if ($original_provider eq 'b') + { + push @initdb_params, ('--builtin-locale', $original_datlocale); + } + elsif ($original_provider eq 'i') + { + push @initdb_params, ('--icu-locale', $original_datlocale); + } } $node_params{extra} = \@initdb_params; @@ -139,10 +187,10 @@ sub filter_dump my $result; $result = $oldnode->safe_psql( 'postgres', - "SELECT encoding, $provider_field, datcollate, datctype, $iculocale_field + "SELECT encoding, $old_provider_field, datcollate, datctype, $old_datlocale_field FROM pg_database WHERE datname='template0'"); is( $result, - "$original_encoding|$original_provider|$original_locale|$original_locale|$original_iculocale", + "$original_encoding|$original_provider|$original_datcollate|$original_datctype|$original_datlocale", "check locales in original cluster"); # The default location of the source code is the root of this directory. @@ -246,15 +294,18 @@ sub filter_dump foreach my $updb (keys %$adjust_cmds) { - my $upcmds = join(";\n", @{ $adjust_cmds->{$updb} }); + my @command_args = (); + for my $upcmd (@{ $adjust_cmds->{$updb} }) + { + push @command_args, '-c', $upcmd; + } # For simplicity, use the newer version's psql to issue the commands. $newnode->command_ok( [ - 'psql', '-X', - '-v', 'ON_ERROR_STOP=1', - '-c', $upcmds, + 'psql', '-X', '-v', 'ON_ERROR_STOP=1', '-d', $oldnode->connstr($updb), + @command_args, ], "ran version adaptation commands for database $updb"); } @@ -284,7 +335,7 @@ sub filter_dump my $dump_data = slurp_file($dump1_file); - my $newregresssrc = "$srcdir/src/test/regress"; + my $newregresssrc = dirname($ENV{REGRESS_SHLIB}); foreach (@libpaths) { my $libpath = $_; @@ -317,6 +368,13 @@ sub filter_dump } } +# Create an invalid database, will be deleted below +$oldnode->safe_psql( + 'postgres', qq( + CREATE DATABASE regression_invalid; + UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid'; +)); + # In a VPATH build, we'll be started in the source directory, but we want # to run pg_upgrade in the build directory so that any files generated finish # in it, like delete_old_cluster.{sh,bat}. @@ -345,6 +403,38 @@ sub filter_dump "pg_upgrade_output.d/ not removed after pg_upgrade failure"); rmtree($newnode->data_dir . "/pg_upgrade_output.d"); +# Check that pg_upgrade aborts when encountering an invalid database +# (However, versions that were out of support by commit c66a7d75e652 don't +# know how to do this, so skip this test there.) +SKIP: +{ + skip "database invalidation not implemented", 1 + if $oldnode->pg_version < 11; + + command_checks_all( + [ + 'pg_upgrade', '--no-sync', + '-d', $oldnode->data_dir, + '-D', $newnode->data_dir, + '-b', $oldbindir, + '-B', $newbindir, + '-s', $newnode->host, + '-p', $oldnode->port, + '-P', $newnode->port, + $mode, '--check', + ], + 1, + [qr/invalid/], # pg_upgrade prints errors on stdout :( + [qr/^$/], + 'invalid database causes failure'); + rmtree($newnode->data_dir . "/pg_upgrade_output.d"); +} + +# And drop it, so we can continue +$oldnode->start; +$oldnode->safe_psql('postgres', 'DROP DATABASE regression_invalid'); +$oldnode->stop; + # --check command works here, cleans up pg_upgrade_output.d. command_ok( [ @@ -356,7 +446,7 @@ sub filter_dump ], 'run of pg_upgrade --check for new instance'); ok(!-d $newnode->data_dir . "/pg_upgrade_output.d", - "pg_upgrade_output.d/ not removed after pg_upgrade --check success"); + "pg_upgrade_output.d/ removed after pg_upgrade --check success"); # Actual run, pg_upgrade_output.d is removed at the end. command_ok( @@ -385,9 +475,14 @@ sub filter_dump if $File::Find::name =~ m/.*\.log/; }, $newnode->data_dir . "/pg_upgrade_output.d"); + + my $test_logfile = $PostgreSQL::Test::Utils::test_logfile; + + note "=== pg_upgrade logs found - appending to $test_logfile ===\n"; foreach my $log (@log_files) { - note "=== contents of $log ===\n"; + note "=== appending $log ===\n"; + print "=== contents of $log ===\n"; print slurp_file($log); print "=== EOF ===\n"; } @@ -396,10 +491,10 @@ sub filter_dump # Test that upgraded cluster has original locale settings. $result = $newnode->safe_psql( 'postgres', - "SELECT encoding, $provider_field, datcollate, datctype, $iculocale_field + "SELECT encoding, datlocprovider, datcollate, datctype, datlocale FROM pg_database WHERE datname='template0'"); is( $result, - "$original_encoding|$original_provider|$original_locale|$original_locale|$original_iculocale", + "$original_encoding|$original_provider|$original_datcollate|$original_datctype|$original_datlocale", "check that locales in new cluster match original cluster"); # Second dump from the upgraded instance. @@ -411,15 +506,9 @@ sub filter_dump if ($oldnode->pg_version < 12); $newnode->command_ok(\@dump_command, 'dump after running pg_upgrade'); -# No need to apply filters on the dumps if working on the same version -# for the old and new nodes. -my $dump1_filtered = $dump1_file; -my $dump2_filtered = $dump2_file; -if ($oldnode->pg_version != $newnode->pg_version) -{ - $dump1_filtered = filter_dump(1, $oldnode->pg_version, $dump1_file); - $dump2_filtered = filter_dump(0, $oldnode->pg_version, $dump2_file); -} +# Filter the contents of the dumps. +my $dump1_filtered = filter_dump(1, $oldnode->pg_version, $dump1_file); +my $dump2_filtered = filter_dump(0, $oldnode->pg_version, $dump2_file); # Compare the two dumps, there should be no differences. my $compare_res = compare($dump1_filtered, $dump2_filtered); diff --git a/src/bin/pg_upgrade/t/003_logical_slots.pl b/src/bin/pg_upgrade/t/003_logical_slots.pl new file mode 100644 index 0000000000000..0a2483d3dfcde --- /dev/null +++ b/src/bin/pg_upgrade/t/003_logical_slots.pl @@ -0,0 +1,218 @@ +# Copyright (c) 2023-2024, PostgreSQL Global Development Group + +# Tests for upgrading logical replication slots + +use strict; +use warnings FATAL => 'all'; + +use File::Find qw(find); + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Can be changed to test the other modes +my $mode = $ENV{PG_TEST_PG_UPGRADE_MODE} || '--copy'; + +# Initialize old cluster +my $oldpub = PostgreSQL::Test::Cluster->new('oldpub'); +$oldpub->init(allows_streaming => 'logical'); +$oldpub->append_conf('postgresql.conf', 'autovacuum = off'); + +# Initialize new cluster +my $newpub = PostgreSQL::Test::Cluster->new('newpub'); +$newpub->init(allows_streaming => 'logical'); + +# During upgrade, when pg_restore performs CREATE DATABASE, bgwriter or +# checkpointer may flush buffers and hold a file handle for the system table. +# So, if later due to some reason we need to re-create the file with the same +# name like a TRUNCATE command on the same table, then the command will fail +# if OS (such as older Windows versions) doesn't remove an unlinked file +# completely till it is open. The probability of seeing this behavior is +# higher in this test because we use wal_level as logical via +# allows_streaming => 'logical' which in turn set shared_buffers as 1MB. +$newpub->append_conf( + 'postgresql.conf', q{ +bgwriter_lru_maxpages = 0 +checkpoint_timeout = 1h +}); + +# Setup a common pg_upgrade command to be used by all the test cases +my @pg_upgrade_cmd = ( + 'pg_upgrade', '--no-sync', + '-d', $oldpub->data_dir, + '-D', $newpub->data_dir, + '-b', $oldpub->config_data('--bindir'), + '-B', $newpub->config_data('--bindir'), + '-s', $newpub->host, + '-p', $oldpub->port, + '-P', $newpub->port, + $mode); + +# In a VPATH build, we'll be started in the source directory, but we want +# to run pg_upgrade in the build directory so that any files generated finish +# in it, like delete_old_cluster.{sh,bat}. +chdir ${PostgreSQL::Test::Utils::tmp_check}; + +# ------------------------------ +# TEST: Confirm pg_upgrade fails when the new cluster has wrong GUC values + +# Preparations for the subsequent test: +# 1. Create two slots on the old cluster +$oldpub->start; +$oldpub->safe_psql( + 'postgres', qq[ + SELECT pg_create_logical_replication_slot('test_slot1', 'test_decoding'); + SELECT pg_create_logical_replication_slot('test_slot2', 'test_decoding'); +]); +$oldpub->stop(); + +# 2. Set 'max_replication_slots' to be less than the number of slots (2) +# present on the old cluster. +$newpub->append_conf('postgresql.conf', "max_replication_slots = 1"); + +# pg_upgrade will fail because the new cluster has insufficient +# max_replication_slots +command_checks_all( + [@pg_upgrade_cmd], + 1, + [ + qr/"max_replication_slots" \(1\) must be greater than or equal to the number of logical replication slots \(2\) on the old cluster/ + ], + [qr//], + 'run of pg_upgrade where the new cluster has insufficient "max_replication_slots"' +); +ok(-d $newpub->data_dir . "/pg_upgrade_output.d", + "pg_upgrade_output.d/ not removed after pg_upgrade failure"); + +# Set 'max_replication_slots' to match the number of slots (2) present on the +# old cluster. Both slots will be used for subsequent tests. +$newpub->append_conf('postgresql.conf', "max_replication_slots = 2"); + + +# ------------------------------ +# TEST: Confirm pg_upgrade fails when the slot still has unconsumed WAL records + +# Preparations for the subsequent test: +# 1. Generate extra WAL records. At this point neither test_slot1 nor +# test_slot2 has consumed them. +# +# 2. Advance the slot test_slot2 up to the current WAL location, but test_slot1 +# still has unconsumed WAL records. +# +# 3. Emit a non-transactional message. This will cause test_slot2 to detect the +# unconsumed WAL record. +$oldpub->start; +$oldpub->safe_psql( + 'postgres', qq[ + CREATE TABLE tbl AS SELECT generate_series(1, 10) AS a; + SELECT pg_replication_slot_advance('test_slot2', pg_current_wal_lsn()); + SELECT count(*) FROM pg_logical_emit_message('false', 'prefix', 'This is a non-transactional message'); +]); +$oldpub->stop; + +# pg_upgrade will fail because there are slots still having unconsumed WAL +# records +command_checks_all( + [@pg_upgrade_cmd], + 1, + [ + qr/Your installation contains logical replication slots that cannot be upgraded./ + ], + [qr//], + 'run of pg_upgrade of old cluster with slots having unconsumed WAL records' +); + +# Verify the reason why the logical replication slot cannot be upgraded +my $slots_filename; + +# Find a txt file that contains a list of logical replication slots that cannot +# be upgraded. We cannot predict the file's path because the output directory +# contains a milliseconds timestamp. File::Find::find must be used. +find( + sub { + if ($File::Find::name =~ m/invalid_logical_slots\.txt/) + { + $slots_filename = $File::Find::name; + } + }, + $newpub->data_dir . "/pg_upgrade_output.d"); + +# Check the file content. Both slots should be reporting that they have +# unconsumed WAL records. +like( + slurp_file($slots_filename), + qr/The slot \"test_slot1\" has not consumed the WAL yet/m, + 'the previous test failed due to unconsumed WALs'); +like( + slurp_file($slots_filename), + qr/The slot \"test_slot2\" has not consumed the WAL yet/m, + 'the previous test failed due to unconsumed WALs'); + + +# ------------------------------ +# TEST: Successful upgrade + +# Preparations for the subsequent test: +# 1. Setup logical replication (first, cleanup slots from the previous tests) +my $old_connstr = $oldpub->connstr . ' dbname=postgres'; + +$oldpub->start; +$oldpub->safe_psql( + 'postgres', qq[ + SELECT * FROM pg_drop_replication_slot('test_slot1'); + SELECT * FROM pg_drop_replication_slot('test_slot2'); + CREATE PUBLICATION regress_pub FOR ALL TABLES; +]); + +# Initialize subscriber cluster +my $sub = PostgreSQL::Test::Cluster->new('sub'); +$sub->init(); + +$sub->start; +$sub->safe_psql( + 'postgres', qq[ + CREATE TABLE tbl (a int); + CREATE SUBSCRIPTION regress_sub CONNECTION '$old_connstr' PUBLICATION regress_pub WITH (two_phase = 'true', failover = 'true') +]); +$sub->wait_for_subscription_sync($oldpub, 'regress_sub'); + +# Also wait for two-phase to be enabled +my $twophase_query = + "SELECT count(1) = 0 FROM pg_subscription WHERE subtwophasestate NOT IN ('e');"; +$sub->poll_query_until('postgres', $twophase_query) + or die "Timed out while waiting for subscriber to enable twophase"; + +# 2. Temporarily disable the subscription +$sub->safe_psql('postgres', "ALTER SUBSCRIPTION regress_sub DISABLE"); +$oldpub->stop; + +# pg_upgrade should be successful +command_ok([@pg_upgrade_cmd], 'run of pg_upgrade of old cluster'); + +# Check that the slot 'regress_sub' has migrated to the new cluster +$newpub->start; +my $result = $newpub->safe_psql('postgres', + "SELECT slot_name, two_phase, failover FROM pg_replication_slots"); +is($result, qq(regress_sub|t|t), 'check the slot exists on new cluster'); + +# Update the connection +my $new_connstr = $newpub->connstr . ' dbname=postgres'; +$sub->safe_psql( + 'postgres', qq[ + ALTER SUBSCRIPTION regress_sub CONNECTION '$new_connstr'; + ALTER SUBSCRIPTION regress_sub ENABLE; +]); + +# Check whether changes on the new publisher get replicated to the subscriber +$newpub->safe_psql('postgres', + "INSERT INTO tbl VALUES (generate_series(11, 20))"); +$newpub->wait_for_catchup('regress_sub'); +$result = $sub->safe_psql('postgres', "SELECT count(*) FROM tbl"); +is($result, qq(20), 'check changes are replicated to the sub'); + +# Clean up +$sub->stop(); +$newpub->stop(); + +done_testing(); diff --git a/src/bin/pg_upgrade/t/004_subscription.pl b/src/bin/pg_upgrade/t/004_subscription.pl new file mode 100644 index 0000000000000..c59b83af9cc10 --- /dev/null +++ b/src/bin/pg_upgrade/t/004_subscription.pl @@ -0,0 +1,329 @@ +# Copyright (c) 2023-2024, PostgreSQL Global Development Group + +# Test for pg_upgrade of logical subscription. Note that after the successful +# upgrade test, we can't use the old cluster to prevent failing in --link mode. +use strict; +use warnings FATAL => 'all'; + +use File::Find qw(find); +use File::Path qw(rmtree); + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Can be changed to test the other modes. +my $mode = $ENV{PG_TEST_PG_UPGRADE_MODE} || '--copy'; + +# Initialize publisher node +my $publisher = PostgreSQL::Test::Cluster->new('publisher'); +$publisher->init(allows_streaming => 'logical'); +$publisher->start; + +# Initialize the old subscriber node +my $old_sub = PostgreSQL::Test::Cluster->new('old_sub'); +$old_sub->init; +$old_sub->start; +my $oldbindir = $old_sub->config_data('--bindir'); + +# Initialize the new subscriber +my $new_sub = PostgreSQL::Test::Cluster->new('new_sub'); +$new_sub->init; +my $newbindir = $new_sub->config_data('--bindir'); + +# In a VPATH build, we'll be started in the source directory, but we want +# to run pg_upgrade in the build directory so that any files generated finish +# in it, like delete_old_cluster.{sh,bat}. +chdir ${PostgreSQL::Test::Utils::tmp_check}; + +# Remember a connection string for the publisher node. It would be used +# several times. +my $connstr = $publisher->connstr . ' dbname=postgres'; + +# ------------------------------------------------------ +# Check that pg_upgrade fails when max_replication_slots configured in the new +# cluster is less than the number of subscriptions in the old cluster. +# ------------------------------------------------------ +# It is sufficient to use disabled subscription to test upgrade failure. +$publisher->safe_psql('postgres', "CREATE PUBLICATION regress_pub1"); +$old_sub->safe_psql('postgres', + "CREATE SUBSCRIPTION regress_sub1 CONNECTION '$connstr' PUBLICATION regress_pub1 WITH (enabled = false)" +); + +$old_sub->stop; + +$new_sub->append_conf('postgresql.conf', "max_replication_slots = 0"); + +# pg_upgrade will fail because the new cluster has insufficient +# max_replication_slots. +command_checks_all( + [ + 'pg_upgrade', '--no-sync', '-d', $old_sub->data_dir, + '-D', $new_sub->data_dir, '-b', $oldbindir, + '-B', $newbindir, '-s', $new_sub->host, + '-p', $old_sub->port, '-P', $new_sub->port, + $mode, '--check', + ], + 1, + [ + qr/"max_replication_slots" \(0\) must be greater than or equal to the number of subscriptions \(1\) on the old cluster/ + ], + [qr//], + 'run of pg_upgrade where the new cluster has insufficient max_replication_slots' +); + +# Reset max_replication_slots +$new_sub->append_conf('postgresql.conf', "max_replication_slots = 10"); + +# Cleanup +$publisher->safe_psql('postgres', "DROP PUBLICATION regress_pub1"); +$old_sub->start; +$old_sub->safe_psql('postgres', "DROP SUBSCRIPTION regress_sub1;"); + +# ------------------------------------------------------ +# Check that pg_upgrade refuses to run if: +# a) there's a subscription with tables in a state other than 'r' (ready) or +# 'i' (init) and/or +# b) the subscription has no replication origin. +# ------------------------------------------------------ +$publisher->safe_psql( + 'postgres', qq[ + CREATE TABLE tab_primary_key(id serial PRIMARY KEY); + INSERT INTO tab_primary_key values(1); + CREATE PUBLICATION regress_pub2 FOR TABLE tab_primary_key; +]); + +# Insert the same value that is already present in publisher to the primary key +# column of subscriber so that the table sync will fail. +$old_sub->safe_psql( + 'postgres', qq[ + CREATE TABLE tab_primary_key(id serial PRIMARY KEY); + INSERT INTO tab_primary_key values(1); + CREATE SUBSCRIPTION regress_sub2 CONNECTION '$connstr' PUBLICATION regress_pub2; +]); + +# Table will be in 'd' (data is being copied) state as table sync will fail +# because of primary key constraint error. +my $started_query = + "SELECT count(1) = 1 FROM pg_subscription_rel WHERE srsubstate = 'd'"; +$old_sub->poll_query_until('postgres', $started_query) + or die + "Timed out while waiting for the table state to become 'd' (datasync)"; + +# Setup another logical replication and drop the subscription's replication +# origin. +$publisher->safe_psql('postgres', "CREATE PUBLICATION regress_pub3"); +$old_sub->safe_psql('postgres', + "CREATE SUBSCRIPTION regress_sub3 CONNECTION '$connstr' PUBLICATION regress_pub3 WITH (enabled = false)" +); +my $sub_oid = $old_sub->safe_psql('postgres', + "SELECT oid FROM pg_subscription WHERE subname = 'regress_sub3'"); +my $reporigin = 'pg_' . qq($sub_oid); +$old_sub->safe_psql('postgres', + "SELECT pg_replication_origin_drop('$reporigin')"); + +$old_sub->stop; + +command_fails( + [ + 'pg_upgrade', '--no-sync', '-d', $old_sub->data_dir, + '-D', $new_sub->data_dir, '-b', $oldbindir, + '-B', $newbindir, '-s', $new_sub->host, + '-p', $old_sub->port, '-P', $new_sub->port, + $mode, '--check', + ], + 'run of pg_upgrade --check for old instance with relation in \'d\' datasync(invalid) state and missing replication origin' +); + +# Verify the reason why the subscriber cannot be upgraded +my $sub_relstate_filename; + +# Find a txt file that contains a list of tables that cannot be upgraded. We +# cannot predict the file's path because the output directory contains a +# milliseconds timestamp. File::Find::find must be used. +find( + sub { + if ($File::Find::name =~ m/subs_invalid\.txt/) + { + $sub_relstate_filename = $File::Find::name; + } + }, + $new_sub->data_dir . "/pg_upgrade_output.d"); + +# Check the file content which should have tab_primary_key table in an invalid +# state. +like( + slurp_file($sub_relstate_filename), + qr/The table sync state \"d\" is not allowed for database:\"postgres\" subscription:\"regress_sub2\" schema:\"public\" relation:\"tab_primary_key\"/m, + 'the previous test failed due to subscription table in invalid state'); + +# Check the file content which should have regress_sub3 subscription. +like( + slurp_file($sub_relstate_filename), + qr/The replication origin is missing for database:\"postgres\" subscription:\"regress_sub3\"/m, + 'the previous test failed due to missing replication origin'); + +# Cleanup +$old_sub->start; +$publisher->safe_psql( + 'postgres', qq[ + DROP PUBLICATION regress_pub2; + DROP PUBLICATION regress_pub3; + DROP TABLE tab_primary_key; +]); +$old_sub->safe_psql( + 'postgres', qq[ + DROP SUBSCRIPTION regress_sub2; + DROP SUBSCRIPTION regress_sub3; + DROP TABLE tab_primary_key; +]); +rmtree($new_sub->data_dir . "/pg_upgrade_output.d"); + +# Verify that the upgrade should be successful with tables in 'ready'/'init' +# state along with retaining the replication origin's remote lsn, subscription's +# running status, and failover option. +$publisher->safe_psql( + 'postgres', qq[ + CREATE TABLE tab_upgraded1(id int); + CREATE PUBLICATION regress_pub4 FOR TABLE tab_upgraded1; +]); + +$old_sub->safe_psql( + 'postgres', qq[ + CREATE TABLE tab_upgraded1(id int); + CREATE SUBSCRIPTION regress_sub4 CONNECTION '$connstr' PUBLICATION regress_pub4 WITH (failover = true); +]); + +# Wait till the table tab_upgraded1 reaches 'ready' state +my $synced_query = + "SELECT count(1) = 1 FROM pg_subscription_rel WHERE srsubstate = 'r'"; +$old_sub->poll_query_until('postgres', $synced_query) + or die "Timed out while waiting for the table to reach ready state"; + +$publisher->safe_psql('postgres', + "INSERT INTO tab_upgraded1 VALUES (generate_series(1,50))"); +$publisher->wait_for_catchup('regress_sub4'); + +# Change configuration to prepare a subscription table in init state +$old_sub->append_conf('postgresql.conf', + "max_logical_replication_workers = 0"); +$old_sub->restart; + +# Setup another logical replication +$publisher->safe_psql( + 'postgres', qq[ + CREATE TABLE tab_upgraded2(id int); + CREATE PUBLICATION regress_pub5 FOR TABLE tab_upgraded2; +]); +$old_sub->safe_psql( + 'postgres', qq[ + CREATE TABLE tab_upgraded2(id int); + CREATE SUBSCRIPTION regress_sub5 CONNECTION '$connstr' PUBLICATION regress_pub5; +]); + +# The table tab_upgraded2 will be in the init state as the subscriber's +# configuration for max_logical_replication_workers is set to 0. +my $result = $old_sub->safe_psql('postgres', + "SELECT count(1) = 1 FROM pg_subscription_rel WHERE srsubstate = 'i'"); +is($result, qq(t), "Check that the table is in init state"); + +# Get the replication origin's remote_lsn of the old subscriber +my $remote_lsn = $old_sub->safe_psql('postgres', + "SELECT remote_lsn FROM pg_replication_origin_status os, pg_subscription s WHERE os.external_id = 'pg_' || s.oid AND s.subname = 'regress_sub4'" +); +# Have the subscription in disabled state before upgrade +$old_sub->safe_psql('postgres', "ALTER SUBSCRIPTION regress_sub5 DISABLE"); + +my $tab_upgraded1_oid = $old_sub->safe_psql('postgres', + "SELECT oid FROM pg_class WHERE relname = 'tab_upgraded1'"); +my $tab_upgraded2_oid = $old_sub->safe_psql('postgres', + "SELECT oid FROM pg_class WHERE relname = 'tab_upgraded2'"); + +$old_sub->stop; + +# Change configuration so that initial table sync does not get started +# automatically +$new_sub->append_conf('postgresql.conf', + "max_logical_replication_workers = 0"); + +# ------------------------------------------------------ +# Check that pg_upgrade is successful when all tables are in ready or in +# init state (tab_upgraded1 table is in ready state and tab_upgraded2 table is +# in init state) along with retaining the replication origin's remote lsn, +# subscription's running status, and failover option. +# ------------------------------------------------------ +command_ok( + [ + 'pg_upgrade', '--no-sync', '-d', $old_sub->data_dir, + '-D', $new_sub->data_dir, '-b', $oldbindir, + '-B', $newbindir, '-s', $new_sub->host, + '-p', $old_sub->port, '-P', $new_sub->port, + $mode + ], + 'run of pg_upgrade for old instance when the subscription tables are in init/ready state' +); +ok( !-d $new_sub->data_dir . "/pg_upgrade_output.d", + "pg_upgrade_output.d/ removed after successful pg_upgrade"); + +# ------------------------------------------------------ +# Check that the data inserted to the publisher when the new subscriber is down +# will be replicated once it is started. Also check that the old subscription +# states and relations origins are all preserved. +# ------------------------------------------------------ +$publisher->safe_psql( + 'postgres', qq[ + INSERT INTO tab_upgraded1 VALUES(51); + INSERT INTO tab_upgraded2 VALUES(1); +]); + +$new_sub->start; + +# The subscription's running status and failover option should be preserved +# in the upgraded instance. So regress_sub4 should still have subenabled and +# subfailover set to true, while regress_sub5 should have both set to false. +$result = $new_sub->safe_psql('postgres', + "SELECT subname, subenabled, subfailover FROM pg_subscription ORDER BY subname" +); +is( $result, qq(regress_sub4|t|t +regress_sub5|f|f), + "check that the subscription's running status and failover are preserved" +); + +# Subscription relations should be preserved +$result = $new_sub->safe_psql('postgres', + "SELECT srrelid, srsubstate FROM pg_subscription_rel ORDER BY srrelid"); +is( $result, qq($tab_upgraded1_oid|r +$tab_upgraded2_oid|i), + "there should be 2 rows in pg_subscription_rel(representing tab_upgraded1 and tab_upgraded2)" +); + +# The replication origin's remote_lsn should be preserved +$sub_oid = $new_sub->safe_psql('postgres', + "SELECT oid FROM pg_subscription WHERE subname = 'regress_sub4'"); +$result = $new_sub->safe_psql('postgres', + "SELECT remote_lsn FROM pg_replication_origin_status WHERE external_id = 'pg_' || $sub_oid" +); +is($result, qq($remote_lsn), "remote_lsn should have been preserved"); + +# Resume the initial sync and wait until all tables of subscription +# 'regress_sub5' are synchronized +$new_sub->append_conf('postgresql.conf', + "max_logical_replication_workers = 10"); +$new_sub->restart; +$new_sub->safe_psql('postgres', "ALTER SUBSCRIPTION regress_sub5 ENABLE"); +$new_sub->wait_for_subscription_sync($publisher, 'regress_sub5'); + +# wait for regress_sub4 to catchup as well +$publisher->wait_for_catchup('regress_sub4'); + +# Rows on tab_upgraded1 and tab_upgraded2 should have been replicated +$result = + $new_sub->safe_psql('postgres', "SELECT count(*) FROM tab_upgraded1"); +is($result, qq(51), "check replicated inserts on new subscriber"); +$result = + $new_sub->safe_psql('postgres', "SELECT count(*) FROM tab_upgraded2"); +is($result, qq(1), + "check the data is synced after enabling the subscription for the table that was in init state" +); + +done_testing(); diff --git a/src/bin/pg_upgrade/tablespace.c b/src/bin/pg_upgrade/tablespace.c index 69cef7fa6b95f..043e5e721bd34 100644 --- a/src/bin/pg_upgrade/tablespace.c +++ b/src/bin/pg_upgrade/tablespace.c @@ -3,7 +3,7 @@ * * tablespace functions * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/tablespace.c */ @@ -84,8 +84,8 @@ get_tablespace_paths(void) os_info.old_tablespaces[tblnum]); else report_status(PG_FATAL, - "could not stat tablespace directory \"%s\": %s", - os_info.old_tablespaces[tblnum], strerror(errno)); + "could not stat tablespace directory \"%s\": %m", + os_info.old_tablespaces[tblnum]); } if (!S_ISDIR(statBuf.st_mode)) report_status(PG_FATAL, diff --git a/src/bin/pg_upgrade/util.c b/src/bin/pg_upgrade/util.c index 21ba4c8f12b23..2478372992b74 100644 --- a/src/bin/pg_upgrade/util.c +++ b/src/bin/pg_upgrade/util.c @@ -3,7 +3,7 @@ * * utility functions * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/util.c */ diff --git a/src/bin/pg_upgrade/version.c b/src/bin/pg_upgrade/version.c index 403a6d7cfaaf3..2de6dffccdab4 100644 --- a/src/bin/pg_upgrade/version.c +++ b/src/bin/pg_upgrade/version.c @@ -3,242 +3,29 @@ * * Postgres-version-specific routines * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * src/bin/pg_upgrade/version.c */ #include "postgres_fe.h" -#include "catalog/pg_class_d.h" #include "fe_utils/string_utils.h" #include "pg_upgrade.h" - -/* - * check_for_data_types_usage() - * Detect whether there are any stored columns depending on given type(s) - * - * If so, write a report to the given file name, and return true. - * - * base_query should be a SELECT yielding a single column named "oid", - * containing the pg_type OIDs of one or more types that are known to have - * inconsistent on-disk representations across server versions. - * - * We check for the type(s) in tables, matviews, and indexes, but not views; - * there's no storage involved in a view. - */ -bool -check_for_data_types_usage(ClusterInfo *cluster, - const char *base_query, - const char *output_path) -{ - bool found = false; - FILE *script = NULL; - int dbnum; - - for (dbnum = 0; dbnum < cluster->dbarr.ndbs; dbnum++) - { - DbInfo *active_db = &cluster->dbarr.dbs[dbnum]; - PGconn *conn = connectToServer(cluster, active_db->db_name); - PQExpBufferData querybuf; - PGresult *res; - bool db_used = false; - int ntups; - int rowno; - int i_nspname, - i_relname, - i_attname; - - /* - * The type(s) of interest might be wrapped in a domain, array, - * composite, or range, and these container types can be nested (to - * varying extents depending on server version, but that's not of - * concern here). To handle all these cases we need a recursive CTE. - */ - initPQExpBuffer(&querybuf); - appendPQExpBuffer(&querybuf, - "WITH RECURSIVE oids AS ( " - /* start with the type(s) returned by base_query */ - " %s " - " UNION ALL " - " SELECT * FROM ( " - /* inner WITH because we can only reference the CTE once */ - " WITH x AS (SELECT oid FROM oids) " - /* domains on any type selected so far */ - " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typbasetype = x.oid AND typtype = 'd' " - " UNION ALL " - /* arrays over any type selected so far */ - " SELECT t.oid FROM pg_catalog.pg_type t, x WHERE typelem = x.oid AND typtype = 'b' " - " UNION ALL " - /* composite types containing any type selected so far */ - " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_class c, pg_catalog.pg_attribute a, x " - " WHERE t.typtype = 'c' AND " - " t.oid = c.reltype AND " - " c.oid = a.attrelid AND " - " NOT a.attisdropped AND " - " a.atttypid = x.oid " - " UNION ALL " - /* ranges containing any type selected so far */ - " SELECT t.oid FROM pg_catalog.pg_type t, pg_catalog.pg_range r, x " - " WHERE t.typtype = 'r' AND r.rngtypid = t.oid AND r.rngsubtype = x.oid" - " ) foo " - ") " - /* now look for stored columns of any such type */ - "SELECT n.nspname, c.relname, a.attname " - "FROM pg_catalog.pg_class c, " - " pg_catalog.pg_namespace n, " - " pg_catalog.pg_attribute a " - "WHERE c.oid = a.attrelid AND " - " NOT a.attisdropped AND " - " a.atttypid IN (SELECT oid FROM oids) AND " - " c.relkind IN (" - CppAsString2(RELKIND_RELATION) ", " - CppAsString2(RELKIND_MATVIEW) ", " - CppAsString2(RELKIND_INDEX) ") AND " - " c.relnamespace = n.oid AND " - /* exclude possible orphaned temp tables */ - " n.nspname !~ '^pg_temp_' AND " - " n.nspname !~ '^pg_toast_temp_' AND " - /* exclude system catalogs, too */ - " n.nspname NOT IN ('pg_catalog', 'information_schema')", - base_query); - - res = executeQueryOrDie(conn, "%s", querybuf.data); - - ntups = PQntuples(res); - i_nspname = PQfnumber(res, "nspname"); - i_relname = PQfnumber(res, "relname"); - i_attname = PQfnumber(res, "attname"); - for (rowno = 0; rowno < ntups; rowno++) - { - found = true; - if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) - pg_fatal("could not open file \"%s\": %s", output_path, - strerror(errno)); - if (!db_used) - { - fprintf(script, "In database: %s\n", active_db->db_name); - db_used = true; - } - fprintf(script, " %s.%s.%s\n", - PQgetvalue(res, rowno, i_nspname), - PQgetvalue(res, rowno, i_relname), - PQgetvalue(res, rowno, i_attname)); - } - - PQclear(res); - - termPQExpBuffer(&querybuf); - - PQfinish(conn); - } - - if (script) - fclose(script); - - return found; -} - /* - * check_for_data_type_usage() - * Detect whether there are any stored columns depending on the given type - * - * If so, write a report to the given file name, and return true. - * - * type_name should be a fully qualified type name. This is just a - * trivial wrapper around check_for_data_types_usage() to convert a - * type name into a base query. + * version_hook functions for check_for_data_types_usage in order to determine + * whether a data type check should be executed for the cluster in question or + * not. */ bool -check_for_data_type_usage(ClusterInfo *cluster, - const char *type_name, - const char *output_path) -{ - bool found; - char *base_query; - - base_query = psprintf("SELECT '%s'::pg_catalog.regtype AS oid", - type_name); - - found = check_for_data_types_usage(cluster, base_query, output_path); - - free(base_query); - - return found; -} - - -/* - * old_9_3_check_for_line_data_type_usage() - * 9.3 -> 9.4 - * Fully implement the 'line' data type in 9.4, which previously returned - * "not enabled" by default and was only functionally enabled with a - * compile-time switch; as of 9.4 "line" has a different on-disk - * representation format. - */ -void -old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster) -{ - char output_path[MAXPGPATH]; - - prep_status("Checking for incompatible \"line\" data type"); - - snprintf(output_path, sizeof(output_path), "%s/%s", - log_opts.basedir, - "tables_using_line.txt"); - - if (check_for_data_type_usage(cluster, "pg_catalog.line", output_path)) - { - pg_log(PG_REPORT, "fatal"); - pg_fatal("Your installation contains the \"line\" data type in user tables.\n" - "This data type changed its internal and input/output format\n" - "between your old and new versions so this\n" - "cluster cannot currently be upgraded. You can\n" - "drop the problem columns and restart the upgrade.\n" - "A list of the problem columns is in the file:\n" - " %s", output_path); - } - else - check_ok(); -} - - -/* - * old_9_6_check_for_unknown_data_type_usage() - * 9.6 -> 10 - * It's no longer allowed to create tables or views with "unknown"-type - * columns. We do not complain about views with such columns, because - * they should get silently converted to "text" columns during the DDL - * dump and reload; it seems unlikely to be worth making users do that - * by hand. However, if there's a table with such a column, the DDL - * reload will fail, so we should pre-detect that rather than failing - * mid-upgrade. Worse, if there's a matview with such a column, the - * DDL reload will silently change it to "text" which won't match the - * on-disk storage (which is like "cstring"). So we *must* reject that. - */ -void -old_9_6_check_for_unknown_data_type_usage(ClusterInfo *cluster) +jsonb_9_4_check_applicable(ClusterInfo *cluster) { - char output_path[MAXPGPATH]; - - prep_status("Checking for invalid \"unknown\" user columns"); - - snprintf(output_path, sizeof(output_path), "%s/%s", - log_opts.basedir, - "tables_using_unknown.txt"); + /* JSONB changed its storage format during 9.4 beta */ + if (GET_MAJOR_VERSION(cluster->major_version) == 904 && + cluster->controldata.cat_ver < JSONB_FORMAT_CHANGE_CAT_VER) + return true; - if (check_for_data_type_usage(cluster, "pg_catalog.unknown", output_path)) - { - pg_log(PG_REPORT, "fatal"); - pg_fatal("Your installation contains the \"unknown\" data type in user tables.\n" - "This data type is no longer allowed in tables, so this\n" - "cluster cannot currently be upgraded. You can\n" - "drop the problem columns and restart the upgrade.\n" - "A list of the problem columns is in the file:\n" - " %s", output_path); - } - else - check_ok(); + return false; } /* @@ -289,8 +76,7 @@ old_9_6_invalidate_hash_indexes(ClusterInfo *cluster, bool check_mode) if (!check_mode) { if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) - pg_fatal("could not open file \"%s\": %s", output_path, - strerror(errno)); + pg_fatal("could not open file \"%s\": %m", output_path); if (!db_used) { PQExpBufferData connectbuf; @@ -353,41 +139,6 @@ old_9_6_invalidate_hash_indexes(ClusterInfo *cluster, bool check_mode) check_ok(); } -/* - * old_11_check_for_sql_identifier_data_type_usage() - * 11 -> 12 - * In 12, the sql_identifier data type was switched from name to varchar, - * which does affect the storage (name is by-ref, but not varlena). This - * means user tables using sql_identifier for columns are broken because - * the on-disk format is different. - */ -void -old_11_check_for_sql_identifier_data_type_usage(ClusterInfo *cluster) -{ - char output_path[MAXPGPATH]; - - prep_status("Checking for invalid \"sql_identifier\" user columns"); - - snprintf(output_path, sizeof(output_path), "%s/%s", - log_opts.basedir, - "tables_using_sql_identifier.txt"); - - if (check_for_data_type_usage(cluster, "information_schema.sql_identifier", - output_path)) - { - pg_log(PG_REPORT, "fatal"); - pg_fatal("Your installation contains the \"sql_identifier\" data type in user tables.\n" - "The on-disk format for this data type has changed, so this\n" - "cluster cannot currently be upgraded. You can\n" - "drop the problem columns and restart the upgrade.\n" - "A list of the problem columns is in the file:\n" - " %s", output_path); - } - else - check_ok(); -} - - /* * report_extension_updates() * Report extensions that should be updated. @@ -423,8 +174,7 @@ report_extension_updates(ClusterInfo *cluster) for (rowno = 0; rowno < ntups; rowno++) { if (script == NULL && (script = fopen_priv(output_path, "w")) == NULL) - pg_fatal("could not open file \"%s\": %s", output_path, - strerror(errno)); + pg_fatal("could not open file \"%s\": %m", output_path); if (!db_used) { PQExpBufferData connectbuf; diff --git a/src/bin/pg_verifybackup/Makefile b/src/bin/pg_verifybackup/Makefile index 596df15118b61..7c045f142e8d7 100644 --- a/src/bin/pg_verifybackup/Makefile +++ b/src/bin/pg_verifybackup/Makefile @@ -21,7 +21,6 @@ LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) OBJS = \ $(WIN32RES) \ - parse_manifest.o \ pg_verifybackup.o all: pg_verifybackup @@ -38,7 +37,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_verifybackup$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_verifybackup$(X) $(OBJS) rm -rf tmp_check diff --git a/src/bin/pg_verifybackup/meson.build b/src/bin/pg_verifybackup/meson.build index 9369da1bc65ca..7c7d31a0350a3 100644 --- a/src/bin/pg_verifybackup/meson.build +++ b/src/bin/pg_verifybackup/meson.build @@ -1,7 +1,6 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_verifybackup_sources = files( - 'parse_manifest.c', 'pg_verifybackup.c' ) @@ -23,8 +22,8 @@ tests += { 'sd': meson.current_source_dir(), 'bd': meson.current_build_dir(), 'tap': { - 'env': {'GZIP_PROGRAM': gzip.path(), - 'TAR': tar.path(), + 'env': {'GZIP_PROGRAM': gzip.found() ? gzip.path() : '', + 'TAR': tar.found() ? tar.path() : '', 'LZ4': program_lz4.found() ? program_lz4.path() : '', 'ZSTD': program_zstd.found() ? program_zstd.path() : ''}, 'tests': [ diff --git a/src/bin/pg_verifybackup/nls.mk b/src/bin/pg_verifybackup/nls.mk index eba73a2c0586e..6ad078350f607 100644 --- a/src/bin/pg_verifybackup/nls.mk +++ b/src/bin/pg_verifybackup/nls.mk @@ -1,16 +1,21 @@ # src/bin/pg_verifybackup/nls.mk CATALOG_NAME = pg_verifybackup GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ - parse_manifest.c \ pg_verifybackup.c \ + ../../common/controldata_utils.c \ + ../../common/cryptohash.c \ + ../../common/cryptohash_openssl.c \ ../../common/fe_memutils.c \ - ../../common/jsonapi.c + ../../common/jsonapi.c \ + ../../common/parse_manifest.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \ + json_token_error:2 \ json_manifest_parse_failure:2 \ error_cb:2 \ report_backup_error:2 \ report_fatal_error GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \ + json_token_error:2:c-format \ error_cb:2:c-format \ report_backup_error:2:c-format \ report_fatal_error:1:c-format diff --git a/src/bin/pg_verifybackup/parse_manifest.h b/src/bin/pg_verifybackup/parse_manifest.h deleted file mode 100644 index 7387a917a2196..0000000000000 --- a/src/bin/pg_verifybackup/parse_manifest.h +++ /dev/null @@ -1,46 +0,0 @@ -/*------------------------------------------------------------------------- - * - * parse_manifest.h - * Parse a backup manifest in JSON format. - * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * src/bin/pg_verifybackup/parse_manifest.h - * - *------------------------------------------------------------------------- - */ - -#ifndef PARSE_MANIFEST_H -#define PARSE_MANIFEST_H - -#include "access/xlogdefs.h" -#include "common/checksum_helper.h" -#include "mb/pg_wchar.h" - -struct JsonManifestParseContext; -typedef struct JsonManifestParseContext JsonManifestParseContext; - -typedef void (*json_manifest_perfile_callback) (JsonManifestParseContext *, - char *pathname, - size_t size, pg_checksum_type checksum_type, - int checksum_length, uint8 *checksum_payload); -typedef void (*json_manifest_perwalrange_callback) (JsonManifestParseContext *, - TimeLineID tli, - XLogRecPtr start_lsn, XLogRecPtr end_lsn); -typedef void (*json_manifest_error_callback) (JsonManifestParseContext *, - const char *fmt,...) pg_attribute_printf(2, 3) - pg_attribute_noreturn(); - -struct JsonManifestParseContext -{ - void *private_data; - json_manifest_perfile_callback perfile_cb; - json_manifest_perwalrange_callback perwalrange_cb; - json_manifest_error_callback error_cb; -}; - -extern void json_parse_manifest(JsonManifestParseContext *context, - char *buffer, size_t size); - -#endif diff --git a/src/bin/pg_verifybackup/pg_verifybackup.c b/src/bin/pg_verifybackup/pg_verifybackup.c index 059836f0e647e..d77e70fbe3874 100644 --- a/src/bin/pg_verifybackup/pg_verifybackup.c +++ b/src/bin/pg_verifybackup/pg_verifybackup.c @@ -3,7 +3,7 @@ * pg_verifybackup.c * Verify a backup against a backup manifest. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/pg_verifybackup/pg_verifybackup.c @@ -18,11 +18,12 @@ #include #include -#include "common/hashfn.h" +#include "common/controldata_utils.h" +#include "common/hashfn_unstable.h" #include "common/logging.h" +#include "common/parse_manifest.h" #include "fe_utils/simple_list.h" #include "getopt_long.h" -#include "parse_manifest.h" #include "pgtime.h" /* @@ -42,7 +43,7 @@ /* * How many bytes should we try to read from a file at once? */ -#define READ_CHUNK_SIZE 4096 +#define READ_CHUNK_SIZE (128 * 1024) /* * Each file described by the manifest file is parsed to produce an object @@ -51,7 +52,7 @@ typedef struct manifest_file { uint32 status; /* hash status */ - char *pathname; + const char *pathname; size_t size; pg_checksum_type checksum_type; int checksum_length; @@ -67,12 +68,11 @@ typedef struct manifest_file * Define a hash table which we can use to store information about the files * mentioned in the backup manifest. */ -static uint32 hash_string_pointer(char *s); #define SH_PREFIX manifest_files #define SH_ELEMENT_TYPE manifest_file -#define SH_KEY_TYPE char * +#define SH_KEY_TYPE const char * #define SH_KEY pathname -#define SH_HASH_KEY(tb, key) hash_string_pointer(key) +#define SH_HASH_KEY(tb, key) hash_string(key) #define SH_EQUAL(tb, a, b) (strcmp(a, b) == 0) #define SH_SCOPE static inline #define SH_RAW_ALLOCATOR pg_malloc0 @@ -94,40 +94,43 @@ typedef struct manifest_wal_range } manifest_wal_range; /* - * Details we need in callbacks that occur while parsing a backup manifest. + * All the data parsed from a backup_manifest file. */ -typedef struct parser_context +typedef struct manifest_data { - manifest_files_hash *ht; + int version; + uint64 system_identifier; + manifest_files_hash *files; manifest_wal_range *first_wal_range; manifest_wal_range *last_wal_range; -} parser_context; +} manifest_data; /* * All of the context information we need while checking a backup manifest. */ typedef struct verifier_context { - manifest_files_hash *ht; + manifest_data *manifest; char *backup_directory; SimpleStringList ignore_list; bool exit_on_error; bool saw_any_error; } verifier_context; -static void parse_manifest_file(char *manifest_path, - manifest_files_hash **ht_p, - manifest_wal_range **first_wal_range_p); - -static void record_manifest_details_for_file(JsonManifestParseContext *context, - char *pathname, size_t size, - pg_checksum_type checksum_type, - int checksum_length, - uint8 *checksum_payload); -static void record_manifest_details_for_wal_range(JsonManifestParseContext *context, - TimeLineID tli, - XLogRecPtr start_lsn, - XLogRecPtr end_lsn); +static manifest_data *parse_manifest_file(char *manifest_path); +static void verifybackup_version_cb(JsonManifestParseContext *context, + int manifest_version); +static void verifybackup_system_identifier(JsonManifestParseContext *context, + uint64 manifest_system_identifier); +static void verifybackup_per_file_cb(JsonManifestParseContext *context, + const char *pathname, size_t size, + pg_checksum_type checksum_type, + int checksum_length, + uint8 *checksum_payload); +static void verifybackup_per_wal_range_cb(JsonManifestParseContext *context, + TimeLineID tli, + XLogRecPtr start_lsn, + XLogRecPtr end_lsn); static void report_manifest_error(JsonManifestParseContext *context, const char *fmt,...) pg_attribute_printf(2, 3) pg_attribute_noreturn(); @@ -136,21 +139,23 @@ static void verify_backup_directory(verifier_context *context, char *relpath, char *fullpath); static void verify_backup_file(verifier_context *context, char *relpath, char *fullpath); +static void verify_control_file(const char *controlpath, + uint64 manifest_system_identifier); static void report_extra_backup_files(verifier_context *context); static void verify_backup_checksums(verifier_context *context); static void verify_file_checksum(verifier_context *context, - manifest_file *m, char *fullpath); + manifest_file *m, char *fullpath, + uint8 *buffer); static void parse_required_wal(verifier_context *context, char *pg_waldump_path, - char *wal_directory, - manifest_wal_range *first_wal_range); + char *wal_directory); static void report_backup_error(verifier_context *context, const char *pg_restrict fmt,...) pg_attribute_printf(2, 3); static void report_fatal_error(const char *pg_restrict fmt,...) pg_attribute_printf(1, 2) pg_attribute_noreturn(); -static bool should_ignore_relpath(verifier_context *context, char *relpath); +static bool should_ignore_relpath(verifier_context *context, const char *relpath); static void progress_report(bool finished); static void usage(void); @@ -185,7 +190,6 @@ main(int argc, char **argv) int c; verifier_context context; - manifest_wal_range *first_wal_range; char *manifest_path = NULL; bool no_parse_wal = false; bool quiet = false; @@ -338,7 +342,7 @@ main(int argc, char **argv) * the manifest as fatal; there doesn't seem to be much point in trying to * verify the backup directory against a corrupted manifest. */ - parse_manifest_file(manifest_path, &context.ht, &first_wal_range); + context.manifest = parse_manifest_file(manifest_path); /* * Now scan the files in the backup directory. At this stage, we verify @@ -367,8 +371,7 @@ main(int argc, char **argv) * not to do so. */ if (!no_parse_wal) - parse_required_wal(&context, pg_waldump_path, - wal_directory, first_wal_range); + parse_required_wal(&context, pg_waldump_path, wal_directory); /* * If everything looks OK, tell the user this, unless we were asked to @@ -381,13 +384,10 @@ main(int argc, char **argv) } /* - * Parse a manifest file. Construct a hash table with information about - * all the files it mentions, and a linked list of all the WAL ranges it - * mentions. + * Parse a manifest file and return a data structure describing the contents. */ -static void -parse_manifest_file(char *manifest_path, manifest_files_hash **ht_p, - manifest_wal_range **first_wal_range_p) +static manifest_data * +parse_manifest_file(char *manifest_path) { int fd; struct stat statbuf; @@ -396,8 +396,10 @@ parse_manifest_file(char *manifest_path, manifest_files_hash **ht_p, manifest_files_hash *ht; char *buffer; int rc; - parser_context private_context; JsonManifestParseContext context; + manifest_data *result; + + int chunk_size = READ_CHUNK_SIZE; /* Open the manifest file. */ if ((fd = open(manifest_path, O_RDONLY | PG_BINARY, 0)) < 0) @@ -414,43 +416,85 @@ parse_manifest_file(char *manifest_path, manifest_files_hash **ht_p, /* Create the hash table. */ ht = manifest_files_create(initial_size, NULL); + result = pg_malloc0(sizeof(manifest_data)); + result->files = ht; + context.private_data = result; + context.version_cb = verifybackup_version_cb; + context.system_identifier_cb = verifybackup_system_identifier; + context.per_file_cb = verifybackup_per_file_cb; + context.per_wal_range_cb = verifybackup_per_wal_range_cb; + context.error_cb = report_manifest_error; + /* - * Slurp in the whole file. - * - * This is not ideal, but there's currently no easy way to get - * pg_parse_json() to perform incremental parsing. + * Parse the file, in chunks if necessary. */ - buffer = pg_malloc(statbuf.st_size); - rc = read(fd, buffer, statbuf.st_size); - if (rc != statbuf.st_size) + if (statbuf.st_size <= chunk_size) { - if (rc < 0) - report_fatal_error("could not read file \"%s\": %m", - manifest_path); - else - report_fatal_error("could not read file \"%s\": read %d of %lld", - manifest_path, rc, (long long int) statbuf.st_size); + buffer = pg_malloc(statbuf.st_size); + rc = read(fd, buffer, statbuf.st_size); + if (rc != statbuf.st_size) + { + if (rc < 0) + pg_fatal("could not read file \"%s\": %m", manifest_path); + else + pg_fatal("could not read file \"%s\": read %d of %lld", + manifest_path, rc, (long long int) statbuf.st_size); + } + + /* Close the manifest file. */ + close(fd); + + /* Parse the manifest. */ + json_parse_manifest(&context, buffer, statbuf.st_size); } + else + { + int bytes_left = statbuf.st_size; + JsonManifestParseIncrementalState *inc_state; - /* Close the manifest file. */ - close(fd); + inc_state = json_parse_manifest_incremental_init(&context); - /* Parse the manifest. */ - private_context.ht = ht; - private_context.first_wal_range = NULL; - private_context.last_wal_range = NULL; - context.private_data = &private_context; - context.perfile_cb = record_manifest_details_for_file; - context.perwalrange_cb = record_manifest_details_for_wal_range; - context.error_cb = report_manifest_error; - json_parse_manifest(&context, buffer, statbuf.st_size); + buffer = pg_malloc(chunk_size + 1); + + while (bytes_left > 0) + { + int bytes_to_read = chunk_size; + + /* + * Make sure that the last chunk is sufficiently large. (i.e. at + * least half the chunk size) so that it will contain fully the + * piece at the end with the checksum. + */ + if (bytes_left < chunk_size) + bytes_to_read = bytes_left; + else if (bytes_left < 2 * chunk_size) + bytes_to_read = bytes_left / 2; + rc = read(fd, buffer, bytes_to_read); + if (rc != bytes_to_read) + { + if (rc < 0) + pg_fatal("could not read file \"%s\": %m", manifest_path); + else + pg_fatal("could not read file \"%s\": read %lld of %lld", + manifest_path, + (long long int) (statbuf.st_size + rc - bytes_left), + (long long int) statbuf.st_size); + } + bytes_left -= rc; + json_parse_manifest_incremental_chunk(inc_state, buffer, rc, + bytes_left == 0); + } + + /* Release the incremental state memory */ + json_parse_manifest_incremental_shutdown(inc_state); + + close(fd); + } /* Done with the buffer. */ pfree(buffer); - /* Return the file hash table and WAL range list we constructed. */ - *ht_p = ht; - *first_wal_range_p = private_context.first_wal_range; + return result; } /* @@ -471,17 +515,43 @@ report_manifest_error(JsonManifestParseContext *context, const char *fmt,...) exit(1); } +/* + * Record details extracted from the backup manifest. + */ +static void +verifybackup_version_cb(JsonManifestParseContext *context, + int manifest_version) +{ + manifest_data *manifest = context->private_data; + + /* Validation will be at the later stage */ + manifest->version = manifest_version; +} + +/* + * Record details extracted from the backup manifest. + */ +static void +verifybackup_system_identifier(JsonManifestParseContext *context, + uint64 manifest_system_identifier) +{ + manifest_data *manifest = context->private_data; + + /* Validation will be at the later stage */ + manifest->system_identifier = manifest_system_identifier; +} + /* * Record details extracted from the backup manifest for one file. */ static void -record_manifest_details_for_file(JsonManifestParseContext *context, - char *pathname, size_t size, - pg_checksum_type checksum_type, - int checksum_length, uint8 *checksum_payload) +verifybackup_per_file_cb(JsonManifestParseContext *context, + const char *pathname, size_t size, + pg_checksum_type checksum_type, + int checksum_length, uint8 *checksum_payload) { - parser_context *pcxt = context->private_data; - manifest_files_hash *ht = pcxt->ht; + manifest_data *manifest = context->private_data; + manifest_files_hash *ht = manifest->files; manifest_file *m; bool found; @@ -504,11 +574,11 @@ record_manifest_details_for_file(JsonManifestParseContext *context, * Record details extracted from the backup manifest for one WAL range. */ static void -record_manifest_details_for_wal_range(JsonManifestParseContext *context, - TimeLineID tli, - XLogRecPtr start_lsn, XLogRecPtr end_lsn) +verifybackup_per_wal_range_cb(JsonManifestParseContext *context, + TimeLineID tli, + XLogRecPtr start_lsn, XLogRecPtr end_lsn) { - parser_context *pcxt = context->private_data; + manifest_data *manifest = context->private_data; manifest_wal_range *range; /* Allocate and initialize a struct describing this WAL range. */ @@ -516,15 +586,15 @@ record_manifest_details_for_wal_range(JsonManifestParseContext *context, range->tli = tli; range->start_lsn = start_lsn; range->end_lsn = end_lsn; - range->prev = pcxt->last_wal_range; + range->prev = manifest->last_wal_range; range->next = NULL; /* Add it to the end of the list. */ - if (pcxt->first_wal_range == NULL) - pcxt->first_wal_range = range; + if (manifest->first_wal_range == NULL) + manifest->first_wal_range = range; else - pcxt->last_wal_range->next = range; - pcxt->last_wal_range = range; + manifest->last_wal_range->next = range; + manifest->last_wal_range = range; } /* @@ -639,7 +709,7 @@ verify_backup_file(verifier_context *context, char *relpath, char *fullpath) } /* Check whether there's an entry in the manifest hash. */ - m = manifest_files_lookup(context->ht, relpath); + m = manifest_files_lookup(context->manifest->files, relpath); if (m == NULL) { report_backup_error(context, @@ -660,6 +730,14 @@ verify_backup_file(verifier_context *context, char *relpath, char *fullpath) m->bad = true; } + /* + * Validate the manifest system identifier, not available in manifest + * version 1. + */ + if (context->manifest->version != 1 && + strcmp(relpath, "global/pg_control") == 0) + verify_control_file(fullpath, context->manifest->system_identifier); + /* Update statistics for progress report, if necessary */ if (show_progress && !skip_checksums && should_verify_checksum(m)) total_size += m->size; @@ -672,6 +750,39 @@ verify_backup_file(verifier_context *context, char *relpath, char *fullpath) */ } +/* + * Sanity check control file and validate system identifier against manifest + * system identifier. + */ +static void +verify_control_file(const char *controlpath, uint64 manifest_system_identifier) +{ + ControlFileData *control_file; + bool crc_ok; + + pg_log_debug("reading \"%s\"", controlpath); + control_file = get_controlfile_by_exact_path(controlpath, &crc_ok); + + /* Control file contents not meaningful if CRC is bad. */ + if (!crc_ok) + report_fatal_error("%s: CRC is incorrect", controlpath); + + /* Can't interpret control file if not current version. */ + if (control_file->pg_control_version != PG_CONTROL_VERSION) + report_fatal_error("%s: unexpected control file version", + controlpath); + + /* System identifiers should match. */ + if (manifest_system_identifier != control_file->system_identifier) + report_fatal_error("%s: manifest system identifier is %llu, but control file has %llu", + controlpath, + (unsigned long long) manifest_system_identifier, + (unsigned long long) control_file->system_identifier); + + /* Release memory. */ + pfree(control_file); +} + /* * Scan the hash table for entries where the 'matched' flag is not set; report * that such files are present in the manifest but not on disk. @@ -679,11 +790,12 @@ verify_backup_file(verifier_context *context, char *relpath, char *fullpath) static void report_extra_backup_files(verifier_context *context) { + manifest_data *manifest = context->manifest; manifest_files_iterator it; manifest_file *m; - manifest_files_start_iterate(context->ht, &it); - while ((m = manifest_files_iterate(context->ht, &it)) != NULL) + manifest_files_start_iterate(manifest->files, &it); + while ((m = manifest_files_iterate(manifest->files, &it)) != NULL) if (!m->matched && !should_ignore_relpath(context, m->pathname)) report_backup_error(context, "\"%s\" is present in the manifest but not on disk", @@ -698,13 +810,17 @@ report_extra_backup_files(verifier_context *context) static void verify_backup_checksums(verifier_context *context) { + manifest_data *manifest = context->manifest; manifest_files_iterator it; manifest_file *m; + uint8 *buffer; progress_report(false); - manifest_files_start_iterate(context->ht, &it); - while ((m = manifest_files_iterate(context->ht, &it)) != NULL) + buffer = pg_malloc(READ_CHUNK_SIZE * sizeof(uint8)); + + manifest_files_start_iterate(manifest->files, &it); + while ((m = manifest_files_iterate(manifest->files, &it)) != NULL) { if (should_verify_checksum(m) && !should_ignore_relpath(context, m->pathname)) @@ -716,13 +832,15 @@ verify_backup_checksums(verifier_context *context) m->pathname); /* Do the actual checksum verification. */ - verify_file_checksum(context, m, fullpath); + verify_file_checksum(context, m, fullpath, buffer); /* Avoid leaking memory. */ pfree(fullpath); } } + pfree(buffer); + progress_report(true); } @@ -731,14 +849,13 @@ verify_backup_checksums(verifier_context *context) */ static void verify_file_checksum(verifier_context *context, manifest_file *m, - char *fullpath) + char *fullpath, uint8 *buffer) { pg_checksum_context checksum_ctx; - char *relpath = m->pathname; + const char *relpath = m->pathname; int fd; int rc; size_t bytes_read = 0; - uint8 buffer[READ_CHUNK_SIZE]; uint8 checksumbuf[PG_CHECKSUM_MAX_LENGTH]; int checksumlen; @@ -833,9 +950,10 @@ verify_file_checksum(verifier_context *context, manifest_file *m, */ static void parse_required_wal(verifier_context *context, char *pg_waldump_path, - char *wal_directory, manifest_wal_range *first_wal_range) + char *wal_directory) { - manifest_wal_range *this_wal_range = first_wal_range; + manifest_data *manifest = context->manifest; + manifest_wal_range *this_wal_range = manifest->first_wal_range; while (this_wal_range != NULL) { @@ -898,13 +1016,13 @@ report_fatal_error(const char *pg_restrict fmt,...) * "aa/bb" is not a prefix of "aa/bbb", but it is a prefix of "aa/bb/cc". */ static bool -should_ignore_relpath(verifier_context *context, char *relpath) +should_ignore_relpath(verifier_context *context, const char *relpath) { SimpleStringListCell *cell; for (cell = context->ignore_list.head; cell != NULL; cell = cell->next) { - char *r = relpath; + const char *r = relpath; char *v = cell->val; while (*v != '\0' && *r == *v) @@ -917,17 +1035,6 @@ should_ignore_relpath(verifier_context *context, char *relpath) return false; } -/* - * Helper function for manifest_files hash table. - */ -static uint32 -hash_string_pointer(char *s) -{ - unsigned char *ss = (unsigned char *) s; - - return hash_bytes(ss, strlen(s)); -} - /* * Print a progress report based on the global variables. * diff --git a/src/bin/pg_verifybackup/po/LINGUAS b/src/bin/pg_verifybackup/po/LINGUAS index 47313d2f11f09..2358abbf78cb7 100644 --- a/src/bin/pg_verifybackup/po/LINGUAS +++ b/src/bin/pg_verifybackup/po/LINGUAS @@ -1 +1 @@ -de el es fr it ja ka ko ru sv uk zh_CN +de el es fr it ja ka ko ru sv uk zh_CN zh_TW diff --git a/src/bin/pg_verifybackup/po/de.po b/src/bin/pg_verifybackup/po/de.po index a7a366cf4ddf4..f298b9f978f64 100644 --- a/src/bin/pg_verifybackup/po/de.po +++ b/src/bin/pg_verifybackup/po/de.po @@ -1,13 +1,13 @@ # German message translation file for pg_verifybackup -# Copyright (C) 2020-2023 PostgreSQL Global Development Group +# Copyright (C) 2020-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: pg_verifybackup (PostgreSQL) 16\n" +"Project-Id-Version: pg_verifybackup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-26 12:47+0000\n" -"PO-Revision-Date: 2023-04-26 15:04+0200\n" +"POT-Creation-Date: 2024-08-29 13:18+0000\n" +"PO-Revision-Date: 2024-08-29 16:47+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -35,6 +35,81 @@ msgstr "Detail: " msgid "hint: " msgstr "Tipp: " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %m" + +#: ../../common/controldata_utils.c:110 pg_verifybackup.c:438 +#: pg_verifybackup.c:476 pg_verifybackup.c:896 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "konnte Datei »%s« nicht lesen: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: pg_verifybackup.c:902 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schließen: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "falsche Byte-Reihenfolge" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"möglicherweise falsche Byte-Reihenfolge\n" +"Die Byte-Reihenfolge, die zur Speicherung der Datei pg_control verwendet wurde,\n" +"stimmt möglicherweise nicht mit der von diesem Programm verwendeten überein. In\n" +"diesem Fall wären die Ergebnisse unten falsch und die PostgreSQL-Installation\n" +"wäre inkompatibel mit diesem Datenverzeichnis." + +#: ../../common/controldata_utils.c:230 pg_verifybackup.c:406 +#: pg_verifybackup.c:865 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "konnte Datei »%s« nicht öffnen: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "konnte Datei »%s« nicht schreiben: %m" + +#: ../../common/controldata_utils.c:268 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "konnte Datei »%s« nicht fsyncen: %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:853 +#, c-format +msgid "out of memory" +msgstr "Speicher aufgebraucht" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "Erfolg" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "Zielpuffer ist zu klein" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "OpenSSL-Fehler" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format @@ -46,389 +121,405 @@ msgstr "Speicher aufgebraucht\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" -#: ../../common/jsonapi.c:1144 +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "Parser mit rekursivem Abstieg kann inkrementellen Lexer nicht benutzen." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "Inkrementeller Parser benötigt inkrementellen Lexer." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON zu tief geschachtelt, maximale erlaubte Tiefe ist 6400." + +#: ../../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "Escape-Sequenz »\\%s« ist nicht gültig." +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "Escape-Sequenz »\\%.*s« ist nicht gültig." -#: ../../common/jsonapi.c:1147 +#: ../../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Zeichen mit Wert 0x%02x muss escapt werden." -#: ../../common/jsonapi.c:1150 +#: ../../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "Ende der Eingabe erwartet, aber »%s« gefunden." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "Ende der Eingabe erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:1153 +#: ../../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "Array-Element oder »]« erwartet, aber »%s« gefunden." +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "Array-Element oder »]« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:1156 +#: ../../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "»,« oder »]« erwartet, aber »%s« gefunden." +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "»,« oder »]« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:1159 +#: ../../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "»:« erwartet, aber »%s« gefunden." +msgid "Expected \":\", but found \"%.*s\"." +msgstr "»:« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:1162 +#: ../../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "JSON-Wert erwartet, aber »%s« gefunden." +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "JSON-Wert erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:1165 +#: ../../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "Die Eingabezeichenkette endete unerwartet." -#: ../../common/jsonapi.c:1167 +#: ../../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "Zeichenkette oder »}« erwartet, aber »%s« gefunden." +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "Zeichenkette oder »}« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:1170 +#: ../../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "»,« oder »}« erwartet, aber »%s« gefunden." +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "»,« oder »}« erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:1173 +#: ../../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "Zeichenkette erwartet, aber »%s« gefunden." +msgid "Expected string, but found \"%.*s\"." +msgstr "Zeichenkette erwartet, aber »%.*s« gefunden." -#: ../../common/jsonapi.c:1176 +#: ../../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "Token »%s« ist ungültig." +msgid "Token \"%.*s\" is invalid." +msgstr "Token »%.*s« ist ungültig." -#: ../../common/jsonapi.c:1179 +#: ../../common/jsonapi.c:2164 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kann nicht in »text« umgewandelt werden." -#: ../../common/jsonapi.c:1181 +#: ../../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "Nach »\\u« müssen vier Hexadezimalziffern folgen." -#: ../../common/jsonapi.c:1184 +#: ../../common/jsonapi.c:2169 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Unicode-Escape-Werte können nicht für Code-Punkt-Werte über 007F verwendet werden, wenn die Kodierung nicht UTF8 ist." -#: ../../common/jsonapi.c:1187 +#: ../../common/jsonapi.c:2178 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "Unicode-Escape-Wert konnte nicht in die Serverkodierung %s umgewandelt werden." -#: ../../common/jsonapi.c:1190 +#: ../../common/jsonapi.c:2185 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicode-High-Surrogate darf nicht auf ein High-Surrogate folgen." -#: ../../common/jsonapi.c:1192 +#: ../../common/jsonapi.c:2187 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicode-Low-Surrogate muss auf ein High-Surrogate folgen." -#: parse_manifest.c:150 -msgid "parsing failed" -msgstr "Parsen fehlgeschlagen" +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:855 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "konnte Prüfsumme des Manifests nicht initialisieren" -#: parse_manifest.c:152 +#: ../../common/parse_manifest.c:204 ../../common/parse_manifest.c:261 msgid "manifest ended unexpectedly" msgstr "Manifest endete unerwartet" -#: parse_manifest.c:191 +#: ../../common/parse_manifest.c:210 ../../common/parse_manifest.c:862 +#, c-format +msgid "could not update checksum of manifest" +msgstr "konnte Prüfsumme des Manifests nicht aktualisieren" + +#: ../../common/parse_manifest.c:302 msgid "unexpected object start" msgstr "unerwarteter Objektstart" -#: parse_manifest.c:226 +#: ../../common/parse_manifest.c:337 msgid "unexpected object end" msgstr "unerwartetes Objektende" -#: parse_manifest.c:255 +#: ../../common/parse_manifest.c:366 msgid "unexpected array start" msgstr "unerwarteter Array-Start" -#: parse_manifest.c:280 +#: ../../common/parse_manifest.c:391 msgid "unexpected array end" msgstr "unerwartetes Array-Ende" -#: parse_manifest.c:307 +#: ../../common/parse_manifest.c:418 msgid "expected version indicator" msgstr "unerwartete Versionskennzeichnung" -#: parse_manifest.c:336 +#: ../../common/parse_manifest.c:454 msgid "unrecognized top-level field" msgstr "unbekanntes Feld auf oberster Ebene" -#: parse_manifest.c:355 +#: ../../common/parse_manifest.c:473 msgid "unexpected file field" msgstr "unerwartetes Feld für Datei" -#: parse_manifest.c:369 +#: ../../common/parse_manifest.c:487 msgid "unexpected WAL range field" msgstr "unerwartetes Feld für WAL-Bereich" -#: parse_manifest.c:375 +#: ../../common/parse_manifest.c:493 msgid "unexpected object field" msgstr "unbekanntes Feld für Objekt" -#: parse_manifest.c:407 +#: ../../common/parse_manifest.c:583 +msgid "unexpected scalar" +msgstr "unerwarteter Skalar" + +#: ../../common/parse_manifest.c:609 +msgid "manifest version not an integer" +msgstr "Manifestversion ist keine ganze Zahl" + +#: ../../common/parse_manifest.c:613 msgid "unexpected manifest version" msgstr "unerwartete Manifestversion" -#: parse_manifest.c:458 -msgid "unexpected scalar" -msgstr "unerwarteter Skalar" +#: ../../common/parse_manifest.c:637 +msgid "system identifier in manifest not an integer" +msgstr "Systemidentifikator im Manifest ist keine ganze Zahl" -#: parse_manifest.c:484 +#: ../../common/parse_manifest.c:662 msgid "missing path name" msgstr "fehlender Pfadname" -#: parse_manifest.c:487 +#: ../../common/parse_manifest.c:665 msgid "both path name and encoded path name" msgstr "sowohl Pfadname als auch kodierter Pfadname angegeben" -#: parse_manifest.c:489 +#: ../../common/parse_manifest.c:667 msgid "missing size" msgstr "Größenangabe fehlt" -#: parse_manifest.c:492 +#: ../../common/parse_manifest.c:670 msgid "checksum without algorithm" msgstr "Prüfsumme ohne Algorithmus" -#: parse_manifest.c:506 +#: ../../common/parse_manifest.c:684 msgid "could not decode file name" msgstr "konnte Dateinamen nicht dekodieren" -#: parse_manifest.c:516 +#: ../../common/parse_manifest.c:694 msgid "file size is not an integer" msgstr "Dateigröße ist keine ganze Zahl" -#: parse_manifest.c:522 +#: ../../common/parse_manifest.c:700 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "unbekannter Prüfsummenalgorithmus: »%s«" -#: parse_manifest.c:541 +#: ../../common/parse_manifest.c:719 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "ungültige Prüfsumme für Datei »%s«: »%s«" -#: parse_manifest.c:584 +#: ../../common/parse_manifest.c:762 msgid "missing timeline" msgstr "Zeitleiste fehlt" -#: parse_manifest.c:586 +#: ../../common/parse_manifest.c:764 msgid "missing start LSN" msgstr "Start-LSN fehlt" -#: parse_manifest.c:588 +#: ../../common/parse_manifest.c:766 msgid "missing end LSN" msgstr "End-LSN fehlt" -#: parse_manifest.c:594 +#: ../../common/parse_manifest.c:772 msgid "timeline is not an integer" msgstr "Zeitleiste ist keine ganze Zahl" -#: parse_manifest.c:597 +#: ../../common/parse_manifest.c:775 msgid "could not parse start LSN" msgstr "konnte Start-LSN nicht parsen" -#: parse_manifest.c:600 +#: ../../common/parse_manifest.c:778 msgid "could not parse end LSN" msgstr "konnte End-LSN nicht parsen" -#: parse_manifest.c:661 +#: ../../common/parse_manifest.c:843 msgid "expected at least 2 lines" msgstr "mindestens 2 Zeilen erwartet" -#: parse_manifest.c:664 +#: ../../common/parse_manifest.c:846 msgid "last line not newline-terminated" msgstr "letzte Zeile nicht durch Newline abgeschlossen" -#: parse_manifest.c:669 -#, c-format -msgid "out of memory" -msgstr "Speicher aufgebraucht" - -#: parse_manifest.c:671 -#, c-format -msgid "could not initialize checksum of manifest" -msgstr "konnte Prüfsumme des Manifests nicht initialisieren" - -#: parse_manifest.c:673 -#, c-format -msgid "could not update checksum of manifest" -msgstr "konnte Prüfsumme des Manifests nicht aktualisieren" - -#: parse_manifest.c:676 +#: ../../common/parse_manifest.c:865 #, c-format msgid "could not finalize checksum of manifest" msgstr "konnte Prüfsumme des Manifests nicht abschließen" -#: parse_manifest.c:680 +#: ../../common/parse_manifest.c:869 #, c-format msgid "manifest has no checksum" msgstr "Manifest hat keine Prüfsumme" -#: parse_manifest.c:684 +#: ../../common/parse_manifest.c:873 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "ungültige Manifestprüfsumme: »%s«" -#: parse_manifest.c:688 +#: ../../common/parse_manifest.c:877 #, c-format msgid "manifest checksum mismatch" msgstr "Manifestprüfsumme stimmt nicht überein" -#: parse_manifest.c:703 +#: ../../common/parse_manifest.c:892 #, c-format msgid "could not parse backup manifest: %s" msgstr "konnte Backup-Manifest nicht parsen: %s" -#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293 +#: pg_verifybackup.c:277 pg_verifybackup.c:286 pg_verifybackup.c:297 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: pg_verifybackup.c:281 +#: pg_verifybackup.c:285 #, c-format msgid "no backup directory specified" msgstr "kein Backup-Verzeichnis angegeben" -#: pg_verifybackup.c:291 +#: pg_verifybackup.c:295 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_verifybackup.c:299 +#: pg_verifybackup.c:303 #, c-format msgid "cannot specify both %s and %s" msgstr "%s und %s können nicht beide angegeben werden" -#: pg_verifybackup.c:319 +#: pg_verifybackup.c:323 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "Programm »%s« wird von %s benötigt, aber wurde nicht im selben Verzeichnis wie »%s« gefunden" -#: pg_verifybackup.c:322 +#: pg_verifybackup.c:326 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "Programm »%s« wurde von »%s« gefunden, aber es hatte nicht die gleiche Version wie %s" -#: pg_verifybackup.c:378 +#: pg_verifybackup.c:381 #, c-format msgid "backup successfully verified\n" msgstr "Backup erfolgreich überprüft\n" -#: pg_verifybackup.c:404 pg_verifybackup.c:748 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "konnte Datei »%s« nicht öffnen: %m" - -#: pg_verifybackup.c:408 +#: pg_verifybackup.c:410 #, c-format msgid "could not stat file \"%s\": %m" msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" -#: pg_verifybackup.c:428 pg_verifybackup.c:779 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "konnte Datei »%s« nicht lesen: %m" - -#: pg_verifybackup.c:431 +#: pg_verifybackup.c:440 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "konnte Datei »%s« nicht lesen: %d von %lld gelesen" -#: pg_verifybackup.c:491 +#: pg_verifybackup.c:478 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "konnte Datei »%s« nicht lesen: %lld von %lld gelesen" + +#: pg_verifybackup.c:561 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "doppelter Pfadname im Backup-Manifest: »%s«" -#: pg_verifybackup.c:554 pg_verifybackup.c:561 +#: pg_verifybackup.c:624 pg_verifybackup.c:631 #, c-format msgid "could not open directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" -#: pg_verifybackup.c:593 +#: pg_verifybackup.c:663 #, c-format msgid "could not close directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht schließen: %m" -#: pg_verifybackup.c:613 +#: pg_verifybackup.c:683 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "konnte »stat« für Datei oder Verzeichnis »%s« nicht ausführen: %m" -#: pg_verifybackup.c:636 +#: pg_verifybackup.c:706 #, c-format msgid "\"%s\" is not a file or directory" msgstr "»%s« ist keine Datei und kein Verzeichnis" -#: pg_verifybackup.c:646 +#: pg_verifybackup.c:716 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "»%s« ist auf der Festplatte vorhanden, aber nicht im Manifest" -#: pg_verifybackup.c:658 +#: pg_verifybackup.c:728 #, c-format msgid "\"%s\" has size %lld on disk but size %zu in the manifest" msgstr "»%s« hat Größe %lld auf Festplatte aber Größe %zu im Manifest" -#: pg_verifybackup.c:689 +#: pg_verifybackup.c:768 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: CRC ist falsch" + +#: pg_verifybackup.c:772 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: unerwartete Kontrolldateiversion" + +#: pg_verifybackup.c:777 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: Systemidentifikator im Manifest ist %llu, aber Kontrolldatei hat %llu" + +#: pg_verifybackup.c:801 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "»%s« steht im Manifest, ist aber nicht auf der Festplatte vorhanden" -#: pg_verifybackup.c:756 +#: pg_verifybackup.c:873 #, c-format msgid "could not initialize checksum of file \"%s\"" msgstr "konnte Prüfsumme der Datei »%s« nicht initialisieren" -#: pg_verifybackup.c:768 +#: pg_verifybackup.c:885 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "konnte Prüfsumme der Datei »%s« nicht aktualisieren" -#: pg_verifybackup.c:785 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "konnte Datei »%s« nicht schließen: %m" - -#: pg_verifybackup.c:804 +#: pg_verifybackup.c:921 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "Datei »%s« sollte %zu Bytes enthalten, aber %zu Bytes wurden gelesen" -#: pg_verifybackup.c:814 +#: pg_verifybackup.c:931 #, c-format msgid "could not finalize checksum of file \"%s\"" msgstr "konnte Prüfsumme der Datei »%s« nicht abschließen" -#: pg_verifybackup.c:822 +#: pg_verifybackup.c:939 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "Datei »%s« hat Prüfsumme mit Länge %d, aber %d wurde erwartet" -#: pg_verifybackup.c:826 +#: pg_verifybackup.c:943 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "Prüfsumme stimmt nicht überein für Datei »%s«" -#: pg_verifybackup.c:851 +#: pg_verifybackup.c:969 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "Parsen des WAL fehlgeschlagen für Zeitleiste %u" -#: pg_verifybackup.c:965 +#: pg_verifybackup.c:1072 #, c-format msgid "%*s/%s kB (%d%%) verified" msgstr "%*s/%s kB (%d%%) überprüft" -#: pg_verifybackup.c:982 +#: pg_verifybackup.c:1089 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -437,7 +528,7 @@ msgstr "" "%s überprüft ein Backup anhand eines Backup-Manifests.\n" "\n" -#: pg_verifybackup.c:983 +#: pg_verifybackup.c:1090 #, c-format msgid "" "Usage:\n" @@ -448,62 +539,62 @@ msgstr "" " %s [OPTION]... BACKUPVERZ\n" "\n" -#: pg_verifybackup.c:984 +#: pg_verifybackup.c:1091 #, c-format msgid "Options:\n" msgstr "Optionen:\n" -#: pg_verifybackup.c:985 +#: pg_verifybackup.c:1092 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error bei Fehler sofort beenden\n" -#: pg_verifybackup.c:986 +#: pg_verifybackup.c:1093 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=REL-PFAD angegebenen Pfad ignorieren\n" -#: pg_verifybackup.c:987 +#: pg_verifybackup.c:1094 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=PFAD angegebenen Pfad für Manifest verwenden\n" -#: pg_verifybackup.c:988 +#: pg_verifybackup.c:1095 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal nicht versuchen WAL-Dateien zu parsen\n" -#: pg_verifybackup.c:989 +#: pg_verifybackup.c:1096 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress Fortschrittsinformationen zeigen\n" -#: pg_verifybackup.c:990 +#: pg_verifybackup.c:1097 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet keine Ausgabe, außer Fehler\n" -#: pg_verifybackup.c:991 +#: pg_verifybackup.c:1098 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums Überprüfung der Prüfsummen überspringen\n" -#: pg_verifybackup.c:992 +#: pg_verifybackup.c:1099 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=PFAD angegebenen Pfad für WAL-Dateien verwenden\n" -#: pg_verifybackup.c:993 +#: pg_verifybackup.c:1100 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_verifybackup.c:994 +#: pg_verifybackup.c:1101 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_verifybackup.c:995 +#: pg_verifybackup.c:1102 #, c-format msgid "" "\n" @@ -512,7 +603,7 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_verifybackup.c:996 +#: pg_verifybackup.c:1103 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" diff --git a/src/bin/pg_verifybackup/po/el.po b/src/bin/pg_verifybackup/po/el.po index 2ec9396805be7..3e3f20c67c5fe 100644 --- a/src/bin/pg_verifybackup/po/el.po +++ b/src/bin/pg_verifybackup/po/el.po @@ -9,15 +9,15 @@ msgid "" msgstr "" "Project-Id-Version: pg_verifybackup (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-14 09:16+0000\n" -"PO-Revision-Date: 2023-04-14 14:44+0200\n" +"POT-Creation-Date: 2023-08-14 23:16+0000\n" +"PO-Revision-Date: 2023-08-15 15:22+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -40,92 +40,97 @@ msgid "hint: " msgstr "υπόδειξη: " #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "έλλειψη μνήμης\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n" -#: ../../common/jsonapi.c:1092 +#: ../../common/jsonapi.c:1144 #, c-format msgid "Escape sequence \"\\%s\" is invalid." msgstr "Η ακολουθία διαφυγής «\\%s» δεν είναι έγκυÏη." -#: ../../common/jsonapi.c:1095 +#: ../../common/jsonapi.c:1147 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Ο χαÏακτήÏας με τιμή 0x%02x Ï€Ïέπει να διαφÏγει." -#: ../../common/jsonapi.c:1098 +#: ../../common/jsonapi.c:1150 #, c-format msgid "Expected end of input, but found \"%s\"." msgstr "Ανέμενε τέλος εισόδου, αλλά βÏήκε «%s»." -#: ../../common/jsonapi.c:1101 +#: ../../common/jsonapi.c:1153 #, c-format msgid "Expected array element or \"]\", but found \"%s\"." msgstr "Ανέμενε στοιχείο συστυχίας ή «]», αλλά βÏέθηκε «%s»." -#: ../../common/jsonapi.c:1104 +#: ../../common/jsonapi.c:1156 #, c-format msgid "Expected \",\" or \"]\", but found \"%s\"." msgstr "Ανέμενε «,» ή «]», αλλά βÏήκε «%s»." -#: ../../common/jsonapi.c:1107 +#: ../../common/jsonapi.c:1159 #, c-format msgid "Expected \":\", but found \"%s\"." msgstr "Ανέμενε «:», αλλά βÏήκε «%s»." -#: ../../common/jsonapi.c:1110 +#: ../../common/jsonapi.c:1162 #, c-format msgid "Expected JSON value, but found \"%s\"." msgstr "Ανέμενε τιμή JSON, αλλά βÏήκε «%s»." -#: ../../common/jsonapi.c:1113 +#: ../../common/jsonapi.c:1165 msgid "The input string ended unexpectedly." msgstr "Η συμβολοσειÏά εισόδου τεÏματίστηκε αναπάντεχα." -#: ../../common/jsonapi.c:1115 +#: ../../common/jsonapi.c:1167 #, c-format msgid "Expected string or \"}\", but found \"%s\"." msgstr "Ανέμενε συμβολοσειÏά ή «}», αλλά βÏήκε «%s»." -#: ../../common/jsonapi.c:1118 +#: ../../common/jsonapi.c:1170 #, c-format msgid "Expected \",\" or \"}\", but found \"%s\"." msgstr "Ανέμενε «,» ή «}», αλλά βÏήκε «%s»." -#: ../../common/jsonapi.c:1121 +#: ../../common/jsonapi.c:1173 #, c-format msgid "Expected string, but found \"%s\"." msgstr "Ανέμενε συμβολοσειÏά, αλλά βÏήκε «%s»." -#: ../../common/jsonapi.c:1124 +#: ../../common/jsonapi.c:1176 #, c-format msgid "Token \"%s\" is invalid." msgstr "Το διακÏιτικό «%s» δεν είναι έγκυÏο." -#: ../../common/jsonapi.c:1127 +#: ../../common/jsonapi.c:1179 msgid "\\u0000 cannot be converted to text." msgstr "Δεν είναι δυνατή η μετατÏοπή του \\u0000 σε κείμενο." -#: ../../common/jsonapi.c:1129 +#: ../../common/jsonapi.c:1181 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "Το «\\u» Ï€Ïέπει να ακολουθείται από τέσσεÏα δεκαεξαδικά ψηφία." -#: ../../common/jsonapi.c:1132 +#: ../../common/jsonapi.c:1184 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Δεν μποÏοÏν να χÏησιμοποιηθοÏν τιμές διαφυγής Unicode για τιμές σημείου κώδικα άνω του 007F όταν η κωδικοποίηση δεν είναι UTF8." -#: ../../common/jsonapi.c:1134 +#: ../../common/jsonapi.c:1187 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "Τιμές διαφυγής Unicode δεν δÏναται να μεταφÏαστοÏν στην εντοπιότητα %s του διακομιστή." + +#: ../../common/jsonapi.c:1190 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Υψηλό διακÏιτικό Unicode δεν Ï€Ïέπει να ακολουθεί υψηλό διακÏιτικό." -#: ../../common/jsonapi.c:1136 +#: ../../common/jsonapi.c:1192 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Χαμηλό διακÏιτικό Unicode Ï€Ïέπει να ακολουθεί υψηλό διακÏιτικό." @@ -141,283 +146,293 @@ msgstr "η διακήÏυξη έληξε απÏοσδόκητα" msgid "unexpected object start" msgstr "μη αναμενόμενη αÏχή αντικειμένου" -#: parse_manifest.c:224 +#: parse_manifest.c:226 msgid "unexpected object end" msgstr "μη αναμενόμενο τέλος αντικειμένου" -#: parse_manifest.c:251 +#: parse_manifest.c:255 msgid "unexpected array start" msgstr "μη αναμενόμενη αÏχή συστοιχίας" -#: parse_manifest.c:274 +#: parse_manifest.c:280 msgid "unexpected array end" msgstr "μη αναμενόμενο τέλος συστοιχίας" -#: parse_manifest.c:299 +#: parse_manifest.c:307 msgid "expected version indicator" msgstr "ανέμενε ένδειξη έκδοσης" -#: parse_manifest.c:328 +#: parse_manifest.c:336 msgid "unrecognized top-level field" msgstr "μη αναγνωÏίσιμο πεδίο ανώτατου επιπέδου" -#: parse_manifest.c:347 +#: parse_manifest.c:355 msgid "unexpected file field" msgstr "μη αναμενόμενο πεδίο αÏχείου" -#: parse_manifest.c:361 +#: parse_manifest.c:369 msgid "unexpected WAL range field" msgstr "μη αναμενόμενο πεδίο πεÏιοχής WAL" -#: parse_manifest.c:367 +#: parse_manifest.c:375 msgid "unexpected object field" msgstr "μη αναμενόμενο πεδίο αντικειμένου" -#: parse_manifest.c:397 +#: parse_manifest.c:407 msgid "unexpected manifest version" msgstr "μη αναμενόμενη έκδοση διακήÏυξης" -#: parse_manifest.c:448 +#: parse_manifest.c:458 msgid "unexpected scalar" msgstr "μη αναμενόμενο scalar" -#: parse_manifest.c:472 +#: parse_manifest.c:484 msgid "missing path name" msgstr "λείπει όνομα διαδÏομής" -#: parse_manifest.c:475 +#: parse_manifest.c:487 msgid "both path name and encoded path name" msgstr "και όνομα διαδÏομής και κωδικοποιημένο όνομα διαδÏομής" -#: parse_manifest.c:477 +#: parse_manifest.c:489 msgid "missing size" msgstr "λείπει το μέγεθος" -#: parse_manifest.c:480 +#: parse_manifest.c:492 msgid "checksum without algorithm" msgstr "άθÏοισμα ελέγχου χωÏίς αλγόÏιθμο" -#: parse_manifest.c:494 +#: parse_manifest.c:506 msgid "could not decode file name" msgstr "δεν ήταν δυνατή η αποκωδικοποίηση του ονόματος αÏχείου" -#: parse_manifest.c:504 +#: parse_manifest.c:516 msgid "file size is not an integer" msgstr "το μέγεθος αÏχείου δεν είναι ακέÏαιος" -#: parse_manifest.c:510 +#: parse_manifest.c:522 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "μη αναγνωÏίσιμος αλγόÏιθμος αθÏοίσματος ελέγχου: «%s»" -#: parse_manifest.c:529 +#: parse_manifest.c:541 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "μη έγκυÏο άθÏοισμα ελέγχου για το αÏχείο «%s»: «%s»" -#: parse_manifest.c:572 +#: parse_manifest.c:584 msgid "missing timeline" msgstr "λείπει η χÏονογÏαμμή" -#: parse_manifest.c:574 +#: parse_manifest.c:586 msgid "missing start LSN" msgstr "λείπει αÏχικό LSN" -#: parse_manifest.c:576 +#: parse_manifest.c:588 msgid "missing end LSN" msgstr "λείπει τελικό LSN" -#: parse_manifest.c:582 +#: parse_manifest.c:594 msgid "timeline is not an integer" msgstr "η χÏονογÏαμμή δεν είναι ακέÏαιος" -#: parse_manifest.c:585 +#: parse_manifest.c:597 msgid "could not parse start LSN" msgstr "δεν ήταν δυνατή η ανάλυση του αÏÏ‡Î¹ÎºÎ¿Ï LSN" -#: parse_manifest.c:588 +#: parse_manifest.c:600 msgid "could not parse end LSN" msgstr "δεν ήταν δυνατή η ανάλυση του Ï„ÎµÎ»Î¹ÎºÎ¿Ï LSN" -#: parse_manifest.c:649 +#: parse_manifest.c:661 msgid "expected at least 2 lines" msgstr "αναμένονταν τουλάχιστον 2 γÏαμμές" -#: parse_manifest.c:652 +#: parse_manifest.c:664 msgid "last line not newline-terminated" msgstr "η τελευταία γÏαμμή δεν τεÏματίστηκε με newline" -#: parse_manifest.c:657 +#: parse_manifest.c:669 #, c-format msgid "out of memory" msgstr "έλλειψη μνήμης" -#: parse_manifest.c:659 +#: parse_manifest.c:671 #, c-format msgid "could not initialize checksum of manifest" msgstr "δεν ήταν δυνατή η αÏχικοποίηση του αθÏοίσματος ελέγχου της διακήÏυξης" -#: parse_manifest.c:661 +#: parse_manifest.c:673 #, c-format msgid "could not update checksum of manifest" msgstr "δεν ήταν δυνατή η ενημέÏωση του αθÏοίσματος ελέγχου της διακήÏυξης" -#: parse_manifest.c:664 +#: parse_manifest.c:676 #, c-format msgid "could not finalize checksum of manifest" msgstr "δεν ήταν δυνατή η ολοκλήÏωση του αθÏοίσματος ελέγχου της διακήÏυξης" -#: parse_manifest.c:668 +#: parse_manifest.c:680 #, c-format msgid "manifest has no checksum" msgstr "η διακήÏυξη δεν έχει άθÏοισμα ελέγχου" -#: parse_manifest.c:672 +#: parse_manifest.c:684 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "μη έγκυÏο άθÏοισμα ελέγχου διακήÏυξης: «%s»" -#: parse_manifest.c:676 +#: parse_manifest.c:688 #, c-format msgid "manifest checksum mismatch" msgstr "αναντιστοιχία ελέγχου αθÏοίσματος διακήÏυξης" -#: parse_manifest.c:691 +#: parse_manifest.c:703 #, c-format msgid "could not parse backup manifest: %s" msgstr "δεν ήταν δυνατή η ανάλυση του αντιγÏάφου ασφαλείας της διακήÏυξης: %s" -#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276 +#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες." -#: pg_verifybackup.c:264 +#: pg_verifybackup.c:281 #, c-format msgid "no backup directory specified" msgstr "δεν οÏίστηκε κατάλογος αντιγÏάφου ασφαλείας" -#: pg_verifybackup.c:274 +#: pg_verifybackup.c:291 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)" -#: pg_verifybackup.c:297 +#: pg_verifybackup.c:299 +#, c-format +msgid "cannot specify both %s and %s" +msgstr "δεν είναι δυνατός ο καθοÏισμός τόσο %s και %s" + +#: pg_verifybackup.c:319 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "το Ï€ÏόγÏαμμα «%s» απαιτείται από %s αλλά δεν βÏέθηκε στον ίδιο κατάλογο με το «%s»" -#: pg_verifybackup.c:300 +#: pg_verifybackup.c:322 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "το Ï€ÏόγÏαμμα «%s» βÏέθηκε από το «%s» αλλά δεν ήταν η ίδια έκδοση με το %s" -#: pg_verifybackup.c:356 +#: pg_verifybackup.c:378 #, c-format msgid "backup successfully verified\n" msgstr "το αντίγÏαφο ασφαλείας επαληθεÏτηκε με επιτυχία\n" -#: pg_verifybackup.c:382 pg_verifybackup.c:718 +#: pg_verifybackup.c:404 pg_verifybackup.c:748 #, c-format msgid "could not open file \"%s\": %m" msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»: %m" -#: pg_verifybackup.c:386 +#: pg_verifybackup.c:408 #, c-format msgid "could not stat file \"%s\": %m" msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο «%s»: %m" -#: pg_verifybackup.c:406 pg_verifybackup.c:745 +#: pg_verifybackup.c:428 pg_verifybackup.c:779 #, c-format msgid "could not read file \"%s\": %m" msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: %m" -#: pg_verifybackup.c:409 +#: pg_verifybackup.c:431 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: ανέγνωσε %d από %lld" -#: pg_verifybackup.c:469 +#: pg_verifybackup.c:491 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "διπλότυπο όνομα διαδÏομής στη διακήÏυξη αντιγÏάφου ασφαλείας: «%s»" -#: pg_verifybackup.c:532 pg_verifybackup.c:539 +#: pg_verifybackup.c:554 pg_verifybackup.c:561 #, c-format msgid "could not open directory \"%s\": %m" msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m" -#: pg_verifybackup.c:571 +#: pg_verifybackup.c:593 #, c-format msgid "could not close directory \"%s\": %m" msgstr "δεν ήταν δυνατό το κλείσιμο του καταλόγου «%s»: %m" -#: pg_verifybackup.c:591 +#: pg_verifybackup.c:613 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο ή κατάλογο «%s»: %m" -#: pg_verifybackup.c:614 +#: pg_verifybackup.c:636 #, c-format msgid "\"%s\" is not a file or directory" msgstr "«%s» δεν είναι αÏχείο ή κατάλογος" -#: pg_verifybackup.c:624 +#: pg_verifybackup.c:646 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "«%s» βÏίσκεται στο δίσκο, αλλά όχι στη διακήÏυξη" -#: pg_verifybackup.c:636 +#: pg_verifybackup.c:658 #, c-format msgid "\"%s\" has size %lld on disk but size %zu in the manifest" msgstr "«%s» έχει μέγεθος %lld στο δίσκο, αλλά μέγεθος %zu στη διακήÏυξη" -#: pg_verifybackup.c:663 +#: pg_verifybackup.c:689 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "«%s» βÏίσκεται στη διακήÏυξη αλλά όχι στο δίσκο" -#: pg_verifybackup.c:726 +#: pg_verifybackup.c:756 #, c-format msgid "could not initialize checksum of file \"%s\"" msgstr "δεν ήταν δυνατή η αÏχικοποίηση του αθÏοίσματος ελέγχου του αÏχείου «%s»" -#: pg_verifybackup.c:738 +#: pg_verifybackup.c:768 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "δεν ήταν δυνατή η ενημέÏωση αθÏοίσματος ελέγχου του αÏχείου «%s»" -#: pg_verifybackup.c:751 +#: pg_verifybackup.c:785 #, c-format msgid "could not close file \"%s\": %m" msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου «%s»: %m" -#: pg_verifybackup.c:770 +#: pg_verifybackup.c:804 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "το αÏχείο «%s» έπÏεπε να πεÏιέχει %zu bytes, αλλά να αναγνώστηκαν %zu bytes" -#: pg_verifybackup.c:780 +#: pg_verifybackup.c:814 #, c-format msgid "could not finalize checksum of file \"%s\"" msgstr "δεν ήταν δυνατή η ολοκλήÏωση του αθÏοίσματος ελέγχου του αÏχείου «%s»" -#: pg_verifybackup.c:788 +#: pg_verifybackup.c:822 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "το αÏχείο «%s» έχει άθÏοισμα ελέγχου μήκους %d, αλλά αναμένεται %d" -#: pg_verifybackup.c:792 +#: pg_verifybackup.c:826 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "αναντιστοιχία αθÏοίσματος ελέγχου για το αÏχείο «%s»" -#: pg_verifybackup.c:816 +#: pg_verifybackup.c:851 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "απέτυχε η ανάλυση WAL για την χÏονογÏαμμή %u" -#: pg_verifybackup.c:902 +#: pg_verifybackup.c:965 +#, c-format +msgid "%*s/%s kB (%d%%) verified" +msgstr "%*s/%s kB (%d%%) επιβεβαιώθηκαν" + +#: pg_verifybackup.c:982 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -426,7 +441,7 @@ msgstr "" "%s επαληθεÏει ένα αντίγÏαφο ασφαλείας έναντι της διακήÏυξης αντιγÏάφων ασφαλείας.\n" "\n" -#: pg_verifybackup.c:903 +#: pg_verifybackup.c:983 #, c-format msgid "" "Usage:\n" @@ -437,57 +452,62 @@ msgstr "" " %s [ΕΠΙΛΟΓΗ]... BACKUPDIR\n" "\n" -#: pg_verifybackup.c:904 +#: pg_verifybackup.c:984 #, c-format msgid "Options:\n" msgstr "Επιλογές:\n" -#: pg_verifybackup.c:905 +#: pg_verifybackup.c:985 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error να εξέλθει άμεσα σε σφάλμα\n" -#: pg_verifybackup.c:906 +#: pg_verifybackup.c:986 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=RELATIVE_PATH αγνόησε την υποδεικνυόμενη διαδÏομή\n" -#: pg_verifybackup.c:907 +#: pg_verifybackup.c:987 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=PATH χÏησιμοποίησε την καθοÏισμένη διαδÏομή για την διακήÏυξη\n" -#: pg_verifybackup.c:908 +#: pg_verifybackup.c:988 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal μην δοκιμάσεις να αναλÏσεις αÏχεία WAL\n" -#: pg_verifybackup.c:909 +#: pg_verifybackup.c:989 +#, c-format +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress εμφάνισε πληÏοφοÏίες Ï€Ïοόδου\n" + +#: pg_verifybackup.c:990 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet να μην εκτυπώσεις καμία έξοδο, εκτός από σφάλματα\n" -#: pg_verifybackup.c:910 +#: pg_verifybackup.c:991 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums παÏάκαμψε την επαλήθευση αθÏοισμάτων ελέγχου\n" -#: pg_verifybackup.c:911 +#: pg_verifybackup.c:992 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=PATH χÏησιμοποίησε την καθοÏισμένη διαδÏομή για αÏχεία WAL\n" -#: pg_verifybackup.c:912 +#: pg_verifybackup.c:993 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n" -#: pg_verifybackup.c:913 +#: pg_verifybackup.c:994 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" -#: pg_verifybackup.c:914 +#: pg_verifybackup.c:995 #, c-format msgid "" "\n" @@ -496,7 +516,7 @@ msgstr "" "\n" "Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n" -#: pg_verifybackup.c:915 +#: pg_verifybackup.c:996 #, c-format msgid "%s home page: <%s>\n" msgstr "%s αÏχική σελίδα: <%s>\n" diff --git a/src/bin/pg_verifybackup/po/es.po b/src/bin/pg_verifybackup/po/es.po index 0cb958f34488a..b47022d019d03 100644 --- a/src/bin/pg_verifybackup/po/es.po +++ b/src/bin/pg_verifybackup/po/es.po @@ -6,10 +6,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_verifybackup (PostgreSQL) 16\n" +"Project-Id-Version: pg_verifybackup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:17+0000\n" -"PO-Revision-Date: 2023-05-22 12:06+0200\n" +"POT-Creation-Date: 2025-02-16 19:47+0000\n" +"PO-Revision-Date: 2024-11-16 14:24+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-ayuda \n" "Language: es\n" @@ -39,6 +39,81 @@ msgstr "detalle: " msgid "hint: " msgstr "consejo: " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "no se pudo abrir archivo «%s» para lectura: %m" + +#: ../../common/controldata_utils.c:110 pg_verifybackup.c:438 +#: pg_verifybackup.c:476 pg_verifybackup.c:896 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "no se pudo leer el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "no se pudo leer el archivo «%s»: leídos %d de %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: pg_verifybackup.c:902 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "no se pudo cerrar el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "discordancia en orden de bytes" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"posible discordancia en orden de bytes\n" +"El ordenamiento de bytes usado para almacenar el archivo pg_control puede no\n" +"coincidir con el usado por este programa. En tal caso los resultados de abajo\n" +"serían erróneos, y la instalación de PostgreSQL sería incompatible con este\n" +"directorio de datos." + +#: ../../common/controldata_utils.c:230 pg_verifybackup.c:406 +#: pg_verifybackup.c:865 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "no se pudo abrir el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "no se pudo escribir el archivo «%s»: %m" + +#: ../../common/controldata_utils.c:268 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:852 +#, c-format +msgid "out of memory" +msgstr "memoria agotada" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "éxito" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "el búfer de destino es demasiado pequeño" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "falla de openSSL" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format @@ -50,390 +125,405 @@ msgstr "memoria agotada\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "no se puede duplicar un puntero nulo (error interno)\n" -#: ../../common/jsonapi.c:1144 +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "El parser recursivo descendiente no puede usar el lexer incremental." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "El parser incremental requiere el lexer incremental." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON anidado demasiado profundamente, profundidad máxima es 6400." + +#: ../../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "La secuencia de escape «%s» no es válida." +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "La secuencia de escape «\\%.*s» no es válida." -#: ../../common/jsonapi.c:1147 +#: ../../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Los caracteres con valor 0x%02x deben ser escapados." -#: ../../common/jsonapi.c:1150 +#: ../../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "Se esperaba el fin de la entrada, se encontró «%s»." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "Se esperaba el fin de la entrada, se encontró «%.*s»." -#: ../../common/jsonapi.c:1153 +#: ../../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "Se esperaba un elemento de array o «]», se encontró «%s»." +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "Se esperaba un elemento de array o «]», se encontró «%.*s»." -#: ../../common/jsonapi.c:1156 +#: ../../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "Se esperaba «,» o «]», se encontró «%s»." +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "Se esperaba «,» o «]», se encontró «%.*s»." -#: ../../common/jsonapi.c:1159 +#: ../../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "Se esperaba «:», se encontró «%s»." +msgid "Expected \":\", but found \"%.*s\"." +msgstr "Se esperaba «:», se encontró «%.*s»." -#: ../../common/jsonapi.c:1162 +#: ../../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "Se esperaba un valor JSON, se encontró «%s»." +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "Se esperaba un valor JSON, se encontró «%.*s»." -#: ../../common/jsonapi.c:1165 +#: ../../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "La cadena de entrada terminó inesperadamente." -#: ../../common/jsonapi.c:1167 +#: ../../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "Se esperaba una cadena o «}», se encontró «%s»." +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "Se esperaba una cadena o «}», se encontró «%.*s»." -#: ../../common/jsonapi.c:1170 +#: ../../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "Se esperaba «,» o «}», se encontró «%s»." +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "Se esperaba «,» o «}», se encontró «%.*s»." -#: ../../common/jsonapi.c:1173 +#: ../../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "Se esperaba una cadena, se encontró «%s»." +msgid "Expected string, but found \"%.*s\"." +msgstr "Se esperaba una cadena, se encontró «%.*s»." -#: ../../common/jsonapi.c:1176 +#: ../../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "El elemento «%s» no es válido." +msgid "Token \"%.*s\" is invalid." +msgstr "El elemento «%.*s» no es válido." -#: ../../common/jsonapi.c:1179 +#: ../../common/jsonapi.c:2164 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 no puede ser convertido a text." -#: ../../common/jsonapi.c:1181 +#: ../../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "«\\u» debe ser seguido por cuatro dígitos hexadecimales." -#: ../../common/jsonapi.c:1184 +#: ../../common/jsonapi.c:2169 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Los valores de escape Unicode no se pueden utilizar para valores de código superiores a 007F cuando la codificación no es UTF8." -#: ../../common/jsonapi.c:1187 +#: ../../common/jsonapi.c:2178 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "El valor de escape Unicode no pudo ser traducido a la codificación del servidor %s." -#: ../../common/jsonapi.c:1190 +#: ../../common/jsonapi.c:2185 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Un «high-surrogate» Unicode no puede venir después de un «high-surrogate»." -#: ../../common/jsonapi.c:1192 +#: ../../common/jsonapi.c:2187 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Un «low-surrogate» Unicode debe seguir a un «high-surrogate»." -# XXX change upstream message -#: parse_manifest.c:150 -msgid "parsing failed" -msgstr "procesamiento falló" +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "no se pudo inicializar la suma de verificación del manifiesto" -#: parse_manifest.c:152 +#: ../../common/parse_manifest.c:203 ../../common/parse_manifest.c:260 msgid "manifest ended unexpectedly" msgstr "el manifiesto terminó inesperadamente" -#: parse_manifest.c:191 +#: ../../common/parse_manifest.c:209 ../../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "no se pudo actualizar la suma de verificación del manifiesto" + +#: ../../common/parse_manifest.c:301 msgid "unexpected object start" msgstr "inicio de objeto inesperado" -#: parse_manifest.c:226 +#: ../../common/parse_manifest.c:336 msgid "unexpected object end" msgstr "fin de objeto inesperado" -#: parse_manifest.c:255 +#: ../../common/parse_manifest.c:365 msgid "unexpected array start" msgstr "inicio de array inesperado" -#: parse_manifest.c:280 +#: ../../common/parse_manifest.c:390 msgid "unexpected array end" msgstr "fin de array inesperado" -#: parse_manifest.c:307 +#: ../../common/parse_manifest.c:417 msgid "expected version indicator" msgstr "se esperaba indicador de versión" -#: parse_manifest.c:336 +#: ../../common/parse_manifest.c:453 msgid "unrecognized top-level field" msgstr "campo de nivel superior no reconocido" -#: parse_manifest.c:355 +#: ../../common/parse_manifest.c:472 msgid "unexpected file field" msgstr "campo de archivo inesperado" -#: parse_manifest.c:369 +#: ../../common/parse_manifest.c:486 msgid "unexpected WAL range field" msgstr "campo de rango de WAL inesperado" -#: parse_manifest.c:375 +#: ../../common/parse_manifest.c:492 msgid "unexpected object field" msgstr "campo de objeto inesperado" -#: parse_manifest.c:407 +#: ../../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "escalar inesperado" + +#: ../../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "la versión de manifiesto no es un número entero" + +#: ../../common/parse_manifest.c:612 msgid "unexpected manifest version" msgstr "versión de manifiesto inesperada" -#: parse_manifest.c:458 -msgid "unexpected scalar" -msgstr "escalar inesperado" +#: ../../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "el identificador de sistema en el manifiesto no es un número entero" -#: parse_manifest.c:484 +#: ../../common/parse_manifest.c:661 msgid "missing path name" msgstr "ruta de archivo faltante" -#: parse_manifest.c:487 +#: ../../common/parse_manifest.c:664 msgid "both path name and encoded path name" msgstr "hay ambos ruta de archivo (path name) y ruta codificada (encoded path name)" -#: parse_manifest.c:489 +#: ../../common/parse_manifest.c:666 msgid "missing size" msgstr "tamaño faltante" -#: parse_manifest.c:492 +#: ../../common/parse_manifest.c:669 msgid "checksum without algorithm" msgstr "suma de comprobación sin algoritmo" -#: parse_manifest.c:506 +#: ../../common/parse_manifest.c:683 msgid "could not decode file name" msgstr "no se pudo decodificar el nombre del archivo" -#: parse_manifest.c:516 +#: ../../common/parse_manifest.c:693 msgid "file size is not an integer" msgstr "el tamaño del archivo no es un número entero" -#: parse_manifest.c:522 +#: ../../common/parse_manifest.c:699 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "algoritmo de suma de comprobación no reconocido: \"%s\"" -#: parse_manifest.c:541 +#: ../../common/parse_manifest.c:718 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "suma de comprobación no válida para el archivo \"%s\": \"%s\"" -#: parse_manifest.c:584 +#: ../../common/parse_manifest.c:761 msgid "missing timeline" msgstr "falta el timeline" -#: parse_manifest.c:586 +#: ../../common/parse_manifest.c:763 msgid "missing start LSN" msgstr "falta el LSN de inicio" -#: parse_manifest.c:588 +#: ../../common/parse_manifest.c:765 msgid "missing end LSN" msgstr "falta el LSN de término" -#: parse_manifest.c:594 +#: ../../common/parse_manifest.c:771 msgid "timeline is not an integer" msgstr "el timeline no es un número entero" -#: parse_manifest.c:597 +#: ../../common/parse_manifest.c:774 msgid "could not parse start LSN" msgstr "no se pudo interpretar el LSN de inicio" -#: parse_manifest.c:600 +#: ../../common/parse_manifest.c:777 msgid "could not parse end LSN" msgstr "no se pudo interpretar el LSN de término" -#: parse_manifest.c:661 +#: ../../common/parse_manifest.c:842 msgid "expected at least 2 lines" msgstr "esperado al menos 2 líneas" -#: parse_manifest.c:664 +#: ../../common/parse_manifest.c:845 msgid "last line not newline-terminated" msgstr "última línea no termina en nueva línea" -#: parse_manifest.c:669 -#, c-format -msgid "out of memory" -msgstr "memoria agotada" - -#: parse_manifest.c:671 -#, c-format -msgid "could not initialize checksum of manifest" -msgstr "no se pudo inicializar la suma de verificación del manifiesto" - -#: parse_manifest.c:673 -#, c-format -msgid "could not update checksum of manifest" -msgstr "no se pudo actualizar la suma de verificación del manifiesto" - -#: parse_manifest.c:676 +#: ../../common/parse_manifest.c:864 #, c-format msgid "could not finalize checksum of manifest" msgstr "no se pudo finalizar la suma de verificación del manifiesto" -#: parse_manifest.c:680 +#: ../../common/parse_manifest.c:868 #, c-format msgid "manifest has no checksum" msgstr "el manifiesto no tiene suma de comprobación" -#: parse_manifest.c:684 +#: ../../common/parse_manifest.c:872 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "suma de comprobación de manifiesto no válida: \"%s\"" -#: parse_manifest.c:688 +#: ../../common/parse_manifest.c:876 #, c-format msgid "manifest checksum mismatch" msgstr "discordancia en la suma de comprobación del manifiesto" -#: parse_manifest.c:703 +#: ../../common/parse_manifest.c:891 #, c-format msgid "could not parse backup manifest: %s" msgstr "no se pudo analizar el manifiesto de la copia de seguridad: %s" -#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293 +#: pg_verifybackup.c:277 pg_verifybackup.c:286 pg_verifybackup.c:297 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: pg_verifybackup.c:281 +#: pg_verifybackup.c:285 #, c-format msgid "no backup directory specified" msgstr "no fue especificado el directorio de respaldo" -#: pg_verifybackup.c:291 +#: pg_verifybackup.c:295 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: pg_verifybackup.c:299 +#: pg_verifybackup.c:303 #, c-format msgid "cannot specify both %s and %s" msgstr "no se puede especificar %s junto con %s" -#: pg_verifybackup.c:319 +#: pg_verifybackup.c:323 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "el programa «%s» es requerido por %s, pero no pudo encontrarlo en el mismo directorio que «%s»" -#: pg_verifybackup.c:322 +#: pg_verifybackup.c:326 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "el programa «%s» fue encontrado por «%s», pero no es de la misma versión que %s" -#: pg_verifybackup.c:378 +#: pg_verifybackup.c:381 #, c-format msgid "backup successfully verified\n" msgstr "copia de seguridad verificada correctamente\n" -#: pg_verifybackup.c:404 pg_verifybackup.c:748 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "no se pudo abrir el archivo «%s»: %m" - -#: pg_verifybackup.c:408 +#: pg_verifybackup.c:410 #, c-format msgid "could not stat file \"%s\": %m" msgstr "no se pudo hacer stat al archivo «%s»: %m" -#: pg_verifybackup.c:428 pg_verifybackup.c:779 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "no se pudo leer el archivo «%s»: %m" - -#: pg_verifybackup.c:431 +#: pg_verifybackup.c:440 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "no se pudo leer el archivo «%s»: leídos %d de %lld" -#: pg_verifybackup.c:491 +#: pg_verifybackup.c:478 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "no se pudo leer el archivo «%s»: leídos %lld de %lld" + +#: pg_verifybackup.c:561 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "nombre de ruta duplicado en el manifiesto de la copia de seguridad: \"%s\"" -#: pg_verifybackup.c:554 pg_verifybackup.c:561 +#: pg_verifybackup.c:624 pg_verifybackup.c:631 #, c-format msgid "could not open directory \"%s\": %m" msgstr "no se pudo abrir el directorio «%s»: %m" -#: pg_verifybackup.c:593 +#: pg_verifybackup.c:663 #, c-format msgid "could not close directory \"%s\": %m" msgstr "no se pudo abrir el directorio «%s»: %m" -#: pg_verifybackup.c:613 +#: pg_verifybackup.c:683 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "no se pudo hacer stat al archivo o directorio «%s»: %m" -#: pg_verifybackup.c:636 +#: pg_verifybackup.c:706 #, c-format msgid "\"%s\" is not a file or directory" msgstr "\"%s\" no es un archivo o directorio" -#: pg_verifybackup.c:646 +#: pg_verifybackup.c:716 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "\"%s\" está presente en el disco pero no en el manifiesto" -#: pg_verifybackup.c:658 +#: pg_verifybackup.c:728 #, c-format msgid "\"%s\" has size %lld on disk but size %zu in the manifest" msgstr "\"%s\" tiene un tamaño %lld en el disco pero un tamaño %zu en el manifiesto" -#: pg_verifybackup.c:689 +#: pg_verifybackup.c:768 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: el valor de CRC es incorrecto" + +#: pg_verifybackup.c:772 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: versión de archivo de control inesperado" + +#: pg_verifybackup.c:777 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: el identificador de sistema del manifiesto es %llu, pero el archivo de control tiene %llu" + +#: pg_verifybackup.c:801 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "\"%s\" está presente en el manifiesto pero no en el disco" -#: pg_verifybackup.c:756 +#: pg_verifybackup.c:873 #, c-format msgid "could not initialize checksum of file \"%s\"" msgstr "no se pudo inicializar la suma de verificación para el archivo «%s»" -#: pg_verifybackup.c:768 +#: pg_verifybackup.c:885 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "no se pudo actualizar la suma de verificación para el archivo «%s»" -#: pg_verifybackup.c:785 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "no se pudo cerrar el archivo «%s»: %m" - -#: pg_verifybackup.c:804 +#: pg_verifybackup.c:921 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "el archivo \"%s\" debe contener %zu bytes, pero se leyeron %zu bytes" -#: pg_verifybackup.c:814 +#: pg_verifybackup.c:931 #, c-format msgid "could not finalize checksum of file \"%s\"" msgstr "no se pudo finalizar la suma de verificación para el archivo «%s»" -#: pg_verifybackup.c:822 +#: pg_verifybackup.c:939 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "el archivo \"%s\" tiene una suma de comprobación de longitud %d, pero se esperaba %d" -#: pg_verifybackup.c:826 +#: pg_verifybackup.c:943 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "no coincide la suma de comprobación para el archivo \"%s\"" -#: pg_verifybackup.c:851 +#: pg_verifybackup.c:969 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "Error al interpretar el WAL para el timeline %u" -#: pg_verifybackup.c:965 +#: pg_verifybackup.c:1072 #, c-format msgid "%*s/%s kB (%d%%) verified" msgstr "%*s/%s kB (%d%%) verificados" -#: pg_verifybackup.c:982 +#: pg_verifybackup.c:1089 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -442,7 +532,7 @@ msgstr "" "%s verifica una copia de seguridad con el fichero de manifiesto de la copia de seguridad.\n" "\n" -#: pg_verifybackup.c:983 +#: pg_verifybackup.c:1090 #, c-format msgid "" "Usage:\n" @@ -453,62 +543,62 @@ msgstr "" " %s [OPCIÓN]... BACKUPDIR\n" "\n" -#: pg_verifybackup.c:984 +#: pg_verifybackup.c:1091 #, c-format msgid "Options:\n" msgstr "Opciones:\n" -#: pg_verifybackup.c:985 +#: pg_verifybackup.c:1092 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error salir inmediatamente en caso de error\n" -#: pg_verifybackup.c:986 +#: pg_verifybackup.c:1093 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=RELATIVE_PATH ignorar la ruta indicada\n" -#: pg_verifybackup.c:987 +#: pg_verifybackup.c:1094 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=PATH usar la ruta especificada para el manifiesto\n" -#: pg_verifybackup.c:988 +#: pg_verifybackup.c:1095 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal no intentar analizar archivos WAL\n" -#: pg_verifybackup.c:989 +#: pg_verifybackup.c:1096 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress mostrar información de progreso\n" -#: pg_verifybackup.c:990 +#: pg_verifybackup.c:1097 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet no escribir ningún mensaje, excepto errores\n" -#: pg_verifybackup.c:991 +#: pg_verifybackup.c:1098 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums omitir la verificación de la suma de comprobación\n" -#: pg_verifybackup.c:992 +#: pg_verifybackup.c:1099 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=PATH utilizar la ruta especificada para los archivos WAL\n" -#: pg_verifybackup.c:993 +#: pg_verifybackup.c:1100 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar la información de la versión, luego salir\n" -#: pg_verifybackup.c:994 +#: pg_verifybackup.c:1101 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help muestra esta ayuda, luego salir\n" -#: pg_verifybackup.c:995 +#: pg_verifybackup.c:1102 #, c-format msgid "" "\n" @@ -517,7 +607,7 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: pg_verifybackup.c:996 +#: pg_verifybackup.c:1103 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" diff --git a/src/bin/pg_verifybackup/po/fr.po b/src/bin/pg_verifybackup/po/fr.po index 68784c96524d8..310f55baf1d61 100644 --- a/src/bin/pg_verifybackup/po/fr.po +++ b/src/bin/pg_verifybackup/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-12 05:16+0000\n" -"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"POT-Creation-Date: 2024-08-29 17:48+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,409 +19,515 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: ../../../src/common/logging.c:273 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:280 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "attention : " -#: ../../../src/common/logging.c:291 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "détail : " -#: ../../../src/common/logging.c:298 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "astuce : " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "n'a pas pu ouvrir le fichier « %s » pour une lecture : %m" + +#: ../../common/controldata_utils.c:110 pg_verifybackup.c:438 +#: pg_verifybackup.c:476 pg_verifybackup.c:896 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "n'a pas pu lire le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: pg_verifybackup.c:902 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "n'a pas pu fermer le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "différence de l'ordre des octets" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"possible incohérence dans l'ordre des octets\n" +"L'ordre des octets utilisé pour enregistrer le fichier pg_control peut ne\n" +"pas correspondre à celui utilisé par ce programme. Dans ce cas, les\n" +"résultats ci-dessous sont incorrects, et l'installation de PostgreSQL\n" +"est incompatible avec ce répertoire des données." + +#: ../../common/controldata_utils.c:230 pg_verifybackup.c:406 +#: pg_verifybackup.c:865 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "impossible d'écrire le fichier « %s » : %m" + +#: ../../common/controldata_utils.c:268 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:853 +#, c-format +msgid "out of memory" +msgstr "mémoire épuisée" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "succès" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "tampon de destination trop petit" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "échec OpenSSL" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "mémoire épuisée\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" -#: ../../common/jsonapi.c:1078 +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "L'analyseur (parser) en descente récursive ne peut pas utiliser l'analyseur (lexer) incrémental." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "L'analyser (parser) incrémental nécessite l'analyseur (lexer) incrémental." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON trop profondément imbriqué, profondeur maximum permise est 6400." + +#: ../../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "La séquence d'échappement « \\%s » est invalide." +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "La séquence d'échappement « \\%.*s » est invalide." -#: ../../common/jsonapi.c:1081 +#: ../../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Le caractère de valeur 0x%02x doit être échappé." -#: ../../common/jsonapi.c:1084 +#: ../../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "Attendait une fin de l'entrée, mais a trouvé « %s »." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "Fin de l'entrée attendue, mais trouvé « %.*s »." -#: ../../common/jsonapi.c:1087 +#: ../../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "Élément de tableau ou « ] » attendu, mais trouvé « %s »." +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "Élément de tableau ou « ] » attendu, mais trouvé « %.*s »." -#: ../../common/jsonapi.c:1090 +#: ../../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "« , » ou « ] » attendu, mais trouvé « %s »." +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "« , » ou « ] » attendu, mais trouvé « %.*s »." -#: ../../common/jsonapi.c:1093 +#: ../../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "« : » attendu, mais trouvé « %s »." +msgid "Expected \":\", but found \"%.*s\"." +msgstr "« : » attendu, mais trouvé « %.*s »." -#: ../../common/jsonapi.c:1096 +#: ../../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "Valeur JSON attendue, mais « %s » trouvé." +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "Valeur JSON attendue, mais « %.*s » trouvé." -#: ../../common/jsonapi.c:1099 +#: ../../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "La chaîne en entrée se ferme de manière inattendue." -#: ../../common/jsonapi.c:1101 +#: ../../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "Chaîne ou « } » attendu, mais « %s » trouvé." +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "Chaîne ou « } » attendu, mais « %.*s » trouvé." -#: ../../common/jsonapi.c:1104 +#: ../../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "« , » ou « } » attendu, mais trouvé « %s »." +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "« , » ou « } » attendu, mais trouvé « %.*s »." -#: ../../common/jsonapi.c:1107 +#: ../../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "Chaîne attendue, mais « %s » trouvé." +msgid "Expected string, but found \"%.*s\"." +msgstr "Chaîne attendue, mais « %.*s » trouvé." -#: ../../common/jsonapi.c:1110 +#: ../../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "Le jeton « %s » n'est pas valide." +msgid "Token \"%.*s\" is invalid." +msgstr "Le jeton « %.*s » n'est pas valide." -#: ../../common/jsonapi.c:1113 +#: ../../common/jsonapi.c:2164 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 ne peut pas être converti en texte." -#: ../../common/jsonapi.c:1115 +#: ../../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "« \\u » doit être suivi par quatre chiffres hexadécimaux." -#: ../../common/jsonapi.c:1118 +#: ../../common/jsonapi.c:2169 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Les valeurs d'échappement Unicode ne peuvent pas être utilisées pour des valeurs de point code au-dessus de 007F quand l'encodage n'est pas UTF8." -#: ../../common/jsonapi.c:1120 +#: ../../common/jsonapi.c:2178 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "La valeur d'échappement unicode ne peut pas être traduite dans l'encodage du serveur %s." + +#: ../../common/jsonapi.c:2185 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Une substitution unicode haute ne doit pas suivre une substitution haute." -#: ../../common/jsonapi.c:1122 +#: ../../common/jsonapi.c:2187 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Une substitution unicode basse ne doit pas suivre une substitution haute." -#: parse_manifest.c:150 -msgid "parsing failed" -msgstr "échec de l'analyse" +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:855 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "n'a pas pu initialiser la somme de contrôle du manifeste" -#: parse_manifest.c:152 +#: ../../common/parse_manifest.c:204 ../../common/parse_manifest.c:261 msgid "manifest ended unexpectedly" msgstr "le manifeste se termine de façon inattendue" -#: parse_manifest.c:191 +#: ../../common/parse_manifest.c:210 ../../common/parse_manifest.c:862 +#, c-format +msgid "could not update checksum of manifest" +msgstr "n'a pas pu mettre à jour la somme de contrôle du manifeste" + +#: ../../common/parse_manifest.c:302 msgid "unexpected object start" msgstr "début d'objet inattendu" -#: parse_manifest.c:224 +#: ../../common/parse_manifest.c:337 msgid "unexpected object end" msgstr "fin d'objet inattendue" -#: parse_manifest.c:251 +#: ../../common/parse_manifest.c:366 msgid "unexpected array start" msgstr "début de tableau inattendu" -#: parse_manifest.c:274 +#: ../../common/parse_manifest.c:391 msgid "unexpected array end" msgstr "fin de tableau inattendue" -#: parse_manifest.c:299 +#: ../../common/parse_manifest.c:418 msgid "expected version indicator" msgstr "indicateur de version inattendu" -#: parse_manifest.c:328 +#: ../../common/parse_manifest.c:454 msgid "unrecognized top-level field" msgstr "champ haut niveau inconnu" -#: parse_manifest.c:347 +#: ../../common/parse_manifest.c:473 msgid "unexpected file field" msgstr "champ de fichier inattendu" -#: parse_manifest.c:361 +#: ../../common/parse_manifest.c:487 msgid "unexpected WAL range field" msgstr "champ d'intervalle de WAL inattendu" -#: parse_manifest.c:367 +#: ../../common/parse_manifest.c:493 msgid "unexpected object field" msgstr "champ d'objet inattendu" -#: parse_manifest.c:397 +#: ../../common/parse_manifest.c:583 +msgid "unexpected scalar" +msgstr "scalaire inattendu" + +#: ../../common/parse_manifest.c:609 +msgid "manifest version not an integer" +msgstr "la version du manifeste n'est pas un entier" + +#: ../../common/parse_manifest.c:613 msgid "unexpected manifest version" msgstr "version du manifeste inattendue" -#: parse_manifest.c:448 -msgid "unexpected scalar" -msgstr "scalaire inattendu" +#: ../../common/parse_manifest.c:637 +msgid "system identifier in manifest not an integer" +msgstr "l'identifieur système dans le manifeste n'est pas un entier" -#: parse_manifest.c:472 +#: ../../common/parse_manifest.c:662 msgid "missing path name" msgstr "nom de chemin manquant" -#: parse_manifest.c:475 +#: ../../common/parse_manifest.c:665 msgid "both path name and encoded path name" msgstr "le nom du chemin et le nom du chemin encodé" -#: parse_manifest.c:477 +#: ../../common/parse_manifest.c:667 msgid "missing size" msgstr "taille manquante" -#: parse_manifest.c:480 +#: ../../common/parse_manifest.c:670 msgid "checksum without algorithm" msgstr "somme de contrôle sans algorithme" -#: parse_manifest.c:494 +#: ../../common/parse_manifest.c:684 msgid "could not decode file name" msgstr "n'a pas pu décoder le nom du fichier" -#: parse_manifest.c:504 +#: ../../common/parse_manifest.c:694 msgid "file size is not an integer" msgstr "la taille du fichier n'est pas un entier" -#: parse_manifest.c:510 +#: ../../common/parse_manifest.c:700 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "algorithme de somme de contrôle inconnu : « %s »" -#: parse_manifest.c:529 +#: ../../common/parse_manifest.c:719 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "somme de contrôle invalide pour le fichier « %s » : « %s »" -#: parse_manifest.c:572 +#: ../../common/parse_manifest.c:762 msgid "missing timeline" msgstr "timeline manquante" -#: parse_manifest.c:574 +#: ../../common/parse_manifest.c:764 msgid "missing start LSN" msgstr "LSN de début manquante" -#: parse_manifest.c:576 +#: ../../common/parse_manifest.c:766 msgid "missing end LSN" msgstr "LSN de fin manquante" -#: parse_manifest.c:582 +#: ../../common/parse_manifest.c:772 msgid "timeline is not an integer" msgstr "la timeline n'est pas un entier" -#: parse_manifest.c:585 +#: ../../common/parse_manifest.c:775 msgid "could not parse start LSN" msgstr "n'a pas pu analyser le LSN de début" -#: parse_manifest.c:588 +#: ../../common/parse_manifest.c:778 msgid "could not parse end LSN" msgstr "n'a pas pu analyser le LSN de fin" -#: parse_manifest.c:649 +#: ../../common/parse_manifest.c:843 msgid "expected at least 2 lines" msgstr "attendait au moins deux lignes" -#: parse_manifest.c:652 +#: ../../common/parse_manifest.c:846 msgid "last line not newline-terminated" msgstr "dernière ligne non terminée avec un caractère newline" -#: parse_manifest.c:657 -#, c-format -msgid "out of memory" -msgstr "mémoire épuisée" - -#: parse_manifest.c:659 -#, c-format -msgid "could not initialize checksum of manifest" -msgstr "n'a pas pu initialiser la somme de contrôle du manifeste" - -#: parse_manifest.c:661 -#, c-format -msgid "could not update checksum of manifest" -msgstr "n'a pas pu mettre à jour la somme de contrôle du manifeste" - -#: parse_manifest.c:664 +#: ../../common/parse_manifest.c:865 #, c-format msgid "could not finalize checksum of manifest" msgstr "n'a pas pu finaliser la somme de contrôle du manifeste" -#: parse_manifest.c:668 +#: ../../common/parse_manifest.c:869 #, c-format msgid "manifest has no checksum" msgstr "le manifeste n'a pas de somme de contrôle" -#: parse_manifest.c:672 +#: ../../common/parse_manifest.c:873 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "somme de contrôle du manifeste invalide : « %s »" -#: parse_manifest.c:676 +#: ../../common/parse_manifest.c:877 #, c-format msgid "manifest checksum mismatch" msgstr "différence de somme de contrôle pour le manifeste" -#: parse_manifest.c:691 +#: ../../common/parse_manifest.c:892 #, c-format msgid "could not parse backup manifest: %s" msgstr "n'a pas pu analyser le manifeste de sauvegarde : %s" -#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276 +#: pg_verifybackup.c:277 pg_verifybackup.c:286 pg_verifybackup.c:297 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." -#: pg_verifybackup.c:264 +#: pg_verifybackup.c:285 #, c-format msgid "no backup directory specified" msgstr "pas de répertoire de sauvegarde spécifié" -#: pg_verifybackup.c:274 +#: pg_verifybackup.c:295 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_verifybackup.c:297 +#: pg_verifybackup.c:303 +#, c-format +msgid "cannot specify both %s and %s" +msgstr "ne peut pas spécifier à la fois %s et %s" + +#: pg_verifybackup.c:323 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "le programme « %s » est nécessaire pour %s, mais n'a pas été trouvé dans le même répertoire que « %s »" -#: pg_verifybackup.c:300 +#: pg_verifybackup.c:326 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "le programme « %s » a été trouvé par « %s » mais n'est pas de la même version que %s" -#: pg_verifybackup.c:356 +#: pg_verifybackup.c:381 #, c-format msgid "backup successfully verified\n" msgstr "sauvegarde vérifiée avec succès\n" -#: pg_verifybackup.c:382 pg_verifybackup.c:718 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "n'a pas pu ouvrir le fichier « %s » : %m" - -#: pg_verifybackup.c:386 +#: pg_verifybackup.c:410 #, c-format msgid "could not stat file \"%s\": %m" msgstr "n'a pas pu tester le fichier « %s » : %m" -#: pg_verifybackup.c:406 pg_verifybackup.c:747 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "n'a pas pu lire le fichier « %s » : %m" - -#: pg_verifybackup.c:409 +#: pg_verifybackup.c:440 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %lld" -#: pg_verifybackup.c:469 +#: pg_verifybackup.c:478 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "n'a pas pu lire le fichier « %s » : a lu %lld sur %lld" + +#: pg_verifybackup.c:561 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "nom de chemin dupliqué dans le manifeste de sauvegarde : « %s »" -#: pg_verifybackup.c:532 pg_verifybackup.c:539 +#: pg_verifybackup.c:624 pg_verifybackup.c:631 #, c-format msgid "could not open directory \"%s\": %m" msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" -#: pg_verifybackup.c:571 +#: pg_verifybackup.c:663 #, c-format msgid "could not close directory \"%s\": %m" msgstr "n'a pas pu fermer le répertoire « %s » : %m" -#: pg_verifybackup.c:591 +#: pg_verifybackup.c:683 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "" "n'a pas pu récupérer les informations sur le fichier ou répertoire\n" "« %s » : %m" -#: pg_verifybackup.c:614 +#: pg_verifybackup.c:706 #, c-format msgid "\"%s\" is not a file or directory" msgstr "« %s » n'est ni un fichier ni un répertoire" -#: pg_verifybackup.c:624 +#: pg_verifybackup.c:716 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "« %s » est présent sur disque mais pas dans le manifeste" -#: pg_verifybackup.c:636 +#: pg_verifybackup.c:728 #, c-format msgid "\"%s\" has size %lld on disk but size %zu in the manifest" msgstr "« %s » a une taille de %lld sur disque mais de %zu dans le manifeste" -#: pg_verifybackup.c:663 +#: pg_verifybackup.c:768 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s : la valeur CRC n'est pas correcte" + +#: pg_verifybackup.c:772 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s : version inattendue pour le fichier de contrôle" + +#: pg_verifybackup.c:777 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: l'identifieur système du manifeste est %llu, mais le fichier de contrôle a %llu" + +#: pg_verifybackup.c:801 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "« %s » est présent dans le manifeste mais pas sur disque" -#: pg_verifybackup.c:726 +#: pg_verifybackup.c:873 #, c-format msgid "could not initialize checksum of file \"%s\"" msgstr "n'a pas pu initialiser la somme de contrôle du fichier « %s »" -#: pg_verifybackup.c:738 +#: pg_verifybackup.c:885 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "n'a pas pu mettre à jour la somme de contrôle du fichier « %s »" -#: pg_verifybackup.c:753 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "n'a pas pu fermer le fichier « %s » : %m" - -#: pg_verifybackup.c:772 +#: pg_verifybackup.c:921 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "le fichier « %s » devrait contenir %zu octets, mais la lecture produit %zu octets" -#: pg_verifybackup.c:782 +#: pg_verifybackup.c:931 #, c-format msgid "could not finalize checksum of file \"%s\"" msgstr "n'a pas pu finaliser la somme de contrôle du fichier « %s »" -#: pg_verifybackup.c:790 +#: pg_verifybackup.c:939 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "le fichier « %s » a une somme de contrôle de taille %d, alors que %d était attendu" -#: pg_verifybackup.c:794 +#: pg_verifybackup.c:943 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "différence de somme de contrôle pour le fichier « %s »" -#: pg_verifybackup.c:818 +#: pg_verifybackup.c:969 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "analyse du WAL échouée pour la timeline %u" -#: pg_verifybackup.c:904 +#: pg_verifybackup.c:1072 +#, c-format +msgid "%*s/%s kB (%d%%) verified" +msgstr "%*s/%s Ko (%d%%) vérifiés" + +#: pg_verifybackup.c:1089 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -430,7 +536,7 @@ msgstr "" "%s vérifie une sauvegarde à partir du manifeste de sauvegarde.\n" "\n" -#: pg_verifybackup.c:905 +#: pg_verifybackup.c:1090 #, c-format msgid "" "Usage:\n" @@ -441,57 +547,62 @@ msgstr "" " %s [OPTION]... REP_SAUVEGARDE\n" "\n" -#: pg_verifybackup.c:906 +#: pg_verifybackup.c:1091 #, c-format msgid "Options:\n" msgstr "Options :\n" -#: pg_verifybackup.c:907 +#: pg_verifybackup.c:1092 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error quitte immédiatement en cas d'erreur\n" -#: pg_verifybackup.c:908 +#: pg_verifybackup.c:1093 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=CHEMIN_RELATIF ignore le chemin indiqué\n" -#: pg_verifybackup.c:909 +#: pg_verifybackup.c:1094 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=CHEMIN utilise le chemin spécifié pour le manifeste\n" -#: pg_verifybackup.c:910 +#: pg_verifybackup.c:1095 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal n'essaie pas d'analyse les fichiers WAL\n" -#: pg_verifybackup.c:911 +#: pg_verifybackup.c:1096 +#, c-format +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress affiche les informations de progression\n" + +#: pg_verifybackup.c:1097 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet n'affiche aucun message sauf pour les erreurs\n" -#: pg_verifybackup.c:912 +#: pg_verifybackup.c:1098 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums ignore la vérification des sommes de contrôle\n" -#: pg_verifybackup.c:913 +#: pg_verifybackup.c:1099 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=CHEMIN utilise le chemin spécifié pour les fichiers WAL\n" -#: pg_verifybackup.c:914 +#: pg_verifybackup.c:1100 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version, puis quitte\n" -#: pg_verifybackup.c:915 +#: pg_verifybackup.c:1101 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide, puis quitte\n" -#: pg_verifybackup.c:916 +#: pg_verifybackup.c:1102 #, c-format msgid "" "\n" @@ -500,18 +611,7 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_verifybackup.c:917 +#: pg_verifybackup.c:1103 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" - -#~ msgid "could not read file \"%s\": read %d of %zu" -#~ msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatal : " diff --git a/src/bin/pg_verifybackup/po/it.po b/src/bin/pg_verifybackup/po/it.po index 103d6a08d9066..317b0b71e7f30 100644 --- a/src/bin/pg_verifybackup/po/it.po +++ b/src/bin/pg_verifybackup/po/it.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: pg_verifybackup (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-09-26 08:16+0000\n" -"PO-Revision-Date: 2022-10-04 19:41+0200\n" +"PO-Revision-Date: 2023-09-05 08:24+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: it\n" @@ -448,7 +448,7 @@ msgstr " -e, --exit-on-error esce immediatamente in caso di errore\n" #: pg_verifybackup.c:906 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" -msgstr " -i, --ignore=RELATIVE_PATH ignora il percorso indicato\n" +msgstr " -i, --ignore=RELATIVE_PATH ignora il percorso indicato\n" #: pg_verifybackup.c:907 #, c-format @@ -473,17 +473,17 @@ msgstr " -s, --skip-checksums salta la verifica del checksum\n" #: pg_verifybackup.c:911 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" -msgstr " -w, --wal-directory=PATH usa il percorso specificato per i file WAL\n" +msgstr " -w, --wal-directory=PATH usa il percorso specificato per i file WAL\n" #: pg_verifybackup.c:912 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version restituisce le informazioni sulla versione, quindi esci\n" +msgstr " -V, --version restituisce le informazioni sulla versione, quindi esci\n" #: pg_verifybackup.c:913 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help mostra questo aiuto, quindi esci\n" +msgstr " -?, --help mostra questo aiuto, quindi esci\n" #: pg_verifybackup.c:914 #, c-format diff --git a/src/bin/pg_verifybackup/po/ja.po b/src/bin/pg_verifybackup/po/ja.po index 98b280bba4b79..fa5938d1274bf 100644 --- a/src/bin/pg_verifybackup/po/ja.po +++ b/src/bin/pg_verifybackup/po/ja.po @@ -1,14 +1,14 @@ # Japanese message translation file for pg_verifybackup -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package. # Haiying Tang , 2021. # msgid "" msgstr "" -"Project-Id-Version: pg_verifybackup (PostgreSQL 15)\n" +"Project-Id-Version: pg_verifybackup (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-02-06 16:00+0900\n" -"PO-Revision-Date: 2023-02-06 17:30+0900\n" +"POT-Creation-Date: 2025-02-28 10:06+0900\n" +"PO-Revision-Date: 2025-03-03 17:37+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -37,6 +37,80 @@ msgstr "詳細: " msgid "hint: " msgstr "ヒント: " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ファイル\"%s\"を読ã¿è¾¼ã¿ç”¨ã«ã‚ªãƒ¼ãƒ—ンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:110 pg_verifybackup.c:438 +#: pg_verifybackup.c:476 pg_verifybackup.c:896 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ファイル\"%s\"ã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$zuãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: pg_verifybackup.c:902 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒåˆã£ã¦ã„ã¾ã›ã‚“" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒç•°ãªã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚\n" +"pg_controlファイルを格ç´ã™ã‚‹ãŸã‚ã«ä½¿ç”¨ã™ã‚‹ãƒã‚¤ãƒˆã‚ªãƒ¼ãƒ€ãŒæœ¬ãƒ—ログラムã§ä½¿ç”¨\n" +"ã•れるもã®ã¨ä¸€è‡´ã—ãªã„よã†ã§ã™ã€‚ã“ã®å ´åˆä»¥ä¸‹ã®çµæžœã¯ä¸æ­£ç¢ºã«ãªã‚Šã¾ã™ã€‚ã¾ãŸã€\n" +"PostgreSQLインストレーションã¯ã“ã®ãƒ‡ãƒ¼ã‚¿ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨äº’æ›æ€§ãŒãªããªã‚Šã¾ã™ã€‚" + +#: ../../common/controldata_utils.c:230 pg_verifybackup.c:406 +#: pg_verifybackup.c:865 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/controldata_utils.c:268 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:852 +#, c-format +msgid "out of memory" +msgstr "メモリä¸è¶³ã§ã™" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "æˆåŠŸ" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "出力先ãƒãƒƒãƒ•ã‚¡ãŒå°ã•ã™ãŽã¾ã™" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "OpenSSLã®ã‚¨ãƒ©ãƒ¼" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format @@ -48,389 +122,405 @@ msgstr "メモリä¸è¶³ã§ã™\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ãƒã‚¤ãƒ³ã‚¿ã‚’複製ã§ãã¾ã›ã‚“ (内部エラー)\n" -#: ../../common/jsonapi.c:1126 +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "å†å¸°é™ä¸‹ãƒ‘ーサーã¯å·®åˆ†å­—å¥è§£æžå™¨ã‚’使用ã§ãã¾ã›ã‚“。" + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "差分パーサーã¯å·®åˆ†å­—å¥è§£æžå™¨ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚" + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSONã®ãƒã‚¹ãƒˆãŒæ·±ã™ãŽã¾ã™ã€å¯èƒ½ãªæœ€å¤§ã®æ·±ã•ã¯6400ã§ã™ã€‚" + +#: ../../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "エスケープシーケンス\"\\%s\"ã¯ä¸æ­£ã§ã™ã€‚" +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "エスケープシーケンス\"\\%.*s\"ã¯ä¸æ­£ã§ã™ã€‚" -#: ../../common/jsonapi.c:1129 +#: ../../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x値をæŒã¤æ–‡å­—ã¯ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: ../../common/jsonapi.c:1132 +#: ../../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "入力ã®çµ‚端を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected end of input, but found \"%.*s\"." +msgstr "入力ã®çµ‚端を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" -#: ../../common/jsonapi.c:1135 +#: ../../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "é…列è¦ç´ ã¾ãŸã¯\"]\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "é…列è¦ç´ ã¾ãŸã¯\"]\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" -#: ../../common/jsonapi.c:1138 +#: ../../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "\",\"ã¾ãŸã¯\"]\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "\",\"ã¾ãŸã¯\"]\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" -#: ../../common/jsonapi.c:1141 +#: ../../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "\":\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected \":\", but found \"%.*s\"." +msgstr "\":\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" -#: ../../common/jsonapi.c:1144 +#: ../../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "JSON値を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "JSON値を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" -#: ../../common/jsonapi.c:1147 +#: ../../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "入力文字列ãŒäºˆæœŸã›ãšçµ‚了ã—ã¾ã—ãŸã€‚" -#: ../../common/jsonapi.c:1149 +#: ../../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "文字列ã¾ãŸã¯\"}\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "文字列ã¾ãŸã¯\"}\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" -#: ../../common/jsonapi.c:1152 +#: ../../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "\",\"ã¾ãŸã¯\"}\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "\",\"ã¾ãŸã¯\"}\"を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" -#: ../../common/jsonapi.c:1155 +#: ../../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "文字列を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"%s\"ã§ã—ãŸã€‚" +msgid "Expected string, but found \"%.*s\"." +msgstr "文字列を想定ã—ã¦ã„ã¾ã—ãŸãŒã€\"\\%.*s\"ã§ã—ãŸã€‚" -#: ../../common/jsonapi.c:1158 +#: ../../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "トークン\"%s\"ã¯ä¸æ­£ã§ã™ã€‚" +msgid "Token \"%.*s\" is invalid." +msgstr "トークン\"\\%.*s\"ã¯ä¸æ­£ã§ã™ã€‚" -#: ../../common/jsonapi.c:1161 +#: ../../common/jsonapi.c:2164 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 ã¯ãƒ†ã‚­ã‚¹ãƒˆã«å¤‰æ›ã§ãã¾ã›ã‚“。" -#: ../../common/jsonapi.c:1163 +#: ../../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\"ã®å¾Œã«ã¯16進数ã®4æ¡ãŒç¶šã‹ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: ../../common/jsonapi.c:1166 +#: ../../common/jsonapi.c:2169 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "エンコーディングãŒUTF-8ã§ã¯ãªã„å ´åˆã€ã‚³ãƒ¼ãƒ‰ãƒã‚¤ãƒ³ãƒˆã®å€¤ãŒ 007F 以上ã«ã¤ã„ã¦ã¯Unicodeエスケープã®å€¤ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。" -#: ../../common/jsonapi.c:1169 +#: ../../common/jsonapi.c:2178 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "Unicodeエスケープã®å€¤ãŒã‚µãƒ¼ãƒãƒ¼ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°%sã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" -#: ../../common/jsonapi.c:1172 +#: ../../common/jsonapi.c:2185 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodeã®ãƒã‚¤ã‚µãƒ­ã‚²ãƒ¼ãƒˆã¯ãƒã‚¤ã‚µãƒ­ã‚²ãƒ¼ãƒˆã«ç¶šã„ã¦ã¯ã„ã‘ã¾ã›ã‚“。" -#: ../../common/jsonapi.c:1174 +#: ../../common/jsonapi.c:2187 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicodeã®ãƒ­ãƒ¼ã‚µãƒ­ã‚²ãƒ¼ãƒˆã¯ãƒã‚¤ã‚µãƒ­ã‚²ãƒ¼ãƒˆã«ç¶šã‹ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" -#: parse_manifest.c:150 -msgid "parsing failed" -msgstr "パースã«å¤±æ•—ã—ã¾ã—ãŸ" +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®åˆæœŸåŒ–ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: parse_manifest.c:152 +#: ../../common/parse_manifest.c:203 ../../common/parse_manifest.c:260 msgid "manifest ended unexpectedly" msgstr "目録ãŒäºˆæœŸã›ãšçµ‚了ã—ã¾ã—ãŸã€‚" -#: parse_manifest.c:191 +#: ../../common/parse_manifest.c:209 ../../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®æ›´æ–°ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" + +#: ../../common/parse_manifest.c:301 msgid "unexpected object start" msgstr "予期ã—ãªã„オブジェクトã®é–‹å§‹" -#: parse_manifest.c:226 +#: ../../common/parse_manifest.c:336 msgid "unexpected object end" msgstr "予期ã—ãªã„オブジェクトã®çµ‚ã‚り" -#: parse_manifest.c:255 +#: ../../common/parse_manifest.c:365 msgid "unexpected array start" msgstr "予期ã—ãªã„é…列ã®é–‹å§‹" -#: parse_manifest.c:280 +#: ../../common/parse_manifest.c:390 msgid "unexpected array end" msgstr "予期ã—ãªã„é…列ã®çµ‚ã‚り" -#: parse_manifest.c:307 +#: ../../common/parse_manifest.c:417 msgid "expected version indicator" msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³æŒ‡ç¤ºå­ã‚’想定ã—ã¦ã„ã¾ã—ãŸ" -#: parse_manifest.c:336 +#: ../../common/parse_manifest.c:453 msgid "unrecognized top-level field" msgstr "èªè­˜ã§ããªã„トップレベルフィールド" -#: parse_manifest.c:355 +#: ../../common/parse_manifest.c:472 msgid "unexpected file field" msgstr "予期ã—ãªã„ファイルフィールド" -#: parse_manifest.c:369 +#: ../../common/parse_manifest.c:486 msgid "unexpected WAL range field" msgstr "予期ã—ãªã„WAL範囲フィールド" -#: parse_manifest.c:375 +#: ../../common/parse_manifest.c:492 msgid "unexpected object field" msgstr "予期ã—ãªã„オブジェクトフィールド" -#: parse_manifest.c:407 +#: ../../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "予期ã—ãªã„スカラー" + +#: ../../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "目録ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒæ•´æ•°ã§ã¯ã‚りã¾ã›ã‚“" + +#: ../../common/parse_manifest.c:612 msgid "unexpected manifest version" msgstr "予期ã—ãªã„目録ãƒãƒ¼ã‚¸ãƒ§ãƒ³" -#: parse_manifest.c:458 -msgid "unexpected scalar" -msgstr "予期ã—ãªã„スカラー" +#: ../../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "目録中ã®ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ãŒæ•´æ•°ã§ã¯ã‚りã¾ã›ã‚“" -#: parse_manifest.c:484 +#: ../../common/parse_manifest.c:661 msgid "missing path name" msgstr "パスåãŒã‚りã¾ã›ã‚“" -#: parse_manifest.c:487 +#: ../../common/parse_manifest.c:664 msgid "both path name and encoded path name" msgstr "パスåã¨ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã•れãŸãƒ‘スåã®ä¸¡æ–¹" -#: parse_manifest.c:489 +#: ../../common/parse_manifest.c:666 msgid "missing size" msgstr "サイズãŒã‚りã¾ã›ã‚“" -#: parse_manifest.c:492 +#: ../../common/parse_manifest.c:669 msgid "checksum without algorithm" msgstr "アルゴリズムãªã—ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ " -#: parse_manifest.c:506 +#: ../../common/parse_manifest.c:683 msgid "could not decode file name" msgstr "ファイルåをデコードã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: parse_manifest.c:516 +#: ../../common/parse_manifest.c:693 msgid "file size is not an integer" msgstr "ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚ºãŒæ•´æ•°ã§ã¯ã‚りã¾ã›ã‚“" -#: parse_manifest.c:522 +#: ../../common/parse_manifest.c:699 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "èªè­˜ã§ããªã„ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ : \"%s\"" -#: parse_manifest.c:541 +#: ../../common/parse_manifest.c:718 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "\"%s\" ファイルã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒç„¡åй: \"%s\"" -#: parse_manifest.c:584 +#: ../../common/parse_manifest.c:761 msgid "missing timeline" msgstr "タイムラインãŒã‚りã¾ã›ã‚“" -#: parse_manifest.c:586 +#: ../../common/parse_manifest.c:763 msgid "missing start LSN" msgstr "é–‹å§‹LSNãŒã‚りã¾ã›ã‚“" -#: parse_manifest.c:588 +#: ../../common/parse_manifest.c:765 msgid "missing end LSN" msgstr "終了LSNãŒã‚りã¾ã›ã‚“" -#: parse_manifest.c:594 +#: ../../common/parse_manifest.c:771 msgid "timeline is not an integer" msgstr "ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ãŒæ•´æ•°ã§ã¯ã‚りã¾ã›ã‚“" -#: parse_manifest.c:597 +#: ../../common/parse_manifest.c:774 msgid "could not parse start LSN" msgstr "é–‹å§‹LSNをパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: parse_manifest.c:600 +#: ../../common/parse_manifest.c:777 msgid "could not parse end LSN" msgstr "終了LSNをパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: parse_manifest.c:661 +#: ../../common/parse_manifest.c:842 msgid "expected at least 2 lines" msgstr "å°‘ãªãã¨ã‚‚2行ãŒå¿…è¦ã§ã™" -#: parse_manifest.c:664 +#: ../../common/parse_manifest.c:845 msgid "last line not newline-terminated" msgstr "最後ã®è¡ŒãŒæ”¹è¡Œã§çµ‚ã‚ã£ã¦ã„ã¾ã›ã‚“" -#: parse_manifest.c:669 -#, c-format -msgid "out of memory" -msgstr "メモリä¸è¶³ã§ã™" - -#: parse_manifest.c:671 -#, c-format -msgid "could not initialize checksum of manifest" -msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®åˆæœŸåŒ–ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" - -#: parse_manifest.c:673 -#, c-format -msgid "could not update checksum of manifest" -msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®æ›´æ–°ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" - -#: parse_manifest.c:676 +#: ../../common/parse_manifest.c:864 #, c-format msgid "could not finalize checksum of manifest" msgstr "目録ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®å®Œäº†ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: parse_manifest.c:680 +#: ../../common/parse_manifest.c:868 #, c-format msgid "manifest has no checksum" msgstr "目録ã«ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒã‚りã¾ã›ã‚“" -#: parse_manifest.c:684 +#: ../../common/parse_manifest.c:872 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "無効ãªç›®éŒ²ãƒã‚§ãƒƒã‚¯ã‚µãƒ : \"%s\"" -#: parse_manifest.c:688 +#: ../../common/parse_manifest.c:876 #, c-format msgid "manifest checksum mismatch" msgstr "目録ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®ä¸ä¸€è‡´" -#: parse_manifest.c:703 +#: ../../common/parse_manifest.c:891 #, c-format msgid "could not parse backup manifest: %s" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録をパースã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293 +#: pg_verifybackup.c:277 pg_verifybackup.c:286 pg_verifybackup.c:297 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" -#: pg_verifybackup.c:281 +#: pg_verifybackup.c:285 #, c-format msgid "no backup directory specified" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: pg_verifybackup.c:291 +#: pg_verifybackup.c:295 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")" -#: pg_verifybackup.c:299 +#: pg_verifybackup.c:303 #, c-format msgid "cannot specify both %s and %s" msgstr "%sã¨%sã®ä¸¡æ–¹ã‚’åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: pg_verifybackup.c:319 +#: pg_verifybackup.c:323 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "%2$sã«ã¯ãƒ—ログラム\"%1$s\"ãŒå¿…è¦ã§ã™ãŒã€\"%3$s\"ã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: pg_verifybackup.c:322 +#: pg_verifybackup.c:326 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "\"%2$s\"ãŒãƒ—ログラム\"%1$s\"を見ã¤ã‘ã¾ã—ãŸãŒã€ã“れã¯%3$sã¨åŒã˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: pg_verifybackup.c:378 +#: pg_verifybackup.c:381 #, c-format msgid "backup successfully verified\n" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ãŒæ­£å¸¸ã«æ¤œè¨¼ã•れã¾ã—ãŸ\n" -#: pg_verifybackup.c:404 pg_verifybackup.c:748 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: pg_verifybackup.c:408 +#: pg_verifybackup.c:410 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: pg_verifybackup.c:428 pg_verifybackup.c:779 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "ファイル\"%s\"ã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ: %m" - -#: pg_verifybackup.c:431 +#: pg_verifybackup.c:440 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$lldãƒã‚¤ãƒˆã®ã†ã¡%2$dãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" -#: pg_verifybackup.c:491 +#: pg_verifybackup.c:478 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "ファイル\"%1$s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %3$lldãƒã‚¤ãƒˆã®ã†ã¡%2$lldãƒã‚¤ãƒˆã‚’読ã¿è¾¼ã¿ã¾ã—ãŸ" + +#: pg_verifybackup.c:561 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録内ã®é‡è¤‡ãƒ‘スå: \"%s\"" -#: pg_verifybackup.c:554 pg_verifybackup.c:561 +#: pg_verifybackup.c:624 pg_verifybackup.c:631 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_verifybackup.c:593 +#: pg_verifybackup.c:663 #, c-format msgid "could not close directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_verifybackup.c:613 +#: pg_verifybackup.c:683 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "\"%s\"ã¨ã„ã†ãƒ•ァイルã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®æƒ…報をå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_verifybackup.c:636 +#: pg_verifybackup.c:706 #, c-format msgid "\"%s\" is not a file or directory" msgstr "\"%s\"ã¯ãƒ•ァイルã¾ãŸã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚りã¾ã›ã‚“" -#: pg_verifybackup.c:646 +#: pg_verifybackup.c:716 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "\"%s\"ã¯ãƒ‡ã‚£ã‚¹ã‚¯ã«å­˜åœ¨ã—ã¾ã™ãŒã€ç›®éŒ²ã«ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: pg_verifybackup.c:658 +#: pg_verifybackup.c:728 #, c-format msgid "\"%s\" has size %lld on disk but size %zu in the manifest" msgstr "\"%s\"ã¯ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã§ã®ã‚µã‚¤ã‚ºã¯%lldã§ã™ãŒã€ç›®éŒ²ä¸Šã¯%zuã¨ãªã£ã¦ã„ã¾ã™" -#: pg_verifybackup.c:689 +#: pg_verifybackup.c:768 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: CRCãŒæ­£ã—ãã‚りã¾ã›ã‚“" + +#: pg_verifybackup.c:772 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: 予期ã—ãªã„制御ファイルãƒãƒ¼ã‚¸ãƒ§ãƒ³" + +#: pg_verifybackup.c:777 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: 目録ã®ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ãŒ%lluã§ã™ãŒã€åˆ¶å¾¡ãƒ•ァイルã§ã¯%lluã§ã™" + +#: pg_verifybackup.c:801 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "\"%s\"ã¯ç›®éŒ²ã«ã¯å­˜åœ¨ã—ã¾ã™ãŒã€ãƒ‡ã‚£ã‚¹ã‚¯ã«ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: pg_verifybackup.c:756 +#: pg_verifybackup.c:873 #, c-format msgid "could not initialize checksum of file \"%s\"" msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®åˆæœŸåŒ–ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_verifybackup.c:768 +#: pg_verifybackup.c:885 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®æ›´æ–°ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_verifybackup.c:785 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - -#: pg_verifybackup.c:804 +#: pg_verifybackup.c:921 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "file\"%s\"ã¯%zuãƒã‚¤ãƒˆã‚’å«ã‚€å¿…è¦ãŒã‚りã¾ã™ãŒã€%zuãƒã‚¤ãƒˆãŒèª­ã¿è¾¼ã¾ã‚Œã¾ã—ãŸ" -#: pg_verifybackup.c:814 +#: pg_verifybackup.c:931 #, c-format msgid "could not finalize checksum of file \"%s\"" msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®å®Œäº†ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_verifybackup.c:822 +#: pg_verifybackup.c:939 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã®é•·ã•ã¯%dã§ã™ãŒã€äºˆæœŸã•れるã®ã¯%dã§ã™" -#: pg_verifybackup.c:826 +#: pg_verifybackup.c:943 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "ファイル\"%s\"ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸€è‡´ã—ã¾ã›ã‚“" -#: pg_verifybackup.c:851 +#: pg_verifybackup.c:969 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "タイムライン%uã®WALã®ãƒ‘ースã«å¤±æ•—ã—ã¾ã—ãŸ" -#: pg_verifybackup.c:965 +#: pg_verifybackup.c:1072 #, c-format msgid "%*s/%s kB (%d%%) verified" msgstr "%*s/%s kB (%d%%) 検証ã—ã¾ã—ãŸ" -#: pg_verifybackup.c:982 +#: pg_verifybackup.c:1089 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -439,7 +529,7 @@ msgstr "" "%sã¯ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—目録ã«å¯¾ã—ã¦ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を検証ã—ã¾ã™ã€‚\n" "\n" -#: pg_verifybackup.c:983 +#: pg_verifybackup.c:1090 #, c-format msgid "" "Usage:\n" @@ -450,62 +540,62 @@ msgstr "" " %s [オプション]... BACKUPDIR\n" "\n" -#: pg_verifybackup.c:984 +#: pg_verifybackup.c:1091 #, c-format msgid "Options:\n" msgstr "オプション:\n" -#: pg_verifybackup.c:985 +#: pg_verifybackup.c:1092 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error エラー時ã«ç›´ã¡ã«çµ‚了ã™ã‚‹\n" -#: pg_verifybackup.c:986 +#: pg_verifybackup.c:1093 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=RELATIVE_PATH 指示ã•れãŸãƒ‘スを無視\n" -#: pg_verifybackup.c:987 +#: pg_verifybackup.c:1094 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=PATH 目録ã¨ã—ã¦æŒ‡å®šã—ãŸãƒ‘スを使用ã™ã‚‹\n" -#: pg_verifybackup.c:988 +#: pg_verifybackup.c:1095 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal WALファイルをパースã—よã†ã¨ã—ãªã„\n" -#: pg_verifybackup.c:989 +#: pg_verifybackup.c:1096 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress 進行状æ³ã‚’表示\n" -#: pg_verifybackup.c:990 +#: pg_verifybackup.c:1097 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet エラー以外何も出力ã—ãªã„\n" -#: pg_verifybackup.c:991 +#: pg_verifybackup.c:1098 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums ãƒã‚§ãƒƒã‚¯ã‚µãƒ æ¤œè¨¼ã‚’スキップ\n" -#: pg_verifybackup.c:992 +#: pg_verifybackup.c:1099 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=PATH WALãƒ•ã‚¡ã‚¤ãƒ«ã«æŒ‡å®šã—ãŸãƒ‘スを使用ã™ã‚‹\n" -#: pg_verifybackup.c:993 +#: pg_verifybackup.c:1100 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: pg_verifybackup.c:994 +#: pg_verifybackup.c:1101 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: pg_verifybackup.c:995 +#: pg_verifybackup.c:1102 #, c-format msgid "" "\n" @@ -514,7 +604,28 @@ msgstr "" "\n" "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: pg_verifybackup.c:996 +#: pg_verifybackup.c:1103 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" + +#~ msgid " -F, --format=p|t backup format (plain, tar)\n" +#~ msgstr " -F, --format=p|t 出力フォーマット(plain, tar)\n" + +#~ msgid "\"%s\" is not a plain file" +#~ msgstr "\"%s\"ã¯é€šå¸¸ãƒ•ァイルã§ã¯ã‚りã¾ã›ã‚“" + +#~ msgid "You must use -n or --no-parse-wal when verifying a tar-format backup." +#~ msgstr "tarフォーマットã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を検証ã™ã‚‹ã¨ãã«ã¯ -n ã¾ãŸã¯ --no-parse-wal を使ã†å¿…è¦ãŒã‚りã¾ã™ã€‚" + +#~ msgid "file \"%s\" is not expected in a tar format backup" +#~ msgstr "tarå½¢å¼ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã§ã¯ãƒ•ァイル\"%s\"ã¯æƒ³å®šå¤–ã§ã™" + +#~ msgid "invalid backup format \"%s\", must be \"plain\" or \"tar\"" +#~ msgstr "䏿­£ãªãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—フォーマット\"%s\"ã€\"plain\"ã‹\"tar\"ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#~ msgid "out of memory while constructing error description" +#~ msgstr "ã‚¨ãƒ©ãƒ¼è¨˜è¿°ã®æ§‹ç¯‰ä¸­ã«ãƒ¡ãƒ¢ãƒªä¸è¶³" + +#~ msgid "pg_waldump cannot read tar files" +#~ msgstr "pg_waldumpã¯tarファイルを読ã‚ã¾ã›ã‚“" diff --git a/src/bin/pg_verifybackup/po/ka.po b/src/bin/pg_verifybackup/po/ka.po index 69b6e7a85dbfe..7876f68394bd5 100644 --- a/src/bin/pg_verifybackup/po/ka.po +++ b/src/bin/pg_verifybackup/po/ka.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_verifybackup (PostgreSQL) 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-19 11:17+0000\n" -"PO-Revision-Date: 2023-04-20 08:19+0200\n" +"POT-Creation-Date: 2024-08-29 17:48+0000\n" +"PO-Revision-Date: 2024-08-29 22:31+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -38,6 +38,79 @@ msgstr "დეტáƒáƒšáƒ”ბი: " msgid "hint: " msgstr "მინიშნებáƒ: " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:110 pg_verifybackup.c:438 +#: pg_verifybackup.c:476 pg_verifybackup.c:896 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\"-ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %zu-დáƒáƒœ" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: pg_verifybackup.c:902 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რáƒáƒ  ემთხვევáƒ" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘ის შესáƒáƒ«áƒšáƒ შეუსáƒáƒ‘áƒáƒ›áƒáƒ‘რpg_control ფáƒáƒ˜áƒšáƒ˜áƒ¡ შესáƒáƒœáƒáƒ®áƒáƒ“ გáƒáƒ›áƒáƒ§áƒ”ნებული \n" +"ბáƒáƒ˜áƒ¢áƒ”ბის მიმდევრáƒáƒ‘რშესáƒáƒ«áƒšáƒáƒ áƒáƒ  ემთხვეáƒáƒ“ეს áƒáƒ› პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ მიერ გáƒáƒ›áƒáƒ§áƒ”ნებულს. áƒáƒ› შემთხვევáƒáƒ¨áƒ˜ ქვემáƒáƒ— \n" +"მáƒáƒªáƒ”მული შედეგები áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იქნებრდრPostgreSQL ეს áƒáƒ’ებრáƒáƒ› მáƒáƒœáƒáƒªáƒ”მთრსáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ესთáƒáƒœ შეუთáƒáƒ•სებელი იქნებáƒ." + +#: ../../common/controldata_utils.c:230 pg_verifybackup.c:406 +#: pg_verifybackup.c:865 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/controldata_utils.c:268 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:853 +#, c-format +msgid "out of memory" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "წáƒáƒ áƒ›áƒáƒ¢áƒ”ბáƒ" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "სáƒáƒ›áƒ˜áƒ–ნე ბუფერი ძáƒáƒšáƒ˜áƒáƒœ პáƒáƒ¢áƒáƒ áƒáƒ" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "OpenSSL -ის სეცდáƒáƒ›áƒ" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format @@ -49,396 +122,412 @@ msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" -#: ../../common/jsonapi.c:1144 +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "რეკურსიულ დáƒáƒ¦áƒ›áƒáƒ•áƒáƒš დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელს ინკრემენტული lexer-ის გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ  შეუძლიáƒ." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "ინკრემენტულ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელს ინკრემენტული lexer სჭირდებáƒ." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON მეტისმეტáƒáƒ“ ღრმáƒáƒ“áƒáƒ ერთმáƒáƒœáƒ”თში ჩáƒáƒšáƒáƒ’ებული. მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ დáƒáƒ¡áƒáƒ¨áƒ•ები სიღრმერ6400." + +#: ../../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "სპეციáƒáƒšáƒ£áƒ áƒ˜ მიმდევრáƒáƒ‘რ\"\\%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ." +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "სპეციáƒáƒšáƒ£áƒ áƒ˜ მიმდევრáƒáƒ‘რ\"\\%.*s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ." -#: ../../common/jsonapi.c:1147 +#: ../../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "სიმბáƒáƒšáƒ კáƒáƒ“ით 0x%02x áƒáƒ£áƒªáƒ˜áƒšáƒ”ბლáƒáƒ“ ეკრáƒáƒœáƒ˜áƒ áƒ”ბული უნდრიყáƒáƒ¡." -#: ../../common/jsonapi.c:1150 +#: ../../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "მáƒáƒ•ელáƒáƒ“ი შეყვáƒáƒœáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ¡, მáƒáƒ’რáƒáƒ› მივიღე \"%s\"." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი შეყვáƒáƒœáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ¡, მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." -#: ../../common/jsonapi.c:1153 +#: ../../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "მáƒáƒ•ელáƒáƒ“ი მáƒáƒ¡áƒ˜áƒ•ის ელემენტს áƒáƒœ \"]\", მáƒáƒ’რáƒáƒ› მივიღე \"%s\"." +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი მáƒáƒ¡áƒ˜áƒ•ის ელემენტს áƒáƒœ \"]\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." -#: ../../common/jsonapi.c:1156 +#: ../../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "მáƒáƒ•ელáƒáƒ“ი \",\" áƒáƒœ \"]\", მáƒáƒ’რáƒáƒ› მივიღე \"%s\"." +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი \",\" áƒáƒœ \"]\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." -#: ../../common/jsonapi.c:1159 +#: ../../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "მáƒáƒ•ელáƒáƒ“ი \":\", მáƒáƒ’რáƒáƒ› მივიღე \"%s\"." +msgid "Expected \":\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი \":\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." -#: ../../common/jsonapi.c:1162 +#: ../../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "მáƒáƒ•ელáƒáƒ“ი JSON მნიშვნელáƒáƒ‘áƒáƒ¡. მივიღე \"%s\"." +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი JSON მნიშვნელáƒáƒ‘áƒáƒ¡. მივიღე \"%.*s\"." -#: ../../common/jsonapi.c:1165 +#: ../../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "შეყვáƒáƒœáƒ˜áƒ¡ სტრიქáƒáƒœáƒ˜ მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ." -#: ../../common/jsonapi.c:1167 +#: ../../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "მáƒáƒ•ელáƒáƒ“ი სტრიქáƒáƒœáƒ¡ áƒáƒœ \"}\", მáƒáƒ’რáƒáƒ› მივიღე \"%s\"." +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი სტრიქáƒáƒœáƒ¡ áƒáƒœ \"}\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." -#: ../../common/jsonapi.c:1170 +#: ../../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "მáƒáƒ•ელáƒáƒ“ი \",\", áƒáƒœ \"}\", მáƒáƒ’რáƒáƒ› მივიღე \"%s\"." +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი \",\", áƒáƒœ \"}\", მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." -#: ../../common/jsonapi.c:1173 +#: ../../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "მáƒáƒ•ელáƒáƒ“ი სტრიქáƒáƒœáƒ¡, მáƒáƒ’რáƒáƒ› მივიღე \"%s\"." +msgid "Expected string, but found \"%.*s\"." +msgstr "მáƒáƒ•ელáƒáƒ“ი სტრიქáƒáƒœáƒ¡, მáƒáƒ’რáƒáƒ› მივიღე \"%.*s\"." -#: ../../common/jsonapi.c:1176 +#: ../../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "კáƒáƒ“ი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: %s." +msgid "Token \"%.*s\" is invalid." +msgstr "კáƒáƒ“ი \"%.*s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ." -#: ../../common/jsonapi.c:1179 +#: ../../common/jsonapi.c:2164 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 ტექსტáƒáƒ“ ვერ გáƒáƒ áƒ“áƒáƒ˜áƒ¥áƒ›áƒœáƒ”ბáƒ." -#: ../../common/jsonapi.c:1181 +#: ../../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\" ს თექვსმეტáƒáƒ‘ითი ციფრები უნდრმáƒáƒ°áƒ§áƒ•ებáƒáƒ“ეს." -#: ../../common/jsonapi.c:1184 +#: ../../common/jsonapi.c:2169 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "უნიკáƒáƒ“ის სპეციáƒáƒšáƒ£áƒ áƒ˜ კáƒáƒ“ების გáƒáƒ›áƒáƒ§áƒ”ნებრკáƒáƒ“ის წერტილის მნიშვნელáƒáƒ‘ებáƒáƒ“ 007F-ის ზემáƒáƒ— შეუძლებელიáƒ, თუ კáƒáƒ“ირებრUTF-8 áƒáƒ áƒáƒ." -#: ../../common/jsonapi.c:1187 +#: ../../common/jsonapi.c:2178 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "უნიკáƒáƒ“ის სპეციáƒáƒšáƒ£áƒ áƒ˜ სიმბáƒáƒšáƒáƒ¡ მნიშვნელáƒáƒ‘ის თáƒáƒ áƒ’მნრსერვერის კáƒáƒ“ირებáƒáƒ¨áƒ˜ %s შეუძლებელიáƒ." -#: ../../common/jsonapi.c:1190 +#: ../../common/jsonapi.c:2185 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "უნიკáƒáƒ“ის მáƒáƒ¦áƒáƒš სურáƒáƒ’áƒáƒ¢áƒ¡ მáƒáƒ¦áƒáƒšáƒ˜ სურáƒáƒ’áƒáƒ¢áƒ˜ áƒáƒ  უნდრმáƒáƒ¡áƒ“ევდეს." -#: ../../common/jsonapi.c:1192 +#: ../../common/jsonapi.c:2187 msgid "Unicode low surrogate must follow a high surrogate." msgstr "უნიკáƒáƒ“ის დáƒáƒ‘áƒáƒšáƒ˜ სურáƒáƒ’áƒáƒ¢áƒ˜ მáƒáƒ¦áƒáƒš სურáƒáƒ’áƒáƒ¢áƒ¡ უნდრმისდევდეს." -#: parse_manifest.c:150 -msgid "parsing failed" -msgstr "დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:855 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: parse_manifest.c:152 +#: ../../common/parse_manifest.c:204 ../../common/parse_manifest.c:261 msgid "manifest ended unexpectedly" msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტი მáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ" -#: parse_manifest.c:191 +#: ../../common/parse_manifest.c:210 ../../common/parse_manifest.c:862 +#, c-format +msgid "could not update checksum of manifest" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბის შეცდáƒáƒ›áƒ" + +#: ../../common/parse_manifest.c:302 msgid "unexpected object start" msgstr "áƒáƒ‘იექტის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜" -#: parse_manifest.c:226 +#: ../../common/parse_manifest.c:337 msgid "unexpected object end" msgstr "áƒáƒ‘იექტის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" -#: parse_manifest.c:255 +#: ../../common/parse_manifest.c:366 msgid "unexpected array start" msgstr "მáƒáƒ¡áƒ˜áƒ•ის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜" -#: parse_manifest.c:280 +#: ../../common/parse_manifest.c:391 msgid "unexpected array end" msgstr "მáƒáƒ¡áƒ˜áƒ•ის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" -#: parse_manifest.c:307 +#: ../../common/parse_manifest.c:418 msgid "expected version indicator" msgstr "მáƒáƒ¡áƒáƒšáƒáƒ“ნელი ვერსიის მáƒáƒ©áƒ•ენებელი" -#: parse_manifest.c:336 +#: ../../common/parse_manifest.c:454 msgid "unrecognized top-level field" msgstr "უცნáƒáƒ‘ი ველი ზედრდáƒáƒœáƒ”ზე" -#: parse_manifest.c:355 +#: ../../common/parse_manifest.c:473 msgid "unexpected file field" msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი ველი ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის" -#: parse_manifest.c:369 +#: ../../common/parse_manifest.c:487 msgid "unexpected WAL range field" msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი ველი WAL-ის დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒ¡áƒ—ვის" -#: parse_manifest.c:375 +#: ../../common/parse_manifest.c:493 msgid "unexpected object field" msgstr "áƒáƒ‘იექტის მáƒáƒ£áƒšáƒáƒ“ნელი ველი" -#: parse_manifest.c:407 +#: ../../common/parse_manifest.c:583 +msgid "unexpected scalar" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი სკáƒáƒšáƒáƒ áƒ˜" + +#: ../../common/parse_manifest.c:609 +msgid "manifest version not an integer" +msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის ვერსირმთელი რიცხვი áƒáƒ áƒáƒ" + +#: ../../common/parse_manifest.c:613 msgid "unexpected manifest version" msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის მáƒáƒ£áƒšáƒáƒ“ნელი ვერსიáƒ" -#: parse_manifest.c:458 -msgid "unexpected scalar" -msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი სკáƒáƒšáƒáƒ áƒ˜" +#: ../../common/parse_manifest.c:637 +msgid "system identifier in manifest not an integer" +msgstr "სისტემის იდენფიტიკáƒáƒ¢áƒáƒ áƒ˜ მáƒáƒœáƒ˜áƒ¤áƒ”სტში მთელი რიცხვი áƒáƒ áƒáƒ" -#: parse_manifest.c:484 +#: ../../common/parse_manifest.c:662 msgid "missing path name" msgstr "áƒáƒ™áƒšáƒ˜áƒ ბილიკის სáƒáƒ®áƒ”ლი" -#: parse_manifest.c:487 +#: ../../common/parse_manifest.c:665 msgid "both path name and encoded path name" msgstr "áƒáƒ áƒ˜áƒ•ე, ბილიკის სáƒáƒ®áƒ”ლი დრბილიკის კáƒáƒ“ირებული სáƒáƒ®áƒ”ლი" -#: parse_manifest.c:489 +#: ../../common/parse_manifest.c:667 msgid "missing size" msgstr "ზáƒáƒ›áƒ áƒáƒ™áƒšáƒ˜áƒ" -#: parse_manifest.c:492 +#: ../../common/parse_manifest.c:670 msgid "checksum without algorithm" msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მის გáƒáƒ áƒ”შე" -#: parse_manifest.c:506 +#: ../../common/parse_manifest.c:684 msgid "could not decode file name" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის გáƒáƒ¨áƒ˜áƒ¤áƒ•რის შეცდáƒáƒ›áƒ" -#: parse_manifest.c:516 +#: ../../common/parse_manifest.c:694 msgid "file size is not an integer" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ ზáƒáƒ›áƒ მთელი რიცხვი áƒáƒ áƒáƒ" -#: parse_manifest.c:522 +#: ../../common/parse_manifest.c:700 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ უცნáƒáƒ‘ი áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მი: \"%s\"" -#: parse_manifest.c:541 +#: ../../common/parse_manifest.c:719 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": \"%s\"" -#: parse_manifest.c:584 +#: ../../common/parse_manifest.c:762 msgid "missing timeline" msgstr "áƒáƒ™áƒšáƒ˜áƒ დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი" -#: parse_manifest.c:586 +#: ../../common/parse_manifest.c:764 msgid "missing start LSN" msgstr "áƒáƒ™áƒšáƒ˜áƒ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ LSN" -#: parse_manifest.c:588 +#: ../../common/parse_manifest.c:766 msgid "missing end LSN" msgstr "áƒáƒ™áƒšáƒ˜áƒ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ¡ LSN" -#: parse_manifest.c:594 +#: ../../common/parse_manifest.c:772 msgid "timeline is not an integer" msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი მთელი რიცხვი áƒáƒ áƒáƒ" -#: parse_manifest.c:597 +#: ../../common/parse_manifest.c:775 msgid "could not parse start LSN" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ LSN-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" -#: parse_manifest.c:600 +#: ../../common/parse_manifest.c:778 msgid "could not parse end LSN" msgstr "სáƒáƒ‘áƒáƒšáƒáƒ LSN-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" -#: parse_manifest.c:661 +#: ../../common/parse_manifest.c:843 msgid "expected at least 2 lines" msgstr "ველáƒáƒ“ებáƒáƒ“ი სულ ცáƒáƒ¢áƒ 2 ხáƒáƒ–ს" -#: parse_manifest.c:664 +#: ../../common/parse_manifest.c:846 msgid "last line not newline-terminated" msgstr "ბáƒáƒšáƒ ხáƒáƒ–ი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ— áƒáƒ  სრულდებáƒ" -#: parse_manifest.c:669 -#, c-format -msgid "out of memory" -msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" - -#: parse_manifest.c:671 -#, c-format -msgid "could not initialize checksum of manifest" -msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" - -#: parse_manifest.c:673 -#, c-format -msgid "could not update checksum of manifest" -msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბის შეცდáƒáƒ›áƒ" - -#: parse_manifest.c:676 +#: ../../common/parse_manifest.c:865 #, c-format msgid "could not finalize checksum of manifest" msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ" -#: parse_manifest.c:680 +#: ../../common/parse_manifest.c:869 #, c-format msgid "manifest has no checksum" msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" -#: parse_manifest.c:684 +#: ../../common/parse_manifest.c:873 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: %s" -#: parse_manifest.c:688 +#: ../../common/parse_manifest.c:877 #, c-format msgid "manifest checksum mismatch" msgstr "მáƒáƒœáƒ˜áƒ¤áƒ”სტის სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ áƒáƒ  ემთხვევáƒ" -#: parse_manifest.c:703 +#: ../../common/parse_manifest.c:892 #, c-format msgid "could not parse backup manifest: %s" msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ მáƒáƒœáƒ˜áƒ¤áƒ”სტის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცრáƒáƒ›áƒ: %s" -#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293 +#: pg_verifybackup.c:277 pg_verifybackup.c:286 pg_verifybackup.c:297 #, c-format msgid "Try \"%s --help\" for more information." msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." -#: pg_verifybackup.c:281 +#: pg_verifybackup.c:285 #, c-format msgid "no backup directory specified" msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე მითითებული áƒáƒ áƒáƒ" -#: pg_verifybackup.c:291 +#: pg_verifybackup.c:295 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")" -#: pg_verifybackup.c:299 +#: pg_verifybackup.c:303 #, c-format msgid "cannot specify both %s and %s" msgstr "áƒáƒ áƒ˜áƒ•ე, %s დრ%s ერთáƒáƒ“ მითითებრშეუძლებელიáƒ" -#: pg_verifybackup.c:319 +#: pg_verifybackup.c:323 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "პრáƒáƒ’რáƒáƒ›áƒ \"%s\" სჭირდებრ\"%s\"-ს, მáƒáƒ’რáƒáƒ› იგივე სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში, სáƒáƒ“áƒáƒª \"%s\", ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" -#: pg_verifybackup.c:322 +#: pg_verifybackup.c:326 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "პრáƒáƒ’რáƒáƒ›áƒ „%s“ ნáƒáƒžáƒáƒ•ნირ„%s“-ის მიერ, მáƒáƒ’რáƒáƒ› ვერსიáƒ, იგივერáƒáƒ áƒáƒ, რáƒáƒª %s" -#: pg_verifybackup.c:378 +#: pg_verifybackup.c:381 #, c-format msgid "backup successfully verified\n" msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ წáƒáƒ áƒ›áƒáƒ¢áƒ”ბით შემáƒáƒ¬áƒ›áƒ“áƒ\n" -#: pg_verifybackup.c:404 pg_verifybackup.c:748 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" - -#: pg_verifybackup.c:408 +#: pg_verifybackup.c:410 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" -#: pg_verifybackup.c:428 pg_verifybackup.c:779 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" - -#: pg_verifybackup.c:431 +#: pg_verifybackup.c:440 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %lld-დáƒáƒœ" -#: pg_verifybackup.c:491 +#: pg_verifybackup.c:478 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვრშეუძლებელიáƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%lld %lld-დáƒáƒœ" + +#: pg_verifybackup.c:561 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "მáƒáƒ áƒ¥áƒáƒ¤áƒ¡ მáƒáƒœáƒ˜áƒ¤áƒ”სტში მითითებული ბილიკის სáƒáƒ®áƒ”ლი დუბლირებულიáƒ: %s" -#: pg_verifybackup.c:554 pg_verifybackup.c:561 +#: pg_verifybackup.c:624 pg_verifybackup.c:631 #, c-format msgid "could not open directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: pg_verifybackup.c:593 +#: pg_verifybackup.c:663 #, c-format msgid "could not close directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: pg_verifybackup.c:613 +#: pg_verifybackup.c:683 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒœ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის \"%s\" პáƒáƒ•ნრშეუძლებელიáƒ: %m" -#: pg_verifybackup.c:636 +#: pg_verifybackup.c:706 #, c-format msgid "\"%s\" is not a file or directory" msgstr "\"%s\" áƒáƒ áƒª ფáƒáƒ˜áƒšáƒ˜áƒ, áƒáƒ áƒª სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე" -#: pg_verifybackup.c:646 +#: pg_verifybackup.c:716 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "\"%s\" დისკზე áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’რáƒáƒ› áƒáƒ áƒ მáƒáƒœáƒ˜áƒ¤áƒ”სტში" -#: pg_verifybackup.c:658 +#: pg_verifybackup.c:728 #, c-format msgid "\"%s\" has size %lld on disk but size %zu in the manifest" msgstr "დისკზე \"%s\"-ის ზáƒáƒ›áƒáƒ %lld, მáƒáƒ’რáƒáƒ› მáƒáƒœáƒ˜áƒ¤áƒ”სტში მითითებული ზáƒáƒ›áƒáƒ %zu" -#: pg_verifybackup.c:689 +#: pg_verifybackup.c:768 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: CRC áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" + +#: pg_verifybackup.c:772 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: მáƒáƒ£áƒšáƒáƒ“ნელი სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡ ვერსიáƒ" + +#: pg_verifybackup.c:777 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: მáƒáƒœáƒ˜áƒ¤áƒ”სტის სისტემის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ %llu, მáƒáƒ’რáƒáƒ› კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ შეიცáƒáƒ•ს %llu" + +#: pg_verifybackup.c:801 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "\"%s\" áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს მáƒáƒœáƒ˜áƒ¤áƒ”სტში, მáƒáƒ’რáƒáƒ› áƒáƒ áƒ დისკზე" -#: pg_verifybackup.c:756 +#: pg_verifybackup.c:873 #, c-format msgid "could not initialize checksum of file \"%s\"" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: pg_verifybackup.c:768 +#: pg_verifybackup.c:885 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბის შეცდáƒáƒ›áƒ" -#: pg_verifybackup.c:785 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" - -#: pg_verifybackup.c:804 +#: pg_verifybackup.c:921 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" უნდრშეიცáƒáƒ•დეს %zu ბáƒáƒ˜áƒ¢áƒ¡ მáƒáƒ’რáƒáƒ› წáƒáƒ™áƒ˜áƒ—ხულირ%zu ბáƒáƒ˜áƒ¢áƒ˜" -#: pg_verifybackup.c:814 +#: pg_verifybackup.c:931 #, c-format msgid "could not finalize checksum of file \"%s\"" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის შეცდáƒáƒ›áƒ" -#: pg_verifybackup.c:822 +#: pg_verifybackup.c:939 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜áƒ¡ სიგრძერ%d, მáƒáƒ•ელáƒáƒ“ით %d" -#: pg_verifybackup.c:826 +#: pg_verifybackup.c:943 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\"" -#: pg_verifybackup.c:851 +#: pg_verifybackup.c:969 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "WAL-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ დრáƒáƒ˜áƒ¡ ხáƒáƒ–ისთვის %u" -#: pg_verifybackup.c:965 +#: pg_verifybackup.c:1072 #, c-format msgid "%*s/%s kB (%d%%) verified" msgstr "%*s/%s კბ (%d%%) გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ“áƒ" -#: pg_verifybackup.c:982 +#: pg_verifybackup.c:1089 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" "\n" msgstr "%s მáƒáƒ áƒ¥áƒáƒ¤áƒ¡ მის მáƒáƒœáƒ˜áƒ¤áƒ”სტს შეáƒáƒ“áƒáƒ áƒ”ბს\n" -#: pg_verifybackup.c:983 +#: pg_verifybackup.c:1090 #, c-format msgid "" "Usage:\n" @@ -449,62 +538,62 @@ msgstr "" " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... მáƒáƒ áƒ¥áƒáƒ¤áƒ˜áƒ¡áƒ¡áƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" "\n" -#: pg_verifybackup.c:984 +#: pg_verifybackup.c:1091 #, c-format msgid "Options:\n" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: pg_verifybackup.c:985 +#: pg_verifybackup.c:1092 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error დáƒáƒ£áƒ§áƒáƒ•ნებლივი გáƒáƒ›áƒáƒ¡áƒ•ლრშეცდáƒáƒ›áƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜\n" -#: pg_verifybackup.c:986 +#: pg_verifybackup.c:1093 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=შედáƒáƒ áƒ”ბითი_ბილიკ ბითითებული ბილიკის იგნáƒáƒ áƒ˜\n" -#: pg_verifybackup.c:987 +#: pg_verifybackup.c:1094 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=ბილიკი მáƒáƒœáƒ˜áƒ¤áƒ”სტისთვის მითითებული ბილიკის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" -#: pg_verifybackup.c:988 +#: pg_verifybackup.c:1095 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal WAL ფáƒáƒ˜áƒšáƒ”ბი áƒáƒ  დáƒáƒ›áƒ£áƒ¨áƒáƒ•დებáƒ\n" -#: pg_verifybackup.c:989 +#: pg_verifybackup.c:1096 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress მიმდინáƒáƒ áƒ”áƒáƒ‘ის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებáƒ\n" -#: pg_verifybackup.c:990 +#: pg_verifybackup.c:1097 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet შეცდáƒáƒ›áƒ”ბის გáƒáƒ áƒ“რეკრáƒáƒœáƒ–ე áƒáƒ áƒáƒ¤áƒ”რი გáƒáƒ›áƒáƒ©áƒœáƒ“ებáƒ\n" -#: pg_verifybackup.c:991 +#: pg_verifybackup.c:1098 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ ჯáƒáƒ›áƒ”ბის შემáƒáƒ¬áƒ›áƒ”ბის გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ\n" -#: pg_verifybackup.c:992 +#: pg_verifybackup.c:1099 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=ბილიკი WAL ფáƒáƒ˜áƒšáƒ”ბისთვის მითითებული ბილიკის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" -#: pg_verifybackup.c:993 +#: pg_verifybackup.c:1100 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_verifybackup.c:994 +#: pg_verifybackup.c:1101 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_verifybackup.c:995 +#: pg_verifybackup.c:1102 #, c-format msgid "" "\n" @@ -513,7 +602,14 @@ msgstr "" "\n" "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n" -#: pg_verifybackup.c:996 +#: pg_verifybackup.c:1103 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" + +#~ msgid "parsing failed" +#~ msgstr "დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" + +#, c-format +#~ msgid "unexpected json parse error type: %d" +#~ msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი json-ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ˜áƒ¡ ტიპი: %d" diff --git a/src/bin/pg_verifybackup/po/ko.po b/src/bin/pg_verifybackup/po/ko.po index 06d9ce2844d6c..c618546d510fb 100644 --- a/src/bin/pg_verifybackup/po/ko.po +++ b/src/bin/pg_verifybackup/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n" +"Project-Id-Version: pg_verifybackup (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 20:43+0000\n" -"PO-Revision-Date: 2020-10-06 14:45+0900\n" +"POT-Creation-Date: 2025-01-17 04:47+0000\n" +"PO-Revision-Date: 2025-01-16 17:12+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: PostgreSQL Korea \n" "Language: ko\n" @@ -16,373 +16,520 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "심ê°: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "ì½ê¸°ìš©ìœ¼ë¡œ \"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:110 pg_verifybackup.c:438 +#: pg_verifybackup.c:476 pg_verifybackup.c:896 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: pg_verifybackup.c:902 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "ë°”ì´íЏ 순서 불ì¼ì¹˜" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, " +"and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"ë°”ì´íЏ 순서 ì¼ì¹˜í•˜ì§€ 않는 문제\n" +"ë°”ì´íЏ 순서 정보는 pg_control 파ì¼ì„ 저장할 때 사용ë˜ëŠ”ë°,\n" +"ì´ íŒŒì¼ì˜ ë°”ì´íЏ 순서 정보와 ì´ í”„ë¡œê·¸ëž¨ì—서 사용하는 순서 ì •ë³´ê°€ 다릅니다.\n" +"ì´ëŸ´ 경우, 출력 결과가 바르지 ì•Šì„ ìˆ˜ 있고,\n" +"ì„¤ì¹˜ëœ PostgreSQL 프로그램과 ë°ì´í„° 디렉터리가 호환ë˜ì§€ ì•Šì„ ìˆ˜ 있습니다." + +#: ../../common/controldata_utils.c:230 pg_verifybackup.c:406 +#: pg_verifybackup.c:865 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 쓸 수 ì—†ìŒ: %m" + +#: ../../common/controldata_utils.c:268 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ fsync í•  수 ì—†ìŒ: %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:852 +#, c-format +msgid "out of memory" +msgstr "메모리 부족" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "성공" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "ëŒ€ìƒ ë²„í¼ê°€ 너무 ì ìŒ" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "OpenSSL 실패" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "메모리 부족\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "null í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" -#: ../../common/jsonapi.c:1064 +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "ìž¬ê·€ì  í•˜ê°• 구문분ì„ì€ ì¦ë¶„형 어휘 ë¶„ì„ì„ í•  수 없습니다." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "ì¦ë¶„형 구문분ì„ì€ ì¦ë¶„형 어휘 ë¶„ì„ì´ í•„ìš”í•©ë‹ˆë‹¤." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON ê³„ì¸µì´ ë„ˆë¬´ 깊습니다. 최대 깊ì´ëŠ” 6400 단계입니다." + +#: ../../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "ìž˜ëª»ëœ ì´ìŠ¤ì¼€ì´í”„ ì¡°í•©: \"\\%s\"" +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "ìž˜ëª»ëœ ì´ìŠ¤ì¼€ì´í”„ ì¡°í•©: \"\\%.*s\"" -#: ../../common/jsonapi.c:1067 +#: ../../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x ê°’ì˜ ë¬¸ìžëŠ” ì´ìŠ¤ì¼€ì´í”„ ë˜ì–´ì•¼í•¨." -#: ../../common/jsonapi.c:1070 +#: ../../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "ìž…ë ¥ ìžë£Œì˜ ëì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%s\" ê°’ì´ ë” ìžˆìŒ." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "ìž…ë ¥ ìžë£Œì˜ ëì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%.*s\" ê°’ì´ ë” ìžˆìŒ." -#: ../../common/jsonapi.c:1073 +#: ../../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "\"]\" ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "ë°°ì—´ 요소나, \"]\" ê°€ í•„ìš”í•œë° \"%.*s\"ì´(ê°€) 있ìŒ" -#: ../../common/jsonapi.c:1076 +#: ../../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "\",\" ë˜ëŠ” \"]\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "\",\" ë˜ëŠ” \"]\"ê°€ í•„ìš”í•œë° \"%.*s\"ì´(ê°€) 있ìŒ" -#: ../../common/jsonapi.c:1079 +#: ../../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "\":\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" +msgid "Expected \":\", but found \"%.*s\"." +msgstr "\":\"ê°€ í•„ìš”í•œë° \"%.*s\"ì´(ê°€) 있ìŒ" -#: ../../common/jsonapi.c:1082 +#: ../../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "JSON ê°’ì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%s\" ê°’ìž„" +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "JSON ê°’ì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%.*s\" ê°’ìž„" -#: ../../common/jsonapi.c:1085 +#: ../../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "ìž…ë ¥ 문ìžì—´ì´ 예ìƒì¹˜ 않게 ë났ìŒ." -#: ../../common/jsonapi.c:1087 +#: ../../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "\"}\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "문ìžì—´ì´ë‚˜, \"}\"ê°€ í•„ìš”í•œë° \"%.*s\"ì´(ê°€) 있ìŒ" -#: ../../common/jsonapi.c:1090 +#: ../../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "\",\" ë˜ëŠ” \"}\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "\",\" ë˜ëŠ” \"}\"ê°€ í•„ìš”í•œë° \"%.*s\"ì´(ê°€) 있ìŒ" -#: ../../common/jsonapi.c:1093 +#: ../../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "문ìžì—´ ê°’ì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%s\" ê°’ìž„" +msgid "Expected string, but found \"%.*s\"." +msgstr "문ìžì—´ ê°’ì„ ê¸°ëŒ€í–ˆëŠ”ë°, \"%.*s\" ê°’ìž„" -#: ../../common/jsonapi.c:1096 +#: ../../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "ìž˜ëª»ëœ í† í°: \"%s\"" +msgid "Token \"%.*s\" is invalid." +msgstr "ìž˜ëª»ëœ í† í°: \"%.*s\"" -#: ../../common/jsonapi.c:1099 +#: ../../common/jsonapi.c:2164 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 ê°’ì€ text 형으로 변환할 수 ì—†ìŒ." -#: ../../common/jsonapi.c:1101 +#: ../../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\" í‘œê¸°ë²•ì€ ë’¤ì— 4ê°œì˜ 16진수가 와야합니다." -#: ../../common/jsonapi.c:1104 -msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." -msgstr "ì¸ì½”ë”©ì€ UTF8ì´ ì•„ë‹ ë•Œ 유니코드 ì´ìŠ¤ì¼€ì´í”„ ê°’ì€ 007F ì´ìƒ 코드 í¬ì¸íЏ 값으로 사용할 수 ì—†ìŒ." +#: ../../common/jsonapi.c:2169 +msgid "" +"Unicode escape values cannot be used for code point values above 007F when " +"the encoding is not UTF8." +msgstr "" +"ì¸ì½”ë”©ì€ UTF8ì´ ì•„ë‹ ë•Œ 유니코드 ì´ìŠ¤ì¼€ì´í”„ ê°’ì€ 007F ì´ìƒ 코드 í¬ì¸íЏ 값으" +"로 사용할 수 ì—†ìŒ." + +#: ../../common/jsonapi.c:2178 +#, c-format +msgid "" +"Unicode escape value could not be translated to the server's encoding %s." +msgstr "서버 ì¸ì½”ë”©ì´ %s ì¸ ê²½ìš° 해당 유니코드 ì´ìŠ¤ì¼€ì´í”„ ê°’ì„ ë³€í™˜í•  수 ì—†ìŒ." -#: ../../common/jsonapi.c:1106 +#: ../../common/jsonapi.c:2185 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "유니코드 ìƒìœ„ surrogate(딸림 코드)는 ìƒìœ„ 딸림 코드 ë’¤ì— ì˜¤ë©´ 안ë¨." -#: ../../common/jsonapi.c:1108 +#: ../../common/jsonapi.c:2187 msgid "Unicode low surrogate must follow a high surrogate." msgstr "유니코드 ìƒìœ„ surrogate(딸림 코드) ë’¤ì—는 하위 딸림 코드가 있어야 함." -#: parse_manifest.c:152 +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "메니페스트 ì²´í¬ì„¬ 초기화를 í•  수 ì—†ìŒ" + +#: ../../common/parse_manifest.c:203 ../../common/parse_manifest.c:260 msgid "manifest ended unexpectedly" msgstr "메니페스트가 비정ìƒì ìœ¼ë¡œ ë났ìŒ" -#: parse_manifest.c:191 +#: ../../common/parse_manifest.c:209 ../../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "메니페스트 ì²´í¬ì„¬ 갱신 í•  수 ì—†ìŒ" + +#: ../../common/parse_manifest.c:301 msgid "unexpected object start" msgstr "비정ìƒì ì¸ 개체 시작" -#: parse_manifest.c:224 +#: ../../common/parse_manifest.c:336 msgid "unexpected object end" msgstr "비정ìƒì ì¸ 개체 ë" -#: parse_manifest.c:251 +#: ../../common/parse_manifest.c:365 msgid "unexpected array start" msgstr "비정ìƒì ì¸ ë°°ì—´ 시작" -#: parse_manifest.c:274 +#: ../../common/parse_manifest.c:390 msgid "unexpected array end" msgstr "비정ìƒì ì¸ ë°°ì—´ ë" -#: parse_manifest.c:299 +#: ../../common/parse_manifest.c:417 msgid "expected version indicator" msgstr "버전 지시ìžê°€ 있어야 함" -#: parse_manifest.c:328 +#: ../../common/parse_manifest.c:453 msgid "unrecognized top-level field" msgstr "최ìƒìœ„ 필드를 알 수 ì—†ìŒ" -#: parse_manifest.c:347 +#: ../../common/parse_manifest.c:472 msgid "unexpected file field" msgstr "예ìƒì¹˜ 못한 íŒŒì¼ í•„ë“œ" -#: parse_manifest.c:361 +#: ../../common/parse_manifest.c:486 msgid "unexpected WAL range field" msgstr "예ìƒì¹˜ 못한 WAL 범위 필드" -#: parse_manifest.c:367 +#: ../../common/parse_manifest.c:492 msgid "unexpected object field" msgstr "예ìƒì¹˜ 못한 개체 필드" -#: parse_manifest.c:397 +#: ../../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "예ìƒì¹˜ 못한 스칼ë¼" + +#: ../../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "매니페ì´ìФ ë²„ì „ì´ ì •ìˆ˜ê°€ 아님" + +#: ../../common/parse_manifest.c:612 msgid "unexpected manifest version" msgstr "예ìƒì¹˜ 못한 메니페스트 버전" -#: parse_manifest.c:448 -msgid "unexpected scalar" -msgstr "예ìƒì¹˜ 못한 스칼ë¼" +#: ../../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "매니페ì´ìФ 안 system identifierê°€ 정수가 아님" -#: parse_manifest.c:472 +#: ../../common/parse_manifest.c:661 msgid "missing path name" msgstr "패스 ì´ë¦„ ë¹ ì§" -#: parse_manifest.c:475 +#: ../../common/parse_manifest.c:664 msgid "both path name and encoded path name" msgstr "패스 ì´ë¦„ê³¼ ì¸ì½”딩 ëœ íŒ¨ìŠ¤ ì´ë¦„ì´ í•¨ê»˜ 있ìŒ" -#: parse_manifest.c:477 +#: ../../common/parse_manifest.c:666 msgid "missing size" msgstr "í¬ê¸° ë¹ ì§" -#: parse_manifest.c:480 +#: ../../common/parse_manifest.c:669 msgid "checksum without algorithm" msgstr "알고리즘 없는 ì²´í¬ì„¬" -#: parse_manifest.c:494 +#: ../../common/parse_manifest.c:683 msgid "could not decode file name" msgstr "íŒŒì¼ ì´ë¦„ì„ ë””ì½”ë”©í•  수 ì—†ìŒ" -#: parse_manifest.c:504 +#: ../../common/parse_manifest.c:693 msgid "file size is not an integer" msgstr "íŒŒì¼ í¬ê¸°ê°€ 정수가 아님" -#: parse_manifest.c:510 +#: ../../common/parse_manifest.c:699 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "알 수 없는 ì²´í¬ì„¬ 알고리즘: \"%s\"" -#: parse_manifest.c:529 +#: ../../common/parse_manifest.c:718 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "\"%s\" 파ì¼ì˜ ì²´í¬ì„¬ì´ 잘못ë¨: \"%s\"" -#: parse_manifest.c:572 +#: ../../common/parse_manifest.c:761 msgid "missing timeline" msgstr "타임ë¼ì¸ ë¹ ì§" -#: parse_manifest.c:574 +#: ../../common/parse_manifest.c:763 msgid "missing start LSN" msgstr "시작 LSN ë¹ ì§" -#: parse_manifest.c:576 +#: ../../common/parse_manifest.c:765 msgid "missing end LSN" msgstr "ë LSN ë¹ ì§" -#: parse_manifest.c:582 +#: ../../common/parse_manifest.c:771 msgid "timeline is not an integer" msgstr "타임ë¼ì¸ì´ 정수가 아님" -#: parse_manifest.c:585 +#: ../../common/parse_manifest.c:774 msgid "could not parse start LSN" msgstr "시작 LSN ê°’ì„ ë¶„ì„í•  수 ì—†ìŒ" -#: parse_manifest.c:588 +#: ../../common/parse_manifest.c:777 msgid "could not parse end LSN" msgstr "ë LSN ê°’ì„ ë¶„ì„í•  수 ì—†ìŒ" -#: parse_manifest.c:649 +#: ../../common/parse_manifest.c:842 msgid "expected at least 2 lines" msgstr "ì ì–´ë„ 2ì¤„ì´ ë” ìžˆì–´ì•¼ 함" -#: parse_manifest.c:652 +#: ../../common/parse_manifest.c:845 msgid "last line not newline-terminated" msgstr "마지막 ì¤„ì— ì¤„ë°”ê¿ˆ 문ìžê°€ ì—†ìŒ" -#: parse_manifest.c:661 +#: ../../common/parse_manifest.c:864 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "메니페스트 ì²´í¬ì„¬ 마무리 작업 í•  수 ì—†ìŒ" + +#: ../../common/parse_manifest.c:868 #, c-format msgid "manifest has no checksum" msgstr "ë©”ë‹ˆíŽ˜ìŠ¤íŠ¸ì— ì²´í¬ì„¬ ì—†ìŒ" -#: parse_manifest.c:665 +#: ../../common/parse_manifest.c:872 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "ìž˜ëª»ëœ ë©”ë‹ˆíŽ˜ìŠ¤íŠ¸ ì²´í¬ì„¬: \"%s\"" -#: parse_manifest.c:669 +#: ../../common/parse_manifest.c:876 #, c-format msgid "manifest checksum mismatch" msgstr "메니페스트 ì²´í¬ì„¬ 불ì¼ì¹˜" -#: parse_manifest.c:683 +#: ../../common/parse_manifest.c:891 #, c-format msgid "could not parse backup manifest: %s" msgstr "백업 메니페스트 구문 ë¶„ì„ ì‹¤íŒ¨: %s" -#: pg_verifybackup.c:255 pg_verifybackup.c:265 pg_verifybackup.c:277 +#: pg_verifybackup.c:277 pg_verifybackup.c:286 pg_verifybackup.c:297 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "ìžì œí•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보십시오.\n" +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." -#: pg_verifybackup.c:264 +#: pg_verifybackup.c:285 #, c-format msgid "no backup directory specified" msgstr "백업 디렉터리를 지정하지 않았ìŒ" -#: pg_verifybackup.c:275 +#: pg_verifybackup.c:295 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìžë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")" -#: pg_verifybackup.c:298 +#: pg_verifybackup.c:303 #, c-format -msgid "" -"The program \"%s\" is needed by %s but was not found in the\n" -"same directory as \"%s\".\n" -"Check your installation." -msgstr "" -"\"%s\" í”„ë¡œê·¸ëž¨ì´ %s 작업ì—서 필요하지만 \"%s\" 프로그램ì´\n" -"있는 디렉터리 ë‚´ì— ì—†ìŠµë‹ˆë‹¤.\n" -"설치 ìƒíƒœë¥¼ 확ì¸í•´ 보세요." +msgid "cannot specify both %s and %s" +msgstr "%s 옵션과 %s ì˜µì…˜ì„ ê°™ì´ ì§€ì •í•  수는 ì—†ìŒ" -#: pg_verifybackup.c:303 +#: pg_verifybackup.c:323 #, c-format msgid "" -"The program \"%s\" was found by \"%s\"\n" -"but was not the same version as %s.\n" -"Check your installation." +"program \"%s\" is needed by %s but was not found in the same directory as " +"\"%s\"" msgstr "" -"\"%s\" í”„ë¡œê·¸ëž¨ì„ \"%s\" ìž‘ì—…ì„ ìœ„í•´ 찾았지만\n" -"%s 버전과 같지 않습니다.\n" -"설치 ìƒíƒœë¥¼ 확ì¸í•´ 보세요." +"\"%s\" í”„ë¡œê·¸ëž¨ì´ %s 작업ì—서 필요하지만 ê°™ì€ \"%s\" 디렉터리 ë‚´ì— ì—†ìŠµë‹ˆë‹¤." -#: pg_verifybackup.c:361 +#: pg_verifybackup.c:326 #, c-format -msgid "backup successfully verified\n" -msgstr "백업 검사 완료\n" +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "\"%s\" í”„ë¡œê·¸ëž¨ì„ \"%s\" ìž‘ì—…ì„ ìœ„í•´ 찾았지만 %s 버전과 같지 않습니다." -#: pg_verifybackup.c:387 pg_verifybackup.c:723 +#: pg_verifybackup.c:381 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" +msgid "backup successfully verified\n" +msgstr "백업 검사 완료\n" -#: pg_verifybackup.c:391 +#: pg_verifybackup.c:410 #, c-format msgid "could not stat file \"%s\": %m" msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m" -#: pg_verifybackup.c:411 pg_verifybackup.c:738 +#: pg_verifybackup.c:440 #, c-format -msgid "could not read file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" +msgid "could not read file \"%s\": read %d of %lld" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %lld" -#: pg_verifybackup.c:414 +#: pg_verifybackup.c:478 #, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %zu" +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %lld ì½ìŒ, ì „ì²´ %lld" -#: pg_verifybackup.c:474 +#: pg_verifybackup.c:561 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "백업 메니페스트 ì•ˆì— ê²½ë¡œ ì´ë¦„ì´ ì¤‘ë³µë¨: \"%s\"" -#: pg_verifybackup.c:537 pg_verifybackup.c:544 +#: pg_verifybackup.c:624 pg_verifybackup.c:631 #, c-format msgid "could not open directory \"%s\": %m" msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m" -#: pg_verifybackup.c:576 +#: pg_verifybackup.c:663 #, c-format msgid "could not close directory \"%s\": %m" msgstr "\"%s\" 디렉터리를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: pg_verifybackup.c:596 +#: pg_verifybackup.c:683 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "íŒŒì¼ ë˜ëŠ” 디렉터리 \"%s\"ì˜ ìƒíƒœë¥¼ 확ì¸í•  수 ì—†ìŒ: %m" -#: pg_verifybackup.c:619 +#: pg_verifybackup.c:706 #, c-format msgid "\"%s\" is not a file or directory" msgstr "\"%s\" ì´ë¦„ì€ íŒŒì¼ì´ë‚˜ 디렉터리가 아님" -#: pg_verifybackup.c:629 +#: pg_verifybackup.c:716 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "디스í¬ì—는 \"%s\" 개체가 있으나, 메니페스트 안ì—는 ì—†ìŒ" -#: pg_verifybackup.c:641 +#: pg_verifybackup.c:728 +#, c-format +msgid "\"%s\" has size %lld on disk but size %zu in the manifest" +msgstr "\"%s\" ì˜ ë””ìŠ¤í¬ í¬ê¸°ëŠ” %lld ì´ë‚˜ 메니페스트 안ì—는 %zu 입니다." + +#: pg_verifybackup.c:768 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: CRC ê°’ì´ ìž˜ëª»ë¨" + +#: pg_verifybackup.c:772 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: 예ìƒì¹˜ 못한 컨트롤 íŒŒì¼ ë²„ì „" + +#: pg_verifybackup.c:777 #, c-format -msgid "\"%s\" has size %zu on disk but size %zu in the manifest" -msgstr "\"%s\" ì˜ ë””ìŠ¤í¬ í¬ê¸°ëŠ” %zu ì´ë‚˜ 메니페스트 안ì—는 %zu 입니다" +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: manifest system identifier = %llu, 컨트롤 íŒŒì¼ = %llu" -#: pg_verifybackup.c:668 +#: pg_verifybackup.c:801 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "메니페스트 안ì—는 \"%s\" 개체가 있으나 디스í¬ì—는 ì—†ìŒ" -#: pg_verifybackup.c:744 +#: pg_verifybackup.c:873 #, c-format -msgid "could not close file \"%s\": %m" -msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" +msgid "could not initialize checksum of file \"%s\"" +msgstr "\"%s\" íŒŒì¼ ì²´í¬ì„¬ì„ 초기화 í•  수 ì—†ìŒ" -#: pg_verifybackup.c:763 +#: pg_verifybackup.c:885 +#, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "\"%s\" íŒŒì¼ ì²´í¬ì„¬ì„ 갱신할 수 ì—†ìŒ" + +#: pg_verifybackup.c:921 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "\"%s\" 파ì¼ì€ %zu ë°”ì´íЏì´ë‚˜ %zu ë°”ì´íŠ¸ë¥¼ ì½ìŒ" -#: pg_verifybackup.c:774 +#: pg_verifybackup.c:931 +#, c-format +msgid "could not finalize checksum of file \"%s\"" +msgstr "\"%s\" íŒŒì¼ ì²´í¬ì„¬ì„ 마무리 í•  수 ì—†ìŒ" + +#: pg_verifybackup.c:939 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "\"%s\" íŒŒì¼ ì²´í¬ì„¬ %d, 예ìƒë˜ëŠ” ê°’: %d" -#: pg_verifybackup.c:778 +#: pg_verifybackup.c:943 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "\"%s\" 파ì¼ì˜ ì²´í¬ì„¬ì´ ë§žì§€ 않ìŒ" -#: pg_verifybackup.c:804 +#: pg_verifybackup.c:969 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "타임ë¼ì¸ %uë²ˆì˜ WAL ë¶„ì„ ì˜¤ë¥˜" -#: pg_verifybackup.c:890 +#: pg_verifybackup.c:1072 +#, c-format +msgid "%*s/%s kB (%d%%) verified" +msgstr "%*s/%s kB (%d%%) 검사ë¨" + +#: pg_verifybackup.c:1089 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -391,7 +538,7 @@ msgstr "" "%s í”„ë¡œê·¸ëž¨ì€ ë°±ì—… 메니페스트로 ë°±ì—…ì„ ê²€ì‚¬í•©ë‹ˆë‹¤.\n" "\n" -#: pg_verifybackup.c:891 +#: pg_verifybackup.c:1090 #, c-format msgid "" "Usage:\n" @@ -402,57 +549,64 @@ msgstr "" " %s [옵션]... 백업디렉터리\n" "\n" -#: pg_verifybackup.c:892 +#: pg_verifybackup.c:1091 #, c-format msgid "Options:\n" msgstr "옵션들:\n" -#: pg_verifybackup.c:893 +#: pg_verifybackup.c:1092 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error 오류가 있으면 작업 중지\n" -#: pg_verifybackup.c:894 +#: pg_verifybackup.c:1093 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=ìƒëŒ€ê²½ë¡œ 지정한 경로 건너뜀\n" -#: pg_verifybackup.c:895 +#: pg_verifybackup.c:1094 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=경로 메니페스트 íŒŒì¼ ê²½ë¡œ 지정\n" -#: pg_verifybackup.c:896 +#: pg_verifybackup.c:1095 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal WAL íŒŒì¼ ê²€ì‚¬ 건너뜀\n" -#: pg_verifybackup.c:897 +#: pg_verifybackup.c:1096 #, c-format -msgid " -q, --quiet do not print any output, except for errors\n" -msgstr " -q, --quiet 오류를 빼고 나머지는 아무 ê²ƒë„ ì•ˆ 보여줌\n" +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress ì§„í–‰ 정보를 보여줌\n" -#: pg_verifybackup.c:898 +#: pg_verifybackup.c:1097 +#, c-format +msgid "" +" -q, --quiet do not print any output, except for errors\n" +msgstr "" +" -q, --quiet 오류를 빼고 나머지는 아무 ê²ƒë„ ì•ˆ 보여줌\n" + +#: pg_verifybackup.c:1098 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums ì²´í¬ì„¬ 검사 건너뜀\n" -#: pg_verifybackup.c:899 +#: pg_verifybackup.c:1099 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=경로 WAL 파ì¼ì´ 있는 경로 지정\n" -#: pg_verifybackup.c:900 +#: pg_verifybackup.c:1100 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: pg_verifybackup.c:901 +#: pg_verifybackup.c:1101 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: pg_verifybackup.c:902 +#: pg_verifybackup.c:1102 #, c-format msgid "" "\n" @@ -461,7 +615,10 @@ msgstr "" "\n" "ë¬¸ì œì  ë³´ê³  주소: <%s>\n" -#: pg_verifybackup.c:903 +#: pg_verifybackup.c:1103 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페ì´ì§€: <%s>\n" + +#~ msgid "parsing failed" +#~ msgstr "구문 ë¶„ì„ ì‹¤íŒ¨" diff --git a/src/bin/pg_verifybackup/po/meson.build b/src/bin/pg_verifybackup/po/meson.build index 181cf640e71a2..e0a83002ea5db 100644 --- a/src/bin/pg_verifybackup/po/meson.build +++ b/src/bin/pg_verifybackup/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_verifybackup-' + pg_version_major.to_string())] diff --git a/src/bin/pg_verifybackup/po/ru.po b/src/bin/pg_verifybackup/po/ru.po index 932e6de24f694..a5e7d099ba387 100644 --- a/src/bin/pg_verifybackup/po/ru.po +++ b/src/bin/pg_verifybackup/po/ru.po @@ -1,18 +1,18 @@ -# Alexander Lakhin , 2020, 2021, 2022. +# Alexander Lakhin , 2020, 2021, 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-27 14:52+0300\n" -"PO-Revision-Date: 2022-09-05 13:37+0300\n" +"POT-Creation-Date: 2025-02-08 07:44+0200\n" +"PO-Revision-Date: 2024-09-07 09:48+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Lokalize 19.12.3\n" #: ../../../src/common/logging.c:276 @@ -35,85 +35,177 @@ msgstr "подробноÑти: " msgid "hint: " msgstr "подÑказка: " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\" Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %m" + +#: ../../common/controldata_utils.c:110 pg_verifybackup.c:438 +#: pg_verifybackup.c:476 pg_verifybackup.c:896 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %zu)" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: pg_verifybackup.c:902 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неÑоответÑтвие порÑдка байт" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, " +"and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"возможно неÑоответÑтвие порÑдка байт\n" +"ПорÑдок байт в файле pg_control может не ÑоответÑтвовать иÑпользуемому\n" +"Ñтой программой. Ð’ Ñтом Ñлучае результаты будут неверными и\n" +"уÑтановленный PostgreSQL будет неÑовмеÑтим Ñ Ñтим каталогом данных." + +#: ../../common/controldata_utils.c:230 pg_verifybackup.c:406 +#: pg_verifybackup.c:865 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m" + +#: ../../common/controldata_utils.c:268 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:852 +#, c-format +msgid "out of memory" +msgstr "нехватка памÑти" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "уÑпех" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "буфер Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñлишком мал" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "ошибка OpenSSL" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "нехватка памÑти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" -#: ../../common/jsonapi.c:1075 +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "" +"Инкрементальный лекÑичеÑкий анализатор не подходит Ð´Ð»Ñ Ð½Ð¸ÑходÑщего " +"рекурÑивного разбора." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "" +"Ð”Ð»Ñ Ð¸Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ разбора требуетÑÑ Ð¸Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ñ‹Ð¹ лекÑичеÑкий " +"анализатор." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "" +"Слишком Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ñть JSON, макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð¾Ð¿ÑƒÑÑ‚Ð¸Ð¼Ð°Ñ Ð³Ð»ÑƒÐ±Ð¸Ð½Ð°: 6400." + +#: ../../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑпецпоÑледовательноÑть: \"\\%s\"." +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑпецпоÑледовательноÑть: \"\\%.*s\"." -#: ../../common/jsonapi.c:1078 +#: ../../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ Ñ ÐºÐ¾Ð´Ð¾Ð¼ 0x%02x необходимо Ñкранировать." -#: ../../common/jsonapi.c:1081 +#: ../../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "ОжидалÑÑ ÐºÐ¾Ð½ÐµÑ† текÑта, но обнаружено продолжение \"%s\"." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "ОжидалÑÑ ÐºÐ¾Ð½ÐµÑ† текÑта, но обнаружено продолжение \"%.*s\"." -#: ../../common/jsonapi.c:1084 +#: ../../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "ОжидалÑÑ Ñлемент маÑÑива или \"]\", но обнаружено \"%s\"." +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "ОжидалÑÑ Ñлемент маÑÑива или \"]\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:1087 +#: ../../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "ОжидалаÑÑŒ \",\" или \"]\", но обнаружено \"%s\"." +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "ОжидалаÑÑŒ \",\" или \"]\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:1090 +#: ../../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "ОжидалоÑÑŒ \":\", но обнаружено \"%s\"." +msgid "Expected \":\", but found \"%.*s\"." +msgstr "ОжидалоÑÑŒ \":\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:1093 +#: ../../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "ОжидалоÑÑŒ значение JSON, но обнаружено \"%s\"." +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "ОжидалоÑÑŒ значение JSON, но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:1096 +#: ../../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "Ðеожиданный конец входной Ñтроки." -#: ../../common/jsonapi.c:1098 +#: ../../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "ОжидалаÑÑŒ Ñтрока или \"}\", но обнаружено \"%s\"." +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "ОжидалаÑÑŒ Ñтрока или \"}\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:1101 +#: ../../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "ОжидалаÑÑŒ \",\" или \"}\", но обнаружено \"%s\"." +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "ОжидалаÑÑŒ \",\" или \"}\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:1104 +#: ../../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "ОжидалаÑÑŒ Ñтрока, но обнаружено \"%s\"." +msgid "Expected string, but found \"%.*s\"." +msgstr "ОжидалаÑÑŒ Ñтрока, но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:1107 +#: ../../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "Ошибочный Ñлемент текÑта \"%s\"." +msgid "Token \"%.*s\" is invalid." +msgstr "Ошибочный Ñлемент \"%.*s\"." -#: ../../common/jsonapi.c:1110 +#: ../../common/jsonapi.c:2164 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ в текÑÑ‚." -#: ../../common/jsonapi.c:1112 +#: ../../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" должны Ñледовать четыре шеÑтнадцатеричные цифры." -#: ../../common/jsonapi.c:1115 +#: ../../common/jsonapi.c:2169 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -121,311 +213,331 @@ msgstr "" "Спецкоды Unicode Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ выше 007F можно иÑпользовать только Ñ " "кодировкой UTF8." -#: ../../common/jsonapi.c:1117 +#: ../../common/jsonapi.c:2178 +#, c-format +msgid "" +"Unicode escape value could not be translated to the server's encoding %s." +msgstr "Спецкод Unicode Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ в Ñерверную кодировку %s." + +#: ../../common/jsonapi.c:2185 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "" "Старшее Ñлово Ñуррогата Unicode не может Ñледовать за другим Ñтаршим Ñловом." -#: ../../common/jsonapi.c:1119 +#: ../../common/jsonapi.c:2187 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Младшее Ñлово Ñуррогата Unicode должно Ñледовать за Ñтаршим Ñловом." -#: parse_manifest.c:150 -msgid "parsing failed" -msgstr "ошибка при разборе" +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:854 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "не удалоÑÑŒ подготовить контекÑÑ‚ контрольной Ñуммы манифеÑта" -#: parse_manifest.c:152 +#: ../../common/parse_manifest.c:203 ../../common/parse_manifest.c:260 msgid "manifest ended unexpectedly" msgstr "неожиданный конец манифеÑта" -#: parse_manifest.c:191 +#: ../../common/parse_manifest.c:209 ../../common/parse_manifest.c:861 +#, c-format +msgid "could not update checksum of manifest" +msgstr "не удалоÑÑŒ изменить контекÑÑ‚ контрольной Ñуммы манифеÑта" + +#: ../../common/parse_manifest.c:301 msgid "unexpected object start" msgstr "неожиданное начало объекта" -#: parse_manifest.c:224 +#: ../../common/parse_manifest.c:336 msgid "unexpected object end" msgstr "неожиданный конец объекта" -#: parse_manifest.c:251 +#: ../../common/parse_manifest.c:365 msgid "unexpected array start" msgstr "неожиданное начало маÑÑива" -#: parse_manifest.c:274 +#: ../../common/parse_manifest.c:390 msgid "unexpected array end" msgstr "неожиданный конец маÑÑива" -#: parse_manifest.c:299 +#: ../../common/parse_manifest.c:417 msgid "expected version indicator" msgstr "ожидалоÑÑŒ указание верÑии" -#: parse_manifest.c:328 +#: ../../common/parse_manifest.c:453 msgid "unrecognized top-level field" msgstr "нераÑпознанное поле на верхнем уровне" -#: parse_manifest.c:347 +#: ../../common/parse_manifest.c:472 msgid "unexpected file field" msgstr "неизвеÑтное поле Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°" -#: parse_manifest.c:361 +#: ../../common/parse_manifest.c:486 msgid "unexpected WAL range field" msgstr "неизвеÑтное поле в указании диапазона WAL" -#: parse_manifest.c:367 +#: ../../common/parse_manifest.c:492 msgid "unexpected object field" msgstr "неожиданное поле объекта" -#: parse_manifest.c:397 +#: ../../common/parse_manifest.c:582 +msgid "unexpected scalar" +msgstr "неожиданное ÑкалÑрное значение" + +#: ../../common/parse_manifest.c:608 +msgid "manifest version not an integer" +msgstr "верÑÐ¸Ñ Ð¼Ð°Ð½Ð¸Ñ„ÐµÑта не ÑвлÑетÑÑ Ñ†ÐµÐ»Ñ‹Ð¼ чиÑлом" + +#: ../../common/parse_manifest.c:612 msgid "unexpected manifest version" msgstr "Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¼Ð°Ð½Ð¸Ñ„ÐµÑта" -#: parse_manifest.c:448 -msgid "unexpected scalar" -msgstr "неожиданное ÑкалÑрное значение" +#: ../../common/parse_manifest.c:636 +msgid "system identifier in manifest not an integer" +msgstr "идентификатор ÑиÑтемы в манифеÑте не ÑвлÑетÑÑ Ñ†ÐµÐ»Ñ‹Ð¼ чиÑлом" -#: parse_manifest.c:472 +#: ../../common/parse_manifest.c:661 msgid "missing path name" msgstr "отÑутÑтвует указание пути" -#: parse_manifest.c:475 +#: ../../common/parse_manifest.c:664 msgid "both path name and encoded path name" -msgstr "указание пути задано в обычном виде и в закодированном" +msgstr "путь задан в обычном виде и в закодированном" -#: parse_manifest.c:477 +#: ../../common/parse_manifest.c:666 msgid "missing size" msgstr "отÑутÑтвует указание размера" -#: parse_manifest.c:480 +#: ../../common/parse_manifest.c:669 msgid "checksum without algorithm" msgstr "не задан алгоритм раÑчёта контрольной Ñуммы" -#: parse_manifest.c:494 +#: ../../common/parse_manifest.c:683 msgid "could not decode file name" msgstr "не удалоÑÑŒ декодировать Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°" -#: parse_manifest.c:504 +#: ../../common/parse_manifest.c:693 msgid "file size is not an integer" msgstr "размер файла не ÑвлÑетÑÑ Ñ†ÐµÐ»Ð¾Ñ‡Ð¸Ñленным" -#: parse_manifest.c:510 +#: ../../common/parse_manifest.c:699 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "нераÑпознанный алгоритм раÑчёта контрольных Ñумм: \"%s\"" -#: parse_manifest.c:529 +#: ../../common/parse_manifest.c:718 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\": \"%s\"" -#: parse_manifest.c:572 +#: ../../common/parse_manifest.c:761 msgid "missing timeline" msgstr "отÑутÑтвует Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸" -#: parse_manifest.c:574 +#: ../../common/parse_manifest.c:763 msgid "missing start LSN" msgstr "отÑутÑтвует начальный LSN" -#: parse_manifest.c:576 +#: ../../common/parse_manifest.c:765 msgid "missing end LSN" msgstr "отÑутÑтвует конечный LSN" -#: parse_manifest.c:582 +#: ../../common/parse_manifest.c:771 msgid "timeline is not an integer" -msgstr "Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ задаётÑÑ Ð½Ðµ целым чиÑлом" +msgstr "Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ задана не целым чиÑлом" -#: parse_manifest.c:585 +#: ../../common/parse_manifest.c:774 msgid "could not parse start LSN" msgstr "не удалоÑÑŒ разобрать начальный LSN" -#: parse_manifest.c:588 +#: ../../common/parse_manifest.c:777 msgid "could not parse end LSN" msgstr "не удалоÑÑŒ разобрать конечный LSN" -#: parse_manifest.c:649 +#: ../../common/parse_manifest.c:842 msgid "expected at least 2 lines" msgstr "ожидалоÑÑŒ как минимум 2 Ñтроки" -#: parse_manifest.c:652 +#: ../../common/parse_manifest.c:845 msgid "last line not newline-terminated" msgstr "поÑледнÑÑ Ñтрока не оканчиваетÑÑ Ñимволом новой Ñтроки" -#: parse_manifest.c:657 -#, c-format -msgid "out of memory" -msgstr "нехватка памÑти" - -#: parse_manifest.c:659 -#, c-format -msgid "could not initialize checksum of manifest" -msgstr "не удалоÑÑŒ подготовить контекÑÑ‚ контрольной Ñуммы манифеÑта" - -#: parse_manifest.c:661 -#, c-format -msgid "could not update checksum of manifest" -msgstr "не удалоÑÑŒ изменить контекÑÑ‚ контрольной Ñуммы манифеÑта" - -#: parse_manifest.c:664 +#: ../../common/parse_manifest.c:864 #, c-format msgid "could not finalize checksum of manifest" msgstr "не удалоÑÑŒ завершить раÑчёт контрольной Ñуммы манифеÑта" -#: parse_manifest.c:668 +#: ../../common/parse_manifest.c:868 #, c-format msgid "manifest has no checksum" msgstr "в манифеÑте нет контрольной Ñуммы" -#: parse_manifest.c:672 +#: ../../common/parse_manifest.c:872 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма в манифеÑте: \"%s\"" -#: parse_manifest.c:676 +#: ../../common/parse_manifest.c:876 #, c-format msgid "manifest checksum mismatch" msgstr "ошибка контрольной Ñуммы манифеÑта" -#: parse_manifest.c:691 +#: ../../common/parse_manifest.c:891 #, c-format msgid "could not parse backup manifest: %s" msgstr "не удалоÑÑŒ разобрать манифеÑÑ‚ копии: %s" -#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276 +#: pg_verifybackup.c:277 pg_verifybackup.c:286 pg_verifybackup.c:297 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." -#: pg_verifybackup.c:264 +#: pg_verifybackup.c:285 #, c-format msgid "no backup directory specified" msgstr "каталог копии не указан" -#: pg_verifybackup.c:274 +#: pg_verifybackup.c:295 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")" -#: pg_verifybackup.c:297 +#: pg_verifybackup.c:303 +#, c-format +msgid "cannot specify both %s and %s" +msgstr "указать %s и %s одновременно нельзÑ" + +#: pg_verifybackup.c:323 #, c-format msgid "" -"program \"%s\" is needed by %s but was not found in the same directory as \"" -"%s\"" +"program \"%s\" is needed by %s but was not found in the same directory as " +"\"%s\"" msgstr "программа \"%s\" нужна Ð´Ð»Ñ %s, но она не найдена в каталоге \"%s\"" -#: pg_verifybackup.c:300 +#: pg_verifybackup.c:326 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "" "программа \"%s\" найдена программой \"%s\", но её верÑÐ¸Ñ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð°ÐµÑ‚ÑÑ Ð¾Ñ‚ " "верÑии %s" -#: pg_verifybackup.c:356 +#: pg_verifybackup.c:381 #, c-format msgid "backup successfully verified\n" msgstr "ÐºÐ¾Ð¿Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÐ½Ð° уÑпешно\n" -#: pg_verifybackup.c:382 pg_verifybackup.c:718 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" - -#: pg_verifybackup.c:386 +#: pg_verifybackup.c:410 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" -#: pg_verifybackup.c:406 pg_verifybackup.c:745 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" - -#: pg_verifybackup.c:409 +#: pg_verifybackup.c:440 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %lld)" -#: pg_verifybackup.c:469 +#: pg_verifybackup.c:478 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %lld из %lld)" + +#: pg_verifybackup.c:561 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "дублирующийÑÑ Ð¿ÑƒÑ‚ÑŒ в манифеÑте копии: \"%s\"" -#: pg_verifybackup.c:532 pg_verifybackup.c:539 +#: pg_verifybackup.c:624 pg_verifybackup.c:631 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" -#: pg_verifybackup.c:571 +#: pg_verifybackup.c:663 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не удалоÑÑŒ закрыть каталог \"%s\": %m" -#: pg_verifybackup.c:591 +#: pg_verifybackup.c:683 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "не удалоÑÑŒ получить информацию о файле или каталоге \"%s\": %m" -#: pg_verifybackup.c:614 +#: pg_verifybackup.c:706 #, c-format msgid "\"%s\" is not a file or directory" msgstr "\"%s\" не указывает на файл или каталог" -#: pg_verifybackup.c:624 +#: pg_verifybackup.c:716 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "файл \"%s\" приÑутÑтвует на диÑке, но отÑутÑтвует в манифеÑте" -#: pg_verifybackup.c:636 +#: pg_verifybackup.c:728 #, c-format msgid "\"%s\" has size %lld on disk but size %zu in the manifest" msgstr "" "файл \"%s\" имеет размер на диÑке: %lld, тогда как размер в манифеÑте: %zu" -#: pg_verifybackup.c:663 +#: pg_verifybackup.c:768 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: ошибка CRC" + +#: pg_verifybackup.c:772 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющего файла" + +#: pg_verifybackup.c:777 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: идентификатор ÑиÑтемы в манифеÑте %llu, а в управлÑющем файле %llu" + +#: pg_verifybackup.c:801 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "файл \"%s\" приÑутÑтвует в манифеÑте, но отÑутÑтвует на диÑке" -#: pg_verifybackup.c:726 +#: pg_verifybackup.c:873 #, c-format msgid "could not initialize checksum of file \"%s\"" msgstr "не удалоÑÑŒ подготовить контекÑÑ‚ контрольной Ñуммы файла \"%s\"" -#: pg_verifybackup.c:738 +#: pg_verifybackup.c:885 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "не удалоÑÑŒ изменить контекÑÑ‚ контрольной Ñуммы файла \"%s\"" -#: pg_verifybackup.c:751 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m" - -#: pg_verifybackup.c:770 +#: pg_verifybackup.c:921 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "файл \"%s\" должен Ñодержать байт: %zu, но фактичеÑки прочитано: %zu" -#: pg_verifybackup.c:780 +#: pg_verifybackup.c:931 #, c-format msgid "could not finalize checksum of file \"%s\"" msgstr "не удалоÑÑŒ завершить раÑчёт контрольной Ñуммы файла \"%s\"" -#: pg_verifybackup.c:788 +#: pg_verifybackup.c:939 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "" "Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\" задана ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма размером %d, но ожидаемый размер: " "%d" -#: pg_verifybackup.c:792 +#: pg_verifybackup.c:943 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "ошибка контрольной Ñуммы Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð° \"%s\"" -#: pg_verifybackup.c:816 +#: pg_verifybackup.c:969 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "не удалоÑÑŒ разобрать WAL Ð´Ð»Ñ Ð»Ð¸Ð½Ð¸Ð¸ времени %u" -#: pg_verifybackup.c:902 +#: pg_verifybackup.c:1072 +#, c-format +msgid "%*s/%s kB (%d%%) verified" +msgstr "%*s/%s КБ (%d%%) проверено" + +#: pg_verifybackup.c:1089 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -434,7 +546,7 @@ msgstr "" "%s проверÑет резервную копию, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¼Ð°Ð½Ð¸Ñ„ÐµÑÑ‚ копии.\n" "\n" -#: pg_verifybackup.c:903 +#: pg_verifybackup.c:1090 #, c-format msgid "" "Usage:\n" @@ -445,62 +557,67 @@ msgstr "" " %s [ПÐРÐМЕТР]... КÐТÐЛОГ_КОПИИ\n" "\n" -#: pg_verifybackup.c:904 +#: pg_verifybackup.c:1091 #, c-format msgid "Options:\n" msgstr "Параметры:\n" -#: pg_verifybackup.c:905 +#: pg_verifybackup.c:1092 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error немедленный выход при ошибке\n" -#: pg_verifybackup.c:906 +#: pg_verifybackup.c:1093 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr "" " -i, --ignore=ОТÐОСИТЕЛЬÐЫЙ_ПУТЬ\n" " игнорировать заданный путь\n" -#: pg_verifybackup.c:907 +#: pg_verifybackup.c:1094 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=ПУТЬ иÑпользовать заданный файл манифеÑта\n" -#: pg_verifybackup.c:908 +#: pg_verifybackup.c:1095 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal не пытатьÑÑ Ñ€Ð°Ð·Ð±Ð¸Ñ€Ð°Ñ‚ÑŒ файлы WAL\n" -#: pg_verifybackup.c:909 +#: pg_verifybackup.c:1096 +#, c-format +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress показывать прогреÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸\n" + +#: pg_verifybackup.c:1097 #, c-format msgid "" " -q, --quiet do not print any output, except for errors\n" msgstr "" " -q, --quiet не выводить никаких Ñообщений, кроме ошибок\n" -#: pg_verifybackup.c:910 +#: pg_verifybackup.c:1098 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums пропуÑтить проверку контрольных Ñумм\n" -#: pg_verifybackup.c:911 +#: pg_verifybackup.c:1099 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr "" " -w, --wal-directory=ПУТЬ иÑпользовать заданный путь к файлам WAL\n" -#: pg_verifybackup.c:912 +#: pg_verifybackup.c:1100 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: pg_verifybackup.c:913 +#: pg_verifybackup.c:1101 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: pg_verifybackup.c:914 +#: pg_verifybackup.c:1102 #, c-format msgid "" "\n" @@ -509,10 +626,13 @@ msgstr "" "\n" "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: pg_verifybackup.c:915 +#: pg_verifybackup.c:1103 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" +#~ msgid "parsing failed" +#~ msgstr "ошибка при разборе" + #~ msgid "fatal: " #~ msgstr "важно: " diff --git a/src/bin/pg_verifybackup/po/sv.po b/src/bin/pg_verifybackup/po/sv.po index c2512f7b88a63..e2fe73ccab210 100644 --- a/src/bin/pg_verifybackup/po/sv.po +++ b/src/bin/pg_verifybackup/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_verifybackup # Copyright (C) 2020 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package. -# Dennis Björklund , 2020, 2021, 2022 +# Dennis Björklund , 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-11 13:46+0000\n" -"PO-Revision-Date: 2022-04-11 16:11+0200\n" +"POT-Creation-Date: 2024-08-31 06:18+0000\n" +"PO-Revision-Date: 2024-09-01 20:47+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,405 +17,510 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../../src/common/logging.c:268 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:275 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "varning: " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "detalj: " -#: ../../../src/common/logging.c:287 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "tips: " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "kunde inte öppna filen \"%s\" för läsning: %m" + +#: ../../common/controldata_utils.c:110 pg_verifybackup.c:438 +#: pg_verifybackup.c:476 pg_verifybackup.c:896 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "kunde inte läsa fil \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: pg_verifybackup.c:902 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "kunde inte stänga fil \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "byte-ordning stämmer inte" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "" +"possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "" +"möjligt fel i byteordning\n" +"Den byteordning som filen frÃ¥n pg_control lagrats med passar kanske\n" +"inte detta program. I sÃ¥ fall kan nedanstÃ¥ende resultat vara felaktiga\n" +"och PostgreSQL-installationen vara inkompatibel med databaskatalogen." + +#: ../../common/controldata_utils.c:230 pg_verifybackup.c:406 +#: pg_verifybackup.c:865 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "kunde inte öppna fil \"%s\": %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "kunde inte skriva fil \"%s\": %m" + +#: ../../common/controldata_utils.c:268 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "kunde inte fsync:a fil \"%s\": %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:853 +#, c-format +msgid "out of memory" +msgstr "slut pÃ¥ minne" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "lyckades" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "destinationsbuffer för liten" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "OpenSSL-fel" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "slut pÃ¥ minne\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" -#: ../../common/jsonapi.c:1078 +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "Recursive-descent-parser kan inte använda inkrementell lexer." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "Inkrementell parser kräver en inkrementell lexer." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON nästlad för djupt, maximal tillÃ¥tet djup är 6400." + +#: ../../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "Escape-sekvens \"\\%s\" är ogiltig." +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "Escape-sekvens \"\\%.*s\" är ogiltig." -#: ../../common/jsonapi.c:1081 +#: ../../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Tecken med värde 0x%02x mÃ¥ste escape:as." -#: ../../common/jsonapi.c:1084 +#: ../../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "Förväntade slut pÃ¥ indata, men hittade \"%s\"." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "Förväntade slut pÃ¥ indata, men hittade \"%.*s\"." -#: ../../common/jsonapi.c:1087 +#: ../../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "Färväntade array-element eller \"]\", men hittade \"%s\"." +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "Färväntade array-element eller \"]\", men hittade \"%.*s\"." -#: ../../common/jsonapi.c:1090 +#: ../../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "Förväntade \",\" eller \"]\", men hittade \"%s\"." +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "Förväntade \",\" eller \"]\", men hittade \"%.*s\"." -#: ../../common/jsonapi.c:1093 +#: ../../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "Förväntade sig \":\" men hittade \"%s\"." +msgid "Expected \":\", but found \"%.*s\"." +msgstr "Förväntade sig \":\" men hittade \"%.*s\"." -#: ../../common/jsonapi.c:1096 +#: ../../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "Förväntade JSON-värde, men hittade \"%s\"." +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "Förväntade JSON-värde, men hittade \"%.*s\"." -#: ../../common/jsonapi.c:1099 +#: ../../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "Indatasträngen avslutades oväntat." -#: ../../common/jsonapi.c:1101 +#: ../../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "Färväntade sträng eller \"}\", men hittade \"%s\"." +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "Färväntade sträng eller \"}\", men hittade \"%.*s\"." -#: ../../common/jsonapi.c:1104 +#: ../../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "Förväntade sig \",\" eller \"}\" men hittade \"%s\"." +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "Förväntade sig \",\" eller \"}\" men hittade \"%.*s\"." -#: ../../common/jsonapi.c:1107 +#: ../../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "Förväntade sträng, men hittade \"%s\"." +msgid "Expected string, but found \"%.*s\"." +msgstr "Förväntade sträng, men hittade \"%.*s\"." -#: ../../common/jsonapi.c:1110 +#: ../../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "Token \"%s\" är ogiltig." +msgid "Token \"%.*s\" is invalid." +msgstr "Token \"%.*s\" är ogiltig." -#: ../../common/jsonapi.c:1113 +#: ../../common/jsonapi.c:2164 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kan inte konverteras till text." -#: ../../common/jsonapi.c:1115 +#: ../../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\" mÃ¥ste följas av fyra hexdecimala siffror." -#: ../../common/jsonapi.c:1118 +#: ../../common/jsonapi.c:2169 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Escape-värden för unicode kan inte användas för kodpunkter med värde över 007F när kodningen inte är UTF8." -#: ../../common/jsonapi.c:1120 +#: ../../common/jsonapi.c:2178 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "Escape-värde för unicode kan inte översättas till serverns kodning %s." + +#: ../../common/jsonapi.c:2185 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodes övre surrogathalva fÃ¥r inte komma efter en övre surrogathalva." -#: ../../common/jsonapi.c:1122 +#: ../../common/jsonapi.c:2187 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Unicodes lägre surrogathalva mÃ¥ste följa en övre surrogathalva." -#: parse_manifest.c:150 -msgid "parsing failed" -msgstr "parsning misslyckades" +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:855 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "kunde inte initiera kontrollsumma för backup-manifest" -#: parse_manifest.c:152 +#: ../../common/parse_manifest.c:204 ../../common/parse_manifest.c:261 msgid "manifest ended unexpectedly" msgstr "manifestet avslutades oväntat" -#: parse_manifest.c:191 +#: ../../common/parse_manifest.c:210 ../../common/parse_manifest.c:862 +#, c-format +msgid "could not update checksum of manifest" +msgstr "kunde inte uppdatera kontrollsumma för backup-manifest" + +#: ../../common/parse_manifest.c:302 msgid "unexpected object start" msgstr "oväntad objektstart" -#: parse_manifest.c:224 +#: ../../common/parse_manifest.c:337 msgid "unexpected object end" msgstr "oväntat objektslut" -#: parse_manifest.c:251 +#: ../../common/parse_manifest.c:366 msgid "unexpected array start" msgstr "oväntad array-start" -#: parse_manifest.c:274 +#: ../../common/parse_manifest.c:391 msgid "unexpected array end" msgstr "oväntat array-slut" -#: parse_manifest.c:299 +#: ../../common/parse_manifest.c:418 msgid "expected version indicator" msgstr "förväntade en versionsindikator" -#: parse_manifest.c:328 +#: ../../common/parse_manifest.c:454 msgid "unrecognized top-level field" msgstr "okänt toppnivÃ¥fält" -#: parse_manifest.c:347 +#: ../../common/parse_manifest.c:473 msgid "unexpected file field" msgstr "oväntat filfält" -#: parse_manifest.c:361 +#: ../../common/parse_manifest.c:487 msgid "unexpected WAL range field" msgstr "oväntat WAL-intervall-fält" -#: parse_manifest.c:367 +#: ../../common/parse_manifest.c:493 msgid "unexpected object field" msgstr "oväntat objektfält" -#: parse_manifest.c:397 +#: ../../common/parse_manifest.c:583 +msgid "unexpected scalar" +msgstr "oväntad skalar" + +#: ../../common/parse_manifest.c:609 +msgid "manifest version not an integer" +msgstr "manifestversion är inte ett heltal" + +#: ../../common/parse_manifest.c:613 msgid "unexpected manifest version" msgstr "oväntad manifestversion" -#: parse_manifest.c:448 -msgid "unexpected scalar" -msgstr "oväntad skalar" +#: ../../common/parse_manifest.c:637 +msgid "system identifier in manifest not an integer" +msgstr "manifestets systemidentifierare är inte ett heltal" -#: parse_manifest.c:472 +#: ../../common/parse_manifest.c:662 msgid "missing path name" msgstr "saknas sökväg" -#: parse_manifest.c:475 +#: ../../common/parse_manifest.c:665 msgid "both path name and encoded path name" msgstr "bÃ¥de sökväg och kodad sökväg" -#: parse_manifest.c:477 +#: ../../common/parse_manifest.c:667 msgid "missing size" msgstr "saknar storlek" -#: parse_manifest.c:480 +#: ../../common/parse_manifest.c:670 msgid "checksum without algorithm" msgstr "kontrollsumma utan algoritm" -#: parse_manifest.c:494 +#: ../../common/parse_manifest.c:684 msgid "could not decode file name" msgstr "kunde inte avkoda filnamn" -#: parse_manifest.c:504 +#: ../../common/parse_manifest.c:694 msgid "file size is not an integer" msgstr "filstorlek är inte ett haltal" -#: parse_manifest.c:510 +#: ../../common/parse_manifest.c:700 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "okänd algoritm för kontrollsumma: \"%s\"" -#: parse_manifest.c:529 +#: ../../common/parse_manifest.c:719 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "ogiltig kontrollsumma för fil \"%s\": \"%s\"" -#: parse_manifest.c:572 +#: ../../common/parse_manifest.c:762 msgid "missing timeline" msgstr "saknar tidslinje" -#: parse_manifest.c:574 +#: ../../common/parse_manifest.c:764 msgid "missing start LSN" msgstr "saknar start-LSN" -#: parse_manifest.c:576 +#: ../../common/parse_manifest.c:766 msgid "missing end LSN" msgstr "saknar slut-LSN" -#: parse_manifest.c:582 +#: ../../common/parse_manifest.c:772 msgid "timeline is not an integer" msgstr "tidslinje är inte ett heltal" -#: parse_manifest.c:585 +#: ../../common/parse_manifest.c:775 msgid "could not parse start LSN" msgstr "kunde inte parsa start-LSN" -#: parse_manifest.c:588 +#: ../../common/parse_manifest.c:778 msgid "could not parse end LSN" msgstr "kunde inte parsa slut-LSN" -#: parse_manifest.c:649 +#: ../../common/parse_manifest.c:843 msgid "expected at least 2 lines" msgstr "förväntade minst tvÃ¥ rader" -#: parse_manifest.c:652 +#: ../../common/parse_manifest.c:846 msgid "last line not newline-terminated" msgstr "sista raden är inte nyradsterminerad" -#: parse_manifest.c:657 -#, c-format -msgid "out of memory" -msgstr "slut pÃ¥ minne" - -#: parse_manifest.c:659 -#, c-format -msgid "could not initialize checksum of manifest" -msgstr "kunde inte initiera kontrollsumma för backup-manifest" - -#: parse_manifest.c:661 -#, c-format -msgid "could not update checksum of manifest" -msgstr "kunde inte uppdatera kontrollsumma för backup-manifest" - -#: parse_manifest.c:664 +#: ../../common/parse_manifest.c:865 #, c-format msgid "could not finalize checksum of manifest" msgstr "kunde inte göra klart kontrollsumma för backup-manifest" -#: parse_manifest.c:668 +#: ../../common/parse_manifest.c:869 #, c-format msgid "manifest has no checksum" msgstr "manifestet har ingen kontrollsumma" -#: parse_manifest.c:672 +#: ../../common/parse_manifest.c:873 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "ogiltig kontrollsumma för manifest: \"%s\"" -#: parse_manifest.c:676 +#: ../../common/parse_manifest.c:877 #, c-format msgid "manifest checksum mismatch" msgstr "kontrollsumma för manifest matchar inte" -#: parse_manifest.c:691 +#: ../../common/parse_manifest.c:892 #, c-format msgid "could not parse backup manifest: %s" msgstr "kunde inte parsa backup-manifest: %s" -#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276 +#: pg_verifybackup.c:277 pg_verifybackup.c:286 pg_verifybackup.c:297 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: pg_verifybackup.c:264 +#: pg_verifybackup.c:285 #, c-format msgid "no backup directory specified" msgstr "ingen backup-katalog angiven" -#: pg_verifybackup.c:274 +#: pg_verifybackup.c:295 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")" -#: pg_verifybackup.c:297 +#: pg_verifybackup.c:303 +#, c-format +msgid "cannot specify both %s and %s" +msgstr "kan inte ange bÃ¥de %s och %s" + +#: pg_verifybackup.c:323 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "programmet \"%s\" behövs av %s men hittades inte i samma katalog som \"%s\"" -#: pg_verifybackup.c:300 +#: pg_verifybackup.c:326 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "programmet \"%s\" hittades av \"%s\" men är inte av samma version som %s" -#: pg_verifybackup.c:356 +#: pg_verifybackup.c:381 #, c-format msgid "backup successfully verified\n" msgstr "korrekt verifierad backup\n" -#: pg_verifybackup.c:382 pg_verifybackup.c:718 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "kunde inte öppna fil \"%s\": %m" - -#: pg_verifybackup.c:386 +#: pg_verifybackup.c:410 #, c-format msgid "could not stat file \"%s\": %m" msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" -#: pg_verifybackup.c:406 pg_verifybackup.c:747 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "kunde inte läsa fil \"%s\": %m" - -#: pg_verifybackup.c:409 +#: pg_verifybackup.c:440 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "kunde inte läsa fil \"%s\": läste %d av %lld" -#: pg_verifybackup.c:469 +#: pg_verifybackup.c:478 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "kunde inte läsa fil \"%s\": läste %lld av %lld" + +#: pg_verifybackup.c:561 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "duplicerad sökväg i backup-manifest: \"%s\"" -#: pg_verifybackup.c:532 pg_verifybackup.c:539 +#: pg_verifybackup.c:624 pg_verifybackup.c:631 #, c-format msgid "could not open directory \"%s\": %m" msgstr "kunde inte öppna katalog \"%s\": %m" -#: pg_verifybackup.c:571 +#: pg_verifybackup.c:663 #, c-format msgid "could not close directory \"%s\": %m" msgstr "kunde inte stänga katalog \"%s\": %m" -#: pg_verifybackup.c:591 +#: pg_verifybackup.c:683 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "kunde inte ta status pÃ¥ fil eller katalog \"%s\": %m" -#: pg_verifybackup.c:614 +#: pg_verifybackup.c:706 #, c-format msgid "\"%s\" is not a file or directory" msgstr "\"%s\" är inte en fil eller katalog" -#: pg_verifybackup.c:624 +#: pg_verifybackup.c:716 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "\"%s\" finns pÃ¥ disk men är inte i manifestet" -#: pg_verifybackup.c:636 +#: pg_verifybackup.c:728 #, c-format msgid "\"%s\" has size %lld on disk but size %zu in the manifest" msgstr "\"%s\" har storlek %lld pÃ¥ disk men storlek %zu i manifestet" -#: pg_verifybackup.c:663 +#: pg_verifybackup.c:768 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: CRC är inkorrekt" + +#: pg_verifybackup.c:772 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: oväntad version pÃ¥ kontrollfil" + +#: pg_verifybackup.c:777 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: manifestets systemidentifierare är %llu men kontrollfilern har %llu" + +#: pg_verifybackup.c:801 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "\"%s\" finns i manifestet men inte pÃ¥ disk" -#: pg_verifybackup.c:726 +#: pg_verifybackup.c:873 #, c-format msgid "could not initialize checksum of file \"%s\"" msgstr "kunde inte initiera kontrollsumma för filen \"%s\"" -#: pg_verifybackup.c:738 +#: pg_verifybackup.c:885 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "kunde inte uppdatera kontrollsumma för filen \"%s\"" -#: pg_verifybackup.c:753 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "kunde inte stänga fil \"%s\": %m" - -#: pg_verifybackup.c:772 +#: pg_verifybackup.c:921 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "filen \"%s\" skall innehÃ¥lla %zu byte men vi läste %zu byte" -#: pg_verifybackup.c:782 +#: pg_verifybackup.c:931 #, c-format msgid "could not finalize checksum of file \"%s\"" msgstr "kunde inte göra klart kontrollsumma för filen \"%s\"" -#: pg_verifybackup.c:790 +#: pg_verifybackup.c:939 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "filen \"%s\" har kontrollsumma med längd %d men förväntade %d" -#: pg_verifybackup.c:794 +#: pg_verifybackup.c:943 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "kontrollsumman matchar inte för fil \"%s\"" -#: pg_verifybackup.c:818 +#: pg_verifybackup.c:969 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "WAL-parsning misslyckades för tidslinje %u" -#: pg_verifybackup.c:904 +#: pg_verifybackup.c:1072 +#, c-format +msgid "%*s/%s kB (%d%%) verified" +msgstr "%*s/%s kB (%d%%) verifierad" + +#: pg_verifybackup.c:1089 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -424,7 +529,7 @@ msgstr "" "%s verifierar en backup gentemot backup-manifestet.\n" "\n" -#: pg_verifybackup.c:905 +#: pg_verifybackup.c:1090 #, c-format msgid "" "Usage:\n" @@ -435,57 +540,62 @@ msgstr "" " %s [FLAGGOR]... BACKUPKAT\n" "\n" -#: pg_verifybackup.c:906 +#: pg_verifybackup.c:1091 #, c-format msgid "Options:\n" msgstr "Flaggor:\n" -#: pg_verifybackup.c:907 +#: pg_verifybackup.c:1092 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error avsluta direkt vid fel\n" -#: pg_verifybackup.c:908 +#: pg_verifybackup.c:1093 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=RELATIV_SÖKVÄG hoppa över angiven sökväg\n" -#: pg_verifybackup.c:909 +#: pg_verifybackup.c:1094 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=SÖKVÄG använd denna sökväg till manifestet\n" -#: pg_verifybackup.c:910 +#: pg_verifybackup.c:1095 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal försök inte parsa WAL-filer\n" -#: pg_verifybackup.c:911 +#: pg_verifybackup.c:1096 +#, c-format +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress visa förloppsinformation\n" + +#: pg_verifybackup.c:1097 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet skriv inte ut nÃ¥gra meddelanden förutom fel\n" -#: pg_verifybackup.c:912 +#: pg_verifybackup.c:1098 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums hoppa över verifiering av kontrollsummor\n" -#: pg_verifybackup.c:913 +#: pg_verifybackup.c:1099 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=SÖKVÄG använd denna sökväg till WAL-filer\n" -#: pg_verifybackup.c:914 +#: pg_verifybackup.c:1100 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_verifybackup.c:915 +#: pg_verifybackup.c:1101 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_verifybackup.c:916 +#: pg_verifybackup.c:1102 #, c-format msgid "" "\n" @@ -494,35 +604,7 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_verifybackup.c:917 +#: pg_verifybackup.c:1103 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" - -#, c-format -#~ msgid "" -#~ "The program \"%s\" is needed by %s but was not found in the\n" -#~ "same directory as \"%s\".\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Programmet \"%s\" behövs av %s men hittades inte i samma\n" -#~ "katalog som \"%s\".\n" -#~ "Kontrollera din installation." - -#, c-format -#~ msgid "" -#~ "The program \"%s\" was found by \"%s\"\n" -#~ "but was not the same version as %s.\n" -#~ "Check your installation." -#~ msgstr "" -#~ "Programmet \"%s\" hittades av \"%s\"\n" -#~ "men är inte av samma version som %s.\n" -#~ "Kontrollera din installation." - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Försök med \"%s --help\" för mer information.\n" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatalt: " diff --git a/src/bin/pg_verifybackup/po/uk.po b/src/bin/pg_verifybackup/po/uk.po index 6de85a0ae63e6..2c349e51c1c85 100644 --- a/src/bin/pg_verifybackup/po/uk.po +++ b/src/bin/pg_verifybackup/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:47+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:18+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pg_verifybackup.pot\n" -"X-Crowdin-File-ID: 928\n" +"X-Crowdin-File: /REL_17_STABLE/pg_verifybackup.pot\n" +"X-Crowdin-File-ID: 1004\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,454 +37,560 @@ msgstr "деталі: " msgid "hint: " msgstr "підказка: " +#: ../../common/controldata_utils.c:97 +#, c-format +msgid "could not open file \"%s\" for reading: %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\" Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ: %m" + +#: ../../common/controldata_utils.c:110 pg_verifybackup.c:438 +#: pg_verifybackup.c:476 pg_verifybackup.c:896 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" + +#: ../../common/controldata_utils.c:119 +#, c-format +msgid "could not read file \"%s\": read %d of %zu" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %zu" + +#: ../../common/controldata_utils.c:132 ../../common/controldata_utils.c:280 +#: pg_verifybackup.c:902 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "неможливо закрити файл \"%s\": %m" + +#: ../../common/controldata_utils.c:168 +msgid "byte ordering mismatch" +msgstr "неправильний порÑдок байтів" + +#: ../../common/controldata_utils.c:170 +#, c-format +msgid "possible byte ordering mismatch\n" +"The byte ordering used to store the pg_control file might not match the one\n" +"used by this program. In that case the results below would be incorrect, and\n" +"the PostgreSQL installation would be incompatible with this data directory." +msgstr "можлива помилка у поÑлідовноÑті байтів.\n" +"ПорÑдок байтів, що викориÑтовують Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ pg_control, може не відповідати тому, Ñкий викориÑтовуєтьÑÑ Ñ†Ñ–Ñ”ÑŽ програмою. У такому випадку результати нижче будуть неправильним, Ñ– інÑталÑÑ†Ñ–Ñ PostgreSQL буде неÑуміÑною з цим каталогом даних." + +#: ../../common/controldata_utils.c:230 pg_verifybackup.c:406 +#: pg_verifybackup.c:865 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не можливо відкрити файл \"%s\": %m" + +#: ../../common/controldata_utils.c:249 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m" + +#: ../../common/controldata_utils.c:268 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не вдалоÑÑ fsync файл \"%s\": %m" + +#: ../../common/cryptohash.c:261 ../../common/cryptohash_openssl.c:356 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:853 +#, c-format +msgid "out of memory" +msgstr "недоÑтатньо пам'Ñті" + +#: ../../common/cryptohash.c:266 ../../common/cryptohash.c:272 +#: ../../common/cryptohash_openssl.c:368 ../../common/cryptohash_openssl.c:376 +msgid "success" +msgstr "уÑпіх" + +#: ../../common/cryptohash.c:268 ../../common/cryptohash_openssl.c:370 +msgid "destination buffer too small" +msgstr "буфер Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð°Ð½Ð°Ð´Ñ‚Ð¾ малий" + +#: ../../common/cryptohash_openssl.c:372 +msgid "OpenSSL failure" +msgstr "Помилка OpenSSL" + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "недоÑтатньо пам'Ñті\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" -#: ../../common/jsonapi.c:1075 +#: ../../common/jsonapi.c:2121 +msgid "Recursive descent parser cannot use incremental lexer." +msgstr "РекурÑивний ÑпуÑк не може викориÑтовувати інкрементний лекÑичний аналізатор." + +#: ../../common/jsonapi.c:2123 +msgid "Incremental parser requires incremental lexer." +msgstr "Інкрементний аналізатор потребує Інкрементний лекÑичний аналізатор." + +#: ../../common/jsonapi.c:2125 +msgid "JSON nested too deep, maximum permitted depth is 6400." +msgstr "JSON вкладений занадто глибокий, макÑимально дозволена глибина - 6400." + +#: ../../common/jsonapi.c:2127 #, c-format -msgid "Escape sequence \"\\%s\" is invalid." -msgstr "ÐеприпуÑтима Ñпеціальна поÑлідовніÑть \"\\%s\"." +msgid "Escape sequence \"\\%.*s\" is invalid." +msgstr "ÐеприпуÑтима Ñпеціальна поÑлідовніÑть \"\\%.*s\"." -#: ../../common/jsonapi.c:1078 +#: ../../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ зі значеннÑм 0x%02x повинен бути пропущений." -#: ../../common/jsonapi.c:1081 +#: ../../common/jsonapi.c:2135 #, c-format -msgid "Expected end of input, but found \"%s\"." -msgstr "ОчікувавÑÑ ÐºÑ–Ð½ÐµÑ†ÑŒ введеннÑ, але знайдено \"%s\"." +msgid "Expected end of input, but found \"%.*s\"." +msgstr "ОчікувавÑÑ ÐºÑ–Ð½ÐµÑ†ÑŒ введеннÑ, але знайдено \"%.*s\"." -#: ../../common/jsonapi.c:1084 +#: ../../common/jsonapi.c:2138 #, c-format -msgid "Expected array element or \"]\", but found \"%s\"." -msgstr "ОчікувавÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚ маÑиву або \"]\", але знайдено \"%s\"." +msgid "Expected array element or \"]\", but found \"%.*s\"." +msgstr "ОчікувавÑÑ ÐµÐ»ÐµÐ¼ÐµÐ½Ñ‚ маÑиву або \"]\", але знайдено \"%.*s\"." -#: ../../common/jsonapi.c:1087 +#: ../../common/jsonapi.c:2141 #, c-format -msgid "Expected \",\" or \"]\", but found \"%s\"." -msgstr "ОчікувалоÑÑŒ \",\" або \"]\", але знайдено \"%s\"." +msgid "Expected \",\" or \"]\", but found \"%.*s\"." +msgstr "ОчікувалоÑÑŒ \",\" або \"]\", але знайдено \"%.*s\"." -#: ../../common/jsonapi.c:1090 +#: ../../common/jsonapi.c:2144 #, c-format -msgid "Expected \":\", but found \"%s\"." -msgstr "ОчікувалоÑÑŒ \":\", але знайдено \"%s\"." +msgid "Expected \":\", but found \"%.*s\"." +msgstr "ОчікувалоÑÑŒ \":\", але знайдено \"%.*s\"." -#: ../../common/jsonapi.c:1093 +#: ../../common/jsonapi.c:2147 #, c-format -msgid "Expected JSON value, but found \"%s\"." -msgstr "ОчікувалоÑÑŒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ JSON, але знайдено \"%s\"." +msgid "Expected JSON value, but found \"%.*s\"." +msgstr "ОчікувалоÑÑŒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ JSON, але знайдено \"%.*s\"." -#: ../../common/jsonapi.c:1096 +#: ../../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "ÐеÑподіваний кінець вхідного Ñ€Ñдка." -#: ../../common/jsonapi.c:1098 +#: ../../common/jsonapi.c:2152 #, c-format -msgid "Expected string or \"}\", but found \"%s\"." -msgstr "ОчікувавÑÑ Ñ€Ñдок або \"}\", але знайдено \"%s\"." +msgid "Expected string or \"}\", but found \"%.*s\"." +msgstr "ОчікувавÑÑ Ñ€Ñдок або \"}\", але знайдено \"%.*s\"." -#: ../../common/jsonapi.c:1101 +#: ../../common/jsonapi.c:2155 #, c-format -msgid "Expected \",\" or \"}\", but found \"%s\"." -msgstr "ОчікувалоÑÑŒ \",\" або \"}\", але знайдено \"%s\"." +msgid "Expected \",\" or \"}\", but found \"%.*s\"." +msgstr "ОчікувалоÑÑŒ \",\" або \"}\", але знайдено \"%.*s\"." -#: ../../common/jsonapi.c:1104 +#: ../../common/jsonapi.c:2158 #, c-format -msgid "Expected string, but found \"%s\"." -msgstr "ОчікувавÑÑ Ñ€Ñдок, але знайдено \"%s\"." +msgid "Expected string, but found \"%.*s\"." +msgstr "ОчікувавÑÑ Ñ€Ñдок, але знайдено \"%.*s\"." -#: ../../common/jsonapi.c:1107 +#: ../../common/jsonapi.c:2161 #, c-format -msgid "Token \"%s\" is invalid." -msgstr "ÐеприпуÑтимий маркер \"%s\"." +msgid "Token \"%.*s\" is invalid." +msgstr "ÐеприпуÑтимий маркер \"%.*s\"." -#: ../../common/jsonapi.c:1110 +#: ../../common/jsonapi.c:2164 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 не можна перетворити в текÑÑ‚." -#: ../../common/jsonapi.c:1112 +#: ../../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" повинні прÑмувати чотири шіÑтнадцÑткових чиÑла." -#: ../../common/jsonapi.c:1115 +#: ../../common/jsonapi.c:2169 msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð¸Ñ…Ð¾Ð´Ñƒ Unicode не можна викориÑтовувати Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ кодових точок більше 007F, Ñкщо ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ UTF8." -#: ../../common/jsonapi.c:1117 +#: ../../common/jsonapi.c:2178 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñимволу Unicode не вдалоÑÑ Ð¿ÐµÑ€ÐµÐºÐ»Ð°Ñти в ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ñервера %s." + +#: ../../common/jsonapi.c:2185 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Старший Ñурогат Unicode не повинен прÑмувати за іншим Ñтаршим Ñурогатом." -#: ../../common/jsonapi.c:1119 +#: ../../common/jsonapi.c:2187 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Молодший Ñурогат Unicode не повинен прÑмувати за іншим молодшим Ñурогатом." -#: parse_manifest.c:150 -msgid "parsing failed" -msgstr "помилка парÑингу" +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:855 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ контрольну Ñуму маніфеÑту" -#: parse_manifest.c:152 +#: ../../common/parse_manifest.c:204 ../../common/parse_manifest.c:261 msgid "manifest ended unexpectedly" msgstr "маніфеÑÑ‚ закінчивÑÑ Ð½ÐµÑподівано" -#: parse_manifest.c:191 +#: ../../common/parse_manifest.c:210 ../../common/parse_manifest.c:862 +#, c-format +msgid "could not update checksum of manifest" +msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ контрольну Ñуму маніфеÑту" + +#: ../../common/parse_manifest.c:302 msgid "unexpected object start" msgstr "неочікуваний початок об'єкта" -#: parse_manifest.c:224 +#: ../../common/parse_manifest.c:337 msgid "unexpected object end" msgstr "неочікуваний кінець об'єкта" -#: parse_manifest.c:251 +#: ../../common/parse_manifest.c:366 msgid "unexpected array start" msgstr "неочікуваний початок маÑиву" -#: parse_manifest.c:274 +#: ../../common/parse_manifest.c:391 msgid "unexpected array end" msgstr "неочікуваний кінець маÑиву" -#: parse_manifest.c:299 +#: ../../common/parse_manifest.c:418 msgid "expected version indicator" msgstr "індикатор очікуваної верÑÑ–Ñ—" -#: parse_manifest.c:328 +#: ../../common/parse_manifest.c:454 msgid "unrecognized top-level field" msgstr "нерозпізнане поле верхнього рівнÑ" -#: parse_manifest.c:347 +#: ../../common/parse_manifest.c:473 msgid "unexpected file field" msgstr "неочікуване поле файлу" -#: parse_manifest.c:361 +#: ../../common/parse_manifest.c:487 msgid "unexpected WAL range field" msgstr "неочікуване поле діапазону WAL" -#: parse_manifest.c:367 +#: ../../common/parse_manifest.c:493 msgid "unexpected object field" msgstr "неочікуване поле об'єкта" -#: parse_manifest.c:397 +#: ../../common/parse_manifest.c:583 +msgid "unexpected scalar" +msgstr "неочікуваний ÑкалÑÑ€" + +#: ../../common/parse_manifest.c:609 +msgid "manifest version not an integer" +msgstr "верÑÑ–Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту не ціле чиÑло" + +#: ../../common/parse_manifest.c:613 msgid "unexpected manifest version" msgstr "неочікувана верÑÑ–Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту" -#: parse_manifest.c:448 -msgid "unexpected scalar" -msgstr "неочікуваний ÑкалÑÑ€" +#: ../../common/parse_manifest.c:637 +msgid "system identifier in manifest not an integer" +msgstr "ÑиÑтемний ідентифікатор в маніфеÑті не ціле чиÑло" -#: parse_manifest.c:472 +#: ../../common/parse_manifest.c:662 msgid "missing path name" msgstr "пропущено шлÑÑ…" -#: parse_manifest.c:475 +#: ../../common/parse_manifest.c:665 msgid "both path name and encoded path name" msgstr "Ñ– ім'Ñ ÑˆÐ»Ñху, Ñ– закодований шлÑÑ…" -#: parse_manifest.c:477 +#: ../../common/parse_manifest.c:667 msgid "missing size" msgstr "відÑутній розмір" -#: parse_manifest.c:480 +#: ../../common/parse_manifest.c:670 msgid "checksum without algorithm" msgstr "контрольна Ñума без алгоритму" -#: parse_manifest.c:494 +#: ../../common/parse_manifest.c:684 msgid "could not decode file name" msgstr "не вдалоÑÑ Ð´ÐµÐºÐ¾Ð´ÑƒÐ²Ð°Ñ‚Ð¸ ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ" -#: parse_manifest.c:504 +#: ../../common/parse_manifest.c:694 msgid "file size is not an integer" msgstr "розмір файлу не Ñ” цілим чиÑлом" -#: parse_manifest.c:510 +#: ../../common/parse_manifest.c:700 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "нерозпізнаний алгоритм контрольної Ñуми: \"%s\"" -#: parse_manifest.c:529 +#: ../../common/parse_manifest.c:719 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "неприпуÑтима контрольна Ñума Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": \"%s\"" -#: parse_manifest.c:572 +#: ../../common/parse_manifest.c:762 msgid "missing timeline" msgstr "відÑÑƒÑ‚Ð½Ñ Ñ‡Ð°Ñова шкала" -#: parse_manifest.c:574 +#: ../../common/parse_manifest.c:764 msgid "missing start LSN" msgstr "відÑутній LSN початку" -#: parse_manifest.c:576 +#: ../../common/parse_manifest.c:766 msgid "missing end LSN" msgstr "відÑутній LSN кінцÑ" -#: parse_manifest.c:582 +#: ../../common/parse_manifest.c:772 msgid "timeline is not an integer" msgstr "чаÑова Ð»Ñ–Ð½Ñ–Ñ Ð½Ðµ Ñ” цілим чиÑлом" -#: parse_manifest.c:585 +#: ../../common/parse_manifest.c:775 msgid "could not parse start LSN" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ початковий LSN" -#: parse_manifest.c:588 +#: ../../common/parse_manifest.c:778 msgid "could not parse end LSN" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ кінцевий LSN" -#: parse_manifest.c:649 +#: ../../common/parse_manifest.c:843 msgid "expected at least 2 lines" msgstr "очікувалоÑÑ Ð¿Ñ€Ð¸Ð½Ð°Ð¹Ð¼Ð½Ñ– 2 Ñ€Ñдки" -#: parse_manifest.c:652 +#: ../../common/parse_manifest.c:846 msgid "last line not newline-terminated" msgstr "оÑтанній Ñ€Ñдок не завершений новим Ñ€Ñдком" -#: parse_manifest.c:657 -#, c-format -msgid "out of memory" -msgstr "недоÑтатньо пам'Ñті" - -#: parse_manifest.c:659 -#, c-format -msgid "could not initialize checksum of manifest" -msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ контрольну Ñуму маніфеÑту" - -#: parse_manifest.c:661 -#, c-format -msgid "could not update checksum of manifest" -msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ контрольну Ñуму маніфеÑту" - -#: parse_manifest.c:664 +#: ../../common/parse_manifest.c:865 #, c-format msgid "could not finalize checksum of manifest" msgstr "не вдалоÑÑ Ð¾Ñтаточно завершити контрольну Ñуму маніфеÑту" -#: parse_manifest.c:668 +#: ../../common/parse_manifest.c:869 #, c-format msgid "manifest has no checksum" msgstr "у маніфеÑті немає контрольної Ñуми" -#: parse_manifest.c:672 +#: ../../common/parse_manifest.c:873 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "неприпуÑтима контрольна Ñума маніфеÑту: \"%s\"" -#: parse_manifest.c:676 +#: ../../common/parse_manifest.c:877 #, c-format msgid "manifest checksum mismatch" msgstr "невідповідніÑть контрольної Ñуми маніфеÑту" -#: parse_manifest.c:691 +#: ../../common/parse_manifest.c:892 #, c-format msgid "could not parse backup manifest: %s" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ маніфеÑÑ‚ резервної копії: %s" -#: pg_verifybackup.c:256 pg_verifybackup.c:265 pg_verifybackup.c:276 +#: pg_verifybackup.c:277 pg_verifybackup.c:286 pg_verifybackup.c:297 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." -#: pg_verifybackup.c:264 +#: pg_verifybackup.c:285 #, c-format msgid "no backup directory specified" msgstr "не вказано папку резервної копії" -#: pg_verifybackup.c:274 +#: pg_verifybackup.c:295 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")" -#: pg_verifybackup.c:297 +#: pg_verifybackup.c:303 +#, c-format +msgid "cannot specify both %s and %s" +msgstr "не можна вказати Ñк %s, так Ñ– %s" + +#: pg_verifybackup.c:323 #, c-format msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" msgstr "програма \"%s\" потрібна Ð´Ð»Ñ %s, але не знайдена в тому ж каталозі, що й \"%s\"" -#: pg_verifybackup.c:300 +#: pg_verifybackup.c:326 #, c-format msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" msgstr "програма \"%s\" знайдена Ð´Ð»Ñ \"%s\", але має відмінну верÑÑ–ÑŽ від %s" -#: pg_verifybackup.c:356 +#: pg_verifybackup.c:381 #, c-format msgid "backup successfully verified\n" msgstr "резервну копію уÑпішно перевірено\n" -#: pg_verifybackup.c:382 pg_verifybackup.c:718 -#, c-format -msgid "could not open file \"%s\": %m" -msgstr "не можливо відкрити файл \"%s\": %m" - -#: pg_verifybackup.c:386 +#: pg_verifybackup.c:410 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" -#: pg_verifybackup.c:406 pg_verifybackup.c:745 -#, c-format -msgid "could not read file \"%s\": %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" - -#: pg_verifybackup.c:409 +#: pg_verifybackup.c:440 #, c-format msgid "could not read file \"%s\": read %d of %lld" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %lld" -#: pg_verifybackup.c:469 +#: pg_verifybackup.c:478 +#, c-format +msgid "could not read file \"%s\": read %lld of %lld" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %lld з %lld" + +#: pg_verifybackup.c:561 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "дубльований шлÑÑ… у маніфеÑті резервного копіюваннÑ: \"%s\"" -#: pg_verifybackup.c:532 pg_verifybackup.c:539 +#: pg_verifybackup.c:624 pg_verifybackup.c:631 #, c-format msgid "could not open directory \"%s\": %m" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" -#: pg_verifybackup.c:571 +#: pg_verifybackup.c:663 #, c-format msgid "could not close directory \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" -#: pg_verifybackup.c:591 +#: pg_verifybackup.c:683 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про файл або каталог \"%s\": %m" -#: pg_verifybackup.c:614 +#: pg_verifybackup.c:706 #, c-format msgid "\"%s\" is not a file or directory" msgstr "\"%s\" не Ñ” файлом або каталогом" -#: pg_verifybackup.c:624 +#: pg_verifybackup.c:716 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "\"%s\" приÑутній на диÑку, але не у маніфеÑті" -#: pg_verifybackup.c:636 +#: pg_verifybackup.c:728 #, c-format msgid "\"%s\" has size %lld on disk but size %zu in the manifest" msgstr "\"%s\" має розмір %lld на диÑку, але розмір %zu у маніфеÑті" -#: pg_verifybackup.c:663 +#: pg_verifybackup.c:768 +#, c-format +msgid "%s: CRC is incorrect" +msgstr "%s: CRC невірний" + +#: pg_verifybackup.c:772 +#, c-format +msgid "%s: unexpected control file version" +msgstr "%s: неочікувана верÑÑ–Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð¾Ð³Ð¾ файлу" + +#: pg_verifybackup.c:777 +#, c-format +msgid "%s: manifest system identifier is %llu, but control file has %llu" +msgstr "%s: маніфеÑтовий ідентифікатор ÑиÑтеми - %llu, але контрольний файл має %llu" + +#: pg_verifybackup.c:801 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "\"%s\" приÑутній у маніфеÑті, але не на диÑку" -#: pg_verifybackup.c:726 +#: pg_verifybackup.c:873 #, c-format msgid "could not initialize checksum of file \"%s\"" msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ контрольну Ñуму файлу \"%s\"" -#: pg_verifybackup.c:738 +#: pg_verifybackup.c:885 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "не вдалоÑÑ Ð¾Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ контрольну Ñуму файлу \"%s\"" -#: pg_verifybackup.c:751 -#, c-format -msgid "could not close file \"%s\": %m" -msgstr "неможливо закрити файл \"%s\": %m" - -#: pg_verifybackup.c:770 +#: pg_verifybackup.c:921 #, c-format msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" msgstr "файл \"%s\" муÑить міÑтити %zu байтів, але прочитано %zu байтів" -#: pg_verifybackup.c:780 +#: pg_verifybackup.c:931 #, c-format msgid "could not finalize checksum of file \"%s\"" msgstr "не вдалоÑÑ Ð¾Ñтаточно завершити контрольну Ñуму файлу \"%s\"" -#: pg_verifybackup.c:788 +#: pg_verifybackup.c:939 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "файл \"%s\" має контрольну Ñуму довжини %d, але очікувалоÑÑŒ %d" -#: pg_verifybackup.c:792 +#: pg_verifybackup.c:943 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "невідповідніÑть контрольної Ñуми Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\"" -#: pg_verifybackup.c:816 +#: pg_verifybackup.c:969 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ WAL Ð´Ð»Ñ Ñ‡Ð°Ñової шкали %u" -#: pg_verifybackup.c:902 +#: pg_verifybackup.c:1072 +#, c-format +msgid "%*s/%s kB (%d%%) verified" +msgstr "%*s/%s MB (%d%%) перевірено" + +#: pg_verifybackup.c:1089 #, c-format msgid "%s verifies a backup against the backup manifest.\n\n" msgstr "%s перевірÑÑ” резервну копію відповідно до маніфеÑту резервного копіюваннÑ.\n\n" -#: pg_verifybackup.c:903 +#: pg_verifybackup.c:1090 #, c-format msgid "Usage:\n" " %s [OPTION]... BACKUPDIR\n\n" msgstr "ВикориÑтаннÑ:\n" " %s [OPTION]... КÐТÐЛОГ_КОПІЮВÐÐÐЯ\n\n" -#: pg_verifybackup.c:904 +#: pg_verifybackup.c:1091 #, c-format msgid "Options:\n" msgstr "Параметри:\n" -#: pg_verifybackup.c:905 +#: pg_verifybackup.c:1092 #, c-format msgid " -e, --exit-on-error exit immediately on error\n" msgstr " -e, --exit-on-error вийти при помилці\n" -#: pg_verifybackup.c:906 +#: pg_verifybackup.c:1093 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=RELATIVE_PATH ігнорувати вказаний шлÑÑ…\n" -#: pg_verifybackup.c:907 +#: pg_verifybackup.c:1094 #, c-format msgid " -m, --manifest-path=PATH use specified path for manifest\n" msgstr " -m, --manifest-path=PATH викориÑтовувати вказаний шлÑÑ… Ð´Ð»Ñ Ð¼Ð°Ð½Ñ–Ñ„ÐµÑту\n" -#: pg_verifybackup.c:908 +#: pg_verifybackup.c:1095 #, c-format msgid " -n, --no-parse-wal do not try to parse WAL files\n" msgstr " -n, --no-parse-wal не намагатиÑÑ Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ файли WAL\n" -#: pg_verifybackup.c:909 +#: pg_verifybackup.c:1096 +#, c-format +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress повідомлÑти про хід процеÑу\n" + +#: pg_verifybackup.c:1097 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet не друкувати жодного виводу, окрім помилок\n" -#: pg_verifybackup.c:910 +#: pg_verifybackup.c:1098 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums не перевірÑти контрольні Ñуми\n" -#: pg_verifybackup.c:911 +#: pg_verifybackup.c:1099 #, c-format msgid " -w, --wal-directory=PATH use specified path for WAL files\n" msgstr " -w, --wal-directory=PATH викориÑтовувати вказаний шлÑÑ… Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² WAL\n" -#: pg_verifybackup.c:912 +#: pg_verifybackup.c:1100 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n" -#: pg_verifybackup.c:913 +#: pg_verifybackup.c:1101 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: pg_verifybackup.c:914 +#: pg_verifybackup.c:1102 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "ПовідомлÑти про помилки на <%s>.\n" -#: pg_verifybackup.c:915 +#: pg_verifybackup.c:1103 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" diff --git a/src/bin/pg_verifybackup/po/zh_TW.po b/src/bin/pg_verifybackup/po/zh_TW.po new file mode 100644 index 0000000000000..c1b710b0a3669 --- /dev/null +++ b/src/bin/pg_verifybackup/po/zh_TW.po @@ -0,0 +1,583 @@ +# Traditional Chinese message translation file for pg_verifybackup +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_verifybackup (PostgreSQL) package. +# Zhenbang Wei , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_verifybackup (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-11 20:47+0000\n" +"PO-Revision-Date: 2023-11-06 08:50+0800\n" +"Last-Translator: Zhenbang Wei \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.4.1\n" + +# libpq/be-secure.c:294 libpq/be-secure.c:387 +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "錯誤: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "警告: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "詳細內容: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "æç¤º: " + +# commands/sequence.c:798 executor/execGrouping.c:328 +# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43 +# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006 +# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527 +# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623 +# postmaster/postmaster.c:755 postmaster/postmaster.c:1625 +# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139 +# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766 +# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138 +# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297 +# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73 +# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191 +# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164 +# utils/cache/relcache.c:178 utils/cache/relcache.c:1130 +# utils/cache/typcache.c:165 utils/cache/typcache.c:487 +# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532 +# utils/init/miscinit.c:213 utils/init/miscinit.c:234 +# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911 +# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503 +# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "記憶體用盡\n" + +# common.c:78 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "無法複製 null 指標(內部錯誤)\n" + +#: ../../common/jsonapi.c:1144 +#, c-format +msgid "Escape sequence \"\\%s\" is invalid." +msgstr "無效的跳脫åºåˆ— \"\\%s\"。" + +#: ../../common/jsonapi.c:1147 +#, c-format +msgid "Character with value 0x%02x must be escaped." +msgstr "必須跳脫值為 0x%02x 的字元。" + +#: ../../common/jsonapi.c:1150 +#, c-format +msgid "Expected end of input, but found \"%s\"." +msgstr "é æœŸè¼¸å…¥çµæŸï¼Œä½†æ‰¾åˆ° \"%s\"。" + +#: ../../common/jsonapi.c:1153 +#, c-format +msgid "Expected array element or \"]\", but found \"%s\"." +msgstr "é æœŸæ˜¯é™£åˆ—元素或 \"]\",但找到 \"%s\"。" + +#: ../../common/jsonapi.c:1156 +#, c-format +msgid "Expected \",\" or \"]\", but found \"%s\"." +msgstr "é æœŸæ˜¯ \",\" 或 \"]\",但找到 \"%s\"。" + +#: ../../common/jsonapi.c:1159 +#, c-format +msgid "Expected \":\", but found \"%s\"." +msgstr "é æœŸæ˜¯ \":\",但找到 \"%s\"" + +#: ../../common/jsonapi.c:1162 +#, c-format +msgid "Expected JSON value, but found \"%s\"." +msgstr "é æœŸæ˜¯ JSON 內容,但找到 \"%s\"。" + +#: ../../common/jsonapi.c:1165 +msgid "The input string ended unexpectedly." +msgstr "輸入字串éžé æœŸåœ°çµæŸã€‚" + +#: ../../common/jsonapi.c:1167 +#, c-format +msgid "Expected string or \"}\", but found \"%s\"." +msgstr "é æœŸæ˜¯å­—串或 \"}\",但找到 \"%s\"。" + +#: ../../common/jsonapi.c:1170 +#, c-format +msgid "Expected \",\" or \"}\", but found \"%s\"." +msgstr "é æœŸæ˜¯ \",\" 或 \"}\",但找到 \"%s\"。" + +#: ../../common/jsonapi.c:1173 +#, c-format +msgid "Expected string, but found \"%s\"." +msgstr "é æœŸæ˜¯å­—串,但找到 \"%s\"。" + +#: ../../common/jsonapi.c:1176 +#, c-format +msgid "Token \"%s\" is invalid." +msgstr "Token \"%s\" 是無效的。" + +#: ../../common/jsonapi.c:1179 +msgid "\\u0000 cannot be converted to text." +msgstr "\\u0000 ç„¡æ³•è½‰æˆæ–‡å­—。" + +#: ../../common/jsonapi.c:1181 +msgid "\"\\u\" must be followed by four hexadecimal digits." +msgstr "\"\\u\" 必須後接四個å六進使•¸å­—。" + +#: ../../common/jsonapi.c:1184 +msgid "Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8." +msgstr "ç•¶ç·¨ç¢¼ä¸æ˜¯ UTF8 時,無法使用 Unicode 跳脫值來表示大於 007F 的編碼ä½ç½®ã€‚" + +#: ../../common/jsonapi.c:1187 +#, c-format +msgid "Unicode escape value could not be translated to the server's encoding %s." +msgstr "Unicode 跳脫值ä¸èƒ½è¢«è½‰æˆä¼ºæœå™¨çš„編碼 %s。" + +#: ../../common/jsonapi.c:1190 +msgid "Unicode high surrogate must not follow a high surrogate." +msgstr "Unicode 高ä½ä»£ç†ä¸èƒ½è·Ÿè‘—高ä½ä»£ç†ã€‚" + +#: ../../common/jsonapi.c:1192 +msgid "Unicode low surrogate must follow a high surrogate." +msgstr "Unicode 低ä½ä»£ç†å¿…須跟著高ä½ä»£ç†ã€‚" + +#: parse_manifest.c:150 +msgid "parsing failed" +msgstr "è§£æžå¤±æ•—" + +#: parse_manifest.c:152 +msgid "manifest ended unexpectedly" +msgstr "清單éžé æœŸåœ°çµæŸ" + +#: parse_manifest.c:191 +msgid "unexpected object start" +msgstr "éžé æœŸçš„物件開始" + +#: parse_manifest.c:226 +msgid "unexpected object end" +msgstr "éžé æœŸçš„ç‰©ä»¶çµæŸ" + +#: parse_manifest.c:255 +msgid "unexpected array start" +msgstr "éžé æœŸçš„陣列開始" + +#: parse_manifest.c:280 +msgid "unexpected array end" +msgstr "éžé æœŸçš„é™£åˆ—çµæŸ" + +#: parse_manifest.c:307 +msgid "expected version indicator" +msgstr "é æœŸçš„版本指示器" + +#: parse_manifest.c:336 +msgid "unrecognized top-level field" +msgstr "無法識別的頂層欄ä½" + +#: parse_manifest.c:355 +msgid "unexpected file field" +msgstr "éžé æœŸçš„æª”案欄ä½" + +#: parse_manifest.c:369 +msgid "unexpected WAL range field" +msgstr "éžé æœŸçš„ WAL ç¯„åœæ¬„ä½" + +#: parse_manifest.c:375 +msgid "unexpected object field" +msgstr "éžé æœŸçš„物件欄ä½" + +#: parse_manifest.c:407 +msgid "unexpected manifest version" +msgstr "éžé æœŸçš„æ¸…單版本" + +#: parse_manifest.c:458 +msgid "unexpected scalar" +msgstr "éžé æœŸçš„ç´”é‡å€¼" + +#: parse_manifest.c:484 +msgid "missing path name" +msgstr "缺少路徑å稱" + +#: parse_manifest.c:487 +msgid "both path name and encoded path name" +msgstr "åŒæ™‚存在路徑å稱和編碼路徑å稱" + +#: parse_manifest.c:489 +msgid "missing size" +msgstr "缺少大å°" + +#: parse_manifest.c:492 +msgid "checksum without algorithm" +msgstr "檢查碼沒有演算法" + +#: parse_manifest.c:506 +msgid "could not decode file name" +msgstr "無法解碼檔案å稱" + +#: parse_manifest.c:516 +msgid "file size is not an integer" +msgstr "檔案大å°ä¸æ˜¯æ•´æ•¸" + +#: parse_manifest.c:522 +#, c-format +msgid "unrecognized checksum algorithm: \"%s\"" +msgstr "無法識別的檢查碼演算法: \" %s\"" + +#: parse_manifest.c:541 +#, c-format +msgid "invalid checksum for file \"%s\": \"%s\"" +msgstr "檔案 \"%s\" 的檢查碼無效: \"%s\"" + +#: parse_manifest.c:584 +msgid "missing timeline" +msgstr "缺少時間線" + +#: parse_manifest.c:586 +msgid "missing start LSN" +msgstr "缺少起始 LSN" + +#: parse_manifest.c:588 +msgid "missing end LSN" +msgstr "ç¼ºå°‘çµæŸ LSN" + +#: parse_manifest.c:594 +msgid "timeline is not an integer" +msgstr "æ™‚é–“ç·šä¸æ˜¯æ•´æ•¸" + +#: parse_manifest.c:597 +msgid "could not parse start LSN" +msgstr "無法解æžèµ·å§‹ LSN" + +#: parse_manifest.c:600 +msgid "could not parse end LSN" +msgstr "無法解æžçµæŸ LSN" + +#: parse_manifest.c:661 +msgid "expected at least 2 lines" +msgstr "é æœŸè‡³å°‘有 2 行" + +#: parse_manifest.c:664 +msgid "last line not newline-terminated" +msgstr "最後一行未以æ›è¡Œç¬¦è™ŸçµæŸ" + +# commands/sequence.c:798 executor/execGrouping.c:328 +# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43 +# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006 +# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527 +# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623 +# postmaster/postmaster.c:755 postmaster/postmaster.c:1625 +# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139 +# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766 +# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138 +# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297 +# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73 +# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191 +# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164 +# utils/cache/relcache.c:178 utils/cache/relcache.c:1130 +# utils/cache/typcache.c:165 utils/cache/typcache.c:487 +# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532 +# utils/init/miscinit.c:213 utils/init/miscinit.c:234 +# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911 +# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503 +# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75 +#: parse_manifest.c:669 +#, c-format +msgid "out of memory" +msgstr "記憶體ä¸è¶³" + +#: parse_manifest.c:671 +#, c-format +msgid "could not initialize checksum of manifest" +msgstr "無法åˆå§‹åŒ–清單的檢查碼" + +#: parse_manifest.c:673 +#, c-format +msgid "could not update checksum of manifest" +msgstr "無法更新清單的檢查碼" + +#: parse_manifest.c:676 +#, c-format +msgid "could not finalize checksum of manifest" +msgstr "ç„¡æ³•å®Œæˆæ¸…單的檢查碼" + +#: parse_manifest.c:680 +#, c-format +msgid "manifest has no checksum" +msgstr "清單沒有檢查碼" + +#: parse_manifest.c:684 +#, c-format +msgid "invalid manifest checksum: \"%s\"" +msgstr "無效的清單檢查碼: \"%s\"" + +#: parse_manifest.c:688 +#, c-format +msgid "manifest checksum mismatch" +msgstr "清單檢查碼ä¸ä¸€è‡´" + +#: parse_manifest.c:703 +#, c-format +msgid "could not parse backup manifest: %s" +msgstr "無法解æžå‚™ä»½æ¸…å–®: %s" + +# tcop/postgres.c:2636 tcop/postgres.c:2652 +#: pg_verifybackup.c:273 pg_verifybackup.c:282 pg_verifybackup.c:293 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "用 \"%s --help\" å–得更多資訊。" + +#: pg_verifybackup.c:281 +#, c-format +msgid "no backup directory specified" +msgstr "未指定備份目錄" + +#: pg_verifybackup.c:291 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "å‘½ä»¤åˆ—åƒæ•¸éŽå¤š(第一個是 \"%s\")" + +#: pg_verifybackup.c:299 +#, c-format +msgid "cannot specify both %s and %s" +msgstr "ç„¡æ³•åŒæ™‚指定 %s å’Œ %s" + +#: pg_verifybackup.c:319 +#, c-format +msgid "program \"%s\" is needed by %s but was not found in the same directory as \"%s\"" +msgstr "ç¨‹å¼ \"%s\" 為 %s 所需,但未在åŒä¸€ç›®éŒ„中找到 \"%s\"" + +#: pg_verifybackup.c:322 +#, c-format +msgid "program \"%s\" was found by \"%s\" but was not the same version as %s" +msgstr "ç¨‹å¼ \"%s\" 被 \"%s\" 找到,但版本ä¸åŒæ–¼ %s" + +#: pg_verifybackup.c:378 +#, c-format +msgid "backup successfully verified\n" +msgstr "備份檢查æˆåŠŸ\n" + +# access/transam/slru.c:638 access/transam/xlog.c:1631 +# access/transam/xlog.c:2742 access/transam/xlog.c:2832 +# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935 +# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889 +# utils/misc/database.c:68 +#: pg_verifybackup.c:404 pg_verifybackup.c:748 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "無法開啟檔案 \"%s\": %m" + +# access/transam/xlog.c:1936 access/transam/xlog.c:2038 +# access/transam/xlog.c:5291 +#: pg_verifybackup.c:408 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "無法å–得檔案 \"%s\" 的狀態: %m" + +# access/transam/xlog.c:1659 access/transam/xlog.c:2942 +# access/transam/xlog.c:5397 access/transam/xlog.c:5448 +# access/transam/xlog.c:5520 access/transam/xlog.c:5545 +# access/transam/xlog.c:5583 +#: pg_verifybackup.c:428 pg_verifybackup.c:779 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ç„¡æ³•è®€å–æª”案 \"%s\": %m" + +#: pg_verifybackup.c:431 +#, c-format +msgid "could not read file \"%s\": read %d of %lld" +msgstr "ç„¡æ³•è®€å–æª”案 \"%s\": å·²è®€å– %d / %lld" + +#: pg_verifybackup.c:491 +#, c-format +msgid "duplicate path name in backup manifest: \"%s\"" +msgstr "備份清單中有é‡è¤‡çš„路徑å稱: \"%s\"" + +# access/transam/slru.c:930 commands/tablespace.c:529 +# commands/tablespace.c:694 utils/adt/misc.c:174 +#: pg_verifybackup.c:554 pg_verifybackup.c:561 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "無法開啟目錄 \"%s\": %m" + +# access/transam/slru.c:930 commands/tablespace.c:529 +# commands/tablespace.c:694 utils/adt/misc.c:174 +#: pg_verifybackup.c:593 +#, c-format +msgid "could not close directory \"%s\": %m" +msgstr "無法關閉目錄 \"%s\": %m" + +# access/transam/slru.c:967 commands/tablespace.c:577 +# commands/tablespace.c:721 +#: pg_verifybackup.c:613 +#, c-format +msgid "could not stat file or directory \"%s\": %m" +msgstr "無法å–得檔案或目錄 \"%s\" 的狀態: %m" + +#: pg_verifybackup.c:636 +#, c-format +msgid "\"%s\" is not a file or directory" +msgstr "%s 䏿˜¯æª”æ¡ˆä¹Ÿä¸æ˜¯ç›®éŒ„" + +#: pg_verifybackup.c:646 +#, c-format +msgid "\"%s\" is present on disk but not in the manifest" +msgstr "ç£ç¢Ÿæœ‰ \"%s\" 但ä¸åœ¨æ¸…單上" + +#: pg_verifybackup.c:658 +#, c-format +msgid "\"%s\" has size %lld on disk but size %zu in the manifest" +msgstr "\"%s\" 在ç£ç¢Ÿçš„大å°ç‚º %lld 但在清單上的大å°ç‚º %zu" + +#: pg_verifybackup.c:689 +#, c-format +msgid "\"%s\" is present in the manifest but not on disk" +msgstr "清單有 \"%s\" 但ä¸åœ¨ç£ç¢Ÿä¸Š" + +#: pg_verifybackup.c:756 +#, c-format +msgid "could not initialize checksum of file \"%s\"" +msgstr "無法åˆå§‹åŒ–檔案 \"%s\" 的檢查碼" + +#: pg_verifybackup.c:768 +#, c-format +msgid "could not update checksum of file \"%s\"" +msgstr "無法更新檔案 \"%s\" 的檢查碼" + +# access/transam/slru.c:680 access/transam/xlog.c:1567 +# access/transam/xlog.c:1691 access/transam/xlog.c:3013 +#: pg_verifybackup.c:785 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "無法關閉檔案\"%s\": %m" + +#: pg_verifybackup.c:804 +#, c-format +msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" +msgstr "檔案 \"%s\" æ‡‰è©²åŒ…å« %zu ä½å…ƒçµ„ï¼Œä½†å¯¦éš›è®€å– %zu ä½å…ƒçµ„" + +#: pg_verifybackup.c:814 +#, c-format +msgid "could not finalize checksum of file \"%s\"" +msgstr "ç„¡æ³•å®Œæˆæª”案 \"%s\" 的檢查碼" + +#: pg_verifybackup.c:822 +#, c-format +msgid "file \"%s\" has checksum of length %d, but expected %d" +msgstr "檔案 \"%s\" 的檢查碼長度為 %dï¼Œä½†é æœŸç‚º %d" + +#: pg_verifybackup.c:826 +#, c-format +msgid "checksum mismatch for file \"%s\"" +msgstr "檔案 \"%s\" 的檢查碼ä¸ä¸€è‡´" + +#: pg_verifybackup.c:851 +#, c-format +msgid "WAL parsing failed for timeline %u" +msgstr "WAL è§£æžå¤±æ•—,時間線 %u" + +#: pg_verifybackup.c:965 +#, c-format +msgid "%*s/%s kB (%d%%) verified" +msgstr "已驗證 %*s/%s kB (%d%%)" + +#: pg_verifybackup.c:982 +#, c-format +msgid "" +"%s verifies a backup against the backup manifest.\n" +"\n" +msgstr "" +"%s 驗證備份和備份清單是å¦ä¸€è‡´ã€‚\n" +"\n" + +#: pg_verifybackup.c:983 +#, c-format +msgid "" +"Usage:\n" +" %s [OPTION]... BACKUPDIR\n" +"\n" +msgstr "" +"用法:\n" +" %s [OPTION]... BACKUPDIR\n" +"\n" + +# postmaster/postmaster.c:1017 tcop/postgres.c:2115 +#: pg_verifybackup.c:984 +#, c-format +msgid "Options:\n" +msgstr "é¸é …: \n" + +#: pg_verifybackup.c:985 +#, c-format +msgid " -e, --exit-on-error exit immediately on error\n" +msgstr " -e, --exit-on-error 發生錯誤立å³çµæŸ\n" + +#: pg_verifybackup.c:986 +#, c-format +msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" +msgstr " -i, --ignore=RELATIVE_PATH 忽略指定的路徑\n" + +#: pg_verifybackup.c:987 +#, c-format +msgid " -m, --manifest-path=PATH use specified path for manifest\n" +msgstr " -m, --manifest-path=PATH 指定清單的路徑\n" + +#: pg_verifybackup.c:988 +#, c-format +msgid " -n, --no-parse-wal do not try to parse WAL files\n" +msgstr " -n, --no-parse-wal ä¸å˜—è©¦è§£æž WAL 檔\n" + +#: pg_verifybackup.c:989 +#, c-format +msgid " -P, --progress show progress information\n" +msgstr " -P, --progress 顯示進度資訊\n" + +#: pg_verifybackup.c:990 +#, c-format +msgid " -q, --quiet do not print any output, except for errors\n" +msgstr " -q, --quiet ä¸é¡¯ç¤ºä»»ä½•輸出,除了錯誤訊æ¯\n" + +#: pg_verifybackup.c:991 +#, c-format +msgid " -s, --skip-checksums skip checksum verification\n" +msgstr " -s, --skip-checksums è·³éŽæª¢æŸ¥ç¢¼é©—è­‰\n" + +#: pg_verifybackup.c:992 +#, c-format +msgid " -w, --wal-directory=PATH use specified path for WAL files\n" +msgstr " -w, --wal-directory=PATH 用指定的路徑存放 WAL 檔\n" + +#: pg_verifybackup.c:993 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version é¡¯ç¤ºç‰ˆæœ¬ï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_verifybackup.c:994 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help é¡¯ç¤ºèªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_verifybackup.c:995 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"回報錯誤至 <%s>。\n" + +#: pg_verifybackup.c:996 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 網站: <%s>\n" diff --git a/src/bin/pg_verifybackup/t/001_basic.pl b/src/bin/pg_verifybackup/t/001_basic.pl index 73e8663238679..2f3e52d296f38 100644 --- a/src/bin/pg_verifybackup/t/001_basic.pl +++ b/src/bin/pg_verifybackup/t/001_basic.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_verifybackup/t/002_algorithm.pl b/src/bin/pg_verifybackup/t/002_algorithm.pl index 5b02ea4d55e3c..fb2a1fd7c4e1a 100644 --- a/src/bin/pg_verifybackup/t/002_algorithm.pl +++ b/src/bin/pg_verifybackup/t/002_algorithm.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Verify that we can take and verify backups with various checksum types. use strict; -use warnings; +use warnings FATAL => 'all'; use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_verifybackup/t/003_corruption.pl b/src/bin/pg_verifybackup/t/003_corruption.pl index 4cc3dd05e3e2e..ae91e04338460 100644 --- a/src/bin/pg_verifybackup/t/003_corruption.pl +++ b/src/bin/pg_verifybackup/t/003_corruption.pl @@ -1,11 +1,12 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Verify that various forms of corruption are detected by pg_verifybackup. use strict; -use warnings; +use warnings FATAL => 'all'; use File::Path qw(rmtree); +use File::Copy; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -68,6 +69,12 @@ 'mutilate' => \&mutilate_replace_file, 'fails_like' => qr/checksum mismatch for file/ }, + { + 'name' => 'system_identifier', + 'mutilate' => \&mutilate_system_identifier, + 'fails_like' => + qr/manifest system identifier is .*, but control file has/ + }, { 'name' => 'bad_manifest', 'mutilate' => \&mutilate_bad_manifest, @@ -101,7 +108,8 @@ SKIP: { skip "unix-style permissions not supported on Windows", 4 - if $scenario->{'skip_on_windows'} && $windows_os; + if ($scenario->{'skip_on_windows'} + && ($windows_os || $Config::Config{osname} eq 'cygwin')); # Take a backup and check that it verifies OK. my $backup_path = $primary->backup_dir . '/' . $name; @@ -216,7 +224,7 @@ sub mutilate_append_to_file sub mutilate_truncate_file { my ($backup_path) = @_; - my $pathname = "$backup_path/global/pg_control"; + my $pathname = "$backup_path/pg_hba.conf"; open(my $fh, '>', $pathname) || die "open $pathname: $!"; close($fh); return; @@ -236,6 +244,25 @@ sub mutilate_replace_file return; } +# Copy manifest of other backups to demonstrate the case where the wrong +# manifest is referred +sub mutilate_system_identifier +{ + my ($backup_path) = @_; + + # Set up another new database instance with different system identifier and + # make backup + my $node = PostgreSQL::Test::Cluster->new('node'); + $node->init(force_initdb => 1, allows_streaming => 1); + $node->start; + $node->backup('backup2'); + move($node->backup_dir . '/backup2/backup_manifest', + $backup_path . '/backup_manifest') + or BAIL_OUT "could not copy manifest to $backup_path"; + $node->teardown_node(fail_ok => 1); + return; +} + # Corrupt the backup manifest. sub mutilate_bad_manifest { diff --git a/src/bin/pg_verifybackup/t/004_options.pl b/src/bin/pg_verifybackup/t/004_options.pl index 2aa8352f00ef1..8ed2214408ef0 100644 --- a/src/bin/pg_verifybackup/t/004_options.pl +++ b/src/bin/pg_verifybackup/t/004_options.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Verify the behavior of assorted pg_verifybackup options. use strict; -use warnings; +use warnings FATAL => 'all'; use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_verifybackup/t/005_bad_manifest.pl b/src/bin/pg_verifybackup/t/005_bad_manifest.pl index c94fdd5df8305..c4ed64b62d5f9 100644 --- a/src/bin/pg_verifybackup/t/005_bad_manifest.pl +++ b/src/bin/pg_verifybackup/t/005_bad_manifest.pl @@ -1,19 +1,21 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test the behavior of pg_verifybackup when the backup manifest has # problems. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; my $tempdir = PostgreSQL::Test::Utils::tempdir; -test_bad_manifest('input string ended unexpectedly', - qr/could not parse backup manifest: parsing failed/, < 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_verifybackup/t/007_wal.pl b/src/bin/pg_verifybackup/t/007_wal.pl index 89f96f85db11e..18852ad5bb30e 100644 --- a/src/bin/pg_verifybackup/t/007_wal.pl +++ b/src/bin/pg_verifybackup/t/007_wal.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test pg_verifybackup's WAL verification. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/bin/pg_verifybackup/t/008_untar.pl b/src/bin/pg_verifybackup/t/008_untar.pl index 1a783d118839f..7a09f3b75b2a7 100644 --- a/src/bin/pg_verifybackup/t/008_untar.pl +++ b/src/bin/pg_verifybackup/t/008_untar.pl @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # This test case aims to verify that server-side backups and server-side # backup compression work properly, and it also aims to verify that @@ -6,7 +6,7 @@ # format. use strict; -use warnings; +use warnings FATAL => 'all'; use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -104,8 +104,7 @@ { my $tar = $ENV{TAR}; # don't check for a working tar here, to accommodate various odd - # cases such as AIX. If tar doesn't work the init_from_backup below - # will fail. + # cases. If tar doesn't work the init_from_backup below will fail. skip "no tar program available", 1 if (!defined $tar || $tar eq ''); diff --git a/src/bin/pg_verifybackup/t/009_extract.pl b/src/bin/pg_verifybackup/t/009_extract.pl index f4d5378555ea8..1d531dc20d52a 100644 --- a/src/bin/pg_verifybackup/t/009_extract.pl +++ b/src/bin/pg_verifybackup/t/009_extract.pl @@ -1,11 +1,11 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # This test aims to verify that the client can decompress and extract # a backup which was compressed by the server. use strict; -use warnings; +use warnings FATAL => 'all'; use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/pg_verifybackup/t/010_client_untar.pl b/src/bin/pg_verifybackup/t/010_client_untar.pl index 44d83e777ffc9..8c076d46dee00 100644 --- a/src/bin/pg_verifybackup/t/010_client_untar.pl +++ b/src/bin/pg_verifybackup/t/010_client_untar.pl @@ -1,11 +1,11 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # This test case aims to verify that client-side backup compression work # properly, and it also aims to verify that pg_verifybackup can verify a base # backup that didn't start out in plain format. use strict; -use warnings; +use warnings FATAL => 'all'; use File::Path qw(rmtree); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -134,8 +134,7 @@ { my $tar = $ENV{TAR}; # don't check for a working tar here, to accommodate various odd - # cases such as AIX. If tar doesn't work the init_from_backup below - # will fail. + # cases. If tar doesn't work the init_from_backup below will fail. skip "no tar program available", 1 if (!defined $tar || $tar eq ''); diff --git a/src/bin/pg_waldump/Makefile b/src/bin/pg_waldump/Makefile index 0ecf582039dd2..4c1ee649501f4 100644 --- a/src/bin/pg_waldump/Makefile +++ b/src/bin/pg_waldump/Makefile @@ -45,7 +45,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_waldump$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_waldump$(X) $(OBJS) $(RMGRDESCSOURCES) xlogreader.c xlogstats.c rm -rf tmp_check diff --git a/src/bin/pg_waldump/compat.c b/src/bin/pg_waldump/compat.c index 2aca73f2e9388..1541eac6115cb 100644 --- a/src/bin/pg_waldump/compat.c +++ b/src/bin/pg_waldump/compat.c @@ -3,7 +3,7 @@ * compat.c * Reimplementations of various backend functions. * - * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_waldump/compat.c diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build index ae674d17c3843..bb30f0fe08e87 100644 --- a/src/bin/pg_waldump/meson.build +++ b/src/bin/pg_waldump/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_waldump_sources = files( 'compat.c', diff --git a/src/bin/pg_waldump/nls.mk b/src/bin/pg_waldump/nls.mk index 4f00e129ff4e0..5932bab2c5813 100644 --- a/src/bin/pg_waldump/nls.mk +++ b/src/bin/pg_waldump/nls.mk @@ -3,7 +3,10 @@ CATALOG_NAME = pg_waldump GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ pg_waldump.c \ xlogreader.c \ - xlogstats.c -GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) report_invalid_record:2 + xlogstats.c \ + ../../common/fe_memutils.c \ + ../../common/file_utils.c +GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \ + report_invalid_record:2 GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \ - report_invalid_record:2:c-format + report_invalid_record:2:c-format diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 96845e1a1aeb7..1f9403fc5cf4b 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -2,7 +2,7 @@ * * pg_waldump.c - decode and display WAL * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/bin/pg_waldump/pg_waldump.c @@ -252,10 +252,14 @@ search_directory(const char *directory, const char *fname) WalSegSz = longhdr->xlp_seg_size; if (!IsValidWalSegSize(WalSegSz)) - pg_fatal(ngettext("WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte", - "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes", - WalSegSz), - fname, WalSegSz); + { + pg_log_error(ngettext("invalid WAL segment size in WAL file \"%s\" (%d byte)", + "invalid WAL segment size in WAL file \"%s\" (%d bytes)", + WalSegSz), + fname, WalSegSz); + pg_log_error_detail("The WAL segment size must be a power of two between 1 MB and 1 GB."); + exit(1); + } } else if (r < 0) pg_fatal("could not read file \"%s\": %m", @@ -414,11 +418,11 @@ WALDumpReadPage(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, if (errinfo.wre_errno != 0) { errno = errinfo.wre_errno; - pg_fatal("could not read from file %s, offset %d: %m", + pg_fatal("could not read from file \"%s\", offset %d: %m", fname, errinfo.wre_off); } else - pg_fatal("could not read from file %s, offset %d: read %d of %d", + pg_fatal("could not read from file \"%s\", offset %d: read %d of %d", fname, errinfo.wre_off, errinfo.wre_read, errinfo.wre_req); } @@ -1220,12 +1224,12 @@ main(int argc, char **argv) */ if (first_record != private.startptr && XLogSegmentOffset(private.startptr, WalSegSz) != 0) - printf(ngettext("first record is after %X/%X, at %X/%X, skipping over %u byte\n", - "first record is after %X/%X, at %X/%X, skipping over %u bytes\n", - (first_record - private.startptr)), - LSN_FORMAT_ARGS(private.startptr), - LSN_FORMAT_ARGS(first_record), - (uint32) (first_record - private.startptr)); + pg_log_info(ngettext("first record is after %X/%X, at %X/%X, skipping over %u byte", + "first record is after %X/%X, at %X/%X, skipping over %u bytes", + (first_record - private.startptr)), + LSN_FORMAT_ARGS(private.startptr), + LSN_FORMAT_ARGS(first_record), + (uint32) (first_record - private.startptr)); if (config.stats == true && !config.quiet) stats.startptr = first_record; diff --git a/src/bin/pg_waldump/po/LINGUAS b/src/bin/pg_waldump/po/LINGUAS index fbf12b4d333d5..a8022e67106c2 100644 --- a/src/bin/pg_waldump/po/LINGUAS +++ b/src/bin/pg_waldump/po/LINGUAS @@ -1 +1 @@ -cs de el es fr it ja ka ko ru sv tr uk vi zh_CN +cs de el es fr it ja ka ko ru sv tr uk vi zh_CN zh_TW diff --git a/src/bin/pg_waldump/po/de.po b/src/bin/pg_waldump/po/de.po index c447e9cf5d55a..05af08b503ce6 100644 --- a/src/bin/pg_waldump/po/de.po +++ b/src/bin/pg_waldump/po/de.po @@ -1,13 +1,13 @@ # German message translation file for pg_waldump -# Copyright (C) 2023 PostgreSQL Global Development Group +# Copyright (C) 2024 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: pg_waldump (PostgreSQL) 16\n" +"Project-Id-Version: pg_waldump (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-02 04:18+0000\n" -"PO-Revision-Date: 2023-05-02 09:24+0200\n" +"POT-Creation-Date: 2024-06-16 07:49+0000\n" +"PO-Revision-Date: 2024-03-26 11:07+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -36,6 +36,60 @@ msgstr "Detail: " msgid "hint: " msgstr "Tipp: " +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "Speicher aufgebraucht\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 pg_waldump.c:199 +#: pg_waldump.c:532 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "konnte Datei »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_waldump.c:1104 pg_waldump.c:1127 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht lesen: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "konnte Datei »%s« nicht fsyncen: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" + #: pg_waldump.c:137 #, c-format msgid "could not create directory \"%s\": %m" @@ -51,74 +105,74 @@ msgstr "Verzeichnis »%s« existiert aber ist nicht leer" msgid "could not access directory \"%s\": %m" msgstr "konnte nicht auf Verzeichnis »%s« zugreifen: %m" -#: pg_waldump.c:199 pg_waldump.c:527 +#: pg_waldump.c:256 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "konnte Datei »%s« nicht öffnen: %m" +msgid "invalid WAL segment size in WAL file \"%s\" (%d byte)" +msgid_plural "invalid WAL segment size in WAL file \"%s\" (%d bytes)" +msgstr[0] "ungültige WAL-Segmentgröße in WAL-Datei »%s« (%d Byte)" +msgstr[1] "ungültige WAL-Segmentgröße in WAL-Datei »%s« (%d Bytes)" -#: pg_waldump.c:255 +#: pg_waldump.c:260 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" -msgstr[0] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Kopf der WAL-Datei »%s« gibt %d Byte an" -msgstr[1] "WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein, aber der Kopf der WAL-Datei »%s« gibt %d Bytes an" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "Die WAL-Segmentgröße muss eine Zweierpotenz zwischen 1 MB und 1 GB sein." -#: pg_waldump.c:261 +#: pg_waldump.c:265 #, c-format msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" -#: pg_waldump.c:264 +#: pg_waldump.c:268 #, c-format msgid "could not read file \"%s\": read %d of %d" msgstr "konnte Datei »%s« nicht lesen: %d von %d gelesen" -#: pg_waldump.c:325 +#: pg_waldump.c:329 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "konnte WAL-Datei »%s« nicht finden" -#: pg_waldump.c:327 +#: pg_waldump.c:331 #, c-format msgid "could not find any WAL file" msgstr "konnte keine WAL-Datei finden" -#: pg_waldump.c:368 +#: pg_waldump.c:372 #, c-format msgid "could not find file \"%s\": %m" msgstr "konnte Datei »%s« nicht finden: %m" -#: pg_waldump.c:417 +#: pg_waldump.c:421 #, c-format -msgid "could not read from file %s, offset %d: %m" -msgstr "konnte nicht aus Datei %s, Position %d lesen: %m" +msgid "could not read from file \"%s\", offset %d: %m" +msgstr "konnte nicht aus Datei »%s«, Position %d lesen: %m" -#: pg_waldump.c:421 +#: pg_waldump.c:425 #, c-format -msgid "could not read from file %s, offset %d: read %d of %d" -msgstr "konnte nicht aus Datei %s, Position %d lesen: %d von %d gelesen" +msgid "could not read from file \"%s\", offset %d: read %d of %d" +msgstr "konnte nicht aus Datei »%s«, Position %d lesen: %d von %d gelesen" -#: pg_waldump.c:511 +#: pg_waldump.c:515 #, c-format msgid "%s" msgstr "%s" -#: pg_waldump.c:519 +#: pg_waldump.c:523 #, c-format msgid "invalid fork number: %u" msgstr "ungültige Fork-Nummer: %u" -#: pg_waldump.c:530 +#: pg_waldump.c:535 #, c-format msgid "could not write file \"%s\": %m" msgstr "konnte Datei »%s« nicht schreiben: %m" -#: pg_waldump.c:533 +#: pg_waldump.c:538 #, c-format msgid "could not close file \"%s\": %m" msgstr "konnte Datei »%s« nicht schließen: %m" -#: pg_waldump.c:753 +#: pg_waldump.c:758 #, c-format msgid "" "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" @@ -127,17 +181,17 @@ msgstr "" "%s dekodiert und zeigt PostgreSQL-Write-Ahead-Logs zum Debuggen.\n" "\n" -#: pg_waldump.c:755 +#: pg_waldump.c:760 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: pg_waldump.c:756 +#: pg_waldump.c:761 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [OPTION]... [STARTSEG [ENDSEG]]\n" -#: pg_waldump.c:757 +#: pg_waldump.c:762 #, c-format msgid "" "\n" @@ -146,29 +200,29 @@ msgstr "" "\n" "Optionen:\n" -#: pg_waldump.c:758 +#: pg_waldump.c:763 #, c-format msgid " -b, --bkp-details output detailed information about backup blocks\n" msgstr " -b, --bkp-details detaillierte Informationen über Backup-Blöcke ausgeben\n" -#: pg_waldump.c:759 +#: pg_waldump.c:764 #, c-format msgid " -B, --block=N with --relation, only show records that modify block N\n" msgstr "" " -B, --block=N mit --relation, nur Datensätze zeigen, die Block N\n" " modifizieren\n" -#: pg_waldump.c:760 +#: pg_waldump.c:765 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" msgstr " -e, --end=RECPTR bei WAL-Position RECPTR zu lesen aufhören\n" -#: pg_waldump.c:761 +#: pg_waldump.c:766 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" msgstr " -f, --follow am Ende des WAL weiter versuchen\n" -#: pg_waldump.c:762 +#: pg_waldump.c:767 #, c-format msgid "" " -F, --fork=FORK only show records that modify blocks in fork FORK;\n" @@ -177,12 +231,12 @@ msgstr "" " -F, --fork=FORK nur Datensätze zeigen, die Blöcke in Fork FORK\n" " modifizieren; gültige Werte sind main, fsm, vm, init\n" -#: pg_waldump.c:764 +#: pg_waldump.c:769 #, c-format msgid " -n, --limit=N number of records to display\n" msgstr " -n, --limit=N Anzahl der anzuzeigenden Datensätze\n" -#: pg_waldump.c:765 +#: pg_waldump.c:770 #, c-format msgid "" " -p, --path=PATH directory in which to find WAL segment files or a\n" @@ -193,12 +247,12 @@ msgstr "" " mit ./pg_wal mit solchen Dateien (Vorgabe: aktuelles\n" " Verzeichnis, ./pg_wal, $PGDATA/pg_wal)\n" -#: pg_waldump.c:768 +#: pg_waldump.c:773 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet keine Ausgabe, außer Fehler\n" -#: pg_waldump.c:769 +#: pg_waldump.c:774 #, c-format msgid "" " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" @@ -207,19 +261,19 @@ msgstr "" " -r, --rmgr=RMGR nur Datensätze erzeugt von Resource-Manager RMGR zeigen;\n" " --rmgr=list zeigt gültige Resource-Manager-Namen\n" -#: pg_waldump.c:771 +#: pg_waldump.c:776 #, c-format msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n" msgstr "" " -R, --relation=T/D/R nur Datensätze zeigen, die Blöcke in Relation T/D/R\n" " modifizieren\n" -#: pg_waldump.c:772 +#: pg_waldump.c:777 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" msgstr " -s, --start=RECPTR bei WAL-Position RECPTR zu lesen anfangen\n" -#: pg_waldump.c:773 +#: pg_waldump.c:778 #, c-format msgid "" " -t, --timeline=TLI timeline from which to read WAL records\n" @@ -228,22 +282,22 @@ msgstr "" " -t, --timeline=ZAHL Zeitleiste aus der WAL-Einträge gelesen werden sollen\n" " (Vorgabe: 1 oder der in STARTSEG verwendete Wert)\n" -#: pg_waldump.c:775 +#: pg_waldump.c:780 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: pg_waldump.c:776 +#: pg_waldump.c:781 #, c-format msgid " -w, --fullpage only show records with a full page write\n" msgstr " -w, --fullpage nur Datensätze mit einem Full-Page-Write zeigen\n" -#: pg_waldump.c:777 +#: pg_waldump.c:782 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" msgstr " -x, --xid=XID nur Datensätze mit Transaktions-ID XID zeigen\n" -#: pg_waldump.c:778 +#: pg_waldump.c:783 #, c-format msgid "" " -z, --stats[=record] show statistics instead of records\n" @@ -252,17 +306,17 @@ msgstr "" " -z, --stats[=record] Statistiken statt Datensätzen anzeigen\n" " (optional Statistiken pro Datensatz zeigen)\n" -#: pg_waldump.c:780 +#: pg_waldump.c:785 #, c-format msgid " --save-fullpage=DIR save full page images to DIR\n" msgstr " --save-fullpage=VERZ Full-Page-Images in VERZ speichern\n" -#: pg_waldump.c:781 +#: pg_waldump.c:786 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: pg_waldump.c:782 +#: pg_waldump.c:787 #, c-format msgid "" "\n" @@ -271,304 +325,284 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: pg_waldump.c:783 +#: pg_waldump.c:788 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: pg_waldump.c:879 +#: pg_waldump.c:884 #, c-format msgid "no arguments specified" msgstr "keine Argumente angegeben" -#: pg_waldump.c:895 +#: pg_waldump.c:900 #, c-format msgid "invalid block number: \"%s\"" msgstr "ungültige Blocknummer: »%s«" -#: pg_waldump.c:904 pg_waldump.c:1002 +#: pg_waldump.c:909 pg_waldump.c:1007 #, c-format msgid "invalid WAL location: \"%s\"" msgstr "ungültige WAL-Position: »%s«" -#: pg_waldump.c:917 +#: pg_waldump.c:922 #, c-format msgid "invalid fork name: \"%s\"" msgstr "ungültiger Fork-Name: »%s«" -#: pg_waldump.c:925 pg_waldump.c:1028 +#: pg_waldump.c:930 pg_waldump.c:1033 #, c-format msgid "invalid value \"%s\" for option %s" msgstr "ungültiger Wert »%s« für Option %s" -#: pg_waldump.c:956 +#: pg_waldump.c:961 #, c-format msgid "custom resource manager \"%s\" does not exist" -msgstr "Custom-Resouce-Manager »%s« existiert nicht" +msgstr "Custom-Resource-Manager »%s« existiert nicht" -#: pg_waldump.c:977 +#: pg_waldump.c:982 #, c-format msgid "resource manager \"%s\" does not exist" -msgstr "Resouce-Manager »%s« existiert nicht" +msgstr "Resource-Manager »%s« existiert nicht" -#: pg_waldump.c:992 +#: pg_waldump.c:997 #, c-format msgid "invalid relation specification: \"%s\"" msgstr "ungültige Relationsangabe: »%s«" -#: pg_waldump.c:993 +#: pg_waldump.c:998 #, c-format msgid "Expecting \"tablespace OID/database OID/relation filenode\"." msgstr "Erwartet wurde »Tablespace-OID/Datenbank-OID/Relation-Filenode«." -#: pg_waldump.c:1035 +#: pg_waldump.c:1040 #, c-format msgid "%s must be in range %u..%u" msgstr "%s muss im Bereich %u..%u sein" -#: pg_waldump.c:1050 +#: pg_waldump.c:1055 #, c-format msgid "invalid transaction ID specification: \"%s\"" msgstr "ungültige Transaktions-ID-Angabe: »%s«" -#: pg_waldump.c:1065 +#: pg_waldump.c:1070 #, c-format msgid "unrecognized value for option %s: %s" msgstr "unbekannter Wert für Option %s: %s" -#: pg_waldump.c:1082 +#: pg_waldump.c:1087 #, c-format msgid "option %s requires option %s to be specified" msgstr "Option %s erfordert, dass Option %s angegeben wird" -#: pg_waldump.c:1089 +#: pg_waldump.c:1094 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: pg_waldump.c:1099 pg_waldump.c:1122 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" - -#: pg_waldump.c:1128 pg_waldump.c:1158 +#: pg_waldump.c:1133 pg_waldump.c:1163 #, c-format msgid "could not open file \"%s\"" msgstr "konnte Datei »%s« nicht öffnen" -#: pg_waldump.c:1138 +#: pg_waldump.c:1143 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "WAL-Startposition %X/%X ist nicht innerhalb der Datei »%s«" -#: pg_waldump.c:1165 +#: pg_waldump.c:1170 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "ENDSEG %s kommt vor STARTSEG %s" -#: pg_waldump.c:1180 +#: pg_waldump.c:1185 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "WAL-Endposition %X/%X ist nicht innerhalb der Datei »%s«" -#: pg_waldump.c:1192 +#: pg_waldump.c:1197 #, c-format msgid "no start WAL location given" msgstr "keine WAL-Startposition angegeben" -#: pg_waldump.c:1206 +#: pg_waldump.c:1211 #, c-format msgid "out of memory while allocating a WAL reading processor" msgstr "Speicher aufgebraucht beim Anlegen eines WAL-Leseprozessors" -#: pg_waldump.c:1212 +#: pg_waldump.c:1217 #, c-format msgid "could not find a valid record after %X/%X" msgstr "konnte keinen gültigen Datensatz nach %X/%X finden" -#: pg_waldump.c:1222 +#: pg_waldump.c:1227 #, c-format -msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" -msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" -msgstr[0] "erster Datensatz kommt nach %X/%X, bei %X/%X, %u Byte wurde übersprungen\n" -msgstr[1] "erster Datensatz kommt nach %X/%X, bei %X/%X, %u Bytes wurden übersprungen\n" +msgid "first record is after %X/%X, at %X/%X, skipping over %u byte" +msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes" +msgstr[0] "erster Datensatz kommt nach %X/%X, bei %X/%X, %u Byte wurde übersprungen" +msgstr[1] "erster Datensatz kommt nach %X/%X, bei %X/%X, %u Bytes wurden übersprungen" -#: pg_waldump.c:1307 +#: pg_waldump.c:1312 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "Fehler in WAL-Eintrag bei %X/%X: %s" -#: pg_waldump.c:1316 +#: pg_waldump.c:1321 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: xlogreader.c:626 +#: xlogreader.c:619 #, c-format msgid "invalid record offset at %X/%X: expected at least %u, got %u" msgstr "ungültiger Datensatz-Offset bei %X/%X: mindestens %u erwartet, %u erhalten" -#: xlogreader.c:635 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "Contrecord angefordert von %X/%X" -#: xlogreader.c:676 xlogreader.c:1123 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "ungültige Datensatzlänge bei %X/%X: mindestens %u erwartet, %u erhalten" -#: xlogreader.c:705 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "Speicher aufgebraucht beim Versuch einen Datensatz mit Länge %u zu dekodieren" - -#: xlogreader.c:727 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "Datensatzlänge %u bei %X/%X ist zu lang" - -#: xlogreader.c:776 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "keine Contrecord-Flag bei %X/%X" -#: xlogreader.c:789 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "ungültige Contrecord-Länge %u (erwartet %lld) bei %X/%X" -#: xlogreader.c:924 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "Contrecord fehlt bei %X/%X" - -#: xlogreader.c:1131 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ungültige Resource-Manager-ID %u bei %X/%X" -#: xlogreader.c:1144 xlogreader.c:1160 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "Datensatz mit falschem Prev-Link %X/%X bei %X/%X" -#: xlogreader.c:1196 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "ungültige Resource-Manager-Datenprüfsumme in Datensatz bei %X/%X" -#: xlogreader.c:1230 +#: xlogreader.c:1243 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "ungültige magische Zahl %04X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1245 xlogreader.c:1287 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "ungültige Info-Bits %04X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1261 +#: xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: Datenbanksystemidentifikator in WAL-Datei ist %llu, Datenbanksystemidentifikator in pg_control ist %llu" -#: xlogreader.c:1269 +#: xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche Segmentgröße im Seitenkopf" -#: xlogreader.c:1275 +#: xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL-Datei ist von einem anderen Datenbanksystem: falsche XLOG_BLCKSZ im Seitenkopf" -#: xlogreader.c:1307 +#: xlogreader.c:1320 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "unerwartete Pageaddr %X/%X in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1333 +#: xlogreader.c:1346 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "Zeitleisten-ID %u außer der Reihe (nach %u) in WAL-Segment %s, LSN %X/%X, Offset %u" -#: xlogreader.c:1739 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u außer der Reihe bei %X/%X" -#: xlogreader.c:1763 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA gesetzt, aber keine Daten enthalten bei %X/%X" -#: xlogreader.c:1770 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA nicht gesetzt, aber Datenlänge ist %u bei %X/%X" -#: xlogreader.c:1806 +#: xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE gesetzt, aber Loch Offset %u Länge %u Block-Abbild-Länge %u bei %X/%X" -#: xlogreader.c:1822 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE nicht gesetzt, aber Loch Offset %u Länge %u bei %X/%X" -#: xlogreader.c:1836 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge %u bei %X/%X" -#: xlogreader.c:1851 +#: xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "weder BKPIMAGE_HAS_HOLE noch BKPIMAGE_COMPRESSED gesetzt, aber Block-Abbild-Länge ist %u bei %X/%X" -#: xlogreader.c:1867 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL gesetzt, aber keine vorangehende Relation bei %X/%X" -#: xlogreader.c:1879 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ungültige block_id %u bei %X/%X" -#: xlogreader.c:1946 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "Datensatz mit ungültiger Länge bei %X/%X" -#: xlogreader.c:1972 +#: xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "konnte Backup-Block mit ID %d nicht im WAL-Eintrag finden" -#: xlogreader.c:2056 +#: xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "konnte Abbild bei %X/%X mit ungültigem angegebenen Block %d nicht wiederherstellen" -#: xlogreader.c:2063 +#: xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "konnte Abbild mit ungültigem Zustand bei %X/%X nicht wiederherstellen, Block %d" -#: xlogreader.c:2090 xlogreader.c:2107 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit %s, nicht unterstützt von dieser Installation, Block %d" -#: xlogreader.c:2116 +#: xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "konnte Abbild bei %X/%X nicht wiederherstellen, komprimiert mit unbekannter Methode, Block %d" -#: xlogreader.c:2124 +#: xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d" diff --git a/src/bin/pg_waldump/po/el.po b/src/bin/pg_waldump/po/el.po index 622c6f2e0aaf3..5cc4cbd142a24 100644 --- a/src/bin/pg_waldump/po/el.po +++ b/src/bin/pg_waldump/po/el.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_waldump (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-16 09:47+0000\n" -"PO-Revision-Date: 2023-04-17 11:17+0200\n" +"POT-Creation-Date: 2023-08-14 23:17+0000\n" +"PO-Revision-Date: 2023-08-15 15:33+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -40,54 +40,89 @@ msgstr "λεπτομέÏεια: " msgid "hint: " msgstr "υπόδειξη: " -#: pg_waldump.c:160 +#: pg_waldump.c:137 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "δεν ήταν δυνατή η δημιουÏγία του καταλόγου «%s»: %m" + +#: pg_waldump.c:146 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "ο κατάλογος «%s» υπάÏχει και δεν είναι άδειος" + +#: pg_waldump.c:150 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "δεν ήταν δυνατή η Ï€Ïόσβαση του καταλόγου «%s»: %m" + +#: pg_waldump.c:199 pg_waldump.c:528 #, c-format msgid "could not open file \"%s\": %m" msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»: %m" -#: pg_waldump.c:216 +#: pg_waldump.c:255 #, c-format msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" msgstr[0] "η τιμή του μεγέθους τμήματος WAL Ï€Ïέπει να ανήκει σε δÏναμη του δÏο Î¼ÎµÏ„Î±Î¾Ï 1 MB και 1 GB, αλλά η κεφαλίδα «%s» του αÏχείου WAL καθοÏίζει %d byte" msgstr[1] "η τιμή του μεγέθους τμήματος WAL Ï€Ïέπει να ανήκει σε δÏναμη του δÏο Î¼ÎµÏ„Î±Î¾Ï 1 MB και 1 GB, αλλά η κεφαλίδα «%s» του αÏχείου WAL καθοÏίζει %d bytes" -#: pg_waldump.c:222 +#: pg_waldump.c:261 #, c-format msgid "could not read file \"%s\": %m" msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: %m" -#: pg_waldump.c:225 +#: pg_waldump.c:264 #, c-format msgid "could not read file \"%s\": read %d of %d" msgstr "δεν ήταν δυνατή η ανάγνωση του αÏχείου «%s»: ανέγνωσε %d από %d" -#: pg_waldump.c:286 +#: pg_waldump.c:325 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "δεν ήταν δυνατός ο εντοπισμός του αÏχείου WAL «%s»" -#: pg_waldump.c:288 +#: pg_waldump.c:327 #, c-format msgid "could not find any WAL file" msgstr "δεν ήταν δυνατή η εÏÏεση οποιουδήποτε αÏχείου WAL" -#: pg_waldump.c:329 +#: pg_waldump.c:368 #, c-format msgid "could not find file \"%s\": %m" msgstr "δεν ήταν δυνατή η εÏÏεση του αÏχείου «%s»: %m" -#: pg_waldump.c:378 +#: pg_waldump.c:417 #, c-format msgid "could not read from file %s, offset %d: %m" msgstr "δεν ήταν δυνατή η ανάγνωση από αÏχείο %s, μετατόπιση %d: %m" -#: pg_waldump.c:382 +#: pg_waldump.c:421 #, c-format msgid "could not read from file %s, offset %d: read %d of %d" msgstr "δεν ήταν δυνατή η ανάγνωση από αÏχείο %s, μετατόπιση %d: ανέγνωσε %d από %d" -#: pg_waldump.c:658 +#: pg_waldump.c:511 +#, c-format +msgid "%s" +msgstr "%s" + +#: pg_waldump.c:519 +#, c-format +msgid "invalid fork number: %u" +msgstr "μη έγκυÏος αÏιθμός fork %u" + +#: pg_waldump.c:531 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "δεν ήταν δυνατή η εγγÏαφή αÏχείου «%s»: %m" + +#: pg_waldump.c:534 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "δεν ήταν δυνατό το κλείσιμο του αÏχείου «%s»: %m" + +#: pg_waldump.c:754 #, c-format msgid "" "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" @@ -96,17 +131,17 @@ msgstr "" "%s αποκωδικοποιεί και εμφανίζει αÏχεία καταγÏαφής εμπÏόσθιας-εγγÏαφής PostgreSQL για αποσφαλμάτωση.\n" "\n" -#: pg_waldump.c:660 +#: pg_waldump.c:756 #, c-format msgid "Usage:\n" msgstr "ΧÏήση:\n" -#: pg_waldump.c:661 +#: pg_waldump.c:757 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [ΕΠΙΛΟΓΗ]... [STARTSEG [ENDSEG]]\n" -#: pg_waldump.c:662 +#: pg_waldump.c:758 #, c-format msgid "" "\n" @@ -115,27 +150,27 @@ msgstr "" "\n" "Επιλογές:\n" -#: pg_waldump.c:663 +#: pg_waldump.c:759 #, c-format msgid " -b, --bkp-details output detailed information about backup blocks\n" msgstr " -b, --bkp-details πάÏαγε λεπτομεÏείς πληÏοφοÏίες σχετικά με τα μπλοκ αντιγÏάφων ασφαλείας\n" -#: pg_waldump.c:664 +#: pg_waldump.c:760 #, c-format msgid " -B, --block=N with --relation, only show records that modify block N\n" msgstr " -B, --block=N μαζί με --relation, εμφάνισε μόνο εγγÏαφές που Ï„ÏοποποιοÏν το μπλοκ N\n" -#: pg_waldump.c:665 +#: pg_waldump.c:761 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" msgstr " -e, --end=RECPTR σταμάτησε την ανάγνωση στη τοποθεσία WAL RECPTR\n" -#: pg_waldump.c:666 +#: pg_waldump.c:762 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" msgstr " -f, --follow εξακολοÏθησε την Ï€Ïοσπάθεια μετά την επίτευξη του τέλους του WAL\n" -#: pg_waldump.c:667 +#: pg_waldump.c:763 #, c-format msgid "" " -F, --fork=FORK only show records that modify blocks in fork FORK;\n" @@ -144,28 +179,28 @@ msgstr "" " -F, --fork=FORK εμφάνισε μόνο εγγÏαφές που Ï„ÏοποποιοÏν μπλοκ στο fork FORK,\n" " έγκυÏες ονομασίες είναι main, fsm, vm, init\n" -#: pg_waldump.c:669 +#: pg_waldump.c:765 #, c-format msgid " -n, --limit=N number of records to display\n" msgstr " -n, --limit=N αÏιθμός των εγγÏαφών για εμφάνιση\n" -#: pg_waldump.c:670 +#: pg_waldump.c:766 #, c-format msgid "" -" -p, --path=PATH directory in which to find log segment files or a\n" +" -p, --path=PATH directory in which to find WAL segment files or a\n" " directory with a ./pg_wal that contains such files\n" " (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n" msgstr "" -" -p, --path=PATH κατάλογος στον οποίο βÏίσκονται αÏχεία τμήματος καταγÏαφής ή\n" +" -p, --path=PATH κατάλογος στον οποίο βÏίσκονται αÏχεία τμήματος WAL ή\n" " ένα κατάλογο με ./pg_wal που πεÏιέχει τέτοια αÏχεία\n" " (Ï€Ïοεπιλογή: Ï„Ïέχων κατάλογος, ./pg_wal, $PGDATA/pg_wal)\n" -#: pg_waldump.c:673 +#: pg_waldump.c:769 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet να μην εκτυπωθεί καμία έξοδος, εκτός από σφάλματα\n" -#: pg_waldump.c:674 +#: pg_waldump.c:770 #, c-format msgid "" " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" @@ -174,41 +209,41 @@ msgstr "" " -r, --rmgr=RMGR εμφάνισε μόνο εγγÏαφές που δημιουÏγοÏνται από τον διαχειÏιστή πόÏων RMGR·\n" " χÏησιμοποίησε --rmgr=list για την παÏάθεση έγκυÏων ονομάτων διαχειÏιστών πόÏων\n" -#: pg_waldump.c:676 +#: pg_waldump.c:772 #, c-format msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n" msgstr " -R, --relation=T/D/R εμφάνισε μόνο εγγÏαφές που Ï„ÏοποποιοÏν μπλοκ στη σχέση T/D/R\n" -#: pg_waldump.c:677 +#: pg_waldump.c:773 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" msgstr " -s, --start=RECPTR άÏχισε την ανάγνωση WAL από την τοποθεσία RECPTR\n" -#: pg_waldump.c:678 +#: pg_waldump.c:774 #, c-format msgid "" -" -t, --timeline=TLI timeline from which to read log records\n" +" -t, --timeline=TLI timeline from which to read WAL records\n" " (default: 1 or the value used in STARTSEG)\n" msgstr "" -" -t, --timeline=TLI χÏονογÏαμή από την οποία να αναγνωστοÏν εγγÏαφές καταγÏαφής\n" +" -t, --timeline=TLI χÏονογÏαμή από την οποία να αναγνωστοÏν εγγÏαφές WAL\n" " (Ï€Ïοεπιλογή: 1 ή η τιμή που χÏησιμοποιήθηκε στο STARTSEG)\n" -#: pg_waldump.c:680 +#: pg_waldump.c:776 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n" -#: pg_waldump.c:681 +#: pg_waldump.c:777 #, c-format msgid " -w, --fullpage only show records with a full page write\n" msgstr " -w, --fullpage εμφάνισε μόνο εγγÏαφές με εγγÏαφή πλήÏους σελίδας\n" -#: pg_waldump.c:682 +#: pg_waldump.c:778 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" msgstr " -x, --xid=XID εμφάνισε μόνο εγγÏαφές με ID συναλλαγής XID\n" -#: pg_waldump.c:683 +#: pg_waldump.c:779 #, c-format msgid "" " -z, --stats[=record] show statistics instead of records\n" @@ -217,12 +252,17 @@ msgstr "" " -z, --stats[=record] εμφάνισε στατιστικά στοιχεία αντί για εγγÏαφές\n" " (Ï€ÏοαιÏετικά, εμφάνισε στατιστικά στοιχεία ανά εγγÏαφή)\n" -#: pg_waldump.c:685 +#: pg_waldump.c:781 +#, c-format +msgid " --save-fullpage=DIR save full page images to DIR\n" +msgstr " --save-fullpage=DIR αποθήκευσε πλήÏεις εικόνες σελίδων σε DIR\n" + +#: pg_waldump.c:782 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" -#: pg_waldump.c:686 +#: pg_waldump.c:783 #, c-format msgid "" "\n" @@ -231,227 +271,222 @@ msgstr "" "\n" "Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n" -#: pg_waldump.c:687 +#: pg_waldump.c:784 #, c-format msgid "%s home page: <%s>\n" msgstr "%s αÏχική σελίδα: <%s>\n" -#: pg_waldump.c:781 +#: pg_waldump.c:880 #, c-format msgid "no arguments specified" msgstr "δεν καθοÏίστηκαν παÏάμετÏοι" -#: pg_waldump.c:797 +#: pg_waldump.c:896 #, c-format msgid "invalid block number: \"%s\"" msgstr "μη έγκυÏος αÏιθμός μπλοκ: «%s»" -#: pg_waldump.c:806 pg_waldump.c:904 +#: pg_waldump.c:905 pg_waldump.c:1003 #, c-format msgid "invalid WAL location: \"%s\"" msgstr "άκυÏη τοποθεσία WAL: «%s»" -#: pg_waldump.c:819 +#: pg_waldump.c:918 #, c-format msgid "invalid fork name: \"%s\"" msgstr "μη έγκυÏη ονομασία fork «%s»" -#: pg_waldump.c:827 +#: pg_waldump.c:926 pg_waldump.c:1029 #, c-format msgid "invalid value \"%s\" for option %s" msgstr "μη έγκυÏη τιμή «%s» για την επιλογή %s" -#: pg_waldump.c:858 +#: pg_waldump.c:957 #, c-format msgid "custom resource manager \"%s\" does not exist" msgstr "ο Ï€ÏοσαÏμοσμένος διαχειÏιστής πόÏων «%s» δεν υπάÏχει" -#: pg_waldump.c:879 +#: pg_waldump.c:978 #, c-format msgid "resource manager \"%s\" does not exist" msgstr "ο διαχειÏιστής πόÏων «%s» δεν υπάÏχει" -#: pg_waldump.c:894 +#: pg_waldump.c:993 #, c-format msgid "invalid relation specification: \"%s\"" msgstr "μη έγκυÏη Ï€ÏοδιαγÏαφή σχέσης: «%s»" -#: pg_waldump.c:895 +#: pg_waldump.c:994 #, c-format msgid "Expecting \"tablespace OID/database OID/relation filenode\"." msgstr "Αναμένει \"tablespace OID/database OID/relation filenode\"." -#: pg_waldump.c:914 +#: pg_waldump.c:1036 #, c-format -msgid "invalid timeline specification: \"%s\"" -msgstr "άκυÏη Ï€ÏοδιαγÏαφή χÏονοδιαγÏαμμής: «%s»" +msgid "%s must be in range %u..%u" +msgstr "%s Ï€Ïέπει να βÏίσκεται εντός εÏÏους %u..%u" -#: pg_waldump.c:924 +#: pg_waldump.c:1051 #, c-format msgid "invalid transaction ID specification: \"%s\"" msgstr "μη έγκυÏη Ï€ÏοδιαγÏαφή ID συναλλαγής: «%s»" -#: pg_waldump.c:939 +#: pg_waldump.c:1066 #, c-format msgid "unrecognized value for option %s: %s" msgstr "μη αναγνωÏίσιμη τιμή για την επιλογή %s: %s" -#: pg_waldump.c:953 +#: pg_waldump.c:1083 #, c-format msgid "option %s requires option %s to be specified" msgstr "η επιλογή %s απαιτεί να έχει καθοÏιστεί η επιλογή %s" -#: pg_waldump.c:960 +#: pg_waldump.c:1090 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "πάÏα πολλές παÏάμετÏοι εισόδου από την γÏαμμή εντολών (η Ï€Ïώτη είναι η «%s»)" -#: pg_waldump.c:970 pg_waldump.c:990 +#: pg_waldump.c:1100 pg_waldump.c:1123 #, c-format msgid "could not open directory \"%s\": %m" msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m" -#: pg_waldump.c:996 pg_waldump.c:1026 +#: pg_waldump.c:1129 pg_waldump.c:1159 #, c-format msgid "could not open file \"%s\"" msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»" -#: pg_waldump.c:1006 +#: pg_waldump.c:1139 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "τοποθεσία εκκίνησης WAL %X/%X δεν βÏίσκεται μέσα στο αÏχείο «%s»" -#: pg_waldump.c:1033 +#: pg_waldump.c:1166 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "ENDSEG %s βÏίσκεται Ï€Ïιν από STARTSEG %s" -#: pg_waldump.c:1048 +#: pg_waldump.c:1181 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "η τελική τοποθεσία WAL %X/%X δεν βÏίσκεται μέσα στο αÏχείο «%s»" -#: pg_waldump.c:1060 +#: pg_waldump.c:1193 #, c-format msgid "no start WAL location given" msgstr "δεν δόθηκε καμία τοποθεσία έναÏξης WAL" -#: pg_waldump.c:1074 +#: pg_waldump.c:1207 #, c-format msgid "out of memory while allocating a WAL reading processor" msgstr "η μνήμη δεν επαÏκεί για την εκχώÏηση επεξεÏγαστή ανάγνωσης WAL" -#: pg_waldump.c:1080 +#: pg_waldump.c:1213 #, c-format msgid "could not find a valid record after %X/%X" msgstr "δεν ήταν δυνατή η εÏÏεση έγκυÏης εγγÏαφής μετά %X/%X" -#: pg_waldump.c:1090 +#: pg_waldump.c:1223 #, c-format msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" msgstr[0] "Ï€Ïώτη εγγÏαφή βÏίσκεται μετά από %X/%X, σε %X/%X, παÏακάμπτοντας %u byte\n" msgstr[1] "Ï€Ïώτη εγγÏαφή βÏίσκεται μετά από %X/%X, σε %X/%X, παÏακάμπτοντας %u bytes\n" -#: pg_waldump.c:1171 +#: pg_waldump.c:1308 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "σφάλμα στην εγγÏαφή WAL στο %X/%X: %s" -#: pg_waldump.c:1180 +#: pg_waldump.c:1317 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες." -#: xlogreader.c:625 +#: xlogreader.c:626 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "μη έγκυÏη μετατόπιση εγγÏαφών σε %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "μη έγκυÏο μήκος εγγÏαφής σε %X/%X: ανέμενε τουλάχιστον %u, έλαβε %u" -#: xlogreader.c:633 +#: xlogreader.c:635 #, c-format msgid "contrecord is requested by %X/%X" msgstr "contrecord ζητείται από %X/%X" -#: xlogreader.c:674 xlogreader.c:1121 +#: xlogreader.c:676 xlogreader.c:1119 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "μη έγκυÏο μήκος εγγÏαφής σε %X/%X: χÏειαζόταν %u, έλαβε %u" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "μη έγκυÏο μήκος εγγÏαφής σε %X/%X: ανένεμενε τουλάχιστον %u, έλαβε %u" -#: xlogreader.c:703 +#: xlogreader.c:705 #, c-format msgid "out of memory while trying to decode a record of length %u" msgstr "έλλειψη μνήμης κατά την Ï€Ïοσπάθεια αποκωδικοποίησης εγγÏαφής με μήκος %u" -#: xlogreader.c:725 +#: xlogreader.c:727 #, c-format msgid "record length %u at %X/%X too long" msgstr "μήκος εγγÏαφής %u σε %X/%X Ï€Î¿Î»Ï Î¼Î±ÎºÏÏ" -#: xlogreader.c:774 +#: xlogreader.c:776 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "δεν υπάÏχει σημαία contrecord στο %X/%X" -#: xlogreader.c:787 +#: xlogreader.c:789 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "μη έγκυÏο μήκος contrecord %u (αναμένεται %lld) σε %X/%X" -#: xlogreader.c:922 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "λείπει contrecord στο %X/%X" - -#: xlogreader.c:1129 +#: xlogreader.c:1127 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "μη έγκυÏο ID %u διαχειÏιστή πόÏων στο %X/%X" -#: xlogreader.c:1142 xlogreader.c:1158 +#: xlogreader.c:1140 xlogreader.c:1156 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "εγγÏαφή με εσφαλμένο prev-link %X/%X σε %X/%X" -#: xlogreader.c:1194 +#: xlogreader.c:1192 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "εσφαλμένο άθÏοισμα ελέγχου δεδομένων διαχειÏιστή πόÏων σε εγγÏαφή στο %X/%X" -#: xlogreader.c:1231 +#: xlogreader.c:1226 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "μη έγκυÏος μαγικός αÏιθμός %04X στο τμήμα καταγÏαφής %s, μετατόπιση %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "μη έγκυÏος μαγικός αÏιθμός %04X στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u" -#: xlogreader.c:1245 xlogreader.c:1286 +#: xlogreader.c:1241 xlogreader.c:1283 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "μη έγκυÏα info bits %04X στο τμήμα καταγÏαφής %s, μετατόπιση %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "μη έγκυÏα info bits %04X στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u" -#: xlogreader.c:1260 +#: xlogreader.c:1257 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL αÏχείο Ï€ÏοέÏχεται από διαφοÏετικό σÏστημα βάσης δεδομένων: το WAL αναγνωÏιστικό συστήματος βάσης δεδομένων αÏχείων είναι %llu, το pg_control αναγνωÏιστικό συστήματος βάσης δεδομένων είναι %llu" -#: xlogreader.c:1268 +#: xlogreader.c:1265 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL αÏχείο Ï€ÏοέÏχεται από διαφοÏετικό σÏστημα βάσης δεδομένων: εσφαλμένο μέγεθος τμήματος στην κεφαλίδα σελίδας" -#: xlogreader.c:1274 +#: xlogreader.c:1271 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL αÏχείο Ï€ÏοέÏχεται από διαφοÏετικό σÏστημα βάσης δεδομένων: εσφαλμένο XLOG_BLCKSZ στην κεφαλίδα σελίδας" -#: xlogreader.c:1305 +#: xlogreader.c:1303 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "μη αναμενόμενο pageaddr %X/%X στο τμήμα καταγÏαφής %s, μετατόπιση %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "μη αναμενόμενο pageaddr %X/%X στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u" -#: xlogreader.c:1330 +#: xlogreader.c:1329 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "εκτός ακολουθίας ID χÏονογÏαμμής %u (μετά %u) στο τμήμα καταγÏαφής %s, μετατόπιση %u" +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "εκτός ακολουθίας ID χÏονογÏαμμής %u (μετά %u) στο τμήμα WAL %s, LSN %X/%X, μετατόπιση %u" #: xlogreader.c:1735 #, c-format @@ -503,32 +538,32 @@ msgstr "μη έγκυÏο block_id %u στο %X/%X" msgid "record with invalid length at %X/%X" msgstr "εγγÏαφή με μη έγκυÏο μήκος στο %X/%X" -#: xlogreader.c:1967 +#: xlogreader.c:1968 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "δεν ήταν δυνατή η εÏÏεση μπλοκ αντιγÏάφου με ID %d στην εγγÏαφή WAL" -#: xlogreader.c:2051 +#: xlogreader.c:2052 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας στο %X/%X με οÏισμένο άκυÏο μπλοκ %d" -#: xlogreader.c:2058 +#: xlogreader.c:2059 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας στο %X/%X με άκυÏη κατάσταση, μπλοκ %d" -#: xlogreader.c:2085 xlogreader.c:2102 +#: xlogreader.c:2086 xlogreader.c:2103 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας σε %X/%X συμπιεσμένη με %s που δεν υποστηÏίζεται από την υλοποίηση, μπλοκ %d" -#: xlogreader.c:2111 +#: xlogreader.c:2112 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "δεν ήταν δυνατή η επαναφοÏά εικόνας σε %X/%X συμπιεσμένη με άγνωστη μέθοδο, μπλοκ %d" -#: xlogreader.c:2119 +#: xlogreader.c:2120 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "δεν ήταν δυνατή η αποσυμπιέση εικόνας στο %X/%X, μπλοκ %d" @@ -557,6 +592,15 @@ msgstr "δεν ήταν δυνατή η αποσυμπιέση εικόνας σ #~ msgid "fatal: " #~ msgstr "κÏίσιμο: " +#~ msgid "invalid record offset at %X/%X" +#~ msgstr "μη έγκυÏη μετατόπιση εγγÏαφών σε %X/%X" + +#~ msgid "invalid timeline specification: \"%s\"" +#~ msgstr "άκυÏη Ï€ÏοδιαγÏαφή χÏονοδιαγÏαμμής: «%s»" + +#~ msgid "missing contrecord at %X/%X" +#~ msgstr "λείπει contrecord στο %X/%X" + #~ msgid "out of memory" #~ msgstr "έλλειψη μνήμης" diff --git a/src/bin/pg_waldump/po/es.po b/src/bin/pg_waldump/po/es.po index b5e99399cc385..18864a7bcd4a6 100644 --- a/src/bin/pg_waldump/po/es.po +++ b/src/bin/pg_waldump/po/es.po @@ -7,10 +7,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_waldump (PostgreSQL) 16\n" +"Project-Id-Version: pg_waldump (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:18+0000\n" -"PO-Revision-Date: 2023-05-22 12:06+0200\n" +"POT-Creation-Date: 2025-02-16 19:48+0000\n" +"PO-Revision-Date: 2024-11-16 14:24+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -40,6 +40,60 @@ msgstr "detalle: " msgid "hint: " msgstr "consejo: " +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "memoria agotada\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "no se puede duplicar un puntero nulo (error interno)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 pg_waldump.c:199 +#: pg_waldump.c:532 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "no se pudo abrir el archivo «%s»: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "no se pudo hacer stat al archivo «%s»: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "esta instalación no soporta el método de sync «%s»" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_waldump.c:1104 pg_waldump.c:1127 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "no se pudo abrir el directorio «%s»: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "no se pudo leer el directorio «%s»: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" + #: pg_waldump.c:137 #, c-format msgid "could not create directory \"%s\": %m" @@ -55,74 +109,74 @@ msgstr "el directorio «%s» existe pero no está vacío" msgid "could not access directory \"%s\": %m" msgstr "no se pudo acceder al directorio «%s»: %m" -#: pg_waldump.c:199 pg_waldump.c:527 +#: pg_waldump.c:256 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "no se pudo abrir el archivo «%s»: %m" +msgid "invalid WAL segment size in WAL file \"%s\" (%d byte)" +msgid_plural "invalid WAL segment size in WAL file \"%s\" (%d bytes)" +msgstr[0] "el archivo WAL «%s» especifica un tamaño de segmento de WAL no válido (%d byte)" +msgstr[1] "el archivo WAL «%s» especifica un tamaño de segmento de WAL no válido (%d bytes)" -#: pg_waldump.c:255 +#: pg_waldump.c:260 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" -msgstr[0] "el tamaño de segmento WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero la cabecera del archivo WAL «%s» especifica %d byte" -msgstr[1] "el tamaño de segmento WAL debe ser una potencia de dos entre 1 MB y 1 GB, pero la cabecera del archivo WAL «%s» especifica %d bytes" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "El tamaño de segmento de WAL debe ser una potencia de dos entre 1 MB y 1 GB." -#: pg_waldump.c:261 +#: pg_waldump.c:265 #, c-format msgid "could not read file \"%s\": %m" msgstr "no se pudo leer el archivo «%s»: %m" -#: pg_waldump.c:264 +#: pg_waldump.c:268 #, c-format msgid "could not read file \"%s\": read %d of %d" msgstr "no se pudo leer el archivo «%s»: leídos %d de %d" -#: pg_waldump.c:325 +#: pg_waldump.c:329 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "no se pudo ubicar el archivo WAL «%s»" -#: pg_waldump.c:327 +#: pg_waldump.c:331 #, c-format msgid "could not find any WAL file" msgstr "no se pudo encontrar ningún archivo WAL" -#: pg_waldump.c:368 +#: pg_waldump.c:372 #, c-format msgid "could not find file \"%s\": %m" msgstr "no se pudo encontrar el archivo «%s»: %m" -#: pg_waldump.c:417 +#: pg_waldump.c:421 #, c-format -msgid "could not read from file %s, offset %d: %m" +msgid "could not read from file \"%s\", offset %d: %m" msgstr "no se pudo leer desde el archivo «%s» en la posición %d: %m" -#: pg_waldump.c:421 +#: pg_waldump.c:425 #, c-format -msgid "could not read from file %s, offset %d: read %d of %d" -msgstr "no se pudo leer del archivo %s, posición %d: leídos %d de %d" +msgid "could not read from file \"%s\", offset %d: read %d of %d" +msgstr "no se pudo leer del archivo «%s», posición %d: leídos %d de %d" -#: pg_waldump.c:511 +#: pg_waldump.c:515 #, c-format msgid "%s" msgstr "%s" -#: pg_waldump.c:519 +#: pg_waldump.c:523 #, c-format msgid "invalid fork number: %u" msgstr "número de “fork†no válido: %u" -#: pg_waldump.c:530 +#: pg_waldump.c:535 #, c-format msgid "could not write file \"%s\": %m" msgstr "no se pudo escribir el archivo «%s»: %m" -#: pg_waldump.c:533 +#: pg_waldump.c:538 #, c-format msgid "could not close file \"%s\": %m" msgstr "no se pudo cerrar el archivo «%s»: %m" -#: pg_waldump.c:753 +#: pg_waldump.c:758 #, c-format msgid "" "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" @@ -131,17 +185,17 @@ msgstr "" "%s decodifica y muestra segmentos de WAL de PostgreSQL para depuración.\n" "\n" -#: pg_waldump.c:755 +#: pg_waldump.c:760 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: pg_waldump.c:756 +#: pg_waldump.c:761 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [OPCIÓN]... [SEGINICIAL [SEGFINAL]]\n" -#: pg_waldump.c:757 +#: pg_waldump.c:762 #, c-format msgid "" "\n" @@ -150,29 +204,29 @@ msgstr "" "\n" "Opciones:\n" -#: pg_waldump.c:758 +#: pg_waldump.c:763 #, c-format msgid " -b, --bkp-details output detailed information about backup blocks\n" msgstr " -b, --bkp-details mostrar información detallada sobre bloques de respaldo\n" -#: pg_waldump.c:759 +#: pg_waldump.c:764 #, c-format msgid " -B, --block=N with --relation, only show records that modify block N\n" msgstr "" " -B, --block=N con --relation, sólo mostrar registros que modifican\n" " el bloque N\n" -#: pg_waldump.c:760 +#: pg_waldump.c:765 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" msgstr " -e, --end=RECPTR detener la lectura del WAL en la posición RECPTR\n" -#: pg_waldump.c:761 +#: pg_waldump.c:766 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" msgstr " -f, --follow seguir reintentando después de alcanzar el final del WAL\n" -#: pg_waldump.c:762 +#: pg_waldump.c:767 #, c-format msgid "" " -F, --fork=FORK only show records that modify blocks in fork FORK;\n" @@ -181,12 +235,12 @@ msgstr "" " -F, --form=FORK sólo mostrar registros que modifican bloques en el\n" " «fork» FORK; nombres válidos son main, fsm, vm, init\n" -#: pg_waldump.c:764 +#: pg_waldump.c:769 #, c-format msgid " -n, --limit=N number of records to display\n" msgstr " -n, --limit=N número de registros a mostrar\n" -#: pg_waldump.c:765 +#: pg_waldump.c:770 #, c-format msgid "" " -p, --path=PATH directory in which to find WAL segment files or a\n" @@ -197,12 +251,12 @@ msgstr "" " contenga un directorio ./pg_wal con dichos archivos\n" " (por omisión: directorio actual, ./pg_wal, $PGDATA/pg_wal)\n" -#: pg_waldump.c:768 +#: pg_waldump.c:773 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet no escribir ningún mensaje, excepto errores\n" -#: pg_waldump.c:769 +#: pg_waldump.c:774 #, c-format msgid "" " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" @@ -211,17 +265,17 @@ msgstr "" " -r, --rmgr=GREC sólo mostrar registros generados por el gestor de\n" " recursos GREC; use --rmgr=list para listar nombres válidos\n" -#: pg_waldump.c:771 +#: pg_waldump.c:776 #, c-format msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n" msgstr " -R, --relation=T/D/R sólo mostrar registros que modifican bloques en relación T/D/R\n" -#: pg_waldump.c:772 +#: pg_waldump.c:777 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" msgstr " -s, --start=RECPTR empezar a leer el WAL en la posición RECPTR\n" -#: pg_waldump.c:773 +#: pg_waldump.c:778 #, c-format msgid "" " -t, --timeline=TLI timeline from which to read WAL records\n" @@ -230,22 +284,22 @@ msgstr "" " -t, --timeline=TLI “timeline†del cual leer registros WAL\n" " (por omisión: 1 o el valor usado en SEGINICIAL)\n" -#: pg_waldump.c:775 +#: pg_waldump.c:780 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión, luego salir\n" -#: pg_waldump.c:776 +#: pg_waldump.c:781 #, c-format msgid " -w, --fullpage only show records with a full page write\n" msgstr " -w, --fullpage sólo mostrar registros con escrituras de página completa\n" -#: pg_waldump.c:777 +#: pg_waldump.c:782 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" msgstr " -x, --xid=XID sólo mostrar registros con el id de transacción XID\n" -#: pg_waldump.c:778 +#: pg_waldump.c:783 #, c-format msgid "" " -z, --stats[=record] show statistics instead of records\n" @@ -254,17 +308,17 @@ msgstr "" " -z, --stats[=registro] mostrar estadísticas en lugar de registros\n" " (opcionalmente, mostrar estadísticas por registro)\n" -#: pg_waldump.c:780 +#: pg_waldump.c:785 #, c-format msgid " --save-fullpage=DIR save full page images to DIR\n" -msgstr " --save-fullpage=DIR guardar imágenes de página completa en DIR\n" +msgstr " --save-fullpage=DIR guardar imágenes de página completa en DIR\n" -#: pg_waldump.c:781 +#: pg_waldump.c:786 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda, luego salir\n" -#: pg_waldump.c:782 +#: pg_waldump.c:787 #, c-format msgid "" "\n" @@ -273,304 +327,284 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: pg_waldump.c:783 +#: pg_waldump.c:788 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: pg_waldump.c:879 +#: pg_waldump.c:884 #, c-format msgid "no arguments specified" msgstr "no se especificó ningún argumento" -#: pg_waldump.c:895 +#: pg_waldump.c:900 #, c-format msgid "invalid block number: \"%s\"" msgstr "número de bloque no válido: «%s»" -#: pg_waldump.c:904 pg_waldump.c:1002 +#: pg_waldump.c:909 pg_waldump.c:1007 #, c-format msgid "invalid WAL location: \"%s\"" msgstr "ubicación de WAL no válida: «%s»" -#: pg_waldump.c:917 +#: pg_waldump.c:922 #, c-format msgid "invalid fork name: \"%s\"" msgstr "nombre de «fork» no válido: «%s»" -#: pg_waldump.c:925 pg_waldump.c:1028 +#: pg_waldump.c:930 pg_waldump.c:1033 #, c-format msgid "invalid value \"%s\" for option %s" msgstr "el valor «%s» no es válido para la opción «%s»" -#: pg_waldump.c:956 +#: pg_waldump.c:961 #, c-format msgid "custom resource manager \"%s\" does not exist" msgstr "el gestor de recursos personalizado «%s» no existe" -#: pg_waldump.c:977 +#: pg_waldump.c:982 #, c-format msgid "resource manager \"%s\" does not exist" msgstr "el gestor de recursos «%s» no existe" -#: pg_waldump.c:992 +#: pg_waldump.c:997 #, c-format msgid "invalid relation specification: \"%s\"" msgstr "especificación de relación no válida: «%s»" -#: pg_waldump.c:993 +#: pg_waldump.c:998 #, c-format msgid "Expecting \"tablespace OID/database OID/relation filenode\"." msgstr "Se esperaba «OID de tablespace/OID de base de datos/filenode de relación»." -#: pg_waldump.c:1035 +#: pg_waldump.c:1040 #, c-format msgid "%s must be in range %u..%u" msgstr "%s debe estar en el rango %u..%u" -#: pg_waldump.c:1050 +#: pg_waldump.c:1055 #, c-format msgid "invalid transaction ID specification: \"%s\"" msgstr "especificación de ID de transacción no válida: «%s»" -#: pg_waldump.c:1065 +#: pg_waldump.c:1070 #, c-format msgid "unrecognized value for option %s: %s" msgstr "valor no reconocido para la opción %s: %s" -#: pg_waldump.c:1082 +#: pg_waldump.c:1087 #, c-format msgid "option %s requires option %s to be specified" msgstr "la opción %s requiere que se especifique la opción %s" -#: pg_waldump.c:1089 +#: pg_waldump.c:1094 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: pg_waldump.c:1099 pg_waldump.c:1122 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "no se pudo abrir el directorio «%s»: %m" - -#: pg_waldump.c:1128 pg_waldump.c:1158 +#: pg_waldump.c:1133 pg_waldump.c:1163 #, c-format msgid "could not open file \"%s\"" msgstr "no se pudo abrir el archivo «%s»" -#: pg_waldump.c:1138 +#: pg_waldump.c:1143 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "la posición inicial de WAL %X/%X no está en el archivo «%s»" -#: pg_waldump.c:1165 +#: pg_waldump.c:1170 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "SEGFINAL %s está antes del SEGINICIAL %s" -#: pg_waldump.c:1180 +#: pg_waldump.c:1185 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "la posición final de WAL %X/%X no está en el archivo «%s»" -#: pg_waldump.c:1192 +#: pg_waldump.c:1197 #, c-format msgid "no start WAL location given" msgstr "no se especificó posición inicial de WAL" -#: pg_waldump.c:1206 +#: pg_waldump.c:1211 #, c-format msgid "out of memory while allocating a WAL reading processor" msgstr "se agotó la memoria mientras se emplazaba un procesador de lectura de WAL" -#: pg_waldump.c:1212 +#: pg_waldump.c:1217 #, c-format msgid "could not find a valid record after %X/%X" msgstr "no se pudo encontrar un registro válido después de %X/%X" -#: pg_waldump.c:1222 +#: pg_waldump.c:1227 #, c-format -msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" -msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" -msgstr[0] "el primer registro está ubicado después de %X/%X, en %X/%X, saltándose %u byte\n" -msgstr[1] "el primer registro está ubicado después de %X/%X, en %X/%X, saltándose %u bytes\n" +msgid "first record is after %X/%X, at %X/%X, skipping over %u byte" +msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes" +msgstr[0] "el primer registro está ubicado después de %X/%X, en %X/%X, saltándose %u byte" +msgstr[1] "el primer registro está ubicado después de %X/%X, en %X/%X, saltándose %u bytes" -#: pg_waldump.c:1307 +#: pg_waldump.c:1312 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "error en registro de WAL en %X/%X: %s" -#: pg_waldump.c:1316 +#: pg_waldump.c:1321 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: xlogreader.c:626 +#: xlogreader.c:619 #, c-format msgid "invalid record offset at %X/%X: expected at least %u, got %u" msgstr "desplazamiento de registro no válido en %X/%X: se esperaba al menos %u, se obtuvo %u" -#: xlogreader.c:635 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "contrecord solicitado por %X/%X" -#: xlogreader.c:676 xlogreader.c:1123 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "largo de registro no válido en %X/%X: se esperaba al menos %u, se obtuvo %u" -#: xlogreader.c:705 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "memoria agotada mientras se intentaba decodificar un registro de largo %u" - -#: xlogreader.c:727 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "largo de registro %u en %X/%X demasiado largo" - -#: xlogreader.c:776 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "no hay bandera de contrecord en %X/%X" -#: xlogreader.c:789 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "largo de contrecord %u no válido (se esperaba %lld) en %X/%X" -#: xlogreader.c:924 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "falta contrecord en %X/%X" - -#: xlogreader.c:1131 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ID de gestor de recursos %u no válido en %X/%X" -#: xlogreader.c:1144 xlogreader.c:1160 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "registro con prev-link %X/%X incorrecto en %X/%X" -#: xlogreader.c:1196 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "suma de verificación de los datos del gestor de recursos incorrecta en el registro en %X/%X" -#: xlogreader.c:1230 +#: xlogreader.c:1243 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "número mágico %04X no válido en segmento WAL %s, LSN %X/%X, posición %u" -#: xlogreader.c:1245 xlogreader.c:1287 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "info bits %04X no válidos en segment WAL %s, LSN %X/%X, posición %u" -#: xlogreader.c:1261 +#: xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "archivo WAL es de un sistema de bases de datos distinto: identificador de sistema en archivo WAL es %llu, identificador en pg_control es %llu" -#: xlogreader.c:1269 +#: xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "archivo WAL es de un sistema de bases de datos distinto: tamaño de segmento incorrecto en cabecera de paǵina" -#: xlogreader.c:1275 +#: xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "archivo WAL es de un sistema de bases de datos distinto: XLOG_BLCKSZ incorrecto en cabecera de paǵina" -#: xlogreader.c:1307 +#: xlogreader.c:1320 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "pageaddr %X/%X inesperado en segmento WAL %s, LSN %X/%X, posición %u" -#: xlogreader.c:1333 +#: xlogreader.c:1346 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "ID de timeline %u fuera de secuencia (después de %u) en segmento WAL %s, LSN %X/%X, posición %u" -#: xlogreader.c:1739 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u fuera de orden en %X/%X" -#: xlogreader.c:1763 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA está definido, pero no hay datos en %X/%X" -#: xlogreader.c:1770 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA no está definido, pero el largo de los datos es %u en %X/%X" -#: xlogreader.c:1806 +#: xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE está definido, pero posición del agujero es %u largo %u largo de imagen %u en %X/%X" -#: xlogreader.c:1822 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE no está definido, pero posición del agujero es %u largo %u en %X/%X" -#: xlogreader.c:1836 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED definido, pero largo de imagen de bloque es %u en %X/%X" -#: xlogreader.c:1851 +#: xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED están definidos, pero el largo de imagen de bloque es %u en %X/%X" -#: xlogreader.c:1867 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL está definido, pero no hay «rel» anterior en %X/%X " -#: xlogreader.c:1879 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "block_id %u no válido en %X/%X" -#: xlogreader.c:1946 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "registro con largo no válido en %X/%X" -#: xlogreader.c:1972 +#: xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "no se pudo localizar un bloque de respaldo con ID %d en el registro WAL" -#: xlogreader.c:2056 +#: xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" -msgstr "no se pudo restaurar imagen en %X/%X con bloque especificado %d no válido" +msgstr "no se pudo restaurar la imagen en %X/%X con bloque especificado %d no válido" -#: xlogreader.c:2063 +#: xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" -msgstr "no se pudo restaurar imagen en %X/%X con estado no válido, bloque %d" +msgstr "no se pudo restaurar la imagen en %X/%X con estado no válido, bloque %d" -#: xlogreader.c:2090 xlogreader.c:2107 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" -msgstr "no se pudo restaurar imagen en %X/%X comprimida con %s no soportado por esta instalación, bloque %d" +msgstr "no se pudo restaurar la imagen en %X/%X comprimida con %s que no está soportado por esta instalación, bloque %d" -#: xlogreader.c:2116 +#: xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" -msgstr "no se pudo restaurar imagen en %X/%X comprimida método desconocido, bloque %d" +msgstr "no se pudo restaurar la imagen en %X/%X comprimida con un método desconocido, bloque %d" -#: xlogreader.c:2124 +#: xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" -msgstr "no se pudo descomprimir imagen en %X/%X, bloque %d" +msgstr "no se pudo descomprimir la imagen en %X/%X, bloque %d" diff --git a/src/bin/pg_waldump/po/fr.po b/src/bin/pg_waldump/po/fr.po index 7ce5d92fd840e..f127e5e7aabe5 100644 --- a/src/bin/pg_waldump/po/fr.po +++ b/src/bin/pg_waldump/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-26 08:17+0000\n" -"PO-Revision-Date: 2022-09-26 14:37+0200\n" +"POT-Creation-Date: 2024-08-22 10:19+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.1.1\n" +"X-Generator: Poedit 3.5\n" #: ../../../src/common/logging.c:276 #, c-format @@ -41,54 +41,143 @@ msgstr "détail : " msgid "hint: " msgstr "astuce : " -#: pg_waldump.c:160 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "mémoire épuisée\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 pg_waldump.c:199 +#: pg_waldump.c:532 #, c-format msgid "could not open file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier « %s » : %m" -#: pg_waldump.c:216 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "n'a pas pu tester le fichier « %s » : %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "cette construction ne supporte pas la méthode de synchronisation « %s »" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_waldump.c:1104 pg_waldump.c:1127 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "n'a pas pu lire le répertoire « %s » : %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" + +#: pg_waldump.c:137 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "n'a pas pu créer le répertoire « %s » : %m" + +#: pg_waldump.c:146 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "le répertoire « %s » existe mais n'est pas vide" + +#: pg_waldump.c:150 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "n'a pas pu accéder au répertoire « %s » : %m" + +#: pg_waldump.c:256 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" -msgstr[0] "La taille du segment WAL doit être une puissance de deux entre 1 Mo et 1 Go, mais l'en-tête du fichier WAL « %s » indique %d octet" -msgstr[1] "La taille du segment WAL doit être une puissance de deux entre 1 Mo et 1 Go, mais l'en-tête du fichier WAL « %s » indique %d octets" +msgid "invalid WAL segment size in WAL file \"%s\" (%d byte)" +msgid_plural "invalid WAL segment size in WAL file \"%s\" (%d bytes)" +msgstr[0] "taille invalide du segment WAL dans le fichier WAL « %s » (%d octet)" +msgstr[1] "taille invalide du segment WAL dans le fichier WAL « %s » (%d octets)" -#: pg_waldump.c:222 +#: pg_waldump.c:260 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "La taille du segment WAL doit être une puissance de deux comprise entre 1 Mo et 1 Go." + +#: pg_waldump.c:265 #, c-format msgid "could not read file \"%s\": %m" msgstr "n'a pas pu lire le fichier « %s » : %m" -#: pg_waldump.c:225 +#: pg_waldump.c:268 #, c-format msgid "could not read file \"%s\": read %d of %d" msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %d" -#: pg_waldump.c:286 +#: pg_waldump.c:329 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "n'a pas pu trouver le fichier WAL « %s »" -#: pg_waldump.c:288 +#: pg_waldump.c:331 #, c-format msgid "could not find any WAL file" msgstr "n'a pas pu trouver un seul fichier WAL" -#: pg_waldump.c:329 +#: pg_waldump.c:372 #, c-format msgid "could not find file \"%s\": %m" msgstr "n'a pas pu trouver le fichier « %s » : %m" -#: pg_waldump.c:378 +#: pg_waldump.c:421 +#, c-format +msgid "could not read from file \"%s\", offset %d: %m" +msgstr "n'a pas pu lire à partir du fichier « %s », décalage %d : %m" + +#: pg_waldump.c:425 #, c-format -msgid "could not read from file %s, offset %d: %m" -msgstr "n'a pas pu lire à partir du fichier %s, décalage %d : %m" +msgid "could not read from file \"%s\", offset %d: read %d of %d" +msgstr "n'a pas pu lire à partir du fichier « %s », décalage %d : %d lu sur %d" -#: pg_waldump.c:382 +#: pg_waldump.c:515 #, c-format -msgid "could not read from file %s, offset %d: read %d of %d" -msgstr "n'a pas pu lire à partir du fichier %s, décalage %d : %d lu sur %d" +msgid "%s" +msgstr "%s" -#: pg_waldump.c:658 +#: pg_waldump.c:523 +#, c-format +msgid "invalid fork number: %u" +msgstr "numéro du fork invalide : %u" + +#: pg_waldump.c:535 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "impossible d'écrire le fichier « %s » : %m" + +#: pg_waldump.c:538 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "n'a pas pu fermer le fichier « %s » : %m" + +#: pg_waldump.c:758 #, c-format msgid "" "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" @@ -98,17 +187,17 @@ msgstr "" "débogage.\n" "\n" -#: pg_waldump.c:660 +#: pg_waldump.c:760 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: pg_waldump.c:661 +#: pg_waldump.c:761 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [OPTION]... [SEG_DEBUT [SEG_FIN]]\n" -#: pg_waldump.c:662 +#: pg_waldump.c:762 #, c-format msgid "" "\n" @@ -117,35 +206,35 @@ msgstr "" "\n" "Options :\n" -#: pg_waldump.c:663 +#: pg_waldump.c:763 #, c-format msgid " -b, --bkp-details output detailed information about backup blocks\n" msgstr "" " -b, --bkp-details affiche des informations détaillées sur les\n" " blocs de sauvegarde\n" -#: pg_waldump.c:664 +#: pg_waldump.c:764 #, c-format msgid " -B, --block=N with --relation, only show records that modify block N\n" msgstr "" " -B, --block=N avec --relation, affiche seulement les enregistrements\n" " qui modifient le bloc N\n" -#: pg_waldump.c:665 +#: pg_waldump.c:765 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" msgstr "" " -e, --end=RECPTR arrête la lecture des journaux de transactions à\n" " l'emplacement RECPTR\n" -#: pg_waldump.c:666 +#: pg_waldump.c:766 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" msgstr "" " -f, --follow continue après avoir atteint la fin des journaux\n" " de transactions\n" -#: pg_waldump.c:667 +#: pg_waldump.c:767 #, c-format msgid "" " -F, --fork=FORK only show records that modify blocks in fork FORK;\n" @@ -155,15 +244,15 @@ msgstr "" " des blocs dans le fork FORK ;\n" " les noms valides sont main, fsm, vm, init\n" -#: pg_waldump.c:669 +#: pg_waldump.c:769 #, c-format msgid " -n, --limit=N number of records to display\n" msgstr " -n, --limit=N nombre d'enregistrements à afficher\n" -#: pg_waldump.c:670 +#: pg_waldump.c:770 #, c-format msgid "" -" -p, --path=PATH directory in which to find log segment files or a\n" +" -p, --path=PATH directory in which to find WAL segment files or a\n" " directory with a ./pg_wal that contains such files\n" " (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n" msgstr "" @@ -173,12 +262,12 @@ msgstr "" " défaut : répertoire courant, ./pg_wal,\n" " $PGDATA/pg_wal)\n" -#: pg_waldump.c:673 +#: pg_waldump.c:773 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet n'écrit aucun message, sauf en cas d'erreur\n" -#: pg_waldump.c:674 +#: pg_waldump.c:774 #, c-format msgid "" " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" @@ -189,50 +278,50 @@ msgstr "" " --rmgr=list pour avoir une liste des noms valides\n" " de gestionnaires de ressources\n" -#: pg_waldump.c:676 +#: pg_waldump.c:776 #, c-format msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n" msgstr "" " -R, --relation=T/D/R affiche seulement les enregistrements qui modifient\n" " les blocs de la relation T/D/R\n" -#: pg_waldump.c:677 +#: pg_waldump.c:777 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" msgstr "" " -s, --start=RECPTR commence à lire à l'emplacement RECPTR des\n" " journaux de transactions\n" -#: pg_waldump.c:678 +#: pg_waldump.c:778 #, c-format msgid "" -" -t, --timeline=TLI timeline from which to read log records\n" +" -t, --timeline=TLI timeline from which to read WAL records\n" " (default: 1 or the value used in STARTSEG)\n" msgstr "" " -t, --timeline=TLI timeline à partir de laquelle lire les\n" -" enregistrements des journaux (par défaut: 1 ou\n" +" enregistrements des journaux (par défaut : 1 ou\n" " la valeur utilisée dans SEG_DÉBUT)\n" -#: pg_waldump.c:680 +#: pg_waldump.c:780 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: pg_waldump.c:681 +#: pg_waldump.c:781 #, c-format msgid " -w, --fullpage only show records with a full page write\n" msgstr "" " -w, --fullpage affiche seulement les enregistrements avec\n" " un bloc complet (FPW)\n" -#: pg_waldump.c:682 +#: pg_waldump.c:782 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" msgstr "" " -x, --xid=XID affiche seulement des enregistrements avec\n" " l'identifiant de transaction XID\n" -#: pg_waldump.c:683 +#: pg_waldump.c:783 #, c-format msgid "" " -z, --stats[=record] show statistics instead of records\n" @@ -242,12 +331,17 @@ msgstr "" " d'enregistrements (en option, affiche des\n" " statistiques par enregistrement)\n" -#: pg_waldump.c:685 +#: pg_waldump.c:785 +#, c-format +msgid " --save-fullpage=DIR save full page images to DIR\n" +msgstr " --save-fullpage=RÉP sauvegarde les images complètes dans RÉP\n" + +#: pg_waldump.c:786 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: pg_waldump.c:686 +#: pg_waldump.c:787 #, c-format msgid "" "\n" @@ -256,391 +350,286 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: pg_waldump.c:687 +#: pg_waldump.c:788 #, c-format msgid "%s home page: <%s>\n" -msgstr "Page d'accueil %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" -#: pg_waldump.c:781 +#: pg_waldump.c:884 #, c-format msgid "no arguments specified" msgstr "aucun argument spécifié" -#: pg_waldump.c:797 +#: pg_waldump.c:900 #, c-format msgid "invalid block number: \"%s\"" msgstr "numéro de bloc invalide : « %s »" -#: pg_waldump.c:806 pg_waldump.c:904 +#: pg_waldump.c:909 pg_waldump.c:1007 #, c-format msgid "invalid WAL location: \"%s\"" msgstr "emplacement WAL invalide : « %s »" -#: pg_waldump.c:819 +#: pg_waldump.c:922 #, c-format msgid "invalid fork name: \"%s\"" msgstr "nom du fork invalide : « %s »" -#: pg_waldump.c:827 +#: pg_waldump.c:930 pg_waldump.c:1033 #, c-format msgid "invalid value \"%s\" for option %s" msgstr "valeur « %s » invalide pour l'option %s" -#: pg_waldump.c:858 +#: pg_waldump.c:961 #, c-format msgid "custom resource manager \"%s\" does not exist" msgstr "le gestionnaire de ressources personnalisé « %s » n'existe pas" -#: pg_waldump.c:879 +#: pg_waldump.c:982 #, c-format msgid "resource manager \"%s\" does not exist" msgstr "le gestionnaire de ressources « %s » n'existe pas" -#: pg_waldump.c:894 +#: pg_waldump.c:997 #, c-format msgid "invalid relation specification: \"%s\"" msgstr "spécification de relation invalide : « %s »" -#: pg_waldump.c:895 +#: pg_waldump.c:998 #, c-format msgid "Expecting \"tablespace OID/database OID/relation filenode\"." msgstr "Attendait « OID tablespace/OID base/filenode relation »." -#: pg_waldump.c:914 +#: pg_waldump.c:1040 #, c-format -msgid "invalid timeline specification: \"%s\"" -msgstr "spécification de timeline invalide : « %s »" +msgid "%s must be in range %u..%u" +msgstr "%s doit être compris entre %u et %u" -#: pg_waldump.c:924 +#: pg_waldump.c:1055 #, c-format msgid "invalid transaction ID specification: \"%s\"" msgstr "spécification d'identifiant de transaction invalide : « %s »" -#: pg_waldump.c:939 +#: pg_waldump.c:1070 #, c-format msgid "unrecognized value for option %s: %s" msgstr "valeur non reconnue pour l'option %s : %s" -#: pg_waldump.c:953 +#: pg_waldump.c:1087 #, c-format msgid "option %s requires option %s to be specified" msgstr "l'option %s requiert la spécification de l'option %s" -#: pg_waldump.c:960 +#: pg_waldump.c:1094 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: pg_waldump.c:970 pg_waldump.c:990 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" - -#: pg_waldump.c:996 pg_waldump.c:1026 +#: pg_waldump.c:1133 pg_waldump.c:1163 #, c-format msgid "could not open file \"%s\"" msgstr "n'a pas pu ouvrir le fichier « %s »" -#: pg_waldump.c:1006 +#: pg_waldump.c:1143 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "l'emplacement de début des journaux de transactions %X/%X n'est pas à l'intérieur du fichier « %s »" -#: pg_waldump.c:1033 +#: pg_waldump.c:1170 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "SEG_FIN %s est avant SEG_DÉBUT %s" -#: pg_waldump.c:1048 +#: pg_waldump.c:1185 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "l'emplacement de fin des journaux de transactions %X/%X n'est pas à l'intérieur du fichier « %s »" -#: pg_waldump.c:1060 +#: pg_waldump.c:1197 #, c-format msgid "no start WAL location given" msgstr "pas d'emplacement donné de début du journal de transactions" -#: pg_waldump.c:1074 +#: pg_waldump.c:1211 #, c-format msgid "out of memory while allocating a WAL reading processor" msgstr "plus de mémoire lors de l'allocation d'un processeur de lecture de journaux de transactions" -#: pg_waldump.c:1080 +#: pg_waldump.c:1217 #, c-format msgid "could not find a valid record after %X/%X" msgstr "n'a pas pu trouver un enregistrement valide après %X/%X" -#: pg_waldump.c:1090 +#: pg_waldump.c:1227 #, c-format -msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" -msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" -msgstr[0] "le premier enregistrement se trouve après %X/%X, à %X/%X, ignore %u octet\n" -msgstr[1] "le premier enregistrement se trouve après %X/%X, à %X/%X, ignore %u octets\n" +msgid "first record is after %X/%X, at %X/%X, skipping over %u byte" +msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes" +msgstr[0] "le premier enregistrement se trouve après %X/%X, à %X/%X, ignore %u octet" +msgstr[1] "le premier enregistrement se trouve après %X/%X, à %X/%X, ignore %u octets" -#: pg_waldump.c:1171 +#: pg_waldump.c:1312 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "erreur dans l'enregistrement des journaux de transactions à %X/%X : %s" -#: pg_waldump.c:1180 +#: pg_waldump.c:1321 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." -#: xlogreader.c:625 +#: xlogreader.c:619 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "décalage invalide de l'enregistrement %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "décalage invalide de l'enregistrement à %X/%X : attendait au moins %u, a eu %u" -#: xlogreader.c:633 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "« contrecord » est requis par %X/%X" -#: xlogreader.c:674 xlogreader.c:1121 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "longueur invalide de l'enregistrement à %X/%X : voulait %u, a eu %u" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "longueur invalide de l'enregistrement à %X/%X : attendait au moins %u, a eu %u" -#: xlogreader.c:703 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "manque mémoire lors de la tentative de décodage d'un enregistrement de longueur %u" - -#: xlogreader.c:725 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "longueur trop importante de l'enregistrement %u à %X/%X" - -#: xlogreader.c:774 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "il n'existe pas de drapeau contrecord à %X/%X" -#: xlogreader.c:787 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "longueur %u invalide du contrecord (%lld attendu) à %X/%X" -#: xlogreader.c:922 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "contrecord manquant à %X/%X" - -#: xlogreader.c:1129 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "identifiant du gestionnaire de ressources invalide %u à %X/%X" -#: xlogreader.c:1142 xlogreader.c:1158 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "enregistrement avec prev-link %X/%X incorrect à %X/%X" -#: xlogreader.c:1194 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" "somme de contrôle des données du gestionnaire de ressources incorrecte à\n" "l'enregistrement %X/%X" -#: xlogreader.c:1231 +#: xlogreader.c:1243 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "numéro magique invalide %04X dans le segment %s, décalage %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "numéro magique invalide %04X dans le segment WAL %s, LSN %X/%X, décalage %u" -#: xlogreader.c:1245 xlogreader.c:1286 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "bits d'information %04X invalides dans le segment %s, décalage %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "bits d'information %04X invalides dans le segment WAL %s, LSN %X/%X, décalage %u" -#: xlogreader.c:1260 +#: xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "Le fichier WAL provient d'une instance différente : l'identifiant système de la base dans le fichier WAL est %llu, alors que l'identifiant système de la base dans pg_control est %llu" -#: xlogreader.c:1268 +#: xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "Le fichier WAL provient d'une instance différente : taille invalide du segment dans l'en-tête de page" -#: xlogreader.c:1274 +#: xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "Le fichier WAL provient d'une instance différente : XLOG_BLCKSZ incorrect dans l'en-tête de page" -#: xlogreader.c:1305 +#: xlogreader.c:1320 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "pageaddr %X/%X inattendue dans le journal de transactions %s, segment %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "pageaddr %X/%X inattendue dans le journal de transactions %s, LSN %X/%X, segment %u" -#: xlogreader.c:1330 +#: xlogreader.c:1346 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "identifiant timeline %u hors de la séquence (après %u) dans le segment %s, décalage %u" +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "identifiant timeline %u hors de la séquence (après %u) dans le segment WAL %s, LSN %X/%X, décalage %u" -#: xlogreader.c:1735 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %u désordonné à %X/%X" -#: xlogreader.c:1759 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA configuré, mais aucune donnée inclus à %X/%X" -#: xlogreader.c:1766 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA non configuré, mais la longueur des données est %u à %X/%X" -#: xlogreader.c:1802 +#: xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE activé, mais décalage trou %u longueur %u longueur image bloc %u à %X/%X" -#: xlogreader.c:1818 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE désactivé, mais décalage trou %u longueur %u à %X/%X" -#: xlogreader.c:1832 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" -#: xlogreader.c:1847 +#: xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "ni BKPIMAGE_HAS_HOLE ni BKPIMAGE_COMPRESSED configuré, mais la longueur de l'image du bloc est %u à %X/%X" -#: xlogreader.c:1863 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL configuré, mais pas de relation précédente à %X/%X" -#: xlogreader.c:1875 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "block_id %u invalide à %X/%X" -#: xlogreader.c:1942 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "enregistrement de longueur invalide à %X/%X" -#: xlogreader.c:1967 +#: xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" -msgstr "échec de localisation du bloc de sauvegarde d'ID %d dans l'enregistrement WAL" +msgstr "n'a pas pu localiser le bloc de sauvegarde d'ID %d dans l'enregistrement WAL" -#: xlogreader.c:2051 +#: xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "n'a pas pu restaurer l'image à %X/%X avec le bloc invalide %d indiqué" -#: xlogreader.c:2058 +#: xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" -msgstr "n'a pas pu restaurer l'image à %X/%X avec l'état invalide, bloc %d" +msgstr "n'a pas pu restaurer l'image à %X/%X avec un état invalide, bloc %d" -#: xlogreader.c:2085 xlogreader.c:2102 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" -msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec %s, non supporté par le serveur, bloc %d" +msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec %s, qui est non supporté par le serveur, bloc %d" -#: xlogreader.c:2111 +#: xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "n'a pas pu restaurer l'image à %X/%X compressé avec une méthode inconnue, bloc %d" -#: xlogreader.c:2119 +#: xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "n'a pas pu décompresser l'image à %X/%X, bloc %d" - -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" - -#~ msgid "%s: FATAL: " -#~ msgstr "%s : FATAL : " - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" - -#~ msgid "cannot open directory \"%s\": %s" -#~ msgstr "ne peut pas ouvrir le répertoire « %s » : %s" - -#~ msgid "could not open directory \"%s\": %s" -#~ msgstr "n'a pas pu ouvrir le répertoire « %s » : %s" - -#~ msgid "could not open file \"%s\": %s" -#~ msgstr "n'a pas pu ouvrir le fichier « %s » : %s" - -#, c-format -#~ msgid "could not parse \"%s\" as a transaction ID" -#~ msgstr "n'a pas pu analyser « %s » comme un identifiant de transaction" - -#, c-format -#~ msgid "could not parse end WAL location \"%s\"" -#~ msgstr "n'a pas pu analyser l'emplacement de fin du journal de transactions « %s »" - -#, c-format -#~ msgid "could not parse fork \"%s\"" -#~ msgstr "n'a pas pu analyser le fork « %s »" - -#, c-format -#~ msgid "could not parse limit \"%s\"" -#~ msgstr "n'a pas pu analyser la limite « %s »" - -#, c-format -#~ msgid "could not parse start WAL location \"%s\"" -#~ msgstr "n'a pas pu analyser l'emplacement de début du journal de transactions « %s »" - -#, c-format -#~ msgid "could not parse timeline \"%s\"" -#~ msgstr "n'a pas pu analyser la timeline « %s »" - -#, c-format -#~ msgid "could not parse valid block number \"%s\"" -#~ msgstr "n'a pas pu analyser le numéro de bloc valide « %s »" - -#~ msgid "could not read file \"%s\": %s" -#~ msgstr "n'a pas pu lire le fichier « %s » : %s" - -#, c-format -#~ msgid "could not read file \"%s\": read %d of %zu" -#~ msgstr "n'a pas pu lire le fichier « %s » : a lu %d sur %zu" - -#~ msgid "could not read from log file %s, offset %u, length %d: %s" -#~ msgstr "n'a pas pu lire à partir du segment %s du journal de transactions, décalage %u, longueur %d : %s" - -#~ msgid "could not seek in log file %s to offset %u: %s" -#~ msgstr "n'a pas pu se déplacer dans le fichier de transactions %s au décalage %u : %s" - -#~ msgid "could not seek in log segment %s to offset %u: %s" -#~ msgstr "n'a pas pu rechercher dans le segment %s du journal de transactions au décalage %u : %s" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatal : " - -#~ msgid "not enough data in file \"%s\"" -#~ msgstr "données insuffisantes dans le fichier « %s »" - -#, c-format -#~ msgid "out of memory" -#~ msgstr "mémoire épuisée" - -#~ msgid "path \"%s\" could not be opened: %s" -#~ msgstr "le chemin « %s » n'a pas pu être ouvert : %s" - -#, c-format -#~ msgid "unrecognized argument to --stats: %s" -#~ msgstr "argument non reconnu pour --stats : %s" diff --git a/src/bin/pg_waldump/po/ja.po b/src/bin/pg_waldump/po/ja.po index dd7932d07978d..3b3a5714a33e2 100644 --- a/src/bin/pg_waldump/po/ja.po +++ b/src/bin/pg_waldump/po/ja.po @@ -1,13 +1,13 @@ # Japanese message translation file for pg_waldump -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: pg_waldump (PostgreSQL 16)\n" +"Project-Id-Version: pg_waldump (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-19 12:26+0900\n" -"PO-Revision-Date: 2023-04-19 12:30+0900\n" +"POT-Creation-Date: 2023-09-15 09:29+0900\n" +"PO-Revision-Date: 2023-09-15 10:40+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -52,73 +52,78 @@ msgstr "ディレクトリ\"%s\"ã¯å­˜åœ¨ã—ã¾ã™ãŒã€ç©ºã§ã¯ã‚りã¾ã›ã‚“ msgid "could not access directory \"%s\": %m" msgstr "ディレクトリ\"%s\"ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_waldump.c:199 pg_waldump.c:527 +#: pg_waldump.c:199 pg_waldump.c:532 #, c-format msgid "could not open file \"%s\": %m" msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_waldump.c:255 +#: pg_waldump.c:256 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" -msgstr[0] "WALセグメントã®ã‚µã‚¤ã‚ºã¯1MBã¨1GBã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“ã€ã—ã‹ã—WALファイル\"%s\"ã®ãƒ˜ãƒƒãƒ€ã§ã¯%dãƒã‚¤ãƒˆã¨ãªã£ã¦ã„ã¾ã™" +msgid "invalid WAL segment size in WAL file \"%s\" (%d byte)" +msgid_plural "invalid WAL segment size in WAL file \"%s\" (%d bytes)" +msgstr[0] "WALファイル\"%s\"中ã®ä¸æ­£ãªWALセグメントサイズ (%dãƒã‚¤ãƒˆ)" -#: pg_waldump.c:261 +#: pg_waldump.c:260 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WALセグメントサイズã¯1MBã‹ã‚‰1GBã¾ã§ã®é–“ã®2ã®ç´¯ä¹—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。" + +#: pg_waldump.c:265 #, c-format msgid "could not read file \"%s\": %m" msgstr "ファイル\"%s\"ã®èª­ã¿å–りã«å¤±æ•—ã—ã¾ã—ãŸ: %m" -#: pg_waldump.c:264 +#: pg_waldump.c:268 #, c-format msgid "could not read file \"%s\": read %d of %d" msgstr "ファイル\"%1$s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %3$d中%2$d" -#: pg_waldump.c:325 +#: pg_waldump.c:329 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "WALファイル\"%s\"ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: pg_waldump.c:327 +#: pg_waldump.c:331 #, c-format msgid "could not find any WAL file" msgstr "WALファイルãŒå…¨ãã‚りã¾ã›ã‚“" -#: pg_waldump.c:368 +#: pg_waldump.c:372 #, c-format msgid "could not find file \"%s\": %m" msgstr "ファイル\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_waldump.c:417 +#: pg_waldump.c:421 #, c-format -msgid "could not read from file %s, offset %d: %m" -msgstr "ファイル %sã€ã‚ªãƒ•セット%dã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" +msgid "could not read from file \"%s\", offset %d: %m" +msgstr "ファイル \"%s\"ã€ã‚ªãƒ•セット%dã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_waldump.c:421 +#: pg_waldump.c:425 #, c-format -msgid "could not read from file %s, offset %d: read %d of %d" -msgstr "ファイル%1$sã€ã‚ªãƒ•セット%2$dã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %4$d中%3$d" +msgid "could not read from file \"%s\", offset %d: read %d of %d" +msgstr "ファイル \"%1$s\"ã€ã‚ªãƒ•セット%2$dã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %4$d中%3$d" -#: pg_waldump.c:511 +#: pg_waldump.c:515 #, c-format msgid "%s" msgstr "%s" -#: pg_waldump.c:519 +#: pg_waldump.c:523 #, c-format msgid "invalid fork number: %u" msgstr "䏿­£ãªãƒ•ォーク番å·ã§ã™: %u" -#: pg_waldump.c:530 +#: pg_waldump.c:535 #, c-format msgid "could not write file \"%s\": %m" msgstr "ファイル\"%s\"を書ã出ã›ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_waldump.c:533 +#: pg_waldump.c:538 #, c-format msgid "could not close file \"%s\": %m" msgstr "ファイル\"%s\"をクローズã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_waldump.c:753 +#: pg_waldump.c:758 #, c-format msgid "" "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" @@ -127,17 +132,17 @@ msgstr "" "%sã¯ãƒ‡ãƒãƒƒã‚°ã®ãŸã‚ã«PostgreSQLã®å…ˆè¡Œæ›¸ãè¾¼ã¿ãƒ­ã‚°ã‚’デコードã—ã¦è¡¨ç¤ºã—ã¾ã™ã€‚\n" "\n" -#: pg_waldump.c:755 +#: pg_waldump.c:760 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_waldump.c:756 +#: pg_waldump.c:761 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [オプション] ... [開始セグメント [終了セグメント]]\n" -#: pg_waldump.c:757 +#: pg_waldump.c:762 #, c-format msgid "" "\n" @@ -146,29 +151,29 @@ msgstr "" "\n" "オプション:\n" -#: pg_waldump.c:758 +#: pg_waldump.c:763 #, c-format msgid " -b, --bkp-details output detailed information about backup blocks\n" msgstr " -b, --bkp-details ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ブロックã«é–¢ã™ã‚‹è©³ç´°æƒ…報を出力\n" -#: pg_waldump.c:759 +#: pg_waldump.c:764 #, c-format msgid " -B, --block=N with --relation, only show records that modify block N\n" msgstr "" " -B, --block=N --relationã¨å…±ã«æŒ‡å®šã™ã‚‹ã“ã¨ã§ã“ã®ãƒ–ロックNã‚’æ›´æ–°ã™ã‚‹\n" " レコードã®ã¿ã‚’表示\n" -#: pg_waldump.c:760 +#: pg_waldump.c:765 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" msgstr " -e, --end=RECPTR WALä½ç½®RECPTRã§èª­ã¿è¾¼ã¿ã‚’åœæ­¢\n" -#: pg_waldump.c:761 +#: pg_waldump.c:766 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" msgstr " -f, --follow WALã®çµ‚端ã«é”ã—ã¦ã‹ã‚‰ã‚‚リトライを続ã‘ã‚‹\n" -#: pg_waldump.c:762 +#: pg_waldump.c:767 #, c-format msgid "" " -F, --fork=FORK only show records that modify blocks in fork FORK;\n" @@ -177,12 +182,12 @@ msgstr "" " -F, --fork=FORK 指定フォークã®ãƒ–ロックを更新ã™ã‚‹ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã¿è¡¨ç¤º;\n" " 指定å¯èƒ½ãªåå‰ã¯main, fsm, vm, init\n" -#: pg_waldump.c:764 +#: pg_waldump.c:769 #, c-format msgid " -n, --limit=N number of records to display\n" msgstr " -n, --limit=N 表示ã™ã‚‹ãƒ¬ã‚³ãƒ¼ãƒ‰æ•°\n" -#: pg_waldump.c:765 +#: pg_waldump.c:770 #, c-format msgid "" " -p, --path=PATH directory in which to find WAL segment files or a\n" @@ -194,12 +199,12 @@ msgstr "" " (デフォルト: カレントディレクトリ, ./pg_wal,\n" " $PGDATA/pg_wal)\n" -#: pg_waldump.c:768 +#: pg_waldump.c:773 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet エラー以外何も出力ã—ãªã„\n" -#: pg_waldump.c:769 +#: pg_waldump.c:774 #, c-format msgid "" " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" @@ -208,17 +213,17 @@ msgstr "" " -r, --rmgr=RMGR 指定ã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã§ç”Ÿæˆã•れãŸãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã¿è¡¨ç¤º\n" " --rmgr=list ã§æœ‰åйãªãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã®ä¸€è¦§ã‚’表示\n" -#: pg_waldump.c:771 +#: pg_waldump.c:776 #, c-format msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n" msgstr " -R, --relation=T/D/R リレーションT/D/Rã®ãƒ–ロックを更新ã™ã‚‹ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã¿è¡¨ç¤º\n" -#: pg_waldump.c:772 +#: pg_waldump.c:777 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" msgstr " -s, --start=RECPTR WALä½ç½®RECPTRã‹ã‚‰èª­ã¿è¾¼ã¿ã‚’é–‹å§‹\n" -#: pg_waldump.c:773 +#: pg_waldump.c:778 #, c-format msgid "" " -t, --timeline=TLI timeline from which to read WAL records\n" @@ -227,22 +232,22 @@ msgstr "" " -t, --timeline=TLI WALレコードを読ã¿è¾¼ã‚€ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³\n" " (デフォルト: 1 ã¾ãŸã¯STARTSEGã§ä½¿ã‚れãŸå€¤)\n" -#: pg_waldump.c:775 +#: pg_waldump.c:780 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: pg_waldump.c:776 +#: pg_waldump.c:781 #, c-format msgid " -w, --fullpage only show records with a full page write\n" msgstr " -w, --fullpage 全ページ書ãè¾¼ã¿ã‚’å«ã‚€ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã¿ã‚’表示\n" -#: pg_waldump.c:777 +#: pg_waldump.c:782 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" msgstr " -x, --xid=XID トランザクションIDãŒXIDã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã¿ã‚’表示ã™ã‚‹\n" -#: pg_waldump.c:778 +#: pg_waldump.c:783 #, c-format msgid "" " -z, --stats[=record] show statistics instead of records\n" @@ -251,17 +256,17 @@ msgstr "" " -z, --stats[=レコード] レコードã®ä»£ã‚りã«çµ±è¨ˆæƒ…報を表示ã™ã‚‹\n" " (オプションã§ã€ãƒ¬ã‚³ãƒ¼ãƒ‰ã”ã¨ã®çµ±è¨ˆã‚’表示ã™ã‚‹)\n" -#: pg_waldump.c:780 +#: pg_waldump.c:785 #, c-format msgid " --save-fullpage=DIR save full page images to DIR\n" msgstr " --save-fullpage=DIR フルページイメージをDIRã«ä¿å­˜\n" -#: pg_waldump.c:781 +#: pg_waldump.c:786 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: pg_waldump.c:782 +#: pg_waldump.c:787 #, c-format msgid "" "\n" @@ -270,133 +275,133 @@ msgstr "" "\n" "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: pg_waldump.c:783 +#: pg_waldump.c:788 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_waldump.c:879 +#: pg_waldump.c:884 #, c-format msgid "no arguments specified" msgstr "å¼•æ•°ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: pg_waldump.c:895 +#: pg_waldump.c:900 #, c-format msgid "invalid block number: \"%s\"" msgstr "䏿­£ãªãƒ–ロック番å·: \"%s\"" -#: pg_waldump.c:904 pg_waldump.c:1002 +#: pg_waldump.c:909 pg_waldump.c:1007 #, c-format msgid "invalid WAL location: \"%s\"" msgstr "䏿­£ãªWAL LSN: \"%s\"" -#: pg_waldump.c:917 +#: pg_waldump.c:922 #, c-format msgid "invalid fork name: \"%s\"" msgstr "䏿­£ãªãƒ•ォークå: \"%s\"" -#: pg_waldump.c:925 pg_waldump.c:1028 +#: pg_waldump.c:930 pg_waldump.c:1033 #, c-format msgid "invalid value \"%s\" for option %s" msgstr "オプション%2$sã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\"" -#: pg_waldump.c:956 +#: pg_waldump.c:961 #, c-format msgid "custom resource manager \"%s\" does not exist" msgstr "独自リソースマãƒãƒ¼ã‚¸ãƒ£ãƒ¼\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: pg_waldump.c:977 +#: pg_waldump.c:982 #, c-format msgid "resource manager \"%s\" does not exist" msgstr "リソースマãƒãƒ¼ã‚¸ãƒ£ãƒ¼\"%s\"ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: pg_waldump.c:992 +#: pg_waldump.c:997 #, c-format msgid "invalid relation specification: \"%s\"" msgstr "䏿­£ãªãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³æŒ‡å®š: \"%s\"" -#: pg_waldump.c:993 +#: pg_waldump.c:998 #, c-format msgid "Expecting \"tablespace OID/database OID/relation filenode\"." msgstr "\"テーブル空間OID/データベースOID/リレーション・ファイルノードâ€ã‚’期待ã—ã¦ã„ã¾ã™ã€‚" -#: pg_waldump.c:1035 +#: pg_waldump.c:1040 #, c-format msgid "%s must be in range %u..%u" msgstr "%sã¯%u..%uã®ç¯„囲ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pg_waldump.c:1050 +#: pg_waldump.c:1055 #, c-format msgid "invalid transaction ID specification: \"%s\"" msgstr "䏿­£ãªãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ID指定: \"%s\"" -#: pg_waldump.c:1065 +#: pg_waldump.c:1070 #, c-format msgid "unrecognized value for option %s: %s" msgstr "%sオプションã«å¯¾ã™ã‚‹èªè­˜ã§ããªã„値: %s" -#: pg_waldump.c:1082 +#: pg_waldump.c:1087 #, c-format msgid "option %s requires option %s to be specified" msgstr "%sオプション指定時ã¯%sオプションも必è¦ã§ã™" -#: pg_waldump.c:1089 +#: pg_waldump.c:1094 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™(先頭ã¯\"%s\")" -#: pg_waldump.c:1099 pg_waldump.c:1122 +#: pg_waldump.c:1104 pg_waldump.c:1127 #, c-format msgid "could not open directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: pg_waldump.c:1128 pg_waldump.c:1158 +#: pg_waldump.c:1133 pg_waldump.c:1163 #, c-format msgid "could not open file \"%s\"" msgstr "ファイル\"%s\"ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pg_waldump.c:1138 +#: pg_waldump.c:1143 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "WALã®é–‹å§‹ä½ç½®%X/%Xã¯ãƒ•ァイル\"%s\"ã®ä¸­ã§ã¯ã‚りã¾ã›ã‚“" -#: pg_waldump.c:1165 +#: pg_waldump.c:1170 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "ENDSEG%sãŒSTARTSEG %sよりå‰ã«ç¾ã‚Œã¾ã—ãŸ" -#: pg_waldump.c:1180 +#: pg_waldump.c:1185 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "WALã®çµ‚了ä½ç½®%X/%Xã¯ãƒ•ァイル\"%s\"ã®ä¸­ã§ã¯ã‚りã¾ã›ã‚“" -#: pg_waldump.c:1192 +#: pg_waldump.c:1197 #, c-format msgid "no start WAL location given" msgstr "WALã®é–‹å§‹ä½ç½®ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: pg_waldump.c:1206 +#: pg_waldump.c:1211 #, c-format msgid "out of memory while allocating a WAL reading processor" msgstr "WAL読ã¿å–り機構ã§ã®ãƒ¡ãƒ¢ãƒªå‰²ã‚Šå½“ã¦ã«ä¸­ã«ãƒ¡ãƒ¢ãƒªä¸è¶³" -#: pg_waldump.c:1212 +#: pg_waldump.c:1217 #, c-format msgid "could not find a valid record after %X/%X" msgstr "%X/%Xã®å¾Œã«æœ‰åйãªãƒ¬ã‚³ãƒ¼ãƒ‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: pg_waldump.c:1222 +#: pg_waldump.c:1227 #, c-format -msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" -msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" -msgstr[0] "先頭レコードãŒ%X/%Xã®å¾Œã®%X/%Xã®ä½ç½®ã«ã‚りã¾ã—ãŸã€‚%uãƒã‚¤ãƒˆåˆ†ã‚’スキップã—ã¦ã„ã¾ã™\n" +msgid "first record is after %X/%X, at %X/%X, skipping over %u byte" +msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes" +msgstr[0] "先頭レコードãŒ%X/%Xã®å¾Œã®%X/%Xã®å¾Œã«ã‚りã¾ã™ã€‚%uãƒã‚¤ãƒˆåˆ†ã‚’スキップã—ã¾ã™" -#: pg_waldump.c:1307 +#: pg_waldump.c:1312 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "WALレコードã®%X/%Xã§ã‚¨ãƒ©ãƒ¼: %s" -#: pg_waldump.c:1316 +#: pg_waldump.c:1321 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" @@ -411,7 +416,7 @@ msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚ªãƒ•セットãŒä¸æ­£ã§ã™:最低ã§ã‚‚%uを期 msgid "contrecord is requested by %X/%X" msgstr "%X/%Xã§ã¯ç¶™ç¶šãƒ¬ã‚³ãƒ¼ãƒ‰ãŒå¿…è¦ã§ã™" -#: xlogreader.c:676 xlogreader.c:1123 +#: xlogreader.c:676 xlogreader.c:1119 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰é•·ãŒä¸æ­£ã§ã™:最低ã§ã‚‚%uを期待ã—ã¦ã„ã¾ã—ãŸãŒã€å®Ÿéš›ã¯%uã§ã—ãŸ" @@ -436,137 +441,132 @@ msgstr "%X/%Xã§contrecordフラグãŒã‚りã¾ã›ã‚“" msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "%3$X/%4$Xã®ç¶™ç¶šãƒ¬ã‚³ãƒ¼ãƒ‰ã®é•·ã•%1$u(æ­£ã—ãã¯%2$lld)ã¯ä¸æ­£ã§ã™" -#: xlogreader.c:924 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "%X/%Xã«ç¶™ç¶šãƒ¬ã‚³ãƒ¼ãƒ‰ãŒã‚りã¾ã›ã‚“" - -#: xlogreader.c:1131 +#: xlogreader.c:1127 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "%2$X/%3$Xã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ID %1$uã¯ä¸æ­£ã§ã™" -#: xlogreader.c:1144 xlogreader.c:1160 +#: xlogreader.c:1140 xlogreader.c:1156 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "%3$X/%4$Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®å¾Œæ–¹ãƒªãƒ³ã‚¯%1$X/%2$XãŒä¸æ­£ã§ã™" -#: xlogreader.c:1196 +#: xlogreader.c:1192 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰å†…ã®ãƒªã‚½ãƒ¼ã‚¹ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ‡ãƒ¼ã‚¿ã®ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸æ­£ã§ã™" -#: xlogreader.c:1230 +#: xlogreader.c:1226 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%2$sã€LSN %3$X/%4$Xã€ã‚ªãƒ•セット%5$uã§ä¸æ­£ãªãƒžã‚¸ãƒƒã‚¯ãƒŠãƒ³ãƒãƒ¼%1$04X" -#: xlogreader.c:1245 xlogreader.c:1287 +#: xlogreader.c:1241 xlogreader.c:1283 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント %2$sã€LSN %3$X/%4$Xã€ã‚ªãƒ•セット%5$uã§ä¸æ­£ãªæƒ…報ビット列%1$04X" -#: xlogreader.c:1261 +#: xlogreader.c:1257 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WALファイルã¯ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ç”±æ¥ã®ã‚‚ã®ã§ã™: WALファイルã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ è­˜åˆ¥å­ã¯ %lluã§ã€pg_control ã«ãŠã‘るデータベースシステム識別å­ã¯ %lluã§ã™" -#: xlogreader.c:1269 +#: xlogreader.c:1265 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL ファイルã¯ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ç”±æ¥ã®ã‚‚ã®ã§ã™: ページヘッダーã®ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚µã‚¤ã‚ºãŒæ­£ã—ãã‚りã¾ã›ã‚“" -#: xlogreader.c:1275 +#: xlogreader.c:1271 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL ファイルã¯ç•°ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚·ã‚¹ãƒ†ãƒ ç”±æ¥ã®ã‚‚ã®ã§ã™: ページヘッダーã®XLOG_BLCKSZãŒæ­£ã—ãã‚りã¾ã›ã‚“" -#: xlogreader.c:1307 +#: xlogreader.c:1303 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%3$sã€LSN %4$X/%5$Xã€ã‚ªãƒ•セット%6$uã§æƒ³å®šå¤–ã®ãƒšãƒ¼ã‚¸ã‚¢ãƒ‰ãƒ¬ã‚¹%1$X/%2$X" -#: xlogreader.c:1333 +#: xlogreader.c:1329 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "WALセグメント%3$sã€LSN %4$X/%5$Xã€ã‚ªãƒ•セット%6$uã§ç•°å¸¸ãªé †åºã®ã‚¿ã‚¤ãƒ ãƒ©ã‚¤ãƒ³ID %1$u(%2$uã®å¾Œ)" -#: xlogreader.c:1739 +#: xlogreader.c:1735 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "block_id %uãŒ%X/%Xã§ä¸æ­£ã§ã™" -#: xlogreader.c:1763 +#: xlogreader.c:1759 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATAãŒè¨­å®šã•れã¦ã„ã¾ã™ãŒã€%X/%Xã«ãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã›ã‚“" -#: xlogreader.c:1770 +#: xlogreader.c:1766 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATAãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“ãŒã€%2$X/%3$Xã®ãƒ‡ãƒ¼ã‚¿é•·ã¯%1$uã§ã™" -#: xlogreader.c:1806 +#: xlogreader.c:1802 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEãŒè¨­å®šã•れã¦ã„ã¾ã™ãŒã€%4$X/%5$Xã§ãƒ›ãƒ¼ãƒ«ã‚ªãƒ•セット%1$uã€é•·ã•%2$uã€ãƒ–ロックイメージ長%3$uã§ã™" -#: xlogreader.c:1822 +#: xlogreader.c:1818 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“ãŒã€%3$X/%4$Xã«ãŠã‘るホールオフセット%1$uã®é•·ã•ãŒ%2$uã§ã™" -#: xlogreader.c:1836 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSEDãŒè¨­å®šã•れã¦ã„ã¾ã™ãŒã€%2$X/%3$Xã«ãŠã„ã¦ãƒ–ロックイメージ長ãŒ%1$uã§ã™" -#: xlogreader.c:1851 +#: xlogreader.c:1847 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLEã‚‚BKPIMAGE_COMPRESSEDも設定ã•れã¦ã„ã¾ã›ã‚“ãŒã€%2$X/%3$Xã«ãŠã„ã¦ãƒ–ロックイメージ長ãŒ%1$uã§ã™" -#: xlogreader.c:1867 +#: xlogreader.c:1863 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_RELãŒè¨­å®šã•れã¦ã„ã¾ã™ãŒã€%X/%Xã«ãŠã„ã¦ä»¥å‰ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒã‚りã¾ã›ã‚“" -#: xlogreader.c:1879 +#: xlogreader.c:1875 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "%2$X/%3$Xã«ãŠã‘ã‚‹block_id %1$uãŒä¸æ­£ã§ã™" -#: xlogreader.c:1946 +#: xlogreader.c:1942 #, c-format msgid "record with invalid length at %X/%X" msgstr "%X/%Xã®ãƒ¬ã‚³ãƒ¼ãƒ‰ã®ã‚µã‚¤ã‚ºãŒä¸æ­£ã§ã™" -#: xlogreader.c:1972 +#: xlogreader.c:1968 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "WALレコード中ã®ID %dã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ブロックを特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: xlogreader.c:2056 +#: xlogreader.c:2052 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "%X/%Xã§ä¸æ­£ãªãƒ–ロック%dãŒæŒ‡å®šã•れã¦ã„ã‚‹ãŸã‚イメージãŒå¾©å…ƒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: xlogreader.c:2063 +#: xlogreader.c:2059 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "%X/%Xã§ãƒ–ロック%dã®ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒä¸æ­£ãªçŠ¶æ…‹ã§ã‚ã‚‹ãŸã‚復元ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: xlogreader.c:2090 xlogreader.c:2107 +#: xlogreader.c:2086 xlogreader.c:2103 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "%1$X/%2$Xã§ã€ãƒ–ロック%4$dãŒã“ã®ãƒ“ルドã§ã‚µãƒãƒ¼ãƒˆã•れãªã„圧縮方å¼%3$sã§åœ§ç¸®ã•れã¦ã„ã‚‹ãŸã‚復元ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: xlogreader.c:2116 +#: xlogreader.c:2112 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "%X/%Xã§ãƒ–ロック%dã®ã‚¤ãƒ¡ãƒ¼ã‚¸ãŒä¸æ˜Žãªæ–¹å¼ã§åœ§ç¸®ã•れã¦ã„ã‚‹ãŸã‚復元ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: xlogreader.c:2124 +#: xlogreader.c:2120 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "%X/%Xã®ãƒ–ロック%dãŒä¼¸å¼µã§ãã¾ã›ã‚“ã§ã—ãŸ" diff --git a/src/bin/pg_waldump/po/ka.po b/src/bin/pg_waldump/po/ka.po index a4698352be1c4..a786eb1f95045 100644 --- a/src/bin/pg_waldump/po/ka.po +++ b/src/bin/pg_waldump/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_waldump (PostgreSQL) 16\n" +"Project-Id-Version: pg_waldump (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-19 11:18+0000\n" -"PO-Revision-Date: 2023-04-20 08:20+0200\n" +"POT-Creation-Date: 2024-07-01 03:49+0000\n" +"PO-Revision-Date: 2024-02-11 16:23+0100\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -38,6 +38,60 @@ msgstr "დეტáƒáƒšáƒ”ბი: " msgid "hint: " msgstr "მინიშნებáƒ: " +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 pg_waldump.c:199 +#: pg_waldump.c:532 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_waldump.c:1104 pg_waldump.c:1127 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" + #: pg_waldump.c:137 #, c-format msgid "could not create directory \"%s\": %m" @@ -53,74 +107,74 @@ msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე \"%s\" áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, მáƒáƒ’ msgid "could not access directory \"%s\": %m" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წვდáƒáƒ›áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: pg_waldump.c:199 pg_waldump.c:527 +#: pg_waldump.c:256 #, c-format -msgid "could not open file \"%s\": %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" +msgid "invalid WAL segment size in WAL file \"%s\" (%d byte)" +msgid_plural "invalid WAL segment size in WAL file \"%s\" (%d bytes)" +msgstr[0] "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ WAL ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" (%d ბáƒáƒ˜áƒ¢áƒ˜)" +msgstr[1] "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ WAL სეგმენტის ზáƒáƒ›áƒ WAL ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" (%d ბáƒáƒ˜áƒ¢áƒ˜)" -#: pg_waldump.c:255 +#: pg_waldump.c:260 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" -msgstr[0] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1 გბ-ს სáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" თáƒáƒ•სáƒáƒ áƒ—ი %d ბáƒáƒ˜áƒ¢áƒ–ე მიუთითებს" -msgstr[1] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1 გბ-ს სáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" თáƒáƒ•სáƒáƒ áƒ—ი %d ბáƒáƒ˜áƒ¢áƒ–ე მიუთითებს" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, შუáƒáƒšáƒ”დიდáƒáƒœ 1მბ-1გბ." -#: pg_waldump.c:261 +#: pg_waldump.c:265 #, c-format msgid "could not read file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: pg_waldump.c:264 +#: pg_waldump.c:268 #, c-format msgid "could not read file \"%s\": read %d of %d" msgstr "\"%s\"-ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: წáƒáƒ™áƒ˜áƒ—ხულირ%d %d-დáƒáƒœ" -#: pg_waldump.c:325 +#: pg_waldump.c:329 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "wal ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") მáƒáƒ«áƒ”ბნრშეუძლებელიáƒ" -#: pg_waldump.c:327 +#: pg_waldump.c:331 #, c-format msgid "could not find any WAL file" msgstr "ვერცერთი WAL ფáƒáƒ˜áƒšáƒ˜ ვერ ვიპáƒáƒ•ე" -#: pg_waldump.c:368 +#: pg_waldump.c:372 #, c-format msgid "could not find file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜ (%s) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" -#: pg_waldump.c:417 +#: pg_waldump.c:421 #, c-format -msgid "could not read from file %s, offset %d: %m" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ (%s)წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ. წáƒáƒœáƒáƒªáƒ•ლებრ%d: %m" +msgid "could not read from file \"%s\", offset %d: %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ. წáƒáƒœáƒáƒªáƒ•ლებრ%d: %m" -#: pg_waldump.c:421 +#: pg_waldump.c:425 #, c-format -msgid "could not read from file %s, offset %d: read %d of %d" -msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ (%s)წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ. წáƒáƒœáƒáƒªáƒ•ლებრ%d: წáƒáƒ™áƒ˜áƒ—ხულირ%d %d-დáƒáƒœ" +msgid "could not read from file \"%s\", offset %d: read %d of %d" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ. წáƒáƒœáƒáƒªáƒ•ლებრ%d: წáƒáƒ™áƒ˜áƒ—ხულირ%d %d-დáƒáƒœ" -#: pg_waldump.c:511 +#: pg_waldump.c:515 #, c-format msgid "%s" msgstr "%s" -#: pg_waldump.c:519 +#: pg_waldump.c:523 #, c-format msgid "invalid fork number: %u" msgstr "ფáƒáƒ áƒ™áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი: \"%u\"" -#: pg_waldump.c:530 +#: pg_waldump.c:535 #, c-format msgid "could not write file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (%s) ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: %m" -#: pg_waldump.c:533 +#: pg_waldump.c:538 #, c-format msgid "could not close file \"%s\": %m" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) დáƒáƒ®áƒ£áƒ áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: pg_waldump.c:753 +#: pg_waldump.c:758 #, c-format msgid "" "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" @@ -129,17 +183,17 @@ msgstr "" "%s áƒáƒ®áƒ“ენს PostgreSQL-ის წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ი ჟურნáƒáƒšáƒ˜áƒ¡ გáƒáƒ¨áƒ˜áƒ¤áƒ•რáƒáƒ¡ დრჩვენებáƒáƒ¡ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ áƒ—ვისთვის.\n" "\n" -#: pg_waldump.c:755 +#: pg_waldump.c:760 #, c-format msgid "Usage:\n" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" -#: pg_waldump.c:756 +#: pg_waldump.c:761 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [STARTSEG [ENDSEG]]\n" -#: pg_waldump.c:757 +#: pg_waldump.c:762 #, c-format msgid "" "\n" @@ -148,27 +202,27 @@ msgstr "" "\n" " პáƒáƒ áƒáƒ›áƒ”ტრები\n" -#: pg_waldump.c:758 +#: pg_waldump.c:763 #, c-format msgid " -b, --bkp-details output detailed information about backup blocks\n" msgstr " -b, --bkp-details დáƒáƒ›áƒáƒ áƒ¥áƒáƒ¤áƒ”ბული ბლáƒáƒ™áƒ”ბის დეტáƒáƒšáƒ£áƒ áƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ ჩვენებáƒ\n" -#: pg_waldump.c:759 +#: pg_waldump.c:764 #, c-format msgid " -B, --block=N with --relation, only show records that modify block N\n" msgstr " -B, --block=N --relation -სთáƒáƒœ ერთáƒáƒ“, მხáƒáƒšáƒáƒ“ იმ ჩáƒáƒœáƒáƒ¬áƒ”რების ჩვენებáƒ, რáƒáƒ›áƒ”ლიც N ბლáƒáƒ™áƒ¡ ცვლიáƒáƒœ\n" -#: pg_waldump.c:760 +#: pg_waldump.c:765 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" msgstr " -e, --end=RECPTR კითხვის შეწყეტრWAL-ის RECPTR მდებáƒáƒ áƒ”áƒáƒ‘áƒáƒ–ე \n" -#: pg_waldump.c:761 +#: pg_waldump.c:766 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" msgstr " -f, --follow WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ ბáƒáƒšáƒáƒ¡ მიღწევის შემდეგ ცდები áƒáƒ  შეწყდებáƒ\n" -#: pg_waldump.c:762 +#: pg_waldump.c:767 #, c-format msgid "" " -F, --fork=FORK only show records that modify blocks in fork FORK;\n" @@ -177,12 +231,12 @@ msgstr "" " -F, --fork=ფáƒáƒ áƒ™áƒ˜ ნáƒáƒ©áƒ•ენები იქნებრჩáƒáƒœáƒáƒ¬áƒ”რები, რáƒáƒ›áƒšáƒ”ბიც მითითებულ ფáƒáƒ áƒ™áƒ¨áƒ˜ ბლáƒáƒ™áƒ”ბს ცვლიáƒáƒœ;\n" " დáƒáƒ¡áƒáƒ¨áƒ•ები სáƒáƒ®áƒ”ლებირmain, fsm, vm, init\n" -#: pg_waldump.c:764 +#: pg_waldump.c:769 #, c-format msgid " -n, --limit=N number of records to display\n" msgstr " -n, --limit=N სáƒáƒ©áƒ•ენებელი ჩáƒáƒœáƒáƒ¬áƒ”რების რáƒáƒáƒ“ენáƒáƒ‘áƒ\n" -#: pg_waldump.c:765 +#: pg_waldump.c:770 #, c-format msgid "" " -p, --path=PATH directory in which to find WAL segment files or a\n" @@ -193,12 +247,12 @@ msgstr "" " სეგმენტის ფáƒáƒ˜áƒšáƒ”ბი áƒáƒœ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე, რáƒáƒ›áƒ”ლიც ./pg_wal-ით, რáƒáƒ›áƒ”ლიც áƒáƒ› \n" " ფáƒáƒ˜áƒšáƒ”ბს შეიცáƒáƒ•ს (ნáƒáƒ’ულისხმები: მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე, ./pg_wal დრ$PGDATA/pg_wal\n" -#: pg_waldump.c:768 +#: pg_waldump.c:773 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet შეცდáƒáƒ›áƒ”ბის გáƒáƒ áƒ“რეკრáƒáƒœáƒ–ე áƒáƒ áƒáƒ¤áƒ”რი გáƒáƒ›áƒáƒ©áƒœáƒ“ებáƒ\n" -#: pg_waldump.c:769 +#: pg_waldump.c:774 #, c-format msgid "" " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" @@ -207,17 +261,17 @@ msgstr "" " -r, --rmgr=RMGR მხáƒáƒšáƒáƒ“ RMGR რესურსების მმáƒáƒ áƒ—ველის მიერ გენერირებული ჩáƒáƒœáƒáƒ¬áƒ”რების ჩვენებáƒ. ;\n" " რესურსების მმáƒáƒ áƒ—ველების სიის მისáƒáƒ¦áƒ”ბáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ --rmgr=list\n" -#: pg_waldump.c:771 +#: pg_waldump.c:776 #, c-format msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n" msgstr " -R, --relation=T/D/R ნáƒáƒ©áƒ•ენები იქნებრჩáƒáƒœáƒáƒ¬áƒ”რები, რáƒáƒ›áƒšáƒ”ბიც ცვლიáƒáƒœ ბლáƒáƒ™áƒ”ბს ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ T/D/R\n" -#: pg_waldump.c:772 +#: pg_waldump.c:777 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" msgstr " -s, --start=RECPTR კითხვის WAL მდებáƒáƒ áƒ”áƒáƒ‘რRECPTR-სთáƒáƒœ დáƒáƒ¬áƒ§áƒ”ბáƒ\n" -#: pg_waldump.c:773 +#: pg_waldump.c:778 #, c-format msgid "" " -t, --timeline=TLI timeline from which to read WAL records\n" @@ -226,22 +280,22 @@ msgstr "" " -t, --timeline=TLI დრáƒáƒ˜áƒ¡ ხáƒáƒ–ი, ის შემდეგáƒáƒª დáƒáƒ˜áƒ¬áƒ§áƒ”ბრWAL ჩáƒáƒœáƒáƒ¬áƒ”რების კითხვáƒ\n" " (ნáƒáƒ’ულისხმები: 1 áƒáƒœ STARTSEG-ში გáƒáƒ›áƒáƒ§áƒ”ნებული მნიშვნელáƒáƒ‘áƒ)\n" -#: pg_waldump.c:775 +#: pg_waldump.c:780 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_waldump.c:776 +#: pg_waldump.c:781 #, c-format msgid " -w, --fullpage only show records with a full page write\n" msgstr " -w, --fullpage მხáƒáƒšáƒáƒ“ სრული გვერდის ჩáƒáƒ¬áƒ”რის მქáƒáƒœáƒ” ჩáƒáƒœáƒáƒ¬áƒ”რების ჩვენებáƒ\n" -#: pg_waldump.c:777 +#: pg_waldump.c:782 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" msgstr " -x, --xid=XID მხáƒáƒšáƒáƒ“ იმ ჩáƒáƒœáƒáƒ¬áƒ”რების ჩვენებáƒ, რáƒáƒ›áƒšáƒ˜áƒ¡ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID XID-ს უდრის\n" -#: pg_waldump.c:778 +#: pg_waldump.c:783 #, c-format msgid "" " -z, --stats[=record] show statistics instead of records\n" @@ -250,17 +304,17 @@ msgstr "" " -z, --stats[=ჩáƒáƒœáƒáƒ¬áƒ”რი] ჩáƒáƒœáƒ¬áƒ”რების მáƒáƒ’იერ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ ჩვენებáƒ\n" " (áƒáƒ¡áƒ”ვე შესáƒáƒ«áƒšáƒ”ბელირსáƒáƒ—ითáƒáƒáƒ“ ჩáƒáƒœáƒáƒ¬áƒ”რის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ ჩვენებáƒáƒª)\n" -#: pg_waldump.c:780 +#: pg_waldump.c:785 #, c-format msgid " --save-fullpage=DIR save full page images to DIR\n" msgstr " --save-fullpage=სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში სრული გვერდის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბების სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეში შენáƒáƒ®áƒ•áƒ\n" -#: pg_waldump.c:781 +#: pg_waldump.c:786 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: pg_waldump.c:782 +#: pg_waldump.c:787 #, c-format msgid "" "\n" @@ -269,308 +323,294 @@ msgstr "" "\n" "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n" -#: pg_waldump.c:783 +#: pg_waldump.c:788 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" -#: pg_waldump.c:879 +#: pg_waldump.c:884 #, c-format msgid "no arguments specified" msgstr "áƒáƒ áƒ’უმენტები მითითებული áƒáƒ áƒáƒ" -#: pg_waldump.c:895 +#: pg_waldump.c:900 #, c-format msgid "invalid block number: \"%s\"" msgstr "ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი: \"%s\"" -#: pg_waldump.c:904 pg_waldump.c:1002 +#: pg_waldump.c:909 pg_waldump.c:1007 #, c-format msgid "invalid WAL location: \"%s\"" msgstr "wal-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘áƒ: \"%s\"" -#: pg_waldump.c:917 +#: pg_waldump.c:922 #, c-format msgid "invalid fork name: \"%s\"" msgstr "ფáƒáƒ áƒ™áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\"" -#: pg_waldump.c:925 pg_waldump.c:1028 +#: pg_waldump.c:930 pg_waldump.c:1033 #, c-format msgid "invalid value \"%s\" for option %s" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრისთვის %s" -#: pg_waldump.c:956 +#: pg_waldump.c:961 #, c-format msgid "custom resource manager \"%s\" does not exist" msgstr "რესურსების მმáƒáƒ áƒ—ველი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_waldump.c:977 +#: pg_waldump.c:982 #, c-format msgid "resource manager \"%s\" does not exist" msgstr "რესურსების მმáƒáƒ áƒ—ველი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_waldump.c:992 +#: pg_waldump.c:997 #, c-format msgid "invalid relation specification: \"%s\"" msgstr "ურთიერთáƒáƒ‘ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციფიკáƒáƒªáƒ˜áƒ: \"%s\"" -#: pg_waldump.c:993 +#: pg_waldump.c:998 #, c-format msgid "Expecting \"tablespace OID/database OID/relation filenode\"." msgstr "მáƒáƒ•ელáƒáƒ“ი \"tablespace OID/database OID/relation filenode\"." -#: pg_waldump.c:1035 +#: pg_waldump.c:1040 #, c-format msgid "%s must be in range %u..%u" msgstr "%s- %u-დáƒáƒœ %u-მდე დიáƒáƒžáƒáƒ–áƒáƒœáƒ¨áƒ˜ უნდრიყáƒáƒ¡" -#: pg_waldump.c:1050 +#: pg_waldump.c:1055 #, c-format msgid "invalid transaction ID specification: \"%s\"" msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციფიკáƒáƒªáƒ˜áƒ: \"%s\"" -#: pg_waldump.c:1065 +#: pg_waldump.c:1070 #, c-format msgid "unrecognized value for option %s: %s" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის (%s) უცნáƒáƒ‘ი მნიშვნელáƒáƒ‘áƒ: %s" -#: pg_waldump.c:1082 +#: pg_waldump.c:1087 #, c-format msgid "option %s requires option %s to be specified" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრს %s თáƒáƒ•ის მხრივ სჭირდებრპáƒáƒ áƒáƒ›áƒ”ტრის %s მითითებáƒ" -#: pg_waldump.c:1089 +#: pg_waldump.c:1094 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")" -#: pg_waldump.c:1099 pg_waldump.c:1122 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" - -#: pg_waldump.c:1128 pg_waldump.c:1158 +#: pg_waldump.c:1133 pg_waldump.c:1163 #, c-format msgid "could not open file \"%s\"" msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ: \"%s\"" -#: pg_waldump.c:1138 +#: pg_waldump.c:1143 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ WAL მდებáƒáƒ áƒ”áƒáƒ‘რ%X/%X ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შიგნით áƒáƒ áƒáƒ" -#: pg_waldump.c:1165 +#: pg_waldump.c:1170 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "ENDSEG %s STARTSEG %s -ის წინáƒáƒ" -#: pg_waldump.c:1180 +#: pg_waldump.c:1185 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜áƒ¡ WAL მდებáƒáƒ áƒ”áƒáƒ‘რ%X/%X ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შიგნით áƒáƒ áƒáƒ" -#: pg_waldump.c:1192 +#: pg_waldump.c:1197 #, c-format msgid "no start WAL location given" msgstr "wal-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘რმითითებული áƒáƒ áƒáƒ" -#: pg_waldump.c:1206 +#: pg_waldump.c:1211 #, c-format msgid "out of memory while allocating a WAL reading processor" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებრWAL-ის წáƒáƒ›áƒ™áƒ˜áƒ—ხáƒáƒ•ი პრáƒáƒªáƒ”სáƒáƒ áƒ˜áƒ¡áƒ—ვის" -#: pg_waldump.c:1212 +#: pg_waldump.c:1217 #, c-format msgid "could not find a valid record after %X/%X" msgstr "%X/%X -ის შემდეგ სწáƒáƒ áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pg_waldump.c:1222 +#: pg_waldump.c:1227 #, c-format -msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" -msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" -msgstr[0] "პირველი ჩáƒáƒœáƒáƒ¬áƒ”რი %X/%X-ის შემდეგáƒáƒ, %X/%X-სთáƒáƒœ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებული იქნებრ%u ბáƒáƒ˜áƒ¢áƒ˜\n" -msgstr[1] "პირველი ჩáƒáƒœáƒáƒ¬áƒ”რი %X/%X-ის შემდეგáƒáƒ, %X/%X-სთáƒáƒœ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებული იქნებრ%u ბáƒáƒ˜áƒ¢áƒ˜\n" +msgid "first record is after %X/%X, at %X/%X, skipping over %u byte" +msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes" +msgstr[0] "პირველი ჩáƒáƒœáƒáƒ¬áƒ”რი %X/%X-ის შემდეგáƒáƒ, მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X-სთáƒáƒœ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებული იქნებრ%u ბáƒáƒ˜áƒ¢áƒ˜" +msgstr[1] "პირველი ჩáƒáƒœáƒáƒ¬áƒ”რი %X/%X-ის შემდეგáƒáƒ, მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X-სთáƒáƒœ. გáƒáƒ›áƒáƒ¢áƒáƒ•ებული იქნებრ%u ბáƒáƒ˜áƒ¢áƒ˜" -#: pg_waldump.c:1307 +#: pg_waldump.c:1312 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "შეცდáƒáƒ›áƒ WAL ჩáƒáƒœáƒáƒ¬áƒ”რში %X/%X: %s" -#: pg_waldump.c:1316 +#: pg_waldump.c:1321 #, c-format msgid "Try \"%s --help\" for more information." msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." -#: xlogreader.c:626 +#: xlogreader.c:619 #, c-format msgid "invalid record offset at %X/%X: expected at least %u, got %u" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წáƒáƒœáƒáƒªáƒ•ლებრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X: მáƒáƒ•ელáƒáƒ“ი მინიმუმ %u, მივიღე %u" -#: xlogreader.c:635 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "contrecord მáƒáƒ—ხáƒáƒ•ნილირ%X/%X-ის მიერ" -#: xlogreader.c:676 xlogreader.c:1123 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X: მáƒáƒ•ელáƒáƒ“ი მინიმუმ %u, მივიღე %u" -#: xlogreader.c:705 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "%u სიგრძის მქáƒáƒœáƒ” ჩáƒáƒœáƒáƒ¬áƒ”რის დეკáƒáƒ“ირებისთვის მეხსიერებრსáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒ áƒáƒ" - -#: xlogreader.c:727 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის სიგრძე %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" - -#: xlogreader.c:776 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "contrecord áƒáƒšáƒáƒ›áƒ˜ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: xlogreader.c:789 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "contrecord -ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე %u (მáƒáƒ•ელáƒáƒ“ი %lld) მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:924 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "contrecord მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" - -#: xlogreader.c:1131 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "რესურსის მმáƒáƒ áƒ—ველის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ID %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1144 xlogreader.c:1160 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წინრბმულით %X/%X მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1196 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "რესურსის მმáƒáƒ áƒ—ველის მáƒáƒœáƒáƒªáƒ”მების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ რიცხვი ჩáƒáƒœáƒáƒ¬áƒ”რში მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1230 +#: xlogreader.c:1243 #, c-format msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ’იური რიცხვი %04X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u" -#: xlogreader.c:1245 xlogreader.c:1287 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ˜áƒœáƒ¤áƒáƒ áƒ›áƒáƒªáƒ˜áƒ ბიტები %04X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u" -#: xlogreader.c:1261 +#: xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL ფáƒáƒ˜áƒšáƒ˜ სხვრბáƒáƒ–იდáƒáƒœáƒáƒ: WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ ბáƒáƒ–ის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ %llu, pg_control-ის ბáƒáƒ–ის სისტემის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ კი %llu" -#: xlogreader.c:1269 +#: xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" msgstr "WAL ფáƒáƒ˜áƒšáƒ˜ სხვრბáƒáƒ–ის სიტემიდáƒáƒœáƒáƒ: სეგმáƒáƒœáƒ¢áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ზáƒáƒ›áƒ გვერდის თáƒáƒ•სáƒáƒ áƒ—ში" -#: xlogreader.c:1275 +#: xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" msgstr "WAL ფáƒáƒ˜áƒšáƒ˜ სხვრმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სისტემიდáƒáƒœáƒáƒ: გვერდის თáƒáƒ•სáƒáƒ áƒ—ში მითითებული XLOG_BLKSZ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" -#: xlogreader.c:1307 +#: xlogreader.c:1320 #, c-format msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი pageaddr %X/%X ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u" -#: xlogreader.c:1333 +#: xlogreader.c:1346 #, c-format msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" msgstr "მიმდევრáƒáƒ‘ის-გáƒáƒ áƒ” დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის ID %u (%u-ის შემდეგ) ჟურნáƒáƒšáƒ˜áƒ¡ სეგმენტში %s, LSN %X/%X, წáƒáƒœáƒáƒªáƒ•ლებრ%u" -#: xlogreader.c:1739 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "ურიგრblock_id %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1763 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› მáƒáƒœáƒáƒªáƒ”მები მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: xlogreader.c:1770 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს მáƒáƒœáƒáƒªáƒ”მები სიგრძით %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1806 +#: xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› ნáƒáƒ®áƒ•რეტის წáƒáƒœáƒáƒªáƒ•ლებრ%u სიგრძე %u ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძე %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1822 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ, მáƒáƒ’რáƒáƒ› ნáƒáƒ®áƒ•რეტის წáƒáƒœáƒáƒªáƒ•ლებრ%u სიგრძე %u მისáƒáƒœáƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1836 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძერ%u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1851 +#: xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" msgstr "áƒáƒ áƒª BKPIMAGE_HAS_HOLE დრáƒáƒ áƒª BKPIMAGE_COMPRESSED დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ, მáƒáƒ’რáƒáƒ› ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒ¡áƒšáƒ˜áƒ¡ სიგრძე %u-áƒ, მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1867 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL დáƒáƒ§áƒ”ნებულიáƒ, მáƒáƒ’რáƒáƒ› წინრმნიშვნელáƒáƒ‘რმითითებული áƒáƒ áƒáƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1879 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ block_id %u %X/%X" -#: xlogreader.c:1946 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძით მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" -#: xlogreader.c:1972 +#: xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "შეცდáƒáƒ›áƒ WAL ჩáƒáƒœáƒáƒ¬áƒ”რში მáƒáƒ áƒ¥áƒáƒ¤áƒ˜ ბლáƒáƒ™áƒ˜áƒ¡, ID-ით %d, მáƒáƒ«áƒ”ბნისáƒáƒ¡" -#: xlogreader.c:2056 +#: xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, რáƒáƒªáƒ მითითებულირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბლáƒáƒ™áƒ˜ %d" -#: xlogreader.c:2063 +#: xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ით, ბლáƒáƒ™áƒ˜ %d" -#: xlogreader.c:2090 xlogreader.c:2107 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" msgstr "%3$s მეთáƒáƒ“ით შეკუმშული áƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %1$X/%2$X, ბლáƒáƒ™áƒ˜ %4$d შეუძლებელიáƒ. მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირáƒáƒ› áƒáƒ’ების მიერ" -#: xlogreader.c:2116 +#: xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ áƒáƒ¦áƒ“გენრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, შეკუმშულირუცნáƒáƒ‘ი მეთáƒáƒ“ით, ბლáƒáƒ™áƒ˜ %d" -#: xlogreader.c:2124 +#: xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ გáƒáƒ¨áƒšáƒ მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X, ბლáƒáƒ™áƒ˜ %d" +#, c-format +#~ msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" +#~ msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" +#~ msgstr[0] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1 გბ-ს სáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" თáƒáƒ•სáƒáƒ áƒ—ი %d ბáƒáƒ˜áƒ¢áƒ–ე მიუთითებს" +#~ msgstr[1] "WAL სეგმენტის ზáƒáƒ›áƒ áƒáƒ áƒ˜áƒ¡ ხáƒáƒ áƒ˜áƒ¡áƒ®áƒ˜ უნდრიყáƒáƒ¡, 1 მბ-სრდრ1 გბ-ს სáƒáƒ áƒ˜áƒ¡, მáƒáƒ’რáƒáƒ› WAL ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" თáƒáƒ•სáƒáƒ áƒ—ი %d ბáƒáƒ˜áƒ¢áƒ–ე მიუთითებს" + #, c-format #~ msgid "invalid record offset at %X/%X" #~ msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ წáƒáƒœáƒáƒªáƒ•ლებრმისáƒáƒ›áƒáƒ áƒ—ზე %X/%X" @@ -578,3 +618,15 @@ msgstr "შეუძლებელირáƒáƒ¡áƒšáƒ˜áƒ¡ გáƒáƒ¨áƒšáƒ მი #, c-format #~ msgid "invalid timeline specification: \"%s\"" #~ msgstr "დრáƒáƒ˜áƒ¡ ხáƒáƒ–ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სპეციფიკáƒáƒªáƒ˜áƒ: \"%s\"" + +#, c-format +#~ msgid "missing contrecord at %X/%X" +#~ msgstr "contrecord მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#, c-format +#~ msgid "out of memory while trying to decode a record of length %u" +#~ msgstr "%u სიგრძის მქáƒáƒœáƒ” ჩáƒáƒœáƒáƒ¬áƒ”რის დეკáƒáƒ“ირებისთვის მეხსიერებრსáƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒ áƒáƒ" + +#, c-format +#~ msgid "record length %u at %X/%X too long" +#~ msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის სიგრძე %u მისáƒáƒ›áƒáƒ áƒ—ზე %X/%X ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" diff --git a/src/bin/pg_waldump/po/ko.po b/src/bin/pg_waldump/po/ko.po index 3a175f0a8d159..25e4c0cfe2c95 100644 --- a/src/bin/pg_waldump/po/ko.po +++ b/src/bin/pg_waldump/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pg_waldump (PostgreSQL) 12\n" +"Project-Id-Version: pg_waldump (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-02-09 20:14+0000\n" -"PO-Revision-Date: 2019-10-31 18:06+0900\n" +"POT-Creation-Date: 2025-01-17 04:48+0000\n" +"PO-Revision-Date: 2025-01-16 14:06+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -17,96 +17,179 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:188 -#, c-format -msgid "fatal: " -msgstr "심ê°: " - -#: ../../../src/common/logging.c:195 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../../../src/common/logging.c:202 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " -#: pg_waldump.c:148 +#: ../../../src/common/logging.c:294 #, c-format -msgid "could not open file \"%s\": %s" -msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s" +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " -#: pg_waldump.c:205 +#: ../../../src/common/logging.c:301 #, c-format -msgid "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL " -"file \"%s\" header specifies %d byte" -msgid_plural "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL " -"file \"%s\" header specifies %d bytes" -msgstr[0] "" -"WAL ì¡°ê° íŒŒì¼ í¬ê¸°ëŠ” 1MBì—서 1GBì‚¬ì´ 2^n ì´ì–´ì•¼í•˜ì§€ë§Œ, \"%s\" WAL íŒŒì¼ í—¤ë”ì—" -"는 %d ë°”ì´íŠ¸ë¡œ 지정ë˜ì–´ìžˆìŠµë‹ˆë‹¤" +msgid "hint: " +msgstr "힌트: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "메모리 부족\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ë„ í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 pg_waldump.c:199 +#: pg_waldump.c:532 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 위해 íŒŒì¼ ì‹œìŠ¤í…œ ë™ê¸°í™”를 í•  수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ìƒíƒœ ê°’ì„ êµ¬í•  수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ì´ ë¹Œë“œëŠ” \"%s\" ë™ê¸°í™” ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_waldump.c:1104 pg_waldump.c:1127 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ fsync í•  수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" + +#: pg_waldump.c:137 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 만들 수 ì—†ìŒ: %m" + +#: pg_waldump.c:146 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "\"%s\" 디렉터리가 있지만, 비어있지 않ìŒ" + +#: pg_waldump.c:150 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "\"%s\" ë””ë ‰í„°ë¦¬ì— ì ‘ê·¼ í•  수 ì—†ìŒ: %m" + +#: pg_waldump.c:256 +#, c-format +msgid "invalid WAL segment size in WAL file \"%s\" (%d byte)" +msgid_plural "invalid WAL segment size in WAL file \"%s\" (%d bytes)" +msgstr[0] "\"%s\" WAL íŒŒì¼ ì•ˆì— ìž˜ëª»ëœ WAL ì¡°ê° í¬ê¸° (%d ë°”ì´íЏ)" + +#: pg_waldump.c:260 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL ì¡°ê° íŒŒì¼ í¬ê¸°ëŠ” 1MBì—서 1GBì‚¬ì´ 2^n ì´ì–´ì•¼ 합니다." -#: pg_waldump.c:213 +#: pg_waldump.c:265 #, c-format -msgid "could not read file \"%s\": %s" -msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s" +msgid "could not read file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: pg_waldump.c:216 +#: pg_waldump.c:268 #, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %zu" +msgid "could not read file \"%s\": read %d of %d" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %d ì½ìŒ, ì „ì²´ %d" -#: pg_waldump.c:294 +#: pg_waldump.c:329 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "\"%s\" WAL íŒŒì¼ ì°¾ê¸° 실패" -#: pg_waldump.c:296 +#: pg_waldump.c:331 #, c-format msgid "could not find any WAL file" msgstr "ì–´ë–¤ WAL 파ì¼ë„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: pg_waldump.c:367 +#: pg_waldump.c:372 #, c-format -msgid "could not find file \"%s\": %s" -msgstr "\"%s\" 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" +msgid "could not find file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ: %m" -#: pg_waldump.c:382 +#: pg_waldump.c:421 #, c-format -msgid "could not seek in log file %s to offset %u: %s" -msgstr "%s 로그 ì¡°ê° íŒŒì¼ì—서 %u 위치를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" +msgid "could not read from file \"%s\", offset %d: %m" +msgstr "\"%s\" 파ì¼ì—서 %d 위치를 ì½ì„ 수 ì—†ìŒ: %m" -#: pg_waldump.c:405 +#: pg_waldump.c:425 #, c-format -msgid "could not read from log file %s, offset %u, length %d: %s" -msgstr "%s 로그 ì¡°ê° íŒŒì¼ì—서 %u 위치ì—서 %d 길ì´ë¥¼ ì½ì„ 수 ì—†ìŒ: %s" +msgid "could not read from file \"%s\", offset %d: read %d of %d" +msgstr "%s 파ì¼ì—서 %d 위치ì—서 ì½ê¸° 실패: %d ì½ìŒ, ì „ì²´ %d" -#: pg_waldump.c:408 +#: pg_waldump.c:515 #, c-format -msgid "could not read from log file %s, offset %u: read %d of %zu" -msgstr "%s 로그 ì¡°ê° íŒŒì¼ì—서 %u 위치ì—서 ì½ê¸° 실패: %d / %zu ì½ìŒ" +msgid "%s" +msgstr "%s" -#: pg_waldump.c:788 +#: pg_waldump.c:523 +#, c-format +msgid "invalid fork number: %u" +msgstr "ìž˜ëª»ëœ í¬í¬ 번호: %u" + +#: pg_waldump.c:535 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 쓸 수 ì—†ìŒ: %m" + +#: pg_waldump.c:538 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" + +#: pg_waldump.c:758 #, c-format msgid "" "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" "\n" msgstr "%s ëª…ë ¹ì€ ë””ë²„ê¹…ì„ ìœ„í•´ PostgreSQL 미리 쓰기 로그(WAL)를 ë¶„ì„합니다.\n" -#: pg_waldump.c:790 +#: pg_waldump.c:760 #, c-format msgid "Usage:\n" msgstr "사용법:\n" -#: pg_waldump.c:791 +#: pg_waldump.c:761 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [옵션]... [ì‹œìž‘íŒŒì¼ [마침파ì¼]]\n" -#: pg_waldump.c:792 +#: pg_waldump.c:762 #, c-format msgid "" "\n" @@ -115,40 +198,63 @@ msgstr "" "\n" "옵션들:\n" -#: pg_waldump.c:793 +#: pg_waldump.c:763 #, c-format msgid "" " -b, --bkp-details output detailed information about backup blocks\n" msgstr " -b, --bkp-details 백업 블ë¡ì— 대한 ìžì„¸í•œ ì •ë³´ë„ ì¶œë ¥í•¨\n" -#: pg_waldump.c:794 +#: pg_waldump.c:764 +#, c-format +msgid "" +" -B, --block=N with --relation, only show records that modify " +"block N\n" +msgstr "" +" -B, --block=N --relation 옵션과 함께, ë³€ê²½ëœ N번 블ë¡ì˜ 레코드만" +"ë´„\n" + +#: pg_waldump.c:765 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" msgstr " -e, --end=RECPTR RECPTR WAL 위치ì—서 ì½ê¸° 멈춤\n" -#: pg_waldump.c:795 +#: pg_waldump.c:766 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" msgstr " -f, --follow WAL ë까지 ì½ì€ ë’¤ì—ë„ ê³„ì† ì§„í–‰í•¨\n" -#: pg_waldump.c:796 +#: pg_waldump.c:767 +#, c-format +msgid "" +" -F, --fork=FORK only show records that modify blocks in fork FORK;\n" +" valid names are main, fsm, vm, init\n" +msgstr "" +" -F, --fork=FORK 지정한 FORK 종류 í¬í¬ì˜ 변경 블ë¡ì˜ 레코드만\n" +" 사용가능한 í¬í¬: main, fsm, vm, init\n" + +#: pg_waldump.c:769 #, c-format msgid " -n, --limit=N number of records to display\n" msgstr " -n, --limit=N 출력할 레코드 수\n" -#: pg_waldump.c:797 +#: pg_waldump.c:770 #, c-format msgid "" -" -p, --path=PATH directory in which to find log segment files or a\n" +" -p, --path=PATH directory in which to find WAL segment files or a\n" " directory with a ./pg_wal that contains such files\n" " (default: current directory, ./pg_wal, $PGDATA/" "pg_wal)\n" msgstr "" -" -p, --path=PATH 로그 ì¡°ê° íŒŒì¼ì´ 있는 디렉터리 지정, ë˜ëŠ”\n" +" -p, --path=PATH WAL ì¡°ê° íŒŒì¼ì´ 있는 디렉터리 지정, ë˜ëŠ”\n" " ./pg_wal 디렉터리가 있는 디렉터리 지정\n" " (기본값: 현재 디렉터리, ./pg_wal, PGDATA/pg_wal)\n" -#: pg_waldump.c:800 +#: pg_waldump.c:773 +#, c-format +msgid " -q, --quiet do not print any output, except for errors\n" +msgstr " -q, --quiet 오류를 빼고 나머지는 아무 ê²ƒë„ ì•ˆ 보여줌\n" + +#: pg_waldump.c:774 #, c-format msgid "" " -r, --rmgr=RMGR only show records generated by resource manager " @@ -159,31 +265,44 @@ msgstr "" " -r, --rmgr=RMGR 리소스 ê´€ë¦¬ìž RMGRì—서 만든 레코드만 출력함\n" " 리소스 ê´€ë¦¬ìž ì´ë“¤ì„ --rmgr=list 로 ë´„\n" -#: pg_waldump.c:802 +#: pg_waldump.c:776 +#, c-format +msgid "" +" -R, --relation=T/D/R only show records that modify blocks in relation T/" +"D/R\n" +msgstr "" +" -R, --relation=T/D/R T/D/R 릴레ì´ì…˜ì—서 변경 ë¸”ë¡ ë ˆì½”ë“œë§Œ 보여줌\n" + +#: pg_waldump.c:777 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" msgstr " -s, --start=RECPTR WAL RECPTR 위치ì—서 ì½ê¸° 시작\n" -#: pg_waldump.c:803 +#: pg_waldump.c:778 #, c-format msgid "" -" -t, --timeline=TLI timeline from which to read log records\n" +" -t, --timeline=TLI timeline from which to read WAL records\n" " (default: 1 or the value used in STARTSEG)\n" msgstr "" -" -t, --timeline=TLI ì½ê¸° 시작할 타임ë¼ì¸ 번호\n" +" -t, --timeline=TLI WAL 레코드를 시작할 타임ë¼ì¸ 번호\n" " (기본값: 1 ë˜ëŠ” STARTSEGì— ì‚¬ìš©ëœ ê°’)\n" -#: pg_waldump.c:805 +#: pg_waldump.c:780 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 ì •ë³´ 보여주고 마침\n" -#: pg_waldump.c:806 +#: pg_waldump.c:781 +#, c-format +msgid " -w, --fullpage only show records with a full page write\n" +msgstr " -w, --fullpage full page write 레코드만 보여줌\n" + +#: pg_waldump.c:782 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" msgstr " -x, --xid=XID 트랜잭션 XID 레코드만 출력\n" -#: pg_waldump.c:807 +#: pg_waldump.c:783 #, c-format msgid "" " -z, --stats[=record] show statistics instead of records\n" @@ -192,122 +311,346 @@ msgstr "" " -z, --stats[=record] ë ˆí¬ë“œ 통계 정보를 보여줌\n" " (추가로, 레코드당 통계정보를 출력)\n" -#: pg_waldump.c:809 +#: pg_waldump.c:785 +#, c-format +msgid " --save-fullpage=DIR save full page images to DIR\n" +msgstr " --save-fullpage=DIR DIRì— ì „ì²´ 페ì´ì§€ ì´ë¯¸ì§€ 저장\n" + +#: pg_waldump.c:786 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: pg_waldump.c:810 +#: pg_waldump.c:787 #, c-format msgid "" "\n" -"Report bugs to .\n" +"Report bugs to <%s>.\n" msgstr "" "\n" -"오류보고: .\n" +"ë¬¸ì œì  ë³´ê³  주소: <%s>\n" + +#: pg_waldump.c:788 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 홈페ì´ì§€: <%s>\n" #: pg_waldump.c:884 #, c-format msgid "no arguments specified" msgstr "ì¸ìžë¥¼ 지정하세요" -#: pg_waldump.c:899 +#: pg_waldump.c:900 +#, c-format +msgid "invalid block number: \"%s\"" +msgstr "ìž˜ëª»ëœ ë¸”ë¡ ë²ˆí˜¸: \"%s\"" + +#: pg_waldump.c:909 pg_waldump.c:1007 +#, c-format +msgid "invalid WAL location: \"%s\"" +msgstr "ìž˜ëª»ëœ WAL 위치: \"%s\"" + +#: pg_waldump.c:922 #, c-format -msgid "could not parse end WAL location \"%s\"" -msgstr "\"%s\" ì´ë¦„ì˜ WAL 위치를 í•´ì„í•  수 ì—†ìŒ" +msgid "invalid fork name: \"%s\"" +msgstr "ìž˜ëª»ëœ í¬í¬ ì´ë¦„: \"%s\"" -#: pg_waldump.c:911 +#: pg_waldump.c:930 pg_waldump.c:1033 #, c-format -msgid "could not parse limit \"%s\"" -msgstr "\"%s\" ì œí•œì„ í•´ì„í•  수 ì—†ìŒ" +msgid "invalid value \"%s\" for option %s" +msgstr "\"%s\" ê°’ì€ %s 옵션 값으로 유효하지 않ìŒ" -#: pg_waldump.c:939 +#: pg_waldump.c:961 +#, c-format +msgid "custom resource manager \"%s\" does not exist" +msgstr "\"%s\" ì´ë¦„ì˜ ì‚¬ìš©ìž ì •ì˜ ë¦¬ì†ŒìŠ¤ 관리ìžê°€ ì—†ìŒ" + +#: pg_waldump.c:982 #, c-format msgid "resource manager \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ë¦¬ì†ŒìŠ¤ 관리ìžê°€ ì—†ìŒ" -#: pg_waldump.c:948 +#: pg_waldump.c:997 #, c-format -msgid "could not parse start WAL location \"%s\"" -msgstr "\"%s\" WAL 위치를 í•´ì„í•  수 ì—†ìŒ" +msgid "invalid relation specification: \"%s\"" +msgstr "ìž˜ëª»ëœ ë¦´ë ˆì´ì…˜ ì–‘ì‹: \"%s\"" -#: pg_waldump.c:958 +#: pg_waldump.c:998 #, c-format -msgid "could not parse timeline \"%s\"" -msgstr "\"%s\" 타임ë¼ì¸ 번호를 í•´ì„í•  수 ì—†ìŒ" +msgid "Expecting \"tablespace OID/database OID/relation filenode\"." +msgstr "\"í…Œì´ë¸”스페ì´ìФOID/ë°ì´í„°ë² ì´ìФOID/릴레ì´ì…˜ filenode\" ì–‘ì‹ì„ 기대함" -#: pg_waldump.c:965 +#: pg_waldump.c:1040 #, c-format -msgid "could not parse \"%s\" as a transaction ID" -msgstr "\"%s\" 문ìžì—´ì„ 트랜잭션 ID로 í•´ì„í•  수 ì—†ìŒ" +msgid "%s must be in range %u..%u" +msgstr "%s ê°’ì€ %u부터 %u까지만 허용함" -#: pg_waldump.c:980 +#: pg_waldump.c:1055 #, c-format -msgid "unrecognized argument to --stats: %s" -msgstr "--stats ì˜µì…˜ê°’ì´ ë°”ë¥´ì§€ 않ìŒ: %s" +msgid "invalid transaction ID specification: \"%s\"" +msgstr "ìž˜ëª»ëœ íŠ¸ëžœìž­ì…˜ ID ì–‘ì‹: \"%s\"" -#: pg_waldump.c:993 +#: pg_waldump.c:1070 #, c-format -msgid "too many command-line arguments (first is \"%s\")" -msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")" +msgid "unrecognized value for option %s: %s" +msgstr "%s ì˜µì…˜ì— ëŒ€í•œ 알 수 없는 ê°’: %s" -#: pg_waldump.c:1003 +#: pg_waldump.c:1087 #, c-format -msgid "path \"%s\" could not be opened: %s" -msgstr "\"%s\" 경로를 ì—´ 수 ì—†ìŒ: %s" +msgid "option %s requires option %s to be specified" +msgstr "%s ì˜µì…˜ì€ %s 옵션 ì„¤ì •ì´ í•„ìš”í•©ë‹ˆë‹¤." -#: pg_waldump.c:1024 +#: pg_waldump.c:1094 #, c-format -msgid "could not open directory \"%s\": %s" -msgstr "\"%s\" 디렉터리를 ì—´ 수 ì—†ìŒ: %s" +msgid "too many command-line arguments (first is \"%s\")" +msgstr "너무 ë§Žì€ ëª…ë ¹í–‰ ì¸ìˆ˜ë¥¼ 지정했습니다. (ì²˜ìŒ \"%s\")" -#: pg_waldump.c:1031 pg_waldump.c:1062 +#: pg_waldump.c:1133 pg_waldump.c:1163 #, c-format msgid "could not open file \"%s\"" msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ" -#: pg_waldump.c:1041 +#: pg_waldump.c:1143 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "%X/%X WAL 시작 위치가 \"%s\" 파ì¼ì— ì—†ìŒ" -#: pg_waldump.c:1069 +#: pg_waldump.c:1170 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "%s ENDSEGê°€ %s STARTSEG ì•žì— ìžˆìŒ" -#: pg_waldump.c:1084 +#: pg_waldump.c:1185 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "%X/%X WAL ë 위치가 \"%s\" 파ì¼ì— ì—†ìŒ" -#: pg_waldump.c:1097 +#: pg_waldump.c:1197 #, c-format msgid "no start WAL location given" msgstr "입력한 WAL 위치ì—서 시작할 수 ì—†ìŒ" -#: pg_waldump.c:1107 +#: pg_waldump.c:1211 #, c-format -msgid "out of memory" -msgstr "메모리 부족" +msgid "out of memory while allocating a WAL reading processor" +msgstr "WAL ì½ê¸° 프로세서를 할당하는 ì¤‘ì— ë©”ëª¨ë¦¬ 부족 ë°œìƒ" -#: pg_waldump.c:1113 +#: pg_waldump.c:1217 #, c-format msgid "could not find a valid record after %X/%X" msgstr "%X/%X 위치 ë’¤ì— ì˜¬ë°”ë¥¸ 레코드가 ì—†ìŒ" -#: pg_waldump.c:1124 +#: pg_waldump.c:1227 #, c-format -msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" -msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" -msgstr[0] "첫 레코드가 %X/%X ë’¤ì— ìžˆê³ , (%X/%X), %u ë°”ì´íЏ 건너 뜀\n" +msgid "first record is after %X/%X, at %X/%X, skipping over %u byte" +msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes" +msgstr[0] "첫 레코드가 %X/%X ë’¤ì— ìžˆê³ , (%X/%X), %u ë°”ì´íЏ 건너 뜀" -#: pg_waldump.c:1175 +#: pg_waldump.c:1312 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "%X/%X 위치ì—서 WAL 레코드 오류: %s" -#: pg_waldump.c:1185 +#: pg_waldump.c:1321 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." + +#: xlogreader.c:619 +#, c-format +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 오프셋: 위치 %X/%X, 기대값 %u, 실재값 %u" + +#: xlogreader.c:628 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "%X/%Xì—서 contrecord를 필요로 함" + +#: xlogreader.c:669 xlogreader.c:1134 +#, c-format +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 길ì´: 위치 %X/%X, 기대값 %u, 실재값 %u" + +#: xlogreader.c:758 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "%X/%X ìœ„ì¹˜ì— contrecord 플래그가 ì—†ìŒ" + +#: xlogreader.c:771 +#, c-format +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "ìž˜ëª»ëœ contrecord ê¸¸ì´ %u (기대값: %lld), 위치 %X/%X" + +#: xlogreader.c:1142 +#, c-format +msgid "invalid resource manager ID %u at %X/%X" +msgstr "ìž˜ëª»ëœ ìžì› 관리 ID %u, 위치: %X/%X" + +#: xlogreader.c:1155 xlogreader.c:1171 +#, c-format +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "ë ˆì½”ë“œì˜ ìž˜ëª»ëœ í”„ë¦¬ë§í¬ %X/%X, 해당 레코드 %X/%X" + +#: xlogreader.c:1209 +#, c-format +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "ìž˜ëª»ëœ ìžì›ê´€ë¦¬ìž ë°ì´í„° ì²´í¬ì„¬, 위치: %X/%X 레코드" + +#: xlogreader.c:1243 +#, c-format +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "%04X ë§¤ì§ ë²ˆí˜¸ê°€ 잘못ë¨, WAL ì¡°ê° íŒŒì¼ %s, LSN %X/%X, 오프셋 %u" + +#: xlogreader.c:1258 xlogreader.c:1300 +#, c-format +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "ìž˜ëª»ëœ ì •ë³´ 비트 %04X, WAL ì¡°ê° íŒŒì¼ %s, LSN %X/%X, 오프셋 %u" + +#: xlogreader.c:1274 +#, c-format +msgid "" +"WAL file is from different database system: WAL file database system " +"identifier is %llu, pg_control database system identifier is %llu" +msgstr "" +"WAL 파ì¼ì´ 다른 ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤. WAL 파ì¼ì˜ 시스템 ì‹ë³„ìžëŠ” %llu, " +"pg_control ì˜ ì‹ë³„ìžëŠ” %llu" + +#: xlogreader.c:1282 +#, c-format +msgid "" +"WAL file is from different database system: incorrect segment size in page " +"header" +msgstr "" +"WAL 파ì¼ì´ 다른 ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤: 페ì´ì§€ í—¤ë”ì— ì§€ì •ëœ ê°’ì´ ìž˜" +"ëª»ëœ ì¡°ê° í¬ê¸°ìž„" + +#: xlogreader.c:1288 +#, c-format +msgid "" +"WAL file is from different database system: incorrect XLOG_BLCKSZ in page " +"header" +msgstr "" +"WAL 파ì¼ì´ 다른 ë°ì´í„°ë² ì´ìФ ì‹œìŠ¤í…œì˜ ê²ƒìž…ë‹ˆë‹¤: 페ì´ì§€ í—¤ë”ì˜ XLOG_BLCKSZ ê°’" +"ì´ ë°”ë¥´ì§€ 않ìŒ" + +#: xlogreader.c:1320 +#, c-format +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "ìž˜ëª»ëœ íŽ˜ì´ì§€ 주소 %X/%X, WAL ì¡°ê° íŒŒì¼ %s, LSN %X/%X, 오프셋 %u" + +#: xlogreader.c:1346 +#, c-format +msgid "" +"out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, " +"offset %u" +msgstr "" +"타임ë¼ì¸ 범위 벗어남 %u (ì´ì „ 번호 %u), WAL ì¡°ê° íŒŒì¼ %s, LSN %X/%X, 오프셋 " +"%u" + +#: xlogreader.c:1749 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "%u block_id는 범위를 벗어남, 위치 %X/%X" + +#: xlogreader.c:1773 +#, c-format +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATA 지정했지만, %X/%X ì— ìžë£Œê°€ ì—†ìŒ" + +#: xlogreader.c:1780 +#, c-format +msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" +msgstr "BKPBLOCK_HAS_DATA 지정 않았지만, %u 길ì´ì˜ ìžë£Œê°€ 있ìŒ, 위치 %X/%X" + +#: xlogreader.c:1816 +#, c-format +msgid "" +"BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " +"%X/%X" +msgstr "" +"BKPIMAGE_HAS_HOLE ì„¤ì •ì´ ë˜ì–´ 있지만, 옵셋: %u, 길ì´: %u, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´: " +"%u, 대ìƒ: %X/%X" + +#: xlogreader.c:1832 +#, c-format +msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" +msgstr "" +"BKPIMAGE_HAS_HOLE ì„¤ì •ì´ ì•ˆë˜ì–´ 있지만, 옵셋: %u, 길ì´: %u, 대ìƒ: %X/%X" + +#: xlogreader.c:1846 +#, c-format +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "" +"BKPIMAGE_COMPRESSED ì„¤ì •ì´ ë˜ì–´ 있지만, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´: %u, 대ìƒ: %X/%X" + +#: xlogreader.c:1861 +#, c-format +msgid "" +"neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " +"length is %u at %X/%X" +msgstr "" +"BKPIMAGE_HAS_HOLE, BKPIMAGE_COMPRESSED 지정 안ë˜ì–´ 있으나, ë¸”ë¡ ì´ë¯¸ì§€ 길ì´" +"는 %u, 대ìƒ: %X/%X" + +#: xlogreader.c:1877 +#, c-format +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_REL ì„¤ì •ì´ ë˜ì–´ 있지만, %X/%X ì— ì´ì „ 릴레ì´ì…˜ ì—†ìŒ" + +#: xlogreader.c:1889 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "ìž˜ëª»ëœ block_id %u, 위치 %X/%X" + +#: xlogreader.c:1956 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 길ì´, 위치 %X/%X" + +#: xlogreader.c:1982 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "WAL 레코드ì—서 %d IDì˜ ë°±ì—… ë¸”ë¡ ìœ„ì¹˜ë¥¼ 바르게 ìž¡ì„ ìˆ˜ ì—†ìŒ" + +#: xlogreader.c:2066 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "%X/%X ìœ„ì¹˜ì— ì´ë¯¸ì§€ë¥¼ ë³µì›í•  수 ì—†ìŒ, 해당 %d 블ë¡ì´ 깨졌ìŒ" + +#: xlogreader.c:2073 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "ì´ë¯¸ì§€ ë³µì› ì‹¤íŒ¨, ìž˜ëª»ëœ ìƒíƒœì˜ ì••ì¶• ì´ë¯¸ì§€, 위치 %X/%X, ë¸”ë¡ %d" + +#: xlogreader.c:2100 xlogreader.c:2117 +#, c-format +msgid "" +"could not restore image at %X/%X compressed with %s not supported by build, " +"block %d" +msgstr "" +"%X/%X ì••ì¶• ìœ„ì¹˜ì— ì´ë¯¸ì§€ ë³µì›í•  수 ì—†ìŒ, %s ì••ì¶•ì„ ì§€ì›í•˜ì§€ 않ìŒ, 해당 블ë¡: " +"%d" + +#: xlogreader.c:2126 +#, c-format +msgid "" +"could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "" +"%X/%X ì••ì¶• ìœ„ì¹˜ì— ì´ë¯¸ì§€ ë³µì›í•  수 ì—†ìŒ, 알 수 ì—†ì€ ë°©ë²•, 해당 블ë¡: %d" + +#: xlogreader.c:2134 +#, c-format +msgid "could not decompress image at %X/%X, block %d" +msgstr "ì••ì¶• ì´ë¯¸ì§€ 풀기 실패, 위치 %X/%X, ë¸”ë¡ %d" + +#, c-format +#~ msgid "missing contrecord at %X/%X" +#~ msgstr "%X/%X ìœ„ì¹˜ì— contrecord ì—†ìŒ" + +#, c-format +#~ msgid "out of memory while trying to decode a record of length %u" +#~ msgstr "%u ê¸¸ì´ ë ˆì½”ë“œë¥¼ 디코드 ìž‘ì—…ì„ ìœ„í•œ 메모리가 부족함" + #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "ìžì œí•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보십시오.\n" +#~ msgid "record length %u at %X/%X too long" +#~ msgstr "너무 긴 길ì´(%u)ì˜ ë ˆì½”ë“œê°€ %X/%Xì— ìžˆìŒ" diff --git a/src/bin/pg_waldump/po/meson.build b/src/bin/pg_waldump/po/meson.build index c4188032d7104..dcad78703a7e5 100644 --- a/src/bin/pg_waldump/po/meson.build +++ b/src/bin/pg_waldump/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pg_waldump-' + pg_version_major.to_string())] diff --git a/src/bin/pg_waldump/po/ru.po b/src/bin/pg_waldump/po/ru.po index fba2910a7947a..bafe5a3233c66 100644 --- a/src/bin/pg_waldump/po/ru.po +++ b/src/bin/pg_waldump/po/ru.po @@ -1,21 +1,21 @@ # Russian message translation file for pg_waldump # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2017, 2018, 2019, 2020, 2022. +# Alexander Lakhin , 2017, 2018, 2019, 2020, 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: pg_waldump (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-29 10:17+0300\n" -"PO-Revision-Date: 2022-09-29 14:17+0300\n" +"POT-Creation-Date: 2024-09-02 09:29+0300\n" +"PO-Revision-Date: 2024-09-07 08:59+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../../../src/common/logging.c:276 #, c-format @@ -37,66 +37,146 @@ msgstr "подробноÑти: " msgid "hint: " msgstr "подÑказка: " -#: pg_waldump.c:160 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "нехватка памÑти\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 pg_waldump.c:199 +#: pg_waldump.c:532 #, c-format msgid "could not open file \"%s\": %m" msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" -#: pg_waldump.c:216 +#: ../../common/file_utils.c:76 #, c-format -msgid "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL " -"file \"%s\" header specifies %d byte" -msgid_plural "" -"WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL " -"file \"%s\" header specifies %d bytes" -msgstr[0] "" -"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 " -"ГБ, но в заголовке файла WAL \"%s\" указано значение: %d" -msgstr[1] "" -"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 " -"ГБ, но в заголовке файла WAL \"%s\" указано значение: %d" -msgstr[2] "" -"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 " -"ГБ, но в заголовке файла WAL \"%s\" указано значение: %d" +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñта Ñборка программы не поддерживает метод Ñинхронизации \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_waldump.c:1104 pg_waldump.c:1127 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" -#: pg_waldump.c:222 +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" + +#: pg_waldump.c:137 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "не удалоÑÑŒ Ñоздать каталог \"%s\": %m" + +#: pg_waldump.c:146 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "каталог \"%s\" ÑущеÑтвует, но он не пуÑÑ‚" + +#: pg_waldump.c:150 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "ошибка при обращении к каталогу \"%s\": %m" + +#: pg_waldump.c:256 +#, c-format +msgid "invalid WAL segment size in WAL file \"%s\" (%d byte)" +msgid_plural "invalid WAL segment size in WAL file \"%s\" (%d bytes)" +msgstr[0] "WAL-файл \"%s\" Ñодержит неверный размер Ñегмента WAL (%d Б)" +msgstr[1] "WAL-файл \"%s\" Ñодержит неверный размер Ñегмента WAL (%d Б)" +msgstr[2] "WAL-файл \"%s\" Ñодержит неверный размер Ñегмента WAL (%d Б)" + +#: pg_waldump.c:260 +#, c-format +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "" +"Размер Ñегмента WAL должен задаватьÑÑ Ñтепенью 2 в интервале от 1 МБ до 1 ГБ." + +#: pg_waldump.c:265 #, c-format msgid "could not read file \"%s\": %m" msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" -#: pg_waldump.c:225 +#: pg_waldump.c:268 #, c-format msgid "could not read file \"%s\": read %d of %d" msgstr "не удалоÑÑŒ прочитать файл \"%s\" (прочитано байт: %d из %d)" -#: pg_waldump.c:286 +#: pg_waldump.c:329 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "не удалоÑÑŒ найти файл WAL \"%s\"" -#: pg_waldump.c:288 +#: pg_waldump.c:331 #, c-format msgid "could not find any WAL file" msgstr "не удалоÑÑŒ найти ни одного файла WAL" -#: pg_waldump.c:329 +#: pg_waldump.c:372 #, c-format msgid "could not find file \"%s\": %m" msgstr "не удалоÑÑŒ найти файл \"%s\": %m" -#: pg_waldump.c:378 +#: pg_waldump.c:421 #, c-format -msgid "could not read from file %s, offset %d: %m" -msgstr "не удалоÑÑŒ прочитать из файла %s по Ñмещению %d: %m" +msgid "could not read from file \"%s\", offset %d: %m" +msgstr "не удалоÑÑŒ прочитать файл \"%s\" по Ñмещению %d: %m" -#: pg_waldump.c:382 +#: pg_waldump.c:425 #, c-format -msgid "could not read from file %s, offset %d: read %d of %d" +msgid "could not read from file \"%s\", offset %d: read %d of %d" msgstr "" -"не удалоÑÑŒ прочитать из файла %s по Ñмещению %d (прочитано байт: %d из %d)" +"не удалоÑÑŒ прочитать файл \"%s\" по Ñмещению %d (прочитано байт: %d из %d)" -#: pg_waldump.c:658 +#: pg_waldump.c:515 +#, c-format +msgid "%s" +msgstr "%s" + +#: pg_waldump.c:523 +#, c-format +msgid "invalid fork number: %u" +msgstr "неверный номер ÑлоÑ: %u" + +#: pg_waldump.c:535 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %m" + +#: pg_waldump.c:538 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "не удалоÑÑŒ закрыть файл \"%s\": %m" + +#: pg_waldump.c:758 #, c-format msgid "" "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" @@ -105,17 +185,17 @@ msgstr "" "%s декодирует и показывает журналы предзапиÑи PostgreSQL Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ¹ отладки.\n" "\n" -#: pg_waldump.c:660 +#: pg_waldump.c:760 #, c-format msgid "Usage:\n" msgstr "ИÑпользование:\n" -#: pg_waldump.c:661 +#: pg_waldump.c:761 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [ПÐРÐМЕТР]... [ÐÐЧÐЛЬÐЫЙ_СЕГМЕÐТ [КОÐЕЧÐЫЙ_СЕГМЕÐТ]]\n" -#: pg_waldump.c:662 +#: pg_waldump.c:762 #, c-format msgid "" "\n" @@ -124,14 +204,14 @@ msgstr "" "\n" "Параметры:\n" -#: pg_waldump.c:663 +#: pg_waldump.c:763 #, c-format msgid "" " -b, --bkp-details output detailed information about backup blocks\n" msgstr "" " -b, --bkp-details вывеÑти подробную информацию о копиÑÑ… Ñтраниц\n" -#: pg_waldump.c:664 +#: pg_waldump.c:764 #, c-format msgid "" " -B, --block=N with --relation, only show records that modify " @@ -141,20 +221,20 @@ msgstr "" " запиÑи, в которых менÑетÑÑ Ð±Ð»Ð¾Ðº N\n" # well-spelled: ПОЗЗÐП -#: pg_waldump.c:665 +#: pg_waldump.c:765 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" msgstr "" " -e, --end=ПОЗЗÐП прекратить чтение в заданной позиции запиÑи в WAL\n" -#: pg_waldump.c:666 +#: pg_waldump.c:766 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" msgstr "" " -f, --follow повторÑть попытки Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿Ð¾ доÑтижении конца WAL\n" # well-spelled: МÐГР -#: pg_waldump.c:667 +#: pg_waldump.c:767 #, c-format msgid "" " -F, --fork=FORK only show records that modify blocks in fork FORK;\n" @@ -164,34 +244,33 @@ msgstr "" "СЛОЕ\n" " Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ из ÑпиÑка: main, fsm, vm, init\n" -#: pg_waldump.c:669 +#: pg_waldump.c:769 #, c-format msgid " -n, --limit=N number of records to display\n" msgstr " -n, --limit=N чиÑло выводимых запиÑей\n" # skip-rule: space-before-period -#: pg_waldump.c:670 +#: pg_waldump.c:770 #, c-format msgid "" -" -p, --path=PATH directory in which to find log segment files or a\n" +" -p, --path=PATH directory in which to find WAL segment files or a\n" " directory with a ./pg_wal that contains such files\n" " (default: current directory, ./pg_wal, $PGDATA/" "pg_wal)\n" msgstr "" -" -p, --path=ПУТЬ каталог, где нужно иÑкать файлы Ñегментов журнала, " -"или\n" +" -p, --path=ПУТЬ каталог, где нужно иÑкать файлы Ñегментов WAL, или\n" " каталог Ñ Ð¿Ð¾Ð´ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼ ./pg_wal, Ñодержащим такие " "файлы\n" " (по умолчанию: текущий каталог,\n" " ./pg_wal, $PGDATA/pg_wal)\n" -#: pg_waldump.c:673 +#: pg_waldump.c:773 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet не выводить никаких Ñообщений, кроме ошибок\n" # well-spelled: МÐГР -#: pg_waldump.c:674 +#: pg_waldump.c:774 #, c-format msgid "" " -r, --rmgr=RMGR only show records generated by resource manager " @@ -203,7 +282,7 @@ msgstr "" " Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра ÑпиÑка доÑтупных менеджеров реÑурÑов\n" " укажите --rmgr=list\n" -#: pg_waldump.c:676 +#: pg_waldump.c:776 #, c-format msgid "" " -R, --relation=T/D/R only show records that modify blocks in relation T/" @@ -213,17 +292,17 @@ msgstr "" " в отношении T/D/R\n" # well-spelled: ПОЗЗÐП -#: pg_waldump.c:677 +#: pg_waldump.c:777 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" msgstr "" " -s, --start=ПОЗЗÐП начать чтение Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ позиции запиÑи в WAL\n" # well-spelled: ЛВР -#: pg_waldump.c:678 +#: pg_waldump.c:778 #, c-format msgid "" -" -t, --timeline=TLI timeline from which to read log records\n" +" -t, --timeline=TLI timeline from which to read WAL records\n" " (default: 1 or the value used in STARTSEG)\n" msgstr "" " -t, --timeline=ЛВР Ð»Ð¸Ð½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸, запиÑи которой будут прочитаны\n" @@ -231,25 +310,25 @@ msgstr "" "аргументом\n" " ÐÐЧÐЛЬÐЫЙ_СЕГМЕÐТ)\n" -#: pg_waldump.c:680 +#: pg_waldump.c:780 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: pg_waldump.c:681 +#: pg_waldump.c:781 #, c-format msgid " -w, --fullpage only show records with a full page write\n" msgstr "" " -w, --fullpage выводить только запиÑи, Ñодержащие полные Ñтраницы\n" -#: pg_waldump.c:682 +#: pg_waldump.c:782 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" msgstr "" " -x, --xid=XID выводить только запиÑи Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼\n" " идентификатором транзакции\n" -#: pg_waldump.c:683 +#: pg_waldump.c:783 #, c-format msgid "" " -z, --stats[=record] show statistics instead of records\n" @@ -258,12 +337,19 @@ msgstr "" " -z, --stats[=record] показывать ÑтатиÑтику вмеÑто запиÑей\n" " (также возможно получить ÑтатиÑтику по запиÑÑм)\n" -#: pg_waldump.c:685 +#: pg_waldump.c:785 +#, c-format +msgid " --save-fullpage=DIR save full page images to DIR\n" +msgstr "" +" --save-fullpage=ПУТЬ запиÑывать полные образы Ñтраниц в заданный " +"каталог\n" + +#: pg_waldump.c:786 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: pg_waldump.c:686 +#: pg_waldump.c:787 #, c-format msgid "" "\n" @@ -272,211 +358,195 @@ msgstr "" "\n" "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: pg_waldump.c:687 +#: pg_waldump.c:788 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" -#: pg_waldump.c:781 +#: pg_waldump.c:884 #, c-format msgid "no arguments specified" msgstr "аргументы не указаны" -#: pg_waldump.c:797 +#: pg_waldump.c:900 #, c-format msgid "invalid block number: \"%s\"" msgstr "неверный номер блока: \"%s\"" -#: pg_waldump.c:806 pg_waldump.c:904 +#: pg_waldump.c:909 pg_waldump.c:1007 #, c-format msgid "invalid WAL location: \"%s\"" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² WAL: \"%s\"" -#: pg_waldump.c:819 +#: pg_waldump.c:922 #, c-format msgid "invalid fork name: \"%s\"" msgstr "неверное Ð¸Ð¼Ñ ÑлоÑ: \"%s\"" -#: pg_waldump.c:827 +#: pg_waldump.c:930 pg_waldump.c:1033 #, c-format msgid "invalid value \"%s\" for option %s" msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" -#: pg_waldump.c:858 +#: pg_waldump.c:961 #, c-format msgid "custom resource manager \"%s\" does not exist" msgstr "пользовательÑкий менеджер реÑурÑов \"%s\" не ÑущеÑтвует" -#: pg_waldump.c:879 +#: pg_waldump.c:982 #, c-format msgid "resource manager \"%s\" does not exist" msgstr "менеджер реÑурÑов \"%s\" не ÑущеÑтвует" -#: pg_waldump.c:894 +#: pg_waldump.c:997 #, c-format msgid "invalid relation specification: \"%s\"" msgstr "неверное указание отношениÑ: \"%s\"" -#: pg_waldump.c:895 +#: pg_waldump.c:998 #, c-format msgid "Expecting \"tablespace OID/database OID/relation filenode\"." msgstr "" "ОжидаетÑÑ \"OID табл. проÑтранÑтва/OID базы данных/файловый узел отношениÑ\"." -#: pg_waldump.c:914 +#: pg_waldump.c:1040 #, c-format -msgid "invalid timeline specification: \"%s\"" -msgstr "неверное указание линии времени: \"%s\"" +msgid "%s must be in range %u..%u" +msgstr "значение %s должно быть в диапазоне %u..%u" -#: pg_waldump.c:924 +#: pg_waldump.c:1055 #, c-format msgid "invalid transaction ID specification: \"%s\"" msgstr "неверное указание ID транзакции: \"%s\"" -#: pg_waldump.c:939 +#: pg_waldump.c:1070 #, c-format msgid "unrecognized value for option %s: %s" msgstr "нераÑпознанное значение параметра %s: %s" -#: pg_waldump.c:953 +#: pg_waldump.c:1087 #, c-format msgid "option %s requires option %s to be specified" msgstr "параметр %s требует ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" -#: pg_waldump.c:960 +#: pg_waldump.c:1094 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")" -#: pg_waldump.c:970 pg_waldump.c:990 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" - -#: pg_waldump.c:996 pg_waldump.c:1026 +#: pg_waldump.c:1133 pg_waldump.c:1163 #, c-format msgid "could not open file \"%s\"" msgstr "не удалоÑÑŒ открыть файл \"%s\"" -#: pg_waldump.c:1006 +#: pg_waldump.c:1143 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² WAL %X/%X находитÑÑ Ð½Ðµ в файле \"%s\"" -#: pg_waldump.c:1033 +#: pg_waldump.c:1170 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "КОÐЕЧÐЫЙ_СЕГМЕÐТ %s меньше, чем ÐÐЧÐЛЬÐЫЙ_СЕГМЕÐТ %s" -#: pg_waldump.c:1048 +#: pg_waldump.c:1185 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² WAL %X/%X находитÑÑ Ð½Ðµ в файле \"%s\"" -#: pg_waldump.c:1060 +#: pg_waldump.c:1197 #, c-format msgid "no start WAL location given" msgstr "Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² WAL не задана" -#: pg_waldump.c:1074 +#: pg_waldump.c:1211 #, c-format msgid "out of memory while allocating a WAL reading processor" msgstr "не удалоÑÑŒ выделить памÑть Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ WAL" -#: pg_waldump.c:1080 +#: pg_waldump.c:1217 #, c-format msgid "could not find a valid record after %X/%X" -msgstr "не удалоÑÑŒ найти дейÑтвительную запиÑÑŒ поÑле позиции %X/%X" +msgstr "не удалоÑÑŒ найти корректную запиÑÑŒ поÑле %X/%X" -#: pg_waldump.c:1090 +#: pg_waldump.c:1227 #, c-format -msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" -msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" +msgid "first record is after %X/%X, at %X/%X, skipping over %u byte" +msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes" msgstr[0] "" -"Ð¿ÐµÑ€Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ обнаружена поÑле %X/%X, в позиции %X/%X, пропуÑкаетÑÑ %u Б\n" +"Ð¿ÐµÑ€Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ обнаружена поÑле %X/%X, в позиции %X/%X, пропуÑкаетÑÑ %u Б" msgstr[1] "" -"Ð¿ÐµÑ€Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ обнаружена поÑле %X/%X, в позиции %X/%X, пропуÑкаетÑÑ %u Б\n" +"Ð¿ÐµÑ€Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ обнаружена поÑле %X/%X, в позиции %X/%X, пропуÑкаетÑÑ %u Б" msgstr[2] "" -"Ð¿ÐµÑ€Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ обнаружена поÑле %X/%X, в позиции %X/%X, пропуÑкаетÑÑ %u Б\n" +"Ð¿ÐµÑ€Ð²Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ обнаружена поÑле %X/%X, в позиции %X/%X, пропуÑкаетÑÑ %u Б" -#: pg_waldump.c:1171 +#: pg_waldump.c:1312 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "ошибка в запиÑи WAL в позиции %X/%X: %s" -#: pg_waldump.c:1180 +#: pg_waldump.c:1321 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." -#: xlogreader.c:625 +#: xlogreader.c:619 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "неверное Ñмещение запиÑи: %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "" +"неверное Ñмещение запиÑи в позиции %X/%X: ожидалоÑÑŒ минимум %u, получено %u" -#: xlogreader.c:633 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" -msgstr "по Ñмещению %X/%X запрошено продолжение запиÑи" - -#: xlogreader.c:674 xlogreader.c:1121 -#, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° запиÑи по Ñмещению %X/%X: ожидалоÑÑŒ %u, получено %u" +msgstr "в позиции %X/%X запрошено продолжение запиÑи" -#: xlogreader.c:703 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "не удалоÑÑŒ выделить памÑть Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи длины %u" - -#: xlogreader.c:725 -#, c-format -msgid "record length %u at %X/%X too long" -msgstr "длина запиÑи %u по Ñмещению %X/%X Ñлишком велика" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "" +"Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° запиÑи в позиции %X/%X: ожидалоÑÑŒ минимум %u, получено %u" -#: xlogreader.c:774 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "нет флага contrecord в позиции %X/%X" -#: xlogreader.c:787 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° contrecord: %u (ожидалаÑÑŒ %lld) в позиции %X/%X" -#: xlogreader.c:922 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "нет запиÑи contrecord в %X/%X" - -#: xlogreader.c:1129 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" -msgstr "неверный ID менеджера реÑурÑов %u по Ñмещению %X/%X" +msgstr "неверный ID менеджера реÑурÑов %u в позиции %X/%X" -#: xlogreader.c:1142 xlogreader.c:1158 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" -msgstr "запиÑÑŒ Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ ÑÑылкой назад %X/%X по Ñмещению %X/%X" +msgstr "запиÑÑŒ Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ ÑÑылкой назад %X/%X в позиции %X/%X" -#: xlogreader.c:1194 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" -"Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма данных менеджера реÑурÑов в запиÑи по " -"Ñмещению %X/%X" +"Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÑŒÐ½Ð°Ñ Ñумма данных менеджера реÑурÑов в запиÑи в позиции " +"%X/%X" -#: xlogreader.c:1231 +#: xlogreader.c:1243 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "неверное магичеÑкое чиÑло %04X в Ñегменте журнала %s, Ñмещение %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "" +"неверное магичеÑкое чиÑло %04X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u" -#: xlogreader.c:1245 xlogreader.c:1286 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "неверные информационные биты %04X в Ñегменте журнала %s, Ñмещение %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "" +"неверные информационные биты %04X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u" -#: xlogreader.c:1260 +#: xlogreader.c:1274 #, c-format msgid "" "WAL file is from different database system: WAL file database system " @@ -485,7 +555,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: в нём указан идентификатор ÑиÑтемы БД " "%llu, а идентификатор ÑиÑтемы pg_control: %llu" -#: xlogreader.c:1268 +#: xlogreader.c:1282 #, c-format msgid "" "WAL file is from different database system: incorrect segment size in page " @@ -494,7 +564,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный размер Ñегмента в заголовке " "Ñтраницы" -#: xlogreader.c:1274 +#: xlogreader.c:1288 #, c-format msgid "" "WAL file is from different database system: incorrect XLOG_BLCKSZ in page " @@ -503,35 +573,37 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке " "Ñтраницы" -#: xlogreader.c:1305 +#: xlogreader.c:1320 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "неожиданный pageaddr %X/%X в Ñегменте журнала %s, Ñмещение %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "неожиданный pageaddr %X/%X в Ñегменте WAL %s, LSN %X/%X, Ñмещение %u" -#: xlogreader.c:1330 +#: xlogreader.c:1346 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" +msgid "" +"out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, " +"offset %u" msgstr "" -"нарушение поÑледовательноÑти ID линии времени %u (поÑле %u) в Ñегменте " -"журнала %s, Ñмещение %u" +"нарушение поÑледовательноÑти ID линии времени %u (поÑле %u) в Ñегменте WAL " +"%s, LSN %X/%X, Ñмещение %u" -#: xlogreader.c:1735 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порÑдку в позиции %X/%X" -#: xlogreader.c:1759 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA уÑтановлен, но данных в позиции %X/%X нет" -#: xlogreader.c:1766 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "" "BKPBLOCK_HAS_DATA не уÑтановлен, но длина данных равна %u в позиции %X/%X" -#: xlogreader.c:1802 +#: xlogreader.c:1816 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -540,21 +612,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE уÑтановлен, но Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑка заданы Ñмещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: xlogreader.c:1818 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "" "BKPIMAGE_HAS_HOLE не уÑтановлен, но Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑка заданы Ñмещение %u и длина " "%u в позиции %X/%X" -#: xlogreader.c:1832 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "" "BKPIMAGE_COMPRESSED уÑтановлен, но длина образа блока равна %u в позиции %X/" "%X" -#: xlogreader.c:1847 +#: xlogreader.c:1861 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " @@ -563,41 +635,41 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не уÑтановлены, но длина образа " "блока равна %u в позиции %X/%X" -#: xlogreader.c:1863 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" "BKPBLOCK_SAME_REL уÑтановлен, но предыдущее значение не задано в позиции %X/" "%X" -#: xlogreader.c:1875 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: xlogreader.c:1942 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "запиÑÑŒ Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ длиной в позиции %X/%X" -#: xlogreader.c:1967 +#: xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "не удалоÑÑŒ найти копию блока Ñ ID %d в запиÑи журнала WAL" -#: xlogreader.c:2051 +#: xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "" "не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ неверным блоком %d" -#: xlogreader.c:2058 +#: xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" msgstr "" "не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¼ ÑоÑтоÑнием, блок %d" -#: xlogreader.c:2085 xlogreader.c:2102 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format msgid "" "could not restore image at %X/%X compressed with %s not supported by build, " @@ -606,7 +678,7 @@ msgstr "" "не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X, Ñжатый методом %s, который не " "поддерживаетÑÑ Ñтой Ñборкой, блок %d" -#: xlogreader.c:2111 +#: xlogreader.c:2126 #, c-format msgid "" "could not restore image at %X/%X compressed with unknown method, block %d" @@ -614,11 +686,31 @@ msgstr "" "не удалоÑÑŒ воÑÑтановить образ в позиции %X/%X, Ñжатый неизвеÑтным методом, " "блок %d" -#: xlogreader.c:2119 +#: xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "не удалоÑÑŒ развернуть образ в позиции %X/%X, блок %d" +#, c-format +#~ msgid "out of memory while trying to decode a record of length %u" +#~ msgstr "не удалоÑÑŒ выделить памÑть Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи длины %u" + +#, c-format +#~ msgid "record length %u at %X/%X too long" +#~ msgstr "длина запиÑи %u в позиции %X/%X Ñлишком велика" + +#, c-format +#~ msgid "invalid timeline specification: \"%s\"" +#~ msgstr "неверное указание линии времени: \"%s\"" + +#, c-format +#~ msgid "invalid record offset at %X/%X" +#~ msgstr "неверное Ñмещение запиÑи: %X/%X" + +#, c-format +#~ msgid "missing contrecord at %X/%X" +#~ msgstr "нет запиÑи contrecord в %X/%X" + #~ msgid "" #~ "\n" #~ "Report bugs to .\n" @@ -650,8 +742,5 @@ msgstr "не удалоÑÑŒ развернуть образ в позиции %X #~ msgid "not enough data in file \"%s\"" #~ msgstr "недоÑтаточно данных в файле \"%s\"" -#~ msgid "out of memory" -#~ msgstr "нехватка памÑти" - #~ msgid "path \"%s\" could not be opened: %s" #~ msgstr "не удалоÑÑŒ открыть путь \"%s\": %s" diff --git a/src/bin/pg_waldump/po/sv.po b/src/bin/pg_waldump/po/sv.po index c122bbfb62d0c..24173636e1a90 100644 --- a/src/bin/pg_waldump/po/sv.po +++ b/src/bin/pg_waldump/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pg_waldump # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-29 11:47+0000\n" -"PO-Revision-Date: 2022-09-29 21:43+0200\n" +"POT-Creation-Date: 2024-07-12 14:19+0000\n" +"PO-Revision-Date: 2024-07-12 19:11+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -37,71 +37,160 @@ msgstr "detalj: " msgid "hint: " msgstr "tips: " -#: pg_waldump.c:160 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "slut pÃ¥ minne\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kan inte duplicera null-pekare (internt fel)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 pg_waldump.c:199 +#: pg_waldump.c:532 #, c-format msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" -#: pg_waldump.c:216 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "detta bygge stöder inte synkmetod \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_waldump.c:1104 pg_waldump.c:1127 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "kunde inte öppna katalog \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "kunde inte läsa katalog \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "kunde inte fsync:a fil \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" + +#: pg_waldump.c:137 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "kunde inte skapa katalog \"%s\": %m" + +#: pg_waldump.c:146 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "katalogen \"%s\" existerar men är inte tom" + +#: pg_waldump.c:150 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "kunde inte komma Ã¥t katalog \"%s\": %m" + +#: pg_waldump.c:256 +#, c-format +msgid "invalid WAL segment size in WAL file \"%s\" (%d byte)" +msgid_plural "invalid WAL segment size in WAL file \"%s\" (%d bytes)" +msgstr[0] "ogiltigt WAL-segmentstorlek i WAL-fil \"%s\" (%d byte)" +msgstr[1] "ogiltigt WAL-segmentstorlek i WAL-fil \"%s\" (%d byte)" + +#: pg_waldump.c:260 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" -msgstr[0] "WAL-segmentstorlek mÃ¥ste vara en tvÃ¥potens mellan 1MB och 1GB men headern i WAL-filen \"%s\" anger %d byte" -msgstr[1] "WAL-segmentstorlek mÃ¥ste vara en tvÃ¥potens mellan 1MB och 1GB men headern i WAL-filen \"%s\" anger %d byte" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "WAL-segmentstorleken mÃ¥ste vara en tvÃ¥potens mellan 1 MB och 1 GB." -#: pg_waldump.c:222 +#: pg_waldump.c:265 #, c-format msgid "could not read file \"%s\": %m" msgstr "kunde inte läsa fil \"%s\": %m" -#: pg_waldump.c:225 +#: pg_waldump.c:268 #, c-format msgid "could not read file \"%s\": read %d of %d" msgstr "kunde inte läsa fil \"%s\": läste %d av %d" -#: pg_waldump.c:286 +#: pg_waldump.c:329 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "kunde inte lokalisera WAL-fil \"%s\"" -#: pg_waldump.c:288 +#: pg_waldump.c:331 #, c-format msgid "could not find any WAL file" msgstr "kunde inte hitta nÃ¥gra WAL-filer" -#: pg_waldump.c:329 +#: pg_waldump.c:372 #, c-format msgid "could not find file \"%s\": %m" msgstr "kunde inte hitta filen \"%s\": %m" -#: pg_waldump.c:378 +#: pg_waldump.c:421 +#, c-format +msgid "could not read from file \"%s\", offset %d: %m" +msgstr "Kunde inte läsa frÃ¥n fil \"%s\", offset %d: %m" + +#: pg_waldump.c:425 +#, c-format +msgid "could not read from file \"%s\", offset %d: read %d of %d" +msgstr "kunde inte läsa frÃ¥n fil \"%s\", offset %d, läste %d av %d" + +#: pg_waldump.c:515 +#, c-format +msgid "%s" +msgstr "%s" + +#: pg_waldump.c:523 +#, c-format +msgid "invalid fork number: %u" +msgstr "ogiltigt fork-nummer: %u" + +#: pg_waldump.c:535 #, c-format -msgid "could not read from file %s, offset %d: %m" -msgstr "Kunde inte läsa frÃ¥n fil %s pÃ¥ offset %d: %m" +msgid "could not write file \"%s\": %m" +msgstr "kunde inte skriva fil \"%s\": %m" -#: pg_waldump.c:382 +#: pg_waldump.c:538 #, c-format -msgid "could not read from file %s, offset %d: read %d of %d" -msgstr "kunde inte läsa frÃ¥n fil %s, offset %d, läste %d av %d" +msgid "could not close file \"%s\": %m" +msgstr "kunde inte stänga fil \"%s\": %m" -#: pg_waldump.c:658 +#: pg_waldump.c:758 #, c-format msgid "" "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" "\n" msgstr "%s avkodar och visar PostgreSQLs write-ahead-logg för debuggning.\n" -#: pg_waldump.c:660 +#: pg_waldump.c:760 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: pg_waldump.c:661 +#: pg_waldump.c:761 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [FLAGGA]... [STARTSEG [SLUTSEG]]\n" -#: pg_waldump.c:662 +#: pg_waldump.c:762 #, c-format msgid "" "\n" @@ -110,29 +199,29 @@ msgstr "" "\n" "Flaggor:\n" -#: pg_waldump.c:663 +#: pg_waldump.c:763 #, c-format msgid " -b, --bkp-details output detailed information about backup blocks\n" msgstr " -b, --bkp-details skriv detaljerad information om backupblock\n" -#: pg_waldump.c:664 +#: pg_waldump.c:764 #, c-format msgid " -B, --block=N with --relation, only show records that modify block N\n" msgstr "" " -B, --block=N tillsammans med --relation, visa bara poster som\n" " modifierar block N\n" -#: pg_waldump.c:665 +#: pg_waldump.c:765 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" msgstr " -e, --end=RECPTR stoppa läsning vid WAL-position RECPTR\n" -#: pg_waldump.c:666 +#: pg_waldump.c:766 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" msgstr " -f, --follow fortsätt försök efter att ha nÃ¥tt slutet av WAL\n" -#: pg_waldump.c:667 +#: pg_waldump.c:767 #, c-format msgid "" " -F, --fork=FORK only show records that modify blocks in fork FORK;\n" @@ -141,28 +230,28 @@ msgstr "" " -F, --fork=GREN visa bara poster som modifierar block i grenen GREN\n" " gilriga namn är main, fsm, vm och init\n" -#: pg_waldump.c:669 +#: pg_waldump.c:769 #, c-format msgid " -n, --limit=N number of records to display\n" msgstr " -n, --limit=N antal poster att visa\n" -#: pg_waldump.c:670 +#: pg_waldump.c:770 #, c-format msgid "" -" -p, --path=PATH directory in which to find log segment files or a\n" +" -p, --path=PATH directory in which to find WAL segment files or a\n" " directory with a ./pg_wal that contains such files\n" " (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n" msgstr "" -" -p, --path=SÖKVÄG katalog där man hittar loggsegmentfiler eller en\n" +" -p, --path=SÖKVÄG katalog där man hittar WAL-segmentfiler eller en\n" " katalog med en ./pg_wal som innehÃ¥ller sÃ¥dana filer\n" " (standard: aktuell katalog, ./pg_wal, $PGDATA/pg_wal)\n" -#: pg_waldump.c:673 +#: pg_waldump.c:773 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet skriv inte ut nÃ¥gra meddelanden förutom fel\n" -#: pg_waldump.c:674 +#: pg_waldump.c:774 #, c-format msgid "" " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" @@ -171,43 +260,43 @@ msgstr "" " -r, --rmgr=RMGR visa bara poster skapade av resurshanteraren RMGR;\n" " använd --rmgr=list för att lista giltiga resurshanterarnamn\n" -#: pg_waldump.c:676 +#: pg_waldump.c:776 #, c-format msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n" msgstr "" " -R, --relation=T/D/R visa bara poster som modifierar block i\n" " relationen T/D/R\n" -#: pg_waldump.c:677 +#: pg_waldump.c:777 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" msgstr " -s, --start=RECPTR börja läsning vid WAL-position RECPTR\n" -#: pg_waldump.c:678 +#: pg_waldump.c:778 #, c-format msgid "" -" -t, --timeline=TLI timeline from which to read log records\n" +" -t, --timeline=TLI timeline from which to read WAL records\n" " (default: 1 or the value used in STARTSEG)\n" msgstr "" -" -t, --timeline=TLI tidslinje frÃ¥n vilken vi läser loggposter\n" +" -t, --timeline=TLI tidslinje frÃ¥n vilken vi läser WAL-poster\n" " (standard: 1 eller värdet som används i STARTSEG)\n" -#: pg_waldump.c:680 +#: pg_waldump.c:780 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: pg_waldump.c:681 +#: pg_waldump.c:781 #, c-format msgid " -w, --fullpage only show records with a full page write\n" msgstr " -w, --fullpage visa bara poster som skrivit hela sidor\n" -#: pg_waldump.c:682 +#: pg_waldump.c:782 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" msgstr " -x, --xid=XID visa baras poster med transaktions-ID XID\n" -#: pg_waldump.c:683 +#: pg_waldump.c:783 #, c-format msgid "" " -z, --stats[=record] show statistics instead of records\n" @@ -216,12 +305,17 @@ msgstr "" " -z, --stats[=post] visa statistik istället för poster\n" " (alternativt, visa statistik per post)\n" -#: pg_waldump.c:685 +#: pg_waldump.c:785 +#, c-format +msgid " --save-fullpage=DIR save full page images to DIR\n" +msgstr " --save-fullpage=KAT spara kopia av hela sidor till KAT\n" + +#: pg_waldump.c:786 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa den här hjälpen, avsluta sedan\n" -#: pg_waldump.c:686 +#: pg_waldump.c:787 #, c-format msgid "" "\n" @@ -230,305 +324,285 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: pg_waldump.c:687 +#: pg_waldump.c:788 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: pg_waldump.c:781 +#: pg_waldump.c:884 #, c-format msgid "no arguments specified" msgstr "inga argument angivna" -#: pg_waldump.c:797 +#: pg_waldump.c:900 #, c-format msgid "invalid block number: \"%s\"" msgstr "ogiltigt portnummer \"%s\"" -#: pg_waldump.c:806 pg_waldump.c:904 +#: pg_waldump.c:909 pg_waldump.c:1007 #, c-format msgid "invalid WAL location: \"%s\"" msgstr "ogiltig WAL-position: \"%s\"" -#: pg_waldump.c:819 +#: pg_waldump.c:922 #, c-format msgid "invalid fork name: \"%s\"" msgstr "ogiltigt fork-namn: \"%s\"" -#: pg_waldump.c:827 +#: pg_waldump.c:930 pg_waldump.c:1033 #, c-format msgid "invalid value \"%s\" for option %s" msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" -#: pg_waldump.c:858 +#: pg_waldump.c:961 #, c-format msgid "custom resource manager \"%s\" does not exist" msgstr "egendefinierad resurshanterare \"%s\" finns inte" -#: pg_waldump.c:879 +#: pg_waldump.c:982 #, c-format msgid "resource manager \"%s\" does not exist" msgstr "resurshanterare \"%s\" finns inte" -#: pg_waldump.c:894 +#: pg_waldump.c:997 #, c-format msgid "invalid relation specification: \"%s\"" msgstr "ogiltig inställning av relation: \"%s\"" -#: pg_waldump.c:895 +#: pg_waldump.c:998 #, c-format msgid "Expecting \"tablespace OID/database OID/relation filenode\"." msgstr "Skall vara en av \"OID för tabellutrymme/OID för databas/relations filnod\"." -#: pg_waldump.c:914 +#: pg_waldump.c:1040 #, c-format -msgid "invalid timeline specification: \"%s\"" -msgstr "ogiltig inställning av tidslinje: %s" +msgid "%s must be in range %u..%u" +msgstr "%s mÃ¥ste vara i intervallet %u..%u" -#: pg_waldump.c:924 +#: pg_waldump.c:1055 #, c-format msgid "invalid transaction ID specification: \"%s\"" msgstr "ogiltig inställning av transaktions-ID: %s" -#: pg_waldump.c:939 +#: pg_waldump.c:1070 #, c-format msgid "unrecognized value for option %s: %s" msgstr "okänt värde för flaggan %s: %s" -#: pg_waldump.c:953 +#: pg_waldump.c:1087 #, c-format msgid "option %s requires option %s to be specified" msgstr "flaggan %s kräver att flaggan %s ocksÃ¥ anges" -#: pg_waldump.c:960 +#: pg_waldump.c:1094 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")" -#: pg_waldump.c:970 pg_waldump.c:990 -#, c-format -msgid "could not open directory \"%s\": %m" -msgstr "kunde inte öppna katalog \"%s\": %m" - -#: pg_waldump.c:996 pg_waldump.c:1026 +#: pg_waldump.c:1133 pg_waldump.c:1163 #, c-format msgid "could not open file \"%s\"" msgstr "kunde inte öppna filen \"%s\"" -#: pg_waldump.c:1006 +#: pg_waldump.c:1143 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "start-WAL-position %X/%X är inte i filen \"%s\"" -#: pg_waldump.c:1033 +#: pg_waldump.c:1170 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "SLUTSEG %s är före STARTSEG %s" -#: pg_waldump.c:1048 +#: pg_waldump.c:1185 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "slut-WAL-position %X/%X är inte i filen \"%s\"" -#: pg_waldump.c:1060 +#: pg_waldump.c:1197 #, c-format msgid "no start WAL location given" msgstr "ingen start-WAL-position angiven" -#: pg_waldump.c:1074 +#: pg_waldump.c:1211 #, c-format msgid "out of memory while allocating a WAL reading processor" msgstr "slut pÃ¥ minne vid allokering av en WAL-läs-processor" -#: pg_waldump.c:1080 +#: pg_waldump.c:1217 #, c-format msgid "could not find a valid record after %X/%X" msgstr "kunde inte hitta en giltig post efter %X/%X" -#: pg_waldump.c:1090 +#: pg_waldump.c:1227 #, c-format -msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" -msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" -msgstr[0] "första posten efter %X/%X, vid %X/%X, hoppar över %u byte\n" -msgstr[1] "första posten efter %X/%X, vid %X/%X, hoppar över %u byte\n" +msgid "first record is after %X/%X, at %X/%X, skipping over %u byte" +msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes" +msgstr[0] "första posten är efter %X/%X, vid %X/%X, hoppar över %u byte" +msgstr[1] "första posten är efter %X/%X, vid %X/%X, hoppar över %u byte" -#: pg_waldump.c:1171 +#: pg_waldump.c:1312 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "fel i WAL-post vid %X/%X: %s" -#: pg_waldump.c:1180 +#: pg_waldump.c:1321 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: xlogreader.c:625 +#: xlogreader.c:619 #, c-format -msgid "invalid record offset at %X/%X" -msgstr "ogiltig postoffset vid %X/%X" +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "ogiltig postoffset vid %X/%X: förväntade minst %u, fick %u" -#: xlogreader.c:633 +#: xlogreader.c:628 #, c-format msgid "contrecord is requested by %X/%X" msgstr "contrecord är begärd vid %X/%X" -#: xlogreader.c:674 xlogreader.c:1121 -#, c-format -msgid "invalid record length at %X/%X: wanted %u, got %u" -msgstr "ogiltig postlängd vid %X/%X: förväntade %u, fick %u" - -#: xlogreader.c:703 -#, c-format -msgid "out of memory while trying to decode a record of length %u" -msgstr "slut pÃ¥ minne vid avkodning av post med längden %u" - -#: xlogreader.c:725 +#: xlogreader.c:669 xlogreader.c:1134 #, c-format -msgid "record length %u at %X/%X too long" -msgstr "postlängd %u vid %X/%X är för lÃ¥ng" +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "ogiltig postlängd vid %X/%X: förväntade minst %u, fick %u" -#: xlogreader.c:774 +#: xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "det finns ingen contrecord-flagga vid %X/%X" -#: xlogreader.c:787 +#: xlogreader.c:771 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "ogiltig contrecord-längd %u (förväntade %lld) vid %X/%X" -#: xlogreader.c:922 -#, c-format -msgid "missing contrecord at %X/%X" -msgstr "det saknas en contrecord vid %X/%X" - -#: xlogreader.c:1129 +#: xlogreader.c:1142 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ogiltigt resurshanterar-ID %u vid %X/%X" -#: xlogreader.c:1142 xlogreader.c:1158 +#: xlogreader.c:1155 xlogreader.c:1171 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "post med inkorrekt prev-link %X/%X vid %X/%X" -#: xlogreader.c:1194 +#: xlogreader.c:1209 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "felaktig resurshanterardatakontrollsumma i post vid %X/%X" -#: xlogreader.c:1231 +#: xlogreader.c:1243 #, c-format -msgid "invalid magic number %04X in log segment %s, offset %u" -msgstr "felaktigt magiskt nummer %04X i loggsegment %s, offset %u" +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "felaktigt magiskt nummer %04X i WAL-segment %s, LSN %X/%X, offset %u" -#: xlogreader.c:1245 xlogreader.c:1286 +#: xlogreader.c:1258 xlogreader.c:1300 #, c-format -msgid "invalid info bits %04X in log segment %s, offset %u" -msgstr "ogiltiga infobitar %04X i loggsegment %s, offset %u" +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "ogiltiga infobitar %04X i WAL-segment %s, LSN %X/%X, offset %u" -#: xlogreader.c:1260 +#: xlogreader.c:1274 #, c-format msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" msgstr "WAL-fil är frÃ¥n ett annat databassystem: WAL-filens databassystemidentifierare är %llu, pg_control databassystemidentifierare är %llu" -#: xlogreader.c:1268 +#: xlogreader.c:1282 #, c-format msgid "WAL file is from different database system: incorrect segment size in page header" -msgstr "WAL-fil är frÃ¥n ett annat databassystem: inkorrekt segmentstorlek i sidhuvuid" +msgstr "WAL-fil är frÃ¥n ett annat databassystem: inkorrekt segmentstorlek i sidhuvud" -#: xlogreader.c:1274 +#: xlogreader.c:1288 #, c-format msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" -msgstr "WAL-fil är frÃ¥n ett annat databassystem: inkorrekt XLOG_BLCKSZ i sidhuvuid" +msgstr "WAL-fil är frÃ¥n ett annat databassystem: inkorrekt XLOG_BLCKSZ i sidhuvud" -#: xlogreader.c:1305 +#: xlogreader.c:1320 #, c-format -msgid "unexpected pageaddr %X/%X in log segment %s, offset %u" -msgstr "oväntad sidadress %X/%X i loggsegment %s, offset %u" +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "oväntad sidadress %X/%X i WAL-segment %s, LSN %X/%X, offset %u" # FIXME -#: xlogreader.c:1330 +#: xlogreader.c:1346 #, c-format -msgid "out-of-sequence timeline ID %u (after %u) in log segment %s, offset %u" -msgstr "\"ej i sekvens\"-fel pÃ¥ tidslinje-ID %u (efter %u) i loggsegment %s, offset %u" +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "\"ej i sekvens\"-fel pÃ¥ tidslinje-ID %u (efter %u) i WAL-segment %s, LSN %X/%X, offset %u" -#: xlogreader.c:1735 +#: xlogreader.c:1749 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "\"ej i sekvens\"-block_id %u vid %X/%X" -#: xlogreader.c:1759 +#: xlogreader.c:1773 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA är satt men ingen data inkluderad vid %X/%X" -#: xlogreader.c:1766 +#: xlogreader.c:1780 #, c-format msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" msgstr "BKPBLOCK_HAS_DATA är ej satt men datalängden är %u vid %X/%X" -#: xlogreader.c:1802 +#: xlogreader.c:1816 #, c-format msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" -msgstr "BKPIMAGE_HAS_HOLE är satt men hÃ¥loffset %u längd %u block-image-längd %u vid %X/%X" +msgstr "BKPIMAGE_HAS_HOLE är satt men hÃ¥loffset %u längd %u blockavbildlängd %u vid %X/%X" -#: xlogreader.c:1818 +#: xlogreader.c:1832 #, c-format msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" msgstr "BKPIMAGE_HAS_HOLE är inte satt men hÃ¥loffset %u längd %u vid %X/%X" -#: xlogreader.c:1832 +#: xlogreader.c:1846 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" -msgstr "BKPIMAGE_COMPRESSED är satt men block-image-längd %u vid %X/%X" +msgstr "BKPIMAGE_COMPRESSED är satt men blockavbildlängd %u vid %X/%X" -#: xlogreader.c:1847 +#: xlogreader.c:1861 #, c-format msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" -msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED är satt men block-image-längd är %u vid %X/%X" +msgstr "varken BKPIMAGE_HAS_HOLE eller BKPIMAGE_COMPRESSED är satt men blockavbildlängd är %u vid %X/%X" -#: xlogreader.c:1863 +#: xlogreader.c:1877 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "BKPBLOCK_SAME_REL är satt men ingen tidigare rel vid %X/%X" -#: xlogreader.c:1875 +#: xlogreader.c:1889 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ogiltig block_id %u vid %X/%X" -#: xlogreader.c:1942 +#: xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "post med ogiltig längd vid %X/%X" -#: xlogreader.c:1967 +#: xlogreader.c:1982 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "kunde inte hitta backup-block med ID %d i WAL-post" -#: xlogreader.c:2051 +#: xlogreader.c:2066 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "kunde inte Ã¥terställa avbild vid %X/%X med ogiltigt block %d angivet" -#: xlogreader.c:2058 +#: xlogreader.c:2073 #, c-format msgid "could not restore image at %X/%X with invalid state, block %d" -msgstr "kunde inte Ã¥terställa image vid %X/%X med ogiltigt state, block %d" +msgstr "kunde inte Ã¥terställa avbild vid %X/%X med ogiltigt state, block %d" -#: xlogreader.c:2085 xlogreader.c:2102 +#: xlogreader.c:2100 xlogreader.c:2117 #, c-format msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" -msgstr "kunde inte Ã¥terställa image vid %X/%X, komprimerad med %s stöds inte av bygget, block %d" +msgstr "kunde inte Ã¥terställa avbild vid %X/%X, komprimerad med %s stöds inte av bygget, block %d" -#: xlogreader.c:2111 +#: xlogreader.c:2126 #, c-format msgid "could not restore image at %X/%X compressed with unknown method, block %d" -msgstr "kunde inte Ã¥terställa image vid %X/%X, komprimerad med okänd metod, block %d" +msgstr "kunde inte Ã¥terställa avbild vid %X/%X, komprimerad med okänd metod, block %d" -#: xlogreader.c:2119 +#: xlogreader.c:2134 #, c-format msgid "could not decompress image at %X/%X, block %d" -msgstr "kunde inte packa upp image vid %X/%X, block %d" +msgstr "kunde inte packa upp avbild vid %X/%X, block %d" diff --git a/src/bin/pg_waldump/po/uk.po b/src/bin/pg_waldump/po/uk.po index 71312d16ec341..09da6eebce3ec 100644 --- a/src/bin/pg_waldump/po/uk.po +++ b/src/bin/pg_waldump/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-09-21 21:15+0000\n" -"PO-Revision-Date: 2020-09-22 13:43\n" +"POT-Creation-Date: 2024-08-31 06:19+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,280 +14,578 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /DEV_13/pg_waldump.pot\n" -"X-Crowdin-File-ID: 512\n" +"X-Crowdin-File: /REL_17_STABLE/pg_waldump.pot\n" +"X-Crowdin-File-ID: 984\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "збій: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "помилка: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "попередженнÑ: " -#: pg_waldump.c:146 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "деталі: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "підказка: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "недоÑтатньо пам'Ñті\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 pg_waldump.c:199 +#: pg_waldump.c:532 #, c-format msgid "could not open file \"%s\": %m" msgstr "не можливо відкрити файл \"%s\": %m" -#: pg_waldump.c:202 +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не вдалоÑÑ Ñинхронізувати файлову ÑиÑтему Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує метод Ñинхронізації \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#: pg_waldump.c:1104 pg_waldump.c:1127 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не вдалоÑÑ fsync файл \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" + +#: pg_waldump.c:137 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "не вдалоÑÑ Ñтворити каталог \"%s\": %m" + +#: pg_waldump.c:146 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "каталог \"%s\" Ñ–Ñнує, але він не порожній" + +#: pg_waldump.c:150 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "немає доÑтупу до каталогу \"%s\": %m" + +#: pg_waldump.c:256 +#, c-format +msgid "invalid WAL segment size in WAL file \"%s\" (%d byte)" +msgid_plural "invalid WAL segment size in WAL file \"%s\" (%d bytes)" +msgstr[0] "невірний розмір Ñегмента WAL у файлі WAL \"%s\" (%d байт)" +msgstr[1] "невірний розмір Ñегмента WAL у файлі WAL \"%s\" (%d байт)" +msgstr[2] "невірний розмір Ñегмента WAL у файлі WAL \"%s\" (%d байт)" +msgstr[3] "невірний розмір Ñегмента WAL у файлі WAL \"%s\" (%d байт)" + +#: pg_waldump.c:260 #, c-format -msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" -msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" -msgstr[0] "Розмір Ñегмента WAL повинен задаватиÑÑŒ Ñтупенем двійки в інтервалі між 1 MB Ñ– 1 GB, але у заголовку файлу WAL \"%s\" вказано %d байт" -msgstr[1] "Розмір Ñегмента WAL повинен задаватиÑÑŒ Ñтупенем двійки в інтервалі між 1 MB Ñ– 1 GB, але у заголовку файлу WAL \"%s\" вказано %d байти" -msgstr[2] "Розмір Ñегмента WAL повинен задаватиÑÑŒ Ñтупенем двійки в інтервалі між 1 MB Ñ– 1 GB, але у заголовку файлу WAL \"%s\" вказано %d байтів" -msgstr[3] "Розмір Ñегмента WAL повинен задаватиÑÑŒ Ñтупенем двійки в інтервалі між 1 MB Ñ– 1 GB, але у заголовку файлу WAL \"%s\" вказано %d байтів" +msgid "The WAL segment size must be a power of two between 1 MB and 1 GB." +msgstr "Розмір Ñегмента WAL повинен бути Ñтепенем двійки від 1 МБ до 1 ГБ." -#: pg_waldump.c:210 +#: pg_waldump.c:265 #, c-format msgid "could not read file \"%s\": %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" -#: pg_waldump.c:213 +#: pg_waldump.c:268 #, c-format -msgid "could not read file \"%s\": read %d of %zu" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %zu" +msgid "could not read file \"%s\": read %d of %d" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": прочитано %d з %d" -#: pg_waldump.c:275 +#: pg_waldump.c:329 #, c-format msgid "could not locate WAL file \"%s\"" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ WAL файл \"%s\"" -#: pg_waldump.c:277 +#: pg_waldump.c:331 #, c-format msgid "could not find any WAL file" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ жодного WAL файлу" -#: pg_waldump.c:318 +#: pg_waldump.c:372 #, c-format msgid "could not find file \"%s\": %m" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ файл \"%s\": %m" -#: pg_waldump.c:367 +#: pg_waldump.c:421 +#, c-format +msgid "could not read from file \"%s\", offset %d: %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу \"%s\", зÑув %d: %m" + +#: pg_waldump.c:425 +#, c-format +msgid "could not read from file \"%s\", offset %d: read %d of %d" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу \"%s\", зÑув %d: прочитано %d з %d" + +#: pg_waldump.c:515 +#, c-format +msgid "%s" +msgstr "%s" + +#: pg_waldump.c:523 #, c-format -msgid "could not read from file %s, offset %u: %m" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу %s, зÑув %u: %m" +msgid "invalid fork number: %u" +msgstr "неприпуÑтимий номер форку: %u" -#: pg_waldump.c:371 +#: pg_waldump.c:535 #, c-format -msgid "could not read from file %s, offset %u: read %d of %zu" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу %s, зÑув %u: прочитано %d з %zu" +msgid "could not write file \"%s\": %m" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати файл \"%s\": %m" -#: pg_waldump.c:720 +#: pg_waldump.c:538 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "неможливо закрити файл \"%s\": %m" + +#: pg_waldump.c:758 #, c-format msgid "%s decodes and displays PostgreSQL write-ahead logs for debugging.\n\n" msgstr "%s декодує Ñ– відображає журнали попереднього запиÑу PostgreSQL Ð´Ð»Ñ Ð½Ð°Ð»Ð°Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ.\n\n" -#: pg_waldump.c:722 +#: pg_waldump.c:760 #, c-format msgid "Usage:\n" msgstr "ВикориÑтаннÑ:\n" -#: pg_waldump.c:723 +#: pg_waldump.c:761 #, c-format msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" msgstr " %s [OPTION]...[STARTSEG [ENDSEG]]\n" -#: pg_waldump.c:724 +#: pg_waldump.c:762 #, c-format msgid "\n" "Options:\n" msgstr "\n" "Параметри:\n" -#: pg_waldump.c:725 +#: pg_waldump.c:763 #, c-format msgid " -b, --bkp-details output detailed information about backup blocks\n" msgstr " -b, --bkp-details виводити детальну інформацію про блоки резервних копій\n" -#: pg_waldump.c:726 +#: pg_waldump.c:764 +#, c-format +msgid " -B, --block=N with --relation, only show records that modify block N\n" +msgstr " -B, --block=N з --relation, лише показати запиÑи, Ñкі змінюють блок N\n" + +#: pg_waldump.c:765 #, c-format msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" msgstr " -e, --end=RECPTR зупинити Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ WAL з міÑÑ†Ñ RECPTR\n" -#: pg_waldump.c:727 +#: pg_waldump.c:766 #, c-format msgid " -f, --follow keep retrying after reaching end of WAL\n" msgstr " -f, --follow повторювати Ñпроби піÑÐ»Ñ Ð´Ð¾ÑÑÐ³Ð½ÐµÐ½Ð½Ñ ÐºÑ–Ð½Ñ†Ñ WAL\n" -#: pg_waldump.c:728 +#: pg_waldump.c:767 +#, c-format +msgid " -F, --fork=FORK only show records that modify blocks in fork FORK;\n" +" valid names are main, fsm, vm, init\n" +msgstr " -F, --fork=FORK показати лише запиÑи, Ñкі змінюють блоки в форці FORK;\n" +" дійÑні імена: main, fsm, vm, init\n" + +#: pg_waldump.c:769 #, c-format msgid " -n, --limit=N number of records to display\n" msgstr " -n, --limit=N чиÑло запиÑів Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ\n" -#: pg_waldump.c:729 +#: pg_waldump.c:770 #, c-format -msgid " -p, --path=PATH directory in which to find log segment files or a\n" +msgid " -p, --path=PATH directory in which to find WAL segment files or a\n" " directory with a ./pg_wal that contains such files\n" " (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n" msgstr " -p, --path=PATH каталог, у Ñкому шукати файли Ñегментів журналу \n" -"або каталог з ./pg_wal, що міÑтить такі файли (за замовчуваннÑм: чинний каталог, ./pg_wal, $PGDATA/pg_wal)\n" +" або каталог з ./pg_wal, що міÑтить такі файли\n" +" (за замовчуваннÑм: чинний каталог, ./pg_wal, $PGDATA/pg_wal)\n" -#: pg_waldump.c:732 +#: pg_waldump.c:773 #, c-format msgid " -q, --quiet do not print any output, except for errors\n" msgstr " -q, --quiet не друкувати жодного виводу, окрім помилок\n" -#: pg_waldump.c:733 +#: pg_waldump.c:774 #, c-format msgid " -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" " use --rmgr=list to list valid resource manager names\n" msgstr " -r, --rmgr=RMGR відображати запиÑи, згенеровані лише реÑурÑним менеджером RMGR;\n" " викориÑтовувати --rmgr=list Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду ÑпиÑку припуÑтимих імен реÑурÑного менеджера\n" -#: pg_waldump.c:735 +#: pg_waldump.c:776 +#, c-format +msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n" +msgstr " -R, --relation=T/D/R відобразити тільки запиÑи, Ñкі змінюють блоки у відношенні T/D/R\n" + +#: pg_waldump.c:777 #, c-format msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" msgstr " -s, --start=RECPTR почати Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ WAL з міÑÑ†Ñ RECPTR\n" -#: pg_waldump.c:736 +#: pg_waldump.c:778 #, c-format -msgid " -t, --timeline=TLI timeline from which to read log records\n" +msgid " -t, --timeline=TLI timeline from which to read WAL records\n" " (default: 1 or the value used in STARTSEG)\n" -msgstr " -t, --timeline=TLI чаÑова шкала, запиÑи Ñкої будуть прочитані (за замовчуваннÑм: 1 або значеннÑ, що викориÑтовуєтьÑÑ Ñƒ STARTSEG)\n" +msgstr " -t, --timeline=TLI чаÑова шкала, WAL-запиÑи Ñкої будуть прочитані\n" +" (за замовчуваннÑм: 1 або значеннÑ, що викориÑтовуєтьÑÑ Ñƒ STARTSEG)\n" -#: pg_waldump.c:738 +#: pg_waldump.c:780 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" -#: pg_waldump.c:739 +#: pg_waldump.c:781 +#, c-format +msgid " -w, --fullpage only show records with a full page write\n" +msgstr " -w, --fullpage показувати запиÑи лише з повним запиÑом на Ñторінці\n" + +#: pg_waldump.c:782 #, c-format msgid " -x, --xid=XID only show records with transaction ID XID\n" msgstr " -x, --xid=XID показати запиÑи лише з ідентифікатором транзакцій XID\n" -#: pg_waldump.c:740 +#: pg_waldump.c:783 #, c-format msgid " -z, --stats[=record] show statistics instead of records\n" " (optionally, show per-record statistics)\n" msgstr " -z, --stats[=record] показати ÑтатиÑтику заміÑть запиÑів (необов'Ñзково, відобразити щорÑдкову ÑтатиÑтику)\n" -#: pg_waldump.c:742 +#: pg_waldump.c:785 +#, c-format +msgid " --save-fullpage=DIR save full page images to DIR\n" +msgstr " --save-fullpage=DIR зберігати повні Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñторінок в DIR\n" + +#: pg_waldump.c:786 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку потім вийти\n" -#: pg_waldump.c:743 +#: pg_waldump.c:787 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "ПовідомлÑти про помилки на <%s>.\n" -#: pg_waldump.c:744 +#: pg_waldump.c:788 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" -#: pg_waldump.c:821 +#: pg_waldump.c:884 #, c-format msgid "no arguments specified" msgstr "не вказано аргументів" -#: pg_waldump.c:836 +#: pg_waldump.c:900 +#, c-format +msgid "invalid block number: \"%s\"" +msgstr "неприпуÑтимий номер блоку: \"%s\"" + +#: pg_waldump.c:909 pg_waldump.c:1007 +#, c-format +msgid "invalid WAL location: \"%s\"" +msgstr "неприпуÑтиме Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL: \"%s\"" + +#: pg_waldump.c:922 #, c-format -msgid "could not parse end WAL location \"%s\"" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ кінцеве Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL \"%s\"" +msgid "invalid fork name: \"%s\"" +msgstr "неприпуÑтиме ім'Ñ Ñ„Ð¾Ñ€ÐºÑƒ: \"%s\"" -#: pg_waldump.c:848 +#: pg_waldump.c:930 pg_waldump.c:1033 #, c-format -msgid "could not parse limit \"%s\"" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ ліміт \"%s\"" +msgid "invalid value \"%s\" for option %s" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" -#: pg_waldump.c:879 +#: pg_waldump.c:961 +#, c-format +msgid "custom resource manager \"%s\" does not exist" +msgstr "кориÑтувацький менеджер реÑурÑів \"%s\" не Ñ–Ñнує" + +#: pg_waldump.c:982 #, c-format msgid "resource manager \"%s\" does not exist" msgstr "менеджер реÑурÑів \"%s\" не Ñ–Ñнує" -#: pg_waldump.c:888 +#: pg_waldump.c:997 #, c-format -msgid "could not parse start WAL location \"%s\"" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ початкове Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL \"%s\"" +msgid "invalid relation specification: \"%s\"" +msgstr "неприпуÑтима ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ: \"%s\"" -#: pg_waldump.c:898 +#: pg_waldump.c:998 #, c-format -msgid "could not parse timeline \"%s\"" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ чаÑову шкалу \"%s\"" +msgid "Expecting \"tablespace OID/database OID/relation filenode\"." +msgstr "Очікуємо \"tablespace OID/database OID/relation filenode\"." -#: pg_waldump.c:905 +#: pg_waldump.c:1040 #, c-format -msgid "could not parse \"%s\" as a transaction ID" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ \"%s\" Ñк ідентифікатор транзакції" +msgid "%s must be in range %u..%u" +msgstr "%s має бути в діапазоні %u..%u" -#: pg_waldump.c:920 +#: pg_waldump.c:1055 #, c-format -msgid "unrecognized argument to --stats: %s" -msgstr "нерозпізнаний аргумент Ð´Ð»Ñ --stats: %s" +msgid "invalid transaction ID specification: \"%s\"" +msgstr "неприпуÑтима ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ–Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ‚Ð¾Ñ€Ð° транзакції: \"%s\"" -#: pg_waldump.c:933 +#: pg_waldump.c:1070 #, c-format -msgid "too many command-line arguments (first is \"%s\")" -msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")" +msgid "unrecognized value for option %s: %s" +msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s: %s" -#: pg_waldump.c:943 pg_waldump.c:963 +#: pg_waldump.c:1087 #, c-format -msgid "could not open directory \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" +msgid "option %s requires option %s to be specified" +msgstr "параметр %s вимагає викориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ %s" + +#: pg_waldump.c:1094 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")" -#: pg_waldump.c:969 pg_waldump.c:1000 +#: pg_waldump.c:1133 pg_waldump.c:1163 #, c-format msgid "could not open file \"%s\"" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\"" -#: pg_waldump.c:979 +#: pg_waldump.c:1143 #, c-format msgid "start WAL location %X/%X is not inside file \"%s\"" msgstr "початкове Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL %X/%X не вÑередині файлу \"%s\"" -#: pg_waldump.c:1007 +#: pg_waldump.c:1170 #, c-format msgid "ENDSEG %s is before STARTSEG %s" msgstr "ENDSEG %s перед STARTSEG %s" -#: pg_waldump.c:1022 +#: pg_waldump.c:1185 #, c-format msgid "end WAL location %X/%X is not inside file \"%s\"" msgstr "кінцеве Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL %X/%X не вÑередині файлу \"%s\"" -#: pg_waldump.c:1035 +#: pg_waldump.c:1197 #, c-format msgid "no start WAL location given" msgstr "не задано початкове Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ WAL" -#: pg_waldump.c:1049 +#: pg_waldump.c:1211 #, c-format -msgid "out of memory" -msgstr "недоÑтатньо пам'Ñті" +msgid "out of memory while allocating a WAL reading processor" +msgstr "недоÑтатньо пам'Ñті під Ñ‡Ð°Ñ Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð¾Ð±Ñ€Ð¾Ð±Ð½Ð¸ÐºÐ° Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ WAL" -#: pg_waldump.c:1055 +#: pg_waldump.c:1217 #, c-format msgid "could not find a valid record after %X/%X" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ припуÑтимий Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X" -#: pg_waldump.c:1066 +#: pg_waldump.c:1227 #, c-format -msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" -msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" -msgstr[0] "перший Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X, у %X/%X, пропуÑкаєтьÑÑ %u байт\n" -msgstr[1] "перший Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X, у %X/%X, пропуÑкаєтьÑÑ %u байти\n" -msgstr[2] "перший Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X, у %X/%X, пропуÑкаєтьÑÑ %u байтів\n" -msgstr[3] "перший Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X, у %X/%X, пропуÑкаєтьÑÑ %u байти\n" +msgid "first record is after %X/%X, at %X/%X, skipping over %u byte" +msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes" +msgstr[0] "перший Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X, за адреÑою %X/%X, пропуÑкаючи байт %u" +msgstr[1] "перший Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X, за адреÑою %X/%X, пропуÑкаючи %u байти" +msgstr[2] "перший Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X, за адреÑою %X/%X, пропуÑкаючи %u байти" +msgstr[3] "перший Ð·Ð°Ð¿Ð¸Ñ Ð¿Ñ–ÑÐ»Ñ %X/%X, за адреÑою %X/%X, пропуÑкаючи %u байти" -#: pg_waldump.c:1117 +#: pg_waldump.c:1312 #, c-format msgid "error in WAL record at %X/%X: %s" msgstr "помилка у запиÑÑ– WAL у %X/%X: %s" -#: pg_waldump.c:1127 +#: pg_waldump.c:1321 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." + +#: xlogreader.c:619 +#, c-format +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "неприпуÑтиме Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу в %X/%X: очікувалоÑÑŒ хоча б %u, отримано %u" + +#: xlogreader.c:628 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "по зÑуву %X/%X запитано Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñу" + +#: xlogreader.c:669 xlogreader.c:1134 +#, c-format +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "неприпуÑтима довжина запиÑу %X/%X: очікувалаÑÑŒ мінімум %u, отримано %u" + +#: xlogreader.c:758 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "немає Ð¿Ñ€Ð°Ð¿Ð¾Ñ€Ñ†Ñ contrecord в позиції %X/%X" + +#: xlogreader.c:771 +#, c-format +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "неприпуÑтима довжина contrecord %u (очікувалоÑÑŒ %lld) на %X/%X" + +#: xlogreader.c:1142 +#, c-format +msgid "invalid resource manager ID %u at %X/%X" +msgstr "невірний ID менеджера реÑурÑів %u в %X/%X" + +#: xlogreader.c:1155 xlogreader.c:1171 +#, c-format +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð· неправильним попереднім поÑиланнÑм %X/%X на %X/%X" + +#: xlogreader.c:1209 +#, c-format +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "некоректна контрольна Ñума даних менеджера реÑурÑів у запиÑу по зÑуву %X/%X" + +#: xlogreader.c:1243 +#, c-format +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "невірне магічне чиÑло %04X в Ñегменті WAL %s, LSN %X/%X, зÑув %u" + +#: xlogreader.c:1258 xlogreader.c:1300 +#, c-format +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "невірні інформаційні біти %04X в Ñегменті WAL %s, LSN %X/%X, зÑув %u" + +#: xlogreader.c:1274 +#, c-format +msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" +msgstr "WAL файл належить іншій ÑиÑтемі баз даних: ідентифікатор ÑиÑтеми баз даних де міÑтитьÑÑ WAL файл - %llu, а ідентифікатор ÑиÑтеми баз даних pg_control - %llu" + +#: xlogreader.c:1282 +#, c-format +msgid "WAL file is from different database system: incorrect segment size in page header" +msgstr "Файл WAL належить іншій ÑиÑтемі баз даних: некоректний розмір Ñегменту в заголовку Ñторінки" + +#: xlogreader.c:1288 +#, c-format +msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" +msgstr "Файл WAL належить іншій ÑиÑтемі баз даних: некоректний XLOG_BLCKSZ в заголовку Ñторінки" + +#: xlogreader.c:1320 +#, c-format +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "неочікуваний pageaddr %X/%X у Ñегменті WAL %s, LSN %X/%X, Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ %u" + +#: xlogreader.c:1346 +#, c-format +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ð¿Ð¾ÑлідовноÑті ID лінії чаÑу %u (піÑÐ»Ñ %u) у Ñегменті WAL %s, LSN %X/%X, зÑув %u" + +#: xlogreader.c:1749 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "ідентифікатор блока %u out-of-order в позиції %X/%X" + +#: xlogreader.c:1773 +#, c-format +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "BKPBLOCK_HAS_DATA вÑтановлений, але немає даних в позиції %X/%X" + +#: xlogreader.c:1780 +#, c-format +msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" +msgstr "BKPBLOCK_HAS_DATA вÑтановлений, але довжина даних дорівнює %u в позиції %X/%X" + +#: xlogreader.c:1816 +#, c-format +msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE вÑтановлений, але Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку задані: зÑув %u, довжина %u, при довжині образу блока %u в позиції %X/%X" + +#: xlogreader.c:1832 +#, c-format +msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" +msgstr "BKPIMAGE_HAS_HOLE не вÑтановлений, але Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку задані: зÑув %u, довжина %u в позиції %X/%X" + +#: xlogreader.c:1846 +#, c-format +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "BKPIMAGE_COMPRESSED вÑтановлений, але довжина образу блока дорівнює %u в позиції %X/%X" + +#: xlogreader.c:1861 +#, c-format +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "ні BKPIMAGE_HAS_HOLE, ні BKPIMAGE_COMPRESSED не вÑтановлені, але довжина образу блока дорівнює %u в позиції %X/%X" + +#: xlogreader.c:1877 +#, c-format +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "BKPBLOCK_SAME_REL вÑтановлений, але попереднє Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð½Ðµ задано в позиції %X/%X" + +#: xlogreader.c:1889 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "невірний ідентифікатор блоку %u в позиції %X/%X" + +#: xlogreader.c:1956 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "Ð·Ð°Ð¿Ð¸Ñ Ð· невірною довжиною на %X/%X" + +#: xlogreader.c:1982 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ блок резервної копії з ID %d у запиÑÑ– WAL" + +#: xlogreader.c:2066 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X з недійÑним вказаним блоком %d" + +#: xlogreader.c:2073 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X з недійÑним Ñтаном, блок %d" + +#: xlogreader.c:2100 xlogreader.c:2117 +#, c-format +msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð² %X/%X, ÑтиÑнуте %s, не підтримуєтьÑÑ Ð·Ð±Ñ–Ñ€ÐºÐ¾ÑŽ, блок %d" + +#: xlogreader.c:2126 +#, c-format +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´Ð½Ð¾Ð²Ð¸Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ %X/%X ÑтиÑнуте з невідомим методом, блок %d" + +#: xlogreader.c:2134 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації.\n" +msgid "could not decompress image at %X/%X, block %d" +msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð¿Ð°ÐºÑƒÐ²Ð°Ñ‚Ð¸ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð½Ð° %X/%X, блок %d" diff --git a/src/bin/pg_waldump/po/zh_TW.po b/src/bin/pg_waldump/po/zh_TW.po new file mode 100644 index 0000000000000..5eb35fb7019d0 --- /dev/null +++ b/src/bin/pg_waldump/po/zh_TW.po @@ -0,0 +1,591 @@ +# Traditional Chinese message translation file for pg_waldump +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_waldump (PostgreSQL) package. +# Zhenbang Wei , 2023. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_waldump (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-11 20:48+0000\n" +"PO-Revision-Date: 2023-11-06 08:50+0800\n" +"Last-Translator: Zhenbang Wei \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.4.1\n" + +# libpq/be-secure.c:294 libpq/be-secure.c:387 +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "錯誤: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "警告: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "詳細內容: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "æç¤º: " + +# commands/tablespace.c:154 commands/tablespace.c:162 +# commands/tablespace.c:168 +#: pg_waldump.c:137 +#, c-format +msgid "could not create directory \"%s\": %m" +msgstr "無法建立目錄\"%s\": %m" + +# commands/tablespace.c:334 +#: pg_waldump.c:146 +#, c-format +msgid "directory \"%s\" exists but is not empty" +msgstr "目錄 \"%s\" å·²å­˜åœ¨ï¼Œä½†ä¸æ˜¯ç©ºç›®éŒ„" + +# utils/init/postinit.c:283 +#: pg_waldump.c:150 +#, c-format +msgid "could not access directory \"%s\": %m" +msgstr "無法存å–目錄 \"%s\": %m" + +# access/transam/slru.c:638 access/transam/xlog.c:1631 +# access/transam/xlog.c:2742 access/transam/xlog.c:2832 +# access/transam/xlog.c:2930 libpq/hba.c:911 libpq/hba.c:935 +# utils/error/elog.c:1118 utils/init/miscinit.c:783 utils/init/miscinit.c:889 +# utils/misc/database.c:68 +#: pg_waldump.c:199 pg_waldump.c:528 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "無法開啟檔案\"%s\": %m" + +#: pg_waldump.c:255 +#, c-format +msgid "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d byte" +msgid_plural "WAL segment size must be a power of two between 1 MB and 1 GB, but the WAL file \"%s\" header specifies %d bytes" +msgstr[0] "WAL 片段大å°å¿…須為介於 1 MB 到 1 GB 之間的二的次方數,但是 WAL 檔 \"%s\" 的標頭指定了 %d ä½å…ƒçµ„" + +# access/transam/xlog.c:1659 access/transam/xlog.c:2942 +# access/transam/xlog.c:5397 access/transam/xlog.c:5448 +# access/transam/xlog.c:5520 access/transam/xlog.c:5545 +# access/transam/xlog.c:5583 +#: pg_waldump.c:261 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ç„¡æ³•è®€å–æª”案\"%s\": %m" + +#: pg_waldump.c:264 +#, c-format +msgid "could not read file \"%s\": read %d of %d" +msgstr "ç„¡æ³•è®€å–æª”案 \"%s\": å·²è®€å– %d / %d" + +#: pg_waldump.c:325 +#, c-format +msgid "could not locate WAL file \"%s\"" +msgstr "找ä¸åˆ° WAL 檔 \"%s\"" + +#: pg_waldump.c:327 +#, c-format +msgid "could not find any WAL file" +msgstr "找ä¸åˆ°ä»»ä½• WAL 檔" + +#: pg_waldump.c:368 +#, c-format +msgid "could not find file \"%s\": %m" +msgstr "找ä¸åˆ°æª”案 \"%s\": %m" + +#: pg_waldump.c:417 +#, c-format +msgid "could not read from file %s, offset %d: %m" +msgstr "無法從檔案 %s 讀å–,ä½ç§» %d: %m" + +#: pg_waldump.c:421 +#, c-format +msgid "could not read from file %s, offset %d: read %d of %d" +msgstr "無法從檔案 %s 讀å–,ä½ç§» %d: å·²è®€å– %d / %d" + +# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770 +# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285 +#: pg_waldump.c:511 +#, c-format +msgid "%s" +msgstr "%s" + +#: pg_waldump.c:519 +#, c-format +msgid "invalid fork number: %u" +msgstr "無效的分å‰è™Ÿç¢¼: %u" + +# access/transam/xlog.c:5319 access/transam/xlog.c:5439 +#: pg_waldump.c:531 +#, c-format +msgid "could not write file \"%s\": %m" +msgstr "無法寫入檔案 \"%s\": %m" + +# access/transam/slru.c:680 access/transam/xlog.c:1567 +# access/transam/xlog.c:1691 access/transam/xlog.c:3013 +#: pg_waldump.c:534 +#, c-format +msgid "could not close file \"%s\": %m" +msgstr "無法關閉檔案 \"%s\": %m" + +#: pg_waldump.c:754 +#, c-format +msgid "" +"%s decodes and displays PostgreSQL write-ahead logs for debugging.\n" +"\n" +msgstr "%s 解碼並顯示 PostgreSQL çš„ write-ahead 日誌以進行除錯。\n" + +#: pg_waldump.c:756 +#, c-format +msgid "Usage:\n" +msgstr "用法:\n" + +#: pg_waldump.c:757 +#, c-format +msgid " %s [OPTION]... [STARTSEG [ENDSEG]]\n" +msgstr " %s [OPTION]... [STARTSEG [ENDSEG]]\n" + +#: pg_waldump.c:758 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"é¸é …:\n" + +#: pg_waldump.c:759 +#, c-format +msgid " -b, --bkp-details output detailed information about backup blocks\n" +msgstr " -b, --bkp-details 輸出關於備份å€å¡Šçš„詳細資訊\n" + +#: pg_waldump.c:760 +#, c-format +msgid " -B, --block=N with --relation, only show records that modify block N\n" +msgstr " -B, --block=N 與 --relation 一起使用,åªé¡¯ç¤ºä¿®æ”¹å€å¡Š N 的記錄\n" + +#: pg_waldump.c:761 +#, c-format +msgid " -e, --end=RECPTR stop reading at WAL location RECPTR\n" +msgstr " -e, --end=RECPTR 在 WAL ä½ç½® RECPTR åœæ­¢è®€å–\n" + +#: pg_waldump.c:762 +#, c-format +msgid " -f, --follow keep retrying after reaching end of WAL\n" +msgstr " -f, --follow åˆ°é” WAL çµå°¾å¾Œç¹¼çºŒå˜—試\n" + +#: pg_waldump.c:763 +#, c-format +msgid "" +" -F, --fork=FORK only show records that modify blocks in fork FORK;\n" +" valid names are main, fsm, vm, init\n" +msgstr "" +" -F, --fork=FORK åªé¡¯ç¤ºåˆ†å‰ FORK 中修改å€å¡Šçš„記錄;\n" +" 有效的å稱有 main, fsm, vm, init\n" + +#: pg_waldump.c:765 +#, c-format +msgid " -n, --limit=N number of records to display\n" +msgstr " -n, --limit=N è¦é¡¯ç¤ºçš„記錄數é‡\n" + +#: pg_waldump.c:766 +#, c-format +msgid "" +" -p, --path=PATH directory in which to find WAL segment files or a\n" +" directory with a ./pg_wal that contains such files\n" +" (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n" +msgstr "" +" -p, --path=PATH åŒ…å« WAL ç‰‡æ®µæª”çš„ç›®éŒ„ï¼Œæˆ–åŒ…å« ./pg_wal 的目錄,\n" +" 且 ./pg_wal 內有 WAL 片段檔\n" +" (é è¨­: ç›®å‰ç›®éŒ„ã€./pg_walã€$PGDATA/pg_wal)\n" + +#: pg_waldump.c:769 +#, c-format +msgid " -q, --quiet do not print any output, except for errors\n" +msgstr " -q, --quiet ä¸é¡¯ç¤ºä»»ä½•輸出,除了錯誤訊æ¯\n" + +#: pg_waldump.c:770 +#, c-format +msgid "" +" -r, --rmgr=RMGR only show records generated by resource manager RMGR;\n" +" use --rmgr=list to list valid resource manager names\n" +msgstr "" +" -r, --rmgr=RMGR åªé¡¯ç¤ºç”±è³‡æºç®¡ç†å“¡ RMGR 產生的記錄;\n" +" 用 --rmgr=list 列出有效的資æºç®¡ç†å“¡å稱\n" + +#: pg_waldump.c:772 +#, c-format +msgid " -R, --relation=T/D/R only show records that modify blocks in relation T/D/R\n" +msgstr " -R, --relation=T/D/R åªé¡¯ç¤ºåœ¨ T/D/R é—œè¯ä¸­ä¿®æ”¹å€å¡Šçš„記錄\n" + +#: pg_waldump.c:773 +#, c-format +msgid " -s, --start=RECPTR start reading at WAL location RECPTR\n" +msgstr " -s, --start=RECPTR 從 WAL ä½ç½® RECPTR 開始讀å–\n" + +#: pg_waldump.c:774 +#, c-format +msgid "" +" -t, --timeline=TLI timeline from which to read WAL records\n" +" (default: 1 or the value used in STARTSEG)\n" +msgstr "" +" -t, --timeline=TLI è®€å– WAL 記錄的時間軸\n" +" (é è¨­: 1 或 STARTSEG 的值)\n" + +#: pg_waldump.c:776 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version é¡¯ç¤ºç‰ˆæœ¬ï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_waldump.c:777 +#, c-format +msgid " -w, --fullpage only show records with a full page write\n" +msgstr " -w, --fullpage åªé¡¯ç¤ºæœ‰å®Œæ•´è³‡æ–™é å¯«å…¥çš„記錄\n" + +#: pg_waldump.c:778 +#, c-format +msgid " -x, --xid=XID only show records with transaction ID XID\n" +msgstr " -x, --xid=XID åªé¡¯ç¤ºæœ‰äº¤æ˜“ ID XID 的記錄\n" + +#: pg_waldump.c:779 +#, c-format +msgid "" +" -z, --stats[=record] show statistics instead of records\n" +" (optionally, show per-record statistics)\n" +msgstr "" +" -z, --stats[=record] é¡¯ç¤ºçµ±è¨ˆè³‡æ–™è€Œä¸æ˜¯è¨˜éŒ„\n" +" (å¯é¸æ€§é¡¯ç¤ºæ¯ç­†è¨˜éŒ„的統計資料)\n" + +#: pg_waldump.c:781 +#, c-format +msgid " --save-fullpage=DIR save full page images to DIR\n" +msgstr " --save-fullpage=DIR 將完整資料é å½±åƒå­˜å…¥ DIR\n" + +#: pg_waldump.c:782 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help é¡¯ç¤ºèªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" + +#: pg_waldump.c:783 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"回報錯誤至 <%s>。\n" + +#: pg_waldump.c:784 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 網站: <%s>\n" + +#: pg_waldump.c:880 +#, c-format +msgid "no arguments specified" +msgstr "æœªæŒ‡å®šä»»ä½•åƒæ•¸" + +#: pg_waldump.c:896 +#, c-format +msgid "invalid block number: \"%s\"" +msgstr "無效的å€å¡Šç·¨è™Ÿ: \"%s\"" + +#: pg_waldump.c:905 pg_waldump.c:1003 +#, c-format +msgid "invalid WAL location: \"%s\"" +msgstr "無效的 WAL ä½ç½®: \"%s\"" + +#: pg_waldump.c:918 +#, c-format +msgid "invalid fork name: \"%s\"" +msgstr "無效的分å‰å稱: \"%s\"" + +# utils/adt/formatting.c:2044 +#: pg_waldump.c:926 pg_waldump.c:1029 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "é¸é … %2$s 的值 \"%1$s\" 無效" + +#: pg_waldump.c:957 +#, c-format +msgid "custom resource manager \"%s\" does not exist" +msgstr "自訂資æºç®¡ç†å“¡ \"%s\" ä¸å­˜åœ¨" + +#: pg_waldump.c:978 +#, c-format +msgid "resource manager \"%s\" does not exist" +msgstr "資æºç®¡ç†å“¡ \"%s\" ä¸å­˜åœ¨" + +#: pg_waldump.c:993 +#, c-format +msgid "invalid relation specification: \"%s\"" +msgstr "無效的關è¯è¦æ ¼: \"%s\"" + +#: pg_waldump.c:994 +#, c-format +msgid "Expecting \"tablespace OID/database OID/relation filenode\"." +msgstr "é æœŸ \"表空間 OID/資料庫 OID/é—œè¯æª”案節點\"。" + +#: pg_waldump.c:1036 +#, c-format +msgid "%s must be in range %u..%u" +msgstr "%s å¿…é ˆåœ¨ç¯„åœ %u..%u å…§" + +#: pg_waldump.c:1051 +#, c-format +msgid "invalid transaction ID specification: \"%s\"" +msgstr "無效的交易 ID è¦æ ¼: \"%s\"" + +#: pg_waldump.c:1066 +#, c-format +msgid "unrecognized value for option %s: %s" +msgstr "ç„¡æ³•è¾¨è­˜é …é¸ %s 的值: %s" + +#: pg_waldump.c:1083 +#, c-format +msgid "option %s requires option %s to be specified" +msgstr "é¸é … %s éœ€è¦æŒ‡å®šé¸é … %s" + +#: pg_waldump.c:1090 +#, c-format +msgid "too many command-line arguments (first is \"%s\")" +msgstr "å‘½ä»¤åˆ—åƒæ•¸éŽå¤š(第一個是 \"%s\")" + +# access/transam/slru.c:930 commands/tablespace.c:529 +# commands/tablespace.c:694 utils/adt/misc.c:174 +#: pg_waldump.c:1100 pg_waldump.c:1123 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "無法開啟目錄\"%s\": %m" + +#: pg_waldump.c:1129 pg_waldump.c:1159 +#, c-format +msgid "could not open file \"%s\"" +msgstr "無法開啟檔案 \"%s\"" + +#: pg_waldump.c:1139 +#, c-format +msgid "start WAL location %X/%X is not inside file \"%s\"" +msgstr "WAL é–‹å§‹ä½ç½® %X/%X ä¸åœ¨æª”案 \"%s\" å…§" + +#: pg_waldump.c:1166 +#, c-format +msgid "ENDSEG %s is before STARTSEG %s" +msgstr "ENDSEG %s 在 STARTSEG %s 之å‰" + +#: pg_waldump.c:1181 +#, c-format +msgid "end WAL location %X/%X is not inside file \"%s\"" +msgstr "WAL çµæŸä½ç½® %X/%X ä¸åœ¨æª”案 \"%s\" å…§" + +#: pg_waldump.c:1193 +#, c-format +msgid "no start WAL location given" +msgstr "未æä¾› WAL é–‹å§‹ä½ç½" + +#: pg_waldump.c:1207 +#, c-format +msgid "out of memory while allocating a WAL reading processor" +msgstr "é…ç½® WAL 讀å–處ç†å™¨æ™‚耗盡記憶體" + +#: pg_waldump.c:1213 +#, c-format +msgid "could not find a valid record after %X/%X" +msgstr "%X/%X 之後找ä¸åˆ°æœ‰æ•ˆçš„記錄" + +#: pg_waldump.c:1223 +#, c-format +msgid "first record is after %X/%X, at %X/%X, skipping over %u byte\n" +msgid_plural "first record is after %X/%X, at %X/%X, skipping over %u bytes\n" +msgstr[0] "第一筆記錄在 %X/%X ä¹‹å¾Œï¼Œä½æ–¼ %X/%Xï¼Œè·³éŽ %u 個ä½å…ƒçµ„\n" + +#: pg_waldump.c:1308 +#, c-format +msgid "error in WAL record at %X/%X: %s" +msgstr "WAL 記錄在 %X/%X 出ç¾éŒ¯èª¤: %s" + +# tcop/postgres.c:2636 tcop/postgres.c:2652 +#: pg_waldump.c:1317 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "用 \"%s --help\" å–得更多資訊。" + +#: xlogreader.c:626 +#, c-format +msgid "invalid record offset at %X/%X: expected at least %u, got %u" +msgstr "使–¼ %X/%X 的記錄 offset 無效: é æœŸè‡³å°‘ %u,實際為 %u" + +# access/transam/xlog.c:2443 +#: xlogreader.c:635 +#, c-format +msgid "contrecord is requested by %X/%X" +msgstr "%X/%X è¦æ±‚ contrecord" + +#: xlogreader.c:676 xlogreader.c:1119 +#, c-format +msgid "invalid record length at %X/%X: expected at least %u, got %u" +msgstr "使–¼ %X/%X 的記錄長度無效: é æœŸè‡³å°‘ %u,實際為 %u" + +#: xlogreader.c:705 +#, c-format +msgid "out of memory while trying to decode a record of length %u" +msgstr "嘗試解碼長度為 %u 的記錄時耗盡記憶體" + +# access/transam/xlog.c:2503 +#: xlogreader.c:727 +#, c-format +msgid "record length %u at %X/%X too long" +msgstr "使–¼ %X/%X 的記錄長度 %u éŽé•·" + +#: xlogreader.c:776 +#, c-format +msgid "there is no contrecord flag at %X/%X" +msgstr "使–¼ %X/%X 沒有 contrecord 標誌" + +#: xlogreader.c:789 +#, c-format +msgid "invalid contrecord length %u (expected %lld) at %X/%X" +msgstr "使–¼ %3$X/%4$X çš„ contrecord 長度 %1$u 無效(é æœŸç‚º %2$lld)" + +# access/transam/xlog.c:2465 +#: xlogreader.c:1127 +#, c-format +msgid "invalid resource manager ID %u at %X/%X" +msgstr "無效的資æºç®¡ç†å™¨ ID %u æ–¼ %X/%X" + +# access/transam/xlog.c:2458 +#: xlogreader.c:1140 xlogreader.c:1156 +#, c-format +msgid "record with incorrect prev-link %X/%X at %X/%X" +msgstr "使–¼ %3$X/%4$X çš„è¨˜éŒ„æœ‰ä¸æ­£ç¢ºçš„ prev-link %1$X/%2$X" + +# access/transam/xlog.c:2269 +#: xlogreader.c:1192 +#, c-format +msgid "incorrect resource manager data checksum in record at %X/%X" +msgstr "使–¼ %X/%X 的記錄中資æºç®¡ç†å“¡è³‡æ–™æª¢æŸ¥ç¢¼ä¸æ­£ç¢º" + +#: xlogreader.c:1226 +#, c-format +msgid "invalid magic number %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "WAL 片段 %2$s 中的魔數數字 %1$04X 無效,LSN %3$X/%4$X,ä½ç§» %5$u" + +#: xlogreader.c:1241 xlogreader.c:1283 +#, c-format +msgid "invalid info bits %04X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "WAL 片段 %2$s 中的資訊ä½å…ƒ %1$04X 無效,LSN %3$X/%4$X,ä½ç§» %5$u" + +#: xlogreader.c:1257 +#, c-format +msgid "WAL file is from different database system: WAL file database system identifier is %llu, pg_control database system identifier is %llu" +msgstr "WAL 檔案來自ä¸åŒçš„資料庫系統: WAL 檔案的資料庫系統識別碼為 %llu,而 pg_control 的資料庫系統識別碼為 %llu" + +#: xlogreader.c:1265 +#, c-format +msgid "WAL file is from different database system: incorrect segment size in page header" +msgstr "WAL 檔案來自ä¸åŒçš„資料庫系統: è³‡æ–™é æ¨™é ­ä¸­çš„片段大å°ä¸æ­£ç¢º" + +#: xlogreader.c:1271 +#, c-format +msgid "WAL file is from different database system: incorrect XLOG_BLCKSZ in page header" +msgstr "WAL 檔案來自ä¸åŒçš„資料庫系統: è³‡æ–™é æ¨™é ­ä¸­çš„ XLOG_BLCKSZ 䏿­£ç¢º" + +#: xlogreader.c:1303 +#, c-format +msgid "unexpected pageaddr %X/%X in WAL segment %s, LSN %X/%X, offset %u" +msgstr "éžé æœŸçš„ pageaddr %X/%X 使–¼ WAL 片段 %s,LSN %X/%X,ä½ç§» %u" + +#: xlogreader.c:1329 +#, c-format +msgid "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, offset %u" +msgstr "éžä¾åº timeline ID %u(在 %u 之後)使–¼ WAL 片段 %s,LSN %X/%X,ä½ç§» %u" + +#: xlogreader.c:1735 +#, c-format +msgid "out-of-order block_id %u at %X/%X" +msgstr "éžå¾ªåº block_id %u 使–¼ %X/%X" + +#: xlogreader.c:1759 +#, c-format +msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" +msgstr "設定了 BKPBLOCK_HAS_DATA,但在 %X/%X 的沒有包å«ä»»ä½•資料" + +#: xlogreader.c:1766 +#, c-format +msgid "BKPBLOCK_HAS_DATA not set, but data length is %u at %X/%X" +msgstr "未設定 BKPBLOCK_HAS_DATA,但在 %2$X/%3$X 的資料長度為 %1$u" + +#: xlogreader.c:1802 +#, c-format +msgid "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at %X/%X" +msgstr "設定了 BKPIMAGE_HAS_HOLE,但在 %4$X/%5$X 有 offset %1$u 長度 %2$u å½±åƒé•·åº¦ %3$u 的空洞" + +#: xlogreader.c:1818 +#, c-format +msgid "BKPIMAGE_HAS_HOLE not set, but hole offset %u length %u at %X/%X" +msgstr "未設定 BKPIMAGE_HAS_HOLE,但在 %3$X/%4$X 有 offset %1$u 長度 %2$u 的空洞" + +#: xlogreader.c:1832 +#, c-format +msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" +msgstr "設定了 BKPIMAGE_COMPRESSED,但在 %2$X/%3$X çš„å€å¡Šå½±åƒé•·åº¦ç‚º %1$u" + +#: xlogreader.c:1847 +#, c-format +msgid "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image length is %u at %X/%X" +msgstr "未設定 BKPIMAGE_HAS_HOLE å’Œ BKPIMAGE_COMPRESSED,但在 %2$X/%3$X çš„å€å¡Šå½±åƒé•·åº¦ç‚º %1$u" + +#: xlogreader.c:1863 +#, c-format +msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" +msgstr "設定了 BKPBLOCK_SAME_REL,但在 %X/%X 沒有先å‰çš„ rel" + +#: xlogreader.c:1875 +#, c-format +msgid "invalid block_id %u at %X/%X" +msgstr "使–¼ %2$X/%3$X 的無效 block_id %1$u" + +#: xlogreader.c:1942 +#, c-format +msgid "record with invalid length at %X/%X" +msgstr "使–¼ %X/%X 的記錄長度無效" + +#: xlogreader.c:1968 +#, c-format +msgid "could not locate backup block with ID %d in WAL record" +msgstr "在 WAL 記錄中找ä¸åˆ°å…·æœ‰ ID %d 的備份å€å¡Š" + +#: xlogreader.c:2052 +#, c-format +msgid "could not restore image at %X/%X with invalid block %d specified" +msgstr "無法還原指定了無效å€å¡Š %3$d 的影åƒï¼Œä½ç½® %1$X/%2$X" + +#: xlogreader.c:2059 +#, c-format +msgid "could not restore image at %X/%X with invalid state, block %d" +msgstr "無法還原處於無效狀態的影åƒï¼Œä½ç½® %X/%X,å€å¡Š %d" + +#: xlogreader.c:2086 xlogreader.c:2103 +#, c-format +msgid "could not restore image at %X/%X compressed with %s not supported by build, block %d" +msgstr "ç„¡æ³•é‚„åŽŸç”¨æ­¤ç‰ˆæœ¬ä¸æ”¯æ´çš„壓縮方法 %3$s 壓縮的影åƒï¼Œä½ç½® %1$X/%2$X,å€å¡Š %4$d" + +#: xlogreader.c:2112 +#, c-format +msgid "could not restore image at %X/%X compressed with unknown method, block %d" +msgstr "無法還原使用未知方法壓縮的影åƒï¼Œä½ç½® %X/%X,å€å¡Š %d" + +#: xlogreader.c:2120 +#, c-format +msgid "could not decompress image at %X/%X, block %d" +msgstr "無法解壓縮影åƒï¼Œä½ç½® %X/%X,å€å¡Š %d" diff --git a/src/bin/pg_waldump/t/001_basic.pl b/src/bin/pg_waldump/t/001_basic.pl index 492a8cadd83da..578e473139432 100644 --- a/src/bin/pg_waldump/t/001_basic.pl +++ b/src/bin/pg_waldump/t/001_basic.pl @@ -1,8 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -10,4 +11,299 @@ program_version_ok('pg_waldump'); program_options_handling_ok('pg_waldump'); +# wrong number of arguments +command_fails_like([ 'pg_waldump', ], qr/error: no arguments/, + 'no arguments'); +command_fails_like( + [ 'pg_waldump', 'foo', 'bar', 'baz' ], + qr/error: too many command-line arguments/, + 'too many arguments'); + +# invalid option arguments +command_fails_like( + [ 'pg_waldump', '--block', 'bad' ], + qr/error: invalid block number/, + 'invalid block number'); +command_fails_like( + [ 'pg_waldump', '--fork', 'bad' ], + qr/error: invalid fork name/, + 'invalid fork name'); +command_fails_like( + [ 'pg_waldump', '--limit', 'bad' ], + qr/error: invalid value/, + 'invalid limit'); +command_fails_like( + [ 'pg_waldump', '--relation', 'bad' ], + qr/error: invalid relation/, + 'invalid relation specification'); +command_fails_like( + [ 'pg_waldump', '--rmgr', 'bad' ], + qr/error: resource manager .* does not exist/, + 'invalid rmgr name'); +command_fails_like( + [ 'pg_waldump', '--start', 'bad' ], + qr/error: invalid WAL location/, + 'invalid start LSN'); +command_fails_like( + [ 'pg_waldump', '--end', 'bad' ], + qr/error: invalid WAL location/, + 'invalid end LSN'); + +# rmgr list: If you add one to the list, consider also adding a test +# case exercising the new rmgr below. +command_like( + [ 'pg_waldump', '--rmgr=list' ], qr/^XLOG +Transaction +Storage +CLOG +Database +Tablespace +MultiXact +RelMap +Standby +Heap2 +Heap +Btree +Hash +Gin +Gist +Sequence +SPGist +BRIN +CommitTs +ReplicationOrigin +Generic +LogicalMessage$/, + 'rmgr list'); + + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf( + 'postgresql.conf', q{ +autovacuum = off +checkpoint_timeout = 1h + +# for standbydesc +archive_mode=on +archive_command='' + +# for XLOG_HEAP_TRUNCATE +wal_level=logical +}); +$node->start; + +my ($start_lsn, $start_walfile) = split /\|/, + $node->safe_psql('postgres', + q{SELECT pg_current_wal_insert_lsn(), pg_walfile_name(pg_current_wal_insert_lsn())} + ); + +$node->safe_psql( + 'postgres', q{ +-- heap, btree, hash, sequence +CREATE TABLE t1 (a int GENERATED ALWAYS AS IDENTITY, b text); +CREATE INDEX i1a ON t1 USING btree (a); +CREATE INDEX i1b ON t1 USING hash (b); +INSERT INTO t1 VALUES (default, 'one'), (default, 'two'); +DELETE FROM t1 WHERE b = 'one'; +TRUNCATE t1; + +-- abort +START TRANSACTION; +INSERT INTO t1 VALUES (default, 'three'); +ROLLBACK; + +-- unlogged/init fork +CREATE UNLOGGED TABLE t2 (x int); +CREATE INDEX i2 ON t2 USING btree (x); +INSERT INTO t2 SELECT generate_series(1, 10); + +-- gin +CREATE TABLE gin_idx_tbl (id bigserial PRIMARY KEY, data jsonb); +CREATE INDEX gin_idx ON gin_idx_tbl USING gin (data); +INSERT INTO gin_idx_tbl + WITH random_json AS ( + SELECT json_object_agg(key, trunc(random() * 10)) as json_data + FROM unnest(array['a', 'b', 'c']) as u(key)) + SELECT generate_series(1,500), json_data FROM random_json; + +-- gist, spgist +CREATE TABLE gist_idx_tbl (p point); +CREATE INDEX gist_idx ON gist_idx_tbl USING gist (p); +CREATE INDEX spgist_idx ON gist_idx_tbl USING spgist (p); +INSERT INTO gist_idx_tbl (p) VALUES (point '(1, 1)'), (point '(3, 2)'), (point '(6, 3)'); + +-- brin +CREATE TABLE brin_idx_tbl (col1 int, col2 text, col3 text ); +CREATE INDEX brin_idx ON brin_idx_tbl USING brin (col1, col2, col3) WITH (autosummarize=on); +INSERT INTO brin_idx_tbl SELECT generate_series(1, 10000), 'dummy', 'dummy'; +UPDATE brin_idx_tbl SET col2 = 'updated' WHERE col1 BETWEEN 1 AND 5000; +SELECT brin_summarize_range('brin_idx', 0); +SELECT brin_desummarize_range('brin_idx', 0); + +VACUUM; + +-- logical message +SELECT pg_logical_emit_message(true, 'foo', 'bar'); + +-- relmap +VACUUM FULL pg_authid; + +-- database +CREATE DATABASE d1; +DROP DATABASE d1; +}); + +my $tblspc_path = PostgreSQL::Test::Utils::tempdir_short(); + +$node->safe_psql( + 'postgres', qq{ +CREATE TABLESPACE ts1 LOCATION '$tblspc_path'; +DROP TABLESPACE ts1; +}); + +my ($end_lsn, $end_walfile) = split /\|/, + $node->safe_psql('postgres', + q{SELECT pg_current_wal_insert_lsn(), pg_walfile_name(pg_current_wal_insert_lsn())} + ); + +my $default_ts_oid = $node->safe_psql('postgres', + q{SELECT oid FROM pg_tablespace WHERE spcname = 'pg_default'}); +my $postgres_db_oid = $node->safe_psql('postgres', + q{SELECT oid FROM pg_database WHERE datname = 'postgres'}); +my $rel_t1_oid = $node->safe_psql('postgres', + q{SELECT oid FROM pg_class WHERE relname = 't1'}); +my $rel_i1a_oid = $node->safe_psql('postgres', + q{SELECT oid FROM pg_class WHERE relname = 'i1a'}); + +$node->stop; + + +# various ways of specifying WAL range +command_fails_like( + [ 'pg_waldump', 'foo', 'bar' ], + qr/error: could not locate WAL file "foo"/, + 'start file not found'); +command_like([ 'pg_waldump', $node->data_dir . '/pg_wal/' . $start_walfile ], + qr/./, 'runs with start segment specified'); +command_fails_like( + [ 'pg_waldump', $node->data_dir . '/pg_wal/' . $start_walfile, 'bar' ], + qr/error: could not open file "bar"/, + 'end file not found'); +command_like( + [ + 'pg_waldump', + $node->data_dir . '/pg_wal/' . $start_walfile, + $node->data_dir . '/pg_wal/' . $end_walfile + ], + qr/./, + 'runs with start and end segment specified'); +command_fails_like( + [ 'pg_waldump', '-p', $node->data_dir ], + qr/error: no start WAL location given/, + 'path option requires start location'); +command_like( + [ + 'pg_waldump', '-p', $node->data_dir, '--start', + $start_lsn, '--end', $end_lsn + ], + qr/./, + 'runs with path option and start and end locations'); +command_fails_like( + [ 'pg_waldump', '-p', $node->data_dir, '--start', $start_lsn ], + qr/error: error in WAL record at/, + 'falling off the end of the WAL results in an error'); + +command_like( + [ + 'pg_waldump', '--quiet', + $node->data_dir . '/pg_wal/' . $start_walfile + ], + qr/^$/, + 'no output with --quiet option'); +command_fails_like( + [ 'pg_waldump', '--quiet', '-p', $node->data_dir, '--start', $start_lsn ], + qr/error: error in WAL record at/, + 'errors are shown with --quiet'); + + +# Test for: Display a message that we're skipping data if `from` +# wasn't a pointer to the start of a record. +{ + # Construct a new LSN that is one byte past the original + # start_lsn. + my ($part1, $part2) = split qr{/}, $start_lsn; + my $lsn2 = hex $part2; + $lsn2++; + my $new_start = sprintf("%s/%X", $part1, $lsn2); + + my (@cmd, $stdout, $stderr, $result); + + @cmd = ( + 'pg_waldump', '--start', $new_start, + $node->data_dir . '/pg_wal/' . $start_walfile); + $result = IPC::Run::run \@cmd, '>', \$stdout, '2>', \$stderr; + ok($result, "runs with start segment and start LSN specified"); + like($stderr, qr/first record is after/, 'info message printed'); +} + + +# Helper function to test various options. Pass options as arguments. +# Output lines are returned as array. +sub test_pg_waldump +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my @opts = @_; + + my (@cmd, $stdout, $stderr, $result, @lines); + + @cmd = ( + 'pg_waldump', '-p', $node->data_dir, '--start', $start_lsn, '--end', + $end_lsn); + push @cmd, @opts; + $result = IPC::Run::run \@cmd, '>', \$stdout, '2>', \$stderr; + ok($result, "pg_waldump @opts: runs ok"); + is($stderr, '', "pg_waldump @opts: no stderr"); + @lines = split /\n/, $stdout; + ok(@lines > 0, "pg_waldump @opts: some lines are output"); + return @lines; +} + +my @lines; + +@lines = test_pg_waldump; +is(grep(!/^rmgr: \w/, @lines), 0, 'all output lines are rmgr lines'); + +@lines = test_pg_waldump('--limit', 6); +is(@lines, 6, 'limit option observed'); + +@lines = test_pg_waldump('--fullpage'); +is(grep(!/^rmgr:.*\bFPW\b/, @lines), 0, 'all output lines are FPW'); + +@lines = test_pg_waldump('--stats'); +like($lines[0], qr/WAL statistics/, "statistics on stdout"); +is(grep(/^rmgr:/, @lines), 0, 'no rmgr lines output'); + +@lines = test_pg_waldump('--stats=record'); +like($lines[0], qr/WAL statistics/, "statistics on stdout"); +is(grep(/^rmgr:/, @lines), 0, 'no rmgr lines output'); + +@lines = test_pg_waldump('--rmgr', 'Btree'); +is(grep(!/^rmgr: Btree/, @lines), 0, 'only Btree lines'); + +@lines = test_pg_waldump('--fork', 'init'); +is(grep(!/fork init/, @lines), 0, 'only init fork lines'); + +@lines = test_pg_waldump('--relation', + "$default_ts_oid/$postgres_db_oid/$rel_t1_oid"); +is(grep(!/rel $default_ts_oid\/$postgres_db_oid\/$rel_t1_oid/, @lines), + 0, 'only lines for selected relation'); + +@lines = + test_pg_waldump('--relation', + "$default_ts_oid/$postgres_db_oid/$rel_i1a_oid", + '--block', 1); +is(grep(!/\bblk 1\b/, @lines), 0, 'only lines for selected block'); + + done_testing(); diff --git a/src/bin/pg_waldump/t/002_save_fullpage.pl b/src/bin/pg_waldump/t/002_save_fullpage.pl index f0725805f2192..1f398b043a91f 100644 --- a/src/bin/pg_waldump/t/002_save_fullpage.pl +++ b/src/bin/pg_waldump/t/002_save_fullpage.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use File::Basename; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::RecursiveCopy; diff --git a/src/bin/pg_walsummary/.gitignore b/src/bin/pg_walsummary/.gitignore new file mode 100644 index 0000000000000..31aeddf7fc334 --- /dev/null +++ b/src/bin/pg_walsummary/.gitignore @@ -0,0 +1,2 @@ +/pg_walsummary +/tmp_check/ diff --git a/src/bin/pg_walsummary/Makefile b/src/bin/pg_walsummary/Makefile new file mode 100644 index 0000000000000..1886c39e98b19 --- /dev/null +++ b/src/bin/pg_walsummary/Makefile @@ -0,0 +1,49 @@ +#------------------------------------------------------------------------- +# +# Makefile for src/bin/pg_walsummary +# +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group +# Portions Copyright (c) 1994, Regents of the University of California +# +# src/bin/pg_walsummary/Makefile +# +#------------------------------------------------------------------------- + +PGFILEDESC = "pg_walsummary - print contents of WAL summary files" +PGAPPICON=win32 + +subdir = src/bin/pg_walsummary +top_builddir = ../../.. +include $(top_builddir)/src/Makefile.global + +override CPPFLAGS := -I$(libpq_srcdir) $(CPPFLAGS) +LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils + +OBJS = \ + $(WIN32RES) \ + pg_walsummary.o + +all: pg_walsummary + +pg_walsummary: $(OBJS) | submake-libpgport submake-libpgfeutils + $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) + + +install: all installdirs + $(INSTALL_PROGRAM) pg_walsummary$(X) '$(DESTDIR)$(bindir)/pg_walsummary$(X)' + +installdirs: + $(MKDIR_P) '$(DESTDIR)$(bindir)' + +uninstall: + rm -f '$(DESTDIR)$(bindir)/pg_walsummary$(X)' + +clean distclean maintainer-clean: + rm -f pg_walsummary$(X) $(OBJS) + rm -rf tmp_check + +check: + $(prove_check) + +installcheck: + $(prove_installcheck) diff --git a/src/bin/pg_walsummary/meson.build b/src/bin/pg_walsummary/meson.build new file mode 100644 index 0000000000000..86b046e896de7 --- /dev/null +++ b/src/bin/pg_walsummary/meson.build @@ -0,0 +1,32 @@ +# Copyright (c) 2022-2024, PostgreSQL Global Development Group + +pg_walsummary_sources = files( + 'pg_walsummary.c', +) + +if host_system == 'windows' + pg_walsummary_sources += rc_bin_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'pg_walsummary', + '--FILEDESC', 'pg_walsummary - print contents of WAL summary files',]) +endif + +pg_walsummary = executable('pg_walsummary', + pg_walsummary_sources, + dependencies: [frontend_code], + kwargs: default_bin_args, +) +bin_targets += pg_walsummary + +tests += { + 'name': 'pg_walsummary', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tap': { + 'tests': [ + 't/001_basic.pl', + 't/002_blocks.pl', + ], + } +} + +subdir('po', if_found: libintl) diff --git a/src/bin/pg_walsummary/nls.mk b/src/bin/pg_walsummary/nls.mk new file mode 100644 index 0000000000000..b22905e447b15 --- /dev/null +++ b/src/bin/pg_walsummary/nls.mk @@ -0,0 +1,9 @@ +# src/bin/pg_combinebackup/nls.mk +CATALOG_NAME = pg_walsummary +GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ + pg_walsummary.c \ + ../../common/fe_memutils.c \ + ../../common/file_utils.c \ + ../../fe_utils/option_utils.c +GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) +GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/pg_walsummary/pg_walsummary.c b/src/bin/pg_walsummary/pg_walsummary.c new file mode 100644 index 0000000000000..f6a262d3184fa --- /dev/null +++ b/src/bin/pg_walsummary/pg_walsummary.c @@ -0,0 +1,278 @@ +/*------------------------------------------------------------------------- + * + * pg_walsummary.c + * Prints the contents of WAL summary files. + * + * Copyright (c) 2017-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/bin/pg_walsummary/pg_walsummary.c + * + *------------------------------------------------------------------------- + */ +#include "postgres_fe.h" + +#include +#include + +#include "common/blkreftable.h" +#include "common/int.h" +#include "common/logging.h" +#include "fe_utils/option_utils.h" +#include "getopt_long.h" +#include "lib/stringinfo.h" + +typedef struct ws_options +{ + bool individual; + bool quiet; +} ws_options; + +typedef struct ws_file_info +{ + int fd; + char *filename; +} ws_file_info; + +static BlockNumber *block_buffer = NULL; +static unsigned block_buffer_size = 512; /* Initial size. */ + +static void dump_one_relation(ws_options *opt, RelFileLocator *rlocator, + ForkNumber forknum, BlockNumber limit_block, + BlockRefTableReader *reader); +static void help(const char *progname); +static int compare_block_numbers(const void *a, const void *b); +static int walsummary_read_callback(void *callback_arg, void *data, + int length); +static void walsummary_error_callback(void *callback_arg, char *fmt,...) pg_attribute_printf(2, 3); + +/* + * Main program. + */ +int +main(int argc, char *argv[]) +{ + static struct option long_options[] = { + {"individual", no_argument, NULL, 'i'}, + {"quiet", no_argument, NULL, 'q'}, + {NULL, 0, NULL, 0} + }; + + const char *progname; + int optindex; + int c; + ws_options opt; + + memset(&opt, 0, sizeof(ws_options)); + + pg_logging_init(argv[0]); + progname = get_progname(argv[0]); + set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_walsummary")); + handle_help_version_opts(argc, argv, progname, help); + + /* process command-line options */ + while ((c = getopt_long(argc, argv, "iq", + long_options, &optindex)) != -1) + { + switch (c) + { + case 'i': + opt.individual = true; + break; + case 'q': + opt.quiet = true; + break; + default: + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + } + + if (optind >= argc) + { + pg_log_error("no input files specified"); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + + while (optind < argc) + { + ws_file_info ws; + BlockRefTableReader *reader; + RelFileLocator rlocator; + ForkNumber forknum; + BlockNumber limit_block; + + ws.filename = argv[optind++]; + if ((ws.fd = open(ws.filename, O_RDONLY | PG_BINARY, 0)) < 0) + pg_fatal("could not open file \"%s\": %m", ws.filename); + + reader = CreateBlockRefTableReader(walsummary_read_callback, &ws, + ws.filename, + walsummary_error_callback, NULL); + while (BlockRefTableReaderNextRelation(reader, &rlocator, &forknum, + &limit_block)) + dump_one_relation(&opt, &rlocator, forknum, limit_block, reader); + + DestroyBlockRefTableReader(reader); + close(ws.fd); + } + + exit(0); +} + +/* + * Dump details for one relation. + */ +static void +dump_one_relation(ws_options *opt, RelFileLocator *rlocator, + ForkNumber forknum, BlockNumber limit_block, + BlockRefTableReader *reader) +{ + unsigned i = 0; + unsigned nblocks; + BlockNumber startblock = InvalidBlockNumber; + BlockNumber endblock = InvalidBlockNumber; + + /* Dump limit block, if any. */ + if (limit_block != InvalidBlockNumber) + printf("TS %u, DB %u, REL %u, FORK %s: limit %u\n", + rlocator->spcOid, rlocator->dbOid, rlocator->relNumber, + forkNames[forknum], limit_block); + + /* If we haven't allocated a block buffer yet, do that now. */ + if (block_buffer == NULL) + block_buffer = palloc_array(BlockNumber, block_buffer_size); + + /* Try to fill the block buffer. */ + nblocks = BlockRefTableReaderGetBlocks(reader, + block_buffer, + block_buffer_size); + + /* If we filled the block buffer completely, we must enlarge it. */ + while (nblocks >= block_buffer_size) + { + unsigned new_size; + + /* Double the size, being careful about overflow. */ + new_size = block_buffer_size * 2; + if (new_size < block_buffer_size) + new_size = PG_UINT32_MAX; + block_buffer = repalloc_array(block_buffer, BlockNumber, new_size); + + /* Try to fill the newly-allocated space. */ + nblocks += + BlockRefTableReaderGetBlocks(reader, + block_buffer + block_buffer_size, + new_size - block_buffer_size); + + /* Save the new size for later calls. */ + block_buffer_size = new_size; + } + + /* If we don't need to produce any output, skip the rest of this. */ + if (opt->quiet) + return; + + /* + * Sort the returned block numbers. If the block reference table was using + * the bitmap representation for a given chunk, the block numbers in that + * chunk will already be sorted, but when the array-of-offsets + * representation is used, we can receive block numbers here out of order. + */ + qsort(block_buffer, nblocks, sizeof(BlockNumber), compare_block_numbers); + + /* Dump block references. */ + while (i < nblocks) + { + /* + * Find the next range of blocks to print, but if --individual was + * specified, then consider each block a separate range. + */ + startblock = endblock = block_buffer[i++]; + if (!opt->individual) + { + while (i < nblocks && block_buffer[i] == endblock + 1) + { + endblock++; + i++; + } + } + + /* Format this range of block numbers as a string. */ + if (startblock == endblock) + printf("TS %u, DB %u, REL %u, FORK %s: block %u\n", + rlocator->spcOid, rlocator->dbOid, rlocator->relNumber, + forkNames[forknum], startblock); + else + printf("TS %u, DB %u, REL %u, FORK %s: blocks %u..%u\n", + rlocator->spcOid, rlocator->dbOid, rlocator->relNumber, + forkNames[forknum], startblock, endblock); + } +} + +/* + * Quicksort comparator for block numbers. + */ +static int +compare_block_numbers(const void *a, const void *b) +{ + BlockNumber aa = *(BlockNumber *) a; + BlockNumber bb = *(BlockNumber *) b; + + return pg_cmp_u32(aa, bb); +} + +/* + * Error callback. + */ +void +walsummary_error_callback(void *callback_arg, char *fmt,...) +{ + va_list ap; + + va_start(ap, fmt); + pg_log_generic_v(PG_LOG_ERROR, PG_LOG_PRIMARY, fmt, ap); + va_end(ap); + + exit(1); +} + +/* + * Read callback. + */ +int +walsummary_read_callback(void *callback_arg, void *data, int length) +{ + ws_file_info *ws = callback_arg; + int rc; + + if ((rc = read(ws->fd, data, length)) < 0) + pg_fatal("could not read file \"%s\": %m", ws->filename); + + return rc; +} + +/* + * help + * + * Prints help page for the program + * + * progname: the name of the executed program, such as "pg_walsummary" + */ +static void +help(const char *progname) +{ + printf(_("%s prints the contents of a WAL summary file.\n\n"), progname); + printf(_("Usage:\n")); + printf(_(" %s [OPTION]... FILE...\n"), progname); + printf(_("\nOptions:\n")); + printf(_(" -i, --individual list block numbers individually, not as ranges\n")); + printf(_(" -q, --quiet don't print anything, just parse the files\n")); + printf(_(" -V, --version output version information, then exit\n")); + printf(_(" -?, --help show this help, then exit\n")); + + printf(_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); + printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL); +} diff --git a/src/bin/pg_walsummary/po/LINGUAS b/src/bin/pg_walsummary/po/LINGUAS new file mode 100644 index 0000000000000..a6af4f7c83594 --- /dev/null +++ b/src/bin/pg_walsummary/po/LINGUAS @@ -0,0 +1 @@ +de es fr ja ka ko ru sv uk diff --git a/src/bin/pg_walsummary/po/de.po b/src/bin/pg_walsummary/po/de.po new file mode 100644 index 0000000000000..2c180942bf5f4 --- /dev/null +++ b/src/bin/pg_walsummary/po/de.po @@ -0,0 +1,182 @@ +# German message translation file for pg_walsummary +# Copyright (C) 2024 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_walsummary (PostgreSQL) package. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_walsummary (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-06-21 16:53+0000\n" +"PO-Revision-Date: 2024-06-22 07:35+0200\n" +"Last-Translator: Peter Eisentraut \n" +"Language-Team: German \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "Fehler: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "Warnung: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "Detail: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "Tipp: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "Speicher aufgebraucht\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#: pg_walsummary.c:109 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "konnte Datei »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht lesen: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "konnte Datei »%s« nicht fsyncen: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ungültiger Wert »%s« für Option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s muss im Bereich %d..%d sein" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "unbekannte Sync-Methode: %s" + +#: pg_walsummary.c:87 pg_walsummary.c:95 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Versuchen Sie »%s --help« für weitere Informationen." + +#: pg_walsummary.c:94 +#, c-format +msgid "no input files specified" +msgstr "keine Eingabedateien angegeben" + +#: pg_walsummary.c:252 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "konnte Datei »%s« nicht lesen: %m" + +#: pg_walsummary.c:267 +#, c-format +msgid "" +"%s prints the contents of a WAL summary file.\n" +"\n" +msgstr "" +"%s gibt den Inhalt einer WAL-Summary-Datei aus.\n" +"\n" + +#: pg_walsummary.c:268 +#, c-format +msgid "Usage:\n" +msgstr "Aufruf:\n" + +#: pg_walsummary.c:269 +#, c-format +msgid " %s [OPTION]... FILE...\n" +msgstr " %s [OPTION]... DATEI...\n" + +#: pg_walsummary.c:270 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Optionen:\n" + +#: pg_walsummary.c:271 +#, c-format +msgid " -i, --individual list block numbers individually, not as ranges\n" +msgstr " -i, --individual Blocknummern einzeln auflisten, nicht als Bereich\n" + +#: pg_walsummary.c:272 +#, c-format +msgid " -q, --quiet don't print anything, just parse the files\n" +msgstr " -q, --quiet nichts ausgeben, nur die Dateien parsen\n" + +#: pg_walsummary.c:273 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" + +#: pg_walsummary.c:274 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" + +#: pg_walsummary.c:276 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Berichten Sie Fehler an <%s>.\n" + +#: pg_walsummary.c:277 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s Homepage: <%s>\n" diff --git a/src/bin/pg_walsummary/po/es.po b/src/bin/pg_walsummary/po/es.po new file mode 100644 index 0000000000000..7584da24ef575 --- /dev/null +++ b/src/bin/pg_walsummary/po/es.po @@ -0,0 +1,187 @@ +# Spanish translation file for pg_walsummary +# +# Copyright (c) 2024, PostgreSQL Global Development Group +# This file is distributed under the same license as the PostgreSQL package. +# +# Alvaro Herrera , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: pg_walsummary (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-11-16 05:23+0000\n" +"PO-Revision-Date: 2024-08-01 12:41-0400\n" +"Last-Translator: Ãlvaor Herrera \n" +"Language-Team: PgSQL-es-Ayuda \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Vim\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "error: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "precaución: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "detalle: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "consejo: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "memoria agotada\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "no se puede duplicar un puntero nulo (error interno)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#: pg_walsummary.c:109 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "no se pudo abrir el archivo «%s»: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "no se pudo hacer stat al archivo «%s»: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "esta instalación no soporta el método de sync «%s»" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "no se pudo abrir el directorio «%s»: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "no se pudo leer el directorio «%s»: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "el valor «%s» no es válido para la opción %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s debe estar en el rango %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "método sync no reconocido: %s" + +#: pg_walsummary.c:87 pg_walsummary.c:95 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Pruebe «%s --help» para mayor información." + +#: pg_walsummary.c:94 +#, c-format +msgid "no input files specified" +msgstr "no se especificaron archivos de entrada" + +#: pg_walsummary.c:252 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "no se pudo leer el archivo «%s»: %m" + +#: pg_walsummary.c:267 +#, c-format +msgid "" +"%s prints the contents of a WAL summary file.\n" +"\n" +msgstr "" +"%s imprime el contenido de un archivo de resumen de WAL.\n" +"\n" + +#: pg_walsummary.c:268 +#, c-format +msgid "Usage:\n" +msgstr "Empleo:\n" + +#: pg_walsummary.c:269 +#, c-format +msgid " %s [OPTION]... FILE...\n" +msgstr " %s [OPCIÓN]... ARCHIVO...\n" + +#: pg_walsummary.c:270 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Opciones:\n" + +#: pg_walsummary.c:271 +#, c-format +msgid " -i, --individual list block numbers individually, not as ranges\n" +msgstr " -i, --individual listar números de bloque individualmente, no como rangos\n" + +#: pg_walsummary.c:272 +#, c-format +msgid " -q, --quiet don't print anything, just parse the files\n" +msgstr " -q, --quiet no escribir nada, sólo procesar los archivos\n" + +#: pg_walsummary.c:273 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version mostrar información de version y salir\n" + +#: pg_walsummary.c:274 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help mostrar esta ayuda y salir\n" + +#: pg_walsummary.c:276 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Reporte errores a <%s>.\n" + +#: pg_walsummary.c:277 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "Sitio web de %s: <%s>\n" diff --git a/src/bin/pg_walsummary/po/fr.po b/src/bin/pg_walsummary/po/fr.po new file mode 100644 index 0000000000000..cdedfd51bdf22 --- /dev/null +++ b/src/bin/pg_walsummary/po/fr.po @@ -0,0 +1,185 @@ +# LANGUAGE message translation file for pg_walsummary +# Copyright (C) 2024 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_walsummary (PostgreSQL) package. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: PostgreSQL 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-08-23 10:22+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" +"Last-Translator: Guillaume Lelarge \n" +"Language-Team: French \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.5\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "erreur : " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "attention : " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "détail : " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "astuce : " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "mémoire épuisée\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#: pg_walsummary.c:109 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier « %s » : %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "n'a pas pu tester le fichier « %s » : %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "cette construction ne supporte pas la méthode de synchronisation « %s »" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "n'a pas pu lire le répertoire « %s » : %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "valeur « %s » invalide pour l'option %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s doit être compris entre %d et %d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "méthode de synchronisation non reconnu : %s" + +#: pg_walsummary.c:87 pg_walsummary.c:95 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Essayez « %s --help » pour plus d'informations." + +#: pg_walsummary.c:94 +#, c-format +msgid "no input files specified" +msgstr "aucun fichier spécifié en entrée" + +#: pg_walsummary.c:252 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "n'a pas pu lire le fichier « %s » : %m" + +#: pg_walsummary.c:267 +#, c-format +msgid "" +"%s prints the contents of a WAL summary file.\n" +"\n" +msgstr "" +"%s affiche le contenu d'un fichier de résumé de WAL.\n" +"\n" + +#: pg_walsummary.c:268 +#, c-format +msgid "Usage:\n" +msgstr "Usage :\n" + +#: pg_walsummary.c:269 +#, c-format +msgid " %s [OPTION]... FILE...\n" +msgstr " %s [OPTION]... FICHIER...\n" + +#: pg_walsummary.c:270 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Options :\n" + +#: pg_walsummary.c:271 +#, c-format +msgid " -i, --individual list block numbers individually, not as ranges\n" +msgstr " -i, --individual liste les numéros de bloc individuellement, pas sous la forme d'intervalles\n" + +#: pg_walsummary.c:272 +#, c-format +msgid " -q, --quiet don't print anything, just parse the files\n" +msgstr " -q, --quiet n'affiche rien, analyse uniquement les fichiers\n" + +#: pg_walsummary.c:273 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version affiche la version puis quitte\n" + +#: pg_walsummary.c:274 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help affiche cette aide puis quitte\n" + +#: pg_walsummary.c:276 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Rapporter les bogues à <%s>.\n" + +#: pg_walsummary.c:277 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" diff --git a/src/bin/pg_walsummary/po/ja.po b/src/bin/pg_walsummary/po/ja.po new file mode 100644 index 0000000000000..3818ee61e8e09 --- /dev/null +++ b/src/bin/pg_walsummary/po/ja.po @@ -0,0 +1,184 @@ +# LANGUAGE message translation file for pg_walsummary +# Copyright (C) 2024 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_walsummary (PostgreSQL) package. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_walsummary (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-06-21 09:58+0900\n" +"PO-Revision-Date: 2024-06-21 10:19+0900\n" +"Last-Translator: Kyotaro Horiguchi \n" +"Language-Team: \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.13\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "エラー: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "警告: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "詳細: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "ヒント: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "メモリä¸è¶³ã§ã™\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "nullãƒã‚¤ãƒ³ã‚¿ã¯è¤‡è£½ã§ãã¾ã›ã‚“(内部エラー)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#: pg_walsummary.c:109 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "ファイル\"%s\"ã«å¯¾ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã‚’åŒæœŸã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ã“ã®ãƒ“ルドã§ã¯åŒæœŸæ–¹å¼\"%s\"をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "オプション%2$sã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%sã¯%d..%dã®ç¯„囲ã«ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "èªè­˜ã§ããªã„åŒæœŸæ–¹å¼: %s" + +#: pg_walsummary.c:87 pg_walsummary.c:95 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" + +#: pg_walsummary.c:94 +#, c-format +msgid "no input files specified" +msgstr "å…¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" + +#: pg_walsummary.c:252 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ファイル\"%s\"ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸ: %m" + +#: pg_walsummary.c:267 +#, c-format +msgid "" +"%s prints the contents of a WAL summary file.\n" +"\n" +msgstr "" +"%sã¯WAL概è¦ãƒ•ァイルã®å†…容を表示ã—ã¾ã™ã€‚\n" +"\n" + +#: pg_walsummary.c:268 +#, c-format +msgid "Usage:\n" +msgstr "使用方法:\n" + +#: pg_walsummary.c:269 +#, c-format +msgid " %s [OPTION]... FILE...\n" +msgstr " %s [オプション]... ファイル...\n" + +#: pg_walsummary.c:270 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"オプション:\n" + +#: pg_walsummary.c:271 +#, c-format +msgid " -i, --individual list block numbers individually, not as ranges\n" +msgstr " -i, --individual ブロック番å·ã‚’領域ã¨ã—ã¦ã§ã¯ãªãã€å€‹åˆ¥ã«è¡¨ç¤ºã™ã‚‹\n" + +#: pg_walsummary.c:272 +#, c-format +msgid " -q, --quiet don't print anything, just parse the files\n" +msgstr " -q, --quiet 何も表示ã›ãšã«ã€ãŸã ãƒ•ァイルをパースã™ã‚‹\n" + +#: pg_walsummary.c:273 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" + +#: pg_walsummary.c:274 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" + +#: pg_walsummary.c:276 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" + +#: pg_walsummary.c:277 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s ホームページ: <%s>\n" diff --git a/src/bin/pg_walsummary/po/ka.po b/src/bin/pg_walsummary/po/ka.po new file mode 100644 index 0000000000000..90157c57b0e65 --- /dev/null +++ b/src/bin/pg_walsummary/po/ka.po @@ -0,0 +1,184 @@ +# LANGUAGE message translation file for pg_walsummary +# Copyright (C) 2024 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_walsummary (PostgreSQL) package. +# FIRST AUTHOR , 2024. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_walsummary (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-06-24 21:54+0000\n" +"PO-Revision-Date: 2024-06-25 05:47+0200\n" +"Last-Translator: Temuri Doghonadze \n" +"Language-Team: \n" +"Language: ka\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.3.2\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "შეცდáƒáƒ›áƒ: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "დეტáƒáƒšáƒ”ბი: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "მინიშნებáƒ: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#: pg_walsummary.c:109 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრისთვის %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "უცნáƒáƒ‘ი სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი: \"%s\"" + +#: pg_walsummary.c:87 pg_walsummary.c:95 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." + +#: pg_walsummary.c:94 +#, c-format +msgid "no input files specified" +msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბი მითითებული áƒáƒ áƒáƒ" + +#: pg_walsummary.c:252 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: pg_walsummary.c:267 +#, c-format +msgid "" +"%s prints the contents of a WAL summary file.\n" +"\n" +msgstr "" +"%s WAL შეჯáƒáƒ›áƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ შემცველáƒáƒ‘áƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ¡.\n" +"\n" + +#: pg_walsummary.c:268 +#, c-format +msgid "Usage:\n" +msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" + +#: pg_walsummary.c:269 +#, c-format +msgid " %s [OPTION]... FILE...\n" +msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... ფáƒáƒ˜áƒšáƒ˜...\n" + +#: pg_walsummary.c:270 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"პáƒáƒ áƒáƒ›áƒ”ტრები:\n" + +#: pg_walsummary.c:271 +#, c-format +msgid " -i, --individual list block numbers individually, not as ranges\n" +msgstr " -i, --individual ბლáƒáƒ™áƒ˜áƒ¡ ნáƒáƒ›áƒ áƒ”ბის ცáƒáƒš-ცáƒáƒšáƒ™áƒ” გáƒáƒ›áƒáƒ¢áƒáƒœáƒ, შუáƒáƒšáƒ”დების მáƒáƒ’იერ\n" + +#: pg_walsummary.c:272 +#, c-format +msgid " -q, --quiet don't print anything, just parse the files\n" +msgstr " -q, --quiet ეკრáƒáƒœáƒ–ე áƒáƒ áƒáƒ¤áƒ”რი გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ. უბრáƒáƒšáƒáƒ“, ფáƒáƒ˜áƒšáƒ”ბი დáƒáƒáƒ›áƒ£áƒ¨áƒáƒ•ე\n" + +#: pg_walsummary.c:273 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" + +#: pg_walsummary.c:274 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" + +#: pg_walsummary.c:276 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n" + +#: pg_walsummary.c:277 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" diff --git a/src/bin/pg_walsummary/po/ko.po b/src/bin/pg_walsummary/po/ko.po new file mode 100644 index 0000000000000..fdd116411d8fa --- /dev/null +++ b/src/bin/pg_walsummary/po/ko.po @@ -0,0 +1,187 @@ +# Korean message translation file for pg_combinebackup +# Copyright (C) 2025 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_combinebackup (PostgreSQL) package. +# Ioseph Kim , 2025. +# +msgid "" +msgstr "" +"Project-Id-Version: pg_walsummary (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2025-01-17 04:53+0000\n" +"PO-Revision-Date: 2025-01-16 14:00+0900\n" +"Last-Translator: Ioseph Kim \n" +"Language-Team: Korean \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "오류: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "경고: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "메모리 부족\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "null í¬ì¸í„°ë¥¼ 중복할 수 ì—†ìŒ (ë‚´ë¶€ 오류)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#: pg_walsummary.c:109 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ëŒ€ìƒìœ¼ë¡œ íŒŒì¼ ì‹œìŠ¤í…œ ë™ê¸°í™”를 í•  수 없습니다: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ì´ ë¹Œë“œëŠ” \"%s\" ë™ê¸°í™” ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "\"%s\" 디렉터리 ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ fsync 실패: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "\"%s\" ê°’ì€ %s ì˜µì…˜ì˜ ê°’ìœ¼ë¡œ ì ë‹¹í•˜ì§€ 않ìŒ" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s ê°’ì€ %d부터 %d까지만 허용합니다" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "알 수 없는 ë™ê¸°í™” 방법: %s" + +#: pg_walsummary.c:87 pg_walsummary.c:95 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." + +#: pg_walsummary.c:94 +#, c-format +msgid "no input files specified" +msgstr "ìž…ë ¥ 파ì¼ì„ 지정하지 않았ìŒ" + +#: pg_walsummary.c:252 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" + +#: pg_walsummary.c:267 +#, c-format +msgid "" +"%s prints the contents of a WAL summary file.\n" +"\n" +msgstr "" +"%s í”„ë¡œê·¸ëž¨ì€ WAL 요약 파ì¼ì˜ ë‚´ìš©ì„ ë³´ì—¬ì¤ë‹ˆë‹¤.\n" +"\n" + +#: pg_walsummary.c:268 +#, c-format +msgid "Usage:\n" +msgstr "사용법:\n" + +#: pg_walsummary.c:269 +#, c-format +msgid " %s [OPTION]... FILE...\n" +msgstr " %s [OPTION]... 파ì¼...\n" + +#: pg_walsummary.c:270 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"옵션들:\n" + +#: pg_walsummary.c:271 +#, c-format +msgid "" +" -i, --individual list block numbers individually, not as ranges\n" +msgstr "" +" -i, --individual ë¸”ë¡ ë²ˆí˜¸ë¥¼ 범위로 보여주지 않고, ê°ê° 나ì¼í•¨\n" + +#: pg_walsummary.c:272 +#, c-format +msgid "" +" -q, --quiet don't print anything, just parse the files\n" +msgstr "" +" -q, --quiet ì–´ë–¤ ì •ë³´ë„ ë³´ì—¬ì£¼ì§€ 않고, 그냥 ë¶„ì„ë§Œ 함\n" + +#: pg_walsummary.c:273 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version 버전 정보를 보여주고 마침\n" + +#: pg_walsummary.c:274 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" + +#: pg_walsummary.c:276 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"ë¬¸ì œì  ë³´ê³  주소: <%s>\n" + +#: pg_walsummary.c:277 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s 홈페ì´ì§€: <%s>\n" diff --git a/src/bin/pg_walsummary/po/meson.build b/src/bin/pg_walsummary/po/meson.build new file mode 100644 index 0000000000000..e8ce4a6a20c3b --- /dev/null +++ b/src/bin/pg_walsummary/po/meson.build @@ -0,0 +1,3 @@ +# Copyright (c) 2024, PostgreSQL Global Development Group + +nls_targets += [i18n.gettext('pg_walsummary-' + pg_version_major.to_string())] diff --git a/src/bin/pg_walsummary/po/ru.po b/src/bin/pg_walsummary/po/ru.po new file mode 100644 index 0000000000000..1dcd7aaf72aec --- /dev/null +++ b/src/bin/pg_walsummary/po/ru.po @@ -0,0 +1,187 @@ +# Alexander Lakhin , 2024. +msgid "" +msgstr "" +"Project-Id-Version: pg_walsummary (PostgreSQL) 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-09-02 09:31+0300\n" +"PO-Revision-Date: 2024-09-05 14:47+0300\n" +"Last-Translator: Alexander Lakhin \n" +"Language-Team: Russian \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Lokalize 21.12.3\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "ошибка: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "предупреждение: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "подробноÑти: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "подÑказка: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "нехватка памÑти\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#: pg_walsummary.c:109 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñта Ñборка программы не поддерживает метод Ñинхронизации \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "значение %s должно быть в диапазоне %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нераÑпознанный метод Ñинхронизации: %s" + +#: pg_walsummary.c:87 pg_walsummary.c:95 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." + +#: pg_walsummary.c:94 +#, c-format +msgid "no input files specified" +msgstr "нет входных файлов" + +#: pg_walsummary.c:252 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать файл \"%s\": %m" + +#: pg_walsummary.c:267 +#, c-format +msgid "" +"%s prints the contents of a WAL summary file.\n" +"\n" +msgstr "" +"%s выводит Ñодержимое файла Ð¾Ð±Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ WAL.\n" +"\n" + +#: pg_walsummary.c:268 +#, c-format +msgid "Usage:\n" +msgstr "ИÑпользование:\n" + +#: pg_walsummary.c:269 +#, c-format +msgid " %s [OPTION]... FILE...\n" +msgstr " %s [ПÐРÐМЕТР]... [ФÐЙЛ]...\n" + +#: pg_walsummary.c:270 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Параметры:\n" + +#: pg_walsummary.c:271 +#, c-format +msgid "" +" -i, --individual list block numbers individually, not as ranges\n" +msgstr "" +" -i, --individual выводить номера блоков по одному, не " +"диапазонами\n" + +#: pg_walsummary.c:272 +#, c-format +msgid "" +" -q, --quiet don't print anything, just parse the files\n" +msgstr "" +" -q, --quiet не выводить ничего, только разобрать файлы\n" + +#: pg_walsummary.c:273 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version показать верÑию и выйти\n" + +#: pg_walsummary.c:274 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help показать Ñту Ñправку и выйти\n" + +#: pg_walsummary.c:276 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Об ошибках Ñообщайте по адреÑу <%s>.\n" + +#: pg_walsummary.c:277 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" diff --git a/src/bin/pg_walsummary/po/sv.po b/src/bin/pg_walsummary/po/sv.po new file mode 100644 index 0000000000000..14e987f3aafe2 --- /dev/null +++ b/src/bin/pg_walsummary/po/sv.po @@ -0,0 +1,181 @@ +# Swedish message translation file for pg_walsummary +# Copyright (C) 2024 PostgreSQL Global Development Group +# This file is distributed under the same license as the pg_walsummary (PostgreSQL) package. +# Dennis Björklund , 2024. +msgid "" +msgstr "" +"Project-Id-Version: PostgreSQL 17\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-07-12 17:54+0000\n" +"PO-Revision-Date: 2024-07-12 23:39+0200\n" +"Last-Translator: Dennis Björklund \n" +"Language-Team: Swedish \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "fel: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "varning: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "detalj: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "tips: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "slut pÃ¥ minne\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "kan inte duplicera null-pekare (internt fel)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#: pg_walsummary.c:109 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "kunde inte öppna fil \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "detta bygge stöder inte synkmetod \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "kunde inte öppna katalog \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "kunde inte läsa katalog \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "kunde inte fsync:a fil \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s mÃ¥ste vara i intervallet %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "okänd synkmetod: %s" + +#: pg_walsummary.c:87 pg_walsummary.c:95 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Försök med \"%s --help\" för mer information." + +#: pg_walsummary.c:94 +#, c-format +msgid "no input files specified" +msgstr "inga inputfiler angivna" + +#: pg_walsummary.c:252 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "kunde inte läsa fil \"%s\": %m" + +#: pg_walsummary.c:267 +#, c-format +msgid "" +"%s prints the contents of a WAL summary file.\n" +"\n" +msgstr "%s skriver ut innehÃ¥llet av WAL-summeringsfilen.\n\n" + +#: pg_walsummary.c:268 +#, c-format +msgid "Usage:\n" +msgstr "Användning:\n" + +#: pg_walsummary.c:269 +#, c-format +msgid " %s [OPTION]... FILE...\n" +msgstr " %s [FLAGGA]... FIL...\n" + +#: pg_walsummary.c:270 +#, c-format +msgid "" +"\n" +"Options:\n" +msgstr "" +"\n" +"Flaggor:\n" + +#: pg_walsummary.c:271 +#, c-format +msgid " -i, --individual list block numbers individually, not as ranges\n" +msgstr " -i, --individual lista blocknummer individuellt, inte som intervall\n" + +#: pg_walsummary.c:272 +#, c-format +msgid " -q, --quiet don't print anything, just parse the files\n" +msgstr " -q, --quiet skriv ingenting, bara parsa filerna\n" + +#: pg_walsummary.c:273 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version visa versionsinformation, avsluta sedan\n" + +#: pg_walsummary.c:274 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help visa denna hjälp, avsluta sedan\n" + +#: pg_walsummary.c:276 +#, c-format +msgid "" +"\n" +"Report bugs to <%s>.\n" +msgstr "" +"\n" +"Rapportera fel till <%s>.\n" + +#: pg_walsummary.c:277 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "hemsida för %s: <%s>\n" diff --git a/src/bin/pg_walsummary/po/uk.po b/src/bin/pg_walsummary/po/uk.po new file mode 100644 index 0000000000000..523b46a7f12e8 --- /dev/null +++ b/src/bin/pg_walsummary/po/uk.po @@ -0,0 +1,177 @@ +msgid "" +msgstr "" +"Project-Id-Version: postgresql\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-08-31 06:24+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" +"Last-Translator: \n" +"Language-Team: Ukrainian\n" +"Language: uk_UA\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" +"X-Crowdin-Project: postgresql\n" +"X-Crowdin-Project-ID: 324573\n" +"X-Crowdin-Language: uk\n" +"X-Crowdin-File: /REL_17_STABLE/pg_walsummary.pot\n" +"X-Crowdin-File-ID: 992\n" + +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "помилка: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "попередженнÑ: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "деталі: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "підказка: " + +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "недоÑтатньо пам'Ñті\n" + +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" + +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#: pg_walsummary.c:109 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не можливо відкрити файл \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не вдалоÑÑ Ñинхронізувати файлову ÑиÑтему Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує метод Ñинхронізації \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не вдалоÑÑ fsync файл \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s має бути в діапазоні %d..%d" + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нерозпізнаний метод Ñинхронізації: %s" + +#: pg_walsummary.c:87 pg_walsummary.c:95 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." + +#: pg_walsummary.c:94 +#, c-format +msgid "no input files specified" +msgstr "не вказано вхідні файли" + +#: pg_walsummary.c:252 +#, c-format +msgid "could not read file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл \"%s\": %m" + +#: pg_walsummary.c:267 +#, c-format +msgid "%s prints the contents of a WAL summary file.\n\n" +msgstr "%s друкує вміÑÑ‚ файлу Ð·Ð²ÐµÐ´ÐµÐ½Ð½Ñ WAL.\n\n" + +#: pg_walsummary.c:268 +#, c-format +msgid "Usage:\n" +msgstr "ВикориÑтаннÑ:\n" + +#: pg_walsummary.c:269 +#, c-format +msgid " %s [OPTION]... FILE...\n" +msgstr " %s [OPTION]... FILE...\n" + +#: pg_walsummary.c:270 +#, c-format +msgid "\n" +"Options:\n" +msgstr "\n" +"Параметри:\n" + +#: pg_walsummary.c:271 +#, c-format +msgid " -i, --individual list block numbers individually, not as ranges\n" +msgstr " -i, --individual вивеÑти номера блоків індивідуально, не Ñк діапазони\n" + +#: pg_walsummary.c:272 +#, c-format +msgid " -q, --quiet don't print anything, just parse the files\n" +msgstr " -q, --quiet не друкувати нічого, проÑто розібрати файли\n" + +#: pg_walsummary.c:273 +#, c-format +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" + +#: pg_walsummary.c:274 +#, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help показати цю довідку, потім вийти\n" + +#: pg_walsummary.c:276 +#, c-format +msgid "\n" +"Report bugs to <%s>.\n" +msgstr "\n" +"ПовідомлÑти про помилки на <%s>.\n" + +#: pg_walsummary.c:277 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" + diff --git a/src/bin/pg_walsummary/t/001_basic.pl b/src/bin/pg_walsummary/t/001_basic.pl new file mode 100644 index 0000000000000..4a1555091a6f0 --- /dev/null +++ b/src/bin/pg_walsummary/t/001_basic.pl @@ -0,0 +1,19 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Utils; +use Test::More; + +my $tempdir = PostgreSQL::Test::Utils::tempdir; + +program_help_ok('pg_walsummary'); +program_version_ok('pg_walsummary'); +program_options_handling_ok('pg_walsummary'); + +command_fails_like( + ['pg_walsummary'], + qr/no input files specified/, + 'input files must be specified'); + +done_testing(); diff --git a/src/bin/pg_walsummary/t/002_blocks.pl b/src/bin/pg_walsummary/t/002_blocks.pl new file mode 100644 index 0000000000000..0fddbaa22f418 --- /dev/null +++ b/src/bin/pg_walsummary/t/002_blocks.pl @@ -0,0 +1,97 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use File::Compare; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Set up a new database instance. +my $node1 = PostgreSQL::Test::Cluster->new('node1'); +$node1->init(has_archiving => 1, allows_streaming => 1); +$node1->append_conf('postgresql.conf', 'summarize_wal = on'); +$node1->start; + +# Create a table and insert a few test rows into it. VACUUM FREEZE it so that +# autovacuum doesn't induce any future modifications unexpectedly. Then +# trigger a checkpoint. +$node1->safe_psql('postgres', <safe_psql('postgres', <safe_psql('postgres', <poll_query_until('postgres', <= '$base_lsn' +) +EOM +ok($result, "WAL summarization caught up after insert"); + +# Find the highest LSN that is summarized on disk. +my $summarized_lsn = $node1->safe_psql('postgres', <safe_psql('postgres', <poll_query_until('postgres', < '$summarized_lsn' +) +EOM +ok($result, "got new WAL summary after update"); + +# Figure out the exact details for the new summary file. +my $details = $node1->safe_psql('postgres', < '$summarized_lsn' +EOM +my @lines = split(/\n/, $details); +is(0 + @lines, 1, "got exactly one new WAL summary"); +my ($tli, $start_lsn, $end_lsn) = split(/\|/, $lines[0]); +note("examining summary for TLI $tli from $start_lsn to $end_lsn"); + +# Reconstruct the full pathname for the WAL summary file. +my $filename = sprintf "%s/pg_wal/summaries/%08s%08s%08s%08s%08s.summary", + $node1->data_dir, $tli, + split(m@/@, $start_lsn), + split(m@/@, $end_lsn); +ok(-f $filename, "WAL summary file exists"); + +# Run pg_walsummary on it. We expect exactly two blocks to be modified, +# block 0 and one other. +my ($stdout, $stderr) = run_command([ 'pg_walsummary', '-i', $filename ]); +note($stdout); +@lines = split(/\n/, $stdout); +like($stdout, qr/FORK main: block 0$/m, "stdout shows block 0 modified"); +is($stderr, '', 'stderr is empty'); +is(0 + @lines, 2, "UPDATE modified 2 blocks"); + +done_testing(); diff --git a/src/bin/pgbench/Makefile b/src/bin/pgbench/Makefile index 68b6eb0376e8d..987bf64df9de0 100644 --- a/src/bin/pgbench/Makefile +++ b/src/bin/pgbench/Makefile @@ -38,8 +38,6 @@ exprparse.c: BISONFLAGS += -d # Force these dependencies to be known even without dependency info built: exprparse.o exprscan.o: exprparse.h -distprep: exprparse.c exprscan.c - install: all installdirs $(INSTALL_PROGRAM) pgbench$(X) '$(DESTDIR)$(bindir)/pgbench$(X)' @@ -52,8 +50,6 @@ uninstall: clean distclean: rm -f pgbench$(X) $(OBJS) rm -rf tmp_check - -maintainer-clean: distclean rm -f exprparse.h exprparse.c exprscan.c check: diff --git a/src/bin/pgbench/exprparse.y b/src/bin/pgbench/exprparse.y index 6cb063c98c9b5..25176a6c61cd4 100644 --- a/src/bin/pgbench/exprparse.y +++ b/src/bin/pgbench/exprparse.y @@ -4,7 +4,7 @@ * exprparse.y * bison grammar for a simple expression syntax * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/pgbench/exprparse.y diff --git a/src/bin/pgbench/exprscan.l b/src/bin/pgbench/exprscan.l index 4bba29210f875..e8fd13acd1354 100644 --- a/src/bin/pgbench/exprscan.l +++ b/src/bin/pgbench/exprscan.l @@ -15,7 +15,7 @@ * * Note that this lexer operates within the framework created by psqlscan.l, * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/pgbench/exprscan.l diff --git a/src/bin/pgbench/meson.build b/src/bin/pgbench/meson.build index e3c7619cf4f10..d330bb5eb0d5c 100644 --- a/src/bin/pgbench/meson.build +++ b/src/bin/pgbench/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pgbench_sources = files( 'pgbench.c', diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 1d1670d4c2b57..0b45b7d453da1 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -5,7 +5,7 @@ * Originally written by Tatsuo Ishii and enhanced by many contributors. * * src/bin/pgbench/pgbench.c - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * ALL RIGHTS RESERVED; * * Permission to use, copy, modify, and distribute this software and its @@ -137,7 +137,7 @@ typedef struct socket_set EnterSynchronizationBarrier((barrier), \ SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY) #define THREAD_BARRIER_DESTROY(barrier) -#elif defined(ENABLE_THREAD_SAFETY) +#else /* Use POSIX threads */ #include "port/pg_pthread.h" #define THREAD_T pthread_t @@ -153,16 +153,6 @@ typedef struct socket_set pthread_barrier_init((barrier), NULL, (n)) #define THREAD_BARRIER_WAIT(barrier) pthread_barrier_wait((barrier)) #define THREAD_BARRIER_DESTROY(barrier) pthread_barrier_destroy((barrier)) -#else -/* No threads implementation, use none (-j 1) */ -#define THREAD_T void * -#define THREAD_FUNC_RETURN_TYPE void * -#define THREAD_FUNC_RETURN return NULL -#define THREAD_FUNC_CC -#define THREAD_BARRIER_T int -#define THREAD_BARRIER_INIT(barrier, n) (*(barrier) = 0) -#define THREAD_BARRIER_WAIT(barrier) -#define THREAD_BARRIER_DESTROY(barrier) #endif @@ -237,11 +227,11 @@ typedef enum { PART_NONE, /* no partitioning */ PART_RANGE, /* range partitioning */ - PART_HASH /* hash partitioning */ + PART_HASH, /* hash partitioning */ } partition_method_t; static partition_method_t partition_method = PART_NONE; -static const char *PARTITION_METHOD[] = {"none", "range", "hash"}; +static const char *const PARTITION_METHOD[] = {"none", "range", "hash"}; /* random seed used to initialize base_random_sequence */ int64 random_seed = -1; @@ -469,7 +459,7 @@ typedef enum EStatus /* SQL errors */ ESTATUS_SERIALIZATION_ERROR, ESTATUS_DEADLOCK_ERROR, - ESTATUS_OTHER_SQL_ERROR + ESTATUS_OTHER_SQL_ERROR, } EStatus; /* @@ -480,7 +470,7 @@ typedef enum TStatus TSTATUS_IDLE, TSTATUS_IN_BLOCK, TSTATUS_CONN_ERROR, - TSTATUS_OTHER_ERROR + TSTATUS_OTHER_ERROR, } TStatus; /* Various random sequences are initialized from this one. */ @@ -597,7 +587,7 @@ typedef enum * aborted because a command failed, CSTATE_FINISHED means success. */ CSTATE_ABORTED, - CSTATE_FINISHED + CSTATE_FINISHED, } ConnectionStateEnum; /* @@ -618,6 +608,7 @@ typedef struct int use_file; /* index in sql_script for this client */ int command; /* command number in script */ + int num_syncs; /* number of ongoing sync commands */ /* client variables */ Variables variables; @@ -707,7 +698,8 @@ typedef enum MetaCommand META_ELSE, /* \else */ META_ENDIF, /* \endif */ META_STARTPIPELINE, /* \startpipeline */ - META_ENDPIPELINE /* \endpipeline */ + META_SYNCPIPELINE, /* \syncpipeline */ + META_ENDPIPELINE, /* \endpipeline */ } MetaCommand; typedef enum QueryMode @@ -719,7 +711,7 @@ typedef enum QueryMode } QueryMode; static QueryMode querymode = QUERY_SIMPLE; -static const char *QUERYMODE[] = {"simple", "extended", "prepared"}; +static const char *const QUERYMODE[] = {"simple", "extended", "prepared"}; /* * struct Command represents one command in a script. @@ -775,6 +767,8 @@ static int64 total_weight = 0; static bool verbose_errors = false; /* print verbose messages of all errors */ +static bool exit_on_abort = false; /* exit when any client is aborted */ + /* Builtin test scripts */ typedef struct BuiltinScript { @@ -845,6 +839,8 @@ static void add_socket_to_set(socket_set *sa, int fd, int idx); static int wait_on_socket_set(socket_set *sa, int64 usecs); static bool socket_has_input(socket_set *sa, int fd, int idx); +/* callback used to build rows for COPY during data loading */ +typedef void (*initRowMethod) (PQExpBufferData *sql, int64 curr); /* callback functions for our flex lexer */ static const PsqlScanCallbacks pgbench_callbacks = { @@ -879,7 +875,14 @@ usage(void) "\nInitialization options:\n" " -i, --initialize invokes initialization mode\n" " -I, --init-steps=[" ALL_INIT_STEPS "]+ (default \"" DEFAULT_INIT_STEPS "\")\n" - " run selected initialization steps\n" + " run selected initialization steps, in the specified order\n" + " d: drop any existing pgbench tables\n" + " t: create the tables used by the standard pgbench scenario\n" + " g: generate data, client-side\n" + " G: generate data, server-side\n" + " v: invoke VACUUM on the standard tables\n" + " p: create primary key indexes on the standard tables\n" + " f: create foreign keys between the standard tables\n" " -F, --fillfactor=NUM set fill factor\n" " -n, --no-vacuum do not run VACUUM during initialization\n" " -q, --quiet quiet logging (one message each 5 seconds)\n" @@ -919,6 +922,7 @@ usage(void) " -T, --time=NUM duration of benchmark test in seconds\n" " -v, --vacuum-all vacuum all four standard tables before tests\n" " --aggregate-interval=NUM aggregate data over NUM seconds\n" + " --exit-on-abort exit when any client is aborted\n" " --failures-detailed report the failures grouped by basic types\n" " --log-prefix=PREFIX prefix for transaction time log file\n" " (default: \"pgbench_log\")\n" @@ -929,7 +933,8 @@ usage(void) " --show-script=NAME show builtin script code, then exit\n" " --verbose-errors print messages of all errors\n" "\nCommon options:\n" - " -d, --debug print debugging output\n" + " --debug print debugging output\n" + " -d, --dbname=DBNAME database name to connect to\n" " -h, --host=HOSTNAME database server host or socket directory\n" " -p, --port=PORT database server port number\n" " -U, --username=USERNAME connect as specified database user\n" @@ -2247,10 +2252,15 @@ evalStandardFunc(CState *st, { /* evaluate all function arguments */ int nargs = 0; - PgBenchValue vargs[MAX_FARGS]; PgBenchExprLink *l = args; bool has_null = false; + /* + * This value is double braced to workaround GCC bug 53119, which seems to + * exist at least on gcc (Debian 4.7.2-5) 4.7.2, 32-bit. + */ + PgBenchValue vargs[MAX_FARGS] = {{0}}; + for (nargs = 0; nargs < MAX_FARGS && l != NULL; nargs++, l = l->next) { if (!evaluateExpr(st, l->expr, &vargs[nargs])) @@ -2895,6 +2905,8 @@ getMetaCommand(const char *cmd) mc = META_ASET; else if (pg_strcasecmp(cmd, "startpipeline") == 0) mc = META_STARTPIPELINE; + else if (pg_strcasecmp(cmd, "syncpipeline") == 0) + mc = META_SYNCPIPELINE; else if (pg_strcasecmp(cmd, "endpipeline") == 0) mc = META_ENDPIPELINE; else @@ -3310,8 +3322,10 @@ readCommandResponse(CState *st, MetaCommand meta, char *varprefix) break; case PGRES_PIPELINE_SYNC: - pg_log_debug("client %d pipeline ending", st->id); - if (PQexitPipelineMode(st->con) != 1) + pg_log_debug("client %d pipeline ending, ongoing syncs: %d", + st->id, st->num_syncs); + st->num_syncs--; + if (st->num_syncs == 0 && PQexitPipelineMode(st->con) != 1) pg_log_error("client %d failed to exit pipeline mode: %s", st->id, PQerrorMessage(st->con)); break; @@ -3756,10 +3770,21 @@ advanceConnectionState(TState *thread, CState *st, StatsData *agg) case CSTATE_START_COMMAND: command = sql_script[st->use_file].commands[st->command]; - /* Transition to script end processing if done */ + /* + * Transition to script end processing if done, but close up + * shop if a pipeline is open at this point. + */ if (command == NULL) { - st->state = CSTATE_END_TX; + if (PQpipelineStatus(st->con) == PQ_PIPELINE_OFF) + st->state = CSTATE_END_TX; + else + { + pg_log_error("client %d aborted: end of script reached with pipeline open", + st->id); + st->state = CSTATE_ABORTED; + } + break; } @@ -3854,8 +3879,14 @@ advanceConnectionState(TState *thread, CState *st, StatsData *agg) switch (conditional_stack_peek(st->cstack)) { case IFSTATE_FALSE: - if (command->meta == META_IF || - command->meta == META_ELIF) + if (command->meta == META_IF) + { + /* nested if in skipped branch - ignore */ + conditional_stack_push(st->cstack, + IFSTATE_IGNORED); + st->command++; + } + else if (command->meta == META_ELIF) { /* we must evaluate the condition */ st->state = CSTATE_START_COMMAND; @@ -3874,11 +3905,7 @@ advanceConnectionState(TState *thread, CState *st, StatsData *agg) conditional_stack_pop(st->cstack); if (conditional_active(st->cstack)) st->state = CSTATE_START_COMMAND; - - /* - * else state remains in - * CSTATE_SKIP_COMMAND - */ + /* else state remains CSTATE_SKIP_COMMAND */ st->command++; } break; @@ -4431,6 +4458,20 @@ executeMetaCommand(CState *st, pg_time_usec_t *now) return CSTATE_ABORTED; } } + else if (command->meta == META_SYNCPIPELINE) + { + if (PQpipelineStatus(st->con) != PQ_PIPELINE_ON) + { + commandFailed(st, "syncpipeline", "not in pipeline mode"); + return CSTATE_ABORTED; + } + if (PQsendPipelineSync(st->con) == 0) + { + commandFailed(st, "syncpipeline", "failed to send a pipeline sync"); + return CSTATE_ABORTED; + } + st->num_syncs++; + } else if (command->meta == META_ENDPIPELINE) { if (PQpipelineStatus(st->con) != PQ_PIPELINE_ON) @@ -4443,6 +4484,7 @@ executeMetaCommand(CState *st, pg_time_usec_t *now) commandFailed(st, "endpipeline", "failed to send a pipeline sync"); return CSTATE_ABORTED; } + st->num_syncs++; /* Now wait for the PGRES_PIPELINE_SYNC and exit pipeline mode there */ /* collect pending results before getting out of pipeline mode */ return CSTATE_WAIT_RESULT; @@ -4869,17 +4911,46 @@ initTruncateTables(PGconn *con) "pgbench_tellers"); } -/* - * Fill the standard tables with some data generated and sent from the client - */ static void -initGenerateDataClientSide(PGconn *con) +initBranch(PQExpBufferData *sql, int64 curr) { - PQExpBufferData sql; - PGresult *res; - int i; + /* "filler" column uses NULL */ + printfPQExpBuffer(sql, + INT64_FORMAT "\t0\t\\N\n", + curr + 1); +} + +static void +initTeller(PQExpBufferData *sql, int64 curr) +{ + /* "filler" column uses NULL */ + printfPQExpBuffer(sql, + INT64_FORMAT "\t" INT64_FORMAT "\t0\t\\N\n", + curr + 1, curr / ntellers + 1); +} + +static void +initAccount(PQExpBufferData *sql, int64 curr) +{ + /* "filler" column defaults to blank padded empty string */ + printfPQExpBuffer(sql, + INT64_FORMAT "\t" INT64_FORMAT "\t0\t\n", + curr + 1, curr / naccounts + 1); +} + +static void +initPopulateTable(PGconn *con, const char *table, int64 base, + initRowMethod init_row) +{ + int n; int64 k; - char *copy_statement; + int chars = 0; + int prev_chars = 0; + PGresult *res; + PQExpBufferData sql; + char copy_statement[256]; + const char *copy_statement_fmt = "copy %s from stdin"; + int64 total = base * scale; /* used to track elapsed time and estimate of the remaining time */ pg_time_usec_t start; @@ -4888,50 +4959,24 @@ initGenerateDataClientSide(PGconn *con) /* Stay on the same line if reporting to a terminal */ char eol = isatty(fileno(stderr)) ? '\r' : '\n'; - fprintf(stderr, "generating data (client-side)...\n"); - - /* - * we do all of this in one transaction to enable the backend's - * data-loading optimizations - */ - executeStatement(con, "begin"); - - /* truncate away any old data */ - initTruncateTables(con); - initPQExpBuffer(&sql); /* - * fill branches, tellers, accounts in that order in case foreign keys - * already exist + * Use COPY with FREEZE on v14 and later for all the tables except + * pgbench_accounts when it is partitioned. */ - for (i = 0; i < nbranches * scale; i++) - { - /* "filler" column defaults to NULL */ - printfPQExpBuffer(&sql, - "insert into pgbench_branches(bid,bbalance) values(%d,0)", - i + 1); - executeStatement(con, sql.data); - } - - for (i = 0; i < ntellers * scale; i++) + if (PQserverVersion(con) >= 140000) { - /* "filler" column defaults to NULL */ - printfPQExpBuffer(&sql, - "insert into pgbench_tellers(tid,bid,tbalance) values (%d,%d,0)", - i + 1, i / ntellers + 1); - executeStatement(con, sql.data); + if (strcmp(table, "pgbench_accounts") != 0 || + partitions == 0) + copy_statement_fmt = "copy %s from stdin with (freeze on)"; } - /* - * accounts is big enough to be worth using COPY and tracking runtime - */ - - /* use COPY with FREEZE on v14 and later without partitioning */ - if (partitions == 0 && PQserverVersion(con) >= 140000) - copy_statement = "copy pgbench_accounts from stdin with (freeze on)"; - else - copy_statement = "copy pgbench_accounts from stdin"; + n = pg_snprintf(copy_statement, sizeof(copy_statement), copy_statement_fmt, table); + if (n >= sizeof(copy_statement)) + pg_fatal("invalid buffer size: must be at least %d characters long", n); + else if (n == -1) + pg_fatal("invalid format string"); res = PQexec(con, copy_statement); @@ -4941,14 +4986,11 @@ initGenerateDataClientSide(PGconn *con) start = pg_time_now(); - for (k = 0; k < (int64) naccounts * scale; k++) + for (k = 0; k < total; k++) { int64 j = k + 1; - /* "filler" column defaults to blank padded empty string */ - printfPQExpBuffer(&sql, - INT64_FORMAT "\t" INT64_FORMAT "\t%d\t\n", - j, k / naccounts + 1, 0); + init_row(&sql, k); if (PQputline(con, sql.data)) pg_fatal("PQputline failed"); @@ -4962,25 +5004,46 @@ initGenerateDataClientSide(PGconn *con) if ((!use_quiet) && (j % 100000 == 0)) { double elapsed_sec = PG_TIME_GET_DOUBLE(pg_time_now() - start); - double remaining_sec = ((double) scale * naccounts - j) * elapsed_sec / j; + double remaining_sec = ((double) total - j) * elapsed_sec / j; - fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)%c", - j, (int64) naccounts * scale, - (int) (((int64) j * 100) / (naccounts * (int64) scale)), - elapsed_sec, remaining_sec, eol); + chars = fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) of %s done (elapsed %.2f s, remaining %.2f s)", + j, total, + (int) ((j * 100) / total), + table, elapsed_sec, remaining_sec); + + /* + * If the previous progress message is longer than the current + * one, add spaces to the current line to fully overwrite any + * remaining characters from the previous message. + */ + if (prev_chars > chars) + fprintf(stderr, "%*c", prev_chars - chars, ' '); + fputc(eol, stderr); + prev_chars = chars; } /* let's not call the timing for each row, but only each 100 rows */ else if (use_quiet && (j % 100 == 0)) { double elapsed_sec = PG_TIME_GET_DOUBLE(pg_time_now() - start); - double remaining_sec = ((double) scale * naccounts - j) * elapsed_sec / j; + double remaining_sec = ((double) total - j) * elapsed_sec / j; /* have we reached the next interval (or end)? */ - if ((j == scale * naccounts) || (elapsed_sec >= log_interval * LOG_STEP_SECONDS)) + if ((j == total) || (elapsed_sec >= log_interval * LOG_STEP_SECONDS)) { - fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) done (elapsed %.2f s, remaining %.2f s)%c", - j, (int64) naccounts * scale, - (int) (((int64) j * 100) / (naccounts * (int64) scale)), elapsed_sec, remaining_sec, eol); + chars = fprintf(stderr, INT64_FORMAT " of " INT64_FORMAT " tuples (%d%%) of %s done (elapsed %.2f s, remaining %.2f s)", + j, total, + (int) ((j * 100) / total), + table, elapsed_sec, remaining_sec); + + /* + * If the previous progress message is longer than the current + * one, add spaces to the current line to fully overwrite any + * remaining characters from the previous message. + */ + if (prev_chars > chars) + fprintf(stderr, "%*c", prev_chars - chars, ' '); + fputc(eol, stderr); + prev_chars = chars; /* skip to the next interval */ log_interval = (int) ceil(elapsed_sec / LOG_STEP_SECONDS); @@ -4988,8 +5051,8 @@ initGenerateDataClientSide(PGconn *con) } } - if (eol != '\n') - fputc('\n', stderr); /* Need to move to next line */ + if (chars != 0 && eol != '\n') + fprintf(stderr, "%*c\r", chars, ' '); /* Clear the current line */ if (PQputline(con, "\\.\n")) pg_fatal("very last PQputline failed"); @@ -4997,6 +5060,35 @@ initGenerateDataClientSide(PGconn *con) pg_fatal("PQendcopy failed"); termPQExpBuffer(&sql); +} + +/* + * Fill the standard tables with some data generated and sent from the client. + * + * The filler column is NULL in pgbench_branches and pgbench_tellers, and is + * a blank-padded string in pgbench_accounts. + */ +static void +initGenerateDataClientSide(PGconn *con) +{ + fprintf(stderr, "generating data (client-side)...\n"); + + /* + * we do all of this in one transaction to enable the backend's + * data-loading optimizations + */ + executeStatement(con, "begin"); + + /* truncate away any old data */ + initTruncateTables(con); + + /* + * fill branches, tellers, accounts in that order in case foreign keys + * already exist + */ + initPopulateTable(con, "pgbench_branches", nbranches, initBranch); + initPopulateTable(con, "pgbench_tellers", ntellers, initTeller); + initPopulateTable(con, "pgbench_accounts", naccounts, initAccount); executeStatement(con, "commit"); } @@ -5307,7 +5399,7 @@ GetTableInfo(PGconn *con, bool scale_given) * This case is unlikely as pgbench already found "pgbench_branches" * above to compute the scale. */ - pg_log_error("no pgbench_accounts table found in search_path"); + pg_log_error("no pgbench_accounts table found in \"search_path\""); pg_log_error_hint("Perhaps you need to do initialization (\"pgbench -i\") in database \"%s\".", PQdb(con)); exit(1); } @@ -5747,7 +5839,8 @@ process_backslash_command(PsqlScanState sstate, const char *source) } else if (my_command->meta == META_ELSE || my_command->meta == META_ENDIF || my_command->meta == META_STARTPIPELINE || - my_command->meta == META_ENDPIPELINE) + my_command->meta == META_ENDPIPELINE || + my_command->meta == META_SYNCPIPELINE) { if (my_command->argc != 1) syntax_error(source, lineno, my_command->first_line, my_command->argv[0], @@ -6551,7 +6644,7 @@ main(int argc, char **argv) {"builtin", required_argument, NULL, 'b'}, {"client", required_argument, NULL, 'c'}, {"connect", no_argument, NULL, 'C'}, - {"debug", no_argument, NULL, 'd'}, + {"dbname", required_argument, NULL, 'd'}, {"define", required_argument, NULL, 'D'}, {"file", required_argument, NULL, 'f'}, {"fillfactor", required_argument, NULL, 'F'}, @@ -6591,6 +6684,8 @@ main(int argc, char **argv) {"failures-detailed", no_argument, NULL, 13}, {"max-tries", required_argument, NULL, 14}, {"verbose-errors", no_argument, NULL, 15}, + {"exit-on-abort", no_argument, NULL, 16}, + {"debug", no_argument, NULL, 17}, {NULL, 0, NULL, 0} }; @@ -6662,7 +6757,7 @@ main(int argc, char **argv) if (!set_random_seed(getenv("PGBENCH_RANDOM_SEED"))) pg_fatal("error while setting random seed from PGBENCH_RANDOM_SEED environment variable"); - while ((c = getopt_long(argc, argv, "b:c:CdD:f:F:h:iI:j:lL:M:nNp:P:qrR:s:St:T:U:v", long_options, &optindex)) != -1) + while ((c = getopt_long(argc, argv, "b:c:Cd:D:f:F:h:iI:j:lL:M:nNp:P:qrR:s:St:T:U:v", long_options, &optindex)) != -1) { char *script; @@ -6703,7 +6798,7 @@ main(int argc, char **argv) is_connect = true; break; case 'd': - pg_logging_increase_verbosity(); + dbName = pg_strdup(optarg); break; case 'D': { @@ -6749,10 +6844,6 @@ main(int argc, char **argv) { exit(1); } -#ifndef ENABLE_THREAD_SAFETY - if (nthreads != 1) - pg_fatal("threads are not supported on this platform; use -j1"); -#endif /* !ENABLE_THREAD_SAFETY */ break; case 'l': benchmarking_option_set = true; @@ -6928,6 +7019,13 @@ main(int argc, char **argv) benchmarking_option_set = true; verbose_errors = true; break; + case 16: /* exit-on-abort */ + benchmarking_option_set = true; + exit_on_abort = true; + break; + case 17: /* debug */ + pg_logging_increase_verbosity(); + break; default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -6978,16 +7076,19 @@ main(int argc, char **argv) */ throttle_delay *= nthreads; - if (argc > optind) - dbName = argv[optind++]; - else + if (dbName == NULL) { - if ((env = getenv("PGDATABASE")) != NULL && *env != '\0') - dbName = env; - else if ((env = getenv("PGUSER")) != NULL && *env != '\0') - dbName = env; + if (argc > optind) + dbName = argv[optind++]; else - dbName = get_user_name_or_exit(progname); + { + if ((env = getenv("PGDATABASE")) != NULL && *env != '\0') + dbName = env; + else if ((env = getenv("PGUSER")) != NULL && *env != '\0') + dbName = env; + else + dbName = get_user_name_or_exit(progname); + } } if (optind < argc) @@ -7236,7 +7337,6 @@ main(int argc, char **argv) if (errno != 0) pg_fatal("could not initialize barrier: %m"); -#ifdef ENABLE_THREAD_SAFETY /* start all threads but thread 0 which is executed directly later */ for (i = 1; i < nthreads; i++) { @@ -7248,9 +7348,6 @@ main(int argc, char **argv) if (errno != 0) pg_fatal("could not create thread: %m"); } -#else - Assert(nthreads == 1); -#endif /* ENABLE_THREAD_SAFETY */ /* compute when to stop */ threads[0].create_time = pg_time_now(); @@ -7268,10 +7365,8 @@ main(int argc, char **argv) { TState *thread = &threads[i]; -#ifdef ENABLE_THREAD_SAFETY if (i > 0) THREAD_JOIN(thread->thread); -#endif /* ENABLE_THREAD_SAFETY */ for (int j = 0; j < thread->nstate; j++) if (thread->state[j].state != CSTATE_FINISHED) @@ -7542,11 +7637,19 @@ threadRun(void *arg) advanceConnectionState(thread, st, &aggs); + /* + * If --exit-on-abort is used, the program is going to exit when + * any client is aborted. + */ + if (exit_on_abort && st->state == CSTATE_ABORTED) + goto done; + /* * If advanceConnectionState changed client to finished state, * that's one fewer client that remains. */ - if (st->state == CSTATE_FINISHED || st->state == CSTATE_ABORTED) + else if (st->state == CSTATE_FINISHED || + st->state == CSTATE_ABORTED) remains--; } @@ -7579,6 +7682,22 @@ threadRun(void *arg) } done: + if (exit_on_abort) + { + /* + * Abort if any client is not finished, meaning some error occurred. + */ + for (int i = 0; i < nstate; i++) + { + if (state[i].state != CSTATE_FINISHED) + { + pg_log_error("Run was aborted due to an error in thread %d", + thread->tid); + exit(2); + } + } + } + disconnect_all(state, nstate); if (thread->logfile) @@ -7782,14 +7901,23 @@ clear_socket_set(socket_set *sa) static void add_socket_to_set(socket_set *sa, int fd, int idx) { + /* See connect_slot() for background on this code. */ +#ifdef WIN32 + if (sa->fds.fd_count + 1 >= FD_SETSIZE) + { + pg_log_error("too many concurrent database clients for this platform: %d", + sa->fds.fd_count + 1); + exit(1); + } +#else if (fd < 0 || fd >= FD_SETSIZE) { - /* - * Doing a hard exit here is a bit grotty, but it doesn't seem worth - * complicating the API to make it less grotty. - */ - pg_fatal("too many client connections for select()"); + pg_log_error("socket file descriptor out of range for select(): %d", + fd); + pg_log_error_hint("Try fewer concurrent database clients."); + exit(1); } +#endif FD_SET(fd, &sa->fds); if (fd > sa->maxfd) sa->maxfd = fd; diff --git a/src/bin/pgbench/pgbench.h b/src/bin/pgbench/pgbench.h index 957c9ca9dad9b..177f218c223c7 100644 --- a/src/bin/pgbench/pgbench.h +++ b/src/bin/pgbench/pgbench.h @@ -2,7 +2,7 @@ * * pgbench.h * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * *------------------------------------------------------------------------- @@ -33,11 +33,11 @@ union YYSTYPE; */ typedef enum { - PGBT_NO_VALUE, + PGBT_NO_VALUE = 0, PGBT_NULL, PGBT_INT, PGBT_DOUBLE, - PGBT_BOOLEAN + PGBT_BOOLEAN, /* add other types here */ } PgBenchValueType; @@ -58,7 +58,7 @@ typedef enum PgBenchExprType { ENODE_CONSTANT, ENODE_VARIABLE, - ENODE_FUNCTION + ENODE_FUNCTION, } PgBenchExprType; /* List of operators and callable functions */ @@ -100,7 +100,7 @@ typedef enum PgBenchFunction PGBENCH_CASE, PGBENCH_HASH_FNV1A, PGBENCH_HASH_MURMUR2, - PGBENCH_PERMUTE + PGBENCH_PERMUTE, } PgBenchFunction; typedef struct PgBenchExpr PgBenchExpr; diff --git a/src/bin/pgbench/t/001_pgbench_with_server.pl b/src/bin/pgbench/t/001_pgbench_with_server.pl index f8ca8a922d172..65ffa4468f30e 100644 --- a/src/bin/pgbench/t/001_pgbench_with_server.pl +++ b/src/bin/pgbench/t/001_pgbench_with_server.pl @@ -1,13 +1,42 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; +# Check the initial state of the data generated. Tables for tellers and +# branches use NULL for their filler attribute. The table accounts uses +# a non-NULL filler. The history table should have no data. +sub check_data_state +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my $node = shift; + my $type = shift; + + my $sql_result = $node->safe_psql('postgres', + 'SELECT count(*) AS null_count FROM pgbench_accounts WHERE filler IS NULL LIMIT 10;' + ); + is($sql_result, '0', + "$type: filler column of pgbench_accounts has no NULL data"); + $sql_result = $node->safe_psql('postgres', + 'SELECT count(*) AS null_count FROM pgbench_branches WHERE filler IS NULL;' + ); + is($sql_result, '1', + "$type: filler column of pgbench_branches has only NULL data"); + $sql_result = $node->safe_psql('postgres', + 'SELECT count(*) AS null_count FROM pgbench_tellers WHERE filler IS NULL;' + ); + is($sql_result, '10', + "$type: filler column of pgbench_tellers has only NULL data"); + $sql_result = $node->safe_psql('postgres', + 'SELECT count(*) AS data_count FROM pgbench_history;'); + is($sql_result, '0', "$type: pgbench_history has no data"); +} + # start a pgbench specific server my $node = PostgreSQL::Test::Cluster->new('main'); # Set to untranslated messages, to be able to compare program output with @@ -39,6 +68,34 @@ "CREATE TYPE pg_temp.e AS ENUM ($labels); DROP TYPE pg_temp.e;" }); +# Test inplace updates from VACUUM concurrent with heap_update from GRANT. +# The PROC_IN_VACUUM environment can't finish MVCC table scans consistently, +# so this fails rarely. To reproduce consistently, add a sleep after +# GetCatalogSnapshot(non-catalog-rel). +Test::More->builder->todo_start('PROC_IN_VACUUM scan breakage'); +$node->safe_psql('postgres', 'CREATE TABLE ddl_target ()'); +$node->pgbench( + '--no-vacuum --client=5 --protocol=prepared --transactions=50', + 0, + [qr{processed: 250/250}], + [qr{^$}], + 'concurrent GRANT/VACUUM', + { + '001_pgbench_grant@9' => q( + DO $$ + BEGIN + PERFORM pg_advisory_xact_lock(42); + FOR i IN 1 .. 10 LOOP + GRANT SELECT ON ddl_target TO PUBLIC; + REVOKE SELECT ON ddl_target FROM PUBLIC; + END LOOP; + END + $$; +), + '001_pgbench_vacuum_ddl_target@1' => "VACUUM ddl_target;", + }); +Test::More->builder->todo_end; + # Trigger various connection errors $node->pgbench( 'no-such-database', @@ -67,6 +124,9 @@ ], 'pgbench scale 1 initialization',); +# Check data state, after client-side data generation. +check_data_state($node, 'client-side'); + # Again, with all possible options $node->pgbench( '--initialize --init-steps=dtpvg --scale=1 --unlogged-tables --fillfactor=98 --foreign-keys --quiet --tablespace=regress_pgbench_tap_1_ts --index-tablespace=regress_pgbench_tap_1_ts --partitions=2 --partition-method=hash', @@ -101,6 +161,9 @@ ], 'pgbench --init-steps'); +# Check data state, after server-side data generation. +check_data_state($node, 'server-side'); + # Run all builtin scripts, for a few transactions each $node->pgbench( '--transactions=5 -Dfoo=bla --client=2 --protocol=simple --builtin=t' @@ -255,7 +318,7 @@ my $log = PostgreSQL::Test::Utils::slurp_file($node->logfile); unlike( $log, - qr[DETAIL: parameters: \$1 = '\{ invalid ',], + qr[DETAIL: Parameters: \$1 = '\{ invalid ',], "no parameters logged"); $log = undef; @@ -296,7 +359,7 @@ $log = PostgreSQL::Test::Utils::slurp_file($node->logfile); like( $log, - qr[DETAIL: parameters: \$1 = '\{ invalid ', \$2 = '''Valame Dios!'' dijo Sancho; ''no le dije yo a vuestra merced que mirase bien lo que hacia\?'''], + qr[DETAIL: Parameters: \$1 = '\{ invalid ', \$2 = '''Valame Dios!'' dijo Sancho; ''no le dije yo a vuestra merced que mirase bien lo que hacia\?'''], "parameter report does not truncate"); $log = undef; @@ -341,7 +404,7 @@ $log = PostgreSQL::Test::Utils::slurp_file($node->logfile); like( $log, - qr[DETAIL: parameters: \$1 = '\{ inval\.\.\.', \$2 = '''Valame\.\.\.'], + qr[DETAIL: Parameters: \$1 = '\{ inval\.\.\.', \$2 = '''Valame\.\.\.'], "parameter report truncates"); $log = undef; @@ -605,6 +668,56 @@ } }); +# test nested \if constructs +$node->pgbench( + '--no-vacuum --client=1 --exit-on-abort --transactions=1', + 0, + [qr{actually processed}], + [qr{^$}], + 'nested ifs', + { + 'pgbench_nested_if' => q( + \if false + SELECT 1 / 0; + \if true + SELECT 1 / 0; + \elif true + SELECT 1 / 0; + \else + SELECT 1 / 0; + \endif + SELECT 1 / 0; + \elif false + \if true + SELECT 1 / 0; + \elif true + SELECT 1 / 0; + \else + SELECT 1 / 0; + \endif + \else + \if false + SELECT 1 / 0; + \elif false + SELECT 1 / 0; + \else + SELECT 'correct'; + \endif + \endif + \if true + SELECT 'correct'; + \else + \if true + SELECT 1 / 0; + \elif true + SELECT 1 / 0; + \else + SELECT 1 / 0; + \endif + \endif + ) + }); + # random determinism when seeded $node->safe_psql('postgres', 'CREATE UNLOGGED TABLE seeded_random(seed INT8 NOT NULL, rand TEXT NOT NULL, val INTEGER NOT NULL);' @@ -779,6 +892,27 @@ } }); +# Working \startpipeline with \syncpipeline +$node->pgbench( + '-t 1 -n -M extended', + 0, + [ qr{type: .*/001_pgbench_pipeline_sync}, qr{actually processed: 1/1} ], + [], + 'working \startpipeline with \syncpipeline', + { + '001_pgbench_pipeline_sync' => q{ +-- test startpipeline +\startpipeline +select 1; +\syncpipeline +\syncpipeline +select 2; +\syncpipeline +select 3; +\endpipeline +} + }); + # Working \startpipeline in prepared query mode $node->pgbench( '-t 1 -n -M prepared', @@ -841,9 +975,52 @@ } }); +# Try \startpipeline without \endpipeline in a single transaction +$node->pgbench( + '-t 1 -n -M extended', + 2, + [], + [qr{end of script reached with pipeline open}], + 'error: call \startpipeline without \endpipeline in a single transaction', + { + '001_pgbench_pipeline_5' => q{ +-- startpipeline only with single transaction +\startpipeline +} + }); + +# Try \startpipeline without \endpipeline +$node->pgbench( + '-t 2 -n -M extended', + 2, + [], + [qr{end of script reached with pipeline open}], + 'error: call \startpipeline without \endpipeline', + { + '001_pgbench_pipeline_6' => q{ +-- startpipeline only +\startpipeline +} + }); + +# Try \startpipeline with \syncpipeline without \endpipeline +$node->pgbench( + '-t 2 -n -M extended', + 2, + [], + [qr{end of script reached with pipeline open}], + 'error: call \startpipeline and \syncpipeline without \endpipeline', + { + '001_pgbench_pipeline_7' => q{ +-- startpipeline with \syncpipeline only +\startpipeline +\syncpipeline +} + }); + # Working \startpipeline in prepared query mode with serializable $node->pgbench( - '-c4 -j2 -t 10 -n -M prepared', + '-c4 -t 10 -n -M prepared', 0, [ qr{type: .*/001_pgbench_pipeline_serializable}, @@ -1253,7 +1430,7 @@ sub check_pgbench_logs . "\\1"; $node->pgbench( - "-n -c 2 -t 1 -d --verbose-errors --max-tries 2", + "-n -c 2 -t 1 --debug --verbose-errors --max-tries 2", 0, [ qr{processed: 2/2\b}, @@ -1440,6 +1617,27 @@ BEGIN # Clean up $node->safe_psql('postgres', 'DROP TABLE first_client_table, xy;'); +# Test --exit-on-abort +$node->safe_psql('postgres', + 'CREATE TABLE counter(i int); ' . 'INSERT INTO counter VALUES (0);'); + +$node->pgbench( + '-t 10 -c 2 -j 2 --exit-on-abort', + 2, + [], + [ qr{division by zero}, qr{Run was aborted due to an error in thread} ], + 'test --exit-on-abort', + { + '001_exit_on_abort' => q{ +update counter set i = i+1 returning i \gset +\if :i = 5 +\set y 1/0 +\endif +} + }); + +# Clean up +$node->safe_psql('postgres', 'DROP TABLE counter;'); # done $node->safe_psql('postgres', 'DROP TABLESPACE regress_pgbench_tap_1_ts'); diff --git a/src/bin/pgbench/t/002_pgbench_no_server.pl b/src/bin/pgbench/t/002_pgbench_no_server.pl index 0ec54fbb03304..a04b3531f42d3 100644 --- a/src/bin/pgbench/t/002_pgbench_no_server.pl +++ b/src/bin/pgbench/t/002_pgbench_no_server.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # # pgbench tests which do not need a server # use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; @@ -38,7 +38,6 @@ sub pgbench_scripts my ($opts, $stat, $out, $err, $name, $files) = @_; my @cmd = ('pgbench', split /\s+/, $opts); - my @filenames = (); if (defined $files) { for my $fn (sort keys %$files) @@ -67,7 +66,7 @@ sub pgbench_scripts # name, options, stderr checks [ 'bad option', - '-h home -p 5432 -U calvin -d --bad-option', + '-h home -p 5432 -U calvin ---debug --bad-option', [qr{--help.*more information}] ], [ diff --git a/src/bin/pgevent/Makefile b/src/bin/pgevent/Makefile index 9987d11f2bfc3..c2207a0f4b599 100644 --- a/src/bin/pgevent/Makefile +++ b/src/bin/pgevent/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/pgevent # -# Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Copyright (c) 1996-2024, PostgreSQL Global Development Group # #------------------------------------------------------------------------- diff --git a/src/bin/pgevent/meson.build b/src/bin/pgevent/meson.build index eca930ae47213..f7422438664dc 100644 --- a/src/bin/pgevent/meson.build +++ b/src/bin/pgevent/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if host_system != 'windows' subdir_done() @@ -14,19 +14,18 @@ pgevent_sources += rc_bin_gen.process(win32ver_rc, extra_args: [ pgevent_sources += windows.compile_resources('pgmsgevent.rc') -# FIXME: copied from Mkvcbuild.pm, but I don't think that's the right approach +# XXX: We may want to revisit the addition of this flag and improve the +# way symbols are exported. pgevent_link_args = [] if cc.get_id() == 'msvc' pgevent_link_args += '/ignore:4104' endif -pgevent = shared_library('pgevent', +pgevent = shared_module('pgevent', pgevent_sources, dependencies: [frontend_code], link_args: pgevent_link_args, vs_module_defs: 'pgevent.def', - kwargs: default_lib_args + { - 'name_prefix': '', - }, + kwargs: default_mod_args, ) bin_targets += pgevent diff --git a/src/bin/psql/Makefile b/src/bin/psql/Makefile index 1f2bf0c6b0043..374c4c3ab8f83 100644 --- a/src/bin/psql/Makefile +++ b/src/bin/psql/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/psql # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/bin/psql/Makefile @@ -62,8 +62,6 @@ psqlscanslash.c: FLEXFLAGS = -Cfe -p -p psqlscanslash.c: FLEX_NO_BACKUP=yes psqlscanslash.c: FLEX_FIX_WARNING=yes -distprep: sql_help.h sql_help.c psqlscanslash.c - install: all installdirs $(INSTALL_PROGRAM) psql$(X) '$(DESTDIR)$(bindir)/psql$(X)' $(INSTALL_DATA) $(srcdir)/psqlrc.sample '$(DESTDIR)$(datadir)/psqlrc.sample' @@ -77,10 +75,6 @@ uninstall: clean distclean: rm -f psql$(X) $(OBJS) lex.backup rm -rf tmp_check - -# files removed here are supposed to be in the distribution tarball, -# so do not clean them in the clean/distclean rules -maintainer-clean: distclean rm -f sql_help.h sql_help.c psqlscanslash.c check: diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 511debbe81479..f3f8fd0765ac7 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/command.c */ @@ -53,7 +53,7 @@ typedef enum EditableObjectType { EditableFunction, - EditableView + EditableView, } EditableObjectType; /* local function declarations */ @@ -159,10 +159,11 @@ static void discard_query_text(PsqlScanState scan_state, ConditionalStack cstack static bool copy_previous_query(PQExpBuffer query_buf, PQExpBuffer previous_buf); static bool do_connect(enum trivalue reuse_previous_specification, char *dbname, char *user, char *host, char *port); +static void wait_until_connected(PGconn *conn); static bool do_edit(const char *filename_arg, PQExpBuffer query_buf, int lineno, bool discard_on_quit, bool *edited); static bool do_shell(const char *command); -static bool do_watch(PQExpBuffer query_buf, double sleep, int iter); +static bool do_watch(PQExpBuffer query_buf, double sleep, int iter, int min_rows); static bool lookup_object_oid(EditableObjectType obj_type, const char *desc, Oid *obj_oid); static bool get_create_object_cmd(EditableObjectType obj_type, Oid oid, @@ -470,7 +471,7 @@ exec_command_bind(PsqlScanState scan_state, bool active_branch) int nparams = 0; int nalloc = 0; - pset.bind_params = NULL; + clean_bind_state(); while ((opt = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, false))) { @@ -486,6 +487,8 @@ exec_command_bind(PsqlScanState scan_state, bool active_branch) pset.bind_nparams = nparams; pset.bind_flag = true; } + else + ignore_slash_options(scan_state); return status; } @@ -918,6 +921,8 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) free(pattern2); } + else if (cmd[2] == 'g') + success = describeRoleGrants(pattern, show_system); else status = PSQL_CMD_UNKNOWN; break; @@ -1105,7 +1110,7 @@ exec_command_edit(PsqlScanState scan_state, bool active_branch, expand_tilde(&fname); if (fname) { - canonicalize_path(fname); + canonicalize_path_enc(fname, pset.encoding); /* Always clear buffer if the file isn't modified */ discard_on_quit = true; } @@ -1125,6 +1130,14 @@ exec_command_edit(PsqlScanState scan_state, bool active_branch, else status = PSQL_CMD_ERROR; } + + /* + * On error while editing or if specifying an incorrect line + * number, reset the query buffer. + */ + if (status == PSQL_CMD_ERROR) + resetPQExpBuffer(query_buf); + free(fname); free(ln); } @@ -1237,6 +1250,13 @@ exec_command_ef_ev(PsqlScanState scan_state, bool active_branch, status = PSQL_CMD_NEWEDIT; } + /* + * On error while doing object lookup or while editing, or if + * specifying an incorrect line number, reset the query buffer. + */ + if (status == PSQL_CMD_ERROR) + resetPQExpBuffer(query_buf); + free(obj_desc); } else @@ -1316,6 +1336,7 @@ exec_command_encoding(PsqlScanState scan_state, bool active_branch) /* save encoding info into psql internal data */ pset.encoding = PQclientEncoding(pset.db); pset.popt.topt.encoding = pset.encoding; + setFmtEncoding(pset.encoding); SetVariable(pset.vars, "ENCODING", pg_encoding_to_char(pset.encoding)); } @@ -1623,18 +1644,7 @@ exec_command_help(PsqlScanState scan_state, bool active_branch) if (active_branch) { char *opt = psql_scan_slash_option(scan_state, - OT_WHOLE_LINE, NULL, false); - size_t len; - - /* strip any trailing spaces and semicolons */ - if (opt) - { - len = strlen(opt); - while (len > 0 && - (isspace((unsigned char) opt[len - 1]) - || opt[len - 1] == ';')) - opt[--len] = '\0'; - } + OT_WHOLE_LINE, NULL, true); helpSQL(opt, pset.popt.topt.pager); free(opt); @@ -2141,29 +2151,15 @@ exec_command_password(PsqlScanState scan_state, bool active_branch) } else { - char *encrypted_password; - - encrypted_password = PQencryptPasswordConn(pset.db, pw1, user, NULL); + PGresult *res = PQchangePassword(pset.db, user, pw1); - if (!encrypted_password) + if (PQresultStatus(res) != PGRES_COMMAND_OK) { pg_log_info("%s", PQerrorMessage(pset.db)); success = false; } - else - { - PGresult *res; - printfPQExpBuffer(&buf, "ALTER USER %s PASSWORD ", - fmtId(user)); - appendStringLiteralConn(&buf, encrypted_password, pset.db); - res = PSQLexec(buf.data); - if (!res) - success = false; - else - PQclear(res); - PQfreemem(encrypted_password); - } + PQclear(res); } free(user); @@ -2699,7 +2695,7 @@ exec_command_write(PsqlScanState scan_state, bool active_branch, } else { - canonicalize_path(fname); + canonicalize_path_enc(fname, pset.encoding); fd = fopen(fname, "w"); } if (!fd) @@ -2773,13 +2769,15 @@ exec_command_watch(PsqlScanState scan_state, bool active_branch, { bool have_sleep = false; bool have_iter = false; + bool have_min_rows = false; double sleep = 2; int iter = 0; + int min_rows = 0; /* * Parse arguments. We allow either an unlabeled interval or * "name=value", where name is from the set ('i', 'interval', 'c', - * 'count'). + * 'count', 'm', 'min_rows'). */ while (success) { @@ -2836,6 +2834,26 @@ exec_command_watch(PsqlScanState scan_state, bool active_branch, } } } + else if (strncmp("m=", opt, strlen("m=")) == 0 || + strncmp("min_rows=", opt, strlen("min_rows=")) == 0) + { + if (have_min_rows) + { + pg_log_error("\\watch: minimum row count specified more than once"); + success = false; + } + else + { + have_min_rows = true; + errno = 0; + min_rows = strtoint(valptr, &opt_end, 10); + if (min_rows <= 0 || *opt_end || errno == ERANGE) + { + pg_log_error("\\watch: incorrect minimum row count \"%s\"", valptr); + success = false; + } + } + } else { pg_log_error("\\watch: unrecognized parameter \"%s\"", opt); @@ -2872,7 +2890,7 @@ exec_command_watch(PsqlScanState scan_state, bool active_branch, /* If query_buf is empty, recall and execute previous query */ (void) copy_previous_query(query_buf, previous_buf); - success = do_watch(query_buf, sleep, iter); + success = do_watch(query_buf, sleep, iter, min_rows); } /* Reset the query buffer as though for \r */ @@ -3126,6 +3144,10 @@ ignore_slash_filepipe(PsqlScanState scan_state) * This *MUST* be used for inactive-branch processing of any slash command * that takes an OT_WHOLE_LINE option. Otherwise we might consume a different * amount of option text in active and inactive cases. + * + * Note: although callers might pass "semicolon" as either true or false, + * we need not duplicate that here, since it doesn't affect the amount of + * input text consumed. */ static void ignore_slash_whole_line(PsqlScanState scan_state) @@ -3575,11 +3597,12 @@ do_connect(enum trivalue reuse_previous_specification, values[paramnum] = NULL; /* Note we do not want libpq to re-expand the dbname parameter */ - n_conn = PQconnectdbParams(keywords, values, false); + n_conn = PQconnectStartParams(keywords, values, false); pg_free(keywords); pg_free(values); + wait_until_connected(n_conn); if (PQstatus(n_conn) == CONNECTION_OK) break; @@ -3728,6 +3751,72 @@ do_connect(enum trivalue reuse_previous_specification, return true; } +/* + * Processes the connection sequence described by PQconnectStartParams(). Don't + * worry about reporting errors in this function. Our caller will check the + * connection's status, and report appropriately. + */ +static void +wait_until_connected(PGconn *conn) +{ + bool forRead = false; + + while (true) + { + int rc; + int sock; + pg_usec_time_t end_time; + + /* + * On every iteration of the connection sequence, let's check if the + * user has requested a cancellation. + */ + if (cancel_pressed) + break; + + /* + * Do not assume that the socket remains the same across + * PQconnectPoll() calls. + */ + sock = PQsocket(conn); + if (sock == -1) + break; + + /* + * If the user sends SIGINT between the cancel_pressed check, and + * polling of the socket, it will not be recognized. Instead, we will + * just wait until the next step in the connection sequence or + * forever, which might require users to send SIGTERM or SIGQUIT. + * + * Some solutions would include the "self-pipe trick," using + * pselect(2) and ppoll(2), or using a timeout. + * + * The self-pipe trick requires a bit of code to setup. pselect(2) and + * ppoll(2) are not on all the platforms we support. The simplest + * solution happens to just be adding a timeout, so let's wait for 1 + * second and check cancel_pressed again. + */ + end_time = PQgetCurrentTimeUSec() + 1000000; + rc = PQsocketPoll(sock, forRead, !forRead, end_time); + if (rc == -1) + return; + + switch (PQconnectPoll(conn)) + { + case PGRES_POLLING_OK: + case PGRES_POLLING_FAILED: + return; + case PGRES_POLLING_READING: + forRead = true; + continue; + case PGRES_POLLING_WRITING: + forRead = false; + continue; + case PGRES_POLLING_ACTIVE: + pg_unreachable(); + } + } +} void connection_warnings(bool in_startup) @@ -3794,6 +3883,7 @@ printSSLInfo(void) const char *protocol; const char *cipher; const char *compression; + const char *alpn; if (!PQsslInUse(pset.db)) return; /* no SSL */ @@ -3801,11 +3891,13 @@ printSSLInfo(void) protocol = PQsslAttribute(pset.db, "protocol"); cipher = PQsslAttribute(pset.db, "cipher"); compression = PQsslAttribute(pset.db, "compression"); + alpn = PQsslAttribute(pset.db, "alpn"); - printf(_("SSL connection (protocol: %s, cipher: %s, compression: %s)\n"), + printf(_("SSL connection (protocol: %s, cipher: %s, compression: %s, ALPN: %s)\n"), protocol ? protocol : _("unknown"), cipher ? cipher : _("unknown"), - (compression && strcmp(compression, "off") != 0) ? _("on") : _("off")); + (compression && strcmp(compression, "off") != 0) ? _("on") : _("off"), + (alpn && alpn[0] != '\0') ? alpn : _("none")); } /* @@ -3865,6 +3957,8 @@ SyncVariables(void) pset.popt.topt.encoding = pset.encoding; pset.sversion = PQserverVersion(pset.db); + setFmtEncoding(pset.encoding); + SetVariable(pset.vars, "DBNAME", PQdb(pset.db)); SetVariable(pset.vars, "USER", PQuser(pset.db)); SetVariable(pset.vars, "HOST", PQhost(pset.db)); @@ -4207,7 +4301,7 @@ process_file(char *filename, bool use_relative_path) } else if (strcmp(filename, "-") != 0) { - canonicalize_path(filename); + canonicalize_path_enc(filename, pset.encoding); /* * If we were asked to resolve the pathname relative to the location @@ -4221,7 +4315,7 @@ process_file(char *filename, bool use_relative_path) strlcpy(relpath, pset.inputfile, sizeof(relpath)); get_parent_directory(relpath); join_path_components(relpath, relpath, filename); - canonicalize_path(relpath); + canonicalize_path_enc(relpath, pset.encoding); filename = relpath; } @@ -5140,9 +5234,13 @@ do_shell(const char *command) * * We break this out of exec_command to avoid having to plaster "volatile" * onto a bunch of exec_command's variables to silence stupider compilers. + * + * "sleep" is the amount of time to sleep during each loop, measured in + * seconds. The internals of this function should use "sleep_ms" for + * precise sleep time calculations. */ static bool -do_watch(PQExpBuffer query_buf, double sleep, int iter) +do_watch(PQExpBuffer query_buf, double sleep, int iter, int min_rows) { long sleep_ms = (long) (sleep * 1000); printQueryOpt myopt = pset.popt; @@ -5153,12 +5251,12 @@ do_watch(PQExpBuffer query_buf, double sleep, int iter) FILE *pagerpipe = NULL; int title_len; int res = 0; + bool done = false; #ifndef WIN32 sigset_t sigalrm_sigchld_sigint; sigset_t sigalrm_sigchld; sigset_t sigint; struct itimerval interval; - bool done = false; #endif if (!query_buf || query_buf->len <= 0) @@ -5240,7 +5338,6 @@ do_watch(PQExpBuffer query_buf, double sleep, int iter) if (!pagerpipe) myopt.topt.pager = 0; - /* * If there's a title in the user configuration, make sure we have room * for it in the title buffer. Allow 128 bytes for the timestamp plus 128 @@ -5250,7 +5347,8 @@ do_watch(PQExpBuffer query_buf, double sleep, int iter) title_len = (user_title ? strlen(user_title) : 0) + 256; title = pg_malloc(title_len); - for (;;) + /* Loop to run query and then sleep awhile */ + while (!done) { time_t timer; char timebuf[128]; @@ -5265,14 +5363,14 @@ do_watch(PQExpBuffer query_buf, double sleep, int iter) if (user_title) snprintf(title, title_len, _("%s\t%s (every %gs)\n"), - user_title, timebuf, sleep); + user_title, timebuf, sleep_ms / 1000.0); else snprintf(title, title_len, _("%s (every %gs)\n"), - timebuf, sleep); + timebuf, sleep_ms / 1000.0); myopt.title = title; /* Run the query and print out the result */ - res = PSQLexecWatch(query_buf->data, &myopt, pagerpipe); + res = PSQLexecWatch(query_buf->data, &myopt, pagerpipe, min_rows); /* * PSQLexecWatch handles the case where we can no longer repeat the @@ -5285,37 +5383,33 @@ do_watch(PQExpBuffer query_buf, double sleep, int iter) if (iter && (--iter <= 0)) break; + /* Quit if error on pager pipe (probably pager has quit) */ if (pagerpipe && ferror(pagerpipe)) break; - if (sleep == 0) + /* Tight loop, no wait needed */ + if (sleep_ms == 0) continue; #ifdef WIN32 /* - * Set up cancellation of 'watch' via SIGINT. We redo this each time - * through the loop since it's conceivable something inside - * PSQLexecWatch could change sigint_interrupt_jmp. - */ - if (sigsetjmp(sigint_interrupt_jmp, 1) != 0) - break; - - /* - * Enable 'watch' cancellations and wait a while before running the - * query again. Break the sleep into short intervals (at most 1s). + * Wait a while before running the query again. Break the sleep into + * short intervals (at most 1s); that's probably unnecessary since + * pg_usleep is interruptible on Windows, but it's cheap insurance. */ - sigint_interrupt_enabled = true; for (long i = sleep_ms; i > 0;) { long s = Min(i, 1000L); pg_usleep(s * 1000L); if (cancel_pressed) + { + done = true; break; + } i -= s; } - sigint_interrupt_enabled = false; #else /* sigwait() will handle SIGINT. */ sigprocmask(SIG_BLOCK, &sigint, NULL); @@ -5349,8 +5443,6 @@ do_watch(PQExpBuffer query_buf, double sleep, int iter) /* Unblock SIGINT so that slow queries can be interrupted. */ sigprocmask(SIG_UNBLOCK, &sigint, NULL); - if (done) - break; #endif } @@ -5393,16 +5485,16 @@ echo_hidden_command(const char *query) { if (pset.echo_hidden != PSQL_ECHO_HIDDEN_OFF) { - printf(_("********* QUERY **********\n" + printf(_("/******** QUERY *********/\n" "%s\n" - "**************************\n\n"), query); + "/************************/\n\n"), query); fflush(stdout); if (pset.logfile) { fprintf(pset.logfile, - _("********* QUERY **********\n" + _("/******** QUERY *********/\n" "%s\n" - "**************************\n\n"), query); + "/************************/\n\n"), query); fflush(pset.logfile); } diff --git a/src/bin/psql/command.h b/src/bin/psql/command.h index 9af85deeae1ad..b41065d5a966a 100644 --- a/src/bin/psql/command.h +++ b/src/bin/psql/command.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/command.h */ @@ -19,7 +19,7 @@ typedef enum _backslashResult PSQL_CMD_SKIP_LINE, /* keep building query */ PSQL_CMD_TERMINATE, /* quit program */ PSQL_CMD_NEWEDIT, /* query buffer was changed (e.g., via \e) */ - PSQL_CMD_ERROR /* the execution of the backslash command + PSQL_CMD_ERROR, /* the execution of the backslash command * resulted in an error */ } backslashResult; diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index 5973df2e39e2a..4a50eb1e672ef 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/common.c */ @@ -31,15 +31,14 @@ #include "settings.h" static bool DescribeQuery(const char *query, double *elapsed_msec); -static bool ExecQueryUsingCursor(const char *query, double *elapsed_msec); static int ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_gone_p, bool is_watch, + int min_rows, const printQueryOpt *opt, FILE *printQueryFout); static bool command_no_begin(const char *query); -static bool is_select_command(const char *query); /* @@ -82,6 +81,46 @@ openQueryOutputFile(const char *fname, FILE **fout, bool *is_pipe) return true; } +/* + * Check if an output stream for \g needs to be opened, and if yes, + * open it and update the caller's gfile_fout and is_pipe state variables. + * Return true if OK, false if an error occurred. + */ +static bool +SetupGOutput(FILE **gfile_fout, bool *is_pipe) +{ + /* If there is a \g file or program, and it's not already open, open it */ + if (pset.gfname != NULL && *gfile_fout == NULL) + { + if (openQueryOutputFile(pset.gfname, gfile_fout, is_pipe)) + { + if (*is_pipe) + disable_sigpipe_trap(); + } + else + return false; + } + return true; +} + +/* + * Close the output stream for \g, if we opened it. + */ +static void +CloseGOutput(FILE *gfile_fout, bool is_pipe) +{ + if (gfile_fout) + { + if (is_pipe) + { + SetShellResultVariables(pclose(gfile_fout)); + restore_sigpipe_trap(); + } + else + fclose(gfile_fout); + } +} + /* * setQFout * -- handler for -o command line option and \o command @@ -372,6 +411,7 @@ AcceptResult(const PGresult *result, bool show_error) { case PGRES_COMMAND_OK: case PGRES_TUPLES_OK: + case PGRES_TUPLES_CHUNK: case PGRES_EMPTY_QUERY: case PGRES_COPY_IN: case PGRES_COPY_OUT: @@ -589,16 +629,16 @@ PSQLexec(const char *query) if (pset.echo_hidden != PSQL_ECHO_HIDDEN_OFF) { - printf(_("********* QUERY **********\n" + printf(_("/******** QUERY *********/\n" "%s\n" - "**************************\n\n"), query); + "/************************/\n\n"), query); fflush(stdout); if (pset.logfile) { fprintf(pset.logfile, - _("********* QUERY **********\n" + _("/******** QUERY *********/\n" "%s\n" - "**************************\n\n"), query); + "/************************/\n\n"), query); fflush(pset.logfile); } @@ -632,7 +672,7 @@ PSQLexec(const char *query) * e.g., because of the interrupt, -1 on error. */ int -PSQLexecWatch(const char *query, const printQueryOpt *opt, FILE *printQueryFout) +PSQLexecWatch(const char *query, const printQueryOpt *opt, FILE *printQueryFout, int min_rows) { bool timing = pset.timing; double elapsed_msec = 0; @@ -646,7 +686,7 @@ PSQLexecWatch(const char *query, const printQueryOpt *opt, FILE *printQueryFout) SetCancelConn(pset.db); - res = ExecQueryAndProcessResults(query, &elapsed_msec, NULL, true, opt, printQueryFout); + res = ExecQueryAndProcessResults(query, &elapsed_msec, NULL, true, min_rows, opt, printQueryFout); ResetCancelConn(); @@ -792,10 +832,7 @@ ExecQueryTuples(const PGresult *result) c; /* - * We must turn off gexec_flag to avoid infinite recursion. Note that - * this allows ExecQueryUsingCursor to be applied to the individual query - * results. SendQuery prevents it from being applied when fetching the - * queries-to-execute, because it can't handle recursion either. + * We must turn off gexec_flag to avoid infinite recursion. */ pset.gexec_flag = false; @@ -915,30 +952,39 @@ HandleCopyResult(PGresult **resultp, FILE *copystream) /* * PrintQueryStatus: report command status as required - * - * Note: Utility function for use by PrintQueryResult() only. */ static void PrintQueryStatus(PGresult *result, FILE *printQueryFout) { char buf[16]; + const char *cmdstatus = PQcmdStatus(result); FILE *fout = printQueryFout ? printQueryFout : pset.queryFout; + /* Do nothing if it's a TUPLES_OK result that isn't from RETURNING */ + if (PQresultStatus(result) == PGRES_TUPLES_OK) + { + if (!(strncmp(cmdstatus, "INSERT", 6) == 0 || + strncmp(cmdstatus, "UPDATE", 6) == 0 || + strncmp(cmdstatus, "DELETE", 6) == 0 || + strncmp(cmdstatus, "MERGE", 5) == 0)) + return; + } + if (!pset.quiet) { if (pset.popt.topt.format == PRINT_HTML) { fputs("

", fout); - html_escaped_print(PQcmdStatus(result), fout); + html_escaped_print(cmdstatus, fout); fputs("

\n", fout); } else - fprintf(fout, "%s\n", PQcmdStatus(result)); + fprintf(fout, "%s\n", cmdstatus); fflush(fout); } if (pset.logfile) - fprintf(pset.logfile, "%s\n", PQcmdStatus(result)); + fprintf(pset.logfile, "%s\n", cmdstatus); snprintf(buf, sizeof(buf), "%u", (unsigned int) PQoidValue(result)); SetVariable(pset.vars, "LASTOID", buf); @@ -948,8 +994,6 @@ PrintQueryStatus(PGresult *result, FILE *printQueryFout) /* * PrintQueryResult: print out (or store or execute) query result as required * - * Note: Utility function for use by SendQuery() only. - * * last is true if this is the last result of a command string. * opt and printQueryFout are defined as for PrintQueryTuples. * printStatusFout is where to send command status; NULL means pset.queryFout. @@ -962,7 +1006,6 @@ PrintQueryResult(PGresult *result, bool last, FILE *printStatusFout) { bool success; - const char *cmdstatus; if (!result) return false; @@ -982,15 +1025,12 @@ PrintQueryResult(PGresult *result, bool last, else success = true; - /* if it's INSERT/UPDATE/DELETE RETURNING, also print status */ + /* + * If it's INSERT/UPDATE/DELETE/MERGE RETURNING, also print + * status. + */ if (last || pset.show_all_results) - { - cmdstatus = PQcmdStatus(result); - if (strncmp(cmdstatus, "INSERT", 6) == 0 || - strncmp(cmdstatus, "UPDATE", 6) == 0 || - strncmp(cmdstatus, "DELETE", 6) == 0) - PrintQueryStatus(result, printStatusFout); - } + PrintQueryStatus(result, printStatusFout); break; @@ -1060,9 +1100,9 @@ SendQuery(const char *query) char buf[3]; fflush(stderr); - printf(_("***(Single step mode: verify command)*******************************************\n" + printf(_("/**(Single step mode: verify command)******************************************/\n" "%s\n" - "***(press return to proceed or enter x and return to cancel)********************\n"), + "/**(press return to proceed or enter x and return to cancel)*******************/\n"), query); fflush(stdout); if (fgets(buf, sizeof(buf), stdin) != NULL) @@ -1080,9 +1120,9 @@ SendQuery(const char *query) if (pset.logfile) { fprintf(pset.logfile, - _("********* QUERY **********\n" + _("/******** QUERY *********/\n" "%s\n" - "**************************\n\n"), query); + "/************************/\n\n"), query); fflush(pset.logfile); } @@ -1130,16 +1170,10 @@ SendQuery(const char *query) /* Describe query's result columns, without executing it */ OK = DescribeQuery(query, &elapsed_msec); } - else if (pset.fetch_count <= 0 || pset.gexec_flag || - pset.crosstab_flag || !is_select_command(query)) - { - /* Default fetch-it-all-and-print mode */ - OK = (ExecQueryAndProcessResults(query, &elapsed_msec, &svpt_gone, false, NULL, NULL) > 0); - } else { - /* Fetch-in-segments mode */ - OK = ExecQueryUsingCursor(query, &elapsed_msec); + /* Default fetch-and-print mode */ + OK = (ExecQueryAndProcessResults(query, &elapsed_msec, &svpt_gone, false, 0, NULL, NULL) > 0); } if (!OK && pset.echo == PSQL_ECHO_ERRORS) @@ -1241,14 +1275,7 @@ SendQuery(const char *query) } /* clean up after \bind */ - if (pset.bind_flag) - { - for (i = 0; i < pset.bind_nparams; i++) - free(pset.bind_params[i]); - free(pset.bind_params); - pset.bind_params = NULL; - pset.bind_flag = false; - } + clean_bind_state(); /* reset \gset trigger */ if (pset.gset_prefix) @@ -1405,6 +1432,9 @@ DescribeQuery(const char *query, double *elapsed_msec) * For other commands, the results are processed normally, depending on their * status. * + * When invoked from \watch, is_watch is true and min_rows is the value + * of that option, or 0 if it wasn't set. + * * Returns 1 on complete success, 0 on interrupt and -1 or errors. Possible * failure modes include purely client-side problems; check the transaction * status for the server-side opinion. @@ -1415,11 +1445,12 @@ DescribeQuery(const char *query, double *elapsed_msec) static int ExecQueryAndProcessResults(const char *query, double *elapsed_msec, bool *svpt_gone_p, - bool is_watch, + bool is_watch, int min_rows, const printQueryOpt *opt, FILE *printQueryFout) { bool timing = pset.timing; bool success; + bool return_early = false; instr_time before, after; PGresult *result; @@ -1448,6 +1479,31 @@ ExecQueryAndProcessResults(const char *query, return -1; } + /* + * Fetch the result in chunks if FETCH_COUNT is set, except when: + * + * * SHOW_ALL_RESULTS is false, since that requires us to complete the + * query before we can tell if its results should be displayed. + * + * * We're doing \crosstab, which likewise needs to see all the rows at + * once. + * + * * We're doing \gexec: we must complete the data fetch to make the + * connection free for issuing the resulting commands. + * + * * We're doing \gset: only one result row is allowed anyway. + * + * * We're doing \watch: users probably don't want us to force use of the + * pager for that, plus chunking could break the min_rows check. + */ + if (pset.fetch_count > 0 && pset.show_all_results && + !pset.crosstab_flag && !pset.gexec_flag && + !pset.gset_prefix && !is_watch) + { + if (!PQsetChunkedRowsMode(pset.db, pset.fetch_count)) + pg_log_warning("fetching results in chunked mode failed"); + } + /* * If SIGINT is sent while the query is processing, the interrupt will be * consumed. The user's intention, though, is to cancel the entire watch @@ -1461,10 +1517,15 @@ ExecQueryAndProcessResults(const char *query, /* first result */ result = PQgetResult(pset.db); + if (min_rows > 0 && PQntuples(result) < min_rows) + { + return_early = true; + } while (result != NULL) { ExecStatusType result_status; + bool is_chunked_result = false; PGresult *next_result; bool last; @@ -1562,20 +1623,9 @@ ExecQueryAndProcessResults(const char *query, } else if (pset.gfname) { - /* send to \g file, which we may have opened already */ - if (gfile_fout == NULL) - { - if (openQueryOutputFile(pset.gfname, - &gfile_fout, &gfile_is_pipe)) - { - if (gfile_is_pipe) - disable_sigpipe_trap(); - copy_stream = gfile_fout; - } - else - success = false; - } - else + /* COPY followed by \g filename or \g |program */ + success &= SetupGOutput(&gfile_fout, &gfile_is_pipe); + if (gfile_fout) copy_stream = gfile_fout; } else @@ -1593,6 +1643,112 @@ ExecQueryAndProcessResults(const char *query, success &= HandleCopyResult(&result, copy_stream); } + /* If we have a chunked result, collect and print all chunks */ + if (result_status == PGRES_TUPLES_CHUNK) + { + FILE *tuples_fout = printQueryFout ? printQueryFout : pset.queryFout; + printQueryOpt my_popt = opt ? *opt : pset.popt; + int64 total_tuples = 0; + bool is_pager = false; + int flush_error = 0; + + /* initialize print options for partial table output */ + my_popt.topt.start_table = true; + my_popt.topt.stop_table = false; + my_popt.topt.prior_records = 0; + + /* open \g file if needed */ + success &= SetupGOutput(&gfile_fout, &gfile_is_pipe); + if (gfile_fout) + tuples_fout = gfile_fout; + + /* force use of pager for any chunked resultset going to stdout */ + if (success && tuples_fout == stdout) + { + tuples_fout = PageOutput(INT_MAX, &(my_popt.topt)); + is_pager = true; + } + + do + { + /* + * Display the current chunk of results, unless the output + * stream stopped working or we got cancelled. We skip use of + * PrintQueryResult and go directly to printQuery, so that we + * can pass the correct is_pager value and because we don't + * want PrintQueryStatus to happen yet. Above, we rejected + * use of chunking for all cases in which PrintQueryResult + * would send the result to someplace other than printQuery. + */ + if (success && !flush_error && !cancel_pressed) + { + printQuery(result, &my_popt, tuples_fout, is_pager, pset.logfile); + flush_error = fflush(tuples_fout); + } + + /* after the first result set, disallow header decoration */ + my_popt.topt.start_table = false; + + /* count tuples before dropping the result */ + my_popt.topt.prior_records += PQntuples(result); + total_tuples += PQntuples(result); + + ClearOrSaveResult(result); + + /* get the next result, loop if it's PGRES_TUPLES_CHUNK */ + result = PQgetResult(pset.db); + } while (PQresultStatus(result) == PGRES_TUPLES_CHUNK); + + /* We expect an empty PGRES_TUPLES_OK, else there's a problem */ + if (PQresultStatus(result) == PGRES_TUPLES_OK) + { + char buf[32]; + + Assert(PQntuples(result) == 0); + + /* Display the footer using the empty result */ + if (success && !flush_error && !cancel_pressed) + { + my_popt.topt.stop_table = true; + printQuery(result, &my_popt, tuples_fout, is_pager, pset.logfile); + fflush(tuples_fout); + } + + if (is_pager) + ClosePager(tuples_fout); + + /* + * It's possible the data is from a RETURNING clause, in which + * case we need to print query status. + */ + PrintQueryStatus(result, printQueryFout); + + /* + * We must do a fake SetResultVariables(), since we don't have + * a PGresult corresponding to the whole query. + */ + SetVariable(pset.vars, "ERROR", "false"); + SetVariable(pset.vars, "SQLSTATE", "00000"); + snprintf(buf, sizeof(buf), INT64_FORMAT, total_tuples); + SetVariable(pset.vars, "ROW_COUNT", buf); + /* Prevent SetResultVariables call below */ + is_chunked_result = true; + + /* Clear the empty result so it isn't printed below */ + ClearOrSaveResult(result); + result = NULL; + } + else + { + /* Probably an error report, so close the pager and print it */ + if (is_pager) + ClosePager(tuples_fout); + + success &= AcceptResult(result, true); + /* SetResultVariables and ClearOrSaveResult happen below */ + } + } + /* * Check PQgetResult() again. In the typical case of a single-command * string, it will return NULL. Otherwise, we'll have other results @@ -1630,328 +1786,43 @@ ExecQueryAndProcessResults(const char *query, * tuple output, but it's still used for status output. */ FILE *tuples_fout = printQueryFout; - bool do_print = true; - if (PQresultStatus(result) == PGRES_TUPLES_OK && - pset.gfname) - { - if (gfile_fout == NULL) - { - if (openQueryOutputFile(pset.gfname, - &gfile_fout, &gfile_is_pipe)) - { - if (gfile_is_pipe) - disable_sigpipe_trap(); - } - else - success = do_print = false; - } + if (PQresultStatus(result) == PGRES_TUPLES_OK) + success &= SetupGOutput(&gfile_fout, &gfile_is_pipe); + if (gfile_fout) tuples_fout = gfile_fout; - } - if (do_print) + if (success) success &= PrintQueryResult(result, last, opt, tuples_fout, printQueryFout); } - /* set variables on last result if all went well */ - if (!is_watch && last && success) - SetResultVariables(result, true); + /* set variables from last result, unless dealt with elsewhere */ + if (last && !is_watch && !is_chunked_result) + SetResultVariables(result, success); ClearOrSaveResult(result); result = next_result; if (cancel_pressed) { + /* drop this next result, as well as any others not yet read */ + ClearOrSaveResult(result); ClearOrSaveAllResults(); break; } } /* close \g file if we opened it */ - if (gfile_fout) - { - if (gfile_is_pipe) - { - SetShellResultVariables(pclose(gfile_fout)); - restore_sigpipe_trap(); - } - else - fclose(gfile_fout); - } + CloseGOutput(gfile_fout, gfile_is_pipe); /* may need this to recover from conn loss during COPY */ if (!CheckConnection()) return -1; - return cancel_pressed ? 0 : success ? 1 : -1; -} - - -/* - * ExecQueryUsingCursor: run a SELECT-like query using a cursor - * - * This feature allows result sets larger than RAM to be dealt with. - * - * Returns true if the query executed successfully, false otherwise. - * - * If pset.timing is on, total query time (exclusive of result-printing) is - * stored into *elapsed_msec. - */ -static bool -ExecQueryUsingCursor(const char *query, double *elapsed_msec) -{ - bool OK = true; - PGresult *result; - PQExpBufferData buf; - printQueryOpt my_popt = pset.popt; - bool timing = pset.timing; - FILE *fout; - bool is_pipe; - bool is_pager = false; - bool started_txn = false; - int64 total_tuples = 0; - int ntuples; - int fetch_count; - char fetch_cmd[64]; - instr_time before, - after; - int flush_error; - - *elapsed_msec = 0; - - /* initialize print options for partial table output */ - my_popt.topt.start_table = true; - my_popt.topt.stop_table = false; - my_popt.topt.prior_records = 0; - - if (timing) - INSTR_TIME_SET_CURRENT(before); - else - INSTR_TIME_SET_ZERO(before); - - /* if we're not in a transaction, start one */ - if (PQtransactionStatus(pset.db) == PQTRANS_IDLE) - { - result = PQexec(pset.db, "BEGIN"); - OK = AcceptResult(result, true) && - (PQresultStatus(result) == PGRES_COMMAND_OK); - ClearOrSaveResult(result); - if (!OK) - return false; - started_txn = true; - } - - /* Send DECLARE CURSOR */ - initPQExpBuffer(&buf); - appendPQExpBuffer(&buf, "DECLARE _psql_cursor NO SCROLL CURSOR FOR\n%s", - query); - - result = PQexec(pset.db, buf.data); - OK = AcceptResult(result, true) && - (PQresultStatus(result) == PGRES_COMMAND_OK); - if (!OK) - SetResultVariables(result, OK); - ClearOrSaveResult(result); - termPQExpBuffer(&buf); - if (!OK) - goto cleanup; - - if (timing) - { - INSTR_TIME_SET_CURRENT(after); - INSTR_TIME_SUBTRACT(after, before); - *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); - } - - /* - * In \gset mode, we force the fetch count to be 2, so that we will throw - * the appropriate error if the query returns more than one row. - */ - if (pset.gset_prefix) - fetch_count = 2; - else - fetch_count = pset.fetch_count; - - snprintf(fetch_cmd, sizeof(fetch_cmd), - "FETCH FORWARD %d FROM _psql_cursor", - fetch_count); - - /* prepare to write output to \g argument, if any */ - if (pset.gfname) - { - if (!openQueryOutputFile(pset.gfname, &fout, &is_pipe)) - { - OK = false; - goto cleanup; - } - if (is_pipe) - disable_sigpipe_trap(); - } - else - { - fout = pset.queryFout; - is_pipe = false; /* doesn't matter */ - } - - /* clear any pre-existing error indication on the output stream */ - clearerr(fout); - - for (;;) - { - if (timing) - INSTR_TIME_SET_CURRENT(before); - - /* get fetch_count tuples at a time */ - result = PQexec(pset.db, fetch_cmd); - - if (timing) - { - INSTR_TIME_SET_CURRENT(after); - INSTR_TIME_SUBTRACT(after, before); - *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); - } - - if (PQresultStatus(result) != PGRES_TUPLES_OK) - { - /* shut down pager before printing error message */ - if (is_pager) - { - ClosePager(fout); - is_pager = false; - } - - OK = AcceptResult(result, true); - Assert(!OK); - SetResultVariables(result, OK); - ClearOrSaveResult(result); - break; - } - - if (pset.gset_prefix) - { - /* StoreQueryTuple will complain if not exactly one row */ - OK = StoreQueryTuple(result); - ClearOrSaveResult(result); - break; - } - - /* - * Note we do not deal with \gdesc, \gexec or \crosstabview modes here - */ - - ntuples = PQntuples(result); - total_tuples += ntuples; - - if (ntuples < fetch_count) - { - /* this is the last result set, so allow footer decoration */ - my_popt.topt.stop_table = true; - } - else if (fout == stdout && !is_pager) - { - /* - * If query requires multiple result sets, hack to ensure that - * only one pager instance is used for the whole mess - */ - fout = PageOutput(INT_MAX, &(my_popt.topt)); - is_pager = true; - } - - printQuery(result, &my_popt, fout, is_pager, pset.logfile); - - ClearOrSaveResult(result); - - /* after the first result set, disallow header decoration */ - my_popt.topt.start_table = false; - my_popt.topt.prior_records += ntuples; - - /* - * Make sure to flush the output stream, so intermediate results are - * visible to the client immediately. We check the results because if - * the pager dies/exits/etc, there's no sense throwing more data at - * it. - */ - flush_error = fflush(fout); - - /* - * Check if we are at the end, if a cancel was pressed, or if there - * were any errors either trying to flush out the results, or more - * generally on the output stream at all. If we hit any errors - * writing things to the stream, we presume $PAGER has disappeared and - * stop bothering to pull down more data. - */ - if (ntuples < fetch_count || cancel_pressed || flush_error || - ferror(fout)) - break; - } - - if (pset.gfname) - { - /* close \g argument file/pipe */ - if (is_pipe) - { - SetShellResultVariables(pclose(fout)); - restore_sigpipe_trap(); - } - else - fclose(fout); - } - else if (is_pager) - { - /* close transient pager */ - ClosePager(fout); - } - - if (OK) - { - /* - * We don't have a PGresult here, and even if we did it wouldn't have - * the right row count, so fake SetResultVariables(). In error cases, - * we already set the result variables above. - */ - char buf[32]; - - SetVariable(pset.vars, "ERROR", "false"); - SetVariable(pset.vars, "SQLSTATE", "00000"); - snprintf(buf, sizeof(buf), INT64_FORMAT, total_tuples); - SetVariable(pset.vars, "ROW_COUNT", buf); - } - -cleanup: - if (timing) - INSTR_TIME_SET_CURRENT(before); - - /* - * We try to close the cursor on either success or failure, but on failure - * ignore the result (it's probably just a bleat about being in an aborted - * transaction) - */ - result = PQexec(pset.db, "CLOSE _psql_cursor"); - if (OK) - { - OK = AcceptResult(result, true) && - (PQresultStatus(result) == PGRES_COMMAND_OK); - ClearOrSaveResult(result); - } - else - PQclear(result); - - if (started_txn) - { - result = PQexec(pset.db, OK ? "COMMIT" : "ROLLBACK"); - OK &= AcceptResult(result, true) && - (PQresultStatus(result) == PGRES_COMMAND_OK); - ClearOrSaveResult(result); - } - - if (timing) - { - INSTR_TIME_SET_CURRENT(after); - INSTR_TIME_SUBTRACT(after, before); - *elapsed_msec += INSTR_TIME_GET_MILLISEC(after); - } + if (cancel_pressed || return_early) + return 0; - return OK; + return success ? 1 : -1; } @@ -2234,43 +2105,6 @@ command_no_begin(const char *query) } -/* - * Check whether the specified command is a SELECT (or VALUES). - */ -static bool -is_select_command(const char *query) -{ - int wordlen; - - /* - * First advance over any whitespace, comments and left parentheses. - */ - for (;;) - { - query = skip_white_space(query); - if (query[0] == '(') - query++; - else - break; - } - - /* - * Check word length (since "selectx" is not "select"). - */ - wordlen = 0; - while (isalpha((unsigned char) query[wordlen])) - wordlen += PQmblenBounded(&query[wordlen], pset.encoding); - - if (wordlen == 6 && pg_strncasecmp(query, "select", 6) == 0) - return true; - - if (wordlen == 6 && pg_strncasecmp(query, "values", 6) == 0) - return true; - - return false; -} - - /* * Test if the current user is a database superuser. */ @@ -2411,6 +2245,26 @@ uri_prefix_length(const char *connstr) return 0; } +/* + * Reset state related to \bind + * + * Clean up any state related to bind parameters and bind_flag. This needs + * to be called after processing a query or when running \bind. + */ +void +clean_bind_state(void) +{ + if (pset.bind_flag) + { + for (int i = 0; i < pset.bind_nparams; i++) + free(pset.bind_params[i]); + free(pset.bind_params); + } + + pset.bind_params = NULL; + pset.bind_flag = false; +} + /* * Recognized connection string either starts with a valid URI prefix or * contains a "=" in it. diff --git a/src/bin/psql/common.h b/src/bin/psql/common.h index 812b94a977568..9baa1e8906491 100644 --- a/src/bin/psql/common.h +++ b/src/bin/psql/common.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/common.h */ @@ -32,7 +32,7 @@ extern void psql_setup_cancel_handler(void); extern void SetShellResultVariables(int wait_result); extern PGresult *PSQLexec(const char *query); -extern int PSQLexecWatch(const char *query, const printQueryOpt *opt, FILE *printQueryFout); +extern int PSQLexecWatch(const char *query, const printQueryOpt *opt, FILE *printQueryFout, int min_rows); extern bool SendQuery(const char *query); @@ -41,6 +41,7 @@ extern bool standard_strings(void); extern const char *session_username(void); extern void expand_tilde(char **filename); +extern void clean_bind_state(void); extern bool recognized_connection_string(const char *connstr); diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c index b3cc3d9a29069..609c4c5b55bcd 100644 --- a/src/bin/psql/copy.c +++ b/src/bin/psql/copy.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/copy.c */ @@ -280,7 +280,7 @@ do_copy(const char *args) /* prepare to read or write the target file */ if (options->file && !options->program) - canonicalize_path(options->file); + canonicalize_path_enc(options->file, pset.encoding); if (options->from) { @@ -627,6 +627,8 @@ handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary, PGresult **res) * This code erroneously assumes '\.' on a line alone * inside a quoted CSV string terminates the \copy. * https://www.postgresql.org/message-id/E1TdNVQ-0001ju-GO@wrigleys.postgresql.org + * + * https://www.postgresql.org/message-id/bfcd57e4-8f23-4c3e-a5db-2571d09208e2@beta.fastmail.com */ if ((linelen == 3 && memcmp(fgresult, "\\.\n", 3) == 0) || (linelen == 4 && memcmp(fgresult, "\\.\r\n", 4) == 0)) diff --git a/src/bin/psql/copy.h b/src/bin/psql/copy.h index 1d33fcfab0abf..c99daadc058a7 100644 --- a/src/bin/psql/copy.h +++ b/src/bin/psql/copy.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/copy.h */ diff --git a/src/bin/psql/create_help.pl b/src/bin/psql/create_help.pl index 0809db41517b5..e2fdc25570c11 100644 --- a/src/bin/psql/create_help.pl +++ b/src/bin/psql/create_help.pl @@ -3,7 +3,7 @@ ################################################################# # create_help.pl -- converts SGML docs to internal psql help # -# Copyright (c) 2000-2023, PostgreSQL Global Development Group +# Copyright (c) 2000-2024, PostgreSQL Global Development Group # # src/bin/psql/create_help.pl ################################################################# @@ -20,7 +20,7 @@ # use strict; -use warnings; +use warnings FATAL => 'all'; use Getopt::Long; my $docdir = ''; diff --git a/src/bin/psql/crosstabview.c b/src/bin/psql/crosstabview.c index e1ad0e61d99e5..305ed4ab0a88f 100644 --- a/src/bin/psql/crosstabview.c +++ b/src/bin/psql/crosstabview.c @@ -1,13 +1,14 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/crosstabview.c */ #include "postgres_fe.h" #include "common.h" +#include "common/int.h" #include "common/logging.h" #include "crosstabview.h" #include "pqexpbuffer.h" @@ -709,5 +710,5 @@ pivotFieldCompare(const void *a, const void *b) static int rankCompare(const void *a, const void *b) { - return *((const int *) a) - *((const int *) b); + return pg_cmp_s32(*(const int *) a, *(const int *) b); } diff --git a/src/bin/psql/crosstabview.h b/src/bin/psql/crosstabview.h index cc7b80fe032fe..503ac28af9d0e 100644 --- a/src/bin/psql/crosstabview.h +++ b/src/bin/psql/crosstabview.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/crosstabview.h */ diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index 9325a46b8fd30..770f52bc4552b 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -7,7 +7,7 @@ * information for an old server, but not to fail outright. (But failing * against a pre-9.2 server is allowed.) * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/describe.c */ @@ -124,7 +124,6 @@ describeAggregates(const char *pattern, bool verbose, bool showSystem) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of aggregate functions"); myopt.translate_header = true; @@ -197,7 +196,6 @@ describeAccessMethods(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of access methods"); myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -262,7 +260,6 @@ describeTablespaces(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of tablespaces"); myopt.translate_header = true; @@ -585,7 +582,6 @@ describeFunctions(const char *functypes, const char *func_pattern, if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of functions"); myopt.translate_header = true; if (pset.sversion >= 90600) @@ -702,7 +698,6 @@ describeTypes(const char *pattern, bool verbose, bool showSystem) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of data types"); myopt.translate_header = true; @@ -893,7 +888,6 @@ describeOperators(const char *oper_pattern, if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of operators"); myopt.translate_header = true; @@ -932,7 +926,7 @@ listAllDbs(const char *pattern, bool verbose) gettext_noop("Encoding")); if (pset.sversion >= 150000) appendPQExpBuffer(&buf, - " CASE d.datlocprovider WHEN 'c' THEN 'libc' WHEN 'i' THEN 'icu' END AS \"%s\",\n", + " CASE d.datlocprovider WHEN 'b' THEN 'builtin' WHEN 'c' THEN 'libc' WHEN 'i' THEN 'icu' END AS \"%s\",\n", gettext_noop("Locale Provider")); else appendPQExpBuffer(&buf, @@ -943,14 +937,18 @@ listAllDbs(const char *pattern, bool verbose) " d.datctype as \"%s\",\n", gettext_noop("Collate"), gettext_noop("Ctype")); - if (pset.sversion >= 150000) + if (pset.sversion >= 170000) + appendPQExpBuffer(&buf, + " d.datlocale as \"%s\",\n", + gettext_noop("Locale")); + else if (pset.sversion >= 150000) appendPQExpBuffer(&buf, " d.daticulocale as \"%s\",\n", - gettext_noop("ICU Locale")); + gettext_noop("Locale")); else appendPQExpBuffer(&buf, " NULL as \"%s\",\n", - gettext_noop("ICU Locale")); + gettext_noop("Locale")); if (pset.sversion >= 160000) appendPQExpBuffer(&buf, " d.daticurules as \"%s\",\n", @@ -995,7 +993,6 @@ listAllDbs(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of databases"); myopt.translate_header = true; @@ -1047,6 +1044,11 @@ permissionsList(const char *pattern, bool showSystem) printACLColumn(&buf, "c.relacl"); + /* + * The formatting of attacl should match printACLColumn(). However, we + * need no special case for an empty attacl, because the backend always + * optimizes that back to NULL. + */ appendPQExpBuffer(&buf, ",\n pg_catalog.array_to_string(ARRAY(\n" " SELECT attname || E':\\n ' || pg_catalog.array_to_string(attacl, E'\\n ')\n" @@ -1146,7 +1148,6 @@ permissionsList(const char *pattern, bool showSystem) if (!res) goto error_return; - myopt.nullPrint = NULL; printfPQExpBuffer(&buf, _("Access privileges")); myopt.title = buf.data; myopt.translate_header = true; @@ -1218,7 +1219,6 @@ listDefaultACLs(const char *pattern) if (!res) goto error_return; - myopt.nullPrint = NULL; printfPQExpBuffer(&buf, _("Default access privileges")); myopt.title = buf.data; myopt.translate_header = true; @@ -1417,7 +1417,6 @@ objectDescription(const char *pattern, bool showSystem) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("Object descriptions"); myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -2797,7 +2796,8 @@ describeOneTableDetails(const char *schemaname, PQgetvalue(result, i, 1)); /* Show the stats target if it's not default */ - if (strcmp(PQgetvalue(result, i, 8), "-1") != 0) + if (!PQgetisnull(result, i, 8) && + strcmp(PQgetvalue(result, i, 8), "-1") != 0) appendPQExpBuffer(&buf, "; STATISTICS %s", PQgetvalue(result, i, 8)); @@ -3617,7 +3617,7 @@ describeRoles(const char *pattern, bool verbose, bool showSystem) PGresult *res; printTableContent cont; printTableOpt myopt = pset.popt.topt; - int ncols = 3; + int ncols = 2; int nrows = 0; int i; int conns; @@ -3631,11 +3631,7 @@ describeRoles(const char *pattern, bool verbose, bool showSystem) printfPQExpBuffer(&buf, "SELECT r.rolname, r.rolsuper, r.rolinherit,\n" " r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,\n" - " r.rolconnlimit, r.rolvaliduntil,\n" - " ARRAY(SELECT b.rolname\n" - " FROM pg_catalog.pg_auth_members m\n" - " JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)\n" - " WHERE m.member = r.oid) as memberof"); + " r.rolconnlimit, r.rolvaliduntil"); if (verbose) { @@ -3675,8 +3671,6 @@ describeRoles(const char *pattern, bool verbose, bool showSystem) printTableAddHeader(&cont, gettext_noop("Role name"), true, align); printTableAddHeader(&cont, gettext_noop("Attributes"), true, align); - /* ignores implicit memberships from superuser & pg_database_owner */ - printTableAddHeader(&cont, gettext_noop("Member of"), true, align); if (verbose) printTableAddHeader(&cont, gettext_noop("Description"), true, align); @@ -3701,11 +3695,11 @@ describeRoles(const char *pattern, bool verbose, bool showSystem) if (strcmp(PQgetvalue(res, i, 5), "t") != 0) add_role_attribute(&buf, _("Cannot login")); - if (strcmp(PQgetvalue(res, i, (verbose ? 10 : 9)), "t") == 0) + if (strcmp(PQgetvalue(res, i, (verbose ? 9 : 8)), "t") == 0) add_role_attribute(&buf, _("Replication")); if (pset.sversion >= 90500) - if (strcmp(PQgetvalue(res, i, (verbose ? 11 : 10)), "t") == 0) + if (strcmp(PQgetvalue(res, i, (verbose ? 10 : 9)), "t") == 0) add_role_attribute(&buf, _("Bypass RLS")); conns = atoi(PQgetvalue(res, i, 6)); @@ -3735,10 +3729,8 @@ describeRoles(const char *pattern, bool verbose, bool showSystem) printTableAddCell(&cont, attr[i], false, false); - printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false); - if (verbose) - printTableAddCell(&cont, PQgetvalue(res, i, 9), false, false); + printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false); } termPQExpBuffer(&buf); @@ -3816,7 +3808,6 @@ listDbRoleSettings(const char *pattern, const char *pattern2) } else { - myopt.nullPrint = NULL; myopt.title = _("List of settings"); myopt.translate_header = true; @@ -3831,6 +3822,74 @@ listDbRoleSettings(const char *pattern, const char *pattern2) return false; } +/* + * \drg + * Describes role grants. + */ +bool +describeRoleGrants(const char *pattern, bool showSystem) +{ + PQExpBufferData buf; + PGresult *res; + printQueryOpt myopt = pset.popt; + + initPQExpBuffer(&buf); + printfPQExpBuffer(&buf, + "SELECT m.rolname AS \"%s\", r.rolname AS \"%s\",\n" + " pg_catalog.concat_ws(', ',\n", + gettext_noop("Role name"), + gettext_noop("Member of")); + + if (pset.sversion >= 160000) + appendPQExpBufferStr(&buf, + " CASE WHEN pam.admin_option THEN 'ADMIN' END,\n" + " CASE WHEN pam.inherit_option THEN 'INHERIT' END,\n" + " CASE WHEN pam.set_option THEN 'SET' END\n"); + else + appendPQExpBufferStr(&buf, + " CASE WHEN pam.admin_option THEN 'ADMIN' END,\n" + " CASE WHEN m.rolinherit THEN 'INHERIT' END,\n" + " 'SET'\n"); + + appendPQExpBuffer(&buf, + " ) AS \"%s\",\n" + " g.rolname AS \"%s\"\n", + gettext_noop("Options"), + gettext_noop("Grantor")); + + appendPQExpBufferStr(&buf, + "FROM pg_catalog.pg_roles m\n" + " JOIN pg_catalog.pg_auth_members pam ON (pam.member = m.oid)\n" + " LEFT JOIN pg_catalog.pg_roles r ON (pam.roleid = r.oid)\n" + " LEFT JOIN pg_catalog.pg_roles g ON (pam.grantor = g.oid)\n"); + + if (!showSystem && !pattern) + appendPQExpBufferStr(&buf, "WHERE m.rolname !~ '^pg_'\n"); + + if (!validateSQLNamePattern(&buf, pattern, false, false, + NULL, "m.rolname", NULL, NULL, + NULL, 1)) + { + termPQExpBuffer(&buf); + return false; + } + + appendPQExpBufferStr(&buf, "ORDER BY 1, 2, 4;\n"); + + res = PSQLexec(buf.data); + termPQExpBuffer(&buf); + if (!res) + return false; + + myopt.title = _("List of role grants"); + myopt.translate_header = true; + + printQuery(res, &myopt, pset.queryFout, false, pset.logfile); + + PQclear(res); + return true; +} + /* * listTables() @@ -4017,7 +4076,6 @@ listTables(const char *tabtypes, const char *pattern, bool verbose, bool showSys } else { - myopt.nullPrint = NULL; myopt.title = _("List of relations"); myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -4227,7 +4285,6 @@ listPartitionedTables(const char *reltypes, const char *pattern, bool verbose) initPQExpBuffer(&title); appendPQExpBufferStr(&title, tabletitle); - myopt.nullPrint = NULL; myopt.title = title.data; myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -4307,7 +4364,6 @@ listLanguages(const char *pattern, bool verbose, bool showSystem) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of languages"); myopt.translate_header = true; @@ -4341,7 +4397,7 @@ listDomains(const char *pattern, bool verbose, bool showSystem) " CASE WHEN t.typnotnull THEN 'not null' END as \"%s\",\n" " t.typdefault as \"%s\",\n" " pg_catalog.array_to_string(ARRAY(\n" - " SELECT pg_catalog.pg_get_constraintdef(r.oid, true) FROM pg_catalog.pg_constraint r WHERE t.oid = r.contypid\n" + " SELECT pg_catalog.pg_get_constraintdef(r.oid, true) FROM pg_catalog.pg_constraint r WHERE t.oid = r.contypid AND r.contype = 'c' ORDER BY r.conname\n" " ), ' ') as \"%s\"", gettext_noop("Schema"), gettext_noop("Name"), @@ -4392,7 +4448,6 @@ listDomains(const char *pattern, bool verbose, bool showSystem) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of domains"); myopt.translate_header = true; @@ -4471,7 +4526,6 @@ listConversions(const char *pattern, bool verbose, bool showSystem) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of conversions"); myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -4539,7 +4593,6 @@ describeConfigurationParameters(const char *pattern, bool verbose, if (!res) return false; - myopt.nullPrint = NULL; if (pattern) myopt.title = _("List of configuration parameters"); else @@ -4621,7 +4674,6 @@ listEventTriggers(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of event triggers"); myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -4720,7 +4772,6 @@ listExtendedStats(const char *pattern) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of extended statistics"); myopt.translate_header = true; @@ -4833,7 +4884,6 @@ listCasts(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of casts"); myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -4873,7 +4923,7 @@ listCollations(const char *pattern, bool verbose, bool showSystem) if (pset.sversion >= 100000) appendPQExpBuffer(&buf, - " CASE c.collprovider WHEN 'd' THEN 'default' WHEN 'c' THEN 'libc' WHEN 'i' THEN 'icu' END AS \"%s\",\n", + " CASE c.collprovider WHEN 'd' THEN 'default' WHEN 'b' THEN 'builtin' WHEN 'c' THEN 'libc' WHEN 'i' THEN 'icu' END AS \"%s\",\n", gettext_noop("Provider")); else appendPQExpBuffer(&buf, @@ -4886,14 +4936,18 @@ listCollations(const char *pattern, bool verbose, bool showSystem) gettext_noop("Collate"), gettext_noop("Ctype")); - if (pset.sversion >= 150000) + if (pset.sversion >= 170000) + appendPQExpBuffer(&buf, + " c.colllocale AS \"%s\",\n", + gettext_noop("Locale")); + else if (pset.sversion >= 150000) appendPQExpBuffer(&buf, " c.colliculocale AS \"%s\",\n", - gettext_noop("ICU Locale")); + gettext_noop("Locale")); else appendPQExpBuffer(&buf, " c.collcollate AS \"%s\",\n", - gettext_noop("ICU Locale")); + gettext_noop("Locale")); if (pset.sversion >= 160000) appendPQExpBuffer(&buf, @@ -4952,7 +5006,6 @@ listCollations(const char *pattern, bool verbose, bool showSystem) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of collations"); myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -5014,7 +5067,6 @@ listSchemas(const char *pattern, bool verbose, bool showSystem) if (!res) goto error_return; - myopt.nullPrint = NULL; myopt.title = _("List of schemas"); myopt.translate_header = true; @@ -5131,7 +5183,6 @@ listTSParsers(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of text search parsers"); myopt.translate_header = true; @@ -5279,7 +5330,6 @@ describeOneTSParser(const char *oid, const char *nspname, const char *prsname) if (!res) return false; - myopt.nullPrint = NULL; initPQExpBuffer(&title); if (nspname) printfPQExpBuffer(&title, _("Text search parser \"%s.%s\""), @@ -5316,7 +5366,6 @@ describeOneTSParser(const char *oid, const char *nspname, const char *prsname) return false; } - myopt.nullPrint = NULL; if (nspname) printfPQExpBuffer(&title, _("Token types for parser \"%s.%s\""), nspname, prsname); @@ -5392,7 +5441,6 @@ listTSDictionaries(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of text search dictionaries"); myopt.translate_header = true; @@ -5458,7 +5506,6 @@ listTSTemplates(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of text search templates"); myopt.translate_header = true; @@ -5513,7 +5560,6 @@ listTSConfigs(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of text search configurations"); myopt.translate_header = true; @@ -5659,7 +5705,6 @@ describeOneTSConfig(const char *oid, const char *nspname, const char *cfgname, appendPQExpBuffer(&title, _("\nParser: \"%s\""), prsname); - myopt.nullPrint = NULL; myopt.title = title.data; myopt.footers = NULL; myopt.topt.default_footer = false; @@ -5736,7 +5781,6 @@ listForeignDataWrappers(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of foreign-data wrappers"); myopt.translate_header = true; @@ -5813,7 +5857,6 @@ listForeignServers(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of foreign servers"); myopt.translate_header = true; @@ -5869,7 +5912,6 @@ listUserMappings(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of user mappings"); myopt.translate_header = true; @@ -5942,7 +5984,6 @@ listForeignTables(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of foreign tables"); myopt.translate_header = true; @@ -5994,7 +6035,6 @@ listExtensions(const char *pattern) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of installed extensions"); myopt.translate_header = true; @@ -6098,7 +6138,6 @@ listOneExtensionContents(const char *extname, const char *oid) if (!res) return false; - myopt.nullPrint = NULL; initPQExpBuffer(&title); printfPQExpBuffer(&title, _("Objects in extension \"%s\""), extname); myopt.title = title.data; @@ -6235,7 +6274,6 @@ listPublications(const char *pattern) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of publications"); myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -6490,7 +6528,8 @@ describeSubscriptions(const char *pattern, bool verbose) PGresult *res; printQueryOpt myopt = pset.popt; static const bool translate_columns[] = {false, false, false, false, - false, false, false, false, false, false, false, false, false, false}; + false, false, false, false, false, false, false, false, false, false, + false}; if (pset.sversion < 100000) { @@ -6554,6 +6593,11 @@ describeSubscriptions(const char *pattern, bool verbose) gettext_noop("Password required"), gettext_noop("Run as owner?")); + if (pset.sversion >= 170000) + appendPQExpBuffer(&buf, + ", subfailover AS \"%s\"\n", + gettext_noop("Failover")); + appendPQExpBuffer(&buf, ", subsynccommit AS \"%s\"\n" ", subconninfo AS \"%s\"\n", @@ -6590,7 +6634,6 @@ describeSubscriptions(const char *pattern, bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of subscriptions"); myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -6608,12 +6651,19 @@ describeSubscriptions(const char *pattern, bool verbose) * Helper function for consistently formatting ACL (privilege) columns. * The proper targetlist entry is appended to buf. Note lack of any * whitespace or comma decoration. + * + * If you change this, see also the handling of attacl in permissionsList(), + * which can't conveniently use this code. */ static void printACLColumn(PQExpBuffer buf, const char *colname) { appendPQExpBuffer(buf, - "pg_catalog.array_to_string(%s, E'\\n') AS \"%s\"", + "CASE" + " WHEN pg_catalog.array_length(%s, 1) = 0 THEN '%s'" + " ELSE pg_catalog.array_to_string(%s, E'\\n')" + " END AS \"%s\"", + colname, gettext_noop("(none)"), colname, gettext_noop("Access privileges")); } @@ -6703,7 +6753,6 @@ listOperatorClasses(const char *access_method_pattern, if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of operator classes"); myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -6792,7 +6841,6 @@ listOperatorFamilies(const char *access_method_pattern, if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of operator families"); myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -6891,7 +6939,6 @@ listOpFamilyOperators(const char *access_method_pattern, if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of operators of operator families"); myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -6984,7 +7031,6 @@ listOpFamilyFunctions(const char *access_method_pattern, if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("List of support functions of operator families"); myopt.translate_header = true; myopt.translate_columns = translate_columns; @@ -7036,7 +7082,6 @@ listLargeObjects(bool verbose) if (!res) return false; - myopt.nullPrint = NULL; myopt.title = _("Large objects"); myopt.translate_header = true; diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h index 554fe86725522..273f974538e4a 100644 --- a/src/bin/psql/describe.h +++ b/src/bin/psql/describe.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/describe.h */ @@ -37,6 +37,9 @@ extern bool describeRoles(const char *pattern, bool verbose, bool showSystem); /* \drds */ extern bool listDbRoleSettings(const char *pattern, const char *pattern2); +/* \drg */ +extern bool describeRoleGrants(const char *pattern, bool showSystem); + /* \z (or \dp) */ extern bool permissionsList(const char *pattern, bool showSystem); diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index 0ff595e7eef37..98af878724f8d 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/help.c */ @@ -50,22 +50,10 @@ void usage(unsigned short int pager) { - const char *env; - const char *user; - char *errstr; PQExpBufferData buf; int nlcount; FILE *output; - /* Find default user, in case we need it. */ - user = getenv("PGUSER"); - if (!user) - { - user = get_user_name(&errstr); - if (!user) - pg_fatal("%s", errstr); - } - /* * To avoid counting the output lines manually, build the output in "buf" * and then count them. @@ -77,13 +65,8 @@ usage(unsigned short int pager) HELP0(" psql [OPTION]... [DBNAME [USERNAME]]\n\n"); HELP0("General options:\n"); - /* Display default database */ - env = getenv("PGDATABASE"); - if (!env) - env = user; HELP0(" -c, --command=COMMAND run only single command (SQL or internal) and exit\n"); - HELPN(" -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n", - env); + HELP0(" -d, --dbname=DBNAME database name to connect to\n"); HELP0(" -f, --file=FILENAME execute commands from file, then exit\n"); HELP0(" -l, --list list available databases, then exit\n"); HELP0(" -v, --set=, --variable=NAME=VALUE\n" @@ -128,17 +111,9 @@ usage(unsigned short int pager) " set record separator for unaligned output to zero byte\n"); HELP0("\nConnection options:\n"); - /* Display default host */ - env = getenv("PGHOST"); - HELPN(" -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n", - env ? env : _("local socket")); - /* Display default port */ - env = getenv("PGPORT"); - HELPN(" -p, --port=PORT database server port (default: \"%s\")\n", - env ? env : DEF_PGPORT_STR); - /* Display default user */ - HELPN(" -U, --username=USERNAME database user name (default: \"%s\")\n", - user); + HELP0(" -h, --host=HOSTNAME database server host or socket directory\n"); + HELP0(" -p, --port=PORT database server port\n"); + HELP0(" -U, --username=USERNAME database user name\n"); HELP0(" -w, --no-password never prompt for password\n"); HELP0(" -W, --password force password prompt (should happen automatically)\n"); @@ -200,7 +175,9 @@ slashUsage(unsigned short int pager) HELP0(" \\gset [PREFIX] execute query and store result in psql variables\n"); HELP0(" \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n"); HELP0(" \\q quit psql\n"); - HELP0(" \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n"); + HELP0(" \\watch [[i=]SEC] [c=N] [m=MIN]\n" + " execute query every SEC seconds, up to N times,\n" + " stop if less than MIN rows are returned\n"); HELP0("\n"); HELP0("Help\n"); @@ -280,6 +257,7 @@ slashUsage(unsigned short int pager) HELP0(" \\dp[S] [PATTERN] list table, view, and sequence access privileges\n"); HELP0(" \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n"); HELP0(" \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n"); + HELP0(" \\drg[S] [PATTERN] list role grants\n"); HELP0(" \\dRp[+] [PATTERN] list replication publications\n"); HELP0(" \\dRs[+] [PATTERN] list replication subscriptions\n"); HELP0(" \\ds[S+] [PATTERN] list sequences\n"); @@ -316,7 +294,7 @@ slashUsage(unsigned short int pager) " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" - " unicode_header_linestyle)\n"); + " unicode_header_linestyle|xheader_width)\n"); HELPN(" \\t [on|off] show only rows (currently %s)\n", ON(pset.popt.topt.tuples_only)); HELP0(" \\T [STRING] set HTML tag attributes, or unset if none\n"); @@ -516,6 +494,9 @@ helpVariables(unsigned short int pager) " unicode_column_linestyle\n" " unicode_header_linestyle\n" " set the style of Unicode line drawing [single, double]\n"); + HELP0(" xheader_width\n" + " set the maximum width of the header for expanded output\n" + " [full, column, page, integer value]\n"); HELP0("\nEnvironment variables:\n"); HELP0("Usage:\n"); @@ -752,7 +733,7 @@ print_copyright(void) { puts("PostgreSQL Database Management System\n" "(formerly known as Postgres, then as Postgres95)\n\n" - "Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group\n\n" + "Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group\n\n" "Portions Copyright (c) 1994, The Regents of the University of California\n\n" "Permission to use, copy, modify, and distribute this software and its\n" "documentation for any purpose, without fee, and without a written agreement\n" diff --git a/src/bin/psql/help.h b/src/bin/psql/help.h index 2bd8993e62b1f..a5acce4cfb191 100644 --- a/src/bin/psql/help.h +++ b/src/bin/psql/help.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/help.h */ diff --git a/src/bin/psql/input.c b/src/bin/psql/input.c index 873d85079c95b..01b7ef74c30c6 100644 --- a/src/bin/psql/input.c +++ b/src/bin/psql/input.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/input.c */ @@ -88,8 +88,7 @@ gets_interactive(const char *prompt, PQExpBuffer query_buf) /* Enable SIGINT to longjmp to sigint_interrupt_jmp */ sigint_interrupt_enabled = true; - /* On some platforms, readline is declared as readline(char *) */ - result = readline((char *) prompt); + result = readline(prompt); /* Disable SIGINT again */ sigint_interrupt_enabled = false; diff --git a/src/bin/psql/input.h b/src/bin/psql/input.h index ca948f3e773d2..4c486d67d292c 100644 --- a/src/bin/psql/input.h +++ b/src/bin/psql/input.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/input.h */ diff --git a/src/bin/psql/large_obj.c b/src/bin/psql/large_obj.c index 8bfe914ed3288..e58a9c647e06e 100644 --- a/src/bin/psql/large_obj.c +++ b/src/bin/psql/large_obj.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/large_obj.c */ diff --git a/src/bin/psql/large_obj.h b/src/bin/psql/large_obj.h index 02a16c124920e..3c3cbe1672ce1 100644 --- a/src/bin/psql/large_obj.h +++ b/src/bin/psql/large_obj.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/large_obj.h */ diff --git a/src/bin/psql/mainloop.c b/src/bin/psql/mainloop.c index 692c6db34cdc8..c24e38d988c73 100644 --- a/src/bin/psql/mainloop.c +++ b/src/bin/psql/mainloop.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/mainloop.c */ diff --git a/src/bin/psql/mainloop.h b/src/bin/psql/mainloop.h index 5232a7e416033..6bf00d299c083 100644 --- a/src/bin/psql/mainloop.h +++ b/src/bin/psql/mainloop.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/mainloop.h */ diff --git a/src/bin/psql/meson.build b/src/bin/psql/meson.build index a0a4ac7afb85e..f3a6392138abf 100644 --- a/src/bin/psql/meson.build +++ b/src/bin/psql/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group psql_sources = files( 'command.c', diff --git a/src/bin/psql/nls.mk b/src/bin/psql/nls.mk index cf0b80029183b..7fd8fedead4f5 100644 --- a/src/bin/psql/nls.mk +++ b/src/bin/psql/nls.mk @@ -19,11 +19,12 @@ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ ../../fe_utils/cancel.c \ ../../fe_utils/print.c \ ../../fe_utils/psqlscan.c \ + ../../fe_utils/string_utils.c \ ../../common/exec.c \ ../../common/fe_memutils.c \ ../../common/username.c \ ../../common/wait_error.c \ - ../../port/thread.c + ../../port/user.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) \ HELP0 HELPN N_ simple_prompt simple_prompt_extended GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) \ diff --git a/src/bin/psql/po/cs.po b/src/bin/psql/po/cs.po index 45771e129d9b4..9b8240cb9bbc4 100644 --- a/src/bin/psql/po/cs.po +++ b/src/bin/psql/po/cs.po @@ -9,7 +9,7 @@ msgstr "" "Project-Id-Version: psql-cs (PostgreSQL 9.3)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2020-10-31 16:14+0000\n" -"PO-Revision-Date: 2020-11-01 00:59+0100\n" +"PO-Revision-Date: 2024-06-26 09:15+0200\n" "Last-Translator: Tomas Vondra \n" "Language-Team: Czech \n" "Language: cs\n" @@ -2421,7 +2421,6 @@ msgstr "" " -v, --set=, --variable=JMÉNO=HODNOTA\n" " nastaví psql promÄ›nnou JMÉNO na HODNOTA\n" " (e.g., -v ON_ERROR_STOP=1)\n" -"\n" #: help.c:89 #, c-format @@ -2489,7 +2488,7 @@ msgstr " -E, --echo-hidden ukáže dotazy generované interními příka #: help.c:102 #, c-format msgid " -L, --log-file=FILENAME send session log to file\n" -msgstr " -L, --log-file=SOUBOR uloží záznam sezení do souboru\n" +msgstr " -L, --log-file=SOUBOR uloží záznam sezení do souboru\n" #: help.c:103 #, c-format @@ -2751,12 +2750,12 @@ msgstr "Paměť dotazu\n" #: help.c:197 #, c-format msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" -msgstr " \\e [SOUBOR] [ŘÃDEK] editace aktuálního dotazu (nebo souboru) v externím editoru\n" +msgstr " \\e [SOUBOR] [ŘÃDEK] editace aktuálního dotazu (nebo souboru) v externím editoru\n" #: help.c:198 #, c-format msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" -msgstr " \\ef [JMENOFUNKCE [ŘÃDEK]] editace definice funkce v externím editoru\n" +msgstr " \\ef [JMENOFUNKCE [ŘÃDEK]] editace definice funkce v externím editoru\n" #: help.c:199 #, c-format @@ -2799,7 +2798,7 @@ msgstr " \\copy ... provede SQL COPY s tokem dat na klienta\n" #, c-format msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr "" -" \\echo [-n] [ŘETÄšZEC] vypsání textu na standardní výstup (-n pro potlaÄení\n" +" \\echo [-n] [ŘETÄšZEC] vypsání textu na standardní výstup (-n pro potlaÄení\n" " nového řádku)\n" #: help.c:211 @@ -2826,10 +2825,9 @@ msgstr "" #: help.c:215 #, c-format -#| msgid " \\echo [STRING] write string to standard output\n" msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr "" -" \\warn [-n] [TEXT] vypsání textu na standardní výstup (-n pro potlaÄení\n" +" \\warn [-n] [TEXT] vypsání textu na standardní výstup (-n pro potlaÄení\n" " nového řádku)\n" #: help.c:218 @@ -2938,7 +2936,7 @@ msgstr " \\dD[S+] [PATTERN] seznam domén\n" #: help.c:240 #, c-format msgid " \\ddp [PATTERN] list default privileges\n" -msgstr " \\ddp [VZOR] seznam implicitních privilegií\n" +msgstr " \\ddp [VZOR] seznam implicitních privilegií\n" #: help.c:241 #, c-format @@ -3028,7 +3026,7 @@ msgstr " \\do[S] [VZOR] seznam operátorů\n" #: help.c:258 #, c-format msgid " \\dO[S+] [PATTERN] list collations\n" -msgstr " \\dO[S+] [VZOR] seznam collations\n" +msgstr " \\dO[S+] [VZOR] seznam collations\n" #: help.c:259 #, c-format @@ -3411,7 +3409,6 @@ msgid "" msgstr "" " HISTSIZE\n" " maximální poÄet položek uložených v historii pÅ™kazů\n" -"\n" #: help.c:385 #, c-format @@ -3587,7 +3584,6 @@ msgid "" msgstr "" " VERBOSITY\n" " urÄuje podrobnost chybových hlášení [default, verbose, terse, sqlstate]\n" -"\n" #: help.c:425 #, c-format diff --git a/src/bin/psql/po/de.po b/src/bin/psql/po/de.po index f6161531796bb..e1241516d337b 100644 --- a/src/bin/psql/po/de.po +++ b/src/bin/psql/po/de.po @@ -1,14 +1,14 @@ # German message translation file for psql -# Peter Eisentraut , 2001 - 2023. +# Peter Eisentraut , 2001 - 2024. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 16\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-19 17:17+0000\n" -"PO-Revision-Date: 2023-05-19 21:00+0200\n" +"POT-Creation-Date: 2025-02-06 20:18+0000\n" +"PO-Revision-Date: 2025-02-07 08:23+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -37,33 +37,48 @@ msgstr "Detail: " msgid "hint: " msgstr "Tipp: " -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "ungültige Programmdatei »%s«: %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "konnte Programmdatei »%s« nicht lesen: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "konnte kein »%s« zum Ausführen finden" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "konnte Pfad »%s« nicht in absolute Form auflösen: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 copy.c:326 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "konnte Befehl »%s« nicht ausführen: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "konnte nicht von Befehl »%s« lesen: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "Befehl »%s« gab keine Daten zurück" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() fehlgeschlagen: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 -#: command.c:1352 command.c:3437 command.c:3486 command.c:3610 input.c:226 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: command.c:1372 command.c:3458 command.c:3507 command.c:3632 input.c:225 #: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" @@ -85,7 +100,7 @@ msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" msgid "could not look up effective user ID %ld: %s" msgstr "konnte effektive Benutzer-ID %ld nicht nachschlagen: %s" -#: ../../common/username.c:45 command.c:613 +#: ../../common/username.c:45 command.c:616 msgid "user does not exist" msgstr "Benutzer existiert nicht" @@ -124,11 +139,11 @@ msgstr "Kindprozess wurde von Signal %d beendet: %s" msgid "child process exited with unrecognized status %d" msgstr "Kindprozess hat mit unbekanntem Status %d beendet" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Abbruchsanforderung gesendet\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "Konnte Abbruchsanforderung nicht senden: " @@ -139,317 +154,342 @@ msgid_plural "(%lu rows)" msgstr[0] "(%lu Zeile)" msgstr[1] "(%lu Zeilen)" -#: ../../fe_utils/print.c:3153 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "Unterbrochen\n" -#: ../../fe_utils/print.c:3217 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "Kann Tabelleninhalt nicht ausgeben: Anzahl der Zellen %lld ist gleich oder überschreitet Maximum %lld.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Kann keinen weiteren Spaltenkopf zur Tabelle hinzufügen: Spaltenzahl %d überschritten.\n" -#: ../../fe_utils/print.c:3257 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "Cann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl %d überschritten.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "Kann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl %lld überschritten.\n" -#: ../../fe_utils/print.c:3515 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "ungültiges Ausgabeformat (interner Fehler): %d" -#: ../../fe_utils/psqlscan.l:717 +#: ../../fe_utils/psqlscan.l:732 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "rekursive Auswertung der Variable »%s« wird ausgelassen" -#: ../../port/thread.c:50 ../../port/thread.c:86 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s«\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "Datenbankname enthält Newline oder Carriage Return: »%s«\n" + +#: ../../port/user.c:43 ../../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "konnte lokale Benutzer-ID %d nicht nachschlagen: %s" -#: ../../port/thread.c:55 ../../port/thread.c:91 +#: ../../port/user.c:48 ../../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "lokaler Benutzer mit ID %d existiert nicht" -#: command.c:234 +#: command.c:235 #, c-format msgid "invalid command \\%s" msgstr "ungültige Anweisung \\%s" -#: command.c:236 +#: command.c:237 #, c-format msgid "Try \\? for help." msgstr "Versuchen Sie \\? für Hilfe." -#: command.c:254 +#: command.c:255 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: überflüssiges Argument »%s« ignoriert" -#: command.c:306 +#: command.c:307 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "Befehl \\%s ignoriert; verwenden Sie \\endif oder Strg-C um den aktuellen \\if-Block zu beenden" -#: command.c:611 +#: command.c:614 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "konnte Home-Verzeichnis für Benutzer-ID %ld nicht ermitteln: %s" -#: command.c:630 +#: command.c:633 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: konnte nicht in das Verzeichnis »%s« wechseln: %m" -#: command.c:654 +#: command.c:657 #, c-format msgid "You are currently not connected to a database.\n" msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden.\n" -#: command.c:664 +#: command.c:667 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« auf Adresse »%s« auf Port »%s«.\n" -#: command.c:667 +#: command.c:670 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« via Socket in »%s« auf Port »%s«.\n" -#: command.c:673 +#: command.c:676 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« (Adresse »%s«) auf Port »%s«.\n" -#: command.c:676 +#: command.c:679 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Sie sind verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« auf Port »%s«.\n" -#: command.c:1064 command.c:1157 command.c:2680 +#: command.c:1069 command.c:1170 command.c:2675 #, c-format msgid "no query buffer" msgstr "kein Anfragepuffer" -#: command.c:1097 command.c:5682 +#: command.c:1102 command.c:5776 #, c-format msgid "invalid line number: %s" msgstr "ungültige Zeilennummer: %s" -#: command.c:1235 +#: command.c:1248 msgid "No changes" msgstr "keine Änderungen" -#: command.c:1313 +#: command.c:1333 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: ungültiger Kodierungsname oder Umwandlungsprozedur nicht gefunden" -#: command.c:1348 command.c:2150 command.c:3433 command.c:3630 command.c:5788 -#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120 -#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480 -#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192 -#: large_obj.c:254 startup.c:304 +#: command.c:1368 command.c:2157 command.c:3454 command.c:3652 command.c:5882 +#: common.c:221 common.c:270 common.c:440 common.c:1142 common.c:1160 +#: common.c:1228 common.c:1340 common.c:1378 common.c:1475 common.c:1541 +#: copy.c:486 copy.c:722 large_obj.c:157 large_obj.c:192 large_obj.c:254 +#: startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1355 +#: command.c:1375 msgid "There is no previous error." msgstr "Es gibt keinen vorangegangenen Fehler." -#: command.c:1468 +#: command.c:1488 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: rechte Klammer fehlt" -#: command.c:1552 command.c:1682 command.c:1986 command.c:2000 command.c:2019 -#: command.c:2201 command.c:2442 command.c:2647 command.c:2687 +#: command.c:1572 command.c:1691 command.c:1995 command.c:2009 command.c:2028 +#: command.c:2196 command.c:2437 command.c:2642 command.c:2682 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: notwendiges Argument fehlt" -#: command.c:1813 +#: command.c:1822 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: kann nicht nach \\else kommen" -#: command.c:1818 +#: command.c:1827 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: kein passendes \\if" -#: command.c:1882 +#: command.c:1891 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: kann nicht nach \\else kommen" -#: command.c:1887 +#: command.c:1896 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: kein passendes \\if" -#: command.c:1927 +#: command.c:1936 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: kein passendes \\if" -#: command.c:2083 +#: command.c:2092 msgid "Query buffer is empty." msgstr "Anfragepuffer ist leer." -#: command.c:2126 +#: command.c:2135 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Neues Passwort für Benutzer »%s« eingeben: " -#: command.c:2130 +#: command.c:2139 msgid "Enter it again: " msgstr "Geben Sie es noch einmal ein: " -#: command.c:2139 +#: command.c:2148 #, c-format msgid "Passwords didn't match." msgstr "Passwörter stimmten nicht überein." -#: command.c:2236 +#: command.c:2231 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: konnte Wert für Variable nicht lesen" -#: command.c:2338 +#: command.c:2333 msgid "Query buffer reset (cleared)." msgstr "Anfragepuffer wurde gelöscht." -#: command.c:2360 +#: command.c:2355 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Befehlsgeschichte in Datei »%s« geschrieben.\n" -#: command.c:2447 +#: command.c:2442 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: Name der Umgebungsvariable darf kein »=« enthalten" -#: command.c:2495 +#: command.c:2490 #, c-format msgid "function name is required" msgstr "Funktionsname wird benötigt" -#: command.c:2497 +#: command.c:2492 #, c-format msgid "view name is required" msgstr "Sichtname wird benötigt" -#: command.c:2619 +#: command.c:2614 msgid "Timing is on." msgstr "Zeitmessung ist an." -#: command.c:2621 +#: command.c:2616 msgid "Timing is off." msgstr "Zeitmessung ist aus." -#: command.c:2707 command.c:2745 command.c:4072 command.c:4075 command.c:4078 -#: command.c:4084 command.c:4086 command.c:4112 command.c:4122 command.c:4134 -#: command.c:4148 command.c:4175 command.c:4233 common.c:78 copy.c:329 -#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818 +#: command.c:2702 command.c:2740 command.c:4163 command.c:4166 command.c:4169 +#: command.c:4175 command.c:4177 command.c:4203 command.c:4213 command.c:4225 +#: command.c:4239 command.c:4266 command.c:4324 common.c:77 copy.c:329 +#: copy.c:401 psqlscanslash.l:805 psqlscanslash.l:817 psqlscanslash.l:835 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:2734 copy.c:388 +#: command.c:2729 copy.c:388 #, c-format msgid "%s: %s" msgstr "%s: %s" -#: command.c:2804 command.c:2850 +#: command.c:2801 command.c:2867 #, c-format msgid "\\watch: interval value is specified more than once" msgstr "\\watch: Intervallwert mehrmals angegeben" -#: command.c:2814 command.c:2860 +#: command.c:2811 command.c:2877 #, c-format msgid "\\watch: incorrect interval value \"%s\"" msgstr "\\watch: falscher Intervallwert »%s«" -#: command.c:2824 +#: command.c:2821 #, c-format msgid "\\watch: iteration count is specified more than once" msgstr "\\watch: Wiederholungszahl mehrmals angegeben" -#: command.c:2834 +#: command.c:2831 #, c-format msgid "\\watch: incorrect iteration count \"%s\"" msgstr "\\watch: falsche Wiederholungszahl »%s«" #: command.c:2841 #, c-format +msgid "\\watch: minimum row count specified more than once" +msgstr "\\watch: Mindestzeilenzahl mehrmals angegeben" + +#: command.c:2851 +#, c-format +msgid "\\watch: incorrect minimum row count \"%s\"" +msgstr "\\watch: falsche Mindestzeilenzahl »%s«" + +#: command.c:2858 +#, c-format msgid "\\watch: unrecognized parameter \"%s\"" msgstr "\\watch: unbekannter Parameter »%s«" -#: command.c:3234 startup.c:243 startup.c:293 +#: command.c:3255 startup.c:243 startup.c:293 msgid "Password: " msgstr "Passwort: " -#: command.c:3239 startup.c:290 +#: command.c:3260 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Passwort für Benutzer %s: " -#: command.c:3295 +#: command.c:3316 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "Geben Sie Benutzer, Host oder Port nicht separat an, wenn eine Verbindungsangabe verwendet wird" -#: command.c:3330 +#: command.c:3351 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "Es gibt keine Verbindung, von der die Parameter verwendet werden können" -#: command.c:3636 +#: command.c:3658 #, c-format msgid "Previous connection kept" msgstr "Vorherige Verbindung wurde behalten" -#: command.c:3642 +#: command.c:3664 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3698 +#: command.c:3720 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« auf Adresse »%s« auf Port »%s«.\n" -#: command.c:3701 +#: command.c:3723 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« via Socket in »%s« auf Port »%s«.\n" -#: command.c:3707 +#: command.c:3729 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« (Adresse »%s«) auf Port »%s«.\n" -#: command.c:3710 +#: command.c:3732 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s« auf Host »%s« auf Port »%s«.\n" -#: command.c:3715 +#: command.c:3737 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Sie sind jetzt verbunden mit der Datenbank »%s« als Benutzer »%s«.\n" -#: command.c:3755 +#: command.c:3843 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, Server %s)\n" -#: command.c:3768 +#: command.c:3856 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -458,29 +498,33 @@ msgstr "" "WARNUNG: %s-Hauptversion %s, Server-Hauptversion %s.\n" " Einige Features von psql werden eventuell nicht funktionieren.\n" -#: command.c:3805 +#: command.c:3895 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" -msgstr "SSL-Verbindung (Protokoll: %s, Verschlüsselungsmethode: %s, Komprimierung: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s, ALPN: %s)\n" +msgstr "SSL-Verbindung (Protokoll: %s, Verschlüsselungsmethode: %s, Komprimierung: %s, ALPN: %s)\n" -#: command.c:3806 command.c:3807 +#: command.c:3896 command.c:3897 msgid "unknown" msgstr "unbekannt" -#: command.c:3808 help.c:42 +#: command.c:3898 help.c:42 msgid "off" msgstr "aus" -#: command.c:3808 help.c:42 +#: command.c:3898 help.c:42 msgid "on" msgstr "an" -#: command.c:3822 +#: command.c:3899 +msgid "none" +msgstr "keine" + +#: command.c:3913 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPI-verschlüsselte Verbindung\n" -#: command.c:3842 +#: command.c:3933 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -492,433 +536,438 @@ msgstr "" " richtig. Einzelheiten finden Sie auf der psql-Handbuchseite unter\n" " »Notes for Windows users«.\n" -#: command.c:3947 +#: command.c:4038 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "Umgebungsvariable PSQL_EDITOR_LINENUMBER_ARG muss gesetzt werden, um eine Zeilennummer angeben zu können" -#: command.c:3977 +#: command.c:4068 #, c-format msgid "could not start editor \"%s\"" msgstr "konnte Editor »%s« nicht starten" -#: command.c:3979 +#: command.c:4070 #, c-format msgid "could not start /bin/sh" msgstr "konnte /bin/sh nicht starten" -#: command.c:4029 +#: command.c:4120 #, c-format msgid "could not locate temporary directory: %s" msgstr "konnte temporäres Verzeichnis nicht finden: %s" -#: command.c:4056 +#: command.c:4147 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht öffnen: %m" -#: command.c:4392 +#: command.c:4483 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: Abkürzung »%s« ist nicht eindeutig, passt auf »%s« und »%s«" -#: command.c:4412 +#: command.c:4503 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset: zulässige Formate sind aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:4431 +#: command.c:4522 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: zulässige Linienstile sind ascii, old-ascii, unicode" -#: command.c:4446 +#: command.c:4537 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: zulässige Unicode-Rahmnenlinienstile sind single, double" -#: command.c:4461 +#: command.c:4552 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: zulässige Unicode-Spaltenlinienstile sind single, double" -#: command.c:4476 +#: command.c:4567 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: zulässige Unicode-Kopflinienstile sind single, double" -#: command.c:4528 +#: command.c:4619 #, c-format msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width" msgstr "\\pset: zulässige Werte für xheader_width sind »%s« (Standard), »%s«, »%s« oder eine Zahl, die die genaue Breite angibt" -#: command.c:4542 +#: command.c:4636 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep muss ein einzelnes Ein-Byte-Zeichen sein" -#: command.c:4547 +#: command.c:4641 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldsep kann nicht doppeltes Anführungszeichen, Newline oder Carriage Return sein" -#: command.c:4684 command.c:4885 +#: command.c:4779 command.c:4980 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: unbekannte Option: %s" -#: command.c:4704 +#: command.c:4799 #, c-format msgid "Border style is %d.\n" msgstr "Rahmenstil ist %d.\n" -#: command.c:4710 +#: command.c:4805 #, c-format msgid "Target width is unset.\n" msgstr "Zielbreite ist nicht gesetzt.\n" -#: command.c:4712 +#: command.c:4807 #, c-format msgid "Target width is %d.\n" msgstr "Zielbreite ist %d.\n" -#: command.c:4719 +#: command.c:4814 #, c-format msgid "Expanded display is on.\n" msgstr "Erweiterte Anzeige ist an.\n" -#: command.c:4721 +#: command.c:4816 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Erweiterte Anzeige wird automatisch verwendet.\n" -#: command.c:4723 +#: command.c:4818 #, c-format msgid "Expanded display is off.\n" msgstr "Erweiterte Anzeige ist aus.\n" -#: command.c:4730 command.c:4732 command.c:4734 +#: command.c:4825 command.c:4827 command.c:4829 #, c-format msgid "Expanded header width is \"%s\".\n" msgstr "Erweiterte Kopfzeilenbreite ist »%s«.\n" -#: command.c:4736 +#: command.c:4831 #, c-format msgid "Expanded header width is %d.\n" msgstr "Erweiterte Kopfzeilenbreite ist %d.\n" -#: command.c:4742 +#: command.c:4837 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Feldtrennzeichen für CSV ist »%s«.\n" -#: command.c:4750 command.c:4758 +#: command.c:4845 command.c:4853 #, c-format msgid "Field separator is zero byte.\n" msgstr "Feldtrennzeichen ist ein Null-Byte.\n" -#: command.c:4752 +#: command.c:4847 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Feldtrennzeichen ist »%s«.\n" -#: command.c:4765 +#: command.c:4860 #, c-format msgid "Default footer is on.\n" msgstr "Standardfußzeile ist an.\n" -#: command.c:4767 +#: command.c:4862 #, c-format msgid "Default footer is off.\n" msgstr "Standardfußzeile ist aus.\n" -#: command.c:4773 +#: command.c:4868 #, c-format msgid "Output format is %s.\n" msgstr "Ausgabeformat ist »%s«.\n" -#: command.c:4779 +#: command.c:4874 #, c-format msgid "Line style is %s.\n" msgstr "Linienstil ist %s.\n" -#: command.c:4786 +#: command.c:4881 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null-Anzeige ist »%s«.\n" -#: command.c:4794 +#: command.c:4889 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Lokalisiertes Format für numerische Daten ist an.\n" -#: command.c:4796 +#: command.c:4891 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Lokalisiertes Format für numerische Daten ist aus.\n" -#: command.c:4803 +#: command.c:4898 #, c-format msgid "Pager is used for long output.\n" msgstr "Pager wird für lange Ausgaben verwendet.\n" -#: command.c:4805 +#: command.c:4900 #, c-format msgid "Pager is always used.\n" msgstr "Pager wird immer verwendet.\n" -#: command.c:4807 +#: command.c:4902 #, c-format msgid "Pager usage is off.\n" msgstr "Pager-Verwendung ist aus.\n" -#: command.c:4813 +#: command.c:4908 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "Pager wird nicht für weniger als %d Zeile verwendet werden.\n" msgstr[1] "Pager wird nicht für weniger als %d Zeilen verwendet werden.\n" -#: command.c:4823 command.c:4833 +#: command.c:4918 command.c:4928 #, c-format msgid "Record separator is zero byte.\n" msgstr "Satztrennzeichen ist ein Null-Byte.\n" -#: command.c:4825 +#: command.c:4920 #, c-format msgid "Record separator is .\n" msgstr "Satztrennzeichen ist .\n" -#: command.c:4827 +#: command.c:4922 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Satztrennzeichen ist »%s«.\n" -#: command.c:4840 +#: command.c:4935 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Tabellenattribute sind »%s«.\n" -#: command.c:4843 +#: command.c:4938 #, c-format msgid "Table attributes unset.\n" msgstr "Tabellenattribute sind nicht gesetzt.\n" -#: command.c:4850 +#: command.c:4945 #, c-format msgid "Title is \"%s\".\n" msgstr "Titel ist »%s«.\n" -#: command.c:4852 +#: command.c:4947 #, c-format msgid "Title is unset.\n" msgstr "Titel ist nicht gesetzt.\n" -#: command.c:4859 +#: command.c:4954 #, c-format msgid "Tuples only is on.\n" msgstr "Nur Datenzeilen ist an.\n" -#: command.c:4861 +#: command.c:4956 #, c-format msgid "Tuples only is off.\n" msgstr "Nur Datenzeilen ist aus.\n" -#: command.c:4867 +#: command.c:4962 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Unicode-Rahmenlinienstil ist »%s«.\n" -#: command.c:4873 +#: command.c:4968 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Unicode-Spaltenlinienstil ist »%s«.\n" -#: command.c:4879 +#: command.c:4974 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Unicode-Kopflinienstil ist »%s«.\n" -#: command.c:5127 +#: command.c:5223 #, c-format msgid "\\!: failed" msgstr "\\!: fehlgeschlagen" -#: command.c:5161 +#: command.c:5261 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch kann nicht mit einer leeren Anfrage verwendet werden" -#: command.c:5193 +#: command.c:5293 #, c-format msgid "could not set timer: %m" msgstr "konnte Timer nicht setzen: %m" -#: command.c:5262 +#: command.c:5362 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (alle %gs)\n" -#: command.c:5265 +#: command.c:5365 #, c-format msgid "%s (every %gs)\n" msgstr "%s (alle %gs)\n" -#: command.c:5333 +#: command.c:5429 #, c-format msgid "could not wait for signals: %m" msgstr "konnte nicht auf Signale warten: %m" -#: command.c:5391 command.c:5398 common.c:592 common.c:599 common.c:1083 +#: command.c:5485 command.c:5492 common.c:632 common.c:639 common.c:1123 #, c-format msgid "" -"********* QUERY **********\n" +"/******** QUERY *********/\n" "%s\n" -"**************************\n" +"/************************/\n" "\n" msgstr "" -"******** ANFRAGE *********\n" +"/******* ANFRAGE ********/\n" "%s\n" -"**************************\n" +"/************************/\n" "\n" -#: command.c:5577 +#: command.c:5671 #, c-format msgid "\"%s.%s\" is not a view" msgstr "»%s.%s« ist keine Sicht" -#: command.c:5593 +#: command.c:5687 #, c-format msgid "could not parse reloptions array" msgstr "konnte reloptions-Array nicht interpretieren" -#: common.c:167 +#: common.c:206 #, c-format msgid "cannot escape without active connection" msgstr "Escape kann nicht ohne aktive Verbindung ausgeführt werden" -#: common.c:208 +#: common.c:247 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s«" -#: common.c:312 +#: common.c:351 #, c-format msgid "connection to server was lost" msgstr "Verbindung zum Server wurde verloren" -#: common.c:316 +#: common.c:355 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "Die Verbindung zum Server wurde verloren. Versuche Reset: " -#: common.c:321 +#: common.c:360 #, c-format msgid "Failed.\n" msgstr "Fehlgeschlagen.\n" -#: common.c:338 +#: common.c:377 #, c-format msgid "Succeeded.\n" msgstr "Erfolgreich.\n" -#: common.c:390 common.c:1021 +#: common.c:430 common.c:1061 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "unerwarteter PQresultStatus: %d" -#: common.c:531 +#: common.c:571 #, c-format msgid "Time: %.3f ms\n" msgstr "Zeit: %.3f ms\n" -#: common.c:546 +#: common.c:586 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Zeit: %.3f ms (%02d:%06.3f)\n" -#: common.c:555 +#: common.c:595 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Zeit: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:562 +#: common.c:602 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Zeit: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:586 common.c:643 common.c:1054 describe.c:6153 +#: common.c:626 common.c:683 common.c:1094 describe.c:6192 #, c-format msgid "You are currently not connected to a database." msgstr "Sie sind gegenwärtig nicht mit einer Datenbank verbunden." -#: common.c:674 +#: common.c:714 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "Asynchrone Benachrichtigung »%s« mit Daten »%s« vom Serverprozess mit PID %d empfangen.\n" -#: common.c:677 +#: common.c:717 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "Asynchrone Benachrichtigung »%s« vom Serverprozess mit PID %d empfangen.\n" -#: common.c:708 +#: common.c:748 #, c-format msgid "could not print result table: %m" msgstr "konnte Ergebnistabelle nicht ausgeben: %m" -#: common.c:728 +#: common.c:768 #, c-format msgid "no rows returned for \\gset" msgstr "keine Zeilen für \\gset zurückgegeben" -#: common.c:733 +#: common.c:773 #, c-format msgid "more than one row returned for \\gset" msgstr "mehr als eine Zeile für \\gset zurückgegeben" -#: common.c:751 +#: common.c:791 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "Versuch von \\gset in besonders behandelte Variable »%s« ignoriert" -#: common.c:1063 +#: common.c:1103 #, c-format msgid "" -"***(Single step mode: verify command)*******************************************\n" +"/**(Single step mode: verify command)******************************************/\n" "%s\n" -"***(press return to proceed or enter x and return to cancel)********************\n" +"/**(press return to proceed or enter x and return to cancel)*******************/\n" msgstr "" -"***(Einzelschrittmodus: Anfrage bestätigen)*************************************\n" +"/**(Einzelschrittmodus: Anfrage bestätigen)************************************/\n" "%s\n" -"***(Drücken Sie die Eingabetaste um fortzufahren oder »x« um abzubrechen)*******\n" +"/**(Drücken Sie die Eingabetaste um fortzufahren oder »x« um abzubrechen)******/\n" -#: common.c:1146 +#: common.c:1180 #, c-format msgid "STATEMENT: %s" msgstr "ANWEISUNG: %s" -#: common.c:1182 +#: common.c:1216 #, c-format msgid "unexpected transaction status (%d)" msgstr "unerwarteter Transaktionsstatus (%d)" -#: common.c:1335 describe.c:2026 +#: common.c:1362 describe.c:2025 msgid "Column" msgstr "Spalte" -#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046 -#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027 -#: describe.c:3897 describe.c:4109 describe.c:4348 describe.c:4510 -#: describe.c:5785 +#: common.c:1363 describe.c:169 describe.c:355 describe.c:373 describe.c:1043 +#: describe.c:1201 describe.c:1731 describe.c:1755 describe.c:2026 +#: describe.c:3956 describe.c:4167 describe.c:4404 describe.c:4564 +#: describe.c:5829 msgid "Type" msgstr "Typ" -#: common.c:1385 +#: common.c:1412 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "Der Befehl hat kein Ergebnis oder das Ergebnis hat keine Spalten.\n" +#: common.c:1504 +#, c-format +msgid "fetching results in chunked mode failed" +msgstr "Empfangen der Ergebnisse im Chunked-Modus fehlgeschlagen" + #: copy.c:98 #, c-format msgid "\\copy: arguments required" @@ -934,11 +983,6 @@ msgstr "\\copy: Parse-Fehler bei »%s«" msgid "\\copy: parse error at end of line" msgstr "\\copy: Parse-Fehler am Zeilenende" -#: copy.c:326 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "konnte Befehl »%s« nicht ausführen: %m" - #: copy.c:342 #, c-format msgid "could not stat file \"%s\": %m" @@ -976,338 +1020,339 @@ msgstr "" "Geben Sie die zu kopierenden Daten ein, gefolgt von einem Zeilenende.\n" "Beenden Sie mit einem Backslash und einem Punkt alleine auf einer Zeile, oder einem EOF-Signal." -#: copy.c:682 +#: copy.c:684 msgid "aborted because of read failure" msgstr "abgebrochen wegen Lesenfehlers" -#: copy.c:716 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "versuche, den COPY-Modus zu verlassen" -#: crosstabview.c:123 +#: crosstabview.c:124 #, c-format msgid "\\crosstabview: statement did not return a result set" msgstr "\\crosstabview: Anweisung hat keine Ergebnismenge zurückgegeben" -#: crosstabview.c:129 +#: crosstabview.c:130 #, c-format msgid "\\crosstabview: query must return at least three columns" msgstr "\\crosstabview: Anfrage muss mindestens drei Spalten zurückgeben" -#: crosstabview.c:156 +#: crosstabview.c:157 #, c-format msgid "\\crosstabview: vertical and horizontal headers must be different columns" msgstr "\\crosstabview: die vertikalen und horizontalen Kopffelder müssen verschiedene Spalten sein" -#: crosstabview.c:172 +#: crosstabview.c:173 #, c-format msgid "\\crosstabview: data column must be specified when query returns more than three columns" msgstr "\\crosstabview: Datenspalte muss angegeben werden, wenn die Anfrage mehr als drei Spalten zurückgibt" -#: crosstabview.c:228 +#: crosstabview.c:229 #, c-format msgid "\\crosstabview: maximum number of columns (%d) exceeded" msgstr "\\crosstabview: maximale Anzahl Spalten (%d) überschritten" -#: crosstabview.c:397 +#: crosstabview.c:398 #, c-format msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" msgstr "\\crosstabview: Anfrageergebnis enthält mehrfache Datenwerte für Zeile »%s«, Spalte »%s«" -#: crosstabview.c:645 +#: crosstabview.c:646 #, c-format msgid "\\crosstabview: column number %d is out of range 1..%d" msgstr "\\crosstabview: Spaltennummer %d ist außerhalb des zulässigen Bereichs 1..%d" -#: crosstabview.c:670 +#: crosstabview.c:671 #, c-format msgid "\\crosstabview: ambiguous column name: \"%s\"" msgstr "\\crosstabview: zweideutiger Spaltenname: »%s«" -#: crosstabview.c:678 +#: crosstabview.c:679 #, c-format msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: Spaltenname nicht gefunden: »%s«" -#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038 -#: describe.c:1189 describe.c:1264 describe.c:3886 describe.c:4096 -#: describe.c:4346 describe.c:4428 describe.c:4663 describe.c:4871 -#: describe.c:5113 describe.c:5357 describe.c:5427 describe.c:5438 -#: describe.c:5495 describe.c:5899 describe.c:5977 +#: describe.c:87 describe.c:335 describe.c:626 describe.c:802 describe.c:1035 +#: describe.c:1190 describe.c:1264 describe.c:3945 describe.c:4154 +#: describe.c:4402 describe.c:4483 describe.c:4715 describe.c:4921 +#: describe.c:5165 describe.c:5406 describe.c:5475 describe.c:5486 +#: describe.c:5542 describe.c:5941 describe.c:6018 msgid "Schema" msgstr "Schema" -#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631 -#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265 -#: describe.c:3887 describe.c:4097 describe.c:4262 describe.c:4347 -#: describe.c:4429 describe.c:4592 describe.c:4664 describe.c:4872 -#: describe.c:4985 describe.c:5114 describe.c:5358 describe.c:5428 -#: describe.c:5439 describe.c:5496 describe.c:5695 describe.c:5766 -#: describe.c:5975 describe.c:6204 describe.c:6512 +#: describe.c:88 describe.c:166 describe.c:227 describe.c:336 describe.c:627 +#: describe.c:803 describe.c:924 describe.c:1036 describe.c:1265 +#: describe.c:3946 describe.c:4155 describe.c:4319 describe.c:4403 +#: describe.c:4484 describe.c:4645 describe.c:4716 describe.c:4922 +#: describe.c:5038 describe.c:5166 describe.c:5407 describe.c:5476 +#: describe.c:5487 describe.c:5543 describe.c:5740 describe.c:5810 +#: describe.c:6016 describe.c:6243 describe.c:6551 msgid "Name" msgstr "Name" -#: describe.c:89 describe.c:351 describe.c:369 +#: describe.c:89 describe.c:348 describe.c:366 msgid "Result data type" msgstr "Ergebnisdatentyp" -#: describe.c:90 describe.c:352 describe.c:370 +#: describe.c:90 describe.c:349 describe.c:367 msgid "Argument data types" msgstr "Argumentdatentypen" -#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418 -#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047 -#: describe.c:3682 describe.c:3941 describe.c:4143 describe.c:4286 -#: describe.c:4360 describe.c:4438 describe.c:4605 describe.c:4783 -#: describe.c:4921 describe.c:4994 describe.c:5115 describe.c:5266 -#: describe.c:5308 describe.c:5374 describe.c:5431 describe.c:5440 -#: describe.c:5497 describe.c:5713 describe.c:5788 describe.c:5913 -#: describe.c:5978 describe.c:7032 +#: describe.c:98 describe.c:105 describe.c:177 describe.c:241 describe.c:415 +#: describe.c:658 describe.c:818 describe.c:972 describe.c:1267 describe.c:2046 +#: describe.c:3676 describe.c:4000 describe.c:4201 describe.c:4343 +#: describe.c:4416 describe.c:4493 describe.c:4658 describe.c:4834 +#: describe.c:4975 describe.c:5047 describe.c:5167 describe.c:5317 +#: describe.c:5358 describe.c:5423 describe.c:5479 describe.c:5488 +#: describe.c:5544 describe.c:5758 describe.c:5832 describe.c:5955 +#: describe.c:6019 describe.c:7078 msgid "Description" msgstr "Beschreibung" -#: describe.c:128 +#: describe.c:127 msgid "List of aggregate functions" msgstr "Liste der Aggregatfunktionen" -#: describe.c:153 +#: describe.c:152 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Der Server (Version %s) unterstützt keine Zugriffsmethoden." -#: describe.c:168 +#: describe.c:167 msgid "Index" msgstr "Index" -#: describe.c:169 describe.c:3905 describe.c:4122 describe.c:5900 +#: describe.c:168 describe.c:3964 describe.c:4180 describe.c:5942 msgid "Table" msgstr "Tabelle" -#: describe.c:177 describe.c:5697 +#: describe.c:176 describe.c:5742 msgid "Handler" msgstr "Handler" -#: describe.c:201 +#: describe.c:199 msgid "List of access methods" msgstr "Liste der Zugriffsmethoden" -#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188 -#: describe.c:3898 describe.c:4098 describe.c:4263 describe.c:4594 -#: describe.c:4986 describe.c:5696 describe.c:5767 describe.c:6205 -#: describe.c:6393 describe.c:6513 describe.c:6672 describe.c:6758 -#: describe.c:7020 +#: describe.c:228 describe.c:401 describe.c:651 describe.c:925 describe.c:1189 +#: describe.c:3957 describe.c:4156 describe.c:4320 describe.c:4647 +#: describe.c:5039 describe.c:5741 describe.c:5811 describe.c:6244 +#: describe.c:6431 describe.c:6552 describe.c:6722 describe.c:6807 +#: describe.c:7066 msgid "Owner" msgstr "Eigentümer" -#: describe.c:231 +#: describe.c:229 msgid "Location" msgstr "Pfad" -#: describe.c:241 describe.c:3517 +#: describe.c:239 describe.c:3517 describe.c:3857 msgid "Options" msgstr "Optionen" -#: describe.c:242 describe.c:653 describe.c:972 describe.c:3940 +#: describe.c:240 describe.c:649 describe.c:970 describe.c:3999 msgid "Size" msgstr "Größe" -#: describe.c:266 +#: describe.c:263 msgid "List of tablespaces" msgstr "Liste der Tablespaces" -#: describe.c:311 +#: describe.c:308 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df akzeptiert nur [anptwS+] als Optionen" -#: describe.c:319 +#: describe.c:316 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df akzeptiert die Option »%c« nicht mit Serverversion %s" #. translator: "agg" is short for "aggregate" -#: describe.c:354 describe.c:372 +#: describe.c:351 describe.c:369 msgid "agg" msgstr "Agg" -#: describe.c:355 describe.c:373 +#: describe.c:352 describe.c:370 msgid "window" msgstr "Fenster" -#: describe.c:356 +#: describe.c:353 msgid "proc" msgstr "Proz" -#: describe.c:357 describe.c:375 +#: describe.c:354 describe.c:372 msgid "func" msgstr "Funk" -#: describe.c:374 describe.c:1397 +#: describe.c:371 describe.c:1397 msgid "trigger" msgstr "Trigger" -#: describe.c:386 +#: describe.c:383 msgid "immutable" msgstr "unveränderlich" -#: describe.c:387 +#: describe.c:384 msgid "stable" msgstr "stabil" -#: describe.c:388 +#: describe.c:385 msgid "volatile" msgstr "volatil" -#: describe.c:389 +#: describe.c:386 msgid "Volatility" msgstr "Volatilität" -#: describe.c:397 +#: describe.c:394 msgid "restricted" msgstr "beschränkt" -#: describe.c:398 +#: describe.c:395 msgid "safe" msgstr "sicher" -#: describe.c:399 +#: describe.c:396 msgid "unsafe" msgstr "unsicher" -#: describe.c:400 +#: describe.c:397 msgid "Parallel" msgstr "Parallel" -#: describe.c:405 +#: describe.c:402 msgid "definer" msgstr "definer" -#: describe.c:406 +#: describe.c:403 msgid "invoker" msgstr "invoker" -#: describe.c:407 +#: describe.c:404 msgid "Security" msgstr "Sicherheit" -#: describe.c:412 +#: describe.c:409 msgid "Language" msgstr "Sprache" -#: describe.c:415 describe.c:652 +#: describe.c:412 describe.c:648 msgid "Internal name" msgstr "Interner Name" -#: describe.c:589 +#: describe.c:585 msgid "List of functions" msgstr "Liste der Funktionen" -#: describe.c:654 +#: describe.c:650 msgid "Elements" msgstr "Elemente" -#: describe.c:706 +#: describe.c:701 msgid "List of data types" msgstr "Liste der Datentypen" -#: describe.c:809 +#: describe.c:804 msgid "Left arg type" msgstr "Linker Typ" -#: describe.c:810 +#: describe.c:805 msgid "Right arg type" msgstr "Rechter Typ" -#: describe.c:811 +#: describe.c:806 msgid "Result type" msgstr "Ergebnistyp" -#: describe.c:816 describe.c:4600 describe.c:4766 describe.c:5265 -#: describe.c:6949 describe.c:6953 +#: describe.c:811 describe.c:4653 describe.c:4817 describe.c:5316 +#: describe.c:6996 describe.c:7000 msgid "Function" msgstr "Funktion" -#: describe.c:897 +#: describe.c:891 msgid "List of operators" msgstr "Liste der Operatoren" -#: describe.c:932 +#: describe.c:926 msgid "Encoding" msgstr "Kodierung" -#: describe.c:936 describe.c:940 +#: describe.c:930 describe.c:934 msgid "Locale Provider" msgstr "Locale-Provider" -#: describe.c:944 describe.c:4886 +#: describe.c:938 describe.c:4936 msgid "Collate" msgstr "Sortierfolge" -#: describe.c:945 describe.c:4887 +#: describe.c:939 describe.c:4937 msgid "Ctype" msgstr "Zeichentyp" -#: describe.c:949 describe.c:953 describe.c:4892 describe.c:4896 -msgid "ICU Locale" -msgstr "ICU-Locale" +#: describe.c:943 describe.c:947 describe.c:951 describe.c:4942 describe.c:4946 +#: describe.c:4950 +msgid "Locale" +msgstr "Locale" -#: describe.c:957 describe.c:961 describe.c:4901 describe.c:4905 +#: describe.c:955 describe.c:959 describe.c:4955 describe.c:4959 msgid "ICU Rules" msgstr "ICU-Regeln" -#: describe.c:973 +#: describe.c:971 msgid "Tablespace" msgstr "Tablespace" -#: describe.c:999 +#: describe.c:996 msgid "List of databases" msgstr "Liste der Datenbanken" -#: describe.c:1040 describe.c:1191 describe.c:3888 +#: describe.c:1037 describe.c:1192 describe.c:3947 msgid "table" msgstr "Tabelle" -#: describe.c:1041 describe.c:3889 +#: describe.c:1038 describe.c:3948 msgid "view" msgstr "Sicht" -#: describe.c:1042 describe.c:3890 +#: describe.c:1039 describe.c:3949 msgid "materialized view" msgstr "materialisierte Sicht" -#: describe.c:1043 describe.c:1193 describe.c:3892 +#: describe.c:1040 describe.c:1194 describe.c:3951 msgid "sequence" msgstr "Sequenz" -#: describe.c:1044 describe.c:3894 +#: describe.c:1041 describe.c:3953 msgid "foreign table" msgstr "Fremdtabelle" -#: describe.c:1045 describe.c:3895 describe.c:4107 +#: describe.c:1042 describe.c:3954 describe.c:4165 msgid "partitioned table" msgstr "partitionierte Tabelle" -#: describe.c:1056 +#: describe.c:1058 msgid "Column privileges" msgstr "Spaltenprivilegien" -#: describe.c:1087 describe.c:1121 +#: describe.c:1089 describe.c:1123 msgid "Policies" msgstr "Policys" -#: describe.c:1150 describe.c:4516 describe.c:6617 +#: describe.c:1151 describe.c:4570 describe.c:6667 msgid "Access privileges" msgstr "Zugriffsprivilegien" -#: describe.c:1195 +#: describe.c:1196 msgid "function" msgstr "Funktion" -#: describe.c:1197 +#: describe.c:1198 msgid "type" msgstr "Typ" -#: describe.c:1199 +#: describe.c:1200 msgid "schema" msgstr "Schema" @@ -1339,293 +1384,293 @@ msgstr "Operatorfamilie" msgid "rule" msgstr "Rule" -#: describe.c:1421 +#: describe.c:1420 msgid "Object descriptions" msgstr "Objektbeschreibungen" -#: describe.c:1486 describe.c:4013 +#: describe.c:1485 describe.c:4072 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Keine Relation namens »%s« gefunden" -#: describe.c:1489 describe.c:4016 +#: describe.c:1488 describe.c:4075 #, c-format msgid "Did not find any relations." msgstr "Keine Relationen gefunden" -#: describe.c:1685 +#: describe.c:1684 #, c-format msgid "Did not find any relation with OID %s." msgstr "Keine Relation mit OID %s gefunden" -#: describe.c:1733 describe.c:1757 +#: describe.c:1732 describe.c:1756 msgid "Start" msgstr "Start" -#: describe.c:1734 describe.c:1758 +#: describe.c:1733 describe.c:1757 msgid "Minimum" msgstr "Minimum" -#: describe.c:1735 describe.c:1759 +#: describe.c:1734 describe.c:1758 msgid "Maximum" msgstr "Maximum" -#: describe.c:1736 describe.c:1760 +#: describe.c:1735 describe.c:1759 msgid "Increment" msgstr "Inkrement" -#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4432 -#: describe.c:4777 describe.c:4910 describe.c:4915 describe.c:6660 +#: describe.c:1736 describe.c:1760 describe.c:1889 describe.c:4487 +#: describe.c:4828 describe.c:4964 describe.c:4969 describe.c:6710 msgid "yes" msgstr "ja" -#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4432 -#: describe.c:4774 describe.c:4910 describe.c:6661 +#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4487 +#: describe.c:4825 describe.c:4964 describe.c:6711 msgid "no" msgstr "nein" -#: describe.c:1739 describe.c:1763 +#: describe.c:1738 describe.c:1762 msgid "Cycles?" msgstr "Zyklisch?" -#: describe.c:1740 describe.c:1764 +#: describe.c:1739 describe.c:1763 msgid "Cache" msgstr "Cache" -#: describe.c:1805 +#: describe.c:1804 #, c-format msgid "Owned by: %s" msgstr "Eigentümer: %s" -#: describe.c:1809 +#: describe.c:1808 #, c-format msgid "Sequence for identity column: %s" msgstr "Sequenz für Identitätsspalte: %s" -#: describe.c:1817 +#: describe.c:1816 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "Ungeloggte Sequenz »%s.%s«" -#: describe.c:1820 +#: describe.c:1819 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Sequenz »%s.%s«" -#: describe.c:1963 +#: describe.c:1962 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Ungeloggte Tabelle »%s.%s«" -#: describe.c:1966 +#: describe.c:1965 #, c-format msgid "Table \"%s.%s\"" msgstr "Tabelle »%s.%s«" -#: describe.c:1970 +#: describe.c:1969 #, c-format msgid "View \"%s.%s\"" msgstr "Sicht »%s.%s«" -#: describe.c:1975 +#: describe.c:1974 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Ungeloggte materialisierte Sicht »%s.%s«" -#: describe.c:1978 +#: describe.c:1977 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Materialisierte Sicht »%s.%s«" -#: describe.c:1983 +#: describe.c:1982 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Ungeloggter Index »%s.%s«" -#: describe.c:1986 +#: describe.c:1985 #, c-format msgid "Index \"%s.%s\"" msgstr "Index »%s.%s«" -#: describe.c:1991 +#: describe.c:1990 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Ungeloggter partitionierter Index »%s.%s«" -#: describe.c:1994 +#: describe.c:1993 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Partitionierter Index »%s.%s«" -#: describe.c:1998 +#: describe.c:1997 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST-Tabelle »%s.%s«" -#: describe.c:2002 +#: describe.c:2001 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Zusammengesetzter Typ »%s.%s«" -#: describe.c:2006 +#: describe.c:2005 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Fremdtabelle »%s.%s«" -#: describe.c:2011 +#: describe.c:2010 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Ungeloggte partitionierte Tabelle »%s.%s«" -#: describe.c:2014 +#: describe.c:2013 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Partitionierte Tabelle »%s.%s«" -#: describe.c:2030 describe.c:4349 +#: describe.c:2029 describe.c:4405 msgid "Collation" msgstr "Sortierfolge" -#: describe.c:2031 describe.c:4350 +#: describe.c:2030 describe.c:4406 msgid "Nullable" msgstr "NULL erlaubt?" -#: describe.c:2032 describe.c:4351 +#: describe.c:2031 describe.c:4407 msgid "Default" msgstr "Vorgabewert" -#: describe.c:2035 +#: describe.c:2034 msgid "Key?" msgstr "Schlüssel?" -#: describe.c:2037 describe.c:4671 describe.c:4682 +#: describe.c:2036 describe.c:4723 describe.c:4734 msgid "Definition" msgstr "Definition" -#: describe.c:2039 describe.c:5712 describe.c:5787 describe.c:5853 -#: describe.c:5912 +#: describe.c:2038 describe.c:5757 describe.c:5831 describe.c:5896 +#: describe.c:5954 msgid "FDW options" msgstr "FDW-Optionen" -#: describe.c:2041 +#: describe.c:2040 msgid "Storage" msgstr "Speicherung" -#: describe.c:2043 +#: describe.c:2042 msgid "Compression" msgstr "Kompression" -#: describe.c:2045 +#: describe.c:2044 msgid "Stats target" msgstr "Statistikziel" -#: describe.c:2181 +#: describe.c:2180 #, c-format msgid "Partition of: %s %s%s" msgstr "Partition von: %s %s%s" -#: describe.c:2194 +#: describe.c:2193 msgid "No partition constraint" msgstr "Kein Partitions-Constraint" -#: describe.c:2196 +#: describe.c:2195 #, c-format msgid "Partition constraint: %s" msgstr "Partitions-Constraint: %s" -#: describe.c:2220 +#: describe.c:2219 #, c-format msgid "Partition key: %s" msgstr "Partitionsschlüssel: %s" -#: describe.c:2246 +#: describe.c:2245 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Gehört zu Tabelle: »%s.%s«" -#: describe.c:2315 +#: describe.c:2314 msgid "primary key, " msgstr "Primärschlüssel, " -#: describe.c:2318 +#: describe.c:2317 msgid "unique" msgstr "unique" -#: describe.c:2320 +#: describe.c:2319 msgid " nulls not distinct" msgstr " nulls not distinct" -#: describe.c:2321 +#: describe.c:2320 msgid ", " msgstr ", " -#: describe.c:2328 +#: describe.c:2327 #, c-format msgid "for table \"%s.%s\"" msgstr "für Tabelle »%s.%s«" -#: describe.c:2332 +#: describe.c:2331 #, c-format msgid ", predicate (%s)" msgstr ", Prädikat (%s)" -#: describe.c:2335 +#: describe.c:2334 msgid ", clustered" msgstr ", geclustert" -#: describe.c:2338 +#: describe.c:2337 msgid ", invalid" msgstr ", ungültig" -#: describe.c:2341 +#: describe.c:2340 msgid ", deferrable" msgstr ", DEFERRABLE" -#: describe.c:2344 +#: describe.c:2343 msgid ", initially deferred" msgstr ", INITIALLY DEFERRED" -#: describe.c:2347 +#: describe.c:2346 msgid ", replica identity" msgstr ", Replika-Identität" -#: describe.c:2401 +#: describe.c:2400 msgid "Indexes:" msgstr "Indexe:" -#: describe.c:2484 +#: describe.c:2483 msgid "Check constraints:" msgstr "Check-Constraints:" -#: describe.c:2552 +#: describe.c:2551 msgid "Foreign-key constraints:" msgstr "Fremdschlüssel-Constraints:" -#: describe.c:2615 +#: describe.c:2614 msgid "Referenced by:" msgstr "Fremdschlüsselverweise von:" -#: describe.c:2665 +#: describe.c:2664 msgid "Policies:" msgstr "Policys:" -#: describe.c:2668 +#: describe.c:2667 msgid "Policies (forced row security enabled):" msgstr "Policys (Sicherheit auf Zeilenebene erzwungen):" -#: describe.c:2671 +#: describe.c:2670 msgid "Policies (row security enabled): (none)" msgstr "Policys (Sicherheit auf Zeilenebene eingeschaltet): (keine)" -#: describe.c:2674 +#: describe.c:2673 msgid "Policies (forced row security enabled): (none)" msgstr "Policys (Sicherheit auf Zeilenebene erzwungen): (keine)" -#: describe.c:2677 +#: describe.c:2676 msgid "Policies (row security disabled):" msgstr "Policys (Sicherheit auf Zeilenebene ausgeschaltet):" -#: describe.c:2737 describe.c:2841 +#: describe.c:2736 describe.c:2841 msgid "Statistics objects:" msgstr "Statistikobjekte:" @@ -1645,7 +1690,7 @@ msgstr "Regeln, die immer aktiv werden:" msgid "Rules firing on replica only:" msgstr "Regeln, die nur im Replikat aktiv werden:" -#: describe.c:3031 describe.c:5048 +#: describe.c:3031 describe.c:5100 msgid "Publications:" msgstr "Publikationen:" @@ -1740,442 +1785,450 @@ msgstr "Tablespace: »%s«" msgid ", tablespace \"%s\"" msgstr ", Tablespace »%s«" -#: describe.c:3674 +#: describe.c:3670 msgid "List of roles" msgstr "Liste der Rollen" -#: describe.c:3676 +#: describe.c:3672 describe.c:3840 msgid "Role name" msgstr "Rollenname" -#: describe.c:3677 +#: describe.c:3673 msgid "Attributes" msgstr "Attribute" -#: describe.c:3679 -msgid "Member of" -msgstr "Mitglied von" - -#: describe.c:3690 +#: describe.c:3684 msgid "Superuser" msgstr "Superuser" -#: describe.c:3693 +#: describe.c:3687 msgid "No inheritance" msgstr "keine Vererbung" -#: describe.c:3696 +#: describe.c:3690 msgid "Create role" msgstr "Rolle erzeugen" -#: describe.c:3699 +#: describe.c:3693 msgid "Create DB" msgstr "DB erzeugen" -#: describe.c:3702 +#: describe.c:3696 msgid "Cannot login" msgstr "kann nicht einloggen" -#: describe.c:3705 +#: describe.c:3699 msgid "Replication" msgstr "Replikation" -#: describe.c:3709 +#: describe.c:3703 msgid "Bypass RLS" msgstr "Bypass RLS" -#: describe.c:3718 +#: describe.c:3712 msgid "No connections" msgstr "keine Verbindungen" -#: describe.c:3720 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d Verbindung" msgstr[1] "%d Verbindungen" -#: describe.c:3730 +#: describe.c:3724 msgid "Password valid until " msgstr "Passwort gültig bis " -#: describe.c:3783 +#: describe.c:3775 msgid "Role" msgstr "Rolle" -#: describe.c:3784 +#: describe.c:3776 msgid "Database" msgstr "Datenbank" -#: describe.c:3785 +#: describe.c:3777 msgid "Settings" msgstr "Einstellung" -#: describe.c:3809 +#: describe.c:3801 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Keine Einstellungen für Rolle »%s« und Datenbank »%s« gefunden" -#: describe.c:3812 +#: describe.c:3804 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Keine Einstellungen für Rolle »%s« gefunden" -#: describe.c:3815 +#: describe.c:3807 #, c-format msgid "Did not find any settings." msgstr "Keine Einstellungen gefunden" -#: describe.c:3820 +#: describe.c:3811 msgid "List of settings" msgstr "Liste der Einstellungen" -#: describe.c:3891 +#: describe.c:3841 +msgid "Member of" +msgstr "Mitglied von" + +#: describe.c:3858 +msgid "Grantor" +msgstr "Grantor" + +#: describe.c:3884 +msgid "List of role grants" +msgstr "Liste der Rollen-Grants" + +#: describe.c:3950 msgid "index" msgstr "Index" -#: describe.c:3893 +#: describe.c:3952 msgid "TOAST table" msgstr "TOAST-Tabelle" -#: describe.c:3896 describe.c:4108 +#: describe.c:3955 describe.c:4166 msgid "partitioned index" msgstr "partitionierter Index" -#: describe.c:3916 +#: describe.c:3975 msgid "permanent" msgstr "permanent" -#: describe.c:3917 +#: describe.c:3976 msgid "temporary" msgstr "temporär" -#: describe.c:3918 +#: describe.c:3977 msgid "unlogged" msgstr "ungeloggt" -#: describe.c:3919 +#: describe.c:3978 msgid "Persistence" msgstr "Persistenz" -#: describe.c:3935 +#: describe.c:3994 msgid "Access method" msgstr "Zugriffsmethode" -#: describe.c:4021 +#: describe.c:4079 msgid "List of relations" msgstr "Liste der Relationen" -#: describe.c:4069 +#: describe.c:4127 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "Der Server (Version %s) unterstützt keine deklarative Tabellenpartitionierung." -#: describe.c:4080 +#: describe.c:4138 msgid "List of partitioned indexes" msgstr "Liste partitionierter Indexe" -#: describe.c:4082 +#: describe.c:4140 msgid "List of partitioned tables" msgstr "Liste partitionierte Tabellen" -#: describe.c:4086 +#: describe.c:4144 msgid "List of partitioned relations" msgstr "Liste partitionierter Relationen" -#: describe.c:4117 +#: describe.c:4175 msgid "Parent name" msgstr "Elternname" -#: describe.c:4130 +#: describe.c:4188 msgid "Leaf partition size" msgstr "Größe Leaf-Partition" -#: describe.c:4133 describe.c:4139 +#: describe.c:4191 describe.c:4197 msgid "Total size" msgstr "Gesamtgröße" -#: describe.c:4264 +#: describe.c:4321 msgid "Trusted" msgstr "Vertraut" -#: describe.c:4273 +#: describe.c:4330 msgid "Internal language" msgstr "Interne Sprache" -#: describe.c:4274 +#: describe.c:4331 msgid "Call handler" msgstr "Call-Handler" -#: describe.c:4275 describe.c:5698 +#: describe.c:4332 describe.c:5743 msgid "Validator" msgstr "Validator" -#: describe.c:4276 +#: describe.c:4333 msgid "Inline handler" msgstr "Inline-Handler" -#: describe.c:4311 +#: describe.c:4367 msgid "List of languages" msgstr "Liste der Sprachen" -#: describe.c:4352 +#: describe.c:4408 msgid "Check" msgstr "Check" -#: describe.c:4396 +#: describe.c:4451 msgid "List of domains" msgstr "Liste der Domänen" -#: describe.c:4430 +#: describe.c:4485 msgid "Source" msgstr "Quelle" -#: describe.c:4431 +#: describe.c:4486 msgid "Destination" msgstr "Ziel" -#: describe.c:4433 describe.c:6662 +#: describe.c:4488 describe.c:6712 msgid "Default?" msgstr "Standard?" -#: describe.c:4475 +#: describe.c:4529 msgid "List of conversions" msgstr "Liste der Konversionen" -#: describe.c:4503 +#: describe.c:4557 msgid "Parameter" msgstr "Parameter" -#: describe.c:4504 +#: describe.c:4558 msgid "Value" msgstr "Wert" -#: describe.c:4511 +#: describe.c:4565 msgid "Context" msgstr "Kontext" -#: describe.c:4544 +#: describe.c:4597 msgid "List of configuration parameters" msgstr "Liste der Konfigurationsparameter" -#: describe.c:4546 +#: describe.c:4599 msgid "List of non-default configuration parameters" msgstr "Liste der veränderten Konfigurationsparameter" -#: describe.c:4573 +#: describe.c:4626 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "Der Server (Version %s) unterstützt keine Ereignistrigger." -#: describe.c:4593 +#: describe.c:4646 msgid "Event" msgstr "Ereignis" -#: describe.c:4595 +#: describe.c:4648 msgid "enabled" msgstr "eingeschaltet" -#: describe.c:4596 +#: describe.c:4649 msgid "replica" msgstr "Replika" -#: describe.c:4597 +#: describe.c:4650 msgid "always" msgstr "immer" -#: describe.c:4598 +#: describe.c:4651 msgid "disabled" msgstr "ausgeschaltet" -#: describe.c:4599 describe.c:6514 +#: describe.c:4652 describe.c:6553 msgid "Enabled" msgstr "Eingeschaltet" -#: describe.c:4601 +#: describe.c:4654 msgid "Tags" msgstr "Tags" -#: describe.c:4625 +#: describe.c:4677 msgid "List of event triggers" msgstr "Liste der Ereignistrigger" -#: describe.c:4652 +#: describe.c:4704 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Der Server (Version %s) unterstützt keine erweiterten Statistiken." -#: describe.c:4689 +#: describe.c:4741 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4690 +#: describe.c:4742 msgid "Dependencies" msgstr "Abhängigkeiten" -#: describe.c:4700 +#: describe.c:4752 msgid "MCV" msgstr "MCV" -#: describe.c:4724 +#: describe.c:4775 msgid "List of extended statistics" msgstr "Liste der erweiterten Statistiken" -#: describe.c:4751 +#: describe.c:4802 msgid "Source type" msgstr "Quelltyp" -#: describe.c:4752 +#: describe.c:4803 msgid "Target type" msgstr "Zieltyp" -#: describe.c:4776 +#: describe.c:4827 msgid "in assignment" msgstr "in Zuweisung" -#: describe.c:4778 +#: describe.c:4829 msgid "Implicit?" msgstr "Implizit?" -#: describe.c:4837 +#: describe.c:4887 msgid "List of casts" msgstr "Liste der Typumwandlungen" -#: describe.c:4877 describe.c:4881 +#: describe.c:4927 describe.c:4931 msgid "Provider" msgstr "Provider" -#: describe.c:4911 describe.c:4916 +#: describe.c:4965 describe.c:4970 msgid "Deterministic?" msgstr "Deterministisch?" -#: describe.c:4956 +#: describe.c:5009 msgid "List of collations" msgstr "Liste der Sortierfolgen" -#: describe.c:5018 +#: describe.c:5070 msgid "List of schemas" msgstr "Liste der Schemas" -#: describe.c:5135 +#: describe.c:5186 msgid "List of text search parsers" msgstr "Liste der Textsucheparser" -#: describe.c:5185 +#: describe.c:5236 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Kein Textsucheparser namens »%s« gefunden" -#: describe.c:5188 +#: describe.c:5239 #, c-format msgid "Did not find any text search parsers." msgstr "Keine Textsucheparser gefunden" -#: describe.c:5263 +#: describe.c:5314 msgid "Start parse" msgstr "Parsen starten" -#: describe.c:5264 +#: describe.c:5315 msgid "Method" msgstr "Methode" -#: describe.c:5268 +#: describe.c:5319 msgid "Get next token" msgstr "Nächstes Token lesen" -#: describe.c:5270 +#: describe.c:5321 msgid "End parse" msgstr "Parsen beenden" -#: describe.c:5272 +#: describe.c:5323 msgid "Get headline" msgstr "Überschrift ermitteln" -#: describe.c:5274 +#: describe.c:5325 msgid "Get token types" msgstr "Tokentypen ermitteln" -#: describe.c:5285 +#: describe.c:5335 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Textsucheparser »%s.%s«" -#: describe.c:5288 +#: describe.c:5338 #, c-format msgid "Text search parser \"%s\"" msgstr "Textsucheparser »%s«" -#: describe.c:5307 +#: describe.c:5357 msgid "Token name" msgstr "Tokenname" -#: describe.c:5321 +#: describe.c:5370 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Tokentypen für Parser »%s.%s«" -#: describe.c:5324 +#: describe.c:5373 #, c-format msgid "Token types for parser \"%s\"" msgstr "Tokentypen für Parser »%s«" -#: describe.c:5368 +#: describe.c:5417 msgid "Template" msgstr "Vorlage" -#: describe.c:5369 +#: describe.c:5418 msgid "Init options" msgstr "Initialisierungsoptionen" -#: describe.c:5396 +#: describe.c:5444 msgid "List of text search dictionaries" msgstr "Liste der Textsuchewörterbücher" -#: describe.c:5429 +#: describe.c:5477 msgid "Init" msgstr "Init" -#: describe.c:5430 +#: describe.c:5478 msgid "Lexize" msgstr "Lexize" -#: describe.c:5462 +#: describe.c:5509 msgid "List of text search templates" msgstr "Liste der Textsuchevorlagen" -#: describe.c:5517 +#: describe.c:5563 msgid "List of text search configurations" msgstr "Liste der Textsuchekonfigurationen" -#: describe.c:5568 +#: describe.c:5614 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Keine Textsuchekonfiguration namens »%s« gefunden" -#: describe.c:5571 +#: describe.c:5617 #, c-format msgid "Did not find any text search configurations." msgstr "Keine Textsuchekonfigurationen gefunden" -#: describe.c:5637 +#: describe.c:5683 msgid "Token" msgstr "Token" -#: describe.c:5638 +#: describe.c:5684 msgid "Dictionaries" msgstr "Wörterbücher" -#: describe.c:5649 +#: describe.c:5695 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Textsuchekonfiguration »%s.%s«" -#: describe.c:5652 +#: describe.c:5698 #, c-format msgid "Text search configuration \"%s\"" msgstr "Textsuchekonfiguration »%s«" -#: describe.c:5656 +#: describe.c:5702 #, c-format msgid "" "\n" @@ -2184,7 +2237,7 @@ msgstr "" "\n" "Parser: »%s.%s«" -#: describe.c:5659 +#: describe.c:5705 #, c-format msgid "" "\n" @@ -2193,265 +2246,273 @@ msgstr "" "\n" "Parser: »%s«" -#: describe.c:5740 +#: describe.c:5784 msgid "List of foreign-data wrappers" msgstr "Liste der Fremddaten-Wrapper" -#: describe.c:5768 +#: describe.c:5812 msgid "Foreign-data wrapper" msgstr "Fremddaten-Wrapper" -#: describe.c:5786 describe.c:5976 +#: describe.c:5830 describe.c:6017 msgid "Version" msgstr "Version" -#: describe.c:5817 +#: describe.c:5860 msgid "List of foreign servers" msgstr "Liste der Fremdserver" -#: describe.c:5842 describe.c:5901 +#: describe.c:5885 describe.c:5943 msgid "Server" msgstr "Server" -#: describe.c:5843 +#: describe.c:5886 msgid "User name" msgstr "Benutzername" -#: describe.c:5873 +#: describe.c:5915 msgid "List of user mappings" msgstr "Liste der Benutzerabbildungen" -#: describe.c:5946 +#: describe.c:5987 msgid "List of foreign tables" msgstr "Liste der Fremdtabellen" -#: describe.c:5998 +#: describe.c:6038 msgid "List of installed extensions" msgstr "Liste der installierten Erweiterungen" -#: describe.c:6046 +#: describe.c:6086 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Keine Erweiterung namens »%s« gefunden" -#: describe.c:6049 +#: describe.c:6089 #, c-format msgid "Did not find any extensions." msgstr "Keine Erweiterungen gefunden" -#: describe.c:6093 +#: describe.c:6133 msgid "Object description" msgstr "Objektbeschreibung" -#: describe.c:6103 +#: describe.c:6142 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objekte in Erweiterung »%s«" -#: describe.c:6144 +#: describe.c:6183 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "falscher qualifizierter Name (zu viele Namensteile): %s" -#: describe.c:6158 +#: describe.c:6197 #, c-format msgid "cross-database references are not implemented: %s" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s" -#: describe.c:6189 describe.c:6316 +#: describe.c:6228 describe.c:6354 #, c-format msgid "The server (version %s) does not support publications." msgstr "Der Server (Version %s) unterstützt keine Publikationen." -#: describe.c:6206 describe.c:6394 +#: describe.c:6245 describe.c:6432 msgid "All tables" msgstr "Alle Tabellen" -#: describe.c:6207 describe.c:6395 +#: describe.c:6246 describe.c:6433 msgid "Inserts" msgstr "Inserts" -#: describe.c:6208 describe.c:6396 +#: describe.c:6247 describe.c:6434 msgid "Updates" msgstr "Updates" -#: describe.c:6209 describe.c:6397 +#: describe.c:6248 describe.c:6435 msgid "Deletes" msgstr "Deletes" -#: describe.c:6213 describe.c:6399 +#: describe.c:6252 describe.c:6437 msgid "Truncates" msgstr "Truncates" -#: describe.c:6217 describe.c:6401 +#: describe.c:6256 describe.c:6439 msgid "Via root" msgstr "Über Wurzel" -#: describe.c:6239 +#: describe.c:6277 msgid "List of publications" msgstr "Liste der Publikationen" -#: describe.c:6363 +#: describe.c:6401 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Keine Publikation namens »%s« gefunden" -#: describe.c:6366 +#: describe.c:6404 #, c-format msgid "Did not find any publications." msgstr "Keine Publikationen gefunden" -#: describe.c:6390 +#: describe.c:6428 #, c-format msgid "Publication %s" msgstr "Publikation %s" -#: describe.c:6443 +#: describe.c:6481 msgid "Tables:" msgstr "Tabellen:" -#: describe.c:6455 +#: describe.c:6493 msgid "Tables from schemas:" msgstr "Tabellen aus Schemas:" -#: describe.c:6499 +#: describe.c:6538 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Der Server (Version %s) unterstützt keine Subskriptionen." -#: describe.c:6515 +#: describe.c:6554 msgid "Publication" msgstr "Publikation" -#: describe.c:6524 +#: describe.c:6563 msgid "Binary" msgstr "Binär" -#: describe.c:6533 describe.c:6537 +#: describe.c:6572 describe.c:6576 msgid "Streaming" msgstr "Streaming" -#: describe.c:6545 +#: describe.c:6584 msgid "Two-phase commit" msgstr "Two-Phase-Commit" -#: describe.c:6546 +#: describe.c:6585 msgid "Disable on error" msgstr "Bei Fehler abschalten" -#: describe.c:6553 +#: describe.c:6592 msgid "Origin" msgstr "Herkunft" -#: describe.c:6554 +#: describe.c:6593 msgid "Password required" msgstr "Passwort nötig" -#: describe.c:6555 +#: describe.c:6594 msgid "Run as owner?" msgstr "Als Eigentümer ausführen?" -#: describe.c:6560 +#: describe.c:6599 +msgid "Failover" +msgstr "Failover" + +#: describe.c:6604 msgid "Synchronous commit" msgstr "Synchroner Commit" -#: describe.c:6561 +#: describe.c:6605 msgid "Conninfo" msgstr "Verbindungsinfo" -#: describe.c:6567 +#: describe.c:6611 msgid "Skip LSN" msgstr "Skip-LSN" -#: describe.c:6594 +#: describe.c:6637 msgid "List of subscriptions" msgstr "Liste der Subskriptionen" -#: describe.c:6656 describe.c:6752 describe.c:6845 describe.c:6940 +#: describe.c:6666 +msgid "(none)" +msgstr "(keine)" + +#: describe.c:6706 describe.c:6801 describe.c:6893 describe.c:6987 msgid "AM" msgstr "AM" -#: describe.c:6657 +#: describe.c:6707 msgid "Input type" msgstr "Eingabetyp" -#: describe.c:6658 +#: describe.c:6708 msgid "Storage type" msgstr "Storage-Typ" -#: describe.c:6659 +#: describe.c:6709 msgid "Operator class" msgstr "Operatorklasse" -#: describe.c:6671 describe.c:6753 describe.c:6846 describe.c:6941 +#: describe.c:6721 describe.c:6802 describe.c:6894 describe.c:6988 msgid "Operator family" msgstr "Operatorfamilie" -#: describe.c:6707 +#: describe.c:6756 msgid "List of operator classes" msgstr "Liste der Operatorklassen" -#: describe.c:6754 +#: describe.c:6803 msgid "Applicable types" msgstr "Passende Typen" -#: describe.c:6796 +#: describe.c:6844 msgid "List of operator families" msgstr "Liste der Operatorfamilien" -#: describe.c:6847 +#: describe.c:6895 msgid "Operator" msgstr "Operator" -#: describe.c:6848 +#: describe.c:6896 msgid "Strategy" msgstr "Strategie" -#: describe.c:6849 +#: describe.c:6897 msgid "ordering" msgstr "Sortieren" -#: describe.c:6850 +#: describe.c:6898 msgid "search" msgstr "Suchen" -#: describe.c:6851 +#: describe.c:6899 msgid "Purpose" msgstr "Zweck" -#: describe.c:6856 +#: describe.c:6904 msgid "Sort opfamily" msgstr "Sortier-Opfamilie" -#: describe.c:6895 +#: describe.c:6942 msgid "List of operators of operator families" msgstr "Liste der Operatoren in Operatorfamilien" -#: describe.c:6942 +#: describe.c:6989 msgid "Registered left type" msgstr "Registrierter linker Typ" -#: describe.c:6943 +#: describe.c:6990 msgid "Registered right type" msgstr "Registrierter rechter Typ" -#: describe.c:6944 +#: describe.c:6991 msgid "Number" msgstr "Nummer" -#: describe.c:6988 +#: describe.c:7034 msgid "List of support functions of operator families" msgstr "Liste der Unterstützungsfunktionen in Operatorfamilien" -#: describe.c:7019 +#: describe.c:7065 msgid "ID" msgstr "ID" -#: describe.c:7040 +#: describe.c:7085 msgid "Large objects" msgstr "Large Objects" -#: help.c:75 +#: help.c:63 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2459,11 +2520,11 @@ msgstr "" "psql ist das interaktive PostgreSQL-Terminal.\n" "\n" -#: help.c:76 help.c:394 help.c:478 help.c:521 +#: help.c:64 help.c:372 help.c:456 help.c:502 msgid "Usage:\n" msgstr "Aufruf:\n" -#: help.c:77 +#: help.c:65 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2471,30 +2532,27 @@ msgstr "" " psql [OPTION]... [DBNAME [BENUTZERNAME]]\n" "\n" -#: help.c:79 +#: help.c:67 msgid "General options:\n" msgstr "Allgemeine Optionen:\n" -#: help.c:84 +#: help.c:68 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=ANWEISUNG einzelne Anweisung ausführen und beenden\n" -#: help.c:85 -#, c-format -msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" -msgstr "" -" -d, --dbname=DBNAME Datenbank, zu der verbunden werden soll\n" -" (Standard: »%s«)\n" +#: help.c:69 +msgid " -d, --dbname=DBNAME database name to connect to\n" +msgstr " -d, --dbname=DBNAME Datenbank, mit der verbunden werden soll\n" -#: help.c:87 +#: help.c:70 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=DATEINAME Anweisungen aus Datei ausführen und danach beenden\n" -#: help.c:88 +#: help.c:71 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list verfügbare Datenbanken auflisten und beenden\n" -#: help.c:89 +#: help.c:72 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2504,15 +2562,15 @@ msgstr "" " psql-Variable NAME auf WERT setzen\n" " (z.B. -v ON_ERROR_STOP=1)\n" -#: help.c:92 +#: help.c:75 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: help.c:93 +#: help.c:76 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc Startdatei (~/.psqlrc) nicht lesen\n" -#: help.c:94 +#: help.c:77 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2521,19 +2579,19 @@ msgstr "" " als eine einzige Transaktion ausführen (wenn nicht\n" " interaktiv)\n" -#: help.c:96 +#: help.c:79 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] diese Hilfe anzeigen, dann beenden\n" -#: help.c:97 +#: help.c:80 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands Backslash-Befehle auflisten, dann beenden\n" -#: help.c:98 +#: help.c:81 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables besondere Variablen auflisten, dann beenden\n" -#: help.c:100 +#: help.c:83 msgid "" "\n" "Input and output options:\n" @@ -2541,51 +2599,51 @@ msgstr "" "\n" "Eingabe- und Ausgabeoptionen:\n" -#: help.c:101 +#: help.c:84 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all Skript-Inhalt wiedergeben\n" -#: help.c:102 +#: help.c:85 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors fehlgeschlagene Anweisungen wiedergeben\n" -#: help.c:103 +#: help.c:86 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries an den Server geschickte Anweisungen zeigen\n" -#: help.c:104 +#: help.c:87 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden von internen Anweisungen erzeugte Anfragen zeigen\n" -#: help.c:105 +#: help.c:88 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr "" " -L, --log-file=DATEINAME\n" " Sitzungslog in Datei senden\n" -#: help.c:106 +#: help.c:89 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline erweiterte Zeilenbearbeitung (Readline) ausschalten\n" -#: help.c:107 +#: help.c:90 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=DATEINAME Anfrageergebnisse in Datei (oder |Pipe) senden\n" -#: help.c:108 +#: help.c:91 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr "" " -q, --quiet stille Ausführung (keine Mitteilungen, nur\n" " Anfrageergebnisse)\n" -#: help.c:109 +#: help.c:92 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step Einzelschrittmodus (jede Anfrage bestätigen)\n" -#: help.c:110 +#: help.c:93 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line Einzelzeilenmodus (Zeilenende beendet SQL-Anweisung)\n" -#: help.c:112 +#: help.c:95 msgid "" "\n" "Output format options:\n" @@ -2593,15 +2651,15 @@ msgstr "" "\n" "Ausgabeformatoptionen:\n" -#: help.c:113 +#: help.c:96 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align unausgerichteter Tabellenausgabemodus\n" -#: help.c:114 +#: help.c:97 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv Tabellenausgabemodus CSV (Comma-Separated Values)\n" -#: help.c:115 +#: help.c:98 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2611,17 +2669,17 @@ msgstr "" " Feldtrennzeichen für unausgerichteten Ausgabemodus\n" " (Standard: »%s«)\n" -#: help.c:118 +#: help.c:101 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML-Tabellenausgabemodus\n" -#: help.c:119 +#: help.c:102 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr "" " -P, --pset=VAR[=ARG] Ausgabeoption VAR auf ARG setzen (siehe\n" " \\pset-Anweisung)\n" -#: help.c:120 +#: help.c:103 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2630,19 +2688,19 @@ msgstr "" " Satztrennzeichen für unausgerichteten Ausgabemodus\n" " (Standard: Newline)\n" -#: help.c:122 +#: help.c:105 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only nur Datenzeilen ausgeben\n" -#: help.c:123 +#: help.c:106 msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr " -T, --table-attr=TEXT HTML »table«-Tag-Attribute setzen (z.B. width, border)\n" -#: help.c:124 +#: help.c:107 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded erweiterte Tabellenausgabe einschalten\n" -#: help.c:125 +#: help.c:108 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2651,7 +2709,7 @@ msgstr "" " Feldtrennzeichen für unausgerichteten Ausgabemodus auf\n" " Null-Byte setzen\n" -#: help.c:127 +#: help.c:110 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2660,7 +2718,7 @@ msgstr "" " Satztrennzeichen für unausgerichteten Ausgabemodus auf\n" " Null-Byte setzen\n" -#: help.c:130 +#: help.c:113 msgid "" "\n" "Connection options:\n" @@ -2668,36 +2726,27 @@ msgstr "" "\n" "Verbindungsoptionen:\n" -#: help.c:133 -#, c-format -msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" -msgstr "" -" -h, --host=HOSTNAME Hostname des Datenbankservers oder\n" -" Socket-Verzeichnis (Standard: »%s«)\n" +#: help.c:114 +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: help.c:134 -msgid "local socket" -msgstr "lokales Socket" +#: help.c:115 +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT Port des Datenbankservers\n" -#: help.c:137 -#, c-format -msgid " -p, --port=PORT database server port (default: \"%s\")\n" -msgstr " -p, --port=PORT Port des Datenbankservers (Standard: »%s«)\n" +#: help.c:116 +msgid " -U, --username=USERNAME database user name\n" +msgstr " -U, --username=NAME Datenbank-Benutzername\n" -#: help.c:140 -#, c-format -msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" -msgstr " -U, --username=NAME Datenbank-Benutzername (Standard: »%s«)\n" - -#: help.c:142 +#: help.c:117 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: help.c:143 +#: help.c:118 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password nach Passwort fragen (sollte automatisch geschehen)\n" -#: help.c:145 +#: help.c:120 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2711,39 +2760,39 @@ msgstr "" "Abschnitt der PostgreSQL-Dokumentation.\n" "\n" -#: help.c:148 +#: help.c:123 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Berichten Sie Fehler an <%s>.\n" -#: help.c:149 +#: help.c:124 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" -#: help.c:191 +#: help.c:166 msgid "General\n" msgstr "Allgemein\n" -#: help.c:192 +#: help.c:167 msgid " \\bind [PARAM]... set query parameters\n" msgstr " \\bind [PARAM]... Anfrageparameter setzen\n" -#: help.c:193 +#: help.c:168 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright PostgreSQL-Urheberrechtsinformationen zeigen\n" -#: help.c:194 +#: help.c:169 msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr "" " \\crosstabview [SPALTEN] Anfrage ausführen und Ergebnis als Kreuztabelle\n" " anzeigen\n" -#: help.c:195 +#: help.c:170 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose letzte Fehlermeldung mit vollen Details anzeigen\n" -#: help.c:196 +#: help.c:171 msgid "" " \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" @@ -2751,238 +2800,244 @@ msgstr "" " \\g [(OPT)] [DATEI] SQL-Anweisung ausführen (und Ergebnis in Datei oder\n" " |Pipe schreiben); \\g ohne Argumente entspricht Semikolon\n" -#: help.c:198 +#: help.c:173 msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc Ergebnis der Anfrage beschreiben ohne sie auszuführen\n" -#: help.c:199 +#: help.c:174 msgid " \\gexec execute query, then execute each value in its result\n" msgstr "" " \\gexec Anfrage ausführen, dann jeden Ergebniswert als\n" " Anweisung ausführen\n" -#: help.c:200 +#: help.c:175 msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr "" " \\gset [PREFIX] SQL-Anweisung ausführen und Ergebnis in psql-Variablen\n" " ablegen\n" -#: help.c:201 +#: help.c:176 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [(OPT)] [DATEI] wie \\g, aber mit erweitertem Ausgabemodus\n" -#: help.c:202 +#: help.c:177 msgid " \\q quit psql\n" msgstr " \\q psql beenden\n" -#: help.c:203 -msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n" -msgstr " \\watch [[i=]SEK] [c=N] Anfrage alle SEK Sekunden ausführen, bis zu N Mal\n" +#: help.c:178 +msgid "" +" \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" execute query every SEC seconds, up to N times,\n" +" stop if less than MIN rows are returned\n" +msgstr "" +" \\watch [[i=]SEK] [c=N] [m=MIN]\n" +" Anfrage alle SEK Sekunden ausführen, bis zu N Mal,\n" +" aufhören wenn weniger als MIN Zeilen zurückgegeben werden\n" -#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:297 help.c:305 -#: help.c:325 help.c:338 help.c:347 +#: help.c:181 help.c:189 help.c:201 help.c:211 help.c:218 help.c:275 help.c:283 +#: help.c:303 help.c:316 help.c:325 msgid "\n" msgstr "\n" -#: help.c:206 +#: help.c:183 msgid "Help\n" msgstr "Hilfe\n" -#: help.c:208 +#: help.c:185 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] Hilfe über Backslash-Befehle anzeigen\n" -#: help.c:209 +#: help.c:186 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options Hilfe über psql-Kommandozeilenoptionen anzeigen\n" -#: help.c:210 +#: help.c:187 msgid " \\? variables show help on special variables\n" msgstr " \\? variables Hilfe über besondere Variablen anzeigen\n" -#: help.c:211 +#: help.c:188 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [NAME] Syntaxhilfe über SQL-Anweisung, * für alle Anweisungen\n" -#: help.c:214 +#: help.c:191 msgid "Query Buffer\n" msgstr "Anfragepuffer\n" -#: help.c:215 +#: help.c:192 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr " \\e [DATEI] [ZEILE] Anfragepuffer (oder Datei) mit externem Editor bearbeiten\n" -#: help.c:216 +#: help.c:193 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNKNAME [ZEILE]] Funktionsdefinition mit externem Editor bearbeiten\n" -#: help.c:217 +#: help.c:194 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [SICHTNAME [ZEILE]] Sichtdefinition mit externem Editor bearbeiten\n" -#: help.c:218 +#: help.c:195 msgid " \\p show the contents of the query buffer\n" msgstr " \\p aktuellen Inhalt der Anfragepuffers zeigen\n" -#: help.c:219 +#: help.c:196 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r Anfragepuffer löschen\n" -#: help.c:221 +#: help.c:198 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [DATEI] Befehlsgeschichte ausgeben oder in Datei schreiben\n" -#: help.c:223 +#: help.c:200 msgid " \\w FILE write query buffer to file\n" msgstr " \\w DATEI Anfragepuffer in Datei schreiben\n" -#: help.c:226 +#: help.c:203 msgid "Input/Output\n" msgstr "Eingabe/Ausgabe\n" -#: help.c:227 +#: help.c:204 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr " \\copy ... SQL COPY mit Datenstrom auf Client-Host ausführen\n" -#: help.c:228 +#: help.c:205 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [TEXT] Text auf Standardausgabe schreiben (-n für ohne Newline)\n" -#: help.c:229 +#: help.c:206 msgid " \\i FILE execute commands from file\n" msgstr " \\i DATEI Befehle aus Datei ausführen\n" -#: help.c:230 +#: help.c:207 msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr " \\ir DATEI wie \\i, aber relativ zum Ort des aktuellen Skripts\n" -#: help.c:231 +#: help.c:208 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [DATEI] alle Anfrageergebnisse in Datei oder |Pipe schreiben\n" -#: help.c:232 +#: help.c:209 msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr "" " \\qecho [-n] [TEXT] Text auf Ausgabestrom für \\o schreiben (-n für ohne\n" " Newline)\n" -#: help.c:233 +#: help.c:210 msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr "" " \\warn [-n] [TEXT] Text auf Standardfehlerausgabe schreiben (-n für ohne\n" " Newline)\n" -#: help.c:236 +#: help.c:213 msgid "Conditional\n" msgstr "Bedingte Anweisungen\n" -#: help.c:237 +#: help.c:214 msgid " \\if EXPR begin conditional block\n" msgstr " \\if AUSDRUCK Beginn einer bedingten Anweisung\n" -#: help.c:238 +#: help.c:215 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif AUSDRUCK Alternative in aktueller bedingter Anweisung\n" -#: help.c:239 +#: help.c:216 msgid " \\else final alternative within current conditional block\n" msgstr " \\else letzte Alternative in aktueller bedingter Anweisung\n" -#: help.c:240 +#: help.c:217 msgid " \\endif end conditional block\n" msgstr " \\endif Ende einer bedingten Anweisung\n" -#: help.c:243 +#: help.c:220 msgid "Informational\n" msgstr "Informationen\n" -#: help.c:244 +#: help.c:221 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (Optionen: S = Systemobjekte zeigen, + = zusätzliche Details zeigen)\n" -#: help.c:245 +#: help.c:222 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] Tabellen, Sichten und Sequenzen auflisten\n" -#: help.c:246 +#: help.c:223 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NAME Tabelle, Sicht, Sequenz oder Index beschreiben\n" -#: help.c:247 +#: help.c:224 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [MUSTER] Aggregatfunktionen auflisten\n" -#: help.c:248 +#: help.c:225 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [MUSTER] Zugriffsmethoden auflisten\n" -#: help.c:249 +#: help.c:226 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMMUST [TYPMUST]] Operatorklassen auflisten\n" -#: help.c:250 +#: help.c:227 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMMUST [TYPMUST]] Operatorfamilien auflisten\n" -#: help.c:251 +#: help.c:228 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMMUST [OPFMUST]] Operatoren in Operatorfamilien auflisten\n" -#: help.c:252 +#: help.c:229 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMMUST [OPFMUST]] Unterst.funktionen in Operatorfamilien auflisten\n" -#: help.c:253 +#: help.c:230 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [MUSTER] Tablespaces auflisten\n" -#: help.c:254 +#: help.c:231 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [MUSTER] Konversionen auflisten\n" -#: help.c:255 +#: help.c:232 msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" msgstr " \\dconfig[+] [MUSTER] Konfigurationsparameter auflisten\n" -#: help.c:256 +#: help.c:233 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [MUSTER] Typumwandlungen (Casts) auflisten\n" -#: help.c:257 +#: help.c:234 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr "" " \\dd[S] [MUSTER] Objektbeschreibungen zeigen, die nirgendwo anders\n" " erscheinen\n" -#: help.c:258 +#: help.c:235 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [MUSTER] Domänen auflisten\n" -#: help.c:259 +#: help.c:236 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [MUSTER] Vorgabeprivilegien auflisten\n" -#: help.c:260 +#: help.c:237 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [MUSTER] Fremdtabellen auflisten\n" -#: help.c:261 +#: help.c:238 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [MUSTER] Fremdserver auflisten\n" -#: help.c:262 +#: help.c:239 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [MUSTER] Fremdtabellen auflisten\n" -#: help.c:263 +#: help.c:240 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [MUSTER] Benutzerabbildungen auflisten\n" -#: help.c:264 +#: help.c:241 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [MUSTER] Fremddaten-Wrapper auflisten\n" -#: help.c:265 +#: help.c:242 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" @@ -2990,47 +3045,47 @@ msgstr "" " \\df[anptw][S+] [FUNKMUSTR [TYPMUSTR ...]]\n" " Funktionen [nur Agg/normale/Proz/Trigger/Fenster] auflisten\n" -#: help.c:267 +#: help.c:244 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [MUSTER] Textsuchekonfigurationen auflisten\n" -#: help.c:268 +#: help.c:245 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [MUSTER] Textsuchewörterbücher auflisten\n" -#: help.c:269 +#: help.c:246 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [MUSTER] Textsucheparser auflisten\n" -#: help.c:270 +#: help.c:247 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [MUSTER] Textsuchevorlagen auflisten\n" -#: help.c:271 +#: help.c:248 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [MUSTER] Rollen auflisten\n" -#: help.c:272 +#: help.c:249 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [MUSTER] Indexe auflisten\n" -#: help.c:273 +#: help.c:250 msgid " \\dl[+] list large objects, same as \\lo_list\n" msgstr " \\dl[+] Large Objects auflisten, wie \\lo_list\n" -#: help.c:274 +#: help.c:251 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [MUSTER] prozedurale Sprachen auflisten\n" -#: help.c:275 +#: help.c:252 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [MUSTER] materialisierte Sichten auflisten\n" -#: help.c:276 +#: help.c:253 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [MUSTER] Schemas auflisten\n" -#: help.c:277 +#: help.c:254 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" @@ -3038,93 +3093,97 @@ msgstr "" " \\do[S+] [OPMUST [TYPMUST [TYPMUST]]]\n" " Operatoren auflisten\n" -#: help.c:279 +#: help.c:256 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [MUSTER] Sortierfolgen auflisten\n" -#: help.c:280 -msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" +#: help.c:257 +msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n" msgstr "" -" \\dp [MUSTER] Zugriffsprivilegien für Tabellen, Sichten und\n" +" \\dp[S] [MUSTER] Zugriffsprivilegien für Tabellen, Sichten und\n" " Sequenzen auflisten\n" -#: help.c:281 +#: help.c:258 msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr "" " \\dP[itn+] [MUSTER] partitionierte Relationen [nur Indexe/Tabellen]\n" " auflisten [n=geschachtelt]\n" -#: help.c:282 +#: help.c:259 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr " \\drds [ROLLMUST [DBMUST]] datenbankspezifische Rolleneinstellungen auflisten\n" -#: help.c:283 +#: help.c:260 +msgid " \\drg[S] [PATTERN] list role grants\n" +msgstr " \\drg[S] [MUSTER] Rollen-Grants auflisten\n" + +#: help.c:261 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [MUSTER] Replikationspublikationen auflisten\n" -#: help.c:284 +#: help.c:262 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [MUSTER] Replikationssubskriptionen auflisten\n" -#: help.c:285 +#: help.c:263 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [MUSTER] Sequenzen auflisten\n" -#: help.c:286 +#: help.c:264 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [MUSTER] Tabellen auflisten\n" -#: help.c:287 +#: help.c:265 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [MUSTER] Datentypen auflisten\n" -#: help.c:288 +#: help.c:266 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [MUSTER] Rollen auflisten\n" -#: help.c:289 +#: help.c:267 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [MUSTER] Sichten auflisten\n" -#: help.c:290 +#: help.c:268 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [MUSTER] Erweiterungen auflisten\n" -#: help.c:291 +#: help.c:269 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [MUSTER] erweiterte Statistiken auflisten\n" -#: help.c:292 +#: help.c:270 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [MUSTER] Ereignistrigger auflisten\n" -#: help.c:293 +#: help.c:271 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [MUSTER] Datenbanken auflisten\n" -#: help.c:294 +#: help.c:272 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNKNAME Funktionsdefinition zeigen\n" -#: help.c:295 +#: help.c:273 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] SICHTNAME Sichtdefinition zeigen\n" -#: help.c:296 -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [MUSTER] äquivalent zu \\dp\n" +#: help.c:274 +msgid " \\z[S] [PATTERN] same as \\dp\n" +msgstr " \\z[S] [MUSTER] äquivalent zu \\dp\n" -#: help.c:299 +#: help.c:277 msgid "Large Objects\n" msgstr "Large Objects\n" -#: help.c:300 +#: help.c:278 msgid " \\lo_export LOBOID FILE write large object to file\n" msgstr "" " \\lo_export LOBOID DATEI\n" " Large Object in Datei schreiben\n" -#: help.c:301 +#: help.c:279 msgid "" " \\lo_import FILE [COMMENT]\n" " read large object from file\n" @@ -3132,38 +3191,38 @@ msgstr "" " \\lo_import DATEI [KOMMENTAR]\n" " Large Object aus Datei lesen\n" -#: help.c:303 +#: help.c:281 msgid " \\lo_list[+] list large objects\n" msgstr " \\lo_list[+] Large Objects auflisten\n" -#: help.c:304 +#: help.c:282 msgid " \\lo_unlink LOBOID delete a large object\n" msgstr " \\lo_unlink LOBOID Large Object löschen\n" -#: help.c:307 +#: help.c:285 msgid "Formatting\n" msgstr "Formatierung\n" -#: help.c:308 +#: help.c:286 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr "" " \\a zwischen unausgerichtetem und ausgerichtetem Ausgabemodus\n" " umschalten\n" -#: help.c:309 +#: help.c:287 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [TEXT] Tabellentitel setzen oder löschen\n" -#: help.c:310 +#: help.c:288 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr " \\f [ZEICHEN] Feldtrennzeichen zeigen oder setzen\n" -#: help.c:311 +#: help.c:289 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H HTML-Ausgabemodus umschalten (gegenwärtig %s)\n" -#: help.c:313 +#: help.c:291 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3171,7 +3230,7 @@ msgid "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" msgstr "" " \\pset [NAME [WERT]] Tabellenausgabeoption setzen\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3179,31 +3238,31 @@ msgstr "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" -#: help.c:320 +#: help.c:298 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] nur Datenzeilen zeigen (gegenwärtig %s)\n" -#: help.c:322 +#: help.c:300 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [TEXT] HTML
-Tag-Attribute setzen oder löschen\n" -#: help.c:323 +#: help.c:301 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] erweiterte Ausgabe umschalten (gegenwärtig %s)\n" -#: help.c:324 +#: help.c:302 msgid "auto" msgstr "auto" -#: help.c:327 +#: help.c:305 msgid "Connection\n" msgstr "Verbindung\n" -#: help.c:329 +#: help.c:307 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3212,7 +3271,7 @@ msgstr "" " \\c[onnect] {[DBNAME|- BENUTZER|- HOST|- PORT|-] | conninfo}\n" " mit neuer Datenbank verbinden (aktuell »%s«)\n" -#: help.c:333 +#: help.c:311 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3220,62 +3279,62 @@ msgstr "" " \\c[onnect] {[DBNAME|- BENUTZER|- HOST|- PORT|-] | conninfo}\n" " mit neuer Datenbank verbinden (aktuell keine Verbindung)\n" -#: help.c:335 +#: help.c:313 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo Informationen über aktuelle Verbindung anzeigen\n" -#: help.c:336 +#: help.c:314 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [KODIERUNG] Client-Kodierung zeigen oder setzen\n" -#: help.c:337 +#: help.c:315 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr "" " \\password [BENUTZERNAME]\n" " sicheres Ändern eines Benutzerpasswortes\n" -#: help.c:340 +#: help.c:318 msgid "Operating System\n" msgstr "Betriebssystem\n" -#: help.c:341 +#: help.c:319 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [VERZ] Arbeitsverzeichnis wechseln\n" -#: help.c:342 +#: help.c:320 msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" msgstr " \\getenv PSQLVAR ENVVAR Umgebungsvariable auslesen\n" -#: help.c:343 +#: help.c:321 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NAME [WERT] Umgebungsvariable setzen oder löschen\n" -#: help.c:344 +#: help.c:322 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] Zeitmessung umschalten (gegenwärtig %s)\n" -#: help.c:346 +#: help.c:324 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr " \\! [BEFEHL] Befehl in Shell ausführen oder interaktive Shell starten\n" -#: help.c:349 +#: help.c:327 msgid "Variables\n" msgstr "Variablen\n" -#: help.c:350 +#: help.c:328 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [TEXT] NAME interne Variable vom Benutzer abfragen\n" -#: help.c:351 +#: help.c:329 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [NAME [WERT]] interne Variable setzen, oder alle anzeigen\n" -#: help.c:352 +#: help.c:330 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NAME interne Variable löschen\n" -#: help.c:391 +#: help.c:369 msgid "" "List of specially treated variables\n" "\n" @@ -3283,11 +3342,11 @@ msgstr "" "Liste besonderer Variablen\n" "\n" -#: help.c:393 +#: help.c:371 msgid "psql variables:\n" msgstr "psql-Variablen:\n" -#: help.c:395 +#: help.c:373 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3297,7 +3356,7 @@ msgstr "" " oder \\set NAME WERT innerhalb von psql\n" "\n" -#: help.c:397 +#: help.c:375 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3305,7 +3364,7 @@ msgstr "" " AUTOCOMMIT\n" " wenn gesetzt werden alle erfolgreichen SQL-Befehle automatisch committet\n" -#: help.c:399 +#: help.c:377 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3315,7 +3374,7 @@ msgstr "" " bestimmt, ob SQL-Schlüsselwörter in Groß- oder Kleinschreibung\n" " vervollständigt werden [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:402 +#: help.c:380 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3323,7 +3382,7 @@ msgstr "" " DBNAME\n" " Name der aktuellen Datenbank\n" -#: help.c:404 +#: help.c:382 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3333,7 +3392,7 @@ msgstr "" " kontrolliert, welche Eingaben auf die Standardausgabe geschrieben werden\n" " [all, errors, none, queries]\n" -#: help.c:407 +#: help.c:385 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3343,7 +3402,7 @@ msgstr "" " wenn gesetzt, interne Anfragen, die von Backslash-Befehlen ausgeführt werden,\n" " anzeigen; wenn auf »noexec« gesetzt, nur anzeigen, nicht ausführen\n" -#: help.c:410 +#: help.c:388 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3351,7 +3410,7 @@ msgstr "" " ENCODING\n" " aktuelle Zeichensatzkodierung des Clients\n" -#: help.c:412 +#: help.c:390 msgid "" " ERROR\n" " \"true\" if last query failed, else \"false\"\n" @@ -3359,7 +3418,7 @@ msgstr "" " ERROR\n" " »true« wenn die letzte Anfrage fehlgeschlagen ist, sonst »false«\n" -#: help.c:414 +#: help.c:392 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3367,7 +3426,7 @@ msgstr "" " FETCH_COUNT\n" " Anzahl auf einmal zu holender und anzuzeigender Zeilen (0 = unbegrenzt)\n" -#: help.c:416 +#: help.c:394 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3375,7 +3434,7 @@ msgstr "" " HIDE_TABLEAM\n" " wenn gesetzt werden Tabellenzugriffsmethoden nicht angezeigt\n" -#: help.c:418 +#: help.c:396 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" @@ -3383,7 +3442,7 @@ msgstr "" " HIDE_TOAST_COMPRESSION\n" " wenn gesetzt werden Kompressionsmethoden nicht angezeigt\n" -#: help.c:420 +#: help.c:398 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3391,7 +3450,7 @@ msgstr "" " HISTCONTROL\n" " kontrolliert Befehlsgeschichte [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:422 +#: help.c:400 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3399,7 +3458,7 @@ msgstr "" " HISTFILE\n" " Dateiname für die Befehlsgeschichte\n" -#: help.c:424 +#: help.c:402 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3407,7 +3466,7 @@ msgstr "" " HISTSIZE\n" " maximale Anzahl der in der Befehlsgeschichte zu speichernden Befehle\n" -#: help.c:426 +#: help.c:404 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3415,7 +3474,7 @@ msgstr "" " HOST\n" " der aktuell verbundene Datenbankserverhost\n" -#: help.c:428 +#: help.c:406 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3423,7 +3482,7 @@ msgstr "" " IGNOREEOF\n" " Anzahl benötigter EOFs um eine interaktive Sitzung zu beenden\n" -#: help.c:430 +#: help.c:408 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3431,7 +3490,7 @@ msgstr "" " LASTOID\n" " Wert der zuletzt beinträchtigten OID\n" -#: help.c:432 +#: help.c:410 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3442,7 +3501,7 @@ msgstr "" " Fehlermeldung und SQLSTATE des letzten Fehlers, oder leer und »000000« wenn\n" " kein Fehler\n" -#: help.c:435 +#: help.c:413 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3451,7 +3510,7 @@ msgstr "" " wenn gesetzt beendet ein Fehler die Transaktion nicht (verwendet implizite\n" " Sicherungspunkte)\n" -#: help.c:437 +#: help.c:415 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3459,7 +3518,7 @@ msgstr "" " ON_ERROR_STOP\n" " Skriptausführung bei Fehler beenden\n" -#: help.c:439 +#: help.c:417 msgid "" " PORT\n" " server port of the current connection\n" @@ -3467,7 +3526,7 @@ msgstr "" " PORT\n" " Serverport der aktuellen Verbindung\n" -#: help.c:441 +#: help.c:419 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3475,7 +3534,7 @@ msgstr "" " PROMPT1\n" " der normale psql-Prompt\n" -#: help.c:443 +#: help.c:421 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3483,7 +3542,7 @@ msgstr "" " PROMPT2\n" " der Prompt, wenn eine Anweisung von der vorherigen Zeile fortgesetzt wird\n" -#: help.c:445 +#: help.c:423 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3491,7 +3550,7 @@ msgstr "" " PROMPT3\n" " der Prompt während COPY ... FROM STDIN\n" -#: help.c:447 +#: help.c:425 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3499,7 +3558,7 @@ msgstr "" " QUIET\n" " stille Ausführung (wie Option -q)\n" -#: help.c:449 +#: help.c:427 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3507,7 +3566,7 @@ msgstr "" " ROW_COUNT\n" " Anzahl der von der letzten Anfrage beeinträchtigten Zeilen, oder 0\n" -#: help.c:451 +#: help.c:429 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3517,7 +3576,7 @@ msgstr "" " SERVER_VERSION_NUM\n" " Serverversion (kurze Zeichenkette oder numerisches Format)\n" -#: help.c:454 +#: help.c:432 msgid "" " SHELL_ERROR\n" " \"true\" if the last shell command failed, \"false\" if it succeeded\n" @@ -3525,7 +3584,7 @@ msgstr "" " SHELL_ERROR\n" " »true« wenn der letzte Shell-Befehl fehlgeschlagen ist, sonst »false«\n" -#: help.c:456 +#: help.c:434 msgid "" " SHELL_EXIT_CODE\n" " exit status of the last shell command\n" @@ -3533,7 +3592,7 @@ msgstr "" " SHELL_EXIT_CODE\n" " Statuscode des letzten Shell-Befehls\n" -#: help.c:458 +#: help.c:436 msgid "" " SHOW_ALL_RESULTS\n" " show all results of a combined query (\\;) instead of only the last\n" @@ -3541,7 +3600,7 @@ msgstr "" " SHOW_ALL_RESULTS\n" " alle Ergebnisse einer kombinierten Anfrage (\\;) anzeigen statt nur das letzte\n" -#: help.c:460 +#: help.c:438 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3550,7 +3609,7 @@ msgstr "" " kontrolliert die Anzeige von Kontextinformationen in Meldungen\n" " [never, errors, always]\n" -#: help.c:462 +#: help.c:440 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3558,7 +3617,7 @@ msgstr "" " SINGLELINE\n" " wenn gesetzt beendet Zeilenende die SQL-Anweisung (wie Option -S)\n" -#: help.c:464 +#: help.c:442 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3566,7 +3625,7 @@ msgstr "" " SINGLESTEP\n" " Einzelschrittmodus (wie Option -s)\n" -#: help.c:466 +#: help.c:444 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3574,7 +3633,7 @@ msgstr "" " SQLSTATE\n" " SQLSTATE der letzten Anfrage, oder »00000« wenn kein Fehler\n" -#: help.c:468 +#: help.c:446 msgid "" " USER\n" " the currently connected database user\n" @@ -3582,7 +3641,7 @@ msgstr "" " USER\n" " der aktuell verbundene Datenbankbenutzer\n" -#: help.c:470 +#: help.c:448 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3591,7 +3650,7 @@ msgstr "" " kontrolliert wieviele Details in Fehlermeldungen enthalten sind\n" " [default, verbose, terse, sqlstate]\n" -#: help.c:472 +#: help.c:450 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3603,7 +3662,7 @@ msgstr "" " VERSION_NUM\n" " Version von psql (lange Zeichenkette, kurze Zeichenkette oder numerisch)\n" -#: help.c:477 +#: help.c:455 msgid "" "\n" "Display settings:\n" @@ -3611,7 +3670,7 @@ msgstr "" "\n" "Anzeigeeinstellungen:\n" -#: help.c:479 +#: help.c:457 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3621,7 +3680,7 @@ msgstr "" " oder \\pset NAME [WERT] innerhalb von psql\n" "\n" -#: help.c:481 +#: help.c:459 msgid "" " border\n" " border style (number)\n" @@ -3629,7 +3688,7 @@ msgstr "" " border\n" " Rahmenstil (Zahl)\n" -#: help.c:483 +#: help.c:461 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3637,7 +3696,7 @@ msgstr "" " columns\n" " Zielbreite für das Format »wrapped«\n" -#: help.c:485 +#: help.c:463 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3645,7 +3704,7 @@ msgstr "" " expanded (oder x)\n" " erweiterte Ausgabe [on, off, auto]\n" -#: help.c:487 +#: help.c:465 #, c-format msgid "" " fieldsep\n" @@ -3654,7 +3713,7 @@ msgstr "" " fieldsep\n" " Feldtrennzeichen für unausgerichteten Ausgabemodus (Standard »%s«)\n" -#: help.c:490 +#: help.c:468 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3662,7 +3721,7 @@ msgstr "" " fieldsep_zero\n" " Feldtrennzeichen für unausgerichteten Ausgabemodus auf Null-Byte setzen\n" -#: help.c:492 +#: help.c:470 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3670,7 +3729,7 @@ msgstr "" " footer\n" " Tabellenfußzeile ein- oder auschalten [on, off]\n" -#: help.c:494 +#: help.c:472 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3678,7 +3737,7 @@ msgstr "" " format\n" " Ausgabeformat setzen [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:496 +#: help.c:474 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3686,7 +3745,7 @@ msgstr "" " linestyle\n" " Rahmenlinienstil setzen [ascii, old-ascii, unicode]\n" -#: help.c:498 +#: help.c:476 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3694,7 +3753,7 @@ msgstr "" " null\n" " setzt die Zeichenkette, die anstelle eines NULL-Wertes ausgegeben wird\n" -#: help.c:500 +#: help.c:478 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3703,7 +3762,7 @@ msgstr "" " Verwendung eines Locale-spezifischen Zeichens zur Trennung von Zifferngruppen\n" " einschalten [on, off]\n" -#: help.c:502 +#: help.c:480 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3711,7 +3770,7 @@ msgstr "" " pager\n" " kontrolliert Verwendung eines externen Pager-Programms [yes, no, always]\n" -#: help.c:504 +#: help.c:482 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3719,7 +3778,7 @@ msgstr "" " recordsep\n" " Satztrennzeichen für unausgerichteten Ausgabemodus\n" -#: help.c:506 +#: help.c:484 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3727,7 +3786,7 @@ msgstr "" " recordsep_zero\n" " Satztrennzeichen für unausgerichteten Ausgabemodus auf Null-Byte setzen\n" -#: help.c:508 +#: help.c:486 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3737,7 +3796,7 @@ msgstr "" " Attribute für das »table«-Tag im Format »html« oder proportionale\n" " Spaltenbreite für links ausgerichtete Datentypen im Format »latex-longtable«\n" -#: help.c:511 +#: help.c:489 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3745,7 +3804,7 @@ msgstr "" " title\n" " setzt den Titel darauffolgend ausgegebener Tabellen\n" -#: help.c:513 +#: help.c:491 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3753,7 +3812,7 @@ msgstr "" " tuples_only\n" " wenn gesetzt werden nur die eigentlichen Tabellendaten gezeigt\n" -#: help.c:515 +#: help.c:493 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3765,7 +3824,17 @@ msgstr "" " unicode_header_linestyle\n" " setzt den Stil für Unicode-Linien [single, double]\n" -#: help.c:520 +#: help.c:497 +msgid "" +" xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr "" +" xheader_width\n" +" setzt die maximale Breite der Kopfzeile für die erweiterte Ausgabe\n" +" [full, column, page, ganze Zahl]\n" + +#: help.c:501 msgid "" "\n" "Environment variables:\n" @@ -3773,7 +3842,7 @@ msgstr "" "\n" "Umgebungsvariablen:\n" -#: help.c:524 +#: help.c:505 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3783,7 +3852,7 @@ msgstr "" " oder \\setenv NAME [WERT] innerhalb von psql\n" "\n" -#: help.c:526 +#: help.c:507 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3795,7 +3864,7 @@ msgstr "" " oder \\setenv NAME [WERT] innerhalb von psql\n" "\n" -#: help.c:529 +#: help.c:510 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3803,7 +3872,7 @@ msgstr "" " COLUMNS\n" " Anzahl Spalten im Format »wrapped«\n" -#: help.c:531 +#: help.c:512 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3811,7 +3880,7 @@ msgstr "" " PGAPPNAME\n" " wie Verbindungsparameter »application_name«\n" -#: help.c:533 +#: help.c:514 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3819,7 +3888,7 @@ msgstr "" " PGDATABASE\n" " wie Verbindungsparameter »dbname«\n" -#: help.c:535 +#: help.c:516 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3827,7 +3896,7 @@ msgstr "" " PGHOST\n" " wie Verbindungsparameter »host«\n" -#: help.c:537 +#: help.c:518 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3835,7 +3904,7 @@ msgstr "" " PGPASSFILE\n" " Name der Passwortdatei\n" -#: help.c:539 +#: help.c:520 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -3843,7 +3912,7 @@ msgstr "" " PGPASSWORD\n" " Verbindungspasswort (nicht empfohlen)\n" -#: help.c:541 +#: help.c:522 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3851,7 +3920,7 @@ msgstr "" " PGPORT\n" " wie Verbindungsparameter »port«\n" -#: help.c:543 +#: help.c:524 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3859,7 +3928,7 @@ msgstr "" " PGUSER\n" " wie Verbindungsparameter »user«\n" -#: help.c:545 +#: help.c:526 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3867,7 +3936,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " Editor für Befehle \\e, \\ef und \\ev\n" -#: help.c:547 +#: help.c:528 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3875,7 +3944,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " wie die Zeilennummer beim Aufruf des Editors angegeben wird\n" -#: help.c:549 +#: help.c:530 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -3883,7 +3952,7 @@ msgstr "" " PSQL_HISTORY\n" " alternativer Pfad für History-Datei\n" -#: help.c:551 +#: help.c:532 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -3891,7 +3960,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " Name des externen Pager-Programms\n" -#: help.c:554 +#: help.c:535 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" @@ -3899,7 +3968,7 @@ msgstr "" " PSQL_WATCH_PAGER\n" " Name des externen Pager-Programms für \\watch\n" -#: help.c:557 +#: help.c:538 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -3907,7 +3976,7 @@ msgstr "" " PSQLRC\n" " alternativer Pfad für .psqlrc-Datei des Benutzers\n" -#: help.c:559 +#: help.c:540 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -3915,7 +3984,7 @@ msgstr "" " SHELL\n" " Shell für den Befehl \\!\n" -#: help.c:561 +#: help.c:542 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -3923,11 +3992,11 @@ msgstr "" " TMPDIR\n" " Verzeichnis für temporäre Dateien\n" -#: help.c:621 +#: help.c:602 msgid "Available help:\n" msgstr "Verfügbare Hilfe:\n" -#: help.c:716 +#: help.c:697 #, c-format msgid "" "Command: %s\n" @@ -3946,7 +4015,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:739 +#: help.c:720 #, c-format msgid "" "No help available for \"%s\".\n" @@ -3955,17 +4024,17 @@ msgstr "" "Keine Hilfe verfügbar für »%s«.\n" "Versuchen Sie \\h ohne Argumente, um die verfügbare Hilfe zu sehen.\n" -#: input.c:216 +#: input.c:215 #, c-format msgid "could not read from input file: %m" msgstr "konnte nicht aus Eingabedatei lesen: %m" -#: input.c:477 input.c:515 +#: input.c:476 input.c:514 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "konnte Befehlsgeschichte nicht in Datei »%s« speichern: %m" -#: input.c:534 +#: input.c:533 #, c-format msgid "history is not supported by this installation" msgstr "Befehlsgeschichte wird von dieser Installation nicht unterstützt" @@ -4053,12 +4122,12 @@ msgstr "Anfrage ignoriert; verwenden Sie \\endif oder Strg-C um den aktuellen \\ msgid "reached EOF without finding closing \\endif(s)" msgstr "Dateiende erreicht, aber schließendes \\endif fehlt" -#: psqlscanslash.l:640 +#: psqlscanslash.l:642 #, c-format msgid "unterminated quoted string" msgstr "Zeichenkette in Anführungszeichen nicht abgeschlossen" -#: psqlscanslash.l:825 +#: psqlscanslash.l:842 #, c-format msgid "%s: out of memory" msgstr "%s: Speicher aufgebraucht" @@ -4066,2427 +4135,2447 @@ msgstr "%s: Speicher aufgebraucht" #: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 #: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 #: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 -#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238 -#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248 -#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267 -#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323 -#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443 -#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524 -#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595 -#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606 -#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668 -#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714 -#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747 -#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802 -#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900 -#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999 -#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 -#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071 -#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086 -#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116 -#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141 -#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 -#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163 -#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310 -#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320 -#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445 -#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486 -#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507 -#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523 -#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548 -#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577 -#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 -#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687 -#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696 -#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000 -#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159 -#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236 -#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439 -#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525 -#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602 -#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738 -#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079 -#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179 -#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267 -#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346 -#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404 -#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436 -#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472 -#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507 -#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545 -#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582 -#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614 -#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646 -#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688 -#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040 -#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197 -#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:245 +#: sql_help.c:247 sql_help.c:248 sql_help.c:250 sql_help.c:252 sql_help.c:255 +#: sql_help.c:257 sql_help.c:259 sql_help.c:261 sql_help.c:276 sql_help.c:277 +#: sql_help.c:278 sql_help.c:280 sql_help.c:329 sql_help.c:331 sql_help.c:333 +#: sql_help.c:335 sql_help.c:404 sql_help.c:409 sql_help.c:411 sql_help.c:453 +#: sql_help.c:455 sql_help.c:458 sql_help.c:460 sql_help.c:529 sql_help.c:534 +#: sql_help.c:539 sql_help.c:544 sql_help.c:549 sql_help.c:603 sql_help.c:605 +#: sql_help.c:607 sql_help.c:609 sql_help.c:611 sql_help.c:614 sql_help.c:616 +#: sql_help.c:619 sql_help.c:630 sql_help.c:632 sql_help.c:676 sql_help.c:678 +#: sql_help.c:680 sql_help.c:683 sql_help.c:685 sql_help.c:687 sql_help.c:728 +#: sql_help.c:732 sql_help.c:736 sql_help.c:757 sql_help.c:760 sql_help.c:763 +#: sql_help.c:792 sql_help.c:804 sql_help.c:812 sql_help.c:815 sql_help.c:818 +#: sql_help.c:833 sql_help.c:836 sql_help.c:865 sql_help.c:870 sql_help.c:875 +#: sql_help.c:880 sql_help.c:885 sql_help.c:912 sql_help.c:914 sql_help.c:916 +#: sql_help.c:918 sql_help.c:921 sql_help.c:923 sql_help.c:970 sql_help.c:1015 +#: sql_help.c:1020 sql_help.c:1025 sql_help.c:1030 sql_help.c:1035 +#: sql_help.c:1054 sql_help.c:1065 sql_help.c:1067 sql_help.c:1087 +#: sql_help.c:1097 sql_help.c:1098 sql_help.c:1100 sql_help.c:1102 +#: sql_help.c:1114 sql_help.c:1118 sql_help.c:1120 sql_help.c:1132 +#: sql_help.c:1134 sql_help.c:1136 sql_help.c:1138 sql_help.c:1157 +#: sql_help.c:1159 sql_help.c:1163 sql_help.c:1167 sql_help.c:1171 +#: sql_help.c:1174 sql_help.c:1175 sql_help.c:1176 sql_help.c:1179 +#: sql_help.c:1182 sql_help.c:1184 sql_help.c:1324 sql_help.c:1326 +#: sql_help.c:1329 sql_help.c:1332 sql_help.c:1334 sql_help.c:1336 +#: sql_help.c:1339 sql_help.c:1342 sql_help.c:1464 sql_help.c:1466 +#: sql_help.c:1468 sql_help.c:1471 sql_help.c:1492 sql_help.c:1495 +#: sql_help.c:1498 sql_help.c:1501 sql_help.c:1505 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1525 sql_help.c:1528 +#: sql_help.c:1530 sql_help.c:1532 sql_help.c:1542 sql_help.c:1544 +#: sql_help.c:1554 sql_help.c:1556 sql_help.c:1566 sql_help.c:1569 +#: sql_help.c:1592 sql_help.c:1594 sql_help.c:1596 sql_help.c:1598 +#: sql_help.c:1601 sql_help.c:1603 sql_help.c:1606 sql_help.c:1609 +#: sql_help.c:1660 sql_help.c:1703 sql_help.c:1706 sql_help.c:1708 +#: sql_help.c:1710 sql_help.c:1713 sql_help.c:1715 sql_help.c:1717 +#: sql_help.c:1720 sql_help.c:1770 sql_help.c:1786 sql_help.c:2019 +#: sql_help.c:2088 sql_help.c:2107 sql_help.c:2120 sql_help.c:2178 +#: sql_help.c:2186 sql_help.c:2196 sql_help.c:2224 sql_help.c:2257 +#: sql_help.c:2275 sql_help.c:2303 sql_help.c:2414 sql_help.c:2460 +#: sql_help.c:2485 sql_help.c:2508 sql_help.c:2512 sql_help.c:2546 +#: sql_help.c:2566 sql_help.c:2588 sql_help.c:2602 sql_help.c:2623 +#: sql_help.c:2652 sql_help.c:2685 sql_help.c:2708 sql_help.c:2755 +#: sql_help.c:3053 sql_help.c:3066 sql_help.c:3083 sql_help.c:3099 +#: sql_help.c:3139 sql_help.c:3193 sql_help.c:3197 sql_help.c:3199 +#: sql_help.c:3206 sql_help.c:3225 sql_help.c:3252 sql_help.c:3287 +#: sql_help.c:3299 sql_help.c:3308 sql_help.c:3352 sql_help.c:3366 +#: sql_help.c:3394 sql_help.c:3402 sql_help.c:3414 sql_help.c:3424 +#: sql_help.c:3432 sql_help.c:3440 sql_help.c:3448 sql_help.c:3456 +#: sql_help.c:3465 sql_help.c:3476 sql_help.c:3484 sql_help.c:3492 +#: sql_help.c:3500 sql_help.c:3508 sql_help.c:3518 sql_help.c:3527 +#: sql_help.c:3536 sql_help.c:3544 sql_help.c:3554 sql_help.c:3565 +#: sql_help.c:3573 sql_help.c:3582 sql_help.c:3593 sql_help.c:3602 +#: sql_help.c:3610 sql_help.c:3618 sql_help.c:3626 sql_help.c:3634 +#: sql_help.c:3642 sql_help.c:3650 sql_help.c:3658 sql_help.c:3666 +#: sql_help.c:3674 sql_help.c:3682 sql_help.c:3699 sql_help.c:3708 +#: sql_help.c:3716 sql_help.c:3733 sql_help.c:3748 sql_help.c:4061 +#: sql_help.c:4182 sql_help.c:4211 sql_help.c:4227 sql_help.c:4229 +#: sql_help.c:4733 sql_help.c:4781 sql_help.c:4940 msgid "name" msgstr "Name" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848 -#: sql_help.c:3347 sql_help.c:4468 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:340 sql_help.c:1863 +#: sql_help.c:3367 sql_help.c:4500 msgid "aggregate_signature" msgstr "Aggregatsignatur" -#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253 -#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576 -#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798 -#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008 -#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105 -#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444 -#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534 -#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:260 +#: sql_help.c:281 sql_help.c:412 sql_help.c:459 sql_help.c:538 sql_help.c:586 +#: sql_help.c:604 sql_help.c:631 sql_help.c:684 sql_help.c:759 sql_help.c:814 +#: sql_help.c:835 sql_help.c:874 sql_help.c:924 sql_help.c:971 sql_help.c:1024 +#: sql_help.c:1056 sql_help.c:1066 sql_help.c:1101 sql_help.c:1121 +#: sql_help.c:1135 sql_help.c:1185 sql_help.c:1333 sql_help.c:1465 +#: sql_help.c:1508 sql_help.c:1529 sql_help.c:1543 sql_help.c:1555 +#: sql_help.c:1568 sql_help.c:1595 sql_help.c:1661 sql_help.c:1714 msgid "new_name" msgstr "neuer_Name" -#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251 -#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623 -#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801 -#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 -#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 -#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510 -#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:258 +#: sql_help.c:279 sql_help.c:410 sql_help.c:495 sql_help.c:543 sql_help.c:633 +#: sql_help.c:642 sql_help.c:707 sql_help.c:731 sql_help.c:762 sql_help.c:817 +#: sql_help.c:879 sql_help.c:922 sql_help.c:1029 sql_help.c:1068 +#: sql_help.c:1099 sql_help.c:1119 sql_help.c:1133 sql_help.c:1183 +#: sql_help.c:1399 sql_help.c:1467 sql_help.c:1510 sql_help.c:1531 +#: sql_help.c:1593 sql_help.c:1709 sql_help.c:3039 msgid "new_owner" msgstr "neuer_Eigentümer" -#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322 -#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749 -#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087 -#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512 -#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:262 sql_help.c:332 +#: sql_help.c:461 sql_help.c:548 sql_help.c:686 sql_help.c:735 sql_help.c:765 +#: sql_help.c:820 sql_help.c:884 sql_help.c:1034 sql_help.c:1103 +#: sql_help.c:1137 sql_help.c:1335 sql_help.c:1512 sql_help.c:1533 +#: sql_help.c:1545 sql_help.c:1557 sql_help.c:1597 sql_help.c:1716 msgid "new_schema" msgstr "neues_Schema" -#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497 +#: sql_help.c:44 sql_help.c:1927 sql_help.c:3368 sql_help.c:4529 msgid "where aggregate_signature is:" msgstr "wobei Aggregatsignatur Folgendes ist:" -#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353 -#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520 -#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 -#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 -#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 -#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 -#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089 -#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349 -#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535 -#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474 -#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501 -#: sql_help.c:4504 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:350 sql_help.c:363 +#: sql_help.c:367 sql_help.c:383 sql_help.c:386 sql_help.c:389 sql_help.c:530 +#: sql_help.c:535 sql_help.c:540 sql_help.c:545 sql_help.c:550 sql_help.c:866 +#: sql_help.c:871 sql_help.c:876 sql_help.c:881 sql_help.c:886 sql_help.c:1016 +#: sql_help.c:1021 sql_help.c:1026 sql_help.c:1031 sql_help.c:1036 +#: sql_help.c:1881 sql_help.c:1898 sql_help.c:1904 sql_help.c:1928 +#: sql_help.c:1931 sql_help.c:1934 sql_help.c:2089 sql_help.c:2108 +#: sql_help.c:2111 sql_help.c:2415 sql_help.c:2624 sql_help.c:3369 +#: sql_help.c:3372 sql_help.c:3375 sql_help.c:3466 sql_help.c:3555 +#: sql_help.c:3583 sql_help.c:3936 sql_help.c:4399 sql_help.c:4506 +#: sql_help.c:4513 sql_help.c:4519 sql_help.c:4530 sql_help.c:4533 +#: sql_help.c:4536 msgid "argmode" msgstr "Argmodus" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354 -#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 -#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 -#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 -#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 -#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914 -#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090 -#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350 -#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536 -#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488 -#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:351 sql_help.c:364 +#: sql_help.c:368 sql_help.c:384 sql_help.c:387 sql_help.c:390 sql_help.c:531 +#: sql_help.c:536 sql_help.c:541 sql_help.c:546 sql_help.c:551 sql_help.c:867 +#: sql_help.c:872 sql_help.c:877 sql_help.c:882 sql_help.c:887 sql_help.c:1017 +#: sql_help.c:1022 sql_help.c:1027 sql_help.c:1032 sql_help.c:1037 +#: sql_help.c:1882 sql_help.c:1899 sql_help.c:1905 sql_help.c:1929 +#: sql_help.c:1932 sql_help.c:1935 sql_help.c:2090 sql_help.c:2109 +#: sql_help.c:2112 sql_help.c:2416 sql_help.c:2625 sql_help.c:3370 +#: sql_help.c:3373 sql_help.c:3376 sql_help.c:3467 sql_help.c:3556 +#: sql_help.c:3584 sql_help.c:4507 sql_help.c:4514 sql_help.c:4520 +#: sql_help.c:4531 sql_help.c:4534 sql_help.c:4537 msgid "argname" msgstr "Argname" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355 -#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 -#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 -#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 -#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 -#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915 -#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605 -#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448 -#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483 -#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:352 sql_help.c:365 +#: sql_help.c:369 sql_help.c:385 sql_help.c:388 sql_help.c:391 sql_help.c:532 +#: sql_help.c:537 sql_help.c:542 sql_help.c:547 sql_help.c:552 sql_help.c:868 +#: sql_help.c:873 sql_help.c:878 sql_help.c:883 sql_help.c:888 sql_help.c:1018 +#: sql_help.c:1023 sql_help.c:1028 sql_help.c:1033 sql_help.c:1038 +#: sql_help.c:1883 sql_help.c:1900 sql_help.c:1906 sql_help.c:1930 +#: sql_help.c:1933 sql_help.c:1936 sql_help.c:2417 sql_help.c:2626 +#: sql_help.c:3371 sql_help.c:3374 sql_help.c:3377 sql_help.c:3468 +#: sql_help.c:3557 sql_help.c:3585 sql_help.c:4508 sql_help.c:4515 +#: sql_help.c:4521 sql_help.c:4532 sql_help.c:4535 sql_help.c:4538 msgid "argtype" msgstr "Argtyp" -#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 -#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666 -#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977 -#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351 -#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048 -#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751 -#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973 +#: sql_help.c:114 sql_help.c:407 sql_help.c:484 sql_help.c:496 sql_help.c:965 +#: sql_help.c:1116 sql_help.c:1526 sql_help.c:1655 sql_help.c:1687 +#: sql_help.c:1739 sql_help.c:1798 sql_help.c:1987 sql_help.c:1994 +#: sql_help.c:2306 sql_help.c:2356 sql_help.c:2363 sql_help.c:2372 +#: sql_help.c:2461 sql_help.c:2686 sql_help.c:2777 sql_help.c:3068 +#: sql_help.c:3253 sql_help.c:3275 sql_help.c:3415 sql_help.c:3772 +#: sql_help.c:3980 sql_help.c:4226 sql_help.c:4228 sql_help.c:5006 msgid "option" msgstr "Option" -#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441 -#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396 +#: sql_help.c:115 sql_help.c:966 sql_help.c:1656 sql_help.c:2462 +#: sql_help.c:2687 sql_help.c:3254 sql_help.c:3416 msgid "where option can be:" msgstr "wobei Option Folgendes sein kann:" -#: sql_help.c:116 sql_help.c:2217 +#: sql_help.c:116 sql_help.c:2238 msgid "allowconn" msgstr "allowconn" -#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218 -#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 +#: sql_help.c:117 sql_help.c:967 sql_help.c:1657 sql_help.c:2239 +#: sql_help.c:2463 sql_help.c:2688 sql_help.c:3255 msgid "connlimit" msgstr "Verbindungslimit" -#: sql_help.c:118 sql_help.c:2219 +#: sql_help.c:118 sql_help.c:2240 msgid "istemplate" msgstr "istemplate" -#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322 -#: sql_help.c:1374 sql_help.c:4200 +#: sql_help.c:124 sql_help.c:621 sql_help.c:689 sql_help.c:703 sql_help.c:1338 +#: sql_help.c:1392 sql_help.c:4232 msgid "new_tablespace" msgstr "neuer_Tablespace" -#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550 -#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 -#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 -#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643 -#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609 -#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:558 sql_help.c:560 +#: sql_help.c:561 sql_help.c:891 sql_help.c:893 sql_help.c:894 sql_help.c:974 +#: sql_help.c:978 sql_help.c:981 sql_help.c:1043 sql_help.c:1045 +#: sql_help.c:1046 sql_help.c:1196 sql_help.c:1198 sql_help.c:1664 +#: sql_help.c:1668 sql_help.c:1671 sql_help.c:2427 sql_help.c:2630 +#: sql_help.c:3948 sql_help.c:4250 sql_help.c:4411 sql_help.c:4721 msgid "configuration_parameter" msgstr "Konfigurationsparameter" -#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487 -#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876 -#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101 -#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157 -#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182 -#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449 -#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667 -#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352 -#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475 -#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634 -#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923 -#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022 -#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689 -#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692 +#: sql_help.c:128 sql_help.c:408 sql_help.c:479 sql_help.c:485 sql_help.c:497 +#: sql_help.c:559 sql_help.c:613 sql_help.c:695 sql_help.c:705 sql_help.c:892 +#: sql_help.c:920 sql_help.c:975 sql_help.c:1044 sql_help.c:1117 +#: sql_help.c:1162 sql_help.c:1166 sql_help.c:1170 sql_help.c:1173 +#: sql_help.c:1178 sql_help.c:1181 sql_help.c:1197 sql_help.c:1371 +#: sql_help.c:1394 sql_help.c:1442 sql_help.c:1450 sql_help.c:1470 +#: sql_help.c:1527 sql_help.c:1611 sql_help.c:1665 sql_help.c:1688 +#: sql_help.c:2307 sql_help.c:2357 sql_help.c:2364 sql_help.c:2373 +#: sql_help.c:2428 sql_help.c:2429 sql_help.c:2493 sql_help.c:2496 +#: sql_help.c:2530 sql_help.c:2631 sql_help.c:2632 sql_help.c:2655 +#: sql_help.c:2778 sql_help.c:2817 sql_help.c:2927 sql_help.c:2940 +#: sql_help.c:2954 sql_help.c:2995 sql_help.c:3003 sql_help.c:3025 +#: sql_help.c:3042 sql_help.c:3069 sql_help.c:3276 sql_help.c:3981 +#: sql_help.c:4722 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 msgid "value" msgstr "Wert" -#: sql_help.c:200 +#: sql_help.c:202 msgid "target_role" msgstr "Zielrolle" -#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639 -#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899 -#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351 -#: sql_help.c:4370 sql_help.c:4382 +#: sql_help.c:203 sql_help.c:929 sql_help.c:2291 sql_help.c:2660 +#: sql_help.c:2733 sql_help.c:2738 sql_help.c:3911 sql_help.c:3920 +#: sql_help.c:3939 sql_help.c:3951 sql_help.c:4374 sql_help.c:4383 +#: sql_help.c:4402 sql_help.c:4414 msgid "schema_name" msgstr "Schemaname" -#: sql_help.c:202 +#: sql_help.c:204 msgid "abbreviated_grant_or_revoke" msgstr "abgekürztes_Grant_oder_Revoke" -#: sql_help.c:203 +#: sql_help.c:205 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "wobei abgekürztes_Grant_oder_Revoke Folgendes sein kann:" -#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 -#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 -#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 -#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446 -#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583 -#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675 -#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240 -#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943 -#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710 +#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 +#: sql_help.c:211 sql_help.c:212 sql_help.c:213 sql_help.c:214 sql_help.c:215 +#: sql_help.c:584 sql_help.c:620 sql_help.c:688 sql_help.c:838 sql_help.c:985 +#: sql_help.c:1337 sql_help.c:1675 sql_help.c:2466 sql_help.c:2467 +#: sql_help.c:2468 sql_help.c:2469 sql_help.c:2470 sql_help.c:2604 +#: sql_help.c:2691 sql_help.c:2692 sql_help.c:2693 sql_help.c:3258 +#: sql_help.c:3259 sql_help.c:3260 sql_help.c:3261 sql_help.c:3262 +#: sql_help.c:3960 sql_help.c:3964 sql_help.c:4423 sql_help.c:4427 +#: sql_help.c:4743 msgid "role_name" msgstr "Rollenname" -#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339 -#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684 -#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360 -#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782 -#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932 -#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991 -#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098 -#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571 -#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621 -#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664 -#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819 -#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877 -#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934 -#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065 -#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123 -#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126 +#: sql_help.c:246 sql_help.c:265 sql_help.c:472 sql_help.c:928 sql_help.c:1353 +#: sql_help.c:1355 sql_help.c:1359 sql_help.c:1409 sql_help.c:1421 +#: sql_help.c:1446 sql_help.c:1705 sql_help.c:2260 sql_help.c:2264 +#: sql_help.c:2376 sql_help.c:2381 sql_help.c:2489 sql_help.c:2659 +#: sql_help.c:2794 sql_help.c:2799 sql_help.c:2801 sql_help.c:2922 +#: sql_help.c:2935 sql_help.c:2949 sql_help.c:2958 sql_help.c:2970 +#: sql_help.c:2999 sql_help.c:4012 sql_help.c:4027 sql_help.c:4029 +#: sql_help.c:4125 sql_help.c:4128 sql_help.c:4130 sql_help.c:4593 +#: sql_help.c:4594 sql_help.c:4603 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4652 sql_help.c:4653 sql_help.c:4654 sql_help.c:4655 +#: sql_help.c:4696 sql_help.c:4697 sql_help.c:4702 sql_help.c:4707 +#: sql_help.c:4851 sql_help.c:4852 sql_help.c:4861 sql_help.c:4908 +#: sql_help.c:4909 sql_help.c:4910 sql_help.c:4911 sql_help.c:4912 +#: sql_help.c:4913 sql_help.c:4968 sql_help.c:4970 sql_help.c:5036 +#: sql_help.c:5096 sql_help.c:5097 sql_help.c:5106 sql_help.c:5153 +#: sql_help.c:5154 sql_help.c:5155 sql_help.c:5156 sql_help.c:5157 +#: sql_help.c:5158 msgid "expression" msgstr "Ausdruck" -#: sql_help.c:242 +#: sql_help.c:249 sql_help.c:2261 msgid "domain_constraint" msgstr "Domänen-Constraint" -#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 -#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363 -#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854 -#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359 -#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003 +#: sql_help.c:251 sql_help.c:253 sql_help.c:256 sql_help.c:264 sql_help.c:487 +#: sql_help.c:488 sql_help.c:1330 sql_help.c:1379 sql_help.c:1380 +#: sql_help.c:1381 sql_help.c:1408 sql_help.c:1420 sql_help.c:1437 +#: sql_help.c:1869 sql_help.c:1871 sql_help.c:2263 sql_help.c:2375 +#: sql_help.c:2380 sql_help.c:2957 sql_help.c:2969 sql_help.c:4024 msgid "constraint_name" msgstr "Constraint-Name" -#: sql_help.c:247 sql_help.c:1315 +#: sql_help.c:254 sql_help.c:1331 msgid "new_constraint_name" msgstr "neuer_Constraint-Name" -#: sql_help.c:320 sql_help.c:1099 +#: sql_help.c:263 sql_help.c:2262 +msgid "where domain_constraint is:" +msgstr "wobei Domänen-Constraint Folgendes ist:" + +#: sql_help.c:330 sql_help.c:1115 msgid "new_version" msgstr "neue_Version" -#: sql_help.c:324 sql_help.c:326 +#: sql_help.c:334 sql_help.c:336 msgid "member_object" msgstr "Elementobjekt" -#: sql_help.c:327 +#: sql_help.c:337 msgid "where member_object is:" msgstr "wobei Elementobjekt Folgendes ist:" -#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 -#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 -#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 -#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 -#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858 -#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862 -#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871 -#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886 -#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896 -#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900 -#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904 -#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469 -#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478 -#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490 -#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494 -#: sql_help.c:4495 +#: sql_help.c:338 sql_help.c:343 sql_help.c:344 sql_help.c:345 sql_help.c:346 +#: sql_help.c:347 sql_help.c:348 sql_help.c:353 sql_help.c:357 sql_help.c:359 +#: sql_help.c:361 sql_help.c:370 sql_help.c:371 sql_help.c:372 sql_help.c:373 +#: sql_help.c:374 sql_help.c:375 sql_help.c:376 sql_help.c:377 sql_help.c:380 +#: sql_help.c:381 sql_help.c:1861 sql_help.c:1866 sql_help.c:1873 +#: sql_help.c:1874 sql_help.c:1875 sql_help.c:1876 sql_help.c:1877 +#: sql_help.c:1878 sql_help.c:1879 sql_help.c:1884 sql_help.c:1886 +#: sql_help.c:1890 sql_help.c:1892 sql_help.c:1896 sql_help.c:1901 +#: sql_help.c:1902 sql_help.c:1909 sql_help.c:1910 sql_help.c:1911 +#: sql_help.c:1912 sql_help.c:1913 sql_help.c:1914 sql_help.c:1915 +#: sql_help.c:1916 sql_help.c:1917 sql_help.c:1918 sql_help.c:1919 +#: sql_help.c:1924 sql_help.c:1925 sql_help.c:4496 sql_help.c:4501 +#: sql_help.c:4502 sql_help.c:4503 sql_help.c:4504 sql_help.c:4510 +#: sql_help.c:4511 sql_help.c:4516 sql_help.c:4517 sql_help.c:4522 +#: sql_help.c:4523 sql_help.c:4524 sql_help.c:4525 sql_help.c:4526 +#: sql_help.c:4527 msgid "object_name" msgstr "Objektname" -#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467 +#: sql_help.c:339 sql_help.c:1862 sql_help.c:4499 msgid "aggregate_name" msgstr "Aggregatname" -#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139 -#: sql_help.c:2141 sql_help.c:3365 +#: sql_help.c:341 sql_help.c:1864 sql_help.c:2154 sql_help.c:2158 +#: sql_help.c:2160 sql_help.c:3385 msgid "source_type" msgstr "Quelltyp" -#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140 -#: sql_help.c:2142 sql_help.c:3366 +#: sql_help.c:342 sql_help.c:1865 sql_help.c:2155 sql_help.c:2159 +#: sql_help.c:2161 sql_help.c:3386 msgid "target_type" msgstr "Zieltyp" -#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137 -#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557 -#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590 -#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847 -#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093 -#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104 +#: sql_help.c:349 sql_help.c:802 sql_help.c:1880 sql_help.c:2156 +#: sql_help.c:2199 sql_help.c:2279 sql_help.c:2547 sql_help.c:2578 +#: sql_help.c:3145 sql_help.c:4398 sql_help.c:4505 sql_help.c:4622 +#: sql_help.c:4626 sql_help.c:4630 sql_help.c:4633 sql_help.c:4880 +#: sql_help.c:4884 sql_help.c:4888 sql_help.c:4891 sql_help.c:5125 +#: sql_help.c:5129 sql_help.c:5133 sql_help.c:5136 msgid "function_name" msgstr "Funktionsname" -#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550 +#: sql_help.c:354 sql_help.c:795 sql_help.c:1887 sql_help.c:2571 msgid "operator_name" msgstr "Operatorname" -#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873 -#: sql_help.c:2527 sql_help.c:3489 +#: sql_help.c:355 sql_help.c:729 sql_help.c:733 sql_help.c:737 sql_help.c:1888 +#: sql_help.c:2548 sql_help.c:3509 msgid "left_type" msgstr "linker_Typ" -#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874 -#: sql_help.c:2528 sql_help.c:3490 +#: sql_help.c:356 sql_help.c:730 sql_help.c:734 sql_help.c:738 sql_help.c:1889 +#: sql_help.c:2549 sql_help.c:3510 msgid "right_type" msgstr "rechter_Typ" -#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 -#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 -#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547 -#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508 +#: sql_help.c:358 sql_help.c:360 sql_help.c:758 sql_help.c:761 sql_help.c:764 +#: sql_help.c:793 sql_help.c:805 sql_help.c:813 sql_help.c:816 sql_help.c:819 +#: sql_help.c:1426 sql_help.c:1891 sql_help.c:1893 sql_help.c:2568 +#: sql_help.c:2589 sql_help.c:2975 sql_help.c:3519 sql_help.c:3528 msgid "index_method" msgstr "Indexmethode" -#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480 +#: sql_help.c:362 sql_help.c:1897 sql_help.c:4512 msgid "procedure_name" msgstr "Prozedurname" -#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486 +#: sql_help.c:366 sql_help.c:1903 sql_help.c:3935 sql_help.c:4518 msgid "routine_name" msgstr "Routinenname" -#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402 -#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670 -#: sql_help.c:3936 sql_help.c:4388 +#: sql_help.c:378 sql_help.c:1398 sql_help.c:1920 sql_help.c:2423 +#: sql_help.c:2629 sql_help.c:2930 sql_help.c:3112 sql_help.c:3690 +#: sql_help.c:3957 sql_help.c:4420 msgid "type_name" msgstr "Typname" -#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607 -#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921 -#: sql_help.c:4373 +#: sql_help.c:379 sql_help.c:1921 sql_help.c:2422 sql_help.c:2628 +#: sql_help.c:3113 sql_help.c:3343 sql_help.c:3691 sql_help.c:3942 +#: sql_help.c:4405 msgid "lang_name" msgstr "Sprachname" -#: sql_help.c:372 +#: sql_help.c:382 msgid "and aggregate_signature is:" msgstr "und Aggregatsignatur Folgendes ist:" -#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283 +#: sql_help.c:405 sql_help.c:2021 sql_help.c:2304 msgid "handler_function" msgstr "Handler-Funktion" -#: sql_help.c:396 sql_help.c:2284 +#: sql_help.c:406 sql_help.c:2305 msgid "validator_function" msgstr "Validator-Funktion" -#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 -#: sql_help.c:1309 sql_help.c:1581 +#: sql_help.c:454 sql_help.c:533 sql_help.c:677 sql_help.c:869 sql_help.c:1019 +#: sql_help.c:1325 sql_help.c:1602 msgid "action" msgstr "Aktion" -#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461 -#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470 -#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683 -#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080 -#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334 -#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 -#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349 -#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 -#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422 -#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683 -#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853 -#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1986 sql_help.c:1987 -#: sql_help.c:1988 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399 -#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637 -#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895 -#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927 -#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963 -#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986 -#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893 -#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007 -#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099 -#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627 -#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890 -#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937 -#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138 +#: sql_help.c:456 sql_help.c:463 sql_help.c:467 sql_help.c:468 sql_help.c:471 +#: sql_help.c:473 sql_help.c:474 sql_help.c:475 sql_help.c:477 sql_help.c:480 +#: sql_help.c:482 sql_help.c:483 sql_help.c:681 sql_help.c:691 sql_help.c:693 +#: sql_help.c:696 sql_help.c:698 sql_help.c:699 sql_help.c:927 sql_help.c:1096 +#: sql_help.c:1327 sql_help.c:1345 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 sql_help.c:1358 +#: sql_help.c:1360 sql_help.c:1361 sql_help.c:1363 sql_help.c:1366 +#: sql_help.c:1367 sql_help.c:1369 sql_help.c:1372 sql_help.c:1374 +#: sql_help.c:1375 sql_help.c:1422 sql_help.c:1424 sql_help.c:1431 +#: sql_help.c:1440 sql_help.c:1445 sql_help.c:1452 sql_help.c:1453 +#: sql_help.c:1704 sql_help.c:1707 sql_help.c:1711 sql_help.c:1747 +#: sql_help.c:1868 sql_help.c:1984 sql_help.c:1990 sql_help.c:2004 +#: sql_help.c:2005 sql_help.c:2006 sql_help.c:2354 sql_help.c:2367 +#: sql_help.c:2420 sql_help.c:2488 sql_help.c:2494 sql_help.c:2527 +#: sql_help.c:2658 sql_help.c:2763 sql_help.c:2798 sql_help.c:2800 +#: sql_help.c:2912 sql_help.c:2921 sql_help.c:2931 sql_help.c:2934 +#: sql_help.c:2944 sql_help.c:2948 sql_help.c:2971 sql_help.c:2973 +#: sql_help.c:2980 sql_help.c:2993 sql_help.c:2998 sql_help.c:3005 +#: sql_help.c:3006 sql_help.c:3022 sql_help.c:3148 sql_help.c:3288 +#: sql_help.c:3914 sql_help.c:3915 sql_help.c:4011 sql_help.c:4026 +#: sql_help.c:4028 sql_help.c:4030 sql_help.c:4124 sql_help.c:4127 +#: sql_help.c:4129 sql_help.c:4131 sql_help.c:4377 sql_help.c:4378 +#: sql_help.c:4498 sql_help.c:4659 sql_help.c:4666 sql_help.c:4668 +#: sql_help.c:4917 sql_help.c:4924 sql_help.c:4926 sql_help.c:4967 +#: sql_help.c:4969 sql_help.c:4971 sql_help.c:5024 sql_help.c:5162 +#: sql_help.c:5169 sql_help.c:5171 msgid "column_name" msgstr "Spaltenname" -#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 +#: sql_help.c:457 sql_help.c:682 sql_help.c:1328 sql_help.c:1712 msgid "new_column_name" msgstr "neuer_Spaltenname" -#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 -#: sql_help.c:1328 sql_help.c:1591 +#: sql_help.c:462 sql_help.c:554 sql_help.c:690 sql_help.c:890 sql_help.c:1040 +#: sql_help.c:1344 sql_help.c:1612 msgid "where action is one of:" msgstr "wobei Aktion Folgendes sein kann:" -#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330 -#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237 -#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896 -#: sql_help.c:3175 sql_help.c:4151 +#: sql_help.c:464 sql_help.c:469 sql_help.c:1088 sql_help.c:1346 +#: sql_help.c:1351 sql_help.c:1614 sql_help.c:1618 sql_help.c:2258 +#: sql_help.c:2355 sql_help.c:2567 sql_help.c:2756 sql_help.c:2913 +#: sql_help.c:3195 sql_help.c:4183 msgid "data_type" msgstr "Datentyp" -#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336 -#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337 -#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919 -#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000 +#: sql_help.c:465 sql_help.c:470 sql_help.c:1347 sql_help.c:1352 +#: sql_help.c:1447 sql_help.c:1615 sql_help.c:1619 sql_help.c:2259 +#: sql_help.c:2358 sql_help.c:2490 sql_help.c:2915 sql_help.c:2923 +#: sql_help.c:2936 sql_help.c:2950 sql_help.c:3000 sql_help.c:3196 +#: sql_help.c:3202 sql_help.c:4021 msgid "collation" msgstr "Sortierfolge" -#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347 -#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928 +#: sql_help.c:466 sql_help.c:1348 sql_help.c:2359 sql_help.c:2368 +#: sql_help.c:2916 sql_help.c:2932 sql_help.c:2945 msgid "column_constraint" msgstr "Spalten-Constraint" -#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986 +#: sql_help.c:476 sql_help.c:618 sql_help.c:692 sql_help.c:1368 sql_help.c:5018 msgid "integer" msgstr "ganze_Zahl" -#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352 -#: sql_help.c:1355 +#: sql_help.c:478 sql_help.c:481 sql_help.c:694 sql_help.c:697 sql_help.c:1370 +#: sql_help.c:1373 msgid "attribute_option" msgstr "Attributoption" -#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348 -#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929 +#: sql_help.c:486 sql_help.c:1377 sql_help.c:2360 sql_help.c:2369 +#: sql_help.c:2917 sql_help.c:2933 sql_help.c:2946 msgid "table_constraint" msgstr "Tabellen-Constraint" -#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364 -#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907 +#: sql_help.c:489 sql_help.c:490 sql_help.c:491 sql_help.c:492 sql_help.c:1382 +#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:1922 msgid "trigger_name" msgstr "Triggername" -#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 -#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926 +#: sql_help.c:493 sql_help.c:494 sql_help.c:1396 sql_help.c:1397 +#: sql_help.c:2361 sql_help.c:2366 sql_help.c:2920 sql_help.c:2943 msgid "parent_table" msgstr "Elterntabelle" -#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 -#: sql_help.c:1550 sql_help.c:2269 +#: sql_help.c:553 sql_help.c:610 sql_help.c:679 sql_help.c:889 sql_help.c:1039 +#: sql_help.c:1571 sql_help.c:2290 msgid "extension_name" msgstr "Erweiterungsname" -#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403 +#: sql_help.c:555 sql_help.c:1041 sql_help.c:2424 msgid "execution_cost" msgstr "Ausführungskosten" -#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404 +#: sql_help.c:556 sql_help.c:1042 sql_help.c:2425 msgid "result_rows" msgstr "Ergebniszeilen" -#: sql_help.c:547 sql_help.c:2405 +#: sql_help.c:557 sql_help.c:2426 msgid "support_function" msgstr "Support-Funktion" -#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 -#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641 -#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717 -#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891 -#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900 -#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906 -#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912 -#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922 -#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928 -#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934 -#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940 -#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348 -#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355 -#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361 -#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371 -#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377 -#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383 -#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389 -#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393 +#: sql_help.c:579 sql_help.c:581 sql_help.c:964 sql_help.c:972 sql_help.c:976 +#: sql_help.c:979 sql_help.c:982 sql_help.c:1654 sql_help.c:1662 +#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1672 sql_help.c:2734 +#: sql_help.c:2736 sql_help.c:2739 sql_help.c:2740 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3917 sql_help.c:3918 sql_help.c:3921 +#: sql_help.c:3922 sql_help.c:3924 sql_help.c:3925 sql_help.c:3927 +#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3931 sql_help.c:3933 +#: sql_help.c:3934 sql_help.c:3940 sql_help.c:3941 sql_help.c:3943 +#: sql_help.c:3944 sql_help.c:3946 sql_help.c:3947 sql_help.c:3949 +#: sql_help.c:3950 sql_help.c:3952 sql_help.c:3953 sql_help.c:3955 +#: sql_help.c:3956 sql_help.c:3958 sql_help.c:3959 sql_help.c:3961 +#: sql_help.c:3962 sql_help.c:4375 sql_help.c:4376 sql_help.c:4380 +#: sql_help.c:4381 sql_help.c:4384 sql_help.c:4385 sql_help.c:4387 +#: sql_help.c:4388 sql_help.c:4390 sql_help.c:4391 sql_help.c:4393 +#: sql_help.c:4394 sql_help.c:4396 sql_help.c:4397 sql_help.c:4403 +#: sql_help.c:4404 sql_help.c:4406 sql_help.c:4407 sql_help.c:4409 +#: sql_help.c:4410 sql_help.c:4412 sql_help.c:4413 sql_help.c:4415 +#: sql_help.c:4416 sql_help.c:4418 sql_help.c:4419 sql_help.c:4421 +#: sql_help.c:4422 sql_help.c:4424 sql_help.c:4425 msgid "role_specification" msgstr "Rollenangabe" -#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205 -#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720 +#: sql_help.c:580 sql_help.c:582 sql_help.c:1685 sql_help.c:2225 +#: sql_help.c:2742 sql_help.c:3273 sql_help.c:3724 sql_help.c:4753 msgid "user_name" msgstr "Benutzername" -#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724 -#: sql_help.c:3942 sql_help.c:4394 +#: sql_help.c:583 sql_help.c:984 sql_help.c:1674 sql_help.c:2741 +#: sql_help.c:3963 sql_help.c:4426 msgid "where role_specification can be:" msgstr "wobei Rollenangabe Folgendes sein kann:" -#: sql_help.c:575 +#: sql_help.c:585 msgid "group_name" msgstr "Gruppenname" -#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476 -#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938 -#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933 -#: sql_help.c:4385 +#: sql_help.c:606 sql_help.c:1443 sql_help.c:2237 sql_help.c:2497 +#: sql_help.c:2531 sql_help.c:2928 sql_help.c:2941 sql_help.c:2955 +#: sql_help.c:2996 sql_help.c:3026 sql_help.c:3038 sql_help.c:3954 +#: sql_help.c:4417 msgid "tablespace_name" msgstr "Tablespace-Name" -#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382 -#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785 +#: sql_help.c:608 sql_help.c:701 sql_help.c:1390 sql_help.c:1400 +#: sql_help.c:1438 sql_help.c:1800 msgid "index_name" msgstr "Indexname" -#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375 -#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508 -#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977 -#: sql_help.c:3004 +#: sql_help.c:612 sql_help.c:615 sql_help.c:704 sql_help.c:706 sql_help.c:1393 +#: sql_help.c:1395 sql_help.c:1441 sql_help.c:2495 sql_help.c:2529 +#: sql_help.c:2926 sql_help.c:2939 sql_help.c:2953 sql_help.c:2994 +#: sql_help.c:3024 msgid "storage_parameter" msgstr "Storage-Parameter" -#: sql_help.c:607 +#: sql_help.c:617 msgid "column_number" msgstr "Spaltennummer" -#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477 +#: sql_help.c:641 sql_help.c:1885 sql_help.c:4509 msgid "large_object_oid" msgstr "Large-Object-OID" -#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897 +#: sql_help.c:700 sql_help.c:1376 sql_help.c:2914 msgid "compression_method" msgstr "Kompressionsmethode" -#: sql_help.c:692 sql_help.c:1373 +#: sql_help.c:702 sql_help.c:1391 msgid "new_access_method" msgstr "neue_Zugriffsmethode" -#: sql_help.c:725 sql_help.c:2531 +#: sql_help.c:739 sql_help.c:2552 msgid "res_proc" msgstr "Res-Funktion" -#: sql_help.c:726 sql_help.c:2532 +#: sql_help.c:740 sql_help.c:2553 msgid "join_proc" msgstr "Join-Funktion" -#: sql_help.c:778 sql_help.c:790 sql_help.c:2549 +#: sql_help.c:741 sql_help.c:2550 +msgid "com_op" +msgstr "Kommutator-Op" + +#: sql_help.c:742 sql_help.c:2551 +msgid "neg_op" +msgstr "Umkehrungs-Op" + +#: sql_help.c:794 sql_help.c:806 sql_help.c:2570 msgid "strategy_number" msgstr "Strategienummer" -#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 -#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552 -#: sql_help.c:2555 sql_help.c:2556 +#: sql_help.c:796 sql_help.c:797 sql_help.c:800 sql_help.c:801 sql_help.c:807 +#: sql_help.c:808 sql_help.c:810 sql_help.c:811 sql_help.c:2572 sql_help.c:2573 +#: sql_help.c:2576 sql_help.c:2577 msgid "op_type" msgstr "Optyp" -#: sql_help.c:782 sql_help.c:2553 +#: sql_help.c:798 sql_help.c:2574 msgid "sort_family_name" msgstr "Sortierfamilienname" -#: sql_help.c:783 sql_help.c:793 sql_help.c:2554 +#: sql_help.c:799 sql_help.c:809 sql_help.c:2575 msgid "support_number" msgstr "Unterst-Nummer" -#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095 -#: sql_help.c:3097 +#: sql_help.c:803 sql_help.c:2157 sql_help.c:2579 sql_help.c:3115 +#: sql_help.c:3117 msgid "argument_type" msgstr "Argumenttyp" -#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 -#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781 -#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893 -#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332 -#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582 -#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778 -#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925 -#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525 -#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895 -#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347 -#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640 -#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897 -#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081 -#: sql_help.c:5143 +#: sql_help.c:834 sql_help.c:837 sql_help.c:926 sql_help.c:1055 sql_help.c:1095 +#: sql_help.c:1567 sql_help.c:1570 sql_help.c:1746 sql_help.c:1799 +#: sql_help.c:1870 sql_help.c:1895 sql_help.c:1908 sql_help.c:1923 +#: sql_help.c:1983 sql_help.c:1989 sql_help.c:2353 sql_help.c:2365 +#: sql_help.c:2486 sql_help.c:2526 sql_help.c:2603 sql_help.c:2657 +#: sql_help.c:2710 sql_help.c:2762 sql_help.c:2795 sql_help.c:2802 +#: sql_help.c:2911 sql_help.c:2929 sql_help.c:2942 sql_help.c:3021 +#: sql_help.c:3141 sql_help.c:3322 sql_help.c:3545 sql_help.c:3594 +#: sql_help.c:3700 sql_help.c:3910 sql_help.c:3916 sql_help.c:3977 +#: sql_help.c:4009 sql_help.c:4373 sql_help.c:4379 sql_help.c:4497 +#: sql_help.c:4610 sql_help.c:4673 sql_help.c:4712 sql_help.c:4868 +#: sql_help.c:4931 sql_help.c:4965 sql_help.c:5023 sql_help.c:5113 +#: sql_help.c:5176 msgid "table_name" msgstr "Tabellenname" -#: sql_help.c:823 sql_help.c:2584 +#: sql_help.c:839 sql_help.c:2605 msgid "using_expression" msgstr "Using-Ausdruck" -#: sql_help.c:824 sql_help.c:2585 +#: sql_help.c:840 sql_help.c:2606 msgid "check_expression" msgstr "Check-Ausdruck" -#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632 +#: sql_help.c:913 sql_help.c:915 sql_help.c:917 sql_help.c:2653 msgid "publication_object" msgstr "Publikationsobjekt" -#: sql_help.c:903 sql_help.c:2633 +#: sql_help.c:919 sql_help.c:2654 msgid "publication_parameter" msgstr "Publikationsparameter" -#: sql_help.c:909 sql_help.c:2635 +#: sql_help.c:925 sql_help.c:2656 msgid "where publication_object is one of:" msgstr "wobei Publikationsobjekt Folgendes sein kann:" -#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670 -#: sql_help.c:3236 +#: sql_help.c:968 sql_help.c:1658 sql_help.c:2464 sql_help.c:2689 +#: sql_help.c:3256 msgid "password" msgstr "Passwort" -#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671 -#: sql_help.c:3237 +#: sql_help.c:969 sql_help.c:1659 sql_help.c:2465 sql_help.c:2690 +#: sql_help.c:3257 msgid "timestamp" msgstr "Zeit" -#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642 -#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902 -#: sql_help.c:4354 +#: sql_help.c:973 sql_help.c:977 sql_help.c:980 sql_help.c:983 sql_help.c:1663 +#: sql_help.c:1667 sql_help.c:1670 sql_help.c:1673 sql_help.c:3923 +#: sql_help.c:4386 msgid "database_name" msgstr "Datenbankname" -#: sql_help.c:1073 sql_help.c:2740 +#: sql_help.c:1089 sql_help.c:2757 msgid "increment" msgstr "Inkrement" -#: sql_help.c:1074 sql_help.c:2741 +#: sql_help.c:1090 sql_help.c:2758 msgid "minvalue" msgstr "Minwert" -#: sql_help.c:1075 sql_help.c:2742 +#: sql_help.c:1091 sql_help.c:2759 msgid "maxvalue" msgstr "Maxwert" -#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677 -#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077 +#: sql_help.c:1092 sql_help.c:2760 sql_help.c:4606 sql_help.c:4710 +#: sql_help.c:4864 sql_help.c:5040 sql_help.c:5109 msgid "start" msgstr "Start" -#: sql_help.c:1077 sql_help.c:1347 +#: sql_help.c:1093 sql_help.c:1365 msgid "restart" msgstr "Restart" -#: sql_help.c:1078 sql_help.c:2744 +#: sql_help.c:1094 sql_help.c:2761 msgid "cache" msgstr "Cache" -#: sql_help.c:1123 +#: sql_help.c:1139 msgid "new_target" msgstr "neues_Ziel" -#: sql_help.c:1142 sql_help.c:2797 +#: sql_help.c:1158 sql_help.c:2814 msgid "conninfo" msgstr "Verbindungsinfo" -#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798 +#: sql_help.c:1160 sql_help.c:1164 sql_help.c:1168 sql_help.c:2815 msgid "publication_name" msgstr "Publikationsname" -#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +#: sql_help.c:1161 sql_help.c:1165 sql_help.c:1169 msgid "publication_option" msgstr "Publikationsoption" -#: sql_help.c:1156 +#: sql_help.c:1172 msgid "refresh_option" msgstr "Refresh-Option" -#: sql_help.c:1161 sql_help.c:2799 +#: sql_help.c:1177 sql_help.c:2816 msgid "subscription_parameter" msgstr "Subskriptionsparameter" -#: sql_help.c:1164 +#: sql_help.c:1180 msgid "skip_option" msgstr "Skip-Option" -#: sql_help.c:1324 sql_help.c:1327 +#: sql_help.c:1340 sql_help.c:1343 msgid "partition_name" msgstr "Partitionsname" -#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930 +#: sql_help.c:1341 sql_help.c:2370 sql_help.c:2947 msgid "partition_bound_spec" msgstr "Partitionsbegrenzungsangabe" -#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944 +#: sql_help.c:1362 sql_help.c:1412 sql_help.c:2961 msgid "sequence_options" msgstr "Sequenzoptionen" -#: sql_help.c:1346 +#: sql_help.c:1364 msgid "sequence_option" msgstr "Sequenzoption" -#: sql_help.c:1360 +#: sql_help.c:1378 msgid "table_constraint_using_index" msgstr "Tabellen-Constraint-für-Index" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 +#: sql_help.c:1386 sql_help.c:1387 sql_help.c:1388 sql_help.c:1389 msgid "rewrite_rule_name" msgstr "Regelname" -#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969 +#: sql_help.c:1401 sql_help.c:2382 sql_help.c:2986 msgid "and partition_bound_spec is:" msgstr "und Partitionsbegrenzungsangabe Folgendes ist:" -#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362 -#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971 -#: sql_help.c:2972 +#: sql_help.c:1402 sql_help.c:1403 sql_help.c:1404 sql_help.c:2383 +#: sql_help.c:2384 sql_help.c:2385 sql_help.c:2987 sql_help.c:2988 +#: sql_help.c:2989 msgid "partition_bound_expr" msgstr "Partitionsbegrenzungsausdruck" -#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366 -#: sql_help.c:2973 sql_help.c:2974 +#: sql_help.c:1405 sql_help.c:1406 sql_help.c:2386 sql_help.c:2387 +#: sql_help.c:2990 sql_help.c:2991 msgid "numeric_literal" msgstr "numerische_Konstante" -#: sql_help.c:1389 +#: sql_help.c:1407 msgid "and column_constraint is:" msgstr "und Spalten-Constraint Folgendes ist:" -#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606 -#: sql_help.c:2942 +#: sql_help.c:1410 sql_help.c:2377 sql_help.c:2418 sql_help.c:2627 +#: sql_help.c:2959 msgid "default_expr" msgstr "Vorgabeausdruck" -#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943 +#: sql_help.c:1411 sql_help.c:2378 sql_help.c:2960 msgid "generation_expr" msgstr "Generierungsausdruck" -#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 -#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955 -#: sql_help.c:2957 sql_help.c:2961 +#: sql_help.c:1413 sql_help.c:1414 sql_help.c:1423 sql_help.c:1425 +#: sql_help.c:1429 sql_help.c:2962 sql_help.c:2963 sql_help.c:2972 +#: sql_help.c:2974 sql_help.c:2978 msgid "index_parameters" msgstr "Indexparameter" -#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964 +#: sql_help.c:1415 sql_help.c:1432 sql_help.c:2964 sql_help.c:2981 msgid "reftable" msgstr "Reftabelle" -#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965 +#: sql_help.c:1416 sql_help.c:1433 sql_help.c:2965 sql_help.c:2982 msgid "refcolumn" msgstr "Refspalte" -#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 -#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967 +#: sql_help.c:1417 sql_help.c:1418 sql_help.c:1434 sql_help.c:1435 +#: sql_help.c:2966 sql_help.c:2967 sql_help.c:2983 sql_help.c:2984 msgid "referential_action" msgstr "Fremdschlüsselaktion" -#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951 +#: sql_help.c:1419 sql_help.c:2379 sql_help.c:2968 msgid "and table_constraint is:" msgstr "und Tabellen-Constraint Folgendes ist:" -#: sql_help.c:1409 sql_help.c:2959 +#: sql_help.c:1427 sql_help.c:2976 msgid "exclude_element" msgstr "Exclude-Element" -#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675 -#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075 +#: sql_help.c:1428 sql_help.c:2977 sql_help.c:4604 sql_help.c:4708 +#: sql_help.c:4862 sql_help.c:5038 sql_help.c:5107 msgid "operator" msgstr "Operator" -#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962 +#: sql_help.c:1430 sql_help.c:2498 sql_help.c:2979 msgid "predicate" msgstr "Prädikat" -#: sql_help.c:1418 +#: sql_help.c:1436 msgid "and table_constraint_using_index is:" msgstr "und Tabellen-Constraint-für-Index Folgendes ist:" -#: sql_help.c:1421 sql_help.c:2975 +#: sql_help.c:1439 sql_help.c:2992 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "Indexparameter bei UNIQUE-, PRIMARY KEY- und EXCLUDE-Constraints sind:" -#: sql_help.c:1426 sql_help.c:2980 +#: sql_help.c:1444 sql_help.c:2997 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "Exclude-Element in einem EXCLUDE-Constraint ist:" -#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920 -#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001 +#: sql_help.c:1448 sql_help.c:2491 sql_help.c:2924 sql_help.c:2937 +#: sql_help.c:2951 sql_help.c:3001 sql_help.c:4022 msgid "opclass" msgstr "Opklasse" -#: sql_help.c:1430 sql_help.c:2984 +#: sql_help.c:1449 sql_help.c:2492 sql_help.c:3002 +msgid "opclass_parameter" +msgstr "Opklassen-Parameter" + +#: sql_help.c:1451 sql_help.c:3004 msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" msgstr "Fremdschlüsselaktion in FOREIGN KEY/REFERENCES ist:" -#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021 +#: sql_help.c:1469 sql_help.c:1472 sql_help.c:3041 msgid "tablespace_option" msgstr "Tablespace-Option" -#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 +#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1502 sql_help.c:1506 msgid "token_type" msgstr "Tokentyp" -#: sql_help.c:1473 sql_help.c:1476 +#: sql_help.c:1494 sql_help.c:1497 msgid "dictionary_name" msgstr "Wörterbuchname" -#: sql_help.c:1478 sql_help.c:1482 +#: sql_help.c:1499 sql_help.c:1503 msgid "old_dictionary" msgstr "altes_Wörterbuch" -#: sql_help.c:1479 sql_help.c:1483 +#: sql_help.c:1500 sql_help.c:1504 msgid "new_dictionary" msgstr "neues_Wörterbuch" -#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 -#: sql_help.c:3174 +#: sql_help.c:1599 sql_help.c:1613 sql_help.c:1616 sql_help.c:1617 +#: sql_help.c:3194 msgid "attribute_name" msgstr "Attributname" -#: sql_help.c:1579 +#: sql_help.c:1600 msgid "new_attribute_name" msgstr "neuer_Attributname" -#: sql_help.c:1583 sql_help.c:1587 +#: sql_help.c:1604 sql_help.c:1608 msgid "new_enum_value" msgstr "neuer_Enum-Wert" -#: sql_help.c:1584 +#: sql_help.c:1605 msgid "neighbor_enum_value" msgstr "Nachbar-Enum-Wert" -#: sql_help.c:1586 +#: sql_help.c:1607 msgid "existing_enum_value" msgstr "existierender_Enum-Wert" -#: sql_help.c:1589 +#: sql_help.c:1610 msgid "property" msgstr "Eigenschaft" -#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756 -#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957 -#: sql_help.c:4363 +#: sql_help.c:1686 sql_help.c:2362 sql_help.c:2371 sql_help.c:2773 +#: sql_help.c:3274 sql_help.c:3725 sql_help.c:3932 sql_help.c:3978 +#: sql_help.c:4395 msgid "server_name" msgstr "Servername" -#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269 +#: sql_help.c:1718 sql_help.c:1721 sql_help.c:3289 msgid "view_option_name" msgstr "Sichtoptionsname" -#: sql_help.c:1698 sql_help.c:3270 +#: sql_help.c:1719 sql_help.c:3290 msgid "view_option_value" msgstr "Sichtoptionswert" -#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975 +#: sql_help.c:1740 sql_help.c:5007 msgid "table_and_columns" msgstr "Tabelle-und-Spalten" -#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754 -#: sql_help.c:4198 sql_help.c:4976 +#: sql_help.c:1741 sql_help.c:1801 sql_help.c:1995 sql_help.c:3774 +#: sql_help.c:4230 sql_help.c:5008 msgid "where option can be one of:" msgstr "wobei Option eine der folgenden sein kann:" -#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980 -#: sql_help.c:1983 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756 -#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760 -#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199 -#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979 -#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983 -#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988 +#: sql_help.c:1742 sql_help.c:1743 sql_help.c:1802 sql_help.c:1997 +#: sql_help.c:2001 sql_help.c:2183 sql_help.c:3775 sql_help.c:3776 +#: sql_help.c:3777 sql_help.c:3778 sql_help.c:3779 sql_help.c:3780 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:4231 sql_help.c:4233 sql_help.c:5009 sql_help.c:5010 +#: sql_help.c:5011 sql_help.c:5012 sql_help.c:5013 sql_help.c:5014 +#: sql_help.c:5015 sql_help.c:5016 sql_help.c:5017 sql_help.c:5019 +#: sql_help.c:5020 msgid "boolean" msgstr "boolean" -#: sql_help.c:1725 sql_help.c:4989 +#: sql_help.c:1744 sql_help.c:5021 msgid "size" msgstr "Größe" -#: sql_help.c:1726 sql_help.c:4990 +#: sql_help.c:1745 sql_help.c:5022 msgid "and table_and_columns is:" msgstr "und Tabelle-und-Spalten Folgendes ist:" -#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762 +#: sql_help.c:1761 sql_help.c:4769 sql_help.c:4771 sql_help.c:4795 msgid "transaction_mode" msgstr "Transaktionsmodus" -#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763 +#: sql_help.c:1762 sql_help.c:4772 sql_help.c:4796 msgid "where transaction_mode is one of:" msgstr "wobei Transaktionsmodus Folgendes sein kann:" -#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595 -#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848 -#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085 -#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105 +#: sql_help.c:1771 sql_help.c:4614 sql_help.c:4623 sql_help.c:4627 +#: sql_help.c:4631 sql_help.c:4634 sql_help.c:4872 sql_help.c:4881 +#: sql_help.c:4885 sql_help.c:4889 sql_help.c:4892 sql_help.c:5117 +#: sql_help.c:5126 sql_help.c:5130 sql_help.c:5134 sql_help.c:5137 msgid "argument" msgstr "Argument" -#: sql_help.c:1852 +#: sql_help.c:1867 msgid "relation_name" msgstr "Relationsname" -#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357 +#: sql_help.c:1872 sql_help.c:3926 sql_help.c:4389 msgid "domain_name" msgstr "Domänenname" -#: sql_help.c:1879 +#: sql_help.c:1894 msgid "policy_name" msgstr "Policy-Name" -#: sql_help.c:1892 +#: sql_help.c:1907 msgid "rule_name" msgstr "Regelname" -#: sql_help.c:1911 sql_help.c:4496 +#: sql_help.c:1926 sql_help.c:4528 msgid "string_literal" msgstr "Zeichenkettenkonstante" -#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410 +#: sql_help.c:1951 sql_help.c:4192 sql_help.c:4442 msgid "transaction_id" msgstr "Transaktions-ID" -#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027 +#: sql_help.c:1985 sql_help.c:1992 sql_help.c:4048 msgid "filename" msgstr "Dateiname" -#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696 -#: sql_help.c:2697 +#: sql_help.c:1986 sql_help.c:1993 sql_help.c:2712 sql_help.c:2713 +#: sql_help.c:2714 msgid "command" msgstr "Befehl" -#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305 -#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565 -#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822 -#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070 +#: sql_help.c:1988 sql_help.c:2711 sql_help.c:3144 sql_help.c:3325 +#: sql_help.c:4032 sql_help.c:4115 sql_help.c:4118 sql_help.c:4121 +#: sql_help.c:4597 sql_help.c:4599 sql_help.c:4701 sql_help.c:4703 +#: sql_help.c:4855 sql_help.c:4857 sql_help.c:4974 sql_help.c:5100 +#: sql_help.c:5102 msgid "condition" msgstr "Bedingung" -#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271 -#: sql_help.c:3289 sql_help.c:3992 +#: sql_help.c:1991 sql_help.c:2532 sql_help.c:3027 sql_help.c:3291 +#: sql_help.c:3309 sql_help.c:4013 msgid "query" msgstr "Anfrage" -#: sql_help.c:1979 +#: sql_help.c:1996 msgid "format_name" msgstr "Formatname" -#: sql_help.c:1981 +#: sql_help.c:1998 msgid "delimiter_character" msgstr "Trennzeichen" -#: sql_help.c:1982 +#: sql_help.c:1999 msgid "null_string" msgstr "Null-Zeichenkette" -#: sql_help.c:1984 +#: sql_help.c:2000 +msgid "default_string" +msgstr "Vorgabewert-Zeichenkette" + +#: sql_help.c:2002 msgid "quote_character" msgstr "Quote-Zeichen" -#: sql_help.c:1985 +#: sql_help.c:2003 msgid "escape_character" msgstr "Escape-Zeichen" -#: sql_help.c:1989 +#: sql_help.c:2007 +msgid "error_action" +msgstr "Fehleraktion" + +#: sql_help.c:2008 msgid "encoding_name" msgstr "Kodierungsname" -#: sql_help.c:1990 -msgid "default_string" -msgstr "Vorgabewert-Zeichenkette" +#: sql_help.c:2009 +msgid "verbosity" +msgstr "Verbose-Modus" -#: sql_help.c:2001 +#: sql_help.c:2020 msgid "access_method_type" msgstr "Zugriffsmethodentyp" -#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094 +#: sql_help.c:2091 sql_help.c:2110 sql_help.c:2113 msgid "arg_data_type" msgstr "Arg-Datentyp" -#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103 +#: sql_help.c:2092 sql_help.c:2114 sql_help.c:2122 msgid "sfunc" msgstr "Übergangsfunktion" -#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104 +#: sql_help.c:2093 sql_help.c:2115 sql_help.c:2123 msgid "state_data_type" msgstr "Zustandsdatentyp" -#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105 +#: sql_help.c:2094 sql_help.c:2116 sql_help.c:2124 msgid "state_data_size" msgstr "Zustandsdatengröße" -#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106 +#: sql_help.c:2095 sql_help.c:2117 sql_help.c:2125 msgid "ffunc" msgstr "Abschlussfunktion" -#: sql_help.c:2077 sql_help.c:2107 +#: sql_help.c:2096 sql_help.c:2126 msgid "combinefunc" msgstr "Combine-Funktion" -#: sql_help.c:2078 sql_help.c:2108 +#: sql_help.c:2097 sql_help.c:2127 msgid "serialfunc" msgstr "Serialisierungsfunktion" -#: sql_help.c:2079 sql_help.c:2109 +#: sql_help.c:2098 sql_help.c:2128 msgid "deserialfunc" msgstr "Deserialisierungsfunktion" -#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110 +#: sql_help.c:2099 sql_help.c:2118 sql_help.c:2129 msgid "initial_condition" msgstr "Anfangswert" -#: sql_help.c:2081 sql_help.c:2111 +#: sql_help.c:2100 sql_help.c:2130 msgid "msfunc" msgstr "Moving-Übergangsfunktion" -#: sql_help.c:2082 sql_help.c:2112 +#: sql_help.c:2101 sql_help.c:2131 msgid "minvfunc" msgstr "Moving-Inversfunktion" -#: sql_help.c:2083 sql_help.c:2113 +#: sql_help.c:2102 sql_help.c:2132 msgid "mstate_data_type" msgstr "Moving-Zustandsdatentyp" -#: sql_help.c:2084 sql_help.c:2114 +#: sql_help.c:2103 sql_help.c:2133 msgid "mstate_data_size" msgstr "Moving-Zustandsdatengröße" -#: sql_help.c:2085 sql_help.c:2115 +#: sql_help.c:2104 sql_help.c:2134 msgid "mffunc" msgstr "Moving-Abschlussfunktion" -#: sql_help.c:2086 sql_help.c:2116 +#: sql_help.c:2105 sql_help.c:2135 msgid "minitial_condition" msgstr "Moving-Anfangswert" -#: sql_help.c:2087 sql_help.c:2117 +#: sql_help.c:2106 sql_help.c:2136 msgid "sort_operator" msgstr "Sortieroperator" -#: sql_help.c:2100 +#: sql_help.c:2119 msgid "or the old syntax" msgstr "oder die alte Syntax" -#: sql_help.c:2102 +#: sql_help.c:2121 msgid "base_type" msgstr "Basistyp" -#: sql_help.c:2160 sql_help.c:2209 +#: sql_help.c:2179 sql_help.c:2229 msgid "locale" msgstr "Locale" -#: sql_help.c:2161 sql_help.c:2210 +#: sql_help.c:2180 sql_help.c:2230 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2162 sql_help.c:2211 +#: sql_help.c:2181 sql_help.c:2231 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2163 sql_help.c:4463 +#: sql_help.c:2182 sql_help.c:4495 msgid "provider" msgstr "Provider" -#: sql_help.c:2165 +#: sql_help.c:2184 msgid "rules" msgstr "Regeln" -#: sql_help.c:2166 sql_help.c:2271 +#: sql_help.c:2185 sql_help.c:2292 msgid "version" msgstr "Version" -#: sql_help.c:2168 +#: sql_help.c:2187 msgid "existing_collation" msgstr "existierende_Sortierfolge" -#: sql_help.c:2178 +#: sql_help.c:2197 msgid "source_encoding" msgstr "Quellkodierung" -#: sql_help.c:2179 +#: sql_help.c:2198 msgid "dest_encoding" msgstr "Zielkodierung" -#: sql_help.c:2206 sql_help.c:3047 +#: sql_help.c:2226 sql_help.c:3067 msgid "template" msgstr "Vorlage" -#: sql_help.c:2207 +#: sql_help.c:2227 msgid "encoding" msgstr "Kodierung" -#: sql_help.c:2208 +#: sql_help.c:2228 msgid "strategy" msgstr "Strategie" -#: sql_help.c:2212 +#: sql_help.c:2232 +msgid "builtin_locale" +msgstr "Builtin-Locale" + +#: sql_help.c:2233 msgid "icu_locale" msgstr "ICU-Locale" -#: sql_help.c:2213 +#: sql_help.c:2234 msgid "icu_rules" msgstr "ICU-Regeln" -#: sql_help.c:2214 +#: sql_help.c:2235 msgid "locale_provider" msgstr "Locale-Provider" -#: sql_help.c:2215 +#: sql_help.c:2236 msgid "collation_version" msgstr "Sortierfolgenversion" -#: sql_help.c:2220 +#: sql_help.c:2241 msgid "oid" msgstr "OID" -#: sql_help.c:2240 -msgid "constraint" -msgstr "Constraint" - -#: sql_help.c:2241 -msgid "where constraint is:" -msgstr "wobei Constraint Folgendes ist:" - -#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120 +#: sql_help.c:2276 sql_help.c:2709 sql_help.c:3140 msgid "event" msgstr "Ereignis" -#: sql_help.c:2256 +#: sql_help.c:2277 msgid "filter_variable" msgstr "Filtervariable" -#: sql_help.c:2257 +#: sql_help.c:2278 msgid "filter_value" msgstr "Filterwert" -#: sql_help.c:2353 sql_help.c:2939 +#: sql_help.c:2374 sql_help.c:2956 msgid "where column_constraint is:" msgstr "wobei Spalten-Constraint Folgendes ist:" -#: sql_help.c:2398 +#: sql_help.c:2419 msgid "rettype" msgstr "Rückgabetyp" -#: sql_help.c:2400 +#: sql_help.c:2421 msgid "column_type" msgstr "Spaltentyp" -#: sql_help.c:2409 sql_help.c:2612 +#: sql_help.c:2430 sql_help.c:2633 msgid "definition" msgstr "Definition" -#: sql_help.c:2410 sql_help.c:2613 +#: sql_help.c:2431 sql_help.c:2634 msgid "obj_file" msgstr "Objektdatei" -#: sql_help.c:2411 sql_help.c:2614 +#: sql_help.c:2432 sql_help.c:2635 msgid "link_symbol" msgstr "Linksymbol" -#: sql_help.c:2412 sql_help.c:2615 +#: sql_help.c:2433 sql_help.c:2636 msgid "sql_body" msgstr "SQL-Rumpf" -#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243 +#: sql_help.c:2471 sql_help.c:2694 sql_help.c:3263 msgid "uid" msgstr "Uid" -#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921 -#: sql_help.c:2935 sql_help.c:3003 +#: sql_help.c:2487 sql_help.c:2528 sql_help.c:2925 sql_help.c:2938 +#: sql_help.c:2952 sql_help.c:3023 msgid "method" msgstr "Methode" -#: sql_help.c:2471 -msgid "opclass_parameter" -msgstr "Opklassen-Parameter" - -#: sql_help.c:2488 +#: sql_help.c:2509 msgid "call_handler" msgstr "Handler" -#: sql_help.c:2489 +#: sql_help.c:2510 msgid "inline_handler" msgstr "Inline-Handler" -#: sql_help.c:2490 +#: sql_help.c:2511 msgid "valfunction" msgstr "Valfunktion" -#: sql_help.c:2529 -msgid "com_op" -msgstr "Kommutator-Op" - -#: sql_help.c:2530 -msgid "neg_op" -msgstr "Umkehrungs-Op" - -#: sql_help.c:2548 +#: sql_help.c:2569 msgid "family_name" msgstr "Familienname" -#: sql_help.c:2559 +#: sql_help.c:2580 msgid "storage_type" msgstr "Storage-Typ" -#: sql_help.c:2698 sql_help.c:3127 +#: sql_help.c:2715 sql_help.c:3147 msgid "where event can be one of:" msgstr "wobei Ereignis eins der folgenden sein kann:" -#: sql_help.c:2718 sql_help.c:2720 +#: sql_help.c:2735 sql_help.c:2737 msgid "schema_element" msgstr "Schemaelement" -#: sql_help.c:2757 +#: sql_help.c:2774 msgid "server_type" msgstr "Servertyp" -#: sql_help.c:2758 +#: sql_help.c:2775 msgid "server_version" msgstr "Serverversion" -#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360 +#: sql_help.c:2776 sql_help.c:3929 sql_help.c:4392 msgid "fdw_name" msgstr "FDW-Name" -#: sql_help.c:2776 sql_help.c:2779 +#: sql_help.c:2793 sql_help.c:2796 msgid "statistics_name" msgstr "Statistikname" -#: sql_help.c:2780 +#: sql_help.c:2797 msgid "statistics_kind" msgstr "Statistikart" -#: sql_help.c:2796 +#: sql_help.c:2813 msgid "subscription_name" msgstr "Subskriptionsname" -#: sql_help.c:2901 +#: sql_help.c:2918 msgid "source_table" msgstr "Quelltabelle" -#: sql_help.c:2902 +#: sql_help.c:2919 msgid "like_option" msgstr "Like-Option" -#: sql_help.c:2968 +#: sql_help.c:2985 msgid "and like_option is:" msgstr "und Like-Option Folgendes ist:" -#: sql_help.c:3020 +#: sql_help.c:3040 msgid "directory" msgstr "Verzeichnis" -#: sql_help.c:3034 +#: sql_help.c:3054 msgid "parser_name" msgstr "Parser-Name" -#: sql_help.c:3035 +#: sql_help.c:3055 msgid "source_config" msgstr "Quellkonfig" -#: sql_help.c:3064 +#: sql_help.c:3084 msgid "start_function" msgstr "Startfunktion" -#: sql_help.c:3065 +#: sql_help.c:3085 msgid "gettoken_function" msgstr "Gettext-Funktion" -#: sql_help.c:3066 +#: sql_help.c:3086 msgid "end_function" msgstr "Endfunktion" -#: sql_help.c:3067 +#: sql_help.c:3087 msgid "lextypes_function" msgstr "Lextypenfunktion" -#: sql_help.c:3068 +#: sql_help.c:3088 msgid "headline_function" msgstr "Headline-Funktion" -#: sql_help.c:3080 +#: sql_help.c:3100 msgid "init_function" msgstr "Init-Funktion" -#: sql_help.c:3081 +#: sql_help.c:3101 msgid "lexize_function" msgstr "Lexize-Funktion" -#: sql_help.c:3094 +#: sql_help.c:3114 msgid "from_sql_function_name" msgstr "From-SQL-Funktionsname" -#: sql_help.c:3096 +#: sql_help.c:3116 msgid "to_sql_function_name" msgstr "To-SQL-Funktionsname" -#: sql_help.c:3122 +#: sql_help.c:3142 msgid "referenced_table_name" msgstr "verwiesener_Tabellenname" -#: sql_help.c:3123 +#: sql_help.c:3143 msgid "transition_relation_name" msgstr "Übergangsrelationsname" -#: sql_help.c:3126 +#: sql_help.c:3146 msgid "arguments" msgstr "Argumente" -#: sql_help.c:3178 +#: sql_help.c:3198 msgid "label" msgstr "Label" -#: sql_help.c:3180 +#: sql_help.c:3200 msgid "subtype" msgstr "Untertyp" -#: sql_help.c:3181 +#: sql_help.c:3201 msgid "subtype_operator_class" msgstr "Untertyp-Operatorklasse" -#: sql_help.c:3183 +#: sql_help.c:3203 msgid "canonical_function" msgstr "Canonical-Funktion" -#: sql_help.c:3184 +#: sql_help.c:3204 msgid "subtype_diff_function" msgstr "Untertyp-Diff-Funktion" -#: sql_help.c:3185 +#: sql_help.c:3205 msgid "multirange_type_name" msgstr "Multirange-Typname" -#: sql_help.c:3187 +#: sql_help.c:3207 msgid "input_function" msgstr "Eingabefunktion" -#: sql_help.c:3188 +#: sql_help.c:3208 msgid "output_function" msgstr "Ausgabefunktion" -#: sql_help.c:3189 +#: sql_help.c:3209 msgid "receive_function" msgstr "Empfangsfunktion" -#: sql_help.c:3190 +#: sql_help.c:3210 msgid "send_function" msgstr "Sendefunktion" -#: sql_help.c:3191 +#: sql_help.c:3211 msgid "type_modifier_input_function" msgstr "Typmod-Eingabefunktion" -#: sql_help.c:3192 +#: sql_help.c:3212 msgid "type_modifier_output_function" msgstr "Typmod-Ausgabefunktion" -#: sql_help.c:3193 +#: sql_help.c:3213 msgid "analyze_function" msgstr "Analyze-Funktion" -#: sql_help.c:3194 +#: sql_help.c:3214 msgid "subscript_function" msgstr "Subscript-Funktion" -#: sql_help.c:3195 +#: sql_help.c:3215 msgid "internallength" msgstr "interne_Länge" -#: sql_help.c:3196 +#: sql_help.c:3216 msgid "alignment" msgstr "Ausrichtung" -#: sql_help.c:3197 +#: sql_help.c:3217 msgid "storage" msgstr "Speicherung" -#: sql_help.c:3198 +#: sql_help.c:3218 msgid "like_type" msgstr "wie_Typ" -#: sql_help.c:3199 +#: sql_help.c:3219 msgid "category" msgstr "Kategorie" -#: sql_help.c:3200 +#: sql_help.c:3220 msgid "preferred" msgstr "bevorzugt" -#: sql_help.c:3201 +#: sql_help.c:3221 msgid "default" msgstr "Vorgabewert" -#: sql_help.c:3202 +#: sql_help.c:3222 msgid "element" msgstr "Element" -#: sql_help.c:3203 +#: sql_help.c:3223 msgid "delimiter" msgstr "Trennzeichen" -#: sql_help.c:3204 +#: sql_help.c:3224 msgid "collatable" msgstr "sortierbar" -#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560 -#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063 +#: sql_help.c:3321 sql_help.c:4008 sql_help.c:4102 sql_help.c:4592 +#: sql_help.c:4695 sql_help.c:4850 sql_help.c:4964 sql_help.c:5095 msgid "with_query" msgstr "With-Anfrage" -#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585 -#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604 -#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849 -#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082 -#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099 -#: sql_help.c:5107 +#: sql_help.c:3323 sql_help.c:4010 sql_help.c:4611 sql_help.c:4617 +#: sql_help.c:4620 sql_help.c:4624 sql_help.c:4628 sql_help.c:4636 +#: sql_help.c:4869 sql_help.c:4875 sql_help.c:4878 sql_help.c:4882 +#: sql_help.c:4886 sql_help.c:4894 sql_help.c:4966 sql_help.c:5114 +#: sql_help.c:5120 sql_help.c:5123 sql_help.c:5127 sql_help.c:5131 +#: sql_help.c:5139 msgid "alias" msgstr "Alias" -#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608 -#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616 -#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865 -#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873 -#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111 -#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119 +#: sql_help.c:3324 sql_help.c:4596 sql_help.c:4638 sql_help.c:4640 +#: sql_help.c:4644 sql_help.c:4646 sql_help.c:4647 sql_help.c:4648 +#: sql_help.c:4700 sql_help.c:4854 sql_help.c:4896 sql_help.c:4898 +#: sql_help.c:4902 sql_help.c:4904 sql_help.c:4905 sql_help.c:4906 +#: sql_help.c:4973 sql_help.c:5099 sql_help.c:5141 sql_help.c:5143 +#: sql_help.c:5147 sql_help.c:5149 sql_help.c:5150 sql_help.c:5151 msgid "from_item" msgstr "From-Element" -#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941 +#: sql_help.c:3326 sql_help.c:3810 sql_help.c:4159 sql_help.c:4975 msgid "cursor_name" msgstr "Cursor-Name" -#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942 +#: sql_help.c:3327 sql_help.c:4016 sql_help.c:4108 sql_help.c:4976 msgid "output_expression" msgstr "Ausgabeausdruck" -#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665 -#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066 +#: sql_help.c:3328 sql_help.c:4017 sql_help.c:4109 sql_help.c:4595 +#: sql_help.c:4698 sql_help.c:4853 sql_help.c:4977 sql_help.c:5098 msgid "output_name" msgstr "Ausgabename" -#: sql_help.c:3324 +#: sql_help.c:3344 msgid "code" msgstr "Code" -#: sql_help.c:3729 +#: sql_help.c:3749 msgid "parameter" msgstr "Parameter" -#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152 +#: sql_help.c:3773 sql_help.c:4184 msgid "statement" msgstr "Anweisung" -#: sql_help.c:3788 sql_help.c:4126 +#: sql_help.c:3809 sql_help.c:4158 msgid "direction" msgstr "Richtung" -#: sql_help.c:3790 sql_help.c:4128 +#: sql_help.c:3811 sql_help.c:4160 msgid "where direction can be one of:" msgstr "wobei Richtung eine der folgenden sein kann:" -#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794 -#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131 -#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575 -#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832 -#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078 +#: sql_help.c:3812 sql_help.c:3813 sql_help.c:3814 sql_help.c:3815 +#: sql_help.c:3816 sql_help.c:4161 sql_help.c:4162 sql_help.c:4163 +#: sql_help.c:4164 sql_help.c:4165 sql_help.c:4605 sql_help.c:4607 +#: sql_help.c:4709 sql_help.c:4711 sql_help.c:4863 sql_help.c:4865 +#: sql_help.c:5039 sql_help.c:5041 sql_help.c:5108 sql_help.c:5110 msgid "count" msgstr "Anzahl" -#: sql_help.c:3898 sql_help.c:4350 +#: sql_help.c:3919 sql_help.c:4382 msgid "sequence_name" msgstr "Sequenzname" -#: sql_help.c:3916 sql_help.c:4368 +#: sql_help.c:3937 sql_help.c:4400 msgid "arg_name" msgstr "Argname" -#: sql_help.c:3917 sql_help.c:4369 +#: sql_help.c:3938 sql_help.c:4401 msgid "arg_type" msgstr "Argtyp" -#: sql_help.c:3924 sql_help.c:4376 +#: sql_help.c:3945 sql_help.c:4408 msgid "loid" msgstr "Large-Object-OID" -#: sql_help.c:3955 +#: sql_help.c:3976 msgid "remote_schema" msgstr "fernes_Schema" -#: sql_help.c:3958 +#: sql_help.c:3979 msgid "local_schema" msgstr "lokales_Schema" -#: sql_help.c:3993 +#: sql_help.c:4014 msgid "conflict_target" msgstr "Konfliktziel" -#: sql_help.c:3994 +#: sql_help.c:4015 msgid "conflict_action" msgstr "Konfliktaktion" -#: sql_help.c:3997 +#: sql_help.c:4018 msgid "where conflict_target can be one of:" msgstr "wobei Konfliktziel Folgendes sein kann:" -#: sql_help.c:3998 +#: sql_help.c:4019 msgid "index_column_name" msgstr "Indexspaltenname" -#: sql_help.c:3999 +#: sql_help.c:4020 msgid "index_expression" msgstr "Indexausdruck" -#: sql_help.c:4002 +#: sql_help.c:4023 msgid "index_predicate" msgstr "Indexprädikat" -#: sql_help.c:4004 +#: sql_help.c:4025 msgid "and conflict_action is one of:" msgstr "und Konfliktaktion Folgendes sein kann:" -#: sql_help.c:4010 sql_help.c:4938 +#: sql_help.c:4031 sql_help.c:4132 sql_help.c:4972 msgid "sub-SELECT" msgstr "Sub-SELECT" -#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914 +#: sql_help.c:4040 sql_help.c:4173 sql_help.c:4948 msgid "channel" msgstr "Kanal" -#: sql_help.c:4041 +#: sql_help.c:4062 msgid "lockmode" msgstr "Sperrmodus" -#: sql_help.c:4042 +#: sql_help.c:4063 msgid "where lockmode is one of:" msgstr "wobei Sperrmodus Folgendes sein kann:" -#: sql_help.c:4078 +#: sql_help.c:4103 msgid "target_table_name" msgstr "Zieltabellenname" -#: sql_help.c:4079 +#: sql_help.c:4104 msgid "target_alias" msgstr "Zielalias" -#: sql_help.c:4080 +#: sql_help.c:4105 msgid "data_source" msgstr "Datenquelle" -#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112 +#: sql_help.c:4106 sql_help.c:4641 sql_help.c:4899 sql_help.c:5144 msgid "join_condition" msgstr "Verbundbedingung" -#: sql_help.c:4082 +#: sql_help.c:4107 msgid "when_clause" msgstr "When-Klausel" -#: sql_help.c:4083 +#: sql_help.c:4110 msgid "where data_source is:" msgstr "wobei Datenquelle Folgendes ist:" -#: sql_help.c:4084 +#: sql_help.c:4111 msgid "source_table_name" msgstr "Quelltabellenname" -#: sql_help.c:4085 +#: sql_help.c:4112 msgid "source_query" msgstr "Quellanfrage" -#: sql_help.c:4086 +#: sql_help.c:4113 msgid "source_alias" msgstr "Quellalias" -#: sql_help.c:4087 +#: sql_help.c:4114 msgid "and when_clause is:" msgstr "und When-Klausel Folgendes ist:" -#: sql_help.c:4089 +#: sql_help.c:4116 sql_help.c:4119 msgid "merge_update" msgstr "Merge-Update" -#: sql_help.c:4090 +#: sql_help.c:4117 sql_help.c:4120 msgid "merge_delete" msgstr "Merge-Delete" -#: sql_help.c:4092 +#: sql_help.c:4122 msgid "merge_insert" msgstr "Merge-Insert" -#: sql_help.c:4093 +#: sql_help.c:4123 msgid "and merge_insert is:" msgstr "und Merge-Insert Folgendes ist:" -#: sql_help.c:4096 +#: sql_help.c:4126 msgid "and merge_update is:" msgstr "und Merge-Update Folgendes ist:" -#: sql_help.c:4101 +#: sql_help.c:4133 msgid "and merge_delete is:" msgstr "und Merge-Delete Folgendes ist:" -#: sql_help.c:4142 +#: sql_help.c:4174 msgid "payload" msgstr "Payload" -#: sql_help.c:4169 +#: sql_help.c:4201 msgid "old_role" msgstr "alte_Rolle" -#: sql_help.c:4170 +#: sql_help.c:4202 msgid "new_role" msgstr "neue_Rolle" -#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426 +#: sql_help.c:4241 sql_help.c:4450 sql_help.c:4458 msgid "savepoint_name" msgstr "Sicherungspunktsname" -#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881 -#: sql_help.c:5069 sql_help.c:5127 +#: sql_help.c:4598 sql_help.c:4656 sql_help.c:4856 sql_help.c:4914 +#: sql_help.c:5101 sql_help.c:5159 msgid "grouping_element" msgstr "Gruppierelement" -#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071 +#: sql_help.c:4600 sql_help.c:4704 sql_help.c:4858 sql_help.c:5103 msgid "window_name" msgstr "Fenstername" -#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072 +#: sql_help.c:4601 sql_help.c:4705 sql_help.c:4859 sql_help.c:5104 msgid "window_definition" msgstr "Fensterdefinition" -#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673 -#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073 -#: sql_help.c:5087 sql_help.c:5131 +#: sql_help.c:4602 sql_help.c:4616 sql_help.c:4660 sql_help.c:4706 +#: sql_help.c:4860 sql_help.c:4874 sql_help.c:4918 sql_help.c:5105 +#: sql_help.c:5119 sql_help.c:5163 msgid "select" msgstr "Select" -#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080 +#: sql_help.c:4608 sql_help.c:4866 sql_help.c:5111 +msgid "from_reference" +msgstr "From-Referenz" + +#: sql_help.c:4609 sql_help.c:4867 sql_help.c:5112 msgid "where from_item can be one of:" msgstr "wobei From-Element Folgendes sein kann:" -#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593 -#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846 -#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089 -#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108 +#: sql_help.c:4612 sql_help.c:4618 sql_help.c:4621 sql_help.c:4625 +#: sql_help.c:4637 sql_help.c:4870 sql_help.c:4876 sql_help.c:4879 +#: sql_help.c:4883 sql_help.c:4895 sql_help.c:5115 sql_help.c:5121 +#: sql_help.c:5124 sql_help.c:5128 sql_help.c:5140 msgid "column_alias" msgstr "Spaltenalias" -#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084 +#: sql_help.c:4613 sql_help.c:4871 sql_help.c:5116 msgid "sampling_method" msgstr "Stichprobenmethode" -#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086 +#: sql_help.c:4615 sql_help.c:4873 sql_help.c:5118 msgid "seed" msgstr "Startwert" -#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883 -#: sql_help.c:5090 sql_help.c:5129 +#: sql_help.c:4619 sql_help.c:4658 sql_help.c:4877 sql_help.c:4916 +#: sql_help.c:5122 sql_help.c:5161 msgid "with_query_name" msgstr "With-Anfragename" -#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854 -#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103 -#: sql_help.c:5106 +#: sql_help.c:4629 sql_help.c:4632 sql_help.c:4635 sql_help.c:4887 +#: sql_help.c:4890 sql_help.c:4893 sql_help.c:5132 sql_help.c:5135 +#: sql_help.c:5138 msgid "column_definition" msgstr "Spaltendefinition" -#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870 -#: sql_help.c:5110 sql_help.c:5116 +#: sql_help.c:4639 sql_help.c:4645 sql_help.c:4897 sql_help.c:4903 +#: sql_help.c:5142 sql_help.c:5148 msgid "join_type" msgstr "Verbundtyp" -#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113 +#: sql_help.c:4642 sql_help.c:4900 sql_help.c:5145 msgid "join_column" msgstr "Verbundspalte" -#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114 +#: sql_help.c:4643 sql_help.c:4901 sql_help.c:5146 msgid "join_using_alias" msgstr "Join-Using-Alias" -#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120 +#: sql_help.c:4649 sql_help.c:4907 sql_help.c:5152 msgid "and grouping_element can be one of:" msgstr "und Gruppierelement eins der folgenden sein kann:" -#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128 +#: sql_help.c:4657 sql_help.c:4915 sql_help.c:5160 msgid "and with_query is:" msgstr "und With-Anfrage ist:" -#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132 +#: sql_help.c:4661 sql_help.c:4919 sql_help.c:5164 msgid "values" msgstr "values" -#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133 +#: sql_help.c:4662 sql_help.c:4920 sql_help.c:5165 msgid "insert" msgstr "insert" -#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134 +#: sql_help.c:4663 sql_help.c:4921 sql_help.c:5166 msgid "update" msgstr "update" -#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135 +#: sql_help.c:4664 sql_help.c:4922 sql_help.c:5167 msgid "delete" msgstr "delete" -#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137 +#: sql_help.c:4665 sql_help.c:4923 sql_help.c:5168 +msgid "merge" +msgstr "merge" + +#: sql_help.c:4667 sql_help.c:4925 sql_help.c:5170 msgid "search_seq_col_name" msgstr "Search-Seq-Spaltenname" -#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139 +#: sql_help.c:4669 sql_help.c:4927 sql_help.c:5172 msgid "cycle_mark_col_name" msgstr "Cycle-Mark-Spaltenname" -#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140 +#: sql_help.c:4670 sql_help.c:4928 sql_help.c:5173 msgid "cycle_mark_value" msgstr "Cycle-Mark-Wert" -#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141 +#: sql_help.c:4671 sql_help.c:4929 sql_help.c:5174 msgid "cycle_mark_default" msgstr "Cycle-Mark-Standard" -#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142 +#: sql_help.c:4672 sql_help.c:4930 sql_help.c:5175 msgid "cycle_path_col_name" msgstr "Cycle-Pfad-Spaltenname" -#: sql_help.c:4666 +#: sql_help.c:4699 msgid "new_table" msgstr "neue_Tabelle" -#: sql_help.c:4737 +#: sql_help.c:4770 msgid "snapshot_id" msgstr "Snapshot-ID" -#: sql_help.c:5005 +#: sql_help.c:5037 msgid "sort_expression" msgstr "Sortierausdruck" -#: sql_help.c:5149 sql_help.c:6133 +#: sql_help.c:5182 sql_help.c:6166 msgid "abort the current transaction" msgstr "bricht die aktuelle Transaktion ab" -#: sql_help.c:5155 +#: sql_help.c:5188 msgid "change the definition of an aggregate function" msgstr "ändert die Definition einer Aggregatfunktion" -#: sql_help.c:5161 +#: sql_help.c:5194 msgid "change the definition of a collation" msgstr "ändert die Definition einer Sortierfolge" -#: sql_help.c:5167 +#: sql_help.c:5200 msgid "change the definition of a conversion" msgstr "ändert die Definition einer Zeichensatzkonversion" -#: sql_help.c:5173 +#: sql_help.c:5206 msgid "change a database" msgstr "ändert eine Datenbank" -#: sql_help.c:5179 +#: sql_help.c:5212 msgid "define default access privileges" msgstr "definiert vorgegebene Zugriffsprivilegien" -#: sql_help.c:5185 +#: sql_help.c:5218 msgid "change the definition of a domain" msgstr "ändert die Definition einer Domäne" -#: sql_help.c:5191 +#: sql_help.c:5224 msgid "change the definition of an event trigger" msgstr "ändert die Definition eines Ereignistriggers" -#: sql_help.c:5197 +#: sql_help.c:5230 msgid "change the definition of an extension" msgstr "ändert die Definition einer Erweiterung" -#: sql_help.c:5203 +#: sql_help.c:5236 msgid "change the definition of a foreign-data wrapper" msgstr "ändert die Definition eines Fremddaten-Wrappers" -#: sql_help.c:5209 +#: sql_help.c:5242 msgid "change the definition of a foreign table" msgstr "ändert die Definition einer Fremdtabelle" -#: sql_help.c:5215 +#: sql_help.c:5248 msgid "change the definition of a function" msgstr "ändert die Definition einer Funktion" -#: sql_help.c:5221 +#: sql_help.c:5254 msgid "change role name or membership" msgstr "ändert Rollenname oder -mitglieder" -#: sql_help.c:5227 +#: sql_help.c:5260 msgid "change the definition of an index" msgstr "ändert die Definition eines Index" -#: sql_help.c:5233 +#: sql_help.c:5266 msgid "change the definition of a procedural language" msgstr "ändert die Definition einer prozeduralen Sprache" -#: sql_help.c:5239 +#: sql_help.c:5272 msgid "change the definition of a large object" msgstr "ändert die Definition eines Large Object" -#: sql_help.c:5245 +#: sql_help.c:5278 msgid "change the definition of a materialized view" msgstr "ändert die Definition einer materialisierten Sicht" -#: sql_help.c:5251 +#: sql_help.c:5284 msgid "change the definition of an operator" msgstr "ändert die Definition eines Operators" -#: sql_help.c:5257 +#: sql_help.c:5290 msgid "change the definition of an operator class" msgstr "ändert die Definition einer Operatorklasse" -#: sql_help.c:5263 +#: sql_help.c:5296 msgid "change the definition of an operator family" msgstr "ändert die Definition einer Operatorfamilie" -#: sql_help.c:5269 +#: sql_help.c:5302 msgid "change the definition of a row-level security policy" msgstr "ändert die Definition einer Policy für Sicherheit auf Zeilenebene" -#: sql_help.c:5275 +#: sql_help.c:5308 msgid "change the definition of a procedure" msgstr "ändert die Definition einer Prozedur" -#: sql_help.c:5281 +#: sql_help.c:5314 msgid "change the definition of a publication" msgstr "ändert die Definition einer Publikation" -#: sql_help.c:5287 sql_help.c:5389 +#: sql_help.c:5320 sql_help.c:5422 msgid "change a database role" msgstr "ändert eine Datenbankrolle" -#: sql_help.c:5293 +#: sql_help.c:5326 msgid "change the definition of a routine" msgstr "ändert die Definition einer Routine" -#: sql_help.c:5299 +#: sql_help.c:5332 msgid "change the definition of a rule" msgstr "ändert die Definition einer Regel" -#: sql_help.c:5305 +#: sql_help.c:5338 msgid "change the definition of a schema" msgstr "ändert die Definition eines Schemas" -#: sql_help.c:5311 +#: sql_help.c:5344 msgid "change the definition of a sequence generator" msgstr "ändert die Definition eines Sequenzgenerators" -#: sql_help.c:5317 +#: sql_help.c:5350 msgid "change the definition of a foreign server" msgstr "ändert die Definition eines Fremdservers" -#: sql_help.c:5323 +#: sql_help.c:5356 msgid "change the definition of an extended statistics object" msgstr "ändert die Definition eines erweiterten Statistikobjekts" -#: sql_help.c:5329 +#: sql_help.c:5362 msgid "change the definition of a subscription" msgstr "ändert die Definition einer Subskription" -#: sql_help.c:5335 +#: sql_help.c:5368 msgid "change a server configuration parameter" msgstr "ändert einen Server-Konfigurationsparameter" -#: sql_help.c:5341 +#: sql_help.c:5374 msgid "change the definition of a table" msgstr "ändert die Definition einer Tabelle" -#: sql_help.c:5347 +#: sql_help.c:5380 msgid "change the definition of a tablespace" msgstr "ändert die Definition eines Tablespace" -#: sql_help.c:5353 +#: sql_help.c:5386 msgid "change the definition of a text search configuration" msgstr "ändert die Definition einer Textsuchekonfiguration" -#: sql_help.c:5359 +#: sql_help.c:5392 msgid "change the definition of a text search dictionary" msgstr "ändert die Definition eines Textsuchewörterbuchs" -#: sql_help.c:5365 +#: sql_help.c:5398 msgid "change the definition of a text search parser" msgstr "ändert die Definition eines Textsucheparsers" -#: sql_help.c:5371 +#: sql_help.c:5404 msgid "change the definition of a text search template" msgstr "ändert die Definition einer Textsuchevorlage" -#: sql_help.c:5377 +#: sql_help.c:5410 msgid "change the definition of a trigger" msgstr "ändert die Definition eines Triggers" -#: sql_help.c:5383 +#: sql_help.c:5416 msgid "change the definition of a type" msgstr "ändert die Definition eines Typs" -#: sql_help.c:5395 +#: sql_help.c:5428 msgid "change the definition of a user mapping" msgstr "ändert die Definition einer Benutzerabbildung" -#: sql_help.c:5401 +#: sql_help.c:5434 msgid "change the definition of a view" msgstr "ändert die Definition einer Sicht" -#: sql_help.c:5407 +#: sql_help.c:5440 msgid "collect statistics about a database" msgstr "sammelt Statistiken über eine Datenbank" -#: sql_help.c:5413 sql_help.c:6211 +#: sql_help.c:5446 sql_help.c:6244 msgid "start a transaction block" msgstr "startet einen Transaktionsblock" -#: sql_help.c:5419 +#: sql_help.c:5452 msgid "invoke a procedure" msgstr "ruft eine Prozedur auf" -#: sql_help.c:5425 +#: sql_help.c:5458 msgid "force a write-ahead log checkpoint" msgstr "erzwingt einen Checkpoint im Write-Ahead-Log" -#: sql_help.c:5431 +#: sql_help.c:5464 msgid "close a cursor" msgstr "schließt einen Cursor" -#: sql_help.c:5437 +#: sql_help.c:5470 msgid "cluster a table according to an index" msgstr "clustert eine Tabelle nach einem Index" -#: sql_help.c:5443 +#: sql_help.c:5476 msgid "define or change the comment of an object" msgstr "definiert oder ändert den Kommentar eines Objektes" -#: sql_help.c:5449 sql_help.c:6007 +#: sql_help.c:5482 sql_help.c:6040 msgid "commit the current transaction" msgstr "schließt die aktuelle Transaktion ab" -#: sql_help.c:5455 +#: sql_help.c:5488 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "schließt eine Transaktion ab, die vorher für Two-Phase-Commit vorbereitet worden war" -#: sql_help.c:5461 +#: sql_help.c:5494 msgid "copy data between a file and a table" msgstr "kopiert Daten zwischen einer Datei und einer Tabelle" -#: sql_help.c:5467 +#: sql_help.c:5500 msgid "define a new access method" msgstr "definiert eine neue Zugriffsmethode" -#: sql_help.c:5473 +#: sql_help.c:5506 msgid "define a new aggregate function" msgstr "definiert eine neue Aggregatfunktion" -#: sql_help.c:5479 +#: sql_help.c:5512 msgid "define a new cast" msgstr "definiert eine neue Typumwandlung" -#: sql_help.c:5485 +#: sql_help.c:5518 msgid "define a new collation" msgstr "definiert eine neue Sortierfolge" -#: sql_help.c:5491 +#: sql_help.c:5524 msgid "define a new encoding conversion" msgstr "definiert eine neue Kodierungskonversion" -#: sql_help.c:5497 +#: sql_help.c:5530 msgid "create a new database" msgstr "erzeugt eine neue Datenbank" -#: sql_help.c:5503 +#: sql_help.c:5536 msgid "define a new domain" msgstr "definiert eine neue Domäne" -#: sql_help.c:5509 +#: sql_help.c:5542 msgid "define a new event trigger" msgstr "definiert einen neuen Ereignistrigger" -#: sql_help.c:5515 +#: sql_help.c:5548 msgid "install an extension" msgstr "installiert eine Erweiterung" -#: sql_help.c:5521 +#: sql_help.c:5554 msgid "define a new foreign-data wrapper" msgstr "definiert einen neuen Fremddaten-Wrapper" -#: sql_help.c:5527 +#: sql_help.c:5560 msgid "define a new foreign table" msgstr "definiert eine neue Fremdtabelle" -#: sql_help.c:5533 +#: sql_help.c:5566 msgid "define a new function" msgstr "definiert eine neue Funktion" -#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701 +#: sql_help.c:5572 sql_help.c:5632 sql_help.c:5734 msgid "define a new database role" msgstr "definiert eine neue Datenbankrolle" -#: sql_help.c:5545 +#: sql_help.c:5578 msgid "define a new index" msgstr "definiert einen neuen Index" -#: sql_help.c:5551 +#: sql_help.c:5584 msgid "define a new procedural language" msgstr "definiert eine neue prozedurale Sprache" -#: sql_help.c:5557 +#: sql_help.c:5590 msgid "define a new materialized view" msgstr "definiert eine neue materialisierte Sicht" -#: sql_help.c:5563 +#: sql_help.c:5596 msgid "define a new operator" msgstr "definiert einen neuen Operator" -#: sql_help.c:5569 +#: sql_help.c:5602 msgid "define a new operator class" msgstr "definiert eine neue Operatorklasse" -#: sql_help.c:5575 +#: sql_help.c:5608 msgid "define a new operator family" msgstr "definiert eine neue Operatorfamilie" -#: sql_help.c:5581 +#: sql_help.c:5614 msgid "define a new row-level security policy for a table" msgstr "definiert eine neue Policy für Sicherheit auf Zeilenebene für eine Tabelle" -#: sql_help.c:5587 +#: sql_help.c:5620 msgid "define a new procedure" msgstr "definiert eine neue Prozedur" -#: sql_help.c:5593 +#: sql_help.c:5626 msgid "define a new publication" msgstr "definiert eine neue Publikation" -#: sql_help.c:5605 +#: sql_help.c:5638 msgid "define a new rewrite rule" msgstr "definiert eine neue Umschreiberegel" -#: sql_help.c:5611 +#: sql_help.c:5644 msgid "define a new schema" msgstr "definiert ein neues Schema" -#: sql_help.c:5617 +#: sql_help.c:5650 msgid "define a new sequence generator" msgstr "definiert einen neuen Sequenzgenerator" -#: sql_help.c:5623 +#: sql_help.c:5656 msgid "define a new foreign server" msgstr "definiert einen neuen Fremdserver" -#: sql_help.c:5629 +#: sql_help.c:5662 msgid "define extended statistics" msgstr "definiert erweiterte Statistiken" -#: sql_help.c:5635 +#: sql_help.c:5668 msgid "define a new subscription" msgstr "definiert eine neue Subskription" -#: sql_help.c:5641 +#: sql_help.c:5674 msgid "define a new table" msgstr "definiert eine neue Tabelle" -#: sql_help.c:5647 sql_help.c:6169 +#: sql_help.c:5680 sql_help.c:6202 msgid "define a new table from the results of a query" msgstr "definiert eine neue Tabelle aus den Ergebnissen einer Anfrage" -#: sql_help.c:5653 +#: sql_help.c:5686 msgid "define a new tablespace" msgstr "definiert einen neuen Tablespace" -#: sql_help.c:5659 +#: sql_help.c:5692 msgid "define a new text search configuration" msgstr "definiert eine neue Textsuchekonfiguration" -#: sql_help.c:5665 +#: sql_help.c:5698 msgid "define a new text search dictionary" msgstr "definiert ein neues Textsuchewörterbuch" -#: sql_help.c:5671 +#: sql_help.c:5704 msgid "define a new text search parser" msgstr "definiert einen neuen Textsucheparser" -#: sql_help.c:5677 +#: sql_help.c:5710 msgid "define a new text search template" msgstr "definiert eine neue Textsuchevorlage" -#: sql_help.c:5683 +#: sql_help.c:5716 msgid "define a new transform" msgstr "definiert eine neue Transformation" -#: sql_help.c:5689 +#: sql_help.c:5722 msgid "define a new trigger" msgstr "definiert einen neuen Trigger" -#: sql_help.c:5695 +#: sql_help.c:5728 msgid "define a new data type" msgstr "definiert einen neuen Datentyp" -#: sql_help.c:5707 +#: sql_help.c:5740 msgid "define a new mapping of a user to a foreign server" msgstr "definiert eine neue Abbildung eines Benutzers auf einen Fremdserver" -#: sql_help.c:5713 +#: sql_help.c:5746 msgid "define a new view" msgstr "definiert eine neue Sicht" -#: sql_help.c:5719 +#: sql_help.c:5752 msgid "deallocate a prepared statement" msgstr "gibt einen vorbereiteten Befehl frei" -#: sql_help.c:5725 +#: sql_help.c:5758 msgid "define a cursor" msgstr "definiert einen Cursor" -#: sql_help.c:5731 +#: sql_help.c:5764 msgid "delete rows of a table" msgstr "löscht Zeilen einer Tabelle" -#: sql_help.c:5737 +#: sql_help.c:5770 msgid "discard session state" msgstr "verwirft den Sitzungszustand" -#: sql_help.c:5743 +#: sql_help.c:5776 msgid "execute an anonymous code block" msgstr "führt einen anonymen Codeblock aus" -#: sql_help.c:5749 +#: sql_help.c:5782 msgid "remove an access method" msgstr "entfernt eine Zugriffsmethode" -#: sql_help.c:5755 +#: sql_help.c:5788 msgid "remove an aggregate function" msgstr "entfernt eine Aggregatfunktion" -#: sql_help.c:5761 +#: sql_help.c:5794 msgid "remove a cast" msgstr "entfernt eine Typumwandlung" -#: sql_help.c:5767 +#: sql_help.c:5800 msgid "remove a collation" msgstr "entfernt eine Sortierfolge" -#: sql_help.c:5773 +#: sql_help.c:5806 msgid "remove a conversion" msgstr "entfernt eine Zeichensatzkonversion" -#: sql_help.c:5779 +#: sql_help.c:5812 msgid "remove a database" msgstr "entfernt eine Datenbank" -#: sql_help.c:5785 +#: sql_help.c:5818 msgid "remove a domain" msgstr "entfernt eine Domäne" -#: sql_help.c:5791 +#: sql_help.c:5824 msgid "remove an event trigger" msgstr "entfernt einen Ereignistrigger" -#: sql_help.c:5797 +#: sql_help.c:5830 msgid "remove an extension" msgstr "entfernt eine Erweiterung" -#: sql_help.c:5803 +#: sql_help.c:5836 msgid "remove a foreign-data wrapper" msgstr "entfernt einen Fremddaten-Wrapper" -#: sql_help.c:5809 +#: sql_help.c:5842 msgid "remove a foreign table" msgstr "entfernt eine Fremdtabelle" -#: sql_help.c:5815 +#: sql_help.c:5848 msgid "remove a function" msgstr "entfernt eine Funktion" -#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989 +#: sql_help.c:5854 sql_help.c:5920 sql_help.c:6022 msgid "remove a database role" msgstr "entfernt eine Datenbankrolle" -#: sql_help.c:5827 +#: sql_help.c:5860 msgid "remove an index" msgstr "entfernt einen Index" -#: sql_help.c:5833 +#: sql_help.c:5866 msgid "remove a procedural language" msgstr "entfernt eine prozedurale Sprache" -#: sql_help.c:5839 +#: sql_help.c:5872 msgid "remove a materialized view" msgstr "entfernt eine materialisierte Sicht" -#: sql_help.c:5845 +#: sql_help.c:5878 msgid "remove an operator" msgstr "entfernt einen Operator" -#: sql_help.c:5851 +#: sql_help.c:5884 msgid "remove an operator class" msgstr "entfernt eine Operatorklasse" -#: sql_help.c:5857 +#: sql_help.c:5890 msgid "remove an operator family" msgstr "entfernt eine Operatorfamilie" -#: sql_help.c:5863 +#: sql_help.c:5896 msgid "remove database objects owned by a database role" msgstr "entfernt die einer Datenbankrolle gehörenden Datenbankobjekte" -#: sql_help.c:5869 +#: sql_help.c:5902 msgid "remove a row-level security policy from a table" msgstr "entfernt eine Policy für Sicherheit auf Zeilenebene von einer Tabelle" -#: sql_help.c:5875 +#: sql_help.c:5908 msgid "remove a procedure" msgstr "entfernt eine Prozedur" -#: sql_help.c:5881 +#: sql_help.c:5914 msgid "remove a publication" msgstr "entfernt eine Publikation" -#: sql_help.c:5893 +#: sql_help.c:5926 msgid "remove a routine" msgstr "entfernt eine Routine" -#: sql_help.c:5899 +#: sql_help.c:5932 msgid "remove a rewrite rule" msgstr "entfernt eine Umschreiberegel" -#: sql_help.c:5905 +#: sql_help.c:5938 msgid "remove a schema" msgstr "entfernt ein Schema" -#: sql_help.c:5911 +#: sql_help.c:5944 msgid "remove a sequence" msgstr "entfernt eine Sequenz" -#: sql_help.c:5917 +#: sql_help.c:5950 msgid "remove a foreign server descriptor" msgstr "entfernt einen Fremdserverdeskriptor" -#: sql_help.c:5923 +#: sql_help.c:5956 msgid "remove extended statistics" msgstr "entfernt erweiterte Statistiken" -#: sql_help.c:5929 +#: sql_help.c:5962 msgid "remove a subscription" msgstr "entfernt eine Subskription" -#: sql_help.c:5935 +#: sql_help.c:5968 msgid "remove a table" msgstr "entfernt eine Tabelle" -#: sql_help.c:5941 +#: sql_help.c:5974 msgid "remove a tablespace" msgstr "entfernt einen Tablespace" -#: sql_help.c:5947 +#: sql_help.c:5980 msgid "remove a text search configuration" msgstr "entfernt eine Textsuchekonfiguration" -#: sql_help.c:5953 +#: sql_help.c:5986 msgid "remove a text search dictionary" msgstr "entfernt ein Textsuchewörterbuch" -#: sql_help.c:5959 +#: sql_help.c:5992 msgid "remove a text search parser" msgstr "entfernt einen Textsucheparser" -#: sql_help.c:5965 +#: sql_help.c:5998 msgid "remove a text search template" msgstr "entfernt eine Textsuchevorlage" -#: sql_help.c:5971 +#: sql_help.c:6004 msgid "remove a transform" msgstr "entfernt eine Transformation" -#: sql_help.c:5977 +#: sql_help.c:6010 msgid "remove a trigger" msgstr "entfernt einen Trigger" -#: sql_help.c:5983 +#: sql_help.c:6016 msgid "remove a data type" msgstr "entfernt einen Datentyp" -#: sql_help.c:5995 +#: sql_help.c:6028 msgid "remove a user mapping for a foreign server" msgstr "entfernt eine Benutzerabbildung für einen Fremdserver" -#: sql_help.c:6001 +#: sql_help.c:6034 msgid "remove a view" msgstr "entfernt eine Sicht" -#: sql_help.c:6013 +#: sql_help.c:6046 msgid "execute a prepared statement" msgstr "führt einen vorbereiteten Befehl aus" -#: sql_help.c:6019 +#: sql_help.c:6052 msgid "show the execution plan of a statement" msgstr "zeigt den Ausführungsplan eines Befehls" -#: sql_help.c:6025 +#: sql_help.c:6058 msgid "retrieve rows from a query using a cursor" msgstr "liest Zeilen aus einer Anfrage mit einem Cursor" -#: sql_help.c:6031 +#: sql_help.c:6064 msgid "define access privileges" msgstr "definiert Zugriffsprivilegien" -#: sql_help.c:6037 +#: sql_help.c:6070 msgid "import table definitions from a foreign server" msgstr "importiert Tabellendefinitionen von einem Fremdserver" -#: sql_help.c:6043 +#: sql_help.c:6076 msgid "create new rows in a table" msgstr "erzeugt neue Zeilen in einer Tabelle" -#: sql_help.c:6049 +#: sql_help.c:6082 msgid "listen for a notification" msgstr "hört auf eine Benachrichtigung" -#: sql_help.c:6055 +#: sql_help.c:6088 msgid "load a shared library file" msgstr "lädt eine dynamische Bibliotheksdatei" -#: sql_help.c:6061 +#: sql_help.c:6094 msgid "lock a table" msgstr "sperrt eine Tabelle" -#: sql_help.c:6067 +#: sql_help.c:6100 msgid "conditionally insert, update, or delete rows of a table" msgstr "fügt Zeilen in eine Tabelle ein oder ändert oder löscht Zeilen einer Tabelle, abhängig von Bedingungen" -#: sql_help.c:6073 +#: sql_help.c:6106 msgid "position a cursor" msgstr "positioniert einen Cursor" -#: sql_help.c:6079 +#: sql_help.c:6112 msgid "generate a notification" msgstr "erzeugt eine Benachrichtigung" -#: sql_help.c:6085 +#: sql_help.c:6118 msgid "prepare a statement for execution" msgstr "bereitet einen Befehl zur Ausführung vor" -#: sql_help.c:6091 +#: sql_help.c:6124 msgid "prepare the current transaction for two-phase commit" msgstr "bereitet die aktuelle Transaktion für Two-Phase-Commit vor" -#: sql_help.c:6097 +#: sql_help.c:6130 msgid "change the ownership of database objects owned by a database role" msgstr "ändert den Eigentümer der der Rolle gehörenden Datenbankobjekte" -#: sql_help.c:6103 +#: sql_help.c:6136 msgid "replace the contents of a materialized view" msgstr "ersetzt den Inhalt einer materialisierten Sicht" -#: sql_help.c:6109 +#: sql_help.c:6142 msgid "rebuild indexes" msgstr "baut Indexe neu" -#: sql_help.c:6115 +#: sql_help.c:6148 msgid "release a previously defined savepoint" msgstr "gibt einen zuvor definierten Sicherungspunkt frei" -#: sql_help.c:6121 +#: sql_help.c:6154 msgid "restore the value of a run-time parameter to the default value" msgstr "setzt einen Konfigurationsparameter auf die Voreinstellung zurück" -#: sql_help.c:6127 +#: sql_help.c:6160 msgid "remove access privileges" msgstr "entfernt Zugriffsprivilegien" -#: sql_help.c:6139 +#: sql_help.c:6172 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "storniert eine Transaktion, die vorher für Two-Phase-Commit vorbereitet worden war" -#: sql_help.c:6145 +#: sql_help.c:6178 msgid "roll back to a savepoint" msgstr "rollt eine Transaktion bis zu einem Sicherungspunkt zurück" -#: sql_help.c:6151 +#: sql_help.c:6184 msgid "define a new savepoint within the current transaction" msgstr "definiert einen neuen Sicherungspunkt in der aktuellen Transaktion" -#: sql_help.c:6157 +#: sql_help.c:6190 msgid "define or change a security label applied to an object" msgstr "definiert oder ändert ein Security-Label eines Objektes" -#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253 +#: sql_help.c:6196 sql_help.c:6250 sql_help.c:6286 msgid "retrieve rows from a table or view" msgstr "liest Zeilen aus einer Tabelle oder Sicht" -#: sql_help.c:6175 +#: sql_help.c:6208 msgid "change a run-time parameter" msgstr "ändert einen Konfigurationsparameter" -#: sql_help.c:6181 +#: sql_help.c:6214 msgid "set constraint check timing for the current transaction" msgstr "setzt die Zeitsteuerung für Check-Constraints in der aktuellen Transaktion" -#: sql_help.c:6187 +#: sql_help.c:6220 msgid "set the current user identifier of the current session" msgstr "setzt den aktuellen Benutzernamen der aktuellen Sitzung" -#: sql_help.c:6193 +#: sql_help.c:6226 msgid "set the session user identifier and the current user identifier of the current session" msgstr "setzt den Sitzungsbenutzernamen und den aktuellen Benutzernamen der aktuellen Sitzung" -#: sql_help.c:6199 +#: sql_help.c:6232 msgid "set the characteristics of the current transaction" msgstr "setzt die Charakteristika der aktuellen Transaktion" -#: sql_help.c:6205 +#: sql_help.c:6238 msgid "show the value of a run-time parameter" msgstr "zeigt den Wert eines Konfigurationsparameters" -#: sql_help.c:6223 +#: sql_help.c:6256 msgid "empty a table or set of tables" msgstr "leert eine oder mehrere Tabellen" -#: sql_help.c:6229 +#: sql_help.c:6262 msgid "stop listening for a notification" msgstr "beendet das Hören auf eine Benachrichtigung" -#: sql_help.c:6235 +#: sql_help.c:6268 msgid "update rows of a table" msgstr "aktualisiert Zeilen einer Tabelle" -#: sql_help.c:6241 +#: sql_help.c:6274 msgid "garbage-collect and optionally analyze a database" msgstr "säubert und analysiert eine Datenbank" -#: sql_help.c:6247 +#: sql_help.c:6280 msgid "compute a set of rows" msgstr "berechnet eine Zeilenmenge" @@ -6529,7 +6618,7 @@ msgstr "überflüssiges Kommandozeilenargument »%s« ignoriert" msgid "could not find own program executable" msgstr "konnte eigene Programmdatei nicht finden" -#: tab-complete.c:6076 +#: tab-complete.c:6216 #, c-format msgid "" "tab completion query failed: %s\n" diff --git a/src/bin/psql/po/el.po b/src/bin/psql/po/el.po index a40390de7fcaa..2fe4db9eec06b 100644 --- a/src/bin/psql/po/el.po +++ b/src/bin/psql/po/el.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: psql (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-14 09:16+0000\n" -"PO-Revision-Date: 2023-04-14 15:45+0200\n" +"POT-Creation-Date: 2023-08-15 13:47+0000\n" +"PO-Revision-Date: 2024-06-26 08:48+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -40,55 +40,45 @@ msgstr "λεπτομέÏεια: " msgid "hint: " msgstr "υπόδειξη: " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:172 #, c-format -msgid "could not identify current directory: %m" -msgstr "δεν ήταν δυνατή η αναγνώÏιση του Ï„Ïέχοντος καταλόγου: %m" +msgid "invalid binary \"%s\": %m" +msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»: %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:215 #, c-format -msgid "invalid binary \"%s\"" -msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»" +msgid "could not read binary \"%s\": %m" +msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»: %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:223 #, c-format msgid "could not find a \"%s\" to execute" msgstr "δεν βÏέθηκε το αÏχείο «%s» για να εκτελεστεί" -#: ../../common/exec.c:282 ../../common/exec.c:321 -#, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" - -#: ../../common/exec.c:299 +#: ../../common/exec.c:250 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "δεν δÏναται η επίλυση διαδÏομής «%s» σε απόλυτη μοÏφή: %m" -#: ../../common/exec.c:422 +#: ../../common/exec.c:412 #, c-format msgid "%s() failed: %m" msgstr "%s() απέτυχε: %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227 +#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226 #: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "έλλειψη μνήμης" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "έλλειψη μνήμης\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n" @@ -98,7 +88,7 @@ msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (ε msgid "could not look up effective user ID %ld: %s" msgstr "δεν ήταν δυνατή η αναζήτηση ενεÏγής ταυτότητας χÏήστη %ld: %s" -#: ../../common/username.c:45 command.c:575 +#: ../../common/username.c:45 command.c:613 msgid "user does not exist" msgstr "ο χÏήστης δεν υπάÏχει" @@ -107,32 +97,32 @@ msgstr "ο χÏήστης δεν υπάÏχει" msgid "user name lookup failure: error code %lu" msgstr "αποτυχία αναζήτησης ονόματος χÏήστη: κωδικός σφάλματος %lu" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "εντολή μη εκτελέσιμη" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "εντολή δεν βÏέθηκε" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "απόγονος διεÏγασίας τεÏμάτισε με κωδικό εξόδου %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "απόγονος διεÏγασίας τεÏματίστηκε με εξαίÏεση 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "απόγονος διεÏγασίας τεÏματίστηκε με σήμα %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "απόγονος διεÏγασίας τεÏμάτισε με μη αναγνωÏίσιμη κατάσταση %d" @@ -152,289 +142,319 @@ msgid_plural "(%lu rows)" msgstr[0] "(%lu σειÏά)" msgstr[1] "(%lu σειÏές)" -#: ../../fe_utils/print.c:3109 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "Διακόπηκε\n" -#: ../../fe_utils/print.c:3173 +#: ../../fe_utils/print.c:3218 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Δεν είναι δυνατή η Ï€Ïοσθήκη κεφαλίδας σε πεÏιεχόμενο πίνακα: υπέÏβαση του πλήθους στηλών %d.\n" -#: ../../fe_utils/print.c:3213 +#: ../../fe_utils/print.c:3258 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "Δεν είναι δυνατή η Ï€Ïοσθήκη ÎºÎµÎ»Î¹Î¿Ï ÏƒÎµ πεÏιεχόμενο πίνακα: υπέÏβαση του ÏƒÏ…Î½Î¿Î»Î¹ÎºÎ¿Ï Î±ÏÎ¹Î¸Î¼Î¿Ï ÎºÎµÎ»Î¹ÏŽÎ½ %d.\n" -#: ../../fe_utils/print.c:3471 +#: ../../fe_utils/print.c:3516 #, c-format msgid "invalid output format (internal error): %d" msgstr "μη έγκυÏη μοÏφή εξόδου (εσωτεÏικό σφάλμα): %d" -#: ../../fe_utils/psqlscan.l:702 +#: ../../fe_utils/psqlscan.l:717 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "παÏαλείπεται η αναδÏομική επέκταση της μεταβλητής «%s»" -#: ../../port/thread.c:100 ../../port/thread.c:136 +#: ../../port/thread.c:50 ../../port/thread.c:86 #, c-format msgid "could not look up local user ID %d: %s" msgstr "δεν ήταν δυνατή η αναζήτηση ID Ï„Î¿Ï€Î¹ÎºÎ¿Ï Ï‡Ïήστη %d: %s" -#: ../../port/thread.c:105 ../../port/thread.c:141 +#: ../../port/thread.c:55 ../../port/thread.c:91 #, c-format msgid "local user with ID %d does not exist" msgstr "δεν υπάÏχει τοπικός χÏήστης με ID %d" -#: command.c:232 +#: command.c:234 #, c-format msgid "invalid command \\%s" msgstr "μη έγκυÏη εντολή «%s»" -#: command.c:234 +#: command.c:236 #, c-format msgid "Try \\? for help." msgstr "Δοκιμάστε \\? για βοήθεια." -#: command.c:252 +#: command.c:254 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: επιπλέον παÏάμετÏος «%s» αγνοείται" -#: command.c:304 +#: command.c:306 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "\\%s εντολή αγνοείται, χÏησιμοποιείστε \\endif ή Ctrl-C για να εξέλθετε από το παÏόν μπλοκ \\if" -#: command.c:573 +#: command.c:611 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "δεν ήταν δυνατή η ανάλληψη Ï€ÏÎ¿ÏƒÏ‰Ï€Î¹ÎºÎ¿Ï ÎºÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï… για τον χÏήστη με ID %ld: %s" -#: command.c:592 +#: command.c:630 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" -#: command.c:617 +#: command.c:654 #, c-format msgid "You are currently not connected to a database.\n" msgstr "Αυτή τη στιγμή δεν είστε συνδεδεμένοι σε μία βάση δεδομένων.\n" -#: command.c:627 +#: command.c:664 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» στην διεÏθυνση «%s» στη θÏÏα «%s».\n" -#: command.c:630 +#: command.c:667 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» μέσω του υποδεχέα «%s» στη θÏÏα «%s».\n" -#: command.c:636 +#: command.c:673 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» στον κεντÏικό υπολογιστή «%s» (διεÏθυνση «%s») στη θÏÏα «%s».\n" -#: command.c:639 +#: command.c:676 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» στον κεντÏικό υπολογιστή «%s» στη θÏÏα «%s».\n" -#: command.c:1030 command.c:1125 command.c:2654 +#: command.c:1066 command.c:1159 command.c:2682 #, c-format msgid "no query buffer" msgstr "μη ενδιάμεση μνήμη εÏώτησης" -#: command.c:1063 command.c:5491 +#: command.c:1099 command.c:5689 #, c-format msgid "invalid line number: %s" msgstr "μη έγκυÏος αÏιθμός γÏαμμής «%s»" -#: command.c:1203 +#: command.c:1237 msgid "No changes" msgstr "Καθόλου αλλάγες" -#: command.c:1282 +#: command.c:1315 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: μη έγκυÏη ονομασία κωδικοποίησης ή δεν βÏέθηκε η διεÏγασία μετατÏοπής" -#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597 -#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 -#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 -#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 +#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795 +#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120 +#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480 +#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192 #: large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1324 +#: command.c:1357 msgid "There is no previous error." msgstr "Δεν υπάÏχει Ï€ÏοηγοÏμενο σφάλμα." -#: command.c:1437 +#: command.c:1470 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: λείπει δεξιά παÏένθεση" -#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 -#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 +#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021 +#: command.c:2203 command.c:2444 command.c:2649 command.c:2689 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: λείπει αναγκαία παÏάμετÏος" -#: command.c:1782 +#: command.c:1815 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: δεν δÏναται να Ï€ÏοκÏψει μετά \\else" -#: command.c:1787 +#: command.c:1820 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: δεν υπάÏχει αντίστοιχο \\if" -#: command.c:1851 +#: command.c:1884 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: δεν δÏναται να Ï€ÏοκÏψει μετά \\else" -#: command.c:1856 +#: command.c:1889 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: δεν υπάÏχει αντίστοιχο \\if" -#: command.c:1896 +#: command.c:1929 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: δεν υπάÏχει αντίστοιχο \\if" -#: command.c:2053 +#: command.c:2085 msgid "Query buffer is empty." msgstr "Άδεια ενδιάμεση μνήμη εÏώτησης." -#: command.c:2096 +#: command.c:2128 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Εισάγετε νέο κωδικό Ï€Ïόσβασης για το χÏήστη «%s»: " -#: command.c:2100 +#: command.c:2132 msgid "Enter it again: " msgstr "Εισάγετε ξανά: " -#: command.c:2109 +#: command.c:2141 #, c-format msgid "Passwords didn't match." msgstr "Οι κωδικοί Ï€Ïόσβασης δεν είναι ίδιοι." -#: command.c:2208 +#: command.c:2238 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: δεν ήταν δυνατή η ανάγνωση τιμής για την μεταβλητή" -#: command.c:2311 +#: command.c:2340 msgid "Query buffer reset (cleared)." msgstr "Μηδενισμός ενδιάμεσης μνήμη εÏώτησης (καθάÏισμα)." -#: command.c:2333 +#: command.c:2362 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "‘ΕγÏαψε την ιστοÏία στο αÏχείο «%s».\n" -#: command.c:2420 +#: command.c:2449 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: η ονομασία μεταβλητή πεÏιβάλλοντος environment δεν δÏναται να εμπεÏιέχει «=«" -#: command.c:2468 +#: command.c:2497 #, c-format msgid "function name is required" msgstr "η ονομασία συνάÏτησης είναι αναγκαία" -#: command.c:2470 +#: command.c:2499 #, c-format msgid "view name is required" msgstr "η ονομασία οÏÎ¹ÏƒÎ¼Î¿Ï ÎµÎ¯Î½Î±Î¹ αναγκαία" -#: command.c:2593 +#: command.c:2621 msgid "Timing is on." msgstr "Η χÏονομέτÏηση είναι ενεÏγή." -#: command.c:2595 +#: command.c:2623 msgid "Timing is off." msgstr "Η χÏονομέτÏηση είναι ανενεÏγή." -#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 -#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 -#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331 -#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 +#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080 +#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136 +#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329 +#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:3107 startup.c:243 startup.c:293 +#: command.c:2736 copy.c:388 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: command.c:2806 command.c:2852 +#, c-format +msgid "\\watch: interval value is specified more than once" +msgstr "\\watch: η τιμή του διαστήματος καθοÏίζεται πεÏισσότεÏες από μία φοÏές" + +#: command.c:2816 command.c:2862 +#, c-format +msgid "\\watch: incorrect interval value \"%s\"" +msgstr "\\watch: εσφαλμένη τιμή διαστήματος «%s»" + +#: command.c:2826 +#, c-format +msgid "\\watch: iteration count is specified more than once" +msgstr "\\watch: ο αÏιθμός των επαναλήψεων καθοÏίζεται πεÏισσότεÏες από μία φοÏές" + +#: command.c:2836 +#, c-format +msgid "\\watch: incorrect iteration count \"%s\"" +msgstr "\\watch: εσφαλμένος αÏιθμός επαναλήψεων «%s»" + +#: command.c:2843 +#, c-format +msgid "\\watch: unrecognized parameter \"%s\"" +msgstr "\\watch: μη αναγνωÏίσιμη παÏάμετÏος «%s»" + +#: command.c:3236 startup.c:243 startup.c:293 msgid "Password: " msgstr "Κωδικός Ï€Ïόσβασης: " -#: command.c:3112 startup.c:290 +#: command.c:3241 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Κωδικός Ï€Ïόσβασης για τον χÏήστη %s: " -#: command.c:3168 +#: command.c:3297 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "Îα μην οÏιστεί ξεχωÏιστά ο χÏήστης, ο κεντÏικός υπολογιστής, ή η θÏÏα όταν χÏησιμοποιείται μια συμβολοσειÏά σÏνδεσης" -#: command.c:3203 +#: command.c:3332 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "Δεν υπάÏχει σÏνδεση βάσης δεδομένων για την επαναχÏησιμοποίηση παÏαμέτÏων" -#: command.c:3511 +#: command.c:3638 #, c-format msgid "Previous connection kept" msgstr "ΚÏατήθηκε η Ï€ÏοηγοÏμενη σÏνδεση" -#: command.c:3517 +#: command.c:3644 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3573 +#: command.c:3700 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "" "ΤώÏα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» στη διεÏθυνση «%s» στη θÏÏα «%s».\n" "=\n" -#: command.c:3576 +#: command.c:3703 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "ΤώÏα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» μέσω του υποδεχέα «%s» στη θÏÏα «%s».\n" -#: command.c:3582 +#: command.c:3709 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "ΤώÏα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» στον κεντÏικό υπολογιστή «%s» (διεÏθυνση «%s») στη θÏÏα «%s».\n" -#: command.c:3585 +#: command.c:3712 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "ΤώÏα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s» στον κεντÏικό υπολογιστή «%s» στη θÏÏα «%s».\n" -#: command.c:3590 +#: command.c:3717 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "ΤώÏα είστε συνδεδεμένοι στη βάση δεδομένων «%s» ως χÏήστης «%s».\n" -#: command.c:3630 +#: command.c:3757 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, διακομιστής %s)\n" -#: command.c:3643 +#: command.c:3770 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -443,29 +463,29 @@ msgstr "" "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: %s κÏÏια έκδοση %s, %s κÏÏια έκδοση διακομιστή.\n" " ΟÏισμένες δυνατότητες psql ενδέχεται να μην λειτουÏγοÏν.\n" -#: command.c:3680 +#: command.c:3807 #, c-format msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" msgstr "SSL σÏνδεση (Ï€Ïωτόκολλο: %s, cipher: %s, συμπίεση: %s)\n" -#: command.c:3681 command.c:3682 +#: command.c:3808 command.c:3809 msgid "unknown" msgstr "άγνωστο" -#: command.c:3683 help.c:42 +#: command.c:3810 help.c:42 msgid "off" msgstr "κλειστό" -#: command.c:3683 help.c:42 +#: command.c:3810 help.c:42 msgid "on" msgstr "ανοικτό" -#: command.c:3697 +#: command.c:3824 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPI-κÏυπτογÏαφημένη σÏνδεση\n" -#: command.c:3717 +#: command.c:3844 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -476,271 +496,286 @@ msgstr "" " ΧαÏακτήÏες 8-bit δÏναται να μην λειτουÏγοÏν οÏθά. Δείτε την αναφοÏά στη σελίδα\n" " psql με τίτλο «Σημειώσεις για χÏήστες Windows» για πληÏοφοÏίες.\n" -#: command.c:3822 +#: command.c:3949 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "η μεταβλητή πεÏιβάλλοντος PSQL_EDITOR_LINENUMBER_ARG Ï€Ïέπει να έχει οÏιστεί για να οÏίσετε αÏιθμό σειÏάς" -#: command.c:3851 +#: command.c:3979 #, c-format msgid "could not start editor \"%s\"" msgstr "δεν μπόÏεσε να εκκινήσει τον editor «%s»" -#: command.c:3853 +#: command.c:3981 #, c-format msgid "could not start /bin/sh" msgstr "δεν μπόÏεσε να εκκινήσει το /bin/sh" -#: command.c:3903 +#: command.c:4031 #, c-format msgid "could not locate temporary directory: %s" msgstr "δεν ήταν δυνατός ο εντοπισμός του Ï€ÏοσωÏÎ¹Î½Î¿Ï ÎºÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï… %s" -#: command.c:3930 +#: command.c:4058 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "δεν ήταν δυνατό το άνοιγμα του Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου «%s»: %m" -#: command.c:4266 +#: command.c:4394 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: διφοÏοÏμενης συντόμευση «%s» ταιÏιάζει τόσο «%s» όσο «%s»" -#: command.c:4286 +#: command.c:4414 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset: επιτÏεπόμενες μοÏφές είναι aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:4305 +#: command.c:4433 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: επιτÏεπόμενες μοÏφές γÏαμμών είναι ascii, old-ascii, unicode" -#: command.c:4320 +#: command.c:4448 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: επιτÏεπόμενες μοÏφές Unicode border line είναι single, double" -#: command.c:4335 +#: command.c:4463 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: επιτÏεπόμενες μοÏφές Unicode column line είναι single, double" -#: command.c:4350 +#: command.c:4478 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: επιτÏεπόμενες μοÏφές Unicode header line είναι single, double" -#: command.c:4393 +#: command.c:4530 +#, c-format +msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width" +msgstr "\\pset: οι επιτÏεπόμενες τιμές xheader_width είναι «%s» (Ï€Ïοεπιλογή), «%s», «%s» ή ένας αÏιθμός που καθοÏίζει το ακÏιβές πλάτος" + +#: command.c:4547 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep Ï€Ïέπει να είναι ένας χαÏακτήÏας ενός-byte" -#: command.c:4398 +#: command.c:4552 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldsep δεν μποÏεί να είναι διπλά εισαγωγικά, νέα γÏαμμή, ή carriage return" -#: command.c:4535 command.c:4723 +#: command.c:4690 command.c:4891 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: άγνωστη επιλογή: %s" -#: command.c:4555 +#: command.c:4710 #, c-format msgid "Border style is %d.\n" msgstr "Border style είναι %d.\n" -#: command.c:4561 +#: command.c:4716 #, c-format msgid "Target width is unset.\n" msgstr "Target width δεν είναι οÏισμένο.\n" -#: command.c:4563 +#: command.c:4718 #, c-format msgid "Target width is %d.\n" msgstr "Target width είναι %d.\n" -#: command.c:4570 +#: command.c:4725 #, c-format msgid "Expanded display is on.\n" msgstr "Εκτεταμένη οθόνη είναι ενεÏγή.\n" -#: command.c:4572 +#: command.c:4727 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Εκτεταμένη οθόνη χÏησιμοποιείται αυτόματα.\n" -#: command.c:4574 +#: command.c:4729 #, c-format msgid "Expanded display is off.\n" msgstr "Εκτεταμένη οθόνη είναι ανενεÏγή.\n" -#: command.c:4580 +#: command.c:4736 command.c:4738 command.c:4740 +#, c-format +msgid "Expanded header width is \"%s\".\n" +msgstr "Το πλάτος της διευÏυμένης κεφαλίδας είναι «%s».\n" + +#: command.c:4742 +#, c-format +msgid "Expanded header width is %d.\n" +msgstr "Το πλάτος της διευÏυμένης κεφαλίδας είναι %d.\n" + +#: command.c:4748 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "ΔιαχωÏιστής πεδίων CSV είναι ο «%s».\n" -#: command.c:4588 command.c:4596 +#: command.c:4756 command.c:4764 #, c-format msgid "Field separator is zero byte.\n" msgstr "ΔιαχωÏιστής πεδίων είναι το μηδενικό byte\n" -#: command.c:4590 +#: command.c:4758 #, c-format msgid "Field separator is \"%s\".\n" msgstr "ΔιαχωÏιστής πεδίων είναι ο «%s».\n" -#: command.c:4603 +#: command.c:4771 #, c-format msgid "Default footer is on.\n" msgstr "ΠÏοκαθοÏισμένο υποσέλιδο είναι ενεÏγό.\n" -#: command.c:4605 +#: command.c:4773 #, c-format msgid "Default footer is off.\n" msgstr "ΠÏοκαθοÏισμένο υποσέλιδο είναι ανενεÏγό.\n" -#: command.c:4611 +#: command.c:4779 #, c-format msgid "Output format is %s.\n" msgstr "Η μοÏφή εξόδου είναι %s.\n" -#: command.c:4617 +#: command.c:4785 #, c-format msgid "Line style is %s.\n" msgstr "Η μοÏφή γÏαμμής είναι %s.\n" -#: command.c:4624 +#: command.c:4792 #, c-format msgid "Null display is \"%s\".\n" msgstr "Εμφάνιση Null είναι «%s».\n" -#: command.c:4632 +#: command.c:4800 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Η κατά εντοπιότητα διοÏθωμένη μοÏφή αÏιθμητικής εξόδου είναι ενεÏγή.\n" -#: command.c:4634 +#: command.c:4802 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Η κατά εντοπιότητα διοÏθωμένη μοÏφή αÏιθμητικής εξόδου είναι ανενεÏγή.\n" -#: command.c:4641 +#: command.c:4809 #, c-format msgid "Pager is used for long output.\n" msgstr "ΧÏησιμοποιείται Pager για μεγάλη έξοδο.\n" -#: command.c:4643 +#: command.c:4811 #, c-format msgid "Pager is always used.\n" msgstr "ΧÏησιμοποιείται Pager συνέχεια.\n" -#: command.c:4645 +#: command.c:4813 #, c-format msgid "Pager usage is off.\n" msgstr "Η χÏήση Pager είναι ανενεÏγή.\n" -#: command.c:4651 +#: command.c:4819 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "Ο Pager δεν θα χÏησιμοποιηθεί για λιγότεÏο από %d γÏαμμή.\n" msgstr[1] "Ο Pager δεν θα χÏησιμοποιηθεί για λιγότεÏες από %d γÏαμμές.\n" -#: command.c:4661 command.c:4671 +#: command.c:4829 command.c:4839 #, c-format msgid "Record separator is zero byte.\n" msgstr "ΔιαχωÏιστής εγγÏαφών είναι το μηδενικό byte\n" -#: command.c:4663 +#: command.c:4831 #, c-format msgid "Record separator is .\n" msgstr "ΔιαχωÏιστής εγγÏαφών είναι ο .\n" -#: command.c:4665 +#: command.c:4833 #, c-format msgid "Record separator is \"%s\".\n" msgstr "ΔιαχωÏιστής εγγÏαφών είναι ο/η «%s».\n" -#: command.c:4678 +#: command.c:4846 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Τα χαÏακτηÏιστικά του πίνακα είναι «%s».\n" -#: command.c:4681 +#: command.c:4849 #, c-format msgid "Table attributes unset.\n" msgstr "ΧαÏακτηÏιστικά πίνακα μη οÏισμένα.\n" -#: command.c:4688 +#: command.c:4856 #, c-format msgid "Title is \"%s\".\n" msgstr "Ο τίτλος είναι «%s».\n" -#: command.c:4690 +#: command.c:4858 #, c-format msgid "Title is unset.\n" msgstr "Ο τίτλος δεν είναι οÏισμένος.\n" -#: command.c:4697 +#: command.c:4865 #, c-format msgid "Tuples only is on.\n" msgstr "ΕνεÏγή όψη μόνο πλειάδων.\n" -#: command.c:4699 +#: command.c:4867 #, c-format msgid "Tuples only is off.\n" msgstr "ΑνενεÏγή όψη μόνο πλειάδων.\n" -#: command.c:4705 +#: command.c:4873 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Το στυλ πεÏιγÏάμματος γÏαμμής Unicode είναι «%s».\n" -#: command.c:4711 +#: command.c:4879 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Το στυλ πεÏιγÏάμματος στήλης Unicode είναι «%s».\n" -#: command.c:4717 +#: command.c:4885 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Το στυλ πεÏιγÏάμματος γÏαμμής κεφαλίδας Unicode είναι «%s».\n" -#: command.c:4950 +#: command.c:5134 #, c-format msgid "\\!: failed" msgstr "\\!: απέτυχε" -#: command.c:4984 +#: command.c:5168 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch δεν μποÏεί να χÏησιμοποιηθεί με κενή εÏώτηση" -#: command.c:5016 +#: command.c:5200 #, c-format msgid "could not set timer: %m" msgstr "δεν ήταν δυνατή η ÏÏθμιση του χÏονομετÏητή: %m" -#: command.c:5078 +#: command.c:5269 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (κάθε %gs)\n" -#: command.c:5081 +#: command.c:5272 #, c-format msgid "%s (every %gs)\n" msgstr "" "%s (κάθε %gs)\n" "\n" -#: command.c:5142 +#: command.c:5340 #, c-format msgid "could not wait for signals: %m" msgstr "δεν ήταν δυνατή η αναμονή για σήματα: %m" -#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063 +#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083 #, c-format msgid "" "********* QUERY **********\n" @@ -753,107 +788,107 @@ msgstr "" "**************************\n" "\n" -#: command.c:5386 +#: command.c:5584 #, c-format msgid "\"%s.%s\" is not a view" msgstr "«%s.%s» δεν είναι μία όψη" -#: command.c:5402 +#: command.c:5600 #, c-format msgid "could not parse reloptions array" msgstr "δεν ήταν δυνατή η ανάλυση συστυχίας reloptions" -#: common.c:166 +#: common.c:167 #, c-format msgid "cannot escape without active connection" msgstr "δεν είναι δυνατή η διαφυγή χωÏίς ενεÏγή σÏνδεση" -#: common.c:207 +#: common.c:208 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "παÏάμετÏος της εντολής κελÏφους πεÏιέχει μια νέα γÏαμμή ή μια επιστÏοφή μεταφοÏάς: «%s»" -#: common.c:311 +#: common.c:312 #, c-format msgid "connection to server was lost" msgstr "χάθηκε η σÏνδεση στον διακομιστή" -#: common.c:315 +#: common.c:316 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "Χάθηκε η σÏνδεση στον διακομιστή. ΠÏοσπάθεια επαναφοÏάς: " -#: common.c:320 +#: common.c:321 #, c-format msgid "Failed.\n" msgstr "Απέτυχε.\n" -#: common.c:337 +#: common.c:338 #, c-format msgid "Succeeded.\n" msgstr "Πέτυχε.\n" -#: common.c:389 common.c:1001 +#: common.c:390 common.c:1021 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "μη αναμενόμενο PQresultStatus: %d" -#: common.c:511 +#: common.c:531 #, c-format msgid "Time: %.3f ms\n" msgstr "ΧÏόνος: %.3f ms\n" -#: common.c:526 +#: common.c:546 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "ΧÏόνος: %.3f ms (%02d:%06.3f)\n" -#: common.c:535 +#: common.c:555 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "ΧÏόνος: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:542 +#: common.c:562 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "ΧÏόνος: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:566 common.c:623 common.c:1034 describe.c:6135 +#: common.c:586 common.c:643 common.c:1054 describe.c:6214 #, c-format msgid "You are currently not connected to a database." msgstr "Αυτή τη στιγμή δεν είστε συνδεδεμένοι σε μία βάση δεδομένων." -#: common.c:654 +#: common.c:674 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "Ελήφθει ασÏγχÏονη ειδοποίηση «%s» με ωφέλιμο φοÏτίο «%s» από τη διαδικασία διακομιστή με %d PID.\n" -#: common.c:657 +#: common.c:677 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "Ελήφθει ασÏγχÏονη ειδοποίηση «%s» από τη διαδικασία διακομιστή με %d PID.\n" -#: common.c:688 +#: common.c:708 #, c-format msgid "could not print result table: %m" msgstr "δεν μπόÏεσε να εκτυπώσει τον πίνακα αποτελέσματος: %m" -#: common.c:708 +#: common.c:728 #, c-format msgid "no rows returned for \\gset" msgstr "δεν επιστÏάφηκαν σειÏές για \\gset" -#: common.c:713 +#: common.c:733 #, c-format msgid "more than one row returned for \\gset" msgstr "πεÏισσότεÏες από μία γÏαμμές επιστÏάφηκαν για \\gset" -#: common.c:731 +#: common.c:751 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "αγνοείται η Ï€Ïοσπάθεια να τεθεί \\gset στην ειδικά διαμοÏφωμένη μεταβλητή «%s»" -#: common.c:1043 +#: common.c:1063 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" @@ -864,28 +899,28 @@ msgstr "" "%s\n" "***(πατήστε return για να συνεχίσετε ή εισάγετε x και return για να ακυÏώσετε)********************\n" -#: common.c:1126 +#: common.c:1146 #, c-format msgid "STATEMENT: %s" msgstr "ΔΗΛΩΣΗ: %s" -#: common.c:1162 +#: common.c:1182 #, c-format msgid "unexpected transaction status (%d)" msgstr "μη αναμενόμενη κατάσταση συναλλαγής: %d" -#: common.c:1303 describe.c:2020 +#: common.c:1335 describe.c:2026 msgid "Column" msgstr "Στήλη" -#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 -#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 -#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 -#: describe.c:5767 +#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046 +#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027 +#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571 +#: describe.c:5846 msgid "Type" msgstr "ΤÏπος" -#: common.c:1353 +#: common.c:1385 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "Η εντολή δεν έχει αποτέλεσμα, η το αποτέλεσμα δεν έχει στήλες.\n" @@ -905,46 +940,41 @@ msgstr "\\copy: σφάλμα ανάλυσης σε «%s»" msgid "\\copy: parse error at end of line" msgstr "\\copy: σφάλμα ανάλυσης στο τέλος γÏαμμής" -#: copy.c:328 +#: copy.c:326 #, c-format msgid "could not execute command \"%s\": %m" msgstr "δεν ήταν δυνατή η εκτέλεση της εντολής «%s»: %m" -#: copy.c:344 +#: copy.c:342 #, c-format msgid "could not stat file \"%s\": %m" msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αÏχείο «%s»: %m" -#: copy.c:348 +#: copy.c:346 #, c-format msgid "%s: cannot copy from/to a directory" msgstr "%s: δεν μποÏεί να αντιγÏάψει από/Ï€Ïος κατάλογο" -#: copy.c:385 +#: copy.c:383 #, c-format msgid "could not close pipe to external command: %m" msgstr "δεν ήταν δυνατό το κλείσιμο της διοχέτευσης σε εξωτεÏική εντολή: %m" -#: copy.c:390 -#, c-format -msgid "%s: %s" -msgstr "%s: %s" - -#: copy.c:453 copy.c:463 +#: copy.c:451 copy.c:461 #, c-format msgid "could not write COPY data: %m" msgstr "δεν ήταν δυνατή η εγγÏαφή δεδομένων COPY: %m" -#: copy.c:469 +#: copy.c:467 #, c-format msgid "COPY data transfer failed: %s" msgstr "ΜεταφοÏά δεδομένων μέσω COPY απέτυχε: %s" -#: copy.c:530 +#: copy.c:528 msgid "canceled by user" msgstr "ακυÏώθηκε από τον χÏήστη" -#: copy.c:541 +#: copy.c:539 msgid "" "Enter data to be copied followed by a newline.\n" "End with a backslash and a period on a line by itself, or an EOF signal." @@ -952,11 +982,11 @@ msgstr "" "Εισαγάγετε τα δεδομένα που θα αντιγÏαφοÏν ακολουθοÏμενα από νέα γÏαμμή.\n" "ΤεÏματίστε με μια ανάστÏοφη κάθετο και μια τελεία σε μια ξεχωÏιστή γÏαμμή, ή ένα σήμα EOF." -#: copy.c:684 +#: copy.c:682 msgid "aborted because of read failure" msgstr "ματαιώθηκε λόγω σφάλματος κατά την ανάγνωση" -#: copy.c:718 +#: copy.c:716 msgid "trying to exit copy mode" msgstr "Ï€Ïοσπαθεί να τεÏματίσει τη λειτουÏγία αντιγÏαφής" @@ -1005,21 +1035,21 @@ msgstr "\\crosstabview: αμφίσημο όνομα στήλης: «%s»" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: όνομα στήλης δεν βÏέθηκε: «%s»" -#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 -#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 -#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 -#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 -#: describe.c:5477 describe.c:5881 describe.c:5959 +#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038 +#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157 +#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932 +#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499 +#: describe.c:5556 describe.c:5960 describe.c:6038 msgid "Schema" msgstr "Σχήμα" -#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 -#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 -#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 -#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 -#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 -#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 -#: describe.c:5957 describe.c:6186 describe.c:6494 +#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631 +#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265 +#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408 +#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933 +#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489 +#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827 +#: describe.c:6036 describe.c:6265 describe.c:6573 msgid "Name" msgstr "Όνομα" @@ -1031,14 +1061,14 @@ msgstr "ΤÏπος δεδομένων αποτελεσμάτων" msgid "Argument data types" msgstr "ΤÏπος δεδομένων παÏαμέτÏων" -#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 -#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 -#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 -#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 -#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 -#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 -#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 -#: describe.c:5960 describe.c:6992 +#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418 +#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047 +#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347 +#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844 +#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327 +#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501 +#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974 +#: describe.c:6039 describe.c:7093 msgid "Description" msgstr "ΠεÏιγÏαφή" @@ -1055,11 +1085,11 @@ msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζε msgid "Index" msgstr "ΕυÏετήÏιο" -#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 +#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961 msgid "Table" msgstr "Πίνακας" -#: describe.c:177 describe.c:5679 +#: describe.c:177 describe.c:5758 msgid "Handler" msgstr "ΔιαχειÏιστής" @@ -1067,11 +1097,11 @@ msgstr "ΔιαχειÏιστής" msgid "List of access methods" msgstr "Λίστα μεθόδων Ï€Ïόσβασης" -#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 -#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 -#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 -#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 -#: describe.c:6980 +#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188 +#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655 +#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266 +#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819 +#: describe.c:7081 msgid "Owner" msgstr "Ιδιοκτήτης" @@ -1079,11 +1109,11 @@ msgstr "Ιδιοκτήτης" msgid "Location" msgstr "Τοποθεσία" -#: describe.c:241 describe.c:3509 +#: describe.c:241 describe.c:3517 describe.c:3858 msgid "Options" msgstr "Επιλογές" -#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 +#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001 msgid "Size" msgstr "Μέγεθος" @@ -1118,7 +1148,7 @@ msgstr "proc" msgid "func" msgstr "func" -#: describe.c:374 describe.c:1390 +#: describe.c:374 describe.c:1397 msgid "trigger" msgstr "trigger" @@ -1170,568 +1200,564 @@ msgstr "Ασφάλεια" msgid "Language" msgstr "Γλώσσα" -#: describe.c:416 describe.c:420 -msgid "Source code" -msgstr "Πηγαίος κώδικας" +#: describe.c:415 describe.c:652 +msgid "Internal name" +msgstr "ΕσωτεÏική ονομασία" -#: describe.c:594 +#: describe.c:589 msgid "List of functions" msgstr "Λίστα συναÏτήσεων" -#: describe.c:657 -msgid "Internal name" -msgstr "ΕσωτεÏική ονομασία" - -#: describe.c:659 +#: describe.c:654 msgid "Elements" msgstr "Στοιχεία" -#: describe.c:711 +#: describe.c:706 msgid "List of data types" msgstr "Λίστα Ï„Ïπων δεδομένων" -#: describe.c:814 +#: describe.c:809 msgid "Left arg type" msgstr "ΤÏπος αÏιστεÏής παÏαμέτÏου" -#: describe.c:815 +#: describe.c:810 msgid "Right arg type" msgstr "ΤÏπος δεξιάς παÏαμέτÏου" -#: describe.c:816 +#: describe.c:811 msgid "Result type" msgstr "ΤÏπος αποτελέσματος" -#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 -#: describe.c:6909 describe.c:6913 +#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326 +#: describe.c:7010 describe.c:7014 msgid "Function" msgstr "ΣυνάÏτηση" -#: describe.c:902 +#: describe.c:897 msgid "List of operators" msgstr "Λίστα operators" -#: describe.c:938 +#: describe.c:932 msgid "Encoding" msgstr "Κωδικοποίηση" -#: describe.c:939 describe.c:4868 +#: describe.c:936 describe.c:940 +msgid "Locale Provider" +msgstr "ΠάÏοχος εντοπιότητας" + +#: describe.c:944 describe.c:4947 msgid "Collate" msgstr "ΣÏνθεση" -#: describe.c:940 describe.c:4869 +#: describe.c:945 describe.c:4948 msgid "Ctype" msgstr "Ctype" -#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 +#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957 msgid "ICU Locale" msgstr "ICU εντοπιότητα" -#: describe.c:946 describe.c:952 -msgid "Locale Provider" -msgstr "ΠάÏοχος εντοπιότητας" +#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966 +msgid "ICU Rules" +msgstr "Κανόνες ICU" -#: describe.c:964 +#: describe.c:973 msgid "Tablespace" msgstr "Tablespace" -#: describe.c:990 +#: describe.c:999 msgid "List of databases" msgstr "Λίστα βάσεων δεδομένων" -#: describe.c:1031 describe.c:1184 describe.c:3882 +#: describe.c:1040 describe.c:1191 describe.c:3949 msgid "table" msgstr "πίνακας" -#: describe.c:1032 describe.c:3883 +#: describe.c:1041 describe.c:3950 msgid "view" msgstr "όψη" -#: describe.c:1033 describe.c:3884 +#: describe.c:1042 describe.c:3951 msgid "materialized view" msgstr "υλοποιημένη όψη" -#: describe.c:1034 describe.c:1186 describe.c:3886 +#: describe.c:1043 describe.c:1193 describe.c:3953 msgid "sequence" msgstr "ακολουθία" -#: describe.c:1035 describe.c:3888 +#: describe.c:1044 describe.c:3955 msgid "foreign table" msgstr "ξένος πίνακας" -#: describe.c:1036 describe.c:3889 describe.c:4101 +#: describe.c:1045 describe.c:3956 describe.c:4168 msgid "partitioned table" msgstr "κατατμημένος πίνακας" -#: describe.c:1047 +#: describe.c:1056 msgid "Column privileges" msgstr "ΠÏονόμια στήλης" -#: describe.c:1078 describe.c:1112 +#: describe.c:1087 describe.c:1121 msgid "Policies" msgstr "Πολιτικές" -#: describe.c:1143 describe.c:4510 describe.c:6577 +#: describe.c:1150 describe.c:4577 describe.c:6678 msgid "Access privileges" msgstr "ΠÏονόμια Ï€Ïόσβασης" -#: describe.c:1188 +#: describe.c:1195 msgid "function" msgstr "συνάÏτηση" -#: describe.c:1190 +#: describe.c:1197 msgid "type" msgstr "Ï„Ïπος" -#: describe.c:1192 +#: describe.c:1199 msgid "schema" msgstr "σχήμα" -#: describe.c:1215 +#: describe.c:1222 msgid "Default access privileges" msgstr "ΠÏοεπιλεγμένες επιλογές δικαιωμάτων" -#: describe.c:1259 +#: describe.c:1266 msgid "Object" msgstr "Ατνικείμενο" -#: describe.c:1273 +#: describe.c:1280 msgid "table constraint" msgstr "πεÏιοÏισμός πίνακα" -#: describe.c:1297 +#: describe.c:1304 msgid "domain constraint" msgstr "πεÏιοÏισμός πεδίου" -#: describe.c:1321 +#: describe.c:1328 msgid "operator class" msgstr "κλάση χειÏιστή" -#: describe.c:1345 +#: describe.c:1352 msgid "operator family" msgstr "οικογένεια χειÏιστή" -#: describe.c:1368 +#: describe.c:1375 msgid "rule" msgstr "πεÏιγÏαφή" -#: describe.c:1414 +#: describe.c:1421 msgid "Object descriptions" msgstr "ΠεÏιγÏαφές αντικειμένου" -#: describe.c:1479 describe.c:4007 +#: describe.c:1486 describe.c:4074 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Δεν βÏέθηκε καμία σχέση με όνομα «%s»." -#: describe.c:1482 describe.c:4010 +#: describe.c:1489 describe.c:4077 #, c-format msgid "Did not find any relations." msgstr "Δεν βÏέθηκαν καθόλου σχέσεις." -#: describe.c:1678 +#: describe.c:1685 #, c-format msgid "Did not find any relation with OID %s." msgstr "Δεν βÏέθηκαν καθόλου σχέσεις με OID %s." -#: describe.c:1726 describe.c:1750 +#: describe.c:1733 describe.c:1757 msgid "Start" msgstr "Εκκίνηση" -#: describe.c:1727 describe.c:1751 +#: describe.c:1734 describe.c:1758 msgid "Minimum" msgstr "Ελάχιστο" -#: describe.c:1728 describe.c:1752 +#: describe.c:1735 describe.c:1759 msgid "Maximum" msgstr "Μέγιστο" -#: describe.c:1729 describe.c:1753 +#: describe.c:1736 describe.c:1760 msgid "Increment" msgstr "ΕπαÏξηση" -#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 -#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 +#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493 +#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721 msgid "yes" msgstr "ναι" -#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 -#: describe.c:4768 describe.c:4892 describe.c:6621 +#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493 +#: describe.c:4835 describe.c:4971 describe.c:6722 msgid "no" msgstr "όχι" -#: describe.c:1732 describe.c:1756 +#: describe.c:1739 describe.c:1763 msgid "Cycles?" msgstr "ΚÏκλοι;" -#: describe.c:1733 describe.c:1757 +#: describe.c:1740 describe.c:1764 msgid "Cache" msgstr "ΠÏοσωÏινή μνήμη" -#: describe.c:1798 +#: describe.c:1805 #, c-format msgid "Owned by: %s" msgstr "Ανήκει σε: %s" -#: describe.c:1802 +#: describe.c:1809 #, c-format msgid "Sequence for identity column: %s" msgstr "Ακολουθία για τη στήλη ταυτότητας: %s" -#: describe.c:1810 +#: describe.c:1817 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "ΑκαταχώÏητη ακολουθία «%s.%s»" -#: describe.c:1813 +#: describe.c:1820 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Ακολουθία «%s.%s»" -#: describe.c:1957 +#: describe.c:1963 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "ΑκαταχώÏητος πίνακας «%s.%s»" -#: describe.c:1960 +#: describe.c:1966 #, c-format msgid "Table \"%s.%s\"" msgstr "Πίνακας «%s.%s»" -#: describe.c:1964 +#: describe.c:1970 #, c-format msgid "View \"%s.%s\"" msgstr "Όψη «%s.%s»" -#: describe.c:1969 +#: describe.c:1975 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "ΑκαταχώÏητη υλοποιημένη όψη «%s.%s»" -#: describe.c:1972 +#: describe.c:1978 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Υλοποιημένη όψη «%s.%s»" -#: describe.c:1977 +#: describe.c:1983 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "ΑκαταχώÏητο ευÏετήÏιο «%s.%s»" -#: describe.c:1980 +#: describe.c:1986 #, c-format msgid "Index \"%s.%s\"" msgstr "ΕυÏετήÏιο «%s.%s»" -#: describe.c:1985 +#: describe.c:1991 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "ΑκαταχώÏητο κατατετμημένο ευÏετήÏιο «%s.%s»" -#: describe.c:1988 +#: describe.c:1994 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Κατατετμημένο ευÏετήÏιο «%s.%s»" -#: describe.c:1992 +#: describe.c:1998 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST πίνακας «%s.%s»" -#: describe.c:1996 +#: describe.c:2002 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Συνθετικός Ï„Ïπος «%s.%s»" -#: describe.c:2000 +#: describe.c:2006 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Ξενικός πίνακας «%s.%s»" -#: describe.c:2005 +#: describe.c:2011 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "ΑκαταχώÏητος κατατετμημένος πίνακας «%s.%s»" -#: describe.c:2008 +#: describe.c:2014 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Κατατετμημένος πίνακας «%s.%s»" -#: describe.c:2024 describe.c:4343 +#: describe.c:2030 describe.c:4410 msgid "Collation" msgstr "ΣÏνθεση" -#: describe.c:2025 describe.c:4344 +#: describe.c:2031 describe.c:4411 msgid "Nullable" msgstr "Nullable" -#: describe.c:2026 describe.c:4345 +#: describe.c:2032 describe.c:4412 msgid "Default" msgstr "ΠÏοκαθοÏισμένο" -#: describe.c:2029 +#: describe.c:2035 msgid "Key?" msgstr "Κλειδί;" -#: describe.c:2031 describe.c:4665 describe.c:4676 +#: describe.c:2037 describe.c:4732 describe.c:4743 msgid "Definition" msgstr "ΟÏισμός" -#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 -#: describe.c:5894 +#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914 +#: describe.c:5973 msgid "FDW options" msgstr "Επιλογές FDW" -#: describe.c:2035 +#: describe.c:2041 msgid "Storage" msgstr "Αποθήκευση" -#: describe.c:2037 +#: describe.c:2043 msgid "Compression" msgstr "Συμπίεση" -#: describe.c:2039 +#: describe.c:2045 msgid "Stats target" msgstr "Στόχος στατιστικών" -#: describe.c:2175 +#: describe.c:2181 #, c-format msgid "Partition of: %s %s%s" msgstr "Κατάτμηση του: %s %s%s" -#: describe.c:2188 +#: describe.c:2194 msgid "No partition constraint" msgstr "Κανένας πεÏιοÏισμός κατάτμησης" -#: describe.c:2190 +#: describe.c:2196 #, c-format msgid "Partition constraint: %s" msgstr "ΠεÏιοÏισμός κατάτμησης: %s" -#: describe.c:2214 +#: describe.c:2220 #, c-format msgid "Partition key: %s" msgstr "Κλειδί κατάτμησης: %s" -#: describe.c:2240 +#: describe.c:2246 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Ιδιοκτήτης πίνακα «%s.%s»" -#: describe.c:2309 +#: describe.c:2315 msgid "primary key, " msgstr "κÏÏιο κλειδί, " -#: describe.c:2312 +#: describe.c:2318 msgid "unique" msgstr "μοναδικό" -#: describe.c:2314 +#: describe.c:2320 msgid " nulls not distinct" msgstr " nulls μη διακÏιτά" -#: describe.c:2315 +#: describe.c:2321 msgid ", " msgstr ", " -#: describe.c:2322 +#: describe.c:2328 #, c-format msgid "for table \"%s.%s\"" msgstr "για πίνακα «%s.%s»" -#: describe.c:2326 +#: describe.c:2332 #, c-format msgid ", predicate (%s)" msgstr ", Ï€Ïόβλεψη (%s)" -#: describe.c:2329 +#: describe.c:2335 msgid ", clustered" msgstr ", συσταδοποιημένο" -#: describe.c:2332 +#: describe.c:2338 msgid ", invalid" msgstr ", άκυÏο" -#: describe.c:2335 +#: describe.c:2341 msgid ", deferrable" msgstr ", αναβαλλόμενο" -#: describe.c:2338 +#: describe.c:2344 msgid ", initially deferred" msgstr ", αÏχικά αναβαλλόμενο" -#: describe.c:2341 +#: describe.c:2347 msgid ", replica identity" msgstr ", ταυτότητα πανομοιόματος" -#: describe.c:2395 +#: describe.c:2401 msgid "Indexes:" msgstr "ΕυÏετήÏια:" -#: describe.c:2478 +#: describe.c:2484 msgid "Check constraints:" msgstr "ΠεÏιοÏισμοί ελέγχου:" -#: describe.c:2546 +#: describe.c:2552 msgid "Foreign-key constraints:" msgstr "ΠεÏιοÏισμοί ξενικών κλειδιών:" -#: describe.c:2609 +#: describe.c:2615 msgid "Referenced by:" msgstr "ΑναφέÏεται από:" -#: describe.c:2659 +#: describe.c:2665 msgid "Policies:" msgstr "Πολιτικές:" -#: describe.c:2662 +#: describe.c:2668 msgid "Policies (forced row security enabled):" msgstr "Πολιτικές (ενεÏγοποιημένη επιβολή ασφάλειας γÏαμμών):" -#: describe.c:2665 +#: describe.c:2671 msgid "Policies (row security enabled): (none)" msgstr "Πολιτικές (ενεÏγοποιημένη ασφάλεια γÏαμμών): (καμία)" -#: describe.c:2668 +#: describe.c:2674 msgid "Policies (forced row security enabled): (none)" msgstr "Πολιτικές (ενεÏγοποιημένη επιβολή ασφάλειας γÏαμμών): (καμία)" -#: describe.c:2671 +#: describe.c:2677 msgid "Policies (row security disabled):" msgstr "Πολιτικές (απενεÏγοποιημένη ασφάλεια γÏαμμών):" -#: describe.c:2731 describe.c:2835 +#: describe.c:2737 describe.c:2841 msgid "Statistics objects:" msgstr "Αντικείμενα στατιστικών:" -#: describe.c:2937 describe.c:3090 +#: describe.c:2943 describe.c:3096 msgid "Rules:" msgstr "Κανόνες:" -#: describe.c:2940 +#: describe.c:2946 msgid "Disabled rules:" msgstr "ΑπενεÏγοποιημένοι κανόνες:" -#: describe.c:2943 +#: describe.c:2949 msgid "Rules firing always:" msgstr "Κανόνες πάντα σε χÏήση:" -#: describe.c:2946 +#: describe.c:2952 msgid "Rules firing on replica only:" msgstr "Κανόνες σε χÏήση μόνο στο ομοίωμα:" -#: describe.c:3025 describe.c:5030 +#: describe.c:3031 describe.c:5109 msgid "Publications:" msgstr "ΔημοσιεÏσεις:" -#: describe.c:3073 +#: describe.c:3079 msgid "View definition:" msgstr "ΟÏισμός όψης:" -#: describe.c:3236 +#: describe.c:3242 msgid "Triggers:" msgstr "Triggers:" -#: describe.c:3239 +#: describe.c:3245 msgid "Disabled user triggers:" msgstr "ΑπενεÏγοποιημένες triggers χÏήστη:" -#: describe.c:3242 +#: describe.c:3248 msgid "Disabled internal triggers:" msgstr "ΑπενεÏγοποιημένες εσωτεÏικές triggers:" -#: describe.c:3245 +#: describe.c:3251 msgid "Triggers firing always:" msgstr "Triggers πάντα σε χÏήση:" -#: describe.c:3248 +#: describe.c:3254 msgid "Triggers firing on replica only:" msgstr "Triggers σε χÏήση μόνο στο ομοίωμα:" -#: describe.c:3319 +#: describe.c:3325 #, c-format msgid "Server: %s" msgstr "Διακομιστής: %s" -#: describe.c:3327 +#: describe.c:3333 #, c-format msgid "FDW options: (%s)" msgstr "FDW επιλογές: (%s)" -#: describe.c:3348 +#: describe.c:3354 msgid "Inherits" msgstr "ΚληÏονομεί" -#: describe.c:3413 +#: describe.c:3419 #, c-format msgid "Number of partitions: %d" msgstr "ΑÏιθμός κατατμήσεων: %d" -#: describe.c:3422 +#: describe.c:3428 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "ΑÏιθμός κατατμήσεων: %d (ΧÏησιμοποιείστε \\d+ για να τους απαÏιθμήσετε.)" -#: describe.c:3424 +#: describe.c:3430 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "ΑÏιθμός απογονικών πινάκων: %d (ΧÏησιμοποιείστε \\d+ για να τους απαÏιθμήσετε.)" -#: describe.c:3431 +#: describe.c:3437 msgid "Child tables" msgstr "Απογονικοί πίνακες" -#: describe.c:3431 +#: describe.c:3437 msgid "Partitions" msgstr "Κατατμήσεις" -#: describe.c:3462 +#: describe.c:3470 #, c-format msgid "Typed table of type: %s" msgstr "Τυποποιημένος πίνακας Ï„Ïπου: %s" -#: describe.c:3478 +#: describe.c:3486 msgid "Replica Identity" msgstr "Ταυτότητα Ομοιόματος" -#: describe.c:3491 +#: describe.c:3499 msgid "Has OIDs: yes" msgstr "Έχει OIDs: ναι" -#: describe.c:3500 +#: describe.c:3508 #, c-format msgid "Access method: %s" msgstr "Μέθοδος Ï€Ïόσβασης: %s" -#: describe.c:3579 +#: describe.c:3585 #, c-format msgid "Tablespace: \"%s\"" msgstr "ΧώÏος πινάκα: «%s»" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3591 +#: describe.c:3597 #, c-format msgid ", tablespace \"%s\"" msgstr ", χώÏος πίνακα «%s»" -#: describe.c:3668 +#: describe.c:3670 msgid "List of roles" msgstr "Λίστα Ïόλων" -#: describe.c:3670 +#: describe.c:3672 describe.c:3841 msgid "Role name" msgstr "Όνομα Ïόλου" -#: describe.c:3671 +#: describe.c:3673 msgid "Attributes" msgstr "ΧαÏακτηÏιστικά" -#: describe.c:3673 -msgid "Member of" -msgstr "Μέλος του" - #: describe.c:3684 msgid "Superuser" msgstr "ΥπεÏχÏήστης" @@ -1775,383 +1801,395 @@ msgstr[1] "%d συνδέσεις" msgid "Password valid until " msgstr "Κωδικός Ï€Ïόσβασης ενεÏγός μέχÏι " -#: describe.c:3777 +#: describe.c:3775 msgid "Role" msgstr "Ρόλος" -#: describe.c:3778 +#: describe.c:3776 msgid "Database" msgstr "Βάση δεδομένων" -#: describe.c:3779 +#: describe.c:3777 msgid "Settings" msgstr "Ρυθμίσεις" -#: describe.c:3803 +#: describe.c:3801 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Δεν βÏέθηκαν Ïυθμίσεις για το Ïόλο «%s» και τη βάση δεδομένων «%s»." -#: describe.c:3806 +#: describe.c:3804 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Δεν βÏέθηκαν Ïυθμίσεις για το Ïόλο «%s»." -#: describe.c:3809 +#: describe.c:3807 #, c-format msgid "Did not find any settings." msgstr "Δεν βÏέθηκαν Ïυθμίσεις." -#: describe.c:3814 +#: describe.c:3812 msgid "List of settings" msgstr "Λίστα Ïυθμίσεων" -#: describe.c:3885 +#: describe.c:3842 +msgid "Member of" +msgstr "Μέλος του" + +#: describe.c:3859 +msgid "Grantor" +msgstr "ΧοÏηγός" + +#: describe.c:3886 +msgid "List of role grants" +msgstr "Λίστα χοÏηγιών Ïόλων" + +#: describe.c:3952 msgid "index" msgstr "ευÏετήÏιο" -#: describe.c:3887 +#: describe.c:3954 msgid "TOAST table" msgstr "TOAST πίνακας" -#: describe.c:3890 describe.c:4102 +#: describe.c:3957 describe.c:4169 msgid "partitioned index" msgstr "κατατετμημένο ευÏετήÏιο" -#: describe.c:3910 +#: describe.c:3977 msgid "permanent" msgstr "μόνιμο" -#: describe.c:3911 +#: describe.c:3978 msgid "temporary" msgstr "Ï€ÏοσωÏινό" -#: describe.c:3912 +#: describe.c:3979 msgid "unlogged" msgstr "ακαταχώÏητο" -#: describe.c:3913 +#: describe.c:3980 msgid "Persistence" msgstr "ΔιάÏκεια" -#: describe.c:3929 +#: describe.c:3996 msgid "Access method" msgstr "Μέθοδος Ï€Ïόσβασης" -#: describe.c:4015 +#: describe.c:4082 msgid "List of relations" msgstr "Λίστα σχέσεων" -#: describe.c:4063 +#: describe.c:4130 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει την δηλωτική δημιουÏγία κατατμήσεων πίνακα." -#: describe.c:4074 +#: describe.c:4141 msgid "List of partitioned indexes" msgstr "Λίστα κατατμημένων ευÏετηÏίων" -#: describe.c:4076 +#: describe.c:4143 msgid "List of partitioned tables" msgstr "Λίστα κατατμημένων πινάκων" -#: describe.c:4080 +#: describe.c:4147 msgid "List of partitioned relations" msgstr "Λίστα κατατμημένων σχέσεων" -#: describe.c:4111 +#: describe.c:4178 msgid "Parent name" msgstr "Γονικό όνομα" -#: describe.c:4124 +#: describe.c:4191 msgid "Leaf partition size" msgstr "Μέγεθος φÏλλου κατάτμησης" -#: describe.c:4127 describe.c:4133 +#: describe.c:4194 describe.c:4200 msgid "Total size" msgstr "Συνολικό μέγεθος" -#: describe.c:4258 +#: describe.c:4325 msgid "Trusted" msgstr "Εμπιστευόμενο" -#: describe.c:4267 +#: describe.c:4334 msgid "Internal language" msgstr "ΕσωτεÏική γλώσσα" -#: describe.c:4268 +#: describe.c:4335 msgid "Call handler" msgstr "ΠÏόγÏαμμα χειÏÎ¹ÏƒÎ¼Î¿Ï ÎºÎ»Î®ÏƒÎµÏ‰Î½" -#: describe.c:4269 describe.c:5680 +#: describe.c:4336 describe.c:5759 msgid "Validator" msgstr "Ελεκτής" -#: describe.c:4270 +#: describe.c:4337 msgid "Inline handler" msgstr "Ενσωματωμένος χειÏιστής" -#: describe.c:4305 +#: describe.c:4372 msgid "List of languages" msgstr "Λίστα γλωσσών" -#: describe.c:4346 +#: describe.c:4413 msgid "Check" msgstr "Έλεγχος" -#: describe.c:4390 +#: describe.c:4457 msgid "List of domains" msgstr "Λίστα πεδίων" -#: describe.c:4424 +#: describe.c:4491 msgid "Source" msgstr "Πηγή" -#: describe.c:4425 +#: describe.c:4492 msgid "Destination" msgstr "ΠÏοοÏισμός" -#: describe.c:4427 describe.c:6622 +#: describe.c:4494 describe.c:6723 msgid "Default?" msgstr "ΠÏοεπιλογή;" -#: describe.c:4469 +#: describe.c:4536 msgid "List of conversions" msgstr "Λίστα μετατÏοπών" -#: describe.c:4497 +#: describe.c:4564 msgid "Parameter" msgstr "ΠαÏάμετÏος" -#: describe.c:4498 +#: describe.c:4565 msgid "Value" msgstr "Τιμή" -#: describe.c:4505 +#: describe.c:4572 msgid "Context" msgstr "ΠεÏιεχόμενο" -#: describe.c:4538 +#: describe.c:4605 msgid "List of configuration parameters" msgstr "Λίστα Ïυθμίσεων παÏαμέτÏων" -#: describe.c:4540 +#: describe.c:4607 msgid "List of non-default configuration parameters" msgstr "Λίστα μη Ï€Ïοεπιλεγμένων Ïυθμίσεων παÏαμέτÏων" -#: describe.c:4567 +#: describe.c:4634 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει εναÏσματα συμβάντων." -#: describe.c:4587 +#: describe.c:4654 msgid "Event" msgstr "Συμβάν" -#: describe.c:4589 +#: describe.c:4656 msgid "enabled" msgstr "ενεγÏοποιημένο" -#: describe.c:4590 +#: describe.c:4657 msgid "replica" msgstr "ομοίωμα" -#: describe.c:4591 +#: describe.c:4658 msgid "always" msgstr "πάντα" -#: describe.c:4592 +#: describe.c:4659 msgid "disabled" msgstr "απενεÏγοποιημένο" -#: describe.c:4593 describe.c:6496 +#: describe.c:4660 describe.c:6575 msgid "Enabled" msgstr "ΕνεÏγοποιημένο" -#: describe.c:4595 +#: describe.c:4662 msgid "Tags" msgstr "Ετικέτες" -#: describe.c:4619 +#: describe.c:4686 msgid "List of event triggers" msgstr "Λίστα ενεÏγοποιήσεων συμβάντων" -#: describe.c:4646 +#: describe.c:4713 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει εκτεταμένες στατιστικές." -#: describe.c:4683 +#: describe.c:4750 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4684 +#: describe.c:4751 msgid "Dependencies" msgstr "Dependencies" -#: describe.c:4694 +#: describe.c:4761 msgid "MCV" msgstr "MCV" -#: describe.c:4718 +#: describe.c:4785 msgid "List of extended statistics" msgstr "Λίστα εκτεταμένων στατιστικών" -#: describe.c:4745 +#: describe.c:4812 msgid "Source type" msgstr "ΤÏπος πηγής" -#: describe.c:4746 +#: describe.c:4813 msgid "Target type" msgstr "ΤÏπος Ï€ÏοοÏιστμοÏ" -#: describe.c:4770 +#: describe.c:4837 msgid "in assignment" msgstr "σε ανάθεση" -#: describe.c:4772 +#: describe.c:4839 msgid "Implicit?" msgstr "Έμμεσα;" -#: describe.c:4831 +#: describe.c:4898 msgid "List of casts" msgstr "Λίστα casts" -#: describe.c:4883 describe.c:4887 +#: describe.c:4938 describe.c:4942 msgid "Provider" msgstr "ΠάÏοχος" -#: describe.c:4893 describe.c:4898 +#: describe.c:4972 describe.c:4977 msgid "Deterministic?" msgstr "ÎτετεÏμινιστικό;" -#: describe.c:4938 +#: describe.c:5017 msgid "List of collations" msgstr "Λίστα συÏÏαφών" -#: describe.c:5000 +#: describe.c:5079 msgid "List of schemas" msgstr "Λίστα σχημάτων" -#: describe.c:5117 +#: describe.c:5196 msgid "List of text search parsers" msgstr "Λίστα αναλυτών αναζήτησης κειμένου" -#: describe.c:5167 +#: describe.c:5246 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Δεν βÏήκε ανάλυση αναζήτησης κειμένου με το όνομα «%s»." -#: describe.c:5170 +#: describe.c:5249 #, c-format msgid "Did not find any text search parsers." msgstr "Δεν βÏήκε ανάλυση αναζήτησης κειμένου." -#: describe.c:5245 +#: describe.c:5324 msgid "Start parse" msgstr "Εκκίνηση ανάλυσης" -#: describe.c:5246 +#: describe.c:5325 msgid "Method" msgstr "Μέθοδος" -#: describe.c:5250 +#: describe.c:5329 msgid "Get next token" msgstr "Λήψη επόμενου ενδεικτικοÏ" -#: describe.c:5252 +#: describe.c:5331 msgid "End parse" msgstr "Τέλος ανάλυσης" -#: describe.c:5254 +#: describe.c:5333 msgid "Get headline" msgstr "Λήψη επικεφαλίδας" -#: describe.c:5256 +#: describe.c:5335 msgid "Get token types" msgstr "Λήψη Ï„Ïπων ενδεικτικών" -#: describe.c:5267 +#: describe.c:5346 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Αναλυτής αναζήτης κειμένου «%s.%s»" -#: describe.c:5270 +#: describe.c:5349 #, c-format msgid "Text search parser \"%s\"" msgstr "Αναλυτής αναζήτης κειμένου «%s»" -#: describe.c:5289 +#: describe.c:5368 msgid "Token name" msgstr "Ονομασία ενδεικτικοÏ" -#: describe.c:5303 +#: describe.c:5382 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "ΤÏποι ενδεικτικών αναλυτή «%s.%s»" -#: describe.c:5306 +#: describe.c:5385 #, c-format msgid "Token types for parser \"%s\"" msgstr "ΤÏποι ενδεικτικών αναλυτή «%s»" -#: describe.c:5350 +#: describe.c:5429 msgid "Template" msgstr "ΠÏότυπο" -#: describe.c:5351 +#: describe.c:5430 msgid "Init options" msgstr "Επιλογές εκκίνησης" -#: describe.c:5378 +#: describe.c:5457 msgid "List of text search dictionaries" msgstr "Λίστα λεξικών αναζήτησης κειμένου" -#: describe.c:5411 +#: describe.c:5490 msgid "Init" msgstr "Εκκίνηση" -#: describe.c:5412 +#: describe.c:5491 msgid "Lexize" msgstr "Lexize" -#: describe.c:5444 +#: describe.c:5523 msgid "List of text search templates" msgstr "Λίστα Ï€ÏοτÏπων αναζήτησης κειμένου" -#: describe.c:5499 +#: describe.c:5578 msgid "List of text search configurations" msgstr "Λίστα Ïυθμίσεων αναζήτησης κειμένου" -#: describe.c:5550 +#: describe.c:5629 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Δεν βÏέθηκαν Ïυθμίσεις αναζήτησης κειμένου με όνομα «%s»." -#: describe.c:5553 +#: describe.c:5632 #, c-format msgid "Did not find any text search configurations." msgstr "Δεν βÏέθηκαν Ïυθμίσεις αναζήτησης κειμένου." -#: describe.c:5619 +#: describe.c:5698 msgid "Token" msgstr "Ενδεικτικό" -#: describe.c:5620 +#: describe.c:5699 msgid "Dictionaries" msgstr "Λεξικά" -#: describe.c:5631 +#: describe.c:5710 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "ΡÏθμιση αναζήτησης κειμένου «%s.%s»" -#: describe.c:5634 +#: describe.c:5713 #, c-format msgid "Text search configuration \"%s\"" msgstr "ΡÏθμιση αναζήτησης κειμένου «%s»" -#: describe.c:5638 +#: describe.c:5717 #, c-format msgid "" "\n" @@ -2160,7 +2198,7 @@ msgstr "" "\n" "Αναλυτής: «%s.%s»" -#: describe.c:5641 +#: describe.c:5720 #, c-format msgid "" "\n" @@ -2169,249 +2207,261 @@ msgstr "" "\n" "Αναλυτής: «%s»" -#: describe.c:5722 +#: describe.c:5801 msgid "List of foreign-data wrappers" msgstr "Λίστα πεÏιτÏλιξης ξένων δεδομένων" -#: describe.c:5750 +#: describe.c:5829 msgid "Foreign-data wrapper" msgstr "ΠεÏιτÏλιξη ξένων δεδομένων" -#: describe.c:5768 describe.c:5958 +#: describe.c:5847 describe.c:6037 msgid "Version" msgstr "Έκδοση" -#: describe.c:5799 +#: describe.c:5878 msgid "List of foreign servers" msgstr "Λίστα ξενικών διακομιστών" -#: describe.c:5824 describe.c:5883 +#: describe.c:5903 describe.c:5962 msgid "Server" msgstr "Διακομιστής" -#: describe.c:5825 +#: describe.c:5904 msgid "User name" msgstr "Όνομα χÏήστη" -#: describe.c:5855 +#: describe.c:5934 msgid "List of user mappings" msgstr "Λίστα αντιστοιχιών χÏηστών" -#: describe.c:5928 +#: describe.c:6007 msgid "List of foreign tables" msgstr "Λίστα ξενικών πινάκων" -#: describe.c:5980 +#: describe.c:6059 msgid "List of installed extensions" msgstr "Λίστα εγκατεστημένων επεκτάσεων" -#: describe.c:6028 +#: describe.c:6107 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Δεν βÏέθηκε καμία επέκταση με το όνομα «%s»." -#: describe.c:6031 +#: describe.c:6110 #, c-format msgid "Did not find any extensions." msgstr "Δεν βÏέθηκαν επεκτάσεις." -#: describe.c:6075 +#: describe.c:6154 msgid "Object description" msgstr "ΠεÏιγÏαφή αντικειμένου" -#: describe.c:6085 +#: describe.c:6164 #, c-format msgid "Objects in extension \"%s\"" msgstr "Αντικείμενα στην επέκταση «%s»" -#: describe.c:6126 +#: describe.c:6205 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "ακατάλληλο αναγνωÏισμένο όνομα (πάÏα πολλά διάστικτα ονόματα): %s" -#: describe.c:6140 +#: describe.c:6219 #, c-format msgid "cross-database references are not implemented: %s" msgstr "οι παÏαπομπές Î¼ÎµÏ„Î±Î¾Ï Î²Î¬ÏƒÎµÏ‰Î½ δεδομένων δεν είναι υλοποιημένες: %s" -#: describe.c:6171 describe.c:6298 +#: describe.c:6250 describe.c:6377 #, c-format msgid "The server (version %s) does not support publications." msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει δημοσιεÏσεις." -#: describe.c:6188 describe.c:6376 +#: describe.c:6267 describe.c:6455 msgid "All tables" msgstr "Όλοι οι πίνακες" -#: describe.c:6189 describe.c:6377 +#: describe.c:6268 describe.c:6456 msgid "Inserts" msgstr "Εισαγωγές" -#: describe.c:6190 describe.c:6378 +#: describe.c:6269 describe.c:6457 msgid "Updates" msgstr "ΕνημεÏώσεις" -#: describe.c:6191 describe.c:6379 +#: describe.c:6270 describe.c:6458 msgid "Deletes" msgstr "ΔιαγÏαφές" -#: describe.c:6195 describe.c:6381 +#: describe.c:6274 describe.c:6460 msgid "Truncates" msgstr "ΠεÏικοπές" -#: describe.c:6199 describe.c:6383 +#: describe.c:6278 describe.c:6462 msgid "Via root" msgstr "Διαμέσου υπεÏχÏήστη" -#: describe.c:6221 +#: describe.c:6300 msgid "List of publications" msgstr "Λίστα δημοσιεÏσεων" -#: describe.c:6345 +#: describe.c:6424 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Δεν βÏέθηκε καμία δημοσίευση με όνομα «%s»." -#: describe.c:6348 +#: describe.c:6427 #, c-format msgid "Did not find any publications." msgstr "Δεν βÏέθηκε καμία δημοσίευση." -#: describe.c:6372 +#: describe.c:6451 #, c-format msgid "Publication %s" msgstr "Δημοσίευση %s" -#: describe.c:6425 +#: describe.c:6504 msgid "Tables:" msgstr "Πίνακες:" -#: describe.c:6437 +#: describe.c:6516 msgid "Tables from schemas:" msgstr "Πίνακες από σχήματα:" -#: describe.c:6481 +#: describe.c:6560 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Ο διακομιστής (έκδοση %s) δεν υποστηÏίζει συνδÏομές." -#: describe.c:6497 +#: describe.c:6576 msgid "Publication" msgstr "Δημοσίευση" -#: describe.c:6506 +#: describe.c:6585 msgid "Binary" msgstr "Δυαδικό" -#: describe.c:6507 +#: describe.c:6594 describe.c:6598 msgid "Streaming" msgstr "Ροής" -#: describe.c:6514 +#: describe.c:6606 msgid "Two-phase commit" msgstr "Συναλλαγή δÏο φάσεων" -#: describe.c:6515 +#: describe.c:6607 msgid "Disable on error" msgstr "ΑπενεÏγοποίηση μετά από σφάλμα" -#: describe.c:6520 +#: describe.c:6614 +msgid "Origin" +msgstr "Πηγή" + +#: describe.c:6615 +msgid "Password required" +msgstr "Απαιτείται κωδικός Ï€Ïόσβασης" + +#: describe.c:6616 +msgid "Run as owner?" +msgstr "ΤÏέξτε ως ιδιοκτήτης;" + +#: describe.c:6621 msgid "Synchronous commit" msgstr "ΣÏγχÏονη δέσμευση" -#: describe.c:6521 +#: describe.c:6622 msgid "Conninfo" msgstr "Conninfo" -#: describe.c:6527 +#: describe.c:6628 msgid "Skip LSN" msgstr "ΠαÏάλειψη LSN" -#: describe.c:6554 +#: describe.c:6655 msgid "List of subscriptions" msgstr "Λίστα συνδÏομών" -#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 +#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001 msgid "AM" msgstr "ΑΜ" -#: describe.c:6617 +#: describe.c:6718 msgid "Input type" msgstr "ΤÏπος εισόδου" -#: describe.c:6618 +#: describe.c:6719 msgid "Storage type" msgstr "ΤÏπος αποθήκευσης" -#: describe.c:6619 +#: describe.c:6720 msgid "Operator class" msgstr "Κλάση χειÏιστή" -#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 +#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002 msgid "Operator family" msgstr "Οικογένεια χειÏιστή" -#: describe.c:6667 +#: describe.c:6768 msgid "List of operator classes" msgstr "Λίστα οικογένειας κλάσεων" -#: describe.c:6714 +#: describe.c:6815 msgid "Applicable types" msgstr "ΕφαÏμόσιμοι Ï„Ïποι" -#: describe.c:6756 +#: describe.c:6857 msgid "List of operator families" msgstr "Λίστα οικογενειών χειÏιστών" -#: describe.c:6807 +#: describe.c:6908 msgid "Operator" msgstr "ΧειÏιστής" -#: describe.c:6808 +#: describe.c:6909 msgid "Strategy" msgstr "ΣτÏατηγική" -#: describe.c:6809 +#: describe.c:6910 msgid "ordering" msgstr "διάταξη" -#: describe.c:6810 +#: describe.c:6911 msgid "search" msgstr "αναζήτηση" -#: describe.c:6811 +#: describe.c:6912 msgid "Purpose" msgstr "Στόχος" -#: describe.c:6816 +#: describe.c:6917 msgid "Sort opfamily" msgstr "Διάταξη opfamily" -#: describe.c:6855 +#: describe.c:6956 msgid "List of operators of operator families" msgstr "Λίστα χειÏιστών των οικογενειών χειÏιστών" -#: describe.c:6902 +#: describe.c:7003 msgid "Registered left type" msgstr "ΚαταχωÏημένος αÏιστεÏός Ï„Ïπος" -#: describe.c:6903 +#: describe.c:7004 msgid "Registered right type" msgstr "ΚαταχωÏημένος δεξιός Ï„Ïπος" -#: describe.c:6904 +#: describe.c:7005 msgid "Number" msgstr "ΑÏιθμός" -#: describe.c:6948 +#: describe.c:7049 msgid "List of support functions of operator families" msgstr "Λίστα συναÏτήσεων υποστήÏιξης των οικογενειών χειÏιστών" -#: describe.c:6979 +#: describe.c:7080 msgid "ID" msgstr "ID" -#: describe.c:7000 +#: describe.c:7101 msgid "Large objects" msgstr "Μεγάλα αντικείμενα" @@ -2423,7 +2473,7 @@ msgstr "" "psql είναι το διαδÏαστικό τεÏματικό της PostgreSQL.\n" "\n" -#: help.c:76 help.c:393 help.c:473 help.c:516 +#: help.c:76 help.c:395 help.c:479 help.c:522 msgid "Usage:\n" msgstr "ΧÏήση:\n" @@ -2674,18 +2724,22 @@ msgid "General\n" msgstr "Γενικά\n" #: help.c:192 +msgid " \\bind [PARAM]... set query parameters\n" +msgstr " \\bind [PARAM]... ÏŒÏισε τις παÏαμέτÏους του εÏωτήματος\n" + +#: help.c:193 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright εμφάνισε τους ÏŒÏους χÏήσης και διανομής της PostgreSQL\n" -#: help.c:193 +#: help.c:194 msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr " \\crosstabview [COLUMNS] εκτέλεσε το εÏώτημα και εμφάνισε Ï„o αποτελέσμα σε όψη crosstab\n" -#: help.c:194 +#: help.c:195 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose εμφάνισε το πιο Ï€Ïόσφατο μήνυμα σφάλματος στη μέγιστη λεπτομέÏεια\n" -#: help.c:195 +#: help.c:196 msgid "" " \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" @@ -2693,364 +2747,368 @@ msgstr "" " \\g [(OPTIONS)] [FILE] εκτέλεσε το εÏώτημα (και στείλε το αποτελέσματα σε αÏχείο ή |pipe).\n" " \\g χωÏίς οÏίσματα ισοδυναμεί με το εÏωματικό\n" -#: help.c:197 +#: help.c:198 msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc πεÏίγÏαψε το αποτέλεσμα του εÏωτήματος, χωÏίς να εκτελεστεί\n" -#: help.c:198 +#: help.c:199 msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec εκτέλεσε το εÏώτημα και, στη συνέχεια, εκτέλεσε κάθε τιμή του αποτελέσματός της\n" -#: help.c:199 +#: help.c:200 msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr " \\gset [PREFIX] εκτέλεσε το εÏώτημα και αποθήκευσε το αποτελέσμα σε psql μεταβλητές\n" -#: help.c:200 +#: help.c:201 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [(OPTIONS)] [FILE] όμοια με \\g, αλλά επιβάλλει λειτουÏγία εκτεταμένης εξόδου\n" -#: help.c:201 +#: help.c:202 msgid " \\q quit psql\n" msgstr " \\q τεÏμάτισε psql\n" -#: help.c:202 -msgid " \\watch [SEC] execute query every SEC seconds\n" -msgstr " \\watch [SEC] εκτέλεση του εÏωτήματος κάθε SEC δευτεÏόλεπτα\n" +#: help.c:203 +msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n" +msgstr " \\watch [[i=]SEC] [c=N] εκτέλεση εÏωτήματος κάθε SEC δευτεÏόλεπτα, έως και N φοÏές\n" -#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 -#: help.c:324 help.c:337 help.c:346 +#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306 +#: help.c:326 help.c:339 help.c:348 msgid "\n" msgstr "\n" -#: help.c:205 +#: help.c:206 msgid "Help\n" msgstr "Βοήθεια\n" -#: help.c:207 +#: help.c:208 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] εμφάνισε την βοήθεια για τις εντολές ανάποδης καθέτου\n" -#: help.c:208 +#: help.c:209 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options εμφάνισε την βοήθεια για τις επιλογές εντολών γÏαμμής της psql\n" -#: help.c:209 +#: help.c:210 msgid " \\? variables show help on special variables\n" msgstr " \\? variables εμφάνισε την βοήθεια για τις ειδικές μεταβλητές\n" -#: help.c:210 +#: help.c:211 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [NAME] βοήθεια για την σÏνταξη των εντολών SQL, * για όλες τις εντολών\n" -#: help.c:213 +#: help.c:214 msgid "Query Buffer\n" msgstr "Ενδιάμεση μνήμη ΕÏωτήματος\n" -#: help.c:214 +#: help.c:215 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr " \\e [FILE] [LINE] επεξεÏγάσου την ενδιάμεση μνήμη (ή αÏχείο) εÏωτήματος με εξωτεÏικό επεξεÏγαστή κειμένου\n" -#: help.c:215 +#: help.c:216 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNCNAME [LINE]] επεξεÏγάσου τον οÏισμό της συνάÏτησης με εξωτεÏικό επεξεÏγαστή κειμένου\n" -#: help.c:216 +#: help.c:217 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ef [FUNCNAME [LINE]] επεξεÏγάσου τον οÏισμό της όψης με εξωτεÏικό επεξεÏγαστή κειμένου\n" -#: help.c:217 +#: help.c:218 msgid " \\p show the contents of the query buffer\n" msgstr " \\p εμφάνισε τα πεÏιοχόμενα της ενδιάμεσης μνήμης εÏωτήματος\n" -#: help.c:218 +#: help.c:219 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r επαναφοÏά (αÏχικοποίηση) της ενδιάμεσης μνήμης εÏωτήματος\n" -#: help.c:220 +#: help.c:221 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [FILE] εμφάνισε το ιστοÏικό η αποθήκευσε το σε αÏχείο\n" -#: help.c:222 +#: help.c:223 msgid " \\w FILE write query buffer to file\n" msgstr " \\w FILE γÏάψε την ενδιάμεση μνήμη εÏωτήματος σε αÏχείο\n" -#: help.c:225 +#: help.c:226 msgid "Input/Output\n" msgstr "Είσοδος/Έξοδος\n" -#: help.c:226 +#: help.c:227 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr " \\copy ... εκτέλεσε SQL COPY με Ïοή δεδομένων σε διακομιστή πελάτη\n" -#: help.c:227 +#: help.c:228 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [STRING] γÏάψε την στοιχειοσειÏά στην τυπική έξοδο (-n για παÏάληψη νέας γÏαμμής)\n" -#: help.c:228 +#: help.c:229 msgid " \\i FILE execute commands from file\n" msgstr " \\i FILE εκτέλεσε εντολές από αÏχείο\n" -#: help.c:229 +#: help.c:230 msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr " \\ir FILE όπως \\i, αλλά σε σχέση με την τοποθεσία του Ï„Ïέχοντος σεναÏίου\n" -#: help.c:230 +#: help.c:231 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [FILE] στείλε όλα τα αποτελέσματα εÏωτημάτων σε αÏχείο ή |pipe\n" -#: help.c:231 +#: help.c:232 msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr " \\qecho [-n] [STRING] γÏάψε την στοιχειοσειÏά στην Ïοή εξόδου \\o (-n για παÏάληψη νέας γÏαμμής)\n" -#: help.c:232 +#: help.c:233 msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr " \\warn [-n] [STRING] γÏάψε την στοιχειοσειÏά στο τυπικό σφάλμα (-n για παÏάληψη νέας γÏαμμής)\n" -#: help.c:235 +#: help.c:236 msgid "Conditional\n" msgstr "Υπό συνθήκη\n" -#: help.c:236 +#: help.c:237 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR έναÏξη υπό συνθήκης μπλοκ\n" -#: help.c:237 +#: help.c:238 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR εναλλακτική λÏση εντός του Ï„Ïέχοντος μπλοκ υπό ÏŒÏους\n" -#: help.c:238 +#: help.c:239 msgid " \\else final alternative within current conditional block\n" msgstr " \\else τελική εναλλακτική λÏση εντός του Ï„Ïέχοντος μπλοκ υπό ÏŒÏους\n" -#: help.c:239 +#: help.c:240 msgid " \\endif end conditional block\n" msgstr " \\endif τεÏματισμός μπλοκ υπό ÏŒÏους\n" -#: help.c:242 +#: help.c:243 msgid "Informational\n" msgstr "ΠληÏοφοÏιακά\n" -#: help.c:243 +#: help.c:244 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (επιλογές: S = εμφάνισε αντικείμενα συστήματος, + = επιπλέον λεπτομέÏιες)\n" -#: help.c:244 +#: help.c:245 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] εμφάνισε πίνακες, όψεις και σειÏές\n" -#: help.c:245 +#: help.c:246 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NAME πεÏιέγÏαψε πίνακα, όψη, σειÏά, ή ευÏετήÏιο\n" -#: help.c:246 +#: help.c:247 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [PATTERN] απαÏίθμησε συγκεντÏωτικά\n" -#: help.c:247 +#: help.c:248 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [PATTERN] απαÏίθμησε μεθόδους Ï€Ïόσβασης\n" -#: help.c:248 +#: help.c:249 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] απαÏίθμησε κλάσεις χειÏιστή\n" -#: help.c:249 +#: help.c:250 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] απαÏίθμησε οικογένειες χειÏιστών\n" -#: help.c:250 +#: help.c:251 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] απαÏίθμησε χειÏιστές των οικογενειών χειÏιστών\n" -#: help.c:251 +#: help.c:252 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] απαÏίθμησε συναÏτήσεις των οικογενειών χειÏιστών\n" -#: help.c:252 +#: help.c:253 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [PATTERN] απαÏίθμησε πινακοχώÏους\n" -#: help.c:253 +#: help.c:254 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [PATTERN] απαÏίθμησε μετατÏοπές\n" -#: help.c:254 +#: help.c:255 msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" msgstr " \\dconfig[+] [PATTERN] απαÏίθμησε παÏαμέτÏους ÏÏθμισης\n" -#: help.c:255 +#: help.c:256 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [PATTERN] απαÏίθμησε casts\n" -#: help.c:256 +#: help.c:257 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [PATTERN] εμφάνισε πεÏιγÏαφές αντικειμένων που δεν φαίνονται πουθενά αλλοÏ\n" -#: help.c:257 +#: help.c:258 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [PATTERN] απαÏίθμησε πεδία\n" -#: help.c:258 +#: help.c:259 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [PATTERN] απαÏίθμησε Ï€Ïοεπιλεγμένα Ï€Ïονόμια\n" -#: help.c:259 +#: help.c:260 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [PATTERN] απαÏίθμησε ξενικοÏÏ‚ πίνακες\n" -#: help.c:260 +#: help.c:261 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [PATTERN] απαÏίθμησε ξενικοÏÏ‚ διακομιστές\n" -#: help.c:261 +#: help.c:262 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [PATTERN] απαÏίθμησε ξενικοÏÏ‚ πίνακες\n" -#: help.c:262 +#: help.c:263 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [PATTERN] απαÏίθμησε αντιστοιχίες χÏηστών\n" -#: help.c:263 +#: help.c:264 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [PATTERN] απαÏίθμησε πεÏιτυλίξεις ξένων δεδομένων\n" -#: help.c:264 +#: help.c:265 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" msgstr "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN …]]\n" -" απαÏίθμησε συναÏτήσεις [μόνο agg/normal/procedures/trigger/window]\n" +" απαÏίθμησε συναÏτήσεις [μόνο agg/normal/procedures/trigger/window]\n" -#: help.c:266 +#: help.c:267 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [PATTERN] απαÏίθμησε Ïυθμίσεις αναζήτησης κειμένου\n" -#: help.c:267 +#: help.c:268 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [PATTERN] απαÏίθμησε λεξικά αναζήτησης κειμένου\n" -#: help.c:268 +#: help.c:269 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [PATTERN] απαÏίθμησε αναλυτές αναζήτησης κειμένου\n" -#: help.c:269 +#: help.c:270 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [PATTERN] απαÏίθμησε Ï€Ïότυπα αναζήτησης κειμένου\n" -#: help.c:270 +#: help.c:271 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [PATTERN] απαÏίθμησε Ïόλους\n" -#: help.c:271 +#: help.c:272 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [PATTERN] απαÏίθμησε ευÏετήÏια\n" -#: help.c:272 +#: help.c:273 msgid " \\dl[+] list large objects, same as \\lo_list\n" msgstr " \\dl[+] απαÏίθμησε μεγάλα αντικείμενα, όπως \\lo_list\n" -#: help.c:273 +#: help.c:274 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [PATTERN] απαÏίθμησε διαδικαστικές γλώσσες\n" -#: help.c:274 +#: help.c:275 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [PATTERN] απαÏίθμησε υλοποιημένες όψεις\n" -#: help.c:275 +#: help.c:276 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [PATTERN] απαÏίθμησε σχήματα\n" -#: help.c:276 +#: help.c:277 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" msgstr "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" -" απαÏίθμησε χειÏιστές\n" +" απαÏίθμησε χειÏιστές\n" -#: help.c:278 +#: help.c:279 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [PATTERN] απαÏίθμησε συÏÏαφές\n" -#: help.c:279 -msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" -msgstr " \\dp [PATTERN] απαÏίθμησε Ï€Ïονόμια Ï€Ïόσβασης πίνακα, όψης και σειÏάς\n" - #: help.c:280 +msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n" +msgstr " \\dp[S] [PATTERN] απαÏίθμησε Ï€Ïονόμια Ï€Ïόσβασης πίνακα, όψης και σειÏάς\n" + +#: help.c:281 msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr " \\dP[itn+] [PATTERN] απαÏίθμησε διαχωÏισμένες σχέσεις [μόνο ευÏετήÏιο/πίνακα] [n=nested]\n" -#: help.c:281 +#: help.c:282 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr " \\drds [ROLEPTRN [DBPTRN]] απαÏίθμησε Ïυθμίσεις Ïόλου ανά βάση δεδομένων\n" -#: help.c:282 +#: help.c:283 +msgid " \\drg[S] [PATTERN] list role grants\n" +msgstr " \\drg[S] [PATTERN] απαÏίθμησε χοÏηγοÏÏ‚ Ïόλων\n" + +#: help.c:284 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [PATTERN] απαÏίθμησε δημοσιεÏσεις αναπαÏαγωγής\n" -#: help.c:283 +#: help.c:285 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [PATTERN] απαÏίθμησε συνδÏομές αναπαÏαγωγής\n" -#: help.c:284 +#: help.c:286 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [PATTERN] απαÏίθμησε ακολουθίες\n" -#: help.c:285 +#: help.c:287 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [PATTERN] απαÏίθμησε πίνακες\n" -#: help.c:286 +#: help.c:288 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [PATTERN] απαÏίθμησε Ï„Ïπους δεδομένων\n" -#: help.c:287 +#: help.c:289 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [PATTERN] απαÏίθμησε Ïόλους\n" -#: help.c:288 +#: help.c:290 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [PATTERN] απαÏίθμησε όψεις\n" -#: help.c:289 +#: help.c:291 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [PATTERN] απαÏίθμησε Ï€Ïοεκτάσεις\n" -#: help.c:290 +#: help.c:292 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [PATTERN] απαÏίθμησε εναÏσματα συμβάντων\n" -#: help.c:291 +#: help.c:293 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [PATTERN] απαÏίθμησε εναÏσματα συμβάντων\n" -#: help.c:292 +#: help.c:294 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [PATTERN] απαÏίθμησε βάσεις δεδομένων\n" -#: help.c:293 +#: help.c:295 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNCNAME εμφάνισε τον οÏισμό μίας συνάÏτησης\n" -#: help.c:294 +#: help.c:296 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] VIEWNAME εμφάνισε τον οÏισμό μίας όψης\n" -#: help.c:295 -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [PATTERN] όπως \\dp\n" +#: help.c:297 +msgid " \\z[S] [PATTERN] same as \\dp\n" +msgstr " \\z[S] [PATTERN] όπως \\dp\n" -#: help.c:298 +#: help.c:300 msgid "Large Objects\n" msgstr "Μεγάλα αντικείμενα\n" -#: help.c:299 +#: help.c:301 msgid " \\lo_export LOBOID FILE write large object to file\n" msgstr " \\lo_export LOBOID FILE εγγÏαφή μεγάλου αντικειμένου σε αÏχείο\n" -#: help.c:300 +#: help.c:302 msgid "" " \\lo_import FILE [COMMENT]\n" " read large object from file\n" @@ -3058,36 +3116,36 @@ msgstr "" " \\lo_import FILE [COMMENT]\n" " ανάγνωση μεγάλων αντικειμένων από αÏχείο\n" -#: help.c:302 +#: help.c:304 msgid " \\lo_list[+] list large objects\n" msgstr " \\lo_list[+] απαÏίθμησε μεγάλα αντικείμενα\n" -#: help.c:303 +#: help.c:305 msgid " \\lo_unlink LOBOID delete a large object\n" msgstr " \\lo_unlink LOBOID διαγÏαφή μεγάλου αντικειμένου\n" -#: help.c:306 +#: help.c:308 msgid "Formatting\n" msgstr "ΜοÏφοποίηση\n" -#: help.c:307 +#: help.c:309 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a εναλλαγή Î¼ÎµÏ„Î±Î¾Ï Î¼Î· ευθυγÏαμμισμένης και ευθυγÏαμμισμένης μοÏφής εξόδου\n" -#: help.c:308 +#: help.c:310 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [STRING] ÏŒÏισε τίτλο πίνακα, ή αναίÏεσε εάν κενό\n" -#: help.c:309 +#: help.c:311 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr " \\f [STRING] εμφάνισε ή ÏŒÏισε τον διαχωÏιστή πεδίου για μη ευθυγÏαμμισμένη έξοδο εÏωτήματος\n" -#: help.c:310 +#: help.c:312 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H εναλλαγή λειτουÏγίας εξόδου HTML (επί του παÏόντος %s)\n" -#: help.c:312 +#: help.c:314 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3105,29 +3163,29 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle)\n" -#: help.c:319 +#: help.c:321 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] εμφάνισε μόνο γÏαμμές (επί του παÏόντος %s)\n" -#: help.c:321 +#: help.c:323 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [STRING] οÏίστε χαÏακτηÏιστικά ετικέτας
HTML, ή αναιÏέστε εάν δεν υπάÏχουν\n" -#: help.c:322 +#: help.c:324 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] εναλλαγή τιμής διευÏυμένης εξόδου (επί του παÏόντος %s)\n" -#: help.c:323 +#: help.c:325 msgid "auto" msgstr "αυτόματο" -#: help.c:326 +#: help.c:328 msgid "Connection\n" msgstr "ΣÏνδεση\n" -#: help.c:328 +#: help.c:330 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3136,7 +3194,7 @@ msgstr "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " σÏνδεση σε νέα βάση δεδομένων (επί του παÏόντος «%s»)\n" -#: help.c:332 +#: help.c:334 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3144,60 +3202,60 @@ msgstr "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " σÏνδεση σε νέα βάση δεδομένων (επί του παÏόντος καμία σÏνδεση)\n" -#: help.c:334 +#: help.c:336 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo εμφάνιση πληÏοφοÏιών σχετικά με την παÏοÏσα σÏνδεση\n" -#: help.c:335 +#: help.c:337 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [ENCODING] εμφάνισε ή ÏŒÏισε την κωδικοποίηση του πελάτη\n" -#: help.c:336 +#: help.c:338 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [USERNAME] άλλαξε με ασφάλεια τον κωδικό Ï€Ïόσβασης ενός χÏήστη\n" -#: help.c:339 +#: help.c:341 msgid "Operating System\n" msgstr "ΛειτουÏγικό σÏστημα\n" -#: help.c:340 +#: help.c:342 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [DIR] άλλαξε τον παÏόν κατάλογο εÏγασίας\n" -#: help.c:341 +#: help.c:343 msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" -msgstr " \\setenv NAME [VALUE] λήψη μεταβλητής πεÏιβάλλοντος\n" +msgstr " \\getenv PSQLVAR ENVVAR λήψη μεταβλητής πεÏιβάλλοντος\n" -#: help.c:342 +#: help.c:344 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NAME [VALUE] ÏŒÏισε ή αναίÏεσε μεταβλητή πεÏιβάλλοντος\n" -#: help.c:343 +#: help.c:345 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] εναλλαγή χÏÎ¿Î½Î¹ÏƒÎ¼Î¿Ï Ï„Ï‰Î½ εντολών (επί του παÏόντος %s)\n" -#: help.c:345 +#: help.c:347 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr " \\! [COMMAND] εκτέλεσε εντολή σε κέλυφος ή ξεκίνησε διαδÏαστικό κέλυφος\n" -#: help.c:348 +#: help.c:350 msgid "Variables\n" msgstr "Μεταβλητές\n" -#: help.c:349 +#: help.c:351 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [TEXT] NAME Ï€ÏοέτÏεψε τον χÏήστη να οÏίσει εσωτεÏική μεταβλητή\n" -#: help.c:350 +#: help.c:352 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [NAME [VALUE]] ÏŒÏισε εσωτεÏική μεταβλητή, ή απαÏίθμησέ τες όλες εάν δεν υπάÏχουν παÏάμετÏοι\n" -#: help.c:351 +#: help.c:353 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NAME αναίÏεσε (διέγÏαψε) εσωτεÏική μεταβλητή\n" -#: help.c:390 +#: help.c:392 msgid "" "List of specially treated variables\n" "\n" @@ -3205,11 +3263,11 @@ msgstr "" "ΑπαÏίθμηση των ειδικά επεξεÏγασμένων μεταβλητών\n" "\n" -#: help.c:392 +#: help.c:394 msgid "psql variables:\n" msgstr "psql μεταβλητές:\n" -#: help.c:394 +#: help.c:396 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3219,7 +3277,7 @@ msgstr "" " ή \\set NAME VALUE μέσα σε psql\n" "\n" -#: help.c:396 +#: help.c:398 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3227,7 +3285,7 @@ msgstr "" " AUTOCOMMIT\n" " εφόσον οÏισμένο, επιτυχημένες εντολές SQL ολοκληÏώνονται αυτόματα\n" -#: help.c:398 +#: help.c:400 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3237,7 +3295,7 @@ msgstr "" " καθοÏίζει τον Ï„Ïπο (πεζά, κεφαλαία) για την ολοκλήÏωση ÏŒÏων SQL\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:401 +#: help.c:403 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3245,7 +3303,7 @@ msgstr "" " DBNAME\n" " ονομασία της συνδεδεμένης βάσης δεδομένων\n" -#: help.c:403 +#: help.c:405 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3254,9 +3312,8 @@ msgstr "" " ECHO\n" " ελέγχει ποία είσοδος γÏάφεται στην τυπική έξοδο\n" " [all, errors, none, queries]\n" -"\n" -#: help.c:406 +#: help.c:408 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3266,7 +3323,7 @@ msgstr "" " εάν έχει οÏιστεί, εμφανίστε εσωτεÏικά εÏωτήματα που εκτελοÏνται από εντολές ανάστÏωσής τους.\n" " εάν οÏιστεί σε \"noexec\", απλά δείξτε τους χωÏίς εκτέλεση\n" -#: help.c:409 +#: help.c:411 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3274,15 +3331,15 @@ msgstr "" " ENCODING\n" " Ï„Ïέχουσα κωδικοποίηση χαÏακτήÏων του Ï€ÏογÏάμματος-πελάτη\n" -#: help.c:411 +#: help.c:413 msgid "" " ERROR\n" -" true if last query failed, else false\n" +" \"true\" if last query failed, else \"false\"\n" msgstr "" -" ERROR\n" -" αληθές εάν το τελευταίο εÏώτημα απέτυχε, διαφοÏετικά ψευδές\n" +" ΣΦΑΛΜΑ\n" +" \"true\" αν το τελευταίο εÏώτημα απέτυχε, αλλιώς \"false\"\n" -#: help.c:413 +#: help.c:415 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3290,7 +3347,7 @@ msgstr "" " FETCH_COUNT\n" " αÏιθμός των σειÏών αποτελεσμάτων για λήψη και εμφάνιση ανά επανάλληψη (0 = απεÏιόÏιστος)\n" -#: help.c:415 +#: help.c:417 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3298,7 +3355,7 @@ msgstr "" " HIDE_TABLEAM\n" " εάν έχει οÏιστεί, δεν εμφανίζονται μέθοδοι Ï€Ïόσβασης πίνακα\n" -#: help.c:417 +#: help.c:419 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" @@ -3306,7 +3363,7 @@ msgstr "" " HIDE_TOAST_COMPRESSION\n" " εάν έχει οÏιστεί, δεν εμφανίζονται μέθοδοι συμπίεσης\n" -#: help.c:419 +#: help.c:421 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3314,7 +3371,7 @@ msgstr "" " HISTCONTROL\n" " ελέγχει το ιστοÏικό εντολών [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:421 +#: help.c:423 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3322,7 +3379,7 @@ msgstr "" " HISTFILE\n" " όνομα αÏχείου που χÏησιμοποιείται για την αποθήκευση του ιστοÏÎ¹ÎºÎ¿Ï ÎµÎ½Ï„Î¿Î»ÏŽÎ½\n" -#: help.c:423 +#: help.c:425 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3330,7 +3387,7 @@ msgstr "" " HISTSIZE\n" " μέγιστος αÏιθμός εντολών που θα αποθηκευτοÏν στο ιστοÏικό εντολών\n" -#: help.c:425 +#: help.c:427 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3338,7 +3395,7 @@ msgstr "" " HOST\n" " ο συνδεδεμένος κεντÏικός υπολογιστής διακομιστή βάσης δεδομένων\n" -#: help.c:427 +#: help.c:429 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3346,7 +3403,7 @@ msgstr "" " IGNOREEOF\n" " αÏιθμός των EOF που απαιτοÏνται για τον τεÏματισμό μιας διαδÏαστικής συνεδÏίας\n" -#: help.c:429 +#: help.c:431 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3354,7 +3411,7 @@ msgstr "" " LASTOID\n" " τιμή του τελευταίου επηÏεασμένου OID\n" -#: help.c:431 +#: help.c:433 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3364,7 +3421,7 @@ msgstr "" " LAST_ERROR_SQLSTATE\n" " μήνυμα και SQLSTATE του τελευταίου σφάλματος, ή κενή συμβολοσειÏά και \"00000\" εάν δεν\n" -#: help.c:434 +#: help.c:436 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3372,7 +3429,7 @@ msgstr "" " ON_ERROR_ROLLBACK\n" " εάν έχει οÏιστεί, ένα σφάλμα δεν διακόπτει μια συναλλαγή (χÏησιμοποιεί έμμεσα σημεία αποθήκευσης)\n" -#: help.c:436 +#: help.c:438 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3380,7 +3437,7 @@ msgstr "" " ON_ERROR_STOP\n" " σταμάτησε την ομαδική εκτέλεση μετά από σφάλμα\n" -#: help.c:438 +#: help.c:440 msgid "" " PORT\n" " server port of the current connection\n" @@ -3388,7 +3445,7 @@ msgstr "" " PORT\n" " θÏÏα διακομιστή της Ï„Ïέχουσας σÏνδεσης\n" -#: help.c:440 +#: help.c:442 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3396,7 +3453,7 @@ msgstr "" " PROMPT1\n" " οÏίζει την τυπική Ï€ÏοτÏοπή psql\n" -#: help.c:442 +#: help.c:444 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3404,7 +3461,7 @@ msgstr "" " PROMPT2\n" " καθοÏίζει την Ï€ÏοτÏοπή που χÏησιμοποιείται όταν μια Ï€Ïόταση συνεχίζεται από Ï€ÏοηγοÏμενη γÏαμμή\n" -#: help.c:444 +#: help.c:446 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3412,7 +3469,7 @@ msgstr "" " PROMPT3\n" " καθοÏίζει την Ï€ÏοτÏοπή που χÏησιμοποιείται κατά την διάÏκεια COPY … FROM STDIN\n" -#: help.c:446 +#: help.c:448 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3420,7 +3477,7 @@ msgstr "" " QUIET\n" " σιωπηλή εκτέλεση(όμοια με την επιλογή -q)\n" -#: help.c:448 +#: help.c:450 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3428,7 +3485,7 @@ msgstr "" " ROW_COUNT\n" " αÏιθμός των επηÏεασμένων ή επιστÏεφομένων σειÏών του τελευταίου εÏωτήματος, ή 0\n" -#: help.c:450 +#: help.c:452 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3436,9 +3493,25 @@ msgid "" msgstr "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" -" έκδοση διακομιστή (σε σÏντομη συμβολοσειÏά ή αÏιθμητική μοÏφή)\n" +" έκδοση διακομιστή (σε σÏντομη συμβολοσειÏά ή αÏιθμητική μοÏφή)\n" -#: help.c:453 +#: help.c:455 +msgid "" +" SHELL_ERROR\n" +" \"true\" if the last shell command failed, \"false\" if it succeeded\n" +msgstr "" +" SHELL_ERROR\n" +" \"true\" αν η τελευταία εντολή κελÏφους απέτυχε, \"false\" αν πέτυχε\n" + +#: help.c:457 +msgid "" +" SHELL_EXIT_CODE\n" +" exit status of the last shell command\n" +msgstr "" +" SHELL_EXIT_CODE\n" +" κατάσταση εξόδου της τελευταίας εντολής του κελÏφους\n" + +#: help.c:459 msgid "" " SHOW_ALL_RESULTS\n" " show all results of a combined query (\\;) instead of only the last\n" @@ -3446,7 +3519,7 @@ msgstr "" " SHOW_ALL_RESULTS\n" " εμφάνισε όλα τα αποτελέσματα εÏωτημάτων (\\;) αντί μόνο του τελευταίου\n" -#: help.c:455 +#: help.c:461 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3454,7 +3527,7 @@ msgstr "" " SHOW_CONTEXT\n" " ελέγχει την εμφάνιση των πεδίων του πεÏιεχομένου μηνÏματος [never, errors, always]\n" -#: help.c:457 +#: help.c:463 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3462,15 +3535,15 @@ msgstr "" " SINGLELINE\n" " εάν έχει οÏιστεί, το τέλος γÏαμμής ολοκληÏώνει τα εÏωτήματα SQL (όμοια με την επιλογή -S)\n" -#: help.c:459 +#: help.c:465 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" msgstr "" " SINGLESTEP\n" -" λειτουÏγία μονοÏ-βήματος(όμοια με την επιλογή -s)\n" +" λειτουÏγία μονοÏ-βήματος(όμοια με την επιλογή -s)\n" -#: help.c:461 +#: help.c:467 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3478,7 +3551,7 @@ msgstr "" " SQLSTATE\n" " SQLSTATE του τελευταίου εÏωτήματος, ή «00000» εάν δεν υπήÏξαν σφάλματα\n" -#: help.c:463 +#: help.c:469 msgid "" " USER\n" " the currently connected database user\n" @@ -3486,7 +3559,7 @@ msgstr "" " USER\n" " ο Ï„Ïέχων συνδεδεμένος χÏήστης βάσης δεδομένων\n" -#: help.c:465 +#: help.c:471 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3494,7 +3567,7 @@ msgstr "" " VERBOSITY\n" " ελέγχει την πεÏιφÏαστικότητα των αναφοÏών σφαλμάτων [default, verbose, terse, sqlstate]\n" -#: help.c:467 +#: help.c:473 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3506,7 +3579,7 @@ msgstr "" " VERSION_NUM\n" " η έκδοση της psql (σε πεÏιγÏαφική συμβολοσειÏά, σÏντομη συμβολοσειÏά, ή αÏιθμητική μοÏφή)\n" -#: help.c:472 +#: help.c:478 msgid "" "\n" "Display settings:\n" @@ -3514,7 +3587,7 @@ msgstr "" "\n" "Ρυθμίσεις εμφάνισης:\n" -#: help.c:474 +#: help.c:480 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3524,7 +3597,7 @@ msgstr "" " ή \\set NAME VALUE μέσα σε συνεδÏία psql\n" "\n" -#: help.c:476 +#: help.c:482 msgid "" " border\n" " border style (number)\n" @@ -3532,7 +3605,7 @@ msgstr "" " border\n" " στυλ πεÏιγÏάμματος (αÏιθμός)\n" -#: help.c:478 +#: help.c:484 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3540,7 +3613,7 @@ msgstr "" " columns\n" " πλάτος Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï ÎºÎ±Ï„Î¬ την εμφάνιση αναδιπλωμένης μοÏφής\n" -#: help.c:480 +#: help.c:486 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3548,7 +3621,7 @@ msgstr "" " expanded (ή x)\n" " διευÏυμένη έξοδος [on, off, auto]\n" -#: help.c:482 +#: help.c:488 #, c-format msgid "" " fieldsep\n" @@ -3557,7 +3630,7 @@ msgstr "" " fieldsep\n" " διαχωÏιστικό πεδίου σε μοÏφή μή ευθυγÏαμισμένης εξόδου (Ï€ÏοκαθοÏιμένο «%s»)\n" -#: help.c:485 +#: help.c:491 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3565,7 +3638,7 @@ msgstr "" " fieldsep_zero\n" " οÏίζει το διαχωÏιστικό πεδίου για τη μοÏφή μη ευθυγÏαμμισμένης εξόδου στο μηδενικό byte\n" -#: help.c:487 +#: help.c:493 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3573,7 +3646,7 @@ msgstr "" " footer\n" " ενεÏγοποιεί ή απενεÏγοποιεί την εμφάνιση του υποσέλιδου σε πίνακα [on, off]\n" -#: help.c:489 +#: help.c:495 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3581,7 +3654,7 @@ msgstr "" " format\n" " οÏίζει τη μοÏφή εξόδου [unaligned, aligned, wrapped, html, asciidoc, …]\n" -#: help.c:491 +#: help.c:497 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3589,7 +3662,7 @@ msgstr "" " linestyle\n" " οÏίζει τη μοÏφή πεÏιγÏάμματος [ascii, old-ascii, unicode]\n" -#: help.c:493 +#: help.c:499 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3597,7 +3670,7 @@ msgstr "" " null\n" " οÏίζει τη συμβολοσειÏά που θα εκτυπωθεί στη θέση κενής τιμής\n" -#: help.c:495 +#: help.c:501 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3605,7 +3678,7 @@ msgstr "" " numericlocale\n" " ενεÏγοποίηση εμφάνισης ενός χαÏακτήÏα εντοπιότητας για το διαχωÏισμό ομάδων ψηφίων\n" -#: help.c:497 +#: help.c:503 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3613,7 +3686,7 @@ msgstr "" " Pager\n" " ελέγχει πότε χÏησιμοποιείται εξωτεÏικός σελιδοποιητής [yes, no, always]\n" -#: help.c:499 +#: help.c:505 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3621,7 +3694,7 @@ msgstr "" " recordsep\n" " διαχωÏιστικό εγγÏαφών (σειÏάς) κατά την έξοδο μη ευθυγÏαμμισμένης μοÏφής\n" -#: help.c:501 +#: help.c:507 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3629,7 +3702,7 @@ msgstr "" " recordsep_zero\n" " οÏίζει το διαχωÏιστικό εγγÏαφών στο μηδενικό byte κατά την έξοδο μη ευθυγÏαμμισμένης μοÏφής\n" -#: help.c:503 +#: help.c:509 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3639,7 +3712,7 @@ msgstr "" " καθοÏίζει τα χαÏακτηÏιστικά ενός πίνακα tag σε μοÏφή HTML, ή καθοÏίζει\n" " αναλογικό πλάτος στηλών για Ï„Ïπους δεδομένων με αÏιστεÏή στοίχιση σε μοÏφή latex-longtable\n" -#: help.c:506 +#: help.c:512 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3647,7 +3720,7 @@ msgstr "" " title\n" " οÏίζει τον τίτλο πίνακα για χÏήση στους επόμενα εκτυπωμένους πίνακες\n" -#: help.c:508 +#: help.c:514 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3655,7 +3728,7 @@ msgstr "" " tuples_only\n" " εάν έχει οÏισθεί, τότε εμφανίζονται μόνο τα δεδομένα πίνακα\n" -#: help.c:510 +#: help.c:516 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3667,7 +3740,7 @@ msgstr "" " unicode_header_linestyle\n" " οÏισμός του στυλ γÏαμμής Unicode [single, double]\n" -#: help.c:515 +#: help.c:521 msgid "" "\n" "Environment variables:\n" @@ -3675,7 +3748,7 @@ msgstr "" "\n" "Μεταβλητές πεÏιβάλλοντος:\n" -#: help.c:519 +#: help.c:525 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3685,7 +3758,7 @@ msgstr "" " ή \\setenv ΟÎΟΜΑ [ΤΙΜΗ] μέσα σε συνεδÏία psql\n" "\n" -#: help.c:521 +#: help.c:527 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3697,7 +3770,7 @@ msgstr "" " ή \\setenv NAME [VALUE] μέσα σε συνεδÏία psql\n" "\n" -#: help.c:524 +#: help.c:530 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3705,7 +3778,7 @@ msgstr "" " COLUMNS\n" " αÏιθμός στηλών για αναδιπλωμένη μοÏφή\n" -#: help.c:526 +#: help.c:532 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3713,7 +3786,7 @@ msgstr "" " PGAPPNAME\n" " όμοια με την παÏάμετÏο σÏνδεσης application_name\n" -#: help.c:528 +#: help.c:534 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3721,7 +3794,7 @@ msgstr "" " PGDATABASE\n" " όμοια με την παÏάμετÏο σÏνδεσης dbname\n" -#: help.c:530 +#: help.c:536 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3729,7 +3802,7 @@ msgstr "" " PGHOST\n" " όμοια με την παÏάμετÏο της σÏνδεσης κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î®\n" -#: help.c:532 +#: help.c:538 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3737,7 +3810,7 @@ msgstr "" " PGPASSFILE\n" " αÏχείο κωδικών Ï€Ïόσβασης\n" -#: help.c:534 +#: help.c:540 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -3745,7 +3818,7 @@ msgstr "" " PGPASSWORD\n" " κωδικός Ï€Ïόσβασης σÏνδεσης (δεν συνιστάται)\n" -#: help.c:536 +#: help.c:542 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3753,7 +3826,7 @@ msgstr "" " PGPORT\n" " όμοια με την παÏάμετÏο σÏνδεσης θÏÏας\n" -#: help.c:538 +#: help.c:544 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3761,7 +3834,7 @@ msgstr "" " PGUSER\n" " όμοια με την παÏάμετÏο σÏνδεσης χÏήστη\n" -#: help.c:540 +#: help.c:546 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3769,15 +3842,15 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " Ï€ÏόγÏαμμα επεξεÏγασίας κειμένου που χÏησιμοποιείται από τις εντολές \\e, \\ef και \\ev\n" -#: help.c:542 +#: help.c:548 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" -" Ï„Ïόπος καθοÏÎ¹ÏƒÎ¼Î¿Ï Î±ÏÎ¹Î¸Î¼Î¿Ï Î³Ïαμμής κατά την κλήση του Ï€ÏογÏάμματος επεξεÏγασίας κειμένου\n" +" Ï„Ïόπος καθοÏÎ¹ÏƒÎ¼Î¿Ï Î±ÏÎ¹Î¸Î¼Î¿Ï Î³Ïαμμής κατά την κλήση του επεξεÏγαστή κειμένου\n" -#: help.c:544 +#: help.c:550 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -3785,7 +3858,7 @@ msgstr "" " PSQL_HISTORY\n" " εναλλακτική τοποθεσία για το αÏχείο ιστοÏÎ¹ÎºÎ¿Ï ÎµÎ½Ï„Î¿Î»ÏŽÎ½\n" -#: help.c:546 +#: help.c:552 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -3793,7 +3866,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " όνομα του εξωτεÏÎ¹ÎºÎ¿Ï Ï€ÏογÏάμματος σελιδοποίησης\n" -#: help.c:549 +#: help.c:555 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" @@ -3801,7 +3874,7 @@ msgstr "" " PSQL_WATCH_PAGER\n" " όνομα του εξωτεÏÎ¹ÎºÎ¿Ï Ï€ÏογÏάμματος σελιδοποίησης για \\watch\n" -#: help.c:552 +#: help.c:558 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -3809,7 +3882,7 @@ msgstr "" " PSQLRC\n" " εναλλακτική τοποθεσία για το αÏχείο .psqlrc του χÏήστη\n" -#: help.c:554 +#: help.c:560 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -3817,7 +3890,7 @@ msgstr "" " SHELL\n" " shell που χÏησιμοποιείται κατά την εντολή \\!\n" -#: help.c:556 +#: help.c:562 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -3825,11 +3898,11 @@ msgstr "" " TMPDIR\n" " κατάλογος για Ï€ÏοσωÏινά αÏχεία\n" -#: help.c:616 +#: help.c:622 msgid "Available help:\n" msgstr "Διαθέσιμη βοήθεια:\n" -#: help.c:711 +#: help.c:717 #, c-format msgid "" "Command: %s\n" @@ -3848,7 +3921,7 @@ msgstr "" "ΔιεÏθυνση URL: %s\n" "\n" -#: help.c:734 +#: help.c:740 #, c-format msgid "" "No help available for \"%s\".\n" @@ -3857,17 +3930,17 @@ msgstr "" "Δεν υπάÏχει διαθέσιμη βοήθεια για το \"%s\".\n" "Δοκιμάστε \\h χωÏίς παÏαμέτÏους για να δείτε τη διαθέσιμη βοήθεια.\n" -#: input.c:217 +#: input.c:216 #, c-format msgid "could not read from input file: %m" msgstr "δεν ήταν δυνατή η ανάγνωση από αÏχείο: %m" -#: input.c:478 input.c:516 +#: input.c:477 input.c:515 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "δεν ήταν δυνατή η αποθήκευση του ιστοÏÎ¹ÎºÎ¿Ï ÏƒÏ„Î¿ αÏχείο «%s»: %m" -#: input.c:535 +#: input.c:534 #, c-format msgid "history is not supported by this installation" msgstr "το ιστοÏικό δεν υποστηÏίζεται από την παÏοÏσα εγκατάσταση" @@ -3954,12 +4027,12 @@ msgstr "το εÏώτημα παÏαβλέφθηκε· χÏησιμοποιήσ msgid "reached EOF without finding closing \\endif(s)" msgstr "έφτασε στο EOF χωÏίς να βÏεθοÏν τελικά \\endif(s)" -#: psqlscanslash.l:638 +#: psqlscanslash.l:640 #, c-format msgid "unterminated quoted string" msgstr "ανολοκλήÏωτη συμβολοσειÏά με εισαγωγικά" -#: psqlscanslash.l:811 +#: psqlscanslash.l:825 #, c-format msgid "%s: out of memory" msgstr "%s: έλλειψη μνήμης" @@ -4001,34 +4074,34 @@ msgstr "%s: έλλειψη μνήμης" #: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 #: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687 #: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696 -#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996 -#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 -#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 -#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 -#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 -#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 -#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 -#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 -#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 -#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 -#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 -#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 -#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 -#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 -#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 -#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 -#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 -#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 -#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 -#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 -#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 -#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687 -#: sql_help.c:4735 sql_help.c:4893 +#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000 +#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159 +#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236 +#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439 +#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525 +#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602 +#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738 +#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079 +#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179 +#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267 +#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346 +#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404 +#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436 +#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472 +#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507 +#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545 +#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582 +#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614 +#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646 +#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688 +#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040 +#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197 +#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906 msgid "name" msgstr "ονομασία" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 -#: sql_help.c:3339 sql_help.c:4455 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848 +#: sql_help.c:3347 sql_help.c:4468 msgid "aggregate_signature" msgstr "aggregate_signature" @@ -4049,7 +4122,7 @@ msgstr "new_name" #: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 #: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 #: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510 -#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011 +#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019 msgid "new_owner" msgstr "new_owner" @@ -4061,7 +4134,7 @@ msgstr "new_owner" msgid "new_schema" msgstr "new_schema" -#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484 +#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497 msgid "where aggregate_signature is:" msgstr "όπου aggregate_signature είναι:" @@ -4070,13 +4143,13 @@ msgstr "όπου aggregate_signature είναι:" #: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 #: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 #: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 -#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911 -#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085 -#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 -#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 -#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 -#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 -#: sql_help.c:4491 +#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 +#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089 +#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349 +#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535 +#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474 +#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501 +#: sql_help.c:4504 msgid "argmode" msgstr "argmode" @@ -4085,12 +4158,12 @@ msgstr "argmode" #: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 #: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 #: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 -#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912 -#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086 -#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 -#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 -#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 -#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 +#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914 +#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090 +#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350 +#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536 +#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488 +#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505 msgid "argname" msgstr "argname" @@ -4099,44 +4172,44 @@ msgstr "argname" #: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 #: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 #: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 -#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 -#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597 -#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 -#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 -#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 +#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915 +#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605 +#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448 +#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483 +#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506 msgid "argtype" msgstr "argtype" #: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 #: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666 -#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974 -#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 -#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 -#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 -#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956 +#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977 +#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351 +#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048 +#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751 +#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973 msgid "option" msgstr "επιλογή" -#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 -#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441 +#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396 msgid "where option can be:" msgstr "όπου option μποÏεί να είναι:" -#: sql_help.c:116 sql_help.c:2209 +#: sql_help.c:116 sql_help.c:2217 msgid "allowconn" msgstr "allowconn" -#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 -#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218 +#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 msgid "connlimit" msgstr "connlimit" -#: sql_help.c:118 sql_help.c:2211 +#: sql_help.c:118 sql_help.c:2219 msgid "istemplate" msgstr "istemplate" #: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322 -#: sql_help.c:1374 sql_help.c:4187 +#: sql_help.c:1374 sql_help.c:4200 msgid "new_tablespace" msgstr "new_tablespace" @@ -4144,8 +4217,8 @@ msgstr "new_tablespace" #: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 #: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 #: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643 -#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601 -#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675 +#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609 +#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688 msgid "configuration_parameter" msgstr "configuration_parameter" @@ -4156,13 +4229,13 @@ msgstr "configuration_parameter" #: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182 #: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449 #: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667 -#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 -#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 -#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 -#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 -#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 -#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676 -#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679 +#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352 +#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475 +#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634 +#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923 +#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022 +#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689 +#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692 msgid "value" msgstr "value" @@ -4170,10 +4243,10 @@ msgstr "value" msgid "target_role" msgstr "target_role" -#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 -#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 -#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 -#: sql_help.c:4357 sql_help.c:4369 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639 +#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899 +#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351 +#: sql_help.c:4370 sql_help.c:4382 msgid "schema_name" msgstr "schema_name" @@ -4188,31 +4261,31 @@ msgstr "όπου abbreviated_grant_or_revoke είναι ένα από:" #: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 #: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 #: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 -#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438 -#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 -#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 -#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 -#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 -#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697 +#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446 +#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583 +#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675 +#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240 +#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943 +#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710 msgid "role_name" msgstr "role_name" #: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339 #: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684 -#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 -#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 -#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 -#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981 -#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088 -#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558 -#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608 -#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651 -#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806 -#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864 -#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921 -#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044 -#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102 -#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105 +#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360 +#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782 +#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932 +#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991 +#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098 +#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571 +#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621 +#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664 +#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819 +#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877 +#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934 +#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065 +#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123 +#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126 msgid "expression" msgstr "expression" @@ -4222,9 +4295,9 @@ msgstr "domain_constraint" #: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 #: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363 -#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852 -#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351 -#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 +#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854 +#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359 +#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003 msgid "constraint_name" msgstr "constraint_name" @@ -4248,82 +4321,82 @@ msgstr "όπου member_object είναι:" #: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 #: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 #: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 -#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856 -#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 -#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869 -#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884 -#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894 -#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898 -#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 -#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456 -#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 -#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 -#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 -#: sql_help.c:4482 +#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858 +#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862 +#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871 +#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886 +#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896 +#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900 +#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904 +#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469 +#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478 +#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490 +#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494 +#: sql_help.c:4495 msgid "object_name" msgstr "object_name" -#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454 +#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467 msgid "aggregate_name" msgstr "aggregate_name" -#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 -#: sql_help.c:2137 sql_help.c:3357 +#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139 +#: sql_help.c:2141 sql_help.c:3365 msgid "source_type" msgstr "source_type" -#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 -#: sql_help.c:2138 sql_help.c:3358 +#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140 +#: sql_help.c:2142 sql_help.c:3366 msgid "target_type" msgstr "source_type" -#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 -#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 -#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577 -#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834 -#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072 -#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137 +#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557 +#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590 +#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847 +#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093 +#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104 msgid "function_name" msgstr "function_name" -#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550 msgid "operator_name" msgstr "operator_name" -#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 -#: sql_help.c:2519 sql_help.c:3481 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873 +#: sql_help.c:2527 sql_help.c:3489 msgid "left_type" msgstr "source_type" -#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 -#: sql_help.c:2520 sql_help.c:3482 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874 +#: sql_help.c:2528 sql_help.c:3490 msgid "right_type" msgstr "source_type" #: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 #: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 -#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539 -#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 +#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547 +#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508 msgid "index_method" msgstr "source_type" -#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467 +#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480 msgid "procedure_name" msgstr "procedure_name" -#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473 +#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486 msgid "routine_name" msgstr "routine_name" -#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 -#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 -#: sql_help.c:3926 sql_help.c:4375 +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402 +#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670 +#: sql_help.c:3936 sql_help.c:4388 msgid "type_name" msgstr "type_name" -#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 -#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 -#: sql_help.c:4360 +#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607 +#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921 +#: sql_help.c:4373 msgid "lang_name" msgstr "lang_name" @@ -4331,11 +4404,11 @@ msgstr "lang_name" msgid "and aggregate_signature is:" msgstr "και aggregate_signature είναι:" -#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 +#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283 msgid "handler_function" msgstr "handler_function" -#: sql_help.c:396 sql_help.c:2276 +#: sql_help.c:396 sql_help.c:2284 msgid "validator_function" msgstr "validator_function" @@ -4354,21 +4427,21 @@ msgstr "action" #: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 #: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422 #: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683 -#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851 -#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984 -#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 -#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 -#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 -#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 -#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 -#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 -#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 -#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 -#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 -#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614 -#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877 -#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924 -#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117 +#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853 +#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1987 sql_help.c:1988 +#: sql_help.c:1989 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399 +#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637 +#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895 +#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927 +#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963 +#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986 +#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893 +#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007 +#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099 +#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627 +#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890 +#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937 +#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138 msgid "column_name" msgstr "column_name" @@ -4382,25 +4455,25 @@ msgid "where action is one of:" msgstr "όπου action είναι ένα από:" #: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330 -#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229 -#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 -#: sql_help.c:3167 sql_help.c:4141 +#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237 +#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896 +#: sql_help.c:3175 sql_help.c:4151 msgid "data_type" msgstr "data_type" #: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336 -#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329 -#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 -#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 +#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337 +#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919 +#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000 msgid "collation" msgstr "collation" -#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 -#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347 +#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928 msgid "column_constraint" msgstr "column_constraint" -#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986 msgid "integer" msgstr "integer" @@ -4409,67 +4482,67 @@ msgstr "integer" msgid "attribute_option" msgstr "attribute_option" -#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 -#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348 +#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929 msgid "table_constraint" msgstr "table_constraint" #: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364 -#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905 +#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907 msgid "trigger_name" msgstr "trigger_name" #: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 -#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 +#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926 msgid "parent_table" msgstr "parent_table" #: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 -#: sql_help.c:1550 sql_help.c:2261 +#: sql_help.c:1550 sql_help.c:2269 msgid "extension_name" msgstr "extension_name" -#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403 msgid "execution_cost" msgstr "execution_cost" -#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404 msgid "result_rows" msgstr "result_rows" -#: sql_help.c:547 sql_help.c:2397 +#: sql_help.c:547 sql_help.c:2405 msgid "support_function" msgstr "support_function" #: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 #: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641 -#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709 -#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 -#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 -#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896 -#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902 -#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912 -#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 -#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 -#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 -#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 -#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 -#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348 -#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358 -#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 -#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 -#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 -#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 +#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717 +#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891 +#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900 +#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906 +#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922 +#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928 +#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934 +#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940 +#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348 +#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355 +#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361 +#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371 +#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377 +#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383 +#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389 +#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393 msgid "role_specification" msgstr "role_specification" -#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 -#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205 +#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720 msgid "user_name" msgstr "user_name" -#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 -#: sql_help.c:3932 sql_help.c:4381 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724 +#: sql_help.c:3942 sql_help.c:4394 msgid "where role_specification can be:" msgstr "όπου role_specification μποÏεί να είναι:" @@ -4477,22 +4550,22 @@ msgstr "όπου role_specification μποÏεί να είναι:" msgid "group_name" msgstr "group_name" -#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 -#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 -#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 -#: sql_help.c:4372 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476 +#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938 +#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933 +#: sql_help.c:4385 msgid "tablespace_name" msgstr "group_name" #: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382 -#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783 +#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785 msgid "index_name" msgstr "index_name" #: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375 -#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500 -#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 -#: sql_help.c:2996 +#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508 +#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977 +#: sql_help.c:3004 msgid "storage_parameter" msgstr "storage_parameter" @@ -4500,11 +4573,11 @@ msgstr "storage_parameter" msgid "column_number" msgstr "column_number" -#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464 +#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477 msgid "large_object_oid" msgstr "large_object_oid" -#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897 msgid "compression_method" msgstr "compression_method" @@ -4512,104 +4585,104 @@ msgstr "compression_method" msgid "new_access_method" msgstr "new_access_method" -#: sql_help.c:725 sql_help.c:2523 +#: sql_help.c:725 sql_help.c:2531 msgid "res_proc" msgstr "res_proc" -#: sql_help.c:726 sql_help.c:2524 +#: sql_help.c:726 sql_help.c:2532 msgid "join_proc" msgstr "join_proc" -#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2549 msgid "strategy_number" msgstr "strategy_number" #: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 -#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544 -#: sql_help.c:2547 sql_help.c:2548 +#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552 +#: sql_help.c:2555 sql_help.c:2556 msgid "op_type" msgstr "op_type" -#: sql_help.c:782 sql_help.c:2545 +#: sql_help.c:782 sql_help.c:2553 msgid "sort_family_name" msgstr "index_name" -#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2554 msgid "support_number" msgstr "support_number" -#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 -#: sql_help.c:3089 +#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095 +#: sql_help.c:3097 msgid "argument_type" msgstr "argument_type" #: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 -#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779 -#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891 -#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324 -#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 -#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 -#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 -#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 -#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885 -#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334 -#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627 -#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884 -#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060 -#: sql_help.c:5122 +#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781 +#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893 +#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332 +#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582 +#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778 +#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925 +#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525 +#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895 +#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347 +#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640 +#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897 +#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081 +#: sql_help.c:5143 msgid "table_name" msgstr "table_name" -#: sql_help.c:823 sql_help.c:2576 +#: sql_help.c:823 sql_help.c:2584 msgid "using_expression" msgstr "using_expression" -#: sql_help.c:824 sql_help.c:2577 +#: sql_help.c:824 sql_help.c:2585 msgid "check_expression" msgstr "check_expression" -#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632 msgid "publication_object" msgstr "publication_object" -#: sql_help.c:903 sql_help.c:2625 +#: sql_help.c:903 sql_help.c:2633 msgid "publication_parameter" msgstr "publication_parameter" -#: sql_help.c:909 sql_help.c:2627 +#: sql_help.c:909 sql_help.c:2635 msgid "where publication_object is one of:" msgstr "όπου publication_object είναι ένα από:" -#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 -#: sql_help.c:3228 +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670 +#: sql_help.c:3236 msgid "password" msgstr "password" -#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 -#: sql_help.c:3229 +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671 +#: sql_help.c:3237 msgid "timestamp" msgstr "timestamp" #: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642 -#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892 -#: sql_help.c:4341 +#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902 +#: sql_help.c:4354 msgid "database_name" msgstr "database_name" -#: sql_help.c:1073 sql_help.c:2732 +#: sql_help.c:1073 sql_help.c:2740 msgid "increment" msgstr "increment" -#: sql_help.c:1074 sql_help.c:2733 +#: sql_help.c:1074 sql_help.c:2741 msgid "minvalue" msgstr "minvalue" -#: sql_help.c:1075 sql_help.c:2734 +#: sql_help.c:1075 sql_help.c:2742 msgid "maxvalue" msgstr "maxvalue" -#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664 -#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 +#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677 +#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077 msgid "start" msgstr "start" @@ -4617,7 +4690,7 @@ msgstr "start" msgid "restart" msgstr "restart" -#: sql_help.c:1078 sql_help.c:2736 +#: sql_help.c:1078 sql_help.c:2744 msgid "cache" msgstr "cache" @@ -4625,11 +4698,11 @@ msgstr "cache" msgid "new_target" msgstr "new_target" -#: sql_help.c:1142 sql_help.c:2789 +#: sql_help.c:1142 sql_help.c:2797 msgid "conninfo" msgstr "conninfo" -#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798 msgid "publication_name" msgstr "publication_name" @@ -4641,7 +4714,7 @@ msgstr "publication_option" msgid "refresh_option" msgstr "refresh_option" -#: sql_help.c:1161 sql_help.c:2791 +#: sql_help.c:1161 sql_help.c:2799 msgid "subscription_parameter" msgstr "subscription_parameter" @@ -4653,11 +4726,11 @@ msgstr "skip_option" msgid "partition_name" msgstr "partition_name" -#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 +#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930 msgid "partition_bound_spec" msgstr "partition_bound_spec" -#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944 msgid "sequence_options" msgstr "sequence_options" @@ -4673,18 +4746,18 @@ msgstr "table_constraint_using_index" msgid "rewrite_rule_name" msgstr "rewrite_rule_name" -#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 +#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969 msgid "and partition_bound_spec is:" msgstr "και partition_bound_spec είναι:" -#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 -#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 -#: sql_help.c:2964 +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362 +#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971 +#: sql_help.c:2972 msgid "partition_bound_expr" msgstr "partition_bound_expr" -#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 -#: sql_help.c:2965 sql_help.c:2966 +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366 +#: sql_help.c:2973 sql_help.c:2974 msgid "numeric_literal" msgstr "numeric_literal" @@ -4692,48 +4765,48 @@ msgstr "numeric_literal" msgid "and column_constraint is:" msgstr "και column_constraint είναι:" -#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 -#: sql_help.c:2934 +#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606 +#: sql_help.c:2942 msgid "default_expr" msgstr "default_expr" -#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 +#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943 msgid "generation_expr" msgstr "generation_expr" #: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 -#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 -#: sql_help.c:2949 sql_help.c:2953 +#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955 +#: sql_help.c:2957 sql_help.c:2961 msgid "index_parameters" msgstr "index_parameters" -#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964 msgid "reftable" msgstr "reftable" -#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965 msgid "refcolumn" msgstr "refcolumn" #: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 -#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 +#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967 msgid "referential_action" msgstr "referential_action" -#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 +#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951 msgid "and table_constraint is:" msgstr "και table_constraint είναι:" -#: sql_help.c:1409 sql_help.c:2951 +#: sql_help.c:1409 sql_help.c:2959 msgid "exclude_element" msgstr "exclude_element" -#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662 -#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054 +#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675 +#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075 msgid "operator" msgstr "operator" -#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 +#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962 msgid "predicate" msgstr "predicate" @@ -4741,24 +4814,24 @@ msgstr "predicate" msgid "and table_constraint_using_index is:" msgstr "και table_constraint_using_index είναι:" -#: sql_help.c:1421 sql_help.c:2967 +#: sql_help.c:1421 sql_help.c:2975 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "index_parameters για πεÏιοÏισμοÏÏ‚ UNIQUE, PRIMARY KEY και EXCLUDE είναι:" -#: sql_help.c:1426 sql_help.c:2972 +#: sql_help.c:1426 sql_help.c:2980 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "exclude_element σε έναν πεÏιοÏισμό Ï„Ïπου EXCLUDE είναι:" -#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 -#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 +#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920 +#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001 msgid "opclass" msgstr "opclass" -#: sql_help.c:1430 sql_help.c:2976 +#: sql_help.c:1430 sql_help.c:2984 msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" msgstr "referential_action σε ένα πεÏιοÏισμό FOREIGN KEY/REFERENCES είναι:" -#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013 +#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021 msgid "tablespace_option" msgstr "tablespace_option" @@ -4779,7 +4852,7 @@ msgid "new_dictionary" msgstr "new_dictionary" #: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 -#: sql_help.c:3166 +#: sql_help.c:3174 msgid "attribute_name" msgstr "attribute_name" @@ -4803,1574 +4876,1591 @@ msgstr "existing_enum_value" msgid "property" msgstr "property" -#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 -#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 -#: sql_help.c:4350 +#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756 +#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957 +#: sql_help.c:4363 msgid "server_name" msgstr "server_name" -#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269 msgid "view_option_name" msgstr "view_option_name" -#: sql_help.c:1698 sql_help.c:3262 +#: sql_help.c:1698 sql_help.c:3270 msgid "view_option_value" msgstr "view_option_value" -#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958 +#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975 msgid "table_and_columns" msgstr "table_and_columns" -#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 -#: sql_help.c:4185 sql_help.c:4959 +#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754 +#: sql_help.c:4198 sql_help.c:4976 msgid "where option can be one of:" msgstr "όπου option μποÏεί να είναι ένα από:" -#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 -#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 -#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 -#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 -#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 -#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 +#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980 +#: sql_help.c:1984 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756 +#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760 +#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199 +#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979 +#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983 +#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988 msgid "boolean" msgstr "boolean" -#: sql_help.c:1724 sql_help.c:4969 +#: sql_help.c:1725 sql_help.c:4989 +msgid "size" +msgstr "μέγεθος" + +#: sql_help.c:1726 sql_help.c:4990 msgid "and table_and_columns is:" msgstr "και table_and_columns είναι:" -#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749 +#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762 msgid "transaction_mode" msgstr "transaction_mode" -#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750 +#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763 msgid "where transaction_mode is one of:" msgstr "όπου transaction_mode είναι ένα από:" -#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582 -#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835 -#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064 -#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084 +#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595 +#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848 +#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085 +#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105 msgid "argument" msgstr "argument" -#: sql_help.c:1850 +#: sql_help.c:1852 msgid "relation_name" msgstr "relation_name" -#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344 +#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357 msgid "domain_name" msgstr "domain_name" -#: sql_help.c:1877 +#: sql_help.c:1879 msgid "policy_name" msgstr "policy_name" -#: sql_help.c:1890 +#: sql_help.c:1892 msgid "rule_name" msgstr "rule_name" -#: sql_help.c:1909 sql_help.c:4483 +#: sql_help.c:1911 sql_help.c:4496 msgid "string_literal" msgstr "string_literal" -#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 +#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410 msgid "transaction_id" msgstr "transaction_id" -#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017 +#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027 msgid "filename" msgstr "filename" -#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 -#: sql_help.c:2689 +#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696 +#: sql_help.c:2697 msgid "command" msgstr "command" -#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 -#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552 -#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809 -#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049 +#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305 +#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565 +#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822 +#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070 msgid "condition" msgstr "condition" -#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 -#: sql_help.c:3281 sql_help.c:3982 +#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271 +#: sql_help.c:3289 sql_help.c:3992 msgid "query" msgstr "query" -#: sql_help.c:1976 +#: sql_help.c:1979 msgid "format_name" msgstr "format_name" -#: sql_help.c:1978 +#: sql_help.c:1981 msgid "delimiter_character" msgstr "delimiter_character" -#: sql_help.c:1979 +#: sql_help.c:1982 msgid "null_string" msgstr "null_string" -#: sql_help.c:1981 +#: sql_help.c:1983 +msgid "default_string" +msgstr "default_string" + +#: sql_help.c:1985 msgid "quote_character" msgstr "quote_character" -#: sql_help.c:1982 +#: sql_help.c:1986 msgid "escape_character" msgstr "escape_character" -#: sql_help.c:1986 +#: sql_help.c:1990 msgid "encoding_name" msgstr "encoding_name" -#: sql_help.c:1997 +#: sql_help.c:2001 msgid "access_method_type" msgstr "access_method_type" -#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 +#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094 msgid "arg_data_type" msgstr "arg_data_type" -#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 +#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103 msgid "sfunc" msgstr "sfunc" -#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 +#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104 msgid "state_data_type" msgstr "state_data_type" -#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 +#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105 msgid "state_data_size" msgstr "state_data_size" -#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 +#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106 msgid "ffunc" msgstr "ffunc" -#: sql_help.c:2073 sql_help.c:2103 +#: sql_help.c:2077 sql_help.c:2107 msgid "combinefunc" msgstr "combinefunc" -#: sql_help.c:2074 sql_help.c:2104 +#: sql_help.c:2078 sql_help.c:2108 msgid "serialfunc" msgstr "serialfunc" -#: sql_help.c:2075 sql_help.c:2105 +#: sql_help.c:2079 sql_help.c:2109 msgid "deserialfunc" msgstr "deserialfunc" -#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 +#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110 msgid "initial_condition" msgstr "initial_condition" -#: sql_help.c:2077 sql_help.c:2107 +#: sql_help.c:2081 sql_help.c:2111 msgid "msfunc" msgstr "msfunc" -#: sql_help.c:2078 sql_help.c:2108 +#: sql_help.c:2082 sql_help.c:2112 msgid "minvfunc" msgstr "minvfunc" -#: sql_help.c:2079 sql_help.c:2109 +#: sql_help.c:2083 sql_help.c:2113 msgid "mstate_data_type" msgstr "mstate_data_type" -#: sql_help.c:2080 sql_help.c:2110 +#: sql_help.c:2084 sql_help.c:2114 msgid "mstate_data_size" msgstr "mstate_data_size" -#: sql_help.c:2081 sql_help.c:2111 +#: sql_help.c:2085 sql_help.c:2115 msgid "mffunc" msgstr "mffunc" -#: sql_help.c:2082 sql_help.c:2112 +#: sql_help.c:2086 sql_help.c:2116 msgid "minitial_condition" msgstr "minitial_condition" -#: sql_help.c:2083 sql_help.c:2113 +#: sql_help.c:2087 sql_help.c:2117 msgid "sort_operator" msgstr "sort_operator" -#: sql_help.c:2096 +#: sql_help.c:2100 msgid "or the old syntax" msgstr "ή την παλαιά σÏνταξη" -#: sql_help.c:2098 +#: sql_help.c:2102 msgid "base_type" msgstr "base_type" -#: sql_help.c:2155 sql_help.c:2202 +#: sql_help.c:2160 sql_help.c:2209 msgid "locale" msgstr "locale" -#: sql_help.c:2156 sql_help.c:2203 +#: sql_help.c:2161 sql_help.c:2210 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2157 sql_help.c:2204 +#: sql_help.c:2162 sql_help.c:2211 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2158 sql_help.c:4450 +#: sql_help.c:2163 sql_help.c:4463 msgid "provider" msgstr "provider" -#: sql_help.c:2160 sql_help.c:2263 +#: sql_help.c:2165 +msgid "rules" +msgstr "κανόνες" + +#: sql_help.c:2166 sql_help.c:2271 msgid "version" msgstr "version" -#: sql_help.c:2162 +#: sql_help.c:2168 msgid "existing_collation" msgstr "existing_collation" -#: sql_help.c:2172 +#: sql_help.c:2178 msgid "source_encoding" msgstr "source_encoding" -#: sql_help.c:2173 +#: sql_help.c:2179 msgid "dest_encoding" msgstr "dest_encoding" -#: sql_help.c:2199 sql_help.c:3039 +#: sql_help.c:2206 sql_help.c:3047 msgid "template" msgstr "template" -#: sql_help.c:2200 +#: sql_help.c:2207 msgid "encoding" msgstr "dest_encoding" -#: sql_help.c:2201 +#: sql_help.c:2208 msgid "strategy" msgstr "strategy" -#: sql_help.c:2205 +#: sql_help.c:2212 msgid "icu_locale" msgstr "icu_locale" -#: sql_help.c:2206 +#: sql_help.c:2213 +msgid "icu_rules" +msgstr "icu_rules" + +#: sql_help.c:2214 msgid "locale_provider" msgstr "locale_provider" -#: sql_help.c:2207 +#: sql_help.c:2215 msgid "collation_version" msgstr "collation_version" -#: sql_help.c:2212 +#: sql_help.c:2220 msgid "oid" msgstr "oid" -#: sql_help.c:2232 +#: sql_help.c:2240 msgid "constraint" msgstr "constraint" -#: sql_help.c:2233 +#: sql_help.c:2241 msgid "where constraint is:" msgstr "όπου constraint είναι:" -#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 +#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120 msgid "event" msgstr "event" -#: sql_help.c:2248 +#: sql_help.c:2256 msgid "filter_variable" msgstr "filter_variable" -#: sql_help.c:2249 +#: sql_help.c:2257 msgid "filter_value" msgstr "filter_value" -#: sql_help.c:2345 sql_help.c:2931 +#: sql_help.c:2353 sql_help.c:2939 msgid "where column_constraint is:" msgstr "όπου column_constraint είναι:" -#: sql_help.c:2390 +#: sql_help.c:2398 msgid "rettype" msgstr "rettype" -#: sql_help.c:2392 +#: sql_help.c:2400 msgid "column_type" msgstr "column_type" -#: sql_help.c:2401 sql_help.c:2604 +#: sql_help.c:2409 sql_help.c:2612 msgid "definition" msgstr "definition" -#: sql_help.c:2402 sql_help.c:2605 +#: sql_help.c:2410 sql_help.c:2613 msgid "obj_file" msgstr "obj_file" -#: sql_help.c:2403 sql_help.c:2606 +#: sql_help.c:2411 sql_help.c:2614 msgid "link_symbol" msgstr "link_symbol" -#: sql_help.c:2404 sql_help.c:2607 +#: sql_help.c:2412 sql_help.c:2615 msgid "sql_body" msgstr "sql_body" -#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 +#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243 msgid "uid" msgstr "uid" -#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 -#: sql_help.c:2927 sql_help.c:2995 +#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921 +#: sql_help.c:2935 sql_help.c:3003 msgid "method" msgstr "method" -#: sql_help.c:2463 +#: sql_help.c:2471 msgid "opclass_parameter" msgstr "opclass_parameter" -#: sql_help.c:2480 +#: sql_help.c:2488 msgid "call_handler" msgstr "call_handler" -#: sql_help.c:2481 +#: sql_help.c:2489 msgid "inline_handler" msgstr "inline_handler" -#: sql_help.c:2482 +#: sql_help.c:2490 msgid "valfunction" msgstr "valfunction" -#: sql_help.c:2521 +#: sql_help.c:2529 msgid "com_op" msgstr "com_op" -#: sql_help.c:2522 +#: sql_help.c:2530 msgid "neg_op" msgstr "neg_op" -#: sql_help.c:2540 +#: sql_help.c:2548 msgid "family_name" msgstr "family_name" -#: sql_help.c:2551 +#: sql_help.c:2559 msgid "storage_type" msgstr "storage_type" -#: sql_help.c:2690 sql_help.c:3119 +#: sql_help.c:2698 sql_help.c:3127 msgid "where event can be one of:" msgstr "όπου event μποÏεί να είναι ένα από:" -#: sql_help.c:2710 sql_help.c:2712 +#: sql_help.c:2718 sql_help.c:2720 msgid "schema_element" msgstr "schema_element" -#: sql_help.c:2749 +#: sql_help.c:2757 msgid "server_type" msgstr "server_type" -#: sql_help.c:2750 +#: sql_help.c:2758 msgid "server_version" msgstr "server_version" -#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 +#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360 msgid "fdw_name" msgstr "fdw_name" -#: sql_help.c:2768 sql_help.c:2771 +#: sql_help.c:2776 sql_help.c:2779 msgid "statistics_name" msgstr "statistics_name" -#: sql_help.c:2772 +#: sql_help.c:2780 msgid "statistics_kind" msgstr "statistics_kind" -#: sql_help.c:2788 +#: sql_help.c:2796 msgid "subscription_name" msgstr "subscription_name" -#: sql_help.c:2893 +#: sql_help.c:2901 msgid "source_table" msgstr "source_table" -#: sql_help.c:2894 +#: sql_help.c:2902 msgid "like_option" msgstr "like_option" -#: sql_help.c:2960 +#: sql_help.c:2968 msgid "and like_option is:" msgstr "και like_option είναι:" -#: sql_help.c:3012 +#: sql_help.c:3020 msgid "directory" msgstr "directory" -#: sql_help.c:3026 +#: sql_help.c:3034 msgid "parser_name" msgstr "parser_name" -#: sql_help.c:3027 +#: sql_help.c:3035 msgid "source_config" msgstr "source_config" -#: sql_help.c:3056 +#: sql_help.c:3064 msgid "start_function" msgstr "start_function" -#: sql_help.c:3057 +#: sql_help.c:3065 msgid "gettoken_function" msgstr "gettoken_function" -#: sql_help.c:3058 +#: sql_help.c:3066 msgid "end_function" msgstr "end_function" -#: sql_help.c:3059 +#: sql_help.c:3067 msgid "lextypes_function" msgstr "lextypes_function" -#: sql_help.c:3060 +#: sql_help.c:3068 msgid "headline_function" msgstr "headline_function" -#: sql_help.c:3072 +#: sql_help.c:3080 msgid "init_function" msgstr "init_function" -#: sql_help.c:3073 +#: sql_help.c:3081 msgid "lexize_function" msgstr "lexize_function" -#: sql_help.c:3086 +#: sql_help.c:3094 msgid "from_sql_function_name" msgstr "from_sql_function_name" -#: sql_help.c:3088 +#: sql_help.c:3096 msgid "to_sql_function_name" msgstr "to_sql_function_name" -#: sql_help.c:3114 +#: sql_help.c:3122 msgid "referenced_table_name" msgstr "referenced_table_name" -#: sql_help.c:3115 +#: sql_help.c:3123 msgid "transition_relation_name" msgstr "transition_relation_name" -#: sql_help.c:3118 +#: sql_help.c:3126 msgid "arguments" msgstr "arguments" -#: sql_help.c:3170 +#: sql_help.c:3178 msgid "label" msgstr "label" -#: sql_help.c:3172 +#: sql_help.c:3180 msgid "subtype" msgstr "subtype" -#: sql_help.c:3173 +#: sql_help.c:3181 msgid "subtype_operator_class" msgstr "subtype_operator_class" -#: sql_help.c:3175 +#: sql_help.c:3183 msgid "canonical_function" msgstr "canonical_function" -#: sql_help.c:3176 +#: sql_help.c:3184 msgid "subtype_diff_function" msgstr "subtype_diff_function" -#: sql_help.c:3177 +#: sql_help.c:3185 msgid "multirange_type_name" msgstr "multirange_type_name" -#: sql_help.c:3179 +#: sql_help.c:3187 msgid "input_function" msgstr "input_function" -#: sql_help.c:3180 +#: sql_help.c:3188 msgid "output_function" msgstr "output_function" -#: sql_help.c:3181 +#: sql_help.c:3189 msgid "receive_function" msgstr "receive_function" -#: sql_help.c:3182 +#: sql_help.c:3190 msgid "send_function" msgstr "send_function" -#: sql_help.c:3183 +#: sql_help.c:3191 msgid "type_modifier_input_function" msgstr "type_modifier_input_function" -#: sql_help.c:3184 +#: sql_help.c:3192 msgid "type_modifier_output_function" msgstr "type_modifier_output_function" -#: sql_help.c:3185 +#: sql_help.c:3193 msgid "analyze_function" msgstr "analyze_function" -#: sql_help.c:3186 +#: sql_help.c:3194 msgid "subscript_function" msgstr "subscript_function" -#: sql_help.c:3187 +#: sql_help.c:3195 msgid "internallength" msgstr "internallength" -#: sql_help.c:3188 +#: sql_help.c:3196 msgid "alignment" msgstr "alignment" -#: sql_help.c:3189 +#: sql_help.c:3197 msgid "storage" msgstr "storage" -#: sql_help.c:3190 +#: sql_help.c:3198 msgid "like_type" msgstr "like_type" -#: sql_help.c:3191 +#: sql_help.c:3199 msgid "category" msgstr "category" -#: sql_help.c:3192 +#: sql_help.c:3200 msgid "preferred" msgstr "preferred" -#: sql_help.c:3193 +#: sql_help.c:3201 msgid "default" msgstr "default" -#: sql_help.c:3194 +#: sql_help.c:3202 msgid "element" msgstr "element" -#: sql_help.c:3195 +#: sql_help.c:3203 msgid "delimiter" msgstr "delimiter" -#: sql_help.c:3196 +#: sql_help.c:3204 msgid "collatable" msgstr "collatable" -#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547 -#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042 +#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560 +#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063 msgid "with_query" msgstr "with_query" -#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572 -#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591 -#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836 -#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061 -#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078 -#: sql_help.c:5086 +#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585 +#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604 +#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849 +#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082 +#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099 +#: sql_help.c:5107 msgid "alias" msgstr "alias" -#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595 -#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603 -#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852 -#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860 -#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090 -#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098 +#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608 +#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616 +#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865 +#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873 +#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111 +#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119 msgid "from_item" msgstr "from_item" -#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928 +#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941 msgid "cursor_name" msgstr "cursor_name" -#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929 +#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942 msgid "output_expression" msgstr "output_expression" -#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652 -#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045 +#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665 +#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066 msgid "output_name" msgstr "output_name" -#: sql_help.c:3316 +#: sql_help.c:3324 msgid "code" msgstr "code" -#: sql_help.c:3721 +#: sql_help.c:3729 msgid "parameter" msgstr "parameter" -#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 +#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152 msgid "statement" msgstr "statement" -#: sql_help.c:3778 sql_help.c:4116 +#: sql_help.c:3788 sql_help.c:4126 msgid "direction" msgstr "direction" -#: sql_help.c:3780 sql_help.c:4118 +#: sql_help.c:3790 sql_help.c:4128 msgid "where direction can be one of:" msgstr "όπου κατεÏθυνση μποÏεί να είναι μία από:" -#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 -#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 -#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562 -#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819 -#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057 +#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794 +#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131 +#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575 +#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832 +#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078 msgid "count" msgstr "count" -#: sql_help.c:3888 sql_help.c:4337 +#: sql_help.c:3898 sql_help.c:4350 msgid "sequence_name" msgstr "sequence_name" -#: sql_help.c:3906 sql_help.c:4355 +#: sql_help.c:3916 sql_help.c:4368 msgid "arg_name" msgstr "arg_name" -#: sql_help.c:3907 sql_help.c:4356 +#: sql_help.c:3917 sql_help.c:4369 msgid "arg_type" msgstr "arg_type" -#: sql_help.c:3914 sql_help.c:4363 +#: sql_help.c:3924 sql_help.c:4376 msgid "loid" msgstr "loid" -#: sql_help.c:3945 +#: sql_help.c:3955 msgid "remote_schema" msgstr "remote_schema" -#: sql_help.c:3948 +#: sql_help.c:3958 msgid "local_schema" msgstr "local_schema" -#: sql_help.c:3983 +#: sql_help.c:3993 msgid "conflict_target" msgstr "conflict_target" -#: sql_help.c:3984 +#: sql_help.c:3994 msgid "conflict_action" msgstr "conflict_action" -#: sql_help.c:3987 +#: sql_help.c:3997 msgid "where conflict_target can be one of:" msgstr "όπου conflict_target μποÏεί να είναι ένα από:" -#: sql_help.c:3988 +#: sql_help.c:3998 msgid "index_column_name" msgstr "index_column_name" -#: sql_help.c:3989 +#: sql_help.c:3999 msgid "index_expression" msgstr "index_expression" -#: sql_help.c:3992 +#: sql_help.c:4002 msgid "index_predicate" msgstr "index_predicate" -#: sql_help.c:3994 +#: sql_help.c:4004 msgid "and conflict_action is one of:" msgstr "και conflict_action είναι ένα από:" -#: sql_help.c:4000 sql_help.c:4925 +#: sql_help.c:4010 sql_help.c:4938 msgid "sub-SELECT" msgstr "sub-SELECT" -#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901 +#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914 msgid "channel" msgstr "channel" -#: sql_help.c:4031 +#: sql_help.c:4041 msgid "lockmode" msgstr "lockmode" -#: sql_help.c:4032 +#: sql_help.c:4042 msgid "where lockmode is one of:" msgstr "όπου lockmode είναι ένα από:" -#: sql_help.c:4068 +#: sql_help.c:4078 msgid "target_table_name" msgstr "table_table_name" -#: sql_help.c:4069 +#: sql_help.c:4079 msgid "target_alias" msgstr "target_alias" -#: sql_help.c:4070 +#: sql_help.c:4080 msgid "data_source" msgstr "data_source" -#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 +#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112 msgid "join_condition" msgstr "join_condition" -#: sql_help.c:4072 +#: sql_help.c:4082 msgid "when_clause" msgstr "when_clause" -#: sql_help.c:4073 +#: sql_help.c:4083 msgid "where data_source is:" msgstr "όπου data_source είναι:" -#: sql_help.c:4074 +#: sql_help.c:4084 msgid "source_table_name" msgstr "source_table_name" -#: sql_help.c:4075 +#: sql_help.c:4085 msgid "source_query" msgstr "source_query" -#: sql_help.c:4076 +#: sql_help.c:4086 msgid "source_alias" msgstr "source_alias" -#: sql_help.c:4077 +#: sql_help.c:4087 msgid "and when_clause is:" msgstr "και when_clause είναι:" -#: sql_help.c:4079 +#: sql_help.c:4089 msgid "merge_update" msgstr "merge_update" -#: sql_help.c:4080 +#: sql_help.c:4090 msgid "merge_delete" msgstr "merge_delete" -#: sql_help.c:4082 +#: sql_help.c:4092 msgid "merge_insert" msgstr "merge_insert" -#: sql_help.c:4083 +#: sql_help.c:4093 msgid "and merge_insert is:" msgstr "και merge_insert είναι:" -#: sql_help.c:4086 +#: sql_help.c:4096 msgid "and merge_update is:" msgstr "και merge_update είναι:" -#: sql_help.c:4091 +#: sql_help.c:4101 msgid "and merge_delete is:" msgstr "και merge_delete είναι:" -#: sql_help.c:4132 +#: sql_help.c:4142 msgid "payload" msgstr "payload" -#: sql_help.c:4159 +#: sql_help.c:4169 msgid "old_role" msgstr "old_role" -#: sql_help.c:4160 +#: sql_help.c:4170 msgid "new_role" msgstr "new_role" -#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 +#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426 msgid "savepoint_name" msgstr "savepoint_name" -#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868 -#: sql_help.c:5048 sql_help.c:5106 +#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881 +#: sql_help.c:5069 sql_help.c:5127 msgid "grouping_element" msgstr "grouping_element" -#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 +#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071 msgid "window_name" msgstr "window_name" -#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051 +#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072 msgid "window_definition" msgstr "window_definition" -#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660 -#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052 -#: sql_help.c:5066 sql_help.c:5110 +#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673 +#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073 +#: sql_help.c:5087 sql_help.c:5131 msgid "select" msgstr "select" -#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059 +#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080 msgid "where from_item can be one of:" msgstr "όπου from_item μποÏεί να είναι ένα από:" -#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580 -#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833 -#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068 -#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087 +#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593 +#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846 +#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089 +#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108 msgid "column_alias" msgstr "column_alias" -#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063 +#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084 msgid "sampling_method" msgstr "sampling_method" -#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 +#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086 msgid "seed" msgstr "seed" -#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870 -#: sql_help.c:5069 sql_help.c:5108 +#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883 +#: sql_help.c:5090 sql_help.c:5129 msgid "with_query_name" msgstr "with_query_name" -#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841 -#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082 -#: sql_help.c:5085 +#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854 +#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103 +#: sql_help.c:5106 msgid "column_definition" msgstr "column_definition" -#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857 -#: sql_help.c:5089 sql_help.c:5095 +#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870 +#: sql_help.c:5110 sql_help.c:5116 msgid "join_type" msgstr "join_type" -#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 +#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113 msgid "join_column" msgstr "join_column" -#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 +#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114 msgid "join_using_alias" msgstr "join_using_alias" -#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099 +#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120 msgid "and grouping_element can be one of:" msgstr "και grouping_element μποÏεί να είναι ένα από:" -#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107 +#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128 msgid "and with_query is:" msgstr "και with_query είναι:" -#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 +#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132 msgid "values" msgstr "values" -#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 +#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133 msgid "insert" msgstr "insert" -#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 +#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134 msgid "update" msgstr "update" -#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 +#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135 msgid "delete" msgstr "delete" -#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 +#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137 msgid "search_seq_col_name" msgstr "search_seq_col_name" -#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 +#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139 msgid "cycle_mark_col_name" msgstr "cycle_mark_col_name" -#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 +#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140 msgid "cycle_mark_value" msgstr "cycle_mark_value" -#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 +#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141 msgid "cycle_mark_default" msgstr "cycle_mark_default" -#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 +#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142 msgid "cycle_path_col_name" msgstr "cycle_path_col_name" -#: sql_help.c:4653 +#: sql_help.c:4666 msgid "new_table" msgstr "new_table" -#: sql_help.c:4724 +#: sql_help.c:4737 msgid "snapshot_id" msgstr "snapshot_id" -#: sql_help.c:4984 +#: sql_help.c:5005 msgid "sort_expression" msgstr "sort_expression" -#: sql_help.c:5128 sql_help.c:6112 +#: sql_help.c:5149 sql_help.c:6133 msgid "abort the current transaction" msgstr "ματαιώστε την Ï„Ïέχουσα συναλλαγή" -#: sql_help.c:5134 +#: sql_help.c:5155 msgid "change the definition of an aggregate function" msgstr "αλλάξτε τον οÏισμό μιας συνάÏτησης συγκεντÏωτικών αποτελεσμάτων" -#: sql_help.c:5140 +#: sql_help.c:5161 msgid "change the definition of a collation" msgstr "αλλάξτε τον οÏισμό συÏÏαφής" -#: sql_help.c:5146 +#: sql_help.c:5167 msgid "change the definition of a conversion" msgstr "αλλάξτε τον οÏισμό μίας μετατÏοπής" -#: sql_help.c:5152 +#: sql_help.c:5173 msgid "change a database" msgstr "αλλάξτε μία βάση δεδομένων" -#: sql_help.c:5158 +#: sql_help.c:5179 msgid "define default access privileges" msgstr "οÏίσθε τα Ï€Ïοεπιλεγμένα δικαιώματα Ï€Ïόσβασης" -#: sql_help.c:5164 +#: sql_help.c:5185 msgid "change the definition of a domain" msgstr "αλλάξτε τον οÏισμό ενός τομέα" -#: sql_help.c:5170 +#: sql_help.c:5191 msgid "change the definition of an event trigger" msgstr "αλλάξτε τον οÏισμό μιας ενεÏγοποίησης συμβάντος" -#: sql_help.c:5176 +#: sql_help.c:5197 msgid "change the definition of an extension" msgstr "αλλάξτε τον οÏισμό μίας Ï€Ïοέκτασης" -#: sql_help.c:5182 +#: sql_help.c:5203 msgid "change the definition of a foreign-data wrapper" msgstr "αλλάξτε τον οÏισιμό μιας πεÏιτÏλιξης ξένων δεδομένων" -#: sql_help.c:5188 +#: sql_help.c:5209 msgid "change the definition of a foreign table" msgstr "αλλάξτε τον οÏισιμό ενός Î¾ÎµÎ½Î¹ÎºÎ¿Ï Ï€Î¯Î½Î±ÎºÎ±" -#: sql_help.c:5194 +#: sql_help.c:5215 msgid "change the definition of a function" msgstr "αλλάξτε τον οÏισμό μιας συνάÏτησης" -#: sql_help.c:5200 +#: sql_help.c:5221 msgid "change role name or membership" msgstr "αλλάξτε το όνομα Ïόλου ή ιδιότητας μέλους" -#: sql_help.c:5206 +#: sql_help.c:5227 msgid "change the definition of an index" msgstr "αλλάξτε τον οÏισμό ενός ευÏετηÏίου" -#: sql_help.c:5212 +#: sql_help.c:5233 msgid "change the definition of a procedural language" msgstr "αλλάξτε τον οÏισμό μιας διαδικαστικής γλώσσας" -#: sql_help.c:5218 +#: sql_help.c:5239 msgid "change the definition of a large object" msgstr "αλλάξτε τον οÏισιμό ενός μεγάλου αντικειμένου" -#: sql_help.c:5224 +#: sql_help.c:5245 msgid "change the definition of a materialized view" msgstr "αλλάξτε τον οÏισμό μίας υλοποιημένης όψης" -#: sql_help.c:5230 +#: sql_help.c:5251 msgid "change the definition of an operator" msgstr "αλλάξτε τον οÏισμό ενός χειÏιστή" -#: sql_help.c:5236 +#: sql_help.c:5257 msgid "change the definition of an operator class" msgstr "αλλάξτε τον οÏισμό μίας κλάσης χειÏιστή" -#: sql_help.c:5242 +#: sql_help.c:5263 msgid "change the definition of an operator family" msgstr "αλλάξτε τον οÏισμό μίας οικογένειας χειÏιστή" -#: sql_help.c:5248 +#: sql_help.c:5269 msgid "change the definition of a row-level security policy" msgstr "αλλάξτε τον οÏισμό μιας πολιτικής ασφάλειας επιπέδου σειÏάς" -#: sql_help.c:5254 +#: sql_help.c:5275 msgid "change the definition of a procedure" msgstr "αλλάξτε τον οÏισμό μίας διαδικασίας" -#: sql_help.c:5260 +#: sql_help.c:5281 msgid "change the definition of a publication" msgstr "αλλάξτε τον οÏισμό μίας δημοσίευσης" -#: sql_help.c:5266 sql_help.c:5368 +#: sql_help.c:5287 sql_help.c:5389 msgid "change a database role" msgstr "αλλάξτε τον Ïόλο μίας βάσης δεδομένων" -#: sql_help.c:5272 +#: sql_help.c:5293 msgid "change the definition of a routine" msgstr "αλλάξτε τον οÏισμό μιας Ïουτίνας" -#: sql_help.c:5278 +#: sql_help.c:5299 msgid "change the definition of a rule" msgstr "αλλάξτε τον οÏισμό ενός κανόνα" -#: sql_help.c:5284 +#: sql_help.c:5305 msgid "change the definition of a schema" msgstr "αλλάξτε τον οÏισμό ενός σχήματος" -#: sql_help.c:5290 +#: sql_help.c:5311 msgid "change the definition of a sequence generator" msgstr "αλλάξτε τον οÏισμό μίας γεννήτÏιας ακολουθίας" -#: sql_help.c:5296 +#: sql_help.c:5317 msgid "change the definition of a foreign server" msgstr "αλλάξτε τον οÏισμό ενός Î¾ÎµÎ½Î¹ÎºÎ¿Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏƒÏ„Î®" -#: sql_help.c:5302 +#: sql_help.c:5323 msgid "change the definition of an extended statistics object" msgstr "αλλάξτε τον οÏισμό ενός εκτεταμένου αντικειμένου στατιστικών" -#: sql_help.c:5308 +#: sql_help.c:5329 msgid "change the definition of a subscription" msgstr "αλλάξτε τον οÏισμό μιας συνδÏομής" -#: sql_help.c:5314 +#: sql_help.c:5335 msgid "change a server configuration parameter" msgstr "αλλάξτε μία παÏάμετÏο διαμόÏφωσης διακομιστή" -#: sql_help.c:5320 +#: sql_help.c:5341 msgid "change the definition of a table" msgstr "αλλάξτε τον οÏισμό ενός πίνακα" -#: sql_help.c:5326 +#: sql_help.c:5347 msgid "change the definition of a tablespace" msgstr "αλλάξτε τον οÏισμό ενός πινακοχώÏου" -#: sql_help.c:5332 +#: sql_help.c:5353 msgid "change the definition of a text search configuration" msgstr "αλλάξτε τον οÏισμό μίας διαμόÏφωσης αναζήτησης κειμένου" -#: sql_help.c:5338 +#: sql_help.c:5359 msgid "change the definition of a text search dictionary" msgstr "αλλάξτε τον οÏισμό ενός Î»ÎµÎ¾Î¹ÎºÎ¿Ï Î±Î½Î±Î¶Î®Ï„Î·ÏƒÎ·Ï‚ κειμένου" -#: sql_help.c:5344 +#: sql_help.c:5365 msgid "change the definition of a text search parser" msgstr "αλλάξτε τον οÏισμό ενός αναλυτή αναζήτησης κειμένου" -#: sql_help.c:5350 +#: sql_help.c:5371 msgid "change the definition of a text search template" msgstr "αλλάξτε τον οÏισμό ενός Ï€ÏοτÏπου αναζήτησης κειμένου" -#: sql_help.c:5356 +#: sql_help.c:5377 msgid "change the definition of a trigger" msgstr "αλλάξτε τον οÏισμό μιας ενεÏγοποίησης" -#: sql_help.c:5362 +#: sql_help.c:5383 msgid "change the definition of a type" msgstr "αλλάξτε τον οÏισμό ενός Ï„Ïπου" -#: sql_help.c:5374 +#: sql_help.c:5395 msgid "change the definition of a user mapping" msgstr "αλλάξτε τον οÏισμό μίας αντιστοίχισης χÏήστη" -#: sql_help.c:5380 +#: sql_help.c:5401 msgid "change the definition of a view" msgstr "αλλάξτε τον οÏισμό μίας όψης" -#: sql_help.c:5386 +#: sql_help.c:5407 msgid "collect statistics about a database" msgstr "συλλέξτε στατιστικά σχετικά με μία βάση δεδομένων" -#: sql_help.c:5392 sql_help.c:6190 +#: sql_help.c:5413 sql_help.c:6211 msgid "start a transaction block" msgstr "εκκινήστε ένα μπλοκ συναλλαγής" -#: sql_help.c:5398 +#: sql_help.c:5419 msgid "invoke a procedure" msgstr "κλήση διαδικασίας" -#: sql_help.c:5404 +#: sql_help.c:5425 msgid "force a write-ahead log checkpoint" msgstr "επιβάλλετε εισαγωγή ενός σημείου ελέγχου (checkpoint) του write-ahead log" -#: sql_help.c:5410 +#: sql_help.c:5431 msgid "close a cursor" msgstr "κλείστε έναν δÏομέα" -#: sql_help.c:5416 +#: sql_help.c:5437 msgid "cluster a table according to an index" msgstr "δημιουÏγείστε συστάδα ενός πίνακα σÏμφωνα με ένα ευÏετήÏιο" -#: sql_help.c:5422 +#: sql_help.c:5443 msgid "define or change the comment of an object" msgstr "οÏίσετε ή αλλάξτε το σχόλιο ενός αντικειμένου" -#: sql_help.c:5428 sql_help.c:5986 +#: sql_help.c:5449 sql_help.c:6007 msgid "commit the current transaction" msgstr "ολοκληÏώστε την Ï„Ïέχουσας συναλλαγής" -#: sql_help.c:5434 +#: sql_help.c:5455 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "ολοκληÏώστε μία συναλλαγή που είχε Ï€Ïοετοιμαστεί νωÏίτεÏα για ολοκλήÏωση σε δÏο φάσεις" -#: sql_help.c:5440 +#: sql_help.c:5461 msgid "copy data between a file and a table" msgstr "αντιγÏάψτε δεδομένα Î¼ÎµÏ„Î±Î¾Ï ÎµÎ½ÏŒÏ‚ αÏχείου και ενός πίνακα" -#: sql_help.c:5446 +#: sql_help.c:5467 msgid "define a new access method" msgstr "οÏίσετε μία νέα μέθοδο Ï€Ïόσβασης" -#: sql_help.c:5452 +#: sql_help.c:5473 msgid "define a new aggregate function" msgstr "οÏίσετε μία νέα συνάÏτηση συγκεντÏωτικών αποτελεσμάτων" -#: sql_help.c:5458 +#: sql_help.c:5479 msgid "define a new cast" msgstr "οÏίσετε ένα νέο καστ" -#: sql_help.c:5464 +#: sql_help.c:5485 msgid "define a new collation" msgstr "οÏίσετε μία νέα συÏÏαφή" -#: sql_help.c:5470 +#: sql_help.c:5491 msgid "define a new encoding conversion" msgstr "οÏίσετε μία νέα μετατÏοπή κωδικοποίησης" -#: sql_help.c:5476 +#: sql_help.c:5497 msgid "create a new database" msgstr "δημιουÏγήστε μία νέα βάση δεδομένων" -#: sql_help.c:5482 +#: sql_help.c:5503 msgid "define a new domain" msgstr "οÏίσετε ένα νέο πεδίο" -#: sql_help.c:5488 +#: sql_help.c:5509 msgid "define a new event trigger" msgstr "οÏίσετε μία νέα ενεÏγοποίησης συμβάντος" -#: sql_help.c:5494 +#: sql_help.c:5515 msgid "install an extension" msgstr "εγκαταστήστε μία νέα Ï€Ïοέκταση" -#: sql_help.c:5500 +#: sql_help.c:5521 msgid "define a new foreign-data wrapper" msgstr "οÏίσετε μία νέα πεÏιτÏλιξη ξένων δεδομένων" -#: sql_help.c:5506 +#: sql_help.c:5527 msgid "define a new foreign table" msgstr "οÏίσετε ένα νέο ξενικό πίνακα" -#: sql_help.c:5512 +#: sql_help.c:5533 msgid "define a new function" msgstr "οÏίσετε μία νέα συνάÏτηση" -#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680 +#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701 msgid "define a new database role" msgstr "οÏίστε έναν νέο Ïόλο βάσης δεδομένων" -#: sql_help.c:5524 +#: sql_help.c:5545 msgid "define a new index" msgstr "οÏίστε ένα νέο ευÏετήÏιο" -#: sql_help.c:5530 +#: sql_help.c:5551 msgid "define a new procedural language" msgstr "οÏίστε μία νέα διαδικαστική γλώσσα" -#: sql_help.c:5536 +#: sql_help.c:5557 msgid "define a new materialized view" msgstr "οÏίστε μία νέα υλοποιημένη όψη" -#: sql_help.c:5542 +#: sql_help.c:5563 msgid "define a new operator" msgstr "οÏίστε έναν νέο χειÏιστή" -#: sql_help.c:5548 +#: sql_help.c:5569 msgid "define a new operator class" msgstr "οÏίστε μία νέα κλάση χειÏιστή" -#: sql_help.c:5554 +#: sql_help.c:5575 msgid "define a new operator family" msgstr "οÏίστε μία νέα οικογένεια χειÏιστή" -#: sql_help.c:5560 +#: sql_help.c:5581 msgid "define a new row-level security policy for a table" msgstr "οÏίστε μία νέα πολιτική Ï€Ïοστασίας σειÏάς για έναν πίνακα" -#: sql_help.c:5566 +#: sql_help.c:5587 msgid "define a new procedure" msgstr "οÏίστε μία νέα διαδικασία" -#: sql_help.c:5572 +#: sql_help.c:5593 msgid "define a new publication" msgstr "οÏίστε μία νέα κοινοποιήση" -#: sql_help.c:5584 +#: sql_help.c:5605 msgid "define a new rewrite rule" msgstr "οÏίστε ένα νέο κανόνα επανεγγÏαφής" -#: sql_help.c:5590 +#: sql_help.c:5611 msgid "define a new schema" msgstr "οÏίστε ένα νέο σχήμα" -#: sql_help.c:5596 +#: sql_help.c:5617 msgid "define a new sequence generator" msgstr "οÏίστε ένα νέο παÏαγωγό ακολουθίων" -#: sql_help.c:5602 +#: sql_help.c:5623 msgid "define a new foreign server" msgstr "οÏίστε ένα νέο ξενικό διακομιστή" -#: sql_help.c:5608 +#: sql_help.c:5629 msgid "define extended statistics" msgstr "οÏίστε εκτεταμένα στατιστικά στοιχεία" -#: sql_help.c:5614 +#: sql_help.c:5635 msgid "define a new subscription" msgstr "οÏίστε μία νέα συνδÏομή" -#: sql_help.c:5620 +#: sql_help.c:5641 msgid "define a new table" msgstr "οÏίσετε ένα νέο πίνακα" -#: sql_help.c:5626 sql_help.c:6148 +#: sql_help.c:5647 sql_help.c:6169 msgid "define a new table from the results of a query" msgstr "οÏίστε ένα νέο πίνακα από τα αποτελέσματα ενός εÏωτήματος" -#: sql_help.c:5632 +#: sql_help.c:5653 msgid "define a new tablespace" msgstr "οÏίστε ένα νέο πινακοχώÏο" -#: sql_help.c:5638 +#: sql_help.c:5659 msgid "define a new text search configuration" msgstr "οÏίστε μία νέα διαμόÏφωση αναζήτησης κειμένου" -#: sql_help.c:5644 +#: sql_help.c:5665 msgid "define a new text search dictionary" msgstr "οÏίστε ένα νέο λεξικό αναζήτησης κειμένου" -#: sql_help.c:5650 +#: sql_help.c:5671 msgid "define a new text search parser" msgstr "οÏίστε ένα νέο αναλυτή αναζήτησης κειμένου" -#: sql_help.c:5656 +#: sql_help.c:5677 msgid "define a new text search template" msgstr "οÏίστε ένα νέο Ï€Ïότυπο αναζήτησης κειμένου" -#: sql_help.c:5662 +#: sql_help.c:5683 msgid "define a new transform" msgstr "οÏίστε μία νέα μετατÏοπή" -#: sql_help.c:5668 +#: sql_help.c:5689 msgid "define a new trigger" msgstr "οÏίσετε μία νέα ενεÏγοποίηση" -#: sql_help.c:5674 +#: sql_help.c:5695 msgid "define a new data type" msgstr "οÏίσετε ένα νέο Ï„Ïπο δεδομένων" -#: sql_help.c:5686 +#: sql_help.c:5707 msgid "define a new mapping of a user to a foreign server" msgstr "οÏίστε μία νέα αντιστοίχιση ενός χÏήστη σε έναν ξένο διακομιστή" -#: sql_help.c:5692 +#: sql_help.c:5713 msgid "define a new view" msgstr "οÏίστε μία νέα όψη" -#: sql_help.c:5698 +#: sql_help.c:5719 msgid "deallocate a prepared statement" msgstr "καταÏγήστε μία Ï€Ïοετοιμασμένη δήλωση" -#: sql_help.c:5704 +#: sql_help.c:5725 msgid "define a cursor" msgstr "οÏίστε έναν δÏομέα" -#: sql_help.c:5710 +#: sql_help.c:5731 msgid "delete rows of a table" msgstr "διαγÏάψτε σειÏές ενός πίνακα" -#: sql_help.c:5716 +#: sql_help.c:5737 msgid "discard session state" msgstr "καταÏγήστε την κατάσταση συνεδÏίας" -#: sql_help.c:5722 +#: sql_help.c:5743 msgid "execute an anonymous code block" msgstr "εκτελέστε ανώνυμο μπλοκ κώδικα" -#: sql_help.c:5728 +#: sql_help.c:5749 msgid "remove an access method" msgstr "αφαιÏέστε μία μέθοδο Ï€Ïόσβασης" -#: sql_help.c:5734 +#: sql_help.c:5755 msgid "remove an aggregate function" msgstr "αφαιÏέστε μία συνάÏτηση συγκεντÏωτικών αποτελεσμάτων" -#: sql_help.c:5740 +#: sql_help.c:5761 msgid "remove a cast" msgstr "αφαιÏέστε ένα καστ" -#: sql_help.c:5746 +#: sql_help.c:5767 msgid "remove a collation" msgstr "αφαιÏέστε μία συÏÏαφή" -#: sql_help.c:5752 +#: sql_help.c:5773 msgid "remove a conversion" msgstr "αφαιÏέστε μία μετατÏοπή" -#: sql_help.c:5758 +#: sql_help.c:5779 msgid "remove a database" msgstr "αφαιÏέστε μία βάση δεδομένων" -#: sql_help.c:5764 +#: sql_help.c:5785 msgid "remove a domain" msgstr "αφαιÏέστε ένα πεδίο" -#: sql_help.c:5770 +#: sql_help.c:5791 msgid "remove an event trigger" msgstr "αφαιÏέστε μία ενεÏγοποίηση συμβάντος" -#: sql_help.c:5776 +#: sql_help.c:5797 msgid "remove an extension" msgstr "αφαιÏέστε μία Ï€Ïοέκταση" -#: sql_help.c:5782 +#: sql_help.c:5803 msgid "remove a foreign-data wrapper" msgstr "αφαιÏέστε μία πεÏιτÏλιξη ξένων δεδομένων" -#: sql_help.c:5788 +#: sql_help.c:5809 msgid "remove a foreign table" msgstr "αφαιÏέστε έναν ξενικό πίνακα" -#: sql_help.c:5794 +#: sql_help.c:5815 msgid "remove a function" msgstr "αφαιÏέστε μία συνάÏτηση" -#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968 +#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989 msgid "remove a database role" msgstr "αφαιÏέστε έναν Ïόλο μίας βάσης δεδομένων" -#: sql_help.c:5806 +#: sql_help.c:5827 msgid "remove an index" msgstr "αφαιÏέστε ένα ευÏετήÏιο" -#: sql_help.c:5812 +#: sql_help.c:5833 msgid "remove a procedural language" msgstr "αφαιÏέστε μία διαδικαστική γλώσσα" -#: sql_help.c:5818 +#: sql_help.c:5839 msgid "remove a materialized view" msgstr "αφαιÏέστε μία υλοποιημένη όψη" -#: sql_help.c:5824 +#: sql_help.c:5845 msgid "remove an operator" msgstr "αφαιÏέστε έναν χειÏιστή" -#: sql_help.c:5830 +#: sql_help.c:5851 msgid "remove an operator class" msgstr "αφαιÏέστε μία κλάση χειÏιστή" -#: sql_help.c:5836 +#: sql_help.c:5857 msgid "remove an operator family" msgstr "αφαιÏέστε μία οικογένεια χειÏιστή" -#: sql_help.c:5842 +#: sql_help.c:5863 msgid "remove database objects owned by a database role" msgstr "αφαιÏέστε αντικειμένα βάσης δεδομένων που ανήκουν σε Ïόλο βάσης δεδομένων" -#: sql_help.c:5848 +#: sql_help.c:5869 msgid "remove a row-level security policy from a table" msgstr "αφαιÏέστε μία πολιτική ασφαλείας επιπέδου σειÏάς από έναν πίνακα" -#: sql_help.c:5854 +#: sql_help.c:5875 msgid "remove a procedure" msgstr "αφαιÏέστε μία διαδικασία" -#: sql_help.c:5860 +#: sql_help.c:5881 msgid "remove a publication" msgstr "αφαιÏέστε μία δημοσίευση" -#: sql_help.c:5872 +#: sql_help.c:5893 msgid "remove a routine" msgstr "αφαιÏέστε μία Ïουτίνα" -#: sql_help.c:5878 +#: sql_help.c:5899 msgid "remove a rewrite rule" msgstr "αφαιÏέστε έναν κανόνα επανεγγÏαφής" -#: sql_help.c:5884 +#: sql_help.c:5905 msgid "remove a schema" msgstr "αφαιÏέστε ένα σχήμα" -#: sql_help.c:5890 +#: sql_help.c:5911 msgid "remove a sequence" msgstr "αφαιÏέστε μία ακολουθία" -#: sql_help.c:5896 +#: sql_help.c:5917 msgid "remove a foreign server descriptor" msgstr "αφαιÏέστε έναν πεÏιγÏαφέα Î¾ÎµÎ½Î¹ÎºÎ¿Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏƒÏ„Î®" -#: sql_help.c:5902 +#: sql_help.c:5923 msgid "remove extended statistics" msgstr "αφαιÏέστε εκτεταμένα στατιστικά στοιχεία" -#: sql_help.c:5908 +#: sql_help.c:5929 msgid "remove a subscription" msgstr "αφαιÏέστε μία συνδÏομή" -#: sql_help.c:5914 +#: sql_help.c:5935 msgid "remove a table" msgstr "αφαιÏέστε έναν πίνακα" -#: sql_help.c:5920 +#: sql_help.c:5941 msgid "remove a tablespace" msgstr "αφαιÏέστε έναν πινακοχώÏο" -#: sql_help.c:5926 +#: sql_help.c:5947 msgid "remove a text search configuration" msgstr "αφαιÏέστε μία διαμόÏφωση αναζήτησης κειμένου" -#: sql_help.c:5932 +#: sql_help.c:5953 msgid "remove a text search dictionary" msgstr "αφαιÏέστε ένα λεξικό αναζήτησης κειμένου" -#: sql_help.c:5938 +#: sql_help.c:5959 msgid "remove a text search parser" msgstr "αφαιÏέστε έναν αναλυτή αναζήτησης κειμένου" -#: sql_help.c:5944 +#: sql_help.c:5965 msgid "remove a text search template" msgstr "αφαιÏέστε ένα Ï€Ïότυπο αναζήτησης κειμένου" -#: sql_help.c:5950 +#: sql_help.c:5971 msgid "remove a transform" msgstr "αφαιÏέστε μία μετατÏοπή" -#: sql_help.c:5956 +#: sql_help.c:5977 msgid "remove a trigger" msgstr "αφαιÏέστε μία ενεÏγοποίηση" -#: sql_help.c:5962 +#: sql_help.c:5983 msgid "remove a data type" msgstr "αφαιÏέστε έναν Ï„Ïπο δεδομένων" -#: sql_help.c:5974 +#: sql_help.c:5995 msgid "remove a user mapping for a foreign server" msgstr "αφαιÏέστε μία αντιστοίχιση χÏήστη για ξένο διακομιστή" -#: sql_help.c:5980 +#: sql_help.c:6001 msgid "remove a view" msgstr "αφαιÏέστε μία όψη" -#: sql_help.c:5992 +#: sql_help.c:6013 msgid "execute a prepared statement" msgstr "εκτελέστε μία Ï€Ïοεπιλεγμένη δήλωση" -#: sql_help.c:5998 +#: sql_help.c:6019 msgid "show the execution plan of a statement" msgstr "εμφανίστε το πλάνο εκτέλεσης μίας δήλωσης" -#: sql_help.c:6004 +#: sql_help.c:6025 msgid "retrieve rows from a query using a cursor" msgstr "ανακτήστε σειÏές από εÏώτημα μέσω δÏομέα" -#: sql_help.c:6010 +#: sql_help.c:6031 msgid "define access privileges" msgstr "οÏίσθε δικαιώματα Ï€Ïόσβασης" -#: sql_help.c:6016 +#: sql_help.c:6037 msgid "import table definitions from a foreign server" msgstr "εισαγωγή οÏισμών πίνακα από ξένο διακομιστή" -#: sql_help.c:6022 +#: sql_help.c:6043 msgid "create new rows in a table" msgstr "δημιουÏγήστε καινοÏÏγιες σειÏές σε έναν πίνακα" -#: sql_help.c:6028 +#: sql_help.c:6049 msgid "listen for a notification" msgstr "ακοÏστε για μία κοινοποίηση" -#: sql_help.c:6034 +#: sql_help.c:6055 msgid "load a shared library file" msgstr "φοÏτώστε ένα αÏχείο κοινόχÏηστης βιβλιοθήκης" -#: sql_help.c:6040 +#: sql_help.c:6061 msgid "lock a table" msgstr "κλειδώστε έναν πίνακα" -#: sql_help.c:6046 +#: sql_help.c:6067 msgid "conditionally insert, update, or delete rows of a table" msgstr "υπό ÏŒÏους εισαγωγή, ενημέÏωση, ή διαγÏαφή σειÏών ενός πίνακα" -#: sql_help.c:6052 +#: sql_help.c:6073 msgid "position a cursor" msgstr "τοποθετήστε έναν δÏομέα" -#: sql_help.c:6058 +#: sql_help.c:6079 msgid "generate a notification" msgstr "δημιουÏγήστε μία κοινοποίηση" -#: sql_help.c:6064 +#: sql_help.c:6085 msgid "prepare a statement for execution" msgstr "Ï€Ïοετοιμάστε μία δήλωση για εκτέλεση" -#: sql_help.c:6070 +#: sql_help.c:6091 msgid "prepare the current transaction for two-phase commit" msgstr "Ï€Ïοετοιμάστε την Ï„Ïέχουσας συναλλαγής για ολοκλήÏωση σε δÏο φάσεις" -#: sql_help.c:6076 +#: sql_help.c:6097 msgid "change the ownership of database objects owned by a database role" msgstr "αλλάξτε την κυÏιότητα αντικειμένων βάσης δεδομένων που ανήκουν σε Ïόλο βάσης δεδομένων" -#: sql_help.c:6082 +#: sql_help.c:6103 msgid "replace the contents of a materialized view" msgstr "αντικαθαστήστε τα πεÏιεχόμενα μίας υλοποιημένης όψης" -#: sql_help.c:6088 +#: sql_help.c:6109 msgid "rebuild indexes" msgstr "επανακατασκευάστε ευÏετήÏια" -#: sql_help.c:6094 -msgid "destroy a previously defined savepoint" -msgstr "καταστÏέψτε ένα Ï€ÏοηγοÏμενα οÏισμένο σημείο αποθήκευσης" +#: sql_help.c:6115 +msgid "release a previously defined savepoint" +msgstr "απελευθέÏωσε ένα Ï€ÏοηγοÏμενα οÏισμένο σημείο αποθήκευσης" -#: sql_help.c:6100 +#: sql_help.c:6121 msgid "restore the value of a run-time parameter to the default value" msgstr "επαναφοÏά της τιμής μιας παÏαμέτÏου χÏόνου εκτέλεσης στην Ï€Ïοεπιλεγμένη τιμή" -#: sql_help.c:6106 +#: sql_help.c:6127 msgid "remove access privileges" msgstr "αφαιÏέστε δικαιώματα Ï€Ïόσβασης" -#: sql_help.c:6118 +#: sql_help.c:6139 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "ακÏÏωση συναλλαγής που είχε Ï€Ïοετοιμαστεί Ï€Ïοηγουμένως για ολοκλήÏωση σε δÏο φάσεις" -#: sql_help.c:6124 +#: sql_help.c:6145 msgid "roll back to a savepoint" msgstr "επαναφοÏά σε σημείο αποθήκευσης" -#: sql_help.c:6130 +#: sql_help.c:6151 msgid "define a new savepoint within the current transaction" msgstr "οÏίστε ένα νέο σημείο αποθήκευσης (savepoint) μέσα στην Ï„Ïέχουσα συναλλαγή" -#: sql_help.c:6136 +#: sql_help.c:6157 msgid "define or change a security label applied to an object" msgstr "οÏίστε ή αλλάξτε μία ετικέτα ασφαλείας που εφαÏμόζεται σε ένα αντικείμενο" -#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232 +#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253 msgid "retrieve rows from a table or view" msgstr "ανακτήστε σειÏές από πίνακα ή όψη" -#: sql_help.c:6154 +#: sql_help.c:6175 msgid "change a run-time parameter" msgstr "αλλάξτε μία παÏάμετÏο χÏόνου εκτέλεσης" -#: sql_help.c:6160 +#: sql_help.c:6181 msgid "set constraint check timing for the current transaction" msgstr "οÏίστε τον χÏονισμό ελέγχου πεÏιοÏÎ¹ÏƒÎ¼Î¿Ï Î³Î¹Î± την Ï„Ïέχουσα συναλλαγή" -#: sql_help.c:6166 +#: sql_help.c:6187 msgid "set the current user identifier of the current session" msgstr "οÏίστε το αναγνωÏιστικό Ï„Ïέχοντος χÏήστη της Ï„Ïέχουσας συνεδÏίας" -#: sql_help.c:6172 +#: sql_help.c:6193 msgid "set the session user identifier and the current user identifier of the current session" msgstr "οÏίστε το αναγνωÏιστικό χÏήστη συνεδÏίας και το αναγνωÏιστικό Ï„Ïέχοντος χÏήστη της Ï„Ïέχουσας συνεδÏίας" -#: sql_help.c:6178 +#: sql_help.c:6199 msgid "set the characteristics of the current transaction" msgstr "οÏίστε τα χαÏακτηÏιστικά της Ï„Ïέχουσας συναλλαγής" -#: sql_help.c:6184 +#: sql_help.c:6205 msgid "show the value of a run-time parameter" msgstr "εμφάνιση της τιμής μιας παÏαμέτÏου χÏόνου εκτέλεσης" -#: sql_help.c:6202 +#: sql_help.c:6223 msgid "empty a table or set of tables" msgstr "αδειάστε έναν πίνακα ή ένα σÏνολο πινάκων" -#: sql_help.c:6208 +#: sql_help.c:6229 msgid "stop listening for a notification" msgstr "σταματήστε να ακοÏτε μια κοινοποίηση" -#: sql_help.c:6214 +#: sql_help.c:6235 msgid "update rows of a table" msgstr "ενημέÏωση σειÏών πίνακα" -#: sql_help.c:6220 +#: sql_help.c:6241 msgid "garbage-collect and optionally analyze a database" msgstr "συλλογή αποÏÏιμμάτων και Ï€ÏοαιÏετική ανάλυση βάσης δεδομένων" -#: sql_help.c:6226 +#: sql_help.c:6247 msgid "compute a set of rows" msgstr "υπολογίστε ένα σÏνολο σειÏών" @@ -6413,7 +6503,7 @@ msgstr "παÏαβλέπεται η Ï€Ïόσθετη παÏάμετÏος γÏα msgid "could not find own program executable" msgstr "δεν ήταν δυνατή η εÏÏεση του ιδίου εκτελέσιμου Ï€ÏογÏάμματος" -#: tab-complete.c:5955 +#: tab-complete.c:6078 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6439,7 +6529,7 @@ msgstr "άκυÏη τιμή «%s» για «%s»: αναμένεται Î±ÎºÎ­Ï msgid "invalid variable name: \"%s\"" msgstr "άκυÏη ονομασία παÏαμέτÏου «%s»" -#: variables.c:419 +#: variables.c:418 #, c-format msgid "" "unrecognized value \"%s\" for \"%s\"\n" @@ -6468,6 +6558,9 @@ msgstr "" #~ msgid "Enter new password: " #~ msgstr "Εισάγετε νέο κωδικό Ï€Ïόσβασης: " +#~ msgid "Source code" +#~ msgstr "Πηγαίος κώδικας" + #~ msgid "Special relation \"%s.%s\"" #~ msgstr "Ειδική σχέση «%s.%s»" @@ -6516,9 +6609,24 @@ msgstr "" #~ msgid "\\watch cannot be used with COPY" #~ msgstr "\\watch δεν μποÏεί να χÏησιμοποιηθεί μαζί με COPY" +#~ msgid "could not change directory to \"%s\": %m" +#~ msgstr "δεν ήταν δυνατή η μετάβαση στον κατάλογο «%s»: %m" + +#~ msgid "could not identify current directory: %m" +#~ msgstr "δεν ήταν δυνατή η αναγνώÏιση του Ï„Ïέχοντος καταλόγου: %m" + +#~ msgid "could not read binary \"%s\"" +#~ msgstr "δεν ήταν δυνατή η ανάγνωση του Î´Ï…Î±Î´Î¹ÎºÎ¿Ï Î±Ïχείου «%s»" + +#~ msgid "could not read symbolic link \"%s\": %m" +#~ msgstr "δεν ήταν δυνατή η ανάγνωση του ÏƒÏ…Î¼Î²Î¿Î»Î¹ÎºÎ¿Ï ÏƒÏ…Î½Î´Î­ÏƒÎ¼Î¿Ï… «%s»: %m" + #~ msgid "fatal: " #~ msgstr "κÏίσιμο: " +#~ msgid "invalid binary \"%s\"" +#~ msgstr "μη έγκυÏο δυαδικό αÏχείο «%s»" + #~ msgid "pclose failed: %m" #~ msgstr "απέτυχε η εντολή pclose: %m" diff --git a/src/bin/psql/po/es.po b/src/bin/psql/po/es.po index 5fd9d3b319508..bc110c4dcad6f 100644 --- a/src/bin/psql/po/es.po +++ b/src/bin/psql/po/es.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: psql (PostgreSQL) 16\n" +"Project-Id-Version: psql (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:17+0000\n" -"PO-Revision-Date: 2023-05-22 12:06+0200\n" +"POT-Creation-Date: 2025-02-16 19:47+0000\n" +"PO-Revision-Date: 2024-12-07 09:06+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -43,33 +43,48 @@ msgstr "detalle: " msgid "hint: " msgstr "consejo: " -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "binario «%s» no válido: %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "no se pudo leer el binario «%s»: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "no se pudo encontrar un «%s» para ejecutar" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "no se pudo resolver la ruta «%s» a forma absoluta: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 copy.c:326 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "no se pudo ejecutar la orden «%s»: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "no se pudo leer desde la orden «%s»: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "la orden «%s» no retornó datos" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() falló: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 -#: command.c:1352 command.c:3437 command.c:3486 command.c:3610 input.c:226 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: command.c:1373 command.c:3459 command.c:3508 command.c:3633 input.c:225 #: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" @@ -91,7 +106,7 @@ msgstr "no se puede duplicar un puntero nulo (error interno)\n" msgid "could not look up effective user ID %ld: %s" msgstr "no se pudo buscar el ID de usuario efectivo %ld: %s" -#: ../../common/username.c:45 command.c:613 +#: ../../common/username.c:45 command.c:616 msgid "user does not exist" msgstr "el usuario no existe" @@ -130,11 +145,11 @@ msgstr "el proceso hijo fue terminado por una señal %d: %s" msgid "child process exited with unrecognized status %d" msgstr "el proceso hijo terminó con código no reconocido %d" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Petición de cancelación enviada\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "No se pudo enviar la petición de cancelación: %s" @@ -150,315 +165,337 @@ msgstr[1] "(%lu filas)" msgid "Interrupted\n" msgstr "Interrumpido\n" -#: ../../fe_utils/print.c:3218 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "No se puede imprimir el contenido de la tabla: el número de celdas %lld es igual o mayor al máximo %lld.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "No se puede agregar un encabezado al contenido de la tabla: la cantidad de columnas de %d ha sido excedida.\n" -#: ../../fe_utils/print.c:3258 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "No se puede agregar una celda al contenido de la tabla: la cantidad de celdas de %d ha sido excedida.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "No se puede agregar una celda al contenido de la tabla: la cantidad de celdas de %lld ha sido excedida.\n" -#: ../../fe_utils/print.c:3516 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "formato de salida no válido (error interno): %d" -#: ../../fe_utils/psqlscan.l:717 +#: ../../fe_utils/psqlscan.l:732 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "saltando expansión recursiva de la variable «%s»" -#: ../../port/thread.c:50 ../../port/thread.c:86 +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "el argumento de la orden de shell contiene un salto de línea o retorno de carro: «%s»\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "el nombre de base de datos contiene un salto de línea o retorno de carro: «%s»\n" + +#: ../../port/user.c:43 ../../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "no se pudo buscar el usuario local de ID %d: %s" -#: ../../port/thread.c:55 ../../port/thread.c:91 +#: ../../port/user.c:48 ../../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "no existe un usuario local con ID %d" -#: command.c:234 +#: command.c:235 #, c-format msgid "invalid command \\%s" msgstr "orden \\%s no válida" -#: command.c:236 +#: command.c:237 #, c-format msgid "Try \\? for help." msgstr "Digite \\? para obtener ayuda." -#: command.c:254 +#: command.c:255 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: argumento extra «%s» ignorado" -#: command.c:306 +#: command.c:307 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "orden \\%s ignorada: use \\endif o Ctrl-C para salir del bloque \\if actual" -#: command.c:611 +#: command.c:614 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "no se pudo obtener directorio home para el usuario de ID %ld: %s" -#: command.c:630 +#: command.c:633 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: no se pudo cambiar directorio a «%s»: %m" -#: command.c:654 +#: command.c:657 #, c-format msgid "You are currently not connected to a database.\n" msgstr "No está conectado a una base de datos.\n" -#: command.c:664 +#: command.c:667 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Está conectado a la base de datos «%s» como el usuario «%s» en la dirección «%s» port «%s».\n" -#: command.c:667 +#: command.c:670 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Está conectado a la base de datos «%s» como el usuario «%s» a través del socket en «%s» port «%s».\n" -#: command.c:673 +#: command.c:676 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» (dirección «%s») port «%s».\n" -#: command.c:676 +#: command.c:679 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» port «%s».\n" -#: command.c:1064 command.c:1157 command.c:2680 +#: command.c:1069 command.c:1170 command.c:2676 #, c-format msgid "no query buffer" msgstr "no hay búfer de consulta" -#: command.c:1097 command.c:5687 +#: command.c:1102 command.c:5779 #, c-format msgid "invalid line number: %s" msgstr "número de línea no válido: %s" -#: command.c:1235 +#: command.c:1248 msgid "No changes" msgstr "Sin cambios" -#: command.c:1313 +#: command.c:1333 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: nombre de codificación no válido o procedimiento de conversión no encontrado" -#: command.c:1348 command.c:2150 command.c:3433 command.c:3630 command.c:5793 -#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120 -#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480 -#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192 -#: large_obj.c:254 startup.c:304 +#: command.c:1369 command.c:2158 command.c:3455 command.c:3653 command.c:5885 +#: common.c:221 common.c:270 common.c:440 common.c:1142 common.c:1160 +#: common.c:1228 common.c:1340 common.c:1378 common.c:1475 common.c:1541 +#: copy.c:486 copy.c:722 large_obj.c:157 large_obj.c:192 large_obj.c:254 +#: startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1355 +#: command.c:1376 msgid "There is no previous error." msgstr "No hay error anterior." -#: command.c:1468 +#: command.c:1489 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: falta el paréntesis derecho" -#: command.c:1552 command.c:1682 command.c:1986 command.c:2000 command.c:2019 -#: command.c:2201 command.c:2442 command.c:2647 command.c:2687 +#: command.c:1573 command.c:1692 command.c:1996 command.c:2010 command.c:2029 +#: command.c:2197 command.c:2438 command.c:2643 command.c:2683 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: falta argumento requerido" -#: command.c:1813 +#: command.c:1823 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: no puede ocurrir después de \\else" -#: command.c:1818 +#: command.c:1828 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: no hay un \\if coincidente" -#: command.c:1882 +#: command.c:1892 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: no puede ocurrir después de \\else" -#: command.c:1887 +#: command.c:1897 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: no hay un \\if coincidente" -#: command.c:1927 +#: command.c:1937 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: no hay un \\if coincidente" -#: command.c:2083 +#: command.c:2093 msgid "Query buffer is empty." msgstr "El búfer de consulta está vacío." -#: command.c:2126 +#: command.c:2136 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Ingrese nueva contraseña para usuario «%s»: " -#: command.c:2130 +#: command.c:2140 msgid "Enter it again: " msgstr "Ingrésela nuevamente: " -#: command.c:2139 +#: command.c:2149 #, c-format msgid "Passwords didn't match." -msgstr "Las constraseñas no coinciden." +msgstr "Las contraseñas no coinciden." -#: command.c:2236 +#: command.c:2232 #, c-format msgid "\\%s: could not read value for variable" msgstr "%s: no se pudo leer el valor para la variable" -#: command.c:2338 +#: command.c:2334 msgid "Query buffer reset (cleared)." msgstr "El búfer de consulta ha sido reiniciado (limpiado)." -#: command.c:2360 +#: command.c:2356 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Se escribió la historia en el archivo «%s».\n" -#: command.c:2447 +#: command.c:2443 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: el nombre de variable de ambiente no debe contener «=»" -#: command.c:2495 +#: command.c:2491 #, c-format msgid "function name is required" msgstr "el nombre de la función es requerido" -#: command.c:2497 +#: command.c:2493 #, c-format msgid "view name is required" msgstr "el nombre de la vista es requerido" -#: command.c:2619 +#: command.c:2615 msgid "Timing is on." msgstr "El despliegue de duración está activado." -#: command.c:2621 +#: command.c:2617 msgid "Timing is off." msgstr "El despliegue de duración está desactivado." -#: command.c:2707 command.c:2745 command.c:4072 command.c:4075 command.c:4078 -#: command.c:4084 command.c:4086 command.c:4112 command.c:4122 command.c:4134 -#: command.c:4148 command.c:4175 command.c:4233 common.c:78 copy.c:329 -#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818 +#: command.c:2703 command.c:2741 command.c:4166 command.c:4169 command.c:4172 +#: command.c:4178 command.c:4180 command.c:4206 command.c:4216 command.c:4228 +#: command.c:4242 command.c:4269 command.c:4327 common.c:77 copy.c:329 +#: copy.c:401 psqlscanslash.l:805 psqlscanslash.l:817 psqlscanslash.l:835 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:2734 copy.c:388 +#: command.c:2730 copy.c:388 #, c-format msgid "%s: %s" msgstr "%s: %s" -#: command.c:2804 command.c:2850 +#: command.c:2802 command.c:2868 #, c-format -#| msgid "\\watch: iteration count is specified more than once" msgid "\\watch: interval value is specified more than once" msgstr "\\watch: valor de intervalo ese especifica más de una vez" -#: command.c:2814 command.c:2860 +#: command.c:2812 command.c:2878 #, c-format -#| msgid "\\watch: incorrect iteration count \"%s\"" msgid "\\watch: incorrect interval value \"%s\"" msgstr "\\watch: valor de intervalo incorrecto «%s»" -#: command.c:2824 +#: command.c:2822 #, c-format msgid "\\watch: iteration count is specified more than once" msgstr "\\watch: cantidad de iteraciones se especifica más de una vez" -#: command.c:2834 +#: command.c:2832 #, c-format msgid "\\watch: incorrect iteration count \"%s\"" msgstr "\\watch: cantidad de iteraciones incorrecta «%s»" -#: command.c:2841 +#: command.c:2842 +#, c-format +msgid "\\watch: minimum row count specified more than once" +msgstr "\\watch: mínima cantidad de filas se especifica más de una vez" + +#: command.c:2852 +#, c-format +msgid "\\watch: incorrect minimum row count \"%s\"" +msgstr "\\watch: cantidad mínima de filas incorrecta «%s»" + +#: command.c:2859 #, c-format -#| msgid "unrecognized parameter \"%s\"" msgid "\\watch: unrecognized parameter \"%s\"" msgstr "\\watch: parámetro «%s» no reconocido" -#: command.c:3234 startup.c:243 startup.c:293 +#: command.c:3256 startup.c:243 startup.c:293 msgid "Password: " msgstr "Contraseña: " -#: command.c:3239 startup.c:290 +#: command.c:3261 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Contraseña para usuario %s: " -#: command.c:3295 +#: command.c:3317 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "No proporcione usuario, host o puerto de forma separada al usar una cadena de conexión" -#: command.c:3330 +#: command.c:3352 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "No existe una conexión de base de datos para poder reusar sus parámetros" -#: command.c:3636 +#: command.c:3659 #, c-format msgid "Previous connection kept" msgstr "Se ha mantenido la conexión anterior" -#: command.c:3642 +#: command.c:3665 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3698 +#: command.c:3721 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» en la dirección «%s» port «%s».\n" -#: command.c:3701 +#: command.c:3724 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» a través del socket en «%s» port «%s».\n" -#: command.c:3707 +#: command.c:3730 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» (dirección «%s») port «%s».\n" -#: command.c:3710 +#: command.c:3733 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Ahora está conectado a la base de datos «%s» como el usuario «%s» en el servidor «%s» port «%s».\n" -#: command.c:3715 +#: command.c:3738 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Ahora está conectado a la base de datos «%s» con el usuario «%s».\n" -#: command.c:3755 +#: command.c:3844 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, servidor %s)\n" -#: command.c:3768 +#: command.c:3857 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -467,29 +504,33 @@ msgstr "" "ADVERTENCIA: %s versión mayor %s, servidor versión mayor %s.\n" " Algunas características de psql podrían no funcionar.\n" -#: command.c:3805 +#: command.c:3896 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" -msgstr "Conexión SSL (protocolo: %s, cifrado: %s, compresión: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s, ALPN: %s)\n" +msgstr "Conexión SSL (protocolo: %s, cifrado: %s, compresión: %s, ALPN: %s)\n" -#: command.c:3806 command.c:3807 +#: command.c:3897 command.c:3898 msgid "unknown" msgstr "desconocido" -#: command.c:3808 help.c:42 +#: command.c:3899 help.c:42 msgid "off" msgstr "desactivado" -#: command.c:3808 help.c:42 +#: command.c:3899 help.c:42 msgid "on" msgstr "activado" -#: command.c:3822 +#: command.c:3900 +msgid "none" +msgstr "ninguno" + +#: command.c:3914 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "Conexión Cifrada GSSAPI\n" -#: command.c:3842 +#: command.c:3934 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -502,435 +543,438 @@ msgstr "" " Vea la página de referencia de psql «Notes for Windows users»\n" " para obtener más detalles.\n" -#: command.c:3947 +#: command.c:4041 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "la variable de ambiente PSQL_EDITOR_LINENUMBER_SWITCH debe estar definida para poder especificar un número de línea" -#: command.c:3977 +#: command.c:4071 #, c-format msgid "could not start editor \"%s\"" msgstr "no se pudo iniciar el editor «%s»" -#: command.c:3979 +#: command.c:4073 #, c-format msgid "could not start /bin/sh" msgstr "no se pudo iniciar /bin/sh" -#: command.c:4029 +#: command.c:4123 #, c-format msgid "could not locate temporary directory: %s" msgstr "no se pudo ubicar el directorio temporal: %s" -#: command.c:4056 +#: command.c:4150 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "no se pudo abrir archivo temporal «%s»: %m" -#: command.c:4392 +#: command.c:4486 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: abreviación ambigua «%s» coincide tanto con «%s» como con «%s»" -#: command.c:4412 +#: command.c:4506 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset: formatos permitidos son aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:4431 +#: command.c:4525 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: estilos de línea permitidos son ascii, old-ascii, unicode" -#: command.c:4446 +#: command.c:4540 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: estilos de línea Unicode de borde permitidos son single, double" -#: command.c:4461 +#: command.c:4555 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: estilos de línea Unicode de columna permitidos son single, double" -#: command.c:4476 +#: command.c:4570 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: estilos de línea Unicode de encabezado permitidos son single, double" -#: command.c:4528 +#: command.c:4622 #, c-format -#| msgid "\\pset: allowed xheader_width values are full (default), column, page, or a number specifying the exact width." msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width" msgstr "\\pset: los valores permitidos de xheader_width son «%s» (por omisión), «%s», «%s», o un número que indica el ancho exacto" -#: command.c:4545 +#: command.c:4639 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep debe ser un carácter de un solo byte" -#: command.c:4550 +#: command.c:4644 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldset ni puede ser una comilla doble, un salto de línea, o un retorno de carro" -#: command.c:4688 command.c:4889 +#: command.c:4782 command.c:4983 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: opción desconocida: %s" -#: command.c:4708 +#: command.c:4802 #, c-format msgid "Border style is %d.\n" msgstr "El estilo de borde es %d.\n" -#: command.c:4714 +#: command.c:4808 #, c-format msgid "Target width is unset.\n" msgstr "El ancho no está definido.\n" -#: command.c:4716 +#: command.c:4810 #, c-format msgid "Target width is %d.\n" msgstr "El ancho es %d.\n" -#: command.c:4723 +#: command.c:4817 #, c-format msgid "Expanded display is on.\n" msgstr "Se ha activado el despliegue expandido.\n" -#: command.c:4725 +#: command.c:4819 #, c-format msgid "Expanded display is used automatically.\n" msgstr "El despliegue expandido se usa automáticamente.\n" -#: command.c:4727 +#: command.c:4821 #, c-format msgid "Expanded display is off.\n" msgstr "Se ha desactivado el despliegue expandido.\n" -#: command.c:4734 command.c:4736 command.c:4738 +#: command.c:4828 command.c:4830 command.c:4832 #, c-format -#| msgid "Expanded header width is '%s'.\n" msgid "Expanded header width is \"%s\".\n" msgstr "El ancho del encabezado expandido es '%s'.\n" -#: command.c:4740 +#: command.c:4834 #, c-format msgid "Expanded header width is %d.\n" msgstr "El ancho de encabezado expandido es %d.\n" -#: command.c:4746 +#: command.c:4840 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "El separador de campos para CSV es «%s».\n" -#: command.c:4754 command.c:4762 +#: command.c:4848 command.c:4856 #, c-format msgid "Field separator is zero byte.\n" msgstr "El separador de campos es el byte cero.\n" -#: command.c:4756 +#: command.c:4850 #, c-format msgid "Field separator is \"%s\".\n" msgstr "El separador de campos es «%s».\n" -#: command.c:4769 +#: command.c:4863 #, c-format msgid "Default footer is on.\n" msgstr "El pie por omisión está activo.\n" -#: command.c:4771 +#: command.c:4865 #, c-format msgid "Default footer is off.\n" msgstr "El pie de página por omisión está desactivado.\n" -#: command.c:4777 +#: command.c:4871 #, c-format msgid "Output format is %s.\n" msgstr "El formato de salida es %s.\n" -#: command.c:4783 +#: command.c:4877 #, c-format msgid "Line style is %s.\n" msgstr "El estilo de línea es %s.\n" -#: command.c:4790 +#: command.c:4884 #, c-format msgid "Null display is \"%s\".\n" msgstr "Despliegue de nulos es «%s».\n" -#: command.c:4798 +#: command.c:4892 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "La salida numérica ajustada localmente está habilitada.\n" -#: command.c:4800 +#: command.c:4894 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "La salida numérica ajustada localmente está deshabilitada.\n" -#: command.c:4807 +#: command.c:4901 #, c-format msgid "Pager is used for long output.\n" msgstr "El paginador se usará para salida larga.\n" -#: command.c:4809 +#: command.c:4903 #, c-format msgid "Pager is always used.\n" msgstr "El paginador se usará siempre.\n" -#: command.c:4811 +#: command.c:4905 #, c-format msgid "Pager usage is off.\n" msgstr "El paginador no se usará.\n" -#: command.c:4817 +#: command.c:4911 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "El paginador no se usará para menos de %d línea.\n" msgstr[1] "El paginador no se usará para menos de %d líneas.\n" -#: command.c:4827 command.c:4837 +#: command.c:4921 command.c:4931 #, c-format msgid "Record separator is zero byte.\n" msgstr "El separador de filas es el byte cero.\n" -#: command.c:4829 +#: command.c:4923 #, c-format msgid "Record separator is .\n" msgstr "El separador de filas es .\n" -#: command.c:4831 +#: command.c:4925 #, c-format msgid "Record separator is \"%s\".\n" msgstr "El separador de filas es «%s».\n" -#: command.c:4844 +#: command.c:4938 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Los atributos de tabla son «%s».\n" -#: command.c:4847 +#: command.c:4941 #, c-format msgid "Table attributes unset.\n" msgstr "Los atributos de tabla han sido indefinidos.\n" -#: command.c:4854 +#: command.c:4948 #, c-format msgid "Title is \"%s\".\n" msgstr "El título es «%s».\n" -#: command.c:4856 +#: command.c:4950 #, c-format msgid "Title is unset.\n" msgstr "El título ha sido indefinido.\n" -#: command.c:4863 +#: command.c:4957 #, c-format msgid "Tuples only is on.\n" msgstr "Mostrar sólo filas está activado.\n" -#: command.c:4865 +#: command.c:4959 #, c-format msgid "Tuples only is off.\n" msgstr "Mostrar sólo filas está desactivado.\n" -#: command.c:4871 +#: command.c:4965 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "El estilo Unicode de borde es «%s».\n" -#: command.c:4877 +#: command.c:4971 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "El estilo de línea Unicode de columna es «%s».\n" -#: command.c:4883 +#: command.c:4977 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "El estilo de línea Unicode de encabezado es «%s».\n" -#: command.c:5132 +#: command.c:5226 #, c-format msgid "\\!: failed" msgstr "\\!: falló" -#: command.c:5166 +#: command.c:5264 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch no puede ser usado con una consulta vacía" -#: command.c:5198 +#: command.c:5296 #, c-format msgid "could not set timer: %m" msgstr "no se pudo establecer un temporizador: %m" -#: command.c:5267 +#: command.c:5365 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (cada %gs)\n" -#: command.c:5270 +#: command.c:5368 #, c-format msgid "%s (every %gs)\n" msgstr "%s (cada %gs)\n" -#: command.c:5338 +#: command.c:5432 #, c-format msgid "could not wait for signals: %m" msgstr "no se pudo esperar señales: %m" -#: command.c:5396 command.c:5403 common.c:592 common.c:599 common.c:1083 +#: command.c:5488 command.c:5495 common.c:632 common.c:639 common.c:1123 #, c-format msgid "" -"********* QUERY **********\n" +"/******** QUERY *********/\n" "%s\n" -"**************************\n" +"/************************/\n" "\n" msgstr "" -"********* QUERY **********\n" +"/******** QUERY *********/\n" "%s\n" -"**************************\n" +"/************************/\n" "\n" -#: command.c:5582 +#: command.c:5674 #, c-format msgid "\"%s.%s\" is not a view" msgstr "«%s.%s» no es una vista" -#: command.c:5598 +#: command.c:5690 #, c-format msgid "could not parse reloptions array" msgstr "no se pudo interpretar el array reloptions" -#: common.c:167 +#: common.c:206 #, c-format msgid "cannot escape without active connection" msgstr "no se puede escapar sin una conexión activa" -#: common.c:208 +#: common.c:247 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "el argumento de la orden de shell contiene un salto de línea o retorno de carro: «%s»" -#: common.c:312 +#: common.c:351 #, c-format msgid "connection to server was lost" msgstr "se ha perdido la conexión al servidor" -#: common.c:316 +#: common.c:355 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "La conexión al servidor se ha perdido. Intentando reiniciar: " -#: common.c:321 +#: common.c:360 #, c-format msgid "Failed.\n" msgstr "Falló.\n" -#: common.c:338 +#: common.c:377 #, c-format msgid "Succeeded.\n" msgstr "Con éxito.\n" -#: common.c:390 common.c:1021 +#: common.c:430 common.c:1061 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "PQresultStatus no esperado: %d" -#: common.c:531 +#: common.c:571 #, c-format msgid "Time: %.3f ms\n" msgstr "Duración: %.3f ms\n" -#: common.c:546 +#: common.c:586 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Duración: %.3f ms (%02d:%06.3f)\n" -#: common.c:555 +#: common.c:595 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Duración: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:562 +#: common.c:602 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Duración: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:586 common.c:643 common.c:1054 describe.c:6153 +#: common.c:626 common.c:683 common.c:1094 describe.c:6192 #, c-format msgid "You are currently not connected to a database." msgstr "No está conectado a una base de datos." -#: common.c:674 +#: common.c:714 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "Notificación asíncrona «%s» con carga «%s» recibida del proceso de servidor con PID %d.\n" -#: common.c:677 +#: common.c:717 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "Notificación asíncrona «%s» recibida del proceso de servidor con PID %d.\n" -#: common.c:708 +#: common.c:748 #, c-format msgid "could not print result table: %m" msgstr "no se pudo mostrar la tabla de resultados: %m" -#: common.c:728 +#: common.c:768 #, c-format msgid "no rows returned for \\gset" msgstr "\\gset no retornó renglón alguno" -#: common.c:733 +#: common.c:773 #, c-format msgid "more than one row returned for \\gset" msgstr "\\gset retornó más de un renglón" -#: common.c:751 +#: common.c:791 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "se ignoró intentó de hacer \\gset a variable con tratamiento especial «%s»" -#: common.c:1063 +#: common.c:1103 #, c-format msgid "" -"***(Single step mode: verify command)*******************************************\n" +"/**(Single step mode: verify command)******************************************/\n" "%s\n" -"***(press return to proceed or enter x and return to cancel)********************\n" +"/**(press return to proceed or enter x and return to cancel)*******************/\n" msgstr "" -"***(Modo paso a paso: verifique la orden)****************************************\n" +"/**(Modo paso a paso: verifique la orden)**************************************/\n" "%s\n" -"***(presione enter para continuar, o x y enter para cancelar)*******************\n" +"/**(presione enter para continuar, o x y enter para cancelar)******************/\n" -#: common.c:1146 +#: common.c:1180 #, c-format msgid "STATEMENT: %s" msgstr "SENTENCIA: %s" -#: common.c:1182 +#: common.c:1216 #, c-format msgid "unexpected transaction status (%d)" msgstr "estado de transacción inesperado (%d)" -#: common.c:1335 describe.c:2026 +#: common.c:1362 describe.c:2025 msgid "Column" msgstr "Columna" -#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046 -#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027 -#: describe.c:3897 describe.c:4109 describe.c:4348 describe.c:4510 -#: describe.c:5785 +#: common.c:1363 describe.c:169 describe.c:355 describe.c:373 describe.c:1043 +#: describe.c:1201 describe.c:1731 describe.c:1755 describe.c:2026 +#: describe.c:3956 describe.c:4167 describe.c:4404 describe.c:4564 +#: describe.c:5829 msgid "Type" msgstr "Tipo" -#: common.c:1385 +#: common.c:1412 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "La orden no tiene resultado, o el resultado no tiene columnas.\n" +#: common.c:1504 +#, c-format +msgid "fetching results in chunked mode failed" +msgstr "la obtención de resultados en modo trozado falló" + #: copy.c:98 #, c-format msgid "\\copy: arguments required" @@ -946,11 +990,6 @@ msgstr "\\copy: error de procesamiento en «%s»" msgid "\\copy: parse error at end of line" msgstr "\\copy: error de procesamiento al final de la línea" -#: copy.c:326 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "no se pudo ejecutar la orden «%s»: %m" - #: copy.c:342 #, c-format msgid "could not stat file \"%s\": %m" @@ -988,339 +1027,339 @@ msgstr "" "Ingrese los datos a ser copiados seguidos de un fin de línea.\n" "Termine con un backslash y un punto, o una señal EOF." -#: copy.c:682 +#: copy.c:684 msgid "aborted because of read failure" msgstr "se abortó por un error de lectura" -#: copy.c:716 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "tratando de salir del modo copy" -#: crosstabview.c:123 +#: crosstabview.c:124 #, c-format msgid "\\crosstabview: statement did not return a result set" msgstr "\\crosstabview: la sentencia no produjo un conjunto de resultados" -#: crosstabview.c:129 +#: crosstabview.c:130 #, c-format msgid "\\crosstabview: query must return at least three columns" msgstr "\\crosstabview: la consulta debe retornar al menos tres columnas" -#: crosstabview.c:156 +#: crosstabview.c:157 #, c-format msgid "\\crosstabview: vertical and horizontal headers must be different columns" msgstr "\\crosstabview: los encabezados verticales y horizontales deben ser columnas distintas" -#: crosstabview.c:172 +#: crosstabview.c:173 #, c-format msgid "\\crosstabview: data column must be specified when query returns more than three columns" msgstr "\\crosstabview: la columna de datos debe ser especificada cuando la consulta retorna más de tres columnas" -#: crosstabview.c:228 +#: crosstabview.c:229 #, c-format msgid "\\crosstabview: maximum number of columns (%d) exceeded" msgstr "\\crosstabview: se superó el número máximo de columnas (%d)" -#: crosstabview.c:397 +#: crosstabview.c:398 #, c-format msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" msgstr "\\crosstabview: el resultado de la consulta contiene múltiples valores para la fila «%s», columna «%s»" -#: crosstabview.c:645 +#: crosstabview.c:646 #, c-format msgid "\\crosstabview: column number %d is out of range 1..%d" msgstr "\\crosstabview: el número de columna %d está fuera del rango 1..%d" -#: crosstabview.c:670 +#: crosstabview.c:671 #, c-format msgid "\\crosstabview: ambiguous column name: \"%s\"" msgstr "\\crosstabview: nombre de columna «%s» ambiguo" -#: crosstabview.c:678 +#: crosstabview.c:679 #, c-format msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: nombre de columna «%s» no encontrado" -#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038 -#: describe.c:1189 describe.c:1264 describe.c:3886 describe.c:4096 -#: describe.c:4346 describe.c:4428 describe.c:4663 describe.c:4871 -#: describe.c:5113 describe.c:5357 describe.c:5427 describe.c:5438 -#: describe.c:5495 describe.c:5899 describe.c:5977 +#: describe.c:87 describe.c:335 describe.c:626 describe.c:802 describe.c:1035 +#: describe.c:1190 describe.c:1264 describe.c:3945 describe.c:4154 +#: describe.c:4402 describe.c:4483 describe.c:4715 describe.c:4921 +#: describe.c:5165 describe.c:5406 describe.c:5475 describe.c:5486 +#: describe.c:5542 describe.c:5941 describe.c:6018 msgid "Schema" msgstr "Esquema" -#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631 -#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265 -#: describe.c:3887 describe.c:4097 describe.c:4262 describe.c:4347 -#: describe.c:4429 describe.c:4592 describe.c:4664 describe.c:4872 -#: describe.c:4985 describe.c:5114 describe.c:5358 describe.c:5428 -#: describe.c:5439 describe.c:5496 describe.c:5695 describe.c:5766 -#: describe.c:5975 describe.c:6204 describe.c:6512 +#: describe.c:88 describe.c:166 describe.c:227 describe.c:336 describe.c:627 +#: describe.c:803 describe.c:924 describe.c:1036 describe.c:1265 +#: describe.c:3946 describe.c:4155 describe.c:4319 describe.c:4403 +#: describe.c:4484 describe.c:4645 describe.c:4716 describe.c:4922 +#: describe.c:5038 describe.c:5166 describe.c:5407 describe.c:5476 +#: describe.c:5487 describe.c:5543 describe.c:5740 describe.c:5810 +#: describe.c:6016 describe.c:6243 describe.c:6551 msgid "Name" msgstr "Nombre" -#: describe.c:89 describe.c:351 describe.c:369 +#: describe.c:89 describe.c:348 describe.c:366 msgid "Result data type" msgstr "Tipo de dato de salida" -#: describe.c:90 describe.c:352 describe.c:370 +#: describe.c:90 describe.c:349 describe.c:367 msgid "Argument data types" msgstr "Tipos de datos de argumentos" -#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418 -#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047 -#: describe.c:3682 describe.c:3941 describe.c:4143 describe.c:4286 -#: describe.c:4360 describe.c:4438 describe.c:4605 describe.c:4783 -#: describe.c:4921 describe.c:4994 describe.c:5115 describe.c:5266 -#: describe.c:5308 describe.c:5374 describe.c:5431 describe.c:5440 -#: describe.c:5497 describe.c:5713 describe.c:5788 describe.c:5913 -#: describe.c:5978 describe.c:7032 +#: describe.c:98 describe.c:105 describe.c:177 describe.c:241 describe.c:415 +#: describe.c:658 describe.c:818 describe.c:972 describe.c:1267 describe.c:2046 +#: describe.c:3676 describe.c:4000 describe.c:4201 describe.c:4343 +#: describe.c:4416 describe.c:4493 describe.c:4658 describe.c:4834 +#: describe.c:4975 describe.c:5047 describe.c:5167 describe.c:5317 +#: describe.c:5358 describe.c:5423 describe.c:5479 describe.c:5488 +#: describe.c:5544 describe.c:5758 describe.c:5832 describe.c:5955 +#: describe.c:6019 describe.c:7078 msgid "Description" msgstr "Descripción" -#: describe.c:128 +#: describe.c:127 msgid "List of aggregate functions" msgstr "Listado de funciones de agregación" -#: describe.c:153 +#: describe.c:152 #, c-format msgid "The server (version %s) does not support access methods." msgstr "El servidor (versión %s) no soporta métodos de acceso." -#: describe.c:168 +#: describe.c:167 msgid "Index" msgstr "Indice" -#: describe.c:169 describe.c:3905 describe.c:4122 describe.c:5900 +#: describe.c:168 describe.c:3964 describe.c:4180 describe.c:5942 msgid "Table" msgstr "Tabla" -#: describe.c:177 describe.c:5697 +#: describe.c:176 describe.c:5742 msgid "Handler" msgstr "Manejador" -#: describe.c:201 +#: describe.c:199 msgid "List of access methods" msgstr "Lista de métodos de acceso" -#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188 -#: describe.c:3898 describe.c:4098 describe.c:4263 describe.c:4594 -#: describe.c:4986 describe.c:5696 describe.c:5767 describe.c:6205 -#: describe.c:6393 describe.c:6513 describe.c:6672 describe.c:6758 -#: describe.c:7020 +#: describe.c:228 describe.c:401 describe.c:651 describe.c:925 describe.c:1189 +#: describe.c:3957 describe.c:4156 describe.c:4320 describe.c:4647 +#: describe.c:5039 describe.c:5741 describe.c:5811 describe.c:6244 +#: describe.c:6431 describe.c:6552 describe.c:6722 describe.c:6807 +#: describe.c:7066 msgid "Owner" msgstr "Dueño" -#: describe.c:231 +#: describe.c:229 msgid "Location" msgstr "Ubicación" -#: describe.c:241 describe.c:3517 +#: describe.c:239 describe.c:3517 describe.c:3857 msgid "Options" msgstr "Opciones" -#: describe.c:242 describe.c:653 describe.c:972 describe.c:3940 +#: describe.c:240 describe.c:649 describe.c:970 describe.c:3999 msgid "Size" msgstr "Tamaño" -#: describe.c:266 +#: describe.c:263 msgid "List of tablespaces" msgstr "Listado de tablespaces" -#: describe.c:311 +#: describe.c:308 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df sólo acepta las opciones [antpwS+]" -#: describe.c:319 +#: describe.c:316 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df no acepta la opción «%c» en un servidor versión %s" #. translator: "agg" is short for "aggregate" -#: describe.c:354 describe.c:372 +#: describe.c:351 describe.c:369 msgid "agg" msgstr "agg" -#: describe.c:355 describe.c:373 +#: describe.c:352 describe.c:370 msgid "window" msgstr "ventana" -#: describe.c:356 +#: describe.c:353 msgid "proc" msgstr "proc" -#: describe.c:357 describe.c:375 +#: describe.c:354 describe.c:372 msgid "func" msgstr "func" -#: describe.c:374 describe.c:1397 +#: describe.c:371 describe.c:1397 msgid "trigger" msgstr "disparador" -#: describe.c:386 +#: describe.c:383 msgid "immutable" msgstr "inmutable" -#: describe.c:387 +#: describe.c:384 msgid "stable" msgstr "estable" -#: describe.c:388 +#: describe.c:385 msgid "volatile" msgstr "volátil" -#: describe.c:389 +#: describe.c:386 msgid "Volatility" msgstr "Volatilidad" -#: describe.c:397 +#: describe.c:394 msgid "restricted" msgstr "restringida" -#: describe.c:398 +#: describe.c:395 msgid "safe" msgstr "segura" -#: describe.c:399 +#: describe.c:396 msgid "unsafe" msgstr "insegura" -#: describe.c:400 +#: describe.c:397 msgid "Parallel" msgstr "Paralelismo" -#: describe.c:405 +#: describe.c:402 msgid "definer" msgstr "definidor" -#: describe.c:406 +#: describe.c:403 msgid "invoker" msgstr "invocador" -#: describe.c:407 +#: describe.c:404 msgid "Security" msgstr "Seguridad" -#: describe.c:412 +#: describe.c:409 msgid "Language" msgstr "Lenguaje" -#: describe.c:415 describe.c:652 +#: describe.c:412 describe.c:648 msgid "Internal name" msgstr "Nombre interno" -#: describe.c:589 +#: describe.c:585 msgid "List of functions" msgstr "Listado de funciones" -#: describe.c:654 +#: describe.c:650 msgid "Elements" msgstr "Elementos" -#: describe.c:706 +#: describe.c:701 msgid "List of data types" msgstr "Listado de tipos de dato" -#: describe.c:809 +#: describe.c:804 msgid "Left arg type" msgstr "Tipo arg izq" -#: describe.c:810 +#: describe.c:805 msgid "Right arg type" msgstr "Tipo arg der" -#: describe.c:811 +#: describe.c:806 msgid "Result type" msgstr "Tipo resultado" -#: describe.c:816 describe.c:4600 describe.c:4766 describe.c:5265 -#: describe.c:6949 describe.c:6953 +#: describe.c:811 describe.c:4653 describe.c:4817 describe.c:5316 +#: describe.c:6996 describe.c:7000 msgid "Function" msgstr "Función" -#: describe.c:897 +#: describe.c:891 msgid "List of operators" msgstr "Listado de operadores" -#: describe.c:932 +#: describe.c:926 msgid "Encoding" msgstr "Codificación" -#: describe.c:936 describe.c:940 +#: describe.c:930 describe.c:934 msgid "Locale Provider" msgstr "Proveedor de locale" -#: describe.c:944 describe.c:4886 +#: describe.c:938 describe.c:4936 msgid "Collate" msgstr "Collate" -#: describe.c:945 describe.c:4887 +#: describe.c:939 describe.c:4937 msgid "Ctype" msgstr "Ctype" -#: describe.c:949 describe.c:953 describe.c:4892 describe.c:4896 -msgid "ICU Locale" -msgstr "configuración ICU" +#: describe.c:943 describe.c:947 describe.c:951 describe.c:4942 describe.c:4946 +#: describe.c:4950 +msgid "Locale" +msgstr "Configuración regional" -#: describe.c:957 describe.c:961 describe.c:4901 describe.c:4905 -#| msgid "Rules:" +#: describe.c:955 describe.c:959 describe.c:4955 describe.c:4959 msgid "ICU Rules" msgstr "Reglas ICU:" -#: describe.c:973 +#: describe.c:971 msgid "Tablespace" msgstr "Tablespace" -#: describe.c:999 +#: describe.c:996 msgid "List of databases" msgstr "Listado de base de datos" -#: describe.c:1040 describe.c:1191 describe.c:3888 +#: describe.c:1037 describe.c:1192 describe.c:3947 msgid "table" msgstr "tabla" -#: describe.c:1041 describe.c:3889 +#: describe.c:1038 describe.c:3948 msgid "view" msgstr "vista" -#: describe.c:1042 describe.c:3890 +#: describe.c:1039 describe.c:3949 msgid "materialized view" -msgstr "vistas materializadas" +msgstr "vista materializada" -#: describe.c:1043 describe.c:1193 describe.c:3892 +#: describe.c:1040 describe.c:1194 describe.c:3951 msgid "sequence" msgstr "secuencia" -#: describe.c:1044 describe.c:3894 +#: describe.c:1041 describe.c:3953 msgid "foreign table" msgstr "tabla foránea" -#: describe.c:1045 describe.c:3895 describe.c:4107 +#: describe.c:1042 describe.c:3954 describe.c:4165 msgid "partitioned table" msgstr "tabla particionada" -#: describe.c:1056 +#: describe.c:1058 msgid "Column privileges" msgstr "Privilegios de acceso a columnas" -#: describe.c:1087 describe.c:1121 +#: describe.c:1089 describe.c:1123 msgid "Policies" msgstr "Políticas" -#: describe.c:1150 describe.c:4516 describe.c:6617 +#: describe.c:1151 describe.c:4570 describe.c:6667 msgid "Access privileges" msgstr "Privilegios" -#: describe.c:1195 +#: describe.c:1196 msgid "function" msgstr "función" -#: describe.c:1197 +#: describe.c:1198 msgid "type" msgstr "tipo" -#: describe.c:1199 +#: describe.c:1200 msgid "schema" msgstr "esquema" @@ -1352,293 +1391,293 @@ msgstr "familia de operadores" msgid "rule" msgstr "regla" -#: describe.c:1421 +#: describe.c:1420 msgid "Object descriptions" msgstr "Descripciones de objetos" -#: describe.c:1486 describe.c:4013 +#: describe.c:1485 describe.c:4072 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "No se encontró relación llamada «%s»." -#: describe.c:1489 describe.c:4016 +#: describe.c:1488 describe.c:4075 #, c-format msgid "Did not find any relations." msgstr "No se encontró ninguna relación." -#: describe.c:1685 +#: describe.c:1684 #, c-format msgid "Did not find any relation with OID %s." msgstr "No se encontró relación con OID %s." -#: describe.c:1733 describe.c:1757 +#: describe.c:1732 describe.c:1756 msgid "Start" msgstr "Inicio" -#: describe.c:1734 describe.c:1758 +#: describe.c:1733 describe.c:1757 msgid "Minimum" msgstr "Mínimo" -#: describe.c:1735 describe.c:1759 +#: describe.c:1734 describe.c:1758 msgid "Maximum" msgstr "Máximo" -#: describe.c:1736 describe.c:1760 +#: describe.c:1735 describe.c:1759 msgid "Increment" msgstr "Incremento" -#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4432 -#: describe.c:4777 describe.c:4910 describe.c:4915 describe.c:6660 +#: describe.c:1736 describe.c:1760 describe.c:1889 describe.c:4487 +#: describe.c:4828 describe.c:4964 describe.c:4969 describe.c:6710 msgid "yes" msgstr "sí" -#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4432 -#: describe.c:4774 describe.c:4910 describe.c:6661 +#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4487 +#: describe.c:4825 describe.c:4964 describe.c:6711 msgid "no" msgstr "no" -#: describe.c:1739 describe.c:1763 +#: describe.c:1738 describe.c:1762 msgid "Cycles?" msgstr "¿Cicla?" -#: describe.c:1740 describe.c:1764 +#: describe.c:1739 describe.c:1763 msgid "Cache" msgstr "Cache" -#: describe.c:1805 +#: describe.c:1804 #, c-format msgid "Owned by: %s" msgstr "Asociada a: %s" -#: describe.c:1809 +#: describe.c:1808 #, c-format msgid "Sequence for identity column: %s" msgstr "Secuencia para columna identidad: %s" -#: describe.c:1817 +#: describe.c:1816 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "Secuencia unlogged «%s.%s»" -#: describe.c:1820 +#: describe.c:1819 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Secuencia «%s.%s»" -#: describe.c:1963 +#: describe.c:1962 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Tabla unlogged «%s.%s»" -#: describe.c:1966 +#: describe.c:1965 #, c-format msgid "Table \"%s.%s\"" msgstr "Tabla «%s.%s»" -#: describe.c:1970 +#: describe.c:1969 #, c-format msgid "View \"%s.%s\"" msgstr "Vista «%s.%s»" -#: describe.c:1975 +#: describe.c:1974 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Vista materializada unlogged «%s.%s»" -#: describe.c:1978 +#: describe.c:1977 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Vista materializada \"%s.%s\"" -#: describe.c:1983 +#: describe.c:1982 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Ãndice unlogged «%s.%s»" -#: describe.c:1986 +#: describe.c:1985 #, c-format msgid "Index \"%s.%s\"" msgstr "Ãndice «%s.%s»" -#: describe.c:1991 +#: describe.c:1990 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Ãndice particionado unlogged «%s.%s»" -#: describe.c:1994 +#: describe.c:1993 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Ãndice particionado «%s.%s»" -#: describe.c:1998 +#: describe.c:1997 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "Tabla TOAST «%s.%s»" -#: describe.c:2002 +#: describe.c:2001 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Tipo compuesto «%s.%s»" -#: describe.c:2006 +#: describe.c:2005 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Tabla foránea «%s.%s»" -#: describe.c:2011 +#: describe.c:2010 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Tabla unlogged particionada «%s.%s»" -#: describe.c:2014 +#: describe.c:2013 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Tabla particionada «%s.%s»" -#: describe.c:2030 describe.c:4349 +#: describe.c:2029 describe.c:4405 msgid "Collation" msgstr "Ordenamiento" -#: describe.c:2031 describe.c:4350 +#: describe.c:2030 describe.c:4406 msgid "Nullable" msgstr "Nulable" -#: describe.c:2032 describe.c:4351 +#: describe.c:2031 describe.c:4407 msgid "Default" msgstr "Por omisión" -#: describe.c:2035 +#: describe.c:2034 msgid "Key?" msgstr "¿Llave?" -#: describe.c:2037 describe.c:4671 describe.c:4682 +#: describe.c:2036 describe.c:4723 describe.c:4734 msgid "Definition" msgstr "Definición" -#: describe.c:2039 describe.c:5712 describe.c:5787 describe.c:5853 -#: describe.c:5912 +#: describe.c:2038 describe.c:5757 describe.c:5831 describe.c:5896 +#: describe.c:5954 msgid "FDW options" msgstr "Opciones de FDW" -#: describe.c:2041 +#: describe.c:2040 msgid "Storage" msgstr "Almacenamiento" -#: describe.c:2043 +#: describe.c:2042 msgid "Compression" msgstr "Compresión" -#: describe.c:2045 +#: describe.c:2044 msgid "Stats target" msgstr "Estadísticas" -#: describe.c:2181 +#: describe.c:2180 #, c-format msgid "Partition of: %s %s%s" msgstr "Partición de: %s %s%s" -#: describe.c:2194 +#: describe.c:2193 msgid "No partition constraint" msgstr "Sin restricción de partición" -#: describe.c:2196 +#: describe.c:2195 #, c-format msgid "Partition constraint: %s" msgstr "Restricción de partición: %s" -#: describe.c:2220 +#: describe.c:2219 #, c-format msgid "Partition key: %s" msgstr "Llave de partición: %s" -#: describe.c:2246 +#: describe.c:2245 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Tabla dueña: «%s.%s»" -#: describe.c:2315 +#: describe.c:2314 msgid "primary key, " msgstr "llave primaria, " -#: describe.c:2318 +#: describe.c:2317 msgid "unique" msgstr "único" -#: describe.c:2320 +#: describe.c:2319 msgid " nulls not distinct" msgstr " nulls no distintos" -#: describe.c:2321 +#: describe.c:2320 msgid ", " msgstr ", " -#: describe.c:2328 +#: describe.c:2327 #, c-format msgid "for table \"%s.%s\"" msgstr "de tabla «%s.%s»" -#: describe.c:2332 +#: describe.c:2331 #, c-format msgid ", predicate (%s)" msgstr ", predicado (%s)" -#: describe.c:2335 +#: describe.c:2334 msgid ", clustered" msgstr ", clustered" -#: describe.c:2338 +#: describe.c:2337 msgid ", invalid" msgstr ", no válido" -#: describe.c:2341 +#: describe.c:2340 msgid ", deferrable" msgstr ", postergable" -#: describe.c:2344 +#: describe.c:2343 msgid ", initially deferred" msgstr ", inicialmente postergada" -#: describe.c:2347 +#: describe.c:2346 msgid ", replica identity" msgstr ", identidad de replicación" -#: describe.c:2401 +#: describe.c:2400 msgid "Indexes:" msgstr "Ãndices:" -#: describe.c:2484 +#: describe.c:2483 msgid "Check constraints:" msgstr "Restricciones CHECK:" -#: describe.c:2552 +#: describe.c:2551 msgid "Foreign-key constraints:" msgstr "Restricciones de llave foránea:" -#: describe.c:2615 +#: describe.c:2614 msgid "Referenced by:" msgstr "Referenciada por:" -#: describe.c:2665 +#: describe.c:2664 msgid "Policies:" msgstr "Políticas:" -#: describe.c:2668 +#: describe.c:2667 msgid "Policies (forced row security enabled):" msgstr "Políticas (seguridad de registros forzada):" -#: describe.c:2671 +#: describe.c:2670 msgid "Policies (row security enabled): (none)" msgstr "Políticas (seguridad de filas activa): (ninguna)" -#: describe.c:2674 +#: describe.c:2673 msgid "Policies (forced row security enabled): (none)" msgstr "Políticas (seguridad de filas forzada): (ninguna)" -#: describe.c:2677 +#: describe.c:2676 msgid "Policies (row security disabled):" msgstr "Políticas (seguridad de filas inactiva):" -#: describe.c:2737 describe.c:2841 +#: describe.c:2736 describe.c:2841 msgid "Statistics objects:" msgstr "Objetos de estadísticas:" @@ -1658,7 +1697,7 @@ msgstr "Reglas que se activan siempre:" msgid "Rules firing on replica only:" msgstr "Reglas que se activan sólo en las réplicas:" -#: describe.c:3031 describe.c:5048 +#: describe.c:3031 describe.c:5100 msgid "Publications:" msgstr "Publicaciones:" @@ -1753,442 +1792,450 @@ msgstr "Tablespace: «%s»" msgid ", tablespace \"%s\"" msgstr ", tablespace «%s»" -#: describe.c:3674 +#: describe.c:3670 msgid "List of roles" msgstr "Lista de roles" -#: describe.c:3676 +#: describe.c:3672 describe.c:3840 msgid "Role name" msgstr "Nombre de rol" -#: describe.c:3677 +#: describe.c:3673 msgid "Attributes" msgstr "Atributos" -#: describe.c:3679 -msgid "Member of" -msgstr "Miembro de" - -#: describe.c:3690 +#: describe.c:3684 msgid "Superuser" msgstr "Superusuario" -#: describe.c:3693 +#: describe.c:3687 msgid "No inheritance" msgstr "Sin herencia" -#: describe.c:3696 +#: describe.c:3690 msgid "Create role" msgstr "Crear rol" -#: describe.c:3699 +#: describe.c:3693 msgid "Create DB" msgstr "Crear BD" -#: describe.c:3702 +#: describe.c:3696 msgid "Cannot login" msgstr "No puede conectarse" -#: describe.c:3705 +#: describe.c:3699 msgid "Replication" msgstr "Replicación" -#: describe.c:3709 +#: describe.c:3703 msgid "Bypass RLS" msgstr "Ignora RLS" -#: describe.c:3718 +#: describe.c:3712 msgid "No connections" msgstr "Ninguna conexión" -#: describe.c:3720 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d conexión" msgstr[1] "%d conexiones" -#: describe.c:3730 +#: describe.c:3724 msgid "Password valid until " msgstr "Constraseña válida hasta " -#: describe.c:3783 +#: describe.c:3775 msgid "Role" msgstr "Nombre de rol" -#: describe.c:3784 +#: describe.c:3776 msgid "Database" msgstr "Base de Datos" -#: describe.c:3785 +#: describe.c:3777 msgid "Settings" msgstr "Parámetros" -#: describe.c:3809 +#: describe.c:3801 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "No se encontró ningún parámetro para el rol «%s» y la base de datos «%s»." -#: describe.c:3812 +#: describe.c:3804 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "No se encontró ningún parámetro para el rol «%s»." -#: describe.c:3815 +#: describe.c:3807 #, c-format msgid "Did not find any settings." msgstr "No se encontró ningún parámetro." -#: describe.c:3820 +#: describe.c:3811 msgid "List of settings" msgstr "Listado de parámetros" -#: describe.c:3891 +#: describe.c:3841 +msgid "Member of" +msgstr "Miembro de" + +#: describe.c:3858 +msgid "Grantor" +msgstr "Otorgador" + +#: describe.c:3884 +msgid "List of role grants" +msgstr "Lista de roles otorgados" + +#: describe.c:3950 msgid "index" msgstr "índice" -#: describe.c:3893 +#: describe.c:3952 msgid "TOAST table" msgstr "Tabla TOAST" -#: describe.c:3896 describe.c:4108 +#: describe.c:3955 describe.c:4166 msgid "partitioned index" msgstr "índice particionado" -#: describe.c:3916 +#: describe.c:3975 msgid "permanent" msgstr "permanente" -#: describe.c:3917 +#: describe.c:3976 msgid "temporary" msgstr "temporal" -#: describe.c:3918 +#: describe.c:3977 msgid "unlogged" msgstr "unlogged" -#: describe.c:3919 +#: describe.c:3978 msgid "Persistence" msgstr "Persistencia" -#: describe.c:3935 +#: describe.c:3994 msgid "Access method" msgstr "Método de acceso" -#: describe.c:4021 +#: describe.c:4079 msgid "List of relations" msgstr "Listado de relaciones" -#: describe.c:4069 +#: describe.c:4127 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "El servidor (versión %s) no soporta particionamiento declarativo de tablas." -#: describe.c:4080 +#: describe.c:4138 msgid "List of partitioned indexes" msgstr "Listado de índices particionados" -#: describe.c:4082 +#: describe.c:4140 msgid "List of partitioned tables" msgstr "Listado de tablas particionadas" -#: describe.c:4086 +#: describe.c:4144 msgid "List of partitioned relations" msgstr "Listado de relaciones particionadas" -#: describe.c:4117 +#: describe.c:4175 msgid "Parent name" msgstr "Nombre del padre" -#: describe.c:4130 +#: describe.c:4188 msgid "Leaf partition size" msgstr "Tamaño de particiones hoja" -#: describe.c:4133 describe.c:4139 +#: describe.c:4191 describe.c:4197 msgid "Total size" msgstr "Tamaño total" -#: describe.c:4264 +#: describe.c:4321 msgid "Trusted" msgstr "Confiable" -#: describe.c:4273 +#: describe.c:4330 msgid "Internal language" msgstr "Lenguaje interno" -#: describe.c:4274 +#: describe.c:4331 msgid "Call handler" msgstr "Manejador de llamada" -#: describe.c:4275 describe.c:5698 +#: describe.c:4332 describe.c:5743 msgid "Validator" msgstr "Validador" -#: describe.c:4276 +#: describe.c:4333 msgid "Inline handler" msgstr "Manejador en línea" -#: describe.c:4311 +#: describe.c:4367 msgid "List of languages" msgstr "Lista de lenguajes" -#: describe.c:4352 +#: describe.c:4408 msgid "Check" msgstr "Check" -#: describe.c:4396 +#: describe.c:4451 msgid "List of domains" msgstr "Listado de dominios" -#: describe.c:4430 +#: describe.c:4485 msgid "Source" msgstr "Fuente" -#: describe.c:4431 +#: describe.c:4486 msgid "Destination" msgstr "Destino" -#: describe.c:4433 describe.c:6662 +#: describe.c:4488 describe.c:6712 msgid "Default?" msgstr "Por omisión?" -#: describe.c:4475 +#: describe.c:4529 msgid "List of conversions" msgstr "Listado de conversiones" -#: describe.c:4503 +#: describe.c:4557 msgid "Parameter" msgstr "Parámetro" -#: describe.c:4504 +#: describe.c:4558 msgid "Value" msgstr "Valor" -#: describe.c:4511 +#: describe.c:4565 msgid "Context" msgstr "Contexto" -#: describe.c:4544 +#: describe.c:4597 msgid "List of configuration parameters" msgstr "Listado de parámetro de configuración" -#: describe.c:4546 +#: describe.c:4599 msgid "List of non-default configuration parameters" msgstr "Listado de parámetros de configuración no-default" -#: describe.c:4573 +#: describe.c:4626 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "El servidor (versión %s) no soporta triggers por eventos." -#: describe.c:4593 +#: describe.c:4646 msgid "Event" msgstr "Evento" -#: describe.c:4595 +#: describe.c:4648 msgid "enabled" msgstr "activo" -#: describe.c:4596 +#: describe.c:4649 msgid "replica" msgstr "réplica" -#: describe.c:4597 +#: describe.c:4650 msgid "always" msgstr "siempre" -#: describe.c:4598 +#: describe.c:4651 msgid "disabled" msgstr "inactivo" -#: describe.c:4599 describe.c:6514 +#: describe.c:4652 describe.c:6553 msgid "Enabled" msgstr "Activo" -#: describe.c:4601 +#: describe.c:4654 msgid "Tags" msgstr "Etiquetas" -#: describe.c:4625 +#: describe.c:4677 msgid "List of event triggers" msgstr "Listado de disparadores por eventos" -#: describe.c:4652 +#: describe.c:4704 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "El servidor (versión %s) no soporta estadísticas extendidas." -#: describe.c:4689 +#: describe.c:4741 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4690 +#: describe.c:4742 msgid "Dependencies" msgstr "Dependencias" -#: describe.c:4700 +#: describe.c:4752 msgid "MCV" msgstr "MCV" -#: describe.c:4724 +#: describe.c:4775 msgid "List of extended statistics" msgstr "Lista de estadísticas extendidas" -#: describe.c:4751 +#: describe.c:4802 msgid "Source type" msgstr "Tipo fuente" -#: describe.c:4752 +#: describe.c:4803 msgid "Target type" msgstr "Tipo destino" -#: describe.c:4776 +#: describe.c:4827 msgid "in assignment" msgstr "en asignación" -#: describe.c:4778 +#: describe.c:4829 msgid "Implicit?" msgstr "Implícito?" -#: describe.c:4837 +#: describe.c:4887 msgid "List of casts" msgstr "Listado de conversiones de tipo (casts)" -#: describe.c:4877 describe.c:4881 +#: describe.c:4927 describe.c:4931 msgid "Provider" msgstr "Proveedor" -#: describe.c:4911 describe.c:4916 +#: describe.c:4965 describe.c:4970 msgid "Deterministic?" msgstr "¿Determinístico?" -#: describe.c:4956 +#: describe.c:5009 msgid "List of collations" msgstr "Listado de ordenamientos" -#: describe.c:5018 +#: describe.c:5070 msgid "List of schemas" msgstr "Listado de esquemas" -#: describe.c:5135 +#: describe.c:5186 msgid "List of text search parsers" msgstr "Listado de analizadores de búsqueda en texto" -#: describe.c:5185 +#: describe.c:5236 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "No se encontró ningún analizador de búsqueda en texto llamado «%s»." -#: describe.c:5188 +#: describe.c:5239 #, c-format msgid "Did not find any text search parsers." msgstr "No se encontró ningún analizador de búsqueda en texto." -#: describe.c:5263 +#: describe.c:5314 msgid "Start parse" msgstr "Inicio de parse" -#: describe.c:5264 +#: describe.c:5315 msgid "Method" msgstr "Método" -#: describe.c:5268 +#: describe.c:5319 msgid "Get next token" msgstr "Obtener siguiente elemento" -#: describe.c:5270 +#: describe.c:5321 msgid "End parse" msgstr "Fin de parse" -#: describe.c:5272 +#: describe.c:5323 msgid "Get headline" msgstr "Obtener encabezado" -#: describe.c:5274 +#: describe.c:5325 msgid "Get token types" msgstr "Obtener tipos de elemento" -#: describe.c:5285 +#: describe.c:5335 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Analizador de búsqueda en texto «%s.%s»" -#: describe.c:5288 +#: describe.c:5338 #, c-format msgid "Text search parser \"%s\"" msgstr "Analizador de búsqueda en texto «%s»" -#: describe.c:5307 +#: describe.c:5357 msgid "Token name" msgstr "Nombre de elemento" -#: describe.c:5321 +#: describe.c:5370 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Tipos de elemento para el analizador «%s.%s»" -#: describe.c:5324 +#: describe.c:5373 #, c-format msgid "Token types for parser \"%s\"" msgstr "Tipos de elemento para el analizador «%s»" -#: describe.c:5368 +#: describe.c:5417 msgid "Template" msgstr "Plantilla" -#: describe.c:5369 +#: describe.c:5418 msgid "Init options" msgstr "Opciones de inicialización" -#: describe.c:5396 +#: describe.c:5444 msgid "List of text search dictionaries" msgstr "Listado de diccionarios de búsqueda en texto" -#: describe.c:5429 +#: describe.c:5477 msgid "Init" msgstr "Inicializador" -#: describe.c:5430 +#: describe.c:5478 msgid "Lexize" msgstr "Fn. análisis léx." -#: describe.c:5462 +#: describe.c:5509 msgid "List of text search templates" msgstr "Listado de plantillas de búsqueda en texto" -#: describe.c:5517 +#: describe.c:5563 msgid "List of text search configurations" msgstr "Listado de configuraciones de búsqueda en texto" -#: describe.c:5568 +#: describe.c:5614 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "No se encontró una configuración de búsqueda en texto llamada «%s»." -#: describe.c:5571 +#: describe.c:5617 #, c-format msgid "Did not find any text search configurations." msgstr "No se encontró una configuración de búsqueda en texto." -#: describe.c:5637 +#: describe.c:5683 msgid "Token" msgstr "Elemento" -#: describe.c:5638 +#: describe.c:5684 msgid "Dictionaries" msgstr "Diccionarios" -#: describe.c:5649 +#: describe.c:5695 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Configuración de búsqueda en texto «%s.%s»" -#: describe.c:5652 +#: describe.c:5698 #, c-format msgid "Text search configuration \"%s\"" msgstr "Configuración de búsqueda en texto «%s»" -#: describe.c:5656 +#: describe.c:5702 #, c-format msgid "" "\n" @@ -2197,7 +2244,7 @@ msgstr "" "\n" "Analizador: «%s.%s»" -#: describe.c:5659 +#: describe.c:5705 #, c-format msgid "" "\n" @@ -2206,266 +2253,273 @@ msgstr "" "\n" "Analizador: «%s»" -#: describe.c:5740 +#: describe.c:5784 msgid "List of foreign-data wrappers" msgstr "Listado de conectores de datos externos" -#: describe.c:5768 +#: describe.c:5812 msgid "Foreign-data wrapper" msgstr "Conectores de datos externos" -#: describe.c:5786 describe.c:5976 +#: describe.c:5830 describe.c:6017 msgid "Version" msgstr "Versión" -#: describe.c:5817 +#: describe.c:5860 msgid "List of foreign servers" msgstr "Listado de servidores foráneos" -#: describe.c:5842 describe.c:5901 +#: describe.c:5885 describe.c:5943 msgid "Server" msgstr "Servidor" -#: describe.c:5843 +#: describe.c:5886 msgid "User name" msgstr "Nombre de usuario" -#: describe.c:5873 +#: describe.c:5915 msgid "List of user mappings" msgstr "Listado de mapeos de usuario" -#: describe.c:5946 +#: describe.c:5987 msgid "List of foreign tables" msgstr "Listado de tablas foráneas" -#: describe.c:5998 +#: describe.c:6038 msgid "List of installed extensions" msgstr "Listado de extensiones instaladas" -#: describe.c:6046 +#: describe.c:6086 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "No se encontró extensión llamada «%s»." -#: describe.c:6049 +#: describe.c:6089 #, c-format msgid "Did not find any extensions." msgstr "No se encontró ninguna extensión." -#: describe.c:6093 +#: describe.c:6133 msgid "Object description" msgstr "Descripción de objeto" -#: describe.c:6103 +#: describe.c:6142 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objetos en extensión «%s»" -#: describe.c:6144 +#: describe.c:6183 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "el nombre no es válido (demasiados puntos): %s" -#: describe.c:6158 +#: describe.c:6197 #, c-format msgid "cross-database references are not implemented: %s" msgstr "no están implementadas las referencias entre bases de datos: %s" -#: describe.c:6189 describe.c:6316 +#: describe.c:6228 describe.c:6354 #, c-format msgid "The server (version %s) does not support publications." msgstr "El servidor (versión %s) no soporta publicaciones." -#: describe.c:6206 describe.c:6394 +#: describe.c:6245 describe.c:6432 msgid "All tables" msgstr "Todas las tablas" -#: describe.c:6207 describe.c:6395 +#: describe.c:6246 describe.c:6433 msgid "Inserts" msgstr "Inserts" -#: describe.c:6208 describe.c:6396 +#: describe.c:6247 describe.c:6434 msgid "Updates" msgstr "Updates" -#: describe.c:6209 describe.c:6397 +#: describe.c:6248 describe.c:6435 msgid "Deletes" msgstr "Deletes" -#: describe.c:6213 describe.c:6399 +#: describe.c:6252 describe.c:6437 msgid "Truncates" msgstr "Truncates" -#: describe.c:6217 describe.c:6401 +#: describe.c:6256 describe.c:6439 msgid "Via root" msgstr "Via root" -#: describe.c:6239 +#: describe.c:6277 msgid "List of publications" msgstr "Listado de publicaciones" -#: describe.c:6363 +#: describe.c:6401 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "No se encontró publicación llamada «%s»." -#: describe.c:6366 +#: describe.c:6404 #, c-format msgid "Did not find any publications." msgstr "No se encontró ninguna publicación." -#: describe.c:6390 +#: describe.c:6428 #, c-format msgid "Publication %s" msgstr "Publicación %s" -#: describe.c:6443 +#: describe.c:6481 msgid "Tables:" msgstr "Tablas:" -#: describe.c:6455 +#: describe.c:6493 msgid "Tables from schemas:" msgstr "Tablas de esquemas:" -#: describe.c:6499 +#: describe.c:6538 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "El servidor (versión %s) no soporta suscripciones." -#: describe.c:6515 +#: describe.c:6554 msgid "Publication" msgstr "Publicación" -#: describe.c:6524 +#: describe.c:6563 msgid "Binary" msgstr "Binario" -#: describe.c:6533 describe.c:6537 +#: describe.c:6572 describe.c:6576 msgid "Streaming" msgstr "De flujo" -#: describe.c:6545 +#: describe.c:6584 msgid "Two-phase commit" msgstr "Commit 2-fases" -#: describe.c:6546 +#: describe.c:6585 msgid "Disable on error" msgstr "Desactivar en error" -#: describe.c:6553 +#: describe.c:6592 msgid "Origin" msgstr "Origen" -#: describe.c:6554 -#| msgid "redo is not required" +#: describe.c:6593 msgid "Password required" msgstr "Contraseña requerida" -#: describe.c:6555 +#: describe.c:6594 msgid "Run as owner?" msgstr "¿Ejec. como dueño?" -#: describe.c:6560 +#: describe.c:6599 +msgid "Failover" +msgstr "“Failoverâ€" + +#: describe.c:6604 msgid "Synchronous commit" msgstr "Commit síncrono" -#: describe.c:6561 +#: describe.c:6605 msgid "Conninfo" msgstr "Conninfo" -#: describe.c:6567 +#: describe.c:6611 msgid "Skip LSN" msgstr "Saltar LSN" -#: describe.c:6594 +#: describe.c:6637 msgid "List of subscriptions" msgstr "Listado de suscripciones" -#: describe.c:6656 describe.c:6752 describe.c:6845 describe.c:6940 +#: describe.c:6666 +msgid "(none)" +msgstr "(ninguno)" + +#: describe.c:6706 describe.c:6801 describe.c:6893 describe.c:6987 msgid "AM" msgstr "AM" -#: describe.c:6657 +#: describe.c:6707 msgid "Input type" msgstr "Tipo de entrada" -#: describe.c:6658 +#: describe.c:6708 msgid "Storage type" msgstr "Tipo de almacenamiento" -#: describe.c:6659 +#: describe.c:6709 msgid "Operator class" msgstr "Clase de operador" -#: describe.c:6671 describe.c:6753 describe.c:6846 describe.c:6941 +#: describe.c:6721 describe.c:6802 describe.c:6894 describe.c:6988 msgid "Operator family" msgstr "Familia de operadores" -#: describe.c:6707 +#: describe.c:6756 msgid "List of operator classes" msgstr "Listado de clases de operador" -#: describe.c:6754 +#: describe.c:6803 msgid "Applicable types" msgstr "Tipos aplicables" -#: describe.c:6796 +#: describe.c:6844 msgid "List of operator families" msgstr "Listado de familias de operadores" -#: describe.c:6847 +#: describe.c:6895 msgid "Operator" msgstr "Operador" -#: describe.c:6848 +#: describe.c:6896 msgid "Strategy" msgstr "Estrategia" -#: describe.c:6849 +#: describe.c:6897 msgid "ordering" msgstr "ordenamiento" -#: describe.c:6850 +#: describe.c:6898 msgid "search" msgstr "búsqueda" -#: describe.c:6851 +#: describe.c:6899 msgid "Purpose" msgstr "Propósito" -#: describe.c:6856 +#: describe.c:6904 msgid "Sort opfamily" msgstr "familia de ops de ordenamiento" -#: describe.c:6895 +#: describe.c:6942 msgid "List of operators of operator families" msgstr "Lista de operadores de familias de operadores" -#: describe.c:6942 +#: describe.c:6989 msgid "Registered left type" msgstr "Tipo de dato izquierdo registrado" -#: describe.c:6943 +#: describe.c:6990 msgid "Registered right type" msgstr "Tipo de dato derecho registrado" -#: describe.c:6944 +#: describe.c:6991 msgid "Number" msgstr "Número" -#: describe.c:6988 +#: describe.c:7034 msgid "List of support functions of operator families" msgstr "Listado de funciones de la familia de operadores %s" -#: describe.c:7019 +#: describe.c:7065 msgid "ID" msgstr "ID" -#: describe.c:7040 +#: describe.c:7085 msgid "Large objects" msgstr "Objetos grandes" -#: help.c:75 +#: help.c:63 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2473,11 +2527,11 @@ msgstr "" "psql es el terminal interactivo de PostgreSQL.\n" "\n" -#: help.c:76 help.c:394 help.c:478 help.c:521 +#: help.c:64 help.c:372 help.c:456 help.c:502 msgid "Usage:\n" msgstr "Empleo:\n" -#: help.c:77 +#: help.c:65 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2485,30 +2539,27 @@ msgstr "" " psql [OPCIONES]... [BASE-DE-DATOS [USUARIO]]\n" "\n" -#: help.c:79 +#: help.c:67 msgid "General options:\n" msgstr "Opciones generales:\n" -#: help.c:84 +#: help.c:68 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=ORDEN ejecutar sólo una orden (SQL o interna) y salir\n" -#: help.c:85 -#, c-format -msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" -msgstr "" -" -d, --dbname=NOMBRE nombre de base de datos a conectarse\n" -" (por omisión: «%s»)\n" +#: help.c:69 +msgid " -d, --dbname=DBNAME database name to connect to\n" +msgstr " -d, --dbname=BASE base de datos a la cual conectarse\n" -#: help.c:87 +#: help.c:70 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=ARCHIVO ejecutar órdenes desde archivo, luego salir\n" -#: help.c:88 +#: help.c:71 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list listar bases de datos, luego salir\n" -#: help.c:89 +#: help.c:72 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2518,15 +2569,15 @@ msgstr "" " definir variable de psql NOMBRE a VALOR\n" " (p.ej. -v ON_ERROR_STOP=1)\n" -#: help.c:92 +#: help.c:75 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión, luego salir\n" -#: help.c:93 +#: help.c:76 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc no leer archivo de configuración (~/.psqlrc)\n" -#: help.c:94 +#: help.c:77 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2534,19 +2585,19 @@ msgstr "" " -1 («uno»), --single-transaction\n" " ejecuta órdenes en una única transacción\n" -#: help.c:96 +#: help.c:79 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=opcs] mostrar esta ayuda, luego salir\n" -#: help.c:97 +#: help.c:80 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands listar órdenes backslash, luego salir\n" -#: help.c:98 +#: help.c:81 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables listar variables especiales, luego salir\n" -#: help.c:100 +#: help.c:83 msgid "" "\n" "Input and output options:\n" @@ -2554,47 +2605,47 @@ msgstr "" "\n" "Opciones de entrada y salida:\n" -#: help.c:101 +#: help.c:84 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all mostrar las órdenes del script\n" -#: help.c:102 +#: help.c:85 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors mostrar órdenes fallidas\n" -#: help.c:103 +#: help.c:86 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries mostrar órdenes enviadas al servidor\n" -#: help.c:104 +#: help.c:87 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden mostrar consultas generadas por órdenes internas\n" -#: help.c:105 +#: help.c:88 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=ARCH envía el registro de la sesión a un archivo\n" -#: help.c:106 +#: help.c:89 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline deshabilitar edición de línea de órdenes (readline)\n" -#: help.c:107 +#: help.c:90 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=ARCHIVO enviar resultados de consultas a archivo (u |orden)\n" -#: help.c:108 +#: help.c:91 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet modo silencioso (sin mensajes, sólo resultados)\n" -#: help.c:109 +#: help.c:92 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step modo paso a paso (confirmar cada consulta)\n" -#: help.c:110 +#: help.c:93 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line modo de líneas (fin de línea termina la orden SQL)\n" -#: help.c:112 +#: help.c:95 msgid "" "\n" "Output format options:\n" @@ -2602,15 +2653,15 @@ msgstr "" "\n" "Opciones de formato de salida:\n" -#: help.c:113 +#: help.c:96 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align modo de salida desalineado\n" -#: help.c:114 +#: help.c:97 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv modo de salida de tabla CSV (valores separados por comas)\n" -#: help.c:115 +#: help.c:98 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2619,15 +2670,15 @@ msgstr "" " -F, --field-separator=CADENA separador de campos para salida desalineada\n" " (por omisión: «%s»)\n" -#: help.c:118 +#: help.c:101 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html modo de salida en tablas HTML\n" -#: help.c:119 +#: help.c:102 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr " -P, --pset=VAR[=ARG] definir opción de impresión VAR en ARG (ver orden \\pset)\n" -#: help.c:120 +#: help.c:103 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2635,21 +2686,21 @@ msgstr "" " -R, --record-separator=CADENA separador de registros para salida desalineada\n" " (por omisión: salto de línea)\n" -#: help.c:122 +#: help.c:105 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only sólo muestra registros\n" -#: help.c:123 +#: help.c:106 msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr "" " -T, --table-attr=TEXTO\n" " definir atributos de marcas de tabla HTML (ancho, borde)\n" -#: help.c:124 +#: help.c:107 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded activar modo expandido de salida de tablas\n" -#: help.c:125 +#: help.c:108 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2657,7 +2708,7 @@ msgstr "" " -z, --field-separator-zero\n" " definir separador de campos para salida desalineada al byte cero\n" -#: help.c:127 +#: help.c:110 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2665,7 +2716,7 @@ msgstr "" " -0, --record-separator-zero\n" " definir separador de filas para salida desalineada al byte cero\n" -#: help.c:130 +#: help.c:113 msgid "" "\n" "Connection options:\n" @@ -2673,40 +2724,31 @@ msgstr "" "\n" "Opciones de conexión:\n" -#: help.c:133 -#, c-format -msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" +#: help.c:114 +msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=NOMBRE nombre del anfitrión o directorio de socket\n" -" (por omisión: «%s»)\n" - -#: help.c:134 -msgid "local socket" -msgstr "socket local" +" -h, --host=ANFITRIÓN anfitrión de la base de datos o\n" +" directorio del enchufe (socket)\n" -#: help.c:137 -#, c-format -msgid " -p, --port=PORT database server port (default: \"%s\")\n" -msgstr " -p, --port=PUERTO puerto del servidor (por omisión: «%s»)\n" +#: help.c:115 +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PUERTO puerto del servidor\n" -#: help.c:140 -#, c-format -msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" -msgstr "" -" -U, --username=NOMBRE\n" -" nombre de usuario (por omisión: «%s»)\n" +#: help.c:116 +msgid " -U, --username=USERNAME database user name\n" +msgstr " -U, --username=USUARIO nombre usuario de la base de datos\n" -#: help.c:142 +#: help.c:117 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password nunca pedir contraseña\n" -#: help.c:143 +#: help.c:118 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" " -W, --password forzar petición de contraseña\n" " (debería ser automático)\n" -#: help.c:145 +#: help.c:120 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2720,41 +2762,41 @@ msgstr "" "en la documentación de PostgreSQL.\n" "\n" -#: help.c:148 +#: help.c:123 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Reporte de errores a <%s>.\n" -#: help.c:149 +#: help.c:124 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: help.c:191 +#: help.c:166 msgid "General\n" msgstr "General\n" -#: help.c:192 +#: help.c:167 msgid " \\bind [PARAM]... set query parameters\n" msgstr "" " \\bind [PARAM]...\n" " definir parámetros de consulta\n" -#: help.c:193 +#: help.c:168 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright mostrar términos de uso y distribución de PostgreSQL\n" -#: help.c:194 +#: help.c:169 msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr "" " \\crosstabview [COLUMNAS]\n" " ejecutar la consulta y desplegar en «crosstab»\n" -#: help.c:195 +#: help.c:170 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose mostrar error más reciente en máxima verbosidad\n" -#: help.c:196 +#: help.c:171 msgid "" " \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" @@ -2763,242 +2805,248 @@ msgstr "" " ejecuta la consulta (y envía el resultado a un fichero o |pipe);\n" " \\g sin argumentos es equivalente a un punto y coma\n" -#: help.c:198 +#: help.c:173 msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc describir resultado de la consulta, sin ejecutarla\n" -#: help.c:199 +#: help.c:174 msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec ejecutar la consulta, luego ejecuta cada valor del resultado\n" -#: help.c:200 +#: help.c:175 msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr "" " \\gset [PREFIJO] ejecutar la consulta y almacenar el resultado en variables\n" " de psql\n" -#: help.c:201 +#: help.c:176 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr "" " \\gx [(OPTIONS)] [FILE]\n" " como \\g, pero fuerza el modo de salida expandido\n" -#: help.c:202 +#: help.c:177 msgid " \\q quit psql\n" msgstr " \\q salir de psql\n" -#: help.c:203 -msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n" -msgstr " \\watch [[i=]SEG] [c=N] ejecute consulta cada SEG segundos, hasta N veces\n" +#: help.c:178 +msgid "" +" \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" execute query every SEC seconds, up to N times,\n" +" stop if less than MIN rows are returned\n" +msgstr "" +" \\watch [[i=]SEG] [c=N] [m=MIN]\n" +" ejecutar consulta cada SEG segundos, hasta N veces,\n" +" deteniéndose si menos de MIN registros son devueltos\n" -#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:297 help.c:305 -#: help.c:325 help.c:338 help.c:347 +#: help.c:181 help.c:189 help.c:201 help.c:211 help.c:218 help.c:275 help.c:283 +#: help.c:303 help.c:316 help.c:325 msgid "\n" msgstr "\n" -#: help.c:206 +#: help.c:183 msgid "Help\n" msgstr "Ayuda\n" -#: help.c:208 +#: help.c:185 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] desplegar ayuda sobre las órdenes backslash\n" -#: help.c:209 +#: help.c:186 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options desplegar ayuda sobre opciones de línea de órdenes\n" -#: help.c:210 +#: help.c:187 msgid " \\? variables show help on special variables\n" msgstr " \\? variables desplegar ayuda sobre variables especiales\n" -#: help.c:211 +#: help.c:188 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr "" " \\h [NOMBRE] mostrar ayuda de sintaxis de órdenes SQL;\n" " use «*» para todas las órdenes\n" -#: help.c:214 +#: help.c:191 msgid "Query Buffer\n" msgstr "Búfer de consulta\n" -#: help.c:215 +#: help.c:192 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr "" " \\e [ARCHIVO] [LÃNEA]\n" " editar el búfer de consulta (o archivo) con editor externo\n" -#: help.c:216 +#: help.c:193 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr "" " \\ef [NOMBRE-FUNCIÓN [LÃNEA]]\n" " editar una función con editor externo\n" -#: help.c:217 +#: help.c:194 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr "" " \\ev [NOMBRE-VISTA [LÃNEA]]\n" " editar definición de una vista con editor externo\n" -#: help.c:218 +#: help.c:195 msgid " \\p show the contents of the query buffer\n" msgstr " \\p mostrar el contenido del búfer de consulta\n" -#: help.c:219 +#: help.c:196 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r reiniciar (limpiar) el búfer de consulta\n" -#: help.c:221 +#: help.c:198 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [ARCHIVO] mostrar historial de órdenes o guardarlo en archivo\n" -#: help.c:223 +#: help.c:200 msgid " \\w FILE write query buffer to file\n" msgstr " \\w ARCHIVO escribir búfer de consulta a archivo\n" -#: help.c:226 +#: help.c:203 msgid "Input/Output\n" msgstr "" "Entrada/Salida\n" " (con -n, donde existe, se omite el salto de línea final)\n" -#: help.c:227 +#: help.c:204 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr " \\copy ... ejecutar orden SQL COPY con flujo de datos al cliente\n" -#: help.c:228 +#: help.c:205 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [STRING] escribe la cadena en la salida estándar\n" -#: help.c:229 +#: help.c:206 msgid " \\i FILE execute commands from file\n" msgstr " \\i ARCHIVO ejecutar órdenes desde archivo\n" -#: help.c:230 +#: help.c:207 msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr " \\ir ARCHIVO como \\i, pero relativo a la ubicación del script actual\n" -#: help.c:231 +#: help.c:208 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [ARCHIVO] enviar resultados de consultas a archivo u |orden\n" -#: help.c:232 +#: help.c:209 msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr " \\qecho [-n] [STRING] escribe la cadena hacia flujo de salida \\o\n" -#: help.c:233 +#: help.c:210 msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr " \\warn [-n] [STRING] escribe la cadena a la salida de error estándar\n" -#: help.c:236 +#: help.c:213 msgid "Conditional\n" msgstr "Condicional\n" -#: help.c:237 +#: help.c:214 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPRESIÓN inicia bloque condicional\n" -#: help.c:238 +#: help.c:215 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR alternativa dentro del bloque condicional actual\n" -#: help.c:239 +#: help.c:216 msgid " \\else final alternative within current conditional block\n" msgstr " \\else alternativa final dentro del bloque condicional actual\n" -#: help.c:240 +#: help.c:217 msgid " \\endif end conditional block\n" msgstr " \\endif termina el bloque condicional\n" -#: help.c:243 +#: help.c:220 msgid "Informational\n" msgstr "Informativo\n" -#: help.c:244 +#: help.c:221 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (opciones: S = desplegar objetos de sistema, + = agregar más detalle)\n" -#: help.c:245 +#: help.c:222 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] listar tablas, vistas y secuencias\n" -#: help.c:246 +#: help.c:223 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NOMBRE describir tabla, índice, secuencia o vista\n" -#: help.c:247 +#: help.c:224 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [PATRÓN] listar funciones de agregación\n" -#: help.c:248 +#: help.c:225 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [PATRÓN] listar métodos de acceso\n" -#: help.c:249 +#: help.c:226 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] listar las clases de operadores\n" -#: help.c:250 +#: help.c:227 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] listar las familias de operadores\n" -#: help.c:251 +#: help.c:228 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] listar los operadores de la familia de operadores\n" -#: help.c:252 +#: help.c:229 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] enumera las funciones de la familia de operadores\n" -#: help.c:253 +#: help.c:230 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [PATRÓN] listar tablespaces\n" -#: help.c:254 +#: help.c:231 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [PATRÓN] listar conversiones\n" -#: help.c:255 +#: help.c:232 msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" msgstr " \\dconfig[+] [PATRÓN] listar parámetros de configuración\n" -#: help.c:256 +#: help.c:233 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [PATRÓN] listar conversiones de tipo (casts)\n" -#: help.c:257 +#: help.c:234 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [PATRÓN] listar comentarios de objetos que no aparecen en otra parte\n" -#: help.c:258 +#: help.c:235 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [PATRÓN] listar dominios\n" -#: help.c:259 +#: help.c:236 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [PATRÓN] listar privilegios por omisión\n" -#: help.c:260 +#: help.c:237 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [PATRÓN] listar tablas foráneas\n" -#: help.c:261 +#: help.c:238 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [PATRÓN] listar servidores foráneos\n" -#: help.c:262 +#: help.c:239 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [PATRÓN] listar tablas foráneas\n" -#: help.c:263 +#: help.c:240 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [PATRÓN] listar mapeos de usuario\n" -#: help.c:264 +#: help.c:241 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [PATRÓN] listar conectores de datos externos\n" -#: help.c:265 +#: help.c:242 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" @@ -3006,47 +3054,47 @@ msgstr "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " listar funciones [sólo ag./normal/proc./trigger/ventana]\n" -#: help.c:267 +#: help.c:244 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [PATRÓN] listar configuraciones de búsqueda en texto\n" -#: help.c:268 +#: help.c:245 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [PATRÓN] listar diccionarios de búsqueda en texto\n" -#: help.c:269 +#: help.c:246 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [PATRÓN] listar analizadores (parsers) de búsq. en texto\n" -#: help.c:270 +#: help.c:247 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [PATRÓN] listar plantillas de búsqueda en texto\n" -#: help.c:271 +#: help.c:248 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [PATRÓN] listar roles\n" -#: help.c:272 +#: help.c:249 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [PATRÓN] listar índices\n" -#: help.c:273 +#: help.c:250 msgid " \\dl[+] list large objects, same as \\lo_list\n" msgstr " \\dl[+] listar objetos grandes, lo mismo que \\lo_list\n" -#: help.c:274 +#: help.c:251 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [PATRÓN] listar lenguajes procedurales\n" -#: help.c:275 +#: help.c:252 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [PATRÓN] listar vistas materializadas\n" -#: help.c:276 +#: help.c:253 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [PATRÓN] listar esquemas\n" -#: help.c:277 +#: help.c:254 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" @@ -3054,89 +3102,93 @@ msgstr "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " listar operadores\n" -#: help.c:279 +#: help.c:256 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S] [PATRÓN] listar ordenamientos (collations)\n" -#: help.c:280 -msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" -msgstr " \\dp [PATRÓN] listar privilegios de acceso a tablas, vistas y secuencias\n" +#: help.c:257 +msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n" +msgstr " \\dp[S] [PATRÓN] listar privilegios de acceso a tablas, vistas y secuencias\n" -#: help.c:281 +#: help.c:258 msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr " \\dP[tin+] [PATRÓN] listar relaciones particionadas (sólo tablas/índices) [n=anidadas]\n" -#: help.c:282 +#: help.c:259 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr "" " \\drds [PATRÓN_ROL [PATRÓN_BASE]]\n" " listar parámetros de rol por base de datos\n" -#: help.c:283 +#: help.c:260 +msgid " \\drg[S] [PATTERN] list role grants\n" +msgstr " \\drg[S] [PATRÓN] listar roles\n" + +#: help.c:261 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [PATRÓN] listar publicaciones de replicación\n" -#: help.c:284 +#: help.c:262 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [PATRÓN] listar suscripciones de replicación\n" -#: help.c:285 +#: help.c:263 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [PATRÓN] listar secuencias\n" -#: help.c:286 +#: help.c:264 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [PATRÓN] listar tablas\n" -#: help.c:287 +#: help.c:265 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [PATRÓN] listar tipos de dato\n" -#: help.c:288 +#: help.c:266 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [PATRÓN] listar roles\n" -#: help.c:289 +#: help.c:267 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [PATRÓN] listar vistas\n" -#: help.c:290 +#: help.c:268 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [PATRÓN] listar extensiones\n" -#: help.c:291 +#: help.c:269 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [PATRÓN] listar estadísticas extendidas\n" -#: help.c:292 +#: help.c:270 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [PATRÓN] listar disparadores por eventos\n" -#: help.c:293 +#: help.c:271 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [PATRÓN] listar bases de datos\n" -#: help.c:294 +#: help.c:272 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNCIÓN mostrar la definición de una función\n" -#: help.c:295 +#: help.c:273 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] VISTA mostrar la definición de una vista\n" -#: help.c:296 -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [PATRÓN] lo mismo que \\dp\n" +#: help.c:274 +msgid " \\z[S] [PATTERN] same as \\dp\n" +msgstr " \\z[S] [PATRÓN] lo mismo que \\dp\n" -#: help.c:299 +#: help.c:277 msgid "Large Objects\n" msgstr "Objetos Grandes\n" -#: help.c:300 +#: help.c:278 msgid " \\lo_export LOBOID FILE write large object to file\n" msgstr " \\lo_export LOBOID ARCHIVO escribir objeto grande a archivo\n" -#: help.c:301 +#: help.c:279 msgid "" " \\lo_import FILE [COMMENT]\n" " read large object from file\n" @@ -3144,38 +3196,38 @@ msgstr "" " \\lo_import ARCHIVO [COMENTARIO]\n" " leer objeto grande desde archivo\n" -#: help.c:303 +#: help.c:281 msgid " \\lo_list[+] list large objects\n" msgstr " \\lo_list[+] listar objetos grandes\n" -#: help.c:304 +#: help.c:282 msgid " \\lo_unlink LOBOID delete a large object\n" msgstr " \\lo_unlink LOBOID borrar un objeto grande\n" -#: help.c:307 +#: help.c:285 msgid "Formatting\n" msgstr "Formato\n" -#: help.c:308 +#: help.c:286 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a cambiar entre modo de salida alineado y sin alinear\n" -#: help.c:309 +#: help.c:287 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [CADENA] definir título de tabla, o indefinir si es vacío\n" -#: help.c:310 +#: help.c:288 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr "" " \\f [CADENA] mostrar o definir separador de campos para\n" " modo de salida sin alinear\n" -#: help.c:311 +#: help.c:289 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H cambiar modo de salida HTML (actualmente %s)\n" -#: help.c:313 +#: help.c:291 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3183,38 +3235,38 @@ msgid "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" msgstr "" " \\pset [NOMBRE [VALOR]] define opción de tabla de salida\n" " (border|columns|csv_fieldsep|expanded|fieldsep|fieldsep_zero|\n" " footer|format|linestyle|null|numericlocale|pager|\n" " pager_min_lines|recordsep|recordsep_zero|tableattr|title|\n" " tuples_only|unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" -#: help.c:320 +#: help.c:298 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] mostrar sólo filas (actualmente %s)\n" -#: help.c:322 +#: help.c:300 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [CADENA] definir atributos HTML de
, o indefinir si es vacío\n" -#: help.c:323 +#: help.c:301 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] cambiar modo expandido (actualmente %s)\n" -#: help.c:324 +#: help.c:302 msgid "auto" msgstr "auto" -#: help.c:327 +#: help.c:305 msgid "Connection\n" msgstr "Conexiones\n" -#: help.c:329 +#: help.c:307 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3223,7 +3275,7 @@ msgstr "" " \\c[onnect] [BASE-DE-DATOS|- USUARIO|- ANFITRIÓN|- PUERTO|- | conninfo]\n" " conectar a una nueva base de datos (actual: «%s»)\n" -#: help.c:333 +#: help.c:311 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3231,72 +3283,72 @@ msgstr "" " \\c[onnect] [BASE-DE-DATOS|- USUARIO|- ANFITRIÓN|- PUERTO|- | conninfo]\n" " conectar a una nueva base de datos (no hay conexión actual)\n" -#: help.c:335 +#: help.c:313 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo despliega la información sobre la conexión actual\n" -#: help.c:336 +#: help.c:314 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr "" " \\encoding [CODIFICACIÓN]\n" " mostrar o definir codificación del cliente\n" -#: help.c:337 +#: help.c:315 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr "" " \\password [USUARIO]\n" " cambiar la contraseña para un usuario en forma segura\n" -#: help.c:340 +#: help.c:318 msgid "Operating System\n" msgstr "Sistema Operativo\n" -#: help.c:341 +#: help.c:319 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [DIR] cambiar el directorio de trabajo actual\n" -#: help.c:342 +#: help.c:320 msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" msgstr " \\getenv PSQLVAR ENVVAR obtener variable de ambiente\n" -#: help.c:343 +#: help.c:321 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr "" " \\setenv NOMBRE [VALOR]\n" " definir o indefinir variable de ambiente\n" -#: help.c:344 +#: help.c:322 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr "" " \\timing [on|off] mostrar tiempo de ejecución de órdenes\n" " (actualmente %s)\n" -#: help.c:346 +#: help.c:324 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr "" " \\! [ORDEN] ejecutar orden en intérprete de órdenes (shell),\n" " o iniciar intérprete interactivo\n" -#: help.c:349 +#: help.c:327 msgid "Variables\n" msgstr "Variables\n" -#: help.c:350 +#: help.c:328 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [TEXTO] NOMBRE preguntar al usuario el valor de la variable\n" -#: help.c:351 +#: help.c:329 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr "" " \\set [NOMBRE [VALOR]] definir variables internas,\n" " listar todas si no se dan parámetros\n" -#: help.c:352 +#: help.c:330 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NOMBRE indefinir (eliminar) variable interna\n" -#: help.c:391 +#: help.c:369 msgid "" "List of specially treated variables\n" "\n" @@ -3304,11 +3356,11 @@ msgstr "" "Lista de variables con tratamiento especial\n" "\n" -#: help.c:393 +#: help.c:371 msgid "psql variables:\n" msgstr "variables psql:\n" -#: help.c:395 +#: help.c:373 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3317,7 +3369,7 @@ msgstr "" " psql --set=NOMBRE=VALOR\n" " o \\set NOMBRE VALOR dentro de psql\n" -#: help.c:397 +#: help.c:375 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3325,7 +3377,7 @@ msgstr "" " AUTOCOMMIT si está definida, órdenes SQL exitosas se comprometen\n" " automáticamente\n" -#: help.c:399 +#: help.c:377 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3334,13 +3386,13 @@ msgstr "" " COMP_KEYWORD_CASE determina si usar mayúsculas al completar palabras SQL\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:402 +#: help.c:380 msgid "" " DBNAME\n" " the currently connected database name\n" msgstr " DBNAME la base de datos actualmente conectada\n" -#: help.c:404 +#: help.c:382 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3349,7 +3401,7 @@ msgstr "" " ECHO controla qué entrada se escribe a la salida estándar\n" " [all, errors, none, queries]\n" -#: help.c:407 +#: help.c:385 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3358,16 +3410,13 @@ msgstr "" " ECHO_HIDDEN muestra consultas internas usadas por órdenes backslash\n" " con «noexec» sólo las muestra sin ejecutarlas\n" -#: help.c:410 +#: help.c:388 msgid "" " ENCODING\n" " current client character set encoding\n" msgstr " ENCODING codificación actual del cliente\n" -#: help.c:412 -#| msgid "" -#| " ERROR\n" -#| " true if last query failed, else false\n" +#: help.c:390 msgid "" " ERROR\n" " \"true\" if last query failed, else \"false\"\n" @@ -3375,7 +3424,7 @@ msgstr "" " ERROR\n" " «true» si la última consulta falló; si no, «false»\n" -#: help.c:414 +#: help.c:392 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3383,7 +3432,7 @@ msgstr "" " FETCH_COUNT número de filas del resultado que extraer y mostrar cada vez\n" " (por omisión: 0=sin límite)\n" -#: help.c:416 +#: help.c:394 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3391,7 +3440,7 @@ msgstr "" " HIDE_TABLEAM\n" " ocultar métodos de acceso de tabla\n" -#: help.c:418 +#: help.c:396 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" @@ -3399,7 +3448,7 @@ msgstr "" " HIDE_TOAST_COMPRESSION\n" " ocultar métodos de compresión\n" -#: help.c:420 +#: help.c:398 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3407,25 +3456,25 @@ msgstr "" " HISTCONTROL controla la lista de historia de órdenes\n" " [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:422 +#: help.c:400 msgid "" " HISTFILE\n" " file name used to store the command history\n" msgstr " HISTFILE nombre de archivo para almacenar historia de órdenes\n" -#: help.c:424 +#: help.c:402 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" msgstr " HISTSIZE número de órdenes a guardar en la historia de órdenes\n" -#: help.c:426 +#: help.c:404 msgid "" " HOST\n" " the currently connected database server host\n" msgstr " HOST el servidor actualmente conectado\n" -#: help.c:428 +#: help.c:406 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3433,13 +3482,13 @@ msgstr "" " IGNOREEOF si no está definida, enviar un EOF a sesión interactiva\n" " termina la aplicación\n" -#: help.c:430 +#: help.c:408 msgid "" " LASTOID\n" " value of the last affected OID\n" msgstr " LASTOID el valor del último OID afectado\n" -#: help.c:432 +#: help.c:410 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3450,7 +3499,7 @@ msgstr "" " mensaje y SQLSTATE del último error, o cadena vacía y\n" " «00000» si no hubo\n" -#: help.c:435 +#: help.c:413 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3458,25 +3507,25 @@ msgstr "" " ON_ERROR_ROLLBACK si está definido, un error no aborta la transacción\n" " (usa «savepoints» implícitos)\n" -#: help.c:437 +#: help.c:415 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" msgstr " ON_ERROR_STOP detiene ejecución por lotes al ocurrir un error\n" -#: help.c:439 +#: help.c:417 msgid "" " PORT\n" " server port of the current connection\n" msgstr " PORT puerto del servidor de la conexión actual\n" -#: help.c:441 +#: help.c:419 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" msgstr " PROMPT1 especifica el prompt estándar de psql\n" -#: help.c:443 +#: help.c:421 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3484,19 +3533,19 @@ msgstr "" " PROMPT2 especifica el prompt usado cuando una sentencia continúa\n" " de una línea anterior\n" -#: help.c:445 +#: help.c:423 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" msgstr " PROMPT3 especifica el prompt usado durante COPY ... FROM STDIN\n" -#: help.c:447 +#: help.c:425 msgid "" " QUIET\n" " run quietly (same as -q option)\n" msgstr " QUIET ejecuta silenciosamente (igual que -q)\n" -#: help.c:449 +#: help.c:427 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3504,7 +3553,7 @@ msgstr "" " ROW_COUNT número de tuplas retornadas o afectadas por última\n" " consulta, o 0\n" -#: help.c:451 +#: help.c:429 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3514,10 +3563,7 @@ msgstr "" " SERVER_VERSION_NUM\n" " versión del servidor (cadena corta o numérica)\n" -#: help.c:454 -#| msgid "" -#| " ERROR\n" -#| " true if last query failed, else false\n" +#: help.c:432 msgid "" " SHELL_ERROR\n" " \"true\" if the last shell command failed, \"false\" if it succeeded\n" @@ -3525,10 +3571,7 @@ msgstr "" " SHELL_ERROR\n" " «true» si la última orden de shell falló, «false» si tuvo éxito\n" -#: help.c:456 -#| msgid "" -#| " SHELL\n" -#| " shell used by the \\! command\n" +#: help.c:434 msgid "" " SHELL_EXIT_CODE\n" " exit status of the last shell command\n" @@ -3536,7 +3579,7 @@ msgstr "" " SHELL_EXIT_CODE\n" " estado de salida de la última orden de shell\n" -#: help.c:458 +#: help.c:436 msgid "" " SHOW_ALL_RESULTS\n" " show all results of a combined query (\\;) instead of only the last\n" @@ -3545,7 +3588,7 @@ msgstr "" " mostrar todos los resultados de una consulta combinada (\\;) en lugar\n" " de sólo mostrar el último\n" -#: help.c:460 +#: help.c:438 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3553,31 +3596,31 @@ msgstr "" " SHOW_CONTEXT controla el despliegue de campos de contexto de mensaje\n" " [never, errors, always]\n" -#: help.c:462 +#: help.c:440 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" msgstr " SINGLELINE fin de línea termina modo de órdenes SQL (igual que -S)\n" -#: help.c:464 +#: help.c:442 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" msgstr " SINGLESTEP modo paso a paso (igual que -s)\n" -#: help.c:466 +#: help.c:444 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" msgstr " SQLSTATE SQLSTATE de la última consulta, o «00000» si no hubo error\n" -#: help.c:468 +#: help.c:446 msgid "" " USER\n" " the currently connected database user\n" msgstr " USER el usuario actualmente conectado\n" -#: help.c:470 +#: help.c:448 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3585,7 +3628,7 @@ msgstr "" " VERBOSITY controla la verbosidad de errores [default, verbose,\n" " terse, sqlstate]\n" -#: help.c:472 +#: help.c:450 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3597,7 +3640,7 @@ msgstr "" " VERSION_NUM\n" " versión de psql (cadena verbosa, corta o numérica)\n" -#: help.c:477 +#: help.c:455 msgid "" "\n" "Display settings:\n" @@ -3605,7 +3648,7 @@ msgstr "" "\n" "Parámetros de despliegue:\n" -#: help.c:479 +#: help.c:457 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3615,25 +3658,25 @@ msgstr "" " o \\pset NOMBRE [VALOR] dentro de psql\n" "\n" -#: help.c:481 +#: help.c:459 msgid "" " border\n" " border style (number)\n" msgstr " border estilo de borde (número)\n" -#: help.c:483 +#: help.c:461 msgid "" " columns\n" " target width for the wrapped format\n" msgstr " columns define el ancho para formato «wrapped»\n" -#: help.c:485 +#: help.c:463 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" msgstr " expanded (o x) salida expandida [on, off, auto]\n" -#: help.c:487 +#: help.c:465 #, c-format msgid "" " fieldsep\n" @@ -3642,37 +3685,37 @@ msgstr "" " fieldsep separador de campos para formato «unaligned»\n" " (por omisión: «%s»)\n" -#: help.c:490 +#: help.c:468 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" msgstr " fieldsep_zero separador de campos en «unaligned» es byte cero\n" -#: help.c:492 +#: help.c:470 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" msgstr " footer activa o desactiva el pie de tabla [on, off]\n" -#: help.c:494 +#: help.c:472 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" msgstr " format define el formato de salida [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:496 +#: help.c:474 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" msgstr " linestyle define el estilo de dibujo de líneas [ascii, old-ascii, unicode]\n" -#: help.c:498 +#: help.c:476 msgid "" " null\n" " set the string to be printed in place of a null value\n" msgstr " null define la cadena a imprimirse para valores null\n" -#: help.c:500 +#: help.c:478 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3680,26 +3723,26 @@ msgstr "" " numericlocale activa despliegue de carácter específico del lenguaje para\n" " separar grupos de dígitos\n" -#: help.c:502 +#: help.c:480 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" msgstr " pager controla cuándo se usará un paginador externo [yes, no, always]\n" -#: help.c:504 +#: help.c:482 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" msgstr " recordsep separador de registros (líneas) para formato «unaligned»\n" -#: help.c:506 +#: help.c:484 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" msgstr " recordsep_zero separador de registros en «unaligned» es byte cero\n" # XXX WTF does this mean? -#: help.c:508 +#: help.c:486 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3709,19 +3752,19 @@ msgstr "" " o ancho proporcional de columnas alineadas a la izquierda\n" " en formato «latex-longtable»\n" -#: help.c:511 +#: help.c:489 msgid "" " title\n" " set the table title for subsequently printed tables\n" msgstr " title define el título de tablas\n" -#: help.c:513 +#: help.c:491 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" msgstr " tuples_only si está definido, sólo los datos de la tabla se muestran\n" -#: help.c:515 +#: help.c:493 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3733,7 +3776,17 @@ msgstr "" " unicode_header_linestyle\n" " define el estilo de líneas Unicode [single, double]\n" -#: help.c:520 +#: help.c:497 +msgid "" +" xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr "" +" xheader_width\n" +" define el ancho máximo del encabezado para el formato expandido\n" +" [full, column, page, valor entero]\n" + +#: help.c:501 msgid "" "\n" "Environment variables:\n" @@ -3741,7 +3794,7 @@ msgstr "" "\n" "Variables de ambiente:\n" -#: help.c:524 +#: help.c:505 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3750,7 +3803,7 @@ msgstr "" " NOMBRE=VALOR [NOMBRE=VALOR] psql ...\n" " o \\setenv NOMBRE [VALOR] dentro de psql\n" -#: help.c:526 +#: help.c:507 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3761,55 +3814,55 @@ msgstr "" " psql ...\n" " o \\setenv NOMBRE [VALOR] dentro de psql\n" -#: help.c:529 +#: help.c:510 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" msgstr " COLUMNS número de columnas para formato «wrapped»\n" -#: help.c:531 +#: help.c:512 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" msgstr " PGAPPNAME igual que el parámetro de conexión application_name\n" -#: help.c:533 +#: help.c:514 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" msgstr " PGDATABASE igual que el parámetro de conexión dbname\n" -#: help.c:535 +#: help.c:516 msgid "" " PGHOST\n" " same as the host connection parameter\n" msgstr " PGHOST igual que el parámetro de conexión host\n" -#: help.c:537 +#: help.c:518 msgid "" " PGPASSFILE\n" " password file name\n" msgstr " PGPASSFILE nombre de archivo de contraseñas\n" -#: help.c:539 +#: help.c:520 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" msgstr " PGPASSWORD contraseña de la conexión (no recomendado)\n" -#: help.c:541 +#: help.c:522 msgid "" " PGPORT\n" " same as the port connection parameter\n" msgstr " PGPORT igual que el parámetro de conexión port\n" -#: help.c:543 +#: help.c:524 msgid "" " PGUSER\n" " same as the user connection parameter\n" msgstr " PGUSER igual que el parámetro de conexión user\n" -#: help.c:545 +#: help.c:526 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3817,7 +3870,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor usado por órdenes \\e, \\ef, y \\ev\n" -#: help.c:547 +#: help.c:528 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3825,47 +3878,47 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARGS\n" " cómo especificar número de línea al invocar al editor\n" -#: help.c:549 +#: help.c:530 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" msgstr " PSQL_HISTORY ubicación alternativa del archivo de historia de órdenes\n" -#: help.c:551 +#: help.c:532 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" msgstr " PSQL_PAGER, PAGER nombre de programa paginador externo\n" -#: help.c:554 +#: help.c:535 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" msgstr " PSQL_WATCH_PAGER paginador externo para usar con \\watch\n" -#: help.c:557 +#: help.c:538 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" msgstr " PSQLRC ubicación alternativa para el archivo .psqlrc del usuario\n" -#: help.c:559 +#: help.c:540 msgid "" " SHELL\n" " shell used by the \\! command\n" msgstr " SHELL intérprete usado por la orden \\!\n" -#: help.c:561 +#: help.c:542 msgid "" " TMPDIR\n" " directory for temporary files\n" msgstr " TMPDIR directorio para archivos temporales\n" -#: help.c:621 +#: help.c:602 msgid "Available help:\n" msgstr "Ayuda disponible:\n" -#: help.c:716 +#: help.c:697 #, c-format msgid "" "Command: %s\n" @@ -3884,7 +3937,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:739 +#: help.c:720 #, c-format msgid "" "No help available for \"%s\".\n" @@ -3893,17 +3946,17 @@ msgstr "" "No hay ayuda disponible para «%s».\n" "Pruebe \\h sin argumentos para mostrar los elementos de ayuda disponibles.\n" -#: input.c:216 +#: input.c:215 #, c-format msgid "could not read from input file: %m" msgstr "no se pudo leer el archivo de entrada: %m" -#: input.c:477 input.c:515 +#: input.c:476 input.c:514 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "no se pudo guardar historial a archivo «%s»: %m" -#: input.c:534 +#: input.c:533 #, c-format msgid "history is not supported by this installation" msgstr "el historial de órdenes no está soportado en esta instalación" @@ -3990,12 +4043,12 @@ msgstr "consulta ignorada; use \\endif o Ctrl-C para salir del bloque \\if actua msgid "reached EOF without finding closing \\endif(s)" msgstr "se alcanzó EOF sin encontrar el/los \\endif de cierre" -#: psqlscanslash.l:640 +#: psqlscanslash.l:642 #, c-format msgid "unterminated quoted string" msgstr "una cadena de caracteres entre comillas está inconclusa" -#: psqlscanslash.l:825 +#: psqlscanslash.l:842 #, c-format msgid "%s: out of memory" msgstr "%s: memoria agotada" @@ -4003,2435 +4056,2449 @@ msgstr "%s: memoria agotada" #: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 #: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 #: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 -#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238 -#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248 -#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267 -#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323 -#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443 -#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524 -#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595 -#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606 -#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668 -#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714 -#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747 -#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802 -#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900 -#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999 -#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 -#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071 -#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086 -#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116 -#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141 -#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 -#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163 -#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310 -#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320 -#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445 -#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486 -#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507 -#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523 -#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548 -#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577 -#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 -#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687 -#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696 -#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000 -#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159 -#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236 -#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439 -#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525 -#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602 -#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738 -#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079 -#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179 -#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267 -#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346 -#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404 -#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436 -#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472 -#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507 -#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545 -#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582 -#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614 -#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646 -#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688 -#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040 -#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197 -#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:245 +#: sql_help.c:247 sql_help.c:248 sql_help.c:250 sql_help.c:252 sql_help.c:255 +#: sql_help.c:257 sql_help.c:259 sql_help.c:261 sql_help.c:276 sql_help.c:277 +#: sql_help.c:278 sql_help.c:280 sql_help.c:329 sql_help.c:331 sql_help.c:333 +#: sql_help.c:335 sql_help.c:404 sql_help.c:409 sql_help.c:411 sql_help.c:453 +#: sql_help.c:455 sql_help.c:458 sql_help.c:460 sql_help.c:529 sql_help.c:534 +#: sql_help.c:539 sql_help.c:544 sql_help.c:549 sql_help.c:603 sql_help.c:605 +#: sql_help.c:607 sql_help.c:609 sql_help.c:611 sql_help.c:614 sql_help.c:616 +#: sql_help.c:619 sql_help.c:630 sql_help.c:632 sql_help.c:676 sql_help.c:678 +#: sql_help.c:680 sql_help.c:683 sql_help.c:685 sql_help.c:687 sql_help.c:728 +#: sql_help.c:732 sql_help.c:736 sql_help.c:757 sql_help.c:760 sql_help.c:763 +#: sql_help.c:792 sql_help.c:804 sql_help.c:812 sql_help.c:815 sql_help.c:818 +#: sql_help.c:833 sql_help.c:836 sql_help.c:865 sql_help.c:870 sql_help.c:875 +#: sql_help.c:880 sql_help.c:885 sql_help.c:912 sql_help.c:914 sql_help.c:916 +#: sql_help.c:918 sql_help.c:921 sql_help.c:923 sql_help.c:970 sql_help.c:1015 +#: sql_help.c:1020 sql_help.c:1025 sql_help.c:1030 sql_help.c:1035 +#: sql_help.c:1054 sql_help.c:1065 sql_help.c:1067 sql_help.c:1087 +#: sql_help.c:1097 sql_help.c:1098 sql_help.c:1100 sql_help.c:1102 +#: sql_help.c:1114 sql_help.c:1118 sql_help.c:1120 sql_help.c:1132 +#: sql_help.c:1134 sql_help.c:1136 sql_help.c:1138 sql_help.c:1157 +#: sql_help.c:1159 sql_help.c:1163 sql_help.c:1167 sql_help.c:1171 +#: sql_help.c:1174 sql_help.c:1175 sql_help.c:1176 sql_help.c:1179 +#: sql_help.c:1182 sql_help.c:1184 sql_help.c:1324 sql_help.c:1326 +#: sql_help.c:1329 sql_help.c:1332 sql_help.c:1334 sql_help.c:1336 +#: sql_help.c:1339 sql_help.c:1342 sql_help.c:1464 sql_help.c:1466 +#: sql_help.c:1468 sql_help.c:1471 sql_help.c:1492 sql_help.c:1495 +#: sql_help.c:1498 sql_help.c:1501 sql_help.c:1505 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1525 sql_help.c:1528 +#: sql_help.c:1530 sql_help.c:1532 sql_help.c:1542 sql_help.c:1544 +#: sql_help.c:1554 sql_help.c:1556 sql_help.c:1566 sql_help.c:1569 +#: sql_help.c:1592 sql_help.c:1594 sql_help.c:1596 sql_help.c:1598 +#: sql_help.c:1601 sql_help.c:1603 sql_help.c:1606 sql_help.c:1609 +#: sql_help.c:1660 sql_help.c:1703 sql_help.c:1706 sql_help.c:1708 +#: sql_help.c:1710 sql_help.c:1713 sql_help.c:1715 sql_help.c:1717 +#: sql_help.c:1720 sql_help.c:1770 sql_help.c:1786 sql_help.c:2019 +#: sql_help.c:2088 sql_help.c:2107 sql_help.c:2120 sql_help.c:2178 +#: sql_help.c:2186 sql_help.c:2196 sql_help.c:2224 sql_help.c:2257 +#: sql_help.c:2275 sql_help.c:2303 sql_help.c:2414 sql_help.c:2460 +#: sql_help.c:2485 sql_help.c:2508 sql_help.c:2512 sql_help.c:2546 +#: sql_help.c:2566 sql_help.c:2588 sql_help.c:2602 sql_help.c:2623 +#: sql_help.c:2652 sql_help.c:2685 sql_help.c:2708 sql_help.c:2755 +#: sql_help.c:3053 sql_help.c:3066 sql_help.c:3083 sql_help.c:3099 +#: sql_help.c:3139 sql_help.c:3193 sql_help.c:3197 sql_help.c:3199 +#: sql_help.c:3206 sql_help.c:3225 sql_help.c:3252 sql_help.c:3287 +#: sql_help.c:3299 sql_help.c:3308 sql_help.c:3352 sql_help.c:3366 +#: sql_help.c:3394 sql_help.c:3402 sql_help.c:3414 sql_help.c:3424 +#: sql_help.c:3432 sql_help.c:3440 sql_help.c:3448 sql_help.c:3456 +#: sql_help.c:3465 sql_help.c:3476 sql_help.c:3484 sql_help.c:3492 +#: sql_help.c:3500 sql_help.c:3508 sql_help.c:3518 sql_help.c:3527 +#: sql_help.c:3536 sql_help.c:3544 sql_help.c:3554 sql_help.c:3565 +#: sql_help.c:3573 sql_help.c:3582 sql_help.c:3593 sql_help.c:3602 +#: sql_help.c:3610 sql_help.c:3618 sql_help.c:3626 sql_help.c:3634 +#: sql_help.c:3642 sql_help.c:3650 sql_help.c:3658 sql_help.c:3666 +#: sql_help.c:3674 sql_help.c:3682 sql_help.c:3699 sql_help.c:3708 +#: sql_help.c:3716 sql_help.c:3733 sql_help.c:3748 sql_help.c:4061 +#: sql_help.c:4182 sql_help.c:4211 sql_help.c:4227 sql_help.c:4229 +#: sql_help.c:4733 sql_help.c:4781 sql_help.c:4940 msgid "name" msgstr "nombre" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848 -#: sql_help.c:3347 sql_help.c:4468 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:340 sql_help.c:1863 +#: sql_help.c:3367 sql_help.c:4500 msgid "aggregate_signature" msgstr "signatura_func_agregación" -#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253 -#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576 -#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798 -#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008 -#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105 -#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444 -#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534 -#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:260 +#: sql_help.c:281 sql_help.c:412 sql_help.c:459 sql_help.c:538 sql_help.c:586 +#: sql_help.c:604 sql_help.c:631 sql_help.c:684 sql_help.c:759 sql_help.c:814 +#: sql_help.c:835 sql_help.c:874 sql_help.c:924 sql_help.c:971 sql_help.c:1024 +#: sql_help.c:1056 sql_help.c:1066 sql_help.c:1101 sql_help.c:1121 +#: sql_help.c:1135 sql_help.c:1185 sql_help.c:1333 sql_help.c:1465 +#: sql_help.c:1508 sql_help.c:1529 sql_help.c:1543 sql_help.c:1555 +#: sql_help.c:1568 sql_help.c:1595 sql_help.c:1661 sql_help.c:1714 msgid "new_name" msgstr "nuevo_nombre" -#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251 -#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623 -#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801 -#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 -#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 -#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510 -#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:258 +#: sql_help.c:279 sql_help.c:410 sql_help.c:495 sql_help.c:543 sql_help.c:633 +#: sql_help.c:642 sql_help.c:707 sql_help.c:731 sql_help.c:762 sql_help.c:817 +#: sql_help.c:879 sql_help.c:922 sql_help.c:1029 sql_help.c:1068 +#: sql_help.c:1099 sql_help.c:1119 sql_help.c:1133 sql_help.c:1183 +#: sql_help.c:1399 sql_help.c:1467 sql_help.c:1510 sql_help.c:1531 +#: sql_help.c:1593 sql_help.c:1709 sql_help.c:3039 msgid "new_owner" msgstr "nuevo_dueño" -#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322 -#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749 -#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087 -#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512 -#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:262 sql_help.c:332 +#: sql_help.c:461 sql_help.c:548 sql_help.c:686 sql_help.c:735 sql_help.c:765 +#: sql_help.c:820 sql_help.c:884 sql_help.c:1034 sql_help.c:1103 +#: sql_help.c:1137 sql_help.c:1335 sql_help.c:1512 sql_help.c:1533 +#: sql_help.c:1545 sql_help.c:1557 sql_help.c:1597 sql_help.c:1716 msgid "new_schema" msgstr "nuevo_esquema" -#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497 +#: sql_help.c:44 sql_help.c:1927 sql_help.c:3368 sql_help.c:4529 msgid "where aggregate_signature is:" msgstr "donde signatura_func_agregación es:" -#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353 -#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520 -#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 -#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 -#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 -#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 -#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089 -#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349 -#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535 -#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474 -#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501 -#: sql_help.c:4504 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:350 sql_help.c:363 +#: sql_help.c:367 sql_help.c:383 sql_help.c:386 sql_help.c:389 sql_help.c:530 +#: sql_help.c:535 sql_help.c:540 sql_help.c:545 sql_help.c:550 sql_help.c:866 +#: sql_help.c:871 sql_help.c:876 sql_help.c:881 sql_help.c:886 sql_help.c:1016 +#: sql_help.c:1021 sql_help.c:1026 sql_help.c:1031 sql_help.c:1036 +#: sql_help.c:1881 sql_help.c:1898 sql_help.c:1904 sql_help.c:1928 +#: sql_help.c:1931 sql_help.c:1934 sql_help.c:2089 sql_help.c:2108 +#: sql_help.c:2111 sql_help.c:2415 sql_help.c:2624 sql_help.c:3369 +#: sql_help.c:3372 sql_help.c:3375 sql_help.c:3466 sql_help.c:3555 +#: sql_help.c:3583 sql_help.c:3936 sql_help.c:4399 sql_help.c:4506 +#: sql_help.c:4513 sql_help.c:4519 sql_help.c:4530 sql_help.c:4533 +#: sql_help.c:4536 msgid "argmode" msgstr "modo_arg" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354 -#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 -#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 -#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 -#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 -#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914 -#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090 -#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350 -#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536 -#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488 -#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:351 sql_help.c:364 +#: sql_help.c:368 sql_help.c:384 sql_help.c:387 sql_help.c:390 sql_help.c:531 +#: sql_help.c:536 sql_help.c:541 sql_help.c:546 sql_help.c:551 sql_help.c:867 +#: sql_help.c:872 sql_help.c:877 sql_help.c:882 sql_help.c:887 sql_help.c:1017 +#: sql_help.c:1022 sql_help.c:1027 sql_help.c:1032 sql_help.c:1037 +#: sql_help.c:1882 sql_help.c:1899 sql_help.c:1905 sql_help.c:1929 +#: sql_help.c:1932 sql_help.c:1935 sql_help.c:2090 sql_help.c:2109 +#: sql_help.c:2112 sql_help.c:2416 sql_help.c:2625 sql_help.c:3370 +#: sql_help.c:3373 sql_help.c:3376 sql_help.c:3467 sql_help.c:3556 +#: sql_help.c:3584 sql_help.c:4507 sql_help.c:4514 sql_help.c:4520 +#: sql_help.c:4531 sql_help.c:4534 sql_help.c:4537 msgid "argname" msgstr "nombre_arg" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355 -#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 -#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 -#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 -#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 -#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915 -#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605 -#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448 -#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483 -#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:352 sql_help.c:365 +#: sql_help.c:369 sql_help.c:385 sql_help.c:388 sql_help.c:391 sql_help.c:532 +#: sql_help.c:537 sql_help.c:542 sql_help.c:547 sql_help.c:552 sql_help.c:868 +#: sql_help.c:873 sql_help.c:878 sql_help.c:883 sql_help.c:888 sql_help.c:1018 +#: sql_help.c:1023 sql_help.c:1028 sql_help.c:1033 sql_help.c:1038 +#: sql_help.c:1883 sql_help.c:1900 sql_help.c:1906 sql_help.c:1930 +#: sql_help.c:1933 sql_help.c:1936 sql_help.c:2417 sql_help.c:2626 +#: sql_help.c:3371 sql_help.c:3374 sql_help.c:3377 sql_help.c:3468 +#: sql_help.c:3557 sql_help.c:3585 sql_help.c:4508 sql_help.c:4515 +#: sql_help.c:4521 sql_help.c:4532 sql_help.c:4535 sql_help.c:4538 msgid "argtype" msgstr "tipo_arg" -#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 -#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666 -#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977 -#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351 -#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048 -#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751 -#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973 +#: sql_help.c:114 sql_help.c:407 sql_help.c:484 sql_help.c:496 sql_help.c:965 +#: sql_help.c:1116 sql_help.c:1526 sql_help.c:1655 sql_help.c:1687 +#: sql_help.c:1739 sql_help.c:1798 sql_help.c:1987 sql_help.c:1994 +#: sql_help.c:2306 sql_help.c:2356 sql_help.c:2363 sql_help.c:2372 +#: sql_help.c:2461 sql_help.c:2686 sql_help.c:2777 sql_help.c:3068 +#: sql_help.c:3253 sql_help.c:3275 sql_help.c:3415 sql_help.c:3772 +#: sql_help.c:3980 sql_help.c:4226 sql_help.c:4228 sql_help.c:5006 msgid "option" msgstr "opción" -#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441 -#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396 +#: sql_help.c:115 sql_help.c:966 sql_help.c:1656 sql_help.c:2462 +#: sql_help.c:2687 sql_help.c:3254 sql_help.c:3416 msgid "where option can be:" msgstr "donde opción puede ser:" -#: sql_help.c:116 sql_help.c:2217 +#: sql_help.c:116 sql_help.c:2238 msgid "allowconn" msgstr "allowconn" -#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218 -#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 +#: sql_help.c:117 sql_help.c:967 sql_help.c:1657 sql_help.c:2239 +#: sql_help.c:2463 sql_help.c:2688 sql_help.c:3255 msgid "connlimit" msgstr "límite_conexiones" -#: sql_help.c:118 sql_help.c:2219 +#: sql_help.c:118 sql_help.c:2240 msgid "istemplate" msgstr "esplantilla" -#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322 -#: sql_help.c:1374 sql_help.c:4200 +#: sql_help.c:124 sql_help.c:621 sql_help.c:689 sql_help.c:703 sql_help.c:1338 +#: sql_help.c:1392 sql_help.c:4232 msgid "new_tablespace" msgstr "nuevo_tablespace" -#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550 -#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 -#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 -#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643 -#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609 -#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:558 sql_help.c:560 +#: sql_help.c:561 sql_help.c:891 sql_help.c:893 sql_help.c:894 sql_help.c:974 +#: sql_help.c:978 sql_help.c:981 sql_help.c:1043 sql_help.c:1045 +#: sql_help.c:1046 sql_help.c:1196 sql_help.c:1198 sql_help.c:1664 +#: sql_help.c:1668 sql_help.c:1671 sql_help.c:2427 sql_help.c:2630 +#: sql_help.c:3948 sql_help.c:4250 sql_help.c:4411 sql_help.c:4721 msgid "configuration_parameter" msgstr "parámetro_de_configuración" -#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487 -#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876 -#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101 -#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157 -#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182 -#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449 -#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667 -#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352 -#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475 -#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634 -#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923 -#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022 -#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689 -#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692 +#: sql_help.c:128 sql_help.c:408 sql_help.c:479 sql_help.c:485 sql_help.c:497 +#: sql_help.c:559 sql_help.c:613 sql_help.c:695 sql_help.c:705 sql_help.c:892 +#: sql_help.c:920 sql_help.c:975 sql_help.c:1044 sql_help.c:1117 +#: sql_help.c:1162 sql_help.c:1166 sql_help.c:1170 sql_help.c:1173 +#: sql_help.c:1178 sql_help.c:1181 sql_help.c:1197 sql_help.c:1371 +#: sql_help.c:1394 sql_help.c:1442 sql_help.c:1450 sql_help.c:1470 +#: sql_help.c:1527 sql_help.c:1611 sql_help.c:1665 sql_help.c:1688 +#: sql_help.c:2307 sql_help.c:2357 sql_help.c:2364 sql_help.c:2373 +#: sql_help.c:2428 sql_help.c:2429 sql_help.c:2493 sql_help.c:2496 +#: sql_help.c:2530 sql_help.c:2631 sql_help.c:2632 sql_help.c:2655 +#: sql_help.c:2778 sql_help.c:2817 sql_help.c:2927 sql_help.c:2940 +#: sql_help.c:2954 sql_help.c:2995 sql_help.c:3003 sql_help.c:3025 +#: sql_help.c:3042 sql_help.c:3069 sql_help.c:3276 sql_help.c:3981 +#: sql_help.c:4722 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 msgid "value" msgstr "valor" -#: sql_help.c:200 +#: sql_help.c:202 msgid "target_role" msgstr "rol_destino" -#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639 -#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899 -#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351 -#: sql_help.c:4370 sql_help.c:4382 +#: sql_help.c:203 sql_help.c:929 sql_help.c:2291 sql_help.c:2660 +#: sql_help.c:2733 sql_help.c:2738 sql_help.c:3911 sql_help.c:3920 +#: sql_help.c:3939 sql_help.c:3951 sql_help.c:4374 sql_help.c:4383 +#: sql_help.c:4402 sql_help.c:4414 msgid "schema_name" msgstr "nombre_de_esquema" -#: sql_help.c:202 +#: sql_help.c:204 msgid "abbreviated_grant_or_revoke" msgstr "grant_o_revoke_abreviado" -#: sql_help.c:203 +#: sql_help.c:205 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "donde grant_o_revoke_abreviado es uno de:" -#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 -#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 -#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 -#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446 -#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583 -#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675 -#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240 -#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943 -#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710 +#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 +#: sql_help.c:211 sql_help.c:212 sql_help.c:213 sql_help.c:214 sql_help.c:215 +#: sql_help.c:584 sql_help.c:620 sql_help.c:688 sql_help.c:838 sql_help.c:985 +#: sql_help.c:1337 sql_help.c:1675 sql_help.c:2466 sql_help.c:2467 +#: sql_help.c:2468 sql_help.c:2469 sql_help.c:2470 sql_help.c:2604 +#: sql_help.c:2691 sql_help.c:2692 sql_help.c:2693 sql_help.c:3258 +#: sql_help.c:3259 sql_help.c:3260 sql_help.c:3261 sql_help.c:3262 +#: sql_help.c:3960 sql_help.c:3964 sql_help.c:4423 sql_help.c:4427 +#: sql_help.c:4743 msgid "role_name" msgstr "nombre_de_rol" -#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339 -#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684 -#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360 -#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782 -#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932 -#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991 -#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098 -#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571 -#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621 -#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664 -#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819 -#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877 -#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934 -#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065 -#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123 -#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126 +#: sql_help.c:246 sql_help.c:265 sql_help.c:472 sql_help.c:928 sql_help.c:1353 +#: sql_help.c:1355 sql_help.c:1359 sql_help.c:1409 sql_help.c:1421 +#: sql_help.c:1446 sql_help.c:1705 sql_help.c:2260 sql_help.c:2264 +#: sql_help.c:2376 sql_help.c:2381 sql_help.c:2489 sql_help.c:2659 +#: sql_help.c:2794 sql_help.c:2799 sql_help.c:2801 sql_help.c:2922 +#: sql_help.c:2935 sql_help.c:2949 sql_help.c:2958 sql_help.c:2970 +#: sql_help.c:2999 sql_help.c:4012 sql_help.c:4027 sql_help.c:4029 +#: sql_help.c:4125 sql_help.c:4128 sql_help.c:4130 sql_help.c:4593 +#: sql_help.c:4594 sql_help.c:4603 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4652 sql_help.c:4653 sql_help.c:4654 sql_help.c:4655 +#: sql_help.c:4696 sql_help.c:4697 sql_help.c:4702 sql_help.c:4707 +#: sql_help.c:4851 sql_help.c:4852 sql_help.c:4861 sql_help.c:4908 +#: sql_help.c:4909 sql_help.c:4910 sql_help.c:4911 sql_help.c:4912 +#: sql_help.c:4913 sql_help.c:4968 sql_help.c:4970 sql_help.c:5036 +#: sql_help.c:5096 sql_help.c:5097 sql_help.c:5106 sql_help.c:5153 +#: sql_help.c:5154 sql_help.c:5155 sql_help.c:5156 sql_help.c:5157 +#: sql_help.c:5158 msgid "expression" msgstr "expresión" -#: sql_help.c:242 +#: sql_help.c:249 sql_help.c:2261 msgid "domain_constraint" msgstr "restricción_de_dominio" -#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 -#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363 -#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854 -#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359 -#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003 +#: sql_help.c:251 sql_help.c:253 sql_help.c:256 sql_help.c:264 sql_help.c:487 +#: sql_help.c:488 sql_help.c:1330 sql_help.c:1379 sql_help.c:1380 +#: sql_help.c:1381 sql_help.c:1408 sql_help.c:1420 sql_help.c:1437 +#: sql_help.c:1869 sql_help.c:1871 sql_help.c:2263 sql_help.c:2375 +#: sql_help.c:2380 sql_help.c:2957 sql_help.c:2969 sql_help.c:4024 msgid "constraint_name" msgstr "nombre_restricción" -#: sql_help.c:247 sql_help.c:1315 +#: sql_help.c:254 sql_help.c:1331 msgid "new_constraint_name" msgstr "nuevo_nombre_restricción" -#: sql_help.c:320 sql_help.c:1099 +#: sql_help.c:263 sql_help.c:2262 +msgid "where domain_constraint is:" +msgstr "donde restricción_de_dominio es:" + +#: sql_help.c:330 sql_help.c:1115 msgid "new_version" msgstr "nueva_versión" -#: sql_help.c:324 sql_help.c:326 +#: sql_help.c:334 sql_help.c:336 msgid "member_object" msgstr "objeto_miembro" -#: sql_help.c:327 +#: sql_help.c:337 msgid "where member_object is:" msgstr "dondo objeto_miembro es:" -#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 -#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 -#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 -#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 -#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858 -#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862 -#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871 -#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886 -#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896 -#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900 -#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904 -#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469 -#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478 -#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490 -#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494 -#: sql_help.c:4495 +#: sql_help.c:338 sql_help.c:343 sql_help.c:344 sql_help.c:345 sql_help.c:346 +#: sql_help.c:347 sql_help.c:348 sql_help.c:353 sql_help.c:357 sql_help.c:359 +#: sql_help.c:361 sql_help.c:370 sql_help.c:371 sql_help.c:372 sql_help.c:373 +#: sql_help.c:374 sql_help.c:375 sql_help.c:376 sql_help.c:377 sql_help.c:380 +#: sql_help.c:381 sql_help.c:1861 sql_help.c:1866 sql_help.c:1873 +#: sql_help.c:1874 sql_help.c:1875 sql_help.c:1876 sql_help.c:1877 +#: sql_help.c:1878 sql_help.c:1879 sql_help.c:1884 sql_help.c:1886 +#: sql_help.c:1890 sql_help.c:1892 sql_help.c:1896 sql_help.c:1901 +#: sql_help.c:1902 sql_help.c:1909 sql_help.c:1910 sql_help.c:1911 +#: sql_help.c:1912 sql_help.c:1913 sql_help.c:1914 sql_help.c:1915 +#: sql_help.c:1916 sql_help.c:1917 sql_help.c:1918 sql_help.c:1919 +#: sql_help.c:1924 sql_help.c:1925 sql_help.c:4496 sql_help.c:4501 +#: sql_help.c:4502 sql_help.c:4503 sql_help.c:4504 sql_help.c:4510 +#: sql_help.c:4511 sql_help.c:4516 sql_help.c:4517 sql_help.c:4522 +#: sql_help.c:4523 sql_help.c:4524 sql_help.c:4525 sql_help.c:4526 +#: sql_help.c:4527 msgid "object_name" msgstr "nombre_de_objeto" -#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467 +#: sql_help.c:339 sql_help.c:1862 sql_help.c:4499 msgid "aggregate_name" msgstr "nombre_función_agregación" -#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139 -#: sql_help.c:2141 sql_help.c:3365 +#: sql_help.c:341 sql_help.c:1864 sql_help.c:2154 sql_help.c:2158 +#: sql_help.c:2160 sql_help.c:3385 msgid "source_type" msgstr "tipo_fuente" -#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140 -#: sql_help.c:2142 sql_help.c:3366 +#: sql_help.c:342 sql_help.c:1865 sql_help.c:2155 sql_help.c:2159 +#: sql_help.c:2161 sql_help.c:3386 msgid "target_type" msgstr "tipo_destino" -#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137 -#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557 -#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590 -#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847 -#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093 -#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104 +#: sql_help.c:349 sql_help.c:802 sql_help.c:1880 sql_help.c:2156 +#: sql_help.c:2199 sql_help.c:2279 sql_help.c:2547 sql_help.c:2578 +#: sql_help.c:3145 sql_help.c:4398 sql_help.c:4505 sql_help.c:4622 +#: sql_help.c:4626 sql_help.c:4630 sql_help.c:4633 sql_help.c:4880 +#: sql_help.c:4884 sql_help.c:4888 sql_help.c:4891 sql_help.c:5125 +#: sql_help.c:5129 sql_help.c:5133 sql_help.c:5136 msgid "function_name" msgstr "nombre_de_función" -#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550 +#: sql_help.c:354 sql_help.c:795 sql_help.c:1887 sql_help.c:2571 msgid "operator_name" msgstr "nombre_operador" -#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873 -#: sql_help.c:2527 sql_help.c:3489 +#: sql_help.c:355 sql_help.c:729 sql_help.c:733 sql_help.c:737 sql_help.c:1888 +#: sql_help.c:2548 sql_help.c:3509 msgid "left_type" msgstr "tipo_izq" -#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874 -#: sql_help.c:2528 sql_help.c:3490 +#: sql_help.c:356 sql_help.c:730 sql_help.c:734 sql_help.c:738 sql_help.c:1889 +#: sql_help.c:2549 sql_help.c:3510 msgid "right_type" msgstr "tipo_der" -#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 -#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 -#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547 -#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508 +#: sql_help.c:358 sql_help.c:360 sql_help.c:758 sql_help.c:761 sql_help.c:764 +#: sql_help.c:793 sql_help.c:805 sql_help.c:813 sql_help.c:816 sql_help.c:819 +#: sql_help.c:1426 sql_help.c:1891 sql_help.c:1893 sql_help.c:2568 +#: sql_help.c:2589 sql_help.c:2975 sql_help.c:3519 sql_help.c:3528 msgid "index_method" msgstr "método_de_índice" -#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480 +#: sql_help.c:362 sql_help.c:1897 sql_help.c:4512 msgid "procedure_name" msgstr "nombre_de_procedimiento" -#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486 +#: sql_help.c:366 sql_help.c:1903 sql_help.c:3935 sql_help.c:4518 msgid "routine_name" msgstr "nombre_de_rutina" -#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402 -#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670 -#: sql_help.c:3936 sql_help.c:4388 +#: sql_help.c:378 sql_help.c:1398 sql_help.c:1920 sql_help.c:2423 +#: sql_help.c:2629 sql_help.c:2930 sql_help.c:3112 sql_help.c:3690 +#: sql_help.c:3957 sql_help.c:4420 msgid "type_name" msgstr "nombre_de_tipo" -#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607 -#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921 -#: sql_help.c:4373 +#: sql_help.c:379 sql_help.c:1921 sql_help.c:2422 sql_help.c:2628 +#: sql_help.c:3113 sql_help.c:3343 sql_help.c:3691 sql_help.c:3942 +#: sql_help.c:4405 msgid "lang_name" msgstr "nombre_lenguaje" -#: sql_help.c:372 +#: sql_help.c:382 msgid "and aggregate_signature is:" msgstr "y signatura_func_agregación es:" -#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283 +#: sql_help.c:405 sql_help.c:2021 sql_help.c:2304 msgid "handler_function" msgstr "función_manejadora" -#: sql_help.c:396 sql_help.c:2284 +#: sql_help.c:406 sql_help.c:2305 msgid "validator_function" msgstr "función_validadora" -#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 -#: sql_help.c:1309 sql_help.c:1581 +#: sql_help.c:454 sql_help.c:533 sql_help.c:677 sql_help.c:869 sql_help.c:1019 +#: sql_help.c:1325 sql_help.c:1602 msgid "action" msgstr "acción" -#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461 -#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470 -#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683 -#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080 -#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334 -#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 -#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349 -#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 -#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422 -#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683 -#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853 -#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1986 sql_help.c:1987 -#: sql_help.c:1988 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399 -#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637 -#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895 -#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927 -#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963 -#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986 -#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893 -#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007 -#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099 -#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627 -#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890 -#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937 -#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138 +#: sql_help.c:456 sql_help.c:463 sql_help.c:467 sql_help.c:468 sql_help.c:471 +#: sql_help.c:473 sql_help.c:474 sql_help.c:475 sql_help.c:477 sql_help.c:480 +#: sql_help.c:482 sql_help.c:483 sql_help.c:681 sql_help.c:691 sql_help.c:693 +#: sql_help.c:696 sql_help.c:698 sql_help.c:699 sql_help.c:927 sql_help.c:1096 +#: sql_help.c:1327 sql_help.c:1345 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 sql_help.c:1358 +#: sql_help.c:1360 sql_help.c:1361 sql_help.c:1363 sql_help.c:1366 +#: sql_help.c:1367 sql_help.c:1369 sql_help.c:1372 sql_help.c:1374 +#: sql_help.c:1375 sql_help.c:1422 sql_help.c:1424 sql_help.c:1431 +#: sql_help.c:1440 sql_help.c:1445 sql_help.c:1452 sql_help.c:1453 +#: sql_help.c:1704 sql_help.c:1707 sql_help.c:1711 sql_help.c:1747 +#: sql_help.c:1868 sql_help.c:1984 sql_help.c:1990 sql_help.c:2004 +#: sql_help.c:2005 sql_help.c:2006 sql_help.c:2354 sql_help.c:2367 +#: sql_help.c:2420 sql_help.c:2488 sql_help.c:2494 sql_help.c:2527 +#: sql_help.c:2658 sql_help.c:2763 sql_help.c:2798 sql_help.c:2800 +#: sql_help.c:2912 sql_help.c:2921 sql_help.c:2931 sql_help.c:2934 +#: sql_help.c:2944 sql_help.c:2948 sql_help.c:2971 sql_help.c:2973 +#: sql_help.c:2980 sql_help.c:2993 sql_help.c:2998 sql_help.c:3005 +#: sql_help.c:3006 sql_help.c:3022 sql_help.c:3148 sql_help.c:3288 +#: sql_help.c:3914 sql_help.c:3915 sql_help.c:4011 sql_help.c:4026 +#: sql_help.c:4028 sql_help.c:4030 sql_help.c:4124 sql_help.c:4127 +#: sql_help.c:4129 sql_help.c:4131 sql_help.c:4377 sql_help.c:4378 +#: sql_help.c:4498 sql_help.c:4659 sql_help.c:4666 sql_help.c:4668 +#: sql_help.c:4917 sql_help.c:4924 sql_help.c:4926 sql_help.c:4967 +#: sql_help.c:4969 sql_help.c:4971 sql_help.c:5024 sql_help.c:5162 +#: sql_help.c:5169 sql_help.c:5171 msgid "column_name" msgstr "nombre_de_columna" -#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 +#: sql_help.c:457 sql_help.c:682 sql_help.c:1328 sql_help.c:1712 msgid "new_column_name" msgstr "nuevo_nombre_de_columna" -#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 -#: sql_help.c:1328 sql_help.c:1591 +#: sql_help.c:462 sql_help.c:554 sql_help.c:690 sql_help.c:890 sql_help.c:1040 +#: sql_help.c:1344 sql_help.c:1612 msgid "where action is one of:" msgstr "donde acción es una de:" -#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330 -#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237 -#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896 -#: sql_help.c:3175 sql_help.c:4151 +#: sql_help.c:464 sql_help.c:469 sql_help.c:1088 sql_help.c:1346 +#: sql_help.c:1351 sql_help.c:1614 sql_help.c:1618 sql_help.c:2258 +#: sql_help.c:2355 sql_help.c:2567 sql_help.c:2756 sql_help.c:2913 +#: sql_help.c:3195 sql_help.c:4183 msgid "data_type" msgstr "tipo_de_dato" -#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336 -#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337 -#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919 -#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000 +#: sql_help.c:465 sql_help.c:470 sql_help.c:1347 sql_help.c:1352 +#: sql_help.c:1447 sql_help.c:1615 sql_help.c:1619 sql_help.c:2259 +#: sql_help.c:2358 sql_help.c:2490 sql_help.c:2915 sql_help.c:2923 +#: sql_help.c:2936 sql_help.c:2950 sql_help.c:3000 sql_help.c:3196 +#: sql_help.c:3202 sql_help.c:4021 msgid "collation" msgstr "ordenamiento" -#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347 -#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928 +#: sql_help.c:466 sql_help.c:1348 sql_help.c:2359 sql_help.c:2368 +#: sql_help.c:2916 sql_help.c:2932 sql_help.c:2945 msgid "column_constraint" msgstr "restricción_de_columna" -#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986 +#: sql_help.c:476 sql_help.c:618 sql_help.c:692 sql_help.c:1368 sql_help.c:5018 msgid "integer" msgstr "entero" -#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352 -#: sql_help.c:1355 +#: sql_help.c:478 sql_help.c:481 sql_help.c:694 sql_help.c:697 sql_help.c:1370 +#: sql_help.c:1373 msgid "attribute_option" msgstr "opción_de_atributo" -#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348 -#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929 +#: sql_help.c:486 sql_help.c:1377 sql_help.c:2360 sql_help.c:2369 +#: sql_help.c:2917 sql_help.c:2933 sql_help.c:2946 msgid "table_constraint" msgstr "restricción_de_tabla" -#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364 -#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907 +#: sql_help.c:489 sql_help.c:490 sql_help.c:491 sql_help.c:492 sql_help.c:1382 +#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:1922 msgid "trigger_name" msgstr "nombre_disparador" -#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 -#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926 +#: sql_help.c:493 sql_help.c:494 sql_help.c:1396 sql_help.c:1397 +#: sql_help.c:2361 sql_help.c:2366 sql_help.c:2920 sql_help.c:2943 msgid "parent_table" msgstr "tabla_padre" -#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 -#: sql_help.c:1550 sql_help.c:2269 +#: sql_help.c:553 sql_help.c:610 sql_help.c:679 sql_help.c:889 sql_help.c:1039 +#: sql_help.c:1571 sql_help.c:2290 msgid "extension_name" msgstr "nombre_de_extensión" -#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403 +#: sql_help.c:555 sql_help.c:1041 sql_help.c:2424 msgid "execution_cost" msgstr "costo_de_ejecución" -#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404 +#: sql_help.c:556 sql_help.c:1042 sql_help.c:2425 msgid "result_rows" msgstr "núm_de_filas" -#: sql_help.c:547 sql_help.c:2405 +#: sql_help.c:557 sql_help.c:2426 msgid "support_function" msgstr "función_de_soporte" -#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 -#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641 -#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717 -#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891 -#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900 -#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906 -#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912 -#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922 -#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928 -#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934 -#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940 -#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348 -#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355 -#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361 -#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371 -#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377 -#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383 -#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389 -#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393 +#: sql_help.c:579 sql_help.c:581 sql_help.c:964 sql_help.c:972 sql_help.c:976 +#: sql_help.c:979 sql_help.c:982 sql_help.c:1654 sql_help.c:1662 +#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1672 sql_help.c:2734 +#: sql_help.c:2736 sql_help.c:2739 sql_help.c:2740 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3917 sql_help.c:3918 sql_help.c:3921 +#: sql_help.c:3922 sql_help.c:3924 sql_help.c:3925 sql_help.c:3927 +#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3931 sql_help.c:3933 +#: sql_help.c:3934 sql_help.c:3940 sql_help.c:3941 sql_help.c:3943 +#: sql_help.c:3944 sql_help.c:3946 sql_help.c:3947 sql_help.c:3949 +#: sql_help.c:3950 sql_help.c:3952 sql_help.c:3953 sql_help.c:3955 +#: sql_help.c:3956 sql_help.c:3958 sql_help.c:3959 sql_help.c:3961 +#: sql_help.c:3962 sql_help.c:4375 sql_help.c:4376 sql_help.c:4380 +#: sql_help.c:4381 sql_help.c:4384 sql_help.c:4385 sql_help.c:4387 +#: sql_help.c:4388 sql_help.c:4390 sql_help.c:4391 sql_help.c:4393 +#: sql_help.c:4394 sql_help.c:4396 sql_help.c:4397 sql_help.c:4403 +#: sql_help.c:4404 sql_help.c:4406 sql_help.c:4407 sql_help.c:4409 +#: sql_help.c:4410 sql_help.c:4412 sql_help.c:4413 sql_help.c:4415 +#: sql_help.c:4416 sql_help.c:4418 sql_help.c:4419 sql_help.c:4421 +#: sql_help.c:4422 sql_help.c:4424 sql_help.c:4425 msgid "role_specification" msgstr "especificación_de_rol" -#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205 -#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720 +#: sql_help.c:580 sql_help.c:582 sql_help.c:1685 sql_help.c:2225 +#: sql_help.c:2742 sql_help.c:3273 sql_help.c:3724 sql_help.c:4753 msgid "user_name" msgstr "nombre_de_usuario" -#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724 -#: sql_help.c:3942 sql_help.c:4394 +#: sql_help.c:583 sql_help.c:984 sql_help.c:1674 sql_help.c:2741 +#: sql_help.c:3963 sql_help.c:4426 msgid "where role_specification can be:" msgstr "donde especificación_de_rol puede ser:" -#: sql_help.c:575 +#: sql_help.c:585 msgid "group_name" msgstr "nombre_de_grupo" -#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476 -#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938 -#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933 -#: sql_help.c:4385 +#: sql_help.c:606 sql_help.c:1443 sql_help.c:2237 sql_help.c:2497 +#: sql_help.c:2531 sql_help.c:2928 sql_help.c:2941 sql_help.c:2955 +#: sql_help.c:2996 sql_help.c:3026 sql_help.c:3038 sql_help.c:3954 +#: sql_help.c:4417 msgid "tablespace_name" msgstr "nombre_de_tablespace" -#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382 -#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785 +#: sql_help.c:608 sql_help.c:701 sql_help.c:1390 sql_help.c:1400 +#: sql_help.c:1438 sql_help.c:1800 msgid "index_name" msgstr "nombre_índice" -#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375 -#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508 -#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977 -#: sql_help.c:3004 +#: sql_help.c:612 sql_help.c:615 sql_help.c:704 sql_help.c:706 sql_help.c:1393 +#: sql_help.c:1395 sql_help.c:1441 sql_help.c:2495 sql_help.c:2529 +#: sql_help.c:2926 sql_help.c:2939 sql_help.c:2953 sql_help.c:2994 +#: sql_help.c:3024 msgid "storage_parameter" msgstr "parámetro_de_almacenamiento" -#: sql_help.c:607 +#: sql_help.c:617 msgid "column_number" msgstr "número_de_columna" -#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477 +#: sql_help.c:641 sql_help.c:1885 sql_help.c:4509 msgid "large_object_oid" msgstr "oid_de_objeto_grande" -#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897 +#: sql_help.c:700 sql_help.c:1376 sql_help.c:2914 msgid "compression_method" msgstr "método_de_compresión" -#: sql_help.c:692 sql_help.c:1373 +#: sql_help.c:702 sql_help.c:1391 msgid "new_access_method" msgstr "nuevo_método_de_acceso" -#: sql_help.c:725 sql_help.c:2531 +#: sql_help.c:739 sql_help.c:2552 msgid "res_proc" msgstr "proc_res" -#: sql_help.c:726 sql_help.c:2532 +#: sql_help.c:740 sql_help.c:2553 msgid "join_proc" msgstr "proc_join" -#: sql_help.c:778 sql_help.c:790 sql_help.c:2549 +#: sql_help.c:741 sql_help.c:2550 +msgid "com_op" +msgstr "op_conm" + +#: sql_help.c:742 sql_help.c:2551 +msgid "neg_op" +msgstr "op_neg" + +#: sql_help.c:794 sql_help.c:806 sql_help.c:2570 msgid "strategy_number" msgstr "número_de_estrategia" -#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 -#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552 -#: sql_help.c:2555 sql_help.c:2556 +#: sql_help.c:796 sql_help.c:797 sql_help.c:800 sql_help.c:801 sql_help.c:807 +#: sql_help.c:808 sql_help.c:810 sql_help.c:811 sql_help.c:2572 sql_help.c:2573 +#: sql_help.c:2576 sql_help.c:2577 msgid "op_type" msgstr "tipo_op" -#: sql_help.c:782 sql_help.c:2553 +#: sql_help.c:798 sql_help.c:2574 msgid "sort_family_name" msgstr "nombre_familia_ordenamiento" -#: sql_help.c:783 sql_help.c:793 sql_help.c:2554 +#: sql_help.c:799 sql_help.c:809 sql_help.c:2575 msgid "support_number" msgstr "número_de_soporte" -#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095 -#: sql_help.c:3097 +#: sql_help.c:803 sql_help.c:2157 sql_help.c:2579 sql_help.c:3115 +#: sql_help.c:3117 msgid "argument_type" msgstr "tipo_argumento" -#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 -#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781 -#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893 -#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332 -#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582 -#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778 -#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925 -#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525 -#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895 -#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347 -#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640 -#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897 -#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081 -#: sql_help.c:5143 +#: sql_help.c:834 sql_help.c:837 sql_help.c:926 sql_help.c:1055 sql_help.c:1095 +#: sql_help.c:1567 sql_help.c:1570 sql_help.c:1746 sql_help.c:1799 +#: sql_help.c:1870 sql_help.c:1895 sql_help.c:1908 sql_help.c:1923 +#: sql_help.c:1983 sql_help.c:1989 sql_help.c:2353 sql_help.c:2365 +#: sql_help.c:2486 sql_help.c:2526 sql_help.c:2603 sql_help.c:2657 +#: sql_help.c:2710 sql_help.c:2762 sql_help.c:2795 sql_help.c:2802 +#: sql_help.c:2911 sql_help.c:2929 sql_help.c:2942 sql_help.c:3021 +#: sql_help.c:3141 sql_help.c:3322 sql_help.c:3545 sql_help.c:3594 +#: sql_help.c:3700 sql_help.c:3910 sql_help.c:3916 sql_help.c:3977 +#: sql_help.c:4009 sql_help.c:4373 sql_help.c:4379 sql_help.c:4497 +#: sql_help.c:4610 sql_help.c:4673 sql_help.c:4712 sql_help.c:4868 +#: sql_help.c:4931 sql_help.c:4965 sql_help.c:5023 sql_help.c:5113 +#: sql_help.c:5176 msgid "table_name" msgstr "nombre_de_tabla" -#: sql_help.c:823 sql_help.c:2584 +#: sql_help.c:839 sql_help.c:2605 msgid "using_expression" msgstr "expresión_using" -#: sql_help.c:824 sql_help.c:2585 +#: sql_help.c:840 sql_help.c:2606 msgid "check_expression" msgstr "expresión_check" -#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632 +#: sql_help.c:913 sql_help.c:915 sql_help.c:917 sql_help.c:2653 msgid "publication_object" msgstr "objeto_de_publicación" -#: sql_help.c:903 sql_help.c:2633 +#: sql_help.c:919 sql_help.c:2654 msgid "publication_parameter" msgstr "parámetro_de_publicación" -#: sql_help.c:909 sql_help.c:2635 +#: sql_help.c:925 sql_help.c:2656 msgid "where publication_object is one of:" msgstr "donde objeto_de_publicación es uno de:" -#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670 -#: sql_help.c:3236 +#: sql_help.c:968 sql_help.c:1658 sql_help.c:2464 sql_help.c:2689 +#: sql_help.c:3256 msgid "password" msgstr "contraseña" -#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671 -#: sql_help.c:3237 +#: sql_help.c:969 sql_help.c:1659 sql_help.c:2465 sql_help.c:2690 +#: sql_help.c:3257 msgid "timestamp" msgstr "fecha_hora" -#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642 -#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902 -#: sql_help.c:4354 +#: sql_help.c:973 sql_help.c:977 sql_help.c:980 sql_help.c:983 sql_help.c:1663 +#: sql_help.c:1667 sql_help.c:1670 sql_help.c:1673 sql_help.c:3923 +#: sql_help.c:4386 msgid "database_name" msgstr "nombre_de_base_de_datos" -#: sql_help.c:1073 sql_help.c:2740 +#: sql_help.c:1089 sql_help.c:2757 msgid "increment" msgstr "incremento" -#: sql_help.c:1074 sql_help.c:2741 +#: sql_help.c:1090 sql_help.c:2758 msgid "minvalue" msgstr "valormin" -#: sql_help.c:1075 sql_help.c:2742 +#: sql_help.c:1091 sql_help.c:2759 msgid "maxvalue" msgstr "valormax" -#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677 -#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077 +#: sql_help.c:1092 sql_help.c:2760 sql_help.c:4606 sql_help.c:4710 +#: sql_help.c:4864 sql_help.c:5040 sql_help.c:5109 msgid "start" msgstr "inicio" -#: sql_help.c:1077 sql_help.c:1347 +#: sql_help.c:1093 sql_help.c:1365 msgid "restart" msgstr "reinicio" -#: sql_help.c:1078 sql_help.c:2744 +#: sql_help.c:1094 sql_help.c:2761 msgid "cache" msgstr "cache" -#: sql_help.c:1123 +#: sql_help.c:1139 msgid "new_target" msgstr "nuevo_valor" -#: sql_help.c:1142 sql_help.c:2797 +#: sql_help.c:1158 sql_help.c:2814 msgid "conninfo" msgstr "conninfo" -#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798 +#: sql_help.c:1160 sql_help.c:1164 sql_help.c:1168 sql_help.c:2815 msgid "publication_name" msgstr "nombre_de_publicación" -#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +#: sql_help.c:1161 sql_help.c:1165 sql_help.c:1169 msgid "publication_option" msgstr "opción_de_publicación" -#: sql_help.c:1156 +#: sql_help.c:1172 msgid "refresh_option" msgstr "opción_refresh" -#: sql_help.c:1161 sql_help.c:2799 +#: sql_help.c:1177 sql_help.c:2816 msgid "subscription_parameter" msgstr "parámetro_de_suscripción" -#: sql_help.c:1164 +#: sql_help.c:1180 msgid "skip_option" msgstr "opción_skip" -#: sql_help.c:1324 sql_help.c:1327 +#: sql_help.c:1340 sql_help.c:1343 msgid "partition_name" msgstr "nombre_de_partición" -#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930 +#: sql_help.c:1341 sql_help.c:2370 sql_help.c:2947 msgid "partition_bound_spec" msgstr "borde_de_partición" -#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944 +#: sql_help.c:1362 sql_help.c:1412 sql_help.c:2961 msgid "sequence_options" msgstr "opciones_de_secuencia" -#: sql_help.c:1346 +#: sql_help.c:1364 msgid "sequence_option" msgstr "opción_de_secuencia" -#: sql_help.c:1360 +#: sql_help.c:1378 msgid "table_constraint_using_index" msgstr "restricción_de_tabla_con_índice" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 +#: sql_help.c:1386 sql_help.c:1387 sql_help.c:1388 sql_help.c:1389 msgid "rewrite_rule_name" msgstr "nombre_regla_de_reescritura" -#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969 +#: sql_help.c:1401 sql_help.c:2382 sql_help.c:2986 msgid "and partition_bound_spec is:" msgstr "y borde_de_partición es:" -#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362 -#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971 -#: sql_help.c:2972 +#: sql_help.c:1402 sql_help.c:1403 sql_help.c:1404 sql_help.c:2383 +#: sql_help.c:2384 sql_help.c:2385 sql_help.c:2987 sql_help.c:2988 +#: sql_help.c:2989 msgid "partition_bound_expr" msgstr "expresión_de_borde_de_partición" -#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366 -#: sql_help.c:2973 sql_help.c:2974 +#: sql_help.c:1405 sql_help.c:1406 sql_help.c:2386 sql_help.c:2387 +#: sql_help.c:2990 sql_help.c:2991 msgid "numeric_literal" msgstr "literal_numérico" -#: sql_help.c:1389 +#: sql_help.c:1407 msgid "and column_constraint is:" msgstr "donde restricción_de_columna es:" -#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606 -#: sql_help.c:2942 +#: sql_help.c:1410 sql_help.c:2377 sql_help.c:2418 sql_help.c:2627 +#: sql_help.c:2959 msgid "default_expr" msgstr "expr_por_omisión" -#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943 +#: sql_help.c:1411 sql_help.c:2378 sql_help.c:2960 msgid "generation_expr" msgstr "expr_de_generación" -#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 -#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955 -#: sql_help.c:2957 sql_help.c:2961 +#: sql_help.c:1413 sql_help.c:1414 sql_help.c:1423 sql_help.c:1425 +#: sql_help.c:1429 sql_help.c:2962 sql_help.c:2963 sql_help.c:2972 +#: sql_help.c:2974 sql_help.c:2978 msgid "index_parameters" msgstr "parámetros_de_índice" -#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964 +#: sql_help.c:1415 sql_help.c:1432 sql_help.c:2964 sql_help.c:2981 msgid "reftable" msgstr "tabla_ref" -#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965 +#: sql_help.c:1416 sql_help.c:1433 sql_help.c:2965 sql_help.c:2982 msgid "refcolumn" msgstr "columna_ref" -#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 -#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967 +#: sql_help.c:1417 sql_help.c:1418 sql_help.c:1434 sql_help.c:1435 +#: sql_help.c:2966 sql_help.c:2967 sql_help.c:2983 sql_help.c:2984 msgid "referential_action" msgstr "acción_referencial" -#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951 +#: sql_help.c:1419 sql_help.c:2379 sql_help.c:2968 msgid "and table_constraint is:" msgstr "y restricción_de_tabla es:" -#: sql_help.c:1409 sql_help.c:2959 +#: sql_help.c:1427 sql_help.c:2976 msgid "exclude_element" msgstr "elemento_de_exclusión" -#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675 -#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075 +#: sql_help.c:1428 sql_help.c:2977 sql_help.c:4604 sql_help.c:4708 +#: sql_help.c:4862 sql_help.c:5038 sql_help.c:5107 msgid "operator" msgstr "operador" -#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962 +#: sql_help.c:1430 sql_help.c:2498 sql_help.c:2979 msgid "predicate" msgstr "predicado" -#: sql_help.c:1418 +#: sql_help.c:1436 msgid "and table_constraint_using_index is:" msgstr "y restricción_de_tabla_con_índice es:" -#: sql_help.c:1421 sql_help.c:2975 +#: sql_help.c:1439 sql_help.c:2992 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "parámetros_de_índice en UNIQUE, PRIMARY KEY y EXCLUDE son:" -#: sql_help.c:1426 sql_help.c:2980 +#: sql_help.c:1444 sql_help.c:2997 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "elemento_de_exclusión en una restricción EXCLUDE es:" -#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920 -#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001 +#: sql_help.c:1448 sql_help.c:2491 sql_help.c:2924 sql_help.c:2937 +#: sql_help.c:2951 sql_help.c:3001 sql_help.c:4022 msgid "opclass" msgstr "clase_de_ops" -#: sql_help.c:1430 sql_help.c:2984 +#: sql_help.c:1449 sql_help.c:2492 sql_help.c:3002 +msgid "opclass_parameter" +msgstr "parámetro_opclass" + +#: sql_help.c:1451 sql_help.c:3004 msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" msgstr "acción_referencial en una restricción FOREIGN KEY/REFERENCES es:" -#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021 +#: sql_help.c:1469 sql_help.c:1472 sql_help.c:3041 msgid "tablespace_option" msgstr "opción_de_tablespace" -#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 +#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1502 sql_help.c:1506 msgid "token_type" msgstr "tipo_de_token" -#: sql_help.c:1473 sql_help.c:1476 +#: sql_help.c:1494 sql_help.c:1497 msgid "dictionary_name" msgstr "nombre_diccionario" -#: sql_help.c:1478 sql_help.c:1482 +#: sql_help.c:1499 sql_help.c:1503 msgid "old_dictionary" msgstr "diccionario_antiguo" -#: sql_help.c:1479 sql_help.c:1483 +#: sql_help.c:1500 sql_help.c:1504 msgid "new_dictionary" msgstr "diccionario_nuevo" -#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 -#: sql_help.c:3174 +#: sql_help.c:1599 sql_help.c:1613 sql_help.c:1616 sql_help.c:1617 +#: sql_help.c:3194 msgid "attribute_name" msgstr "nombre_atributo" -#: sql_help.c:1579 +#: sql_help.c:1600 msgid "new_attribute_name" msgstr "nuevo_nombre_atributo" -#: sql_help.c:1583 sql_help.c:1587 +#: sql_help.c:1604 sql_help.c:1608 msgid "new_enum_value" msgstr "nuevo_valor_enum" -#: sql_help.c:1584 +#: sql_help.c:1605 msgid "neighbor_enum_value" msgstr "valor_enum_vecino" -#: sql_help.c:1586 +#: sql_help.c:1607 msgid "existing_enum_value" msgstr "valor_enum_existente" -#: sql_help.c:1589 +#: sql_help.c:1610 msgid "property" msgstr "propiedad" -#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756 -#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957 -#: sql_help.c:4363 +#: sql_help.c:1686 sql_help.c:2362 sql_help.c:2371 sql_help.c:2773 +#: sql_help.c:3274 sql_help.c:3725 sql_help.c:3932 sql_help.c:3978 +#: sql_help.c:4395 msgid "server_name" msgstr "nombre_de_servidor" -#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269 +#: sql_help.c:1718 sql_help.c:1721 sql_help.c:3289 msgid "view_option_name" msgstr "nombre_opción_de_vista" -#: sql_help.c:1698 sql_help.c:3270 +#: sql_help.c:1719 sql_help.c:3290 msgid "view_option_value" msgstr "valor_opción_de_vista" -#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975 +#: sql_help.c:1740 sql_help.c:5007 msgid "table_and_columns" msgstr "tabla_y_columnas" -#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754 -#: sql_help.c:4198 sql_help.c:4976 +#: sql_help.c:1741 sql_help.c:1801 sql_help.c:1995 sql_help.c:3774 +#: sql_help.c:4230 sql_help.c:5008 msgid "where option can be one of:" msgstr "donde opción puede ser una de:" -#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980 -#: sql_help.c:1983 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756 -#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760 -#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199 -#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979 -#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983 -#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988 +#: sql_help.c:1742 sql_help.c:1743 sql_help.c:1802 sql_help.c:1997 +#: sql_help.c:2001 sql_help.c:2183 sql_help.c:3775 sql_help.c:3776 +#: sql_help.c:3777 sql_help.c:3778 sql_help.c:3779 sql_help.c:3780 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:4231 sql_help.c:4233 sql_help.c:5009 sql_help.c:5010 +#: sql_help.c:5011 sql_help.c:5012 sql_help.c:5013 sql_help.c:5014 +#: sql_help.c:5015 sql_help.c:5016 sql_help.c:5017 sql_help.c:5019 +#: sql_help.c:5020 msgid "boolean" msgstr "booleano" -#: sql_help.c:1725 sql_help.c:4989 +#: sql_help.c:1744 sql_help.c:5021 msgid "size" msgstr "tamaño" -#: sql_help.c:1726 sql_help.c:4990 +#: sql_help.c:1745 sql_help.c:5022 msgid "and table_and_columns is:" msgstr "y tabla_y_columnas es:" -#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762 +#: sql_help.c:1761 sql_help.c:4769 sql_help.c:4771 sql_help.c:4795 msgid "transaction_mode" msgstr "modo_de_transacción" -#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763 +#: sql_help.c:1762 sql_help.c:4772 sql_help.c:4796 msgid "where transaction_mode is one of:" msgstr "donde modo_de_transacción es uno de:" -#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595 -#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848 -#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085 -#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105 +#: sql_help.c:1771 sql_help.c:4614 sql_help.c:4623 sql_help.c:4627 +#: sql_help.c:4631 sql_help.c:4634 sql_help.c:4872 sql_help.c:4881 +#: sql_help.c:4885 sql_help.c:4889 sql_help.c:4892 sql_help.c:5117 +#: sql_help.c:5126 sql_help.c:5130 sql_help.c:5134 sql_help.c:5137 msgid "argument" msgstr "argumento" -#: sql_help.c:1852 +#: sql_help.c:1867 msgid "relation_name" msgstr "nombre_relación" -#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357 +#: sql_help.c:1872 sql_help.c:3926 sql_help.c:4389 msgid "domain_name" msgstr "nombre_de_dominio" -#: sql_help.c:1879 +#: sql_help.c:1894 msgid "policy_name" msgstr "nombre_de_política" -#: sql_help.c:1892 +#: sql_help.c:1907 msgid "rule_name" msgstr "nombre_regla" -#: sql_help.c:1911 sql_help.c:4496 -#| msgid "numeric_literal" +#: sql_help.c:1926 sql_help.c:4528 msgid "string_literal" msgstr "literal_de_cadena" -#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410 +#: sql_help.c:1951 sql_help.c:4192 sql_help.c:4442 msgid "transaction_id" msgstr "id_de_transacción" -#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027 +#: sql_help.c:1985 sql_help.c:1992 sql_help.c:4048 msgid "filename" msgstr "nombre_de_archivo" -#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696 -#: sql_help.c:2697 +#: sql_help.c:1986 sql_help.c:1993 sql_help.c:2712 sql_help.c:2713 +#: sql_help.c:2714 msgid "command" msgstr "orden" -#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305 -#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565 -#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822 -#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070 +#: sql_help.c:1988 sql_help.c:2711 sql_help.c:3144 sql_help.c:3325 +#: sql_help.c:4032 sql_help.c:4115 sql_help.c:4118 sql_help.c:4121 +#: sql_help.c:4597 sql_help.c:4599 sql_help.c:4701 sql_help.c:4703 +#: sql_help.c:4855 sql_help.c:4857 sql_help.c:4974 sql_help.c:5100 +#: sql_help.c:5102 msgid "condition" msgstr "condición" -#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271 -#: sql_help.c:3289 sql_help.c:3992 +#: sql_help.c:1991 sql_help.c:2532 sql_help.c:3027 sql_help.c:3291 +#: sql_help.c:3309 sql_help.c:4013 msgid "query" msgstr "consulta" -#: sql_help.c:1979 +#: sql_help.c:1996 msgid "format_name" msgstr "nombre_de_formato" -#: sql_help.c:1981 +#: sql_help.c:1998 msgid "delimiter_character" msgstr "carácter_delimitador" -#: sql_help.c:1982 +#: sql_help.c:1999 msgid "null_string" msgstr "cadena_null" -#: sql_help.c:1984 +#: sql_help.c:2000 +msgid "default_string" +msgstr "cadena_por_omisión" + +#: sql_help.c:2002 msgid "quote_character" msgstr "carácter_de_comilla" -#: sql_help.c:1985 +#: sql_help.c:2003 msgid "escape_character" msgstr "carácter_de_escape" -#: sql_help.c:1989 +#: sql_help.c:2007 +msgid "error_action" +msgstr "acción_en_error" + +#: sql_help.c:2008 msgid "encoding_name" msgstr "nombre_codificación" -#: sql_help.c:1990 -#| msgid "null_string" -msgid "default_string" -msgstr "cadena_por_omisión" +#: sql_help.c:2009 +msgid "verbosity" +msgstr "verbosidad" -#: sql_help.c:2001 +#: sql_help.c:2020 msgid "access_method_type" msgstr "tipo_de_método_de_acceso" -#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094 +#: sql_help.c:2091 sql_help.c:2110 sql_help.c:2113 msgid "arg_data_type" msgstr "tipo_de_dato_arg" -#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103 +#: sql_help.c:2092 sql_help.c:2114 sql_help.c:2122 msgid "sfunc" msgstr "func_transición" -#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104 +#: sql_help.c:2093 sql_help.c:2115 sql_help.c:2123 msgid "state_data_type" msgstr "tipo_de_dato_de_estado" -#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105 +#: sql_help.c:2094 sql_help.c:2116 sql_help.c:2124 msgid "state_data_size" msgstr "tamaño_de_dato_de_estado" -#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106 +#: sql_help.c:2095 sql_help.c:2117 sql_help.c:2125 msgid "ffunc" msgstr "func_final" -#: sql_help.c:2077 sql_help.c:2107 +#: sql_help.c:2096 sql_help.c:2126 msgid "combinefunc" msgstr "func_combinación" -#: sql_help.c:2078 sql_help.c:2108 +#: sql_help.c:2097 sql_help.c:2127 msgid "serialfunc" msgstr "func_serial" -#: sql_help.c:2079 sql_help.c:2109 +#: sql_help.c:2098 sql_help.c:2128 msgid "deserialfunc" msgstr "func_deserial" -#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110 +#: sql_help.c:2099 sql_help.c:2118 sql_help.c:2129 msgid "initial_condition" msgstr "condición_inicial" -#: sql_help.c:2081 sql_help.c:2111 +#: sql_help.c:2100 sql_help.c:2130 msgid "msfunc" msgstr "func_transición_m" -#: sql_help.c:2082 sql_help.c:2112 +#: sql_help.c:2101 sql_help.c:2131 msgid "minvfunc" msgstr "func_inv_m" -#: sql_help.c:2083 sql_help.c:2113 +#: sql_help.c:2102 sql_help.c:2132 msgid "mstate_data_type" msgstr "tipo_de_dato_de_estado_m" -#: sql_help.c:2084 sql_help.c:2114 +#: sql_help.c:2103 sql_help.c:2133 msgid "mstate_data_size" msgstr "tamaño_de_dato_de_estado_m" -#: sql_help.c:2085 sql_help.c:2115 +#: sql_help.c:2104 sql_help.c:2134 msgid "mffunc" msgstr "func_final_m" -#: sql_help.c:2086 sql_help.c:2116 +#: sql_help.c:2105 sql_help.c:2135 msgid "minitial_condition" msgstr "condición_inicial_m" -#: sql_help.c:2087 sql_help.c:2117 +#: sql_help.c:2106 sql_help.c:2136 msgid "sort_operator" msgstr "operador_de_ordenamiento" -#: sql_help.c:2100 +#: sql_help.c:2119 msgid "or the old syntax" msgstr "o la sintaxis antigua" -#: sql_help.c:2102 +#: sql_help.c:2121 msgid "base_type" msgstr "tipo_base" -#: sql_help.c:2160 sql_help.c:2209 +#: sql_help.c:2179 sql_help.c:2229 msgid "locale" msgstr "configuración regional" -#: sql_help.c:2161 sql_help.c:2210 +#: sql_help.c:2180 sql_help.c:2230 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2162 sql_help.c:2211 +#: sql_help.c:2181 sql_help.c:2231 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2163 sql_help.c:4463 +#: sql_help.c:2182 sql_help.c:4495 msgid "provider" msgstr "proveedor" -#: sql_help.c:2165 -#| msgid "rule" +#: sql_help.c:2184 msgid "rules" msgstr "reglas" -#: sql_help.c:2166 sql_help.c:2271 +#: sql_help.c:2185 sql_help.c:2292 msgid "version" msgstr "versión" -#: sql_help.c:2168 +#: sql_help.c:2187 msgid "existing_collation" msgstr "ordenamiento_existente" -#: sql_help.c:2178 +#: sql_help.c:2197 msgid "source_encoding" msgstr "codificación_origen" -#: sql_help.c:2179 +#: sql_help.c:2198 msgid "dest_encoding" msgstr "codificación_destino" -#: sql_help.c:2206 sql_help.c:3047 +#: sql_help.c:2226 sql_help.c:3067 msgid "template" msgstr "plantilla" -#: sql_help.c:2207 +#: sql_help.c:2227 msgid "encoding" msgstr "codificación" -#: sql_help.c:2208 +#: sql_help.c:2228 msgid "strategy" msgstr "estrategia" -#: sql_help.c:2212 +#: sql_help.c:2232 +msgid "builtin_locale" +msgstr "locale_builtin" + +#: sql_help.c:2233 msgid "icu_locale" msgstr "locale_icu" -#: sql_help.c:2213 -#| msgid "icu_locale" +#: sql_help.c:2234 msgid "icu_rules" msgstr "reglas_icu" -#: sql_help.c:2214 +#: sql_help.c:2235 msgid "locale_provider" msgstr "proveedor_locale" -#: sql_help.c:2215 +#: sql_help.c:2236 msgid "collation_version" msgstr "versión_ordenamiento" -#: sql_help.c:2220 +#: sql_help.c:2241 msgid "oid" msgstr "oid" -#: sql_help.c:2240 -msgid "constraint" -msgstr "restricción" - -#: sql_help.c:2241 -msgid "where constraint is:" -msgstr "donde restricción es:" - -#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120 +#: sql_help.c:2276 sql_help.c:2709 sql_help.c:3140 msgid "event" msgstr "evento" -#: sql_help.c:2256 +#: sql_help.c:2277 msgid "filter_variable" msgstr "variable_de_filtrado" -#: sql_help.c:2257 +#: sql_help.c:2278 msgid "filter_value" msgstr "valor_de_filtrado" -#: sql_help.c:2353 sql_help.c:2939 +#: sql_help.c:2374 sql_help.c:2956 msgid "where column_constraint is:" msgstr "donde restricción_de_columna es:" -#: sql_help.c:2398 +#: sql_help.c:2419 msgid "rettype" msgstr "tipo_ret" -#: sql_help.c:2400 +#: sql_help.c:2421 msgid "column_type" msgstr "tipo_columna" -#: sql_help.c:2409 sql_help.c:2612 +#: sql_help.c:2430 sql_help.c:2633 msgid "definition" msgstr "definición" -#: sql_help.c:2410 sql_help.c:2613 +#: sql_help.c:2431 sql_help.c:2634 msgid "obj_file" msgstr "archivo_obj" -#: sql_help.c:2411 sql_help.c:2614 +#: sql_help.c:2432 sql_help.c:2635 msgid "link_symbol" msgstr "símbolo_enlace" -#: sql_help.c:2412 sql_help.c:2615 +#: sql_help.c:2433 sql_help.c:2636 msgid "sql_body" msgstr "contenido_sql" -#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243 +#: sql_help.c:2471 sql_help.c:2694 sql_help.c:3263 msgid "uid" msgstr "uid" -#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921 -#: sql_help.c:2935 sql_help.c:3003 +#: sql_help.c:2487 sql_help.c:2528 sql_help.c:2925 sql_help.c:2938 +#: sql_help.c:2952 sql_help.c:3023 msgid "method" msgstr "método" -#: sql_help.c:2471 -msgid "opclass_parameter" -msgstr "parámetro_opclass" - -#: sql_help.c:2488 +#: sql_help.c:2509 msgid "call_handler" msgstr "manejador_de_llamada" -#: sql_help.c:2489 +#: sql_help.c:2510 msgid "inline_handler" msgstr "manejador_en_línea" -#: sql_help.c:2490 +#: sql_help.c:2511 msgid "valfunction" msgstr "función_val" -#: sql_help.c:2529 -msgid "com_op" -msgstr "op_conm" - -#: sql_help.c:2530 -msgid "neg_op" -msgstr "op_neg" - -#: sql_help.c:2548 +#: sql_help.c:2569 msgid "family_name" msgstr "nombre_familia" -#: sql_help.c:2559 +#: sql_help.c:2580 msgid "storage_type" msgstr "tipo_almacenamiento" -#: sql_help.c:2698 sql_help.c:3127 +#: sql_help.c:2715 sql_help.c:3147 msgid "where event can be one of:" msgstr "donde evento puede ser una de:" -#: sql_help.c:2718 sql_help.c:2720 +#: sql_help.c:2735 sql_help.c:2737 msgid "schema_element" msgstr "elemento_de_esquema" -#: sql_help.c:2757 +#: sql_help.c:2774 msgid "server_type" msgstr "tipo_de_servidor" -#: sql_help.c:2758 +#: sql_help.c:2775 msgid "server_version" msgstr "versión_de_servidor" -#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360 +#: sql_help.c:2776 sql_help.c:3929 sql_help.c:4392 msgid "fdw_name" msgstr "nombre_fdw" -#: sql_help.c:2776 sql_help.c:2779 +#: sql_help.c:2793 sql_help.c:2796 msgid "statistics_name" msgstr "nombre_de_estadística" -#: sql_help.c:2780 +#: sql_help.c:2797 msgid "statistics_kind" msgstr "tipo_de_estadística" -#: sql_help.c:2796 +#: sql_help.c:2813 msgid "subscription_name" msgstr "nombre_de_suscripción" -#: sql_help.c:2901 +#: sql_help.c:2918 msgid "source_table" msgstr "tabla_origen" -#: sql_help.c:2902 +#: sql_help.c:2919 msgid "like_option" msgstr "opción_de_like" -#: sql_help.c:2968 +#: sql_help.c:2985 msgid "and like_option is:" msgstr "y opción_de_like es:" -#: sql_help.c:3020 +#: sql_help.c:3040 msgid "directory" msgstr "directorio" -#: sql_help.c:3034 +#: sql_help.c:3054 msgid "parser_name" msgstr "nombre_de_parser" -#: sql_help.c:3035 +#: sql_help.c:3055 msgid "source_config" msgstr "config_origen" -#: sql_help.c:3064 +#: sql_help.c:3084 msgid "start_function" msgstr "función_inicio" -#: sql_help.c:3065 +#: sql_help.c:3085 msgid "gettoken_function" msgstr "función_gettoken" -#: sql_help.c:3066 +#: sql_help.c:3086 msgid "end_function" msgstr "función_fin" -#: sql_help.c:3067 +#: sql_help.c:3087 msgid "lextypes_function" msgstr "función_lextypes" -#: sql_help.c:3068 +#: sql_help.c:3088 msgid "headline_function" msgstr "función_headline" -#: sql_help.c:3080 +#: sql_help.c:3100 msgid "init_function" msgstr "función_init" -#: sql_help.c:3081 +#: sql_help.c:3101 msgid "lexize_function" msgstr "función_lexize" -#: sql_help.c:3094 +#: sql_help.c:3114 msgid "from_sql_function_name" msgstr "nombre_de_función_from" -#: sql_help.c:3096 +#: sql_help.c:3116 msgid "to_sql_function_name" msgstr "nombre_de_función_to" -#: sql_help.c:3122 +#: sql_help.c:3142 msgid "referenced_table_name" msgstr "nombre_tabla_referenciada" -#: sql_help.c:3123 +#: sql_help.c:3143 msgid "transition_relation_name" msgstr "nombre_de_relación_de_transición" -#: sql_help.c:3126 +#: sql_help.c:3146 msgid "arguments" msgstr "argumentos" -#: sql_help.c:3178 +#: sql_help.c:3198 msgid "label" msgstr "etiqueta" -#: sql_help.c:3180 +#: sql_help.c:3200 msgid "subtype" msgstr "subtipo" -#: sql_help.c:3181 +#: sql_help.c:3201 msgid "subtype_operator_class" msgstr "clase_de_operador_del_subtipo" -#: sql_help.c:3183 +#: sql_help.c:3203 msgid "canonical_function" msgstr "función_canónica" -#: sql_help.c:3184 +#: sql_help.c:3204 msgid "subtype_diff_function" msgstr "función_diff_del_subtipo" -#: sql_help.c:3185 +#: sql_help.c:3205 msgid "multirange_type_name" msgstr "nombre_de_tipo_de_multirango" -#: sql_help.c:3187 +#: sql_help.c:3207 msgid "input_function" msgstr "función_entrada" -#: sql_help.c:3188 +#: sql_help.c:3208 msgid "output_function" msgstr "función_salida" -#: sql_help.c:3189 +#: sql_help.c:3209 msgid "receive_function" msgstr "función_receive" -#: sql_help.c:3190 +#: sql_help.c:3210 msgid "send_function" msgstr "función_send" -#: sql_help.c:3191 +#: sql_help.c:3211 msgid "type_modifier_input_function" msgstr "función_entrada_del_modificador_de_tipo" -#: sql_help.c:3192 +#: sql_help.c:3212 msgid "type_modifier_output_function" msgstr "función_salida_del_modificador_de_tipo" -#: sql_help.c:3193 +#: sql_help.c:3213 msgid "analyze_function" msgstr "función_analyze" -#: sql_help.c:3194 +#: sql_help.c:3214 msgid "subscript_function" msgstr "función_de_subíndice" -#: sql_help.c:3195 +#: sql_help.c:3215 msgid "internallength" msgstr "largo_interno" -#: sql_help.c:3196 +#: sql_help.c:3216 msgid "alignment" msgstr "alineamiento" -#: sql_help.c:3197 +#: sql_help.c:3217 msgid "storage" msgstr "almacenamiento" -#: sql_help.c:3198 +#: sql_help.c:3218 msgid "like_type" msgstr "como_tipo" -#: sql_help.c:3199 +#: sql_help.c:3219 msgid "category" msgstr "categoría" -#: sql_help.c:3200 +#: sql_help.c:3220 msgid "preferred" msgstr "preferido" -#: sql_help.c:3201 +#: sql_help.c:3221 msgid "default" msgstr "valor_por_omisión" -#: sql_help.c:3202 +#: sql_help.c:3222 msgid "element" msgstr "elemento" -#: sql_help.c:3203 +#: sql_help.c:3223 msgid "delimiter" msgstr "delimitador" -#: sql_help.c:3204 +#: sql_help.c:3224 msgid "collatable" msgstr "ordenable" -#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560 -#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063 +#: sql_help.c:3321 sql_help.c:4008 sql_help.c:4102 sql_help.c:4592 +#: sql_help.c:4695 sql_help.c:4850 sql_help.c:4964 sql_help.c:5095 msgid "with_query" msgstr "consulta_with" -#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585 -#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604 -#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849 -#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082 -#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099 -#: sql_help.c:5107 +#: sql_help.c:3323 sql_help.c:4010 sql_help.c:4611 sql_help.c:4617 +#: sql_help.c:4620 sql_help.c:4624 sql_help.c:4628 sql_help.c:4636 +#: sql_help.c:4869 sql_help.c:4875 sql_help.c:4878 sql_help.c:4882 +#: sql_help.c:4886 sql_help.c:4894 sql_help.c:4966 sql_help.c:5114 +#: sql_help.c:5120 sql_help.c:5123 sql_help.c:5127 sql_help.c:5131 +#: sql_help.c:5139 msgid "alias" msgstr "alias" -#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608 -#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616 -#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865 -#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873 -#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111 -#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119 +#: sql_help.c:3324 sql_help.c:4596 sql_help.c:4638 sql_help.c:4640 +#: sql_help.c:4644 sql_help.c:4646 sql_help.c:4647 sql_help.c:4648 +#: sql_help.c:4700 sql_help.c:4854 sql_help.c:4896 sql_help.c:4898 +#: sql_help.c:4902 sql_help.c:4904 sql_help.c:4905 sql_help.c:4906 +#: sql_help.c:4973 sql_help.c:5099 sql_help.c:5141 sql_help.c:5143 +#: sql_help.c:5147 sql_help.c:5149 sql_help.c:5150 sql_help.c:5151 msgid "from_item" msgstr "item_de_from" -#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941 +#: sql_help.c:3326 sql_help.c:3810 sql_help.c:4159 sql_help.c:4975 msgid "cursor_name" msgstr "nombre_de_cursor" -#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942 +#: sql_help.c:3327 sql_help.c:4016 sql_help.c:4108 sql_help.c:4976 msgid "output_expression" msgstr "expresión_de_salida" -#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665 -#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066 +#: sql_help.c:3328 sql_help.c:4017 sql_help.c:4109 sql_help.c:4595 +#: sql_help.c:4698 sql_help.c:4853 sql_help.c:4977 sql_help.c:5098 msgid "output_name" msgstr "nombre_de_salida" -#: sql_help.c:3324 +#: sql_help.c:3344 msgid "code" msgstr "código" -#: sql_help.c:3729 +#: sql_help.c:3749 msgid "parameter" msgstr "parámetro" -#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152 +#: sql_help.c:3773 sql_help.c:4184 msgid "statement" msgstr "sentencia" -#: sql_help.c:3788 sql_help.c:4126 +#: sql_help.c:3809 sql_help.c:4158 msgid "direction" msgstr "dirección" -#: sql_help.c:3790 sql_help.c:4128 -#| msgid "where option can be one of:" +#: sql_help.c:3811 sql_help.c:4160 msgid "where direction can be one of:" msgstr "donde dirección puede ser una de:" -#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794 -#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131 -#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575 -#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832 -#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078 +#: sql_help.c:3812 sql_help.c:3813 sql_help.c:3814 sql_help.c:3815 +#: sql_help.c:3816 sql_help.c:4161 sql_help.c:4162 sql_help.c:4163 +#: sql_help.c:4164 sql_help.c:4165 sql_help.c:4605 sql_help.c:4607 +#: sql_help.c:4709 sql_help.c:4711 sql_help.c:4863 sql_help.c:4865 +#: sql_help.c:5039 sql_help.c:5041 sql_help.c:5108 sql_help.c:5110 msgid "count" msgstr "cantidad" -#: sql_help.c:3898 sql_help.c:4350 +#: sql_help.c:3919 sql_help.c:4382 msgid "sequence_name" msgstr "nombre_secuencia" -#: sql_help.c:3916 sql_help.c:4368 +#: sql_help.c:3937 sql_help.c:4400 msgid "arg_name" msgstr "nombre_arg" -#: sql_help.c:3917 sql_help.c:4369 +#: sql_help.c:3938 sql_help.c:4401 msgid "arg_type" msgstr "tipo_arg" -#: sql_help.c:3924 sql_help.c:4376 +#: sql_help.c:3945 sql_help.c:4408 msgid "loid" msgstr "loid" -#: sql_help.c:3955 +#: sql_help.c:3976 msgid "remote_schema" msgstr "esquema_remoto" -#: sql_help.c:3958 +#: sql_help.c:3979 msgid "local_schema" msgstr "esquema_local" -#: sql_help.c:3993 +#: sql_help.c:4014 msgid "conflict_target" msgstr "destino_de_conflict" -#: sql_help.c:3994 +#: sql_help.c:4015 msgid "conflict_action" msgstr "acción_de_conflict" -#: sql_help.c:3997 +#: sql_help.c:4018 msgid "where conflict_target can be one of:" msgstr "donde destino_de_conflict puede ser uno de:" -#: sql_help.c:3998 +#: sql_help.c:4019 msgid "index_column_name" msgstr "nombre_de_columna_de_índice" -#: sql_help.c:3999 +#: sql_help.c:4020 msgid "index_expression" msgstr "expresión_de_índice" -#: sql_help.c:4002 +#: sql_help.c:4023 msgid "index_predicate" msgstr "predicado_de_índice" -#: sql_help.c:4004 +#: sql_help.c:4025 msgid "and conflict_action is one of:" msgstr "donde acción_de_conflict es una de:" -#: sql_help.c:4010 sql_help.c:4938 +#: sql_help.c:4031 sql_help.c:4132 sql_help.c:4972 msgid "sub-SELECT" msgstr "sub-SELECT" -#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914 +#: sql_help.c:4040 sql_help.c:4173 sql_help.c:4948 msgid "channel" msgstr "canal" -#: sql_help.c:4041 +#: sql_help.c:4062 msgid "lockmode" msgstr "modo_bloqueo" -#: sql_help.c:4042 +#: sql_help.c:4063 msgid "where lockmode is one of:" msgstr "donde modo_bloqueo es uno de:" -#: sql_help.c:4078 +#: sql_help.c:4103 msgid "target_table_name" msgstr "nombre_de_tabla_destino" -#: sql_help.c:4079 +#: sql_help.c:4104 msgid "target_alias" msgstr "alias_de_destino" -#: sql_help.c:4080 +#: sql_help.c:4105 msgid "data_source" msgstr "origin_de_datos" -#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112 +#: sql_help.c:4106 sql_help.c:4641 sql_help.c:4899 sql_help.c:5144 msgid "join_condition" msgstr "condición_de_join" -#: sql_help.c:4082 +#: sql_help.c:4107 msgid "when_clause" msgstr "cláusula_when" -#: sql_help.c:4083 +#: sql_help.c:4110 msgid "where data_source is:" msgstr "donde origen_de_datos es:" -#: sql_help.c:4084 +#: sql_help.c:4111 msgid "source_table_name" msgstr "nombre_tabla_origen" -#: sql_help.c:4085 +#: sql_help.c:4112 msgid "source_query" msgstr "consulta_origen" -#: sql_help.c:4086 +#: sql_help.c:4113 msgid "source_alias" msgstr "alias_origen" -#: sql_help.c:4087 +#: sql_help.c:4114 msgid "and when_clause is:" msgstr "y cláusula_when es:" -#: sql_help.c:4089 +#: sql_help.c:4116 sql_help.c:4119 msgid "merge_update" msgstr "update_de_merge" -#: sql_help.c:4090 +#: sql_help.c:4117 sql_help.c:4120 msgid "merge_delete" msgstr "delete_de_merge" -#: sql_help.c:4092 +#: sql_help.c:4122 msgid "merge_insert" msgstr "insert_de_merge" -#: sql_help.c:4093 +#: sql_help.c:4123 msgid "and merge_insert is:" msgstr "y insert_de_merge es:" -#: sql_help.c:4096 +#: sql_help.c:4126 msgid "and merge_update is:" msgstr "y update_de_merge es:" -#: sql_help.c:4101 +#: sql_help.c:4133 msgid "and merge_delete is:" msgstr "y delete_de_merge es:" -#: sql_help.c:4142 +#: sql_help.c:4174 msgid "payload" msgstr "carga" -#: sql_help.c:4169 +#: sql_help.c:4201 msgid "old_role" msgstr "rol_antiguo" -#: sql_help.c:4170 +#: sql_help.c:4202 msgid "new_role" msgstr "rol_nuevo" -#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426 +#: sql_help.c:4241 sql_help.c:4450 sql_help.c:4458 msgid "savepoint_name" msgstr "nombre_de_savepoint" -#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881 -#: sql_help.c:5069 sql_help.c:5127 +#: sql_help.c:4598 sql_help.c:4656 sql_help.c:4856 sql_help.c:4914 +#: sql_help.c:5101 sql_help.c:5159 msgid "grouping_element" msgstr "elemento_agrupante" -#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071 +#: sql_help.c:4600 sql_help.c:4704 sql_help.c:4858 sql_help.c:5103 msgid "window_name" msgstr "nombre_de_ventana" -#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072 +#: sql_help.c:4601 sql_help.c:4705 sql_help.c:4859 sql_help.c:5104 msgid "window_definition" msgstr "definición_de_ventana" -#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673 -#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073 -#: sql_help.c:5087 sql_help.c:5131 +#: sql_help.c:4602 sql_help.c:4616 sql_help.c:4660 sql_help.c:4706 +#: sql_help.c:4860 sql_help.c:4874 sql_help.c:4918 sql_help.c:5105 +#: sql_help.c:5119 sql_help.c:5163 msgid "select" msgstr "select" -#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080 +#: sql_help.c:4608 sql_help.c:4866 sql_help.c:5111 +msgid "from_reference" +msgstr "referencia_en_from" + +#: sql_help.c:4609 sql_help.c:4867 sql_help.c:5112 msgid "where from_item can be one of:" msgstr "donde item_de_from puede ser uno de:" -#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593 -#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846 -#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089 -#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108 +#: sql_help.c:4612 sql_help.c:4618 sql_help.c:4621 sql_help.c:4625 +#: sql_help.c:4637 sql_help.c:4870 sql_help.c:4876 sql_help.c:4879 +#: sql_help.c:4883 sql_help.c:4895 sql_help.c:5115 sql_help.c:5121 +#: sql_help.c:5124 sql_help.c:5128 sql_help.c:5140 msgid "column_alias" msgstr "alias_de_columna" -#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084 +#: sql_help.c:4613 sql_help.c:4871 sql_help.c:5116 msgid "sampling_method" msgstr "método_de_sampleo" -#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086 +#: sql_help.c:4615 sql_help.c:4873 sql_help.c:5118 msgid "seed" msgstr "semilla" -#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883 -#: sql_help.c:5090 sql_help.c:5129 +#: sql_help.c:4619 sql_help.c:4658 sql_help.c:4877 sql_help.c:4916 +#: sql_help.c:5122 sql_help.c:5161 msgid "with_query_name" msgstr "nombre_consulta_with" -#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854 -#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103 -#: sql_help.c:5106 +#: sql_help.c:4629 sql_help.c:4632 sql_help.c:4635 sql_help.c:4887 +#: sql_help.c:4890 sql_help.c:4893 sql_help.c:5132 sql_help.c:5135 +#: sql_help.c:5138 msgid "column_definition" msgstr "definición_de_columna" -#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870 -#: sql_help.c:5110 sql_help.c:5116 +#: sql_help.c:4639 sql_help.c:4645 sql_help.c:4897 sql_help.c:4903 +#: sql_help.c:5142 sql_help.c:5148 msgid "join_type" msgstr "tipo_de_join" -#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113 +#: sql_help.c:4642 sql_help.c:4900 sql_help.c:5145 msgid "join_column" msgstr "columna_de_join" -#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114 +#: sql_help.c:4643 sql_help.c:4901 sql_help.c:5146 msgid "join_using_alias" msgstr "join_con_alias" -#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120 +#: sql_help.c:4649 sql_help.c:4907 sql_help.c:5152 msgid "and grouping_element can be one of:" msgstr "donde elemento_agrupante puede ser una de:" -#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128 +#: sql_help.c:4657 sql_help.c:4915 sql_help.c:5160 msgid "and with_query is:" msgstr "y consulta_with es:" -#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132 +#: sql_help.c:4661 sql_help.c:4919 sql_help.c:5164 msgid "values" msgstr "valores" -#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133 +#: sql_help.c:4662 sql_help.c:4920 sql_help.c:5165 msgid "insert" msgstr "insert" -#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134 +#: sql_help.c:4663 sql_help.c:4921 sql_help.c:5166 msgid "update" msgstr "update" -#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135 +#: sql_help.c:4664 sql_help.c:4922 sql_help.c:5167 msgid "delete" msgstr "delete" -#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137 +#: sql_help.c:4665 sql_help.c:4923 sql_help.c:5168 +msgid "merge" +msgstr "merge" + +#: sql_help.c:4667 sql_help.c:4925 sql_help.c:5170 msgid "search_seq_col_name" msgstr "nombre_col_para_sec_de_búsqueda" -#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139 +#: sql_help.c:4669 sql_help.c:4927 sql_help.c:5172 msgid "cycle_mark_col_name" msgstr "nombre_col_para_marca_de_ciclo" -#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140 +#: sql_help.c:4670 sql_help.c:4928 sql_help.c:5173 msgid "cycle_mark_value" msgstr "valor_marca_de_ciclo" -#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141 +#: sql_help.c:4671 sql_help.c:4929 sql_help.c:5174 msgid "cycle_mark_default" msgstr "valor_predet_marca_de_ciclo" -#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142 +#: sql_help.c:4672 sql_help.c:4930 sql_help.c:5175 msgid "cycle_path_col_name" msgstr "nombre_col_para_ruta_de_ciclo" -#: sql_help.c:4666 +#: sql_help.c:4699 msgid "new_table" msgstr "nueva_tabla" -#: sql_help.c:4737 +#: sql_help.c:4770 msgid "snapshot_id" msgstr "id_de_snapshot" -#: sql_help.c:5005 +#: sql_help.c:5037 msgid "sort_expression" msgstr "expresión_orden" -#: sql_help.c:5149 sql_help.c:6133 +#: sql_help.c:5182 sql_help.c:6166 msgid "abort the current transaction" msgstr "aborta la transacción en curso" -#: sql_help.c:5155 +#: sql_help.c:5188 msgid "change the definition of an aggregate function" msgstr "cambia la definición de una función de agregación" -#: sql_help.c:5161 +#: sql_help.c:5194 msgid "change the definition of a collation" msgstr "cambia la definición de un ordenamiento" -#: sql_help.c:5167 +#: sql_help.c:5200 msgid "change the definition of a conversion" msgstr "cambia la definición de una conversión" -#: sql_help.c:5173 +#: sql_help.c:5206 msgid "change a database" msgstr "cambia una base de datos" -#: sql_help.c:5179 +#: sql_help.c:5212 msgid "define default access privileges" msgstr "define privilegios de acceso por omisión" -#: sql_help.c:5185 +#: sql_help.c:5218 msgid "change the definition of a domain" msgstr "cambia la definición de un dominio" -#: sql_help.c:5191 +#: sql_help.c:5224 msgid "change the definition of an event trigger" msgstr "cambia la definición de un disparador por evento" -#: sql_help.c:5197 +#: sql_help.c:5230 msgid "change the definition of an extension" msgstr "cambia la definición de una extensión" -#: sql_help.c:5203 +#: sql_help.c:5236 msgid "change the definition of a foreign-data wrapper" msgstr "cambia la definición de un conector de datos externos" -#: sql_help.c:5209 +#: sql_help.c:5242 msgid "change the definition of a foreign table" msgstr "cambia la definición de una tabla foránea" -#: sql_help.c:5215 +#: sql_help.c:5248 msgid "change the definition of a function" msgstr "cambia la definición de una función" -#: sql_help.c:5221 +#: sql_help.c:5254 msgid "change role name or membership" msgstr "cambiar nombre del rol o membresía" -#: sql_help.c:5227 +#: sql_help.c:5260 msgid "change the definition of an index" msgstr "cambia la definición de un índice" -#: sql_help.c:5233 +#: sql_help.c:5266 msgid "change the definition of a procedural language" msgstr "cambia la definición de un lenguaje procedural" -#: sql_help.c:5239 +#: sql_help.c:5272 msgid "change the definition of a large object" msgstr "cambia la definición de un objeto grande" -#: sql_help.c:5245 +#: sql_help.c:5278 msgid "change the definition of a materialized view" msgstr "cambia la definición de una vista materializada" -#: sql_help.c:5251 +#: sql_help.c:5284 msgid "change the definition of an operator" msgstr "cambia la definición de un operador" -#: sql_help.c:5257 +#: sql_help.c:5290 msgid "change the definition of an operator class" msgstr "cambia la definición de una clase de operadores" -#: sql_help.c:5263 +#: sql_help.c:5296 msgid "change the definition of an operator family" msgstr "cambia la definición de una familia de operadores" -#: sql_help.c:5269 +#: sql_help.c:5302 msgid "change the definition of a row-level security policy" msgstr "cambia la definición de una política de seguridad a nivel de registros" -#: sql_help.c:5275 +#: sql_help.c:5308 msgid "change the definition of a procedure" msgstr "cambia la definición de un procedimiento" -#: sql_help.c:5281 +#: sql_help.c:5314 msgid "change the definition of a publication" msgstr "cambia la definición de una publicación" -#: sql_help.c:5287 sql_help.c:5389 +#: sql_help.c:5320 sql_help.c:5422 msgid "change a database role" msgstr "cambia un rol de la base de datos" -#: sql_help.c:5293 +#: sql_help.c:5326 msgid "change the definition of a routine" msgstr "cambia la definición de una rutina" -#: sql_help.c:5299 +#: sql_help.c:5332 msgid "change the definition of a rule" msgstr "cambia la definición de una regla" -#: sql_help.c:5305 +#: sql_help.c:5338 msgid "change the definition of a schema" msgstr "cambia la definición de un esquema" -#: sql_help.c:5311 +#: sql_help.c:5344 msgid "change the definition of a sequence generator" msgstr "cambia la definición de un generador secuencial" -#: sql_help.c:5317 +#: sql_help.c:5350 msgid "change the definition of a foreign server" msgstr "cambia la definición de un servidor foráneo" -#: sql_help.c:5323 +#: sql_help.c:5356 msgid "change the definition of an extended statistics object" msgstr "cambia la definición de un objeto de estadísticas extendidas" -#: sql_help.c:5329 +#: sql_help.c:5362 msgid "change the definition of a subscription" msgstr "cambia la definición de una suscripción" -#: sql_help.c:5335 +#: sql_help.c:5368 msgid "change a server configuration parameter" msgstr "cambia un parámetro de configuración del servidor" -#: sql_help.c:5341 +#: sql_help.c:5374 msgid "change the definition of a table" msgstr "cambia la definición de una tabla" -#: sql_help.c:5347 +#: sql_help.c:5380 msgid "change the definition of a tablespace" msgstr "cambia la definición de un tablespace" -#: sql_help.c:5353 +#: sql_help.c:5386 msgid "change the definition of a text search configuration" msgstr "cambia la definición de una configuración de búsqueda en texto" -#: sql_help.c:5359 +#: sql_help.c:5392 msgid "change the definition of a text search dictionary" msgstr "cambia la definición de un diccionario de búsqueda en texto" -#: sql_help.c:5365 +#: sql_help.c:5398 msgid "change the definition of a text search parser" msgstr "cambia la definición de un analizador de búsqueda en texto" -#: sql_help.c:5371 +#: sql_help.c:5404 msgid "change the definition of a text search template" msgstr "cambia la definición de una plantilla de búsqueda en texto" -#: sql_help.c:5377 +#: sql_help.c:5410 msgid "change the definition of a trigger" msgstr "cambia la definición de un disparador" -#: sql_help.c:5383 +#: sql_help.c:5416 msgid "change the definition of a type" msgstr "cambia la definición de un tipo" -#: sql_help.c:5395 +#: sql_help.c:5428 msgid "change the definition of a user mapping" msgstr "cambia la definición de un mapeo de usuario" -#: sql_help.c:5401 +#: sql_help.c:5434 msgid "change the definition of a view" msgstr "cambia la definición de una vista" -#: sql_help.c:5407 +#: sql_help.c:5440 msgid "collect statistics about a database" msgstr "recolecta estadísticas sobre una base de datos" -#: sql_help.c:5413 sql_help.c:6211 +#: sql_help.c:5446 sql_help.c:6244 msgid "start a transaction block" msgstr "inicia un bloque de transacción" -#: sql_help.c:5419 +#: sql_help.c:5452 msgid "invoke a procedure" msgstr "invocar un procedimiento" -#: sql_help.c:5425 +#: sql_help.c:5458 msgid "force a write-ahead log checkpoint" msgstr "fuerza un checkpoint de wal" -#: sql_help.c:5431 +#: sql_help.c:5464 msgid "close a cursor" msgstr "cierra un cursor" -#: sql_help.c:5437 +#: sql_help.c:5470 msgid "cluster a table according to an index" msgstr "reordena una tabla siguiendo un índice" -#: sql_help.c:5443 +#: sql_help.c:5476 msgid "define or change the comment of an object" msgstr "define o cambia un comentario sobre un objeto" -#: sql_help.c:5449 sql_help.c:6007 +#: sql_help.c:5482 sql_help.c:6040 msgid "commit the current transaction" msgstr "compromete la transacción en curso" -#: sql_help.c:5455 +#: sql_help.c:5488 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "confirma una transacción que fue preparada para two-phase commit" -#: sql_help.c:5461 +#: sql_help.c:5494 msgid "copy data between a file and a table" msgstr "copia datos entre un archivo y una tabla" -#: sql_help.c:5467 +#: sql_help.c:5500 msgid "define a new access method" msgstr "define un nuevo método de acceso" -#: sql_help.c:5473 +#: sql_help.c:5506 msgid "define a new aggregate function" msgstr "define una nueva función de agregación" -#: sql_help.c:5479 +#: sql_help.c:5512 msgid "define a new cast" msgstr "define una nueva conversión de tipo" -#: sql_help.c:5485 +#: sql_help.c:5518 msgid "define a new collation" msgstr "define un nuevo ordenamiento" -#: sql_help.c:5491 +#: sql_help.c:5524 msgid "define a new encoding conversion" msgstr "define una nueva conversión de codificación" -#: sql_help.c:5497 +#: sql_help.c:5530 msgid "create a new database" msgstr "crea una nueva base de datos" -#: sql_help.c:5503 +#: sql_help.c:5536 msgid "define a new domain" msgstr "define un nuevo dominio" -#: sql_help.c:5509 +#: sql_help.c:5542 msgid "define a new event trigger" msgstr "define un nuevo disparador por evento" -#: sql_help.c:5515 +#: sql_help.c:5548 msgid "install an extension" msgstr "instala una extensión" -#: sql_help.c:5521 +#: sql_help.c:5554 msgid "define a new foreign-data wrapper" msgstr "define un nuevo conector de datos externos" -#: sql_help.c:5527 +#: sql_help.c:5560 msgid "define a new foreign table" msgstr "define una nueva tabla foránea" -#: sql_help.c:5533 +#: sql_help.c:5566 msgid "define a new function" msgstr "define una nueva función" -#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701 +#: sql_help.c:5572 sql_help.c:5632 sql_help.c:5734 msgid "define a new database role" msgstr "define un nuevo rol de la base de datos" -#: sql_help.c:5545 +#: sql_help.c:5578 msgid "define a new index" msgstr "define un nuevo índice" -#: sql_help.c:5551 +#: sql_help.c:5584 msgid "define a new procedural language" msgstr "define un nuevo lenguaje procedural" -#: sql_help.c:5557 +#: sql_help.c:5590 msgid "define a new materialized view" msgstr "define una nueva vista materializada" -#: sql_help.c:5563 +#: sql_help.c:5596 msgid "define a new operator" msgstr "define un nuevo operador" -#: sql_help.c:5569 +#: sql_help.c:5602 msgid "define a new operator class" msgstr "define una nueva clase de operadores" -#: sql_help.c:5575 +#: sql_help.c:5608 msgid "define a new operator family" msgstr "define una nueva familia de operadores" -#: sql_help.c:5581 +#: sql_help.c:5614 msgid "define a new row-level security policy for a table" msgstr "define una nueva política de seguridad a nivel de registros para una tabla" -#: sql_help.c:5587 +#: sql_help.c:5620 msgid "define a new procedure" msgstr "define un nuevo procedimiento" -#: sql_help.c:5593 +#: sql_help.c:5626 msgid "define a new publication" msgstr "define una nueva publicación" -#: sql_help.c:5605 +#: sql_help.c:5638 msgid "define a new rewrite rule" msgstr "define una nueva regla de reescritura" -#: sql_help.c:5611 +#: sql_help.c:5644 msgid "define a new schema" msgstr "define un nuevo esquema" -#: sql_help.c:5617 +#: sql_help.c:5650 msgid "define a new sequence generator" msgstr "define un nuevo generador secuencial" -#: sql_help.c:5623 +#: sql_help.c:5656 msgid "define a new foreign server" msgstr "define un nuevo servidor foráneo" -#: sql_help.c:5629 +#: sql_help.c:5662 msgid "define extended statistics" msgstr "define estadísticas extendidas" -#: sql_help.c:5635 +#: sql_help.c:5668 msgid "define a new subscription" msgstr "define una nueva suscripción" -#: sql_help.c:5641 +#: sql_help.c:5674 msgid "define a new table" msgstr "define una nueva tabla" -#: sql_help.c:5647 sql_help.c:6169 +#: sql_help.c:5680 sql_help.c:6202 msgid "define a new table from the results of a query" msgstr "crea una nueva tabla usando los resultados de una consulta" -#: sql_help.c:5653 +#: sql_help.c:5686 msgid "define a new tablespace" msgstr "define un nuevo tablespace" -#: sql_help.c:5659 +#: sql_help.c:5692 msgid "define a new text search configuration" msgstr "define una nueva configuración de búsqueda en texto" -#: sql_help.c:5665 +#: sql_help.c:5698 msgid "define a new text search dictionary" msgstr "define un nuevo diccionario de búsqueda en texto" -#: sql_help.c:5671 +#: sql_help.c:5704 msgid "define a new text search parser" msgstr "define un nuevo analizador de búsqueda en texto" -#: sql_help.c:5677 +#: sql_help.c:5710 msgid "define a new text search template" msgstr "define una nueva plantilla de búsqueda en texto" -#: sql_help.c:5683 +#: sql_help.c:5716 msgid "define a new transform" msgstr "define una nueva transformación" -#: sql_help.c:5689 +#: sql_help.c:5722 msgid "define a new trigger" msgstr "define un nuevo disparador" -#: sql_help.c:5695 +#: sql_help.c:5728 msgid "define a new data type" msgstr "define un nuevo tipo de datos" -#: sql_help.c:5707 +#: sql_help.c:5740 msgid "define a new mapping of a user to a foreign server" msgstr "define un nuevo mapa de usuario a servidor foráneo" -#: sql_help.c:5713 +#: sql_help.c:5746 msgid "define a new view" msgstr "define una nueva vista" -#: sql_help.c:5719 +#: sql_help.c:5752 msgid "deallocate a prepared statement" msgstr "elimina una sentencia preparada" -#: sql_help.c:5725 +#: sql_help.c:5758 msgid "define a cursor" msgstr "define un nuevo cursor" -#: sql_help.c:5731 +#: sql_help.c:5764 msgid "delete rows of a table" msgstr "elimina filas de una tabla" -#: sql_help.c:5737 +#: sql_help.c:5770 msgid "discard session state" msgstr "descartar datos de la sesión" -#: sql_help.c:5743 +#: sql_help.c:5776 msgid "execute an anonymous code block" msgstr "ejecutar un bloque anónimo de código" -#: sql_help.c:5749 +#: sql_help.c:5782 msgid "remove an access method" msgstr "elimina un método de acceso" -#: sql_help.c:5755 +#: sql_help.c:5788 msgid "remove an aggregate function" msgstr "elimina una función de agregación" -#: sql_help.c:5761 +#: sql_help.c:5794 msgid "remove a cast" msgstr "elimina una conversión de tipo" -#: sql_help.c:5767 +#: sql_help.c:5800 msgid "remove a collation" msgstr "elimina un ordenamiento" -#: sql_help.c:5773 +#: sql_help.c:5806 msgid "remove a conversion" msgstr "elimina una conversión de codificación" -#: sql_help.c:5779 +#: sql_help.c:5812 msgid "remove a database" msgstr "elimina una base de datos" -#: sql_help.c:5785 +#: sql_help.c:5818 msgid "remove a domain" msgstr "elimina un dominio" -#: sql_help.c:5791 +#: sql_help.c:5824 msgid "remove an event trigger" msgstr "elimina un disparador por evento" -#: sql_help.c:5797 +#: sql_help.c:5830 msgid "remove an extension" msgstr "elimina una extensión" -#: sql_help.c:5803 +#: sql_help.c:5836 msgid "remove a foreign-data wrapper" msgstr "elimina un conector de datos externos" -#: sql_help.c:5809 +#: sql_help.c:5842 msgid "remove a foreign table" msgstr "elimina una tabla foránea" -#: sql_help.c:5815 +#: sql_help.c:5848 msgid "remove a function" msgstr "elimina una función" -#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989 +#: sql_help.c:5854 sql_help.c:5920 sql_help.c:6022 msgid "remove a database role" msgstr "elimina un rol de base de datos" -#: sql_help.c:5827 +#: sql_help.c:5860 msgid "remove an index" msgstr "elimina un índice" -#: sql_help.c:5833 +#: sql_help.c:5866 msgid "remove a procedural language" msgstr "elimina un lenguaje procedural" -#: sql_help.c:5839 +#: sql_help.c:5872 msgid "remove a materialized view" msgstr "elimina una vista materializada" -#: sql_help.c:5845 +#: sql_help.c:5878 msgid "remove an operator" msgstr "elimina un operador" -#: sql_help.c:5851 +#: sql_help.c:5884 msgid "remove an operator class" msgstr "elimina una clase de operadores" -#: sql_help.c:5857 +#: sql_help.c:5890 msgid "remove an operator family" msgstr "elimina una familia de operadores" -#: sql_help.c:5863 +#: sql_help.c:5896 msgid "remove database objects owned by a database role" msgstr "elimina objetos de propiedad de un rol de la base de datos" -#: sql_help.c:5869 +#: sql_help.c:5902 msgid "remove a row-level security policy from a table" msgstr "elimina una política de seguridad a nivel de registros de una tabla" -#: sql_help.c:5875 +#: sql_help.c:5908 msgid "remove a procedure" msgstr "elimina un procedimiento" -#: sql_help.c:5881 +#: sql_help.c:5914 msgid "remove a publication" msgstr "elimina una publicación" -#: sql_help.c:5893 +#: sql_help.c:5926 msgid "remove a routine" msgstr "elimina una rutina" -#: sql_help.c:5899 +#: sql_help.c:5932 msgid "remove a rewrite rule" msgstr "elimina una regla de reescritura" -#: sql_help.c:5905 +#: sql_help.c:5938 msgid "remove a schema" msgstr "elimina un esquema" -#: sql_help.c:5911 +#: sql_help.c:5944 msgid "remove a sequence" msgstr "elimina un generador secuencial" -#: sql_help.c:5917 +#: sql_help.c:5950 msgid "remove a foreign server descriptor" msgstr "elimina un descriptor de servidor foráneo" -#: sql_help.c:5923 +#: sql_help.c:5956 msgid "remove extended statistics" msgstr "elimina estadísticas extendidas" -#: sql_help.c:5929 +#: sql_help.c:5962 msgid "remove a subscription" msgstr "elimina una suscripción" -#: sql_help.c:5935 +#: sql_help.c:5968 msgid "remove a table" msgstr "elimina una tabla" -#: sql_help.c:5941 +#: sql_help.c:5974 msgid "remove a tablespace" msgstr "elimina un tablespace" -#: sql_help.c:5947 +#: sql_help.c:5980 msgid "remove a text search configuration" msgstr "elimina una configuración de búsqueda en texto" -#: sql_help.c:5953 +#: sql_help.c:5986 msgid "remove a text search dictionary" msgstr "elimina un diccionario de búsqueda en texto" -#: sql_help.c:5959 +#: sql_help.c:5992 msgid "remove a text search parser" msgstr "elimina un analizador de búsqueda en texto" -#: sql_help.c:5965 +#: sql_help.c:5998 msgid "remove a text search template" msgstr "elimina una plantilla de búsqueda en texto" -#: sql_help.c:5971 +#: sql_help.c:6004 msgid "remove a transform" msgstr "elimina una transformación" -#: sql_help.c:5977 +#: sql_help.c:6010 msgid "remove a trigger" msgstr "elimina un disparador" -#: sql_help.c:5983 +#: sql_help.c:6016 msgid "remove a data type" msgstr "elimina un tipo de datos" -#: sql_help.c:5995 +#: sql_help.c:6028 msgid "remove a user mapping for a foreign server" msgstr "elimina un mapeo de usuario para un servidor remoto" -#: sql_help.c:6001 +#: sql_help.c:6034 msgid "remove a view" msgstr "elimina una vista" -#: sql_help.c:6013 +#: sql_help.c:6046 msgid "execute a prepared statement" msgstr "ejecuta una sentencia preparada" -#: sql_help.c:6019 +#: sql_help.c:6052 msgid "show the execution plan of a statement" msgstr "muestra el plan de ejecución de una sentencia" -#: sql_help.c:6025 +#: sql_help.c:6058 msgid "retrieve rows from a query using a cursor" msgstr "recupera filas de una consulta usando un cursor" -#: sql_help.c:6031 +#: sql_help.c:6064 msgid "define access privileges" msgstr "define privilegios de acceso" -#: sql_help.c:6037 +#: sql_help.c:6070 msgid "import table definitions from a foreign server" msgstr "importa definiciones de tablas desde un servidor foráneo" -#: sql_help.c:6043 +#: sql_help.c:6076 msgid "create new rows in a table" msgstr "crea nuevas filas en una tabla" -#: sql_help.c:6049 +#: sql_help.c:6082 msgid "listen for a notification" msgstr "escucha notificaciones" -#: sql_help.c:6055 +#: sql_help.c:6088 msgid "load a shared library file" msgstr "carga un archivo de biblioteca compartida" -#: sql_help.c:6061 +#: sql_help.c:6094 msgid "lock a table" msgstr "bloquea una tabla" -#: sql_help.c:6067 +#: sql_help.c:6100 msgid "conditionally insert, update, or delete rows of a table" msgstr "condicionalmente inserta, actualiza o elimina filas de una tabla" -#: sql_help.c:6073 +#: sql_help.c:6106 msgid "position a cursor" msgstr "reposiciona un cursor" -#: sql_help.c:6079 +#: sql_help.c:6112 msgid "generate a notification" msgstr "genera una notificación" -#: sql_help.c:6085 +#: sql_help.c:6118 msgid "prepare a statement for execution" msgstr "prepara una sentencia para ejecución" -#: sql_help.c:6091 +#: sql_help.c:6124 msgid "prepare the current transaction for two-phase commit" msgstr "prepara la transacción actual para two-phase commit" -#: sql_help.c:6097 +#: sql_help.c:6130 msgid "change the ownership of database objects owned by a database role" msgstr "cambia de dueño a los objetos de propiedad de un rol de la base de datos" -#: sql_help.c:6103 +#: sql_help.c:6136 msgid "replace the contents of a materialized view" msgstr "reemplaza los contenidos de una vista materializada" -#: sql_help.c:6109 +#: sql_help.c:6142 msgid "rebuild indexes" msgstr "reconstruye índices" -#: sql_help.c:6115 -#| msgid "variable \"%s\" shadows a previously defined variable" +#: sql_help.c:6148 msgid "release a previously defined savepoint" msgstr "libera un “savepoint†definido previamente" -#: sql_help.c:6121 +#: sql_help.c:6154 msgid "restore the value of a run-time parameter to the default value" msgstr "restaura el valor de un parámetro de configuración al valor inicial" -#: sql_help.c:6127 +#: sql_help.c:6160 msgid "remove access privileges" msgstr "revoca privilegios de acceso" -#: sql_help.c:6139 +#: sql_help.c:6172 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "cancela una transacción que fue previamente preparada para two-phase commit" -#: sql_help.c:6145 +#: sql_help.c:6178 msgid "roll back to a savepoint" msgstr "descartar hacia un “savepointâ€" -#: sql_help.c:6151 +#: sql_help.c:6184 msgid "define a new savepoint within the current transaction" msgstr "define un nuevo â€savepoint†en la transacción en curso" -#: sql_help.c:6157 +#: sql_help.c:6190 msgid "define or change a security label applied to an object" msgstr "define o cambia una etiqueta de seguridad sobre un objeto" -#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253 +#: sql_help.c:6196 sql_help.c:6250 sql_help.c:6286 msgid "retrieve rows from a table or view" msgstr "recupera filas desde una tabla o vista" -#: sql_help.c:6175 +#: sql_help.c:6208 msgid "change a run-time parameter" msgstr "cambia un parámetro de configuración" -#: sql_help.c:6181 +#: sql_help.c:6214 msgid "set constraint check timing for the current transaction" msgstr "define el modo de verificación de las restricciones de la transacción en curso" -#: sql_help.c:6187 +#: sql_help.c:6220 msgid "set the current user identifier of the current session" msgstr "define el identificador de usuario actual de la sesión actual" -#: sql_help.c:6193 +#: sql_help.c:6226 msgid "set the session user identifier and the current user identifier of the current session" msgstr "" "define el identificador del usuario de sesión y el identificador\n" "del usuario actual de la sesión en curso" -#: sql_help.c:6199 +#: sql_help.c:6232 msgid "set the characteristics of the current transaction" msgstr "define las características de la transacción en curso" -#: sql_help.c:6205 +#: sql_help.c:6238 msgid "show the value of a run-time parameter" msgstr "muestra el valor de un parámetro de configuración" -#: sql_help.c:6223 +#: sql_help.c:6256 msgid "empty a table or set of tables" msgstr "vacía una tabla o conjunto de tablas" -#: sql_help.c:6229 +#: sql_help.c:6262 msgid "stop listening for a notification" msgstr "deja de escuchar una notificación" -#: sql_help.c:6235 +#: sql_help.c:6268 msgid "update rows of a table" msgstr "actualiza filas de una tabla" -#: sql_help.c:6241 +#: sql_help.c:6274 msgid "garbage-collect and optionally analyze a database" msgstr "recolecta basura y opcionalmente estadísticas sobre una base de datos" -#: sql_help.c:6247 +#: sql_help.c:6280 msgid "compute a set of rows" msgstr "calcula un conjunto de registros" @@ -6474,7 +6541,7 @@ msgstr "se ignoró argumento extra «%s» en línea de órdenes" msgid "could not find own program executable" msgstr "no se pudo encontrar el ejecutable propio" -#: tab-complete.c:6076 +#: tab-complete.c:6216 #, c-format msgid "" "tab completion query failed: %s\n" diff --git a/src/bin/psql/po/fr.po b/src/bin/psql/po/fr.po index d137ae812acae..1d5fb8c7b6ccc 100644 --- a/src/bin/psql/po/fr.po +++ b/src/bin/psql/po/fr.po @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-02-03 22:46+0000\n" -"PO-Revision-Date: 2023-02-05 17:29+0100\n" +"POT-Creation-Date: 2025-02-05 00:48+0000\n" +"PO-Revision-Date: 2025-02-05 09:06+0100\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.5\n" #: ../../../src/common/logging.c:276 #, c-format @@ -42,55 +42,60 @@ msgstr "détail : " msgid "hint: " msgstr "astuce : " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "n'a pas pu identifier le répertoire courant : %m" +msgid "invalid binary \"%s\": %m" +msgstr "binaire « %s » invalide : %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "binaire « %s » invalide" +msgid "could not read binary \"%s\": %m" +msgstr "n'a pas pu lire le binaire « %s » : %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "n'a pas pu lire le binaire « %s »" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "n'a pas pu trouver un « %s » à exécuter" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "n'a pas pu résoudre le chemin « %s » en sa forme absolue : %m" + +#: ../../common/exec.c:382 copy.c:326 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "n'a pas pu exécuter la commande « %s » : %m" + +#: ../../common/exec.c:394 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "n'a pas pu modifier le répertoire par « %s » : %m" +msgid "could not read from command \"%s\": %m" +msgstr "n'a pas pu lire à partir de la commande « %s » : %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:397 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "n'a pas pu lire le lien symbolique « %s » : %m" +msgid "no data was returned by command \"%s\"" +msgstr "aucune donnée n'a été renvoyée par la commande « %s »" -#: ../../common/exec.c:422 +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "échec de %s() : %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: command.c:1372 command.c:3458 command.c:3507 command.c:3632 input.c:225 #: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "mémoire épuisée" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "mémoire épuisée\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" @@ -100,7 +105,7 @@ msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" msgid "could not look up effective user ID %ld: %s" msgstr "n'a pas pu trouver l'identifiant réel %ld de l'utilisateur : %s" -#: ../../common/username.c:45 command.c:575 +#: ../../common/username.c:45 command.c:616 msgid "user does not exist" msgstr "l'utilisateur n'existe pas" @@ -109,41 +114,41 @@ msgstr "l'utilisateur n'existe pas" msgid "user name lookup failure: error code %lu" msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "commande non exécutable" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "commande introuvable" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "le processus fils a quitté avec le code de sortie %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "le processus fils a été terminé par l'exception 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "le processus fils a été terminé par le signal %d : %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "le processus fils a quitté avec un statut %d non reconnu" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Requête d'annulation envoyée\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "N'a pas pu envoyer la requête d'annulation : " @@ -154,291 +159,346 @@ msgid_plural "(%lu rows)" msgstr[0] "(%lu ligne)" msgstr[1] "(%lu lignes)" -#: ../../fe_utils/print.c:3109 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "Interrompu\n" -#: ../../fe_utils/print.c:3173 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "Ne peut pas afficher le contenu de la table : le nombre de cellules %lld est égal à ou dépasse le maximum %lld.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "" "Ne peut pas ajouter l'en-tête au contenu de la table : le nombre de colonnes\n" "%d est dépassé.\n" -#: ../../fe_utils/print.c:3213 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" msgstr "" "Ne peut pas ajouter une cellule au contenu de la table : le nombre total des\n" -"cellules %d est dépassé.\n" +"cellules %lld est dépassé.\n" -#: ../../fe_utils/print.c:3471 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "format de sortie invalide (erreur interne) : %d" -#: ../../fe_utils/psqlscan.l:702 +#: ../../fe_utils/psqlscan.l:732 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "ignore l'expansion récursive de la variable « %s »" -#: ../../port/thread.c:100 ../../port/thread.c:136 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "l'argument de la commande shell contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "le nom de la base contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: ../../port/user.c:43 ../../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "n'a pas pu rechercher l'identifiant de l'utilisateur local %d : %s" -#: ../../port/thread.c:105 ../../port/thread.c:141 +#: ../../port/user.c:48 ../../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "l'utilisateur local dont l'identifiant est %d n'existe pas" -#: command.c:232 +#: command.c:235 #, c-format msgid "invalid command \\%s" msgstr "commande \\%s invalide" -#: command.c:234 +#: command.c:237 #, c-format msgid "Try \\? for help." msgstr "Essayez \\? pour l'aide." -#: command.c:252 +#: command.c:255 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s : argument « %s » supplémentaire ignoré" -#: command.c:304 +#: command.c:307 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "commande \\%s ignorée ; utilisez \\endif ou Ctrl-C pour quitter le bloc \\if courant" -#: command.c:573 +#: command.c:614 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "n'a pas pu obtenir le répertoire principal pour l'identifiant d'utilisateur %ld : %s" -#: command.c:592 +#: command.c:633 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s : n'a pas pu accéder au répertoire « %s » : %m" -#: command.c:617 +#: command.c:657 #, c-format msgid "You are currently not connected to a database.\n" msgstr "Vous n'êtes pas connecté à une base de données.\n" -#: command.c:627 +#: command.c:667 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » à l'adresse « %s » via le port « %s ».\n" -#: command.c:630 +#: command.c:670 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » via le socket dans « %s » via le port « %s ».\n" -#: command.c:636 +#: command.c:676 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » (adresse « %s ») via le port « %s ».\n" -#: command.c:639 +#: command.c:679 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Vous êtes connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » via le port « %s ».\n" -#: command.c:1030 command.c:1125 command.c:2654 +#: command.c:1069 command.c:1170 command.c:2675 #, c-format msgid "no query buffer" msgstr "aucun tampon de requête" -#: command.c:1063 command.c:5491 +#: command.c:1102 command.c:5776 #, c-format msgid "invalid line number: %s" msgstr "numéro de ligne invalide : %s" -#: command.c:1203 +#: command.c:1248 msgid "No changes" msgstr "Aucun changement" -#: command.c:1282 +#: command.c:1333 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s : nom d'encodage invalide ou procédure de conversion introuvable" -#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597 -#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 -#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 -#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 -#: large_obj.c:254 startup.c:304 +#: command.c:1368 command.c:2157 command.c:3454 command.c:3652 command.c:5882 +#: common.c:221 common.c:270 common.c:440 common.c:1142 common.c:1160 +#: common.c:1228 common.c:1340 common.c:1378 common.c:1475 common.c:1541 +#: copy.c:486 copy.c:722 large_obj.c:157 large_obj.c:192 large_obj.c:254 +#: startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1324 +#: command.c:1375 msgid "There is no previous error." msgstr "Il n'y a pas d'erreur précédente." -#: command.c:1437 +#: command.c:1488 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: parenthèse droite manquante" -#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 -#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 +#: command.c:1572 command.c:1691 command.c:1995 command.c:2009 command.c:2028 +#: command.c:2196 command.c:2437 command.c:2642 command.c:2682 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s : argument requis manquant" -#: command.c:1782 +#: command.c:1822 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif : ne peut pas survenir après \\else" -#: command.c:1787 +#: command.c:1827 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif : pas de \\if correspondant" -#: command.c:1851 +#: command.c:1891 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else : ne peut pas survenir après \\else" -#: command.c:1856 +#: command.c:1896 #, c-format msgid "\\else: no matching \\if" msgstr "\\else : pas de \\if correspondant" -#: command.c:1896 +#: command.c:1936 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif : pas de \\if correspondant" -#: command.c:2053 +#: command.c:2092 msgid "Query buffer is empty." msgstr "Le tampon de requête est vide." -#: command.c:2096 +#: command.c:2135 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Saisir le nouveau mot de passe de l'utilisateur « %s » : " -#: command.c:2100 +#: command.c:2139 msgid "Enter it again: " msgstr "Saisir le mot de passe à nouveau : " -#: command.c:2109 +#: command.c:2148 #, c-format msgid "Passwords didn't match." msgstr "Les mots de passe ne sont pas identiques." -#: command.c:2208 +#: command.c:2231 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s : n'a pas pu lire la valeur pour la variable" -#: command.c:2311 +#: command.c:2333 msgid "Query buffer reset (cleared)." msgstr "Le tampon de requête a été effacé." -#: command.c:2333 +#: command.c:2355 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Historique sauvegardé dans le fichier « %s ».\n" -#: command.c:2420 +#: command.c:2442 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s : le nom de la variable d'environnement ne doit pas contenir « = »" -#: command.c:2468 +#: command.c:2490 #, c-format msgid "function name is required" msgstr "le nom de la fonction est requis" -#: command.c:2470 +#: command.c:2492 #, c-format msgid "view name is required" msgstr "le nom de la vue est requis" -#: command.c:2593 +#: command.c:2614 msgid "Timing is on." msgstr "Chronométrage activé." -#: command.c:2595 +#: command.c:2616 msgid "Timing is off." msgstr "Chronométrage désactivé." -#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 -#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 -#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331 -#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 +#: command.c:2702 command.c:2740 command.c:4163 command.c:4166 command.c:4169 +#: command.c:4175 command.c:4177 command.c:4203 command.c:4213 command.c:4225 +#: command.c:4239 command.c:4266 command.c:4324 common.c:77 copy.c:329 +#: copy.c:401 psqlscanslash.l:805 psqlscanslash.l:817 psqlscanslash.l:835 #, c-format msgid "%s: %m" msgstr "%s : %m" -#: command.c:3107 startup.c:243 startup.c:293 +#: command.c:2729 copy.c:388 +#, c-format +msgid "%s: %s" +msgstr "%s : %s" + +#: command.c:2801 command.c:2867 +#, c-format +msgid "\\watch: interval value is specified more than once" +msgstr "\\watch : la valeur d'intervalle est spécifiée plus d'une fois" + +#: command.c:2811 command.c:2877 +#, c-format +msgid "\\watch: incorrect interval value \"%s\"" +msgstr "\\watch : valeur d'intervalle incorrecte « %s »" + +#: command.c:2821 +#, c-format +msgid "\\watch: iteration count is specified more than once" +msgstr "\\watch: le nombre d'itération est spécifié plus d'une fois" + +#: command.c:2831 +#, c-format +msgid "\\watch: incorrect iteration count \"%s\"" +msgstr "\\watch : nombre d'itération incorrect « %s »" + +#: command.c:2841 +#, c-format +msgid "\\watch: minimum row count specified more than once" +msgstr "\\watch: nombre de lignes minimum spécifié plus d'une fois" + +#: command.c:2851 +#, c-format +msgid "\\watch: incorrect minimum row count \"%s\"" +msgstr "\\watch : nombre de lignes minimum incorrect « %s »" + +#: command.c:2858 +#, c-format +msgid "\\watch: unrecognized parameter \"%s\"" +msgstr "\\watch : paramètre « %s » non reconnu" + +#: command.c:3255 startup.c:243 startup.c:293 msgid "Password: " msgstr "Mot de passe : " -#: command.c:3112 startup.c:290 +#: command.c:3260 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Mot de passe pour l'utilisateur %s : " -#: command.c:3168 +#: command.c:3316 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "Ne pas donner utilisateur, hôte ou port lors de l'utilisation d'une chaîne de connexion" -#: command.c:3203 +#: command.c:3351 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "Aucune connexion de base existante pour réutiliser ses paramètres" -#: command.c:3511 +#: command.c:3658 #, c-format msgid "Previous connection kept" msgstr "Connexion précédente conservée" -#: command.c:3517 +#: command.c:3664 #, c-format msgid "\\connect: %s" msgstr "\\connect : %s" -#: command.c:3573 +#: command.c:3720 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » à l'adresse « %s » via le port « %s ».\n" -#: command.c:3576 +#: command.c:3723 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » via le socket dans « %s » via le port « %s ».\n" -#: command.c:3582 +#: command.c:3729 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » (adresse « %s » ) via le port « %s ».\n" -#: command.c:3585 +#: command.c:3732 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s » sur l'hôte « %s » via le port « %s ».\n" -#: command.c:3590 +#: command.c:3737 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Vous êtes maintenant connecté à la base de données « %s » en tant qu'utilisateur « %s ».\n" -#: command.c:3630 +#: command.c:3843 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, serveur %s)\n" -#: command.c:3643 +#: command.c:3856 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -447,29 +507,33 @@ msgstr "" "ATTENTION : %s version majeure %s, version majeure du serveur %s.\n" " Certaines fonctionnalités de psql pourraient ne pas fonctionner.\n" -#: command.c:3680 +#: command.c:3895 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" -msgstr "Connexion SSL (protocole : %s, chiffrement : %s, compression : %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s, ALPN: %s)\n" +msgstr "Connexion SSL (protocole : %s, chiffrement : %s, compression : %s, ALPN : %s)\n" -#: command.c:3681 command.c:3682 +#: command.c:3896 command.c:3897 msgid "unknown" msgstr "inconnu" -#: command.c:3683 help.c:42 +#: command.c:3898 help.c:42 msgid "off" msgstr "désactivé" -#: command.c:3683 help.c:42 +#: command.c:3898 help.c:42 msgid "on" msgstr "activé" -#: command.c:3697 +#: command.c:3899 +msgid "none" +msgstr "aucun" + +#: command.c:3913 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "connexion chiffrée avec GSSAPI\n" -#: command.c:3717 +#: command.c:3933 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -481,274 +545,289 @@ msgstr "" " Voir la section « Notes aux utilisateurs de Windows » de la page\n" " référence de psql pour les détails.\n" -#: command.c:3822 +#: command.c:4038 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "la variable d'environnement PSQL_EDITOR_LINENUMBER_ARG doit être définie avec un numéro de ligne" -#: command.c:3851 +#: command.c:4068 #, c-format msgid "could not start editor \"%s\"" msgstr "n'a pas pu exécuter l'éditeur « %s »" -#: command.c:3853 +#: command.c:4070 #, c-format msgid "could not start /bin/sh" msgstr "n'a pas pu exécuter /bin/sh" -#: command.c:3903 +#: command.c:4120 #, c-format msgid "could not locate temporary directory: %s" msgstr "n'a pas pu localiser le répertoire temporaire : %s" -#: command.c:3930 +#: command.c:4147 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "n'a pas pu ouvrir le fichier temporaire « %s » : %m" -#: command.c:4266 +#: command.c:4483 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" -msgstr "\\pset: abréviation ambigüe : « %s » correspond à « %s » comme à « %s »" +msgstr "\\pset: abréviation ambiguë : « %s » correspond à « %s » comme à « %s »" -#: command.c:4286 +#: command.c:4503 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset : les formats autorisés sont aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:4305 +#: command.c:4522 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: les styles de lignes autorisés sont ascii, old-ascii, unicode" -#: command.c:4320 +#: command.c:4537 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset : les styles autorisés de ligne de bordure Unicode sont single, double" -#: command.c:4335 +#: command.c:4552 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset : les styles autorisés pour la ligne de colonne Unicode sont single, double" -#: command.c:4350 +#: command.c:4567 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset : les styles autorisés pour la ligne d'en-tête Unicode sont single, double" -#: command.c:4393 +#: command.c:4619 +#, c-format +msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width" +msgstr "\\pset: les valeurs acceptées pour xheader_width sont « %s » (par défaut), « %s », « %s » ou un nombre indiquant la largeur exacte" + +#: command.c:4636 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep doit être un unique caractère d'un octet" -#: command.c:4398 +#: command.c:4641 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldsep ne peut pas être un guillemet, un retour à la ligne ou un retour chariot" -#: command.c:4535 command.c:4723 +#: command.c:4779 command.c:4980 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset : option inconnue : %s" -#: command.c:4555 +#: command.c:4799 #, c-format msgid "Border style is %d.\n" msgstr "Le style de bordure est %d.\n" -#: command.c:4561 +#: command.c:4805 #, c-format msgid "Target width is unset.\n" msgstr "La largeur cible n'est pas configuré.\n" -#: command.c:4563 +#: command.c:4807 #, c-format msgid "Target width is %d.\n" msgstr "La largeur cible est %d.\n" -#: command.c:4570 +#: command.c:4814 #, c-format msgid "Expanded display is on.\n" msgstr "Affichage étendu activé.\n" -#: command.c:4572 +#: command.c:4816 #, c-format msgid "Expanded display is used automatically.\n" msgstr "L'affichage étendu est utilisé automatiquement.\n" -#: command.c:4574 +#: command.c:4818 #, c-format msgid "Expanded display is off.\n" msgstr "Affichage étendu désactivé.\n" -#: command.c:4580 +#: command.c:4825 command.c:4827 command.c:4829 +#, c-format +msgid "Expanded header width is \"%s\".\n" +msgstr "La largeur étendue de l'entête est « %s ».\n" + +#: command.c:4831 +#, c-format +msgid "Expanded header width is %d.\n" +msgstr "La largeur étendue de l'entête est %d.\n" + +#: command.c:4837 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Le séparateur de champs pour un CSV est « %s ».\n" -#: command.c:4588 command.c:4596 +#: command.c:4845 command.c:4853 #, c-format msgid "Field separator is zero byte.\n" msgstr "Le séparateur de champs est l'octet zéro.\n" -#: command.c:4590 +#: command.c:4847 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Le séparateur de champs est « %s ».\n" -#: command.c:4603 +#: command.c:4860 #, c-format msgid "Default footer is on.\n" msgstr "Le bas de page pas défaut est activé.\n" -#: command.c:4605 +#: command.c:4862 #, c-format msgid "Default footer is off.\n" msgstr "Le bas de page par défaut est désactivé.\n" -#: command.c:4611 +#: command.c:4868 #, c-format msgid "Output format is %s.\n" msgstr "Le format de sortie est %s.\n" -#: command.c:4617 +#: command.c:4874 #, c-format msgid "Line style is %s.\n" msgstr "Le style de ligne est %s.\n" -#: command.c:4624 +#: command.c:4881 #, c-format msgid "Null display is \"%s\".\n" msgstr "L'affichage de null est « %s ».\n" -#: command.c:4632 +#: command.c:4889 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "L'affichage de la sortie numérique adaptée à la locale est activé.\n" -#: command.c:4634 +#: command.c:4891 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "L'affichage de la sortie numérique adaptée à la locale est désactivé.\n" -#: command.c:4641 +#: command.c:4898 #, c-format msgid "Pager is used for long output.\n" msgstr "Le paginateur est utilisé pour les affichages longs.\n" -#: command.c:4643 +#: command.c:4900 #, c-format msgid "Pager is always used.\n" msgstr "Le paginateur est toujours utilisé.\n" -#: command.c:4645 +#: command.c:4902 #, c-format msgid "Pager usage is off.\n" msgstr "L'utilisation du paginateur est désactivé.\n" -#: command.c:4651 +#: command.c:4908 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "Le paginateur ne sera pas utilisé pour moins que %d ligne.\n" msgstr[1] "Le paginateur ne sera pas utilisé pour moins que %d lignes.\n" -#: command.c:4661 command.c:4671 +#: command.c:4918 command.c:4928 #, c-format msgid "Record separator is zero byte.\n" msgstr "Le séparateur d'enregistrements est l'octet zéro.\n" -#: command.c:4663 +#: command.c:4920 #, c-format msgid "Record separator is .\n" msgstr "Le séparateur d'enregistrement est .\n" -#: command.c:4665 +#: command.c:4922 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Le séparateur d'enregistrements est « %s ».\n" -#: command.c:4678 +#: command.c:4935 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Les attributs de la table sont « %s ».\n" -#: command.c:4681 +#: command.c:4938 #, c-format msgid "Table attributes unset.\n" msgstr "Les attributs de la table ne sont pas définis.\n" -#: command.c:4688 +#: command.c:4945 #, c-format msgid "Title is \"%s\".\n" msgstr "Le titre est « %s ».\n" -#: command.c:4690 +#: command.c:4947 #, c-format msgid "Title is unset.\n" msgstr "Le titre n'est pas défini.\n" -#: command.c:4697 +#: command.c:4954 #, c-format msgid "Tuples only is on.\n" msgstr "L'affichage des tuples seuls est activé.\n" -#: command.c:4699 +#: command.c:4956 #, c-format msgid "Tuples only is off.\n" msgstr "L'affichage des tuples seuls est désactivé.\n" -#: command.c:4705 +#: command.c:4962 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Le style de bordure Unicode est « %s ».\n" -#: command.c:4711 +#: command.c:4968 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Le style de ligne Unicode est « %s ».\n" -#: command.c:4717 +#: command.c:4974 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Le style d'en-tête Unicode est « %s ».\n" -#: command.c:4950 +#: command.c:5223 #, c-format msgid "\\!: failed" msgstr "\\! : échec" -#: command.c:4984 +#: command.c:5261 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch ne peut pas être utilisé avec une requête vide" -#: command.c:5016 +#: command.c:5293 #, c-format msgid "could not set timer: %m" msgstr "n'a pas pu configurer le chronomètre : %m" -#: command.c:5078 +#: command.c:5362 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (chaque %gs)\n" -#: command.c:5081 +#: command.c:5365 #, c-format msgid "%s (every %gs)\n" msgstr "%s (chaque %gs)\n" -#: command.c:5142 +#: command.c:5429 #, c-format msgid "could not wait for signals: %m" msgstr "n'a pas pu attendre le signal : %m" -#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063 +#: command.c:5485 command.c:5492 common.c:632 common.c:639 common.c:1123 #, c-format msgid "" -"********* QUERY **********\n" +"/******** QUERY *********/\n" "%s\n" -"**************************\n" +"/************************/\n" "\n" msgstr "" "******** REQUÊTE *********\n" @@ -756,147 +835,152 @@ msgstr "" "**************************\n" "\n" -#: command.c:5386 +#: command.c:5671 #, c-format msgid "\"%s.%s\" is not a view" msgstr "« %s.%s » n'est pas une vue" -#: command.c:5402 +#: command.c:5687 #, c-format msgid "could not parse reloptions array" msgstr "n'a pas pu analyser le tableau reloptions" -#: common.c:166 +#: common.c:206 #, c-format msgid "cannot escape without active connection" msgstr "ne peut mettre entre guillemets sans connexion active" -#: common.c:207 +#: common.c:247 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "l'argument de la commande shell contient un retour à la ligne ou un retour chariot : « %s »" -#: common.c:311 +#: common.c:351 #, c-format msgid "connection to server was lost" msgstr "la connexion au serveur a été perdue" -#: common.c:315 +#: common.c:355 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "La connexion au serveur a été perdue. Tentative de réinitialisation : " -#: common.c:320 +#: common.c:360 #, c-format msgid "Failed.\n" msgstr "Échec.\n" -#: common.c:337 +#: common.c:377 #, c-format msgid "Succeeded.\n" msgstr "Succès.\n" -#: common.c:389 common.c:1001 +#: common.c:430 common.c:1061 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "PQresultStatus inattendu : %d" -#: common.c:511 +#: common.c:571 #, c-format msgid "Time: %.3f ms\n" msgstr "Temps : %.3f ms\n" -#: common.c:526 +#: common.c:586 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Durée : %.3f ms (%02d:%06.3f)\n" -#: common.c:535 +#: common.c:595 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Durée : %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:542 +#: common.c:602 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Durée : %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:566 common.c:623 common.c:1034 describe.c:6135 +#: common.c:626 common.c:683 common.c:1094 describe.c:6192 #, c-format msgid "You are currently not connected to a database." msgstr "Vous n'êtes pas connecté à une base de données." -#: common.c:654 +#: common.c:714 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "" "Notification asynchrone « %s » reçue avec le contenu « %s » en provenance du\n" "processus serveur de PID %d.\n" -#: common.c:657 +#: common.c:717 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "" "Notification asynchrone « %s » reçue en provenance du processus serveur de\n" "PID %d.\n" -#: common.c:688 +#: common.c:748 #, c-format msgid "could not print result table: %m" msgstr "n'a pas pu imprimer la table résultante : %m" -#: common.c:708 +#: common.c:768 #, c-format msgid "no rows returned for \\gset" msgstr "aucune ligne retournée pour \\gset" -#: common.c:713 +#: common.c:773 #, c-format msgid "more than one row returned for \\gset" msgstr "plus d'une ligne retournée pour \\gset" -#: common.c:731 +#: common.c:791 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "tentative ignorée d'utilisation de \\gset dans une variable traitée spécialement « %s »" -#: common.c:1043 +#: common.c:1103 #, c-format msgid "" -"***(Single step mode: verify command)*******************************************\n" +"/**(Single step mode: verify command)******************************************/\n" "%s\n" -"***(press return to proceed or enter x and return to cancel)********************\n" +"/**(press return to proceed or enter x and return to cancel)*******************/\n" msgstr "" "***(Mode étape par étape: vérifiez la commande)*********************************\n" "%s\n" "***(appuyez sur entrée pour l'exécuter ou tapez x puis entrée pour annuler)***\n" -#: common.c:1126 +#: common.c:1180 #, c-format msgid "STATEMENT: %s" msgstr "INSTRUCTION : %s" -#: common.c:1162 +#: common.c:1216 #, c-format msgid "unexpected transaction status (%d)" msgstr "état de la transaction inattendu (%d)" -#: common.c:1303 describe.c:2020 +#: common.c:1362 describe.c:2025 msgid "Column" msgstr "Colonne" -#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 -#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 -#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 -#: describe.c:5767 +#: common.c:1363 describe.c:169 describe.c:355 describe.c:373 describe.c:1043 +#: describe.c:1201 describe.c:1731 describe.c:1755 describe.c:2026 +#: describe.c:3956 describe.c:4167 describe.c:4404 describe.c:4564 +#: describe.c:5829 msgid "Type" msgstr "Type" -#: common.c:1353 +#: common.c:1412 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "La commande n'a pas de résultats ou le résultat n'a pas de colonnes.\n" +#: common.c:1504 +#, c-format +msgid "fetching results in chunked mode failed" +msgstr "échec de la récupération des résultats en mode par morceau" + #: copy.c:98 #, c-format msgid "\\copy: arguments required" @@ -912,46 +996,36 @@ msgstr "\\copy : erreur d'analyse sur « %s »" msgid "\\copy: parse error at end of line" msgstr "\\copy : erreur d'analyse à la fin de la ligne" -#: copy.c:328 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "n'a pas pu exécuter la commande « %s » : %m" - -#: copy.c:344 +#: copy.c:342 #, c-format msgid "could not stat file \"%s\": %m" msgstr "n'a pas pu tester le fichier « %s » : %m" -#: copy.c:348 +#: copy.c:346 #, c-format msgid "%s: cannot copy from/to a directory" msgstr "%s : ne peut pas copier depuis/vers un répertoire" -#: copy.c:385 +#: copy.c:383 #, c-format msgid "could not close pipe to external command: %m" msgstr "n'a pas pu fermer le fichier pipe vers la commande externe : %m" -#: copy.c:390 -#, c-format -msgid "%s: %s" -msgstr "%s : %s" - -#: copy.c:453 copy.c:463 +#: copy.c:451 copy.c:461 #, c-format msgid "could not write COPY data: %m" msgstr "n'a pas pu écrire les données du COPY : %m" -#: copy.c:469 +#: copy.c:467 #, c-format msgid "COPY data transfer failed: %s" msgstr "Échec du transfert de données COPY : %s" -#: copy.c:530 +#: copy.c:528 msgid "canceled by user" msgstr "annulé par l'utilisateur" -#: copy.c:541 +#: copy.c:539 msgid "" "Enter data to be copied followed by a newline.\n" "End with a backslash and a period on a line by itself, or an EOF signal." @@ -967,778 +1041,775 @@ msgstr "annulé du fait d'une erreur de lecture" msgid "trying to exit copy mode" msgstr "tente de sortir du mode copy" -#: crosstabview.c:123 +#: crosstabview.c:124 #, c-format msgid "\\crosstabview: statement did not return a result set" msgstr "\\crosstabview : la commande n'a pas retourné d'ensemble de résultats" -#: crosstabview.c:129 +#: crosstabview.c:130 #, c-format msgid "\\crosstabview: query must return at least three columns" msgstr "\\crosstabview : la requête doit renvoyer au moins trois colonnes" -#: crosstabview.c:156 +#: crosstabview.c:157 #, c-format msgid "\\crosstabview: vertical and horizontal headers must be different columns" msgstr "\\crosstabview : les en-têtes horizontales et verticales doivent être des colonnes différentes" -#: crosstabview.c:172 +#: crosstabview.c:173 #, c-format msgid "\\crosstabview: data column must be specified when query returns more than three columns" msgstr "\\crosstabview : la colonne de données doit être spécifiée quand la requête retourne plus de trois colonnes" -#: crosstabview.c:228 +#: crosstabview.c:229 #, c-format msgid "\\crosstabview: maximum number of columns (%d) exceeded" msgstr "\\crosstabview : nombre maximum de colonnes (%d) dépassé" -#: crosstabview.c:397 +#: crosstabview.c:398 #, c-format msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" msgstr "\\crosstabview : le résultat de la requête contient plusieurs valeurs de données pour la ligne « %s », colonne « %s »" -#: crosstabview.c:645 +#: crosstabview.c:646 #, c-format msgid "\\crosstabview: column number %d is out of range 1..%d" msgstr "\\crosstabview : le numéro de colonne %d est en dehors des limites 1..%d" -#: crosstabview.c:670 +#: crosstabview.c:671 #, c-format msgid "\\crosstabview: ambiguous column name: \"%s\"" msgstr "\\crosstabview : nom de colonne ambigu : « %s »" -#: crosstabview.c:678 +#: crosstabview.c:679 #, c-format msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview : nom de colonne non trouvé : « %s »" -#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 -#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 -#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 -#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 -#: describe.c:5477 describe.c:5881 describe.c:5959 +#: describe.c:87 describe.c:335 describe.c:626 describe.c:802 describe.c:1035 +#: describe.c:1190 describe.c:1264 describe.c:3945 describe.c:4154 +#: describe.c:4402 describe.c:4483 describe.c:4715 describe.c:4921 +#: describe.c:5165 describe.c:5406 describe.c:5475 describe.c:5486 +#: describe.c:5542 describe.c:5941 describe.c:6018 msgid "Schema" msgstr "Schéma" -#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 -#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 -#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 -#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 -#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 -#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 -#: describe.c:5957 describe.c:6186 describe.c:6494 +#: describe.c:88 describe.c:166 describe.c:227 describe.c:336 describe.c:627 +#: describe.c:803 describe.c:924 describe.c:1036 describe.c:1265 +#: describe.c:3946 describe.c:4155 describe.c:4319 describe.c:4403 +#: describe.c:4484 describe.c:4645 describe.c:4716 describe.c:4922 +#: describe.c:5038 describe.c:5166 describe.c:5407 describe.c:5476 +#: describe.c:5487 describe.c:5543 describe.c:5740 describe.c:5810 +#: describe.c:6016 describe.c:6243 describe.c:6551 msgid "Name" msgstr "Nom" -#: describe.c:89 describe.c:351 describe.c:369 +#: describe.c:89 describe.c:348 describe.c:366 msgid "Result data type" msgstr "Type de données du résultat" -#: describe.c:90 describe.c:352 describe.c:370 +#: describe.c:90 describe.c:349 describe.c:367 msgid "Argument data types" msgstr "Type de données des paramètres" -#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 -#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 -#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 -#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 -#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 -#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 -#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 -#: describe.c:5960 describe.c:6992 +#: describe.c:98 describe.c:105 describe.c:177 describe.c:241 describe.c:415 +#: describe.c:658 describe.c:818 describe.c:972 describe.c:1267 describe.c:2046 +#: describe.c:3676 describe.c:4000 describe.c:4201 describe.c:4343 +#: describe.c:4416 describe.c:4493 describe.c:4658 describe.c:4834 +#: describe.c:4975 describe.c:5047 describe.c:5167 describe.c:5317 +#: describe.c:5358 describe.c:5423 describe.c:5479 describe.c:5488 +#: describe.c:5544 describe.c:5758 describe.c:5832 describe.c:5955 +#: describe.c:6019 describe.c:7078 msgid "Description" msgstr "Description" -#: describe.c:128 +#: describe.c:127 msgid "List of aggregate functions" msgstr "Liste des fonctions d'agrégation" -#: describe.c:153 +#: describe.c:152 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Le serveur (version %s) ne supporte pas les méthodes d'accès." -#: describe.c:168 +#: describe.c:167 msgid "Index" msgstr "Index" -#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 +#: describe.c:168 describe.c:3964 describe.c:4180 describe.c:5942 msgid "Table" msgstr "Table" -#: describe.c:177 describe.c:5679 +#: describe.c:176 describe.c:5742 msgid "Handler" msgstr "Gestionnaire" -#: describe.c:201 +#: describe.c:199 msgid "List of access methods" msgstr "Liste des méthodes d'accès" -#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 -#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 -#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 -#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 -#: describe.c:6980 +#: describe.c:228 describe.c:401 describe.c:651 describe.c:925 describe.c:1189 +#: describe.c:3957 describe.c:4156 describe.c:4320 describe.c:4647 +#: describe.c:5039 describe.c:5741 describe.c:5811 describe.c:6244 +#: describe.c:6431 describe.c:6552 describe.c:6722 describe.c:6807 +#: describe.c:7066 msgid "Owner" msgstr "Propriétaire" -#: describe.c:231 +#: describe.c:229 msgid "Location" msgstr "Emplacement" -#: describe.c:241 describe.c:3509 +#: describe.c:239 describe.c:3517 describe.c:3857 msgid "Options" msgstr "Options" -#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 +#: describe.c:240 describe.c:649 describe.c:970 describe.c:3999 msgid "Size" msgstr "Taille" -#: describe.c:266 +#: describe.c:263 msgid "List of tablespaces" msgstr "Liste des tablespaces" -#: describe.c:311 +#: describe.c:308 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df ne prend que [anptwS+] comme options" -#: describe.c:319 +#: describe.c:316 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df ne prend pas d'option « %c » pour un serveur en version %s" #. translator: "agg" is short for "aggregate" -#: describe.c:354 describe.c:372 +#: describe.c:351 describe.c:369 msgid "agg" msgstr "agg" -#: describe.c:355 describe.c:373 +#: describe.c:352 describe.c:370 msgid "window" msgstr "window" -#: describe.c:356 +#: describe.c:353 msgid "proc" msgstr "proc" -#: describe.c:357 describe.c:375 +#: describe.c:354 describe.c:372 msgid "func" msgstr "func" -#: describe.c:374 describe.c:1390 +#: describe.c:371 describe.c:1397 msgid "trigger" msgstr "trigger" -#: describe.c:386 +#: describe.c:383 msgid "immutable" msgstr "immutable" -#: describe.c:387 +#: describe.c:384 msgid "stable" msgstr "stable" -#: describe.c:388 +#: describe.c:385 msgid "volatile" msgstr "volatile" -#: describe.c:389 +#: describe.c:386 msgid "Volatility" msgstr "Volatibilité" -#: describe.c:397 +#: describe.c:394 msgid "restricted" msgstr "restricted" -#: describe.c:398 +#: describe.c:395 msgid "safe" msgstr "safe" -#: describe.c:399 +#: describe.c:396 msgid "unsafe" msgstr "unsafe" -#: describe.c:400 +#: describe.c:397 msgid "Parallel" msgstr "Parallèle" -#: describe.c:405 +#: describe.c:402 msgid "definer" msgstr "definer" -#: describe.c:406 +#: describe.c:403 msgid "invoker" msgstr "invoker" -#: describe.c:407 +#: describe.c:404 msgid "Security" msgstr "Sécurité" -#: describe.c:412 +#: describe.c:409 msgid "Language" msgstr "Langage" -#: describe.c:416 describe.c:420 -msgid "Source code" -msgstr "Code source" +#: describe.c:412 describe.c:648 +msgid "Internal name" +msgstr "Nom interne" -#: describe.c:594 +#: describe.c:585 msgid "List of functions" msgstr "Liste des fonctions" -#: describe.c:657 -msgid "Internal name" -msgstr "Nom interne" - -#: describe.c:659 +#: describe.c:650 msgid "Elements" msgstr "Éléments" -#: describe.c:711 +#: describe.c:701 msgid "List of data types" msgstr "Liste des types de données" -#: describe.c:814 +#: describe.c:804 msgid "Left arg type" msgstr "Type de l'arg. gauche" -#: describe.c:815 +#: describe.c:805 msgid "Right arg type" msgstr "Type de l'arg. droit" -#: describe.c:816 +#: describe.c:806 msgid "Result type" msgstr "Type du résultat" -#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 -#: describe.c:6909 describe.c:6913 +#: describe.c:811 describe.c:4653 describe.c:4817 describe.c:5316 +#: describe.c:6996 describe.c:7000 msgid "Function" msgstr "Fonction" -#: describe.c:902 +#: describe.c:891 msgid "List of operators" msgstr "Liste des opérateurs" -#: describe.c:938 +#: describe.c:926 msgid "Encoding" msgstr "Encodage" -#: describe.c:939 describe.c:4868 +#: describe.c:930 describe.c:934 +msgid "Locale Provider" +msgstr "Fournisseur de locale" + +#: describe.c:938 describe.c:4936 msgid "Collate" msgstr "Collationnement" -#: describe.c:940 describe.c:4869 +#: describe.c:939 describe.c:4937 msgid "Ctype" msgstr "Type caract." -#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 -msgid "ICU Locale" -msgstr "Locale ICU" +#: describe.c:943 describe.c:947 describe.c:951 describe.c:4942 describe.c:4946 +#: describe.c:4950 +msgid "Locale" +msgstr "Locale" -#: describe.c:946 describe.c:952 -msgid "Locale Provider" -msgstr "Fournisseur de locale" +#: describe.c:955 describe.c:959 describe.c:4955 describe.c:4959 +msgid "ICU Rules" +msgstr "Règles ICU :" -#: describe.c:964 +#: describe.c:971 msgid "Tablespace" msgstr "Tablespace" -#: describe.c:990 +#: describe.c:996 msgid "List of databases" msgstr "Liste des bases de données" -#: describe.c:1031 describe.c:1184 describe.c:3882 +#: describe.c:1037 describe.c:1192 describe.c:3947 msgid "table" msgstr "table" -#: describe.c:1032 describe.c:3883 +#: describe.c:1038 describe.c:3948 msgid "view" msgstr "vue" -#: describe.c:1033 describe.c:3884 +#: describe.c:1039 describe.c:3949 msgid "materialized view" msgstr "vue matérialisée" -#: describe.c:1034 describe.c:1186 describe.c:3886 +#: describe.c:1040 describe.c:1194 describe.c:3951 msgid "sequence" msgstr "séquence" -#: describe.c:1035 describe.c:3888 +#: describe.c:1041 describe.c:3953 msgid "foreign table" msgstr "table distante" -#: describe.c:1036 describe.c:3889 describe.c:4101 +#: describe.c:1042 describe.c:3954 describe.c:4165 msgid "partitioned table" msgstr "table partitionnée" -#: describe.c:1047 +#: describe.c:1058 msgid "Column privileges" msgstr "Droits d'accès à la colonne" -#: describe.c:1078 describe.c:1112 +#: describe.c:1089 describe.c:1123 msgid "Policies" msgstr "Politiques" -#: describe.c:1143 describe.c:4510 describe.c:6577 +#: describe.c:1151 describe.c:4570 describe.c:6667 msgid "Access privileges" msgstr "Droits d'accès" -#: describe.c:1188 +#: describe.c:1196 msgid "function" msgstr "fonction" -#: describe.c:1190 +#: describe.c:1198 msgid "type" msgstr "type" -#: describe.c:1192 +#: describe.c:1200 msgid "schema" msgstr "schéma" -#: describe.c:1215 +#: describe.c:1222 msgid "Default access privileges" msgstr "Droits d'accès par défaut" -#: describe.c:1259 +#: describe.c:1266 msgid "Object" msgstr "Objet" -#: describe.c:1273 +#: describe.c:1280 msgid "table constraint" msgstr "contrainte de table" -#: describe.c:1297 +#: describe.c:1304 msgid "domain constraint" msgstr "contrainte de domaine" -#: describe.c:1321 +#: describe.c:1328 msgid "operator class" msgstr "classe d'opérateur" -#: describe.c:1345 +#: describe.c:1352 msgid "operator family" msgstr "famille d'opérateur" -#: describe.c:1368 +#: describe.c:1375 msgid "rule" msgstr "règle" -#: describe.c:1414 +#: describe.c:1420 msgid "Object descriptions" msgstr "Descriptions des objets" -#: describe.c:1479 describe.c:4007 +#: describe.c:1485 describe.c:4072 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Aucune relation nommée « %s » n'a été trouvée." -#: describe.c:1482 describe.c:4010 +#: describe.c:1488 describe.c:4075 #, c-format msgid "Did not find any relations." msgstr "Aucune relation n'a été trouvée." -#: describe.c:1678 +#: describe.c:1684 #, c-format msgid "Did not find any relation with OID %s." msgstr "Aucune relation avec l'OID « %s » n'a été trouvée." -#: describe.c:1726 describe.c:1750 +#: describe.c:1732 describe.c:1756 msgid "Start" msgstr "Début" -#: describe.c:1727 describe.c:1751 +#: describe.c:1733 describe.c:1757 msgid "Minimum" msgstr "Minimum" -#: describe.c:1728 describe.c:1752 +#: describe.c:1734 describe.c:1758 msgid "Maximum" msgstr "Maximum" -#: describe.c:1729 describe.c:1753 +#: describe.c:1735 describe.c:1759 msgid "Increment" msgstr "Incrément" -#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 -#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 +#: describe.c:1736 describe.c:1760 describe.c:1889 describe.c:4487 +#: describe.c:4828 describe.c:4964 describe.c:4969 describe.c:6710 msgid "yes" msgstr "oui" -#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 -#: describe.c:4768 describe.c:4892 describe.c:6621 +#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4487 +#: describe.c:4825 describe.c:4964 describe.c:6711 msgid "no" msgstr "non" -#: describe.c:1732 describe.c:1756 +#: describe.c:1738 describe.c:1762 msgid "Cycles?" msgstr "Cycles ?" -#: describe.c:1733 describe.c:1757 +#: describe.c:1739 describe.c:1763 msgid "Cache" msgstr "Cache" -#: describe.c:1798 +#: describe.c:1804 #, c-format msgid "Owned by: %s" msgstr "Propriétaire : %s" -#: describe.c:1802 +#: describe.c:1808 #, c-format msgid "Sequence for identity column: %s" msgstr "Séquence pour la colonne d'identité : %s" -#: describe.c:1810 +#: describe.c:1816 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "Séquence non journalisée « %s.%s »" -#: describe.c:1813 +#: describe.c:1819 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Séquence « %s.%s »" -#: describe.c:1957 +#: describe.c:1962 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Table non tracée « %s.%s »" -#: describe.c:1960 +#: describe.c:1965 #, c-format msgid "Table \"%s.%s\"" msgstr "Table « %s.%s »" -#: describe.c:1964 +#: describe.c:1969 #, c-format msgid "View \"%s.%s\"" msgstr "Vue « %s.%s »" -#: describe.c:1969 +#: describe.c:1974 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Vue matérialisée non journalisée « %s.%s »" -#: describe.c:1972 +#: describe.c:1977 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Vue matérialisée « %s.%s »" -#: describe.c:1977 +#: describe.c:1982 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Index non tracé « %s.%s »" -#: describe.c:1980 +#: describe.c:1985 #, c-format msgid "Index \"%s.%s\"" msgstr "Index « %s.%s »" -#: describe.c:1985 +#: describe.c:1990 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Index partitionné non journalisé « %s.%s »" -#: describe.c:1988 +#: describe.c:1993 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Index partitionné « %s.%s »" -#: describe.c:1992 +#: describe.c:1997 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "Table TOAST « %s.%s »" -#: describe.c:1996 +#: describe.c:2001 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Type composé « %s.%s »" -#: describe.c:2000 +#: describe.c:2005 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Table distante « %s.%s »" -#: describe.c:2005 +#: describe.c:2010 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Table non journalisée « %s.%s »" -#: describe.c:2008 +#: describe.c:2013 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Table partitionnée « %s.%s »" -#: describe.c:2024 describe.c:4343 +#: describe.c:2029 describe.c:4405 msgid "Collation" msgstr "Collationnement" -#: describe.c:2025 describe.c:4344 +#: describe.c:2030 describe.c:4406 msgid "Nullable" msgstr "NULL-able" -#: describe.c:2026 describe.c:4345 +#: describe.c:2031 describe.c:4407 msgid "Default" msgstr "Par défaut" -#: describe.c:2029 +#: describe.c:2034 msgid "Key?" msgstr "Clé ?" -#: describe.c:2031 describe.c:4665 describe.c:4676 +#: describe.c:2036 describe.c:4723 describe.c:4734 msgid "Definition" msgstr "Définition" -#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 -#: describe.c:5894 +#: describe.c:2038 describe.c:5757 describe.c:5831 describe.c:5896 +#: describe.c:5954 msgid "FDW options" msgstr "Options FDW" -#: describe.c:2035 +#: describe.c:2040 msgid "Storage" msgstr "Stockage" -#: describe.c:2037 +#: describe.c:2042 msgid "Compression" msgstr "Compression" -#: describe.c:2039 +#: describe.c:2044 msgid "Stats target" msgstr "Cible de statistiques" -#: describe.c:2175 +#: describe.c:2180 #, c-format msgid "Partition of: %s %s%s" msgstr "Partition de : %s %s%s" -#: describe.c:2188 +#: describe.c:2193 msgid "No partition constraint" msgstr "Aucune contrainte de partition" -#: describe.c:2190 +#: describe.c:2195 #, c-format msgid "Partition constraint: %s" msgstr "Contrainte de partition : %s" -#: describe.c:2214 +#: describe.c:2219 #, c-format msgid "Partition key: %s" msgstr "Clé de partition : %s" -#: describe.c:2240 +#: describe.c:2245 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Table propriétaire : « %s.%s »" -#: describe.c:2309 +#: describe.c:2314 msgid "primary key, " msgstr "clé primaire, " -#: describe.c:2312 +#: describe.c:2317 msgid "unique" msgstr "unique" -#: describe.c:2314 +#: describe.c:2319 msgid " nulls not distinct" msgstr " nulls non distincts" -#: describe.c:2315 +#: describe.c:2320 msgid ", " msgstr " , " -#: describe.c:2322 +#: describe.c:2327 #, c-format msgid "for table \"%s.%s\"" msgstr "pour la table « %s.%s »" -#: describe.c:2326 +#: describe.c:2331 #, c-format msgid ", predicate (%s)" msgstr ", prédicat (%s)" -#: describe.c:2329 +#: describe.c:2334 msgid ", clustered" msgstr ", en cluster" -#: describe.c:2332 +#: describe.c:2337 msgid ", invalid" msgstr ", invalide" -#: describe.c:2335 +#: describe.c:2340 msgid ", deferrable" msgstr ", déferrable" -#: describe.c:2338 +#: describe.c:2343 msgid ", initially deferred" msgstr ", initialement déferré" -#: describe.c:2341 +#: describe.c:2346 msgid ", replica identity" msgstr ", identité réplica" -#: describe.c:2395 +#: describe.c:2400 msgid "Indexes:" msgstr "Index :" -#: describe.c:2478 +#: describe.c:2483 msgid "Check constraints:" msgstr "Contraintes de vérification :" -#: describe.c:2546 +#: describe.c:2551 msgid "Foreign-key constraints:" msgstr "Contraintes de clés étrangères :" -#: describe.c:2609 +#: describe.c:2614 msgid "Referenced by:" msgstr "Référencé par :" -#: describe.c:2659 +#: describe.c:2664 msgid "Policies:" msgstr "Politiques :" -#: describe.c:2662 +#: describe.c:2667 msgid "Policies (forced row security enabled):" msgstr "Politiques (mode sécurité de ligne activé en forcé) :" -#: describe.c:2665 +#: describe.c:2670 msgid "Policies (row security enabled): (none)" msgstr "Politiques (mode sécurité de ligne activé) : (aucune)" -#: describe.c:2668 +#: describe.c:2673 msgid "Policies (forced row security enabled): (none)" msgstr "Politiques (mode sécurité de ligne activé en forcé) : (aucune)" -#: describe.c:2671 +#: describe.c:2676 msgid "Policies (row security disabled):" msgstr "Politiques (mode sécurité de ligne désactivé) :" -#: describe.c:2731 describe.c:2835 +#: describe.c:2736 describe.c:2841 msgid "Statistics objects:" msgstr "Objets statistiques :" -#: describe.c:2937 describe.c:3090 +#: describe.c:2943 describe.c:3096 msgid "Rules:" msgstr "Règles :" -#: describe.c:2940 +#: describe.c:2946 msgid "Disabled rules:" msgstr "Règles désactivées :" -#: describe.c:2943 +#: describe.c:2949 msgid "Rules firing always:" -msgstr "Règles toujous activées :" +msgstr "Règles toujours activées :" -#: describe.c:2946 +#: describe.c:2952 msgid "Rules firing on replica only:" msgstr "Règles activées uniquement sur le réplica :" -#: describe.c:3025 describe.c:5030 +#: describe.c:3031 describe.c:5100 msgid "Publications:" msgstr "Publications :" -#: describe.c:3073 +#: describe.c:3079 msgid "View definition:" msgstr "Définition de la vue :" -#: describe.c:3236 +#: describe.c:3242 msgid "Triggers:" msgstr "Triggers :" -#: describe.c:3239 +#: describe.c:3245 msgid "Disabled user triggers:" msgstr "Triggers utilisateurs désactivés :" -#: describe.c:3242 +#: describe.c:3248 msgid "Disabled internal triggers:" msgstr "Triggers internes désactivés :" -#: describe.c:3245 +#: describe.c:3251 msgid "Triggers firing always:" msgstr "Triggers toujours activés :" -#: describe.c:3248 +#: describe.c:3254 msgid "Triggers firing on replica only:" msgstr "Triggers activés uniquement sur le réplica :" -#: describe.c:3319 +#: describe.c:3325 #, c-format msgid "Server: %s" msgstr "Serveur : %s" -#: describe.c:3327 +#: describe.c:3333 #, c-format msgid "FDW options: (%s)" msgstr "Options FDW : (%s)" -#: describe.c:3348 +#: describe.c:3354 msgid "Inherits" msgstr "Hérite de" -#: describe.c:3413 +#: describe.c:3419 #, c-format msgid "Number of partitions: %d" msgstr "Nombre de partitions : %d" -#: describe.c:3422 +#: describe.c:3428 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Nombre de partitions : %d (utilisez \\d+ pour les lister)" -#: describe.c:3424 +#: describe.c:3430 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Nombre de tables enfants : %d (utilisez \\d+ pour les lister)" -#: describe.c:3431 +#: describe.c:3437 msgid "Child tables" msgstr "Tables enfant" -#: describe.c:3431 +#: describe.c:3437 msgid "Partitions" msgstr "Partitions" -#: describe.c:3462 +#: describe.c:3470 #, c-format msgid "Typed table of type: %s" msgstr "Table de type : %s" -#: describe.c:3478 +#: describe.c:3486 msgid "Replica Identity" msgstr "Identité de réplicat" -#: describe.c:3491 +#: describe.c:3499 msgid "Has OIDs: yes" msgstr "Contient des OID : oui" -#: describe.c:3500 +#: describe.c:3508 #, c-format msgid "Access method: %s" msgstr "Méthode d'accès : %s" -#: describe.c:3579 +#: describe.c:3585 #, c-format msgid "Tablespace: \"%s\"" msgstr "Tablespace : « %s »" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3591 +#: describe.c:3597 #, c-format msgid ", tablespace \"%s\"" msgstr ", tablespace « %s »" -#: describe.c:3668 +#: describe.c:3670 msgid "List of roles" msgstr "Liste des rôles" -#: describe.c:3670 +#: describe.c:3672 describe.c:3840 msgid "Role name" msgstr "Nom du rôle" -#: describe.c:3671 +#: describe.c:3673 msgid "Attributes" msgstr "Attributs" -#: describe.c:3673 -msgid "Member of" -msgstr "Membre de" - #: describe.c:3684 msgid "Superuser" msgstr "Superutilisateur" @@ -1782,383 +1853,395 @@ msgstr[1] "%d connexions" msgid "Password valid until " msgstr "Mot de passe valide jusqu'à " -#: describe.c:3777 +#: describe.c:3775 msgid "Role" msgstr "Rôle" -#: describe.c:3778 +#: describe.c:3776 msgid "Database" msgstr "Base de données" -#: describe.c:3779 +#: describe.c:3777 msgid "Settings" msgstr "Réglages" -#: describe.c:3803 +#: describe.c:3801 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Aucune configuration pour le rôle « %s » et la base de données « %s » n'a été trouvée." -#: describe.c:3806 +#: describe.c:3804 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Aucune configuration pour le rôle « %s » n'a été trouvée." -#: describe.c:3809 +#: describe.c:3807 #, c-format msgid "Did not find any settings." msgstr "Aucune configuration n'a été trouvée." -#: describe.c:3814 +#: describe.c:3811 msgid "List of settings" msgstr "Liste des paramètres" -#: describe.c:3885 +#: describe.c:3841 +msgid "Member of" +msgstr "Membre de" + +#: describe.c:3858 +msgid "Grantor" +msgstr "Donneur de droits" + +#: describe.c:3884 +msgid "List of role grants" +msgstr "Liste des droits de rôles" + +#: describe.c:3950 msgid "index" msgstr "index" -#: describe.c:3887 +#: describe.c:3952 msgid "TOAST table" msgstr "Table TOAST" -#: describe.c:3890 describe.c:4102 +#: describe.c:3955 describe.c:4166 msgid "partitioned index" msgstr "index partitionné" -#: describe.c:3910 +#: describe.c:3975 msgid "permanent" msgstr "permanent" -#: describe.c:3911 +#: describe.c:3976 msgid "temporary" msgstr "temporaire" -#: describe.c:3912 +#: describe.c:3977 msgid "unlogged" msgstr "non journalisé" -#: describe.c:3913 +#: describe.c:3978 msgid "Persistence" msgstr "Persistence" -#: describe.c:3929 +#: describe.c:3994 msgid "Access method" msgstr "Méthode d'accès" -#: describe.c:4015 +#: describe.c:4079 msgid "List of relations" msgstr "Liste des relations" -#: describe.c:4063 +#: describe.c:4127 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "Le serveur (version %s) ne supporte pas le partitionnement déclaratif des tables." -#: describe.c:4074 +#: describe.c:4138 msgid "List of partitioned indexes" msgstr "Liste des index partitionnés" -#: describe.c:4076 +#: describe.c:4140 msgid "List of partitioned tables" msgstr "Liste des tables partitionnées" -#: describe.c:4080 +#: describe.c:4144 msgid "List of partitioned relations" msgstr "Liste des relations partitionnées" -#: describe.c:4111 +#: describe.c:4175 msgid "Parent name" msgstr "Nom du parent" -#: describe.c:4124 +#: describe.c:4188 msgid "Leaf partition size" msgstr "Taille de la partition de dernier niveau" -#: describe.c:4127 describe.c:4133 +#: describe.c:4191 describe.c:4197 msgid "Total size" msgstr "Taille totale" -#: describe.c:4258 +#: describe.c:4321 msgid "Trusted" msgstr "De confiance" -#: describe.c:4267 +#: describe.c:4330 msgid "Internal language" msgstr "Langage interne" -#: describe.c:4268 +#: describe.c:4331 msgid "Call handler" msgstr "Gestionnaire d'appel" -#: describe.c:4269 describe.c:5680 +#: describe.c:4332 describe.c:5743 msgid "Validator" msgstr "Validateur" -#: describe.c:4270 +#: describe.c:4333 msgid "Inline handler" msgstr "Gestionnaire en ligne" -#: describe.c:4305 +#: describe.c:4367 msgid "List of languages" msgstr "Liste des langages" -#: describe.c:4346 +#: describe.c:4408 msgid "Check" msgstr "Vérification" -#: describe.c:4390 +#: describe.c:4451 msgid "List of domains" msgstr "Liste des domaines" -#: describe.c:4424 +#: describe.c:4485 msgid "Source" msgstr "Source" -#: describe.c:4425 +#: describe.c:4486 msgid "Destination" msgstr "Destination" -#: describe.c:4427 describe.c:6622 +#: describe.c:4488 describe.c:6712 msgid "Default?" msgstr "Par défaut ?" -#: describe.c:4469 +#: describe.c:4529 msgid "List of conversions" msgstr "Liste des conversions" -#: describe.c:4497 +#: describe.c:4557 msgid "Parameter" msgstr "Paramètre" -#: describe.c:4498 +#: describe.c:4558 msgid "Value" msgstr "Valeur" -#: describe.c:4505 +#: describe.c:4565 msgid "Context" msgstr "Contexte" -#: describe.c:4538 +#: describe.c:4597 msgid "List of configuration parameters" msgstr "Liste des paramètres de configuration" -#: describe.c:4540 +#: describe.c:4599 msgid "List of non-default configuration parameters" msgstr "Liste des paramètres de configuration à valeur personnalisée" -#: describe.c:4567 +#: describe.c:4626 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "Le serveur (version %s) ne supporte pas les triggers d'événement." -#: describe.c:4587 +#: describe.c:4646 msgid "Event" msgstr "Événement" -#: describe.c:4589 +#: describe.c:4648 msgid "enabled" msgstr "activé" -#: describe.c:4590 +#: describe.c:4649 msgid "replica" msgstr "réplicat" -#: describe.c:4591 +#: describe.c:4650 msgid "always" msgstr "toujours" -#: describe.c:4592 +#: describe.c:4651 msgid "disabled" msgstr "désactivé" -#: describe.c:4593 describe.c:6496 +#: describe.c:4652 describe.c:6553 msgid "Enabled" msgstr "Activé" -#: describe.c:4595 +#: describe.c:4654 msgid "Tags" msgstr "Tags" -#: describe.c:4619 +#: describe.c:4677 msgid "List of event triggers" msgstr "Liste des triggers sur évènement" -#: describe.c:4646 +#: describe.c:4704 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Le serveur (version %s) ne supporte pas les statistiques étendues." -#: describe.c:4683 +#: describe.c:4741 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4684 +#: describe.c:4742 msgid "Dependencies" msgstr "Dépendances" -#: describe.c:4694 +#: describe.c:4752 msgid "MCV" msgstr "MCV" -#: describe.c:4718 +#: describe.c:4775 msgid "List of extended statistics" msgstr "Liste des statistiques étendues" -#: describe.c:4745 +#: describe.c:4802 msgid "Source type" msgstr "Type source" -#: describe.c:4746 +#: describe.c:4803 msgid "Target type" msgstr "Type cible" -#: describe.c:4770 +#: describe.c:4827 msgid "in assignment" msgstr "assigné" -#: describe.c:4772 +#: describe.c:4829 msgid "Implicit?" msgstr "Implicite ?" -#: describe.c:4831 +#: describe.c:4887 msgid "List of casts" msgstr "Liste des conversions explicites" -#: describe.c:4883 describe.c:4887 +#: describe.c:4927 describe.c:4931 msgid "Provider" msgstr "Fournisseur" -#: describe.c:4893 describe.c:4898 +#: describe.c:4965 describe.c:4970 msgid "Deterministic?" msgstr "Déterministe ?" -#: describe.c:4938 +#: describe.c:5009 msgid "List of collations" msgstr "Liste des collationnements" -#: describe.c:5000 +#: describe.c:5070 msgid "List of schemas" msgstr "Liste des schémas" -#: describe.c:5117 +#: describe.c:5186 msgid "List of text search parsers" msgstr "Liste des analyseurs de la recherche de texte" -#: describe.c:5167 +#: describe.c:5236 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Aucun analyseur de la recherche de texte nommé « %s » n'a été trouvé." -#: describe.c:5170 +#: describe.c:5239 #, c-format msgid "Did not find any text search parsers." msgstr "Aucun analyseur de recherche de texte n'a été trouvé." -#: describe.c:5245 +#: describe.c:5314 msgid "Start parse" msgstr "Début de l'analyse" -#: describe.c:5246 +#: describe.c:5315 msgid "Method" msgstr "Méthode" -#: describe.c:5250 +#: describe.c:5319 msgid "Get next token" msgstr "Obtenir le prochain jeton" -#: describe.c:5252 +#: describe.c:5321 msgid "End parse" msgstr "Fin de l'analyse" -#: describe.c:5254 +#: describe.c:5323 msgid "Get headline" msgstr "Obtenir l'en-tête" -#: describe.c:5256 +#: describe.c:5325 msgid "Get token types" msgstr "Obtenir les types de jeton" -#: describe.c:5267 +#: describe.c:5335 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Analyseur « %s.%s » de la recherche de texte" -#: describe.c:5270 +#: describe.c:5338 #, c-format msgid "Text search parser \"%s\"" msgstr "Analyseur « %s » de la recherche de texte" -#: describe.c:5289 +#: describe.c:5357 msgid "Token name" msgstr "Nom du jeton" -#: describe.c:5303 +#: describe.c:5370 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Types de jeton pour l'analyseur « %s.%s »" -#: describe.c:5306 +#: describe.c:5373 #, c-format msgid "Token types for parser \"%s\"" msgstr "Types de jeton pour l'analyseur « %s »" -#: describe.c:5350 +#: describe.c:5417 msgid "Template" msgstr "Modèle" -#: describe.c:5351 +#: describe.c:5418 msgid "Init options" msgstr "Options d'initialisation" -#: describe.c:5378 +#: describe.c:5444 msgid "List of text search dictionaries" msgstr "Liste des dictionnaires de la recherche de texte" -#: describe.c:5411 +#: describe.c:5477 msgid "Init" msgstr "Initialisation" -#: describe.c:5412 +#: describe.c:5478 msgid "Lexize" msgstr "Lexize" -#: describe.c:5444 +#: describe.c:5509 msgid "List of text search templates" msgstr "Liste des modèles de la recherche de texte" -#: describe.c:5499 +#: describe.c:5563 msgid "List of text search configurations" msgstr "Liste des configurations de la recherche de texte" -#: describe.c:5550 +#: describe.c:5614 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Aucune configuration de la recherche de texte nommée « %s » n'a été trouvée." -#: describe.c:5553 +#: describe.c:5617 #, c-format msgid "Did not find any text search configurations." msgstr "Aucune configuration de recherche de texte n'a été trouvée." -#: describe.c:5619 +#: describe.c:5683 msgid "Token" msgstr "Jeton" -#: describe.c:5620 +#: describe.c:5684 msgid "Dictionaries" msgstr "Dictionnaires" -#: describe.c:5631 +#: describe.c:5695 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Configuration « %s.%s » de la recherche de texte" -#: describe.c:5634 +#: describe.c:5698 #, c-format msgid "Text search configuration \"%s\"" msgstr "Configuration « %s » de la recherche de texte" -#: describe.c:5638 +#: describe.c:5702 #, c-format msgid "" "\n" @@ -2167,7 +2250,7 @@ msgstr "" "\n" "Analyseur : « %s.%s »" -#: describe.c:5641 +#: describe.c:5705 #, c-format msgid "" "\n" @@ -2176,253 +2259,273 @@ msgstr "" "\n" "Analyseur : « %s »" -#: describe.c:5722 +#: describe.c:5784 msgid "List of foreign-data wrappers" msgstr "Liste des wrappers de données distantes" -#: describe.c:5750 +#: describe.c:5812 msgid "Foreign-data wrapper" msgstr "Wrapper des données distantes" -#: describe.c:5768 describe.c:5958 +#: describe.c:5830 describe.c:6017 msgid "Version" msgstr "Version" -#: describe.c:5799 +#: describe.c:5860 msgid "List of foreign servers" msgstr "Liste des serveurs distants" -#: describe.c:5824 describe.c:5883 +#: describe.c:5885 describe.c:5943 msgid "Server" msgstr "Serveur" -#: describe.c:5825 +#: describe.c:5886 msgid "User name" msgstr "Nom de l'utilisateur" -#: describe.c:5855 +#: describe.c:5915 msgid "List of user mappings" msgstr "Liste des correspondances utilisateurs" -#: describe.c:5928 +#: describe.c:5987 msgid "List of foreign tables" msgstr "Liste des tables distantes" -#: describe.c:5980 +#: describe.c:6038 msgid "List of installed extensions" msgstr "Liste des extensions installées" -#: describe.c:6028 +#: describe.c:6086 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Aucune extension nommée « %s » n'a été trouvée." -#: describe.c:6031 +#: describe.c:6089 #, c-format msgid "Did not find any extensions." msgstr "Aucune extension n'a été trouvée." -#: describe.c:6075 +#: describe.c:6133 msgid "Object description" msgstr "Description d'objet" -#: describe.c:6085 +#: describe.c:6142 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objets dans l'extension « %s »" -#: describe.c:6126 +#: describe.c:6183 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "mauvaise qualification du nom (trop de points entre les noms) : %s" -#: describe.c:6140 +#: describe.c:6197 #, c-format msgid "cross-database references are not implemented: %s" msgstr "les références entre bases de données ne sont pas implémentées : %s" -#: describe.c:6171 describe.c:6298 +#: describe.c:6228 describe.c:6354 #, c-format msgid "The server (version %s) does not support publications." msgstr "Le serveur (version %s) ne supporte pas les publications." -#: describe.c:6188 describe.c:6376 +#: describe.c:6245 describe.c:6432 msgid "All tables" msgstr "Toutes les tables" -#: describe.c:6189 describe.c:6377 +#: describe.c:6246 describe.c:6433 msgid "Inserts" msgstr "Insertions" -#: describe.c:6190 describe.c:6378 +#: describe.c:6247 describe.c:6434 msgid "Updates" msgstr "Mises à jour" -#: describe.c:6191 describe.c:6379 +#: describe.c:6248 describe.c:6435 msgid "Deletes" msgstr "Suppressions" -#: describe.c:6195 describe.c:6381 +#: describe.c:6252 describe.c:6437 msgid "Truncates" msgstr "Tronque" -#: describe.c:6199 describe.c:6383 +#: describe.c:6256 describe.c:6439 msgid "Via root" msgstr "Via la racine" -#: describe.c:6221 +#: describe.c:6277 msgid "List of publications" msgstr "Liste des publications" -#: describe.c:6345 +#: describe.c:6401 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Aucune publication nommée « %s » n'a été trouvée." -#: describe.c:6348 +#: describe.c:6404 #, c-format msgid "Did not find any publications." msgstr "Aucune publication n'a été trouvée." -#: describe.c:6372 +#: describe.c:6428 #, c-format msgid "Publication %s" msgstr "Publication %s" -#: describe.c:6425 +#: describe.c:6481 msgid "Tables:" msgstr "Tables :" -#: describe.c:6437 +#: describe.c:6493 msgid "Tables from schemas:" msgstr "Tables des schémas :" -#: describe.c:6481 +#: describe.c:6538 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Le serveur (version %s) ne supporte pas les souscriptions." -#: describe.c:6497 +#: describe.c:6554 msgid "Publication" msgstr "Publication" -#: describe.c:6506 +#: describe.c:6563 msgid "Binary" msgstr "Binaire" -#: describe.c:6507 +#: describe.c:6572 describe.c:6576 msgid "Streaming" msgstr "Flux" -#: describe.c:6514 +#: describe.c:6584 msgid "Two-phase commit" msgstr "Commit en deux phases" -#: describe.c:6515 +#: describe.c:6585 msgid "Disable on error" msgstr "Désactiver en cas d'erreur" -#: describe.c:6520 +#: describe.c:6592 +msgid "Origin" +msgstr "Origine" + +#: describe.c:6593 +msgid "Password required" +msgstr "Mot de passe requis" + +#: describe.c:6594 +msgid "Run as owner?" +msgstr "Exécuté en tant que propriétaire ?" + +#: describe.c:6599 +msgid "Failover" +msgstr "Failover" + +#: describe.c:6604 msgid "Synchronous commit" msgstr "Validation synchrone" -#: describe.c:6521 +#: describe.c:6605 msgid "Conninfo" msgstr "Informations de connexion" -#: describe.c:6527 +#: describe.c:6611 msgid "Skip LSN" msgstr "Ignore LSN" -#: describe.c:6554 +#: describe.c:6637 msgid "List of subscriptions" msgstr "Liste des souscriptions" -#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 +#: describe.c:6666 +msgid "(none)" +msgstr "(aucun)" + +#: describe.c:6706 describe.c:6801 describe.c:6893 describe.c:6987 msgid "AM" msgstr "AM" -#: describe.c:6617 +#: describe.c:6707 msgid "Input type" msgstr "Type en entrée" -#: describe.c:6618 +#: describe.c:6708 msgid "Storage type" msgstr "Type de stockage" -#: describe.c:6619 +#: describe.c:6709 msgid "Operator class" msgstr "Classe d'opérateur" -#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 +#: describe.c:6721 describe.c:6802 describe.c:6894 describe.c:6988 msgid "Operator family" msgstr "Famille d'opérateur" -#: describe.c:6667 +#: describe.c:6756 msgid "List of operator classes" msgstr "Liste des classes d'opérateurs" -#: describe.c:6714 +#: describe.c:6803 msgid "Applicable types" msgstr "Types applicables" -#: describe.c:6756 +#: describe.c:6844 msgid "List of operator families" msgstr "Liste des familles d'opérateurs" -#: describe.c:6807 +#: describe.c:6895 msgid "Operator" msgstr "Opérateur" -#: describe.c:6808 +#: describe.c:6896 msgid "Strategy" msgstr "Stratégie" -#: describe.c:6809 +#: describe.c:6897 msgid "ordering" msgstr "ordre" -#: describe.c:6810 +#: describe.c:6898 msgid "search" msgstr "recherche" -#: describe.c:6811 +#: describe.c:6899 msgid "Purpose" msgstr "But" -#: describe.c:6816 +#: describe.c:6904 msgid "Sort opfamily" msgstr "Tri famille d'opérateur" -#: describe.c:6855 +#: describe.c:6942 msgid "List of operators of operator families" msgstr "Liste d'opérateurs des familles d'opérateurs" -#: describe.c:6902 +#: describe.c:6989 msgid "Registered left type" msgstr "Type de l'arg. gauche enregistré" -#: describe.c:6903 +#: describe.c:6990 msgid "Registered right type" msgstr "Type de l'arg. droit enregistré" -#: describe.c:6904 +#: describe.c:6991 msgid "Number" msgstr "Numéro" -#: describe.c:6948 +#: describe.c:7034 msgid "List of support functions of operator families" msgstr "Liste des fonctions de support des familles d'opérateurs" -#: describe.c:6979 +#: describe.c:7065 msgid "ID" msgstr "ID" -#: describe.c:7000 +#: describe.c:7085 msgid "Large objects" msgstr "« Large objects »" -#: help.c:75 +#: help.c:63 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2430,11 +2533,11 @@ msgstr "" "psql est l'interface interactive de PostgreSQL.\n" "\n" -#: help.c:76 help.c:393 help.c:473 help.c:516 +#: help.c:64 help.c:372 help.c:456 help.c:502 msgid "Usage:\n" msgstr "Usage :\n" -#: help.c:77 +#: help.c:65 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2442,32 +2545,29 @@ msgstr "" " psql [OPTIONS]... [BASE [UTILISATEUR]]\n" "\n" -#: help.c:79 +#: help.c:67 msgid "General options:\n" msgstr "Options générales :\n" -#: help.c:84 +#: help.c:68 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr "" " -c, --command=COMMANDE exécute une commande unique (SQL ou interne), puis\n" " quitte\n" -#: help.c:85 -#, c-format -msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" -msgstr "" -" -d, --dbname=BASE indique le nom de la base de données à laquelle se\n" -" connecter (par défaut : « %s »)\n" +#: help.c:69 +msgid " -d, --dbname=DBNAME database name to connect to\n" +msgstr " -d, --dbname=BASE base de données de connexion\n" -#: help.c:87 +#: help.c:70 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=FICHIER exécute les commandes du fichier, puis quitte\n" -#: help.c:88 +#: help.c:71 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list affiche les bases de données disponibles, puis quitte\n" -#: help.c:89 +#: help.c:72 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2477,15 +2577,15 @@ msgstr "" " configure la variable psql NOM en VALEUR\n" " (par exemple : -v ON_ERROR_STOP=1)\n" -#: help.c:92 +#: help.c:75 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: help.c:93 +#: help.c:76 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc ne lit pas le fichier de démarrage (~/.psqlrc)\n" -#: help.c:94 +#: help.c:77 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2494,19 +2594,19 @@ msgstr "" " exécute dans une transaction unique (si non\n" " interactif)\n" -#: help.c:96 +#: help.c:79 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] affiche cette aide et quitte\n" -#: help.c:97 +#: help.c:80 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commandes liste les méta-commandes, puis quitte\n" -#: help.c:98 +#: help.c:81 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables liste les variables spéciales, puis quitte\n" -#: help.c:100 +#: help.c:83 msgid "" "\n" "Input and output options:\n" @@ -2514,79 +2614,79 @@ msgstr "" "\n" "Options d'entrée/sortie :\n" -#: help.c:101 +#: help.c:84 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all affiche les lignes du script\n" -#: help.c:102 +#: help.c:85 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors affiche les commandes échouées\n" -#: help.c:103 +#: help.c:86 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries affiche les commandes envoyées au serveur\n" -#: help.c:104 +#: help.c:87 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr "" " -E, --echo-hidden affiche les requêtes engendrées par les commandes\n" " internes\n" -#: help.c:105 +#: help.c:88 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FICHIER envoie les traces dans le fichier\n" -#: help.c:106 +#: help.c:89 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr "" " -n, --no-readline désactive l'édition avancée de la ligne de commande\n" " (readline)\n" -#: help.c:107 +#: help.c:90 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr "" " -o, --output=FICHIER écrit les résultats des requêtes dans un fichier (ou\n" " |tube)\n" -#: help.c:108 +#: help.c:91 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr "" " -q, --quiet s'exécute silencieusement (pas de messages, uniquement\n" " le résultat des requêtes)\n" -#: help.c:109 +#: help.c:92 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr "" " -s, --single-step active le mode étape par étape (confirmation pour\n" " chaque requête)\n" -#: help.c:110 +#: help.c:93 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr "" " -S, --single-line active le mode ligne par ligne (EOL termine la\n" " commande SQL)\n" -#: help.c:112 +#: help.c:95 msgid "" "\n" "Output format options:\n" msgstr "" "\n" -"Options de formattage de la sortie :\n" +"Options de formatage de la sortie :\n" -#: help.c:113 +#: help.c:96 msgid " -A, --no-align unaligned table output mode\n" msgstr "" " -A, --no-align active le mode d'affichage non aligné des tables\n" " (-P format=unaligned)\n" -#: help.c:114 +#: help.c:97 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr "" " --csv mode d'affichage CSV (valeurs séparées par des\n" " virgules)\n" -#: help.c:115 +#: help.c:98 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2596,19 +2696,19 @@ msgstr "" " séparateur de champs pour un affichage non aligné\n" " (par défaut : « %s »)\n" -#: help.c:118 +#: help.c:101 msgid " -H, --html HTML table output mode\n" msgstr "" " -H, --html active le mode d'affichage HTML des tables\n" " (-P format=html)\n" -#: help.c:119 +#: help.c:102 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr "" " -P, --pset=VAR[=ARG] initialise l'option d'impression VAR à ARG (voir la\n" " commande \\pset)\n" -#: help.c:120 +#: help.c:103 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2617,21 +2717,21 @@ msgstr "" " séparateur d'enregistrements pour un affichage non\n" " aligné (par défaut : saut de ligne)\n" -#: help.c:122 +#: help.c:105 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only affiche seulement les lignes (-P tuples_only)\n" -#: help.c:123 +#: help.c:106 msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr "" " -T, --table-attr=TEXTE initialise les attributs des balises HTML de tableau\n" " (largeur, bordure)\n" -#: help.c:124 +#: help.c:107 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded active l'affichage étendu des tables (-P expanded)\n" -#: help.c:125 +#: help.c:108 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2640,7 +2740,7 @@ msgstr "" " initialise le séparateur de champs pour un affichage\n" " non aligné à l'octet zéro\n" -#: help.c:127 +#: help.c:110 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2649,7 +2749,7 @@ msgstr "" " initialise le séparateur d'enregistrements pour un\n" " affichage non aligné à l'octet zéro\n" -#: help.c:130 +#: help.c:113 msgid "" "\n" "Connection options:\n" @@ -2657,43 +2757,31 @@ msgstr "" "\n" "Options de connexion :\n" -#: help.c:133 -#, c-format -msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" +#: help.c:114 +msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=HÔTE nom d'hôte du serveur de la base de données ou\n" -" répertoire de la socket (par défaut : %s)\n" - -#: help.c:134 -msgid "local socket" -msgstr "socket locale" +" -h, --host=HÔTE hôte du serveur de bases de données ou\n" +" répertoire des sockets\n" -#: help.c:137 -#, c-format -msgid " -p, --port=PORT database server port (default: \"%s\")\n" -msgstr "" -" -p, --port=PORT port du serveur de la base de données (par défaut :\n" -" « %s »)\n" +#: help.c:115 +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT port du serveur de bases de données\n" -#: help.c:140 -#, c-format -msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" -msgstr "" -" -U, --username=UTILISATEUR\n" -" nom d'utilisateur de la base de données (par\n" -" défaut : « %s »)\n" +#: help.c:116 +msgid " -U, --username=USERNAME database user name\n" +msgstr " -U, --username=NOM nom de l'utilisateur de la base de données\n" -#: help.c:142 +#: help.c:117 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ne demande jamais un mot de passe\n" -#: help.c:143 +#: help.c:118 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr "" " -W, --password force la demande du mot de passe (devrait survenir\n" " automatiquement)\n" -#: help.c:145 +#: help.c:120 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2707,35 +2795,39 @@ msgstr "" "la documentation de PostgreSQL.\n" "\n" -#: help.c:148 +#: help.c:123 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapporter les bogues à <%s>.\n" -#: help.c:149 +#: help.c:124 #, c-format msgid "%s home page: <%s>\n" -msgstr "page d'accueil de %s : <%s>\n" +msgstr "Page d'accueil de %s : <%s>\n" -#: help.c:191 +#: help.c:166 msgid "General\n" msgstr "Général\n" -#: help.c:192 +#: help.c:167 +msgid " \\bind [PARAM]... set query parameters\n" +msgstr " \\bind [PARAM]... configure les paramètres de la requête\n" + +#: help.c:168 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr "" " \\copyright affiche les conditions d'utilisation et de\n" " distribution de PostgreSQL\n" -#: help.c:193 +#: help.c:169 msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr " \\crosstabview [COLONNES] exécute la requête et affiche le résultat dans un tableau croisé\n" -#: help.c:194 +#: help.c:170 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose affiche le message d'erreur le plus récent avec une verbosité maximale\n" -#: help.c:195 +#: help.c:171 msgid "" " \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" @@ -2743,252 +2835,258 @@ msgstr "" " \\g [(OPTIONS)] [FICHIER] exécute la requête (et envoie les résultats à un fichier ou à |pipe);\n" " \\g sans arguments est équivalent à un point-virgule\n" -#: help.c:197 +#: help.c:173 msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc décrit le résultat de la requête sans l'exécuter\n" -#: help.c:198 +#: help.c:174 msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec exécute la requête et exécute chaque valeur du résultat\n" -#: help.c:199 +#: help.c:175 msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr " \\gset [PRÉFIXE] exécute la requête et enregistre le résultat dans des variables psql\n" -#: help.c:200 +#: help.c:176 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [(OPTIONS)] [FICHIER] comme \\g, mais force le mode de sortie étendu\n" -#: help.c:201 +#: help.c:177 msgid " \\q quit psql\n" msgstr " \\q quitte psql\n" -#: help.c:202 -msgid " \\watch [SEC] execute query every SEC seconds\n" -msgstr " \\watch [SEC] exécute la requête toutes les SEC secondes\n" +#: help.c:178 +msgid "" +" \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" execute query every SEC seconds, up to N times,\n" +" stop if less than MIN rows are returned\n" +msgstr "" +" \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" exécute la requête chaque SEC secondes, jusqu'à N fois,\n" +" s'arrête si moins de MIN lignes sont renvoyés\n" -#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 -#: help.c:324 help.c:337 help.c:346 +#: help.c:181 help.c:189 help.c:201 help.c:211 help.c:218 help.c:275 help.c:283 +#: help.c:303 help.c:316 help.c:325 msgid "\n" msgstr "\n" -#: help.c:205 +#: help.c:183 msgid "Help\n" msgstr "Aide\n" -#: help.c:207 +#: help.c:185 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commandes] affiche l'aide sur les métacommandes\n" -#: help.c:208 +#: help.c:186 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options affiche l'aide sur les options en ligne de commande de psql\n" -#: help.c:209 +#: help.c:187 msgid " \\? variables show help on special variables\n" msgstr " \\? variables affiche l'aide sur les variables spéciales\n" -#: help.c:210 +#: help.c:188 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr "" " \\h [NOM] aide-mémoire pour les commandes SQL, * pour toutes\n" " les commandes\n" -#: help.c:213 +#: help.c:191 msgid "Query Buffer\n" msgstr "Tampon de requête\n" -#: help.c:214 +#: help.c:192 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr "" " \\e [FICHIER] [LIGNE] édite le tampon de requête ou le fichier avec un\n" " éditeur externe\n" -#: help.c:215 +#: help.c:193 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr "" " \\ef [FONCTION [LIGNE]] édite la définition de fonction avec un éditeur\n" " externe\n" -#: help.c:216 +#: help.c:194 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr "" " \\ev [VUE [LIGNE]] édite la définition de vue avec un éditeur\n" " externe\n" -#: help.c:217 +#: help.c:195 msgid " \\p show the contents of the query buffer\n" msgstr " \\p affiche le contenu du tampon de requête\n" -#: help.c:218 +#: help.c:196 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r efface le tampon de requêtes\n" -#: help.c:220 +#: help.c:198 msgid " \\s [FILE] display history or save it to file\n" msgstr "" " \\s [FICHIER] affiche l'historique ou le sauvegarde dans un\n" " fichier\n" -#: help.c:222 +#: help.c:200 msgid " \\w FILE write query buffer to file\n" msgstr "" " \\w [FICHIER] écrit le contenu du tampon de requêtes dans un\n" " fichier\n" -#: help.c:225 +#: help.c:203 msgid "Input/Output\n" msgstr "Entrée/Sortie\n" -#: help.c:226 +#: help.c:204 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr "" " \\copy ... exécute SQL COPY avec le flux de données dirigé vers\n" " l'hôte client\n" -#: help.c:227 +#: help.c:205 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [TEXTE] écrit le texte sur la sortie standard (-n pour supprimer le retour à la ligne)\n" -#: help.c:228 +#: help.c:206 msgid " \\i FILE execute commands from file\n" msgstr " \\i FICHIER exécute les commandes du fichier\n" -#: help.c:229 +#: help.c:207 msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr "" " \\ir FICHIER identique à \\i, mais relatif à l'emplacement du script\n" " ou un |tube\n" -#: help.c:230 +#: help.c:208 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr "" " \\o [FICHIER] envoie les résultats de la requête vers un fichier\n" " ou un |tube\n" -#: help.c:231 +#: help.c:209 msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr "" " \\qecho [-n] [TEXTE] écrit un texte sur la sortie des résultats des\n" " requêtes (\\o) (-n pour supprimer le retour à la ligne)\n" -#: help.c:232 +#: help.c:210 msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr " \\warn [-n] [TEXTE] écrit le texte sur la sortie des erreurs (-n pour supprimer le retour à la ligne)\n" -#: help.c:235 +#: help.c:213 msgid "Conditional\n" msgstr "Conditionnel\n" -#: help.c:236 +#: help.c:214 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR début du bloc conditionnel\n" -#: help.c:237 +#: help.c:215 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif alternative à l'intérieur du bloc conditionnel courant\n" -#: help.c:238 +#: help.c:216 msgid " \\else final alternative within current conditional block\n" msgstr " \\else alternative finale à l'intérieur du bloc conditionnel courant\n" -#: help.c:239 +#: help.c:217 msgid " \\endif end conditional block\n" msgstr " \\endif bloc conditionnel de fin\n" -#: help.c:242 +#: help.c:220 msgid "Informational\n" msgstr "Informations\n" -#: help.c:243 +#: help.c:221 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (options : S = affiche les objets systèmes, + = informations supplémentaires)\n" -#: help.c:244 +#: help.c:222 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] affiche la liste des tables, vues et séquences\n" -#: help.c:245 +#: help.c:223 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr "" " \\d[S+] NOM affiche la description de la table, de la vue,\n" " de la séquence ou de l'index\n" -#: help.c:246 +#: help.c:224 msgid " \\da[S] [PATTERN] list aggregates\n" -msgstr " \\da[S] [MODÈLE] affiche les aggrégats\n" +msgstr " \\da[S] [MODÈLE] affiche les agrégats\n" -#: help.c:247 +#: help.c:225 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [MODÈLE] affiche la liste des méthodes d'accès\n" -#: help.c:248 +#: help.c:226 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] affiche les classes d'opérateurs\n" -#: help.c:249 +#: help.c:227 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] affiche les familles d'opérateur\n" -#: help.c:250 +#: help.c:228 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] affiche les opérateurs des familles d'opérateur\n" -#: help.c:251 +#: help.c:229 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] liste les fonctions de support des familles d'opérateur\n" -#: help.c:252 +#: help.c:230 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [MODÈLE] affiche la liste des tablespaces\n" -#: help.c:253 +#: help.c:231 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [MODÈLE] affiche la liste des conversions\n" -#: help.c:254 +#: help.c:232 msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" msgstr " \\dconfig[+] [MODÈLE] affiche les paramètres de configuration\n" -#: help.c:255 +#: help.c:233 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [MODÈLE] affiche la liste des transtypages\n" -#: help.c:256 +#: help.c:234 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr "" " \\dd[S] [MODÈLE] affiche les commentaires des objets dont le commentaire\n" " n'est affiché nul part ailleurs\n" -#: help.c:257 +#: help.c:235 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [MODÈLE] affiche la liste des domaines\n" -#: help.c:258 +#: help.c:236 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [MODÈLE] affiche les droits par défaut\n" -#: help.c:259 +#: help.c:237 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [MODÈLE] affiche la liste des tables distantes\n" -#: help.c:260 +#: help.c:238 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [MODÈLE] affiche la liste des serveurs distants\n" -#: help.c:261 +#: help.c:239 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [MODÈLE] affiche la liste des tables distantes\n" -#: help.c:262 +#: help.c:240 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [MODÈLE] affiche la liste des correspondances utilisateurs\n" -#: help.c:263 +#: help.c:241 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [MODÈLE] affiche la liste des wrappers de données distantes\n" -#: help.c:264 +#: help.c:242 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" @@ -2996,55 +3094,55 @@ msgstr "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " affiche la liste des fonctions [seulement agrégat/normal/procédure/trigger/window]\n" -#: help.c:266 +#: help.c:244 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr "" " \\dF[+] [MODÈLE] affiche la liste des configurations de la recherche\n" " plein texte\n" -#: help.c:267 +#: help.c:245 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr "" " \\dFd[+] [MODÈLE] affiche la liste des dictionnaires de la recherche de\n" " texte\n" -#: help.c:268 +#: help.c:246 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr "" " \\dFp[+] [MODÈLE] affiche la liste des analyseurs de la recherche de\n" " texte\n" -#: help.c:269 +#: help.c:247 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr "" " \\dFt[+] [MODÈLE] affiche la liste des modèles de la recherche de\n" " texte\n" -#: help.c:270 +#: help.c:248 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [MODÈLE] affiche la liste des rôles (utilisateurs)\n" -#: help.c:271 +#: help.c:249 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [MODÈLE] affiche la liste des index\n" -#: help.c:272 +#: help.c:250 msgid " \\dl[+] list large objects, same as \\lo_list\n" msgstr " \\dl[+] liste des « Large Objects », identique à \\lo_list\n" -#: help.c:273 +#: help.c:251 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [MODÈLE] affiche la liste des langages procéduraux\n" -#: help.c:274 +#: help.c:252 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [MODÈLE] affiche la liste des vues matérialisées\n" -#: help.c:275 +#: help.c:253 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [MODÈLE] affiche la liste des schémas\n" -#: help.c:276 +#: help.c:254 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" @@ -3052,93 +3150,97 @@ msgstr "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " affiche la liste des opérateurs\n" -#: help.c:278 +#: help.c:256 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [MODÈLE] affiche la liste des collationnements\n" -#: help.c:279 -msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" +#: help.c:257 +msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n" msgstr "" -" \\dp [MODÈLE] affiche la liste des droits d'accès aux tables,\n" +" \\dp[S] [MODÈLE] affiche la liste des droits d'accès aux tables,\n" " vues, séquences\n" -#: help.c:280 +#: help.c:258 msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr " \\dP[itn+] [PATTERN] affiche les relations partitionnées [seulement index/table] [n=imbriquées]\n" -#: help.c:281 +#: help.c:259 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr "" " \\drds [ROLEPTRN [DBPTRN]] liste la configuration utilisateur par base de données\n" "\n" -#: help.c:282 +#: help.c:260 +msgid " \\drg[S] [PATTERN] list role grants\n" +msgstr " \\dg[S] [MODÈLE] affiche la liste des droits des rôles\n" + +#: help.c:261 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[S+] [MODÈLE] affiche la liste des publications de réplication\n" -#: help.c:283 +#: help.c:262 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [MODÈLE] affiche la liste des souscriptions de réplication\n" -#: help.c:284 +#: help.c:263 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [MODÈLE] affiche la liste des séquences\n" -#: help.c:285 +#: help.c:264 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [MODÈLE] affiche la liste des tables\n" -#: help.c:286 +#: help.c:265 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [MODÈLE] affiche la liste des types de données\n" -#: help.c:287 +#: help.c:266 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [MODÈLE] affiche la liste des rôles (utilisateurs)\n" -#: help.c:288 +#: help.c:267 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [MODÈLE] affiche la liste des vues\n" -#: help.c:289 +#: help.c:268 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [MODÈLE] affiche la liste des extensions\n" -#: help.c:290 +#: help.c:269 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [MODÈLE] affiche les statistiques étendues\n" -#: help.c:291 +#: help.c:270 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [MODÈLE] affiche les triggers sur évènement\n" -#: help.c:292 +#: help.c:271 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [MODÈLE] affiche la liste des bases de données\n" -#: help.c:293 +#: help.c:272 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] [FONCTION] édite la définition d'une fonction\n" -#: help.c:294 +#: help.c:273 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv [FONCTION] édite la définition d'une vue\n" -#: help.c:295 -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [MODÈLE] identique à \\dp\n" +#: help.c:274 +msgid " \\z[S] [PATTERN] same as \\dp\n" +msgstr " \\z[S] [MODÈLE] identique à \\dp\n" -#: help.c:298 +#: help.c:277 msgid "Large Objects\n" msgstr "« Large objects »\n" -#: help.c:299 +#: help.c:278 msgid " \\lo_export LOBOID FILE write large object to file\n" msgstr "" " \\lo_export LOBOID FICHIER\n" " écrit un « Large Object » dans le fichier\n" -#: help.c:300 +#: help.c:279 msgid "" " \\lo_import FILE [COMMENT]\n" " read large object from file\n" @@ -3146,42 +3248,42 @@ msgstr "" " \\lo_import FICHIER [COMMENTAIRE]\n" " lit un « Large Object » à partir du fichier\n" -#: help.c:302 +#: help.c:281 msgid " \\lo_list[+] list large objects\n" msgstr " \\dl[+] liste des « Large Objects »\n" -#: help.c:303 +#: help.c:282 msgid " \\lo_unlink LOBOID delete a large object\n" msgstr " \\lo_unlink LOBOID supprime un « Large Object »\n" -#: help.c:306 +#: help.c:285 msgid "Formatting\n" msgstr "Formatage\n" -#: help.c:307 +#: help.c:286 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr "" " \\a bascule entre les modes de sortie alignée et non\n" " alignée\n" -#: help.c:308 +#: help.c:287 msgid " \\C [STRING] set table title, or unset if none\n" msgstr "" " \\C [CHAÃŽNE] initialise le titre d'une table, ou le désactive en\n" " l'absence d'argument\n" -#: help.c:309 +#: help.c:288 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr "" " \\f [CHAÃŽNE] affiche ou initialise le séparateur de champ pour\n" " une sortie non alignée des requêtes\n" -#: help.c:310 +#: help.c:289 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H bascule le mode de sortie HTML (actuellement %s)\n" -#: help.c:312 +#: help.c:291 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3189,7 +3291,7 @@ msgid "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" msgstr "" " \\pset [NOM [VALEUR]] règle l'affichage de la table\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3197,33 +3299,33 @@ msgstr "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" -#: help.c:319 +#: help.c:298 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t affiche uniquement les lignes (actuellement %s)\n" -#: help.c:321 +#: help.c:300 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr "" " \\T [CHAÃŽNE] initialise les attributs HTML de la balise
,\n" " ou l'annule en l'absence d'argument\n" -#: help.c:322 +#: help.c:301 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] bascule l'affichage étendu (actuellement %s)\n" -#: help.c:323 +#: help.c:302 msgid "auto" msgstr "auto" -#: help.c:326 +#: help.c:305 msgid "Connection\n" msgstr "Connexions\n" -#: help.c:328 +#: help.c:307 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3233,7 +3335,7 @@ msgstr "" " se connecte à une autre base de données\n" " (actuellement « %s »)\n" -#: help.c:332 +#: help.c:311 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3242,71 +3344,71 @@ msgstr "" " se connecte à une nouvelle base de données\n" " (aucune connexion actuellement)\n" -#: help.c:334 +#: help.c:313 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo affiche des informations sur la connexion en cours\n" -#: help.c:335 +#: help.c:314 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [ENCODAGE] affiche ou initialise l'encodage du client\n" -#: help.c:336 +#: help.c:315 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr "" " \\password [UTILISATEUR]\n" " modifie de façon sécurisé le mot de passe d'un\n" " utilisateur\n" -#: help.c:339 +#: help.c:318 msgid "Operating System\n" msgstr "Système d'exploitation\n" -#: help.c:340 +#: help.c:319 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [RÉPERTOIRE] change de répertoire de travail\n" -#: help.c:341 +#: help.c:320 msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" msgstr " \\getenv PSQLVAR ENVVAR récupère une variable d'environnement\n" -#: help.c:342 +#: help.c:321 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NOM [VALEUR] (dés)initialise une variable d'environnement\n" -#: help.c:343 +#: help.c:322 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr "" " \\timing [on|off] bascule l'activation du chronométrage des commandes\n" " (actuellement %s)\n" -#: help.c:345 +#: help.c:324 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr "" " \\! [COMMANDE] exécute la commande dans un shell ou exécute un\n" " shell interactif\n" -#: help.c:348 +#: help.c:327 msgid "Variables\n" msgstr "Variables\n" -#: help.c:349 +#: help.c:328 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr "" " \\prompt [TEXTE] NOM demande à l'utilisateur de configurer la variable\n" " interne\n" -#: help.c:350 +#: help.c:329 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr "" " \\set [NOM [VALEUR]] initialise une variable interne ou les affiche\n" " toutes en l'absence de paramètre\n" -#: help.c:351 +#: help.c:330 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NOM désactive (supprime) la variable interne\n" -#: help.c:390 +#: help.c:369 msgid "" "List of specially treated variables\n" "\n" @@ -3314,11 +3416,11 @@ msgstr "" "Liste des variables traitées spécialement\n" "\n" -#: help.c:392 +#: help.c:371 msgid "psql variables:\n" msgstr "variables psql :\n" -#: help.c:394 +#: help.c:373 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3328,7 +3430,7 @@ msgstr "" " ou \\set NOM VALEUR dans psql\n" "\n" -#: help.c:396 +#: help.c:375 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3336,7 +3438,7 @@ msgstr "" " AUTOCOMMIT\n" " si activé, les commandes SQL réussies sont automatiquement validées\n" -#: help.c:398 +#: help.c:377 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3346,7 +3448,7 @@ msgstr "" " détermine la casse utilisée pour compléter les mots clés SQL\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:401 +#: help.c:380 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3354,7 +3456,7 @@ msgstr "" " DBNAME\n" " le nom de base de données actuel\n" -#: help.c:403 +#: help.c:382 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3364,7 +3466,7 @@ msgstr "" " contrôle ce qui est envoyé sur la sortie standard\n" " [all, errors, none, queries]\n" -#: help.c:406 +#: help.c:385 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3374,7 +3476,7 @@ msgstr "" " si activé, affiche les requêtes internes exécutées par les méta-commandes ;\n" " si configuré à « noexec », affiche les requêtes sans les exécuter\n" -#: help.c:409 +#: help.c:388 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3382,15 +3484,15 @@ msgstr "" " ENCODING\n" " encodage du jeu de caractères client\n" -#: help.c:411 +#: help.c:390 msgid "" " ERROR\n" -" true if last query failed, else false\n" +" \"true\" if last query failed, else \"false\"\n" msgstr "" " ERROR\n" " true si la dernière requête a échoué, sinon false\n" -#: help.c:413 +#: help.c:392 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3399,7 +3501,7 @@ msgstr "" " le nombre de lignes résultats à récupérer et à afficher à la fois\n" " (0 pour illimité)\n" -#: help.c:415 +#: help.c:394 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3407,16 +3509,15 @@ msgstr "" " HIDE_TABLEAM\n" " si activé, les méthodes d'accès ne sont pas affichées\n" -#: help.c:417 +#: help.c:396 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" msgstr "" " HIDE_TOAST_COMPRESSION\n" " si activé, les méthodes de compression methods ne sont pas affichées\n" -"\n" -#: help.c:419 +#: help.c:398 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3424,7 +3525,7 @@ msgstr "" " HISTCONTROL\n" " contrôle l'historique des commandes [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:421 +#: help.c:400 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3432,7 +3533,7 @@ msgstr "" " HISTFILE\n" " nom du fichier utilisé pour stocker l'historique des commandes\n" -#: help.c:423 +#: help.c:402 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3440,7 +3541,7 @@ msgstr "" " HISTSIZE\n" " nombre maximum de commandes à stocker dans l'historique de commandes\n" -#: help.c:425 +#: help.c:404 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3448,7 +3549,7 @@ msgstr "" " HOST\n" " l'hôte de la base de données\n" -#: help.c:427 +#: help.c:406 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3456,7 +3557,7 @@ msgstr "" " IGNOREEOF\n" " nombre d'EOF nécessaire pour terminer une session interactive\n" -#: help.c:429 +#: help.c:408 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3464,7 +3565,7 @@ msgstr "" " LASTOID\n" " valeur du dernier OID affecté\n" -#: help.c:431 +#: help.c:410 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3474,7 +3575,7 @@ msgstr "" " LAST_ERROR_SQLSTATE\n" " message et SQLSTATE de la dernière erreur ou une chaîne vide et \"00000\" if si aucune erreur\n" -#: help.c:434 +#: help.c:413 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3482,7 +3583,7 @@ msgstr "" " ON_ERROR_ROLLBACK\n" " si activé, une erreur n'arrête pas une transaction (utilise des savepoints implicites)\n" -#: help.c:436 +#: help.c:415 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3490,7 +3591,7 @@ msgstr "" " ON_ERROR_STOP\n" " arrête l'exécution d'un batch après une erreur\n" -#: help.c:438 +#: help.c:417 msgid "" " PORT\n" " server port of the current connection\n" @@ -3498,7 +3599,7 @@ msgstr "" " PORT\n" " port du serveur pour la connexion actuelle\n" -#: help.c:440 +#: help.c:419 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3506,7 +3607,7 @@ msgstr "" " PROMPT1\n" " spécifie l'invite standard de psql\n" -#: help.c:442 +#: help.c:421 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3514,7 +3615,7 @@ msgstr "" " PROMPT2\n" " spécifie l'invite utilisé quand une requête continue après la ligne courante\n" -#: help.c:444 +#: help.c:423 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3522,7 +3623,7 @@ msgstr "" " PROMPT3\n" " spécifie l'invite utilisée lors d'un COPY ... FROM STDIN\n" -#: help.c:446 +#: help.c:425 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3530,7 +3631,7 @@ msgstr "" " QUIET\n" " s'exécute en silence (identique à l'option -q)\n" -#: help.c:448 +#: help.c:427 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3538,7 +3639,7 @@ msgstr "" " ROW_COUNT\n" " nombre de lignes renvoyées ou affectées par la dernière requête, ou 0\n" -#: help.c:450 +#: help.c:429 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3548,7 +3649,23 @@ msgstr "" " SERVER_VERSION_NUM\n" " version du serveur (chaîne courte ou format numérique)\n" -#: help.c:453 +#: help.c:432 +msgid "" +" SHELL_ERROR\n" +" \"true\" if the last shell command failed, \"false\" if it succeeded\n" +msgstr "" +" SHELL_ERROR\n" +" true si la dernière requête a échoué, sinon false\n" + +#: help.c:434 +msgid "" +" SHELL_EXIT_CODE\n" +" exit status of the last shell command\n" +msgstr "" +" SHELL_EXIT_CODE\n" +" code de sortie de la dernière commande shell\n" + +#: help.c:436 msgid "" " SHOW_ALL_RESULTS\n" " show all results of a combined query (\\;) instead of only the last\n" @@ -3556,7 +3673,7 @@ msgstr "" " SHOW_ALL_RESULTS\n" " affiche tous les résultats d'une requête combinée (\\;) au lieu du dernier uniquement\n" -#: help.c:455 +#: help.c:438 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3564,7 +3681,7 @@ msgstr "" " SHOW_CONTEXT\n" " contrôle l'affichage des champs de contexte du message [never, errors, always]\n" -#: help.c:457 +#: help.c:440 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3572,7 +3689,7 @@ msgstr "" " SINGLELINE\n" " une fin de ligne termine le mode de commande SQL (identique à l'option -S)\n" -#: help.c:459 +#: help.c:442 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3580,7 +3697,7 @@ msgstr "" " SINGLESTEP\n" " mode pas à pas (identique à l'option -s)\n" -#: help.c:461 +#: help.c:444 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3588,7 +3705,7 @@ msgstr "" " SQLSTATE\n" " SQLSTATE de la dernière requête, ou \"00000\" si aucune erreur\n" -#: help.c:463 +#: help.c:446 msgid "" " USER\n" " the currently connected database user\n" @@ -3596,7 +3713,7 @@ msgstr "" " USER\n" " l'utilisateur actuellement connecté\n" -#: help.c:465 +#: help.c:448 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3604,7 +3721,7 @@ msgstr "" " VERBOSITY\n" " contrôle la verbosité des rapports d'erreurs [default, verbose, terse, sqlstate]\n" -#: help.c:467 +#: help.c:450 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3616,7 +3733,7 @@ msgstr "" " VERSION_NUM\n" " version de psql (chaîne longue, chaîne courte, ou format numérique)\n" -#: help.c:472 +#: help.c:455 msgid "" "\n" "Display settings:\n" @@ -3624,7 +3741,7 @@ msgstr "" "\n" "Paramètres d'affichage :\n" -#: help.c:474 +#: help.c:457 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3634,7 +3751,7 @@ msgstr "" " ou \\pset NOM [VALEUR] dans psql\n" "\n" -#: help.c:476 +#: help.c:459 msgid "" " border\n" " border style (number)\n" @@ -3642,7 +3759,7 @@ msgstr "" " border\n" " style de bordure (nombre)\n" -#: help.c:478 +#: help.c:461 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3650,7 +3767,7 @@ msgstr "" " columns\n" " largeur cible pour le format encadré\n" -#: help.c:480 +#: help.c:463 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3658,7 +3775,7 @@ msgstr "" " expanded (ou x)\n" " sortie étendue [on, off, auto]\n" -#: help.c:482 +#: help.c:465 #, c-format msgid "" " fieldsep\n" @@ -3667,7 +3784,7 @@ msgstr "" " fieldsep\n" " champ séparateur pour l'affichage non aligné (par défaut « %s »)\n" -#: help.c:485 +#: help.c:468 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3675,7 +3792,7 @@ msgstr "" " fieldsep_zero\n" " configure le séparateur de champ pour l'affichage non alignée à l'octet zéro\n" -#: help.c:487 +#: help.c:470 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3683,7 +3800,7 @@ msgstr "" " footer\n" " active ou désactive l'affiche du bas de tableau [on, off]\n" -#: help.c:489 +#: help.c:472 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3691,7 +3808,7 @@ msgstr "" " format\n" " active le format de sortie [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:491 +#: help.c:474 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3699,7 +3816,7 @@ msgstr "" " linestyle\n" " configure l'affichage des lignes de bordure [ascii, old-ascii, unicode]\n" -#: help.c:493 +#: help.c:476 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3707,7 +3824,7 @@ msgstr "" " null\n" " configure la chaîne à afficher à la place d'une valeur NULL\n" -#: help.c:495 +#: help.c:478 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3716,7 +3833,7 @@ msgstr "" " active ou désactive l'affichage d'un caractère spécifique à la locale pour séparer\n" " des groupes de chiffres [on, off]\n" -#: help.c:497 +#: help.c:480 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3724,7 +3841,7 @@ msgstr "" " pager\n" " contrôle quand un paginateur externe est utilisé [yes, no, always]\n" -#: help.c:499 +#: help.c:482 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3732,7 +3849,7 @@ msgstr "" " recordsep\n" " enregistre le séparateur de ligne pour les affichages non alignés\n" -#: help.c:501 +#: help.c:484 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3741,7 +3858,7 @@ msgstr "" " initialise le séparateur d'enregistrements pour un affichage\n" " non aligné à l'octet zéro\n" -#: help.c:503 +#: help.c:486 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3752,7 +3869,7 @@ msgstr "" " proportionnelles de colonnes pour les types de données alignés à gauche dans le\n" " format latex-longtable\n" -#: help.c:506 +#: help.c:489 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3760,7 +3877,7 @@ msgstr "" " title\n" " configure le titre de la table pour toute table affichée\n" -#: help.c:508 +#: help.c:491 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3768,7 +3885,7 @@ msgstr "" " tuples_only\n" " si activé, seules les données de la table sont affichées\n" -#: help.c:510 +#: help.c:493 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3780,7 +3897,17 @@ msgstr "" " unicode_header_linestyle\n" " configure le style d'affichage de ligne Unicode [single, double]\n" -#: help.c:515 +#: help.c:497 +msgid "" +" xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr "" +" xheader_width\n" +" configure la largeur maximale de l'entête dans le format étendu\n" +" [full, column, page, valeur entière]\n" + +#: help.c:501 msgid "" "\n" "Environment variables:\n" @@ -3788,7 +3915,7 @@ msgstr "" "\n" "Variables d'environnement :\n" -#: help.c:519 +#: help.c:505 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3798,7 +3925,7 @@ msgstr "" " ou \\setenv NOM [VALEUR] dans psql\n" "\n" -#: help.c:521 +#: help.c:507 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3810,7 +3937,7 @@ msgstr "" " ou \\setenv NOM [VALEUR] dans psql\n" "\n" -#: help.c:524 +#: help.c:510 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3818,7 +3945,7 @@ msgstr "" " COLUMNS\n" " nombre de colonnes pour le format encadré\n" -#: help.c:526 +#: help.c:512 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3826,7 +3953,7 @@ msgstr "" " PGAPPNAME\n" " identique au paramètre de connexion application_name\n" -#: help.c:528 +#: help.c:514 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3834,7 +3961,7 @@ msgstr "" " PGDATABASE\n" " identique au paramètre de connexion dbname\n" -#: help.c:530 +#: help.c:516 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3842,7 +3969,7 @@ msgstr "" " PGHOST\n" " identique au paramètre de connexion host\n" -#: help.c:532 +#: help.c:518 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3850,7 +3977,7 @@ msgstr "" " PGPASSFILE\n" " nom du fichier de mot de passe\n" -#: help.c:534 +#: help.c:520 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -3858,7 +3985,7 @@ msgstr "" " PGPASSWORD\n" " mot de passe de connexion (non recommendé)\n" -#: help.c:536 +#: help.c:522 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3866,7 +3993,7 @@ msgstr "" " PGPORT\n" " identique au paramètre de connexion port\n" -#: help.c:538 +#: help.c:524 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3874,7 +4001,7 @@ msgstr "" " PGUSER\n" " identique au paramètre de connexion user\n" -#: help.c:540 +#: help.c:526 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3882,7 +4009,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " éditeur utilisé par les commandes \\e, \\ef et \\ev\n" -#: help.c:542 +#: help.c:528 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3890,7 +4017,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " comment spécifier un numéro de ligne lors de l'appel de l'éditeur\n" -#: help.c:544 +#: help.c:530 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -3898,7 +4025,7 @@ msgstr "" " PSQL_HISTORY\n" " autre emplacement pour le fichier d'historique des commandes\n" -#: help.c:546 +#: help.c:532 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -3906,7 +4033,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " nom du paginateur externe\n" -#: help.c:549 +#: help.c:535 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" @@ -3914,7 +4041,7 @@ msgstr "" " PSQL_WATCH_PAGER\n" " nom du paginateur externe utilisé pour \\watch\n" -#: help.c:552 +#: help.c:538 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -3922,7 +4049,7 @@ msgstr "" " PSQLRC\n" " autre emplacement pour le fichier .psqlrc de l'utilisateur\n" -#: help.c:554 +#: help.c:540 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -3930,7 +4057,7 @@ msgstr "" " SHELL\n" " shell utilisé par la commande \\!\n" -#: help.c:556 +#: help.c:542 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -3938,11 +4065,11 @@ msgstr "" " TMPDIR\n" " répertoire pour les fichiers temporaires\n" -#: help.c:616 +#: help.c:602 msgid "Available help:\n" msgstr "Aide-mémoire disponible :\n" -#: help.c:711 +#: help.c:697 #, c-format msgid "" "Command: %s\n" @@ -3961,7 +4088,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:734 +#: help.c:720 #, c-format msgid "" "No help available for \"%s\".\n" @@ -3970,17 +4097,17 @@ msgstr "" "Aucun aide-mémoire disponible pour « %s ».\n" "Essayez \\h sans arguments pour afficher les aide-mémoires disponibles.\n" -#: input.c:217 +#: input.c:215 #, c-format msgid "could not read from input file: %m" msgstr "n'a pas pu lire à partir du fichier en entrée : %m" -#: input.c:478 input.c:516 +#: input.c:476 input.c:514 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "n'a pas pu sauvegarder l'historique dans le fichier « %s » : %m" -#: input.c:535 +#: input.c:533 #, c-format msgid "history is not supported by this installation" msgstr "l'historique n'est pas supportée par cette installation" @@ -4068,12 +4195,12 @@ msgstr "requête ignorée ; utilisez \\endif ou Ctrl-C pour quitter le bloc \\if msgid "reached EOF without finding closing \\endif(s)" msgstr "a atteint EOF sans trouver le(s) \\endif fermant" -#: psqlscanslash.l:638 +#: psqlscanslash.l:642 #, c-format msgid "unterminated quoted string" msgstr "chaîne entre guillemets non terminée" -#: psqlscanslash.l:811 +#: psqlscanslash.l:842 #, c-format msgid "%s: out of memory" msgstr "%s : mémoire épuisée" @@ -4081,2416 +4208,2453 @@ msgstr "%s : mémoire épuisée" #: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 #: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 #: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 -#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238 -#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248 -#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267 -#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323 -#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443 -#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524 -#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595 -#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606 -#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668 -#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714 -#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747 -#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802 -#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900 -#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999 -#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 -#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071 -#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086 -#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116 -#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141 -#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 -#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163 -#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310 -#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320 -#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445 -#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486 -#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507 -#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523 -#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548 -#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577 -#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 -#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687 -#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696 -#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996 -#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 -#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 -#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 -#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 -#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 -#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 -#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 -#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 -#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 -#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 -#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 -#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 -#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 -#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 -#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 -#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 -#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 -#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 -#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 -#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 -#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687 -#: sql_help.c:4735 sql_help.c:4893 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:245 +#: sql_help.c:247 sql_help.c:248 sql_help.c:250 sql_help.c:252 sql_help.c:255 +#: sql_help.c:257 sql_help.c:259 sql_help.c:261 sql_help.c:276 sql_help.c:277 +#: sql_help.c:278 sql_help.c:280 sql_help.c:329 sql_help.c:331 sql_help.c:333 +#: sql_help.c:335 sql_help.c:404 sql_help.c:409 sql_help.c:411 sql_help.c:453 +#: sql_help.c:455 sql_help.c:458 sql_help.c:460 sql_help.c:529 sql_help.c:534 +#: sql_help.c:539 sql_help.c:544 sql_help.c:549 sql_help.c:603 sql_help.c:605 +#: sql_help.c:607 sql_help.c:609 sql_help.c:611 sql_help.c:614 sql_help.c:616 +#: sql_help.c:619 sql_help.c:630 sql_help.c:632 sql_help.c:676 sql_help.c:678 +#: sql_help.c:680 sql_help.c:683 sql_help.c:685 sql_help.c:687 sql_help.c:728 +#: sql_help.c:732 sql_help.c:736 sql_help.c:757 sql_help.c:760 sql_help.c:763 +#: sql_help.c:792 sql_help.c:804 sql_help.c:812 sql_help.c:815 sql_help.c:818 +#: sql_help.c:833 sql_help.c:836 sql_help.c:865 sql_help.c:870 sql_help.c:875 +#: sql_help.c:880 sql_help.c:885 sql_help.c:912 sql_help.c:914 sql_help.c:916 +#: sql_help.c:918 sql_help.c:921 sql_help.c:923 sql_help.c:970 sql_help.c:1015 +#: sql_help.c:1020 sql_help.c:1025 sql_help.c:1030 sql_help.c:1035 +#: sql_help.c:1054 sql_help.c:1065 sql_help.c:1067 sql_help.c:1087 +#: sql_help.c:1097 sql_help.c:1098 sql_help.c:1100 sql_help.c:1102 +#: sql_help.c:1114 sql_help.c:1118 sql_help.c:1120 sql_help.c:1132 +#: sql_help.c:1134 sql_help.c:1136 sql_help.c:1138 sql_help.c:1157 +#: sql_help.c:1159 sql_help.c:1163 sql_help.c:1167 sql_help.c:1171 +#: sql_help.c:1174 sql_help.c:1175 sql_help.c:1176 sql_help.c:1179 +#: sql_help.c:1182 sql_help.c:1184 sql_help.c:1324 sql_help.c:1326 +#: sql_help.c:1329 sql_help.c:1332 sql_help.c:1334 sql_help.c:1336 +#: sql_help.c:1339 sql_help.c:1342 sql_help.c:1464 sql_help.c:1466 +#: sql_help.c:1468 sql_help.c:1471 sql_help.c:1492 sql_help.c:1495 +#: sql_help.c:1498 sql_help.c:1501 sql_help.c:1505 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1525 sql_help.c:1528 +#: sql_help.c:1530 sql_help.c:1532 sql_help.c:1542 sql_help.c:1544 +#: sql_help.c:1554 sql_help.c:1556 sql_help.c:1566 sql_help.c:1569 +#: sql_help.c:1592 sql_help.c:1594 sql_help.c:1596 sql_help.c:1598 +#: sql_help.c:1601 sql_help.c:1603 sql_help.c:1606 sql_help.c:1609 +#: sql_help.c:1660 sql_help.c:1703 sql_help.c:1706 sql_help.c:1708 +#: sql_help.c:1710 sql_help.c:1713 sql_help.c:1715 sql_help.c:1717 +#: sql_help.c:1720 sql_help.c:1770 sql_help.c:1786 sql_help.c:2019 +#: sql_help.c:2088 sql_help.c:2107 sql_help.c:2120 sql_help.c:2178 +#: sql_help.c:2186 sql_help.c:2196 sql_help.c:2224 sql_help.c:2257 +#: sql_help.c:2275 sql_help.c:2303 sql_help.c:2414 sql_help.c:2460 +#: sql_help.c:2485 sql_help.c:2508 sql_help.c:2512 sql_help.c:2546 +#: sql_help.c:2566 sql_help.c:2588 sql_help.c:2602 sql_help.c:2623 +#: sql_help.c:2652 sql_help.c:2685 sql_help.c:2708 sql_help.c:2755 +#: sql_help.c:3053 sql_help.c:3066 sql_help.c:3083 sql_help.c:3099 +#: sql_help.c:3139 sql_help.c:3193 sql_help.c:3197 sql_help.c:3199 +#: sql_help.c:3206 sql_help.c:3225 sql_help.c:3252 sql_help.c:3287 +#: sql_help.c:3299 sql_help.c:3308 sql_help.c:3352 sql_help.c:3366 +#: sql_help.c:3394 sql_help.c:3402 sql_help.c:3414 sql_help.c:3424 +#: sql_help.c:3432 sql_help.c:3440 sql_help.c:3448 sql_help.c:3456 +#: sql_help.c:3465 sql_help.c:3476 sql_help.c:3484 sql_help.c:3492 +#: sql_help.c:3500 sql_help.c:3508 sql_help.c:3518 sql_help.c:3527 +#: sql_help.c:3536 sql_help.c:3544 sql_help.c:3554 sql_help.c:3565 +#: sql_help.c:3573 sql_help.c:3582 sql_help.c:3593 sql_help.c:3602 +#: sql_help.c:3610 sql_help.c:3618 sql_help.c:3626 sql_help.c:3634 +#: sql_help.c:3642 sql_help.c:3650 sql_help.c:3658 sql_help.c:3666 +#: sql_help.c:3674 sql_help.c:3682 sql_help.c:3699 sql_help.c:3708 +#: sql_help.c:3716 sql_help.c:3733 sql_help.c:3748 sql_help.c:4061 +#: sql_help.c:4182 sql_help.c:4211 sql_help.c:4227 sql_help.c:4229 +#: sql_help.c:4733 sql_help.c:4781 sql_help.c:4940 msgid "name" msgstr "nom" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 -#: sql_help.c:3339 sql_help.c:4455 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:340 sql_help.c:1863 +#: sql_help.c:3367 sql_help.c:4500 msgid "aggregate_signature" msgstr "signature_agrégat" -#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253 -#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576 -#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798 -#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008 -#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105 -#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444 -#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534 -#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:260 +#: sql_help.c:281 sql_help.c:412 sql_help.c:459 sql_help.c:538 sql_help.c:586 +#: sql_help.c:604 sql_help.c:631 sql_help.c:684 sql_help.c:759 sql_help.c:814 +#: sql_help.c:835 sql_help.c:874 sql_help.c:924 sql_help.c:971 sql_help.c:1024 +#: sql_help.c:1056 sql_help.c:1066 sql_help.c:1101 sql_help.c:1121 +#: sql_help.c:1135 sql_help.c:1185 sql_help.c:1333 sql_help.c:1465 +#: sql_help.c:1508 sql_help.c:1529 sql_help.c:1543 sql_help.c:1555 +#: sql_help.c:1568 sql_help.c:1595 sql_help.c:1661 sql_help.c:1714 msgid "new_name" msgstr "nouveau_nom" -#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251 -#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623 -#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801 -#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 -#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 -#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510 -#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:258 +#: sql_help.c:279 sql_help.c:410 sql_help.c:495 sql_help.c:543 sql_help.c:633 +#: sql_help.c:642 sql_help.c:707 sql_help.c:731 sql_help.c:762 sql_help.c:817 +#: sql_help.c:879 sql_help.c:922 sql_help.c:1029 sql_help.c:1068 +#: sql_help.c:1099 sql_help.c:1119 sql_help.c:1133 sql_help.c:1183 +#: sql_help.c:1399 sql_help.c:1467 sql_help.c:1510 sql_help.c:1531 +#: sql_help.c:1593 sql_help.c:1709 sql_help.c:3039 msgid "new_owner" msgstr "nouveau_propriétaire" -#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322 -#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749 -#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087 -#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512 -#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:262 sql_help.c:332 +#: sql_help.c:461 sql_help.c:548 sql_help.c:686 sql_help.c:735 sql_help.c:765 +#: sql_help.c:820 sql_help.c:884 sql_help.c:1034 sql_help.c:1103 +#: sql_help.c:1137 sql_help.c:1335 sql_help.c:1512 sql_help.c:1533 +#: sql_help.c:1545 sql_help.c:1557 sql_help.c:1597 sql_help.c:1716 msgid "new_schema" msgstr "nouveau_schéma" -#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484 +#: sql_help.c:44 sql_help.c:1927 sql_help.c:3368 sql_help.c:4529 msgid "where aggregate_signature is:" msgstr "où signature_agrégat est :" -#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353 -#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520 -#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 -#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 -#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 -#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911 -#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085 -#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 -#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 -#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 -#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 -#: sql_help.c:4491 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:350 sql_help.c:363 +#: sql_help.c:367 sql_help.c:383 sql_help.c:386 sql_help.c:389 sql_help.c:530 +#: sql_help.c:535 sql_help.c:540 sql_help.c:545 sql_help.c:550 sql_help.c:866 +#: sql_help.c:871 sql_help.c:876 sql_help.c:881 sql_help.c:886 sql_help.c:1016 +#: sql_help.c:1021 sql_help.c:1026 sql_help.c:1031 sql_help.c:1036 +#: sql_help.c:1881 sql_help.c:1898 sql_help.c:1904 sql_help.c:1928 +#: sql_help.c:1931 sql_help.c:1934 sql_help.c:2089 sql_help.c:2108 +#: sql_help.c:2111 sql_help.c:2415 sql_help.c:2624 sql_help.c:3369 +#: sql_help.c:3372 sql_help.c:3375 sql_help.c:3466 sql_help.c:3555 +#: sql_help.c:3583 sql_help.c:3936 sql_help.c:4399 sql_help.c:4506 +#: sql_help.c:4513 sql_help.c:4519 sql_help.c:4530 sql_help.c:4533 +#: sql_help.c:4536 msgid "argmode" msgstr "mode_argument" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354 -#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 -#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 -#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 -#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 -#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912 -#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086 -#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 -#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 -#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 -#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:351 sql_help.c:364 +#: sql_help.c:368 sql_help.c:384 sql_help.c:387 sql_help.c:390 sql_help.c:531 +#: sql_help.c:536 sql_help.c:541 sql_help.c:546 sql_help.c:551 sql_help.c:867 +#: sql_help.c:872 sql_help.c:877 sql_help.c:882 sql_help.c:887 sql_help.c:1017 +#: sql_help.c:1022 sql_help.c:1027 sql_help.c:1032 sql_help.c:1037 +#: sql_help.c:1882 sql_help.c:1899 sql_help.c:1905 sql_help.c:1929 +#: sql_help.c:1932 sql_help.c:1935 sql_help.c:2090 sql_help.c:2109 +#: sql_help.c:2112 sql_help.c:2416 sql_help.c:2625 sql_help.c:3370 +#: sql_help.c:3373 sql_help.c:3376 sql_help.c:3467 sql_help.c:3556 +#: sql_help.c:3584 sql_help.c:4507 sql_help.c:4514 sql_help.c:4520 +#: sql_help.c:4531 sql_help.c:4534 sql_help.c:4537 msgid "argname" msgstr "nom_agrégat" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355 -#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 -#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 -#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 -#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 -#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 -#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597 -#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 -#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 -#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:352 sql_help.c:365 +#: sql_help.c:369 sql_help.c:385 sql_help.c:388 sql_help.c:391 sql_help.c:532 +#: sql_help.c:537 sql_help.c:542 sql_help.c:547 sql_help.c:552 sql_help.c:868 +#: sql_help.c:873 sql_help.c:878 sql_help.c:883 sql_help.c:888 sql_help.c:1018 +#: sql_help.c:1023 sql_help.c:1028 sql_help.c:1033 sql_help.c:1038 +#: sql_help.c:1883 sql_help.c:1900 sql_help.c:1906 sql_help.c:1930 +#: sql_help.c:1933 sql_help.c:1936 sql_help.c:2417 sql_help.c:2626 +#: sql_help.c:3371 sql_help.c:3374 sql_help.c:3377 sql_help.c:3468 +#: sql_help.c:3557 sql_help.c:3585 sql_help.c:4508 sql_help.c:4515 +#: sql_help.c:4521 sql_help.c:4532 sql_help.c:4535 sql_help.c:4538 msgid "argtype" msgstr "type_argument" -#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 -#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666 -#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974 -#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 -#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 -#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 -#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956 +#: sql_help.c:114 sql_help.c:407 sql_help.c:484 sql_help.c:496 sql_help.c:965 +#: sql_help.c:1116 sql_help.c:1526 sql_help.c:1655 sql_help.c:1687 +#: sql_help.c:1739 sql_help.c:1798 sql_help.c:1987 sql_help.c:1994 +#: sql_help.c:2306 sql_help.c:2356 sql_help.c:2363 sql_help.c:2372 +#: sql_help.c:2461 sql_help.c:2686 sql_help.c:2777 sql_help.c:3068 +#: sql_help.c:3253 sql_help.c:3275 sql_help.c:3415 sql_help.c:3772 +#: sql_help.c:3980 sql_help.c:4226 sql_help.c:4228 sql_help.c:5006 msgid "option" msgstr "option" -#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 -#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 +#: sql_help.c:115 sql_help.c:966 sql_help.c:1656 sql_help.c:2462 +#: sql_help.c:2687 sql_help.c:3254 sql_help.c:3416 msgid "where option can be:" msgstr "où option peut être :" -#: sql_help.c:116 sql_help.c:2209 +#: sql_help.c:116 sql_help.c:2238 msgid "allowconn" msgstr "allowconn" -#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 -#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 +#: sql_help.c:117 sql_help.c:967 sql_help.c:1657 sql_help.c:2239 +#: sql_help.c:2463 sql_help.c:2688 sql_help.c:3255 msgid "connlimit" msgstr "limite_de_connexion" -#: sql_help.c:118 sql_help.c:2211 +#: sql_help.c:118 sql_help.c:2240 msgid "istemplate" msgstr "istemplate" -#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322 -#: sql_help.c:1374 sql_help.c:4187 +#: sql_help.c:124 sql_help.c:621 sql_help.c:689 sql_help.c:703 sql_help.c:1338 +#: sql_help.c:1392 sql_help.c:4232 msgid "new_tablespace" msgstr "nouveau_tablespace" -#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550 -#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 -#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 -#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643 -#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601 -#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:558 sql_help.c:560 +#: sql_help.c:561 sql_help.c:891 sql_help.c:893 sql_help.c:894 sql_help.c:974 +#: sql_help.c:978 sql_help.c:981 sql_help.c:1043 sql_help.c:1045 +#: sql_help.c:1046 sql_help.c:1196 sql_help.c:1198 sql_help.c:1664 +#: sql_help.c:1668 sql_help.c:1671 sql_help.c:2427 sql_help.c:2630 +#: sql_help.c:3948 sql_help.c:4250 sql_help.c:4411 sql_help.c:4721 msgid "configuration_parameter" msgstr "paramètre_configuration" -#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487 -#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876 -#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101 -#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157 -#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182 -#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449 -#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667 -#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 -#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 -#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 -#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 -#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 -#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676 -#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679 +#: sql_help.c:128 sql_help.c:408 sql_help.c:479 sql_help.c:485 sql_help.c:497 +#: sql_help.c:559 sql_help.c:613 sql_help.c:695 sql_help.c:705 sql_help.c:892 +#: sql_help.c:920 sql_help.c:975 sql_help.c:1044 sql_help.c:1117 +#: sql_help.c:1162 sql_help.c:1166 sql_help.c:1170 sql_help.c:1173 +#: sql_help.c:1178 sql_help.c:1181 sql_help.c:1197 sql_help.c:1371 +#: sql_help.c:1394 sql_help.c:1442 sql_help.c:1450 sql_help.c:1470 +#: sql_help.c:1527 sql_help.c:1611 sql_help.c:1665 sql_help.c:1688 +#: sql_help.c:2307 sql_help.c:2357 sql_help.c:2364 sql_help.c:2373 +#: sql_help.c:2428 sql_help.c:2429 sql_help.c:2493 sql_help.c:2496 +#: sql_help.c:2530 sql_help.c:2631 sql_help.c:2632 sql_help.c:2655 +#: sql_help.c:2778 sql_help.c:2817 sql_help.c:2927 sql_help.c:2940 +#: sql_help.c:2954 sql_help.c:2995 sql_help.c:3003 sql_help.c:3025 +#: sql_help.c:3042 sql_help.c:3069 sql_help.c:3276 sql_help.c:3981 +#: sql_help.c:4722 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 msgid "value" msgstr "valeur" -#: sql_help.c:200 +#: sql_help.c:202 msgid "target_role" msgstr "rôle_cible" -#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 -#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 -#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 -#: sql_help.c:4357 sql_help.c:4369 +#: sql_help.c:203 sql_help.c:929 sql_help.c:2291 sql_help.c:2660 +#: sql_help.c:2733 sql_help.c:2738 sql_help.c:3911 sql_help.c:3920 +#: sql_help.c:3939 sql_help.c:3951 sql_help.c:4374 sql_help.c:4383 +#: sql_help.c:4402 sql_help.c:4414 msgid "schema_name" msgstr "nom_schéma" -#: sql_help.c:202 +#: sql_help.c:204 msgid "abbreviated_grant_or_revoke" msgstr "grant_ou_revoke_raccourci" -#: sql_help.c:203 +#: sql_help.c:205 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "où abbreviated_grant_or_revoke fait partie de :" -#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 -#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 -#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 -#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438 -#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 -#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 -#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 -#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 -#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697 +#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 +#: sql_help.c:211 sql_help.c:212 sql_help.c:213 sql_help.c:214 sql_help.c:215 +#: sql_help.c:584 sql_help.c:620 sql_help.c:688 sql_help.c:838 sql_help.c:985 +#: sql_help.c:1337 sql_help.c:1675 sql_help.c:2466 sql_help.c:2467 +#: sql_help.c:2468 sql_help.c:2469 sql_help.c:2470 sql_help.c:2604 +#: sql_help.c:2691 sql_help.c:2692 sql_help.c:2693 sql_help.c:3258 +#: sql_help.c:3259 sql_help.c:3260 sql_help.c:3261 sql_help.c:3262 +#: sql_help.c:3960 sql_help.c:3964 sql_help.c:4423 sql_help.c:4427 +#: sql_help.c:4743 msgid "role_name" msgstr "nom_rôle" -#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339 -#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684 -#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 -#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 -#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 -#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981 -#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088 -#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558 -#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608 -#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651 -#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806 -#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864 -#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921 -#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044 -#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102 -#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105 +#: sql_help.c:246 sql_help.c:265 sql_help.c:472 sql_help.c:928 sql_help.c:1353 +#: sql_help.c:1355 sql_help.c:1359 sql_help.c:1409 sql_help.c:1421 +#: sql_help.c:1446 sql_help.c:1705 sql_help.c:2260 sql_help.c:2264 +#: sql_help.c:2376 sql_help.c:2381 sql_help.c:2489 sql_help.c:2659 +#: sql_help.c:2794 sql_help.c:2799 sql_help.c:2801 sql_help.c:2922 +#: sql_help.c:2935 sql_help.c:2949 sql_help.c:2958 sql_help.c:2970 +#: sql_help.c:2999 sql_help.c:4012 sql_help.c:4027 sql_help.c:4029 +#: sql_help.c:4125 sql_help.c:4128 sql_help.c:4130 sql_help.c:4593 +#: sql_help.c:4594 sql_help.c:4603 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4652 sql_help.c:4653 sql_help.c:4654 sql_help.c:4655 +#: sql_help.c:4696 sql_help.c:4697 sql_help.c:4702 sql_help.c:4707 +#: sql_help.c:4851 sql_help.c:4852 sql_help.c:4861 sql_help.c:4908 +#: sql_help.c:4909 sql_help.c:4910 sql_help.c:4911 sql_help.c:4912 +#: sql_help.c:4913 sql_help.c:4968 sql_help.c:4970 sql_help.c:5036 +#: sql_help.c:5096 sql_help.c:5097 sql_help.c:5106 sql_help.c:5153 +#: sql_help.c:5154 sql_help.c:5155 sql_help.c:5156 sql_help.c:5157 +#: sql_help.c:5158 msgid "expression" msgstr "expression" -#: sql_help.c:242 +#: sql_help.c:249 sql_help.c:2261 msgid "domain_constraint" msgstr "contrainte_domaine" -#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 -#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363 -#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852 -#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351 -#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 +#: sql_help.c:251 sql_help.c:253 sql_help.c:256 sql_help.c:264 sql_help.c:487 +#: sql_help.c:488 sql_help.c:1330 sql_help.c:1379 sql_help.c:1380 +#: sql_help.c:1381 sql_help.c:1408 sql_help.c:1420 sql_help.c:1437 +#: sql_help.c:1869 sql_help.c:1871 sql_help.c:2263 sql_help.c:2375 +#: sql_help.c:2380 sql_help.c:2957 sql_help.c:2969 sql_help.c:4024 msgid "constraint_name" msgstr "nom_contrainte" -#: sql_help.c:247 sql_help.c:1315 +#: sql_help.c:254 sql_help.c:1331 msgid "new_constraint_name" msgstr "nouvelle_nom_contrainte" -#: sql_help.c:320 sql_help.c:1099 +#: sql_help.c:263 sql_help.c:2262 +msgid "where domain_constraint is:" +msgstr "où contrainte_domaine est :" + +#: sql_help.c:330 sql_help.c:1115 msgid "new_version" msgstr "nouvelle_version" -#: sql_help.c:324 sql_help.c:326 +#: sql_help.c:334 sql_help.c:336 msgid "member_object" msgstr "objet_membre" -#: sql_help.c:327 +#: sql_help.c:337 msgid "where member_object is:" msgstr "où objet_membre fait partie de :" -#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 -#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 -#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 -#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 -#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856 -#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 -#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869 -#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884 -#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894 -#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898 -#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 -#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456 -#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 -#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 -#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 -#: sql_help.c:4482 +#: sql_help.c:338 sql_help.c:343 sql_help.c:344 sql_help.c:345 sql_help.c:346 +#: sql_help.c:347 sql_help.c:348 sql_help.c:353 sql_help.c:357 sql_help.c:359 +#: sql_help.c:361 sql_help.c:370 sql_help.c:371 sql_help.c:372 sql_help.c:373 +#: sql_help.c:374 sql_help.c:375 sql_help.c:376 sql_help.c:377 sql_help.c:380 +#: sql_help.c:381 sql_help.c:1861 sql_help.c:1866 sql_help.c:1873 +#: sql_help.c:1874 sql_help.c:1875 sql_help.c:1876 sql_help.c:1877 +#: sql_help.c:1878 sql_help.c:1879 sql_help.c:1884 sql_help.c:1886 +#: sql_help.c:1890 sql_help.c:1892 sql_help.c:1896 sql_help.c:1901 +#: sql_help.c:1902 sql_help.c:1909 sql_help.c:1910 sql_help.c:1911 +#: sql_help.c:1912 sql_help.c:1913 sql_help.c:1914 sql_help.c:1915 +#: sql_help.c:1916 sql_help.c:1917 sql_help.c:1918 sql_help.c:1919 +#: sql_help.c:1924 sql_help.c:1925 sql_help.c:4496 sql_help.c:4501 +#: sql_help.c:4502 sql_help.c:4503 sql_help.c:4504 sql_help.c:4510 +#: sql_help.c:4511 sql_help.c:4516 sql_help.c:4517 sql_help.c:4522 +#: sql_help.c:4523 sql_help.c:4524 sql_help.c:4525 sql_help.c:4526 +#: sql_help.c:4527 msgid "object_name" msgstr "nom_objet" -#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454 +#: sql_help.c:339 sql_help.c:1862 sql_help.c:4499 msgid "aggregate_name" msgstr "nom_agrégat" -#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 -#: sql_help.c:2137 sql_help.c:3357 +#: sql_help.c:341 sql_help.c:1864 sql_help.c:2154 sql_help.c:2158 +#: sql_help.c:2160 sql_help.c:3385 msgid "source_type" msgstr "type_source" -#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 -#: sql_help.c:2138 sql_help.c:3358 +#: sql_help.c:342 sql_help.c:1865 sql_help.c:2155 sql_help.c:2159 +#: sql_help.c:2161 sql_help.c:3386 msgid "target_type" msgstr "type_cible" -#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 -#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 -#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577 -#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834 -#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072 -#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 +#: sql_help.c:349 sql_help.c:802 sql_help.c:1880 sql_help.c:2156 +#: sql_help.c:2199 sql_help.c:2279 sql_help.c:2547 sql_help.c:2578 +#: sql_help.c:3145 sql_help.c:4398 sql_help.c:4505 sql_help.c:4622 +#: sql_help.c:4626 sql_help.c:4630 sql_help.c:4633 sql_help.c:4880 +#: sql_help.c:4884 sql_help.c:4888 sql_help.c:4891 sql_help.c:5125 +#: sql_help.c:5129 sql_help.c:5133 sql_help.c:5136 msgid "function_name" msgstr "nom_fonction" -#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 +#: sql_help.c:354 sql_help.c:795 sql_help.c:1887 sql_help.c:2571 msgid "operator_name" msgstr "nom_opérateur" -#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 -#: sql_help.c:2519 sql_help.c:3481 +#: sql_help.c:355 sql_help.c:729 sql_help.c:733 sql_help.c:737 sql_help.c:1888 +#: sql_help.c:2548 sql_help.c:3509 msgid "left_type" msgstr "type_argument_gauche" -#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 -#: sql_help.c:2520 sql_help.c:3482 +#: sql_help.c:356 sql_help.c:730 sql_help.c:734 sql_help.c:738 sql_help.c:1889 +#: sql_help.c:2549 sql_help.c:3510 msgid "right_type" msgstr "type_argument_droit" -#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 -#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 -#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539 -#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 +#: sql_help.c:358 sql_help.c:360 sql_help.c:758 sql_help.c:761 sql_help.c:764 +#: sql_help.c:793 sql_help.c:805 sql_help.c:813 sql_help.c:816 sql_help.c:819 +#: sql_help.c:1426 sql_help.c:1891 sql_help.c:1893 sql_help.c:2568 +#: sql_help.c:2589 sql_help.c:2975 sql_help.c:3519 sql_help.c:3528 msgid "index_method" msgstr "méthode_indexage" -#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467 +#: sql_help.c:362 sql_help.c:1897 sql_help.c:4512 msgid "procedure_name" msgstr "nom_procédure" -#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473 +#: sql_help.c:366 sql_help.c:1903 sql_help.c:3935 sql_help.c:4518 msgid "routine_name" msgstr "nom_routine" -#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 -#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 -#: sql_help.c:3926 sql_help.c:4375 +#: sql_help.c:378 sql_help.c:1398 sql_help.c:1920 sql_help.c:2423 +#: sql_help.c:2629 sql_help.c:2930 sql_help.c:3112 sql_help.c:3690 +#: sql_help.c:3957 sql_help.c:4420 msgid "type_name" msgstr "nom_type" -#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 -#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 -#: sql_help.c:4360 +#: sql_help.c:379 sql_help.c:1921 sql_help.c:2422 sql_help.c:2628 +#: sql_help.c:3113 sql_help.c:3343 sql_help.c:3691 sql_help.c:3942 +#: sql_help.c:4405 msgid "lang_name" msgstr "nom_langage" -#: sql_help.c:372 +#: sql_help.c:382 msgid "and aggregate_signature is:" msgstr "et signature_agrégat est :" -#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 +#: sql_help.c:405 sql_help.c:2021 sql_help.c:2304 msgid "handler_function" msgstr "fonction_gestionnaire" -#: sql_help.c:396 sql_help.c:2276 +#: sql_help.c:406 sql_help.c:2305 msgid "validator_function" msgstr "fonction_validateur" -#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 -#: sql_help.c:1309 sql_help.c:1581 +#: sql_help.c:454 sql_help.c:533 sql_help.c:677 sql_help.c:869 sql_help.c:1019 +#: sql_help.c:1325 sql_help.c:1602 msgid "action" msgstr "action" -#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461 -#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470 -#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683 -#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080 -#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334 -#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 -#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349 -#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 -#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422 -#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683 -#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851 -#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984 -#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 -#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 -#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 -#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 -#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 -#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 -#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 -#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 -#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 -#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614 -#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877 -#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924 -#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117 +#: sql_help.c:456 sql_help.c:463 sql_help.c:467 sql_help.c:468 sql_help.c:471 +#: sql_help.c:473 sql_help.c:474 sql_help.c:475 sql_help.c:477 sql_help.c:480 +#: sql_help.c:482 sql_help.c:483 sql_help.c:681 sql_help.c:691 sql_help.c:693 +#: sql_help.c:696 sql_help.c:698 sql_help.c:699 sql_help.c:927 sql_help.c:1096 +#: sql_help.c:1327 sql_help.c:1345 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 sql_help.c:1358 +#: sql_help.c:1360 sql_help.c:1361 sql_help.c:1363 sql_help.c:1366 +#: sql_help.c:1367 sql_help.c:1369 sql_help.c:1372 sql_help.c:1374 +#: sql_help.c:1375 sql_help.c:1422 sql_help.c:1424 sql_help.c:1431 +#: sql_help.c:1440 sql_help.c:1445 sql_help.c:1452 sql_help.c:1453 +#: sql_help.c:1704 sql_help.c:1707 sql_help.c:1711 sql_help.c:1747 +#: sql_help.c:1868 sql_help.c:1984 sql_help.c:1990 sql_help.c:2004 +#: sql_help.c:2005 sql_help.c:2006 sql_help.c:2354 sql_help.c:2367 +#: sql_help.c:2420 sql_help.c:2488 sql_help.c:2494 sql_help.c:2527 +#: sql_help.c:2658 sql_help.c:2763 sql_help.c:2798 sql_help.c:2800 +#: sql_help.c:2912 sql_help.c:2921 sql_help.c:2931 sql_help.c:2934 +#: sql_help.c:2944 sql_help.c:2948 sql_help.c:2971 sql_help.c:2973 +#: sql_help.c:2980 sql_help.c:2993 sql_help.c:2998 sql_help.c:3005 +#: sql_help.c:3006 sql_help.c:3022 sql_help.c:3148 sql_help.c:3288 +#: sql_help.c:3914 sql_help.c:3915 sql_help.c:4011 sql_help.c:4026 +#: sql_help.c:4028 sql_help.c:4030 sql_help.c:4124 sql_help.c:4127 +#: sql_help.c:4129 sql_help.c:4131 sql_help.c:4377 sql_help.c:4378 +#: sql_help.c:4498 sql_help.c:4659 sql_help.c:4666 sql_help.c:4668 +#: sql_help.c:4917 sql_help.c:4924 sql_help.c:4926 sql_help.c:4967 +#: sql_help.c:4969 sql_help.c:4971 sql_help.c:5024 sql_help.c:5162 +#: sql_help.c:5169 sql_help.c:5171 msgid "column_name" msgstr "nom_colonne" -#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 +#: sql_help.c:457 sql_help.c:682 sql_help.c:1328 sql_help.c:1712 msgid "new_column_name" msgstr "nouvelle_nom_colonne" -#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 -#: sql_help.c:1328 sql_help.c:1591 +#: sql_help.c:462 sql_help.c:554 sql_help.c:690 sql_help.c:890 sql_help.c:1040 +#: sql_help.c:1344 sql_help.c:1612 msgid "where action is one of:" msgstr "où action fait partie de :" -#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330 -#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229 -#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 -#: sql_help.c:3167 sql_help.c:4141 +#: sql_help.c:464 sql_help.c:469 sql_help.c:1088 sql_help.c:1346 +#: sql_help.c:1351 sql_help.c:1614 sql_help.c:1618 sql_help.c:2258 +#: sql_help.c:2355 sql_help.c:2567 sql_help.c:2756 sql_help.c:2913 +#: sql_help.c:3195 sql_help.c:4183 msgid "data_type" msgstr "type_données" -#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336 -#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329 -#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 -#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 +#: sql_help.c:465 sql_help.c:470 sql_help.c:1347 sql_help.c:1352 +#: sql_help.c:1447 sql_help.c:1615 sql_help.c:1619 sql_help.c:2259 +#: sql_help.c:2358 sql_help.c:2490 sql_help.c:2915 sql_help.c:2923 +#: sql_help.c:2936 sql_help.c:2950 sql_help.c:3000 sql_help.c:3196 +#: sql_help.c:3202 sql_help.c:4021 msgid "collation" msgstr "collationnement" -#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 -#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 +#: sql_help.c:466 sql_help.c:1348 sql_help.c:2359 sql_help.c:2368 +#: sql_help.c:2916 sql_help.c:2932 sql_help.c:2945 msgid "column_constraint" msgstr "contrainte_colonne" -#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968 +#: sql_help.c:476 sql_help.c:618 sql_help.c:692 sql_help.c:1368 sql_help.c:5018 msgid "integer" msgstr "entier" -#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352 -#: sql_help.c:1355 +#: sql_help.c:478 sql_help.c:481 sql_help.c:694 sql_help.c:697 sql_help.c:1370 +#: sql_help.c:1373 msgid "attribute_option" msgstr "option_attribut" -#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 -#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 +#: sql_help.c:486 sql_help.c:1377 sql_help.c:2360 sql_help.c:2369 +#: sql_help.c:2917 sql_help.c:2933 sql_help.c:2946 msgid "table_constraint" msgstr "contrainte_table" -#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364 -#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905 +#: sql_help.c:489 sql_help.c:490 sql_help.c:491 sql_help.c:492 sql_help.c:1382 +#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:1922 msgid "trigger_name" msgstr "nom_trigger" -#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 -#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 +#: sql_help.c:493 sql_help.c:494 sql_help.c:1396 sql_help.c:1397 +#: sql_help.c:2361 sql_help.c:2366 sql_help.c:2920 sql_help.c:2943 msgid "parent_table" msgstr "table_parent" -#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 -#: sql_help.c:1550 sql_help.c:2261 +#: sql_help.c:553 sql_help.c:610 sql_help.c:679 sql_help.c:889 sql_help.c:1039 +#: sql_help.c:1571 sql_help.c:2290 msgid "extension_name" msgstr "nom_extension" -#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 +#: sql_help.c:555 sql_help.c:1041 sql_help.c:2424 msgid "execution_cost" msgstr "coût_exécution" -#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 +#: sql_help.c:556 sql_help.c:1042 sql_help.c:2425 msgid "result_rows" msgstr "lignes_de_résultat" -#: sql_help.c:547 sql_help.c:2397 +#: sql_help.c:557 sql_help.c:2426 msgid "support_function" msgstr "fonction_support" -#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 -#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641 -#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709 -#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 -#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 -#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896 -#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902 -#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912 -#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 -#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 -#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 -#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 -#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 -#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348 -#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358 -#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 -#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 -#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 -#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 +#: sql_help.c:579 sql_help.c:581 sql_help.c:964 sql_help.c:972 sql_help.c:976 +#: sql_help.c:979 sql_help.c:982 sql_help.c:1654 sql_help.c:1662 +#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1672 sql_help.c:2734 +#: sql_help.c:2736 sql_help.c:2739 sql_help.c:2740 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3917 sql_help.c:3918 sql_help.c:3921 +#: sql_help.c:3922 sql_help.c:3924 sql_help.c:3925 sql_help.c:3927 +#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3931 sql_help.c:3933 +#: sql_help.c:3934 sql_help.c:3940 sql_help.c:3941 sql_help.c:3943 +#: sql_help.c:3944 sql_help.c:3946 sql_help.c:3947 sql_help.c:3949 +#: sql_help.c:3950 sql_help.c:3952 sql_help.c:3953 sql_help.c:3955 +#: sql_help.c:3956 sql_help.c:3958 sql_help.c:3959 sql_help.c:3961 +#: sql_help.c:3962 sql_help.c:4375 sql_help.c:4376 sql_help.c:4380 +#: sql_help.c:4381 sql_help.c:4384 sql_help.c:4385 sql_help.c:4387 +#: sql_help.c:4388 sql_help.c:4390 sql_help.c:4391 sql_help.c:4393 +#: sql_help.c:4394 sql_help.c:4396 sql_help.c:4397 sql_help.c:4403 +#: sql_help.c:4404 sql_help.c:4406 sql_help.c:4407 sql_help.c:4409 +#: sql_help.c:4410 sql_help.c:4412 sql_help.c:4413 sql_help.c:4415 +#: sql_help.c:4416 sql_help.c:4418 sql_help.c:4419 sql_help.c:4421 +#: sql_help.c:4422 sql_help.c:4424 sql_help.c:4425 msgid "role_specification" msgstr "specification_role" -#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 -#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707 +#: sql_help.c:580 sql_help.c:582 sql_help.c:1685 sql_help.c:2225 +#: sql_help.c:2742 sql_help.c:3273 sql_help.c:3724 sql_help.c:4753 msgid "user_name" msgstr "nom_utilisateur" -#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 -#: sql_help.c:3932 sql_help.c:4381 +#: sql_help.c:583 sql_help.c:984 sql_help.c:1674 sql_help.c:2741 +#: sql_help.c:3963 sql_help.c:4426 msgid "where role_specification can be:" msgstr "où specification_role peut être :" -#: sql_help.c:575 +#: sql_help.c:585 msgid "group_name" msgstr "nom_groupe" -#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 -#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 -#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 -#: sql_help.c:4372 +#: sql_help.c:606 sql_help.c:1443 sql_help.c:2237 sql_help.c:2497 +#: sql_help.c:2531 sql_help.c:2928 sql_help.c:2941 sql_help.c:2955 +#: sql_help.c:2996 sql_help.c:3026 sql_help.c:3038 sql_help.c:3954 +#: sql_help.c:4417 msgid "tablespace_name" msgstr "nom_tablespace" -#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382 -#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783 +#: sql_help.c:608 sql_help.c:701 sql_help.c:1390 sql_help.c:1400 +#: sql_help.c:1438 sql_help.c:1800 msgid "index_name" msgstr "nom_index" -#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375 -#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500 -#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 -#: sql_help.c:2996 +#: sql_help.c:612 sql_help.c:615 sql_help.c:704 sql_help.c:706 sql_help.c:1393 +#: sql_help.c:1395 sql_help.c:1441 sql_help.c:2495 sql_help.c:2529 +#: sql_help.c:2926 sql_help.c:2939 sql_help.c:2953 sql_help.c:2994 +#: sql_help.c:3024 msgid "storage_parameter" msgstr "paramètre_stockage" -#: sql_help.c:607 +#: sql_help.c:617 msgid "column_number" msgstr "numéro_colonne" -#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464 +#: sql_help.c:641 sql_help.c:1885 sql_help.c:4509 msgid "large_object_oid" msgstr "oid_large_object" -#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 +#: sql_help.c:700 sql_help.c:1376 sql_help.c:2914 msgid "compression_method" msgstr "méthode_compression" -#: sql_help.c:692 sql_help.c:1373 +#: sql_help.c:702 sql_help.c:1391 msgid "new_access_method" msgstr "new_access_method" -#: sql_help.c:725 sql_help.c:2523 +#: sql_help.c:739 sql_help.c:2552 msgid "res_proc" msgstr "res_proc" -#: sql_help.c:726 sql_help.c:2524 +#: sql_help.c:740 sql_help.c:2553 msgid "join_proc" msgstr "join_proc" -#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 +#: sql_help.c:741 sql_help.c:2550 +msgid "com_op" +msgstr "com_op" + +#: sql_help.c:742 sql_help.c:2551 +msgid "neg_op" +msgstr "neg_op" + +#: sql_help.c:794 sql_help.c:806 sql_help.c:2570 msgid "strategy_number" msgstr "numéro_de_stratégie" -#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 -#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544 -#: sql_help.c:2547 sql_help.c:2548 +#: sql_help.c:796 sql_help.c:797 sql_help.c:800 sql_help.c:801 sql_help.c:807 +#: sql_help.c:808 sql_help.c:810 sql_help.c:811 sql_help.c:2572 sql_help.c:2573 +#: sql_help.c:2576 sql_help.c:2577 msgid "op_type" msgstr "type_op" -#: sql_help.c:782 sql_help.c:2545 +#: sql_help.c:798 sql_help.c:2574 msgid "sort_family_name" msgstr "nom_famille_tri" -#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 +#: sql_help.c:799 sql_help.c:809 sql_help.c:2575 msgid "support_number" msgstr "numéro_de_support" -#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 -#: sql_help.c:3089 +#: sql_help.c:803 sql_help.c:2157 sql_help.c:2579 sql_help.c:3115 +#: sql_help.c:3117 msgid "argument_type" msgstr "type_argument" -#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 -#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779 -#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891 -#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324 -#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 -#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 -#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 -#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 -#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885 -#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334 -#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627 -#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884 -#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060 -#: sql_help.c:5122 +#: sql_help.c:834 sql_help.c:837 sql_help.c:926 sql_help.c:1055 sql_help.c:1095 +#: sql_help.c:1567 sql_help.c:1570 sql_help.c:1746 sql_help.c:1799 +#: sql_help.c:1870 sql_help.c:1895 sql_help.c:1908 sql_help.c:1923 +#: sql_help.c:1983 sql_help.c:1989 sql_help.c:2353 sql_help.c:2365 +#: sql_help.c:2486 sql_help.c:2526 sql_help.c:2603 sql_help.c:2657 +#: sql_help.c:2710 sql_help.c:2762 sql_help.c:2795 sql_help.c:2802 +#: sql_help.c:2911 sql_help.c:2929 sql_help.c:2942 sql_help.c:3021 +#: sql_help.c:3141 sql_help.c:3322 sql_help.c:3545 sql_help.c:3594 +#: sql_help.c:3700 sql_help.c:3910 sql_help.c:3916 sql_help.c:3977 +#: sql_help.c:4009 sql_help.c:4373 sql_help.c:4379 sql_help.c:4497 +#: sql_help.c:4610 sql_help.c:4673 sql_help.c:4712 sql_help.c:4868 +#: sql_help.c:4931 sql_help.c:4965 sql_help.c:5023 sql_help.c:5113 +#: sql_help.c:5176 msgid "table_name" msgstr "nom_table" -#: sql_help.c:823 sql_help.c:2576 +#: sql_help.c:839 sql_help.c:2605 msgid "using_expression" msgstr "expression_using" -#: sql_help.c:824 sql_help.c:2577 +#: sql_help.c:840 sql_help.c:2606 msgid "check_expression" msgstr "expression_check" -#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +#: sql_help.c:913 sql_help.c:915 sql_help.c:917 sql_help.c:2653 msgid "publication_object" msgstr "objet_publication" -#: sql_help.c:903 sql_help.c:2625 +#: sql_help.c:919 sql_help.c:2654 msgid "publication_parameter" msgstr "paramètre_publication" -#: sql_help.c:909 sql_help.c:2627 +#: sql_help.c:925 sql_help.c:2656 msgid "where publication_object is one of:" msgstr "où publication_object fait partie de :" -#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 -#: sql_help.c:3228 +#: sql_help.c:968 sql_help.c:1658 sql_help.c:2464 sql_help.c:2689 +#: sql_help.c:3256 msgid "password" msgstr "mot_de_passe" -#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 -#: sql_help.c:3229 +#: sql_help.c:969 sql_help.c:1659 sql_help.c:2465 sql_help.c:2690 +#: sql_help.c:3257 msgid "timestamp" msgstr "horodatage" -#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642 -#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892 -#: sql_help.c:4341 +#: sql_help.c:973 sql_help.c:977 sql_help.c:980 sql_help.c:983 sql_help.c:1663 +#: sql_help.c:1667 sql_help.c:1670 sql_help.c:1673 sql_help.c:3923 +#: sql_help.c:4386 msgid "database_name" msgstr "nom_base_de_donnée" -#: sql_help.c:1073 sql_help.c:2732 +#: sql_help.c:1089 sql_help.c:2757 msgid "increment" msgstr "incrément" -#: sql_help.c:1074 sql_help.c:2733 +#: sql_help.c:1090 sql_help.c:2758 msgid "minvalue" msgstr "valeur_min" -#: sql_help.c:1075 sql_help.c:2734 +#: sql_help.c:1091 sql_help.c:2759 msgid "maxvalue" msgstr "valeur_max" -#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664 -#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 +#: sql_help.c:1092 sql_help.c:2760 sql_help.c:4606 sql_help.c:4710 +#: sql_help.c:4864 sql_help.c:5040 sql_help.c:5109 msgid "start" msgstr "début" -#: sql_help.c:1077 sql_help.c:1347 +#: sql_help.c:1093 sql_help.c:1365 msgid "restart" msgstr "nouveau_début" -#: sql_help.c:1078 sql_help.c:2736 +#: sql_help.c:1094 sql_help.c:2761 msgid "cache" msgstr "cache" -#: sql_help.c:1123 +#: sql_help.c:1139 msgid "new_target" msgstr "nouvelle_cible" -#: sql_help.c:1142 sql_help.c:2789 +#: sql_help.c:1158 sql_help.c:2814 msgid "conninfo" msgstr "conninfo" -#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 +#: sql_help.c:1160 sql_help.c:1164 sql_help.c:1168 sql_help.c:2815 msgid "publication_name" msgstr "nom_publication" -#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +#: sql_help.c:1161 sql_help.c:1165 sql_help.c:1169 msgid "publication_option" msgstr "option_publication" -#: sql_help.c:1156 +#: sql_help.c:1172 msgid "refresh_option" msgstr "option_rafraichissement" -#: sql_help.c:1161 sql_help.c:2791 +#: sql_help.c:1177 sql_help.c:2816 msgid "subscription_parameter" msgstr "paramètre_souscription" -#: sql_help.c:1164 +#: sql_help.c:1180 msgid "skip_option" msgstr "option_skip" -#: sql_help.c:1324 sql_help.c:1327 +#: sql_help.c:1340 sql_help.c:1343 msgid "partition_name" msgstr "nom_partition" -#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 +#: sql_help.c:1341 sql_help.c:2370 sql_help.c:2947 msgid "partition_bound_spec" msgstr "spec_limite_partition" -#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 +#: sql_help.c:1362 sql_help.c:1412 sql_help.c:2961 msgid "sequence_options" msgstr "options_séquence" -#: sql_help.c:1346 +#: sql_help.c:1364 msgid "sequence_option" msgstr "option_séquence" -#: sql_help.c:1360 +#: sql_help.c:1378 msgid "table_constraint_using_index" msgstr "contrainte_table_utilisant_index" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 +#: sql_help.c:1386 sql_help.c:1387 sql_help.c:1388 sql_help.c:1389 msgid "rewrite_rule_name" msgstr "nom_règle_réécriture" -#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 +#: sql_help.c:1401 sql_help.c:2382 sql_help.c:2986 msgid "and partition_bound_spec is:" msgstr "et partition_bound_spec est :" -#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 -#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 -#: sql_help.c:2964 +#: sql_help.c:1402 sql_help.c:1403 sql_help.c:1404 sql_help.c:2383 +#: sql_help.c:2384 sql_help.c:2385 sql_help.c:2987 sql_help.c:2988 +#: sql_help.c:2989 msgid "partition_bound_expr" msgstr "expr_limite_partition" -#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 -#: sql_help.c:2965 sql_help.c:2966 +#: sql_help.c:1405 sql_help.c:1406 sql_help.c:2386 sql_help.c:2387 +#: sql_help.c:2990 sql_help.c:2991 msgid "numeric_literal" msgstr "numeric_literal" -#: sql_help.c:1389 +#: sql_help.c:1407 msgid "and column_constraint is:" msgstr "et contrainte_colonne est :" -#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 -#: sql_help.c:2934 +#: sql_help.c:1410 sql_help.c:2377 sql_help.c:2418 sql_help.c:2627 +#: sql_help.c:2959 msgid "default_expr" msgstr "expression_par_défaut" -#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 +#: sql_help.c:1411 sql_help.c:2378 sql_help.c:2960 msgid "generation_expr" msgstr "expression_génération" -#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 -#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 -#: sql_help.c:2949 sql_help.c:2953 +#: sql_help.c:1413 sql_help.c:1414 sql_help.c:1423 sql_help.c:1425 +#: sql_help.c:1429 sql_help.c:2962 sql_help.c:2963 sql_help.c:2972 +#: sql_help.c:2974 sql_help.c:2978 msgid "index_parameters" msgstr "paramètres_index" -#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 +#: sql_help.c:1415 sql_help.c:1432 sql_help.c:2964 sql_help.c:2981 msgid "reftable" msgstr "table_référence" -#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 +#: sql_help.c:1416 sql_help.c:1433 sql_help.c:2965 sql_help.c:2982 msgid "refcolumn" msgstr "colonne_référence" -#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 -#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 +#: sql_help.c:1417 sql_help.c:1418 sql_help.c:1434 sql_help.c:1435 +#: sql_help.c:2966 sql_help.c:2967 sql_help.c:2983 sql_help.c:2984 msgid "referential_action" msgstr "action" -#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 +#: sql_help.c:1419 sql_help.c:2379 sql_help.c:2968 msgid "and table_constraint is:" msgstr "et contrainte_table est :" -#: sql_help.c:1409 sql_help.c:2951 +#: sql_help.c:1427 sql_help.c:2976 msgid "exclude_element" msgstr "élément_exclusion" -#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662 -#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054 +#: sql_help.c:1428 sql_help.c:2977 sql_help.c:4604 sql_help.c:4708 +#: sql_help.c:4862 sql_help.c:5038 sql_help.c:5107 msgid "operator" msgstr "opérateur" -#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 +#: sql_help.c:1430 sql_help.c:2498 sql_help.c:2979 msgid "predicate" msgstr "prédicat" -#: sql_help.c:1418 +#: sql_help.c:1436 msgid "and table_constraint_using_index is:" msgstr "et contrainte_table_utilisant_index est :" -#: sql_help.c:1421 sql_help.c:2967 +#: sql_help.c:1439 sql_help.c:2992 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "dans les contraintes UNIQUE, PRIMARY KEY et EXCLUDE, les paramètres_index sont :" -#: sql_help.c:1426 sql_help.c:2972 +#: sql_help.c:1444 sql_help.c:2997 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "élément_exclusion dans une contrainte EXCLUDE est :" -#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 -#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 +#: sql_help.c:1448 sql_help.c:2491 sql_help.c:2924 sql_help.c:2937 +#: sql_help.c:2951 sql_help.c:3001 sql_help.c:4022 msgid "opclass" msgstr "classe_d_opérateur" -#: sql_help.c:1430 sql_help.c:2976 +#: sql_help.c:1449 sql_help.c:2492 sql_help.c:3002 +msgid "opclass_parameter" +msgstr "paramètre_opclass" + +#: sql_help.c:1451 sql_help.c:3004 msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" msgstr "referential_action dans une contrainte FOREIGN KEY/REFERENCES est :" -#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013 +#: sql_help.c:1469 sql_help.c:1472 sql_help.c:3041 msgid "tablespace_option" msgstr "option_tablespace" -#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 +#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1502 sql_help.c:1506 msgid "token_type" msgstr "type_jeton" -#: sql_help.c:1473 sql_help.c:1476 +#: sql_help.c:1494 sql_help.c:1497 msgid "dictionary_name" msgstr "nom_dictionnaire" -#: sql_help.c:1478 sql_help.c:1482 +#: sql_help.c:1499 sql_help.c:1503 msgid "old_dictionary" msgstr "ancien_dictionnaire" -#: sql_help.c:1479 sql_help.c:1483 +#: sql_help.c:1500 sql_help.c:1504 msgid "new_dictionary" msgstr "nouveau_dictionnaire" -#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 -#: sql_help.c:3166 +#: sql_help.c:1599 sql_help.c:1613 sql_help.c:1616 sql_help.c:1617 +#: sql_help.c:3194 msgid "attribute_name" msgstr "nom_attribut" -#: sql_help.c:1579 +#: sql_help.c:1600 msgid "new_attribute_name" msgstr "nouveau_nom_attribut" -#: sql_help.c:1583 sql_help.c:1587 +#: sql_help.c:1604 sql_help.c:1608 msgid "new_enum_value" msgstr "nouvelle_valeur_enum" -#: sql_help.c:1584 +#: sql_help.c:1605 msgid "neighbor_enum_value" msgstr "valeur_enum_voisine" -#: sql_help.c:1586 +#: sql_help.c:1607 msgid "existing_enum_value" msgstr "valeur_enum_existante" -#: sql_help.c:1589 +#: sql_help.c:1610 msgid "property" msgstr "propriété" -#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 -#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 -#: sql_help.c:4350 +#: sql_help.c:1686 sql_help.c:2362 sql_help.c:2371 sql_help.c:2773 +#: sql_help.c:3274 sql_help.c:3725 sql_help.c:3932 sql_help.c:3978 +#: sql_help.c:4395 msgid "server_name" msgstr "nom_serveur" -#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 +#: sql_help.c:1718 sql_help.c:1721 sql_help.c:3289 msgid "view_option_name" msgstr "nom_option_vue" -#: sql_help.c:1698 sql_help.c:3262 +#: sql_help.c:1719 sql_help.c:3290 msgid "view_option_value" msgstr "valeur_option_vue" -#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958 +#: sql_help.c:1740 sql_help.c:5007 msgid "table_and_columns" msgstr "table_et_colonnes" -#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 -#: sql_help.c:4185 sql_help.c:4959 +#: sql_help.c:1741 sql_help.c:1801 sql_help.c:1995 sql_help.c:3774 +#: sql_help.c:4230 sql_help.c:5008 msgid "where option can be one of:" msgstr "où option fait partie de :" -#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 -#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 -#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 -#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 -#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 -#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 +#: sql_help.c:1742 sql_help.c:1743 sql_help.c:1802 sql_help.c:1997 +#: sql_help.c:2001 sql_help.c:2183 sql_help.c:3775 sql_help.c:3776 +#: sql_help.c:3777 sql_help.c:3778 sql_help.c:3779 sql_help.c:3780 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:4231 sql_help.c:4233 sql_help.c:5009 sql_help.c:5010 +#: sql_help.c:5011 sql_help.c:5012 sql_help.c:5013 sql_help.c:5014 +#: sql_help.c:5015 sql_help.c:5016 sql_help.c:5017 sql_help.c:5019 +#: sql_help.c:5020 msgid "boolean" msgstr "boolean" -#: sql_help.c:1724 sql_help.c:4969 +#: sql_help.c:1744 sql_help.c:5021 +msgid "size" +msgstr "taille" + +#: sql_help.c:1745 sql_help.c:5022 msgid "and table_and_columns is:" msgstr "et table_et_colonnes est :" -#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749 +#: sql_help.c:1761 sql_help.c:4769 sql_help.c:4771 sql_help.c:4795 msgid "transaction_mode" msgstr "mode_transaction" -#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750 +#: sql_help.c:1762 sql_help.c:4772 sql_help.c:4796 msgid "where transaction_mode is one of:" msgstr "où mode_transaction fait partie de :" -#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582 -#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835 -#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064 -#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084 +#: sql_help.c:1771 sql_help.c:4614 sql_help.c:4623 sql_help.c:4627 +#: sql_help.c:4631 sql_help.c:4634 sql_help.c:4872 sql_help.c:4881 +#: sql_help.c:4885 sql_help.c:4889 sql_help.c:4892 sql_help.c:5117 +#: sql_help.c:5126 sql_help.c:5130 sql_help.c:5134 sql_help.c:5137 msgid "argument" msgstr "argument" -#: sql_help.c:1850 +#: sql_help.c:1867 msgid "relation_name" msgstr "nom_relation" -#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344 +#: sql_help.c:1872 sql_help.c:3926 sql_help.c:4389 msgid "domain_name" msgstr "nom_domaine" -#: sql_help.c:1877 +#: sql_help.c:1894 msgid "policy_name" msgstr "nom_politique" -#: sql_help.c:1890 +#: sql_help.c:1907 msgid "rule_name" msgstr "nom_règle" -#: sql_help.c:1909 sql_help.c:4483 +#: sql_help.c:1926 sql_help.c:4528 msgid "string_literal" msgstr "littéral_chaîne" -#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 +#: sql_help.c:1951 sql_help.c:4192 sql_help.c:4442 msgid "transaction_id" msgstr "id_transaction" -#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017 +#: sql_help.c:1985 sql_help.c:1992 sql_help.c:4048 msgid "filename" msgstr "nom_fichier" -#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 -#: sql_help.c:2689 +#: sql_help.c:1986 sql_help.c:1993 sql_help.c:2712 sql_help.c:2713 +#: sql_help.c:2714 msgid "command" msgstr "commande" -#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 -#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552 -#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809 -#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049 +#: sql_help.c:1988 sql_help.c:2711 sql_help.c:3144 sql_help.c:3325 +#: sql_help.c:4032 sql_help.c:4115 sql_help.c:4118 sql_help.c:4121 +#: sql_help.c:4597 sql_help.c:4599 sql_help.c:4701 sql_help.c:4703 +#: sql_help.c:4855 sql_help.c:4857 sql_help.c:4974 sql_help.c:5100 +#: sql_help.c:5102 msgid "condition" msgstr "condition" -#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 -#: sql_help.c:3281 sql_help.c:3982 +#: sql_help.c:1991 sql_help.c:2532 sql_help.c:3027 sql_help.c:3291 +#: sql_help.c:3309 sql_help.c:4013 msgid "query" msgstr "requête" -#: sql_help.c:1976 +#: sql_help.c:1996 msgid "format_name" msgstr "nom_format" -#: sql_help.c:1978 +#: sql_help.c:1998 msgid "delimiter_character" msgstr "caractère_délimiteur" -#: sql_help.c:1979 +#: sql_help.c:1999 msgid "null_string" msgstr "chaîne_null" -#: sql_help.c:1981 +#: sql_help.c:2000 +msgid "default_string" +msgstr "chaîne_par_défaut" + +#: sql_help.c:2002 msgid "quote_character" msgstr "caractère_guillemet" -#: sql_help.c:1982 +#: sql_help.c:2003 msgid "escape_character" msgstr "chaîne_d_échappement" -#: sql_help.c:1986 +#: sql_help.c:2007 +msgid "error_action" +msgstr "action_erreur" + +#: sql_help.c:2008 msgid "encoding_name" msgstr "nom_encodage" -#: sql_help.c:1997 +#: sql_help.c:2009 +msgid "verbosity" +msgstr "verbosité" + +#: sql_help.c:2020 msgid "access_method_type" msgstr "access_method_type" -#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 +#: sql_help.c:2091 sql_help.c:2110 sql_help.c:2113 msgid "arg_data_type" msgstr "type_données_arg" -#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 +#: sql_help.c:2092 sql_help.c:2114 sql_help.c:2122 msgid "sfunc" msgstr "sfunc" -#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 +#: sql_help.c:2093 sql_help.c:2115 sql_help.c:2123 msgid "state_data_type" msgstr "type_de_données_statut" -#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 +#: sql_help.c:2094 sql_help.c:2116 sql_help.c:2124 msgid "state_data_size" msgstr "taille_de_données_statut" -#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 +#: sql_help.c:2095 sql_help.c:2117 sql_help.c:2125 msgid "ffunc" msgstr "ffunc" -#: sql_help.c:2073 sql_help.c:2103 +#: sql_help.c:2096 sql_help.c:2126 msgid "combinefunc" msgstr "combinefunc" -#: sql_help.c:2074 sql_help.c:2104 +#: sql_help.c:2097 sql_help.c:2127 msgid "serialfunc" msgstr "serialfunc" -#: sql_help.c:2075 sql_help.c:2105 +#: sql_help.c:2098 sql_help.c:2128 msgid "deserialfunc" msgstr "deserialfunc" -#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 +#: sql_help.c:2099 sql_help.c:2118 sql_help.c:2129 msgid "initial_condition" msgstr "condition_initiale" -#: sql_help.c:2077 sql_help.c:2107 +#: sql_help.c:2100 sql_help.c:2130 msgid "msfunc" msgstr "msfunc" -#: sql_help.c:2078 sql_help.c:2108 +#: sql_help.c:2101 sql_help.c:2131 msgid "minvfunc" msgstr "minvfunc" -#: sql_help.c:2079 sql_help.c:2109 +#: sql_help.c:2102 sql_help.c:2132 msgid "mstate_data_type" msgstr "m_type_de_données_statut" -#: sql_help.c:2080 sql_help.c:2110 +#: sql_help.c:2103 sql_help.c:2133 msgid "mstate_data_size" msgstr "m_taille_de_données_statut" -#: sql_help.c:2081 sql_help.c:2111 +#: sql_help.c:2104 sql_help.c:2134 msgid "mffunc" msgstr "mffunc" -#: sql_help.c:2082 sql_help.c:2112 +#: sql_help.c:2105 sql_help.c:2135 msgid "minitial_condition" msgstr "m_condition_initiale" -#: sql_help.c:2083 sql_help.c:2113 +#: sql_help.c:2106 sql_help.c:2136 msgid "sort_operator" msgstr "opérateur_de_tri" -#: sql_help.c:2096 +#: sql_help.c:2119 msgid "or the old syntax" msgstr "ou l'ancienne syntaxe" -#: sql_help.c:2098 +#: sql_help.c:2121 msgid "base_type" msgstr "type_base" -#: sql_help.c:2155 sql_help.c:2202 +#: sql_help.c:2179 sql_help.c:2229 msgid "locale" msgstr "locale" -#: sql_help.c:2156 sql_help.c:2203 +#: sql_help.c:2180 sql_help.c:2230 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2157 sql_help.c:2204 +#: sql_help.c:2181 sql_help.c:2231 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2158 sql_help.c:4450 +#: sql_help.c:2182 sql_help.c:4495 msgid "provider" msgstr "fournisseur" -#: sql_help.c:2160 sql_help.c:2263 +#: sql_help.c:2184 +msgid "rules" +msgstr "règles" + +#: sql_help.c:2185 sql_help.c:2292 msgid "version" msgstr "version" -#: sql_help.c:2162 +#: sql_help.c:2187 msgid "existing_collation" msgstr "collationnement_existant" -#: sql_help.c:2172 +#: sql_help.c:2197 msgid "source_encoding" msgstr "encodage_source" -#: sql_help.c:2173 +#: sql_help.c:2198 msgid "dest_encoding" msgstr "encodage_destination" -#: sql_help.c:2199 sql_help.c:3039 +#: sql_help.c:2226 sql_help.c:3067 msgid "template" msgstr "modèle" -#: sql_help.c:2200 +#: sql_help.c:2227 msgid "encoding" msgstr "encodage" -#: sql_help.c:2201 +#: sql_help.c:2228 msgid "strategy" msgstr "stratégie" -#: sql_help.c:2205 +#: sql_help.c:2232 +msgid "builtin_locale" +msgstr "builtin_locale" + +#: sql_help.c:2233 msgid "icu_locale" msgstr "icu_locale" -#: sql_help.c:2206 +#: sql_help.c:2234 +msgid "icu_rules" +msgstr "règles_icu" + +#: sql_help.c:2235 msgid "locale_provider" msgstr "locale_provider" -#: sql_help.c:2207 +#: sql_help.c:2236 msgid "collation_version" msgstr "collation_version" -#: sql_help.c:2212 +#: sql_help.c:2241 msgid "oid" msgstr "oid" -#: sql_help.c:2232 -msgid "constraint" -msgstr "contrainte" - -#: sql_help.c:2233 -msgid "where constraint is:" -msgstr "où la contrainte est :" - -#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 +#: sql_help.c:2276 sql_help.c:2709 sql_help.c:3140 msgid "event" msgstr "événement" -#: sql_help.c:2248 +#: sql_help.c:2277 msgid "filter_variable" msgstr "filter_variable" -#: sql_help.c:2249 +#: sql_help.c:2278 msgid "filter_value" msgstr "filtre_valeur" -#: sql_help.c:2345 sql_help.c:2931 +#: sql_help.c:2374 sql_help.c:2956 msgid "where column_constraint is:" msgstr "où contrainte_colonne est :" -#: sql_help.c:2390 +#: sql_help.c:2419 msgid "rettype" msgstr "type_en_retour" -#: sql_help.c:2392 +#: sql_help.c:2421 msgid "column_type" msgstr "type_colonne" -#: sql_help.c:2401 sql_help.c:2604 +#: sql_help.c:2430 sql_help.c:2633 msgid "definition" msgstr "définition" -#: sql_help.c:2402 sql_help.c:2605 +#: sql_help.c:2431 sql_help.c:2634 msgid "obj_file" msgstr "fichier_objet" -#: sql_help.c:2403 sql_help.c:2606 +#: sql_help.c:2432 sql_help.c:2635 msgid "link_symbol" msgstr "symbole_link" -#: sql_help.c:2404 sql_help.c:2607 +#: sql_help.c:2433 sql_help.c:2636 msgid "sql_body" msgstr "corps_sql" -#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 +#: sql_help.c:2471 sql_help.c:2694 sql_help.c:3263 msgid "uid" msgstr "uid" -#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 -#: sql_help.c:2927 sql_help.c:2995 +#: sql_help.c:2487 sql_help.c:2528 sql_help.c:2925 sql_help.c:2938 +#: sql_help.c:2952 sql_help.c:3023 msgid "method" msgstr "méthode" -#: sql_help.c:2463 -msgid "opclass_parameter" -msgstr "paramètre_opclass" - -#: sql_help.c:2480 +#: sql_help.c:2509 msgid "call_handler" msgstr "gestionnaire_d_appel" -#: sql_help.c:2481 +#: sql_help.c:2510 msgid "inline_handler" msgstr "gestionnaire_en_ligne" -#: sql_help.c:2482 +#: sql_help.c:2511 msgid "valfunction" msgstr "fonction_val" -#: sql_help.c:2521 -msgid "com_op" -msgstr "com_op" - -#: sql_help.c:2522 -msgid "neg_op" -msgstr "neg_op" - -#: sql_help.c:2540 +#: sql_help.c:2569 msgid "family_name" msgstr "nom_famille" -#: sql_help.c:2551 +#: sql_help.c:2580 msgid "storage_type" msgstr "type_stockage" -#: sql_help.c:2690 sql_help.c:3119 +#: sql_help.c:2715 sql_help.c:3147 msgid "where event can be one of:" msgstr "où événement fait partie de :" -#: sql_help.c:2710 sql_help.c:2712 +#: sql_help.c:2735 sql_help.c:2737 msgid "schema_element" msgstr "élément_schéma" -#: sql_help.c:2749 +#: sql_help.c:2774 msgid "server_type" msgstr "type_serveur" -#: sql_help.c:2750 +#: sql_help.c:2775 msgid "server_version" msgstr "version_serveur" -#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 +#: sql_help.c:2776 sql_help.c:3929 sql_help.c:4392 msgid "fdw_name" msgstr "nom_fdw" -#: sql_help.c:2768 sql_help.c:2771 +#: sql_help.c:2793 sql_help.c:2796 msgid "statistics_name" msgstr "nom_statistique" -#: sql_help.c:2772 +#: sql_help.c:2797 msgid "statistics_kind" msgstr "statistics_kind" -#: sql_help.c:2788 +#: sql_help.c:2813 msgid "subscription_name" msgstr "nom_souscription" -#: sql_help.c:2893 +#: sql_help.c:2918 msgid "source_table" msgstr "table_source" -#: sql_help.c:2894 +#: sql_help.c:2919 msgid "like_option" msgstr "option_like" -#: sql_help.c:2960 +#: sql_help.c:2985 msgid "and like_option is:" msgstr "et option_like est :" -#: sql_help.c:3012 +#: sql_help.c:3040 msgid "directory" msgstr "répertoire" -#: sql_help.c:3026 +#: sql_help.c:3054 msgid "parser_name" msgstr "nom_analyseur" -#: sql_help.c:3027 +#: sql_help.c:3055 msgid "source_config" msgstr "configuration_source" -#: sql_help.c:3056 +#: sql_help.c:3084 msgid "start_function" msgstr "fonction_start" -#: sql_help.c:3057 +#: sql_help.c:3085 msgid "gettoken_function" msgstr "fonction_gettoken" -#: sql_help.c:3058 +#: sql_help.c:3086 msgid "end_function" msgstr "fonction_end" -#: sql_help.c:3059 +#: sql_help.c:3087 msgid "lextypes_function" msgstr "fonction_lextypes" -#: sql_help.c:3060 +#: sql_help.c:3088 msgid "headline_function" msgstr "fonction_headline" -#: sql_help.c:3072 +#: sql_help.c:3100 msgid "init_function" msgstr "fonction_init" -#: sql_help.c:3073 +#: sql_help.c:3101 msgid "lexize_function" msgstr "fonction_lexize" -#: sql_help.c:3086 +#: sql_help.c:3114 msgid "from_sql_function_name" msgstr "nom_fonction_from_sql" -#: sql_help.c:3088 +#: sql_help.c:3116 msgid "to_sql_function_name" msgstr "nom_fonction_to_sql" -#: sql_help.c:3114 +#: sql_help.c:3142 msgid "referenced_table_name" msgstr "nom_table_référencée" -#: sql_help.c:3115 +#: sql_help.c:3143 msgid "transition_relation_name" msgstr "nom_relation_transition" -#: sql_help.c:3118 +#: sql_help.c:3146 msgid "arguments" msgstr "arguments" -#: sql_help.c:3170 +#: sql_help.c:3198 msgid "label" msgstr "label" -#: sql_help.c:3172 +#: sql_help.c:3200 msgid "subtype" msgstr "sous_type" -#: sql_help.c:3173 +#: sql_help.c:3201 msgid "subtype_operator_class" msgstr "classe_opérateur_sous_type" -#: sql_help.c:3175 +#: sql_help.c:3203 msgid "canonical_function" msgstr "fonction_canonique" -#: sql_help.c:3176 +#: sql_help.c:3204 msgid "subtype_diff_function" msgstr "fonction_diff_sous_type" -#: sql_help.c:3177 +#: sql_help.c:3205 msgid "multirange_type_name" msgstr "nom_type_multirange" -#: sql_help.c:3179 +#: sql_help.c:3207 msgid "input_function" msgstr "fonction_en_sortie" -#: sql_help.c:3180 +#: sql_help.c:3208 msgid "output_function" msgstr "fonction_en_sortie" -#: sql_help.c:3181 +#: sql_help.c:3209 msgid "receive_function" msgstr "fonction_receive" -#: sql_help.c:3182 +#: sql_help.c:3210 msgid "send_function" msgstr "fonction_send" -#: sql_help.c:3183 +#: sql_help.c:3211 msgid "type_modifier_input_function" msgstr "fonction_en_entrée_modificateur_type" -#: sql_help.c:3184 +#: sql_help.c:3212 msgid "type_modifier_output_function" msgstr "fonction_en_sortie_modificateur_type" -#: sql_help.c:3185 +#: sql_help.c:3213 msgid "analyze_function" msgstr "fonction_analyze" -#: sql_help.c:3186 +#: sql_help.c:3214 msgid "subscript_function" msgstr "fonction_indice" -#: sql_help.c:3187 +#: sql_help.c:3215 msgid "internallength" msgstr "longueur_interne" -#: sql_help.c:3188 +#: sql_help.c:3216 msgid "alignment" msgstr "alignement" -#: sql_help.c:3189 +#: sql_help.c:3217 msgid "storage" msgstr "stockage" -#: sql_help.c:3190 +#: sql_help.c:3218 msgid "like_type" msgstr "type_like" -#: sql_help.c:3191 +#: sql_help.c:3219 msgid "category" msgstr "catégorie" -#: sql_help.c:3192 +#: sql_help.c:3220 msgid "preferred" msgstr "préféré" -#: sql_help.c:3193 +#: sql_help.c:3221 msgid "default" msgstr "par défaut" -#: sql_help.c:3194 +#: sql_help.c:3222 msgid "element" msgstr "élément" -#: sql_help.c:3195 +#: sql_help.c:3223 msgid "delimiter" msgstr "délimiteur" -#: sql_help.c:3196 +#: sql_help.c:3224 msgid "collatable" msgstr "collationnable" -#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547 -#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042 +#: sql_help.c:3321 sql_help.c:4008 sql_help.c:4102 sql_help.c:4592 +#: sql_help.c:4695 sql_help.c:4850 sql_help.c:4964 sql_help.c:5095 msgid "with_query" msgstr "requête_with" -#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572 -#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591 -#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836 -#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061 -#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078 -#: sql_help.c:5086 +#: sql_help.c:3323 sql_help.c:4010 sql_help.c:4611 sql_help.c:4617 +#: sql_help.c:4620 sql_help.c:4624 sql_help.c:4628 sql_help.c:4636 +#: sql_help.c:4869 sql_help.c:4875 sql_help.c:4878 sql_help.c:4882 +#: sql_help.c:4886 sql_help.c:4894 sql_help.c:4966 sql_help.c:5114 +#: sql_help.c:5120 sql_help.c:5123 sql_help.c:5127 sql_help.c:5131 +#: sql_help.c:5139 msgid "alias" msgstr "alias" -#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595 -#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603 -#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852 -#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860 -#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090 -#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098 +#: sql_help.c:3324 sql_help.c:4596 sql_help.c:4638 sql_help.c:4640 +#: sql_help.c:4644 sql_help.c:4646 sql_help.c:4647 sql_help.c:4648 +#: sql_help.c:4700 sql_help.c:4854 sql_help.c:4896 sql_help.c:4898 +#: sql_help.c:4902 sql_help.c:4904 sql_help.c:4905 sql_help.c:4906 +#: sql_help.c:4973 sql_help.c:5099 sql_help.c:5141 sql_help.c:5143 +#: sql_help.c:5147 sql_help.c:5149 sql_help.c:5150 sql_help.c:5151 msgid "from_item" msgstr "élément_from" -#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928 +#: sql_help.c:3326 sql_help.c:3810 sql_help.c:4159 sql_help.c:4975 msgid "cursor_name" msgstr "nom_curseur" -#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929 +#: sql_help.c:3327 sql_help.c:4016 sql_help.c:4108 sql_help.c:4976 msgid "output_expression" msgstr "expression_en_sortie" -#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652 -#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045 +#: sql_help.c:3328 sql_help.c:4017 sql_help.c:4109 sql_help.c:4595 +#: sql_help.c:4698 sql_help.c:4853 sql_help.c:4977 sql_help.c:5098 msgid "output_name" msgstr "nom_en_sortie" -#: sql_help.c:3316 +#: sql_help.c:3344 msgid "code" msgstr "code" -#: sql_help.c:3721 +#: sql_help.c:3749 msgid "parameter" msgstr "paramètre" -#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 +#: sql_help.c:3773 sql_help.c:4184 msgid "statement" msgstr "instruction" -#: sql_help.c:3778 sql_help.c:4116 +#: sql_help.c:3809 sql_help.c:4158 msgid "direction" msgstr "direction" -#: sql_help.c:3780 sql_help.c:4118 +#: sql_help.c:3811 sql_help.c:4160 msgid "where direction can be one of:" msgstr "où direction fait partie de :" -#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 -#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 -#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562 -#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819 -#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057 +#: sql_help.c:3812 sql_help.c:3813 sql_help.c:3814 sql_help.c:3815 +#: sql_help.c:3816 sql_help.c:4161 sql_help.c:4162 sql_help.c:4163 +#: sql_help.c:4164 sql_help.c:4165 sql_help.c:4605 sql_help.c:4607 +#: sql_help.c:4709 sql_help.c:4711 sql_help.c:4863 sql_help.c:4865 +#: sql_help.c:5039 sql_help.c:5041 sql_help.c:5108 sql_help.c:5110 msgid "count" msgstr "nombre" -#: sql_help.c:3888 sql_help.c:4337 +#: sql_help.c:3919 sql_help.c:4382 msgid "sequence_name" msgstr "nom_séquence" -#: sql_help.c:3906 sql_help.c:4355 +#: sql_help.c:3937 sql_help.c:4400 msgid "arg_name" msgstr "nom_argument" -#: sql_help.c:3907 sql_help.c:4356 +#: sql_help.c:3938 sql_help.c:4401 msgid "arg_type" msgstr "type_arg" -#: sql_help.c:3914 sql_help.c:4363 +#: sql_help.c:3945 sql_help.c:4408 msgid "loid" msgstr "loid" -#: sql_help.c:3945 +#: sql_help.c:3976 msgid "remote_schema" msgstr "schema_distant" -#: sql_help.c:3948 +#: sql_help.c:3979 msgid "local_schema" msgstr "schéma_local" -#: sql_help.c:3983 +#: sql_help.c:4014 msgid "conflict_target" msgstr "cible_conflit" -#: sql_help.c:3984 +#: sql_help.c:4015 msgid "conflict_action" msgstr "action_conflit" -#: sql_help.c:3987 +#: sql_help.c:4018 msgid "where conflict_target can be one of:" msgstr "où cible_conflit fait partie de :" -#: sql_help.c:3988 +#: sql_help.c:4019 msgid "index_column_name" msgstr "index_nom_colonne" -#: sql_help.c:3989 +#: sql_help.c:4020 msgid "index_expression" msgstr "index_expression" -#: sql_help.c:3992 +#: sql_help.c:4023 msgid "index_predicate" msgstr "index_prédicat" -#: sql_help.c:3994 +#: sql_help.c:4025 msgid "and conflict_action is one of:" msgstr "où action_conflit fait partie de :" -#: sql_help.c:4000 sql_help.c:4925 +#: sql_help.c:4031 sql_help.c:4132 sql_help.c:4972 msgid "sub-SELECT" msgstr "sous-SELECT" -#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901 +#: sql_help.c:4040 sql_help.c:4173 sql_help.c:4948 msgid "channel" msgstr "canal" -#: sql_help.c:4031 +#: sql_help.c:4062 msgid "lockmode" msgstr "mode_de_verrou" -#: sql_help.c:4032 +#: sql_help.c:4063 msgid "where lockmode is one of:" msgstr "où mode_de_verrou fait partie de :" -#: sql_help.c:4068 +#: sql_help.c:4103 msgid "target_table_name" msgstr "target_table_name" -#: sql_help.c:4069 +#: sql_help.c:4104 msgid "target_alias" msgstr "target_alias" -#: sql_help.c:4070 +#: sql_help.c:4105 msgid "data_source" msgstr "data_source" -#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 +#: sql_help.c:4106 sql_help.c:4641 sql_help.c:4899 sql_help.c:5144 msgid "join_condition" msgstr "condition_de_jointure" -#: sql_help.c:4072 +#: sql_help.c:4107 msgid "when_clause" msgstr "when_clause" -#: sql_help.c:4073 +#: sql_help.c:4110 msgid "where data_source is:" msgstr "où data_source est :" -#: sql_help.c:4074 +#: sql_help.c:4111 msgid "source_table_name" msgstr "source_table_name" -#: sql_help.c:4075 +#: sql_help.c:4112 msgid "source_query" msgstr "source_query" -#: sql_help.c:4076 +#: sql_help.c:4113 msgid "source_alias" msgstr "source_alias" -#: sql_help.c:4077 +#: sql_help.c:4114 msgid "and when_clause is:" msgstr "et when_clause est :" -#: sql_help.c:4079 +#: sql_help.c:4116 sql_help.c:4119 msgid "merge_update" msgstr "merge_delete" -#: sql_help.c:4080 +#: sql_help.c:4117 sql_help.c:4120 msgid "merge_delete" msgstr "merge_delete" -#: sql_help.c:4082 +#: sql_help.c:4122 msgid "merge_insert" msgstr "merge_insert" -#: sql_help.c:4083 +#: sql_help.c:4123 msgid "and merge_insert is:" msgstr "et merge_insert est :" -#: sql_help.c:4086 +#: sql_help.c:4126 msgid "and merge_update is:" msgstr "et merge_update est :" -#: sql_help.c:4091 +#: sql_help.c:4133 msgid "and merge_delete is:" msgstr "et merge_delete est :" -#: sql_help.c:4132 +#: sql_help.c:4174 msgid "payload" msgstr "contenu" -#: sql_help.c:4159 +#: sql_help.c:4201 msgid "old_role" msgstr "ancien_rôle" -#: sql_help.c:4160 +#: sql_help.c:4202 msgid "new_role" msgstr "nouveau_rôle" -#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 +#: sql_help.c:4241 sql_help.c:4450 sql_help.c:4458 msgid "savepoint_name" msgstr "nom_savepoint" -#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868 -#: sql_help.c:5048 sql_help.c:5106 +#: sql_help.c:4598 sql_help.c:4656 sql_help.c:4856 sql_help.c:4914 +#: sql_help.c:5101 sql_help.c:5159 msgid "grouping_element" msgstr "element_regroupement" -#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 +#: sql_help.c:4600 sql_help.c:4704 sql_help.c:4858 sql_help.c:5103 msgid "window_name" msgstr "nom_window" -#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051 +#: sql_help.c:4601 sql_help.c:4705 sql_help.c:4859 sql_help.c:5104 msgid "window_definition" msgstr "définition_window" -#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660 -#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052 -#: sql_help.c:5066 sql_help.c:5110 +#: sql_help.c:4602 sql_help.c:4616 sql_help.c:4660 sql_help.c:4706 +#: sql_help.c:4860 sql_help.c:4874 sql_help.c:4918 sql_help.c:5105 +#: sql_help.c:5119 sql_help.c:5163 msgid "select" msgstr "sélection" -#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059 +#: sql_help.c:4608 sql_help.c:4866 sql_help.c:5111 +msgid "from_reference" +msgstr "reference_from" + +#: sql_help.c:4609 sql_help.c:4867 sql_help.c:5112 msgid "where from_item can be one of:" msgstr "où élément_from fait partie de :" -#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580 -#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833 -#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068 -#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087 +#: sql_help.c:4612 sql_help.c:4618 sql_help.c:4621 sql_help.c:4625 +#: sql_help.c:4637 sql_help.c:4870 sql_help.c:4876 sql_help.c:4879 +#: sql_help.c:4883 sql_help.c:4895 sql_help.c:5115 sql_help.c:5121 +#: sql_help.c:5124 sql_help.c:5128 sql_help.c:5140 msgid "column_alias" msgstr "alias_colonne" -#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063 +#: sql_help.c:4613 sql_help.c:4871 sql_help.c:5116 msgid "sampling_method" msgstr "méthode_echantillonnage" -#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 +#: sql_help.c:4615 sql_help.c:4873 sql_help.c:5118 msgid "seed" msgstr "graine" -#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870 -#: sql_help.c:5069 sql_help.c:5108 +#: sql_help.c:4619 sql_help.c:4658 sql_help.c:4877 sql_help.c:4916 +#: sql_help.c:5122 sql_help.c:5161 msgid "with_query_name" msgstr "nom_requête_with" -#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841 -#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082 -#: sql_help.c:5085 +#: sql_help.c:4629 sql_help.c:4632 sql_help.c:4635 sql_help.c:4887 +#: sql_help.c:4890 sql_help.c:4893 sql_help.c:5132 sql_help.c:5135 +#: sql_help.c:5138 msgid "column_definition" msgstr "définition_colonne" -#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857 -#: sql_help.c:5089 sql_help.c:5095 +#: sql_help.c:4639 sql_help.c:4645 sql_help.c:4897 sql_help.c:4903 +#: sql_help.c:5142 sql_help.c:5148 msgid "join_type" msgstr "type_de_jointure" -#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 +#: sql_help.c:4642 sql_help.c:4900 sql_help.c:5145 msgid "join_column" msgstr "colonne_de_jointure" -#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 +#: sql_help.c:4643 sql_help.c:4901 sql_help.c:5146 msgid "join_using_alias" msgstr "join_utilisant_alias" -#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099 +#: sql_help.c:4649 sql_help.c:4907 sql_help.c:5152 msgid "and grouping_element can be one of:" msgstr "où element_regroupement fait partie de :" -#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107 +#: sql_help.c:4657 sql_help.c:4915 sql_help.c:5160 msgid "and with_query is:" msgstr "et requête_with est :" -#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 +#: sql_help.c:4661 sql_help.c:4919 sql_help.c:5164 msgid "values" msgstr "valeurs" -#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 +#: sql_help.c:4662 sql_help.c:4920 sql_help.c:5165 msgid "insert" msgstr "insert" -#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 +#: sql_help.c:4663 sql_help.c:4921 sql_help.c:5166 msgid "update" msgstr "update" -#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 +#: sql_help.c:4664 sql_help.c:4922 sql_help.c:5167 msgid "delete" msgstr "delete" -#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 +#: sql_help.c:4665 sql_help.c:4923 sql_help.c:5168 +msgid "merge" +msgstr "merge" + +#: sql_help.c:4667 sql_help.c:4925 sql_help.c:5170 msgid "search_seq_col_name" msgstr "nom_colonne_seq_recherche" -#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 +#: sql_help.c:4669 sql_help.c:4927 sql_help.c:5172 msgid "cycle_mark_col_name" msgstr "nom_colonne_marque_cycle" -#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 +#: sql_help.c:4670 sql_help.c:4928 sql_help.c:5173 msgid "cycle_mark_value" msgstr "valeur_marque_cycle" -#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 +#: sql_help.c:4671 sql_help.c:4929 sql_help.c:5174 msgid "cycle_mark_default" msgstr "défaut_marque_cyle" -#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 +#: sql_help.c:4672 sql_help.c:4930 sql_help.c:5175 msgid "cycle_path_col_name" msgstr "nom_colonne_chemin_cycle" -#: sql_help.c:4653 +#: sql_help.c:4699 msgid "new_table" msgstr "nouvelle_table" -#: sql_help.c:4724 +#: sql_help.c:4770 msgid "snapshot_id" msgstr "id_snapshot" -#: sql_help.c:4984 +#: sql_help.c:5037 msgid "sort_expression" msgstr "expression_de_tri" -#: sql_help.c:5128 sql_help.c:6112 +#: sql_help.c:5182 sql_help.c:6166 msgid "abort the current transaction" msgstr "abandonner la transaction en cours" -#: sql_help.c:5134 +#: sql_help.c:5188 msgid "change the definition of an aggregate function" msgstr "modifier la définition d'une fonction d'agrégation" -#: sql_help.c:5140 +#: sql_help.c:5194 msgid "change the definition of a collation" msgstr "modifier la définition d'un collationnement" -#: sql_help.c:5146 +#: sql_help.c:5200 msgid "change the definition of a conversion" msgstr "modifier la définition d'une conversion" -#: sql_help.c:5152 +#: sql_help.c:5206 msgid "change a database" msgstr "modifier une base de données" -#: sql_help.c:5158 +#: sql_help.c:5212 msgid "define default access privileges" msgstr "définir les droits d'accès par défaut" -#: sql_help.c:5164 +#: sql_help.c:5218 msgid "change the definition of a domain" msgstr "modifier la définition d'un domaine" -#: sql_help.c:5170 +#: sql_help.c:5224 msgid "change the definition of an event trigger" msgstr "modifier la définition d'un trigger sur évènement" -#: sql_help.c:5176 +#: sql_help.c:5230 msgid "change the definition of an extension" msgstr "modifier la définition d'une extension" -#: sql_help.c:5182 +#: sql_help.c:5236 msgid "change the definition of a foreign-data wrapper" msgstr "modifier la définition d'un wrapper de données distantes" -#: sql_help.c:5188 +#: sql_help.c:5242 msgid "change the definition of a foreign table" msgstr "modifier la définition d'une table distante" -#: sql_help.c:5194 +#: sql_help.c:5248 msgid "change the definition of a function" msgstr "modifier la définition d'une fonction" -#: sql_help.c:5200 +#: sql_help.c:5254 msgid "change role name or membership" msgstr "modifier le nom d'un groupe ou la liste des ses membres" -#: sql_help.c:5206 +#: sql_help.c:5260 msgid "change the definition of an index" msgstr "modifier la définition d'un index" -#: sql_help.c:5212 +#: sql_help.c:5266 msgid "change the definition of a procedural language" msgstr "modifier la définition d'un langage procédural" -#: sql_help.c:5218 +#: sql_help.c:5272 msgid "change the definition of a large object" msgstr "modifier la définition d'un « Large Object »" -#: sql_help.c:5224 +#: sql_help.c:5278 msgid "change the definition of a materialized view" msgstr "modifier la définition d'une vue matérialisée" -#: sql_help.c:5230 +#: sql_help.c:5284 msgid "change the definition of an operator" msgstr "modifier la définition d'un opérateur" -#: sql_help.c:5236 +#: sql_help.c:5290 msgid "change the definition of an operator class" msgstr "modifier la définition d'une classe d'opérateurs" -#: sql_help.c:5242 +#: sql_help.c:5296 msgid "change the definition of an operator family" msgstr "modifier la définition d'une famille d'opérateur" -#: sql_help.c:5248 +#: sql_help.c:5302 msgid "change the definition of a row-level security policy" msgstr "modifier la définition d'une politique de sécurité au niveau ligne" -#: sql_help.c:5254 +#: sql_help.c:5308 msgid "change the definition of a procedure" msgstr "modifier la définition d'une procédure" -#: sql_help.c:5260 +#: sql_help.c:5314 msgid "change the definition of a publication" msgstr "modifier la définition d'une publication" -#: sql_help.c:5266 sql_help.c:5368 +#: sql_help.c:5320 sql_help.c:5422 msgid "change a database role" msgstr "modifier un rôle" -#: sql_help.c:5272 +#: sql_help.c:5326 msgid "change the definition of a routine" msgstr "modifier la définition d'une routine" -#: sql_help.c:5278 +#: sql_help.c:5332 msgid "change the definition of a rule" msgstr "modifier la définition d'une règle" -#: sql_help.c:5284 +#: sql_help.c:5338 msgid "change the definition of a schema" msgstr "modifier la définition d'un schéma" -#: sql_help.c:5290 +#: sql_help.c:5344 msgid "change the definition of a sequence generator" msgstr "modifier la définition d'un générateur de séquence" -#: sql_help.c:5296 +#: sql_help.c:5350 msgid "change the definition of a foreign server" msgstr "modifier la définition d'un serveur distant" -#: sql_help.c:5302 +#: sql_help.c:5356 msgid "change the definition of an extended statistics object" msgstr "modifier la définition d'un objet de statistiques étendues" -#: sql_help.c:5308 +#: sql_help.c:5362 msgid "change the definition of a subscription" msgstr "modifier la définition d'une souscription" -#: sql_help.c:5314 +#: sql_help.c:5368 msgid "change a server configuration parameter" msgstr "modifie un paramètre de configuration du serveur" -#: sql_help.c:5320 +#: sql_help.c:5374 msgid "change the definition of a table" msgstr "modifier la définition d'une table" -#: sql_help.c:5326 +#: sql_help.c:5380 msgid "change the definition of a tablespace" msgstr "modifier la définition d'un tablespace" -#: sql_help.c:5332 +#: sql_help.c:5386 msgid "change the definition of a text search configuration" msgstr "modifier la définition d'une configuration de la recherche de texte" -#: sql_help.c:5338 +#: sql_help.c:5392 msgid "change the definition of a text search dictionary" msgstr "modifier la définition d'un dictionnaire de la recherche de texte" -#: sql_help.c:5344 +#: sql_help.c:5398 msgid "change the definition of a text search parser" msgstr "modifier la définition d'un analyseur de la recherche de texte" -#: sql_help.c:5350 +#: sql_help.c:5404 msgid "change the definition of a text search template" msgstr "modifier la définition d'un modèle de la recherche de texte" -#: sql_help.c:5356 +#: sql_help.c:5410 msgid "change the definition of a trigger" msgstr "modifier la définition d'un trigger" -#: sql_help.c:5362 +#: sql_help.c:5416 msgid "change the definition of a type" msgstr "modifier la définition d'un type" -#: sql_help.c:5374 +#: sql_help.c:5428 msgid "change the definition of a user mapping" msgstr "modifier la définition d'une correspondance d'utilisateur" -#: sql_help.c:5380 +#: sql_help.c:5434 msgid "change the definition of a view" msgstr "modifier la définition d'une vue" -#: sql_help.c:5386 +#: sql_help.c:5440 msgid "collect statistics about a database" msgstr "acquérir des statistiques concernant la base de données" -#: sql_help.c:5392 sql_help.c:6190 +#: sql_help.c:5446 sql_help.c:6244 msgid "start a transaction block" msgstr "débuter un bloc de transaction" -#: sql_help.c:5398 +#: sql_help.c:5452 msgid "invoke a procedure" msgstr "appeler une procédure" -#: sql_help.c:5404 +#: sql_help.c:5458 msgid "force a write-ahead log checkpoint" msgstr "forcer un point de vérification des journaux de transactions" -#: sql_help.c:5410 +#: sql_help.c:5464 msgid "close a cursor" msgstr "fermer un curseur" -#: sql_help.c:5416 +#: sql_help.c:5470 msgid "cluster a table according to an index" msgstr "réorganiser (cluster) une table en fonction d'un index" -#: sql_help.c:5422 +#: sql_help.c:5476 msgid "define or change the comment of an object" msgstr "définir ou modifier les commentaires d'un objet" -#: sql_help.c:5428 sql_help.c:5986 +#: sql_help.c:5482 sql_help.c:6040 msgid "commit the current transaction" msgstr "valider la transaction en cours" -#: sql_help.c:5434 +#: sql_help.c:5488 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "" "valider une transaction précédemment préparée pour une validation en deux\n" "phases" -#: sql_help.c:5440 +#: sql_help.c:5494 msgid "copy data between a file and a table" msgstr "copier des données entre un fichier et une table" -#: sql_help.c:5446 +#: sql_help.c:5500 msgid "define a new access method" msgstr "définir une nouvelle méthode d'accès" -#: sql_help.c:5452 +#: sql_help.c:5506 msgid "define a new aggregate function" msgstr "définir une nouvelle fonction d'agrégation" -#: sql_help.c:5458 +#: sql_help.c:5512 msgid "define a new cast" msgstr "définir un nouveau transtypage" -#: sql_help.c:5464 +#: sql_help.c:5518 msgid "define a new collation" msgstr "définir un nouveau collationnement" -#: sql_help.c:5470 +#: sql_help.c:5524 msgid "define a new encoding conversion" msgstr "définir une nouvelle conversion d'encodage" -#: sql_help.c:5476 +#: sql_help.c:5530 msgid "create a new database" msgstr "créer une nouvelle base de données" -#: sql_help.c:5482 +#: sql_help.c:5536 msgid "define a new domain" msgstr "définir un nouveau domaine" -#: sql_help.c:5488 +#: sql_help.c:5542 msgid "define a new event trigger" msgstr "définir un nouveau trigger sur évènement" -#: sql_help.c:5494 +#: sql_help.c:5548 msgid "install an extension" msgstr "installer une extension" -#: sql_help.c:5500 +#: sql_help.c:5554 msgid "define a new foreign-data wrapper" msgstr "définir un nouveau wrapper de données distantes" -#: sql_help.c:5506 +#: sql_help.c:5560 msgid "define a new foreign table" msgstr "définir une nouvelle table distante" -#: sql_help.c:5512 +#: sql_help.c:5566 msgid "define a new function" msgstr "définir une nouvelle fonction" -#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680 +#: sql_help.c:5572 sql_help.c:5632 sql_help.c:5734 msgid "define a new database role" msgstr "définir un nouveau rôle" -#: sql_help.c:5524 +#: sql_help.c:5578 msgid "define a new index" msgstr "définir un nouvel index" -#: sql_help.c:5530 +#: sql_help.c:5584 msgid "define a new procedural language" msgstr "définir un nouveau langage de procédures" -#: sql_help.c:5536 +#: sql_help.c:5590 msgid "define a new materialized view" msgstr "définir une nouvelle vue matérialisée" -#: sql_help.c:5542 +#: sql_help.c:5596 msgid "define a new operator" msgstr "définir un nouvel opérateur" -#: sql_help.c:5548 +#: sql_help.c:5602 msgid "define a new operator class" msgstr "définir une nouvelle classe d'opérateur" -#: sql_help.c:5554 +#: sql_help.c:5608 msgid "define a new operator family" msgstr "définir une nouvelle famille d'opérateur" -#: sql_help.c:5560 +#: sql_help.c:5614 msgid "define a new row-level security policy for a table" msgstr "définir une nouvelle politique de sécurité au niveau ligne pour une table" -#: sql_help.c:5566 +#: sql_help.c:5620 msgid "define a new procedure" msgstr "définir une nouvelle procédure" -#: sql_help.c:5572 +#: sql_help.c:5626 msgid "define a new publication" msgstr "définir une nouvelle publication" -#: sql_help.c:5584 +#: sql_help.c:5638 msgid "define a new rewrite rule" msgstr "définir une nouvelle règle de réécriture" -#: sql_help.c:5590 +#: sql_help.c:5644 msgid "define a new schema" msgstr "définir un nouveau schéma" -#: sql_help.c:5596 +#: sql_help.c:5650 msgid "define a new sequence generator" msgstr "définir un nouveau générateur de séquence" -#: sql_help.c:5602 +#: sql_help.c:5656 msgid "define a new foreign server" msgstr "définir un nouveau serveur distant" -#: sql_help.c:5608 +#: sql_help.c:5662 msgid "define extended statistics" msgstr "définir des statistiques étendues" -#: sql_help.c:5614 +#: sql_help.c:5668 msgid "define a new subscription" msgstr "définir une nouvelle souscription" -#: sql_help.c:5620 +#: sql_help.c:5674 msgid "define a new table" msgstr "définir une nouvelle table" -#: sql_help.c:5626 sql_help.c:6148 +#: sql_help.c:5680 sql_help.c:6202 msgid "define a new table from the results of a query" msgstr "définir une nouvelle table à partir des résultats d'une requête" -#: sql_help.c:5632 +#: sql_help.c:5686 msgid "define a new tablespace" msgstr "définir un nouveau tablespace" -#: sql_help.c:5638 +#: sql_help.c:5692 msgid "define a new text search configuration" msgstr "définir une nouvelle configuration de la recherche de texte" -#: sql_help.c:5644 +#: sql_help.c:5698 msgid "define a new text search dictionary" msgstr "définir un nouveau dictionnaire de la recherche de texte" -#: sql_help.c:5650 +#: sql_help.c:5704 msgid "define a new text search parser" msgstr "définir un nouvel analyseur de la recherche de texte" -#: sql_help.c:5656 +#: sql_help.c:5710 msgid "define a new text search template" msgstr "définir un nouveau modèle de la recherche de texte" -#: sql_help.c:5662 +#: sql_help.c:5716 msgid "define a new transform" msgstr "définir une nouvelle transformation" -#: sql_help.c:5668 +#: sql_help.c:5722 msgid "define a new trigger" msgstr "définir un nouveau trigger" -#: sql_help.c:5674 +#: sql_help.c:5728 msgid "define a new data type" msgstr "définir un nouveau type de données" -#: sql_help.c:5686 +#: sql_help.c:5740 msgid "define a new mapping of a user to a foreign server" msgstr "définit une nouvelle correspondance d'un utilisateur vers un serveur distant" -#: sql_help.c:5692 +#: sql_help.c:5746 msgid "define a new view" msgstr "définir une nouvelle vue" -#: sql_help.c:5698 +#: sql_help.c:5752 msgid "deallocate a prepared statement" msgstr "désallouer une instruction préparée" -#: sql_help.c:5704 +#: sql_help.c:5758 msgid "define a cursor" msgstr "définir un curseur" -#: sql_help.c:5710 +#: sql_help.c:5764 msgid "delete rows of a table" msgstr "supprimer des lignes d'une table" -#: sql_help.c:5716 +#: sql_help.c:5770 msgid "discard session state" msgstr "annuler l'état de la session" -#: sql_help.c:5722 +#: sql_help.c:5776 msgid "execute an anonymous code block" msgstr "exécute un bloc de code anonyme" -#: sql_help.c:5728 +#: sql_help.c:5782 msgid "remove an access method" msgstr "supprimer une méthode d'accès" -#: sql_help.c:5734 +#: sql_help.c:5788 msgid "remove an aggregate function" msgstr "supprimer une fonction d'agrégation" -#: sql_help.c:5740 +#: sql_help.c:5794 msgid "remove a cast" msgstr "supprimer un transtypage" -#: sql_help.c:5746 +#: sql_help.c:5800 msgid "remove a collation" msgstr "supprimer un collationnement" -#: sql_help.c:5752 +#: sql_help.c:5806 msgid "remove a conversion" msgstr "supprimer une conversion" -#: sql_help.c:5758 +#: sql_help.c:5812 msgid "remove a database" msgstr "supprimer une base de données" -#: sql_help.c:5764 +#: sql_help.c:5818 msgid "remove a domain" msgstr "supprimer un domaine" -#: sql_help.c:5770 +#: sql_help.c:5824 msgid "remove an event trigger" msgstr "supprimer un trigger sur évènement" -#: sql_help.c:5776 +#: sql_help.c:5830 msgid "remove an extension" msgstr "supprimer une extension" -#: sql_help.c:5782 +#: sql_help.c:5836 msgid "remove a foreign-data wrapper" msgstr "supprimer un wrapper de données distantes" -#: sql_help.c:5788 +#: sql_help.c:5842 msgid "remove a foreign table" msgstr "supprimer une table distante" -#: sql_help.c:5794 +#: sql_help.c:5848 msgid "remove a function" msgstr "supprimer une fonction" -#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968 +#: sql_help.c:5854 sql_help.c:5920 sql_help.c:6022 msgid "remove a database role" msgstr "supprimer un rôle de la base de données" -#: sql_help.c:5806 +#: sql_help.c:5860 msgid "remove an index" msgstr "supprimer un index" -#: sql_help.c:5812 +#: sql_help.c:5866 msgid "remove a procedural language" msgstr "supprimer un langage procédural" -#: sql_help.c:5818 +#: sql_help.c:5872 msgid "remove a materialized view" msgstr "supprimer une vue matérialisée" -#: sql_help.c:5824 +#: sql_help.c:5878 msgid "remove an operator" msgstr "supprimer un opérateur" -#: sql_help.c:5830 +#: sql_help.c:5884 msgid "remove an operator class" msgstr "supprimer une classe d'opérateur" -#: sql_help.c:5836 +#: sql_help.c:5890 msgid "remove an operator family" msgstr "supprimer une famille d'opérateur" -#: sql_help.c:5842 +#: sql_help.c:5896 msgid "remove database objects owned by a database role" msgstr "supprimer les objets appartenant à un rôle" -#: sql_help.c:5848 +#: sql_help.c:5902 msgid "remove a row-level security policy from a table" msgstr "supprimer une politique de sécurité au niveau ligne pour une table" -#: sql_help.c:5854 +#: sql_help.c:5908 msgid "remove a procedure" msgstr "supprimer une procédure" -#: sql_help.c:5860 +#: sql_help.c:5914 msgid "remove a publication" msgstr "supprimer une publication" -#: sql_help.c:5872 +#: sql_help.c:5926 msgid "remove a routine" msgstr "supprimer une routine" -#: sql_help.c:5878 +#: sql_help.c:5932 msgid "remove a rewrite rule" msgstr "supprimer une règle de réécriture" -#: sql_help.c:5884 +#: sql_help.c:5938 msgid "remove a schema" msgstr "supprimer un schéma" -#: sql_help.c:5890 +#: sql_help.c:5944 msgid "remove a sequence" msgstr "supprimer une séquence" -#: sql_help.c:5896 +#: sql_help.c:5950 msgid "remove a foreign server descriptor" msgstr "supprimer un descripteur de serveur distant" -#: sql_help.c:5902 +#: sql_help.c:5956 msgid "remove extended statistics" msgstr "supprimer des statistiques étendues" -#: sql_help.c:5908 +#: sql_help.c:5962 msgid "remove a subscription" msgstr "supprimer une souscription" -#: sql_help.c:5914 +#: sql_help.c:5968 msgid "remove a table" msgstr "supprimer une table" -#: sql_help.c:5920 +#: sql_help.c:5974 msgid "remove a tablespace" msgstr "supprimer un tablespace" -#: sql_help.c:5926 +#: sql_help.c:5980 msgid "remove a text search configuration" msgstr "supprimer une configuration de la recherche de texte" -#: sql_help.c:5932 +#: sql_help.c:5986 msgid "remove a text search dictionary" msgstr "supprimer un dictionnaire de la recherche de texte" -#: sql_help.c:5938 +#: sql_help.c:5992 msgid "remove a text search parser" msgstr "supprimer un analyseur de la recherche de texte" -#: sql_help.c:5944 +#: sql_help.c:5998 msgid "remove a text search template" msgstr "supprimer un modèle de la recherche de texte" -#: sql_help.c:5950 +#: sql_help.c:6004 msgid "remove a transform" msgstr "supprimer une transformation" -#: sql_help.c:5956 +#: sql_help.c:6010 msgid "remove a trigger" msgstr "supprimer un trigger" -#: sql_help.c:5962 +#: sql_help.c:6016 msgid "remove a data type" msgstr "supprimer un type de données" -#: sql_help.c:5974 +#: sql_help.c:6028 msgid "remove a user mapping for a foreign server" msgstr "supprime une correspondance utilisateur pour un serveur distant" -#: sql_help.c:5980 +#: sql_help.c:6034 msgid "remove a view" msgstr "supprimer une vue" -#: sql_help.c:5992 +#: sql_help.c:6046 msgid "execute a prepared statement" msgstr "exécuter une instruction préparée" -#: sql_help.c:5998 +#: sql_help.c:6052 msgid "show the execution plan of a statement" msgstr "afficher le plan d'exécution d'une instruction" -#: sql_help.c:6004 +#: sql_help.c:6058 msgid "retrieve rows from a query using a cursor" msgstr "extraire certaines lignes d'une requête à l'aide d'un curseur" -#: sql_help.c:6010 +#: sql_help.c:6064 msgid "define access privileges" msgstr "définir des privilèges d'accès" -#: sql_help.c:6016 +#: sql_help.c:6070 msgid "import table definitions from a foreign server" msgstr "importer la définition d'une table à partir d'un serveur distant" -#: sql_help.c:6022 +#: sql_help.c:6076 msgid "create new rows in a table" msgstr "créer de nouvelles lignes dans une table" -#: sql_help.c:6028 +#: sql_help.c:6082 msgid "listen for a notification" msgstr "se mettre à l'écoute d'une notification" -#: sql_help.c:6034 +#: sql_help.c:6088 msgid "load a shared library file" msgstr "charger un fichier de bibliothèque partagée" -#: sql_help.c:6040 +#: sql_help.c:6094 msgid "lock a table" msgstr "verrouiller une table" -#: sql_help.c:6046 +#: sql_help.c:6100 msgid "conditionally insert, update, or delete rows of a table" msgstr "insère, modifie ou supprime des lignes d'une table de façon conditionnelle" -#: sql_help.c:6052 +#: sql_help.c:6106 msgid "position a cursor" msgstr "positionner un curseur" -#: sql_help.c:6058 +#: sql_help.c:6112 msgid "generate a notification" msgstr "engendrer une notification" -#: sql_help.c:6064 +#: sql_help.c:6118 msgid "prepare a statement for execution" msgstr "préparer une instruction pour exécution" -#: sql_help.c:6070 +#: sql_help.c:6124 msgid "prepare the current transaction for two-phase commit" msgstr "préparer la transaction en cours pour une validation en deux phases" -#: sql_help.c:6076 +#: sql_help.c:6130 msgid "change the ownership of database objects owned by a database role" msgstr "changer le propriétaire des objets d'un rôle" -#: sql_help.c:6082 +#: sql_help.c:6136 msgid "replace the contents of a materialized view" msgstr "remplacer le contenu d'une vue matérialisée" -#: sql_help.c:6088 +#: sql_help.c:6142 msgid "rebuild indexes" msgstr "reconstruire des index" -#: sql_help.c:6094 -msgid "destroy a previously defined savepoint" -msgstr "détruire un point de retournement précédemment défini" +#: sql_help.c:6148 +msgid "release a previously defined savepoint" +msgstr "détruire un savepoint précédemment défini" -#: sql_help.c:6100 +#: sql_help.c:6154 msgid "restore the value of a run-time parameter to the default value" msgstr "réinitialiser un paramètre d'exécution à sa valeur par défaut" -#: sql_help.c:6106 +#: sql_help.c:6160 msgid "remove access privileges" msgstr "supprimer des privilèges d'accès" -#: sql_help.c:6118 +#: sql_help.c:6172 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "" "annuler une transaction précédemment préparée pour une validation en deux\n" "phases" -#: sql_help.c:6124 +#: sql_help.c:6178 msgid "roll back to a savepoint" msgstr "annuler jusqu'au point de retournement" -#: sql_help.c:6130 +#: sql_help.c:6184 msgid "define a new savepoint within the current transaction" msgstr "définir un nouveau point de retournement pour la transaction en cours" -#: sql_help.c:6136 +#: sql_help.c:6190 msgid "define or change a security label applied to an object" msgstr "définir ou modifier un label de sécurité à un objet" -#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232 +#: sql_help.c:6196 sql_help.c:6250 sql_help.c:6286 msgid "retrieve rows from a table or view" msgstr "extraire des lignes d'une table ou d'une vue" -#: sql_help.c:6154 +#: sql_help.c:6208 msgid "change a run-time parameter" msgstr "modifier un paramètre d'exécution" -#: sql_help.c:6160 +#: sql_help.c:6214 msgid "set constraint check timing for the current transaction" msgstr "définir le moment de la vérification des contraintes pour la transaction en cours" -#: sql_help.c:6166 +#: sql_help.c:6220 msgid "set the current user identifier of the current session" msgstr "définir l'identifiant actuel de l'utilisateur de la session courante" -#: sql_help.c:6172 +#: sql_help.c:6226 msgid "set the session user identifier and the current user identifier of the current session" msgstr "" "définir l'identifiant de l'utilisateur de session et l'identifiant actuel de\n" "l'utilisateur de la session courante" -#: sql_help.c:6178 +#: sql_help.c:6232 msgid "set the characteristics of the current transaction" msgstr "définir les caractéristiques de la transaction en cours" -#: sql_help.c:6184 +#: sql_help.c:6238 msgid "show the value of a run-time parameter" msgstr "afficher la valeur d'un paramètre d'exécution" -#: sql_help.c:6202 +#: sql_help.c:6256 msgid "empty a table or set of tables" msgstr "vider une table ou un ensemble de tables" -#: sql_help.c:6208 +#: sql_help.c:6262 msgid "stop listening for a notification" msgstr "arrêter l'écoute d'une notification" -#: sql_help.c:6214 +#: sql_help.c:6268 msgid "update rows of a table" msgstr "actualiser les lignes d'une table" -#: sql_help.c:6220 +#: sql_help.c:6274 msgid "garbage-collect and optionally analyze a database" msgstr "compacter et optionnellement analyser une base de données" -#: sql_help.c:6226 +#: sql_help.c:6280 msgid "compute a set of rows" msgstr "calculer un ensemble de lignes" @@ -6533,7 +6697,7 @@ msgstr "option supplémentaire « %s » ignorée" msgid "could not find own program executable" msgstr "n'a pas pu trouver son propre exécutable" -#: tab-complete.c:5955 +#: tab-complete.c:6216 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6559,7 +6723,7 @@ msgstr "valeur « %s » invalide pour « %s » : entier attendu" msgid "invalid variable name: \"%s\"" msgstr "nom de variable « %s » invalide" -#: variables.c:419 +#: variables.c:418 #, c-format msgid "" "unrecognized value \"%s\" for \"%s\"\n" @@ -6568,444 +6732,8 @@ msgstr "" "valeur « %s » non reconnue pour « %s »\n" "Les valeurs disponibles sont : %s." -#~ msgid " \"%s\"" -#~ msgstr " « %s »" - -#~ msgid " \"%s\" IN %s %s" -#~ msgstr " \"%s\" DANS %s %s" - -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide, puis quitte\n" - -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version, puis quitte\n" - -#~ msgid " -?, --help show this help, then exit\n" -#~ msgstr " -?, --help affiche cette aide puis quitte\n" - -#~ msgid " SERVER_VERSION_NAME server's version (short string)\n" -#~ msgstr " SERVER_VERSION_NAME version du serveur (chaîne courte)\n" - -#~ msgid " VERSION psql's version (verbose string)\n" -#~ msgstr " VERSION version de psql (chaîne verbeuse)\n" - -#~ msgid " VERSION_NAME psql's version (short string)\n" -#~ msgstr " VERSION_NAME version de psql (chaîne courte)\n" - -#~ msgid " VERSION_NUM psql's version (numeric format)\n" -#~ msgstr " VERSION_NUM version de psql (format numérique)\n" - -#~ msgid " \\dFd [PATTERN] list text search dictionaries (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\dFd [MODÈLE] affiche la liste des dictionnaires de la recherche\n" -#~ " de texte (ajouter « + » pour plus de détails)\n" - -#~ msgid " \\dFp [PATTERN] list text search parsers (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\dFp [MODÈLE] affiche la liste des analyseurs de la recherche de\n" -#~ " texte (ajouter « + » pour plus de détails)\n" - -#~ msgid " \\dT [PATTERN] list data types (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\dT [MODÈLE] affiche la liste des types de données (ajouter « + »\n" -#~ " pour plus de détails)\n" - -#~ msgid " \\db [PATTERN] list tablespaces (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\db [MODÈLE] affiche la liste des tablespaces (ajouter « + » pour\n" -#~ " plus de détails)\n" - -#~ msgid " \\df [PATTERN] list functions (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\df [MODÈLE] affiche la liste des fonctions (ajouter « + » pour\n" -#~ " plus de détails)\n" - -#~ msgid " \\dn [PATTERN] list schemas (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\dn [MODÈLE] affiche la liste des schémas (ajouter « + » pour\n" -#~ " plus de détails)\n" - -#~ msgid "" -#~ " \\d{t|i|s|v|S} [PATTERN] (add \"+\" for more detail)\n" -#~ " list tables/indexes/sequences/views/system tables\n" -#~ msgstr "" -#~ " \\d{t|i|s|v|S} [MODÈLE] (ajouter « + » pour plus de détails)\n" -#~ " affiche la liste des\n" -#~ " tables/index/séquences/vues/tables système\n" - -#~ msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n" -#~ msgstr "" -#~ " \\g [FICHIER] ou ; envoie le tampon de requêtes au serveur (et les\n" -#~ " résultats au fichier ou |tube)\n" - -#~ msgid " \\l list all databases (add \"+\" for more detail)\n" -#~ msgstr "" -#~ " \\l affiche la liste des bases de données (ajouter « + »\n" -#~ " pour plus de détails)\n" - -#~ msgid " \\l[+] list all databases\n" -#~ msgstr " \\l[+] affiche la liste des bases de données\n" - -#, c-format -#~ msgid "" -#~ " \\lo_export LOBOID FILE\n" -#~ " \\lo_import FILE [COMMENT]\n" -#~ " \\lo_list[+]\n" -#~ " \\lo_unlink LOBOID large object operations\n" -#~ msgstr "" -#~ " \\lo_export OIDLOB FICHIER\n" -#~ " \\lo_import FICHIER [COMMENTAIRE]\n" -#~ " \\lo_list[+]\n" -#~ " \\lo_unlink OIDLOB opérations sur les « Large Objects »\n" - -#~ msgid " \\z [PATTERN] list table, view, and sequence access privileges (same as \\dp)\n" -#~ msgstr "" -#~ " \\z [MODÈLE] affiche la liste des privilèges d'accès aux tables,\n" -#~ " vues et séquences (identique à \\dp)\n" - -#~ msgid " as user \"%s\"" -#~ msgstr " comme utilisateur « %s »" - -#~ msgid " at port \"%s\"" -#~ msgstr " sur le port « %s »" - -#~ msgid " on host \"%s\"" -#~ msgstr " sur l'hôte « %s »" - -#~ msgid "%s\n" -#~ msgstr "%s\n" - -#~ msgid "%s: %s\n" -#~ msgstr "%s : %s\n" - -#~ msgid "%s: could not open log file \"%s\": %s\n" -#~ msgstr "%s : n'a pas pu ouvrir le journal applicatif « %s » : %s\n" - -#~ msgid "%s: could not set variable \"%s\"\n" -#~ msgstr "%s : n'a pas pu initialiser la variable « %s »\n" - -#~ msgid "%s: pg_strdup: cannot duplicate null pointer (internal error)\n" -#~ msgstr "%s : pg_strdup : ne peut pas dupliquer le pointeur null (erreur interne)\n" - -#~ msgid "(1 row)" -#~ msgid_plural "(%lu rows)" -#~ msgstr[0] "(1 ligne)" -#~ msgstr[1] "(%lu lignes)" - -#~ msgid "(No rows)\n" -#~ msgstr "(Aucune ligne)\n" - -#~ msgid "+ opt(%d) = |%s|\n" -#~ msgstr "+ opt(%d) = |%s|\n" - -#~ msgid "?%c? \"%s.%s\"" -#~ msgstr "?%c? « %s.%s »" - -#~ msgid "Access privileges for database \"%s\"" -#~ msgstr "Droits d'accès pour la base de données « %s »" - -#~ msgid "All connection parameters must be supplied because no database connection exists" -#~ msgstr "Tous les paramètres de connexion doivent être fournis car il n'existe pas de connexion à une base de données" - -#~ msgid "Copy, Large Object\n" -#~ msgstr "Copie, « Large Object »\n" - -#~ msgid "Could not send cancel request: %s" -#~ msgstr "N'a pas pu envoyer la requête d'annulation : %s" - -#~ msgid "Disabled triggers:" -#~ msgstr "Triggers désactivés :" - -#~ msgid "Enter new password: " -#~ msgstr "Saisir le nouveau mot de passe : " - -#~ msgid "Exclusion constraints:" -#~ msgstr "Contraintes d'exclusion :" - -#~ msgid "Invalid command \\%s. Try \\? for help.\n" -#~ msgstr "Commande \\%s invalide. Essayez \\? pour l'aide-mémoire.\n" - -#~ msgid "Modifier" -#~ msgstr "Modificateur" - -#~ msgid "Modifiers" -#~ msgstr "Modificateurs" - -#~ msgid "No matching relations found.\n" -#~ msgstr "Aucune relation correspondante trouvée.\n" - -#~ msgid "No matching settings found.\n" -#~ msgstr "Aucun paramètre correspondant trouvé.\n" - -#~ msgid "No per-database role settings support in this server version.\n" -#~ msgstr "Pas de supprot des paramètres rôle par base de données pour la version de ce serveur.\n" - -#~ msgid "No relations found.\n" -#~ msgstr "Aucune relation trouvée.\n" - -#~ msgid "No settings found.\n" -#~ msgstr "Aucun paramètre trouvé.\n" - -#~ msgid "Object Description" -#~ msgstr "Description d'un objet" - -#~ msgid "Password encryption failed.\n" -#~ msgstr "Échec du chiffrement du mot de passe.\n" - -#~ msgid "Procedure" -#~ msgstr "Procédure" - -#~ msgid "Report bugs to .\n" -#~ msgstr "Rapporter les bogues à .\n" - -#~ msgid "Report bugs to .\n" -#~ msgstr "Rapportez les bogues à .\n" - -#~ msgid "SSL connection (unknown cipher)\n" -#~ msgstr "Connexion SSL (chiffrement inconnu)\n" - -#~ msgid "Showing locale-adjusted numeric output." -#~ msgstr "Affichage de la sortie numérique adaptée à la locale." - -#~ msgid "Showing only tuples." -#~ msgstr "Affichage des tuples seuls." - -#, c-format -#~ msgid "Special relation \"%s.%s\"" -#~ msgstr "Relation spéciale « %s.%s »" - -#, c-format -#~ msgid "The server (version %s) does not support altering default privileges." -#~ msgstr "Le serveur (version %s) ne supporte pas la modification des droits par défaut." - -#, c-format -#~ msgid "The server (version %s) does not support collations." -#~ msgstr "Le serveur (version %s) ne supporte pas les collationnements." - -#, c-format -#~ msgid "The server (version %s) does not support editing function source." -#~ msgstr "Le serveur (version %s) ne supporte pas l'édition du code de la fonction." - -#, c-format -#~ msgid "The server (version %s) does not support editing view definitions." -#~ msgstr "Le serveur (version %s) ne supporte pas l'édition des définitions de vue." - -#, c-format -#~ msgid "The server (version %s) does not support foreign servers." -#~ msgstr "Le serveur (version %s) ne supporte pas les serveurs distants." - -#, c-format -#~ msgid "The server (version %s) does not support foreign tables." -#~ msgstr "Le serveur (version %s) ne supporte pas les tables distantes." - -#, c-format -#~ msgid "The server (version %s) does not support foreign-data wrappers." -#~ msgstr "Le serveur (version %s) ne supporte pas les wrappers de données distantes." - -#, c-format -#~ msgid "The server (version %s) does not support full text search." -#~ msgstr "Le serveur (version %s) ne supporte pas la recherche plein texte." - -#, c-format -#~ msgid "The server (version %s) does not support per-database role settings." -#~ msgstr "Le serveur (version %s) ne supporte pas les paramètres de rôles par bases de données." - -#, c-format -#~ msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." -#~ msgstr "Le serveur (version %s) ne supporte pas les points de sauvegarde pour ON_ERROR_ROLLBACK." - -#, c-format -#~ msgid "The server (version %s) does not support showing function source." -#~ msgstr "Le serveur (version %s) ne supporte pas l'affichage du code de la fonction." - -#, c-format -#~ msgid "The server (version %s) does not support showing view definitions." -#~ msgstr "Le serveur (version %s) ne supporte pas l'affichage des définitions de vues." - -#, c-format -#~ msgid "The server (version %s) does not support tablespaces." -#~ msgstr "Le serveur (version %s) ne supporte pas les tablespaces." - -#, c-format -#~ msgid "The server (version %s) does not support user mappings." -#~ msgstr "Le serveur (version %s) ne supporte pas les correspondances d'utilisateurs." - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayez « %s --help » pour plus d'informations.\n" - -#~ msgid "" -#~ "WARNING: You are connected to a server with major version %d.%d,\n" -#~ "but your %s client is major version %d.%d. Some backslash commands,\n" -#~ "such as \\d, might not work properly.\n" -#~ "\n" -#~ msgstr "" -#~ "ATTENTION : vous êtes connecté sur un serveur dont la version majeure est\n" -#~ "%d.%d alors que votre client %s est en version majeure %d.%d. Certaines\n" -#~ "commandes avec antislashs, comme \\d, peuvent ne pas fonctionner\n" -#~ "correctement.\n" -#~ "\n" - -#~ msgid "Watch every %lds\t%s" -#~ msgstr "Vérifier chaque %lds\t%s" - -#~ msgid "" -#~ "Welcome to %s %s (server %s), the PostgreSQL interactive terminal.\n" -#~ "\n" -#~ msgstr "" -#~ "Bienvenue dans %s %s (serveur %s), l'interface interactive de PostgreSQL.\n" -#~ "\n" - -#~ msgid "" -#~ "Welcome to %s %s, the PostgreSQL interactive terminal.\n" -#~ "\n" -#~ msgstr "" -#~ "Bienvenue dans %s %s, l'interface interactive de PostgreSQL.\n" -#~ "\n" - -#~ msgid "\\%s: error\n" -#~ msgstr "\\%s : erreur\n" - -#~ msgid "\\%s: error while setting variable\n" -#~ msgstr "\\%s : erreur lors de l'initialisation de la variable\n" - -#~ msgid "\\copy: %s" -#~ msgstr "\\copy : %s" - -#~ msgid "\\copy: unexpected response (%d)\n" -#~ msgstr "\\copy : réponse inattendue (%d)\n" - -#, c-format -#~ msgid "\\watch cannot be used with COPY" -#~ msgstr "\\watch ne peut pas être utilisé avec COPY" - -#~ msgid "agg_name" -#~ msgstr "nom_d_agrégat" - -#~ msgid "agg_type" -#~ msgstr "type_aggrégat" - -#~ msgid "attribute" -#~ msgstr "attribut" - -#~ msgid "child process was terminated by signal %d" -#~ msgstr "le processus fils a été terminé par le signal %d" - -#~ msgid "child process was terminated by signal %s" -#~ msgstr "le processus fils a été terminé par le signal %s" - -#~ msgid "collate %s" -#~ msgstr "collationnement %s" - -#~ msgid "collation_name" -#~ msgstr "nom_collation" - -#~ msgid "column" -#~ msgstr "colonne" - -#~ msgid "contains support for command-line editing" -#~ msgstr "contient une gestion avancée de la ligne de commande" - -#~ msgid "could not change directory to \"%s\"" -#~ msgstr "n'a pas pu accéder au répertoire « %s »" - -#~ msgid "could not change directory to \"%s\": %s" -#~ msgstr "n'a pas pu changer le répertoire par « %s » : %s" - -#~ msgid "could not close pipe to external command: %s\n" -#~ msgstr "n'a pas pu fermer le fichier pipe vers la commande externe : %s\n" - -#~ msgid "could not connect to server: %s" -#~ msgstr "n'a pas pu se connecter au serveur : %s" - -#~ msgid "could not execute command \"%s\": %s\n" -#~ msgstr "n'a pas pu exécuter la commande « %s » : %s\n" - -#~ msgid "could not get current user name: %s\n" -#~ msgstr "n'a pas pu obtenir le nom d'utilisateur courant : %s\n" - -#~ msgid "could not identify current directory: %s" -#~ msgstr "n'a pas pu identifier le répertoire courant : %s" - -#~ msgid "could not open temporary file \"%s\": %s\n" -#~ msgstr "n'a pas pu ouvrir le fichier temporaire « %s » : %s\n" - -#~ msgid "could not read symbolic link \"%s\"" -#~ msgstr "n'a pas pu lire le lien symbolique « %s »" - -#~ msgid "could not set variable \"%s\"\n" -#~ msgstr "n'a pas pu initialiser la variable « %s »\n" - -#~ msgid "could not stat file \"%s\": %s\n" -#~ msgstr "n'a pas pu tester le fichier « %s » : %s\n" - -#~ msgid "data type" -#~ msgstr "type de données" - -#~ msgid "default %s" -#~ msgstr "Par défaut, %s" - -#~ msgid "define a new constraint trigger" -#~ msgstr "définir une nouvelle contrainte de déclenchement" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatal : " - -#~ msgid "from_list" -#~ msgstr "liste_from" - -#~ msgid "input_data_type" -#~ msgstr "type_de_données_en_entrée" - -#~ msgid "lock a named relation (table, etc)" -#~ msgstr "verrouille une relation nommée (table, etc)" - -#~ msgid "match" -#~ msgstr "match" - -#~ msgid "new_column" -#~ msgstr "nouvelle_colonne" - -#~ msgid "normal" -#~ msgstr "normal" - -#~ msgid "not null" -#~ msgstr "non NULL" - -#~ msgid "pclose failed: %m" -#~ msgstr "échec de pclose : %m" - -#~ msgid "pclose failed: %s" -#~ msgstr "échec de pclose : %s" - -#~ msgid "rolename" -#~ msgstr "nom_rôle" - -#~ msgid "serialtype" -#~ msgstr "serialtype" - -#~ msgid "special" -#~ msgstr "spécial" - -#~ msgid "statistic_type" -#~ msgstr "type_statistique" - -#~ msgid "tablespace" -#~ msgstr "tablespace" - -#~ msgid "text" -#~ msgstr "texte" - -#~ msgid "timezone" -#~ msgstr "fuseau_horaire" - -#, c-format -#~ msgid "unexpected result status for \\watch" -#~ msgstr "statut résultat inattendu pour \\watch" - -#~ msgid "unterminated quoted string\n" -#~ msgstr "chaîne entre guillemets non terminée\n" +#~ msgid "partition_name1" +#~ msgstr "nom_partition1" -#~ msgid "where direction can be empty or one of:" -#~ msgstr "où direction peut être vide ou faire partie de :" +#~ msgid "partition_name2" +#~ msgstr "nom_partition2" diff --git a/src/bin/psql/po/it.po b/src/bin/psql/po/it.po index e5cd7efead31f..aee5e3b405e13 100644 --- a/src/bin/psql/po/it.po +++ b/src/bin/psql/po/it.po @@ -21,7 +21,7 @@ msgstr "" "Project-Id-Version: psql (PostgreSQL) 11\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-09-26 08:16+0000\n" -"PO-Revision-Date: 2022-09-26 15:03+0200\n" +"PO-Revision-Date: 2024-06-26 09:10+0200\n" "Last-Translator: Daniele Varrazzo \n" "Language-Team: https://github.com/dvarrazzo/postgresql-it\n" "Language: it\n" @@ -2729,7 +2729,7 @@ msgid "" " \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" msgstr "" -" \\g [(OPZIONI)] [FILE] esegue la query (e invia il risultato a file o |pipe);\n" +" \\g [(OPZIONI)] [FILE] esegue la query (e invia il risultato a file o |pipe);\n" " \\g senza argomenti equivale a un punto e virgola\n" #: help.c:197 @@ -2746,9 +2746,7 @@ msgstr " \\gset [PREFIX] esegui la query e salva il risultato in una va #: help.c:200 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" -msgstr "" -" \\gx [(OPZIONI)] [FILE] come \\g, ma forza la modalità di output espansa\n" -"\n" +msgstr " \\gx [(OPZIONI)] [FILE] come \\g, ma forza la modalità di output espansa\n\n" #: help.c:201 msgid " \\q quit psql\n" @@ -2831,7 +2829,7 @@ msgstr " \\copy ... esegui una SQL COPY con flusso di dati dal cli #: help.c:227 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" -msgstr " \\echo [-n] [STRING] scrive la stringa nello standard output (-n per nessuna nuova riga)\n" +msgstr " \\echo [-n] [STRING] scrive la stringa nello standard output (-n per nessuna nuova riga)\n" #: help.c:228 msgid " \\i FILE execute commands from file\n" @@ -2851,13 +2849,11 @@ msgstr "" #: help.c:231 msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" -msgstr "" -" \\qecho [-n] [STRING] scrive la stringa in \\o flusso di output (-n per nessuna nuova riga)\n" -"\n" +msgstr " \\qecho [-n] [STRING] scrive la stringa in \\o flusso di output (-n per nessuna nuova riga)\n\n" #: help.c:232 msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" -msgstr " \\warn [-n] [STRING] scrive la stringa nell'errore standard (-n per nessuna nuova riga)\n" +msgstr " \\warn [-n] [STRING] scrive la stringa nell'errore standard (-n per nessuna nuova riga)\n" #: help.c:235 msgid "Conditional\n" @@ -2905,19 +2901,19 @@ msgstr " \\dA[+] [MODELLO] elenca i metodi di accesso\n" #: help.c:248 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" -msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] elenca le classi di operatori\n" +msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] elenca le classi di operatori\n" #: help.c:249 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" -msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] elenca le famiglie di operatori\n" +msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] elenca le famiglie di operatori\n" #: help.c:250 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" -msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] elenca gli operatori delle famiglie di operatori\n" +msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] elenca gli operatori delle famiglie di operatori\n" #: help.c:251 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" -msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] elenca le funzioni di supporto delle famiglie di operatori\n" +msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] elenca le funzioni di supporto delle famiglie di operatori\n" #: help.c:252 msgid " \\db[+] [PATTERN] list tablespaces\n" @@ -2929,7 +2925,7 @@ msgstr " \\dc[S+] [MODELLO] elenca le conversioni di codifica\n" #: help.c:254 msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" -msgstr " \\dconfig[+] [PATTERN] elenca i parametri di configurazione\n" +msgstr " \\dconfig[+] [PATTERN] elenca i parametri di configurazione\n" #: help.c:255 msgid " \\dC[+] [PATTERN] list casts\n" @@ -2972,7 +2968,7 @@ msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" msgstr "" -" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " elenco funzioni di [solo agg/normal/procedura/trigger/finestra]\n" #: help.c:266 @@ -3001,7 +2997,7 @@ msgstr " \\di[S+] [MODELLO] elenca gli indici\n" #: help.c:272 msgid " \\dl[+] list large objects, same as \\lo_list\n" -msgstr " \\dl[+] elenca i large object, stesso risultato di \\lo_list\n" +msgstr " \\dl[+] elenca i large object, stesso risultato di \\lo_list\n" #: help.c:273 msgid " \\dL[S+] [PATTERN] list procedural languages\n" @@ -3020,7 +3016,7 @@ msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" msgstr "" -" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " operatori di liste\n" #: help.c:278 @@ -3035,11 +3031,11 @@ msgstr "" #: help.c:280 msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" -msgstr " \\dP[itn+] [PATTERN] list [solo indice/tabella] relazioni partizionate [n=nidificato]\n" +msgstr " \\dP[itn+] [PATTERN] list [solo indice/tabella] relazioni partizionate [n=nidificato]\n" #: help.c:281 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" -msgstr " \\drds [ROLEPTRN [DBPTRN]] elenca le impostazioni del ruolo per database\n" +msgstr " \\drds [ROLEPTRN [DBPTRN]] elenca le impostazioni del ruolo per database\n" #: help.c:282 msgid " \\dRp[+] [PATTERN] list replication publications\n" @@ -3075,7 +3071,7 @@ msgstr " \\dx[+] [MODELLO] elenca le estensioni\n" #: help.c:290 msgid " \\dX [PATTERN] list extended statistics\n" -msgstr " \\dX [PATTERN] elenca le statistiche estese\n" +msgstr " \\dX [PATTERN] elenca le statistiche estese\n" #: help.c:291 msgid " \\dy[+] [PATTERN] list event triggers\n" @@ -3103,23 +3099,23 @@ msgstr "Large Object\n" #: help.c:299 msgid " \\lo_export LOBOID FILE write large object to file\n" -msgstr " \\lo_export FILE LOBOID scrive un oggetto di grandi dimensioni su un file\n" +msgstr " \\lo_export FILE LOBOID scrive un oggetto di grandi dimensioni su un file\n" #: help.c:300 msgid "" " \\lo_import FILE [COMMENT]\n" " read large object from file\n" msgstr "" -" \\lo_import FILE [COMMENTO]\n" +" \\lo_import FILE [COMMENTO]\n" " leggi oggetti di grandi dimensioni da file\n" #: help.c:302 msgid " \\lo_list[+] list large objects\n" -msgstr " \\lo_list[+] elenca gli oggetti di grandi dimensioni\n" +msgstr " \\lo_list[+] elenca gli oggetti di grandi dimensioni\n" #: help.c:303 msgid " \\lo_unlink LOBOID delete a large object\n" -msgstr " \\lo_unlink LOBOID elimina un oggetto di grandi dimensioni\n" +msgstr " \\lo_unlink LOBOID elimina un oggetto di grandi dimensioni\n" #: help.c:306 msgid "Formatting\n" @@ -3228,7 +3224,7 @@ msgstr " \\cd [DIRECTORY] cambia la directory di lavoro\n" #: help.c:341 msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" -msgstr " \\getenv PSQLVAR ENVVAR recupera la variabile di ambiente\n" +msgstr " \\getenv PSQLVAR ENVVAR recupera la variabile di ambiente\n" #: help.c:342 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" @@ -3320,7 +3316,7 @@ msgid "" " [all, errors, none, queries]\n" msgstr "" " ECHO\n" -" controlla quale input è scritto su stardard output\n" +" controlla quale input è scritto su standard output\n" " [all, errors, none, queries]\n" #: help.c:406 @@ -3362,7 +3358,7 @@ msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" msgstr "" -" NASCONDI_TABELLA\n" +" HIDE_TABLEAM\n" " se impostato, i metodi di accesso alla tabella non vengono visualizzati\n" #: help.c:417 @@ -3370,7 +3366,7 @@ msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" msgstr "" -" HIDE_TOAST_COMPRESSION\n" +" HIDE_TOAST_COMPRESSION\n" " se impostato, i metodi di compressione non vengono visualizzati\n" #: help.c:419 @@ -3512,7 +3508,7 @@ msgid "" " SHOW_ALL_RESULTS\n" " show all results of a combined query (\\;) instead of only the last\n" msgstr "" -" SHOW_ALL_RESULTS\n" +" SHOW_ALL_RESULTS\n" " mostra tutti i risultati di una query combinata (\\;) anziché solo l'ultima\n" #: help.c:455 @@ -3561,7 +3557,7 @@ msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" msgstr "" -" VERBOSITÀ\n" +" VERBOSITY\n" " controlla la verbosità dei rapporti di errore [predefinito, dettagliato, conciso, sqlstate]\n" #: help.c:467 diff --git a/src/bin/psql/po/ja.po b/src/bin/psql/po/ja.po index 133d64208cad8..1e2d3ce7a5097 100644 --- a/src/bin/psql/po/ja.po +++ b/src/bin/psql/po/ja.po @@ -1,7 +1,7 @@ # psql.po # Japanese message translation file for psql # -# Copyright (C) 2010-2022 PostgreSQL Global Development Group +# Copyright (C) 2010-2024 PostgreSQL Global Development Group # # Michihide Hotta , 2010. # @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: psql (PostgreSQL 16)\n" +"Project-Id-Version: psql (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 09:36+0900\n" -"PO-Revision-Date: 2023-05-22 10:13+0900\n" +"POT-Creation-Date: 2025-02-28 10:06+0900\n" +"PO-Revision-Date: 2025-03-03 17:20+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -42,33 +42,48 @@ msgstr "詳細: " msgid "hint: " msgstr "ヒント: " -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "䏿­£ãªãƒã‚¤ãƒŠãƒª\"%s\": %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "ãƒã‚¤ãƒŠãƒª\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "実行対象ã®\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "パス\"%s\"を絶対パス形å¼ã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 copy.c:326 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "コマンド\"%s\"を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "コマンド\"%s\"ã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "コマンド\"%s\"ãŒãƒ‡ãƒ¼ã‚¿ã‚’è¿”å´ã—ã¾ã›ã‚“ã§ã—ãŸ" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 -#: command.c:1352 command.c:3437 command.c:3486 command.c:3610 input.c:226 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: command.c:1373 command.c:3459 command.c:3508 command.c:3633 input.c:225 #: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" @@ -90,7 +105,7 @@ msgstr "null ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã‚’複製ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“(内部エラ msgid "could not look up effective user ID %ld: %s" msgstr "実効ユーザーID %ld ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %s" -#: ../../common/username.c:45 command.c:613 +#: ../../common/username.c:45 command.c:616 msgid "user does not exist" msgstr "ユーザーãŒå­˜åœ¨ã—ã¾ã›ã‚“" @@ -129,11 +144,11 @@ msgstr "å­ãƒ—ロセスã¯ã‚·ã‚°ãƒŠãƒ«%dã«ã‚ˆã‚Šçµ‚了ã—ã¾ã—ãŸ: %s" msgid "child process exited with unrecognized status %d" msgstr "å­ãƒ—ロセスã¯èªè­˜ã§ããªã„ステータス %d ã§çµ‚了ã—ã¾ã—ãŸ" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "ã‚­ãƒ£ãƒ³ã‚»ãƒ«è¦æ±‚ã‚’é€ä¿¡ã—ã¾ã—ãŸ\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "ã‚­ãƒ£ãƒ³ã‚»ãƒ«è¦æ±‚ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: " @@ -148,307 +163,332 @@ msgstr[0] "(%lu 行)" msgid "Interrupted\n" msgstr "割り込ã¿\n" -#: ../../fe_utils/print.c:3218 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "テーブルã®å†…容を表示ã§ãã¾ã›ã‚“: セル数%lldãŒä¸Šé™å€¤%lld以上ã§ã™ã€‚\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" -msgstr "テーブルã®å†…容ã«ãƒ˜ãƒƒãƒ€ãƒ¼ã‚’追加ã§ãã¾ã›ã‚“: 列数 %d ãŒåˆ¶é™å€¤ã‚’è¶…ãˆã¦ã„ã¾ã™ã€‚\n" +msgstr "テーブルã®å†…容ã«ãƒ˜ãƒƒãƒ€ãƒ¼ã‚’追加ã§ãã¾ã›ã‚“: 列数ã®ä¸Šé™å€¤%dã‚’è¶…ãˆã¦ã„ã¾ã™ã€‚\n" -#: ../../fe_utils/print.c:3258 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "テーブルã®å†…容ã«ã‚»ãƒ«ã‚’追加ã§ãã¾ã›ã‚“: セルã®åˆè¨ˆæ•° %d ãŒåˆ¶é™å€¤ã‚’è¶…ãˆã¦ã„ã¾ã™ã€‚\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "テーブルã®å†…容ã«ã‚»ãƒ«ã‚’追加ã§ãã¾ã›ã‚“: セルã®ç·æ•°%lldã‚’è¶…éŽã—ã¦ã„ã¾ã™ã€‚\n" -#: ../../fe_utils/print.c:3516 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "出力フォーマットãŒç„¡åй(内部エラー):%d" -#: ../../port/thread.c:50 ../../port/thread.c:86 +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "シェルコマンドã®å¼•æ•°ã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "データベースåã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + +#: ../../port/user.c:43 ../../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "ローカルユーザーID %dã®å‚ç…§ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: ../../port/thread.c:55 ../../port/thread.c:91 +#: ../../port/user.c:48 ../../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "ID %d ã‚’æŒã¤ãƒ­ãƒ¼ã‚«ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: command.c:234 +#: command.c:235 #, c-format msgid "invalid command \\%s" msgstr "䏿­£ãªã‚³ãƒžãƒ³ãƒ‰ \\%s " -#: command.c:236 +#: command.c:237 #, c-format msgid "Try \\? for help." msgstr " \\? ã§ãƒ˜ãƒ«ãƒ—を表示ã—ã¾ã™ã€‚" -#: command.c:254 +#: command.c:255 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: 余分ãªå¼•æ•°\"%s\"ã¯ç„¡è¦–ã•れã¾ã—ãŸ" -#: command.c:306 +#: command.c:307 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "\\%s コマンドã¯ç„¡è¦–ã•れã¾ã™; ç¾åœ¨ã®\\ifブロックを抜ã‘ã‚‹ã«ã¯\\endifã¾ãŸã¯Ctrl-Cを使用ã—ã¾ã™" -#: command.c:611 +#: command.c:614 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "ユーザーID %ldã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—㟠: %s" -#: command.c:630 +#: command.c:633 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: ディレクトリを\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: command.c:654 +#: command.c:657 #, c-format msgid "You are currently not connected to a database.\n" msgstr "ç¾åœ¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã—ã¦ã„ã¾ã›ã‚“。\n" -#: command.c:664 +#: command.c:667 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ãƒ›ã‚¹ãƒˆ\"%s\"上ã®ãƒãƒ¼ãƒˆ\"%s\"ã§æŽ¥ç¶šã—ã¦ã„ã¾ã™ã€‚\n" -#: command.c:667 +#: command.c:670 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€\"%s\"ã®ã‚½ã‚±ãƒƒãƒˆã‚’介ã—ã¦ãƒãƒ¼ãƒˆ\"%s\"ã§æŽ¥ç¶šã—ã¦ã„ã¾ã™ã€‚\n" -#: command.c:673 +#: command.c:676 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ãƒ›ã‚¹ãƒˆ\"%s\"(アドレス\"%s\")上ã®ãƒãƒ¼ãƒˆ\"%s\"ã§æŽ¥ç¶šã—ã¦ã„ã¾ã™ã€‚\n" -#: command.c:676 +#: command.c:679 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ãƒ›ã‚¹ãƒˆ\"%s\"上ã®ãƒãƒ¼ãƒˆ\"%s\"ã§æŽ¥ç¶šã—ã¦ã„ã¾ã™ã€‚\n" -#: command.c:1064 command.c:1157 command.c:2680 +#: command.c:1069 command.c:1170 command.c:2676 #, c-format msgid "no query buffer" msgstr "å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡ãŒã‚りã¾ã›ã‚“" -#: command.c:1097 command.c:5687 +#: command.c:1102 command.c:5779 #, c-format msgid "invalid line number: %s" msgstr "䏿­£ãªè¡Œç•ªå·ã§ã™: %s" -#: command.c:1235 +#: command.c:1248 msgid "No changes" msgstr "変更ã•れã¦ã„ã¾ã›ã‚“" -#: command.c:1313 +#: command.c:1333 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: エンコーディングåãŒä¸æ­£ã§ã‚ã‚‹ã‹ã€ã¾ãŸã¯å¤‰æ›ãƒ—ロシージャãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。" -#: command.c:1348 command.c:2150 command.c:3433 command.c:3630 command.c:5793 -#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120 -#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480 -#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192 -#: large_obj.c:254 startup.c:304 +#: command.c:1369 command.c:2158 command.c:3455 command.c:3653 command.c:5885 +#: common.c:221 common.c:270 common.c:440 common.c:1142 common.c:1160 +#: common.c:1228 common.c:1340 common.c:1378 common.c:1475 common.c:1541 +#: copy.c:486 copy.c:722 large_obj.c:157 large_obj.c:192 large_obj.c:254 +#: startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1355 +#: command.c:1376 msgid "There is no previous error." msgstr "ç›´å‰ã®ã‚¨ãƒ©ãƒ¼ã¯ã‚りã¾ã›ã‚“。" -#: command.c:1468 +#: command.c:1489 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: 峿‹¬å¼§ãŒã‚りã¾ã›ã‚“" -#: command.c:1552 command.c:1682 command.c:1986 command.c:2000 command.c:2019 -#: command.c:2201 command.c:2442 command.c:2647 command.c:2687 +#: command.c:1573 command.c:1692 command.c:1996 command.c:2010 command.c:2029 +#: command.c:2197 command.c:2438 command.c:2643 command.c:2683 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: å¿…è¦ãªå¼•æ•°ãŒã‚りã¾ã›ã‚“" -#: command.c:1813 +#: command.c:1823 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: \\else ã®å¾Œã«ã¯ç½®ã‘ã¾ã›ã‚“" -#: command.c:1818 +#: command.c:1828 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: 対応ã™ã‚‹ \\if ãŒã‚りã¾ã›ã‚“" -#: command.c:1882 +#: command.c:1892 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: \\else ã®å¾Œã«ã¯ç½®ã‘ã¾ã›ã‚“" -#: command.c:1887 +#: command.c:1897 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: 対応ã™ã‚‹ \\if ãŒã‚りã¾ã›ã‚“" -#: command.c:1927 +#: command.c:1937 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: 対応ã™ã‚‹ \\if ãŒã‚りã¾ã›ã‚“" -#: command.c:2083 +#: command.c:2093 msgid "Query buffer is empty." msgstr "å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡ã¯ç©ºã§ã™ã€‚" -#: command.c:2126 +#: command.c:2136 #, c-format msgid "Enter new password for user \"%s\": " msgstr "ユーザー\"%s\"ã®æ–°ã—ã„パスワードを入力ã—ã¦ãã ã•ã„: " -#: command.c:2130 +#: command.c:2140 msgid "Enter it again: " msgstr "ã‚‚ã†ä¸€åº¦å…¥åŠ›ã—ã¦ãã ã•ã„: " -#: command.c:2139 +#: command.c:2149 #, c-format msgid "Passwords didn't match." msgstr "パスワードãŒä¸€è‡´ã—ã¾ã›ã‚“ã§ã—ãŸã€‚" -#: command.c:2236 +#: command.c:2232 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: 変数ã®å€¤ã‚’読ã¿å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: command.c:2338 +#: command.c:2334 msgid "Query buffer reset (cleared)." msgstr "å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡ãŒãƒªã‚»ãƒƒãƒˆ(クリア)ã•れã¾ã—ãŸã€‚" -#: command.c:2360 +#: command.c:2356 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "ファイル\"%s\"ã«ãƒ’ストリーを出力ã—ã¾ã—ãŸã€‚\n" -#: command.c:2447 +#: command.c:2443 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: 環境変数åã«\"=\"ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: command.c:2495 +#: command.c:2491 #, c-format msgid "function name is required" msgstr "関数åãŒå¿…è¦ã§ã™" -#: command.c:2497 +#: command.c:2493 #, c-format msgid "view name is required" msgstr "ビューåãŒå¿…è¦ã§ã™" -#: command.c:2619 +#: command.c:2615 msgid "Timing is on." msgstr "タイミング㯠on ã§ã™ã€‚" -#: command.c:2621 +#: command.c:2617 msgid "Timing is off." msgstr "タイミング㯠off ã§ã™ã€‚" -#: command.c:2707 command.c:2745 command.c:4072 command.c:4075 command.c:4078 -#: command.c:4084 command.c:4086 command.c:4112 command.c:4122 command.c:4134 -#: command.c:4148 command.c:4175 command.c:4233 common.c:78 copy.c:329 -#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818 +#: command.c:2703 command.c:2741 command.c:4166 command.c:4169 command.c:4172 +#: command.c:4178 command.c:4180 command.c:4206 command.c:4216 command.c:4228 +#: command.c:4242 command.c:4269 command.c:4327 common.c:77 copy.c:329 +#: copy.c:401 psqlscanslash.l:805 psqlscanslash.l:817 psqlscanslash.l:835 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:2734 copy.c:388 +#: command.c:2730 copy.c:388 #, c-format msgid "%s: %s" msgstr "%s: %s" -#: command.c:2804 command.c:2850 +#: command.c:2802 command.c:2868 #, c-format msgid "\\watch: interval value is specified more than once" msgstr "\\watch: インターãƒãƒ«å€¤ãŒ2回以上指定ã•れã¾ã—ãŸ" -#: command.c:2814 command.c:2860 +#: command.c:2812 command.c:2878 #, c-format msgid "\\watch: incorrect interval value \"%s\"" msgstr "\\watch: 䏿­£ãªã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒ«å€¤ \"%s\"" -#: command.c:2824 +#: command.c:2822 #, c-format msgid "\\watch: iteration count is specified more than once" msgstr "\\watch: å復回数ãŒ2回以上指定ã•れã¾ã—ãŸ" -#: command.c:2834 +#: command.c:2832 #, c-format msgid "\\watch: incorrect iteration count \"%s\"" msgstr "\\watch: 䏿­£ãªå復回数 '%s'" -#: command.c:2841 +#: command.c:2842 +#, c-format +msgid "\\watch: minimum row count specified more than once" +msgstr "\\watch: è©ç§°è¡Œæ•°ãŒ2回以上指定ã•れã¾ã—ãŸ" + +#: command.c:2852 +#, c-format +msgid "\\watch: incorrect minimum row count \"%s\"" +msgstr "\\watch: 䏿­£ãªæœ€å°è¡Œæ•° \"%s\"" + +#: command.c:2859 #, c-format msgid "\\watch: unrecognized parameter \"%s\"" msgstr "\\watch: èªè­˜ã§ããªã„パラーメータ \"%s\"" -#: command.c:3234 startup.c:243 startup.c:293 +#: command.c:3256 startup.c:243 startup.c:293 msgid "Password: " msgstr "パスワード: " -#: command.c:3239 startup.c:290 +#: command.c:3261 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "ユーザー %s ã®ãƒ‘スワード: " -#: command.c:3295 +#: command.c:3317 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "接続文字列使用時ã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã€ãƒ›ã‚¹ãƒˆãŠã‚ˆã³ãƒãƒ¼ãƒˆã¯å€‹åˆ¥ã«æŒ‡å®šã—ãªã„ã§ãã ã•ã„" -#: command.c:3330 +#: command.c:3352 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "パラメータå†åˆ©ç”¨ã«ä½¿ç”¨å¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹æŽ¥ç¶šãŒã‚りã¾ã›ã‚“" -#: command.c:3636 +#: command.c:3659 #, c-format msgid "Previous connection kept" msgstr "以å‰ã®æŽ¥ç¶šã¯ä¿æŒã•れã¦ã„ã¾ã™" -#: command.c:3642 +#: command.c:3665 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3698 +#: command.c:3721 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ãƒ›ã‚¹ãƒˆ\"%s\"ã®ãƒãƒ¼ãƒˆ\"%s\"ã§æŽ¥ç¶šã—ã¾ã—ãŸã€‚\n" -#: command.c:3701 +#: command.c:3724 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ã‚½ã‚±ãƒƒãƒˆ\"%s\"ã®ãƒãƒ¼ãƒˆ\"%s\"を介ã—ã¦æŽ¥ç¶šã—ã¾ã—ãŸã€‚\n" -#: command.c:3707 +#: command.c:3730 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ãƒ›ã‚¹ãƒˆ\"%s\"(アドレス\"%s\")ã®ãƒãƒ¼ãƒˆ\"%s\"ã§æŽ¥ç¶šã—ã¾ã—ãŸã€‚\n" -#: command.c:3710 +#: command.c:3733 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦ã€ãƒ›ã‚¹ãƒˆ\"%s\"ã®ãƒãƒ¼ãƒˆ\"%s\"を介ã—ã¦æŽ¥ç¶šã—ã¾ã—ãŸã€‚\n" -#: command.c:3715 +#: command.c:3738 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "データベース\"%s\"ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼\"%s\"ã¨ã—ã¦æŽ¥ç¶šã—ã¾ã—ãŸã€‚\n" -#: command.c:3755 +#: command.c:3844 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%sã€ã‚µãƒ¼ãƒãƒ¼ %s)\n" -#: command.c:3768 +#: command.c:3857 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -457,29 +497,33 @@ msgstr "" "警告: %s ã®ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ %s ã§ã™ãŒã€ã‚µãƒ¼ãƒãƒ¼ã®ãƒ¡ã‚¸ãƒ£ãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ %s ã§ã™ã€‚\n" " psql ã®æ©Ÿèƒ½ã®ä¸­ã§ã€å‹•作ã—ãªã„ã‚‚ã®ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。\n" -#: command.c:3805 +#: command.c:3896 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" -msgstr "SSL接続(プロトコル: %sã€æš—å·åŒ–æ–¹å¼: %sã€åœ§ç¸®: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s, ALPN: %s)\n" +msgstr "SSL接続(プロトコル: %sã€æš—å·åŒ–æ–¹å¼: %sã€åœ§ç¸®: %sã€ALPN: %s)\n" -#: command.c:3806 command.c:3807 +#: command.c:3897 command.c:3898 msgid "unknown" msgstr "䏿˜Ž" -#: command.c:3808 help.c:42 +#: command.c:3899 help.c:42 msgid "off" msgstr "オフ" -#: command.c:3808 help.c:42 +#: command.c:3899 help.c:42 msgid "on" msgstr "オン" -#: command.c:3822 +#: command.c:3900 +msgid "none" +msgstr "ãªã—" + +#: command.c:3914 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPIæš—å·åŒ–接続\n" -#: command.c:3842 +#: command.c:3934 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -490,432 +534,437 @@ msgstr "" " 8ãƒ“ãƒƒãƒˆæ–‡å­—ãŒæ­£ã—ã表示ã•れãªã„å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚詳細ã¯psqlリファレンスマニュアルã®\n" " \"Windowsユーザーå‘ã‘ã®æ³¨æ„\" (Notes for Windows users)ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n" -#: command.c:3947 +#: command.c:4041 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "環境変数PSQL_EDITOR_LINENUMBER_ARGã§è¡Œç•ªå·ã‚’指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: command.c:3977 +#: command.c:4071 #, c-format msgid "could not start editor \"%s\"" msgstr "エディタ\"%s\"ã‚’èµ·å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: command.c:3979 +#: command.c:4073 #, c-format msgid "could not start /bin/sh" msgstr "/bin/shã‚’èµ·å‹•ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: command.c:4029 +#: command.c:4123 #, c-format msgid "could not locate temporary directory: %s" msgstr "一時ディレクトリãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: %s" -#: command.c:4056 +#: command.c:4150 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: command.c:4392 +#: command.c:4486 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: 曖昧ãªçŸ­ç¸®å½¢\"%s\"ãŒ\"%s\"ã¨\"%s\"ã®ã©ã¡ã‚‰ã«ã‚‚åˆè‡´ã—ã¾ã™" -#: command.c:4412 +#: command.c:4506 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset: 有効ãªãƒ•ォーマットã¯aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:4431 +#: command.c:4525 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: 有効ãªç·šã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯ ascii, old-ascii, unicode" -#: command.c:4446 +#: command.c:4540 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: 有効㪠Unicode 罫線ã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯ single, double" -#: command.c:4461 +#: command.c:4555 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: 有効㪠Unicode 列罫線ã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯ single, double" -#: command.c:4476 +#: command.c:4570 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: 有効㪠Unicode ヘッダー罫線ã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯ single, double" -#: command.c:4528 +#: command.c:4622 #, c-format msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width" msgstr "\\pset: xheader_widthã«æŒ‡å®šå¯èƒ½ãªå€¤ã¯ã€\"%s\" (default)ã€\"%s\"ã€\"%s\"ã€ã¾ãŸã¯å¹…ãã®ã‚‚ã®ã‚’指定ã™ã‚‹æ•°å€¤ã§ã™" -#: command.c:4545 +#: command.c:4639 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsepã¯å˜ä¸€ã®1ãƒã‚¤ãƒˆæ–‡å­—ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: command.c:4550 +#: command.c:4644 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldsepã¯ãƒ€ãƒ–ãƒ«ã‚¯ã‚©ãƒ¼ãƒˆã€æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ã«ã¯ã§ãã¾ã›ã‚“" -#: command.c:4688 command.c:4889 +#: command.c:4782 command.c:4983 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: 未定義ã®ã‚ªãƒ—ション:%s" -#: command.c:4708 +#: command.c:4802 #, c-format msgid "Border style is %d.\n" msgstr "罫線スタイル㯠%d ã§ã™ã€‚\n" -#: command.c:4714 +#: command.c:4808 #, c-format msgid "Target width is unset.\n" msgstr "ターゲットã®å¹…ãŒè¨­å®šã•れã¦ã„ã¾ã›ã‚“。\n" -#: command.c:4716 +#: command.c:4810 #, c-format msgid "Target width is %d.\n" msgstr "ターゲットã®å¹…㯠%d ã§ã™ã€‚\n" -#: command.c:4723 +#: command.c:4817 #, c-format msgid "Expanded display is on.\n" msgstr "拡張表示㯠on ã§ã™ã€‚\n" -#: command.c:4725 +#: command.c:4819 #, c-format msgid "Expanded display is used automatically.\n" msgstr "拡張表示ãŒè‡ªå‹•çš„ã«ä½¿ã‚れã¾ã™ã€‚\n" -#: command.c:4727 +#: command.c:4821 #, c-format msgid "Expanded display is off.\n" msgstr "拡張表示㯠off ã§ã™ã€‚\n" -#: command.c:4734 command.c:4736 command.c:4738 +#: command.c:4828 command.c:4830 command.c:4832 #, c-format msgid "Expanded header width is \"%s\".\n" msgstr "拡張表示ヘッダ幅ã¯\"%s\"ã§ã™ã€‚\n" -#: command.c:4740 +#: command.c:4834 #, c-format msgid "Expanded header width is %d.\n" msgstr "拡張表示ヘッダ幅ã¯%dã§ã™ã€‚\n" -#: command.c:4746 +#: command.c:4840 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "CSVã®ãƒ•ィールド区切り文字ã¯\"%s\"ã§ã™ã€‚\n" -#: command.c:4754 command.c:4762 +#: command.c:4848 command.c:4856 #, c-format msgid "Field separator is zero byte.\n" msgstr "フィールド区切り文字ã¯ã‚¼ãƒ­ãƒã‚¤ãƒˆã§ã™ã€‚\n" -#: command.c:4756 +#: command.c:4850 #, c-format msgid "Field separator is \"%s\".\n" msgstr "フィールド区切り文字ã¯\"%s\"ã§ã™ã€‚\n" -#: command.c:4769 +#: command.c:4863 #, c-format msgid "Default footer is on.\n" msgstr "デフォルトフッター(行数ã®è¡¨ç¤º)㯠on ã§ã™ã€‚\n" -#: command.c:4771 +#: command.c:4865 #, c-format msgid "Default footer is off.\n" msgstr "デフォルトフッター(行数ã®è¡¨ç¤º)㯠off ã§ã™ã€‚\n" -#: command.c:4777 +#: command.c:4871 #, c-format msgid "Output format is %s.\n" msgstr "出力形å¼ã¯ %s ã§ã™ã€‚\n" -#: command.c:4783 +#: command.c:4877 #, c-format msgid "Line style is %s.\n" msgstr "ç·šã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯ %s ã§ã™ã€‚\n" -#: command.c:4790 +#: command.c:4884 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null表示ã¯\"%s\"ã§ã™ã€‚\n" -#: command.c:4798 +#: command.c:4892 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "『数値出力時ã®ãƒ­ã‚±ãƒ¼ãƒ«èª¿æ•´ã€ã¯ on ã§ã™ã€‚\n" -#: command.c:4800 +#: command.c:4894 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "『数値出力時ã®ãƒ­ã‚±ãƒ¼ãƒ«èª¿æ•´ã€ã¯ off ã§ã™ã€‚\n" -#: command.c:4807 +#: command.c:4901 #, c-format msgid "Pager is used for long output.\n" msgstr "表示ãŒç¸¦ã«é•·ããªã‚‹å ´åˆã¯ãƒšãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’使ã„ã¾ã™ã€‚\n" -#: command.c:4809 +#: command.c:4903 #, c-format msgid "Pager is always used.\n" msgstr "常ã«ãƒšãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’使ã„ã¾ã™ã€‚\n" -#: command.c:4811 +#: command.c:4905 #, c-format msgid "Pager usage is off.\n" msgstr "「ページャーを使ã†ã€ã¯ off ã§ã™ã€‚\n" -#: command.c:4817 +#: command.c:4911 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "%d 行未満ã®å ´åˆã€ãƒšãƒ¼ã‚¸ãƒ£ãƒ¼ã¯ä½¿ã‚れã¾ã›ã‚“。\n" -#: command.c:4827 command.c:4837 +#: command.c:4921 command.c:4931 #, c-format msgid "Record separator is zero byte.\n" msgstr "レコードã®åŒºåˆ‡ã‚Šæ–‡å­—ã¯ã‚¼ãƒ­ãƒã‚¤ãƒˆã§ã™\n" -#: command.c:4829 +#: command.c:4923 #, c-format msgid "Record separator is .\n" msgstr "レコード区切り文字ã¯ã§ã™ã€‚\n" -#: command.c:4831 +#: command.c:4925 #, c-format msgid "Record separator is \"%s\".\n" msgstr "レコード区切り記å·ã¯\"%s\"ã§ã™ã€‚\n" -#: command.c:4844 +#: command.c:4938 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "テーブル属性ã¯\"%s\"ã§ã™ã€‚\n" -#: command.c:4847 +#: command.c:4941 #, c-format msgid "Table attributes unset.\n" msgstr "テーブル属性ã¯è¨­å®šã•れã¦ã„ã¾ã›ã‚“。\n" -#: command.c:4854 +#: command.c:4948 #, c-format msgid "Title is \"%s\".\n" msgstr "タイトルã¯\"%s\"ã§ã™ã€‚\n" -#: command.c:4856 +#: command.c:4950 #, c-format msgid "Title is unset.\n" msgstr "タイトルã¯è¨­å®šã•れã¦ã„ã¾ã›ã‚“。\n" -#: command.c:4863 +#: command.c:4957 #, c-format msgid "Tuples only is on.\n" msgstr "「タプルã®ã¿è¡¨ç¤ºã€ã¯ on ã§ã™ã€‚\n" -#: command.c:4865 +#: command.c:4959 #, c-format msgid "Tuples only is off.\n" msgstr "「タプルã®ã¿è¡¨ç¤ºã€ã¯ off ã§ã™ã€‚\n" -#: command.c:4871 +#: command.c:4965 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Unicode ã®ç½«ç·šã‚¹ã‚¿ã‚¤ãƒ«ã¯\"%s\"ã§ã™ã€‚\n" -#: command.c:4877 +#: command.c:4971 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Unicode 行罫線ã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯\"%s\"ã§ã™ã€‚\n" -#: command.c:4883 +#: command.c:4977 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Unicodeヘッダー行ã®ã‚¹ã‚¿ã‚¤ãƒ«ã¯\"%s\"ã§ã™ã€‚\n" -#: command.c:5132 +#: command.c:5226 #, c-format msgid "\\!: failed" msgstr "\\!: 失敗" -#: command.c:5166 +#: command.c:5264 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watchã¯ç©ºã®å•ã„åˆã‚ã›ã§ã¯ä½¿ãˆã¾ã›ã‚“" -#: command.c:5198 +#: command.c:5296 #, c-format msgid "could not set timer: %m" msgstr "タイマーを設定ã§ãã¾ã›ã‚“: %m" -#: command.c:5267 +#: command.c:5365 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (%g 秒毎)\n" -#: command.c:5270 +#: command.c:5368 #, c-format msgid "%s (every %gs)\n" msgstr "%s (%g 秒毎)\n" -#: command.c:5338 +#: command.c:5432 #, c-format msgid "could not wait for signals: %m" msgstr "シグナルを待機ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: command.c:5396 command.c:5403 common.c:592 common.c:599 common.c:1083 +#: command.c:5488 command.c:5495 common.c:632 common.c:639 common.c:1123 #, c-format msgid "" -"********* QUERY **********\n" +"/******** QUERY *********/\n" "%s\n" -"**************************\n" +"/************************/\n" "\n" msgstr "" -"******** å•ã„åˆã‚ã› ******\n" +"/****** å•ã„åˆã‚ã› ******/\n" "%s\n" -"**************************\n" +"/************************/\n" "\n" -#: command.c:5582 +#: command.c:5674 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\"ã¯ãƒ“ューã§ã¯ã‚りã¾ã›ã‚“" -#: command.c:5598 +#: command.c:5690 #, c-format msgid "could not parse reloptions array" msgstr "reloptionsé…列をパースã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: common.c:167 +#: common.c:206 #, c-format msgid "cannot escape without active connection" msgstr "æœ‰åŠ¹ãªæŽ¥ç¶šãŒãªã„ã®ã§ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã§ãã¾ã›ã‚“" -#: common.c:208 +#: common.c:247 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "シェルコマンドã®å¼•æ•°ã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"" -#: common.c:312 +#: common.c:351 #, c-format msgid "connection to server was lost" msgstr "サーãƒãƒ¼ã¸ã®æŽ¥ç¶šãŒå¤±ã‚れã¾ã—ãŸ" -#: common.c:316 +#: common.c:355 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "サーãƒãƒ¼ã¸ã®æŽ¥ç¶šãŒå¤±ã‚れã¾ã—ãŸã€‚リセットã—ã¦ã„ã¾ã™: " -#: common.c:321 +#: common.c:360 #, c-format msgid "Failed.\n" msgstr "失敗。\n" -#: common.c:338 +#: common.c:377 #, c-format msgid "Succeeded.\n" msgstr "æˆåŠŸã€‚\n" -#: common.c:390 common.c:1021 +#: common.c:430 common.c:1061 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "想定外ã®PQresultStatus: %d" -#: common.c:531 +#: common.c:571 #, c-format msgid "Time: %.3f ms\n" msgstr "時間: %.3f ミリ秒\n" -#: common.c:546 +#: common.c:586 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "時間: %.3f ミリ秒(%02d:%06.3f)\n" -#: common.c:555 +#: common.c:595 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "時間: %.3f ミリ秒 (%02d:%02d:%06.3f)\n" -#: common.c:562 +#: common.c:602 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "時間: %.3f ミリ秒 (%.0f æ—¥ %02d:%02d:%06.3f)\n" -#: common.c:586 common.c:643 common.c:1054 describe.c:6153 +#: common.c:626 common.c:683 common.c:1094 describe.c:6192 #, c-format msgid "You are currently not connected to a database." msgstr "ç¾åœ¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶šã—ã¦ã„ã¾ã›ã‚“。" -#: common.c:674 +#: common.c:714 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "PID %3$dã®ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスã‹ã‚‰ã€ãƒšã‚¤ãƒ­ãƒ¼ãƒ‰\"%2$s\"ã‚’æŒã¤éžåŒæœŸé€šçŸ¥\"%1$s\"ã‚’å—ä¿¡ã—ã¾ã—ãŸã€‚\n" -#: common.c:677 +#: common.c:717 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "PID %2$dã®ã‚µãƒ¼ãƒãƒ¼ãƒ—ロセスã‹ã‚‰éžåŒæœŸé€šçŸ¥\"%1$s\"ã‚’å—ä¿¡ã—ã¾ã—ãŸã€‚\n" -#: common.c:708 +#: common.c:748 #, c-format msgid "could not print result table: %m" msgstr "çµæžœãƒ†ãƒ¼ãƒ–ルを表示ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: common.c:728 +#: common.c:768 #, c-format msgid "no rows returned for \\gset" msgstr "\\gset ã«å¯¾ã—ã¦è¿”ã™ã¹ã行ãŒã‚りã¾ã›ã‚“" -#: common.c:733 +#: common.c:773 #, c-format msgid "more than one row returned for \\gset" msgstr "\\gset ã«å¯¾ã—ã¦è¤‡æ•°ã®è¡ŒãŒè¿”ã•れã¾ã—ãŸ" -#: common.c:751 +#: common.c:791 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "特殊変数\"%s\"ã¸ã®\\gsetã¯ç„¡è¦–ã•れã¾ã—ãŸ" -#: common.c:1063 +#: common.c:1103 #, c-format msgid "" -"***(Single step mode: verify command)*******************************************\n" +"/**(Single step mode: verify command)******************************************/\n" "%s\n" -"***(press return to proceed or enter x and return to cancel)********************\n" +"/**(press return to proceed or enter x and return to cancel)*******************/\n" msgstr "" -"***(シングルステップモード: コマンドを確èªã—ã¦ãã ã•ã„)********\n" +"/**(シングルステップモード: コマンドを確èªã—ã¦ãã ã•ã„)************************/\n" "%s\n" -"***([Enter] を押ã—ã¦é€²ã‚€ã‹ã€x [Enter] ã§ã‚­ãƒ£ãƒ³ã‚»ãƒ«)**************\n" +"/**([Enter] を押ã—ã¦é€²ã‚€ã‹ã€x [Enter] ã§ã‚­ãƒ£ãƒ³ã‚»ãƒ«)****************************/\n" -#: common.c:1146 +#: common.c:1180 #, c-format msgid "STATEMENT: %s" msgstr "æ–‡: %s" -#: common.c:1182 +#: common.c:1216 #, c-format msgid "unexpected transaction status (%d)" msgstr "想定外ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³çŠ¶æ…‹(%d)" -#: common.c:1335 describe.c:2026 +#: common.c:1362 describe.c:2025 msgid "Column" msgstr "列" -#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046 -#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027 -#: describe.c:3897 describe.c:4109 describe.c:4348 describe.c:4510 -#: describe.c:5785 +#: common.c:1363 describe.c:169 describe.c:355 describe.c:373 describe.c:1043 +#: describe.c:1201 describe.c:1731 describe.c:1755 describe.c:2026 +#: describe.c:3956 describe.c:4167 describe.c:4404 describe.c:4564 +#: describe.c:5829 msgid "Type" msgstr "タイプ" -#: common.c:1385 +#: common.c:1412 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯çµæžœã‚’è¿”å´ã—ãªã„ã‹ã€çµæžœã«ã‚«ãƒ©ãƒ ãŒå«ã¾ã‚Œã¾ã›ã‚“。\n" +#: common.c:1504 +#, c-format +msgid "fetching results in chunked mode failed" +msgstr "ãƒãƒ£ãƒ³ã‚¯ãƒ¢ãƒ¼ãƒ‰ã§ã®çµæžœã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸ" + #: copy.c:98 #, c-format msgid "\\copy: arguments required" @@ -931,11 +980,6 @@ msgstr "\\copy: \"%s\"ã§æ§‹æ–‡è§£æžã‚¨ãƒ©ãƒ¼" msgid "\\copy: parse error at end of line" msgstr "\\copy: è¡Œã®æœ«å°¾ã§æ§‹æ–‡è§£æžã‚¨ãƒ©ãƒ¼" -#: copy.c:326 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "コマンド\"%s\"を実行ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" - #: copy.c:342 #, c-format msgid "could not stat file \"%s\": %m" @@ -973,338 +1017,339 @@ msgstr "" "コピーã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã«ç¶šã„ã¦æ”¹è¡Œã‚’入力ã—ã¦ãã ã•ã„。\n" "ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã¨ãƒ”リオドã ã‘ã®è¡Œã€ã‚‚ã—ã㯠EOF シグナルã§çµ‚了ã—ã¾ã™ã€‚" -#: copy.c:682 +#: copy.c:684 msgid "aborted because of read failure" msgstr "読ã¿å–りエラーã®ãŸã‚中止" -#: copy.c:716 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "コピーモードを終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚" -#: crosstabview.c:123 +#: crosstabview.c:124 #, c-format msgid "\\crosstabview: statement did not return a result set" msgstr "\\crosstabview: æ–‡ã¯çµæžœã‚»ãƒƒãƒˆã‚’è¿”ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: crosstabview.c:129 +#: crosstabview.c:130 #, c-format msgid "\\crosstabview: query must return at least three columns" msgstr "\\crosstabview: å•ã„åˆã‚ã›ã¯ã€å°‘ãªãã¨ã‚‚3ã¤ã®åˆ—ã‚’è¿”ã™å¿…è¦ãŒã‚りã¾ã™" -#: crosstabview.c:156 +#: crosstabview.c:157 #, c-format msgid "\\crosstabview: vertical and horizontal headers must be different columns" msgstr "\\crosstabview: 垂直方å‘ã¨æ°´å¹³æ–¹å‘ã®ãƒ˜ãƒƒãƒ€ãƒ¼ã¯ç•°ãªã£ãŸåˆ—ã«ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: crosstabview.c:172 +#: crosstabview.c:173 #, c-format msgid "\\crosstabview: data column must be specified when query returns more than three columns" msgstr "\\crosstabview: å•ã„åˆã‚ã›ãŒ 4 ã¤ä»¥ä¸Šã®åˆ—ã‚’è¿”ã™å ´åˆã€ãƒ‡ãƒ¼ã‚¿åˆ—を指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: crosstabview.c:228 +#: crosstabview.c:229 #, c-format msgid "\\crosstabview: maximum number of columns (%d) exceeded" msgstr "列数ãŒåˆ¶é™å€¤(%d)ã‚’è¶…ãˆã¦ã„ã¾ã™" -#: crosstabview.c:397 +#: crosstabview.c:398 #, c-format msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" msgstr "\\crosstabview: å•ã„åˆã‚ã›çµæžœã®ä¸­ã®\"%s\"行 \"%s\"列ã«è¤‡æ•°ã®ãƒ‡ãƒ¼ã‚¿å€¤ãŒå«ã¾ã‚Œã¦ã„ã¾ã™" -#: crosstabview.c:645 +#: crosstabview.c:646 #, c-format msgid "\\crosstabview: column number %d is out of range 1..%d" msgstr "\\crosstabview: 列番å·%dãŒç¯„囲外ã§ã™(1..%d)" -#: crosstabview.c:670 +#: crosstabview.c:671 #, c-format msgid "\\crosstabview: ambiguous column name: \"%s\"" msgstr "\\crosstabview: 列åãŒã‚ã„ã¾ã„ã§ã™: \"%s\"" -#: crosstabview.c:678 +#: crosstabview.c:679 #, c-format msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: 列åãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ: \"%s\"" -#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038 -#: describe.c:1189 describe.c:1264 describe.c:3886 describe.c:4096 -#: describe.c:4346 describe.c:4428 describe.c:4663 describe.c:4871 -#: describe.c:5113 describe.c:5357 describe.c:5427 describe.c:5438 -#: describe.c:5495 describe.c:5899 describe.c:5977 +#: describe.c:87 describe.c:335 describe.c:626 describe.c:802 describe.c:1035 +#: describe.c:1190 describe.c:1264 describe.c:3945 describe.c:4154 +#: describe.c:4402 describe.c:4483 describe.c:4715 describe.c:4921 +#: describe.c:5165 describe.c:5406 describe.c:5475 describe.c:5486 +#: describe.c:5542 describe.c:5941 describe.c:6018 msgid "Schema" msgstr "スキーマ" -#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631 -#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265 -#: describe.c:3887 describe.c:4097 describe.c:4262 describe.c:4347 -#: describe.c:4429 describe.c:4592 describe.c:4664 describe.c:4872 -#: describe.c:4985 describe.c:5114 describe.c:5358 describe.c:5428 -#: describe.c:5439 describe.c:5496 describe.c:5695 describe.c:5766 -#: describe.c:5975 describe.c:6204 describe.c:6512 +#: describe.c:88 describe.c:166 describe.c:227 describe.c:336 describe.c:627 +#: describe.c:803 describe.c:924 describe.c:1036 describe.c:1265 +#: describe.c:3946 describe.c:4155 describe.c:4319 describe.c:4403 +#: describe.c:4484 describe.c:4645 describe.c:4716 describe.c:4922 +#: describe.c:5038 describe.c:5166 describe.c:5407 describe.c:5476 +#: describe.c:5487 describe.c:5543 describe.c:5740 describe.c:5810 +#: describe.c:6016 describe.c:6243 describe.c:6551 msgid "Name" msgstr "åå‰" -#: describe.c:89 describe.c:351 describe.c:369 +#: describe.c:89 describe.c:348 describe.c:366 msgid "Result data type" msgstr "çµæžœã®ãƒ‡ãƒ¼ã‚¿åž‹" -#: describe.c:90 describe.c:352 describe.c:370 +#: describe.c:90 describe.c:349 describe.c:367 msgid "Argument data types" msgstr "引数ã®ãƒ‡ãƒ¼ã‚¿åž‹" -#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418 -#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047 -#: describe.c:3682 describe.c:3941 describe.c:4143 describe.c:4286 -#: describe.c:4360 describe.c:4438 describe.c:4605 describe.c:4783 -#: describe.c:4921 describe.c:4994 describe.c:5115 describe.c:5266 -#: describe.c:5308 describe.c:5374 describe.c:5431 describe.c:5440 -#: describe.c:5497 describe.c:5713 describe.c:5788 describe.c:5913 -#: describe.c:5978 describe.c:7032 +#: describe.c:98 describe.c:105 describe.c:177 describe.c:241 describe.c:415 +#: describe.c:658 describe.c:818 describe.c:972 describe.c:1267 describe.c:2046 +#: describe.c:3676 describe.c:4000 describe.c:4201 describe.c:4343 +#: describe.c:4416 describe.c:4493 describe.c:4658 describe.c:4834 +#: describe.c:4975 describe.c:5047 describe.c:5167 describe.c:5317 +#: describe.c:5358 describe.c:5423 describe.c:5479 describe.c:5488 +#: describe.c:5544 describe.c:5758 describe.c:5832 describe.c:5955 +#: describe.c:6019 describe.c:7078 msgid "Description" msgstr "説明" -#: describe.c:128 +#: describe.c:127 msgid "List of aggregate functions" msgstr "集約関数一覧" -#: describe.c:153 +#: describe.c:152 #, c-format msgid "The server (version %s) does not support access methods." msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼(ãƒãƒ¼ã‚¸ãƒ§ãƒ³%s)ã¯ã‚¢ã‚¯ã‚»ã‚¹ãƒ¡ã‚½ãƒƒãƒ‰ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。" -#: describe.c:168 +#: describe.c:167 msgid "Index" msgstr "インデックス" -#: describe.c:169 describe.c:3905 describe.c:4122 describe.c:5900 +#: describe.c:168 describe.c:3964 describe.c:4180 describe.c:5942 msgid "Table" msgstr "テーブル" -#: describe.c:177 describe.c:5697 +#: describe.c:176 describe.c:5742 msgid "Handler" msgstr "ãƒãƒ³ãƒ‰ãƒ©" -#: describe.c:201 +#: describe.c:199 msgid "List of access methods" msgstr "アクセスメソッド一覧" -#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188 -#: describe.c:3898 describe.c:4098 describe.c:4263 describe.c:4594 -#: describe.c:4986 describe.c:5696 describe.c:5767 describe.c:6205 -#: describe.c:6393 describe.c:6513 describe.c:6672 describe.c:6758 -#: describe.c:7020 +#: describe.c:228 describe.c:401 describe.c:651 describe.c:925 describe.c:1189 +#: describe.c:3957 describe.c:4156 describe.c:4320 describe.c:4647 +#: describe.c:5039 describe.c:5741 describe.c:5811 describe.c:6244 +#: describe.c:6431 describe.c:6552 describe.c:6722 describe.c:6807 +#: describe.c:7066 msgid "Owner" msgstr "所有者" -#: describe.c:231 +#: describe.c:229 msgid "Location" msgstr "場所" -#: describe.c:241 describe.c:3517 +#: describe.c:239 describe.c:3517 describe.c:3857 msgid "Options" msgstr "オプション" -#: describe.c:242 describe.c:653 describe.c:972 describe.c:3940 +#: describe.c:240 describe.c:649 describe.c:970 describe.c:3999 msgid "Size" msgstr "サイズ" -#: describe.c:266 +#: describe.c:263 msgid "List of tablespaces" msgstr "テーブル空間一覧" -#: describe.c:311 +#: describe.c:308 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\dfã§æŒ‡å®šã§ãるオプション㯠[anptwS+] ã®ã¿ã§ã™" -#: describe.c:319 +#: describe.c:316 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\dfã¯ã“ã®ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³%2$sã§ã¯\"%1$c\"ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã¯æŒ‡å®šã§ãã¾ã›ã‚“" #. translator: "agg" is short for "aggregate" -#: describe.c:354 describe.c:372 +#: describe.c:351 describe.c:369 msgid "agg" msgstr "集約" -#: describe.c:355 describe.c:373 +#: describe.c:352 describe.c:370 msgid "window" msgstr "ウィンドウ" -#: describe.c:356 +#: describe.c:353 msgid "proc" msgstr "プロシージャ" -#: describe.c:357 describe.c:375 +#: describe.c:354 describe.c:372 msgid "func" msgstr "関数" -#: describe.c:374 describe.c:1397 +#: describe.c:371 describe.c:1397 msgid "trigger" msgstr "トリガー" -#: describe.c:386 +#: describe.c:383 msgid "immutable" msgstr "IMMUTABLE" -#: describe.c:387 +#: describe.c:384 msgid "stable" msgstr "STABLE" -#: describe.c:388 +#: describe.c:385 msgid "volatile" msgstr "VOLATILE" -#: describe.c:389 +#: describe.c:386 msgid "Volatility" msgstr "関数ã®å¤‰å‹•性分類" -#: describe.c:397 +#: describe.c:394 msgid "restricted" msgstr "制é™ä»˜ã" -#: describe.c:398 +#: describe.c:395 msgid "safe" msgstr "安全" -#: describe.c:399 +#: describe.c:396 msgid "unsafe" msgstr "å±é™º" -#: describe.c:400 +#: describe.c:397 msgid "Parallel" msgstr "並列実行" -#: describe.c:405 +#: describe.c:402 msgid "definer" msgstr "定義ロール" -#: describe.c:406 +#: describe.c:403 msgid "invoker" msgstr "起動ロール" -#: describe.c:407 +#: describe.c:404 msgid "Security" msgstr "セキュリティ" -#: describe.c:412 +#: describe.c:409 msgid "Language" msgstr "手続ã言語" -#: describe.c:415 describe.c:652 +#: describe.c:412 describe.c:648 msgid "Internal name" msgstr "内部å" -#: describe.c:589 +#: describe.c:585 msgid "List of functions" msgstr "関数一覧" -#: describe.c:654 +#: describe.c:650 msgid "Elements" msgstr "æ§‹æˆè¦ç´ " -#: describe.c:706 +#: describe.c:701 msgid "List of data types" msgstr "データ型一覧" -#: describe.c:809 +#: describe.c:804 msgid "Left arg type" msgstr "左辺ã®åž‹" -#: describe.c:810 +#: describe.c:805 msgid "Right arg type" msgstr "å³è¾ºã®åž‹" -#: describe.c:811 +#: describe.c:806 msgid "Result type" msgstr "çµæžœã®åž‹" -#: describe.c:816 describe.c:4600 describe.c:4766 describe.c:5265 -#: describe.c:6949 describe.c:6953 +#: describe.c:811 describe.c:4653 describe.c:4817 describe.c:5316 +#: describe.c:6996 describe.c:7000 msgid "Function" msgstr "関数" -#: describe.c:897 +#: describe.c:891 msgid "List of operators" msgstr "演算å­ä¸€è¦§" -#: describe.c:932 +#: describe.c:926 msgid "Encoding" msgstr "エンコーディング" -#: describe.c:936 describe.c:940 +#: describe.c:930 describe.c:934 msgid "Locale Provider" msgstr "ロケールプロãƒã‚¤ãƒ€ãƒ¼" -#: describe.c:944 describe.c:4886 +#: describe.c:938 describe.c:4936 msgid "Collate" msgstr "ç…§åˆé †åº" -#: describe.c:945 describe.c:4887 +#: describe.c:939 describe.c:4937 msgid "Ctype" msgstr "Ctype(å¤‰æ›æ¼”ç®—å­)" -#: describe.c:949 describe.c:953 describe.c:4892 describe.c:4896 -msgid "ICU Locale" -msgstr "ICUロケール" +#: describe.c:943 describe.c:947 describe.c:951 describe.c:4942 describe.c:4946 +#: describe.c:4950 +msgid "Locale" +msgstr "ロケール" -#: describe.c:957 describe.c:961 describe.c:4901 describe.c:4905 +#: describe.c:955 describe.c:959 describe.c:4955 describe.c:4959 msgid "ICU Rules" msgstr "ICUルール:" -#: describe.c:973 +#: describe.c:971 msgid "Tablespace" msgstr "テーブル空間" -#: describe.c:999 +#: describe.c:996 msgid "List of databases" msgstr "データベース一覧" -#: describe.c:1040 describe.c:1191 describe.c:3888 +#: describe.c:1037 describe.c:1192 describe.c:3947 msgid "table" msgstr "テーブル" -#: describe.c:1041 describe.c:3889 +#: describe.c:1038 describe.c:3948 msgid "view" msgstr "ビュー" -#: describe.c:1042 describe.c:3890 +#: describe.c:1039 describe.c:3949 msgid "materialized view" msgstr "実体化ビュー" -#: describe.c:1043 describe.c:1193 describe.c:3892 +#: describe.c:1040 describe.c:1194 describe.c:3951 msgid "sequence" msgstr "シーケンス" -#: describe.c:1044 describe.c:3894 +#: describe.c:1041 describe.c:3953 msgid "foreign table" msgstr "外部テーブル" -#: describe.c:1045 describe.c:3895 describe.c:4107 +#: describe.c:1042 describe.c:3954 describe.c:4165 msgid "partitioned table" msgstr "パーティションテーブル" -#: describe.c:1056 +#: describe.c:1058 msgid "Column privileges" msgstr "åˆ—ã®æ¨©é™" -#: describe.c:1087 describe.c:1121 +#: describe.c:1089 describe.c:1123 msgid "Policies" msgstr "ãƒãƒªã‚·ãƒ¼" -#: describe.c:1150 describe.c:4516 describe.c:6617 +#: describe.c:1151 describe.c:4570 describe.c:6667 msgid "Access privileges" msgstr "アクセス権é™" -#: describe.c:1195 +#: describe.c:1196 msgid "function" msgstr "関数" -#: describe.c:1197 +#: describe.c:1198 msgid "type" msgstr "åž‹" -#: describe.c:1199 +#: describe.c:1200 msgid "schema" msgstr "スキーマ" @@ -1336,293 +1381,293 @@ msgstr "æ¼”ç®—å­æ—" msgid "rule" msgstr "ルール" -#: describe.c:1421 +#: describe.c:1420 msgid "Object descriptions" msgstr "オブジェクトã®èª¬æ˜Ž" -#: describe.c:1486 describe.c:4013 +#: describe.c:1485 describe.c:4072 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "\"%s\"ã¨ã„ã†åå‰ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:1489 describe.c:4016 +#: describe.c:1488 describe.c:4075 #, c-format msgid "Did not find any relations." msgstr "リレーションãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:1685 +#: describe.c:1684 #, c-format msgid "Did not find any relation with OID %s." msgstr "OID %sã‚’æŒã¤ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:1733 describe.c:1757 +#: describe.c:1732 describe.c:1756 msgid "Start" msgstr "é–‹å§‹" -#: describe.c:1734 describe.c:1758 +#: describe.c:1733 describe.c:1757 msgid "Minimum" msgstr "最å°" -#: describe.c:1735 describe.c:1759 +#: describe.c:1734 describe.c:1758 msgid "Maximum" msgstr "最大" -#: describe.c:1736 describe.c:1760 +#: describe.c:1735 describe.c:1759 msgid "Increment" msgstr "増分" -#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4432 -#: describe.c:4777 describe.c:4910 describe.c:4915 describe.c:6660 +#: describe.c:1736 describe.c:1760 describe.c:1889 describe.c:4487 +#: describe.c:4828 describe.c:4964 describe.c:4969 describe.c:6710 msgid "yes" msgstr "ã¯ã„" -#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4432 -#: describe.c:4774 describe.c:4910 describe.c:6661 +#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4487 +#: describe.c:4825 describe.c:4964 describe.c:6711 msgid "no" msgstr "ã„ã„ãˆ" -#: describe.c:1739 describe.c:1763 +#: describe.c:1738 describe.c:1762 msgid "Cycles?" msgstr "循環?" -#: describe.c:1740 describe.c:1764 +#: describe.c:1739 describe.c:1763 msgid "Cache" msgstr "キャッシュ" -#: describe.c:1805 +#: describe.c:1804 #, c-format msgid "Owned by: %s" msgstr "所有者: %s" -#: describe.c:1809 +#: describe.c:1808 #, c-format msgid "Sequence for identity column: %s" msgstr "識別列ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹: %s" -#: describe.c:1817 +#: describe.c:1816 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "ログ出力ãªã—ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹\"%s.%s\"" -#: describe.c:1820 +#: describe.c:1819 #, c-format msgid "Sequence \"%s.%s\"" msgstr "シーケンス \"%s.%s\"" -#: describe.c:1963 +#: describe.c:1962 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "ログ出力ãªã—ã®ãƒ†ãƒ¼ãƒ–ル\"%s.%s\"" -#: describe.c:1966 +#: describe.c:1965 #, c-format msgid "Table \"%s.%s\"" msgstr "テーブル\"%s.%s\"" -#: describe.c:1970 +#: describe.c:1969 #, c-format msgid "View \"%s.%s\"" msgstr "ビュー\"%s.%s\"" -#: describe.c:1975 +#: describe.c:1974 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "ログ出力ãªã—ã®å®Ÿä½“化ビュー\"%s.%s\"" -#: describe.c:1978 +#: describe.c:1977 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "実体化ビュー\"%s.%s\"" -#: describe.c:1983 +#: describe.c:1982 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "ログ出力ãªã—ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹\"%s.%s\"" -#: describe.c:1986 +#: describe.c:1985 #, c-format msgid "Index \"%s.%s\"" msgstr "インデックス\"%s.%s\"" -#: describe.c:1991 +#: describe.c:1990 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "ログ出力ãªã—ã®ãƒ‘ーティション親インデックス\"%s.%s\"" -#: describe.c:1994 +#: describe.c:1993 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "パーティションインデックス\"%s.%s\"" -#: describe.c:1998 +#: describe.c:1997 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST テーブル\"%s.%s\"" -#: describe.c:2002 +#: describe.c:2001 #, c-format msgid "Composite type \"%s.%s\"" msgstr "複åˆåž‹\"%s.%s\"" -#: describe.c:2006 +#: describe.c:2005 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "外部テーブル\"%s.%s\"" -#: describe.c:2011 +#: describe.c:2010 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "ログ出力ãªã—ã®ãƒ‘ーティション親テーブル\"%s.%s\"" -#: describe.c:2014 +#: describe.c:2013 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "パーティションテーブル\"%s.%s\"" -#: describe.c:2030 describe.c:4349 +#: describe.c:2029 describe.c:4405 msgid "Collation" msgstr "ç…§åˆé †åº" -#: describe.c:2031 describe.c:4350 +#: describe.c:2030 describe.c:4406 msgid "Nullable" msgstr "Null 値を許容" -#: describe.c:2032 describe.c:4351 +#: describe.c:2031 describe.c:4407 msgid "Default" msgstr "デフォルト" -#: describe.c:2035 +#: describe.c:2034 msgid "Key?" msgstr "キー?" -#: describe.c:2037 describe.c:4671 describe.c:4682 +#: describe.c:2036 describe.c:4723 describe.c:4734 msgid "Definition" msgstr "定義" -#: describe.c:2039 describe.c:5712 describe.c:5787 describe.c:5853 -#: describe.c:5912 +#: describe.c:2038 describe.c:5757 describe.c:5831 describe.c:5896 +#: describe.c:5954 msgid "FDW options" msgstr "FDW オプション" -#: describe.c:2041 +#: describe.c:2040 msgid "Storage" msgstr "ストレージ" -#: describe.c:2043 +#: describe.c:2042 msgid "Compression" msgstr "圧縮" -#: describe.c:2045 +#: describe.c:2044 msgid "Stats target" msgstr "統計目標" -#: describe.c:2181 +#: describe.c:2180 #, c-format msgid "Partition of: %s %s%s" msgstr "親パーティション: %s %s%s" -#: describe.c:2194 +#: describe.c:2193 msgid "No partition constraint" msgstr "パーティション制約ãªã—" -#: describe.c:2196 +#: describe.c:2195 #, c-format msgid "Partition constraint: %s" msgstr "パーティションã®åˆ¶ç´„: %s" -#: describe.c:2220 +#: describe.c:2219 #, c-format msgid "Partition key: %s" msgstr "パーティションキー: %s" -#: describe.c:2246 +#: describe.c:2245 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "所属先テーブル\"%s.%s\"" -#: describe.c:2315 +#: describe.c:2314 msgid "primary key, " msgstr "プライマリキー, " -#: describe.c:2318 +#: describe.c:2317 msgid "unique" msgstr "ユニーク" -#: describe.c:2320 +#: describe.c:2319 msgid " nulls not distinct" msgstr " nulls not distinct" -#: describe.c:2321 +#: describe.c:2320 msgid ", " msgstr ", " -#: describe.c:2328 +#: describe.c:2327 #, c-format msgid "for table \"%s.%s\"" msgstr "テーブル\"%s.%s\"用" -#: describe.c:2332 +#: describe.c:2331 #, c-format msgid ", predicate (%s)" msgstr "ã€è¿°èªž (%s)" -#: describe.c:2335 +#: describe.c:2334 msgid ", clustered" msgstr "ã€ã‚¯ãƒ©ã‚¹ã‚¿ãƒ¼åŒ–" -#: describe.c:2338 +#: describe.c:2337 msgid ", invalid" msgstr "無効" -#: describe.c:2341 +#: describe.c:2340 msgid ", deferrable" msgstr "ã€é…å»¶å¯èƒ½" -#: describe.c:2344 +#: describe.c:2343 msgid ", initially deferred" msgstr "ã€æœ€åˆã‹ã‚‰é…延中" -#: describe.c:2347 +#: describe.c:2346 msgid ", replica identity" msgstr "ã€ãƒ¬ãƒ—リカ㮠id" -#: describe.c:2401 +#: describe.c:2400 msgid "Indexes:" msgstr "インデックス:" -#: describe.c:2484 +#: describe.c:2483 msgid "Check constraints:" msgstr "Check 制約:" -#: describe.c:2552 +#: describe.c:2551 msgid "Foreign-key constraints:" msgstr "外部キー制約:" -#: describe.c:2615 +#: describe.c:2614 msgid "Referenced by:" msgstr "å‚ç…§å…ƒ:" -#: describe.c:2665 +#: describe.c:2664 msgid "Policies:" msgstr "ãƒãƒªã‚·ãƒ¼:" -#: describe.c:2668 +#: describe.c:2667 msgid "Policies (forced row security enabled):" msgstr "ãƒãƒªã‚·ãƒ¼(è¡Œã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚’å¼·åˆ¶çš„ã«æœ‰åŠ¹åŒ–):" -#: describe.c:2671 +#: describe.c:2670 msgid "Policies (row security enabled): (none)" msgstr "ãƒãƒªã‚·ãƒ¼(行セキュリティ有効化): (ãªã—)" -#: describe.c:2674 +#: describe.c:2673 msgid "Policies (forced row security enabled): (none)" msgstr "ãƒãƒªã‚·ãƒ¼(è¡Œã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ã‚’å¼·åˆ¶çš„ã«æœ‰åŠ¹åŒ–): (ãªã—)" -#: describe.c:2677 +#: describe.c:2676 msgid "Policies (row security disabled):" msgstr "ãƒãƒªã‚·ãƒ¼(行セキュリティを無効化):" -#: describe.c:2737 describe.c:2841 +#: describe.c:2736 describe.c:2841 msgid "Statistics objects:" msgstr "統計オブジェクト:" @@ -1642,7 +1687,7 @@ msgstr "常ã«é©ç”¨ã™ã‚‹ãƒ«ãƒ¼ãƒ«:" msgid "Rules firing on replica only:" msgstr "レプリカ上ã§ã®ã¿é©ç”¨ã™ã‚‹ãƒ«ãƒ¼ãƒ«:" -#: describe.c:3031 describe.c:5048 +#: describe.c:3031 describe.c:5100 msgid "Publications:" msgstr "パブリケーション:" @@ -1737,441 +1782,449 @@ msgstr "テーブル空間: \"%s\"" msgid ", tablespace \"%s\"" msgstr "ã€ãƒ†ãƒ¼ãƒ–ル空間\"%s\"" -#: describe.c:3674 +#: describe.c:3670 msgid "List of roles" msgstr "ロール一覧" -#: describe.c:3676 +#: describe.c:3672 describe.c:3840 msgid "Role name" msgstr "ロールå" -#: describe.c:3677 +#: describe.c:3673 msgid "Attributes" msgstr "属性" -#: describe.c:3679 -msgid "Member of" -msgstr "所属グループ" - -#: describe.c:3690 +#: describe.c:3684 msgid "Superuser" msgstr "スーパーユーザー" -#: describe.c:3693 +#: describe.c:3687 msgid "No inheritance" msgstr "継承ãªã—" -#: describe.c:3696 +#: describe.c:3690 msgid "Create role" msgstr "ロール作æˆå¯" -#: describe.c:3699 +#: describe.c:3693 msgid "Create DB" msgstr "DB作æˆå¯" -#: describe.c:3702 +#: describe.c:3696 msgid "Cannot login" msgstr "ログインã§ãã¾ã›ã‚“" -#: describe.c:3705 +#: describe.c:3699 msgid "Replication" msgstr "レプリケーションå¯" -#: describe.c:3709 +#: describe.c:3703 msgid "Bypass RLS" msgstr "RLS ã®ãƒã‚¤ãƒ‘ス" -#: describe.c:3718 +#: describe.c:3712 msgid "No connections" msgstr "接続ãªã—" -#: describe.c:3720 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d å€‹ã®æŽ¥ç¶š" -#: describe.c:3730 +#: describe.c:3724 msgid "Password valid until " msgstr "ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã®æœ‰åŠ¹æœŸé™ " -#: describe.c:3783 +#: describe.c:3775 msgid "Role" msgstr "ロール" -#: describe.c:3784 +#: describe.c:3776 msgid "Database" msgstr "データベース" -#: describe.c:3785 +#: describe.c:3777 msgid "Settings" msgstr "設定" -#: describe.c:3809 +#: describe.c:3801 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "ロール\"%s\"ã¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\"%s\"ã®è¨­å®šãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:3812 +#: describe.c:3804 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "ロール\"%s\"ã®è¨­å®šãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:3815 +#: describe.c:3807 #, c-format msgid "Did not find any settings." msgstr "設定ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:3820 +#: describe.c:3811 msgid "List of settings" msgstr "設定一覧" -#: describe.c:3891 +#: describe.c:3841 +msgid "Member of" +msgstr "所属グループ" + +#: describe.c:3858 +msgid "Grantor" +msgstr "付与者" + +#: describe.c:3884 +msgid "List of role grants" +msgstr "ロール権é™ä»˜ä¸Žä¸€è¦§" + +#: describe.c:3950 msgid "index" msgstr "インデックス" -#: describe.c:3893 +#: describe.c:3952 msgid "TOAST table" msgstr "TOAST テーブル" -#: describe.c:3896 describe.c:4108 +#: describe.c:3955 describe.c:4166 msgid "partitioned index" msgstr "パーティションインデックス" -#: describe.c:3916 +#: describe.c:3975 msgid "permanent" msgstr "永続" -#: describe.c:3917 +#: describe.c:3976 msgid "temporary" msgstr "一時" -#: describe.c:3918 +#: describe.c:3977 msgid "unlogged" msgstr "ログãªã—" -#: describe.c:3919 +#: describe.c:3978 msgid "Persistence" msgstr "永続性" -#: describe.c:3935 +#: describe.c:3994 msgid "Access method" msgstr "アクセスメソッド" -#: describe.c:4021 +#: describe.c:4079 msgid "List of relations" msgstr "リレーション一覧" -#: describe.c:4069 +#: describe.c:4127 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼(ãƒãƒ¼ã‚¸ãƒ§ãƒ³%s)ã¯å®£è¨€çš„テーブルパーティショニングをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。" -#: describe.c:4080 +#: describe.c:4138 msgid "List of partitioned indexes" msgstr "パーティションインデックスã®ä¸€è¦§" -#: describe.c:4082 +#: describe.c:4140 msgid "List of partitioned tables" msgstr "パーティションテーブルã®ä¸€è¦§" -#: describe.c:4086 +#: describe.c:4144 msgid "List of partitioned relations" msgstr "パーティションリレーションã®ä¸€è¦§" -#: describe.c:4117 +#: describe.c:4175 msgid "Parent name" msgstr "親ã®åå‰" -#: describe.c:4130 +#: describe.c:4188 msgid "Leaf partition size" msgstr "末端パーティションã®ã‚µã‚¤ã‚º" -#: describe.c:4133 describe.c:4139 +#: describe.c:4191 describe.c:4197 msgid "Total size" msgstr "トータルサイズ" -#: describe.c:4264 +#: describe.c:4321 msgid "Trusted" msgstr "信頼済ã¿" -#: describe.c:4273 +#: describe.c:4330 msgid "Internal language" msgstr "内部言語" -#: describe.c:4274 +#: describe.c:4331 msgid "Call handler" msgstr "呼ã³å‡ºã—ãƒãƒ³ãƒ‰ãƒ©ãƒ¼" -#: describe.c:4275 describe.c:5698 +#: describe.c:4332 describe.c:5743 msgid "Validator" msgstr "ãƒãƒªãƒ‡ãƒ¼ã‚¿ãƒ¼" -#: describe.c:4276 +#: describe.c:4333 msgid "Inline handler" msgstr "インラインãƒãƒ³ãƒ‰ãƒ©ãƒ¼" -#: describe.c:4311 +#: describe.c:4367 msgid "List of languages" msgstr "手続ã言語一覧" -#: describe.c:4352 +#: describe.c:4408 msgid "Check" msgstr "CHECK制約" -#: describe.c:4396 +#: describe.c:4451 msgid "List of domains" msgstr "ドメイン一覧" -#: describe.c:4430 +#: describe.c:4485 msgid "Source" msgstr "変æ›å…ƒ" -#: describe.c:4431 +#: describe.c:4486 msgid "Destination" msgstr "変æ›å…ˆ" -#: describe.c:4433 describe.c:6662 +#: describe.c:4488 describe.c:6712 msgid "Default?" msgstr "デフォルト?" -#: describe.c:4475 +#: describe.c:4529 msgid "List of conversions" msgstr "符å·åŒ–æ–¹å¼ä¸€è¦§" -#: describe.c:4503 +#: describe.c:4557 msgid "Parameter" msgstr "パラメータ" -#: describe.c:4504 +#: describe.c:4558 msgid "Value" msgstr "値" -#: describe.c:4511 +#: describe.c:4565 msgid "Context" msgstr "コンテクスト" -#: describe.c:4544 +#: describe.c:4597 msgid "List of configuration parameters" msgstr "設定パラメータã®ä¸€è¦§" -#: describe.c:4546 +#: describe.c:4599 msgid "List of non-default configuration parameters" msgstr "éžãƒ‡ãƒ•ォルトã®è¨­å®šãƒ‘ラメータã®ä¸€è¦§" -#: describe.c:4573 +#: describe.c:4626 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼(ãƒãƒ¼ã‚¸ãƒ§ãƒ³%s)ã¯ã‚¤ãƒ™ãƒ³ãƒˆãƒˆãƒªã‚¬ãƒ¼ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。" -#: describe.c:4593 +#: describe.c:4646 msgid "Event" msgstr "イベント" -#: describe.c:4595 +#: describe.c:4648 msgid "enabled" msgstr "有効" -#: describe.c:4596 +#: describe.c:4649 msgid "replica" msgstr "レプリカ" -#: describe.c:4597 +#: describe.c:4650 msgid "always" msgstr "常時" -#: describe.c:4598 +#: describe.c:4651 msgid "disabled" msgstr "無効" -#: describe.c:4599 describe.c:6514 +#: describe.c:4652 describe.c:6553 msgid "Enabled" msgstr "有効状態" -#: describe.c:4601 +#: describe.c:4654 msgid "Tags" msgstr "ã‚¿ã‚°" -#: describe.c:4625 +#: describe.c:4677 msgid "List of event triggers" msgstr "イベントトリガー一覧" -#: describe.c:4652 +#: describe.c:4704 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼(ãƒãƒ¼ã‚¸ãƒ§ãƒ³%s)ã¯æ‹¡å¼µçµ±è¨ˆæƒ…報をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。" -#: describe.c:4689 +#: describe.c:4741 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4690 +#: describe.c:4742 msgid "Dependencies" msgstr "Dependencies" -#: describe.c:4700 +#: describe.c:4752 msgid "MCV" msgstr "MCV" -#: describe.c:4724 +#: describe.c:4775 msgid "List of extended statistics" msgstr "拡張統計情報ã®ä¸€è¦§" -#: describe.c:4751 +#: describe.c:4802 msgid "Source type" msgstr "変æ›å…ƒã®åž‹" -#: describe.c:4752 +#: describe.c:4803 msgid "Target type" msgstr "変æ›å…ˆã®åž‹" -#: describe.c:4776 +#: describe.c:4827 msgid "in assignment" msgstr "代入時ã®ã¿" -#: describe.c:4778 +#: describe.c:4829 msgid "Implicit?" msgstr "暗黙的ã«é©ç”¨ ?" -#: describe.c:4837 +#: describe.c:4887 msgid "List of casts" msgstr "キャスト一覧" -#: describe.c:4877 describe.c:4881 +#: describe.c:4927 describe.c:4931 msgid "Provider" msgstr "プロãƒã‚¤ãƒ€ãƒ¼" -#: describe.c:4911 describe.c:4916 +#: describe.c:4965 describe.c:4970 msgid "Deterministic?" msgstr "確定的?" -#: describe.c:4956 +#: describe.c:5009 msgid "List of collations" msgstr "ç…§åˆé †åºä¸€è¦§" -#: describe.c:5018 +#: describe.c:5070 msgid "List of schemas" msgstr "スキーマ一覧" -#: describe.c:5135 +#: describe.c:5186 msgid "List of text search parsers" msgstr "テキスト検索用パーサ一覧" -#: describe.c:5185 +#: describe.c:5236 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "テキスト検索用パーサ\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:5188 +#: describe.c:5239 #, c-format msgid "Did not find any text search parsers." msgstr "テキスト検索パーサãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:5263 +#: describe.c:5314 msgid "Start parse" msgstr "パース開始" -#: describe.c:5264 +#: describe.c:5315 msgid "Method" msgstr "メソッド" -#: describe.c:5268 +#: describe.c:5319 msgid "Get next token" msgstr "次ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚’å–å¾—" -#: describe.c:5270 +#: describe.c:5321 msgid "End parse" msgstr "パース終了" -#: describe.c:5272 +#: describe.c:5323 msgid "Get headline" msgstr "見出ã—ã‚’å–å¾—" -#: describe.c:5274 +#: describe.c:5325 msgid "Get token types" msgstr "トークンタイプをå–å¾—" -#: describe.c:5285 +#: describe.c:5335 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "テキスト検索パーサ\"%s.%s\"" -#: describe.c:5288 +#: describe.c:5338 #, c-format msgid "Text search parser \"%s\"" msgstr "テキスト検索パーサ\"%s\"" -#: describe.c:5307 +#: describe.c:5357 msgid "Token name" msgstr "トークンå" -#: describe.c:5321 +#: describe.c:5370 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "パーサ\"%s.%s\"ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚¿ã‚¤ãƒ—" -#: describe.c:5324 +#: describe.c:5373 #, c-format msgid "Token types for parser \"%s\"" msgstr "パーサ\"%s\"ã®ãƒˆãƒ¼ã‚¯ãƒ³ã‚¿ã‚¤ãƒ—" -#: describe.c:5368 +#: describe.c:5417 msgid "Template" msgstr "テンプレート" -#: describe.c:5369 +#: describe.c:5418 msgid "Init options" msgstr "åˆæœŸåŒ–オプション" -#: describe.c:5396 +#: describe.c:5444 msgid "List of text search dictionaries" msgstr "テキスト検索用辞書一覧" -#: describe.c:5429 +#: describe.c:5477 msgid "Init" msgstr "åˆæœŸåŒ–" -#: describe.c:5430 +#: describe.c:5478 msgid "Lexize" msgstr "Lex 処ç†" -#: describe.c:5462 +#: describe.c:5509 msgid "List of text search templates" msgstr "テキスト検索テンプレート一覧" -#: describe.c:5517 +#: describe.c:5563 msgid "List of text search configurations" msgstr "テキスト検索設定一覧" -#: describe.c:5568 +#: describe.c:5614 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "テキスト検索用設定\"%s\"ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:5571 +#: describe.c:5617 #, c-format msgid "Did not find any text search configurations." msgstr "テキスト検索設定ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:5637 +#: describe.c:5683 msgid "Token" msgstr "トークン" -#: describe.c:5638 +#: describe.c:5684 msgid "Dictionaries" msgstr "辞書" -#: describe.c:5649 +#: describe.c:5695 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "テキスト検索設定\"%s.%s\"" -#: describe.c:5652 +#: describe.c:5698 #, c-format msgid "Text search configuration \"%s\"" msgstr "テキスト検索設定\"%s\"" -#: describe.c:5656 +#: describe.c:5702 #, c-format msgid "" "\n" @@ -2180,7 +2233,7 @@ msgstr "" "\n" "パーサ: \"%s.%s\"" -#: describe.c:5659 +#: describe.c:5705 #, c-format msgid "" "\n" @@ -2189,265 +2242,273 @@ msgstr "" "\n" "パーサ: \"%s\"" -#: describe.c:5740 +#: describe.c:5784 msgid "List of foreign-data wrappers" msgstr "外部データラッパ一覧" -#: describe.c:5768 +#: describe.c:5812 msgid "Foreign-data wrapper" msgstr "外部データラッパ" -#: describe.c:5786 describe.c:5976 +#: describe.c:5830 describe.c:6017 msgid "Version" msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³" -#: describe.c:5817 +#: describe.c:5860 msgid "List of foreign servers" msgstr "外部サーãƒãƒ¼ä¸€è¦§" -#: describe.c:5842 describe.c:5901 +#: describe.c:5885 describe.c:5943 msgid "Server" msgstr "サーãƒãƒ¼" -#: describe.c:5843 +#: describe.c:5886 msgid "User name" msgstr "ユーザーå" -#: describe.c:5873 +#: describe.c:5915 msgid "List of user mappings" msgstr "ユーザーマッピング一覧" -#: describe.c:5946 +#: describe.c:5987 msgid "List of foreign tables" msgstr "外部テーブル一覧" -#: describe.c:5998 +#: describe.c:6038 msgid "List of installed extensions" msgstr "インストール済ã¿ã®æ‹¡å¼µä¸€è¦§" -#: describe.c:6046 +#: describe.c:6086 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "\"%s\"ã¨ã„ã†åå‰ã®æ©Ÿèƒ½æ‹¡å¼µãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:6049 +#: describe.c:6089 #, c-format msgid "Did not find any extensions." msgstr "機能拡張ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:6093 +#: describe.c:6133 msgid "Object description" msgstr "オブジェクトã®èª¬æ˜Ž" -#: describe.c:6103 +#: describe.c:6142 #, c-format msgid "Objects in extension \"%s\"" msgstr "機能拡張\"%s\"内ã®ã‚ªãƒ–ジェクト" -#: describe.c:6144 +#: describe.c:6183 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "修飾åãŒä¸é©åˆ‡ã§ã™(ドット区切りã®åå‰ãŒå¤šã™ãŽã¾ã™): %s" -#: describe.c:6158 +#: describe.c:6197 #, c-format msgid "cross-database references are not implemented: %s" msgstr "データベース間ã®å‚ç…§ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“: %s" -#: describe.c:6189 describe.c:6316 +#: describe.c:6228 describe.c:6354 #, c-format msgid "The server (version %s) does not support publications." msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼(ãƒãƒ¼ã‚¸ãƒ§ãƒ³%s)ã¯ãƒ‘ブリケーションをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。" -#: describe.c:6206 describe.c:6394 +#: describe.c:6245 describe.c:6432 msgid "All tables" msgstr "全テーブル" -#: describe.c:6207 describe.c:6395 +#: describe.c:6246 describe.c:6433 msgid "Inserts" msgstr "Insertæ–‡" -#: describe.c:6208 describe.c:6396 +#: describe.c:6247 describe.c:6434 msgid "Updates" msgstr "Updateæ–‡" -#: describe.c:6209 describe.c:6397 +#: describe.c:6248 describe.c:6435 msgid "Deletes" msgstr "Deleteæ–‡" -#: describe.c:6213 describe.c:6399 +#: describe.c:6252 describe.c:6437 msgid "Truncates" msgstr "Truncateæ–‡" -#: describe.c:6217 describe.c:6401 +#: describe.c:6256 describe.c:6439 msgid "Via root" msgstr "最上ä½ãƒ‘ーティションテーブル経由" -#: describe.c:6239 +#: describe.c:6277 msgid "List of publications" msgstr "パブリケーション一覧" -#: describe.c:6363 +#: describe.c:6401 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "\"%s\"ã¨ã„ã†åå‰ã®ãƒ‘ブリケーションãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:6366 +#: describe.c:6404 #, c-format msgid "Did not find any publications." msgstr "パブリケーションãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" -#: describe.c:6390 +#: describe.c:6428 #, c-format msgid "Publication %s" msgstr "パブリケーション %s" -#: describe.c:6443 +#: describe.c:6481 msgid "Tables:" msgstr "テーブル:" -#: describe.c:6455 +#: describe.c:6493 msgid "Tables from schemas:" msgstr "以下ã®ã‚¹ã‚­ãƒ¼ãƒžå†…ã®ãƒ†ãƒ¼ãƒ–ル:" -#: describe.c:6499 +#: describe.c:6538 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "ã“ã®ã‚µãƒ¼ãƒãƒ¼(ãƒãƒ¼ã‚¸ãƒ§ãƒ³%s)ã¯ã‚µãƒ–スクリプションをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。" -#: describe.c:6515 +#: describe.c:6554 msgid "Publication" msgstr "パブリケーション" -#: describe.c:6524 +#: describe.c:6563 msgid "Binary" msgstr "ãƒã‚¤ãƒŠãƒª" -#: describe.c:6533 describe.c:6537 +#: describe.c:6572 describe.c:6576 msgid "Streaming" msgstr "ストリーミング" -#: describe.c:6545 +#: describe.c:6584 msgid "Two-phase commit" msgstr "2相コミット" -#: describe.c:6546 +#: describe.c:6585 msgid "Disable on error" msgstr "エラー時無効化" -#: describe.c:6553 +#: describe.c:6592 msgid "Origin" msgstr "起点" -#: describe.c:6554 +#: describe.c:6593 msgid "Password required" msgstr "パスワード必須" -#: describe.c:6555 +#: describe.c:6594 msgid "Run as owner?" msgstr "所有者ã¨ã—ã¦å®Ÿè¡Œ?" -#: describe.c:6560 +#: describe.c:6599 +msgid "Failover" +msgstr "フェイルオーãƒãƒ¼" + +#: describe.c:6604 msgid "Synchronous commit" msgstr "åŒæœŸã‚³ãƒŸãƒƒãƒˆ" -#: describe.c:6561 +#: describe.c:6605 msgid "Conninfo" msgstr "接続情報" -#: describe.c:6567 +#: describe.c:6611 msgid "Skip LSN" msgstr "スキップLSN" -#: describe.c:6594 +#: describe.c:6637 msgid "List of subscriptions" msgstr "サブスクリプション一覧" -#: describe.c:6656 describe.c:6752 describe.c:6845 describe.c:6940 +#: describe.c:6666 +msgid "(none)" +msgstr "(権é™ãªã—)" + +#: describe.c:6706 describe.c:6801 describe.c:6893 describe.c:6987 msgid "AM" msgstr "AM" -#: describe.c:6657 +#: describe.c:6707 msgid "Input type" msgstr "入力ã®åž‹" -#: describe.c:6658 +#: describe.c:6708 msgid "Storage type" msgstr "ストレージタイプ" -#: describe.c:6659 +#: describe.c:6709 msgid "Operator class" msgstr "演算å­ã‚¯ãƒ©ã‚¹" -#: describe.c:6671 describe.c:6753 describe.c:6846 describe.c:6941 +#: describe.c:6721 describe.c:6802 describe.c:6894 describe.c:6988 msgid "Operator family" msgstr "æ¼”ç®—å­æ—" -#: describe.c:6707 +#: describe.c:6756 msgid "List of operator classes" msgstr "演算å­ã‚¯ãƒ©ã‚¹ä¸€è¦§" -#: describe.c:6754 +#: describe.c:6803 msgid "Applicable types" msgstr "é©ç”¨å¯èƒ½åž‹" -#: describe.c:6796 +#: describe.c:6844 msgid "List of operator families" msgstr "æ¼”ç®—å­æ—一覧" -#: describe.c:6847 +#: describe.c:6895 msgid "Operator" msgstr "演算å­" -#: describe.c:6848 +#: describe.c:6896 msgid "Strategy" msgstr "ストラテジ" -#: describe.c:6849 +#: describe.c:6897 msgid "ordering" msgstr "é †åºä»˜ã‘" -#: describe.c:6850 +#: describe.c:6898 msgid "search" msgstr "検索" -#: describe.c:6851 +#: describe.c:6899 msgid "Purpose" msgstr "目的" -#: describe.c:6856 +#: describe.c:6904 msgid "Sort opfamily" msgstr "ã‚½ãƒ¼ãƒˆæ¼”ç®—å­æ—" -#: describe.c:6895 +#: describe.c:6942 msgid "List of operators of operator families" msgstr "æ¼”ç®—å­æ—ã®æ¼”ç®—å­ä¸€è¦§" -#: describe.c:6942 +#: describe.c:6989 msgid "Registered left type" msgstr "登録左辺型" -#: describe.c:6943 +#: describe.c:6990 msgid "Registered right type" msgstr "登録å³è¾ºåž‹" -#: describe.c:6944 +#: describe.c:6991 msgid "Number" msgstr "番å·" -#: describe.c:6988 +#: describe.c:7034 msgid "List of support functions of operator families" msgstr "æ¼”ç®—å­æ—ã®ã‚µãƒãƒ¼ãƒˆé–¢æ•°ä¸€è¦§" -#: describe.c:7019 +#: describe.c:7065 msgid "ID" msgstr "ID" -#: describe.c:7040 +#: describe.c:7085 msgid "Large objects" msgstr "ラージ オブジェクト" -#: help.c:75 +#: help.c:63 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2455,11 +2516,11 @@ msgstr "" "psql 㯠PostgreSQL ã®å¯¾è©±åž‹ã‚¿ãƒ¼ãƒŸãƒŠãƒ«ã§ã™ã€‚\n" "\n" -#: help.c:76 help.c:394 help.c:478 help.c:521 +#: help.c:64 help.c:372 help.c:456 help.c:502 msgid "Usage:\n" msgstr "ä½¿ã„æ–¹:\n" -#: help.c:77 +#: help.c:65 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2467,28 +2528,27 @@ msgstr "" " psql [オプション]... [データベースå [ユーザーå]]\n" "\n" -#: help.c:79 +#: help.c:67 msgid "General options:\n" msgstr "一般的ãªã‚ªãƒ—ション:\n" -#: help.c:84 +#: help.c:68 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=コマンド å˜ä¸€ã®(SQLã¾ãŸã¯å†…部)コマンドを一ã¤ã ã‘実行ã—ã¦çµ‚了\n" -#: help.c:85 -#, c-format -msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" -msgstr " -d, --dbname=DBå æŽ¥ç¶šã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å(デフォルト: \"%s\")\n" +#: help.c:69 +msgid " -d, --dbname=DBNAME database name to connect to\n" +msgstr " -d, --dbname=DBNAME 接続先データベースå\n" -#: help.c:87 +#: help.c:70 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=FILENAME ファイルã‹ã‚‰ã‚³ãƒžãƒ³ãƒ‰ã‚’読ã¿è¾¼ã‚“ã§å®Ÿè¡Œå¾Œã€çµ‚了\n" -#: help.c:88 +#: help.c:71 msgid " -l, --list list available databases, then exit\n" msgstr " -l(エル), --list 使用å¯èƒ½ãªãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ä¸€è¦§ã‚’表示ã—ã¦çµ‚了\n" -#: help.c:89 +#: help.c:72 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2498,15 +2558,15 @@ msgstr "" " psql 変数 'åå‰' ã« '値' をセット\n" " (例: -v ON_ERROR_STOP=1)\n" -#: help.c:92 +#: help.c:75 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: help.c:93 +#: help.c:76 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc åˆæœŸåŒ–ファイル (~/.psqlrc) を読ã¿è¾¼ã¾ãªã„\n" -#: help.c:94 +#: help.c:77 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2514,19 +2574,19 @@ msgstr "" " -1 (æ•°å­—ã®1), --single-transaction\n" " (対話形å¼ã§ãªã„å ´åˆ)å˜ä¸€ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¨ã—ã¦å®Ÿè¡Œ\n" -#: help.c:96 +#: help.c:79 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: help.c:97 +#: help.c:80 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã‚³ãƒžãƒ³ãƒ‰ã®ä¸€è¦§ã‚’表示ã—ã¦çµ‚了\n" -#: help.c:98 +#: help.c:81 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables 特殊変数ã®ä¸€è¦§ã‚’表示ã—ã¦çµ‚了\n" -#: help.c:100 +#: help.c:83 msgid "" "\n" "Input and output options:\n" @@ -2534,47 +2594,47 @@ msgstr "" "\n" "入出力オプション:\n" -#: help.c:101 +#: help.c:84 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all スクリプトã‹ã‚‰èª­ã¿è¾¼ã‚“ã å…¥åŠ›ã‚’ã™ã¹ã¦è¡¨ç¤º\n" -#: help.c:102 +#: help.c:85 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors 失敗ã—ãŸã‚³ãƒžãƒ³ãƒ‰ã‚’表示\n" -#: help.c:103 +#: help.c:86 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries サーãƒãƒ¼ã¸é€ä¿¡ã—ãŸã‚³ãƒžãƒ³ãƒ‰ã‚’表示\n" -#: help.c:104 +#: help.c:87 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden 内部コマンドãŒç”Ÿæˆã—ãŸå•ã„åˆã‚ã›ã‚’表示\n" -#: help.c:105 +#: help.c:88 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FILENAME ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ­ã‚°ã‚’ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã込む\n" -#: help.c:106 +#: help.c:89 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline 拡張コマンドライン編集機能(readline)を無効ã«ã™ã‚‹\n" -#: help.c:107 +#: help.c:90 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=FILENAME å•ã„åˆã‚ã›ã®çµæžœã‚’ファイル (ã¾ãŸã¯ |パイプ)ã«é€ã‚‹\n" -#: help.c:108 +#: help.c:91 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet é™ã‹ã«å®Ÿè¡Œ (メッセージãªã—ã§ã€å•ã„åˆã‚ã›ã®å‡ºåŠ›ã®ã¿)\n" -#: help.c:109 +#: help.c:92 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step シングルステップモード (å„å•ã„åˆã‚ã›ã”ã¨ã«ç¢ºèª)\n" -#: help.c:110 +#: help.c:93 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line å˜ä¸€è¡Œãƒ¢ãƒ¼ãƒ‰ (行末ã§SQLコマンドを終端)\n" -#: help.c:112 +#: help.c:95 msgid "" "\n" "Output format options:\n" @@ -2582,15 +2642,15 @@ msgstr "" "\n" "出力フォーマットã®ã‚ªãƒ—ション\n" -#: help.c:113 +#: help.c:96 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align æ¡æƒãˆãªã—ã®ãƒ†ãƒ¼ãƒ–ル出力モード\n" -#: help.c:114 +#: help.c:97 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv CSV(カンマ区切り)テーブル出力モード\n" -#: help.c:115 +#: help.c:98 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2600,17 +2660,17 @@ msgstr "" " æ¡æƒãˆãªã—出力時ã®ãƒ•ィールド区切り文字\n" " (デフォルト: \"%s\")\n" -#: help.c:118 +#: help.c:101 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML テーブル出力モード\n" -#: help.c:119 +#: help.c:102 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr "" " -P, --pset=変数[=値] 表示オプション '変数' ã‚’ '値' ã«ã‚»ãƒƒãƒˆ\n" " (\\pset コマンドをå‚ç…§)\n" -#: help.c:120 +#: help.c:103 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2619,19 +2679,19 @@ msgstr "" " æ¡æƒãˆãªã—出力ã«ãŠã‘るレコード区切り文字\n" " (デフォルト: 改行)\n" -#: help.c:122 +#: help.c:105 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only 行ã®ã¿ã‚’表示\n" -#: help.c:123 +#: help.c:106 msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr " -T, --table-attr=TEXT HTMLテーブルã®ã‚¿ã‚°å±žæ€§ã‚’セット (width, borderç­‰)\n" -#: help.c:124 +#: help.c:107 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded 拡張テーブル出力ã«åˆ‡ã‚Šæ›¿ãˆã‚‹\n" -#: help.c:125 +#: help.c:108 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2639,7 +2699,7 @@ msgstr "" " -z, --field-separator-zero\n" " æ¡æƒãˆãªã—出力ã®ãƒ•ィールド区切りをãƒã‚¤ãƒˆå€¤ã®0ã«è¨­å®š\n" -#: help.c:127 +#: help.c:110 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2647,7 +2707,7 @@ msgstr "" " -0, --record-separator-zero\n" " æ¡æƒãˆãªã—出力ã®ãƒ¬ã‚³ãƒ¼ãƒ‰åŒºåˆ‡ã‚Šã‚’ãƒã‚¤ãƒˆå€¤ã®0ã«è¨­å®š\n" -#: help.c:130 +#: help.c:113 msgid "" "\n" "Connection options:\n" @@ -2655,36 +2715,29 @@ msgstr "" "\n" "接続オプション:\n" -#: help.c:133 -#, c-format -msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" +#: help.c:114 +msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=HOSTNAME データベースサーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚½ã‚±ãƒƒãƒˆã®\n" -" ディレクトリ(デフォルト: \"%s\")\n" +" -h, --host=HOSTNAME データベースサーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚½ã‚±ãƒƒãƒˆ\n" +" ディレクトリ\n" -#: help.c:134 -msgid "local socket" -msgstr "ローカルソケット" +#: help.c:115 +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆç•ªå·\n" -#: help.c:137 -#, c-format -msgid " -p, --port=PORT database server port (default: \"%s\")\n" -msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆç•ªå·(デフォルト: \"%s\")\n" +#: help.c:116 +msgid " -U, --username=USERNAME database user name\n" +msgstr " -U, --username=USERNAME データベースã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å\n" -#: help.c:140 -#, c-format -msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" -msgstr " -U, --username=USERNAME データベースã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å (デフォルト: \"%s\")\n" - -#: help.c:142 +#: help.c:117 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰å…¥åŠ›ã‚’è¦æ±‚ã—ãªã„\n" -#: help.c:143 +#: help.c:118 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password パスワードプロンプトã®å¼·åˆ¶è¡¨ç¤º(本æ¥ã¯è‡ªå‹•çš„ã«è¡¨ç¤º)\n" -#: help.c:145 +#: help.c:120 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2697,37 +2750,37 @@ msgstr "" "をタイプã™ã‚‹ã‹ã€PostgreSQLドキュメント中ã®psqlã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n" "\n" -#: help.c:148 +#: help.c:123 #, c-format msgid "Report bugs to <%s>.\n" msgstr "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: help.c:149 +#: help.c:124 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: help.c:191 +#: help.c:166 msgid "General\n" msgstr "一般\n" -#: help.c:192 +#: help.c:167 msgid " \\bind [PARAM]... set query parameters\n" msgstr " \\bind [PARAM]... å•ã„åˆã‚ã›ãƒ‘ラメータを設定\n" -#: help.c:193 +#: help.c:168 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright PostgreSQL ã®ä½¿ã„æ–¹ã¨é…布æ¡ä»¶ã‚’表示\n" -#: help.c:194 +#: help.c:169 msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr " \\crosstabview [列リスト] å•ã„åˆã‚ã›ã‚’実行ã—ã€çµæžœã‚’クロス表形å¼ã§å‡ºåŠ›\n" -#: help.c:195 +#: help.c:170 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose 最後ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’最大ã®å†—長性ã§è¡¨ç¤º\n" -#: help.c:196 +#: help.c:171 msgid "" " \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" @@ -2735,238 +2788,244 @@ msgstr "" " \\g [(OPTIONS)] [FILE] å•ã„åˆã‚ã›å®Ÿè¡Œ (çµæžœã¯ãƒ•ァイルã¾ãŸã¯ |パイプã¸å‡ºåŠ›);\n" " 引数ãªã—ã®\\gã¯ã‚»ãƒŸã‚³ãƒ­ãƒ³ã¨åŒç¾©\n" -#: help.c:198 +#: help.c:173 msgid " \\gdesc describe result of query, without executing it\n" -msgstr " \\gdesc å•ã„åˆã‚ã›ã‚’実行ã›ãšã«çµæžœã®èª¬æ˜Žã‚’行ã†\n" +msgstr " \\gdesc å•ã„åˆã‚ã›ã‚’実行ã›ãšã«çµæžœã®å½¢å¼ã‚’出力ã™ã‚‹\n" -#: help.c:199 +#: help.c:174 msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec å•ã„åˆã‚ã›ã‚’実行ã—ã€çµæžœã®ä¸­ã®å€‹ã€…ã®å€¤ã‚’実行\n" -#: help.c:200 +#: help.c:175 msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr " \\gset [PREFIX] å•ã„åˆã‚ã›ã‚’実行ã—ã¦çµæžœã‚’ psql å¤‰æ•°ã«æ ¼ç´\n" -#: help.c:201 +#: help.c:176 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [ファイルå] \\g ã¨åŒã˜ã€ãŸã ã—拡張出力モードを強制\n" -#: help.c:202 +#: help.c:177 msgid " \\q quit psql\n" msgstr " \\q psql を終了ã™ã‚‹\n" -#: help.c:203 -msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n" -msgstr " \\watch [[i=]SEC] [c=N] å•ã„åˆã‚ã›ã‚’SECç§’ã”ã¨ã«æœ€å¤§N回実行ã™ã‚‹\n" +#: help.c:178 +msgid "" +" \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" execute query every SEC seconds, up to N times,\n" +" stop if less than MIN rows are returned\n" +msgstr "" +" \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" SECç§’ã”ã¨ã«æœ€å¤§N回ã¾ã§åˆ†ã‚’実行。返å´è¡Œæ•°ãŒMIN行より\n" +" å°‘ãªã„å ´åˆã«ã¯åœæ­¢ã™ã‚‹\n" -#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:297 help.c:305 -#: help.c:325 help.c:338 help.c:347 +#: help.c:181 help.c:189 help.c:201 help.c:211 help.c:218 help.c:275 help.c:283 +#: help.c:303 help.c:316 help.c:325 msgid "\n" msgstr "\n" -#: help.c:206 +#: help.c:183 msgid "Help\n" msgstr "ヘルプ\n" -#: help.c:208 +#: help.c:185 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [コマンド] ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã‚³ãƒžãƒ³ãƒ‰ã®ãƒ˜ãƒ«ãƒ—を表示\n" -#: help.c:209 +#: help.c:186 msgid " \\? options show help on psql command-line options\n" msgstr " \\? オプション psql ã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ãƒ»ã‚ªãƒ—ションã®ãƒ˜ãƒ«ãƒ—を表示\n" -#: help.c:210 +#: help.c:187 msgid " \\? variables show help on special variables\n" msgstr " \\? 変数å 特殊変数ã®ãƒ˜ãƒ«ãƒ—を表示\n" -#: help.c:211 +#: help.c:188 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [åå‰] SQLã‚³ãƒžãƒ³ãƒ‰ã®æ–‡æ³•ヘルプã®è¡¨ç¤ºã€‚* ã§å…¨ã‚³ãƒžãƒ³ãƒ‰ã‚’表示\n" -#: help.c:214 +#: help.c:191 msgid "Query Buffer\n" msgstr "å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡\n" -#: help.c:215 +#: help.c:192 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr "" " \\e [ファイル] [行番å·] ç¾åœ¨ã®å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡(やファイル)を外部エディタã§\n" " 編集\n" -#: help.c:216 +#: help.c:193 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [関数å [行番å·]] 関数定義を外部エディタã§ç·¨é›†\n" -#: help.c:217 +#: help.c:194 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [ビューå [行番å·]] ビュー定義を外部エディタã§ç·¨é›†\n" -#: help.c:218 +#: help.c:195 msgid " \\p show the contents of the query buffer\n" msgstr " \\p å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡ã®å†…容を表示\n" -#: help.c:219 +#: help.c:196 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r å•ã„åˆã‚ã›ãƒãƒƒãƒ•ァをリセット(クリア)\n" -#: help.c:221 +#: help.c:198 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [ファイル] ヒストリを表示ã¾ãŸã¯ãƒ•ァイルã«ä¿å­˜\n" -#: help.c:223 +#: help.c:200 msgid " \\w FILE write query buffer to file\n" msgstr " \\w ファイル å•ã„åˆã‚ã›ãƒãƒƒãƒ•ã‚¡ã®å†…容をファイルã«ä¿å­˜\n" -#: help.c:226 +#: help.c:203 msgid "Input/Output\n" msgstr "入出力\n" -#: help.c:227 +#: help.c:204 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr "" " \\copy ... クライアントホストã«å¯¾ã—ã€ãƒ‡ãƒ¼ã‚¿ã‚¹ãƒˆãƒªãƒ¼ãƒ ã‚’使ã£ã¦\n" " SQL COPYを実行\n" -#: help.c:228 +#: help.c:205 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [文字列] æ–‡å­—åˆ—ã‚’æ¨™æº–å‡ºåŠ›ã«æ›¸ã込む (-n ã§æ”¹è¡Œã—ãªã„)\n" -#: help.c:229 +#: help.c:206 msgid " \\i FILE execute commands from file\n" msgstr " \\i ファイル ファイルã‹ã‚‰ã‚³ãƒžãƒ³ãƒ‰ã‚’読ã¿è¾¼ã‚“ã§å®Ÿè¡Œ\n" -#: help.c:230 +#: help.c:207 msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr "" " \\ir ファイル \\i ã¨åŒã˜ã€‚ãŸã ã—ç¾åœ¨ã®ã‚¹ã‚¯ãƒªãƒ—トã®å ´æ‰€ã‹ã‚‰ã®ç›¸å¯¾ãƒ‘ス\n" " ã§æŒ‡å®š\n" -#: help.c:231 +#: help.c:208 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [ファイル] å•ã„åˆã‚ã›çµæžœã‚’ã™ã¹ã¦ãƒ•ァイルã¾ãŸã¯ |パイプ ã¸é€å‡º\n" -#: help.c:232 +#: help.c:209 msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr "" " \\qecho [-n] [文字列] 文字列を\\oã§æŒ‡å®šã—ãŸå‡ºåŠ›ã‚¹ãƒˆãƒªãƒ¼ãƒ ã«æ›¸ã込む(-n ã§æ”¹è¡Œ\n" " ã—ãªã„)\n" -#: help.c:233 +#: help.c:210 msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr " \\warn [-n] [文字列] æ–‡å­—åˆ—ã‚’æ¨™æº–ã‚¨ãƒ©ãƒ¼å‡ºåŠ›ã«æ›¸ã込む (-n ã§æ”¹è¡Œã—ãªã„)\n" -#: help.c:236 +#: help.c:213 msgid "Conditional\n" msgstr "æ¡ä»¶åˆ†å²\n" -#: help.c:237 +#: help.c:214 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR æ¡ä»¶åˆ†å²ãƒ–ロックã®é–‹å§‹\n" -#: help.c:238 +#: help.c:215 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR ç¾åœ¨ã®æ¡ä»¶åˆ†å²ãƒ–ロック内ã®é¸æŠžè‚¢\n" -#: help.c:239 +#: help.c:216 msgid " \\else final alternative within current conditional block\n" msgstr " \\else ç¾åœ¨ã®æ¡ä»¶åˆ†å²ãƒ–ロックã«ãŠã‘る最後ã®é¸æŠžè‚¢\n" -#: help.c:240 +#: help.c:217 msgid " \\endif end conditional block\n" msgstr " \\endif æ¡ä»¶åˆ†å²ãƒ–ロックã®çµ‚了\n" -#: help.c:243 +#: help.c:220 msgid "Informational\n" msgstr "情報表示\n" -#: help.c:244 +#: help.c:221 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (オプション:S = システムオブジェクトを表示, + = 詳細表示)\n" -#: help.c:245 +#: help.c:222 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] テーブルã€ãƒ“ューã€ãŠã‚ˆã³ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã®ä¸€è¦§ã‚’表示\n" -#: help.c:246 +#: help.c:223 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr "" " \\d[S+] åå‰ ãƒ†ãƒ¼ãƒ–ãƒ«ã€ãƒ“ューã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã€ã¾ãŸã¯ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®\n" " 説明を表示\n" -#: help.c:247 +#: help.c:224 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [パターン] 集約関数ã®ä¸€è¦§ã‚’表示\n" -#: help.c:248 +#: help.c:225 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [パターン] アクセスメソッドã®ä¸€è¦§ã‚’表示\n" -#: help.c:249 +#: help.c:226 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] 演算å­ã‚¯ãƒ©ã‚¹ã®ä¸€è¦§ã‚’表示\n" -#: help.c:250 +#: help.c:227 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] æ¼”ç®—å­æ—ã®ä¸€è¦§ã‚’表示\n" -#: help.c:251 +#: help.c:228 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] æ¼”ç®—å­æ—ã®æ¼”ç®—å­ã®ä¸€è¦§ã‚’表示\n" -#: help.c:252 +#: help.c:229 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] æ¼”ç®—å­æ—ã®ã‚µãƒãƒ¼ãƒˆé–¢æ•°ã®ä¸€è¦§ã‚’表示\n" -#: help.c:253 +#: help.c:230 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [パターン] テーブル空間ã®ä¸€è¦§ã‚’表示\n" -#: help.c:254 +#: help.c:231 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [パターン] 符å·åŒ–æ–¹å¼é–“ã®å¤‰æ›ã®ä¸€è¦§ã‚’表示\n" -#: help.c:255 +#: help.c:232 msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" msgstr " \\dconfig[+] [PATTERN] 設定パラメータã®ä¸€è¦§ã‚’表示\n" -#: help.c:256 +#: help.c:233 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [パターン] キャストã®ä¸€è¦§ã‚’表示ã—ã¾ã™ã€‚\n" -#: help.c:257 +#: help.c:234 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [パターン] ä»–ã§ã¯è¡¨ç¤ºã•れãªã„オブジェクトã®èª¬æ˜Žã‚’表示\n" -#: help.c:258 +#: help.c:235 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [パターン] ドメインã®ä¸€è¦§ã‚’表示\n" -#: help.c:259 +#: help.c:236 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [パターン] デフォルト権é™ã®ä¸€è¦§ã‚’表示\n" -#: help.c:260 +#: help.c:237 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [パターン] 外部テーブルã®ä¸€è¦§ã‚’表示\n" -#: help.c:261 +#: help.c:238 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [パターン] 外部サーãƒãƒ¼ã®ä¸€è¦§ã‚’表示\n" -#: help.c:262 +#: help.c:239 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [パターン] 外部テーブルã®ä¸€è¦§ã‚’表示\n" -#: help.c:263 +#: help.c:240 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [パターン] ユーザーマッピングã®ä¸€è¦§ã‚’表示\n" -#: help.c:264 +#: help.c:241 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [パターン] 外部データラッパã®ä¸€è¦§ã‚’表示\n" -#: help.c:265 +#: help.c:242 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" @@ -2975,47 +3034,47 @@ msgstr "" " [集約/通常/プロシージャ/トリガー/ウィンドウ]\n" " 関数ã®ã¿ã®ä¸€è¦§ã‚’表示\n" -#: help.c:267 +#: help.c:244 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [パターン] テキスト検索設定ã®ä¸€è¦§ã‚’表示\n" -#: help.c:268 +#: help.c:245 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [パターン] テキスト検索辞書ã®ä¸€è¦§ã‚’表示\n" -#: help.c:269 +#: help.c:246 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [パターン] テキスト検索パーサã®ä¸€è¦§ã‚’表示\n" -#: help.c:270 +#: help.c:247 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [パターン] テキスト検索テンプレートã®ä¸€è¦§ã‚’表示\n" -#: help.c:271 +#: help.c:248 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [パターン] ロールã®ä¸€è¦§ã‚’表示\n" -#: help.c:272 +#: help.c:249 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [パターン] インデックスã®ä¸€è¦§ã‚’表示\n" -#: help.c:273 +#: help.c:250 msgid " \\dl[+] list large objects, same as \\lo_list\n" msgstr " \\dl[+] ラージオブジェクトã®ä¸€è¦§ã‚’表示ã€\\lo_list ã¨åŒã˜\n" -#: help.c:274 +#: help.c:251 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [パターン] 手続ã言語ã®ä¸€è¦§ã‚’表示\n" -#: help.c:275 +#: help.c:252 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [パターン] 実体化ビューã®ä¸€è¦§ã‚’表示\n" -#: help.c:276 +#: help.c:253 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [パターン] スキーマã®ä¸€è¦§ã‚’表示\n" -#: help.c:277 +#: help.c:254 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" @@ -3023,93 +3082,99 @@ msgstr "" " \\do[S+] [演算å­ãƒ‘ターン [型パターン [型パターン]]]\n" " 演算å­ã®ä¸€è¦§ã‚’表示\n" -#: help.c:279 +#: help.c:256 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [パターン] ç…§åˆé †åºã®ä¸€è¦§ã‚’表示\n" -#: help.c:280 -msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" -msgstr " \\dp [パターン] テーブルã€ãƒ“ューã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã®ä¸€è¦§ã‚’表示\n" +#: help.c:257 +msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n" +msgstr " \\dp[S] [パターン] テーブルã€ãƒ“ューã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã®ä¸€è¦§ã‚’表示\n" -#: help.c:281 +#: help.c:258 msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr "" " \\dP[itn+] [パターン] パーティションリレーション[テーブル/インデックスã®ã¿]\n" " ã®ä¸€è¦§ã‚’表示 [n=入れå­]\n" -#: help.c:282 +#: help.c:259 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr "" " \\drds [ロールパターン [DBパターン]]\n" " データベース毎ã®ãƒ­ãƒ¼ãƒ«è¨­å®šã®ä¸€è¦§ã‚’表示\n" -#: help.c:283 +#: help.c:260 +msgid " \\drg[S] [PATTERN] list role grants\n" +msgstr "" +" \\drg[S] [PATTERN] ロール権é™ä»˜ä¸Žã®ä¸€è¦§ã‚’表示\n" +"\n" + +#: help.c:261 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [パターン] レプリケーションã®ãƒ‘ブリケーションã®ä¸€è¦§ã‚’表示\n" -#: help.c:284 +#: help.c:262 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [パターン] レプリケーションã®ã‚µãƒ–スクリプションã®ä¸€è¦§ã‚’表示\n" -#: help.c:285 +#: help.c:263 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [パターン] シーケンスã®ä¸€è¦§ã‚’表示\n" -#: help.c:286 +#: help.c:264 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [パターン] テーブルã®ä¸€è¦§ã‚’表示\n" -#: help.c:287 +#: help.c:265 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [パターン] データ型ã®ä¸€è¦§ã‚’表示\n" -#: help.c:288 +#: help.c:266 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [パターン] ロールã®ä¸€è¦§ã‚’表示\n" -#: help.c:289 +#: help.c:267 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [パターン] ビューã®ä¸€è¦§ã‚’表示\n" -#: help.c:290 +#: help.c:268 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [パターン] 機能拡張ã®ä¸€è¦§ã‚’表示\n" -#: help.c:291 +#: help.c:269 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [パターン] 拡張統計情報ã®ä¸€è¦§ã‚’表示\n" -#: help.c:292 +#: help.c:270 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [パターン] イベントトリガーã®ä¸€è¦§ã‚’表示\n" -#: help.c:293 +#: help.c:271 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [パターン] データベースã®ä¸€è¦§ã‚’表示\n" -#: help.c:294 +#: help.c:272 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] 関数å 関数ã®å®šç¾©ã‚’表示\n" -#: help.c:295 +#: help.c:273 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] ビューå ビューã®å®šç¾©ã‚’表示\n" -#: help.c:296 -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [パターン] \\dp ã¨åŒã˜\n" +#: help.c:274 +msgid " \\z[S] [PATTERN] same as \\dp\n" +msgstr " \\z[S] [パターン] \\dp ã¨åŒã˜\n" -#: help.c:299 +#: help.c:277 msgid "Large Objects\n" msgstr "ラージ・オブジェクト\n" -#: help.c:300 +#: help.c:278 msgid " \\lo_export LOBOID FILE write large object to file\n" msgstr "" " \\lo_export LOBOID ファイルå\n" " ãƒ©ãƒ¼ã‚¸ãƒ»ã‚ªãƒ–ã‚¨ã‚¸ã‚§ã‚¯ãƒˆã‚’ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã込む\n" -#: help.c:301 +#: help.c:279 msgid "" " \\lo_import FILE [COMMENT]\n" " read large object from file\n" @@ -3117,38 +3182,38 @@ msgstr "" " \\lo_import ファイルå [コメント]\n" " ラージ・オブジェクトをファイルã‹ã‚‰èª­ã¿è¾¼ã‚€\n" -#: help.c:303 +#: help.c:281 msgid " \\lo_list[+] list large objects\n" msgstr " \\lo_list[+] ラージ・オブジェクトã®ä¸€è¦§ã‚’表示\n" -#: help.c:304 +#: help.c:282 msgid " \\lo_unlink LOBOID delete a large object\n" msgstr " \\lo_unlink LOBOID ラージ・オブジェクトを削除\n" -#: help.c:307 +#: help.c:285 msgid "Formatting\n" msgstr "書å¼è¨­å®š\n" -#: help.c:308 +#: help.c:286 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a éžæ•´åˆ—ã¨æ•´åˆ—é–“ã®å‡ºåŠ›ãƒ¢ãƒ¼ãƒ‰ã®åˆ‡ã‚Šæ›¿ãˆ\n" -#: help.c:309 +#: help.c:287 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [文字列] テーブルã®ã‚¿ã‚¤ãƒˆãƒ«ã‚’設定ã€å€¤ãŒãªã‘れã°å‰Šé™¤\n" -#: help.c:310 +#: help.c:288 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr "" " \\f [文字列] å•ã„åˆã‚ã›çµæžœã®éžæ•´åˆ—出力時ã®ãƒ•ィールド区切り文字を\n" " 表示ã¾ãŸã¯è¨­å®š\n" -#: help.c:311 +#: help.c:289 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H HTML出力モードã®åˆ‡ã‚Šæ›¿ãˆ (ç¾åœ¨å€¤: %s)\n" -#: help.c:313 +#: help.c:291 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3156,39 +3221,39 @@ msgid "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" msgstr "" -" \\pset [åå‰ [値]] テーブル出力ã®ã‚ªãƒ—ション設定\n" -" (border|columns|csv_fieldsep|expanded|fieldsep|\n" +" \\pset [åå‰ [値]] テーブル出力ã®ã‚ªãƒ—ションを指定ã—ã¾ã™\n" +" (border|columns|csv_fieldsep|expanded|fieldsep|\n" " fieldsep_zero|footer|format|linestyle|null|\n" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" -#: help.c:320 +#: help.c:298 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] çµæžœè¡Œã®ã¿è¡¨ç¤º (ç¾åœ¨å€¤: %s)\n" -#: help.c:322 +#: help.c:300 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [文字列] HTMLã®
タグ属性ã®è¨­å®šã€å€¤ãŒãªã‘れã°è§£é™¤\n" -#: help.c:323 +#: help.c:301 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] 拡張出力ã®åˆ‡ã‚Šæ›¿ãˆ (ç¾åœ¨å€¤: %s)\n" -#: help.c:324 +#: help.c:302 msgid "auto" msgstr "自動(auto)" -#: help.c:327 +#: help.c:305 msgid "Connection\n" msgstr "接続\n" -#: help.c:329 +#: help.c:307 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3197,7 +3262,7 @@ msgstr "" " \\c[onnect] {[DBå|- ユーザーå|- ホストå|- ãƒãƒ¼ãƒˆç•ªå·|-] | 接続文字列}\n" " æ–°ã—ã„ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶š (ç¾åœ¨: \"%s\")\n" -#: help.c:333 +#: help.c:311 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3205,64 +3270,64 @@ msgstr "" " \\c[onnect] {[DBå|- ユーザーå|- ホストå|- ãƒãƒ¼ãƒˆç•ªå·|-] | 接続文字列}\n" " æ–°ã—ã„ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«æŽ¥ç¶š (ç¾åœ¨: 未接続)\n" -#: help.c:335 +#: help.c:313 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo ç¾åœ¨ã®æŽ¥ç¶šã«é–¢ã™ã‚‹æƒ…報を表示\n" -#: help.c:336 +#: help.c:314 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [エンコーディング] クライアントã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’表示ã¾ãŸã¯è¨­å®š\n" -#: help.c:337 +#: help.c:315 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [ユーザーå] ユーザーã®ãƒ‘スワードを安全ã«å¤‰æ›´\n" -#: help.c:340 +#: help.c:318 msgid "Operating System\n" msgstr "オペレーティングシステム\n" -#: help.c:341 +#: help.c:319 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [DIR] カレントディレクトリを変更\n" -#: help.c:342 +#: help.c:320 msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" msgstr "" " \\getenv psql変数 環境変数\n" " 環境変数をå–å¾—\n" -#: help.c:343 +#: help.c:321 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv åå‰ [値] 環境変数を設定ã¾ãŸã¯è§£é™¤\n" -#: help.c:344 +#: help.c:322 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] コマンドã®å®Ÿè¡Œæ™‚間表示ã®åˆ‡ã‚Šæ›¿ãˆ (ç¾åœ¨å€¤: %s)\n" -#: help.c:346 +#: help.c:324 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr "" " \\! [コマンド] シェルã§ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹ã‹ã€ã‚‚ã—ãã¯å¯¾è©±åž‹ã‚·ã‚§ãƒ«ã‚’\n" " èµ·å‹•ã—ã¾ã™ã€‚\n" -#: help.c:349 +#: help.c:327 msgid "Variables\n" msgstr "変数\n" -#: help.c:350 +#: help.c:328 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [テキスト] 変数å ユーザーã«å¯¾ã—ã¦å†…部変数ã®è¨­å®šã‚’è¦æ±‚ã—ã¾ã™\n" -#: help.c:351 +#: help.c:329 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [変数å [値]] 内部変数ã®å€¤ã‚’設定ã€ãƒ‘ラメータãŒãªã‘れã°ä¸€è¦§ã‚’表示\n" -#: help.c:352 +#: help.c:330 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset 変数å 内部変数を削除\n" -#: help.c:391 +#: help.c:369 msgid "" "List of specially treated variables\n" "\n" @@ -3270,11 +3335,11 @@ msgstr "" "ç‰¹åˆ¥ã«æ‰±ã‚れる変数ã®ä¸€è¦§\n" "\n" -#: help.c:393 +#: help.c:371 msgid "psql variables:\n" msgstr "psql変数:\n" -#: help.c:395 +#: help.c:373 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3284,7 +3349,7 @@ msgstr "" " ã¾ãŸã¯psql内㧠\\set åå‰ å€¤\n" "\n" -#: help.c:397 +#: help.c:375 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3292,7 +3357,7 @@ msgstr "" " AUTOCOMMIT\n" " セットã•れã¦ã„ã‚‹å ´åˆã€SQLã‚³ãƒžãƒ³ãƒ‰ãŒæˆåŠŸã—ãŸéš›ã«è‡ªå‹•çš„ã«ã‚³ãƒŸãƒƒãƒˆ\n" -#: help.c:399 +#: help.c:377 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3302,7 +3367,7 @@ msgstr "" " SQLキーワードã®è£œå®Œã«ä½¿ã†æ–‡å­—ケースを指定\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:402 +#: help.c:380 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3310,7 +3375,7 @@ msgstr "" " DBNAME\n" " ç¾åœ¨æŽ¥ç¶šä¸­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å\n" -#: help.c:404 +#: help.c:382 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3320,7 +3385,7 @@ msgstr "" " ã©ã®å…¥åŠ›ã‚’æ¨™æº–å‡ºåŠ›ã¸ã®å‡ºåŠ›å¯¾è±¡ã¨ã™ã‚‹ã‹ã‚’設定\n" " [all, errors, none, queries]\n" -#: help.c:407 +#: help.c:385 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3330,7 +3395,7 @@ msgstr "" " セットã•れã¦ã„れã°ã€ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã‚³ãƒžãƒ³ãƒ‰ã§å®Ÿè¡Œã•れる内部å•ã„åˆã‚ã›ã‚’\n" " 表示; \"noexec\"を設定ã—ãŸå ´åˆã¯å®Ÿè¡Œã›ãšã«è¡¨ç¤ºã®ã¿\n" -#: help.c:410 +#: help.c:388 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3338,7 +3403,7 @@ msgstr "" " ENCODING\n" " ç¾åœ¨ã®ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®æ–‡å­—セットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°\n" -#: help.c:412 +#: help.c:390 msgid "" " ERROR\n" " \"true\" if last query failed, else \"false\"\n" @@ -3346,7 +3411,7 @@ msgstr "" " ERROR\n" " 最後ã®å•ã„åˆã‚ã›ãŒå¤±æ•—ã§ã‚れã°\"true\"ã€ãã†ã§ãªã‘れã°\"false\"\n" -#: help.c:414 +#: help.c:392 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3354,25 +3419,23 @@ msgstr "" " FETCH_COUNT\n" " 一度ã«å–å¾—ãŠã‚ˆã³è¡¨ç¤ºã™ã‚‹çµæžœã®è¡Œæ•° (0 = 無制é™)\n" -#: help.c:416 +#: help.c:394 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" msgstr "" " HIDE_TABLEAM\n" " 設定ã™ã‚‹ã¨ã€ãƒ†ãƒ¼ãƒ–ルアクセスメソッドã¯è¡¨ç¤ºã•れãªã„\n" -"\n" -#: help.c:418 +#: help.c:396 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" msgstr "" " HIDE_TOAST_COMPRESSION\n" " 設定ã™ã‚‹ã¨ã€åœ§ç¸®æ–¹å¼ã¯è¡¨ç¤ºã•れãªã„\n" -"\n" -#: help.c:420 +#: help.c:398 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3380,7 +3443,7 @@ msgstr "" " HISTCONTROL\n" " コマンド履歴ã®åˆ¶å¾¡ [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:422 +#: help.c:400 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3388,7 +3451,7 @@ msgstr "" " HISTFILE\n" " コマンド履歴をä¿å­˜ã™ã‚‹ãƒ•ァイルã®åå‰\n" -#: help.c:424 +#: help.c:402 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3396,7 +3459,7 @@ msgstr "" " HISTSIZE\n" " コマンド履歴ã§ä¿å­˜ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰æ•°ã®ä¸Šé™\n" -#: help.c:426 +#: help.c:404 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3404,7 +3467,7 @@ msgstr "" " HOST\n" " ç¾åœ¨æŽ¥ç¶šä¸­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ãƒ›ã‚¹ãƒˆ\n" -#: help.c:428 +#: help.c:406 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3412,7 +3475,7 @@ msgstr "" " IGNOREEOF\n" " 対話形セッションを終ã‚らã›ã‚‹ã®ã«å¿…è¦ãªEOFã®æ•°\n" -#: help.c:430 +#: help.c:408 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3420,7 +3483,7 @@ msgstr "" " LASTOID\n" " 最後ã®å¤‰æ›´ã®å½±éŸ¿ã‚’å—ã‘ãŸOID\n" -#: help.c:432 +#: help.c:410 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3431,7 +3494,7 @@ msgstr "" " 最後ã®ã‚¨ãƒ©ãƒ¼ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŠã‚ˆã³ SQLSTATEã€\n" " ãªã«ã‚‚ãªã‘れã°ç©ºã®æ–‡å­—列ãŠã‚ˆã³\"00000\"\n" -#: help.c:435 +#: help.c:413 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3440,7 +3503,7 @@ msgstr "" " セットã•れã¦ã„ã‚‹å ´åˆã€ã‚¨ãƒ©ãƒ¼ã§ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’åœæ­¢ã—ãªã„ (æš—é»™ã®ã‚»ãƒ¼ãƒ–\n" " ãƒã‚¤ãƒ³ãƒˆã‚’使用)\n" -#: help.c:437 +#: help.c:415 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3448,7 +3511,7 @@ msgstr "" " ON_ERROR_STOP\n" " エラー発生後ã«ãƒãƒƒãƒå®Ÿè¡Œã‚’åœæ­¢\n" -#: help.c:439 +#: help.c:417 msgid "" " PORT\n" " server port of the current connection\n" @@ -3456,7 +3519,7 @@ msgstr "" " PORT\n" " ç¾åœ¨ã®æŽ¥ç¶šã®ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ãƒˆ\n" -#: help.c:441 +#: help.c:419 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3464,7 +3527,7 @@ msgstr "" " PROMPT1\n" " psql ã®æ¨™æº–ã®ãƒ—ロンプトを指定\n" -#: help.c:443 +#: help.c:421 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3472,7 +3535,7 @@ msgstr "" " PROMPT2\n" " æ–‡ãŒå‰è¡Œã‹ã‚‰ç¶™ç¶šã™ã‚‹å ´åˆã®ãƒ—ロンプトを指定\n" -#: help.c:445 +#: help.c:423 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3480,7 +3543,7 @@ msgstr "" " PROMPT3\n" " COPY ... FROM STDIN ã®æœ€ä¸­ã«ä½¿ã‚れるプロンプトを指定\n" -#: help.c:447 +#: help.c:425 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3488,7 +3551,7 @@ msgstr "" " QUIET\n" " メッセージを表示ã—ãªã„ (-q オプションã¨åŒã˜)\n" -#: help.c:449 +#: help.c:427 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3496,7 +3559,7 @@ msgstr "" " ROW_COUNT\n" " 最後ã®å•ã„åˆã‚ã›ã§è¿”å´ã—ãŸã€ã¾ãŸã¯å½±éŸ¿ã‚’与ãˆãŸè¡Œã®æ•°ã€ã¾ãŸã¯0\n" -#: help.c:451 +#: help.c:429 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3506,7 +3569,7 @@ msgstr "" " SERVER_VERSION_NUM\n" " サーãƒãƒ¼ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³(çŸ­ã„æ–‡å­—列ã¾ãŸã¯æ•°å€¤)\n" -#: help.c:454 +#: help.c:432 msgid "" " SHELL_ERROR\n" " \"true\" if the last shell command failed, \"false\" if it succeeded\n" @@ -3514,7 +3577,7 @@ msgstr "" " SHELL_ERROR\n" " 最後ã®ã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ãŒå¤±æ•—ã§ã‚れã°\"true\"ã€æˆåŠŸã§ã‚れã°\"false\"\n" -#: help.c:456 +#: help.c:434 msgid "" " SHELL_EXIT_CODE\n" " exit status of the last shell command\n" @@ -3522,7 +3585,7 @@ msgstr "" " SHELL_EXIT_CODE\n" " 最後ã«å®Ÿè¡Œã—ãŸã‚·ã‚§ãƒ«ã‚³ãƒžãƒ³ãƒ‰ã®çµ‚了ステータス\n" -#: help.c:458 +#: help.c:436 msgid "" " SHOW_ALL_RESULTS\n" " show all results of a combined query (\\;) instead of only the last\n" @@ -3530,7 +3593,7 @@ msgstr "" " SHOW_ALL_RESULTS\n" " 複åˆå•ã„åˆã‚ã›(\\;)ã®æœ€å¾Œã®çµæžœã®ã¿ã§ã¯ãªãã™ã¹ã¦ã‚’表示ã™ã‚‹\n" -#: help.c:460 +#: help.c:438 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3538,7 +3601,7 @@ msgstr "" " SHOW_CONTEXT\n" " メッセージコンテキストフィールドã®è¡¨ç¤ºã‚’制御 [never, errors, always]\n" -#: help.c:462 +#: help.c:440 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3546,7 +3609,7 @@ msgstr "" " SINGLELINE\n" " セットã—ãŸå ´åˆã€æ”¹è¡Œã¯SQLコマンドを終端ã™ã‚‹ (-S オプションã¨åŒã˜)\n" -#: help.c:464 +#: help.c:442 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3554,7 +3617,7 @@ msgstr "" " SINGLESTEP\n" " シングルステップモード (-s オプションã¨åŒã˜)\n" -#: help.c:466 +#: help.c:444 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3562,7 +3625,7 @@ msgstr "" " SQLSTATE\n" " 最後ã®å•ã„åˆã‚ã›ã® SQLSTATEã€ã¾ãŸã¯ã‚¨ãƒ©ãƒ¼ã§ãªã‘れã°\"00000\"\n" -#: help.c:468 +#: help.c:446 msgid "" " USER\n" " the currently connected database user\n" @@ -3570,7 +3633,7 @@ msgstr "" " USER\n" " ç¾åœ¨æŽ¥ç¶šä¸­ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ¦ãƒ¼ã‚¶ãƒ¼\n" -#: help.c:470 +#: help.c:448 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3578,7 +3641,7 @@ msgstr "" " VERBOSITY\n" " エラー報告ã®è©³ç´°åº¦ã‚’制御 [default, verbose, terse, sqlstate]\n" -#: help.c:472 +#: help.c:450 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3590,7 +3653,7 @@ msgstr "" " VERSION_NUM\n" " psql ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³(é•·ã„æ–‡å­—列ã€çŸ­ã„文字列ã¾ãŸã¯æ•°å€¤)\n" -#: help.c:477 +#: help.c:455 msgid "" "\n" "Display settings:\n" @@ -3598,7 +3661,7 @@ msgstr "" "\n" "表示設定:\n" -#: help.c:479 +#: help.c:457 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3608,7 +3671,7 @@ msgstr "" " ã¾ãŸã¯psql内㧠\\pset åå‰ [値]\n" "\n" -#: help.c:481 +#: help.c:459 msgid "" " border\n" " border style (number)\n" @@ -3616,7 +3679,7 @@ msgstr "" " border\n" " 境界線ã®ã‚¹ã‚¿ã‚¤ãƒ« (番å·)\n" -#: help.c:483 +#: help.c:461 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3624,7 +3687,7 @@ msgstr "" " columns\n" " 折り返ã—å½¢å¼ã§ç›®æ¨™ã¨ã™ã‚‹æ¨ªå¹…\n" -#: help.c:485 +#: help.c:463 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3632,7 +3695,7 @@ msgstr "" " expanded (or x)\n" " 拡張出力 [on, off, auto]\n" -#: help.c:487 +#: help.c:465 #, c-format msgid "" " fieldsep\n" @@ -3641,7 +3704,7 @@ msgstr "" " fieldsep\n" " éžæ•´åˆ—出力ã§ã®ãƒ•ィールド区切り文字(デフォルト㯠\"%s\")\n" -#: help.c:490 +#: help.c:468 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3649,7 +3712,7 @@ msgstr "" " fieldsep_zero\n" " éžæ•´åˆ—出力ã§ã®ãƒ•ィールド区切り文字をãƒã‚¤ãƒˆå€¤ã®0ã«è¨­å®š\n" -#: help.c:492 +#: help.c:470 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3657,7 +3720,7 @@ msgstr "" " footer\n" " テーブルフッター出力ã®è¦å¦ã‚’設定 [on, off]\n" -#: help.c:494 +#: help.c:472 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3665,7 +3728,7 @@ msgstr "" " format\n" " 出力フォーマットを設定 [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:496 +#: help.c:474 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3673,7 +3736,7 @@ msgstr "" " linestyle\n" " å¢ƒç•Œç·šã®æç”»ã‚¹ã‚¿ã‚¤ãƒ«ã‚’è¨­å®š [ascii, old-ascii, unicode]\n" -#: help.c:498 +#: help.c:476 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3681,7 +3744,7 @@ msgstr "" " null\n" " null 値ã®ä»£ã‚りã«è¡¨ç¤ºã™ã‚‹æ–‡å­—列を設定\n" -#: help.c:500 +#: help.c:478 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3689,7 +3752,7 @@ msgstr "" " numericlocale\n" " ロケール固有文字ã§ã®æ¡åŒºåˆ‡ã‚Šã‚’表示ã™ã‚‹ã‹ã©ã†ã‹ã‚’指定\n" -#: help.c:502 +#: help.c:480 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3697,7 +3760,7 @@ msgstr "" " pager\n" " ã„ã¤å¤–部ページャーを使ã†ã‹ã‚’制御 [yes, no, always]\n" -#: help.c:504 +#: help.c:482 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3705,7 +3768,7 @@ msgstr "" " recordsep\n" " éžæ•´åˆ—出力ã§ã®ãƒ¬ã‚³ãƒ¼ãƒ‰(行)区切り\n" -#: help.c:506 +#: help.c:484 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3713,7 +3776,7 @@ msgstr "" " recordsep_zero\n" " éžæ•´åˆ—出力ã§ãƒ¬ã‚³ãƒ¼ãƒ‰åŒºåˆ‡ã‚Šã«ãƒã‚¤ãƒˆå€¤ã®0ã«è¨­å®š\n" -#: help.c:508 +#: help.c:486 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3723,7 +3786,7 @@ msgstr "" " HTMLフォーマット時ã®tableã‚¿ã‚°ã®å±žæ€§ã€ã‚‚ã—ã㯠latex-longtable\n" " フォーマット時ã«å·¦å¯„ã›ã™ã‚‹ãƒ‡ãƒ¼ã‚¿åž‹ã®ç›¸å¯¾ã‚«ãƒ©ãƒ å¹…を指定\n" -#: help.c:511 +#: help.c:489 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3731,7 +3794,7 @@ msgstr "" " title\n" " 以é™ã«è¡¨ç¤ºã•れる表ã®ã‚¿ã‚¤ãƒˆãƒ«ã‚’設定\n" -#: help.c:513 +#: help.c:491 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3739,7 +3802,7 @@ msgstr "" " tuples_only\n" " セットã•れãŸå ´åˆã€å®Ÿéš›ã®ãƒ†ãƒ¼ãƒ–ルデータã®ã¿ã‚’表示\n" -#: help.c:515 +#: help.c:493 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3751,7 +3814,17 @@ msgstr "" " unicode_header_linestyle\n" " Unicode ã«ã‚ˆã‚‹ç·šæç”»æ™‚ã®ã‚¹ã‚¿ã‚¤ãƒ«ã‚’設定 [single, double]\n" -#: help.c:520 +#: help.c:497 +msgid "" +" xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr "" +" xheader_width\n" +" 拡張出力ã®ãƒ˜ãƒƒãƒ€ã®æœ€å¤§å¹…を指定ã—ã¾ã™\n" +" [full, column, page, 整数値]\n" + +#: help.c:501 msgid "" "\n" "Environment variables:\n" @@ -3759,7 +3832,7 @@ msgstr "" "\n" "環境変数:\n" -#: help.c:524 +#: help.c:505 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3769,7 +3842,7 @@ msgstr "" " ã¾ãŸã¯psql内㧠\\setenv åå‰ [値]\n" "\n" -#: help.c:526 +#: help.c:507 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3781,7 +3854,7 @@ msgstr "" " ã¾ãŸã¯psq内㧠\\setenv åå‰ [値]\n" "\n" -#: help.c:529 +#: help.c:510 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3789,7 +3862,7 @@ msgstr "" " COLUMNS\n" " æŠ˜ã‚Šè¿”ã—æ›¸å¼ã«ãŠã‘るカラム数\n" -#: help.c:531 +#: help.c:512 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3797,7 +3870,7 @@ msgstr "" " PGAPPNAME\n" " application_name 接続パラメータã¨åŒã˜\n" -#: help.c:533 +#: help.c:514 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3805,7 +3878,7 @@ msgstr "" " PGDATABASE\n" " dbname 接続パラメータã¨åŒã˜\n" -#: help.c:535 +#: help.c:516 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3813,7 +3886,7 @@ msgstr "" " PGHOST\n" " host 接続パラメータã¨åŒã˜\n" -#: help.c:537 +#: help.c:518 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3821,7 +3894,7 @@ msgstr "" " PGPASSFILE\n" " パスワードファイルå\n" -#: help.c:539 +#: help.c:520 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -3829,7 +3902,7 @@ msgstr "" " PGPASSWORD\n" " 接続用パスワード (推奨ã•れã¾ã›ã‚“)\n" -#: help.c:541 +#: help.c:522 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3837,7 +3910,7 @@ msgstr "" " PGPORT\n" " port 接続パラメータã¨åŒã˜\n" -#: help.c:543 +#: help.c:524 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3845,7 +3918,7 @@ msgstr "" " PGUSER\n" " user 接続パラメータã¨åŒã˜\n" -#: help.c:545 +#: help.c:526 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3853,7 +3926,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " \\e, \\ef, \\ev コマンドã§ä½¿ã‚れるエディタ\n" -#: help.c:547 +#: help.c:528 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3861,7 +3934,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " エディタã®èµ·å‹•時ã«è¡Œç•ªå·ã‚’指定ã™ã‚‹æ–¹æ³•\n" -#: help.c:549 +#: help.c:530 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -3869,7 +3942,7 @@ msgstr "" " PSQL_HISTORY\n" " コマンドライン履歴ファイルã®ä»£æ›¿ã®å ´æ‰€\n" -#: help.c:551 +#: help.c:532 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -3877,7 +3950,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " 外部ページャープログラムã®åå‰\n" -#: help.c:554 +#: help.c:535 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" @@ -3885,7 +3958,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " \\watchã§ä½¿ç”¨ã™ã‚‹å¤–部ページャープログラムã®åå‰\n" -#: help.c:557 +#: help.c:538 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -3893,7 +3966,7 @@ msgstr "" " PSQLRC\n" " ユーザー㮠.psqlrc ファイルã®ä»£æ›¿ã®å ´æ‰€\n" -#: help.c:559 +#: help.c:540 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -3901,7 +3974,7 @@ msgstr "" " SHELL\n" " \\! コマンドã§ä½¿ã‚れるシェル\n" -#: help.c:561 +#: help.c:542 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -3909,11 +3982,11 @@ msgstr "" " TMPDIR\n" " テンãƒãƒ©ãƒªãƒ•ァイル用ディレクトリ\n" -#: help.c:621 +#: help.c:602 msgid "Available help:\n" msgstr "利用å¯èƒ½ãªãƒ˜ãƒ«ãƒ—:\n" -#: help.c:716 +#: help.c:697 #, c-format msgid "" "Command: %s\n" @@ -3932,7 +4005,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:739 +#: help.c:720 #, c-format msgid "" "No help available for \"%s\".\n" @@ -3941,17 +4014,17 @@ msgstr "" "\"%s\"ã®ãƒ˜ãƒ«ãƒ—ãŒã‚りã¾ã›ã‚“。\n" "引数ãªã—ã§ \\h ã¨ã‚¿ã‚¤ãƒ—ã™ã‚‹ã¨ã€ãƒ˜ãƒ«ãƒ—ã®ä¸€è¦§ãŒè¡¨ç¤ºã•れã¾ã™ã€‚\n" -#: input.c:216 +#: input.c:215 #, c-format msgid "could not read from input file: %m" msgstr "入力ファイルã‹ã‚‰èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %m" -#: input.c:477 input.c:515 +#: input.c:476 input.c:514 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "ファイル\"%s\"ã«ãƒ’ストリーをä¿å­˜ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: input.c:534 +#: input.c:533 #, c-format msgid "history is not supported by this installation" msgstr "ã“ã®ç’°å¢ƒã§ã¯ãƒ’ストリー機能ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" @@ -4038,17 +4111,17 @@ msgstr "å•ã„åˆã‚ã›ã¯ç„¡è¦–ã•れã¾ã—ãŸ; \\endifã‹Ctrl-Cã§ç¾åœ¨ã®\\i msgid "reached EOF without finding closing \\endif(s)" msgstr "ブロックを閉ã˜ã‚‹\\endifを検出中ã«ã€ãƒ•ァイルã®çµ‚端(EOF)ã«é”ã—ã¾ã—ãŸ" -#: psqlscan.l:716 +#: psqlscan.l:732 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "変数\"%s\"ã®å†å¸°å±•開をスキップã—ã¦ã„ã¾ã™" -#: psqlscanslash.l:640 +#: psqlscanslash.l:642 #, c-format msgid "unterminated quoted string" msgstr "文字列ã®å¼•用符ãŒé–‰ã˜ã¦ã„ã¾ã›ã‚“" -#: psqlscanslash.l:825 +#: psqlscanslash.l:842 #, c-format msgid "%s: out of memory" msgstr "%s: メモリä¸è¶³ã§ã™" @@ -4056,2427 +4129,2447 @@ msgstr "%s: メモリä¸è¶³ã§ã™" #: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 #: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 #: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 -#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238 -#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248 -#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267 -#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323 -#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443 -#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524 -#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595 -#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606 -#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668 -#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714 -#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747 -#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802 -#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900 -#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999 -#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 -#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071 -#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086 -#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116 -#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141 -#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 -#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163 -#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310 -#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320 -#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445 -#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486 -#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507 -#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523 -#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548 -#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577 -#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 -#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687 -#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696 -#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000 -#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159 -#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236 -#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439 -#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525 -#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602 -#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738 -#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079 -#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179 -#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267 -#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346 -#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404 -#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436 -#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472 -#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507 -#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545 -#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582 -#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614 -#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646 -#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688 -#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040 -#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197 -#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:245 +#: sql_help.c:247 sql_help.c:248 sql_help.c:250 sql_help.c:252 sql_help.c:255 +#: sql_help.c:257 sql_help.c:259 sql_help.c:261 sql_help.c:276 sql_help.c:277 +#: sql_help.c:278 sql_help.c:280 sql_help.c:329 sql_help.c:331 sql_help.c:333 +#: sql_help.c:335 sql_help.c:404 sql_help.c:409 sql_help.c:411 sql_help.c:453 +#: sql_help.c:455 sql_help.c:458 sql_help.c:460 sql_help.c:529 sql_help.c:534 +#: sql_help.c:539 sql_help.c:544 sql_help.c:549 sql_help.c:603 sql_help.c:605 +#: sql_help.c:607 sql_help.c:609 sql_help.c:611 sql_help.c:614 sql_help.c:616 +#: sql_help.c:619 sql_help.c:630 sql_help.c:632 sql_help.c:676 sql_help.c:678 +#: sql_help.c:680 sql_help.c:683 sql_help.c:685 sql_help.c:687 sql_help.c:728 +#: sql_help.c:732 sql_help.c:736 sql_help.c:757 sql_help.c:760 sql_help.c:763 +#: sql_help.c:792 sql_help.c:804 sql_help.c:812 sql_help.c:815 sql_help.c:818 +#: sql_help.c:833 sql_help.c:836 sql_help.c:865 sql_help.c:870 sql_help.c:875 +#: sql_help.c:880 sql_help.c:885 sql_help.c:912 sql_help.c:914 sql_help.c:916 +#: sql_help.c:918 sql_help.c:921 sql_help.c:923 sql_help.c:970 sql_help.c:1015 +#: sql_help.c:1020 sql_help.c:1025 sql_help.c:1030 sql_help.c:1035 +#: sql_help.c:1054 sql_help.c:1065 sql_help.c:1067 sql_help.c:1087 +#: sql_help.c:1097 sql_help.c:1098 sql_help.c:1100 sql_help.c:1102 +#: sql_help.c:1114 sql_help.c:1118 sql_help.c:1120 sql_help.c:1132 +#: sql_help.c:1134 sql_help.c:1136 sql_help.c:1138 sql_help.c:1157 +#: sql_help.c:1159 sql_help.c:1163 sql_help.c:1167 sql_help.c:1171 +#: sql_help.c:1174 sql_help.c:1175 sql_help.c:1176 sql_help.c:1179 +#: sql_help.c:1182 sql_help.c:1184 sql_help.c:1324 sql_help.c:1326 +#: sql_help.c:1329 sql_help.c:1332 sql_help.c:1334 sql_help.c:1336 +#: sql_help.c:1339 sql_help.c:1342 sql_help.c:1464 sql_help.c:1466 +#: sql_help.c:1468 sql_help.c:1471 sql_help.c:1492 sql_help.c:1495 +#: sql_help.c:1498 sql_help.c:1501 sql_help.c:1505 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1525 sql_help.c:1528 +#: sql_help.c:1530 sql_help.c:1532 sql_help.c:1542 sql_help.c:1544 +#: sql_help.c:1554 sql_help.c:1556 sql_help.c:1566 sql_help.c:1569 +#: sql_help.c:1592 sql_help.c:1594 sql_help.c:1596 sql_help.c:1598 +#: sql_help.c:1601 sql_help.c:1603 sql_help.c:1606 sql_help.c:1609 +#: sql_help.c:1660 sql_help.c:1703 sql_help.c:1706 sql_help.c:1708 +#: sql_help.c:1710 sql_help.c:1713 sql_help.c:1715 sql_help.c:1717 +#: sql_help.c:1720 sql_help.c:1770 sql_help.c:1786 sql_help.c:2019 +#: sql_help.c:2088 sql_help.c:2107 sql_help.c:2120 sql_help.c:2178 +#: sql_help.c:2186 sql_help.c:2196 sql_help.c:2224 sql_help.c:2257 +#: sql_help.c:2275 sql_help.c:2303 sql_help.c:2414 sql_help.c:2460 +#: sql_help.c:2485 sql_help.c:2508 sql_help.c:2512 sql_help.c:2546 +#: sql_help.c:2566 sql_help.c:2588 sql_help.c:2602 sql_help.c:2623 +#: sql_help.c:2652 sql_help.c:2685 sql_help.c:2708 sql_help.c:2755 +#: sql_help.c:3053 sql_help.c:3066 sql_help.c:3083 sql_help.c:3099 +#: sql_help.c:3139 sql_help.c:3193 sql_help.c:3197 sql_help.c:3199 +#: sql_help.c:3206 sql_help.c:3225 sql_help.c:3252 sql_help.c:3287 +#: sql_help.c:3299 sql_help.c:3308 sql_help.c:3352 sql_help.c:3366 +#: sql_help.c:3394 sql_help.c:3402 sql_help.c:3414 sql_help.c:3424 +#: sql_help.c:3432 sql_help.c:3440 sql_help.c:3448 sql_help.c:3456 +#: sql_help.c:3465 sql_help.c:3476 sql_help.c:3484 sql_help.c:3492 +#: sql_help.c:3500 sql_help.c:3508 sql_help.c:3518 sql_help.c:3527 +#: sql_help.c:3536 sql_help.c:3544 sql_help.c:3554 sql_help.c:3565 +#: sql_help.c:3573 sql_help.c:3582 sql_help.c:3593 sql_help.c:3602 +#: sql_help.c:3610 sql_help.c:3618 sql_help.c:3626 sql_help.c:3634 +#: sql_help.c:3642 sql_help.c:3650 sql_help.c:3658 sql_help.c:3666 +#: sql_help.c:3674 sql_help.c:3682 sql_help.c:3699 sql_help.c:3708 +#: sql_help.c:3716 sql_help.c:3733 sql_help.c:3748 sql_help.c:4061 +#: sql_help.c:4182 sql_help.c:4211 sql_help.c:4227 sql_help.c:4229 +#: sql_help.c:4733 sql_help.c:4781 sql_help.c:4940 msgid "name" msgstr "åå‰" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848 -#: sql_help.c:3347 sql_help.c:4468 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:340 sql_help.c:1863 +#: sql_help.c:3367 sql_help.c:4500 msgid "aggregate_signature" msgstr "集約関数ã®ã‚·ã‚°ãƒ‹ãƒãƒ£ãƒ¼" -#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253 -#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576 -#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798 -#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008 -#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105 -#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444 -#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534 -#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:260 +#: sql_help.c:281 sql_help.c:412 sql_help.c:459 sql_help.c:538 sql_help.c:586 +#: sql_help.c:604 sql_help.c:631 sql_help.c:684 sql_help.c:759 sql_help.c:814 +#: sql_help.c:835 sql_help.c:874 sql_help.c:924 sql_help.c:971 sql_help.c:1024 +#: sql_help.c:1056 sql_help.c:1066 sql_help.c:1101 sql_help.c:1121 +#: sql_help.c:1135 sql_help.c:1185 sql_help.c:1333 sql_help.c:1465 +#: sql_help.c:1508 sql_help.c:1529 sql_help.c:1543 sql_help.c:1555 +#: sql_help.c:1568 sql_help.c:1595 sql_help.c:1661 sql_help.c:1714 msgid "new_name" msgstr "æ–°ã—ã„åå‰" -#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251 -#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623 -#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801 -#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 -#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 -#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510 -#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:258 +#: sql_help.c:279 sql_help.c:410 sql_help.c:495 sql_help.c:543 sql_help.c:633 +#: sql_help.c:642 sql_help.c:707 sql_help.c:731 sql_help.c:762 sql_help.c:817 +#: sql_help.c:879 sql_help.c:922 sql_help.c:1029 sql_help.c:1068 +#: sql_help.c:1099 sql_help.c:1119 sql_help.c:1133 sql_help.c:1183 +#: sql_help.c:1399 sql_help.c:1467 sql_help.c:1510 sql_help.c:1531 +#: sql_help.c:1593 sql_help.c:1709 sql_help.c:3039 msgid "new_owner" msgstr "æ–°ã—ã„æ‰€æœ‰è€…" -#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322 -#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749 -#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087 -#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512 -#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:262 sql_help.c:332 +#: sql_help.c:461 sql_help.c:548 sql_help.c:686 sql_help.c:735 sql_help.c:765 +#: sql_help.c:820 sql_help.c:884 sql_help.c:1034 sql_help.c:1103 +#: sql_help.c:1137 sql_help.c:1335 sql_help.c:1512 sql_help.c:1533 +#: sql_help.c:1545 sql_help.c:1557 sql_help.c:1597 sql_help.c:1716 msgid "new_schema" msgstr "æ–°ã—ã„スキーマ" -#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497 +#: sql_help.c:44 sql_help.c:1927 sql_help.c:3368 sql_help.c:4529 msgid "where aggregate_signature is:" msgstr "集約関数ã®ã‚·ã‚°ãƒ‹ãƒãƒ£ãƒ¼ã«ã¯ä»¥ä¸‹ã®ã‚‚ã®ãŒã‚りã¾ã™:" -#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353 -#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520 -#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 -#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 -#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 -#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 -#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089 -#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349 -#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535 -#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474 -#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501 -#: sql_help.c:4504 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:350 sql_help.c:363 +#: sql_help.c:367 sql_help.c:383 sql_help.c:386 sql_help.c:389 sql_help.c:530 +#: sql_help.c:535 sql_help.c:540 sql_help.c:545 sql_help.c:550 sql_help.c:866 +#: sql_help.c:871 sql_help.c:876 sql_help.c:881 sql_help.c:886 sql_help.c:1016 +#: sql_help.c:1021 sql_help.c:1026 sql_help.c:1031 sql_help.c:1036 +#: sql_help.c:1881 sql_help.c:1898 sql_help.c:1904 sql_help.c:1928 +#: sql_help.c:1931 sql_help.c:1934 sql_help.c:2089 sql_help.c:2108 +#: sql_help.c:2111 sql_help.c:2415 sql_help.c:2624 sql_help.c:3369 +#: sql_help.c:3372 sql_help.c:3375 sql_help.c:3466 sql_help.c:3555 +#: sql_help.c:3583 sql_help.c:3936 sql_help.c:4399 sql_help.c:4506 +#: sql_help.c:4513 sql_help.c:4519 sql_help.c:4530 sql_help.c:4533 +#: sql_help.c:4536 msgid "argmode" msgstr "引数ã®ãƒ¢ãƒ¼ãƒ‰" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354 -#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 -#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 -#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 -#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 -#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914 -#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090 -#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350 -#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536 -#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488 -#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:351 sql_help.c:364 +#: sql_help.c:368 sql_help.c:384 sql_help.c:387 sql_help.c:390 sql_help.c:531 +#: sql_help.c:536 sql_help.c:541 sql_help.c:546 sql_help.c:551 sql_help.c:867 +#: sql_help.c:872 sql_help.c:877 sql_help.c:882 sql_help.c:887 sql_help.c:1017 +#: sql_help.c:1022 sql_help.c:1027 sql_help.c:1032 sql_help.c:1037 +#: sql_help.c:1882 sql_help.c:1899 sql_help.c:1905 sql_help.c:1929 +#: sql_help.c:1932 sql_help.c:1935 sql_help.c:2090 sql_help.c:2109 +#: sql_help.c:2112 sql_help.c:2416 sql_help.c:2625 sql_help.c:3370 +#: sql_help.c:3373 sql_help.c:3376 sql_help.c:3467 sql_help.c:3556 +#: sql_help.c:3584 sql_help.c:4507 sql_help.c:4514 sql_help.c:4520 +#: sql_help.c:4531 sql_help.c:4534 sql_help.c:4537 msgid "argname" msgstr "引数ã®åå‰" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355 -#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 -#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 -#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 -#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 -#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915 -#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605 -#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448 -#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483 -#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:352 sql_help.c:365 +#: sql_help.c:369 sql_help.c:385 sql_help.c:388 sql_help.c:391 sql_help.c:532 +#: sql_help.c:537 sql_help.c:542 sql_help.c:547 sql_help.c:552 sql_help.c:868 +#: sql_help.c:873 sql_help.c:878 sql_help.c:883 sql_help.c:888 sql_help.c:1018 +#: sql_help.c:1023 sql_help.c:1028 sql_help.c:1033 sql_help.c:1038 +#: sql_help.c:1883 sql_help.c:1900 sql_help.c:1906 sql_help.c:1930 +#: sql_help.c:1933 sql_help.c:1936 sql_help.c:2417 sql_help.c:2626 +#: sql_help.c:3371 sql_help.c:3374 sql_help.c:3377 sql_help.c:3468 +#: sql_help.c:3557 sql_help.c:3585 sql_help.c:4508 sql_help.c:4515 +#: sql_help.c:4521 sql_help.c:4532 sql_help.c:4535 sql_help.c:4538 msgid "argtype" msgstr "引数ã®åž‹" -#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 -#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666 -#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977 -#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351 -#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048 -#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751 -#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973 +#: sql_help.c:114 sql_help.c:407 sql_help.c:484 sql_help.c:496 sql_help.c:965 +#: sql_help.c:1116 sql_help.c:1526 sql_help.c:1655 sql_help.c:1687 +#: sql_help.c:1739 sql_help.c:1798 sql_help.c:1987 sql_help.c:1994 +#: sql_help.c:2306 sql_help.c:2356 sql_help.c:2363 sql_help.c:2372 +#: sql_help.c:2461 sql_help.c:2686 sql_help.c:2777 sql_help.c:3068 +#: sql_help.c:3253 sql_help.c:3275 sql_help.c:3415 sql_help.c:3772 +#: sql_help.c:3980 sql_help.c:4226 sql_help.c:4228 sql_help.c:5006 msgid "option" msgstr "オプション" -#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441 -#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396 +#: sql_help.c:115 sql_help.c:966 sql_help.c:1656 sql_help.c:2462 +#: sql_help.c:2687 sql_help.c:3254 sql_help.c:3416 msgid "where option can be:" msgstr "オプションã«ã¯ä»¥ä¸‹ã®ã‚‚ã®ãŒã‚りã¾ã™:" -#: sql_help.c:116 sql_help.c:2217 +#: sql_help.c:116 sql_help.c:2238 msgid "allowconn" msgstr "接続ã®å¯å¦(真å½å€¤)" -#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218 -#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 +#: sql_help.c:117 sql_help.c:967 sql_help.c:1657 sql_help.c:2239 +#: sql_help.c:2463 sql_help.c:2688 sql_help.c:3255 msgid "connlimit" msgstr "æœ€å¤§åŒæ™‚接続数" -#: sql_help.c:118 sql_help.c:2219 +#: sql_help.c:118 sql_help.c:2240 msgid "istemplate" msgstr "テンプレートã‹ã©ã†ã‹(真å½å€¤)" -#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322 -#: sql_help.c:1374 sql_help.c:4200 +#: sql_help.c:124 sql_help.c:621 sql_help.c:689 sql_help.c:703 sql_help.c:1338 +#: sql_help.c:1392 sql_help.c:4232 msgid "new_tablespace" msgstr "æ–°ã—ã„テーブル空間å" -#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550 -#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 -#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 -#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643 -#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609 -#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:558 sql_help.c:560 +#: sql_help.c:561 sql_help.c:891 sql_help.c:893 sql_help.c:894 sql_help.c:974 +#: sql_help.c:978 sql_help.c:981 sql_help.c:1043 sql_help.c:1045 +#: sql_help.c:1046 sql_help.c:1196 sql_help.c:1198 sql_help.c:1664 +#: sql_help.c:1668 sql_help.c:1671 sql_help.c:2427 sql_help.c:2630 +#: sql_help.c:3948 sql_help.c:4250 sql_help.c:4411 sql_help.c:4721 msgid "configuration_parameter" msgstr "設定パラメータ" -#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487 -#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876 -#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101 -#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157 -#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182 -#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449 -#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667 -#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352 -#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475 -#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634 -#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923 -#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022 -#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689 -#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692 +#: sql_help.c:128 sql_help.c:408 sql_help.c:479 sql_help.c:485 sql_help.c:497 +#: sql_help.c:559 sql_help.c:613 sql_help.c:695 sql_help.c:705 sql_help.c:892 +#: sql_help.c:920 sql_help.c:975 sql_help.c:1044 sql_help.c:1117 +#: sql_help.c:1162 sql_help.c:1166 sql_help.c:1170 sql_help.c:1173 +#: sql_help.c:1178 sql_help.c:1181 sql_help.c:1197 sql_help.c:1371 +#: sql_help.c:1394 sql_help.c:1442 sql_help.c:1450 sql_help.c:1470 +#: sql_help.c:1527 sql_help.c:1611 sql_help.c:1665 sql_help.c:1688 +#: sql_help.c:2307 sql_help.c:2357 sql_help.c:2364 sql_help.c:2373 +#: sql_help.c:2428 sql_help.c:2429 sql_help.c:2493 sql_help.c:2496 +#: sql_help.c:2530 sql_help.c:2631 sql_help.c:2632 sql_help.c:2655 +#: sql_help.c:2778 sql_help.c:2817 sql_help.c:2927 sql_help.c:2940 +#: sql_help.c:2954 sql_help.c:2995 sql_help.c:3003 sql_help.c:3025 +#: sql_help.c:3042 sql_help.c:3069 sql_help.c:3276 sql_help.c:3981 +#: sql_help.c:4722 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 msgid "value" msgstr "値" -#: sql_help.c:200 +#: sql_help.c:202 msgid "target_role" msgstr "対象ã®ãƒ­ãƒ¼ãƒ«" -#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639 -#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899 -#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351 -#: sql_help.c:4370 sql_help.c:4382 +#: sql_help.c:203 sql_help.c:929 sql_help.c:2291 sql_help.c:2660 +#: sql_help.c:2733 sql_help.c:2738 sql_help.c:3911 sql_help.c:3920 +#: sql_help.c:3939 sql_help.c:3951 sql_help.c:4374 sql_help.c:4383 +#: sql_help.c:4402 sql_help.c:4414 msgid "schema_name" msgstr "スキーマå" -#: sql_help.c:202 +#: sql_help.c:204 msgid "abbreviated_grant_or_revoke" msgstr "GRANT/REVOKEã®çœç•¥å½¢" -#: sql_help.c:203 +#: sql_help.c:205 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "GRANT/REVOKEã®çœç•¥å½¢ã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:" -#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 -#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 -#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 -#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446 -#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583 -#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675 -#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240 -#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943 -#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710 +#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 +#: sql_help.c:211 sql_help.c:212 sql_help.c:213 sql_help.c:214 sql_help.c:215 +#: sql_help.c:584 sql_help.c:620 sql_help.c:688 sql_help.c:838 sql_help.c:985 +#: sql_help.c:1337 sql_help.c:1675 sql_help.c:2466 sql_help.c:2467 +#: sql_help.c:2468 sql_help.c:2469 sql_help.c:2470 sql_help.c:2604 +#: sql_help.c:2691 sql_help.c:2692 sql_help.c:2693 sql_help.c:3258 +#: sql_help.c:3259 sql_help.c:3260 sql_help.c:3261 sql_help.c:3262 +#: sql_help.c:3960 sql_help.c:3964 sql_help.c:4423 sql_help.c:4427 +#: sql_help.c:4743 msgid "role_name" msgstr "ロールå" -#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339 -#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684 -#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360 -#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782 -#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932 -#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991 -#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098 -#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571 -#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621 -#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664 -#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819 -#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877 -#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934 -#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065 -#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123 -#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126 +#: sql_help.c:246 sql_help.c:265 sql_help.c:472 sql_help.c:928 sql_help.c:1353 +#: sql_help.c:1355 sql_help.c:1359 sql_help.c:1409 sql_help.c:1421 +#: sql_help.c:1446 sql_help.c:1705 sql_help.c:2260 sql_help.c:2264 +#: sql_help.c:2376 sql_help.c:2381 sql_help.c:2489 sql_help.c:2659 +#: sql_help.c:2794 sql_help.c:2799 sql_help.c:2801 sql_help.c:2922 +#: sql_help.c:2935 sql_help.c:2949 sql_help.c:2958 sql_help.c:2970 +#: sql_help.c:2999 sql_help.c:4012 sql_help.c:4027 sql_help.c:4029 +#: sql_help.c:4125 sql_help.c:4128 sql_help.c:4130 sql_help.c:4593 +#: sql_help.c:4594 sql_help.c:4603 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4652 sql_help.c:4653 sql_help.c:4654 sql_help.c:4655 +#: sql_help.c:4696 sql_help.c:4697 sql_help.c:4702 sql_help.c:4707 +#: sql_help.c:4851 sql_help.c:4852 sql_help.c:4861 sql_help.c:4908 +#: sql_help.c:4909 sql_help.c:4910 sql_help.c:4911 sql_help.c:4912 +#: sql_help.c:4913 sql_help.c:4968 sql_help.c:4970 sql_help.c:5036 +#: sql_help.c:5096 sql_help.c:5097 sql_help.c:5106 sql_help.c:5153 +#: sql_help.c:5154 sql_help.c:5155 sql_help.c:5156 sql_help.c:5157 +#: sql_help.c:5158 msgid "expression" msgstr "評価å¼" -#: sql_help.c:242 +#: sql_help.c:249 sql_help.c:2261 msgid "domain_constraint" msgstr "ドメイン制約" -#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 -#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363 -#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854 -#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359 -#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003 +#: sql_help.c:251 sql_help.c:253 sql_help.c:256 sql_help.c:264 sql_help.c:487 +#: sql_help.c:488 sql_help.c:1330 sql_help.c:1379 sql_help.c:1380 +#: sql_help.c:1381 sql_help.c:1408 sql_help.c:1420 sql_help.c:1437 +#: sql_help.c:1869 sql_help.c:1871 sql_help.c:2263 sql_help.c:2375 +#: sql_help.c:2380 sql_help.c:2957 sql_help.c:2969 sql_help.c:4024 msgid "constraint_name" msgstr "制約å" -#: sql_help.c:247 sql_help.c:1315 +#: sql_help.c:254 sql_help.c:1331 msgid "new_constraint_name" msgstr "æ–°ã—ã„制約å" -#: sql_help.c:320 sql_help.c:1099 +#: sql_help.c:263 sql_help.c:2262 +msgid "where domain_constraint is:" +msgstr "ドメイン制約ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" + +#: sql_help.c:330 sql_help.c:1115 msgid "new_version" msgstr "æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³" -#: sql_help.c:324 sql_help.c:326 +#: sql_help.c:334 sql_help.c:336 msgid "member_object" msgstr "メンãƒãƒ¼ã‚ªãƒ–ジェクト" -#: sql_help.c:327 +#: sql_help.c:337 msgid "where member_object is:" msgstr "メンãƒãƒ¼ã‚ªãƒ–ジェクトã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" -#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 -#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 -#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 -#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 -#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858 -#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862 -#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871 -#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886 -#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896 -#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900 -#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904 -#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469 -#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478 -#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490 -#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494 -#: sql_help.c:4495 +#: sql_help.c:338 sql_help.c:343 sql_help.c:344 sql_help.c:345 sql_help.c:346 +#: sql_help.c:347 sql_help.c:348 sql_help.c:353 sql_help.c:357 sql_help.c:359 +#: sql_help.c:361 sql_help.c:370 sql_help.c:371 sql_help.c:372 sql_help.c:373 +#: sql_help.c:374 sql_help.c:375 sql_help.c:376 sql_help.c:377 sql_help.c:380 +#: sql_help.c:381 sql_help.c:1861 sql_help.c:1866 sql_help.c:1873 +#: sql_help.c:1874 sql_help.c:1875 sql_help.c:1876 sql_help.c:1877 +#: sql_help.c:1878 sql_help.c:1879 sql_help.c:1884 sql_help.c:1886 +#: sql_help.c:1890 sql_help.c:1892 sql_help.c:1896 sql_help.c:1901 +#: sql_help.c:1902 sql_help.c:1909 sql_help.c:1910 sql_help.c:1911 +#: sql_help.c:1912 sql_help.c:1913 sql_help.c:1914 sql_help.c:1915 +#: sql_help.c:1916 sql_help.c:1917 sql_help.c:1918 sql_help.c:1919 +#: sql_help.c:1924 sql_help.c:1925 sql_help.c:4496 sql_help.c:4501 +#: sql_help.c:4502 sql_help.c:4503 sql_help.c:4504 sql_help.c:4510 +#: sql_help.c:4511 sql_help.c:4516 sql_help.c:4517 sql_help.c:4522 +#: sql_help.c:4523 sql_help.c:4524 sql_help.c:4525 sql_help.c:4526 +#: sql_help.c:4527 msgid "object_name" msgstr "オブジェクトå" -#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467 +#: sql_help.c:339 sql_help.c:1862 sql_help.c:4499 msgid "aggregate_name" msgstr "集約関数å" -#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139 -#: sql_help.c:2141 sql_help.c:3365 +#: sql_help.c:341 sql_help.c:1864 sql_help.c:2154 sql_help.c:2158 +#: sql_help.c:2160 sql_help.c:3385 msgid "source_type" msgstr "変æ›å‰ã®åž‹" -#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140 -#: sql_help.c:2142 sql_help.c:3366 +#: sql_help.c:342 sql_help.c:1865 sql_help.c:2155 sql_help.c:2159 +#: sql_help.c:2161 sql_help.c:3386 msgid "target_type" msgstr "変æ›å¾Œã®åž‹" -#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137 -#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557 -#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590 -#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847 -#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093 -#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104 +#: sql_help.c:349 sql_help.c:802 sql_help.c:1880 sql_help.c:2156 +#: sql_help.c:2199 sql_help.c:2279 sql_help.c:2547 sql_help.c:2578 +#: sql_help.c:3145 sql_help.c:4398 sql_help.c:4505 sql_help.c:4622 +#: sql_help.c:4626 sql_help.c:4630 sql_help.c:4633 sql_help.c:4880 +#: sql_help.c:4884 sql_help.c:4888 sql_help.c:4891 sql_help.c:5125 +#: sql_help.c:5129 sql_help.c:5133 sql_help.c:5136 msgid "function_name" msgstr "関数å" -#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550 +#: sql_help.c:354 sql_help.c:795 sql_help.c:1887 sql_help.c:2571 msgid "operator_name" msgstr "演算å­å" -#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873 -#: sql_help.c:2527 sql_help.c:3489 +#: sql_help.c:355 sql_help.c:729 sql_help.c:733 sql_help.c:737 sql_help.c:1888 +#: sql_help.c:2548 sql_help.c:3509 msgid "left_type" msgstr "左辺ã®åž‹" -#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874 -#: sql_help.c:2528 sql_help.c:3490 +#: sql_help.c:356 sql_help.c:730 sql_help.c:734 sql_help.c:738 sql_help.c:1889 +#: sql_help.c:2549 sql_help.c:3510 msgid "right_type" msgstr "å³è¾ºã®åž‹" -#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 -#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 -#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547 -#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508 +#: sql_help.c:358 sql_help.c:360 sql_help.c:758 sql_help.c:761 sql_help.c:764 +#: sql_help.c:793 sql_help.c:805 sql_help.c:813 sql_help.c:816 sql_help.c:819 +#: sql_help.c:1426 sql_help.c:1891 sql_help.c:1893 sql_help.c:2568 +#: sql_help.c:2589 sql_help.c:2975 sql_help.c:3519 sql_help.c:3528 msgid "index_method" msgstr "インデックスメソッド" -#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480 +#: sql_help.c:362 sql_help.c:1897 sql_help.c:4512 msgid "procedure_name" msgstr "プロシージャå" -#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486 +#: sql_help.c:366 sql_help.c:1903 sql_help.c:3935 sql_help.c:4518 msgid "routine_name" msgstr "ルーãƒãƒ³å" -#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402 -#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670 -#: sql_help.c:3936 sql_help.c:4388 +#: sql_help.c:378 sql_help.c:1398 sql_help.c:1920 sql_help.c:2423 +#: sql_help.c:2629 sql_help.c:2930 sql_help.c:3112 sql_help.c:3690 +#: sql_help.c:3957 sql_help.c:4420 msgid "type_name" msgstr "åž‹å" -#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607 -#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921 -#: sql_help.c:4373 +#: sql_help.c:379 sql_help.c:1921 sql_help.c:2422 sql_help.c:2628 +#: sql_help.c:3113 sql_help.c:3343 sql_help.c:3691 sql_help.c:3942 +#: sql_help.c:4405 msgid "lang_name" msgstr "言語å" -#: sql_help.c:372 +#: sql_help.c:382 msgid "and aggregate_signature is:" msgstr "集約関数ã®ã‚·ã‚°ãƒ‹ãƒãƒ£ãƒ¼ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" -#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283 +#: sql_help.c:405 sql_help.c:2021 sql_help.c:2304 msgid "handler_function" msgstr "ãƒãƒ³ãƒ‰ãƒ©ãƒ¼é–¢æ•°" -#: sql_help.c:396 sql_help.c:2284 +#: sql_help.c:406 sql_help.c:2305 msgid "validator_function" msgstr "ãƒãƒªãƒ‡ãƒ¼ã‚¿ãƒ¼é–¢æ•°" -#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 -#: sql_help.c:1309 sql_help.c:1581 +#: sql_help.c:454 sql_help.c:533 sql_help.c:677 sql_help.c:869 sql_help.c:1019 +#: sql_help.c:1325 sql_help.c:1602 msgid "action" msgstr "アクション" -#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461 -#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470 -#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683 -#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080 -#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334 -#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 -#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349 -#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 -#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422 -#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683 -#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853 -#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1986 sql_help.c:1987 -#: sql_help.c:1988 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399 -#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637 -#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895 -#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927 -#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963 -#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986 -#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893 -#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007 -#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099 -#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627 -#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890 -#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937 -#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138 +#: sql_help.c:456 sql_help.c:463 sql_help.c:467 sql_help.c:468 sql_help.c:471 +#: sql_help.c:473 sql_help.c:474 sql_help.c:475 sql_help.c:477 sql_help.c:480 +#: sql_help.c:482 sql_help.c:483 sql_help.c:681 sql_help.c:691 sql_help.c:693 +#: sql_help.c:696 sql_help.c:698 sql_help.c:699 sql_help.c:927 sql_help.c:1096 +#: sql_help.c:1327 sql_help.c:1345 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 sql_help.c:1358 +#: sql_help.c:1360 sql_help.c:1361 sql_help.c:1363 sql_help.c:1366 +#: sql_help.c:1367 sql_help.c:1369 sql_help.c:1372 sql_help.c:1374 +#: sql_help.c:1375 sql_help.c:1422 sql_help.c:1424 sql_help.c:1431 +#: sql_help.c:1440 sql_help.c:1445 sql_help.c:1452 sql_help.c:1453 +#: sql_help.c:1704 sql_help.c:1707 sql_help.c:1711 sql_help.c:1747 +#: sql_help.c:1868 sql_help.c:1984 sql_help.c:1990 sql_help.c:2004 +#: sql_help.c:2005 sql_help.c:2006 sql_help.c:2354 sql_help.c:2367 +#: sql_help.c:2420 sql_help.c:2488 sql_help.c:2494 sql_help.c:2527 +#: sql_help.c:2658 sql_help.c:2763 sql_help.c:2798 sql_help.c:2800 +#: sql_help.c:2912 sql_help.c:2921 sql_help.c:2931 sql_help.c:2934 +#: sql_help.c:2944 sql_help.c:2948 sql_help.c:2971 sql_help.c:2973 +#: sql_help.c:2980 sql_help.c:2993 sql_help.c:2998 sql_help.c:3005 +#: sql_help.c:3006 sql_help.c:3022 sql_help.c:3148 sql_help.c:3288 +#: sql_help.c:3914 sql_help.c:3915 sql_help.c:4011 sql_help.c:4026 +#: sql_help.c:4028 sql_help.c:4030 sql_help.c:4124 sql_help.c:4127 +#: sql_help.c:4129 sql_help.c:4131 sql_help.c:4377 sql_help.c:4378 +#: sql_help.c:4498 sql_help.c:4659 sql_help.c:4666 sql_help.c:4668 +#: sql_help.c:4917 sql_help.c:4924 sql_help.c:4926 sql_help.c:4967 +#: sql_help.c:4969 sql_help.c:4971 sql_help.c:5024 sql_help.c:5162 +#: sql_help.c:5169 sql_help.c:5171 msgid "column_name" msgstr "列å" -#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 +#: sql_help.c:457 sql_help.c:682 sql_help.c:1328 sql_help.c:1712 msgid "new_column_name" msgstr "æ–°ã—ã„列å" -#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 -#: sql_help.c:1328 sql_help.c:1591 +#: sql_help.c:462 sql_help.c:554 sql_help.c:690 sql_help.c:890 sql_help.c:1040 +#: sql_help.c:1344 sql_help.c:1612 msgid "where action is one of:" msgstr "アクションã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:" -#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330 -#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237 -#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896 -#: sql_help.c:3175 sql_help.c:4151 +#: sql_help.c:464 sql_help.c:469 sql_help.c:1088 sql_help.c:1346 +#: sql_help.c:1351 sql_help.c:1614 sql_help.c:1618 sql_help.c:2258 +#: sql_help.c:2355 sql_help.c:2567 sql_help.c:2756 sql_help.c:2913 +#: sql_help.c:3195 sql_help.c:4183 msgid "data_type" msgstr "データ型" -#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336 -#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337 -#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919 -#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000 +#: sql_help.c:465 sql_help.c:470 sql_help.c:1347 sql_help.c:1352 +#: sql_help.c:1447 sql_help.c:1615 sql_help.c:1619 sql_help.c:2259 +#: sql_help.c:2358 sql_help.c:2490 sql_help.c:2915 sql_help.c:2923 +#: sql_help.c:2936 sql_help.c:2950 sql_help.c:3000 sql_help.c:3196 +#: sql_help.c:3202 sql_help.c:4021 msgid "collation" msgstr "ç…§åˆé †åº" -#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347 -#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928 +#: sql_help.c:466 sql_help.c:1348 sql_help.c:2359 sql_help.c:2368 +#: sql_help.c:2916 sql_help.c:2932 sql_help.c:2945 msgid "column_constraint" msgstr "カラム制約" -#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986 +#: sql_help.c:476 sql_help.c:618 sql_help.c:692 sql_help.c:1368 sql_help.c:5018 msgid "integer" msgstr "æ•´æ•°" -#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352 -#: sql_help.c:1355 +#: sql_help.c:478 sql_help.c:481 sql_help.c:694 sql_help.c:697 sql_help.c:1370 +#: sql_help.c:1373 msgid "attribute_option" msgstr "属性オプション" -#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348 -#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929 +#: sql_help.c:486 sql_help.c:1377 sql_help.c:2360 sql_help.c:2369 +#: sql_help.c:2917 sql_help.c:2933 sql_help.c:2946 msgid "table_constraint" msgstr "テーブル制約" -#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364 -#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907 +#: sql_help.c:489 sql_help.c:490 sql_help.c:491 sql_help.c:492 sql_help.c:1382 +#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:1922 msgid "trigger_name" msgstr "トリガーå" -#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 -#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926 +#: sql_help.c:493 sql_help.c:494 sql_help.c:1396 sql_help.c:1397 +#: sql_help.c:2361 sql_help.c:2366 sql_help.c:2920 sql_help.c:2943 msgid "parent_table" msgstr "親テーブル" -#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 -#: sql_help.c:1550 sql_help.c:2269 +#: sql_help.c:553 sql_help.c:610 sql_help.c:679 sql_help.c:889 sql_help.c:1039 +#: sql_help.c:1571 sql_help.c:2290 msgid "extension_name" msgstr "æ‹¡å¼µå" -#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403 +#: sql_help.c:555 sql_help.c:1041 sql_help.c:2424 msgid "execution_cost" msgstr "実行コスト" -#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404 +#: sql_help.c:556 sql_help.c:1042 sql_help.c:2425 msgid "result_rows" msgstr "çµæžœã®è¡Œæ•°" -#: sql_help.c:547 sql_help.c:2405 +#: sql_help.c:557 sql_help.c:2426 msgid "support_function" msgstr "サãƒãƒ¼ãƒˆé–¢æ•°" -#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 -#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641 -#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717 -#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891 -#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900 -#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906 -#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912 -#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922 -#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928 -#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934 -#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940 -#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348 -#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355 -#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361 -#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371 -#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377 -#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383 -#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389 -#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393 +#: sql_help.c:579 sql_help.c:581 sql_help.c:964 sql_help.c:972 sql_help.c:976 +#: sql_help.c:979 sql_help.c:982 sql_help.c:1654 sql_help.c:1662 +#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1672 sql_help.c:2734 +#: sql_help.c:2736 sql_help.c:2739 sql_help.c:2740 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3917 sql_help.c:3918 sql_help.c:3921 +#: sql_help.c:3922 sql_help.c:3924 sql_help.c:3925 sql_help.c:3927 +#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3931 sql_help.c:3933 +#: sql_help.c:3934 sql_help.c:3940 sql_help.c:3941 sql_help.c:3943 +#: sql_help.c:3944 sql_help.c:3946 sql_help.c:3947 sql_help.c:3949 +#: sql_help.c:3950 sql_help.c:3952 sql_help.c:3953 sql_help.c:3955 +#: sql_help.c:3956 sql_help.c:3958 sql_help.c:3959 sql_help.c:3961 +#: sql_help.c:3962 sql_help.c:4375 sql_help.c:4376 sql_help.c:4380 +#: sql_help.c:4381 sql_help.c:4384 sql_help.c:4385 sql_help.c:4387 +#: sql_help.c:4388 sql_help.c:4390 sql_help.c:4391 sql_help.c:4393 +#: sql_help.c:4394 sql_help.c:4396 sql_help.c:4397 sql_help.c:4403 +#: sql_help.c:4404 sql_help.c:4406 sql_help.c:4407 sql_help.c:4409 +#: sql_help.c:4410 sql_help.c:4412 sql_help.c:4413 sql_help.c:4415 +#: sql_help.c:4416 sql_help.c:4418 sql_help.c:4419 sql_help.c:4421 +#: sql_help.c:4422 sql_help.c:4424 sql_help.c:4425 msgid "role_specification" msgstr "ãƒ­ãƒ¼ãƒ«ã®æŒ‡å®š" -#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205 -#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720 +#: sql_help.c:580 sql_help.c:582 sql_help.c:1685 sql_help.c:2225 +#: sql_help.c:2742 sql_help.c:3273 sql_help.c:3724 sql_help.c:4753 msgid "user_name" msgstr "ユーザーå" -#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724 -#: sql_help.c:3942 sql_help.c:4394 +#: sql_help.c:583 sql_help.c:984 sql_help.c:1674 sql_help.c:2741 +#: sql_help.c:3963 sql_help.c:4426 msgid "where role_specification can be:" msgstr "ロール指定ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" -#: sql_help.c:575 +#: sql_help.c:585 msgid "group_name" msgstr "グループå" -#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476 -#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938 -#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933 -#: sql_help.c:4385 +#: sql_help.c:606 sql_help.c:1443 sql_help.c:2237 sql_help.c:2497 +#: sql_help.c:2531 sql_help.c:2928 sql_help.c:2941 sql_help.c:2955 +#: sql_help.c:2996 sql_help.c:3026 sql_help.c:3038 sql_help.c:3954 +#: sql_help.c:4417 msgid "tablespace_name" msgstr "テーブル空間å" -#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382 -#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785 +#: sql_help.c:608 sql_help.c:701 sql_help.c:1390 sql_help.c:1400 +#: sql_help.c:1438 sql_help.c:1800 msgid "index_name" msgstr "インデックスå" -#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375 -#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508 -#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977 -#: sql_help.c:3004 +#: sql_help.c:612 sql_help.c:615 sql_help.c:704 sql_help.c:706 sql_help.c:1393 +#: sql_help.c:1395 sql_help.c:1441 sql_help.c:2495 sql_help.c:2529 +#: sql_help.c:2926 sql_help.c:2939 sql_help.c:2953 sql_help.c:2994 +#: sql_help.c:3024 msgid "storage_parameter" msgstr "ストレージパラメータ" -#: sql_help.c:607 +#: sql_help.c:617 msgid "column_number" msgstr "列番å·" -#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477 +#: sql_help.c:641 sql_help.c:1885 sql_help.c:4509 msgid "large_object_oid" msgstr "ラージオブジェクトã®OID" -#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897 +#: sql_help.c:700 sql_help.c:1376 sql_help.c:2914 msgid "compression_method" msgstr "圧縮方å¼" -#: sql_help.c:692 sql_help.c:1373 +#: sql_help.c:702 sql_help.c:1391 msgid "new_access_method" msgstr "æ–°ã—ã„アクセスメソッド" -#: sql_help.c:725 sql_help.c:2531 +#: sql_help.c:739 sql_help.c:2552 msgid "res_proc" msgstr "åˆ¶ç´„é¸æŠžè©•ä¾¡é–¢æ•°" -#: sql_help.c:726 sql_help.c:2532 +#: sql_help.c:740 sql_help.c:2553 msgid "join_proc" msgstr "çµåˆé¸æŠžè©•価関数" -#: sql_help.c:778 sql_help.c:790 sql_help.c:2549 +#: sql_help.c:741 sql_help.c:2550 +msgid "com_op" +msgstr "交代演算å­" + +#: sql_help.c:742 sql_help.c:2551 +msgid "neg_op" +msgstr "å¦å®šæ¼”ç®—å­" + +#: sql_help.c:794 sql_help.c:806 sql_help.c:2570 msgid "strategy_number" msgstr "戦略番å·" -#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 -#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552 -#: sql_help.c:2555 sql_help.c:2556 +#: sql_help.c:796 sql_help.c:797 sql_help.c:800 sql_help.c:801 sql_help.c:807 +#: sql_help.c:808 sql_help.c:810 sql_help.c:811 sql_help.c:2572 sql_help.c:2573 +#: sql_help.c:2576 sql_help.c:2577 msgid "op_type" msgstr "演算å­ã®åž‹" -#: sql_help.c:782 sql_help.c:2553 +#: sql_help.c:798 sql_help.c:2574 msgid "sort_family_name" msgstr "ソートファミリーå" -#: sql_help.c:783 sql_help.c:793 sql_help.c:2554 +#: sql_help.c:799 sql_help.c:809 sql_help.c:2575 msgid "support_number" msgstr "サãƒãƒ¼ãƒˆç•ªå·" -#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095 -#: sql_help.c:3097 +#: sql_help.c:803 sql_help.c:2157 sql_help.c:2579 sql_help.c:3115 +#: sql_help.c:3117 msgid "argument_type" msgstr "引数ã®åž‹" -#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 -#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781 -#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893 -#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332 -#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582 -#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778 -#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925 -#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525 -#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895 -#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347 -#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640 -#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897 -#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081 -#: sql_help.c:5143 +#: sql_help.c:834 sql_help.c:837 sql_help.c:926 sql_help.c:1055 sql_help.c:1095 +#: sql_help.c:1567 sql_help.c:1570 sql_help.c:1746 sql_help.c:1799 +#: sql_help.c:1870 sql_help.c:1895 sql_help.c:1908 sql_help.c:1923 +#: sql_help.c:1983 sql_help.c:1989 sql_help.c:2353 sql_help.c:2365 +#: sql_help.c:2486 sql_help.c:2526 sql_help.c:2603 sql_help.c:2657 +#: sql_help.c:2710 sql_help.c:2762 sql_help.c:2795 sql_help.c:2802 +#: sql_help.c:2911 sql_help.c:2929 sql_help.c:2942 sql_help.c:3021 +#: sql_help.c:3141 sql_help.c:3322 sql_help.c:3545 sql_help.c:3594 +#: sql_help.c:3700 sql_help.c:3910 sql_help.c:3916 sql_help.c:3977 +#: sql_help.c:4009 sql_help.c:4373 sql_help.c:4379 sql_help.c:4497 +#: sql_help.c:4610 sql_help.c:4673 sql_help.c:4712 sql_help.c:4868 +#: sql_help.c:4931 sql_help.c:4965 sql_help.c:5023 sql_help.c:5113 +#: sql_help.c:5176 msgid "table_name" msgstr "テーブルå" -#: sql_help.c:823 sql_help.c:2584 +#: sql_help.c:839 sql_help.c:2605 msgid "using_expression" msgstr "USINGå¼" -#: sql_help.c:824 sql_help.c:2585 +#: sql_help.c:840 sql_help.c:2606 msgid "check_expression" msgstr "CHECKå¼" -#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632 +#: sql_help.c:913 sql_help.c:915 sql_help.c:917 sql_help.c:2653 msgid "publication_object" msgstr "発行オブジェクト" -#: sql_help.c:903 sql_help.c:2633 +#: sql_help.c:919 sql_help.c:2654 msgid "publication_parameter" msgstr "パブリケーションパラメータ" -#: sql_help.c:909 sql_help.c:2635 +#: sql_help.c:925 sql_help.c:2656 msgid "where publication_object is one of:" msgstr "発行オブジェクトã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:" -#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670 -#: sql_help.c:3236 +#: sql_help.c:968 sql_help.c:1658 sql_help.c:2464 sql_help.c:2689 +#: sql_help.c:3256 msgid "password" msgstr "パスワード" -#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671 -#: sql_help.c:3237 +#: sql_help.c:969 sql_help.c:1659 sql_help.c:2465 sql_help.c:2690 +#: sql_help.c:3257 msgid "timestamp" msgstr "タイムスタンプ" -#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642 -#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902 -#: sql_help.c:4354 +#: sql_help.c:973 sql_help.c:977 sql_help.c:980 sql_help.c:983 sql_help.c:1663 +#: sql_help.c:1667 sql_help.c:1670 sql_help.c:1673 sql_help.c:3923 +#: sql_help.c:4386 msgid "database_name" msgstr "データベースå" -#: sql_help.c:1073 sql_help.c:2740 +#: sql_help.c:1089 sql_help.c:2757 msgid "increment" msgstr "増分値" -#: sql_help.c:1074 sql_help.c:2741 +#: sql_help.c:1090 sql_help.c:2758 msgid "minvalue" msgstr "最å°å€¤" -#: sql_help.c:1075 sql_help.c:2742 +#: sql_help.c:1091 sql_help.c:2759 msgid "maxvalue" msgstr "最大値" -#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677 -#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077 +#: sql_help.c:1092 sql_help.c:2760 sql_help.c:4606 sql_help.c:4710 +#: sql_help.c:4864 sql_help.c:5040 sql_help.c:5109 msgid "start" msgstr "開始番å·" -#: sql_help.c:1077 sql_help.c:1347 +#: sql_help.c:1093 sql_help.c:1365 msgid "restart" msgstr "å†é–‹å§‹ç•ªå·" -#: sql_help.c:1078 sql_help.c:2744 +#: sql_help.c:1094 sql_help.c:2761 msgid "cache" msgstr "ã‚­ãƒ£ãƒƒã‚·ãƒ¥å‰²ã‚Šå½“ã¦æ•°" -#: sql_help.c:1123 +#: sql_help.c:1139 msgid "new_target" msgstr "æ–°ã—ã„ターゲット" -#: sql_help.c:1142 sql_help.c:2797 +#: sql_help.c:1158 sql_help.c:2814 msgid "conninfo" msgstr "接続文字列" -#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798 +#: sql_help.c:1160 sql_help.c:1164 sql_help.c:1168 sql_help.c:2815 msgid "publication_name" msgstr "パブリケーションå" -#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +#: sql_help.c:1161 sql_help.c:1165 sql_help.c:1169 msgid "publication_option" msgstr "パブリケーション・オプション" -#: sql_help.c:1156 +#: sql_help.c:1172 msgid "refresh_option" msgstr "{REFRESH PUBLICATION ã®è¿½åŠ ã‚ªãƒ—ã‚·ãƒ§ãƒ³}" -#: sql_help.c:1161 sql_help.c:2799 +#: sql_help.c:1177 sql_help.c:2816 msgid "subscription_parameter" msgstr "{SUBSCRIPTION パラメータå}" -#: sql_help.c:1164 +#: sql_help.c:1180 msgid "skip_option" msgstr "スキップオプション" -#: sql_help.c:1324 sql_help.c:1327 +#: sql_help.c:1340 sql_help.c:1343 msgid "partition_name" msgstr "パーティションå" -#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930 +#: sql_help.c:1341 sql_help.c:2370 sql_help.c:2947 msgid "partition_bound_spec" msgstr "パーティション境界ã®ä»•様" -#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944 +#: sql_help.c:1362 sql_help.c:1412 sql_help.c:2961 msgid "sequence_options" msgstr "シーケンスオプション" -#: sql_help.c:1346 +#: sql_help.c:1364 msgid "sequence_option" msgstr "シーケンスオプション" -#: sql_help.c:1360 +#: sql_help.c:1378 msgid "table_constraint_using_index" msgstr "インデックスを使ã†ãƒ†ãƒ¼ãƒ–ルã®åˆ¶ç´„" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 +#: sql_help.c:1386 sql_help.c:1387 sql_help.c:1388 sql_help.c:1389 msgid "rewrite_rule_name" msgstr "æ›¸ãæ›ãˆãƒ«ãƒ¼ãƒ«å" -#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969 +#: sql_help.c:1401 sql_help.c:2382 sql_help.c:2986 msgid "and partition_bound_spec is:" msgstr "パーティション境界ã®ä»•様ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" -#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362 -#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971 -#: sql_help.c:2972 +#: sql_help.c:1402 sql_help.c:1403 sql_help.c:1404 sql_help.c:2383 +#: sql_help.c:2384 sql_help.c:2385 sql_help.c:2987 sql_help.c:2988 +#: sql_help.c:2989 msgid "partition_bound_expr" msgstr "パーティション境界å¼" -#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366 -#: sql_help.c:2973 sql_help.c:2974 +#: sql_help.c:1405 sql_help.c:1406 sql_help.c:2386 sql_help.c:2387 +#: sql_help.c:2990 sql_help.c:2991 msgid "numeric_literal" msgstr "numericリテラル" -#: sql_help.c:1389 +#: sql_help.c:1407 msgid "and column_constraint is:" msgstr "ãã—ã¦ã‚«ãƒ©ãƒ åˆ¶ç´„ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" -#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606 -#: sql_help.c:2942 +#: sql_help.c:1410 sql_help.c:2377 sql_help.c:2418 sql_help.c:2627 +#: sql_help.c:2959 msgid "default_expr" msgstr "デフォルト表ç¾" -#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943 +#: sql_help.c:1411 sql_help.c:2378 sql_help.c:2960 msgid "generation_expr" msgstr "生æˆå¼" -#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 -#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955 -#: sql_help.c:2957 sql_help.c:2961 +#: sql_help.c:1413 sql_help.c:1414 sql_help.c:1423 sql_help.c:1425 +#: sql_help.c:1429 sql_help.c:2962 sql_help.c:2963 sql_help.c:2972 +#: sql_help.c:2974 sql_help.c:2978 msgid "index_parameters" msgstr "インデックスパラメータ" -#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964 +#: sql_help.c:1415 sql_help.c:1432 sql_help.c:2964 sql_help.c:2981 msgid "reftable" msgstr "å‚照テーブル" -#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965 +#: sql_help.c:1416 sql_help.c:1433 sql_help.c:2965 sql_help.c:2982 msgid "refcolumn" msgstr "å‚照列" -#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 -#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967 +#: sql_help.c:1417 sql_help.c:1418 sql_help.c:1434 sql_help.c:1435 +#: sql_help.c:2966 sql_help.c:2967 sql_help.c:2983 sql_help.c:2984 msgid "referential_action" msgstr "å‚照動作" -#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951 +#: sql_help.c:1419 sql_help.c:2379 sql_help.c:2968 msgid "and table_constraint is:" msgstr "テーブル制約ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" -#: sql_help.c:1409 sql_help.c:2959 +#: sql_help.c:1427 sql_help.c:2976 msgid "exclude_element" msgstr "除外対象è¦ç´ " -#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675 -#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075 +#: sql_help.c:1428 sql_help.c:2977 sql_help.c:4604 sql_help.c:4708 +#: sql_help.c:4862 sql_help.c:5038 sql_help.c:5107 msgid "operator" msgstr "演算å­" -#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962 +#: sql_help.c:1430 sql_help.c:2498 sql_help.c:2979 msgid "predicate" msgstr "インデックスã®è¿°èªž" -#: sql_help.c:1418 +#: sql_help.c:1436 msgid "and table_constraint_using_index is:" msgstr "テーブル制約ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" -#: sql_help.c:1421 sql_help.c:2975 +#: sql_help.c:1439 sql_help.c:2992 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "UNIQUE, PRIMARY KEY, EXCLUDE 制約ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãƒ‘ラメータã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" -#: sql_help.c:1426 sql_help.c:2980 +#: sql_help.c:1444 sql_help.c:2997 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "EXCLUDE 制約ã®é™¤å¤–対象è¦ç´ ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" -#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920 -#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001 +#: sql_help.c:1448 sql_help.c:2491 sql_help.c:2924 sql_help.c:2937 +#: sql_help.c:2951 sql_help.c:3001 sql_help.c:4022 msgid "opclass" msgstr "演算å­ã‚¯ãƒ©ã‚¹" -#: sql_help.c:1430 sql_help.c:2984 +#: sql_help.c:1449 sql_help.c:2492 sql_help.c:3002 +msgid "opclass_parameter" +msgstr "演算å­ã‚¯ãƒ©ã‚¹ãƒ‘ラメータ" + +#: sql_help.c:1451 sql_help.c:3004 msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" msgstr "FOREIGN KEY/REFERENCES制約ã®å‚照動作ã¯ä»¥ä¸‹ã®é€šã‚Š:" -#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021 +#: sql_help.c:1469 sql_help.c:1472 sql_help.c:3041 msgid "tablespace_option" msgstr "テーブル空間ã®ã‚ªãƒ—ション" -#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 +#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1502 sql_help.c:1506 msgid "token_type" msgstr "トークンã®åž‹" -#: sql_help.c:1473 sql_help.c:1476 +#: sql_help.c:1494 sql_help.c:1497 msgid "dictionary_name" msgstr "辞書å" -#: sql_help.c:1478 sql_help.c:1482 +#: sql_help.c:1499 sql_help.c:1503 msgid "old_dictionary" msgstr "å…ƒã®è¾žæ›¸" -#: sql_help.c:1479 sql_help.c:1483 +#: sql_help.c:1500 sql_help.c:1504 msgid "new_dictionary" msgstr "æ–°ã—ã„辞書" -#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 -#: sql_help.c:3174 +#: sql_help.c:1599 sql_help.c:1613 sql_help.c:1616 sql_help.c:1617 +#: sql_help.c:3194 msgid "attribute_name" msgstr "属性å" -#: sql_help.c:1579 +#: sql_help.c:1600 msgid "new_attribute_name" msgstr "æ–°ã—ã„属性å" -#: sql_help.c:1583 sql_help.c:1587 +#: sql_help.c:1604 sql_help.c:1608 msgid "new_enum_value" msgstr "æ–°ã—ã„列挙値" -#: sql_help.c:1584 +#: sql_help.c:1605 msgid "neighbor_enum_value" msgstr "隣接ã—ãŸåˆ—挙値" -#: sql_help.c:1586 +#: sql_help.c:1607 msgid "existing_enum_value" msgstr "既存ã®åˆ—挙値" -#: sql_help.c:1589 +#: sql_help.c:1610 msgid "property" msgstr "プロパティ" -#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756 -#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957 -#: sql_help.c:4363 +#: sql_help.c:1686 sql_help.c:2362 sql_help.c:2371 sql_help.c:2773 +#: sql_help.c:3274 sql_help.c:3725 sql_help.c:3932 sql_help.c:3978 +#: sql_help.c:4395 msgid "server_name" msgstr "サーãƒãƒ¼å" -#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269 +#: sql_help.c:1718 sql_help.c:1721 sql_help.c:3289 msgid "view_option_name" msgstr "ビューã®ã‚ªãƒ—ションå" -#: sql_help.c:1698 sql_help.c:3270 +#: sql_help.c:1719 sql_help.c:3290 msgid "view_option_value" msgstr "ビューオプションã®å€¤" -#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975 +#: sql_help.c:1740 sql_help.c:5007 msgid "table_and_columns" msgstr "テーブルãŠã‚ˆã³åˆ—" -#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754 -#: sql_help.c:4198 sql_help.c:4976 +#: sql_help.c:1741 sql_help.c:1801 sql_help.c:1995 sql_help.c:3774 +#: sql_help.c:4230 sql_help.c:5008 msgid "where option can be one of:" msgstr "オプションã«ã¯ä»¥ä¸‹ã®ã†ã¡ã®ã„ãšã‚Œã‹ã‚’指定ã—ã¾ã™:" -#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980 -#: sql_help.c:1983 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756 -#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760 -#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199 -#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979 -#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983 -#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988 +#: sql_help.c:1742 sql_help.c:1743 sql_help.c:1802 sql_help.c:1997 +#: sql_help.c:2001 sql_help.c:2183 sql_help.c:3775 sql_help.c:3776 +#: sql_help.c:3777 sql_help.c:3778 sql_help.c:3779 sql_help.c:3780 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:4231 sql_help.c:4233 sql_help.c:5009 sql_help.c:5010 +#: sql_help.c:5011 sql_help.c:5012 sql_help.c:5013 sql_help.c:5014 +#: sql_help.c:5015 sql_help.c:5016 sql_help.c:5017 sql_help.c:5019 +#: sql_help.c:5020 msgid "boolean" msgstr "真å½å€¤" -#: sql_help.c:1725 sql_help.c:4989 +#: sql_help.c:1744 sql_help.c:5021 msgid "size" msgstr "サイズ" -#: sql_help.c:1726 sql_help.c:4990 +#: sql_help.c:1745 sql_help.c:5022 msgid "and table_and_columns is:" msgstr "ãã—ã¦ãƒ†ãƒ¼ãƒ–ルã¨åˆ—ã®æŒ‡å®šã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" -#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762 +#: sql_help.c:1761 sql_help.c:4769 sql_help.c:4771 sql_help.c:4795 msgid "transaction_mode" msgstr "トランザクションã®ãƒ¢ãƒ¼ãƒ‰" -#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763 +#: sql_help.c:1762 sql_help.c:4772 sql_help.c:4796 msgid "where transaction_mode is one of:" msgstr "トランザクションã®ãƒ¢ãƒ¼ãƒ‰ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" -#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595 -#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848 -#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085 -#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105 +#: sql_help.c:1771 sql_help.c:4614 sql_help.c:4623 sql_help.c:4627 +#: sql_help.c:4631 sql_help.c:4634 sql_help.c:4872 sql_help.c:4881 +#: sql_help.c:4885 sql_help.c:4889 sql_help.c:4892 sql_help.c:5117 +#: sql_help.c:5126 sql_help.c:5130 sql_help.c:5134 sql_help.c:5137 msgid "argument" msgstr "引数" -#: sql_help.c:1852 +#: sql_help.c:1867 msgid "relation_name" msgstr "リレーションå" -#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357 +#: sql_help.c:1872 sql_help.c:3926 sql_help.c:4389 msgid "domain_name" msgstr "ドメインå" -#: sql_help.c:1879 +#: sql_help.c:1894 msgid "policy_name" msgstr "ãƒãƒªã‚·ãƒ¼å" -#: sql_help.c:1892 +#: sql_help.c:1907 msgid "rule_name" msgstr "ルールå" -#: sql_help.c:1911 sql_help.c:4496 +#: sql_help.c:1926 sql_help.c:4528 msgid "string_literal" msgstr "文字列リテラル" -#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410 +#: sql_help.c:1951 sql_help.c:4192 sql_help.c:4442 msgid "transaction_id" msgstr "トランザクションID" -#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027 +#: sql_help.c:1985 sql_help.c:1992 sql_help.c:4048 msgid "filename" msgstr "ファイルå" -#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696 -#: sql_help.c:2697 +#: sql_help.c:1986 sql_help.c:1993 sql_help.c:2712 sql_help.c:2713 +#: sql_help.c:2714 msgid "command" msgstr "コマンド" -#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305 -#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565 -#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822 -#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070 +#: sql_help.c:1988 sql_help.c:2711 sql_help.c:3144 sql_help.c:3325 +#: sql_help.c:4032 sql_help.c:4115 sql_help.c:4118 sql_help.c:4121 +#: sql_help.c:4597 sql_help.c:4599 sql_help.c:4701 sql_help.c:4703 +#: sql_help.c:4855 sql_help.c:4857 sql_help.c:4974 sql_help.c:5100 +#: sql_help.c:5102 msgid "condition" msgstr "æ¡ä»¶" -#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271 -#: sql_help.c:3289 sql_help.c:3992 +#: sql_help.c:1991 sql_help.c:2532 sql_help.c:3027 sql_help.c:3291 +#: sql_help.c:3309 sql_help.c:4013 msgid "query" msgstr "å•ã„åˆã‚ã›" -#: sql_help.c:1979 +#: sql_help.c:1996 msgid "format_name" msgstr "フォーマットå" -#: sql_help.c:1981 +#: sql_help.c:1998 msgid "delimiter_character" msgstr "区切り文字" -#: sql_help.c:1982 +#: sql_help.c:1999 msgid "null_string" msgstr "NULL文字列" -#: sql_help.c:1984 +#: sql_help.c:2000 +msgid "default_string" +msgstr "デフォルト文字列" + +#: sql_help.c:2002 msgid "quote_character" msgstr "引用符文字" -#: sql_help.c:1985 +#: sql_help.c:2003 msgid "escape_character" msgstr "エスケープ文字" -#: sql_help.c:1989 +#: sql_help.c:2007 +msgid "error_action" +msgstr "エラー処ç†" + +#: sql_help.c:2008 msgid "encoding_name" msgstr "エンコーディングå" -#: sql_help.c:1990 -msgid "default_string" -msgstr "デフォルト文字列" +#: sql_help.c:2009 +msgid "verbosity" +msgstr "詳細度" -#: sql_help.c:2001 +#: sql_help.c:2020 msgid "access_method_type" msgstr "アクセスメソッドã®åž‹" -#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094 +#: sql_help.c:2091 sql_help.c:2110 sql_help.c:2113 msgid "arg_data_type" msgstr "入力データ型" -#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103 +#: sql_help.c:2092 sql_help.c:2114 sql_help.c:2122 msgid "sfunc" msgstr "状態é·ç§»é–¢æ•°" -#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104 +#: sql_help.c:2093 sql_help.c:2115 sql_help.c:2123 msgid "state_data_type" msgstr "状態データã®åž‹" -#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105 +#: sql_help.c:2094 sql_help.c:2116 sql_help.c:2124 msgid "state_data_size" msgstr "状態データã®ã‚µã‚¤ã‚º" -#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106 +#: sql_help.c:2095 sql_help.c:2117 sql_help.c:2125 msgid "ffunc" msgstr "終了関数" -#: sql_help.c:2077 sql_help.c:2107 +#: sql_help.c:2096 sql_help.c:2126 msgid "combinefunc" msgstr "çµåˆé–¢æ•°" -#: sql_help.c:2078 sql_help.c:2108 +#: sql_help.c:2097 sql_help.c:2127 msgid "serialfunc" msgstr "シリアライズ関数" -#: sql_help.c:2079 sql_help.c:2109 +#: sql_help.c:2098 sql_help.c:2128 msgid "deserialfunc" msgstr "デシリアライズ関数" -#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110 +#: sql_help.c:2099 sql_help.c:2118 sql_help.c:2129 msgid "initial_condition" msgstr "åˆæœŸæ¡ä»¶" -#: sql_help.c:2081 sql_help.c:2111 +#: sql_help.c:2100 sql_help.c:2130 msgid "msfunc" msgstr "剿–¹çŠ¶æ…‹é·ç§»é–¢æ•°" -#: sql_help.c:2082 sql_help.c:2112 +#: sql_help.c:2101 sql_help.c:2131 msgid "minvfunc" msgstr "逆状態é·ç§»é–¢æ•°" -#: sql_help.c:2083 sql_help.c:2113 +#: sql_help.c:2102 sql_help.c:2132 msgid "mstate_data_type" msgstr "移動集約モード時ã®çŠ¶æ…‹å€¤ã®ãƒ‡ãƒ¼ã‚¿åž‹" -#: sql_help.c:2084 sql_help.c:2114 +#: sql_help.c:2103 sql_help.c:2133 msgid "mstate_data_size" msgstr "移動集約モード時ã®çŠ¶æ…‹å€¤ã®ãƒ‡ãƒ¼ã‚¿ã‚µã‚¤ã‚º" -#: sql_help.c:2085 sql_help.c:2115 +#: sql_help.c:2104 sql_help.c:2134 msgid "mffunc" msgstr "移動集約モード時ã®çµ‚了関数" -#: sql_help.c:2086 sql_help.c:2116 +#: sql_help.c:2105 sql_help.c:2135 msgid "minitial_condition" msgstr "移動集約モード時ã®åˆæœŸæ¡ä»¶" -#: sql_help.c:2087 sql_help.c:2117 +#: sql_help.c:2106 sql_help.c:2136 msgid "sort_operator" msgstr "ソート演算å­" -#: sql_help.c:2100 +#: sql_help.c:2119 msgid "or the old syntax" msgstr "ã¾ãŸã¯å¤ã„æ§‹æ–‡" -#: sql_help.c:2102 +#: sql_help.c:2121 msgid "base_type" msgstr "基本ã®åž‹" -#: sql_help.c:2160 sql_help.c:2209 +#: sql_help.c:2179 sql_help.c:2229 msgid "locale" msgstr "ロケール" -#: sql_help.c:2161 sql_help.c:2210 +#: sql_help.c:2180 sql_help.c:2230 msgid "lc_collate" msgstr "ç…§åˆé †åº" -#: sql_help.c:2162 sql_help.c:2211 +#: sql_help.c:2181 sql_help.c:2231 msgid "lc_ctype" msgstr "Ctype(å¤‰æ›æ¼”ç®—å­)" -#: sql_help.c:2163 sql_help.c:4463 +#: sql_help.c:2182 sql_help.c:4495 msgid "provider" msgstr "プロãƒã‚¤ãƒ€" -#: sql_help.c:2165 +#: sql_help.c:2184 msgid "rules" msgstr "ルール" -#: sql_help.c:2166 sql_help.c:2271 +#: sql_help.c:2185 sql_help.c:2292 msgid "version" msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³" -#: sql_help.c:2168 +#: sql_help.c:2187 msgid "existing_collation" msgstr "既存ã®ç…§åˆé †åº" -#: sql_help.c:2178 +#: sql_help.c:2197 msgid "source_encoding" msgstr "変æ›å…ƒã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°" -#: sql_help.c:2179 +#: sql_help.c:2198 msgid "dest_encoding" msgstr "変æ›å…ˆã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°" -#: sql_help.c:2206 sql_help.c:3047 +#: sql_help.c:2226 sql_help.c:3067 msgid "template" msgstr "テンプレート" -#: sql_help.c:2207 +#: sql_help.c:2227 msgid "encoding" msgstr "エンコード" -#: sql_help.c:2208 +#: sql_help.c:2228 msgid "strategy" msgstr "ストラテジ" -#: sql_help.c:2212 +#: sql_help.c:2232 +msgid "builtin_locale" +msgstr "組ã¿è¾¼ã¿ãƒ­ã‚±ãƒ¼ãƒ«" + +#: sql_help.c:2233 msgid "icu_locale" msgstr "ICUロケール" -#: sql_help.c:2213 +#: sql_help.c:2234 msgid "icu_rules" msgstr "ICUルール(群)" -#: sql_help.c:2214 +#: sql_help.c:2235 msgid "locale_provider" msgstr "ロケールプロãƒã‚¤ãƒ€" -#: sql_help.c:2215 +#: sql_help.c:2236 msgid "collation_version" msgstr "ç…§åˆé †åºãƒãƒ¼ã‚¸ãƒ§ãƒ³" -#: sql_help.c:2220 +#: sql_help.c:2241 msgid "oid" msgstr "オブジェクトID" -#: sql_help.c:2240 -msgid "constraint" -msgstr "制約æ¡ä»¶" - -#: sql_help.c:2241 -msgid "where constraint is:" -msgstr "制約æ¡ä»¶ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" - -#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120 +#: sql_help.c:2276 sql_help.c:2709 sql_help.c:3140 msgid "event" msgstr "イベント" -#: sql_help.c:2256 +#: sql_help.c:2277 msgid "filter_variable" msgstr "フィルター変数" -#: sql_help.c:2257 +#: sql_help.c:2278 msgid "filter_value" msgstr "フィルター値" -#: sql_help.c:2353 sql_help.c:2939 +#: sql_help.c:2374 sql_help.c:2956 msgid "where column_constraint is:" msgstr "カラム制約ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" -#: sql_help.c:2398 +#: sql_help.c:2419 msgid "rettype" msgstr "戻り値ã®åž‹" -#: sql_help.c:2400 +#: sql_help.c:2421 msgid "column_type" msgstr "列ã®åž‹" -#: sql_help.c:2409 sql_help.c:2612 +#: sql_help.c:2430 sql_help.c:2633 msgid "definition" msgstr "定義" -#: sql_help.c:2410 sql_help.c:2613 +#: sql_help.c:2431 sql_help.c:2634 msgid "obj_file" msgstr "オブジェクトファイルå" -#: sql_help.c:2411 sql_help.c:2614 +#: sql_help.c:2432 sql_help.c:2635 msgid "link_symbol" msgstr "リンクシンボル" -#: sql_help.c:2412 sql_help.c:2615 +#: sql_help.c:2433 sql_help.c:2636 msgid "sql_body" msgstr "SQL本体" -#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243 +#: sql_help.c:2471 sql_help.c:2694 sql_help.c:3263 msgid "uid" msgstr "UID" -#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921 -#: sql_help.c:2935 sql_help.c:3003 +#: sql_help.c:2487 sql_help.c:2528 sql_help.c:2925 sql_help.c:2938 +#: sql_help.c:2952 sql_help.c:3023 msgid "method" msgstr "インデックスメソッド" -#: sql_help.c:2471 -msgid "opclass_parameter" -msgstr "演算å­ã‚¯ãƒ©ã‚¹ãƒ‘ラメータ" - -#: sql_help.c:2488 +#: sql_help.c:2509 msgid "call_handler" msgstr "呼ã³å‡ºã—ãƒãƒ³ãƒ‰ãƒ©ãƒ¼" -#: sql_help.c:2489 +#: sql_help.c:2510 msgid "inline_handler" msgstr "インラインãƒãƒ³ãƒ‰ãƒ©ãƒ¼" -#: sql_help.c:2490 +#: sql_help.c:2511 msgid "valfunction" msgstr "ãƒãƒªãƒ‡ãƒ¼ã‚·ãƒ§ãƒ³é–¢æ•°" -#: sql_help.c:2529 -msgid "com_op" -msgstr "交代演算å­" - -#: sql_help.c:2530 -msgid "neg_op" -msgstr "å¦å®šæ¼”ç®—å­" - -#: sql_help.c:2548 +#: sql_help.c:2569 msgid "family_name" msgstr "æ¼”ç®—å­æ—ã®åå‰" -#: sql_help.c:2559 +#: sql_help.c:2580 msgid "storage_type" msgstr "ストレージタイプ" -#: sql_help.c:2698 sql_help.c:3127 +#: sql_help.c:2715 sql_help.c:3147 msgid "where event can be one of:" msgstr "イベントã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:" -#: sql_help.c:2718 sql_help.c:2720 +#: sql_help.c:2735 sql_help.c:2737 msgid "schema_element" msgstr "スキーマè¦ç´ " -#: sql_help.c:2757 +#: sql_help.c:2774 msgid "server_type" msgstr "サーãƒãƒ¼ã®ã‚¿ã‚¤ãƒ—" -#: sql_help.c:2758 +#: sql_help.c:2775 msgid "server_version" msgstr "サーãƒãƒ¼ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³" -#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360 +#: sql_help.c:2776 sql_help.c:3929 sql_help.c:4392 msgid "fdw_name" msgstr "外部データラッパå" -#: sql_help.c:2776 sql_help.c:2779 +#: sql_help.c:2793 sql_help.c:2796 msgid "statistics_name" msgstr "統計オブジェクトå" -#: sql_help.c:2780 +#: sql_help.c:2797 msgid "statistics_kind" msgstr "統計種別" -#: sql_help.c:2796 +#: sql_help.c:2813 msgid "subscription_name" msgstr "サブスクリプションå" -#: sql_help.c:2901 +#: sql_help.c:2918 msgid "source_table" msgstr "コピー元ã®ãƒ†ãƒ¼ãƒ–ル" -#: sql_help.c:2902 +#: sql_help.c:2919 msgid "like_option" msgstr "LIKEオプション" -#: sql_help.c:2968 +#: sql_help.c:2985 msgid "and like_option is:" msgstr "LIKE オプションã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:" -#: sql_help.c:3020 +#: sql_help.c:3040 msgid "directory" msgstr "ディレクトリ" -#: sql_help.c:3034 +#: sql_help.c:3054 msgid "parser_name" msgstr "パーサå" -#: sql_help.c:3035 +#: sql_help.c:3055 msgid "source_config" msgstr "複製元ã®è¨­å®š" -#: sql_help.c:3064 +#: sql_help.c:3084 msgid "start_function" msgstr "開始関数" -#: sql_help.c:3065 +#: sql_help.c:3085 msgid "gettoken_function" msgstr "トークンå–得関数" -#: sql_help.c:3066 +#: sql_help.c:3086 msgid "end_function" msgstr "終了関数" -#: sql_help.c:3067 +#: sql_help.c:3087 msgid "lextypes_function" msgstr "LEXTYPE関数" -#: sql_help.c:3068 +#: sql_help.c:3088 msgid "headline_function" msgstr "見出ã—関数" -#: sql_help.c:3080 +#: sql_help.c:3100 msgid "init_function" msgstr "åˆæœŸå‡¦ç†é–¢æ•°" -#: sql_help.c:3081 +#: sql_help.c:3101 msgid "lexize_function" msgstr "LEXIZE関数" -#: sql_help.c:3094 +#: sql_help.c:3114 msgid "from_sql_function_name" msgstr "{FROM SQL 関数å}" -#: sql_help.c:3096 +#: sql_help.c:3116 msgid "to_sql_function_name" msgstr "{TO SQL 関数å}" -#: sql_help.c:3122 +#: sql_help.c:3142 msgid "referenced_table_name" msgstr "被å‚照テーブルå" -#: sql_help.c:3123 +#: sql_help.c:3143 msgid "transition_relation_name" msgstr "移行用リレーションå" -#: sql_help.c:3126 +#: sql_help.c:3146 msgid "arguments" msgstr "引数" -#: sql_help.c:3178 +#: sql_help.c:3198 msgid "label" msgstr "ラベル" -#: sql_help.c:3180 +#: sql_help.c:3200 msgid "subtype" msgstr "当該範囲ã®ãƒ‡ãƒ¼ã‚¿åž‹" -#: sql_help.c:3181 +#: sql_help.c:3201 msgid "subtype_operator_class" msgstr "当該範囲ã®ãƒ‡ãƒ¼ã‚¿åž‹ã®æ¼”ç®—å­ã‚¯ãƒ©ã‚¹" -#: sql_help.c:3183 +#: sql_help.c:3203 msgid "canonical_function" msgstr "æ­£è¦åŒ–関数" -#: sql_help.c:3184 +#: sql_help.c:3204 msgid "subtype_diff_function" msgstr "当該範囲ã®ãƒ‡ãƒ¼ã‚¿åž‹ã®å·®åˆ†æŠ½å‡ºé–¢æ•°" -#: sql_help.c:3185 +#: sql_help.c:3205 msgid "multirange_type_name" msgstr "複範囲型å" -#: sql_help.c:3187 +#: sql_help.c:3207 msgid "input_function" msgstr "入力関数" -#: sql_help.c:3188 +#: sql_help.c:3208 msgid "output_function" msgstr "出力関数" -#: sql_help.c:3189 +#: sql_help.c:3209 msgid "receive_function" msgstr "å—信関数" -#: sql_help.c:3190 +#: sql_help.c:3210 msgid "send_function" msgstr "é€ä¿¡é–¢æ•°" -#: sql_help.c:3191 +#: sql_help.c:3211 msgid "type_modifier_input_function" msgstr "型修飾å­ã®å…¥åŠ›é–¢æ•°" -#: sql_help.c:3192 +#: sql_help.c:3212 msgid "type_modifier_output_function" msgstr "型修飾å­ã®å‡ºåŠ›é–¢æ•°" -#: sql_help.c:3193 +#: sql_help.c:3213 msgid "analyze_function" msgstr "分æžé–¢æ•°" -#: sql_help.c:3194 +#: sql_help.c:3214 msgid "subscript_function" msgstr "添字関数" -#: sql_help.c:3195 +#: sql_help.c:3215 msgid "internallength" msgstr "内部長" -#: sql_help.c:3196 +#: sql_help.c:3216 msgid "alignment" msgstr "ãƒã‚¤ãƒˆå¢ƒç•Œ" -#: sql_help.c:3197 +#: sql_help.c:3217 msgid "storage" msgstr "ストレージ" -#: sql_help.c:3198 +#: sql_help.c:3218 msgid "like_type" msgstr "LIKEã®åž‹" -#: sql_help.c:3199 +#: sql_help.c:3219 msgid "category" msgstr "カテゴリー" -#: sql_help.c:3200 +#: sql_help.c:3220 msgid "preferred" msgstr "優先データ型ã‹ã©ã†ã‹(真å½å€¤)" -#: sql_help.c:3201 +#: sql_help.c:3221 msgid "default" msgstr "デフォルト" -#: sql_help.c:3202 +#: sql_help.c:3222 msgid "element" msgstr "è¦ç´ ã®ãƒ‡ãƒ¼ã‚¿åž‹" -#: sql_help.c:3203 +#: sql_help.c:3223 msgid "delimiter" msgstr "区切り記å·" -#: sql_help.c:3204 +#: sql_help.c:3224 msgid "collatable" msgstr "ç…§åˆå¯èƒ½" -#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560 -#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063 +#: sql_help.c:3321 sql_help.c:4008 sql_help.c:4102 sql_help.c:4592 +#: sql_help.c:4695 sql_help.c:4850 sql_help.c:4964 sql_help.c:5095 msgid "with_query" msgstr "WITHå•ã„åˆã‚ã›" -#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585 -#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604 -#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849 -#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082 -#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099 -#: sql_help.c:5107 +#: sql_help.c:3323 sql_help.c:4010 sql_help.c:4611 sql_help.c:4617 +#: sql_help.c:4620 sql_help.c:4624 sql_help.c:4628 sql_help.c:4636 +#: sql_help.c:4869 sql_help.c:4875 sql_help.c:4878 sql_help.c:4882 +#: sql_help.c:4886 sql_help.c:4894 sql_help.c:4966 sql_help.c:5114 +#: sql_help.c:5120 sql_help.c:5123 sql_help.c:5127 sql_help.c:5131 +#: sql_help.c:5139 msgid "alias" msgstr "別å" -#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608 -#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616 -#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865 -#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873 -#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111 -#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119 +#: sql_help.c:3324 sql_help.c:4596 sql_help.c:4638 sql_help.c:4640 +#: sql_help.c:4644 sql_help.c:4646 sql_help.c:4647 sql_help.c:4648 +#: sql_help.c:4700 sql_help.c:4854 sql_help.c:4896 sql_help.c:4898 +#: sql_help.c:4902 sql_help.c:4904 sql_help.c:4905 sql_help.c:4906 +#: sql_help.c:4973 sql_help.c:5099 sql_help.c:5141 sql_help.c:5143 +#: sql_help.c:5147 sql_help.c:5149 sql_help.c:5150 sql_help.c:5151 msgid "from_item" msgstr "FROMé …ç›®" -#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941 +#: sql_help.c:3326 sql_help.c:3810 sql_help.c:4159 sql_help.c:4975 msgid "cursor_name" msgstr "カーソルå" -#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942 +#: sql_help.c:3327 sql_help.c:4016 sql_help.c:4108 sql_help.c:4976 msgid "output_expression" msgstr "出力表ç¾" -#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665 -#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066 +#: sql_help.c:3328 sql_help.c:4017 sql_help.c:4109 sql_help.c:4595 +#: sql_help.c:4698 sql_help.c:4853 sql_help.c:4977 sql_help.c:5098 msgid "output_name" msgstr "出力å" -#: sql_help.c:3324 +#: sql_help.c:3344 msgid "code" msgstr "コードブロック" -#: sql_help.c:3729 +#: sql_help.c:3749 msgid "parameter" msgstr "パラメータ" -#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152 +#: sql_help.c:3773 sql_help.c:4184 msgid "statement" msgstr "æ–‡" -#: sql_help.c:3788 sql_help.c:4126 +#: sql_help.c:3809 sql_help.c:4158 msgid "direction" msgstr "æ–¹å‘" -#: sql_help.c:3790 sql_help.c:4128 +#: sql_help.c:3811 sql_help.c:4160 msgid "where direction can be one of:" msgstr "æ–¹å‘ ã¯ä»¥ä¸‹ã®ã†ã¡ã®ã„ãšã‚Œã‹:" -#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794 -#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131 -#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575 -#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832 -#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078 +#: sql_help.c:3812 sql_help.c:3813 sql_help.c:3814 sql_help.c:3815 +#: sql_help.c:3816 sql_help.c:4161 sql_help.c:4162 sql_help.c:4163 +#: sql_help.c:4164 sql_help.c:4165 sql_help.c:4605 sql_help.c:4607 +#: sql_help.c:4709 sql_help.c:4711 sql_help.c:4863 sql_help.c:4865 +#: sql_help.c:5039 sql_help.c:5041 sql_help.c:5108 sql_help.c:5110 msgid "count" msgstr "å–り出ã™ä½ç½®ã‚„行数" -#: sql_help.c:3898 sql_help.c:4350 +#: sql_help.c:3919 sql_help.c:4382 msgid "sequence_name" msgstr "シーケンスå" -#: sql_help.c:3916 sql_help.c:4368 +#: sql_help.c:3937 sql_help.c:4400 msgid "arg_name" msgstr "引数å" -#: sql_help.c:3917 sql_help.c:4369 +#: sql_help.c:3938 sql_help.c:4401 msgid "arg_type" msgstr "引数ã®åž‹" -#: sql_help.c:3924 sql_help.c:4376 +#: sql_help.c:3945 sql_help.c:4408 msgid "loid" msgstr "ラージオブジェクトid" -#: sql_help.c:3955 +#: sql_help.c:3976 msgid "remote_schema" msgstr "リモートスキーマ" -#: sql_help.c:3958 +#: sql_help.c:3979 msgid "local_schema" msgstr "ローカルスキーマ" -#: sql_help.c:3993 +#: sql_help.c:4014 msgid "conflict_target" msgstr "ç«¶åˆã‚¿ãƒ¼ã‚²ãƒƒãƒˆ" -#: sql_help.c:3994 +#: sql_help.c:4015 msgid "conflict_action" msgstr "ç«¶åˆæ™‚アクション" -#: sql_help.c:3997 +#: sql_help.c:4018 msgid "where conflict_target can be one of:" msgstr "ç«¶åˆã‚¿ãƒ¼ã‚²ãƒƒãƒˆã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:" -#: sql_help.c:3998 +#: sql_help.c:4019 msgid "index_column_name" msgstr "インデックスã®ã‚«ãƒ©ãƒ å" -#: sql_help.c:3999 +#: sql_help.c:4020 msgid "index_expression" msgstr "インデックス表ç¾" -#: sql_help.c:4002 +#: sql_help.c:4023 msgid "index_predicate" msgstr "インデックスã®è¿°èªž" -#: sql_help.c:4004 +#: sql_help.c:4025 msgid "and conflict_action is one of:" msgstr "ç«¶åˆæ™‚アクションã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:" -#: sql_help.c:4010 sql_help.c:4938 +#: sql_help.c:4031 sql_help.c:4132 sql_help.c:4972 msgid "sub-SELECT" msgstr "副å•ã„åˆã‚ã›å¥" -#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914 +#: sql_help.c:4040 sql_help.c:4173 sql_help.c:4948 msgid "channel" msgstr "ãƒãƒ£ãƒãƒ«" -#: sql_help.c:4041 +#: sql_help.c:4062 msgid "lockmode" msgstr "ロックモード" -#: sql_help.c:4042 +#: sql_help.c:4063 msgid "where lockmode is one of:" msgstr "ロックモードã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:" -#: sql_help.c:4078 +#: sql_help.c:4103 msgid "target_table_name" msgstr "ターゲットテーブルå" -#: sql_help.c:4079 +#: sql_help.c:4104 msgid "target_alias" msgstr "ターゲット別å" -#: sql_help.c:4080 +#: sql_help.c:4105 msgid "data_source" msgstr "データæº" -#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112 +#: sql_help.c:4106 sql_help.c:4641 sql_help.c:4899 sql_help.c:5144 msgid "join_condition" msgstr "JOINæ¡ä»¶" -#: sql_help.c:4082 +#: sql_help.c:4107 msgid "when_clause" msgstr "WHENå¥" -#: sql_help.c:4083 +#: sql_help.c:4110 msgid "where data_source is:" msgstr "ã“ã“ã§\"データæº\"ã¯ä»¥ä¸‹ã®é€šã‚Š:" -#: sql_help.c:4084 +#: sql_help.c:4111 msgid "source_table_name" msgstr "データæºãƒ†ãƒ¼ãƒ–ルå" -#: sql_help.c:4085 +#: sql_help.c:4112 msgid "source_query" msgstr "データæºå•ã„åˆã‚ã›" -#: sql_help.c:4086 +#: sql_help.c:4113 msgid "source_alias" msgstr "データæºåˆ¥å" -#: sql_help.c:4087 +#: sql_help.c:4114 msgid "and when_clause is:" msgstr "WHENå¥ã¯ä»¥ä¸‹ã®é€šã‚Š:" -#: sql_help.c:4089 +#: sql_help.c:4116 sql_help.c:4119 msgid "merge_update" msgstr "マージ更新" -#: sql_help.c:4090 +#: sql_help.c:4117 sql_help.c:4120 msgid "merge_delete" msgstr "マージ削除" -#: sql_help.c:4092 +#: sql_help.c:4122 msgid "merge_insert" msgstr "マージ挿入" -#: sql_help.c:4093 +#: sql_help.c:4123 msgid "and merge_insert is:" msgstr "ãã—ã¦\"マージ挿入\"ã¯ä»¥ä¸‹ã®é€šã‚Š:" -#: sql_help.c:4096 +#: sql_help.c:4126 msgid "and merge_update is:" msgstr "ãã—ã¦\"マージ更新\"ã¯ä»¥ä¸‹ã®é€šã‚Š:" -#: sql_help.c:4101 +#: sql_help.c:4133 msgid "and merge_delete is:" msgstr "ãã—ã¦\"マージ削除\"ã¯ä»¥ä¸‹ã®é€šã‚Š:" -#: sql_help.c:4142 +#: sql_help.c:4174 msgid "payload" msgstr "ペイロード" -#: sql_help.c:4169 +#: sql_help.c:4201 msgid "old_role" msgstr "å…ƒã®ãƒ­ãƒ¼ãƒ«" -#: sql_help.c:4170 +#: sql_help.c:4202 msgid "new_role" msgstr "æ–°ã—ã„ロール" -#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426 +#: sql_help.c:4241 sql_help.c:4450 sql_help.c:4458 msgid "savepoint_name" msgstr "セーブãƒã‚¤ãƒ³ãƒˆå" -#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881 -#: sql_help.c:5069 sql_help.c:5127 +#: sql_help.c:4598 sql_help.c:4656 sql_help.c:4856 sql_help.c:4914 +#: sql_help.c:5101 sql_help.c:5159 msgid "grouping_element" msgstr "グルーピングè¦ç´ " -#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071 +#: sql_help.c:4600 sql_help.c:4704 sql_help.c:4858 sql_help.c:5103 msgid "window_name" msgstr "ウィンドウå" -#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072 +#: sql_help.c:4601 sql_help.c:4705 sql_help.c:4859 sql_help.c:5104 msgid "window_definition" msgstr "ウィンドウ定義" -#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673 -#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073 -#: sql_help.c:5087 sql_help.c:5131 +#: sql_help.c:4602 sql_help.c:4616 sql_help.c:4660 sql_help.c:4706 +#: sql_help.c:4860 sql_help.c:4874 sql_help.c:4918 sql_help.c:5105 +#: sql_help.c:5119 sql_help.c:5163 msgid "select" msgstr "SELECTå¥" -#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080 +#: sql_help.c:4608 sql_help.c:4866 sql_help.c:5111 +msgid "from_reference" +msgstr "FROMå‚ç…§" + +#: sql_help.c:4609 sql_help.c:4867 sql_help.c:5112 msgid "where from_item can be one of:" msgstr "FROMé …ç›®ã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:" -#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593 -#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846 -#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089 -#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108 +#: sql_help.c:4612 sql_help.c:4618 sql_help.c:4621 sql_help.c:4625 +#: sql_help.c:4637 sql_help.c:4870 sql_help.c:4876 sql_help.c:4879 +#: sql_help.c:4883 sql_help.c:4895 sql_help.c:5115 sql_help.c:5121 +#: sql_help.c:5124 sql_help.c:5128 sql_help.c:5140 msgid "column_alias" msgstr "列別å" -#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084 +#: sql_help.c:4613 sql_help.c:4871 sql_help.c:5116 msgid "sampling_method" msgstr "サンプリングメソッド" -#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086 +#: sql_help.c:4615 sql_help.c:4873 sql_help.c:5118 msgid "seed" msgstr "乱数シード" -#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883 -#: sql_help.c:5090 sql_help.c:5129 +#: sql_help.c:4619 sql_help.c:4658 sql_help.c:4877 sql_help.c:4916 +#: sql_help.c:5122 sql_help.c:5161 msgid "with_query_name" msgstr "WITHå•ã„åˆã‚ã›å" -#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854 -#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103 -#: sql_help.c:5106 +#: sql_help.c:4629 sql_help.c:4632 sql_help.c:4635 sql_help.c:4887 +#: sql_help.c:4890 sql_help.c:4893 sql_help.c:5132 sql_help.c:5135 +#: sql_help.c:5138 msgid "column_definition" msgstr "カラム定義" -#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870 -#: sql_help.c:5110 sql_help.c:5116 +#: sql_help.c:4639 sql_help.c:4645 sql_help.c:4897 sql_help.c:4903 +#: sql_help.c:5142 sql_help.c:5148 msgid "join_type" msgstr "JOINタイプ" -#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113 +#: sql_help.c:4642 sql_help.c:4900 sql_help.c:5145 msgid "join_column" msgstr "JOINカラム" -#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114 +#: sql_help.c:4643 sql_help.c:4901 sql_help.c:5146 msgid "join_using_alias" msgstr "JOIN用別å" -#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120 +#: sql_help.c:4649 sql_help.c:4907 sql_help.c:5152 msgid "and grouping_element can be one of:" msgstr "グルーピングè¦ç´ ã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:" -#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128 +#: sql_help.c:4657 sql_help.c:4915 sql_help.c:5160 msgid "and with_query is:" msgstr "WITHå•ã„åˆã‚ã›ã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã§ã™:" -#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132 +#: sql_help.c:4661 sql_help.c:4919 sql_help.c:5164 msgid "values" msgstr "VALUESå¥" -#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133 +#: sql_help.c:4662 sql_help.c:4920 sql_help.c:5165 msgid "insert" msgstr "INSERTå¥" -#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134 +#: sql_help.c:4663 sql_help.c:4921 sql_help.c:5166 msgid "update" msgstr "UPDATEå¥" -#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135 +#: sql_help.c:4664 sql_help.c:4922 sql_help.c:5167 msgid "delete" msgstr "DELETEå¥" -#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137 +#: sql_help.c:4665 sql_help.c:4923 sql_help.c:5168 +msgid "merge" +msgstr "MERGEå¥" + +#: sql_help.c:4667 sql_help.c:4925 sql_help.c:5170 msgid "search_seq_col_name" msgstr "SEARCHé †åºåˆ—å" -#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139 +#: sql_help.c:4669 sql_help.c:4927 sql_help.c:5172 msgid "cycle_mark_col_name" msgstr "循環識別列å" -#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140 +#: sql_help.c:4670 sql_help.c:4928 sql_help.c:5173 msgid "cycle_mark_value" msgstr "循環識別値" -#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141 +#: sql_help.c:4671 sql_help.c:4929 sql_help.c:5174 msgid "cycle_mark_default" msgstr "循環識別デフォルト" -#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142 +#: sql_help.c:4672 sql_help.c:4930 sql_help.c:5175 msgid "cycle_path_col_name" msgstr "循環パス列å" -#: sql_help.c:4666 +#: sql_help.c:4699 msgid "new_table" msgstr "æ–°ã—ã„テーブル" -#: sql_help.c:4737 +#: sql_help.c:4770 msgid "snapshot_id" msgstr "スナップショットID" -#: sql_help.c:5005 +#: sql_help.c:5037 msgid "sort_expression" msgstr "ソート表ç¾" -#: sql_help.c:5149 sql_help.c:6133 +#: sql_help.c:5182 sql_help.c:6166 msgid "abort the current transaction" msgstr "ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’中止ã—ã¾ã™" -#: sql_help.c:5155 +#: sql_help.c:5188 msgid "change the definition of an aggregate function" msgstr "集約関数ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5161 +#: sql_help.c:5194 msgid "change the definition of a collation" msgstr "ç…§åˆé †åºã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5167 +#: sql_help.c:5200 msgid "change the definition of a conversion" msgstr "エンコーディング変æ›ãƒ«ãƒ¼ãƒ«ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5173 +#: sql_help.c:5206 msgid "change a database" msgstr "データベースを変更ã—ã¾ã™" -#: sql_help.c:5179 +#: sql_help.c:5212 msgid "define default access privileges" msgstr "デフォルトã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©é™ã‚’定義ã—ã¾ã™" -#: sql_help.c:5185 +#: sql_help.c:5218 msgid "change the definition of a domain" msgstr "ドメインã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5191 +#: sql_help.c:5224 msgid "change the definition of an event trigger" msgstr "イベントトリガーã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5197 +#: sql_help.c:5230 msgid "change the definition of an extension" msgstr "機能拡張ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5203 +#: sql_help.c:5236 msgid "change the definition of a foreign-data wrapper" msgstr "外部データラッパã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5209 +#: sql_help.c:5242 msgid "change the definition of a foreign table" msgstr "外部テーブルã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5215 +#: sql_help.c:5248 msgid "change the definition of a function" msgstr "関数ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5221 +#: sql_help.c:5254 msgid "change role name or membership" msgstr "ロールåã¾ãŸã¯ãƒ¡ãƒ³ãƒãƒ¼ã‚·ãƒƒãƒ—を変更ã—ã¾ã™" -#: sql_help.c:5227 +#: sql_help.c:5260 msgid "change the definition of an index" msgstr "インデックスã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5233 +#: sql_help.c:5266 msgid "change the definition of a procedural language" msgstr "手続ã言語ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5239 +#: sql_help.c:5272 msgid "change the definition of a large object" msgstr "ラージオブジェクトã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5245 +#: sql_help.c:5278 msgid "change the definition of a materialized view" msgstr "実体化ビューã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5251 +#: sql_help.c:5284 msgid "change the definition of an operator" msgstr "演算å­ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5257 +#: sql_help.c:5290 msgid "change the definition of an operator class" msgstr "演算å­ã‚¯ãƒ©ã‚¹ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5263 +#: sql_help.c:5296 msgid "change the definition of an operator family" msgstr "æ¼”ç®—å­æ—ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5269 +#: sql_help.c:5302 msgid "change the definition of a row-level security policy" msgstr "行レベルã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ ãƒãƒªã‚·ãƒ¼ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5275 +#: sql_help.c:5308 msgid "change the definition of a procedure" msgstr "プロシージャã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5281 +#: sql_help.c:5314 msgid "change the definition of a publication" msgstr "パブリケーションã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5287 sql_help.c:5389 +#: sql_help.c:5320 sql_help.c:5422 msgid "change a database role" msgstr "データベースロールを変更ã—ã¾ã™" -#: sql_help.c:5293 +#: sql_help.c:5326 msgid "change the definition of a routine" msgstr "ルーãƒãƒ³ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5299 +#: sql_help.c:5332 msgid "change the definition of a rule" msgstr "ルールã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5305 +#: sql_help.c:5338 msgid "change the definition of a schema" msgstr "スキーマã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5311 +#: sql_help.c:5344 msgid "change the definition of a sequence generator" msgstr "シーケンス生æˆå™¨ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5317 +#: sql_help.c:5350 msgid "change the definition of a foreign server" msgstr "外部サーãƒãƒ¼ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5323 +#: sql_help.c:5356 msgid "change the definition of an extended statistics object" msgstr "拡張統計情報オブジェクトã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5329 +#: sql_help.c:5362 msgid "change the definition of a subscription" msgstr "サブスクリプションã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5335 +#: sql_help.c:5368 msgid "change a server configuration parameter" msgstr "サーãƒãƒ¼ã®è¨­å®šãƒ‘ラメータを変更ã—ã¾ã™" -#: sql_help.c:5341 +#: sql_help.c:5374 msgid "change the definition of a table" msgstr "テーブルã®å®šç¾©ã‚’変更ã—ã¾ã™ã€‚" -#: sql_help.c:5347 +#: sql_help.c:5380 msgid "change the definition of a tablespace" msgstr "テーブル空間ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5353 +#: sql_help.c:5386 msgid "change the definition of a text search configuration" msgstr "テキスト検索設定ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5359 +#: sql_help.c:5392 msgid "change the definition of a text search dictionary" msgstr "テキスト検索辞書ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5365 +#: sql_help.c:5398 msgid "change the definition of a text search parser" msgstr "テキスト検索パーサーã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5371 +#: sql_help.c:5404 msgid "change the definition of a text search template" msgstr "テキスト検索テンプレートã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5377 +#: sql_help.c:5410 msgid "change the definition of a trigger" msgstr "トリガーã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5383 +#: sql_help.c:5416 msgid "change the definition of a type" msgstr "åž‹ã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5395 +#: sql_help.c:5428 msgid "change the definition of a user mapping" msgstr "ユーザーマッピングã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5401 +#: sql_help.c:5434 msgid "change the definition of a view" msgstr "ビューã®å®šç¾©ã‚’変更ã—ã¾ã™" -#: sql_help.c:5407 +#: sql_help.c:5440 msgid "collect statistics about a database" msgstr "データベースã®çµ±è¨ˆæƒ…報をåŽé›†ã—ã¾ã™" -#: sql_help.c:5413 sql_help.c:6211 +#: sql_help.c:5446 sql_help.c:6244 msgid "start a transaction block" msgstr "トランザクション区間を開始ã—ã¾ã™" -#: sql_help.c:5419 +#: sql_help.c:5452 msgid "invoke a procedure" msgstr "プロシージャを実行ã—ã¾ã™" -#: sql_help.c:5425 +#: sql_help.c:5458 msgid "force a write-ahead log checkpoint" msgstr "先行書ãè¾¼ã¿ãƒ­ã‚°ã®ãƒã‚§ãƒƒã‚¯ãƒã‚¤ãƒ³ãƒˆã‚’強制的ã«å®Ÿè¡Œã—ã¾ã™" -#: sql_help.c:5431 +#: sql_help.c:5464 msgid "close a cursor" msgstr "カーソルを閉ã˜ã¾ã™" -#: sql_help.c:5437 +#: sql_help.c:5470 msgid "cluster a table according to an index" msgstr "インデックスã«å¾“ã£ã¦ãƒ†ãƒ¼ãƒ–ルをクラスタ化ã—ã¾ã™" -#: sql_help.c:5443 +#: sql_help.c:5476 msgid "define or change the comment of an object" msgstr "オブジェクトã®ã‚³ãƒ¡ãƒ³ãƒˆã‚’定義ã¾ãŸã¯å¤‰æ›´ã—ã¾ã™" -#: sql_help.c:5449 sql_help.c:6007 +#: sql_help.c:5482 sql_help.c:6040 msgid "commit the current transaction" msgstr "ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’コミットã—ã¾ã™" -#: sql_help.c:5455 +#: sql_help.c:5488 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "二相コミットã®ãŸã‚ã«äº‹å‰ã«æº–å‚™ã•れãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’コミットã—ã¾ã™" -#: sql_help.c:5461 +#: sql_help.c:5494 msgid "copy data between a file and a table" msgstr "ファイルã¨ãƒ†ãƒ¼ãƒ–ルã¨ã®é–“ã§ãƒ‡ãƒ¼ã‚¿ã‚’コピーã—ã¾ã™" -#: sql_help.c:5467 +#: sql_help.c:5500 msgid "define a new access method" msgstr "æ–°ã—ã„アクセスメソッドを定義ã—ã¾ã™" -#: sql_help.c:5473 +#: sql_help.c:5506 msgid "define a new aggregate function" msgstr "æ–°ã—ã„集約関数を定義ã—ã¾ã™" -#: sql_help.c:5479 +#: sql_help.c:5512 msgid "define a new cast" msgstr "æ–°ã—ã„型変æ›ã‚’定義ã—ã¾ã™" -#: sql_help.c:5485 +#: sql_help.c:5518 msgid "define a new collation" msgstr "æ–°ã—ã„ç…§åˆé †åºã‚’定義ã—ã¾ã™" -#: sql_help.c:5491 +#: sql_help.c:5524 msgid "define a new encoding conversion" msgstr "æ–°ã—ã„エンコーディング変æ›ã‚’定義ã—ã¾ã™" -#: sql_help.c:5497 +#: sql_help.c:5530 msgid "create a new database" msgstr "æ–°ã—ã„データベースを作æˆã—ã¾ã™" -#: sql_help.c:5503 +#: sql_help.c:5536 msgid "define a new domain" msgstr "æ–°ã—ã„ドメインを定義ã—ã¾ã™" -#: sql_help.c:5509 +#: sql_help.c:5542 msgid "define a new event trigger" msgstr "æ–°ã—ã„イベントトリガーを定義ã—ã¾ã™" -#: sql_help.c:5515 +#: sql_help.c:5548 msgid "install an extension" msgstr "機能拡張をインストールã—ã¾ã™" -#: sql_help.c:5521 +#: sql_help.c:5554 msgid "define a new foreign-data wrapper" msgstr "æ–°ã—ã„外部データラッパを定義ã—ã¾ã™" -#: sql_help.c:5527 +#: sql_help.c:5560 msgid "define a new foreign table" msgstr "æ–°ã—ã„外部テーブルを定義ã—ã¾ã™" -#: sql_help.c:5533 +#: sql_help.c:5566 msgid "define a new function" msgstr "æ–°ã—ã„関数を定義ã—ã¾ã™" -#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701 +#: sql_help.c:5572 sql_help.c:5632 sql_help.c:5734 msgid "define a new database role" msgstr "æ–°ã—ã„データベースロールを定義ã—ã¾ã™" -#: sql_help.c:5545 +#: sql_help.c:5578 msgid "define a new index" msgstr "æ–°ã—ã„インデックスを定義ã—ã¾ã™" -#: sql_help.c:5551 +#: sql_help.c:5584 msgid "define a new procedural language" msgstr "æ–°ã—ã„æ‰‹ç¶šã言語を定義ã—ã¾ã™" -#: sql_help.c:5557 +#: sql_help.c:5590 msgid "define a new materialized view" msgstr "æ–°ã—ã„実体化ビューを定義ã—ã¾ã™" -#: sql_help.c:5563 +#: sql_help.c:5596 msgid "define a new operator" msgstr "æ–°ã—ã„æ¼”ç®—å­ã‚’定義ã—ã¾ã™" -#: sql_help.c:5569 +#: sql_help.c:5602 msgid "define a new operator class" msgstr "æ–°ã—ã„æ¼”ç®—å­ã‚¯ãƒ©ã‚¹ã‚’定義ã—ã¾ã™" -#: sql_help.c:5575 +#: sql_help.c:5608 msgid "define a new operator family" msgstr "æ–°ã—ã„æ¼”ç®—å­æ—を定義ã—ã¾ã™" -#: sql_help.c:5581 +#: sql_help.c:5614 msgid "define a new row-level security policy for a table" msgstr "テーブルã«å¯¾ã—ã¦æ–°ã—ã„行レベルセキュリティãƒãƒªã‚·ãƒ¼ã‚’定義ã—ã¾ã™" -#: sql_help.c:5587 +#: sql_help.c:5620 msgid "define a new procedure" msgstr "æ–°ã—ã„プロシージャを定義ã—ã¾ã™" -#: sql_help.c:5593 +#: sql_help.c:5626 msgid "define a new publication" msgstr "æ–°ã—ã„パブリケーションを定義ã—ã¾ã™" -#: sql_help.c:5605 +#: sql_help.c:5638 msgid "define a new rewrite rule" msgstr "æ–°ã—ã„æ›¸ãæ›ãˆãƒ«ãƒ¼ãƒ«ã‚’定義ã—ã¾ã™" -#: sql_help.c:5611 +#: sql_help.c:5644 msgid "define a new schema" msgstr "æ–°ã—ã„スキーマを定義ã—ã¾ã™" -#: sql_help.c:5617 +#: sql_help.c:5650 msgid "define a new sequence generator" msgstr "æ–°ã—ã„シーケンス生æˆå™¨ã‚’定義ã—ã¾ã™ã€‚" -#: sql_help.c:5623 +#: sql_help.c:5656 msgid "define a new foreign server" msgstr "æ–°ã—ã„外部サーãƒãƒ¼ã‚’定義ã—ã¾ã™" -#: sql_help.c:5629 +#: sql_help.c:5662 msgid "define extended statistics" msgstr "拡張統計情報を定義ã—ã¾ã™" -#: sql_help.c:5635 +#: sql_help.c:5668 msgid "define a new subscription" msgstr "æ–°ã—ã„サブスクリプションを定義ã—ã¾ã™" -#: sql_help.c:5641 +#: sql_help.c:5674 msgid "define a new table" msgstr "æ–°ã—ã„テーブルを定義ã—ã¾ã™" -#: sql_help.c:5647 sql_help.c:6169 +#: sql_help.c:5680 sql_help.c:6202 msgid "define a new table from the results of a query" msgstr "å•ã„åˆã‚ã›ã®çµæžœã‹ã‚‰æ–°ã—ã„テーブルを定義ã—ã¾ã™" -#: sql_help.c:5653 +#: sql_help.c:5686 msgid "define a new tablespace" msgstr "æ–°ã—ã„テーブル空間を定義ã—ã¾ã™" -#: sql_help.c:5659 +#: sql_help.c:5692 msgid "define a new text search configuration" msgstr "æ–°ã—ã„テキスト検索設定を定義ã—ã¾ã™" -#: sql_help.c:5665 +#: sql_help.c:5698 msgid "define a new text search dictionary" msgstr "æ–°ã—ã„テキスト検索辞書を定義ã—ã¾ã™" -#: sql_help.c:5671 +#: sql_help.c:5704 msgid "define a new text search parser" msgstr "æ–°ã—ã„テキスト検索パーサーを定義ã—ã¾ã™" -#: sql_help.c:5677 +#: sql_help.c:5710 msgid "define a new text search template" msgstr "æ–°ã—ã„テキスト検索テンプレートを定義ã—ã¾ã™" -#: sql_help.c:5683 +#: sql_help.c:5716 msgid "define a new transform" msgstr "æ–°ã—ã„データ変æ›ã‚’定義ã—ã¾ã™" -#: sql_help.c:5689 +#: sql_help.c:5722 msgid "define a new trigger" msgstr "æ–°ã—ã„トリガーを定義ã—ã¾ã™" -#: sql_help.c:5695 +#: sql_help.c:5728 msgid "define a new data type" msgstr "æ–°ã—ã„データ型を定義ã—ã¾ã™" -#: sql_help.c:5707 +#: sql_help.c:5740 msgid "define a new mapping of a user to a foreign server" msgstr "外部サーãƒãƒ¼ã«å¯¾ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®æ–°ã—ã„マッピングを定義ã—ã¾ã™ã€‚" -#: sql_help.c:5713 +#: sql_help.c:5746 msgid "define a new view" msgstr "æ–°ã—ã„ビューを定義ã—ã¾ã™" -#: sql_help.c:5719 +#: sql_help.c:5752 msgid "deallocate a prepared statement" msgstr "準備ã—ãŸæ–‡ã‚’解放ã—ã¾ã™" -#: sql_help.c:5725 +#: sql_help.c:5758 msgid "define a cursor" msgstr "カーソルを定義ã—ã¾ã™" -#: sql_help.c:5731 +#: sql_help.c:5764 msgid "delete rows of a table" msgstr "テーブルã®è¡Œã‚’削除ã—ã¾ã™" -#: sql_help.c:5737 +#: sql_help.c:5770 msgid "discard session state" msgstr "セッション状態を破棄ã—ã¾ã™" -#: sql_help.c:5743 +#: sql_help.c:5776 msgid "execute an anonymous code block" msgstr "ç„¡åコードブロックを実行ã—ã¾ã™" -#: sql_help.c:5749 +#: sql_help.c:5782 msgid "remove an access method" msgstr "アクセスメソッドを削除ã—ã¾ã™" -#: sql_help.c:5755 +#: sql_help.c:5788 msgid "remove an aggregate function" msgstr "集約関数を削除ã—ã¾ã™" -#: sql_help.c:5761 +#: sql_help.c:5794 msgid "remove a cast" msgstr "型変æ›ã‚’削除ã—ã¾ã™" -#: sql_help.c:5767 +#: sql_help.c:5800 msgid "remove a collation" msgstr "ç…§åˆé †åºã‚’削除ã—ã¾ã™" -#: sql_help.c:5773 +#: sql_help.c:5806 msgid "remove a conversion" msgstr "符å·åŒ–æ–¹å¼å¤‰æ›ã‚’削除ã—ã¾ã™" -#: sql_help.c:5779 +#: sql_help.c:5812 msgid "remove a database" msgstr "データベースを削除ã—ã¾ã™" -#: sql_help.c:5785 +#: sql_help.c:5818 msgid "remove a domain" msgstr "ドメインを削除ã—ã¾ã™" -#: sql_help.c:5791 +#: sql_help.c:5824 msgid "remove an event trigger" msgstr "イベントトリガーを削除ã—ã¾ã™" -#: sql_help.c:5797 +#: sql_help.c:5830 msgid "remove an extension" msgstr "機能拡張を削除ã—ã¾ã™" -#: sql_help.c:5803 +#: sql_help.c:5836 msgid "remove a foreign-data wrapper" msgstr "外部データラッパを削除ã—ã¾ã™" -#: sql_help.c:5809 +#: sql_help.c:5842 msgid "remove a foreign table" msgstr "外部テーブルを削除ã—ã¾ã™" -#: sql_help.c:5815 +#: sql_help.c:5848 msgid "remove a function" msgstr "関数を削除ã—ã¾ã™" -#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989 +#: sql_help.c:5854 sql_help.c:5920 sql_help.c:6022 msgid "remove a database role" msgstr "データベースロールを削除ã—ã¾ã™" -#: sql_help.c:5827 +#: sql_help.c:5860 msgid "remove an index" msgstr "インデックスを削除ã—ã¾ã™" -#: sql_help.c:5833 +#: sql_help.c:5866 msgid "remove a procedural language" msgstr "手続ã言語を削除ã—ã¾ã™" -#: sql_help.c:5839 +#: sql_help.c:5872 msgid "remove a materialized view" msgstr "実体化ビューを削除ã—ã¾ã™" -#: sql_help.c:5845 +#: sql_help.c:5878 msgid "remove an operator" msgstr "演算å­ã‚’削除ã—ã¾ã™" -#: sql_help.c:5851 +#: sql_help.c:5884 msgid "remove an operator class" msgstr "演算å­ã‚¯ãƒ©ã‚¹ã‚’削除ã—ã¾ã™" -#: sql_help.c:5857 +#: sql_help.c:5890 msgid "remove an operator family" msgstr "æ¼”ç®—å­æ—を削除ã—ã¾ã™" -#: sql_help.c:5863 +#: sql_help.c:5896 msgid "remove database objects owned by a database role" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ­ãƒ¼ãƒ«ãŒæ‰€æœ‰ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚ªãƒ–ジェクトを削除ã—ã¾ã™" -#: sql_help.c:5869 +#: sql_help.c:5902 msgid "remove a row-level security policy from a table" msgstr "テーブルã‹ã‚‰è¡Œãƒ¬ãƒ™ãƒ«ã®ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£ãƒãƒªã‚·ãƒ¼ã‚’削除ã—ã¾ã™" -#: sql_help.c:5875 +#: sql_help.c:5908 msgid "remove a procedure" msgstr "プロシージャを削除ã—ã¾ã™" -#: sql_help.c:5881 +#: sql_help.c:5914 msgid "remove a publication" msgstr "パブリケーションを削除ã—ã¾ã™" -#: sql_help.c:5893 +#: sql_help.c:5926 msgid "remove a routine" msgstr "ルーãƒãƒ³ã‚’削除ã—ã¾ã™" -#: sql_help.c:5899 +#: sql_help.c:5932 msgid "remove a rewrite rule" msgstr "æ›¸ãæ›ãˆãƒ«ãƒ¼ãƒ«ã‚’削除ã—ã¾ã™" -#: sql_help.c:5905 +#: sql_help.c:5938 msgid "remove a schema" msgstr "スキーマを削除ã—ã¾ã™" -#: sql_help.c:5911 +#: sql_help.c:5944 msgid "remove a sequence" msgstr "シーケンスを削除ã—ã¾ã™" -#: sql_help.c:5917 +#: sql_help.c:5950 msgid "remove a foreign server descriptor" msgstr "外部サーãƒãƒ¼è¨˜è¿°å­ã‚’削除ã—ã¾ã™" -#: sql_help.c:5923 +#: sql_help.c:5956 msgid "remove extended statistics" msgstr "拡張統計情報を削除ã—ã¾ã™" -#: sql_help.c:5929 +#: sql_help.c:5962 msgid "remove a subscription" msgstr "サブスクリプションを削除ã—ã¾ã™" -#: sql_help.c:5935 +#: sql_help.c:5968 msgid "remove a table" msgstr "テーブルを削除ã—ã¾ã™" -#: sql_help.c:5941 +#: sql_help.c:5974 msgid "remove a tablespace" msgstr "テーブル空間を削除ã—ã¾ã™" -#: sql_help.c:5947 +#: sql_help.c:5980 msgid "remove a text search configuration" msgstr "テキスト検索設定を削除ã—ã¾ã™" -#: sql_help.c:5953 +#: sql_help.c:5986 msgid "remove a text search dictionary" msgstr "テキスト検索辞書を削除ã—ã¾ã™" -#: sql_help.c:5959 +#: sql_help.c:5992 msgid "remove a text search parser" msgstr "テキスト検索パーサーを削除ã—ã¾ã™" -#: sql_help.c:5965 +#: sql_help.c:5998 msgid "remove a text search template" msgstr "テキスト検索テンプレートを削除ã—ã¾ã™" -#: sql_help.c:5971 +#: sql_help.c:6004 msgid "remove a transform" msgstr "データ変æ›ã‚’削除ã—ã¾ã™" -#: sql_help.c:5977 +#: sql_help.c:6010 msgid "remove a trigger" msgstr "トリガーを削除ã—ã¾ã™" -#: sql_help.c:5983 +#: sql_help.c:6016 msgid "remove a data type" msgstr "データ型を削除ã—ã¾ã™" -#: sql_help.c:5995 +#: sql_help.c:6028 msgid "remove a user mapping for a foreign server" msgstr "外部サーãƒãƒ¼ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒžãƒƒãƒ”ングを削除ã—ã¾ã™" -#: sql_help.c:6001 +#: sql_help.c:6034 msgid "remove a view" msgstr "ビューを削除ã—ã¾ã™" -#: sql_help.c:6013 +#: sql_help.c:6046 msgid "execute a prepared statement" msgstr "準備ã—ãŸæ–‡ã‚’実行ã—ã¾ã™" -#: sql_help.c:6019 +#: sql_help.c:6052 msgid "show the execution plan of a statement" msgstr "æ–‡ã®å®Ÿè¡Œè¨ˆç”»ã‚’表示ã—ã¾ã™" -#: sql_help.c:6025 +#: sql_help.c:6058 msgid "retrieve rows from a query using a cursor" msgstr "カーソルを使ã£ã¦å•ã„åˆã‚ã›ã‹ã‚‰è¡Œã‚’å–り出ã—ã¾ã™" -#: sql_help.c:6031 +#: sql_help.c:6064 msgid "define access privileges" msgstr "アクセス権é™ã‚’定義ã—ã¾ã™" -#: sql_help.c:6037 +#: sql_help.c:6070 msgid "import table definitions from a foreign server" msgstr "外部サーãƒãƒ¼ã‹ã‚‰ãƒ†ãƒ¼ãƒ–ル定義をインãƒãƒ¼ãƒˆã—ã¾ã™" -#: sql_help.c:6043 +#: sql_help.c:6076 msgid "create new rows in a table" msgstr "ãƒ†ãƒ¼ãƒ–ãƒ«ã«æ–°ã—ã„行を作æˆã—ã¾ã™" -#: sql_help.c:6049 +#: sql_help.c:6082 msgid "listen for a notification" msgstr "通知メッセージを監視ã—ã¾ã™" -#: sql_help.c:6055 +#: sql_help.c:6088 msgid "load a shared library file" msgstr "共有ライブラリファイルをロードã—ã¾ã™" -#: sql_help.c:6061 +#: sql_help.c:6094 msgid "lock a table" msgstr "テーブルをロックã—ã¾ã™" -#: sql_help.c:6067 +#: sql_help.c:6100 msgid "conditionally insert, update, or delete rows of a table" msgstr "æ¡ä»¶ã«ã‚ˆã£ã¦ãƒ†ãƒ¼ãƒ–ルã®è¡Œã‚’æŒ¿å…¥ã€æ›´æ–°ã¾ãŸã¯å‰Šé™¤ã™ã‚‹" -#: sql_help.c:6073 +#: sql_help.c:6106 msgid "position a cursor" msgstr "カーソルをä½ç½®ã¥ã‘ã¾ã™" -#: sql_help.c:6079 +#: sql_help.c:6112 msgid "generate a notification" msgstr "通知を生æˆã—ã¾ã™" -#: sql_help.c:6085 +#: sql_help.c:6118 msgid "prepare a statement for execution" msgstr "実行ã«å‚™ãˆã¦æ–‡ã‚’準備ã—ã¾ã™" -#: sql_help.c:6091 +#: sql_help.c:6124 msgid "prepare the current transaction for two-phase commit" msgstr "二相コミットã«å‚™ãˆã¦ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’準備ã—ã¾ã™" -#: sql_help.c:6097 +#: sql_help.c:6130 msgid "change the ownership of database objects owned by a database role" msgstr "ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ­ãƒ¼ãƒ«ãŒæ‰€æœ‰ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰æ¨©ã‚’変更ã—ã¾ã™" -#: sql_help.c:6103 +#: sql_help.c:6136 msgid "replace the contents of a materialized view" msgstr "実体化ビューã®å†…å®¹ã‚’ç½®ãæ›ãˆã¾ã™" -#: sql_help.c:6109 +#: sql_help.c:6142 msgid "rebuild indexes" msgstr "ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’å†æ§‹ç¯‰ã—ã¾ã™" -#: sql_help.c:6115 +#: sql_help.c:6148 msgid "release a previously defined savepoint" msgstr "以å‰ã«å®šç¾©ã•れãŸã‚»ãƒ¼ãƒ–ãƒã‚¤ãƒ³ãƒˆã‚’解放ã—ã¾ã™" -#: sql_help.c:6121 +#: sql_help.c:6154 msgid "restore the value of a run-time parameter to the default value" msgstr "実行時パラメータã®å€¤ã‚’ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã«æˆ»ã—ã¾ã™" -#: sql_help.c:6127 +#: sql_help.c:6160 msgid "remove access privileges" msgstr "アクセス権é™ã‚’削除ã—ã¾ã™" -#: sql_help.c:6139 +#: sql_help.c:6172 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "二相コミットã®ãŸã‚ã«äº‹å‰ã«æº–å‚™ã•れãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’キャンセルã—ã¾ã™" -#: sql_help.c:6145 +#: sql_help.c:6178 msgid "roll back to a savepoint" msgstr "セーブãƒã‚¤ãƒ³ãƒˆã¾ã§ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ã—ã¾ã™" -#: sql_help.c:6151 +#: sql_help.c:6184 msgid "define a new savepoint within the current transaction" msgstr "ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å†…ã§æ–°ã—ã„セーブãƒã‚¤ãƒ³ãƒˆã‚’定義ã—ã¾ã™" -#: sql_help.c:6157 +#: sql_help.c:6190 msgid "define or change a security label applied to an object" msgstr "オブジェクトã«é©ç”¨ã•れるセキュリティラベルを定義ã¾ãŸã¯å¤‰æ›´ã—ã¾ã™" -#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253 +#: sql_help.c:6196 sql_help.c:6250 sql_help.c:6286 msgid "retrieve rows from a table or view" msgstr "テーブルã¾ãŸã¯ãƒ“ューã‹ã‚‰è¡Œã‚’å–å¾—ã—ã¾ã™" -#: sql_help.c:6175 +#: sql_help.c:6208 msgid "change a run-time parameter" msgstr "実行時パラメータを変更ã—ã¾ã™" -#: sql_help.c:6181 +#: sql_help.c:6214 msgid "set constraint check timing for the current transaction" msgstr "ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã«ã¤ã„ã¦ã€åˆ¶ç´„ãƒã‚§ãƒƒã‚¯ã®ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã‚’設定ã—ã¾ã™" -#: sql_help.c:6187 +#: sql_help.c:6220 msgid "set the current user identifier of the current session" msgstr "ç¾åœ¨ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼è­˜åˆ¥å­ã‚’設定ã—ã¾ã™" -#: sql_help.c:6193 +#: sql_help.c:6226 msgid "set the session user identifier and the current user identifier of the current session" msgstr "セッションã®ãƒ¦ãƒ¼ã‚¶ãƒ¼è­˜åˆ¥å­ãŠã‚ˆã³ç¾åœ¨ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ç¾åœ¨ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼è­˜åˆ¥å­ã‚’設定ã—ã¾ã™" -#: sql_help.c:6199 +#: sql_help.c:6232 msgid "set the characteristics of the current transaction" msgstr "ç¾åœ¨ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®ç‰¹æ€§ã‚’設定ã—ã¾ã™" -#: sql_help.c:6205 +#: sql_help.c:6238 msgid "show the value of a run-time parameter" msgstr "実行時パラメータã®å€¤ã‚’表示ã—ã¾ã™" -#: sql_help.c:6223 +#: sql_help.c:6256 msgid "empty a table or set of tables" msgstr "一ã¤ã®ã€ã¾ãŸã¯è¤‡æ•°ã®ãƒ†ãƒ¼ãƒ–ルを空ã«ã—ã¾ã™" -#: sql_help.c:6229 +#: sql_help.c:6262 msgid "stop listening for a notification" msgstr "通知メッセージã®ç›£è¦–を中止ã—ã¾ã™" -#: sql_help.c:6235 +#: sql_help.c:6268 msgid "update rows of a table" msgstr "テーブルã®è¡Œã‚’æ›´æ–°ã—ã¾ã™" -#: sql_help.c:6241 +#: sql_help.c:6274 msgid "garbage-collect and optionally analyze a database" msgstr "ガーベッジコレクションを行ã„ã€ã¾ãŸå¿…è¦ã«å¿œã˜ã¦ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’分æžã—ã¾ã™" -#: sql_help.c:6247 +#: sql_help.c:6280 msgid "compute a set of rows" msgstr "行セットを計算ã—ã¾ã™" @@ -6519,7 +6612,7 @@ msgstr "余分ãªã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³å¼•æ•°\"%s\"ã¯ç„¡è¦–ã•れã¾ã—ãŸ" msgid "could not find own program executable" msgstr "実行å¯èƒ½ãƒ•ァイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: tab-complete.c:6076 +#: tab-complete.c:6216 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6553,3 +6646,131 @@ msgid "" msgstr "" "\"%2$s\"ã®å€¤\"%1$s\"ãŒèªè­˜ã§ãã¾ã›ã‚“。\n" "有効ãªå€¤ã¯ %3$s。" + +#~ msgid "" +#~ " \\bind_named STMT_NAME [PARAM]...\n" +#~ " set query parameters for an existing prepared statement\n" +#~ msgstr "" +#~ " \\bind_named STMT_NAME [PARAM]...\n" +#~ " æ—¢å­˜ã®æº–備済ã¿ã®æ–‡ã«ãƒ‘ラメータを設定ã™ã‚‹\n" + +#~ msgid " \\close STMT_NAME close an existing prepared statement\n" +#~ msgstr " \\close STMT_NAME 準備済ã¿ã®æ–‡ã‚’クローズã™ã‚‹\n" + +#~ msgid " \\endpipeline exit pipeline mode\n" +#~ msgstr " \\endpipeline パイプラインモードを終了\n" + +#~ msgid " \\flush push unsent data to the server\n" +#~ msgstr " \\flush 未é€ä¿¡ã®ãƒ‡ãƒ¼ã‚¿ã‚’サーãƒãƒ¼ã¸é€ä¿¡\n" + +#~ msgid " \\flushrequest send a flushrequest command\n" +#~ msgstr " \\flushrequest flushrequestコマンドをé€ä¿¡\n" + +#~ msgid "" +#~ " \\getresults [NUM_RES] read NUM_RES pending results. All pending results are\n" +#~ " read if no argument is provided\n" +#~ msgstr "" +#~ " \\getresults [çµæžœæ•°] 指定ã—㟠\"çµæžœæ•°\" åˆ†ã®æœªå–å¾—ã®çµæžœã‚’読ã¿å–る。\n" +#~ " 引数ãªã—ã®å ´åˆã€ã™ã¹ã¦ã®æœªå–å¾—ã®çµæžœã‚’読ã¿å–ã‚‹\n" + +#~ msgid " \\parse STMT_NAME create a prepared statement\n" +#~ msgstr " \\parse STMT_NAME 準備済ã¿ã®æ–‡ã‚’作æˆ\n" + +#~ msgid " \\startpipeline enter pipeline mode\n" +#~ msgstr " \\startpipeline パイプラインモードを開始\n" + +#~ msgid " \\syncpipeline add a synchronisation point to an ongoing pipeline\n" +#~ msgstr " \\syncpipeline 実行中ã®ãƒ‘イプラインã«åŒæœŸãƒã‚¤ãƒ³ãƒˆã‚’追加\n" + +#~ msgid " (inherited)" +#~ msgstr "(継承)" + +#~ msgid " (local, inherited)" +#~ msgstr "(ローカルã€ç¶™æ‰¿)" + +#~ msgid "Did not find any foreign tables named \"%s\"." +#~ msgstr "\"%s\"ã¨ã„ã†åå‰ã®å¤–部テーブルã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#~ msgid "Did not find any foreign tables." +#~ msgstr "外部テーブルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#~ msgid "Did not find any indexes named \"%s\"." +#~ msgstr "\"%s\"ã¨ã„ã†åå‰ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#~ msgid "Did not find any indexes." +#~ msgstr "インデックスãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#~ msgid "Did not find any materialized views named \"%s\"." +#~ msgstr "\"%s\"ã¨ã„ã†åå‰ã®å®Ÿä½“化ビューã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#~ msgid "Did not find any materialized views." +#~ msgstr "実体化ビューãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#~ msgid "Did not find any relations named \"%s\"." +#~ msgstr "\"%s\"ã¨ã„ã†åå‰ã®ãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#~ msgid "Did not find any sequences named \"%s\"." +#~ msgstr "\"%s\"ã¨ã„ã†åå‰ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#~ msgid "Did not find any sequences." +#~ msgstr "シーケンスãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#~ msgid "Did not find any tables named \"%s\"." +#~ msgstr "\"%s\"ã¨ã„ã†åå‰ã®ãƒ†ãƒ¼ãƒ–ルã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#~ msgid "Did not find any tables." +#~ msgstr "テーブルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#~ msgid "Did not find any views named \"%s\"." +#~ msgstr "\"%s\"ã¨ã„ã†åå‰ã®ãƒ“ューã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#~ msgid "Did not find any views." +#~ msgstr "ビューãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚" + +#~ msgid "Generated columns" +#~ msgstr "生æˆåˆ—" + +#~ msgid "Leakproof?" +#~ msgstr "ç„¡æ¼æ´©?" + +#~ msgid "List of indexes" +#~ msgstr "インデックス一覧" + +#~ msgid "List of materialized views" +#~ msgstr "実体化ビュー一覧" + +#~ msgid "List of sequences" +#~ msgstr "シーケンス一覧" + +#~ msgid "List of tables" +#~ msgstr "テーブル一覧" + +#~ msgid "List of views" +#~ msgstr "ビュー一覧" + +#~ msgid "No pending results to get" +#~ msgstr "å–å¾—ã™ã¹ãä¿ç•™ä¸­ã®çµæžœã¯ã‚りã¾ã›ã‚“" + +#~ msgid "Not-null constraints:" +#~ msgstr "éžNULL制約:" + +#~ msgid "Pipeline aborted, command did not run" +#~ msgstr "パイプラインãŒä¸­æ–­ã•れã€ã‚³ãƒžãƒ³ãƒ‰ã¯å®Ÿè¡Œã•れã¾ã›ã‚“ã§ã—ãŸ" + +#~ msgid "\\getresults: invalid number of requested results" +#~ msgstr "\\getresults: è¦æ±‚ã•れãŸçµæžœã®æ•°ãŒä¸æ­£" + +#~ msgid "\\gexec not allowed in pipeline mode" +#~ msgstr "\\gexec ã¯ãƒ‘イプラインモードã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#~ msgid "\\gset not allowed in pipeline mode" +#~ msgstr "\\gset ã¯ãƒ‘イプラインモードã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#~ msgid "\\gx not allowed in pipeline mode" +#~ msgstr "\\gx ã¯ãƒ‘イプラインモードã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" + +#~ msgid "maxerror" +#~ msgstr "許容エラー数" + +#~ msgid "output_alias" +#~ msgstr "出力別å" diff --git a/src/bin/psql/po/ka.po b/src/bin/psql/po/ka.po index ee47b00775af7..42fd18ec3c152 100644 --- a/src/bin/psql/po/ka.po +++ b/src/bin/psql/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: psql (PostgreSQL) 16\n" +"Project-Id-Version: psql (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-19 11:17+0000\n" -"PO-Revision-Date: 2023-04-20 08:18+0200\n" +"POT-Creation-Date: 2024-11-28 22:48+0000\n" +"PO-Revision-Date: 2024-11-29 05:09+0100\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.5\n" #: ../../../src/common/logging.c:276 #, c-format @@ -38,33 +38,48 @@ msgstr "დეტáƒáƒšáƒ”ბი: " msgid "hint: " msgstr "მინიშნებáƒ: " -#: ../../common/exec.c:172 +#: ../../common/exec.c:174 #, c-format msgid "invalid binary \"%s\": %m" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜ \"%s\": %m" -#: ../../common/exec.c:215 +#: ../../common/exec.c:217 #, c-format msgid "could not read binary \"%s\": %m" msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:223 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "გáƒáƒ¡áƒáƒ¨áƒ•ებáƒáƒ“ ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" პáƒáƒ•ნრშეუძლებელიáƒ" -#: ../../common/exec.c:250 +#: ../../common/exec.c:252 #, c-format msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "ბილიკის (\"%s\") áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ  ფáƒáƒ áƒ›áƒáƒ¨áƒ˜ áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:412 +#: ../../common/exec.c:382 copy.c:326 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "ბრძáƒáƒœáƒ”ბის (\"%s\") შესრულების შეცდáƒáƒ›áƒ: %m" + +#: ../../common/exec.c:394 +#, c-format +msgid "could not read from command \"%s\": %m" +msgstr "ბრძáƒáƒœáƒ”ბიდáƒáƒœ \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/exec.c:397 +#, c-format +msgid "no data was returned by command \"%s\"" +msgstr "ბრძáƒáƒœáƒ”ბáƒáƒ› \"%s\" მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  დáƒáƒáƒ‘რუნáƒ" + +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s()-ის შეცდáƒáƒ›áƒ: %m" -#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 -#: command.c:1352 command.c:3437 command.c:3486 command.c:3610 input.c:226 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: command.c:1372 command.c:3458 command.c:3507 command.c:3632 input.c:225 #: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" @@ -86,7 +101,7 @@ msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლ msgid "could not look up effective user ID %ld: %s" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ეფექტური ID-ის (%ld) áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %s" -#: ../../common/username.c:45 command.c:613 +#: ../../common/username.c:45 command.c:616 msgid "user does not exist" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" @@ -108,12 +123,12 @@ msgstr "ბრძáƒáƒœáƒ”ბრვერ ვიპáƒáƒ•ე" #: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" -msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d" +msgstr "შვილი პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რსტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d" #: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" -msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რგáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ— 0x%X" +msgstr "შვილი პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რგáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ— 0x%X" #: ../../common/wait_error.c:76 #, c-format @@ -123,13 +138,13 @@ msgstr "პრáƒáƒªáƒ”სი გáƒáƒ©áƒ”რდრსიგნáƒáƒšáƒ˜áƒ—: %d #: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" -msgstr "შვილეული პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რუცნáƒáƒ‘ი სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d" +msgstr "შვილი პრáƒáƒªáƒ”სი დáƒáƒ¡áƒ áƒ£áƒšáƒ“რუცნáƒáƒ‘ი სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ— %d" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•ნრგáƒáƒ’ზáƒáƒ•ნილიáƒ\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ’ზáƒáƒ•ნრშეუძლებელიáƒ: " @@ -140,319 +155,342 @@ msgid_plural "(%lu rows)" msgstr[0] "(%lu მწკრივი)" msgstr[1] "(%lu მწკრივი)" -#: ../../fe_utils/print.c:3153 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "შეწყვეტილიáƒ\n" -#: ../../fe_utils/print.c:3217 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "ვერ გáƒáƒ›áƒáƒ•იტáƒáƒœáƒ” ცხრილის შემცველáƒáƒ‘áƒ: უჯრედების რáƒáƒáƒ“ენáƒáƒ‘რ%lld მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ˜áƒ¡ %lld ტáƒáƒšáƒ˜ áƒáƒœ მáƒáƒ¡áƒ–ე მეტიáƒ.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "ცხრილის შემცველáƒáƒ‘áƒáƒ–ე თáƒáƒ•სáƒáƒ áƒ—ის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ: სვეტების რáƒáƒáƒ“ენáƒáƒ‘რ%d გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულიáƒ.\n" -#: ../../fe_utils/print.c:3257 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "ცხრილის შემცველáƒáƒ‘áƒáƒ–ე უჯრედის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ: უჯრედების რáƒáƒáƒ“ენáƒáƒ‘რ%d-ზე მეტიáƒ.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "ცხრილის შემცველáƒáƒ‘áƒáƒ–ე უჯრედის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ: უჯრედების ჯáƒáƒ›áƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘რ%lld-ზე მეტიáƒ.\n" -#: ../../fe_utils/print.c:3515 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ (შიდრშეცდáƒáƒ›áƒ): %d" -#: ../../fe_utils/psqlscan.l:717 +#: ../../fe_utils/psqlscan.l:732 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "რეკურსიული გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის გáƒáƒ›áƒáƒ¢áƒáƒ•ებრცვლáƒáƒ“ისთვის \"%s\"" -#: ../../port/thread.c:50 ../../port/thread.c:86 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის áƒáƒ áƒ’უმენტი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + +#: ../../port/user.c:43 ../../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ID-ის (%d) áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %s" -#: ../../port/thread.c:55 ../../port/thread.c:91 +#: ../../port/user.c:48 ../../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ID-ით %d áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: command.c:234 +#: command.c:235 #, c-format msgid "invalid command \\%s" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბრძáƒáƒœáƒ”ბრ\\%s" -#: command.c:236 +#: command.c:237 #, c-format msgid "Try \\? for help." msgstr "დáƒáƒ®áƒ›áƒáƒ áƒ”ბისთვის სცáƒáƒ“ეთ \\? ." -#: command.c:254 +#: command.c:255 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: დáƒáƒ›áƒáƒ¢áƒ”ბითი áƒáƒ áƒ’უმენტი \"%s\" იგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ" -#: command.c:306 +#: command.c:307 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "\\%s ბრძáƒáƒœáƒ”ბრგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ; მიმდინáƒáƒ áƒ” \\if ბლáƒáƒ™áƒ˜áƒ“áƒáƒœ გáƒáƒ›áƒáƒ¡áƒáƒ¡áƒ•ლელáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \\endif áƒáƒœ Control-C" -#: command.c:611 +#: command.c:614 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის, ID-ით %ld, სáƒáƒ¬áƒ§áƒ˜áƒ¡ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ეზე გáƒáƒ“áƒáƒ¡áƒ•ლის შეცდáƒáƒ›áƒ: %s" -#: command.c:630 +#: command.c:633 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის \"%s\"-ზე შეცვლის შეცდáƒáƒ›áƒ: %m" -#: command.c:654 +#: command.c:657 #, c-format msgid "You are currently not connected to a database.\n" msgstr "áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებული áƒáƒ  ბრძáƒáƒœáƒ“ებით.\n" -#: command.c:664 +#: command.c:667 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" მისáƒáƒ›áƒáƒ áƒ—ზე \"%s\" დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n" -#: command.c:667 +#: command.c:670 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" სáƒáƒ™áƒ”ტით \"%s\" დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n" -#: command.c:673 +#: command.c:676 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" ჰáƒáƒ¡áƒ¢áƒ–ე \"%s\" (მისáƒáƒ›áƒáƒ áƒ—ით \"%s\") დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n" -#: command.c:676 +#: command.c:679 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" ჰáƒáƒ¡áƒ¢áƒ–ე \"%s\" დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n" -#: command.c:1064 command.c:1157 command.c:2680 +#: command.c:1069 command.c:1170 command.c:2675 #, c-format msgid "no query buffer" msgstr "მáƒáƒ—ხáƒáƒ•ნების ბáƒáƒ¤áƒ”რის გáƒáƒ áƒ”შე" -#: command.c:1097 command.c:5676 +#: command.c:1102 command.c:5776 #, c-format msgid "invalid line number: %s" msgstr "ხáƒáƒ–ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი: %s" -#: command.c:1235 +#: command.c:1248 msgid "No changes" msgstr "ცვლილებების გáƒáƒ áƒ”შე" -#: command.c:1313 +#: command.c:1333 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: კáƒáƒ“ირების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი áƒáƒœ გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ პრáƒáƒªáƒ”დურრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: command.c:1348 command.c:2150 command.c:3433 command.c:3630 command.c:5782 -#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120 -#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480 -#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192 -#: large_obj.c:254 startup.c:304 +#: command.c:1368 command.c:2157 command.c:3454 command.c:3652 command.c:5882 +#: common.c:221 common.c:270 common.c:440 common.c:1142 common.c:1160 +#: common.c:1228 common.c:1340 common.c:1378 common.c:1475 common.c:1541 +#: copy.c:486 copy.c:722 large_obj.c:157 large_obj.c:192 large_obj.c:254 +#: startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1355 +#: command.c:1375 msgid "There is no previous error." msgstr "წინრშეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ áƒ”შე." -#: command.c:1468 +#: command.c:1488 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: áƒáƒ™áƒšáƒ˜áƒ მáƒáƒ áƒ¯áƒ•ენრმრგვáƒáƒšáƒ˜ ფრჩხილი" -#: command.c:1552 command.c:1682 command.c:1986 command.c:2000 command.c:2019 -#: command.c:2201 command.c:2442 command.c:2647 command.c:2687 +#: command.c:1572 command.c:1691 command.c:1995 command.c:2009 command.c:2028 +#: command.c:2196 command.c:2437 command.c:2642 command.c:2682 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: áƒáƒ™áƒšáƒ˜áƒ სáƒáƒ­áƒ˜áƒ áƒ áƒáƒ áƒ’უმენტი" -#: command.c:1813 +#: command.c:1822 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: áƒáƒ  შეიძლებრ\\else -ის შემდეგ იყáƒáƒ¡" -#: command.c:1818 +#: command.c:1827 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ \\if -ის გáƒáƒ áƒ”შე" -#: command.c:1882 +#: command.c:1891 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: ვერ გáƒáƒ©áƒœáƒ“ებრ\\else -ის შემდეგ" -#: command.c:1887 +#: command.c:1896 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ \\if -ის გáƒáƒ áƒ”შე" -#: command.c:1927 +#: command.c:1936 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ \\if -ის გáƒáƒ áƒ”შე" -#: command.c:2083 +#: command.c:2092 msgid "Query buffer is empty." msgstr "მáƒáƒ—ხáƒáƒ•ნის ბáƒáƒ¤áƒ”რი ცáƒáƒ áƒ˜áƒ”ლიáƒ." -#: command.c:2126 +#: command.c:2135 #, c-format msgid "Enter new password for user \"%s\": " msgstr "შეიყვáƒáƒœáƒ”თ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის (\"%s\") áƒáƒ®áƒáƒšáƒ˜ პáƒáƒ áƒáƒšáƒ˜: " -#: command.c:2130 +#: command.c:2139 msgid "Enter it again: " msgstr "შეიყვáƒáƒœáƒ”თ კდევ ერთხელ: " -#: command.c:2139 +#: command.c:2148 #, c-format msgid "Passwords didn't match." msgstr "პáƒáƒ áƒáƒšáƒ”ბი áƒáƒ  ემთხვევáƒ." -#: command.c:2236 +#: command.c:2231 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: ცვლáƒáƒ“ის მნიშვნელáƒáƒ‘ის წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ" -#: command.c:2338 +#: command.c:2333 msgid "Query buffer reset (cleared)." msgstr "მáƒáƒ—ხáƒáƒ•ნის ბáƒáƒ¤áƒ”რი ცáƒáƒ áƒ˜áƒ”ლიáƒ(გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•დáƒ)." -#: command.c:2360 +#: command.c:2355 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "ისტáƒáƒ áƒ˜áƒ ჩáƒáƒ¬áƒ”რილირფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\".\n" -#: command.c:2447 +#: command.c:2442 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ის სáƒáƒ®áƒ”ლი \"=\" -ს áƒáƒ  შეიძლებრშეიცáƒáƒ•დეს" -#: command.c:2495 +#: command.c:2490 #, c-format msgid "function name is required" msgstr "ფუნქციის სáƒáƒ®áƒ”ლი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" -#: command.c:2497 +#: command.c:2492 #, c-format msgid "view name is required" msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ ხედის სáƒáƒ®áƒ”ლი" -#: command.c:2619 +#: command.c:2614 msgid "Timing is on." msgstr "დრáƒáƒ˜áƒ¡ დáƒáƒ—ვლრჩáƒáƒ áƒ—ულიáƒ." -#: command.c:2621 +#: command.c:2616 msgid "Timing is off." msgstr "დრáƒáƒ˜áƒ¡ დáƒáƒ—ვლრგáƒáƒ›áƒáƒ áƒ—ულიáƒ." -#: command.c:2707 command.c:2745 command.c:4072 command.c:4075 command.c:4078 -#: command.c:4084 command.c:4086 command.c:4112 command.c:4122 command.c:4134 -#: command.c:4148 command.c:4175 command.c:4233 common.c:78 copy.c:329 -#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818 +#: command.c:2702 command.c:2740 command.c:4163 command.c:4166 command.c:4169 +#: command.c:4175 command.c:4177 command.c:4203 command.c:4213 command.c:4225 +#: command.c:4239 command.c:4266 command.c:4324 common.c:77 copy.c:329 +#: copy.c:401 psqlscanslash.l:805 psqlscanslash.l:817 psqlscanslash.l:835 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:2734 copy.c:388 +#: command.c:2729 copy.c:388 #, c-format msgid "%s: %s" msgstr "%s: %s" -#: command.c:2804 command.c:2850 +#: command.c:2801 command.c:2867 #, c-format msgid "\\watch: interval value is specified more than once" msgstr "\\watch: ინტერვáƒáƒšáƒ˜áƒ¡ მნიშვნელáƒáƒ‘რერთზე მეტჯერáƒáƒ მითითებული" -#: command.c:2814 command.c:2860 +#: command.c:2811 command.c:2877 #, c-format -#| msgid "incorrectly formed variable \"%s\"" msgid "\\watch: incorrect interval value \"%s\"" msgstr "\\watch: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ინტერვáƒáƒšáƒ˜áƒ¡ მნიშვნელáƒáƒ‘რ\"%s\"" -#: command.c:2824 +#: command.c:2821 #, c-format -#| msgid "column \"%s\" specified more than once" msgid "\\watch: iteration count is specified more than once" msgstr "\\watch: იტერáƒáƒªáƒ˜áƒ˜áƒ¡ რáƒáƒáƒ“ენáƒáƒ‘რერთზე მეტჯერáƒáƒ მითითებული" -#: command.c:2834 +#: command.c:2831 #, c-format msgid "\\watch: incorrect iteration count \"%s\"" msgstr "\\watch: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ იტერáƒáƒªáƒ˜áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რ\"%s\"" #: command.c:2841 #, c-format +msgid "\\watch: minimum row count specified more than once" +msgstr "\\watch: მინიმáƒáƒšáƒ£áƒ áƒ˜ მწკრივების რáƒáƒáƒ“ენáƒáƒ‘რერთზე მეტჯერáƒáƒ მითითებული" + +#: command.c:2851 +#, c-format +msgid "\\watch: incorrect minimum row count \"%s\"" +msgstr "\\watch: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მინიმáƒáƒšáƒ£áƒ áƒ˜ მწკრივების რáƒáƒáƒ“ენáƒáƒ‘რ\"%s\"" + +#: command.c:2858 +#, c-format msgid "\\watch: unrecognized parameter \"%s\"" msgstr "\\watch: უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\"" -#: command.c:3234 startup.c:243 startup.c:293 +#: command.c:3255 startup.c:243 startup.c:293 msgid "Password: " msgstr "პáƒáƒ áƒáƒšáƒ˜: " -#: command.c:3239 startup.c:290 +#: command.c:3260 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "პáƒáƒ áƒáƒšáƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის %s: " -#: command.c:3295 +#: command.c:3316 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "შეერთების სტრიქáƒáƒœáƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის, ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡áƒ დრდრპáƒáƒ áƒ¢áƒ˜áƒ¡ áƒáƒ  მითითებáƒ" -#: command.c:3330 +#: command.c:3351 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის კáƒáƒ•შირი პáƒáƒ áƒáƒ›áƒ”ტრების ხელáƒáƒ®áƒšáƒ გáƒáƒ›áƒáƒ¡áƒáƒ§áƒ”ნებლáƒáƒ“ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: command.c:3636 +#: command.c:3658 #, c-format msgid "Previous connection kept" msgstr "წინრშეერთებრჯერ კიდევ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: command.c:3642 +#: command.c:3664 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3698 +#: command.c:3720 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" მისáƒáƒ›áƒáƒ áƒ—ზე \"%s\" დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n" -#: command.c:3701 +#: command.c:3723 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" სáƒáƒ™áƒ”ტით \"%s\" დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n" -#: command.c:3707 +#: command.c:3729 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" ჰáƒáƒ¡áƒ¢áƒ–ე \"%s\" (მისáƒáƒ›áƒáƒ áƒ—ით \"%s\") დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n" -#: command.c:3710 +#: command.c:3732 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\" ჰáƒáƒ¡áƒ¢áƒ–ე \"%s\" დრპáƒáƒ áƒ¢áƒ–ე \"%s\".\n" -#: command.c:3715 +#: command.c:3737 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "áƒáƒ®áƒšáƒ მიერთებული ბრძáƒáƒœáƒ“ებით ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ \"%s\" რáƒáƒ’áƒáƒ áƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი \"%s\"\n" -#: command.c:3755 +#: command.c:3843 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, სერვერი %s)\n" -#: command.c:3768 +#: command.c:3856 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -461,29 +499,33 @@ msgstr "" "გáƒáƒ¤áƒ áƒ—ხილებáƒ: %s ძირითáƒáƒ“ი ვერსირ%s, სერვერის ძირითáƒáƒ“ი ვერსირ%s.\n" " psql-ის ზáƒáƒ’იერთმრფუნქციáƒáƒ› შეიძლებრáƒáƒ  იმუშáƒáƒáƒ¡.\n" -#: command.c:3805 +#: command.c:3895 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" -msgstr "SSL შეერთებრ(პრáƒáƒ“áƒáƒ™áƒáƒšáƒ˜: %s, შიფრáƒáƒªáƒ: %s, შეკუშმვáƒ: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s, ALPN: %s)\n" +msgstr "SSL შეერთებრ(პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜: %s, შიფრáƒáƒªáƒ˜áƒ: %s, შეკუშმვáƒ: %s, ALPN: %s)\n" -#: command.c:3806 command.c:3807 +#: command.c:3896 command.c:3897 msgid "unknown" msgstr "უცნáƒáƒ‘ი" -#: command.c:3808 help.c:42 +#: command.c:3898 help.c:42 msgid "off" msgstr "გáƒáƒ›áƒáƒ áƒ—ული" -#: command.c:3808 help.c:42 +#: command.c:3898 help.c:42 msgid "on" msgstr "ჩáƒáƒ áƒ—" -#: command.c:3822 +#: command.c:3899 +msgid "none" +msgstr "áƒáƒ áƒªáƒ”რთი" + +#: command.c:3913 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPI-ით დáƒáƒ¨áƒ˜áƒ¤áƒ áƒ£áƒšáƒ˜ შეერთებáƒ\n" -#: command.c:3842 +#: command.c:3933 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -494,299 +536,289 @@ msgstr "" " 8-ბიტიáƒáƒœáƒ˜ სიმბáƒáƒšáƒáƒ”ბმრშეიძლებრსწáƒáƒ áƒáƒ“ áƒáƒ  იმუშáƒáƒáƒ¡. მეტი დეტáƒáƒšáƒ”ბისთვის\n" " იხილეთ psql-ის დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒ˜áƒ¡ გვერდი გვერდი \"შენიშვნები Windows-ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლებისთვის\".\n" -#: command.c:3947 +#: command.c:4038 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ის PSQL_EDITOR_LINENUMBER_ARG დáƒáƒ§áƒ”ნებრხáƒáƒ–ის ნáƒáƒ›áƒ”რზე" -#: command.c:3977 +#: command.c:4068 #, c-format msgid "could not start editor \"%s\"" msgstr "რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜áƒ¡ გáƒáƒ¨áƒ•ების შეცდáƒáƒ›áƒ: \"%s\"" -#: command.c:3979 +#: command.c:4070 #, c-format msgid "could not start /bin/sh" msgstr "/bin/sh-ის გáƒáƒ¨áƒ•ების შეცდáƒáƒ›áƒ" -#: command.c:4029 +#: command.c:4120 #, c-format msgid "could not locate temporary directory: %s" msgstr "დრáƒáƒ”ბითი სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მáƒáƒ«áƒ”ბნის შეცდáƒáƒ›áƒ: %s" -#: command.c:4056 +#: command.c:4147 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: command.c:4392 +#: command.c:4483 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: \"%s\"-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ‘რევიáƒáƒ¢áƒ£áƒ áƒ áƒáƒ áƒ˜áƒ•ეს, \"%s\"-ს დრ\"%s-ს ემთხვევáƒ\"" -#: command.c:4412 +#: command.c:4503 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset: დáƒáƒ¡áƒáƒ¨áƒ•ები ფáƒáƒ áƒ›áƒáƒ¢áƒ”ბიáƒ: aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:4431 +#: command.c:4522 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: ხáƒáƒ–ის ნებáƒáƒ“áƒáƒ áƒ—ული სტილებირascii, old-ascii დრunicode" -#: command.c:4446 +#: command.c:4537 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: უნიკáƒáƒ“ის სáƒáƒ–ღვრის ხáƒáƒ–ის ნებáƒáƒ“áƒáƒ áƒ—ული სტილებირsingle დრdouble" -#: command.c:4461 +#: command.c:4552 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: უნიკáƒáƒ“ის სვეტის ხáƒáƒ–ის ნებáƒáƒ“áƒáƒ áƒ—ული სტილებირsingle დრdouble" -#: command.c:4476 +#: command.c:4567 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset:უნიკáƒáƒ“ის თáƒáƒ•სáƒáƒ áƒ—ის ხáƒáƒ–ების ნებáƒáƒ“áƒáƒ áƒ—ულ სტილებირsingle დრdouble" -#: command.c:4528 +#: command.c:4619 #, c-format -msgid "\\pset: allowed xheader_width values are full (default), column, page, or a number specifying the exact width." -msgstr "\\pset: xheader_width-ის დáƒáƒ¨áƒ•ებული მნიშვნელáƒáƒ‘ები სáƒáƒ•სერ(ნáƒáƒ’ულისხმები), სვეტი, გვერდი, áƒáƒœ რიცხვი, რáƒáƒ›áƒ”ლიც ზუსტ სიგáƒáƒœáƒ”ზე მიუთითებს." +msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width" +msgstr "\\pset: xheader_width-ის დáƒáƒ¨áƒ•ებული მნიშვნელáƒáƒ‘ებირ\"%s\" (ნáƒáƒ’ულისხმები), \"%s\", \"%s\", áƒáƒœ რიცხვი, რáƒáƒ›áƒ”ლიც ზუსტ სიგáƒáƒœáƒ”ზე მიუთითებს" -#: command.c:4542 +#: command.c:4636 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep ერთი ერთბáƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ სიმბáƒáƒšáƒ უნდრიყáƒáƒ¡" -#: command.c:4547 +#: command.c:4641 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldsep áƒáƒ  შეიძლებრიყáƒáƒ¡ áƒáƒ áƒ›áƒáƒ’ი ბრჭყáƒáƒšáƒ˜, ხáƒáƒ–ის დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜ დრკáƒáƒ áƒ”ტის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ" -#: command.c:4684 command.c:4885 +#: command.c:4779 command.c:4980 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი: %s" -#: command.c:4704 +#: command.c:4799 #, c-format msgid "Border style is %d.\n" msgstr "სáƒáƒ–ღვრის სტილი: %d\n" -#: command.c:4710 +#: command.c:4805 #, c-format msgid "Target width is unset.\n" msgstr "სáƒáƒ›áƒ˜áƒ–ნის სიგáƒáƒœáƒ” დáƒáƒ§áƒ”ნებული áƒáƒ áƒáƒ.\n" -#: command.c:4712 +#: command.c:4807 #, c-format msgid "Target width is %d.\n" msgstr "სáƒáƒ›áƒ˜áƒ–ნის სიგáƒáƒœáƒ”რ%d.\n" -#: command.c:4719 +#: command.c:4814 #, c-format msgid "Expanded display is on.\n" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული ეკრáƒáƒœáƒ˜ ჩáƒáƒ áƒ—ულიáƒ.\n" -#: command.c:4721 +#: command.c:4816 #, c-format msgid "Expanded display is used automatically.\n" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული ეკრáƒáƒœáƒ˜ áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ.\n" -#: command.c:4723 +#: command.c:4818 #, c-format msgid "Expanded display is off.\n" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული ეკრáƒáƒœáƒ˜ გáƒáƒ›áƒáƒ áƒ—ულიáƒ.\n" -#: command.c:4730 -#, c-format -msgid "Expanded header width is 'full'.\n" -msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული თáƒáƒ•სáƒáƒ áƒ—ის სიგáƒáƒœáƒ”რ'full'.\n" - -#: command.c:4732 -#, c-format -msgid "Expanded header width is 'column'.\n" -msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული თáƒáƒ•სáƒáƒ áƒ—ის სიგáƒáƒœáƒ”რ'column'.\n" - -#: command.c:4734 +#: command.c:4825 command.c:4827 command.c:4829 #, c-format -msgid "Expanded header width is 'page'.\n" -msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული თáƒáƒ•სáƒáƒ áƒ—ის სიგáƒáƒœáƒ”რ'page'.\n" +msgid "Expanded header width is \"%s\".\n" +msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული თáƒáƒ•სáƒáƒ áƒ—ის სიგáƒáƒœáƒ”რ\"%s\".\n" -#: command.c:4736 +#: command.c:4831 #, c-format msgid "Expanded header width is %d.\n" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული თáƒáƒ•სáƒáƒ áƒ—ირ%d.\n" -#: command.c:4742 +#: command.c:4837 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "CSV-ში ველების გáƒáƒœáƒ›áƒáƒªáƒáƒšáƒ™áƒ”ვებელირ\"%s\".\n" -#: command.c:4750 command.c:4758 +#: command.c:4845 command.c:4853 #, c-format msgid "Field separator is zero byte.\n" msgstr "ველების გáƒáƒœáƒ›áƒáƒªáƒáƒšáƒ™áƒ”ვებელი ნულáƒáƒ•áƒáƒœáƒ˜ ბáƒáƒ˜áƒ¢áƒ˜áƒ.\n" -#: command.c:4752 +#: command.c:4847 #, c-format msgid "Field separator is \"%s\".\n" msgstr "ველების გáƒáƒœáƒ›áƒáƒªáƒáƒšáƒ™áƒ”ვებელირ\"%s\".\n" -#: command.c:4765 +#: command.c:4860 #, c-format msgid "Default footer is on.\n" msgstr "მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის ზáƒáƒšáƒ˜ ჩáƒáƒ áƒ—ულიáƒ.\n" -#: command.c:4767 +#: command.c:4862 #, c-format msgid "Default footer is off.\n" msgstr "ნáƒáƒ’ულისხმები ქვესáƒáƒ áƒ—ი გáƒáƒ›áƒáƒ áƒ—ულიáƒ\n" -#: command.c:4773 +#: command.c:4868 #, c-format msgid "Output format is %s.\n" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ %s.\n" -#: command.c:4779 +#: command.c:4874 #, c-format msgid "Line style is %s.\n" msgstr "ხáƒáƒ–ის სტილირ%s.\n" -#: command.c:4786 +#: command.c:4881 #, c-format msgid "Null display is \"%s\".\n" msgstr "ნულáƒáƒ•áƒáƒœáƒ˜áƒ ეკრáƒáƒœáƒ˜áƒ \"%s\".\n" -#: command.c:4794 +#: command.c:4889 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "რიცხვების ენáƒáƒ–ე მáƒáƒ áƒ’ებული გáƒáƒ›áƒáƒ¢áƒáƒœáƒ ჩáƒáƒ áƒ—ულიáƒ.\n" -#: command.c:4796 +#: command.c:4891 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "რიცხვების ენáƒáƒ–ე მáƒáƒ áƒ’ებული გáƒáƒ›áƒáƒ¢áƒáƒœáƒ გáƒáƒ›áƒáƒ áƒ—ულáƒ.\n" -#: command.c:4803 +#: command.c:4898 #, c-format msgid "Pager is used for long output.\n" msgstr "გრძელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრგვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი.\n" -#: command.c:4805 +#: command.c:4900 #, c-format msgid "Pager is always used.\n" msgstr "გვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი ყáƒáƒ•ელთვის გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ.\n" -#: command.c:4807 +#: command.c:4902 #, c-format msgid "Pager usage is off.\n" msgstr "გვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი გáƒáƒ›áƒáƒ áƒ—ულიáƒ.\n" -#: command.c:4813 +#: command.c:4908 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "გვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი %d-ზე ნáƒáƒ™áƒšáƒ”ბ ხáƒáƒ–ზე áƒáƒ  მუშáƒáƒáƒ‘ს.\n" msgstr[1] "გვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი %d-ზე ნáƒáƒ™áƒšáƒ”ბ ხáƒáƒ–ზე áƒáƒ  მუშáƒáƒáƒ‘ს.\n" -#: command.c:4823 command.c:4833 +#: command.c:4918 command.c:4928 #, c-format msgid "Record separator is zero byte.\n" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის გáƒáƒ›áƒ§áƒáƒ¤áƒ˜ ნული ბáƒáƒ˜áƒ¢áƒ˜áƒ.\n" -#: command.c:4825 +#: command.c:4920 #, c-format msgid "Record separator is .\n" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ .\n" -#: command.c:4827 +#: command.c:4922 #, c-format msgid "Record separator is \"%s\".\n" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ \"%s\".\n" -#: command.c:4840 +#: command.c:4935 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "ცხრილის áƒáƒ¢áƒ áƒ˜áƒ‘უტებირ\"%s\".\n" -#: command.c:4843 +#: command.c:4938 #, c-format msgid "Table attributes unset.\n" msgstr "ცხრილის áƒáƒ¢áƒ áƒ˜áƒ‘უტები მáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜áƒ.\n" -#: command.c:4850 +#: command.c:4945 #, c-format msgid "Title is \"%s\".\n" msgstr "სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ \"%s\".\n" -#: command.c:4852 +#: command.c:4947 #, c-format msgid "Title is unset.\n" msgstr "სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებრგáƒáƒ£áƒ¥áƒ›áƒ“áƒ.\n" -#: command.c:4859 +#: command.c:4954 #, c-format msgid "Tuples only is on.\n" msgstr "მხáƒáƒšáƒáƒ“ სტრუქტურები ჩáƒáƒ áƒ—ულიáƒ.\n" -#: command.c:4861 +#: command.c:4956 #, c-format msgid "Tuples only is off.\n" msgstr "მხáƒáƒšáƒáƒ“ სტრუქტურები გáƒáƒ›áƒáƒ áƒ—ულიáƒ.\n" -#: command.c:4867 +#: command.c:4962 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "უნიკáƒáƒ“ის სáƒáƒ–ღვრის ხáƒáƒ–ის სტილირ\"%s\".\n" -#: command.c:4873 +#: command.c:4968 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "უნიკáƒáƒ“ის სვეტის ხáƒáƒ–ის სტილირ\"%s\".\n" -#: command.c:4879 +#: command.c:4974 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "უნიკáƒáƒ“ის თáƒáƒ•სáƒáƒ áƒ—ის ხáƒáƒ–ის სტილირ\"%s\".\n" -#: command.c:5127 +#: command.c:5223 #, c-format msgid "\\!: failed" msgstr "\\!: შეცდáƒáƒ›áƒ" -#: command.c:5161 +#: command.c:5261 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch ცáƒáƒ áƒ˜áƒ”ლი მáƒáƒ—ხáƒáƒ•ნით გáƒáƒ›áƒáƒ§áƒ”ნებული ვერ იქნებáƒ" -#: command.c:5193 +#: command.c:5293 #, c-format msgid "could not set timer: %m" msgstr "დრáƒáƒ˜áƒ¡ áƒáƒ¦áƒ›áƒ áƒ˜áƒªáƒ®áƒ•ელის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %m" -#: command.c:5256 +#: command.c:5362 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (ყáƒáƒ•ელ %g-ში)\n" -#: command.c:5259 +#: command.c:5365 #, c-format msgid "%s (every %gs)\n" msgstr "%s (ყáƒáƒ•ელ %g-ში)\n" -#: command.c:5327 +#: command.c:5429 #, c-format msgid "could not wait for signals: %m" msgstr "სიგნáƒáƒšáƒ”ბისთვის დáƒáƒšáƒáƒ“ებრშეუძლებელიáƒ: %m" -#: command.c:5385 command.c:5392 common.c:592 common.c:599 common.c:1083 +#: command.c:5485 command.c:5492 common.c:632 common.c:639 common.c:1123 #, c-format msgid "" -"********* QUERY **********\n" +"/******** QUERY *********/\n" "%s\n" -"**************************\n" +"/************************/\n" "\n" msgstr "" "********* მáƒáƒ—ხáƒáƒ•ნრ**********\n" @@ -794,143 +826,148 @@ msgstr "" "**************************\n" "\n" -#: command.c:5571 +#: command.c:5671 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" ხედი áƒáƒ áƒáƒ" -#: command.c:5587 +#: command.c:5687 #, c-format msgid "could not parse reloptions array" msgstr "reloptions მáƒáƒ¡áƒ˜áƒ•ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ" -#: common.c:167 +#: common.c:206 #, c-format msgid "cannot escape without active connection" msgstr "გáƒáƒ¥áƒªáƒ”ვრáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ შეერთებს გáƒáƒ áƒ”შე შეუძლებელიáƒ" -#: common.c:208 +#: common.c:247 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბრხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"" -#: common.c:312 +#: common.c:351 #, c-format msgid "connection to server was lost" msgstr "სერვერთáƒáƒœ კáƒáƒ•შირი დáƒáƒ™áƒáƒ áƒ’ულიáƒ" -#: common.c:316 +#: common.c:355 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "სერვერთáƒáƒœ კáƒáƒ•შირი დáƒáƒ™áƒáƒ áƒ’ულიáƒ. ვეცდები თáƒáƒ•იდáƒáƒœ დáƒáƒ•იწყáƒ: " -#: common.c:321 +#: common.c:360 #, c-format msgid "Failed.\n" -msgstr "წáƒáƒ áƒ£áƒ›áƒáƒ¢áƒ”ბელი.\n" +msgstr "ჩáƒáƒ•áƒáƒ áƒ“áƒ.\n" -#: common.c:338 +#: common.c:377 #, c-format msgid "Succeeded.\n" msgstr "წáƒáƒ áƒ›áƒáƒ¢áƒ”ბულიáƒ.\n" -#: common.c:390 common.c:1021 +#: common.c:430 common.c:1061 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი PQresultStatus: %d" -#: common.c:531 +#: common.c:571 #, c-format msgid "Time: %.3f ms\n" msgstr "დრáƒ: %.3f მწმ\n" -#: common.c:546 +#: common.c:586 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "დრáƒ: %.3f მწმ (%02d:%06.3f)\n" -#: common.c:555 +#: common.c:595 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "დრáƒ: %.3f მწმ (%02d:%02d:%06.3f)\n" -#: common.c:562 +#: common.c:602 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "დრáƒ: %.3f მწმ (%.0f დღე %02d:%02d:%06.3f)\n" -#: common.c:586 common.c:643 common.c:1054 describe.c:6156 +#: common.c:626 common.c:683 common.c:1094 describe.c:6192 #, c-format msgid "You are currently not connected to a database." msgstr "áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებული áƒáƒ  ბრძáƒáƒœáƒ“ებით." -#: common.c:674 +#: common.c:714 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "მიღებულირáƒáƒ¡áƒ˜áƒœáƒ¥áƒ áƒáƒœáƒ£áƒšáƒ˜ გáƒáƒ¤áƒ áƒ—ხილებრ\"%s\" შემცველáƒáƒ‘ით \"%s\" სერვერის პრáƒáƒªáƒ”სისგáƒáƒœ PID-ით %d.\n" -#: common.c:677 +#: common.c:717 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "მიღებულირáƒáƒ¡áƒ˜áƒœáƒ¥áƒ áƒáƒœáƒ£áƒšáƒ˜ გáƒáƒ¤áƒ áƒ—ხილებრ\"%s\" სერვერის პრáƒáƒªáƒ”სისგáƒáƒœ PID-ით %d.\n" -#: common.c:708 +#: common.c:748 #, c-format msgid "could not print result table: %m" msgstr "შედეგების ცხრილის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" -#: common.c:728 +#: common.c:768 #, c-format msgid "no rows returned for \\gset" msgstr "\\gset -სთვის მწკრივები áƒáƒ  დáƒáƒ‘რუნებულáƒ" -#: common.c:733 +#: common.c:773 #, c-format msgid "more than one row returned for \\gset" msgstr "\\gset -სთვის ერთზე მეტი მწკრივი დáƒáƒ‘რუნდáƒ" -#: common.c:751 +#: common.c:791 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "მცდელáƒáƒ‘áƒ, \\gset-ი სპეციáƒáƒšáƒ£áƒ  ცვლáƒáƒ“ზე (\"%s\") ყáƒáƒ¤áƒ˜áƒšáƒ˜áƒ§áƒ გáƒáƒ›áƒáƒ§áƒ”ნებული, იგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ" -#: common.c:1063 +#: common.c:1103 #, c-format msgid "" -"***(Single step mode: verify command)*******************************************\n" +"/**(Single step mode: verify command)******************************************/\n" "%s\n" -"***(press return to proceed or enter x and return to cancel)********************\n" +"/**(press return to proceed or enter x and return to cancel)*******************/\n" msgstr "" "***(ერთნáƒáƒ‘იჯიáƒáƒœáƒ˜ რეჟიმი: გáƒáƒ“áƒáƒáƒ›áƒáƒ¬áƒ›áƒ”თ ბრძáƒáƒœáƒ”ბáƒ)*******************************************\n" "%s\n" "***(დáƒáƒáƒ¬áƒ”ქით Enter-ს გáƒáƒ¡áƒáƒ’რძელებლáƒáƒ“. გáƒáƒ¡áƒáƒ£áƒ¥áƒ›áƒ”ბლáƒáƒ“ კი x-ს დრშემდეგ Enter-ს )********************\n" -#: common.c:1146 +#: common.c:1180 #, c-format msgid "STATEMENT: %s" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜: %s" -#: common.c:1182 +#: common.c:1216 #, c-format msgid "unexpected transaction status (%d)" msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ£áƒšáƒáƒ“ნელი სტáƒáƒ¢áƒ£áƒ¡áƒ˜ (%d)" -#: common.c:1335 describe.c:2026 +#: common.c:1362 describe.c:2025 msgid "Column" msgstr "სვეტი" -#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046 -#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027 -#: describe.c:3900 describe.c:4112 describe.c:4351 describe.c:4513 -#: describe.c:5788 +#: common.c:1363 describe.c:169 describe.c:355 describe.c:373 describe.c:1043 +#: describe.c:1201 describe.c:1731 describe.c:1755 describe.c:2026 +#: describe.c:3956 describe.c:4167 describe.c:4404 describe.c:4564 +#: describe.c:5829 msgid "Type" msgstr "ტიპი" -#: common.c:1385 +#: common.c:1412 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "ბრძáƒáƒœáƒ”ბáƒáƒ¡ შედეგები áƒáƒ  áƒáƒ¥áƒ•ს, áƒáƒœ შედეგებში სვეტები áƒáƒ áƒáƒ.\n" +#: common.c:1504 +#, c-format +msgid "fetching results in chunked mode failed" +msgstr "ნáƒáƒ’ლეჯების რეჟიმში შედეგების გáƒáƒ›áƒáƒ—ხáƒáƒ•რჩáƒáƒ•áƒáƒ áƒ“áƒ" + #: copy.c:98 #, c-format msgid "\\copy: arguments required" @@ -946,11 +983,6 @@ msgstr "\\copy: დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ: \"%s\"" msgid "\\copy: parse error at end of line" msgstr "\\copy: დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ ხáƒáƒ–ის ბáƒáƒšáƒáƒ¡áƒ—áƒáƒœ" -#: copy.c:326 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "ბრძáƒáƒœáƒ”ბის (\"%s\") შესრულების შეცდáƒáƒ›áƒ: %m" - #: copy.c:342 #, c-format msgid "could not stat file \"%s\": %m" @@ -988,340 +1020,341 @@ msgstr "" "შეიყვáƒáƒœáƒ”თ დáƒáƒ¡áƒáƒ™áƒáƒžáƒ˜áƒ áƒ”ბელიმ ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ— დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბული მáƒáƒœáƒáƒªáƒ”მები.\n" "დáƒáƒáƒ¡áƒ áƒ£áƒšáƒ”თ უკáƒáƒœáƒ ხáƒáƒ–ით დრწერტილით იგივე ხáƒáƒ–ში ხáƒáƒ–ით, áƒáƒœ EOF სიგნáƒáƒšáƒ˜áƒ—." -#: copy.c:682 +#: copy.c:684 msgid "aborted because of read failure" msgstr "დáƒáƒ¡áƒ áƒ£áƒšáƒ“რკითხვის შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ" -#: copy.c:716 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "კáƒáƒžáƒ˜áƒ áƒ”ბის რეჟიმიდáƒáƒœ გáƒáƒ›áƒáƒ¡áƒ•ლის მცდელáƒáƒ‘áƒ" -#: crosstabview.c:123 +#: crosstabview.c:124 #, c-format msgid "\\crosstabview: statement did not return a result set" msgstr "\\crosstabview: áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ›áƒ შედეგების სეტი áƒáƒ  დáƒáƒáƒ‘რუნáƒ" -#: crosstabview.c:129 +#: crosstabview.c:130 #, c-format msgid "\\crosstabview: query must return at least three columns" msgstr "\\crosstabview: მáƒáƒ—ხáƒáƒ•ნáƒáƒ› სულ ცáƒáƒ¢áƒ, სáƒáƒ›áƒ˜ სვეტი უნდრდáƒáƒáƒ‘რუნáƒáƒ¡" -#: crosstabview.c:156 +#: crosstabview.c:157 #, c-format msgid "\\crosstabview: vertical and horizontal headers must be different columns" msgstr "\\crosstabview: ვერტიკáƒáƒšáƒ£áƒ áƒ˜ დრჰáƒáƒ áƒ˜áƒ–áƒáƒœáƒ¢áƒáƒšáƒ£áƒ áƒ˜ თáƒáƒ•სáƒáƒ áƒ—ები სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რსვეტებში უნდრიყáƒáƒ¡" -#: crosstabview.c:172 +#: crosstabview.c:173 #, c-format msgid "\\crosstabview: data column must be specified when query returns more than three columns" msgstr "\\crosstabview: რáƒáƒªáƒ მáƒáƒ—ხáƒáƒ•ნრსáƒáƒ›áƒ–ე მეტ სვეტს áƒáƒ‘რუნებს, áƒáƒ¡áƒ”ვე სáƒáƒ­áƒ˜áƒ áƒáƒ მáƒáƒœáƒáƒªáƒ”მების სვეტის მითითებáƒ" -#: crosstabview.c:228 +#: crosstabview.c:229 #, c-format msgid "\\crosstabview: maximum number of columns (%d) exceeded" msgstr "\\crosstabview: გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულირსვეტების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘რ(%d)" -#: crosstabview.c:397 +#: crosstabview.c:398 #, c-format msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" msgstr "\\crosstabview: მáƒáƒ—ხáƒáƒ•ნის შედეგი მáƒáƒœáƒáƒªáƒ”მების მრáƒáƒ•áƒáƒš მნიშვნელáƒáƒ‘áƒáƒ¡ შეიცáƒáƒ•ს მწკრივისთვის \"%s\", სვეტი \"%s\"" -#: crosstabview.c:645 +#: crosstabview.c:646 #, c-format msgid "\\crosstabview: column number %d is out of range 1..%d" msgstr "\\crosstabview: სვეტის რიცხვი %d დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ 1..%d გáƒáƒ áƒ”თáƒáƒ" -#: crosstabview.c:670 +#: crosstabview.c:671 #, c-format msgid "\\crosstabview: ambiguous column name: \"%s\"" msgstr "\\crosstabview: სვეტის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ®áƒ”ლი: \"%s\"" -#: crosstabview.c:678 +#: crosstabview.c:679 #, c-format msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: სვეტის სáƒáƒ®áƒ”ლი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" -#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038 -#: describe.c:1189 describe.c:1264 describe.c:3889 describe.c:4099 -#: describe.c:4349 describe.c:4431 describe.c:4666 describe.c:4874 -#: describe.c:5116 describe.c:5360 describe.c:5430 describe.c:5441 -#: describe.c:5498 describe.c:5902 describe.c:5980 +#: describe.c:87 describe.c:335 describe.c:626 describe.c:802 describe.c:1035 +#: describe.c:1190 describe.c:1264 describe.c:3945 describe.c:4154 +#: describe.c:4402 describe.c:4483 describe.c:4715 describe.c:4921 +#: describe.c:5165 describe.c:5406 describe.c:5475 describe.c:5486 +#: describe.c:5542 describe.c:5941 describe.c:6018 msgid "Schema" msgstr "სქემáƒ" -#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631 -#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265 -#: describe.c:3890 describe.c:4100 describe.c:4265 describe.c:4350 -#: describe.c:4432 describe.c:4595 describe.c:4667 describe.c:4875 -#: describe.c:4988 describe.c:5117 describe.c:5361 describe.c:5431 -#: describe.c:5442 describe.c:5499 describe.c:5698 describe.c:5769 -#: describe.c:5978 describe.c:6207 describe.c:6515 +#: describe.c:88 describe.c:166 describe.c:227 describe.c:336 describe.c:627 +#: describe.c:803 describe.c:924 describe.c:1036 describe.c:1265 +#: describe.c:3946 describe.c:4155 describe.c:4319 describe.c:4403 +#: describe.c:4484 describe.c:4645 describe.c:4716 describe.c:4922 +#: describe.c:5038 describe.c:5166 describe.c:5407 describe.c:5476 +#: describe.c:5487 describe.c:5543 describe.c:5740 describe.c:5810 +#: describe.c:6016 describe.c:6243 describe.c:6551 msgid "Name" msgstr "სáƒáƒ®áƒ”ლი" -#: describe.c:89 describe.c:351 describe.c:369 +#: describe.c:89 describe.c:348 describe.c:366 msgid "Result data type" msgstr "შედეგის მáƒáƒœáƒáƒªáƒ”მების ტიპი" -#: describe.c:90 describe.c:352 describe.c:370 +#: describe.c:90 describe.c:349 describe.c:367 msgid "Argument data types" msgstr "áƒáƒ áƒ’უმენტის მáƒáƒœáƒáƒªáƒ”მების ტიპი" -#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418 -#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047 -#: describe.c:3682 describe.c:3944 describe.c:4146 describe.c:4289 -#: describe.c:4363 describe.c:4441 describe.c:4608 describe.c:4786 -#: describe.c:4924 describe.c:4997 describe.c:5118 describe.c:5269 -#: describe.c:5311 describe.c:5377 describe.c:5434 describe.c:5443 -#: describe.c:5500 describe.c:5716 describe.c:5791 describe.c:5916 -#: describe.c:5981 describe.c:7033 +#: describe.c:98 describe.c:105 describe.c:177 describe.c:241 describe.c:415 +#: describe.c:658 describe.c:818 describe.c:972 describe.c:1267 describe.c:2046 +#: describe.c:3676 describe.c:4000 describe.c:4201 describe.c:4343 +#: describe.c:4416 describe.c:4493 describe.c:4658 describe.c:4834 +#: describe.c:4975 describe.c:5047 describe.c:5167 describe.c:5317 +#: describe.c:5358 describe.c:5423 describe.c:5479 describe.c:5488 +#: describe.c:5544 describe.c:5758 describe.c:5832 describe.c:5955 +#: describe.c:6019 describe.c:7078 msgid "Description" msgstr "áƒáƒ¦áƒ¬áƒ”რáƒ" -#: describe.c:128 +#: describe.c:127 msgid "List of aggregate functions" msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქცების სიáƒ" -#: describe.c:153 +#: describe.c:152 #, c-format msgid "The server (version %s) does not support access methods." msgstr "სერვერს (ვერსირ%s) წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." -#: describe.c:168 +#: describe.c:167 msgid "Index" msgstr "ინდექსი" -#: describe.c:169 describe.c:3908 describe.c:4125 describe.c:5903 +#: describe.c:168 describe.c:3964 describe.c:4180 describe.c:5942 msgid "Table" msgstr "ცხრილი" -#: describe.c:177 describe.c:5700 +#: describe.c:176 describe.c:5742 msgid "Handler" msgstr "დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი" -#: describe.c:201 +#: describe.c:199 msgid "List of access methods" msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ების სიáƒ" -#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188 -#: describe.c:3901 describe.c:4101 describe.c:4266 describe.c:4597 -#: describe.c:4989 describe.c:5699 describe.c:5770 describe.c:6208 -#: describe.c:6396 describe.c:6516 describe.c:6673 describe.c:6759 -#: describe.c:7021 +#: describe.c:228 describe.c:401 describe.c:651 describe.c:925 describe.c:1189 +#: describe.c:3957 describe.c:4156 describe.c:4320 describe.c:4647 +#: describe.c:5039 describe.c:5741 describe.c:5811 describe.c:6244 +#: describe.c:6431 describe.c:6552 describe.c:6722 describe.c:6807 +#: describe.c:7066 msgid "Owner" msgstr "მფლáƒáƒ‘ელი" -#: describe.c:231 +#: describe.c:229 msgid "Location" msgstr "მდებáƒáƒ áƒ”áƒáƒ‘áƒ" -#: describe.c:241 describe.c:3517 +#: describe.c:239 describe.c:3517 describe.c:3857 msgid "Options" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები" -#: describe.c:242 describe.c:653 describe.c:972 describe.c:3943 +#: describe.c:240 describe.c:649 describe.c:970 describe.c:3999 msgid "Size" msgstr "ზáƒáƒ›áƒ" -#: describe.c:266 +#: describe.c:263 msgid "List of tablespaces" msgstr "ცხრილის სივრცეების სიáƒ" -#: describe.c:311 +#: describe.c:308 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df მხáƒáƒšáƒáƒ“ [anptwS+] -ს იღებს პáƒáƒ áƒáƒ›áƒ”ტრáƒáƒ“" -#: describe.c:319 +#: describe.c:316 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df - áƒáƒ  იღებს \"%c\" პáƒáƒ áƒáƒ›áƒ”ტრს, რáƒáƒªáƒ სერვერის ვერსიáƒáƒ %s" #. translator: "agg" is short for "aggregate" -#: describe.c:354 describe.c:372 +#: describe.c:351 describe.c:369 msgid "agg" msgstr "áƒáƒ’" -#: describe.c:355 describe.c:373 +#: describe.c:352 describe.c:370 msgid "window" msgstr "ფáƒáƒœáƒ¯áƒáƒ áƒ" -#: describe.c:356 +#: describe.c:353 msgid "proc" msgstr "პრáƒáƒª" -#: describe.c:357 describe.c:375 +#: describe.c:354 describe.c:372 msgid "func" msgstr "ფუნქც" -#: describe.c:374 describe.c:1397 +#: describe.c:371 describe.c:1397 msgid "trigger" msgstr "ტრიგერი" -#: describe.c:386 +#: describe.c:383 msgid "immutable" msgstr "დáƒáƒ£áƒ áƒ¦áƒ•ეველი" -#: describe.c:387 +#: describe.c:384 msgid "stable" msgstr "სტáƒáƒ‘ილური" -#: describe.c:388 +#: describe.c:385 msgid "volatile" msgstr "ცვáƒáƒšáƒ”ბáƒáƒ“ი" -#: describe.c:389 +#: describe.c:386 msgid "Volatility" msgstr "ცვáƒáƒšáƒ”ბáƒáƒ“áƒáƒ‘áƒ" -#: describe.c:397 +#: describe.c:394 msgid "restricted" msgstr "შეზღუდულიáƒ" -#: describe.c:398 +#: describe.c:395 msgid "safe" msgstr "უსáƒáƒ¤áƒ áƒ—ხáƒ" -#: describe.c:399 +#: describe.c:396 msgid "unsafe" -msgstr "სáƒáƒ®áƒ˜áƒ¤áƒáƒ—áƒ" +msgstr "unsafe" -#: describe.c:400 +#: describe.c:397 msgid "Parallel" msgstr "პáƒáƒ áƒáƒšáƒ”ლური" -#: describe.c:405 +#: describe.c:402 msgid "definer" msgstr "áƒáƒ¦áƒ›áƒ¬áƒ”რი" -#: describe.c:406 +#: describe.c:403 msgid "invoker" msgstr "ჩáƒáƒ›áƒ¬áƒáƒ“ებელი" -#: describe.c:407 +#: describe.c:404 msgid "Security" msgstr "უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბáƒ" -#: describe.c:412 +#: describe.c:409 msgid "Language" msgstr "ენáƒ" -#: describe.c:415 describe.c:652 +#: describe.c:412 describe.c:648 msgid "Internal name" msgstr "შიდრსáƒáƒ®áƒ”ლი" -#: describe.c:589 +#: describe.c:585 msgid "List of functions" msgstr "ფუნქციების სიáƒ" -#: describe.c:654 +#: describe.c:650 msgid "Elements" msgstr "ელემენტები" -#: describe.c:706 +#: describe.c:701 msgid "List of data types" msgstr "მáƒáƒœáƒáƒªáƒ”მების ტიპების სიáƒ" -#: describe.c:809 +#: describe.c:804 msgid "Left arg type" msgstr "მáƒáƒ áƒªáƒ®áƒ”ნრáƒáƒ áƒ’უმენტის ტიპი" -#: describe.c:810 +#: describe.c:805 msgid "Right arg type" msgstr "მáƒáƒ áƒ¯áƒ•ენრáƒáƒ áƒ’უმენტის ტიპი" -#: describe.c:811 +#: describe.c:806 msgid "Result type" msgstr "შედეგის ტიპი" -#: describe.c:816 describe.c:4603 describe.c:4769 describe.c:5268 -#: describe.c:6950 describe.c:6954 +#: describe.c:811 describe.c:4653 describe.c:4817 describe.c:5316 +#: describe.c:6996 describe.c:7000 msgid "Function" msgstr "ფუნქციáƒ" -#: describe.c:897 +#: describe.c:891 msgid "List of operators" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის სიáƒ" -#: describe.c:932 +#: describe.c:926 msgid "Encoding" msgstr "კáƒáƒ“ირებáƒ" -#: describe.c:936 describe.c:940 +#: describe.c:930 describe.c:934 msgid "Locale Provider" -msgstr "ენის მáƒáƒ›áƒ¬áƒáƒ“ებელი" +msgstr "ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ მáƒáƒ›áƒ¬áƒáƒ“ებელი" -#: describe.c:944 describe.c:4889 +#: describe.c:938 describe.c:4936 msgid "Collate" msgstr "დáƒáƒ¨áƒšáƒ" -#: describe.c:945 describe.c:4890 +#: describe.c:939 describe.c:4937 msgid "Ctype" msgstr "Ctype" -#: describe.c:949 describe.c:953 describe.c:4895 describe.c:4899 -msgid "ICU Locale" -msgstr "ICU ენáƒ" +#: describe.c:943 describe.c:947 describe.c:951 describe.c:4942 describe.c:4946 +#: describe.c:4950 +msgid "Locale" +msgstr "ლáƒáƒ™áƒáƒšáƒ˜" -#: describe.c:957 describe.c:961 describe.c:4904 describe.c:4908 +#: describe.c:955 describe.c:959 describe.c:4955 describe.c:4959 msgid "ICU Rules" msgstr "ICU წესები" -#: describe.c:973 +#: describe.c:971 msgid "Tablespace" msgstr "ცხრილების სივრცე" -#: describe.c:999 +#: describe.c:996 msgid "List of databases" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ების სიáƒ" -#: describe.c:1040 describe.c:1191 describe.c:3891 +#: describe.c:1037 describe.c:1192 describe.c:3947 msgid "table" msgstr "ცხრილი" -#: describe.c:1041 describe.c:3892 +#: describe.c:1038 describe.c:3948 msgid "view" msgstr "ხედი" -#: describe.c:1042 describe.c:3893 +#: describe.c:1039 describe.c:3949 msgid "materialized view" msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედი" -#: describe.c:1043 describe.c:1193 describe.c:3895 +#: describe.c:1040 describe.c:1194 describe.c:3951 msgid "sequence" msgstr "მიმდევრáƒáƒ‘áƒ" -#: describe.c:1044 describe.c:3897 +#: describe.c:1041 describe.c:3953 msgid "foreign table" msgstr "გáƒáƒ áƒ” ცხრილი" -#: describe.c:1045 describe.c:3898 describe.c:4110 +#: describe.c:1042 describe.c:3954 describe.c:4165 msgid "partitioned table" msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილი" -#: describe.c:1056 +#: describe.c:1058 msgid "Column privileges" msgstr "სვეტის წვდáƒáƒ›áƒ”ბი" -#: describe.c:1087 describe.c:1121 +#: describe.c:1089 describe.c:1123 msgid "Policies" msgstr "წესები" -#: describe.c:1150 describe.c:4519 describe.c:6618 +#: describe.c:1151 describe.c:4570 describe.c:6667 msgid "Access privileges" msgstr "წვდáƒáƒ›áƒ”ბი" -#: describe.c:1195 +#: describe.c:1196 msgid "function" msgstr "ფუნქციáƒ" -#: describe.c:1197 +#: describe.c:1198 msgid "type" msgstr "ტიპი" -#: describe.c:1199 +#: describe.c:1200 msgid "schema" -msgstr "სქემáƒ" +msgstr "schema" #: describe.c:1222 msgid "Default access privileges" @@ -1349,295 +1382,295 @@ msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜" #: describe.c:1375 msgid "rule" -msgstr "წესი" +msgstr "rule" -#: describe.c:1421 +#: describe.c:1420 msgid "Object descriptions" msgstr "áƒáƒ‘იექტების áƒáƒ¦áƒ¬áƒ”რáƒ" -#: describe.c:1486 describe.c:4016 +#: describe.c:1485 describe.c:4072 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "ურთიერთáƒáƒ‘რსáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს." -#: describe.c:1489 describe.c:4019 +#: describe.c:1488 describe.c:4075 #, c-format msgid "Did not find any relations." msgstr "ურთიერთáƒáƒ‘ები ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ." -#: describe.c:1685 +#: describe.c:1684 #, c-format msgid "Did not find any relation with OID %s." msgstr "ურთიერთáƒáƒ‘ები, რáƒáƒ›áƒšáƒ˜áƒ¡ OID=%s, áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს." -#: describe.c:1733 describe.c:1757 +#: describe.c:1732 describe.c:1756 msgid "Start" msgstr "დáƒáƒ¬áƒ§áƒ”ბáƒ" -#: describe.c:1734 describe.c:1758 +#: describe.c:1733 describe.c:1757 msgid "Minimum" msgstr "მინიმუმი" -#: describe.c:1735 describe.c:1759 +#: describe.c:1734 describe.c:1758 msgid "Maximum" msgstr "მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ˜" -#: describe.c:1736 describe.c:1760 +#: describe.c:1735 describe.c:1759 msgid "Increment" msgstr "გáƒáƒ–რდáƒ" -#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4435 -#: describe.c:4780 describe.c:4913 describe.c:4918 describe.c:6661 +#: describe.c:1736 describe.c:1760 describe.c:1889 describe.c:4487 +#: describe.c:4828 describe.c:4964 describe.c:4969 describe.c:6710 msgid "yes" msgstr "დიáƒáƒ®" -#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4435 -#: describe.c:4777 describe.c:4913 describe.c:6662 +#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4487 +#: describe.c:4825 describe.c:4964 describe.c:6711 msgid "no" msgstr "áƒáƒ áƒ" -#: describe.c:1739 describe.c:1763 +#: describe.c:1738 describe.c:1762 msgid "Cycles?" msgstr "ციკლები?" -#: describe.c:1740 describe.c:1764 +#: describe.c:1739 describe.c:1763 msgid "Cache" msgstr "კეში" -#: describe.c:1805 +#: describe.c:1804 #, c-format msgid "Owned by: %s" msgstr "მფლáƒáƒ‘ელი: %s" -#: describe.c:1809 +#: describe.c:1808 #, c-format msgid "Sequence for identity column: %s" msgstr "იდენტიფიკáƒáƒªáƒ˜áƒ˜áƒ¡ სვეტის მიმდევრáƒáƒ‘áƒ: %s" -#: describe.c:1817 +#: describe.c:1816 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი მიმდევრáƒáƒ›áƒ \"%s.%s\"" -#: describe.c:1820 +#: describe.c:1819 #, c-format msgid "Sequence \"%s.%s\"" msgstr "მიმდევრáƒáƒ‘რ\"%s.%s\"" -#: describe.c:1963 +#: describe.c:1962 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი ცხრილი \"%s.%s\"" -#: describe.c:1966 +#: describe.c:1965 #, c-format msgid "Table \"%s.%s\"" msgstr "ცხრილი \"%s.%s\"" -#: describe.c:1970 +#: describe.c:1969 #, c-format msgid "View \"%s.%s\"" msgstr "ხედი \"%s.%s\"" -#: describe.c:1975 +#: describe.c:1974 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედი \"%s.%s\"" -#: describe.c:1978 +#: describe.c:1977 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედი \"%s.%s\"" -#: describe.c:1983 +#: describe.c:1982 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი ინდექსი \"%s.%s\"" -#: describe.c:1986 +#: describe.c:1985 #, c-format msgid "Index \"%s.%s\"" msgstr "ინდექსი \"%s.%s\"" -#: describe.c:1991 +#: describe.c:1990 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ინდექსი \"%s.%s\"" -#: describe.c:1994 +#: describe.c:1993 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ინდექი \"%s.%s\"" -#: describe.c:1998 +#: describe.c:1997 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST ცხრილი \"%s.%s\"" -#: describe.c:2002 +#: describe.c:2001 #, c-format msgid "Composite type \"%s.%s\"" msgstr "კáƒáƒ›áƒžáƒáƒ–იტის ტიპი \"%s.%s\"" -#: describe.c:2006 +#: describe.c:2005 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "გáƒáƒ áƒ” ცხრილი \"%s.%s\"" -#: describe.c:2011 +#: describe.c:2010 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილი \"%s.%s\"" -#: describe.c:2014 +#: describe.c:2013 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილი \"%s.%s\"" -#: describe.c:2030 describe.c:4352 +#: describe.c:2029 describe.c:4405 msgid "Collation" msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ" -#: describe.c:2031 describe.c:4353 +#: describe.c:2030 describe.c:4406 msgid "Nullable" msgstr "გáƒáƒœáƒ£áƒšáƒ”ბáƒáƒ“ი" -#: describe.c:2032 describe.c:4354 +#: describe.c:2031 describe.c:4407 msgid "Default" msgstr "ნáƒáƒ’ულისხმევი" -#: describe.c:2035 +#: describe.c:2034 msgid "Key?" msgstr "გáƒáƒ¡áƒáƒ¦áƒ”ბი?" -#: describe.c:2037 describe.c:4674 describe.c:4685 +#: describe.c:2036 describe.c:4723 describe.c:4734 msgid "Definition" msgstr "გáƒáƒœáƒ›áƒáƒ áƒ¢áƒ”ბáƒ" -#: describe.c:2039 describe.c:5715 describe.c:5790 describe.c:5856 -#: describe.c:5915 +#: describe.c:2038 describe.c:5757 describe.c:5831 describe.c:5896 +#: describe.c:5954 msgid "FDW options" msgstr "FDW -ის მáƒáƒ áƒ’ებáƒ" -#: describe.c:2041 +#: describe.c:2040 msgid "Storage" msgstr "სáƒáƒªáƒáƒ•ი" -#: describe.c:2043 +#: describe.c:2042 msgid "Compression" msgstr "შეკუმშვáƒ" -#: describe.c:2045 +#: describe.c:2044 msgid "Stats target" msgstr "სáƒáƒ›áƒ˜áƒ–ნის სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ" -#: describe.c:2181 +#: describe.c:2180 #, c-format msgid "Partition of: %s %s%s" msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜: %s %s%s" -#: describe.c:2194 +#: describe.c:2193 msgid "No partition constraint" msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ შეზღუდვების გáƒáƒ áƒ”შე" -#: describe.c:2196 +#: describe.c:2195 #, c-format msgid "Partition constraint: %s" msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ შეზღუდვáƒ: %s" -#: describe.c:2220 +#: describe.c:2219 #, c-format msgid "Partition key: %s" msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ¡ გáƒáƒ¡áƒáƒ¦áƒ”ბი: %s" -#: describe.c:2246 +#: describe.c:2245 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "ცხრილის მფლáƒáƒ‘ელი: \"%s.%s\"" -#: describe.c:2315 +#: describe.c:2314 msgid "primary key, " msgstr "ძირითáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბი. " -#: describe.c:2318 +#: describe.c:2317 msgid "unique" msgstr "უნიკáƒáƒšáƒ£áƒ áƒ˜" -#: describe.c:2320 +#: describe.c:2319 msgid " nulls not distinct" msgstr " ნულები გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ებული áƒáƒ áƒáƒ" -#: describe.c:2321 +#: describe.c:2320 msgid ", " msgstr ", " -#: describe.c:2328 +#: describe.c:2327 #, c-format msgid "for table \"%s.%s\"" msgstr "ცხრილისთვის \"%s.%s\"" -#: describe.c:2332 +#: describe.c:2331 #, c-format msgid ", predicate (%s)" msgstr ", პრედიკáƒáƒ¢áƒ˜ (%s)" -#: describe.c:2335 +#: describe.c:2334 msgid ", clustered" msgstr ", დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებული" -#: describe.c:2338 +#: describe.c:2337 msgid ", invalid" msgstr ", áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜" -#: describe.c:2341 +#: describe.c:2340 msgid ", deferrable" msgstr ", deferrable" -#: describe.c:2344 +#: describe.c:2343 msgid ", initially deferred" msgstr ", თáƒáƒ•იდáƒáƒœ გáƒáƒ“áƒáƒ“ებული" -#: describe.c:2347 +#: describe.c:2346 msgid ", replica identity" msgstr ", რეპლიკის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜" -#: describe.c:2401 +#: describe.c:2400 msgid "Indexes:" msgstr "ინდექსები:" -#: describe.c:2484 +#: describe.c:2483 msgid "Check constraints:" msgstr "შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ შეზღუდვები:" -#: describe.c:2552 +#: describe.c:2551 msgid "Foreign-key constraints:" msgstr "გáƒáƒ áƒ”-გáƒáƒ¡áƒáƒ¦áƒ”ბის შეზღუდვები:" -#: describe.c:2615 +#: describe.c:2614 msgid "Referenced by:" msgstr "ბმული გáƒáƒ áƒ”დáƒáƒœ:" -#: describe.c:2665 +#: describe.c:2664 msgid "Policies:" msgstr "წესები:" -#: describe.c:2668 +#: describe.c:2667 msgid "Policies (forced row security enabled):" msgstr "წესები (მწკრივების გáƒáƒ«áƒšáƒ˜áƒ”რებული დáƒáƒªáƒ•რჩáƒáƒ áƒ—ულიáƒ):" -#: describe.c:2671 +#: describe.c:2670 msgid "Policies (row security enabled): (none)" msgstr "წესები (მწკრივების დáƒáƒªáƒ•რჩáƒáƒ áƒ—ულიáƒ): (áƒáƒ áƒªáƒ”რთი)" -#: describe.c:2674 +#: describe.c:2673 msgid "Policies (forced row security enabled): (none)" msgstr "წესები (მწკრივების გáƒáƒ«áƒšáƒ˜áƒ”რებული დáƒáƒªáƒ•რჩáƒáƒ áƒ—ულიáƒ: (áƒáƒ áƒªáƒ”რთი)" -#: describe.c:2677 +#: describe.c:2676 msgid "Policies (row security disabled):" msgstr "წესები (მწკრივების უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბრგáƒáƒ›áƒáƒ áƒ—ულიáƒ)" -#: describe.c:2737 describe.c:2841 +#: describe.c:2736 describe.c:2841 msgid "Statistics objects:" msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ‘იექტები:" @@ -1657,7 +1690,7 @@ msgstr "ყáƒáƒ•ელთვის გáƒáƒ¨áƒ•ებáƒáƒ“ი წესებ msgid "Rules firing on replica only:" msgstr "მხáƒáƒšáƒáƒ“ რეპლიკáƒáƒ–ე გáƒáƒ¨áƒ•ებáƒáƒ“ი წესები:" -#: describe.c:3031 describe.c:5051 +#: describe.c:3031 describe.c:5100 msgid "Publications:" msgstr "გáƒáƒ›áƒáƒªáƒ”მები:" @@ -1712,11 +1745,11 @@ msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ”ბის რიცხვი: %d (სიის #: describe.c:3430 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" -msgstr "შვილეული ცხრილების რიცხვი: %d (სიის გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \\d+ )" +msgstr "შვილი ცხრილების რიცხვი: %d (სიის გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒáƒ“ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \\d+ )" #: describe.c:3437 msgid "Child tables" -msgstr "შვილეული ცხრილები" +msgstr "შვილი ცხრილები" #: describe.c:3437 msgid "Partitions" @@ -1752,446 +1785,450 @@ msgstr "ცხრილების სივრცე: \"%s\"" msgid ", tablespace \"%s\"" msgstr ", ცხრილების სივრცე: \"%s\"" -#: describe.c:3674 +#: describe.c:3670 msgid "List of roles" msgstr "რáƒáƒšáƒ”ბის სიáƒ" -#: describe.c:3676 +#: describe.c:3672 describe.c:3840 msgid "Role name" msgstr "რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი" -#: describe.c:3677 +#: describe.c:3673 msgid "Attributes" msgstr "áƒáƒ¢áƒ áƒ˜áƒ‘უტები" -#: describe.c:3679 -msgid "Member of" -msgstr "წáƒáƒ áƒ›áƒáƒáƒ“გენს წევრს" - -#: describe.c:3690 +#: describe.c:3684 msgid "Superuser" msgstr "ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი" -#: describe.c:3693 +#: describe.c:3687 msgid "No inheritance" msgstr "მემკვიდრეáƒáƒ‘ითáƒáƒ‘ის გáƒáƒ áƒ”შე" -#: describe.c:3696 +#: describe.c:3690 msgid "Create role" msgstr "რáƒáƒšáƒ˜áƒ¡ შექმნáƒ" -#: describe.c:3699 +#: describe.c:3693 msgid "Create DB" msgstr "ბáƒáƒ–ის შექმნáƒ" -#: describe.c:3702 +#: describe.c:3696 msgid "Cannot login" msgstr "შესვლრშეუძლებელიáƒ" -#: describe.c:3705 +#: describe.c:3699 msgid "Replication" msgstr "რეპლიკáƒáƒªáƒ˜áƒ" -#: describe.c:3709 +#: describe.c:3703 msgid "Bypass RLS" msgstr "RLS-ის გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" -#: describe.c:3718 +#: describe.c:3712 msgid "No connections" msgstr "შეერთებების გáƒáƒ áƒ”შე" -#: describe.c:3720 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d შეერთებáƒ" msgstr[1] "%d შეერთებáƒ" -#: describe.c:3730 +#: describe.c:3724 msgid "Password valid until " msgstr "პáƒáƒ áƒáƒšáƒ¡ ვáƒáƒ“რ" -#: describe.c:3780 +#: describe.c:3775 msgid "Role" msgstr "რáƒáƒšáƒ˜" -#: describe.c:3781 +#: describe.c:3776 msgid "Database" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–áƒ" -#: describe.c:3782 +#: describe.c:3777 msgid "Settings" msgstr "მáƒáƒ áƒ’ებáƒ" -#: describe.c:3785 -msgid "User set" -msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი დáƒáƒ§áƒ”ნებულიáƒ" - -#: describe.c:3812 +#: describe.c:3801 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "რáƒáƒšáƒ˜áƒ¡áƒ—ვის \"%s\" დრბáƒáƒ–ისთვის \"%s\" პáƒáƒ áƒáƒ›áƒ”ტრები ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ." -#: describe.c:3815 +#: describe.c:3804 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "რáƒáƒšáƒ˜áƒ¡áƒ—ვის (\"%s\") პáƒáƒ áƒáƒ›áƒ”ტრები ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ." -#: describe.c:3818 +#: describe.c:3807 #, c-format msgid "Did not find any settings." msgstr "პáƒáƒ áƒáƒ›áƒ”ტრები ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ." -#: describe.c:3823 +#: describe.c:3811 msgid "List of settings" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრების სიáƒ" -#: describe.c:3894 +#: describe.c:3841 +msgid "Member of" +msgstr "წáƒáƒ áƒ›áƒáƒáƒ“გენს წევრს" + +#: describe.c:3858 +msgid "Grantor" +msgstr "მიმნიჭებელი" + +#: describe.c:3884 +msgid "List of role grants" +msgstr "რáƒáƒšáƒ”ბის მინიჭებების სიáƒ" + +#: describe.c:3950 msgid "index" msgstr "ინდექსი" -#: describe.c:3896 +#: describe.c:3952 msgid "TOAST table" msgstr "TOAST ცხრილი" -#: describe.c:3899 describe.c:4111 +#: describe.c:3955 describe.c:4166 msgid "partitioned index" msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ინდექსი" -#: describe.c:3919 +#: describe.c:3975 msgid "permanent" msgstr "მუდმივი" -#: describe.c:3920 +#: describe.c:3976 msgid "temporary" msgstr "დრáƒáƒ”ბითი" -#: describe.c:3921 +#: describe.c:3977 msgid "unlogged" msgstr "ჟურნáƒáƒšáƒ¨áƒ˜ áƒáƒ -ჩáƒáƒ¬áƒ”რილი" -#: describe.c:3922 +#: describe.c:3978 msgid "Persistence" msgstr "შენáƒáƒ®áƒ•áƒ" -#: describe.c:3938 +#: describe.c:3994 msgid "Access method" msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ი" -#: describe.c:4024 +#: describe.c:4079 msgid "List of relations" msgstr "ურთიერთáƒáƒ‘ების სიáƒ" -#: describe.c:4072 +#: describe.c:4127 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "სერვერს (ვერსირ%s) ცხრილების დეკლáƒáƒ áƒáƒ¢áƒ˜áƒ£áƒš დáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." -#: describe.c:4083 +#: describe.c:4138 msgid "List of partitioned indexes" msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ინდექსების სიáƒ" -#: describe.c:4085 +#: describe.c:4140 msgid "List of partitioned tables" msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ცხრილების სიáƒ" -#: describe.c:4089 +#: describe.c:4144 msgid "List of partitioned relations" msgstr "დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ურთიერთáƒáƒ‘ების სიáƒ" -#: describe.c:4120 +#: describe.c:4175 msgid "Parent name" msgstr "მშáƒáƒ‘ლის სáƒáƒ®áƒ”ლი" -#: describe.c:4133 +#: describe.c:4188 msgid "Leaf partition size" msgstr "ბáƒáƒšáƒ დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡ ზáƒáƒ›áƒ" -#: describe.c:4136 describe.c:4142 +#: describe.c:4191 describe.c:4197 msgid "Total size" msgstr "ჯáƒáƒ›áƒ£áƒ áƒ˜ ზáƒáƒ›áƒ" -#: describe.c:4267 +#: describe.c:4321 msgid "Trusted" msgstr "სáƒáƒœáƒ“áƒ" -#: describe.c:4276 +#: describe.c:4330 msgid "Internal language" msgstr "შიდრენáƒ" -#: describe.c:4277 +#: describe.c:4331 msgid "Call handler" msgstr "გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი" -#: describe.c:4278 describe.c:5701 +#: describe.c:4332 describe.c:5743 msgid "Validator" msgstr "შემმáƒáƒ¬áƒ›áƒ”ბელი" -#: describe.c:4279 +#: describe.c:4333 msgid "Inline handler" msgstr "ჩáƒáƒ“გმული კáƒáƒ“ის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი" -#: describe.c:4314 +#: describe.c:4367 msgid "List of languages" msgstr "ენების სიáƒ" -#: describe.c:4355 +#: describe.c:4408 msgid "Check" msgstr "შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: describe.c:4399 +#: describe.c:4451 msgid "List of domains" msgstr "დáƒáƒ›áƒ”ნების სიáƒ" -#: describe.c:4433 +#: describe.c:4485 msgid "Source" msgstr "წყáƒáƒ áƒ" -#: describe.c:4434 +#: describe.c:4486 msgid "Destination" msgstr "დáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ”ბáƒ" -#: describe.c:4436 describe.c:6663 +#: describe.c:4488 describe.c:6712 msgid "Default?" msgstr "ნáƒáƒ’ულისხმები?" -#: describe.c:4478 +#: describe.c:4529 msgid "List of conversions" msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ”ბის სიáƒ" -#: describe.c:4506 +#: describe.c:4557 msgid "Parameter" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი" -#: describe.c:4507 +#: describe.c:4558 msgid "Value" msgstr "მნიშვნელáƒáƒ‘áƒ" -#: describe.c:4514 +#: describe.c:4565 msgid "Context" msgstr "კáƒáƒœáƒ¢áƒ”ქსტი" -#: describe.c:4547 +#: describe.c:4597 msgid "List of configuration parameters" msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების სიáƒ" -#: describe.c:4549 +#: describe.c:4599 msgid "List of non-default configuration parameters" msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒáƒœáƒáƒ’ულისხმებáƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრების სიáƒ" -#: describe.c:4576 +#: describe.c:4626 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "სერვერს (ვერსირ%s) მáƒáƒ•ლენის ტრიგერების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." -#: describe.c:4596 +#: describe.c:4646 msgid "Event" msgstr "მáƒáƒ•ლენáƒ" -#: describe.c:4598 +#: describe.c:4648 msgid "enabled" msgstr "ჩáƒáƒ áƒ—ულიáƒ" -#: describe.c:4599 +#: describe.c:4649 msgid "replica" -msgstr "რეპლიკáƒ" +msgstr "replica" -#: describe.c:4600 +#: describe.c:4650 msgid "always" msgstr "ყáƒáƒ•ელთვის" -#: describe.c:4601 +#: describe.c:4651 msgid "disabled" msgstr "გáƒáƒ›áƒáƒ áƒ—ულიáƒ" -#: describe.c:4602 describe.c:6517 +#: describe.c:4652 describe.c:6553 msgid "Enabled" msgstr "ჩáƒáƒ áƒ—ულიáƒ" -#: describe.c:4604 +#: describe.c:4654 msgid "Tags" msgstr "ჭდეები" -#: describe.c:4628 +#: describe.c:4677 msgid "List of event triggers" msgstr "მáƒáƒ•ლენების ტრიგერების სიáƒ" -#: describe.c:4655 +#: describe.c:4704 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "სერვერს (ვერსირ%s) გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." -#: describe.c:4692 +#: describe.c:4741 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4693 +#: describe.c:4742 msgid "Dependencies" msgstr "დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებები" -#: describe.c:4703 +#: describe.c:4752 msgid "MCV" msgstr "MCV" -#: describe.c:4727 +#: describe.c:4775 msgid "List of extended statistics" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ სიáƒ" -#: describe.c:4754 +#: describe.c:4802 msgid "Source type" msgstr "წყáƒáƒ áƒáƒ¡ ტიპი" -#: describe.c:4755 +#: describe.c:4803 msgid "Target type" msgstr "სáƒáƒ›áƒ˜áƒ–ნის ტიპი" -#: describe.c:4779 +#: describe.c:4827 msgid "in assignment" msgstr "მინიჭებáƒáƒ¨áƒ˜" -#: describe.c:4781 +#: describe.c:4829 msgid "Implicit?" msgstr "áƒáƒ¨áƒ™áƒáƒ áƒ?" -#: describe.c:4840 +#: describe.c:4887 msgid "List of casts" msgstr "კáƒáƒ¡áƒ¢áƒ”ბის სიáƒ" -#: describe.c:4880 describe.c:4884 +#: describe.c:4927 describe.c:4931 msgid "Provider" msgstr "სერვისის მáƒáƒ›áƒ¬áƒáƒ“ებელი" -#: describe.c:4914 describe.c:4919 +#: describe.c:4965 describe.c:4970 msgid "Deterministic?" msgstr "დეტერმნისტული?" -#: describe.c:4959 +#: describe.c:5009 msgid "List of collations" msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ”ბის სიáƒ" -#: describe.c:5021 +#: describe.c:5070 msgid "List of schemas" msgstr "სქემების სიáƒ" -#: describe.c:5138 +#: describe.c:5186 msgid "List of text search parsers" msgstr "ტექსტური ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლების სიáƒ" -#: describe.c:5188 +#: describe.c:5236 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი სáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს." -#: describe.c:5191 +#: describe.c:5239 #, c-format msgid "Did not find any text search parsers." msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლები ვერ ვიპáƒáƒ•ე." -#: describe.c:5266 +#: describe.c:5314 msgid "Start parse" msgstr "დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების დáƒáƒ¬áƒ§áƒ”ბáƒ" -#: describe.c:5267 +#: describe.c:5315 msgid "Method" msgstr "მეთáƒáƒ“ი" -#: describe.c:5271 +#: describe.c:5319 msgid "Get next token" msgstr "შემდეგი კáƒáƒ“ის მიღებáƒ" -#: describe.c:5273 +#: describe.c:5321 msgid "End parse" msgstr "დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" -#: describe.c:5275 +#: describe.c:5323 msgid "Get headline" msgstr "áƒáƒ›áƒáƒœáƒáƒ¬áƒ”რის მიღებáƒ" -#: describe.c:5277 +#: describe.c:5325 msgid "Get token types" msgstr "კáƒáƒ“ის ტიპების მიღებáƒ" -#: describe.c:5288 +#: describe.c:5335 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი \"%s.%s\"" -#: describe.c:5291 +#: describe.c:5338 #, c-format msgid "Text search parser \"%s\"" msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი \"%s\"" -#: describe.c:5310 +#: describe.c:5357 msgid "Token name" msgstr "კáƒáƒ“ის სáƒáƒ®áƒ”ლი" -#: describe.c:5324 +#: describe.c:5370 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "კáƒáƒ“ის ტიპები დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლისთვის \"%s.%s\"" -#: describe.c:5327 +#: describe.c:5373 #, c-format msgid "Token types for parser \"%s\"" msgstr "კáƒáƒ“ის ტიპები დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლისთვის \"%s\"" -#: describe.c:5371 +#: describe.c:5417 msgid "Template" msgstr "ნიმუში" -#: describe.c:5372 +#: describe.c:5418 msgid "Init options" msgstr "ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები" -#: describe.c:5399 +#: describe.c:5444 msgid "List of text search dictionaries" msgstr "ტექსტის ძებნის ლექსიკáƒáƒœáƒ”ბის სიáƒ" -#: describe.c:5432 +#: describe.c:5477 msgid "Init" msgstr "ერთეული" -#: describe.c:5433 +#: describe.c:5478 msgid "Lexize" msgstr "ლექსით გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ" -#: describe.c:5465 +#: describe.c:5509 msgid "List of text search templates" msgstr "ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ”ბის სიáƒ" -#: describe.c:5520 +#: describe.c:5563 msgid "List of text search configurations" msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბის სიáƒ" -#: describe.c:5571 +#: describe.c:5614 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ სáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს." -#: describe.c:5574 +#: describe.c:5617 #, c-format msgid "Did not find any text search configurations." msgstr "ტექსტის ძებნის áƒáƒ áƒªáƒ”რთი კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ." -#: describe.c:5640 +#: describe.c:5683 msgid "Token" msgstr "ტáƒáƒ™áƒ”ნი" -#: describe.c:5641 +#: describe.c:5684 msgid "Dictionaries" msgstr "ლექსიკáƒáƒœáƒ”ბი" -#: describe.c:5652 +#: describe.c:5695 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ \"%s.%s\"" -#: describe.c:5655 +#: describe.c:5698 #, c-format msgid "Text search configuration \"%s\"" msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ \"%s\"" -#: describe.c:5659 +#: describe.c:5702 #, c-format msgid "" "\n" @@ -2200,7 +2237,7 @@ msgstr "" "\n" "დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი: \"%s.%s\"" -#: describe.c:5662 +#: describe.c:5705 #, c-format msgid "" "\n" @@ -2209,261 +2246,273 @@ msgstr "" "\n" "დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებელი: \"%s\"" -#: describe.c:5743 +#: describe.c:5784 msgid "List of foreign-data wrappers" msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ”ბის სიáƒ" -#: describe.c:5771 +#: describe.c:5812 msgid "Foreign-data wrapper" msgstr "გáƒáƒ áƒ”-მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜" -#: describe.c:5789 describe.c:5979 +#: describe.c:5830 describe.c:6017 msgid "Version" msgstr "ვერსიáƒ" -#: describe.c:5820 +#: describe.c:5860 msgid "List of foreign servers" msgstr "გáƒáƒ áƒ” სერვერების სიáƒ" -#: describe.c:5845 describe.c:5904 +#: describe.c:5885 describe.c:5943 msgid "Server" msgstr "სერვერი" -#: describe.c:5846 +#: describe.c:5886 msgid "User name" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი" -#: describe.c:5876 +#: describe.c:5915 msgid "List of user mappings" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების მიმáƒáƒ’რებების სიáƒ" -#: describe.c:5949 +#: describe.c:5987 msgid "List of foreign tables" msgstr "გáƒáƒ áƒ” ცხრილების სიáƒ" -#: describe.c:6001 +#: describe.c:6038 msgid "List of installed extensions" msgstr "დáƒáƒ§áƒ”ნებული გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების სიáƒ" -#: describe.c:6049 +#: describe.c:6086 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრსáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს." -#: describe.c:6052 +#: describe.c:6089 #, c-format msgid "Did not find any extensions." msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების პáƒáƒ•ნრშეუძლებელიáƒ." -#: describe.c:6096 +#: describe.c:6133 msgid "Object description" msgstr "áƒáƒ‘იექტის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: describe.c:6106 +#: describe.c:6142 #, c-format msgid "Objects in extension \"%s\"" msgstr "áƒáƒ‘იექტები გáƒáƒ¤áƒáƒ áƒ—ებáƒáƒ¨áƒ˜ \"%s\"" -#: describe.c:6147 +#: describe.c:6183 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სრული სáƒáƒ®áƒ”ლი (ძáƒáƒšáƒ˜áƒáƒœ ბევრი წერტილიáƒáƒœáƒ˜ სáƒáƒ®áƒ”ლი): %s" -#: describe.c:6161 +#: describe.c:6197 #, c-format msgid "cross-database references are not implemented: %s" msgstr "ბáƒáƒ–ებს შáƒáƒ áƒ˜áƒ¡ ბმულები გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ: %s" -#: describe.c:6192 describe.c:6319 +#: describe.c:6228 describe.c:6354 #, c-format msgid "The server (version %s) does not support publications." msgstr "სერვერს (ვერსირ%s) გáƒáƒ›áƒáƒªáƒ”მების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." -#: describe.c:6209 describe.c:6397 +#: describe.c:6245 describe.c:6432 msgid "All tables" msgstr "ყველრცხრილი" -#: describe.c:6210 describe.c:6398 +#: describe.c:6246 describe.c:6433 msgid "Inserts" msgstr "ჩáƒáƒ¡áƒ›áƒ”ბი" -#: describe.c:6211 describe.c:6399 +#: describe.c:6247 describe.c:6434 msgid "Updates" msgstr "გáƒáƒœáƒáƒ®áƒšáƒ”ბები" -#: describe.c:6212 describe.c:6400 +#: describe.c:6248 describe.c:6435 msgid "Deletes" msgstr "წáƒáƒ¨áƒšáƒ”ბი" -#: describe.c:6216 describe.c:6402 +#: describe.c:6252 describe.c:6437 msgid "Truncates" msgstr "შეკვეცები" -#: describe.c:6220 describe.c:6404 +#: describe.c:6256 describe.c:6439 msgid "Via root" msgstr "Root-ის გáƒáƒ•ლით" -#: describe.c:6242 +#: describe.c:6277 msgid "List of publications" msgstr "გáƒáƒ›áƒáƒªáƒ”მების სიáƒ" -#: describe.c:6366 +#: describe.c:6401 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "გáƒáƒ›áƒáƒªáƒ”მრსáƒáƒ®áƒ”ლით \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს." -#: describe.c:6369 +#: describe.c:6404 #, c-format msgid "Did not find any publications." msgstr "გáƒáƒ›áƒáƒªáƒ”მების გáƒáƒ áƒ”შე." -#: describe.c:6393 +#: describe.c:6428 #, c-format msgid "Publication %s" msgstr "პუბლიკáƒáƒªáƒ˜áƒ %s" -#: describe.c:6446 +#: describe.c:6481 msgid "Tables:" msgstr "ცხრილები:" -#: describe.c:6458 +#: describe.c:6493 msgid "Tables from schemas:" msgstr "ცხრილები სქემებიდáƒáƒœ:" -#: describe.c:6502 +#: describe.c:6538 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "სერვერს (ვერსირ%s) გáƒáƒ›áƒáƒ¬áƒ”რების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." -#: describe.c:6518 +#: describe.c:6554 msgid "Publication" msgstr "გáƒáƒ›áƒáƒªáƒ”ბáƒ" -#: describe.c:6527 +#: describe.c:6563 msgid "Binary" msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜" -#: describe.c:6536 describe.c:6540 +#: describe.c:6572 describe.c:6576 msgid "Streaming" msgstr "გáƒáƒáƒ“áƒáƒªáƒ”მáƒ" -#: describe.c:6548 +#: describe.c:6584 msgid "Two-phase commit" msgstr "áƒáƒ -ფáƒáƒ–იáƒáƒœáƒ˜ გáƒáƒ“áƒáƒªáƒ”მáƒ" -#: describe.c:6549 +#: describe.c:6585 msgid "Disable on error" msgstr "გáƒáƒ›áƒáƒ áƒ—ვრშეცდáƒáƒ›áƒ˜áƒ¡ შემთხვევáƒáƒ¨áƒ˜" -#: describe.c:6555 +#: describe.c:6592 msgid "Origin" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜" -#: describe.c:6556 -msgid "Run as Owner?" +#: describe.c:6593 +msgid "Password required" +msgstr "პáƒáƒ áƒáƒšáƒ˜ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" + +#: describe.c:6594 +msgid "Run as owner?" msgstr "გáƒáƒ•უშვრმფლáƒáƒ‘ელით?" -#: describe.c:6561 +#: describe.c:6599 +msgid "Failover" +msgstr "გáƒáƒ“áƒáƒ áƒ—ვáƒ" + +#: describe.c:6604 msgid "Synchronous commit" msgstr "სინქრáƒáƒœáƒ£áƒšáƒ˜ გáƒáƒ“áƒáƒ’ზáƒáƒ•ნáƒ" -#: describe.c:6562 +#: describe.c:6605 msgid "Conninfo" msgstr "შეერთ. ინფáƒ" -#: describe.c:6568 +#: describe.c:6611 msgid "Skip LSN" msgstr "LSN-ის გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" -#: describe.c:6595 +#: describe.c:6637 msgid "List of subscriptions" msgstr "გáƒáƒ›áƒáƒ¬áƒ”რების სიáƒ" -#: describe.c:6657 describe.c:6753 describe.c:6846 describe.c:6941 +#: describe.c:6666 +msgid "(none)" +msgstr "(áƒáƒ áƒªáƒ”რთი)" + +#: describe.c:6706 describe.c:6801 describe.c:6893 describe.c:6987 msgid "AM" msgstr "AM" -#: describe.c:6658 +#: describe.c:6707 msgid "Input type" msgstr "შეყვáƒáƒœáƒ˜áƒ¡ ტიპი" -#: describe.c:6659 +#: describe.c:6708 msgid "Storage type" msgstr "სáƒáƒªáƒáƒ•ის ტიპი" -#: describe.c:6660 +#: describe.c:6709 msgid "Operator class" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜" -#: describe.c:6672 describe.c:6754 describe.c:6847 describe.c:6942 +#: describe.c:6721 describe.c:6802 describe.c:6894 describe.c:6988 msgid "Operator family" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜" -#: describe.c:6708 +#: describe.c:6756 msgid "List of operator classes" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ”ბის სიáƒ" -#: describe.c:6755 +#: describe.c:6803 msgid "Applicable types" msgstr "გáƒáƒœáƒ™áƒ£áƒ—ვნილი ტიპები" -#: describe.c:6797 +#: describe.c:6844 msgid "List of operator families" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ”ბის სიáƒ" -#: describe.c:6848 +#: describe.c:6895 msgid "Operator" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜" -#: describe.c:6849 +#: describe.c:6896 msgid "Strategy" msgstr "სტრáƒáƒ¢áƒ”გიáƒ" -#: describe.c:6850 +#: describe.c:6897 msgid "ordering" msgstr "დáƒáƒšáƒáƒ’ებáƒ" -#: describe.c:6851 +#: describe.c:6898 msgid "search" msgstr "ძებნáƒ" -#: describe.c:6852 +#: describe.c:6899 msgid "Purpose" msgstr "მიზáƒáƒœáƒ˜" -#: describe.c:6857 +#: describe.c:6904 msgid "Sort opfamily" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜áƒ¡ დáƒáƒšáƒáƒ’ებáƒ" -#: describe.c:6896 +#: describe.c:6942 msgid "List of operators of operator families" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ”ბის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის სიáƒ" -#: describe.c:6943 +#: describe.c:6989 msgid "Registered left type" msgstr "რეგისტრირებული მáƒáƒ áƒªáƒ®áƒ”ნრტიპი" -#: describe.c:6944 +#: describe.c:6990 msgid "Registered right type" msgstr "რეგისტრირებული მáƒáƒ áƒ¯áƒ•ენრტიპი" -#: describe.c:6945 +#: describe.c:6991 msgid "Number" msgstr "რიცხვი" -#: describe.c:6989 +#: describe.c:7034 msgid "List of support functions of operator families" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ”ბის ფუნქციების სიáƒ" -#: describe.c:7020 +#: describe.c:7065 msgid "ID" msgstr "ID" -#: describe.c:7041 +#: describe.c:7085 msgid "Large objects" msgstr "დიდი áƒáƒ‘იექტები" -#: help.c:75 +#: help.c:63 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2471,11 +2520,11 @@ msgstr "" "psql PostgreSQL-ის ინტერáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ ტერმინáƒáƒšáƒ˜áƒ.\n" "\n" -#: help.c:76 help.c:394 help.c:478 help.c:521 +#: help.c:64 help.c:372 help.c:456 help.c:502 msgid "Usage:\n" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" -#: help.c:77 +#: help.c:65 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2483,28 +2532,27 @@ msgstr "" " psql [პáƒáƒ áƒáƒ›áƒ”ტრი]... [ბáƒáƒ–ისსáƒáƒ®áƒ”ლი [მáƒáƒ›áƒ®áƒ›áƒ¡áƒáƒ®áƒ”ლი]]\n" "\n" -#: help.c:79 +#: help.c:67 msgid "General options:\n" msgstr "ზáƒáƒ’áƒáƒ“ი პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: help.c:84 +#: help.c:68 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=ბრძáƒáƒœáƒ”ბრმხáƒáƒšáƒáƒ“ ერთი (SQL áƒáƒœ შიდáƒ) ბრძáƒáƒœáƒ”ბის გáƒáƒ¨áƒ•ებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: help.c:85 -#, c-format -msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" -msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი მისáƒáƒ”რთებელი ბáƒáƒ–ის სáƒáƒ®áƒ”ლი (ნáƒáƒ’ულისხმები: \"%s\")\n" +#: help.c:69 +msgid " -d, --dbname=DBNAME database name to connect to\n" +msgstr " -d, --dbname=DBNAME მისáƒáƒ”რთებელი ბáƒáƒ–ის სáƒáƒ®áƒ”ლი\n" -#: help.c:87 +#: help.c:70 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=ფáƒáƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლი ბრძáƒáƒœáƒ”ბების ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ შესრულებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: help.c:88 +#: help.c:71 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ ბáƒáƒ–ების სიის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: help.c:89 +#: help.c:72 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2514,15 +2562,15 @@ msgstr "" " psql -ის მითითებული სáƒáƒ®áƒ”ლის მქáƒáƒœáƒ” ცვლáƒáƒ“ისთვის მითითებული მნიშვნელáƒáƒ‘ის მინიჭებáƒ\n" " (მáƒáƒ’:, -v ON_ERROR_STOP=1)\n" -#: help.c:92 +#: help.c:75 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: help.c:93 +#: help.c:76 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc გáƒáƒ¨áƒ•ებისáƒáƒ¡ წáƒáƒ¡áƒáƒ™áƒ˜áƒ—ხი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (~/.psqlrc) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ\n" -#: help.c:94 +#: help.c:77 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2530,19 +2578,19 @@ msgstr "" " -1 (\"one\"), --single-transaction\n" " რáƒáƒ’áƒáƒ áƒª ერთი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡, ისე გáƒáƒ¨áƒ•ებრ(თუ áƒáƒ áƒáƒ˜áƒœáƒ¢áƒ”რáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ)\n" -#: help.c:96 +#: help.c:79 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=პáƒáƒ áƒáƒ›áƒ”ტრები] áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: help.c:97 +#: help.c:80 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands \"\\\"-ით დáƒáƒ¬áƒ§áƒ”ბული ბრძáƒáƒœáƒ”ბების ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: help.c:98 +#: help.c:81 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables გáƒáƒœáƒ¡áƒáƒ™áƒ£áƒ—რებული ცვლáƒáƒ“ების სიის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: help.c:100 +#: help.c:83 msgid "" "\n" "Input and output options:\n" @@ -2550,47 +2598,47 @@ msgstr "" "\n" "შეტáƒáƒœáƒ˜áƒ¡áƒ დრგáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: help.c:101 +#: help.c:84 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all სკრიპტიდáƒáƒœ წáƒáƒ™áƒ˜áƒ—ხულის ეკრáƒáƒœáƒ–ე ჩვენებáƒ\n" -#: help.c:102 +#: help.c:85 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors შეცდáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒáƒ›áƒ¢áƒáƒœáƒ˜ ბრძáƒáƒœáƒ”ბების ჩვენებáƒ\n" -#: help.c:103 +#: help.c:86 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries სერვერზე გáƒáƒ’ზáƒáƒ•ნილი ბრძáƒáƒœáƒ”ბების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: help.c:104 +#: help.c:87 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden შიდრბრძáƒáƒœáƒ”ბების მიერ გენერირებული მáƒáƒ—ხáƒáƒ•ნების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: help.c:105 +#: help.c:88 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FILENAME სესიის ჟურნáƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ\n" -#: help.c:106 +#: help.c:89 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢áƒ”ბითი კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜áƒ¡ (readline) გáƒáƒ›áƒáƒ áƒ—ვáƒ\n" -#: help.c:107 +#: help.c:90 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=FILENAME მáƒáƒ—ხáƒáƒ•ნის შედეგების ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რრ(áƒáƒœ |ფáƒáƒ˜áƒ¤áƒ¨áƒ˜)\n" -#: help.c:108 +#: help.c:91 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet ჩუმáƒáƒ“ გáƒáƒ¨áƒ•ებრ(შეტყáƒáƒ‘ინებების გáƒáƒ áƒ”შე, მხáƒáƒšáƒáƒ“ მáƒáƒ—ხáƒáƒ•ნის შედეგები)\n" -#: help.c:109 +#: help.c:92 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step ერთნáƒáƒ‘იჯიáƒáƒœáƒ˜ რეჟიმი (თითáƒáƒ”ული მáƒáƒ—ხáƒáƒ•ნის დáƒáƒ“áƒáƒ¡áƒ¢áƒ£áƒ áƒ”ბáƒ)\n" -#: help.c:110 +#: help.c:93 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line ერთხáƒáƒ–იáƒáƒœáƒ˜ რეჟიმი (ხáƒáƒ–ის დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბრSQL-ის ბრძáƒáƒœáƒ”ბáƒáƒ¡áƒáƒª áƒáƒ¡áƒ áƒ£áƒšáƒ”ბს)\n" -#: help.c:112 +#: help.c:95 msgid "" "\n" "Output format options:\n" @@ -2598,15 +2646,15 @@ msgstr "" "\n" "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ მáƒáƒ áƒ’ებáƒ:\n" -#: help.c:113 +#: help.c:96 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align ცხრილის დáƒáƒ£áƒšáƒáƒ’ებლáƒáƒ“ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ რეჟიმი\n" -#: help.c:114 +#: help.c:97 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv CSV (მძიმით გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ მნიშვნელáƒáƒ‘ები) ცხრილის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ რეჟიმი\n" -#: help.c:115 +#: help.c:98 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2615,15 +2663,15 @@ msgstr "" " -F, --field-separator=სტრიქáƒáƒœáƒ˜\n" " ველების გáƒáƒ›áƒ§áƒáƒ¤ სიმბáƒáƒšáƒ დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒ—ვის (ნáƒáƒ’ულისხმები: \"%s\")\n" -#: help.c:118 +#: help.c:101 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML ცხრილის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ რეჟიმი\n" -#: help.c:119 +#: help.c:102 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr " -P, --pset=ცვლ[=áƒáƒ áƒ’] ცვლ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის áƒáƒ áƒ’-ზე დáƒáƒ§áƒ”ნებრ(იხ, \\pset ბრძáƒáƒœáƒ”ბáƒ)\n" -#: help.c:120 +#: help.c:103 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2631,19 +2679,19 @@ msgstr "" " -R, --record-separator=სტრიქáƒáƒœáƒ˜\n" " ჩáƒáƒœáƒáƒ¬áƒ”რების გáƒáƒ›áƒ§áƒáƒ¤áƒ˜ დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒ—ვის (ნáƒáƒ’ულისხმები: áƒáƒ®áƒáƒšáƒ˜ ხáƒáƒ–ი)\n" -#: help.c:122 +#: help.c:105 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only მხáƒáƒšáƒáƒ“ მწკრივების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: help.c:123 +#: help.c:106 msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr " -T, --table-attr=ტექსტი HTML ცხრილის ჭდის áƒáƒ¢áƒ áƒ˜áƒ‘უტების დáƒáƒ§áƒ”ნებრ(მáƒáƒ’: სიგრძე, სáƒáƒ–ღვáƒáƒ áƒ˜)\n" -#: help.c:124 +#: help.c:107 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded ცხრილის გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ჩáƒáƒ áƒ—ვáƒ\n" -#: help.c:125 +#: help.c:108 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2651,7 +2699,7 @@ msgstr "" " -z, --field-separator-zero\n" " დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ველების გáƒáƒ›áƒ§áƒáƒ¤áƒáƒ“ ნულáƒáƒ•áƒáƒœáƒ˜ ბáƒáƒ˜áƒ¢áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ\n" -#: help.c:127 +#: help.c:110 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2659,7 +2707,7 @@ msgstr "" " -0, --record-separator-zero\n" " დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რების გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ¡ ნულáƒáƒ•áƒáƒœ ბáƒáƒ˜áƒ¢áƒ–ე დáƒáƒ§áƒ”ნებáƒ\n" -#: help.c:130 +#: help.c:113 msgid "" "\n" "Connection options:\n" @@ -2667,34 +2715,27 @@ msgstr "" "\n" "შეერთების პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: help.c:133 -#, c-format -msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" -msgstr " -h, --host=HOSTNAME მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (ნáƒáƒ’ულისხმები: \"%s\")\n" - -#: help.c:134 -msgid "local socket" -msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ სáƒáƒ™áƒ”ტი" +#: help.c:114 +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=HOSTNAME მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: help.c:137 -#, c-format -msgid " -p, --port=PORT database server port (default: \"%s\")\n" -msgstr " -p, --port=PORT მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜ (ნáƒáƒ’ულისხმები: \"%s\")\n" +#: help.c:115 +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜\n" -#: help.c:140 -#, c-format -msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" -msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი (ნáƒáƒ’ულისხმები: \"%s\")\n" +#: help.c:116 +msgid " -U, --username=USERNAME database user name\n" +msgstr " -U, --username=სáƒáƒ®áƒ”ლი ბáƒáƒ–ის ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: help.c:142 +#: help.c:117 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password áƒáƒ áƒáƒ¡áƒáƒ“ეს მკითხრპáƒáƒ áƒáƒšáƒ˜\n" -#: help.c:143 +#: help.c:118 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password პáƒáƒ áƒáƒšáƒ˜áƒ¡ ყáƒáƒ•ელთვის კითხვრ(áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ უნდრხდებáƒáƒ“ეს)\n" -#: help.c:145 +#: help.c:120 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2708,38 +2749,37 @@ msgstr "" "áƒáƒœ გáƒáƒ”ცáƒáƒœáƒ˜áƒ— \"psql\" გáƒáƒœáƒ§áƒáƒ¤áƒ˜áƒšáƒ”ბáƒáƒ¡ PostgreSQL-ის დáƒáƒ™áƒ£áƒ›áƒ”ნტáƒáƒªáƒ˜áƒáƒ¨áƒ˜.\n" "\n" -#: help.c:148 +#: help.c:123 #, c-format msgid "Report bugs to <%s>.\n" msgstr "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: <%s>\n" -#: help.c:149 +#: help.c:124 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" -#: help.c:191 +#: help.c:166 msgid "General\n" msgstr "ზáƒáƒ’áƒáƒ“ი\n" -#: help.c:192 -#| msgid " \\dFp[+] [PATTERN] list text search parsers\n" +#: help.c:167 msgid " \\bind [PARAM]... set query parameters\n" msgstr " \\bind [PARAM]... მáƒáƒ—ხáƒáƒ•ნის პáƒáƒ áƒáƒ›áƒ”ტრების დáƒáƒ§áƒ”ნებáƒ\n" -#: help.c:193 +#: help.c:168 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright áƒáƒ©áƒ•ენებს PostgreSQL-ის გáƒáƒ›áƒáƒ§áƒ”ნებისრდრდისტრიბუციის პირáƒáƒ‘ებს\n" -#: help.c:194 +#: help.c:169 msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr " \\crosstabview [სვეტები] შეáƒáƒ¡áƒ áƒ£áƒšáƒ”ბს მáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ დრშედეგს crosstab-ში áƒáƒ©áƒ•ენებს\n" -#: help.c:195 +#: help.c:170 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose ბáƒáƒšáƒ შეცდáƒáƒ›áƒ˜áƒ¡ დეტáƒáƒšáƒ”ბის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒáƒ“ ჩვენებáƒ\n" -#: help.c:196 +#: help.c:171 msgid "" " \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" @@ -2747,228 +2787,234 @@ msgstr "" " \\g [(პáƒáƒ áƒáƒ›áƒ”ტრი)] [ფáƒáƒ˜áƒšáƒ˜] მáƒáƒ—ხáƒáƒ•ნის შესრულებრ(დრშედეგის ფáƒáƒ˜áƒšáƒ¨áƒ˜ áƒáƒœ |ფáƒáƒ˜áƒ¤áƒ¨áƒ˜ გáƒáƒ’ზáƒáƒ•ნáƒ;\n" " \\g áƒáƒ áƒ’უმენტების გáƒáƒ áƒ”შე იგივეáƒ, რáƒáƒª წერტილმძიმე\n" -#: help.c:198 +#: help.c:173 msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc მáƒáƒ—ხáƒáƒ•ნის შედეგის áƒáƒ¦áƒ¬áƒ”რრმისი შესრულების გáƒáƒ áƒ”შე\n" -#: help.c:199 +#: help.c:174 msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec ჯერ მáƒáƒ—ხáƒáƒ•ნის, მერე კი მისი თითáƒáƒ”ული შედეგის შესრულებáƒ\n" -#: help.c:200 +#: help.c:175 msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr " \\gset [პრეფიქსი] მáƒáƒ—ხáƒáƒ•ნის შესრულებრდრშედეგის psql-ის ცვლáƒáƒ“ებში შენáƒáƒ®áƒ•áƒ\n" -#: help.c:201 +#: help.c:176 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [(პáƒáƒ áƒáƒ›áƒ”ტრები)] [ფáƒáƒ˜áƒšáƒ˜] რáƒáƒ’áƒáƒ áƒª \\g, მáƒáƒ’რáƒáƒ› გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ რეჟიმი უფრრფáƒáƒ áƒ—რიქნებáƒ\n" -#: help.c:202 +#: help.c:177 msgid " \\q quit psql\n" msgstr " \\q psql-დáƒáƒœ გáƒáƒ¡áƒ•ლáƒ\n" -#: help.c:203 -msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n" -msgstr " \\watch [[i=]SEC] [c=N] მáƒáƒ—ხáƒáƒ•ნის ყáƒáƒ•ელ SEC წáƒáƒ›áƒ¨áƒ˜ ერთხელ გáƒáƒ¨áƒ•ებáƒ, N-ჯერ\n" +#: help.c:178 +msgid "" +" \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" execute query every SEC seconds, up to N times,\n" +" stop if less than MIN rows are returned\n" +msgstr "" +" \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" მáƒáƒ—ხáƒáƒ•ნის შესრულებრყáƒáƒ•ელ SEC წáƒáƒ›áƒ¨áƒ˜ ერთხელ, მáƒáƒ¥áƒ¡ N-ჯერ\n" +" გáƒáƒ©áƒ”რებáƒ, თუ MIN მწკრივზე ნáƒáƒ™áƒšáƒ”ბი დáƒáƒ‘რუნდებáƒ\n" -#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:297 help.c:305 -#: help.c:325 help.c:338 help.c:347 +#: help.c:181 help.c:189 help.c:201 help.c:211 help.c:218 help.c:275 help.c:283 +#: help.c:303 help.c:316 help.c:325 msgid "\n" msgstr "\n" -#: help.c:206 +#: help.c:183 msgid "Help\n" msgstr "დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ\n" -#: help.c:208 +#: help.c:185 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] დáƒáƒ®áƒ›áƒáƒ áƒ”ბრ\"\\\"-ით დáƒáƒ¬áƒ§áƒ”ბული ბრძáƒáƒœáƒ”ბების შესáƒáƒ®áƒ”ბ\n" -#: help.c:209 +#: help.c:186 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options დáƒáƒ®áƒ›áƒáƒ áƒ”ბრpsql-ის ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ შესáƒáƒ®áƒ”ბ\n" -#: help.c:210 +#: help.c:187 msgid " \\? variables show help on special variables\n" msgstr " \\? variables დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრგáƒáƒœáƒ¡áƒáƒ™áƒ£áƒ—რებული ცვლáƒáƒ“ების შესáƒáƒ®áƒ”ბ\n" -#: help.c:211 +#: help.c:188 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [სáƒáƒ®áƒ”ლი] SQL ბრძáƒáƒœáƒ”ბების დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ, * ყველრბრძáƒáƒœáƒ”ბისთვის\n" -#: help.c:214 +#: help.c:191 msgid "Query Buffer\n" msgstr "მáƒáƒ—ხáƒáƒ•ნების ბáƒáƒ¤áƒ”რი\n" -#: help.c:215 +#: help.c:192 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr " \\e [ფáƒáƒ˜áƒšáƒ˜] [ხáƒáƒ–ი] მáƒáƒ—ხáƒáƒ•ნების ბáƒáƒ¤áƒ”რის (áƒáƒœ ფáƒáƒ˜áƒšáƒ˜áƒ¡) გáƒáƒ áƒ” რედáƒáƒ¥áƒ¢áƒáƒ áƒ¨áƒ˜ გáƒáƒ®áƒ¡áƒœáƒ\n" -#: help.c:216 +#: help.c:193 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [ფუნქცსáƒáƒ®áƒ”ლი [ხáƒáƒ–ი]] ფუნქციის áƒáƒ¦áƒ¬áƒ”რის გáƒáƒ áƒ” რედáƒáƒ¥áƒ¢áƒáƒ áƒ¨áƒ˜ ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ\n" -#: help.c:217 +#: help.c:194 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [ხედისსáƒáƒ®áƒ”ლი [ხáƒáƒ–ი]] ხედის áƒáƒ¦áƒ¬áƒ”რის გáƒáƒ áƒ” რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜áƒ— ჩáƒáƒ¡áƒ¬áƒáƒ áƒ”ბáƒ\n" -#: help.c:218 +#: help.c:195 msgid " \\p show the contents of the query buffer\n" msgstr " \\p მáƒáƒ—ხáƒáƒ•ნების ბáƒáƒ¤áƒ”რის შემცველáƒáƒ‘ის ჩვენებáƒ\n" -#: help.c:219 +#: help.c:196 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r მáƒáƒ—ხáƒáƒ•ნების ბáƒáƒ¤áƒ”რის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებáƒ\n" -#: help.c:221 +#: help.c:198 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [ფáƒáƒ˜áƒšáƒ˜] ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ჩვენებრáƒáƒœ ფáƒáƒ˜áƒšáƒ¨áƒ˜ შენáƒáƒ®áƒ•áƒ\n" -#: help.c:223 +#: help.c:200 msgid " \\w FILE write query buffer to file\n" msgstr " \\w FILE მáƒáƒ—ხáƒáƒ•ნების ბáƒáƒ¤áƒ”რის ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ\n" -#: help.c:226 +#: help.c:203 msgid "Input/Output\n" msgstr "შეტáƒáƒœáƒ/გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: help.c:227 +#: help.c:204 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr " \\copy ... SQL COPY -ის შესრულებრმáƒáƒœáƒáƒªáƒ”მების ნáƒáƒ™áƒáƒ“ით კლიენტის ჰáƒáƒ¡áƒ¢áƒáƒ›áƒ“ე\n" -#: help.c:228 +#: help.c:205 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [სტრიქáƒáƒœáƒ˜] სტრიქáƒáƒœáƒ˜áƒ¡ სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒš გáƒáƒ›áƒáƒ¢áƒáƒœáƒáƒ–ე გáƒáƒ¨áƒ•ებáƒ(ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ გáƒáƒ áƒ”შე -n )\n" -#: help.c:229 +#: help.c:206 msgid " \\i FILE execute commands from file\n" msgstr " \\i ბრძáƒáƒœáƒ”ბების ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ შესრულებáƒ\n" -#: help.c:230 +#: help.c:207 msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr " \\ir ფáƒáƒ˜áƒšáƒ˜ იგივე, რáƒáƒª \\i, მáƒáƒ’რáƒáƒ› სკრიპტის მიმდინáƒáƒ áƒ” áƒáƒ“გილიდáƒáƒœ დáƒáƒ›áƒáƒ™áƒ˜áƒ“ებულებით\n" -#: help.c:231 +#: help.c:208 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [ფáƒáƒ˜áƒšáƒ˜] მáƒáƒ—ხáƒáƒ•ნის ყველრშედეგის ფáƒáƒ˜áƒšáƒ¨áƒ˜ áƒáƒœ |ფáƒáƒ˜áƒ¤áƒ¨áƒ˜ გáƒáƒ’ზáƒáƒ•ნáƒ\n" -#: help.c:232 +#: help.c:209 msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr " \\qecho [-n] [striqoni] სტრიქáƒáƒœáƒ˜áƒ¡ \\o გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ნáƒáƒ™áƒáƒ“ში ჩáƒáƒ¬áƒ”რრ(-n áƒáƒ®áƒáƒšáƒ˜ ხáƒáƒ–ების გáƒáƒ áƒ”შე)\n" -#: help.c:233 +#: help.c:210 msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr " \\warn [-n] [სტრიქáƒáƒœáƒ˜] სტრიქáƒáƒœáƒ˜áƒ¡ სტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒš შეცდáƒáƒ›áƒáƒ–ე გáƒáƒ“áƒáƒ›áƒáƒ¢áƒáƒœáƒ (-n გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ გáƒáƒ áƒ”შე)\n" -#: help.c:236 +#: help.c:213 msgid "Conditional\n" msgstr "პირáƒáƒ‘ითი\n" -#: help.c:237 +#: help.c:214 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR პირáƒáƒ‘ის შემცველი ბლáƒáƒ™áƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜\n" -#: help.c:238 +#: help.c:215 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ პირáƒáƒ‘რმიმდინáƒáƒ áƒ” პირáƒáƒ‘ით ბლáƒáƒ™áƒ¨áƒ˜\n" -#: help.c:239 +#: help.c:216 msgid " \\else final alternative within current conditional block\n" msgstr " \\else პირáƒáƒ‘ის მიმდინáƒáƒ áƒ” ბლáƒáƒ™áƒ˜áƒ¡ áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ გზáƒ\n" -#: help.c:240 +#: help.c:217 msgid " \\endif end conditional block\n" msgstr " \\endif პირáƒáƒ‘ის შემცველი ბლáƒáƒ™áƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜\n" -#: help.c:243 +#: help.c:220 msgid "Informational\n" msgstr "სáƒáƒ˜áƒœáƒ¤áƒáƒ áƒ›áƒáƒªáƒ˜áƒ\n" -#: help.c:244 +#: help.c:221 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (პáƒáƒ áƒáƒ›áƒ”ტრები: S = სისტემური áƒáƒ‘იექტების ჩვენებáƒ, + = დáƒáƒ›áƒáƒ¢áƒ”ბითი დეტáƒáƒšáƒ”ბი)\n" -#: help.c:245 +#: help.c:222 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] ცხრილების, ხედებისრდრმიმდევრáƒáƒ‘ების სიáƒ\n" -#: help.c:246 +#: help.c:223 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NAME ცხრილის, ხედის, მიმდევრáƒáƒ‘ის áƒáƒœ ინდექსის áƒáƒ¦áƒ¬áƒ”რáƒ\n" -#: help.c:247 +#: help.c:224 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [PATTERN] áƒáƒ’რეგáƒáƒ¢áƒ”ბის სიáƒ\n" -#: help.c:248 +#: help.c:225 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [PATTERN] წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ების სიáƒ\n" -#: help.c:249 +#: help.c:226 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ”ბის სიáƒ\n" -#: help.c:250 +#: help.c:227 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის áƒáƒ¯áƒáƒ®áƒ”ბის სიáƒ\n" -#: help.c:251 +#: help.c:228 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის áƒáƒ¯áƒáƒ®áƒ”ბის áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის სიáƒ\n" -#: help.c:252 +#: help.c:229 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ”ბის მხáƒáƒ áƒ“áƒáƒ­áƒ”რის ფუნქციების სიáƒ\n" -#: help.c:253 +#: help.c:230 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [PATTERN] ცხრილის სივრცეების სიáƒ\n" -#: help.c:254 +#: help.c:231 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [PATTERN] გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ”ბის სიáƒ\n" -#: help.c:255 +#: help.c:232 msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" msgstr " \\dconfig[+] [PATTERN] კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების სიáƒ\n" -#: help.c:256 +#: help.c:233 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [PATTERN] კáƒáƒ¡áƒ¢áƒ”ბის სიáƒ\n" -#: help.c:257 +#: help.c:234 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [შáƒáƒ‘ლáƒáƒœáƒ˜] áƒáƒ‘იექტის áƒáƒ¦áƒ¬áƒ”რის ჩვენებáƒ, რáƒáƒ›áƒ”ლიც სხვáƒáƒ’áƒáƒœ áƒáƒ áƒ¡áƒáƒ“áƒáƒ ნáƒáƒ©áƒ•ენები\n" -#: help.c:258 +#: help.c:235 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [PATTERN] დáƒáƒ›áƒ”ნების სიáƒ\n" -#: help.c:259 +#: help.c:236 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [შáƒáƒ‘ლáƒáƒœáƒ˜] ნáƒáƒ’ულისხმები პრივილეგიების სიáƒ\n" -#: help.c:260 +#: help.c:237 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] გáƒáƒ áƒ” ცხრილების სიáƒ\n" -#: help.c:261 +#: help.c:238 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] გáƒáƒ áƒ” სერვერების სიáƒ\n" -#: help.c:262 +#: help.c:239 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] გáƒáƒ áƒ” ცხრილების სიáƒ\n" -#: help.c:263 +#: help.c:240 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [PATTERN] მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლების მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სიáƒ\n" -#: help.c:264 +#: help.c:241 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ”ბის სიáƒ\n" -#: help.c:265 +#: help.c:242 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" @@ -2976,47 +3022,47 @@ msgstr "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " ფუნქციების [მხáƒáƒšáƒáƒ“ agg/normal/procedure/trigger/window] სიáƒ\n" -#: help.c:267 +#: help.c:244 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ”ბის სიáƒ\n" -#: help.c:268 +#: help.c:245 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] ტექსტის ძებნის ლექსიკáƒáƒœáƒ”ბის სიáƒ\n" -#: help.c:269 +#: help.c:246 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [PATTERN] ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლების სიáƒ\n" -#: help.c:270 +#: help.c:247 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ”ბის სიáƒ\n" -#: help.c:271 +#: help.c:248 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] რáƒáƒšáƒ”ბის სიáƒ\n" -#: help.c:272 +#: help.c:249 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] ინდექსების სიáƒ\n" -#: help.c:273 +#: help.c:250 msgid " \\dl[+] list large objects, same as \\lo_list\n" msgstr " \\dl[+] დიდი áƒáƒ‘იექტების სიáƒ. იგივე, რáƒáƒª \\lo_list\n" -#: help.c:274 +#: help.c:251 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] პრáƒáƒªáƒ”დურული ენების სიáƒ\n" -#: help.c:275 +#: help.c:252 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედების სიáƒ\n" -#: help.c:276 +#: help.c:253 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] სქემების სიáƒ\n" -#: help.c:277 +#: help.c:254 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" @@ -3024,87 +3070,91 @@ msgstr "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ”ბის სიáƒ\n" -#: help.c:279 +#: help.c:256 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] კáƒáƒšáƒáƒªáƒ˜áƒ”ბის სიáƒ\n" -#: help.c:280 -msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" -msgstr " \\dp [შáƒáƒ‘ლáƒáƒœáƒ˜] ცხრილის, ხედის დრმიმდევრáƒáƒ‘ის წვდáƒáƒ›áƒ˜áƒ¡ უფლებების სიáƒ\n" +#: help.c:257 +msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n" +msgstr " \\dp[S] [შáƒáƒ‘ლáƒáƒœáƒ˜] ცხრილის, ხედის დრმიმდევრáƒáƒ‘ის წვდáƒáƒ›áƒ˜áƒ¡ უფლებების სიáƒ\n" -#: help.c:281 +#: help.c:258 msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr " \\dP[itn+] [შáƒáƒ‘ლáƒáƒœáƒ˜] [მხáƒáƒšáƒáƒ“ ინდექსი/ცხრილი] დáƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ ურთიერთáƒáƒ‘ების სირ[n=ჩáƒáƒ“გმული]\n" -#: help.c:282 +#: help.c:259 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr " \\drds [ROLEPTRN [DBPTRN]] თითáƒáƒ”ული ბáƒáƒ–ის რáƒáƒšáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრების სიáƒ\n" -#: help.c:283 +#: help.c:260 +msgid " \\drg[S] [PATTERN] list role grants\n" +msgstr " \\dg[S] [შáƒáƒ‘ლáƒáƒœáƒ˜] რáƒáƒšáƒ”ბის მინიჭებების სიáƒ\n" + +#: help.c:261 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒªáƒ”მების სიáƒ\n" -#: help.c:284 +#: help.c:262 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¬áƒ”რების სიáƒ\n" -#: help.c:285 +#: help.c:263 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] მიმდევრáƒáƒ‘ების სიáƒ\n" -#: help.c:286 +#: help.c:264 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] ცხრილების სიáƒ\n" -#: help.c:287 +#: help.c:265 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] მáƒáƒœáƒáƒªáƒ”მის ტიპების სიáƒ\n" -#: help.c:288 +#: help.c:266 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] რáƒáƒšáƒ”ბის სიáƒ\n" -#: help.c:289 +#: help.c:267 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [შáƒáƒ‘ლáƒáƒœáƒ˜] ხედების სიáƒ\n" -#: help.c:290 +#: help.c:268 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბების სიáƒ\n" -#: help.c:291 +#: help.c:269 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [შáƒáƒ‘ლáƒáƒœáƒ˜] გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ სიáƒ\n" -#: help.c:292 +#: help.c:270 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] მáƒáƒ•ლენის ტრიგერების სიáƒ\n" -#: help.c:293 +#: help.c:271 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [შáƒáƒ‘ლáƒáƒœáƒ˜] მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ების სიáƒ\n" -#: help.c:294 +#: help.c:272 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNCNAME ფუნქციის áƒáƒ¦áƒ¬áƒ”რის ჩვენებáƒ\n" -#: help.c:295 +#: help.c:273 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] ხედისსáƒáƒ®áƒ”ლი ხედის áƒáƒ¦áƒ¬áƒ”რის ჩვენებáƒ\n" -#: help.c:296 -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [შáƒáƒ‘ლáƒáƒœáƒ˜] იგივე, რáƒáƒª \\dp\n" +#: help.c:274 +msgid " \\z[S] [PATTERN] same as \\dp\n" +msgstr " \\z[S] [შáƒáƒ‘ლáƒáƒœáƒ˜] იგივე, რáƒáƒª \\dp\n" -#: help.c:299 +#: help.c:277 msgid "Large Objects\n" msgstr "დიდი áƒáƒ‘იექტები\n" -#: help.c:300 +#: help.c:278 msgid " \\lo_export LOBOID FILE write large object to file\n" msgstr " \\lo_export LOBOID FILE დიდი áƒáƒ‘იექტის ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ\n" -#: help.c:301 +#: help.c:279 msgid "" " \\lo_import FILE [COMMENT]\n" " read large object from file\n" @@ -3112,36 +3162,36 @@ msgstr "" " \\lo_import ფáƒáƒ˜áƒšáƒ˜ [კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜]\n" " დიდი áƒáƒ‘იექტის ფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ წáƒáƒ™áƒ˜áƒ—ხვáƒ\n" -#: help.c:303 +#: help.c:281 msgid " \\lo_list[+] list large objects\n" msgstr " \\lo_list[+] დიდი áƒáƒ‘იექტების სიáƒ\n" -#: help.c:304 +#: help.c:282 msgid " \\lo_unlink LOBOID delete a large object\n" msgstr " \\lo_unlink LOBOID დიდი áƒáƒ‘იექტის წáƒáƒ¨áƒšáƒ\n" -#: help.c:307 +#: help.c:285 msgid "Formatting\n" msgstr "ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ áƒ”ბáƒ\n" -#: help.c:308 +#: help.c:286 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a სწáƒáƒ áƒ”ბულ დრგáƒáƒ£áƒ¡áƒ¬áƒáƒ áƒ”ბელ რეჟიმებს შáƒáƒ áƒ˜áƒ¡ გáƒáƒ“áƒáƒ áƒ—ვáƒ\n" -#: help.c:309 +#: help.c:287 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [სტრიქáƒáƒœáƒ˜] ცხრილის სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ. áƒáƒœ წáƒáƒ¨áƒšáƒ, თუ მითითებული áƒáƒ áƒáƒ\n" -#: help.c:310 +#: help.c:288 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr " \\f [სტრიქáƒáƒœáƒ˜] მáƒáƒ—ხáƒáƒ•ნის შედეგის დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ველების გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებრáƒáƒœ ჩვენებáƒ\n" -#: help.c:311 +#: help.c:289 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H HTML გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ რეჟიმის გáƒáƒ“áƒáƒ áƒ—ვრ(მიმდინáƒáƒ áƒ” %s)\n" -#: help.c:313 +#: help.c:291 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3149,7 +3199,7 @@ msgid "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" msgstr "" " \\pset [სáƒáƒ®áƒ”ლი [მნიშვნელáƒáƒ‘áƒ]] ცხრილის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის დáƒáƒ§áƒ”ნებáƒ\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3157,31 +3207,31 @@ msgstr "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" -#: help.c:320 +#: help.c:298 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] მხáƒáƒšáƒáƒ“ მწკრივების ჩვენებáƒ(áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ %s)\n" -#: help.c:322 +#: help.c:300 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [STRING] HTML-ის
ჭდის áƒáƒ¢áƒ áƒ˜áƒ‘უტების დáƒáƒ§áƒ”ნებáƒ. áƒáƒœ გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებáƒ, თუ მითითებული áƒáƒ áƒáƒ¤áƒ”რიáƒ\n" -#: help.c:323 +#: help.c:301 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ გáƒáƒ“áƒáƒ áƒ—ვრ(áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ %s)\n" -#: help.c:324 +#: help.c:302 msgid "auto" msgstr "áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒ˜" -#: help.c:327 +#: help.c:305 msgid "Connection\n" msgstr "შეერთებáƒ\n" -#: help.c:329 +#: help.c:307 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3190,7 +3240,7 @@ msgstr "" " \\c[onnect] {[ბáƒáƒ–ისსáƒáƒ®áƒ”ლი|- მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი|- ჰáƒáƒ¡áƒ¢áƒ˜|- პáƒáƒ áƒ¢|-] | conninfo}\n" " áƒáƒ®áƒáƒš ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებრ(მიმდინáƒáƒ áƒ” \"%s\")\n" -#: help.c:333 +#: help.c:311 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3198,60 +3248,60 @@ msgstr "" " \\c[onnect] {[ბáƒáƒ–ისსáƒáƒ®áƒ”ლი|- მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი|- ჰáƒáƒ¡áƒ¢áƒ˜|- პáƒáƒ áƒ¢|-] | conninfo}\n" " áƒáƒ®áƒáƒš ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებრ(მიმდინáƒáƒ áƒ” შეერთებრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს)\n" -#: help.c:335 +#: help.c:313 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo მიმდინáƒáƒ áƒ” შეერთების შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: help.c:336 +#: help.c:314 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [კáƒáƒ“ირებáƒ] კლიენტის კáƒáƒ“ირების ჩვენებრáƒáƒœ დáƒáƒ§áƒ”ნებáƒ\n" -#: help.c:337 +#: help.c:315 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი] მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის პáƒáƒ áƒáƒšáƒ˜áƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ“ შეცვლáƒ\n" -#: help.c:340 +#: help.c:318 msgid "Operating System\n" msgstr "áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ£áƒšáƒ˜ სისტემáƒ\n" -#: help.c:341 +#: help.c:319 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [სáƒáƒ¥] მიმდინáƒáƒ áƒ” სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის შეცვლáƒ\n" -#: help.c:342 +#: help.c:320 msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" msgstr " \\getenv PSQLVAR ENVVAR გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ის გáƒáƒ›áƒáƒ—ხáƒáƒ•áƒ\n" -#: help.c:343 +#: help.c:321 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv სáƒáƒ®áƒ”ლი [მნიშვნელáƒáƒ‘áƒ] გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ის დáƒáƒ§áƒ”ნებრáƒáƒœ მáƒáƒ®áƒ¡áƒœáƒ\n" -#: help.c:344 +#: help.c:322 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] ბრძáƒáƒœáƒ”ბების ტáƒáƒ˜áƒ›áƒ”რის გáƒáƒ“áƒáƒ áƒ—ვრ(áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ %s)\n" -#: help.c:346 +#: help.c:324 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr " \\! [ბრძáƒáƒœáƒ”ბáƒ] გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის შესრულებრáƒáƒœ ინტერáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ გáƒáƒ áƒ¡áƒ˜áƒ¡ გáƒáƒ¨áƒ•ებáƒ\n" -#: help.c:349 +#: help.c:327 msgid "Variables\n" msgstr "ცვლáƒáƒ“ები\n" -#: help.c:350 +#: help.c:328 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [ტექსტი] სáƒáƒ®áƒ”ლი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლისთვის შიდრცვლáƒáƒ“ის დáƒáƒ§áƒ”ნების შეთáƒáƒ•áƒáƒ–ებáƒ\n" -#: help.c:351 +#: help.c:329 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [სáƒáƒ®áƒ”ლი [მნიშვნელáƒáƒ‘áƒ]] დáƒáƒáƒ§áƒ”ნებს შიდრცვლáƒáƒ“ს, áƒáƒœ, თუ პáƒáƒ áƒáƒ›áƒ”ტრები მითითებული áƒáƒ áƒáƒ, მáƒáƒ— სიáƒáƒ¡ გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ¡\n" -#: help.c:352 +#: help.c:330 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset სáƒáƒ®áƒ”ლი შიდრცვლáƒáƒ“ის მáƒáƒ®áƒ¡áƒœáƒ (წáƒáƒ¨áƒšáƒ)\n" -#: help.c:391 +#: help.c:369 msgid "" "List of specially treated variables\n" "\n" @@ -3259,11 +3309,11 @@ msgstr "" "გáƒáƒœáƒ¡áƒáƒ™áƒ£áƒ—რებულáƒáƒ“ მáƒáƒ¡áƒáƒžáƒ§áƒ áƒáƒ‘ი ცვლáƒáƒ“ების სიáƒ\n" "\n" -#: help.c:393 +#: help.c:371 msgid "psql variables:\n" msgstr "psql-ის ცვლáƒáƒ“ები:\n" -#: help.c:395 +#: help.c:373 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3273,7 +3323,7 @@ msgstr "" " áƒáƒœ \\set სáƒáƒ®áƒ”ლი მნიშვნელáƒáƒ‘რpsql-ის შიგნით\n" "\n" -#: help.c:397 +#: help.c:375 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3281,7 +3331,7 @@ msgstr "" " AUTOCOMMIT\n" " iთუ დáƒáƒ§áƒ”ნებულიáƒ, წáƒáƒ áƒ›áƒáƒ¢áƒ”ბული SQL ბრძáƒáƒœáƒ”ბები áƒáƒ•ტáƒáƒ›áƒáƒ¢áƒ£áƒ áƒáƒ“ იქნებრგáƒáƒ“áƒáƒªáƒ”მული\n" -#: help.c:399 +#: help.c:377 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3291,7 +3341,7 @@ msgstr "" " გáƒáƒœáƒ¡áƒáƒ–ღვრáƒáƒ•ს სიმბáƒáƒšáƒáƒ”ბის ზáƒáƒ›áƒáƒ¡ SQL-ის სáƒáƒ™áƒ•áƒáƒœáƒ«áƒ სიტყვების დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბისáƒáƒ¡\n" " [პáƒáƒ¢áƒáƒ áƒ (lower), upper (დიდი), პáƒáƒ¢áƒáƒ áƒ˜áƒ¡_შენáƒáƒ áƒ©áƒ£áƒœáƒ”ბრ(preserve-lower), დიდის_შენáƒáƒ áƒ©áƒ£áƒœáƒ”ბრ(preserve-upper)]\n" -#: help.c:402 +#: help.c:380 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3299,7 +3349,7 @@ msgstr "" " DBNAME\n" " ბáƒáƒ–ის სáƒáƒ®áƒ”ლი, რáƒáƒ›áƒ”ლთáƒáƒœáƒáƒª áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მიერთებული ბრძáƒáƒœáƒ“ებით\n" -#: help.c:404 +#: help.c:382 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3309,7 +3359,7 @@ msgstr "" " áƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ”ბს, შეყვáƒáƒœáƒ˜áƒšáƒ˜áƒ“áƒáƒœ რრგáƒáƒ›áƒáƒ©áƒœáƒ“ებრსტáƒáƒœáƒ“áƒáƒ áƒ¢áƒ£áƒš გáƒáƒ›áƒáƒ¢áƒáƒœáƒáƒ–ე\n" " [all(ყველáƒáƒ¤áƒ”რი), errors(შეცდáƒáƒ›áƒ”ბი), none(áƒáƒ áƒáƒ¤áƒ”რი), queries(მáƒáƒ—ხáƒáƒ•ნები)]\n" -#: help.c:407 +#: help.c:385 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3319,7 +3369,7 @@ msgstr "" " თუ დáƒáƒ§áƒ”ნებულიáƒ, \\-ით დáƒáƒ¬áƒ§áƒ”ბული შიდრმáƒáƒ—ხáƒáƒ•ნები ნáƒáƒ©áƒ•ენები იქნებáƒ;\n" " თუ მნიშვნელáƒáƒ‘áƒáƒ 'noexe', შიდრბრძáƒáƒœáƒ”ბები ნáƒáƒ©áƒ•ენები იქნებáƒ, მáƒáƒ’რáƒáƒ› შესრულებული áƒáƒ áƒ\n" -#: help.c:410 +#: help.c:388 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3327,15 +3377,15 @@ msgstr "" " ENCODING\n" " მიმდინáƒáƒ áƒ” კლიენტის სიმბáƒáƒšáƒáƒ”ბის კáƒáƒ“ირებáƒ\n" -#: help.c:412 +#: help.c:390 msgid "" " ERROR\n" -" true if last query failed, else false\n" +" \"true\" if last query failed, else \"false\"\n" msgstr "" " ERROR\n" -" 1, თუ ბáƒáƒšáƒ მáƒáƒ—ხáƒáƒ•ნრáƒáƒ•áƒáƒ áƒ˜áƒ£áƒšáƒ˜ იყáƒ. áƒáƒ áƒáƒ“რ0\n" +" \"true\" თუ ბáƒáƒšáƒ მáƒáƒ—ხáƒáƒ•ნრáƒáƒ•áƒáƒ áƒ˜áƒ£áƒšáƒ˜ იყáƒ. áƒáƒ áƒáƒ“რ\"false\"\n" -#: help.c:414 +#: help.c:392 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3343,7 +3393,7 @@ msgstr "" " FETCH_COUNT\n" " შედეგის გáƒáƒ›áƒáƒ¡áƒáƒ—ხáƒáƒ•ი მწკრივების რáƒáƒáƒ“ენáƒáƒ‘რერთი ჩვენებისთვის (0=უსáƒáƒ¡áƒ áƒ£áƒšáƒ)\n" -#: help.c:416 +#: help.c:394 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3351,7 +3401,7 @@ msgstr "" " HIDE_TABLEAM\n" " თუ დáƒáƒ§áƒ”ნებულáƒ, ცხრილის წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ები ნáƒáƒ©áƒ•ენები áƒáƒ  იქნებáƒ\n" -#: help.c:418 +#: help.c:396 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" @@ -3359,7 +3409,7 @@ msgstr "" " HIDE_TOAST_COMPRESSION\n" " თუ ჩáƒáƒ áƒ—ულიáƒ, შეკუმშვის მეთáƒáƒ“ები ნáƒáƒ©áƒ•ენები áƒáƒ  იქნებáƒ\n" -#: help.c:420 +#: help.c:398 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3367,7 +3417,7 @@ msgstr "" " HISTCONTROL\n" " ბრძáƒáƒœáƒ”ბების ისტáƒáƒ áƒ˜áƒ˜áƒ¡ კáƒáƒœáƒ áƒáƒšáƒ˜[ignorespace, ignoredups, ignoreboth]\n" -#: help.c:422 +#: help.c:400 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3375,7 +3425,7 @@ msgstr "" " HISTFILE\n" " ბრძáƒáƒœáƒ”ბების ისტáƒáƒ áƒ˜áƒ˜áƒ¡ შესáƒáƒœáƒáƒ®áƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n" -#: help.c:424 +#: help.c:402 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3383,7 +3433,7 @@ msgstr "" " HISTSIZE\n" " ისტáƒáƒ áƒ˜áƒáƒ¨áƒ˜ შენáƒáƒ®áƒ£áƒšáƒ˜ ბრძáƒáƒœáƒ”ბების მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘áƒ\n" -#: help.c:426 +#: help.c:404 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3391,7 +3441,7 @@ msgstr "" " HOST\n" " áƒáƒ›áƒŸáƒáƒ›áƒáƒ“ მიერთებული მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜\n" -#: help.c:428 +#: help.c:406 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3399,7 +3449,7 @@ msgstr "" " IGNOREEOF\n" " ინტერáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜ სესიის დáƒáƒ¡áƒáƒ›áƒ—áƒáƒ•რებლáƒáƒ“ სáƒáƒ­áƒ˜áƒ áƒ EOF-ების რáƒáƒáƒ“ენáƒáƒ‘áƒ\n" -#: help.c:430 +#: help.c:408 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3407,7 +3457,7 @@ msgstr "" " LASTOID\n" " უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლáƒáƒ“ შეცვლილი OID-ის მნიშვნელáƒáƒ‘áƒ\n" -#: help.c:432 +#: help.c:410 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3417,7 +3467,7 @@ msgstr "" " LAST_ERROR_SQLSTATE\n" " უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი შეცდáƒáƒ›áƒ˜áƒ¡ შეტყáƒáƒ‘ინებრდრSQLSTATE. თუ შეცდáƒáƒ›áƒ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს, დáƒáƒ‘რუნდებრცáƒáƒ áƒ˜áƒ”ლი სტრიქáƒáƒœáƒ˜ დრ\"00000\"\n" -#: help.c:435 +#: help.c:413 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3425,7 +3475,7 @@ msgstr "" " ON_ERROR_ROLLBACK\n" " თუ დáƒáƒ§áƒ”ნებულიáƒ, შეცდáƒáƒ›áƒ ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¡ áƒáƒ  გáƒáƒáƒ©áƒ”რებს (გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრáƒáƒ áƒáƒžáƒ˜áƒ áƒ“áƒáƒžáƒ˜áƒ áƒ˜ შესáƒáƒœáƒáƒ®áƒ˜ წერტილები)\n" -#: help.c:437 +#: help.c:415 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3433,7 +3483,7 @@ msgstr "" " ON_ERROR_STOP\n" " ბრძáƒáƒœáƒ”ბების პáƒáƒ™áƒ”ტის შესრულების შეწყვეტრპირველივე შეცდáƒáƒ›áƒ˜áƒ¡ შემდეგ\n" -#: help.c:439 +#: help.c:417 msgid "" " PORT\n" " server port of the current connection\n" @@ -3441,7 +3491,7 @@ msgstr "" " პáƒáƒ áƒ¢áƒ˜\n" " სერვერის პáƒáƒ áƒ¢áƒ˜ მიმდინáƒáƒ áƒ” შეერთებისთვის\n" -#: help.c:441 +#: help.c:419 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3449,7 +3499,7 @@ msgstr "" " PROMPT1\n" " psql-ის ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ\n" -#: help.c:443 +#: help.c:421 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3457,7 +3507,7 @@ msgstr "" " PROMPT2\n" " ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ მითითებáƒ, რáƒáƒªáƒ ბრძáƒáƒœáƒ”ბრწინრხáƒáƒ–იდáƒáƒœ გრძელდებáƒ\n" -#: help.c:445 +#: help.c:423 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3465,7 +3515,7 @@ msgstr "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" -#: help.c:447 +#: help.c:425 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3473,7 +3523,7 @@ msgstr "" " QUIET\n" " ჩუმი áƒáƒžáƒ”რáƒáƒªáƒ˜áƒ”ბი(იგივე, რáƒáƒª პáƒáƒ áƒáƒ›áƒ”ტრი -q)\n" -#: help.c:449 +#: help.c:427 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3481,7 +3531,7 @@ msgstr "" " ROW_COUNT\n" " ბáƒáƒšáƒ მáƒáƒ—ხáƒáƒ•ნის მიერ დáƒáƒ‘რუნებული áƒáƒœ შეცვლილი მწკრივები. áƒáƒœ 0\n" -#: help.c:451 +#: help.c:429 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3491,18 +3541,15 @@ msgstr "" " SERVER_VERSION_NUM\n" " სერვერის ვერსიáƒ(მáƒáƒ™áƒšáƒ” სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒœ რიცხვით ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜)\n" -#: help.c:454 +#: help.c:432 msgid "" " SHELL_ERROR\n" -" true if the last shell command failed, false if it succeeded\n" +" \"true\" if the last shell command failed, \"false\" if it succeeded\n" msgstr "" " SHELL_ERROR\n" -" true, თუ ბáƒáƒšáƒ მáƒáƒ—ხáƒáƒ•ნრáƒáƒ•áƒáƒ áƒ˜áƒ£áƒšáƒ˜ იყáƒ. áƒáƒ áƒáƒ“რfalse\n" +" \"true\", თუ ბáƒáƒšáƒ მáƒáƒ—ხáƒáƒ•ნრáƒáƒ•áƒáƒ áƒ˜áƒ£áƒšáƒ˜ იყáƒ. áƒáƒ áƒáƒ“რ\"false\"\n" -#: help.c:456 -#| msgid "" -#| " SHELL\n" -#| " shell used by the \\! command\n" +#: help.c:434 msgid "" " SHELL_EXIT_CODE\n" " exit status of the last shell command\n" @@ -3510,7 +3557,7 @@ msgstr "" " SHELL_EXIT_CODE\n" " გáƒáƒ áƒ¡áƒ˜áƒ¡ ბáƒáƒšáƒ ბრძáƒáƒœáƒ”ბის გáƒáƒ›áƒáƒ¡áƒ•ლის სტáƒáƒ¢áƒ£áƒ¡áƒ˜\n" -#: help.c:458 +#: help.c:436 msgid "" " SHOW_ALL_RESULTS\n" " show all results of a combined query (\\;) instead of only the last\n" @@ -3518,7 +3565,7 @@ msgstr "" " SHOW_ALL_RESULTS\n" " მხáƒáƒšáƒáƒ“ ბáƒáƒšáƒáƒ¡ მáƒáƒ’იერ კáƒáƒ›áƒ‘ინირებული მáƒáƒ—ხáƒáƒ•ნის ყველრშედეგის ჩვენებრ(\\;)\n" -#: help.c:460 +#: help.c:438 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3526,7 +3573,7 @@ msgstr "" " SHOW_CONTEXT\n" " შეტყáƒáƒ‘ინების კáƒáƒœáƒ¢áƒ”ქსტის ველების ჩვენების კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜[never, errors, always]\n" -#: help.c:462 +#: help.c:440 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3534,7 +3581,7 @@ msgstr "" " SINGLELINE\n" " iთუ დáƒáƒ§áƒ”ნებულიáƒ, ხáƒáƒ–ის დáƒáƒ‘áƒáƒšáƒáƒ”ბრSQL-ის ბრძáƒáƒœáƒ”ბáƒáƒ¡áƒáƒª დáƒáƒáƒ¡áƒ áƒ£áƒšáƒ”ბს (იგივე, რáƒáƒª -S პáƒáƒ áƒáƒ›áƒ”ტრი)\n" -#: help.c:464 +#: help.c:442 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3542,7 +3589,7 @@ msgstr "" " SINGLESTEP\n" " ერთნáƒáƒ‘იჯიáƒáƒœáƒ˜ რეჟიმი. (იგივე, რáƒáƒª -s პáƒáƒ áƒáƒ›áƒ”ტრი)\n" -#: help.c:466 +#: help.c:444 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3550,7 +3597,7 @@ msgstr "" " SQLSTATE\n" " უკáƒáƒœáƒáƒ¡áƒ™áƒœáƒ”ლი მáƒáƒ—ხáƒáƒ•ნის SQLSTATE. \"00000\", თუ შეცდáƒáƒ›áƒ áƒáƒ  მáƒáƒ›áƒ®áƒ“áƒáƒ áƒ\n" -#: help.c:468 +#: help.c:446 msgid "" " USER\n" " the currently connected database user\n" @@ -3558,7 +3605,7 @@ msgstr "" " USER\n" " ბáƒáƒ–áƒáƒ¡áƒ—áƒáƒœ მიერთებული მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: help.c:470 +#: help.c:448 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3566,7 +3613,7 @@ msgstr "" " VERBOSITY\n" " შეცდáƒáƒ›áƒ˜áƒ¡ áƒáƒœáƒ’áƒáƒ áƒ¨áƒ”ბის დეტáƒáƒšáƒ£áƒ áƒáƒ‘ის კáƒáƒœáƒ¢áƒ áƒáƒšáƒ˜ [default, verbose, terse, sqlstate]\n" -#: help.c:472 +#: help.c:450 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3578,7 +3625,7 @@ msgstr "" " VERSION_NUM\n" " psql-ის ვერსირ(სრული ვერსიáƒ, მáƒáƒ™áƒšáƒ” ვერსირთუ რიცხვითი ფáƒáƒ áƒ›áƒáƒ¢áƒ˜)\n" -#: help.c:477 +#: help.c:455 msgid "" "\n" "Display settings:\n" @@ -3586,7 +3633,7 @@ msgstr "" "\n" "ჩვენების პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: help.c:479 +#: help.c:457 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3596,7 +3643,7 @@ msgstr "" " áƒáƒœ \\pset სáƒáƒ® [მიშნვნ] psql-ში\n" "\n" -#: help.c:481 +#: help.c:459 msgid "" " border\n" " border style (number)\n" @@ -3604,7 +3651,7 @@ msgstr "" " border\n" " სáƒáƒ–ღვრის სტილი (რიცხვი)\n" -#: help.c:483 +#: help.c:461 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3612,7 +3659,7 @@ msgstr "" " columns\n" " სáƒáƒ›áƒ˜áƒ–ნის სიგáƒáƒœáƒ” გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡áƒ—ვის\n" -#: help.c:485 +#: help.c:463 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3620,7 +3667,7 @@ msgstr "" " expanded (or x)\n" " გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული გáƒáƒ›áƒáƒ¢áƒáƒœáƒ [on, off, auto]\n" -#: help.c:487 +#: help.c:465 #, c-format msgid "" " fieldsep\n" @@ -3629,7 +3676,7 @@ msgstr "" " fieldsep\n" " ველების გáƒáƒ›áƒ§áƒáƒ¤áƒ˜ დáƒáƒ£áƒšáƒáƒ’ების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒáƒ—ვის (ნáƒáƒ’ულისხმები \"%s\")\n" -#: help.c:490 +#: help.c:468 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3637,7 +3684,7 @@ msgstr "" " fieldsep_zero\n" " დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ველების გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ¡ ნულáƒáƒ•áƒáƒœ ბáƒáƒ˜áƒ¢áƒ–ე დáƒáƒ§áƒ”ნებáƒ\n" -#: help.c:492 +#: help.c:470 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3645,7 +3692,7 @@ msgstr "" " footer\n" " ცხრილის მინáƒáƒ¬áƒ”რების ჩვენების ჩáƒáƒáƒ áƒ—/გáƒáƒ›áƒáƒ áƒ—[on, off]\n" -#: help.c:494 +#: help.c:472 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3653,7 +3700,7 @@ msgstr "" " format\n" " გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებრ[unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:496 +#: help.c:474 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3661,7 +3708,7 @@ msgstr "" " linestyle\n" " სáƒáƒ–ღვრის ხáƒáƒ–ის ხáƒáƒ¢áƒ•ის სტილი [ascii, old-ascii, unicode]\n" -#: help.c:498 +#: help.c:476 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3669,7 +3716,7 @@ msgstr "" " null\n" " ნულáƒáƒ•áƒáƒœáƒ˜ ბáƒáƒ˜áƒ¢áƒ˜áƒ¡ მიერ ნáƒáƒ©áƒ•ენები სიმბáƒáƒšáƒ\n" -#: help.c:500 +#: help.c:478 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3677,7 +3724,7 @@ msgstr "" " numericlocale\n" " ციფრის ჯგუფების გáƒáƒ¡áƒáƒ§áƒáƒ¤áƒáƒ“ ენის სპეციფიკური სიმბáƒáƒšáƒáƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" -#: help.c:502 +#: help.c:480 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3685,7 +3732,7 @@ msgstr "" " pager\n" " გვერდების გáƒáƒ áƒ” გáƒáƒ“áƒáƒ›áƒ áƒ—ველის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ[yes, no, always]\n" -#: help.c:504 +#: help.c:482 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3693,7 +3740,7 @@ msgstr "" " recordsep\n" " დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რების(ხáƒáƒ–ების) გáƒáƒ›áƒ§áƒáƒ¤áƒ˜\n" -#: help.c:506 +#: help.c:484 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3701,7 +3748,7 @@ msgstr "" " recordsep_zero\n" " დáƒáƒ£áƒšáƒáƒ’ებელი გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ველების გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ¡ ნულáƒáƒ•áƒáƒœ ბáƒáƒ˜áƒ¢áƒ–ე დáƒáƒ§áƒ”ნებáƒ\n" -#: help.c:508 +#: help.c:486 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3711,7 +3758,7 @@ msgstr "" " მიუთითებს HTML ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ table ჭდის áƒáƒ¢áƒ áƒ˜áƒ‘უტებს áƒáƒœ სვეტების პáƒáƒžáƒáƒ áƒªáƒ˜áƒ£áƒš სიგáƒáƒœáƒ”ს\n" " მáƒáƒ áƒªáƒ®áƒœáƒ˜áƒ• სწáƒáƒ áƒ”ბული მáƒáƒœáƒáƒªáƒ”მების ტიპებისთვის latex-longtable ფáƒáƒ áƒ›áƒáƒ¢áƒ¨áƒ˜\n" -#: help.c:511 +#: help.c:489 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3719,7 +3766,7 @@ msgstr "" " title\n" " ცხრილის სáƒáƒ—áƒáƒ£áƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებრშემდგáƒáƒ› დáƒáƒ‘ეჭდილი ცხრილებისთვის\n" -#: help.c:513 +#: help.c:491 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3727,7 +3774,7 @@ msgstr "" " tuples_only\n" " თუ დáƒáƒ§áƒ”ნებულიáƒ, ნáƒáƒ©áƒ•ენები იქნებრმხáƒáƒšáƒáƒ“ მიმდინáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მები\n" -#: help.c:515 +#: help.c:493 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3739,7 +3786,17 @@ msgstr "" " unicode_header_linestyle\n" " უნიკáƒáƒ“ის ხáƒáƒ–ის დáƒáƒ®áƒáƒ¢áƒ•ის სტილი [single, double]\n" -#: help.c:520 +#: help.c:497 +msgid "" +" xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr "" +" xheader_width\n" +" áƒáƒ§áƒ”ნებს თáƒáƒ•სáƒáƒ áƒ—ის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ  სიგáƒáƒœáƒ”ს გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡áƒ—ვის\n" +" [სრული, სვეტი, გვერდი, მთელი_რიცხვი]\n" + +#: help.c:501 msgid "" "\n" "Environment variables:\n" @@ -3747,7 +3804,7 @@ msgstr "" "\n" "გáƒáƒ áƒ”მáƒáƒ¡ ცვლáƒáƒ“ები:\n" -#: help.c:524 +#: help.c:505 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3757,7 +3814,7 @@ msgstr "" " áƒáƒœ \\setenv სáƒáƒ®áƒ”ლი[მნიშვნელáƒáƒ‘რ] psql-ის სიგნით\n" "\n" -#: help.c:526 +#: help.c:507 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3769,7 +3826,7 @@ msgstr "" " áƒáƒœ \\setenv სáƒáƒ®áƒ”ლი [მნიშვნელáƒáƒ‘áƒ] psql-ში\n" "\n" -#: help.c:529 +#: help.c:510 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3777,7 +3834,7 @@ msgstr "" " COLUMNS\n" " გáƒáƒ“áƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡ სვეტების რáƒáƒáƒ“ენáƒáƒ‘áƒ\n" -#: help.c:531 +#: help.c:512 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3785,7 +3842,7 @@ msgstr "" " PGAPPNAME\n" " იგივე, რáƒáƒª შეერთების პáƒáƒ áƒáƒ›áƒ”ტრი áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი\n" -#: help.c:533 +#: help.c:514 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3793,7 +3850,7 @@ msgstr "" " PGDATABASE\n" " იგივე, რáƒáƒª შეერთების dbname პáƒáƒ áƒáƒ›áƒ”ტრი\n" -#: help.c:535 +#: help.c:516 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3801,7 +3858,7 @@ msgstr "" " PGHOST\n" " იგივე, რáƒáƒª ჰáƒáƒ¡áƒ¢áƒ˜ შეერთების პáƒáƒ áƒáƒ›áƒ”ტრებში\n" -#: help.c:537 +#: help.c:518 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3809,7 +3866,7 @@ msgstr "" " PGPASSFILE\n" " პáƒáƒ áƒáƒšáƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n" -#: help.c:539 +#: help.c:520 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -3817,7 +3874,7 @@ msgstr "" " PGPASSWORD\n" " შეერთების პáƒáƒ áƒáƒšáƒ˜ (რეკáƒáƒ›áƒ”ნდებული áƒáƒ áƒáƒ)\n" -#: help.c:541 +#: help.c:522 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3825,7 +3882,7 @@ msgstr "" " PGPORT\n" " იგივე, რáƒáƒª პáƒáƒ áƒ¢áƒ˜ შეერთების პáƒáƒ áƒáƒ›áƒ”ტრებში\n" -#: help.c:543 +#: help.c:524 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3833,7 +3890,7 @@ msgstr "" " PGUSER\n" " იგივე, რáƒáƒª მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი შეერთების პáƒáƒ áƒáƒ›áƒ”ტრებში\n" -#: help.c:545 +#: help.c:526 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3841,7 +3898,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " \\e, \\ef, დრ\\ev ბრძáƒáƒœáƒ”ბის მიერ გáƒáƒ›áƒáƒ§áƒ”ნებული რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜\n" -#: help.c:547 +#: help.c:528 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3849,7 +3906,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " რედáƒáƒ¥áƒ¢áƒáƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბისáƒáƒ¡ ხáƒáƒ–ის ნáƒáƒ›áƒ áƒ˜áƒ¡ მითითების ხერხი\n" -#: help.c:549 +#: help.c:530 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -3857,7 +3914,7 @@ msgstr "" " PSQL_HISTORY\n" " ბრძáƒáƒœáƒ”ბების ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n" -#: help.c:551 +#: help.c:532 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -3865,7 +3922,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " გვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი გáƒáƒ áƒ” პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი\n" -#: help.c:554 +#: help.c:535 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" @@ -3873,7 +3930,7 @@ msgstr "" " PSQL_WATCH_PAGER\n" " \\watch-ისთვის გáƒáƒ›áƒáƒ§áƒ”ნებული გვერდების გáƒáƒ“áƒáƒ›áƒ áƒ—ველი გáƒáƒ áƒ” პრáƒáƒ’რáƒáƒ›áƒ\n" -#: help.c:557 +#: help.c:538 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -3881,7 +3938,7 @@ msgstr "" " PSQLRC\n" " მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის .psqlrc ფáƒáƒ˜áƒšáƒ˜áƒ¡ áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n" -#: help.c:559 +#: help.c:540 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -3889,7 +3946,7 @@ msgstr "" " SHELL\n" " \\! ბრძáƒáƒœáƒ”ბის მიერ გáƒáƒ›áƒáƒ§áƒ”ნებული გáƒáƒ áƒ¡áƒ˜\n" -#: help.c:561 +#: help.c:542 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -3897,11 +3954,11 @@ msgstr "" " TMPDIR\n" " დრáƒáƒ”ბითი ფáƒáƒ˜áƒšáƒ”ბის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: help.c:621 +#: help.c:602 msgid "Available help:\n" msgstr "ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ დáƒáƒ®áƒ›áƒáƒ áƒ”ბáƒ:\n" -#: help.c:716 +#: help.c:697 #, c-format msgid "" "Command: %s\n" @@ -3920,7 +3977,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:739 +#: help.c:720 #, c-format msgid "" "No help available for \"%s\".\n" @@ -3929,17 +3986,17 @@ msgstr "" "\"%s\"-ისთვის დáƒáƒ®áƒ›áƒáƒ áƒ”ბრმიუწვდáƒáƒ›áƒ”ლიáƒ.\n" "ხელმისáƒáƒ¬áƒ•დáƒáƒ›áƒ˜ დáƒáƒ®áƒ›áƒáƒ áƒ”ბის სáƒáƒœáƒáƒ®áƒáƒ•áƒáƒ“ სცáƒáƒ“ეთ \\h .\n" -#: input.c:216 +#: input.c:215 #, c-format msgid "could not read from input file: %m" msgstr "შემáƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" -#: input.c:477 input.c:515 +#: input.c:476 input.c:514 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "ისტáƒáƒ áƒ˜áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") შენáƒáƒ®áƒ•ის შეცდáƒáƒ›áƒ: %m" -#: input.c:534 +#: input.c:533 #, c-format msgid "history is not supported by this installation" msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ ისტáƒáƒ áƒ˜áƒ˜áƒ¡ მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" @@ -4026,12 +4083,12 @@ msgstr "მáƒáƒ—ხáƒáƒ•ნრიგნáƒáƒ áƒ˜áƒ áƒ”ბულიáƒ; მი msgid "reached EOF without finding closing \\endif(s)" msgstr "მიღწეულირEOF დáƒáƒ›áƒ®áƒ£áƒ áƒáƒ•ი \\endif-ების პáƒáƒ•ნის გáƒáƒ áƒ”შე" -#: psqlscanslash.l:640 +#: psqlscanslash.l:642 #, c-format msgid "unterminated quoted string" msgstr "ბრჭყáƒáƒšáƒ”ბში ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ ციტáƒáƒ¢áƒ˜áƒ¡ დáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელი სტრიქáƒáƒœáƒ˜" -#: psqlscanslash.l:825 +#: psqlscanslash.l:842 #, c-format msgid "%s: out of memory" msgstr "%s: áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" @@ -4039,2430 +4096,2447 @@ msgstr "%s: áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" #: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 #: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 #: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 -#: sql_help.c:126 sql_help.c:130 sql_help.c:132 sql_help.c:134 sql_help.c:239 -#: sql_help.c:241 sql_help.c:242 sql_help.c:244 sql_help.c:246 sql_help.c:249 -#: sql_help.c:251 sql_help.c:253 sql_help.c:255 sql_help.c:267 sql_help.c:268 -#: sql_help.c:269 sql_help.c:271 sql_help.c:320 sql_help.c:322 sql_help.c:324 -#: sql_help.c:326 sql_help.c:395 sql_help.c:400 sql_help.c:402 sql_help.c:444 -#: sql_help.c:446 sql_help.c:449 sql_help.c:451 sql_help.c:520 sql_help.c:525 -#: sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:594 sql_help.c:596 -#: sql_help.c:598 sql_help.c:600 sql_help.c:602 sql_help.c:605 sql_help.c:607 -#: sql_help.c:610 sql_help.c:621 sql_help.c:623 sql_help.c:667 sql_help.c:669 -#: sql_help.c:671 sql_help.c:674 sql_help.c:676 sql_help.c:678 sql_help.c:715 -#: sql_help.c:719 sql_help.c:723 sql_help.c:742 sql_help.c:745 sql_help.c:748 -#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 -#: sql_help.c:818 sql_help.c:821 sql_help.c:850 sql_help.c:855 sql_help.c:860 -#: sql_help.c:865 sql_help.c:870 sql_help.c:897 sql_help.c:899 sql_help.c:901 -#: sql_help.c:903 sql_help.c:906 sql_help.c:908 sql_help.c:955 sql_help.c:1001 -#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 -#: sql_help.c:1040 sql_help.c:1051 sql_help.c:1053 sql_help.c:1073 -#: sql_help.c:1083 sql_help.c:1084 sql_help.c:1086 sql_help.c:1088 -#: sql_help.c:1100 sql_help.c:1104 sql_help.c:1106 sql_help.c:1118 -#: sql_help.c:1120 sql_help.c:1122 sql_help.c:1124 sql_help.c:1143 -#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 sql_help.c:1157 -#: sql_help.c:1160 sql_help.c:1161 sql_help.c:1162 sql_help.c:1165 -#: sql_help.c:1168 sql_help.c:1170 sql_help.c:1310 sql_help.c:1312 -#: sql_help.c:1315 sql_help.c:1318 sql_help.c:1320 sql_help.c:1322 -#: sql_help.c:1325 sql_help.c:1328 sql_help.c:1445 sql_help.c:1447 -#: sql_help.c:1449 sql_help.c:1452 sql_help.c:1473 sql_help.c:1476 -#: sql_help.c:1479 sql_help.c:1482 sql_help.c:1486 sql_help.c:1488 -#: sql_help.c:1490 sql_help.c:1492 sql_help.c:1506 sql_help.c:1509 -#: sql_help.c:1511 sql_help.c:1513 sql_help.c:1523 sql_help.c:1525 -#: sql_help.c:1535 sql_help.c:1537 sql_help.c:1547 sql_help.c:1550 -#: sql_help.c:1573 sql_help.c:1575 sql_help.c:1577 sql_help.c:1579 -#: sql_help.c:1582 sql_help.c:1584 sql_help.c:1587 sql_help.c:1590 -#: sql_help.c:1641 sql_help.c:1685 sql_help.c:1688 sql_help.c:1690 -#: sql_help.c:1692 sql_help.c:1695 sql_help.c:1697 sql_help.c:1699 -#: sql_help.c:1702 sql_help.c:1754 sql_help.c:1770 sql_help.c:2003 -#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2104 sql_help.c:2162 -#: sql_help.c:2170 sql_help.c:2180 sql_help.c:2207 sql_help.c:2239 -#: sql_help.c:2257 sql_help.c:2285 sql_help.c:2396 sql_help.c:2442 -#: sql_help.c:2467 sql_help.c:2490 sql_help.c:2494 sql_help.c:2528 -#: sql_help.c:2548 sql_help.c:2570 sql_help.c:2584 sql_help.c:2605 -#: sql_help.c:2634 sql_help.c:2669 sql_help.c:2694 sql_help.c:2741 -#: sql_help.c:3036 sql_help.c:3049 sql_help.c:3066 sql_help.c:3082 -#: sql_help.c:3122 sql_help.c:3176 sql_help.c:3180 sql_help.c:3182 -#: sql_help.c:3189 sql_help.c:3208 sql_help.c:3235 sql_help.c:3270 -#: sql_help.c:3282 sql_help.c:3291 sql_help.c:3335 sql_help.c:3349 -#: sql_help.c:3377 sql_help.c:3385 sql_help.c:3397 sql_help.c:3407 -#: sql_help.c:3415 sql_help.c:3423 sql_help.c:3431 sql_help.c:3439 -#: sql_help.c:3448 sql_help.c:3459 sql_help.c:3467 sql_help.c:3475 -#: sql_help.c:3483 sql_help.c:3491 sql_help.c:3501 sql_help.c:3510 -#: sql_help.c:3519 sql_help.c:3527 sql_help.c:3537 sql_help.c:3548 -#: sql_help.c:3556 sql_help.c:3565 sql_help.c:3576 sql_help.c:3585 -#: sql_help.c:3593 sql_help.c:3601 sql_help.c:3609 sql_help.c:3617 -#: sql_help.c:3625 sql_help.c:3633 sql_help.c:3641 sql_help.c:3649 -#: sql_help.c:3657 sql_help.c:3665 sql_help.c:3682 sql_help.c:3691 -#: sql_help.c:3699 sql_help.c:3716 sql_help.c:3731 sql_help.c:4043 -#: sql_help.c:4153 sql_help.c:4182 sql_help.c:4198 sql_help.c:4200 -#: sql_help.c:4703 sql_help.c:4751 sql_help.c:4909 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:245 +#: sql_help.c:247 sql_help.c:248 sql_help.c:250 sql_help.c:252 sql_help.c:255 +#: sql_help.c:257 sql_help.c:259 sql_help.c:261 sql_help.c:276 sql_help.c:277 +#: sql_help.c:278 sql_help.c:280 sql_help.c:329 sql_help.c:331 sql_help.c:333 +#: sql_help.c:335 sql_help.c:404 sql_help.c:409 sql_help.c:411 sql_help.c:453 +#: sql_help.c:455 sql_help.c:458 sql_help.c:460 sql_help.c:529 sql_help.c:534 +#: sql_help.c:539 sql_help.c:544 sql_help.c:549 sql_help.c:603 sql_help.c:605 +#: sql_help.c:607 sql_help.c:609 sql_help.c:611 sql_help.c:614 sql_help.c:616 +#: sql_help.c:619 sql_help.c:630 sql_help.c:632 sql_help.c:676 sql_help.c:678 +#: sql_help.c:680 sql_help.c:683 sql_help.c:685 sql_help.c:687 sql_help.c:728 +#: sql_help.c:732 sql_help.c:736 sql_help.c:757 sql_help.c:760 sql_help.c:763 +#: sql_help.c:792 sql_help.c:804 sql_help.c:812 sql_help.c:815 sql_help.c:818 +#: sql_help.c:833 sql_help.c:836 sql_help.c:865 sql_help.c:870 sql_help.c:875 +#: sql_help.c:880 sql_help.c:885 sql_help.c:912 sql_help.c:914 sql_help.c:916 +#: sql_help.c:918 sql_help.c:921 sql_help.c:923 sql_help.c:970 sql_help.c:1015 +#: sql_help.c:1020 sql_help.c:1025 sql_help.c:1030 sql_help.c:1035 +#: sql_help.c:1054 sql_help.c:1065 sql_help.c:1067 sql_help.c:1087 +#: sql_help.c:1097 sql_help.c:1098 sql_help.c:1100 sql_help.c:1102 +#: sql_help.c:1114 sql_help.c:1118 sql_help.c:1120 sql_help.c:1132 +#: sql_help.c:1134 sql_help.c:1136 sql_help.c:1138 sql_help.c:1157 +#: sql_help.c:1159 sql_help.c:1163 sql_help.c:1167 sql_help.c:1171 +#: sql_help.c:1174 sql_help.c:1175 sql_help.c:1176 sql_help.c:1179 +#: sql_help.c:1182 sql_help.c:1184 sql_help.c:1324 sql_help.c:1326 +#: sql_help.c:1329 sql_help.c:1332 sql_help.c:1334 sql_help.c:1336 +#: sql_help.c:1339 sql_help.c:1342 sql_help.c:1464 sql_help.c:1466 +#: sql_help.c:1468 sql_help.c:1471 sql_help.c:1492 sql_help.c:1495 +#: sql_help.c:1498 sql_help.c:1501 sql_help.c:1505 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1525 sql_help.c:1528 +#: sql_help.c:1530 sql_help.c:1532 sql_help.c:1542 sql_help.c:1544 +#: sql_help.c:1554 sql_help.c:1556 sql_help.c:1566 sql_help.c:1569 +#: sql_help.c:1592 sql_help.c:1594 sql_help.c:1596 sql_help.c:1598 +#: sql_help.c:1601 sql_help.c:1603 sql_help.c:1606 sql_help.c:1609 +#: sql_help.c:1660 sql_help.c:1703 sql_help.c:1706 sql_help.c:1708 +#: sql_help.c:1710 sql_help.c:1713 sql_help.c:1715 sql_help.c:1717 +#: sql_help.c:1720 sql_help.c:1770 sql_help.c:1786 sql_help.c:2019 +#: sql_help.c:2088 sql_help.c:2107 sql_help.c:2120 sql_help.c:2178 +#: sql_help.c:2186 sql_help.c:2196 sql_help.c:2224 sql_help.c:2257 +#: sql_help.c:2275 sql_help.c:2303 sql_help.c:2414 sql_help.c:2460 +#: sql_help.c:2485 sql_help.c:2508 sql_help.c:2512 sql_help.c:2546 +#: sql_help.c:2566 sql_help.c:2588 sql_help.c:2602 sql_help.c:2623 +#: sql_help.c:2652 sql_help.c:2685 sql_help.c:2708 sql_help.c:2755 +#: sql_help.c:3053 sql_help.c:3066 sql_help.c:3083 sql_help.c:3099 +#: sql_help.c:3139 sql_help.c:3193 sql_help.c:3197 sql_help.c:3199 +#: sql_help.c:3206 sql_help.c:3225 sql_help.c:3252 sql_help.c:3287 +#: sql_help.c:3299 sql_help.c:3308 sql_help.c:3352 sql_help.c:3366 +#: sql_help.c:3394 sql_help.c:3402 sql_help.c:3414 sql_help.c:3424 +#: sql_help.c:3432 sql_help.c:3440 sql_help.c:3448 sql_help.c:3456 +#: sql_help.c:3465 sql_help.c:3476 sql_help.c:3484 sql_help.c:3492 +#: sql_help.c:3500 sql_help.c:3508 sql_help.c:3518 sql_help.c:3527 +#: sql_help.c:3536 sql_help.c:3544 sql_help.c:3554 sql_help.c:3565 +#: sql_help.c:3573 sql_help.c:3582 sql_help.c:3593 sql_help.c:3602 +#: sql_help.c:3610 sql_help.c:3618 sql_help.c:3626 sql_help.c:3634 +#: sql_help.c:3642 sql_help.c:3650 sql_help.c:3658 sql_help.c:3666 +#: sql_help.c:3674 sql_help.c:3682 sql_help.c:3699 sql_help.c:3708 +#: sql_help.c:3716 sql_help.c:3733 sql_help.c:3748 sql_help.c:4061 +#: sql_help.c:4182 sql_help.c:4211 sql_help.c:4227 sql_help.c:4229 +#: sql_help.c:4733 sql_help.c:4781 sql_help.c:4940 msgid "name" -msgstr "სáƒáƒ®áƒ”ლი" +msgstr "name" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:331 sql_help.c:1851 -#: sql_help.c:3350 sql_help.c:4471 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:340 sql_help.c:1863 +#: sql_help.c:3367 sql_help.c:4500 msgid "aggregate_signature" msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლმáƒáƒ¬áƒ”რáƒ" -#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:254 -#: sql_help.c:272 sql_help.c:403 sql_help.c:450 sql_help.c:529 sql_help.c:577 -#: sql_help.c:595 sql_help.c:622 sql_help.c:675 sql_help.c:744 sql_help.c:799 -#: sql_help.c:820 sql_help.c:859 sql_help.c:909 sql_help.c:956 sql_help.c:1010 -#: sql_help.c:1042 sql_help.c:1052 sql_help.c:1087 sql_help.c:1107 -#: sql_help.c:1121 sql_help.c:1171 sql_help.c:1319 sql_help.c:1446 -#: sql_help.c:1489 sql_help.c:1510 sql_help.c:1524 sql_help.c:1536 -#: sql_help.c:1549 sql_help.c:1576 sql_help.c:1642 sql_help.c:1696 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:260 +#: sql_help.c:281 sql_help.c:412 sql_help.c:459 sql_help.c:538 sql_help.c:586 +#: sql_help.c:604 sql_help.c:631 sql_help.c:684 sql_help.c:759 sql_help.c:814 +#: sql_help.c:835 sql_help.c:874 sql_help.c:924 sql_help.c:971 sql_help.c:1024 +#: sql_help.c:1056 sql_help.c:1066 sql_help.c:1101 sql_help.c:1121 +#: sql_help.c:1135 sql_help.c:1185 sql_help.c:1333 sql_help.c:1465 +#: sql_help.c:1508 sql_help.c:1529 sql_help.c:1543 sql_help.c:1555 +#: sql_help.c:1568 sql_help.c:1595 sql_help.c:1661 sql_help.c:1714 msgid "new_name" msgstr "áƒáƒ®áƒáƒšáƒ˜_სáƒáƒ®áƒ”ლი" -#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:252 -#: sql_help.c:270 sql_help.c:401 sql_help.c:486 sql_help.c:534 sql_help.c:624 -#: sql_help.c:633 sql_help.c:698 sql_help.c:718 sql_help.c:747 sql_help.c:802 -#: sql_help.c:864 sql_help.c:907 sql_help.c:1015 sql_help.c:1054 -#: sql_help.c:1085 sql_help.c:1105 sql_help.c:1119 sql_help.c:1169 -#: sql_help.c:1383 sql_help.c:1448 sql_help.c:1491 sql_help.c:1512 -#: sql_help.c:1574 sql_help.c:1691 sql_help.c:3022 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:258 +#: sql_help.c:279 sql_help.c:410 sql_help.c:495 sql_help.c:543 sql_help.c:633 +#: sql_help.c:642 sql_help.c:707 sql_help.c:731 sql_help.c:762 sql_help.c:817 +#: sql_help.c:879 sql_help.c:922 sql_help.c:1029 sql_help.c:1068 +#: sql_help.c:1099 sql_help.c:1119 sql_help.c:1133 sql_help.c:1183 +#: sql_help.c:1399 sql_help.c:1467 sql_help.c:1510 sql_help.c:1531 +#: sql_help.c:1593 sql_help.c:1709 sql_help.c:3039 msgid "new_owner" msgstr "áƒáƒ®áƒáƒšáƒ˜_მფლáƒáƒ‘ელი" -#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:256 sql_help.c:323 -#: sql_help.c:452 sql_help.c:539 sql_help.c:677 sql_help.c:722 sql_help.c:750 -#: sql_help.c:805 sql_help.c:869 sql_help.c:1020 sql_help.c:1089 -#: sql_help.c:1123 sql_help.c:1321 sql_help.c:1493 sql_help.c:1514 -#: sql_help.c:1526 sql_help.c:1538 sql_help.c:1578 sql_help.c:1698 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:262 sql_help.c:332 +#: sql_help.c:461 sql_help.c:548 sql_help.c:686 sql_help.c:735 sql_help.c:765 +#: sql_help.c:820 sql_help.c:884 sql_help.c:1034 sql_help.c:1103 +#: sql_help.c:1137 sql_help.c:1335 sql_help.c:1512 sql_help.c:1533 +#: sql_help.c:1545 sql_help.c:1557 sql_help.c:1597 sql_help.c:1716 msgid "new_schema" msgstr "áƒáƒ®áƒáƒšáƒ˜_სქემáƒ" -#: sql_help.c:44 sql_help.c:1915 sql_help.c:3351 sql_help.c:4500 +#: sql_help.c:44 sql_help.c:1927 sql_help.c:3368 sql_help.c:4529 msgid "where aggregate_signature is:" msgstr "სáƒáƒ“áƒáƒª aggregate_signature áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:341 sql_help.c:354 -#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 -#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 -#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1002 -#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 -#: sql_help.c:1869 sql_help.c:1886 sql_help.c:1892 sql_help.c:1916 -#: sql_help.c:1919 sql_help.c:1922 sql_help.c:2073 sql_help.c:2092 -#: sql_help.c:2095 sql_help.c:2397 sql_help.c:2606 sql_help.c:3352 -#: sql_help.c:3355 sql_help.c:3358 sql_help.c:3449 sql_help.c:3538 -#: sql_help.c:3566 sql_help.c:3918 sql_help.c:4370 sql_help.c:4477 -#: sql_help.c:4484 sql_help.c:4490 sql_help.c:4501 sql_help.c:4504 -#: sql_help.c:4507 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:350 sql_help.c:363 +#: sql_help.c:367 sql_help.c:383 sql_help.c:386 sql_help.c:389 sql_help.c:530 +#: sql_help.c:535 sql_help.c:540 sql_help.c:545 sql_help.c:550 sql_help.c:866 +#: sql_help.c:871 sql_help.c:876 sql_help.c:881 sql_help.c:886 sql_help.c:1016 +#: sql_help.c:1021 sql_help.c:1026 sql_help.c:1031 sql_help.c:1036 +#: sql_help.c:1881 sql_help.c:1898 sql_help.c:1904 sql_help.c:1928 +#: sql_help.c:1931 sql_help.c:1934 sql_help.c:2089 sql_help.c:2108 +#: sql_help.c:2111 sql_help.c:2415 sql_help.c:2624 sql_help.c:3369 +#: sql_help.c:3372 sql_help.c:3375 sql_help.c:3466 sql_help.c:3555 +#: sql_help.c:3583 sql_help.c:3936 sql_help.c:4399 sql_help.c:4506 +#: sql_help.c:4513 sql_help.c:4519 sql_help.c:4530 sql_help.c:4533 +#: sql_help.c:4536 msgid "argmode" msgstr "áƒáƒ áƒ’რეჟიმი" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:342 sql_help.c:355 -#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 -#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 -#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1003 -#: sql_help.c:1008 sql_help.c:1013 sql_help.c:1018 sql_help.c:1023 -#: sql_help.c:1870 sql_help.c:1887 sql_help.c:1893 sql_help.c:1917 -#: sql_help.c:1920 sql_help.c:1923 sql_help.c:2074 sql_help.c:2093 -#: sql_help.c:2096 sql_help.c:2398 sql_help.c:2607 sql_help.c:3353 -#: sql_help.c:3356 sql_help.c:3359 sql_help.c:3450 sql_help.c:3539 -#: sql_help.c:3567 sql_help.c:4478 sql_help.c:4485 sql_help.c:4491 -#: sql_help.c:4502 sql_help.c:4505 sql_help.c:4508 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:351 sql_help.c:364 +#: sql_help.c:368 sql_help.c:384 sql_help.c:387 sql_help.c:390 sql_help.c:531 +#: sql_help.c:536 sql_help.c:541 sql_help.c:546 sql_help.c:551 sql_help.c:867 +#: sql_help.c:872 sql_help.c:877 sql_help.c:882 sql_help.c:887 sql_help.c:1017 +#: sql_help.c:1022 sql_help.c:1027 sql_help.c:1032 sql_help.c:1037 +#: sql_help.c:1882 sql_help.c:1899 sql_help.c:1905 sql_help.c:1929 +#: sql_help.c:1932 sql_help.c:1935 sql_help.c:2090 sql_help.c:2109 +#: sql_help.c:2112 sql_help.c:2416 sql_help.c:2625 sql_help.c:3370 +#: sql_help.c:3373 sql_help.c:3376 sql_help.c:3467 sql_help.c:3556 +#: sql_help.c:3584 sql_help.c:4507 sql_help.c:4514 sql_help.c:4520 +#: sql_help.c:4531 sql_help.c:4534 sql_help.c:4537 msgid "argname" msgstr "áƒáƒ áƒ’სáƒáƒ®áƒ”ლი" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:343 sql_help.c:356 -#: sql_help.c:360 sql_help.c:376 sql_help.c:379 sql_help.c:382 sql_help.c:523 -#: sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:543 sql_help.c:853 -#: sql_help.c:858 sql_help.c:863 sql_help.c:868 sql_help.c:873 sql_help.c:1004 -#: sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 sql_help.c:1024 -#: sql_help.c:1871 sql_help.c:1888 sql_help.c:1894 sql_help.c:1918 -#: sql_help.c:1921 sql_help.c:1924 sql_help.c:2399 sql_help.c:2608 -#: sql_help.c:3354 sql_help.c:3357 sql_help.c:3360 sql_help.c:3451 -#: sql_help.c:3540 sql_help.c:3568 sql_help.c:4479 sql_help.c:4486 -#: sql_help.c:4492 sql_help.c:4503 sql_help.c:4506 sql_help.c:4509 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:352 sql_help.c:365 +#: sql_help.c:369 sql_help.c:385 sql_help.c:388 sql_help.c:391 sql_help.c:532 +#: sql_help.c:537 sql_help.c:542 sql_help.c:547 sql_help.c:552 sql_help.c:868 +#: sql_help.c:873 sql_help.c:878 sql_help.c:883 sql_help.c:888 sql_help.c:1018 +#: sql_help.c:1023 sql_help.c:1028 sql_help.c:1033 sql_help.c:1038 +#: sql_help.c:1883 sql_help.c:1900 sql_help.c:1906 sql_help.c:1930 +#: sql_help.c:1933 sql_help.c:1936 sql_help.c:2417 sql_help.c:2626 +#: sql_help.c:3371 sql_help.c:3374 sql_help.c:3377 sql_help.c:3468 +#: sql_help.c:3557 sql_help.c:3585 sql_help.c:4508 sql_help.c:4515 +#: sql_help.c:4521 sql_help.c:4532 sql_help.c:4535 sql_help.c:4538 msgid "argtype" msgstr "áƒáƒ áƒ’ტიპი" -#: sql_help.c:114 sql_help.c:398 sql_help.c:475 sql_help.c:487 sql_help.c:950 -#: sql_help.c:1102 sql_help.c:1507 sql_help.c:1636 sql_help.c:1669 -#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1973 sql_help.c:1980 -#: sql_help.c:2288 sql_help.c:2338 sql_help.c:2345 sql_help.c:2354 -#: sql_help.c:2443 sql_help.c:2670 sql_help.c:2763 sql_help.c:3051 -#: sql_help.c:3236 sql_help.c:3258 sql_help.c:3398 sql_help.c:3754 -#: sql_help.c:3962 sql_help.c:4197 sql_help.c:4199 sql_help.c:4976 +#: sql_help.c:114 sql_help.c:407 sql_help.c:484 sql_help.c:496 sql_help.c:965 +#: sql_help.c:1116 sql_help.c:1526 sql_help.c:1655 sql_help.c:1687 +#: sql_help.c:1739 sql_help.c:1798 sql_help.c:1987 sql_help.c:1994 +#: sql_help.c:2306 sql_help.c:2356 sql_help.c:2363 sql_help.c:2372 +#: sql_help.c:2461 sql_help.c:2686 sql_help.c:2777 sql_help.c:3068 +#: sql_help.c:3253 sql_help.c:3275 sql_help.c:3415 sql_help.c:3772 +#: sql_help.c:3980 sql_help.c:4226 sql_help.c:4228 sql_help.c:5006 msgid "option" msgstr "მáƒáƒ áƒ’ებáƒ" -#: sql_help.c:115 sql_help.c:951 sql_help.c:1637 sql_help.c:2444 -#: sql_help.c:2671 sql_help.c:3237 sql_help.c:3399 +#: sql_help.c:115 sql_help.c:966 sql_help.c:1656 sql_help.c:2462 +#: sql_help.c:2687 sql_help.c:3254 sql_help.c:3416 msgid "where option can be:" msgstr "სáƒáƒ“áƒáƒª option შეიძლებრიყáƒáƒ¡:" -#: sql_help.c:116 sql_help.c:2220 +#: sql_help.c:116 sql_help.c:2238 msgid "allowconn" msgstr "შეერთ_ნებáƒáƒ áƒ—ვ" -#: sql_help.c:117 sql_help.c:952 sql_help.c:1638 sql_help.c:2221 -#: sql_help.c:2445 sql_help.c:2672 sql_help.c:3238 +#: sql_help.c:117 sql_help.c:967 sql_help.c:1657 sql_help.c:2239 +#: sql_help.c:2463 sql_help.c:2688 sql_help.c:3255 msgid "connlimit" msgstr "შეერთ_ლიმიტი" -#: sql_help.c:118 sql_help.c:2222 +#: sql_help.c:118 sql_help.c:2240 msgid "istemplate" msgstr "შáƒáƒ‘ლáƒáƒœáƒ˜áƒ" -#: sql_help.c:124 sql_help.c:612 sql_help.c:680 sql_help.c:694 sql_help.c:1324 -#: sql_help.c:1376 sql_help.c:4203 +#: sql_help.c:124 sql_help.c:621 sql_help.c:689 sql_help.c:703 sql_help.c:1338 +#: sql_help.c:1392 sql_help.c:4232 msgid "new_tablespace" msgstr "ცხრილების_áƒáƒ®áƒáƒšáƒ˜_სივრცე" -#: sql_help.c:127 sql_help.c:131 sql_help.c:133 sql_help.c:549 sql_help.c:551 -#: sql_help.c:552 sql_help.c:876 sql_help.c:878 sql_help.c:879 sql_help.c:959 -#: sql_help.c:964 sql_help.c:967 sql_help.c:1029 sql_help.c:1031 -#: sql_help.c:1032 sql_help.c:1182 sql_help.c:1185 sql_help.c:1645 -#: sql_help.c:1650 sql_help.c:1653 sql_help.c:2409 sql_help.c:2612 -#: sql_help.c:3930 sql_help.c:4221 sql_help.c:4382 sql_help.c:4691 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:558 sql_help.c:560 +#: sql_help.c:561 sql_help.c:891 sql_help.c:893 sql_help.c:894 sql_help.c:974 +#: sql_help.c:978 sql_help.c:981 sql_help.c:1043 sql_help.c:1045 +#: sql_help.c:1046 sql_help.c:1196 sql_help.c:1198 sql_help.c:1664 +#: sql_help.c:1668 sql_help.c:1671 sql_help.c:2427 sql_help.c:2630 +#: sql_help.c:3948 sql_help.c:4250 sql_help.c:4411 sql_help.c:4721 msgid "configuration_parameter" msgstr "კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡_პáƒáƒ áƒáƒ›áƒ”ტრი" -#: sql_help.c:128 sql_help.c:129 sql_help.c:399 sql_help.c:470 sql_help.c:476 -#: sql_help.c:488 sql_help.c:550 sql_help.c:604 sql_help.c:686 sql_help.c:696 -#: sql_help.c:877 sql_help.c:905 sql_help.c:960 sql_help.c:961 sql_help.c:1030 -#: sql_help.c:1103 sql_help.c:1148 sql_help.c:1152 sql_help.c:1156 -#: sql_help.c:1159 sql_help.c:1164 sql_help.c:1167 sql_help.c:1183 -#: sql_help.c:1184 sql_help.c:1355 sql_help.c:1378 sql_help.c:1426 -#: sql_help.c:1451 sql_help.c:1508 sql_help.c:1592 sql_help.c:1646 -#: sql_help.c:1647 sql_help.c:1670 sql_help.c:2289 sql_help.c:2339 -#: sql_help.c:2346 sql_help.c:2355 sql_help.c:2410 sql_help.c:2411 -#: sql_help.c:2475 sql_help.c:2478 sql_help.c:2512 sql_help.c:2613 -#: sql_help.c:2614 sql_help.c:2637 sql_help.c:2764 sql_help.c:2803 -#: sql_help.c:2913 sql_help.c:2926 sql_help.c:2940 sql_help.c:2981 -#: sql_help.c:3008 sql_help.c:3025 sql_help.c:3052 sql_help.c:3259 -#: sql_help.c:3963 sql_help.c:4692 sql_help.c:4693 sql_help.c:4694 -#: sql_help.c:4695 +#: sql_help.c:128 sql_help.c:408 sql_help.c:479 sql_help.c:485 sql_help.c:497 +#: sql_help.c:559 sql_help.c:613 sql_help.c:695 sql_help.c:705 sql_help.c:892 +#: sql_help.c:920 sql_help.c:975 sql_help.c:1044 sql_help.c:1117 +#: sql_help.c:1162 sql_help.c:1166 sql_help.c:1170 sql_help.c:1173 +#: sql_help.c:1178 sql_help.c:1181 sql_help.c:1197 sql_help.c:1371 +#: sql_help.c:1394 sql_help.c:1442 sql_help.c:1450 sql_help.c:1470 +#: sql_help.c:1527 sql_help.c:1611 sql_help.c:1665 sql_help.c:1688 +#: sql_help.c:2307 sql_help.c:2357 sql_help.c:2364 sql_help.c:2373 +#: sql_help.c:2428 sql_help.c:2429 sql_help.c:2493 sql_help.c:2496 +#: sql_help.c:2530 sql_help.c:2631 sql_help.c:2632 sql_help.c:2655 +#: sql_help.c:2778 sql_help.c:2817 sql_help.c:2927 sql_help.c:2940 +#: sql_help.c:2954 sql_help.c:2995 sql_help.c:3003 sql_help.c:3025 +#: sql_help.c:3042 sql_help.c:3069 sql_help.c:3276 sql_help.c:3981 +#: sql_help.c:4722 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 msgid "value" msgstr "მნიშვნელáƒáƒ‘áƒ" -#: sql_help.c:201 +#: sql_help.c:202 msgid "target_role" msgstr "სáƒáƒ›áƒ˜áƒ–ნე_რáƒáƒšáƒ˜" -#: sql_help.c:202 sql_help.c:914 sql_help.c:2273 sql_help.c:2642 -#: sql_help.c:2719 sql_help.c:2724 sql_help.c:3893 sql_help.c:3902 -#: sql_help.c:3921 sql_help.c:3933 sql_help.c:4345 sql_help.c:4354 -#: sql_help.c:4373 sql_help.c:4385 +#: sql_help.c:203 sql_help.c:929 sql_help.c:2291 sql_help.c:2660 +#: sql_help.c:2733 sql_help.c:2738 sql_help.c:3911 sql_help.c:3920 +#: sql_help.c:3939 sql_help.c:3951 sql_help.c:4374 sql_help.c:4383 +#: sql_help.c:4402 sql_help.c:4414 msgid "schema_name" -msgstr "სქემის_სáƒáƒ®áƒ”ლი" +msgstr "schema_name" -#: sql_help.c:203 +#: sql_help.c:204 msgid "abbreviated_grant_or_revoke" msgstr "შეთáƒáƒ•áƒáƒ–ებáƒ_GRANT_áƒáƒœ_REVOKE" -#: sql_help.c:204 +#: sql_help.c:205 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "სáƒáƒ“áƒáƒª abbreviated_grant_or_revoke ერთ-ერთირსიიდáƒáƒœ:" -#: sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 -#: sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 sql_help.c:214 -#: sql_help.c:575 sql_help.c:611 sql_help.c:679 sql_help.c:823 sql_help.c:971 -#: sql_help.c:1323 sql_help.c:1657 sql_help.c:2448 sql_help.c:2449 -#: sql_help.c:2450 sql_help.c:2451 sql_help.c:2452 sql_help.c:2586 -#: sql_help.c:2675 sql_help.c:2676 sql_help.c:2677 sql_help.c:2678 -#: sql_help.c:2679 sql_help.c:3241 sql_help.c:3242 sql_help.c:3243 -#: sql_help.c:3244 sql_help.c:3245 sql_help.c:3942 sql_help.c:3946 -#: sql_help.c:4394 sql_help.c:4398 sql_help.c:4713 +#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 +#: sql_help.c:211 sql_help.c:212 sql_help.c:213 sql_help.c:214 sql_help.c:215 +#: sql_help.c:584 sql_help.c:620 sql_help.c:688 sql_help.c:838 sql_help.c:985 +#: sql_help.c:1337 sql_help.c:1675 sql_help.c:2466 sql_help.c:2467 +#: sql_help.c:2468 sql_help.c:2469 sql_help.c:2470 sql_help.c:2604 +#: sql_help.c:2691 sql_help.c:2692 sql_help.c:2693 sql_help.c:3258 +#: sql_help.c:3259 sql_help.c:3260 sql_help.c:3261 sql_help.c:3262 +#: sql_help.c:3960 sql_help.c:3964 sql_help.c:4423 sql_help.c:4427 +#: sql_help.c:4743 msgid "role_name" -msgstr "რáƒáƒšáƒ˜áƒ¡_სáƒáƒ®áƒ”ლი" - -#: sql_help.c:240 sql_help.c:463 sql_help.c:913 sql_help.c:1339 sql_help.c:1341 -#: sql_help.c:1393 sql_help.c:1405 sql_help.c:1430 sql_help.c:1687 -#: sql_help.c:2242 sql_help.c:2246 sql_help.c:2358 sql_help.c:2363 -#: sql_help.c:2471 sql_help.c:2641 sql_help.c:2780 sql_help.c:2785 -#: sql_help.c:2787 sql_help.c:2908 sql_help.c:2921 sql_help.c:2935 -#: sql_help.c:2944 sql_help.c:2956 sql_help.c:2985 sql_help.c:3994 -#: sql_help.c:4009 sql_help.c:4011 sql_help.c:4098 sql_help.c:4101 -#: sql_help.c:4103 sql_help.c:4564 sql_help.c:4565 sql_help.c:4574 -#: sql_help.c:4621 sql_help.c:4622 sql_help.c:4623 sql_help.c:4624 -#: sql_help.c:4625 sql_help.c:4626 sql_help.c:4666 sql_help.c:4667 -#: sql_help.c:4672 sql_help.c:4677 sql_help.c:4821 sql_help.c:4822 -#: sql_help.c:4831 sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 -#: sql_help.c:4881 sql_help.c:4882 sql_help.c:4883 sql_help.c:4937 -#: sql_help.c:4939 sql_help.c:5007 sql_help.c:5067 sql_help.c:5068 -#: sql_help.c:5077 sql_help.c:5124 sql_help.c:5125 sql_help.c:5126 -#: sql_help.c:5127 sql_help.c:5128 sql_help.c:5129 +msgstr "role_name" + +#: sql_help.c:246 sql_help.c:265 sql_help.c:472 sql_help.c:928 sql_help.c:1353 +#: sql_help.c:1355 sql_help.c:1359 sql_help.c:1409 sql_help.c:1421 +#: sql_help.c:1446 sql_help.c:1705 sql_help.c:2260 sql_help.c:2264 +#: sql_help.c:2376 sql_help.c:2381 sql_help.c:2489 sql_help.c:2659 +#: sql_help.c:2794 sql_help.c:2799 sql_help.c:2801 sql_help.c:2922 +#: sql_help.c:2935 sql_help.c:2949 sql_help.c:2958 sql_help.c:2970 +#: sql_help.c:2999 sql_help.c:4012 sql_help.c:4027 sql_help.c:4029 +#: sql_help.c:4125 sql_help.c:4128 sql_help.c:4130 sql_help.c:4593 +#: sql_help.c:4594 sql_help.c:4603 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4652 sql_help.c:4653 sql_help.c:4654 sql_help.c:4655 +#: sql_help.c:4696 sql_help.c:4697 sql_help.c:4702 sql_help.c:4707 +#: sql_help.c:4851 sql_help.c:4852 sql_help.c:4861 sql_help.c:4908 +#: sql_help.c:4909 sql_help.c:4910 sql_help.c:4911 sql_help.c:4912 +#: sql_help.c:4913 sql_help.c:4968 sql_help.c:4970 sql_help.c:5036 +#: sql_help.c:5096 sql_help.c:5097 sql_help.c:5106 sql_help.c:5153 +#: sql_help.c:5154 sql_help.c:5155 sql_help.c:5156 sql_help.c:5157 +#: sql_help.c:5158 msgid "expression" msgstr "გáƒáƒ›áƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ" -#: sql_help.c:243 +#: sql_help.c:249 sql_help.c:2261 msgid "domain_constraint" msgstr "დáƒáƒ›áƒ”ნის_შეზღუდვáƒ" -#: sql_help.c:245 sql_help.c:247 sql_help.c:250 sql_help.c:478 sql_help.c:479 -#: sql_help.c:1316 sql_help.c:1363 sql_help.c:1364 sql_help.c:1365 -#: sql_help.c:1392 sql_help.c:1404 sql_help.c:1421 sql_help.c:1857 -#: sql_help.c:1859 sql_help.c:2245 sql_help.c:2357 sql_help.c:2362 -#: sql_help.c:2943 sql_help.c:2955 sql_help.c:4006 +#: sql_help.c:251 sql_help.c:253 sql_help.c:256 sql_help.c:264 sql_help.c:487 +#: sql_help.c:488 sql_help.c:1330 sql_help.c:1379 sql_help.c:1380 +#: sql_help.c:1381 sql_help.c:1408 sql_help.c:1420 sql_help.c:1437 +#: sql_help.c:1869 sql_help.c:1871 sql_help.c:2263 sql_help.c:2375 +#: sql_help.c:2380 sql_help.c:2957 sql_help.c:2969 sql_help.c:4024 msgid "constraint_name" msgstr "შეზღუდვის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:248 sql_help.c:1317 +#: sql_help.c:254 sql_help.c:1331 msgid "new_constraint_name" msgstr "áƒáƒ®áƒáƒšáƒ˜_შეზღუდვის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:321 sql_help.c:1101 +#: sql_help.c:263 sql_help.c:2262 +msgid "where domain_constraint is:" +msgstr "სáƒáƒ“áƒáƒª domain_constraint áƒáƒ áƒ˜áƒ¡:" + +#: sql_help.c:330 sql_help.c:1115 msgid "new_version" msgstr "áƒáƒ®áƒáƒšáƒ˜_მნიშვნელáƒáƒ‘áƒ" -#: sql_help.c:325 sql_help.c:327 +#: sql_help.c:334 sql_help.c:336 msgid "member_object" -msgstr "წევრი_áƒáƒ‘იექტი" +msgstr "member_object" -#: sql_help.c:328 +#: sql_help.c:337 msgid "where member_object is:" msgstr "სáƒáƒ“áƒáƒª member_object áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:329 sql_help.c:334 sql_help.c:335 sql_help.c:336 sql_help.c:337 -#: sql_help.c:338 sql_help.c:339 sql_help.c:344 sql_help.c:348 sql_help.c:350 -#: sql_help.c:352 sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 -#: sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:368 sql_help.c:371 -#: sql_help.c:372 sql_help.c:1849 sql_help.c:1854 sql_help.c:1861 -#: sql_help.c:1862 sql_help.c:1863 sql_help.c:1864 sql_help.c:1865 -#: sql_help.c:1866 sql_help.c:1867 sql_help.c:1872 sql_help.c:1874 -#: sql_help.c:1878 sql_help.c:1880 sql_help.c:1884 sql_help.c:1889 -#: sql_help.c:1890 sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 -#: sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 -#: sql_help.c:1904 sql_help.c:1905 sql_help.c:1906 sql_help.c:1907 -#: sql_help.c:1912 sql_help.c:1913 sql_help.c:4467 sql_help.c:4472 -#: sql_help.c:4473 sql_help.c:4474 sql_help.c:4475 sql_help.c:4481 -#: sql_help.c:4482 sql_help.c:4487 sql_help.c:4488 sql_help.c:4493 -#: sql_help.c:4494 sql_help.c:4495 sql_help.c:4496 sql_help.c:4497 -#: sql_help.c:4498 +#: sql_help.c:338 sql_help.c:343 sql_help.c:344 sql_help.c:345 sql_help.c:346 +#: sql_help.c:347 sql_help.c:348 sql_help.c:353 sql_help.c:357 sql_help.c:359 +#: sql_help.c:361 sql_help.c:370 sql_help.c:371 sql_help.c:372 sql_help.c:373 +#: sql_help.c:374 sql_help.c:375 sql_help.c:376 sql_help.c:377 sql_help.c:380 +#: sql_help.c:381 sql_help.c:1861 sql_help.c:1866 sql_help.c:1873 +#: sql_help.c:1874 sql_help.c:1875 sql_help.c:1876 sql_help.c:1877 +#: sql_help.c:1878 sql_help.c:1879 sql_help.c:1884 sql_help.c:1886 +#: sql_help.c:1890 sql_help.c:1892 sql_help.c:1896 sql_help.c:1901 +#: sql_help.c:1902 sql_help.c:1909 sql_help.c:1910 sql_help.c:1911 +#: sql_help.c:1912 sql_help.c:1913 sql_help.c:1914 sql_help.c:1915 +#: sql_help.c:1916 sql_help.c:1917 sql_help.c:1918 sql_help.c:1919 +#: sql_help.c:1924 sql_help.c:1925 sql_help.c:4496 sql_help.c:4501 +#: sql_help.c:4502 sql_help.c:4503 sql_help.c:4504 sql_help.c:4510 +#: sql_help.c:4511 sql_help.c:4516 sql_help.c:4517 sql_help.c:4522 +#: sql_help.c:4523 sql_help.c:4524 sql_help.c:4525 sql_help.c:4526 +#: sql_help.c:4527 msgid "object_name" msgstr "áƒáƒ‘იექტის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:330 sql_help.c:1850 sql_help.c:4470 +#: sql_help.c:339 sql_help.c:1862 sql_help.c:4499 msgid "aggregate_name" msgstr "áƒáƒ’რეგáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი" -#: sql_help.c:332 sql_help.c:1852 sql_help.c:2138 sql_help.c:2142 -#: sql_help.c:2144 sql_help.c:3368 +#: sql_help.c:341 sql_help.c:1864 sql_help.c:2154 sql_help.c:2158 +#: sql_help.c:2160 sql_help.c:3385 msgid "source_type" msgstr "წყáƒáƒ áƒáƒ¡_ტიპი" -#: sql_help.c:333 sql_help.c:1853 sql_help.c:2139 sql_help.c:2143 -#: sql_help.c:2145 sql_help.c:3369 +#: sql_help.c:342 sql_help.c:1865 sql_help.c:2155 sql_help.c:2159 +#: sql_help.c:2161 sql_help.c:3386 msgid "target_type" msgstr "სáƒáƒ›áƒ˜áƒ–ნის_ტიპი" -#: sql_help.c:340 sql_help.c:787 sql_help.c:1868 sql_help.c:2140 -#: sql_help.c:2183 sql_help.c:2261 sql_help.c:2529 sql_help.c:2560 -#: sql_help.c:3128 sql_help.c:4369 sql_help.c:4476 sql_help.c:4593 -#: sql_help.c:4597 sql_help.c:4601 sql_help.c:4604 sql_help.c:4850 -#: sql_help.c:4854 sql_help.c:4858 sql_help.c:4861 sql_help.c:5096 -#: sql_help.c:5100 sql_help.c:5104 sql_help.c:5107 +#: sql_help.c:349 sql_help.c:802 sql_help.c:1880 sql_help.c:2156 +#: sql_help.c:2199 sql_help.c:2279 sql_help.c:2547 sql_help.c:2578 +#: sql_help.c:3145 sql_help.c:4398 sql_help.c:4505 sql_help.c:4622 +#: sql_help.c:4626 sql_help.c:4630 sql_help.c:4633 sql_help.c:4880 +#: sql_help.c:4884 sql_help.c:4888 sql_help.c:4891 sql_help.c:5125 +#: sql_help.c:5129 sql_help.c:5133 sql_help.c:5136 msgid "function_name" msgstr "ფუნქციის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:345 sql_help.c:780 sql_help.c:1875 sql_help.c:2553 +#: sql_help.c:354 sql_help.c:795 sql_help.c:1887 sql_help.c:2571 msgid "operator_name" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი" -#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1876 -#: sql_help.c:2530 sql_help.c:3492 +#: sql_help.c:355 sql_help.c:729 sql_help.c:733 sql_help.c:737 sql_help.c:1888 +#: sql_help.c:2548 sql_help.c:3509 msgid "left_type" msgstr "მáƒáƒ áƒ¯áƒ•ენრტიპი" -#: sql_help.c:347 sql_help.c:717 sql_help.c:721 sql_help.c:725 sql_help.c:1877 -#: sql_help.c:2531 sql_help.c:3493 +#: sql_help.c:356 sql_help.c:730 sql_help.c:734 sql_help.c:738 sql_help.c:1889 +#: sql_help.c:2549 sql_help.c:3510 msgid "right_type" -msgstr "სწáƒáƒ áƒ˜_ტიპი" +msgstr "right_type" -#: sql_help.c:349 sql_help.c:351 sql_help.c:743 sql_help.c:746 sql_help.c:749 -#: sql_help.c:778 sql_help.c:790 sql_help.c:798 sql_help.c:801 sql_help.c:804 -#: sql_help.c:1410 sql_help.c:1879 sql_help.c:1881 sql_help.c:2550 -#: sql_help.c:2571 sql_help.c:2961 sql_help.c:3502 sql_help.c:3511 +#: sql_help.c:358 sql_help.c:360 sql_help.c:758 sql_help.c:761 sql_help.c:764 +#: sql_help.c:793 sql_help.c:805 sql_help.c:813 sql_help.c:816 sql_help.c:819 +#: sql_help.c:1426 sql_help.c:1891 sql_help.c:1893 sql_help.c:2568 +#: sql_help.c:2589 sql_help.c:2975 sql_help.c:3519 sql_help.c:3528 msgid "index_method" msgstr "ინდექსის_მეთáƒáƒ“ი" -#: sql_help.c:353 sql_help.c:1885 sql_help.c:4483 +#: sql_help.c:362 sql_help.c:1897 sql_help.c:4512 msgid "procedure_name" msgstr "პრáƒáƒªáƒ”დურის სáƒáƒ®áƒ”ლი" -#: sql_help.c:357 sql_help.c:1891 sql_help.c:3917 sql_help.c:4489 +#: sql_help.c:366 sql_help.c:1903 sql_help.c:3935 sql_help.c:4518 msgid "routine_name" msgstr "ქვეპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი" -#: sql_help.c:369 sql_help.c:1382 sql_help.c:1908 sql_help.c:2405 -#: sql_help.c:2611 sql_help.c:2916 sql_help.c:3095 sql_help.c:3673 -#: sql_help.c:3939 sql_help.c:4391 +#: sql_help.c:378 sql_help.c:1398 sql_help.c:1920 sql_help.c:2423 +#: sql_help.c:2629 sql_help.c:2930 sql_help.c:3112 sql_help.c:3690 +#: sql_help.c:3957 sql_help.c:4420 msgid "type_name" msgstr "ტიპის სáƒáƒ®áƒ”ლი" -#: sql_help.c:370 sql_help.c:1909 sql_help.c:2404 sql_help.c:2610 -#: sql_help.c:3096 sql_help.c:3326 sql_help.c:3674 sql_help.c:3924 -#: sql_help.c:4376 +#: sql_help.c:379 sql_help.c:1921 sql_help.c:2422 sql_help.c:2628 +#: sql_help.c:3113 sql_help.c:3343 sql_help.c:3691 sql_help.c:3942 +#: sql_help.c:4405 msgid "lang_name" msgstr "ენის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:373 +#: sql_help.c:382 msgid "and aggregate_signature is:" msgstr "დრáƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜_ხელმáƒáƒ¬áƒ”რრáƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:396 sql_help.c:2005 sql_help.c:2286 +#: sql_help.c:405 sql_help.c:2021 sql_help.c:2304 msgid "handler_function" msgstr "დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი_ფუნქციáƒ" -#: sql_help.c:397 sql_help.c:2287 +#: sql_help.c:406 sql_help.c:2305 msgid "validator_function" msgstr "შემმáƒáƒ¬áƒ›áƒ”ბელი_ფუნქციáƒ" -#: sql_help.c:445 sql_help.c:524 sql_help.c:668 sql_help.c:854 sql_help.c:1005 -#: sql_help.c:1311 sql_help.c:1583 +#: sql_help.c:454 sql_help.c:533 sql_help.c:677 sql_help.c:869 sql_help.c:1019 +#: sql_help.c:1325 sql_help.c:1602 msgid "action" msgstr "ქმედებáƒ" -#: sql_help.c:447 sql_help.c:454 sql_help.c:458 sql_help.c:459 sql_help.c:462 -#: sql_help.c:464 sql_help.c:465 sql_help.c:466 sql_help.c:468 sql_help.c:471 -#: sql_help.c:473 sql_help.c:474 sql_help.c:672 sql_help.c:682 sql_help.c:684 -#: sql_help.c:687 sql_help.c:689 sql_help.c:690 sql_help.c:912 sql_help.c:1082 -#: sql_help.c:1313 sql_help.c:1331 sql_help.c:1335 sql_help.c:1336 -#: sql_help.c:1340 sql_help.c:1342 sql_help.c:1343 sql_help.c:1344 -#: sql_help.c:1345 sql_help.c:1347 sql_help.c:1350 sql_help.c:1351 -#: sql_help.c:1353 sql_help.c:1356 sql_help.c:1358 sql_help.c:1359 -#: sql_help.c:1406 sql_help.c:1408 sql_help.c:1415 sql_help.c:1424 -#: sql_help.c:1429 sql_help.c:1433 sql_help.c:1434 sql_help.c:1686 -#: sql_help.c:1689 sql_help.c:1693 sql_help.c:1731 sql_help.c:1856 -#: sql_help.c:1970 sql_help.c:1976 sql_help.c:1989 sql_help.c:1990 -#: sql_help.c:1991 sql_help.c:2336 sql_help.c:2349 sql_help.c:2402 -#: sql_help.c:2470 sql_help.c:2476 sql_help.c:2509 sql_help.c:2640 -#: sql_help.c:2749 sql_help.c:2784 sql_help.c:2786 sql_help.c:2898 -#: sql_help.c:2907 sql_help.c:2917 sql_help.c:2920 sql_help.c:2930 -#: sql_help.c:2934 sql_help.c:2957 sql_help.c:2959 sql_help.c:2966 -#: sql_help.c:2979 sql_help.c:2984 sql_help.c:2988 sql_help.c:2989 -#: sql_help.c:3005 sql_help.c:3131 sql_help.c:3271 sql_help.c:3896 -#: sql_help.c:3897 sql_help.c:3993 sql_help.c:4008 sql_help.c:4010 -#: sql_help.c:4012 sql_help.c:4097 sql_help.c:4100 sql_help.c:4102 -#: sql_help.c:4348 sql_help.c:4349 sql_help.c:4469 sql_help.c:4630 -#: sql_help.c:4636 sql_help.c:4638 sql_help.c:4887 sql_help.c:4893 -#: sql_help.c:4895 sql_help.c:4936 sql_help.c:4938 sql_help.c:4940 -#: sql_help.c:4995 sql_help.c:5133 sql_help.c:5139 sql_help.c:5141 +#: sql_help.c:456 sql_help.c:463 sql_help.c:467 sql_help.c:468 sql_help.c:471 +#: sql_help.c:473 sql_help.c:474 sql_help.c:475 sql_help.c:477 sql_help.c:480 +#: sql_help.c:482 sql_help.c:483 sql_help.c:681 sql_help.c:691 sql_help.c:693 +#: sql_help.c:696 sql_help.c:698 sql_help.c:699 sql_help.c:927 sql_help.c:1096 +#: sql_help.c:1327 sql_help.c:1345 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 sql_help.c:1358 +#: sql_help.c:1360 sql_help.c:1361 sql_help.c:1363 sql_help.c:1366 +#: sql_help.c:1367 sql_help.c:1369 sql_help.c:1372 sql_help.c:1374 +#: sql_help.c:1375 sql_help.c:1422 sql_help.c:1424 sql_help.c:1431 +#: sql_help.c:1440 sql_help.c:1445 sql_help.c:1452 sql_help.c:1453 +#: sql_help.c:1704 sql_help.c:1707 sql_help.c:1711 sql_help.c:1747 +#: sql_help.c:1868 sql_help.c:1984 sql_help.c:1990 sql_help.c:2004 +#: sql_help.c:2005 sql_help.c:2006 sql_help.c:2354 sql_help.c:2367 +#: sql_help.c:2420 sql_help.c:2488 sql_help.c:2494 sql_help.c:2527 +#: sql_help.c:2658 sql_help.c:2763 sql_help.c:2798 sql_help.c:2800 +#: sql_help.c:2912 sql_help.c:2921 sql_help.c:2931 sql_help.c:2934 +#: sql_help.c:2944 sql_help.c:2948 sql_help.c:2971 sql_help.c:2973 +#: sql_help.c:2980 sql_help.c:2993 sql_help.c:2998 sql_help.c:3005 +#: sql_help.c:3006 sql_help.c:3022 sql_help.c:3148 sql_help.c:3288 +#: sql_help.c:3914 sql_help.c:3915 sql_help.c:4011 sql_help.c:4026 +#: sql_help.c:4028 sql_help.c:4030 sql_help.c:4124 sql_help.c:4127 +#: sql_help.c:4129 sql_help.c:4131 sql_help.c:4377 sql_help.c:4378 +#: sql_help.c:4498 sql_help.c:4659 sql_help.c:4666 sql_help.c:4668 +#: sql_help.c:4917 sql_help.c:4924 sql_help.c:4926 sql_help.c:4967 +#: sql_help.c:4969 sql_help.c:4971 sql_help.c:5024 sql_help.c:5162 +#: sql_help.c:5169 sql_help.c:5171 msgid "column_name" -msgstr "სვეტის_სáƒáƒ®áƒ”ლი" +msgstr "column_name" -#: sql_help.c:448 sql_help.c:673 sql_help.c:1314 sql_help.c:1694 +#: sql_help.c:457 sql_help.c:682 sql_help.c:1328 sql_help.c:1712 msgid "new_column_name" msgstr "áƒáƒ®áƒáƒšáƒ˜_სვეტის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:453 sql_help.c:545 sql_help.c:681 sql_help.c:875 sql_help.c:1026 -#: sql_help.c:1330 sql_help.c:1593 +#: sql_help.c:462 sql_help.c:554 sql_help.c:690 sql_help.c:890 sql_help.c:1040 +#: sql_help.c:1344 sql_help.c:1612 msgid "where action is one of:" msgstr "დრრáƒáƒªáƒ ქმედებრáƒáƒ áƒ˜áƒ¡ ერთერთი სიიდáƒáƒœ:" -#: sql_help.c:455 sql_help.c:460 sql_help.c:1074 sql_help.c:1332 -#: sql_help.c:1337 sql_help.c:1595 sql_help.c:1599 sql_help.c:2240 -#: sql_help.c:2337 sql_help.c:2549 sql_help.c:2742 sql_help.c:2899 -#: sql_help.c:3178 sql_help.c:4154 +#: sql_help.c:464 sql_help.c:469 sql_help.c:1088 sql_help.c:1346 +#: sql_help.c:1351 sql_help.c:1614 sql_help.c:1618 sql_help.c:2258 +#: sql_help.c:2355 sql_help.c:2567 sql_help.c:2756 sql_help.c:2913 +#: sql_help.c:3195 sql_help.c:4183 msgid "data_type" msgstr "მáƒáƒœáƒáƒªáƒ”მების_ტიპი" -#: sql_help.c:456 sql_help.c:461 sql_help.c:1333 sql_help.c:1338 -#: sql_help.c:1596 sql_help.c:1600 sql_help.c:2241 sql_help.c:2340 -#: sql_help.c:2472 sql_help.c:2901 sql_help.c:2909 sql_help.c:2922 -#: sql_help.c:2936 sql_help.c:3179 sql_help.c:3185 sql_help.c:4003 +#: sql_help.c:465 sql_help.c:470 sql_help.c:1347 sql_help.c:1352 +#: sql_help.c:1447 sql_help.c:1615 sql_help.c:1619 sql_help.c:2259 +#: sql_help.c:2358 sql_help.c:2490 sql_help.c:2915 sql_help.c:2923 +#: sql_help.c:2936 sql_help.c:2950 sql_help.c:3000 sql_help.c:3196 +#: sql_help.c:3202 sql_help.c:4021 msgid "collation" msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ" -#: sql_help.c:457 sql_help.c:1334 sql_help.c:2341 sql_help.c:2350 -#: sql_help.c:2902 sql_help.c:2918 sql_help.c:2931 +#: sql_help.c:466 sql_help.c:1348 sql_help.c:2359 sql_help.c:2368 +#: sql_help.c:2916 sql_help.c:2932 sql_help.c:2945 msgid "column_constraint" -msgstr "სვეტის_შეზღუდვáƒ" +msgstr "column_constraint" -#: sql_help.c:467 sql_help.c:609 sql_help.c:683 sql_help.c:1352 sql_help.c:4989 +#: sql_help.c:476 sql_help.c:618 sql_help.c:692 sql_help.c:1368 sql_help.c:5018 msgid "integer" msgstr "მთელი რიცხვი" -#: sql_help.c:469 sql_help.c:472 sql_help.c:685 sql_help.c:688 sql_help.c:1354 -#: sql_help.c:1357 +#: sql_help.c:478 sql_help.c:481 sql_help.c:694 sql_help.c:697 sql_help.c:1370 +#: sql_help.c:1373 msgid "attribute_option" msgstr "áƒáƒ¢áƒ áƒ˜áƒ‘უტის პáƒáƒ áƒáƒ›áƒ”ტრი" -#: sql_help.c:477 sql_help.c:1361 sql_help.c:2342 sql_help.c:2351 -#: sql_help.c:2903 sql_help.c:2919 sql_help.c:2932 +#: sql_help.c:486 sql_help.c:1377 sql_help.c:2360 sql_help.c:2369 +#: sql_help.c:2917 sql_help.c:2933 sql_help.c:2946 msgid "table_constraint" msgstr "ცხრილის_შეზღუდვები" -#: sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:483 sql_help.c:1366 -#: sql_help.c:1367 sql_help.c:1368 sql_help.c:1369 sql_help.c:1910 +#: sql_help.c:489 sql_help.c:490 sql_help.c:491 sql_help.c:492 sql_help.c:1382 +#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:1922 msgid "trigger_name" msgstr "ტრიგერის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:484 sql_help.c:485 sql_help.c:1380 sql_help.c:1381 -#: sql_help.c:2343 sql_help.c:2348 sql_help.c:2906 sql_help.c:2929 +#: sql_help.c:493 sql_help.c:494 sql_help.c:1396 sql_help.c:1397 +#: sql_help.c:2361 sql_help.c:2366 sql_help.c:2920 sql_help.c:2943 msgid "parent_table" msgstr "მშáƒáƒ‘ელი_ცხრილი" -#: sql_help.c:544 sql_help.c:601 sql_help.c:670 sql_help.c:874 sql_help.c:1025 -#: sql_help.c:1552 sql_help.c:2272 +#: sql_help.c:553 sql_help.c:610 sql_help.c:679 sql_help.c:889 sql_help.c:1039 +#: sql_help.c:1571 sql_help.c:2290 msgid "extension_name" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის სáƒáƒ®áƒ”ლი" -#: sql_help.c:546 sql_help.c:1027 sql_help.c:2406 +#: sql_help.c:555 sql_help.c:1041 sql_help.c:2424 msgid "execution_cost" msgstr "გáƒáƒ¨áƒ•ების_ფáƒáƒ¡áƒ˜" -#: sql_help.c:547 sql_help.c:1028 sql_help.c:2407 +#: sql_help.c:556 sql_help.c:1042 sql_help.c:2425 msgid "result_rows" msgstr "მწკრივები_შედეგში" -#: sql_help.c:548 sql_help.c:2408 +#: sql_help.c:557 sql_help.c:2426 msgid "support_function" msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”_ფუნქციáƒ" -#: sql_help.c:570 sql_help.c:572 sql_help.c:949 sql_help.c:957 sql_help.c:962 -#: sql_help.c:965 sql_help.c:968 sql_help.c:1635 sql_help.c:1643 -#: sql_help.c:1648 sql_help.c:1651 sql_help.c:1654 sql_help.c:2720 -#: sql_help.c:2722 sql_help.c:2725 sql_help.c:2726 sql_help.c:3894 -#: sql_help.c:3895 sql_help.c:3899 sql_help.c:3900 sql_help.c:3903 -#: sql_help.c:3904 sql_help.c:3906 sql_help.c:3907 sql_help.c:3909 -#: sql_help.c:3910 sql_help.c:3912 sql_help.c:3913 sql_help.c:3915 -#: sql_help.c:3916 sql_help.c:3922 sql_help.c:3923 sql_help.c:3925 -#: sql_help.c:3926 sql_help.c:3928 sql_help.c:3929 sql_help.c:3931 -#: sql_help.c:3932 sql_help.c:3934 sql_help.c:3935 sql_help.c:3937 -#: sql_help.c:3938 sql_help.c:3940 sql_help.c:3941 sql_help.c:3943 -#: sql_help.c:3944 sql_help.c:4346 sql_help.c:4347 sql_help.c:4351 -#: sql_help.c:4352 sql_help.c:4355 sql_help.c:4356 sql_help.c:4358 -#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 -#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4374 -#: sql_help.c:4375 sql_help.c:4377 sql_help.c:4378 sql_help.c:4380 -#: sql_help.c:4381 sql_help.c:4383 sql_help.c:4384 sql_help.c:4386 -#: sql_help.c:4387 sql_help.c:4389 sql_help.c:4390 sql_help.c:4392 -#: sql_help.c:4393 sql_help.c:4395 sql_help.c:4396 +#: sql_help.c:579 sql_help.c:581 sql_help.c:964 sql_help.c:972 sql_help.c:976 +#: sql_help.c:979 sql_help.c:982 sql_help.c:1654 sql_help.c:1662 +#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1672 sql_help.c:2734 +#: sql_help.c:2736 sql_help.c:2739 sql_help.c:2740 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3917 sql_help.c:3918 sql_help.c:3921 +#: sql_help.c:3922 sql_help.c:3924 sql_help.c:3925 sql_help.c:3927 +#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3931 sql_help.c:3933 +#: sql_help.c:3934 sql_help.c:3940 sql_help.c:3941 sql_help.c:3943 +#: sql_help.c:3944 sql_help.c:3946 sql_help.c:3947 sql_help.c:3949 +#: sql_help.c:3950 sql_help.c:3952 sql_help.c:3953 sql_help.c:3955 +#: sql_help.c:3956 sql_help.c:3958 sql_help.c:3959 sql_help.c:3961 +#: sql_help.c:3962 sql_help.c:4375 sql_help.c:4376 sql_help.c:4380 +#: sql_help.c:4381 sql_help.c:4384 sql_help.c:4385 sql_help.c:4387 +#: sql_help.c:4388 sql_help.c:4390 sql_help.c:4391 sql_help.c:4393 +#: sql_help.c:4394 sql_help.c:4396 sql_help.c:4397 sql_help.c:4403 +#: sql_help.c:4404 sql_help.c:4406 sql_help.c:4407 sql_help.c:4409 +#: sql_help.c:4410 sql_help.c:4412 sql_help.c:4413 sql_help.c:4415 +#: sql_help.c:4416 sql_help.c:4418 sql_help.c:4419 sql_help.c:4421 +#: sql_help.c:4422 sql_help.c:4424 sql_help.c:4425 msgid "role_specification" -msgstr "რáƒáƒšáƒ˜áƒ¡_შემáƒáƒ¬áƒ›áƒ”ბáƒ" +msgstr "role_specification" -#: sql_help.c:571 sql_help.c:573 sql_help.c:1667 sql_help.c:2208 -#: sql_help.c:2728 sql_help.c:3256 sql_help.c:3707 sql_help.c:4723 +#: sql_help.c:580 sql_help.c:582 sql_help.c:1685 sql_help.c:2225 +#: sql_help.c:2742 sql_help.c:3273 sql_help.c:3724 sql_help.c:4753 msgid "user_name" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:574 sql_help.c:970 sql_help.c:1656 sql_help.c:2727 -#: sql_help.c:3945 sql_help.c:4397 +#: sql_help.c:583 sql_help.c:984 sql_help.c:1674 sql_help.c:2741 +#: sql_help.c:3963 sql_help.c:4426 msgid "where role_specification can be:" -msgstr "სáƒáƒ“áƒáƒª რáƒáƒšáƒ˜áƒ¡_სპეციფიკáƒáƒªáƒ˜áƒ შეიძლებრიყáƒáƒ¡ ერთ-ერთი სიიდáƒáƒœ:" +msgstr "სáƒáƒ“áƒáƒª role_specification შეიძლებრიყáƒáƒ¡:" -#: sql_help.c:576 +#: sql_help.c:585 msgid "group_name" msgstr "ჯგუფის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:597 sql_help.c:1427 sql_help.c:2219 sql_help.c:2479 -#: sql_help.c:2513 sql_help.c:2914 sql_help.c:2927 sql_help.c:2941 -#: sql_help.c:2982 sql_help.c:3009 sql_help.c:3021 sql_help.c:3936 -#: sql_help.c:4388 +#: sql_help.c:606 sql_help.c:1443 sql_help.c:2237 sql_help.c:2497 +#: sql_help.c:2531 sql_help.c:2928 sql_help.c:2941 sql_help.c:2955 +#: sql_help.c:2996 sql_help.c:3026 sql_help.c:3038 sql_help.c:3954 +#: sql_help.c:4417 msgid "tablespace_name" msgstr "ცხრილების_სივრცის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:599 sql_help.c:692 sql_help.c:1374 sql_help.c:1384 -#: sql_help.c:1422 sql_help.c:1785 sql_help.c:1788 +#: sql_help.c:608 sql_help.c:701 sql_help.c:1390 sql_help.c:1400 +#: sql_help.c:1438 sql_help.c:1800 msgid "index_name" msgstr "ინდექსის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:603 sql_help.c:606 sql_help.c:695 sql_help.c:697 sql_help.c:1377 -#: sql_help.c:1379 sql_help.c:1425 sql_help.c:2477 sql_help.c:2511 -#: sql_help.c:2912 sql_help.c:2925 sql_help.c:2939 sql_help.c:2980 -#: sql_help.c:3007 +#: sql_help.c:612 sql_help.c:615 sql_help.c:704 sql_help.c:706 sql_help.c:1393 +#: sql_help.c:1395 sql_help.c:1441 sql_help.c:2495 sql_help.c:2529 +#: sql_help.c:2926 sql_help.c:2939 sql_help.c:2953 sql_help.c:2994 +#: sql_help.c:3024 msgid "storage_parameter" msgstr "სáƒáƒªáƒáƒ•ის_პáƒáƒ áƒáƒ›áƒ”ტრი" -#: sql_help.c:608 +#: sql_help.c:617 msgid "column_number" -msgstr "სვეტის_ნáƒáƒ›áƒ”რი" +msgstr "column_number" -#: sql_help.c:632 sql_help.c:1873 sql_help.c:4480 +#: sql_help.c:641 sql_help.c:1885 sql_help.c:4509 msgid "large_object_oid" msgstr "დიდი_áƒáƒ‘იექტის_oid" -#: sql_help.c:691 sql_help.c:1360 sql_help.c:2900 +#: sql_help.c:700 sql_help.c:1376 sql_help.c:2914 msgid "compression_method" msgstr "შეკუმშვის_მეთáƒáƒ“ი" -#: sql_help.c:693 sql_help.c:1375 +#: sql_help.c:702 sql_help.c:1391 msgid "new_access_method" msgstr "წვდáƒáƒ›áƒ˜áƒ¡_áƒáƒ®áƒáƒšáƒ˜_მეთáƒáƒ“ი" -#: sql_help.c:726 sql_help.c:2534 +#: sql_help.c:739 sql_help.c:2552 msgid "res_proc" msgstr "შეზღუდვის_პრáƒáƒªáƒ”დურáƒ" -#: sql_help.c:727 sql_help.c:2535 +#: sql_help.c:740 sql_help.c:2553 msgid "join_proc" msgstr "შეერთების_პრáƒáƒªáƒ”დურáƒ" -#: sql_help.c:779 sql_help.c:791 sql_help.c:2552 +#: sql_help.c:741 sql_help.c:2550 +msgid "com_op" +msgstr "კáƒáƒ›áƒ£áƒ¢_áƒáƒžáƒ”რ" + +#: sql_help.c:742 sql_help.c:2551 +msgid "neg_op" +msgstr "უáƒáƒ áƒ§_áƒáƒžáƒ”რáƒáƒ¢" + +#: sql_help.c:794 sql_help.c:806 sql_help.c:2570 msgid "strategy_number" -msgstr "სტრáƒáƒ¢áƒ”გიის_ნáƒáƒ›áƒ”რი" +msgstr "strategy_number" -#: sql_help.c:781 sql_help.c:782 sql_help.c:785 sql_help.c:786 sql_help.c:792 -#: sql_help.c:793 sql_help.c:795 sql_help.c:796 sql_help.c:2554 sql_help.c:2555 -#: sql_help.c:2558 sql_help.c:2559 +#: sql_help.c:796 sql_help.c:797 sql_help.c:800 sql_help.c:801 sql_help.c:807 +#: sql_help.c:808 sql_help.c:810 sql_help.c:811 sql_help.c:2572 sql_help.c:2573 +#: sql_help.c:2576 sql_help.c:2577 msgid "op_type" msgstr "áƒáƒž_ტიპი" -#: sql_help.c:783 sql_help.c:2556 +#: sql_help.c:798 sql_help.c:2574 msgid "sort_family_name" msgstr "დáƒáƒšáƒáƒ’ების_áƒáƒ¯áƒáƒ®áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი" -#: sql_help.c:784 sql_help.c:794 sql_help.c:2557 +#: sql_help.c:799 sql_help.c:809 sql_help.c:2575 msgid "support_number" msgstr "დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”_რიცხვი" -#: sql_help.c:788 sql_help.c:2141 sql_help.c:2561 sql_help.c:3098 -#: sql_help.c:3100 +#: sql_help.c:803 sql_help.c:2157 sql_help.c:2579 sql_help.c:3115 +#: sql_help.c:3117 msgid "argument_type" msgstr "áƒáƒ áƒ’უმენტის_ტიპი" -#: sql_help.c:819 sql_help.c:822 sql_help.c:911 sql_help.c:1041 sql_help.c:1081 -#: sql_help.c:1548 sql_help.c:1551 sql_help.c:1730 sql_help.c:1784 -#: sql_help.c:1787 sql_help.c:1858 sql_help.c:1883 sql_help.c:1896 -#: sql_help.c:1911 sql_help.c:1969 sql_help.c:1975 sql_help.c:2335 -#: sql_help.c:2347 sql_help.c:2468 sql_help.c:2508 sql_help.c:2585 -#: sql_help.c:2639 sql_help.c:2696 sql_help.c:2748 sql_help.c:2781 -#: sql_help.c:2788 sql_help.c:2897 sql_help.c:2915 sql_help.c:2928 -#: sql_help.c:3004 sql_help.c:3124 sql_help.c:3305 sql_help.c:3528 -#: sql_help.c:3577 sql_help.c:3683 sql_help.c:3892 sql_help.c:3898 -#: sql_help.c:3959 sql_help.c:3991 sql_help.c:4344 sql_help.c:4350 -#: sql_help.c:4468 sql_help.c:4579 sql_help.c:4581 sql_help.c:4643 -#: sql_help.c:4682 sql_help.c:4836 sql_help.c:4838 sql_help.c:4900 -#: sql_help.c:4934 sql_help.c:4994 sql_help.c:5082 sql_help.c:5084 -#: sql_help.c:5146 +#: sql_help.c:834 sql_help.c:837 sql_help.c:926 sql_help.c:1055 sql_help.c:1095 +#: sql_help.c:1567 sql_help.c:1570 sql_help.c:1746 sql_help.c:1799 +#: sql_help.c:1870 sql_help.c:1895 sql_help.c:1908 sql_help.c:1923 +#: sql_help.c:1983 sql_help.c:1989 sql_help.c:2353 sql_help.c:2365 +#: sql_help.c:2486 sql_help.c:2526 sql_help.c:2603 sql_help.c:2657 +#: sql_help.c:2710 sql_help.c:2762 sql_help.c:2795 sql_help.c:2802 +#: sql_help.c:2911 sql_help.c:2929 sql_help.c:2942 sql_help.c:3021 +#: sql_help.c:3141 sql_help.c:3322 sql_help.c:3545 sql_help.c:3594 +#: sql_help.c:3700 sql_help.c:3910 sql_help.c:3916 sql_help.c:3977 +#: sql_help.c:4009 sql_help.c:4373 sql_help.c:4379 sql_help.c:4497 +#: sql_help.c:4610 sql_help.c:4673 sql_help.c:4712 sql_help.c:4868 +#: sql_help.c:4931 sql_help.c:4965 sql_help.c:5023 sql_help.c:5113 +#: sql_help.c:5176 msgid "table_name" msgstr "ცხრილის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:824 sql_help.c:2587 +#: sql_help.c:839 sql_help.c:2605 msgid "using_expression" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნების_გáƒáƒ›áƒáƒ®áƒáƒ¢áƒ£áƒšáƒ”ბáƒ" -#: sql_help.c:825 sql_help.c:2588 +#: sql_help.c:840 sql_help.c:2606 msgid "check_expression" msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის_შემáƒáƒ¬áƒ›áƒ”ბáƒ" -#: sql_help.c:898 sql_help.c:900 sql_help.c:902 sql_help.c:2635 +#: sql_help.c:913 sql_help.c:915 sql_help.c:917 sql_help.c:2653 msgid "publication_object" msgstr "გáƒáƒ›áƒáƒªáƒ”მის_áƒáƒ‘იექტი" -#: sql_help.c:904 sql_help.c:2636 +#: sql_help.c:919 sql_help.c:2654 msgid "publication_parameter" msgstr "გáƒáƒ›áƒáƒªáƒ”მის_პáƒáƒ áƒáƒ›áƒ”ტრი" -#: sql_help.c:910 sql_help.c:2638 +#: sql_help.c:925 sql_help.c:2656 msgid "where publication_object is one of:" -msgstr "სáƒáƒ“áƒáƒª პუბლიკáƒáƒªáƒ˜áƒ˜áƒ¡_áƒáƒ‘იექტი ერთერთირსიიდáƒáƒœ:" +msgstr "სáƒáƒ“áƒáƒª publication_object ერთ-ერთირსიიდáƒáƒœ:" -#: sql_help.c:953 sql_help.c:1639 sql_help.c:2446 sql_help.c:2673 -#: sql_help.c:3239 +#: sql_help.c:968 sql_help.c:1658 sql_help.c:2464 sql_help.c:2689 +#: sql_help.c:3256 msgid "password" msgstr "პáƒáƒ áƒáƒšáƒ˜" -#: sql_help.c:954 sql_help.c:1640 sql_help.c:2447 sql_help.c:2674 -#: sql_help.c:3240 +#: sql_help.c:969 sql_help.c:1659 sql_help.c:2465 sql_help.c:2690 +#: sql_help.c:3257 msgid "timestamp" msgstr "დრáƒáƒ˜áƒ¡ შტáƒáƒ›áƒžáƒ˜" -#: sql_help.c:958 sql_help.c:963 sql_help.c:966 sql_help.c:969 sql_help.c:1644 -#: sql_help.c:1649 sql_help.c:1652 sql_help.c:1655 sql_help.c:3905 -#: sql_help.c:4357 +#: sql_help.c:973 sql_help.c:977 sql_help.c:980 sql_help.c:983 sql_help.c:1663 +#: sql_help.c:1667 sql_help.c:1670 sql_help.c:1673 sql_help.c:3923 +#: sql_help.c:4386 msgid "database_name" msgstr "ბáƒáƒ–ის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:1075 sql_help.c:2743 +#: sql_help.c:1089 sql_help.c:2757 msgid "increment" msgstr "გáƒáƒ–რდáƒ" -#: sql_help.c:1076 sql_help.c:2744 +#: sql_help.c:1090 sql_help.c:2758 msgid "minvalue" msgstr "მინ_მნიშვნელáƒáƒ‘áƒ" -#: sql_help.c:1077 sql_help.c:2745 +#: sql_help.c:1091 sql_help.c:2759 msgid "maxvalue" msgstr "მáƒáƒ¥áƒ¡_მნიშვნელáƒáƒ‘áƒ" -#: sql_help.c:1078 sql_help.c:2746 sql_help.c:4577 sql_help.c:4680 -#: sql_help.c:4834 sql_help.c:5011 sql_help.c:5080 +#: sql_help.c:1092 sql_help.c:2760 sql_help.c:4606 sql_help.c:4710 +#: sql_help.c:4864 sql_help.c:5040 sql_help.c:5109 msgid "start" msgstr "დáƒáƒ¬áƒ§áƒ”ბáƒ" -#: sql_help.c:1079 sql_help.c:1349 +#: sql_help.c:1093 sql_help.c:1365 msgid "restart" msgstr "გáƒáƒ“áƒáƒ¢áƒ•რთვáƒ" -#: sql_help.c:1080 sql_help.c:2747 +#: sql_help.c:1094 sql_help.c:2761 msgid "cache" msgstr "კეში" -#: sql_help.c:1125 +#: sql_help.c:1139 msgid "new_target" msgstr "áƒáƒ®áƒáƒšáƒ˜_სáƒáƒ›áƒ˜áƒ–ნე" -#: sql_help.c:1144 sql_help.c:2800 +#: sql_help.c:1158 sql_help.c:2814 msgid "conninfo" msgstr "შეერთ_ინფáƒ" -#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:2801 +#: sql_help.c:1160 sql_help.c:1164 sql_help.c:1168 sql_help.c:2815 msgid "publication_name" msgstr "გáƒáƒ›áƒáƒªáƒ”მის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 +#: sql_help.c:1161 sql_help.c:1165 sql_help.c:1169 msgid "publication_option" msgstr "გáƒáƒ›áƒáƒªáƒ”მის_მáƒáƒ áƒ’ებáƒ" -#: sql_help.c:1158 +#: sql_help.c:1172 msgid "refresh_option" msgstr "გáƒáƒœáƒáƒ®áƒšáƒ”ბის_პáƒáƒ áƒáƒ›áƒ”ტრები" -#: sql_help.c:1163 sql_help.c:2802 +#: sql_help.c:1177 sql_help.c:2816 msgid "subscription_parameter" msgstr "გáƒáƒ›áƒáƒ¬áƒ”რის_პáƒáƒ áƒáƒ›áƒ”ტრი" -#: sql_help.c:1166 +#: sql_help.c:1180 msgid "skip_option" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის_გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" -#: sql_help.c:1326 sql_help.c:1329 +#: sql_help.c:1340 sql_help.c:1343 msgid "partition_name" msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი" -#: sql_help.c:1327 sql_help.c:2352 sql_help.c:2933 +#: sql_help.c:1341 sql_help.c:2370 sql_help.c:2947 msgid "partition_bound_spec" msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡_სáƒáƒ–ღვრის_მითითებáƒ" -#: sql_help.c:1346 sql_help.c:1396 sql_help.c:2947 +#: sql_help.c:1362 sql_help.c:1412 sql_help.c:2961 msgid "sequence_options" msgstr "მიმდევრáƒáƒ‘ის_პáƒáƒ áƒáƒ›áƒ”ტრები" -#: sql_help.c:1348 +#: sql_help.c:1364 msgid "sequence_option" msgstr "მიმდევრáƒáƒ‘ის_პáƒáƒ áƒáƒ›áƒ”ტრი" -#: sql_help.c:1362 +#: sql_help.c:1378 msgid "table_constraint_using_index" msgstr "ცხრილის_შეზღუდვáƒ_ინდექსით" -#: sql_help.c:1370 sql_help.c:1371 sql_help.c:1372 sql_help.c:1373 +#: sql_help.c:1386 sql_help.c:1387 sql_help.c:1388 sql_help.c:1389 msgid "rewrite_rule_name" msgstr "გáƒáƒ“áƒáƒ¬áƒ”რის_წესის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:1385 sql_help.c:2364 sql_help.c:2972 +#: sql_help.c:1401 sql_help.c:2382 sql_help.c:2986 msgid "and partition_bound_spec is:" msgstr "დრდáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡_სáƒáƒ–ღვáƒáƒ áƒ˜áƒ¡_სპეციფიკáƒáƒªáƒ˜áƒ áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:1386 sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 -#: sql_help.c:2366 sql_help.c:2367 sql_help.c:2973 sql_help.c:2974 -#: sql_help.c:2975 +#: sql_help.c:1402 sql_help.c:1403 sql_help.c:1404 sql_help.c:2383 +#: sql_help.c:2384 sql_help.c:2385 sql_help.c:2987 sql_help.c:2988 +#: sql_help.c:2989 msgid "partition_bound_expr" msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡_სáƒáƒ–ღვრის_გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ" -#: sql_help.c:1389 sql_help.c:1390 sql_help.c:2368 sql_help.c:2369 -#: sql_help.c:2976 sql_help.c:2977 +#: sql_help.c:1405 sql_help.c:1406 sql_help.c:2386 sql_help.c:2387 +#: sql_help.c:2990 sql_help.c:2991 msgid "numeric_literal" -msgstr "რიცხვითი_მუდმივáƒ" +msgstr "numeric_literal" -#: sql_help.c:1391 +#: sql_help.c:1407 msgid "and column_constraint is:" msgstr "დრსვეტის_შეზღუდვრáƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:1394 sql_help.c:2359 sql_help.c:2400 sql_help.c:2609 -#: sql_help.c:2945 +#: sql_help.c:1410 sql_help.c:2377 sql_help.c:2418 sql_help.c:2627 +#: sql_help.c:2959 msgid "default_expr" msgstr "ნáƒáƒ’ულისხმები_გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ" -#: sql_help.c:1395 sql_help.c:2360 sql_help.c:2946 +#: sql_help.c:1411 sql_help.c:2378 sql_help.c:2960 msgid "generation_expr" msgstr "გენერირებული_გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ" -#: sql_help.c:1397 sql_help.c:1398 sql_help.c:1407 sql_help.c:1409 -#: sql_help.c:1413 sql_help.c:2948 sql_help.c:2949 sql_help.c:2958 -#: sql_help.c:2960 sql_help.c:2964 +#: sql_help.c:1413 sql_help.c:1414 sql_help.c:1423 sql_help.c:1425 +#: sql_help.c:1429 sql_help.c:2962 sql_help.c:2963 sql_help.c:2972 +#: sql_help.c:2974 sql_help.c:2978 msgid "index_parameters" msgstr "ინდექსის_პáƒáƒ áƒáƒ›áƒ”ტრები" -#: sql_help.c:1399 sql_help.c:1416 sql_help.c:2950 sql_help.c:2967 +#: sql_help.c:1415 sql_help.c:1432 sql_help.c:2964 sql_help.c:2981 msgid "reftable" msgstr "მიბმების_ცხრილი" -#: sql_help.c:1400 sql_help.c:1417 sql_help.c:2951 sql_help.c:2968 +#: sql_help.c:1416 sql_help.c:1433 sql_help.c:2965 sql_help.c:2982 msgid "refcolumn" msgstr "მიბმული_სვეტი" -#: sql_help.c:1401 sql_help.c:1402 sql_help.c:1418 sql_help.c:1419 -#: sql_help.c:2952 sql_help.c:2953 sql_help.c:2969 sql_help.c:2970 +#: sql_help.c:1417 sql_help.c:1418 sql_help.c:1434 sql_help.c:1435 +#: sql_help.c:2966 sql_help.c:2967 sql_help.c:2983 sql_help.c:2984 msgid "referential_action" msgstr "მიბმის_ქმედებები" -#: sql_help.c:1403 sql_help.c:2361 sql_help.c:2954 +#: sql_help.c:1419 sql_help.c:2379 sql_help.c:2968 msgid "and table_constraint is:" msgstr "დრtable_constraint áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:1411 sql_help.c:2962 +#: sql_help.c:1427 sql_help.c:2976 msgid "exclude_element" msgstr "ელემენტის_áƒáƒ›áƒáƒ¦áƒ”ბáƒ" -#: sql_help.c:1412 sql_help.c:2963 sql_help.c:4575 sql_help.c:4678 -#: sql_help.c:4832 sql_help.c:5009 sql_help.c:5078 +#: sql_help.c:1428 sql_help.c:2977 sql_help.c:4604 sql_help.c:4708 +#: sql_help.c:4862 sql_help.c:5038 sql_help.c:5107 msgid "operator" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜" -#: sql_help.c:1414 sql_help.c:2480 sql_help.c:2965 +#: sql_help.c:1430 sql_help.c:2498 sql_help.c:2979 msgid "predicate" msgstr "პრედიკáƒáƒ¢áƒ˜" -#: sql_help.c:1420 +#: sql_help.c:1436 msgid "and table_constraint_using_index is:" msgstr "დრtable_constraint_using_index áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:1423 sql_help.c:2978 +#: sql_help.c:1439 sql_help.c:2992 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "ინდექსის_პáƒáƒ áƒáƒ›áƒ”ტრები UNIQUE, PRIMARY KEY დრEXCLUDE შეზღუდვებში:" -#: sql_help.c:1428 sql_help.c:2983 +#: sql_help.c:1444 sql_help.c:2997 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "ელემენტის_áƒáƒ›áƒáƒ¦áƒ”ბრEXCLUDE შეზღუდვáƒáƒ¨áƒ˜ წáƒáƒ áƒ›áƒáƒáƒ“გენს:" -#: sql_help.c:1431 sql_help.c:2473 sql_help.c:2910 sql_help.c:2923 -#: sql_help.c:2937 sql_help.c:2986 sql_help.c:4004 +#: sql_help.c:1448 sql_help.c:2491 sql_help.c:2924 sql_help.c:2937 +#: sql_help.c:2951 sql_help.c:3001 sql_help.c:4022 msgid "opclass" msgstr "áƒáƒžáƒ”რáƒáƒ¢_კლáƒáƒ¡áƒ˜" -#: sql_help.c:1432 sql_help.c:2987 +#: sql_help.c:1449 sql_help.c:2492 sql_help.c:3002 +msgid "opclass_parameter" +msgstr "áƒáƒžáƒ”რáƒáƒ¢_კლáƒáƒ¡áƒ˜áƒ¡_პáƒáƒ áƒáƒ›áƒ”ტრი" + +#: sql_help.c:1451 sql_help.c:3004 msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" msgstr "მიბმის ქმედებრFOREIGN KEY/REFERENCES შეზღუდვáƒáƒ¨áƒ˜ წáƒáƒ áƒ›áƒáƒáƒ“გენს:" -#: sql_help.c:1450 sql_help.c:1453 sql_help.c:3024 +#: sql_help.c:1469 sql_help.c:1472 sql_help.c:3041 msgid "tablespace_option" msgstr "ცხრილების_სივრცის_პáƒáƒ áƒáƒ›áƒ”ტრი" -#: sql_help.c:1474 sql_help.c:1477 sql_help.c:1483 sql_help.c:1487 +#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1502 sql_help.c:1506 msgid "token_type" msgstr "კáƒáƒ“ის_ტიპი" -#: sql_help.c:1475 sql_help.c:1478 +#: sql_help.c:1494 sql_help.c:1497 msgid "dictionary_name" msgstr "ლექსიკáƒáƒœáƒ˜áƒ¡_სáƒáƒ®áƒ”ლი" -#: sql_help.c:1480 sql_help.c:1484 +#: sql_help.c:1499 sql_help.c:1503 msgid "old_dictionary" msgstr "ძველი_ლექსიკáƒáƒœáƒ˜" -#: sql_help.c:1481 sql_help.c:1485 +#: sql_help.c:1500 sql_help.c:1504 msgid "new_dictionary" msgstr "áƒáƒ®áƒáƒšáƒ˜_ლექსიკáƒáƒœáƒ˜" -#: sql_help.c:1580 sql_help.c:1594 sql_help.c:1597 sql_help.c:1598 -#: sql_help.c:3177 +#: sql_help.c:1599 sql_help.c:1613 sql_help.c:1616 sql_help.c:1617 +#: sql_help.c:3194 msgid "attribute_name" msgstr "áƒáƒ¢áƒ áƒ˜áƒ‘უტის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:1581 +#: sql_help.c:1600 msgid "new_attribute_name" msgstr "áƒáƒ®áƒáƒšáƒ˜_áƒáƒ¢áƒ áƒ˜áƒ‘უტის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:1585 sql_help.c:1589 +#: sql_help.c:1604 sql_help.c:1608 msgid "new_enum_value" msgstr "áƒáƒ—ვლის_áƒáƒ®áƒáƒšáƒ˜_მნიშვნელáƒáƒ‘áƒ" -#: sql_help.c:1586 +#: sql_help.c:1605 msgid "neighbor_enum_value" msgstr "მეზáƒáƒ‘ლáƒáƒ“_áƒáƒ—ვლის_მნიშვნელáƒáƒ‘áƒ" -#: sql_help.c:1588 +#: sql_help.c:1607 msgid "existing_enum_value" msgstr "áƒáƒ¦áƒ áƒ˜áƒªáƒ®áƒ•ის_áƒáƒ áƒ¡áƒ”ბული_მნიშვნელáƒáƒ‘áƒ" -#: sql_help.c:1591 +#: sql_help.c:1610 msgid "property" msgstr "თვისებáƒ" -#: sql_help.c:1668 sql_help.c:2344 sql_help.c:2353 sql_help.c:2759 -#: sql_help.c:3257 sql_help.c:3708 sql_help.c:3914 sql_help.c:3960 -#: sql_help.c:4366 +#: sql_help.c:1686 sql_help.c:2362 sql_help.c:2371 sql_help.c:2773 +#: sql_help.c:3274 sql_help.c:3725 sql_help.c:3932 sql_help.c:3978 +#: sql_help.c:4395 msgid "server_name" -msgstr "სერვერის_სáƒáƒ®áƒ”ლი" +msgstr "server_name" -#: sql_help.c:1700 sql_help.c:1703 sql_help.c:3272 +#: sql_help.c:1718 sql_help.c:1721 sql_help.c:3289 msgid "view_option_name" msgstr "ხედის_პáƒáƒ áƒáƒ›áƒ”ტრის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:1701 sql_help.c:3273 +#: sql_help.c:1719 sql_help.c:3290 msgid "view_option_value" msgstr "ხედის_პáƒáƒ áƒáƒ›áƒ”ტრის_მნიშვნელáƒáƒ‘áƒ" -#: sql_help.c:1723 sql_help.c:1724 sql_help.c:4977 sql_help.c:4978 +#: sql_help.c:1740 sql_help.c:5007 msgid "table_and_columns" msgstr "ცხრილი_დრსვეტები" -#: sql_help.c:1725 sql_help.c:1789 sql_help.c:1981 sql_help.c:3757 -#: sql_help.c:4201 sql_help.c:4979 +#: sql_help.c:1741 sql_help.c:1801 sql_help.c:1995 sql_help.c:3774 +#: sql_help.c:4230 sql_help.c:5008 msgid "where option can be one of:" msgstr "სáƒáƒ“áƒáƒª option შეიძლებრიყáƒáƒ¡ ერთ-ერთი სიიდáƒáƒœ:" -#: sql_help.c:1726 sql_help.c:1727 sql_help.c:1790 sql_help.c:1983 -#: sql_help.c:1986 sql_help.c:2167 sql_help.c:3758 sql_help.c:3759 -#: sql_help.c:3760 sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 -#: sql_help.c:3764 sql_help.c:3765 sql_help.c:3766 sql_help.c:4202 -#: sql_help.c:4204 sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 -#: sql_help.c:4983 sql_help.c:4984 sql_help.c:4985 sql_help.c:4986 -#: sql_help.c:4987 sql_help.c:4988 sql_help.c:4990 sql_help.c:4991 +#: sql_help.c:1742 sql_help.c:1743 sql_help.c:1802 sql_help.c:1997 +#: sql_help.c:2001 sql_help.c:2183 sql_help.c:3775 sql_help.c:3776 +#: sql_help.c:3777 sql_help.c:3778 sql_help.c:3779 sql_help.c:3780 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:4231 sql_help.c:4233 sql_help.c:5009 sql_help.c:5010 +#: sql_help.c:5011 sql_help.c:5012 sql_help.c:5013 sql_help.c:5014 +#: sql_help.c:5015 sql_help.c:5016 sql_help.c:5017 sql_help.c:5019 +#: sql_help.c:5020 msgid "boolean" msgstr "ლáƒáƒ’იკური" -#: sql_help.c:1728 sql_help.c:4992 +#: sql_help.c:1744 sql_help.c:5021 msgid "size" msgstr "ზáƒáƒ›áƒ" -#: sql_help.c:1729 sql_help.c:4993 +#: sql_help.c:1745 sql_help.c:5022 msgid "and table_and_columns is:" msgstr "დრtable_and_columns áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:1745 sql_help.c:4739 sql_help.c:4741 sql_help.c:4765 +#: sql_help.c:1761 sql_help.c:4769 sql_help.c:4771 sql_help.c:4795 msgid "transaction_mode" msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡_რეჟიმი" -#: sql_help.c:1746 sql_help.c:4742 sql_help.c:4766 +#: sql_help.c:1762 sql_help.c:4772 sql_help.c:4796 msgid "where transaction_mode is one of:" msgstr "სáƒáƒ“áƒáƒª transaction_mode შეიძლებრიყáƒáƒ¡ ერთ-ერთი სიიდáƒáƒœ:" -#: sql_help.c:1755 sql_help.c:4585 sql_help.c:4594 sql_help.c:4598 -#: sql_help.c:4602 sql_help.c:4605 sql_help.c:4842 sql_help.c:4851 -#: sql_help.c:4855 sql_help.c:4859 sql_help.c:4862 sql_help.c:5088 -#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5105 sql_help.c:5108 +#: sql_help.c:1771 sql_help.c:4614 sql_help.c:4623 sql_help.c:4627 +#: sql_help.c:4631 sql_help.c:4634 sql_help.c:4872 sql_help.c:4881 +#: sql_help.c:4885 sql_help.c:4889 sql_help.c:4892 sql_help.c:5117 +#: sql_help.c:5126 sql_help.c:5130 sql_help.c:5134 sql_help.c:5137 msgid "argument" msgstr "áƒáƒ áƒ’იმენტი" -#: sql_help.c:1855 +#: sql_help.c:1867 msgid "relation_name" msgstr "ურთიერთáƒáƒ‘ის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:1860 sql_help.c:3908 sql_help.c:4360 +#: sql_help.c:1872 sql_help.c:3926 sql_help.c:4389 msgid "domain_name" msgstr "დáƒáƒ›áƒ”ნის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:1882 +#: sql_help.c:1894 msgid "policy_name" -msgstr "წესის_სáƒáƒ®áƒ”ლი" +msgstr "policy_name" -#: sql_help.c:1895 +#: sql_help.c:1907 msgid "rule_name" -msgstr "წესის_სáƒáƒ®áƒ”ლი" +msgstr "rule_name" -#: sql_help.c:1914 sql_help.c:4499 +#: sql_help.c:1926 sql_help.c:4528 msgid "string_literal" -msgstr "სტრიქáƒáƒœáƒ˜_მუდმივáƒ" +msgstr "string_literal" -#: sql_help.c:1939 sql_help.c:4163 sql_help.c:4413 +#: sql_help.c:1951 sql_help.c:4192 sql_help.c:4442 msgid "transaction_id" msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡_id" -#: sql_help.c:1971 sql_help.c:1978 sql_help.c:4030 +#: sql_help.c:1985 sql_help.c:1992 sql_help.c:4048 msgid "filename" msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი" -#: sql_help.c:1972 sql_help.c:1979 sql_help.c:2698 sql_help.c:2699 -#: sql_help.c:2700 +#: sql_help.c:1986 sql_help.c:1993 sql_help.c:2712 sql_help.c:2713 +#: sql_help.c:2714 msgid "command" msgstr "ბრძáƒáƒœáƒ”ბáƒ" -#: sql_help.c:1974 sql_help.c:2697 sql_help.c:3127 sql_help.c:3308 -#: sql_help.c:4014 sql_help.c:4091 sql_help.c:4094 sql_help.c:4568 -#: sql_help.c:4570 sql_help.c:4671 sql_help.c:4673 sql_help.c:4825 -#: sql_help.c:4827 sql_help.c:4943 sql_help.c:5071 sql_help.c:5073 +#: sql_help.c:1988 sql_help.c:2711 sql_help.c:3144 sql_help.c:3325 +#: sql_help.c:4032 sql_help.c:4115 sql_help.c:4118 sql_help.c:4121 +#: sql_help.c:4597 sql_help.c:4599 sql_help.c:4701 sql_help.c:4703 +#: sql_help.c:4855 sql_help.c:4857 sql_help.c:4974 sql_help.c:5100 +#: sql_help.c:5102 msgid "condition" msgstr "მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒ" -#: sql_help.c:1977 sql_help.c:2514 sql_help.c:3010 sql_help.c:3274 -#: sql_help.c:3292 sql_help.c:3995 +#: sql_help.c:1991 sql_help.c:2532 sql_help.c:3027 sql_help.c:3291 +#: sql_help.c:3309 sql_help.c:4013 msgid "query" msgstr "მáƒáƒ—ხáƒáƒ•ნáƒ" -#: sql_help.c:1982 +#: sql_help.c:1996 msgid "format_name" msgstr "ფáƒáƒ áƒ›áƒáƒ¢áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი" -#: sql_help.c:1984 +#: sql_help.c:1998 msgid "delimiter_character" msgstr "გáƒáƒ›áƒ§áƒáƒ¤áƒ˜_სიმბáƒáƒšáƒ" -#: sql_help.c:1985 +#: sql_help.c:1999 msgid "null_string" msgstr "ნულáƒáƒ•áƒáƒœáƒ˜_სტრიქáƒáƒœáƒ˜" -#: sql_help.c:1987 +#: sql_help.c:2000 +msgid "default_string" +msgstr "default_string" + +#: sql_help.c:2002 msgid "quote_character" msgstr "ციტáƒáƒ¢áƒ˜áƒ¡_სიმბáƒáƒšáƒ" -#: sql_help.c:1988 +#: sql_help.c:2003 msgid "escape_character" -msgstr "სპეციáƒáƒšáƒ£áƒ áƒ˜_სიმბáƒáƒšáƒ" +msgstr "escape_character" + +#: sql_help.c:2007 +msgid "error_action" +msgstr "error_action" -#: sql_help.c:1992 +#: sql_help.c:2008 msgid "encoding_name" msgstr "კáƒáƒ“ირების-სáƒáƒ®áƒ”ლი" -#: sql_help.c:1993 -#| msgid "null_string" -msgid "default_string" -msgstr "default_string" +#: sql_help.c:2009 +msgid "verbosity" +msgstr "დეტáƒáƒšáƒ£áƒ áƒáƒ‘áƒ" -#: sql_help.c:2004 +#: sql_help.c:2020 msgid "access_method_type" msgstr "წვდáƒáƒ›áƒ˜áƒ¡_მეთáƒáƒ“ის_ტიპი" -#: sql_help.c:2075 sql_help.c:2094 sql_help.c:2097 +#: sql_help.c:2091 sql_help.c:2110 sql_help.c:2113 msgid "arg_data_type" msgstr "áƒáƒ áƒ’_მáƒáƒœáƒáƒª_ტიპი" -#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106 +#: sql_help.c:2092 sql_help.c:2114 sql_help.c:2122 msgid "sfunc" msgstr "მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის_ფუნქციáƒ" -#: sql_help.c:2077 sql_help.c:2099 sql_help.c:2107 +#: sql_help.c:2093 sql_help.c:2115 sql_help.c:2123 msgid "state_data_type" msgstr "მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის_მáƒáƒœáƒáƒªáƒ”მების_ტიპი" -#: sql_help.c:2078 sql_help.c:2100 sql_help.c:2108 +#: sql_help.c:2094 sql_help.c:2116 sql_help.c:2124 msgid "state_data_size" msgstr "მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის_მáƒáƒœáƒáƒªáƒ”მების_ზáƒáƒ›áƒ" -#: sql_help.c:2079 sql_help.c:2101 sql_help.c:2109 +#: sql_help.c:2095 sql_help.c:2117 sql_help.c:2125 msgid "ffunc" msgstr "დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის ფუნქციáƒ" -#: sql_help.c:2080 sql_help.c:2110 +#: sql_help.c:2096 sql_help.c:2126 msgid "combinefunc" msgstr "კáƒáƒ›áƒ‘ინ_ფუნქც" -#: sql_help.c:2081 sql_help.c:2111 +#: sql_help.c:2097 sql_help.c:2127 msgid "serialfunc" msgstr "დესერიáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡_ფუნქციáƒ" -#: sql_help.c:2082 sql_help.c:2112 +#: sql_help.c:2098 sql_help.c:2128 msgid "deserialfunc" msgstr "დესერიáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡_ფუნქც" -#: sql_help.c:2083 sql_help.c:2102 sql_help.c:2113 +#: sql_help.c:2099 sql_help.c:2118 sql_help.c:2129 msgid "initial_condition" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜_მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒ" -#: sql_help.c:2084 sql_help.c:2114 +#: sql_help.c:2100 sql_help.c:2130 msgid "msfunc" msgstr "გáƒáƒ“áƒáƒáƒ“გ_მდგáƒáƒ›_ფუნქციáƒ" -#: sql_help.c:2085 sql_help.c:2115 +#: sql_help.c:2101 sql_help.c:2131 msgid "minvfunc" msgstr "გáƒáƒ“áƒáƒáƒ“გ_მინ_მნიშვნ_ფუნქციáƒ" -#: sql_help.c:2086 sql_help.c:2116 +#: sql_help.c:2102 sql_help.c:2132 msgid "mstate_data_type" msgstr "გáƒáƒ“áƒáƒáƒ“გ_მáƒáƒœáƒáƒª_ტიპი" -#: sql_help.c:2087 sql_help.c:2117 +#: sql_help.c:2103 sql_help.c:2133 msgid "mstate_data_size" msgstr "გáƒáƒ“áƒáƒáƒ“გ_მáƒáƒœáƒáƒª_ზáƒáƒ›" -#: sql_help.c:2088 sql_help.c:2118 +#: sql_help.c:2104 sql_help.c:2134 msgid "mffunc" msgstr "გáƒáƒ“áƒáƒ“გ_დáƒáƒ¡áƒ áƒ£áƒš_ფუნქციáƒ" -#: sql_help.c:2089 sql_help.c:2119 +#: sql_help.c:2105 sql_help.c:2135 msgid "minitial_condition" msgstr "გáƒáƒ“áƒáƒáƒ“გ­_დáƒáƒ¡áƒáƒ¬áƒ§_ფუნქციáƒ" -#: sql_help.c:2090 sql_help.c:2120 +#: sql_help.c:2106 sql_help.c:2136 msgid "sort_operator" msgstr "დáƒáƒšáƒáƒ’ების_áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜" -#: sql_help.c:2103 +#: sql_help.c:2119 msgid "or the old syntax" msgstr "áƒáƒœ ძველი სინტáƒáƒ¥áƒ¡áƒ˜" -#: sql_help.c:2105 +#: sql_help.c:2121 msgid "base_type" -msgstr "სáƒáƒ‘áƒáƒ–ისáƒ_ტიპი" +msgstr "base_type" -#: sql_help.c:2163 sql_help.c:2212 +#: sql_help.c:2179 sql_help.c:2229 msgid "locale" -msgstr "ენáƒ" +msgstr "ლáƒáƒ™áƒáƒšáƒ˜" -#: sql_help.c:2164 sql_help.c:2213 +#: sql_help.c:2180 sql_help.c:2230 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2165 sql_help.c:2214 +#: sql_help.c:2181 sql_help.c:2231 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2166 sql_help.c:4466 +#: sql_help.c:2182 sql_help.c:4495 msgid "provider" msgstr "მáƒáƒ›áƒ¬áƒáƒ“ებელი" -#: sql_help.c:2168 +#: sql_help.c:2184 msgid "rules" -msgstr "წესები" +msgstr "rules" -#: sql_help.c:2169 sql_help.c:2274 +#: sql_help.c:2185 sql_help.c:2292 msgid "version" msgstr "ვერსიáƒ" -#: sql_help.c:2171 +#: sql_help.c:2187 msgid "existing_collation" msgstr "áƒáƒ áƒ¡áƒ”ბული_კáƒáƒšáƒáƒªáƒ˜áƒ" -#: sql_help.c:2181 +#: sql_help.c:2197 msgid "source_encoding" msgstr "წყáƒáƒ áƒáƒ¡_კáƒáƒ“ირებáƒ" -#: sql_help.c:2182 +#: sql_help.c:2198 msgid "dest_encoding" msgstr "სáƒáƒ›áƒ˜áƒ–ნე_კáƒáƒ“ირებáƒ" -#: sql_help.c:2209 sql_help.c:3050 +#: sql_help.c:2226 sql_help.c:3067 msgid "template" msgstr "შáƒáƒ‘ლáƒáƒœáƒ˜" -#: sql_help.c:2210 +#: sql_help.c:2227 msgid "encoding" msgstr "კáƒáƒ“ირებáƒ" -#: sql_help.c:2211 +#: sql_help.c:2228 msgid "strategy" msgstr "სტრáƒáƒ¢áƒ”გიáƒ" -#: sql_help.c:2215 +#: sql_help.c:2232 +msgid "builtin_locale" +msgstr "builtin_locale" + +#: sql_help.c:2233 msgid "icu_locale" msgstr "icu_ენáƒ" -#: sql_help.c:2216 -#| msgid "icu_locale" +#: sql_help.c:2234 msgid "icu_rules" msgstr "icu_rules" -#: sql_help.c:2217 +#: sql_help.c:2235 msgid "locale_provider" -msgstr "ენის_მáƒáƒ›áƒ¬áƒáƒ“ებელი" +msgstr "locale_provider" -#: sql_help.c:2218 +#: sql_help.c:2236 msgid "collation_version" msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ ვერსიáƒ" -#: sql_help.c:2223 +#: sql_help.c:2241 msgid "oid" msgstr "oid" -#: sql_help.c:2243 -msgid "constraint" -msgstr "შეზღუდვáƒ" - -#: sql_help.c:2244 -msgid "where constraint is:" -msgstr "სáƒáƒ“áƒáƒª constraint áƒáƒ áƒ˜áƒ¡:" - -#: sql_help.c:2258 sql_help.c:2695 sql_help.c:3123 +#: sql_help.c:2276 sql_help.c:2709 sql_help.c:3140 msgid "event" msgstr "მáƒáƒ•ლენáƒ" -#: sql_help.c:2259 +#: sql_help.c:2277 msgid "filter_variable" msgstr "ფილტრის_ცვლáƒáƒ“ი" -#: sql_help.c:2260 +#: sql_help.c:2278 msgid "filter_value" msgstr "ფილტრის_მნიშვნელáƒáƒ‘áƒ" -#: sql_help.c:2356 sql_help.c:2942 +#: sql_help.c:2374 sql_help.c:2956 msgid "where column_constraint is:" msgstr "სáƒáƒ“áƒáƒª column_constraint áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:2401 +#: sql_help.c:2419 msgid "rettype" msgstr "დáƒáƒ‘რუნების_ტიპი" -#: sql_help.c:2403 +#: sql_help.c:2421 msgid "column_type" -msgstr "სვეტის_ტიპი" +msgstr "column_type" -#: sql_help.c:2412 sql_help.c:2615 +#: sql_help.c:2430 sql_help.c:2633 msgid "definition" msgstr "áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:2413 sql_help.c:2616 +#: sql_help.c:2431 sql_help.c:2634 msgid "obj_file" msgstr "áƒáƒ‘იექტის_ფáƒáƒ˜áƒšáƒ˜" -#: sql_help.c:2414 sql_help.c:2617 +#: sql_help.c:2432 sql_help.c:2635 msgid "link_symbol" -msgstr "სიმბáƒáƒšáƒáƒ¡_მიბმáƒ" +msgstr "link_symbol" -#: sql_help.c:2415 sql_help.c:2618 +#: sql_help.c:2433 sql_help.c:2636 msgid "sql_body" msgstr "sql_ის_სხეული" -#: sql_help.c:2453 sql_help.c:2680 sql_help.c:3246 +#: sql_help.c:2471 sql_help.c:2694 sql_help.c:3263 msgid "uid" msgstr "uid" -#: sql_help.c:2469 sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 -#: sql_help.c:2938 sql_help.c:3006 +#: sql_help.c:2487 sql_help.c:2528 sql_help.c:2925 sql_help.c:2938 +#: sql_help.c:2952 sql_help.c:3023 msgid "method" msgstr "მეთáƒáƒ“ი" -#: sql_help.c:2474 -msgid "opclass_parameter" -msgstr "áƒáƒžáƒ”რáƒáƒ¢_კლáƒáƒ¡áƒ˜áƒ¡_პáƒáƒ áƒáƒ›áƒ”ტრი" - -#: sql_help.c:2491 +#: sql_help.c:2509 msgid "call_handler" msgstr "გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბის_დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი" -#: sql_help.c:2492 +#: sql_help.c:2510 msgid "inline_handler" msgstr "ჩáƒáƒ“გმული_კáƒáƒ“ის_დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებელი" -#: sql_help.c:2493 +#: sql_help.c:2511 msgid "valfunction" msgstr "მნიშვნფუნქციáƒ" -#: sql_help.c:2532 -msgid "com_op" -msgstr "კáƒáƒ›áƒ£áƒ¢_áƒáƒžáƒ”რ" - -#: sql_help.c:2533 -msgid "neg_op" -msgstr "უáƒáƒ áƒ§_áƒáƒžáƒ”რáƒáƒ¢" - -#: sql_help.c:2551 +#: sql_help.c:2569 msgid "family_name" msgstr "áƒáƒ¯áƒáƒ®áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი" -#: sql_help.c:2562 +#: sql_help.c:2580 msgid "storage_type" msgstr "სáƒáƒªáƒáƒ•ის_ტიპი" -#: sql_help.c:2701 sql_help.c:3130 +#: sql_help.c:2715 sql_help.c:3147 msgid "where event can be one of:" msgstr "სáƒáƒ“áƒáƒª event შეიძლებრიყáƒáƒ¡ ერთ-ერთი:" -#: sql_help.c:2721 sql_help.c:2723 +#: sql_help.c:2735 sql_help.c:2737 msgid "schema_element" -msgstr "სქემის_ელემენტი" +msgstr "schema_element" -#: sql_help.c:2760 +#: sql_help.c:2774 msgid "server_type" -msgstr "სერვერის_ტიპი" +msgstr "server_type" -#: sql_help.c:2761 +#: sql_help.c:2775 msgid "server_version" -msgstr "სერვერის_ვერსიáƒ" +msgstr "server_version" -#: sql_help.c:2762 sql_help.c:3911 sql_help.c:4363 +#: sql_help.c:2776 sql_help.c:3929 sql_help.c:4392 msgid "fdw_name" msgstr "fdw_name" -#: sql_help.c:2779 sql_help.c:2782 +#: sql_help.c:2793 sql_help.c:2796 msgid "statistics_name" -msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი" +msgstr "statistics_name" -#: sql_help.c:2783 +#: sql_help.c:2797 msgid "statistics_kind" -msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡_ტიპი" +msgstr "statistics_kind" -#: sql_help.c:2799 +#: sql_help.c:2813 msgid "subscription_name" msgstr "გáƒáƒ›áƒáƒ¬áƒ”რის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:2904 +#: sql_help.c:2918 msgid "source_table" msgstr "წყáƒáƒ áƒáƒ¡_ცხრილი" -#: sql_help.c:2905 +#: sql_help.c:2919 msgid "like_option" msgstr "მსგáƒáƒ•სების_პáƒáƒ áƒáƒ›áƒ”ტრი" -#: sql_help.c:2971 +#: sql_help.c:2985 msgid "and like_option is:" msgstr "დრlike_option áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:3023 +#: sql_help.c:3040 msgid "directory" msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე" -#: sql_help.c:3037 +#: sql_help.c:3054 msgid "parser_name" msgstr "დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:3038 +#: sql_help.c:3055 msgid "source_config" msgstr "წყáƒáƒ áƒáƒ¡_კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ" -#: sql_help.c:3067 +#: sql_help.c:3084 msgid "start_function" msgstr "გáƒáƒ¨áƒ•ების_ფუნქციáƒ" -#: sql_help.c:3068 +#: sql_help.c:3085 msgid "gettoken_function" msgstr "კáƒáƒ“ის_მიღების_ფუნქციáƒ" -#: sql_help.c:3069 +#: sql_help.c:3086 msgid "end_function" msgstr "დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბის ფუნქციáƒ" -#: sql_help.c:3070 +#: sql_help.c:3087 msgid "lextypes_function" msgstr "ლექს_ტიპების_ფუნქციáƒ" -#: sql_help.c:3071 +#: sql_help.c:3088 msgid "headline_function" msgstr "headline_function" -#: sql_help.c:3083 +#: sql_help.c:3100 msgid "init_function" msgstr "ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡_ფუნქციáƒ" -#: sql_help.c:3084 +#: sql_help.c:3101 msgid "lexize_function" msgstr "ლექსით_გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡_ფუნქციáƒ" -#: sql_help.c:3097 +#: sql_help.c:3114 msgid "from_sql_function_name" msgstr "sql_ფუნქციის_სáƒáƒ®áƒ”ლიდáƒáƒœ" -#: sql_help.c:3099 +#: sql_help.c:3116 msgid "to_sql_function_name" msgstr "ფუნქციის_სáƒáƒ®áƒ”ლი_sql_ში" -#: sql_help.c:3125 +#: sql_help.c:3142 msgid "referenced_table_name" msgstr "მიბმული_ცხრილის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:3126 +#: sql_help.c:3143 msgid "transition_relation_name" msgstr "გáƒáƒ áƒ“áƒáƒ›áƒáƒ•áƒáƒšáƒ˜_ურთიერთáƒáƒ‘ის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:3129 +#: sql_help.c:3146 msgid "arguments" msgstr "áƒáƒ áƒ’უმენტები" -#: sql_help.c:3181 +#: sql_help.c:3198 msgid "label" msgstr "ჭდე" -#: sql_help.c:3183 +#: sql_help.c:3200 msgid "subtype" msgstr "ქვეტიპი" -#: sql_help.c:3184 +#: sql_help.c:3201 msgid "subtype_operator_class" msgstr "ქვეტიპის_áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡_კლáƒáƒ¡áƒ˜" -#: sql_help.c:3186 +#: sql_help.c:3203 msgid "canonical_function" msgstr "კáƒáƒœáƒáƒœáƒ˜áƒ™áƒ£áƒ áƒ˜_ფუნქციáƒ" -#: sql_help.c:3187 +#: sql_help.c:3204 msgid "subtype_diff_function" msgstr "ქვეტიპის_სხვáƒáƒáƒ‘ის_ფუნქციáƒ" -#: sql_help.c:3188 +#: sql_help.c:3205 msgid "multirange_type_name" msgstr "მრáƒáƒ•áƒáƒšáƒ“იáƒáƒžáƒáƒ–áƒáƒœáƒ˜áƒáƒœáƒ˜_ტიპის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:3190 +#: sql_help.c:3207 msgid "input_function" msgstr "შეყვáƒáƒœáƒ˜áƒ¡_ფუნქციáƒ" -#: sql_help.c:3191 +#: sql_help.c:3208 msgid "output_function" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡_ფუნქციáƒ" -#: sql_help.c:3192 +#: sql_help.c:3209 msgid "receive_function" msgstr "მიღების_ფუნქციáƒ" -#: sql_help.c:3193 +#: sql_help.c:3210 msgid "send_function" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜_მნიშვნელáƒáƒ‘ის_ფუნქციáƒ" -#: sql_help.c:3194 +#: sql_help.c:3211 msgid "type_modifier_input_function" msgstr "ტიპის_მáƒáƒ“იფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡_შემყვáƒáƒœáƒ˜áƒ¡_ფუნქციáƒ" -#: sql_help.c:3195 +#: sql_help.c:3212 msgid "type_modifier_output_function" msgstr "ტიპის_მáƒáƒ¢áƒ˜áƒ¤áƒ˜áƒ™áƒáƒ¢áƒáƒ áƒ˜áƒ¡_გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡_ფუნქციáƒ" -#: sql_help.c:3196 +#: sql_help.c:3213 msgid "analyze_function" msgstr "ფუნქციის_áƒáƒœáƒáƒšáƒ˜áƒ–ი" -#: sql_help.c:3197 +#: sql_help.c:3214 msgid "subscript_function" msgstr "ინდექსით_მიმáƒáƒ áƒ—ვის_ფუნქციáƒ" -#: sql_help.c:3198 +#: sql_help.c:3215 msgid "internallength" msgstr "შიდáƒáƒ¡áƒ˜áƒ’რძე" -#: sql_help.c:3199 +#: sql_help.c:3216 msgid "alignment" msgstr "სწáƒáƒ áƒ”ბáƒ" -#: sql_help.c:3200 +#: sql_help.c:3217 msgid "storage" msgstr "სáƒáƒªáƒáƒ•ი" -#: sql_help.c:3201 +#: sql_help.c:3218 msgid "like_type" msgstr "მსგáƒáƒ•სების_ტიპი" -#: sql_help.c:3202 +#: sql_help.c:3219 msgid "category" msgstr "კáƒáƒ¢áƒ”გáƒáƒ áƒ˜áƒ" -#: sql_help.c:3203 +#: sql_help.c:3220 msgid "preferred" msgstr "რჩეული" -#: sql_help.c:3204 +#: sql_help.c:3221 msgid "default" msgstr "ნáƒáƒ’ულისხმები" -#: sql_help.c:3205 +#: sql_help.c:3222 msgid "element" msgstr "ელემენტი" -#: sql_help.c:3206 +#: sql_help.c:3223 msgid "delimiter" msgstr "გáƒáƒ›áƒ§áƒáƒ¤áƒ˜" -#: sql_help.c:3207 +#: sql_help.c:3224 msgid "collatable" msgstr "დáƒáƒšáƒáƒ’ებáƒáƒ“ი" -#: sql_help.c:3304 sql_help.c:3990 sql_help.c:4080 sql_help.c:4563 -#: sql_help.c:4665 sql_help.c:4820 sql_help.c:4933 sql_help.c:5066 +#: sql_help.c:3321 sql_help.c:4008 sql_help.c:4102 sql_help.c:4592 +#: sql_help.c:4695 sql_help.c:4850 sql_help.c:4964 sql_help.c:5095 msgid "with_query" msgstr "მáƒáƒ—ხáƒáƒ•ნით" -#: sql_help.c:3306 sql_help.c:3992 sql_help.c:4582 sql_help.c:4588 -#: sql_help.c:4591 sql_help.c:4595 sql_help.c:4599 sql_help.c:4607 -#: sql_help.c:4839 sql_help.c:4845 sql_help.c:4848 sql_help.c:4852 -#: sql_help.c:4856 sql_help.c:4864 sql_help.c:4935 sql_help.c:5085 -#: sql_help.c:5091 sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 -#: sql_help.c:5110 +#: sql_help.c:3323 sql_help.c:4010 sql_help.c:4611 sql_help.c:4617 +#: sql_help.c:4620 sql_help.c:4624 sql_help.c:4628 sql_help.c:4636 +#: sql_help.c:4869 sql_help.c:4875 sql_help.c:4878 sql_help.c:4882 +#: sql_help.c:4886 sql_help.c:4894 sql_help.c:4966 sql_help.c:5114 +#: sql_help.c:5120 sql_help.c:5123 sql_help.c:5127 sql_help.c:5131 +#: sql_help.c:5139 msgid "alias" msgstr "მეტსáƒáƒ®áƒ”ლი" -#: sql_help.c:3307 sql_help.c:4567 sql_help.c:4609 sql_help.c:4611 -#: sql_help.c:4615 sql_help.c:4617 sql_help.c:4618 sql_help.c:4619 -#: sql_help.c:4670 sql_help.c:4824 sql_help.c:4866 sql_help.c:4868 -#: sql_help.c:4872 sql_help.c:4874 sql_help.c:4875 sql_help.c:4876 -#: sql_help.c:4942 sql_help.c:5070 sql_help.c:5112 sql_help.c:5114 -#: sql_help.c:5118 sql_help.c:5120 sql_help.c:5121 sql_help.c:5122 +#: sql_help.c:3324 sql_help.c:4596 sql_help.c:4638 sql_help.c:4640 +#: sql_help.c:4644 sql_help.c:4646 sql_help.c:4647 sql_help.c:4648 +#: sql_help.c:4700 sql_help.c:4854 sql_help.c:4896 sql_help.c:4898 +#: sql_help.c:4902 sql_help.c:4904 sql_help.c:4905 sql_help.c:4906 +#: sql_help.c:4973 sql_help.c:5099 sql_help.c:5141 sql_help.c:5143 +#: sql_help.c:5147 sql_help.c:5149 sql_help.c:5150 sql_help.c:5151 msgid "from_item" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რიდáƒáƒœ" -#: sql_help.c:3309 sql_help.c:3792 sql_help.c:4130 sql_help.c:4944 +#: sql_help.c:3326 sql_help.c:3810 sql_help.c:4159 sql_help.c:4975 msgid "cursor_name" msgstr "კურსáƒáƒ áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი" -#: sql_help.c:3310 sql_help.c:3998 sql_help.c:4945 +#: sql_help.c:3327 sql_help.c:4016 sql_help.c:4108 sql_help.c:4976 msgid "output_expression" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡_გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ" -#: sql_help.c:3311 sql_help.c:3999 sql_help.c:4566 sql_help.c:4668 -#: sql_help.c:4823 sql_help.c:4946 sql_help.c:5069 +#: sql_help.c:3328 sql_help.c:4017 sql_help.c:4109 sql_help.c:4595 +#: sql_help.c:4698 sql_help.c:4853 sql_help.c:4977 sql_help.c:5098 msgid "output_name" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ¡_სáƒáƒ®áƒ”ლი" -#: sql_help.c:3327 +#: sql_help.c:3344 msgid "code" msgstr "კáƒáƒ“ი" -#: sql_help.c:3732 +#: sql_help.c:3749 msgid "parameter" msgstr "Პáƒáƒ áƒáƒ›áƒ”ტრი" -#: sql_help.c:3755 sql_help.c:3756 sql_help.c:4155 +#: sql_help.c:3773 sql_help.c:4184 msgid "statement" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜" -#: sql_help.c:3791 sql_help.c:4129 +#: sql_help.c:3809 sql_help.c:4158 msgid "direction" msgstr "მიმáƒáƒ áƒ—ულებáƒ" -#: sql_help.c:3793 sql_help.c:4131 +#: sql_help.c:3811 sql_help.c:4160 msgid "where direction can be one of:" -msgstr "სáƒáƒ“áƒáƒª მიმáƒáƒ áƒ—ულებრშეიძლებრიყáƒáƒ¡ ერთ-ერთი:" +msgstr "სáƒáƒ“áƒáƒª direction შეიძლებრიყáƒáƒ¡ ერთ-ერთი:" -#: sql_help.c:3794 sql_help.c:3795 sql_help.c:3796 sql_help.c:3797 -#: sql_help.c:3798 sql_help.c:4132 sql_help.c:4133 sql_help.c:4134 -#: sql_help.c:4135 sql_help.c:4136 sql_help.c:4576 sql_help.c:4578 -#: sql_help.c:4679 sql_help.c:4681 sql_help.c:4833 sql_help.c:4835 -#: sql_help.c:5010 sql_help.c:5012 sql_help.c:5079 sql_help.c:5081 +#: sql_help.c:3812 sql_help.c:3813 sql_help.c:3814 sql_help.c:3815 +#: sql_help.c:3816 sql_help.c:4161 sql_help.c:4162 sql_help.c:4163 +#: sql_help.c:4164 sql_help.c:4165 sql_help.c:4605 sql_help.c:4607 +#: sql_help.c:4709 sql_help.c:4711 sql_help.c:4863 sql_help.c:4865 +#: sql_help.c:5039 sql_help.c:5041 sql_help.c:5108 sql_help.c:5110 msgid "count" msgstr "რáƒáƒáƒ“ენáƒáƒ‘áƒ" -#: sql_help.c:3901 sql_help.c:4353 +#: sql_help.c:3919 sql_help.c:4382 msgid "sequence_name" msgstr "მიმდევრáƒáƒ‘ის _სáƒáƒ®áƒ”ლი" -#: sql_help.c:3919 sql_help.c:4371 +#: sql_help.c:3937 sql_help.c:4400 msgid "arg_name" msgstr "áƒáƒ áƒ’_სáƒáƒ®áƒ”ლი" -#: sql_help.c:3920 sql_help.c:4372 +#: sql_help.c:3938 sql_help.c:4401 msgid "arg_type" msgstr "áƒáƒ áƒ’_ტიპი" -#: sql_help.c:3927 sql_help.c:4379 +#: sql_help.c:3945 sql_help.c:4408 msgid "loid" msgstr "loid" -#: sql_help.c:3958 +#: sql_help.c:3976 msgid "remote_schema" msgstr "დáƒáƒ¨áƒáƒ áƒ”ბული_სქემáƒ" -#: sql_help.c:3961 +#: sql_help.c:3979 msgid "local_schema" msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜_სქემáƒ" -#: sql_help.c:3996 +#: sql_help.c:4014 msgid "conflict_target" msgstr "კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜áƒ¡_áƒáƒ‘იექტი" -#: sql_help.c:3997 +#: sql_help.c:4015 msgid "conflict_action" msgstr "ქმედებáƒ_კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ˜áƒ¡_დრáƒáƒ¡" -#: sql_help.c:4000 +#: sql_help.c:4018 msgid "where conflict_target can be one of:" msgstr "სáƒáƒ“áƒáƒª conflict_target შეიძლებრიყáƒáƒ¡ სიიდáƒáƒœ:" -#: sql_help.c:4001 +#: sql_help.c:4019 msgid "index_column_name" msgstr "ინდექსის_სვეტის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:4002 +#: sql_help.c:4020 msgid "index_expression" msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის_ინდექსი" -#: sql_help.c:4005 +#: sql_help.c:4023 msgid "index_predicate" msgstr "ინდექსის_პრედიკáƒáƒ¢áƒ˜" -#: sql_help.c:4007 +#: sql_help.c:4025 msgid "and conflict_action is one of:" msgstr "დრconflict_action შეიძლებრიყáƒáƒ¡ სიიდáƒáƒœ:" -#: sql_help.c:4013 sql_help.c:4941 +#: sql_help.c:4031 sql_help.c:4132 sql_help.c:4972 msgid "sub-SELECT" msgstr "ქვე-SELECT" -#: sql_help.c:4022 sql_help.c:4144 sql_help.c:4917 +#: sql_help.c:4040 sql_help.c:4173 sql_help.c:4948 msgid "channel" msgstr "áƒáƒ áƒ®áƒ˜" -#: sql_help.c:4044 +#: sql_help.c:4062 msgid "lockmode" msgstr "ბლáƒáƒ™áƒ˜áƒ¡_რეჟიმი" -#: sql_help.c:4045 +#: sql_help.c:4063 msgid "where lockmode is one of:" msgstr "სáƒáƒ“áƒáƒª lockmode ერთერთირსიიდáƒáƒœ:" -#: sql_help.c:4081 +#: sql_help.c:4103 msgid "target_table_name" msgstr "სáƒáƒ›áƒ˜áƒ–ნე ცხრილის სáƒáƒ®áƒ”ლი" -#: sql_help.c:4082 +#: sql_help.c:4104 msgid "target_alias" msgstr "სáƒáƒ›áƒ˜áƒ–ნე_მეტსáƒáƒ®áƒ”ლი" -#: sql_help.c:4083 +#: sql_help.c:4105 msgid "data_source" msgstr "მáƒáƒœáƒáƒªáƒ”მების_წყáƒáƒ áƒ" -#: sql_help.c:4084 sql_help.c:4612 sql_help.c:4869 sql_help.c:5115 +#: sql_help.c:4106 sql_help.c:4641 sql_help.c:4899 sql_help.c:5144 msgid "join_condition" msgstr "შეერთების პირáƒáƒ‘áƒ" -#: sql_help.c:4085 +#: sql_help.c:4107 msgid "when_clause" msgstr "პირáƒáƒ‘áƒ_რáƒáƒ“ის" -#: sql_help.c:4086 +#: sql_help.c:4110 msgid "where data_source is:" msgstr "სáƒáƒ“áƒáƒª data_source áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:4087 +#: sql_help.c:4111 msgid "source_table_name" msgstr "წყáƒáƒ áƒáƒ¡_ცხრილის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:4088 +#: sql_help.c:4112 msgid "source_query" msgstr "წყáƒáƒ áƒáƒ¡_მáƒáƒ—ხáƒáƒ•ნáƒ" -#: sql_help.c:4089 +#: sql_help.c:4113 msgid "source_alias" msgstr "წყáƒáƒ áƒáƒ¡_მეტსáƒáƒ®áƒ”ლი" -#: sql_help.c:4090 +#: sql_help.c:4114 msgid "and when_clause is:" msgstr "დრwhen_clause áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:4092 +#: sql_help.c:4116 sql_help.c:4119 msgid "merge_update" msgstr "გáƒáƒœáƒáƒ®áƒšáƒ”ბის_შერწყმáƒ" -#: sql_help.c:4093 +#: sql_help.c:4117 sql_help.c:4120 msgid "merge_delete" -msgstr "წáƒáƒ¨áƒšáƒ˜áƒ¡_შერწყმáƒ" +msgstr "merge_delete" -#: sql_help.c:4095 +#: sql_help.c:4122 msgid "merge_insert" msgstr "ჩáƒáƒ¡áƒ›áƒ˜áƒ¡_შერწყმáƒ" -#: sql_help.c:4096 +#: sql_help.c:4123 msgid "and merge_insert is:" msgstr "დრmerge_insert áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:4099 +#: sql_help.c:4126 msgid "and merge_update is:" msgstr "დრmerge_update áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:4104 +#: sql_help.c:4133 msgid "and merge_delete is:" msgstr "დრmerge_delete áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:4145 +#: sql_help.c:4174 msgid "payload" msgstr "შემცველáƒáƒ‘áƒ" -#: sql_help.c:4172 +#: sql_help.c:4201 msgid "old_role" msgstr "ძველი_რáƒáƒšáƒ˜" -#: sql_help.c:4173 +#: sql_help.c:4202 msgid "new_role" msgstr "áƒáƒ®áƒáƒšáƒ˜_რáƒáƒšáƒ˜" -#: sql_help.c:4212 sql_help.c:4421 sql_help.c:4429 +#: sql_help.c:4241 sql_help.c:4450 sql_help.c:4458 msgid "savepoint_name" msgstr "შენáƒáƒ®áƒ•ის_წერტილის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:4569 sql_help.c:4627 sql_help.c:4826 sql_help.c:4884 -#: sql_help.c:5072 sql_help.c:5130 +#: sql_help.c:4598 sql_help.c:4656 sql_help.c:4856 sql_help.c:4914 +#: sql_help.c:5101 sql_help.c:5159 msgid "grouping_element" msgstr "დáƒáƒ¯áƒ’უფების_ელემენტი" -#: sql_help.c:4571 sql_help.c:4674 sql_help.c:4828 sql_help.c:5074 +#: sql_help.c:4600 sql_help.c:4704 sql_help.c:4858 sql_help.c:5103 msgid "window_name" msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი" -#: sql_help.c:4572 sql_help.c:4675 sql_help.c:4829 sql_help.c:5075 +#: sql_help.c:4601 sql_help.c:4705 sql_help.c:4859 sql_help.c:5104 msgid "window_definition" msgstr "ფáƒáƒœáƒ¯áƒ áƒ˜áƒ¡_áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:4573 sql_help.c:4587 sql_help.c:4631 sql_help.c:4676 -#: sql_help.c:4830 sql_help.c:4844 sql_help.c:4888 sql_help.c:5076 -#: sql_help.c:5090 sql_help.c:5134 +#: sql_help.c:4602 sql_help.c:4616 sql_help.c:4660 sql_help.c:4706 +#: sql_help.c:4860 sql_help.c:4874 sql_help.c:4918 sql_help.c:5105 +#: sql_help.c:5119 sql_help.c:5163 msgid "select" msgstr "áƒáƒ áƒ©áƒ”ვáƒ" -#: sql_help.c:4580 sql_help.c:4837 sql_help.c:5083 +#: sql_help.c:4608 sql_help.c:4866 sql_help.c:5111 +msgid "from_reference" +msgstr "from_reference" + +#: sql_help.c:4609 sql_help.c:4867 sql_help.c:5112 msgid "where from_item can be one of:" msgstr "სáƒáƒ“áƒáƒª from_item შეიძლებრიყáƒáƒ¡ სიიდáƒáƒœ ერთი:" -#: sql_help.c:4583 sql_help.c:4589 sql_help.c:4592 sql_help.c:4596 -#: sql_help.c:4608 sql_help.c:4840 sql_help.c:4846 sql_help.c:4849 -#: sql_help.c:4853 sql_help.c:4865 sql_help.c:5086 sql_help.c:5092 -#: sql_help.c:5095 sql_help.c:5099 sql_help.c:5111 +#: sql_help.c:4612 sql_help.c:4618 sql_help.c:4621 sql_help.c:4625 +#: sql_help.c:4637 sql_help.c:4870 sql_help.c:4876 sql_help.c:4879 +#: sql_help.c:4883 sql_help.c:4895 sql_help.c:5115 sql_help.c:5121 +#: sql_help.c:5124 sql_help.c:5128 sql_help.c:5140 msgid "column_alias" -msgstr "სვეტის_მეტსáƒáƒ®áƒ”ლი" +msgstr "column_alias" -#: sql_help.c:4584 sql_help.c:4841 sql_help.c:5087 +#: sql_help.c:4613 sql_help.c:4871 sql_help.c:5116 msgid "sampling_method" -msgstr "სემპლინგის_მეთáƒáƒ“ი" +msgstr "sampling_method" -#: sql_help.c:4586 sql_help.c:4843 sql_help.c:5089 +#: sql_help.c:4615 sql_help.c:4873 sql_help.c:5118 msgid "seed" msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ მნიშვნელáƒáƒ‘áƒ" -#: sql_help.c:4590 sql_help.c:4629 sql_help.c:4847 sql_help.c:4886 -#: sql_help.c:5093 sql_help.c:5132 +#: sql_help.c:4619 sql_help.c:4658 sql_help.c:4877 sql_help.c:4916 +#: sql_help.c:5122 sql_help.c:5161 msgid "with_query_name" msgstr "მáƒáƒ—ხáƒáƒ•ნის_სáƒáƒ®áƒ”ლით" -#: sql_help.c:4600 sql_help.c:4603 sql_help.c:4606 sql_help.c:4857 -#: sql_help.c:4860 sql_help.c:4863 sql_help.c:5103 sql_help.c:5106 -#: sql_help.c:5109 +#: sql_help.c:4629 sql_help.c:4632 sql_help.c:4635 sql_help.c:4887 +#: sql_help.c:4890 sql_help.c:4893 sql_help.c:5132 sql_help.c:5135 +#: sql_help.c:5138 msgid "column_definition" -msgstr "სვეტის_áƒáƒ¦áƒ¬áƒ”რáƒ" +msgstr "column_definition" -#: sql_help.c:4610 sql_help.c:4616 sql_help.c:4867 sql_help.c:4873 -#: sql_help.c:5113 sql_help.c:5119 +#: sql_help.c:4639 sql_help.c:4645 sql_help.c:4897 sql_help.c:4903 +#: sql_help.c:5142 sql_help.c:5148 msgid "join_type" msgstr "შეერთების_ტიპი" -#: sql_help.c:4613 sql_help.c:4870 sql_help.c:5116 +#: sql_help.c:4642 sql_help.c:4900 sql_help.c:5145 msgid "join_column" -msgstr "სვეტების შეერთებáƒ" +msgstr "join_column" -#: sql_help.c:4614 sql_help.c:4871 sql_help.c:5117 +#: sql_help.c:4643 sql_help.c:4901 sql_help.c:5146 msgid "join_using_alias" msgstr "მეტსáƒáƒ®áƒ”ლით_შეერთბáƒ" -#: sql_help.c:4620 sql_help.c:4877 sql_help.c:5123 +#: sql_help.c:4649 sql_help.c:4907 sql_help.c:5152 msgid "and grouping_element can be one of:" msgstr "დრgrouping_element შეძლებრიყáƒáƒ¡ სიიდáƒáƒœ ერთი:" -#: sql_help.c:4628 sql_help.c:4885 sql_help.c:5131 +#: sql_help.c:4657 sql_help.c:4915 sql_help.c:5160 msgid "and with_query is:" msgstr "დრwith_query áƒáƒ áƒ˜áƒ¡:" -#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135 +#: sql_help.c:4661 sql_help.c:4919 sql_help.c:5164 msgid "values" msgstr "მნიშვნელáƒáƒ‘ები" -#: sql_help.c:4633 sql_help.c:4890 sql_help.c:5136 +#: sql_help.c:4662 sql_help.c:4920 sql_help.c:5165 msgid "insert" msgstr "ჩáƒáƒ¡áƒ›áƒ" -#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137 +#: sql_help.c:4663 sql_help.c:4921 sql_help.c:5166 msgid "update" msgstr "გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ" -#: sql_help.c:4635 sql_help.c:4892 sql_help.c:5138 +#: sql_help.c:4664 sql_help.c:4922 sql_help.c:5167 msgid "delete" -msgstr "წáƒáƒ¨áƒšáƒ" +msgstr "delete" + +#: sql_help.c:4665 sql_help.c:4923 sql_help.c:5168 +msgid "merge" +msgstr "შერწყმáƒ" -#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140 +#: sql_help.c:4667 sql_help.c:4925 sql_help.c:5170 msgid "search_seq_col_name" msgstr "ბáƒáƒšáƒ_ძებნის_სვეტის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142 +#: sql_help.c:4669 sql_help.c:4927 sql_help.c:5172 msgid "cycle_mark_col_name" msgstr "ციკლის_ნიშნიáƒáƒœáƒ˜_სვეტის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:4640 sql_help.c:4897 sql_help.c:5143 +#: sql_help.c:4670 sql_help.c:4928 sql_help.c:5173 msgid "cycle_mark_value" msgstr "ციკლის ნიშნის მნიშვნელáƒáƒ‘áƒ" -#: sql_help.c:4641 sql_help.c:4898 sql_help.c:5144 +#: sql_help.c:4671 sql_help.c:4929 sql_help.c:5174 msgid "cycle_mark_default" msgstr "ციკლის_ნáƒáƒ’ულისხმები_ნიშáƒáƒœáƒ˜" -#: sql_help.c:4642 sql_help.c:4899 sql_help.c:5145 +#: sql_help.c:4672 sql_help.c:4930 sql_help.c:5175 msgid "cycle_path_col_name" msgstr "ციკლის_ბილიკის_სვეტის_სáƒáƒ®áƒ”ლი" -#: sql_help.c:4669 +#: sql_help.c:4699 msgid "new_table" msgstr "áƒáƒ®áƒáƒšáƒ˜_ცხრილის" -#: sql_help.c:4740 +#: sql_help.c:4770 msgid "snapshot_id" -msgstr "სწრáƒáƒ¤áƒ˜_áƒáƒ¡áƒšáƒ˜áƒ¡_id" +msgstr "snapshot_id" -#: sql_help.c:5008 +#: sql_help.c:5037 msgid "sort_expression" msgstr "დáƒáƒšáƒáƒ’ების_გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ" -#: sql_help.c:5152 sql_help.c:6136 +#: sql_help.c:5182 sql_help.c:6166 msgid "abort the current transaction" msgstr "მიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ" -#: sql_help.c:5158 +#: sql_help.c:5188 msgid "change the definition of an aggregate function" msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციის áƒáƒ¦áƒ¬áƒ”რის შექმნáƒ" -#: sql_help.c:5164 +#: sql_help.c:5194 msgid "change the definition of a collation" msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5170 +#: sql_help.c:5200 msgid "change the definition of a conversion" msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5176 +#: sql_help.c:5206 msgid "change a database" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის შეცვლáƒ" -#: sql_help.c:5182 +#: sql_help.c:5212 msgid "define default access privileges" msgstr "წვდáƒáƒ›áƒ˜áƒ¡ ნáƒáƒ’ულისხმები უფლებების áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5188 +#: sql_help.c:5218 msgid "change the definition of a domain" msgstr "დáƒáƒ›áƒ”ნის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5194 +#: sql_help.c:5224 msgid "change the definition of an event trigger" msgstr "დáƒáƒ›áƒ”ნის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5200 +#: sql_help.c:5230 msgid "change the definition of an extension" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5206 +#: sql_help.c:5236 msgid "change the definition of a foreign-data wrapper" msgstr "გáƒáƒ áƒ”-მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5212 +#: sql_help.c:5242 msgid "change the definition of a foreign table" msgstr "გáƒáƒ áƒ” ცხრილის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5218 +#: sql_help.c:5248 msgid "change the definition of a function" msgstr "ფუნქციის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5224 +#: sql_help.c:5254 msgid "change role name or membership" msgstr "რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლის áƒáƒœ წევრáƒáƒ‘ის შეცვლáƒ" -#: sql_help.c:5230 +#: sql_help.c:5260 msgid "change the definition of an index" msgstr "ინდექსის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5236 +#: sql_help.c:5266 msgid "change the definition of a procedural language" msgstr "პრáƒáƒªáƒ”დურული ენის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5242 +#: sql_help.c:5272 msgid "change the definition of a large object" msgstr "დიდი áƒáƒ‘იექტის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5248 +#: sql_help.c:5278 msgid "change the definition of a materialized view" msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5254 +#: sql_help.c:5284 msgid "change the definition of an operator" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5260 +#: sql_help.c:5290 msgid "change the definition of an operator class" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5266 +#: sql_help.c:5296 msgid "change the definition of an operator family" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5272 +#: sql_help.c:5302 msgid "change the definition of a row-level security policy" msgstr "მწკრივის-დáƒáƒœáƒ˜áƒ¡-უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის წესების áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5278 +#: sql_help.c:5308 msgid "change the definition of a procedure" msgstr "პრáƒáƒªáƒ”დურის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5284 +#: sql_help.c:5314 msgid "change the definition of a publication" msgstr "გáƒáƒ›áƒáƒªáƒ”მის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5290 sql_help.c:5392 +#: sql_help.c:5320 sql_help.c:5422 msgid "change a database role" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის რáƒáƒšáƒ˜áƒ¡ შეცვლáƒ" -#: sql_help.c:5296 +#: sql_help.c:5326 msgid "change the definition of a routine" msgstr "ქვეპრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5302 +#: sql_help.c:5332 msgid "change the definition of a rule" msgstr "წესის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5308 +#: sql_help.c:5338 msgid "change the definition of a schema" msgstr "სქემის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5314 +#: sql_help.c:5344 msgid "change the definition of a sequence generator" msgstr "მიმდევრáƒáƒ‘ის გენერáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5320 +#: sql_help.c:5350 msgid "change the definition of a foreign server" msgstr "გáƒáƒ áƒ” სერვერის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5326 +#: sql_help.c:5356 msgid "change the definition of an extended statistics object" msgstr "სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული áƒáƒ‘იექტის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5332 +#: sql_help.c:5362 msgid "change the definition of a subscription" msgstr "გáƒáƒ›áƒáƒ¬áƒ”რის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5338 +#: sql_help.c:5368 msgid "change a server configuration parameter" msgstr "სერვერის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის შეცვლáƒ" -#: sql_help.c:5344 +#: sql_help.c:5374 msgid "change the definition of a table" msgstr "ცხრილის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5350 +#: sql_help.c:5380 msgid "change the definition of a tablespace" msgstr "ცხრილების სივრცის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5356 +#: sql_help.c:5386 msgid "change the definition of a text search configuration" msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5362 +#: sql_help.c:5392 msgid "change the definition of a text search dictionary" msgstr "ტექსტის ძებნის ლექსიკáƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5368 +#: sql_help.c:5398 msgid "change the definition of a text search parser" msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის áƒáƒ¦áƒ¬áƒ”რს შეცვლáƒ" -#: sql_help.c:5374 +#: sql_help.c:5404 msgid "change the definition of a text search template" msgstr "ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5380 +#: sql_help.c:5410 msgid "change the definition of a trigger" msgstr "ტრიგერის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5386 +#: sql_help.c:5416 msgid "change the definition of a type" msgstr "ტიპის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5398 +#: sql_help.c:5428 msgid "change the definition of a user mapping" msgstr "მáƒáƒ›áƒ®áƒáƒ áƒ”ბლის მიბმის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5404 +#: sql_help.c:5434 msgid "change the definition of a view" msgstr "ხედის áƒáƒ¦áƒ¬áƒ”რის შეცვლáƒ" -#: sql_help.c:5410 +#: sql_help.c:5440 msgid "collect statistics about a database" msgstr "მáƒáƒœáƒáƒªáƒ”მების სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ მáƒáƒ’რáƒáƒ•ებáƒ" -#: sql_help.c:5416 sql_help.c:6214 +#: sql_help.c:5446 sql_help.c:6244 msgid "start a transaction block" msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ბლáƒáƒ™áƒ˜áƒ¡ დáƒáƒ¬áƒ§áƒ”ბáƒ" -#: sql_help.c:5422 +#: sql_help.c:5452 msgid "invoke a procedure" msgstr "პრáƒáƒªáƒ”დურის ჩáƒáƒ¬áƒáƒ“ებáƒ" -#: sql_help.c:5428 +#: sql_help.c:5458 msgid "force a write-ahead log checkpoint" msgstr "წინáƒáƒ¡áƒ¬áƒáƒ -ჩáƒáƒ¬áƒ”რáƒáƒ“ ჟურნáƒáƒšáƒ¨áƒ˜ სáƒáƒ™áƒáƒœáƒ¢áƒ áƒáƒšáƒ წერტილის დáƒáƒ¡áƒ›áƒ" -#: sql_help.c:5434 +#: sql_help.c:5464 msgid "close a cursor" msgstr "კურსáƒáƒ áƒ˜áƒ¡ დáƒáƒ®áƒ£áƒ áƒ•áƒ" -#: sql_help.c:5440 +#: sql_help.c:5470 msgid "cluster a table according to an index" msgstr "ცხრილის გáƒáƒ“áƒáƒ¯áƒ’უფებრინდექსის მიხედვით" -#: sql_help.c:5446 +#: sql_help.c:5476 msgid "define or change the comment of an object" msgstr "áƒáƒ‘იექტის კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რრáƒáƒœ შეცვლáƒ" -#: sql_help.c:5452 sql_help.c:6010 +#: sql_help.c:5482 sql_help.c:6040 msgid "commit the current transaction" msgstr "მიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ“áƒáƒªáƒ”მáƒ" -#: sql_help.c:5458 +#: sql_help.c:5488 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "წინáƒáƒ¡áƒ¬áƒáƒ  áƒáƒ  ფáƒáƒ–áƒáƒ¨áƒ˜ გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მáƒáƒ“ მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ“áƒáƒªáƒ”მáƒ" -#: sql_help.c:5464 +#: sql_help.c:5494 msgid "copy data between a file and a table" msgstr "მáƒáƒœáƒáƒªáƒ”მების კáƒáƒžáƒ˜áƒ áƒ”ბრფáƒáƒ˜áƒšáƒ¡áƒ დრცხრილს შáƒáƒ áƒ˜áƒ¡" -#: sql_help.c:5470 +#: sql_help.c:5500 msgid "define a new access method" msgstr "წვდáƒáƒ›áƒ˜áƒ¡ áƒáƒ®áƒáƒšáƒ˜ მეთáƒáƒ“ის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5476 +#: sql_help.c:5506 msgid "define a new aggregate function" msgstr "áƒáƒ®áƒáƒšáƒ˜ áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5482 +#: sql_help.c:5512 msgid "define a new cast" msgstr "áƒáƒ®áƒáƒšáƒ˜ კáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5488 +#: sql_help.c:5518 msgid "define a new collation" msgstr "áƒáƒ®áƒáƒšáƒ˜ კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5494 +#: sql_help.c:5524 msgid "define a new encoding conversion" msgstr "კáƒáƒ“ირების áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5500 +#: sql_help.c:5530 msgid "create a new database" msgstr "áƒáƒ®áƒáƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის შექმნáƒ" -#: sql_help.c:5506 +#: sql_help.c:5536 msgid "define a new domain" msgstr "áƒáƒ®áƒáƒšáƒ˜ დáƒáƒ›áƒ”ნის შექმნáƒ" -#: sql_help.c:5512 +#: sql_help.c:5542 msgid "define a new event trigger" msgstr "მáƒáƒ•ლენის áƒáƒ®áƒáƒšáƒ˜ ტრიგერის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5518 +#: sql_help.c:5548 msgid "install an extension" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის დáƒáƒ§áƒ”ნებáƒ" -#: sql_help.c:5524 +#: sql_help.c:5554 msgid "define a new foreign-data wrapper" msgstr "გáƒáƒ áƒ” მáƒáƒœáƒáƒªáƒ”მების áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5530 +#: sql_help.c:5560 msgid "define a new foreign table" msgstr "მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ áƒ” ცხრილის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5536 +#: sql_help.c:5566 msgid "define a new function" msgstr "áƒáƒ®áƒáƒšáƒ˜ ფუნქციის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5542 sql_help.c:5602 sql_help.c:5704 +#: sql_help.c:5572 sql_help.c:5632 sql_help.c:5734 msgid "define a new database role" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5548 +#: sql_help.c:5578 msgid "define a new index" msgstr "áƒáƒ®áƒáƒšáƒ˜ ინდექსის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5554 +#: sql_help.c:5584 msgid "define a new procedural language" msgstr "áƒáƒ®áƒáƒšáƒ˜ პრáƒáƒªáƒ”დურული ენის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5560 +#: sql_help.c:5590 msgid "define a new materialized view" msgstr "áƒáƒ®áƒáƒšáƒ˜ მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5566 +#: sql_help.c:5596 msgid "define a new operator" msgstr "áƒáƒ®áƒáƒšáƒ˜ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5572 +#: sql_help.c:5602 msgid "define a new operator class" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ®áƒáƒšáƒ˜ კლáƒáƒ¡áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5578 +#: sql_help.c:5608 msgid "define a new operator family" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ®áƒáƒšáƒ˜ áƒáƒ¯áƒáƒ®áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5584 +#: sql_help.c:5614 msgid "define a new row-level security policy for a table" msgstr "ცხრილისთვის áƒáƒ®áƒáƒšáƒ˜ მწკრივის-დáƒáƒœáƒ˜áƒ¡-უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის წესის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5590 +#: sql_help.c:5620 msgid "define a new procedure" msgstr "áƒáƒ®áƒáƒšáƒ˜ პრáƒáƒªáƒ”დურის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5596 +#: sql_help.c:5626 msgid "define a new publication" msgstr "áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ›áƒáƒªáƒ”მის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5608 +#: sql_help.c:5638 msgid "define a new rewrite rule" msgstr "áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ“áƒáƒ¬áƒ”რის წესის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5614 +#: sql_help.c:5644 msgid "define a new schema" msgstr "áƒáƒ®áƒáƒšáƒ˜ სქემის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5620 +#: sql_help.c:5650 msgid "define a new sequence generator" msgstr "მიმდევრáƒáƒ‘ის áƒáƒ®áƒáƒšáƒ˜ გენერáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5626 +#: sql_help.c:5656 msgid "define a new foreign server" msgstr "áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ áƒ” სერვერის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5632 +#: sql_help.c:5662 msgid "define extended statistics" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5638 +#: sql_help.c:5668 msgid "define a new subscription" msgstr "áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ›áƒáƒ¬áƒ”რის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5644 +#: sql_help.c:5674 msgid "define a new table" msgstr "áƒáƒ®áƒáƒšáƒ˜ ცხრილის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5650 sql_help.c:6172 +#: sql_help.c:5680 sql_help.c:6202 msgid "define a new table from the results of a query" msgstr "მáƒáƒ—ხáƒáƒ•ნის შედეგებიდáƒáƒœ áƒáƒ®áƒáƒšáƒ˜ ცხრილის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5656 +#: sql_help.c:5686 msgid "define a new tablespace" msgstr "ცხრილების áƒáƒ®áƒáƒšáƒ˜ სივრცის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5662 +#: sql_help.c:5692 msgid "define a new text search configuration" msgstr "ტექსტის ძებნის áƒáƒ®áƒáƒšáƒ˜ კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5668 +#: sql_help.c:5698 msgid "define a new text search dictionary" msgstr "ტექსტის ძებნის áƒáƒ®áƒáƒš ლექსიკáƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5674 +#: sql_help.c:5704 msgid "define a new text search parser" msgstr "ტექსტის ძებნის áƒáƒ®áƒáƒšáƒ˜ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5680 +#: sql_help.c:5710 msgid "define a new text search template" msgstr "ტექსტის ძებნის áƒáƒ®áƒáƒšáƒ˜ შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5686 +#: sql_help.c:5716 msgid "define a new transform" msgstr "áƒáƒ®áƒáƒšáƒ˜ გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5692 +#: sql_help.c:5722 msgid "define a new trigger" msgstr "áƒáƒ®áƒáƒšáƒ˜ ტრიგერის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5698 +#: sql_help.c:5728 msgid "define a new data type" msgstr "მáƒáƒœáƒáƒªáƒ”მების áƒáƒ®áƒáƒšáƒ˜ ტიპის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5710 +#: sql_help.c:5740 msgid "define a new mapping of a user to a foreign server" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გáƒáƒ áƒ” სერვერთáƒáƒœ áƒáƒ®áƒáƒšáƒ˜ ბმის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5716 +#: sql_help.c:5746 msgid "define a new view" msgstr "áƒáƒ®áƒáƒšáƒ˜ ხედის áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5722 +#: sql_help.c:5752 msgid "deallocate a prepared statement" msgstr "მáƒáƒ›áƒ–áƒáƒ“ებული áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ გáƒáƒ—áƒáƒ•ისუფლებáƒ" -#: sql_help.c:5728 +#: sql_help.c:5758 msgid "define a cursor" msgstr "კურსáƒáƒ áƒ˜áƒ¡ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:5734 +#: sql_help.c:5764 msgid "delete rows of a table" msgstr "ცხრილში მწკრივების წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5740 +#: sql_help.c:5770 msgid "discard session state" msgstr "სესიის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘ის მáƒáƒ¨áƒáƒ áƒ”ბáƒ" -#: sql_help.c:5746 +#: sql_help.c:5776 msgid "execute an anonymous code block" msgstr "კáƒáƒ“ის áƒáƒœáƒáƒœáƒ˜áƒ›áƒ£áƒ áƒ˜ ბლáƒáƒ™áƒ˜áƒ¡ შესრულებáƒ" -#: sql_help.c:5752 +#: sql_help.c:5782 msgid "remove an access method" msgstr "წვდáƒáƒ›áƒ˜áƒ¡ მეთáƒáƒ“ის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5758 +#: sql_help.c:5788 msgid "remove an aggregate function" msgstr "áƒáƒ’რეგáƒáƒ¢áƒ£áƒšáƒ˜ ფუნქციის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5764 +#: sql_help.c:5794 msgid "remove a cast" msgstr "კáƒáƒ¡áƒ¢áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5770 +#: sql_help.c:5800 msgid "remove a collation" msgstr "კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5776 +#: sql_help.c:5806 msgid "remove a conversion" msgstr "გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5782 +#: sql_help.c:5812 msgid "remove a database" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5788 +#: sql_help.c:5818 msgid "remove a domain" msgstr "დáƒáƒ›áƒ”ნის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5794 +#: sql_help.c:5824 msgid "remove an event trigger" msgstr "მáƒáƒ•ლენის ტრიგერის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5800 +#: sql_help.c:5830 msgid "remove an extension" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5806 +#: sql_help.c:5836 msgid "remove a foreign-data wrapper" msgstr "გáƒáƒ áƒ”-მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ“áƒáƒ›áƒ¢áƒáƒœáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5812 +#: sql_help.c:5842 msgid "remove a foreign table" msgstr "გáƒáƒ áƒ” ცხრილის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5818 +#: sql_help.c:5848 msgid "remove a function" msgstr "ფუნქციის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5824 sql_help.c:5890 sql_help.c:5992 +#: sql_help.c:5854 sql_help.c:5920 sql_help.c:6022 msgid "remove a database role" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის რáƒáƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5830 +#: sql_help.c:5860 msgid "remove an index" msgstr "ინდექსის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5836 +#: sql_help.c:5866 msgid "remove a procedural language" msgstr "პრáƒáƒªáƒ”დურული ენის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5842 +#: sql_help.c:5872 msgid "remove a materialized view" msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5848 +#: sql_help.c:5878 msgid "remove an operator" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5854 +#: sql_help.c:5884 msgid "remove an operator class" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ კლáƒáƒ¡áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5860 +#: sql_help.c:5890 msgid "remove an operator family" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ áƒáƒ¯áƒáƒ®áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5866 +#: sql_help.c:5896 msgid "remove database objects owned by a database role" msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის რáƒáƒšáƒ˜áƒ¡ მფლáƒáƒ‘ელáƒáƒ‘áƒáƒ¨áƒ˜ მყáƒáƒ¤áƒ˜ ბáƒáƒ–ის áƒáƒ‘იექტების წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5872 +#: sql_help.c:5902 msgid "remove a row-level security policy from a table" msgstr "ცხრილიდáƒáƒœ მწკრივის-დáƒáƒœáƒ˜áƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის წესის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5878 +#: sql_help.c:5908 msgid "remove a procedure" msgstr "პრáƒáƒªáƒ”დურის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5884 +#: sql_help.c:5914 msgid "remove a publication" msgstr "გáƒáƒ›áƒáƒªáƒ”მის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5896 +#: sql_help.c:5926 msgid "remove a routine" msgstr "წესრიგის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5902 +#: sql_help.c:5932 msgid "remove a rewrite rule" msgstr "გáƒáƒ“áƒáƒ¬áƒ”რის წესის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5908 +#: sql_help.c:5938 msgid "remove a schema" msgstr "სქემის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5914 +#: sql_help.c:5944 msgid "remove a sequence" msgstr "მიმდევრáƒáƒ‘ის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5920 +#: sql_help.c:5950 msgid "remove a foreign server descriptor" msgstr "გáƒáƒ áƒ” სერვერის დესკრიპტáƒáƒ áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5926 +#: sql_help.c:5956 msgid "remove extended statistics" msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5932 +#: sql_help.c:5962 msgid "remove a subscription" msgstr "გáƒáƒ›áƒáƒ¬áƒ”რის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5938 +#: sql_help.c:5968 msgid "remove a table" msgstr "ცხრილის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5944 +#: sql_help.c:5974 msgid "remove a tablespace" msgstr "ცხრილების სივრცის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5950 +#: sql_help.c:5980 msgid "remove a text search configuration" msgstr "ტექსტის ძებნის კáƒáƒœáƒ¤áƒ˜áƒ’ურáƒáƒªáƒ˜áƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5956 +#: sql_help.c:5986 msgid "remove a text search dictionary" msgstr "ტექსტის ძებნის ლექსიკáƒáƒœáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5962 +#: sql_help.c:5992 msgid "remove a text search parser" msgstr "ტექსტის ძებნის დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5968 +#: sql_help.c:5998 msgid "remove a text search template" msgstr "ტექსტის ძებნის შáƒáƒ‘ლáƒáƒœáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5974 +#: sql_help.c:6004 msgid "remove a transform" msgstr "გáƒáƒ áƒ“áƒáƒ¥áƒ›áƒœáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5980 +#: sql_help.c:6010 msgid "remove a trigger" msgstr "ტრიგერის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5986 +#: sql_help.c:6016 msgid "remove a data type" msgstr "მáƒáƒœáƒáƒªáƒ”მების ტიპის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:5998 +#: sql_help.c:6028 msgid "remove a user mapping for a foreign server" msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის გáƒáƒ áƒ” სერვერისთვის მიბმის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:6004 +#: sql_help.c:6034 msgid "remove a view" msgstr "ხედის წáƒáƒ¨áƒšáƒ" -#: sql_help.c:6016 +#: sql_help.c:6046 msgid "execute a prepared statement" msgstr "მზრáƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ შესრულებáƒ" -#: sql_help.c:6022 +#: sql_help.c:6052 msgid "show the execution plan of a statement" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ შესრულების გეგმის ჩვენებáƒ" -#: sql_help.c:6028 +#: sql_help.c:6058 msgid "retrieve rows from a query using a cursor" msgstr "კურსáƒáƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒ”ნებით მáƒáƒ—ხáƒáƒ•ნიდáƒáƒœ მწკრივების მიღებáƒ" -#: sql_help.c:6034 +#: sql_help.c:6064 msgid "define access privileges" msgstr "წვდáƒáƒ›áƒ˜áƒ¡ უფლებების áƒáƒ¦áƒ¬áƒ”რáƒ" -#: sql_help.c:6040 +#: sql_help.c:6070 msgid "import table definitions from a foreign server" msgstr "ცხრილის áƒáƒ¦áƒ¬áƒ”რების უცხრსერვერიდáƒáƒœ შემáƒáƒ¢áƒáƒœáƒ" -#: sql_help.c:6046 +#: sql_help.c:6076 msgid "create new rows in a table" msgstr "ცხრილში áƒáƒ®áƒáƒšáƒ˜ მწკრივების შექმნáƒ" -#: sql_help.c:6052 +#: sql_help.c:6082 msgid "listen for a notification" msgstr "შეტყáƒáƒ‘ინების მáƒáƒšáƒáƒ“ინი" -#: sql_help.c:6058 +#: sql_help.c:6088 msgid "load a shared library file" msgstr "გáƒáƒ–იáƒáƒ áƒ”ბული ბიბლიáƒáƒ—ეკის ფáƒáƒ˜áƒšáƒ˜áƒ¡ ჩáƒáƒ¢áƒ•ირთვáƒ" -#: sql_help.c:6064 +#: sql_help.c:6094 msgid "lock a table" msgstr "ცხრილის დáƒáƒ‘ლáƒáƒ™áƒ•áƒ" -#: sql_help.c:6070 +#: sql_help.c:6100 msgid "conditionally insert, update, or delete rows of a table" msgstr "ცხრილის მწკრივების ჩáƒáƒ¡áƒ›áƒ, გáƒáƒœáƒáƒ®áƒšáƒ”ბრáƒáƒœ წáƒáƒ¨áƒšáƒ პირáƒáƒ‘ის მიხედვით" -#: sql_help.c:6076 +#: sql_help.c:6106 msgid "position a cursor" msgstr "კურსáƒáƒ áƒ˜áƒ¡ მáƒáƒ—áƒáƒ•სებáƒ" -#: sql_help.c:6082 +#: sql_help.c:6112 msgid "generate a notification" msgstr "შეტყáƒáƒ‘ინების გენერáƒáƒªáƒ˜áƒ" -#: sql_help.c:6088 +#: sql_help.c:6118 msgid "prepare a statement for execution" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ გáƒáƒ¡áƒáƒ¨áƒ•ებáƒáƒ“ მáƒáƒ›áƒ–áƒáƒ“ებáƒ" -#: sql_help.c:6094 +#: sql_help.c:6124 msgid "prepare the current transaction for two-phase commit" msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ›áƒ–áƒáƒ“ებრáƒáƒ  ფáƒáƒ–áƒáƒ¨áƒ˜ გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მáƒáƒ“" -#: sql_help.c:6100 +#: sql_help.c:6130 msgid "change the ownership of database objects owned by a database role" msgstr "ბáƒáƒ–ის რáƒáƒšáƒ˜áƒ¡ მფლáƒáƒ‘ელáƒáƒ‘áƒáƒ¨áƒ˜ მყáƒáƒ¤áƒ˜ ბáƒáƒ–ის áƒáƒ‘იექტების მფლáƒáƒ‘ელის შეცვლáƒ" -#: sql_help.c:6106 +#: sql_help.c:6136 msgid "replace the contents of a materialized view" msgstr "მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული ხედის შემცველáƒáƒ‘ის ჩáƒáƒœáƒáƒªáƒ•ლებáƒ" -#: sql_help.c:6112 +#: sql_help.c:6142 msgid "rebuild indexes" msgstr "ინდექსების თáƒáƒ•იდáƒáƒœ áƒáƒ’ებáƒ" -#: sql_help.c:6118 +#: sql_help.c:6148 msgid "release a previously defined savepoint" msgstr "áƒáƒ“რე áƒáƒ¦áƒ¬áƒ”რილი შენáƒáƒ®áƒ•ის წერტილის მáƒáƒ®áƒ¡áƒœáƒ" -#: sql_help.c:6124 +#: sql_help.c:6154 msgid "restore the value of a run-time parameter to the default value" msgstr "გáƒáƒ¨áƒ•ების პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘ის სáƒáƒ¬áƒ§áƒ˜áƒ¡ მნიშვნელáƒáƒ‘áƒáƒ–ე áƒáƒ¦áƒ“გენáƒ" -#: sql_help.c:6130 +#: sql_help.c:6160 msgid "remove access privileges" msgstr "წვდáƒáƒ›áƒ˜áƒ¡ უფლებების წáƒáƒ¨áƒšáƒ" -#: sql_help.c:6142 +#: sql_help.c:6172 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "წინáƒáƒ¡áƒ¬áƒáƒ  áƒáƒ  ფáƒáƒ–áƒáƒ¨áƒ˜ გáƒáƒ“áƒáƒ¡áƒáƒªáƒ”მáƒáƒ“ მáƒáƒ›áƒ–áƒáƒ“ებული ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ£áƒ¥áƒ›áƒ”ბáƒ" -#: sql_help.c:6148 +#: sql_help.c:6178 msgid "roll back to a savepoint" msgstr "შენáƒáƒ®áƒ•ის წერტილზე დáƒáƒ‘რუნებáƒ" -#: sql_help.c:6154 +#: sql_help.c:6184 msgid "define a new savepoint within the current transaction" msgstr "áƒáƒ®áƒáƒšáƒ˜ შესáƒáƒœáƒáƒ®áƒ˜ წერტილის áƒáƒ¦áƒ¬áƒ”რრმიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒáƒ¨áƒ˜" -#: sql_help.c:6160 +#: sql_help.c:6190 msgid "define or change a security label applied to an object" msgstr "áƒáƒ‘იექტზე გáƒáƒ“áƒáƒ¢áƒáƒ áƒ”ბული უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის ჭდის áƒáƒ¦áƒ¬áƒ”რრáƒáƒœ შეცვლáƒ" -#: sql_help.c:6166 sql_help.c:6220 sql_help.c:6256 +#: sql_help.c:6196 sql_help.c:6250 sql_help.c:6286 msgid "retrieve rows from a table or view" msgstr "მწკრივის მიღებრცხრილიდáƒáƒœ áƒáƒœ ხედიდáƒáƒœ" -#: sql_help.c:6178 +#: sql_help.c:6208 msgid "change a run-time parameter" msgstr "გáƒáƒ¨áƒ•ების პáƒáƒ áƒáƒ›áƒ”ტრის შეცვლáƒ" -#: sql_help.c:6184 +#: sql_help.c:6214 msgid "set constraint check timing for the current transaction" msgstr "მიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ შეზღუდვის შემáƒáƒ¬áƒ›áƒ”ბის დრáƒáƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ" -#: sql_help.c:6190 +#: sql_help.c:6220 msgid "set the current user identifier of the current session" msgstr "მიმდინáƒáƒ áƒ” სესიის მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ" -#: sql_help.c:6196 +#: sql_help.c:6226 msgid "set the session user identifier and the current user identifier of the current session" msgstr "სესიის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡áƒ დრმიმდინáƒáƒ áƒ” სესიის მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ დáƒáƒ§áƒ”ნებáƒ" -#: sql_help.c:6202 +#: sql_help.c:6232 msgid "set the characteristics of the current transaction" msgstr "მიმდინáƒáƒ áƒ” ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ თვისებების დáƒáƒ§áƒ”ნებáƒ" -#: sql_help.c:6208 +#: sql_help.c:6238 msgid "show the value of a run-time parameter" msgstr "გáƒáƒ¨áƒ•ების პáƒáƒ áƒáƒ›áƒ”ტრის მნიშვნელáƒáƒ‘ის ჩვენებáƒ" -#: sql_help.c:6226 +#: sql_help.c:6256 msgid "empty a table or set of tables" msgstr "ცხრილის áƒáƒœ ცხრილების სეტის დáƒáƒªáƒáƒ áƒ˜áƒ”ლებáƒ" -#: sql_help.c:6232 +#: sql_help.c:6262 msgid "stop listening for a notification" msgstr "გáƒáƒ¤áƒ áƒ—ხილებების მáƒáƒ¡áƒ›áƒ”ნის შეწყვეტáƒ" -#: sql_help.c:6238 +#: sql_help.c:6268 msgid "update rows of a table" msgstr "ცხრილის მწკრივების გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ" -#: sql_help.c:6244 +#: sql_help.c:6274 msgid "garbage-collect and optionally analyze a database" msgstr "ნáƒáƒ’ვის-მáƒáƒ’რáƒáƒ•ებრდრბáƒáƒ–ის áƒáƒ áƒáƒ¡áƒáƒ•áƒáƒšáƒ“ებულრáƒáƒœáƒáƒšáƒ˜áƒ–ი" -#: sql_help.c:6250 +#: sql_help.c:6280 msgid "compute a set of rows" msgstr "მწკრივების სეტის გáƒáƒ›áƒáƒ—ვლáƒ" @@ -6505,7 +6579,7 @@ msgstr "ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜áƒ¡ დáƒáƒ›áƒáƒ¢ msgid "could not find own program executable" msgstr "სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ პრáƒáƒ’რáƒáƒ›áƒ˜áƒ¡ გáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ˜áƒ¡ პáƒáƒ•ნრშეუძლებელიáƒ" -#: tab-complete.c:6080 +#: tab-complete.c:6216 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6540,13 +6614,62 @@ msgstr "" "\"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒáƒ \"%s\"-სთვის\n" "შესáƒáƒ«áƒšáƒ მნიშვნელáƒáƒ‘ებიáƒ: %s." +#, c-format +#~ msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" +#~ msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი (ნáƒáƒ’ულისხმები: \"%s\")\n" + +#, c-format +#~ msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" +#~ msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი მისáƒáƒ”რთებელი ბáƒáƒ–ის სáƒáƒ®áƒ”ლი (ნáƒáƒ’ულისხმები: \"%s\")\n" + +#, c-format +#~ msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" +#~ msgstr " -h, --host=HOSTNAME მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე (ნáƒáƒ’ულისხმები: \"%s\")\n" + +#, c-format +#~ msgid " -p, --port=PORT database server port (default: \"%s\")\n" +#~ msgstr " -p, --port=PORT მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜ (ნáƒáƒ’ულისხმები: \"%s\")\n" + +#~ msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n" +#~ msgstr " \\watch [[i=]SEC] [c=N] მáƒáƒ—ხáƒáƒ•ნის ყáƒáƒ•ელ SEC წáƒáƒ›áƒ¨áƒ˜ ერთხელ გáƒáƒ¨áƒ•ებáƒ, N-ჯერ\n" + +#~ msgid " (inherited)" +#~ msgstr " (მემკვიდრეáƒáƒ‘ით)" + +#~ msgid " (local, inherited)" +#~ msgstr " (ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜, მემკვიდრეáƒáƒ‘ით)" + +#, c-format +#~ msgid "Expanded header width is 'column'.\n" +#~ msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული თáƒáƒ•სáƒáƒ áƒ—ის სიგáƒáƒœáƒ”რ'column'.\n" + +#, c-format +#~ msgid "Expanded header width is 'full'.\n" +#~ msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული თáƒáƒ•სáƒáƒ áƒ—ის სიგáƒáƒœáƒ”რ'full'.\n" + +#, c-format +#~ msgid "Expanded header width is 'page'.\n" +#~ msgstr "გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბული თáƒáƒ•სáƒáƒ áƒ—ის სიგáƒáƒœáƒ”რ'page'.\n" + +#~ msgid "ICU Locale" +#~ msgstr "ICU ენáƒ" + +#~ msgid "Not-null constraints:" +#~ msgstr "áƒáƒ áƒáƒœáƒ£áƒšáƒáƒ•áƒáƒœáƒ˜ შეზღუდვები:" + #~ msgid "Source code" #~ msgstr "სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ კáƒáƒ“ი" +#~ msgid "User set" +#~ msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი დáƒáƒ§áƒ”ნებულიáƒ" + #, c-format #~ msgid "\\watch cannot be used with COPY" #~ msgstr "\\watch -ს COPY-სთáƒáƒœ ერთáƒáƒ“ ვერ გáƒáƒ›áƒáƒ§áƒ”ნებთ" +#~ msgid "constraint" +#~ msgstr "შეზღუდვáƒ" + #, c-format #~ msgid "could not change directory to \"%s\": %m" #~ msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის %s-ზე შეცვლის შეცდáƒáƒ›áƒ: %m" @@ -6559,11 +6682,26 @@ msgstr "" #~ msgid "could not read symbolic link \"%s\": %m" #~ msgstr "სიმბáƒáƒšáƒ£áƒ áƒ˜ ბმის \"%s\" წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" +#~ msgid "local socket" +#~ msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ სáƒáƒ™áƒ”ტი" + +#~ msgid "mode" +#~ msgstr "mode" + +#~ msgid "partition_name1" +#~ msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი1" + +#~ msgid "partition_name2" +#~ msgstr "დáƒáƒœáƒáƒ§áƒáƒ¤áƒ˜áƒ¡_სáƒáƒ®áƒ”ლი2" + #~ msgid "text" #~ msgstr "ტექსტი" #~ msgid "timezone" #~ msgstr "დრáƒáƒ˜áƒ¡_სáƒáƒ áƒ¢áƒ§áƒ”ლი" +#~ msgid "where constraint is:" +#~ msgstr "სáƒáƒ“áƒáƒª constraint áƒáƒ áƒ˜áƒ¡:" + #~ msgid "where direction can be empty or one of:" #~ msgstr "სáƒáƒ“áƒáƒª direction შეიძლებრიყáƒáƒ¡ ცáƒáƒ áƒ˜áƒ”ლი, áƒáƒœ ერთ-ერთი სიიდáƒáƒœ::" diff --git a/src/bin/psql/po/ko.po b/src/bin/psql/po/ko.po index 3d3da974b68c9..6afbc04dd1dd5 100644 --- a/src/bin/psql/po/ko.po +++ b/src/bin/psql/po/ko.po @@ -3,10 +3,10 @@ # msgid "" msgstr "" -"Project-Id-Version: psql (PostgreSQL) 13\n" +"Project-Id-Version: psql (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-12 22:13+0000\n" -"PO-Revision-Date: 2020-10-27 14:28+0900\n" +"POT-Creation-Date: 2025-01-17 04:48+0000\n" +"PO-Revision-Date: 2025-01-16 17:32+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -15,69 +15,80 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "심ê°: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " -#: ../../common/exec.c:137 ../../common/exec.c:254 ../../common/exec.c:300 +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 #, c-format -msgid "could not identify current directory: %m" -msgstr "현재 디렉터리가 무엇ì¸ì§€ 모르겠ìŒ: %m" +msgid "hint: " +msgstr "힌트: " -#: ../../common/exec.c:156 +#: ../../common/exec.c:174 #, c-format -msgid "invalid binary \"%s\"" -msgstr "ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼: \"%s\"" +msgid "invalid binary \"%s\": %m" +msgstr "\"%s\" 파ì¼ì€ ìž˜ëª»ëœ ë°”ì´ë„ˆë¦¬ 파ì¼: %m" -#: ../../common/exec.c:206 +#: ../../common/exec.c:217 #, c-format -msgid "could not read binary \"%s\"" -msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ" +msgid "could not read binary \"%s\": %m" +msgstr "\"%s\" ë°”ì´ë„ˆë¦¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: ../../common/exec.c:214 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "실행할 \"%s\" íŒŒì¼ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: ../../common/exec.c:270 ../../common/exec.c:309 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "\"%s\" 경로를 절대경로로 바꿀 수 ì—†ìŒ: %m" + +#: ../../common/exec.c:382 copy.c:326 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "\"%s\" ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ: %m" + +#: ../../common/exec.c:394 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "\"%s\" ì´ë¦„ì˜ ë””ë ‰í„°ë¦¬ë¡œ ì´ë™í•  수 없습니다: %m" +msgid "could not read from command \"%s\": %m" +msgstr "\"%s\" 명령으로부터 ì½ì„ 수 ì—†ìŒ: %m" -#: ../../common/exec.c:287 +#: ../../common/exec.c:397 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "\"%s\" 심볼릭 ë§í¬ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" +msgid "no data was returned by command \"%s\"" +msgstr "\"%s\" 명령ì—서 아무 ë°ì´í„°ë„ 반환하지 않ìŒ" -#: ../../common/exec.c:410 +#: ../../common/exec.c:424 #, c-format -msgid "pclose failed: %m" -msgstr "pclose 실패: %m" +msgid "%s() failed: %m" +msgstr "%s() 실패: %m" -#: ../../common/exec.c:539 ../../common/exec.c:584 ../../common/exec.c:676 -#: command.c:1255 input.c:227 mainloop.c:81 mainloop.c:402 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: command.c:1372 command.c:3458 command.c:3507 command.c:3632 input.c:225 +#: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "메모리 부족" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "메모리 부족\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "null í¬ì¸í„°ë¥¼ 복제할 수 ì—†ìŒ(ë‚´ë¶€ 오류)\n" @@ -87,7 +98,7 @@ msgstr "null í¬ì¸í„°ë¥¼ 복제할 수 ì—†ìŒ(ë‚´ë¶€ 오류)\n" msgid "could not look up effective user ID %ld: %s" msgstr "UID %ld 해당하는 사용ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" -#: ../../common/username.c:45 command.c:559 +#: ../../common/username.c:45 command.c:616 msgid "user does not exist" msgstr "ì‚¬ìš©ìž ì—†ìŒ" @@ -96,118 +107,140 @@ msgstr "ì‚¬ìš©ìž ì—†ìŒ" msgid "user name lookup failure: error code %lu" msgstr "ì‚¬ìš©ìž ì´ë¦„ 찾기 실패: 오류번호 %lu" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "명령어를 ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "하위 프로세스가 %d 코드로 종료했ìŒ" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "0x%X ì˜ˆì™¸ì²˜ë¦¬ì— ì˜í•´ 하위 프로세스가 종료ë˜ì—ˆìŒ" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "하위 프로세스가 %d 신호를 받고 종료ë˜ì—ˆìŒ: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "하위 프로세스가 알 수 없는 ìƒíƒœ(%d)로 종료ë˜ì—ˆìŒ" -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "취소 요청 보냄\n" -#: ../../fe_utils/cancel.c:165 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "취소 요청 보내기 실패: " -#: ../../fe_utils/cancel.c:210 -#, c-format -msgid "Could not send cancel request: %s" -msgstr "취소 요청 보내기 실패: %s" - -#: ../../fe_utils/print.c:350 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%luê°œ í–‰)" -#: ../../fe_utils/print.c:3055 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "ì¸íŠ¸ëŸ½íŠ¸ë°œìƒ\n" -#: ../../fe_utils/print.c:3119 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "" +"Cannot print table contents: number of cells %lld is equal to or exceeds " +"maximum %lld.\n" +msgstr "í…Œì´ë¸” ë‚´ìš©ì„ ì¶œë ¥í•  수 ì—†ìŒ: %lldê°œ ì…€ 수가 ìµœëŒ€ê°’ì¸ %lldê°œ ì´ìƒìž„\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "í…Œì´ë¸” ë‚´ìš©ì— í—¤ë”를 추가할 수 ì—†ìŒ: ì—´ 수가 %d개를 초과했습니다.\n" -#: ../../fe_utils/print.c:3159 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "í…Œì´ë¸” ë‚´ìš©ì— ì…€ì„ ì¶”ê°€í•  수 ì—†ìŒ: ì´ ì…€ 수가 %d개를 초과했습니다.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "í…Œì´ë¸” ë‚´ìš©ì— ì…€ì„ ì¶”ê°€í•  수 ì—†ìŒ: ì´ ì…€ 수가 %lld개를 초과했습니다.\n" -#: ../../fe_utils/print.c:3414 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "ìž˜ëª»ëœ ì¶œë ¥ í˜•ì‹ (ë‚´ë¶€ 오류): %d" -#: ../../fe_utils/psqlscan.l:694 +#: ../../fe_utils/psqlscan.l:732 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "\"%s\" ë³€ìˆ˜ì˜ ìž¬ê·€ì  í™•ìž¥ì„ ê±´ë„ˆë›°ëŠ” 중" -#: command.c:224 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "쉘 ëª…ë ¹ì˜ ì¸ìžì— 줄바꿈 문ìžê°€ 있ìŒ: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "ë°ì´í„°ë² ì´ìФ ì´ë¦„ì— ì¤„ë°”ê¿ˆ 문ìžê°€ 있ìŒ: \"%s\"\n" + +#: ../../port/user.c:43 ../../port/user.c:79 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "UID %d 해당하는 로컬 사용ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" + +#: ../../port/user.c:48 ../../port/user.c:84 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "ID %d 로컬 ì‚¬ìš©ìž ì—†ìŒ" + +#: command.c:235 #, c-format msgid "invalid command \\%s" msgstr "ìž˜ëª»ëœ ëª…ë ¹: \\%s" -#: command.c:226 +#: command.c:237 #, c-format msgid "Try \\? for help." msgstr "ë„움ë§ì„ 보려면 \\?를 입력하십시오." -#: command.c:244 +#: command.c:255 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: \"%s\" 추가 ì¸ìžê°€ 무시ë˜ì—ˆìŒ" -#: command.c:296 +#: command.c:307 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "" "\\%s ëª…ë ¹ì€ ë¬´ì‹œí•¨; 현재 \\if 블ë¡ì„ 중지하려면, \\endif 명령ì´ë‚˜ Ctrl-C 키" "를 사용하세요." -#: command.c:557 +#: command.c:614 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "UID %ld 사용ìžì˜ 홈 디렉터리를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" -#: command.c:575 +#: command.c:633 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: \"%s\" 디렉터리로 ì´ë™í•  수 ì—†ìŒ: %m" -#: command.c:600 +#: command.c:657 #, c-format msgid "You are currently not connected to a database.\n" msgstr "현재 ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°ë˜ì–´ìžˆì§€ 않습니다.\n" -#: command.c:613 +#: command.c:667 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at " @@ -215,7 +248,7 @@ msgid "" msgstr "" "ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìФ=\"%s\", 사용ìž=\"%s\", 주소=\"%s\", í¬íЏ=\"%s\".\n" -#: command.c:616 +#: command.c:670 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at " @@ -223,7 +256,7 @@ msgid "" msgstr "" "ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìФ=\"%s\", 사용ìž=\"%s\", 소켓=\"%s\", í¬íЏ=\"%s\".\n" -#: command.c:622 +#: command.c:676 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address " @@ -232,7 +265,7 @@ msgstr "" "ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìФ=\"%s\", 사용ìž=\"%s\", 호스트=\"%s\" (주소=\"%s\"), í¬" "트=\"%s\".\n" -#: command.c:625 +#: command.c:679 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port " @@ -240,182 +273,209 @@ msgid "" msgstr "" "ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìФ=\"%s\", 사용ìž=\"%s\", 호스트=\"%s\", í¬íЏ=\"%s\".\n" -#: command.c:965 command.c:1061 command.c:2550 +#: command.c:1069 command.c:1170 command.c:2675 #, c-format msgid "no query buffer" msgstr "쿼리 버í¼ê°€ ì—†ìŒ" -#: command.c:998 command.c:5061 +#: command.c:1102 command.c:5776 #, c-format msgid "invalid line number: %s" msgstr "ìž˜ëª»ëœ ì¤„ 번호: %s" -#: command.c:1052 -#, c-format -msgid "The server (version %s) does not support editing function source." -msgstr "ì´ ì„œë²„(%s 버전)는 함수 소스 편집 ê¸°ëŠ¥ì„ ì œê³µí•˜ì§€ 않습니다." - -#: command.c:1055 -#, c-format -msgid "The server (version %s) does not support editing view definitions." -msgstr "ì´ ì„œë²„(%s 버전)는 ë·° ì •ì˜ íŽ¸ì§‘ ê¸°ëŠ¥ì„ ì œê³µí•˜ì§€ 않습니다." - -#: command.c:1137 +#: command.c:1248 msgid "No changes" msgstr "변경 ë‚´ìš© ì—†ìŒ" -#: command.c:1216 +#: command.c:1333 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: ìž˜ëª»ëœ ì¸ì½”딩 ì´ë¦„ ë˜ëŠ” 문ìžì…‹ 변환 프로시저 ì—†ìŒ" -#: command.c:1251 command.c:1992 command.c:3253 command.c:5163 common.c:174 -#: common.c:223 common.c:388 common.c:1237 common.c:1265 common.c:1373 -#: common.c:1480 common.c:1518 copy.c:488 copy.c:707 help.c:62 large_obj.c:157 -#: large_obj.c:192 large_obj.c:254 +#: command.c:1368 command.c:2157 command.c:3454 command.c:3652 command.c:5882 +#: common.c:221 common.c:270 common.c:440 common.c:1142 common.c:1160 +#: common.c:1228 common.c:1340 common.c:1378 common.c:1475 common.c:1541 +#: copy.c:486 copy.c:722 large_obj.c:157 large_obj.c:192 large_obj.c:254 +#: startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1258 +#: command.c:1375 msgid "There is no previous error." msgstr "ì´ì „ 오류가 없습니다." -#: command.c:1371 +#: command.c:1488 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: 오른쪽 괄호 빠졌ìŒ" -#: command.c:1548 command.c:1853 command.c:1867 command.c:1884 command.c:2044 -#: command.c:2281 command.c:2517 command.c:2557 +#: command.c:1572 command.c:1691 command.c:1995 command.c:2009 command.c:2028 +#: command.c:2196 command.c:2437 command.c:2642 command.c:2682 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: 필요한 ì¸ìžê°€ 빠졌ìŒ" -#: command.c:1679 +#: command.c:1822 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: \\else 구문 ë’¤ì— ì˜¬ 수 ì—†ìŒ" -#: command.c:1684 +#: command.c:1827 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: \\if 명령과 ì§ì´ 안맞ìŒ" -#: command.c:1748 +#: command.c:1891 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: \\else 명령 ë’¤ì— ì˜¬ 수 ì—†ìŒ" -#: command.c:1753 +#: command.c:1896 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: \\if 명령과 ì§ì´ 안맞ìŒ" -#: command.c:1793 +#: command.c:1936 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: \\if 명령과 ì§ì´ 안맞ìŒ" -#: command.c:1948 +#: command.c:2092 msgid "Query buffer is empty." msgstr "쿼리 버í¼ê°€ 비었ìŒ." -#: command.c:1970 -msgid "Enter new password: " -msgstr "새 암호를 입력하세요:" +#: command.c:2135 +#, c-format +msgid "Enter new password for user \"%s\": " +msgstr "\"%s\" 사용ìžì˜ 새 암호: " -#: command.c:1971 +#: command.c:2139 msgid "Enter it again: " msgstr "다시 입력해 주세요:" -#: command.c:1975 +#: command.c:2148 #, c-format msgid "Passwords didn't match." msgstr "암호가 서로 틀립니다." -#: command.c:2074 +#: command.c:2231 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: 변수 ê°’ì„ ì½ì„ 수 ì—†ìŒ" -#: command.c:2177 +#: command.c:2333 msgid "Query buffer reset (cleared)." msgstr "쿼리 ë²„í¼ ì´ˆê¸°í™” (비웠ìŒ)." -#: command.c:2199 +#: command.c:2355 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "명령내역(history)ì„ \"%s\" 파ì¼ì— 기ë¡í–ˆìŠµë‹ˆë‹¤.\n" -#: command.c:2286 +#: command.c:2442 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: OS 환경 변수 ì´ë¦„ì—는 \"=\" 문ìžê°€ 없어야 함" -#: command.c:2347 -#, c-format -msgid "The server (version %s) does not support showing function source." -msgstr "ì´ ì„œë²„(%s 버전)는 함수 소스 보기 ê¸°ëŠ¥ì„ ì œê³µí•˜ì§€ 않습니다." - -#: command.c:2350 -#, c-format -msgid "The server (version %s) does not support showing view definitions." -msgstr "ì´ ì„œë²„(%s 버전)는 ë·° ì •ì˜ ë³´ê¸° ê¸°ëŠ¥ì„ ì œê³µí•˜ì§€ 않습니다." - -#: command.c:2357 +#: command.c:2490 #, c-format msgid "function name is required" msgstr "함수 ì´ë¦„ì´ í•„ìš”í•¨" -#: command.c:2359 +#: command.c:2492 #, c-format msgid "view name is required" msgstr "ë·° ì´ë¦„ì´ í•„ìš”í•¨" -#: command.c:2489 +#: command.c:2614 msgid "Timing is on." msgstr "작업수행시간 ë³´ìž„" -#: command.c:2491 +#: command.c:2616 msgid "Timing is off." msgstr "작업수행시간 숨김" -#: command.c:2576 command.c:2604 command.c:3661 command.c:3664 command.c:3667 -#: command.c:3673 command.c:3675 command.c:3683 command.c:3693 command.c:3702 -#: command.c:3716 command.c:3733 command.c:3791 common.c:70 copy.c:331 -#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 +#: command.c:2702 command.c:2740 command.c:4163 command.c:4166 command.c:4169 +#: command.c:4175 command.c:4177 command.c:4203 command.c:4213 command.c:4225 +#: command.c:4239 command.c:4266 command.c:4324 common.c:77 copy.c:329 +#: copy.c:401 psqlscanslash.l:805 psqlscanslash.l:817 psqlscanslash.l:835 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:2988 startup.c:236 startup.c:287 +#: command.c:2729 copy.c:388 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: command.c:2801 command.c:2867 +#, c-format +msgid "\\watch: interval value is specified more than once" +msgstr "\\watch: 반복 간격 ê°’ì€ í•˜ë‚˜ë§Œ 지정해야 합니다" + +#: command.c:2811 command.c:2877 +#, c-format +msgid "\\watch: incorrect interval value \"%s\"" +msgstr "\\watch: ìž˜ëª»ëœ ë°˜ë³µ 간격 ê°’ \"%s\"" + +#: command.c:2821 +#, c-format +msgid "\\watch: iteration count is specified more than once" +msgstr "\\watch: 최대 반복 회수는 하나만 지정해야 합니다" + +#: command.c:2831 +#, c-format +msgid "\\watch: incorrect iteration count \"%s\"" +msgstr "\\watch: ìž˜ëª»ëœ ìµœëŒ€ 반복 회수 \"%s\"" + +#: command.c:2841 +#, c-format +msgid "\\watch: minimum row count specified more than once" +msgstr "\\watch: 최소 row 수 ì§€ì •ì„ ì¤‘ë³µ 지정했ìŒ" + +#: command.c:2851 +#, c-format +msgid "\\watch: incorrect minimum row count \"%s\"" +msgstr "\\watch: 최소 row 수 ê°’ ìž˜ëª»ë¨ \"%s\"" + +#: command.c:2858 +#, c-format +msgid "\\watch: unrecognized parameter \"%s\"" +msgstr "\\watch: 알수 없는 매개 변수 \"%s\"" + +#: command.c:3255 startup.c:243 startup.c:293 msgid "Password: " msgstr "암호: " -#: command.c:2993 startup.c:284 +#: command.c:3260 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "%s 사용ìžì˜ 암호: " -#: command.c:3064 +#: command.c:3316 #, c-format msgid "" -"All connection parameters must be supplied because no database connection " -"exists" -msgstr "현재 ì ‘ì† ì •ë³´ê°€ 없습니다. ì ‘ì†ì„ 위한 ì—°ê²° 관련 매개변수를 지정하세요" +"Do not give user, host, or port separately when using a connection string" +msgstr "" +"ì—°ê²° 문ìžì—´ì„ 사용할 때는 user, host, port 를 따로 따로 지정하지 마세요." + +#: command.c:3351 +#, c-format +msgid "No database connection exists to re-use parameters from" +msgstr "재접ì†í•  ë°ì´í„°ë² ì´ìФ ì—°ê²° ì •ë³´ê°€ ì—†ìŒ" -#: command.c:3257 +#: command.c:3658 #, c-format msgid "Previous connection kept" msgstr "ì´ì „ ì—°ê²°ì´ ìœ ì§€ë˜ì—ˆìŒ" -#: command.c:3261 +#: command.c:3664 #, c-format msgid "\\connect: %s" msgstr "\\ì—°ê²°: %s" -#: command.c:3310 +#: command.c:3720 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at " @@ -423,7 +483,7 @@ msgid "" msgstr "" "ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìФ=\"%s\", 사용ìž=\"%s\", 주소=\"%s\", í¬íЏ=\"%s\".\n" -#: command.c:3313 +#: command.c:3723 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" " @@ -431,16 +491,16 @@ msgid "" msgstr "" "ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìФ=\"%s\", 사용ìž=\"%s\", 소켓=\"%s\", í¬íЏ=\"%s\".\n" -#: command.c:3319 +#: command.c:3729 #, c-format msgid "" -"You are now connected to database \"%s\" as user \"%s\" on host \"%s" -"\" (address \"%s\") at port \"%s\".\n" +"You are now connected to database \"%s\" as user \"%s\" on host \"%s\" " +"(address \"%s\") at port \"%s\".\n" msgstr "" "ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìФ=\"%s\", 사용ìž=\"%s\", 호스트=\"%s\" (주소 \"%s\"), í¬" "트=\"%s\".\n" -#: command.c:3322 +#: command.c:3732 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at " @@ -448,17 +508,17 @@ msgid "" msgstr "" "ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìФ=\"%s\", 사용ìž=\"%s\", 호스트=\"%s\", í¬íЏ=\"%s\".\n" -#: command.c:3327 +#: command.c:3737 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "ì ‘ì†ì •ë³´: ë°ì´í„°ë² ì´ìФ=\"%s\", 사용ìž=\"%s\".\n" -#: command.c:3360 +#: command.c:3843 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s(%s, %s 서버)\n" -#: command.c:3368 +#: command.c:3856 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -467,29 +527,33 @@ msgstr "" "경고: %s ë©”ì´ì € 버전 %s, 서버 ë©”ì´ì € 버전 %s.\n" " ì¼ë¶€ psql ê¸°ëŠ¥ì´ ìž‘ë™í•˜ì§€ ì•Šì„ ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤.\n" -#: command.c:3407 +#: command.c:3895 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" -msgstr "SSL ì—°ê²°ì •ë³´ (프로토콜: %s, 암호화기법: %s, 비트: %s, ì••ì¶•: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s, ALPN: %s)\n" +msgstr "SSL ì—°ê²°ì •ë³´ (프로토콜: %s, 암호화기법: %s, ì••ì¶•: %s, ALPN: %s)\n" -#: command.c:3408 command.c:3409 command.c:3410 +#: command.c:3896 command.c:3897 msgid "unknown" msgstr "알수없ìŒ" -#: command.c:3411 help.c:45 +#: command.c:3898 help.c:42 msgid "off" msgstr "off" -#: command.c:3411 help.c:45 +#: command.c:3898 help.c:42 msgid "on" msgstr "on" -#: command.c:3425 +#: command.c:3899 +msgid "none" +msgstr "none" + +#: command.c:3913 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "ì•”í˜¸í™”ëœ GSSAPI ì—°ê²°\n" -#: command.c:3445 +#: command.c:3933 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -501,7 +565,7 @@ msgstr "" "참조\n" " 페ì´ì§€ \"Notes for Windows users\"를 참조하십시오.\n" -#: command.c:3549 +#: command.c:4038 #, c-format msgid "" "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a " @@ -510,32 +574,32 @@ msgstr "" "지정한 줄번호를 사용하기 위해서는 PSQL_EDITOR_LINENUMBER_ARG ì´ë¦„ì˜ OS 환경변" "수가 설정ë˜ì–´ 있어야 합니다." -#: command.c:3578 +#: command.c:4068 #, c-format msgid "could not start editor \"%s\"" msgstr "\"%s\" 문서 편집기를 실행시킬 수 ì—†ìŒ" -#: command.c:3580 +#: command.c:4070 #, c-format msgid "could not start /bin/sh" msgstr "/bin/sh ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ" -#: command.c:3618 +#: command.c:4120 #, c-format msgid "could not locate temporary directory: %s" msgstr "임시 디렉터리 경로를 알 수 ì—†ìŒ: %s" -#: command.c:3645 +#: command.c:4147 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "\"%s\" 임시 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: command.c:3950 +#: command.c:4483 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: \"%s\" ìƒëžµí˜•ì´ \"%s\" ë˜ëŠ” \"%s\" ê°’ ëª¨ë‘ ì„ íƒê°€ëŠ¥í•´ì„œ 모호함" -#: command.c:3970 +#: command.c:4503 #, c-format msgid "" "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-" @@ -544,32 +608,41 @@ msgstr "" "\\pset: 허용ë˜ëŠ” 출력 형ì‹: aligned, asciidoc, csv, html, latex, latex-" "longtable, troff-ms, unaligned, wrapped" -#: command.c:3989 +#: command.c:4522 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: 사용할 수 있는 ì„  ëª¨ì–‘ì€ ascii, old-ascii, unicode" -#: command.c:4004 +#: command.c:4537 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: 사용할 수 있는 유니코드 í…Œë‘리 ëª¨ì–‘ì€ single, double" -#: command.c:4019 +#: command.c:4552 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: 사용할 수 있는 유니코드 칼럼 ì„  ëª¨ì–‘ì€ single, double" -#: command.c:4034 +#: command.c:4567 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: 사용할 수 있는 유니코드 í—¤ë” ì„  ëª¨ì–‘ì€ single, double" -#: command.c:4077 +#: command.c:4619 +#, c-format +msgid "" +"\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", " +"or a number specifying the exact width" +msgstr "" +"\\pset: xheader_width ê°’ì€ \"%s\" (기본값), \"%s\", \"%s\", ë˜ëŠ” 정확한 너비 " +"ìˆ«ìž ìž…ë‹ˆë‹¤." + +#: command.c:4636 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep 문ìžëŠ” 1ë°”ì´íŠ¸ì˜ ë‹¨ì¼ ë¬¸ìžì—¬ì•¼ 함" -#: command.c:4082 +#: command.c:4641 #, c-format msgid "" "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage " @@ -577,198 +650,218 @@ msgid "" msgstr "" "\\pset: csv_fieldsep 문ìžë¡œ 따옴표, 줄바꿈(\\n, \\r) 문ìžëŠ” 사용할 수 ì—†ìŒ" -#: command.c:4219 command.c:4407 +#: command.c:4779 command.c:4980 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: 알 수 없는 옵션: %s" -#: command.c:4239 +#: command.c:4799 #, c-format msgid "Border style is %d.\n" msgstr "html í…Œì´ë¸”ì˜ í…Œë‘리를 %d로 지정했습니다.\n" -#: command.c:4245 +#: command.c:4805 #, c-format msgid "Target width is unset.\n" msgstr "ëŒ€ìƒ ë„ˆë¹„ 미지정.\n" -#: command.c:4247 +#: command.c:4807 #, c-format msgid "Target width is %d.\n" msgstr "ëŒ€ìƒ ë„ˆë¹„ëŠ” %d입니다.\n" -#: command.c:4254 +#: command.c:4814 #, c-format msgid "Expanded display is on.\n" msgstr "칼럼 단위 보기 기능 켬.\n" -#: command.c:4256 +#: command.c:4816 #, c-format msgid "Expanded display is used automatically.\n" msgstr "칼럼 단위 보기 ê¸°ëŠ¥ì„ ìžë™ìœ¼ë¡œ 지정 함.\n" -#: command.c:4258 +#: command.c:4818 #, c-format msgid "Expanded display is off.\n" msgstr "칼럼 단위 보기 기능 ë”.\n" -#: command.c:4264 +#: command.c:4825 command.c:4827 command.c:4829 +#, c-format +msgid "Expanded header width is \"%s\".\n" +msgstr "í™•ìž¥ëœ í—¤ë” ë„ˆë¹„ = \"%s\".\n" + +#: command.c:4831 +#, c-format +msgid "Expanded header width is %d.\n" +msgstr "í™•ìž¥ëœ í—¤ë” ë„ˆë¹„ëŠ” %d입니다.\n" + +#: command.c:4837 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "CSVìš© 필드 구분ìž: \"%s\".\n" -#: command.c:4272 command.c:4280 +#: command.c:4845 command.c:4853 #, c-format msgid "Field separator is zero byte.\n" msgstr "필드 구분ìžê°€ 0 ë°”ì´íŠ¸ìž…ë‹ˆë‹¤.\n" -#: command.c:4274 +#: command.c:4847 #, c-format msgid "Field separator is \"%s\".\n" msgstr "필드 êµ¬ë¶„ìž \"%s\".\n" -#: command.c:4287 +#: command.c:4860 #, c-format msgid "Default footer is on.\n" msgstr "기본 ê¼¬ë¦¿ë§ ë³´ê¸° 기능 켬.\n" -#: command.c:4289 +#: command.c:4862 #, c-format msgid "Default footer is off.\n" msgstr "기본 ê¼¬ë¦¿ë§ ë³´ê¸° 기능 ë”.\n" -#: command.c:4295 +#: command.c:4868 #, c-format msgid "Output format is %s.\n" msgstr "현재 출력 형ì‹: %s.\n" -#: command.c:4301 +#: command.c:4874 #, c-format msgid "Line style is %s.\n" msgstr "ì„  모양: %s.\n" -#: command.c:4308 +#: command.c:4881 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null ê°’ì€ \"%s\" 문ìžë¡œ ë³´ì—¬ì§.\n" -#: command.c:4316 +#: command.c:4889 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "ë¡œì¼€ì¼ ë§žì¶¤ ìˆ«ìž í‘œê¸° 기능 켬.\n" -#: command.c:4318 +#: command.c:4891 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "ë¡œì¼€ì¼ ë§žì¶¤ ìˆ«ìž í‘œê¸° 기능 ë”.\n" -#: command.c:4325 +#: command.c:4898 #, c-format msgid "Pager is used for long output.\n" msgstr "긴 ì¶œë ¥ì„ ìœ„í•´ 페ì´ì €ê°€ 사용ë¨.\n" -#: command.c:4327 +#: command.c:4900 #, c-format msgid "Pager is always used.\n" msgstr "í•­ìƒ íŽ˜ì´ì €ê°€ 사용ë¨.\n" -#: command.c:4329 +#: command.c:4902 #, c-format msgid "Pager usage is off.\n" msgstr "화면단위 보기 기능 ë”(ì „ì²´ ìžë£Œ ëª¨ë‘ ë³´ì—¬ì¤Œ).\n" -#: command.c:4335 +#: command.c:4908 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "%d 줄보다 ì ì€ 경우는 페ì´ì§€ 단위 보기가 사용ë˜ì§€ 않ìŒ\n" -#: command.c:4345 command.c:4355 +#: command.c:4918 command.c:4928 #, c-format msgid "Record separator is zero byte.\n" msgstr "레코드 구분ìžê°€ 0 ë°”ì´íŠ¸ìž„.\n" -#: command.c:4347 +#: command.c:4920 #, c-format msgid "Record separator is .\n" msgstr "레코드 구분ìžëŠ” 줄바꿈 문ìžìž…니다.\n" -#: command.c:4349 +#: command.c:4922 #, c-format msgid "Record separator is \"%s\".\n" msgstr "레코드 êµ¬ë¶„ìž \"%s\".\n" -#: command.c:4362 +#: command.c:4935 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "í…Œì´ë¸” ì†ì„±: \"%s\".\n" -#: command.c:4365 +#: command.c:4938 #, c-format msgid "Table attributes unset.\n" msgstr "í…Œì´ë¸” ì†ì„± ëª¨ë‘ ì§€ì›€.\n" -#: command.c:4372 +#: command.c:4945 #, c-format msgid "Title is \"%s\".\n" msgstr "출력 í…Œì´ë¸”ì˜ ì œëª©: \"%s\"\n" -#: command.c:4374 +#: command.c:4947 #, c-format msgid "Title is unset.\n" msgstr "출력 í…Œì´ë¸”ì˜ ì œëª©ì„ ì§€ì •í•˜ì§€ 않았습니다.\n" -#: command.c:4381 +#: command.c:4954 #, c-format msgid "Tuples only is on.\n" msgstr "ìžë£Œë§Œ 보기 기능 켬.\n" -#: command.c:4383 +#: command.c:4956 #, c-format msgid "Tuples only is off.\n" msgstr "ìžë£Œë§Œ 보기 기능 ë”.\n" -#: command.c:4389 +#: command.c:4962 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "유니코드 í…Œë‘리 선문ìž: \"%s\".\n" -#: command.c:4395 +#: command.c:4968 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "유니코드 칼럼 선문ìž: \"%s\".\n" -#: command.c:4401 +#: command.c:4974 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "유니코드 í—¤ë” ì„ ë¬¸ìž: \"%s\".\n" -#: command.c:4634 +#: command.c:5223 #, c-format msgid "\\!: failed" msgstr "\\!: 실패" -#: command.c:4659 common.c:648 +#: command.c:5261 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch 명령으로 수행할 쿼리가 없습니다." -#: command.c:4700 +#: command.c:5293 +#, c-format +msgid "could not set timer: %m" +msgstr "타ì´ë¨¸ 설정 실패: %m" + +#: command.c:5362 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (%gì´ˆ 간격)\n" -#: command.c:4703 +#: command.c:5365 #, c-format msgid "%s (every %gs)\n" msgstr "%s (%gì´ˆ 간격)\n" -#: command.c:4757 command.c:4764 common.c:548 common.c:555 common.c:1220 +#: command.c:5429 +#, c-format +msgid "could not wait for signals: %m" +msgstr "신호를 기다릴 수 없었ìŒ: %m" + +#: command.c:5485 command.c:5492 common.c:632 common.c:639 common.c:1123 #, c-format msgid "" -"********* QUERY **********\n" +"/******** QUERY *********/\n" "%s\n" -"**************************\n" +"/************************/\n" "\n" msgstr "" "********** 쿼리 **********\n" @@ -776,160 +869,154 @@ msgstr "" "**************************\n" "\n" -#: command.c:4956 +#: command.c:5671 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" ë·°(view)ê°€ 아님" -#: command.c:4972 +#: command.c:5687 #, c-format msgid "could not parse reloptions array" msgstr "reloptions ë°°ì—´ì„ ë¶„ì„í•  수 ì—†ìŒ" -#: common.c:159 +#: common.c:206 #, c-format msgid "cannot escape without active connection" msgstr "현재 ì ‘ì†í•œ ì—°ê²° ì—†ì´ëŠ” 특수문ìžì²˜ë¦¬ë¥¼ í•  수 ì—†ìŒ" -#: common.c:200 +#: common.c:247 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "쉘 ëª…ë ¹ì˜ ì¸ìžì— 줄바꿈 문ìžê°€ 있ìŒ: \"%s\"" -#: common.c:304 +#: common.c:351 #, c-format msgid "connection to server was lost" msgstr "서버 ì ‘ì† ëŠê¹€" -#: common.c:308 +#: common.c:355 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "서버로부터 ì—°ê²°ì´ ëŠì–´ì¡ŒìŠµë‹ˆë‹¤. 다시 ì—°ê²°ì„ ì‹œë„합니다: " -#: common.c:313 +#: common.c:360 #, c-format msgid "Failed.\n" msgstr "실패.\n" -#: common.c:326 +#: common.c:377 #, c-format msgid "Succeeded.\n" msgstr "성공.\n" -#: common.c:378 common.c:938 common.c:1155 +#: common.c:430 common.c:1061 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "PQresultStatus ë°˜í™˜ê°’ì´ ìž˜ëª»ë¨: %d" -#: common.c:487 +#: common.c:571 #, c-format msgid "Time: %.3f ms\n" msgstr "작업시간: %.3f ms\n" -#: common.c:502 +#: common.c:586 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "작업시간: %.3f ms (%02d:%06.3f)\n" -#: common.c:511 +#: common.c:595 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "작업시간: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:518 +#: common.c:602 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "작업시간: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:542 common.c:600 common.c:1191 +#: common.c:626 common.c:683 common.c:1094 describe.c:6192 #, c-format msgid "You are currently not connected to a database." msgstr "현재 ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²°ë˜ì–´ìžˆì§€ 않습니다." -#: common.c:655 -#, c-format -msgid "\\watch cannot be used with COPY" -msgstr "\\watch 작업으로 COPY ëª…ë ¹ì€ ì‚¬ìš©í•  수 ì—†ìŒ" - -#: common.c:660 -#, c-format -msgid "unexpected result status for \\watch" -msgstr "\\watch 쿼리 결과가 비정ìƒì ìž…니다." - -#: common.c:690 +#: common.c:714 #, c-format msgid "" "Asynchronous notification \"%s\" with payload \"%s\" received from server " "process with PID %d.\n" msgstr "\"%s\" 비ë™ê¸° 통지를 ë°›ìŒ, 부가정보: \"%s\", 보낸 프로세스: %d.\n" -#: common.c:693 +#: common.c:717 #, c-format msgid "" "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "ë™ê¸°í™” 신호 \"%s\" ë°›ìŒ, 해당 서버 프로세스 PID %d.\n" -#: common.c:726 common.c:743 +#: common.c:748 #, c-format msgid "could not print result table: %m" msgstr "ê²°ê³¼ í…Œì´ë¸”ì„ ì¶œë ¥í•  수 ì—†ìŒ: %m" -#: common.c:764 +#: common.c:768 #, c-format msgid "no rows returned for \\gset" msgstr "\\gset 해당 ìžë£Œ ì—†ìŒ" -#: common.c:769 +#: common.c:773 #, c-format msgid "more than one row returned for \\gset" msgstr "\\gset 실행 결과가 ë‹¨ì¼ ìžë£Œê°€ 아님" -#: common.c:1200 +#: common.c:791 +#, c-format +msgid "attempt to \\gset into specially treated variable \"%s\" ignored" +msgstr "" +"\\gset 작업으로 특수하게 처리ë˜ëŠ” ë³€ìˆ˜ì¸ \"%s\" ë³€ìˆ˜ê°’ì„ ë°”ê¿€ 수 있어 무시함" + +#: common.c:1103 #, c-format msgid "" -"***(Single step mode: verify " -"command)*******************************************\n" +"/**(Single step mode: verify " +"command)******************************************/\n" "%s\n" -"***(press return to proceed or enter x and return to " -"cancel)********************\n" +"/**(press return to proceed or enter x and return to " +"cancel)*******************/\n" msgstr "" "***(ë‹¨ë… ìˆœì°¨ 모드: 쿼리 확ì¸)*********************************************\n" "%s\n" "***(Enter: ê³„ì† ì§„í–‰, x Enter: 중지)********************\n" -#: common.c:1255 -#, c-format -msgid "" -"The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK." -msgstr "" -"서버(%s 버전)ì—서 ON_ERROR_ROLLBACKì— ì‚¬ìš©í•  savepoint를 ì§€ì›í•˜ì§€ 않습니다." - -#: common.c:1318 +#: common.c:1180 #, c-format msgid "STATEMENT: %s" msgstr "명령구문: %s" -#: common.c:1361 +#: common.c:1216 #, c-format msgid "unexpected transaction status (%d)" msgstr "알 수 없는 트랜잭션 ìƒíƒœ (%d)" -#: common.c:1502 describe.c:2001 +#: common.c:1362 describe.c:2025 msgid "Column" msgstr "필드명" -#: common.c:1503 describe.c:177 describe.c:393 describe.c:411 describe.c:456 -#: describe.c:473 describe.c:962 describe.c:1126 describe.c:1711 -#: describe.c:1735 describe.c:2002 describe.c:3729 describe.c:3939 -#: describe.c:4172 describe.c:5378 +#: common.c:1363 describe.c:169 describe.c:355 describe.c:373 describe.c:1043 +#: describe.c:1201 describe.c:1731 describe.c:1755 describe.c:2026 +#: describe.c:3956 describe.c:4167 describe.c:4404 describe.c:4564 +#: describe.c:5829 msgid "Type" -msgstr "종류" +msgstr "형태" -#: common.c:1552 +#: common.c:1412 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "해당 명령 결과가 없거나, ê·¸ ê²°ê³¼ì—는 ì¹¼ëŸ¼ì´ ì—†ìŠµë‹ˆë‹¤.\n" +#: common.c:1504 +#, c-format +msgid "fetching results in chunked mode failed" +msgstr "ì²­í¬ëœ 모드ì—서 결과값 추출 실패" + #: copy.c:98 #, c-format msgid "\\copy: arguments required" @@ -945,46 +1032,36 @@ msgstr "\\copy: 구문 오류: \"%s\"" msgid "\\copy: parse error at end of line" msgstr "\\copy: 줄 ëì— êµ¬ë¬¸ 오류" -#: copy.c:328 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "\"%s\" ëª…ë ¹ì„ ì‹¤í–‰í•  수 ì—†ìŒ: %m" - -#: copy.c:344 +#: copy.c:342 #, c-format msgid "could not stat file \"%s\": %m" msgstr "\"%s\" 파ì¼ì˜ ìƒíƒœê°’ì„ ì•Œ 수 ì—†ìŒ: %m" -#: copy.c:348 +#: copy.c:346 #, c-format msgid "%s: cannot copy from/to a directory" msgstr "%s: 디렉터리부터 ë˜ëŠ” 디렉터리로 복사할 수 ì—†ìŒ" -#: copy.c:385 +#: copy.c:383 #, c-format msgid "could not close pipe to external command: %m" msgstr "외부 명령으로 파ì´í”„를 ë‹«ì„ ìˆ˜ ì—†ìŒ: %m" -#: copy.c:390 -#, c-format -msgid "%s: %s" -msgstr "%s: %s" - -#: copy.c:453 copy.c:463 +#: copy.c:451 copy.c:461 #, c-format msgid "could not write COPY data: %m" msgstr "COPY ìžë£Œë¥¼ 기ë¡í•  수 ì—†ìŒ: %m" -#: copy.c:469 +#: copy.c:467 #, c-format msgid "COPY data transfer failed: %s" msgstr "COPY ìžë£Œ 변환 실패: %s" -#: copy.c:530 +#: copy.c:528 msgid "canceled by user" msgstr "사용ìžì— ì˜í•´ì„œ 취소ë¨" -#: copy.c:541 +#: copy.c:539 msgid "" "Enter data to be copied followed by a newline.\n" "End with a backslash and a period on a line by itself, or an EOF signal." @@ -993,31 +1070,31 @@ msgstr "" "ìžë£Œìž…ë ¥ì´ ë나면 backslash ì  (\\.) 마지막 줄 처ìŒì— 입력하는 EOF 시그ë„ì„ " "보내세요." -#: copy.c:669 +#: copy.c:684 msgid "aborted because of read failure" msgstr "ì½ê¸° 실패로 중지ë¨" -#: copy.c:703 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "복사 모드를 종료하는 중" -#: crosstabview.c:123 +#: crosstabview.c:124 #, c-format msgid "\\crosstabview: statement did not return a result set" msgstr "\\crosstabview: 구문 결과가 ì§‘í•©ì„ ë°˜í™˜í•˜ì§€ 않았ìŒ" -#: crosstabview.c:129 +#: crosstabview.c:130 #, c-format msgid "\\crosstabview: query must return at least three columns" msgstr "\\crosstabview: 쿼리 결과는 ì ì–´ë„ 세 ê°œì˜ ì¹¼ëŸ¼ì€ ë°˜í™˜ 해야 함" -#: crosstabview.c:156 +#: crosstabview.c:157 #, c-format msgid "" "\\crosstabview: vertical and horizontal headers must be different columns" msgstr "\\crosstabview: 행과 ì—´ì˜ ì¹¼ëŸ¼ì´ ê°ê° 다른 칼럼ì´ì–´ì•¼ 함" -#: crosstabview.c:172 +#: crosstabview.c:173 #, c-format msgid "" "\\crosstabview: data column must be specified when query returns more than " @@ -1026,12 +1103,12 @@ msgstr "" "\\crosstabview: 처리할 ì¹¼ëŸ¼ì´ ì„¸ê°œë³´ë‹¤ ë§Žì„ ë•ŒëŠ” ìžë£Œë¡œ 사용할 ì¹¼ëŸ¼ì„ ì§€ì •í•´" "야 함" -#: crosstabview.c:228 +#: crosstabview.c:229 #, c-format msgid "\\crosstabview: maximum number of columns (%d) exceeded" msgstr "\\crosstabview: 최대 칼럼 수 (%d) 초과" -#: crosstabview.c:397 +#: crosstabview.c:398 #, c-format msgid "" "\\crosstabview: query result contains multiple data values for row \"%s\", " @@ -1039,1128 +1116,1177 @@ msgid "" msgstr "" "\\crosstabview: \"%s\" 로우, \"%s\" ì¹¼ëŸ¼ì— ëŒ€í•´ 쿼리 결과는 다중값ì´ì–´ì•¼ 함" -#: crosstabview.c:645 +#: crosstabview.c:646 #, c-format msgid "\\crosstabview: column number %d is out of range 1..%d" msgstr "\\crosstabview: %d 번째 ì—´ì€ 1..%d 범위를 벗어났ìŒ" -#: crosstabview.c:670 +#: crosstabview.c:671 #, c-format msgid "\\crosstabview: ambiguous column name: \"%s\"" msgstr "\\crosstabview: 칼럼 ì´ë¦„ì´ ëª¨í˜¸í•¨: \"%s\"" -#: crosstabview.c:678 +#: crosstabview.c:679 #, c-format msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: 칼럼 ì´ë¦„ ì—†ìŒ: \"%s\"" -#: describe.c:75 describe.c:373 describe.c:678 describe.c:810 describe.c:954 -#: describe.c:1115 describe.c:1187 describe.c:3718 describe.c:3926 -#: describe.c:4170 describe.c:4261 describe.c:4528 describe.c:4688 -#: describe.c:4929 describe.c:5004 describe.c:5015 describe.c:5077 -#: describe.c:5502 describe.c:5585 +#: describe.c:87 describe.c:335 describe.c:626 describe.c:802 describe.c:1035 +#: describe.c:1190 describe.c:1264 describe.c:3945 describe.c:4154 +#: describe.c:4402 describe.c:4483 describe.c:4715 describe.c:4921 +#: describe.c:5165 describe.c:5406 describe.c:5475 describe.c:5486 +#: describe.c:5542 describe.c:5941 describe.c:6018 msgid "Schema" msgstr "스키마" -#: describe.c:76 describe.c:174 describe.c:242 describe.c:250 describe.c:374 -#: describe.c:679 describe.c:811 describe.c:872 describe.c:955 describe.c:1188 -#: describe.c:3719 describe.c:3927 describe.c:4093 describe.c:4171 -#: describe.c:4262 describe.c:4341 describe.c:4529 describe.c:4613 -#: describe.c:4689 describe.c:4930 describe.c:5005 describe.c:5016 -#: describe.c:5078 describe.c:5275 describe.c:5359 describe.c:5583 -#: describe.c:5755 describe.c:5995 +#: describe.c:88 describe.c:166 describe.c:227 describe.c:336 describe.c:627 +#: describe.c:803 describe.c:924 describe.c:1036 describe.c:1265 +#: describe.c:3946 describe.c:4155 describe.c:4319 describe.c:4403 +#: describe.c:4484 describe.c:4645 describe.c:4716 describe.c:4922 +#: describe.c:5038 describe.c:5166 describe.c:5407 describe.c:5476 +#: describe.c:5487 describe.c:5543 describe.c:5740 describe.c:5810 +#: describe.c:6016 describe.c:6243 describe.c:6551 msgid "Name" msgstr "ì´ë¦„" -#: describe.c:77 describe.c:386 describe.c:404 describe.c:450 describe.c:467 +#: describe.c:89 describe.c:348 describe.c:366 msgid "Result data type" msgstr "반환 ìžë£Œí˜•" -#: describe.c:85 describe.c:98 describe.c:102 describe.c:387 describe.c:405 -#: describe.c:451 describe.c:468 +#: describe.c:90 describe.c:349 describe.c:367 msgid "Argument data types" msgstr "ì¸ìž ìžë£Œí˜•" -#: describe.c:110 describe.c:117 describe.c:185 describe.c:273 describe.c:513 -#: describe.c:727 describe.c:826 describe.c:897 describe.c:1190 describe.c:2020 -#: describe.c:3506 describe.c:3779 describe.c:3973 describe.c:4124 -#: describe.c:4198 describe.c:4271 describe.c:4354 describe.c:4437 -#: describe.c:4556 describe.c:4622 describe.c:4690 describe.c:4831 -#: describe.c:4873 describe.c:4946 describe.c:5008 describe.c:5017 -#: describe.c:5079 describe.c:5301 describe.c:5381 describe.c:5516 -#: describe.c:5586 large_obj.c:290 large_obj.c:300 +#: describe.c:98 describe.c:105 describe.c:177 describe.c:241 describe.c:415 +#: describe.c:658 describe.c:818 describe.c:972 describe.c:1267 describe.c:2046 +#: describe.c:3676 describe.c:4000 describe.c:4201 describe.c:4343 +#: describe.c:4416 describe.c:4493 describe.c:4658 describe.c:4834 +#: describe.c:4975 describe.c:5047 describe.c:5167 describe.c:5317 +#: describe.c:5358 describe.c:5423 describe.c:5479 describe.c:5488 +#: describe.c:5544 describe.c:5758 describe.c:5832 describe.c:5955 +#: describe.c:6019 describe.c:7078 msgid "Description" msgstr "설명" -#: describe.c:135 +#: describe.c:127 msgid "List of aggregate functions" msgstr "통계 함수 목ë¡" -#: describe.c:160 +#: describe.c:152 #, c-format msgid "The server (version %s) does not support access methods." msgstr "서버(%s 버전)ì—서 ì ‘ê·¼ ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않습니다." -#: describe.c:175 +#: describe.c:167 msgid "Index" msgstr "ì¸ë±ìФ" -#: describe.c:176 describe.c:3737 describe.c:3952 describe.c:5503 +#: describe.c:168 describe.c:3964 describe.c:4180 describe.c:5942 msgid "Table" msgstr "í…Œì´ë¸”" -#: describe.c:184 describe.c:5280 +#: describe.c:176 describe.c:5742 msgid "Handler" msgstr "핸들러" -#: describe.c:203 +#: describe.c:199 msgid "List of access methods" msgstr "ì ‘ê·¼ 방법 목ë¡" -#: describe.c:229 -#, c-format -msgid "The server (version %s) does not support tablespaces." -msgstr "서버(%s 버전)ì—서 í…Œì´ë¸”스페ì´ìŠ¤ë¥¼ ì§€ì›í•˜ì§€ 않습니다." - -#: describe.c:243 describe.c:251 describe.c:501 describe.c:717 describe.c:873 -#: describe.c:1114 describe.c:3730 describe.c:3928 describe.c:4097 -#: describe.c:4343 describe.c:4614 describe.c:5276 describe.c:5360 -#: describe.c:5756 describe.c:5893 describe.c:5996 describe.c:6111 -#: describe.c:6190 large_obj.c:289 +#: describe.c:228 describe.c:401 describe.c:651 describe.c:925 describe.c:1189 +#: describe.c:3957 describe.c:4156 describe.c:4320 describe.c:4647 +#: describe.c:5039 describe.c:5741 describe.c:5811 describe.c:6244 +#: describe.c:6431 describe.c:6552 describe.c:6722 describe.c:6807 +#: describe.c:7066 msgid "Owner" msgstr "소유주" -#: describe.c:244 describe.c:252 +#: describe.c:229 msgid "Location" msgstr "위치" -#: describe.c:263 describe.c:3323 +#: describe.c:239 describe.c:3517 describe.c:3857 msgid "Options" msgstr "옵션" -#: describe.c:268 describe.c:690 describe.c:889 describe.c:3771 describe.c:3775 +#: describe.c:240 describe.c:649 describe.c:970 describe.c:3999 msgid "Size" msgstr "í¬ê¸°" -#: describe.c:290 +#: describe.c:263 msgid "List of tablespaces" msgstr "í…Œì´ë¸”스페ì´ìФ 목ë¡" -#: describe.c:333 +#: describe.c:308 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df ëª…ë ¹ì€ [anptwS+]ë§Œ 추가로 사용함" -#: describe.c:341 describe.c:352 +#: describe.c:316 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df ëª…ë ¹ì€ \"%c\" ì˜µì…˜ì„ %s 버전 서버ì—서는 사용할 수 ì—†ìŒ" #. translator: "agg" is short for "aggregate" -#: describe.c:389 describe.c:407 describe.c:453 describe.c:470 +#: describe.c:351 describe.c:369 msgid "agg" msgstr "집계" -#: describe.c:390 describe.c:408 +#: describe.c:352 describe.c:370 msgid "window" msgstr "ì°½" -#: describe.c:391 +#: describe.c:353 msgid "proc" -msgstr "" +msgstr "proc" -#: describe.c:392 describe.c:410 describe.c:455 describe.c:472 +#: describe.c:354 describe.c:372 msgid "func" msgstr "함수" -#: describe.c:409 describe.c:454 describe.c:471 describe.c:1324 +#: describe.c:371 describe.c:1397 msgid "trigger" msgstr "트리거" -#: describe.c:483 +#: describe.c:383 msgid "immutable" msgstr "immutable" -#: describe.c:484 +#: describe.c:384 msgid "stable" msgstr "stable" -#: describe.c:485 +#: describe.c:385 msgid "volatile" msgstr "volatile" -#: describe.c:486 +#: describe.c:386 msgid "Volatility" msgstr "휘발성" -#: describe.c:494 +#: describe.c:394 msgid "restricted" msgstr "엄격함" -#: describe.c:495 +#: describe.c:395 msgid "safe" msgstr "safe" -#: describe.c:496 +#: describe.c:396 msgid "unsafe" msgstr "unsafe" -#: describe.c:497 +#: describe.c:397 msgid "Parallel" msgstr "병렬처리" -#: describe.c:502 +#: describe.c:402 msgid "definer" msgstr "definer" -#: describe.c:503 +#: describe.c:403 msgid "invoker" msgstr "invoker" -#: describe.c:504 +#: describe.c:404 msgid "Security" msgstr "보안" -#: describe.c:511 +#: describe.c:409 msgid "Language" msgstr "언어" -#: describe.c:512 -msgid "Source code" -msgstr "소스 코드" +#: describe.c:412 describe.c:648 +msgid "Internal name" +msgstr "ë‚´ë¶€ ì´ë¦„" -#: describe.c:641 +#: describe.c:585 msgid "List of functions" msgstr "함수 목ë¡" -#: describe.c:689 -msgid "Internal name" -msgstr "ë‚´ë¶€ ì´ë¦„" - -#: describe.c:711 +#: describe.c:650 msgid "Elements" msgstr "요소" -#: describe.c:768 +#: describe.c:701 msgid "List of data types" msgstr "ìžë£Œí˜• 목ë¡" -#: describe.c:812 +#: describe.c:804 msgid "Left arg type" msgstr "왼쪽 ì¸ìˆ˜ ìžë£Œí˜•" -#: describe.c:813 +#: describe.c:805 msgid "Right arg type" msgstr "오른쪽 ì¸ìˆ˜ ìžë£Œí˜•" -#: describe.c:814 +#: describe.c:806 msgid "Result type" msgstr "반환 ìžë£Œí˜•" -#: describe.c:819 describe.c:4349 describe.c:4414 describe.c:4420 -#: describe.c:4830 describe.c:6362 describe.c:6366 +#: describe.c:811 describe.c:4653 describe.c:4817 describe.c:5316 +#: describe.c:6996 describe.c:7000 msgid "Function" msgstr "함수" -#: describe.c:844 +#: describe.c:891 msgid "List of operators" msgstr "ì—°ì‚°ìž ëª©ë¡" -#: describe.c:874 +#: describe.c:926 msgid "Encoding" msgstr "ì¸ì½”딩" -#: describe.c:879 describe.c:4530 +#: describe.c:930 describe.c:934 +msgid "Locale Provider" +msgstr "ë¡œì¼€ì¼ ì œê³µìž" + +#: describe.c:938 describe.c:4936 msgid "Collate" msgstr "Collate" -#: describe.c:880 describe.c:4531 +#: describe.c:939 describe.c:4937 msgid "Ctype" msgstr "Ctype" -#: describe.c:893 +#: describe.c:943 describe.c:947 describe.c:951 describe.c:4942 describe.c:4946 +#: describe.c:4950 +msgid "Locale" +msgstr "로케ì¼" + +#: describe.c:955 describe.c:959 describe.c:4955 describe.c:4959 +msgid "ICU Rules" +msgstr "ICU 룰" + +#: describe.c:971 msgid "Tablespace" msgstr "í…Œì´ë¸”스페ì´ìФ" -#: describe.c:915 +#: describe.c:996 msgid "List of databases" msgstr "ë°ì´í„°ë² ì´ìФ 목ë¡" -#: describe.c:956 describe.c:1117 describe.c:3720 +#: describe.c:1037 describe.c:1192 describe.c:3947 msgid "table" msgstr "í…Œì´ë¸”" -#: describe.c:957 describe.c:3721 +#: describe.c:1038 describe.c:3948 msgid "view" msgstr "ë·°(view)" -#: describe.c:958 describe.c:3722 +#: describe.c:1039 describe.c:3949 msgid "materialized view" msgstr "êµ¬ì²´í™”ëœ ë·°" -#: describe.c:959 describe.c:1119 describe.c:3724 +#: describe.c:1040 describe.c:1194 describe.c:3951 msgid "sequence" msgstr "시퀀스" -#: describe.c:960 describe.c:3726 +#: describe.c:1041 describe.c:3953 msgid "foreign table" msgstr "외부 í…Œì´ë¸”" -#: describe.c:961 describe.c:3727 describe.c:3937 +#: describe.c:1042 describe.c:3954 describe.c:4165 msgid "partitioned table" msgstr "파티션 í…Œì´ë¸”" -#: describe.c:973 +#: describe.c:1058 msgid "Column privileges" msgstr "칼럼 접근권한" -#: describe.c:1004 describe.c:1038 +#: describe.c:1089 describe.c:1123 msgid "Policies" msgstr "ì •ì±…" -#: describe.c:1070 describe.c:6052 describe.c:6056 +#: describe.c:1151 describe.c:4570 describe.c:6667 msgid "Access privileges" msgstr "액세스 권한" -#: describe.c:1101 -#, c-format -msgid "The server (version %s) does not support altering default privileges." -msgstr "ì´ ì„œë²„(%s 버전)는 ALTER DEFAULT PRIVILEGES ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않습니다." - -#: describe.c:1121 +#: describe.c:1196 msgid "function" msgstr "함수" -#: describe.c:1123 +#: describe.c:1198 msgid "type" msgstr "type" -#: describe.c:1125 +#: describe.c:1200 msgid "schema" msgstr "스키마" -#: describe.c:1149 +#: describe.c:1222 msgid "Default access privileges" msgstr "기본 접근권한" -#: describe.c:1189 +#: describe.c:1266 msgid "Object" msgstr "개체" -#: describe.c:1203 +#: describe.c:1280 msgid "table constraint" msgstr "í…Œì´ë¸” 제약 ì¡°ê±´" -#: describe.c:1225 +#: describe.c:1304 msgid "domain constraint" msgstr "ë„ë©”ì¸ ì œì•½ì¡°ê±´" -#: describe.c:1253 +#: describe.c:1328 msgid "operator class" msgstr "ì—°ì‚°ìž í´ëž˜ìФ" -#: describe.c:1282 +#: describe.c:1352 msgid "operator family" msgstr "ì—°ì‚°ìž ë¶€ë¥˜" -#: describe.c:1304 +#: describe.c:1375 msgid "rule" msgstr "룰(rule)" -#: describe.c:1346 +#: describe.c:1420 msgid "Object descriptions" msgstr "개체 설명" -#: describe.c:1402 describe.c:3843 +#: describe.c:1485 describe.c:4072 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "\"%s\" ì´ë¦„ì„ ë¦´ë ˆì´ì…˜(relation) ì—†ìŒ." -#: describe.c:1405 describe.c:3846 +#: describe.c:1488 describe.c:4075 #, c-format msgid "Did not find any relations." msgstr "관련 릴레ì´ì…˜ ì°¾ì„ ìˆ˜ ì—†ìŒ." -#: describe.c:1660 +#: describe.c:1684 #, c-format msgid "Did not find any relation with OID %s." msgstr "%s oidì˜ ì–´ë–¤ 릴레ì´ì…˜(relation)ë„ ì°¾ì„ ìˆ˜ ì—†ìŒ." -#: describe.c:1712 describe.c:1736 +#: describe.c:1732 describe.c:1756 msgid "Start" msgstr "시작" -#: describe.c:1713 describe.c:1737 +#: describe.c:1733 describe.c:1757 msgid "Minimum" msgstr "최소값" -#: describe.c:1714 describe.c:1738 +#: describe.c:1734 describe.c:1758 msgid "Maximum" msgstr "최대값" -#: describe.c:1715 describe.c:1739 +#: describe.c:1735 describe.c:1759 msgid "Increment" msgstr "ì¦ê°€ê°’" -#: describe.c:1716 describe.c:1740 describe.c:1871 describe.c:4265 -#: describe.c:4431 describe.c:4545 describe.c:4550 describe.c:6099 +#: describe.c:1736 describe.c:1760 describe.c:1889 describe.c:4487 +#: describe.c:4828 describe.c:4964 describe.c:4969 describe.c:6710 msgid "yes" msgstr "예" -#: describe.c:1717 describe.c:1741 describe.c:1872 describe.c:4265 -#: describe.c:4428 describe.c:4545 describe.c:6100 +#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4487 +#: describe.c:4825 describe.c:4964 describe.c:6711 msgid "no" msgstr "아니오" -#: describe.c:1718 describe.c:1742 +#: describe.c:1738 describe.c:1762 msgid "Cycles?" msgstr "순환?" -#: describe.c:1719 describe.c:1743 +#: describe.c:1739 describe.c:1763 msgid "Cache" msgstr "ìºì‰¬" -#: describe.c:1786 +#: describe.c:1804 #, c-format msgid "Owned by: %s" msgstr "소유주: %s" -#: describe.c:1790 +#: describe.c:1808 #, c-format msgid "Sequence for identity column: %s" msgstr "ì‹ë³„ 칼럼용 시퀀스: %s" -#: describe.c:1797 +#: describe.c:1816 +#, c-format +msgid "Unlogged sequence \"%s.%s\"" +msgstr "\"%s.%s\" 로그 미사용 시퀀스" + +#: describe.c:1819 #, c-format msgid "Sequence \"%s.%s\"" msgstr "\"%s.%s\" 시퀀스" -#: describe.c:1933 +#: describe.c:1962 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "로그 미사용 í…Œì´ë¸” \"%s.%s\"" -#: describe.c:1936 +#: describe.c:1965 #, c-format msgid "Table \"%s.%s\"" msgstr "\"%s.%s\" í…Œì´ë¸”" -#: describe.c:1940 +#: describe.c:1969 #, c-format msgid "View \"%s.%s\"" msgstr "\"%s.%s\" ë·°(view)" -#: describe.c:1945 +#: describe.c:1974 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "트랜잭션 로그를 남기지 ì•Šì€ êµ¬ì²´í™”ëœ ë·° \"%s.%s\"" -#: describe.c:1948 +#: describe.c:1977 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Materialized ë·° \"%s.%s\"" -#: describe.c:1953 +#: describe.c:1982 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "\"%s.%s\" 로그 미사용 ì¸ë±ìФ" -#: describe.c:1956 +#: describe.c:1985 #, c-format msgid "Index \"%s.%s\"" msgstr "\"%s.%s\" ì¸ë±ìФ" -#: describe.c:1961 +#: describe.c:1990 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "\"%s.%s\" 로그 미사용 파티션 ì¸ë±ìФ" -#: describe.c:1964 +#: describe.c:1993 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "\"%s.%s\" 파티션 ì¸ë±ìФ" -#: describe.c:1969 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "\"%s.%s\" 특수 릴레ì´ì…˜(relation)" - -#: describe.c:1973 +#: describe.c:1997 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "\"%s.%s\" TOAST í…Œì´ë¸”" -#: describe.c:1977 +#: describe.c:2001 #, c-format msgid "Composite type \"%s.%s\"" msgstr "\"%s.%s\" 복합ìžë£Œí˜•" -#: describe.c:1981 +#: describe.c:2005 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "\"%s.%s\" 외부 í…Œì´ë¸”" -#: describe.c:1986 +#: describe.c:2010 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "로그 미사용 파티션 í…Œì´ë¸” \"%s.%s\"" -#: describe.c:1989 +#: describe.c:2013 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "\"%s.%s\" 파티션 í…Œì´ë¸”" -#: describe.c:2005 describe.c:4178 +#: describe.c:2029 describe.c:4405 msgid "Collation" -msgstr "Collation" +msgstr "정렬규칙" -#: describe.c:2006 describe.c:4185 +#: describe.c:2030 describe.c:4406 msgid "Nullable" msgstr "NULL허용" -#: describe.c:2007 describe.c:4186 +#: describe.c:2031 describe.c:4407 msgid "Default" msgstr "초기값" -#: describe.c:2010 +#: describe.c:2034 msgid "Key?" -msgstr "" +msgstr "Key?" -#: describe.c:2012 +#: describe.c:2036 describe.c:4723 describe.c:4734 msgid "Definition" msgstr "ì •ì˜" -#: describe.c:2014 describe.c:5296 describe.c:5380 describe.c:5451 -#: describe.c:5515 +#: describe.c:2038 describe.c:5757 describe.c:5831 describe.c:5896 +#: describe.c:5954 msgid "FDW options" msgstr "FDW 옵션" -#: describe.c:2016 +#: describe.c:2040 msgid "Storage" msgstr "스토리지" -#: describe.c:2018 +#: describe.c:2042 +msgid "Compression" +msgstr "ì••ì¶•" + +#: describe.c:2044 msgid "Stats target" msgstr "통계수집량" -#: describe.c:2131 +#: describe.c:2180 #, c-format -msgid "Partition of: %s %s" -msgstr "ì†Œì† íŒŒí‹°ì…˜: %s %s" +msgid "Partition of: %s %s%s" +msgstr "ì†Œì† íŒŒí‹°ì…˜: %s %s%s" -#: describe.c:2143 +#: describe.c:2193 msgid "No partition constraint" msgstr "파티션 제약 ì¡°ê±´ ì—†ìŒ" -#: describe.c:2145 +#: describe.c:2195 #, c-format msgid "Partition constraint: %s" msgstr "파티션 제약조건: %s" -#: describe.c:2169 +#: describe.c:2219 #, c-format msgid "Partition key: %s" msgstr "파티션 키: %s" -#: describe.c:2195 +#: describe.c:2245 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "ì†Œì† í…Œì´ë¸”: \"%s.%s\"" -#: describe.c:2266 +#: describe.c:2314 msgid "primary key, " msgstr "기본키, " -#: describe.c:2268 -msgid "unique, " -msgstr "고유, " +#: describe.c:2317 +msgid "unique" +msgstr "고유" -#: describe.c:2274 +#: describe.c:2319 +msgid " nulls not distinct" +msgstr " nulls not distinct" + +#: describe.c:2320 +msgid ", " +msgstr ", " + +#: describe.c:2327 #, c-format msgid "for table \"%s.%s\"" msgstr "ì ìš©í…Œì´ë¸”: \"%s.%s\"" -#: describe.c:2278 +#: describe.c:2331 #, c-format msgid ", predicate (%s)" msgstr ", predicate (%s)" -#: describe.c:2281 +#: describe.c:2334 msgid ", clustered" msgstr ", í´ëŸ¬ìФë¨" -#: describe.c:2284 +#: describe.c:2337 msgid ", invalid" msgstr ", 잘못ë¨" -#: describe.c:2287 +#: describe.c:2340 msgid ", deferrable" msgstr ", 지연가능" -#: describe.c:2290 +#: describe.c:2343 msgid ", initially deferred" msgstr ", 트랜잭션단위지연" -#: describe.c:2293 +#: describe.c:2346 msgid ", replica identity" msgstr ", 복제 ì‹ë³„ìž" -#: describe.c:2360 +#: describe.c:2400 msgid "Indexes:" msgstr "ì¸ë±ìŠ¤ë“¤:" -#: describe.c:2444 +#: describe.c:2483 msgid "Check constraints:" msgstr "ì²´í¬ ì œì•½ ì¡°ê±´:" -#: describe.c:2512 +#: describe.c:2551 msgid "Foreign-key constraints:" msgstr "참조키 제약 ì¡°ê±´:" -#: describe.c:2575 +#: describe.c:2614 msgid "Referenced by:" msgstr "다ìŒì—서 참조ë¨:" -#: describe.c:2625 +#: describe.c:2664 msgid "Policies:" msgstr "ì •ì±…:" -#: describe.c:2628 +#: describe.c:2667 msgid "Policies (forced row security enabled):" msgstr "ì •ì±… (로우단위 보안정책 ê°•ì œ 활성화):" -#: describe.c:2631 +#: describe.c:2670 msgid "Policies (row security enabled): (none)" msgstr "ì •ì±… (로우단위 보안정책 활성화): (ì—†ìŒ)" -#: describe.c:2634 +#: describe.c:2673 msgid "Policies (forced row security enabled): (none)" msgstr "ì •ì±… (로우단위 보안정책 ê°•ì œ 활성화): (ì—†ìŒ)" -#: describe.c:2637 +#: describe.c:2676 msgid "Policies (row security disabled):" msgstr "ì •ì±… (로우단위 보안정책 비활성화):" -#: describe.c:2705 +#: describe.c:2736 describe.c:2841 msgid "Statistics objects:" msgstr "통계정보 ê°ì²´:" -#: describe.c:2819 describe.c:2923 +#: describe.c:2943 describe.c:3096 msgid "Rules:" msgstr "룰(rule)들:" -#: describe.c:2822 +#: describe.c:2946 msgid "Disabled rules:" msgstr "ì‚¬ìš©ì¤‘ì§€ëœ ê·œì¹™:" -#: describe.c:2825 +#: describe.c:2949 msgid "Rules firing always:" msgstr "í•­ìƒ ë°œìƒí•˜ëŠ” 규칙:" -#: describe.c:2828 +#: describe.c:2952 msgid "Rules firing on replica only:" msgstr "복제본ì—서만 ë°œìƒí•˜ëŠ” 규칙:" -#: describe.c:2868 +#: describe.c:3031 describe.c:5100 msgid "Publications:" msgstr "발행ìž:" -#: describe.c:2906 +#: describe.c:3079 msgid "View definition:" msgstr "ë·° ì •ì˜:" -#: describe.c:3053 +#: describe.c:3242 msgid "Triggers:" msgstr "트리거들:" -#: describe.c:3057 +#: describe.c:3245 msgid "Disabled user triggers:" msgstr "ì‚¬ìš©ì¤‘ì§€ëœ ì‚¬ìš©ìž íŠ¸ë¦¬ê±°:" -#: describe.c:3059 -msgid "Disabled triggers:" -msgstr "ì‚¬ìš©ì¤‘ì§€ëœ íŠ¸ë¦¬ê±°:" - -#: describe.c:3062 +#: describe.c:3248 msgid "Disabled internal triggers:" msgstr "ì‚¬ìš©ì¤‘ì§€ëœ ë‚´ë¶€ 트리거:" -#: describe.c:3065 +#: describe.c:3251 msgid "Triggers firing always:" msgstr "í•­ìƒ ë°œìƒí•˜ëŠ” 트리거:" -#: describe.c:3068 +#: describe.c:3254 msgid "Triggers firing on replica only:" msgstr "복제본ì—서만 ë°œìƒí•˜ëŠ” 트리거:" -#: describe.c:3140 +#: describe.c:3325 #, c-format msgid "Server: %s" msgstr "서버: %s" -#: describe.c:3148 +#: describe.c:3333 #, c-format msgid "FDW options: (%s)" msgstr "FDW 옵션들: (%s)" -#: describe.c:3169 +#: describe.c:3354 msgid "Inherits" msgstr "ìƒì†" -#: describe.c:3229 +#: describe.c:3419 #, c-format msgid "Number of partitions: %d" msgstr "파티션 í…Œì´ë¸” 수: %d" -#: describe.c:3238 +#: describe.c:3428 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "파티션 í…Œì´ë¸” 수: %d (\\d+ 명령으로 ë³¼ 수 있ìŒ)" -#: describe.c:3240 +#: describe.c:3430 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "하위 í…Œì´ë¸” 수: %d (\\d+ 명령으로 ë³¼ 수 있ìŒ)" -#: describe.c:3247 +#: describe.c:3437 msgid "Child tables" msgstr "하위 í…Œì´ë¸”" -#: describe.c:3247 +#: describe.c:3437 msgid "Partitions" msgstr "파티션들" -#: describe.c:3276 +#: describe.c:3470 #, c-format msgid "Typed table of type: %s" msgstr "ìžë£Œí˜•ì˜ typed í…Œì´ë¸”: %s" -#: describe.c:3292 +#: describe.c:3486 msgid "Replica Identity" msgstr "복제 ì‹ë³„ìž" -#: describe.c:3305 +#: describe.c:3499 msgid "Has OIDs: yes" msgstr "OID 사용: yes" -#: describe.c:3314 +#: describe.c:3508 #, c-format msgid "Access method: %s" msgstr "ì ‘ê·¼ 방법: %s" -#: describe.c:3394 +#: describe.c:3585 #, c-format msgid "Tablespace: \"%s\"" msgstr "í…Œì´ë¸”스페ì´ìФ: \"%s\"" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3406 +#: describe.c:3597 #, c-format msgid ", tablespace \"%s\"" msgstr ", \"%s\" í…Œì´ë¸”스페ì´ìФ" -#: describe.c:3499 +#: describe.c:3670 msgid "List of roles" msgstr "롤 목ë¡" -#: describe.c:3501 +#: describe.c:3672 describe.c:3840 msgid "Role name" msgstr "롤 ì´ë¦„" -#: describe.c:3502 +#: describe.c:3673 msgid "Attributes" msgstr "ì†ì„±" -#: describe.c:3503 -msgid "Member of" -msgstr "ì†Œì† ê·¸ë£¹:" - -#: describe.c:3514 +#: describe.c:3684 msgid "Superuser" msgstr "슈í¼ìœ ì €" -#: describe.c:3517 +#: describe.c:3687 msgid "No inheritance" msgstr "ìƒì† ì—†ìŒ" -#: describe.c:3520 +#: describe.c:3690 msgid "Create role" msgstr "롤 만들기" -#: describe.c:3523 +#: describe.c:3693 msgid "Create DB" msgstr "DB 만들기" -#: describe.c:3526 +#: describe.c:3696 msgid "Cannot login" msgstr "로그ì¸í•  수 ì—†ìŒ" -#: describe.c:3530 +#: describe.c:3699 msgid "Replication" msgstr "복제" -#: describe.c:3534 +#: describe.c:3703 msgid "Bypass RLS" msgstr "RLS 통과" -#: describe.c:3543 +#: describe.c:3712 msgid "No connections" msgstr "ì—°ê²° ì—†ìŒ" -#: describe.c:3545 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%dê°œ ì—°ê²°" -#: describe.c:3555 +#: describe.c:3724 msgid "Password valid until " msgstr "비밀번호 만료기한: " -#: describe.c:3605 -#, c-format -msgid "The server (version %s) does not support per-database role settings." -msgstr "ì´ ì„œë²„(%s 버전)는 ë°ì´í„°ë² ì´ìФ 개별 롤 ì„¤ì •ì„ ì§€ì›í•˜ì§€ 않습니다." - -#: describe.c:3618 +#: describe.c:3775 msgid "Role" msgstr "롤" -#: describe.c:3619 +#: describe.c:3776 msgid "Database" msgstr "ë°ì´í„°ë² ì´ìФ" -#: describe.c:3620 +#: describe.c:3777 msgid "Settings" msgstr "설정" -#: describe.c:3641 +#: describe.c:3801 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "\"%s\" 롤과 \"%s\" ë°ì´í„°ë² ì´ìŠ¤ì— ëŒ€í•œ 특정 ì„¤ì •ì´ ì—†ìŠµë‹ˆë‹¤." -#: describe.c:3644 +#: describe.c:3804 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "\"%s\" 롤용 특정 ì„¤ì •ì´ ì—†ìŒ." -#: describe.c:3647 +#: describe.c:3807 #, c-format msgid "Did not find any settings." msgstr "추가 설정 ì—†ìŒ." -#: describe.c:3652 +#: describe.c:3811 msgid "List of settings" msgstr "설정 목ë¡" -#: describe.c:3723 +#: describe.c:3841 +msgid "Member of" +msgstr "ì†Œì† ê·¸ë£¹" + +#: describe.c:3858 +msgid "Grantor" +msgstr "부여ìž" + +#: describe.c:3884 +msgid "List of role grants" +msgstr "롤 부여 목ë¡" + +#: describe.c:3950 msgid "index" msgstr "ì¸ë±ìФ" -#: describe.c:3725 -msgid "special" -msgstr "특수" +#: describe.c:3952 +msgid "TOAST table" +msgstr "TOAST í…Œì´ë¸”" -#: describe.c:3728 describe.c:3938 +#: describe.c:3955 describe.c:4166 msgid "partitioned index" msgstr "파티션_ì¸ë±ìФ" -#: describe.c:3752 +#: describe.c:3975 msgid "permanent" -msgstr "" +msgstr "ì˜êµ¬" -#: describe.c:3753 +#: describe.c:3976 msgid "temporary" -msgstr "" +msgstr "임시" -#: describe.c:3754 +#: describe.c:3977 msgid "unlogged" -msgstr "" +msgstr "로깅안함" -#: describe.c:3755 +#: describe.c:3978 msgid "Persistence" -msgstr "" +msgstr "ì§€ì†ì„±" + +#: describe.c:3994 +msgid "Access method" +msgstr "ì ‘ê·¼ 방법" -#: describe.c:3851 +#: describe.c:4079 msgid "List of relations" -msgstr "릴레ì´ì…˜(relation) 목ë¡" +msgstr "릴레ì´ì…˜ 목ë¡" -#: describe.c:3899 +#: describe.c:4127 #, c-format msgid "" "The server (version %s) does not support declarative table partitioning." msgstr "ì´ ì„œë²„(%s 버전)는 파티션 í…Œì´ë¸” ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않습니다." -#: describe.c:3910 +#: describe.c:4138 msgid "List of partitioned indexes" msgstr "파티션 ì¸ë±ìФ 목ë¡" -#: describe.c:3912 +#: describe.c:4140 msgid "List of partitioned tables" msgstr "파티션 í…Œì´ë¸” 목ë¡" -#: describe.c:3916 +#: describe.c:4144 msgid "List of partitioned relations" msgstr "파티션 릴레ì´ì…˜(relation) 목ë¡" -#: describe.c:3947 +#: describe.c:4175 msgid "Parent name" msgstr "ìƒìœ„ ì´ë¦„" -#: describe.c:3960 +#: describe.c:4188 msgid "Leaf partition size" msgstr "하위 파티션 í¬ê¸°" -#: describe.c:3963 describe.c:3969 +#: describe.c:4191 describe.c:4197 msgid "Total size" msgstr "ì „ì²´ í¬ê¸°" -#: describe.c:4101 +#: describe.c:4321 msgid "Trusted" msgstr "신뢰ë¨" -#: describe.c:4109 +#: describe.c:4330 msgid "Internal language" msgstr "ë‚´ë¶€ 언어" -#: describe.c:4110 +#: describe.c:4331 msgid "Call handler" msgstr "호출 핸들러" -#: describe.c:4111 describe.c:5283 +#: describe.c:4332 describe.c:5743 msgid "Validator" msgstr "유효성 검사기" -#: describe.c:4114 +#: describe.c:4333 msgid "Inline handler" msgstr "ì¸ë¼ì¸ 핸들러" -#: describe.c:4142 +#: describe.c:4367 msgid "List of languages" msgstr "언어 목ë¡" -#: describe.c:4187 +#: describe.c:4408 msgid "Check" msgstr "ì²´í¬" -#: describe.c:4229 +#: describe.c:4451 msgid "List of domains" msgstr "ë„ë©”ì¸(domain) 목ë¡" -#: describe.c:4263 +#: describe.c:4485 msgid "Source" msgstr "소스" -#: describe.c:4264 +#: describe.c:4486 msgid "Destination" msgstr "설명" -#: describe.c:4266 describe.c:6101 +#: describe.c:4488 describe.c:6712 msgid "Default?" msgstr "초기값?" -#: describe.c:4303 +#: describe.c:4529 msgid "List of conversions" msgstr "문ìžì½”드변환규칙(conversion) 목ë¡" -#: describe.c:4342 +#: describe.c:4557 +msgid "Parameter" +msgstr "매개변수" + +#: describe.c:4558 +msgid "Value" +msgstr "ê°’" + +#: describe.c:4565 +msgid "Context" +msgstr "컨í…스트" + +#: describe.c:4597 +msgid "List of configuration parameters" +msgstr "환경설정 매개변수 목ë¡" + +#: describe.c:4599 +msgid "List of non-default configuration parameters" +msgstr "ê¸°ë³¸ê°’ì´ ì•„ë‹Œ 값으로 ì§€ì •ëœ í™˜ê²½ì„¤ì • 매개변수 목ë¡" + +#: describe.c:4626 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "ì´ ì„œë²„(%s 버전)는 ì´ë²¤íЏ 트리거를 ì§€ì›í•˜ì§€ 않습니다." + +#: describe.c:4646 msgid "Event" msgstr "ì´ë²¤íЏ" -#: describe.c:4344 +#: describe.c:4648 msgid "enabled" msgstr "활성화" -#: describe.c:4345 +#: describe.c:4649 msgid "replica" msgstr "replica" -#: describe.c:4346 +#: describe.c:4650 msgid "always" msgstr "í•­ìƒ" -#: describe.c:4347 +#: describe.c:4651 msgid "disabled" msgstr "비활성화" -#: describe.c:4348 describe.c:5997 +#: describe.c:4652 describe.c:6553 msgid "Enabled" msgstr "활성화" -#: describe.c:4350 +#: describe.c:4654 msgid "Tags" msgstr "태그" -#: describe.c:4369 +#: describe.c:4677 msgid "List of event triggers" msgstr "ì´ë²¤íЏ 트리거 목ë¡" -#: describe.c:4398 +#: describe.c:4704 +#, c-format +msgid "The server (version %s) does not support extended statistics." +msgstr "ì´ ì„œë²„(%s 버전)ì—서 확장 통계정보를 ì§€ì›í•˜ì§€ 않습니다." + +#: describe.c:4741 +msgid "Ndistinct" +msgstr "Ndistinct" + +#: describe.c:4742 +msgid "Dependencies" +msgstr "Dependencies" + +#: describe.c:4752 +msgid "MCV" +msgstr "MCV" + +#: describe.c:4775 +msgid "List of extended statistics" +msgstr "확장 통계정보 목ë¡" + +#: describe.c:4802 msgid "Source type" msgstr "Source ìžë£Œí˜•" -#: describe.c:4399 +#: describe.c:4803 msgid "Target type" msgstr "Target ìžë£Œí˜•" -#: describe.c:4430 +#: describe.c:4827 msgid "in assignment" msgstr "in assignment" -#: describe.c:4432 +#: describe.c:4829 msgid "Implicit?" msgstr "Implicit?" -#: describe.c:4487 +#: describe.c:4887 msgid "List of casts" msgstr "í˜•ë³€í™˜ìž ëª©ë¡" -#: describe.c:4515 -#, c-format -msgid "The server (version %s) does not support collations." -msgstr "ì´ ì„œë²„(%s 버전)는 ë¬¸ìž ì •ë ¬(collation) ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않습니다." - -#: describe.c:4536 describe.c:4540 +#: describe.c:4927 describe.c:4931 msgid "Provider" msgstr "제공ìž" -#: describe.c:4546 describe.c:4551 +#: describe.c:4965 describe.c:4970 msgid "Deterministic?" -msgstr "" +msgstr "Deterministic?" -#: describe.c:4586 +#: describe.c:5009 msgid "List of collations" msgstr "ë¬¸ìž ì •ë ¬ 목ë¡" -#: describe.c:4645 +#: describe.c:5070 msgid "List of schemas" -msgstr "스키마(schema) 목ë¡" - -#: describe.c:4670 describe.c:4917 describe.c:4988 describe.c:5059 -#, c-format -msgid "The server (version %s) does not support full text search." -msgstr "ì´ ì„œë²„(%s 버전)ì—서 전문 ê²€ìƒ‰ì„ ì§€ì›í•˜ì§€ 않습니다." +msgstr "스키마 목ë¡" -#: describe.c:4705 +#: describe.c:5186 msgid "List of text search parsers" msgstr "í…스트 검색 파서 목ë¡" -#: describe.c:4750 +#: describe.c:5236 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "\"%s\"(ì´)ë¼ëŠ” 전문 검색 ë¶„ì„기를 찾지 못했습니다." -#: describe.c:4753 +#: describe.c:5239 #, c-format msgid "Did not find any text search parsers." msgstr "특정 전문 검색 ë¶„ì„기를 찾지 못했습니다." -#: describe.c:4828 +#: describe.c:5314 msgid "Start parse" msgstr "구문 ë¶„ì„ ì‹œìž‘" -#: describe.c:4829 +#: describe.c:5315 msgid "Method" msgstr "방법" -#: describe.c:4833 +#: describe.c:5319 msgid "Get next token" msgstr "ë‹¤ìŒ í† í° ê°€ì ¸ì˜¤ê¸°" -#: describe.c:4835 +#: describe.c:5321 msgid "End parse" msgstr "구문 ë¶„ì„ ì¢…ë£Œ" -#: describe.c:4837 +#: describe.c:5323 msgid "Get headline" msgstr "헤드ë¼ì¸ 가져오기" -#: describe.c:4839 +#: describe.c:5325 msgid "Get token types" msgstr "í† í° í˜•ì‹ ê°€ì ¸ì˜¤ê¸°" -#: describe.c:4850 +#: describe.c:5335 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "\"%s.%s\" í…스트 검색 파서" -#: describe.c:4853 +#: describe.c:5338 #, c-format msgid "Text search parser \"%s\"" msgstr "\"%s\" í…스트 검색 파서" -#: describe.c:4872 +#: describe.c:5357 msgid "Token name" msgstr "í† í° ì´ë¦„" -#: describe.c:4883 +#: describe.c:5370 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "\"%s.%s\" íŒŒì„œì˜ í† í° í˜•ì‹" -#: describe.c:4886 +#: describe.c:5373 #, c-format msgid "Token types for parser \"%s\"" msgstr "\"%s\" íŒŒì„œì˜ í† í° í˜•ì‹" -#: describe.c:4940 +#: describe.c:5417 msgid "Template" msgstr "템플릿" -#: describe.c:4941 +#: describe.c:5418 msgid "Init options" msgstr "초기화 옵션" -#: describe.c:4963 +#: describe.c:5444 msgid "List of text search dictionaries" msgstr "í…스트 검색 사전 목ë¡" -#: describe.c:5006 +#: describe.c:5477 msgid "Init" msgstr "초기화" -#: describe.c:5007 +#: describe.c:5478 msgid "Lexize" msgstr "Lexize" -#: describe.c:5034 +#: describe.c:5509 msgid "List of text search templates" msgstr "í…스트 검색 템플릿 목ë¡" -#: describe.c:5094 +#: describe.c:5563 msgid "List of text search configurations" msgstr "í…스트 검색 구성 목ë¡" -#: describe.c:5140 +#: describe.c:5614 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "\"%s\"(ì´)ë¼ëŠ” í…스트 검색 êµ¬ì„±ì„ ì°¾ì§€ 못했습니다." -#: describe.c:5143 +#: describe.c:5617 #, c-format msgid "Did not find any text search configurations." msgstr "특정 í…스트 검색 êµ¬ì„±ì„ ì°¾ì§€ 못했습니다." -#: describe.c:5209 +#: describe.c:5683 msgid "Token" msgstr "토í°" -#: describe.c:5210 +#: describe.c:5684 msgid "Dictionaries" msgstr "사전" -#: describe.c:5221 +#: describe.c:5695 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "í…스트 검색 구성 \"%s.%s\"" -#: describe.c:5224 +#: describe.c:5698 #, c-format msgid "Text search configuration \"%s\"" msgstr "í…스트 검색 구성 \"%s\"" -#: describe.c:5228 +#: describe.c:5702 #, c-format msgid "" "\n" @@ -2169,7 +2295,7 @@ msgstr "" "\n" "파서: \"%s.%s\"" -#: describe.c:5231 +#: describe.c:5705 #, c-format msgid "" "\n" @@ -2178,237 +2304,273 @@ msgstr "" "\n" "파서: \"%s\"" -#: describe.c:5265 -#, c-format -msgid "The server (version %s) does not support foreign-data wrappers." -msgstr "ì´ ì„œë²„(%s 버전)ì—서 외부 ë°ì´í„° 래í¼ë¥¼ ì§€ì›í•˜ì§€ 않습니다." - -#: describe.c:5323 +#: describe.c:5784 msgid "List of foreign-data wrappers" msgstr "외부 ë°ì´í„° ëž˜í¼ ëª©ë¡" -#: describe.c:5348 -#, c-format -msgid "The server (version %s) does not support foreign servers." -msgstr "ì´ ì„œë²„(%s 버전)ì—서 외부 서버를 ì§€ì›í•˜ì§€ 않습니다." - -#: describe.c:5361 +#: describe.c:5812 msgid "Foreign-data wrapper" msgstr "외부 ë°ì´í„° 래í¼" -#: describe.c:5379 describe.c:5584 +#: describe.c:5830 describe.c:6017 msgid "Version" msgstr "버전" -#: describe.c:5405 +#: describe.c:5860 msgid "List of foreign servers" msgstr "외부 서버 목ë¡" -#: describe.c:5430 -#, c-format -msgid "The server (version %s) does not support user mappings." -msgstr "ì´ ì„œë²„(%s 버전)ì—서 ì‚¬ìš©ìž ë§¤í•‘ì„ ì§€ì›í•˜ì§€ 않습니다." - -#: describe.c:5440 describe.c:5504 +#: describe.c:5885 describe.c:5943 msgid "Server" msgstr "서버" -#: describe.c:5441 +#: describe.c:5886 msgid "User name" msgstr "ì‚¬ìš©ìž ì´ë¦„" -#: describe.c:5466 +#: describe.c:5915 msgid "List of user mappings" msgstr "ì‚¬ìš©ìž ë§¤í•‘ 목ë¡" -#: describe.c:5491 -#, c-format -msgid "The server (version %s) does not support foreign tables." -msgstr "ì´ ì„œë²„(%s 버전)ì—서 외부 í…Œì´ë¸”ì„ ì§€ì›í•˜ì§€ 않습니다." - -#: describe.c:5544 +#: describe.c:5987 msgid "List of foreign tables" msgstr "외부 í…Œì´ë¸” 목ë¡" -#: describe.c:5569 describe.c:5626 -#, c-format -msgid "The server (version %s) does not support extensions." -msgstr "ì´ ì„œë²„(%s 버전)ì—서 í™•ìž¥ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않습니다." - -#: describe.c:5601 +#: describe.c:6038 msgid "List of installed extensions" msgstr "ì„¤ì¹˜ëœ í™•ìž¥ê¸°ëŠ¥ 목ë¡" -#: describe.c:5654 +#: describe.c:6086 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "\"%s\" ì´ë¦„ì˜ í™•ìž¥ 기능 ëª¨ë“ˆì„ ì°¾ì„ ìˆ˜ 없습니다." -#: describe.c:5657 +#: describe.c:6089 #, c-format msgid "Did not find any extensions." msgstr "추가할 확장 기능 ëª¨ë“ˆì´ ì—†ìŒ." -#: describe.c:5701 +#: describe.c:6133 msgid "Object description" msgstr "개체 설명" -#: describe.c:5711 +#: describe.c:6142 #, c-format msgid "Objects in extension \"%s\"" msgstr "\"%s\" 확장 기능 ì•ˆì— í¬í•¨ëœ ê°ì²´ë“¤" -#: describe.c:5740 describe.c:5816 +#: describe.c:6183 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "ì ë‹¹í•˜ì§€ ì•Šì€ qualified ì´ë¦„ 입니다 (너무 ë§Žì€ ì ì´ 있네요): %s" + +#: describe.c:6197 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "서로 다른 ë°ì´í„°ë² ì´ìŠ¤ê°„ì˜ ì°¸ì¡°ëŠ” 구현ë˜ì–´ìžˆì§€ 않습니다: %s" + +#: describe.c:6228 describe.c:6354 #, c-format msgid "The server (version %s) does not support publications." msgstr "ì´ ì„œë²„(%s 버전)는 논리 복제 발행 ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않습니다." -#: describe.c:5757 describe.c:5894 +#: describe.c:6245 describe.c:6432 msgid "All tables" msgstr "모든 í…Œì´ë¸”" -#: describe.c:5758 describe.c:5895 +#: describe.c:6246 describe.c:6433 msgid "Inserts" msgstr "Inserts" -#: describe.c:5759 describe.c:5896 +#: describe.c:6247 describe.c:6434 msgid "Updates" msgstr "Updates" -#: describe.c:5760 describe.c:5897 +#: describe.c:6248 describe.c:6435 msgid "Deletes" msgstr "Deletes" -#: describe.c:5764 describe.c:5899 +#: describe.c:6252 describe.c:6437 msgid "Truncates" -msgstr "" +msgstr "Truncates" -#: describe.c:5768 describe.c:5901 +#: describe.c:6256 describe.c:6439 msgid "Via root" -msgstr "" +msgstr "Via root" -#: describe.c:5785 +#: describe.c:6277 msgid "List of publications" msgstr "발행 목ë¡" -#: describe.c:5858 +#: describe.c:6401 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "\"%s\" ì´ë¦„ì˜ ë°œí–‰ ì—†ìŒ." -#: describe.c:5861 +#: describe.c:6404 #, c-format msgid "Did not find any publications." msgstr "발행 ì—†ìŒ." -#: describe.c:5890 +#: describe.c:6428 #, c-format msgid "Publication %s" msgstr "%s 발행" -#: describe.c:5938 +#: describe.c:6481 msgid "Tables:" -msgstr "í…Œì´ë¸”" +msgstr "í…Œì´ë¸”들:" + +#: describe.c:6493 +msgid "Tables from schemas:" +msgstr "ë‹¤ìŒ ìŠ¤í‚¤ë§ˆì˜ ëª¨ë“  í…Œì´ë¸”:" -#: describe.c:5982 +#: describe.c:6538 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "ì´ ì„œë²„(%s 버전)는 êµ¬ë… ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않습니다." -#: describe.c:5998 +#: describe.c:6554 msgid "Publication" msgstr "발행" -#: describe.c:6005 +#: describe.c:6563 +msgid "Binary" +msgstr "ë°”ì´ë„ˆë¦¬" + +#: describe.c:6572 describe.c:6576 +msgid "Streaming" +msgstr "스트리ë°" + +#: describe.c:6584 +msgid "Two-phase commit" +msgstr "2단계 커밋" + +#: describe.c:6585 +msgid "Disable on error" +msgstr "오류가 ìƒê¸°ë©´ 비활성" + +#: describe.c:6592 +msgid "Origin" +msgstr "오리진" + +#: describe.c:6593 +msgid "Password required" +msgstr "비밀번호 필요함" + +#: describe.c:6594 +msgid "Run as owner?" +msgstr "소유주 권한으로 실행?" + +#: describe.c:6599 +msgid "Failover" +msgstr "Failover" + +#: describe.c:6604 msgid "Synchronous commit" msgstr "ë™ê¸°ì‹ 커밋" -#: describe.c:6006 +#: describe.c:6605 msgid "Conninfo" msgstr "ì—°ê²°ì •ë³´" -#: describe.c:6028 +#: describe.c:6611 +msgid "Skip LSN" +msgstr "LSN 건너뜀" + +#: describe.c:6637 msgid "List of subscriptions" msgstr "êµ¬ë… ëª©ë¡" -#: describe.c:6095 describe.c:6184 describe.c:6270 describe.c:6353 +#: describe.c:6666 +msgid "(none)" +msgstr "(none)" + +#: describe.c:6706 describe.c:6801 describe.c:6893 describe.c:6987 msgid "AM" -msgstr "" +msgstr "AM" -#: describe.c:6096 +#: describe.c:6707 msgid "Input type" msgstr "ìž…ë ¥ ìžë£Œí˜•" -#: describe.c:6097 +#: describe.c:6708 msgid "Storage type" msgstr "스토리지 유형" -#: describe.c:6098 +#: describe.c:6709 msgid "Operator class" msgstr "ì—°ì‚°ìž í´ëž˜ìФ" -#: describe.c:6110 describe.c:6185 describe.c:6271 describe.c:6354 +#: describe.c:6721 describe.c:6802 describe.c:6894 describe.c:6988 msgid "Operator family" msgstr "ì—°ì‚°ìž ë¶€ë¥˜" -#: describe.c:6143 +#: describe.c:6756 msgid "List of operator classes" msgstr "ì—°ì‚°ìž í´ëž˜ìФ 목ë¡" -#: describe.c:6186 +#: describe.c:6803 msgid "Applicable types" -msgstr "" +msgstr "Applicable types" -#: describe.c:6225 +#: describe.c:6844 msgid "List of operator families" msgstr "ì—°ì‚°ìž ë¶€ë¥˜ 목ë¡" -#: describe.c:6272 +#: describe.c:6895 msgid "Operator" msgstr "ì—°ì‚°ìž" -#: describe.c:6273 +#: describe.c:6896 msgid "Strategy" msgstr "전략번호" -#: describe.c:6274 +#: describe.c:6897 msgid "ordering" -msgstr "" +msgstr "ordering" -#: describe.c:6275 +#: describe.c:6898 msgid "search" -msgstr "" +msgstr "search" -#: describe.c:6276 +#: describe.c:6899 msgid "Purpose" -msgstr "" +msgstr "Purpose" -#: describe.c:6281 +#: describe.c:6904 msgid "Sort opfamily" msgstr "ì •ë ¬ ì—°ì‚°ìž ë¶€ë¥˜" -#: describe.c:6312 +#: describe.c:6942 msgid "List of operators of operator families" msgstr "ì—°ì‚°ìž ë¶€ë¥˜ ì†Œì† ì—°ì‚°ìž ëª©ë¡" -#: describe.c:6355 +#: describe.c:6989 msgid "Registered left type" msgstr "등ë¡ëœ 왼쪽 ìžë£Œí˜•" -#: describe.c:6356 +#: describe.c:6990 msgid "Registered right type" msgstr "등ë¡ëœ 오른쪽 ìžë£Œí˜•" -#: describe.c:6357 +#: describe.c:6991 msgid "Number" -msgstr "" +msgstr "번호" -#: describe.c:6393 +#: describe.c:7034 msgid "List of support functions of operator families" msgstr "ì—°ì‚°ìž ë¶€ë¥˜ ì†Œì† ì§€ì› í•¨ìˆ˜ 목ë¡" -#: help.c:73 -#, c-format +#: describe.c:7065 +msgid "ID" +msgstr "ID" + +#: describe.c:7085 +msgid "Large objects" +msgstr "대형 ê°ì²´ë“¤" + +#: help.c:63 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2416,13 +2578,11 @@ msgstr "" "psqlì€ PostgreSQL ëŒ€í™”ì‹ í„°ë¯¸ë„입니다.\n" "\n" -#: help.c:74 help.c:355 help.c:431 help.c:474 -#, c-format +#: help.c:64 help.c:372 help.c:456 help.c:502 msgid "Usage:\n" msgstr "사용법:\n" -#: help.c:75 -#, c-format +#: help.c:65 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2430,38 +2590,31 @@ msgstr "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" -#: help.c:77 -#, c-format +#: help.c:67 msgid "General options:\n" msgstr "ì¼ë°˜ 옵션:\n" -#: help.c:82 -#, c-format +#: help.c:68 msgid "" " -c, --command=COMMAND run only single command (SQL or internal) and " "exit\n" msgstr "" " -c, --command=COMMAND í•˜ë‚˜ì˜ ëª…ë ¹(SQL ë˜ëŠ” ë‚´ë¶€ 명령)ë§Œ 실행하고 ë냄\n" -#: help.c:83 -#, c-format -msgid "" -" -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" -msgstr " -d, --dbname=DBNAME ì—°ê²°í•  ë°ì´í„°ë² ì´ìФ ì´ë¦„(기본 ê°’: \"%s\")\n" +#: help.c:69 +msgid " -d, --dbname=DBNAME database name to connect to\n" +msgstr " -d, --dbname=DBNAME ì—°ê²°í•  ë°ì´í„°ë² ì´ìФ ì´ë¦„\n" -#: help.c:84 -#, c-format +#: help.c:70 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=FILENAME íŒŒì¼ ì•ˆì— ì§€ì •í•œ ëª…ë ¹ì„ ì‹¤í–‰í•˜ê³  ë냄\n" -#: help.c:85 -#, c-format +#: help.c:71 msgid " -l, --list list available databases, then exit\n" msgstr "" " -l, --list 사용 가능한 ë°ì´í„°ë² ì´ìФ 목ë¡ì„ 표시하고 ë냄\n" -#: help.c:86 -#, c-format +#: help.c:72 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2471,18 +2624,15 @@ msgstr "" " psql 변수 NAMEì„ VALUE로 설정\n" " (예, -v ON_ERROR_STOP=1)\n" -#: help.c:89 -#, c-format +#: help.c:75 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: help.c:90 -#, c-format +#: help.c:76 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc 시작 파ì¼(~/.psqlrc)ì„ ì½ì§€ 않ìŒ\n" -#: help.c:91 -#, c-format +#: help.c:77 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-" @@ -2491,25 +2641,21 @@ msgstr "" " -1 (\"one\"), --single-transaction\n" " 명령 파ì¼ì„ í•˜ë‚˜ì˜ íŠ¸ëžœìž­ì…˜ìœ¼ë¡œ 실행\n" -#: help.c:93 -#, c-format +#: help.c:79 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] ì´ ë„움ë§ì„ 표시하고 종료\n" -#: help.c:94 -#, c-format +#: help.c:80 msgid " --help=commands list backslash commands, then exit\n" msgstr "" " --help=commands psql 내장명령어(\\문ìžë¡œ 시작하는)를 표시하고 종" "료\n" -#: help.c:95 -#, c-format +#: help.c:81 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables 특별 변수들 보여주고, 종료\n" -#: help.c:97 -#, c-format +#: help.c:83 msgid "" "\n" "Input and output options:\n" @@ -2517,64 +2663,53 @@ msgstr "" "\n" "입출력 옵션:\n" -#: help.c:98 -#, c-format +#: help.c:84 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all 스í¬ë¦½íŠ¸ì˜ ëª¨ë“  ìž…ë ¥ 표시\n" -#: help.c:99 -#, c-format +#: help.c:85 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors 실패한 명령들 출력\n" -#: help.c:100 -#, c-format +#: help.c:86 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries 서버로 보낸 명령 표시\n" -#: help.c:101 -#, c-format +#: help.c:87 msgid "" " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden ë‚´ë¶€ ëª…ë ¹ì´ ìƒì„±í•˜ëŠ” 쿼리 표시\n" -#: help.c:102 -#, c-format +#: help.c:88 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FILENAME 세션 로그를 파ì¼ë¡œ 보냄\n" -#: help.c:103 -#, c-format +#: help.c:89 msgid "" " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr "" " -n, --no-readline í™•ìž¥ëœ ëª…ë ¹í–‰ 편집 ê¸°ëŠ¥ì„ ì‚¬ìš©ì¤‘ì§€í•¨(readline)\n" -#: help.c:104 -#, c-format +#: help.c:90 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=FILENAME 쿼리 결과를 파ì¼(ë˜ëŠ” |파ì´í”„)로 보냄\n" -#: help.c:105 -#, c-format +#: help.c:91 msgid "" " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet ìžë™ 실행(메시지 ì—†ì´ ì¿¼ë¦¬ 결과만 표시)\n" -#: help.c:106 -#, c-format +#: help.c:92 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step ë‹¨ë… ìˆœì°¨ 모드(ê° ì¿¼ë¦¬ 확ì¸)\n" -#: help.c:107 -#, c-format +#: help.c:93 msgid "" " -S, --single-line single-line mode (end of line terminates SQL " "command)\n" msgstr " -S, --single-line 한 줄 모드(줄 ëì—서 SQL ëª…ë ¹ì´ ì¢…ë£Œë¨)\n" -#: help.c:109 -#, c-format +#: help.c:95 msgid "" "\n" "Output format options:\n" @@ -2582,18 +2717,16 @@ msgstr "" "\n" "출력 í˜•ì‹ ì˜µì…˜:\n" -#: help.c:110 -#, c-format +#: help.c:96 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align ì •ë ¬ë˜ì§€ ì•Šì€ í‘œ í˜•íƒœì˜ ì¶œë ¥ 모드\n" -#: help.c:111 -#, c-format +#: help.c:97 msgid "" " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv CSV (쉼표-분리 ìžë£Œ) í…Œì´ë¸” 출력 모드\n" -#: help.c:112 +#: help.c:98 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2601,24 +2734,21 @@ msgid "" "\"%s\")\n" msgstr "" " -F, --field-separator=STRING\n" -" unaligned 출력용 필드 êµ¬ë¶„ìž ì„¤ì •(기본 ê°’: \"%s" -"\")\n" +" unaligned 출력용 필드 êµ¬ë¶„ìž ì„¤ì •(기본 ê°’: " +"\"%s\")\n" -#: help.c:115 -#, c-format +#: help.c:101 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML 표 형태 출력 모드\n" -#: help.c:116 -#, c-format +#: help.c:102 msgid "" " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset " "command)\n" msgstr "" " -P, --pset=VAR[=ARG] ì¸ì‡„ 옵션 VARì„ ARG로 설정(\\pset 명령 참조)\n" -#: help.c:117 -#, c-format +#: help.c:103 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: " @@ -2628,26 +2758,22 @@ msgstr "" " unaligned 출력용 레코드 êµ¬ë¶„ìž ì„¤ì •\n" " (기본 ê°’: 줄바꿈 문ìž)\n" -#: help.c:119 -#, c-format +#: help.c:105 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only 행만 ì¸ì‡„\n" -#: help.c:120 -#, c-format +#: help.c:106 msgid "" " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, " "border)\n" msgstr "" " -T, --table-attr=TEXT HTML table 태그 ì†ì„± 설정(예: width, border)\n" -#: help.c:121 -#, c-format +#: help.c:107 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded í™•ìž¥ëœ í‘œ 형태로 출력\n" -#: help.c:122 -#, c-format +#: help.c:108 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero " @@ -2656,8 +2782,7 @@ msgstr "" " -z, --field-separator-zero\n" " unaligned 출력용 필드 구분ìžë¥¼ 0 ë°”ì´íŠ¸ë¡œ 지정\n" -#: help.c:124 -#, c-format +#: help.c:110 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero " @@ -2666,8 +2791,7 @@ msgstr "" " -0, --record-separator-zero\n" " unaligned 출력용 레코드 구분ìžë¥¼ 0 ë°”ì´íŠ¸ë¡œ 지정\n" -#: help.c:127 -#, c-format +#: help.c:113 msgid "" "\n" "Connection options:\n" @@ -2675,47 +2799,34 @@ msgstr "" "\n" "ì—°ê²° 옵션들:\n" -#: help.c:130 -#, c-format -msgid "" -" -h, --host=HOSTNAME database server host or socket directory " -"(default: \"%s\")\n" +#: help.c:114 +msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HOSTNAME ë°ì´í„°ë² ì´ìФ 서버 호스트 ë˜ëŠ” 소켓 디렉터리\n" -" (기본값: \"%s\")\n" -#: help.c:131 -msgid "local socket" -msgstr "로컬 소켓" - -#: help.c:134 -#, c-format -msgid " -p, --port=PORT database server port (default: \"%s\")\n" -msgstr " -p, --port=PORT ë°ì´í„°ë² ì´ìФ 서버 í¬íЏ(기본 ê°’: \"%s\")\n" +#: help.c:115 +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT ë°ì´í„°ë² ì´ìФ 서버 í¬íЏ\n" -#: help.c:140 -#, c-format -msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" -msgstr " -U, --username=USERNAME ë°ì´í„°ë² ì´ìФ ì‚¬ìš©ìž ì´ë¦„(기본 ê°’: \"%s\")\n" +#: help.c:116 +msgid " -U, --username=USERNAME database user name\n" +msgstr " -U, --username=USERNAME ë°ì´í„°ë² ì´ìФ ì‚¬ìš©ìž ì´ë¦„\n" -#: help.c:141 -#, c-format +#: help.c:117 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n" -#: help.c:142 -#, c-format +#: help.c:118 msgid "" " -W, --password force password prompt (should happen " "automatically)\n" msgstr " -W, --password 암호 ìž…ë ¥ 프롬프트 ë³´ìž„(ìžë™ìœ¼ë¡œ 처리함)\n" -#: help.c:144 -#, c-format +#: help.c:120 msgid "" "\n" -"For more information, type \"\\?\" (for internal commands) or \"\\help" -"\" (for SQL\n" +"For more information, type \"\\?\" (for internal commands) or \"\\help\" " +"(for SQL\n" "commands) from within psql, or consult the psql section in the PostgreSQL\n" "documentation.\n" "\n" @@ -2726,109 +2837,108 @@ msgstr "" "설명서ì—서 psql ì„¹ì…˜ì„ ì°¸ì¡°í•˜ì‹­ì‹œì˜¤.\n" "\n" -#: help.c:147 +#: help.c:123 #, c-format msgid "Report bugs to <%s>.\n" msgstr "ë¬¸ì œì  ë³´ê³  주소: <%s>\n" -#: help.c:148 +#: help.c:124 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페ì´ì§€: <%s>\n" -#: help.c:174 -#, c-format +#: help.c:166 msgid "General\n" msgstr "ì¼ë°˜\n" -#: help.c:175 -#, c-format +#: help.c:167 +msgid " \\bind [PARAM]... set query parameters\n" +msgstr " \\bind [PARAM]... 쿼리 매개 변수 지정\n" + +#: help.c:168 msgid "" " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright PostgreSQL 사용법 ë° ì €ìž‘ê¶Œ ì •ë³´ 표시\n" -#: help.c:176 -#, c-format +#: help.c:169 msgid "" -" \\crosstabview [COLUMNS] execute query and display results in crosstab\n" +" \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr "" " \\crosstabview [칼럼들] 쿼리를 실행하고, 피봇 í…Œì´ë¸” 형태로 ìžë£Œë¥¼ 보여줌\n" -#: help.c:177 -#, c-format +#: help.c:170 msgid "" " \\errverbose show most recent error message at maximum " "verbosity\n" msgstr "" " \\errverbose 최대 ìžì„¸ížˆ 보기 ìƒíƒœì—서 최근 오류를 다 보여줌\n" -#: help.c:178 -#, c-format +#: help.c:171 msgid "" -" \\g [(OPTIONS)] [FILE] execute query (and send results to file or |" -"pipe);\n" +" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" msgstr "" -" \\g [(OPTIONS)] [FILE] 쿼리 실행 (결과는 지정한 파ì¼ë¡œ, ë˜ëŠ” | 파ì´í”„로);\n" +" \\g [(OPTIONS)] [FILE] 쿼리 실행 (결과는 지정한 파ì¼ë¡œ, ë˜ëŠ” |파ì´í”„로);\n" " \\g 명령ì—서 ì¸ìžê°€ 없으면 세미콜론과 ê°™ìŒ\n" -#: help.c:180 -#, c-format +#: help.c:173 msgid "" " \\gdesc describe result of query, without executing it\n" msgstr "" " \\gdesc 쿼리를 실행하지 않고 ê·¸ ê²°ê³¼ 칼럼과 ìžë£Œí˜•ì„ ì¶œë ¥\n" -#: help.c:181 -#, c-format +#: help.c:174 msgid "" " \\gexec execute query, then execute each value in its " "result\n" msgstr " \\gexec 쿼리를 실행하고, ê·¸ 결과를 ê°ê° 실행 함\n" -#: help.c:182 -#, c-format +#: help.c:175 msgid "" -" \\gset [PREFIX] execute query and store results in psql variables\n" +" \\gset [PREFIX] execute query and store result in psql variables\n" msgstr " \\gset [PREFIX] 쿼리 실행 ë’¤ ê·¸ 결과를 psql 변수로 저장\n" -#: help.c:183 -#, c-format +#: help.c:176 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" -msgstr " \\gx [(OPTIONS)] [FILE] \\g 명령과 같으나, ì¶œë ¥ì„ í™•ìž¥ 모드로 강제함\n" +msgstr "" +" \\gx [(OPTIONS)] [FILE] \\g 명령과 같으나, ì¶œë ¥ì„ í™•ìž¥ 모드로 강제함\n" -#: help.c:184 -#, c-format +#: help.c:177 msgid " \\q quit psql\n" msgstr " \\q psql 종료\n" -#: help.c:185 -#, c-format -msgid " \\watch [SEC] execute query every SEC seconds\n" -msgstr " \\watch [SEC] 매 초마다 쿼리 실행\n" +#: help.c:178 +msgid "" +" \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" execute query every SEC seconds, up to N times,\n" +" stop if less than MIN rows are returned\n" +msgstr "" +" \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" SEC ì´ˆ 마다 쿼리 반복, N 회만 실행,\n" +" MIN 로우 보다 ì ê²Œ 출력하면 중지\n" -#: help.c:188 -#, c-format +#: help.c:181 help.c:189 help.c:201 help.c:211 help.c:218 help.c:275 help.c:283 +#: help.c:303 help.c:316 help.c:325 +msgid "\n" +msgstr "\n" + +#: help.c:183 msgid "Help\n" msgstr "ë„움ë§\n" -#: help.c:190 -#, c-format +#: help.c:185 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] psql 역슬래시 명령어 설명\n" -#: help.c:191 -#, c-format +#: help.c:186 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options psql 명령행 옵션 ë„ì›€ë§ ë³´ê¸°\n" -#: help.c:192 -#, c-format +#: help.c:187 msgid " \\? variables show help on special variables\n" msgstr " \\? variables psql 환경 설정 ë³€ìˆ˜ë“¤ì— ì„¤ëª… 보기\n" -#: help.c:193 -#, c-format +#: help.c:188 msgid "" " \\h [NAME] help on syntax of SQL commands, * for all " "commands\n" @@ -2836,56 +2946,46 @@ msgstr "" " \\h [NAME] SQL 명령 구문 ë„움ë§, 모든 ëª…ë ¹ì„ í‘œì‹œí•˜ë ¤ë©´ * ìž…" "ë ¥\n" -#: help.c:196 -#, c-format +#: help.c:191 msgid "Query Buffer\n" msgstr "쿼리 버í¼\n" -#: help.c:197 -#, c-format +#: help.c:192 msgid "" " \\e [FILE] [LINE] edit the query buffer (or file) with external " "editor\n" msgstr " \\e [FILE] [LINE] 외부 편집기로 쿼리 버í¼(ë˜ëŠ” 파ì¼) 편집\n" -#: help.c:198 -#, c-format +#: help.c:193 msgid "" " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNCNAME [LINE]] 외부 편집기로 해당 함수 ë‚´ìš© 편집\n" -#: help.c:199 -#, c-format +#: help.c:194 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [VIEWNAME [LINE]] 외부 편집기로 해당 ë·° ì •ì˜ íŽ¸ì§‘\n" -#: help.c:200 -#, c-format +#: help.c:195 msgid " \\p show the contents of the query buffer\n" msgstr " \\p 쿼리 버í¼ì˜ ë‚´ìš© 표시\n" -#: help.c:201 -#, c-format +#: help.c:196 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r 쿼리 ë²„í¼ ì´ˆê¸°í™”(ëª¨ë‘ ì§€ì›€)\n" -#: help.c:203 -#, c-format +#: help.c:198 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [FILE] ê¸°ë¡ í‘œì‹œ ë˜ëŠ” 파ì¼ì— 저장\n" -#: help.c:205 -#, c-format +#: help.c:200 msgid " \\w FILE write query buffer to file\n" msgstr " \\w FILE 쿼리 버í¼ë¥¼ 파ì¼ì— 기ë¡\n" -#: help.c:208 -#, c-format +#: help.c:203 msgid "Input/Output\n" msgstr "ìž…ë ¥/출력\n" -#: help.c:209 -#, c-format +#: help.c:204 msgid "" " \\copy ... perform SQL COPY with data stream to the client " "host\n" @@ -2893,367 +2993,344 @@ msgstr "" " \\copy ... í´ë¼ì´ì–¸íЏ í˜¸ìŠ¤íŠ¸ì— ìžˆëŠ” ìžë£Œë¥¼ SQL COPY 명령 실" "í–‰\n" -#: help.c:210 -#, c-format +#: help.c:205 msgid "" " \\echo [-n] [STRING] write string to standard output (-n for no " "newline)\n" msgstr " \\echo [-n] [STRING] 문ìžì—´ì„ 표준 ì¶œë ¥ì— ê¸°ë¡ (-n 줄바꿈 ì—†ìŒ)\n" -#: help.c:211 -#, c-format +#: help.c:206 msgid " \\i FILE execute commands from file\n" msgstr " \\i FILE 파ì¼ì—서 명령 실행\n" -#: help.c:212 -#, c-format +#: help.c:207 msgid "" " \\ir FILE as \\i, but relative to location of current " "script\n" msgstr "" " \\ir FILE \\i 명령과 같으나, 경로가 현재 위치 기준 ìƒëŒ€ì \n" -#: help.c:213 -#, c-format +#: help.c:208 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [FILE] 모든 쿼리 결과를 íŒŒì¼ ë˜ëŠ” |파ì´í”„로 보냄\n" -#: help.c:214 -#, c-format +#: help.c:209 msgid "" " \\qecho [-n] [STRING] write string to \\o output stream (-n for no " "newline)\n" -msgstr " \\qecho [-n] [STRING] 문ìžì—´ì„ \\o 출력 ìŠ¤íŠ¸ë¦¼ì— ê¸°ë¡ (-n 줄바꿈 ì—†ìŒ)\n" +msgstr "" +" \\qecho [-n] [STRING] 문ìžì—´ì„ \\o 출력 ìŠ¤íŠ¸ë¦¼ì— ê¸°ë¡ (-n 줄바꿈 ì—†ìŒ)\n" -#: help.c:215 -#, c-format +#: help.c:210 msgid "" " \\warn [-n] [STRING] write string to standard error (-n for no " "newline)\n" msgstr " \\warn [-n] [STRING] 문ìžì—´ì„ stderrì— ê¸°ë¡ (-n 줄바꿈 ì—†ìŒ)\n" -#: help.c:218 -#, c-format +#: help.c:213 msgid "Conditional\n" msgstr "조건문\n" -#: help.c:219 -#, c-format +#: help.c:214 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR 조건문 시작\n" -#: help.c:220 -#, c-format +#: help.c:215 msgid "" " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR else if 구문 시작\n" -#: help.c:221 -#, c-format +#: help.c:216 msgid "" " \\else final alternative within current conditional " "block\n" msgstr " \\else ì¡°ê±´ë¬¸ì˜ ê·¸ 외 ì¡°ê±´\n" -#: help.c:222 -#, c-format +#: help.c:217 msgid " \\endif end conditional block\n" msgstr " \\endif 조건문 ë\n" -#: help.c:225 -#, c-format +#: help.c:220 msgid "Informational\n" msgstr "정보보기\n" -#: help.c:226 -#, c-format +#: help.c:221 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (옵션: S = 시스템 개체 표시, + = 추가 ìƒì„¸ ì •ë³´)\n" -#: help.c:227 -#, c-format +#: help.c:222 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] í…Œì´ë¸”, ë·° ë° ì‹œí€€ìŠ¤ 목ë¡\n" -#: help.c:228 -#, c-format +#: help.c:223 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NAME í…Œì´ë¸”, ë·°, 시퀀스 ë˜ëŠ” ì¸ë±ìФ 설명\n" -#: help.c:229 -#, c-format +#: help.c:224 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [PATTERN] 집계 함수 목ë¡\n" -#: help.c:230 -#, c-format +#: help.c:225 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [PATTERN] ì ‘ê·¼ 방법 목ë¡\n" -#: help.c:231 -#, c-format +#: help.c:226 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] ì—°ì‚°ìž í´ëž˜ìФ 목ë¡\n" -#: help.c:232 -#, c-format +#: help.c:227 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] ì—°ì‚°ìž ë¶€ë¥˜ 목ë¡\n" -#: help.c:233 -#, c-format +#: help.c:228 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] ì—°ì‚°ìž ë¶€ë¥˜ ì†Œì† ì—°ì‚°ìž ëª©ë¡\n" -#: help.c:234 -#, c-format +#: help.c:229 msgid "" -" \\dAp [AMPTRN [OPFPTRN]] list support functions of operator families\n" -msgstr "" -" \\dAp [AMPTRN [OPFPTRN]] ì—°ì‚°ìž ê°€ì¡±ì— í¬í•¨ëœ ì§€ì› í•¨ìˆ˜ 목ë¡\n" +" \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] ì—°ì‚°ìž ê°€ì¡±ì— í¬í•¨ëœ ì§€ì› í•¨ìˆ˜ 목ë¡\n" -#: help.c:235 -#, c-format +#: help.c:230 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [PATTERN] í…Œì´ë¸”스페ì´ìФ 목ë¡\n" -#: help.c:236 -#, c-format +#: help.c:231 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [PATTERN] 문ìžì…‹ ë³€í™˜ìž ëª©ë¡\n" -#: help.c:237 -#, c-format +#: help.c:232 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [PATTERN] 환경설정 매개변수 목ë¡\n" + +#: help.c:233 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [PATTERN] ìžë£Œí˜• ë³€í™˜ìž ëª©ë¡\n" -#: help.c:238 -#, c-format +#: help.c:234 msgid "" " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr "" " \\dd[S] [PATTERN] 다른 ê³³ì—서는 ë³¼ 수 없는 ê°ì²´ ì„¤ëª…ì„ ë³´ì—¬ì¤Œ\n" -#: help.c:239 -#, c-format +#: help.c:235 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [PATTERN] ë„ë©”ì¸ ëª©ë¡\n" -#: help.c:240 -#, c-format +#: help.c:236 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [PATTERN] 기본 접근권한 목ë¡\n" -#: help.c:241 -#, c-format +#: help.c:237 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [PATTERN] 외부 í…Œì´ë¸” 목ë¡\n" -#: help.c:242 -#, c-format -msgid " \\det[+] [PATTERN] list foreign tables\n" -msgstr " \\det[+] [PATTERN] 외부 í…Œì´ë¸” 목ë¡\n" - -#: help.c:243 -#, c-format +#: help.c:238 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [PATTERN] 외부 서버 목ë¡\n" -#: help.c:244 -#, c-format +#: help.c:239 +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [PATTERN] 외부 í…Œì´ë¸” 목ë¡\n" + +#: help.c:240 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [PATTERN] ì‚¬ìš©ìž ë§¤í•‘ 목ë¡\n" -#: help.c:245 -#, c-format +#: help.c:241 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [PATTERN] 외부 ë°ì´í„° ëž˜í¼ ëª©ë¡\n" -#: help.c:246 -#, c-format +#: help.c:242 msgid "" -" \\df[anptw][S+] [PATRN] list [only agg/normal/procedures/trigger/window] " +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" list [only agg/normal/procedure/trigger/window] " "functions\n" msgstr "" -" \\df[anptw][S+] [PATRN] [agg/normal/procedures/trigger/window] 함수 목ë¡\n" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" [agg/normal/procedure/trigger/window 단ì¼] 함수 목" +"ë¡\n" -#: help.c:247 -#, c-format +#: help.c:244 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [PATTERN] í…스트 검색 구성 목ë¡\n" -#: help.c:248 -#, c-format +#: help.c:245 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [PATTERN] í…스트 검색 사전 목ë¡\n" -#: help.c:249 -#, c-format +#: help.c:246 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [PATTERN] í…스트 검색 파서 목ë¡\n" -#: help.c:250 -#, c-format +#: help.c:247 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [PATTERN] í…스트 검색 템플릿 목ë¡\n" -#: help.c:251 -#, c-format +#: help.c:248 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [PATTERN] 롤 목ë¡\n" -#: help.c:252 -#, c-format +#: help.c:249 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [PATTERN] ì¸ë±ìФ 목ë¡\n" -#: help.c:253 -#, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl í° ê°œì²´ 목ë¡, \\lo_list 명령과 ê°™ìŒ\n" +#: help.c:250 +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] í° ê°œì²´ 목ë¡, \\lo_list 명령과 ê°™ìŒ\n" -#: help.c:254 -#, c-format +#: help.c:251 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [PATTERN] 프로시져 언어 목ë¡\n" -#: help.c:255 -#, c-format +#: help.c:252 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [PATTERN] materialized ë·° 목ë¡\n" -#: help.c:256 -#, c-format +#: help.c:253 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [PATTERN] 스키마 목ë¡\n" -#: help.c:257 -#, c-format -msgid " \\do[S] [PATTERN] list operators\n" -msgstr " \\do[S] [PATTERN] ì—°ì‚°ìž ëª©ë¡\n" +#: help.c:254 +msgid "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" list operators\n" +msgstr "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" ì—°ì‚°ìž ëª©ë¡\n" -#: help.c:258 -#, c-format +#: help.c:256 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [PATTERN] collation 목ë¡\n" -#: help.c:259 -#, c-format +#: help.c:257 msgid "" -" \\dp [PATTERN] list table, view, and sequence access privileges\n" -msgstr " \\dp [PATTERN] í…Œì´ë¸”, ë·° ë° ì‹œí€€ìŠ¤ 액세스 권한 목ë¡\n" +" \\dp[S] [PATTERN] list table, view, and sequence access privileges\n" +msgstr " \\dp[S] [PATTERN] í…Œì´ë¸”, ë·° ë° ì‹œí€€ìŠ¤ 액세스 권한 목ë¡\n" -#: help.c:260 -#, c-format +#: help.c:258 msgid "" " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations " "[n=nested]\n" msgstr "" " \\dP[itn+] [PATTERN] 파티션 릴레ì´ì…˜ ëª©ë¡ [ì¸ë±ìФ/í…Œì´ë¸”ë§Œ] [n=nested]\n" -#: help.c:261 -#, c-format -msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" -msgstr " \\drds [PATRN1 [PATRN2]] ë°ì´í„°ë² ì´ìŠ¤ë³„ 롤 설정 목ë¡\n" +#: help.c:259 +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgstr " \\drds [ROLEPTRN [DBPTRN]] per-database 롤 설정 목ë¡\n" -#: help.c:262 -#, c-format +#: help.c:260 +msgid " \\drg[S] [PATTERN] list role grants\n" +msgstr " \\drg[S] [PATTERN] 롤 부여 목ë¡\n" + +#: help.c:261 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [PATTERN] 복제 발행 목ë¡\n" -#: help.c:263 -#, c-format +#: help.c:262 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [PATTERN] 복제 êµ¬ë… ëª©ë¡\n" -#: help.c:264 -#, c-format +#: help.c:263 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [PATTERN] 시퀀스 목ë¡\n" -#: help.c:265 -#, c-format +#: help.c:264 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [PATTERN] í…Œì´ë¸” 목ë¡\n" -#: help.c:266 -#, c-format +#: help.c:265 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [PATTERN] ë°ì´í„° í˜•ì‹ ëª©ë¡\n" -#: help.c:267 -#, c-format +#: help.c:266 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [PATTERN] 롤 목ë¡\n" -#: help.c:268 -#, c-format +#: help.c:267 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [PATTERN] ë·° 목ë¡\n" -#: help.c:269 -#, c-format +#: help.c:268 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [PATTERN] 확장 모듈 목ë¡\n" +#: help.c:269 +msgid " \\dX [PATTERN] list extended statistics\n" +msgstr " \\dX [PATTERN] 확장 통계 ì •ë³´ 목ë¡\n" + #: help.c:270 -#, c-format -msgid " \\dy [PATTERN] list event triggers\n" -msgstr " \\dy [PATTERN] ì´ë²¤íЏ 트리거 목ë¡\n" +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [PATTERN] ì´ë²¤íЏ 트리거 목ë¡\n" #: help.c:271 -#, c-format msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [PATTERN] ë°ì´í„°ë² ì´ìФ 목ë¡\n" #: help.c:272 -#, c-format msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] 함수ì´ë¦„ 함수 ì •ì˜ ë³´ê¸°\n" #: help.c:273 -#, c-format msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] ë·°ì´ë¦„ ë·° ì •ì˜ ë³´ê¸°\n" #: help.c:274 -#, c-format -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [PATTERN] \\dp와 ê°™ìŒ\n" +msgid " \\z[S] [PATTERN] same as \\dp\n" +msgstr " \\z[S] [PATTERN] \\dp 와 ê°™ìŒ\n" #: help.c:277 -#, c-format +msgid "Large Objects\n" +msgstr "í° ê°œì²´\n" + +#: help.c:278 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr " \\lo_export LOBOID FILE í° ê°œì²´ë¥¼ 파ì¼ë¡œ 저장\n" + +#: help.c:279 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import FILE [COMMENT]\n" +" 파ì¼ì—서 í° ê°œì²´ 가져오기\n" + +#: help.c:281 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] í° ê°œì²´ 목ë¡\n" + +#: help.c:282 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink LOBOID í° ê°œì²´ ì‚­ì œ\n" + +#: help.c:285 msgid "Formatting\n" msgstr "출력 형ì‹\n" -#: help.c:278 -#, c-format +#: help.c:286 msgid "" " \\a toggle between unaligned and aligned output mode\n" msgstr "" " \\a ì •ë ¬ë˜ì§€ ì•Šì€ ì¶œë ¥ 모드와 ì •ë ¬ëœ ì¶œë ¥ 모드 전환\n" -#: help.c:279 -#, c-format +#: help.c:287 msgid " \\C [STRING] set table title, or unset if none\n" msgstr "" " \\C [STRING] í…Œì´ë¸” 제목 설정 ë˜ëŠ” ê°’ì´ ì—†ëŠ” 경우 설정 안 함\n" -#: help.c:280 -#, c-format +#: help.c:288 msgid "" " \\f [STRING] show or set field separator for unaligned query " "output\n" msgstr "" " \\f [STRING] unaligned ì¶œë ¥ì— ëŒ€í•´ 필드 êµ¬ë¶„ìž í‘œì‹œ ë˜ëŠ” 설정\n" -#: help.c:281 +#: help.c:289 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H HTML 출력 모드 전환(현재 %s)\n" -#: help.c:283 -#, c-format +#: help.c:291 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3261,7 +3338,7 @@ msgid "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" msgstr "" " \\pset [ì´ë¦„ [ê°’]] í…Œì´ë¸” 출력 옵션 설정\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3269,32 +3346,34 @@ msgstr "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" -#: help.c:290 +#: help.c:298 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] 행만 표시(현재 %s)\n" -#: help.c:292 -#, c-format +#: help.c:300 msgid "" " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr "" " \\T [STRING] HTML
태그 ì†ì„± 설정 ë˜ëŠ” 비었는 경우 설정 " "안 함\n" -#: help.c:293 +#: help.c:301 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] í™•ìž¥ëœ ì¶œë ¥ 전환 (현재 %s)\n" -#: help.c:297 -#, c-format +#: help.c:302 +msgid "auto" +msgstr "ìžë™" + +#: help.c:305 msgid "Connection\n" msgstr "ì—°ê²°\n" -#: help.c:299 +#: help.c:307 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3303,8 +3382,7 @@ msgstr "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " 새 ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì† (현재 \"%s\")\n" -#: help.c:303 -#, c-format +#: help.c:311 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3312,62 +3390,56 @@ msgstr "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " 새 ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì† (현재 ì ‘ì†í•´ 있지 않ìŒ)\n" -#: help.c:305 -#, c-format +#: help.c:313 msgid "" " \\conninfo display information about current connection\n" msgstr " \\conninfo 현재 ë°ì´í„°ë² ì´ìФ ì ‘ì† ì •ë³´ 보기\n" -#: help.c:306 -#, c-format +#: help.c:314 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [ENCODING] í´ë¼ì´ì–¸íЏ ì¸ì½”딩 표시 ë˜ëŠ” 설정\n" -#: help.c:307 -#, c-format +#: help.c:315 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [USERNAME] ì‚¬ìš©ìž ì•”í˜¸ë¥¼ 안전하게 변경\n" -#: help.c:310 -#, c-format +#: help.c:318 msgid "Operating System\n" msgstr "ìš´ì˜ ì²´ì œ\n" -#: help.c:311 -#, c-format +#: help.c:319 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [DIR] 현재 작업 디렉터리 변경\n" -#: help.c:312 -#, c-format +#: help.c:320 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv PSQLVAR ENVVAR 환경 ë³€ìˆ˜ê°’ì„ psql 변수값으로\n" + +#: help.c:321 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NAME [VALUE] 환경 변수 지정 ë° í•´ì œ\n" -#: help.c:313 +#: help.c:322 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] 명령 실행 시간 전환(현재 %s)\n" -#: help.c:315 -#, c-format +#: help.c:324 msgid "" " \\! [COMMAND] execute command in shell or start interactive " "shell\n" msgstr " \\! [COMMAND] ì…¸ 명령 실행 ë˜ëŠ” ëŒ€í™”ì‹ ì…¸ 시작\n" -#: help.c:318 -#, c-format +#: help.c:327 msgid "Variables\n" msgstr "변수\n" -#: help.c:319 -#, c-format +#: help.c:328 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr "" " \\prompt [TEXT] NAME 사용ìžì—게 ë‚´ë¶€ 변수를 설정하ë¼ëŠ” 메시지 표시\n" -#: help.c:320 -#, c-format +#: help.c:329 msgid "" " \\set [NAME [VALUE]] set internal variable, or list all if no " "parameters\n" @@ -3375,43 +3447,21 @@ msgstr "" " \\set [NAME [VALUE]] ë‚´ë¶€ 변수 설정 ë˜ëŠ” 미지정 경우 모든 변수 ëª©ë¡ í‘œ" "시\n" -#: help.c:321 -#, c-format +#: help.c:330 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NAME ë‚´ë¶€ 변수 설정 í•´ì œ(ì‚­ì œ)\n" -#: help.c:324 -#, c-format -msgid "Large Objects\n" -msgstr "í° ê°œì²´\n" - -#: help.c:325 -#, c-format -msgid "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID large object operations\n" -msgstr "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID í° ê°œì²´ 작업\n" - -#: help.c:352 -#, c-format +#: help.c:369 msgid "" "List of specially treated variables\n" "\n" msgstr "특별한 기능 설정 변수 목ë¡\n" -#: help.c:354 -#, c-format +#: help.c:371 msgid "psql variables:\n" msgstr "psql 변수들:\n" -#: help.c:356 -#, c-format +#: help.c:373 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3421,8 +3471,7 @@ msgstr "" " ë˜ëŠ” psql 명령 모드ì—서는 \\set NAME VALUE\n" "\n" -#: help.c:358 -#, c-format +#: help.c:375 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3430,8 +3479,7 @@ msgstr "" " AUTOCOMMIT\n" " 설정 ë˜ë©´, SQL ëª…ë ¹ì´ ì •ìƒ ì‹¤í–‰ ë˜ë©´ ìžë™ 커밋 함\n" -#: help.c:360 -#, c-format +#: help.c:377 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3441,8 +3489,7 @@ msgstr "" " SQL 키워드 ìžë™ì™„성ì—서 ëŒ€ì†Œë¬¸ìž ì²˜ë¦¬\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:363 -#, c-format +#: help.c:380 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3450,8 +3497,7 @@ msgstr "" " DBNAME\n" " 현재 ì ‘ì†í•œ ë°ì´í„°ë² ì´ìФ ì´ë¦„\n" -#: help.c:365 -#, c-format +#: help.c:382 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3461,8 +3507,7 @@ msgstr "" " ìž…ë ¥ì„ í‘œì¤€ 출력으로 보낼 종류\n" " [all, errors, none, queries]\n" -#: help.c:368 -#, c-format +#: help.c:385 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3472,8 +3517,7 @@ msgstr "" " 지정 ë˜ë©´ psql 내장 ëª…ë ¹ì–´ì˜ ë‚´ë¶€ 쿼리를 출력함;\n" " \"noexec\" 값으로 설정하면, 실행ë˜ì§€ 않고 쿼리만 보여줌\n" -#: help.c:371 -#, c-format +#: help.c:388 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3481,17 +3525,15 @@ msgstr "" " ENCODING\n" " 현재 í´ë¼ì´ì–¸íЏ ì¸ì½”딩 지정\n" -#: help.c:373 -#, c-format +#: help.c:390 msgid "" " ERROR\n" -" true if last query failed, else false\n" +" \"true\" if last query failed, else \"false\"\n" msgstr "" " ERROR\n" -" 마지막 쿼리가 실패했으면 true, 아니면 false\n" +" 마지막 쿼리가 실패했으면 \"true\", 아니면 \"false\"\n" -#: help.c:375 -#, c-format +#: help.c:392 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = " @@ -3500,8 +3542,7 @@ msgstr "" " FETCH_COUNT\n" " 쿼리 ê²°ê³¼ì— ëŒ€í•´ì„œ 출력할 최대 로우 개수 (0=제한없ìŒ)\n" -#: help.c:377 -#, c-format +#: help.c:394 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3509,8 +3550,15 @@ msgstr "" " HIDE_TABLEAM\n" " 지정하면 í…Œì´ë¸” ì ‘ê·¼ ë°©ë²•ì„ ë³´ì—¬ì£¼ì§€ 않ìŒ\n" -#: help.c:379 -#, c-format +#: help.c:396 +msgid "" +" HIDE_TOAST_COMPRESSION\n" +" if set, compression methods are not displayed\n" +msgstr "" +" HIDE_TOAST_COMPRESSION\n" +" 지정하면 TOAST ì••ì¶• 종류 보여주지 않ìŒ\n" + +#: help.c:398 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3518,8 +3566,7 @@ msgstr "" " HISTCONTROL\n" " 명령 ë‚´ì—­ 처리 방법 [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:381 -#, c-format +#: help.c:400 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3527,8 +3574,7 @@ msgstr "" " HISTFILE\n" " 명령 ë‚´ì—­ì„ ì €ìž¥í•  íŒŒì¼ ì´ë¦„\n" -#: help.c:383 -#, c-format +#: help.c:402 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3536,8 +3582,7 @@ msgstr "" " HISTSIZE\n" " 명령 ë‚´ì—­ 최대 ë³´ê´€ 개수\n" -#: help.c:385 -#, c-format +#: help.c:404 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3545,8 +3590,7 @@ msgstr "" " HOST\n" " 현재 ì ‘ì†í•œ ë°ì´í„°ë² ì´ìФ 서버 호스트\n" -#: help.c:387 -#, c-format +#: help.c:406 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3554,8 +3598,7 @@ msgstr "" " IGNOREEOF\n" " 대화형 세션 종료를 위한 EOF 개수\n" -#: help.c:389 -#, c-format +#: help.c:408 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3563,8 +3606,7 @@ msgstr "" " LASTOID\n" " 마지막 ì˜í–¥ ë°›ì€ OID ê°’\n" -#: help.c:391 -#, c-format +#: help.c:410 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3575,8 +3617,7 @@ msgstr "" " LAST_ERROR_SQLSTATE\n" " 마지막 오류 메시지와 SQLSTATE, ì •ìƒì´ë©´, 빈 문ìžì—´ê³¼ \"00000\"\n" -#: help.c:394 -#, c-format +#: help.c:413 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3584,8 +3625,7 @@ msgstr "" " ON_ERROR_ROLLBACK\n" " 설정하면 오류 ë°œìƒì‹œì—ë„ íŠ¸ëžœìž­ì…˜ 중지 안함 (savepoint ì•”ë¬µì  ì‚¬ìš©)\n" -#: help.c:396 -#, c-format +#: help.c:415 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3593,8 +3633,7 @@ msgstr "" " ON_ERROR_STOP\n" " 배치 작업 시 오류가 ë°œìƒí•˜ë©´ 중지함\n" -#: help.c:398 -#, c-format +#: help.c:417 msgid "" " PORT\n" " server port of the current connection\n" @@ -3602,8 +3641,7 @@ msgstr "" " PORT\n" " 현재 ì ‘ì†í•œ 서버 í¬íЏ\n" -#: help.c:400 -#, c-format +#: help.c:419 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3611,8 +3649,7 @@ msgstr "" " PROMPT1\n" " 기본 psql 프롬프트 ì •ì˜\n" -#: help.c:402 -#, c-format +#: help.c:421 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous " @@ -3621,8 +3658,7 @@ msgstr "" " PROMPT2\n" " ì•„ì§ êµ¬ë¬¸ì´ ëœ ë난 ëª…ë ¹í–‰ì˜ í”„ë¡¬í”„íŠ¸\n" -#: help.c:404 -#, c-format +#: help.c:423 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3630,8 +3666,7 @@ msgstr "" " PROMPT3\n" " COPY ... FROM STDIN 작업시 ë³´ì¼ í”„ë¡¬í”„íŠ¸\n" -#: help.c:406 -#, c-format +#: help.c:425 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3639,8 +3674,7 @@ msgstr "" " QUIET\n" " 조용히 실행 (-q 옵션과 ê°™ìŒ)\n" -#: help.c:408 -#, c-format +#: help.c:427 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3648,8 +3682,7 @@ msgstr "" " ROW_COUNT\n" " 마지막 쿼리 작업 ëŒ€ìƒ ë¡œìš° 수, ë˜ëŠ” 0\n" -#: help.c:410 -#, c-format +#: help.c:429 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3659,8 +3692,32 @@ msgstr "" " SERVER_VERSION_NUM\n" " 문ìžì—´ 버전 정보나, ìˆ«ìž í˜•ì‹ ë²„ì „ ì •ë³´\n" -#: help.c:413 -#, c-format +#: help.c:432 +msgid "" +" SHELL_ERROR\n" +" \"true\" if the last shell command failed, \"false\" if it succeeded\n" +msgstr "" +" SHELL_ERROR\n" +" 마지막 쉘 ëª…ë ¹ì´ ì‹¤íŒ¨í–ˆìœ¼ë©´ \"true\", 아니면 \"false\"\n" + +#: help.c:434 +msgid "" +" SHELL_EXIT_CODE\n" +" exit status of the last shell command\n" +msgstr "" +" SHELL_EXIT_CODE\n" +" 마지막 쉘 ëª…ë ¹ì˜ ì¢…ë£Œ 코드\n" + +#: help.c:436 +msgid "" +" SHOW_ALL_RESULTS\n" +" show all results of a combined query (\\;) instead of only the last\n" +msgstr "" +" SHOW_ALL_RESULTS\n" +" 여러 쿼리가 ì—°ì†í•˜ëŠ” 경우(\\;) 모든 쿼리 결과를 출력, offë©´ 마지막 ê²°ê³¼" +"ë§Œ\n" + +#: help.c:438 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3668,8 +3725,7 @@ msgstr "" " SHOW_CONTEXT\n" " ìƒí™©ë³„ ìžì„¸í•œ 메시지 ë‚´ìš© 출력 제어 [never, errors, always]\n" -#: help.c:415 -#, c-format +#: help.c:440 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3677,8 +3733,7 @@ msgstr "" " SINGLELINE\n" " 한 ì¤„ì— í•˜ë‚˜ì˜ SQL 명령 실행 (-S 옵션과 ê°™ìŒ)\n" -#: help.c:417 -#, c-format +#: help.c:442 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3686,8 +3741,7 @@ msgstr "" " SINGLESTEP\n" " ê° ëª…ë ¹ì„ í™•ì¸í•˜ë©° 실행 (-s 옵션과 ê°™ìŒ)\n" -#: help.c:419 -#, c-format +#: help.c:444 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3695,8 +3749,7 @@ msgstr "" " SQLSTATE\n" " 마지막 ì¿¼ë¦¬ì˜ SQLSTATE ê°’, 오류가 없으면 \"00000\"\n" -#: help.c:421 -#, c-format +#: help.c:446 msgid "" " USER\n" " the currently connected database user\n" @@ -3704,8 +3757,7 @@ msgstr "" " USER\n" " 현재 ì ‘ì†í•œ ë°ì´í„°ë² ì´ìФ 사용ìž\n" -#: help.c:423 -#, c-format +#: help.c:448 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3713,8 +3765,7 @@ msgstr "" " VERBOSITY\n" " 오류 출력시 ìžì„¸ížˆ ë³¼ ë‚´ìš© 범위 [default, verbose, terse, sqlstate]\n" -#: help.c:425 -#, c-format +#: help.c:450 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3726,8 +3777,7 @@ msgstr "" " VERSION_NUM\n" " psql 버전 (ìžì„¸í•œ 버전, 단순한 버전, 숫ìží˜• 버전)\n" -#: help.c:430 -#, c-format +#: help.c:455 msgid "" "\n" "Display settings:\n" @@ -3735,8 +3785,7 @@ msgstr "" "\n" "출력 설정들:\n" -#: help.c:432 -#, c-format +#: help.c:457 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3746,8 +3795,7 @@ msgstr "" " ë˜ëŠ” psql 명령 모드ì—서는 \\pset NAME [VALUE]\n" "\n" -#: help.c:434 -#, c-format +#: help.c:459 msgid "" " border\n" " border style (number)\n" @@ -3755,8 +3803,7 @@ msgstr "" " border\n" " í…Œë‘리 모양 (숫ìž)\n" -#: help.c:436 -#, c-format +#: help.c:461 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3764,8 +3811,7 @@ msgstr "" " columns\n" " ì¤„ë°”ê¿ˆì„ ìœ„í•œ 너비 지정\n" -#: help.c:438 -#, c-format +#: help.c:463 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3773,7 +3819,7 @@ msgstr "" " expanded (ë˜ëŠ” x)\n" " í™•ìž¥ëœ ì¶œë ¥ 전환 [on, off, auto]\n" -#: help.c:440 +#: help.c:465 #, c-format msgid "" " fieldsep\n" @@ -3782,8 +3828,7 @@ msgstr "" " fieldsep\n" " unaligned 출력용 필드 êµ¬ë¶„ìž (초기값 \"%s\"')\n" -#: help.c:443 -#, c-format +#: help.c:468 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3791,8 +3836,7 @@ msgstr "" " fieldsep_zero\n" " unaligned 출력용 필드 구분ìžë¥¼ 0 ë°”ì´íŠ¸ë¡œ 지정\n" -#: help.c:445 -#, c-format +#: help.c:470 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3800,8 +3844,7 @@ msgstr "" " footer\n" " í…Œì´ë¸” ê¼¬ë¦¬ë§ ë³´ì´ê¸° 전환 [on, off]\n" -#: help.c:447 -#, c-format +#: help.c:472 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3809,8 +3852,7 @@ msgstr "" " format\n" " 출력 ì–‘ì‹ ì§€ì • [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:449 -#, c-format +#: help.c:474 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3818,8 +3860,7 @@ msgstr "" " linestyle\n" " í…Œë‘리 ì„  모양 지정 [ascii, old-ascii, unicode]\n" -#: help.c:451 -#, c-format +#: help.c:476 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3827,8 +3868,7 @@ msgstr "" " null\n" " null ê°’ 출력 방법\n" -#: help.c:453 -#, c-format +#: help.c:478 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of " @@ -3837,8 +3877,7 @@ msgstr "" " numericlocale\n" " ìˆ«ìž ì¶œë ¥ì—서 ë¡œì¼€ì¼ ê¸°ë°˜ 천ìžë¦¬ 분리 ë¬¸ìž í™œì„±í™” [on, off]\n" -#: help.c:455 -#, c-format +#: help.c:480 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3846,8 +3885,7 @@ msgstr "" " pager\n" " 외부 페ì´ì§€ 단위 보기 ë„구 사용 여부 [yes, no, always]\n" -#: help.c:457 -#, c-format +#: help.c:482 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3855,8 +3893,7 @@ msgstr "" " recordsep\n" " unaligned 출력용 레코드(줄) 구분ìž\n" -#: help.c:459 -#, c-format +#: help.c:484 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3864,8 +3901,7 @@ msgstr "" " recordsep_zero\n" " unaligned 출력용 레코드 구분ìžë¥¼ 0 ë°”ì´íŠ¸ë¡œ 지정\n" -#: help.c:461 -#, c-format +#: help.c:486 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3873,10 +3909,9 @@ msgid "" msgstr "" " tableattr (ë˜ëŠ” T)\n" " html í…Œì´ë¸” íƒœê·¸ì— ëŒ€í•œ ì†ì„±ì´ë‚˜,\n" -" latex-longtable ì–‘ì‹ì—서 왼쪽 ì •ë ¬ ìžë£Œìš© 칼럼 ë„“ì´ ì§€ì •\n" +" latex-longtable ì–‘ì‹ì—서 왼쪽 ì •ë ¬ ìžë£Œìš© 칼럼 너비 지정\n" -#: help.c:464 -#, c-format +#: help.c:489 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3884,8 +3919,7 @@ msgstr "" " title\n" " í…Œì´ë¸” 제목 지정\n" -#: help.c:466 -#, c-format +#: help.c:491 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3893,8 +3927,7 @@ msgstr "" " tuples_only\n" " 지정ë˜ë©´, ìžë£Œë§Œ ë³´ìž„\n" -#: help.c:468 -#, c-format +#: help.c:493 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3906,8 +3939,17 @@ msgstr "" " unicode_header_linestyle\n" " 유니코드 ì„  종류 [single, double]\n" -#: help.c:473 -#, c-format +#: help.c:497 +msgid "" +" xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr "" +" xheader_width\n" +" í™•ìž¥ëœ ì¶œë ¥ 화면ì—서 í—¤ë”ì˜ ìµœëŒ€ 너비 지정\n" +" [full, column, page, integer value]\n" + +#: help.c:501 msgid "" "\n" "Environment variables:\n" @@ -3915,8 +3957,7 @@ msgstr "" "\n" "OS 환경 변수들:\n" -#: help.c:477 -#, c-format +#: help.c:505 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3926,8 +3967,7 @@ msgstr "" " ë˜ëŠ” psql 명령 모드ì—서는 \\setenv NAME [VALUE]\n" "\n" -#: help.c:479 -#, c-format +#: help.c:507 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3939,8 +3979,7 @@ msgstr "" " ë˜ëŠ” psql 명령 모드ì—서는 \\setenv NAME [VALUE]\n" "\n" -#: help.c:482 -#, c-format +#: help.c:510 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3948,8 +3987,7 @@ msgstr "" " COLUMNS\n" " ë‹¤ìŒ ì¤„ë¡œ 넘어갈 칼럼 수\n" -#: help.c:484 -#, c-format +#: help.c:512 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3957,8 +3995,7 @@ msgstr "" " PGAPPNAME\n" " application_name 변수값으로 사용ë¨\n" -#: help.c:486 -#, c-format +#: help.c:514 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3966,8 +4003,7 @@ msgstr "" " PGDATABASE\n" " ì ‘ì†í•  ë°ì´í„°ë² ì´ìФ ì´ë¦„\n" -#: help.c:488 -#, c-format +#: help.c:516 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3975,17 +4011,7 @@ msgstr "" " PGHOST\n" " 서버 ì ‘ì†ìš© 호스트 ì´ë¦„\n" -#: help.c:490 -#, c-format -msgid "" -" PGPASSWORD\n" -" connection password (not recommended)\n" -msgstr "" -" PGPASSWORD\n" -" 서버 ì ‘ì† ë¹„ë°€ë²ˆí˜¸ (ë³´ì•ˆì— ì·¨ì•½í•¨)\n" - -#: help.c:492 -#, c-format +#: help.c:518 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3993,8 +4019,15 @@ msgstr "" " PGPASSFILE\n" " 서버 ì ‘ì†ìš© 비밀번호가 ì €ìž¥ëœ íŒŒì¼ ì´ë¦„\n" -#: help.c:494 -#, c-format +#: help.c:520 +msgid "" +" PGPASSWORD\n" +" connection password (not recommended)\n" +msgstr "" +" PGPASSWORD\n" +" 서버 ì ‘ì† ë¹„ë°€ë²ˆí˜¸ (ë³´ì•ˆì— ì·¨ì•½í•¨)\n" + +#: help.c:522 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -4002,8 +4035,7 @@ msgstr "" " PGPORT\n" " 서버 ì ‘ì†ìš© í¬íЏ\n" -#: help.c:496 -#, c-format +#: help.c:524 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -4011,8 +4043,7 @@ msgstr "" " PGUSER\n" " 서버 ì ‘ì†ìš© ë°ì´í„°ë² ì´ìФ ì‚¬ìš©ìž ì´ë¦„\n" -#: help.c:498 -#, c-format +#: help.c:526 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -4020,8 +4051,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " \\e, \\ef, \\ev 명령ì—서 사용할 외부 편집기 경로\n" -#: help.c:500 -#, c-format +#: help.c:528 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -4029,8 +4059,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " 외부 편집기 호출 시 사용할 줄번호 ì„ íƒ ì˜µì…˜\n" -#: help.c:502 -#, c-format +#: help.c:530 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -4038,8 +4067,7 @@ msgstr "" " PSQL_HISTORY\n" " ì‚¬ìš©ìž .psql_history íŒŒì¼ ìž„ì˜ ì§€ì •\n" -#: help.c:504 -#, c-format +#: help.c:532 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -4047,8 +4075,15 @@ msgstr "" " PAGER\n" " 페ì´ì§€ 단위 보기ì—서 사용할 프로그램\n" -#: help.c:506 -#, c-format +#: help.c:535 +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_WATCH_PAGER\n" +" \\watch 명령ì—서 사용할 외장 페ì´ì € 프로그램 ì´ë¦„\n" + +#: help.c:538 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -4056,8 +4091,7 @@ msgstr "" " PSQLRC\n" " ì‚¬ìš©ìž .psqlrc 파ì¼ì˜ ìž„ì˜ ì§€ì •\n" -#: help.c:508 -#, c-format +#: help.c:540 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -4065,8 +4099,7 @@ msgstr "" " SHELL\n" " \\! 명령ì—서 사용할 쉘\n" -#: help.c:510 -#, c-format +#: help.c:542 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -4074,11 +4107,11 @@ msgstr "" " TMPDIR\n" " 임시 파ì¼ì„ 사용할 디렉터리\n" -#: help.c:554 +#: help.c:602 msgid "Available help:\n" msgstr "사용 가능한 ë„움ë§:\n" -#: help.c:642 +#: help.c:697 #, c-format msgid "" "Command: %s\n" @@ -4096,7 +4129,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:661 +#: help.c:720 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4105,17 +4138,17 @@ msgstr "" "\"%s\" ëª…ë ¹ì— ëŒ€í•œ ë„ì›€ë§ ì—†ìŒ.\n" "\\h ëª…ë ¹ì„ ì¸ìž ì—†ì´ í˜¸ì¶œ 하면 사용 가능한 모든 명령 보여줌.\n" -#: input.c:217 +#: input.c:215 #, c-format msgid "could not read from input file: %m" msgstr "ìž…ë ¥ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %m" -#: input.c:471 input.c:509 +#: input.c:476 input.c:514 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "history를 \"%s\" 파ì¼ë¡œ 저장할 수 ì—†ìŒ: %m" -#: input.c:528 +#: input.c:533 #, c-format msgid "history is not supported by this installation" msgstr "히스토리 ê¸°ëŠ¥ì€ ì´ ì„¤ì¹˜ë³¸ì—서는 ì§€ì›í•˜ì§€ 않ìŒ" @@ -4135,25 +4168,17 @@ msgstr "%s: 현재 트랜잭션 중지ë¨" msgid "%s: unknown transaction status" msgstr "%s: 알 수 없는 트랜잭션 ìƒíƒœ" -#: large_obj.c:288 large_obj.c:299 -msgid "ID" -msgstr "ID" - -#: large_obj.c:309 -msgid "Large objects" -msgstr "대형 ê°ì²´ë“¤" - -#: mainloop.c:136 +#: mainloop.c:133 #, c-format msgid "\\if: escaped" msgstr "\\if: escaped" -#: mainloop.c:195 +#: mainloop.c:192 #, c-format msgid "Use \"\\q\" to leave %s.\n" msgstr "마치려면 \"\\q\"를 입력하세요: %s\n" -#: mainloop.c:217 +#: mainloop.c:214 msgid "" "The input is a PostgreSQL custom-format dump.\n" "Use the pg_restore command-line client to restore this dump to a database.\n" @@ -4162,19 +4187,19 @@ msgstr "" "ì´ ë¤í”„ ë‚´ìš©ì„ ë°ì´í„°ë² ì´ìŠ¤ì— ë°˜ì˜í•˜ë ¤ë©´,\n" "pg_restore 명령행 í´ë¼ì´ì–¸íŠ¸ë¥¼ 사용하세요.\n" -#: mainloop.c:298 +#: mainloop.c:295 msgid "Use \\? for help or press control-C to clear the input buffer." msgstr "\\? ë„움ë§, Ctrl-C ìž…ë ¥ ë²„í¼ ë¹„ìš°ê¸°" -#: mainloop.c:300 +#: mainloop.c:297 msgid "Use \\? for help." msgstr "ë„움ë§ì„ 보려면 \\?를 입력하십시오." -#: mainloop.c:304 +#: mainloop.c:301 msgid "You are using psql, the command-line interface to PostgreSQL." msgstr "PostgreSQLì— ëŒ€í•œ 명령행 ì¸í„°íŽ˜ì´ìŠ¤ì¸ psqlì„ ì‚¬ìš©í•˜ê³  있습니다." -#: mainloop.c:305 +#: mainloop.c:302 #, c-format msgid "" "Type: \\copyright for distribution terms\n" @@ -4189,2298 +4214,2499 @@ msgstr "" " \\g ë˜ëŠ” 명령 ëì— ì„¸ë¯¸ì½œë¡ (;) 쿼리 실행\n" " \\q 마침\n" -#: mainloop.c:329 +#: mainloop.c:326 msgid "Use \\q to quit." msgstr "\\q 마침" -#: mainloop.c:332 mainloop.c:356 +#: mainloop.c:329 mainloop.c:353 msgid "Use control-D to quit." msgstr "ë§ˆì¹¨ì€ Ctrl-D" -#: mainloop.c:334 mainloop.c:358 +#: mainloop.c:331 mainloop.c:355 msgid "Use control-C to quit." msgstr "ë§ˆì¹¨ì€ Ctrl-C" -#: mainloop.c:465 mainloop.c:613 +#: mainloop.c:459 mainloop.c:618 #, c-format msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "" "쿼리 무시ë¨; 현재 \\if 블ë¡ì„ ë내려면 \\endif ë˜ëŠ” Ctrl-C 키를 사용하세요." -#: mainloop.c:631 +#: mainloop.c:636 #, c-format msgid "reached EOF without finding closing \\endif(s)" msgstr "\\endif ì—†ì´ EOF ë„달" -#: psqlscanslash.l:638 +#: psqlscanslash.l:642 #, c-format msgid "unterminated quoted string" msgstr "마무리 ì•ˆëœ ë”°ì˜´í‘œ ì•ˆì˜ ë¬¸ìžì—´" -#: psqlscanslash.l:811 +#: psqlscanslash.l:842 #, c-format msgid "%s: out of memory" msgstr "%s: 메모리 부족" #: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 #: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 -#: sql_help.c:111 sql_help.c:117 sql_help.c:119 sql_help.c:121 sql_help.c:123 -#: sql_help.c:126 sql_help.c:128 sql_help.c:130 sql_help.c:235 sql_help.c:237 -#: sql_help.c:238 sql_help.c:240 sql_help.c:242 sql_help.c:245 sql_help.c:247 -#: sql_help.c:249 sql_help.c:251 sql_help.c:263 sql_help.c:264 sql_help.c:265 -#: sql_help.c:267 sql_help.c:316 sql_help.c:318 sql_help.c:320 sql_help.c:322 -#: sql_help.c:391 sql_help.c:396 sql_help.c:398 sql_help.c:440 sql_help.c:442 -#: sql_help.c:445 sql_help.c:447 sql_help.c:515 sql_help.c:520 sql_help.c:525 -#: sql_help.c:530 sql_help.c:535 sql_help.c:588 sql_help.c:590 sql_help.c:592 -#: sql_help.c:594 sql_help.c:596 sql_help.c:599 sql_help.c:601 sql_help.c:604 -#: sql_help.c:615 sql_help.c:617 sql_help.c:658 sql_help.c:660 sql_help.c:662 -#: sql_help.c:665 sql_help.c:667 sql_help.c:669 sql_help.c:702 sql_help.c:706 -#: sql_help.c:710 sql_help.c:729 sql_help.c:732 sql_help.c:735 sql_help.c:764 -#: sql_help.c:776 sql_help.c:784 sql_help.c:787 sql_help.c:790 sql_help.c:805 -#: sql_help.c:808 sql_help.c:837 sql_help.c:842 sql_help.c:847 sql_help.c:852 -#: sql_help.c:857 sql_help.c:879 sql_help.c:881 sql_help.c:883 sql_help.c:885 -#: sql_help.c:888 sql_help.c:890 sql_help.c:931 sql_help.c:975 sql_help.c:980 -#: sql_help.c:985 sql_help.c:990 sql_help.c:995 sql_help.c:1014 sql_help.c:1025 -#: sql_help.c:1027 sql_help.c:1046 sql_help.c:1056 sql_help.c:1058 -#: sql_help.c:1060 sql_help.c:1072 sql_help.c:1076 sql_help.c:1078 -#: sql_help.c:1090 sql_help.c:1092 sql_help.c:1094 sql_help.c:1096 -#: sql_help.c:1112 sql_help.c:1114 sql_help.c:1118 sql_help.c:1121 -#: sql_help.c:1122 sql_help.c:1123 sql_help.c:1126 sql_help.c:1128 -#: sql_help.c:1262 sql_help.c:1264 sql_help.c:1267 sql_help.c:1270 -#: sql_help.c:1272 sql_help.c:1274 sql_help.c:1277 sql_help.c:1280 -#: sql_help.c:1391 sql_help.c:1393 sql_help.c:1395 sql_help.c:1398 -#: sql_help.c:1419 sql_help.c:1422 sql_help.c:1425 sql_help.c:1428 -#: sql_help.c:1432 sql_help.c:1434 sql_help.c:1436 sql_help.c:1438 -#: sql_help.c:1452 sql_help.c:1455 sql_help.c:1457 sql_help.c:1459 -#: sql_help.c:1469 sql_help.c:1471 sql_help.c:1481 sql_help.c:1483 -#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1519 sql_help.c:1521 -#: sql_help.c:1523 sql_help.c:1525 sql_help.c:1528 sql_help.c:1530 -#: sql_help.c:1533 sql_help.c:1536 sql_help.c:1586 sql_help.c:1629 -#: sql_help.c:1632 sql_help.c:1634 sql_help.c:1636 sql_help.c:1639 -#: sql_help.c:1641 sql_help.c:1643 sql_help.c:1646 sql_help.c:1696 -#: sql_help.c:1712 sql_help.c:1933 sql_help.c:2002 sql_help.c:2021 -#: sql_help.c:2034 sql_help.c:2091 sql_help.c:2098 sql_help.c:2108 -#: sql_help.c:2129 sql_help.c:2155 sql_help.c:2173 sql_help.c:2200 -#: sql_help.c:2295 sql_help.c:2340 sql_help.c:2364 sql_help.c:2387 -#: sql_help.c:2391 sql_help.c:2425 sql_help.c:2445 sql_help.c:2467 -#: sql_help.c:2481 sql_help.c:2501 sql_help.c:2524 sql_help.c:2554 -#: sql_help.c:2579 sql_help.c:2625 sql_help.c:2903 sql_help.c:2916 -#: sql_help.c:2933 sql_help.c:2949 sql_help.c:2989 sql_help.c:3041 -#: sql_help.c:3045 sql_help.c:3047 sql_help.c:3053 sql_help.c:3071 -#: sql_help.c:3098 sql_help.c:3133 sql_help.c:3145 sql_help.c:3154 -#: sql_help.c:3198 sql_help.c:3212 sql_help.c:3240 sql_help.c:3248 -#: sql_help.c:3260 sql_help.c:3270 sql_help.c:3278 sql_help.c:3286 -#: sql_help.c:3294 sql_help.c:3302 sql_help.c:3311 sql_help.c:3322 -#: sql_help.c:3330 sql_help.c:3338 sql_help.c:3346 sql_help.c:3354 -#: sql_help.c:3364 sql_help.c:3373 sql_help.c:3382 sql_help.c:3390 -#: sql_help.c:3400 sql_help.c:3411 sql_help.c:3419 sql_help.c:3428 -#: sql_help.c:3439 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 -#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3488 sql_help.c:3496 -#: sql_help.c:3504 sql_help.c:3512 sql_help.c:3520 sql_help.c:3528 -#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3562 sql_help.c:3579 -#: sql_help.c:3594 sql_help.c:3869 sql_help.c:3920 sql_help.c:3949 -#: sql_help.c:3962 sql_help.c:4407 sql_help.c:4455 sql_help.c:4596 +#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:245 +#: sql_help.c:247 sql_help.c:248 sql_help.c:250 sql_help.c:252 sql_help.c:255 +#: sql_help.c:257 sql_help.c:259 sql_help.c:261 sql_help.c:276 sql_help.c:277 +#: sql_help.c:278 sql_help.c:280 sql_help.c:329 sql_help.c:331 sql_help.c:333 +#: sql_help.c:335 sql_help.c:404 sql_help.c:409 sql_help.c:411 sql_help.c:453 +#: sql_help.c:455 sql_help.c:458 sql_help.c:460 sql_help.c:529 sql_help.c:534 +#: sql_help.c:539 sql_help.c:544 sql_help.c:549 sql_help.c:603 sql_help.c:605 +#: sql_help.c:607 sql_help.c:609 sql_help.c:611 sql_help.c:614 sql_help.c:616 +#: sql_help.c:619 sql_help.c:630 sql_help.c:632 sql_help.c:676 sql_help.c:678 +#: sql_help.c:680 sql_help.c:683 sql_help.c:685 sql_help.c:687 sql_help.c:728 +#: sql_help.c:732 sql_help.c:736 sql_help.c:757 sql_help.c:760 sql_help.c:763 +#: sql_help.c:792 sql_help.c:804 sql_help.c:812 sql_help.c:815 sql_help.c:818 +#: sql_help.c:833 sql_help.c:836 sql_help.c:865 sql_help.c:870 sql_help.c:875 +#: sql_help.c:880 sql_help.c:885 sql_help.c:912 sql_help.c:914 sql_help.c:916 +#: sql_help.c:918 sql_help.c:921 sql_help.c:923 sql_help.c:970 sql_help.c:1015 +#: sql_help.c:1020 sql_help.c:1025 sql_help.c:1030 sql_help.c:1035 +#: sql_help.c:1054 sql_help.c:1065 sql_help.c:1067 sql_help.c:1087 +#: sql_help.c:1097 sql_help.c:1098 sql_help.c:1100 sql_help.c:1102 +#: sql_help.c:1114 sql_help.c:1118 sql_help.c:1120 sql_help.c:1132 +#: sql_help.c:1134 sql_help.c:1136 sql_help.c:1138 sql_help.c:1157 +#: sql_help.c:1159 sql_help.c:1163 sql_help.c:1167 sql_help.c:1171 +#: sql_help.c:1174 sql_help.c:1175 sql_help.c:1176 sql_help.c:1179 +#: sql_help.c:1182 sql_help.c:1184 sql_help.c:1324 sql_help.c:1326 +#: sql_help.c:1329 sql_help.c:1332 sql_help.c:1334 sql_help.c:1336 +#: sql_help.c:1339 sql_help.c:1342 sql_help.c:1464 sql_help.c:1466 +#: sql_help.c:1468 sql_help.c:1471 sql_help.c:1492 sql_help.c:1495 +#: sql_help.c:1498 sql_help.c:1501 sql_help.c:1505 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1525 sql_help.c:1528 +#: sql_help.c:1530 sql_help.c:1532 sql_help.c:1542 sql_help.c:1544 +#: sql_help.c:1554 sql_help.c:1556 sql_help.c:1566 sql_help.c:1569 +#: sql_help.c:1592 sql_help.c:1594 sql_help.c:1596 sql_help.c:1598 +#: sql_help.c:1601 sql_help.c:1603 sql_help.c:1606 sql_help.c:1609 +#: sql_help.c:1660 sql_help.c:1703 sql_help.c:1706 sql_help.c:1708 +#: sql_help.c:1710 sql_help.c:1713 sql_help.c:1715 sql_help.c:1717 +#: sql_help.c:1720 sql_help.c:1770 sql_help.c:1786 sql_help.c:2019 +#: sql_help.c:2088 sql_help.c:2107 sql_help.c:2120 sql_help.c:2178 +#: sql_help.c:2186 sql_help.c:2196 sql_help.c:2224 sql_help.c:2257 +#: sql_help.c:2275 sql_help.c:2303 sql_help.c:2414 sql_help.c:2460 +#: sql_help.c:2485 sql_help.c:2508 sql_help.c:2512 sql_help.c:2546 +#: sql_help.c:2566 sql_help.c:2588 sql_help.c:2602 sql_help.c:2623 +#: sql_help.c:2652 sql_help.c:2685 sql_help.c:2708 sql_help.c:2755 +#: sql_help.c:3053 sql_help.c:3066 sql_help.c:3083 sql_help.c:3099 +#: sql_help.c:3139 sql_help.c:3193 sql_help.c:3197 sql_help.c:3199 +#: sql_help.c:3206 sql_help.c:3225 sql_help.c:3252 sql_help.c:3287 +#: sql_help.c:3299 sql_help.c:3308 sql_help.c:3352 sql_help.c:3366 +#: sql_help.c:3394 sql_help.c:3402 sql_help.c:3414 sql_help.c:3424 +#: sql_help.c:3432 sql_help.c:3440 sql_help.c:3448 sql_help.c:3456 +#: sql_help.c:3465 sql_help.c:3476 sql_help.c:3484 sql_help.c:3492 +#: sql_help.c:3500 sql_help.c:3508 sql_help.c:3518 sql_help.c:3527 +#: sql_help.c:3536 sql_help.c:3544 sql_help.c:3554 sql_help.c:3565 +#: sql_help.c:3573 sql_help.c:3582 sql_help.c:3593 sql_help.c:3602 +#: sql_help.c:3610 sql_help.c:3618 sql_help.c:3626 sql_help.c:3634 +#: sql_help.c:3642 sql_help.c:3650 sql_help.c:3658 sql_help.c:3666 +#: sql_help.c:3674 sql_help.c:3682 sql_help.c:3699 sql_help.c:3708 +#: sql_help.c:3716 sql_help.c:3733 sql_help.c:3748 sql_help.c:4061 +#: sql_help.c:4182 sql_help.c:4211 sql_help.c:4227 sql_help.c:4229 +#: sql_help.c:4733 sql_help.c:4781 sql_help.c:4940 msgid "name" msgstr "ì´ë¦„" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:327 sql_help.c:1783 -#: sql_help.c:3213 sql_help.c:4193 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:340 sql_help.c:1863 +#: sql_help.c:3367 sql_help.c:4500 msgid "aggregate_signature" msgstr "집계함수_ì‹ë³„구문" -#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:250 -#: sql_help.c:268 sql_help.c:399 sql_help.c:446 sql_help.c:524 sql_help.c:571 -#: sql_help.c:589 sql_help.c:616 sql_help.c:666 sql_help.c:731 sql_help.c:786 -#: sql_help.c:807 sql_help.c:846 sql_help.c:891 sql_help.c:932 sql_help.c:984 -#: sql_help.c:1016 sql_help.c:1026 sql_help.c:1059 sql_help.c:1079 -#: sql_help.c:1093 sql_help.c:1129 sql_help.c:1271 sql_help.c:1392 -#: sql_help.c:1435 sql_help.c:1456 sql_help.c:1470 sql_help.c:1482 -#: sql_help.c:1495 sql_help.c:1522 sql_help.c:1587 sql_help.c:1640 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:260 +#: sql_help.c:281 sql_help.c:412 sql_help.c:459 sql_help.c:538 sql_help.c:586 +#: sql_help.c:604 sql_help.c:631 sql_help.c:684 sql_help.c:759 sql_help.c:814 +#: sql_help.c:835 sql_help.c:874 sql_help.c:924 sql_help.c:971 sql_help.c:1024 +#: sql_help.c:1056 sql_help.c:1066 sql_help.c:1101 sql_help.c:1121 +#: sql_help.c:1135 sql_help.c:1185 sql_help.c:1333 sql_help.c:1465 +#: sql_help.c:1508 sql_help.c:1529 sql_help.c:1543 sql_help.c:1555 +#: sql_help.c:1568 sql_help.c:1595 sql_help.c:1661 sql_help.c:1714 msgid "new_name" msgstr "새ì´ë¦„" -#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:120 sql_help.c:248 -#: sql_help.c:266 sql_help.c:397 sql_help.c:482 sql_help.c:529 sql_help.c:618 -#: sql_help.c:627 sql_help.c:685 sql_help.c:705 sql_help.c:734 sql_help.c:789 -#: sql_help.c:851 sql_help.c:889 sql_help.c:989 sql_help.c:1028 sql_help.c:1057 -#: sql_help.c:1077 sql_help.c:1091 sql_help.c:1127 sql_help.c:1332 -#: sql_help.c:1394 sql_help.c:1437 sql_help.c:1458 sql_help.c:1520 -#: sql_help.c:1635 sql_help.c:2889 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:258 +#: sql_help.c:279 sql_help.c:410 sql_help.c:495 sql_help.c:543 sql_help.c:633 +#: sql_help.c:642 sql_help.c:707 sql_help.c:731 sql_help.c:762 sql_help.c:817 +#: sql_help.c:879 sql_help.c:922 sql_help.c:1029 sql_help.c:1068 +#: sql_help.c:1099 sql_help.c:1119 sql_help.c:1133 sql_help.c:1183 +#: sql_help.c:1399 sql_help.c:1467 sql_help.c:1510 sql_help.c:1531 +#: sql_help.c:1593 sql_help.c:1709 sql_help.c:3039 msgid "new_owner" msgstr "새사용ìž" -#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:252 sql_help.c:319 -#: sql_help.c:448 sql_help.c:534 sql_help.c:668 sql_help.c:709 sql_help.c:737 -#: sql_help.c:792 sql_help.c:856 sql_help.c:994 sql_help.c:1061 sql_help.c:1095 -#: sql_help.c:1273 sql_help.c:1439 sql_help.c:1460 sql_help.c:1472 -#: sql_help.c:1484 sql_help.c:1524 sql_help.c:1642 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:262 sql_help.c:332 +#: sql_help.c:461 sql_help.c:548 sql_help.c:686 sql_help.c:735 sql_help.c:765 +#: sql_help.c:820 sql_help.c:884 sql_help.c:1034 sql_help.c:1103 +#: sql_help.c:1137 sql_help.c:1335 sql_help.c:1512 sql_help.c:1533 +#: sql_help.c:1545 sql_help.c:1557 sql_help.c:1597 sql_help.c:1716 msgid "new_schema" msgstr "새스키마" -#: sql_help.c:44 sql_help.c:1847 sql_help.c:3214 sql_help.c:4222 +#: sql_help.c:44 sql_help.c:1927 sql_help.c:3368 sql_help.c:4529 msgid "where aggregate_signature is:" msgstr "집계함수_ì‹ë³„구문 사용법:" -#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:337 sql_help.c:350 -#: sql_help.c:354 sql_help.c:370 sql_help.c:373 sql_help.c:376 sql_help.c:516 -#: sql_help.c:521 sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:838 -#: sql_help.c:843 sql_help.c:848 sql_help.c:853 sql_help.c:858 sql_help.c:976 -#: sql_help.c:981 sql_help.c:986 sql_help.c:991 sql_help.c:996 sql_help.c:1801 -#: sql_help.c:1818 sql_help.c:1824 sql_help.c:1848 sql_help.c:1851 -#: sql_help.c:1854 sql_help.c:2003 sql_help.c:2022 sql_help.c:2025 -#: sql_help.c:2296 sql_help.c:2502 sql_help.c:3215 sql_help.c:3218 -#: sql_help.c:3221 sql_help.c:3312 sql_help.c:3401 sql_help.c:3429 -#: sql_help.c:3753 sql_help.c:4101 sql_help.c:4199 sql_help.c:4206 -#: sql_help.c:4212 sql_help.c:4223 sql_help.c:4226 sql_help.c:4229 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:350 sql_help.c:363 +#: sql_help.c:367 sql_help.c:383 sql_help.c:386 sql_help.c:389 sql_help.c:530 +#: sql_help.c:535 sql_help.c:540 sql_help.c:545 sql_help.c:550 sql_help.c:866 +#: sql_help.c:871 sql_help.c:876 sql_help.c:881 sql_help.c:886 sql_help.c:1016 +#: sql_help.c:1021 sql_help.c:1026 sql_help.c:1031 sql_help.c:1036 +#: sql_help.c:1881 sql_help.c:1898 sql_help.c:1904 sql_help.c:1928 +#: sql_help.c:1931 sql_help.c:1934 sql_help.c:2089 sql_help.c:2108 +#: sql_help.c:2111 sql_help.c:2415 sql_help.c:2624 sql_help.c:3369 +#: sql_help.c:3372 sql_help.c:3375 sql_help.c:3466 sql_help.c:3555 +#: sql_help.c:3583 sql_help.c:3936 sql_help.c:4399 sql_help.c:4506 +#: sql_help.c:4513 sql_help.c:4519 sql_help.c:4530 sql_help.c:4533 +#: sql_help.c:4536 msgid "argmode" msgstr "ì¸ìžëª¨ë“œ" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:338 sql_help.c:351 -#: sql_help.c:355 sql_help.c:371 sql_help.c:374 sql_help.c:377 sql_help.c:517 -#: sql_help.c:522 sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:839 -#: sql_help.c:844 sql_help.c:849 sql_help.c:854 sql_help.c:859 sql_help.c:977 -#: sql_help.c:982 sql_help.c:987 sql_help.c:992 sql_help.c:997 sql_help.c:1802 -#: sql_help.c:1819 sql_help.c:1825 sql_help.c:1849 sql_help.c:1852 -#: sql_help.c:1855 sql_help.c:2004 sql_help.c:2023 sql_help.c:2026 -#: sql_help.c:2297 sql_help.c:2503 sql_help.c:3216 sql_help.c:3219 -#: sql_help.c:3222 sql_help.c:3313 sql_help.c:3402 sql_help.c:3430 -#: sql_help.c:4200 sql_help.c:4207 sql_help.c:4213 sql_help.c:4224 -#: sql_help.c:4227 sql_help.c:4230 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:351 sql_help.c:364 +#: sql_help.c:368 sql_help.c:384 sql_help.c:387 sql_help.c:390 sql_help.c:531 +#: sql_help.c:536 sql_help.c:541 sql_help.c:546 sql_help.c:551 sql_help.c:867 +#: sql_help.c:872 sql_help.c:877 sql_help.c:882 sql_help.c:887 sql_help.c:1017 +#: sql_help.c:1022 sql_help.c:1027 sql_help.c:1032 sql_help.c:1037 +#: sql_help.c:1882 sql_help.c:1899 sql_help.c:1905 sql_help.c:1929 +#: sql_help.c:1932 sql_help.c:1935 sql_help.c:2090 sql_help.c:2109 +#: sql_help.c:2112 sql_help.c:2416 sql_help.c:2625 sql_help.c:3370 +#: sql_help.c:3373 sql_help.c:3376 sql_help.c:3467 sql_help.c:3556 +#: sql_help.c:3584 sql_help.c:4507 sql_help.c:4514 sql_help.c:4520 +#: sql_help.c:4531 sql_help.c:4534 sql_help.c:4537 msgid "argname" msgstr "ì¸ìžì´ë¦„" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:339 sql_help.c:352 -#: sql_help.c:356 sql_help.c:372 sql_help.c:375 sql_help.c:378 sql_help.c:518 -#: sql_help.c:523 sql_help.c:528 sql_help.c:533 sql_help.c:538 sql_help.c:840 -#: sql_help.c:845 sql_help.c:850 sql_help.c:855 sql_help.c:860 sql_help.c:978 -#: sql_help.c:983 sql_help.c:988 sql_help.c:993 sql_help.c:998 sql_help.c:1803 -#: sql_help.c:1820 sql_help.c:1826 sql_help.c:1850 sql_help.c:1853 -#: sql_help.c:1856 sql_help.c:2298 sql_help.c:2504 sql_help.c:3217 -#: sql_help.c:3220 sql_help.c:3223 sql_help.c:3314 sql_help.c:3403 -#: sql_help.c:3431 sql_help.c:4201 sql_help.c:4208 sql_help.c:4214 -#: sql_help.c:4225 sql_help.c:4228 sql_help.c:4231 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:352 sql_help.c:365 +#: sql_help.c:369 sql_help.c:385 sql_help.c:388 sql_help.c:391 sql_help.c:532 +#: sql_help.c:537 sql_help.c:542 sql_help.c:547 sql_help.c:552 sql_help.c:868 +#: sql_help.c:873 sql_help.c:878 sql_help.c:883 sql_help.c:888 sql_help.c:1018 +#: sql_help.c:1023 sql_help.c:1028 sql_help.c:1033 sql_help.c:1038 +#: sql_help.c:1883 sql_help.c:1900 sql_help.c:1906 sql_help.c:1930 +#: sql_help.c:1933 sql_help.c:1936 sql_help.c:2417 sql_help.c:2626 +#: sql_help.c:3371 sql_help.c:3374 sql_help.c:3377 sql_help.c:3468 +#: sql_help.c:3557 sql_help.c:3585 sql_help.c:4508 sql_help.c:4515 +#: sql_help.c:4521 sql_help.c:4532 sql_help.c:4535 sql_help.c:4538 msgid "argtype" msgstr "ì¸ìžìžë£Œí˜•" -#: sql_help.c:112 sql_help.c:394 sql_help.c:471 sql_help.c:483 sql_help.c:926 -#: sql_help.c:1074 sql_help.c:1453 sql_help.c:1581 sql_help.c:1613 -#: sql_help.c:1665 sql_help.c:1904 sql_help.c:1911 sql_help.c:2203 -#: sql_help.c:2245 sql_help.c:2252 sql_help.c:2261 sql_help.c:2341 -#: sql_help.c:2555 sql_help.c:2647 sql_help.c:2918 sql_help.c:3099 -#: sql_help.c:3121 sql_help.c:3261 sql_help.c:3616 sql_help.c:3788 -#: sql_help.c:3961 sql_help.c:4658 +#: sql_help.c:114 sql_help.c:407 sql_help.c:484 sql_help.c:496 sql_help.c:965 +#: sql_help.c:1116 sql_help.c:1526 sql_help.c:1655 sql_help.c:1687 +#: sql_help.c:1739 sql_help.c:1798 sql_help.c:1987 sql_help.c:1994 +#: sql_help.c:2306 sql_help.c:2356 sql_help.c:2363 sql_help.c:2372 +#: sql_help.c:2461 sql_help.c:2686 sql_help.c:2777 sql_help.c:3068 +#: sql_help.c:3253 sql_help.c:3275 sql_help.c:3415 sql_help.c:3772 +#: sql_help.c:3980 sql_help.c:4226 sql_help.c:4228 sql_help.c:5006 msgid "option" msgstr "옵션" -#: sql_help.c:113 sql_help.c:927 sql_help.c:1582 sql_help.c:2342 -#: sql_help.c:2556 sql_help.c:3100 sql_help.c:3262 +#: sql_help.c:115 sql_help.c:966 sql_help.c:1656 sql_help.c:2462 +#: sql_help.c:2687 sql_help.c:3254 sql_help.c:3416 msgid "where option can be:" msgstr "옵션 사용법:" -#: sql_help.c:114 sql_help.c:2137 +#: sql_help.c:116 sql_help.c:2238 msgid "allowconn" msgstr "ì ‘ì†í—ˆìš©" -#: sql_help.c:115 sql_help.c:928 sql_help.c:1583 sql_help.c:2138 -#: sql_help.c:2343 sql_help.c:2557 sql_help.c:3101 +#: sql_help.c:117 sql_help.c:967 sql_help.c:1657 sql_help.c:2239 +#: sql_help.c:2463 sql_help.c:2688 sql_help.c:3255 msgid "connlimit" msgstr "ì ‘ì†ì œí•œ" -#: sql_help.c:116 sql_help.c:2139 +#: sql_help.c:118 sql_help.c:2240 msgid "istemplate" msgstr "템플릿?" -#: sql_help.c:122 sql_help.c:606 sql_help.c:671 sql_help.c:1276 sql_help.c:1325 +#: sql_help.c:124 sql_help.c:621 sql_help.c:689 sql_help.c:703 sql_help.c:1338 +#: sql_help.c:1392 sql_help.c:4232 msgid "new_tablespace" msgstr "새테ì´ë¸”스페ì´ìФ" -#: sql_help.c:124 sql_help.c:127 sql_help.c:129 sql_help.c:544 sql_help.c:546 -#: sql_help.c:547 sql_help.c:863 sql_help.c:865 sql_help.c:866 sql_help.c:935 -#: sql_help.c:939 sql_help.c:942 sql_help.c:1003 sql_help.c:1005 -#: sql_help.c:1006 sql_help.c:1140 sql_help.c:1143 sql_help.c:1590 -#: sql_help.c:1594 sql_help.c:1597 sql_help.c:2308 sql_help.c:2508 -#: sql_help.c:3980 sql_help.c:4396 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:558 sql_help.c:560 +#: sql_help.c:561 sql_help.c:891 sql_help.c:893 sql_help.c:894 sql_help.c:974 +#: sql_help.c:978 sql_help.c:981 sql_help.c:1043 sql_help.c:1045 +#: sql_help.c:1046 sql_help.c:1196 sql_help.c:1198 sql_help.c:1664 +#: sql_help.c:1668 sql_help.c:1671 sql_help.c:2427 sql_help.c:2630 +#: sql_help.c:3948 sql_help.c:4250 sql_help.c:4411 sql_help.c:4721 msgid "configuration_parameter" msgstr "환경설정_매개변수" -#: sql_help.c:125 sql_help.c:395 sql_help.c:466 sql_help.c:472 sql_help.c:484 -#: sql_help.c:545 sql_help.c:598 sql_help.c:677 sql_help.c:683 sql_help.c:864 -#: sql_help.c:887 sql_help.c:936 sql_help.c:1004 sql_help.c:1075 -#: sql_help.c:1117 sql_help.c:1120 sql_help.c:1125 sql_help.c:1141 -#: sql_help.c:1142 sql_help.c:1307 sql_help.c:1327 sql_help.c:1375 -#: sql_help.c:1397 sql_help.c:1454 sql_help.c:1538 sql_help.c:1591 -#: sql_help.c:1614 sql_help.c:2204 sql_help.c:2246 sql_help.c:2253 -#: sql_help.c:2262 sql_help.c:2309 sql_help.c:2310 sql_help.c:2372 -#: sql_help.c:2375 sql_help.c:2409 sql_help.c:2509 sql_help.c:2510 -#: sql_help.c:2527 sql_help.c:2648 sql_help.c:2678 sql_help.c:2783 -#: sql_help.c:2796 sql_help.c:2810 sql_help.c:2851 sql_help.c:2875 -#: sql_help.c:2892 sql_help.c:2919 sql_help.c:3122 sql_help.c:3789 -#: sql_help.c:4397 sql_help.c:4398 +#: sql_help.c:128 sql_help.c:408 sql_help.c:479 sql_help.c:485 sql_help.c:497 +#: sql_help.c:559 sql_help.c:613 sql_help.c:695 sql_help.c:705 sql_help.c:892 +#: sql_help.c:920 sql_help.c:975 sql_help.c:1044 sql_help.c:1117 +#: sql_help.c:1162 sql_help.c:1166 sql_help.c:1170 sql_help.c:1173 +#: sql_help.c:1178 sql_help.c:1181 sql_help.c:1197 sql_help.c:1371 +#: sql_help.c:1394 sql_help.c:1442 sql_help.c:1450 sql_help.c:1470 +#: sql_help.c:1527 sql_help.c:1611 sql_help.c:1665 sql_help.c:1688 +#: sql_help.c:2307 sql_help.c:2357 sql_help.c:2364 sql_help.c:2373 +#: sql_help.c:2428 sql_help.c:2429 sql_help.c:2493 sql_help.c:2496 +#: sql_help.c:2530 sql_help.c:2631 sql_help.c:2632 sql_help.c:2655 +#: sql_help.c:2778 sql_help.c:2817 sql_help.c:2927 sql_help.c:2940 +#: sql_help.c:2954 sql_help.c:2995 sql_help.c:3003 sql_help.c:3025 +#: sql_help.c:3042 sql_help.c:3069 sql_help.c:3276 sql_help.c:3981 +#: sql_help.c:4722 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 msgid "value" msgstr "ê°’" -#: sql_help.c:197 +#: sql_help.c:202 msgid "target_role" msgstr "대ìƒë¡¤" -#: sql_help.c:198 sql_help.c:2188 sql_help.c:2603 sql_help.c:2608 -#: sql_help.c:3735 sql_help.c:3742 sql_help.c:3756 sql_help.c:3762 -#: sql_help.c:4083 sql_help.c:4090 sql_help.c:4104 sql_help.c:4110 +#: sql_help.c:203 sql_help.c:929 sql_help.c:2291 sql_help.c:2660 +#: sql_help.c:2733 sql_help.c:2738 sql_help.c:3911 sql_help.c:3920 +#: sql_help.c:3939 sql_help.c:3951 sql_help.c:4374 sql_help.c:4383 +#: sql_help.c:4402 sql_help.c:4414 msgid "schema_name" msgstr "스키마ì´ë¦„" -#: sql_help.c:199 +#: sql_help.c:204 msgid "abbreviated_grant_or_revoke" msgstr "grant_ë˜ëŠ”_revoke_ë‚´ìš©" -#: sql_help.c:200 +#: sql_help.c:205 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "grant_ë˜ëŠ”_revoke_ë‚´ìš©ì— ì‚¬ìš©ë˜ëŠ” 구문:" -#: sql_help.c:201 sql_help.c:202 sql_help.c:203 sql_help.c:204 sql_help.c:205 #: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 -#: sql_help.c:569 sql_help.c:605 sql_help.c:670 sql_help.c:810 sql_help.c:946 -#: sql_help.c:1275 sql_help.c:1601 sql_help.c:2346 sql_help.c:2347 -#: sql_help.c:2348 sql_help.c:2349 sql_help.c:2350 sql_help.c:2483 -#: sql_help.c:2560 sql_help.c:2561 sql_help.c:2562 sql_help.c:2563 -#: sql_help.c:2564 sql_help.c:3104 sql_help.c:3105 sql_help.c:3106 -#: sql_help.c:3107 sql_help.c:3108 sql_help.c:3768 sql_help.c:3772 -#: sql_help.c:4116 sql_help.c:4120 sql_help.c:4417 +#: sql_help.c:211 sql_help.c:212 sql_help.c:213 sql_help.c:214 sql_help.c:215 +#: sql_help.c:584 sql_help.c:620 sql_help.c:688 sql_help.c:838 sql_help.c:985 +#: sql_help.c:1337 sql_help.c:1675 sql_help.c:2466 sql_help.c:2467 +#: sql_help.c:2468 sql_help.c:2469 sql_help.c:2470 sql_help.c:2604 +#: sql_help.c:2691 sql_help.c:2692 sql_help.c:2693 sql_help.c:3258 +#: sql_help.c:3259 sql_help.c:3260 sql_help.c:3261 sql_help.c:3262 +#: sql_help.c:3960 sql_help.c:3964 sql_help.c:4423 sql_help.c:4427 +#: sql_help.c:4743 msgid "role_name" msgstr "롤ì´ë¦„" -#: sql_help.c:236 sql_help.c:459 sql_help.c:1291 sql_help.c:1293 -#: sql_help.c:1342 sql_help.c:1354 sql_help.c:1379 sql_help.c:1631 -#: sql_help.c:2158 sql_help.c:2162 sql_help.c:2265 sql_help.c:2270 -#: sql_help.c:2368 sql_help.c:2778 sql_help.c:2791 sql_help.c:2805 -#: sql_help.c:2814 sql_help.c:2826 sql_help.c:2855 sql_help.c:3820 -#: sql_help.c:3835 sql_help.c:3837 sql_help.c:4282 sql_help.c:4283 -#: sql_help.c:4292 sql_help.c:4333 sql_help.c:4334 sql_help.c:4335 -#: sql_help.c:4336 sql_help.c:4337 sql_help.c:4338 sql_help.c:4371 -#: sql_help.c:4372 sql_help.c:4377 sql_help.c:4382 sql_help.c:4521 -#: sql_help.c:4522 sql_help.c:4531 sql_help.c:4572 sql_help.c:4573 -#: sql_help.c:4574 sql_help.c:4575 sql_help.c:4576 sql_help.c:4577 -#: sql_help.c:4624 sql_help.c:4626 sql_help.c:4685 sql_help.c:4741 -#: sql_help.c:4742 sql_help.c:4751 sql_help.c:4792 sql_help.c:4793 -#: sql_help.c:4794 sql_help.c:4795 sql_help.c:4796 sql_help.c:4797 +#: sql_help.c:246 sql_help.c:265 sql_help.c:472 sql_help.c:928 sql_help.c:1353 +#: sql_help.c:1355 sql_help.c:1359 sql_help.c:1409 sql_help.c:1421 +#: sql_help.c:1446 sql_help.c:1705 sql_help.c:2260 sql_help.c:2264 +#: sql_help.c:2376 sql_help.c:2381 sql_help.c:2489 sql_help.c:2659 +#: sql_help.c:2794 sql_help.c:2799 sql_help.c:2801 sql_help.c:2922 +#: sql_help.c:2935 sql_help.c:2949 sql_help.c:2958 sql_help.c:2970 +#: sql_help.c:2999 sql_help.c:4012 sql_help.c:4027 sql_help.c:4029 +#: sql_help.c:4125 sql_help.c:4128 sql_help.c:4130 sql_help.c:4593 +#: sql_help.c:4594 sql_help.c:4603 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4652 sql_help.c:4653 sql_help.c:4654 sql_help.c:4655 +#: sql_help.c:4696 sql_help.c:4697 sql_help.c:4702 sql_help.c:4707 +#: sql_help.c:4851 sql_help.c:4852 sql_help.c:4861 sql_help.c:4908 +#: sql_help.c:4909 sql_help.c:4910 sql_help.c:4911 sql_help.c:4912 +#: sql_help.c:4913 sql_help.c:4968 sql_help.c:4970 sql_help.c:5036 +#: sql_help.c:5096 sql_help.c:5097 sql_help.c:5106 sql_help.c:5153 +#: sql_help.c:5154 sql_help.c:5155 sql_help.c:5156 sql_help.c:5157 +#: sql_help.c:5158 msgid "expression" msgstr "표현ì‹" -#: sql_help.c:239 +#: sql_help.c:249 sql_help.c:2261 msgid "domain_constraint" msgstr "ë„ë©”ì¸_제약조건" -#: sql_help.c:241 sql_help.c:243 sql_help.c:246 sql_help.c:474 sql_help.c:475 -#: sql_help.c:1268 sql_help.c:1313 sql_help.c:1314 sql_help.c:1315 -#: sql_help.c:1341 sql_help.c:1353 sql_help.c:1370 sql_help.c:1789 -#: sql_help.c:1791 sql_help.c:2161 sql_help.c:2264 sql_help.c:2269 -#: sql_help.c:2813 sql_help.c:2825 sql_help.c:3832 +#: sql_help.c:251 sql_help.c:253 sql_help.c:256 sql_help.c:264 sql_help.c:487 +#: sql_help.c:488 sql_help.c:1330 sql_help.c:1379 sql_help.c:1380 +#: sql_help.c:1381 sql_help.c:1408 sql_help.c:1420 sql_help.c:1437 +#: sql_help.c:1869 sql_help.c:1871 sql_help.c:2263 sql_help.c:2375 +#: sql_help.c:2380 sql_help.c:2957 sql_help.c:2969 sql_help.c:4024 msgid "constraint_name" msgstr "제약조건_ì´ë¦„" -#: sql_help.c:244 sql_help.c:1269 +#: sql_help.c:254 sql_help.c:1331 msgid "new_constraint_name" msgstr "새제약조건_ì´ë¦„" -#: sql_help.c:317 sql_help.c:1073 +#: sql_help.c:263 sql_help.c:2262 +msgid "where domain_constraint is:" +msgstr "ë„ë©”ì¸_제약조건 사용법:" + +#: sql_help.c:330 sql_help.c:1115 msgid "new_version" msgstr "새버전" -#: sql_help.c:321 sql_help.c:323 +#: sql_help.c:334 sql_help.c:336 msgid "member_object" msgstr "맴버_ê°ì²´" -#: sql_help.c:324 +#: sql_help.c:337 msgid "where member_object is:" msgstr "맴버_ê°ì²´ 사용법:" -#: sql_help.c:325 sql_help.c:330 sql_help.c:331 sql_help.c:332 sql_help.c:333 -#: sql_help.c:334 sql_help.c:335 sql_help.c:340 sql_help.c:344 sql_help.c:346 -#: sql_help.c:348 sql_help.c:357 sql_help.c:358 sql_help.c:359 sql_help.c:360 -#: sql_help.c:361 sql_help.c:362 sql_help.c:363 sql_help.c:364 sql_help.c:367 -#: sql_help.c:368 sql_help.c:1781 sql_help.c:1786 sql_help.c:1793 -#: sql_help.c:1794 sql_help.c:1795 sql_help.c:1796 sql_help.c:1797 -#: sql_help.c:1798 sql_help.c:1799 sql_help.c:1804 sql_help.c:1806 -#: sql_help.c:1810 sql_help.c:1812 sql_help.c:1816 sql_help.c:1821 -#: sql_help.c:1822 sql_help.c:1829 sql_help.c:1830 sql_help.c:1831 -#: sql_help.c:1832 sql_help.c:1833 sql_help.c:1834 sql_help.c:1835 -#: sql_help.c:1836 sql_help.c:1837 sql_help.c:1838 sql_help.c:1839 -#: sql_help.c:1844 sql_help.c:1845 sql_help.c:4189 sql_help.c:4194 -#: sql_help.c:4195 sql_help.c:4196 sql_help.c:4197 sql_help.c:4203 -#: sql_help.c:4204 sql_help.c:4209 sql_help.c:4210 sql_help.c:4215 -#: sql_help.c:4216 sql_help.c:4217 sql_help.c:4218 sql_help.c:4219 -#: sql_help.c:4220 +#: sql_help.c:338 sql_help.c:343 sql_help.c:344 sql_help.c:345 sql_help.c:346 +#: sql_help.c:347 sql_help.c:348 sql_help.c:353 sql_help.c:357 sql_help.c:359 +#: sql_help.c:361 sql_help.c:370 sql_help.c:371 sql_help.c:372 sql_help.c:373 +#: sql_help.c:374 sql_help.c:375 sql_help.c:376 sql_help.c:377 sql_help.c:380 +#: sql_help.c:381 sql_help.c:1861 sql_help.c:1866 sql_help.c:1873 +#: sql_help.c:1874 sql_help.c:1875 sql_help.c:1876 sql_help.c:1877 +#: sql_help.c:1878 sql_help.c:1879 sql_help.c:1884 sql_help.c:1886 +#: sql_help.c:1890 sql_help.c:1892 sql_help.c:1896 sql_help.c:1901 +#: sql_help.c:1902 sql_help.c:1909 sql_help.c:1910 sql_help.c:1911 +#: sql_help.c:1912 sql_help.c:1913 sql_help.c:1914 sql_help.c:1915 +#: sql_help.c:1916 sql_help.c:1917 sql_help.c:1918 sql_help.c:1919 +#: sql_help.c:1924 sql_help.c:1925 sql_help.c:4496 sql_help.c:4501 +#: sql_help.c:4502 sql_help.c:4503 sql_help.c:4504 sql_help.c:4510 +#: sql_help.c:4511 sql_help.c:4516 sql_help.c:4517 sql_help.c:4522 +#: sql_help.c:4523 sql_help.c:4524 sql_help.c:4525 sql_help.c:4526 +#: sql_help.c:4527 msgid "object_name" msgstr "ê°ì²´ì´ë¦„" -#: sql_help.c:326 sql_help.c:1782 sql_help.c:4192 +#: sql_help.c:339 sql_help.c:1862 sql_help.c:4499 msgid "aggregate_name" msgstr "집계함수ì´ë¦„" -#: sql_help.c:328 sql_help.c:1784 sql_help.c:2068 sql_help.c:2072 -#: sql_help.c:2074 sql_help.c:3231 +#: sql_help.c:341 sql_help.c:1864 sql_help.c:2154 sql_help.c:2158 +#: sql_help.c:2160 sql_help.c:3385 msgid "source_type" msgstr "기존ìžë£Œí˜•" -#: sql_help.c:329 sql_help.c:1785 sql_help.c:2069 sql_help.c:2073 -#: sql_help.c:2075 sql_help.c:3232 +#: sql_help.c:342 sql_help.c:1865 sql_help.c:2155 sql_help.c:2159 +#: sql_help.c:2161 sql_help.c:3386 msgid "target_type" msgstr "대ìƒìžë£Œí˜•" -#: sql_help.c:336 sql_help.c:774 sql_help.c:1800 sql_help.c:2070 -#: sql_help.c:2111 sql_help.c:2176 sql_help.c:2426 sql_help.c:2457 -#: sql_help.c:2995 sql_help.c:4100 sql_help.c:4198 sql_help.c:4311 -#: sql_help.c:4315 sql_help.c:4319 sql_help.c:4322 sql_help.c:4550 -#: sql_help.c:4554 sql_help.c:4558 sql_help.c:4561 sql_help.c:4770 -#: sql_help.c:4774 sql_help.c:4778 sql_help.c:4781 +#: sql_help.c:349 sql_help.c:802 sql_help.c:1880 sql_help.c:2156 +#: sql_help.c:2199 sql_help.c:2279 sql_help.c:2547 sql_help.c:2578 +#: sql_help.c:3145 sql_help.c:4398 sql_help.c:4505 sql_help.c:4622 +#: sql_help.c:4626 sql_help.c:4630 sql_help.c:4633 sql_help.c:4880 +#: sql_help.c:4884 sql_help.c:4888 sql_help.c:4891 sql_help.c:5125 +#: sql_help.c:5129 sql_help.c:5133 sql_help.c:5136 msgid "function_name" msgstr "함수ì´ë¦„" -#: sql_help.c:341 sql_help.c:767 sql_help.c:1807 sql_help.c:2450 +#: sql_help.c:354 sql_help.c:795 sql_help.c:1887 sql_help.c:2571 msgid "operator_name" msgstr "ì—°ì‚°ìžì´ë¦„" -#: sql_help.c:342 sql_help.c:703 sql_help.c:707 sql_help.c:711 sql_help.c:1808 -#: sql_help.c:2427 sql_help.c:3355 +#: sql_help.c:355 sql_help.c:729 sql_help.c:733 sql_help.c:737 sql_help.c:1888 +#: sql_help.c:2548 sql_help.c:3509 msgid "left_type" msgstr "왼쪽ì¸ìž_ìžë£Œí˜•" -#: sql_help.c:343 sql_help.c:704 sql_help.c:708 sql_help.c:712 sql_help.c:1809 -#: sql_help.c:2428 sql_help.c:3356 +#: sql_help.c:356 sql_help.c:730 sql_help.c:734 sql_help.c:738 sql_help.c:1889 +#: sql_help.c:2549 sql_help.c:3510 msgid "right_type" msgstr "오른쪽ì¸ìž_ìžë£Œí˜•" -#: sql_help.c:345 sql_help.c:347 sql_help.c:730 sql_help.c:733 sql_help.c:736 -#: sql_help.c:765 sql_help.c:777 sql_help.c:785 sql_help.c:788 sql_help.c:791 -#: sql_help.c:1359 sql_help.c:1811 sql_help.c:1813 sql_help.c:2447 -#: sql_help.c:2468 sql_help.c:2831 sql_help.c:3365 sql_help.c:3374 +#: sql_help.c:358 sql_help.c:360 sql_help.c:758 sql_help.c:761 sql_help.c:764 +#: sql_help.c:793 sql_help.c:805 sql_help.c:813 sql_help.c:816 sql_help.c:819 +#: sql_help.c:1426 sql_help.c:1891 sql_help.c:1893 sql_help.c:2568 +#: sql_help.c:2589 sql_help.c:2975 sql_help.c:3519 sql_help.c:3528 msgid "index_method" msgstr "색ì¸ë°©ë²•" -#: sql_help.c:349 sql_help.c:1817 sql_help.c:4205 +#: sql_help.c:362 sql_help.c:1897 sql_help.c:4512 msgid "procedure_name" msgstr "프로시져_ì´ë¦„" -#: sql_help.c:353 sql_help.c:1823 sql_help.c:3752 sql_help.c:4211 +#: sql_help.c:366 sql_help.c:1903 sql_help.c:3935 sql_help.c:4518 msgid "routine_name" msgstr "루틴_ì´ë¦„" -#: sql_help.c:365 sql_help.c:1331 sql_help.c:1840 sql_help.c:2304 -#: sql_help.c:2507 sql_help.c:2786 sql_help.c:2962 sql_help.c:3536 -#: sql_help.c:3766 sql_help.c:4114 +#: sql_help.c:378 sql_help.c:1398 sql_help.c:1920 sql_help.c:2423 +#: sql_help.c:2629 sql_help.c:2930 sql_help.c:3112 sql_help.c:3690 +#: sql_help.c:3957 sql_help.c:4420 msgid "type_name" msgstr "ìžë£Œí˜•ì´ë¦„" -#: sql_help.c:366 sql_help.c:1841 sql_help.c:2303 sql_help.c:2506 -#: sql_help.c:2963 sql_help.c:3189 sql_help.c:3537 sql_help.c:3758 -#: sql_help.c:4106 +#: sql_help.c:379 sql_help.c:1921 sql_help.c:2422 sql_help.c:2628 +#: sql_help.c:3113 sql_help.c:3343 sql_help.c:3691 sql_help.c:3942 +#: sql_help.c:4405 msgid "lang_name" msgstr "언어_ì´ë¦„" -#: sql_help.c:369 +#: sql_help.c:382 msgid "and aggregate_signature is:" msgstr "집계함수_ì‹ë³„구문 사용법:" -#: sql_help.c:392 sql_help.c:1935 sql_help.c:2201 +#: sql_help.c:405 sql_help.c:2021 sql_help.c:2304 msgid "handler_function" msgstr "핸들러_함수" -#: sql_help.c:393 sql_help.c:2202 +#: sql_help.c:406 sql_help.c:2305 msgid "validator_function" msgstr "유효성검사_함수" -#: sql_help.c:441 sql_help.c:519 sql_help.c:659 sql_help.c:841 sql_help.c:979 -#: sql_help.c:1263 sql_help.c:1529 +#: sql_help.c:454 sql_help.c:533 sql_help.c:677 sql_help.c:869 sql_help.c:1019 +#: sql_help.c:1325 sql_help.c:1602 msgid "action" msgstr "ë™ìž‘" -#: sql_help.c:443 sql_help.c:450 sql_help.c:454 sql_help.c:455 sql_help.c:458 -#: sql_help.c:460 sql_help.c:461 sql_help.c:462 sql_help.c:464 sql_help.c:467 -#: sql_help.c:469 sql_help.c:470 sql_help.c:663 sql_help.c:673 sql_help.c:675 -#: sql_help.c:678 sql_help.c:680 sql_help.c:1055 sql_help.c:1265 -#: sql_help.c:1283 sql_help.c:1287 sql_help.c:1288 sql_help.c:1292 -#: sql_help.c:1294 sql_help.c:1295 sql_help.c:1296 sql_help.c:1297 -#: sql_help.c:1299 sql_help.c:1302 sql_help.c:1303 sql_help.c:1305 -#: sql_help.c:1308 sql_help.c:1310 sql_help.c:1355 sql_help.c:1357 -#: sql_help.c:1364 sql_help.c:1373 sql_help.c:1378 sql_help.c:1630 -#: sql_help.c:1633 sql_help.c:1637 sql_help.c:1673 sql_help.c:1788 -#: sql_help.c:1901 sql_help.c:1907 sql_help.c:1920 sql_help.c:1921 -#: sql_help.c:1922 sql_help.c:2243 sql_help.c:2256 sql_help.c:2301 -#: sql_help.c:2367 sql_help.c:2373 sql_help.c:2406 sql_help.c:2633 -#: sql_help.c:2661 sql_help.c:2662 sql_help.c:2769 sql_help.c:2777 -#: sql_help.c:2787 sql_help.c:2790 sql_help.c:2800 sql_help.c:2804 -#: sql_help.c:2827 sql_help.c:2829 sql_help.c:2836 sql_help.c:2849 -#: sql_help.c:2854 sql_help.c:2872 sql_help.c:2998 sql_help.c:3134 -#: sql_help.c:3737 sql_help.c:3738 sql_help.c:3819 sql_help.c:3834 -#: sql_help.c:3836 sql_help.c:3838 sql_help.c:4085 sql_help.c:4086 -#: sql_help.c:4191 sql_help.c:4342 sql_help.c:4581 sql_help.c:4623 -#: sql_help.c:4625 sql_help.c:4627 sql_help.c:4673 sql_help.c:4801 +#: sql_help.c:456 sql_help.c:463 sql_help.c:467 sql_help.c:468 sql_help.c:471 +#: sql_help.c:473 sql_help.c:474 sql_help.c:475 sql_help.c:477 sql_help.c:480 +#: sql_help.c:482 sql_help.c:483 sql_help.c:681 sql_help.c:691 sql_help.c:693 +#: sql_help.c:696 sql_help.c:698 sql_help.c:699 sql_help.c:927 sql_help.c:1096 +#: sql_help.c:1327 sql_help.c:1345 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 sql_help.c:1358 +#: sql_help.c:1360 sql_help.c:1361 sql_help.c:1363 sql_help.c:1366 +#: sql_help.c:1367 sql_help.c:1369 sql_help.c:1372 sql_help.c:1374 +#: sql_help.c:1375 sql_help.c:1422 sql_help.c:1424 sql_help.c:1431 +#: sql_help.c:1440 sql_help.c:1445 sql_help.c:1452 sql_help.c:1453 +#: sql_help.c:1704 sql_help.c:1707 sql_help.c:1711 sql_help.c:1747 +#: sql_help.c:1868 sql_help.c:1984 sql_help.c:1990 sql_help.c:2004 +#: sql_help.c:2005 sql_help.c:2006 sql_help.c:2354 sql_help.c:2367 +#: sql_help.c:2420 sql_help.c:2488 sql_help.c:2494 sql_help.c:2527 +#: sql_help.c:2658 sql_help.c:2763 sql_help.c:2798 sql_help.c:2800 +#: sql_help.c:2912 sql_help.c:2921 sql_help.c:2931 sql_help.c:2934 +#: sql_help.c:2944 sql_help.c:2948 sql_help.c:2971 sql_help.c:2973 +#: sql_help.c:2980 sql_help.c:2993 sql_help.c:2998 sql_help.c:3005 +#: sql_help.c:3006 sql_help.c:3022 sql_help.c:3148 sql_help.c:3288 +#: sql_help.c:3914 sql_help.c:3915 sql_help.c:4011 sql_help.c:4026 +#: sql_help.c:4028 sql_help.c:4030 sql_help.c:4124 sql_help.c:4127 +#: sql_help.c:4129 sql_help.c:4131 sql_help.c:4377 sql_help.c:4378 +#: sql_help.c:4498 sql_help.c:4659 sql_help.c:4666 sql_help.c:4668 +#: sql_help.c:4917 sql_help.c:4924 sql_help.c:4926 sql_help.c:4967 +#: sql_help.c:4969 sql_help.c:4971 sql_help.c:5024 sql_help.c:5162 +#: sql_help.c:5169 sql_help.c:5171 msgid "column_name" msgstr "칼럼ì´ë¦„" -#: sql_help.c:444 sql_help.c:664 sql_help.c:1266 sql_help.c:1638 +#: sql_help.c:457 sql_help.c:682 sql_help.c:1328 sql_help.c:1712 msgid "new_column_name" msgstr "새칼럼ì´ë¦„" -#: sql_help.c:449 sql_help.c:540 sql_help.c:672 sql_help.c:862 sql_help.c:1000 -#: sql_help.c:1282 sql_help.c:1539 +#: sql_help.c:462 sql_help.c:554 sql_help.c:690 sql_help.c:890 sql_help.c:1040 +#: sql_help.c:1344 sql_help.c:1612 msgid "where action is one of:" msgstr "ë™ìž‘ 사용법:" -#: sql_help.c:451 sql_help.c:456 sql_help.c:1047 sql_help.c:1284 -#: sql_help.c:1289 sql_help.c:1541 sql_help.c:1545 sql_help.c:2156 -#: sql_help.c:2244 sql_help.c:2446 sql_help.c:2626 sql_help.c:2770 -#: sql_help.c:3043 sql_help.c:3921 +#: sql_help.c:464 sql_help.c:469 sql_help.c:1088 sql_help.c:1346 +#: sql_help.c:1351 sql_help.c:1614 sql_help.c:1618 sql_help.c:2258 +#: sql_help.c:2355 sql_help.c:2567 sql_help.c:2756 sql_help.c:2913 +#: sql_help.c:3195 sql_help.c:4183 msgid "data_type" msgstr "ìžë£Œí˜•" -#: sql_help.c:452 sql_help.c:457 sql_help.c:1285 sql_help.c:1290 -#: sql_help.c:1542 sql_help.c:1546 sql_help.c:2157 sql_help.c:2247 -#: sql_help.c:2369 sql_help.c:2771 sql_help.c:2779 sql_help.c:2792 -#: sql_help.c:2806 sql_help.c:3044 sql_help.c:3050 sql_help.c:3829 +#: sql_help.c:465 sql_help.c:470 sql_help.c:1347 sql_help.c:1352 +#: sql_help.c:1447 sql_help.c:1615 sql_help.c:1619 sql_help.c:2259 +#: sql_help.c:2358 sql_help.c:2490 sql_help.c:2915 sql_help.c:2923 +#: sql_help.c:2936 sql_help.c:2950 sql_help.c:3000 sql_help.c:3196 +#: sql_help.c:3202 sql_help.c:4021 msgid "collation" msgstr "collation" -#: sql_help.c:453 sql_help.c:1286 sql_help.c:2248 sql_help.c:2257 -#: sql_help.c:2772 sql_help.c:2788 sql_help.c:2801 +#: sql_help.c:466 sql_help.c:1348 sql_help.c:2359 sql_help.c:2368 +#: sql_help.c:2916 sql_help.c:2932 sql_help.c:2945 msgid "column_constraint" msgstr "칼럼_제약조건" -#: sql_help.c:463 sql_help.c:603 sql_help.c:674 sql_help.c:1304 sql_help.c:4670 +#: sql_help.c:476 sql_help.c:618 sql_help.c:692 sql_help.c:1368 sql_help.c:5018 msgid "integer" msgstr "정수" -#: sql_help.c:465 sql_help.c:468 sql_help.c:676 sql_help.c:679 sql_help.c:1306 -#: sql_help.c:1309 +#: sql_help.c:478 sql_help.c:481 sql_help.c:694 sql_help.c:697 sql_help.c:1370 +#: sql_help.c:1373 msgid "attribute_option" msgstr "ì†ì„±_옵션" -#: sql_help.c:473 sql_help.c:1311 sql_help.c:2249 sql_help.c:2258 -#: sql_help.c:2773 sql_help.c:2789 sql_help.c:2802 +#: sql_help.c:486 sql_help.c:1377 sql_help.c:2360 sql_help.c:2369 +#: sql_help.c:2917 sql_help.c:2933 sql_help.c:2946 msgid "table_constraint" msgstr "í…Œì´ë¸”_제약조건" -#: sql_help.c:476 sql_help.c:477 sql_help.c:478 sql_help.c:479 sql_help.c:1316 -#: sql_help.c:1317 sql_help.c:1318 sql_help.c:1319 sql_help.c:1842 +#: sql_help.c:489 sql_help.c:490 sql_help.c:491 sql_help.c:492 sql_help.c:1382 +#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:1922 msgid "trigger_name" msgstr "트리거ì´ë¦„" -#: sql_help.c:480 sql_help.c:481 sql_help.c:1329 sql_help.c:1330 -#: sql_help.c:2250 sql_help.c:2255 sql_help.c:2776 sql_help.c:2799 +#: sql_help.c:493 sql_help.c:494 sql_help.c:1396 sql_help.c:1397 +#: sql_help.c:2361 sql_help.c:2366 sql_help.c:2920 sql_help.c:2943 msgid "parent_table" msgstr "ìƒìœ„_í…Œì´ë¸”" -#: sql_help.c:539 sql_help.c:595 sql_help.c:661 sql_help.c:861 sql_help.c:999 -#: sql_help.c:1498 sql_help.c:2187 +#: sql_help.c:553 sql_help.c:610 sql_help.c:679 sql_help.c:889 sql_help.c:1039 +#: sql_help.c:1571 sql_help.c:2290 msgid "extension_name" msgstr "확장모듈ì´ë¦„" -#: sql_help.c:541 sql_help.c:1001 sql_help.c:2305 +#: sql_help.c:555 sql_help.c:1041 sql_help.c:2424 msgid "execution_cost" msgstr "실행비용" -#: sql_help.c:542 sql_help.c:1002 sql_help.c:2306 +#: sql_help.c:556 sql_help.c:1042 sql_help.c:2425 msgid "result_rows" msgstr "반환ìžë£Œìˆ˜" -#: sql_help.c:543 sql_help.c:2307 +#: sql_help.c:557 sql_help.c:2426 msgid "support_function" msgstr "ì§€ì›_함수" -#: sql_help.c:564 sql_help.c:566 sql_help.c:925 sql_help.c:933 sql_help.c:937 -#: sql_help.c:940 sql_help.c:943 sql_help.c:1580 sql_help.c:1588 -#: sql_help.c:1592 sql_help.c:1595 sql_help.c:1598 sql_help.c:2604 -#: sql_help.c:2606 sql_help.c:2609 sql_help.c:2610 sql_help.c:3736 -#: sql_help.c:3740 sql_help.c:3743 sql_help.c:3745 sql_help.c:3747 -#: sql_help.c:3749 sql_help.c:3751 sql_help.c:3757 sql_help.c:3759 -#: sql_help.c:3761 sql_help.c:3763 sql_help.c:3765 sql_help.c:3767 -#: sql_help.c:3769 sql_help.c:3770 sql_help.c:4084 sql_help.c:4088 -#: sql_help.c:4091 sql_help.c:4093 sql_help.c:4095 sql_help.c:4097 -#: sql_help.c:4099 sql_help.c:4105 sql_help.c:4107 sql_help.c:4109 -#: sql_help.c:4111 sql_help.c:4113 sql_help.c:4115 sql_help.c:4117 -#: sql_help.c:4118 +#: sql_help.c:579 sql_help.c:581 sql_help.c:964 sql_help.c:972 sql_help.c:976 +#: sql_help.c:979 sql_help.c:982 sql_help.c:1654 sql_help.c:1662 +#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1672 sql_help.c:2734 +#: sql_help.c:2736 sql_help.c:2739 sql_help.c:2740 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3917 sql_help.c:3918 sql_help.c:3921 +#: sql_help.c:3922 sql_help.c:3924 sql_help.c:3925 sql_help.c:3927 +#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3931 sql_help.c:3933 +#: sql_help.c:3934 sql_help.c:3940 sql_help.c:3941 sql_help.c:3943 +#: sql_help.c:3944 sql_help.c:3946 sql_help.c:3947 sql_help.c:3949 +#: sql_help.c:3950 sql_help.c:3952 sql_help.c:3953 sql_help.c:3955 +#: sql_help.c:3956 sql_help.c:3958 sql_help.c:3959 sql_help.c:3961 +#: sql_help.c:3962 sql_help.c:4375 sql_help.c:4376 sql_help.c:4380 +#: sql_help.c:4381 sql_help.c:4384 sql_help.c:4385 sql_help.c:4387 +#: sql_help.c:4388 sql_help.c:4390 sql_help.c:4391 sql_help.c:4393 +#: sql_help.c:4394 sql_help.c:4396 sql_help.c:4397 sql_help.c:4403 +#: sql_help.c:4404 sql_help.c:4406 sql_help.c:4407 sql_help.c:4409 +#: sql_help.c:4410 sql_help.c:4412 sql_help.c:4413 sql_help.c:4415 +#: sql_help.c:4416 sql_help.c:4418 sql_help.c:4419 sql_help.c:4421 +#: sql_help.c:4422 sql_help.c:4424 sql_help.c:4425 msgid "role_specification" msgstr "롤_명세" -#: sql_help.c:565 sql_help.c:567 sql_help.c:1611 sql_help.c:2130 -#: sql_help.c:2612 sql_help.c:3119 sql_help.c:3570 sql_help.c:4427 +#: sql_help.c:580 sql_help.c:582 sql_help.c:1685 sql_help.c:2225 +#: sql_help.c:2742 sql_help.c:3273 sql_help.c:3724 sql_help.c:4753 msgid "user_name" msgstr "사용ìžì´ë¦„" -#: sql_help.c:568 sql_help.c:945 sql_help.c:1600 sql_help.c:2611 -#: sql_help.c:3771 sql_help.c:4119 +#: sql_help.c:583 sql_help.c:984 sql_help.c:1674 sql_help.c:2741 +#: sql_help.c:3963 sql_help.c:4426 msgid "where role_specification can be:" msgstr "롤_명세 사용법:" -#: sql_help.c:570 +#: sql_help.c:585 msgid "group_name" msgstr "그룹ì´ë¦„" -#: sql_help.c:591 sql_help.c:1376 sql_help.c:2136 sql_help.c:2376 -#: sql_help.c:2410 sql_help.c:2784 sql_help.c:2797 sql_help.c:2811 -#: sql_help.c:2852 sql_help.c:2876 sql_help.c:2888 sql_help.c:3764 -#: sql_help.c:4112 +#: sql_help.c:606 sql_help.c:1443 sql_help.c:2237 sql_help.c:2497 +#: sql_help.c:2531 sql_help.c:2928 sql_help.c:2941 sql_help.c:2955 +#: sql_help.c:2996 sql_help.c:3026 sql_help.c:3038 sql_help.c:3954 +#: sql_help.c:4417 msgid "tablespace_name" msgstr "í…Œì´ë¸”스페ì´ìФì´ë¦„" -#: sql_help.c:593 sql_help.c:681 sql_help.c:1324 sql_help.c:1333 -#: sql_help.c:1371 sql_help.c:1722 +#: sql_help.c:608 sql_help.c:701 sql_help.c:1390 sql_help.c:1400 +#: sql_help.c:1438 sql_help.c:1800 msgid "index_name" msgstr "ì¸ë±ìФì´ë¦„" -#: sql_help.c:597 sql_help.c:600 sql_help.c:682 sql_help.c:684 sql_help.c:1326 -#: sql_help.c:1328 sql_help.c:1374 sql_help.c:2374 sql_help.c:2408 -#: sql_help.c:2782 sql_help.c:2795 sql_help.c:2809 sql_help.c:2850 -#: sql_help.c:2874 +#: sql_help.c:612 sql_help.c:615 sql_help.c:704 sql_help.c:706 sql_help.c:1393 +#: sql_help.c:1395 sql_help.c:1441 sql_help.c:2495 sql_help.c:2529 +#: sql_help.c:2926 sql_help.c:2939 sql_help.c:2953 sql_help.c:2994 +#: sql_help.c:3024 msgid "storage_parameter" msgstr "스토리지_매개변수" -#: sql_help.c:602 +#: sql_help.c:617 msgid "column_number" msgstr "칼럼번호" -#: sql_help.c:626 sql_help.c:1805 sql_help.c:4202 +#: sql_help.c:641 sql_help.c:1885 sql_help.c:4509 msgid "large_object_oid" msgstr "대형_ê°ì²´_oid" -#: sql_help.c:713 sql_help.c:2431 +#: sql_help.c:700 sql_help.c:1376 sql_help.c:2914 +msgid "compression_method" +msgstr "ì••ì¶•_방법" + +#: sql_help.c:702 sql_help.c:1391 +msgid "new_access_method" +msgstr "새_ì ‘ê·¼_방법" + +#: sql_help.c:739 sql_help.c:2552 msgid "res_proc" -msgstr "" +msgstr "res_proc" -#: sql_help.c:714 sql_help.c:2432 +#: sql_help.c:740 sql_help.c:2553 msgid "join_proc" -msgstr "" +msgstr "join_proc" + +#: sql_help.c:741 sql_help.c:2550 +msgid "com_op" +msgstr "com_op" + +#: sql_help.c:742 sql_help.c:2551 +msgid "neg_op" +msgstr "neg_op" -#: sql_help.c:766 sql_help.c:778 sql_help.c:2449 +#: sql_help.c:794 sql_help.c:806 sql_help.c:2570 msgid "strategy_number" msgstr "ì „ëžµ_번호" -#: sql_help.c:768 sql_help.c:769 sql_help.c:772 sql_help.c:773 sql_help.c:779 -#: sql_help.c:780 sql_help.c:782 sql_help.c:783 sql_help.c:2451 sql_help.c:2452 -#: sql_help.c:2455 sql_help.c:2456 +#: sql_help.c:796 sql_help.c:797 sql_help.c:800 sql_help.c:801 sql_help.c:807 +#: sql_help.c:808 sql_help.c:810 sql_help.c:811 sql_help.c:2572 sql_help.c:2573 +#: sql_help.c:2576 sql_help.c:2577 msgid "op_type" msgstr "ì—°ì‚°ìžìžë£Œí˜•" -#: sql_help.c:770 sql_help.c:2453 +#: sql_help.c:798 sql_help.c:2574 msgid "sort_family_name" -msgstr "" +msgstr "ì •ë ¬_가족_ì´ë¦„" -#: sql_help.c:771 sql_help.c:781 sql_help.c:2454 +#: sql_help.c:799 sql_help.c:809 sql_help.c:2575 msgid "support_number" -msgstr "" +msgstr "ì§€ì›_번호" -#: sql_help.c:775 sql_help.c:2071 sql_help.c:2458 sql_help.c:2965 -#: sql_help.c:2967 +#: sql_help.c:803 sql_help.c:2157 sql_help.c:2579 sql_help.c:3115 +#: sql_help.c:3117 msgid "argument_type" msgstr "ì¸ìžìžë£Œí˜•" -#: sql_help.c:806 sql_help.c:809 sql_help.c:880 sql_help.c:882 sql_help.c:884 -#: sql_help.c:1015 sql_help.c:1054 sql_help.c:1494 sql_help.c:1497 -#: sql_help.c:1672 sql_help.c:1721 sql_help.c:1790 sql_help.c:1815 -#: sql_help.c:1828 sql_help.c:1843 sql_help.c:1900 sql_help.c:1906 -#: sql_help.c:2242 sql_help.c:2254 sql_help.c:2365 sql_help.c:2405 -#: sql_help.c:2482 sql_help.c:2525 sql_help.c:2581 sql_help.c:2632 -#: sql_help.c:2663 sql_help.c:2768 sql_help.c:2785 sql_help.c:2798 -#: sql_help.c:2871 sql_help.c:2991 sql_help.c:3168 sql_help.c:3391 -#: sql_help.c:3440 sql_help.c:3546 sql_help.c:3734 sql_help.c:3739 -#: sql_help.c:3785 sql_help.c:3817 sql_help.c:4082 sql_help.c:4087 -#: sql_help.c:4190 sql_help.c:4297 sql_help.c:4299 sql_help.c:4348 -#: sql_help.c:4387 sql_help.c:4536 sql_help.c:4538 sql_help.c:4587 -#: sql_help.c:4621 sql_help.c:4672 sql_help.c:4756 sql_help.c:4758 -#: sql_help.c:4807 +#: sql_help.c:834 sql_help.c:837 sql_help.c:926 sql_help.c:1055 sql_help.c:1095 +#: sql_help.c:1567 sql_help.c:1570 sql_help.c:1746 sql_help.c:1799 +#: sql_help.c:1870 sql_help.c:1895 sql_help.c:1908 sql_help.c:1923 +#: sql_help.c:1983 sql_help.c:1989 sql_help.c:2353 sql_help.c:2365 +#: sql_help.c:2486 sql_help.c:2526 sql_help.c:2603 sql_help.c:2657 +#: sql_help.c:2710 sql_help.c:2762 sql_help.c:2795 sql_help.c:2802 +#: sql_help.c:2911 sql_help.c:2929 sql_help.c:2942 sql_help.c:3021 +#: sql_help.c:3141 sql_help.c:3322 sql_help.c:3545 sql_help.c:3594 +#: sql_help.c:3700 sql_help.c:3910 sql_help.c:3916 sql_help.c:3977 +#: sql_help.c:4009 sql_help.c:4373 sql_help.c:4379 sql_help.c:4497 +#: sql_help.c:4610 sql_help.c:4673 sql_help.c:4712 sql_help.c:4868 +#: sql_help.c:4931 sql_help.c:4965 sql_help.c:5023 sql_help.c:5113 +#: sql_help.c:5176 msgid "table_name" -msgstr "í…Œì´ë¸”ì´ë¦„" +msgstr "í…Œì´ë¸”_ì´ë¦„" -#: sql_help.c:811 sql_help.c:2484 +#: sql_help.c:839 sql_help.c:2605 msgid "using_expression" -msgstr "" +msgstr "using_expression" -#: sql_help.c:812 sql_help.c:2485 +#: sql_help.c:840 sql_help.c:2606 msgid "check_expression" msgstr "ì²´í¬_표현ì‹" -#: sql_help.c:886 sql_help.c:2526 +#: sql_help.c:913 sql_help.c:915 sql_help.c:917 sql_help.c:2653 +msgid "publication_object" +msgstr "발행_ê°ì²´" + +#: sql_help.c:919 sql_help.c:2654 msgid "publication_parameter" msgstr "발행_매개변수" -#: sql_help.c:929 sql_help.c:1584 sql_help.c:2344 sql_help.c:2558 -#: sql_help.c:3102 +#: sql_help.c:925 sql_help.c:2656 +msgid "where publication_object is one of:" +msgstr "발행_ê°ì²´ 사용법:" + +#: sql_help.c:968 sql_help.c:1658 sql_help.c:2464 sql_help.c:2689 +#: sql_help.c:3256 msgid "password" msgstr "암호" -#: sql_help.c:930 sql_help.c:1585 sql_help.c:2345 sql_help.c:2559 -#: sql_help.c:3103 +#: sql_help.c:969 sql_help.c:1659 sql_help.c:2465 sql_help.c:2690 +#: sql_help.c:3257 msgid "timestamp" -msgstr "" +msgstr "타임스탬프" -#: sql_help.c:934 sql_help.c:938 sql_help.c:941 sql_help.c:944 sql_help.c:1589 -#: sql_help.c:1593 sql_help.c:1596 sql_help.c:1599 sql_help.c:3744 -#: sql_help.c:4092 +#: sql_help.c:973 sql_help.c:977 sql_help.c:980 sql_help.c:983 sql_help.c:1663 +#: sql_help.c:1667 sql_help.c:1670 sql_help.c:1673 sql_help.c:3923 +#: sql_help.c:4386 msgid "database_name" -msgstr "ë°ì´í„°ë² ì´ìФì´ë¦„" +msgstr "ë°ì´í„°ë² ì´ìФ_ì´ë¦„" -#: sql_help.c:1048 sql_help.c:2627 +#: sql_help.c:1089 sql_help.c:2757 msgid "increment" -msgstr "" +msgstr "ì¦ê°€ê°’" -#: sql_help.c:1049 sql_help.c:2628 +#: sql_help.c:1090 sql_help.c:2758 msgid "minvalue" msgstr "최소값" -#: sql_help.c:1050 sql_help.c:2629 +#: sql_help.c:1091 sql_help.c:2759 msgid "maxvalue" msgstr "최대값" -#: sql_help.c:1051 sql_help.c:2630 sql_help.c:4295 sql_help.c:4385 -#: sql_help.c:4534 sql_help.c:4689 sql_help.c:4754 +#: sql_help.c:1092 sql_help.c:2760 sql_help.c:4606 sql_help.c:4710 +#: sql_help.c:4864 sql_help.c:5040 sql_help.c:5109 msgid "start" msgstr "시작" -#: sql_help.c:1052 sql_help.c:1301 +#: sql_help.c:1093 sql_help.c:1365 msgid "restart" msgstr "재시작" -#: sql_help.c:1053 sql_help.c:2631 +#: sql_help.c:1094 sql_help.c:2761 msgid "cache" msgstr "ìºì‰¬" -#: sql_help.c:1097 +#: sql_help.c:1139 msgid "new_target" msgstr "새대ìƒ" -#: sql_help.c:1113 sql_help.c:2675 +#: sql_help.c:1158 sql_help.c:2814 msgid "conninfo" msgstr "ì ‘ì†ì •ë³´" -#: sql_help.c:1115 sql_help.c:2676 +#: sql_help.c:1160 sql_help.c:1164 sql_help.c:1168 sql_help.c:2815 msgid "publication_name" msgstr "발행_ì´ë¦„" -#: sql_help.c:1116 -msgid "set_publication_option" -msgstr "발행_옵션_설정" +#: sql_help.c:1161 sql_help.c:1165 sql_help.c:1169 +msgid "publication_option" +msgstr "발행_옵션" -#: sql_help.c:1119 +#: sql_help.c:1172 msgid "refresh_option" msgstr "새로고침_옵션" -#: sql_help.c:1124 sql_help.c:2677 +#: sql_help.c:1177 sql_help.c:2816 msgid "subscription_parameter" msgstr "구ë…_매개변수" -#: sql_help.c:1278 sql_help.c:1281 +#: sql_help.c:1180 +msgid "skip_option" +msgstr "skip_option" + +#: sql_help.c:1340 sql_help.c:1343 msgid "partition_name" msgstr "파티션_ì´ë¦„" -#: sql_help.c:1279 sql_help.c:2259 sql_help.c:2803 +#: sql_help.c:1341 sql_help.c:2370 sql_help.c:2947 msgid "partition_bound_spec" msgstr "파티션_범위_ì •ì˜" -#: sql_help.c:1298 sql_help.c:1345 sql_help.c:2817 +#: sql_help.c:1362 sql_help.c:1412 sql_help.c:2961 msgid "sequence_options" msgstr "시퀀스_옵션" -#: sql_help.c:1300 +#: sql_help.c:1364 msgid "sequence_option" msgstr "시퀀스_옵션" -#: sql_help.c:1312 +#: sql_help.c:1378 msgid "table_constraint_using_index" -msgstr "" +msgstr "색ì¸ì„_사용하는_í…Œì´ë¸”_제약조건" -#: sql_help.c:1320 sql_help.c:1321 sql_help.c:1322 sql_help.c:1323 +#: sql_help.c:1386 sql_help.c:1387 sql_help.c:1388 sql_help.c:1389 msgid "rewrite_rule_name" -msgstr "" +msgstr "rewrite_룰_ì´ë¦„" -#: sql_help.c:1334 sql_help.c:2842 +#: sql_help.c:1401 sql_help.c:2382 sql_help.c:2986 msgid "and partition_bound_spec is:" -msgstr "" +msgstr "파티션_범위_ì •ì˜ ì‚¬ìš©ë²•:" -#: sql_help.c:1335 sql_help.c:1336 sql_help.c:1337 sql_help.c:2843 -#: sql_help.c:2844 sql_help.c:2845 +#: sql_help.c:1402 sql_help.c:1403 sql_help.c:1404 sql_help.c:2383 +#: sql_help.c:2384 sql_help.c:2385 sql_help.c:2987 sql_help.c:2988 +#: sql_help.c:2989 msgid "partition_bound_expr" -msgstr "파티션_범위_ì •ì˜" +msgstr "파티션_범위_표현ì‹" -#: sql_help.c:1338 sql_help.c:1339 sql_help.c:2846 sql_help.c:2847 +#: sql_help.c:1405 sql_help.c:1406 sql_help.c:2386 sql_help.c:2387 +#: sql_help.c:2990 sql_help.c:2991 msgid "numeric_literal" -msgstr "" +msgstr "숫ìž" -#: sql_help.c:1340 +#: sql_help.c:1407 msgid "and column_constraint is:" msgstr "칼럼_제약조건 사용법:" -#: sql_help.c:1343 sql_help.c:2266 sql_help.c:2299 sql_help.c:2505 -#: sql_help.c:2815 +#: sql_help.c:1410 sql_help.c:2377 sql_help.c:2418 sql_help.c:2627 +#: sql_help.c:2959 msgid "default_expr" msgstr "초기값_표현ì‹" -#: sql_help.c:1344 sql_help.c:2267 sql_help.c:2816 +#: sql_help.c:1411 sql_help.c:2378 sql_help.c:2960 msgid "generation_expr" -msgstr "" +msgstr "ìƒì„±_표현ì‹" -#: sql_help.c:1346 sql_help.c:1347 sql_help.c:1356 sql_help.c:1358 -#: sql_help.c:1362 sql_help.c:2818 sql_help.c:2819 sql_help.c:2828 -#: sql_help.c:2830 sql_help.c:2834 +#: sql_help.c:1413 sql_help.c:1414 sql_help.c:1423 sql_help.c:1425 +#: sql_help.c:1429 sql_help.c:2962 sql_help.c:2963 sql_help.c:2972 +#: sql_help.c:2974 sql_help.c:2978 msgid "index_parameters" -msgstr "색ì¸ë§¤ê°œë³€ìˆ˜" +msgstr "색ì¸_매개변수" -#: sql_help.c:1348 sql_help.c:1365 sql_help.c:2820 sql_help.c:2837 +#: sql_help.c:1415 sql_help.c:1432 sql_help.c:2964 sql_help.c:2981 msgid "reftable" msgstr "참조테ì´ë¸”" -#: sql_help.c:1349 sql_help.c:1366 sql_help.c:2821 sql_help.c:2838 +#: sql_help.c:1416 sql_help.c:1433 sql_help.c:2965 sql_help.c:2982 msgid "refcolumn" msgstr "참조칼럼" -#: sql_help.c:1350 sql_help.c:1351 sql_help.c:1367 sql_help.c:1368 -#: sql_help.c:2822 sql_help.c:2823 sql_help.c:2839 sql_help.c:2840 +#: sql_help.c:1417 sql_help.c:1418 sql_help.c:1434 sql_help.c:1435 +#: sql_help.c:2966 sql_help.c:2967 sql_help.c:2983 sql_help.c:2984 msgid "referential_action" msgstr "참조_ë°©ì‹" -#: sql_help.c:1352 sql_help.c:2268 sql_help.c:2824 +#: sql_help.c:1419 sql_help.c:2379 sql_help.c:2968 msgid "and table_constraint is:" msgstr "í…Œì´ë¸”_제약조건 사용법:" -#: sql_help.c:1360 sql_help.c:2832 +#: sql_help.c:1427 sql_help.c:2976 msgid "exclude_element" -msgstr "" +msgstr "exclude_요소" -#: sql_help.c:1361 sql_help.c:2833 sql_help.c:4293 sql_help.c:4383 -#: sql_help.c:4532 sql_help.c:4687 sql_help.c:4752 +#: sql_help.c:1428 sql_help.c:2977 sql_help.c:4604 sql_help.c:4708 +#: sql_help.c:4862 sql_help.c:5038 sql_help.c:5107 msgid "operator" msgstr "ì—°ì‚°ìž" -#: sql_help.c:1363 sql_help.c:2377 sql_help.c:2835 +#: sql_help.c:1430 sql_help.c:2498 sql_help.c:2979 msgid "predicate" msgstr "범위한정구문" -#: sql_help.c:1369 +#: sql_help.c:1436 msgid "and table_constraint_using_index is:" -msgstr "" +msgstr "색ì¸ì„_사용하는_í…Œì´ë¸”_제약조건 사용법:" -#: sql_help.c:1372 sql_help.c:2848 +#: sql_help.c:1439 sql_help.c:2992 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" -msgstr "" +msgstr "UNIQUE, PRIMARY KEY, EXCLUDE 제약조건ì—서 쓰는 색ì¸_매개변수 사용법:" -#: sql_help.c:1377 sql_help.c:2853 +#: sql_help.c:1444 sql_help.c:2997 msgid "exclude_element in an EXCLUDE constraint is:" -msgstr "" +msgstr "EXCLUDE 제약조건ì—서 쓰는 exclude_요소 사용법:" -#: sql_help.c:1380 sql_help.c:2370 sql_help.c:2780 sql_help.c:2793 -#: sql_help.c:2807 sql_help.c:2856 sql_help.c:3830 +#: sql_help.c:1448 sql_help.c:2491 sql_help.c:2924 sql_help.c:2937 +#: sql_help.c:2951 sql_help.c:3001 sql_help.c:4022 msgid "opclass" msgstr "ì—°ì‚°ìží´ëž˜ìФ" -#: sql_help.c:1396 sql_help.c:1399 sql_help.c:2891 +#: sql_help.c:1449 sql_help.c:2492 sql_help.c:3002 +msgid "opclass_parameter" +msgstr "opclass_매개변수" + +#: sql_help.c:1451 sql_help.c:3004 +msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" +msgstr "FOREIGN KEY/REFERENCES 제약조건ì—서 쓰는 참조_ë°©ì‹ ì‚¬ìš©ë²•:" + +#: sql_help.c:1469 sql_help.c:1472 sql_help.c:3041 msgid "tablespace_option" msgstr "í…Œì´ë¸”스페ì´ìФ_옵션" -#: sql_help.c:1420 sql_help.c:1423 sql_help.c:1429 sql_help.c:1433 +#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1502 sql_help.c:1506 msgid "token_type" msgstr "토í°_종류" -#: sql_help.c:1421 sql_help.c:1424 +#: sql_help.c:1494 sql_help.c:1497 msgid "dictionary_name" msgstr "사전ì´ë¦„" -#: sql_help.c:1426 sql_help.c:1430 +#: sql_help.c:1499 sql_help.c:1503 msgid "old_dictionary" msgstr "옛사전" -#: sql_help.c:1427 sql_help.c:1431 +#: sql_help.c:1500 sql_help.c:1504 msgid "new_dictionary" msgstr "새사전" -#: sql_help.c:1526 sql_help.c:1540 sql_help.c:1543 sql_help.c:1544 -#: sql_help.c:3042 +#: sql_help.c:1599 sql_help.c:1613 sql_help.c:1616 sql_help.c:1617 +#: sql_help.c:3194 msgid "attribute_name" msgstr "ì†ì„±ì´ë¦„" -#: sql_help.c:1527 +#: sql_help.c:1600 msgid "new_attribute_name" msgstr "새ì†ì„±ì´ë¦„" -#: sql_help.c:1531 sql_help.c:1535 +#: sql_help.c:1604 sql_help.c:1608 msgid "new_enum_value" -msgstr "" +msgstr "새_enum_ê°’" -#: sql_help.c:1532 +#: sql_help.c:1605 msgid "neighbor_enum_value" -msgstr "" +msgstr "옆_enum_ê°’" -#: sql_help.c:1534 +#: sql_help.c:1607 msgid "existing_enum_value" -msgstr "" +msgstr "기존_enum_ê°’" -#: sql_help.c:1537 +#: sql_help.c:1610 msgid "property" msgstr "ì†ì„±" -#: sql_help.c:1612 sql_help.c:2251 sql_help.c:2260 sql_help.c:2643 -#: sql_help.c:3120 sql_help.c:3571 sql_help.c:3750 sql_help.c:3786 -#: sql_help.c:4098 +#: sql_help.c:1686 sql_help.c:2362 sql_help.c:2371 sql_help.c:2773 +#: sql_help.c:3274 sql_help.c:3725 sql_help.c:3932 sql_help.c:3978 +#: sql_help.c:4395 msgid "server_name" msgstr "서버ì´ë¦„" -#: sql_help.c:1644 sql_help.c:1647 sql_help.c:3135 +#: sql_help.c:1718 sql_help.c:1721 sql_help.c:3289 msgid "view_option_name" msgstr "ë·°_옵션ì´ë¦„" -#: sql_help.c:1645 sql_help.c:3136 +#: sql_help.c:1719 sql_help.c:3290 msgid "view_option_value" -msgstr "" +msgstr "ë·°_옵션_ê°’" -#: sql_help.c:1666 sql_help.c:1667 sql_help.c:4659 sql_help.c:4660 +#: sql_help.c:1740 sql_help.c:5007 msgid "table_and_columns" msgstr "í…Œì´ë¸”ê³¼_칼럼" -#: sql_help.c:1668 sql_help.c:1912 sql_help.c:3619 sql_help.c:3963 -#: sql_help.c:4661 +#: sql_help.c:1741 sql_help.c:1801 sql_help.c:1995 sql_help.c:3774 +#: sql_help.c:4230 sql_help.c:5008 msgid "where option can be one of:" msgstr "옵션 사용법:" -#: sql_help.c:1669 sql_help.c:1670 sql_help.c:1914 sql_help.c:1917 -#: sql_help.c:2096 sql_help.c:3620 sql_help.c:3621 sql_help.c:3622 -#: sql_help.c:3623 sql_help.c:3624 sql_help.c:3625 sql_help.c:3626 -#: sql_help.c:3627 sql_help.c:4662 sql_help.c:4663 sql_help.c:4664 -#: sql_help.c:4665 sql_help.c:4666 sql_help.c:4667 sql_help.c:4668 -#: sql_help.c:4669 +#: sql_help.c:1742 sql_help.c:1743 sql_help.c:1802 sql_help.c:1997 +#: sql_help.c:2001 sql_help.c:2183 sql_help.c:3775 sql_help.c:3776 +#: sql_help.c:3777 sql_help.c:3778 sql_help.c:3779 sql_help.c:3780 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:4231 sql_help.c:4233 sql_help.c:5009 sql_help.c:5010 +#: sql_help.c:5011 sql_help.c:5012 sql_help.c:5013 sql_help.c:5014 +#: sql_help.c:5015 sql_help.c:5016 sql_help.c:5017 sql_help.c:5019 +#: sql_help.c:5020 msgid "boolean" -msgstr "" +msgstr "불린" -#: sql_help.c:1671 sql_help.c:4671 +#: sql_help.c:1744 sql_help.c:5021 +msgid "size" +msgstr "í¬ê¸°" + +#: sql_help.c:1745 sql_help.c:5022 msgid "and table_and_columns is:" msgstr "í…Œì´ë¸”ê³¼_칼럼 사용법:" -#: sql_help.c:1687 sql_help.c:4443 sql_help.c:4445 sql_help.c:4469 +#: sql_help.c:1761 sql_help.c:4769 sql_help.c:4771 sql_help.c:4795 msgid "transaction_mode" msgstr "트랜잭션모드" -#: sql_help.c:1688 sql_help.c:4446 sql_help.c:4470 +#: sql_help.c:1762 sql_help.c:4772 sql_help.c:4796 msgid "where transaction_mode is one of:" msgstr "트랜잭션모드 사용법:" -#: sql_help.c:1697 sql_help.c:4303 sql_help.c:4312 sql_help.c:4316 -#: sql_help.c:4320 sql_help.c:4323 sql_help.c:4542 sql_help.c:4551 -#: sql_help.c:4555 sql_help.c:4559 sql_help.c:4562 sql_help.c:4762 -#: sql_help.c:4771 sql_help.c:4775 sql_help.c:4779 sql_help.c:4782 +#: sql_help.c:1771 sql_help.c:4614 sql_help.c:4623 sql_help.c:4627 +#: sql_help.c:4631 sql_help.c:4634 sql_help.c:4872 sql_help.c:4881 +#: sql_help.c:4885 sql_help.c:4889 sql_help.c:4892 sql_help.c:5117 +#: sql_help.c:5126 sql_help.c:5130 sql_help.c:5134 sql_help.c:5137 msgid "argument" msgstr "ì¸ìž" -#: sql_help.c:1787 +#: sql_help.c:1867 msgid "relation_name" msgstr "릴레ì´ì…˜ì´ë¦„" -#: sql_help.c:1792 sql_help.c:3746 sql_help.c:4094 +#: sql_help.c:1872 sql_help.c:3926 sql_help.c:4389 msgid "domain_name" msgstr "ë„ë©”ì¸ì´ë¦„" -#: sql_help.c:1814 +#: sql_help.c:1894 msgid "policy_name" msgstr "ì •ì±…ì´ë¦„" -#: sql_help.c:1827 +#: sql_help.c:1907 msgid "rule_name" msgstr "룰ì´ë¦„" -#: sql_help.c:1846 -msgid "text" -msgstr "" +#: sql_help.c:1926 sql_help.c:4528 +msgid "string_literal" +msgstr "문ìžì—´_리터럴" -#: sql_help.c:1871 sql_help.c:3930 sql_help.c:4135 +#: sql_help.c:1951 sql_help.c:4192 sql_help.c:4442 msgid "transaction_id" msgstr "트랜잭션_id" -#: sql_help.c:1902 sql_help.c:1909 sql_help.c:3856 +#: sql_help.c:1985 sql_help.c:1992 sql_help.c:4048 msgid "filename" msgstr "파ì¼ì´ë¦„" -#: sql_help.c:1903 sql_help.c:1910 sql_help.c:2583 sql_help.c:2584 -#: sql_help.c:2585 +#: sql_help.c:1986 sql_help.c:1993 sql_help.c:2712 sql_help.c:2713 +#: sql_help.c:2714 msgid "command" msgstr "명령어" -#: sql_help.c:1905 sql_help.c:2582 sql_help.c:2994 sql_help.c:3171 -#: sql_help.c:3840 sql_help.c:4286 sql_help.c:4288 sql_help.c:4376 -#: sql_help.c:4378 sql_help.c:4525 sql_help.c:4527 sql_help.c:4630 -#: sql_help.c:4745 sql_help.c:4747 +#: sql_help.c:1988 sql_help.c:2711 sql_help.c:3144 sql_help.c:3325 +#: sql_help.c:4032 sql_help.c:4115 sql_help.c:4118 sql_help.c:4121 +#: sql_help.c:4597 sql_help.c:4599 sql_help.c:4701 sql_help.c:4703 +#: sql_help.c:4855 sql_help.c:4857 sql_help.c:4974 sql_help.c:5100 +#: sql_help.c:5102 msgid "condition" msgstr "ì¡°ê±´" -#: sql_help.c:1908 sql_help.c:2411 sql_help.c:2877 sql_help.c:3137 -#: sql_help.c:3155 sql_help.c:3821 +#: sql_help.c:1991 sql_help.c:2532 sql_help.c:3027 sql_help.c:3291 +#: sql_help.c:3309 sql_help.c:4013 msgid "query" msgstr "쿼리문" -#: sql_help.c:1913 +#: sql_help.c:1996 msgid "format_name" msgstr "입출력양ì‹ì´ë¦„" -#: sql_help.c:1915 +#: sql_help.c:1998 msgid "delimiter_character" msgstr "구분문ìž" -#: sql_help.c:1916 +#: sql_help.c:1999 msgid "null_string" msgstr "ë„문ìžì—´" -#: sql_help.c:1918 +#: sql_help.c:2000 +msgid "default_string" +msgstr "기본_문ìžì—´" + +#: sql_help.c:2002 msgid "quote_character" msgstr "ì¸ìš©ë¶€í˜¸" -#: sql_help.c:1919 +#: sql_help.c:2003 msgid "escape_character" msgstr "ì´ìŠ¤ì¼€ì´í”„ 문ìž" -#: sql_help.c:1923 +#: sql_help.c:2007 +msgid "error_action" +msgstr "오류_ë™ìž‘" + +#: sql_help.c:2008 msgid "encoding_name" msgstr "ì¸ì½”딩ì´ë¦„" -#: sql_help.c:1934 +#: sql_help.c:2009 +msgid "verbosity" +msgstr "로그출력수준" + +#: sql_help.c:2020 msgid "access_method_type" -msgstr "" +msgstr "ì ‘ê·¼_방법_종류" -#: sql_help.c:2005 sql_help.c:2024 sql_help.c:2027 +#: sql_help.c:2091 sql_help.c:2110 sql_help.c:2113 msgid "arg_data_type" msgstr "ì¸ìžìžë£Œí˜•" -#: sql_help.c:2006 sql_help.c:2028 sql_help.c:2036 +#: sql_help.c:2092 sql_help.c:2114 sql_help.c:2122 msgid "sfunc" -msgstr "" +msgstr "sfunc" -#: sql_help.c:2007 sql_help.c:2029 sql_help.c:2037 +#: sql_help.c:2093 sql_help.c:2115 sql_help.c:2123 msgid "state_data_type" -msgstr "" +msgstr "state_data_type" -#: sql_help.c:2008 sql_help.c:2030 sql_help.c:2038 +#: sql_help.c:2094 sql_help.c:2116 sql_help.c:2124 msgid "state_data_size" -msgstr "" +msgstr "state_data_size" -#: sql_help.c:2009 sql_help.c:2031 sql_help.c:2039 +#: sql_help.c:2095 sql_help.c:2117 sql_help.c:2125 msgid "ffunc" -msgstr "" +msgstr "ffunc" -#: sql_help.c:2010 sql_help.c:2040 +#: sql_help.c:2096 sql_help.c:2126 msgid "combinefunc" -msgstr "" +msgstr "combinefunc" -#: sql_help.c:2011 sql_help.c:2041 +#: sql_help.c:2097 sql_help.c:2127 msgid "serialfunc" -msgstr "" +msgstr "serialfunc" -#: sql_help.c:2012 sql_help.c:2042 +#: sql_help.c:2098 sql_help.c:2128 msgid "deserialfunc" -msgstr "" +msgstr "deserialfunc" -#: sql_help.c:2013 sql_help.c:2032 sql_help.c:2043 +#: sql_help.c:2099 sql_help.c:2118 sql_help.c:2129 msgid "initial_condition" -msgstr "" +msgstr "initial_condition" -#: sql_help.c:2014 sql_help.c:2044 +#: sql_help.c:2100 sql_help.c:2130 msgid "msfunc" -msgstr "" +msgstr "msfunc" -#: sql_help.c:2015 sql_help.c:2045 +#: sql_help.c:2101 sql_help.c:2131 msgid "minvfunc" -msgstr "" +msgstr "minvfunc" -#: sql_help.c:2016 sql_help.c:2046 +#: sql_help.c:2102 sql_help.c:2132 msgid "mstate_data_type" -msgstr "" +msgstr "mstate_data_type" -#: sql_help.c:2017 sql_help.c:2047 +#: sql_help.c:2103 sql_help.c:2133 msgid "mstate_data_size" -msgstr "" +msgstr "mstate_data_size" -#: sql_help.c:2018 sql_help.c:2048 +#: sql_help.c:2104 sql_help.c:2134 msgid "mffunc" -msgstr "" +msgstr "mffunc" -#: sql_help.c:2019 sql_help.c:2049 +#: sql_help.c:2105 sql_help.c:2135 msgid "minitial_condition" -msgstr "" +msgstr "minitial_condition" -#: sql_help.c:2020 sql_help.c:2050 +#: sql_help.c:2106 sql_help.c:2136 msgid "sort_operator" msgstr "정렬연산ìž" -#: sql_help.c:2033 +#: sql_help.c:2119 msgid "or the old syntax" msgstr "ë˜ëŠ” 옛날 구문" -#: sql_help.c:2035 +#: sql_help.c:2121 msgid "base_type" msgstr "기본ìžë£Œí˜•" -#: sql_help.c:2092 sql_help.c:2133 +#: sql_help.c:2179 sql_help.c:2229 msgid "locale" msgstr "로케ì¼" -#: sql_help.c:2093 sql_help.c:2134 +#: sql_help.c:2180 sql_help.c:2230 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2094 sql_help.c:2135 +#: sql_help.c:2181 sql_help.c:2231 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2095 sql_help.c:4188 +#: sql_help.c:2182 sql_help.c:4495 msgid "provider" msgstr "제공ìž" -#: sql_help.c:2097 sql_help.c:2189 +#: sql_help.c:2184 +msgid "rules" +msgstr "룰" + +#: sql_help.c:2185 sql_help.c:2292 msgid "version" msgstr "버전" -#: sql_help.c:2099 +#: sql_help.c:2187 msgid "existing_collation" -msgstr "" +msgstr "기존_collation" -#: sql_help.c:2109 +#: sql_help.c:2197 msgid "source_encoding" msgstr "ì›ëž˜ì¸ì½”딩" -#: sql_help.c:2110 +#: sql_help.c:2198 msgid "dest_encoding" msgstr "대ìƒì¸ì½”딩" -#: sql_help.c:2131 sql_help.c:2917 +#: sql_help.c:2226 sql_help.c:3067 msgid "template" msgstr "템플릿" -#: sql_help.c:2132 +#: sql_help.c:2227 msgid "encoding" msgstr "ì¸ì½”딩" -#: sql_help.c:2159 -msgid "constraint" -msgstr "제약조건" +#: sql_help.c:2228 +msgid "strategy" +msgstr "전략번호" + +#: sql_help.c:2232 +msgid "builtin_locale" +msgstr "내장_로케ì¼" + +#: sql_help.c:2233 +msgid "icu_locale" +msgstr "icu_로케ì¼" + +#: sql_help.c:2234 +msgid "icu_rules" +msgstr "icu_룰" + +#: sql_help.c:2235 +msgid "locale_provider" +msgstr "로케ì¼_제공ìž" -#: sql_help.c:2160 -msgid "where constraint is:" -msgstr "제약조건 사용법:" +#: sql_help.c:2236 +msgid "collation_version" +msgstr "collation_version" -#: sql_help.c:2174 sql_help.c:2580 sql_help.c:2990 +#: sql_help.c:2241 +msgid "oid" +msgstr "oid" + +#: sql_help.c:2276 sql_help.c:2709 sql_help.c:3140 msgid "event" msgstr "ì´ë²¤íЏ" -#: sql_help.c:2175 +#: sql_help.c:2277 msgid "filter_variable" -msgstr "" +msgstr "í•„í„°_변수" -#: sql_help.c:2263 sql_help.c:2812 +#: sql_help.c:2278 +msgid "filter_value" +msgstr "í•„í„°_ê°’" + +#: sql_help.c:2374 sql_help.c:2956 msgid "where column_constraint is:" msgstr "칼럼_제약조건 사용법:" -#: sql_help.c:2300 +#: sql_help.c:2419 msgid "rettype" -msgstr "" +msgstr "rettype" -#: sql_help.c:2302 +#: sql_help.c:2421 msgid "column_type" -msgstr "" +msgstr "칼럼_ìžë£Œí˜•" -#: sql_help.c:2311 sql_help.c:2511 +#: sql_help.c:2430 sql_help.c:2633 msgid "definition" msgstr "함수정ì˜" -#: sql_help.c:2312 sql_help.c:2512 +#: sql_help.c:2431 sql_help.c:2634 msgid "obj_file" msgstr "오브ì íŠ¸íŒŒì¼" -#: sql_help.c:2313 sql_help.c:2513 +#: sql_help.c:2432 sql_help.c:2635 msgid "link_symbol" msgstr "ì—°ê²°í• _함수명" -#: sql_help.c:2351 sql_help.c:2565 sql_help.c:3109 +#: sql_help.c:2433 sql_help.c:2636 +msgid "sql_body" +msgstr "sql_본문" + +#: sql_help.c:2471 sql_help.c:2694 sql_help.c:3263 msgid "uid" -msgstr "" +msgstr "uid" -#: sql_help.c:2366 sql_help.c:2407 sql_help.c:2781 sql_help.c:2794 -#: sql_help.c:2808 sql_help.c:2873 +#: sql_help.c:2487 sql_help.c:2528 sql_help.c:2925 sql_help.c:2938 +#: sql_help.c:2952 sql_help.c:3023 msgid "method" msgstr "색ì¸ë°©ë²•" -#: sql_help.c:2371 -msgid "opclass_parameter" -msgstr "opclass_매개변수" - -#: sql_help.c:2388 +#: sql_help.c:2509 msgid "call_handler" -msgstr "" +msgstr "호출_핸들러" -#: sql_help.c:2389 +#: sql_help.c:2510 msgid "inline_handler" -msgstr "" +msgstr "ì¸ë¼ì¸_핸들러" -#: sql_help.c:2390 +#: sql_help.c:2511 msgid "valfunction" msgstr "구문검사함수" -#: sql_help.c:2429 -msgid "com_op" -msgstr "" - -#: sql_help.c:2430 -msgid "neg_op" -msgstr "" - -#: sql_help.c:2448 +#: sql_help.c:2569 msgid "family_name" -msgstr "" +msgstr "family_name" -#: sql_help.c:2459 +#: sql_help.c:2580 msgid "storage_type" msgstr "스토리지_유형" -#: sql_help.c:2586 sql_help.c:2997 +#: sql_help.c:2715 sql_help.c:3147 msgid "where event can be one of:" msgstr "ì´ë²¤íЏ 사용법:" -#: sql_help.c:2605 sql_help.c:2607 +#: sql_help.c:2735 sql_help.c:2737 msgid "schema_element" -msgstr "" +msgstr "스키마_요소" -#: sql_help.c:2644 +#: sql_help.c:2774 msgid "server_type" msgstr "서버_종류" -#: sql_help.c:2645 +#: sql_help.c:2775 msgid "server_version" msgstr "서버_버전" -#: sql_help.c:2646 sql_help.c:3748 sql_help.c:4096 +#: sql_help.c:2776 sql_help.c:3929 sql_help.c:4392 msgid "fdw_name" msgstr "fdw_ì´ë¦„" -#: sql_help.c:2659 +#: sql_help.c:2793 sql_help.c:2796 msgid "statistics_name" msgstr "통계정보_ì´ë¦„" -#: sql_help.c:2660 +#: sql_help.c:2797 msgid "statistics_kind" msgstr "통계정보_종류" -#: sql_help.c:2674 +#: sql_help.c:2813 msgid "subscription_name" msgstr "구ë…_ì´ë¦„" -#: sql_help.c:2774 +#: sql_help.c:2918 msgid "source_table" msgstr "ì›ë³¸í…Œì´ë¸”" -#: sql_help.c:2775 +#: sql_help.c:2919 msgid "like_option" msgstr "LIKE구문옵션" -#: sql_help.c:2841 +#: sql_help.c:2985 msgid "and like_option is:" -msgstr "" +msgstr "LIKE구문옵션 사용법:" -#: sql_help.c:2890 +#: sql_help.c:3040 msgid "directory" msgstr "디렉터리" -#: sql_help.c:2904 +#: sql_help.c:3054 msgid "parser_name" msgstr "구문분ì„기_ì´ë¦„" -#: sql_help.c:2905 +#: sql_help.c:3055 msgid "source_config" msgstr "ì›ë³¸_설정" -#: sql_help.c:2934 +#: sql_help.c:3084 msgid "start_function" msgstr "시작_함수" -#: sql_help.c:2935 +#: sql_help.c:3085 msgid "gettoken_function" msgstr "gettoken함수" -#: sql_help.c:2936 +#: sql_help.c:3086 msgid "end_function" msgstr "종료_함수" -#: sql_help.c:2937 +#: sql_help.c:3087 msgid "lextypes_function" msgstr "lextypes함수" -#: sql_help.c:2938 +#: sql_help.c:3088 msgid "headline_function" msgstr "headline함수" -#: sql_help.c:2950 +#: sql_help.c:3100 msgid "init_function" msgstr "init함수" -#: sql_help.c:2951 +#: sql_help.c:3101 msgid "lexize_function" msgstr "lexize함수" -#: sql_help.c:2964 +#: sql_help.c:3114 msgid "from_sql_function_name" -msgstr "" +msgstr "sqlì—서_언어로_바꿀때쓸_함수ì´ë¦„" -#: sql_help.c:2966 +#: sql_help.c:3116 msgid "to_sql_function_name" -msgstr "" +msgstr "언어ì—서_sql로_바꿀때쓸_함수ì´ë¦„" -#: sql_help.c:2992 +#: sql_help.c:3142 msgid "referenced_table_name" -msgstr "" +msgstr "참조ëœ_í…Œì´ë¸”_ì´ë¦„" -#: sql_help.c:2993 +#: sql_help.c:3143 msgid "transition_relation_name" -msgstr "전달_릴레ì´ì…˜ì´ë¦„" +msgstr "전달_릴레ì´ì…˜_ì´ë¦„" -#: sql_help.c:2996 +#: sql_help.c:3146 msgid "arguments" msgstr "ì¸ìžë“¤" -#: sql_help.c:3046 sql_help.c:4221 +#: sql_help.c:3198 msgid "label" -msgstr "" +msgstr "enum요소" -#: sql_help.c:3048 +#: sql_help.c:3200 msgid "subtype" -msgstr "" +msgstr "subtype" -#: sql_help.c:3049 +#: sql_help.c:3201 msgid "subtype_operator_class" -msgstr "" +msgstr "subtype_operator_class" -#: sql_help.c:3051 +#: sql_help.c:3203 msgid "canonical_function" -msgstr "" +msgstr "canonical_function" -#: sql_help.c:3052 +#: sql_help.c:3204 msgid "subtype_diff_function" -msgstr "" +msgstr "subtype_diff_function" -#: sql_help.c:3054 +#: sql_help.c:3205 +msgid "multirange_type_name" +msgstr "다중범위_ìžë£Œí˜•_ì´ë¦„" + +#: sql_help.c:3207 msgid "input_function" msgstr "입력함수" -#: sql_help.c:3055 +#: sql_help.c:3208 msgid "output_function" msgstr "출력함수" -#: sql_help.c:3056 +#: sql_help.c:3209 msgid "receive_function" msgstr "받는함수" -#: sql_help.c:3057 +#: sql_help.c:3210 msgid "send_function" msgstr "주는함수" -#: sql_help.c:3058 +#: sql_help.c:3211 msgid "type_modifier_input_function" -msgstr "" +msgstr "type_modifier_input_function" -#: sql_help.c:3059 +#: sql_help.c:3212 msgid "type_modifier_output_function" -msgstr "" +msgstr "type_modifier_output_function" -#: sql_help.c:3060 +#: sql_help.c:3213 msgid "analyze_function" msgstr "ë¶„ì„함수" -#: sql_help.c:3061 +#: sql_help.c:3214 +msgid "subscript_function" +msgstr "구ë…_함수" + +#: sql_help.c:3215 msgid "internallength" -msgstr "" +msgstr "내부길ì´" -#: sql_help.c:3062 +#: sql_help.c:3216 msgid "alignment" msgstr "ì •ë ¬" -#: sql_help.c:3063 +#: sql_help.c:3217 msgid "storage" msgstr "스토리지" -#: sql_help.c:3064 +#: sql_help.c:3218 msgid "like_type" -msgstr "" +msgstr "like_type" -#: sql_help.c:3065 +#: sql_help.c:3219 msgid "category" -msgstr "" +msgstr "category" -#: sql_help.c:3066 +#: sql_help.c:3220 msgid "preferred" -msgstr "" +msgstr "preferred" -#: sql_help.c:3067 +#: sql_help.c:3221 msgid "default" msgstr "기본값" -#: sql_help.c:3068 +#: sql_help.c:3222 msgid "element" msgstr "요소" -#: sql_help.c:3069 +#: sql_help.c:3223 msgid "delimiter" msgstr "구분ìž" -#: sql_help.c:3070 +#: sql_help.c:3224 msgid "collatable" -msgstr "" +msgstr "collatable" -#: sql_help.c:3167 sql_help.c:3816 sql_help.c:4281 sql_help.c:4370 -#: sql_help.c:4520 sql_help.c:4620 sql_help.c:4740 +#: sql_help.c:3321 sql_help.c:4008 sql_help.c:4102 sql_help.c:4592 +#: sql_help.c:4695 sql_help.c:4850 sql_help.c:4964 sql_help.c:5095 msgid "with_query" -msgstr "" - -#: sql_help.c:3169 sql_help.c:3818 sql_help.c:4300 sql_help.c:4306 -#: sql_help.c:4309 sql_help.c:4313 sql_help.c:4317 sql_help.c:4325 -#: sql_help.c:4539 sql_help.c:4545 sql_help.c:4548 sql_help.c:4552 -#: sql_help.c:4556 sql_help.c:4564 sql_help.c:4622 sql_help.c:4759 -#: sql_help.c:4765 sql_help.c:4768 sql_help.c:4772 sql_help.c:4776 -#: sql_help.c:4784 +msgstr "withì ˆ_쿼리" + +#: sql_help.c:3323 sql_help.c:4010 sql_help.c:4611 sql_help.c:4617 +#: sql_help.c:4620 sql_help.c:4624 sql_help.c:4628 sql_help.c:4636 +#: sql_help.c:4869 sql_help.c:4875 sql_help.c:4878 sql_help.c:4882 +#: sql_help.c:4886 sql_help.c:4894 sql_help.c:4966 sql_help.c:5114 +#: sql_help.c:5120 sql_help.c:5123 sql_help.c:5127 sql_help.c:5131 +#: sql_help.c:5139 msgid "alias" msgstr "별칭" -#: sql_help.c:3170 sql_help.c:4285 sql_help.c:4327 sql_help.c:4329 -#: sql_help.c:4375 sql_help.c:4524 sql_help.c:4566 sql_help.c:4568 -#: sql_help.c:4629 sql_help.c:4744 sql_help.c:4786 sql_help.c:4788 +#: sql_help.c:3324 sql_help.c:4596 sql_help.c:4638 sql_help.c:4640 +#: sql_help.c:4644 sql_help.c:4646 sql_help.c:4647 sql_help.c:4648 +#: sql_help.c:4700 sql_help.c:4854 sql_help.c:4896 sql_help.c:4898 +#: sql_help.c:4902 sql_help.c:4904 sql_help.c:4905 sql_help.c:4906 +#: sql_help.c:4973 sql_help.c:5099 sql_help.c:5141 sql_help.c:5143 +#: sql_help.c:5147 sql_help.c:5149 sql_help.c:5150 sql_help.c:5151 msgid "from_item" -msgstr "" +msgstr "fromì ˆ_항목" -#: sql_help.c:3172 sql_help.c:3653 sql_help.c:3897 sql_help.c:4631 +#: sql_help.c:3326 sql_help.c:3810 sql_help.c:4159 sql_help.c:4975 msgid "cursor_name" msgstr "커서ì´ë¦„" -#: sql_help.c:3173 sql_help.c:3824 sql_help.c:4632 +#: sql_help.c:3327 sql_help.c:4016 sql_help.c:4108 sql_help.c:4976 msgid "output_expression" msgstr "출력표현ì‹" -#: sql_help.c:3174 sql_help.c:3825 sql_help.c:4284 sql_help.c:4373 -#: sql_help.c:4523 sql_help.c:4633 sql_help.c:4743 +#: sql_help.c:3328 sql_help.c:4017 sql_help.c:4109 sql_help.c:4595 +#: sql_help.c:4698 sql_help.c:4853 sql_help.c:4977 sql_help.c:5098 msgid "output_name" -msgstr "" +msgstr "출력_ì´ë¦„" -#: sql_help.c:3190 +#: sql_help.c:3344 msgid "code" -msgstr "" +msgstr "코드" -#: sql_help.c:3595 +#: sql_help.c:3749 msgid "parameter" msgstr "매개변수" -#: sql_help.c:3617 sql_help.c:3618 sql_help.c:3922 +#: sql_help.c:3773 sql_help.c:4184 msgid "statement" msgstr "명령구문" -#: sql_help.c:3652 sql_help.c:3896 +#: sql_help.c:3809 sql_help.c:4158 msgid "direction" msgstr "ë°©í–¥" -#: sql_help.c:3654 sql_help.c:3898 -msgid "where direction can be empty or one of:" -msgstr "ë°©í–¥ ìžë¦¬ëŠ” 비워ë‘거나 ë‹¤ìŒ ì¤‘ 하나:" +#: sql_help.c:3811 sql_help.c:4160 +msgid "where direction can be one of:" +msgstr "ë°©í–¥ 사용법:" -#: sql_help.c:3655 sql_help.c:3656 sql_help.c:3657 sql_help.c:3658 -#: sql_help.c:3659 sql_help.c:3899 sql_help.c:3900 sql_help.c:3901 -#: sql_help.c:3902 sql_help.c:3903 sql_help.c:4294 sql_help.c:4296 -#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4533 sql_help.c:4535 -#: sql_help.c:4688 sql_help.c:4690 sql_help.c:4753 sql_help.c:4755 +#: sql_help.c:3812 sql_help.c:3813 sql_help.c:3814 sql_help.c:3815 +#: sql_help.c:3816 sql_help.c:4161 sql_help.c:4162 sql_help.c:4163 +#: sql_help.c:4164 sql_help.c:4165 sql_help.c:4605 sql_help.c:4607 +#: sql_help.c:4709 sql_help.c:4711 sql_help.c:4863 sql_help.c:4865 +#: sql_help.c:5039 sql_help.c:5041 sql_help.c:5108 sql_help.c:5110 msgid "count" msgstr "출력개수" -#: sql_help.c:3741 sql_help.c:4089 +#: sql_help.c:3919 sql_help.c:4382 msgid "sequence_name" msgstr "시퀀스ì´ë¦„" -#: sql_help.c:3754 sql_help.c:4102 +#: sql_help.c:3937 sql_help.c:4400 msgid "arg_name" msgstr "ì¸ìžì´ë¦„" -#: sql_help.c:3755 sql_help.c:4103 +#: sql_help.c:3938 sql_help.c:4401 msgid "arg_type" msgstr "ì¸ìžìžë£Œí˜•" -#: sql_help.c:3760 sql_help.c:4108 +#: sql_help.c:3945 sql_help.c:4408 msgid "loid" -msgstr "" +msgstr "í°ê°œì²´_oid" -#: sql_help.c:3784 +#: sql_help.c:3976 msgid "remote_schema" msgstr "ì›ê²©_스키마" -#: sql_help.c:3787 +#: sql_help.c:3979 msgid "local_schema" msgstr "로컬_스키마" -#: sql_help.c:3822 +#: sql_help.c:4014 msgid "conflict_target" -msgstr "" +msgstr "ì¶©ëŒ_대ìƒ" -#: sql_help.c:3823 +#: sql_help.c:4015 msgid "conflict_action" -msgstr "" +msgstr "ì¶©ëŒ_작업" -#: sql_help.c:3826 +#: sql_help.c:4018 msgid "where conflict_target can be one of:" -msgstr "conflict_target 사용법:" +msgstr "ì¶©ëŒ_ëŒ€ìƒ ì‚¬ìš©ë²•:" -#: sql_help.c:3827 +#: sql_help.c:4019 msgid "index_column_name" msgstr "ì¸ë±ìŠ¤ì¹¼ëŸ¼ì´ë¦„" -#: sql_help.c:3828 +#: sql_help.c:4020 msgid "index_expression" msgstr "ì¸ë±ìŠ¤í‘œí˜„ì‹" -#: sql_help.c:3831 +#: sql_help.c:4023 msgid "index_predicate" -msgstr "" +msgstr "부분ì¸ë±ìФì‹" -#: sql_help.c:3833 +#: sql_help.c:4025 msgid "and conflict_action is one of:" -msgstr "conflict_action 사용법:" +msgstr "ì¶©ëŒ_작업 사용법:" -#: sql_help.c:3839 sql_help.c:4628 +#: sql_help.c:4031 sql_help.c:4132 sql_help.c:4972 msgid "sub-SELECT" -msgstr "" +msgstr "서브셀렉트" -#: sql_help.c:3848 sql_help.c:3911 sql_help.c:4604 +#: sql_help.c:4040 sql_help.c:4173 sql_help.c:4948 msgid "channel" -msgstr "" +msgstr "채ë„" -#: sql_help.c:3870 +#: sql_help.c:4062 msgid "lockmode" -msgstr "" +msgstr "잠금모드" -#: sql_help.c:3871 +#: sql_help.c:4063 msgid "where lockmode is one of:" -msgstr "lockmode 사용법:" +msgstr "잠금모드 사용법:" + +#: sql_help.c:4103 +msgid "target_table_name" +msgstr "대ìƒ_í…Œì´ë¸”_ì´ë¦„" + +#: sql_help.c:4104 +msgid "target_alias" +msgstr "대ìƒ_별칭" + +#: sql_help.c:4105 +msgid "data_source" +msgstr "ë°ì´í„°_소스" + +#: sql_help.c:4106 sql_help.c:4641 sql_help.c:4899 sql_help.c:5144 +msgid "join_condition" +msgstr "ì¡°ì¸_ì¡°ê±´" + +#: sql_help.c:4107 +msgid "when_clause" +msgstr "whenì ˆ" -#: sql_help.c:3912 +#: sql_help.c:4110 +msgid "where data_source is:" +msgstr "ë°ì´í„°_소스 사용법:" + +#: sql_help.c:4111 +msgid "source_table_name" +msgstr "ì›ë³¸_í…Œì´ë¸”_ì´ë¦„" + +#: sql_help.c:4112 +msgid "source_query" +msgstr "소스_쿼리" + +#: sql_help.c:4113 +msgid "source_alias" +msgstr "소스_별칭" + +#: sql_help.c:4114 +msgid "and when_clause is:" +msgstr "whenì ˆ 사용법:" + +#: sql_help.c:4116 sql_help.c:4119 +msgid "merge_update" +msgstr "merge_update" + +#: sql_help.c:4117 sql_help.c:4120 +msgid "merge_delete" +msgstr "merge_delete" + +#: sql_help.c:4122 +msgid "merge_insert" +msgstr "merge_insert" + +#: sql_help.c:4123 +msgid "and merge_insert is:" +msgstr "merge_insert 사용법:" + +#: sql_help.c:4126 +msgid "and merge_update is:" +msgstr "merge_update 사용법:" + +#: sql_help.c:4133 +msgid "and merge_delete is:" +msgstr "merge_delete 사용법:" + +#: sql_help.c:4174 msgid "payload" -msgstr "" +msgstr "payload" -#: sql_help.c:3939 +#: sql_help.c:4201 msgid "old_role" msgstr "기존롤" -#: sql_help.c:3940 +#: sql_help.c:4202 msgid "new_role" msgstr "새롤" -#: sql_help.c:3971 sql_help.c:4143 sql_help.c:4151 +#: sql_help.c:4241 sql_help.c:4450 sql_help.c:4458 msgid "savepoint_name" msgstr "savepoint_name" -#: sql_help.c:4287 sql_help.c:4339 sql_help.c:4526 sql_help.c:4578 -#: sql_help.c:4746 sql_help.c:4798 +#: sql_help.c:4598 sql_help.c:4656 sql_help.c:4856 sql_help.c:4914 +#: sql_help.c:5101 sql_help.c:5159 msgid "grouping_element" -msgstr "" +msgstr "grouping_element" -#: sql_help.c:4289 sql_help.c:4379 sql_help.c:4528 sql_help.c:4748 +#: sql_help.c:4600 sql_help.c:4704 sql_help.c:4858 sql_help.c:5103 msgid "window_name" msgstr "윈ë„ìš°ì´ë¦„" -#: sql_help.c:4290 sql_help.c:4380 sql_help.c:4529 sql_help.c:4749 +#: sql_help.c:4601 sql_help.c:4705 sql_help.c:4859 sql_help.c:5104 msgid "window_definition" msgstr "ì›ë„ìš°ì •ì˜" -#: sql_help.c:4291 sql_help.c:4305 sql_help.c:4343 sql_help.c:4381 -#: sql_help.c:4530 sql_help.c:4544 sql_help.c:4582 sql_help.c:4750 -#: sql_help.c:4764 sql_help.c:4802 +#: sql_help.c:4602 sql_help.c:4616 sql_help.c:4660 sql_help.c:4706 +#: sql_help.c:4860 sql_help.c:4874 sql_help.c:4918 sql_help.c:5105 +#: sql_help.c:5119 sql_help.c:5163 msgid "select" -msgstr "" +msgstr "select" + +#: sql_help.c:4608 sql_help.c:4866 sql_help.c:5111 +msgid "from_reference" +msgstr "from_reference" -#: sql_help.c:4298 sql_help.c:4537 sql_help.c:4757 +#: sql_help.c:4609 sql_help.c:4867 sql_help.c:5112 msgid "where from_item can be one of:" -msgstr "" +msgstr "fromì ˆ_항목 사용법:" -#: sql_help.c:4301 sql_help.c:4307 sql_help.c:4310 sql_help.c:4314 -#: sql_help.c:4326 sql_help.c:4540 sql_help.c:4546 sql_help.c:4549 -#: sql_help.c:4553 sql_help.c:4565 sql_help.c:4760 sql_help.c:4766 -#: sql_help.c:4769 sql_help.c:4773 sql_help.c:4785 +#: sql_help.c:4612 sql_help.c:4618 sql_help.c:4621 sql_help.c:4625 +#: sql_help.c:4637 sql_help.c:4870 sql_help.c:4876 sql_help.c:4879 +#: sql_help.c:4883 sql_help.c:4895 sql_help.c:5115 sql_help.c:5121 +#: sql_help.c:5124 sql_help.c:5128 sql_help.c:5140 msgid "column_alias" msgstr "칼럼별칭" -#: sql_help.c:4302 sql_help.c:4541 sql_help.c:4761 +#: sql_help.c:4613 sql_help.c:4871 sql_help.c:5116 msgid "sampling_method" msgstr "표본추출방법" -#: sql_help.c:4304 sql_help.c:4543 sql_help.c:4763 +#: sql_help.c:4615 sql_help.c:4873 sql_help.c:5118 msgid "seed" -msgstr "" +msgstr "seed" -#: sql_help.c:4308 sql_help.c:4341 sql_help.c:4547 sql_help.c:4580 -#: sql_help.c:4767 sql_help.c:4800 +#: sql_help.c:4619 sql_help.c:4658 sql_help.c:4877 sql_help.c:4916 +#: sql_help.c:5122 sql_help.c:5161 msgid "with_query_name" -msgstr "" +msgstr "withì ˆ_쿼리_ì´ë¦„" -#: sql_help.c:4318 sql_help.c:4321 sql_help.c:4324 sql_help.c:4557 -#: sql_help.c:4560 sql_help.c:4563 sql_help.c:4777 sql_help.c:4780 -#: sql_help.c:4783 +#: sql_help.c:4629 sql_help.c:4632 sql_help.c:4635 sql_help.c:4887 +#: sql_help.c:4890 sql_help.c:4893 sql_help.c:5132 sql_help.c:5135 +#: sql_help.c:5138 msgid "column_definition" msgstr "칼럼정ì˜" -#: sql_help.c:4328 sql_help.c:4567 sql_help.c:4787 +#: sql_help.c:4639 sql_help.c:4645 sql_help.c:4897 sql_help.c:4903 +#: sql_help.c:5142 sql_help.c:5148 msgid "join_type" -msgstr "" +msgstr "ì¡°ì¸_종류" -#: sql_help.c:4330 sql_help.c:4569 sql_help.c:4789 -msgid "join_condition" -msgstr "" - -#: sql_help.c:4331 sql_help.c:4570 sql_help.c:4790 +#: sql_help.c:4642 sql_help.c:4900 sql_help.c:5145 msgid "join_column" -msgstr "" +msgstr "ì¡°ì¸_칼럼" -#: sql_help.c:4332 sql_help.c:4571 sql_help.c:4791 +#: sql_help.c:4643 sql_help.c:4901 sql_help.c:5146 +msgid "join_using_alias" +msgstr "ì¡°ì¸_별칭" + +#: sql_help.c:4649 sql_help.c:4907 sql_help.c:5152 msgid "and grouping_element can be one of:" -msgstr "" +msgstr "grouping_element 사용법:" -#: sql_help.c:4340 sql_help.c:4579 sql_help.c:4799 +#: sql_help.c:4657 sql_help.c:4915 sql_help.c:5160 msgid "and with_query is:" -msgstr "" +msgstr "withì ˆ_쿼리 사용법:" -#: sql_help.c:4344 sql_help.c:4583 sql_help.c:4803 +#: sql_help.c:4661 sql_help.c:4919 sql_help.c:5164 msgid "values" msgstr "ê°’" -#: sql_help.c:4345 sql_help.c:4584 sql_help.c:4804 +#: sql_help.c:4662 sql_help.c:4920 sql_help.c:5165 msgid "insert" -msgstr "" +msgstr "insert" -#: sql_help.c:4346 sql_help.c:4585 sql_help.c:4805 +#: sql_help.c:4663 sql_help.c:4921 sql_help.c:5166 msgid "update" -msgstr "" +msgstr "update" -#: sql_help.c:4347 sql_help.c:4586 sql_help.c:4806 +#: sql_help.c:4664 sql_help.c:4922 sql_help.c:5167 msgid "delete" -msgstr "" +msgstr "delete" + +#: sql_help.c:4665 sql_help.c:4923 sql_help.c:5168 +msgid "merge" +msgstr "merge" + +#: sql_help.c:4667 sql_help.c:4925 sql_help.c:5170 +msgid "search_seq_col_name" +msgstr "search_seq_col_name" -#: sql_help.c:4374 +#: sql_help.c:4669 sql_help.c:4927 sql_help.c:5172 +msgid "cycle_mark_col_name" +msgstr "cycle_mark_col_name" + +#: sql_help.c:4670 sql_help.c:4928 sql_help.c:5173 +msgid "cycle_mark_value" +msgstr "cycle_mark_value" + +#: sql_help.c:4671 sql_help.c:4929 sql_help.c:5174 +msgid "cycle_mark_default" +msgstr "cycle_mark_default" + +#: sql_help.c:4672 sql_help.c:4930 sql_help.c:5175 +msgid "cycle_path_col_name" +msgstr "cycle_path_col_name" + +#: sql_help.c:4699 msgid "new_table" msgstr "새테ì´ë¸”" -#: sql_help.c:4399 -msgid "timezone" -msgstr "" - -#: sql_help.c:4444 +#: sql_help.c:4770 msgid "snapshot_id" -msgstr "" +msgstr "스냅샷_id" -#: sql_help.c:4686 +#: sql_help.c:5037 msgid "sort_expression" -msgstr "" +msgstr "ì •ë ¬_표현ì‹" -#: sql_help.c:4813 sql_help.c:5791 +#: sql_help.c:5182 sql_help.c:6166 msgid "abort the current transaction" msgstr "현재 트랜잭션 중지함" -#: sql_help.c:4819 +#: sql_help.c:5188 msgid "change the definition of an aggregate function" msgstr "집계함수 ì •ë³´ 바꾸기" -#: sql_help.c:4825 +#: sql_help.c:5194 msgid "change the definition of a collation" msgstr "collation ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4831 +#: sql_help.c:5200 msgid "change the definition of a conversion" msgstr "문ìžì½”드 변환규칙(conversion) ì •ë³´ 바꾸기" -#: sql_help.c:4837 +#: sql_help.c:5206 msgid "change a database" msgstr "ë°ì´í„°ë² ì´ìФ 변경" -#: sql_help.c:4843 +#: sql_help.c:5212 msgid "define default access privileges" msgstr "기본 ì ‘ê·¼ 권한 ì •ì˜" -#: sql_help.c:4849 +#: sql_help.c:5218 msgid "change the definition of a domain" msgstr "ë„ë©”ì¸ ì •ë³´ 바꾸기" -#: sql_help.c:4855 +#: sql_help.c:5224 msgid "change the definition of an event trigger" msgstr "트리거 ì •ë³´ 바꾸기" -#: sql_help.c:4861 +#: sql_help.c:5230 msgid "change the definition of an extension" msgstr "확장모듈 ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4867 +#: sql_help.c:5236 msgid "change the definition of a foreign-data wrapper" msgstr "외부 ë°ì´í„° ëž˜í¼ ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4873 +#: sql_help.c:5242 msgid "change the definition of a foreign table" msgstr "외부 í…Œì´ë¸” ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4879 +#: sql_help.c:5248 msgid "change the definition of a function" msgstr "함수 ì •ë³´ 바꾸기" -#: sql_help.c:4885 +#: sql_help.c:5254 msgid "change role name or membership" msgstr "롤 ì´ë¦„ì´ë‚˜ 맴버쉽 바꾸기" -#: sql_help.c:4891 +#: sql_help.c:5260 msgid "change the definition of an index" msgstr "ì¸ë±ìФ ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4897 +#: sql_help.c:5266 msgid "change the definition of a procedural language" msgstr "procedural language ì •ë³´ 바꾸기" -#: sql_help.c:4903 +#: sql_help.c:5272 msgid "change the definition of a large object" msgstr "대형 ê°ì²´ ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4909 +#: sql_help.c:5278 msgid "change the definition of a materialized view" msgstr "materialized ë·° ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4915 +#: sql_help.c:5284 msgid "change the definition of an operator" msgstr "ì—°ì‚°ìž ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4921 +#: sql_help.c:5290 msgid "change the definition of an operator class" msgstr "ì—°ì‚°ìž í´ëž˜ìФ ì •ë³´ 바꾸기" -#: sql_help.c:4927 +#: sql_help.c:5296 msgid "change the definition of an operator family" msgstr "ì—°ì‚°ìž ë¶€ë¥˜ì˜ ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4933 -msgid "change the definition of a row level security policy" +#: sql_help.c:5302 +msgid "change the definition of a row-level security policy" msgstr "로우 단위 보안 ì •ì±…ì˜ ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4939 +#: sql_help.c:5308 msgid "change the definition of a procedure" msgstr "프로시져 ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4945 +#: sql_help.c:5314 msgid "change the definition of a publication" msgstr "발행 ì •ë³´ 바꾸기" -#: sql_help.c:4951 sql_help.c:5053 +#: sql_help.c:5320 sql_help.c:5422 msgid "change a database role" msgstr "ë°ì´í„°ë² ì´ìФ 롤 변경" -#: sql_help.c:4957 +#: sql_help.c:5326 msgid "change the definition of a routine" msgstr "루틴 ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4963 +#: sql_help.c:5332 msgid "change the definition of a rule" msgstr "룰 ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4969 +#: sql_help.c:5338 msgid "change the definition of a schema" msgstr "스키마 ì´ë¦„ 바꾸기" -#: sql_help.c:4975 +#: sql_help.c:5344 msgid "change the definition of a sequence generator" msgstr "시퀀스 ì •ë³´ 바꾸기" -#: sql_help.c:4981 +#: sql_help.c:5350 msgid "change the definition of a foreign server" msgstr "외부 서버 ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4987 +#: sql_help.c:5356 msgid "change the definition of an extended statistics object" msgstr "확장 통계정보 ê°ì²´ ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:4993 +#: sql_help.c:5362 msgid "change the definition of a subscription" msgstr "êµ¬ë… ì •ë³´ 바꾸기" -#: sql_help.c:4999 +#: sql_help.c:5368 msgid "change a server configuration parameter" msgstr "서버 환경 설정 매개 변수 바꾸기" -#: sql_help.c:5005 +#: sql_help.c:5374 msgid "change the definition of a table" msgstr "í…Œì´ë¸” ì •ë³´ 바꾸기" -#: sql_help.c:5011 +#: sql_help.c:5380 msgid "change the definition of a tablespace" msgstr "í…Œì´ë¸”스페ì´ìФ ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:5017 +#: sql_help.c:5386 msgid "change the definition of a text search configuration" msgstr "í…스트 검색 구성 ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:5023 +#: sql_help.c:5392 msgid "change the definition of a text search dictionary" msgstr "í…스트 검색 사전 ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:5029 +#: sql_help.c:5398 msgid "change the definition of a text search parser" msgstr "í…스트 검색 파서 ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:5035 +#: sql_help.c:5404 msgid "change the definition of a text search template" msgstr "í…스트 검색 템플릿 ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:5041 +#: sql_help.c:5410 msgid "change the definition of a trigger" msgstr "트리거 ì •ë³´ 바꾸기" -#: sql_help.c:5047 +#: sql_help.c:5416 msgid "change the definition of a type" msgstr "ìžë£Œí˜• ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:5059 +#: sql_help.c:5428 msgid "change the definition of a user mapping" msgstr "ì‚¬ìš©ìž ë§¤í•‘ ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:5065 +#: sql_help.c:5434 msgid "change the definition of a view" msgstr "ë·° ì •ì˜ ë°”ê¾¸ê¸°" -#: sql_help.c:5071 +#: sql_help.c:5440 msgid "collect statistics about a database" msgstr "ë°ì´í„°ë² ì´ìФ 사용 통계 정보를 갱신함" -#: sql_help.c:5077 sql_help.c:5869 +#: sql_help.c:5446 sql_help.c:6244 msgid "start a transaction block" msgstr "트랜잭션 ë¸”ëŸ­ì„ ì‹œìž‘í•¨" -#: sql_help.c:5083 +#: sql_help.c:5452 msgid "invoke a procedure" msgstr "프로시져 호출" -#: sql_help.c:5089 +#: sql_help.c:5458 msgid "force a write-ahead log checkpoint" msgstr "트랜잭션 로그를 강제로 ì²´í¬í¬ì¸íЏ 함" -#: sql_help.c:5095 +#: sql_help.c:5464 msgid "close a cursor" msgstr "커서 닫기" -#: sql_help.c:5101 +#: sql_help.c:5470 msgid "cluster a table according to an index" msgstr "지정한 ì¸ë±ìФ 기준으로 í…Œì´ë¸” ìžë£Œë¥¼ 다시 저장함" -#: sql_help.c:5107 +#: sql_help.c:5476 msgid "define or change the comment of an object" msgstr "해당 ê°œì²´ì˜ ì½”ë©˜íŠ¸ë¥¼ 지정하거나 수정함" -#: sql_help.c:5113 sql_help.c:5671 +#: sql_help.c:5482 sql_help.c:6040 msgid "commit the current transaction" msgstr "현재 트랜잭션 commit" -#: sql_help.c:5119 +#: sql_help.c:5488 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "two-phase ì»¤ë°‹ì„ ìœ„í•´ 먼저 ì¤€ë¹„ëœ íŠ¸ëžœìž­ì…˜ì„ ì»¤ë°‹í•˜ì„¸ìš”." -#: sql_help.c:5125 +#: sql_help.c:5494 msgid "copy data between a file and a table" msgstr "í…Œì´ë¸”ê³¼ íŒŒì¼ ì‚¬ì´ ìžë£Œë¥¼ 복사함" -#: sql_help.c:5131 +#: sql_help.c:5500 msgid "define a new access method" msgstr "새 ì ‘ì† ë°©ë²• ì •ì˜" -#: sql_help.c:5137 +#: sql_help.c:5506 msgid "define a new aggregate function" msgstr "새 집계합수 만들기" -#: sql_help.c:5143 +#: sql_help.c:5512 msgid "define a new cast" msgstr "새 í˜•ë³€í™˜ìž ë§Œë“¤ê¸°" -#: sql_help.c:5149 +#: sql_help.c:5518 msgid "define a new collation" msgstr "새 collation 만들기" -#: sql_help.c:5155 +#: sql_help.c:5524 msgid "define a new encoding conversion" msgstr "새 문ìžì½”드변환규칙(conversion) 만들기" -#: sql_help.c:5161 +#: sql_help.c:5530 msgid "create a new database" msgstr "ë°ì´í„°ë² ì´ìФ ìƒì„±" -#: sql_help.c:5167 +#: sql_help.c:5536 msgid "define a new domain" msgstr "새 ë„ë©”ì¸ ë§Œë“¤ê¸°" -#: sql_help.c:5173 +#: sql_help.c:5542 msgid "define a new event trigger" msgstr "새 ì´ë²¤íЏ 트리거 만들기" -#: sql_help.c:5179 +#: sql_help.c:5548 msgid "install an extension" msgstr "확장 모듈 설치" -#: sql_help.c:5185 +#: sql_help.c:5554 msgid "define a new foreign-data wrapper" msgstr "새 외부 ë°ì´í„° ëž˜í¼ ì •ì˜" -#: sql_help.c:5191 +#: sql_help.c:5560 msgid "define a new foreign table" msgstr "새 외부 í…Œì´ë¸” ì •ì˜" -#: sql_help.c:5197 +#: sql_help.c:5566 msgid "define a new function" msgstr "새 함수 만들기" -#: sql_help.c:5203 sql_help.c:5263 sql_help.c:5365 +#: sql_help.c:5572 sql_help.c:5632 sql_help.c:5734 msgid "define a new database role" msgstr "새 ë°ì´í„°ë² ì´ìФ 롤 만들기" -#: sql_help.c:5209 +#: sql_help.c:5578 msgid "define a new index" msgstr "새 ì¸ë±ìФ 만들기" -#: sql_help.c:5215 +#: sql_help.c:5584 msgid "define a new procedural language" msgstr "새 프로시주얼 언어 만들기" -#: sql_help.c:5221 +#: sql_help.c:5590 msgid "define a new materialized view" msgstr "새 materialized ë·° 만들기" -#: sql_help.c:5227 +#: sql_help.c:5596 msgid "define a new operator" msgstr "새 ì—°ì‚°ìž ë§Œë“¤ê¸°" -#: sql_help.c:5233 +#: sql_help.c:5602 msgid "define a new operator class" msgstr "새 ì—°ìž”ìž í´ëž˜ìФ 만들기" -#: sql_help.c:5239 +#: sql_help.c:5608 msgid "define a new operator family" msgstr "새 ì—°ì‚°ìž ë¶€ë¥˜ 만들기" -#: sql_help.c:5245 -msgid "define a new row level security policy for a table" +#: sql_help.c:5614 +msgid "define a new row-level security policy for a table" msgstr "특정 í…Œì´ë¸”ì— ë¡œìš° 단위 보안 ì •ì±… ì •ì˜" -#: sql_help.c:5251 +#: sql_help.c:5620 msgid "define a new procedure" msgstr "새 프로시져 만들기" -#: sql_help.c:5257 +#: sql_help.c:5626 msgid "define a new publication" msgstr "새 발행 만들기" -#: sql_help.c:5269 +#: sql_help.c:5638 msgid "define a new rewrite rule" msgstr "새 룰(rule) 만들기" -#: sql_help.c:5275 +#: sql_help.c:5644 msgid "define a new schema" msgstr "새 스키마(schema) 만들기" -#: sql_help.c:5281 +#: sql_help.c:5650 msgid "define a new sequence generator" msgstr "새 시퀀스 만들기" -#: sql_help.c:5287 +#: sql_help.c:5656 msgid "define a new foreign server" msgstr "새 외부 서버 ì •ì˜" -#: sql_help.c:5293 +#: sql_help.c:5662 msgid "define extended statistics" msgstr "새 확장 통계정보 만들기" -#: sql_help.c:5299 +#: sql_help.c:5668 msgid "define a new subscription" msgstr "새 êµ¬ë… ë§Œë“¤ê¸°" -#: sql_help.c:5305 +#: sql_help.c:5674 msgid "define a new table" msgstr "새 í…Œì´ë¸” 만들기" -#: sql_help.c:5311 sql_help.c:5827 +#: sql_help.c:5680 sql_help.c:6202 msgid "define a new table from the results of a query" msgstr "쿼리 결과를 새 í…Œì´ë¸”로 만들기" -#: sql_help.c:5317 +#: sql_help.c:5686 msgid "define a new tablespace" msgstr "새 í…Œì´ë¸”스페ì´ìФ 만들기" -#: sql_help.c:5323 +#: sql_help.c:5692 msgid "define a new text search configuration" msgstr "새 í…스트 검색 구성 ì •ì˜" -#: sql_help.c:5329 +#: sql_help.c:5698 msgid "define a new text search dictionary" msgstr "새 í…스트 검색 사전 ì •ì˜" -#: sql_help.c:5335 +#: sql_help.c:5704 msgid "define a new text search parser" msgstr "새 í…스트 검색 파서 ì •ì˜" -#: sql_help.c:5341 +#: sql_help.c:5710 msgid "define a new text search template" msgstr "새 í…스트 검색 템플릿 ì •ì˜" -#: sql_help.c:5347 +#: sql_help.c:5716 msgid "define a new transform" msgstr "새 transform 만들기" -#: sql_help.c:5353 +#: sql_help.c:5722 msgid "define a new trigger" msgstr "새 트리거 만들기" -#: sql_help.c:5359 +#: sql_help.c:5728 msgid "define a new data type" msgstr "새 ìžë£Œí˜• 만들기" -#: sql_help.c:5371 +#: sql_help.c:5740 msgid "define a new mapping of a user to a foreign server" msgstr "사용ìžì™€ 외부 서버 ê°„ì˜ ìƒˆ 매핑 ì •ì˜" -#: sql_help.c:5377 +#: sql_help.c:5746 msgid "define a new view" msgstr "새 view 만들기" -#: sql_help.c:5383 +#: sql_help.c:5752 msgid "deallocate a prepared statement" msgstr "ì¤€ë¹„ëœ êµ¬ë¬¸(prepared statement) 지우기" -#: sql_help.c:5389 +#: sql_help.c:5758 msgid "define a cursor" msgstr "커서 지정" -#: sql_help.c:5395 +#: sql_help.c:5764 msgid "delete rows of a table" msgstr "í…Œì´ë¸”ì˜ ìžë£Œ ì‚­ì œ" -#: sql_help.c:5401 +#: sql_help.c:5770 msgid "discard session state" msgstr "세션 ìƒíƒœ ì‚­ì œ" -#: sql_help.c:5407 +#: sql_help.c:5776 msgid "execute an anonymous code block" msgstr "ìž„ì˜ ì½”ë“œ ë¸”ë¡ ì‹¤í–‰" -#: sql_help.c:5413 +#: sql_help.c:5782 msgid "remove an access method" msgstr "ì ‘ê·¼ 방법 ì‚­ì œ" -#: sql_help.c:5419 +#: sql_help.c:5788 msgid "remove an aggregate function" msgstr "집계 함수 ì‚­ì œ" -#: sql_help.c:5425 +#: sql_help.c:5794 msgid "remove a cast" msgstr "í˜•ë³€í™˜ìž ì‚­ì œ" -#: sql_help.c:5431 +#: sql_help.c:5800 msgid "remove a collation" msgstr "collation ì‚­ì œ" -#: sql_help.c:5437 +#: sql_help.c:5806 msgid "remove a conversion" msgstr "문ìžì½”드 변환규칙(conversion) ì‚­ì œ" -#: sql_help.c:5443 +#: sql_help.c:5812 msgid "remove a database" msgstr "ë°ì´í„°ë² ì´ìФ ì‚­ì œ" -#: sql_help.c:5449 +#: sql_help.c:5818 msgid "remove a domain" msgstr "ë„ë©”ì¸ ì‚­ì œ" -#: sql_help.c:5455 +#: sql_help.c:5824 msgid "remove an event trigger" msgstr "ì´ë²¤íЏ 트리거 ì‚­ì œ" -#: sql_help.c:5461 +#: sql_help.c:5830 msgid "remove an extension" msgstr "확장 모듈 ì‚­ì œ" -#: sql_help.c:5467 +#: sql_help.c:5836 msgid "remove a foreign-data wrapper" msgstr "외부 ë°ì´í„° ëž˜í¼ ì œê±°" -#: sql_help.c:5473 +#: sql_help.c:5842 msgid "remove a foreign table" msgstr "외부 í…Œì´ë¸” ì‚­ì œ" -#: sql_help.c:5479 +#: sql_help.c:5848 msgid "remove a function" msgstr "함수 ì‚­ì œ" -#: sql_help.c:5485 sql_help.c:5551 sql_help.c:5653 +#: sql_help.c:5854 sql_help.c:5920 sql_help.c:6022 msgid "remove a database role" msgstr "ë°ì´í„°ë² ì´ìФ 롤 ì‚­ì œ" -#: sql_help.c:5491 +#: sql_help.c:5860 msgid "remove an index" msgstr "ì¸ë±ìФ ì‚­ì œ" -#: sql_help.c:5497 +#: sql_help.c:5866 msgid "remove a procedural language" msgstr "프로시주얼 언어 ì‚­ì œ" -#: sql_help.c:5503 +#: sql_help.c:5872 msgid "remove a materialized view" msgstr "materialized ë·° ì‚­ì œ" -#: sql_help.c:5509 +#: sql_help.c:5878 msgid "remove an operator" msgstr "ì—°ì‚°ìž ì‚­ì œ" -#: sql_help.c:5515 +#: sql_help.c:5884 msgid "remove an operator class" msgstr "ì—°ì‚°ìž í´ëž˜ìФ ì‚­ì œ" -#: sql_help.c:5521 +#: sql_help.c:5890 msgid "remove an operator family" msgstr "ì—°ì‚°ìž ë¶€ë¥˜ ì‚­ì œ" -#: sql_help.c:5527 +#: sql_help.c:5896 msgid "remove database objects owned by a database role" msgstr "ë°ì´í„°ë² ì´ìФ 롤로 ê¶Œí•œì´ ë¶€ì—¬ëœ ë°ì´í„°ë² ì´ìФ ê°œì²´ë“¤ì„ ì‚­ì œí•˜ì„¸ìš”" -#: sql_help.c:5533 -msgid "remove a row level security policy from a table" -msgstr "특정 í…Œì´ë¸”ì— ì •ì˜ëœ 로우 단위 보안 ì •ì±… ì‚­ì œ" +#: sql_help.c:5902 +msgid "remove a row-level security policy from a table" +msgstr "해당 í…Œì´ë¸”ì— ì •ì˜ëœ 로우 단위 보안 ì •ì±… ì‚­ì œ" -#: sql_help.c:5539 +#: sql_help.c:5908 msgid "remove a procedure" msgstr "프로시져 ì‚­ì œ" -#: sql_help.c:5545 +#: sql_help.c:5914 msgid "remove a publication" msgstr "발행 ì‚­ì œ" -#: sql_help.c:5557 +#: sql_help.c:5926 msgid "remove a routine" msgstr "루틴 ì‚­ì œ" -#: sql_help.c:5563 +#: sql_help.c:5932 msgid "remove a rewrite rule" msgstr "룰(rule) ì‚­ì œ" -#: sql_help.c:5569 +#: sql_help.c:5938 msgid "remove a schema" msgstr "스키마(schema) ì‚­ì œ" -#: sql_help.c:5575 +#: sql_help.c:5944 msgid "remove a sequence" msgstr "시퀀스 ì‚­ì œ" -#: sql_help.c:5581 +#: sql_help.c:5950 msgid "remove a foreign server descriptor" msgstr "외부 서버 ì„¤ëª…ìž ì œê±°" -#: sql_help.c:5587 +#: sql_help.c:5956 msgid "remove extended statistics" msgstr "확장 통계정보 ì‚­ì œ" -#: sql_help.c:5593 +#: sql_help.c:5962 msgid "remove a subscription" msgstr "êµ¬ë… ì‚­ì œ" -#: sql_help.c:5599 +#: sql_help.c:5968 msgid "remove a table" msgstr "í…Œì´ë¸” ì‚­ì œ" -#: sql_help.c:5605 +#: sql_help.c:5974 msgid "remove a tablespace" msgstr "í…Œì´ë¸”스페ì´ìФ ì‚­ì œ" -#: sql_help.c:5611 +#: sql_help.c:5980 msgid "remove a text search configuration" msgstr "í…스트 검색 구성 제거" -#: sql_help.c:5617 +#: sql_help.c:5986 msgid "remove a text search dictionary" msgstr "í…스트 검색 사전 제거" -#: sql_help.c:5623 +#: sql_help.c:5992 msgid "remove a text search parser" msgstr "í…스트 검색 파서 제거" -#: sql_help.c:5629 +#: sql_help.c:5998 msgid "remove a text search template" msgstr "í…스트 검색 템플릿 제거" -#: sql_help.c:5635 +#: sql_help.c:6004 msgid "remove a transform" msgstr "transform ì‚­ì œ" -#: sql_help.c:5641 +#: sql_help.c:6010 msgid "remove a trigger" msgstr "트리거 ì‚­ì œ" -#: sql_help.c:5647 +#: sql_help.c:6016 msgid "remove a data type" msgstr "ìžë£Œí˜• ì‚­ì œ" -#: sql_help.c:5659 +#: sql_help.c:6028 msgid "remove a user mapping for a foreign server" msgstr "외부 ì„œë²„ì— ëŒ€í•œ ì‚¬ìš©ìž ë§¤í•‘ 제거" -#: sql_help.c:5665 +#: sql_help.c:6034 msgid "remove a view" msgstr "ë·°(view) ì‚­ì œ" -#: sql_help.c:5677 +#: sql_help.c:6046 msgid "execute a prepared statement" msgstr "ì¤€ë¹„ëœ êµ¬ë¬¸(prepared statement) 실행" -#: sql_help.c:5683 +#: sql_help.c:6052 msgid "show the execution plan of a statement" msgstr "쿼리 ì‹¤í–‰ê³„íš ë³´ê¸°" -#: sql_help.c:5689 +#: sql_help.c:6058 msgid "retrieve rows from a query using a cursor" msgstr "해당 커서ì—서 ìžë£Œ 뽑기" -#: sql_help.c:5695 +#: sql_help.c:6064 msgid "define access privileges" msgstr "액세스 권한 지정하기" -#: sql_help.c:5701 +#: sql_help.c:6070 msgid "import table definitions from a foreign server" msgstr "외부 서버로부터 í…Œì´ë¸” ì •ì˜ ê°€ì ¸ì˜¤ê¸°" -#: sql_help.c:5707 +#: sql_help.c:6076 msgid "create new rows in a table" msgstr "í…Œì´ë¸” ìžë£Œ 삽입" -#: sql_help.c:5713 +#: sql_help.c:6082 msgid "listen for a notification" msgstr "특정 서버 메시지 수신함" -#: sql_help.c:5719 +#: sql_help.c:6088 msgid "load a shared library file" msgstr "공유 ë¼ì´ë¸ŒëŸ¬ë¦¬ íŒŒì¼ ë¡œë“œ" -#: sql_help.c:5725 +#: sql_help.c:6094 msgid "lock a table" msgstr "í…Œì´ë¸” 잠금" -#: sql_help.c:5731 +#: sql_help.c:6100 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "ì¡°ê±´ë¶€ í…Œì´ë¸” insert, update, delete" + +#: sql_help.c:6106 msgid "position a cursor" msgstr "커서 위치 옮기기" -#: sql_help.c:5737 +#: sql_help.c:6112 msgid "generate a notification" msgstr "특정 서버 메시지 ë°œìƒ" -#: sql_help.c:5743 +#: sql_help.c:6118 msgid "prepare a statement for execution" msgstr "ì¤€ë¹„ëœ êµ¬ë¬¸(prepared statement) 만들기" -#: sql_help.c:5749 +#: sql_help.c:6124 msgid "prepare the current transaction for two-phase commit" msgstr "two-phase ì»¤ë°‹ì„ ìœ„í•´ 현재 íŠ¸ëžœìž­ì…˜ì„ ì¤€ë¹„í•¨" -#: sql_help.c:5755 +#: sql_help.c:6130 msgid "change the ownership of database objects owned by a database role" msgstr "ë°ì´í„°ë² ì´ìФ 롤로 ê¶Œí•œì´ ë¶€ì—¬ëœ ë°ì´í„°ë² ì´ìФ ê°œì²´ë“¤ì˜ ì†Œìœ ì£¼ 바꾸기" -#: sql_help.c:5761 +#: sql_help.c:6136 msgid "replace the contents of a materialized view" msgstr "êµ¬ì²´í™”ëœ ë·°ì˜ ë‚´ìš© 수정" -#: sql_help.c:5767 +#: sql_help.c:6142 msgid "rebuild indexes" msgstr "ì¸ë±ìФ 다시 만들기" -#: sql_help.c:5773 -msgid "destroy a previously defined savepoint" -msgstr "ì´ì „ ì •ì˜ëœ savepoint를 파기함" +#: sql_help.c:6148 +msgid "release a previously defined savepoint" +msgstr "ì´ì „ ì •ì˜ëœ savepoint를 지움" -#: sql_help.c:5779 +#: sql_help.c:6154 msgid "restore the value of a run-time parameter to the default value" msgstr "실시간 환경 ë³€ìˆ˜ê°’ì„ ì´ˆê¸°ê°’ìœ¼ë¡œ 다시 지정" -#: sql_help.c:5785 +#: sql_help.c:6160 msgid "remove access privileges" msgstr "액세스 권한 해제하기" -#: sql_help.c:5797 +#: sql_help.c:6172 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "two-phase ì»¤ë°‹ì„ ìœ„í•´ 먼저 준비ë˜ì—ˆë˜ 트랜잭션 실행취소하기" -#: sql_help.c:5803 +#: sql_help.c:6178 msgid "roll back to a savepoint" msgstr "savepoint 파기하기" -#: sql_help.c:5809 +#: sql_help.c:6184 msgid "define a new savepoint within the current transaction" msgstr "현재 트랜잭션ì—서 새로운 savepoint 만들기" -#: sql_help.c:5815 +#: sql_help.c:6190 msgid "define or change a security label applied to an object" msgstr "해당 ê°œì²´ì— ë³´ì•ˆ ë¼ë²¨ì„ ì •ì˜í•˜ê±°ë‚˜ 변경" -#: sql_help.c:5821 sql_help.c:5875 sql_help.c:5911 +#: sql_help.c:6196 sql_help.c:6250 sql_help.c:6286 msgid "retrieve rows from a table or view" msgstr "í…Œì´ë¸”ì´ë‚˜ ë·°ì˜ ìžë£Œë¥¼ 출력" -#: sql_help.c:5833 +#: sql_help.c:6208 msgid "change a run-time parameter" msgstr "실시간 환경 변수값 바꾸기" -#: sql_help.c:5839 +#: sql_help.c:6214 msgid "set constraint check timing for the current transaction" msgstr "현재 트랜잭션ì—서 제약조건 설정" -#: sql_help.c:5845 +#: sql_help.c:6220 msgid "set the current user identifier of the current session" msgstr "현재 ì„¸ì…˜ì˜ í˜„ìž¬ ì‚¬ìš©ìž ì‹ë³„ìžë¥¼ 지정" -#: sql_help.c:5851 +#: sql_help.c:6226 msgid "" "set the session user identifier and the current user identifier of the " "current session" msgstr "현재 ì„¸ì…˜ì˜ ì‚¬ìš©ìž ì¸ì¦ì„ 지정함 - ì‚¬ìš©ìž ì§€ì •" -#: sql_help.c:5857 +#: sql_help.c:6232 msgid "set the characteristics of the current transaction" msgstr "현재 íŠ¸ëžœìž­ì…˜ì˜ ì„±ì§ˆì„ ì§€ì •í•¨" -#: sql_help.c:5863 +#: sql_help.c:6238 msgid "show the value of a run-time parameter" msgstr "실시간 환경 ë³€ìˆ˜ê°’ë“¤ì„ ë³´ì—¬ì¤Œ" -#: sql_help.c:5881 +#: sql_help.c:6256 msgid "empty a table or set of tables" msgstr "하나 ë˜ëŠ” 지정한 ì—¬ëŸ¬ê°œì˜ í…Œì´ë¸”ì—서 모든 ìžë£Œ 지움" -#: sql_help.c:5887 +#: sql_help.c:6262 msgid "stop listening for a notification" msgstr "특정 서버 메시지 수신 기능 ë”" -#: sql_help.c:5893 +#: sql_help.c:6268 msgid "update rows of a table" msgstr "í…Œì´ë¸” ìžë£Œ 갱신" -#: sql_help.c:5899 +#: sql_help.c:6274 msgid "garbage-collect and optionally analyze a database" msgstr "물리ì ì¸ ìžë£Œ 정리 작업 - 쓰레기값 청소" -#: sql_help.c:5905 +#: sql_help.c:6280 msgid "compute a set of rows" msgstr "compute a set of rows" -#: startup.c:212 +#: startup.c:220 #, c-format msgid "-1 can only be used in non-interactive mode" msgstr "-1 ì˜µì…˜ì€ ë¹„ëŒ€í™”í˜• 모드ì—서만 사용할 수 있ìŒ" -#: startup.c:299 -#, c-format -msgid "could not connect to server: %s" -msgstr "서버 ì ‘ì† ì‹¤íŒ¨: %s" - -#: startup.c:327 +#: startup.c:343 #, c-format msgid "could not open log file \"%s\": %m" msgstr "\"%s\" 잠금파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" -#: startup.c:439 +#: startup.c:460 #, c-format msgid "" "Type \"help\" for help.\n" @@ -6489,27 +6715,27 @@ msgstr "" "ë„움ë§ì„ 보려면 \"help\"를 입력하십시오.\n" "\n" -#: startup.c:589 +#: startup.c:612 #, c-format msgid "could not set printing parameter \"%s\"" msgstr "출력 매개 변수 \"%s\" 지정할 수 ì—†ìŒ" -#: startup.c:697 +#: startup.c:719 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "ìžì„¸í•œ ë„움ë§ì€ \"%s --help\"\n" +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." -#: startup.c:714 +#: startup.c:735 #, c-format msgid "extra command-line argument \"%s\" ignored" msgstr "추가 명령행 ì¸ìž \"%s\" 무시ë¨" -#: startup.c:763 +#: startup.c:783 #, c-format msgid "could not find own program executable" msgstr "실행 가능한 í”„ë¡œê·¸ëž¨ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: tab-complete.c:4640 +#: tab-complete.c:6216 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6535,7 +6761,7 @@ msgstr "\"%s\" ê°’ì€ \"%s\" 변수값으로 사용할 수 ì—†ìŒ; ì •ìˆ˜í˜•ì´ msgid "invalid variable name: \"%s\"" msgstr "ìž˜ëª»ëœ ë³€ìˆ˜ ì´ë¦„: \"%s\"" -#: variables.c:393 +#: variables.c:418 #, c-format msgid "" "unrecognized value \"%s\" for \"%s\"\n" @@ -6543,3 +6769,19 @@ msgid "" msgstr "" "\"%s\" ê°’ì€ \"%s\" 변수값으로 사용할 수 ì—†ìŒ\n" "사용할 수 있는 변수값: %s" + +#~ msgid "ICU Locale" +#~ msgstr "ICU 로케ì¼" + +#~ msgid "local socket" +#~ msgstr "로컬 소켓" + +#~ msgid "" +#~ " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n" +#~ msgstr " \\watch [[i=]SEC] [c=N] SECì´ˆ 간격, N번 반복\n" + +#~ msgid "constraint" +#~ msgstr "제약조건" + +#~ msgid "where constraint is:" +#~ msgstr "제약조건 사용법:" diff --git a/src/bin/psql/po/meson.build b/src/bin/psql/po/meson.build index 103ed93a78980..4907d85080ac5 100644 --- a/src/bin/psql/po/meson.build +++ b/src/bin/psql/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('psql-' + pg_version_major.to_string())] diff --git a/src/bin/psql/po/pt_BR.po b/src/bin/psql/po/pt_BR.po index 3ebe5aa0e228a..e3374d9d2b3d8 100644 --- a/src/bin/psql/po/pt_BR.po +++ b/src/bin/psql/po/pt_BR.po @@ -2,636 +2,785 @@ # Copyright (C) 2009 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # Euler Taveira de Oliveira , 2003-2016. +# Halley Pacheco de Oliveira , 2023-2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.6\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2016-10-25 16:32-0300\n" -"PO-Revision-Date: 2005-11-02 10:30-0300\n" -"Last-Translator: Euler Taveira de Oliveira \n" -"Language-Team: Brazilian Portuguese \n" +"Project-Id-Version: PostgreSQL 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-01-02 12:57-0300\n" +"PO-Revision-Date: 2024-01-01 05:22-0300\n" +"Last-Translator: Halley Pacheco de Oliveira \n" +"Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n>1);\n" +"X-Generator: Poedit 3.4.1\n" -#: ../../common/exec.c:127 ../../common/exec.c:241 ../../common/exec.c:284 +#: ../../../src/common/logging.c:276 #, c-format -msgid "could not identify current directory: %s" -msgstr "não pôde identificar diretório atual: %s" +msgid "error: " +msgstr "erro: " -#: ../../common/exec.c:146 +#: ../../../src/common/logging.c:283 #, c-format -msgid "invalid binary \"%s\"" -msgstr "binário \"%s\" é inválido" +msgid "warning: " +msgstr "aviso: " -#: ../../common/exec.c:195 +#: ../../../src/common/logging.c:294 #, c-format -msgid "could not read binary \"%s\"" -msgstr "não pôde ler o binário \"%s\"" +msgid "detail: " +msgstr "detalhe: " -#: ../../common/exec.c:202 +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "dica: " + +#: ../../common/exec.c:172 +#, c-format +msgid "invalid binary \"%s\": %m" +msgstr "binário inválido \"%s\": %m" + +#: ../../common/exec.c:215 +#, c-format +msgid "could not read binary \"%s\": %m" +msgstr "não foi possível ler o binário \"%s\": %m" + +#: ../../common/exec.c:223 #, c-format msgid "could not find a \"%s\" to execute" -msgstr "não pôde encontrar o \"%s\" para executá-lo" +msgstr "não foi possível encontrar \"%s\" para executar" -#: ../../common/exec.c:257 ../../common/exec.c:293 +#: ../../common/exec.c:250 #, c-format -msgid "could not change directory to \"%s\": %s" -msgstr "não pôde mudar diretório para \"%s\": %s" +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "não foi possível resolver o caminho \"%s\" para a forma absoluta: %m" -#: ../../common/exec.c:272 +#: ../../common/exec.c:412 #, c-format -msgid "could not read symbolic link \"%s\"" -msgstr "não pôde ler link simbólico \"%s\"" +msgid "%s() failed: %m" +msgstr "%s() falhou: %m" -#: ../../common/exec.c:523 +#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226 +#: mainloop.c:80 mainloop.c:398 #, c-format -msgid "pclose failed: %s" -msgstr "pclose falhou: %s" +msgid "out of memory" +msgstr "sem memória" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 command.c:342 input.c:227 mainloop.c:80 -#: mainloop.c:261 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "sem memória\n" -#: ../../common/fe_memutils.c:92 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" -msgstr "não pode duplicar ponteiro nulo (erro interno)\n" +msgstr "não é possível duplicar ponteiro nulo (erro interno)\n" -#: ../../common/username.c:45 +#: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" -msgstr "não pôde encontrar ID de usuário efetivo %ld: %s" +msgstr "não foi possível encontrar ID de usuário efetivo %ld: %s" -#: ../../common/username.c:47 command.c:299 +#: ../../common/username.c:45 command.c:613 msgid "user does not exist" -msgstr "usuário não existe" +msgstr "o usuário não existe" -#: ../../common/username.c:62 +#: ../../common/username.c:60 #, c-format msgid "user name lookup failure: error code %lu" -msgstr "falhou ao pesquisar nome de usuário: código de erro %lu" +msgstr "falha na procura do nome de usuário: código de erro %lu" -#: ../../common/wait_error.c:47 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" -msgstr "comando não é executável" +msgstr "o comando não é executável" -#: ../../common/wait_error.c:51 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" -msgstr "comando não foi encontrado" +msgstr "o comando não foi encontrado" -#: ../../common/wait_error.c:56 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" -msgstr "processo filho terminou com código de saída %d" +msgstr "o processo filho terminou com código de saída %d" -#: ../../common/wait_error.c:63 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" -msgstr "processo filho foi terminado pela exceção 0x%X" +msgstr "o processo filho foi terminado pela exceção 0x%X" -#: ../../common/wait_error.c:73 +#: ../../common/wait_error.c:76 #, c-format -msgid "child process was terminated by signal %s" -msgstr "processo filho foi terminado pelo sinal %s" - -#: ../../common/wait_error.c:77 -#, c-format -msgid "child process was terminated by signal %d" -msgstr "processo filho foi terminado pelo sinal %d" +msgid "child process was terminated by signal %d: %s" +msgstr "o processo filho foi terminado pelo sinal %d: %s" #: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" -msgstr "processo filho terminou com status desconhecido %d" +msgstr "o processo filho terminou com status desconhecido %d" + +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +msgid "Cancel request sent\n" +msgstr "Requisição de cancelamento enviada\n" + +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +msgid "Could not send cancel request: " +msgstr "Não foi possível enviar a requisição de cancelamento: " -#: ../../fe_utils/print.c:354 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" -msgstr[0] "(%lu registro)" -msgstr[1] "(%lu registros)" +msgstr[0] "(%lu linha)" +msgstr[1] "(%lu linhas)" -#: ../../fe_utils/print.c:2906 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "Interrompido\n" -#: ../../fe_utils/print.c:2970 +#: ../../fe_utils/print.c:3218 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" -msgstr "Não pode adicionar cabeçalho a conteúdo de tabela: quantidade de colunas %d foi excedida.\n" +msgstr "" +"Não foi possível adicionar cabeçalho ao conteúdo da tabela:\n" +"contagem de colunas excedida (%d).\n" -#: ../../fe_utils/print.c:3010 +#: ../../fe_utils/print.c:3258 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "Não pode adicionar célula a conteúdo de tabela: quantidade total de células %d foi excedida.\n" +msgstr "" +"Não foi possível adicionar células ao conteúdo da tabela:\n" +"contagem total de células excedida (%d).\n" -#: ../../fe_utils/print.c:3259 +#: ../../fe_utils/print.c:3516 #, c-format msgid "invalid output format (internal error): %d" msgstr "formato de saída inválido (erro interno): %d" -#: ../../fe_utils/psqlscan.l:713 +#: ../../fe_utils/psqlscan.l:717 +#, c-format +msgid "skipping recursive expansion of variable \"%s\"" +msgstr "ignorada a expansão recursiva da variável \"%s\"" + +#: ../../port/thread.c:50 ../../port/thread.c:86 #, c-format -msgid "skipping recursive expansion of variable \"%s\"\n" -msgstr "ignorando expansão recursiva da variável \"%s\"\n" +msgid "could not look up local user ID %d: %s" +msgstr "não foi possível procurar o ID do usuário local %d: %s" -#: command.c:129 +#: ../../port/thread.c:55 ../../port/thread.c:91 #, c-format -msgid "Invalid command \\%s. Try \\? for help.\n" -msgstr "Comando inválido \\%s. Tente \\? para ajuda.\n" +msgid "local user with ID %d does not exist" +msgstr "o usuário local com ID %d não existe" -#: command.c:131 +#: command.c:234 #, c-format -msgid "invalid command \\%s\n" -msgstr "comando inválido \\%s\n" +msgid "invalid command \\%s" +msgstr "comando inválido \\%s" -#: command.c:142 +#: command.c:236 #, c-format -msgid "\\%s: extra argument \"%s\" ignored\n" -msgstr "\\%s: argumento extra \"%s\" ignorado\n" +msgid "Try \\? for help." +msgstr "Tente \\? para obter ajuda." -#: command.c:297 +#: command.c:254 #, c-format -msgid "could not get home directory for user ID %ld: %s\n" -msgstr "não pôde obter diretório base para ID de usuário %ld: %s\n" +msgid "\\%s: extra argument \"%s\" ignored" +msgstr "\\%s: argumento extra \"%s\" ignorado" -#: command.c:315 +#: command.c:306 #, c-format -msgid "\\%s: could not change directory to \"%s\": %s\n" -msgstr "\\%s: não pôde mudar diretório para \"%s\": %s\n" +msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" +msgstr "Comando \\%s ignorado; use \\endif ou Ctrl-C para sair do bloco \\if corrente" -#: command.c:330 common.c:553 common.c:611 common.c:1144 +#: command.c:611 +#, c-format +msgid "could not get home directory for user ID %ld: %s" +msgstr "não foi possível obter o diretório inicial do usuário com ID %ld: %s" + +#: command.c:630 +#, c-format +msgid "\\%s: could not change directory to \"%s\": %m" +msgstr "\\%s: não foi possível alterar o diretório para \"%s\": %m" + +#: command.c:654 #, c-format msgid "You are currently not connected to a database.\n" -msgstr "Você não está conectado ao banco de dados.\n" +msgstr "No momento você não está conectado a um banco de dados.\n" -#: command.c:355 +#: command.c:664 +#, c-format +msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" +msgstr "Você está conectado ao banco de dados \"%s\" como usuário \"%s\" no endereço \"%s\" na porta \"%s\".\n" + +#: command.c:667 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Você está conectado ao banco de dados \"%s\" como usuário \"%s\" via soquete em \"%s\" na porta \"%s\".\n" -#: command.c:358 +#: command.c:673 #, c-format -msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" -msgstr "Você está conectado ao banco de dados \"%s\" como usuário \"%s\" na máquina \"%s\" na porta \"%s\".\n" +msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" +msgstr "Você está conectado ao banco de dados \"%s\" como usuário \"%s\" no hospedeiro \"%s\" (endereço %s\") na porta \"%s\".\n" -#: command.c:574 command.c:647 command.c:746 command.c:1584 +#: command.c:676 #, c-format -msgid "no query buffer\n" -msgstr "nenhum buffer de consulta\n" +msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" +msgstr "Você está conectado ao banco de dados \"%s\" como usuário \"%s\" no hospedeiro \"%s\" na porta \"%s\".\n" -#: command.c:607 command.c:3547 +#: command.c:1066 command.c:1159 command.c:2682 #, c-format -msgid "invalid line number: %s\n" -msgstr "número de linha inválido: %s\n" +msgid "no query buffer" +msgstr "nenhum buffer de consulta" -#: command.c:640 +#: command.c:1099 command.c:5689 #, c-format -msgid "The server (version %s) does not support editing function source.\n" -msgstr "O servidor (versão %s) não suporta edição do código da função.\n" +msgid "invalid line number: %s" +msgstr "número de linha inválido: %s" -#: command.c:721 command.c:792 +#: command.c:1237 msgid "No changes" msgstr "Nenhuma alteração" -#: command.c:739 +#: command.c:1315 #, c-format -msgid "The server (version %s) does not support editing view definitions.\n" -msgstr "O servidor (versão %s) não suporta edição do código da visão.\n" +msgid "%s: invalid encoding name or conversion procedure not found" +msgstr "%s: nome de codificação inválido ou procedimento de conversão não encontrado" -#: command.c:846 -#, c-format -msgid "%s: invalid encoding name or conversion procedure not found\n" -msgstr "%s: nome da codificação é inválido ou procedimento de conversão não foi encontrado\n" - -#: command.c:871 command.c:1962 command.c:3649 common.c:153 common.c:200 -#: common.c:497 common.c:1190 common.c:1218 common.c:1319 copy.c:489 -#: copy.c:699 large_obj.c:156 large_obj.c:191 large_obj.c:253 +#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795 +#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120 +#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480 +#: copy.c:486 copy.c:721 help.c:66 large_obj.c:157 large_obj.c:192 +#: large_obj.c:254 startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:875 -msgid "out of memory" -msgstr "sem memória" - -#: command.c:878 +#: command.c:1357 msgid "There is no previous error." msgstr "Não há erro anterior." -#: command.c:972 command.c:1022 command.c:1036 command.c:1053 command.c:1160 -#: command.c:1324 command.c:1564 command.c:1595 +#: command.c:1470 #, c-format -msgid "\\%s: missing required argument\n" -msgstr "\\%s: faltando argumento requerido\n" +msgid "\\%s: missing right parenthesis" +msgstr "\\%s: está faltando o parêntese direito" -#: command.c:1085 -msgid "Query buffer is empty." -msgstr "Buffer de consulta está vazio." +#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021 +#: command.c:2203 command.c:2444 command.c:2649 command.c:2689 +#, c-format +msgid "\\%s: missing required argument" +msgstr "\\%s: está faltando um argumento requerido" + +#: command.c:1815 +#, c-format +msgid "\\elif: cannot occur after \\else" +msgstr "\\elif: não pode ocorrer depois de \\else" -#: command.c:1095 -msgid "Enter new password: " -msgstr "Digite nova senha: " +#: command.c:1820 +#, c-format +msgid "\\elif: no matching \\if" +msgstr "\\elif: sem \\if correspondente" -#: command.c:1096 -msgid "Enter it again: " -msgstr "Digite-a novamente: " +#: command.c:1884 +#, c-format +msgid "\\else: cannot occur after \\else" +msgstr "\\else: não pode ocorrer depois de \\else" + +#: command.c:1889 +#, c-format +msgid "\\else: no matching \\if" +msgstr "\\else: sem \\if correspondente" + +#: command.c:1929 +#, c-format +msgid "\\endif: no matching \\if" +msgstr "\\endif: sem \\if correspondente" -#: command.c:1100 +#: command.c:2085 +msgid "Query buffer is empty." +msgstr "O buffer de consulta está vazio." + +#: command.c:2128 #, c-format -msgid "Passwords didn't match.\n" -msgstr "Senhas não correspondem.\n" +msgid "Enter new password for user \"%s\": " +msgstr "Digite a nova senha para o usuário \"%s\": " + +#: command.c:2132 +msgid "Enter it again: " +msgstr "Digite novamente: " -#: command.c:1118 +#: command.c:2141 #, c-format -msgid "Password encryption failed.\n" -msgstr "Criptografia de senha falhou.\n" +msgid "Passwords didn't match." +msgstr "As senhas não correspondem." -#: command.c:1189 command.c:1305 command.c:1569 +#: command.c:2238 #, c-format -msgid "\\%s: error while setting variable\n" -msgstr "\\%s: erro ao definir variável\n" +msgid "\\%s: could not read value for variable" +msgstr "\\%s: não foi possível ler o valor da variável" -#: command.c:1252 +#: command.c:2340 msgid "Query buffer reset (cleared)." msgstr "Buffer de consulta reiniciado (limpo)." -#: command.c:1264 +#: command.c:2362 #, c-format msgid "Wrote history to file \"%s\".\n" -msgstr "Histórico escrito para arquivo \"%s\".\n" +msgstr "Histórico escrito para o arquivo \"%s\".\n" -#: command.c:1329 +#: command.c:2449 #, c-format -msgid "\\%s: environment variable name must not contain \"=\"\n" -msgstr "\\%s: nome de variável de ambiente não deve conter \"=\"\n" +msgid "\\%s: environment variable name must not contain \"=\"" +msgstr "\\%s: o nome da variável de ambiente não deve conter \"=\"" -#: command.c:1373 +#: command.c:2497 #, c-format -msgid "The server (version %s) does not support showing function source.\n" -msgstr "O servidor (versão %s) não suporta exibição do código da função.\n" +msgid "function name is required" +msgstr "é requerido o nome da função" + +#: command.c:2499 +#, c-format +msgid "view name is required" +msgstr "é requerido o nome da visão" + +#: command.c:2621 +msgid "Timing is on." +msgstr "Tempo de execução está ativado." -#: command.c:1380 +#: command.c:2623 +msgid "Timing is off." +msgstr "Tempo de execução está desativado." + +#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080 +#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136 +#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329 +#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818 #, c-format -msgid "function name is required\n" -msgstr "nome de função é requerido\n" +msgid "%s: %m" +msgstr "%s: %m" -#: command.c:1455 +#: command.c:2736 copy.c:388 #, c-format -msgid "The server (version %s) does not support showing view definitions.\n" -msgstr "O servidor (versão %s) não suporta exibição do código da visão.\n" +msgid "%s: %s" +msgstr "%s: %s" -#: command.c:1462 +#: command.c:2806 command.c:2852 #, c-format -msgid "view name is required\n" -msgstr "nome de visão é requerido\n" +msgid "\\watch: interval value is specified more than once" +msgstr "\\watch: o valor do intervalo é especificado mais de uma vez" -#: command.c:1549 -msgid "Timing is on." -msgstr "Tempo de execução está habilitado." +#: command.c:2816 command.c:2862 +#, c-format +msgid "\\watch: incorrect interval value \"%s\"" +msgstr "\\watch: valor do intervalo incorreto \"%s\"" -#: command.c:1551 -msgid "Timing is off." -msgstr "Tempo de execução está desabilitado." +#: command.c:2826 +#, c-format +msgid "\\watch: iteration count is specified more than once" +msgstr "\\watch: a contagem de iterações é especificada mais de uma vez" -#: command.c:1613 command.c:1633 command.c:2311 command.c:2314 command.c:2317 -#: command.c:2323 command.c:2325 command.c:2333 command.c:2343 command.c:2352 -#: command.c:2366 command.c:2383 command.c:2441 common.c:68 copy.c:332 -#: copy.c:392 copy.c:405 psqlscanslash.l:711 psqlscanslash.l:722 -#: psqlscanslash.l:732 +#: command.c:2836 #, c-format -msgid "%s: %s\n" -msgstr "%s: %s\n" +msgid "\\watch: incorrect iteration count \"%s\"" +msgstr "\\watch: contagem de iterações incorreta \"%s\"" -#: command.c:1727 +#: command.c:2843 #, c-format -msgid "+ opt(%d) = |%s|\n" -msgstr "+ opt(%d) = |%s|\n" +msgid "\\watch: unrecognized parameter \"%s\"" +msgstr "\\watch: parâmetro não reconhecido \"%s\"" -#: command.c:1753 startup.c:207 +#: command.c:3236 startup.c:243 startup.c:293 msgid "Password: " msgstr "Senha: " -#: command.c:1758 startup.c:209 +#: command.c:3241 startup.c:290 #, c-format msgid "Password for user %s: " -msgstr "Senha para usuário %s: " +msgstr "Senha para o usuário %s: " + +#: command.c:3297 +#, c-format +msgid "Do not give user, host, or port separately when using a connection string" +msgstr "" +"Não forneça usuário, hospedeiro ou porta separadamente\n" +"ao usar uma cadeia de caracteres de conexão" -#: command.c:1809 +#: command.c:3332 #, c-format -msgid "All connection parameters must be supplied because no database connection exists\n" -msgstr "Todos os parâmetros de conexão devem ser fornecidos porque nenhuma conexão de banco de dados existe\n" +msgid "No database connection exists to re-use parameters from" +msgstr "Não existe nenhuma conexão de banco de dados para reutilizar os parâmetros dela" -#: command.c:1966 +#: command.c:3638 #, c-format -msgid "Previous connection kept\n" -msgstr "Conexão anterior mantida\n" +msgid "Previous connection kept" +msgstr "Conexão anterior mantida" -#: command.c:1970 +#: command.c:3644 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:2006 +#: command.c:3700 +#, c-format +msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" +msgstr "Agora você está conectado ao banco de dados \"%s\" como usuário \"%s\" no endereço \"%s\" na porta \"%s\".\n" + +#: command.c:3703 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" -msgstr "Você está conectado agora ao banco de dados \"%s\" como usuário \"%s\" via soquete em \"%s\" na porta \"%s\".\n" +msgstr "Agora você está conectado ao banco de dados \"%s\" como usuário \"%s\" via soquete em \"%s\" na porta \"%s\".\n" + +#: command.c:3709 +#, c-format +msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" +msgstr "Agora você está conectado ao banco de dados \"%s\" como usuário \"%s\" no hospedeiro \"%s\" (endereço \"%s\") na porta \"%s\".\n" -#: command.c:2009 +#: command.c:3712 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" -msgstr "Você está conectado agora ao banco de dados \"%s\" como usuário \"%s\" na máquina \"%s\" na porta \"%s\".\n" +msgstr "Agora você está conectado ao banco de dados \"%s\" como usuário \"%s\" no hospedeiro \"%s\" na porta \"%s\".\n" -#: command.c:2013 +#: command.c:3717 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" -msgstr "Você está conectado agora ao banco de dados \"%s\" como usuário \"%s\".\n" +msgstr "Agora você está conectado ao banco de dados \"%s\" como usuário \"%s\".\n" -#: command.c:2046 +#: command.c:3757 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, servidor %s)\n" -#: command.c:2054 +#: command.c:3770 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" " Some psql features might not work.\n" msgstr "" -"AVISO: %s versão %s, servidor versão %s.\n" -" Algumas funcionalidades do psql podem não funcionar.\n" +"ADVERTÊNCIA: %s versão %s, servidor versão %s.\n" +" Algumas funcionalidades do psql podem não funcionar.\n" -#: command.c:2091 +#: command.c:3807 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, bits: %s, compression: %s)\n" -msgstr "conexão SSL (protocolo: %s, cifra: %s, bits: %s, compressão: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" +msgstr "Conexão SSL (protocolo: %s, encriptação: %s, compactação: %s)\n" -#: command.c:2092 command.c:2093 command.c:2094 +#: command.c:3808 command.c:3809 msgid "unknown" msgstr "desconhecido" -#: command.c:2095 help.c:46 +#: command.c:3810 help.c:42 msgid "off" -msgstr "desabilitado" +msgstr "desativado" -#: command.c:2095 help.c:46 +#: command.c:3810 help.c:42 msgid "on" -msgstr "habilitado" +msgstr "ativado" + +#: command.c:3824 +#, c-format +msgid "GSSAPI-encrypted connection\n" +msgstr "Conexão encriptada por GSSAPI\n" -#: command.c:2115 +#: command.c:3844 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" " 8-bit characters might not work correctly. See psql reference\n" " page \"Notes for Windows users\" for details.\n" msgstr "" -"AVISO: página de código do Console (%u) difere da página de código do Windows (%u)\n" -" caracteres de 8 bits podem não funcionar corretamente. Veja página de\n" -" referência do psql \"Notes for Windows users\" para obter detalhes.\n" +"ADVERTÊNCIA: A página de código da console (%u) difere da página de código do Windows (%u)\n" +" os caracteres de 8 bits podem não funcionar corretamente. Veja a página de\n" +" referência do psql \"Notes for Windows users\" para obter detalhes.\n" + +#: command.c:3949 +#, c-format +msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" +msgstr "a variável de ambiente PSQL_EDITOR_LINENUMBER_ARG deve ser definida para especificar um número de linha" + +#: command.c:3979 +#, c-format +msgid "could not start editor \"%s\"" +msgstr "não foi possível iniciar o editor \"%s\"" + +#: command.c:3981 +#, c-format +msgid "could not start /bin/sh" +msgstr "não foi possível iniciar /bin/sh" + +#: command.c:4031 +#, c-format +msgid "could not locate temporary directory: %s" +msgstr "não foi possível localizar o diretório temporário: %s" -#: command.c:2200 +#: command.c:4058 #, c-format -msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number\n" -msgstr "variável de ambiente PSQL_EDITOR_LINENUMBER_ARG deve ser definida para especificar um número de linha\n" +msgid "could not open temporary file \"%s\": %m" +msgstr "não foi possível abrir o arquivo temporário \"%s\": %m" -#: command.c:2229 +#: command.c:4394 #, c-format -msgid "could not start editor \"%s\"\n" -msgstr "não pôde iniciar o editor \"%s\"\n" +msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" +msgstr "\\pset: abreviatura ambígua \"%s\" corresponde a \"%s\" e \"%s\"" -#: command.c:2231 +#: command.c:4414 #, c-format -msgid "could not start /bin/sh\n" -msgstr "não pôde iniciar /bin/sh\n" +msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" +msgstr "" +"\\pset: os formatos permitidos são\n" +"aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:2269 +#: command.c:4433 #, c-format -msgid "could not locate temporary directory: %s\n" -msgstr "não pôde localizar diretório temporário: %s\n" +msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" +msgstr "\\pset: os estilos de linha permitidos são ascii, old-ascii, unicode" -#: command.c:2296 +#: command.c:4448 #, c-format -msgid "could not open temporary file \"%s\": %s\n" -msgstr "não pôde abrir arquivo temporário \"%s\": %s\n" +msgid "\\pset: allowed Unicode border line styles are single, double" +msgstr "\\pset: os estilos de linha de borda Unicode permitidos são single, double" -#: command.c:2570 +#: command.c:4463 #, c-format -msgid "\\pset: allowed formats are unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms\n" -msgstr "\\pset: formatos permitidos são unaligned, aligned, wrapped, html, asciidoc, latex, latex-longtable, troff-ms\n" +msgid "\\pset: allowed Unicode column line styles are single, double" +msgstr "\\pset: os estilos de linha de coluna Unicode permitidos são single, double" -#: command.c:2589 +#: command.c:4478 #, c-format -msgid "\\pset: allowed line styles are ascii, old-ascii, unicode\n" -msgstr "\\pset: estilos de linha permitidos são ascii, old-ascii, unicode\n" +msgid "\\pset: allowed Unicode header line styles are single, double" +msgstr "\\pset: os estilos de linha de cabeçalho Unicode permitidos são single, double" -#: command.c:2605 +#: command.c:4530 #, c-format -msgid "\\pset: allowed Unicode border line styles are single, double\n" -msgstr "\\pset: estilos de linha de borda Unicode permitidos são single, double\n" +msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width" +msgstr "" +"\\pset: os valores para xheader_width permitidos são\n" +"\"%s\" (padrão), \"%s\", \"%s\", ou um número especificando a largura exata" -#: command.c:2620 +#: command.c:4547 #, c-format -msgid "\\pset: allowed Unicode column line styles are single, double\n" -msgstr "\\pset: estilos de linha de coluna Unicode permitidos são single, double\n" +msgid "\\pset: csv_fieldsep must be a single one-byte character" +msgstr "\\pset: csv_fieldsep deve ser um único caractere de um byte" -#: command.c:2635 +#: command.c:4552 #, c-format -msgid "\\pset: allowed Unicode header line styles are single, double\n" -msgstr "\\pset: estilos de linha de cabeçalho Unicode permitidos são single, double\n" +msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" +msgstr "\\pset: csv_fieldsep não pode ser aspas, nova-linha, ou retorno-de-carro" -#: command.c:2787 command.c:2966 +#: command.c:4690 command.c:4891 #, c-format -msgid "\\pset: unknown option: %s\n" -msgstr "\\pset: opção desconhecida: %s\n" +msgid "\\pset: unknown option: %s" +msgstr "\\pset: opção desconhecida: %s" -#: command.c:2805 +#: command.c:4710 #, c-format msgid "Border style is %d.\n" -msgstr "Estilo de borda é %d.\n" +msgstr "O estilo da borda é %d.\n" -#: command.c:2811 +#: command.c:4716 #, c-format msgid "Target width is unset.\n" -msgstr "Largura não está definida.\n" +msgstr "A largura do destino não está definida.\n" -#: command.c:2813 +#: command.c:4718 #, c-format msgid "Target width is %d.\n" -msgstr "Largura é %d.\n" +msgstr "A largura do destino é %d.\n" -#: command.c:2820 +#: command.c:4725 #, c-format msgid "Expanded display is on.\n" -msgstr "Exibição expandida está habilitada.\n" +msgstr "A exibição expandida está ativada.\n" -#: command.c:2822 +#: command.c:4727 #, c-format msgid "Expanded display is used automatically.\n" -msgstr "Exibição expandida é utilizada automaticamente.\n" +msgstr "A exibição expandida é usada automaticamente.\n" -#: command.c:2824 +#: command.c:4729 #, c-format msgid "Expanded display is off.\n" -msgstr "Exibição expandida está desabilitada.\n" +msgstr "A exibição expandida está desativada.\n" + +#: command.c:4736 command.c:4738 command.c:4740 +#, c-format +msgid "Expanded header width is \"%s\".\n" +msgstr "A largura do cabeçalho expandido é \"%s\".\n" + +#: command.c:4742 +#, c-format +msgid "Expanded header width is %d.\n" +msgstr "A largura do cabeçalho expandido é %d.\n" + +#: command.c:4748 +#, c-format +msgid "Field separator for CSV is \"%s\".\n" +msgstr "O separador de campos para CSV é \"%s\".\n" -#: command.c:2831 command.c:2839 +#: command.c:4756 command.c:4764 #, c-format msgid "Field separator is zero byte.\n" -msgstr "Separador de campos é byte zero.\n" +msgstr "O separador de campos é o byte zero.\n" -#: command.c:2833 +#: command.c:4758 #, c-format msgid "Field separator is \"%s\".\n" -msgstr "Separador de campos é \"%s\".\n" +msgstr "O separador de campos é \"%s\".\n" -#: command.c:2846 +#: command.c:4771 #, c-format msgid "Default footer is on.\n" -msgstr "Rodapé padrão está habilitado.\n" +msgstr "O rodapé padrão está ativado.\n" -#: command.c:2848 +#: command.c:4773 #, c-format msgid "Default footer is off.\n" -msgstr "Rodapé padrão está desabilitado.\n" +msgstr "O rodapé padrão está desativado.\n" -#: command.c:2854 +#: command.c:4779 #, c-format msgid "Output format is %s.\n" -msgstr "Formato de saída é %s.\n" +msgstr "O formato de saída é %s.\n" -#: command.c:2860 +#: command.c:4785 #, c-format msgid "Line style is %s.\n" -msgstr "Estilo de linha é %s.\n" +msgstr "O estilo da linha é %s.\n" -#: command.c:2867 +#: command.c:4792 #, c-format msgid "Null display is \"%s\".\n" -msgstr "Exibição nula é \"%s\".\n" +msgstr "A exibição de nulos é \"%s\".\n" -#: command.c:2875 +#: command.c:4800 #, c-format msgid "Locale-adjusted numeric output is on.\n" -msgstr "Formato numérico baseado no idioma está habilitado.\n" +msgstr "A saída numérica ajustada à localidade está ativada.\n" -#: command.c:2877 +#: command.c:4802 #, c-format msgid "Locale-adjusted numeric output is off.\n" -msgstr "Formato numérico baseado no idioma está desabilitado.\n" +msgstr "A saída numérica ajustada à localidade está desativada.\n" -#: command.c:2884 +#: command.c:4809 #, c-format msgid "Pager is used for long output.\n" -msgstr "Paginação é usada para saída longa.\n" +msgstr "O paginador é usado para a saída longa.\n" -#: command.c:2886 +#: command.c:4811 #, c-format msgid "Pager is always used.\n" -msgstr "Paginação é sempre utilizada.\n" +msgstr "O paginador é sempre usado.\n" -#: command.c:2888 +#: command.c:4813 #, c-format msgid "Pager usage is off.\n" -msgstr "Uso de paginação está desabilitado.\n" +msgstr "O uso do paginador está desativado.\n" -#: command.c:2894 +#: command.c:4819 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" -msgstr[0] "Paginação não será utilizada para menos do que %d linha.\n" -msgstr[1] "Paginação não será utilizada para menos do que %d linhas.\n" +msgstr[0] "O paginador não será usado para menos do que %d linha.\n" +msgstr[1] "O paginador não será usado para menos do que %d linhas.\n" -#: command.c:2904 command.c:2914 +#: command.c:4829 command.c:4839 #, c-format msgid "Record separator is zero byte.\n" -msgstr "Separador de registros é byte zero.\n" +msgstr "O separador de registros é o byte zero.\n" -#: command.c:2906 +#: command.c:4831 #, c-format msgid "Record separator is .\n" -msgstr "Separador de registros é .\n" +msgstr "O separador de registros é a .\n" -#: command.c:2908 +#: command.c:4833 #, c-format msgid "Record separator is \"%s\".\n" -msgstr "Separador de registros é \"%s\".\n" +msgstr "O separador de registros é \"%s\".\n" -#: command.c:2921 +#: command.c:4846 #, c-format msgid "Table attributes are \"%s\".\n" -msgstr "Atributos de tabela são \"%s\".\n" +msgstr "Os atributos de tabela são \"%s\".\n" -#: command.c:2924 +#: command.c:4849 #, c-format msgid "Table attributes unset.\n" -msgstr "Atributos de tabela não estão definidos.\n" +msgstr "Os atributos de tabela não estão definidos.\n" -#: command.c:2931 +#: command.c:4856 #, c-format msgid "Title is \"%s\".\n" -msgstr "Título é \"%s\".\n" +msgstr "O título é \"%s\".\n" -#: command.c:2933 +#: command.c:4858 #, c-format msgid "Title is unset.\n" -msgstr "Título não está definido.\n" +msgstr "O título não está definido.\n" -#: command.c:2940 +#: command.c:4865 #, c-format msgid "Tuples only is on.\n" -msgstr "Somente tuplas está habilitado.\n" +msgstr "Somente-tuplas está ativado.\n" -#: command.c:2942 +#: command.c:4867 #, c-format msgid "Tuples only is off.\n" -msgstr "Somente tuplas está desabilitado.\n" +msgstr "Somente-tuplas está desativado.\n" -#: command.c:2948 +#: command.c:4873 #, c-format msgid "Unicode border line style is \"%s\".\n" -msgstr "Estilo de linha de borda Unicode é \"%s\".\n" +msgstr "O estilo de linha de borda Unicode é \"%s\".\n" -#: command.c:2954 +#: command.c:4879 #, c-format msgid "Unicode column line style is \"%s\".\n" -msgstr "Estilo de linha de coluna Unicode é \"%s\".\n" +msgstr "O estilo de linha de coluna Unicode é \"%s\".\n" -#: command.c:2960 +#: command.c:4885 #, c-format msgid "Unicode header line style is \"%s\".\n" -msgstr "Estilo de linha de cabeçalho Unicode é \"%s\".\n" +msgstr "O estilo de linha de cabeçalho Unicode é \"%s\".\n" + +#: command.c:5134 +#, c-format +msgid "\\!: failed" +msgstr "\\!: falhou" -#: command.c:3120 +#: command.c:5168 #, c-format -msgid "\\!: failed\n" -msgstr "\\!: falhou\n" +msgid "\\watch cannot be used with an empty query" +msgstr "\\watch não pode ser usado com uma consulta vazia" -#: command.c:3145 common.c:659 +#: command.c:5200 #, c-format -msgid "\\watch cannot be used with an empty query\n" -msgstr "\\watch não pode ser utilizado com uma consulta vazia\n" +msgid "could not set timer: %m" +msgstr "não foi possível definir a cronometragem: %m" -#: command.c:3186 +#: command.c:5269 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (cada %gs)\n" -#: command.c:3189 +#: command.c:5272 #, c-format msgid "%s (every %gs)\n" msgstr "%s (cada %gs)\n" -#: command.c:3243 command.c:3250 common.c:559 common.c:566 common.c:1173 +#: command.c:5340 +#, c-format +msgid "could not wait for signals: %m" +msgstr "não foi possível esperar por sinais: %m" + +#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083 #, c-format msgid "" "********* QUERY **********\n" @@ -644,1160 +793,1416 @@ msgstr "" "**************************\n" "\n" -#: command.c:3442 +#: command.c:5584 +#, c-format +msgid "\"%s.%s\" is not a view" +msgstr "\"%s.%s\" não é uma visão" + +#: command.c:5600 #, c-format -msgid "\"%s.%s\" is not a view\n" -msgstr "\"%s.%s\" não é uma visão\n" +msgid "could not parse reloptions array" +msgstr "não foi possível analisar a matriz reloptions" -#: command.c:3458 +#: common.c:167 #, c-format -msgid "could not parse reloptions array\n" -msgstr "não pôde validar matriz reloptions\n" +msgid "cannot escape without active connection" +msgstr "não é possível colocar escapes sem uma conexão ativa" -#: common.c:138 +#: common.c:208 #, c-format -msgid "cannot escape without active connection\n" -msgstr "não pode fazer escape sem uma conexão ativa\n" +msgid "shell command argument contains a newline or carriage return: \"%s\"" +msgstr "" +"o argumento do comando do interpretador de comandos contém uma\n" +"nova-linha ou retorno-de-carro: \"%s\"" -#: common.c:371 +#: common.c:312 #, c-format -msgid "connection to server was lost\n" -msgstr "conexão com servidor foi perdida\n" +msgid "connection to server was lost" +msgstr "a conexão com o servidor foi perdida" -#: common.c:375 +#: common.c:316 #, c-format msgid "The connection to the server was lost. Attempting reset: " -msgstr "A conexão com servidor foi perdida. Tentando reiniciar: " +msgstr "A conexão com o servidor foi perdida. Tentando redefinir: " -#: common.c:380 +#: common.c:321 #, c-format msgid "Failed.\n" msgstr "Falhou.\n" -#: common.c:387 +#: common.c:338 #, c-format msgid "Succeeded.\n" -msgstr "Sucedido.\n" +msgstr "Sucesso..\n" + +#: common.c:390 common.c:1021 +#, c-format +msgid "unexpected PQresultStatus: %d" +msgstr "um PQresultStatus não esperado: %d" -#: common.c:487 common.c:936 common.c:1108 +#: common.c:531 #, c-format -msgid "unexpected PQresultStatus: %d\n" -msgstr "PQresultStatus inesperado: %d\n" +msgid "Time: %.3f ms\n" +msgstr "Tempo: %.3f ms\n" -#: common.c:666 +#: common.c:546 #, c-format -msgid "\\watch cannot be used with COPY\n" -msgstr "\\watch não pode ser utilizado com COPY\n" +msgid "Time: %.3f ms (%02d:%06.3f)\n" +msgstr "Tempo: %.3f ms (%02d:%06.3f)\n" -#: common.c:671 +#: common.c:555 #, c-format -msgid "unexpected result status for \\watch\n" -msgstr "status de resultado inesperado para \\watch\n" +msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" +msgstr "Tempo: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:682 common.c:1335 +#: common.c:562 #, c-format -msgid "Time: %.3f ms\n" -msgstr "Tempo: %.3f ms\n" +msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" +msgstr "Tempo: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:700 +#: common.c:586 common.c:643 common.c:1054 describe.c:6214 +#, c-format +msgid "You are currently not connected to a database." +msgstr "No momento você não está conectado a um banco de dados." + +#: common.c:674 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" -msgstr "Notificação assíncrona \"%s\" com mensagem \"%s\" recebida do processo do servidor com PID %d.\n" +msgstr "" +"Notificação assíncrona \"%s\" com carga útil \"%s\"\n" +"recebida do processo servidor com PID %d.\n" -#: common.c:703 +#: common.c:677 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" -msgstr "Notificação assíncrona \"%s\" recebida do processo do servidor com PID %d.\n" +msgstr "Notificação assíncrona \"%s\" recebida do processo servidor com PID %d.\n" + +#: common.c:708 +#, c-format +msgid "could not print result table: %m" +msgstr "não foi possível imprimir a tabela de resultados: %m" -#: common.c:761 +#: common.c:728 #, c-format -msgid "no rows returned for \\gset\n" -msgstr "nenhum registro foi retornado para \\gset\n" +msgid "no rows returned for \\gset" +msgstr "nenhuma linha retornada para \\gset" -#: common.c:766 +#: common.c:733 #, c-format -msgid "more than one row returned for \\gset\n" -msgstr "mais de um registro foi retornado para \\gset\n" +msgid "more than one row returned for \\gset" +msgstr "mais de uma linha retornada para \\gset" -#: common.c:792 +#: common.c:751 #, c-format -msgid "could not set variable \"%s\"\n" -msgstr "não pôde definir variável \"%s\"\n" +msgid "attempt to \\gset into specially treated variable \"%s\" ignored" +msgstr "ignorada a tentativa de usar \\gset na variável tratada especialmente \"%s\"" -#: common.c:1153 +#: common.c:1063 #, c-format msgid "" "***(Single step mode: verify command)*******************************************\n" "%s\n" "***(press return to proceed or enter x and return to cancel)********************\n" msgstr "" -"***(Modo passo-a-passo: verifique o comando)*******************************************\n" +"***(Modo de passo único: verifique o comando)***********************************\n" "%s\n" -"***(pressione Enter para prosseguir ou digite x e Enter para cancelar)********************\n" +"***(pressione Enter para prosseguir, ou digite x e Enter para cancelar)*********\n" -#: common.c:1208 +#: common.c:1146 #, c-format -msgid "The server (version %s) does not support savepoints for ON_ERROR_ROLLBACK.\n" -msgstr "O servidor (versão %s) não suporta pontos de salvamento para ON_ERROR_ROLLBACK.\n" +msgid "STATEMENT: %s" +msgstr "INSTRUÇÃO: %s" -#: common.c:1264 +#: common.c:1182 #, c-format -msgid "STATEMENT: %s\n" -msgstr "COMANDO: %s\n" +msgid "unexpected transaction status (%d)" +msgstr "status de transação não esperado (%d)" + +#: common.c:1335 describe.c:2026 +msgid "Column" +msgstr "Coluna" -#: common.c:1307 +#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046 +#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027 +#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571 +#: describe.c:5846 +msgid "Type" +msgstr "Tipo" + +#: common.c:1385 #, c-format -msgid "unexpected transaction status (%d)\n" -msgstr "status de transação inesperado (%d)\n" +msgid "The command has no result, or the result has no columns.\n" +msgstr "O comando não tem resultado, ou o resultado não tem colunas.\n" -#: copy.c:99 +#: copy.c:98 #, c-format -msgid "\\copy: arguments required\n" -msgstr "\\copy: argumentos são requeridos\n" +msgid "\\copy: arguments required" +msgstr "\\copy: são requeridos argumentos" -#: copy.c:254 +#: copy.c:253 #, c-format -msgid "\\copy: parse error at \"%s\"\n" -msgstr "\\copy: erro de análise em \"%s\"\n" +msgid "\\copy: parse error at \"%s\"" +msgstr "\\copy: erro de análise em \"%s\"" -#: copy.c:256 +#: copy.c:255 #, c-format -msgid "\\copy: parse error at end of line\n" -msgstr "\\copy: erro de análise no fim da linha\n" +msgid "\\copy: parse error at end of line" +msgstr "\\copy: erro de análise no fim da linha" -#: copy.c:329 +#: copy.c:326 #, c-format -msgid "could not execute command \"%s\": %s\n" -msgstr "não pôde executar comando \"%s\": %s\n" +msgid "could not execute command \"%s\": %m" +msgstr "não foi possível executar comando \"%s\": %m" -#: copy.c:345 +#: copy.c:342 #, c-format -msgid "could not stat file \"%s\": %s\n" -msgstr "não pôde executar stat no arquivo \"%s\": %s\n" +msgid "could not stat file \"%s\": %m" +msgstr "não foi possível executar stat no arquivo \"%s\": %m" -#: copy.c:349 +#: copy.c:346 #, c-format -msgid "%s: cannot copy from/to a directory\n" -msgstr "%s: não pode copiar de/para o diretório\n" +msgid "%s: cannot copy from/to a directory" +msgstr "%s: não é possível copiar de/para um diretório" -#: copy.c:386 +#: copy.c:383 #, c-format -msgid "could not close pipe to external command: %s\n" -msgstr "não pôde fechar pipe para comando externo: %s\n" +msgid "could not close pipe to external command: %m" +msgstr "não foi possível fechar o pipe para comando externo: %m" -#: copy.c:452 copy.c:463 +#: copy.c:451 copy.c:461 #, c-format -msgid "could not write COPY data: %s\n" -msgstr "não pôde escrever dados utilizando COPY: %s\n" +msgid "could not write COPY data: %m" +msgstr "não foi possível escrever os dados do COPY: %m" -#: copy.c:470 +#: copy.c:467 #, c-format msgid "COPY data transfer failed: %s" -msgstr "transferência de dados utilizando COPY falhou: %s" +msgstr "transferência de dados usando o COPY falhou: %s" -#: copy.c:531 +#: copy.c:528 msgid "canceled by user" msgstr "cancelado pelo usuário" -#: copy.c:542 +#: copy.c:539 msgid "" "Enter data to be copied followed by a newline.\n" -"End with a backslash and a period on a line by itself." +"End with a backslash and a period on a line by itself, or an EOF signal." msgstr "" -"Informe os dados a serem copiados seguido pelo caracter de nova linha.\n" -"Finalize com uma barra invertida e um ponto na linha." +"Entre com os dados a serem copiados seguidos de um caractere de nova-linha.\n" +"Termine com uma contrabarra e um ponto final em uma linha isolada, ou um sinal EOF." -#: copy.c:671 +#: copy.c:683 msgid "aborted because of read failure" msgstr "interrompido devido a falha de leitura" -#: copy.c:695 +#: copy.c:717 msgid "trying to exit copy mode" msgstr "tentando sair do modo copy" -#: crosstabview.c:125 +#: crosstabview.c:123 #, c-format -msgid "\\crosstabview: statement did not return a result set\n" -msgstr "\\crosstabview: comando não retornou um conjunto de resultados\n" +msgid "\\crosstabview: statement did not return a result set" +msgstr "\\crosstabview: a instrução não retornou um conjunto de resultados" -#: crosstabview.c:131 +#: crosstabview.c:129 #, c-format -msgid "\\crosstabview: query must return at least three columns\n" -msgstr "\\crosstabview: consulta deve retornar pelo menos três colunas\n" +msgid "\\crosstabview: query must return at least three columns" +msgstr "\\crosstabview: a consulta deve retornar pelo menos três colunas" -#: crosstabview.c:158 +#: crosstabview.c:156 #, c-format -msgid "\\crosstabview: vertical and horizontal headers must be different columns\n" -msgstr "\\crosstabview: cabeçalhos vertical e horizontal devem ser colunas diferentes\n" +msgid "\\crosstabview: vertical and horizontal headers must be different columns" +msgstr "\\crosstabview: os cabeçalhos verticais e horizontais devem ser colunas diferentes" -#: crosstabview.c:174 +#: crosstabview.c:172 #, c-format -msgid "\\crosstabview: data column must be specified when query returns more than three columns\n" -msgstr "\\crosstabview: coluna de dados deve ser especificada quando consulta retornar mais de três colunas\n" +msgid "\\crosstabview: data column must be specified when query returns more than three columns" +msgstr "" +"\\crosstabview: quando a consulta retornar mais de três colunas,\n" +"a coluna de dados deve ser especificada" -#: crosstabview.c:230 +#: crosstabview.c:228 #, c-format -msgid "\\crosstabview: maximum number of columns (%d) exceeded\n" -msgstr "\\crosstabview: número máximo de colunas (%d) foi alcançado\n" +msgid "\\crosstabview: maximum number of columns (%d) exceeded" +msgstr "\\crosstabview: número máximo de colunas (%d) excedido" -#: crosstabview.c:398 +#: crosstabview.c:397 #, c-format -msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"\n" -msgstr "\\crosstabview: resultado da consulta contém múltiplos valores de dados para registro \"%s\", coluna \"%s\"\n" +msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" +msgstr "\\crosstabview: o resultado da consulta contém vários valores de dados para a linha \"%s\", coluna \"%s\"" -#: crosstabview.c:646 +#: crosstabview.c:645 #, c-format -msgid "\\crosstabview: column number %d is out of range 1..%d\n" -msgstr "\\crosstabview: coluna número %d está fora do intervalo 1..%d\n" +msgid "\\crosstabview: column number %d is out of range 1..%d" +msgstr "\\crosstabview: o número da coluna (%d) está fora do intervalo 1..%d" -#: crosstabview.c:671 +#: crosstabview.c:670 #, c-format -msgid "\\crosstabview: ambiguous column name: \"%s\"\n" -msgstr "\\crosstabview: nome de coluna ambíguo: \"%s\"\n" +msgid "\\crosstabview: ambiguous column name: \"%s\"" +msgstr "\\crosstabview: nome de coluna ambíguo: \"%s\"" -#: crosstabview.c:679 +#: crosstabview.c:678 #, c-format -msgid "\\crosstabview: column name not found: \"%s\"\n" -msgstr "\\crosstabview: nome de coluna não foi encontrado: \"%s\"\n" +msgid "\\crosstabview: column name not found: \"%s\"" +msgstr "\\crosstabview: nome da coluna não encontrado: \"%s\"" -#: describe.c:71 describe.c:340 describe.c:597 describe.c:727 describe.c:870 -#: describe.c:990 describe.c:1060 describe.c:3035 describe.c:3240 -#: describe.c:3330 describe.c:3578 describe.c:3718 describe.c:3950 -#: describe.c:4025 describe.c:4036 describe.c:4098 describe.c:4518 -#: describe.c:4601 +#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038 +#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157 +#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932 +#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499 +#: describe.c:5556 describe.c:5960 describe.c:6038 msgid "Schema" msgstr "Esquema" -#: describe.c:72 describe.c:160 describe.c:226 describe.c:234 describe.c:341 -#: describe.c:598 describe.c:728 describe.c:789 describe.c:871 describe.c:1061 -#: describe.c:3036 describe.c:3162 describe.c:3241 describe.c:3331 -#: describe.c:3410 describe.c:3579 describe.c:3643 describe.c:3719 -#: describe.c:3951 describe.c:4026 describe.c:4037 describe.c:4099 -#: describe.c:4291 describe.c:4375 describe.c:4599 +#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631 +#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265 +#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408 +#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933 +#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489 +#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827 +#: describe.c:6036 describe.c:6265 describe.c:6573 msgid "Name" msgstr "Nome" -#: describe.c:73 describe.c:353 describe.c:399 describe.c:416 +#: describe.c:89 describe.c:351 describe.c:369 msgid "Result data type" -msgstr "Tipo de dado do resultado" +msgstr "Tipo de dados do resultado" -#: describe.c:81 describe.c:94 describe.c:98 describe.c:354 describe.c:400 -#: describe.c:417 +#: describe.c:90 describe.c:352 describe.c:370 msgid "Argument data types" -msgstr "Tipos de dado do argumento" - -#: describe.c:105 describe.c:170 describe.c:257 describe.c:462 describe.c:646 -#: describe.c:743 describe.c:814 describe.c:1063 describe.c:1676 -#: describe.c:2836 describe.c:3069 describe.c:3193 describe.c:3267 -#: describe.c:3340 describe.c:3423 describe.c:3491 describe.c:3586 -#: describe.c:3652 describe.c:3720 describe.c:3856 describe.c:3896 -#: describe.c:3967 describe.c:4029 describe.c:4038 describe.c:4100 -#: describe.c:4317 describe.c:4397 describe.c:4532 describe.c:4602 -#: large_obj.c:289 large_obj.c:299 +msgstr "Tipo de dados dos argumentos" + +#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418 +#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047 +#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347 +#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844 +#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327 +#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501 +#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974 +#: describe.c:6039 describe.c:7093 msgid "Description" msgstr "Descrição" -#: describe.c:123 +#: describe.c:128 msgid "List of aggregate functions" -msgstr "Lista das funções de agregação" +msgstr "Lista de funções de agregação" -#: describe.c:147 +#: describe.c:153 #, c-format -msgid "The server (version %s) does not support access methods.\n" -msgstr "O servidor (versão %s) não suporta métodos de acesso.\n" +msgid "The server (version %s) does not support access methods." +msgstr "O servidor (versão %s) não oferece suporte a métodos de acesso." -#: describe.c:161 +#: describe.c:168 msgid "Index" msgstr "Ãndice" -#: describe.c:162 describe.c:360 describe.c:405 describe.c:422 describe.c:877 -#: describe.c:999 describe.c:1645 describe.c:3044 describe.c:3242 -#: describe.c:4394 -msgid "Type" -msgstr "Tipo" +#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961 +msgid "Table" +msgstr "Tabela" -#: describe.c:169 describe.c:4296 +#: describe.c:177 describe.c:5758 msgid "Handler" -msgstr "Manipulador" +msgstr "Tratador" -#: describe.c:188 +#: describe.c:201 msgid "List of access methods" msgstr "Lista de métodos de acesso" -#: describe.c:213 -#, c-format -msgid "The server (version %s) does not support tablespaces.\n" -msgstr "O servidor (versão %s) não suporta tablespaces.\n" - -#: describe.c:227 describe.c:235 describe.c:450 describe.c:636 describe.c:790 -#: describe.c:989 describe.c:3045 describe.c:3166 describe.c:3412 -#: describe.c:3644 describe.c:4292 describe.c:4376 large_obj.c:288 +#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188 +#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655 +#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266 +#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819 +#: describe.c:7081 msgid "Owner" msgstr "Dono" -#: describe.c:228 describe.c:236 +#: describe.c:231 msgid "Location" -msgstr "Local" +msgstr "Localização" -#: describe.c:247 describe.c:2647 +#: describe.c:241 describe.c:3517 describe.c:3858 msgid "Options" msgstr "Opções" -#: describe.c:252 describe.c:609 describe.c:806 describe.c:3061 -#: describe.c:3065 +#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001 msgid "Size" msgstr "Tamanho" -#: describe.c:274 +#: describe.c:266 msgid "List of tablespaces" -msgstr "Lista das tablespaces" +msgstr "Lista dos espaços de tabelas" -#: describe.c:314 +#: describe.c:311 #, c-format -msgid "\\df only takes [antwS+] as options\n" -msgstr "\\df só possui as opções [antwS+]\n" +msgid "\\df only takes [anptwS+] as options" +msgstr "\\df só aceita [anptwS+] como opções" -#: describe.c:322 +#: describe.c:319 #, c-format -msgid "\\df does not take a \"w\" option with server version %s\n" -msgstr "\\df não possui a opção \"w\" em um servidor na versão %s.\n" +msgid "\\df does not take a \"%c\" option with server version %s" +msgstr "\\df não aceita a opção \"%c\" com o servidor versão %s" #. translator: "agg" is short for "aggregate" -#: describe.c:356 describe.c:402 describe.c:419 +#: describe.c:354 describe.c:372 msgid "agg" -msgstr "agr" +msgstr "agg" -#: describe.c:357 +#: describe.c:355 describe.c:373 msgid "window" -msgstr "deslizante" +msgstr "window" + +#: describe.c:356 +msgid "proc" +msgstr "proc" + +#: describe.c:357 describe.c:375 +msgid "func" +msgstr "func" -#: describe.c:358 describe.c:403 describe.c:420 describe.c:1197 +#: describe.c:374 describe.c:1397 msgid "trigger" msgstr "gatilho" -#: describe.c:359 describe.c:404 describe.c:421 -msgid "normal" -msgstr "normal" - -#: describe.c:432 +#: describe.c:386 msgid "immutable" msgstr "imutável" -#: describe.c:433 +#: describe.c:387 msgid "stable" msgstr "estável" -#: describe.c:434 +#: describe.c:388 msgid "volatile" msgstr "volátil" -#: describe.c:435 +#: describe.c:389 msgid "Volatility" msgstr "Volatilidade" -#: describe.c:443 +#: describe.c:397 msgid "restricted" msgstr "restrito" -#: describe.c:444 +#: describe.c:398 msgid "safe" msgstr "seguro" -#: describe.c:445 +#: describe.c:399 msgid "unsafe" msgstr "inseguro" -#: describe.c:446 +#: describe.c:400 msgid "Parallel" -msgstr "Paralelismo" +msgstr "Paralelo" -#: describe.c:451 +#: describe.c:405 msgid "definer" msgstr "definidor" -#: describe.c:452 +#: describe.c:406 msgid "invoker" -msgstr "invocador" +msgstr "chamador" -#: describe.c:453 +#: describe.c:407 msgid "Security" msgstr "Segurança" -#: describe.c:460 +#: describe.c:412 msgid "Language" msgstr "Linguagem" -#: describe.c:461 -msgid "Source code" -msgstr "Código fonte" +#: describe.c:415 describe.c:652 +msgid "Internal name" +msgstr "Nome interno" -#: describe.c:560 +#: describe.c:589 msgid "List of functions" msgstr "Lista de funções" -#: describe.c:608 -msgid "Internal name" -msgstr "Nome interno" - -#: describe.c:630 +#: describe.c:654 msgid "Elements" msgstr "Elementos" -#: describe.c:686 +#: describe.c:706 msgid "List of data types" -msgstr "Lista de tipos de dado" +msgstr "Lista de tipos de dados" -#: describe.c:729 +#: describe.c:809 msgid "Left arg type" -msgstr "Tipo de argumento à esquerda" +msgstr "Tipo de dados do argumento à esquerda" -#: describe.c:730 +#: describe.c:810 msgid "Right arg type" -msgstr "Tipo de argumento à direita" +msgstr "Tipo de dados do argumento à direita" -#: describe.c:731 +#: describe.c:811 msgid "Result type" -msgstr "Tipo resultante" +msgstr "Tipo de dados resultante" -#: describe.c:736 describe.c:3482 describe.c:3855 +#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326 +#: describe.c:7010 describe.c:7014 msgid "Function" msgstr "Função" -#: describe.c:761 +#: describe.c:897 msgid "List of operators" msgstr "Lista de operadores" -#: describe.c:791 +#: describe.c:932 msgid "Encoding" msgstr "Codificação" -#: describe.c:796 describe.c:3580 +#: describe.c:936 describe.c:940 +msgid "Locale Provider" +msgstr "Provedor de localidade" + +#: describe.c:944 describe.c:4947 msgid "Collate" -msgstr "Collate" +msgstr "Ordenação" -#: describe.c:797 describe.c:3581 +#: describe.c:945 describe.c:4948 msgid "Ctype" msgstr "Ctype" -#: describe.c:810 +#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957 +msgid "ICU Locale" +msgstr "Localidade ICU" + +#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966 +msgid "ICU Rules" +msgstr "Regras ICU" + +#: describe.c:973 msgid "Tablespace" -msgstr "Tablespace" +msgstr "Espaço de tabelas" -#: describe.c:832 +#: describe.c:999 msgid "List of databases" -msgstr "Lista dos bancos de dados" +msgstr "Lista de bancos de dados" -#: describe.c:872 describe.c:992 describe.c:3037 +#: describe.c:1040 describe.c:1191 describe.c:3949 msgid "table" msgstr "tabela" -#: describe.c:873 describe.c:3038 +#: describe.c:1041 describe.c:3950 msgid "view" msgstr "visão" -#: describe.c:874 describe.c:3039 +#: describe.c:1042 describe.c:3951 msgid "materialized view" msgstr "visão materializada" -#: describe.c:875 describe.c:994 describe.c:3041 +#: describe.c:1043 describe.c:1193 describe.c:3953 msgid "sequence" msgstr "sequência" -#: describe.c:876 describe.c:3043 +#: describe.c:1044 describe.c:3955 msgid "foreign table" -msgstr "tabela externa" +msgstr "tabela estrangeira" + +#: describe.c:1045 describe.c:3956 describe.c:4168 +msgid "partitioned table" +msgstr "tabela particionada" -#: describe.c:888 +#: describe.c:1056 msgid "Column privileges" msgstr "Privilégios de coluna" -#: describe.c:919 +#: describe.c:1087 describe.c:1121 msgid "Policies" msgstr "Políticas" -#: describe.c:945 describe.c:4749 describe.c:4753 +#: describe.c:1150 describe.c:4577 describe.c:6678 msgid "Access privileges" msgstr "Privilégios de acesso" -#: describe.c:976 -#, c-format -msgid "The server (version %s) does not support altering default privileges.\n" -msgstr "O servidor (versão %s) não suporta alteração de privilégios padrão.\n" - -#: describe.c:996 +#: describe.c:1195 msgid "function" msgstr "função" -#: describe.c:998 +#: describe.c:1197 msgid "type" msgstr "tipo" -#: describe.c:1022 +#: describe.c:1199 +msgid "schema" +msgstr "esquema" + +#: describe.c:1222 msgid "Default access privileges" msgstr "Privilégios de acesso padrão" -#: describe.c:1062 +#: describe.c:1266 msgid "Object" msgstr "Objeto" -#: describe.c:1076 +#: describe.c:1280 msgid "table constraint" msgstr "restrição de tabela" -#: describe.c:1098 +#: describe.c:1304 msgid "domain constraint" msgstr "restrição de domínio" -#: describe.c:1126 +#: describe.c:1328 msgid "operator class" -msgstr "classe de operadores" +msgstr "classe de operador" -#: describe.c:1155 +#: describe.c:1352 msgid "operator family" -msgstr "família de operadores" +msgstr "família de operador" -#: describe.c:1177 +#: describe.c:1375 msgid "rule" msgstr "regra" -#: describe.c:1219 +#: describe.c:1421 msgid "Object descriptions" -msgstr "Descrições dos Objetos" +msgstr "Descrições de objeto" + +#: describe.c:1486 describe.c:4074 +#, c-format +msgid "Did not find any relation named \"%s\"." +msgstr "Não foi encontrada nenhuma relação chamada \"%s\"." + +#: describe.c:1489 describe.c:4077 +#, c-format +msgid "Did not find any relations." +msgstr "Não foi encontrada nenhuma relação." + +#: describe.c:1685 +#, c-format +msgid "Did not find any relation with OID %s." +msgstr "Não foi encontrada nenhuma relação com OID %s." + +#: describe.c:1733 describe.c:1757 +msgid "Start" +msgstr "Início" + +#: describe.c:1734 describe.c:1758 +msgid "Minimum" +msgstr "Mínimo" + +#: describe.c:1735 describe.c:1759 +msgid "Maximum" +msgstr "Máximo" + +#: describe.c:1736 describe.c:1760 +msgid "Increment" +msgstr "Incremento" + +#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493 +#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721 +msgid "yes" +msgstr "sim" + +#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493 +#: describe.c:4835 describe.c:4971 describe.c:6722 +msgid "no" +msgstr "não" + +#: describe.c:1739 describe.c:1763 +msgid "Cycles?" +msgstr "Ciclos?" -#: describe.c:1273 +#: describe.c:1740 describe.c:1764 +msgid "Cache" +msgstr "Cache" + +#: describe.c:1805 +#, c-format +msgid "Owned by: %s" +msgstr "Pertencente a: %s" + +#: describe.c:1809 #, c-format -msgid "Did not find any relation named \"%s\".\n" -msgstr "Não encontrou nenhuma relação chamada \"%s\".\n" +msgid "Sequence for identity column: %s" +msgstr "Sequência para coluna de identidade: %s" -#: describe.c:1483 +#: describe.c:1817 #, c-format -msgid "Did not find any relation with OID %s.\n" -msgstr "Não encontrou nenhuma relação com OID %s.\n" +msgid "Unlogged sequence \"%s.%s\"" +msgstr "Sequência não rastreada (sem log) \"%s.%s\"" + +#: describe.c:1820 +#, c-format +msgid "Sequence \"%s.%s\"" +msgstr "Sequência \"%s.%s\"" -#: describe.c:1589 +#: describe.c:1963 #, c-format msgid "Unlogged table \"%s.%s\"" -msgstr "Tabela unlogged \"%s.%s\"" +msgstr "Tabela não rastreada (sem log) \"%s.%s\"" -#: describe.c:1592 +#: describe.c:1966 #, c-format msgid "Table \"%s.%s\"" msgstr "Tabela \"%s.%s\"" -#: describe.c:1596 +#: describe.c:1970 #, c-format msgid "View \"%s.%s\"" msgstr "Visão \"%s.%s\"" -#: describe.c:1601 +#: describe.c:1975 #, c-format msgid "Unlogged materialized view \"%s.%s\"" -msgstr "Visão materializada unlogged \"%s.%s\"" +msgstr "Visão materializada não rastreada (sem log) \"%s.%s\"" -#: describe.c:1604 +#: describe.c:1978 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Visão materializada \"%s.%s\"" -#: describe.c:1608 -#, c-format -msgid "Sequence \"%s.%s\"" -msgstr "Sequência \"%s.%s\"" - -#: describe.c:1613 +#: describe.c:1983 #, c-format msgid "Unlogged index \"%s.%s\"" -msgstr "Ãndice unlogged \"%s.%s\"" +msgstr "Ãndice não rastreado (sem log) \"%s.%s\"" -#: describe.c:1616 +#: describe.c:1986 #, c-format msgid "Index \"%s.%s\"" msgstr "Ãndice \"%s.%s\"" -#: describe.c:1621 +#: describe.c:1991 #, c-format -msgid "Special relation \"%s.%s\"" -msgstr "Relação especial \"%s.%s\"" +msgid "Unlogged partitioned index \"%s.%s\"" +msgstr "Ãndice particionado não rastreado (sem log) \"%s.%s\"" -#: describe.c:1625 +#: describe.c:1994 +#, c-format +msgid "Partitioned index \"%s.%s\"" +msgstr "Ãndice particionado \"%s.%s\"" + +#: describe.c:1998 #, c-format msgid "TOAST table \"%s.%s\"" -msgstr "tabela TOAST \"%s.%s\"" +msgstr "Tabela TOAST \"%s.%s\"" -#: describe.c:1629 +#: describe.c:2002 #, c-format msgid "Composite type \"%s.%s\"" -msgstr "Tipo composto \"%s.%s\"" +msgstr "Tipo de dados composto \"%s.%s\"" -#: describe.c:1633 +#: describe.c:2006 #, c-format msgid "Foreign table \"%s.%s\"" -msgstr "Tabela externa \"%s.%s\"" +msgstr "Tabela estrangeira \"%s.%s\"" -#: describe.c:1644 -msgid "Column" -msgstr "Coluna" +#: describe.c:2011 +#, c-format +msgid "Unlogged partitioned table \"%s.%s\"" +msgstr "Tabela particionada não rastreada (sem log) \"%s.%s\"" -#: describe.c:1653 -msgid "Modifiers" -msgstr "Modificadores" +#: describe.c:2014 +#, c-format +msgid "Partitioned table \"%s.%s\"" +msgstr "Tabela particionada \"%s.%s\"" -#: describe.c:1658 -msgid "Value" -msgstr "Valor" +#: describe.c:2030 describe.c:4410 +msgid "Collation" +msgstr "Ordenação" -#: describe.c:1661 +#: describe.c:2031 describe.c:4411 +msgid "Nullable" +msgstr "Pode ser nulo" + +#: describe.c:2032 describe.c:4412 +msgid "Default" +msgstr "Padrão" + +#: describe.c:2035 +msgid "Key?" +msgstr "Chave?" + +#: describe.c:2037 describe.c:4732 describe.c:4743 msgid "Definition" msgstr "Definição" -#: describe.c:1664 describe.c:4312 describe.c:4396 describe.c:4467 -#: describe.c:4531 -msgid "FDW Options" +#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914 +#: describe.c:5973 +msgid "FDW options" msgstr "Opções FDW" -#: describe.c:1668 +#: describe.c:2041 msgid "Storage" msgstr "Armazenamento" -#: describe.c:1671 +#: describe.c:2043 +msgid "Compression" +msgstr "Compressão" + +#: describe.c:2045 msgid "Stats target" -msgstr "Estatísticas" +msgstr "Meta de estatísticas" -#: describe.c:1721 +#: describe.c:2181 #, c-format -msgid "collate %s" -msgstr "collate %s" +msgid "Partition of: %s %s%s" +msgstr "Partição de: %s %s%s" -#: describe.c:1729 -msgid "not null" -msgstr "não nulo" +#: describe.c:2194 +msgid "No partition constraint" +msgstr "Sem restrição de partição" -#. translator: default values of column definitions -#: describe.c:1739 +#: describe.c:2196 #, c-format -msgid "default %s" -msgstr "valor padrão de %s" +msgid "Partition constraint: %s" +msgstr "Restrição de partição: %s" -#: describe.c:1854 +#: describe.c:2220 +#, c-format +msgid "Partition key: %s" +msgstr "Chave de partição: %s" + +#: describe.c:2246 +#, c-format +msgid "Owning table: \"%s.%s\"" +msgstr "Tabela dona: \"%s.%s\"" + +#: describe.c:2315 msgid "primary key, " msgstr "chave primária, " -#: describe.c:1856 -msgid "unique, " -msgstr "unicidade, " +#: describe.c:2318 +msgid "unique" +msgstr "unicidade" -#: describe.c:1862 +#: describe.c:2320 +msgid " nulls not distinct" +msgstr " nulos não distintos" + +#: describe.c:2321 +msgid ", " +msgstr ", " + +#: describe.c:2328 #, c-format msgid "for table \"%s.%s\"" -msgstr "para tabela \"%s.%s\"" +msgstr "para a tabela \"%s.%s\"" -#: describe.c:1866 +#: describe.c:2332 #, c-format msgid ", predicate (%s)" msgstr ", predicado (%s)" -#: describe.c:1869 +#: describe.c:2335 msgid ", clustered" -msgstr ", agrupada" +msgstr ", agrupado" -#: describe.c:1872 +#: describe.c:2338 msgid ", invalid" msgstr ", inválido" -#: describe.c:1875 +#: describe.c:2341 msgid ", deferrable" msgstr ", postergável" -#: describe.c:1878 +#: describe.c:2344 msgid ", initially deferred" -msgstr ", inicialmente postergada" +msgstr ", inicialmente postergado" -#: describe.c:1881 +#: describe.c:2347 msgid ", replica identity" msgstr ", identidade da réplica" -#: describe.c:1916 -#, c-format -msgid "Owned by: %s" -msgstr "Dono: %s" - -#: describe.c:1976 +#: describe.c:2401 msgid "Indexes:" msgstr "Ãndices:" -#: describe.c:2060 +#: describe.c:2484 msgid "Check constraints:" msgstr "Restrições de verificação:" -#: describe.c:2091 +#: describe.c:2552 msgid "Foreign-key constraints:" msgstr "Restrições de chave estrangeira:" -#: describe.c:2122 +#: describe.c:2615 msgid "Referenced by:" msgstr "Referenciada por:" -#: describe.c:2167 +#: describe.c:2665 msgid "Policies:" msgstr "Políticas:" -#: describe.c:2170 +#: describe.c:2668 msgid "Policies (forced row security enabled):" -msgstr "Políticas (segurança de registros forçada está habilitada):" +msgstr "Políticas (segurança de linha forçada ativada):" -#: describe.c:2173 +#: describe.c:2671 msgid "Policies (row security enabled): (none)" -msgstr "Políticas (segurança de registros está habilitada): (nenhum)" +msgstr "Políticas (segurança de linha ativada): (nenhuma)" -#: describe.c:2176 +#: describe.c:2674 msgid "Policies (forced row security enabled): (none)" -msgstr "Políticas (segurança de registros forçada está habilitada): (nenhum)" +msgstr "Políticas (segurança de linha forçada ativada): (nenhuma)" -#: describe.c:2179 +#: describe.c:2677 msgid "Policies (row security disabled):" -msgstr "Políticas (segurança de registros está desabilitada):" +msgstr "Políticas (segurança de linha desativada):" + +#: describe.c:2737 describe.c:2841 +msgid "Statistics objects:" +msgstr "Objetos de estatísticas:" -#: describe.c:2279 describe.c:2329 +#: describe.c:2943 describe.c:3096 msgid "Rules:" msgstr "Regras:" -#: describe.c:2282 +#: describe.c:2946 msgid "Disabled rules:" -msgstr "Regras desabilitadas:" +msgstr "Regras desativadas:" -#: describe.c:2285 +#: describe.c:2949 msgid "Rules firing always:" -msgstr "Regras sempre disparadas:" +msgstr "Regras disparando sempre:" -#: describe.c:2288 +#: describe.c:2952 msgid "Rules firing on replica only:" -msgstr "Regras somente disparadas na réplica:" +msgstr "Regras disparando somente na réplica:" -#: describe.c:2312 +#: describe.c:3031 describe.c:5109 +msgid "Publications:" +msgstr "Publicações:" + +#: describe.c:3079 msgid "View definition:" msgstr "Definição da visão:" -#: describe.c:2447 +#: describe.c:3242 msgid "Triggers:" msgstr "Gatilhos:" -#: describe.c:2451 +#: describe.c:3245 msgid "Disabled user triggers:" -msgstr "Gatilhos de usuário desabilitados:" - -#: describe.c:2453 -msgid "Disabled triggers:" -msgstr "Gatilhos desabilitados:" +msgstr "Gatilhos de usuário desativados:" -#: describe.c:2456 +#: describe.c:3248 msgid "Disabled internal triggers:" -msgstr "Gatilhos internos desabilitados:" +msgstr "Gatilhos internos desativados:" -#: describe.c:2459 +#: describe.c:3251 msgid "Triggers firing always:" -msgstr "Gatilhos sempre disparados:" +msgstr "Gatilhos disparando sempre:" -#: describe.c:2462 +#: describe.c:3254 msgid "Triggers firing on replica only:" -msgstr "Gatilhos disparados somente na réplica:" +msgstr "Gatilhos disparando somente na réplica:" + +#: describe.c:3325 +#, c-format +msgid "Server: %s" +msgstr "Servidor: %s" + +#: describe.c:3333 +#, c-format +msgid "FDW options: (%s)" +msgstr "Opções FDW: (%s)" -#: describe.c:2541 +#: describe.c:3354 msgid "Inherits" -msgstr "Heranças" +msgstr "Herda de" + +#: describe.c:3419 +#, c-format +msgid "Number of partitions: %d" +msgstr "Número de partições: %d" -#: describe.c:2580 +#: describe.c:3428 +#, c-format +msgid "Number of partitions: %d (Use \\d+ to list them.)" +msgstr "Número de partições: %d (Use \\d+ para listá-las.)" + +#: describe.c:3430 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" -msgstr "Número de tabelas descendentes: %d (Utilize \\d+ para listá-las.)" +msgstr "Número de tabelas filhas: %d (Use \\d+ para listá-las.)" -#: describe.c:2587 +#: describe.c:3437 msgid "Child tables" -msgstr "Tabelas descendentes" +msgstr "Tabelas filhas" -#: describe.c:2609 +#: describe.c:3437 +msgid "Partitions" +msgstr "Partições" + +#: describe.c:3470 #, c-format msgid "Typed table of type: %s" -msgstr "Tabela protótipo de tipo: %s" +msgstr "Tabela tipada do tipo: %s" -#: describe.c:2623 +#: describe.c:3486 msgid "Replica Identity" -msgstr "Identidade da Réplica" +msgstr "Identidade da réplica" -#: describe.c:2636 +#: describe.c:3499 msgid "Has OIDs: yes" msgstr "Têm OIDs: sim" -#: describe.c:2724 +#: describe.c:3508 +#, c-format +msgid "Access method: %s" +msgstr "Método de acesso: %s" + +#: describe.c:3585 #, c-format msgid "Tablespace: \"%s\"" -msgstr "Tablespace: \"%s\"" +msgstr "Espaço de tabelas: \"%s\"" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:2736 +#: describe.c:3597 #, c-format msgid ", tablespace \"%s\"" -msgstr ", tablespace \"%s\"" +msgstr ", espaço de tabelas \"%s\"" -#: describe.c:2829 +#: describe.c:3670 msgid "List of roles" -msgstr "Lista de roles" +msgstr "Lista de funções de banco de dados (roles)" -#: describe.c:2831 +#: describe.c:3672 describe.c:3841 msgid "Role name" -msgstr "Nome da role" +msgstr "Nome da função de banco de dados (role)" -#: describe.c:2832 +#: describe.c:3673 msgid "Attributes" msgstr "Atributos" -#: describe.c:2833 -msgid "Member of" -msgstr "Membro de" - -#: describe.c:2844 +#: describe.c:3684 msgid "Superuser" -msgstr "Super-usuário" +msgstr "Superusuário" -#: describe.c:2847 +#: describe.c:3687 msgid "No inheritance" -msgstr "Nenhuma herança" +msgstr "Sem herança" -#: describe.c:2850 +#: describe.c:3690 msgid "Create role" -msgstr "Cria role" +msgstr "Cria função de banco de dados (role)" -#: describe.c:2853 +#: describe.c:3693 msgid "Create DB" -msgstr "Cria BD" +msgstr "Cria banco de dados" -#: describe.c:2856 +#: describe.c:3696 msgid "Cannot login" -msgstr "Não pode efetuar login" +msgstr "Não é possível conectar" -#: describe.c:2860 +#: describe.c:3699 msgid "Replication" msgstr "Replicação" -#: describe.c:2864 +#: describe.c:3703 msgid "Bypass RLS" -msgstr "Ignora RLS" +msgstr "Contornar RLS" -#: describe.c:2873 +#: describe.c:3712 msgid "No connections" -msgstr "Nenhuma conexão" +msgstr "Sem conexão" -#: describe.c:2875 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d conexão" msgstr[1] "%d conexões" -#: describe.c:2885 +#: describe.c:3724 msgid "Password valid until " msgstr "Senha valida até " -#: describe.c:2941 +#: describe.c:3775 msgid "Role" -msgstr "Role" +msgstr "Função de banco de dados (role)" -#: describe.c:2942 +#: describe.c:3776 msgid "Database" -msgstr "Banco de Dados" +msgstr "Banco de dados" -#: describe.c:2943 +#: describe.c:3777 msgid "Settings" msgstr "Definições" -#: describe.c:2953 +#: describe.c:3801 #, c-format -msgid "No per-database role settings support in this server version.\n" -msgstr "Nenhum suporte a configurações de roles por banco de dados nesta versão do servidor.\n" +msgid "Did not find any settings for role \"%s\" and database \"%s\"." +msgstr "" +"Nenhuma configuração para a função de banco de dados (role) \"%s\"\n" +"e banco de dados \"%s\" foi encontrada." -#: describe.c:2964 +#: describe.c:3804 #, c-format -msgid "No matching settings found.\n" -msgstr "Nenhuma configuração correspondente foi encontrada.\n" +msgid "Did not find any settings for role \"%s\"." +msgstr "Nenhuma configuração para a função de banco de dados (role) \"%s\" foi encontrada." -#: describe.c:2966 +#: describe.c:3807 #, c-format -msgid "No settings found.\n" -msgstr "Nenhuma configuração foi encontrada.\n" +msgid "Did not find any settings." +msgstr "Nenhuma configuração foi encontrada." -#: describe.c:2971 +#: describe.c:3812 msgid "List of settings" -msgstr "Lista de configurações" +msgstr "Lista de definições" + +#: describe.c:3842 +msgid "Member of" +msgstr "Membro de" + +#: describe.c:3859 +msgid "Grantor" +msgstr "Concedente" -#: describe.c:3040 +#: describe.c:3886 +msgid "List of role grants" +msgstr "Lista de concessões de funções de banco de dados (roles)" + +#: describe.c:3952 msgid "index" msgstr "índice" -#: describe.c:3042 -msgid "special" -msgstr "especial" +#: describe.c:3954 +msgid "TOAST table" +msgstr "Tabela TOAST" -#: describe.c:3050 describe.c:4519 -msgid "Table" -msgstr "Tabela" +#: describe.c:3957 describe.c:4169 +msgid "partitioned index" +msgstr "índice particionado" -#: describe.c:3126 -#, c-format -msgid "No matching relations found.\n" -msgstr "Nenhuma relação correspondente foi encontrada.\n" +#: describe.c:3977 +msgid "permanent" +msgstr "permanente" -#: describe.c:3128 -#, c-format -msgid "No relations found.\n" -msgstr "Nenhuma relação foi encontrada.\n" +#: describe.c:3978 +msgid "temporary" +msgstr "temporário" + +#: describe.c:3979 +msgid "unlogged" +msgstr "sem registro de transações (unlogged)" -#: describe.c:3133 +#: describe.c:3980 +msgid "Persistence" +msgstr "Persistência" + +#: describe.c:3996 +msgid "Access method" +msgstr "Método de acesso" + +#: describe.c:4082 msgid "List of relations" msgstr "Lista de relações" -#: describe.c:3170 +#: describe.c:4130 +#, c-format +msgid "The server (version %s) does not support declarative table partitioning." +msgstr "O servidor (versão %s) não oferece suporte a particionamento de tabela declarativo." + +#: describe.c:4141 +msgid "List of partitioned indexes" +msgstr "Lista de índices particionados" + +#: describe.c:4143 +msgid "List of partitioned tables" +msgstr "Lista de tabelas particionadas" + +#: describe.c:4147 +msgid "List of partitioned relations" +msgstr "Lista de relações particionadas" + +#: describe.c:4178 +msgid "Parent name" +msgstr "Nome do ascendente" + +#: describe.c:4191 +msgid "Leaf partition size" +msgstr "Tamanho da partição folha" + +#: describe.c:4194 describe.c:4200 +msgid "Total size" +msgstr "Tamanho total" + +#: describe.c:4325 msgid "Trusted" msgstr "Confiável" -#: describe.c:3178 -msgid "Internal Language" -msgstr "Linguagem Interna" +#: describe.c:4334 +msgid "Internal language" +msgstr "Linguagem interna" -#: describe.c:3179 -msgid "Call Handler" -msgstr "Manipulador de Chamada" +#: describe.c:4335 +msgid "Call handler" +msgstr "Tratador de chamadas" -#: describe.c:3180 describe.c:4299 +#: describe.c:4336 describe.c:5759 msgid "Validator" msgstr "Validador" -#: describe.c:3183 -msgid "Inline Handler" -msgstr "Manipulador de Código Embutido" +#: describe.c:4337 +msgid "Inline handler" +msgstr "Tratador em-linha" -#: describe.c:3211 +#: describe.c:4372 msgid "List of languages" msgstr "Lista de linguagens" -#: describe.c:3255 -msgid "Modifier" -msgstr "Modificador" - -#: describe.c:3256 +#: describe.c:4413 msgid "Check" msgstr "Verificação" -#: describe.c:3298 +#: describe.c:4457 msgid "List of domains" msgstr "Lista de domínios" -#: describe.c:3332 +#: describe.c:4491 msgid "Source" -msgstr "Fonte" +msgstr "Origem" -#: describe.c:3333 +#: describe.c:4492 msgid "Destination" msgstr "Destino" -#: describe.c:3334 describe.c:3483 -msgid "no" -msgstr "não" - -#: describe.c:3334 describe.c:3485 -msgid "yes" -msgstr "sim" - -#: describe.c:3335 +#: describe.c:4494 describe.c:6723 msgid "Default?" msgstr "Padrão?" -#: describe.c:3372 +#: describe.c:4536 msgid "List of conversions" msgstr "Lista de conversões" -#: describe.c:3411 +#: describe.c:4564 +msgid "Parameter" +msgstr "Parâmetro" + +#: describe.c:4565 +msgid "Value" +msgstr "Valor" + +#: describe.c:4572 +msgid "Context" +msgstr "Contexto" + +#: describe.c:4605 +msgid "List of configuration parameters" +msgstr "Lista de parâmetros de configuração" + +#: describe.c:4607 +msgid "List of non-default configuration parameters" +msgstr "Lista de parâmetros de configuração não-padrão" + +#: describe.c:4634 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "O servidor (versão %s) não oferece suporte a gatilhos de eventos." + +#: describe.c:4654 msgid "Event" msgstr "Evento" -#: describe.c:3413 +#: describe.c:4656 msgid "enabled" -msgstr "habilitado" +msgstr "ativado" -#: describe.c:3414 +#: describe.c:4657 msgid "replica" msgstr "réplica" -#: describe.c:3415 +#: describe.c:4658 msgid "always" msgstr "sempre" -#: describe.c:3416 +#: describe.c:4659 msgid "disabled" -msgstr "desabilitado" +msgstr "desativado" -#: describe.c:3417 +#: describe.c:4660 describe.c:6575 msgid "Enabled" -msgstr "Habilitado" +msgstr "Ativado" -#: describe.c:3418 -msgid "Procedure" -msgstr "Procedimento" - -#: describe.c:3419 +#: describe.c:4662 msgid "Tags" msgstr "Marcadores" -#: describe.c:3438 +#: describe.c:4686 msgid "List of event triggers" -msgstr "Lista de gatilhos de eventos" +msgstr "Lista de gatilhos de evento" + +#: describe.c:4713 +#, c-format +msgid "The server (version %s) does not support extended statistics." +msgstr "O servidor (versão %s) não oferece suporte a estatísticas estendidas." -#: describe.c:3480 +#: describe.c:4750 +msgid "Ndistinct" +msgstr "Ndistinct" + +#: describe.c:4751 +msgid "Dependencies" +msgstr "Dependências" + +#: describe.c:4761 +msgid "MCV" +msgstr "MCV (valores mais comuns)" + +#: describe.c:4785 +msgid "List of extended statistics" +msgstr "Lista de estatísticas estendidas" + +#: describe.c:4812 msgid "Source type" -msgstr "Tipo fonte" +msgstr "Tipo de dados origem" -#: describe.c:3481 +#: describe.c:4813 msgid "Target type" -msgstr "Tipo alvo" +msgstr "Tipo de dados destino" -#: describe.c:3484 +#: describe.c:4837 msgid "in assignment" msgstr "em atribuição" -#: describe.c:3486 +#: describe.c:4839 msgid "Implicit?" msgstr "Implícito?" -#: describe.c:3537 +#: describe.c:4898 msgid "List of casts" -msgstr "Lista de conversões de tipos" +msgstr "Lista de conversões explícitas" -#: describe.c:3565 -#, c-format -msgid "The server (version %s) does not support collations.\n" -msgstr "O servidor (versão %s) não suporta ordenações (collations).\n" +#: describe.c:4938 describe.c:4942 +msgid "Provider" +msgstr "Fornecedor" -#: describe.c:3616 +#: describe.c:4972 describe.c:4977 +msgid "Deterministic?" +msgstr "Determinista?" + +#: describe.c:5017 msgid "List of collations" msgstr "Lista de ordenações" -#: describe.c:3675 +#: describe.c:5079 msgid "List of schemas" msgstr "Lista de esquemas" -#: describe.c:3700 describe.c:3938 describe.c:4009 describe.c:4080 -#, c-format -msgid "The server (version %s) does not support full text search.\n" -msgstr "O servidor (versão %s) não suporta busca textual.\n" - -#: describe.c:3735 +#: describe.c:5196 msgid "List of text search parsers" -msgstr "Lista de analisadores de busca textual" +msgstr "Lista de analisadores de procura de texto" + +#: describe.c:5246 +#, c-format +msgid "Did not find any text search parser named \"%s\"." +msgstr "Nenhum analisador de procura de texto chamado \"%s\" foi encontrado." -#: describe.c:3778 +#: describe.c:5249 #, c-format -msgid "Did not find any text search parser named \"%s\".\n" -msgstr "Não encontrou nenhum analisador de busca textual chamado \"%s\".\n" +msgid "Did not find any text search parsers." +msgstr "Nenhum analisador de procura de texto foi encontrado." -#: describe.c:3853 +#: describe.c:5324 msgid "Start parse" -msgstr "Iniciar análise" +msgstr "Início da análise" -#: describe.c:3854 +#: describe.c:5325 msgid "Method" msgstr "Método" -#: describe.c:3858 +#: describe.c:5329 msgid "Get next token" -msgstr "Obter próximo elemento" +msgstr "Obter o próximo elemento" -#: describe.c:3860 +#: describe.c:5331 msgid "End parse" -msgstr "Terminar análise" +msgstr "Fim da análise" -#: describe.c:3862 +#: describe.c:5333 msgid "Get headline" -msgstr "Obter destaque" +msgstr "Obter cabeçalho" -#: describe.c:3864 +#: describe.c:5335 msgid "Get token types" -msgstr "Obter tipos de elemento" +msgstr "Obter os tipos de elemento" -#: describe.c:3874 +#: describe.c:5346 #, c-format msgid "Text search parser \"%s.%s\"" -msgstr "Analisador de busca textual \"%s.%s\"" +msgstr "Analisador de procura de texto \"%s.%s\"" -#: describe.c:3876 +#: describe.c:5349 #, c-format msgid "Text search parser \"%s\"" -msgstr "Analisador de busca textual \"%s\"" +msgstr "Analisador de procura de texto \"%s\"" -#: describe.c:3895 +#: describe.c:5368 msgid "Token name" msgstr "Nome do elemento" -#: describe.c:3906 +#: describe.c:5382 #, c-format msgid "Token types for parser \"%s.%s\"" -msgstr "Tipos de elemento para analisador \"%s.%s\"" +msgstr "Tipos de elemento para o analisador \"%s.%s\"" -#: describe.c:3908 +#: describe.c:5385 #, c-format msgid "Token types for parser \"%s\"" -msgstr "Tipos de elemento para analisador \"%s\"" +msgstr "Tipos de elemento para o analisador \"%s" -#: describe.c:3961 +#: describe.c:5429 msgid "Template" msgstr "Modelo" -#: describe.c:3962 +#: describe.c:5430 msgid "Init options" msgstr "Opções de inicialização" -#: describe.c:3984 +#: describe.c:5457 msgid "List of text search dictionaries" -msgstr "Lista de dicionários de busca textual" +msgstr "Lista de dicionários de procura de texto" -#: describe.c:4027 +#: describe.c:5490 msgid "Init" -msgstr "Inicializador" +msgstr "Inicialização" -#: describe.c:4028 +#: describe.c:5491 msgid "Lexize" -msgstr "Lexize" +msgstr "Lexicalizar" -#: describe.c:4055 +#: describe.c:5523 msgid "List of text search templates" -msgstr "Lista de modelos de busca textual" +msgstr "Lista de modelos de procura de texto" -#: describe.c:4115 +#: describe.c:5578 msgid "List of text search configurations" -msgstr "Lista de configurações de busca textual" +msgstr "Lista de configurações de procura de texto" + +#: describe.c:5629 +#, c-format +msgid "Did not find any text search configuration named \"%s\"." +msgstr "Nenhuma configuração de procura de texto chamada \"%s\" foi encontrada." -#: describe.c:4159 +#: describe.c:5632 #, c-format -msgid "Did not find any text search configuration named \"%s\".\n" -msgstr "Não encontrou nenhuma configuração de busca textual chamada \"%s\".\n" +msgid "Did not find any text search configurations." +msgstr "Nenhuma configuração de procura de texto foi encontrada." -#: describe.c:4225 +#: describe.c:5698 msgid "Token" msgstr "Elemento" -#: describe.c:4226 +#: describe.c:5699 msgid "Dictionaries" msgstr "Dicionários" -#: describe.c:4237 +#: describe.c:5710 #, c-format msgid "Text search configuration \"%s.%s\"" -msgstr "Configuração de busca textual \"%s.%s\"" +msgstr "Configuração de procura de texto \"%s.%s\"" -#: describe.c:4240 +#: describe.c:5713 #, c-format msgid "Text search configuration \"%s\"" -msgstr "Configuração de busca textual \"%s\"" +msgstr "Configuração de procura de texto \"%s\"" -#: describe.c:4244 +#: describe.c:5717 #, c-format msgid "" "\n" @@ -1806,7 +2211,7 @@ msgstr "" "\n" "Analisador: \"%s.%s\"" -#: describe.c:4247 +#: describe.c:5720 #, c-format msgid "" "\n" @@ -1815,93 +2220,265 @@ msgstr "" "\n" "Analisador: \"%s\"" -#: describe.c:4281 -#, c-format -msgid "The server (version %s) does not support foreign-data wrappers.\n" -msgstr "O servidor (versão %s) não suporta adaptadores de dados externos.\n" - -#: describe.c:4339 +#: describe.c:5801 msgid "List of foreign-data wrappers" -msgstr "Lista de adaptadores de dados externos" +msgstr "Lista de empacotadores de dados estrangeiros" -#: describe.c:4364 -#, c-format -msgid "The server (version %s) does not support foreign servers.\n" -msgstr "O servidor (versão %s) não suporta servidores externos.\n" - -#: describe.c:4377 +#: describe.c:5829 msgid "Foreign-data wrapper" -msgstr "Adaptador de dados externos" +msgstr "Empacotador de dados estrangeiros" -#: describe.c:4395 describe.c:4600 +#: describe.c:5847 describe.c:6037 msgid "Version" msgstr "Versão" -#: describe.c:4421 +#: describe.c:5878 msgid "List of foreign servers" -msgstr "Lista de servidores externos" - -#: describe.c:4446 -#, c-format -msgid "The server (version %s) does not support user mappings.\n" -msgstr "O servidor (versão %s) não suporta mapeamentos de usuários.\n" +msgstr "Lista de servidores estrangeiros" -#: describe.c:4456 describe.c:4520 +#: describe.c:5903 describe.c:5962 msgid "Server" msgstr "Servidor" -#: describe.c:4457 +#: describe.c:5904 msgid "User name" msgstr "Nome de usuário" -#: describe.c:4482 +#: describe.c:5934 msgid "List of user mappings" msgstr "Lista de mapeamentos de usuários" -#: describe.c:4507 -#, c-format -msgid "The server (version %s) does not support foreign tables.\n" -msgstr "O servidor (versão %s) não suporta tabelas externas.\n" - -#: describe.c:4560 +#: describe.c:6007 msgid "List of foreign tables" -msgstr "Lista de tabelas externas" - -#: describe.c:4585 describe.c:4642 -#, c-format -msgid "The server (version %s) does not support extensions.\n" -msgstr "O servidor (versão %s) não suporta extensões.\n" +msgstr "Lista de tabelas estrangeiras" -#: describe.c:4617 +#: describe.c:6059 msgid "List of installed extensions" msgstr "Lista de extensões instaladas" -#: describe.c:4670 +#: describe.c:6107 #, c-format -msgid "Did not find any extension named \"%s\".\n" -msgstr "Não encontrou nenhuma extensão chamada \"%s\".\n" +msgid "Did not find any extension named \"%s\"." +msgstr "Nenhuma extensão chamada \"%s\" foi encontrada." -#: describe.c:4673 +#: describe.c:6110 #, c-format -msgid "Did not find any extensions.\n" -msgstr "Não encontrou nenhuma extensão.\n" +msgid "Did not find any extensions." +msgstr "Nenhuma extensão foi encontrada." -#: describe.c:4717 -msgid "Object Description" -msgstr "Descrição do Objeto" +#: describe.c:6154 +msgid "Object description" +msgstr "Descrição do objeto" -#: describe.c:4726 +#: describe.c:6164 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objetos na extensão \"%s\"" -#: help.c:63 +#: describe.c:6205 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "nome qualificado de forma não apropriada (muitos nomes com pontos): %s" + +#: describe.c:6219 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "não estão implementadas referências cruzadas entre bancos de dados: %s" + +#: describe.c:6250 describe.c:6377 +#, c-format +msgid "The server (version %s) does not support publications." +msgstr "O servidor (versão %s) não oferece suporte a publicações." + +#: describe.c:6267 describe.c:6455 +msgid "All tables" +msgstr "Todas as tabelas" + +#: describe.c:6268 describe.c:6456 +msgid "Inserts" +msgstr "Inserções" + +#: describe.c:6269 describe.c:6457 +msgid "Updates" +msgstr "Atualizações" + +#: describe.c:6270 describe.c:6458 +msgid "Deletes" +msgstr "Exclusões" + +#: describe.c:6274 describe.c:6460 +msgid "Truncates" +msgstr "Truncamentos" + +#: describe.c:6278 describe.c:6462 +msgid "Via root" +msgstr "Via root" + +#: describe.c:6300 +msgid "List of publications" +msgstr "Lista de publicações" + +#: describe.c:6424 +#, c-format +msgid "Did not find any publication named \"%s\"." +msgstr "Nenhuma publicação chamada \"%s\" foi encontrada." + +#: describe.c:6427 +#, c-format +msgid "Did not find any publications." +msgstr "Nenhuma publicação foi encontrada." + +#: describe.c:6451 #, c-format -msgid "%s\n" -msgstr "%s\n" +msgid "Publication %s" +msgstr "Publicação %s" + +#: describe.c:6504 +msgid "Tables:" +msgstr "Tabelas:" -#: help.c:74 +#: describe.c:6516 +msgid "Tables from schemas:" +msgstr "Tabelas de esquemas:" + +#: describe.c:6560 #, c-format +msgid "The server (version %s) does not support subscriptions." +msgstr "O servidor (versão %s) não oferece suporte a subscrições." + +#: describe.c:6576 +msgid "Publication" +msgstr "Publicação" + +#: describe.c:6585 +msgid "Binary" +msgstr "Binário" + +#: describe.c:6594 describe.c:6598 +msgid "Streaming" +msgstr "Fluxo" + +#: describe.c:6606 +msgid "Two-phase commit" +msgstr "Efetivação em duas fases" + +#: describe.c:6607 +msgid "Disable on error" +msgstr "Desativar em caso de erro" + +#: describe.c:6614 +msgid "Origin" +msgstr "Origem" + +#: describe.c:6615 +msgid "Password required" +msgstr "Senha requerida" + +#: describe.c:6616 +msgid "Run as owner?" +msgstr "Executar como dono?" + +#: describe.c:6621 +msgid "Synchronous commit" +msgstr "Efetivação síncrona" + +#: describe.c:6622 +msgid "Conninfo" +msgstr "Informações da conexão" + +#: describe.c:6628 +msgid "Skip LSN" +msgstr "Saltar LSN" + +#: describe.c:6655 +msgid "List of subscriptions" +msgstr "Lista de subscrições" + +#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001 +msgid "AM" +msgstr "AM" + +#: describe.c:6718 +msgid "Input type" +msgstr "Tipo de entrada" + +#: describe.c:6719 +msgid "Storage type" +msgstr "Tipo de armazenamento" + +#: describe.c:6720 +msgid "Operator class" +msgstr "Classe de operador" + +#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002 +msgid "Operator family" +msgstr "Família de operador" + +#: describe.c:6768 +msgid "List of operator classes" +msgstr "Lista de classes de operador" + +#: describe.c:6815 +msgid "Applicable types" +msgstr "Tipos aplicáveis" + +#: describe.c:6857 +msgid "List of operator families" +msgstr "Lista de famílias de operador" + +#: describe.c:6908 +msgid "Operator" +msgstr "Operador" + +#: describe.c:6909 +msgid "Strategy" +msgstr "Estratégia" + +#: describe.c:6910 +msgid "ordering" +msgstr "ordenação" + +#: describe.c:6911 +msgid "search" +msgstr "procura" + +#: describe.c:6912 +msgid "Purpose" +msgstr "Finalidade" + +#: describe.c:6917 +msgid "Sort opfamily" +msgstr "Família de operador de ordenação" + +#: describe.c:6956 +msgid "List of operators of operator families" +msgstr "Lista de operadores de famílias de operador" + +#: describe.c:7003 +msgid "Registered left type" +msgstr "Tipo de dados esquerdo registrado" + +#: describe.c:7004 +msgid "Registered right type" +msgstr "Tipo de dados direito registrado" + +#: describe.c:7005 +msgid "Number" +msgstr "Número" + +#: describe.c:7049 +msgid "List of support functions of operator families" +msgstr "Lista de funções de suporte das famílias de operador" + +#: describe.c:7080 +msgid "ID" +msgstr "ID" + +#: describe.c:7101 +msgid "Large objects" +msgstr "Objetos grandes" + +#: help.c:75 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -1909,92 +2486,78 @@ msgstr "" "psql é o terminal interativo do PostgreSQL.\n" "\n" -#: help.c:75 help.c:333 help.c:367 help.c:394 -#, c-format +#: help.c:76 help.c:395 help.c:479 help.c:522 msgid "Usage:\n" msgstr "Uso:\n" -#: help.c:76 -#, c-format +#: help.c:77 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" msgstr "" -" psql [OPÇÃO]... [NOMEBD [USUÃRIO]]\n" +" psql [OPÇÃO]... [BANCO [USUÃRIO]]\n" "\n" -#: help.c:78 -#, c-format +#: help.c:79 msgid "General options:\n" msgstr "Opções gerais:\n" -#: help.c:83 -#, c-format +#: help.c:84 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=COMANDO executa somente um comando (SQL ou interno) e termina\n" -#: help.c:84 +#: help.c:85 #, c-format msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" -msgstr " -d, --dbname=NOMEBD nome do banco de dados ao qual quer se conectar (padrão: \"%s\")\n" +msgstr " -d, --dbname=BANCO nome do banco de dados ao qual se conectar (padrão: \"%s\")\n" -#: help.c:85 -#, c-format +#: help.c:87 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=ARQUIVO executa comandos de um arquivo e termina\n" -#: help.c:86 -#, c-format +#: help.c:88 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list lista os bancos de dados disponíveis e termina\n" -#: help.c:87 -#, c-format +#: help.c:89 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" " (e.g., -v ON_ERROR_STOP=1)\n" msgstr "" " -v, --set=, --variable=NOME=VALOR\n" -" define variável do psql NOME como VALOR\n" -" (e.g., -v ON_ERROR_STOP=1)\n" +" define a variável do psql NOME com o VALOR\n" +" (por exemplo, -v ON_ERROR_STOP=1)\n" -#: help.c:90 -#, c-format +#: help.c:92 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostra informação sobre a versão e termina\n" -#: help.c:91 -#, c-format +#: help.c:93 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc não lê o arquivo de inicialização (~/.psqlrc)\n" -#: help.c:92 -#, c-format +#: help.c:94 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" msgstr "" " -1 (\"um\"), --single-transaction\n" -" executa como uma transação única (se não interativo)\n" +" executa como uma única transação (se não interativo)\n" -#: help.c:94 -#, c-format +#: help.c:96 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] mostra essa ajuda e termina\n" -#: help.c:95 -#, c-format +#: help.c:97 msgid " --help=commands list backslash commands, then exit\n" -msgstr " -?, --help=commands mostra comandos de barra invertida e termina\n" +msgstr " -?, --help=commands lista os comandos de contrabarra e termina\n" -#: help.c:96 -#, c-format +#: help.c:98 msgid " --help=variables list special variables, then exit\n" -msgstr " -?, --help=variables mostra variáveis especiais e termina\n" +msgstr " -?, --help=variables lista as variáveis especiais e termina\n" -#: help.c:98 -#, c-format +#: help.c:100 msgid "" "\n" "Input and output options:\n" @@ -2002,133 +2565,117 @@ msgstr "" "\n" "Opções de entrada e saída:\n" -#: help.c:99 -#, c-format +#: help.c:101 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all mostra toda entrada do script\n" -#: help.c:100 -#, c-format +#: help.c:102 msgid " -b, --echo-errors echo failed commands\n" -msgstr " -b, --echo-errors mostra comandos que falharam\n" +msgstr " -b, --echo-errors mostra os comandos que falharam\n" -#: help.c:101 -#, c-format +#: help.c:103 msgid " -e, --echo-queries echo commands sent to server\n" -msgstr " -e, --echo-queries mostra comandos enviados ao servidor\n" +msgstr " -e, --echo-queries mostra os comandos enviados ao servidor\n" -#: help.c:102 -#, c-format +#: help.c:104 msgid " -E, --echo-hidden display queries that internal commands generate\n" -msgstr " -E, --echo-hidden mostra consultas que os comandos internos geram\n" +msgstr " -E, --echo-hidden mostra as consultas que os comandos internos geram\n" -#: help.c:103 -#, c-format +#: help.c:105 msgid " -L, --log-file=FILENAME send session log to file\n" -msgstr " -L, --log-file=ARQUIVO envia log da sessão para arquivo\n" +msgstr " -L, --log-file=ARQUIVO envia o log da sessão para arquivo\n" -#: help.c:104 -#, c-format +#: help.c:106 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" -msgstr " -n, --no-readline desabilita edição de linha de comando melhorada (readline)\n" +msgstr " -n, --no-readline desativa a edição de linha de comando melhorada (readline)\n" -#: help.c:105 -#, c-format +#: help.c:107 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=ARQUIVO envia resultados da consulta para um arquivo (ou |pipe)\n" -#: help.c:106 -#, c-format +#: help.c:108 msgid " -q, --quiet run quietly (no messages, only query output)\n" -msgstr " -q, --quiet executa silenciosamente (sem mensagens, somente saída da consulta)\n" +msgstr " -q, --quiet executa silenciosamente (sem mensagens, somente a saída da consulta)\n" -#: help.c:107 -#, c-format +#: help.c:109 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step modo passo-a-passo (confirma cada consulta)\n" -#: help.c:108 -#, c-format +#: help.c:110 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" -msgstr " -S, --single-line modo linha única (fim da linha termina o comando SQL)\n" +msgstr " -S, --single-line modo de linha-única (fim da linha termina o comando SQL)\n" -#: help.c:110 -#, c-format +#: help.c:112 msgid "" "\n" "Output format options:\n" msgstr "" "\n" -"Opções para formato de saída:\n" +"Opções para o formato de saída:\n" -#: help.c:111 -#, c-format +#: help.c:113 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align modo de saída em tabela desalinhada\n" -#: help.c:112 +#: help.c:114 +msgid " --csv CSV (Comma-Separated Values) table output mode\n" +msgstr " --csv Modo de saída da tabela CSV (valores separados por vírgula)\n" + +#: help.c:115 #, c-format msgid "" " -F, --field-separator=STRING\n" " field separator for unaligned output (default: \"%s\")\n" msgstr "" " -F, --field-separator=SEPARADOR\n" -" define separador de campos para modo de saída desalinhado (padrão: \"%s\")\n" +" define o separador de campos para modo de saída desalinhado (padrão: \"%s\")\n" -#: help.c:115 -#, c-format +#: help.c:118 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html modo de saída em tabela HTML\n" -#: help.c:116 -#, c-format +#: help.c:119 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr " -P, --pset=VAR[=ARG] define opção de exibição VAR para ARG (veja comando \\pset)\n" -#: help.c:117 -#, c-format +#: help.c:120 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" msgstr "" " -R, --record-separator=SEPARADOR\n" -" define separador de registros para modo de saída desalinhado (padrão: nova linha)\n" +" define o separador de registros para modo de saída desalinhado\n" +" (padrão: nova-linha)\n" -#: help.c:119 -#, c-format +#: help.c:122 msgid " -t, --tuples-only print rows only\n" -msgstr " -t, --tuples-only exibe somente registros\n" +msgstr " -t, --tuples-only imprime somente tuplas\n" -#: help.c:120 -#, c-format +#: help.c:123 msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" -msgstr " -T, --table-attr=TEXTO define atributos do marcador table do HTML (i.e. width, border)\n" +msgstr " -T, --table-attr=TEXTO define atributos do elemento
do HTML (i.e. width, border)\n" -#: help.c:121 -#, c-format +#: help.c:124 msgid " -x, --expanded turn on expanded table output\n" -msgstr " -x, --expanded habilita saída em tabela expandida\n" +msgstr " -x, --expanded ativa a saída em tabela expandida\n" -#: help.c:122 -#, c-format +#: help.c:125 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" msgstr "" " -z, --field-separator-zero\n" -" define separador de campos para modo de saída desalinhado como byte zero\n" +" define o separador de campos para o modo de saída desalinhado como o byte zero\n" -#: help.c:124 -#, c-format +#: help.c:127 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" msgstr "" " -0, --record-separator-zero\n" -" define separador de registros para modo de saída desalinhado como byte zero\n" +" define o separador de registros para modo de saída desalinhado como o byte zero\n" -#: help.c:127 -#, c-format +#: help.c:130 msgid "" "\n" "Connection options:\n" @@ -2136,16 +2683,16 @@ msgstr "" "\n" "Opções de conexão:\n" -#: help.c:130 +#: help.c:133 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" msgstr " -h, --host=MÃQUINA máquina do servidor de banco de dados ou diretório do soquete (padrão: \"%s\")\n" -#: help.c:131 +#: help.c:134 msgid "local socket" msgstr "soquete local" -#: help.c:134 +#: help.c:137 #, c-format msgid " -p, --port=PORT database server port (default: \"%s\")\n" msgstr " -p, --port=PORTA porta do servidor de banco de dados (padrão: \"%s\")\n" @@ -2155,18 +2702,15 @@ msgstr " -p, --port=PORTA porta do servidor de banco de dados (padrão: msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" msgstr " -U, --username=USUÃRIO nome de usuário do banco de dados (padrão: \"%s\")\n" -#: help.c:141 -#, c-format +#: help.c:142 msgid " -w, --no-password never prompt for password\n" -msgstr " -w, --no-password nunca pergunta senha\n" +msgstr " -w, --no-password nunca pede a senha\n" -#: help.c:142 -#, c-format +#: help.c:143 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password pergunta senha (pode ocorrer automaticamente)\n" -#: help.c:144 -#, c-format +#: help.c:145 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2175,532 +2719,561 @@ msgid "" "\n" msgstr "" "\n" -"Para obter informações adicionais, digite \"\\?\" (para comandos internos) ou \"\\help\"\n" -"(para comandos SQL) no psql, ou consulte a seção do psql na\n" +"Para obter informações adicionais, digite \"\\?\" (para comandos internos),\n" +"ou \"\\help\"\n" +" (para comandos SQL) no psql, ou consulte a seção do psql na\n" "documentação do PostgreSQL.\n" "\n" -#: help.c:147 +#: help.c:148 #, c-format -msgid "Report bugs to .\n" -msgstr "Relate erros a .\n" +msgid "Report bugs to <%s>.\n" +msgstr "Relate erros para <%s>.\n" -#: help.c:173 +#: help.c:149 #, c-format +msgid "%s home page: <%s>\n" +msgstr "Página inicial de %s: <%s>\n" + +#: help.c:191 msgid "General\n" msgstr "Geral\n" -#: help.c:174 -#, c-format +#: help.c:192 +msgid " \\bind [PARAM]... set query parameters\n" +msgstr " \\bind [PARAM]... define parâmetros de consulta\n" + +#: help.c:193 msgid " \\copyright show PostgreSQL usage and distribution terms\n" -msgstr " \\copyright mostra termos de uso e distribuição do PostgreSQL\n" +msgstr " \\copyright mostra os termos de uso e distribuição do PostgreSQL\n" -#: help.c:175 -#, c-format +#: help.c:194 +msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" +msgstr " \\crosstabview [COLUNAS] executa a consulta e mostra o resultado em uma tabela cruzada\n" + +#: help.c:195 msgid " \\errverbose show most recent error message at maximum verbosity\n" -msgstr " \\errverbose mostra mensagem de erro mais recente com detalhamento máximo\n" +msgstr " \\errverbose mostra a mensagem de erro mais recente com verbosidade máxima\n" -#: help.c:176 -#, c-format -msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n" -msgstr " \\g [ARQUIVO] ou ; executa consulta (e envia os resultados para arquivo ou |pipe)\n" +#: help.c:196 +msgid "" +" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" +" \\g with no arguments is equivalent to a semicolon\n" +msgstr "" +" \\g [(OPÇÕES)] [ARQUIVO] executa a consulta (e envia o resultado para arquivo ou |pipe);\n" +" \\g sem argumentos é equivalente a ponto e vírgula\n" -#: help.c:177 -#, c-format +#: help.c:198 +msgid " \\gdesc describe result of query, without executing it\n" +msgstr " \\gdesc descreve o resultado da consulta, sem executá-la\n" + +#: help.c:199 msgid " \\gexec execute query, then execute each value in its result\n" -msgstr " \\gexec executa consulta, em seguida, executa cada valor no seu resultado\n" +msgstr " \\gexec executa a consulta e executa cada valor em seu resultado\n" -#: help.c:178 -#, c-format -msgid " \\gset [PREFIX] execute query and store results in psql variables\n" -msgstr " \\gset [PREFIXO] executa consulta e armazena os resultados em variáveis do psql\n" +#: help.c:200 +msgid " \\gset [PREFIX] execute query and store result in psql variables\n" +msgstr " \\gset [PREFIXO] executa a consulta e armazena o resultado em variáveis ​​psql\n" -#: help.c:179 -#, c-format +#: help.c:201 +msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" +msgstr " \\gx [(OPÇÕES)] [ARQUIVO] como \\g, mas força o modo de saída expandido\n" + +#: help.c:202 msgid " \\q quit psql\n" -msgstr " \\q sair do psql\n" +msgstr " \\q sai do psql\n" -#: help.c:180 -#, c-format -msgid " \\crosstabview [COLUMNS] execute query and display results in crosstab\n" -msgstr " \\crosstabview [COLUNAS] executa consulta e mostra resultados em tabela de referência cruzada\n" +#: help.c:203 +msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n" +msgstr " \\watch [[i=]SEC] [c=N] executa a consulta a cada SEC segundos, até N vezes\n" -#: help.c:181 -#, c-format -msgid " \\watch [SEC] execute query every SEC seconds\n" -msgstr " \\watch [SEG] executa consulta a cada SEG segundos\n" +#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306 +#: help.c:326 help.c:339 help.c:348 +msgid "\n" +msgstr "\n" -#: help.c:184 -#, c-format +#: help.c:206 msgid "Help\n" msgstr "Ajuda\n" -#: help.c:186 -#, c-format +#: help.c:208 msgid " \\? [commands] show help on backslash commands\n" -msgstr " \\? [commands] mostra ajuda sobre comandos de barra invertida\n" +msgstr " \\? [commands] mostra ajuda sobre os comandos de contrabarra\n" -#: help.c:187 -#, c-format +#: help.c:209 msgid " \\? options show help on psql command-line options\n" -msgstr " \\? options mostra ajuda sobre opções de linha de comando do psql\n" +msgstr " \\? options mostra ajuda sobre as opções de linha de comando do psql\n" -#: help.c:188 -#, c-format +#: help.c:210 msgid " \\? variables show help on special variables\n" -msgstr " \\? variables mostra ajuda sobre variáveis especiais\n" +msgstr " \\? variables mostra ajuda sobre as variáveis especiais\n" -#: help.c:189 -#, c-format +#: help.c:211 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" -msgstr " \\h [NOME] mostra sintaxe dos comandos SQL, * para todos os comandos\n" +msgstr " \\h [NOME] mostra a sintaxe dos comandos SQL, * para todos os comandos\n" -#: help.c:192 -#, c-format +#: help.c:214 msgid "Query Buffer\n" msgstr "Buffer de consulta\n" -#: help.c:193 -#, c-format +#: help.c:215 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" -msgstr " \\e [ARQUIVO] [LINHA] edita o buffer de consulta (ou arquivo) com um editor externo\n" +msgstr " \\e [ARQUIVO] [LINHA] edita o buffer de consulta (ou arquivo) com o editor externo\n" -#: help.c:194 -#, c-format +#: help.c:216 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" -msgstr " \\ef [NOMEFUNÇÃO [LINHA]] edita a definição de função com um editor externo\n" +msgstr " \\ef [FUNÇÃO [LINHA]] edita a definição de função com o editor externo\n" -#: help.c:195 -#, c-format +#: help.c:217 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" -msgstr " \\ev [NOMEVISÃO [LINHA]] edita a definição de visão com um editor externo\n" +msgstr " \\ev [VISÃO [LINHA]] edita a definição de visão com o editor externo\n" -#: help.c:196 -#, c-format +#: help.c:218 msgid " \\p show the contents of the query buffer\n" msgstr " \\p mostra o conteúdo do buffer de consulta\n" -#: help.c:197 -#, c-format +#: help.c:219 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r reinicia (apaga) o buffer de consulta\n" -#: help.c:199 -#, c-format +#: help.c:221 msgid " \\s [FILE] display history or save it to file\n" -msgstr " \\s [ARQUIVO] mostra histórico ou grava-o em um arquivo\n" +msgstr " \\s [ARQUIVO] mostra o histórico, ou escreve em um arquivo\n" -#: help.c:201 -#, c-format +#: help.c:223 msgid " \\w FILE write query buffer to file\n" msgstr " \\w [ARQUIVO] escreve o buffer de consulta para arquivo\n" -#: help.c:204 -#, c-format +#: help.c:226 msgid "Input/Output\n" msgstr "Entrada/Saída\n" -#: help.c:205 -#, c-format +#: help.c:227 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" -msgstr " \\copy ... realiza comando SQL COPY dos dados para máquina cliente\n" +msgstr " \\copy ... executa SQL COPY com fluxo de dados para o hospedeiro do cliente\n" -#: help.c:206 -#, c-format -msgid " \\echo [STRING] write string to standard output\n" -msgstr " \\echo [TEXTO] escreve cadeia de caracteres na saída padrão\n" +#: help.c:228 +msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" +msgstr " \\echo [-n] [TEXTO] escreve a cadeia de caracteres na saída padrão (-n para sem nova-linha)\n" -#: help.c:207 -#, c-format +#: help.c:229 msgid " \\i FILE execute commands from file\n" msgstr " \\i ARQUIVO executa comandos de um arquivo\n" -#: help.c:208 -#, c-format +#: help.c:230 msgid " \\ir FILE as \\i, but relative to location of current script\n" -msgstr " \\ir ARQUIVO como \\i, mas relativo ao local do script atual\n" +msgstr " \\ir ARQUIVO como \\i, mas relativo ao local do script corrente\n" -#: help.c:209 -#, c-format +#: help.c:231 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [ARQUIVO] envia todos os resultados da consulta para arquivo ou |pipe\n" -#: help.c:210 -#, c-format -msgid " \\qecho [STRING] write string to query output stream (see \\o)\n" -msgstr " \\qecho [TEXTO] escreve cadeia de caracteres para saída da consulta (veja \\o)\n" +#: help.c:232 +msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" +msgstr " \\qecho [-n] [TEXTO] escreve a cadeia de caracteres no fluxo de saída \\o (-n para sem nova-linha)\n" -#: help.c:213 -#, c-format +#: help.c:233 +msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" +msgstr " \\warn [-n] [TEXTO] escreve a cadeia de caracteres na saída de erro padrão (-n para sem nova-linha)\n" + +#: help.c:236 +msgid "Conditional\n" +msgstr "Condicional\n" + +#: help.c:237 +msgid " \\if EXPR begin conditional block\n" +msgstr " \\if EXPR inicia um bloco condicional\n" + +#: help.c:238 +msgid " \\elif EXPR alternative within current conditional block\n" +msgstr " \\elif EXPR alternativa dentro do bloco condicional corrente\n" + +#: help.c:239 +msgid " \\else final alternative within current conditional block\n" +msgstr " \\else alternativa final dentro do bloco condicional corrente\n" + +#: help.c:240 +msgid " \\endif end conditional block\n" +msgstr " \\endif fim do bloco condicional\n" + +#: help.c:243 msgid "Informational\n" -msgstr "Informativo\n" +msgstr "Informações\n" -#: help.c:214 -#, c-format +#: help.c:244 msgid " (options: S = show system objects, + = additional detail)\n" -msgstr " (opções: S = mostra objetos do sistema, + = detalhes)\n" +msgstr " (opções: S = mostra os objetos do sistema, + = detalhes adicionais)\n" -#: help.c:215 -#, c-format +#: help.c:245 msgid " \\d[S+] list tables, views, and sequences\n" -msgstr " \\d[S+] lista tabelas, visões e sequências\n" +msgstr " \\d[S+] lista as tabelas, visões e sequências\n" -#: help.c:216 -#, c-format +#: help.c:246 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NOME descreve tabela, visão, sequência ou índice\n" -#: help.c:217 -#, c-format +#: help.c:247 msgid " \\da[S] [PATTERN] list aggregates\n" -msgstr " \\da[S] [MODELO] lista funções de agregação\n" +msgstr " \\da[S] [PADRÃO] lista as funções de agregação\n" -#: help.c:218 -#, c-format +#: help.c:248 msgid " \\dA[+] [PATTERN] list access methods\n" -msgstr " \\dA[+] [MODELO] lista métodos de acesso\n" +msgstr " \\dA[+] [PADRÃO] lista os métodos de acesso\n" -#: help.c:219 -#, c-format +#: help.c:249 +msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" +msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] lista as classes de operador\n" + +#: help.c:250 +msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" +msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] lista as famílias de operador\n" + +#: help.c:251 +msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" +msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] lista os operadores de famílias de operador\n" + +#: help.c:252 +msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] lista as funções de suporte de famílias de operador\n" + +#: help.c:253 msgid " \\db[+] [PATTERN] list tablespaces\n" -msgstr " \\db[+] [MODELO] lista tablespaces\n" +msgstr " \\db[+] [PADRÃO] lista os espaços de tabelas\n" -#: help.c:220 -#, c-format +#: help.c:254 msgid " \\dc[S+] [PATTERN] list conversions\n" -msgstr " \\dc[S+] [MODELO] lista conversões\n" +msgstr " \\dc[S+] [PADRÃO] lista as conversões\n" -#: help.c:221 -#, c-format +#: help.c:255 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [PADRÃO] lista os parâmetros de configuração\n" + +#: help.c:256 msgid " \\dC[+] [PATTERN] list casts\n" -msgstr " \\dC[+] [MODELO] lista conversões de tipos\n" +msgstr " \\dC[+] [PADRÃO] lista as conversões de tipo de dados\n" -#: help.c:222 -#, c-format +#: help.c:257 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" -msgstr " \\dd[S] [MODELO] mostra comentários de objetos que não aparecem em outro lugar\n" - -#: help.c:223 -#, c-format -msgid " \\ddp [PATTERN] list default privileges\n" -msgstr " \\ddp [MODELO] lista privilégios padrão\n" +msgstr " \\dd[S] [PADRÃO] mostra as descrições de objeto não mostradas em outro lugar\n" -#: help.c:224 -#, c-format +#: help.c:258 msgid " \\dD[S+] [PATTERN] list domains\n" -msgstr " \\dD[S+] [MODELO] lista domínios\n" +msgstr " \\dD[S+] [PADRÃO] lista os domínios\n" -#: help.c:225 -#, c-format -msgid " \\det[+] [PATTERN] list foreign tables\n" -msgstr " \\det[+] [MODELO] lista tabelas externas\n" +#: help.c:259 +msgid " \\ddp [PATTERN] list default privileges\n" +msgstr " \\ddp [PADRÃO] lista os privilégios padrão\n" -#: help.c:226 -#, c-format +#: help.c:260 +msgid " \\dE[S+] [PATTERN] list foreign tables\n" +msgstr " \\dE[S+] [PADRÃO] lista as tabelas estrangeiras\n" + +#: help.c:261 msgid " \\des[+] [PATTERN] list foreign servers\n" -msgstr " \\des[+] [MODELO] lista servidores externos\n" +msgstr " \\des[+] [PADRÃO] lista os servidores estrangeiros\n" -#: help.c:227 -#, c-format +#: help.c:262 +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [PADRÃO] lista as tabelas estrangeiras\n" + +#: help.c:263 msgid " \\deu[+] [PATTERN] list user mappings\n" -msgstr " \\deu[+] [MODELO] lista mapeamento de usuários\n" +msgstr " \\deu[+] [PADRÃO] lista os mapeamentos de usuários\n" -#: help.c:228 -#, c-format +#: help.c:264 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" -msgstr " \\dew[+] [MODELO] lista adaptadores de dados externos\n" +msgstr " \\dew[+] [PADRÃO] lista os empacotadores de dados estrangeiros\n" -#: help.c:229 -#, c-format -msgid " \\df[antw][S+] [PATRN] list [only agg/normal/trigger/window] functions\n" -msgstr " \\df[antw][S+] [MODELO] lista funções [somente agr/normal/gatilho/deslizante]\n" +#: help.c:265 +msgid "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" list [only agg/normal/procedure/trigger/window] functions\n" +msgstr "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" lista as funções [somente agregação/normal/procedimento/gatilho/janela]\n" -#: help.c:230 -#, c-format +#: help.c:267 msgid " \\dF[+] [PATTERN] list text search configurations\n" -msgstr " \\dF[+] [MODELO] lista configurações de busca textual\n" +msgstr " \\dF[+] [PADRÃO] lista as configurações de procura de texto\n" -#: help.c:231 -#, c-format +#: help.c:268 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" -msgstr " \\dFd[+] [MODELO] lista dicionários de busca textual\n" +msgstr " \\dFd[+] [PADRÃO] lista os dicionários de procura de texto\n" -#: help.c:232 -#, c-format +#: help.c:269 msgid " \\dFp[+] [PATTERN] list text search parsers\n" -msgstr " \\dFp[+] [MODELO] lista analisadores de busca textual\n" +msgstr " \\dFp[+] [PADRÃO] lista os analisadores de procura de texto\n" -#: help.c:233 -#, c-format +#: help.c:270 msgid " \\dFt[+] [PATTERN] list text search templates\n" -msgstr " \\dFt[+] [MODELO] lista modelos de busca textual\n" +msgstr " \\dFt[+] [PADRÃO] lista os modelos de procura de texto\n" -#: help.c:234 -#, c-format +#: help.c:271 msgid " \\dg[S+] [PATTERN] list roles\n" -msgstr " \\dg[S+] [MODELO] lista roles\n" +msgstr " \\dg[S+] [PADRÃO] lista as funções de banco de dados (roles)\n" -#: help.c:235 -#, c-format +#: help.c:272 msgid " \\di[S+] [PATTERN] list indexes\n" -msgstr " \\di[S+] [MODELO] lista índices\n" +msgstr " \\di[S+] [PADRÃO] lista os índices\n" -#: help.c:236 -#, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl lista objetos grandes, mesmo que \\lo_list\n" +#: help.c:273 +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] lista os objetos grandes, o mesmo que \\lo_list\n" -#: help.c:237 -#, c-format +#: help.c:274 msgid " \\dL[S+] [PATTERN] list procedural languages\n" -msgstr " \\dL[S+] [MODELO] lista linguagens procedurais\n" +msgstr " \\dL[S+] [PADRÃO] lista as linguagens procedurais\n" -#: help.c:238 -#, c-format +#: help.c:275 msgid " \\dm[S+] [PATTERN] list materialized views\n" -msgstr " \\dm[S+] [MODELO] lista visões materializadas\n" +msgstr " \\dm[S+] [PADRÃO] lista as visões materializadas\n" -#: help.c:239 -#, c-format +#: help.c:276 msgid " \\dn[S+] [PATTERN] list schemas\n" -msgstr " \\dn[S+] [MODELO] lista esquemas\n" +msgstr " \\dn[S+] [PADRÃO] lista os esquemas\n" -#: help.c:240 -#, c-format -msgid " \\do[S] [PATTERN] list operators\n" -msgstr " \\do[S] [MODELO] lista operadores\n" +#: help.c:277 +msgid "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" list operators\n" +msgstr "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" lista os operadores\n" -#: help.c:241 -#, c-format +#: help.c:279 msgid " \\dO[S+] [PATTERN] list collations\n" -msgstr " \\dO[S+] [MODELO] lista ordenações\n" +msgstr " \\dO[S+] [PADRÃO] lista as ordenações\n" -#: help.c:242 -#, c-format -msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" -msgstr " \\dp [MODELO] lista privilégios de acesso de tabelas, visões e sequências\n" +#: help.c:280 +msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n" +msgstr " \\dp[S] [PADRÃO] lista os privilégios de acesso à tabela, visão e sequência\n" -#: help.c:243 -#, c-format -msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" -msgstr " \\drds [MOD1 [MOD2]] lista configurações de roles por banco de dados\n" +#: help.c:281 +msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" +msgstr " \\dP[itn+] [PADRÃO] lista as relações particionadas [somente índice/tabela] [n=aninhadas]\n" -#: help.c:244 -#, c-format +#: help.c:282 +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgstr " \\drds [ROLEPTRN [DBPTRN]] lista as definições de função de banco de dados (role) por banco de dados\n" + +#: help.c:283 +msgid " \\drg[S] [PATTERN] list role grants\n" +msgstr " \\drg[S] [PADRÃO] lista as concessões de função de banco de dados (role)\n" + +#: help.c:284 +msgid " \\dRp[+] [PATTERN] list replication publications\n" +msgstr " \\dRp[+] [PADRÃO] lista as publicações de replicação\n" + +#: help.c:285 +msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" +msgstr " \\dRs[+] [PADRÃO] lista as subscrições de replicação\n" + +#: help.c:286 msgid " \\ds[S+] [PATTERN] list sequences\n" -msgstr " \\ds[S+] [MODELO] lista sequências\n" +msgstr " \\ds[S+] [PADRÃO] lista as sequências\n" -#: help.c:245 -#, c-format +#: help.c:287 msgid " \\dt[S+] [PATTERN] list tables\n" -msgstr " \\dt[S+] [MODELO] lista tabelas\n" +msgstr " \\dt[S+] [PADRÃO] lista as tabelas\n" -#: help.c:246 -#, c-format +#: help.c:288 msgid " \\dT[S+] [PATTERN] list data types\n" -msgstr " \\dT[S+] [MODELO] lista tipos de dados\n" +msgstr " \\dT[S+] [PADRÃO] lista os tipos de dados\n" -#: help.c:247 -#, c-format +#: help.c:289 msgid " \\du[S+] [PATTERN] list roles\n" -msgstr " \\du[S+] [MODELO] lista roles\n" +msgstr " \\du[S+] [PADRÃO] lista as funções de banco de dados (roles)\n" -#: help.c:248 -#, c-format +#: help.c:290 msgid " \\dv[S+] [PATTERN] list views\n" -msgstr " \\dv[S+] [MODELO] lista visões\n" - -#: help.c:249 -#, c-format -msgid " \\dE[S+] [PATTERN] list foreign tables\n" -msgstr " \\dE[S+] [MODELO] lista tabelas externas\n" +msgstr " \\dv[S+] [PADRÃO] lista as visões\n" -#: help.c:250 -#, c-format +#: help.c:291 msgid " \\dx[+] [PATTERN] list extensions\n" -msgstr " \\dx[+] [MODELO] lista extensões\n" +msgstr " \\dx[+] [PADRÃO] lista as extensões\n" -#: help.c:251 -#, c-format -msgid " \\dy [PATTERN] list event triggers\n" -msgstr " \\dy [MODELO] lista gatilhos de eventos\n" +#: help.c:292 +msgid " \\dX [PATTERN] list extended statistics\n" +msgstr " \\dX [PADRÃO] lista as estatísticas estendidas\n" -#: help.c:252 -#, c-format +#: help.c:293 +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [PADRÃO] lista os gatilhos de eventos\n" + +#: help.c:294 msgid " \\l[+] [PATTERN] list databases\n" -msgstr " \\l[+] [MODELO] lista bancos de dados\n" +msgstr " \\l[+] [PADRÃO] lista os bancos de dados\n" -#: help.c:253 -#, c-format +#: help.c:295 msgid " \\sf[+] FUNCNAME show a function's definition\n" -msgstr " \\sf[+] NOMEFUNÇÃO edita a definição da função\n" +msgstr " \\sf[+] FUNÇÃO mostra a definição de uma função\n" -#: help.c:254 -#, c-format +#: help.c:296 msgid " \\sv[+] VIEWNAME show a view's definition\n" -msgstr " \\sv[+] NOMEVISÃO edita a definição da visão\n" +msgstr " \\sv[+] VISÃO mostra a definição de uma visão\n" -#: help.c:255 -#, c-format -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [MODELO] mesmo que \\dp\n" +#: help.c:297 +msgid " \\z[S] [PATTERN] same as \\dp\n" +msgstr " \\z[S] [PADRÃO] o mesmo que \\dp\n" -#: help.c:258 -#, c-format +#: help.c:300 +msgid "Large Objects\n" +msgstr "Objetos grandes\n" + +#: help.c:301 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr " \\lo_export LOBOID ARQUIVO escreve o objeto grande em um arquivo\n" + +#: help.c:302 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import ARQUIVO [COMENTÃRIO]\n" +" lê um objeto grande do arquivo\n" + +#: help.c:304 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] lista os objetos grandes\n" + +#: help.c:305 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink LOBOID exclui um objeto grande\n" + +#: help.c:308 msgid "Formatting\n" msgstr "Formatação\n" -#: help.c:259 -#, c-format +#: help.c:309 msgid " \\a toggle between unaligned and aligned output mode\n" -msgstr " \\a alterna entre modo de saída desalinhado e alinhado\n" +msgstr " \\a alterna entre o modo de saída desalinhado e alinhado\n" -#: help.c:260 -#, c-format +#: help.c:310 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [TEXTO] define o título da tabela, ou apaga caso nada seja especificado\n" -#: help.c:261 -#, c-format +#: help.c:311 msgid " \\f [STRING] show or set field separator for unaligned query output\n" -msgstr " \\f [TEXTO] mostra ou define separador de campos para saída de consulta desalinhada\n" +msgstr " \\f [TEXTO] mostra ou define o separador de campos para saída de consulta não alinhada\n" -#: help.c:262 +#: help.c:312 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" -msgstr " \\H alterna para modo de saída em HTML (atual %s)\n" +msgstr " \\H alterna o modo de saída em HTML (no momento %s)\n" -#: help.c:264 -#, c-format +#: help.c:314 msgid "" " \\pset [NAME [VALUE]] set table output option\n" -" (NAME := {format|border|expanded|fieldsep|fieldsep_zero|footer|null|\n" -" numericlocale|recordsep|recordsep_zero|tuples_only|title|tableattr|pager|\n" -" unicode_border_linestyle|unicode_column_linestyle|unicode_header_linestyle})\n" +" (border|columns|csv_fieldsep|expanded|fieldsep|\n" +" fieldsep_zero|footer|format|linestyle|null|\n" +" numericlocale|pager|pager_min_lines|recordsep|\n" +" recordsep_zero|tableattr|title|tuples_only|\n" +" unicode_border_linestyle|unicode_column_linestyle|\n" +" unicode_header_linestyle)\n" msgstr "" -" \\pset [NOME [VALOR]] define opção de saída da tabela\n" -" (NOME := {format|border|expanded|fieldsep|fieldsep_zero|footer|null|\n" -" numericlocale|recordsep|recordsep_zero|tuples_only|title|tableattr|pager|\n" -" unicode_border_linestyle|unicode_column_linestyle|unicode_header_linestyle})\n" +" \\pset [NOME [VALOR]] define a opção de exibição da tabela\n" +" (border|columns|csv_fieldsep|expanded|fieldsep|\n" +" fieldsep_zero|footer|format|linestyle|null|\n" +" numericlocale|pager|pager_min_lines|recordsep|\n" +" recordsep_zero|tableattr|title|tuples_only|\n" +" unicode_border_linestyle|unicode_column_linestyle|\n" +" unicode_header_linestyle)\n" -#: help.c:268 +#: help.c:321 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" -msgstr " \\t [on|off] mostra somente registros (atual %s)\n" +msgstr " \\t [on|off] mostra somente linhas (no momento %s)\n" -#: help.c:270 -#, c-format +#: help.c:323 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" -msgstr " \\T [TEXTO] define atributos do marcador HTML
ou apaga caso nada seja especificado\n" +msgstr " \\T [TEXTO] define os atributos do marcador HTML
, ou apaga se nada for especificado\n" -#: help.c:271 +#: help.c:324 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" -msgstr " \\x [on|off|auto] alterna para saída expandida (atual %s)\n" +msgstr " \\x [on|off|auto] alterna para saída expandida (no momento %s)\n" -#: help.c:275 -#, c-format +#: help.c:325 +msgid "auto" +msgstr "auto" + +#: help.c:328 msgid "Connection\n" msgstr "Conexão\n" -#: help.c:277 +#: help.c:330 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently \"%s\")\n" msgstr "" -" \\c[onnect] {[NOMEBD|- USUÃRIO|- MÃQUINA|- PORTA|-] | conninfo}\n" -" conecta a um novo banco de dados (atualmente \"%s\")\n" +" \\c[onnect] {[BANCO|- USUÃRIO|- HOSPEDEIRO|- PORTA|-] | conninfo}\n" +" conecta a um novo banco de dados (no momento \"%s\")\n" -#: help.c:281 -#, c-format +#: help.c:334 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" msgstr "" -" \\c[onnect] {[NOMEBD|- USUÃRIO|- MÃQUINA|- PORTA|-] | conninfo}\n" -" conecta a um novo banco de dados (atualmente nenhuma conexão)\n" +" \\c[onnect] {[BANCO|- USUÃRIO|- HOSPEDEIRO|- PORTA|-] | conninfo}\n" +" conecta a um novo banco de dados (no momento nenhuma conexão)\n" -#: help.c:283 -#, c-format +#: help.c:336 +msgid " \\conninfo display information about current connection\n" +msgstr " \\conninfo mostra informação sobre a conexão corrente\n" + +#: help.c:337 msgid " \\encoding [ENCODING] show or set client encoding\n" -msgstr " \\encoding [CODIFICAÇÃO] mostra ou define codificação do cliente\n" +msgstr " \\encoding [CODIFICAÇÃO] mostra ou define a codificação do cliente\n" -#: help.c:284 -#, c-format +#: help.c:338 msgid " \\password [USERNAME] securely change the password for a user\n" -msgstr " \\password [USUÃRIO] altera a senha de um usuário com segurança\n" - -#: help.c:285 -#, c-format -msgid " \\conninfo display information about current connection\n" -msgstr " \\conninfo mostra informação sobre conexão atual\n" +msgstr " \\password [USUÃRIO] muda a senha de um usuário com segurança\n" -#: help.c:288 -#, c-format +#: help.c:341 msgid "Operating System\n" msgstr "Sistema Operacional\n" -#: help.c:289 -#, c-format +#: help.c:342 msgid " \\cd [DIR] change the current working directory\n" -msgstr " \\cd [DIRETÓRIO] muda o diretório de trabalho atual\n" +msgstr " \\cd [DIRETÓRIO] muda o diretório de trabalho corrente\n" -#: help.c:290 -#, c-format +#: help.c:343 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv PSQLVAR ENVVAR busca a variável de ambiente\n" + +#: help.c:344 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" -msgstr " \\setenv NOME [VALOR] define ou apaga variável de ambiente\n" +msgstr " \\setenv NOME [VALOR] define ou apaga a variável de ambiente\n" -#: help.c:291 +#: help.c:345 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" -msgstr " \\timing [on|off] alterna para duração da execução de comandos (atualmente %s)\n" +msgstr " \\timing [on|off] alterna para cronometragem da execução de comandos (no momento %s)\n" -#: help.c:293 -#, c-format +#: help.c:347 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" -msgstr " \\! [COMANDO] executa comando na shell ou inicia shell interativa\n" +msgstr "" +" \\! [COMANDO] executa um comando no interpretador de comandos (shell),\n" +" ou inicia um interpretador de comandos interativo\n" -#: help.c:296 -#, c-format +#: help.c:350 msgid "Variables\n" msgstr "Variáveis\n" -#: help.c:297 -#, c-format +#: help.c:351 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" -msgstr " \\prompt [TEXTO] NOME pergunta o usuário ao definir uma variável interna\n" +msgstr " \\prompt [TEXTO] NOME pede ao usuário para definir uma variável interna\n" -#: help.c:298 -#, c-format +#: help.c:352 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" -msgstr " \\set [NOME [VALOR]] define variável interna ou lista todos caso não tenha parâmetros\n" +msgstr " \\set [NOME [VALOR]] define uma variável interna, ou lista todas se não houver parâmetros\n" -#: help.c:299 -#, c-format +#: help.c:353 msgid " \\unset NAME unset (delete) internal variable\n" -msgstr " \\unset NOME apaga (exclui) variável interna\n" - -#: help.c:302 -#, c-format -msgid "Large Objects\n" -msgstr "Objetos Grandes\n" - -#: help.c:303 -#, c-format -msgid "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID large object operations\n" -msgstr "" -" \\lo_export OIDLOB ARQUIVO\n" -" \\lo_import ARQUIVO [COMENTÃRIO]\n" -" \\lo_list\n" -" \\lo_unlink OIDLOB operações com objetos grandes\n" +msgstr " \\unset NOME apaga (exclui) uma variável interna\n" -#: help.c:330 -#, c-format +#: help.c:392 msgid "" "List of specially treated variables\n" "\n" @@ -2708,13 +3281,11 @@ msgstr "" "Lista de variáveis com tratamento especial\n" "\n" -#: help.c:332 -#, c-format +#: help.c:394 msgid "psql variables:\n" msgstr "variáveis do psql:\n" -#: help.c:334 -#, c-format +#: help.c:396 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -2724,158 +3295,317 @@ msgstr "" " ou \\set NOME VALOR no psql\n" "\n" -#: help.c:336 -#, c-format -msgid " AUTOCOMMIT if set, successful SQL commands are automatically committed\n" -msgstr " AUTOCOMMIT se definido, comandos SQL bem sucedidos são automaticamente efetivados\n" +#: help.c:398 +msgid "" +" AUTOCOMMIT\n" +" if set, successful SQL commands are automatically committed\n" +msgstr "" +" AUTOCOMMIT\n" +" se definido, os comandos SQL bem-sucedidos serão automaticamente efetivados\n" -#: help.c:337 -#, c-format +#: help.c:400 msgid "" -" COMP_KEYWORD_CASE determines the case used to complete SQL key words\n" -" [lower, upper, preserve-lower, preserve-upper]\n" +" COMP_KEYWORD_CASE\n" +" determines the case used to complete SQL key words\n" +" [lower, upper, preserve-lower, preserve-upper]\n" msgstr "" -" COMP_KEYWORD_CASE determina o uso de maiúsculas/minúsculas para completar palavras chave SQL\n" -" [lower, upper, preserve-lower, preserve-upper]\n" +" COMP_KEYWORD_CASE\n" +" determina o uso de maiúsculas e minúsculas para completar palavras-chave SQL\n" +" [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:339 -#, c-format -msgid " DBNAME the currently connected database name\n" -msgstr " NOMEBD o nome do banco de dados atualmente conectado\n" +#: help.c:403 +msgid "" +" DBNAME\n" +" the currently connected database name\n" +msgstr "" +" DBNAME\n" +" o nome do banco de dados conectado no momento\n" -#: help.c:340 -#, c-format +#: help.c:405 msgid "" -" ECHO controls what input is written to standard output\n" -" [all, errors, none, queries]\n" +" ECHO\n" +" controls what input is written to standard output\n" +" [all, errors, none, queries]\n" msgstr "" -" ECHO controla que entrada é escrita na saída padrão\n" -" [all, errors, none, queries]\n" +" ECHO\n" +" controla qual entrada é escrita na saída padrão\n" +" [all, errors, none, queries]\n" -#: help.c:342 -#, c-format +#: help.c:408 msgid "" -" ECHO_HIDDEN if set, display internal queries executed by backslash commands;\n" -" if set to \"noexec\", just show without execution\n" +" ECHO_HIDDEN\n" +" if set, display internal queries executed by backslash commands;\n" +" if set to \"noexec\", just show them without execution\n" msgstr "" -" ECHO_HIDDEN se definido, mostra consultas internas executadas por comandos de barra invertida;\n" -" se definido para \"noexec\", apenas mostre sem executar\n" +" ECHO_HIDDEN\n" +" se definido, mostra as consultas internas executadas por comandos de contrabarra;\n" +" se definido como \"noexec\", mostra somente sem executar\n" -#: help.c:344 -#, c-format -msgid " ENCODING current client character set encoding\n" -msgstr " ENCODING codificação do conjunto de caracteres do cliente atual\n" +#: help.c:411 +msgid "" +" ENCODING\n" +" current client character set encoding\n" +msgstr "" +" ENCODING\n" +" codificação do conjunto de caracteres do cliente corrente\n" -#: help.c:345 -#, c-format +#: help.c:413 msgid "" -" FETCH_COUNT the number of result rows to fetch and display at a time\n" -" (default: 0=unlimited)\n" +" ERROR\n" +" \"true\" if last query failed, else \"false\"\n" msgstr "" -" FETCH_COUNT o número de registros a serem buscados e mostrados por vez\n" -" (padrão: 0=ilimitado)\n" +" ERROR\n" +" \"true\" se a última consulta falhou, senão \"false\"\n" -#: help.c:347 -#, c-format -msgid " HISTCONTROL controls command history [ignorespace, ignoredups, ignoreboth]\n" -msgstr " HISTCONTROL controla histórico de comandos [ignorespace, ignoredups, ignoreboth]\n" +#: help.c:415 +msgid "" +" FETCH_COUNT\n" +" the number of result rows to fetch and display at a time (0 = unlimited)\n" +msgstr "" +" FETCH_COUNT\n" +" o número de linhas de resultado a serem buscadas e mostradas por vez (0 = ilimitado)\n" -#: help.c:348 -#, c-format -msgid " HISTFILE file name used to store the command history\n" -msgstr " HISTFILE nome do arquivo utilizado para armazenar o histórico de comandos\n" +#: help.c:417 +msgid "" +" HIDE_TABLEAM\n" +" if set, table access methods are not displayed\n" +msgstr "" +" HIDE_TABLEAM\n" +" se definido, os métodos de acesso à tabela não serão mostrados\n" -#: help.c:349 -#, c-format -msgid " HISTSIZE the number of commands to store in the command history\n" -msgstr " HISTSIZE o número de comandos para armazenar no histórico de comandos\n" +#: help.c:419 +msgid "" +" HIDE_TOAST_COMPRESSION\n" +" if set, compression methods are not displayed\n" +msgstr "" +" HIDE_TOAST_COMPRESSION\n" +" se definido, os métodos de compressão não serão mostrados\n" -#: help.c:350 -#, c-format -msgid " HOST the currently connected database server host\n" -msgstr " HOST a máquina do servidor de banco de dados atualmente conectado\n" +#: help.c:421 +msgid "" +" HISTCONTROL\n" +" controls command history [ignorespace, ignoredups, ignoreboth]\n" +msgstr "" +" HISTCONTROL\n" +" controla o histórico de comandos [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:351 -#, c-format -msgid " IGNOREEOF if unset, sending an EOF to interactive session terminates application\n" -msgstr " IGNOREEOF se não for definido, enviar um EOF para sessão interativa termina a aplicação\n" +#: help.c:423 +msgid "" +" HISTFILE\n" +" file name used to store the command history\n" +msgstr "" +" HISTFILE\n" +" nome do arquivo usado para armazenar o histórico de comandos\n" -#: help.c:352 -#, c-format -msgid " LASTOID value of the last affected OID\n" -msgstr " LASTOID valor do último OID afetado\n" +#: help.c:425 +msgid "" +" HISTSIZE\n" +" maximum number of commands to store in the command history\n" +msgstr "" +" HISTSIZE\n" +" número máximo de comandos para armazenar no histórico de comandos\n" -#: help.c:353 -#, c-format -msgid " ON_ERROR_ROLLBACK if set, an error doesn't stop a transaction (uses implicit savepoints)\n" -msgstr " ON_ERROR_ROLLBACK se definido, um erro não termina a transação (usa pontos de salvamento implícitos)\n" +#: help.c:427 +msgid "" +" HOST\n" +" the currently connected database server host\n" +msgstr "" +" HOST\n" +" o hospedeiro do servidor de banco de dados conectado no momento\n" -#: help.c:354 -#, c-format -msgid " ON_ERROR_STOP stop batch execution after error\n" -msgstr " ON_ERROR_STOP termina a execução em lote após erro\n" +#: help.c:429 +msgid "" +" IGNOREEOF\n" +" number of EOFs needed to terminate an interactive session\n" +msgstr "" +" IGNOREEOF\n" +" número de EOFs necessários para encerrar uma sessão interativa\n" -#: help.c:355 -#, c-format -msgid " PORT server port of the current connection\n" -msgstr " PORT porta do servidor da conexão atual\n" +#: help.c:431 +msgid "" +" LASTOID\n" +" value of the last affected OID\n" +msgstr "" +" LASTOID\n" +" valor do último OID afetado\n" -#: help.c:356 -#, c-format -msgid " PROMPT1 specifies the standard psql prompt\n" -msgstr " PROMPT1 especifica o prompt padrão do psql\n" +#: help.c:433 +msgid "" +" LAST_ERROR_MESSAGE\n" +" LAST_ERROR_SQLSTATE\n" +" message and SQLSTATE of last error, or empty string and \"00000\" if none\n" +msgstr "" +" LAST_ERROR_MESSAGE\n" +" LAST_ERROR_SQLSTATE\n" +" mensagem e SQLSTATE do último erro, ou uma cadeia de caracteres vazia e \"00000\" se nenhum\n" -#: help.c:357 -#, c-format -msgid " PROMPT2 specifies the prompt used when a statement continues from a previous line\n" -msgstr " PROMPT2 especifica o prompt utilizado quando o comando continua a partir de uma linha anterior\n" +#: help.c:436 +msgid "" +" ON_ERROR_ROLLBACK\n" +" if set, an error doesn't stop a transaction (uses implicit savepoints)\n" +msgstr "" +" ON_ERROR_ROLLBACK\n" +" se definido, um erro não interrompe uma transação (usa pontos de salvamento implícitos)\n" -#: help.c:358 -#, c-format -msgid " PROMPT3 specifies the prompt used during COPY ... FROM STDIN\n" -msgstr " PROMPT3 especifica o prompt utilizado durante COPY ... FROM STDIN\n" +#: help.c:438 +msgid "" +" ON_ERROR_STOP\n" +" stop batch execution after error\n" +msgstr "" +" ON_ERROR_STOP\n" +" termina a execução em lote após erro\n" -#: help.c:359 -#, c-format -msgid " QUIET run quietly (same as -q option)\n" -msgstr " QUIET executa silenciosamente (mesmo que a opção -q)\n" +#: help.c:440 +msgid "" +" PORT\n" +" server port of the current connection\n" +msgstr "" +" PORT\n" +" porta do servidor da conexão corrente\n" -#: help.c:360 -#, c-format -msgid " SHOW_CONTEXT controls display of message context fields [never, errors, always]\n" -msgstr " SHOW_CONTEXT controla exibição de campos de contexto da mensagem [never, errors, always]\n" +#: help.c:442 +msgid "" +" PROMPT1\n" +" specifies the standard psql prompt\n" +msgstr "" +" PROMPT1\n" +" especifica o prompt padrão do psql\n" -#: help.c:361 -#, c-format -msgid " SINGLELINE end of line terminates SQL command mode (same as -S option)\n" -msgstr " SINGLELINE modo cujo fim da linha termina comando SQL (mesmo que a opção -S)\n" +#: help.c:444 +msgid "" +" PROMPT2\n" +" specifies the prompt used when a statement continues from a previous line\n" +msgstr "" +" PROMPT2\n" +" especifica o prompt usado quando uma instrução continua a partir de uma linha anterior\n" -#: help.c:362 -#, c-format -msgid " SINGLESTEP single-step mode (same as -s option)\n" -msgstr " SINGLESTEP modo passo-a-passo (mesmo que a opção -s)\n" +#: help.c:446 +msgid "" +" PROMPT3\n" +" specifies the prompt used during COPY ... FROM STDIN\n" +msgstr "" +" PROMPT3\n" +" especifica o prompt usado durante COPY ... FROM STDIN\n" -#: help.c:363 -#, c-format -msgid " USER the currently connected database user\n" -msgstr " USER o usuário de banco de dados atualmente contectado\n" +#: help.c:448 +msgid "" +" QUIET\n" +" run quietly (same as -q option)\n" +msgstr "" +" QUIET\n" +" executa silenciosamente (o mesmo que a opção -q)\n" -#: help.c:364 -#, c-format -msgid " VERBOSITY controls verbosity of error reports [default, verbose, terse]\n" -msgstr " VERBOSITY controla detalhamento das mensagens de erro [default, verbose, terse]\n" +#: help.c:450 +msgid "" +" ROW_COUNT\n" +" number of rows returned or affected by last query, or 0\n" +msgstr "" +" ROW_COUNT\n" +" número de linhas retornadas ou afetadas pela última consulta, ou 0\n" -#: help.c:366 -#, c-format +#: help.c:452 +msgid "" +" SERVER_VERSION_NAME\n" +" SERVER_VERSION_NUM\n" +" server's version (in short string or numeric format)\n" +msgstr "" +" SERVER_VERSION_NAME\n" +" SERVER_VERSION_NUM\n" +" versão do servidor (uma cadeia de caracteres curta, ou formato numérico)\n" + +#: help.c:455 +msgid "" +" SHELL_ERROR\n" +" \"true\" if the last shell command failed, \"false\" if it succeeded\n" +msgstr "" +" SHELL_ERROR\n" +" \"true\" se o último comando shell falhou, \"false\" se foi bem sucedido\n" + +#: help.c:457 +msgid "" +" SHELL_EXIT_CODE\n" +" exit status of the last shell command\n" +msgstr "" +" SHELL_EXIT_CODE\n" +" status de saída do último comando shell\n" + +#: help.c:459 +msgid "" +" SHOW_ALL_RESULTS\n" +" show all results of a combined query (\\;) instead of only the last\n" +msgstr "" +" SHOW_ALL_RESULTS\n" +" mostra todos os resultados de uma consulta combinada (\\;) em vez de somente o último\n" + +#: help.c:461 +msgid "" +" SHOW_CONTEXT\n" +" controls display of message context fields [never, errors, always]\n" +msgstr "" +" SHOW_CONTEXT\n" +" controla a exibição de campos de contexto de mensagem [never, errors, always]\n" + +#: help.c:463 +msgid "" +" SINGLELINE\n" +" if set, end of line terminates SQL commands (same as -S option)\n" +msgstr "" +" SINGLELINE\n" +" se definido, o fim da linha encerra os comandos SQL (o mesmo que a opção -S)\n" + +#: help.c:465 +msgid "" +" SINGLESTEP\n" +" single-step mode (same as -s option)\n" +msgstr "" +" SINGLESTEP\n" +" modo de passo-único (o mesmo que a opção -s)\n" + +#: help.c:467 +msgid "" +" SQLSTATE\n" +" SQLSTATE of last query, or \"00000\" if no error\n" +msgstr "" +" SQLSTATE\n" +" SQLSTATE da última consulta, ou \"00000\" se não houve erro\n" + +#: help.c:469 +msgid "" +" USER\n" +" the currently connected database user\n" +msgstr "" +" USER\n" +" o usuário do banco de dados conectado no momento\n" + +#: help.c:471 +msgid "" +" VERBOSITY\n" +" controls verbosity of error reports [default, verbose, terse, sqlstate]\n" +msgstr "" +" VERBOSITY\n" +" controla a verbosidade dos relatórios de erros [default, verbose, terse, sqlstate]\n" + +#: help.c:473 +msgid "" +" VERSION\n" +" VERSION_NAME\n" +" VERSION_NUM\n" +" psql's version (in verbose string, short string, or numeric format)\n" +msgstr "" +" VERSION\n" +" VERSION_NAME\n" +" VERSION_NUM\n" +" Versão do psql (em cadeia de caracteres detalhada, cadeia de caracteres curta, ou formato numérico)\n" + +#: help.c:478 msgid "" "\n" "Display settings:\n" msgstr "" "\n" -"Exibe configurações:\n" +"Mostra as configurações:\n" -#: help.c:368 -#, c-format +#: help.c:480 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -2885,109 +3615,151 @@ msgstr "" " ou \\pset NOME [VALOR] no psql\n" "\n" -#: help.c:370 -#, c-format -msgid " border border style (number)\n" -msgstr " border estilo de borda (número)\n" +#: help.c:482 +msgid "" +" border\n" +" border style (number)\n" +msgstr "" +" border\n" +" estilo de borda (número)\n" -#: help.c:371 -#, c-format -msgid " columns target width for the wrapped format\n" -msgstr " columns largura para o formato de quebra automática\n" +#: help.c:484 +msgid "" +" columns\n" +" target width for the wrapped format\n" +msgstr "" +" columns\n" +" largura desejada para formato emoldurado\n" -#: help.c:372 -#, c-format -msgid " expanded (or x) expanded output [on, off, auto]\n" -msgstr " expanded (ou x) saída em tabela expandida [on, off, auto]\n" +#: help.c:486 +msgid "" +" expanded (or x)\n" +" expanded output [on, off, auto]\n" +msgstr "" +" expanded (or x)\n" +" saída expandida [on, off, auto]\n" -#: help.c:373 +#: help.c:488 #, c-format -msgid " fieldsep field separator for unaligned output (default \"%s\")\n" -msgstr " fieldsep separador de campos para modo de saída desalinhado (padrão \"%s\")\n" +msgid "" +" fieldsep\n" +" field separator for unaligned output (default \"%s\")\n" +msgstr "" +" fieldsep\n" +" separador de campos para saída não alinhada (padrão \"%s\")\n" -#: help.c:374 -#, c-format -msgid " fieldsep_zero set field separator for unaligned output to zero byte\n" -msgstr " fieldsep_zero define separador de campos para modo de saída desalinhado como byte zero\n" +#: help.c:491 +msgid "" +" fieldsep_zero\n" +" set field separator for unaligned output to a zero byte\n" +msgstr "" +" fieldsep_zero\n" +" define o separador de campos para a saída não alinhada como o byte zero\n" -#: help.c:375 -#, c-format -msgid " footer enable or disable display of the table footer [on, off]\n" -msgstr " footer habilita ou desabilita a exibição do rodapé da tabela [on, off]\n" +#: help.c:493 +msgid "" +" footer\n" +" enable or disable display of the table footer [on, off]\n" +msgstr "" +" footer\n" +" ativa ou desativr a exibição do rodapé da tabela [on, off]\n" -#: help.c:376 -#, c-format -msgid " format set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -msgstr " format define formato de saída [unaligned, aligned, wrapped, html, asciidoc, ...]\n" +#: help.c:495 +msgid "" +" format\n" +" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" +msgstr "" +" format\n" +" define o formato de saída [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:377 -#, c-format -msgid " linestyle set the border line drawing style [ascii, old-ascii, unicode]\n" -msgstr " linestyle define o estilo de linha da borda [ascii, old-ascii, unicode]\n" +#: help.c:497 +msgid "" +" linestyle\n" +" set the border line drawing style [ascii, old-ascii, unicode]\n" +msgstr "" +" linestyle\n" +" define o estilo de desenho da linha de borda [ascii, old-ascii, unicode]\n" -#: help.c:378 -#, c-format -msgid " null set the string to be printed in place of a null value\n" -msgstr " null define a cadeia de caracteres a ser impressa no lugar do valor nulo\n" +#: help.c:499 +msgid "" +" null\n" +" set the string to be printed in place of a null value\n" +msgstr "" +" null\n" +" define a cadeia de caracteres a ser impressa no lugar de um valor nulo\n" -#: help.c:379 -#, c-format +#: help.c:501 msgid "" -" numericlocale enable or disable display of a locale-specific character to separate\n" -" groups of digits [on, off]\n" +" numericlocale\n" +" enable display of a locale-specific character to separate groups of digits\n" msgstr "" -" numericlocale habilita e desabilita a exibição de um caracter definido pela configuração regional\n" -" para separar grupos de dígitos [on, off]\n" +" numericlocale\n" +" ativa a exibição de um caractere específico de localidade para separar grupos de dígitos\n" -#: help.c:381 -#, c-format -msgid " pager control when an external pager is used [yes, no, always]\n" -msgstr " pager controla quando um paginador externo é utilizado [yes, no, always]\n" +#: help.c:503 +msgid "" +" pager\n" +" control when an external pager is used [yes, no, always]\n" +msgstr "" +" pager\n" +" controla quando um paginador externo é usado [yes, no, always]\n" -#: help.c:382 -#, c-format -msgid " recordsep record (line) separator for unaligned output\n" -msgstr " recordsep separador de registros para modo de saída desalinhado\n" +#: help.c:505 +msgid "" +" recordsep\n" +" record (line) separator for unaligned output\n" +msgstr "" +" recordsep\n" +" separador de registro (linha) para a saída não alinhada\n" -#: help.c:383 -#, c-format -msgid " recordsep_zero set record separator for unaligned output to zero byte\n" -msgstr " recordsep_zero define separador de registros para modo de saída desalinhado como byte zero\n" +#: help.c:507 +msgid "" +" recordsep_zero\n" +" set record separator for unaligned output to a zero byte\n" +msgstr "" +" recordsep_zero\n" +" define o separador de registro para a saída não alinhada como o byte zero\n" -#: help.c:384 -#, c-format +#: help.c:509 msgid "" -" tableattr (or T) specify attributes for table tag in html format or proportional\n" -" column widths for left-aligned data types in latex-longtable format\n" +" tableattr (or T)\n" +" specify attributes for table tag in html format, or proportional\n" +" column widths for left-aligned data types in latex-longtable format\n" msgstr "" -" tableattr (ou T) especifica atributos para marcador table no formato html ou larguras de\n" -" colunas proporcionais para tipos de dados alinhados à esquerda no formato latex-longtable\n" +" tableattr (or T)\n" +" especifica os atributos para o marcador de tabela no formato html,\n" +" ou larguras de coluna proporcionais para tipos de dados alinhados\n" +" à esquerda no formato latex-longtable\n" -#: help.c:386 -#, c-format -msgid " title set the table title for any subsequently printed tables\n" -msgstr " title define o título da tabela para as próximas tabelas a serem exibidas\n" +#: help.c:512 +msgid "" +" title\n" +" set the table title for subsequently printed tables\n" +msgstr "" +" title\n" +" define o título da tabela para as tabelas impressas posteriormente\n" -#: help.c:387 -#, c-format -msgid " tuples_only if set, only actual table data is shown\n" -msgstr " tuples_only se definido, somente dados da tabela atual são mostrados\n" +#: help.c:514 +msgid "" +" tuples_only\n" +" if set, only actual table data is shown\n" +msgstr "" +" tuples_only\n" +" se definido, serão mostrados somente os dados reais da tabela\n" -#: help.c:388 -#, c-format +#: help.c:516 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" " unicode_header_linestyle\n" -" set the style of Unicode line drawing [single, double]\n" +" set the style of Unicode line drawing [single, double]\n" msgstr "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" " unicode_header_linestyle\n" -" define o estilo de linha Unicode [single, double]\n" +" define o estilo do desenho de linha Unicode [single, double]\n" -#: help.c:393 -#, c-format +#: help.c:521 msgid "" "\n" "Environment variables:\n" @@ -2995,8 +3767,7 @@ msgstr "" "\n" "Variáveis de ambiente:\n" -#: help.c:397 -#, c-format +#: help.c:525 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3006,8 +3777,7 @@ msgstr "" " ou \\setenv NOME [VALOR] no psql\n" "\n" -#: help.c:399 -#, c-format +#: help.c:527 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3018,94 +3788,139 @@ msgstr "" " ou \\setenv NOME [VALOR] no psql\n" "\n" -#: help.c:402 -#, c-format -msgid " COLUMNS number of columns for wrapped format\n" -msgstr " COLUMNS número de colunas para formato de quebra automática\n" - -#: help.c:403 -#, c-format -msgid " PAGER name of external pager program\n" -msgstr " PAGER nome do programa de paginação externo\n" +#: help.c:530 +msgid "" +" COLUMNS\n" +" number of columns for wrapped format\n" +msgstr "" +" COLUMNS\n" +" número de colunas para formato encapsulado\n" -#: help.c:404 -#, c-format -msgid " PGAPPNAME same as the application_name connection parameter\n" -msgstr " PGAPPNAME mesmo que o parâmetro de conexão application_name\n" +#: help.c:532 +msgid "" +" PGAPPNAME\n" +" same as the application_name connection parameter\n" +msgstr "" +" PGAPPNAME\n" +" o mesmo que o parâmetro de conexão application_name\n" -#: help.c:405 -#, c-format -msgid " PGDATABASE same as the dbname connection parameter\n" -msgstr " PGDATABASE mesmo que o parâmetro de conexão dbname\n" +#: help.c:534 +msgid "" +" PGDATABASE\n" +" same as the dbname connection parameter\n" +msgstr "" +" PGDATABASE\n" +" o mesmo que o parâmetro de conexão dbname\n" -#: help.c:406 -#, c-format -msgid " PGHOST same as the host connection parameter\n" -msgstr " PGHOST mesmo que o parâmetro de conexão host\n" +#: help.c:536 +msgid "" +" PGHOST\n" +" same as the host connection parameter\n" +msgstr "" +" PGHOST\n" +" o mesmo que o parâmetro de conexão do hospedeiro\n" -#: help.c:407 -#, c-format -msgid " PGPORT same as the port connection parameter\n" -msgstr " PGPORT mesmo que o parâmetro de conexão port\n" +#: help.c:538 +msgid "" +" PGPASSFILE\n" +" password file name\n" +msgstr "" +" PGPASSFILE\n" +" o nome do arquivo de senhas\n" -#: help.c:408 -#, c-format -msgid " PGUSER same as the user connection parameter\n" -msgstr " PGUSER mesmo que o parâmetro de conexão user\n" +#: help.c:540 +msgid "" +" PGPASSWORD\n" +" connection password (not recommended)\n" +msgstr "" +" PGPASSWORD\n" +" senha de conexão (não recomendado)\n" -#: help.c:409 -#, c-format -msgid " PGPASSWORD connection password (not recommended)\n" -msgstr " PGPASSWORD senha da conexão (não é recomendado)\n" +#: help.c:542 +msgid "" +" PGPORT\n" +" same as the port connection parameter\n" +msgstr "" +" PGPORT\n" +" o mesmo que o parâmetro de conexão da porta\n" -#: help.c:410 -#, c-format -msgid " PGPASSFILE password file name\n" -msgstr " PGPASSFILE nome do arquivo de senhas\n" +#: help.c:544 +msgid "" +" PGUSER\n" +" same as the user connection parameter\n" +msgstr "" +" PGUSER\n" +" o mesmo que o parâmetro de conexão do usuário\n" -#: help.c:411 -#, c-format +#: help.c:546 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" -" editor used by the \\e, \\ef, and \\ev commands\n" +" editor used by the \\e, \\ef, and \\ev commands\n" msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" -" editor utilizado pelos comandos \\e, \\ef e \\ev\n" +" editor usado pelos comandos \\e, \\ef e \\ev\n" -#: help.c:413 -#, c-format +#: help.c:548 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" -" how to specify a line number when invoking the editor\n" +" how to specify a line number when invoking the editor\n" msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" -" como especificar um número de linha ao invocar o editor\n" +" como especificar um número de linha ao chamar o editor\n" -#: help.c:415 -#, c-format -msgid " PSQL_HISTORY alternative location for the command history file\n" -msgstr " PSQL_HISTORY local alternativo para arquivo de histórico de comandos\n" +#: help.c:550 +msgid "" +" PSQL_HISTORY\n" +" alternative location for the command history file\n" +msgstr "" +" PSQL_HISTORY\n" +" local alternativo para o arquivo de histórico de comandos\n" -#: help.c:416 -#, c-format -msgid " PSQLRC alternative location for the user's .psqlrc file\n" -msgstr " PSQLRC local alternativo para arquivo .psqlrc do usuário\n" +#: help.c:552 +msgid "" +" PSQL_PAGER, PAGER\n" +" name of external pager program\n" +msgstr "" +" PSQL_PAGER, PAGER\n" +" nome do programa paginador externo\n" -#: help.c:417 -#, c-format -msgid " SHELL shell used by the \\! command\n" -msgstr " SHELL shell utilizada pelo comando \\!\n" +#: help.c:555 +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_WATCH_PAGER\n" +" nome do programa paginador externo usado para \\watch\n" + +#: help.c:558 +msgid "" +" PSQLRC\n" +" alternative location for the user's .psqlrc file\n" +msgstr "" +" PSQLRC\n" +" local alternativo para o arquivo .psqlrc do usuário\n" + +#: help.c:560 +msgid "" +" SHELL\n" +" shell used by the \\! command\n" +msgstr "" +" SHELL\n" +" interpretador de comandos usado pelo comando \\!\n" -#: help.c:418 -#, c-format -msgid " TMPDIR directory for temporary files\n" -msgstr " TMPDIR diretório para arquivos temporários\n" +#: help.c:562 +msgid "" +" TMPDIR\n" +" directory for temporary files\n" +msgstr "" +" TMPDIR\n" +" diretório para arquivos temporários\n" -#: help.c:461 +#: help.c:622 msgid "Available help:\n" msgstr "Ajuda disponível:\n" -#: help.c:545 +#: help.c:717 #, c-format msgid "" "Command: %s\n" @@ -3113,14 +3928,18 @@ msgid "" "Syntax:\n" "%s\n" "\n" +"URL: %s\n" +"\n" msgstr "" -"Comando: %s\n" -"Descrição: %s\n" +"Comando: %s\n" +"Descrição: %s\n" "Sintaxe:\n" "%s\n" "\n" +"URL: %s\n" +"\n" -#: help.c:561 +#: help.c:740 #, c-format msgid "" "No help available for \"%s\".\n" @@ -3131,48 +3950,45 @@ msgstr "" #: input.c:216 #, c-format -msgid "could not read from input file: %s\n" -msgstr "não pôde ler arquivo de entrada: %s\n" +msgid "could not read from input file: %m" +msgstr "não foi possível ler o arquivo de entrada: %m" -#: input.c:471 input.c:510 +#: input.c:477 input.c:515 #, c-format -msgid "could not save history to file \"%s\": %s\n" -msgstr "não pôde gravar histórico no arquivo \"%s\": %s\n" +msgid "could not save history to file \"%s\": %m" +msgstr "não foi possível salvar o histórico no arquivo \"%s\": %m" -#: input.c:530 +#: input.c:534 #, c-format -msgid "history is not supported by this installation\n" -msgstr "histórico não é suportado por esta instalação\n" +msgid "history is not supported by this installation" +msgstr "o histórico não tem suporte por esta instalação" -#: large_obj.c:64 +#: large_obj.c:65 #, c-format -msgid "%s: not connected to a database\n" -msgstr "%s: não está conectado ao banco de dados\n" +msgid "%s: not connected to a database" +msgstr "%s: não conectado a um banco de dados" -#: large_obj.c:83 +#: large_obj.c:84 #, c-format -msgid "%s: current transaction is aborted\n" -msgstr "%s: transação atual foi interrompida\n" +msgid "%s: current transaction is aborted" +msgstr "%s: a transação corrente foi interrompida" -#: large_obj.c:86 +#: large_obj.c:87 #, c-format -msgid "%s: unknown transaction status\n" -msgstr "%s: status da transação é desconhecido\n" +msgid "%s: unknown transaction status" +msgstr "%s: status da transação é desconhecido" -#: large_obj.c:287 large_obj.c:298 -msgid "ID" -msgstr "ID" - -#: large_obj.c:308 -msgid "Large objects" -msgstr "Objetos grandes" +#: mainloop.c:133 +#, c-format +msgid "\\if: escaped" +msgstr "\\if: escapado" -#: mainloop.c:168 +#: mainloop.c:192 #, c-format msgid "Use \"\\q\" to leave %s.\n" msgstr "Use \"\\q\" para sair do %s.\n" -#: mainloop.c:190 +#: mainloop.c:214 msgid "" "The input is a PostgreSQL custom-format dump.\n" "Use the pg_restore command-line client to restore this dump to a database.\n" @@ -3180,11 +3996,19 @@ msgstr "" "A entrada é uma cópia de segurança no formato personalizado do PostgreSQL.\n" "Utilize o cliente de linha de comando pg_restore para restaurar essa cópia de segurança para um banco de dados.\n" -#: mainloop.c:210 +#: mainloop.c:295 +msgid "Use \\? for help or press control-C to clear the input buffer." +msgstr "Use \\? para obter ajuda, ou tecle Ctrl-C para limpar o buffer de entrada." + +#: mainloop.c:297 +msgid "Use \\? for help." +msgstr "Use \\? para obter ajuda." + +#: mainloop.c:301 msgid "You are using psql, the command-line interface to PostgreSQL." -msgstr "Você está utilizando o psql, um cliente de linha de comando do PostgreSQL." +msgstr "Você está usando o psql, um cliente de linha de comando do PostgreSQL." -#: mainloop.c:211 +#: mainloop.c:302 #, c-format msgid "" "Type: \\copyright for distribution terms\n" @@ -3199,2097 +4023,2539 @@ msgstr "" " \\g ou terminar com ponto-e-vírgula para executar a consulta\n" " \\q para sair\n" -#: psqlscanslash.l:584 -#, c-format -msgid "unterminated quoted string\n" -msgstr "cadeia de caracteres entre aspas não foi terminada\n" - -#: psqlscanslash.l:738 -#, c-format -msgid "%s: out of memory\n" -msgstr "%s: sem memória\n" - -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:64 sql_help.c:66 -#: sql_help.c:68 sql_help.c:79 sql_help.c:81 sql_help.c:83 sql_help.c:109 -#: sql_help.c:115 sql_help.c:117 sql_help.c:119 sql_help.c:121 sql_help.c:124 -#: sql_help.c:126 sql_help.c:128 sql_help.c:221 sql_help.c:223 sql_help.c:224 -#: sql_help.c:226 sql_help.c:228 sql_help.c:231 sql_help.c:233 sql_help.c:235 -#: sql_help.c:237 sql_help.c:249 sql_help.c:250 sql_help.c:251 sql_help.c:253 -#: sql_help.c:300 sql_help.c:302 sql_help.c:304 sql_help.c:306 sql_help.c:367 -#: sql_help.c:372 sql_help.c:374 sql_help.c:417 sql_help.c:419 sql_help.c:422 -#: sql_help.c:424 sql_help.c:491 sql_help.c:496 sql_help.c:501 sql_help.c:506 -#: sql_help.c:511 sql_help.c:560 sql_help.c:562 sql_help.c:564 sql_help.c:566 -#: sql_help.c:569 sql_help.c:571 sql_help.c:582 sql_help.c:584 sql_help.c:626 -#: sql_help.c:628 sql_help.c:630 sql_help.c:633 sql_help.c:635 sql_help.c:637 -#: sql_help.c:671 sql_help.c:675 sql_help.c:679 sql_help.c:698 sql_help.c:701 -#: sql_help.c:704 sql_help.c:733 sql_help.c:745 sql_help.c:753 sql_help.c:756 -#: sql_help.c:759 sql_help.c:774 sql_help.c:777 sql_help.c:821 sql_help.c:844 -#: sql_help.c:855 sql_help.c:857 sql_help.c:874 sql_help.c:883 sql_help.c:885 -#: sql_help.c:887 sql_help.c:899 sql_help.c:903 sql_help.c:905 sql_help.c:989 -#: sql_help.c:991 sql_help.c:994 sql_help.c:997 sql_help.c:999 sql_help.c:1001 -#: sql_help.c:1062 sql_help.c:1064 sql_help.c:1066 sql_help.c:1069 -#: sql_help.c:1090 sql_help.c:1093 sql_help.c:1096 sql_help.c:1099 -#: sql_help.c:1103 sql_help.c:1105 sql_help.c:1107 sql_help.c:1109 -#: sql_help.c:1123 sql_help.c:1126 sql_help.c:1128 sql_help.c:1130 -#: sql_help.c:1140 sql_help.c:1142 sql_help.c:1152 sql_help.c:1154 -#: sql_help.c:1164 sql_help.c:1167 sql_help.c:1188 sql_help.c:1190 -#: sql_help.c:1192 sql_help.c:1195 sql_help.c:1197 sql_help.c:1199 -#: sql_help.c:1249 sql_help.c:1287 sql_help.c:1290 sql_help.c:1292 -#: sql_help.c:1294 sql_help.c:1296 sql_help.c:1298 sql_help.c:1301 -#: sql_help.c:1341 sql_help.c:1546 sql_help.c:1610 sql_help.c:1629 -#: sql_help.c:1642 sql_help.c:1696 sql_help.c:1700 sql_help.c:1710 -#: sql_help.c:1730 sql_help.c:1755 sql_help.c:1773 sql_help.c:1802 -#: sql_help.c:1877 sql_help.c:1919 sql_help.c:1941 sql_help.c:1961 -#: sql_help.c:1962 sql_help.c:1997 sql_help.c:2017 sql_help.c:2039 -#: sql_help.c:2052 sql_help.c:2083 sql_help.c:2108 sql_help.c:2152 -#: sql_help.c:2338 sql_help.c:2351 sql_help.c:2368 sql_help.c:2384 -#: sql_help.c:2423 sql_help.c:2474 sql_help.c:2478 sql_help.c:2480 -#: sql_help.c:2486 sql_help.c:2504 sql_help.c:2531 sql_help.c:2566 -#: sql_help.c:2578 sql_help.c:2587 sql_help.c:2631 sql_help.c:2645 -#: sql_help.c:2673 sql_help.c:2681 sql_help.c:2689 sql_help.c:2697 -#: sql_help.c:2705 sql_help.c:2713 sql_help.c:2721 sql_help.c:2729 -#: sql_help.c:2738 sql_help.c:2749 sql_help.c:2757 sql_help.c:2765 -#: sql_help.c:2773 sql_help.c:2781 sql_help.c:2791 sql_help.c:2800 -#: sql_help.c:2809 sql_help.c:2817 sql_help.c:2826 sql_help.c:2834 -#: sql_help.c:2843 sql_help.c:2851 sql_help.c:2859 sql_help.c:2867 -#: sql_help.c:2875 sql_help.c:2883 sql_help.c:2891 sql_help.c:2899 -#: sql_help.c:2907 sql_help.c:2924 sql_help.c:2933 sql_help.c:2941 -#: sql_help.c:2958 sql_help.c:2973 sql_help.c:3238 sql_help.c:3289 -#: sql_help.c:3318 sql_help.c:3326 sql_help.c:3745 sql_help.c:3793 -#: sql_help.c:3934 +#: mainloop.c:326 +msgid "Use \\q to quit." +msgstr "Use \\q para sair." + +#: mainloop.c:329 mainloop.c:353 +msgid "Use control-D to quit." +msgstr "Use Ctrl-D para sair." + +#: mainloop.c:331 mainloop.c:355 +msgid "Use control-C to quit." +msgstr "Use Ctrl-C para sair." + +#: mainloop.c:459 mainloop.c:618 +#, c-format +msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block" +msgstr "consulta ignorada; use \\endif ou Ctrl-C para sair do bloco \\if corrente" + +#: mainloop.c:636 +#, c-format +msgid "reached EOF without finding closing \\endif(s)" +msgstr "atingido EOF sem encontrar \\endif(s) de fechamento" + +#: psqlscanslash.l:640 +#, c-format +msgid "unterminated quoted string" +msgstr "a cadeia de caracteres entre aspas não foi terminada" + +#: psqlscanslash.l:825 +#, c-format +msgid "%s: out of memory" +msgstr "%s: sem memória" + +#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 +#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 +#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238 +#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248 +#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267 +#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323 +#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443 +#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524 +#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595 +#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606 +#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668 +#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714 +#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747 +#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802 +#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859 +#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900 +#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999 +#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 +#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071 +#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086 +#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116 +#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141 +#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 +#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163 +#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1307 sql_help.c:1309 +#: sql_help.c:1312 sql_help.c:1315 sql_help.c:1317 sql_help.c:1319 +#: sql_help.c:1322 sql_help.c:1325 sql_help.c:1442 sql_help.c:1444 +#: sql_help.c:1446 sql_help.c:1449 sql_help.c:1470 sql_help.c:1473 +#: sql_help.c:1476 sql_help.c:1479 sql_help.c:1483 sql_help.c:1485 +#: sql_help.c:1487 sql_help.c:1489 sql_help.c:1503 sql_help.c:1506 +#: sql_help.c:1508 sql_help.c:1510 sql_help.c:1520 sql_help.c:1522 +#: sql_help.c:1532 sql_help.c:1534 sql_help.c:1544 sql_help.c:1547 +#: sql_help.c:1570 sql_help.c:1572 sql_help.c:1574 sql_help.c:1576 +#: sql_help.c:1579 sql_help.c:1581 sql_help.c:1584 sql_help.c:1587 +#: sql_help.c:1638 sql_help.c:1681 sql_help.c:1684 sql_help.c:1686 +#: sql_help.c:1688 sql_help.c:1691 sql_help.c:1693 sql_help.c:1695 +#: sql_help.c:1698 sql_help.c:1750 sql_help.c:1766 sql_help.c:1999 +#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2100 sql_help.c:2158 +#: sql_help.c:2166 sql_help.c:2176 sql_help.c:2203 sql_help.c:2235 +#: sql_help.c:2253 sql_help.c:2281 sql_help.c:2392 sql_help.c:2438 +#: sql_help.c:2463 sql_help.c:2486 sql_help.c:2490 sql_help.c:2524 +#: sql_help.c:2544 sql_help.c:2566 sql_help.c:2580 sql_help.c:2601 +#: sql_help.c:2630 sql_help.c:2665 sql_help.c:2690 sql_help.c:2737 +#: sql_help.c:3032 sql_help.c:3045 sql_help.c:3062 sql_help.c:3078 +#: sql_help.c:3118 sql_help.c:3172 sql_help.c:3176 sql_help.c:3178 +#: sql_help.c:3185 sql_help.c:3204 sql_help.c:3231 sql_help.c:3266 +#: sql_help.c:3278 sql_help.c:3287 sql_help.c:3331 sql_help.c:3345 +#: sql_help.c:3373 sql_help.c:3381 sql_help.c:3393 sql_help.c:3403 +#: sql_help.c:3411 sql_help.c:3419 sql_help.c:3427 sql_help.c:3435 +#: sql_help.c:3444 sql_help.c:3455 sql_help.c:3463 sql_help.c:3471 +#: sql_help.c:3479 sql_help.c:3487 sql_help.c:3497 sql_help.c:3506 +#: sql_help.c:3515 sql_help.c:3523 sql_help.c:3533 sql_help.c:3544 +#: sql_help.c:3552 sql_help.c:3561 sql_help.c:3572 sql_help.c:3581 +#: sql_help.c:3589 sql_help.c:3597 sql_help.c:3605 sql_help.c:3613 +#: sql_help.c:3621 sql_help.c:3629 sql_help.c:3637 sql_help.c:3645 +#: sql_help.c:3653 sql_help.c:3661 sql_help.c:3678 sql_help.c:3687 +#: sql_help.c:3695 sql_help.c:3712 sql_help.c:3727 sql_help.c:4039 +#: sql_help.c:4149 sql_help.c:4178 sql_help.c:4194 sql_help.c:4196 +#: sql_help.c:4699 sql_help.c:4747 sql_help.c:4905 msgid "name" msgstr "nome" -#: sql_help.c:37 sql_help.c:40 sql_help.c:43 sql_help.c:311 sql_help.c:1407 -#: sql_help.c:2646 sql_help.c:3541 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1847 +#: sql_help.c:3346 sql_help.c:4467 msgid "aggregate_signature" msgstr "assinatura_agregação" -#: sql_help.c:38 sql_help.c:65 sql_help.c:80 sql_help.c:116 sql_help.c:236 -#: sql_help.c:254 sql_help.c:375 sql_help.c:423 sql_help.c:500 sql_help.c:546 -#: sql_help.c:561 sql_help.c:583 sql_help.c:634 sql_help.c:700 sql_help.c:755 -#: sql_help.c:776 sql_help.c:822 sql_help.c:846 sql_help.c:856 sql_help.c:886 -#: sql_help.c:906 sql_help.c:998 sql_help.c:1063 sql_help.c:1106 -#: sql_help.c:1127 sql_help.c:1141 sql_help.c:1153 sql_help.c:1166 -#: sql_help.c:1196 sql_help.c:1250 sql_help.c:1295 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253 +#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576 +#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798 +#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008 +#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105 +#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1316 sql_help.c:1443 +#: sql_help.c:1486 sql_help.c:1507 sql_help.c:1521 sql_help.c:1533 +#: sql_help.c:1546 sql_help.c:1573 sql_help.c:1639 sql_help.c:1692 msgid "new_name" msgstr "novo_nome" -#: sql_help.c:41 sql_help.c:67 sql_help.c:82 sql_help.c:118 sql_help.c:234 -#: sql_help.c:252 sql_help.c:373 sql_help.c:459 sql_help.c:505 sql_help.c:585 -#: sql_help.c:594 sql_help.c:653 sql_help.c:674 sql_help.c:703 sql_help.c:758 -#: sql_help.c:858 sql_help.c:884 sql_help.c:904 sql_help.c:1047 -#: sql_help.c:1065 sql_help.c:1108 sql_help.c:1129 sql_help.c:1191 -#: sql_help.c:1293 sql_help.c:2324 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251 +#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623 +#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801 +#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 +#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 +#: sql_help.c:1380 sql_help.c:1445 sql_help.c:1488 sql_help.c:1509 +#: sql_help.c:1571 sql_help.c:1687 sql_help.c:3018 msgid "new_owner" msgstr "novo_dono" -#: sql_help.c:44 sql_help.c:69 sql_help.c:84 sql_help.c:238 sql_help.c:303 -#: sql_help.c:425 sql_help.c:510 sql_help.c:636 sql_help.c:678 sql_help.c:706 -#: sql_help.c:761 sql_help.c:888 sql_help.c:1000 sql_help.c:1110 -#: sql_help.c:1131 sql_help.c:1143 sql_help.c:1155 sql_help.c:1198 -#: sql_help.c:1297 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322 +#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749 +#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087 +#: sql_help.c:1121 sql_help.c:1318 sql_help.c:1490 sql_help.c:1511 +#: sql_help.c:1523 sql_help.c:1535 sql_help.c:1575 sql_help.c:1694 msgid "new_schema" msgstr "novo_esquema" -#: sql_help.c:45 sql_help.c:1460 sql_help.c:2647 sql_help.c:3560 +#: sql_help.c:44 sql_help.c:1911 sql_help.c:3347 sql_help.c:4496 msgid "where aggregate_signature is:" msgstr "onde assinatura_agregação é:" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:321 sql_help.c:346 -#: sql_help.c:349 sql_help.c:352 sql_help.c:492 sql_help.c:497 sql_help.c:502 -#: sql_help.c:507 sql_help.c:512 sql_help.c:1425 sql_help.c:1461 -#: sql_help.c:1464 sql_help.c:1467 sql_help.c:1611 sql_help.c:1630 -#: sql_help.c:1633 sql_help.c:1878 sql_help.c:2648 sql_help.c:2651 -#: sql_help.c:2654 sql_help.c:2739 sql_help.c:3124 sql_help.c:3456 -#: sql_help.c:3547 sql_help.c:3561 sql_help.c:3564 sql_help.c:3567 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353 +#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520 +#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 +#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 +#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 +#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912 +#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2069 sql_help.c:2088 +#: sql_help.c:2091 sql_help.c:2393 sql_help.c:2602 sql_help.c:3348 +#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3445 sql_help.c:3534 +#: sql_help.c:3562 sql_help.c:3914 sql_help.c:4366 sql_help.c:4473 +#: sql_help.c:4480 sql_help.c:4486 sql_help.c:4497 sql_help.c:4500 +#: sql_help.c:4503 msgid "argmode" msgstr "modo_argumento" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:322 sql_help.c:347 -#: sql_help.c:350 sql_help.c:353 sql_help.c:493 sql_help.c:498 sql_help.c:503 -#: sql_help.c:508 sql_help.c:513 sql_help.c:1426 sql_help.c:1462 -#: sql_help.c:1465 sql_help.c:1468 sql_help.c:1612 sql_help.c:1631 -#: sql_help.c:1634 sql_help.c:1879 sql_help.c:2649 sql_help.c:2652 -#: sql_help.c:2655 sql_help.c:2740 sql_help.c:3548 sql_help.c:3562 -#: sql_help.c:3565 sql_help.c:3568 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354 +#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 +#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 +#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 +#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 +#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 +#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089 +#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349 +#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535 +#: sql_help.c:3563 sql_help.c:4474 sql_help.c:4481 sql_help.c:4487 +#: sql_help.c:4498 sql_help.c:4501 sql_help.c:4504 msgid "argname" msgstr "nome_argumento" -#: sql_help.c:48 sql_help.c:51 sql_help.c:54 sql_help.c:323 sql_help.c:348 -#: sql_help.c:351 sql_help.c:354 sql_help.c:494 sql_help.c:499 sql_help.c:504 -#: sql_help.c:509 sql_help.c:514 sql_help.c:1427 sql_help.c:1463 -#: sql_help.c:1466 sql_help.c:1469 sql_help.c:1880 sql_help.c:2650 -#: sql_help.c:2653 sql_help.c:2656 sql_help.c:2741 sql_help.c:3549 -#: sql_help.c:3563 sql_help.c:3566 sql_help.c:3569 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355 +#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 +#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 +#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 +#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 +#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914 +#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2395 sql_help.c:2604 +#: sql_help.c:3350 sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 +#: sql_help.c:3536 sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 +#: sql_help.c:4488 sql_help.c:4499 sql_help.c:4502 sql_help.c:4505 msgid "argtype" msgstr "tipo_argumento" -#: sql_help.c:110 sql_help.c:370 sql_help.c:448 sql_help.c:460 sql_help.c:816 -#: sql_help.c:901 sql_help.c:1124 sql_help.c:1244 sql_help.c:1272 -#: sql_help.c:1517 sql_help.c:1523 sql_help.c:1805 sql_help.c:1837 -#: sql_help.c:1844 sql_help.c:1920 sql_help.c:2084 sql_help.c:2173 -#: sql_help.c:2353 sql_help.c:2532 sql_help.c:2554 sql_help.c:2992 -#: sql_help.c:3158 +#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 +#: sql_help.c:1100 sql_help.c:1504 sql_help.c:1633 sql_help.c:1665 +#: sql_help.c:1718 sql_help.c:1782 sql_help.c:1969 sql_help.c:1976 +#: sql_help.c:2284 sql_help.c:2334 sql_help.c:2341 sql_help.c:2350 +#: sql_help.c:2439 sql_help.c:2666 sql_help.c:2759 sql_help.c:3047 +#: sql_help.c:3232 sql_help.c:3254 sql_help.c:3394 sql_help.c:3750 +#: sql_help.c:3958 sql_help.c:4193 sql_help.c:4195 sql_help.c:4972 msgid "option" msgstr "opção" -#: sql_help.c:111 sql_help.c:817 sql_help.c:1245 sql_help.c:1921 -#: sql_help.c:2085 sql_help.c:2533 +#: sql_help.c:115 sql_help.c:950 sql_help.c:1634 sql_help.c:2440 +#: sql_help.c:2667 sql_help.c:3233 sql_help.c:3395 msgid "where option can be:" msgstr "onde opção pode ser:" -#: sql_help.c:112 sql_help.c:1737 +#: sql_help.c:116 sql_help.c:2216 msgid "allowconn" msgstr "permite_conexão" -#: sql_help.c:113 sql_help.c:818 sql_help.c:1246 sql_help.c:1738 -#: sql_help.c:2086 sql_help.c:2534 +#: sql_help.c:117 sql_help.c:951 sql_help.c:1635 sql_help.c:2217 +#: sql_help.c:2441 sql_help.c:2668 sql_help.c:3234 msgid "connlimit" msgstr "limite_conexão" -#: sql_help.c:114 sql_help.c:1739 +#: sql_help.c:118 sql_help.c:2218 msgid "istemplate" msgstr "é_modelo" -#: sql_help.c:120 sql_help.c:573 sql_help.c:639 sql_help.c:654 sql_help.c:1003 -#: sql_help.c:1040 +#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1321 +#: sql_help.c:1373 sql_help.c:4199 msgid "new_tablespace" -msgstr "nova_tablespace" - -#: sql_help.c:122 sql_help.c:125 sql_help.c:127 sql_help.c:519 sql_help.c:521 -#: sql_help.c:522 sql_help.c:825 sql_help.c:829 sql_help.c:832 sql_help.c:917 -#: sql_help.c:920 sql_help.c:1252 sql_help.c:1255 sql_help.c:1257 -#: sql_help.c:1889 sql_help.c:3343 sql_help.c:3734 +msgstr "novo_espaço_tabelas" + +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550 +#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 +#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 +#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1182 sql_help.c:1642 +#: sql_help.c:1646 sql_help.c:1649 sql_help.c:2405 sql_help.c:2608 +#: sql_help.c:3926 sql_help.c:4217 sql_help.c:4378 sql_help.c:4687 msgid "configuration_parameter" -msgstr "parâmetro_de_configuração" - -#: sql_help.c:123 sql_help.c:371 sql_help.c:443 sql_help.c:449 sql_help.c:461 -#: sql_help.c:520 sql_help.c:568 sql_help.c:645 sql_help.c:651 sql_help.c:826 -#: sql_help.c:902 sql_help.c:918 sql_help.c:919 sql_help.c:1022 -#: sql_help.c:1042 sql_help.c:1068 sql_help.c:1125 sql_help.c:1253 -#: sql_help.c:1273 sql_help.c:1806 sql_help.c:1838 sql_help.c:1845 -#: sql_help.c:1890 sql_help.c:1891 sql_help.c:1949 sql_help.c:1981 -#: sql_help.c:2174 sql_help.c:2248 sql_help.c:2256 sql_help.c:2288 -#: sql_help.c:2310 sql_help.c:2327 sql_help.c:2354 sql_help.c:2555 -#: sql_help.c:3159 sql_help.c:3735 sql_help.c:3736 +msgstr "parâmetro_configuração" + +#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487 +#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876 +#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101 +#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157 +#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1352 +#: sql_help.c:1375 sql_help.c:1423 sql_help.c:1448 sql_help.c:1505 +#: sql_help.c:1589 sql_help.c:1643 sql_help.c:1666 sql_help.c:2285 +#: sql_help.c:2335 sql_help.c:2342 sql_help.c:2351 sql_help.c:2406 +#: sql_help.c:2407 sql_help.c:2471 sql_help.c:2474 sql_help.c:2508 +#: sql_help.c:2609 sql_help.c:2610 sql_help.c:2633 sql_help.c:2760 +#: sql_help.c:2799 sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 +#: sql_help.c:2977 sql_help.c:3004 sql_help.c:3021 sql_help.c:3048 +#: sql_help.c:3255 sql_help.c:3959 sql_help.c:4688 sql_help.c:4689 +#: sql_help.c:4690 sql_help.c:4691 msgid "value" msgstr "valor" -#: sql_help.c:185 +#: sql_help.c:200 msgid "target_role" msgstr "role_alvo" -#: sql_help.c:186 sql_help.c:1789 sql_help.c:2132 sql_help.c:2137 -#: sql_help.c:3106 sql_help.c:3113 sql_help.c:3127 sql_help.c:3133 -#: sql_help.c:3438 sql_help.c:3445 sql_help.c:3459 sql_help.c:3465 +#: sql_help.c:201 sql_help.c:913 sql_help.c:2269 sql_help.c:2638 +#: sql_help.c:2715 sql_help.c:2720 sql_help.c:3889 sql_help.c:3898 +#: sql_help.c:3917 sql_help.c:3929 sql_help.c:4341 sql_help.c:4350 +#: sql_help.c:4369 sql_help.c:4381 msgid "schema_name" msgstr "nome_esquema" -#: sql_help.c:187 +#: sql_help.c:202 msgid "abbreviated_grant_or_revoke" -msgstr "comando_grant_ou_revoke" +msgstr "grant_ou_revoke_abreviado" -#: sql_help.c:188 +#: sql_help.c:203 msgid "where abbreviated_grant_or_revoke is one of:" -msgstr "onde comando_grant_ou_revoke é um dos:" - -#: sql_help.c:189 sql_help.c:190 sql_help.c:191 sql_help.c:192 sql_help.c:193 -#: sql_help.c:194 sql_help.c:195 sql_help.c:196 sql_help.c:544 sql_help.c:572 -#: sql_help.c:638 sql_help.c:779 sql_help.c:836 sql_help.c:1002 -#: sql_help.c:1260 sql_help.c:1924 sql_help.c:1925 sql_help.c:1926 -#: sql_help.c:1927 sql_help.c:1928 sql_help.c:2054 sql_help.c:2089 -#: sql_help.c:2090 sql_help.c:2091 sql_help.c:2092 sql_help.c:2093 -#: sql_help.c:2537 sql_help.c:2538 sql_help.c:2539 sql_help.c:2540 -#: sql_help.c:2541 sql_help.c:3140 sql_help.c:3141 sql_help.c:3142 -#: sql_help.c:3439 sql_help.c:3443 sql_help.c:3446 sql_help.c:3448 -#: sql_help.c:3450 sql_help.c:3452 sql_help.c:3454 sql_help.c:3460 -#: sql_help.c:3462 sql_help.c:3464 sql_help.c:3466 sql_help.c:3468 -#: sql_help.c:3470 sql_help.c:3471 sql_help.c:3472 sql_help.c:3755 +msgstr "onde grant_ou_revoke_abreviado é um dos seguintes:" + +#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 +#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 +#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 +#: sql_help.c:1320 sql_help.c:1653 sql_help.c:2444 sql_help.c:2445 +#: sql_help.c:2446 sql_help.c:2447 sql_help.c:2448 sql_help.c:2582 +#: sql_help.c:2671 sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 +#: sql_help.c:2675 sql_help.c:3237 sql_help.c:3238 sql_help.c:3239 +#: sql_help.c:3240 sql_help.c:3241 sql_help.c:3938 sql_help.c:3942 +#: sql_help.c:4390 sql_help.c:4394 sql_help.c:4709 msgid "role_name" msgstr "nome_role" -#: sql_help.c:222 sql_help.c:436 sql_help.c:1013 sql_help.c:1015 -#: sql_help.c:1289 sql_help.c:1758 sql_help.c:1762 sql_help.c:1848 -#: sql_help.c:1852 sql_help.c:1945 sql_help.c:2260 sql_help.c:2270 -#: sql_help.c:2292 sql_help.c:3189 sql_help.c:3204 sql_help.c:3206 -#: sql_help.c:3620 sql_help.c:3621 sql_help.c:3630 sql_help.c:3671 -#: sql_help.c:3672 sql_help.c:3673 sql_help.c:3674 sql_help.c:3675 -#: sql_help.c:3676 sql_help.c:3709 sql_help.c:3710 sql_help.c:3715 -#: sql_help.c:3720 sql_help.c:3859 sql_help.c:3860 sql_help.c:3869 -#: sql_help.c:3910 sql_help.c:3911 sql_help.c:3912 sql_help.c:3913 -#: sql_help.c:3914 sql_help.c:3915 sql_help.c:3962 sql_help.c:3964 -#: sql_help.c:3997 sql_help.c:4053 sql_help.c:4054 sql_help.c:4063 -#: sql_help.c:4104 sql_help.c:4105 sql_help.c:4106 sql_help.c:4107 -#: sql_help.c:4108 sql_help.c:4109 +#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1336 sql_help.c:1338 +#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1427 sql_help.c:1683 +#: sql_help.c:2238 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359 +#: sql_help.c:2467 sql_help.c:2637 sql_help.c:2776 sql_help.c:2781 +#: sql_help.c:2783 sql_help.c:2904 sql_help.c:2917 sql_help.c:2931 +#: sql_help.c:2940 sql_help.c:2952 sql_help.c:2981 sql_help.c:3990 +#: sql_help.c:4005 sql_help.c:4007 sql_help.c:4094 sql_help.c:4097 +#: sql_help.c:4099 sql_help.c:4560 sql_help.c:4561 sql_help.c:4570 +#: sql_help.c:4617 sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 +#: sql_help.c:4621 sql_help.c:4622 sql_help.c:4662 sql_help.c:4663 +#: sql_help.c:4668 sql_help.c:4673 sql_help.c:4817 sql_help.c:4818 +#: sql_help.c:4827 sql_help.c:4874 sql_help.c:4875 sql_help.c:4876 +#: sql_help.c:4877 sql_help.c:4878 sql_help.c:4879 sql_help.c:4933 +#: sql_help.c:4935 sql_help.c:5003 sql_help.c:5063 sql_help.c:5064 +#: sql_help.c:5073 sql_help.c:5120 sql_help.c:5121 sql_help.c:5122 +#: sql_help.c:5123 sql_help.c:5124 sql_help.c:5125 msgid "expression" msgstr "expressão" -#: sql_help.c:225 +#: sql_help.c:242 msgid "domain_constraint" msgstr "restrição_domínio" -#: sql_help.c:227 sql_help.c:229 sql_help.c:232 sql_help.c:451 sql_help.c:452 -#: sql_help.c:995 sql_help.c:1028 sql_help.c:1029 sql_help.c:1030 -#: sql_help.c:1050 sql_help.c:1413 sql_help.c:1415 sql_help.c:1761 -#: sql_help.c:1847 sql_help.c:1851 sql_help.c:2259 sql_help.c:2269 -#: sql_help.c:3201 +#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 +#: sql_help.c:1313 sql_help.c:1360 sql_help.c:1361 sql_help.c:1362 +#: sql_help.c:1389 sql_help.c:1401 sql_help.c:1418 sql_help.c:1853 +#: sql_help.c:1855 sql_help.c:2241 sql_help.c:2353 sql_help.c:2358 +#: sql_help.c:2939 sql_help.c:2951 sql_help.c:4002 msgid "constraint_name" msgstr "nome_restrição" -#: sql_help.c:230 sql_help.c:996 +#: sql_help.c:247 sql_help.c:1314 msgid "new_constraint_name" msgstr "novo_nome_restrição" -#: sql_help.c:301 sql_help.c:900 +#: sql_help.c:320 sql_help.c:1099 msgid "new_version" msgstr "nova_versão" -#: sql_help.c:305 sql_help.c:307 +#: sql_help.c:324 sql_help.c:326 msgid "member_object" msgstr "objeto_membro" -#: sql_help.c:308 +#: sql_help.c:327 msgid "where member_object is:" msgstr "onde objeto_membro é:" -#: sql_help.c:309 sql_help.c:314 sql_help.c:315 sql_help.c:316 sql_help.c:317 -#: sql_help.c:318 sql_help.c:319 sql_help.c:324 sql_help.c:328 sql_help.c:330 -#: sql_help.c:332 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 -#: sql_help.c:337 sql_help.c:338 sql_help.c:339 sql_help.c:340 sql_help.c:343 -#: sql_help.c:344 sql_help.c:1405 sql_help.c:1410 sql_help.c:1417 -#: sql_help.c:1418 sql_help.c:1419 sql_help.c:1420 sql_help.c:1421 -#: sql_help.c:1422 sql_help.c:1423 sql_help.c:1428 sql_help.c:1430 -#: sql_help.c:1434 sql_help.c:1436 sql_help.c:1440 sql_help.c:1441 -#: sql_help.c:1444 sql_help.c:1445 sql_help.c:1446 sql_help.c:1447 -#: sql_help.c:1448 sql_help.c:1449 sql_help.c:1450 sql_help.c:1451 -#: sql_help.c:1452 sql_help.c:1457 sql_help.c:1458 sql_help.c:3537 -#: sql_help.c:3542 sql_help.c:3543 sql_help.c:3544 sql_help.c:3545 -#: sql_help.c:3551 sql_help.c:3552 sql_help.c:3553 sql_help.c:3554 -#: sql_help.c:3555 sql_help.c:3556 sql_help.c:3557 sql_help.c:3558 +#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 +#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 +#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 +#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 +#: sql_help.c:371 sql_help.c:1845 sql_help.c:1850 sql_help.c:1857 +#: sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 +#: sql_help.c:1862 sql_help.c:1863 sql_help.c:1868 sql_help.c:1870 +#: sql_help.c:1874 sql_help.c:1876 sql_help.c:1880 sql_help.c:1885 +#: sql_help.c:1886 sql_help.c:1893 sql_help.c:1894 sql_help.c:1895 +#: sql_help.c:1896 sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 +#: sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 +#: sql_help.c:1908 sql_help.c:1909 sql_help.c:4463 sql_help.c:4468 +#: sql_help.c:4469 sql_help.c:4470 sql_help.c:4471 sql_help.c:4477 +#: sql_help.c:4478 sql_help.c:4483 sql_help.c:4484 sql_help.c:4489 +#: sql_help.c:4490 sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 +#: sql_help.c:4494 msgid "object_name" msgstr "nome_objeto" -#: sql_help.c:310 sql_help.c:1406 sql_help.c:3540 +#: sql_help.c:329 sql_help.c:1846 sql_help.c:4466 msgid "aggregate_name" msgstr "nome_agregação" -#: sql_help.c:312 sql_help.c:1408 sql_help.c:1676 sql_help.c:1680 -#: sql_help.c:1682 sql_help.c:2664 +#: sql_help.c:331 sql_help.c:1848 sql_help.c:2134 sql_help.c:2138 +#: sql_help.c:2140 sql_help.c:3364 msgid "source_type" msgstr "tipo_origem" -#: sql_help.c:313 sql_help.c:1409 sql_help.c:1677 sql_help.c:1681 -#: sql_help.c:1683 sql_help.c:2665 +#: sql_help.c:332 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139 +#: sql_help.c:2141 sql_help.c:3365 msgid "target_type" msgstr "tipo_destino" -#: sql_help.c:320 sql_help.c:743 sql_help.c:1424 sql_help.c:1678 -#: sql_help.c:1713 sql_help.c:1776 sql_help.c:1998 sql_help.c:2029 -#: sql_help.c:2428 sql_help.c:3123 sql_help.c:3455 sql_help.c:3546 -#: sql_help.c:3649 sql_help.c:3653 sql_help.c:3657 sql_help.c:3660 -#: sql_help.c:3888 sql_help.c:3892 sql_help.c:3896 sql_help.c:3899 -#: sql_help.c:4082 sql_help.c:4086 sql_help.c:4090 sql_help.c:4093 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1864 sql_help.c:2136 +#: sql_help.c:2179 sql_help.c:2257 sql_help.c:2525 sql_help.c:2556 +#: sql_help.c:3124 sql_help.c:4365 sql_help.c:4472 sql_help.c:4589 +#: sql_help.c:4593 sql_help.c:4597 sql_help.c:4600 sql_help.c:4846 +#: sql_help.c:4850 sql_help.c:4854 sql_help.c:4857 sql_help.c:5092 +#: sql_help.c:5096 sql_help.c:5100 sql_help.c:5103 msgid "function_name" msgstr "nome_função" -#: sql_help.c:325 sql_help.c:736 sql_help.c:1431 sql_help.c:2022 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1871 sql_help.c:2549 msgid "operator_name" msgstr "nome_operador" -#: sql_help.c:326 sql_help.c:672 sql_help.c:676 sql_help.c:680 sql_help.c:1432 -#: sql_help.c:1999 sql_help.c:2782 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1872 +#: sql_help.c:2526 sql_help.c:3488 msgid "left_type" msgstr "tipo_esquerda" -#: sql_help.c:327 sql_help.c:673 sql_help.c:677 sql_help.c:681 sql_help.c:1433 -#: sql_help.c:2000 sql_help.c:2783 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1873 +#: sql_help.c:2527 sql_help.c:3489 msgid "right_type" msgstr "tipo_direita" -#: sql_help.c:329 sql_help.c:331 sql_help.c:699 sql_help.c:702 sql_help.c:705 -#: sql_help.c:734 sql_help.c:746 sql_help.c:754 sql_help.c:757 sql_help.c:760 -#: sql_help.c:1435 sql_help.c:1437 sql_help.c:2019 sql_help.c:2040 -#: sql_help.c:2275 sql_help.c:2792 sql_help.c:2801 +#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 +#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 +#: sql_help.c:1407 sql_help.c:1875 sql_help.c:1877 sql_help.c:2546 +#: sql_help.c:2567 sql_help.c:2957 sql_help.c:3498 sql_help.c:3507 msgid "index_method" msgstr "método_índice" -#: sql_help.c:341 sql_help.c:1046 sql_help.c:1453 sql_help.c:1886 -#: sql_help.c:2251 sql_help.c:2397 sql_help.c:2915 sql_help.c:3137 -#: sql_help.c:3469 +#: sql_help.c:352 sql_help.c:1881 sql_help.c:4479 +msgid "procedure_name" +msgstr "nome_procedimento" + +#: sql_help.c:356 sql_help.c:1887 sql_help.c:3913 sql_help.c:4485 +msgid "routine_name" +msgstr "nome_rotina" + +#: sql_help.c:368 sql_help.c:1379 sql_help.c:1904 sql_help.c:2401 +#: sql_help.c:2607 sql_help.c:2912 sql_help.c:3091 sql_help.c:3669 +#: sql_help.c:3935 sql_help.c:4387 msgid "type_name" msgstr "nome_tipo" -#: sql_help.c:342 sql_help.c:1454 sql_help.c:1885 sql_help.c:2398 -#: sql_help.c:2622 sql_help.c:2916 sql_help.c:3129 sql_help.c:3461 +#: sql_help.c:369 sql_help.c:1905 sql_help.c:2400 sql_help.c:2606 +#: sql_help.c:3092 sql_help.c:3322 sql_help.c:3670 sql_help.c:3920 +#: sql_help.c:4372 msgid "lang_name" msgstr "nome_linguagem" -#: sql_help.c:345 +#: sql_help.c:372 msgid "and aggregate_signature is:" msgstr "e assinatura_agregação é:" -#: sql_help.c:368 sql_help.c:1548 sql_help.c:1803 +#: sql_help.c:395 sql_help.c:2001 sql_help.c:2282 msgid "handler_function" -msgstr "função_manipulação" +msgstr "função_tratadora" -#: sql_help.c:369 sql_help.c:1804 +#: sql_help.c:396 sql_help.c:2283 msgid "validator_function" msgstr "função_validação" -#: sql_help.c:418 sql_help.c:495 sql_help.c:627 sql_help.c:990 sql_help.c:1189 -#: sql_help.c:2266 sql_help.c:2267 sql_help.c:2283 sql_help.c:2284 +#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 +#: sql_help.c:1308 sql_help.c:1580 msgid "action" msgstr "ação" -#: sql_help.c:420 sql_help.c:427 sql_help.c:431 sql_help.c:432 sql_help.c:435 -#: sql_help.c:437 sql_help.c:438 sql_help.c:439 sql_help.c:441 sql_help.c:444 -#: sql_help.c:446 sql_help.c:447 sql_help.c:631 sql_help.c:641 sql_help.c:643 -#: sql_help.c:646 sql_help.c:648 sql_help.c:882 sql_help.c:992 sql_help.c:1005 -#: sql_help.c:1009 sql_help.c:1010 sql_help.c:1014 sql_help.c:1016 -#: sql_help.c:1017 sql_help.c:1018 sql_help.c:1020 sql_help.c:1023 -#: sql_help.c:1025 sql_help.c:1288 sql_help.c:1291 sql_help.c:1311 -#: sql_help.c:1412 sql_help.c:1514 sql_help.c:1519 sql_help.c:1533 -#: sql_help.c:1534 sql_help.c:1535 sql_help.c:1835 sql_help.c:1883 -#: sql_help.c:1944 sql_help.c:1979 sql_help.c:2159 sql_help.c:2239 -#: sql_help.c:2252 sql_help.c:2271 sql_help.c:2273 sql_help.c:2280 -#: sql_help.c:2291 sql_help.c:2308 sql_help.c:2431 sql_help.c:2567 -#: sql_help.c:3108 sql_help.c:3109 sql_help.c:3188 sql_help.c:3203 -#: sql_help.c:3205 sql_help.c:3207 sql_help.c:3440 sql_help.c:3441 -#: sql_help.c:3539 sql_help.c:3680 sql_help.c:3919 sql_help.c:3961 -#: sql_help.c:3963 sql_help.c:3965 sql_help.c:3982 sql_help.c:3985 -#: sql_help.c:4113 +#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461 +#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470 +#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683 +#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080 +#: sql_help.c:1310 sql_help.c:1328 sql_help.c:1332 sql_help.c:1333 +#: sql_help.c:1337 sql_help.c:1339 sql_help.c:1340 sql_help.c:1341 +#: sql_help.c:1342 sql_help.c:1344 sql_help.c:1347 sql_help.c:1348 +#: sql_help.c:1350 sql_help.c:1353 sql_help.c:1355 sql_help.c:1356 +#: sql_help.c:1403 sql_help.c:1405 sql_help.c:1412 sql_help.c:1421 +#: sql_help.c:1426 sql_help.c:1430 sql_help.c:1431 sql_help.c:1682 +#: sql_help.c:1685 sql_help.c:1689 sql_help.c:1727 sql_help.c:1852 +#: sql_help.c:1966 sql_help.c:1972 sql_help.c:1986 sql_help.c:1987 +#: sql_help.c:1988 sql_help.c:2332 sql_help.c:2345 sql_help.c:2398 +#: sql_help.c:2466 sql_help.c:2472 sql_help.c:2505 sql_help.c:2636 +#: sql_help.c:2745 sql_help.c:2780 sql_help.c:2782 sql_help.c:2894 +#: sql_help.c:2903 sql_help.c:2913 sql_help.c:2916 sql_help.c:2926 +#: sql_help.c:2930 sql_help.c:2953 sql_help.c:2955 sql_help.c:2962 +#: sql_help.c:2975 sql_help.c:2980 sql_help.c:2984 sql_help.c:2985 +#: sql_help.c:3001 sql_help.c:3127 sql_help.c:3267 sql_help.c:3892 +#: sql_help.c:3893 sql_help.c:3989 sql_help.c:4004 sql_help.c:4006 +#: sql_help.c:4008 sql_help.c:4093 sql_help.c:4096 sql_help.c:4098 +#: sql_help.c:4344 sql_help.c:4345 sql_help.c:4465 sql_help.c:4626 +#: sql_help.c:4632 sql_help.c:4634 sql_help.c:4883 sql_help.c:4889 +#: sql_help.c:4891 sql_help.c:4932 sql_help.c:4934 sql_help.c:4936 +#: sql_help.c:4991 sql_help.c:5129 sql_help.c:5135 sql_help.c:5137 msgid "column_name" msgstr "nome_coluna" -#: sql_help.c:421 sql_help.c:632 sql_help.c:993 +#: sql_help.c:447 sql_help.c:672 sql_help.c:1311 sql_help.c:1690 msgid "new_column_name" msgstr "novo_nome_coluna" -#: sql_help.c:426 sql_help.c:516 sql_help.c:640 sql_help.c:1004 -#: sql_help.c:1202 +#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 +#: sql_help.c:1327 sql_help.c:1590 msgid "where action is one of:" msgstr "onde ação é uma das:" -#: sql_help.c:428 sql_help.c:433 sql_help.c:1006 sql_help.c:1011 -#: sql_help.c:1204 sql_help.c:1208 sql_help.c:1756 sql_help.c:1836 -#: sql_help.c:2018 sql_help.c:2240 sql_help.c:2476 sql_help.c:3290 +#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1329 +#: sql_help.c:1334 sql_help.c:1592 sql_help.c:1596 sql_help.c:2236 +#: sql_help.c:2333 sql_help.c:2545 sql_help.c:2738 sql_help.c:2895 +#: sql_help.c:3174 sql_help.c:4150 msgid "data_type" -msgstr "tipo_de_dado" +msgstr "tipo_dados" -#: sql_help.c:429 sql_help.c:434 sql_help.c:1007 sql_help.c:1012 -#: sql_help.c:1205 sql_help.c:1209 sql_help.c:1757 sql_help.c:1839 -#: sql_help.c:1946 sql_help.c:2241 sql_help.c:2477 sql_help.c:2483 -#: sql_help.c:3198 +#: sql_help.c:455 sql_help.c:460 sql_help.c:1330 sql_help.c:1335 +#: sql_help.c:1593 sql_help.c:1597 sql_help.c:2237 sql_help.c:2336 +#: sql_help.c:2468 sql_help.c:2897 sql_help.c:2905 sql_help.c:2918 +#: sql_help.c:2932 sql_help.c:3175 sql_help.c:3181 sql_help.c:3999 msgid "collation" msgstr "ordenação" -#: sql_help.c:430 sql_help.c:1008 sql_help.c:1840 sql_help.c:2242 -#: sql_help.c:2253 +#: sql_help.c:456 sql_help.c:1331 sql_help.c:2337 sql_help.c:2346 +#: sql_help.c:2898 sql_help.c:2914 sql_help.c:2927 msgid "column_constraint" msgstr "restrição_coluna" -#: sql_help.c:440 sql_help.c:642 sql_help.c:1019 +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1349 sql_help.c:4985 msgid "integer" msgstr "inteiro" -#: sql_help.c:442 sql_help.c:445 sql_help.c:644 sql_help.c:647 sql_help.c:1021 -#: sql_help.c:1024 +#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1351 +#: sql_help.c:1354 msgid "attribute_option" msgstr "opção_atributo" -#: sql_help.c:450 sql_help.c:1026 sql_help.c:1841 sql_help.c:2243 -#: sql_help.c:2254 +#: sql_help.c:476 sql_help.c:1358 sql_help.c:2338 sql_help.c:2347 +#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928 msgid "table_constraint" msgstr "restrição_tabela" -#: sql_help.c:453 sql_help.c:454 sql_help.c:455 sql_help.c:456 sql_help.c:1031 -#: sql_help.c:1032 sql_help.c:1033 sql_help.c:1034 sql_help.c:1455 +#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1363 +#: sql_help.c:1364 sql_help.c:1365 sql_help.c:1366 sql_help.c:1906 msgid "trigger_name" msgstr "nome_gatilho" -#: sql_help.c:457 sql_help.c:458 sql_help.c:1044 sql_help.c:1045 -#: sql_help.c:1842 sql_help.c:2246 +#: sql_help.c:483 sql_help.c:484 sql_help.c:1377 sql_help.c:1378 +#: sql_help.c:2339 sql_help.c:2344 sql_help.c:2902 sql_help.c:2925 msgid "parent_table" msgstr "tabela_ancestral" -#: sql_help.c:515 sql_help.c:565 sql_help.c:629 sql_help.c:1169 -#: sql_help.c:1788 +#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 +#: sql_help.c:1549 sql_help.c:2268 msgid "extension_name" msgstr "nome_extensão" -#: sql_help.c:517 sql_help.c:1887 +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2402 msgid "execution_cost" msgstr "custo_execução" -#: sql_help.c:518 sql_help.c:1888 +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2403 msgid "result_rows" -msgstr "registros_retornados" - -#: sql_help.c:539 sql_help.c:541 sql_help.c:815 sql_help.c:823 sql_help.c:827 -#: sql_help.c:830 sql_help.c:833 sql_help.c:1243 sql_help.c:1251 -#: sql_help.c:1254 sql_help.c:1256 sql_help.c:1258 sql_help.c:2133 -#: sql_help.c:2135 sql_help.c:2138 sql_help.c:2139 sql_help.c:3107 -#: sql_help.c:3111 sql_help.c:3114 sql_help.c:3116 sql_help.c:3118 -#: sql_help.c:3120 sql_help.c:3122 sql_help.c:3128 sql_help.c:3130 -#: sql_help.c:3132 sql_help.c:3134 sql_help.c:3136 sql_help.c:3138 +msgstr "linhas_resultado" + +#: sql_help.c:547 sql_help.c:2404 +msgid "support_function" +msgstr "função_suporte" + +#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 +#: sql_help.c:963 sql_help.c:966 sql_help.c:1632 sql_help.c:1640 +#: sql_help.c:1644 sql_help.c:1647 sql_help.c:1650 sql_help.c:2716 +#: sql_help.c:2718 sql_help.c:2721 sql_help.c:2722 sql_help.c:3890 +#: sql_help.c:3891 sql_help.c:3895 sql_help.c:3896 sql_help.c:3899 +#: sql_help.c:3900 sql_help.c:3902 sql_help.c:3903 sql_help.c:3905 +#: sql_help.c:3906 sql_help.c:3908 sql_help.c:3909 sql_help.c:3911 +#: sql_help.c:3912 sql_help.c:3918 sql_help.c:3919 sql_help.c:3921 +#: sql_help.c:3922 sql_help.c:3924 sql_help.c:3925 sql_help.c:3927 +#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3931 sql_help.c:3933 +#: sql_help.c:3934 sql_help.c:3936 sql_help.c:3937 sql_help.c:3939 +#: sql_help.c:3940 sql_help.c:4342 sql_help.c:4343 sql_help.c:4347 +#: sql_help.c:4348 sql_help.c:4351 sql_help.c:4352 sql_help.c:4354 +#: sql_help.c:4355 sql_help.c:4357 sql_help.c:4358 sql_help.c:4360 +#: sql_help.c:4361 sql_help.c:4363 sql_help.c:4364 sql_help.c:4370 +#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 +#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 sql_help.c:4382 +#: sql_help.c:4383 sql_help.c:4385 sql_help.c:4386 sql_help.c:4388 +#: sql_help.c:4389 sql_help.c:4391 sql_help.c:4392 msgid "role_specification" msgstr "especificação_role" -#: sql_help.c:540 sql_help.c:542 sql_help.c:1270 sql_help.c:1731 -#: sql_help.c:2141 sql_help.c:2552 sql_help.c:2949 sql_help.c:3765 +#: sql_help.c:570 sql_help.c:572 sql_help.c:1663 sql_help.c:2204 +#: sql_help.c:2724 sql_help.c:3252 sql_help.c:3703 sql_help.c:4719 msgid "user_name" msgstr "nome_usuário" -#: sql_help.c:543 sql_help.c:835 sql_help.c:1259 sql_help.c:2140 -#: sql_help.c:3139 +#: sql_help.c:573 sql_help.c:968 sql_help.c:1652 sql_help.c:2723 +#: sql_help.c:3941 sql_help.c:4393 msgid "where role_specification can be:" msgstr "onde especificação_role pode ser:" -#: sql_help.c:545 +#: sql_help.c:575 msgid "group_name" msgstr "nome_grupo" -#: sql_help.c:563 sql_help.c:1736 sql_help.c:1950 sql_help.c:1982 -#: sql_help.c:2249 sql_help.c:2257 sql_help.c:2289 sql_help.c:2311 -#: sql_help.c:2323 sql_help.c:3135 sql_help.c:3467 +#: sql_help.c:596 sql_help.c:1424 sql_help.c:2215 sql_help.c:2475 +#: sql_help.c:2509 sql_help.c:2910 sql_help.c:2923 sql_help.c:2937 +#: sql_help.c:2978 sql_help.c:3005 sql_help.c:3017 sql_help.c:3932 +#: sql_help.c:4384 msgid "tablespace_name" -msgstr "nome_tablespace" +msgstr "nome_espaço_tabelas" + +#: sql_help.c:598 sql_help.c:691 sql_help.c:1371 sql_help.c:1381 +#: sql_help.c:1419 sql_help.c:1781 sql_help.c:1784 +msgid "index_name" +msgstr "nome_índice" -#: sql_help.c:567 sql_help.c:570 sql_help.c:650 sql_help.c:652 sql_help.c:1041 -#: sql_help.c:1043 sql_help.c:1948 sql_help.c:1980 sql_help.c:2247 -#: sql_help.c:2255 sql_help.c:2287 sql_help.c:2309 +#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1374 +#: sql_help.c:1376 sql_help.c:1422 sql_help.c:2473 sql_help.c:2507 +#: sql_help.c:2908 sql_help.c:2921 sql_help.c:2935 sql_help.c:2976 +#: sql_help.c:3003 msgid "storage_parameter" msgstr "parâmetro_armazenamento" -#: sql_help.c:593 sql_help.c:1429 sql_help.c:3550 +#: sql_help.c:607 +msgid "column_number" +msgstr "número_coluna" + +#: sql_help.c:631 sql_help.c:1869 sql_help.c:4476 msgid "large_object_oid" msgstr "oid_objeto_grande" -#: sql_help.c:649 sql_help.c:1039 sql_help.c:1048 sql_help.c:1051 -#: sql_help.c:1351 -msgid "index_name" -msgstr "nome_índice" +#: sql_help.c:690 sql_help.c:1357 sql_help.c:2896 +msgid "compression_method" +msgstr "método_compressão" + +#: sql_help.c:692 sql_help.c:1372 +msgid "new_access_method" +msgstr "novo_método_acesso" -#: sql_help.c:682 sql_help.c:2003 +#: sql_help.c:725 sql_help.c:2530 msgid "res_proc" msgstr "proc_restrição" -#: sql_help.c:683 sql_help.c:2004 +#: sql_help.c:726 sql_help.c:2531 msgid "join_proc" msgstr "proc_junção" -#: sql_help.c:735 sql_help.c:747 sql_help.c:2021 +#: sql_help.c:778 sql_help.c:790 sql_help.c:2548 msgid "strategy_number" msgstr "número_estratégia" -#: sql_help.c:737 sql_help.c:738 sql_help.c:741 sql_help.c:742 sql_help.c:748 -#: sql_help.c:749 sql_help.c:751 sql_help.c:752 sql_help.c:2023 -#: sql_help.c:2024 sql_help.c:2027 sql_help.c:2028 +#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 +#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2550 sql_help.c:2551 +#: sql_help.c:2554 sql_help.c:2555 msgid "op_type" msgstr "tipo_operador" -#: sql_help.c:739 sql_help.c:2025 +#: sql_help.c:782 sql_help.c:2552 msgid "sort_family_name" -msgstr "nome_família_ordenação" +msgstr "nome_família_classificação" -#: sql_help.c:740 sql_help.c:750 sql_help.c:2026 +#: sql_help.c:783 sql_help.c:793 sql_help.c:2553 msgid "support_number" msgstr "número_suporte" -#: sql_help.c:744 sql_help.c:1679 sql_help.c:2030 sql_help.c:2400 -#: sql_help.c:2402 +#: sql_help.c:787 sql_help.c:2137 sql_help.c:2557 sql_help.c:3094 +#: sql_help.c:3096 msgid "argument_type" msgstr "tipo_argumento" -#: sql_help.c:775 sql_help.c:778 sql_help.c:845 sql_help.c:881 sql_help.c:1165 -#: sql_help.c:1168 sql_help.c:1310 sql_help.c:1350 sql_help.c:1414 -#: sql_help.c:1439 sql_help.c:1443 sql_help.c:1456 sql_help.c:1513 -#: sql_help.c:1518 sql_help.c:1834 sql_help.c:1942 sql_help.c:1978 -#: sql_help.c:2053 sql_help.c:2110 sql_help.c:2158 sql_help.c:2238 -#: sql_help.c:2250 sql_help.c:2307 sql_help.c:2425 sql_help.c:2601 -#: sql_help.c:2818 sql_help.c:2835 sql_help.c:2925 sql_help.c:3105 -#: sql_help.c:3110 sql_help.c:3155 sql_help.c:3186 sql_help.c:3437 -#: sql_help.c:3442 sql_help.c:3538 sql_help.c:3635 sql_help.c:3637 -#: sql_help.c:3686 sql_help.c:3725 sql_help.c:3874 sql_help.c:3876 -#: sql_help.c:3925 sql_help.c:3959 sql_help.c:3981 sql_help.c:3983 -#: sql_help.c:3984 sql_help.c:4068 sql_help.c:4070 sql_help.c:4119 +#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 +#: sql_help.c:1545 sql_help.c:1548 sql_help.c:1726 sql_help.c:1780 +#: sql_help.c:1783 sql_help.c:1854 sql_help.c:1879 sql_help.c:1892 +#: sql_help.c:1907 sql_help.c:1965 sql_help.c:1971 sql_help.c:2331 +#: sql_help.c:2343 sql_help.c:2464 sql_help.c:2504 sql_help.c:2581 +#: sql_help.c:2635 sql_help.c:2692 sql_help.c:2744 sql_help.c:2777 +#: sql_help.c:2784 sql_help.c:2893 sql_help.c:2911 sql_help.c:2924 +#: sql_help.c:3000 sql_help.c:3120 sql_help.c:3301 sql_help.c:3524 +#: sql_help.c:3573 sql_help.c:3679 sql_help.c:3888 sql_help.c:3894 +#: sql_help.c:3955 sql_help.c:3987 sql_help.c:4340 sql_help.c:4346 +#: sql_help.c:4464 sql_help.c:4575 sql_help.c:4577 sql_help.c:4639 +#: sql_help.c:4678 sql_help.c:4832 sql_help.c:4834 sql_help.c:4896 +#: sql_help.c:4930 sql_help.c:4990 sql_help.c:5078 sql_help.c:5080 +#: sql_help.c:5142 msgid "table_name" msgstr "nome_tabela" -#: sql_help.c:780 sql_help.c:2055 +#: sql_help.c:823 sql_help.c:2583 msgid "using_expression" msgstr "expressão_using" -#: sql_help.c:781 sql_help.c:2056 +#: sql_help.c:824 sql_help.c:2584 msgid "check_expression" msgstr "expressão_check" -#: sql_help.c:819 sql_help.c:1247 sql_help.c:1922 sql_help.c:2087 -#: sql_help.c:2535 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2631 +msgid "publication_object" +msgstr "objeto_publicação" + +#: sql_help.c:903 sql_help.c:2632 +msgid "publication_parameter" +msgstr "parâmetro_publicação" + +#: sql_help.c:909 sql_help.c:2634 +msgid "where publication_object is one of:" +msgstr "onde objeto_publicação é uma das seguintes opções:" + +#: sql_help.c:952 sql_help.c:1636 sql_help.c:2442 sql_help.c:2669 +#: sql_help.c:3235 msgid "password" msgstr "senha" -#: sql_help.c:820 sql_help.c:1248 sql_help.c:1923 sql_help.c:2088 -#: sql_help.c:2536 +#: sql_help.c:953 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670 +#: sql_help.c:3236 msgid "timestamp" msgstr "tempo_absoluto" -#: sql_help.c:824 sql_help.c:828 sql_help.c:831 sql_help.c:834 sql_help.c:3115 -#: sql_help.c:3447 +#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1641 +#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:3901 +#: sql_help.c:4353 msgid "database_name" -msgstr "nome_banco_de_dados" +msgstr "nome_banco_dados" -#: sql_help.c:875 sql_help.c:2153 +#: sql_help.c:1073 sql_help.c:2739 msgid "increment" msgstr "incremento" -#: sql_help.c:876 sql_help.c:2154 +#: sql_help.c:1074 sql_help.c:2740 msgid "minvalue" msgstr "valor_mínimo" -#: sql_help.c:877 sql_help.c:2155 +#: sql_help.c:1075 sql_help.c:2741 msgid "maxvalue" msgstr "valor_máximo" -#: sql_help.c:878 sql_help.c:2156 sql_help.c:3633 sql_help.c:3723 -#: sql_help.c:3872 sql_help.c:4001 sql_help.c:4066 +#: sql_help.c:1076 sql_help.c:2742 sql_help.c:4573 sql_help.c:4676 +#: sql_help.c:4830 sql_help.c:5007 sql_help.c:5076 msgid "start" msgstr "início" -#: sql_help.c:879 +#: sql_help.c:1077 sql_help.c:1346 msgid "restart" msgstr "reinício" -#: sql_help.c:880 sql_help.c:2157 +#: sql_help.c:1078 sql_help.c:2743 msgid "cache" msgstr "cache" -#: sql_help.c:1027 +#: sql_help.c:1123 +msgid "new_target" +msgstr "novo_destino" + +#: sql_help.c:1142 sql_help.c:2796 +msgid "conninfo" +msgstr "conninfo" + +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2797 +msgid "publication_name" +msgstr "nome_publicação" + +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +msgid "publication_option" +msgstr "opção_publicação" + +#: sql_help.c:1156 +msgid "refresh_option" +msgstr "opção_atualização" + +#: sql_help.c:1161 sql_help.c:2798 +msgid "subscription_parameter" +msgstr "parâmetro_subscrição" + +#: sql_help.c:1164 +msgid "skip_option" +msgstr "opção_salto" + +#: sql_help.c:1323 sql_help.c:1326 +msgid "partition_name" +msgstr "nome_partição" + +#: sql_help.c:1324 sql_help.c:2348 sql_help.c:2929 +msgid "partition_bound_spec" +msgstr "espec_limite_partição" + +#: sql_help.c:1343 sql_help.c:1393 sql_help.c:2943 +msgid "sequence_options" +msgstr "opções_sequência" + +#: sql_help.c:1345 +msgid "sequence_option" +msgstr "opção_sequência" + +#: sql_help.c:1359 msgid "table_constraint_using_index" -msgstr "restrição_tabela_utilizando_índice" +msgstr "restrição_tabela_usando_índice" -#: sql_help.c:1035 sql_help.c:1036 sql_help.c:1037 sql_help.c:1038 +#: sql_help.c:1367 sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 msgid "rewrite_rule_name" msgstr "nome_regra_reescrita" -#: sql_help.c:1049 +#: sql_help.c:1382 sql_help.c:2360 sql_help.c:2968 +msgid "and partition_bound_spec is:" +msgstr "e espec_limite_partição é:" + +#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:2361 +#: sql_help.c:2362 sql_help.c:2363 sql_help.c:2969 sql_help.c:2970 +#: sql_help.c:2971 +msgid "partition_bound_expr" +msgstr "expr_limite_partição" + +#: sql_help.c:1386 sql_help.c:1387 sql_help.c:2364 sql_help.c:2365 +#: sql_help.c:2972 sql_help.c:2973 +msgid "numeric_literal" +msgstr "literal_numérico" + +#: sql_help.c:1388 +msgid "and column_constraint is:" +msgstr "e restrição_coluna é:" + +#: sql_help.c:1391 sql_help.c:2355 sql_help.c:2396 sql_help.c:2605 +#: sql_help.c:2941 +msgid "default_expr" +msgstr "expressão_padrão" + +#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2942 +msgid "generation_expr" +msgstr "expressão_geração" + +#: sql_help.c:1394 sql_help.c:1395 sql_help.c:1404 sql_help.c:1406 +#: sql_help.c:1410 sql_help.c:2944 sql_help.c:2945 sql_help.c:2954 +#: sql_help.c:2956 sql_help.c:2960 +msgid "index_parameters" +msgstr "parâmetros_índice" + +#: sql_help.c:1396 sql_help.c:1413 sql_help.c:2946 sql_help.c:2963 +msgid "reftable" +msgstr "tabela_ref" + +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964 +msgid "refcolumn" +msgstr "coluna_ref" + +#: sql_help.c:1398 sql_help.c:1399 sql_help.c:1415 sql_help.c:1416 +#: sql_help.c:2948 sql_help.c:2949 sql_help.c:2965 sql_help.c:2966 +msgid "referential_action" +msgstr "ação_referencial" + +#: sql_help.c:1400 sql_help.c:2357 sql_help.c:2950 +msgid "and table_constraint is:" +msgstr "e restrição_tabela é:" + +#: sql_help.c:1408 sql_help.c:2958 +msgid "exclude_element" +msgstr "elemento_exclusão" + +#: sql_help.c:1409 sql_help.c:2959 sql_help.c:4571 sql_help.c:4674 +#: sql_help.c:4828 sql_help.c:5005 sql_help.c:5074 +msgid "operator" +msgstr "operador" + +#: sql_help.c:1411 sql_help.c:2476 sql_help.c:2961 +msgid "predicate" +msgstr "predicado" + +#: sql_help.c:1417 msgid "and table_constraint_using_index is:" -msgstr "e restrição_tabela_utilizando_índice é:" +msgstr "e restrição_tabela_usando_índice é:" + +#: sql_help.c:1420 sql_help.c:2974 +msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" +msgstr "parâmetros_índice em restrições UNIQUE, PRIMARY KEY e EXCLUDE são:" + +#: sql_help.c:1425 sql_help.c:2979 +msgid "exclude_element in an EXCLUDE constraint is:" +msgstr "elemento_exclusão em uma restrição EXCLUDE é:" + +#: sql_help.c:1428 sql_help.c:2469 sql_help.c:2906 sql_help.c:2919 +#: sql_help.c:2933 sql_help.c:2982 sql_help.c:4000 +msgid "opclass" +msgstr "classe_operador" -#: sql_help.c:1067 sql_help.c:1070 sql_help.c:2326 +#: sql_help.c:1429 sql_help.c:2983 +msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" +msgstr "a ação_referencial em uma restrição FOREIGN KEY/REFERENCES é:" + +#: sql_help.c:1447 sql_help.c:1450 sql_help.c:3020 msgid "tablespace_option" -msgstr "opção_tablespace" +msgstr "opção_espaço_tabelas" -#: sql_help.c:1091 sql_help.c:1094 sql_help.c:1100 sql_help.c:1104 +#: sql_help.c:1471 sql_help.c:1474 sql_help.c:1480 sql_help.c:1484 msgid "token_type" msgstr "tipo_elemento" -#: sql_help.c:1092 sql_help.c:1095 +#: sql_help.c:1472 sql_help.c:1475 msgid "dictionary_name" msgstr "nome_dicionário" -#: sql_help.c:1097 sql_help.c:1101 +#: sql_help.c:1477 sql_help.c:1481 msgid "old_dictionary" msgstr "dicionário_antigo" -#: sql_help.c:1098 sql_help.c:1102 +#: sql_help.c:1478 sql_help.c:1482 msgid "new_dictionary" msgstr "novo_dicionário" -#: sql_help.c:1193 sql_help.c:1203 sql_help.c:1206 sql_help.c:1207 -#: sql_help.c:2475 +#: sql_help.c:1577 sql_help.c:1591 sql_help.c:1594 sql_help.c:1595 +#: sql_help.c:3173 msgid "attribute_name" msgstr "nome_atributo" -#: sql_help.c:1194 +#: sql_help.c:1578 msgid "new_attribute_name" msgstr "novo_nome_atributo" -#: sql_help.c:1200 +#: sql_help.c:1582 sql_help.c:1586 msgid "new_enum_value" msgstr "novo_valor_enum" -#: sql_help.c:1201 +#: sql_help.c:1583 +msgid "neighbor_enum_value" +msgstr "valor_enum_vizinho" + +#: sql_help.c:1585 msgid "existing_enum_value" msgstr "valor_enum_existente" -#: sql_help.c:1271 sql_help.c:1843 sql_help.c:2169 sql_help.c:2553 -#: sql_help.c:2950 sql_help.c:3121 sql_help.c:3156 sql_help.c:3453 +#: sql_help.c:1588 +msgid "property" +msgstr "propriedade" + +#: sql_help.c:1664 sql_help.c:2340 sql_help.c:2349 sql_help.c:2755 +#: sql_help.c:3253 sql_help.c:3704 sql_help.c:3910 sql_help.c:3956 +#: sql_help.c:4362 msgid "server_name" msgstr "nome_servidor" -#: sql_help.c:1299 sql_help.c:1302 sql_help.c:2568 +#: sql_help.c:1696 sql_help.c:1699 sql_help.c:3268 msgid "view_option_name" msgstr "nome_opção_visão" -#: sql_help.c:1300 sql_help.c:2569 +#: sql_help.c:1697 sql_help.c:3269 msgid "view_option_value" msgstr "valor_opção_visão" -#: sql_help.c:1325 sql_help.c:3781 sql_help.c:3783 sql_help.c:3807 +#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4973 sql_help.c:4974 +msgid "table_and_columns" +msgstr "tabela_e_colunas" + +#: sql_help.c:1721 sql_help.c:1785 sql_help.c:1977 sql_help.c:3753 +#: sql_help.c:4197 sql_help.c:4975 +msgid "where option can be one of:" +msgstr "onde opção pode ser uma das seguintes:" + +#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1786 sql_help.c:1979 +#: sql_help.c:1983 sql_help.c:2163 sql_help.c:3754 sql_help.c:3755 +#: sql_help.c:3756 sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 +#: sql_help.c:3760 sql_help.c:3761 sql_help.c:3762 sql_help.c:4198 +#: sql_help.c:4200 sql_help.c:4976 sql_help.c:4977 sql_help.c:4978 +#: sql_help.c:4979 sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 +#: sql_help.c:4983 sql_help.c:4984 sql_help.c:4986 sql_help.c:4987 +msgid "boolean" +msgstr "booleano" + +#: sql_help.c:1724 sql_help.c:4988 +msgid "size" +msgstr "tamanho" + +#: sql_help.c:1725 sql_help.c:4989 +msgid "and table_and_columns is:" +msgstr "e tabela_e_colunas é:" + +#: sql_help.c:1741 sql_help.c:4735 sql_help.c:4737 sql_help.c:4761 msgid "transaction_mode" msgstr "modo_transação" -#: sql_help.c:1326 sql_help.c:3784 sql_help.c:3808 +#: sql_help.c:1742 sql_help.c:4738 sql_help.c:4762 msgid "where transaction_mode is one of:" msgstr "onde modo_transação é um dos:" -#: sql_help.c:1411 +#: sql_help.c:1751 sql_help.c:4581 sql_help.c:4590 sql_help.c:4594 +#: sql_help.c:4598 sql_help.c:4601 sql_help.c:4838 sql_help.c:4847 +#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5084 +#: sql_help.c:5093 sql_help.c:5097 sql_help.c:5101 sql_help.c:5104 +msgid "argument" +msgstr "argumento" + +#: sql_help.c:1851 msgid "relation_name" msgstr "nome_relação" -#: sql_help.c:1416 sql_help.c:3117 sql_help.c:3449 +#: sql_help.c:1856 sql_help.c:3904 sql_help.c:4356 msgid "domain_name" msgstr "nome_domínio" -#: sql_help.c:1438 +#: sql_help.c:1878 msgid "policy_name" msgstr "nome_política" -#: sql_help.c:1442 +#: sql_help.c:1891 msgid "rule_name" msgstr "nome_regra" -#: sql_help.c:1459 -msgid "text" -msgstr "texto" +#: sql_help.c:1910 sql_help.c:4495 +msgid "string_literal" +msgstr "literal_cadeia_caracteres" -#: sql_help.c:1484 sql_help.c:3299 sql_help.c:3487 +#: sql_help.c:1935 sql_help.c:4159 sql_help.c:4409 msgid "transaction_id" msgstr "id_transação" -#: sql_help.c:1515 sql_help.c:1521 sql_help.c:3225 +#: sql_help.c:1967 sql_help.c:1974 sql_help.c:4026 msgid "filename" msgstr "arquivo" -#: sql_help.c:1516 sql_help.c:1522 sql_help.c:2112 sql_help.c:2113 -#: sql_help.c:2114 +#: sql_help.c:1968 sql_help.c:1975 sql_help.c:2694 sql_help.c:2695 +#: sql_help.c:2696 msgid "command" msgstr "comando" -#: sql_help.c:1520 sql_help.c:1983 sql_help.c:2312 sql_help.c:2570 -#: sql_help.c:2588 sql_help.c:3190 +#: sql_help.c:1970 sql_help.c:2693 sql_help.c:3123 sql_help.c:3304 +#: sql_help.c:4010 sql_help.c:4087 sql_help.c:4090 sql_help.c:4564 +#: sql_help.c:4566 sql_help.c:4667 sql_help.c:4669 sql_help.c:4821 +#: sql_help.c:4823 sql_help.c:4939 sql_help.c:5067 sql_help.c:5069 +msgid "condition" +msgstr "condição" + +#: sql_help.c:1973 sql_help.c:2510 sql_help.c:3006 sql_help.c:3270 +#: sql_help.c:3288 sql_help.c:3991 msgid "query" msgstr "consulta" -#: sql_help.c:1524 sql_help.c:2995 -msgid "where option can be one of:" -msgstr "onde opção pode ser um das:" - -#: sql_help.c:1525 +#: sql_help.c:1978 msgid "format_name" msgstr "nome_formato" -#: sql_help.c:1526 sql_help.c:1527 sql_help.c:1530 sql_help.c:2996 -#: sql_help.c:2997 sql_help.c:2998 sql_help.c:2999 sql_help.c:3000 -msgid "boolean" -msgstr "booleano" - -#: sql_help.c:1528 +#: sql_help.c:1980 msgid "delimiter_character" -msgstr "caracter_delimitador" +msgstr "caractere_delimitador" -#: sql_help.c:1529 +#: sql_help.c:1981 msgid "null_string" msgstr "cadeia_nula" -#: sql_help.c:1531 +#: sql_help.c:1982 +msgid "default_string" +msgstr "cadeia_caracteres_padrão" + +#: sql_help.c:1984 msgid "quote_character" -msgstr "caracter_separador" +msgstr "caractere_separador" -#: sql_help.c:1532 +#: sql_help.c:1985 msgid "escape_character" -msgstr "caracter_escape" +msgstr "caractere_escape" -#: sql_help.c:1536 +#: sql_help.c:1989 msgid "encoding_name" msgstr "nome_codificação" -#: sql_help.c:1547 +#: sql_help.c:2000 msgid "access_method_type" msgstr "tipo_método_acesso" -#: sql_help.c:1613 sql_help.c:1632 sql_help.c:1635 +#: sql_help.c:2071 sql_help.c:2090 sql_help.c:2093 msgid "arg_data_type" -msgstr "tipo_de_dado_arg" +msgstr "tipo_dados_arg" -#: sql_help.c:1614 sql_help.c:1636 sql_help.c:1644 +#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 msgid "sfunc" msgstr "função_trans_estado" -#: sql_help.c:1615 sql_help.c:1637 sql_help.c:1645 +#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103 msgid "state_data_type" -msgstr "tipo_de_dado_estado" +msgstr "tipo_dados_estado" -#: sql_help.c:1616 sql_help.c:1638 sql_help.c:1646 +#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104 msgid "state_data_size" -msgstr "tamanho_de_dado_estado" +msgstr "tamanho_dados_estado" -#: sql_help.c:1617 sql_help.c:1639 sql_help.c:1647 +#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105 msgid "ffunc" msgstr "função_final" -#: sql_help.c:1618 sql_help.c:1648 +#: sql_help.c:2076 sql_help.c:2106 msgid "combinefunc" -msgstr "função_combine" +msgstr "função_combinação" -#: sql_help.c:1619 sql_help.c:1649 +#: sql_help.c:2077 sql_help.c:2107 msgid "serialfunc" msgstr "função_serial" -#: sql_help.c:1620 sql_help.c:1650 +#: sql_help.c:2078 sql_help.c:2108 msgid "deserialfunc" msgstr "função_deserial" -#: sql_help.c:1621 sql_help.c:1640 sql_help.c:1651 +#: sql_help.c:2079 sql_help.c:2098 sql_help.c:2109 msgid "initial_condition" msgstr "condição_inicial" -#: sql_help.c:1622 sql_help.c:1652 +#: sql_help.c:2080 sql_help.c:2110 msgid "msfunc" -msgstr "função_mestado" +msgstr "função_estado_m" -#: sql_help.c:1623 sql_help.c:1653 +#: sql_help.c:2081 sql_help.c:2111 msgid "minvfunc" -msgstr "função_minv" +msgstr "função_inv_m" -#: sql_help.c:1624 sql_help.c:1654 +#: sql_help.c:2082 sql_help.c:2112 msgid "mstate_data_type" -msgstr "tipo_de_dado_mestado" +msgstr "tipo_dados_estado_m" -#: sql_help.c:1625 sql_help.c:1655 +#: sql_help.c:2083 sql_help.c:2113 msgid "mstate_data_size" -msgstr "tamanho_de_dado_mestado" +msgstr "tamanho_dados_estado_m" -#: sql_help.c:1626 sql_help.c:1656 +#: sql_help.c:2084 sql_help.c:2114 msgid "mffunc" -msgstr "função_mfinal" +msgstr "função_final_m" -#: sql_help.c:1627 sql_help.c:1657 +#: sql_help.c:2085 sql_help.c:2115 msgid "minitial_condition" -msgstr "condição_minicial" +msgstr "condição_inicial_m" -#: sql_help.c:1628 sql_help.c:1658 +#: sql_help.c:2086 sql_help.c:2116 msgid "sort_operator" -msgstr "operador_ordenação" +msgstr "operador_classificação" -#: sql_help.c:1641 +#: sql_help.c:2099 msgid "or the old syntax" msgstr "ou a sintaxe antiga" -#: sql_help.c:1643 +#: sql_help.c:2101 msgid "base_type" msgstr "tipo_base" -#: sql_help.c:1697 +#: sql_help.c:2159 sql_help.c:2208 msgid "locale" msgstr "configuração regional" -#: sql_help.c:1698 sql_help.c:1734 +#: sql_help.c:2160 sql_help.c:2209 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:1699 sql_help.c:1735 +#: sql_help.c:2161 sql_help.c:2210 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:1701 +#: sql_help.c:2162 sql_help.c:4462 +msgid "provider" +msgstr "fornecedor" + +#: sql_help.c:2164 +msgid "rules" +msgstr "regras" + +#: sql_help.c:2165 sql_help.c:2270 +msgid "version" +msgstr "versão" + +#: sql_help.c:2167 msgid "existing_collation" msgstr "ordenação_existente" -#: sql_help.c:1711 +#: sql_help.c:2177 msgid "source_encoding" msgstr "codificação_origem" -#: sql_help.c:1712 +#: sql_help.c:2178 msgid "dest_encoding" msgstr "codificação_destino" -#: sql_help.c:1732 sql_help.c:2352 +#: sql_help.c:2205 sql_help.c:3046 msgid "template" msgstr "modelo" -#: sql_help.c:1733 +#: sql_help.c:2206 msgid "encoding" msgstr "codificação" -#: sql_help.c:1759 +#: sql_help.c:2207 +msgid "strategy" +msgstr "estratégia" + +#: sql_help.c:2211 +msgid "icu_locale" +msgstr "localidade_icu" + +#: sql_help.c:2212 +msgid "icu_rules" +msgstr "regras_icu" + +#: sql_help.c:2213 +msgid "locale_provider" +msgstr "fornecedor_localidade" + +#: sql_help.c:2214 +msgid "collation_version" +msgstr "versão_ordenação" + +#: sql_help.c:2219 +msgid "oid" +msgstr "oid" + +#: sql_help.c:2239 msgid "constraint" msgstr "restrição" -#: sql_help.c:1760 +#: sql_help.c:2240 msgid "where constraint is:" msgstr "onde restrição é:" -#: sql_help.c:1774 sql_help.c:2109 sql_help.c:2424 +#: sql_help.c:2254 sql_help.c:2691 sql_help.c:3119 msgid "event" msgstr "evento" -#: sql_help.c:1775 +#: sql_help.c:2255 msgid "filter_variable" msgstr "variável_filtro" -#: sql_help.c:1790 -msgid "version" -msgstr "versão" - -#: sql_help.c:1791 -msgid "old_version" -msgstr "versão_antiga" +#: sql_help.c:2256 +msgid "filter_value" +msgstr "valor_filtro" -#: sql_help.c:1846 sql_help.c:2258 +#: sql_help.c:2352 sql_help.c:2938 msgid "where column_constraint is:" msgstr "onde restrição_coluna é:" -#: sql_help.c:1849 sql_help.c:1881 sql_help.c:2261 -msgid "default_expr" -msgstr "expressão_padrão" - -#: sql_help.c:1850 sql_help.c:2268 -msgid "and table_constraint is:" -msgstr "e restrição_tabela é:" - -#: sql_help.c:1882 +#: sql_help.c:2397 msgid "rettype" -msgstr "tipo_retorno" +msgstr "tipo_retornado" -#: sql_help.c:1884 +#: sql_help.c:2399 msgid "column_type" msgstr "tipo_coluna" -#: sql_help.c:1892 +#: sql_help.c:2408 sql_help.c:2611 msgid "definition" msgstr "definição" -#: sql_help.c:1893 +#: sql_help.c:2409 sql_help.c:2612 msgid "obj_file" msgstr "arquivo_objeto" -#: sql_help.c:1894 +#: sql_help.c:2410 sql_help.c:2613 msgid "link_symbol" msgstr "símbolo_ligação" -#: sql_help.c:1895 -msgid "attribute" -msgstr "atributo" +#: sql_help.c:2411 sql_help.c:2614 +msgid "sql_body" +msgstr "corpo_sql" -#: sql_help.c:1929 sql_help.c:2094 sql_help.c:2542 +#: sql_help.c:2449 sql_help.c:2676 sql_help.c:3242 msgid "uid" msgstr "uid" -#: sql_help.c:1943 +#: sql_help.c:2465 sql_help.c:2506 sql_help.c:2907 sql_help.c:2920 +#: sql_help.c:2934 sql_help.c:3002 msgid "method" msgstr "método" -#: sql_help.c:1947 sql_help.c:2293 sql_help.c:3199 -msgid "opclass" -msgstr "classe_operadores" - -#: sql_help.c:1951 sql_help.c:2279 -msgid "predicate" -msgstr "predicado" +#: sql_help.c:2470 +msgid "opclass_parameter" +msgstr "parâmetro_classe_operador" -#: sql_help.c:1963 +#: sql_help.c:2487 msgid "call_handler" -msgstr "manipulador_chamada" +msgstr "tratador_chamada" -#: sql_help.c:1964 +#: sql_help.c:2488 msgid "inline_handler" -msgstr "manipulador_em_linha" +msgstr "tratador_em_linha" -#: sql_help.c:1965 +#: sql_help.c:2489 msgid "valfunction" msgstr "função_validação" -#: sql_help.c:2001 +#: sql_help.c:2528 msgid "com_op" msgstr "operador_comutação" -#: sql_help.c:2002 +#: sql_help.c:2529 msgid "neg_op" msgstr "operador_negação" -#: sql_help.c:2020 +#: sql_help.c:2547 msgid "family_name" msgstr "nome_família" -#: sql_help.c:2031 +#: sql_help.c:2558 msgid "storage_type" msgstr "tipo_armazenamento" -#: sql_help.c:2111 sql_help.c:2427 sql_help.c:2604 sql_help.c:3209 -#: sql_help.c:3624 sql_help.c:3626 sql_help.c:3714 sql_help.c:3716 -#: sql_help.c:3863 sql_help.c:3865 sql_help.c:3968 sql_help.c:4057 -#: sql_help.c:4059 -msgid "condition" -msgstr "condição" - -#: sql_help.c:2115 sql_help.c:2430 +#: sql_help.c:2697 sql_help.c:3126 msgid "where event can be one of:" -msgstr "onde evento pode ser um dos:" +msgstr "onde evento pode ser um dos seguintes:" -#: sql_help.c:2134 sql_help.c:2136 +#: sql_help.c:2717 sql_help.c:2719 msgid "schema_element" msgstr "elemento_esquema" -#: sql_help.c:2170 +#: sql_help.c:2756 msgid "server_type" msgstr "tipo_servidor" -#: sql_help.c:2171 +#: sql_help.c:2757 msgid "server_version" msgstr "versão_servidor" -#: sql_help.c:2172 sql_help.c:3119 sql_help.c:3451 +#: sql_help.c:2758 sql_help.c:3907 sql_help.c:4359 msgid "fdw_name" msgstr "nome_fdw" -#: sql_help.c:2244 +#: sql_help.c:2775 sql_help.c:2778 +msgid "statistics_name" +msgstr "nome_estatísticas" + +#: sql_help.c:2779 +msgid "statistics_kind" +msgstr "tipo_estatísticas" + +#: sql_help.c:2795 +msgid "subscription_name" +msgstr "nome_subscrição" + +#: sql_help.c:2900 msgid "source_table" msgstr "tabela_origem" -#: sql_help.c:2245 +#: sql_help.c:2901 msgid "like_option" msgstr "opção_like" -#: sql_help.c:2262 sql_help.c:2263 sql_help.c:2272 sql_help.c:2274 -#: sql_help.c:2278 -msgid "index_parameters" -msgstr "parâmetros_índice" - -#: sql_help.c:2264 sql_help.c:2281 -msgid "reftable" -msgstr "tabela_ref" - -#: sql_help.c:2265 sql_help.c:2282 -msgid "refcolumn" -msgstr "coluna_ref" - -#: sql_help.c:2276 -msgid "exclude_element" -msgstr "elemento_exclusão" - -#: sql_help.c:2277 sql_help.c:3631 sql_help.c:3721 sql_help.c:3870 -#: sql_help.c:3999 sql_help.c:4064 -msgid "operator" -msgstr "operador" - -#: sql_help.c:2285 +#: sql_help.c:2967 msgid "and like_option is:" msgstr "e opção_like é:" -#: sql_help.c:2286 -msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" -msgstr "parâmetros_índice em restrições UNIQUE, PRIMARY KEY e EXCLUDE são:" - -#: sql_help.c:2290 -msgid "exclude_element in an EXCLUDE constraint is:" -msgstr "elemento_exclusão em uma restrição EXCLUDE é:" - -#: sql_help.c:2325 +#: sql_help.c:3019 msgid "directory" msgstr "diretório" -#: sql_help.c:2339 +#: sql_help.c:3033 msgid "parser_name" msgstr "nome_analisador" -#: sql_help.c:2340 +#: sql_help.c:3034 msgid "source_config" msgstr "configuração_origem" -#: sql_help.c:2369 +#: sql_help.c:3063 msgid "start_function" msgstr "função_início" -#: sql_help.c:2370 +#: sql_help.c:3064 msgid "gettoken_function" msgstr "função_gettoken" -#: sql_help.c:2371 +#: sql_help.c:3065 msgid "end_function" msgstr "função_fim" -#: sql_help.c:2372 +#: sql_help.c:3066 msgid "lextypes_function" msgstr "função_lextypes" -#: sql_help.c:2373 +#: sql_help.c:3067 msgid "headline_function" msgstr "função_headline" -#: sql_help.c:2385 +#: sql_help.c:3079 msgid "init_function" msgstr "função_init" -#: sql_help.c:2386 +#: sql_help.c:3080 msgid "lexize_function" msgstr "função_lexize" -#: sql_help.c:2399 +#: sql_help.c:3093 msgid "from_sql_function_name" -msgstr "nome_função_do_sql" +msgstr "nome_função_sql_from" -#: sql_help.c:2401 +#: sql_help.c:3095 msgid "to_sql_function_name" -msgstr "nome_função_para_sql" +msgstr "nome_função_sql_to" -#: sql_help.c:2426 +#: sql_help.c:3121 msgid "referenced_table_name" msgstr "nome_tabela_referenciada" -#: sql_help.c:2429 +#: sql_help.c:3122 +msgid "transition_relation_name" +msgstr "nome_relação_transição" + +#: sql_help.c:3125 msgid "arguments" msgstr "argumentos" -#: sql_help.c:2479 sql_help.c:3559 +#: sql_help.c:3177 msgid "label" msgstr "rótulo" -#: sql_help.c:2481 +#: sql_help.c:3179 msgid "subtype" msgstr "subtipo" -#: sql_help.c:2482 +#: sql_help.c:3180 msgid "subtype_operator_class" -msgstr "classe_operadores_subtipo" +msgstr "classe_operador_subtipo" -#: sql_help.c:2484 +#: sql_help.c:3182 msgid "canonical_function" msgstr "função_canônica" -#: sql_help.c:2485 +#: sql_help.c:3183 msgid "subtype_diff_function" msgstr "função_diff_subtipo" -#: sql_help.c:2487 +#: sql_help.c:3184 +msgid "multirange_type_name" +msgstr "nome_tipo_multi_intervalo" + +#: sql_help.c:3186 msgid "input_function" msgstr "função_entrada" -#: sql_help.c:2488 +#: sql_help.c:3187 msgid "output_function" msgstr "função_saída" -#: sql_help.c:2489 +#: sql_help.c:3188 msgid "receive_function" msgstr "função_recepção" -#: sql_help.c:2490 +#: sql_help.c:3189 msgid "send_function" msgstr "função_envio" -#: sql_help.c:2491 +#: sql_help.c:3190 msgid "type_modifier_input_function" msgstr "função_entrada_modificador_tipo" -#: sql_help.c:2492 +#: sql_help.c:3191 msgid "type_modifier_output_function" msgstr "função_saída_modificador_tipo" -#: sql_help.c:2493 +#: sql_help.c:3192 msgid "analyze_function" msgstr "função_análise" -#: sql_help.c:2494 +#: sql_help.c:3193 +msgid "subscript_function" +msgstr "função_índice" + +#: sql_help.c:3194 msgid "internallength" msgstr "tamanho_interno" -#: sql_help.c:2495 +#: sql_help.c:3195 msgid "alignment" msgstr "alinhamento" -#: sql_help.c:2496 +#: sql_help.c:3196 msgid "storage" msgstr "armazenamento" -#: sql_help.c:2497 +#: sql_help.c:3197 msgid "like_type" msgstr "tipo_like" -#: sql_help.c:2498 +#: sql_help.c:3198 msgid "category" msgstr "categoria" -#: sql_help.c:2499 +#: sql_help.c:3199 msgid "preferred" msgstr "tipo_preferido" -#: sql_help.c:2500 +#: sql_help.c:3200 msgid "default" msgstr "valor_padrão" -#: sql_help.c:2501 +#: sql_help.c:3201 msgid "element" msgstr "elemento" -#: sql_help.c:2502 +#: sql_help.c:3202 msgid "delimiter" msgstr "delimitador" -#: sql_help.c:2503 +#: sql_help.c:3203 msgid "collatable" -msgstr "collatable" +msgstr "ordenável" -#: sql_help.c:2600 sql_help.c:3185 sql_help.c:3619 sql_help.c:3708 -#: sql_help.c:3858 sql_help.c:3958 sql_help.c:4052 +#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4076 sql_help.c:4559 +#: sql_help.c:4661 sql_help.c:4816 sql_help.c:4929 sql_help.c:5062 msgid "with_query" msgstr "consulta_with" -#: sql_help.c:2602 sql_help.c:3187 sql_help.c:3638 sql_help.c:3644 -#: sql_help.c:3647 sql_help.c:3651 sql_help.c:3655 sql_help.c:3663 -#: sql_help.c:3877 sql_help.c:3883 sql_help.c:3886 sql_help.c:3890 -#: sql_help.c:3894 sql_help.c:3902 sql_help.c:3960 sql_help.c:4071 -#: sql_help.c:4077 sql_help.c:4080 sql_help.c:4084 sql_help.c:4088 -#: sql_help.c:4096 +#: sql_help.c:3302 sql_help.c:3988 sql_help.c:4578 sql_help.c:4584 +#: sql_help.c:4587 sql_help.c:4591 sql_help.c:4595 sql_help.c:4603 +#: sql_help.c:4835 sql_help.c:4841 sql_help.c:4844 sql_help.c:4848 +#: sql_help.c:4852 sql_help.c:4860 sql_help.c:4931 sql_help.c:5081 +#: sql_help.c:5087 sql_help.c:5090 sql_help.c:5094 sql_help.c:5098 +#: sql_help.c:5106 msgid "alias" msgstr "aliás" -#: sql_help.c:2603 -msgid "using_list" -msgstr "lista_using" +#: sql_help.c:3303 sql_help.c:4563 sql_help.c:4605 sql_help.c:4607 +#: sql_help.c:4611 sql_help.c:4613 sql_help.c:4614 sql_help.c:4615 +#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4862 sql_help.c:4864 +#: sql_help.c:4868 sql_help.c:4870 sql_help.c:4871 sql_help.c:4872 +#: sql_help.c:4938 sql_help.c:5066 sql_help.c:5108 sql_help.c:5110 +#: sql_help.c:5114 sql_help.c:5116 sql_help.c:5117 sql_help.c:5118 +msgid "from_item" +msgstr "item_from" -#: sql_help.c:2605 sql_help.c:3026 sql_help.c:3266 sql_help.c:3969 +#: sql_help.c:3305 sql_help.c:3788 sql_help.c:4126 sql_help.c:4940 msgid "cursor_name" msgstr "nome_cursor" -#: sql_help.c:2606 sql_help.c:3193 sql_help.c:3970 +#: sql_help.c:3306 sql_help.c:3994 sql_help.c:4941 msgid "output_expression" msgstr "expressão_saída" -#: sql_help.c:2607 sql_help.c:3194 sql_help.c:3622 sql_help.c:3711 -#: sql_help.c:3861 sql_help.c:3971 sql_help.c:4055 +#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4562 sql_help.c:4664 +#: sql_help.c:4819 sql_help.c:4942 sql_help.c:5065 msgid "output_name" msgstr "nome_saída" -#: sql_help.c:2623 +#: sql_help.c:3323 msgid "code" msgstr "código" -#: sql_help.c:2974 +#: sql_help.c:3728 msgid "parameter" msgstr "parâmetro" -#: sql_help.c:2993 sql_help.c:2994 sql_help.c:3291 +#: sql_help.c:3751 sql_help.c:3752 sql_help.c:4151 msgid "statement" msgstr "comando" -#: sql_help.c:3025 sql_help.c:3265 +#: sql_help.c:3787 sql_help.c:4125 msgid "direction" msgstr "direção" -#: sql_help.c:3027 sql_help.c:3267 -msgid "where direction can be empty or one of:" -msgstr "onde direção pode ser vazio ou um dos:" +#: sql_help.c:3789 sql_help.c:4127 +msgid "where direction can be one of:" +msgstr "onde a direção pode ser uma das seguintes:" -#: sql_help.c:3028 sql_help.c:3029 sql_help.c:3030 sql_help.c:3031 -#: sql_help.c:3032 sql_help.c:3268 sql_help.c:3269 sql_help.c:3270 -#: sql_help.c:3271 sql_help.c:3272 sql_help.c:3632 sql_help.c:3634 -#: sql_help.c:3722 sql_help.c:3724 sql_help.c:3871 sql_help.c:3873 -#: sql_help.c:4000 sql_help.c:4002 sql_help.c:4065 sql_help.c:4067 +#: sql_help.c:3790 sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 +#: sql_help.c:3794 sql_help.c:4128 sql_help.c:4129 sql_help.c:4130 +#: sql_help.c:4131 sql_help.c:4132 sql_help.c:4572 sql_help.c:4574 +#: sql_help.c:4675 sql_help.c:4677 sql_help.c:4829 sql_help.c:4831 +#: sql_help.c:5006 sql_help.c:5008 sql_help.c:5075 sql_help.c:5077 msgid "count" msgstr "contador" -#: sql_help.c:3112 sql_help.c:3444 +#: sql_help.c:3897 sql_help.c:4349 msgid "sequence_name" msgstr "nome_sequência" -#: sql_help.c:3125 sql_help.c:3457 +#: sql_help.c:3915 sql_help.c:4367 msgid "arg_name" msgstr "nome_argumento" -#: sql_help.c:3126 sql_help.c:3458 +#: sql_help.c:3916 sql_help.c:4368 msgid "arg_type" msgstr "tipo_argumento" -#: sql_help.c:3131 sql_help.c:3463 +#: sql_help.c:3923 sql_help.c:4375 msgid "loid" msgstr "loid" -#: sql_help.c:3154 +#: sql_help.c:3954 msgid "remote_schema" msgstr "esquema_remoto" -#: sql_help.c:3157 +#: sql_help.c:3957 msgid "local_schema" msgstr "esquema_local" -#: sql_help.c:3191 +#: sql_help.c:3992 msgid "conflict_target" -msgstr "alvo_conflito" +msgstr "destino_conflito" -#: sql_help.c:3192 +#: sql_help.c:3993 msgid "conflict_action" msgstr "ação_conflito" -#: sql_help.c:3195 +#: sql_help.c:3996 msgid "where conflict_target can be one of:" -msgstr "onde alvo_conflito pode ser um dos:" +msgstr "onde destino_conflito pode ser um dos seguintes:" -#: sql_help.c:3196 +#: sql_help.c:3997 msgid "index_column_name" msgstr "nome_coluna_índice" -#: sql_help.c:3197 +#: sql_help.c:3998 msgid "index_expression" msgstr "expressão_índice" -#: sql_help.c:3200 +#: sql_help.c:4001 msgid "index_predicate" msgstr "predicado_índice" -#: sql_help.c:3202 +#: sql_help.c:4003 msgid "and conflict_action is one of:" msgstr "onde ação_conflito é uma das:" -#: sql_help.c:3208 sql_help.c:3966 +#: sql_help.c:4009 sql_help.c:4937 msgid "sub-SELECT" msgstr "sub-SELECT" -#: sql_help.c:3217 sql_help.c:3280 sql_help.c:3942 +#: sql_help.c:4018 sql_help.c:4140 sql_help.c:4913 msgid "channel" msgstr "canal" -#: sql_help.c:3239 +#: sql_help.c:4040 msgid "lockmode" msgstr "modo_bloqueio" -#: sql_help.c:3240 +#: sql_help.c:4041 msgid "where lockmode is one of:" -msgstr "onde modo_bloqueio é um dos:" +msgstr "onde modo_bloqueio é um dos seguintes:" + +#: sql_help.c:4077 +msgid "target_table_name" +msgstr "nome_tabela_destino" + +#: sql_help.c:4078 +msgid "target_alias" +msgstr "alias_destino" + +#: sql_help.c:4079 +msgid "data_source" +msgstr "origem_dados" + +#: sql_help.c:4080 sql_help.c:4608 sql_help.c:4865 sql_help.c:5111 +msgid "join_condition" +msgstr "condição_junção" + +#: sql_help.c:4081 +msgid "when_clause" +msgstr "cláusula_when" -#: sql_help.c:3281 +#: sql_help.c:4082 +msgid "where data_source is:" +msgstr "onde fonte_dados é:" + +#: sql_help.c:4083 +msgid "source_table_name" +msgstr "nome_tabela_origem" + +#: sql_help.c:4084 +msgid "source_query" +msgstr "consulta_origem" + +#: sql_help.c:4085 +msgid "source_alias" +msgstr "alias_origem" + +#: sql_help.c:4086 +msgid "and when_clause is:" +msgstr "e cláusula_when é:" + +#: sql_help.c:4088 +msgid "merge_update" +msgstr "mesclagem_atualização" + +#: sql_help.c:4089 +msgid "merge_delete" +msgstr "mesclagem_exclusão" + +#: sql_help.c:4091 +msgid "merge_insert" +msgstr "mesclagem_inserção" + +#: sql_help.c:4092 +msgid "and merge_insert is:" +msgstr "e mesclagem_inserção é:" + +#: sql_help.c:4095 +msgid "and merge_update is:" +msgstr "e mesclagem_atualização é:" + +#: sql_help.c:4100 +msgid "and merge_delete is:" +msgstr "e mesclagem_exclusão é:" + +#: sql_help.c:4141 msgid "payload" -msgstr "informação" +msgstr "carga útil" -#: sql_help.c:3308 +#: sql_help.c:4168 msgid "old_role" msgstr "role_antiga" -#: sql_help.c:3309 +#: sql_help.c:4169 msgid "new_role" -msgstr "nova_role" +msgstr "role_nova" -#: sql_help.c:3334 sql_help.c:3495 sql_help.c:3503 +#: sql_help.c:4208 sql_help.c:4417 sql_help.c:4425 msgid "savepoint_name" -msgstr "nome_ponto_de_salvamento" - -#: sql_help.c:3536 -msgid "provider" -msgstr "fornecedor" - -#: sql_help.c:3623 sql_help.c:3665 sql_help.c:3667 sql_help.c:3713 -#: sql_help.c:3862 sql_help.c:3904 sql_help.c:3906 sql_help.c:4056 -#: sql_help.c:4098 sql_help.c:4100 -msgid "from_item" -msgstr "item_from" +msgstr "nome_ponto_salvamento" -#: sql_help.c:3625 sql_help.c:3677 sql_help.c:3864 sql_help.c:3916 -#: sql_help.c:4058 sql_help.c:4110 +#: sql_help.c:4565 sql_help.c:4623 sql_help.c:4822 sql_help.c:4880 +#: sql_help.c:5068 sql_help.c:5126 msgid "grouping_element" msgstr "elemento_agrupamento" -#: sql_help.c:3627 sql_help.c:3717 sql_help.c:3866 sql_help.c:4060 +#: sql_help.c:4567 sql_help.c:4670 sql_help.c:4824 sql_help.c:5070 msgid "window_name" -msgstr "nome_deslizante" +msgstr "nome_janela" -#: sql_help.c:3628 sql_help.c:3718 sql_help.c:3867 sql_help.c:4061 +#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071 msgid "window_definition" -msgstr "definição_deslizante" +msgstr "definição_janela" -#: sql_help.c:3629 sql_help.c:3643 sql_help.c:3681 sql_help.c:3719 -#: sql_help.c:3868 sql_help.c:3882 sql_help.c:3920 sql_help.c:4062 -#: sql_help.c:4076 sql_help.c:4114 +#: sql_help.c:4569 sql_help.c:4583 sql_help.c:4627 sql_help.c:4672 +#: sql_help.c:4826 sql_help.c:4840 sql_help.c:4884 sql_help.c:5072 +#: sql_help.c:5086 sql_help.c:5130 msgid "select" msgstr "seleção" -#: sql_help.c:3636 sql_help.c:3875 sql_help.c:4069 +#: sql_help.c:4576 sql_help.c:4833 sql_help.c:5079 msgid "where from_item can be one of:" -msgstr "onde item_from pode ser um dos:" +msgstr "onde item_from pode ser um dos seguintes:" -#: sql_help.c:3639 sql_help.c:3645 sql_help.c:3648 sql_help.c:3652 -#: sql_help.c:3664 sql_help.c:3878 sql_help.c:3884 sql_help.c:3887 -#: sql_help.c:3891 sql_help.c:3903 sql_help.c:4072 sql_help.c:4078 -#: sql_help.c:4081 sql_help.c:4085 sql_help.c:4097 +#: sql_help.c:4579 sql_help.c:4585 sql_help.c:4588 sql_help.c:4592 +#: sql_help.c:4604 sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 +#: sql_help.c:4849 sql_help.c:4861 sql_help.c:5082 sql_help.c:5088 +#: sql_help.c:5091 sql_help.c:5095 sql_help.c:5107 msgid "column_alias" msgstr "aliás_coluna" -#: sql_help.c:3640 sql_help.c:3879 sql_help.c:4073 +#: sql_help.c:4580 sql_help.c:4837 sql_help.c:5083 msgid "sampling_method" msgstr "método_amostragem" -#: sql_help.c:3641 sql_help.c:3650 sql_help.c:3654 sql_help.c:3658 -#: sql_help.c:3661 sql_help.c:3880 sql_help.c:3889 sql_help.c:3893 -#: sql_help.c:3897 sql_help.c:3900 sql_help.c:4074 sql_help.c:4083 -#: sql_help.c:4087 sql_help.c:4091 sql_help.c:4094 -msgid "argument" -msgstr "argumento" - -#: sql_help.c:3642 sql_help.c:3881 sql_help.c:4075 +#: sql_help.c:4582 sql_help.c:4839 sql_help.c:5085 msgid "seed" msgstr "semente" -#: sql_help.c:3646 sql_help.c:3679 sql_help.c:3885 sql_help.c:3918 -#: sql_help.c:4079 sql_help.c:4112 +#: sql_help.c:4586 sql_help.c:4625 sql_help.c:4843 sql_help.c:4882 +#: sql_help.c:5089 sql_help.c:5128 msgid "with_query_name" msgstr "nome_consulta_with" -#: sql_help.c:3656 sql_help.c:3659 sql_help.c:3662 sql_help.c:3895 -#: sql_help.c:3898 sql_help.c:3901 sql_help.c:4089 sql_help.c:4092 -#: sql_help.c:4095 +#: sql_help.c:4596 sql_help.c:4599 sql_help.c:4602 sql_help.c:4853 +#: sql_help.c:4856 sql_help.c:4859 sql_help.c:5099 sql_help.c:5102 +#: sql_help.c:5105 msgid "column_definition" msgstr "definição_coluna" -#: sql_help.c:3666 sql_help.c:3905 sql_help.c:4099 +#: sql_help.c:4606 sql_help.c:4612 sql_help.c:4863 sql_help.c:4869 +#: sql_help.c:5109 sql_help.c:5115 msgid "join_type" msgstr "tipo_junção" -#: sql_help.c:3668 sql_help.c:3907 sql_help.c:4101 -msgid "join_condition" -msgstr "condição_junção" - -#: sql_help.c:3669 sql_help.c:3908 sql_help.c:4102 +#: sql_help.c:4609 sql_help.c:4866 sql_help.c:5112 msgid "join_column" msgstr "coluna_junção" -#: sql_help.c:3670 sql_help.c:3909 sql_help.c:4103 +#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113 +msgid "join_using_alias" +msgstr "junção_usando_alias" + +#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5119 msgid "and grouping_element can be one of:" -msgstr "onde elemento_agrupamento pode ser um dos:" +msgstr "e elemento_agrupamento pode ser um dos seguintes:" -#: sql_help.c:3678 sql_help.c:3917 sql_help.c:4111 +#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5127 msgid "and with_query is:" -msgstr "e consulta_with é:" +msgstr "e a consulta_with é:" -#: sql_help.c:3682 sql_help.c:3921 sql_help.c:4115 +#: sql_help.c:4628 sql_help.c:4885 sql_help.c:5131 msgid "values" msgstr "valores" -#: sql_help.c:3683 sql_help.c:3922 sql_help.c:4116 +#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132 msgid "insert" msgstr "inserção" -#: sql_help.c:3684 sql_help.c:3923 sql_help.c:4117 +#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133 msgid "update" msgstr "atualização" -#: sql_help.c:3685 sql_help.c:3924 sql_help.c:4118 +#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134 msgid "delete" msgstr "exclusão" -#: sql_help.c:3712 -msgid "new_table" -msgstr "nova_tabela" +#: sql_help.c:4633 sql_help.c:4890 sql_help.c:5136 +msgid "search_seq_col_name" +msgstr "nome_col_seq_procura" -#: sql_help.c:3737 -msgid "timezone" -msgstr "zona_horária" +#: sql_help.c:4635 sql_help.c:4892 sql_help.c:5138 +msgid "cycle_mark_col_name" +msgstr "nome_col_marca_ciclo" -#: sql_help.c:3782 -msgid "snapshot_id" -msgstr "id_snapshot" +#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139 +msgid "cycle_mark_value" +msgstr "valor_marca_ciclo" -#: sql_help.c:3967 -msgid "from_list" -msgstr "lista_from" +#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140 +msgid "cycle_mark_default" +msgstr "padrão_marca_ciclo" -#: sql_help.c:3998 +#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141 +msgid "cycle_path_col_name" +msgstr "nome_col_caminho_ciclo" + +#: sql_help.c:4665 +msgid "new_table" +msgstr "tabela_nova" + +#: sql_help.c:4736 +msgid "snapshot_id" +msgstr "id_instantâneeo" + +#: sql_help.c:5004 msgid "sort_expression" -msgstr "expressão_ordenação" +msgstr "expressão_classificação" -#: sql_help.c:4125 sql_help.c:4865 +#: sql_help.c:5148 sql_help.c:6132 msgid "abort the current transaction" -msgstr "transação atual foi interrompida" +msgstr "interrompe a transação corrente" -#: sql_help.c:4130 +#: sql_help.c:5154 msgid "change the definition of an aggregate function" msgstr "muda a definição de uma função de agregação" -#: sql_help.c:4135 +#: sql_help.c:5160 msgid "change the definition of a collation" msgstr "muda a definição de uma ordenação" -#: sql_help.c:4140 +#: sql_help.c:5166 msgid "change the definition of a conversion" msgstr "muda a definição de uma conversão" -#: sql_help.c:4145 +#: sql_help.c:5172 msgid "change a database" msgstr "muda o banco de dados" -#: sql_help.c:4150 +#: sql_help.c:5178 msgid "define default access privileges" -msgstr "define privilégios de acesso padrão" +msgstr "define os privilégios de acesso padrão" -#: sql_help.c:4155 +#: sql_help.c:5184 msgid "change the definition of a domain" msgstr "muda a definição de um domínio" -#: sql_help.c:4160 +#: sql_help.c:5190 msgid "change the definition of an event trigger" msgstr "muda a definição de um gatilho de eventos" -#: sql_help.c:4165 +#: sql_help.c:5196 msgid "change the definition of an extension" msgstr "muda a definição de uma extensão" -#: sql_help.c:4170 +#: sql_help.c:5202 msgid "change the definition of a foreign-data wrapper" -msgstr "muda a definição de um adaptador de dados externos" +msgstr "muda a definição de um empacotador de dados estrangeiros" -#: sql_help.c:4175 +#: sql_help.c:5208 msgid "change the definition of a foreign table" -msgstr "muda a definição de uma tabela externa" +msgstr "muda a definição de uma tabela estrangeira" -#: sql_help.c:4180 +#: sql_help.c:5214 msgid "change the definition of a function" msgstr "muda a definição de uma função" -#: sql_help.c:4185 +#: sql_help.c:5220 msgid "change role name or membership" -msgstr "muda nome da role ou membro" +msgstr "muda o nome da função de banco de dados (role), ou participação" -#: sql_help.c:4190 +#: sql_help.c:5226 msgid "change the definition of an index" msgstr "muda a definição de um índice" -#: sql_help.c:4195 +#: sql_help.c:5232 msgid "change the definition of a procedural language" msgstr "muda a definição de uma linguagem procedural" -#: sql_help.c:4200 +#: sql_help.c:5238 msgid "change the definition of a large object" msgstr "muda a definição de um objeto grande" -#: sql_help.c:4205 +#: sql_help.c:5244 msgid "change the definition of a materialized view" msgstr "muda a definição de uma visão materializada" -#: sql_help.c:4210 +#: sql_help.c:5250 msgid "change the definition of an operator" msgstr "muda a definição de um operador" -#: sql_help.c:4215 +#: sql_help.c:5256 msgid "change the definition of an operator class" -msgstr "muda a definição de uma classe de operadores" +msgstr "muda a definição de uma classe de operador" -#: sql_help.c:4220 +#: sql_help.c:5262 msgid "change the definition of an operator family" msgstr "muda a definição de uma família de operadores" -#: sql_help.c:4225 -msgid "change the definition of a row level security policy" -msgstr "muda a definição de uma política de segurança a nível de registros" +#: sql_help.c:5268 +msgid "change the definition of a row-level security policy" +msgstr "muda a definição de uma política de segurança no nível de linha" + +#: sql_help.c:5274 +msgid "change the definition of a procedure" +msgstr "muda a definição de um procedimento" -#: sql_help.c:4230 sql_help.c:4300 +#: sql_help.c:5280 +msgid "change the definition of a publication" +msgstr "muda a definição de uma publicação" + +#: sql_help.c:5286 sql_help.c:5388 msgid "change a database role" -msgstr "muda uma role do banco de dados" +msgstr "muda uma função de banco de dados (role)" + +#: sql_help.c:5292 +msgid "change the definition of a routine" +msgstr "muda a definição de uma rotina" -#: sql_help.c:4235 +#: sql_help.c:5298 msgid "change the definition of a rule" msgstr "muda a definição de uma regra" -#: sql_help.c:4240 +#: sql_help.c:5304 msgid "change the definition of a schema" msgstr "muda a definição de um esquema" -#: sql_help.c:4245 +#: sql_help.c:5310 msgid "change the definition of a sequence generator" msgstr "muda a definição de um gerador de sequência" -#: sql_help.c:4250 +#: sql_help.c:5316 msgid "change the definition of a foreign server" -msgstr "muda a definição de um servidor externo" +msgstr "muda a definição de um servidor estrangeiro" + +#: sql_help.c:5322 +msgid "change the definition of an extended statistics object" +msgstr "muda a definição de um objeto de estatísticas estendidas" + +#: sql_help.c:5328 +msgid "change the definition of a subscription" +msgstr "muda a definição de uma subscrição" -#: sql_help.c:4255 +#: sql_help.c:5334 msgid "change a server configuration parameter" msgstr "muda um parâmetro de configuração do servidor" -#: sql_help.c:4260 +#: sql_help.c:5340 msgid "change the definition of a table" msgstr "muda a definição de uma tabela" -#: sql_help.c:4265 +#: sql_help.c:5346 msgid "change the definition of a tablespace" -msgstr "muda a definição de uma tablespace" +msgstr "muda a definição de um espaço de tabelas" -#: sql_help.c:4270 +#: sql_help.c:5352 msgid "change the definition of a text search configuration" -msgstr "muda a definição de uma configuração de busca textual" +msgstr "muda a definição de uma configuração de procura de texto" -#: sql_help.c:4275 +#: sql_help.c:5358 msgid "change the definition of a text search dictionary" -msgstr "muda a definição de um dicionário de busca textual" +msgstr "muda a definição de um dicionário de procura de texto" -#: sql_help.c:4280 +#: sql_help.c:5364 msgid "change the definition of a text search parser" -msgstr "muda a definição de um analisador de busca textual" +msgstr "muda a definição de um analisador de procura de texto" -#: sql_help.c:4285 +#: sql_help.c:5370 msgid "change the definition of a text search template" -msgstr "muda a definição de um modelo de busca textual" +msgstr "muda a definição de um modelo de procura de texto" -#: sql_help.c:4290 +#: sql_help.c:5376 msgid "change the definition of a trigger" msgstr "muda a definição de um gatilho" -#: sql_help.c:4295 +#: sql_help.c:5382 msgid "change the definition of a type" msgstr "muda a definição de um tipo" -#: sql_help.c:4305 +#: sql_help.c:5394 msgid "change the definition of a user mapping" msgstr "muda a definição de um mapeamento de usuários" -#: sql_help.c:4310 +#: sql_help.c:5400 msgid "change the definition of a view" msgstr "muda a definição de uma visão" -#: sql_help.c:4315 +#: sql_help.c:5406 msgid "collect statistics about a database" msgstr "coleta estatísticas sobre o banco de dados" -#: sql_help.c:4320 sql_help.c:4930 +#: sql_help.c:5412 sql_help.c:6210 msgid "start a transaction block" msgstr "inicia um bloco de transação" -#: sql_help.c:4325 -msgid "force a transaction log checkpoint" -msgstr "força ponto de controle no log de transação" +#: sql_help.c:5418 +msgid "invoke a procedure" +msgstr "chama um procedimento" -#: sql_help.c:4330 +#: sql_help.c:5424 +msgid "force a write-ahead log checkpoint" +msgstr "força ponto de controle no WAL" + +#: sql_help.c:5430 msgid "close a cursor" msgstr "fecha um cursor" -#: sql_help.c:4335 +#: sql_help.c:5436 msgid "cluster a table according to an index" msgstr "agrupa uma tabela de acordo com um índice" -#: sql_help.c:4340 +#: sql_help.c:5442 msgid "define or change the comment of an object" -msgstr "define ou muda um comentário de um objeto" +msgstr "define ou muda o comentário de um objeto" -#: sql_help.c:4345 sql_help.c:4765 +#: sql_help.c:5448 sql_help.c:6006 msgid "commit the current transaction" -msgstr "efetiva a transação atual" +msgstr "efetiva a transação corrente" -#: sql_help.c:4350 +#: sql_help.c:5454 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "efetiva uma transação que foi anteriormente preparada para efetivação em duas fases" -#: sql_help.c:4355 +#: sql_help.c:5460 msgid "copy data between a file and a table" -msgstr "copia dados de um arquivo para uma tabela" +msgstr "copia os dados de um arquivo para uma tabela" -#: sql_help.c:4360 +#: sql_help.c:5466 msgid "define a new access method" msgstr "define um novo método de acesso" -#: sql_help.c:4365 +#: sql_help.c:5472 msgid "define a new aggregate function" msgstr "define um nova função de agregação" -#: sql_help.c:4370 +#: sql_help.c:5478 msgid "define a new cast" msgstr "define uma nova conversão de tipo" -#: sql_help.c:4375 +#: sql_help.c:5484 msgid "define a new collation" msgstr "define uma nova ordenação" -#: sql_help.c:4380 +#: sql_help.c:5490 msgid "define a new encoding conversion" msgstr "define uma nova conversão de codificação" -#: sql_help.c:4385 +#: sql_help.c:5496 msgid "create a new database" -msgstr "cria um novo banco de dados" +msgstr "cria um banco de dados" -#: sql_help.c:4390 +#: sql_help.c:5502 msgid "define a new domain" msgstr "define um novo domínio" -#: sql_help.c:4395 +#: sql_help.c:5508 msgid "define a new event trigger" msgstr "define um novo gatilho de eventos" -#: sql_help.c:4400 +#: sql_help.c:5514 msgid "install an extension" msgstr "instala uma extensão" -#: sql_help.c:4405 +#: sql_help.c:5520 msgid "define a new foreign-data wrapper" -msgstr "define um novo adaptador de dados externos" +msgstr "define um novo empacotador de dados estrangeiros" -#: sql_help.c:4410 +#: sql_help.c:5526 msgid "define a new foreign table" -msgstr "define uma nova tabela externa" +msgstr "define uma nova tabela estrangeira" -#: sql_help.c:4415 +#: sql_help.c:5532 msgid "define a new function" msgstr "define uma nova função" -#: sql_help.c:4420 sql_help.c:4460 sql_help.c:4535 +#: sql_help.c:5538 sql_help.c:5598 sql_help.c:5700 msgid "define a new database role" -msgstr "define uma nova role do banco de dados" +msgstr "define uma nova função de banco de dados (role) para o banco de dados" -#: sql_help.c:4425 +#: sql_help.c:5544 msgid "define a new index" msgstr "define um novo índice" -#: sql_help.c:4430 +#: sql_help.c:5550 msgid "define a new procedural language" msgstr "define uma nova linguagem procedural" -#: sql_help.c:4435 +#: sql_help.c:5556 msgid "define a new materialized view" msgstr "define uma nova visão materializada" -#: sql_help.c:4440 +#: sql_help.c:5562 msgid "define a new operator" msgstr "define um novo operador" -#: sql_help.c:4445 +#: sql_help.c:5568 msgid "define a new operator class" -msgstr "define uma nova classe de operadores" +msgstr "define uma nova classe de operador" -#: sql_help.c:4450 +#: sql_help.c:5574 msgid "define a new operator family" msgstr "define uma nova família de operadores" -#: sql_help.c:4455 -msgid "define a new row level security policy for a table" -msgstr "define uma nova política de segurança a nível de registros para uma tabela" +#: sql_help.c:5580 +msgid "define a new row-level security policy for a table" +msgstr "define uma nova política de segurança no nível de linha para uma tabela" + +#: sql_help.c:5586 +msgid "define a new procedure" +msgstr "define um novo procedimento" -#: sql_help.c:4465 +#: sql_help.c:5592 +msgid "define a new publication" +msgstr "define uma nova publicação" + +#: sql_help.c:5604 msgid "define a new rewrite rule" msgstr "define uma nova regra de reescrita" -#: sql_help.c:4470 +#: sql_help.c:5610 msgid "define a new schema" msgstr "define um novo esquema" -#: sql_help.c:4475 +#: sql_help.c:5616 msgid "define a new sequence generator" msgstr "define um novo gerador de sequência" -#: sql_help.c:4480 +#: sql_help.c:5622 msgid "define a new foreign server" -msgstr "define um novo servidor externo" +msgstr "define um novo servidor estrangeiro" + +#: sql_help.c:5628 +msgid "define extended statistics" +msgstr "define estatísticas estendidas" -#: sql_help.c:4485 +#: sql_help.c:5634 +msgid "define a new subscription" +msgstr "define uma nova subscrição" + +#: sql_help.c:5640 msgid "define a new table" msgstr "define uma nova tabela" -#: sql_help.c:4490 sql_help.c:4895 +#: sql_help.c:5646 sql_help.c:6168 msgid "define a new table from the results of a query" -msgstr "cria uma nova tabela a partir dos resultados de uma consulta" +msgstr "cria uma tabela a partir dos resultados de uma consulta" -#: sql_help.c:4495 +#: sql_help.c:5652 msgid "define a new tablespace" -msgstr "define uma nova tablespace" +msgstr "define um novo espaço de tabelas" -#: sql_help.c:4500 +#: sql_help.c:5658 msgid "define a new text search configuration" -msgstr "define uma nova configuração de busca textual" +msgstr "define uma nova configuração de procura de texto" -#: sql_help.c:4505 +#: sql_help.c:5664 msgid "define a new text search dictionary" -msgstr "define um novo dicionário de busca textual" +msgstr "define um novo dicionário de procura de texto" -#: sql_help.c:4510 +#: sql_help.c:5670 msgid "define a new text search parser" -msgstr "define um novo analisador de busca textual" +msgstr "define um novo analisador de procura de texto" -#: sql_help.c:4515 +#: sql_help.c:5676 msgid "define a new text search template" -msgstr "define um novo modelo de busca textual" +msgstr "define um novo modelo de procura de texto" -#: sql_help.c:4520 +#: sql_help.c:5682 msgid "define a new transform" msgstr "define uma nova transformação" -#: sql_help.c:4525 +#: sql_help.c:5688 msgid "define a new trigger" msgstr "define um novo gatilho" -#: sql_help.c:4530 +#: sql_help.c:5694 msgid "define a new data type" msgstr "define um novo tipo de dado" -#: sql_help.c:4540 +#: sql_help.c:5706 msgid "define a new mapping of a user to a foreign server" -msgstr "define um novo mapeamento de um usuário para um servidor externo" +msgstr "define um novo mapeamento de um usuário para um servidor estrangeiro" -#: sql_help.c:4545 +#: sql_help.c:5712 msgid "define a new view" msgstr "define uma nova visão" -#: sql_help.c:4550 +#: sql_help.c:5718 msgid "deallocate a prepared statement" msgstr "remove um comando preparado" -#: sql_help.c:4555 +#: sql_help.c:5724 msgid "define a cursor" msgstr "define um cursor" -#: sql_help.c:4560 +#: sql_help.c:5730 msgid "delete rows of a table" -msgstr "apaga registros de uma tabela" +msgstr "apaga linhas de uma tabela" -#: sql_help.c:4565 +#: sql_help.c:5736 msgid "discard session state" -msgstr "descarta estado da sessão" +msgstr "descarta o estado da sessão" -#: sql_help.c:4570 +#: sql_help.c:5742 msgid "execute an anonymous code block" msgstr "executa um bloco de código anônimo" -#: sql_help.c:4575 +#: sql_help.c:5748 msgid "remove an access method" msgstr "remove um método de acesso" -#: sql_help.c:4580 +#: sql_help.c:5754 msgid "remove an aggregate function" msgstr "remove uma função de agregação" -#: sql_help.c:4585 +#: sql_help.c:5760 msgid "remove a cast" msgstr "remove uma conversão de tipo" -#: sql_help.c:4590 +#: sql_help.c:5766 msgid "remove a collation" msgstr "remove uma ordenação" -#: sql_help.c:4595 +#: sql_help.c:5772 msgid "remove a conversion" msgstr "remove uma conversão" -#: sql_help.c:4600 +#: sql_help.c:5778 msgid "remove a database" msgstr "remove um banco de dados" -#: sql_help.c:4605 +#: sql_help.c:5784 msgid "remove a domain" msgstr "remove um domínio" -#: sql_help.c:4610 +#: sql_help.c:5790 msgid "remove an event trigger" msgstr "remove um gatilho de eventos" -#: sql_help.c:4615 +#: sql_help.c:5796 msgid "remove an extension" msgstr "remove uma extensão" -#: sql_help.c:4620 +#: sql_help.c:5802 msgid "remove a foreign-data wrapper" -msgstr "remove um adaptador de dados externos" +msgstr "remove um empacotador de dados estrangeiros" -#: sql_help.c:4625 +#: sql_help.c:5808 msgid "remove a foreign table" -msgstr "remove uma tabela externa" +msgstr "remove uma tabela estrangeira" -#: sql_help.c:4630 +#: sql_help.c:5814 msgid "remove a function" msgstr "remove uma função" -#: sql_help.c:4635 sql_help.c:4680 sql_help.c:4750 +#: sql_help.c:5820 sql_help.c:5886 sql_help.c:5988 msgid "remove a database role" -msgstr "remove uma role do banco de dados" +msgstr "remove uma função de banco de dados (role) do banco de dados" -#: sql_help.c:4640 +#: sql_help.c:5826 msgid "remove an index" msgstr "remove um índice" -#: sql_help.c:4645 +#: sql_help.c:5832 msgid "remove a procedural language" msgstr "remove uma linguagem procedural" -#: sql_help.c:4650 +#: sql_help.c:5838 msgid "remove a materialized view" msgstr "remove uma visão materializada" -#: sql_help.c:4655 +#: sql_help.c:5844 msgid "remove an operator" msgstr "remove um operador" -#: sql_help.c:4660 +#: sql_help.c:5850 msgid "remove an operator class" -msgstr "remove uma classe de operadores" +msgstr "remove uma classe de operador" -#: sql_help.c:4665 +#: sql_help.c:5856 msgid "remove an operator family" msgstr "remove uma família de operadores" -#: sql_help.c:4670 +#: sql_help.c:5862 msgid "remove database objects owned by a database role" -msgstr "remove objetos do banco de dados cujo dono é uma role do banco de dados" +msgstr "remove objetos do banco de dados cujo dono é uma função de banco de dados (role) do banco de dados" + +#: sql_help.c:5868 +msgid "remove a row-level security policy from a table" +msgstr "remove uma política de segurança no nível de linha de uma tabela" + +#: sql_help.c:5874 +msgid "remove a procedure" +msgstr "remove um procedimento" -#: sql_help.c:4675 -msgid "remove a row level security policy from a table" -msgstr "remove uma política de segurança a nível de registros de uma tabela" +#: sql_help.c:5880 +msgid "remove a publication" +msgstr "remove uma publicação" -#: sql_help.c:4685 +#: sql_help.c:5892 +msgid "remove a routine" +msgstr "remove uma rotina" + +#: sql_help.c:5898 msgid "remove a rewrite rule" msgstr "remove uma regra de reescrita" -#: sql_help.c:4690 +#: sql_help.c:5904 msgid "remove a schema" msgstr "remove um esquema" -#: sql_help.c:4695 +#: sql_help.c:5910 msgid "remove a sequence" msgstr "remove uma sequência" -#: sql_help.c:4700 +#: sql_help.c:5916 msgid "remove a foreign server descriptor" -msgstr "remove um descritor de servidor externo" +msgstr "remove um descritor de servidor estrangeiro" + +#: sql_help.c:5922 +msgid "remove extended statistics" +msgstr "remove estatísticas estendidas" -#: sql_help.c:4705 +#: sql_help.c:5928 +msgid "remove a subscription" +msgstr "remove uma subscrição" + +#: sql_help.c:5934 msgid "remove a table" msgstr "remove uma tabela" -#: sql_help.c:4710 +#: sql_help.c:5940 msgid "remove a tablespace" -msgstr "remove uma tablespace" +msgstr "remove um espaço de tabelas" -#: sql_help.c:4715 +#: sql_help.c:5946 msgid "remove a text search configuration" -msgstr "remove uma configuração de busca textual" +msgstr "remove uma configuração de procura de texto" -#: sql_help.c:4720 +#: sql_help.c:5952 msgid "remove a text search dictionary" -msgstr "remove um dicionário de busca textual" +msgstr "remove um dicionário de procura de texto" -#: sql_help.c:4725 +#: sql_help.c:5958 msgid "remove a text search parser" -msgstr "remove um analisador de busca textual" +msgstr "remove um analisador de procura de texto" -#: sql_help.c:4730 +#: sql_help.c:5964 msgid "remove a text search template" -msgstr "remove um modelo de busca textual" +msgstr "remove um modelo de procura de texto" -#: sql_help.c:4735 +#: sql_help.c:5970 msgid "remove a transform" msgstr "remove uma transformação" -#: sql_help.c:4740 +#: sql_help.c:5976 msgid "remove a trigger" msgstr "remove um gatilho" -#: sql_help.c:4745 +#: sql_help.c:5982 msgid "remove a data type" msgstr "remove um tipo de dado" -#: sql_help.c:4755 +#: sql_help.c:5994 msgid "remove a user mapping for a foreign server" -msgstr "remove um mapeamento de usuários para um servidor externo" +msgstr "remove um mapeamento de usuários para um servidor estrangeiro" -#: sql_help.c:4760 +#: sql_help.c:6000 msgid "remove a view" msgstr "remove uma visão" -#: sql_help.c:4770 +#: sql_help.c:6012 msgid "execute a prepared statement" msgstr "executa um comando preparado" -#: sql_help.c:4775 +#: sql_help.c:6018 msgid "show the execution plan of a statement" msgstr "mostra o plano de execução de um comando" -#: sql_help.c:4780 +#: sql_help.c:6024 msgid "retrieve rows from a query using a cursor" -msgstr "recupera registros de uma consulta utilizando um cursor" +msgstr "recupera linhas de uma consulta usando um cursor" -#: sql_help.c:4785 +#: sql_help.c:6030 msgid "define access privileges" msgstr "define privilégios de acesso" -#: sql_help.c:4790 +#: sql_help.c:6036 msgid "import table definitions from a foreign server" -msgstr "importa definições de tabelas de um servidor externo" +msgstr "importa definições de tabelas de um servidor estrangeiro" -#: sql_help.c:4795 +#: sql_help.c:6042 msgid "create new rows in a table" -msgstr "cria novos registros em uma tabela" +msgstr "cria novas linhas em uma tabela" -#: sql_help.c:4800 +#: sql_help.c:6048 msgid "listen for a notification" -msgstr "espera por uma notificação" +msgstr "escuta notificações" -#: sql_help.c:4805 +#: sql_help.c:6054 msgid "load a shared library file" msgstr "carrega um arquivo de biblioteca compartilhada" -#: sql_help.c:4810 +#: sql_help.c:6060 msgid "lock a table" msgstr "bloqueia uma tabela" -#: sql_help.c:4815 +#: sql_help.c:6066 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "insere, atualiza ou exclui condicionalmente linhas de uma tabela" + +#: sql_help.c:6072 msgid "position a cursor" msgstr "posiciona um cursor" -#: sql_help.c:4820 +#: sql_help.c:6078 msgid "generate a notification" msgstr "gera uma notificação" -#: sql_help.c:4825 +#: sql_help.c:6084 msgid "prepare a statement for execution" msgstr "prepara um comando para execução" -#: sql_help.c:4830 +#: sql_help.c:6090 msgid "prepare the current transaction for two-phase commit" -msgstr "prepara a transação atual para efetivação em duas fases" +msgstr "prepara a transação corrente para efetivação em duas fases" -#: sql_help.c:4835 +#: sql_help.c:6096 msgid "change the ownership of database objects owned by a database role" -msgstr "muda o dono dos objetos do banco de dados cujo dono é uma role do banco de dados" +msgstr "" +"muda o dono dos objetos de banco de dados cujo dono é uma\n" +"função de banco de dados (role) do banco de dados" -#: sql_help.c:4840 +#: sql_help.c:6102 msgid "replace the contents of a materialized view" msgstr "substitui o conteúdo de uma visão materializada" -#: sql_help.c:4845 +#: sql_help.c:6108 msgid "rebuild indexes" msgstr "reconstrói índices" -#: sql_help.c:4850 -msgid "destroy a previously defined savepoint" -msgstr "destrói um ponto de salvamento definido anteriormente" +#: sql_help.c:6114 +msgid "release a previously defined savepoint" +msgstr "libera um ponto de salvamento definido anteriormente" -#: sql_help.c:4855 +#: sql_help.c:6120 msgid "restore the value of a run-time parameter to the default value" msgstr "restaura o valor do parâmetro em tempo de execução para o valor padrão" -#: sql_help.c:4860 +#: sql_help.c:6126 msgid "remove access privileges" msgstr "remove privilégios de acesso" -#: sql_help.c:4870 +#: sql_help.c:6138 msgid "cancel a transaction that was earlier prepared for two-phase commit" -msgstr "cancela uma transação que foi anteriormente preparada para efetivação em duas fases" +msgstr "cancela uma transação que foi preparada anteriormente para efetivação em duas fases" -#: sql_help.c:4875 +#: sql_help.c:6144 msgid "roll back to a savepoint" -msgstr "desfaz modificações de um ponto de salvamento" +msgstr "desfaz até um ponto de salvamento" -#: sql_help.c:4880 +#: sql_help.c:6150 msgid "define a new savepoint within the current transaction" -msgstr "define um novo ponto de salvamento na transação atual" +msgstr "define um novo ponto de salvamento na transação corrente" -#: sql_help.c:4885 +#: sql_help.c:6156 msgid "define or change a security label applied to an object" msgstr "define ou muda um rótulo de segurança aplicado a um objeto" -#: sql_help.c:4890 sql_help.c:4935 sql_help.c:4965 +#: sql_help.c:6162 sql_help.c:6216 sql_help.c:6252 msgid "retrieve rows from a table or view" -msgstr "recupera registros de uma tabela ou visão" +msgstr "recupera linhas de uma tabela ou visão" -#: sql_help.c:4900 +#: sql_help.c:6174 msgid "change a run-time parameter" msgstr "muda um parâmetro em tempo de execução" -#: sql_help.c:4905 +#: sql_help.c:6180 msgid "set constraint check timing for the current transaction" -msgstr "define o momento de verificação da restrição na transação atual" +msgstr "define o momento de verificação da restrição na transação corrente" -#: sql_help.c:4910 +#: sql_help.c:6186 msgid "set the current user identifier of the current session" -msgstr "define o identificador do usuário atual nesta sessão" +msgstr "define o identificador do usuário corrente desta sessão" -#: sql_help.c:4915 +#: sql_help.c:6192 msgid "set the session user identifier and the current user identifier of the current session" -msgstr "define o identificador da sessão do usuário e o identificador do usuário na sessão atual" +msgstr "" +"define o identificador do usuário da sessão e o\n" +"identificador do usuário corrente da sessão em curso" -#: sql_help.c:4920 +#: sql_help.c:6198 msgid "set the characteristics of the current transaction" msgstr "define as características da transação atual" -#: sql_help.c:4925 +#: sql_help.c:6204 msgid "show the value of a run-time parameter" msgstr "mostra o valor de um parâmetro em tempo de execução" -#: sql_help.c:4940 +#: sql_help.c:6222 msgid "empty a table or set of tables" msgstr "esvazia uma tabela ou um conjunto de tabelas" -#: sql_help.c:4945 +#: sql_help.c:6228 msgid "stop listening for a notification" msgstr "para de esperar por notificação" -#: sql_help.c:4950 +#: sql_help.c:6234 msgid "update rows of a table" -msgstr "atualiza registros de uma tabela" +msgstr "atualiza linhas de uma tabela" -#: sql_help.c:4955 +#: sql_help.c:6240 msgid "garbage-collect and optionally analyze a database" -msgstr "coleta lixo e opcionalmente analisa um banco de dados" +msgstr "coleta o lixo e opcionalmente analisa um banco de dados" -#: sql_help.c:4960 +#: sql_help.c:6246 msgid "compute a set of rows" -msgstr "computa um conjunto de registros" +msgstr "computa um conjunto de linhas" -#: startup.c:189 +#: startup.c:220 #, c-format -msgid "%s: -1 can only be used in non-interactive mode\n" -msgstr "%s: -1 só pode ser utilizado em modo não interativo\n" +msgid "-1 can only be used in non-interactive mode" +msgstr "-1 só pode ser usado no modo não interativo" -#: startup.c:289 +#: startup.c:343 #, c-format -msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s: não pôde abrir arquivo de log \"%s\": %s\n" +msgid "could not open log file \"%s\": %m" +msgstr "não foi possível abrir o arquivo de log \"%s\": %m" -#: startup.c:389 +#: startup.c:460 #, c-format msgid "" "Type \"help\" for help.\n" "\n" msgstr "" -"Digite \"help\" para ajuda.\n" +"Digite \"help\" para obter ajuda.\n" "\n" -#: startup.c:538 +#: startup.c:612 +#, c-format +msgid "could not set printing parameter \"%s\"" +msgstr "não foi possível definir o parâmetro de impressão \"%s\"" + +#: startup.c:719 #, c-format -msgid "%s: could not set printing parameter \"%s\"\n" -msgstr "%s: não pôde definir parâmetro de exibição \"%s\"\n" +msgid "Try \"%s --help\" for more information." +msgstr "Tente \"%s --help\" para obter mais informações." -#: startup.c:578 +#: startup.c:735 #, c-format -msgid "%s: could not delete variable \"%s\"\n" -msgstr "%s: não pôde apagar variável \"%s\"\n" +msgid "extra command-line argument \"%s\" ignored" +msgstr "argumento extra de linha de comando \"%s\" ignorado" -#: startup.c:588 +#: startup.c:783 #, c-format -msgid "%s: could not set variable \"%s\"\n" -msgstr "%s: não pôde definir variável \"%s\"\n" +msgid "could not find own program executable" +msgstr "não foi possível encontrar seu próprio executável" -#: startup.c:648 +#: tab-complete.c:6078 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "Tente \"%s --help\" para obter informações adicionais.\n" +msgid "" +"tab completion query failed: %s\n" +"Query was:\n" +"%s" +msgstr "" +"falha na completação da consulta por tab: %s\n" +"A consulta era:\n" +"%s" -#: startup.c:665 +#: variables.c:139 #, c-format -msgid "%s: warning: extra command-line argument \"%s\" ignored\n" -msgstr "%s: aviso: argumento extra de linha de comando \"%s\" ignorado\n" +msgid "unrecognized value \"%s\" for \"%s\": Boolean expected" +msgstr "valor não reconhecido \"%s\" para \"%s\": esperado um valor booleano" -#: startup.c:714 +#: variables.c:176 #, c-format -msgid "%s: could not find own program executable\n" -msgstr "%s: não pôde encontrar executável\n" +msgid "invalid value \"%s\" for \"%s\": integer expected" +msgstr "valor inválido \"%s\" para \"%s\": esperado um número inteiro" -#: startup.c:836 startup.c:883 startup.c:904 startup.c:941 startup.c:963 -#: variables.c:121 +#: variables.c:224 #, c-format -msgid "unrecognized value \"%s\" for \"%s\"; assuming \"%s\"\n" -msgstr "valor desconhecido \"%s\" para \"%s\"; definindo \"%s\"\n" +msgid "invalid variable name: \"%s\"" +msgstr "nome de variável inválido: \"%s\"" -#: tab-complete.c:3704 +#: variables.c:418 #, c-format msgid "" -"tab completion query failed: %s\n" -"Query was:\n" -"%s\n" +"unrecognized value \"%s\" for \"%s\"\n" +"Available values are: %s." msgstr "" -"consulta para completação por tab falhou: %s\n" -"Consulta foi:\n" -"%s\n" +"valor não reconhecido \"%s\" para \"%s\"\n" +"Os valores disponíveis são: %s." diff --git a/src/bin/psql/po/ru.po b/src/bin/psql/po/ru.po index 8eacc86451df3..f57f4d51fb826 100644 --- a/src/bin/psql/po/ru.po +++ b/src/bin/psql/po/ru.po @@ -4,22 +4,22 @@ # Serguei A. Mokhov , 2001-2005. # Oleg Bartunov , 2004-2005. # Sergey Burladyan , 2012. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023. +# Alexander Lakhin , 2012-2025. # Maxim Yablokov , 2021. msgid "" msgstr "" "Project-Id-Version: psql (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-02-03 15:08+0300\n" -"PO-Revision-Date: 2023-02-03 15:12+0300\n" +"POT-Creation-Date: 2025-05-03 16:06+0300\n" +"PO-Revision-Date: 2025-02-08 08:33+0200\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../../../src/common/logging.c:276 #, c-format @@ -41,55 +41,60 @@ msgstr "подробноÑти: " msgid "hint: " msgstr "подÑказка: " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "не удалоÑÑŒ определить текущий каталог: %m" +msgid "invalid binary \"%s\": %m" +msgstr "неверный иÑполнÑемый файл \"%s\": %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "неверный иÑполнÑемый файл \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\": %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "не удалоÑÑŒ прочитать иÑполнÑемый файл \"%s\"" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "не удалоÑÑŒ найти запуÑкаемый файл \"%s\"" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "не удалоÑÑŒ преобразовать отноÑительный путь \"%s\" в абÑолютный: %m" + +#: ../../common/exec.c:382 copy.c:326 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "не удалоÑÑŒ выполнить команду \"%s\": %m" + +#: ../../common/exec.c:394 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m" +msgid "could not read from command \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать вывод команды \"%s\": %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:397 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m" +msgid "no data was returned by command \"%s\"" +msgstr "команда \"%s\" не выдала данные" -#: ../../common/exec.c:422 +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: command.c:1373 command.c:3459 command.c:3508 command.c:3633 input.c:225 #: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "нехватка памÑти" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "нехватка памÑти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" @@ -99,7 +104,7 @@ msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ указате msgid "could not look up effective user ID %ld: %s" msgstr "выÑÑнить Ñффективный идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (%ld) не удалоÑÑŒ: %s" -#: ../../common/username.c:45 command.c:575 +#: ../../common/username.c:45 command.c:616 msgid "user does not exist" msgstr "пользователь не ÑущеÑтвует" @@ -108,41 +113,41 @@ msgstr "пользователь не ÑущеÑтвует" msgid "user name lookup failure: error code %lu" msgstr "раÑпознать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалоÑÑŒ (код ошибки: %lu)" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "неиÑполнÑÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "команда не найдена" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ ÐºÐ¾Ð´Ð¾Ð¼ возврата %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "дочерний процеÑÑ Ð¿Ñ€ÐµÑ€Ð²Ð°Ð½ иÑключением 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½ по Ñигналу %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" -msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным ÑоÑтоÑнием %d" +msgstr "дочерний процеÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»ÑÑ Ñ Ð½ÐµÑ€Ð°Ñпознанным кодом ÑоÑтоÑÐ½Ð¸Ñ %d" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Сигнал отмены отправлен\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "Отправить Ñигнал отмены не удалоÑÑŒ: " @@ -154,283 +159,345 @@ msgstr[0] "(%lu Ñтрока)" msgstr[1] "(%lu Ñтроки)" msgstr[2] "(%lu Ñтрок)" -#: ../../fe_utils/print.c:3109 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "Прервано\n" -#: ../../fe_utils/print.c:3173 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "" +"Cannot print table contents: number of cells %lld is equal to or exceeds " +"maximum %lld.\n" +msgstr "" +"ВывеÑти Ñодержимое таблицы нельзÑ: чиÑло Ñчеек %lld доÑтигло макÑимума " +"%lld.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "" "Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° таблицы: превышен предел чиÑла Ñтолбцов (%d).\n" -#: ../../fe_utils/print.c:3213 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" msgstr "" -"Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñчейки в таблицу: превышен предел чиÑла Ñчеек (%d).\n" +"Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñчейки в таблицу: превышен предел чиÑла Ñчеек (%lld).\n" -#: ../../fe_utils/print.c:3471 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "неверный формат вывода (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°): %d" -#: ../../fe_utils/psqlscan.l:702 +#: ../../fe_utils/psqlscan.l:732 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "рекурÑивное раÑширение переменной \"%s\" пропуÑкаетÑÑ" -#: ../../port/thread.c:100 ../../port/thread.c:136 +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "" +"аргумент команды оболочки Ñодержит Ñимвол новой Ñтроки или перевода каретки: " +"\"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "" +"Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ñодержит Ñимвол новой Ñтроки или перевода каретки: \"%s\"\n" + +#: ../../port/user.c:43 ../../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "найти локального Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ идентификатору (%d) не удалоÑÑŒ: %s" -#: ../../port/thread.c:105 ../../port/thread.c:141 +#: ../../port/user.c:48 ../../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "локальный пользователь Ñ ID %d не ÑущеÑтвует" -#: command.c:232 +#: command.c:235 #, c-format msgid "invalid command \\%s" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° \\%s" -#: command.c:234 +#: command.c:237 #, c-format msgid "Try \\? for help." msgstr "Введите \\? Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñправки." -#: command.c:252 +#: command.c:255 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: лишний аргумент \"%s\" пропущен" -#: command.c:304 +#: command.c:307 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "" "команда \\%s игнорируетÑÑ; добавьте \\endif или нажмите Ctrl-C Ð´Ð»Ñ " "Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ блока \\if" -#: command.c:573 +#: command.c:614 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "не удалоÑÑŒ получить домашний каталог Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ c ид. %ld: %s" -#: command.c:592 +#: command.c:633 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: не удалоÑÑŒ перейти в каталог \"%s\": %m" -#: command.c:617 +#: command.c:657 #, c-format msgid "You are currently not connected to a database.\n" msgstr "Ð’ данный момент вы не подключены к базе данных.\n" -#: command.c:627 +#: command.c:667 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at " "port \"%s\".\n" msgstr "" -"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (Ð°Ð´Ñ€ÐµÑ Ñервера \"" -"%s\", порт \"%s\").\n" +"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (Ð°Ð´Ñ€ÐµÑ Ñервера " +"\"%s\", порт \"%s\").\n" -#: command.c:630 +#: command.c:670 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at " "port \"%s\".\n" msgstr "" -"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" через Ñокет в \"" -"%s\", порт \"%s\".\n" +"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" через Ñокет в " +"\"%s\", порт \"%s\".\n" -#: command.c:636 +#: command.c:676 #, c-format msgid "" "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address " "\"%s\") at port \"%s\".\n" msgstr "" -"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (Ñервер \"%s\": " -"Ð°Ð´Ñ€ÐµÑ \"%s\", порт \"%s\").\n" +"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (компьютер " +"\"%s\": Ð°Ð´Ñ€ÐµÑ \"%s\", порт \"%s\").\n" -#: command.c:639 +#: command.c:679 #, c-format msgid "" -"You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"" -"%s\".\n" +"You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port " +"\"%s\".\n" msgstr "" -"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (Ñервер \"%s\", " -"порт \"%s\").\n" +"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (компьютер " +"\"%s\", порт \"%s\").\n" -#: command.c:1030 command.c:1125 command.c:2654 +#: command.c:1069 command.c:1170 command.c:2676 #, c-format msgid "no query buffer" msgstr "нет буфера запроÑов" -#: command.c:1063 command.c:5491 +#: command.c:1102 command.c:5779 #, c-format msgid "invalid line number: %s" msgstr "неверный номер Ñтроки: %s" -#: command.c:1203 +#: command.c:1248 msgid "No changes" msgstr "Изменений нет" -#: command.c:1282 +#: command.c:1333 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "" "%s: неверное название кодировки Ñимволов или не найдена процедура " "перекодировки" -#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597 -#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 -#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 -#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 -#: large_obj.c:254 startup.c:304 +#: command.c:1369 command.c:2158 command.c:3455 command.c:3653 command.c:5885 +#: common.c:221 common.c:270 common.c:440 common.c:1142 common.c:1160 +#: common.c:1228 common.c:1340 common.c:1378 common.c:1475 common.c:1541 +#: copy.c:486 copy.c:722 large_obj.c:157 large_obj.c:192 large_obj.c:254 +#: startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1324 +#: command.c:1376 msgid "There is no previous error." msgstr "Ошибки не было." -#: command.c:1437 +#: command.c:1489 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: отÑутÑтвует Ð¿Ñ€Ð°Ð²Ð°Ñ Ñкобка" -#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 -#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 +#: command.c:1573 command.c:1692 command.c:1996 command.c:2010 command.c:2029 +#: command.c:2197 command.c:2438 command.c:2643 command.c:2683 #, c-format msgid "\\%s: missing required argument" msgstr "отÑутÑтвует необходимый аргумент \\%s" -#: command.c:1782 +#: command.c:1823 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif не может находитьÑÑ Ð¿Ð¾Ñле \\else" -#: command.c:1787 +#: command.c:1828 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif без ÑоответÑтвующего \\if" -#: command.c:1851 +#: command.c:1892 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else не может находитьÑÑ Ð¿Ð¾Ñле \\else" -#: command.c:1856 +#: command.c:1897 #, c-format msgid "\\else: no matching \\if" msgstr "\\else без ÑоответÑтвующего \\if" -#: command.c:1896 +#: command.c:1937 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif без ÑоответÑтвующего \\if" -#: command.c:2053 +#: command.c:2093 msgid "Query buffer is empty." msgstr "Буфер запроÑа пуÑÑ‚." -#: command.c:2096 +#: command.c:2136 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Введите новый пароль Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"%s\": " -#: command.c:2100 +#: command.c:2140 msgid "Enter it again: " msgstr "Повторите его: " -#: command.c:2109 +#: command.c:2149 #, c-format msgid "Passwords didn't match." msgstr "Пароли не Ñовпадают." -#: command.c:2208 +#: command.c:2232 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: не удалоÑÑŒ прочитать значение переменной" -#: command.c:2311 +#: command.c:2334 msgid "Query buffer reset (cleared)." msgstr "Буфер запроÑа Ñброшен (очищен)." -#: command.c:2333 +#: command.c:2356 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñана в файл \"%s\".\n" -#: command.c:2420 +#: command.c:2443 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: Ð¸Ð¼Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ðµ может Ñодержать знак \"=\"" -#: command.c:2468 +#: command.c:2491 #, c-format msgid "function name is required" msgstr "требуетÑÑ Ð¸Ð¼Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸" -#: command.c:2470 +#: command.c:2493 #, c-format msgid "view name is required" msgstr "требуетÑÑ Ð¸Ð¼Ñ Ð¿Ñ€ÐµÐ´ÑтавлениÑ" -#: command.c:2593 +#: command.c:2615 msgid "Timing is on." msgstr "Секундомер включён." -#: command.c:2595 +#: command.c:2617 msgid "Timing is off." msgstr "Секундомер выключен." -#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 -#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 -#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331 -#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 +#: command.c:2703 command.c:2741 command.c:4166 command.c:4169 command.c:4172 +#: command.c:4178 command.c:4180 command.c:4206 command.c:4216 command.c:4228 +#: command.c:4242 command.c:4269 command.c:4327 common.c:77 copy.c:329 +#: copy.c:401 psqlscanslash.l:805 psqlscanslash.l:817 psqlscanslash.l:835 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:3107 startup.c:243 startup.c:293 +#: command.c:2730 copy.c:388 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: command.c:2802 command.c:2868 +#, c-format +msgid "\\watch: interval value is specified more than once" +msgstr "\\watch: длительноÑть интервала указана неоднократно" + +#: command.c:2812 command.c:2878 +#, c-format +msgid "\\watch: incorrect interval value \"%s\"" +msgstr "\\watch: Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñть интервала \"%s\"" + +#: command.c:2822 +#, c-format +msgid "\\watch: iteration count is specified more than once" +msgstr "\\watch: чиÑло итераций указано неоднократно" + +#: command.c:2832 +#, c-format +msgid "\\watch: incorrect iteration count \"%s\"" +msgstr "\\watch: некорректное чиÑло итераций \"%s\"" + +#: command.c:2842 +#, c-format +msgid "\\watch: minimum row count specified more than once" +msgstr "\\watch: минимальное чиÑло Ñтрок указано неоднократно" + +#: command.c:2852 +#, c-format +msgid "\\watch: incorrect minimum row count \"%s\"" +msgstr "\\watch: некорректное минимальное чиÑло Ñтрок \"%s\"" + +#: command.c:2859 +#, c-format +msgid "\\watch: unrecognized parameter \"%s\"" +msgstr "\\watch: нераÑпознанный параметр \"%s\"" + +#: command.c:3256 startup.c:243 startup.c:293 msgid "Password: " msgstr "Пароль: " -#: command.c:3112 startup.c:290 +#: command.c:3261 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Пароль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %s: " -#: command.c:3168 +#: command.c:3317 #, c-format msgid "" "Do not give user, host, or port separately when using a connection string" msgstr "" -"Ðе указывайте пользователÑ, Ñервер или порт отдельно, когда иÑпользуете " +"Ðе указывайте пользователÑ, компьютер или порт отдельно, когда иÑпользуете " "Ñтроку подключениÑ" -#: command.c:3203 +#: command.c:3352 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "" "Ðет Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе, из которого можно было бы иÑпользовать параметры" -#: command.c:3511 +#: command.c:3659 #, c-format msgid "Previous connection kept" msgstr "Сохранено предыдущее подключение" -#: command.c:3517 +#: command.c:3665 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3573 +#: command.c:3721 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at " @@ -439,44 +506,44 @@ msgstr "" "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (Ð°Ð´Ñ€ÐµÑ " "Ñервера \"%s\", порт \"%s\").\n" -#: command.c:3576 +#: command.c:3724 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" " "at port \"%s\".\n" msgstr "" -"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" через Ñокет в \"" -"%s\", порт \"%s\".\n" +"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" через Ñокет в " +"\"%s\", порт \"%s\".\n" -#: command.c:3582 +#: command.c:3730 #, c-format msgid "" -"You are now connected to database \"%s\" as user \"%s\" on host \"%s\" " -"(address \"%s\") at port \"%s\".\n" +"You are now connected to database \"%s\" as user \"%s\" on host " +"\"%s\" (address \"%s\") at port \"%s\".\n" msgstr "" -"Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (Ñервер \"" -"%s\": Ð°Ð´Ñ€ÐµÑ \"%s\", порт \"%s\").\n" +"Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (компьютер " +"\"%s\": Ð°Ð´Ñ€ÐµÑ \"%s\", порт \"%s\").\n" -#: command.c:3585 +#: command.c:3733 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at " "port \"%s\".\n" msgstr "" -"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (Ñервер \"%s\", " -"порт \"%s\").\n" +"Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\" (компьютер " +"\"%s\", порт \"%s\").\n" -#: command.c:3590 +#: command.c:3738 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Ð’Ñ‹ подключены к базе данных \"%s\" как пользователь \"%s\".\n" -#: command.c:3630 +#: command.c:3844 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, Ñервер %s)\n" -#: command.c:3643 +#: command.c:3857 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -485,29 +552,33 @@ msgstr "" "ПРЕДУПРЕЖДЕÐИЕ: %s имеет базовую верÑию %s, а Ñервер - %s.\n" " ЧаÑть функций psql может не работать.\n" -#: command.c:3680 +#: command.c:3896 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" -msgstr "SSL-Ñоединение (протокол: %s, шифр: %s, Ñжатие: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s, ALPN: %s)\n" +msgstr "SSL-Ñоединение (протокол: %s, шифр: %s, Ñжатие: %s, ALPN: %s)\n" -#: command.c:3681 command.c:3682 +#: command.c:3897 command.c:3898 msgid "unknown" msgstr "неизвеÑтно" -#: command.c:3683 help.c:42 +#: command.c:3899 help.c:42 msgid "off" msgstr "выкл." -#: command.c:3683 help.c:42 +#: command.c:3899 help.c:42 msgid "on" msgstr "вкл." -#: command.c:3697 +#: command.c:3900 +msgid "none" +msgstr "нет" + +#: command.c:3914 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "Соединение зашифровано GSSAPI\n" -#: command.c:3717 +#: command.c:3934 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -520,7 +591,7 @@ msgstr "" " Подробнее об Ñтом Ñмотрите документацию psql, раздел\n" " \"Notes for Windows users\".\n" -#: command.c:3822 +#: command.c:4041 #, c-format msgid "" "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a " @@ -529,33 +600,33 @@ msgstr "" "в переменной Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ PSQL_EDITOR_LINENUMBER_ARG должен быть указан номер " "Ñтроки" -#: command.c:3851 +#: command.c:4071 #, c-format msgid "could not start editor \"%s\"" msgstr "не удалоÑÑŒ запуÑтить редактор \"%s\"" -#: command.c:3853 +#: command.c:4073 #, c-format msgid "could not start /bin/sh" msgstr "не удалоÑÑŒ запуÑтить /bin/sh" -#: command.c:3903 +#: command.c:4123 #, c-format msgid "could not locate temporary directory: %s" msgstr "не удалоÑÑŒ найти временный каталог: %s" -#: command.c:3930 +#: command.c:4150 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "не удалоÑÑŒ открыть временный файл \"%s\": %m" -#: command.c:4266 +#: command.c:4486 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "" "\\pset: неоднозначному Ñокращению \"%s\" ÑоответÑтвует и \"%s\", и \"%s\"" -#: command.c:4286 +#: command.c:4506 #, c-format msgid "" "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-" @@ -564,32 +635,41 @@ msgstr "" "\\pset: допуÑтимые форматы: aligned, asciidoc, csv, html, latex, latex-" "longtable, troff-ms, unaligned, wrapped" -#: command.c:4305 +#: command.c:4525 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: допуÑтимые Ñтили линий: ascii, old-ascii, unicode" -#: command.c:4320 +#: command.c:4540 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: допуÑтимые Ñтили Unicode-линий границ: single, double" -#: command.c:4335 +#: command.c:4555 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: допуÑтимые Ñтили Unicode-линий Ñтолбцов: single, double" -#: command.c:4350 +#: command.c:4570 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: допуÑтимые Ñтили Unicode-линий заголовков: single, double" -#: command.c:4393 +#: command.c:4622 +#, c-format +msgid "" +"\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", " +"or a number specifying the exact width" +msgstr "" +"\\pset: допуÑтимые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ xheader_width: \"%s\" (по умолчанию), \"%s\", " +"\"%s\", а также чиÑло, задающее точную ширину" + +#: command.c:4639 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: Ñимвол csv_fieldsep должен быть однобайтовым" -#: command.c:4398 +#: command.c:4644 #, c-format msgid "" "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage " @@ -598,107 +678,117 @@ msgstr "" "\\pset: в качеÑтве csv_fieldsep Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð±Ñ€Ð°Ñ‚ÑŒ Ñимвол кавычек, новой Ñтроки " "или возврата каретки" -#: command.c:4535 command.c:4723 +#: command.c:4782 command.c:4983 #, c-format msgid "\\pset: unknown option: %s" msgstr "неизвеÑтный параметр \\pset: %s" -#: command.c:4555 +#: command.c:4802 #, c-format msgid "Border style is %d.\n" msgstr "Стиль границ: %d.\n" -#: command.c:4561 +#: command.c:4808 #, c-format msgid "Target width is unset.\n" msgstr "Ширина вывода Ñброшена.\n" -#: command.c:4563 +#: command.c:4810 #, c-format msgid "Target width is %d.\n" msgstr "Ширина вывода: %d.\n" -#: command.c:4570 +#: command.c:4817 #, c-format msgid "Expanded display is on.\n" msgstr "РаÑширенный вывод включён.\n" -#: command.c:4572 +#: command.c:4819 #, c-format msgid "Expanded display is used automatically.\n" msgstr "РаÑширенный вывод применÑетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки.\n" -#: command.c:4574 +#: command.c:4821 #, c-format msgid "Expanded display is off.\n" msgstr "РаÑширенный вывод выключен.\n" -#: command.c:4580 +#: command.c:4828 command.c:4830 command.c:4832 +#, c-format +msgid "Expanded header width is \"%s\".\n" +msgstr "Ширина раÑширенного заголовка: \"%s\".\n" + +#: command.c:4834 +#, c-format +msgid "Expanded header width is %d.\n" +msgstr "Ширина раÑширенного заголовка: %d.\n" + +#: command.c:4840 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Разделитель полей Ð´Ð»Ñ CSV: \"%s\".\n" -#: command.c:4588 command.c:4596 +#: command.c:4848 command.c:4856 #, c-format msgid "Field separator is zero byte.\n" msgstr "Разделитель полей - нулевой байт.\n" -#: command.c:4590 +#: command.c:4850 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Разделитель полей: \"%s\".\n" -#: command.c:4603 +#: command.c:4863 #, c-format msgid "Default footer is on.\n" msgstr "Строка итогов включена.\n" -#: command.c:4605 +#: command.c:4865 #, c-format msgid "Default footer is off.\n" msgstr "Строка итогов выключена.\n" -#: command.c:4611 +#: command.c:4871 #, c-format msgid "Output format is %s.\n" msgstr "Формат вывода: %s.\n" -#: command.c:4617 +#: command.c:4877 #, c-format msgid "Line style is %s.\n" msgstr "УÑтановлен Ñтиль линий: %s.\n" -#: command.c:4624 +#: command.c:4884 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null выводитÑÑ ÐºÐ°Ðº: \"%s\".\n" -#: command.c:4632 +#: command.c:4892 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Локализованный вывод чиÑел включён.\n" -#: command.c:4634 +#: command.c:4894 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Локализованный вывод чиÑел выключен.\n" -#: command.c:4641 +#: command.c:4901 #, c-format msgid "Pager is used for long output.\n" msgstr "ПоÑтраничник иÑпользуетÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° длинного текÑта.\n" -#: command.c:4643 +#: command.c:4903 #, c-format msgid "Pager is always used.\n" msgstr "ПоÑтраничник иÑпользуетÑÑ Ð²Ñегда.\n" -#: command.c:4645 +#: command.c:4905 #, c-format msgid "Pager usage is off.\n" msgstr "ПоÑтраничник выключен.\n" -#: command.c:4651 +#: command.c:4911 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" @@ -706,182 +796,182 @@ msgstr[0] "ПоÑтраничник не будет иÑпользоватьÑÑ msgstr[1] "ПоÑтраничник не будет иÑпользоватьÑÑ, еÑли Ñтрок меньше %d\n" msgstr[2] "ПоÑтраничник не будет иÑпользоватьÑÑ, еÑли Ñтрок меньше %d\n" -#: command.c:4661 command.c:4671 +#: command.c:4921 command.c:4931 #, c-format msgid "Record separator is zero byte.\n" msgstr "Разделитель запиÑей - нулевой байт.\n" -#: command.c:4663 +#: command.c:4923 #, c-format msgid "Record separator is .\n" msgstr "Разделитель запиÑей: <Ð½Ð¾Ð²Ð°Ñ Ñтрока>.\n" -#: command.c:4665 +#: command.c:4925 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Разделитель запиÑей: \"%s\".\n" -#: command.c:4678 +#: command.c:4938 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Ðтрибуты HTML-таблицы: \"%s\".\n" -#: command.c:4681 +#: command.c:4941 #, c-format msgid "Table attributes unset.\n" msgstr "Ðтрибуты HTML-таблицы не заданы.\n" -#: command.c:4688 +#: command.c:4948 #, c-format msgid "Title is \"%s\".\n" msgstr "Заголовок: \"%s\".\n" -#: command.c:4690 +#: command.c:4950 #, c-format msgid "Title is unset.\n" msgstr "Заголовок не задан.\n" -#: command.c:4697 +#: command.c:4957 #, c-format msgid "Tuples only is on.\n" msgstr "Режим вывода только кортежей включён.\n" -#: command.c:4699 +#: command.c:4959 #, c-format msgid "Tuples only is off.\n" msgstr "Режим вывода только кортежей выключен.\n" -#: command.c:4705 +#: command.c:4965 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Стиль Unicode-линий границ: \"%s\".\n" -#: command.c:4711 +#: command.c:4971 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Стиль Unicode-линий Ñтолбцов: \"%s\".\n" -#: command.c:4717 +#: command.c:4977 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Стиль Unicode-линий границ: \"%s\".\n" -#: command.c:4950 +#: command.c:5226 #, c-format msgid "\\!: failed" msgstr "\\!: ошибка" -#: command.c:4984 +#: command.c:5264 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñ Ð¿ÑƒÑтым запроÑом" -#: command.c:5016 +#: command.c:5296 #, c-format msgid "could not set timer: %m" msgstr "не удалоÑÑŒ уÑтановить таймер: %m" -#: command.c:5078 +#: command.c:5365 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (обновление: %g Ñ)\n" -#: command.c:5081 +#: command.c:5368 #, c-format msgid "%s (every %gs)\n" msgstr "%s (обновление: %g Ñ)\n" -#: command.c:5142 +#: command.c:5432 #, c-format msgid "could not wait for signals: %m" msgstr "Ñбой при ожидании Ñигналов: %m" -#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063 +#: command.c:5488 command.c:5495 common.c:632 common.c:639 common.c:1123 #, c-format msgid "" -"********* QUERY **********\n" +"/******** QUERY *********/\n" "%s\n" -"**************************\n" +"/************************/\n" "\n" msgstr "" -"********* ЗÐПРОС *********\n" +"/******** ЗÐПРОС ********/\n" "%s\n" -"**************************\n" +"/************************/\n" "\n" -#: command.c:5386 +#: command.c:5674 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" — не предÑтавление" -#: command.c:5402 +#: command.c:5690 #, c-format msgid "could not parse reloptions array" msgstr "не удалоÑÑŒ разобрать маÑÑив reloptions" -#: common.c:166 +#: common.c:206 #, c-format msgid "cannot escape without active connection" msgstr "Ñкранирование Ñтрок не работает без Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº БД" -#: common.c:207 +#: common.c:247 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "" "аргумент команды оболочки Ñодержит Ñимвол новой Ñтроки или перевода каретки: " "\"%s\"" -#: common.c:311 +#: common.c:351 #, c-format msgid "connection to server was lost" msgstr "подключение к Ñерверу было потерÑно" -#: common.c:315 +#: common.c:355 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "Подключение к Ñерверу потерÑно. Попытка воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ " -#: common.c:320 +#: common.c:360 #, c-format msgid "Failed.\n" msgstr "неудачна.\n" -#: common.c:337 +#: common.c:377 #, c-format msgid "Succeeded.\n" msgstr "удачна.\n" -#: common.c:389 common.c:1001 +#: common.c:430 common.c:1061 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "неожиданное значение PQresultStatus: %d" -#: common.c:511 +#: common.c:571 #, c-format msgid "Time: %.3f ms\n" msgstr "ВремÑ: %.3f мÑ\n" -#: common.c:526 +#: common.c:586 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "ВремÑ: %.3f Ð¼Ñ (%02d:%06.3f)\n" -#: common.c:535 +#: common.c:595 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "ВремÑ: %.3f Ð¼Ñ (%02d:%02d:%06.3f)\n" -#: common.c:542 +#: common.c:602 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "ВремÑ: %.3f Ð¼Ñ (%.0f д. %02d:%02d:%06.3f)\n" -#: common.c:566 common.c:623 common.c:1034 describe.c:6135 +#: common.c:626 common.c:683 common.c:1094 describe.c:6192 #, c-format msgid "You are currently not connected to a database." msgstr "Ð’ данный момент вы не подключены к базе данных." -#: common.c:654 +#: common.c:714 #, c-format msgid "" "Asynchronous notification \"%s\" with payload \"%s\" received from server " @@ -890,73 +980,79 @@ msgstr "" "Получено аÑинхронное уведомление \"%s\" Ñ Ñообщением-нагрузкой \"%s\" от " "Ñерверного процеÑÑа Ñ PID %d.\n" -#: common.c:657 +#: common.c:717 #, c-format msgid "" "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "" "Получено аÑинхронное уведомление \"%s\" от Ñерверного процеÑÑа Ñ PID %d.\n" -#: common.c:688 +#: common.c:748 #, c-format msgid "could not print result table: %m" msgstr "не удалоÑÑŒ вывеÑти таблицу результатов: %m" -#: common.c:708 +#: common.c:768 #, c-format msgid "no rows returned for \\gset" msgstr "Ñервер не возвратил Ñтрок Ð´Ð»Ñ \\gset" -#: common.c:713 +#: common.c:773 #, c-format msgid "more than one row returned for \\gset" msgstr "Ñервер возвратил больше одной Ñтроки Ð´Ð»Ñ \\gset" -#: common.c:731 +#: common.c:791 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "попытка выполнить \\gset Ñо Ñпециальной переменной \"%s\" игнорируетÑÑ" -#: common.c:1043 +#: common.c:1103 #, c-format msgid "" -"***(Single step mode: verify command)" -"*******************************************\n" +"/**(Single step mode: verify " +"command)******************************************/\n" "%s\n" -"***(press return to proceed or enter x and return to cancel)" -"********************\n" +"/**(press return to proceed or enter x and return to " +"cancel)*******************/\n" msgstr "" -"***(Пошаговый режим: проверка команды)" -"******************************************\n" +"/**(Пошаговый режим: проверка " +"команды)*****************************************/\n" "%s\n" -"***(Enter - выполнение; x и Enter - отмена)**************\n" +"/**(Enter - выполнение; x и Enter - " +"отмена)************************************/\n" -#: common.c:1126 +#: common.c:1180 #, c-format msgid "STATEMENT: %s" msgstr "ОПЕРÐТОР: %s" -#: common.c:1162 +#: common.c:1216 #, c-format msgid "unexpected transaction status (%d)" msgstr "неожиданное ÑоÑтоÑние транзакции (%d)" -#: common.c:1303 describe.c:2020 +#: common.c:1362 describe.c:2025 msgid "Column" msgstr "Столбец" -#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 -#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 -#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 -#: describe.c:5767 +#: common.c:1363 describe.c:169 describe.c:355 describe.c:373 describe.c:1043 +#: describe.c:1201 describe.c:1731 describe.c:1755 describe.c:2026 +#: describe.c:3956 describe.c:4167 describe.c:4404 describe.c:4564 +#: describe.c:5829 msgid "Type" msgstr "Тип" -#: common.c:1353 +#: common.c:1412 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "Команда не выдала результат, либо в результате нет Ñтолбцов.\n" +#: common.c:1504 +#, c-format +msgid "fetching results in chunked mode failed" +msgstr "получить результаты в блочном режиме не удалоÑÑŒ" + #: copy.c:98 #, c-format msgid "\\copy: arguments required" @@ -972,46 +1068,36 @@ msgstr "\\copy: ошибка разбора аргумента \"%s\"" msgid "\\copy: parse error at end of line" msgstr "\\copy: ошибка разбора в конце Ñтроки" -#: copy.c:328 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "не удалоÑÑŒ выполнить команду \"%s\": %m" - -#: copy.c:344 +#: copy.c:342 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" -#: copy.c:348 +#: copy.c:346 #, c-format msgid "%s: cannot copy from/to a directory" msgstr "COPY FROM/TO не может работать Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼ (%s)" -#: copy.c:385 +#: copy.c:383 #, c-format msgid "could not close pipe to external command: %m" msgstr "не удалоÑÑŒ закрыть канал Ñообщений Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ¹ командой: %m" -#: copy.c:390 -#, c-format -msgid "%s: %s" -msgstr "%s: %s" - -#: copy.c:453 copy.c:463 +#: copy.c:451 copy.c:461 #, c-format msgid "could not write COPY data: %m" msgstr "не удалоÑÑŒ запиÑать данные COPY: %m" -#: copy.c:469 +#: copy.c:467 #, c-format msgid "COPY data transfer failed: %s" msgstr "ошибка передачи данных COPY: %s" -#: copy.c:530 +#: copy.c:528 msgid "canceled by user" msgstr "отменено пользователем" -#: copy.c:541 +#: copy.c:539 msgid "" "Enter data to be copied followed by a newline.\n" "End with a backslash and a period on a line by itself, or an EOF signal." @@ -1027,17 +1113,17 @@ msgstr "прерывание из-за ошибки чтениÑ" msgid "trying to exit copy mode" msgstr "попытка выйти из режима копированиÑ" -#: crosstabview.c:123 +#: crosstabview.c:124 #, c-format msgid "\\crosstabview: statement did not return a result set" msgstr "\\crosstabview: оператор не возвратил результирующий набор" -#: crosstabview.c:129 +#: crosstabview.c:130 #, c-format msgid "\\crosstabview: query must return at least three columns" msgstr "\\crosstabview: Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ возвращать минимум три Ñтолбца" -#: crosstabview.c:156 +#: crosstabview.c:157 #, c-format msgid "" "\\crosstabview: vertical and horizontal headers must be different columns" @@ -1045,7 +1131,7 @@ msgstr "" "\\crosstabview: Ð´Ð»Ñ Ð²ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… и горизонтальных заголовков должны " "задаватьÑÑ Ñ€Ð°Ð·Ð½Ñ‹Ðµ Ñтолбцы" -#: crosstabview.c:172 +#: crosstabview.c:173 #, c-format msgid "" "\\crosstabview: data column must be specified when query returns more than " @@ -1054,12 +1140,12 @@ msgstr "" "\\crosstabview: когда Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ больше трёх Ñтолбцов, необходимо " "указать Ñтолбец данных" -#: crosstabview.c:228 +#: crosstabview.c:229 #, c-format msgid "\\crosstabview: maximum number of columns (%d) exceeded" msgstr "\\crosstabview: превышен макÑимум чиÑла Ñтолбцов (%d)" -#: crosstabview.c:397 +#: crosstabview.c:398 #, c-format msgid "" "\\crosstabview: query result contains multiple data values for row \"%s\", " @@ -1068,753 +1154,750 @@ msgstr "" "\\crosstabview: в результатах запроÑа ÑодержитÑÑ Ð½ÐµÑколько значений данных " "Ð´Ð»Ñ Ñтроки \"%s\", Ñтолбца \"%s\"" -#: crosstabview.c:645 +#: crosstabview.c:646 #, c-format msgid "\\crosstabview: column number %d is out of range 1..%d" msgstr "\\crosstabview: номер Ñтолбца %d выходит за рамки диапазона 1..%d" -#: crosstabview.c:670 +#: crosstabview.c:671 #, c-format msgid "\\crosstabview: ambiguous column name: \"%s\"" msgstr "\\crosstabview: неоднозначное Ð¸Ð¼Ñ Ñтолбца: \"%s\"" -#: crosstabview.c:678 +#: crosstabview.c:679 #, c-format msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: Ð¸Ð¼Ñ Ñтолбца не найдено: \"%s\"" -#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 -#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 -#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 -#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 -#: describe.c:5477 describe.c:5881 describe.c:5959 +#: describe.c:87 describe.c:335 describe.c:626 describe.c:802 describe.c:1035 +#: describe.c:1190 describe.c:1264 describe.c:3945 describe.c:4154 +#: describe.c:4402 describe.c:4483 describe.c:4715 describe.c:4921 +#: describe.c:5165 describe.c:5406 describe.c:5475 describe.c:5486 +#: describe.c:5542 describe.c:5941 describe.c:6018 msgid "Schema" msgstr "Схема" -#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 -#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 -#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 -#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 -#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 -#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 -#: describe.c:5957 describe.c:6186 describe.c:6494 +#: describe.c:88 describe.c:166 describe.c:227 describe.c:336 describe.c:627 +#: describe.c:803 describe.c:924 describe.c:1036 describe.c:1265 +#: describe.c:3946 describe.c:4155 describe.c:4319 describe.c:4403 +#: describe.c:4484 describe.c:4645 describe.c:4716 describe.c:4922 +#: describe.c:5038 describe.c:5166 describe.c:5407 describe.c:5476 +#: describe.c:5487 describe.c:5543 describe.c:5740 describe.c:5810 +#: describe.c:6016 describe.c:6243 describe.c:6551 msgid "Name" msgstr "ИмÑ" -#: describe.c:89 describe.c:351 describe.c:369 +#: describe.c:89 describe.c:348 describe.c:366 msgid "Result data type" msgstr "Тип данных результата" -#: describe.c:90 describe.c:352 describe.c:370 +#: describe.c:90 describe.c:349 describe.c:367 msgid "Argument data types" msgstr "Типы данных аргументов" -#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 -#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 -#: describe.c:2041 describe.c:3676 describe.c:3935 describe.c:4137 -#: describe.c:4280 describe.c:4354 describe.c:4432 describe.c:4599 -#: describe.c:4777 describe.c:4903 describe.c:4976 describe.c:5097 -#: describe.c:5248 describe.c:5290 describe.c:5356 describe.c:5413 -#: describe.c:5422 describe.c:5479 describe.c:5695 describe.c:5770 -#: describe.c:5895 describe.c:5960 describe.c:6992 +#: describe.c:98 describe.c:105 describe.c:177 describe.c:241 describe.c:415 +#: describe.c:658 describe.c:818 describe.c:972 describe.c:1267 describe.c:2046 +#: describe.c:3676 describe.c:4000 describe.c:4201 describe.c:4343 +#: describe.c:4416 describe.c:4493 describe.c:4658 describe.c:4834 +#: describe.c:4975 describe.c:5047 describe.c:5167 describe.c:5317 +#: describe.c:5358 describe.c:5423 describe.c:5479 describe.c:5488 +#: describe.c:5544 describe.c:5758 describe.c:5832 describe.c:5955 +#: describe.c:6019 describe.c:7078 msgid "Description" msgstr "ОпиÑание" -#: describe.c:128 +#: describe.c:127 msgid "List of aggregate functions" msgstr "СпиÑок агрегатных функций" -#: describe.c:153 +#: describe.c:152 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает методы доÑтупа." -#: describe.c:168 +#: describe.c:167 msgid "Index" msgstr "ИндекÑ" -#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 +#: describe.c:168 describe.c:3964 describe.c:4180 describe.c:5942 msgid "Table" msgstr "Таблица" -#: describe.c:177 describe.c:5679 +#: describe.c:176 describe.c:5742 msgid "Handler" msgstr "Обработчик" -#: describe.c:201 +#: describe.c:199 msgid "List of access methods" msgstr "СпиÑок методов доÑтупа" -#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 -#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 -#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 -#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 -#: describe.c:6980 +#: describe.c:228 describe.c:401 describe.c:651 describe.c:925 describe.c:1189 +#: describe.c:3957 describe.c:4156 describe.c:4320 describe.c:4647 +#: describe.c:5039 describe.c:5741 describe.c:5811 describe.c:6244 +#: describe.c:6431 describe.c:6552 describe.c:6722 describe.c:6807 +#: describe.c:7066 msgid "Owner" msgstr "Владелец" -#: describe.c:231 +#: describe.c:229 msgid "Location" msgstr "РаÑположение" -#: describe.c:241 describe.c:3509 +#: describe.c:239 describe.c:3517 describe.c:3857 msgid "Options" msgstr "Параметры" -#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 +#: describe.c:240 describe.c:649 describe.c:970 describe.c:3999 msgid "Size" msgstr "Размер" -#: describe.c:266 +#: describe.c:263 msgid "List of tablespaces" msgstr "СпиÑок табличных проÑтранÑтв" -#: describe.c:311 +#: describe.c:308 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df принимает в качеÑтве параметров только [anptwS+]" -#: describe.c:319 +#: describe.c:316 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df не поддерживает параметр \"%c\" Ñ Ñервером верÑии %s" # well-spelled: агр #. translator: "agg" is short for "aggregate" -#: describe.c:354 describe.c:372 +#: describe.c:351 describe.c:369 msgid "agg" msgstr "агр." -#: describe.c:355 describe.c:373 +#: describe.c:352 describe.c:370 msgid "window" msgstr "оконнаÑ" -#: describe.c:356 +#: describe.c:353 msgid "proc" msgstr "проц." # well-spelled: функ -#: describe.c:357 describe.c:375 +#: describe.c:354 describe.c:372 msgid "func" msgstr "функ." -#: describe.c:374 describe.c:1390 +#: describe.c:371 describe.c:1397 msgid "trigger" msgstr "триггернаÑ" -#: describe.c:386 +#: describe.c:383 msgid "immutable" msgstr "поÑтоÑннаÑ" -#: describe.c:387 +#: describe.c:384 msgid "stable" msgstr "ÑтабильнаÑ" -#: describe.c:388 +#: describe.c:385 msgid "volatile" msgstr "изменчиваÑ" -#: describe.c:389 +#: describe.c:386 msgid "Volatility" msgstr "ИзменчивоÑть" -#: describe.c:397 +#: describe.c:394 msgid "restricted" msgstr "ограниченнаÑ" -#: describe.c:398 +#: describe.c:395 msgid "safe" msgstr "безопаÑнаÑ" -#: describe.c:399 +#: describe.c:396 msgid "unsafe" msgstr "небезопаÑнаÑ" -#: describe.c:400 +#: describe.c:397 msgid "Parallel" msgstr "ПараллельноÑть" -#: describe.c:405 +#: describe.c:402 msgid "definer" msgstr "определившего" -#: describe.c:406 +#: describe.c:403 msgid "invoker" msgstr "вызывающего" -#: describe.c:407 +#: describe.c:404 msgid "Security" msgstr "БезопаÑноÑть" -#: describe.c:412 +#: describe.c:409 msgid "Language" msgstr "Язык" -#: describe.c:416 describe.c:420 -msgid "Source code" -msgstr "ИÑходный код" +#: describe.c:412 describe.c:648 +msgid "Internal name" +msgstr "Внутреннее имÑ" -#: describe.c:594 +#: describe.c:585 msgid "List of functions" msgstr "СпиÑок функций" -#: describe.c:657 -msgid "Internal name" -msgstr "Внутреннее имÑ" - -#: describe.c:659 +#: describe.c:650 msgid "Elements" msgstr "Элементы" -#: describe.c:711 +#: describe.c:701 msgid "List of data types" msgstr "СпиÑок типов данных" -#: describe.c:814 +#: describe.c:804 msgid "Left arg type" msgstr "Тип левого аргумента" -#: describe.c:815 +#: describe.c:805 msgid "Right arg type" msgstr "Тип правого аргумента" -#: describe.c:816 +#: describe.c:806 msgid "Result type" msgstr "Результирующий тип" -#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 -#: describe.c:6909 describe.c:6913 +#: describe.c:811 describe.c:4653 describe.c:4817 describe.c:5316 +#: describe.c:6996 describe.c:7000 msgid "Function" msgstr "ФункциÑ" -#: describe.c:902 +#: describe.c:891 msgid "List of operators" msgstr "СпиÑок операторов" -#: describe.c:938 +#: describe.c:926 msgid "Encoding" msgstr "Кодировка" -#: describe.c:939 describe.c:4868 +#: describe.c:930 describe.c:934 +msgid "Locale Provider" +msgstr "Провайдер локали" + +#: describe.c:938 describe.c:4936 msgid "Collate" msgstr "LC_COLLATE" -#: describe.c:940 describe.c:4869 +#: describe.c:939 describe.c:4937 msgid "Ctype" msgstr "LC_CTYPE" -#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 -msgid "ICU Locale" -msgstr "локаль ICU" +#: describe.c:943 describe.c:947 describe.c:951 describe.c:4942 describe.c:4946 +#: describe.c:4950 +msgid "Locale" +msgstr "Локаль" -#: describe.c:946 describe.c:952 -msgid "Locale Provider" -msgstr "Провайдер локали" +#: describe.c:955 describe.c:959 describe.c:4955 describe.c:4959 +msgid "ICU Rules" +msgstr "Правила ICU" -#: describe.c:964 +#: describe.c:971 msgid "Tablespace" msgstr "Табл. проÑтранÑтво" -#: describe.c:990 +#: describe.c:996 msgid "List of databases" msgstr "СпиÑок баз данных" -#: describe.c:1031 describe.c:1184 describe.c:3882 +#: describe.c:1037 describe.c:1192 describe.c:3947 msgid "table" msgstr "таблица" -#: describe.c:1032 describe.c:3883 +#: describe.c:1038 describe.c:3948 msgid "view" msgstr "предÑтавление" -#: describe.c:1033 describe.c:3884 +#: describe.c:1039 describe.c:3949 msgid "materialized view" msgstr "материализованное предÑтавление" -#: describe.c:1034 describe.c:1186 describe.c:3886 +#: describe.c:1040 describe.c:1194 describe.c:3951 msgid "sequence" msgstr "поÑледовательноÑть" -#: describe.c:1035 describe.c:3888 +#: describe.c:1041 describe.c:3953 msgid "foreign table" msgstr "ÑтороннÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð°" -#: describe.c:1036 describe.c:3889 describe.c:4101 +#: describe.c:1042 describe.c:3954 describe.c:4165 msgid "partitioned table" msgstr "ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð°" -#: describe.c:1047 +#: describe.c:1058 msgid "Column privileges" msgstr "Права Ð´Ð»Ñ Ñтолбцов" -#: describe.c:1078 describe.c:1112 +#: describe.c:1089 describe.c:1123 msgid "Policies" msgstr "Политики" -#: describe.c:1143 describe.c:4510 describe.c:6577 +#: describe.c:1151 describe.c:4570 describe.c:6667 msgid "Access privileges" msgstr "Права доÑтупа" -#: describe.c:1188 +#: describe.c:1196 msgid "function" msgstr "функциÑ" -#: describe.c:1190 +#: describe.c:1198 msgid "type" msgstr "тип" -#: describe.c:1192 +#: describe.c:1200 msgid "schema" msgstr "Ñхема" -#: describe.c:1215 +#: describe.c:1222 msgid "Default access privileges" msgstr "Права доÑтупа по умолчанию" -#: describe.c:1259 +#: describe.c:1266 msgid "Object" msgstr "Объект" -#: describe.c:1273 +#: describe.c:1280 msgid "table constraint" msgstr "ограничение таблицы" -#: describe.c:1297 +#: describe.c:1304 msgid "domain constraint" msgstr "ограничение домена" -#: describe.c:1321 +#: describe.c:1328 msgid "operator class" msgstr "клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð²" -#: describe.c:1345 +#: describe.c:1352 msgid "operator family" msgstr "ÑемейÑтво операторов" -#: describe.c:1368 +#: describe.c:1375 msgid "rule" msgstr "правило" -#: describe.c:1414 +#: describe.c:1420 msgid "Object descriptions" msgstr "ОпиÑание объекта" -#: describe.c:1479 describe.c:4007 +#: describe.c:1485 describe.c:4072 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Отношение \"%s\" не найдено." -#: describe.c:1482 describe.c:4010 +#: describe.c:1488 describe.c:4075 #, c-format msgid "Did not find any relations." msgstr "ÐžÑ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð½Ðµ найдены." -#: describe.c:1678 +#: describe.c:1684 #, c-format msgid "Did not find any relation with OID %s." msgstr "Отношение Ñ OID %s не найдено." -#: describe.c:1726 describe.c:1750 +#: describe.c:1732 describe.c:1756 msgid "Start" msgstr "Ðачальное_значение" -#: describe.c:1727 describe.c:1751 +#: describe.c:1733 describe.c:1757 msgid "Minimum" msgstr "Минимум" -#: describe.c:1728 describe.c:1752 +#: describe.c:1734 describe.c:1758 msgid "Maximum" msgstr "МакÑимум" -#: describe.c:1729 describe.c:1753 +#: describe.c:1735 describe.c:1759 msgid "Increment" msgstr "Шаг" -#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 -#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 +#: describe.c:1736 describe.c:1760 describe.c:1889 describe.c:4487 +#: describe.c:4828 describe.c:4964 describe.c:4969 describe.c:6710 msgid "yes" msgstr "да" -#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 -#: describe.c:4768 describe.c:4892 describe.c:6621 +#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4487 +#: describe.c:4825 describe.c:4964 describe.c:6711 msgid "no" msgstr "нет" -#: describe.c:1732 describe.c:1756 +#: describe.c:1738 describe.c:1762 msgid "Cycles?" msgstr "ЗацикливаетÑÑ?" -#: describe.c:1733 describe.c:1757 +#: describe.c:1739 describe.c:1763 msgid "Cache" msgstr "КешируетÑÑ" -#: describe.c:1798 +#: describe.c:1804 #, c-format msgid "Owned by: %s" msgstr "Владелец: %s" -#: describe.c:1802 +#: describe.c:1808 #, c-format msgid "Sequence for identity column: %s" msgstr "ПоÑледовательноÑть Ð´Ð»Ñ Ñтолбца идентификации: %s" -#: describe.c:1810 +#: describe.c:1816 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "ÐÐµÐ¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€ÑƒÐµÐ¼Ð°Ñ Ð¿Ð¾ÑледовательноÑть \"%s.%s\"" -#: describe.c:1813 +#: describe.c:1819 #, c-format msgid "Sequence \"%s.%s\"" msgstr "ПоÑледовательноÑть \"%s.%s\"" -#: describe.c:1957 +#: describe.c:1962 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "ÐÐµÐ¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€ÑƒÐµÐ¼Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s\"" -#: describe.c:1960 +#: describe.c:1965 #, c-format msgid "Table \"%s.%s\"" msgstr "Таблица \"%s.%s\"" -#: describe.c:1964 +#: describe.c:1969 #, c-format msgid "View \"%s.%s\"" msgstr "ПредÑтавление \"%s.%s\"" -#: describe.c:1969 +#: describe.c:1974 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Ðежурналируемое материализованное предÑтавление \"%s.%s\"" -#: describe.c:1972 +#: describe.c:1977 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Материализованное предÑтавление \"%s.%s\"" -#: describe.c:1977 +#: describe.c:1982 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Ðежурналируемый Ð¸Ð½Ð´ÐµÐºÑ \"%s.%s\"" -#: describe.c:1980 +#: describe.c:1985 #, c-format msgid "Index \"%s.%s\"" msgstr "Ð˜Ð½Ð´ÐµÐºÑ \"%s.%s\"" -#: describe.c:1985 +#: describe.c:1990 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Ðежурналируемый Ñекционированный Ð¸Ð½Ð´ÐµÐºÑ \"%s.%s\"" -#: describe.c:1988 +#: describe.c:1993 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Секционированный Ð¸Ð½Ð´ÐµÐºÑ \"%s.%s\"" -#: describe.c:1992 +#: describe.c:1997 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST-таблица \"%s.%s\"" -#: describe.c:1996 +#: describe.c:2001 #, c-format msgid "Composite type \"%s.%s\"" msgstr "СоÑтавной тип \"%s.%s\"" -#: describe.c:2000 +#: describe.c:2005 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "СтороннÑÑ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s\"" -#: describe.c:2005 +#: describe.c:2010 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "ÐÐµÐ¶ÑƒÑ€Ð½Ð°Ð»Ð¸Ñ€ÑƒÐµÐ¼Ð°Ñ ÑÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s\"" -#: describe.c:2008 +#: describe.c:2013 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Ð¡ÐµÐºÑ†Ð¸Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° \"%s.%s\"" -#: describe.c:2024 describe.c:4343 +#: describe.c:2029 describe.c:4405 msgid "Collation" msgstr "Правило Ñортировки" -#: describe.c:2025 describe.c:4344 +#: describe.c:2030 describe.c:4406 msgid "Nullable" msgstr "ДопуÑтимоÑть NULL" -#: describe.c:2026 describe.c:4345 +#: describe.c:2031 describe.c:4407 msgid "Default" msgstr "По умолчанию" -#: describe.c:2029 +#: describe.c:2034 msgid "Key?" msgstr "Ключевой?" -#: describe.c:2031 describe.c:4665 describe.c:4676 +#: describe.c:2036 describe.c:4723 describe.c:4734 msgid "Definition" msgstr "Определение" # well-spelled: ОСД -#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 -#: describe.c:5894 +#: describe.c:2038 describe.c:5757 describe.c:5831 describe.c:5896 +#: describe.c:5954 msgid "FDW options" msgstr "Параметры ОСД" -#: describe.c:2035 +#: describe.c:2040 msgid "Storage" msgstr "Хранилище" -#: describe.c:2037 +#: describe.c:2042 msgid "Compression" msgstr "Сжатие" -#: describe.c:2039 +#: describe.c:2044 msgid "Stats target" msgstr "Цель Ð´Ð»Ñ ÑтатиÑтики" -#: describe.c:2175 +#: describe.c:2180 #, c-format msgid "Partition of: %s %s%s" msgstr "СекциÑ: %s %s%s" -#: describe.c:2188 +#: describe.c:2193 msgid "No partition constraint" msgstr "Ðет Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñекции" -#: describe.c:2190 +#: describe.c:2195 #, c-format msgid "Partition constraint: %s" msgstr "Ограничение Ñекции: %s" -#: describe.c:2214 +#: describe.c:2219 #, c-format msgid "Partition key: %s" msgstr "Ключ разбиениÑ: %s" -#: describe.c:2240 +#: describe.c:2245 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Принадлежит таблице: \"%s.%s\"" -#: describe.c:2309 +#: describe.c:2314 msgid "primary key, " msgstr "первичный ключ, " -#: describe.c:2312 +#: describe.c:2317 msgid "unique" msgstr "уникальный" -#: describe.c:2314 +#: describe.c:2319 msgid " nulls not distinct" msgstr " null не различаютÑÑ" -#: describe.c:2315 +#: describe.c:2320 msgid ", " msgstr ", " -#: describe.c:2322 +#: describe.c:2327 #, c-format msgid "for table \"%s.%s\"" msgstr "Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹ \"%s.%s\"" -#: describe.c:2326 +#: describe.c:2331 #, c-format msgid ", predicate (%s)" msgstr ", предикат (%s)" -#: describe.c:2329 +#: describe.c:2334 msgid ", clustered" msgstr ", клаÑтеризованный" -#: describe.c:2332 +#: describe.c:2337 msgid ", invalid" msgstr ", нерабочий" -#: describe.c:2335 +#: describe.c:2340 msgid ", deferrable" msgstr ", откладываемый" -#: describe.c:2338 +#: describe.c:2343 msgid ", initially deferred" msgstr ", изначально отложенный" -#: describe.c:2341 +#: describe.c:2346 msgid ", replica identity" msgstr ", репликационный" -#: describe.c:2395 +#: describe.c:2400 msgid "Indexes:" msgstr "ИндекÑÑ‹:" -#: describe.c:2478 +#: describe.c:2483 msgid "Check constraints:" msgstr "ОграничениÑ-проверки:" # TO REWVIEW -#: describe.c:2546 +#: describe.c:2551 msgid "Foreign-key constraints:" msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ ключа:" -#: describe.c:2609 +#: describe.c:2614 msgid "Referenced by:" msgstr "СÑылки извне:" -#: describe.c:2659 +#: describe.c:2664 msgid "Policies:" msgstr "Политики:" -#: describe.c:2662 +#: describe.c:2667 msgid "Policies (forced row security enabled):" msgstr "Политики (уÑÐ¸Ð»ÐµÐ½Ð½Ð°Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð° Ñтрок включена):" -#: describe.c:2665 +#: describe.c:2670 msgid "Policies (row security enabled): (none)" msgstr "Политики (защита Ñтрок включена): (Ðет)" -#: describe.c:2668 +#: describe.c:2673 msgid "Policies (forced row security enabled): (none)" msgstr "Политики (уÑÐ¸Ð»ÐµÐ½Ð½Ð°Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ð° Ñтрок включена): (Ðет)" -#: describe.c:2671 +#: describe.c:2676 msgid "Policies (row security disabled):" msgstr "Политики (защита Ñтрок выключена):" -#: describe.c:2731 describe.c:2835 +#: describe.c:2736 describe.c:2841 msgid "Statistics objects:" msgstr "Объекты ÑтатиÑтики:" -#: describe.c:2937 describe.c:3090 +#: describe.c:2943 describe.c:3096 msgid "Rules:" msgstr "Правила:" -#: describe.c:2940 +#: describe.c:2946 msgid "Disabled rules:" msgstr "Отключённые правила:" -#: describe.c:2943 +#: describe.c:2949 msgid "Rules firing always:" msgstr "Правила, Ñрабатывающие вÑегда:" -#: describe.c:2946 +#: describe.c:2952 msgid "Rules firing on replica only:" msgstr "Правила, Ñрабатывающие только в реплике:" -#: describe.c:3025 describe.c:5030 +#: describe.c:3031 describe.c:5100 msgid "Publications:" msgstr "Публикации:" -#: describe.c:3073 +#: describe.c:3079 msgid "View definition:" msgstr "Определение предÑтавлениÑ:" -#: describe.c:3236 +#: describe.c:3242 msgid "Triggers:" msgstr "Триггеры:" -#: describe.c:3239 +#: describe.c:3245 msgid "Disabled user triggers:" msgstr "Отключённые пользовательÑкие триггеры:" -#: describe.c:3242 +#: describe.c:3248 msgid "Disabled internal triggers:" msgstr "Отключённые внутренние триггеры:" -#: describe.c:3245 +#: describe.c:3251 msgid "Triggers firing always:" msgstr "Триггеры, Ñрабатывающие вÑегда:" -#: describe.c:3248 +#: describe.c:3254 msgid "Triggers firing on replica only:" msgstr "Триггеры, Ñрабатывающие только в реплике:" -#: describe.c:3319 +#: describe.c:3325 #, c-format msgid "Server: %s" msgstr "Сервер: %s" # well-spelled: ОСД -#: describe.c:3327 +#: describe.c:3333 #, c-format msgid "FDW options: (%s)" msgstr "Параметр ОСД: (%s)" -#: describe.c:3348 +#: describe.c:3354 msgid "Inherits" msgstr "ÐаÑледует" -#: describe.c:3413 +#: describe.c:3419 #, c-format msgid "Number of partitions: %d" msgstr "ЧиÑло Ñекций: %d" -#: describe.c:3422 +#: describe.c:3428 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "ЧиÑло Ñекций: %d (чтобы проÑмотреть их, введите \\d+)" -#: describe.c:3424 +#: describe.c:3430 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Дочерних таблиц: %d (чтобы проÑмотреть и их, воÑпользуйтеÑÑŒ \\d+)" -#: describe.c:3431 +#: describe.c:3437 msgid "Child tables" msgstr "Дочерние таблицы" -#: describe.c:3431 +#: describe.c:3437 msgid "Partitions" msgstr "Секции" -#: describe.c:3462 +#: describe.c:3470 #, c-format msgid "Typed table of type: %s" msgstr "Ð¢Ð¸Ð¿Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° типа: %s" -#: describe.c:3478 +#: describe.c:3486 msgid "Replica Identity" msgstr "Ð˜Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ¸" -#: describe.c:3491 +#: describe.c:3499 msgid "Has OIDs: yes" msgstr "Содержит OID: да" -#: describe.c:3500 +#: describe.c:3508 #, c-format msgid "Access method: %s" msgstr "Метод доÑтупа: %s" -#: describe.c:3579 +#: describe.c:3585 #, c-format msgid "Tablespace: \"%s\"" msgstr "Табличное проÑтранÑтво: \"%s\"" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3591 +#: describe.c:3597 #, c-format msgid ", tablespace \"%s\"" msgstr ", табл. проÑтранÑтво \"%s\"" -#: describe.c:3668 +#: describe.c:3670 msgid "List of roles" msgstr "СпиÑок ролей" -#: describe.c:3670 +#: describe.c:3672 describe.c:3840 msgid "Role name" msgstr "Ð˜Ð¼Ñ Ñ€Ð¾Ð»Ð¸" -#: describe.c:3671 +#: describe.c:3673 msgid "Attributes" msgstr "Ðтрибуты" -#: describe.c:3673 -msgid "Member of" -msgstr "Член ролей" - #: describe.c:3684 msgid "Superuser" msgstr "Суперпользователь" @@ -1859,385 +1942,397 @@ msgstr[2] "%d подключений" msgid "Password valid until " msgstr "Пароль дейÑтвует до " -#: describe.c:3777 +#: describe.c:3775 msgid "Role" msgstr "Роль" -#: describe.c:3778 +#: describe.c:3776 msgid "Database" msgstr "БД" -#: describe.c:3779 +#: describe.c:3777 msgid "Settings" msgstr "Параметры" -#: describe.c:3803 +#: describe.c:3801 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Параметры Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ \"%s\" и базы данных \"%s\" не найдены." -#: describe.c:3806 +#: describe.c:3804 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Параметры Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸ \"%s\" не найдены." -#: describe.c:3809 +#: describe.c:3807 #, c-format msgid "Did not find any settings." msgstr "Ðикакие параметры не найдены." -#: describe.c:3814 +#: describe.c:3811 msgid "List of settings" msgstr "СпиÑок параметров" -#: describe.c:3885 +#: describe.c:3841 +msgid "Member of" +msgstr "Член ролей" + +#: describe.c:3858 +msgid "Grantor" +msgstr "Праводатель" + +#: describe.c:3884 +msgid "List of role grants" +msgstr "СпиÑок назначений ролей" + +#: describe.c:3950 msgid "index" msgstr "индекÑ" -#: describe.c:3887 +#: describe.c:3952 msgid "TOAST table" msgstr "TOAST-таблица" -#: describe.c:3890 describe.c:4102 +#: describe.c:3955 describe.c:4166 msgid "partitioned index" msgstr "Ñекционированный индекÑ" -#: describe.c:3910 +#: describe.c:3975 msgid "permanent" msgstr "поÑтоÑнное" -#: describe.c:3911 +#: describe.c:3976 msgid "temporary" msgstr "временное" -#: describe.c:3912 +#: describe.c:3977 msgid "unlogged" msgstr "нежурналируемое" -#: describe.c:3913 +#: describe.c:3978 msgid "Persistence" msgstr "Хранение" -#: describe.c:3929 +#: describe.c:3994 msgid "Access method" msgstr "Метод доÑтупа" -#: describe.c:4015 +#: describe.c:4079 msgid "List of relations" msgstr "СпиÑок отношений" -#: describe.c:4063 +#: describe.c:4127 #, c-format msgid "" "The server (version %s) does not support declarative table partitioning." msgstr "" "Сервер (верÑÐ¸Ñ %s) не поддерживает декларативное Ñекционирование таблиц." -#: describe.c:4074 +#: describe.c:4138 msgid "List of partitioned indexes" msgstr "СпиÑок Ñекционированных индекÑов" -#: describe.c:4076 +#: describe.c:4140 msgid "List of partitioned tables" msgstr "СпиÑок Ñекционированных таблиц" -#: describe.c:4080 +#: describe.c:4144 msgid "List of partitioned relations" msgstr "СпиÑок Ñекционированных отношений" -#: describe.c:4111 +#: describe.c:4175 msgid "Parent name" msgstr "Ð˜Ð¼Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ" -#: describe.c:4124 +#: describe.c:4188 msgid "Leaf partition size" msgstr "Размер конечной Ñекции" -#: describe.c:4127 describe.c:4133 +#: describe.c:4191 describe.c:4197 msgid "Total size" msgstr "Общий размер" -#: describe.c:4258 +#: describe.c:4321 msgid "Trusted" msgstr "Доверенный" -#: describe.c:4267 +#: describe.c:4330 msgid "Internal language" msgstr "Внутренний Ñзык" -#: describe.c:4268 +#: describe.c:4331 msgid "Call handler" msgstr "Обработчик вызова" -#: describe.c:4269 describe.c:5680 +#: describe.c:4332 describe.c:5743 msgid "Validator" msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸" -#: describe.c:4270 +#: describe.c:4333 msgid "Inline handler" msgstr "Обработчик внедрённого кода" -#: describe.c:4305 +#: describe.c:4367 msgid "List of languages" msgstr "СпиÑок Ñзыков" -#: describe.c:4346 +#: describe.c:4408 msgid "Check" msgstr "Проверка" -#: describe.c:4390 +#: describe.c:4451 msgid "List of domains" msgstr "СпиÑок доменов" -#: describe.c:4424 +#: describe.c:4485 msgid "Source" msgstr "ИÑточник" -#: describe.c:4425 +#: describe.c:4486 msgid "Destination" msgstr "Ðазначение" -#: describe.c:4427 describe.c:6622 +#: describe.c:4488 describe.c:6712 msgid "Default?" msgstr "По умолчанию?" -#: describe.c:4469 +#: describe.c:4529 msgid "List of conversions" msgstr "СпиÑок преобразований" -#: describe.c:4497 +#: describe.c:4557 msgid "Parameter" msgstr "Параметр" -#: describe.c:4498 +#: describe.c:4558 msgid "Value" msgstr "Значение" -#: describe.c:4505 +#: describe.c:4565 msgid "Context" msgstr "КонтекÑÑ‚" -#: describe.c:4538 +#: describe.c:4597 msgid "List of configuration parameters" msgstr "СпиÑок параметров конфигурации" -#: describe.c:4540 +#: describe.c:4599 msgid "List of non-default configuration parameters" msgstr "СпиÑок изменённых параметров конфигурации" -#: describe.c:4567 +#: describe.c:4626 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает Ñобытийные триггеры." -#: describe.c:4587 +#: describe.c:4646 msgid "Event" msgstr "Событие" -#: describe.c:4589 +#: describe.c:4648 msgid "enabled" msgstr "включён" -#: describe.c:4590 +#: describe.c:4649 msgid "replica" msgstr "реплика" -#: describe.c:4591 +#: describe.c:4650 msgid "always" msgstr "вÑегда" -#: describe.c:4592 +#: describe.c:4651 msgid "disabled" msgstr "отключён" -#: describe.c:4593 describe.c:6496 +#: describe.c:4652 describe.c:6553 msgid "Enabled" msgstr "Включён" -#: describe.c:4595 +#: describe.c:4654 msgid "Tags" msgstr "Теги" -#: describe.c:4619 +#: describe.c:4677 msgid "List of event triggers" msgstr "СпиÑок Ñобытийных триггеров" -#: describe.c:4646 +#: describe.c:4704 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает раÑширенные ÑтатиÑтики." -#: describe.c:4683 +#: describe.c:4741 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4684 +#: describe.c:4742 msgid "Dependencies" msgstr "ЗавиÑимоÑти" -#: describe.c:4694 +#: describe.c:4752 msgid "MCV" msgstr "MCV" -#: describe.c:4718 +#: describe.c:4775 msgid "List of extended statistics" msgstr "СпиÑок раÑширенных ÑтатиÑтик" -#: describe.c:4745 +#: describe.c:4802 msgid "Source type" msgstr "ИÑходный тип" -#: describe.c:4746 +#: describe.c:4803 msgid "Target type" msgstr "Целевой тип" -#: describe.c:4770 +#: describe.c:4827 msgid "in assignment" msgstr "в приÑваивании" -#: describe.c:4772 +#: describe.c:4829 msgid "Implicit?" msgstr "ÐеÑвное?" -#: describe.c:4831 +#: describe.c:4887 msgid "List of casts" msgstr "СпиÑок приведений типов" -#: describe.c:4883 describe.c:4887 +#: describe.c:4927 describe.c:4931 msgid "Provider" msgstr "Провайдер" -#: describe.c:4893 describe.c:4898 +#: describe.c:4965 describe.c:4970 msgid "Deterministic?" msgstr "Детерминированное?" -#: describe.c:4938 +#: describe.c:5009 msgid "List of collations" msgstr "СпиÑок правил Ñортировки" -#: describe.c:5000 +#: describe.c:5070 msgid "List of schemas" msgstr "СпиÑок Ñхем" -#: describe.c:5117 +#: describe.c:5186 msgid "List of text search parsers" msgstr "СпиÑок анализаторов текÑтового поиÑка" -#: describe.c:5167 +#: describe.c:5236 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Ðнализатор текÑтового поиÑка \"%s\" не найден." -#: describe.c:5170 +#: describe.c:5239 #, c-format msgid "Did not find any text search parsers." msgstr "Ðикакие анализаторы текÑтового поиÑка не найдены." -#: describe.c:5245 +#: describe.c:5314 msgid "Start parse" msgstr "Ðачало разбора" -#: describe.c:5246 +#: describe.c:5315 msgid "Method" msgstr "Метод" -#: describe.c:5250 +#: describe.c:5319 msgid "Get next token" msgstr "Получение Ñледующего фрагмента" -#: describe.c:5252 +#: describe.c:5321 msgid "End parse" msgstr "Окончание разбора" -#: describe.c:5254 +#: describe.c:5323 msgid "Get headline" msgstr "Получение выдержки" -#: describe.c:5256 +#: describe.c:5325 msgid "Get token types" msgstr "Получение типов фрагментов" -#: describe.c:5267 +#: describe.c:5335 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Ðнализатор текÑтового поиÑка \"%s.%s\"" -#: describe.c:5270 +#: describe.c:5338 #, c-format msgid "Text search parser \"%s\"" msgstr "Ðнализатор текÑтового поиÑка \"%s\"" -#: describe.c:5289 +#: describe.c:5357 msgid "Token name" msgstr "Ð˜Ð¼Ñ Ñ„Ñ€Ð°Ð³Ð¼ÐµÐ½Ñ‚Ð°" -#: describe.c:5303 +#: describe.c:5370 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Типы фрагментов Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° \"%s.%s\"" -#: describe.c:5306 +#: describe.c:5373 #, c-format msgid "Token types for parser \"%s\"" msgstr "Типы фрагментов Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° \"%s\"" -#: describe.c:5350 +#: describe.c:5417 msgid "Template" msgstr "Шаблон" -#: describe.c:5351 +#: describe.c:5418 msgid "Init options" msgstr "Параметры инициализации" -#: describe.c:5378 +#: describe.c:5444 msgid "List of text search dictionaries" msgstr "СпиÑок Ñловарей текÑтового поиÑка" -#: describe.c:5411 +#: describe.c:5477 msgid "Init" msgstr "ИнициализациÑ" -#: describe.c:5412 +#: describe.c:5478 msgid "Lexize" msgstr "Выделение лекÑем" -#: describe.c:5444 +#: describe.c:5509 msgid "List of text search templates" msgstr "СпиÑок шаблонов текÑтового поиÑка" -#: describe.c:5499 +#: describe.c:5563 msgid "List of text search configurations" msgstr "СпиÑок конфигураций текÑтового поиÑка" -#: describe.c:5550 +#: describe.c:5614 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка \"%s\" не найдена." -#: describe.c:5553 +#: describe.c:5617 #, c-format msgid "Did not find any text search configurations." msgstr "Ðикакие конфигурации текÑтового поиÑка не найдены." -#: describe.c:5619 +#: describe.c:5683 msgid "Token" msgstr "Фрагмент" -#: describe.c:5620 +#: describe.c:5684 msgid "Dictionaries" msgstr "Словари" -#: describe.c:5631 +#: describe.c:5695 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка \"%s.%s\"" -#: describe.c:5634 +#: describe.c:5698 #, c-format msgid "Text search configuration \"%s\"" msgstr "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÐºÑтового поиÑка \"%s\"" -#: describe.c:5638 +#: describe.c:5702 #, c-format msgid "" "\n" @@ -2246,7 +2341,7 @@ msgstr "" "\n" "Ðнализатор: \"%s.%s\"" -#: describe.c:5641 +#: describe.c:5705 #, c-format msgid "" "\n" @@ -2255,253 +2350,273 @@ msgstr "" "\n" "Ðнализатор: \"%s\"" -#: describe.c:5722 +#: describe.c:5784 msgid "List of foreign-data wrappers" msgstr "СпиÑок обёрток Ñторонних данных" -#: describe.c:5750 +#: describe.c:5812 msgid "Foreign-data wrapper" msgstr "Обёртка Ñторонних данных" -#: describe.c:5768 describe.c:5958 +#: describe.c:5830 describe.c:6017 msgid "Version" msgstr "ВерÑиÑ" -#: describe.c:5799 +#: describe.c:5860 msgid "List of foreign servers" msgstr "СпиÑок Ñторонних Ñерверов" -#: describe.c:5824 describe.c:5883 +#: describe.c:5885 describe.c:5943 msgid "Server" msgstr "Сервер" -#: describe.c:5825 +#: describe.c:5886 msgid "User name" msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" -#: describe.c:5855 +#: describe.c:5915 msgid "List of user mappings" msgstr "СпиÑок ÑопоÑтавлений пользователей" -#: describe.c:5928 +#: describe.c:5987 msgid "List of foreign tables" msgstr "СпиÑок Ñторонних таблиц" -#: describe.c:5980 +#: describe.c:6038 msgid "List of installed extensions" msgstr "СпиÑок уÑтановленных раÑширений" -#: describe.c:6028 +#: describe.c:6086 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "РаÑширение \"%s\" не найдено." -#: describe.c:6031 +#: describe.c:6089 #, c-format msgid "Did not find any extensions." msgstr "Ðикакие раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ найдены." -#: describe.c:6075 +#: describe.c:6133 msgid "Object description" msgstr "ОпиÑание объекта" -#: describe.c:6085 +#: describe.c:6142 #, c-format msgid "Objects in extension \"%s\"" msgstr "Объекты в раÑширении \"%s\"" -#: describe.c:6126 +#: describe.c:6183 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неверное полное Ð¸Ð¼Ñ (Ñлишком много компонентов): %s" -#: describe.c:6140 +#: describe.c:6197 #, c-format msgid "cross-database references are not implemented: %s" msgstr "ÑÑылки между базами не реализованы: %s" -#: describe.c:6171 describe.c:6298 +#: describe.c:6228 describe.c:6354 #, c-format msgid "The server (version %s) does not support publications." msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает публикации." -#: describe.c:6188 describe.c:6376 +#: describe.c:6245 describe.c:6432 msgid "All tables" msgstr "Ð’Ñе таблицы" -#: describe.c:6189 describe.c:6377 +#: describe.c:6246 describe.c:6433 msgid "Inserts" msgstr "ДобавлениÑ" -#: describe.c:6190 describe.c:6378 +#: describe.c:6247 describe.c:6434 msgid "Updates" msgstr "ИзменениÑ" -#: describe.c:6191 describe.c:6379 +#: describe.c:6248 describe.c:6435 msgid "Deletes" msgstr "УдалениÑ" -#: describe.c:6195 describe.c:6381 +#: describe.c:6252 describe.c:6437 msgid "Truncates" msgstr "ОпуÑтошениÑ" -#: describe.c:6199 describe.c:6383 +#: describe.c:6256 describe.c:6439 msgid "Via root" msgstr "Через корень" -#: describe.c:6221 +#: describe.c:6277 msgid "List of publications" msgstr "СпиÑок публикаций" -#: describe.c:6345 +#: describe.c:6401 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ \"%s\" не найдена." -#: describe.c:6348 +#: describe.c:6404 #, c-format msgid "Did not find any publications." msgstr "Ðикакие публикации не найдены." -#: describe.c:6372 +#: describe.c:6428 #, c-format msgid "Publication %s" msgstr "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ %s" -#: describe.c:6425 +#: describe.c:6481 msgid "Tables:" msgstr "Таблицы:" -#: describe.c:6437 +#: describe.c:6493 msgid "Tables from schemas:" msgstr "Таблицы из Ñхем:" -#: describe.c:6481 +#: describe.c:6538 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Сервер (верÑÐ¸Ñ %s) не поддерживает подпиÑки." -#: describe.c:6497 +#: describe.c:6554 msgid "Publication" msgstr "ПубликациÑ" -#: describe.c:6506 +#: describe.c:6563 msgid "Binary" msgstr "БинарнаÑ" -#: describe.c:6507 +#: describe.c:6572 describe.c:6576 msgid "Streaming" msgstr "ПотоковаÑ" -#: describe.c:6514 +#: describe.c:6584 msgid "Two-phase commit" msgstr "Ð”Ð²ÑƒÑ…Ñ„Ð°Ð·Ð½Ð°Ñ Ñ„Ð¸ÐºÑациÑ" -#: describe.c:6515 +#: describe.c:6585 msgid "Disable on error" msgstr "ОтключаетÑÑ Ð¿Ñ€Ð¸ ошибке" -#: describe.c:6520 +#: describe.c:6592 +msgid "Origin" +msgstr "ИÑточник" + +#: describe.c:6593 +msgid "Password required" +msgstr "ТребуетÑÑ Ð¿Ð°Ñ€Ð¾Ð»ÑŒ" + +#: describe.c:6594 +msgid "Run as owner?" +msgstr "ИÑпользовать владельца?" + +#: describe.c:6599 +msgid "Failover" +msgstr "ПереноÑимаÑ" + +#: describe.c:6604 msgid "Synchronous commit" msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð½Ð°Ñ Ñ„Ð¸ÐºÑациÑ" -#: describe.c:6521 +#: describe.c:6605 msgid "Conninfo" msgstr "Строка подключениÑ" -#: describe.c:6527 +#: describe.c:6611 msgid "Skip LSN" msgstr "ПропуÑтить LSN" -#: describe.c:6554 +#: describe.c:6637 msgid "List of subscriptions" msgstr "СпиÑок подпиÑок" -#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 +#: describe.c:6666 +msgid "(none)" +msgstr "(нет)" + +#: describe.c:6706 describe.c:6801 describe.c:6893 describe.c:6987 msgid "AM" msgstr "МД" -#: describe.c:6617 +#: describe.c:6707 msgid "Input type" msgstr "Входной тип" -#: describe.c:6618 +#: describe.c:6708 msgid "Storage type" msgstr "Тип хранениÑ" -#: describe.c:6619 +#: describe.c:6709 msgid "Operator class" msgstr "КлаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð²" -#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 +#: describe.c:6721 describe.c:6802 describe.c:6894 describe.c:6988 msgid "Operator family" msgstr "СемейÑтво операторов" -#: describe.c:6667 +#: describe.c:6756 msgid "List of operator classes" msgstr "СпиÑок клаÑÑов операторов" -#: describe.c:6714 +#: describe.c:6803 msgid "Applicable types" msgstr "Применимые типы" -#: describe.c:6756 +#: describe.c:6844 msgid "List of operator families" msgstr "СпиÑок ÑемейÑтв операторов" -#: describe.c:6807 +#: describe.c:6895 msgid "Operator" msgstr "Оператор" -#: describe.c:6808 +#: describe.c:6896 msgid "Strategy" msgstr "СтратегиÑ" -#: describe.c:6809 +#: describe.c:6897 msgid "ordering" msgstr "Ñортировка" -#: describe.c:6810 +#: describe.c:6898 msgid "search" msgstr "поиÑк" -#: describe.c:6811 +#: describe.c:6899 msgid "Purpose" msgstr "Ðазначение" -#: describe.c:6816 +#: describe.c:6904 msgid "Sort opfamily" msgstr "СемейÑтво Ð´Ð»Ñ Ñортировки" -#: describe.c:6855 +#: describe.c:6942 msgid "List of operators of operator families" msgstr "СпиÑок операторов из ÑемейÑтв операторов" -#: describe.c:6902 +#: describe.c:6989 msgid "Registered left type" msgstr "ЗарегиÑтрированный левый тип" -#: describe.c:6903 +#: describe.c:6990 msgid "Registered right type" msgstr "ЗарегиÑтрированный правый тип" -#: describe.c:6904 +#: describe.c:6991 msgid "Number" msgstr "Ðомер" -#: describe.c:6948 +#: describe.c:7034 msgid "List of support functions of operator families" msgstr "СпиÑок опорных функций из ÑемейÑтв операторов" -#: describe.c:6979 +#: describe.c:7065 msgid "ID" msgstr "ID" -#: describe.c:7000 +#: describe.c:7085 msgid "Large objects" msgstr "Большие объекты" -#: help.c:75 +#: help.c:63 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2509,11 +2624,11 @@ msgstr "" "psql - Ñто интерактивный терминал PostgreSQL.\n" "\n" -#: help.c:76 help.c:393 help.c:473 help.c:516 +#: help.c:64 help.c:372 help.c:456 help.c:502 msgid "Usage:\n" msgstr "ИÑпользование:\n" -#: help.c:77 +#: help.c:65 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2521,11 +2636,11 @@ msgstr "" " psql [ПÐРÐМЕТР]... [БД [ПОЛЬЗОВÐТЕЛЬ]]\n" "\n" -#: help.c:79 +#: help.c:67 msgid "General options:\n" msgstr "Общие параметры:\n" -#: help.c:84 +#: help.c:68 msgid "" " -c, --command=COMMAND run only single command (SQL or internal) and " "exit\n" @@ -2533,23 +2648,19 @@ msgstr "" " -c, --command=КОМÐÐДРвыполнить одну команду (SQL или внутреннюю) и " "выйти\n" -#: help.c:85 -#, c-format -msgid "" -" -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" -msgstr "" -" -d, --dbname=БД Ð¸Ð¼Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð°ÐµÐ¼Ð¾Ð¹ базы данных (по умолчанию \"%s\")" -"\n" +#: help.c:69 +msgid " -d, --dbname=DBNAME database name to connect to\n" +msgstr " -d, --dbname=БД Ð¸Ð¼Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð¹ базы данных\n" -#: help.c:87 +#: help.c:70 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=ИМЯ_ФÐЙЛРвыполнить команды из файла и выйти\n" -#: help.c:88 +#: help.c:71 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list вывеÑти ÑпиÑок баз данных и выйти\n" -#: help.c:89 +#: help.c:72 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2559,16 +2670,16 @@ msgstr "" " приÑвоить переменной psql ИМЯ заданное ЗÐÐЧЕÐИЕ\n" " (например: -v ON_ERROR_STOP=1)\n" -#: help.c:92 +#: help.c:75 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: help.c:93 +#: help.c:76 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr "" " -X, --no-psqlrc игнорировать файл параметров запуÑка (~/.psqlrc)\n" -#: help.c:94 +#: help.c:77 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-" @@ -2578,20 +2689,20 @@ msgstr "" " выполнить как одну транзакцию\n" " (в неинтерактивном режиме)\n" -#: help.c:96 +#: help.c:79 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] показать Ñту Ñправку и выйти\n" -#: help.c:97 +#: help.c:80 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands перечиÑлить команды Ñ \\ и выйти\n" -#: help.c:98 +#: help.c:81 msgid " --help=variables list special variables, then exit\n" msgstr "" " --help=variables перечиÑлить Ñпециальные переменные и выйти\n" -#: help.c:100 +#: help.c:83 msgid "" "\n" "Input and output options:\n" @@ -2599,54 +2710,54 @@ msgstr "" "\n" "Параметры ввода/вывода:\n" -#: help.c:101 +#: help.c:84 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all отображать вÑе команды из Ñкрипта\n" -#: help.c:102 +#: help.c:85 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors отображать команды Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸\n" -#: help.c:103 +#: help.c:86 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries отображать команды, отправлÑемые Ñерверу\n" -#: help.c:104 +#: help.c:87 msgid "" " -E, --echo-hidden display queries that internal commands generate\n" msgstr "" " -E, --echo-hidden выводить запроÑÑ‹, порождённые внутренними " "командами\n" -#: help.c:105 +#: help.c:88 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=ИМЯ_ФÐЙЛРÑохранÑть протокол работы в файл\n" -#: help.c:106 +#: help.c:89 msgid "" " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr "" " -n, --no-readline отключить редактор командной Ñтроки readline\n" -#: help.c:107 +#: help.c:90 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr "" -" -o, --output=ИМЯ_ФÐЙЛРнаправить результаты запроÑа в файл (или канал |)" -"\n" +" -o, --output=ИМЯ_ФÐЙЛРнаправить результаты запроÑа в файл (или канал " +"|)\n" -#: help.c:108 +#: help.c:91 msgid "" " -q, --quiet run quietly (no messages, only query output)\n" msgstr "" " -q, --quiet показывать только результаты запроÑов, без " "Ñообщений\n" -#: help.c:109 +#: help.c:92 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr "" " -s, --single-step пошаговый режим (подтверждение каждого запроÑа)\n" -#: help.c:110 +#: help.c:93 msgid "" " -S, --single-line single-line mode (end of line terminates SQL " "command)\n" @@ -2654,7 +2765,7 @@ msgstr "" " -S, --single-line одноÑтрочный режим (конец Ñтроки завершает " "команду)\n" -#: help.c:112 +#: help.c:95 msgid "" "\n" "Output format options:\n" @@ -2662,11 +2773,11 @@ msgstr "" "\n" "Параметры вывода:\n" -#: help.c:113 +#: help.c:96 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align режим вывода невыровненной таблицы\n" -#: help.c:114 +#: help.c:97 msgid "" " --csv CSV (Comma-Separated Values) table output mode\n" msgstr "" @@ -2674,22 +2785,22 @@ msgstr "" "разделённые\n" " запÑтыми)\n" -#: help.c:115 +#: help.c:98 #, c-format msgid "" " -F, --field-separator=STRING\n" -" field separator for unaligned output (default: \"" -"%s\")\n" +" field separator for unaligned output (default: " +"\"%s\")\n" msgstr "" " -F, --field-separator=СТРОКÐ\n" " разделителей полей при невыровненном выводе\n" " (по умолчанию: \"%s\")\n" -#: help.c:118 +#: help.c:101 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html вывод таблицы в формате HTML\n" -#: help.c:119 +#: help.c:102 msgid "" " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset " "command)\n" @@ -2698,7 +2809,7 @@ msgstr "" "ЗÐÐЧЕÐИЕМ)\n" " (Ñм. опиÑание \\pset)\n" -#: help.c:120 +#: help.c:103 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: " @@ -2708,22 +2819,22 @@ msgstr "" " разделитель запиÑей при невыровненном выводе\n" " (по умолчанию: Ð½Ð¾Ð²Ð°Ñ Ñтрока)\n" -#: help.c:122 +#: help.c:105 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only выводить только кортежи\n" -#: help.c:123 +#: help.c:106 msgid "" " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, " "border)\n" msgstr "" " -T, --table-attr=ТЕКСТ уÑтановить атрибуты HTML-таблицы (width, border)\n" -#: help.c:124 +#: help.c:107 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded включить развёрнутый вывод таблицы\n" -#: help.c:125 +#: help.c:108 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero " @@ -2733,7 +2844,7 @@ msgstr "" " Ñделать разделителем полей при невыровненном\n" " выводе нулевой байт\n" -#: help.c:127 +#: help.c:110 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero " @@ -2743,7 +2854,7 @@ msgstr "" " Ñделать разделителем запиÑей при невыровненном\n" " нулевой байт\n" -#: help.c:130 +#: help.c:113 msgid "" "\n" "Connection options:\n" @@ -2751,46 +2862,36 @@ msgstr "" "\n" "Параметры подключениÑ:\n" -#: help.c:133 -#, c-format -msgid "" -" -h, --host=HOSTNAME database server host or socket directory " -"(default: \"%s\")\n" +#: help.c:114 +msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог Ñокетов\n" -" (по умолчанию: \"%s\")\n" +" -h, --host=ИМЯ компьютер Ñ Ñервером баз данных или каталог " +"Ñокетов\n" -#: help.c:134 -msgid "local socket" -msgstr "локальный Ñокет" - -#: help.c:137 -#, c-format -msgid " -p, --port=PORT database server port (default: \"%s\")\n" -msgstr "" -" -p, --port=ПОРТ порт Ñервера баз данных (по умолчанию: \"%s\")\n" +#: help.c:115 +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=ПОРТ порт Ñервера баз данных\n" -#: help.c:140 -#, c-format -msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" -msgstr " -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (по умолчанию: \"%s\")\n" +#: help.c:116 +msgid " -U, --username=USERNAME database user name\n" +msgstr " -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð‘Ð”\n" -#: help.c:142 +#: help.c:117 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: help.c:143 +#: help.c:118 msgid "" " -W, --password force password prompt (should happen " "automatically)\n" msgstr "" " -W, --password запрашивать пароль вÑегда (обычно не требуетÑÑ)\n" -#: help.c:145 +#: help.c:120 msgid "" "\n" -"For more information, type \"\\?\" (for internal commands) or \"\\help\" " -"(for SQL\n" +"For more information, type \"\\?\" (for internal commands) or " +"\"\\help\" (for SQL\n" "commands) from within psql, or consult the psql section in the PostgreSQL\n" "documentation.\n" "\n" @@ -2802,36 +2903,40 @@ msgstr "" "документации PostgreSQL.\n" "\n" -#: help.c:148 +#: help.c:123 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: help.c:149 +#: help.c:124 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" -#: help.c:191 +#: help.c:166 msgid "General\n" msgstr "Общие\n" +#: help.c:167 +msgid " \\bind [PARAM]... set query parameters\n" +msgstr " \\bind [ПÐРÐМЕТР]... задать параметры запроÑа\n" + # skip-rule: copyright -#: help.c:192 +#: help.c:168 msgid "" " \\copyright show PostgreSQL usage and distribution terms\n" msgstr "" " \\copyright уÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ раÑпроÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ " "PostgreSQL\n" -#: help.c:193 +#: help.c:169 msgid "" " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr "" " \\crosstabview [СТОЛБЦЫ] выполнить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¸ вывеÑти результат в " "перекрёÑтном виде\n" -#: help.c:194 +#: help.c:170 msgid "" " \\errverbose show most recent error message at maximum " "verbosity\n" @@ -2839,7 +2944,7 @@ msgstr "" " \\errverbose вывеÑти макÑимально подробное Ñообщение о " "поÑледней ошибке\n" -#: help.c:195 +#: help.c:171 msgid "" " \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" @@ -2848,13 +2953,13 @@ msgstr "" " или канал |); \\g без аргументов равнозначно \";" "\"\n" -#: help.c:197 +#: help.c:173 msgid "" " \\gdesc describe result of query, without executing it\n" msgstr "" " \\gdesc опиÑать результат запроÑа, но не выполнÑть его\n" -#: help.c:198 +#: help.c:174 msgid "" " \\gexec execute query, then execute each value in its " "result\n" @@ -2862,7 +2967,7 @@ msgstr "" " \\gexec выполнить запроÑ, а затем выполнить каждую Ñтроку " "в результате\n" -#: help.c:199 +#: help.c:175 msgid "" " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr "" @@ -2870,55 +2975,60 @@ msgstr "" "переменных\n" " psql\n" -#: help.c:200 +#: help.c:176 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr "" " \\gx [(ПÐРÐМЕТРЫ)] [ФÐЙЛ] то же, что \\g, но в режиме развёрнутого вывода\n" -#: help.c:201 +#: help.c:177 msgid " \\q quit psql\n" msgstr " \\q выйти из psql\n" -#: help.c:202 -msgid " \\watch [SEC] execute query every SEC seconds\n" +#: help.c:178 +msgid "" +" \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" execute query every SEC seconds, up to N times,\n" +" stop if less than MIN rows are returned\n" msgstr "" -" \\watch [СЕК] повторÑть Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð² цикле через заданное чиÑло " -"Ñекунд\n" +" \\watch [[i=]СЕК] [c=N] [m=MIN]\n" +" повторÑть Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ‡ÐµÑ€ÐµÐ· заданное чиÑло Ñекунд, не " +"более\n" +" N раз, оÑтановитьÑÑ, еÑли получено менее MIN Ñтрок\n" -#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 -#: help.c:304 help.c:324 help.c:337 help.c:346 +#: help.c:181 help.c:189 help.c:201 help.c:211 help.c:218 help.c:275 help.c:283 +#: help.c:303 help.c:316 help.c:325 msgid "\n" msgstr "\n" -#: help.c:205 +#: help.c:183 msgid "Help\n" msgstr "Справка\n" -#: help.c:207 +#: help.c:185 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] Ñправка по командам psql c \\\n" -#: help.c:208 +#: help.c:186 msgid " \\? options show help on psql command-line options\n" msgstr "" " \\? options Ñправка по параметрам командной Ñтроки psql\n" -#: help.c:209 +#: help.c:187 msgid " \\? variables show help on special variables\n" msgstr " \\? variables Ñправка по Ñпециальным переменным\n" -#: help.c:210 +#: help.c:188 msgid "" " \\h [NAME] help on syntax of SQL commands, * for all " "commands\n" msgstr "" " \\h [ИМЯ] Ñправка по заданному SQL-оператору; * - по вÑем\n" -#: help.c:213 +#: help.c:191 msgid "Query Buffer\n" msgstr "Буфер запроÑа\n" -#: help.c:214 +#: help.c:192 msgid "" " \\e [FILE] [LINE] edit the query buffer (or file) with external " "editor\n" @@ -2926,57 +3036,57 @@ msgstr "" " \\e [ФÐЙЛ] [СТРОКÐ] править буфер запроÑа (или файл) во внешнем " "редакторе\n" -#: help.c:215 +#: help.c:193 msgid "" " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr "" " \\ef [ФУÐКЦИЯ [СТРОКÐ]] править определение функции во внешнем редакторе\n" -#: help.c:216 +#: help.c:194 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr "" " \\ev [VIEWNAME [LINE]] править определение предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¾ внешнем " "редакторе\n" -#: help.c:217 +#: help.c:195 msgid " \\p show the contents of the query buffer\n" msgstr " \\p вывеÑти Ñодержимое буфера запроÑов\n" -#: help.c:218 +#: help.c:196 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r очиÑтить буфер запроÑа\n" -#: help.c:220 +#: help.c:198 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [ФÐЙЛ] вывеÑти иÑторию или Ñохранить её в файл\n" -#: help.c:222 +#: help.c:200 msgid " \\w FILE write query buffer to file\n" msgstr " \\w ФÐЙЛ запиÑать буфер запроÑа в файл\n" -#: help.c:225 +#: help.c:203 msgid "Input/Output\n" msgstr "Ввод/Вывод\n" -#: help.c:226 +#: help.c:204 msgid "" " \\copy ... perform SQL COPY with data stream to the client " "host\n" msgstr " \\copy ... выполнить SQL COPY на Ñтороне клиента\n" -#: help.c:227 +#: help.c:205 msgid "" -" \\echo [-n] [STRING] write string to standard output (-n for no newline)" -"\n" +" \\echo [-n] [STRING] write string to standard output (-n for no " +"newline)\n" msgstr "" " \\echo [-n] [СТРОКÐ] запиÑать Ñтроку в поток Ñтандартного вывода\n" " (-n отключает перевод Ñтроки)\n" -#: help.c:228 +#: help.c:206 msgid " \\i FILE execute commands from file\n" msgstr " \\i ФÐЙЛ выполнить команды из файла\n" -#: help.c:229 +#: help.c:207 msgid "" " \\ir FILE as \\i, but relative to location of current " "script\n" @@ -2984,13 +3094,13 @@ msgstr "" " \\ir ФÐЙЛ подобно \\i, но путь задаётÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно\n" " текущего Ñкрипта\n" -#: help.c:230 +#: help.c:208 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr "" " \\o [ФÐЙЛ] выводить вÑе результаты запроÑов в файл или канал " "|\n" -#: help.c:231 +#: help.c:209 msgid "" " \\qecho [-n] [STRING] write string to \\o output stream (-n for no " "newline)\n" @@ -2998,144 +3108,144 @@ msgstr "" " \\qecho [-n] [СТРОКÐ] запиÑать Ñтроку в выходной поток \\o\n" " (-n отключает перевод Ñтроки)\n" -#: help.c:232 +#: help.c:210 msgid "" -" \\warn [-n] [STRING] write string to standard error (-n for no newline)" -"\n" +" \\warn [-n] [STRING] write string to standard error (-n for no " +"newline)\n" msgstr "" " \\warn [-n] [СТРОКÐ] запиÑать Ñтроку в поток вывода ошибок\n" " (-n отключает перевод Ñтроки)\n" -#: help.c:235 +#: help.c:213 msgid "Conditional\n" msgstr "УÑловиÑ\n" -#: help.c:236 +#: help.c:214 msgid " \\if EXPR begin conditional block\n" msgstr " \\if ВЫРÐЖЕÐИЕ начало блока уÑловиÑ\n" -#: help.c:237 +#: help.c:215 msgid "" " \\elif EXPR alternative within current conditional block\n" msgstr "" " \\elif ВЫРÐЖЕÐИЕ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ð²ÐµÑ‚Ð²ÑŒ в текущем блоке уÑловиÑ\n" -#: help.c:238 +#: help.c:216 msgid "" " \\else final alternative within current conditional " "block\n" msgstr "" " \\else Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð²ÐµÑ‚Ð²ÑŒ в текущем блоке уÑловиÑ\n" -#: help.c:239 +#: help.c:217 msgid " \\endif end conditional block\n" msgstr " \\endif конец блока уÑловиÑ\n" -#: help.c:242 +#: help.c:220 msgid "Informational\n" msgstr "Информационные\n" -#: help.c:243 +#: help.c:221 msgid " (options: S = show system objects, + = additional detail)\n" msgstr "" " (дополнениÑ: S = показывать ÑиÑтемные объекты, + = дополнительные " "подробноÑти)\n" -#: help.c:244 +#: help.c:222 msgid " \\d[S+] list tables, views, and sequences\n" msgstr "" " \\d[S+] ÑпиÑок таблиц, предÑтавлений и " "поÑледовательноÑтей\n" -#: help.c:245 +#: help.c:223 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr "" " \\d[S+] ИМЯ опиÑание таблицы, предÑтавлениÑ, " "поÑледовательноÑти\n" " или индекÑа\n" -#: help.c:246 +#: help.c:224 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [МÐСКÐ] ÑпиÑок агрегатных функций\n" -#: help.c:247 +#: help.c:225 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [МÐСКÐ] ÑпиÑок методов доÑтупа\n" # well-spelled: МСК -#: help.c:248 +#: help.c:226 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [МСК_МД [МСК_ТИПÐ]] ÑпиÑок клаÑÑов операторов\n" # well-spelled: МСК -#: help.c:249 +#: help.c:227 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [МСК_МД [МСК_ТИПÐ]] ÑпиÑок ÑемейÑтв операторов\n" # well-spelled: МСК -#: help.c:250 +#: help.c:228 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr "" " \\dAo[+] [МСК_МД [МСК_СОП]] ÑпиÑок операторов из ÑемейÑтв операторов\n" # well-spelled: МСК -#: help.c:251 +#: help.c:229 msgid "" " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [МСК_МД [МСК_СОП]] ÑпиÑок опорных функций из ÑемейÑтв\n" -#: help.c:252 +#: help.c:230 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [МÐСКÐ] ÑпиÑок табличных проÑтранÑтв\n" -#: help.c:253 +#: help.c:231 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [МÐСКÐ] ÑпиÑок преобразований\n" -#: help.c:254 +#: help.c:232 msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" msgstr " \\dconfig[+] [МÐСКÐ] ÑпиÑок параметров конфигурации\n" -#: help.c:255 +#: help.c:233 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [МÐСКÐ] ÑпиÑок приведений типов\n" -#: help.c:256 +#: help.c:234 msgid "" " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr "" " \\dd[S] [МÐСКÐ] опиÑÐ°Ð½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð², не выводимые в других режимах\n" -#: help.c:257 +#: help.c:235 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [МÐСКÐ] ÑпиÑок доменов\n" -#: help.c:258 +#: help.c:236 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [МÐСКÐ] ÑпиÑок прав по умолчанию\n" -#: help.c:259 +#: help.c:237 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [МÐСКÐ] ÑпиÑок Ñторонних таблиц\n" -#: help.c:260 +#: help.c:238 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [МÐСКÐ] ÑпиÑок Ñторонних Ñерверов\n" -#: help.c:261 +#: help.c:239 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [МÐСКÐ] ÑпиÑок Ñторонних таблиц\n" -#: help.c:262 +#: help.c:240 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [МÐСКÐ] ÑпиÑок ÑопоÑтавлений пользователей\n" -#: help.c:263 +#: help.c:241 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [МÐСКÐ] ÑпиÑок обёрток Ñторонних данных\n" # well-spelled: МСК, ФУÐК -#: help.c:264 +#: help.c:242 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] " @@ -3145,49 +3255,49 @@ msgstr "" " ÑпиÑок функций [только агрегатных/обычных/процедур/" "триггеров/оконных]\n" -#: help.c:266 +#: help.c:244 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [МÐСКÐ] ÑпиÑок конфигураций текÑтового поиÑка\n" -#: help.c:267 +#: help.c:245 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [МÐСКÐ] ÑпиÑок Ñловарей текÑтового поиÑка\n" -#: help.c:268 +#: help.c:246 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [МÐСКÐ] ÑпиÑок анализаторов текÑтового поиÑка\n" -#: help.c:269 +#: help.c:247 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [МÐСКÐ] ÑпиÑок шаблонов текÑтового поиÑка\n" -#: help.c:270 +#: help.c:248 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [МÐСКÐ] ÑпиÑок ролей\n" -#: help.c:271 +#: help.c:249 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [МÐСКÐ] ÑпиÑок индекÑов\n" -#: help.c:272 +#: help.c:250 msgid " \\dl[+] list large objects, same as \\lo_list\n" msgstr "" " \\dl[+] ÑпиÑок больших объектов (то же, что и \\lo_list)\n" -#: help.c:273 +#: help.c:251 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [МÐСКÐ] ÑпиÑок Ñзыков процедур\n" -#: help.c:274 +#: help.c:252 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [МÐСКÐ] ÑпиÑок материализованных предÑтавлений\n" -#: help.c:275 +#: help.c:253 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [МÐСКÐ] ÑпиÑок Ñхем\n" # well-spelled: МСК -#: help.c:276 +#: help.c:254 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" @@ -3195,18 +3305,18 @@ msgstr "" " \\do[S+] [МСК_ОП [МСК_ТИПР[МСК_ТИПÐ]]]\n" " ÑпиÑок операторов\n" -#: help.c:278 +#: help.c:256 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [МÐСКÐ] ÑпиÑок правил Ñортировки\n" -#: help.c:279 +#: help.c:257 msgid "" -" \\dp [PATTERN] list table, view, and sequence access privileges\n" +" \\dp[S] [PATTERN] list table, view, and sequence access privileges\n" msgstr "" -" \\dp [МÐСКÐ] ÑпиÑок прав доÑтупа к таблицам, предÑтавлениÑм и\n" +" \\dp[S] [МÐСКÐ] ÑпиÑок прав доÑтупа к таблицам, предÑтавлениÑм и\n" " поÑледовательноÑÑ‚Ñм\n" -#: help.c:280 +#: help.c:258 msgid "" " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations " "[n=nested]\n" @@ -3216,76 +3326,80 @@ msgstr "" "(n)\n" # well-spelled: МСК -#: help.c:281 +#: help.c:259 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr " \\drds [МСК_РОЛИ [МСК_БД]] ÑпиÑок параметров роли на уровне БД\n" -#: help.c:282 +#: help.c:260 +msgid " \\drg[S] [PATTERN] list role grants\n" +msgstr " \\drg[S] [МÐСКÐ] ÑпиÑок назначений ролей\n" + +#: help.c:261 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [МÐСКÐ] ÑпиÑок публикаций Ð´Ð»Ñ Ñ€ÐµÐ¿Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸\n" -#: help.c:283 +#: help.c:262 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [МÐСКÐ] ÑпиÑок подпиÑок на репликацию\n" -#: help.c:284 +#: help.c:263 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [МÐСКÐ] ÑпиÑок поÑледовательноÑтей\n" -#: help.c:285 +#: help.c:264 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [МÐСКÐ] ÑпиÑок таблиц\n" -#: help.c:286 +#: help.c:265 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [МÐСКÐ] ÑпиÑок типов данных\n" -#: help.c:287 +#: help.c:266 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [МÐСКÐ] ÑпиÑок ролей\n" -#: help.c:288 +#: help.c:267 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [МÐСКÐ] ÑпиÑок предÑтавлений\n" -#: help.c:289 +#: help.c:268 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [МÐСКÐ] ÑпиÑок раÑширений\n" -#: help.c:290 +#: help.c:269 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [МÐСКÐ] ÑпиÑок раÑширенных ÑтатиÑтик\n" -#: help.c:291 +#: help.c:270 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [МÐСКÐ] ÑпиÑок Ñобытийных триггеров\n" -#: help.c:292 +#: help.c:271 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [МÐСКÐ] ÑпиÑок баз данных\n" -#: help.c:293 +#: help.c:272 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] ИМЯ_ФУÐКЦИИ показать определение функции\n" # well-spelled: ПРЕДСТ -#: help.c:294 +#: help.c:273 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] ИМЯ_ПРЕДСТ показать определение предÑтавлениÑ\n" -#: help.c:295 -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [МÐСКÐ] то же, что и \\dp\n" +#: help.c:274 +msgid " \\z[S] [PATTERN] same as \\dp\n" +msgstr " \\z[S] [МÐСКÐ] то же, что и \\dp\n" -#: help.c:298 +#: help.c:277 msgid "Large Objects\n" msgstr "Большие объекты\n" -#: help.c:299 +#: help.c:278 msgid " \\lo_export LOBOID FILE write large object to file\n" msgstr " \\lo_export OID_БО ФÐЙЛ запиÑать большой объект в файл\n" -#: help.c:300 +#: help.c:279 msgid "" " \\lo_import FILE [COMMENT]\n" " read large object from file\n" @@ -3293,32 +3407,32 @@ msgstr "" " \\lo_import ФÐЙЛ [КОММЕÐТÐРИЙ]\n" " прочитать большой объект из файла\n" -#: help.c:302 +#: help.c:281 msgid " \\lo_list[+] list large objects\n" msgstr " \\lo_list[+] ÑпиÑок больших объектов\n" -#: help.c:303 +#: help.c:282 msgid " \\lo_unlink LOBOID delete a large object\n" msgstr " \\lo_unlink OID_БО удалить большой объект\n" -#: help.c:306 +#: help.c:285 msgid "Formatting\n" msgstr "Форматирование\n" -#: help.c:307 +#: help.c:286 msgid "" " \\a toggle between unaligned and aligned output mode\n" msgstr "" " \\a переключение режимов вывода:\n" " неформатированный/выровненный\n" -#: help.c:308 +#: help.c:287 msgid " \\C [STRING] set table title, or unset if none\n" msgstr "" " \\C [СТРОКÐ] задать заголовок таблицы или убрать, еÑли не " "задан\n" -#: help.c:309 +#: help.c:288 msgid "" " \\f [STRING] show or set field separator for unaligned query " "output\n" @@ -3326,13 +3440,13 @@ msgstr "" " \\f [СТРОКÐ] показать или уÑтановить разделитель полей длÑ\n" " неформатированного вывода\n" -#: help.c:310 +#: help.c:289 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr "" " \\H переключить режим вывода в HTML (текущий: %s)\n" -#: help.c:312 +#: help.c:291 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3340,7 +3454,7 @@ msgid "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" msgstr "" " \\pset [ИМЯ [ЗÐÐЧЕÐИЕ]] уÑтановить параметр вывода таблицы\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3348,92 +3462,91 @@ msgstr "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" -#: help.c:319 +#: help.c:298 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] режим вывода только Ñтрок (ÑейчаÑ: %s)\n" -#: help.c:321 +#: help.c:300 msgid "" -" \\T [STRING] set HTML " -"
tag attributes, or unset if none\n" +" \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr "" -" \\T [СТРОКÐ] задать атрибуты Ð´Ð»Ñ " -"
или убрать, еÑли не заданы\n" +" \\T [СТРОКÐ] задать атрибуты длÑ
или убрать, еÑли не " +"заданы\n" -#: help.c:322 +#: help.c:301 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr "" -" \\x [on|off|auto] переключить режим раÑширенного вывода (ÑейчаÑ: %s)" -"\n" +" \\x [on|off|auto] переключить режим развёрнутого вывода (ÑейчаÑ: " +"%s)\n" -#: help.c:323 +#: help.c:302 msgid "auto" msgstr "auto" -#: help.c:326 +#: help.c:305 msgid "Connection\n" msgstr "Соединение\n" -#: help.c:328 +#: help.c:307 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently \"%s\")\n" msgstr "" -" \\c[onnect] {[БД|- ПОЛЬЗОВÐТЕЛЬ|- СЕРВЕР|- ПОРТ|-] | conninfo}\n" +" \\c[onnect] {[БД|- ПОЛЬЗОВÐТЕЛЬ|- КОМПЬЮТЕР|- ПОРТ|-] | conninfo}\n" " подключитьÑÑ Ðº другой базе данных\n" " (текущаÑ: \"%s\")\n" -#: help.c:332 +#: help.c:311 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" msgstr "" -" \\c[onnect] {[БД|- ПОЛЬЗОВÐТЕЛЬ|- СЕРВЕР|- ПОРТ|-] | conninfo}\n" +" \\c[onnect] {[БД|- ПОЛЬЗОВÐТЕЛЬ|- КОМПЬЮТЕР|- ПОРТ|-] | conninfo}\n" " подключитьÑÑ Ðº другой базе данных\n" " (ÑÐµÐ¹Ñ‡Ð°Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½ÐµÑ‚)\n" -#: help.c:334 +#: help.c:313 msgid "" " \\conninfo display information about current connection\n" msgstr " \\conninfo Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ текущем Ñоединении\n" -#: help.c:335 +#: help.c:314 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [КОДИРОВКÐ] показать/уÑтановить клиентÑкую кодировку\n" -#: help.c:336 +#: help.c:315 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [ИМЯ] безопаÑно Ñменить пароль пользователÑ\n" -#: help.c:339 +#: help.c:318 msgid "Operating System\n" msgstr "ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÑиÑтема\n" -#: help.c:340 +#: help.c:319 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [ПУТЬ] Ñменить текущий каталог\n" # well-spelled: ОКР -#: help.c:341 +#: help.c:320 msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" msgstr " \\getenv ПЕР_PSQL ПЕР_ОКР прочитать переменную окружениÑ\n" -#: help.c:342 +#: help.c:321 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr "" " \\setenv ИМЯ [ЗÐÐЧЕÐИЕ] уÑтановить или ÑброÑить переменную окружениÑ\n" -#: help.c:343 +#: help.c:322 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] включить/выключить Ñекундомер (ÑейчаÑ: %s)\n" -#: help.c:345 +#: help.c:324 msgid "" " \\! [COMMAND] execute command in shell or start interactive " "shell\n" @@ -3441,17 +3554,17 @@ msgstr "" " \\! [КОМÐÐДÐ] выполнить команду в командной оболочке\n" " или запуÑтить интерактивную оболочку\n" -#: help.c:348 +#: help.c:327 msgid "Variables\n" msgstr "Переменные\n" -#: help.c:349 +#: help.c:328 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr "" " \\prompt [ТЕКСТ] ИМЯ предложить пользователю задать внутреннюю " "переменную\n" -#: help.c:350 +#: help.c:329 msgid "" " \\set [NAME [VALUE]] set internal variable, or list all if no " "parameters\n" @@ -3459,11 +3572,11 @@ msgstr "" " \\set [ИМЯ [ЗÐÐЧЕÐИЕ]] уÑтановить внутреннюю переменную или вывеÑти вÑе,\n" " еÑли Ð¸Ð¼Ñ Ð½Ðµ задано\n" -#: help.c:351 +#: help.c:330 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset ИМЯ ÑброÑить (удалить) внутреннюю переменную\n" -#: help.c:390 +#: help.c:369 msgid "" "List of specially treated variables\n" "\n" @@ -3471,11 +3584,11 @@ msgstr "" "СпиÑок Ñпециальных переменных\n" "\n" -#: help.c:392 +#: help.c:371 msgid "psql variables:\n" msgstr "Переменные psql:\n" -#: help.c:394 +#: help.c:373 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3485,7 +3598,7 @@ msgstr "" " или \\set ИМЯ ЗÐÐЧЕÐИЕ в приглашении psql\n" "\n" -#: help.c:396 +#: help.c:375 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3493,7 +3606,7 @@ msgstr "" " AUTOCOMMIT\n" " еÑли уÑтановлен, уÑпешные SQL-команды фикÑируютÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки\n" -#: help.c:398 +#: help.c:377 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3505,7 +3618,7 @@ msgstr "" " preserve-lower (ÑохранÑть нижний),\n" " preserve-upper (ÑохранÑть верхний)]\n" -#: help.c:401 +#: help.c:380 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3513,7 +3626,7 @@ msgstr "" " DBNAME\n" " Ð¸Ð¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ подключённой базы данных\n" -#: help.c:403 +#: help.c:382 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3524,7 +3637,7 @@ msgstr "" " [all (вÑÑ‘), errors (ошибки), none (ничего),\n" " queries (запроÑÑ‹)]\n" -#: help.c:406 +#: help.c:385 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3534,7 +3647,7 @@ msgstr "" " еÑли включено, выводит внутренние запроÑÑ‹, порождаемые командами Ñ \\;\n" " еÑли уÑтановлено значение \"noexec\", они выводÑÑ‚ÑÑ, но не выполнÑÑŽÑ‚ÑÑ\n" -#: help.c:409 +#: help.c:388 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3542,25 +3655,25 @@ msgstr "" " ENCODING\n" " Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° клиентÑкого набора Ñимволов\n" -#: help.c:411 +#: help.c:390 msgid "" " ERROR\n" -" true if last query failed, else false\n" +" \"true\" if last query failed, else \"false\"\n" msgstr "" " ERROR\n" -" true в Ñлучае ошибки в поÑледнем запроÑе, иначе — false\n" +" \"true\" в Ñлучае ошибки в поÑледнем запроÑе, иначе — \"false\"\n" -#: help.c:413 +#: help.c:392 msgid "" " FETCH_COUNT\n" -" the number of result rows to fetch and display at a time (0 = unlimited)" -"\n" +" the number of result rows to fetch and display at a time (0 = " +"unlimited)\n" msgstr "" " FETCH_COUNT\n" " чиÑло результирующих Ñтрок, извлекаемых и отображаемых за раз\n" " (0 = без ограничений)\n" -#: help.c:415 +#: help.c:394 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3568,7 +3681,7 @@ msgstr "" " HIDE_TABLEAM\n" " еÑли уÑтановлено, табличные методы доÑтупа не выводÑÑ‚ÑÑ\n" -#: help.c:417 +#: help.c:396 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" @@ -3576,7 +3689,7 @@ msgstr "" " HIDE_TOAST_COMPRESSION\n" " еÑли уÑтановлено, методы ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð½Ðµ выводÑÑ‚ÑÑ\n" -#: help.c:419 +#: help.c:398 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3585,7 +3698,7 @@ msgstr "" " управлÑет иÑторией команд [ignorespace (игнорировать пробелы),\n" " ignoredups (игнорировать дубли), ignoreboth (и то, и другое)]\n" -#: help.c:421 +#: help.c:400 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3593,7 +3706,7 @@ msgstr "" " HISTFILE\n" " Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°, в котором будет ÑохранÑтьÑÑ Ð¸ÑÑ‚Ð¾Ñ€Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´\n" -#: help.c:423 +#: help.c:402 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3601,15 +3714,15 @@ msgstr "" " HISTSIZE\n" " макÑимальное чиÑло команд, ÑохранÑемых в иÑтории\n" -#: help.c:425 +#: help.c:404 msgid "" " HOST\n" " the currently connected database server host\n" msgstr "" " HOST\n" -" Ñервер баз данных, к которому уÑтановлено подключение\n" +" компьютер Ñ Ñервером баз данных, к которому уÑтановлено подключение\n" -#: help.c:427 +#: help.c:406 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3617,7 +3730,7 @@ msgstr "" " IGNOREEOF\n" " количеÑтво EOF Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ ÑеанÑа\n" -#: help.c:429 +#: help.c:408 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3625,7 +3738,7 @@ msgstr "" " LASTOID\n" " значение поÑледнего задейÑтвованного OID\n" -#: help.c:431 +#: help.c:410 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3638,7 +3751,7 @@ msgstr "" "\"00000\",\n" " еÑли ошибки не было\n" -#: help.c:434 +#: help.c:413 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3647,7 +3760,7 @@ msgstr "" " еÑли уÑтановлено, Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð½Ðµ прекращаетÑÑ Ð¿Ñ€Ð¸ ошибке\n" " (иÑпользуютÑÑ Ð½ÐµÑвные точки ÑохранениÑ)\n" -#: help.c:436 +#: help.c:415 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3655,7 +3768,7 @@ msgstr "" " ON_ERROR_STOP\n" " оÑтанавливать выполнение пакета команд поÑле ошибки\n" -#: help.c:438 +#: help.c:417 msgid "" " PORT\n" " server port of the current connection\n" @@ -3663,7 +3776,7 @@ msgstr "" " PORT\n" " порт Ñервера Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ ÑоединениÑ\n" -#: help.c:440 +#: help.c:419 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3671,7 +3784,7 @@ msgstr "" " PROMPT1\n" " уÑтанавливает Ñтандартное приглашение psql\n" -#: help.c:442 +#: help.c:421 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous " @@ -3681,7 +3794,7 @@ msgstr "" " уÑтанавливает приглашение, которое выводитÑÑ Ð¿Ñ€Ð¸ переноÑе оператора\n" " на новую Ñтроку\n" -#: help.c:444 +#: help.c:423 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3689,7 +3802,7 @@ msgstr "" " PROMPT3\n" " уÑтанавливает приглашение Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ COPY ... FROM STDIN\n" -#: help.c:446 +#: help.c:425 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3697,7 +3810,7 @@ msgstr "" " QUIET\n" " выводить минимум Ñообщений (как и Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ -q)\n" -#: help.c:448 +#: help.c:427 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3706,7 +3819,7 @@ msgstr "" " чиÑло Ñтрок, возвращённых или обработанных поÑледним SQL-запроÑом, либо " "0\n" -#: help.c:450 +#: help.c:429 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3716,7 +3829,24 @@ msgstr "" " SERVER_VERSION_NUM\n" " верÑÐ¸Ñ Ñервера (в коротком текÑтовом и чиÑловом формате)\n" -#: help.c:453 +#: help.c:432 +msgid "" +" SHELL_ERROR\n" +" \"true\" if the last shell command failed, \"false\" if it succeeded\n" +msgstr "" +" SHELL_ERROR\n" +" \"true\" в Ñлучае ошибки поÑледней команды оболочки, \"false\" в ином " +"Ñлучае\n" + +#: help.c:434 +msgid "" +" SHELL_EXIT_CODE\n" +" exit status of the last shell command\n" +msgstr "" +" SHELL_EXIT_CODE\n" +" код Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ñледней команды оболочки\n" + +#: help.c:436 msgid "" " SHOW_ALL_RESULTS\n" " show all results of a combined query (\\;) instead of only the last\n" @@ -3725,7 +3855,7 @@ msgstr "" " выводить вÑе результаты объединённых запроÑов (\\;), а не только " "поÑледнего\n" -#: help.c:455 +#: help.c:438 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3734,7 +3864,7 @@ msgstr "" " управлÑет отображением полей контекÑта Ñообщений\n" " [never (не отображать никогда), errors (ошибки), always (вÑегда]\n" -#: help.c:457 +#: help.c:440 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3743,7 +3873,7 @@ msgstr "" " еÑли уÑтановлено, конец Ñтроки завершает режим ввода SQL-команды\n" " (как и Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ -S)\n" -#: help.c:459 +#: help.c:442 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3751,7 +3881,7 @@ msgstr "" " SINGLESTEP\n" " пошаговый режим (как и Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ -s)\n" -#: help.c:461 +#: help.c:444 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3760,7 +3890,7 @@ msgstr "" " SQLSTATE поÑледнего запроÑа или \"00000\", еÑли он выполнилÑÑ Ð±ÐµÐ· " "ошибок\n" -#: help.c:463 +#: help.c:446 msgid "" " USER\n" " the currently connected database user\n" @@ -3768,7 +3898,7 @@ msgstr "" " USER\n" " текущий пользователь, подключённый к БД\n" -#: help.c:465 +#: help.c:448 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3777,7 +3907,7 @@ msgstr "" " управлÑет детализацией отчётов об ошибках [default (по умолчанию),\n" " verbose (подробно), terse (кратко), sqlstate (код ÑоÑтоÑниÑ)]\n" -#: help.c:467 +#: help.c:450 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3789,7 +3919,7 @@ msgstr "" " VERSION_NUM\n" " верÑÐ¸Ñ psql (в развёрнутом, в коротком текÑтовом и в чиÑловом формате)\n" -#: help.c:472 +#: help.c:455 msgid "" "\n" "Display settings:\n" @@ -3797,7 +3927,7 @@ msgstr "" "\n" "Параметры отображениÑ:\n" -#: help.c:474 +#: help.c:457 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3807,7 +3937,7 @@ msgstr "" " или \\pset ИМЯ [ЗÐÐЧЕÐИЕ] в приглашении psql\n" "\n" -#: help.c:476 +#: help.c:459 msgid "" " border\n" " border style (number)\n" @@ -3815,7 +3945,7 @@ msgstr "" " border\n" " Ñтиль границы (чиÑло)\n" -#: help.c:478 +#: help.c:461 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3823,15 +3953,15 @@ msgstr "" " columns\n" " Ñ†ÐµÐ»ÐµÐ²Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñом\n" -#: help.c:480 +#: help.c:463 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" msgstr "" " expanded (или x)\n" -" раÑширенный вывод [on (вкл.), off (выкл.), auto (авто)]\n" +" развёрнутый вывод [on (вкл.), off (выкл.), auto (авто)]\n" -#: help.c:482 +#: help.c:465 #, c-format msgid "" " fieldsep\n" @@ -3840,7 +3970,7 @@ msgstr "" " fieldsep\n" " разделитель полей Ð´Ð»Ñ Ð½ÐµÑ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð³Ð¾ вывода (по умолчанию \"%s\")\n" -#: help.c:485 +#: help.c:468 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3848,7 +3978,7 @@ msgstr "" " fieldsep_zero\n" " уÑтанавливает ноль разделителем полей при неформатированном выводе\n" -#: help.c:487 +#: help.c:470 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3856,7 +3986,7 @@ msgstr "" " footer\n" " включает или выключает вывод подпиÑей таблицы [on (вкл.), off (выкл.)]\n" -#: help.c:489 +#: help.c:472 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3866,7 +3996,7 @@ msgstr "" "\n" " aligned (выровненный), wrapped (Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñом), html, asciidoc, ...]\n" -#: help.c:491 +#: help.c:474 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3874,7 +4004,7 @@ msgstr "" " linestyle\n" " задаёт Ñтиль риÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð»Ð¸Ð½Ð¸Ð¹ границы [ascii, old-ascii, unicode]\n" -#: help.c:493 +#: help.c:476 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3882,7 +4012,7 @@ msgstr "" " null\n" " уÑтанавливает Ñтроку, выводимую вмеÑто Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ NULL\n" -#: help.c:495 +#: help.c:478 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of " @@ -3891,7 +4021,7 @@ msgstr "" " numericlocale\n" " отключает вывод заданного локалью Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ цифр\n" -#: help.c:497 +#: help.c:480 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3900,7 +4030,7 @@ msgstr "" " определÑет, иÑпользуетÑÑ Ð»Ð¸ внешний поÑтраничник\n" " [yes (да), no (нет), always (вÑегда)]\n" -#: help.c:499 +#: help.c:482 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3908,7 +4038,7 @@ msgstr "" " recordsep\n" " разделитель запиÑей (Ñтрок) при неформатированном выводе\n" -#: help.c:501 +#: help.c:484 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3916,7 +4046,7 @@ msgstr "" " recordsep_zero\n" " уÑтанавливает ноль разделителем запиÑей при неформатированном выводе\n" -#: help.c:503 +#: help.c:486 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3926,7 +4056,7 @@ msgstr "" " задаёт атрибуты Ð´Ð»Ñ Ñ‚ÐµÐ³Ð° table в формате html или пропорциональные\n" " ширины Ñтолбцов Ð´Ð»Ñ Ð²Ñ‹Ñ€Ð¾Ð²Ð½ÐµÐ½Ð½Ñ‹Ñ… влево данных, в формате latex-longtable\n" -#: help.c:506 +#: help.c:489 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3934,7 +4064,7 @@ msgstr "" " title\n" " задаёт заголовок таблицы Ð´Ð»Ñ Ð¿Ð¾Ñледовательно печатаемых таблиц\n" -#: help.c:508 +#: help.c:491 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3942,7 +4072,7 @@ msgstr "" " tuples_only\n" " еÑли уÑтановлено, выводÑÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ непоÑредÑтвенно табличные данные\n" -#: help.c:510 +#: help.c:493 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3955,7 +4085,17 @@ msgstr "" " задаёт Ñтиль риÑуемых линий Unicode [single (одинарные), double " "(двойные)]\n" -#: help.c:515 +#: help.c:497 +msgid "" +" xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr "" +" xheader_width\n" +" задаёт макÑимальную ширину заголовка Ð´Ð»Ñ Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ð½ÑƒÑ‚Ð¾Ð³Ð¾ вывода\n" +" [full (полноÑтью), column (Ñтолбец), page (Ñтраница), целое значение]\n" + +#: help.c:501 msgid "" "\n" "Environment variables:\n" @@ -3963,7 +4103,7 @@ msgstr "" "\n" "Переменные окружениÑ:\n" -#: help.c:519 +#: help.c:505 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3973,7 +4113,7 @@ msgstr "" " или \\setenv ИМЯ [ЗÐÐЧЕÐИЕ] в приглашении psql\n" "\n" -#: help.c:521 +#: help.c:507 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3985,7 +4125,7 @@ msgstr "" " или \\setenv ИМЯ ЗÐÐЧЕÐИЕ в приглашении psql\n" "\n" -#: help.c:524 +#: help.c:510 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3993,7 +4133,7 @@ msgstr "" " COLUMNS\n" " чиÑло Ñтолбцов Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñом\n" -#: help.c:526 +#: help.c:512 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -4001,7 +4141,7 @@ msgstr "" " PGAPPNAME\n" " Ñиноним параметра Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ application_name\n" -#: help.c:528 +#: help.c:514 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -4009,7 +4149,7 @@ msgstr "" " PGDATABASE\n" " Ñиноним параметра Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ dbname\n" -#: help.c:530 +#: help.c:516 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -4017,7 +4157,7 @@ msgstr "" " PGHOST\n" " Ñиноним параметра Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ host\n" -#: help.c:532 +#: help.c:518 msgid "" " PGPASSFILE\n" " password file name\n" @@ -4025,7 +4165,7 @@ msgstr "" " PGPASSFILE\n" " Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼\n" -#: help.c:534 +#: help.c:520 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -4033,7 +4173,7 @@ msgstr "" " PGPASSWORD\n" " пароль Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ (иÑпользовать не рекомендуетÑÑ)\n" -#: help.c:536 +#: help.c:522 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -4041,7 +4181,7 @@ msgstr "" " PGPORT\n" " Ñиноним параметра Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ port\n" -#: help.c:538 +#: help.c:524 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -4049,7 +4189,7 @@ msgstr "" " PGUSER\n" " Ñиноним параметра Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ user\n" -#: help.c:540 +#: help.c:526 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -4057,7 +4197,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " редактор, вызываемый командами \\e, \\ef и \\ev\n" -#: help.c:542 +#: help.c:528 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -4065,7 +4205,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " определÑет ÑпоÑоб передачи номера Ñтроки при вызове редактора\n" -#: help.c:544 +#: help.c:530 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -4073,7 +4213,7 @@ msgstr "" " PSQL_HISTORY\n" " альтернативное размещение файла Ñ Ð¸Ñторией команд\n" -#: help.c:546 +#: help.c:532 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -4081,7 +4221,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ внешнего поÑтраничника\n" -#: help.c:549 +#: help.c:535 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" @@ -4089,7 +4229,7 @@ msgstr "" " PSQL_WATCH_PAGER\n" " Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ внешнего поÑтраничника Ð´Ð»Ñ \\watch\n" -#: help.c:552 +#: help.c:538 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -4097,7 +4237,7 @@ msgstr "" " PSQLRC\n" " альтернативное размещение пользовательÑкого файла .psqlrc\n" -#: help.c:554 +#: help.c:540 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -4105,7 +4245,7 @@ msgstr "" " SHELL\n" " оболочка, Ð²Ñ‹Ð·Ñ‹Ð²Ð°ÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ \\!\n" -#: help.c:556 +#: help.c:542 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -4113,11 +4253,11 @@ msgstr "" " TMPDIR\n" " каталог Ð´Ð»Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ… файлов\n" -#: help.c:616 +#: help.c:602 msgid "Available help:\n" msgstr "ИмеющаÑÑÑ Ñправка:\n" -#: help.c:711 +#: help.c:697 #, c-format msgid "" "Command: %s\n" @@ -4136,7 +4276,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:734 +#: help.c:720 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4145,17 +4285,17 @@ msgstr "" "Ðет Ñправки по команде \"%s\".\n" "Попробуйте \\h без аргументов и поÑмотрите, что еÑть.\n" -#: input.c:217 +#: input.c:215 #, c-format msgid "could not read from input file: %m" msgstr "не удалоÑÑŒ прочитать входной файл: %m" -#: input.c:478 input.c:516 +#: input.c:476 input.c:514 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "не удалоÑÑŒ Ñохранить иÑторию в файле \"%s\": %m" -#: input.c:535 +#: input.c:533 #, c-format msgid "history is not supported by this installation" msgstr "в данной Ñреде иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ поддерживаетÑÑ" @@ -4248,12 +4388,12 @@ msgstr "" msgid "reached EOF without finding closing \\endif(s)" msgstr "в закончившемÑÑ Ð¿Ð¾Ñ‚Ð¾ÐºÐµ команд не хватает \\endif" -#: psqlscanslash.l:638 +#: psqlscanslash.l:642 #, c-format msgid "unterminated quoted string" msgstr "Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ Ñтрока в кавычках" -#: psqlscanslash.l:811 +#: psqlscanslash.l:842 #, c-format msgid "%s: out of memory" msgstr "%s: нехватка памÑти" @@ -4261,2383 +4401,2420 @@ msgstr "%s: нехватка памÑти" #: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 #: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 #: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 -#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238 -#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248 -#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267 -#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323 -#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443 -#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524 -#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595 -#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606 -#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668 -#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714 -#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747 -#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802 -#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900 -#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999 -#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 -#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071 -#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086 -#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116 -#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141 -#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 -#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163 -#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310 -#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320 -#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445 -#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486 -#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507 -#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523 -#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548 -#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577 -#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 -#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687 -#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696 -#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996 -#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 -#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 -#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 -#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 -#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 -#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 -#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 -#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 -#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 -#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 -#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 -#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 -#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 -#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 -#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 -#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 -#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 -#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 -#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 -#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 -#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687 -#: sql_help.c:4735 sql_help.c:4893 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:245 +#: sql_help.c:247 sql_help.c:248 sql_help.c:250 sql_help.c:252 sql_help.c:255 +#: sql_help.c:257 sql_help.c:259 sql_help.c:261 sql_help.c:276 sql_help.c:277 +#: sql_help.c:278 sql_help.c:280 sql_help.c:329 sql_help.c:331 sql_help.c:333 +#: sql_help.c:335 sql_help.c:404 sql_help.c:409 sql_help.c:411 sql_help.c:453 +#: sql_help.c:455 sql_help.c:458 sql_help.c:460 sql_help.c:529 sql_help.c:534 +#: sql_help.c:539 sql_help.c:544 sql_help.c:549 sql_help.c:603 sql_help.c:605 +#: sql_help.c:607 sql_help.c:609 sql_help.c:611 sql_help.c:614 sql_help.c:616 +#: sql_help.c:619 sql_help.c:630 sql_help.c:632 sql_help.c:676 sql_help.c:678 +#: sql_help.c:680 sql_help.c:683 sql_help.c:685 sql_help.c:687 sql_help.c:728 +#: sql_help.c:732 sql_help.c:736 sql_help.c:757 sql_help.c:760 sql_help.c:763 +#: sql_help.c:792 sql_help.c:804 sql_help.c:812 sql_help.c:815 sql_help.c:818 +#: sql_help.c:833 sql_help.c:836 sql_help.c:865 sql_help.c:870 sql_help.c:875 +#: sql_help.c:880 sql_help.c:885 sql_help.c:912 sql_help.c:914 sql_help.c:916 +#: sql_help.c:918 sql_help.c:921 sql_help.c:923 sql_help.c:970 sql_help.c:1015 +#: sql_help.c:1020 sql_help.c:1025 sql_help.c:1030 sql_help.c:1035 +#: sql_help.c:1054 sql_help.c:1065 sql_help.c:1067 sql_help.c:1087 +#: sql_help.c:1097 sql_help.c:1098 sql_help.c:1100 sql_help.c:1102 +#: sql_help.c:1114 sql_help.c:1118 sql_help.c:1120 sql_help.c:1132 +#: sql_help.c:1134 sql_help.c:1136 sql_help.c:1138 sql_help.c:1157 +#: sql_help.c:1159 sql_help.c:1163 sql_help.c:1167 sql_help.c:1171 +#: sql_help.c:1174 sql_help.c:1175 sql_help.c:1176 sql_help.c:1179 +#: sql_help.c:1182 sql_help.c:1184 sql_help.c:1324 sql_help.c:1326 +#: sql_help.c:1329 sql_help.c:1332 sql_help.c:1334 sql_help.c:1336 +#: sql_help.c:1339 sql_help.c:1342 sql_help.c:1464 sql_help.c:1466 +#: sql_help.c:1468 sql_help.c:1471 sql_help.c:1492 sql_help.c:1495 +#: sql_help.c:1498 sql_help.c:1501 sql_help.c:1505 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1525 sql_help.c:1528 +#: sql_help.c:1530 sql_help.c:1532 sql_help.c:1542 sql_help.c:1544 +#: sql_help.c:1554 sql_help.c:1556 sql_help.c:1566 sql_help.c:1569 +#: sql_help.c:1592 sql_help.c:1594 sql_help.c:1596 sql_help.c:1598 +#: sql_help.c:1601 sql_help.c:1603 sql_help.c:1606 sql_help.c:1609 +#: sql_help.c:1660 sql_help.c:1703 sql_help.c:1706 sql_help.c:1708 +#: sql_help.c:1710 sql_help.c:1713 sql_help.c:1715 sql_help.c:1717 +#: sql_help.c:1720 sql_help.c:1770 sql_help.c:1786 sql_help.c:2019 +#: sql_help.c:2088 sql_help.c:2107 sql_help.c:2120 sql_help.c:2178 +#: sql_help.c:2186 sql_help.c:2196 sql_help.c:2224 sql_help.c:2257 +#: sql_help.c:2275 sql_help.c:2303 sql_help.c:2414 sql_help.c:2460 +#: sql_help.c:2485 sql_help.c:2508 sql_help.c:2512 sql_help.c:2546 +#: sql_help.c:2566 sql_help.c:2588 sql_help.c:2602 sql_help.c:2623 +#: sql_help.c:2652 sql_help.c:2685 sql_help.c:2708 sql_help.c:2755 +#: sql_help.c:3053 sql_help.c:3066 sql_help.c:3083 sql_help.c:3099 +#: sql_help.c:3139 sql_help.c:3193 sql_help.c:3197 sql_help.c:3199 +#: sql_help.c:3206 sql_help.c:3225 sql_help.c:3252 sql_help.c:3287 +#: sql_help.c:3299 sql_help.c:3308 sql_help.c:3352 sql_help.c:3366 +#: sql_help.c:3394 sql_help.c:3402 sql_help.c:3414 sql_help.c:3424 +#: sql_help.c:3432 sql_help.c:3440 sql_help.c:3448 sql_help.c:3456 +#: sql_help.c:3465 sql_help.c:3476 sql_help.c:3484 sql_help.c:3492 +#: sql_help.c:3500 sql_help.c:3508 sql_help.c:3518 sql_help.c:3527 +#: sql_help.c:3536 sql_help.c:3544 sql_help.c:3554 sql_help.c:3565 +#: sql_help.c:3573 sql_help.c:3582 sql_help.c:3593 sql_help.c:3602 +#: sql_help.c:3610 sql_help.c:3618 sql_help.c:3626 sql_help.c:3634 +#: sql_help.c:3642 sql_help.c:3650 sql_help.c:3658 sql_help.c:3666 +#: sql_help.c:3674 sql_help.c:3682 sql_help.c:3699 sql_help.c:3708 +#: sql_help.c:3716 sql_help.c:3733 sql_help.c:3748 sql_help.c:4061 +#: sql_help.c:4182 sql_help.c:4211 sql_help.c:4227 sql_help.c:4229 +#: sql_help.c:4733 sql_help.c:4781 sql_help.c:4940 msgid "name" msgstr "имÑ" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 -#: sql_help.c:3339 sql_help.c:4455 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:340 sql_help.c:1863 +#: sql_help.c:3367 sql_help.c:4500 msgid "aggregate_signature" msgstr "Ñигнатура_агр_функции" -#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253 -#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576 -#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798 -#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008 -#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105 -#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444 -#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534 -#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:260 +#: sql_help.c:281 sql_help.c:412 sql_help.c:459 sql_help.c:538 sql_help.c:586 +#: sql_help.c:604 sql_help.c:631 sql_help.c:684 sql_help.c:759 sql_help.c:814 +#: sql_help.c:835 sql_help.c:874 sql_help.c:924 sql_help.c:971 sql_help.c:1024 +#: sql_help.c:1056 sql_help.c:1066 sql_help.c:1101 sql_help.c:1121 +#: sql_help.c:1135 sql_help.c:1185 sql_help.c:1333 sql_help.c:1465 +#: sql_help.c:1508 sql_help.c:1529 sql_help.c:1543 sql_help.c:1555 +#: sql_help.c:1568 sql_help.c:1595 sql_help.c:1661 sql_help.c:1714 msgid "new_name" msgstr "новое_имÑ" -#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251 -#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623 -#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801 -#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 -#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 -#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510 -#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:258 +#: sql_help.c:279 sql_help.c:410 sql_help.c:495 sql_help.c:543 sql_help.c:633 +#: sql_help.c:642 sql_help.c:707 sql_help.c:731 sql_help.c:762 sql_help.c:817 +#: sql_help.c:879 sql_help.c:922 sql_help.c:1029 sql_help.c:1068 +#: sql_help.c:1099 sql_help.c:1119 sql_help.c:1133 sql_help.c:1183 +#: sql_help.c:1399 sql_help.c:1467 sql_help.c:1510 sql_help.c:1531 +#: sql_help.c:1593 sql_help.c:1709 sql_help.c:3039 msgid "new_owner" msgstr "новый_владелец" -#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322 -#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749 -#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087 -#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512 -#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:262 sql_help.c:332 +#: sql_help.c:461 sql_help.c:548 sql_help.c:686 sql_help.c:735 sql_help.c:765 +#: sql_help.c:820 sql_help.c:884 sql_help.c:1034 sql_help.c:1103 +#: sql_help.c:1137 sql_help.c:1335 sql_help.c:1512 sql_help.c:1533 +#: sql_help.c:1545 sql_help.c:1557 sql_help.c:1597 sql_help.c:1716 msgid "new_schema" msgstr "новаÑ_Ñхема" -#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484 +#: sql_help.c:44 sql_help.c:1927 sql_help.c:3368 sql_help.c:4529 msgid "where aggregate_signature is:" msgstr "где Ñигнатура_агр_функции:" -#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353 -#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520 -#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 -#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 -#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 -#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911 -#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085 -#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 -#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 -#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 -#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 -#: sql_help.c:4491 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:350 sql_help.c:363 +#: sql_help.c:367 sql_help.c:383 sql_help.c:386 sql_help.c:389 sql_help.c:530 +#: sql_help.c:535 sql_help.c:540 sql_help.c:545 sql_help.c:550 sql_help.c:866 +#: sql_help.c:871 sql_help.c:876 sql_help.c:881 sql_help.c:886 sql_help.c:1016 +#: sql_help.c:1021 sql_help.c:1026 sql_help.c:1031 sql_help.c:1036 +#: sql_help.c:1881 sql_help.c:1898 sql_help.c:1904 sql_help.c:1928 +#: sql_help.c:1931 sql_help.c:1934 sql_help.c:2089 sql_help.c:2108 +#: sql_help.c:2111 sql_help.c:2415 sql_help.c:2624 sql_help.c:3369 +#: sql_help.c:3372 sql_help.c:3375 sql_help.c:3466 sql_help.c:3555 +#: sql_help.c:3583 sql_help.c:3936 sql_help.c:4399 sql_help.c:4506 +#: sql_help.c:4513 sql_help.c:4519 sql_help.c:4530 sql_help.c:4533 +#: sql_help.c:4536 msgid "argmode" msgstr "режим_аргумента" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354 -#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 -#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 -#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 -#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 -#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912 -#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086 -#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 -#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 -#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 -#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:351 sql_help.c:364 +#: sql_help.c:368 sql_help.c:384 sql_help.c:387 sql_help.c:390 sql_help.c:531 +#: sql_help.c:536 sql_help.c:541 sql_help.c:546 sql_help.c:551 sql_help.c:867 +#: sql_help.c:872 sql_help.c:877 sql_help.c:882 sql_help.c:887 sql_help.c:1017 +#: sql_help.c:1022 sql_help.c:1027 sql_help.c:1032 sql_help.c:1037 +#: sql_help.c:1882 sql_help.c:1899 sql_help.c:1905 sql_help.c:1929 +#: sql_help.c:1932 sql_help.c:1935 sql_help.c:2090 sql_help.c:2109 +#: sql_help.c:2112 sql_help.c:2416 sql_help.c:2625 sql_help.c:3370 +#: sql_help.c:3373 sql_help.c:3376 sql_help.c:3467 sql_help.c:3556 +#: sql_help.c:3584 sql_help.c:4507 sql_help.c:4514 sql_help.c:4520 +#: sql_help.c:4531 sql_help.c:4534 sql_help.c:4537 msgid "argname" msgstr "имÑ_аргумента" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355 -#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 -#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 -#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 -#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 -#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 -#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597 -#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 -#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 -#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:352 sql_help.c:365 +#: sql_help.c:369 sql_help.c:385 sql_help.c:388 sql_help.c:391 sql_help.c:532 +#: sql_help.c:537 sql_help.c:542 sql_help.c:547 sql_help.c:552 sql_help.c:868 +#: sql_help.c:873 sql_help.c:878 sql_help.c:883 sql_help.c:888 sql_help.c:1018 +#: sql_help.c:1023 sql_help.c:1028 sql_help.c:1033 sql_help.c:1038 +#: sql_help.c:1883 sql_help.c:1900 sql_help.c:1906 sql_help.c:1930 +#: sql_help.c:1933 sql_help.c:1936 sql_help.c:2417 sql_help.c:2626 +#: sql_help.c:3371 sql_help.c:3374 sql_help.c:3377 sql_help.c:3468 +#: sql_help.c:3557 sql_help.c:3585 sql_help.c:4508 sql_help.c:4515 +#: sql_help.c:4521 sql_help.c:4532 sql_help.c:4535 sql_help.c:4538 msgid "argtype" msgstr "тип_аргумента" -#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 -#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666 -#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974 -#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 -#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 -#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 -#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956 +#: sql_help.c:114 sql_help.c:407 sql_help.c:484 sql_help.c:496 sql_help.c:965 +#: sql_help.c:1116 sql_help.c:1526 sql_help.c:1655 sql_help.c:1687 +#: sql_help.c:1739 sql_help.c:1798 sql_help.c:1987 sql_help.c:1994 +#: sql_help.c:2306 sql_help.c:2356 sql_help.c:2363 sql_help.c:2372 +#: sql_help.c:2461 sql_help.c:2686 sql_help.c:2777 sql_help.c:3068 +#: sql_help.c:3253 sql_help.c:3275 sql_help.c:3415 sql_help.c:3772 +#: sql_help.c:3980 sql_help.c:4226 sql_help.c:4228 sql_help.c:5006 msgid "option" msgstr "параметр" -#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 -#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 +#: sql_help.c:115 sql_help.c:966 sql_help.c:1656 sql_help.c:2462 +#: sql_help.c:2687 sql_help.c:3254 sql_help.c:3416 msgid "where option can be:" msgstr "где допуÑтимые параметры:" -#: sql_help.c:116 sql_help.c:2209 +#: sql_help.c:116 sql_help.c:2238 msgid "allowconn" msgstr "разр_подключениÑ" -#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 -#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 +#: sql_help.c:117 sql_help.c:967 sql_help.c:1657 sql_help.c:2239 +#: sql_help.c:2463 sql_help.c:2688 sql_help.c:3255 msgid "connlimit" msgstr "предел_подключений" -#: sql_help.c:118 sql_help.c:2211 +#: sql_help.c:118 sql_help.c:2240 msgid "istemplate" msgstr "Ñто_шаблон" -#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322 -#: sql_help.c:1374 sql_help.c:4187 +#: sql_help.c:124 sql_help.c:621 sql_help.c:689 sql_help.c:703 sql_help.c:1338 +#: sql_help.c:1392 sql_help.c:4232 msgid "new_tablespace" msgstr "новое_табл_проÑтранÑтво" -#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550 -#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 -#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 -#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643 -#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601 -#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:558 sql_help.c:560 +#: sql_help.c:561 sql_help.c:891 sql_help.c:893 sql_help.c:894 sql_help.c:974 +#: sql_help.c:978 sql_help.c:981 sql_help.c:1043 sql_help.c:1045 +#: sql_help.c:1046 sql_help.c:1196 sql_help.c:1198 sql_help.c:1664 +#: sql_help.c:1668 sql_help.c:1671 sql_help.c:2427 sql_help.c:2630 +#: sql_help.c:3948 sql_help.c:4250 sql_help.c:4411 sql_help.c:4721 msgid "configuration_parameter" msgstr "параметр_конфигурации" -#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487 -#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876 -#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101 -#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157 -#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182 -#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449 -#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667 -#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 -#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 -#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 -#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 -#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 -#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676 -#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679 +#: sql_help.c:128 sql_help.c:408 sql_help.c:479 sql_help.c:485 sql_help.c:497 +#: sql_help.c:559 sql_help.c:613 sql_help.c:695 sql_help.c:705 sql_help.c:892 +#: sql_help.c:920 sql_help.c:975 sql_help.c:1044 sql_help.c:1117 +#: sql_help.c:1162 sql_help.c:1166 sql_help.c:1170 sql_help.c:1173 +#: sql_help.c:1178 sql_help.c:1181 sql_help.c:1197 sql_help.c:1371 +#: sql_help.c:1394 sql_help.c:1442 sql_help.c:1450 sql_help.c:1470 +#: sql_help.c:1527 sql_help.c:1611 sql_help.c:1665 sql_help.c:1688 +#: sql_help.c:2307 sql_help.c:2357 sql_help.c:2364 sql_help.c:2373 +#: sql_help.c:2428 sql_help.c:2429 sql_help.c:2493 sql_help.c:2496 +#: sql_help.c:2530 sql_help.c:2631 sql_help.c:2632 sql_help.c:2655 +#: sql_help.c:2778 sql_help.c:2817 sql_help.c:2927 sql_help.c:2940 +#: sql_help.c:2954 sql_help.c:2995 sql_help.c:3003 sql_help.c:3025 +#: sql_help.c:3042 sql_help.c:3069 sql_help.c:3276 sql_help.c:3981 +#: sql_help.c:4722 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 msgid "value" msgstr "значение" -#: sql_help.c:200 +#: sql_help.c:202 msgid "target_role" msgstr "целеваÑ_роль" -#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 -#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 -#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 -#: sql_help.c:4357 sql_help.c:4369 +#: sql_help.c:203 sql_help.c:929 sql_help.c:2291 sql_help.c:2660 +#: sql_help.c:2733 sql_help.c:2738 sql_help.c:3911 sql_help.c:3920 +#: sql_help.c:3939 sql_help.c:3951 sql_help.c:4374 sql_help.c:4383 +#: sql_help.c:4402 sql_help.c:4414 msgid "schema_name" msgstr "имÑ_Ñхемы" -#: sql_help.c:202 +#: sql_help.c:204 msgid "abbreviated_grant_or_revoke" msgstr "предложение_GRANT_или_REVOKE" -#: sql_help.c:203 +#: sql_help.c:205 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "где допуÑтимое предложение_GRANT_или_REVOKE:" -#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 -#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 -#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 -#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438 -#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 -#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 -#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 -#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 -#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697 +#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 +#: sql_help.c:211 sql_help.c:212 sql_help.c:213 sql_help.c:214 sql_help.c:215 +#: sql_help.c:584 sql_help.c:620 sql_help.c:688 sql_help.c:838 sql_help.c:985 +#: sql_help.c:1337 sql_help.c:1675 sql_help.c:2466 sql_help.c:2467 +#: sql_help.c:2468 sql_help.c:2469 sql_help.c:2470 sql_help.c:2604 +#: sql_help.c:2691 sql_help.c:2692 sql_help.c:2693 sql_help.c:3258 +#: sql_help.c:3259 sql_help.c:3260 sql_help.c:3261 sql_help.c:3262 +#: sql_help.c:3960 sql_help.c:3964 sql_help.c:4423 sql_help.c:4427 +#: sql_help.c:4743 msgid "role_name" msgstr "имÑ_роли" -#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 -#: sql_help.c:1339 sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 -#: sql_help.c:1684 sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 -#: sql_help.c:2352 sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 -#: sql_help.c:2774 sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 -#: sql_help.c:2924 sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 -#: sql_help.c:3981 sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 -#: sql_help.c:4088 sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 -#: sql_help.c:4558 sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 -#: sql_help.c:4608 sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 -#: sql_help.c:4651 sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 -#: sql_help.c:4806 sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 -#: sql_help.c:4864 sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 -#: sql_help.c:4921 sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 -#: sql_help.c:5044 sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 -#: sql_help.c:5102 sql_help.c:5103 sql_help.c:5104 sql_help.c:5105 +#: sql_help.c:246 sql_help.c:265 sql_help.c:472 sql_help.c:928 sql_help.c:1353 +#: sql_help.c:1355 sql_help.c:1359 sql_help.c:1409 sql_help.c:1421 +#: sql_help.c:1446 sql_help.c:1705 sql_help.c:2260 sql_help.c:2264 +#: sql_help.c:2376 sql_help.c:2381 sql_help.c:2489 sql_help.c:2659 +#: sql_help.c:2794 sql_help.c:2799 sql_help.c:2801 sql_help.c:2922 +#: sql_help.c:2935 sql_help.c:2949 sql_help.c:2958 sql_help.c:2970 +#: sql_help.c:2999 sql_help.c:4012 sql_help.c:4027 sql_help.c:4029 +#: sql_help.c:4125 sql_help.c:4128 sql_help.c:4130 sql_help.c:4593 +#: sql_help.c:4594 sql_help.c:4603 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4652 sql_help.c:4653 sql_help.c:4654 sql_help.c:4655 +#: sql_help.c:4696 sql_help.c:4697 sql_help.c:4702 sql_help.c:4707 +#: sql_help.c:4851 sql_help.c:4852 sql_help.c:4861 sql_help.c:4908 +#: sql_help.c:4909 sql_help.c:4910 sql_help.c:4911 sql_help.c:4912 +#: sql_help.c:4913 sql_help.c:4968 sql_help.c:4970 sql_help.c:5036 +#: sql_help.c:5096 sql_help.c:5097 sql_help.c:5106 sql_help.c:5153 +#: sql_help.c:5154 sql_help.c:5155 sql_help.c:5156 sql_help.c:5157 +#: sql_help.c:5158 msgid "expression" msgstr "выражение" -#: sql_help.c:242 +#: sql_help.c:249 sql_help.c:2261 msgid "domain_constraint" msgstr "ограничение_домена" -#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 -#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363 -#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852 -#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351 -#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 +#: sql_help.c:251 sql_help.c:253 sql_help.c:256 sql_help.c:264 sql_help.c:487 +#: sql_help.c:488 sql_help.c:1330 sql_help.c:1379 sql_help.c:1380 +#: sql_help.c:1381 sql_help.c:1408 sql_help.c:1420 sql_help.c:1437 +#: sql_help.c:1869 sql_help.c:1871 sql_help.c:2263 sql_help.c:2375 +#: sql_help.c:2380 sql_help.c:2957 sql_help.c:2969 sql_help.c:4024 msgid "constraint_name" msgstr "имÑ_ограничениÑ" -#: sql_help.c:247 sql_help.c:1315 +#: sql_help.c:254 sql_help.c:1331 msgid "new_constraint_name" msgstr "имÑ_нового_ограничениÑ" -#: sql_help.c:320 sql_help.c:1099 +#: sql_help.c:263 sql_help.c:2262 +msgid "where domain_constraint is:" +msgstr "где ограничение_домена может быть Ñледующим:" + +#: sql_help.c:330 sql_help.c:1115 msgid "new_version" msgstr "новаÑ_верÑиÑ" -#: sql_help.c:324 sql_help.c:326 +#: sql_help.c:334 sql_help.c:336 msgid "member_object" msgstr "Ñлемент_объект" -#: sql_help.c:327 +#: sql_help.c:337 msgid "where member_object is:" msgstr "где Ñлемент_объект:" -#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 -#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 -#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 -#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 -#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856 -#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 -#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869 -#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884 -#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894 -#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898 -#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 -#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456 -#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 -#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 -#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 -#: sql_help.c:4482 +#: sql_help.c:338 sql_help.c:343 sql_help.c:344 sql_help.c:345 sql_help.c:346 +#: sql_help.c:347 sql_help.c:348 sql_help.c:353 sql_help.c:357 sql_help.c:359 +#: sql_help.c:361 sql_help.c:370 sql_help.c:371 sql_help.c:372 sql_help.c:373 +#: sql_help.c:374 sql_help.c:375 sql_help.c:376 sql_help.c:377 sql_help.c:380 +#: sql_help.c:381 sql_help.c:1861 sql_help.c:1866 sql_help.c:1873 +#: sql_help.c:1874 sql_help.c:1875 sql_help.c:1876 sql_help.c:1877 +#: sql_help.c:1878 sql_help.c:1879 sql_help.c:1884 sql_help.c:1886 +#: sql_help.c:1890 sql_help.c:1892 sql_help.c:1896 sql_help.c:1901 +#: sql_help.c:1902 sql_help.c:1909 sql_help.c:1910 sql_help.c:1911 +#: sql_help.c:1912 sql_help.c:1913 sql_help.c:1914 sql_help.c:1915 +#: sql_help.c:1916 sql_help.c:1917 sql_help.c:1918 sql_help.c:1919 +#: sql_help.c:1924 sql_help.c:1925 sql_help.c:4496 sql_help.c:4501 +#: sql_help.c:4502 sql_help.c:4503 sql_help.c:4504 sql_help.c:4510 +#: sql_help.c:4511 sql_help.c:4516 sql_help.c:4517 sql_help.c:4522 +#: sql_help.c:4523 sql_help.c:4524 sql_help.c:4525 sql_help.c:4526 +#: sql_help.c:4527 msgid "object_name" msgstr "имÑ_объекта" # well-spelled: агр -#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454 +#: sql_help.c:339 sql_help.c:1862 sql_help.c:4499 msgid "aggregate_name" msgstr "имÑ_агр_функции" -#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 -#: sql_help.c:2137 sql_help.c:3357 +#: sql_help.c:341 sql_help.c:1864 sql_help.c:2154 sql_help.c:2158 +#: sql_help.c:2160 sql_help.c:3385 msgid "source_type" msgstr "иÑходный_тип" -#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 -#: sql_help.c:2138 sql_help.c:3358 +#: sql_help.c:342 sql_help.c:1865 sql_help.c:2155 sql_help.c:2159 +#: sql_help.c:2161 sql_help.c:3386 msgid "target_type" msgstr "целевой_тип" -#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 -#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 -#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577 -#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834 -#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072 -#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 +#: sql_help.c:349 sql_help.c:802 sql_help.c:1880 sql_help.c:2156 +#: sql_help.c:2199 sql_help.c:2279 sql_help.c:2547 sql_help.c:2578 +#: sql_help.c:3145 sql_help.c:4398 sql_help.c:4505 sql_help.c:4622 +#: sql_help.c:4626 sql_help.c:4630 sql_help.c:4633 sql_help.c:4880 +#: sql_help.c:4884 sql_help.c:4888 sql_help.c:4891 sql_help.c:5125 +#: sql_help.c:5129 sql_help.c:5133 sql_help.c:5136 msgid "function_name" msgstr "имÑ_функции" -#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 +#: sql_help.c:354 sql_help.c:795 sql_help.c:1887 sql_help.c:2571 msgid "operator_name" msgstr "имÑ_оператора" -#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 -#: sql_help.c:2519 sql_help.c:3481 +#: sql_help.c:355 sql_help.c:729 sql_help.c:733 sql_help.c:737 sql_help.c:1888 +#: sql_help.c:2548 sql_help.c:3509 msgid "left_type" msgstr "тип_Ñлева" -#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 -#: sql_help.c:2520 sql_help.c:3482 +#: sql_help.c:356 sql_help.c:730 sql_help.c:734 sql_help.c:738 sql_help.c:1889 +#: sql_help.c:2549 sql_help.c:3510 msgid "right_type" msgstr "тип_Ñправа" -#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 -#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 -#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539 -#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 +#: sql_help.c:358 sql_help.c:360 sql_help.c:758 sql_help.c:761 sql_help.c:764 +#: sql_help.c:793 sql_help.c:805 sql_help.c:813 sql_help.c:816 sql_help.c:819 +#: sql_help.c:1426 sql_help.c:1891 sql_help.c:1893 sql_help.c:2568 +#: sql_help.c:2589 sql_help.c:2975 sql_help.c:3519 sql_help.c:3528 msgid "index_method" msgstr "метод_индекÑа" -#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467 +#: sql_help.c:362 sql_help.c:1897 sql_help.c:4512 msgid "procedure_name" msgstr "имÑ_процедуры" -#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473 +#: sql_help.c:366 sql_help.c:1903 sql_help.c:3935 sql_help.c:4518 msgid "routine_name" msgstr "имÑ_подпрограммы" -#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 -#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 -#: sql_help.c:3926 sql_help.c:4375 +#: sql_help.c:378 sql_help.c:1398 sql_help.c:1920 sql_help.c:2423 +#: sql_help.c:2629 sql_help.c:2930 sql_help.c:3112 sql_help.c:3690 +#: sql_help.c:3957 sql_help.c:4420 msgid "type_name" msgstr "имÑ_типа" -#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 -#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 -#: sql_help.c:4360 +#: sql_help.c:379 sql_help.c:1921 sql_help.c:2422 sql_help.c:2628 +#: sql_help.c:3113 sql_help.c:3343 sql_help.c:3691 sql_help.c:3942 +#: sql_help.c:4405 msgid "lang_name" msgstr "имÑ_Ñзыка" -#: sql_help.c:372 +#: sql_help.c:382 msgid "and aggregate_signature is:" msgstr "и Ñигнатура_агр_функции:" -#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 +#: sql_help.c:405 sql_help.c:2021 sql_help.c:2304 msgid "handler_function" msgstr "функциÑ_обработчик" -#: sql_help.c:396 sql_help.c:2276 +#: sql_help.c:406 sql_help.c:2305 msgid "validator_function" msgstr "функциÑ_проверки" -#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 -#: sql_help.c:1309 sql_help.c:1581 +#: sql_help.c:454 sql_help.c:533 sql_help.c:677 sql_help.c:869 sql_help.c:1019 +#: sql_help.c:1325 sql_help.c:1602 msgid "action" msgstr "дейÑтвие" -#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461 -#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470 -#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683 -#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080 -#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334 -#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 -#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349 -#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 -#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422 -#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683 -#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851 -#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984 -#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 -#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 -#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 -#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 -#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 -#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 -#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 -#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 -#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 -#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614 -#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877 -#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924 -#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117 +#: sql_help.c:456 sql_help.c:463 sql_help.c:467 sql_help.c:468 sql_help.c:471 +#: sql_help.c:473 sql_help.c:474 sql_help.c:475 sql_help.c:477 sql_help.c:480 +#: sql_help.c:482 sql_help.c:483 sql_help.c:681 sql_help.c:691 sql_help.c:693 +#: sql_help.c:696 sql_help.c:698 sql_help.c:699 sql_help.c:927 sql_help.c:1096 +#: sql_help.c:1327 sql_help.c:1345 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 sql_help.c:1358 +#: sql_help.c:1360 sql_help.c:1361 sql_help.c:1363 sql_help.c:1366 +#: sql_help.c:1367 sql_help.c:1369 sql_help.c:1372 sql_help.c:1374 +#: sql_help.c:1375 sql_help.c:1422 sql_help.c:1424 sql_help.c:1431 +#: sql_help.c:1440 sql_help.c:1445 sql_help.c:1452 sql_help.c:1453 +#: sql_help.c:1704 sql_help.c:1707 sql_help.c:1711 sql_help.c:1747 +#: sql_help.c:1868 sql_help.c:1984 sql_help.c:1990 sql_help.c:2004 +#: sql_help.c:2005 sql_help.c:2006 sql_help.c:2354 sql_help.c:2367 +#: sql_help.c:2420 sql_help.c:2488 sql_help.c:2494 sql_help.c:2527 +#: sql_help.c:2658 sql_help.c:2763 sql_help.c:2798 sql_help.c:2800 +#: sql_help.c:2912 sql_help.c:2921 sql_help.c:2931 sql_help.c:2934 +#: sql_help.c:2944 sql_help.c:2948 sql_help.c:2971 sql_help.c:2973 +#: sql_help.c:2980 sql_help.c:2993 sql_help.c:2998 sql_help.c:3005 +#: sql_help.c:3006 sql_help.c:3022 sql_help.c:3148 sql_help.c:3288 +#: sql_help.c:3914 sql_help.c:3915 sql_help.c:4011 sql_help.c:4026 +#: sql_help.c:4028 sql_help.c:4030 sql_help.c:4124 sql_help.c:4127 +#: sql_help.c:4129 sql_help.c:4131 sql_help.c:4377 sql_help.c:4378 +#: sql_help.c:4498 sql_help.c:4659 sql_help.c:4666 sql_help.c:4668 +#: sql_help.c:4917 sql_help.c:4924 sql_help.c:4926 sql_help.c:4967 +#: sql_help.c:4969 sql_help.c:4971 sql_help.c:5024 sql_help.c:5162 +#: sql_help.c:5169 sql_help.c:5171 msgid "column_name" msgstr "имÑ_Ñтолбца" -#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 +#: sql_help.c:457 sql_help.c:682 sql_help.c:1328 sql_help.c:1712 msgid "new_column_name" msgstr "новое_имÑ_Ñтолбца" -#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 -#: sql_help.c:1328 sql_help.c:1591 +#: sql_help.c:462 sql_help.c:554 sql_help.c:690 sql_help.c:890 sql_help.c:1040 +#: sql_help.c:1344 sql_help.c:1612 msgid "where action is one of:" msgstr "где допуÑтимое дейÑтвие:" -#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330 -#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229 -#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 -#: sql_help.c:3167 sql_help.c:4141 +#: sql_help.c:464 sql_help.c:469 sql_help.c:1088 sql_help.c:1346 +#: sql_help.c:1351 sql_help.c:1614 sql_help.c:1618 sql_help.c:2258 +#: sql_help.c:2355 sql_help.c:2567 sql_help.c:2756 sql_help.c:2913 +#: sql_help.c:3195 sql_help.c:4183 msgid "data_type" msgstr "тип_данных" -#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336 -#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329 -#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 -#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 +#: sql_help.c:465 sql_help.c:470 sql_help.c:1347 sql_help.c:1352 +#: sql_help.c:1447 sql_help.c:1615 sql_help.c:1619 sql_help.c:2259 +#: sql_help.c:2358 sql_help.c:2490 sql_help.c:2915 sql_help.c:2923 +#: sql_help.c:2936 sql_help.c:2950 sql_help.c:3000 sql_help.c:3196 +#: sql_help.c:3202 sql_help.c:4021 msgid "collation" msgstr "правило_Ñортировки" -#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 -#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 +#: sql_help.c:466 sql_help.c:1348 sql_help.c:2359 sql_help.c:2368 +#: sql_help.c:2916 sql_help.c:2932 sql_help.c:2945 msgid "column_constraint" msgstr "ограничение_Ñтолбца" -#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968 +#: sql_help.c:476 sql_help.c:618 sql_help.c:692 sql_help.c:1368 sql_help.c:5018 msgid "integer" msgstr "целое" -#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352 -#: sql_help.c:1355 +#: sql_help.c:478 sql_help.c:481 sql_help.c:694 sql_help.c:697 sql_help.c:1370 +#: sql_help.c:1373 msgid "attribute_option" msgstr "атрибут" -#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 -#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 +#: sql_help.c:486 sql_help.c:1377 sql_help.c:2360 sql_help.c:2369 +#: sql_help.c:2917 sql_help.c:2933 sql_help.c:2946 msgid "table_constraint" msgstr "ограничение_таблицы" -#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364 -#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905 +#: sql_help.c:489 sql_help.c:490 sql_help.c:491 sql_help.c:492 sql_help.c:1382 +#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:1922 msgid "trigger_name" msgstr "имÑ_триггера" -#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 -#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 +#: sql_help.c:493 sql_help.c:494 sql_help.c:1396 sql_help.c:1397 +#: sql_help.c:2361 sql_help.c:2366 sql_help.c:2920 sql_help.c:2943 msgid "parent_table" msgstr "таблица_родитель" -#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 -#: sql_help.c:1550 sql_help.c:2261 +#: sql_help.c:553 sql_help.c:610 sql_help.c:679 sql_help.c:889 sql_help.c:1039 +#: sql_help.c:1571 sql_help.c:2290 msgid "extension_name" msgstr "имÑ_раÑширениÑ" -#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 +#: sql_help.c:555 sql_help.c:1041 sql_help.c:2424 msgid "execution_cost" msgstr "ÑтоимоÑть_выполнениÑ" -#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 +#: sql_help.c:556 sql_help.c:1042 sql_help.c:2425 msgid "result_rows" msgstr "Ñтрок_в_результате" -#: sql_help.c:547 sql_help.c:2397 +#: sql_help.c:557 sql_help.c:2426 msgid "support_function" msgstr "вÑпомогательнаÑ_функциÑ" -#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 -#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641 -#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709 -#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 -#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 -#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896 -#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902 -#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912 -#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 -#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 -#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 -#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 -#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 -#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348 -#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358 -#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 -#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 -#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 -#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 +#: sql_help.c:579 sql_help.c:581 sql_help.c:964 sql_help.c:972 sql_help.c:976 +#: sql_help.c:979 sql_help.c:982 sql_help.c:1654 sql_help.c:1662 +#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1672 sql_help.c:2734 +#: sql_help.c:2736 sql_help.c:2739 sql_help.c:2740 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3917 sql_help.c:3918 sql_help.c:3921 +#: sql_help.c:3922 sql_help.c:3924 sql_help.c:3925 sql_help.c:3927 +#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3931 sql_help.c:3933 +#: sql_help.c:3934 sql_help.c:3940 sql_help.c:3941 sql_help.c:3943 +#: sql_help.c:3944 sql_help.c:3946 sql_help.c:3947 sql_help.c:3949 +#: sql_help.c:3950 sql_help.c:3952 sql_help.c:3953 sql_help.c:3955 +#: sql_help.c:3956 sql_help.c:3958 sql_help.c:3959 sql_help.c:3961 +#: sql_help.c:3962 sql_help.c:4375 sql_help.c:4376 sql_help.c:4380 +#: sql_help.c:4381 sql_help.c:4384 sql_help.c:4385 sql_help.c:4387 +#: sql_help.c:4388 sql_help.c:4390 sql_help.c:4391 sql_help.c:4393 +#: sql_help.c:4394 sql_help.c:4396 sql_help.c:4397 sql_help.c:4403 +#: sql_help.c:4404 sql_help.c:4406 sql_help.c:4407 sql_help.c:4409 +#: sql_help.c:4410 sql_help.c:4412 sql_help.c:4413 sql_help.c:4415 +#: sql_help.c:4416 sql_help.c:4418 sql_help.c:4419 sql_help.c:4421 +#: sql_help.c:4422 sql_help.c:4424 sql_help.c:4425 msgid "role_specification" msgstr "указание_роли" -#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 -#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707 +#: sql_help.c:580 sql_help.c:582 sql_help.c:1685 sql_help.c:2225 +#: sql_help.c:2742 sql_help.c:3273 sql_help.c:3724 sql_help.c:4753 msgid "user_name" msgstr "имÑ_пользователÑ" -#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 -#: sql_help.c:3932 sql_help.c:4381 +#: sql_help.c:583 sql_help.c:984 sql_help.c:1674 sql_help.c:2741 +#: sql_help.c:3963 sql_help.c:4426 msgid "where role_specification can be:" msgstr "где допуÑтимое указание_роли:" -#: sql_help.c:575 +#: sql_help.c:585 msgid "group_name" msgstr "имÑ_группы" -#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 -#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 -#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 -#: sql_help.c:4372 +#: sql_help.c:606 sql_help.c:1443 sql_help.c:2237 sql_help.c:2497 +#: sql_help.c:2531 sql_help.c:2928 sql_help.c:2941 sql_help.c:2955 +#: sql_help.c:2996 sql_help.c:3026 sql_help.c:3038 sql_help.c:3954 +#: sql_help.c:4417 msgid "tablespace_name" msgstr "табл_проÑтранÑтво" -#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382 -#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783 +#: sql_help.c:608 sql_help.c:701 sql_help.c:1390 sql_help.c:1400 +#: sql_help.c:1438 sql_help.c:1800 msgid "index_name" msgstr "имÑ_индекÑа" -#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375 -#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500 -#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 -#: sql_help.c:2996 +#: sql_help.c:612 sql_help.c:615 sql_help.c:704 sql_help.c:706 sql_help.c:1393 +#: sql_help.c:1395 sql_help.c:1441 sql_help.c:2495 sql_help.c:2529 +#: sql_help.c:2926 sql_help.c:2939 sql_help.c:2953 sql_help.c:2994 +#: sql_help.c:3024 msgid "storage_parameter" msgstr "параметр_хранениÑ" -#: sql_help.c:607 +#: sql_help.c:617 msgid "column_number" msgstr "номер_Ñтолбца" -#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464 +#: sql_help.c:641 sql_help.c:1885 sql_help.c:4509 msgid "large_object_oid" msgstr "oid_большого_объекта" -#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 +#: sql_help.c:700 sql_help.c:1376 sql_help.c:2914 msgid "compression_method" msgstr "метод_ÑжатиÑ" -#: sql_help.c:692 sql_help.c:1373 +#: sql_help.c:702 sql_help.c:1391 msgid "new_access_method" msgstr "новый_метод_доÑтупа" -#: sql_help.c:725 sql_help.c:2523 +#: sql_help.c:739 sql_help.c:2552 msgid "res_proc" msgstr "процедура_ограничениÑ" -#: sql_help.c:726 sql_help.c:2524 +#: sql_help.c:740 sql_help.c:2553 msgid "join_proc" msgstr "процедура_ÑоединениÑ" -#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 +#: sql_help.c:741 sql_help.c:2550 +msgid "com_op" +msgstr "коммут_оператор" + +#: sql_help.c:742 sql_help.c:2551 +msgid "neg_op" +msgstr "обратный_оператор" + +#: sql_help.c:794 sql_help.c:806 sql_help.c:2570 msgid "strategy_number" msgstr "номер_Ñтратегии" -#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 -#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 -#: sql_help.c:2544 sql_help.c:2547 sql_help.c:2548 +#: sql_help.c:796 sql_help.c:797 sql_help.c:800 sql_help.c:801 sql_help.c:807 +#: sql_help.c:808 sql_help.c:810 sql_help.c:811 sql_help.c:2572 sql_help.c:2573 +#: sql_help.c:2576 sql_help.c:2577 msgid "op_type" msgstr "тип_операции" -#: sql_help.c:782 sql_help.c:2545 +#: sql_help.c:798 sql_help.c:2574 msgid "sort_family_name" msgstr "ÑемейÑтво_Ñортировки" -#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 +#: sql_help.c:799 sql_help.c:809 sql_help.c:2575 msgid "support_number" msgstr "номер_опорной_процедуры" -#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 -#: sql_help.c:3089 +#: sql_help.c:803 sql_help.c:2157 sql_help.c:2579 sql_help.c:3115 +#: sql_help.c:3117 msgid "argument_type" msgstr "тип_аргумента" -#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 -#: sql_help.c:1079 sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 -#: sql_help.c:1779 sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 -#: sql_help.c:1891 sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 -#: sql_help.c:2324 sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 -#: sql_help.c:2574 sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 -#: sql_help.c:2770 sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 -#: sql_help.c:2917 sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 -#: sql_help.c:3517 sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 -#: sql_help.c:3885 sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 -#: sql_help.c:4334 sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 -#: sql_help.c:4627 sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 -#: sql_help.c:4884 sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 -#: sql_help.c:5060 sql_help.c:5122 +#: sql_help.c:834 sql_help.c:837 sql_help.c:926 sql_help.c:1055 sql_help.c:1095 +#: sql_help.c:1567 sql_help.c:1570 sql_help.c:1746 sql_help.c:1799 +#: sql_help.c:1870 sql_help.c:1895 sql_help.c:1908 sql_help.c:1923 +#: sql_help.c:1983 sql_help.c:1989 sql_help.c:2353 sql_help.c:2365 +#: sql_help.c:2486 sql_help.c:2526 sql_help.c:2603 sql_help.c:2657 +#: sql_help.c:2710 sql_help.c:2762 sql_help.c:2795 sql_help.c:2802 +#: sql_help.c:2911 sql_help.c:2929 sql_help.c:2942 sql_help.c:3021 +#: sql_help.c:3141 sql_help.c:3322 sql_help.c:3545 sql_help.c:3594 +#: sql_help.c:3700 sql_help.c:3910 sql_help.c:3916 sql_help.c:3977 +#: sql_help.c:4009 sql_help.c:4373 sql_help.c:4379 sql_help.c:4497 +#: sql_help.c:4610 sql_help.c:4673 sql_help.c:4712 sql_help.c:4868 +#: sql_help.c:4931 sql_help.c:4965 sql_help.c:5023 sql_help.c:5113 +#: sql_help.c:5176 msgid "table_name" msgstr "имÑ_таблицы" -#: sql_help.c:823 sql_help.c:2576 +#: sql_help.c:839 sql_help.c:2605 msgid "using_expression" msgstr "выражение_иÑпользованиÑ" -#: sql_help.c:824 sql_help.c:2577 +#: sql_help.c:840 sql_help.c:2606 msgid "check_expression" msgstr "выражение_проверки" -#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +#: sql_help.c:913 sql_help.c:915 sql_help.c:917 sql_help.c:2653 msgid "publication_object" msgstr "объект_публикации" -#: sql_help.c:903 sql_help.c:2625 +#: sql_help.c:919 sql_help.c:2654 msgid "publication_parameter" msgstr "параметр_публикации" -#: sql_help.c:909 sql_help.c:2627 +#: sql_help.c:925 sql_help.c:2656 msgid "where publication_object is one of:" msgstr "где объект_публикации:" -#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 -#: sql_help.c:3228 +#: sql_help.c:968 sql_help.c:1658 sql_help.c:2464 sql_help.c:2689 +#: sql_help.c:3256 msgid "password" msgstr "пароль" -#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 -#: sql_help.c:3229 +#: sql_help.c:969 sql_help.c:1659 sql_help.c:2465 sql_help.c:2690 +#: sql_help.c:3257 msgid "timestamp" msgstr "timestamp" -#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642 -#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892 -#: sql_help.c:4341 +#: sql_help.c:973 sql_help.c:977 sql_help.c:980 sql_help.c:983 sql_help.c:1663 +#: sql_help.c:1667 sql_help.c:1670 sql_help.c:1673 sql_help.c:3923 +#: sql_help.c:4386 msgid "database_name" msgstr "имÑ_БД" -#: sql_help.c:1073 sql_help.c:2732 +#: sql_help.c:1089 sql_help.c:2757 msgid "increment" msgstr "шаг" -#: sql_help.c:1074 sql_help.c:2733 +#: sql_help.c:1090 sql_help.c:2758 msgid "minvalue" msgstr "мин_значение" -#: sql_help.c:1075 sql_help.c:2734 +#: sql_help.c:1091 sql_help.c:2759 msgid "maxvalue" msgstr "макÑ_значение" -#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664 -#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 +#: sql_help.c:1092 sql_help.c:2760 sql_help.c:4606 sql_help.c:4710 +#: sql_help.c:4864 sql_help.c:5040 sql_help.c:5109 msgid "start" msgstr "начальное_значение" -#: sql_help.c:1077 sql_help.c:1347 +#: sql_help.c:1093 sql_help.c:1365 msgid "restart" msgstr "значение_перезапуÑка" -#: sql_help.c:1078 sql_help.c:2736 +#: sql_help.c:1094 sql_help.c:2761 msgid "cache" msgstr "кеш" -#: sql_help.c:1123 +#: sql_help.c:1139 msgid "new_target" msgstr "новое_имÑ" -#: sql_help.c:1142 sql_help.c:2789 +#: sql_help.c:1158 sql_help.c:2814 msgid "conninfo" msgstr "Ñтрока_подключениÑ" -#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 +#: sql_help.c:1160 sql_help.c:1164 sql_help.c:1168 sql_help.c:2815 msgid "publication_name" msgstr "имÑ_публикации" -#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +#: sql_help.c:1161 sql_help.c:1165 sql_help.c:1169 msgid "publication_option" msgstr "параметр_публикации" -#: sql_help.c:1156 +#: sql_help.c:1172 msgid "refresh_option" msgstr "параметр_обновлениÑ" -#: sql_help.c:1161 sql_help.c:2791 +#: sql_help.c:1177 sql_help.c:2816 msgid "subscription_parameter" msgstr "параметр_подпиÑки" -#: sql_help.c:1164 +#: sql_help.c:1180 msgid "skip_option" msgstr "параметр_пропуÑка" -#: sql_help.c:1324 sql_help.c:1327 +#: sql_help.c:1340 sql_help.c:1343 msgid "partition_name" msgstr "имÑ_Ñекции" -#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 +#: sql_help.c:1341 sql_help.c:2370 sql_help.c:2947 msgid "partition_bound_spec" msgstr "указание_границ_Ñекции" -#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 +#: sql_help.c:1362 sql_help.c:1412 sql_help.c:2961 msgid "sequence_options" msgstr "параметры_поÑледовательноÑти" -#: sql_help.c:1346 +#: sql_help.c:1364 msgid "sequence_option" msgstr "параметр_поÑледовательноÑти" -#: sql_help.c:1360 +#: sql_help.c:1378 msgid "table_constraint_using_index" msgstr "ограничение_таблицы_Ñ_индекÑом" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 +#: sql_help.c:1386 sql_help.c:1387 sql_help.c:1388 sql_help.c:1389 msgid "rewrite_rule_name" msgstr "имÑ_правила_перезапиÑи" -#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 +#: sql_help.c:1401 sql_help.c:2382 sql_help.c:2986 msgid "and partition_bound_spec is:" msgstr "и указание_границ_Ñекции:" -#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 -#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 -#: sql_help.c:2964 +#: sql_help.c:1402 sql_help.c:1403 sql_help.c:1404 sql_help.c:2383 +#: sql_help.c:2384 sql_help.c:2385 sql_help.c:2987 sql_help.c:2988 +#: sql_help.c:2989 msgid "partition_bound_expr" msgstr "выражение_границ_Ñекции" -#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 -#: sql_help.c:2965 sql_help.c:2966 +#: sql_help.c:1405 sql_help.c:1406 sql_help.c:2386 sql_help.c:2387 +#: sql_help.c:2990 sql_help.c:2991 msgid "numeric_literal" msgstr "чиÑловаÑ_конÑтанта" -#: sql_help.c:1389 +#: sql_help.c:1407 msgid "and column_constraint is:" msgstr "и ограничение_Ñтолбца:" -#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 -#: sql_help.c:2934 +#: sql_help.c:1410 sql_help.c:2377 sql_help.c:2418 sql_help.c:2627 +#: sql_help.c:2959 msgid "default_expr" msgstr "выражение_по_умолчанию" -#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 +#: sql_help.c:1411 sql_help.c:2378 sql_help.c:2960 msgid "generation_expr" msgstr "генерирующее_выражение" -#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 -#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 -#: sql_help.c:2949 sql_help.c:2953 +#: sql_help.c:1413 sql_help.c:1414 sql_help.c:1423 sql_help.c:1425 +#: sql_help.c:1429 sql_help.c:2962 sql_help.c:2963 sql_help.c:2972 +#: sql_help.c:2974 sql_help.c:2978 msgid "index_parameters" msgstr "параметры_индекÑа" -#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 +#: sql_help.c:1415 sql_help.c:1432 sql_help.c:2964 sql_help.c:2981 msgid "reftable" msgstr "целеваÑ_таблица" -#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 +#: sql_help.c:1416 sql_help.c:1433 sql_help.c:2965 sql_help.c:2982 msgid "refcolumn" msgstr "целевой_Ñтолбец" -#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 -#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 +#: sql_help.c:1417 sql_help.c:1418 sql_help.c:1434 sql_help.c:1435 +#: sql_help.c:2966 sql_help.c:2967 sql_help.c:2983 sql_help.c:2984 msgid "referential_action" msgstr "ÑÑылочное_дейÑтвие" -#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 +#: sql_help.c:1419 sql_help.c:2379 sql_help.c:2968 msgid "and table_constraint is:" msgstr "и ограничение_таблицы:" -#: sql_help.c:1409 sql_help.c:2951 +#: sql_help.c:1427 sql_help.c:2976 msgid "exclude_element" msgstr "объект_иÑключениÑ" -#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662 -#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054 +#: sql_help.c:1428 sql_help.c:2977 sql_help.c:4604 sql_help.c:4708 +#: sql_help.c:4862 sql_help.c:5038 sql_help.c:5107 msgid "operator" msgstr "оператор" -#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 +#: sql_help.c:1430 sql_help.c:2498 sql_help.c:2979 msgid "predicate" msgstr "предикат" -#: sql_help.c:1418 +#: sql_help.c:1436 msgid "and table_constraint_using_index is:" msgstr "и ограничение_таблицы_Ñ_индекÑом:" -#: sql_help.c:1421 sql_help.c:2967 +#: sql_help.c:1439 sql_help.c:2992 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "параметры_индекÑа в ограничениÑÑ… UNIQUE, PRIMARY KEY и EXCLUDE:" -#: sql_help.c:1426 sql_help.c:2972 +#: sql_help.c:1444 sql_help.c:2997 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "объект_иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð² ограничении EXCLUDE:" -#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 -#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 +#: sql_help.c:1448 sql_help.c:2491 sql_help.c:2924 sql_help.c:2937 +#: sql_help.c:2951 sql_help.c:3001 sql_help.c:4022 msgid "opclass" msgstr "клаÑÑ_оператора" -#: sql_help.c:1430 sql_help.c:2976 +#: sql_help.c:1449 sql_help.c:2492 sql_help.c:3002 +msgid "opclass_parameter" +msgstr "параметр_клаÑÑа_оп" + +#: sql_help.c:1451 sql_help.c:3004 msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" msgstr "ÑÑылочное дейÑтвие в ограничении FOREIGN KEY/REFERENCES:" -#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013 +#: sql_help.c:1469 sql_help.c:1472 sql_help.c:3041 msgid "tablespace_option" msgstr "параметр_табл_проÑтранÑтва" -#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 +#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1502 sql_help.c:1506 msgid "token_type" msgstr "тип_фрагмента" -#: sql_help.c:1473 sql_help.c:1476 +#: sql_help.c:1494 sql_help.c:1497 msgid "dictionary_name" msgstr "имÑ_ÑловарÑ" -#: sql_help.c:1478 sql_help.c:1482 +#: sql_help.c:1499 sql_help.c:1503 msgid "old_dictionary" msgstr "Ñтарый_Ñловарь" -#: sql_help.c:1479 sql_help.c:1483 +#: sql_help.c:1500 sql_help.c:1504 msgid "new_dictionary" msgstr "новый_Ñловарь" -#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 -#: sql_help.c:3166 +#: sql_help.c:1599 sql_help.c:1613 sql_help.c:1616 sql_help.c:1617 +#: sql_help.c:3194 msgid "attribute_name" msgstr "имÑ_атрибута" -#: sql_help.c:1579 +#: sql_help.c:1600 msgid "new_attribute_name" msgstr "новое_имÑ_атрибута" -#: sql_help.c:1583 sql_help.c:1587 +#: sql_help.c:1604 sql_help.c:1608 msgid "new_enum_value" msgstr "новое_значение_перечиÑлениÑ" -#: sql_help.c:1584 +#: sql_help.c:1605 msgid "neighbor_enum_value" msgstr "ÑоÑеднее_значение_перечиÑлениÑ" -#: sql_help.c:1586 +#: sql_help.c:1607 msgid "existing_enum_value" msgstr "ÑущеÑтвующее_значение_перечиÑлениÑ" -#: sql_help.c:1589 +#: sql_help.c:1610 msgid "property" msgstr "ÑвойÑтво" -#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 -#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 -#: sql_help.c:4350 +#: sql_help.c:1686 sql_help.c:2362 sql_help.c:2371 sql_help.c:2773 +#: sql_help.c:3274 sql_help.c:3725 sql_help.c:3932 sql_help.c:3978 +#: sql_help.c:4395 msgid "server_name" msgstr "имÑ_Ñервера" -#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 +#: sql_help.c:1718 sql_help.c:1721 sql_help.c:3289 msgid "view_option_name" msgstr "имÑ_параметра_предÑтавлениÑ" -#: sql_help.c:1698 sql_help.c:3262 +#: sql_help.c:1719 sql_help.c:3290 msgid "view_option_value" msgstr "значение_параметра_предÑтавлениÑ" -#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958 +#: sql_help.c:1740 sql_help.c:5007 msgid "table_and_columns" msgstr "таблица_и_Ñтолбцы" -#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 -#: sql_help.c:4185 sql_help.c:4959 +#: sql_help.c:1741 sql_help.c:1801 sql_help.c:1995 sql_help.c:3774 +#: sql_help.c:4230 sql_help.c:5008 msgid "where option can be one of:" msgstr "где допуÑтимый параметр:" -#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 -#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 -#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 -#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 -#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 -#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 +#: sql_help.c:1742 sql_help.c:1743 sql_help.c:1802 sql_help.c:1997 +#: sql_help.c:2001 sql_help.c:2183 sql_help.c:3775 sql_help.c:3776 +#: sql_help.c:3777 sql_help.c:3778 sql_help.c:3779 sql_help.c:3780 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:4231 sql_help.c:4233 sql_help.c:5009 sql_help.c:5010 +#: sql_help.c:5011 sql_help.c:5012 sql_help.c:5013 sql_help.c:5014 +#: sql_help.c:5015 sql_help.c:5016 sql_help.c:5017 sql_help.c:5019 +#: sql_help.c:5020 msgid "boolean" msgstr "логичеÑкое_значение" -#: sql_help.c:1724 sql_help.c:4969 +#: sql_help.c:1744 sql_help.c:5021 +msgid "size" +msgstr "размер" + +#: sql_help.c:1745 sql_help.c:5022 msgid "and table_and_columns is:" msgstr "и таблица_и_Ñтолбцы:" -#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749 +#: sql_help.c:1761 sql_help.c:4769 sql_help.c:4771 sql_help.c:4795 msgid "transaction_mode" msgstr "режим_транзакции" -#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750 +#: sql_help.c:1762 sql_help.c:4772 sql_help.c:4796 msgid "where transaction_mode is one of:" msgstr "где допуÑтимый режим_транзакции:" -#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582 -#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835 -#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064 -#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084 +#: sql_help.c:1771 sql_help.c:4614 sql_help.c:4623 sql_help.c:4627 +#: sql_help.c:4631 sql_help.c:4634 sql_help.c:4872 sql_help.c:4881 +#: sql_help.c:4885 sql_help.c:4889 sql_help.c:4892 sql_help.c:5117 +#: sql_help.c:5126 sql_help.c:5130 sql_help.c:5134 sql_help.c:5137 msgid "argument" msgstr "аргумент" -#: sql_help.c:1850 +#: sql_help.c:1867 msgid "relation_name" msgstr "имÑ_отношениÑ" -#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344 +#: sql_help.c:1872 sql_help.c:3926 sql_help.c:4389 msgid "domain_name" msgstr "имÑ_домена" -#: sql_help.c:1877 +#: sql_help.c:1894 msgid "policy_name" msgstr "имÑ_политики" -#: sql_help.c:1890 +#: sql_help.c:1907 msgid "rule_name" msgstr "имÑ_правила" -#: sql_help.c:1909 sql_help.c:4483 +#: sql_help.c:1926 sql_help.c:4528 msgid "string_literal" msgstr "ÑтроковаÑ_конÑтанта" -#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 +#: sql_help.c:1951 sql_help.c:4192 sql_help.c:4442 msgid "transaction_id" msgstr "код_транзакции" -#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017 +#: sql_help.c:1985 sql_help.c:1992 sql_help.c:4048 msgid "filename" msgstr "имÑ_файла" -#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 -#: sql_help.c:2689 +#: sql_help.c:1986 sql_help.c:1993 sql_help.c:2712 sql_help.c:2713 +#: sql_help.c:2714 msgid "command" msgstr "команда" -#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 -#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552 -#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809 -#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049 +#: sql_help.c:1988 sql_help.c:2711 sql_help.c:3144 sql_help.c:3325 +#: sql_help.c:4032 sql_help.c:4115 sql_help.c:4118 sql_help.c:4121 +#: sql_help.c:4597 sql_help.c:4599 sql_help.c:4701 sql_help.c:4703 +#: sql_help.c:4855 sql_help.c:4857 sql_help.c:4974 sql_help.c:5100 +#: sql_help.c:5102 msgid "condition" msgstr "уÑловие" -#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 -#: sql_help.c:3281 sql_help.c:3982 +#: sql_help.c:1991 sql_help.c:2532 sql_help.c:3027 sql_help.c:3291 +#: sql_help.c:3309 sql_help.c:4013 msgid "query" msgstr "запроÑ" -#: sql_help.c:1976 +#: sql_help.c:1996 msgid "format_name" msgstr "имÑ_формата" -#: sql_help.c:1978 +#: sql_help.c:1998 msgid "delimiter_character" msgstr "Ñимвол_разделитель" -#: sql_help.c:1979 +#: sql_help.c:1999 msgid "null_string" msgstr "предÑтавление_NULL" -#: sql_help.c:1981 +#: sql_help.c:2000 +msgid "default_string" +msgstr "предÑтавление_DEFAULT" + +#: sql_help.c:2002 msgid "quote_character" msgstr "Ñимвол_кавычек" -#: sql_help.c:1982 +#: sql_help.c:2003 msgid "escape_character" msgstr "ÑпецÑимвол" -#: sql_help.c:1986 +#: sql_help.c:2007 +msgid "error_action" +msgstr "дейÑтвие_при_ошибке" + +#: sql_help.c:2008 msgid "encoding_name" msgstr "имÑ_кодировки" -#: sql_help.c:1997 +#: sql_help.c:2009 +msgid "verbosity" +msgstr "детализациÑ" + +#: sql_help.c:2020 msgid "access_method_type" msgstr "тип_метода_доÑтупа" -#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 +#: sql_help.c:2091 sql_help.c:2110 sql_help.c:2113 msgid "arg_data_type" msgstr "тип_данных_аргумента" -#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 +#: sql_help.c:2092 sql_help.c:2114 sql_help.c:2122 msgid "sfunc" msgstr "функциÑ_ÑоÑтоÑниÑ" -#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 +#: sql_help.c:2093 sql_help.c:2115 sql_help.c:2123 msgid "state_data_type" msgstr "тип_данных_ÑоÑтоÑниÑ" -#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 +#: sql_help.c:2094 sql_help.c:2116 sql_help.c:2124 msgid "state_data_size" msgstr "размер_данных_ÑоÑтоÑниÑ" -#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 +#: sql_help.c:2095 sql_help.c:2117 sql_help.c:2125 msgid "ffunc" msgstr "функциÑ_завершениÑ" -#: sql_help.c:2073 sql_help.c:2103 +#: sql_help.c:2096 sql_help.c:2126 msgid "combinefunc" msgstr "комбинирующаÑ_функциÑ" -#: sql_help.c:2074 sql_help.c:2104 +#: sql_help.c:2097 sql_help.c:2127 msgid "serialfunc" msgstr "функциÑ_Ñериализации" -#: sql_help.c:2075 sql_help.c:2105 +#: sql_help.c:2098 sql_help.c:2128 msgid "deserialfunc" msgstr "функциÑ_деÑериализации" -#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 +#: sql_help.c:2099 sql_help.c:2118 sql_help.c:2129 msgid "initial_condition" msgstr "начальное_уÑловие" -#: sql_help.c:2077 sql_help.c:2107 +#: sql_help.c:2100 sql_help.c:2130 msgid "msfunc" msgstr "функциÑ_ÑоÑтоÑниÑ_движ" -#: sql_help.c:2078 sql_help.c:2108 +#: sql_help.c:2101 sql_help.c:2131 msgid "minvfunc" msgstr "обратнаÑ_функциÑ_движ" -#: sql_help.c:2079 sql_help.c:2109 +#: sql_help.c:2102 sql_help.c:2132 msgid "mstate_data_type" msgstr "тип_данных_ÑоÑтоÑниÑ_движ" -#: sql_help.c:2080 sql_help.c:2110 +#: sql_help.c:2103 sql_help.c:2133 msgid "mstate_data_size" msgstr "размер_данных_ÑоÑтоÑниÑ_движ" -#: sql_help.c:2081 sql_help.c:2111 +#: sql_help.c:2104 sql_help.c:2134 msgid "mffunc" msgstr "функциÑ_завершениÑ_движ" -#: sql_help.c:2082 sql_help.c:2112 +#: sql_help.c:2105 sql_help.c:2135 msgid "minitial_condition" msgstr "начальное_уÑловие_движ" -#: sql_help.c:2083 sql_help.c:2113 +#: sql_help.c:2106 sql_help.c:2136 msgid "sort_operator" msgstr "оператор_Ñортировки" -#: sql_help.c:2096 +#: sql_help.c:2119 msgid "or the old syntax" msgstr "или Ñтарый ÑинтакÑиÑ" -#: sql_help.c:2098 +#: sql_help.c:2121 msgid "base_type" msgstr "базовый_тип" -#: sql_help.c:2155 sql_help.c:2202 +#: sql_help.c:2179 sql_help.c:2229 msgid "locale" msgstr "код_локали" -#: sql_help.c:2156 sql_help.c:2203 +#: sql_help.c:2180 sql_help.c:2230 msgid "lc_collate" msgstr "код_правила_Ñортировки" -#: sql_help.c:2157 sql_help.c:2204 +#: sql_help.c:2181 sql_help.c:2231 msgid "lc_ctype" msgstr "код_клаÑÑификации_Ñимволов" -#: sql_help.c:2158 sql_help.c:4450 +#: sql_help.c:2182 sql_help.c:4495 msgid "provider" msgstr "провайдер" -#: sql_help.c:2160 sql_help.c:2263 +#: sql_help.c:2184 +msgid "rules" +msgstr "правила" + +#: sql_help.c:2185 sql_help.c:2292 msgid "version" msgstr "верÑиÑ" -#: sql_help.c:2162 +#: sql_help.c:2187 msgid "existing_collation" msgstr "ÑущеÑтвующее_правило_Ñортировки" -#: sql_help.c:2172 +#: sql_help.c:2197 msgid "source_encoding" msgstr "иÑходнаÑ_кодировка" -#: sql_help.c:2173 +#: sql_help.c:2198 msgid "dest_encoding" msgstr "целеваÑ_кодировка" -#: sql_help.c:2199 sql_help.c:3039 +#: sql_help.c:2226 sql_help.c:3067 msgid "template" msgstr "шаблон" -#: sql_help.c:2200 +#: sql_help.c:2227 msgid "encoding" msgstr "кодировка" -#: sql_help.c:2201 +#: sql_help.c:2228 msgid "strategy" msgstr "ÑтратегиÑ" -#: sql_help.c:2205 +#: sql_help.c:2232 +msgid "builtin_locale" +msgstr "вÑтроеннаÑ_локаль" + +#: sql_help.c:2233 msgid "icu_locale" msgstr "локаль_icu" -#: sql_help.c:2206 +#: sql_help.c:2234 +msgid "icu_rules" +msgstr "правила_icu" + +#: sql_help.c:2235 msgid "locale_provider" msgstr "провайдер_локали" -#: sql_help.c:2207 +#: sql_help.c:2236 msgid "collation_version" msgstr "верÑиÑ_правила_Ñортировки" -#: sql_help.c:2212 +#: sql_help.c:2241 msgid "oid" msgstr "oid" -#: sql_help.c:2232 -msgid "constraint" -msgstr "ограничение" - -#: sql_help.c:2233 -msgid "where constraint is:" -msgstr "где ограничение:" - -#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 +#: sql_help.c:2276 sql_help.c:2709 sql_help.c:3140 msgid "event" msgstr "Ñобытие" -#: sql_help.c:2248 +#: sql_help.c:2277 msgid "filter_variable" msgstr "переменнаÑ_фильтра" -#: sql_help.c:2249 +#: sql_help.c:2278 msgid "filter_value" msgstr "значение_фильтра" -#: sql_help.c:2345 sql_help.c:2931 +#: sql_help.c:2374 sql_help.c:2956 msgid "where column_constraint is:" msgstr "где ограничение_Ñтолбца:" -#: sql_help.c:2390 +#: sql_help.c:2419 msgid "rettype" msgstr "тип_возврата" -#: sql_help.c:2392 +#: sql_help.c:2421 msgid "column_type" msgstr "тип_Ñтолбца" -#: sql_help.c:2401 sql_help.c:2604 +#: sql_help.c:2430 sql_help.c:2633 msgid "definition" msgstr "определение" -#: sql_help.c:2402 sql_help.c:2605 +#: sql_help.c:2431 sql_help.c:2634 msgid "obj_file" msgstr "объектный_файл" -#: sql_help.c:2403 sql_help.c:2606 +#: sql_help.c:2432 sql_help.c:2635 msgid "link_symbol" msgstr "Ñимвол_в_ÑкÑпорте" -#: sql_help.c:2404 sql_help.c:2607 +#: sql_help.c:2433 sql_help.c:2636 msgid "sql_body" msgstr "тело_sql" -#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 +#: sql_help.c:2471 sql_help.c:2694 sql_help.c:3263 msgid "uid" msgstr "uid" -#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 -#: sql_help.c:2927 sql_help.c:2995 +#: sql_help.c:2487 sql_help.c:2528 sql_help.c:2925 sql_help.c:2938 +#: sql_help.c:2952 sql_help.c:3023 msgid "method" msgstr "метод" -#: sql_help.c:2463 -msgid "opclass_parameter" -msgstr "параметр_клаÑÑа_оп" - -#: sql_help.c:2480 +#: sql_help.c:2509 msgid "call_handler" msgstr "обработчик_вызова" -#: sql_help.c:2481 +#: sql_help.c:2510 msgid "inline_handler" msgstr "обработчик_внедрённого_кода" -#: sql_help.c:2482 +#: sql_help.c:2511 msgid "valfunction" msgstr "функциÑ_проверки" -#: sql_help.c:2521 -msgid "com_op" -msgstr "коммут_оператор" - -#: sql_help.c:2522 -msgid "neg_op" -msgstr "обратный_оператор" - -#: sql_help.c:2540 +#: sql_help.c:2569 msgid "family_name" msgstr "имÑ_ÑемейÑтва" -#: sql_help.c:2551 +#: sql_help.c:2580 msgid "storage_type" msgstr "тип_хранениÑ" -#: sql_help.c:2690 sql_help.c:3119 +#: sql_help.c:2715 sql_help.c:3147 msgid "where event can be one of:" msgstr "где допуÑтимое Ñобытие:" -#: sql_help.c:2710 sql_help.c:2712 +#: sql_help.c:2735 sql_help.c:2737 msgid "schema_element" msgstr "Ñлемент_Ñхемы" -#: sql_help.c:2749 +#: sql_help.c:2774 msgid "server_type" msgstr "тип_Ñервера" -#: sql_help.c:2750 +#: sql_help.c:2775 msgid "server_version" msgstr "верÑиÑ_Ñервера" -#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 +#: sql_help.c:2776 sql_help.c:3929 sql_help.c:4392 msgid "fdw_name" msgstr "имÑ_обёртки_Ñторонних_данных" -#: sql_help.c:2768 sql_help.c:2771 +#: sql_help.c:2793 sql_help.c:2796 msgid "statistics_name" msgstr "имÑ_ÑтатиÑтики" -#: sql_help.c:2772 +#: sql_help.c:2797 msgid "statistics_kind" msgstr "вид_ÑтатиÑтики" -#: sql_help.c:2788 +#: sql_help.c:2813 msgid "subscription_name" msgstr "имÑ_подпиÑки" -#: sql_help.c:2893 +#: sql_help.c:2918 msgid "source_table" msgstr "иÑходнаÑ_таблица" -#: sql_help.c:2894 +#: sql_help.c:2919 msgid "like_option" msgstr "параметр_порождениÑ" -#: sql_help.c:2960 +#: sql_help.c:2985 msgid "and like_option is:" msgstr "и параметр_порождениÑ:" -#: sql_help.c:3012 +#: sql_help.c:3040 msgid "directory" msgstr "каталог" -#: sql_help.c:3026 +#: sql_help.c:3054 msgid "parser_name" msgstr "имÑ_анализатора" -#: sql_help.c:3027 +#: sql_help.c:3055 msgid "source_config" msgstr "иÑходнаÑ_конфигурациÑ" -#: sql_help.c:3056 +#: sql_help.c:3084 msgid "start_function" msgstr "функциÑ_начала" -#: sql_help.c:3057 +#: sql_help.c:3085 msgid "gettoken_function" msgstr "функциÑ_выдачи_фрагмента" -#: sql_help.c:3058 +#: sql_help.c:3086 msgid "end_function" msgstr "функциÑ_окончаниÑ" -#: sql_help.c:3059 +#: sql_help.c:3087 msgid "lextypes_function" msgstr "функциÑ_лекÑ_типов" -#: sql_help.c:3060 +#: sql_help.c:3088 msgid "headline_function" msgstr "функциÑ_ÑозданиÑ_выдержек" -#: sql_help.c:3072 +#: sql_help.c:3100 msgid "init_function" msgstr "функциÑ_инициализации" -#: sql_help.c:3073 +#: sql_help.c:3101 msgid "lexize_function" msgstr "функциÑ_выделениÑ_лекÑем" -#: sql_help.c:3086 +#: sql_help.c:3114 msgid "from_sql_function_name" msgstr "имÑ_функции_из_sql" -#: sql_help.c:3088 +#: sql_help.c:3116 msgid "to_sql_function_name" msgstr "имÑ_функции_в_sql" -#: sql_help.c:3114 +#: sql_help.c:3142 msgid "referenced_table_name" msgstr "ÑÑылающаÑÑÑ_таблица" -#: sql_help.c:3115 +#: sql_help.c:3143 msgid "transition_relation_name" msgstr "имÑ_переходного_отношениÑ" -#: sql_help.c:3118 +#: sql_help.c:3146 msgid "arguments" msgstr "аргументы" -#: sql_help.c:3170 +#: sql_help.c:3198 msgid "label" msgstr "метка" -#: sql_help.c:3172 +#: sql_help.c:3200 msgid "subtype" msgstr "подтип" -#: sql_help.c:3173 +#: sql_help.c:3201 msgid "subtype_operator_class" msgstr "клаÑÑ_оператора_подтипа" -#: sql_help.c:3175 +#: sql_help.c:3203 msgid "canonical_function" msgstr "каноничеÑкаÑ_функциÑ" -#: sql_help.c:3176 +#: sql_help.c:3204 msgid "subtype_diff_function" msgstr "функциÑ_различий_подтипа" -#: sql_help.c:3177 +#: sql_help.c:3205 msgid "multirange_type_name" msgstr "имÑ_мультидиапазонного_типа" -#: sql_help.c:3179 +#: sql_help.c:3207 msgid "input_function" msgstr "функциÑ_ввода" -#: sql_help.c:3180 +#: sql_help.c:3208 msgid "output_function" msgstr "функциÑ_вывода" -#: sql_help.c:3181 +#: sql_help.c:3209 msgid "receive_function" msgstr "функциÑ_получениÑ" -#: sql_help.c:3182 +#: sql_help.c:3210 msgid "send_function" msgstr "функциÑ_отправки" -#: sql_help.c:3183 +#: sql_help.c:3211 msgid "type_modifier_input_function" msgstr "функциÑ_ввода_модификатора_типа" -#: sql_help.c:3184 +#: sql_help.c:3212 msgid "type_modifier_output_function" msgstr "функциÑ_вывода_модификатора_типа" -#: sql_help.c:3185 +#: sql_help.c:3213 msgid "analyze_function" msgstr "функциÑ_анализа" -#: sql_help.c:3186 +#: sql_help.c:3214 msgid "subscript_function" msgstr "функциÑ_обращениÑ_по_индекÑу" -#: sql_help.c:3187 +#: sql_help.c:3215 msgid "internallength" msgstr "внутр_длина" -#: sql_help.c:3188 +#: sql_help.c:3216 msgid "alignment" msgstr "выравнивание" -#: sql_help.c:3189 +#: sql_help.c:3217 msgid "storage" msgstr "хранение" -#: sql_help.c:3190 +#: sql_help.c:3218 msgid "like_type" msgstr "тип_образец" -#: sql_help.c:3191 +#: sql_help.c:3219 msgid "category" msgstr "категориÑ" -#: sql_help.c:3192 +#: sql_help.c:3220 msgid "preferred" msgstr "предпочитаемый" -#: sql_help.c:3193 +#: sql_help.c:3221 msgid "default" msgstr "по_умолчанию" -#: sql_help.c:3194 +#: sql_help.c:3222 msgid "element" msgstr "Ñлемент" -#: sql_help.c:3195 +#: sql_help.c:3223 msgid "delimiter" msgstr "разделитель" -#: sql_help.c:3196 +#: sql_help.c:3224 msgid "collatable" msgstr "Ñортируемый" -#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547 -#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042 +#: sql_help.c:3321 sql_help.c:4008 sql_help.c:4102 sql_help.c:4592 +#: sql_help.c:4695 sql_help.c:4850 sql_help.c:4964 sql_help.c:5095 msgid "with_query" msgstr "запроÑ_WITH" -#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572 -#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591 -#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836 -#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061 -#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078 -#: sql_help.c:5086 +#: sql_help.c:3323 sql_help.c:4010 sql_help.c:4611 sql_help.c:4617 +#: sql_help.c:4620 sql_help.c:4624 sql_help.c:4628 sql_help.c:4636 +#: sql_help.c:4869 sql_help.c:4875 sql_help.c:4878 sql_help.c:4882 +#: sql_help.c:4886 sql_help.c:4894 sql_help.c:4966 sql_help.c:5114 +#: sql_help.c:5120 sql_help.c:5123 sql_help.c:5127 sql_help.c:5131 +#: sql_help.c:5139 msgid "alias" msgstr "пÑевдоним" -#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595 -#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603 -#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852 -#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860 -#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090 -#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098 +#: sql_help.c:3324 sql_help.c:4596 sql_help.c:4638 sql_help.c:4640 +#: sql_help.c:4644 sql_help.c:4646 sql_help.c:4647 sql_help.c:4648 +#: sql_help.c:4700 sql_help.c:4854 sql_help.c:4896 sql_help.c:4898 +#: sql_help.c:4902 sql_help.c:4904 sql_help.c:4905 sql_help.c:4906 +#: sql_help.c:4973 sql_help.c:5099 sql_help.c:5141 sql_help.c:5143 +#: sql_help.c:5147 sql_help.c:5149 sql_help.c:5150 sql_help.c:5151 msgid "from_item" msgstr "иÑточник_данных" -#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928 +#: sql_help.c:3326 sql_help.c:3810 sql_help.c:4159 sql_help.c:4975 msgid "cursor_name" msgstr "имÑ_курÑора" -#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929 +#: sql_help.c:3327 sql_help.c:4016 sql_help.c:4108 sql_help.c:4976 msgid "output_expression" msgstr "выражение_результата" -#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652 -#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045 +#: sql_help.c:3328 sql_help.c:4017 sql_help.c:4109 sql_help.c:4595 +#: sql_help.c:4698 sql_help.c:4853 sql_help.c:4977 sql_help.c:5098 msgid "output_name" msgstr "имÑ_результата" -#: sql_help.c:3316 +#: sql_help.c:3344 msgid "code" msgstr "внедрённый_код" -#: sql_help.c:3721 +#: sql_help.c:3749 msgid "parameter" msgstr "параметр" -#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 +#: sql_help.c:3773 sql_help.c:4184 msgid "statement" msgstr "оператор" -#: sql_help.c:3778 sql_help.c:4116 +#: sql_help.c:3809 sql_help.c:4158 msgid "direction" msgstr "направление" -#: sql_help.c:3780 sql_help.c:4118 +#: sql_help.c:3811 sql_help.c:4160 msgid "where direction can be one of:" msgstr "где допуÑтимое направление:" -#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 -#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 -#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562 -#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819 -#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057 +#: sql_help.c:3812 sql_help.c:3813 sql_help.c:3814 sql_help.c:3815 +#: sql_help.c:3816 sql_help.c:4161 sql_help.c:4162 sql_help.c:4163 +#: sql_help.c:4164 sql_help.c:4165 sql_help.c:4605 sql_help.c:4607 +#: sql_help.c:4709 sql_help.c:4711 sql_help.c:4863 sql_help.c:4865 +#: sql_help.c:5039 sql_help.c:5041 sql_help.c:5108 sql_help.c:5110 msgid "count" msgstr "чиÑло" -#: sql_help.c:3888 sql_help.c:4337 +#: sql_help.c:3919 sql_help.c:4382 msgid "sequence_name" msgstr "имÑ_поÑледовательноÑти" -#: sql_help.c:3906 sql_help.c:4355 +#: sql_help.c:3937 sql_help.c:4400 msgid "arg_name" msgstr "имÑ_аргумента" -#: sql_help.c:3907 sql_help.c:4356 +#: sql_help.c:3938 sql_help.c:4401 msgid "arg_type" msgstr "тип_аргумента" -#: sql_help.c:3914 sql_help.c:4363 +#: sql_help.c:3945 sql_help.c:4408 msgid "loid" msgstr "код_БО" -#: sql_help.c:3945 +#: sql_help.c:3976 msgid "remote_schema" msgstr "удалённаÑ_Ñхема" -#: sql_help.c:3948 +#: sql_help.c:3979 msgid "local_schema" msgstr "локальнаÑ_Ñхема" -#: sql_help.c:3983 +#: sql_help.c:4014 msgid "conflict_target" msgstr "объект_конфликта" -#: sql_help.c:3984 +#: sql_help.c:4015 msgid "conflict_action" msgstr "дейÑтвие_при_конфликте" -#: sql_help.c:3987 +#: sql_help.c:4018 msgid "where conflict_target can be one of:" msgstr "где допуÑтимый объект_конфликта:" -#: sql_help.c:3988 +#: sql_help.c:4019 msgid "index_column_name" msgstr "имÑ_Ñтолбца_индекÑа" -#: sql_help.c:3989 +#: sql_help.c:4020 msgid "index_expression" msgstr "выражение_индекÑа" -#: sql_help.c:3992 +#: sql_help.c:4023 msgid "index_predicate" msgstr "предикат_индекÑа" -#: sql_help.c:3994 +#: sql_help.c:4025 msgid "and conflict_action is one of:" msgstr "а допуÑтимое дейÑтвие_при_конфликте:" -#: sql_help.c:4000 sql_help.c:4925 +#: sql_help.c:4031 sql_help.c:4132 sql_help.c:4972 msgid "sub-SELECT" msgstr "вложенный_SELECT" -#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901 +#: sql_help.c:4040 sql_help.c:4173 sql_help.c:4948 msgid "channel" msgstr "канал" -#: sql_help.c:4031 +#: sql_help.c:4062 msgid "lockmode" msgstr "режим_блокировки" -#: sql_help.c:4032 +#: sql_help.c:4063 msgid "where lockmode is one of:" msgstr "где допуÑтимый режим_блокировки:" -#: sql_help.c:4068 +#: sql_help.c:4103 msgid "target_table_name" msgstr "имÑ_целевой_таблицы" -#: sql_help.c:4069 +#: sql_help.c:4104 msgid "target_alias" msgstr "пÑевдоним_назначениÑ" -#: sql_help.c:4070 +#: sql_help.c:4105 msgid "data_source" msgstr "иÑточник_данных" -#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 +#: sql_help.c:4106 sql_help.c:4641 sql_help.c:4899 sql_help.c:5144 msgid "join_condition" msgstr "уÑловие_ÑоединениÑ" -#: sql_help.c:4072 +#: sql_help.c:4107 msgid "when_clause" msgstr "предложение_when" -#: sql_help.c:4073 +#: sql_help.c:4110 msgid "where data_source is:" msgstr "где иÑточник_данных:" -#: sql_help.c:4074 +#: sql_help.c:4111 msgid "source_table_name" msgstr "имÑ_иÑходной_таблицы" -#: sql_help.c:4075 +#: sql_help.c:4112 msgid "source_query" msgstr "иÑходный_запроÑ" -#: sql_help.c:4076 +#: sql_help.c:4113 msgid "source_alias" msgstr "пÑевдоним_иÑточника" -#: sql_help.c:4077 +#: sql_help.c:4114 msgid "and when_clause is:" msgstr "и предложение_when:" -#: sql_help.c:4079 +#: sql_help.c:4116 sql_help.c:4119 msgid "merge_update" msgstr "merge_update" -#: sql_help.c:4080 +#: sql_help.c:4117 sql_help.c:4120 msgid "merge_delete" msgstr "merge_delete" -#: sql_help.c:4082 +#: sql_help.c:4122 msgid "merge_insert" msgstr "merge_insert" -#: sql_help.c:4083 +#: sql_help.c:4123 msgid "and merge_insert is:" msgstr "и merge_insert:" -#: sql_help.c:4086 +#: sql_help.c:4126 msgid "and merge_update is:" msgstr "и merge_update:" -#: sql_help.c:4091 +#: sql_help.c:4133 msgid "and merge_delete is:" msgstr "и merge_delete:" -#: sql_help.c:4132 +#: sql_help.c:4174 msgid "payload" msgstr "Ñообщение_нагрузка" -#: sql_help.c:4159 +#: sql_help.c:4201 msgid "old_role" msgstr "ÑтараÑ_роль" -#: sql_help.c:4160 +#: sql_help.c:4202 msgid "new_role" msgstr "новаÑ_роль" -#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 +#: sql_help.c:4241 sql_help.c:4450 sql_help.c:4458 msgid "savepoint_name" msgstr "имÑ_точки_ÑохранениÑ" -#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868 -#: sql_help.c:5048 sql_help.c:5106 +#: sql_help.c:4598 sql_help.c:4656 sql_help.c:4856 sql_help.c:4914 +#: sql_help.c:5101 sql_help.c:5159 msgid "grouping_element" msgstr "Ñлемент_группированиÑ" -#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 +#: sql_help.c:4600 sql_help.c:4704 sql_help.c:4858 sql_help.c:5103 msgid "window_name" msgstr "имÑ_окна" -#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051 +#: sql_help.c:4601 sql_help.c:4705 sql_help.c:4859 sql_help.c:5104 msgid "window_definition" msgstr "определение_окна" -#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660 -#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052 -#: sql_help.c:5066 sql_help.c:5110 +#: sql_help.c:4602 sql_help.c:4616 sql_help.c:4660 sql_help.c:4706 +#: sql_help.c:4860 sql_help.c:4874 sql_help.c:4918 sql_help.c:5105 +#: sql_help.c:5119 sql_help.c:5163 msgid "select" msgstr "select" -#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059 +#: sql_help.c:4608 sql_help.c:4866 sql_help.c:5111 +msgid "from_reference" +msgstr "ÑÑылка_FROM" + +#: sql_help.c:4609 sql_help.c:4867 sql_help.c:5112 msgid "where from_item can be one of:" msgstr "где допуÑтимый иÑточник_данных:" -#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580 -#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833 -#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068 -#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087 +#: sql_help.c:4612 sql_help.c:4618 sql_help.c:4621 sql_help.c:4625 +#: sql_help.c:4637 sql_help.c:4870 sql_help.c:4876 sql_help.c:4879 +#: sql_help.c:4883 sql_help.c:4895 sql_help.c:5115 sql_help.c:5121 +#: sql_help.c:5124 sql_help.c:5128 sql_help.c:5140 msgid "column_alias" msgstr "пÑевдоним_Ñтолбца" -#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063 +#: sql_help.c:4613 sql_help.c:4871 sql_help.c:5116 msgid "sampling_method" msgstr "метод_выборки" -#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 +#: sql_help.c:4615 sql_help.c:4873 sql_help.c:5118 msgid "seed" msgstr "начальное_чиÑло" -#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870 -#: sql_help.c:5069 sql_help.c:5108 +#: sql_help.c:4619 sql_help.c:4658 sql_help.c:4877 sql_help.c:4916 +#: sql_help.c:5122 sql_help.c:5161 msgid "with_query_name" msgstr "имÑ_запроÑа_WITH" -#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841 -#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082 -#: sql_help.c:5085 +#: sql_help.c:4629 sql_help.c:4632 sql_help.c:4635 sql_help.c:4887 +#: sql_help.c:4890 sql_help.c:4893 sql_help.c:5132 sql_help.c:5135 +#: sql_help.c:5138 msgid "column_definition" msgstr "определение_Ñтолбца" -#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857 -#: sql_help.c:5089 sql_help.c:5095 +#: sql_help.c:4639 sql_help.c:4645 sql_help.c:4897 sql_help.c:4903 +#: sql_help.c:5142 sql_help.c:5148 msgid "join_type" msgstr "тип_ÑоединениÑ" -#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 +#: sql_help.c:4642 sql_help.c:4900 sql_help.c:5145 msgid "join_column" msgstr "Ñтолбец_ÑоединениÑ" -#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 +#: sql_help.c:4643 sql_help.c:4901 sql_help.c:5146 msgid "join_using_alias" msgstr "пÑевдоним_иÑпользованиÑ_ÑоединениÑ" -#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099 +#: sql_help.c:4649 sql_help.c:4907 sql_help.c:5152 msgid "and grouping_element can be one of:" msgstr "где допуÑтимый Ñлемент_группированиÑ:" -#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107 +#: sql_help.c:4657 sql_help.c:4915 sql_help.c:5160 msgid "and with_query is:" msgstr "и запроÑ_WITH:" -#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 +#: sql_help.c:4661 sql_help.c:4919 sql_help.c:5164 msgid "values" msgstr "значениÑ" -#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 +#: sql_help.c:4662 sql_help.c:4920 sql_help.c:5165 msgid "insert" msgstr "insert" -#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 +#: sql_help.c:4663 sql_help.c:4921 sql_help.c:5166 msgid "update" msgstr "update" -#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 +#: sql_help.c:4664 sql_help.c:4922 sql_help.c:5167 msgid "delete" msgstr "delete" -#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 +#: sql_help.c:4665 sql_help.c:4923 sql_help.c:5168 +msgid "merge" +msgstr "merge" + +#: sql_help.c:4667 sql_help.c:4925 sql_help.c:5170 msgid "search_seq_col_name" msgstr "имÑ_Ñтолбца_поÑлед_поиÑка" -#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 +#: sql_help.c:4669 sql_help.c:4927 sql_help.c:5172 msgid "cycle_mark_col_name" msgstr "имÑ_Ñтолбца_пометки_цикла" -#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 +#: sql_help.c:4670 sql_help.c:4928 sql_help.c:5173 msgid "cycle_mark_value" msgstr "значение_пометки_цикла" -#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 +#: sql_help.c:4671 sql_help.c:4929 sql_help.c:5174 msgid "cycle_mark_default" msgstr "пометка_цикла_по_умолчанию" -#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 +#: sql_help.c:4672 sql_help.c:4930 sql_help.c:5175 msgid "cycle_path_col_name" msgstr "имÑ_Ñтолбца_пути_цикла" -#: sql_help.c:4653 +#: sql_help.c:4699 msgid "new_table" msgstr "новаÑ_таблица" -#: sql_help.c:4724 +#: sql_help.c:4770 msgid "snapshot_id" msgstr "код_Ñнимка" -#: sql_help.c:4984 +#: sql_help.c:5037 msgid "sort_expression" msgstr "выражение_Ñортировки" -#: sql_help.c:5128 sql_help.c:6112 +#: sql_help.c:5182 sql_help.c:6166 msgid "abort the current transaction" msgstr "прервать текущую транзакцию" -#: sql_help.c:5134 +#: sql_help.c:5188 msgid "change the definition of an aggregate function" msgstr "изменить определение агрегатной функции" -#: sql_help.c:5140 +#: sql_help.c:5194 msgid "change the definition of a collation" msgstr "изменить определение правила Ñортировки" -#: sql_help.c:5146 +#: sql_help.c:5200 msgid "change the definition of a conversion" msgstr "изменить определение преобразованиÑ" -#: sql_help.c:5152 +#: sql_help.c:5206 msgid "change a database" msgstr "изменить атрибуты базы данных" -#: sql_help.c:5158 +#: sql_help.c:5212 msgid "define default access privileges" msgstr "определить права доÑтупа по умолчанию" -#: sql_help.c:5164 +#: sql_help.c:5218 msgid "change the definition of a domain" msgstr "изменить определение домена" -#: sql_help.c:5170 +#: sql_help.c:5224 msgid "change the definition of an event trigger" msgstr "изменить определение Ñобытийного триггера" -#: sql_help.c:5176 +#: sql_help.c:5230 msgid "change the definition of an extension" msgstr "изменить определение раÑширениÑ" -#: sql_help.c:5182 +#: sql_help.c:5236 msgid "change the definition of a foreign-data wrapper" msgstr "изменить определение обёртки Ñторонних данных" -#: sql_help.c:5188 +#: sql_help.c:5242 msgid "change the definition of a foreign table" msgstr "изменить определение Ñторонней таблицы" -#: sql_help.c:5194 +#: sql_help.c:5248 msgid "change the definition of a function" msgstr "изменить определение функции" -#: sql_help.c:5200 +#: sql_help.c:5254 msgid "change role name or membership" msgstr "изменить Ð¸Ð¼Ñ Ñ€Ð¾Ð»Ð¸ или членÑтво" -#: sql_help.c:5206 +#: sql_help.c:5260 msgid "change the definition of an index" msgstr "изменить определение индекÑа" -#: sql_help.c:5212 +#: sql_help.c:5266 msgid "change the definition of a procedural language" msgstr "изменить определение процедурного Ñзыка" -#: sql_help.c:5218 +#: sql_help.c:5272 msgid "change the definition of a large object" msgstr "изменить определение большого объекта" -#: sql_help.c:5224 +#: sql_help.c:5278 msgid "change the definition of a materialized view" msgstr "изменить определение материализованного предÑтавлениÑ" -#: sql_help.c:5230 +#: sql_help.c:5284 msgid "change the definition of an operator" msgstr "изменить определение оператора" -#: sql_help.c:5236 +#: sql_help.c:5290 msgid "change the definition of an operator class" msgstr "изменить определение клаÑÑа операторов" -#: sql_help.c:5242 +#: sql_help.c:5296 msgid "change the definition of an operator family" msgstr "изменить определение ÑемейÑтва операторов" -#: sql_help.c:5248 +#: sql_help.c:5302 msgid "change the definition of a row-level security policy" msgstr "изменить определение политики защиты на уровне Ñтрок" -#: sql_help.c:5254 +#: sql_help.c:5308 msgid "change the definition of a procedure" msgstr "изменить определение процедуры" -#: sql_help.c:5260 +#: sql_help.c:5314 msgid "change the definition of a publication" msgstr "изменить определение публикации" -#: sql_help.c:5266 sql_help.c:5368 +#: sql_help.c:5320 sql_help.c:5422 msgid "change a database role" msgstr "изменить роль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð‘Ð”" -#: sql_help.c:5272 +#: sql_help.c:5326 msgid "change the definition of a routine" msgstr "изменить определение подпрограммы" -#: sql_help.c:5278 +#: sql_help.c:5332 msgid "change the definition of a rule" msgstr "изменить определение правила" -#: sql_help.c:5284 +#: sql_help.c:5338 msgid "change the definition of a schema" msgstr "изменить определение Ñхемы" -#: sql_help.c:5290 +#: sql_help.c:5344 msgid "change the definition of a sequence generator" msgstr "изменить определение генератора поÑледовательноÑти" -#: sql_help.c:5296 +#: sql_help.c:5350 msgid "change the definition of a foreign server" msgstr "изменить определение Ñтороннего Ñервера" -#: sql_help.c:5302 +#: sql_help.c:5356 msgid "change the definition of an extended statistics object" msgstr "изменить определение объекта раÑширенной ÑтатиÑтики" -#: sql_help.c:5308 +#: sql_help.c:5362 msgid "change the definition of a subscription" msgstr "изменить определение подпиÑки" -#: sql_help.c:5314 +#: sql_help.c:5368 msgid "change a server configuration parameter" msgstr "изменить параметр конфигурации Ñервера" -#: sql_help.c:5320 +#: sql_help.c:5374 msgid "change the definition of a table" msgstr "изменить определение таблицы" -#: sql_help.c:5326 +#: sql_help.c:5380 msgid "change the definition of a tablespace" msgstr "изменить определение табличного проÑтранÑтва" -#: sql_help.c:5332 +#: sql_help.c:5386 msgid "change the definition of a text search configuration" msgstr "изменить определение конфигурации текÑтового поиÑка" -#: sql_help.c:5338 +#: sql_help.c:5392 msgid "change the definition of a text search dictionary" msgstr "изменить определение ÑÐ»Ð¾Ð²Ð°Ñ€Ñ Ñ‚ÐµÐºÑтового поиÑка" -#: sql_help.c:5344 +#: sql_help.c:5398 msgid "change the definition of a text search parser" msgstr "изменить определение анализатора текÑтового поиÑка" -#: sql_help.c:5350 +#: sql_help.c:5404 msgid "change the definition of a text search template" msgstr "изменить определение шаблона текÑтового поиÑка" -#: sql_help.c:5356 +#: sql_help.c:5410 msgid "change the definition of a trigger" msgstr "изменить определение триггера" -#: sql_help.c:5362 +#: sql_help.c:5416 msgid "change the definition of a type" msgstr "изменить определение типа" -#: sql_help.c:5374 +#: sql_help.c:5428 msgid "change the definition of a user mapping" msgstr "изменить ÑопоÑтавление пользователей" -#: sql_help.c:5380 +#: sql_help.c:5434 msgid "change the definition of a view" msgstr "изменить определение предÑтавлениÑ" -#: sql_help.c:5386 +#: sql_help.c:5440 msgid "collect statistics about a database" msgstr "Ñобрать ÑтатиÑтику о базе данных" -#: sql_help.c:5392 sql_help.c:6190 +#: sql_help.c:5446 sql_help.c:6244 msgid "start a transaction block" msgstr "начать транзакцию" -#: sql_help.c:5398 +#: sql_help.c:5452 msgid "invoke a procedure" msgstr "вызвать процедуру" -#: sql_help.c:5404 +#: sql_help.c:5458 msgid "force a write-ahead log checkpoint" msgstr "произвеÑти контрольную точку в журнале предзапиÑи" -#: sql_help.c:5410 +#: sql_help.c:5464 msgid "close a cursor" msgstr "закрыть курÑор" -#: sql_help.c:5416 +#: sql_help.c:5470 msgid "cluster a table according to an index" msgstr "перегруппировать таблицу по индекÑу" -#: sql_help.c:5422 +#: sql_help.c:5476 msgid "define or change the comment of an object" msgstr "задать или изменить комментарий объекта" -#: sql_help.c:5428 sql_help.c:5986 +#: sql_help.c:5482 sql_help.c:6040 msgid "commit the current transaction" msgstr "зафикÑировать текущую транзакцию" -#: sql_help.c:5434 +#: sql_help.c:5488 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "зафикÑировать транзакцию, ранее подготовленную Ð´Ð»Ñ Ð´Ð²ÑƒÑ…Ñ„Ð°Ð·Ð½Ð¾Ð¹ фикÑации" -#: sql_help.c:5440 +#: sql_help.c:5494 msgid "copy data between a file and a table" msgstr "импорт/ÑкÑпорт данных в файл" -#: sql_help.c:5446 +#: sql_help.c:5500 msgid "define a new access method" msgstr "Ñоздать новый метод доÑтупа" -#: sql_help.c:5452 +#: sql_help.c:5506 msgid "define a new aggregate function" msgstr "Ñоздать агрегатную функцию" -#: sql_help.c:5458 +#: sql_help.c:5512 msgid "define a new cast" msgstr "Ñоздать приведение типов" -#: sql_help.c:5464 +#: sql_help.c:5518 msgid "define a new collation" msgstr "Ñоздать правило Ñортировки" -#: sql_help.c:5470 +#: sql_help.c:5524 msgid "define a new encoding conversion" msgstr "Ñоздать преобразование кодировки" -#: sql_help.c:5476 +#: sql_help.c:5530 msgid "create a new database" msgstr "Ñоздать базу данных" -#: sql_help.c:5482 +#: sql_help.c:5536 msgid "define a new domain" msgstr "Ñоздать домен" -#: sql_help.c:5488 +#: sql_help.c:5542 msgid "define a new event trigger" msgstr "Ñоздать Ñобытийный триггер" -#: sql_help.c:5494 +#: sql_help.c:5548 msgid "install an extension" msgstr "уÑтановить раÑширение" -#: sql_help.c:5500 +#: sql_help.c:5554 msgid "define a new foreign-data wrapper" msgstr "Ñоздать обёртку Ñторонних данных" -#: sql_help.c:5506 +#: sql_help.c:5560 msgid "define a new foreign table" msgstr "Ñоздать Ñтороннюю таблицу" -#: sql_help.c:5512 +#: sql_help.c:5566 msgid "define a new function" msgstr "Ñоздать функцию" -#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680 +#: sql_help.c:5572 sql_help.c:5632 sql_help.c:5734 msgid "define a new database role" msgstr "Ñоздать роль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð‘Ð”" -#: sql_help.c:5524 +#: sql_help.c:5578 msgid "define a new index" msgstr "Ñоздать индекÑ" -#: sql_help.c:5530 +#: sql_help.c:5584 msgid "define a new procedural language" msgstr "Ñоздать процедурный Ñзык" -#: sql_help.c:5536 +#: sql_help.c:5590 msgid "define a new materialized view" msgstr "Ñоздать материализованное предÑтавление" -#: sql_help.c:5542 +#: sql_help.c:5596 msgid "define a new operator" msgstr "Ñоздать оператор" -#: sql_help.c:5548 +#: sql_help.c:5602 msgid "define a new operator class" msgstr "Ñоздать клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð²" -#: sql_help.c:5554 +#: sql_help.c:5608 msgid "define a new operator family" msgstr "Ñоздать ÑемейÑтво операторов" -#: sql_help.c:5560 +#: sql_help.c:5614 msgid "define a new row-level security policy for a table" msgstr "Ñоздать новую политику защиты на уровне Ñтрок Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹" -#: sql_help.c:5566 +#: sql_help.c:5620 msgid "define a new procedure" msgstr "Ñоздать процедуру" -#: sql_help.c:5572 +#: sql_help.c:5626 msgid "define a new publication" msgstr "Ñоздать публикацию" -#: sql_help.c:5584 +#: sql_help.c:5638 msgid "define a new rewrite rule" msgstr "Ñоздать правило перезапиÑи" -#: sql_help.c:5590 +#: sql_help.c:5644 msgid "define a new schema" msgstr "Ñоздать Ñхему" -#: sql_help.c:5596 +#: sql_help.c:5650 msgid "define a new sequence generator" msgstr "Ñоздать генератор поÑледовательноÑтей" -#: sql_help.c:5602 +#: sql_help.c:5656 msgid "define a new foreign server" msgstr "Ñоздать Ñторонний Ñервер" -#: sql_help.c:5608 +#: sql_help.c:5662 msgid "define extended statistics" msgstr "Ñоздать раÑширенную ÑтатиÑтику" -#: sql_help.c:5614 +#: sql_help.c:5668 msgid "define a new subscription" msgstr "Ñоздать подпиÑку" -#: sql_help.c:5620 +#: sql_help.c:5674 msgid "define a new table" msgstr "Ñоздать таблицу" -#: sql_help.c:5626 sql_help.c:6148 +#: sql_help.c:5680 sql_help.c:6202 msgid "define a new table from the results of a query" msgstr "Ñоздать таблицу из результатов запроÑа" -#: sql_help.c:5632 +#: sql_help.c:5686 msgid "define a new tablespace" msgstr "Ñоздать табличное проÑтранÑтво" -#: sql_help.c:5638 +#: sql_help.c:5692 msgid "define a new text search configuration" msgstr "Ñоздать конфигурацию текÑтового поиÑка" -#: sql_help.c:5644 +#: sql_help.c:5698 msgid "define a new text search dictionary" msgstr "Ñоздать Ñловарь текÑтового поиÑка" -#: sql_help.c:5650 +#: sql_help.c:5704 msgid "define a new text search parser" msgstr "Ñоздать анализатор текÑтового поиÑка" -#: sql_help.c:5656 +#: sql_help.c:5710 msgid "define a new text search template" msgstr "Ñоздать шаблон текÑтового поиÑка" -#: sql_help.c:5662 +#: sql_help.c:5716 msgid "define a new transform" msgstr "Ñоздать преобразование" -#: sql_help.c:5668 +#: sql_help.c:5722 msgid "define a new trigger" msgstr "Ñоздать триггер" -#: sql_help.c:5674 +#: sql_help.c:5728 msgid "define a new data type" msgstr "Ñоздать тип данных" -#: sql_help.c:5686 +#: sql_help.c:5740 msgid "define a new mapping of a user to a foreign server" msgstr "Ñоздать ÑопоÑтавление Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñтороннего Ñервера" -#: sql_help.c:5692 +#: sql_help.c:5746 msgid "define a new view" msgstr "Ñоздать предÑтавление" -#: sql_help.c:5698 +#: sql_help.c:5752 msgid "deallocate a prepared statement" msgstr "оÑвободить подготовленный оператор" -#: sql_help.c:5704 +#: sql_help.c:5758 msgid "define a cursor" msgstr "Ñоздать курÑор" -#: sql_help.c:5710 +#: sql_help.c:5764 msgid "delete rows of a table" msgstr "удалить запиÑи таблицы" -#: sql_help.c:5716 +#: sql_help.c:5770 msgid "discard session state" msgstr "очиÑтить ÑоÑтоÑние ÑеанÑа" -#: sql_help.c:5722 +#: sql_help.c:5776 msgid "execute an anonymous code block" msgstr "выполнить анонимный блок кода" -#: sql_help.c:5728 +#: sql_help.c:5782 msgid "remove an access method" msgstr "удалить метод доÑтупа" -#: sql_help.c:5734 +#: sql_help.c:5788 msgid "remove an aggregate function" msgstr "удалить агрегатную функцию" -#: sql_help.c:5740 +#: sql_help.c:5794 msgid "remove a cast" msgstr "удалить приведение типа" -#: sql_help.c:5746 +#: sql_help.c:5800 msgid "remove a collation" msgstr "удалить правило Ñортировки" -#: sql_help.c:5752 +#: sql_help.c:5806 msgid "remove a conversion" msgstr "удалить преобразование" -#: sql_help.c:5758 +#: sql_help.c:5812 msgid "remove a database" msgstr "удалить базу данных" -#: sql_help.c:5764 +#: sql_help.c:5818 msgid "remove a domain" msgstr "удалить домен" -#: sql_help.c:5770 +#: sql_help.c:5824 msgid "remove an event trigger" msgstr "удалить Ñобытийный триггер" -#: sql_help.c:5776 +#: sql_help.c:5830 msgid "remove an extension" msgstr "удалить раÑширение" -#: sql_help.c:5782 +#: sql_help.c:5836 msgid "remove a foreign-data wrapper" msgstr "удалить обёртку Ñторонних данных" -#: sql_help.c:5788 +#: sql_help.c:5842 msgid "remove a foreign table" msgstr "удалить Ñтороннюю таблицу" -#: sql_help.c:5794 +#: sql_help.c:5848 msgid "remove a function" msgstr "удалить функцию" -#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968 +#: sql_help.c:5854 sql_help.c:5920 sql_help.c:6022 msgid "remove a database role" msgstr "удалить роль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð‘Ð”" -#: sql_help.c:5806 +#: sql_help.c:5860 msgid "remove an index" msgstr "удалить индекÑ" -#: sql_help.c:5812 +#: sql_help.c:5866 msgid "remove a procedural language" msgstr "удалить процедурный Ñзык" -#: sql_help.c:5818 +#: sql_help.c:5872 msgid "remove a materialized view" msgstr "удалить материализованное предÑтавление" -#: sql_help.c:5824 +#: sql_help.c:5878 msgid "remove an operator" msgstr "удалить оператор" -#: sql_help.c:5830 +#: sql_help.c:5884 msgid "remove an operator class" msgstr "удалить клаÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð¾Ð²" -#: sql_help.c:5836 +#: sql_help.c:5890 msgid "remove an operator family" msgstr "удалить ÑемейÑтво операторов" -#: sql_help.c:5842 +#: sql_help.c:5896 msgid "remove database objects owned by a database role" msgstr "удалить объекты базы данных, принадлежащие роли" -#: sql_help.c:5848 +#: sql_help.c:5902 msgid "remove a row-level security policy from a table" msgstr "удалить из таблицы политику защиты на уровне Ñтрок" -#: sql_help.c:5854 +#: sql_help.c:5908 msgid "remove a procedure" msgstr "удалить процедуру" -#: sql_help.c:5860 +#: sql_help.c:5914 msgid "remove a publication" msgstr "удалить публикацию" -#: sql_help.c:5872 +#: sql_help.c:5926 msgid "remove a routine" msgstr "удалить подпрограмму" -#: sql_help.c:5878 +#: sql_help.c:5932 msgid "remove a rewrite rule" msgstr "удалить правило перезапиÑи" -#: sql_help.c:5884 +#: sql_help.c:5938 msgid "remove a schema" msgstr "удалить Ñхему" -#: sql_help.c:5890 +#: sql_help.c:5944 msgid "remove a sequence" msgstr "удалить поÑледовательноÑть" -#: sql_help.c:5896 +#: sql_help.c:5950 msgid "remove a foreign server descriptor" msgstr "удалить опиÑание Ñтороннего Ñервера" -#: sql_help.c:5902 +#: sql_help.c:5956 msgid "remove extended statistics" msgstr "удалить раÑширенную ÑтатиÑтику" -#: sql_help.c:5908 +#: sql_help.c:5962 msgid "remove a subscription" msgstr "удалить подпиÑку" -#: sql_help.c:5914 +#: sql_help.c:5968 msgid "remove a table" msgstr "удалить таблицу" -#: sql_help.c:5920 +#: sql_help.c:5974 msgid "remove a tablespace" msgstr "удалить табличное проÑтранÑтво" -#: sql_help.c:5926 +#: sql_help.c:5980 msgid "remove a text search configuration" msgstr "удалить конфигурацию текÑтового поиÑка" -#: sql_help.c:5932 +#: sql_help.c:5986 msgid "remove a text search dictionary" msgstr "удалить Ñловарь текÑтового поиÑка" -#: sql_help.c:5938 +#: sql_help.c:5992 msgid "remove a text search parser" msgstr "удалить анализатор текÑтового поиÑка" -#: sql_help.c:5944 +#: sql_help.c:5998 msgid "remove a text search template" msgstr "удалить шаблон текÑтового поиÑка" -#: sql_help.c:5950 +#: sql_help.c:6004 msgid "remove a transform" msgstr "удалить преобразование" -#: sql_help.c:5956 +#: sql_help.c:6010 msgid "remove a trigger" msgstr "удалить триггер" -#: sql_help.c:5962 +#: sql_help.c:6016 msgid "remove a data type" msgstr "удалить тип данных" -#: sql_help.c:5974 +#: sql_help.c:6028 msgid "remove a user mapping for a foreign server" msgstr "удалить ÑопоÑтавление Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñтороннего Ñервера" -#: sql_help.c:5980 +#: sql_help.c:6034 msgid "remove a view" msgstr "удалить предÑтавление" -#: sql_help.c:5992 +#: sql_help.c:6046 msgid "execute a prepared statement" msgstr "выполнить подготовленный оператор" -#: sql_help.c:5998 +#: sql_help.c:6052 msgid "show the execution plan of a statement" msgstr "показать план Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°" -#: sql_help.c:6004 +#: sql_help.c:6058 msgid "retrieve rows from a query using a cursor" msgstr "получить результат запроÑа через курÑор" -#: sql_help.c:6010 +#: sql_help.c:6064 msgid "define access privileges" msgstr "определить права доÑтупа" -#: sql_help.c:6016 +#: sql_help.c:6070 msgid "import table definitions from a foreign server" msgstr "импортировать Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ† Ñо Ñтороннего Ñервера" -#: sql_help.c:6022 +#: sql_help.c:6076 msgid "create new rows in a table" msgstr "добавить Ñтроки в таблицу" -#: sql_help.c:6028 +#: sql_help.c:6082 msgid "listen for a notification" msgstr "ожидать уведомлениÑ" -#: sql_help.c:6034 +#: sql_help.c:6088 msgid "load a shared library file" msgstr "загрузить файл разделÑемой библиотеки" -#: sql_help.c:6040 +#: sql_help.c:6094 msgid "lock a table" msgstr "заблокировать таблицу" -#: sql_help.c:6046 +#: sql_help.c:6100 msgid "conditionally insert, update, or delete rows of a table" msgstr "добавление, изменение или удаление Ñтрок таблицы по уÑловию" -#: sql_help.c:6052 +#: sql_help.c:6106 msgid "position a cursor" msgstr "уÑтановить курÑор" -#: sql_help.c:6058 +#: sql_help.c:6112 msgid "generate a notification" msgstr "Ñгенерировать уведомление" -#: sql_help.c:6064 +#: sql_help.c:6118 msgid "prepare a statement for execution" msgstr "подготовить оператор Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ" -#: sql_help.c:6070 +#: sql_help.c:6124 msgid "prepare the current transaction for two-phase commit" msgstr "подготовить текущую транзакцию Ð´Ð»Ñ Ð´Ð²ÑƒÑ…Ñ„Ð°Ð·Ð½Ð¾Ð¹ фикÑации" -#: sql_help.c:6076 +#: sql_help.c:6130 msgid "change the ownership of database objects owned by a database role" msgstr "изменить владельца объектов БД, принадлежащих заданной роли" -#: sql_help.c:6082 +#: sql_help.c:6136 msgid "replace the contents of a materialized view" msgstr "заменить Ñодержимое материализованного предÑтавлениÑ" -#: sql_help.c:6088 +#: sql_help.c:6142 msgid "rebuild indexes" msgstr "переÑтроить индекÑÑ‹" -#: sql_help.c:6094 -msgid "destroy a previously defined savepoint" -msgstr "удалить ранее определённую точку ÑохранениÑ" +#: sql_help.c:6148 +msgid "release a previously defined savepoint" +msgstr "оÑвободить ранее определённую точку ÑохранениÑ" -#: sql_help.c:6100 +#: sql_help.c:6154 msgid "restore the value of a run-time parameter to the default value" msgstr "воÑÑтановить иÑходное значение параметра выполнениÑ" -#: sql_help.c:6106 +#: sql_help.c:6160 msgid "remove access privileges" msgstr "удалить права доÑтупа" -#: sql_help.c:6118 +#: sql_help.c:6172 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "отменить транзакцию, подготовленную ранее Ð´Ð»Ñ Ð´Ð²ÑƒÑ…Ñ„Ð°Ð·Ð½Ð¾Ð¹ фикÑации" -#: sql_help.c:6124 +#: sql_help.c:6178 msgid "roll back to a savepoint" msgstr "откатитьÑÑ Ðº точке ÑохранениÑ" -#: sql_help.c:6130 +#: sql_help.c:6184 msgid "define a new savepoint within the current transaction" msgstr "определить новую точку ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð² текущей транзакции" -#: sql_help.c:6136 +#: sql_help.c:6190 msgid "define or change a security label applied to an object" msgstr "задать или изменить метку безопаÑноÑти, применённую к объекту" -#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232 +#: sql_help.c:6196 sql_help.c:6250 sql_help.c:6286 msgid "retrieve rows from a table or view" msgstr "выбрать Ñтроки из таблицы или предÑтавлениÑ" -#: sql_help.c:6154 +#: sql_help.c:6208 msgid "change a run-time parameter" msgstr "изменить параметр выполнениÑ" -#: sql_help.c:6160 +#: sql_help.c:6214 msgid "set constraint check timing for the current transaction" msgstr "уÑтановить Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ ограничений Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ транзакции" -#: sql_help.c:6166 +#: sql_help.c:6220 msgid "set the current user identifier of the current session" msgstr "задать идентификатор текущего Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² текущем ÑеанÑе" -#: sql_help.c:6172 +#: sql_help.c:6226 msgid "" "set the session user identifier and the current user identifier of the " "current session" @@ -6645,31 +6822,31 @@ msgstr "" "задать идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÑеанÑа и идентификатор текущего " "Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² текущем ÑеанÑе" -#: sql_help.c:6178 +#: sql_help.c:6232 msgid "set the characteristics of the current transaction" msgstr "задать ÑвойÑтва текущей транзакции" -#: sql_help.c:6184 +#: sql_help.c:6238 msgid "show the value of a run-time parameter" msgstr "показать значение параметра выполнениÑ" -#: sql_help.c:6202 +#: sql_help.c:6256 msgid "empty a table or set of tables" msgstr "опуÑтошить таблицу или набор таблиц" -#: sql_help.c:6208 +#: sql_help.c:6262 msgid "stop listening for a notification" msgstr "прекратить ожидание уведомлений" -#: sql_help.c:6214 +#: sql_help.c:6268 msgid "update rows of a table" msgstr "изменить Ñтроки таблицы" -#: sql_help.c:6220 +#: sql_help.c:6274 msgid "garbage-collect and optionally analyze a database" msgstr "произвеÑти Ñборку муÑора и проанализировать базу данных" -#: sql_help.c:6226 +#: sql_help.c:6280 msgid "compute a set of rows" msgstr "получить набор Ñтрок" @@ -6712,7 +6889,7 @@ msgstr "лишний аргумент \"%s\" проигнорирован" msgid "could not find own program executable" msgstr "не удалоÑÑŒ найти Ñвой иÑполнÑемый файл" -#: tab-complete.c:5955 +#: tab-complete.c:6216 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6739,7 +6916,7 @@ msgstr "неправильное значение \"%s\" Ð´Ð»Ñ \"%s\": ожид msgid "invalid variable name: \"%s\"" msgstr "неправильное Ð¸Ð¼Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹: \"%s\"" -#: variables.c:419 +#: variables.c:418 #, c-format msgid "" "unrecognized value \"%s\" for \"%s\"\n" @@ -6748,6 +6925,40 @@ msgstr "" "нераÑпознанное значение \"%s\" Ð´Ð»Ñ \"%s\"\n" "ДопуÑтимые значениÑ: %s." +#~ msgid "ICU Locale" +#~ msgstr "локаль ICU" + +#~ msgid "local socket" +#~ msgstr "локальный Ñокет" + +#~ msgid "" +#~ " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n" +#~ msgstr "" +#~ " \\watch [[i=]СЕК] [c=N] повторÑть Ð·Ð°Ð¿Ñ€Ð¾Ñ Ñ‡ÐµÑ€ÐµÐ· заданное чиÑло Ñекунд, " +#~ "не\n" +#~ " более N раз\n" + +#~ msgid "constraint" +#~ msgstr "ограничение" + +#~ msgid "where constraint is:" +#~ msgstr "где ограничение:" + +#, c-format +#~ msgid "could not identify current directory: %m" +#~ msgstr "не удалоÑÑŒ определить текущий каталог: %m" + +#, c-format +#~ msgid "could not change directory to \"%s\": %m" +#~ msgstr "не удалоÑÑŒ перейти в каталог \"%s\": %m" + +#, c-format +#~ msgid "could not read symbolic link \"%s\": %m" +#~ msgstr "не удалоÑÑŒ прочитать ÑимволичеÑкую ÑÑылку \"%s\": %m" + +#~ msgid "Source code" +#~ msgstr "ИÑходный код" + #~ msgid "text" #~ msgstr "текÑÑ‚" @@ -6857,8 +7068,8 @@ msgstr "" #~ msgstr "Об ошибках Ñообщайте по адреÑу .\n" #~ msgid "" -#~ " \\g [FILE] or ; execute query (and send results to file or " -#~ "|pipe)\n" +#~ " \\g [FILE] or ; execute query (and send results to file or |" +#~ "pipe)\n" #~ msgstr "" #~ " \\g [ФÐЙЛ] или ; выполнить запроÑ\n" #~ " (и направить результаты в файл или канал |)\n" @@ -6901,8 +7112,8 @@ msgstr "" #~ msgid "No per-database role settings support in this server version.\n" #~ msgstr "" -#~ "Это верÑÐ¸Ñ Ñервера не поддерживает параметры ролей на уровне базы данных." -#~ "\n" +#~ "Это верÑÐ¸Ñ Ñервера не поддерживает параметры ролей на уровне базы " +#~ "данных.\n" #~ msgid "No matching settings found.\n" #~ msgstr "СоответÑтвующие параметры не найдены.\n" diff --git a/src/bin/psql/po/sv.po b/src/bin/psql/po/sv.po index c7e135e76e917..38ef29bff556a 100644 --- a/src/bin/psql/po/sv.po +++ b/src/bin/psql/po/sv.po @@ -1,15 +1,15 @@ # Swedish message translation file for psql # Peter Eisentraut , 2001, 2009, 2010. -# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023. +# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025. # # Use these quotes: "%s" # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-02-03 19:46+0000\n" -"PO-Revision-Date: 2023-03-09 22:34+0100\n" +"POT-Creation-Date: 2025-02-12 13:48+0000\n" +"PO-Revision-Date: 2025-02-12 20:57+0100\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -38,55 +38,60 @@ msgstr "detalj: " msgid "hint: " msgstr "tips: " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "kunde inte identifiera aktuell katalog: %m" +msgid "invalid binary \"%s\": %m" +msgstr "ogiltig binär \"%s\": %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "ogiltig binär \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "kunde inte läsa binär \"%s\": %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "kunde inte läsa binär \"%s\"" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "kunde inte hitta en \"%s\" att köra" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "kunde inte konvertera sökvägen \"%s\" till en absolut sökväg: %m" + +#: ../../common/exec.c:382 copy.c:326 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "kunde inte köra kommandot \"%s\": %m" + +#: ../../common/exec.c:394 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "kunde inte byta katalog till \"%s\": %m" +msgid "could not read from command \"%s\": %m" +msgstr "kunde inte läsa frÃ¥n kommando \"%s\": %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:397 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "kan inte läsa symbolisk länk \"%s\": %m" +msgid "no data was returned by command \"%s\"" +msgstr "ingen data returnerades frÃ¥n kommandot \"%s\"" -#: ../../common/exec.c:422 +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() misslyckades: %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: command.c:1321 command.c:3310 command.c:3359 command.c:3483 input.c:227 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: command.c:1373 command.c:3459 command.c:3508 command.c:3633 input.c:225 #: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "slut pÃ¥ minne" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "slut pÃ¥ minne\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" @@ -96,7 +101,7 @@ msgstr "kan inte duplicera null-pekare (internt fel)\n" msgid "could not look up effective user ID %ld: %s" msgstr "kunde inte slÃ¥ upp effektivt användar-id %ld: %s" -#: ../../common/username.c:45 command.c:575 +#: ../../common/username.c:45 command.c:616 msgid "user does not exist" msgstr "användaren finns inte" @@ -105,41 +110,41 @@ msgstr "användaren finns inte" msgid "user name lookup failure: error code %lu" msgstr "misslyckad sökning efter användarnamn: felkod %lu" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "kommandot är inte körbart" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "kommandot kan ej hittas" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "barnprocess avslutade med kod %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "barnprocess terminerades med avbrott 0x%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "barnprocess terminerades av signal %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "barnprocess avslutade med okänd statuskod %d" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "FörfrÃ¥gan om avbrytning skickad\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "Kunde inte skicka förfrÃ¥gan om avbrytning: " @@ -150,287 +155,342 @@ msgid_plural "(%lu rows)" msgstr[0] "(%lu rad)" msgstr[1] "(%lu rader)" -#: ../../fe_utils/print.c:3109 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "Avbruten\n" -#: ../../fe_utils/print.c:3173 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "Kan inte skriva ut tabellinnehÃ¥ll: antal celler %lld är lika med eller fler än maximala %lld.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Kan inte lägga till rubrik till tabellinnehÃ¥ll: antal kolumner (%d) överskridet.\n" -#: ../../fe_utils/print.c:3213 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "Kan inte lägga till cell till tabellinnehÃ¥ll: totala cellantalet (%d) överskridet.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "Kan inte lägga till cell till tabellinnehÃ¥ll: totala cellantalet %lld är överskridet.\n" -#: ../../fe_utils/print.c:3471 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "ogiltigt utdataformat (internt fel): %d" -#: ../../fe_utils/psqlscan.l:702 +#: ../../fe_utils/psqlscan.l:732 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "hoppar över rekursiv expandering av variabeln \"%s\"" -#: ../../port/thread.c:100 ../../port/thread.c:136 +#: ../../fe_utils/string_utils.c:608 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "shell-kommandots argument innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:781 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "databasnamnet innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: ../../port/user.c:43 ../../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "kunde inte slÃ¥ upp lokalt användar-id %d: %s" -#: ../../port/thread.c:105 ../../port/thread.c:141 +#: ../../port/user.c:48 ../../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "lokal användare med ID %d existerar inte" -#: command.c:232 +#: command.c:235 #, c-format msgid "invalid command \\%s" msgstr "ogiltigt kommando \\%s" -#: command.c:234 +#: command.c:237 #, c-format msgid "Try \\? for help." msgstr "Försök med \\? för hjälp." -#: command.c:252 +#: command.c:255 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: extra argument \"%s\" ignorerat" -#: command.c:304 +#: command.c:307 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "kommandot \\%s ignorerat; använd \\endif eller Ctrl-C för att avsluta nuvarande \\if-block" -#: command.c:573 +#: command.c:614 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "kunde inte hämta hemkatalog för användar-ID %ld: %s" -#: command.c:592 +#: command.c:633 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: kunde inte byta katalog till \"%s\": %m" -#: command.c:617 +#: command.c:657 #, c-format msgid "You are currently not connected to a database.\n" msgstr "Du är för närvarande inte uppkopplad mot en databas.\n" -#: command.c:627 +#: command.c:667 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Du är uppkopplad upp mot databas \"%s\" som användare \"%s\" pÃ¥ adress \"%s\" pÃ¥ port \"%s\".\n" -#: command.c:630 +#: command.c:670 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Du är uppkopplad mot databas \"%s\" som användare \"%s\" via uttag i \"%s\" pÃ¥ port \"%s\".\n" -#: command.c:636 +#: command.c:676 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Du är uppkopplad upp mot databas \"%s\" som användare \"%s\" pÃ¥ värd \"%s\" (adress \"%s\") pÃ¥ port \"%s\".\n" -#: command.c:639 +#: command.c:679 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Du är uppkopplad upp mot databas \"%s\" som användare \"%s\" pÃ¥ värd \"%s\" pÃ¥ port \"%s\".\n" -#: command.c:1030 command.c:1125 command.c:2654 +#: command.c:1069 command.c:1170 command.c:2676 #, c-format msgid "no query buffer" msgstr "ingen frÃ¥gebuffert" -#: command.c:1063 command.c:5491 +#: command.c:1102 command.c:5779 #, c-format msgid "invalid line number: %s" msgstr "ogiltigt radnummer: %s" -#: command.c:1203 +#: command.c:1248 msgid "No changes" msgstr "Inga ändringar" -#: command.c:1282 +#: command.c:1333 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: ogiltigt kodningsnamn eller konverteringsprocedur hittades inte" -#: command.c:1317 command.c:2120 command.c:3306 command.c:3505 command.c:5597 -#: common.c:181 common.c:230 common.c:399 common.c:1082 common.c:1100 -#: common.c:1174 common.c:1281 common.c:1319 common.c:1407 common.c:1443 -#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 -#: large_obj.c:254 startup.c:304 +#: command.c:1369 command.c:2158 command.c:3455 command.c:3653 command.c:5885 +#: common.c:221 common.c:270 common.c:440 common.c:1142 common.c:1160 +#: common.c:1228 common.c:1340 common.c:1378 common.c:1475 common.c:1541 +#: copy.c:486 copy.c:722 large_obj.c:157 large_obj.c:192 large_obj.c:254 +#: startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1324 +#: command.c:1376 msgid "There is no previous error." msgstr "Det finns inget tidigare fel." -#: command.c:1437 +#: command.c:1489 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: saknar höger parentes" -#: command.c:1521 command.c:1651 command.c:1956 command.c:1970 command.c:1989 -#: command.c:2173 command.c:2415 command.c:2621 command.c:2661 +#: command.c:1573 command.c:1692 command.c:1996 command.c:2010 command.c:2029 +#: command.c:2197 command.c:2438 command.c:2643 command.c:2683 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: obligatoriskt argument saknas" -#: command.c:1782 +#: command.c:1823 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: kan inte komma efter \\else" -#: command.c:1787 +#: command.c:1828 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: ingen matchande \\if" -#: command.c:1851 +#: command.c:1892 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: kan inte komma efter \\else" -#: command.c:1856 +#: command.c:1897 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: ingen matchande \\if" -#: command.c:1896 +#: command.c:1937 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: ingen matchande \\if" -#: command.c:2053 +#: command.c:2093 msgid "Query buffer is empty." msgstr "FrÃ¥gebufferten är tom." -#: command.c:2096 +#: command.c:2136 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Mata in nytt lösenord för användare \"%s\": " -#: command.c:2100 +#: command.c:2140 msgid "Enter it again: " msgstr "Mata in det igen: " -#: command.c:2109 +#: command.c:2149 #, c-format msgid "Passwords didn't match." msgstr "Lösenorden stämde inte överens." -#: command.c:2208 +#: command.c:2232 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: kunde inte läsa värde pÃ¥ varibeln" -#: command.c:2311 +#: command.c:2334 msgid "Query buffer reset (cleared)." msgstr "FrÃ¥gebufferten har blivit borttagen." -#: command.c:2333 +#: command.c:2356 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Skrev historiken till fil \"%s\".\n" -#: command.c:2420 +#: command.c:2443 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: omgivningsvariabelnamn fÃ¥r ej innehÃ¥lla \"=\"" -#: command.c:2468 +#: command.c:2491 #, c-format msgid "function name is required" msgstr "funktionsnamn krävs" -#: command.c:2470 +#: command.c:2493 #, c-format msgid "view name is required" msgstr "vynamn krävs" -#: command.c:2593 +#: command.c:2615 msgid "Timing is on." msgstr "Tidtagning är pÃ¥." -#: command.c:2595 +#: command.c:2617 msgid "Timing is off." msgstr "Tidtagning är av." -#: command.c:2680 command.c:2708 command.c:3946 command.c:3949 command.c:3952 -#: command.c:3958 command.c:3960 command.c:3986 command.c:3996 command.c:4008 -#: command.c:4022 command.c:4049 command.c:4107 common.c:77 copy.c:331 -#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 +#: command.c:2703 command.c:2741 command.c:4166 command.c:4169 command.c:4172 +#: command.c:4178 command.c:4180 command.c:4206 command.c:4216 command.c:4228 +#: command.c:4242 command.c:4269 command.c:4327 common.c:77 copy.c:329 +#: copy.c:401 psqlscanslash.l:805 psqlscanslash.l:817 psqlscanslash.l:835 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:3107 startup.c:243 startup.c:293 +#: command.c:2730 copy.c:388 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: command.c:2802 command.c:2868 +#, c-format +msgid "\\watch: interval value is specified more than once" +msgstr "\\watch: värde pÃ¥ intervall angivet mer än en gÃ¥ng" + +#: command.c:2812 command.c:2878 +#, c-format +msgid "\\watch: incorrect interval value \"%s\"" +msgstr "\\watch: inkorrekt intervallvärde \"%s\"" + +#: command.c:2822 +#, c-format +msgid "\\watch: iteration count is specified more than once" +msgstr "\\watch: iterationsantal angivet mer än en gÃ¥ng" + +#: command.c:2832 +#, c-format +msgid "\\watch: incorrect iteration count \"%s\"" +msgstr "\\watch: inkorrekt iterationsantal \"%s\"" + +#: command.c:2842 +#, c-format +msgid "\\watch: minimum row count specified more than once" +msgstr "\\watch: minsta radantal angivet mer än en gÃ¥ng" + +#: command.c:2852 +#, c-format +msgid "\\watch: incorrect minimum row count \"%s\"" +msgstr "\\watch: inkorrekt minsta radantal \"%s\"" + +#: command.c:2859 +#, c-format +msgid "\\watch: unrecognized parameter \"%s\"" +msgstr "\\watch: okänd parameter \"%s\"" + +#: command.c:3256 startup.c:243 startup.c:293 msgid "Password: " msgstr "Lösenord: " -#: command.c:3112 startup.c:290 +#: command.c:3261 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Lösenord för användare %s: " -#: command.c:3168 +#: command.c:3317 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "Ange inte användare, värd eller port separat tillsammans med en anslutningssträng" -#: command.c:3203 +#: command.c:3352 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "Det finns ingen anslutning att Ã¥teranvända parametrar frÃ¥n" -#: command.c:3511 +#: command.c:3659 #, c-format msgid "Previous connection kept" msgstr "FöregÃ¥ende anslutning bevarad" -#: command.c:3517 +#: command.c:3665 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3573 +#: command.c:3721 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" pÃ¥ adress \"%s\" pÃ¥ port \"%s\".\n" -#: command.c:3576 +#: command.c:3724 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" via uttag i \"%s\" pÃ¥ port \"%s\".\n" -#: command.c:3582 +#: command.c:3730 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" pÃ¥ värd \"%s\" (adress \"%s\") pÃ¥ port \"%s\".\n" -#: command.c:3585 +#: command.c:3733 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\" pÃ¥ värd \"%s\" pÃ¥ port \"%s\".\n" -#: command.c:3590 +#: command.c:3738 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Du är nu uppkopplad mot databasen \"%s\" som användare \"%s\".\n" -#: command.c:3630 +#: command.c:3844 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, server %s)\n" -#: command.c:3643 +#: command.c:3857 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -439,29 +499,33 @@ msgstr "" "VARNING: %s huvudversion %s, server huvudversion %s.\n" " En del psql-finesser kommer kanske inte fungera.\n" -#: command.c:3680 +#: command.c:3896 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" -msgstr "SSL-anslutning (protokoll: %s, krypto: %s, komprimering: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s, ALPN: %s)\n" +msgstr "SSL-anslutning (protokoll: %s, krypto: %s, komprimering: %s, ALPN: %s)\n" -#: command.c:3681 command.c:3682 +#: command.c:3897 command.c:3898 msgid "unknown" msgstr "okänd" -#: command.c:3683 help.c:42 +#: command.c:3899 help.c:42 msgid "off" msgstr "av" -#: command.c:3683 help.c:42 +#: command.c:3899 help.c:42 msgid "on" msgstr "pÃ¥" -#: command.c:3697 +#: command.c:3900 +msgid "none" +msgstr "ingen" + +#: command.c:3914 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPI-krypterad anslutning\n" -#: command.c:3717 +#: command.c:3934 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -472,418 +536,438 @@ msgstr "" " 8-bitars tecken kommer troligen inte fungera korrekt. Se psql:s\n" " referensmanual i sektionen \"Notes for Windows users\" för mer detaljer.\n" -#: command.c:3822 +#: command.c:4041 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "omgivningsvariabeln PSQL_EDITOR_LINENUMBER_ARG mÃ¥ste ange ett radnummer" -#: command.c:3851 +#: command.c:4071 #, c-format msgid "could not start editor \"%s\"" msgstr "kunde inte starta editorn \"%s\"" -#: command.c:3853 +#: command.c:4073 #, c-format msgid "could not start /bin/sh" msgstr "kunde inte starta /bin/sh" -#: command.c:3903 +#: command.c:4123 #, c-format msgid "could not locate temporary directory: %s" msgstr "kunde inte hitta temp-katalog: %s" -#: command.c:3930 +#: command.c:4150 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "kunde inte öppna temporär fil \"%s\": %m" -#: command.c:4266 +#: command.c:4486 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: tvetydig förkortning \"%s\" matchar bÃ¥de \"%s\" och \"%s\"" -#: command.c:4286 +#: command.c:4506 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset: tillÃ¥tna format är aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:4305 +#: command.c:4525 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: tillÃ¥tna linjestilar är ascii, old-ascii, unicode" -#: command.c:4320 +#: command.c:4540 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: tillÃ¥tna Unicode-ramstilar är single, double" -#: command.c:4335 +#: command.c:4555 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: tillÃ¥tna Unicode-kolumnlinjestilar ärsingle, double" -#: command.c:4350 +#: command.c:4570 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: tillÃ¥tna Unicode-rubriklinjestilar är single, double" -#: command.c:4393 +#: command.c:4622 +#, c-format +msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width" +msgstr "\\pset: tillÃ¥tna värden pÃ¥ xheader_width är \"%s\" (standard), \"%s\", \"%s\" eller ett tal som anger exakt vidd" + +#: command.c:4639 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep mÃ¥ste vara ett ensamt en-byte-tecken" -#: command.c:4398 +#: command.c:4644 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldset kan inte vara dubbelcitat, nyrad eller vagnretur" -#: command.c:4535 command.c:4723 +#: command.c:4782 command.c:4983 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: okänd parameter: %s" -#: command.c:4555 +#: command.c:4802 #, c-format msgid "Border style is %d.\n" msgstr "Ramstil är %d.\n" -#: command.c:4561 +#: command.c:4808 #, c-format msgid "Target width is unset.\n" msgstr "MÃ¥lvidd är inte satt.\n" -#: command.c:4563 +#: command.c:4810 #, c-format msgid "Target width is %d.\n" msgstr "MÃ¥lvidd är %d.\n" -#: command.c:4570 +#: command.c:4817 #, c-format msgid "Expanded display is on.\n" msgstr "Utökad visning är pÃ¥.\n" -#: command.c:4572 +#: command.c:4819 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Utökad visning används automatiskt.\n" -#: command.c:4574 +#: command.c:4821 #, c-format msgid "Expanded display is off.\n" msgstr "Utökad visning är av.\n" -#: command.c:4580 +#: command.c:4828 command.c:4830 command.c:4832 +#, c-format +msgid "Expanded header width is \"%s\".\n" +msgstr "Expanderad rubrikvidd är \"%s\".\n" + +#: command.c:4834 +#, c-format +msgid "Expanded header width is %d.\n" +msgstr "Expanderad rubrikvidd är %d.\n" + +#: command.c:4840 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Fältseparatorn för CSV är \"%s\".\n" -#: command.c:4588 command.c:4596 +#: command.c:4848 command.c:4856 #, c-format msgid "Field separator is zero byte.\n" msgstr "Fältseparatorn är noll-byte.\n" -#: command.c:4590 +#: command.c:4850 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Fältseparatorn är \"%s\".\n" -#: command.c:4603 +#: command.c:4863 #, c-format msgid "Default footer is on.\n" msgstr "Standard sidfot är pÃ¥.\n" -#: command.c:4605 +#: command.c:4865 #, c-format msgid "Default footer is off.\n" msgstr "Standard sidfot är av.\n" -#: command.c:4611 +#: command.c:4871 #, c-format msgid "Output format is %s.\n" msgstr "Utdataformatet är \"%s\".\n" -#: command.c:4617 +#: command.c:4877 #, c-format msgid "Line style is %s.\n" msgstr "Linjestil är %s.\n" -#: command.c:4624 +#: command.c:4884 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null-visare är \"%s\".\n" -#: command.c:4632 +#: command.c:4892 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Lokal-anpassad numerisk utdata är pÃ¥.\n" -#: command.c:4634 +#: command.c:4894 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Lokal-anpassad numerisk utdata är av.\n" -#: command.c:4641 +#: command.c:4901 #, c-format msgid "Pager is used for long output.\n" msgstr "Siduppdelare är pÃ¥ för lÃ¥ng utdata.\n" -#: command.c:4643 +#: command.c:4903 #, c-format msgid "Pager is always used.\n" msgstr "Siduppdelare används alltid.\n" -#: command.c:4645 +#: command.c:4905 #, c-format msgid "Pager usage is off.\n" msgstr "Siduppdelare är av.\n" -#: command.c:4651 +#: command.c:4911 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" msgstr[0] "Siduppdelare kommer inte användas för färre än %d linje.\n" msgstr[1] "Siduppdelare kommer inte användas för färre än %d linjer.\n" -#: command.c:4661 command.c:4671 +#: command.c:4921 command.c:4931 #, c-format msgid "Record separator is zero byte.\n" msgstr "Postseparatorn är noll-byte.\n" -#: command.c:4663 +#: command.c:4923 #, c-format msgid "Record separator is .\n" msgstr "Postseparatorn är .\n" -#: command.c:4665 +#: command.c:4925 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Postseparatorn är \"%s\".\n" -#: command.c:4678 +#: command.c:4938 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Tabellattributen är \"%s\".\n" -#: command.c:4681 +#: command.c:4941 #, c-format msgid "Table attributes unset.\n" msgstr "Tabellattributen är ej satta.\n" -#: command.c:4688 +#: command.c:4948 #, c-format msgid "Title is \"%s\".\n" msgstr "Titeln är \"%s\".\n" -#: command.c:4690 +#: command.c:4950 #, c-format msgid "Title is unset.\n" msgstr "Titeln är inte satt.\n" -#: command.c:4697 +#: command.c:4957 #, c-format msgid "Tuples only is on.\n" msgstr "Visa bara tupler är pÃ¥.\n" -#: command.c:4699 +#: command.c:4959 #, c-format msgid "Tuples only is off.\n" msgstr "Visa bara tupler är av.\n" -#: command.c:4705 +#: command.c:4965 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Unicode-ramstil är \"%s\".\n" -#: command.c:4711 +#: command.c:4971 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Unicode-kolumnLinjestil är \"%s\".\n" -#: command.c:4717 +#: command.c:4977 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Unicode-rubriklinjestil är \"%s\".\n" -#: command.c:4950 +#: command.c:5226 #, c-format msgid "\\!: failed" msgstr "\\!: misslyckades" -#: command.c:4984 +#: command.c:5264 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch kan inte användas pÃ¥ en tom frÃ¥ga" -#: command.c:5016 +#: command.c:5296 #, c-format msgid "could not set timer: %m" msgstr "kunde inte sätta timer: %m" -#: command.c:5078 +#: command.c:5365 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (varje %gs)\n" -#: command.c:5081 +#: command.c:5368 #, c-format msgid "%s (every %gs)\n" msgstr "%s (varje %gs)\n" -#: command.c:5142 +#: command.c:5432 #, c-format msgid "could not wait for signals: %m" msgstr "kunde inte vänta pÃ¥ signaler: %m" -#: command.c:5200 command.c:5207 common.c:572 common.c:579 common.c:1063 +#: command.c:5488 command.c:5495 common.c:632 common.c:639 common.c:1123 #, c-format msgid "" -"********* QUERY **********\n" +"/******** QUERY *********/\n" "%s\n" -"**************************\n" +"/************************/\n" "\n" msgstr "" -"********* FRÃ…GA **********\n" +"/******** FRÃ…GA *********/\n" "%s\n" -"**************************\n" +"/************************/\n" "\n" -#: command.c:5386 +#: command.c:5674 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" är inte en vy" -#: command.c:5402 +#: command.c:5690 #, c-format msgid "could not parse reloptions array" msgstr "kunde inte parsa arrayen reloptions" -#: common.c:166 +#: common.c:206 #, c-format msgid "cannot escape without active connection" msgstr "kan inte escape:a utan en aktiv uppkoppling" -#: common.c:207 +#: common.c:247 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "shell-kommandots argument innehÃ¥ller nyrad eller vagnretur: \"%s\"" -#: common.c:311 +#: common.c:351 #, c-format msgid "connection to server was lost" msgstr "uppkopplingen till servern har brutits" -#: common.c:315 +#: common.c:355 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "Anslutningen till servern har brutits. Försöker starta om: " -#: common.c:320 +#: common.c:360 #, c-format msgid "Failed.\n" msgstr "Misslyckades.\n" -#: common.c:337 +#: common.c:377 #, c-format msgid "Succeeded.\n" msgstr "Lyckades.\n" -#: common.c:389 common.c:1001 +#: common.c:430 common.c:1061 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "oväntad PQresultStatus: %d" -#: common.c:511 +#: common.c:571 #, c-format msgid "Time: %.3f ms\n" msgstr "Tid: %.3f ms\n" -#: common.c:526 +#: common.c:586 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "Tid: %.3f ms (%02d:%06.3f)\n" -#: common.c:535 +#: common.c:595 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "Tid: %.3f ms (%02d:%02d:%06.3f)\n" -#: common.c:542 +#: common.c:602 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "Tid: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:566 common.c:623 common.c:1034 describe.c:6135 +#: common.c:626 common.c:683 common.c:1094 describe.c:6192 #, c-format msgid "You are currently not connected to a database." msgstr "Du är för närvarande inte uppkopplad mot en databas." -#: common.c:654 +#: common.c:714 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "Asynkron notificering \"%s\" mottagen med innehÃ¥ll \"%s\" frÃ¥n serverprocess med PID %d.\n" -#: common.c:657 +#: common.c:717 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "Asynkron notificering \"%s\" mottagen frÃ¥n serverprocess med PID %d.\n" -#: common.c:688 +#: common.c:748 #, c-format msgid "could not print result table: %m" msgstr "kunde inte visa resultatabell: %m" -#: common.c:708 +#: common.c:768 #, c-format msgid "no rows returned for \\gset" msgstr "inga rader returnerades för \\gset" -#: common.c:713 +#: common.c:773 #, c-format msgid "more than one row returned for \\gset" msgstr "mer än en rad returnerades för \\gset" -#: common.c:731 +#: common.c:791 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "försök att utföra \\gset in i en speciellt hanterad variabel \"%s\" hoppas över" -#: common.c:1043 +#: common.c:1103 #, c-format msgid "" -"***(Single step mode: verify command)*******************************************\n" +"/**(Single step mode: verify command)******************************************/\n" "%s\n" -"***(press return to proceed or enter x and return to cancel)********************\n" +"/**(press return to proceed or enter x and return to cancel)*******************/\n" msgstr "" -"***(Stegningsläge: Verifiera kommando)*******************************************\n" +"/**(Stegningsläge: verifiera kommando)*****************************************/\n" "%s\n" -"***(tryck return för att fortsätta eller skriv x och return för att avbryta)*****\n" +"/**(tryck return för att fortsätta eller skriv x och return för att avbryta)***/\n" -#: common.c:1126 +#: common.c:1180 #, c-format msgid "STATEMENT: %s" msgstr "SATS: %s" -#: common.c:1162 +#: common.c:1216 #, c-format msgid "unexpected transaction status (%d)" msgstr "oväntad transaktionsstatus (%d)" -#: common.c:1303 describe.c:2020 +#: common.c:1362 describe.c:2025 msgid "Column" msgstr "Kolumn" -#: common.c:1304 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 -#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 -#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 -#: describe.c:5767 +#: common.c:1363 describe.c:169 describe.c:355 describe.c:373 describe.c:1043 +#: describe.c:1201 describe.c:1731 describe.c:1755 describe.c:2026 +#: describe.c:3956 describe.c:4167 describe.c:4404 describe.c:4564 +#: describe.c:5829 msgid "Type" msgstr "Typ" -#: common.c:1353 +#: common.c:1412 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "Kommandot hade inget resultat eller sÃ¥ hade resultatet inga kolumner.\n" +#: common.c:1504 +#, c-format +msgid "fetching results in chunked mode failed" +msgstr "hämta resultat i chunk-läge misslyckades" + #: copy.c:98 #, c-format msgid "\\copy: arguments required" @@ -899,46 +983,36 @@ msgstr "\\copy: parsfel vid \"%s\"" msgid "\\copy: parse error at end of line" msgstr "\\copy: parsfel vid radslutet" -#: copy.c:328 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "kunde inte köra kommandot \"%s\": %m" - -#: copy.c:344 +#: copy.c:342 #, c-format msgid "could not stat file \"%s\": %m" msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" -#: copy.c:348 +#: copy.c:346 #, c-format msgid "%s: cannot copy from/to a directory" msgstr "%s: kan inte kopiera frÃ¥n/till en katalog" -#: copy.c:385 +#: copy.c:383 #, c-format msgid "could not close pipe to external command: %m" msgstr "kunde inte stänga rör till externt komamndo: %m" -#: copy.c:390 -#, c-format -msgid "%s: %s" -msgstr "%s: %s" - -#: copy.c:453 copy.c:463 +#: copy.c:451 copy.c:461 #, c-format msgid "could not write COPY data: %m" msgstr "kunde inte skriva COPY-data: %m" -#: copy.c:469 +#: copy.c:467 #, c-format msgid "COPY data transfer failed: %s" msgstr "COPY-överföring av data misslyckades: %s" -#: copy.c:530 +#: copy.c:528 msgid "canceled by user" msgstr "avbruten av användaren" -#: copy.c:541 +#: copy.c:539 msgid "" "Enter data to be copied followed by a newline.\n" "End with a backslash and a period on a line by itself, or an EOF signal." @@ -954,783 +1028,780 @@ msgstr "avbruten pÃ¥ grund av läsfel" msgid "trying to exit copy mode" msgstr "försöker avsluta kopieringsläge" -#: crosstabview.c:123 +#: crosstabview.c:124 #, c-format msgid "\\crosstabview: statement did not return a result set" msgstr "\\crosstabview: satsen returnerade ingen resultatmängd" -#: crosstabview.c:129 +#: crosstabview.c:130 #, c-format msgid "\\crosstabview: query must return at least three columns" msgstr "\\crosstabview: frÃ¥gan mÃ¥ste returnera minst tre kolumner" -#: crosstabview.c:156 +#: crosstabview.c:157 #, c-format msgid "\\crosstabview: vertical and horizontal headers must be different columns" msgstr "\\crosstabview: vertikala och horisontala rubriker mÃ¥ste vara olika kolumner" -#: crosstabview.c:172 +#: crosstabview.c:173 #, c-format msgid "\\crosstabview: data column must be specified when query returns more than three columns" msgstr "\\crosstabview: datakolumn mÃ¥ste anges när frÃ¥gan returnerar mer än tre kolumner" -#: crosstabview.c:228 +#: crosstabview.c:229 #, c-format msgid "\\crosstabview: maximum number of columns (%d) exceeded" msgstr "\\crosstabview: maximalt antal kolumner (%d) överskridet" -#: crosstabview.c:397 +#: crosstabview.c:398 #, c-format msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" msgstr "\\crosstabview: frÃ¥geresultatet innehÃ¥ller multipla värden för rad \"%s\", kolumn \"%s\"" -#: crosstabview.c:645 +#: crosstabview.c:646 #, c-format msgid "\\crosstabview: column number %d is out of range 1..%d" msgstr "\\crosstabview: kolumnnummer %d är utanför giltigt intervall 1..%d" -#: crosstabview.c:670 +#: crosstabview.c:671 #, c-format msgid "\\crosstabview: ambiguous column name: \"%s\"" msgstr "\\crosstabview: tvetydigt kolumnnamn: \"%s\"" -#: crosstabview.c:678 +#: crosstabview.c:679 #, c-format msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: hittar ej kolumnnamn: \"%s\"" -#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 -#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 -#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 -#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 -#: describe.c:5477 describe.c:5881 describe.c:5959 +#: describe.c:87 describe.c:335 describe.c:626 describe.c:802 describe.c:1035 +#: describe.c:1190 describe.c:1264 describe.c:3945 describe.c:4154 +#: describe.c:4402 describe.c:4483 describe.c:4715 describe.c:4921 +#: describe.c:5165 describe.c:5406 describe.c:5475 describe.c:5486 +#: describe.c:5542 describe.c:5941 describe.c:6018 msgid "Schema" msgstr "Schema" -#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 -#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 -#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 -#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 -#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 -#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 -#: describe.c:5957 describe.c:6186 describe.c:6494 +#: describe.c:88 describe.c:166 describe.c:227 describe.c:336 describe.c:627 +#: describe.c:803 describe.c:924 describe.c:1036 describe.c:1265 +#: describe.c:3946 describe.c:4155 describe.c:4319 describe.c:4403 +#: describe.c:4484 describe.c:4645 describe.c:4716 describe.c:4922 +#: describe.c:5038 describe.c:5166 describe.c:5407 describe.c:5476 +#: describe.c:5487 describe.c:5543 describe.c:5740 describe.c:5810 +#: describe.c:6016 describe.c:6243 describe.c:6551 msgid "Name" msgstr "Namn" -#: describe.c:89 describe.c:351 describe.c:369 +#: describe.c:89 describe.c:348 describe.c:366 msgid "Result data type" msgstr "Resultatdatatyp" -#: describe.c:90 describe.c:352 describe.c:370 +#: describe.c:90 describe.c:349 describe.c:367 msgid "Argument data types" msgstr "Argumentdatatyp" -#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 -#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 -#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 -#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 -#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 -#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 -#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 -#: describe.c:5960 describe.c:6992 +#: describe.c:98 describe.c:105 describe.c:177 describe.c:241 describe.c:415 +#: describe.c:658 describe.c:818 describe.c:972 describe.c:1267 describe.c:2046 +#: describe.c:3676 describe.c:4000 describe.c:4201 describe.c:4343 +#: describe.c:4416 describe.c:4493 describe.c:4658 describe.c:4834 +#: describe.c:4975 describe.c:5047 describe.c:5167 describe.c:5317 +#: describe.c:5358 describe.c:5423 describe.c:5479 describe.c:5488 +#: describe.c:5544 describe.c:5758 describe.c:5832 describe.c:5955 +#: describe.c:6019 describe.c:7078 msgid "Description" msgstr "Beskrivning" -#: describe.c:128 +#: describe.c:127 msgid "List of aggregate functions" msgstr "Lista med aggregatfunktioner" -#: describe.c:153 +#: describe.c:152 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Servern (version %s) stöder inte accessmetoder." -#: describe.c:168 +#: describe.c:167 msgid "Index" msgstr "Index" -#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 +#: describe.c:168 describe.c:3964 describe.c:4180 describe.c:5942 msgid "Table" msgstr "Tabell" -#: describe.c:177 describe.c:5679 +#: describe.c:176 describe.c:5742 msgid "Handler" msgstr "Hanterare" -#: describe.c:201 +#: describe.c:199 msgid "List of access methods" msgstr "Lista med accessmetoder" -#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 -#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 -#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 -#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 -#: describe.c:6980 +#: describe.c:228 describe.c:401 describe.c:651 describe.c:925 describe.c:1189 +#: describe.c:3957 describe.c:4156 describe.c:4320 describe.c:4647 +#: describe.c:5039 describe.c:5741 describe.c:5811 describe.c:6244 +#: describe.c:6431 describe.c:6552 describe.c:6722 describe.c:6807 +#: describe.c:7066 msgid "Owner" msgstr "Ägare" -#: describe.c:231 +#: describe.c:229 msgid "Location" msgstr "Plats" -#: describe.c:241 describe.c:3509 +#: describe.c:239 describe.c:3517 describe.c:3857 msgid "Options" msgstr "Alternativ" -#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 +#: describe.c:240 describe.c:649 describe.c:970 describe.c:3999 msgid "Size" msgstr "Storlek" -#: describe.c:266 +#: describe.c:263 msgid "List of tablespaces" msgstr "Lista med tabellutrymmen" -#: describe.c:311 +#: describe.c:308 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df tar bara [anptwS+] som flaggor" -#: describe.c:319 +#: describe.c:316 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df tar inte en \"%c\"-flagga med serverversion %s" #. translator: "agg" is short for "aggregate" -#: describe.c:354 describe.c:372 +#: describe.c:351 describe.c:369 msgid "agg" msgstr "agg" -#: describe.c:355 describe.c:373 +#: describe.c:352 describe.c:370 msgid "window" msgstr "fönster" -#: describe.c:356 +#: describe.c:353 msgid "proc" msgstr "proc" -#: describe.c:357 describe.c:375 +#: describe.c:354 describe.c:372 msgid "func" msgstr "funk" # Vi väljer att bevara den engelska termen dÃ¥ det dels refererar till kommandot CREATE TRIGGER # och dels för att detta begreppet normalt benäms som triggers i dagligt tal i Sverige. -#: describe.c:374 describe.c:1390 +#: describe.c:371 describe.c:1397 msgid "trigger" msgstr "trigger" # Vi väljer att bevara den engelska termen dÃ¥ det refererar till en del av CREATE FUNCTION-syntaxen -#: describe.c:386 +#: describe.c:383 msgid "immutable" msgstr "immutable" # Vi väljer att bevara den engelska termen dÃ¥ det refererar till en del av CREATE FUNCTION-syntaxen -#: describe.c:387 +#: describe.c:384 msgid "stable" msgstr "stable" # Vi väljer att bevara den engelska termen dÃ¥ det refererar till en del av CREATE FUNCTION-syntaxen -#: describe.c:388 +#: describe.c:385 msgid "volatile" msgstr "volatile" -#: describe.c:389 +#: describe.c:386 msgid "Volatility" msgstr "Flyktighet" -#: describe.c:397 +#: describe.c:394 msgid "restricted" msgstr "begränsad" -#: describe.c:398 +#: describe.c:395 msgid "safe" msgstr "säker" -#: describe.c:399 +#: describe.c:396 msgid "unsafe" msgstr "osäker" -#: describe.c:400 +#: describe.c:397 msgid "Parallel" msgstr "Parallell" -#: describe.c:405 +#: describe.c:402 msgid "definer" msgstr "definierare" -#: describe.c:406 +#: describe.c:403 msgid "invoker" msgstr "anropare" -#: describe.c:407 +#: describe.c:404 msgid "Security" msgstr "Säkerhet" -#: describe.c:412 +#: describe.c:409 msgid "Language" msgstr "SprÃ¥k" -#: describe.c:416 describe.c:420 -msgid "Source code" -msgstr "Källkod" +#: describe.c:412 describe.c:648 +msgid "Internal name" +msgstr "Internt namn" -#: describe.c:594 +#: describe.c:585 msgid "List of functions" msgstr "Lista med funktioner" -#: describe.c:657 -msgid "Internal name" -msgstr "Internt namn" - -#: describe.c:659 +#: describe.c:650 msgid "Elements" msgstr "Element" -#: describe.c:711 +#: describe.c:701 msgid "List of data types" msgstr "Lista med datatyper" -#: describe.c:814 +#: describe.c:804 msgid "Left arg type" msgstr "Vänster argumenttyp" -#: describe.c:815 +#: describe.c:805 msgid "Right arg type" msgstr "Höger argumenttyp" -#: describe.c:816 +#: describe.c:806 msgid "Result type" msgstr "Resultattyp" -#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 -#: describe.c:6909 describe.c:6913 +#: describe.c:811 describe.c:4653 describe.c:4817 describe.c:5316 +#: describe.c:6996 describe.c:7000 msgid "Function" msgstr "Funktion" -#: describe.c:902 +#: describe.c:891 msgid "List of operators" msgstr "Lista med operatorer" -#: describe.c:938 +#: describe.c:926 msgid "Encoding" msgstr "Kodning" -#: describe.c:939 describe.c:4868 +#: describe.c:930 describe.c:934 +msgid "Locale Provider" +msgstr "Lokalleverantör" + +#: describe.c:938 describe.c:4936 msgid "Collate" msgstr "Jämförelse" -#: describe.c:940 describe.c:4869 +#: describe.c:939 describe.c:4937 msgid "Ctype" msgstr "Ctype" -#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 -msgid "ICU Locale" -msgstr "ICU-lokal" +#: describe.c:943 describe.c:947 describe.c:951 describe.c:4942 describe.c:4946 +#: describe.c:4950 +msgid "Locale" +msgstr "Lokal" -#: describe.c:946 describe.c:952 -msgid "Locale Provider" -msgstr "Lokalleverantör" +#: describe.c:955 describe.c:959 describe.c:4955 describe.c:4959 +msgid "ICU Rules" +msgstr "ICU-regler" -#: describe.c:964 +#: describe.c:971 msgid "Tablespace" msgstr "Tabellutrymme" -#: describe.c:990 +#: describe.c:996 msgid "List of databases" msgstr "Lista med databaser" -#: describe.c:1031 describe.c:1184 describe.c:3882 +#: describe.c:1037 describe.c:1192 describe.c:3947 msgid "table" msgstr "tabell" -#: describe.c:1032 describe.c:3883 +#: describe.c:1038 describe.c:3948 msgid "view" msgstr "vy" -#: describe.c:1033 describe.c:3884 +#: describe.c:1039 describe.c:3949 msgid "materialized view" msgstr "materialiserad vy" -#: describe.c:1034 describe.c:1186 describe.c:3886 +#: describe.c:1040 describe.c:1194 describe.c:3951 msgid "sequence" msgstr "sekvens" -#: describe.c:1035 describe.c:3888 +#: describe.c:1041 describe.c:3953 msgid "foreign table" msgstr "främmande tabell" -#: describe.c:1036 describe.c:3889 describe.c:4101 +#: describe.c:1042 describe.c:3954 describe.c:4165 msgid "partitioned table" msgstr "partitionerad tabell" -#: describe.c:1047 +#: describe.c:1058 msgid "Column privileges" msgstr "Kolumnrättigheter" -#: describe.c:1078 describe.c:1112 +#: describe.c:1089 describe.c:1123 msgid "Policies" msgstr "Policys" -#: describe.c:1143 describe.c:4510 describe.c:6577 +#: describe.c:1151 describe.c:4570 describe.c:6667 msgid "Access privileges" msgstr "Ã…tkomsträttigheter" -#: describe.c:1188 +#: describe.c:1196 msgid "function" msgstr "funktion" -#: describe.c:1190 +#: describe.c:1198 msgid "type" msgstr "typ" -#: describe.c:1192 +#: describe.c:1200 msgid "schema" msgstr "schema" -#: describe.c:1215 +#: describe.c:1222 msgid "Default access privileges" msgstr "Standard accessrättigheter" -#: describe.c:1259 +#: describe.c:1266 msgid "Object" msgstr "Objekt" -#: describe.c:1273 +#: describe.c:1280 msgid "table constraint" msgstr "tabellvillkor" -#: describe.c:1297 +#: describe.c:1304 msgid "domain constraint" msgstr "domänvillkor" -#: describe.c:1321 +#: describe.c:1328 msgid "operator class" msgstr "operatorklass" -#: describe.c:1345 +#: describe.c:1352 msgid "operator family" msgstr "operatorfamilj" -#: describe.c:1368 +#: describe.c:1375 msgid "rule" msgstr "rule" -#: describe.c:1414 +#: describe.c:1420 msgid "Object descriptions" msgstr "Objektbeskrivningar" -#: describe.c:1479 describe.c:4007 +#: describe.c:1485 describe.c:4072 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Kunde inte hitta en relation med namn \"%s\"." -#: describe.c:1482 describe.c:4010 +#: describe.c:1488 describe.c:4075 #, c-format msgid "Did not find any relations." msgstr "Kunde inte hitta nÃ¥gra relationer." -#: describe.c:1678 +#: describe.c:1684 #, c-format msgid "Did not find any relation with OID %s." msgstr "Kunde inte hitta en relation med OID %s." -#: describe.c:1726 describe.c:1750 +#: describe.c:1732 describe.c:1756 msgid "Start" msgstr "Start" -#: describe.c:1727 describe.c:1751 +#: describe.c:1733 describe.c:1757 msgid "Minimum" msgstr "Minimum" -#: describe.c:1728 describe.c:1752 +#: describe.c:1734 describe.c:1758 msgid "Maximum" msgstr "Maximum" -#: describe.c:1729 describe.c:1753 +#: describe.c:1735 describe.c:1759 msgid "Increment" msgstr "Ökning" -#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 -#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 +#: describe.c:1736 describe.c:1760 describe.c:1889 describe.c:4487 +#: describe.c:4828 describe.c:4964 describe.c:4969 describe.c:6710 msgid "yes" msgstr "ja" -#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 -#: describe.c:4768 describe.c:4892 describe.c:6621 +#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4487 +#: describe.c:4825 describe.c:4964 describe.c:6711 msgid "no" msgstr "nej" -#: describe.c:1732 describe.c:1756 +#: describe.c:1738 describe.c:1762 msgid "Cycles?" msgstr "Cyklisk?" -#: describe.c:1733 describe.c:1757 +#: describe.c:1739 describe.c:1763 msgid "Cache" msgstr "Cache" -#: describe.c:1798 +#: describe.c:1804 #, c-format msgid "Owned by: %s" msgstr "Ägd av: %s" -#: describe.c:1802 +#: describe.c:1808 #, c-format msgid "Sequence for identity column: %s" msgstr "Sekvens för identitetskolumn: %s" -#: describe.c:1810 +#: describe.c:1816 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "Ologgat sekvens \"%s.%s\"" -#: describe.c:1813 +#: describe.c:1819 #, c-format msgid "Sequence \"%s.%s\"" msgstr "Sekvens \"%s.%s\"" -#: describe.c:1957 +#: describe.c:1962 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Ologgad tabell \"%s.%s\"" -#: describe.c:1960 +#: describe.c:1965 #, c-format msgid "Table \"%s.%s\"" msgstr "Tabell \"%s.%s\"" -#: describe.c:1964 +#: describe.c:1969 #, c-format msgid "View \"%s.%s\"" msgstr "Vy \"%s.%s\"" -#: describe.c:1969 +#: describe.c:1974 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Ologgad materialiserad vy \"%s.%s\"" -#: describe.c:1972 +#: describe.c:1977 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Materialiserad vy \"%s.%s\"" -#: describe.c:1977 +#: describe.c:1982 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Ologgat index \"%s.%s\"" -#: describe.c:1980 +#: describe.c:1985 #, c-format msgid "Index \"%s.%s\"" msgstr "Index \"%s.%s\"" -#: describe.c:1985 +#: describe.c:1990 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Ologgat partitionerat index \"%s.%s\"" -#: describe.c:1988 +#: describe.c:1993 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Partitionerat index \"%s.%s\"" -#: describe.c:1992 +#: describe.c:1997 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST-tabell \"%s.%s\"" -#: describe.c:1996 +#: describe.c:2001 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Sammansatt typ \"%s.%s\"" -#: describe.c:2000 +#: describe.c:2005 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Främmande tabell \"%s.%s\"" -#: describe.c:2005 +#: describe.c:2010 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Ologgad partitionerad tabell \"%s.%s\"" -#: describe.c:2008 +#: describe.c:2013 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Partitionerad tabell \"%s.%s\"" -#: describe.c:2024 describe.c:4343 +#: describe.c:2029 describe.c:4405 msgid "Collation" msgstr "Jämförelse" -#: describe.c:2025 describe.c:4344 +#: describe.c:2030 describe.c:4406 msgid "Nullable" msgstr "Nullbar" -#: describe.c:2026 describe.c:4345 +#: describe.c:2031 describe.c:4407 msgid "Default" msgstr "Standard" -#: describe.c:2029 +#: describe.c:2034 msgid "Key?" msgstr "Nyckel?" -#: describe.c:2031 describe.c:4665 describe.c:4676 +#: describe.c:2036 describe.c:4723 describe.c:4734 msgid "Definition" msgstr "Definition" -#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 -#: describe.c:5894 +#: describe.c:2038 describe.c:5757 describe.c:5831 describe.c:5896 +#: describe.c:5954 msgid "FDW options" msgstr "FDW-alternativ" -#: describe.c:2035 +#: describe.c:2040 msgid "Storage" msgstr "Lagring" -#: describe.c:2037 +#: describe.c:2042 msgid "Compression" msgstr "Komprimering" -#: describe.c:2039 +#: describe.c:2044 msgid "Stats target" msgstr "StatistikmÃ¥l" -#: describe.c:2175 +#: describe.c:2180 #, c-format msgid "Partition of: %s %s%s" msgstr "Partition av: %s %s%s" -#: describe.c:2188 +#: describe.c:2193 msgid "No partition constraint" msgstr "Inget partitioneringsvillkor" -#: describe.c:2190 +#: describe.c:2195 #, c-format msgid "Partition constraint: %s" msgstr "Partitioneringsvillkor: %s" -#: describe.c:2214 +#: describe.c:2219 #, c-format msgid "Partition key: %s" msgstr "Partitioneringsnyckel: %s" -#: describe.c:2240 +#: describe.c:2245 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "Ägande tabell \"%s.%s\"" -#: describe.c:2309 +#: describe.c:2314 msgid "primary key, " msgstr "primärnyckel, " -#: describe.c:2312 +#: describe.c:2317 msgid "unique" msgstr "unik" -#: describe.c:2314 +#: describe.c:2319 msgid " nulls not distinct" msgstr " null-värden ej distinkta" -#: describe.c:2315 +#: describe.c:2320 msgid ", " msgstr ", " -#: describe.c:2322 +#: describe.c:2327 #, c-format msgid "for table \"%s.%s\"" msgstr "för tabell \"%s.%s\"" -#: describe.c:2326 +#: describe.c:2331 #, c-format msgid ", predicate (%s)" msgstr ", predikat (%s)" -#: describe.c:2329 +#: describe.c:2334 msgid ", clustered" msgstr ", klustrad" -#: describe.c:2332 +#: describe.c:2337 msgid ", invalid" msgstr ", ogiltig" -#: describe.c:2335 +#: describe.c:2340 msgid ", deferrable" msgstr ", uppskjutbar" -#: describe.c:2338 +#: describe.c:2343 msgid ", initially deferred" msgstr ", initialt uppskjuten" -#: describe.c:2341 +#: describe.c:2346 msgid ", replica identity" msgstr ", replikaidentitet" -#: describe.c:2395 +#: describe.c:2400 msgid "Indexes:" msgstr "Index:" -#: describe.c:2478 +#: describe.c:2483 msgid "Check constraints:" msgstr "Kontrollvillkor:" -#: describe.c:2546 +#: describe.c:2551 msgid "Foreign-key constraints:" msgstr "Främmande nyckel-villkor:" -#: describe.c:2609 +#: describe.c:2614 msgid "Referenced by:" msgstr "Refererad av:" -#: describe.c:2659 +#: describe.c:2664 msgid "Policies:" msgstr "Policys:" -#: describe.c:2662 +#: describe.c:2667 msgid "Policies (forced row security enabled):" msgstr "Policys (tvingad radsäkerhet pÃ¥slagen):" -#: describe.c:2665 +#: describe.c:2670 msgid "Policies (row security enabled): (none)" msgstr "Policys (radsäkerhet pÃ¥slagna): (ingen)" -#: describe.c:2668 +#: describe.c:2673 msgid "Policies (forced row security enabled): (none)" msgstr "Policys (tvingad radsäkerhet pÃ¥slagen): (ingen)" -#: describe.c:2671 +#: describe.c:2676 msgid "Policies (row security disabled):" msgstr "Policys (radsäkerhet avstängd):" -#: describe.c:2731 describe.c:2835 +#: describe.c:2736 describe.c:2841 msgid "Statistics objects:" msgstr "Statistikobjekt:" -#: describe.c:2937 describe.c:3090 +#: describe.c:2943 describe.c:3096 msgid "Rules:" msgstr "Regler:" -#: describe.c:2940 +#: describe.c:2946 msgid "Disabled rules:" msgstr "Avstängda regler:" -#: describe.c:2943 +#: describe.c:2949 msgid "Rules firing always:" msgstr "Regler som alltid utförs:" -#: describe.c:2946 +#: describe.c:2952 msgid "Rules firing on replica only:" msgstr "Regler som utförs enbart pÃ¥ replika:" -#: describe.c:3025 describe.c:5030 +#: describe.c:3031 describe.c:5100 msgid "Publications:" msgstr "Publiceringar:" -#: describe.c:3073 +#: describe.c:3079 msgid "View definition:" msgstr "Vydefinition:" -#: describe.c:3236 +#: describe.c:3242 msgid "Triggers:" msgstr "Triggrar:" -#: describe.c:3239 +#: describe.c:3245 msgid "Disabled user triggers:" msgstr "Avstängda användartriggrar:" -#: describe.c:3242 +#: describe.c:3248 msgid "Disabled internal triggers:" msgstr "Avstängda interna triggrar:" -#: describe.c:3245 +#: describe.c:3251 msgid "Triggers firing always:" msgstr "Triggrar som alltid körs:" -#: describe.c:3248 +#: describe.c:3254 msgid "Triggers firing on replica only:" msgstr "Triggrar som enbart körs pÃ¥ replika:" -#: describe.c:3319 +#: describe.c:3325 #, c-format msgid "Server: %s" msgstr "Server: %s" -#: describe.c:3327 +#: describe.c:3333 #, c-format msgid "FDW options: (%s)" msgstr "FDW-alternativ: (%s)" -#: describe.c:3348 +#: describe.c:3354 msgid "Inherits" msgstr "Ärver" -#: describe.c:3413 +#: describe.c:3419 #, c-format msgid "Number of partitions: %d" msgstr "Antal partitioner: %d" -#: describe.c:3422 +#: describe.c:3428 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "Antal partitioner: %d (Använd \\d+ för att lista dem.)" -#: describe.c:3424 +#: describe.c:3430 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "Antal barntabeller: %d (Använd \\d+ för att lista dem.)" -#: describe.c:3431 +#: describe.c:3437 msgid "Child tables" msgstr "Barntabeller" -#: describe.c:3431 +#: describe.c:3437 msgid "Partitions" msgstr "Partitioner" -#: describe.c:3462 +#: describe.c:3470 #, c-format msgid "Typed table of type: %s" msgstr "Typad tabell av typ: %s" -#: describe.c:3478 +#: describe.c:3486 msgid "Replica Identity" msgstr "Replikaidentitet" -#: describe.c:3491 +#: describe.c:3499 msgid "Has OIDs: yes" msgstr "Har OID:er: ja" -#: describe.c:3500 +#: describe.c:3508 #, c-format msgid "Access method: %s" msgstr "Accessmetod: %s" -#: describe.c:3579 +#: describe.c:3585 #, c-format msgid "Tablespace: \"%s\"" msgstr "Tabellutrymme: \"%s\"" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3591 +#: describe.c:3597 #, c-format msgid ", tablespace \"%s\"" msgstr ", tabellutrymme: \"%s\"" -#: describe.c:3668 +#: describe.c:3670 msgid "List of roles" msgstr "Lista med roller" -#: describe.c:3670 +#: describe.c:3672 describe.c:3840 msgid "Role name" msgstr "Rollnamn" -#: describe.c:3671 +#: describe.c:3673 msgid "Attributes" msgstr "Attribut" -#: describe.c:3673 -msgid "Member of" -msgstr "Medlem av" - #: describe.c:3684 msgid "Superuser" msgstr "Superanvändare" @@ -1774,383 +1845,395 @@ msgstr[1] "%d uppkopplingar" msgid "Password valid until " msgstr "Lösenord giltigt till " -#: describe.c:3777 +#: describe.c:3775 msgid "Role" msgstr "Roll" -#: describe.c:3778 +#: describe.c:3776 msgid "Database" msgstr "Databas" -#: describe.c:3779 +#: describe.c:3777 msgid "Settings" msgstr "Inställningar" -#: describe.c:3803 +#: describe.c:3801 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Kunde inte hitta nÃ¥gra inställningar för roll \"%s\" och databas \"%s\"." -#: describe.c:3806 +#: describe.c:3804 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Kunde inte hitta nÃ¥gra inställningar för roll \"%s\"." -#: describe.c:3809 +#: describe.c:3807 #, c-format msgid "Did not find any settings." msgstr "Kunde inte hitta nÃ¥gra inställningar." -#: describe.c:3814 +#: describe.c:3811 msgid "List of settings" msgstr "Lista med inställningar" -#: describe.c:3885 +#: describe.c:3841 +msgid "Member of" +msgstr "Medlem av" + +#: describe.c:3858 +msgid "Grantor" +msgstr "Rättighetsutdelare" + +#: describe.c:3884 +msgid "List of role grants" +msgstr "Lista med roll-rättigheter" + +#: describe.c:3950 msgid "index" msgstr "index" -#: describe.c:3887 +#: describe.c:3952 msgid "TOAST table" msgstr "TOAST-tabell" -#: describe.c:3890 describe.c:4102 +#: describe.c:3955 describe.c:4166 msgid "partitioned index" msgstr "partitionerat index" -#: describe.c:3910 +#: describe.c:3975 msgid "permanent" msgstr "permanent" -#: describe.c:3911 +#: describe.c:3976 msgid "temporary" msgstr "temporär" -#: describe.c:3912 +#: describe.c:3977 msgid "unlogged" msgstr "ologgad" -#: describe.c:3913 +#: describe.c:3978 msgid "Persistence" msgstr "Persistens" -#: describe.c:3929 +#: describe.c:3994 msgid "Access method" msgstr "Accessmetod" -#: describe.c:4015 +#: describe.c:4079 msgid "List of relations" msgstr "Lista med relationer" -#: describe.c:4063 +#: describe.c:4127 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "Servern (version %s) stöder inte deklarativ tabellpartitionering." -#: describe.c:4074 +#: describe.c:4138 msgid "List of partitioned indexes" msgstr "Lista med partitionerade index" -#: describe.c:4076 +#: describe.c:4140 msgid "List of partitioned tables" msgstr "Lista med partitionerade tabeller" -#: describe.c:4080 +#: describe.c:4144 msgid "List of partitioned relations" msgstr "Lista med partitionerade relationer" -#: describe.c:4111 +#: describe.c:4175 msgid "Parent name" msgstr "Föräldranamn" -#: describe.c:4124 +#: describe.c:4188 msgid "Leaf partition size" msgstr "Partitionsstorlek av löv" -#: describe.c:4127 describe.c:4133 +#: describe.c:4191 describe.c:4197 msgid "Total size" msgstr "Total storlek" -#: describe.c:4258 +#: describe.c:4321 msgid "Trusted" msgstr "Tillförlitlig" -#: describe.c:4267 +#: describe.c:4330 msgid "Internal language" msgstr "Internt sprÃ¥k" -#: describe.c:4268 +#: describe.c:4331 msgid "Call handler" msgstr "Anropshanterare" -#: describe.c:4269 describe.c:5680 +#: describe.c:4332 describe.c:5743 msgid "Validator" msgstr "Validerare" -#: describe.c:4270 +#: describe.c:4333 msgid "Inline handler" msgstr "Inline-hanterare" -#: describe.c:4305 +#: describe.c:4367 msgid "List of languages" msgstr "Lista med sprÃ¥k" -#: describe.c:4346 +#: describe.c:4408 msgid "Check" msgstr "Check" -#: describe.c:4390 +#: describe.c:4451 msgid "List of domains" msgstr "Lista med domäner" -#: describe.c:4424 +#: describe.c:4485 msgid "Source" msgstr "Källa" -#: describe.c:4425 +#: describe.c:4486 msgid "Destination" msgstr "MÃ¥l" -#: describe.c:4427 describe.c:6622 +#: describe.c:4488 describe.c:6712 msgid "Default?" msgstr "Standard?" -#: describe.c:4469 +#: describe.c:4529 msgid "List of conversions" msgstr "Lista med konverteringar" -#: describe.c:4497 +#: describe.c:4557 msgid "Parameter" msgstr "Parameter" -#: describe.c:4498 +#: describe.c:4558 msgid "Value" msgstr "Värde" -#: describe.c:4505 +#: describe.c:4565 msgid "Context" msgstr "Kontext" -#: describe.c:4538 +#: describe.c:4597 msgid "List of configuration parameters" msgstr "Lista med konfigurationsparametrar" -#: describe.c:4540 +#: describe.c:4599 msgid "List of non-default configuration parameters" msgstr "Lista med icke-defaulta konfigurationsparametrar" -#: describe.c:4567 +#: describe.c:4626 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "Servern (version %s) stöder inte händelsetriggrar." -#: describe.c:4587 +#: describe.c:4646 msgid "Event" msgstr "Händelse" -#: describe.c:4589 +#: describe.c:4648 msgid "enabled" msgstr "pÃ¥slagen" -#: describe.c:4590 +#: describe.c:4649 msgid "replica" msgstr "replika" -#: describe.c:4591 +#: describe.c:4650 msgid "always" msgstr "alltid" -#: describe.c:4592 +#: describe.c:4651 msgid "disabled" msgstr "avstängd" -#: describe.c:4593 describe.c:6496 +#: describe.c:4652 describe.c:6553 msgid "Enabled" msgstr "PÃ¥slagen" -#: describe.c:4595 +#: describe.c:4654 msgid "Tags" msgstr "Etiketter" -#: describe.c:4619 +#: describe.c:4677 msgid "List of event triggers" msgstr "Lista med händelsetriggrar" -#: describe.c:4646 +#: describe.c:4704 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Servern (version %s) stöder inte utökad statistik." -#: describe.c:4683 +#: describe.c:4741 msgid "Ndistinct" msgstr "Nunika" -#: describe.c:4684 +#: describe.c:4742 msgid "Dependencies" msgstr "Beroenden" -#: describe.c:4694 +#: describe.c:4752 msgid "MCV" msgstr "MCV" -#: describe.c:4718 +#: describe.c:4775 msgid "List of extended statistics" msgstr "Lista med utökad statistik" -#: describe.c:4745 +#: describe.c:4802 msgid "Source type" msgstr "Källtyp" -#: describe.c:4746 +#: describe.c:4803 msgid "Target type" msgstr "MÃ¥ltyp" -#: describe.c:4770 +#: describe.c:4827 msgid "in assignment" msgstr "i tilldelning" -#: describe.c:4772 +#: describe.c:4829 msgid "Implicit?" msgstr "Implicit?" -#: describe.c:4831 +#: describe.c:4887 msgid "List of casts" msgstr "Lista med typomvandlingar" -#: describe.c:4883 describe.c:4887 +#: describe.c:4927 describe.c:4931 msgid "Provider" msgstr "Leverantör" -#: describe.c:4893 describe.c:4898 +#: describe.c:4965 describe.c:4970 msgid "Deterministic?" msgstr "Deterministisk?" -#: describe.c:4938 +#: describe.c:5009 msgid "List of collations" msgstr "Lista med jämförelser (collations)" -#: describe.c:5000 +#: describe.c:5070 msgid "List of schemas" msgstr "Lista med scheman" -#: describe.c:5117 +#: describe.c:5186 msgid "List of text search parsers" msgstr "Lista med textsökparsrar" -#: describe.c:5167 +#: describe.c:5236 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Kunde inte hitta en textsökparser med namn \"%s\"." -#: describe.c:5170 +#: describe.c:5239 #, c-format msgid "Did not find any text search parsers." msgstr "Kunde inte hitta nÃ¥gra textsökparsrar." -#: describe.c:5245 +#: describe.c:5314 msgid "Start parse" msgstr "Starta parsning" -#: describe.c:5246 +#: describe.c:5315 msgid "Method" msgstr "Metod" -#: describe.c:5250 +#: describe.c:5319 msgid "Get next token" msgstr "Hämta nästa symbol" -#: describe.c:5252 +#: describe.c:5321 msgid "End parse" msgstr "Avsluta parsning" -#: describe.c:5254 +#: describe.c:5323 msgid "Get headline" msgstr "Hämta rubrik" -#: describe.c:5256 +#: describe.c:5325 msgid "Get token types" msgstr "Hämta symboltyper" -#: describe.c:5267 +#: describe.c:5335 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "Textsökparser \"%s.%s\"" -#: describe.c:5270 +#: describe.c:5338 #, c-format msgid "Text search parser \"%s\"" msgstr "Textsökparser \"%s\"" -#: describe.c:5289 +#: describe.c:5357 msgid "Token name" msgstr "Symbolnamn" -#: describe.c:5303 +#: describe.c:5370 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Symboltyper för parser \"%s.%s\"" -#: describe.c:5306 +#: describe.c:5373 #, c-format msgid "Token types for parser \"%s\"" msgstr "Symboltyper för parser \"%s\"" -#: describe.c:5350 +#: describe.c:5417 msgid "Template" msgstr "Mall" -#: describe.c:5351 +#: describe.c:5418 msgid "Init options" msgstr "Initieringsalternativ" -#: describe.c:5378 +#: describe.c:5444 msgid "List of text search dictionaries" msgstr "Lista med textsökordlistor" -#: describe.c:5411 +#: describe.c:5477 msgid "Init" msgstr "Init" -#: describe.c:5412 +#: describe.c:5478 msgid "Lexize" msgstr "Symboluppdelning" -#: describe.c:5444 +#: describe.c:5509 msgid "List of text search templates" msgstr "Lista med textsökmallar" -#: describe.c:5499 +#: describe.c:5563 msgid "List of text search configurations" msgstr "Lista med textsökkonfigurationer" -#: describe.c:5550 +#: describe.c:5614 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Kunde inte hitta en textsökkonfiguration med namn \"%s\"." -#: describe.c:5553 +#: describe.c:5617 #, c-format msgid "Did not find any text search configurations." msgstr "Kunde inte hitta nÃ¥gra textsökkonfigurationer." -#: describe.c:5619 +#: describe.c:5683 msgid "Token" msgstr "Symbol" -#: describe.c:5620 +#: describe.c:5684 msgid "Dictionaries" msgstr "Ordlistor" -#: describe.c:5631 +#: describe.c:5695 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "Textsökkonfiguration \"%s.%s\"" -#: describe.c:5634 +#: describe.c:5698 #, c-format msgid "Text search configuration \"%s\"" msgstr "Textsökkonfiguration \"%s\"" -#: describe.c:5638 +#: describe.c:5702 #, c-format msgid "" "\n" @@ -2159,7 +2242,7 @@ msgstr "" "\n" "Parser: \"%s.%s\"" -#: describe.c:5641 +#: describe.c:5705 #, c-format msgid "" "\n" @@ -2168,253 +2251,273 @@ msgstr "" "\n" "Parser: \"%s\"" -#: describe.c:5722 +#: describe.c:5784 msgid "List of foreign-data wrappers" msgstr "Lista med främmande data-omvandlare" -#: describe.c:5750 +#: describe.c:5812 msgid "Foreign-data wrapper" msgstr "Främmande data-omvandlare" -#: describe.c:5768 describe.c:5958 +#: describe.c:5830 describe.c:6017 msgid "Version" msgstr "Version" -#: describe.c:5799 +#: describe.c:5860 msgid "List of foreign servers" msgstr "Lista med främmande servrar" -#: describe.c:5824 describe.c:5883 +#: describe.c:5885 describe.c:5943 msgid "Server" msgstr "Server" -#: describe.c:5825 +#: describe.c:5886 msgid "User name" msgstr "Användarnamn" -#: describe.c:5855 +#: describe.c:5915 msgid "List of user mappings" msgstr "Lista av användarmappningar" -#: describe.c:5928 +#: describe.c:5987 msgid "List of foreign tables" msgstr "Lista med främmande tabeller" -#: describe.c:5980 +#: describe.c:6038 msgid "List of installed extensions" msgstr "Lista med installerade utökningar" -#: describe.c:6028 +#: describe.c:6086 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Kunde inte hitta en utökning med namn \"%s\"." -#: describe.c:6031 +#: describe.c:6089 #, c-format msgid "Did not find any extensions." msgstr "Kunde inte hitta nÃ¥gra utökningar." -#: describe.c:6075 +#: describe.c:6133 msgid "Object description" msgstr "Objektbeskrivning" -#: describe.c:6085 +#: describe.c:6142 #, c-format msgid "Objects in extension \"%s\"" msgstr "Objekt i utökning \"%s\"" -#: describe.c:6126 +#: describe.c:6183 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "ej korrekt kvalificerat namn (för mÃ¥nga namn med punkt): %s" -#: describe.c:6140 +#: describe.c:6197 #, c-format msgid "cross-database references are not implemented: %s" msgstr "referenser till andra databaser är inte implementerat: %s" -#: describe.c:6171 describe.c:6298 +#: describe.c:6228 describe.c:6354 #, c-format msgid "The server (version %s) does not support publications." msgstr "Servern (version %s) stöder inte publiceringar." -#: describe.c:6188 describe.c:6376 +#: describe.c:6245 describe.c:6432 msgid "All tables" msgstr "Alla tabeller" -#: describe.c:6189 describe.c:6377 +#: describe.c:6246 describe.c:6433 msgid "Inserts" msgstr "Insättningar" -#: describe.c:6190 describe.c:6378 +#: describe.c:6247 describe.c:6434 msgid "Updates" msgstr "Uppdateringar" -#: describe.c:6191 describe.c:6379 +#: describe.c:6248 describe.c:6435 msgid "Deletes" msgstr "Borttagningar" -#: describe.c:6195 describe.c:6381 +#: describe.c:6252 describe.c:6437 msgid "Truncates" msgstr "Trunkeringar" -#: describe.c:6199 describe.c:6383 +#: describe.c:6256 describe.c:6439 msgid "Via root" msgstr "Via root" -#: describe.c:6221 +#: describe.c:6277 msgid "List of publications" msgstr "Lista med publiceringar" -#: describe.c:6345 +#: describe.c:6401 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Kunde inte hitta nÃ¥gon publicering med namn \"%s\"." -#: describe.c:6348 +#: describe.c:6404 #, c-format msgid "Did not find any publications." msgstr "Kunde inte hitta nÃ¥gra publiceringar." -#: describe.c:6372 +#: describe.c:6428 #, c-format msgid "Publication %s" msgstr "Publicering %s" -#: describe.c:6425 +#: describe.c:6481 msgid "Tables:" msgstr "Tabeller:" -#: describe.c:6437 +#: describe.c:6493 msgid "Tables from schemas:" msgstr "Tabeller frÃ¥n scheman:" -#: describe.c:6481 +#: describe.c:6538 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Denna server (version %s) stöder inte prenumerationer." -#: describe.c:6497 +#: describe.c:6554 msgid "Publication" msgstr "Publicering" -#: describe.c:6506 +#: describe.c:6563 msgid "Binary" msgstr "Binär" -#: describe.c:6507 +#: describe.c:6572 describe.c:6576 msgid "Streaming" msgstr "Strömmande" -#: describe.c:6514 +#: describe.c:6584 msgid "Two-phase commit" msgstr "TvÃ¥fas-commit" -#: describe.c:6515 +#: describe.c:6585 msgid "Disable on error" msgstr "Stäng av vid fel" -#: describe.c:6520 +#: describe.c:6592 +msgid "Origin" +msgstr "Ursprung" + +#: describe.c:6593 +msgid "Password required" +msgstr "Lösenord krävs" + +#: describe.c:6594 +msgid "Run as owner?" +msgstr "Kör som ägare?" + +#: describe.c:6599 +msgid "Failover" +msgstr "Failover" + +#: describe.c:6604 msgid "Synchronous commit" msgstr "Synkron commit" -#: describe.c:6521 +#: describe.c:6605 msgid "Conninfo" msgstr "Anslutningsinfo" -#: describe.c:6527 +#: describe.c:6611 msgid "Skip LSN" msgstr "Skippa LSN" -#: describe.c:6554 +#: describe.c:6637 msgid "List of subscriptions" msgstr "Lista med prenumerationer" -#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 +#: describe.c:6666 +msgid "(none)" +msgstr "(ingen)" + +#: describe.c:6706 describe.c:6801 describe.c:6893 describe.c:6987 msgid "AM" msgstr "AM" -#: describe.c:6617 +#: describe.c:6707 msgid "Input type" msgstr "Indatatyp" -#: describe.c:6618 +#: describe.c:6708 msgid "Storage type" msgstr "Lagringstyp" -#: describe.c:6619 +#: describe.c:6709 msgid "Operator class" msgstr "Operatorklass" -#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 +#: describe.c:6721 describe.c:6802 describe.c:6894 describe.c:6988 msgid "Operator family" msgstr "Operatorfamilj" -#: describe.c:6667 +#: describe.c:6756 msgid "List of operator classes" msgstr "Lista med operatorklasser" -#: describe.c:6714 +#: describe.c:6803 msgid "Applicable types" msgstr "Applicerbara typer" -#: describe.c:6756 +#: describe.c:6844 msgid "List of operator families" msgstr "Lista med operatorfamiljer" -#: describe.c:6807 +#: describe.c:6895 msgid "Operator" msgstr "Operator" -#: describe.c:6808 +#: describe.c:6896 msgid "Strategy" msgstr "Strategi" -#: describe.c:6809 +#: describe.c:6897 msgid "ordering" msgstr "ordning" -#: describe.c:6810 +#: describe.c:6898 msgid "search" msgstr "sök" -#: describe.c:6811 +#: describe.c:6899 msgid "Purpose" msgstr "ÄndamÃ¥l" -#: describe.c:6816 +#: describe.c:6904 msgid "Sort opfamily" msgstr "Sortering-opfamilj" -#: describe.c:6855 +#: describe.c:6942 msgid "List of operators of operator families" msgstr "Lista med operatorer i operatorfamiljer" -#: describe.c:6902 +#: describe.c:6989 msgid "Registered left type" msgstr "Registrerad vänstertyp" -#: describe.c:6903 +#: describe.c:6990 msgid "Registered right type" msgstr "Registrerad högertyp" -#: describe.c:6904 +#: describe.c:6991 msgid "Number" msgstr "Nummer" -#: describe.c:6948 +#: describe.c:7034 msgid "List of support functions of operator families" msgstr "Lista med supportfunktioner i operatorfamiljer" -#: describe.c:6979 +#: describe.c:7065 msgid "ID" msgstr "ID" -#: describe.c:7000 +#: describe.c:7085 msgid "Large objects" msgstr "Stora objekt" -#: help.c:75 +#: help.c:63 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2422,11 +2525,11 @@ msgstr "" "psql är den interaktiva PostgreSQL-terminalen.\n" "\n" -#: help.c:76 help.c:393 help.c:473 help.c:516 +#: help.c:64 help.c:372 help.c:456 help.c:502 msgid "Usage:\n" msgstr "Användning:\n" -#: help.c:77 +#: help.c:65 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2434,28 +2537,27 @@ msgstr "" " psql [FLAGGA]... [DBNAMN [ANVÄNDARNAMN]]\n" "\n" -#: help.c:79 +#: help.c:67 msgid "General options:\n" msgstr "Allmänna flaggor:\n" -#: help.c:84 +#: help.c:68 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=KOMMANDO kör ett kommando (SQL eller internt) och avsluta sedan\n" -#: help.c:85 -#, c-format -msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" -msgstr " -d, --dbname=DBNAMN databasnamn att koppla upp mot (standard: \"%s\")\n" +#: help.c:69 +msgid " -d, --dbname=DBNAME database name to connect to\n" +msgstr " -d, --dbname=DBNAMN namn pÃ¥ databas att ansluta till\n" -#: help.c:87 +#: help.c:70 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=FILNAMN kör kommandon frÃ¥n fil och avsluta sedan\n" -#: help.c:88 +#: help.c:71 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list lista befintliga databaser och avsluta sedan\n" -#: help.c:89 +#: help.c:72 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2465,15 +2567,15 @@ msgstr "" " sätt psql-variabel NAMN till VÄRDE\n" " (t.ex. -v ON_ERROR_STOP=1)\n" -#: help.c:92 +#: help.c:75 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: help.c:93 +#: help.c:76 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc läs inte startfilen (~/.psqlrc)\n" -#: help.c:94 +#: help.c:77 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2481,19 +2583,19 @@ msgstr "" " -1 (\"ett\"), --single-transaction\n" " kör kommandofilen som en transaktion (om icke-interaktiv)\n" -#: help.c:96 +#: help.c:79 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=alternativ] visa denna hjälp, avsluta sedan\n" -#: help.c:97 +#: help.c:80 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands lista bakstreck-kommandon, avsluta sedan\n" -#: help.c:98 +#: help.c:81 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variabler lista speciella variabler, avsluta sedan\n" -#: help.c:100 +#: help.c:83 msgid "" "\n" "Input and output options:\n" @@ -2501,47 +2603,47 @@ msgstr "" "\n" "Flaggor för in-/utmatning:\n" -#: help.c:101 +#: help.c:84 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all visa all indata frÃ¥n skript\n" -#: help.c:102 +#: help.c:85 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors visa misslyckade kommandon\n" -#: help.c:103 +#: help.c:86 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries visa kommandon som skickas till servern\n" -#: help.c:104 +#: help.c:87 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden visa frÃ¥gor som interna kommandon skapar\n" -#: help.c:105 +#: help.c:88 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FILENAME skicka sessions-logg till fil\n" -#: help.c:106 +#: help.c:89 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline slÃ¥ av förbättrad kommandoradsredigering (readline)\n" -#: help.c:107 +#: help.c:90 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=FILNAMN skriv frÃ¥geresultat till fil (eller |rör)\n" -#: help.c:108 +#: help.c:91 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet kör tyst (inga meddelanden, endast frÃ¥geutdata)\n" -#: help.c:109 +#: help.c:92 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step stegningsläge (bekräfta varje frÃ¥ga)\n" -#: help.c:110 +#: help.c:93 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line enradsläge (slutet pÃ¥ raden avslutar SQL-kommando)\n" -#: help.c:112 +#: help.c:95 msgid "" "\n" "Output format options:\n" @@ -2549,15 +2651,15 @@ msgstr "" "\n" "Flaggor för utdataformat:\n" -#: help.c:113 +#: help.c:96 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align ojusterad utskrift av tabeller\n" -#: help.c:114 +#: help.c:97 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv CSV-utmarningsläge (kommaseparerade värden)\n" -#: help.c:115 +#: help.c:98 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2566,15 +2668,15 @@ msgstr "" " -F, --field-separator=STRÄNG\n" " fältseparator för icke justerad utdata (standard: \"%s\")\n" -#: help.c:118 +#: help.c:101 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML-utskrift av tabeller\n" -#: help.c:119 +#: help.c:102 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr " -P, --pset=VAR[=ARG] sätt utskriftsvariabel VAR till ARG (se kommando \\pset)\n" -#: help.c:120 +#: help.c:103 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2582,19 +2684,19 @@ msgstr "" " -R, --record-separator=STRÄNG\n" " sätt postseparator för icke justerad utdata (standard: newline)\n" -#: help.c:122 +#: help.c:105 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only visa endast rader\n" -#: help.c:123 +#: help.c:106 msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr " -T, --table-attr=TEXT sätt HTML-tabellers flaggor (t.ex. width, border)\n" -#: help.c:124 +#: help.c:107 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded slÃ¥ pÃ¥ utökad utsrift av tabeller\n" -#: help.c:125 +#: help.c:108 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2602,7 +2704,7 @@ msgstr "" " -z, --field-separator-zero\n" " sätt fältseparator för icke justerad utdata till noll-byte\n" -#: help.c:127 +#: help.c:110 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2610,7 +2712,7 @@ msgstr "" " -0, --record-separator=zero\n" " sätt postseparator för icke justerad utdata till noll-byte\n" -#: help.c:130 +#: help.c:113 msgid "" "\n" "Connection options:\n" @@ -2618,36 +2720,27 @@ msgstr "" "\n" "Flaggor för anslutning:\n" -#: help.c:133 -#, c-format -msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" -msgstr "" -" -h, --host=VÄRDNAMN databasens värdnamn eller uttagkatalog (socket)\n" -" (standard: \"%s\")\n" - -#: help.c:134 -msgid "local socket" -msgstr "lokalt uttag (socket)" +#: help.c:114 +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n" -#: help.c:137 -#, c-format -msgid " -p, --port=PORT database server port (default: \"%s\")\n" -msgstr " -p, --port=PORT databasens serverport (standard: \"%s\")\n" +#: help.c:115 +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=PORT databasserverns port\n" -#: help.c:140 -#, c-format -msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" -msgstr " -U, --username=ANVNAMN användarnamn för databasen (standard: \"%s\")\n" +#: help.c:116 +msgid " -U, --username=USERNAME database user name\n" +msgstr " -U, --username=ANVNAMN namn pÃ¥ databasens användare\n" -#: help.c:142 +#: help.c:117 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password frÃ¥ga aldrig efter lösenord\n" -#: help.c:143 +#: help.c:118 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password frÃ¥ga om lösenord (borde ske automatiskt)\n" -#: help.c:145 +#: help.c:120 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2661,33 +2754,37 @@ msgstr "" "i PostgreSQL-dokumentationen.\n" "\n" -#: help.c:148 +#: help.c:123 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapportera fel till <%s>.\n" -#: help.c:149 +#: help.c:124 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: help.c:191 +#: help.c:166 msgid "General\n" msgstr "Allmänna\n" -#: help.c:192 +#: help.c:167 +msgid " \\bind [PARAM]... set query parameters\n" +msgstr " \\bind [PARAM]... sätt frÃ¥geparameter\n" + +#: help.c:168 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright visa PostgreSQL-upphovsrättsinformation\n" -#: help.c:193 +#: help.c:169 msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr " \\crosstabview [KOLUMNER] kör frÃ¥ga och visa resultatet i en korstabell\n" -#: help.c:194 +#: help.c:170 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose visa senste felmeddelande vid maximal verbositet\n" -#: help.c:195 +#: help.c:171 msgid "" " \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" @@ -2695,228 +2792,234 @@ msgstr "" " \\g [(FLAGGOR)] [FIL] kör frÃ¥gan (och skicka resultatet till fil eller |rör);\n" " \\g utan argument är samma som ett semikolon\n" -#: help.c:197 +#: help.c:173 msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc beskriv resultatet av frÃ¥ga utan att köra den\n" -#: help.c:198 +#: help.c:174 msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec kör frÃ¥ga, kör sen varje värde i resultatet\n" -#: help.c:199 +#: help.c:175 msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr " \\gset [PREFIX] kör frÃ¥gan och spara resultatet i psql-variabler\n" -#: help.c:200 +#: help.c:176 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [(FLAGGOR)] [FIL] som \\g, men tvinga expanderat utmatningsläge\n" -#: help.c:201 +#: help.c:177 msgid " \\q quit psql\n" msgstr " \\q avsluta psql\n" -#: help.c:202 -msgid " \\watch [SEC] execute query every SEC seconds\n" -msgstr " \\watch [SEK] kör frÃ¥ga var SEK sekund\n" +#: help.c:178 +msgid "" +" \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" execute query every SEC seconds, up to N times,\n" +" stop if less than MIN rows are returned\n" +msgstr "" +" \\watch [[i=]SEK] [c=N] [m=MIN]\n" +" kör frÃ¥ga var SEK sekund, upp till N gÃ¥nger,\n" +" stoppa om färre än MIN rader returneras\n" -#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 -#: help.c:324 help.c:337 help.c:346 +#: help.c:181 help.c:189 help.c:201 help.c:211 help.c:218 help.c:275 help.c:283 +#: help.c:303 help.c:316 help.c:325 msgid "\n" msgstr "\n" -#: help.c:205 +#: help.c:183 msgid "Help\n" msgstr "Hjälp\n" -#: help.c:207 +#: help.c:185 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [kommandon] visa hjälp om backstreckkommandon\n" -#: help.c:208 +#: help.c:186 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options visa hjälp för psqls kommandoradflaggor\n" -#: help.c:209 +#: help.c:187 msgid " \\? variables show help on special variables\n" msgstr " \\? variables visa hjälp om speciella variabler\n" -#: help.c:210 +#: help.c:188 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [NAMN] hjälp med syntaxen för SQL-kommandon, * för alla kommandon\n" -#: help.c:213 +#: help.c:191 msgid "Query Buffer\n" msgstr "FrÃ¥gebuffert\n" -#: help.c:214 +#: help.c:192 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr " \\e [FIL] [RAD] redigera frÃ¥gebufferten (eller filen) med extern redigerare\n" -#: help.c:215 +#: help.c:193 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNKNAMN [RAD]] redigera funktionsdefinition med extern redigerare\n" -#: help.c:216 +#: help.c:194 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [FUNKNAMN [RAD]] redigera vydefinition med extern redigerare\n" -#: help.c:217 +#: help.c:195 msgid " \\p show the contents of the query buffer\n" msgstr " \\p visa innehÃ¥llet i frÃ¥gebufferten\n" -#: help.c:218 +#: help.c:196 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r nollställ (radera) frÃ¥gebufferten\n" -#: help.c:220 +#: help.c:198 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [FILNAMN] visa kommandohistorien eller spara den i fil\n" -#: help.c:222 +#: help.c:200 msgid " \\w FILE write query buffer to file\n" msgstr " \\w FILNAMN skriv frÃ¥gebuffert till fil\n" -#: help.c:225 +#: help.c:203 msgid "Input/Output\n" msgstr "In-/Utmatning\n" -#: help.c:226 +#: help.c:204 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr " \\copy ... utför SQL COPY med dataström till klientvärden\n" -#: help.c:227 +#: help.c:205 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [TEXT] skriv text till standard ut (-n för ingen nyrad)\n" -#: help.c:228 +#: help.c:206 msgid " \\i FILE execute commands from file\n" msgstr " \\i FILNAMN kör kommandon frÃ¥n fil\n" -#: help.c:229 +#: help.c:207 msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr " \\ir FIL som \\i, men relativt platsen för aktuellt script\n" -#: help.c:230 +#: help.c:208 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [FIL] skicka frÃ¥geresultat till fil eller |rör\n" -#: help.c:231 +#: help.c:209 msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr " \\qecho [-n] [TEXT] skriv text till \\o-utdataströmmen (-n för ingen nyrad)\n" -#: help.c:232 +#: help.c:210 msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr " \\warn [-n] [TEXT] skriv text till standard error (-n för ingen nyrad)\n" -#: help.c:235 +#: help.c:213 msgid "Conditional\n" msgstr "Villkor\n" -#: help.c:236 +#: help.c:214 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR starta villkorsblock\n" -#: help.c:237 +#: help.c:215 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR alternativ inom aktuellt villkorsblock\n" -#: help.c:238 +#: help.c:216 msgid " \\else final alternative within current conditional block\n" msgstr " \\else avslutningsalternativ inom aktuellt villkorsblock\n" -#: help.c:239 +#: help.c:217 msgid " \\endif end conditional block\n" msgstr " \\endif avsluta villkorsblock\n" -#: help.c:242 +#: help.c:220 msgid "Informational\n" msgstr "Information\n" -#: help.c:243 +#: help.c:221 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (flaggor: S = lista systemobjekt, + = mer detaljer)\n" -#: help.c:244 +#: help.c:222 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] lista tabeller, vyer och sekvenser\n" -#: help.c:245 +#: help.c:223 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NAMN beskriv tabell, vy, sekvens eller index\n" -#: help.c:246 +#: help.c:224 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [MALL] lista aggregatfunktioner\n" -#: help.c:247 +#: help.c:225 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [MALL] lista accessmetoder\n" -#: help.c:248 +#: help.c:226 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] lista operatorklasser\n" -#: help.c:249 +#: help.c:227 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] lista operatorfamiljer\n" -#: help.c:250 +#: help.c:228 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] lista operatorer i operatorfamiljer\n" -#: help.c:251 +#: help.c:229 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] lista supportfunktioner i operatorfamiljer\n" -#: help.c:252 +#: help.c:230 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [MALL] lista tabellutrymmen\n" -#: help.c:253 +#: help.c:231 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [MALL] lista konverteringar\n" -#: help.c:254 +#: help.c:232 msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" msgstr " \\dconfig[+] [MALL] lista konfigurationsparametrar\n" -#: help.c:255 +#: help.c:233 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [MALL] lista typomvandlingar\n" -#: help.c:256 +#: help.c:234 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [MALL] visa objektbeskrivning som inte visas pÃ¥ andra ställen\n" -#: help.c:257 +#: help.c:235 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [MALL] lista domäner\n" -#: help.c:258 +#: help.c:236 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [MALL] lista standardrättigheter\n" -#: help.c:259 +#: help.c:237 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [MALL] lista främmande tabeller\n" -#: help.c:260 +#: help.c:238 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [MALL] lista främmande servrar\n" -#: help.c:261 +#: help.c:239 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\det[+] [MALL] lista främmande tabeller\n" -#: help.c:262 +#: help.c:240 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [MALL] lista användarmappning\n" -#: help.c:263 +#: help.c:241 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [MALL] lista främmande data-omvandlare\n" -#: help.c:264 +#: help.c:242 msgid "" " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" @@ -2924,47 +3027,47 @@ msgstr "" " \\df[anptw][S+] [FUNKMALL [TYPMALL ...]]\n" " lista [endast agg/normala/procedur/trigger/window] funktioner\n" -#: help.c:266 +#: help.c:244 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [MALL] lista textsökkonfigurationer\n" -#: help.c:267 +#: help.c:245 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [MALL] lista textsökordlistor\n" -#: help.c:268 +#: help.c:246 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [MALL] lista textsökparsrar\n" -#: help.c:269 +#: help.c:247 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [MALL] lista textsökmallar\n" -#: help.c:270 +#: help.c:248 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [MALL] lista roller\n" -#: help.c:271 +#: help.c:249 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [MALL] lista index\n" -#: help.c:272 +#: help.c:250 msgid " \\dl[+] list large objects, same as \\lo_list\n" msgstr " \\dl[+] lista stora objekt, samma som \\lo_list\n" -#: help.c:273 +#: help.c:251 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [MALL] lista procedursprÃ¥k\n" -#: help.c:274 +#: help.c:252 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [MALL] lista materialiserade vyer\n" -#: help.c:275 +#: help.c:253 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [MALL] lista scheman\n" -#: help.c:276 +#: help.c:254 msgid "" " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" @@ -2972,89 +3075,93 @@ msgstr "" " \\do[S+] [OPMALL [TYPMALL [TYPMALL]]]\n" " lista operatorer\n" -#: help.c:278 +#: help.c:256 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [MALL] lista jämförelser (collation)\n" -#: help.c:279 -msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" -msgstr " \\dp [MALL] lista Ã¥tkomsträttigheter för tabeller, vyer och sekvenser\n" +#: help.c:257 +msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n" +msgstr " \\dp[S] [MALL] lista Ã¥tkomsträttigheter för tabeller, vyer och sekvenser\n" -#: help.c:280 +#: help.c:258 msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr " \\dP[tin+] [MALL] lista [bara tabell/index] partitionerade relationer [n=nästlad]\n" -#: help.c:281 +#: help.c:259 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr "" " \\drds [ROLLMALL1 [DBMALL2]]\n" " lista rollinställningar per databas\n" -#: help.c:282 +#: help.c:260 +msgid " \\drg[S] [PATTERN] list role grants\n" +msgstr " \\drg[S] [MALL] lista roll-rättigheter\n" + +#: help.c:261 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [MALL] lista replikeringspubliceringar\n" -#: help.c:283 +#: help.c:262 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [MALL] lista replikeringsprenumerationer\n" -#: help.c:284 +#: help.c:263 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [MALL] lista sekvenser\n" -#: help.c:285 +#: help.c:264 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [MALL] lista tabeller\n" -#: help.c:286 +#: help.c:265 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [MALL] lista datatyper\n" -#: help.c:287 +#: help.c:266 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [MALL] lista roller\n" -#: help.c:288 +#: help.c:267 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [MALL] lista vyer\n" -#: help.c:289 +#: help.c:268 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [MALL] lista utökningar\n" -#: help.c:290 +#: help.c:269 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [MALL] lista utökad statistik\n" -#: help.c:291 +#: help.c:270 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [MALL] lista händelsetriggrar\n" -#: help.c:292 +#: help.c:271 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [MALL] lista databaser\n" -#: help.c:293 +#: help.c:272 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNKNAMN visa en funktions definition\n" -#: help.c:294 +#: help.c:273 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] VYNAMN visa en vys definition\n" -#: help.c:295 -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [MALL] samma som \\dp\n" +#: help.c:274 +msgid " \\z[S] [PATTERN] same as \\dp\n" +msgstr " \\z[S] [MALL] samma som \\dp\n" -#: help.c:298 +#: help.c:277 msgid "Large Objects\n" msgstr "Stora objekt\n" -#: help.c:299 +#: help.c:278 msgid " \\lo_export LOBOID FILE write large object to file\n" msgstr " \\lo_export LOBOID FIL skriv stort objekt till fil\n" -#: help.c:300 +#: help.c:279 msgid "" " \\lo_import FILE [COMMENT]\n" " read large object from file\n" @@ -3062,36 +3169,36 @@ msgstr "" " \\lo_import FIL [KOMMENTAR]\n" " läs stort objekt frÃ¥n fil\n" -#: help.c:302 +#: help.c:281 msgid " \\lo_list[+] list large objects\n" msgstr " \\lo_list[+] lista stora objekt\n" -#: help.c:303 +#: help.c:282 msgid " \\lo_unlink LOBOID delete a large object\n" msgstr " \\lo_unlink LOBOID ta bort stort objekt\n" -#: help.c:306 +#: help.c:285 msgid "Formatting\n" msgstr "Formatering\n" -#: help.c:307 +#: help.c:286 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a byt mellan ojusterat och justerat utdataformat\n" -#: help.c:308 +#: help.c:287 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [TEXT] sätt tabelltitel, eller nollställ\n" -#: help.c:309 +#: help.c:288 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr " \\f [TEXT] visa eller sätt fältseparatorn för ojusterad utmatning\n" -#: help.c:310 +#: help.c:289 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H slÃ¥ pÃ¥/av HTML-utskriftsläge (för närvarande: %s)\n" -#: help.c:312 +#: help.c:291 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3099,7 +3206,7 @@ msgid "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" msgstr "" " \\pset [NAMN [VÄRDE]] sätt utmatningsalternativ för tabeller\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3107,31 +3214,31 @@ msgstr "" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" -#: help.c:319 +#: help.c:298 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] visa endast rader (för närvarande: %s)\n" -#: help.c:321 +#: help.c:300 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [TEXT] sätt HTML-tabellens
-attribut, eller nollställ\n" -#: help.c:322 +#: help.c:301 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" -msgstr " \\x [on|off|auto] slÃ¥ pÃ¥/av utökad utskrift (för närvarande: %s)\n" +msgstr " \\x [on|off|auto] slÃ¥ pÃ¥/av expanderat utmatningsläge (för närvarande: %s)\n" -#: help.c:323 +#: help.c:302 msgid "auto" msgstr "auto" -#: help.c:326 +#: help.c:305 msgid "Connection\n" msgstr "Anslutning\n" -#: help.c:328 +#: help.c:307 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3140,7 +3247,7 @@ msgstr "" " \\c[onnect] {[DBNAMN|- ANVÄNDARE|- VÄRD|- PORT|-] | conninfo}\n" " koppla upp mot ny databas (för närvarande \"%s\")\n" -#: help.c:332 +#: help.c:311 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3148,70 +3255,70 @@ msgstr "" " \\c[onnect] {[DBNAMN|- ANVÄNDARE|- VÄRD|- PORT|-] | conninfo}\n" " koppla upp mot ny databas (för närvarande ingen uppkoppling)\n" -#: help.c:334 +#: help.c:313 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo visa information om aktuell uppkoppling\n" -#: help.c:335 +#: help.c:314 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [KODNING] visa eller sätt klientens teckenkodning\n" -#: help.c:336 +#: help.c:315 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [ANVÄNDARNAMN] byt användares lösenord pÃ¥ ett säkert sätt\n" -#: help.c:339 +#: help.c:318 msgid "Operating System\n" msgstr "Operativsystem\n" -#: help.c:340 +#: help.c:319 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [KATALOG] byt den aktuella katalogen\n" -#: help.c:341 +#: help.c:320 msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" msgstr " \\getenv PSQLVAR ENVVAR hämta omgivningsvariabel\n" -#: help.c:342 +#: help.c:321 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NAMN [VÄRDE] sätt eller nollställ omgivningsvariabel\n" -#: help.c:343 +#: help.c:322 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] slÃ¥ pÃ¥/av tidstagning av kommandon (för närvarande: %s)\n" -#: help.c:345 +#: help.c:324 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr " \\! [KOMMANDO] kör kommando i skal eller starta interaktivt skal\n" -#: help.c:348 +#: help.c:327 msgid "Variables\n" msgstr "Variabler\n" -#: help.c:349 +#: help.c:328 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [TEXT] NAMN be användaren att sätta en intern variabel\n" -#: help.c:350 +#: help.c:329 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [NAMN [VÄRDE]] sätt intern variabel, eller lista alla om ingen param\n" -#: help.c:351 +#: help.c:330 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NAME ta bort intern variabel\n" -#: help.c:390 +#: help.c:369 msgid "" "List of specially treated variables\n" "\n" msgstr "Lista av variabler som hanteras speciellt\n" -#: help.c:392 +#: help.c:371 msgid "psql variables:\n" msgstr "psql-variabler:\n" -#: help.c:394 +#: help.c:373 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3221,7 +3328,7 @@ msgstr "" " eller \\set NAMN VÄRDE inne i psql\n" "\n" -#: help.c:396 +#: help.c:375 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3229,7 +3336,7 @@ msgstr "" " AUTOCOMMIT\n" " om satt sÃ¥ kommer efterföljande SQL-kommandon commit:as automatiskt\n" -#: help.c:398 +#: help.c:377 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3239,7 +3346,7 @@ msgstr "" " bestämmer skiftläge för att komplettera SQL-nyckelord\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:401 +#: help.c:380 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3247,7 +3354,7 @@ msgstr "" " DBNAME\n" " den uppkopplade databasens namn\n" -#: help.c:403 +#: help.c:382 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3257,7 +3364,7 @@ msgstr "" " bestämmer vilken indata som skrivs till standard ut\n" " [all, errors, none, queries]\n" -#: help.c:406 +#: help.c:385 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3267,7 +3374,7 @@ msgstr "" " om satt, visa interna frÃ¥gor som körs av backÃ¥tstreckkommandon:\n" " om satt till \"noexec\", bara visa dem utan att köra\n" -#: help.c:409 +#: help.c:388 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3275,15 +3382,15 @@ msgstr "" " ENCODING\n" " aktuell teckenkodning för klient\n" -#: help.c:411 +#: help.c:390 msgid "" " ERROR\n" -" true if last query failed, else false\n" +" \"true\" if last query failed, else \"false\"\n" msgstr "" " ERROR\n" -" sant om sista frÃ¥gan misslyckades, falskt annars\n" +" \"true\" om sista frÃ¥gan misslyckades, \"false\" annars\n" -#: help.c:413 +#: help.c:392 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3291,7 +3398,7 @@ msgstr "" " FETCH_COUNT\n" " antal resultatrader som hämtas och visas Ã¥t gÃ¥ngen (0=obegränsat)\n" -#: help.c:415 +#: help.c:394 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3299,7 +3406,7 @@ msgstr "" " HIDE_TABLEAM\n" " om satt sÃ¥ visas inte accessmetoder\n" -#: help.c:417 +#: help.c:396 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" @@ -3307,7 +3414,7 @@ msgstr "" " HIDE_TOAST_COMPRESSION\n" " om satt sÃ¥ visas inte komprimeringsmetoder\n" -#: help.c:419 +#: help.c:398 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3315,7 +3422,7 @@ msgstr "" " HISTCONTROL\n" " styr kommandohistoriken [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:421 +#: help.c:400 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3323,7 +3430,7 @@ msgstr "" " HISTFILE\n" " filnamn för att spara kommandohistoriken i\n" -#: help.c:423 +#: help.c:402 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3331,7 +3438,7 @@ msgstr "" " HISTSIZE\n" " maximalt antal kommandon som sparas i kommandohistoriken\n" -#: help.c:425 +#: help.c:404 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3339,7 +3446,7 @@ msgstr "" " HOST\n" " den uppkopplade databasens värd\n" -#: help.c:427 +#: help.c:406 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3347,7 +3454,7 @@ msgstr "" " IGNOREEOF\n" " antal EOF som behövs för att avsluta en interaktiv session\n" -#: help.c:429 +#: help.c:408 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3355,7 +3462,7 @@ msgstr "" " LASTOID\n" " värdet av den senast pÃ¥verkade OID:en\n" -#: help.c:431 +#: help.c:410 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3365,7 +3472,7 @@ msgstr "" " LAST_ERROR_SQLSTATE\n" " meddelande och SQLSTATE för sista felet eller en tom sträng och \"00000\" om det inte varit fel\n" -#: help.c:434 +#: help.c:413 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3373,7 +3480,7 @@ msgstr "" " ON_ERROR_ROLLBACK\n" " om satt, ett fel stoppar inte en transaktion (använder implicita sparpunkter)\n" -#: help.c:436 +#: help.c:415 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3381,7 +3488,7 @@ msgstr "" " ON_ERROR_STOP\n" " avsluta batchkörning vid fel\n" -#: help.c:438 +#: help.c:417 msgid "" " PORT\n" " server port of the current connection\n" @@ -3389,7 +3496,7 @@ msgstr "" " PORT\n" " värdport för den aktuella uppkopplingen\n" -#: help.c:440 +#: help.c:419 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3397,7 +3504,7 @@ msgstr "" " PROMPT1\n" " anger standardprompten för psql\n" -#: help.c:442 +#: help.c:421 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3405,7 +3512,7 @@ msgstr "" " PROMPT2\n" " anger den prompt som används om en sats forsätter pÃ¥ efterföljande rad\n" -#: help.c:444 +#: help.c:423 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3413,7 +3520,7 @@ msgstr "" " PROMPT3\n" " anger den prompt som används för COPY ... FROM STDIN\n" -#: help.c:446 +#: help.c:425 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3421,7 +3528,7 @@ msgstr "" " QUIET\n" " kör tyst (samma som flaggan -q)\n" -#: help.c:448 +#: help.c:427 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3429,7 +3536,7 @@ msgstr "" " ROW_COUNT\n" " antal rader som returnerades eller pÃ¥verkades av senaste frÃ¥gan alternativt 0\n" -#: help.c:450 +#: help.c:429 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3439,7 +3546,23 @@ msgstr "" " SERVER_VERSION_NAME\n" " serverns version (i kort sträng eller numeriskt format)\n" -#: help.c:453 +#: help.c:432 +msgid "" +" SHELL_ERROR\n" +" \"true\" if the last shell command failed, \"false\" if it succeeded\n" +msgstr "" +" ERROR\n" +" \"true\" om sista frÃ¥gan misslyckades, \"false\" annars\n" + +#: help.c:434 +msgid "" +" SHELL_EXIT_CODE\n" +" exit status of the last shell command\n" +msgstr "" +" SHELL_EXIT_CODE\n" +" exit-kod för senaste skalkommandot\n" + +#: help.c:436 msgid "" " SHOW_ALL_RESULTS\n" " show all results of a combined query (\\;) instead of only the last\n" @@ -3448,7 +3571,7 @@ msgstr "" " visa alla resultat frÃ¥n en kombinerad frÃ¥ga (\\;) istället för bara\n" " det sista\n" -#: help.c:455 +#: help.c:438 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3456,7 +3579,7 @@ msgstr "" " SHOW_CONTEXT\n" " styr visning av meddelandekontextfält [never, errors, always]\n" -#: help.c:457 +#: help.c:440 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3464,7 +3587,7 @@ msgstr "" " SINGLELINE\n" " om satt, slut pÃ¥ raden avslutar SQL-kommandon (samma som flaggan -S )\n" -#: help.c:459 +#: help.c:442 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3472,7 +3595,7 @@ msgstr "" " SINGLESTEP\n" " stegningsläge (samma som flaggan -s)\n" -#: help.c:461 +#: help.c:444 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3480,7 +3603,7 @@ msgstr "" " SQLSTATE\n" " SQLSTATE för sista frÃ¥gan eller \"00000\" om det inte varit fel\n" -#: help.c:463 +#: help.c:446 msgid "" " USER\n" " the currently connected database user\n" @@ -3488,7 +3611,7 @@ msgstr "" " USER\n" " den uppkopplade databasanvändaren\n" -#: help.c:465 +#: help.c:448 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3496,7 +3619,7 @@ msgstr "" " VERBOSITY\n" " styr verbositet för felrapporter [default, verbose, terse, sqlstate]\n" -#: help.c:467 +#: help.c:450 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3508,7 +3631,7 @@ msgstr "" " VERSION_NUM\n" " psql:s version (i lÃ¥ng sträng, kort sträng eller numeriskt format)\n" -#: help.c:472 +#: help.c:455 msgid "" "\n" "Display settings:\n" @@ -3516,7 +3639,7 @@ msgstr "" "\n" "Visningsinställningar:\n" -#: help.c:474 +#: help.c:457 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3526,7 +3649,7 @@ msgstr "" " eller \\pset NAMN [VÄRDE] inne i psql\n" "\n" -#: help.c:476 +#: help.c:459 msgid "" " border\n" " border style (number)\n" @@ -3534,7 +3657,7 @@ msgstr "" " border\n" " ramstil (nummer)\n" -#: help.c:478 +#: help.c:461 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3542,15 +3665,15 @@ msgstr "" " columns\n" " mÃ¥lvidd för wrappade format\n" -#: help.c:480 +#: help.c:463 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" msgstr "" " expanded (eller x)\n" -" expanderad utdata [on, off, auto]\n" +" expanderat utmatningsläge [on, off, auto]\n" -#: help.c:482 +#: help.c:465 #, c-format msgid "" " fieldsep\n" @@ -3559,7 +3682,7 @@ msgstr "" " fieldsep\n" " fältseparator för ej justerad utdata (standard \"%s\")\n" -#: help.c:485 +#: help.c:468 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3567,7 +3690,7 @@ msgstr "" " fieldsep_zero\n" " sätt fältseparator för ej justerad utdata till noll-byte\n" -#: help.c:487 +#: help.c:470 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3575,7 +3698,7 @@ msgstr "" " footer\n" " slÃ¥ pÃ¥/av visning av tabellfot [on, off]\n" -#: help.c:489 +#: help.c:472 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3583,7 +3706,7 @@ msgstr "" " format\n" " sätt utdataformat [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:491 +#: help.c:474 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3591,7 +3714,7 @@ msgstr "" " linestyle\n" " sätt ramlinjestil [ascii, old-ascii, unicode]\n" -#: help.c:493 +#: help.c:476 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3599,7 +3722,7 @@ msgstr "" " null\n" " sätt sträng som visas istället för null-värden\n" -#: help.c:495 +#: help.c:478 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3607,7 +3730,7 @@ msgstr "" " numericlocale\n" " slÃ¥ pÃ¥ visning av lokalspecifika tecken för gruppering av siffror\n" -#: help.c:497 +#: help.c:480 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3615,7 +3738,7 @@ msgstr "" " pager\n" " styr när en extern pagenerare används [yes, no, always]\n" -#: help.c:499 +#: help.c:482 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3623,7 +3746,7 @@ msgstr "" " recordsep\n" " post (rad) separator för ej justerad utdata\n" -#: help.c:501 +#: help.c:484 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3631,7 +3754,7 @@ msgstr "" " recordsep_zero\n" " sätt postseparator för ej justerad utdata till noll-byte\n" -#: help.c:503 +#: help.c:486 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3641,7 +3764,7 @@ msgstr "" " ange attribut för tabelltaggen i html-format eller proportionella\n" " kolumnvidder för vänsterjusterade datatypet i latex-longtable-format\n" -#: help.c:506 +#: help.c:489 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3649,7 +3772,7 @@ msgstr "" " title\n" " sätt tabelltitel för efterkommande tabellutskrifter\n" -#: help.c:508 +#: help.c:491 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3657,7 +3780,7 @@ msgstr "" " tuples_only\n" " om satt, bara tabelldatan visas\n" -#: help.c:510 +#: help.c:493 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3669,7 +3792,17 @@ msgstr "" " unicode_header_linestyle\n" " sätter stilen pÃ¥ Unicode-linjer [single, double]\n" -#: help.c:515 +#: help.c:497 +msgid "" +" xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr "" +" xheader_width\n" +" sätt maximal bredd pÃ¥ rubriken för expanderat utmatningsläge\n" +" [full, column, page, integer value]\n" + +#: help.c:501 msgid "" "\n" "Environment variables:\n" @@ -3677,7 +3810,7 @@ msgstr "" "\n" "Omgivningsvariabler:\n" -#: help.c:519 +#: help.c:505 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3687,7 +3820,7 @@ msgstr "" " eller \\setenv NAMN [VÄRDE] inne psql\n" "\n" -#: help.c:521 +#: help.c:507 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3699,7 +3832,7 @@ msgstr "" " eller \\setenv NAMN [VÄRDE] inne i psql\n" "\n" -#: help.c:524 +#: help.c:510 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3707,7 +3840,7 @@ msgstr "" " COLUMNS\n" " antal kolumner i wrappade format\n" -#: help.c:526 +#: help.c:512 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3715,7 +3848,7 @@ msgstr "" " PGAPPNAME\n" " samma som anslutningsparametern \"application_name\"\n" -#: help.c:528 +#: help.c:514 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3723,7 +3856,7 @@ msgstr "" " PGDATABASE\n" " samma som anslutningsparametern \"dbname\"\n" -#: help.c:530 +#: help.c:516 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3731,7 +3864,7 @@ msgstr "" " PGHOST\n" " samma som anslutningsparametern \"host\"\n" -#: help.c:532 +#: help.c:518 msgid "" " PGPASSFILE\n" " password file name\n" @@ -3739,7 +3872,7 @@ msgstr "" " PGPASSFILE\n" " lösenordsfilnamn\n" -#: help.c:534 +#: help.c:520 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -3747,7 +3880,7 @@ msgstr "" " PGPASSWORD\n" " uppkoppingens lösenord (rekommenderas inte)\n" -#: help.c:536 +#: help.c:522 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -3755,7 +3888,7 @@ msgstr "" " PGPORT\n" " samma som anslutingsparametern \"port\"\n" -#: help.c:538 +#: help.c:524 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -3763,7 +3896,7 @@ msgstr "" " PGUSER\n" " samma som anslutningsparametern \"user\"\n" -#: help.c:540 +#: help.c:526 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -3771,7 +3904,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " redigerare som används av kommanona \\e, \\ef och \\ev\n" -#: help.c:542 +#: help.c:528 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -3779,7 +3912,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " hur radnummer anges när redigerare startas\n" -#: help.c:544 +#: help.c:530 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -3787,7 +3920,7 @@ msgstr "" " PSQL_HISTORY\n" " alternativ plats för kommandohistorikfilen\n" -#: help.c:546 +#: help.c:532 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -3795,7 +3928,7 @@ msgstr "" " PAGER\n" " namnet pÃ¥ den externa pageneraren\n" -#: help.c:549 +#: help.c:535 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" @@ -3803,7 +3936,7 @@ msgstr "" " PSQL_WATCH_PAGER\n" " namn pÃ¥ externt paginerarprogram för \\watch\n" -#: help.c:552 +#: help.c:538 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -3811,7 +3944,7 @@ msgstr "" " PSQLRC\n" " alternativ plats för användarens \".psqlrc\"-fil\n" -#: help.c:554 +#: help.c:540 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -3819,7 +3952,7 @@ msgstr "" " SHELL\n" " skalet som används av kommandot \\!\n" -#: help.c:556 +#: help.c:542 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -3827,11 +3960,11 @@ msgstr "" " TMPDIR\n" " katalog för temporärfiler\n" -#: help.c:616 +#: help.c:602 msgid "Available help:\n" msgstr "Tillgänglig hjälp:\n" -#: help.c:711 +#: help.c:697 #, c-format msgid "" "Command: %s\n" @@ -3850,7 +3983,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:734 +#: help.c:720 #, c-format msgid "" "No help available for \"%s\".\n" @@ -3859,17 +3992,17 @@ msgstr "" "Ingen hjälp tillgänglig för \"%s\".\n" "Försök med \\h utan argument för att se den tillgängliga hjälpen.\n" -#: input.c:217 +#: input.c:215 #, c-format msgid "could not read from input file: %m" msgstr "kunde inte läsa frÃ¥n infilen: %m" -#: input.c:478 input.c:516 +#: input.c:476 input.c:514 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "kunde inte skriva kommandohistorien till \"%s\": %m" -#: input.c:535 +#: input.c:533 #, c-format msgid "history is not supported by this installation" msgstr "historia stöds inte av denna installationen" @@ -3956,12 +4089,12 @@ msgstr "frÃ¥ga ignorerat; använd \\endif eller Ctrl-C för att avsluta aktuellt msgid "reached EOF without finding closing \\endif(s)" msgstr "kom till EOF utan att hitta avslutande \\endif" -#: psqlscanslash.l:638 +#: psqlscanslash.l:642 #, c-format msgid "unterminated quoted string" msgstr "icketerminerad citerad sträng" -#: psqlscanslash.l:811 +#: psqlscanslash.l:842 #, c-format msgid "%s: out of memory" msgstr "%s: slut pÃ¥ minne" @@ -3969,2410 +4102,2447 @@ msgstr "%s: slut pÃ¥ minne" #: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 #: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 #: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 -#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238 -#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248 -#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267 -#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323 -#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443 -#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524 -#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595 -#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606 -#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668 -#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714 -#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747 -#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802 -#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900 -#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999 -#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 -#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071 -#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086 -#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116 -#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141 -#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 -#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163 -#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310 -#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320 -#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445 -#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486 -#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507 -#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523 -#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548 -#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577 -#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 -#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687 -#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696 -#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996 -#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 -#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 -#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 -#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 -#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 -#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 -#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 -#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 -#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 -#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 -#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 -#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 -#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 -#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 -#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 -#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 -#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 -#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 -#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 -#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 -#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4687 -#: sql_help.c:4735 sql_help.c:4893 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:245 +#: sql_help.c:247 sql_help.c:248 sql_help.c:250 sql_help.c:252 sql_help.c:255 +#: sql_help.c:257 sql_help.c:259 sql_help.c:261 sql_help.c:276 sql_help.c:277 +#: sql_help.c:278 sql_help.c:280 sql_help.c:329 sql_help.c:331 sql_help.c:333 +#: sql_help.c:335 sql_help.c:404 sql_help.c:409 sql_help.c:411 sql_help.c:453 +#: sql_help.c:455 sql_help.c:458 sql_help.c:460 sql_help.c:529 sql_help.c:534 +#: sql_help.c:539 sql_help.c:544 sql_help.c:549 sql_help.c:603 sql_help.c:605 +#: sql_help.c:607 sql_help.c:609 sql_help.c:611 sql_help.c:614 sql_help.c:616 +#: sql_help.c:619 sql_help.c:630 sql_help.c:632 sql_help.c:676 sql_help.c:678 +#: sql_help.c:680 sql_help.c:683 sql_help.c:685 sql_help.c:687 sql_help.c:728 +#: sql_help.c:732 sql_help.c:736 sql_help.c:757 sql_help.c:760 sql_help.c:763 +#: sql_help.c:792 sql_help.c:804 sql_help.c:812 sql_help.c:815 sql_help.c:818 +#: sql_help.c:833 sql_help.c:836 sql_help.c:865 sql_help.c:870 sql_help.c:875 +#: sql_help.c:880 sql_help.c:885 sql_help.c:912 sql_help.c:914 sql_help.c:916 +#: sql_help.c:918 sql_help.c:921 sql_help.c:923 sql_help.c:970 sql_help.c:1015 +#: sql_help.c:1020 sql_help.c:1025 sql_help.c:1030 sql_help.c:1035 +#: sql_help.c:1054 sql_help.c:1065 sql_help.c:1067 sql_help.c:1087 +#: sql_help.c:1097 sql_help.c:1098 sql_help.c:1100 sql_help.c:1102 +#: sql_help.c:1114 sql_help.c:1118 sql_help.c:1120 sql_help.c:1132 +#: sql_help.c:1134 sql_help.c:1136 sql_help.c:1138 sql_help.c:1157 +#: sql_help.c:1159 sql_help.c:1163 sql_help.c:1167 sql_help.c:1171 +#: sql_help.c:1174 sql_help.c:1175 sql_help.c:1176 sql_help.c:1179 +#: sql_help.c:1182 sql_help.c:1184 sql_help.c:1324 sql_help.c:1326 +#: sql_help.c:1329 sql_help.c:1332 sql_help.c:1334 sql_help.c:1336 +#: sql_help.c:1339 sql_help.c:1342 sql_help.c:1464 sql_help.c:1466 +#: sql_help.c:1468 sql_help.c:1471 sql_help.c:1492 sql_help.c:1495 +#: sql_help.c:1498 sql_help.c:1501 sql_help.c:1505 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1525 sql_help.c:1528 +#: sql_help.c:1530 sql_help.c:1532 sql_help.c:1542 sql_help.c:1544 +#: sql_help.c:1554 sql_help.c:1556 sql_help.c:1566 sql_help.c:1569 +#: sql_help.c:1592 sql_help.c:1594 sql_help.c:1596 sql_help.c:1598 +#: sql_help.c:1601 sql_help.c:1603 sql_help.c:1606 sql_help.c:1609 +#: sql_help.c:1660 sql_help.c:1703 sql_help.c:1706 sql_help.c:1708 +#: sql_help.c:1710 sql_help.c:1713 sql_help.c:1715 sql_help.c:1717 +#: sql_help.c:1720 sql_help.c:1770 sql_help.c:1786 sql_help.c:2019 +#: sql_help.c:2088 sql_help.c:2107 sql_help.c:2120 sql_help.c:2178 +#: sql_help.c:2186 sql_help.c:2196 sql_help.c:2224 sql_help.c:2257 +#: sql_help.c:2275 sql_help.c:2303 sql_help.c:2414 sql_help.c:2460 +#: sql_help.c:2485 sql_help.c:2508 sql_help.c:2512 sql_help.c:2546 +#: sql_help.c:2566 sql_help.c:2588 sql_help.c:2602 sql_help.c:2623 +#: sql_help.c:2652 sql_help.c:2685 sql_help.c:2708 sql_help.c:2755 +#: sql_help.c:3053 sql_help.c:3066 sql_help.c:3083 sql_help.c:3099 +#: sql_help.c:3139 sql_help.c:3193 sql_help.c:3197 sql_help.c:3199 +#: sql_help.c:3206 sql_help.c:3225 sql_help.c:3252 sql_help.c:3287 +#: sql_help.c:3299 sql_help.c:3308 sql_help.c:3352 sql_help.c:3366 +#: sql_help.c:3394 sql_help.c:3402 sql_help.c:3414 sql_help.c:3424 +#: sql_help.c:3432 sql_help.c:3440 sql_help.c:3448 sql_help.c:3456 +#: sql_help.c:3465 sql_help.c:3476 sql_help.c:3484 sql_help.c:3492 +#: sql_help.c:3500 sql_help.c:3508 sql_help.c:3518 sql_help.c:3527 +#: sql_help.c:3536 sql_help.c:3544 sql_help.c:3554 sql_help.c:3565 +#: sql_help.c:3573 sql_help.c:3582 sql_help.c:3593 sql_help.c:3602 +#: sql_help.c:3610 sql_help.c:3618 sql_help.c:3626 sql_help.c:3634 +#: sql_help.c:3642 sql_help.c:3650 sql_help.c:3658 sql_help.c:3666 +#: sql_help.c:3674 sql_help.c:3682 sql_help.c:3699 sql_help.c:3708 +#: sql_help.c:3716 sql_help.c:3733 sql_help.c:3748 sql_help.c:4061 +#: sql_help.c:4182 sql_help.c:4211 sql_help.c:4227 sql_help.c:4229 +#: sql_help.c:4733 sql_help.c:4781 sql_help.c:4940 msgid "name" msgstr "namn" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 -#: sql_help.c:3339 sql_help.c:4455 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:340 sql_help.c:1863 +#: sql_help.c:3367 sql_help.c:4500 msgid "aggregate_signature" msgstr "aggregatsignatur" -#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253 -#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576 -#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798 -#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008 -#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105 -#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444 -#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534 -#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:260 +#: sql_help.c:281 sql_help.c:412 sql_help.c:459 sql_help.c:538 sql_help.c:586 +#: sql_help.c:604 sql_help.c:631 sql_help.c:684 sql_help.c:759 sql_help.c:814 +#: sql_help.c:835 sql_help.c:874 sql_help.c:924 sql_help.c:971 sql_help.c:1024 +#: sql_help.c:1056 sql_help.c:1066 sql_help.c:1101 sql_help.c:1121 +#: sql_help.c:1135 sql_help.c:1185 sql_help.c:1333 sql_help.c:1465 +#: sql_help.c:1508 sql_help.c:1529 sql_help.c:1543 sql_help.c:1555 +#: sql_help.c:1568 sql_help.c:1595 sql_help.c:1661 sql_help.c:1714 msgid "new_name" msgstr "nytt_namn" -#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251 -#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623 -#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801 -#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 -#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 -#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510 -#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:258 +#: sql_help.c:279 sql_help.c:410 sql_help.c:495 sql_help.c:543 sql_help.c:633 +#: sql_help.c:642 sql_help.c:707 sql_help.c:731 sql_help.c:762 sql_help.c:817 +#: sql_help.c:879 sql_help.c:922 sql_help.c:1029 sql_help.c:1068 +#: sql_help.c:1099 sql_help.c:1119 sql_help.c:1133 sql_help.c:1183 +#: sql_help.c:1399 sql_help.c:1467 sql_help.c:1510 sql_help.c:1531 +#: sql_help.c:1593 sql_help.c:1709 sql_help.c:3039 msgid "new_owner" msgstr "ny_ägare" -#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322 -#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749 -#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087 -#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512 -#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:262 sql_help.c:332 +#: sql_help.c:461 sql_help.c:548 sql_help.c:686 sql_help.c:735 sql_help.c:765 +#: sql_help.c:820 sql_help.c:884 sql_help.c:1034 sql_help.c:1103 +#: sql_help.c:1137 sql_help.c:1335 sql_help.c:1512 sql_help.c:1533 +#: sql_help.c:1545 sql_help.c:1557 sql_help.c:1597 sql_help.c:1716 msgid "new_schema" msgstr "nytt_schema" -#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484 +#: sql_help.c:44 sql_help.c:1927 sql_help.c:3368 sql_help.c:4529 msgid "where aggregate_signature is:" msgstr "där aggregatsignatur är:" -#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353 -#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520 -#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 -#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 -#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 -#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911 -#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085 -#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 -#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 -#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 -#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 -#: sql_help.c:4491 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:350 sql_help.c:363 +#: sql_help.c:367 sql_help.c:383 sql_help.c:386 sql_help.c:389 sql_help.c:530 +#: sql_help.c:535 sql_help.c:540 sql_help.c:545 sql_help.c:550 sql_help.c:866 +#: sql_help.c:871 sql_help.c:876 sql_help.c:881 sql_help.c:886 sql_help.c:1016 +#: sql_help.c:1021 sql_help.c:1026 sql_help.c:1031 sql_help.c:1036 +#: sql_help.c:1881 sql_help.c:1898 sql_help.c:1904 sql_help.c:1928 +#: sql_help.c:1931 sql_help.c:1934 sql_help.c:2089 sql_help.c:2108 +#: sql_help.c:2111 sql_help.c:2415 sql_help.c:2624 sql_help.c:3369 +#: sql_help.c:3372 sql_help.c:3375 sql_help.c:3466 sql_help.c:3555 +#: sql_help.c:3583 sql_help.c:3936 sql_help.c:4399 sql_help.c:4506 +#: sql_help.c:4513 sql_help.c:4519 sql_help.c:4530 sql_help.c:4533 +#: sql_help.c:4536 msgid "argmode" msgstr "arg_läge" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354 -#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 -#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 -#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 -#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 -#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912 -#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086 -#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 -#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 -#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 -#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:351 sql_help.c:364 +#: sql_help.c:368 sql_help.c:384 sql_help.c:387 sql_help.c:390 sql_help.c:531 +#: sql_help.c:536 sql_help.c:541 sql_help.c:546 sql_help.c:551 sql_help.c:867 +#: sql_help.c:872 sql_help.c:877 sql_help.c:882 sql_help.c:887 sql_help.c:1017 +#: sql_help.c:1022 sql_help.c:1027 sql_help.c:1032 sql_help.c:1037 +#: sql_help.c:1882 sql_help.c:1899 sql_help.c:1905 sql_help.c:1929 +#: sql_help.c:1932 sql_help.c:1935 sql_help.c:2090 sql_help.c:2109 +#: sql_help.c:2112 sql_help.c:2416 sql_help.c:2625 sql_help.c:3370 +#: sql_help.c:3373 sql_help.c:3376 sql_help.c:3467 sql_help.c:3556 +#: sql_help.c:3584 sql_help.c:4507 sql_help.c:4514 sql_help.c:4520 +#: sql_help.c:4531 sql_help.c:4534 sql_help.c:4537 msgid "argname" msgstr "arg_namn" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355 -#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 -#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 -#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 -#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 -#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 -#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597 -#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 -#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 -#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:352 sql_help.c:365 +#: sql_help.c:369 sql_help.c:385 sql_help.c:388 sql_help.c:391 sql_help.c:532 +#: sql_help.c:537 sql_help.c:542 sql_help.c:547 sql_help.c:552 sql_help.c:868 +#: sql_help.c:873 sql_help.c:878 sql_help.c:883 sql_help.c:888 sql_help.c:1018 +#: sql_help.c:1023 sql_help.c:1028 sql_help.c:1033 sql_help.c:1038 +#: sql_help.c:1883 sql_help.c:1900 sql_help.c:1906 sql_help.c:1930 +#: sql_help.c:1933 sql_help.c:1936 sql_help.c:2417 sql_help.c:2626 +#: sql_help.c:3371 sql_help.c:3374 sql_help.c:3377 sql_help.c:3468 +#: sql_help.c:3557 sql_help.c:3585 sql_help.c:4508 sql_help.c:4515 +#: sql_help.c:4521 sql_help.c:4532 sql_help.c:4535 sql_help.c:4538 msgid "argtype" msgstr "arg_typ" -#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 -#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666 -#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974 -#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 -#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 -#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 -#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4956 +#: sql_help.c:114 sql_help.c:407 sql_help.c:484 sql_help.c:496 sql_help.c:965 +#: sql_help.c:1116 sql_help.c:1526 sql_help.c:1655 sql_help.c:1687 +#: sql_help.c:1739 sql_help.c:1798 sql_help.c:1987 sql_help.c:1994 +#: sql_help.c:2306 sql_help.c:2356 sql_help.c:2363 sql_help.c:2372 +#: sql_help.c:2461 sql_help.c:2686 sql_help.c:2777 sql_help.c:3068 +#: sql_help.c:3253 sql_help.c:3275 sql_help.c:3415 sql_help.c:3772 +#: sql_help.c:3980 sql_help.c:4226 sql_help.c:4228 sql_help.c:5006 msgid "option" msgstr "flaggor" -#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 -#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 +#: sql_help.c:115 sql_help.c:966 sql_help.c:1656 sql_help.c:2462 +#: sql_help.c:2687 sql_help.c:3254 sql_help.c:3416 msgid "where option can be:" msgstr "där flaggor kan vara:" -#: sql_help.c:116 sql_help.c:2209 +#: sql_help.c:116 sql_help.c:2238 msgid "allowconn" msgstr "tillÃ¥tansl" -#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 -#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 +#: sql_help.c:117 sql_help.c:967 sql_help.c:1657 sql_help.c:2239 +#: sql_help.c:2463 sql_help.c:2688 sql_help.c:3255 msgid "connlimit" msgstr "anslutningstak" -#: sql_help.c:118 sql_help.c:2211 +#: sql_help.c:118 sql_help.c:2240 msgid "istemplate" msgstr "ärmall" -#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322 -#: sql_help.c:1374 sql_help.c:4187 +#: sql_help.c:124 sql_help.c:621 sql_help.c:689 sql_help.c:703 sql_help.c:1338 +#: sql_help.c:1392 sql_help.c:4232 msgid "new_tablespace" msgstr "nytt_tabellutrymme" -#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550 -#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 -#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 -#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643 -#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601 -#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4675 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:558 sql_help.c:560 +#: sql_help.c:561 sql_help.c:891 sql_help.c:893 sql_help.c:894 sql_help.c:974 +#: sql_help.c:978 sql_help.c:981 sql_help.c:1043 sql_help.c:1045 +#: sql_help.c:1046 sql_help.c:1196 sql_help.c:1198 sql_help.c:1664 +#: sql_help.c:1668 sql_help.c:1671 sql_help.c:2427 sql_help.c:2630 +#: sql_help.c:3948 sql_help.c:4250 sql_help.c:4411 sql_help.c:4721 msgid "configuration_parameter" msgstr "konfigurationsparameter" -#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487 -#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876 -#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101 -#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157 -#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182 -#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449 -#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667 -#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 -#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 -#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 -#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 -#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 -#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4676 -#: sql_help.c:4677 sql_help.c:4678 sql_help.c:4679 +#: sql_help.c:128 sql_help.c:408 sql_help.c:479 sql_help.c:485 sql_help.c:497 +#: sql_help.c:559 sql_help.c:613 sql_help.c:695 sql_help.c:705 sql_help.c:892 +#: sql_help.c:920 sql_help.c:975 sql_help.c:1044 sql_help.c:1117 +#: sql_help.c:1162 sql_help.c:1166 sql_help.c:1170 sql_help.c:1173 +#: sql_help.c:1178 sql_help.c:1181 sql_help.c:1197 sql_help.c:1371 +#: sql_help.c:1394 sql_help.c:1442 sql_help.c:1450 sql_help.c:1470 +#: sql_help.c:1527 sql_help.c:1611 sql_help.c:1665 sql_help.c:1688 +#: sql_help.c:2307 sql_help.c:2357 sql_help.c:2364 sql_help.c:2373 +#: sql_help.c:2428 sql_help.c:2429 sql_help.c:2493 sql_help.c:2496 +#: sql_help.c:2530 sql_help.c:2631 sql_help.c:2632 sql_help.c:2655 +#: sql_help.c:2778 sql_help.c:2817 sql_help.c:2927 sql_help.c:2940 +#: sql_help.c:2954 sql_help.c:2995 sql_help.c:3003 sql_help.c:3025 +#: sql_help.c:3042 sql_help.c:3069 sql_help.c:3276 sql_help.c:3981 +#: sql_help.c:4722 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 msgid "value" msgstr "värde" -#: sql_help.c:200 +#: sql_help.c:202 msgid "target_role" msgstr "mÃ¥lroll" -#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 -#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 -#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 -#: sql_help.c:4357 sql_help.c:4369 +#: sql_help.c:203 sql_help.c:929 sql_help.c:2291 sql_help.c:2660 +#: sql_help.c:2733 sql_help.c:2738 sql_help.c:3911 sql_help.c:3920 +#: sql_help.c:3939 sql_help.c:3951 sql_help.c:4374 sql_help.c:4383 +#: sql_help.c:4402 sql_help.c:4414 msgid "schema_name" msgstr "schemanamn" -#: sql_help.c:202 +#: sql_help.c:204 msgid "abbreviated_grant_or_revoke" msgstr "förkortad_grant_eller_revoke" -#: sql_help.c:203 +#: sql_help.c:205 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "där förkortad_grant_eller_revok är en av:" -#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 -#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 -#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 -#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438 -#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 -#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 -#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 -#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 -#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4697 +#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 +#: sql_help.c:211 sql_help.c:212 sql_help.c:213 sql_help.c:214 sql_help.c:215 +#: sql_help.c:584 sql_help.c:620 sql_help.c:688 sql_help.c:838 sql_help.c:985 +#: sql_help.c:1337 sql_help.c:1675 sql_help.c:2466 sql_help.c:2467 +#: sql_help.c:2468 sql_help.c:2469 sql_help.c:2470 sql_help.c:2604 +#: sql_help.c:2691 sql_help.c:2692 sql_help.c:2693 sql_help.c:3258 +#: sql_help.c:3259 sql_help.c:3260 sql_help.c:3261 sql_help.c:3262 +#: sql_help.c:3960 sql_help.c:3964 sql_help.c:4423 sql_help.c:4427 +#: sql_help.c:4743 msgid "role_name" msgstr "rollnamn" -#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339 -#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684 -#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 -#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 -#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 -#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981 -#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088 -#: sql_help.c:4090 sql_help.c:4548 sql_help.c:4549 sql_help.c:4558 -#: sql_help.c:4605 sql_help.c:4606 sql_help.c:4607 sql_help.c:4608 -#: sql_help.c:4609 sql_help.c:4610 sql_help.c:4650 sql_help.c:4651 -#: sql_help.c:4656 sql_help.c:4661 sql_help.c:4805 sql_help.c:4806 -#: sql_help.c:4815 sql_help.c:4862 sql_help.c:4863 sql_help.c:4864 -#: sql_help.c:4865 sql_help.c:4866 sql_help.c:4867 sql_help.c:4921 -#: sql_help.c:4923 sql_help.c:4983 sql_help.c:5043 sql_help.c:5044 -#: sql_help.c:5053 sql_help.c:5100 sql_help.c:5101 sql_help.c:5102 -#: sql_help.c:5103 sql_help.c:5104 sql_help.c:5105 +#: sql_help.c:246 sql_help.c:265 sql_help.c:472 sql_help.c:928 sql_help.c:1353 +#: sql_help.c:1355 sql_help.c:1359 sql_help.c:1409 sql_help.c:1421 +#: sql_help.c:1446 sql_help.c:1705 sql_help.c:2260 sql_help.c:2264 +#: sql_help.c:2376 sql_help.c:2381 sql_help.c:2489 sql_help.c:2659 +#: sql_help.c:2794 sql_help.c:2799 sql_help.c:2801 sql_help.c:2922 +#: sql_help.c:2935 sql_help.c:2949 sql_help.c:2958 sql_help.c:2970 +#: sql_help.c:2999 sql_help.c:4012 sql_help.c:4027 sql_help.c:4029 +#: sql_help.c:4125 sql_help.c:4128 sql_help.c:4130 sql_help.c:4593 +#: sql_help.c:4594 sql_help.c:4603 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4652 sql_help.c:4653 sql_help.c:4654 sql_help.c:4655 +#: sql_help.c:4696 sql_help.c:4697 sql_help.c:4702 sql_help.c:4707 +#: sql_help.c:4851 sql_help.c:4852 sql_help.c:4861 sql_help.c:4908 +#: sql_help.c:4909 sql_help.c:4910 sql_help.c:4911 sql_help.c:4912 +#: sql_help.c:4913 sql_help.c:4968 sql_help.c:4970 sql_help.c:5036 +#: sql_help.c:5096 sql_help.c:5097 sql_help.c:5106 sql_help.c:5153 +#: sql_help.c:5154 sql_help.c:5155 sql_help.c:5156 sql_help.c:5157 +#: sql_help.c:5158 msgid "expression" msgstr "uttryck" -#: sql_help.c:242 +#: sql_help.c:249 sql_help.c:2261 msgid "domain_constraint" msgstr "domain_villkor" -#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 -#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363 -#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852 -#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351 -#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 +#: sql_help.c:251 sql_help.c:253 sql_help.c:256 sql_help.c:264 sql_help.c:487 +#: sql_help.c:488 sql_help.c:1330 sql_help.c:1379 sql_help.c:1380 +#: sql_help.c:1381 sql_help.c:1408 sql_help.c:1420 sql_help.c:1437 +#: sql_help.c:1869 sql_help.c:1871 sql_help.c:2263 sql_help.c:2375 +#: sql_help.c:2380 sql_help.c:2957 sql_help.c:2969 sql_help.c:4024 msgid "constraint_name" msgstr "villkorsnamn" -#: sql_help.c:247 sql_help.c:1315 +#: sql_help.c:254 sql_help.c:1331 msgid "new_constraint_name" msgstr "nyy_villkorsnamn" -#: sql_help.c:320 sql_help.c:1099 +#: sql_help.c:263 sql_help.c:2262 +msgid "where domain_constraint is:" +msgstr "där domän_villkor är:" + +#: sql_help.c:330 sql_help.c:1115 msgid "new_version" msgstr "ny_version" -#: sql_help.c:324 sql_help.c:326 +#: sql_help.c:334 sql_help.c:336 msgid "member_object" msgstr "medlemsobjekt" -#: sql_help.c:327 +#: sql_help.c:337 msgid "where member_object is:" msgstr "där medlemsobjekt är:" -#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 -#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 -#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 -#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 -#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856 -#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 -#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869 -#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884 -#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894 -#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898 -#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 -#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456 -#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 -#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 -#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 -#: sql_help.c:4482 +#: sql_help.c:338 sql_help.c:343 sql_help.c:344 sql_help.c:345 sql_help.c:346 +#: sql_help.c:347 sql_help.c:348 sql_help.c:353 sql_help.c:357 sql_help.c:359 +#: sql_help.c:361 sql_help.c:370 sql_help.c:371 sql_help.c:372 sql_help.c:373 +#: sql_help.c:374 sql_help.c:375 sql_help.c:376 sql_help.c:377 sql_help.c:380 +#: sql_help.c:381 sql_help.c:1861 sql_help.c:1866 sql_help.c:1873 +#: sql_help.c:1874 sql_help.c:1875 sql_help.c:1876 sql_help.c:1877 +#: sql_help.c:1878 sql_help.c:1879 sql_help.c:1884 sql_help.c:1886 +#: sql_help.c:1890 sql_help.c:1892 sql_help.c:1896 sql_help.c:1901 +#: sql_help.c:1902 sql_help.c:1909 sql_help.c:1910 sql_help.c:1911 +#: sql_help.c:1912 sql_help.c:1913 sql_help.c:1914 sql_help.c:1915 +#: sql_help.c:1916 sql_help.c:1917 sql_help.c:1918 sql_help.c:1919 +#: sql_help.c:1924 sql_help.c:1925 sql_help.c:4496 sql_help.c:4501 +#: sql_help.c:4502 sql_help.c:4503 sql_help.c:4504 sql_help.c:4510 +#: sql_help.c:4511 sql_help.c:4516 sql_help.c:4517 sql_help.c:4522 +#: sql_help.c:4523 sql_help.c:4524 sql_help.c:4525 sql_help.c:4526 +#: sql_help.c:4527 msgid "object_name" msgstr "objektnamn" -#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454 +#: sql_help.c:339 sql_help.c:1862 sql_help.c:4499 msgid "aggregate_name" msgstr "aggregatnamn" -#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 -#: sql_help.c:2137 sql_help.c:3357 +#: sql_help.c:341 sql_help.c:1864 sql_help.c:2154 sql_help.c:2158 +#: sql_help.c:2160 sql_help.c:3385 msgid "source_type" msgstr "källtyp" -#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 -#: sql_help.c:2138 sql_help.c:3358 +#: sql_help.c:342 sql_help.c:1865 sql_help.c:2155 sql_help.c:2159 +#: sql_help.c:2161 sql_help.c:3386 msgid "target_type" msgstr "mÃ¥ltyp" -#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 -#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 -#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4577 -#: sql_help.c:4581 sql_help.c:4585 sql_help.c:4588 sql_help.c:4834 -#: sql_help.c:4838 sql_help.c:4842 sql_help.c:4845 sql_help.c:5072 -#: sql_help.c:5076 sql_help.c:5080 sql_help.c:5083 +#: sql_help.c:349 sql_help.c:802 sql_help.c:1880 sql_help.c:2156 +#: sql_help.c:2199 sql_help.c:2279 sql_help.c:2547 sql_help.c:2578 +#: sql_help.c:3145 sql_help.c:4398 sql_help.c:4505 sql_help.c:4622 +#: sql_help.c:4626 sql_help.c:4630 sql_help.c:4633 sql_help.c:4880 +#: sql_help.c:4884 sql_help.c:4888 sql_help.c:4891 sql_help.c:5125 +#: sql_help.c:5129 sql_help.c:5133 sql_help.c:5136 msgid "function_name" msgstr "funktionsnamn" -#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 +#: sql_help.c:354 sql_help.c:795 sql_help.c:1887 sql_help.c:2571 msgid "operator_name" msgstr "operatornamn" -#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 -#: sql_help.c:2519 sql_help.c:3481 +#: sql_help.c:355 sql_help.c:729 sql_help.c:733 sql_help.c:737 sql_help.c:1888 +#: sql_help.c:2548 sql_help.c:3509 msgid "left_type" msgstr "vänster_typ" -#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 -#: sql_help.c:2520 sql_help.c:3482 +#: sql_help.c:356 sql_help.c:730 sql_help.c:734 sql_help.c:738 sql_help.c:1889 +#: sql_help.c:2549 sql_help.c:3510 msgid "right_type" msgstr "höger_typ" -#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 -#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 -#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539 -#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 +#: sql_help.c:358 sql_help.c:360 sql_help.c:758 sql_help.c:761 sql_help.c:764 +#: sql_help.c:793 sql_help.c:805 sql_help.c:813 sql_help.c:816 sql_help.c:819 +#: sql_help.c:1426 sql_help.c:1891 sql_help.c:1893 sql_help.c:2568 +#: sql_help.c:2589 sql_help.c:2975 sql_help.c:3519 sql_help.c:3528 msgid "index_method" msgstr "indexmetod" -#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467 +#: sql_help.c:362 sql_help.c:1897 sql_help.c:4512 msgid "procedure_name" msgstr "procedurnamn" -#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473 +#: sql_help.c:366 sql_help.c:1903 sql_help.c:3935 sql_help.c:4518 msgid "routine_name" msgstr "rutinnamn" -#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 -#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 -#: sql_help.c:3926 sql_help.c:4375 +#: sql_help.c:378 sql_help.c:1398 sql_help.c:1920 sql_help.c:2423 +#: sql_help.c:2629 sql_help.c:2930 sql_help.c:3112 sql_help.c:3690 +#: sql_help.c:3957 sql_help.c:4420 msgid "type_name" msgstr "typnamn" -#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 -#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 -#: sql_help.c:4360 +#: sql_help.c:379 sql_help.c:1921 sql_help.c:2422 sql_help.c:2628 +#: sql_help.c:3113 sql_help.c:3343 sql_help.c:3691 sql_help.c:3942 +#: sql_help.c:4405 msgid "lang_name" msgstr "sprÃ¥knamn" -#: sql_help.c:372 +#: sql_help.c:382 msgid "and aggregate_signature is:" msgstr "och aggregatsignatur är:" -#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 +#: sql_help.c:405 sql_help.c:2021 sql_help.c:2304 msgid "handler_function" msgstr "hanterarfunktion" -#: sql_help.c:396 sql_help.c:2276 +#: sql_help.c:406 sql_help.c:2305 msgid "validator_function" msgstr "valideringsfunktion" -#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 -#: sql_help.c:1309 sql_help.c:1581 +#: sql_help.c:454 sql_help.c:533 sql_help.c:677 sql_help.c:869 sql_help.c:1019 +#: sql_help.c:1325 sql_help.c:1602 msgid "action" msgstr "aktion" -#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461 -#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470 -#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683 -#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080 -#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334 -#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 -#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349 -#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 -#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422 -#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683 -#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851 -#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984 -#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 -#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 -#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 -#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 -#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 -#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 -#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 -#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 -#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 -#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4614 -#: sql_help.c:4620 sql_help.c:4622 sql_help.c:4871 sql_help.c:4877 -#: sql_help.c:4879 sql_help.c:4920 sql_help.c:4922 sql_help.c:4924 -#: sql_help.c:4971 sql_help.c:5109 sql_help.c:5115 sql_help.c:5117 +#: sql_help.c:456 sql_help.c:463 sql_help.c:467 sql_help.c:468 sql_help.c:471 +#: sql_help.c:473 sql_help.c:474 sql_help.c:475 sql_help.c:477 sql_help.c:480 +#: sql_help.c:482 sql_help.c:483 sql_help.c:681 sql_help.c:691 sql_help.c:693 +#: sql_help.c:696 sql_help.c:698 sql_help.c:699 sql_help.c:927 sql_help.c:1096 +#: sql_help.c:1327 sql_help.c:1345 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 sql_help.c:1358 +#: sql_help.c:1360 sql_help.c:1361 sql_help.c:1363 sql_help.c:1366 +#: sql_help.c:1367 sql_help.c:1369 sql_help.c:1372 sql_help.c:1374 +#: sql_help.c:1375 sql_help.c:1422 sql_help.c:1424 sql_help.c:1431 +#: sql_help.c:1440 sql_help.c:1445 sql_help.c:1452 sql_help.c:1453 +#: sql_help.c:1704 sql_help.c:1707 sql_help.c:1711 sql_help.c:1747 +#: sql_help.c:1868 sql_help.c:1984 sql_help.c:1990 sql_help.c:2004 +#: sql_help.c:2005 sql_help.c:2006 sql_help.c:2354 sql_help.c:2367 +#: sql_help.c:2420 sql_help.c:2488 sql_help.c:2494 sql_help.c:2527 +#: sql_help.c:2658 sql_help.c:2763 sql_help.c:2798 sql_help.c:2800 +#: sql_help.c:2912 sql_help.c:2921 sql_help.c:2931 sql_help.c:2934 +#: sql_help.c:2944 sql_help.c:2948 sql_help.c:2971 sql_help.c:2973 +#: sql_help.c:2980 sql_help.c:2993 sql_help.c:2998 sql_help.c:3005 +#: sql_help.c:3006 sql_help.c:3022 sql_help.c:3148 sql_help.c:3288 +#: sql_help.c:3914 sql_help.c:3915 sql_help.c:4011 sql_help.c:4026 +#: sql_help.c:4028 sql_help.c:4030 sql_help.c:4124 sql_help.c:4127 +#: sql_help.c:4129 sql_help.c:4131 sql_help.c:4377 sql_help.c:4378 +#: sql_help.c:4498 sql_help.c:4659 sql_help.c:4666 sql_help.c:4668 +#: sql_help.c:4917 sql_help.c:4924 sql_help.c:4926 sql_help.c:4967 +#: sql_help.c:4969 sql_help.c:4971 sql_help.c:5024 sql_help.c:5162 +#: sql_help.c:5169 sql_help.c:5171 msgid "column_name" msgstr "kolumnnamn" -#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 +#: sql_help.c:457 sql_help.c:682 sql_help.c:1328 sql_help.c:1712 msgid "new_column_name" msgstr "nytt_kolumnnamn" -#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 -#: sql_help.c:1328 sql_help.c:1591 +#: sql_help.c:462 sql_help.c:554 sql_help.c:690 sql_help.c:890 sql_help.c:1040 +#: sql_help.c:1344 sql_help.c:1612 msgid "where action is one of:" msgstr "där aktion är en av:" -#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330 -#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229 -#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 -#: sql_help.c:3167 sql_help.c:4141 +#: sql_help.c:464 sql_help.c:469 sql_help.c:1088 sql_help.c:1346 +#: sql_help.c:1351 sql_help.c:1614 sql_help.c:1618 sql_help.c:2258 +#: sql_help.c:2355 sql_help.c:2567 sql_help.c:2756 sql_help.c:2913 +#: sql_help.c:3195 sql_help.c:4183 msgid "data_type" msgstr "datatyp" -#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336 -#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329 -#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 -#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 +#: sql_help.c:465 sql_help.c:470 sql_help.c:1347 sql_help.c:1352 +#: sql_help.c:1447 sql_help.c:1615 sql_help.c:1619 sql_help.c:2259 +#: sql_help.c:2358 sql_help.c:2490 sql_help.c:2915 sql_help.c:2923 +#: sql_help.c:2936 sql_help.c:2950 sql_help.c:3000 sql_help.c:3196 +#: sql_help.c:3202 sql_help.c:4021 msgid "collation" msgstr "jämförelse" -#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 -#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 +#: sql_help.c:466 sql_help.c:1348 sql_help.c:2359 sql_help.c:2368 +#: sql_help.c:2916 sql_help.c:2932 sql_help.c:2945 msgid "column_constraint" msgstr "kolumnvillkor" -#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4968 +#: sql_help.c:476 sql_help.c:618 sql_help.c:692 sql_help.c:1368 sql_help.c:5018 msgid "integer" msgstr "heltal" -#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352 -#: sql_help.c:1355 +#: sql_help.c:478 sql_help.c:481 sql_help.c:694 sql_help.c:697 sql_help.c:1370 +#: sql_help.c:1373 msgid "attribute_option" msgstr "attributalternativ" -#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 -#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 +#: sql_help.c:486 sql_help.c:1377 sql_help.c:2360 sql_help.c:2369 +#: sql_help.c:2917 sql_help.c:2933 sql_help.c:2946 msgid "table_constraint" msgstr "tabellvillkor" -#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364 -#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905 +#: sql_help.c:489 sql_help.c:490 sql_help.c:491 sql_help.c:492 sql_help.c:1382 +#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:1922 msgid "trigger_name" msgstr "triggernamn" -#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 -#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 +#: sql_help.c:493 sql_help.c:494 sql_help.c:1396 sql_help.c:1397 +#: sql_help.c:2361 sql_help.c:2366 sql_help.c:2920 sql_help.c:2943 msgid "parent_table" msgstr "föräldertabell" -#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 -#: sql_help.c:1550 sql_help.c:2261 +#: sql_help.c:553 sql_help.c:610 sql_help.c:679 sql_help.c:889 sql_help.c:1039 +#: sql_help.c:1571 sql_help.c:2290 msgid "extension_name" msgstr "utökningsnamn" -#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 +#: sql_help.c:555 sql_help.c:1041 sql_help.c:2424 msgid "execution_cost" msgstr "körkostnad" -#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 +#: sql_help.c:556 sql_help.c:1042 sql_help.c:2425 msgid "result_rows" msgstr "resultatrader" -#: sql_help.c:547 sql_help.c:2397 +#: sql_help.c:557 sql_help.c:2426 msgid "support_function" msgstr "supportfunktion" -#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 -#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641 -#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709 -#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 -#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 -#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896 -#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902 -#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912 -#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 -#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 -#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 -#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 -#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 -#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348 -#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358 -#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 -#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 -#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 -#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 +#: sql_help.c:579 sql_help.c:581 sql_help.c:964 sql_help.c:972 sql_help.c:976 +#: sql_help.c:979 sql_help.c:982 sql_help.c:1654 sql_help.c:1662 +#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1672 sql_help.c:2734 +#: sql_help.c:2736 sql_help.c:2739 sql_help.c:2740 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3917 sql_help.c:3918 sql_help.c:3921 +#: sql_help.c:3922 sql_help.c:3924 sql_help.c:3925 sql_help.c:3927 +#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3931 sql_help.c:3933 +#: sql_help.c:3934 sql_help.c:3940 sql_help.c:3941 sql_help.c:3943 +#: sql_help.c:3944 sql_help.c:3946 sql_help.c:3947 sql_help.c:3949 +#: sql_help.c:3950 sql_help.c:3952 sql_help.c:3953 sql_help.c:3955 +#: sql_help.c:3956 sql_help.c:3958 sql_help.c:3959 sql_help.c:3961 +#: sql_help.c:3962 sql_help.c:4375 sql_help.c:4376 sql_help.c:4380 +#: sql_help.c:4381 sql_help.c:4384 sql_help.c:4385 sql_help.c:4387 +#: sql_help.c:4388 sql_help.c:4390 sql_help.c:4391 sql_help.c:4393 +#: sql_help.c:4394 sql_help.c:4396 sql_help.c:4397 sql_help.c:4403 +#: sql_help.c:4404 sql_help.c:4406 sql_help.c:4407 sql_help.c:4409 +#: sql_help.c:4410 sql_help.c:4412 sql_help.c:4413 sql_help.c:4415 +#: sql_help.c:4416 sql_help.c:4418 sql_help.c:4419 sql_help.c:4421 +#: sql_help.c:4422 sql_help.c:4424 sql_help.c:4425 msgid "role_specification" msgstr "rollspecifikation" -#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 -#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4707 +#: sql_help.c:580 sql_help.c:582 sql_help.c:1685 sql_help.c:2225 +#: sql_help.c:2742 sql_help.c:3273 sql_help.c:3724 sql_help.c:4753 msgid "user_name" msgstr "användarnamn" -#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 -#: sql_help.c:3932 sql_help.c:4381 +#: sql_help.c:583 sql_help.c:984 sql_help.c:1674 sql_help.c:2741 +#: sql_help.c:3963 sql_help.c:4426 msgid "where role_specification can be:" msgstr "där rollspecifikation kan vara:" -#: sql_help.c:575 +#: sql_help.c:585 msgid "group_name" msgstr "gruppnamn" -#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 -#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 -#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 -#: sql_help.c:4372 +#: sql_help.c:606 sql_help.c:1443 sql_help.c:2237 sql_help.c:2497 +#: sql_help.c:2531 sql_help.c:2928 sql_help.c:2941 sql_help.c:2955 +#: sql_help.c:2996 sql_help.c:3026 sql_help.c:3038 sql_help.c:3954 +#: sql_help.c:4417 msgid "tablespace_name" msgstr "tabellutrymmesnamn" -#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382 -#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783 +#: sql_help.c:608 sql_help.c:701 sql_help.c:1390 sql_help.c:1400 +#: sql_help.c:1438 sql_help.c:1800 msgid "index_name" msgstr "indexnamn" -#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375 -#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500 -#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 -#: sql_help.c:2996 +#: sql_help.c:612 sql_help.c:615 sql_help.c:704 sql_help.c:706 sql_help.c:1393 +#: sql_help.c:1395 sql_help.c:1441 sql_help.c:2495 sql_help.c:2529 +#: sql_help.c:2926 sql_help.c:2939 sql_help.c:2953 sql_help.c:2994 +#: sql_help.c:3024 msgid "storage_parameter" msgstr "lagringsparameter" -#: sql_help.c:607 +#: sql_help.c:617 msgid "column_number" msgstr "kolumnnummer" -#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464 +#: sql_help.c:641 sql_help.c:1885 sql_help.c:4509 msgid "large_object_oid" msgstr "stort_objekt_oid" -#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 +#: sql_help.c:700 sql_help.c:1376 sql_help.c:2914 msgid "compression_method" msgstr "komprimeringsmetod" -#: sql_help.c:692 sql_help.c:1373 +#: sql_help.c:702 sql_help.c:1391 msgid "new_access_method" msgstr "ny_accessmetod" -#: sql_help.c:725 sql_help.c:2523 +#: sql_help.c:739 sql_help.c:2552 msgid "res_proc" msgstr "res_proc" -#: sql_help.c:726 sql_help.c:2524 +#: sql_help.c:740 sql_help.c:2553 msgid "join_proc" msgstr "join_proc" -#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 +#: sql_help.c:741 sql_help.c:2550 +msgid "com_op" +msgstr "com_op" + +#: sql_help.c:742 sql_help.c:2551 +msgid "neg_op" +msgstr "neg_op" + +#: sql_help.c:794 sql_help.c:806 sql_help.c:2570 msgid "strategy_number" msgstr "strateginummer" -#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 -#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544 -#: sql_help.c:2547 sql_help.c:2548 +#: sql_help.c:796 sql_help.c:797 sql_help.c:800 sql_help.c:801 sql_help.c:807 +#: sql_help.c:808 sql_help.c:810 sql_help.c:811 sql_help.c:2572 sql_help.c:2573 +#: sql_help.c:2576 sql_help.c:2577 msgid "op_type" msgstr "op_typ" -#: sql_help.c:782 sql_help.c:2545 +#: sql_help.c:798 sql_help.c:2574 msgid "sort_family_name" msgstr "sorteringsfamiljnamn" -#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 +#: sql_help.c:799 sql_help.c:809 sql_help.c:2575 msgid "support_number" msgstr "supportnummer" -#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 -#: sql_help.c:3089 +#: sql_help.c:803 sql_help.c:2157 sql_help.c:2579 sql_help.c:3115 +#: sql_help.c:3117 msgid "argument_type" msgstr "argumenttyp" -#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 -#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779 -#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891 -#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324 -#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 -#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 -#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 -#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 -#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885 -#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334 -#: sql_help.c:4452 sql_help.c:4563 sql_help.c:4565 sql_help.c:4627 -#: sql_help.c:4666 sql_help.c:4820 sql_help.c:4822 sql_help.c:4884 -#: sql_help.c:4918 sql_help.c:4970 sql_help.c:5058 sql_help.c:5060 -#: sql_help.c:5122 +#: sql_help.c:834 sql_help.c:837 sql_help.c:926 sql_help.c:1055 sql_help.c:1095 +#: sql_help.c:1567 sql_help.c:1570 sql_help.c:1746 sql_help.c:1799 +#: sql_help.c:1870 sql_help.c:1895 sql_help.c:1908 sql_help.c:1923 +#: sql_help.c:1983 sql_help.c:1989 sql_help.c:2353 sql_help.c:2365 +#: sql_help.c:2486 sql_help.c:2526 sql_help.c:2603 sql_help.c:2657 +#: sql_help.c:2710 sql_help.c:2762 sql_help.c:2795 sql_help.c:2802 +#: sql_help.c:2911 sql_help.c:2929 sql_help.c:2942 sql_help.c:3021 +#: sql_help.c:3141 sql_help.c:3322 sql_help.c:3545 sql_help.c:3594 +#: sql_help.c:3700 sql_help.c:3910 sql_help.c:3916 sql_help.c:3977 +#: sql_help.c:4009 sql_help.c:4373 sql_help.c:4379 sql_help.c:4497 +#: sql_help.c:4610 sql_help.c:4673 sql_help.c:4712 sql_help.c:4868 +#: sql_help.c:4931 sql_help.c:4965 sql_help.c:5023 sql_help.c:5113 +#: sql_help.c:5176 msgid "table_name" msgstr "tabellnamn" -#: sql_help.c:823 sql_help.c:2576 +#: sql_help.c:839 sql_help.c:2605 msgid "using_expression" msgstr "using-uttryck" -#: sql_help.c:824 sql_help.c:2577 +#: sql_help.c:840 sql_help.c:2606 msgid "check_expression" msgstr "check-uttryck" -#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +#: sql_help.c:913 sql_help.c:915 sql_help.c:917 sql_help.c:2653 msgid "publication_object" msgstr "publiceringsobject" -#: sql_help.c:903 sql_help.c:2625 +#: sql_help.c:919 sql_help.c:2654 msgid "publication_parameter" msgstr "publiceringsparameter" -#: sql_help.c:909 sql_help.c:2627 +#: sql_help.c:925 sql_help.c:2656 msgid "where publication_object is one of:" msgstr "där publiceringsobjekt är en av:" -#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 -#: sql_help.c:3228 +#: sql_help.c:968 sql_help.c:1658 sql_help.c:2464 sql_help.c:2689 +#: sql_help.c:3256 msgid "password" msgstr "lösenord" -#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 -#: sql_help.c:3229 +#: sql_help.c:969 sql_help.c:1659 sql_help.c:2465 sql_help.c:2690 +#: sql_help.c:3257 msgid "timestamp" msgstr "tidsstämpel" -#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642 -#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892 -#: sql_help.c:4341 +#: sql_help.c:973 sql_help.c:977 sql_help.c:980 sql_help.c:983 sql_help.c:1663 +#: sql_help.c:1667 sql_help.c:1670 sql_help.c:1673 sql_help.c:3923 +#: sql_help.c:4386 msgid "database_name" msgstr "databasnamn" -#: sql_help.c:1073 sql_help.c:2732 +#: sql_help.c:1089 sql_help.c:2757 msgid "increment" msgstr "ökningsvärde" -#: sql_help.c:1074 sql_help.c:2733 +#: sql_help.c:1090 sql_help.c:2758 msgid "minvalue" msgstr "minvärde" -#: sql_help.c:1075 sql_help.c:2734 +#: sql_help.c:1091 sql_help.c:2759 msgid "maxvalue" msgstr "maxvärde" -#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4561 sql_help.c:4664 -#: sql_help.c:4818 sql_help.c:4987 sql_help.c:5056 +#: sql_help.c:1092 sql_help.c:2760 sql_help.c:4606 sql_help.c:4710 +#: sql_help.c:4864 sql_help.c:5040 sql_help.c:5109 msgid "start" msgstr "start" -#: sql_help.c:1077 sql_help.c:1347 +#: sql_help.c:1093 sql_help.c:1365 msgid "restart" msgstr "starta om" -#: sql_help.c:1078 sql_help.c:2736 +#: sql_help.c:1094 sql_help.c:2761 msgid "cache" msgstr "cache" -#: sql_help.c:1123 +#: sql_help.c:1139 msgid "new_target" msgstr "nytt_mÃ¥l" -#: sql_help.c:1142 sql_help.c:2789 +#: sql_help.c:1158 sql_help.c:2814 msgid "conninfo" msgstr "anslinfo" -#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 +#: sql_help.c:1160 sql_help.c:1164 sql_help.c:1168 sql_help.c:2815 msgid "publication_name" msgstr "publiceringsnamn" -#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +#: sql_help.c:1161 sql_help.c:1165 sql_help.c:1169 msgid "publication_option" msgstr "publicerings_alternativ" -#: sql_help.c:1156 +#: sql_help.c:1172 msgid "refresh_option" msgstr "refresh_alternativ" -#: sql_help.c:1161 sql_help.c:2791 +#: sql_help.c:1177 sql_help.c:2816 msgid "subscription_parameter" msgstr "prenumerationsparameter" -#: sql_help.c:1164 +#: sql_help.c:1180 msgid "skip_option" msgstr "skip_alternativ" -#: sql_help.c:1324 sql_help.c:1327 +#: sql_help.c:1340 sql_help.c:1343 msgid "partition_name" msgstr "partitionsnamn" -#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 +#: sql_help.c:1341 sql_help.c:2370 sql_help.c:2947 msgid "partition_bound_spec" msgstr "partitionsgränsspec" -#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 +#: sql_help.c:1362 sql_help.c:1412 sql_help.c:2961 msgid "sequence_options" msgstr "sekvensalternativ" -#: sql_help.c:1346 +#: sql_help.c:1364 msgid "sequence_option" msgstr "sekvensalternativ" -#: sql_help.c:1360 +#: sql_help.c:1378 msgid "table_constraint_using_index" msgstr "tabellvillkor_för_index" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 +#: sql_help.c:1386 sql_help.c:1387 sql_help.c:1388 sql_help.c:1389 msgid "rewrite_rule_name" msgstr "omskrivningsregelnamn" -#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 +#: sql_help.c:1401 sql_help.c:2382 sql_help.c:2986 msgid "and partition_bound_spec is:" msgstr "och partitionsgränsspec är:" -#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 -#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 -#: sql_help.c:2964 +#: sql_help.c:1402 sql_help.c:1403 sql_help.c:1404 sql_help.c:2383 +#: sql_help.c:2384 sql_help.c:2385 sql_help.c:2987 sql_help.c:2988 +#: sql_help.c:2989 msgid "partition_bound_expr" msgstr "partitionsgränsuttryck" -#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 -#: sql_help.c:2965 sql_help.c:2966 +#: sql_help.c:1405 sql_help.c:1406 sql_help.c:2386 sql_help.c:2387 +#: sql_help.c:2990 sql_help.c:2991 msgid "numeric_literal" msgstr "numerisk_literal" -#: sql_help.c:1389 +#: sql_help.c:1407 msgid "and column_constraint is:" msgstr "och kolumnvillkor är:" -#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 -#: sql_help.c:2934 +#: sql_help.c:1410 sql_help.c:2377 sql_help.c:2418 sql_help.c:2627 +#: sql_help.c:2959 msgid "default_expr" msgstr "default_uttryck" -#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 +#: sql_help.c:1411 sql_help.c:2378 sql_help.c:2960 msgid "generation_expr" msgstr "generatoruttryck" -#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 -#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 -#: sql_help.c:2949 sql_help.c:2953 +#: sql_help.c:1413 sql_help.c:1414 sql_help.c:1423 sql_help.c:1425 +#: sql_help.c:1429 sql_help.c:2962 sql_help.c:2963 sql_help.c:2972 +#: sql_help.c:2974 sql_help.c:2978 msgid "index_parameters" msgstr "indexparametrar" -#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 +#: sql_help.c:1415 sql_help.c:1432 sql_help.c:2964 sql_help.c:2981 msgid "reftable" msgstr "reftabell" -#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 +#: sql_help.c:1416 sql_help.c:1433 sql_help.c:2965 sql_help.c:2982 msgid "refcolumn" msgstr "refkolumn" -#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 -#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 +#: sql_help.c:1417 sql_help.c:1418 sql_help.c:1434 sql_help.c:1435 +#: sql_help.c:2966 sql_help.c:2967 sql_help.c:2983 sql_help.c:2984 msgid "referential_action" msgstr "referentiell_aktion" -#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 +#: sql_help.c:1419 sql_help.c:2379 sql_help.c:2968 msgid "and table_constraint is:" msgstr "och tabellvillkor är:" -#: sql_help.c:1409 sql_help.c:2951 +#: sql_help.c:1427 sql_help.c:2976 msgid "exclude_element" msgstr "uteslutelement" -#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4559 sql_help.c:4662 -#: sql_help.c:4816 sql_help.c:4985 sql_help.c:5054 +#: sql_help.c:1428 sql_help.c:2977 sql_help.c:4604 sql_help.c:4708 +#: sql_help.c:4862 sql_help.c:5038 sql_help.c:5107 msgid "operator" msgstr "operator" -#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 +#: sql_help.c:1430 sql_help.c:2498 sql_help.c:2979 msgid "predicate" msgstr "predikat" -#: sql_help.c:1418 +#: sql_help.c:1436 msgid "and table_constraint_using_index is:" msgstr "och tabellvillkor_för_index är:" -#: sql_help.c:1421 sql_help.c:2967 +#: sql_help.c:1439 sql_help.c:2992 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "indexparametrar i UNIQUE-, PRIMARY KEY- och EXCLUDE-villkor är:" -#: sql_help.c:1426 sql_help.c:2972 +#: sql_help.c:1444 sql_help.c:2997 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "uteslutelement i ett EXCLUDE-villkort är:" -#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 -#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 +#: sql_help.c:1448 sql_help.c:2491 sql_help.c:2924 sql_help.c:2937 +#: sql_help.c:2951 sql_help.c:3001 sql_help.c:4022 msgid "opclass" msgstr "op-klass" -#: sql_help.c:1430 sql_help.c:2976 +#: sql_help.c:1449 sql_help.c:2492 sql_help.c:3002 +msgid "opclass_parameter" +msgstr "opclass_parameter" + +#: sql_help.c:1451 sql_help.c:3004 msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" msgstr "referentiell_aktion i ett FOREIGN KEY/REFERENCES-villkor är:" -#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013 +#: sql_help.c:1469 sql_help.c:1472 sql_help.c:3041 msgid "tablespace_option" msgstr "tabellutrymmesalternativ" -#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 +#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1502 sql_help.c:1506 msgid "token_type" msgstr "symboltyp" -#: sql_help.c:1473 sql_help.c:1476 +#: sql_help.c:1494 sql_help.c:1497 msgid "dictionary_name" msgstr "ordlistnamn" -#: sql_help.c:1478 sql_help.c:1482 +#: sql_help.c:1499 sql_help.c:1503 msgid "old_dictionary" msgstr "gammal_ordlista" -#: sql_help.c:1479 sql_help.c:1483 +#: sql_help.c:1500 sql_help.c:1504 msgid "new_dictionary" msgstr "ny_ordlista" -#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 -#: sql_help.c:3166 +#: sql_help.c:1599 sql_help.c:1613 sql_help.c:1616 sql_help.c:1617 +#: sql_help.c:3194 msgid "attribute_name" msgstr "attributnamn" -#: sql_help.c:1579 +#: sql_help.c:1600 msgid "new_attribute_name" msgstr "nytt_attributnamn" -#: sql_help.c:1583 sql_help.c:1587 +#: sql_help.c:1604 sql_help.c:1608 msgid "new_enum_value" msgstr "nytt_enumvärde" -#: sql_help.c:1584 +#: sql_help.c:1605 msgid "neighbor_enum_value" msgstr "närliggande_enumvärde" -#: sql_help.c:1586 +#: sql_help.c:1607 msgid "existing_enum_value" msgstr "existerande_enumvärde" -#: sql_help.c:1589 +#: sql_help.c:1610 msgid "property" msgstr "egenskap" -#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 -#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 -#: sql_help.c:4350 +#: sql_help.c:1686 sql_help.c:2362 sql_help.c:2371 sql_help.c:2773 +#: sql_help.c:3274 sql_help.c:3725 sql_help.c:3932 sql_help.c:3978 +#: sql_help.c:4395 msgid "server_name" msgstr "servernamn" -#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 +#: sql_help.c:1718 sql_help.c:1721 sql_help.c:3289 msgid "view_option_name" msgstr "visningsalternativnamn" -#: sql_help.c:1698 sql_help.c:3262 +#: sql_help.c:1719 sql_help.c:3290 msgid "view_option_value" msgstr "visningsalternativvärde" -#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4957 sql_help.c:4958 +#: sql_help.c:1740 sql_help.c:5007 msgid "table_and_columns" msgstr "tabell_och_kolumner" -#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 -#: sql_help.c:4185 sql_help.c:4959 +#: sql_help.c:1741 sql_help.c:1801 sql_help.c:1995 sql_help.c:3774 +#: sql_help.c:4230 sql_help.c:5008 msgid "where option can be one of:" msgstr "där flaggor kan vara en av:" -#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 -#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 -#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 -#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 -#: sql_help.c:4960 sql_help.c:4961 sql_help.c:4962 sql_help.c:4963 -#: sql_help.c:4964 sql_help.c:4965 sql_help.c:4966 sql_help.c:4967 +#: sql_help.c:1742 sql_help.c:1743 sql_help.c:1802 sql_help.c:1997 +#: sql_help.c:2001 sql_help.c:2183 sql_help.c:3775 sql_help.c:3776 +#: sql_help.c:3777 sql_help.c:3778 sql_help.c:3779 sql_help.c:3780 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:4231 sql_help.c:4233 sql_help.c:5009 sql_help.c:5010 +#: sql_help.c:5011 sql_help.c:5012 sql_help.c:5013 sql_help.c:5014 +#: sql_help.c:5015 sql_help.c:5016 sql_help.c:5017 sql_help.c:5019 +#: sql_help.c:5020 msgid "boolean" msgstr "boolean" -#: sql_help.c:1724 sql_help.c:4969 +#: sql_help.c:1744 sql_help.c:5021 +msgid "size" +msgstr "storlek" + +#: sql_help.c:1745 sql_help.c:5022 msgid "and table_and_columns is:" msgstr "och tabell_och_kolumner är:" -#: sql_help.c:1740 sql_help.c:4723 sql_help.c:4725 sql_help.c:4749 +#: sql_help.c:1761 sql_help.c:4769 sql_help.c:4771 sql_help.c:4795 msgid "transaction_mode" msgstr "transaktionsläge" -#: sql_help.c:1741 sql_help.c:4726 sql_help.c:4750 +#: sql_help.c:1762 sql_help.c:4772 sql_help.c:4796 msgid "where transaction_mode is one of:" msgstr "där transaktionsläge är en av:" -#: sql_help.c:1750 sql_help.c:4569 sql_help.c:4578 sql_help.c:4582 -#: sql_help.c:4586 sql_help.c:4589 sql_help.c:4826 sql_help.c:4835 -#: sql_help.c:4839 sql_help.c:4843 sql_help.c:4846 sql_help.c:5064 -#: sql_help.c:5073 sql_help.c:5077 sql_help.c:5081 sql_help.c:5084 +#: sql_help.c:1771 sql_help.c:4614 sql_help.c:4623 sql_help.c:4627 +#: sql_help.c:4631 sql_help.c:4634 sql_help.c:4872 sql_help.c:4881 +#: sql_help.c:4885 sql_help.c:4889 sql_help.c:4892 sql_help.c:5117 +#: sql_help.c:5126 sql_help.c:5130 sql_help.c:5134 sql_help.c:5137 msgid "argument" msgstr "argument" -#: sql_help.c:1850 +#: sql_help.c:1867 msgid "relation_name" msgstr "relationsnamn" -#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344 +#: sql_help.c:1872 sql_help.c:3926 sql_help.c:4389 msgid "domain_name" msgstr "domännamn" -#: sql_help.c:1877 +#: sql_help.c:1894 msgid "policy_name" msgstr "policynamn" -#: sql_help.c:1890 +#: sql_help.c:1907 msgid "rule_name" msgstr "regelnamn" -#: sql_help.c:1909 sql_help.c:4483 +#: sql_help.c:1926 sql_help.c:4528 msgid "string_literal" msgstr "sträng_literal" -#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 +#: sql_help.c:1951 sql_help.c:4192 sql_help.c:4442 msgid "transaction_id" msgstr "transaktions-id" -#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017 +#: sql_help.c:1985 sql_help.c:1992 sql_help.c:4048 msgid "filename" msgstr "filnamn" -#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 -#: sql_help.c:2689 +#: sql_help.c:1986 sql_help.c:1993 sql_help.c:2712 sql_help.c:2713 +#: sql_help.c:2714 msgid "command" msgstr "kommando" -#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 -#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4552 -#: sql_help.c:4554 sql_help.c:4655 sql_help.c:4657 sql_help.c:4809 -#: sql_help.c:4811 sql_help.c:4927 sql_help.c:5047 sql_help.c:5049 +#: sql_help.c:1988 sql_help.c:2711 sql_help.c:3144 sql_help.c:3325 +#: sql_help.c:4032 sql_help.c:4115 sql_help.c:4118 sql_help.c:4121 +#: sql_help.c:4597 sql_help.c:4599 sql_help.c:4701 sql_help.c:4703 +#: sql_help.c:4855 sql_help.c:4857 sql_help.c:4974 sql_help.c:5100 +#: sql_help.c:5102 msgid "condition" msgstr "villkor" -#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 -#: sql_help.c:3281 sql_help.c:3982 +#: sql_help.c:1991 sql_help.c:2532 sql_help.c:3027 sql_help.c:3291 +#: sql_help.c:3309 sql_help.c:4013 msgid "query" msgstr "frÃ¥ga" -#: sql_help.c:1976 +#: sql_help.c:1996 msgid "format_name" msgstr "formatnamn" -#: sql_help.c:1978 +#: sql_help.c:1998 msgid "delimiter_character" msgstr "avdelartecken" -#: sql_help.c:1979 +#: sql_help.c:1999 msgid "null_string" msgstr "null-sträng" -#: sql_help.c:1981 +#: sql_help.c:2000 +msgid "default_string" +msgstr "standard-sträng" + +#: sql_help.c:2002 msgid "quote_character" msgstr "citattecken" -#: sql_help.c:1982 +#: sql_help.c:2003 msgid "escape_character" msgstr "escape-tecken" -#: sql_help.c:1986 +#: sql_help.c:2007 +msgid "error_action" +msgstr "fel_aktion" + +#: sql_help.c:2008 msgid "encoding_name" msgstr "kodningsnamn" -#: sql_help.c:1997 +#: sql_help.c:2009 +msgid "verbosity" +msgstr "verbosity" + +#: sql_help.c:2020 msgid "access_method_type" msgstr "accessmetodtyp" -#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 +#: sql_help.c:2091 sql_help.c:2110 sql_help.c:2113 msgid "arg_data_type" msgstr "arg_datatyp" -#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 +#: sql_help.c:2092 sql_help.c:2114 sql_help.c:2122 msgid "sfunc" msgstr "sfunc" -#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 +#: sql_help.c:2093 sql_help.c:2115 sql_help.c:2123 msgid "state_data_type" msgstr "tillstÃ¥ndsdatatyp" -#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 +#: sql_help.c:2094 sql_help.c:2116 sql_help.c:2124 msgid "state_data_size" msgstr "tillstÃ¥ndsdatastorlek" -#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 +#: sql_help.c:2095 sql_help.c:2117 sql_help.c:2125 msgid "ffunc" msgstr "ffunc" -#: sql_help.c:2073 sql_help.c:2103 +#: sql_help.c:2096 sql_help.c:2126 msgid "combinefunc" msgstr "kombinerafunk" -#: sql_help.c:2074 sql_help.c:2104 +#: sql_help.c:2097 sql_help.c:2127 msgid "serialfunc" msgstr "serialiseringsfunk" -#: sql_help.c:2075 sql_help.c:2105 +#: sql_help.c:2098 sql_help.c:2128 msgid "deserialfunc" msgstr "deserialiseringsfunk" -#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 +#: sql_help.c:2099 sql_help.c:2118 sql_help.c:2129 msgid "initial_condition" msgstr "startvärde" -#: sql_help.c:2077 sql_help.c:2107 +#: sql_help.c:2100 sql_help.c:2130 msgid "msfunc" msgstr "msfunk" -#: sql_help.c:2078 sql_help.c:2108 +#: sql_help.c:2101 sql_help.c:2131 msgid "minvfunc" msgstr "minvfunk" -#: sql_help.c:2079 sql_help.c:2109 +#: sql_help.c:2102 sql_help.c:2132 msgid "mstate_data_type" msgstr "mtillstÃ¥ndsdatatyp" -#: sql_help.c:2080 sql_help.c:2110 +#: sql_help.c:2103 sql_help.c:2133 msgid "mstate_data_size" msgstr "ntillstÃ¥ndsstorlek" -#: sql_help.c:2081 sql_help.c:2111 +#: sql_help.c:2104 sql_help.c:2134 msgid "mffunc" msgstr "mffunk" -#: sql_help.c:2082 sql_help.c:2112 +#: sql_help.c:2105 sql_help.c:2135 msgid "minitial_condition" msgstr "mstartvärde" -#: sql_help.c:2083 sql_help.c:2113 +#: sql_help.c:2106 sql_help.c:2136 msgid "sort_operator" msgstr "sorteringsoperator" -#: sql_help.c:2096 +#: sql_help.c:2119 msgid "or the old syntax" msgstr "eller gamla syntaxen" -#: sql_help.c:2098 +#: sql_help.c:2121 msgid "base_type" msgstr "bastyp" -#: sql_help.c:2155 sql_help.c:2202 +#: sql_help.c:2179 sql_help.c:2229 msgid "locale" msgstr "lokal" -#: sql_help.c:2156 sql_help.c:2203 +#: sql_help.c:2180 sql_help.c:2230 msgid "lc_collate" msgstr "lc_collate" -#: sql_help.c:2157 sql_help.c:2204 +#: sql_help.c:2181 sql_help.c:2231 msgid "lc_ctype" msgstr "lc_ctype" -#: sql_help.c:2158 sql_help.c:4450 +#: sql_help.c:2182 sql_help.c:4495 msgid "provider" msgstr "leverantör" -#: sql_help.c:2160 sql_help.c:2263 +#: sql_help.c:2184 +msgid "rules" +msgstr "regler" + +#: sql_help.c:2185 sql_help.c:2292 msgid "version" msgstr "version" -#: sql_help.c:2162 +#: sql_help.c:2187 msgid "existing_collation" msgstr "existerande_jämförelse" -#: sql_help.c:2172 +#: sql_help.c:2197 msgid "source_encoding" msgstr "källkodning" -#: sql_help.c:2173 +#: sql_help.c:2198 msgid "dest_encoding" msgstr "mÃ¥lkodning" -#: sql_help.c:2199 sql_help.c:3039 +#: sql_help.c:2226 sql_help.c:3067 msgid "template" msgstr "mall" -#: sql_help.c:2200 +#: sql_help.c:2227 msgid "encoding" msgstr "kodning" -#: sql_help.c:2201 +#: sql_help.c:2228 msgid "strategy" msgstr "strategi" -#: sql_help.c:2205 +#: sql_help.c:2232 +msgid "builtin_locale" +msgstr "inbyggd_lokal" + +#: sql_help.c:2233 msgid "icu_locale" msgstr "icu_lokal" -#: sql_help.c:2206 +#: sql_help.c:2234 +msgid "icu_rules" +msgstr "icu_regler" + +#: sql_help.c:2235 msgid "locale_provider" msgstr "lokal_leverantör" -#: sql_help.c:2207 +#: sql_help.c:2236 msgid "collation_version" msgstr "jämförelse_version" -#: sql_help.c:2212 +#: sql_help.c:2241 msgid "oid" msgstr "oid" -#: sql_help.c:2232 -msgid "constraint" -msgstr "villkor" - -#: sql_help.c:2233 -msgid "where constraint is:" -msgstr "där villkor är:" - -#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 +#: sql_help.c:2276 sql_help.c:2709 sql_help.c:3140 msgid "event" msgstr "händelse" -#: sql_help.c:2248 +#: sql_help.c:2277 msgid "filter_variable" msgstr "filtervariabel" -#: sql_help.c:2249 +#: sql_help.c:2278 msgid "filter_value" msgstr "filtervärde" -#: sql_help.c:2345 sql_help.c:2931 +#: sql_help.c:2374 sql_help.c:2956 msgid "where column_constraint is:" msgstr "där kolumnvillkor är:" -#: sql_help.c:2390 +#: sql_help.c:2419 msgid "rettype" msgstr "rettyp" -#: sql_help.c:2392 +#: sql_help.c:2421 msgid "column_type" msgstr "kolumntyp" -#: sql_help.c:2401 sql_help.c:2604 +#: sql_help.c:2430 sql_help.c:2633 msgid "definition" msgstr "definition" -#: sql_help.c:2402 sql_help.c:2605 +#: sql_help.c:2431 sql_help.c:2634 msgid "obj_file" msgstr "obj-fil" -#: sql_help.c:2403 sql_help.c:2606 +#: sql_help.c:2432 sql_help.c:2635 msgid "link_symbol" msgstr "linksymbol" -#: sql_help.c:2404 sql_help.c:2607 +#: sql_help.c:2433 sql_help.c:2636 msgid "sql_body" msgstr "sql-kropp" -#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 +#: sql_help.c:2471 sql_help.c:2694 sql_help.c:3263 msgid "uid" msgstr "uid" -#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 -#: sql_help.c:2927 sql_help.c:2995 +#: sql_help.c:2487 sql_help.c:2528 sql_help.c:2925 sql_help.c:2938 +#: sql_help.c:2952 sql_help.c:3023 msgid "method" msgstr "metod" -#: sql_help.c:2463 -msgid "opclass_parameter" -msgstr "opclass_parameter" - -#: sql_help.c:2480 +#: sql_help.c:2509 msgid "call_handler" msgstr "anropshanterare" -#: sql_help.c:2481 +#: sql_help.c:2510 msgid "inline_handler" msgstr "inline-hanterare" -#: sql_help.c:2482 +#: sql_help.c:2511 msgid "valfunction" msgstr "val-funktion" -#: sql_help.c:2521 -msgid "com_op" -msgstr "com_op" - -#: sql_help.c:2522 -msgid "neg_op" -msgstr "neg_op" - -#: sql_help.c:2540 +#: sql_help.c:2569 msgid "family_name" msgstr "familjenamn" -#: sql_help.c:2551 +#: sql_help.c:2580 msgid "storage_type" msgstr "lagringstyp" -#: sql_help.c:2690 sql_help.c:3119 +#: sql_help.c:2715 sql_help.c:3147 msgid "where event can be one of:" msgstr "där händelse kan vara en av:" -#: sql_help.c:2710 sql_help.c:2712 +#: sql_help.c:2735 sql_help.c:2737 msgid "schema_element" msgstr "schema-element" -#: sql_help.c:2749 +#: sql_help.c:2774 msgid "server_type" msgstr "servertyp" -#: sql_help.c:2750 +#: sql_help.c:2775 msgid "server_version" msgstr "serverversion" -#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 +#: sql_help.c:2776 sql_help.c:3929 sql_help.c:4392 msgid "fdw_name" msgstr "fdw-namn" -#: sql_help.c:2768 sql_help.c:2771 +#: sql_help.c:2793 sql_help.c:2796 msgid "statistics_name" msgstr "statistiknamn" -#: sql_help.c:2772 +#: sql_help.c:2797 msgid "statistics_kind" msgstr "statistiksort" -#: sql_help.c:2788 +#: sql_help.c:2813 msgid "subscription_name" msgstr "prenumerationsnamn" -#: sql_help.c:2893 +#: sql_help.c:2918 msgid "source_table" msgstr "källtabell" -#: sql_help.c:2894 +#: sql_help.c:2919 msgid "like_option" msgstr "like_alternativ" -#: sql_help.c:2960 +#: sql_help.c:2985 msgid "and like_option is:" msgstr "och likealternativ är:" -#: sql_help.c:3012 +#: sql_help.c:3040 msgid "directory" msgstr "katalog" -#: sql_help.c:3026 +#: sql_help.c:3054 msgid "parser_name" msgstr "parsernamn" -#: sql_help.c:3027 +#: sql_help.c:3055 msgid "source_config" msgstr "källkonfig" -#: sql_help.c:3056 +#: sql_help.c:3084 msgid "start_function" msgstr "startfunktion" -#: sql_help.c:3057 +#: sql_help.c:3085 msgid "gettoken_function" msgstr "gettoken_funktion" -#: sql_help.c:3058 +#: sql_help.c:3086 msgid "end_function" msgstr "slutfunktion" -#: sql_help.c:3059 +#: sql_help.c:3087 msgid "lextypes_function" msgstr "symboltypfunktion" -#: sql_help.c:3060 +#: sql_help.c:3088 msgid "headline_function" msgstr "rubrikfunktion" -#: sql_help.c:3072 +#: sql_help.c:3100 msgid "init_function" msgstr "init_funktion" -#: sql_help.c:3073 +#: sql_help.c:3101 msgid "lexize_function" msgstr "symboluppdelningsfunktion" -#: sql_help.c:3086 +#: sql_help.c:3114 msgid "from_sql_function_name" msgstr "frÃ¥n_sql_funktionsnamn" -#: sql_help.c:3088 +#: sql_help.c:3116 msgid "to_sql_function_name" msgstr "till_sql_funktionsnamn" -#: sql_help.c:3114 +#: sql_help.c:3142 msgid "referenced_table_name" msgstr "refererat_tabellnamn" -#: sql_help.c:3115 +#: sql_help.c:3143 msgid "transition_relation_name" msgstr "övergÃ¥ngsrelationsnamn" -#: sql_help.c:3118 +#: sql_help.c:3146 msgid "arguments" msgstr "argument" -#: sql_help.c:3170 +#: sql_help.c:3198 msgid "label" msgstr "etikett" -#: sql_help.c:3172 +#: sql_help.c:3200 msgid "subtype" msgstr "subtyp" -#: sql_help.c:3173 +#: sql_help.c:3201 msgid "subtype_operator_class" msgstr "subtypoperatorklass" -#: sql_help.c:3175 +#: sql_help.c:3203 msgid "canonical_function" msgstr "kanonisk_funktion" -#: sql_help.c:3176 +#: sql_help.c:3204 msgid "subtype_diff_function" msgstr "subtyp_diff_funktion" -#: sql_help.c:3177 +#: sql_help.c:3205 msgid "multirange_type_name" msgstr "multirange_typnamn" -#: sql_help.c:3179 +#: sql_help.c:3207 msgid "input_function" msgstr "inmatningsfunktion" -#: sql_help.c:3180 +#: sql_help.c:3208 msgid "output_function" msgstr "utmatningsfunktion" -#: sql_help.c:3181 +#: sql_help.c:3209 msgid "receive_function" msgstr "mottagarfunktion" -#: sql_help.c:3182 +#: sql_help.c:3210 msgid "send_function" msgstr "sändfunktion" -#: sql_help.c:3183 +#: sql_help.c:3211 msgid "type_modifier_input_function" msgstr "typmodifiering_indatafunktion" -#: sql_help.c:3184 +#: sql_help.c:3212 msgid "type_modifier_output_function" msgstr "typmodifiering_utdatafunktion" -#: sql_help.c:3185 +#: sql_help.c:3213 msgid "analyze_function" msgstr "analysfunktion" -#: sql_help.c:3186 +#: sql_help.c:3214 msgid "subscript_function" msgstr "arrayindexfunktion" -#: sql_help.c:3187 +#: sql_help.c:3215 msgid "internallength" msgstr "internlängd" -#: sql_help.c:3188 +#: sql_help.c:3216 msgid "alignment" msgstr "justering" -#: sql_help.c:3189 +#: sql_help.c:3217 msgid "storage" msgstr "lagring" -#: sql_help.c:3190 +#: sql_help.c:3218 msgid "like_type" msgstr "liketyp" -#: sql_help.c:3191 +#: sql_help.c:3219 msgid "category" msgstr "kategori" -#: sql_help.c:3192 +#: sql_help.c:3220 msgid "preferred" msgstr "föredragen" -#: sql_help.c:3193 +#: sql_help.c:3221 msgid "default" msgstr "standard" -#: sql_help.c:3194 +#: sql_help.c:3222 msgid "element" msgstr "element" -#: sql_help.c:3195 +#: sql_help.c:3223 msgid "delimiter" msgstr "avskiljare" -#: sql_help.c:3196 +#: sql_help.c:3224 msgid "collatable" msgstr "sorterbar" -#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4547 -#: sql_help.c:4649 sql_help.c:4804 sql_help.c:4917 sql_help.c:5042 +#: sql_help.c:3321 sql_help.c:4008 sql_help.c:4102 sql_help.c:4592 +#: sql_help.c:4695 sql_help.c:4850 sql_help.c:4964 sql_help.c:5095 msgid "with_query" msgstr "with_frÃ¥ga" -#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4566 sql_help.c:4572 -#: sql_help.c:4575 sql_help.c:4579 sql_help.c:4583 sql_help.c:4591 -#: sql_help.c:4823 sql_help.c:4829 sql_help.c:4832 sql_help.c:4836 -#: sql_help.c:4840 sql_help.c:4848 sql_help.c:4919 sql_help.c:5061 -#: sql_help.c:5067 sql_help.c:5070 sql_help.c:5074 sql_help.c:5078 -#: sql_help.c:5086 +#: sql_help.c:3323 sql_help.c:4010 sql_help.c:4611 sql_help.c:4617 +#: sql_help.c:4620 sql_help.c:4624 sql_help.c:4628 sql_help.c:4636 +#: sql_help.c:4869 sql_help.c:4875 sql_help.c:4878 sql_help.c:4882 +#: sql_help.c:4886 sql_help.c:4894 sql_help.c:4966 sql_help.c:5114 +#: sql_help.c:5120 sql_help.c:5123 sql_help.c:5127 sql_help.c:5131 +#: sql_help.c:5139 msgid "alias" msgstr "alias" -#: sql_help.c:3296 sql_help.c:4551 sql_help.c:4593 sql_help.c:4595 -#: sql_help.c:4599 sql_help.c:4601 sql_help.c:4602 sql_help.c:4603 -#: sql_help.c:4654 sql_help.c:4808 sql_help.c:4850 sql_help.c:4852 -#: sql_help.c:4856 sql_help.c:4858 sql_help.c:4859 sql_help.c:4860 -#: sql_help.c:4926 sql_help.c:5046 sql_help.c:5088 sql_help.c:5090 -#: sql_help.c:5094 sql_help.c:5096 sql_help.c:5097 sql_help.c:5098 +#: sql_help.c:3324 sql_help.c:4596 sql_help.c:4638 sql_help.c:4640 +#: sql_help.c:4644 sql_help.c:4646 sql_help.c:4647 sql_help.c:4648 +#: sql_help.c:4700 sql_help.c:4854 sql_help.c:4896 sql_help.c:4898 +#: sql_help.c:4902 sql_help.c:4904 sql_help.c:4905 sql_help.c:4906 +#: sql_help.c:4973 sql_help.c:5099 sql_help.c:5141 sql_help.c:5143 +#: sql_help.c:5147 sql_help.c:5149 sql_help.c:5150 sql_help.c:5151 msgid "from_item" msgstr "frÃ¥nval" -#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4928 +#: sql_help.c:3326 sql_help.c:3810 sql_help.c:4159 sql_help.c:4975 msgid "cursor_name" msgstr "markörnamn" -#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4929 +#: sql_help.c:3327 sql_help.c:4016 sql_help.c:4108 sql_help.c:4976 msgid "output_expression" msgstr "utdatauttryck" -#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4550 sql_help.c:4652 -#: sql_help.c:4807 sql_help.c:4930 sql_help.c:5045 +#: sql_help.c:3328 sql_help.c:4017 sql_help.c:4109 sql_help.c:4595 +#: sql_help.c:4698 sql_help.c:4853 sql_help.c:4977 sql_help.c:5098 msgid "output_name" msgstr "utdatanamn" -#: sql_help.c:3316 +#: sql_help.c:3344 msgid "code" msgstr "kod" -#: sql_help.c:3721 +#: sql_help.c:3749 msgid "parameter" msgstr "parameter" -#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 +#: sql_help.c:3773 sql_help.c:4184 msgid "statement" msgstr "sats" -#: sql_help.c:3778 sql_help.c:4116 +#: sql_help.c:3809 sql_help.c:4158 msgid "direction" msgstr "riktning" -#: sql_help.c:3780 sql_help.c:4118 +#: sql_help.c:3811 sql_help.c:4160 msgid "where direction can be one of:" msgstr "där riktning kan vara en av:" -#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 -#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 -#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4560 sql_help.c:4562 -#: sql_help.c:4663 sql_help.c:4665 sql_help.c:4817 sql_help.c:4819 -#: sql_help.c:4986 sql_help.c:4988 sql_help.c:5055 sql_help.c:5057 +#: sql_help.c:3812 sql_help.c:3813 sql_help.c:3814 sql_help.c:3815 +#: sql_help.c:3816 sql_help.c:4161 sql_help.c:4162 sql_help.c:4163 +#: sql_help.c:4164 sql_help.c:4165 sql_help.c:4605 sql_help.c:4607 +#: sql_help.c:4709 sql_help.c:4711 sql_help.c:4863 sql_help.c:4865 +#: sql_help.c:5039 sql_help.c:5041 sql_help.c:5108 sql_help.c:5110 msgid "count" msgstr "antal" -#: sql_help.c:3888 sql_help.c:4337 +#: sql_help.c:3919 sql_help.c:4382 msgid "sequence_name" msgstr "sekvensnamn" -#: sql_help.c:3906 sql_help.c:4355 +#: sql_help.c:3937 sql_help.c:4400 msgid "arg_name" msgstr "arg_namn" -#: sql_help.c:3907 sql_help.c:4356 +#: sql_help.c:3938 sql_help.c:4401 msgid "arg_type" msgstr "arg_typ" -#: sql_help.c:3914 sql_help.c:4363 +#: sql_help.c:3945 sql_help.c:4408 msgid "loid" msgstr "loid" -#: sql_help.c:3945 +#: sql_help.c:3976 msgid "remote_schema" msgstr "externt_schema" -#: sql_help.c:3948 +#: sql_help.c:3979 msgid "local_schema" msgstr "lokalt_schema" -#: sql_help.c:3983 +#: sql_help.c:4014 msgid "conflict_target" msgstr "konfliktmÃ¥l" -#: sql_help.c:3984 +#: sql_help.c:4015 msgid "conflict_action" msgstr "konfliktaktion" -#: sql_help.c:3987 +#: sql_help.c:4018 msgid "where conflict_target can be one of:" msgstr "där konfliktmÃ¥l kan vara en av:" -#: sql_help.c:3988 +#: sql_help.c:4019 msgid "index_column_name" msgstr "indexkolumnnamn" -#: sql_help.c:3989 +#: sql_help.c:4020 msgid "index_expression" msgstr "indexuttryck" -#: sql_help.c:3992 +#: sql_help.c:4023 msgid "index_predicate" msgstr "indexpredikat" -#: sql_help.c:3994 +#: sql_help.c:4025 msgid "and conflict_action is one of:" msgstr "och konfliktaktion är en av:" -#: sql_help.c:4000 sql_help.c:4925 +#: sql_help.c:4031 sql_help.c:4132 sql_help.c:4972 msgid "sub-SELECT" msgstr "sub-SELECT" -#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4901 +#: sql_help.c:4040 sql_help.c:4173 sql_help.c:4948 msgid "channel" msgstr "kanal" -#: sql_help.c:4031 +#: sql_help.c:4062 msgid "lockmode" msgstr "lÃ¥släge" -#: sql_help.c:4032 +#: sql_help.c:4063 msgid "where lockmode is one of:" msgstr "där lÃ¥släge är en av:" -#: sql_help.c:4068 +#: sql_help.c:4103 msgid "target_table_name" msgstr "mÃ¥ltabellnamn" -#: sql_help.c:4069 +#: sql_help.c:4104 msgid "target_alias" msgstr "mÃ¥lalias" -#: sql_help.c:4070 +#: sql_help.c:4105 msgid "data_source" msgstr "datakälla" -#: sql_help.c:4071 sql_help.c:4596 sql_help.c:4853 sql_help.c:5091 +#: sql_help.c:4106 sql_help.c:4641 sql_help.c:4899 sql_help.c:5144 msgid "join_condition" msgstr "join-villkor" -#: sql_help.c:4072 +#: sql_help.c:4107 msgid "when_clause" msgstr "when_sats" -#: sql_help.c:4073 +#: sql_help.c:4110 msgid "where data_source is:" msgstr "där datakälla är:" -#: sql_help.c:4074 +#: sql_help.c:4111 msgid "source_table_name" msgstr "källtabellnamn" -#: sql_help.c:4075 +#: sql_help.c:4112 msgid "source_query" msgstr "källfrÃ¥ga" -#: sql_help.c:4076 +#: sql_help.c:4113 msgid "source_alias" msgstr "källalias" -#: sql_help.c:4077 +#: sql_help.c:4114 msgid "and when_clause is:" msgstr "och when_sats är:" -#: sql_help.c:4079 +#: sql_help.c:4116 sql_help.c:4119 msgid "merge_update" msgstr "merge_update" -#: sql_help.c:4080 +#: sql_help.c:4117 sql_help.c:4120 msgid "merge_delete" msgstr "merge_delete" -#: sql_help.c:4082 +#: sql_help.c:4122 msgid "merge_insert" msgstr "merge_insert" -#: sql_help.c:4083 +#: sql_help.c:4123 msgid "and merge_insert is:" msgstr "och merge_insert är:" -#: sql_help.c:4086 +#: sql_help.c:4126 msgid "and merge_update is:" msgstr "och merge_update är:" -#: sql_help.c:4091 +#: sql_help.c:4133 msgid "and merge_delete is:" msgstr "och merge_delete är:" -#: sql_help.c:4132 +#: sql_help.c:4174 msgid "payload" msgstr "innehÃ¥ll" -#: sql_help.c:4159 +#: sql_help.c:4201 msgid "old_role" msgstr "gammal_roll" -#: sql_help.c:4160 +#: sql_help.c:4202 msgid "new_role" msgstr "ny_roll" -#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 +#: sql_help.c:4241 sql_help.c:4450 sql_help.c:4458 msgid "savepoint_name" msgstr "sparpunktnamn" -#: sql_help.c:4553 sql_help.c:4611 sql_help.c:4810 sql_help.c:4868 -#: sql_help.c:5048 sql_help.c:5106 +#: sql_help.c:4598 sql_help.c:4656 sql_help.c:4856 sql_help.c:4914 +#: sql_help.c:5101 sql_help.c:5159 msgid "grouping_element" msgstr "gruperingselement" -#: sql_help.c:4555 sql_help.c:4658 sql_help.c:4812 sql_help.c:5050 +#: sql_help.c:4600 sql_help.c:4704 sql_help.c:4858 sql_help.c:5103 msgid "window_name" msgstr "fönsternamn" -#: sql_help.c:4556 sql_help.c:4659 sql_help.c:4813 sql_help.c:5051 +#: sql_help.c:4601 sql_help.c:4705 sql_help.c:4859 sql_help.c:5104 msgid "window_definition" msgstr "fönsterdefinition" -#: sql_help.c:4557 sql_help.c:4571 sql_help.c:4615 sql_help.c:4660 -#: sql_help.c:4814 sql_help.c:4828 sql_help.c:4872 sql_help.c:5052 -#: sql_help.c:5066 sql_help.c:5110 +#: sql_help.c:4602 sql_help.c:4616 sql_help.c:4660 sql_help.c:4706 +#: sql_help.c:4860 sql_help.c:4874 sql_help.c:4918 sql_help.c:5105 +#: sql_help.c:5119 sql_help.c:5163 msgid "select" msgstr "select" -#: sql_help.c:4564 sql_help.c:4821 sql_help.c:5059 +#: sql_help.c:4608 sql_help.c:4866 sql_help.c:5111 +msgid "from_reference" +msgstr "frÃ¥n_referens" + +#: sql_help.c:4609 sql_help.c:4867 sql_help.c:5112 msgid "where from_item can be one of:" msgstr "där frÃ¥nval kan vara en av:" -#: sql_help.c:4567 sql_help.c:4573 sql_help.c:4576 sql_help.c:4580 -#: sql_help.c:4592 sql_help.c:4824 sql_help.c:4830 sql_help.c:4833 -#: sql_help.c:4837 sql_help.c:4849 sql_help.c:5062 sql_help.c:5068 -#: sql_help.c:5071 sql_help.c:5075 sql_help.c:5087 +#: sql_help.c:4612 sql_help.c:4618 sql_help.c:4621 sql_help.c:4625 +#: sql_help.c:4637 sql_help.c:4870 sql_help.c:4876 sql_help.c:4879 +#: sql_help.c:4883 sql_help.c:4895 sql_help.c:5115 sql_help.c:5121 +#: sql_help.c:5124 sql_help.c:5128 sql_help.c:5140 msgid "column_alias" msgstr "kolumnalias" -#: sql_help.c:4568 sql_help.c:4825 sql_help.c:5063 +#: sql_help.c:4613 sql_help.c:4871 sql_help.c:5116 msgid "sampling_method" msgstr "samplingsmetod" -#: sql_help.c:4570 sql_help.c:4827 sql_help.c:5065 +#: sql_help.c:4615 sql_help.c:4873 sql_help.c:5118 msgid "seed" msgstr "frö" -#: sql_help.c:4574 sql_help.c:4613 sql_help.c:4831 sql_help.c:4870 -#: sql_help.c:5069 sql_help.c:5108 +#: sql_help.c:4619 sql_help.c:4658 sql_help.c:4877 sql_help.c:4916 +#: sql_help.c:5122 sql_help.c:5161 msgid "with_query_name" msgstr "with_frÃ¥genamn" -#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4590 sql_help.c:4841 -#: sql_help.c:4844 sql_help.c:4847 sql_help.c:5079 sql_help.c:5082 -#: sql_help.c:5085 +#: sql_help.c:4629 sql_help.c:4632 sql_help.c:4635 sql_help.c:4887 +#: sql_help.c:4890 sql_help.c:4893 sql_help.c:5132 sql_help.c:5135 +#: sql_help.c:5138 msgid "column_definition" msgstr "kolumndefinition" -#: sql_help.c:4594 sql_help.c:4600 sql_help.c:4851 sql_help.c:4857 -#: sql_help.c:5089 sql_help.c:5095 +#: sql_help.c:4639 sql_help.c:4645 sql_help.c:4897 sql_help.c:4903 +#: sql_help.c:5142 sql_help.c:5148 msgid "join_type" msgstr "join-typ" -#: sql_help.c:4597 sql_help.c:4854 sql_help.c:5092 +#: sql_help.c:4642 sql_help.c:4900 sql_help.c:5145 msgid "join_column" msgstr "join-kolumn" -#: sql_help.c:4598 sql_help.c:4855 sql_help.c:5093 +#: sql_help.c:4643 sql_help.c:4901 sql_help.c:5146 msgid "join_using_alias" msgstr "join_using_alias" -#: sql_help.c:4604 sql_help.c:4861 sql_help.c:5099 +#: sql_help.c:4649 sql_help.c:4907 sql_help.c:5152 msgid "and grouping_element can be one of:" msgstr "och grupperingselement kan vara en av:" -#: sql_help.c:4612 sql_help.c:4869 sql_help.c:5107 +#: sql_help.c:4657 sql_help.c:4915 sql_help.c:5160 msgid "and with_query is:" msgstr "och with_frÃ¥ga är:" -#: sql_help.c:4616 sql_help.c:4873 sql_help.c:5111 +#: sql_help.c:4661 sql_help.c:4919 sql_help.c:5164 msgid "values" msgstr "värden" -#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5112 +#: sql_help.c:4662 sql_help.c:4920 sql_help.c:5165 msgid "insert" msgstr "insert" -#: sql_help.c:4618 sql_help.c:4875 sql_help.c:5113 +#: sql_help.c:4663 sql_help.c:4921 sql_help.c:5166 msgid "update" msgstr "update" -#: sql_help.c:4619 sql_help.c:4876 sql_help.c:5114 +#: sql_help.c:4664 sql_help.c:4922 sql_help.c:5167 msgid "delete" msgstr "delete" -#: sql_help.c:4621 sql_help.c:4878 sql_help.c:5116 +#: sql_help.c:4665 sql_help.c:4923 sql_help.c:5168 +msgid "merge" +msgstr "merge" + +#: sql_help.c:4667 sql_help.c:4925 sql_help.c:5170 msgid "search_seq_col_name" msgstr "söksekvens_kolumnnamn" -#: sql_help.c:4623 sql_help.c:4880 sql_help.c:5118 +#: sql_help.c:4669 sql_help.c:4927 sql_help.c:5172 msgid "cycle_mark_col_name" msgstr "cykelmarkering_kolumnnamn" -#: sql_help.c:4624 sql_help.c:4881 sql_help.c:5119 +#: sql_help.c:4670 sql_help.c:4928 sql_help.c:5173 msgid "cycle_mark_value" msgstr "cykelmarkering_värde" -#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5120 +#: sql_help.c:4671 sql_help.c:4929 sql_help.c:5174 msgid "cycle_mark_default" msgstr "cykelmarkering_standard" -#: sql_help.c:4626 sql_help.c:4883 sql_help.c:5121 +#: sql_help.c:4672 sql_help.c:4930 sql_help.c:5175 msgid "cycle_path_col_name" msgstr "cykelväg_kolumnnamn" -#: sql_help.c:4653 +#: sql_help.c:4699 msgid "new_table" msgstr "ny_tabell" -#: sql_help.c:4724 +#: sql_help.c:4770 msgid "snapshot_id" msgstr "snapshot_id" -#: sql_help.c:4984 +#: sql_help.c:5037 msgid "sort_expression" msgstr "sorteringsuttryck" -#: sql_help.c:5128 sql_help.c:6112 +#: sql_help.c:5182 sql_help.c:6166 msgid "abort the current transaction" msgstr "avbryt aktuell transaktion" -#: sql_help.c:5134 +#: sql_help.c:5188 msgid "change the definition of an aggregate function" msgstr "ändra definitionen av en aggregatfunktion" -#: sql_help.c:5140 +#: sql_help.c:5194 msgid "change the definition of a collation" msgstr "ändra definitionen av en jämförelse" -#: sql_help.c:5146 +#: sql_help.c:5200 msgid "change the definition of a conversion" msgstr "ändra definitionen av en konvertering" -#: sql_help.c:5152 +#: sql_help.c:5206 msgid "change a database" msgstr "ändra en databas" -#: sql_help.c:5158 +#: sql_help.c:5212 msgid "define default access privileges" msgstr "definiera standardaccessrättigheter" -#: sql_help.c:5164 +#: sql_help.c:5218 msgid "change the definition of a domain" msgstr "ändra definitionen av en domän" -#: sql_help.c:5170 +#: sql_help.c:5224 msgid "change the definition of an event trigger" msgstr "ändra definitionen av en händelsetrigger" -#: sql_help.c:5176 +#: sql_help.c:5230 msgid "change the definition of an extension" msgstr "ändra definitionen av en utökning" -#: sql_help.c:5182 +#: sql_help.c:5236 msgid "change the definition of a foreign-data wrapper" msgstr "ändra definitionen av en främmande data-omvandlare" -#: sql_help.c:5188 +#: sql_help.c:5242 msgid "change the definition of a foreign table" msgstr "ändra definitionen av en främmande tabell" -#: sql_help.c:5194 +#: sql_help.c:5248 msgid "change the definition of a function" msgstr "ändra definitionen av en funktion" -#: sql_help.c:5200 +#: sql_help.c:5254 msgid "change role name or membership" msgstr "ändra rollnamn eller medlemskap" -#: sql_help.c:5206 +#: sql_help.c:5260 msgid "change the definition of an index" msgstr "ändra definitionen av ett index" -#: sql_help.c:5212 +#: sql_help.c:5266 msgid "change the definition of a procedural language" msgstr "ändra definitionen av ett procedur-sprÃ¥k" -#: sql_help.c:5218 +#: sql_help.c:5272 msgid "change the definition of a large object" msgstr "ändra definitionen av ett stort objekt" -#: sql_help.c:5224 +#: sql_help.c:5278 msgid "change the definition of a materialized view" msgstr "ändra definitionen av en materialiserad vy" -#: sql_help.c:5230 +#: sql_help.c:5284 msgid "change the definition of an operator" msgstr "ändra definitionen av en operator" -#: sql_help.c:5236 +#: sql_help.c:5290 msgid "change the definition of an operator class" msgstr "ändra definitionen av en operatorklass" -#: sql_help.c:5242 +#: sql_help.c:5296 msgid "change the definition of an operator family" msgstr "ändra definitionen av en operatorfamilj" -#: sql_help.c:5248 +#: sql_help.c:5302 msgid "change the definition of a row-level security policy" msgstr "ändra definitionen av en säkerhetspolicy pÃ¥ radnivÃ¥" -#: sql_help.c:5254 +#: sql_help.c:5308 msgid "change the definition of a procedure" msgstr "ändra definitionen av en procedur" -#: sql_help.c:5260 +#: sql_help.c:5314 msgid "change the definition of a publication" msgstr "ändra definitionen av en publicering" -#: sql_help.c:5266 sql_help.c:5368 +#: sql_help.c:5320 sql_help.c:5422 msgid "change a database role" msgstr "ändra databasroll" -#: sql_help.c:5272 +#: sql_help.c:5326 msgid "change the definition of a routine" msgstr "ändra definitionen av en rutin" -#: sql_help.c:5278 +#: sql_help.c:5332 msgid "change the definition of a rule" msgstr "ändra definitionen av en regel" -#: sql_help.c:5284 +#: sql_help.c:5338 msgid "change the definition of a schema" msgstr "ändra definitionen av ett schema" -#: sql_help.c:5290 +#: sql_help.c:5344 msgid "change the definition of a sequence generator" msgstr "ändra definitionen av en sekvensgenerator" -#: sql_help.c:5296 +#: sql_help.c:5350 msgid "change the definition of a foreign server" msgstr "ändra definitionen av en främmande server" -#: sql_help.c:5302 +#: sql_help.c:5356 msgid "change the definition of an extended statistics object" msgstr "ändra definitionen av ett utökat statistikobjekt" -#: sql_help.c:5308 +#: sql_help.c:5362 msgid "change the definition of a subscription" msgstr "ändra definitionen av en prenumerering" -#: sql_help.c:5314 +#: sql_help.c:5368 msgid "change a server configuration parameter" msgstr "ändra en servers konfigurationsparameter" -#: sql_help.c:5320 +#: sql_help.c:5374 msgid "change the definition of a table" msgstr "ändra definitionen av en tabell" -#: sql_help.c:5326 +#: sql_help.c:5380 msgid "change the definition of a tablespace" msgstr "ändra definitionen av ett tabellutrymme" -#: sql_help.c:5332 +#: sql_help.c:5386 msgid "change the definition of a text search configuration" msgstr "ändra definitionen av en textsökkonfiguration" -#: sql_help.c:5338 +#: sql_help.c:5392 msgid "change the definition of a text search dictionary" msgstr "ändra definitionen av en textsökordlista" -#: sql_help.c:5344 +#: sql_help.c:5398 msgid "change the definition of a text search parser" msgstr "ändra definitionen av en textsökparser" -#: sql_help.c:5350 +#: sql_help.c:5404 msgid "change the definition of a text search template" msgstr "ändra definitionen av en textsökmall" -#: sql_help.c:5356 +#: sql_help.c:5410 msgid "change the definition of a trigger" msgstr "ändra definitionen av en trigger" -#: sql_help.c:5362 +#: sql_help.c:5416 msgid "change the definition of a type" msgstr "ändra definitionen av en typ" -#: sql_help.c:5374 +#: sql_help.c:5428 msgid "change the definition of a user mapping" msgstr "ändra definitionen av en användarmappning" -#: sql_help.c:5380 +#: sql_help.c:5434 msgid "change the definition of a view" msgstr "ändra definitionen av en vy" -#: sql_help.c:5386 +#: sql_help.c:5440 msgid "collect statistics about a database" msgstr "samla in statistik om en databas" -#: sql_help.c:5392 sql_help.c:6190 +#: sql_help.c:5446 sql_help.c:6244 msgid "start a transaction block" msgstr "starta ett transaktionsblock" -#: sql_help.c:5398 +#: sql_help.c:5452 msgid "invoke a procedure" msgstr "anropa en procedur" -#: sql_help.c:5404 +#: sql_help.c:5458 msgid "force a write-ahead log checkpoint" msgstr "tvinga checkpoint i transaktionsloggen" -#: sql_help.c:5410 +#: sql_help.c:5464 msgid "close a cursor" msgstr "stäng en markör" -#: sql_help.c:5416 +#: sql_help.c:5470 msgid "cluster a table according to an index" msgstr "klustra en tabell efter ett index" -#: sql_help.c:5422 +#: sql_help.c:5476 msgid "define or change the comment of an object" msgstr "definiera eller ändra en kommentar pÃ¥ ett objekt" -#: sql_help.c:5428 sql_help.c:5986 +#: sql_help.c:5482 sql_help.c:6040 msgid "commit the current transaction" msgstr "utför den aktuella transaktionen" -#: sql_help.c:5434 +#: sql_help.c:5488 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "utför commit pÃ¥ en transaktion som tidigare förberetts för tvÃ¥-fas-commit" -#: sql_help.c:5440 +#: sql_help.c:5494 msgid "copy data between a file and a table" msgstr "kopiera data mellan en fil och en tabell" -#: sql_help.c:5446 +#: sql_help.c:5500 msgid "define a new access method" msgstr "definiera en ny accessmetod" -#: sql_help.c:5452 +#: sql_help.c:5506 msgid "define a new aggregate function" msgstr "definiera en ny aggregatfunktion" -#: sql_help.c:5458 +#: sql_help.c:5512 msgid "define a new cast" msgstr "definiera en ny typomvandling" -#: sql_help.c:5464 +#: sql_help.c:5518 msgid "define a new collation" msgstr "definiera en ny jämförelse" -#: sql_help.c:5470 +#: sql_help.c:5524 msgid "define a new encoding conversion" msgstr "definiera en ny teckenkodningskonvertering" -#: sql_help.c:5476 +#: sql_help.c:5530 msgid "create a new database" msgstr "skapa en ny databas" -#: sql_help.c:5482 +#: sql_help.c:5536 msgid "define a new domain" msgstr "definiera en ny domän" -#: sql_help.c:5488 +#: sql_help.c:5542 msgid "define a new event trigger" msgstr "definiera en ny händelsetrigger" -#: sql_help.c:5494 +#: sql_help.c:5548 msgid "install an extension" msgstr "installera en utökning" -#: sql_help.c:5500 +#: sql_help.c:5554 msgid "define a new foreign-data wrapper" msgstr "definiera en ny främmande data-omvandlare" -#: sql_help.c:5506 +#: sql_help.c:5560 msgid "define a new foreign table" msgstr "definiera en ny främmande tabell" -#: sql_help.c:5512 +#: sql_help.c:5566 msgid "define a new function" msgstr "definiera en ny funktion" -#: sql_help.c:5518 sql_help.c:5578 sql_help.c:5680 +#: sql_help.c:5572 sql_help.c:5632 sql_help.c:5734 msgid "define a new database role" msgstr "definiera en ny databasroll" -#: sql_help.c:5524 +#: sql_help.c:5578 msgid "define a new index" msgstr "skapa ett nytt index" -#: sql_help.c:5530 +#: sql_help.c:5584 msgid "define a new procedural language" msgstr "definiera ett nytt procedur-sprÃ¥k" -#: sql_help.c:5536 +#: sql_help.c:5590 msgid "define a new materialized view" msgstr "definiera en ny materialiserad vy" -#: sql_help.c:5542 +#: sql_help.c:5596 msgid "define a new operator" msgstr "definiera en ny operator" -#: sql_help.c:5548 +#: sql_help.c:5602 msgid "define a new operator class" msgstr "definiera en ny operatorklass" -#: sql_help.c:5554 +#: sql_help.c:5608 msgid "define a new operator family" msgstr "definiera en ny operatorfamilj" -#: sql_help.c:5560 +#: sql_help.c:5614 msgid "define a new row-level security policy for a table" msgstr "definiera en ny säkerhetspolicy pÃ¥ radnivÃ¥ för en tabell" -#: sql_help.c:5566 +#: sql_help.c:5620 msgid "define a new procedure" msgstr "definiera ett ny procedur" -#: sql_help.c:5572 +#: sql_help.c:5626 msgid "define a new publication" msgstr "definiera en ny publicering" -#: sql_help.c:5584 +#: sql_help.c:5638 msgid "define a new rewrite rule" msgstr "definiera en ny omskrivningsregel" -#: sql_help.c:5590 +#: sql_help.c:5644 msgid "define a new schema" msgstr "definiera ett nytt schema" -#: sql_help.c:5596 +#: sql_help.c:5650 msgid "define a new sequence generator" msgstr "definiera en ny sekvensgenerator" -#: sql_help.c:5602 +#: sql_help.c:5656 msgid "define a new foreign server" msgstr "definiera en ny främmande server" -#: sql_help.c:5608 +#: sql_help.c:5662 msgid "define extended statistics" msgstr "definiera utökad statistik" -#: sql_help.c:5614 +#: sql_help.c:5668 msgid "define a new subscription" msgstr "definiera en ny prenumeration" -#: sql_help.c:5620 +#: sql_help.c:5674 msgid "define a new table" msgstr "definiera en ny tabell" -#: sql_help.c:5626 sql_help.c:6148 +#: sql_help.c:5680 sql_help.c:6202 msgid "define a new table from the results of a query" msgstr "definiera en ny tabell utifrÃ¥n resultatet av en frÃ¥ga" -#: sql_help.c:5632 +#: sql_help.c:5686 msgid "define a new tablespace" msgstr "definiera ett nytt tabellutrymme" -#: sql_help.c:5638 +#: sql_help.c:5692 msgid "define a new text search configuration" msgstr "definiera en ny textsökkonfiguration" -#: sql_help.c:5644 +#: sql_help.c:5698 msgid "define a new text search dictionary" msgstr "definiera en ny textsökordlista" -#: sql_help.c:5650 +#: sql_help.c:5704 msgid "define a new text search parser" msgstr "definiera en ny textsökparser" -#: sql_help.c:5656 +#: sql_help.c:5710 msgid "define a new text search template" msgstr "definiera en ny textsökmall" -#: sql_help.c:5662 +#: sql_help.c:5716 msgid "define a new transform" msgstr "definiera en ny transform" -#: sql_help.c:5668 +#: sql_help.c:5722 msgid "define a new trigger" msgstr "definiera en ny trigger" -#: sql_help.c:5674 +#: sql_help.c:5728 msgid "define a new data type" msgstr "definiera en ny datatyp" -#: sql_help.c:5686 +#: sql_help.c:5740 msgid "define a new mapping of a user to a foreign server" msgstr "definiera en ny mappning av en användare till en främmande server" -#: sql_help.c:5692 +#: sql_help.c:5746 msgid "define a new view" msgstr "definiera en ny vy" -#: sql_help.c:5698 +#: sql_help.c:5752 msgid "deallocate a prepared statement" msgstr "deallokera en förberedd sats" -#: sql_help.c:5704 +#: sql_help.c:5758 msgid "define a cursor" msgstr "definiera en markör" -#: sql_help.c:5710 +#: sql_help.c:5764 msgid "delete rows of a table" msgstr "radera rader i en tabell" -#: sql_help.c:5716 +#: sql_help.c:5770 msgid "discard session state" msgstr "släng sessionstillstÃ¥nd" -#: sql_help.c:5722 +#: sql_help.c:5776 msgid "execute an anonymous code block" msgstr "kör ett annonymt kodblock" -#: sql_help.c:5728 +#: sql_help.c:5782 msgid "remove an access method" msgstr "ta bort en accessmetod" -#: sql_help.c:5734 +#: sql_help.c:5788 msgid "remove an aggregate function" msgstr "ta bort en aggregatfunktioner" -#: sql_help.c:5740 +#: sql_help.c:5794 msgid "remove a cast" msgstr "ta bort en typomvandling" -#: sql_help.c:5746 +#: sql_help.c:5800 msgid "remove a collation" msgstr "ta bort en jämförelse" -#: sql_help.c:5752 +#: sql_help.c:5806 msgid "remove a conversion" msgstr "ta bort en konvertering" -#: sql_help.c:5758 +#: sql_help.c:5812 msgid "remove a database" msgstr "ta bort en databas" -#: sql_help.c:5764 +#: sql_help.c:5818 msgid "remove a domain" msgstr "ta bort en domän" -#: sql_help.c:5770 +#: sql_help.c:5824 msgid "remove an event trigger" msgstr "ta bort en händelsetrigger" -#: sql_help.c:5776 +#: sql_help.c:5830 msgid "remove an extension" msgstr "ta bort en utökning" -#: sql_help.c:5782 +#: sql_help.c:5836 msgid "remove a foreign-data wrapper" msgstr "ta bort en frammande data-omvandlare" -#: sql_help.c:5788 +#: sql_help.c:5842 msgid "remove a foreign table" msgstr "ta bort en främmande tabell" -#: sql_help.c:5794 +#: sql_help.c:5848 msgid "remove a function" msgstr "ta bort en funktion" -#: sql_help.c:5800 sql_help.c:5866 sql_help.c:5968 +#: sql_help.c:5854 sql_help.c:5920 sql_help.c:6022 msgid "remove a database role" msgstr "ta bort en databasroll" -#: sql_help.c:5806 +#: sql_help.c:5860 msgid "remove an index" msgstr "ta bort ett index" -#: sql_help.c:5812 +#: sql_help.c:5866 msgid "remove a procedural language" msgstr "ta bort ett procedur-sprÃ¥k" -#: sql_help.c:5818 +#: sql_help.c:5872 msgid "remove a materialized view" msgstr "ta bort en materialiserad vy" -#: sql_help.c:5824 +#: sql_help.c:5878 msgid "remove an operator" msgstr "ta bort en operator" -#: sql_help.c:5830 +#: sql_help.c:5884 msgid "remove an operator class" msgstr "ta bort en operatorklass" -#: sql_help.c:5836 +#: sql_help.c:5890 msgid "remove an operator family" msgstr "ta bort en operatorfamilj" -#: sql_help.c:5842 +#: sql_help.c:5896 msgid "remove database objects owned by a database role" msgstr "ta bort databasobjekt som ägs av databasroll" -#: sql_help.c:5848 +#: sql_help.c:5902 msgid "remove a row-level security policy from a table" msgstr "ta bort en säkerhetspolicy pÃ¥ radnivÃ¥ frÃ¥n en tabell" -#: sql_help.c:5854 +#: sql_help.c:5908 msgid "remove a procedure" msgstr "ta bort en procedur" -#: sql_help.c:5860 +#: sql_help.c:5914 msgid "remove a publication" msgstr "ta bort en publicering" -#: sql_help.c:5872 +#: sql_help.c:5926 msgid "remove a routine" msgstr "ta bort en rutin" -#: sql_help.c:5878 +#: sql_help.c:5932 msgid "remove a rewrite rule" msgstr "ta bort en omskrivningsregel" -#: sql_help.c:5884 +#: sql_help.c:5938 msgid "remove a schema" msgstr "ta bort ett schema" -#: sql_help.c:5890 +#: sql_help.c:5944 msgid "remove a sequence" msgstr "ta bort en sekvens" -#: sql_help.c:5896 +#: sql_help.c:5950 msgid "remove a foreign server descriptor" msgstr "ta bort en främmande server-deskriptor" -#: sql_help.c:5902 +#: sql_help.c:5956 msgid "remove extended statistics" msgstr "ta bort utökad statistik" -#: sql_help.c:5908 +#: sql_help.c:5962 msgid "remove a subscription" msgstr "ta bort en prenumeration" -#: sql_help.c:5914 +#: sql_help.c:5968 msgid "remove a table" msgstr "ta bort en tabell" -#: sql_help.c:5920 +#: sql_help.c:5974 msgid "remove a tablespace" msgstr "ta bort ett tabellutrymme" -#: sql_help.c:5926 +#: sql_help.c:5980 msgid "remove a text search configuration" msgstr "ta bort en textsökkonfiguration" -#: sql_help.c:5932 +#: sql_help.c:5986 msgid "remove a text search dictionary" msgstr "ta bort en textsökordlista" -#: sql_help.c:5938 +#: sql_help.c:5992 msgid "remove a text search parser" msgstr "ta bort en textsökparser" -#: sql_help.c:5944 +#: sql_help.c:5998 msgid "remove a text search template" msgstr "ta bort en textsökmall" -#: sql_help.c:5950 +#: sql_help.c:6004 msgid "remove a transform" msgstr "ta bort en transform" -#: sql_help.c:5956 +#: sql_help.c:6010 msgid "remove a trigger" msgstr "ta bort en trigger" -#: sql_help.c:5962 +#: sql_help.c:6016 msgid "remove a data type" msgstr "ta bort en datatyp" -#: sql_help.c:5974 +#: sql_help.c:6028 msgid "remove a user mapping for a foreign server" msgstr "ta bort en användarmappning för en främmande server" -#: sql_help.c:5980 +#: sql_help.c:6034 msgid "remove a view" msgstr "ta bort en vy" -#: sql_help.c:5992 +#: sql_help.c:6046 msgid "execute a prepared statement" msgstr "utför en förberedd sats" -#: sql_help.c:5998 +#: sql_help.c:6052 msgid "show the execution plan of a statement" msgstr "visa körningsplanen för en sats" -#: sql_help.c:6004 +#: sql_help.c:6058 msgid "retrieve rows from a query using a cursor" msgstr "hämta rader frÃ¥n en frÃ¥ga med hjälp av en markör" -#: sql_help.c:6010 +#: sql_help.c:6064 msgid "define access privileges" msgstr "definera Ã¥tkomsträttigheter" -#: sql_help.c:6016 +#: sql_help.c:6070 msgid "import table definitions from a foreign server" msgstr "importera tabelldefinitioner frÃ¥n en främmande server" -#: sql_help.c:6022 +#: sql_help.c:6076 msgid "create new rows in a table" msgstr "skapa nya rader i en tabell" -#: sql_help.c:6028 +#: sql_help.c:6082 msgid "listen for a notification" msgstr "lyssna efter notifiering" -#: sql_help.c:6034 +#: sql_help.c:6088 msgid "load a shared library file" msgstr "ladda en delad biblioteksfil (shared library)" -#: sql_help.c:6040 +#: sql_help.c:6094 msgid "lock a table" msgstr "lÃ¥s en tabell" -#: sql_help.c:6046 +#: sql_help.c:6100 msgid "conditionally insert, update, or delete rows of a table" msgstr "villkorlig insert, updare eller delete av rader i en tabell" -#: sql_help.c:6052 +#: sql_help.c:6106 msgid "position a cursor" msgstr "flytta en markör" -#: sql_help.c:6058 +#: sql_help.c:6112 msgid "generate a notification" msgstr "generera en notifiering" -#: sql_help.c:6064 +#: sql_help.c:6118 msgid "prepare a statement for execution" msgstr "förbered en sats för körning" -#: sql_help.c:6070 +#: sql_help.c:6124 msgid "prepare the current transaction for two-phase commit" msgstr "avbryt aktuell transaktion för tvÃ¥-fas-commit" -#: sql_help.c:6076 +#: sql_help.c:6130 msgid "change the ownership of database objects owned by a database role" msgstr "byt ägare pÃ¥ databasobjekt som ägs av en databasroll" -#: sql_help.c:6082 +#: sql_help.c:6136 msgid "replace the contents of a materialized view" msgstr "ersätt innehÃ¥llet av en materialiserad vy" -#: sql_help.c:6088 +#: sql_help.c:6142 msgid "rebuild indexes" msgstr "Ã¥terskapa index" -#: sql_help.c:6094 -msgid "destroy a previously defined savepoint" -msgstr "ta bort en tidigare definierad sparpunkt" +#: sql_help.c:6148 +msgid "release a previously defined savepoint" +msgstr "frigör en tidigare definierad sparpunkt" -#: sql_help.c:6100 +#: sql_help.c:6154 msgid "restore the value of a run-time parameter to the default value" msgstr "Ã¥terställ värde av körningsparameter till standardvärdet" -#: sql_help.c:6106 +#: sql_help.c:6160 msgid "remove access privileges" msgstr "ta bort Ã¥tkomsträttigheter" -#: sql_help.c:6118 +#: sql_help.c:6172 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "avbryt en transaktion som tidigare förberetts för tvÃ¥-fas-commit" -#: sql_help.c:6124 +#: sql_help.c:6178 msgid "roll back to a savepoint" msgstr "rulla tillbaka till sparpunkt" -#: sql_help.c:6130 +#: sql_help.c:6184 msgid "define a new savepoint within the current transaction" msgstr "definera en ny sparpunkt i den aktuella transaktionen" -#: sql_help.c:6136 +#: sql_help.c:6190 msgid "define or change a security label applied to an object" msgstr "definiera eller ändra en säkerhetsetikett pÃ¥ ett objekt" -#: sql_help.c:6142 sql_help.c:6196 sql_help.c:6232 +#: sql_help.c:6196 sql_help.c:6250 sql_help.c:6286 msgid "retrieve rows from a table or view" msgstr "hämta rader frÃ¥n en tabell eller vy" -#: sql_help.c:6154 +#: sql_help.c:6208 msgid "change a run-time parameter" msgstr "ändra en körningsparameter" -#: sql_help.c:6160 +#: sql_help.c:6214 msgid "set constraint check timing for the current transaction" msgstr "sätt integritetsvillkorstiming för nuvarande transaktion" -#: sql_help.c:6166 +#: sql_help.c:6220 msgid "set the current user identifier of the current session" msgstr "sätt användare för den aktiva sessionen" -#: sql_help.c:6172 +#: sql_help.c:6226 msgid "set the session user identifier and the current user identifier of the current session" msgstr "sätt sessionsanvändaridentifierare och nuvarande användaridentifierare för den aktiva sessionen" -#: sql_help.c:6178 +#: sql_help.c:6232 msgid "set the characteristics of the current transaction" msgstr "sätt inställningar för nuvarande transaktionen" -#: sql_help.c:6184 +#: sql_help.c:6238 msgid "show the value of a run-time parameter" msgstr "visa värde pÃ¥ en körningsparameter" -#: sql_help.c:6202 +#: sql_help.c:6256 msgid "empty a table or set of tables" msgstr "töm en eller flera tabeller" -#: sql_help.c:6208 +#: sql_help.c:6262 msgid "stop listening for a notification" msgstr "sluta att lyssna efter notifiering" -#: sql_help.c:6214 +#: sql_help.c:6268 msgid "update rows of a table" msgstr "uppdatera rader i en tabell" -#: sql_help.c:6220 +#: sql_help.c:6274 msgid "garbage-collect and optionally analyze a database" msgstr "skräpsamla och eventuellt analysera en databas" -#: sql_help.c:6226 +#: sql_help.c:6280 msgid "compute a set of rows" msgstr "beräkna en mängd rader" @@ -6415,7 +6585,7 @@ msgstr "extra kommandoradsargument \"%s\" ignorerad" msgid "could not find own program executable" msgstr "kunde inte hitta det egna programmets körbara fil" -#: tab-complete.c:5955 +#: tab-complete.c:6216 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6441,7 +6611,7 @@ msgstr "ogiltigt värde \"%s\" för \"%s\": förväntade sig ett heltal" msgid "invalid variable name: \"%s\"" msgstr "ogiltigt variabelnamn: \"%s\"" -#: variables.c:419 +#: variables.c:418 #, c-format msgid "" "unrecognized value \"%s\" for \"%s\"\n" @@ -6449,31 +6619,3 @@ msgid "" msgstr "" "okänt värde \"%s\" för \"%s\"\n" "Tillgängliga värden är: %s." - -#, c-format -#~ msgid "" -#~ " \\lo_export LOBOID FILE\n" -#~ " \\lo_import FILE [COMMENT]\n" -#~ " \\lo_list[+]\n" -#~ " \\lo_unlink LOBOID large object operations\n" -#~ msgstr "" -#~ " \\lo_export LOBOID FIL\n" -#~ " \\lo_import FIL [KOMMENTAR]\n" -#~ " \\lo_list[+]\n" -#~ " \\lo_unlink LOBOID operationer pÃ¥ stora objekt\n" - -#, c-format -#~ msgid "\\watch cannot be used with COPY" -#~ msgstr "\\watch kan inte användas med COPY" - -#~ msgid "match" -#~ msgstr "match" - -#~ msgid "text" -#~ msgstr "text" - -#~ msgid "timezone" -#~ msgstr "tidszon" - -#~ msgid "where direction can be empty or one of:" -#~ msgstr "där riktning kan vara tom eller en av:" diff --git a/src/bin/psql/po/uk.po b/src/bin/psql/po/uk.po index dd4790db36ecf..7b0e93050e1b9 100644 --- a/src/bin/psql/po/uk.po +++ b/src/bin/psql/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:47+0000\n" -"PO-Revision-Date: 2022-09-13 14:36+0200\n" +"POT-Creation-Date: 2025-03-29 10:37+0000\n" +"PO-Revision-Date: 2025-04-01 13:47\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,9 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/psql.pot\n" -"X-Crowdin-File-ID: 900\n" -"X-Generator: Poedit 3.1.1\n" +"X-Crowdin-File: /REL_17_STABLE/psql.pot\n" +"X-Crowdin-File-ID: 996\n" #: ../../../src/common/logging.c:276 #, c-format @@ -38,55 +37,60 @@ msgstr "деталі: " msgid "hint: " msgstr "підказка: " -#: ../../common/exec.c:149 ../../common/exec.c:266 ../../common/exec.c:312 +#: ../../common/exec.c:174 #, c-format -msgid "could not identify current directory: %m" -msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ поточний каталог: %m" +msgid "invalid binary \"%s\": %m" +msgstr "невірний бінарний файл \"%s\": %m" -#: ../../common/exec.c:168 +#: ../../common/exec.c:217 #, c-format -msgid "invalid binary \"%s\"" -msgstr "невірний бінарний файл \"%s\"" +msgid "could not read binary \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ бінарний файл \"%s\": %m" -#: ../../common/exec.c:218 -#, c-format -msgid "could not read binary \"%s\"" -msgstr "неможливо прочитати бінарний файл \"%s\"" - -#: ../../common/exec.c:226 +#: ../../common/exec.c:225 #, c-format msgid "could not find a \"%s\" to execute" msgstr "неможливо знайти \"%s\" Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ" -#: ../../common/exec.c:282 ../../common/exec.c:321 +#: ../../common/exec.c:252 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ абÑолютний шлÑÑ… \"%s\": %m" + +#: ../../common/exec.c:382 copy.c:326 +#, c-format +msgid "could not execute command \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ команду \"%s\": %m" + +#: ../../common/exec.c:394 #, c-format -msgid "could not change directory to \"%s\": %m" -msgstr "не вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ каталог на \"%s\": %m" +msgid "could not read from command \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ виÑновок команди \"%s\": %m" -#: ../../common/exec.c:299 +#: ../../common/exec.c:397 #, c-format -msgid "could not read symbolic link \"%s\": %m" -msgstr "не можливо прочитати Ñимволічне поÑÐ»Ð°Ð½Ð½Ñ \"%s\": %m" +msgid "no data was returned by command \"%s\"" +msgstr "команда \"%s\" не повернула жодних даних" -#: ../../common/exec.c:422 +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() помилка: %m" -#: ../../common/exec.c:560 ../../common/exec.c:605 ../../common/exec.c:697 -#: command.c:1320 command.c:3316 command.c:3365 command.c:3489 input.c:227 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 +#: command.c:1373 command.c:3459 command.c:3508 command.c:3633 input.c:225 #: mainloop.c:80 mainloop.c:398 #, c-format msgid "out of memory" msgstr "недоÑтатньо пам'Ñті" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "недоÑтатньо пам'Ñті\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" @@ -96,7 +100,7 @@ msgstr "неможливо дублювати нульовий покажчик msgid "could not look up effective user ID %ld: %s" msgstr "не можу знайти кориÑтувача з ефективним ID %ld: %s" -#: ../../common/username.c:45 command.c:576 +#: ../../common/username.c:45 command.c:616 msgid "user does not exist" msgstr "кориÑтувача не Ñ–Ñнує" @@ -105,41 +109,41 @@ msgstr "кориÑтувача не Ñ–Ñнує" msgid "user name lookup failure: error code %lu" msgstr "невдала підÑтановка імені кориÑтувача: код помилки %lu" -#: ../../common/wait_error.c:45 +#: ../../common/wait_error.c:55 #, c-format msgid "command not executable" msgstr "неможливо виконати команду" -#: ../../common/wait_error.c:49 +#: ../../common/wait_error.c:59 #, c-format msgid "command not found" msgstr "команду не знайдено" -#: ../../common/wait_error.c:54 +#: ../../common/wait_error.c:64 #, c-format msgid "child process exited with exit code %d" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· кодом виходу %d" -#: ../../common/wait_error.c:62 +#: ../../common/wait_error.c:72 #, c-format msgid "child process was terminated by exception 0x%X" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через помилку 0Ñ…%X" -#: ../../common/wait_error.c:66 +#: ../../common/wait_error.c:76 #, c-format msgid "child process was terminated by signal %d: %s" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ через Ñигнал %d: %s" -#: ../../common/wait_error.c:72 +#: ../../common/wait_error.c:82 #, c-format msgid "child process exited with unrecognized status %d" msgstr "дочірній Ð¿Ñ€Ð¾Ñ†ÐµÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð²ÑÑ Ð· невизнаним ÑтатуÑом %d" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Запит на ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ð¹\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "Ðе вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати запит на ÑкаÑуваннÑ: " @@ -152,494 +156,564 @@ msgstr[1] "(%lu Ñ€Ñдки)" msgstr[2] "(%lu Ñ€Ñдків)" msgstr[3] "(%lu Ñ€Ñдка)" -#: ../../fe_utils/print.c:3109 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "Перервано\n" -#: ../../fe_utils/print.c:3173 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "Ðеможливо надрукувати вміÑÑ‚ таблиці: кількіÑть комірок %lld дорівнює або перевищує макÑимальне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %lld.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Ðеможливо додати заголовок до вміÑту таблиці: кількіÑть колонок %d перевищено.\n" -#: ../../fe_utils/print.c:3213 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "Ðеможливо додати комірку до вміÑту таблиці: перевищено загальну кількіÑть комірок %d.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "Ðеможливо додати комірку до вміÑту таблиці: перевищено загальну кількіÑть комірок %lld.\n" -#: ../../fe_utils/print.c:3471 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "невірний формат виводу (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°): %d" -#: ../../fe_utils/psqlscan.l:702 +#: ../../fe_utils/psqlscan.l:732 #, c-format msgid "skipping recursive expansion of variable \"%s\"" msgstr "пропуÑк рекурÑивного Ñ€Ð¾Ð·Ð³Ð¾Ñ€Ñ‚Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ— \"%s\"" -#: ../../port/thread.c:100 ../../port/thread.c:136 +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "аргумент командної оболонки міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "назва бази даних міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: ../../port/user.c:43 ../../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ локального кориÑтувача з ідентифікатором %d: %s" -#: ../../port/thread.c:105 ../../port/thread.c:141 +#: ../../port/user.c:48 ../../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "локального кориÑтувача з ідентифікатором %d не Ñ–Ñнує" -#: command.c:233 +#: command.c:235 #, c-format msgid "invalid command \\%s" msgstr "Ðевірна команда \\%s" -#: command.c:235 +#: command.c:237 #, c-format msgid "Try \\? for help." msgstr "Спробуйте \\? Ð´Ð»Ñ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¸." -#: command.c:253 +#: command.c:255 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: зайвий аргумент \"%s\" проігноровано" -#: command.c:305 +#: command.c:307 #, c-format msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" msgstr "\\%s команду проігноровано; ÑкориÑтайтеÑÑŒ \\endif або Ctrl-C, щоб вийти з поточного блоку \\if" -#: command.c:574 +#: command.c:614 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "неможливо отримати домашню директорію Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувача ID %ld: %s" -#: command.c:593 +#: command.c:633 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: неможливо змінити директорію на \"%s\": %m" -#: command.c:618 +#: command.c:657 #, c-format msgid "You are currently not connected to a database.\n" msgstr "Ðа даний момент ви від'єднанні від бази даних.\n" -#: command.c:628 +#: command.c:667 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Ви під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" за ареÑою \"%s\" на порту \"%s\".\n" -#: command.c:631 +#: command.c:670 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Ви під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" через Ñокет в \"%s\" на порту \"%s\".\n" -#: command.c:637 +#: command.c:676 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Ви під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" на хоÑті \"%s\" (за ареÑою \"%s\") на порту \"%s\".\n" -#: command.c:640 +#: command.c:679 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Ви під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" на хоÑті \"%s\" на порту \"%s\".\n" -#: command.c:1031 command.c:1126 command.c:2660 +#: command.c:1069 command.c:1170 command.c:2676 #, c-format msgid "no query buffer" msgstr "немає буферу запитів" -#: command.c:1064 command.c:5497 +#: command.c:1102 command.c:5779 #, c-format msgid "invalid line number: %s" msgstr "невірний номер Ñ€Ñдка: %s" -#: command.c:1202 +#: command.c:1248 msgid "No changes" msgstr "Без змін" -#: command.c:1281 +#: command.c:1333 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: невірне ім'Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð°Ð±Ð¾ не знайдено процедуру конверÑÑ–Ñ—" -#: command.c:1316 command.c:2119 command.c:3312 command.c:3511 command.c:5599 -#: common.c:177 common.c:226 common.c:395 common.c:1137 common.c:1155 -#: common.c:1229 common.c:1336 common.c:1374 common.c:1459 common.c:1495 -#: copy.c:488 copy.c:722 help.c:66 large_obj.c:157 large_obj.c:192 -#: large_obj.c:254 startup.c:304 +#: command.c:1369 command.c:2158 command.c:3455 command.c:3653 command.c:5885 +#: common.c:221 common.c:270 common.c:440 common.c:1142 common.c:1160 +#: common.c:1228 common.c:1340 common.c:1378 common.c:1475 common.c:1541 +#: copy.c:486 copy.c:722 large_obj.c:157 large_obj.c:192 large_obj.c:254 +#: startup.c:304 #, c-format msgid "%s" msgstr "%s" -#: command.c:1323 +#: command.c:1376 msgid "There is no previous error." msgstr "ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ° відÑутнÑ." -#: command.c:1436 +#: command.c:1489 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: відÑÑƒÑ‚Ð½Ñ Ð¿Ñ€Ð°Ð²Ð° дужка" -#: command.c:1520 command.c:1650 command.c:1955 command.c:1969 command.c:1988 -#: command.c:2172 command.c:2414 command.c:2627 command.c:2667 +#: command.c:1573 command.c:1692 command.c:1996 command.c:2010 command.c:2029 +#: command.c:2197 command.c:2438 command.c:2643 command.c:2683 #, c-format msgid "\\%s: missing required argument" msgstr "\\%s: не виÑтачає обов'Ñзкового аргументу" -#: command.c:1781 +#: command.c:1823 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: не може йти піÑÐ»Ñ \\else" -#: command.c:1786 +#: command.c:1828 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: немає відповідного \\if" -#: command.c:1850 +#: command.c:1892 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: не може йти піÑÐ»Ñ \\else" -#: command.c:1855 +#: command.c:1897 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: немає відповідного \\if" -#: command.c:1895 +#: command.c:1937 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: немає відповідного \\if" -#: command.c:2052 +#: command.c:2093 msgid "Query buffer is empty." msgstr "Буфер запиту порожній." -#: command.c:2095 +#: command.c:2136 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Введіть новий пароль кориÑтувача \"%s\": " -#: command.c:2099 +#: command.c:2140 msgid "Enter it again: " msgstr "Введіть знову: " -#: command.c:2108 +#: command.c:2149 #, c-format msgid "Passwords didn't match." msgstr "Паролі не Ñпівпадають." -#: command.c:2207 +#: command.c:2232 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ—" -#: command.c:2310 +#: command.c:2334 msgid "Query buffer reset (cleared)." msgstr "Буфер запитів Ñкинуто (очищено)." -#: command.c:2332 +#: command.c:2356 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "ІÑторію запиÑано до файлу \"%s\".\n" -#: command.c:2419 +#: command.c:2443 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: змінна Ñередовища не повинна міÑтити \"=\"" -#: command.c:2467 +#: command.c:2491 #, c-format msgid "function name is required" msgstr "необхідне ім'Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—" -#: command.c:2469 +#: command.c:2493 #, c-format msgid "view name is required" msgstr "необхідне ім'Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ" -#: command.c:2599 +#: command.c:2615 msgid "Timing is on." msgstr "Таймер увімкнено." -#: command.c:2601 +#: command.c:2617 msgid "Timing is off." msgstr "Таймер вимкнено." -#: command.c:2686 command.c:2714 command.c:3952 command.c:3955 command.c:3958 -#: command.c:3964 command.c:3966 command.c:3992 command.c:4002 command.c:4014 -#: command.c:4028 command.c:4055 command.c:4113 common.c:73 copy.c:331 -#: copy.c:403 psqlscanslash.l:784 psqlscanslash.l:795 psqlscanslash.l:805 +#: command.c:2703 command.c:2741 command.c:4166 command.c:4169 command.c:4172 +#: command.c:4178 command.c:4180 command.c:4206 command.c:4216 command.c:4228 +#: command.c:4242 command.c:4269 command.c:4327 common.c:77 copy.c:329 +#: copy.c:401 psqlscanslash.l:805 psqlscanslash.l:817 psqlscanslash.l:835 #, c-format msgid "%s: %m" msgstr "%s: %m" -#: command.c:3113 startup.c:243 startup.c:293 +#: command.c:2730 copy.c:388 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#: command.c:2802 command.c:2868 +#, c-format +msgid "\\watch: interval value is specified more than once" +msgstr "\\watch: інтервал зазначаєтьÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ñ€Ð°Ð·Ð¾Ð²Ð¾" + +#: command.c:2812 command.c:2878 +#, c-format +msgid "\\watch: incorrect interval value \"%s\"" +msgstr "\\watch: неправильне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ñƒ \"%s\"" + +#: command.c:2822 +#, c-format +msgid "\\watch: iteration count is specified more than once" +msgstr "\\watch: інтервал зазначаєтьÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾Ñ€Ð°Ð·Ð¾Ð²Ð¾" + +#: command.c:2832 +#, c-format +msgid "\\watch: incorrect iteration count \"%s\"" +msgstr "\\watch: неправильна кількіÑть ітерацій \"%s\"" + +#: command.c:2842 +#, c-format +msgid "\\watch: minimum row count specified more than once" +msgstr "\\watch: мінімальна кількіÑть Ñ€Ñдків вказана більше одного разу" + +#: command.c:2852 +#, c-format +msgid "\\watch: incorrect minimum row count \"%s\"" +msgstr "\\watch: неправильна мінімальна кількіÑть Ñ€Ñдків \"%s\"" + +#: command.c:2859 +#, c-format +msgid "\\watch: unrecognized parameter \"%s\"" +msgstr "\\watch: нерозпізнаний параметр \"%s\"" + +#: command.c:3256 startup.c:243 startup.c:293 msgid "Password: " msgstr "Пароль: " -#: command.c:3118 startup.c:290 +#: command.c:3261 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Пароль кориÑтувача %s:" -#: command.c:3174 +#: command.c:3317 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "Ðе надайте кориÑтувачеві, хоÑту або порту окремо під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñ€Ñдка підключеннÑ" -#: command.c:3209 +#: command.c:3352 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "Ðе Ñ–Ñнує Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ бази даних Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ викориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð²" -#: command.c:3517 +#: command.c:3659 #, c-format msgid "Previous connection kept" msgstr "Попереднє Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð²Ð°Ñ”" -#: command.c:3523 +#: command.c:3665 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3579 +#: command.c:3721 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" msgstr "Ви під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" за адреÑою \"%s\" на порту \"%s\".\n" -#: command.c:3582 +#: command.c:3724 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" msgstr "Ви тепер під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" через Ñокет в \"%s\" на порту \"%s\".\n" -#: command.c:3588 +#: command.c:3730 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" msgstr "Ви під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" на хоÑті \"%s\" (за адреÑою \"%s\") на порту \"%s\".\n" -#: command.c:3591 +#: command.c:3733 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" msgstr "Ви тепер під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\" на хоÑті \"%s\" на порту \"%s\".\n" -#: command.c:3596 +#: command.c:3738 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Ви тепер під'єднані до бази даних \"%s\" Ñк кориÑтувач \"%s\".\n" -#: command.c:3636 +#: command.c:3844 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, Ñервер %s)\n" -#: command.c:3649 +#: command.c:3857 #, c-format -msgid "" -"WARNING: %s major version %s, server major version %s.\n" +msgid "WARNING: %s major version %s, server major version %s.\n" " Some psql features might not work.\n" -msgstr "" -"УВÐГÐ: мажорна верÑÑ–Ñ %s %s, мажорна верÑÑ–Ñ Ñервера %s.\n" +msgstr "УВÐГÐ: мажорна верÑÑ–Ñ %s %s, мажорна верÑÑ–Ñ Ñервера %s.\n" " ДеÑкі функції psql можуть не працювати.\n" -#: command.c:3686 +#: command.c:3896 #, c-format -msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" -msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ SSL (протокол: %s, шифр: %s, компреÑÑ–Ñ: %s)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s, ALPN: %s)\n" +msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ SSL (протокол: %s, шифр: %s, компреÑÑ–Ñ: %s, ALPN: %s)\n" -#: command.c:3687 command.c:3688 +#: command.c:3897 command.c:3898 msgid "unknown" msgstr "невідомо" -#: command.c:3689 help.c:42 +#: command.c:3899 help.c:42 msgid "off" msgstr "вимк" -#: command.c:3689 help.c:42 +#: command.c:3899 help.c:42 msgid "on" msgstr "увімк" -#: command.c:3703 +#: command.c:3900 +msgid "none" +msgstr "нічого" + +#: command.c:3914 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð°ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¾ GSSAPI\n" -#: command.c:3723 +#: command.c:3934 #, c-format -msgid "" -"WARNING: Console code page (%u) differs from Windows code page (%u)\n" +msgid "WARNING: Console code page (%u) differs from Windows code page (%u)\n" " 8-bit characters might not work correctly. See psql reference\n" " page \"Notes for Windows users\" for details.\n" -msgstr "" -"УВÐГÐ: Кодова Ñторінка конÑолі (%u) відрізнÑєтьÑÑ Ð²Ñ–Ð´ кодової Ñторінки Windows (%u)\n" +msgstr "УВÐГÐ: Кодова Ñторінка конÑолі (%u) відрізнÑєтьÑÑ Ð²Ñ–Ð´ кодової Ñторінки Windows (%u)\n" " 8-бітові Ñимволи можуть працювати неправильно. Детальніше у розділі \n" " \"Ðотатки Ð´Ð»Ñ ÐºÐ¾Ñ€Ð¸Ñтувачів Windows\" у документації psql.\n" -#: command.c:3828 +#: command.c:4041 #, c-format msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" msgstr "змінна Ñередовища PSQL_EDITOR_LINENUMBER_ARG має бути вÑтановлена, щоб вказувати номер Ñ€Ñдка" -#: command.c:3857 +#: command.c:4071 #, c-format msgid "could not start editor \"%s\"" msgstr "неможливо запуÑтити редактор \"%s\"" -#: command.c:3859 +#: command.c:4073 #, c-format msgid "could not start /bin/sh" msgstr "неможливо запуÑтити /bin/sh" -#: command.c:3909 +#: command.c:4123 #, c-format msgid "could not locate temporary directory: %s" msgstr "неможливо знайти тимчаÑову директорію: %s" -#: command.c:3936 +#: command.c:4150 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "неможливо відкрити тимчаÑовий файл \"%s\": %m" -#: command.c:4272 +#: command.c:4486 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: неоднозначна абревіатура \"%s\" відповідає обом \"%s\" Ñ– \"%s" -#: command.c:4292 +#: command.c:4506 #, c-format msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" msgstr "\\pset: дозволені формати: aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -#: command.c:4311 +#: command.c:4525 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: дозволені Ñтилі ліній: ascii, old-ascii, unicode" -#: command.c:4326 +#: command.c:4540 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: дозволені Ñтилі ліній рамок Unicode: single, double" -#: command.c:4341 +#: command.c:4555 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: дозволені Ñтилі ліній Ñтовпців Ð´Ð»Ñ Unicode: single, double" -#: command.c:4356 +#: command.c:4570 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: дозволені Ñтилі ліній заголовків Ð´Ð»Ñ Unicode: single, double" -#: command.c:4399 +#: command.c:4622 +#, c-format +msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width" +msgstr "\\pset: дозволені Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ xheader_width Ñ” \"%s\" (за замовчуваннÑм), \"%s\", \"%s\" або чиÑло, Ñке визначає точну ширину" + +#: command.c:4639 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep повинен бути однобайтовим Ñимволом" -#: command.c:4404 +#: command.c:4644 #, c-format msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" msgstr "\\pset: csv_fieldsep не може бути подвійною лапкою, новим Ñ€Ñдком або поверненнÑм каретки" -#: command.c:4541 command.c:4729 +#: command.c:4782 command.c:4983 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: невідомий параметр: %s" -#: command.c:4561 +#: command.c:4802 #, c-format msgid "Border style is %d.\n" msgstr "Стиль рамки %d.\n" -#: command.c:4567 +#: command.c:4808 #, c-format msgid "Target width is unset.\n" msgstr "Цільова ширина не вÑтановлена.\n" -#: command.c:4569 +#: command.c:4810 #, c-format msgid "Target width is %d.\n" msgstr "Цільова ширина %d.\n" -#: command.c:4576 +#: command.c:4817 #, c-format msgid "Expanded display is on.\n" msgstr "Розширене Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ ÑƒÐ²Ñ–Ð¼ÐºÐ½ÑƒÑ‚Ð¾.\n" -#: command.c:4578 +#: command.c:4819 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Розширене Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтовуєтьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾.\n" -#: command.c:4580 +#: command.c:4821 #, c-format msgid "Expanded display is off.\n" msgstr "Розширене Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð¼ÐºÐ½ÑƒÑ‚Ð¾.\n" -#: command.c:4586 +#: command.c:4828 command.c:4830 command.c:4832 +#, c-format +msgid "Expanded header width is \"%s\".\n" +msgstr "Розширена ширина заголовка \"%s\".\n" + +#: command.c:4834 +#, c-format +msgid "Expanded header width is %d.\n" +msgstr "Розширена ширина заголовка %d.\n" + +#: command.c:4840 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Розділювач полів CSV: \"%s\".\n" -#: command.c:4594 command.c:4602 +#: command.c:4848 command.c:4856 #, c-format msgid "Field separator is zero byte.\n" msgstr "Розділювач полів - нульовий байт.\n" -#: command.c:4596 +#: command.c:4850 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Розділювач полів \"%s\".\n" -#: command.c:4609 +#: command.c:4863 #, c-format msgid "Default footer is on.\n" msgstr "Ðинжній колонтитул увімкнуто за замовчуваннÑм.\n" -#: command.c:4611 +#: command.c:4865 #, c-format msgid "Default footer is off.\n" msgstr "Ðинжній колонтитул вимкнуто за замовчуваннÑм.\n" -#: command.c:4617 +#: command.c:4871 #, c-format msgid "Output format is %s.\n" msgstr "Формат виводу %s.\n" -#: command.c:4623 +#: command.c:4877 #, c-format msgid "Line style is %s.\n" msgstr "Стиль лінії %s.\n" -#: command.c:4630 +#: command.c:4884 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null відображаєтьÑÑ Ñк \"%s\".\n" -#: command.c:4638 +#: command.c:4892 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Локалізоване Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‡Ð¸Ñел ввімкнено.\n" -#: command.c:4640 +#: command.c:4894 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Локалізоване Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‡Ð¸Ñел вимкнено.\n" -#: command.c:4647 +#: command.c:4901 #, c-format msgid "Pager is used for long output.\n" msgstr "Пейджер викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð´Ð¾Ð²Ð³Ð¾Ð³Ð¾ текÑту.\n" -#: command.c:4649 +#: command.c:4903 #, c-format msgid "Pager is always used.\n" msgstr "Завжди викориÑтовуєтьÑÑ Ð¿ÐµÐ¹Ð´Ð¶ÐµÑ€.\n" -#: command.c:4651 +#: command.c:4905 #, c-format msgid "Pager usage is off.\n" msgstr "Пейджер не викориÑтовуєтьÑÑ.\n" -#: command.c:4657 +#: command.c:4911 #, c-format msgid "Pager won't be used for less than %d line.\n" msgid_plural "Pager won't be used for less than %d lines.\n" @@ -648,250 +722,244 @@ msgstr[1] "Пейджер не буде викориÑтовуватиÑÑ Ð´Ð» msgstr[2] "Пейджер не буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð¼ÐµÐ½Ñˆ ніж %d Ñ€Ñдків.\n" msgstr[3] "Пейджер не буде викориÑтовуватиÑÑ Ð´Ð»Ñ Ð¼ÐµÐ½Ñˆ ніж %d Ñ€Ñдка.\n" -#: command.c:4667 command.c:4677 +#: command.c:4921 command.c:4931 #, c-format msgid "Record separator is zero byte.\n" msgstr "Розділювач запиÑів - нульовий байт.\n" -#: command.c:4669 +#: command.c:4923 #, c-format msgid "Record separator is .\n" msgstr "Розділювач запиÑів: .\n" -#: command.c:4671 +#: command.c:4925 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Розділювач запиÑів: \"%s\".\n" -#: command.c:4684 +#: command.c:4938 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Табличні атрибути \"%s\".\n" -#: command.c:4687 +#: command.c:4941 #, c-format msgid "Table attributes unset.\n" msgstr "Ðтрибути таблиць не задані.\n" -#: command.c:4694 +#: command.c:4948 #, c-format msgid "Title is \"%s\".\n" msgstr "Заголовок: \"%s\".\n" -#: command.c:4696 +#: command.c:4950 #, c-format msgid "Title is unset.\n" msgstr "Заголовок не вÑтановлено.\n" -#: command.c:4703 +#: command.c:4957 #, c-format msgid "Tuples only is on.\n" msgstr "Увімкнуто тільки кортежі.\n" -#: command.c:4705 +#: command.c:4959 #, c-format msgid "Tuples only is off.\n" msgstr "Вимкнуто тільки кортежі.\n" -#: command.c:4711 +#: command.c:4965 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Стиль ліній рамки Ð´Ð»Ñ Unicode: \"%s\".\n" -#: command.c:4717 +#: command.c:4971 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Стиль ліній Ñтовпців Ð´Ð»Ñ Unicode: \"%s\".\n" -#: command.c:4723 +#: command.c:4977 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Стиль ліній заголовків Ð´Ð»Ñ Unicode: \"%s\".\n" -#: command.c:4956 +#: command.c:5226 #, c-format msgid "\\!: failed" msgstr "\\!: помилка" -#: command.c:4990 +#: command.c:5264 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch не може бути викориÑтано із пуÑтим запитом" -#: command.c:5022 +#: command.c:5296 #, c-format msgid "could not set timer: %m" msgstr "не вдалоÑÑ Ð²Ñтановити таймер: %m" -#: command.c:5084 +#: command.c:5365 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (кожні %g Ñек)\n" -#: command.c:5087 +#: command.c:5368 #, c-format msgid "%s (every %gs)\n" msgstr "%s (кожні %g Ñек)\n" -#: command.c:5148 +#: command.c:5432 #, c-format msgid "could not wait for signals: %m" msgstr "не вдалоÑÑ Ð´Ð¾Ñ‡ÐµÐºÐ°Ñ‚Ð¸ÑÑ Ñигналів: %m" -#: command.c:5206 command.c:5213 common.c:568 common.c:575 common.c:1118 +#: command.c:5488 command.c:5495 common.c:632 common.c:639 common.c:1123 #, c-format -msgid "" -"********* QUERY **********\n" +msgid "/******** QUERY *********/\n" "%s\n" -"**************************\n" -"\n" -msgstr "" -"********* ЗÐПИТ **********\n" +"/************************/\n\n" +msgstr "/******** ЗÐПИТ *********/\n" "%s\n" -"**************************\n" -"\n" +"/************************/\n\n" -#: command.c:5392 +#: command.c:5674 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" не Ñ” поданнÑм" -#: command.c:5408 +#: command.c:5690 #, c-format msgid "could not parse reloptions array" msgstr "неможливо розібрати маÑив reloptions" -#: common.c:162 +#: common.c:206 #, c-format msgid "cannot escape without active connection" msgstr "не можна вийти без активного з'єднаннÑ" -#: common.c:203 +#: common.c:247 #, c-format msgid "shell command argument contains a newline or carriage return: \"%s\"" msgstr "аргумент командної оболонки міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"" -#: common.c:307 +#: common.c:351 #, c-format msgid "connection to server was lost" msgstr "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· Ñервером втрачено" -#: common.c:311 +#: common.c:355 #, c-format msgid "The connection to the server was lost. Attempting reset: " msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· Ñервером втрачено. Спроба перевÑтановити:" -#: common.c:316 +#: common.c:360 #, c-format msgid "Failed.\n" msgstr "Помилка.\n" -#: common.c:333 +#: common.c:377 #, c-format msgid "Succeeded.\n" msgstr "Вдало.\n" -#: common.c:385 common.c:1054 +#: common.c:430 common.c:1061 #, c-format msgid "unexpected PQresultStatus: %d" msgstr "неочікуваний PQresultStatus: %d" -#: common.c:507 +#: common.c:571 #, c-format msgid "Time: %.3f ms\n" msgstr "ЧаÑ: %.3f мÑ\n" -#: common.c:522 +#: common.c:586 #, c-format msgid "Time: %.3f ms (%02d:%06.3f)\n" msgstr "ЧаÑ: %.3f Ð¼Ñ (%02d:%06.3f)\n" -#: common.c:531 +#: common.c:595 #, c-format msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" msgstr "ЧаÑ: %.3f Ð¼Ñ (%02d:%02d:%06.3f)\n" -#: common.c:538 +#: common.c:602 #, c-format msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "ЧаÑ: %.3f Ð¼Ñ (%.0f d %02d:%02d:%06.3f)\n" -#: common.c:562 common.c:619 common.c:1089 describe.c:6135 +#: common.c:626 common.c:683 common.c:1094 describe.c:6192 #, c-format msgid "You are currently not connected to a database." msgstr "Ðа даний момент ви від'єднанні від бази даних." -#: common.c:650 +#: common.c:714 #, c-format msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" msgstr "ÐÑинхронне ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ \"%s\" з навантаженнÑм \"%s\" отримане від Ñерверного процеÑу з PID %d.\n" -#: common.c:653 +#: common.c:717 #, c-format msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" msgstr "ÐÑинхронне ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ \"%s\" отримане від Ñерверного процеÑу з PID %d.\n" -#: common.c:686 common.c:705 +#: common.c:748 #, c-format msgid "could not print result table: %m" msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ€ÑƒÐºÑƒÐ²Ð°Ñ‚Ð¸ таблицю результатів: %m" -#: common.c:726 +#: common.c:768 #, c-format msgid "no rows returned for \\gset" msgstr "немає Ñ€Ñдків повернутих Ð´Ð»Ñ \\gset" -#: common.c:731 +#: common.c:773 #, c-format msgid "more than one row returned for \\gset" msgstr "більш, ніж один Ñ€Ñдок повернуто Ð´Ð»Ñ \\gset" -#: common.c:749 +#: common.c:791 #, c-format msgid "attempt to \\gset into specially treated variable \"%s\" ignored" msgstr "Ñпробу виконати \\gset в Ñпеціальну змінну \"%s\" проігноровано" -#: common.c:1098 +#: common.c:1103 #, c-format -msgid "" -"***(Single step mode: verify command)*******************************************\n" +msgid "/**(Single step mode: verify command)******************************************/\n" "%s\n" -"***(press return to proceed or enter x and return to cancel)********************\n" -msgstr "" -"***(Покроковий режим: перевірка команди)*******************************************\n" +"/**(press return to proceed or enter x and return to cancel)*******************/\n" +msgstr "/**(Однокроковий режим: команда verify)******************************************/\n" "%s\n" -"***(Enter - виповнити; Ñ… Ñ– Enter - відмінити)********************\n" +"/**(натиÑніть клавішу Return, щоб продовжити, або введіть x Ñ– Return, щоб ÑкаÑувати.)*******************/\n" -#: common.c:1181 +#: common.c:1180 #, c-format msgid "STATEMENT: %s" msgstr "ІÐСТРУКЦІЯ: %s" -#: common.c:1217 +#: common.c:1216 #, c-format msgid "unexpected transaction status (%d)" msgstr "неочікуваний Ñтан транзакції (%d)" -#: common.c:1358 describe.c:2020 +#: common.c:1362 describe.c:2025 msgid "Column" msgstr "Стовпець" -#: common.c:1359 describe.c:170 describe.c:358 describe.c:376 describe.c:1037 -#: describe.c:1193 describe.c:1725 describe.c:1749 describe.c:2021 -#: describe.c:3891 describe.c:4103 describe.c:4342 describe.c:4504 -#: describe.c:5767 +#: common.c:1363 describe.c:169 describe.c:355 describe.c:373 describe.c:1043 +#: describe.c:1201 describe.c:1731 describe.c:1755 describe.c:2026 +#: describe.c:3956 describe.c:4167 describe.c:4404 describe.c:4564 +#: describe.c:5829 msgid "Type" msgstr "Тип" -#: common.c:1408 +#: common.c:1412 #, c-format msgid "The command has no result, or the result has no columns.\n" msgstr "Команда не має результату або результат не має Ñтовпців.\n" -#: common.c:1561 +#: common.c:1504 #, c-format -msgid "\\watch cannot be used with COPY" -msgstr "\\watch не може бути викориÑтано з COPY" +msgid "fetching results in chunked mode failed" +msgstr "помилка Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ–Ð² у режимі чаÑтинами" #: copy.c:98 #, c-format @@ -908,51 +976,39 @@ msgstr "\\copy: помилка розбору аргументу Ð±Ñ–Ð»Ñ \"%s\" msgid "\\copy: parse error at end of line" msgstr "\\copy: помилка розбору в кінці Ñ€Ñдка" -#: copy.c:328 -#, c-format -msgid "could not execute command \"%s\": %m" -msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ команду \"%s\": %m" - -#: copy.c:344 +#: copy.c:342 #, c-format msgid "could not stat file \"%s\": %m" msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" -#: copy.c:348 +#: copy.c:346 #, c-format msgid "%s: cannot copy from/to a directory" msgstr "%s: не можна копіювати з/до каталогу" -#: copy.c:385 +#: copy.c:383 #, c-format msgid "could not close pipe to external command: %m" msgstr "не вдалоÑÑ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¸ канал за допомогою зовнішньої команди: %m" -#: copy.c:390 -#, c-format -msgid "%s: %s" -msgstr "%s: %s" - -#: copy.c:453 copy.c:463 +#: copy.c:451 copy.c:461 #, c-format msgid "could not write COPY data: %m" msgstr "неможливо запиÑати дані COPY: %m" -#: copy.c:469 +#: copy.c:467 #, c-format msgid "COPY data transfer failed: %s" msgstr "Помилка передачі даних COPY: %s" -#: copy.c:530 +#: copy.c:528 msgid "canceled by user" msgstr "ÑкаÑовано кориÑтувачем" -#: copy.c:541 -msgid "" -"Enter data to be copied followed by a newline.\n" +#: copy.c:539 +msgid "Enter data to be copied followed by a newline.\n" "End with a backslash and a period on a line by itself, or an EOF signal." -msgstr "" -"Введіть дані Ð´Ð»Ñ ÐºÐ¾Ð¿ÑŽÐ²Ð°Ð½Ð½Ñ, розділÑючи переноÑом Ñ€Ñдка.\n" +msgstr "Введіть дані Ð´Ð»Ñ ÐºÐ¾Ð¿ÑŽÐ²Ð°Ð½Ð½Ñ, розділÑючи переноÑом Ñ€Ñдка.\n" "Завершіть Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð·Ð° допомогою \"\\.\" або за допомогою Ñигналу EOF." #: copy.c:684 @@ -963,778 +1019,775 @@ msgstr "перервано через помилку читаннÑ" msgid "trying to exit copy mode" msgstr "Ñпроба вийти з режиму копіюваннÑ" -#: crosstabview.c:123 +#: crosstabview.c:124 #, c-format msgid "\\crosstabview: statement did not return a result set" msgstr "\\crosstabview: команда не повернула набір з результатами" -#: crosstabview.c:129 +#: crosstabview.c:130 #, c-format msgid "\\crosstabview: query must return at least three columns" msgstr "\\crosstabview: запит має повернути принаймні три Ñтовпці" -#: crosstabview.c:156 +#: crosstabview.c:157 #, c-format msgid "\\crosstabview: vertical and horizontal headers must be different columns" msgstr "\\crosstabview: вертикальні Ñ– горизонтальні заголовки повинні бути різними ÑтовпцÑми" -#: crosstabview.c:172 +#: crosstabview.c:173 #, c-format msgid "\\crosstabview: data column must be specified when query returns more than three columns" msgstr "\\crosstabview: необхідно вказати Ñтовпець даних, коли запит повертає більше трьох Ñтовпців" -#: crosstabview.c:228 +#: crosstabview.c:229 #, c-format msgid "\\crosstabview: maximum number of columns (%d) exceeded" msgstr "\\crosstabview: МакÑимальна кількіÑть Ñтовпців (%d) перевищена" -#: crosstabview.c:397 +#: crosstabview.c:398 #, c-format msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" msgstr "\\crosstabview: результат запиту міÑтить кілька значень даних Ð´Ð»Ñ Ñ€Ñдка «%s», ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Â«%s»" -#: crosstabview.c:645 +#: crosstabview.c:646 #, c-format msgid "\\crosstabview: column number %d is out of range 1..%d" msgstr "\\crosstabview: номер ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ %d поза межами 1..%d" -#: crosstabview.c:670 +#: crosstabview.c:671 #, c-format msgid "\\crosstabview: ambiguous column name: \"%s\"" msgstr "\\crosstabview: неоднозначна назва ÑтовпцÑ: \"%s\"" -#: crosstabview.c:678 +#: crosstabview.c:679 #, c-format msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: ім'Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð½Ðµ знайдено: \"%s\"" -#: describe.c:87 describe.c:338 describe.c:635 describe.c:812 describe.c:1029 -#: describe.c:1182 describe.c:1257 describe.c:3880 describe.c:4090 -#: describe.c:4340 describe.c:4422 describe.c:4657 describe.c:4866 -#: describe.c:5095 describe.c:5339 describe.c:5409 describe.c:5420 -#: describe.c:5477 describe.c:5881 describe.c:5959 +#: describe.c:87 describe.c:335 describe.c:626 describe.c:802 describe.c:1035 +#: describe.c:1190 describe.c:1264 describe.c:3945 describe.c:4154 +#: describe.c:4402 describe.c:4483 describe.c:4715 describe.c:4921 +#: describe.c:5165 describe.c:5406 describe.c:5475 describe.c:5486 +#: describe.c:5542 describe.c:5941 describe.c:6018 msgid "Schema" msgstr "Схема" -#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:636 -#: describe.c:813 describe.c:936 describe.c:1030 describe.c:1258 -#: describe.c:3881 describe.c:4091 describe.c:4256 describe.c:4341 -#: describe.c:4423 describe.c:4586 describe.c:4658 describe.c:4867 -#: describe.c:4967 describe.c:5096 describe.c:5340 describe.c:5410 -#: describe.c:5421 describe.c:5478 describe.c:5677 describe.c:5748 -#: describe.c:5957 describe.c:6186 describe.c:6494 +#: describe.c:88 describe.c:166 describe.c:227 describe.c:336 describe.c:627 +#: describe.c:803 describe.c:924 describe.c:1036 describe.c:1265 +#: describe.c:3946 describe.c:4155 describe.c:4319 describe.c:4403 +#: describe.c:4484 describe.c:4645 describe.c:4716 describe.c:4922 +#: describe.c:5038 describe.c:5166 describe.c:5407 describe.c:5476 +#: describe.c:5487 describe.c:5543 describe.c:5740 describe.c:5810 +#: describe.c:6016 describe.c:6243 describe.c:6551 msgid "Name" msgstr "Ðазва" -#: describe.c:89 describe.c:351 describe.c:369 +#: describe.c:89 describe.c:348 describe.c:366 msgid "Result data type" msgstr "Тип даних результату" -#: describe.c:90 describe.c:352 describe.c:370 +#: describe.c:90 describe.c:349 describe.c:367 msgid "Argument data types" msgstr "Типи даних аргументів" -#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:423 -#: describe.c:667 describe.c:828 describe.c:965 describe.c:1260 describe.c:2041 -#: describe.c:3676 describe.c:3935 describe.c:4137 describe.c:4280 -#: describe.c:4354 describe.c:4432 describe.c:4599 describe.c:4777 -#: describe.c:4903 describe.c:4976 describe.c:5097 describe.c:5248 -#: describe.c:5290 describe.c:5356 describe.c:5413 describe.c:5422 -#: describe.c:5479 describe.c:5695 describe.c:5770 describe.c:5895 -#: describe.c:5960 describe.c:6992 +#: describe.c:98 describe.c:105 describe.c:177 describe.c:241 describe.c:415 +#: describe.c:658 describe.c:818 describe.c:972 describe.c:1267 describe.c:2046 +#: describe.c:3676 describe.c:4000 describe.c:4201 describe.c:4343 +#: describe.c:4416 describe.c:4493 describe.c:4658 describe.c:4834 +#: describe.c:4975 describe.c:5047 describe.c:5167 describe.c:5317 +#: describe.c:5358 describe.c:5423 describe.c:5479 describe.c:5488 +#: describe.c:5544 describe.c:5758 describe.c:5832 describe.c:5955 +#: describe.c:6019 describe.c:7078 msgid "Description" msgstr "ОпиÑ" -#: describe.c:128 +#: describe.c:127 msgid "List of aggregate functions" msgstr "Перелік агрегатних функцій" -#: describe.c:153 +#: describe.c:152 #, c-format msgid "The server (version %s) does not support access methods." msgstr "Сервер (верÑÑ–Ñ %s) не підтримує методи доÑтупу." -#: describe.c:168 +#: describe.c:167 msgid "Index" msgstr "ІндекÑ" -#: describe.c:169 describe.c:3899 describe.c:4116 describe.c:5882 +#: describe.c:168 describe.c:3964 describe.c:4180 describe.c:5942 msgid "Table" msgstr "ТаблицÑ" -#: describe.c:177 describe.c:5679 +#: describe.c:176 describe.c:5742 msgid "Handler" msgstr "Обробник" -#: describe.c:201 +#: describe.c:199 msgid "List of access methods" msgstr "СпиÑок методів доÑтупу" -#: describe.c:230 describe.c:404 describe.c:660 describe.c:937 describe.c:1181 -#: describe.c:3892 describe.c:4092 describe.c:4257 describe.c:4588 -#: describe.c:4968 describe.c:5678 describe.c:5749 describe.c:6187 -#: describe.c:6375 describe.c:6495 describe.c:6632 describe.c:6718 -#: describe.c:6980 +#: describe.c:228 describe.c:401 describe.c:651 describe.c:925 describe.c:1189 +#: describe.c:3957 describe.c:4156 describe.c:4320 describe.c:4647 +#: describe.c:5039 describe.c:5741 describe.c:5811 describe.c:6244 +#: describe.c:6431 describe.c:6552 describe.c:6722 describe.c:6807 +#: describe.c:7066 msgid "Owner" msgstr "ВлаÑник" -#: describe.c:231 +#: describe.c:229 msgid "Location" msgstr "РозташуваннÑ" -#: describe.c:241 describe.c:3509 +#: describe.c:239 describe.c:3517 describe.c:3857 msgid "Options" msgstr "Параметри" -#: describe.c:242 describe.c:658 describe.c:963 describe.c:3934 +#: describe.c:240 describe.c:649 describe.c:970 describe.c:3999 msgid "Size" msgstr "Розмір" -#: describe.c:266 +#: describe.c:263 msgid "List of tablespaces" msgstr "СпиÑок табличних проÑторів" -#: describe.c:311 +#: describe.c:308 #, c-format msgid "\\df only takes [anptwS+] as options" msgstr "\\df приймає в ÑкоÑті параметрів тільки [anptwS+]" -#: describe.c:319 +#: describe.c:316 #, c-format msgid "\\df does not take a \"%c\" option with server version %s" msgstr "\\df не приймає параметр \"%c\" із Ñервером верÑÑ–Ñ— %s" #. translator: "agg" is short for "aggregate" -#: describe.c:354 describe.c:372 +#: describe.c:351 describe.c:369 msgid "agg" msgstr "агр." -#: describe.c:355 describe.c:373 +#: describe.c:352 describe.c:370 msgid "window" msgstr "вікно" -#: describe.c:356 +#: describe.c:353 msgid "proc" msgstr "проц" -#: describe.c:357 describe.c:375 +#: describe.c:354 describe.c:372 msgid "func" msgstr "функ" -#: describe.c:374 describe.c:1390 +#: describe.c:371 describe.c:1397 msgid "trigger" msgstr "тригер" -#: describe.c:386 +#: describe.c:383 msgid "immutable" msgstr "поÑтійна" -#: describe.c:387 +#: describe.c:384 msgid "stable" msgstr "Ñтабільна" -#: describe.c:388 +#: describe.c:385 msgid "volatile" msgstr "мінлива" -#: describe.c:389 +#: describe.c:386 msgid "Volatility" msgstr "МінливіÑть" -#: describe.c:397 +#: describe.c:394 msgid "restricted" msgstr "обмежений" -#: describe.c:398 +#: describe.c:395 msgid "safe" msgstr "безпечний" -#: describe.c:399 +#: describe.c:396 msgid "unsafe" msgstr "небезпечний" -#: describe.c:400 +#: describe.c:397 msgid "Parallel" msgstr "ПаралельніÑть" -#: describe.c:405 +#: describe.c:402 msgid "definer" msgstr "визначник" -#: describe.c:406 +#: describe.c:403 msgid "invoker" msgstr "викликач" -#: describe.c:407 +#: describe.c:404 msgid "Security" msgstr "Безпека" -#: describe.c:412 +#: describe.c:409 msgid "Language" msgstr "Мова" -#: describe.c:416 describe.c:420 -msgid "Source code" -msgstr "Вихідний код" +#: describe.c:412 describe.c:648 +msgid "Internal name" +msgstr "Внутрішнє назва" -#: describe.c:594 +#: describe.c:585 msgid "List of functions" msgstr "СпиÑок функцій" -#: describe.c:657 -msgid "Internal name" -msgstr "Внутрішнє назва" - -#: describe.c:659 +#: describe.c:650 msgid "Elements" msgstr "Елементи" -#: describe.c:711 +#: describe.c:701 msgid "List of data types" msgstr "СпиÑок типів даних" -#: describe.c:814 +#: describe.c:804 msgid "Left arg type" msgstr "Тип лівого аргумента" -#: describe.c:815 +#: describe.c:805 msgid "Right arg type" msgstr "Тип правого аргумента" -#: describe.c:816 +#: describe.c:806 msgid "Result type" msgstr "Результуючий тип" -#: describe.c:821 describe.c:4594 describe.c:4760 describe.c:5247 -#: describe.c:6909 describe.c:6913 +#: describe.c:811 describe.c:4653 describe.c:4817 describe.c:5316 +#: describe.c:6996 describe.c:7000 msgid "Function" msgstr "ФункціÑ" -#: describe.c:902 +#: describe.c:891 msgid "List of operators" msgstr "СпиÑок операторів" -#: describe.c:938 +#: describe.c:926 msgid "Encoding" msgstr "КодуваннÑ" -#: describe.c:939 describe.c:4868 +#: describe.c:930 describe.c:934 +msgid "Locale Provider" +msgstr "ПоÑтачальник локалі" + +#: describe.c:938 describe.c:4936 msgid "Collate" msgstr "ПорÑдок ÑортуваннÑ" -#: describe.c:940 describe.c:4869 +#: describe.c:939 describe.c:4937 msgid "Ctype" msgstr "Ctype" -#: describe.c:945 describe.c:951 describe.c:4874 describe.c:4878 -msgid "ICU Locale" -msgstr "Ð›Ð¾ÐºÐ°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ ICU" +#: describe.c:943 describe.c:947 describe.c:951 describe.c:4942 describe.c:4946 +#: describe.c:4950 +msgid "Locale" +msgstr "Локаль" -#: describe.c:946 describe.c:952 -msgid "Locale Provider" -msgstr "ПоÑтачальник локалі" +#: describe.c:955 describe.c:959 describe.c:4955 describe.c:4959 +msgid "ICU Rules" +msgstr "Правила ICU" -#: describe.c:964 +#: describe.c:971 msgid "Tablespace" msgstr "Табличний проÑтір" -#: describe.c:990 +#: describe.c:996 msgid "List of databases" msgstr "СпиÑок баз даних" -#: describe.c:1031 describe.c:1184 describe.c:3882 +#: describe.c:1037 describe.c:1192 describe.c:3947 msgid "table" msgstr "таблицÑ" -#: describe.c:1032 describe.c:3883 +#: describe.c:1038 describe.c:3948 msgid "view" msgstr "поданнÑ" -#: describe.c:1033 describe.c:3884 +#: describe.c:1039 describe.c:3949 msgid "materialized view" msgstr "матеріалізоване поданнÑ" -#: describe.c:1034 describe.c:1186 describe.c:3886 +#: describe.c:1040 describe.c:1194 describe.c:3951 msgid "sequence" msgstr "поÑлідовніÑть" -#: describe.c:1035 describe.c:3888 +#: describe.c:1041 describe.c:3953 msgid "foreign table" msgstr "Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ" -#: describe.c:1036 describe.c:3889 describe.c:4101 +#: describe.c:1042 describe.c:3954 describe.c:4165 msgid "partitioned table" msgstr "Ñекційна таблицÑ" -#: describe.c:1047 +#: describe.c:1058 msgid "Column privileges" msgstr "Права Ð´Ð»Ñ Ñтовпців" -#: describe.c:1078 describe.c:1112 +#: describe.c:1089 describe.c:1123 msgid "Policies" msgstr "Політики" -#: describe.c:1143 describe.c:4510 describe.c:6577 +#: describe.c:1151 describe.c:4570 describe.c:6667 msgid "Access privileges" msgstr "Права доÑтупу" -#: describe.c:1188 +#: describe.c:1196 msgid "function" msgstr "функціÑ" -#: describe.c:1190 +#: describe.c:1198 msgid "type" msgstr "тип" -#: describe.c:1192 +#: describe.c:1200 msgid "schema" msgstr "Ñхема" -#: describe.c:1215 +#: describe.c:1222 msgid "Default access privileges" msgstr "Права доÑтупу за замовчуваннÑм" -#: describe.c:1259 +#: describe.c:1266 msgid "Object" msgstr "Об'єкт" -#: describe.c:1273 +#: describe.c:1280 msgid "table constraint" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–" -#: describe.c:1297 +#: describe.c:1304 msgid "domain constraint" msgstr "Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ" -#: describe.c:1321 +#: describe.c:1328 msgid "operator class" msgstr "ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð²" -#: describe.c:1345 +#: describe.c:1352 msgid "operator family" msgstr "ÑімейÑтво операторів" -#: describe.c:1368 +#: describe.c:1375 msgid "rule" msgstr "правило" -#: describe.c:1414 +#: describe.c:1420 msgid "Object descriptions" msgstr "ÐžÐ¿Ð¸Ñ Ð¾Ð±'єкту" -#: describe.c:1479 describe.c:4007 +#: describe.c:1485 describe.c:4072 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "Ðе знайдено жодного Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ назвою \"%s\"." -#: describe.c:1482 describe.c:4010 +#: describe.c:1488 describe.c:4075 #, c-format msgid "Did not find any relations." msgstr "Ðе знайдено жодного відношеннÑ." -#: describe.c:1678 +#: describe.c:1684 #, c-format msgid "Did not find any relation with OID %s." msgstr "Ðе знайдено жодного Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ Ð· OID %s." -#: describe.c:1726 describe.c:1750 +#: describe.c:1732 describe.c:1756 msgid "Start" msgstr "Початок" -#: describe.c:1727 describe.c:1751 +#: describe.c:1733 describe.c:1757 msgid "Minimum" msgstr "Мінімум" -#: describe.c:1728 describe.c:1752 +#: describe.c:1734 describe.c:1758 msgid "Maximum" msgstr "МакÑимум" -#: describe.c:1729 describe.c:1753 +#: describe.c:1735 describe.c:1759 msgid "Increment" msgstr "ПриріÑÑ‚" -#: describe.c:1730 describe.c:1754 describe.c:1884 describe.c:4426 -#: describe.c:4771 describe.c:4892 describe.c:4897 describe.c:6620 +#: describe.c:1736 describe.c:1760 describe.c:1889 describe.c:4487 +#: describe.c:4828 describe.c:4964 describe.c:4969 describe.c:6710 msgid "yes" msgstr "так" -#: describe.c:1731 describe.c:1755 describe.c:1885 describe.c:4426 -#: describe.c:4768 describe.c:4892 describe.c:6621 +#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4487 +#: describe.c:4825 describe.c:4964 describe.c:6711 msgid "no" msgstr "ні" -#: describe.c:1732 describe.c:1756 +#: describe.c:1738 describe.c:1762 msgid "Cycles?" msgstr "Цикли?" -#: describe.c:1733 describe.c:1757 +#: describe.c:1739 describe.c:1763 msgid "Cache" msgstr "Кеш" -#: describe.c:1798 +#: describe.c:1804 #, c-format msgid "Owned by: %s" msgstr "ВлаÑник: %s" -#: describe.c:1802 +#: describe.c:1808 #, c-format msgid "Sequence for identity column: %s" msgstr "ПоÑлідовніÑть Ð´Ð»Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ identity: %s" -#: describe.c:1810 +#: describe.c:1816 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "ПоÑлідовніÑть без Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s.%s\"" -#: describe.c:1813 +#: describe.c:1819 #, c-format msgid "Sequence \"%s.%s\"" msgstr "ПоÑлідовніÑть \"%s.%s\"" -#: describe.c:1957 +#: describe.c:1962 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ð±ÐµÐ· Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s.%s\"" -#: describe.c:1960 +#: describe.c:1965 #, c-format msgid "Table \"%s.%s\"" msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s.%s\"" -#: describe.c:1964 +#: describe.c:1969 #, c-format msgid "View \"%s.%s\"" msgstr "ÐŸÐ¾Ð´Ð°Ð½Ð½Ñ \"%s.%s\"" -#: describe.c:1969 +#: describe.c:1974 #, c-format msgid "Unlogged materialized view \"%s.%s\"" msgstr "Матеріалізоване Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð±ÐµÐ· Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s.%s\"" -#: describe.c:1972 +#: describe.c:1977 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "Матеріалізоване Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ \"%s.%s\"" -#: describe.c:1977 +#: describe.c:1982 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "Ð†Ð½Ð´ÐµÐºÑ Ð±ÐµÐ· Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s.%s\"" -#: describe.c:1980 +#: describe.c:1985 #, c-format msgid "Index \"%s.%s\"" msgstr "Ð†Ð½Ð´ÐµÐºÑ \"%s.%s\"" -#: describe.c:1985 +#: describe.c:1990 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "Секційний Ñ–Ð½Ð´ÐµÐºÑ Ð±ÐµÐ· Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s.%s\"" -#: describe.c:1988 +#: describe.c:1993 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "Секційний Ñ–Ð½Ð´ÐµÐºÑ \"%s.%s\"" -#: describe.c:1992 +#: describe.c:1997 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ TOAST \"%s.%s\"" -#: describe.c:1996 +#: describe.c:2001 #, c-format msgid "Composite type \"%s.%s\"" msgstr "Композитний тип \"%s.%s\"" -#: describe.c:2000 +#: describe.c:2005 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "Ð—Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s.%s\"" -#: describe.c:2005 +#: describe.c:2010 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "Секційна Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ð±ÐµÐ· Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ \"%s.%s\"" -#: describe.c:2008 +#: describe.c:2013 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "Секційна Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ \"%s.%s\"" -#: describe.c:2024 describe.c:4343 +#: describe.c:2029 describe.c:4405 msgid "Collation" msgstr "СортуваннÑ" -#: describe.c:2025 describe.c:4344 +#: describe.c:2030 describe.c:4406 msgid "Nullable" msgstr "ОбнулÑєтьÑÑ" -#: describe.c:2026 describe.c:4345 +#: describe.c:2031 describe.c:4407 msgid "Default" msgstr "За замовчуваннÑм" -#: describe.c:2029 +#: describe.c:2034 msgid "Key?" msgstr "Ключ?" -#: describe.c:2031 describe.c:4665 describe.c:4676 +#: describe.c:2036 describe.c:4723 describe.c:4734 msgid "Definition" msgstr "ВизначеннÑ" -#: describe.c:2033 describe.c:5694 describe.c:5769 describe.c:5835 -#: describe.c:5894 +#: describe.c:2038 describe.c:5757 describe.c:5831 describe.c:5896 +#: describe.c:5954 msgid "FDW options" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ FDW" -#: describe.c:2035 +#: describe.c:2040 msgid "Storage" msgstr "Сховище" -#: describe.c:2037 +#: describe.c:2042 msgid "Compression" msgstr "СтиÑканнÑ" -#: describe.c:2039 +#: describe.c:2044 msgid "Stats target" msgstr "СтатиÑтична ціль" -#: describe.c:2175 +#: describe.c:2180 #, c-format msgid "Partition of: %s %s%s" msgstr "Розділ: %s %s%s" -#: describe.c:2188 +#: describe.c:2193 msgid "No partition constraint" msgstr "ВідÑутнє розділове обмеженнÑ" -#: describe.c:2190 +#: describe.c:2195 #, c-format msgid "Partition constraint: %s" msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ñекції: %s" -#: describe.c:2214 +#: describe.c:2219 #, c-format msgid "Partition key: %s" msgstr "Ключ розділу: %s" -#: describe.c:2240 +#: describe.c:2245 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "ТаблицÑ, що володіє: \"%s.%s\"" -#: describe.c:2309 +#: describe.c:2314 msgid "primary key, " msgstr "первинний ключ," -#: describe.c:2312 +#: describe.c:2317 msgid "unique" msgstr "унікальний" -#: describe.c:2314 +#: describe.c:2319 msgid " nulls not distinct" msgstr " nulls не відрізнÑютьÑÑ" -#: describe.c:2315 +#: describe.c:2320 msgid ", " msgstr ", " -#: describe.c:2322 +#: describe.c:2327 #, c-format msgid "for table \"%s.%s\"" msgstr "Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ– \"%s.%s\"" -#: describe.c:2326 +#: describe.c:2331 #, c-format msgid ", predicate (%s)" msgstr ", предикат (%s)" -#: describe.c:2329 +#: describe.c:2334 msgid ", clustered" msgstr ", клаÑтеризовано" -#: describe.c:2332 +#: describe.c:2337 msgid ", invalid" msgstr ", недійÑний" -#: describe.c:2335 +#: describe.c:2340 msgid ", deferrable" msgstr ", відтермінований" -#: describe.c:2338 +#: describe.c:2343 msgid ", initially deferred" msgstr ", від початку відтермінований" -#: describe.c:2341 +#: describe.c:2346 msgid ", replica identity" msgstr ", ідентичніÑть репліки" -#: describe.c:2395 +#: describe.c:2400 msgid "Indexes:" msgstr "ІндекÑи:" -#: describe.c:2478 +#: describe.c:2483 msgid "Check constraints:" msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸:" -#: describe.c:2546 +#: describe.c:2551 msgid "Foreign-key constraints:" msgstr "ÐžÐ±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ ключа:" -#: describe.c:2609 +#: describe.c:2614 msgid "Referenced by:" msgstr "ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð·Ð¾Ð²Ð½Ñ–:" -#: describe.c:2659 +#: describe.c:2664 msgid "Policies:" msgstr "Політики:" -#: describe.c:2662 +#: describe.c:2667 msgid "Policies (forced row security enabled):" msgstr "Політики (поÑилений захиÑÑ‚ Ñ€Ñдків активовано):" -#: describe.c:2665 +#: describe.c:2670 msgid "Policies (row security enabled): (none)" msgstr "Політики (захиÑÑ‚ Ñ€Ñдків ввімкнуто): (ні)" -#: describe.c:2668 +#: describe.c:2673 msgid "Policies (forced row security enabled): (none)" msgstr "Політики (поÑилений захиÑÑ‚ Ñ€Ñдків ввімкнуто): (ні)" -#: describe.c:2671 +#: describe.c:2676 msgid "Policies (row security disabled):" msgstr "Політики (захиÑÑ‚ Ñ€Ñдків вимкнуто):" -#: describe.c:2731 describe.c:2835 +#: describe.c:2736 describe.c:2841 msgid "Statistics objects:" msgstr "Об'єкти ÑтатиÑтики:" -#: describe.c:2937 describe.c:3090 +#: describe.c:2943 describe.c:3096 msgid "Rules:" msgstr "Правила:" -#: describe.c:2940 +#: describe.c:2946 msgid "Disabled rules:" msgstr "Вимкнені правила:" -#: describe.c:2943 +#: describe.c:2949 msgid "Rules firing always:" msgstr "Правила, що завжди працюють:" -#: describe.c:2946 +#: describe.c:2952 msgid "Rules firing on replica only:" msgstr "Правила, що працюють тільки на репліці:" -#: describe.c:3025 describe.c:5030 +#: describe.c:3031 describe.c:5100 msgid "Publications:" msgstr "Публікації:" -#: describe.c:3073 +#: describe.c:3079 msgid "View definition:" msgstr "Ð’Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ:" -#: describe.c:3236 +#: describe.c:3242 msgid "Triggers:" msgstr "Тригери:" -#: describe.c:3239 +#: describe.c:3245 msgid "Disabled user triggers:" msgstr "Вимкнені кориÑтувацькі тригери:" -#: describe.c:3242 +#: describe.c:3248 msgid "Disabled internal triggers:" msgstr "Вимкнені внутрішні тригери:" -#: describe.c:3245 +#: describe.c:3251 msgid "Triggers firing always:" msgstr "Тригери, що завжди працюють:" -#: describe.c:3248 +#: describe.c:3254 msgid "Triggers firing on replica only:" msgstr "Тригери, що працюють тільки на репліці:" -#: describe.c:3319 +#: describe.c:3325 #, c-format msgid "Server: %s" msgstr "Сервер: %s" -#: describe.c:3327 +#: describe.c:3333 #, c-format msgid "FDW options: (%s)" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ FDW: (%s)" -#: describe.c:3348 +#: describe.c:3354 msgid "Inherits" msgstr "УÑпадковує" -#: describe.c:3413 +#: describe.c:3419 #, c-format msgid "Number of partitions: %d" msgstr "ЧиÑло Ñекцій: %d" -#: describe.c:3422 +#: describe.c:3428 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "КількіÑть розділів: %d (\\d+ Ð´Ð»Ñ ÑпиÑку)" -#: describe.c:3424 +#: describe.c:3430 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "КількіÑть дочірніх таблиць: %d (\\d+ Ð´Ð»Ñ ÑпиÑку)" -#: describe.c:3431 +#: describe.c:3437 msgid "Child tables" msgstr "Дочірні таблиці" -#: describe.c:3431 +#: describe.c:3437 msgid "Partitions" msgstr "Розділи" -#: describe.c:3462 +#: describe.c:3470 #, c-format msgid "Typed table of type: %s" msgstr "Типізована Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ñ‚Ð¸Ð¿Ñƒ: %s" -#: describe.c:3478 +#: describe.c:3486 msgid "Replica Identity" msgstr "ІдентичніÑть репліки" -#: describe.c:3491 +#: describe.c:3499 msgid "Has OIDs: yes" msgstr "Має OIDs: так" -#: describe.c:3500 +#: describe.c:3508 #, c-format msgid "Access method: %s" msgstr "Метод доÑтупу: %s" -#: describe.c:3579 +#: describe.c:3585 #, c-format msgid "Tablespace: \"%s\"" msgstr "Табличний проÑтір: \"%s\"" #. translator: before this string there's an index description like #. '"foo_pkey" PRIMARY KEY, btree (a)' -#: describe.c:3591 +#: describe.c:3597 #, c-format msgid ", tablespace \"%s\"" msgstr ", табличний проÑтір \"%s\"" -#: describe.c:3668 +#: describe.c:3670 msgid "List of roles" msgstr "СпиÑок ролей" -#: describe.c:3670 +#: describe.c:3672 describe.c:3840 msgid "Role name" msgstr "Ім'Ñ Ñ€Ð¾Ð»Ñ–" -#: describe.c:3671 +#: describe.c:3673 msgid "Attributes" msgstr "Ðтрибути" -#: describe.c:3673 -msgid "Member of" -msgstr "Член" - #: describe.c:3684 msgid "Superuser" msgstr "СуперкориÑтувач" @@ -1780,2078 +1833,1930 @@ msgstr[3] "%d підключеннÑ" msgid "Password valid until " msgstr "Пароль дійнÑий до" -#: describe.c:3777 +#: describe.c:3775 msgid "Role" msgstr "Роль" -#: describe.c:3778 +#: describe.c:3776 msgid "Database" msgstr "База даних" -#: describe.c:3779 +#: describe.c:3777 msgid "Settings" msgstr "Параметри" -#: describe.c:3803 +#: describe.c:3801 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "Ðе знайдено жодного параметра Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ– \"%s\" Ñ– бази даних \"%s\"." -#: describe.c:3806 +#: describe.c:3804 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "Ðе знайдено жодного параметру Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ– \"%s\"." -#: describe.c:3809 +#: describe.c:3807 #, c-format msgid "Did not find any settings." msgstr "Ðе знайдено жодного параметру." -#: describe.c:3814 +#: describe.c:3811 msgid "List of settings" msgstr "СпиÑок параметрів" -#: describe.c:3885 +#: describe.c:3841 +msgid "Member of" +msgstr "Член" + +#: describe.c:3858 +msgid "Grantor" +msgstr "Ðадавач" + +#: describe.c:3884 +msgid "List of role grants" +msgstr "Перелік наданих ролей" + +#: describe.c:3950 msgid "index" msgstr "індекÑ" -#: describe.c:3887 +#: describe.c:3952 msgid "TOAST table" msgstr "Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ TOAST" -#: describe.c:3890 describe.c:4102 +#: describe.c:3955 describe.c:4166 msgid "partitioned index" msgstr "Ñекційний індекÑ" -#: describe.c:3910 +#: describe.c:3975 msgid "permanent" msgstr "поÑтійна" -#: describe.c:3911 +#: describe.c:3976 msgid "temporary" msgstr "тимчаÑова" -#: describe.c:3912 +#: describe.c:3977 msgid "unlogged" msgstr "нежурнальована" -#: describe.c:3913 +#: describe.c:3978 msgid "Persistence" msgstr "СтійкіÑть" -#: describe.c:3929 +#: describe.c:3994 msgid "Access method" msgstr "Метод доÑтупу" -#: describe.c:4015 +#: describe.c:4079 msgid "List of relations" msgstr "СпиÑок відношень" -#: describe.c:4063 +#: describe.c:4127 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "Сервер (верÑÑ–Ñ %s) не підтримує декларативне ÑÐµÐºÑ†Ñ–Ð¾Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ." -#: describe.c:4074 +#: describe.c:4138 msgid "List of partitioned indexes" msgstr "СпиÑок Ñекційних індекÑів" -#: describe.c:4076 +#: describe.c:4140 msgid "List of partitioned tables" msgstr "СпиÑок Ñекційних таблиць" -#: describe.c:4080 +#: describe.c:4144 msgid "List of partitioned relations" msgstr "СпиÑок Ñекційних відношень" -#: describe.c:4111 +#: describe.c:4175 msgid "Parent name" msgstr "БатьківÑька назва" -#: describe.c:4124 +#: describe.c:4188 msgid "Leaf partition size" msgstr "Розмір дочірньої Ñекції" -#: describe.c:4127 describe.c:4133 +#: describe.c:4191 describe.c:4197 msgid "Total size" msgstr "Загальний розмір" -#: describe.c:4258 +#: describe.c:4321 msgid "Trusted" msgstr "Ðадійний" -#: describe.c:4267 +#: describe.c:4330 msgid "Internal language" msgstr "Ð’Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¼Ð¾Ð²Ð°" -#: describe.c:4268 +#: describe.c:4331 msgid "Call handler" msgstr "Обробник виклику" -#: describe.c:4269 describe.c:5680 +#: describe.c:4332 describe.c:5743 msgid "Validator" msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸" -#: describe.c:4270 +#: describe.c:4333 msgid "Inline handler" msgstr "Оброблювач впровадженого коду" -#: describe.c:4305 +#: describe.c:4367 msgid "List of languages" msgstr "СпиÑок мов" -#: describe.c:4346 +#: describe.c:4408 msgid "Check" msgstr "Перевірка" -#: describe.c:4390 +#: describe.c:4451 msgid "List of domains" msgstr "СпиÑок доменів" -#: describe.c:4424 +#: describe.c:4485 msgid "Source" msgstr "Джерело" -#: describe.c:4425 +#: describe.c:4486 msgid "Destination" msgstr "ПризначеннÑ" -#: describe.c:4427 describe.c:6622 +#: describe.c:4488 describe.c:6712 msgid "Default?" msgstr "За замовчуваннÑм?" -#: describe.c:4469 +#: describe.c:4529 msgid "List of conversions" msgstr "СпиÑок перетворень" -#: describe.c:4497 +#: describe.c:4557 msgid "Parameter" msgstr "Параметр" -#: describe.c:4498 +#: describe.c:4558 msgid "Value" msgstr "ЗначеннÑ" -#: describe.c:4505 +#: describe.c:4565 msgid "Context" msgstr "КонтекÑÑ‚" -#: describe.c:4538 +#: describe.c:4597 msgid "List of configuration parameters" msgstr "СпиÑок параметрів конфігурації" -#: describe.c:4540 +#: describe.c:4599 msgid "List of non-default configuration parameters" msgstr "СпиÑок параметрів конфігурації не за замовчуваннÑм" -#: describe.c:4567 +#: describe.c:4626 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "Сервер (верÑÑ–Ñ %s) не підтримує тригери подій." -#: describe.c:4587 +#: describe.c:4646 msgid "Event" msgstr "ПодіÑ" -#: describe.c:4589 +#: describe.c:4648 msgid "enabled" msgstr "увімкнено" -#: describe.c:4590 +#: describe.c:4649 msgid "replica" msgstr "репліка" -#: describe.c:4591 +#: describe.c:4650 msgid "always" msgstr "завжди" -#: describe.c:4592 +#: describe.c:4651 msgid "disabled" msgstr "вимкнено" -#: describe.c:4593 describe.c:6496 +#: describe.c:4652 describe.c:6553 msgid "Enabled" msgstr "Увімкнено" -#: describe.c:4595 +#: describe.c:4654 msgid "Tags" msgstr "Теги" -#: describe.c:4619 +#: describe.c:4677 msgid "List of event triggers" msgstr "СпиÑок тригерів подій" -#: describe.c:4646 +#: describe.c:4704 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "Сервер (верÑÑ–Ñ %s) не підтримує розширену ÑтатиÑтику." -#: describe.c:4683 +#: describe.c:4741 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4684 +#: describe.c:4742 msgid "Dependencies" msgstr "ЗалежноÑті" -#: describe.c:4694 +#: describe.c:4752 msgid "MCV" msgstr "MCV" -#: describe.c:4718 +#: describe.c:4775 msgid "List of extended statistics" msgstr "СпиÑок розширеної ÑтатиÑтики" -#: describe.c:4745 +#: describe.c:4802 msgid "Source type" msgstr "Початковий тип" -#: describe.c:4746 +#: describe.c:4803 msgid "Target type" msgstr "Тип цілі" -#: describe.c:4770 +#: describe.c:4827 msgid "in assignment" msgstr "у призначенні" -#: describe.c:4772 +#: describe.c:4829 msgid "Implicit?" msgstr "Приховане?" -#: describe.c:4831 +#: describe.c:4887 msgid "List of casts" msgstr "СпиÑок Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð²" -#: describe.c:4883 describe.c:4887 +#: describe.c:4927 describe.c:4931 msgid "Provider" msgstr "ПоÑтачальник" -#: describe.c:4893 describe.c:4898 +#: describe.c:4965 describe.c:4970 msgid "Deterministic?" msgstr "Детермінований?" -#: describe.c:4938 +#: describe.c:5009 msgid "List of collations" msgstr "СпиÑок правил ÑортуваннÑ" -#: describe.c:5000 +#: describe.c:5070 msgid "List of schemas" msgstr "СпиÑок Ñхем" -#: describe.c:5117 +#: describe.c:5186 msgid "List of text search parsers" msgstr "СпиÑок парÑерів текÑтового пошуку" -#: describe.c:5167 +#: describe.c:5236 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "Ðе знайдено жодного парÑера текÑтового пошуку \"%s\"." -#: describe.c:5170 +#: describe.c:5239 #, c-format msgid "Did not find any text search parsers." msgstr "Ðе знайдено жодного парÑера текÑтового пошуку." -#: describe.c:5245 +#: describe.c:5314 msgid "Start parse" msgstr "Почати розбір" -#: describe.c:5246 +#: describe.c:5315 msgid "Method" msgstr "Метод" -#: describe.c:5250 +#: describe.c:5319 msgid "Get next token" msgstr "Отримати наÑтупний токен" -#: describe.c:5252 +#: describe.c:5321 msgid "End parse" msgstr "Закінчити розбір" -#: describe.c:5254 +#: describe.c:5323 msgid "Get headline" msgstr "Отримати заголовок" -#: describe.c:5256 +#: describe.c:5325 msgid "Get token types" msgstr "Отримати типи токенів" -#: describe.c:5267 +#: describe.c:5335 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "ПарÑер текÑтового пошуку \"%s.%s\"" -#: describe.c:5270 +#: describe.c:5338 #, c-format msgid "Text search parser \"%s\"" msgstr "ПарÑер текÑтового пошуку \"%s\"" -#: describe.c:5289 +#: describe.c:5357 msgid "Token name" msgstr "Ім'Ñ Ñ‚Ð¾ÐºÐµÐ½Ñƒ" -#: describe.c:5303 +#: describe.c:5370 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "Типи токенів Ð´Ð»Ñ Ð¿Ð°Ñ€Ñера \"%s.%s\"" -#: describe.c:5306 +#: describe.c:5373 #, c-format msgid "Token types for parser \"%s\"" msgstr "Типи токенів Ð´Ð»Ñ Ð¿Ð°Ñ€Ñера \"%s\"" -#: describe.c:5350 +#: describe.c:5417 msgid "Template" msgstr "Шаблон" -#: describe.c:5351 +#: describe.c:5418 msgid "Init options" msgstr "Параметри ініціалізації" -#: describe.c:5378 +#: describe.c:5444 msgid "List of text search dictionaries" msgstr "СпиÑок Ñловників текÑтового пошуку" -#: describe.c:5411 +#: describe.c:5477 msgid "Init" msgstr "ІніціалізаціÑ" -#: describe.c:5412 +#: describe.c:5478 msgid "Lexize" msgstr "Ð’Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ Ð»ÐµÐºÑем" -#: describe.c:5444 +#: describe.c:5509 msgid "List of text search templates" msgstr "СпиÑок шаблонів текÑтового пошуку" -#: describe.c:5499 +#: describe.c:5563 msgid "List of text search configurations" msgstr "СпиÑок конфігурацій текÑтового пошуку" -#: describe.c:5550 +#: describe.c:5614 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "Ðе знайдено жодної конфігурації текÑтового пошуку під назвою \"%s\"." -#: describe.c:5553 +#: describe.c:5617 #, c-format msgid "Did not find any text search configurations." msgstr "Ðе знайдено жодної конфігурації текÑтвого пошуку." -#: describe.c:5619 +#: describe.c:5683 msgid "Token" msgstr "Токен" -#: describe.c:5620 +#: describe.c:5684 msgid "Dictionaries" msgstr "Словники" -#: describe.c:5631 +#: describe.c:5695 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ текÑту \"%s.%s\"" -#: describe.c:5634 +#: describe.c:5698 #, c-format msgid "Text search configuration \"%s\"" msgstr "ÐšÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ текÑту \"%s\"" -#: describe.c:5638 +#: describe.c:5702 #, c-format -msgid "" -"\n" +msgid "\n" "Parser: \"%s.%s\"" -msgstr "" -"\n" +msgstr "\n" "ПарÑер: \"%s.%s\"" -#: describe.c:5641 +#: describe.c:5705 #, c-format -msgid "" -"\n" +msgid "\n" "Parser: \"%s\"" -msgstr "" -"\n" +msgstr "\n" "ПарÑер: \"%s\"" -#: describe.c:5722 +#: describe.c:5784 msgid "List of foreign-data wrappers" msgstr "СпиÑок джерел Ñторонніх даних" -#: describe.c:5750 +#: describe.c:5812 msgid "Foreign-data wrapper" msgstr "Джерело Ñторонніх даних" -#: describe.c:5768 describe.c:5958 +#: describe.c:5830 describe.c:6017 msgid "Version" msgstr "ВерÑÑ–Ñ" -#: describe.c:5799 +#: describe.c:5860 msgid "List of foreign servers" msgstr "СпиÑок Ñторонніх Ñерверів" -#: describe.c:5824 describe.c:5883 +#: describe.c:5885 describe.c:5943 msgid "Server" msgstr "Сервер" -#: describe.c:5825 +#: describe.c:5886 msgid "User name" msgstr "Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача" -#: describe.c:5855 +#: describe.c:5915 msgid "List of user mappings" msgstr "СпиÑок зіÑтавлень кориÑтувачів" -#: describe.c:5928 +#: describe.c:5987 msgid "List of foreign tables" msgstr "СпиÑок Ñторонніх таблиць" -#: describe.c:5980 +#: describe.c:6038 msgid "List of installed extensions" msgstr "СпиÑок вÑтановлених розширень" -#: describe.c:6028 +#: describe.c:6086 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "Ðе знайдено жодного Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ назвою \"%s\"." -#: describe.c:6031 +#: describe.c:6089 #, c-format msgid "Did not find any extensions." msgstr "Ðе знайдено жодного розширеннÑ." -#: describe.c:6075 +#: describe.c:6133 msgid "Object description" msgstr "ÐžÐ¿Ð¸Ñ Ð¾Ð±'єкту" -#: describe.c:6085 +#: describe.c:6142 #, c-format msgid "Objects in extension \"%s\"" msgstr "Об'єкти в розширенні \"%s\"" -#: describe.c:6126 +#: describe.c:6183 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неправильне повне ім'Ñ (забагато компонентів): %s" -#: describe.c:6140 +#: describe.c:6197 #, c-format msgid "cross-database references are not implemented: %s" msgstr "міжбазові поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ðµ реалізовані: %s" -#: describe.c:6171 describe.c:6298 +#: describe.c:6228 describe.c:6354 #, c-format msgid "The server (version %s) does not support publications." msgstr "Сервер (верÑÑ–Ñ %s) не підтримує публікації." -#: describe.c:6188 describe.c:6376 +#: describe.c:6245 describe.c:6432 msgid "All tables" msgstr "УÑÑ– таблиці" -#: describe.c:6189 describe.c:6377 +#: describe.c:6246 describe.c:6433 msgid "Inserts" msgstr "Ð’Ñтавки" -#: describe.c:6190 describe.c:6378 +#: describe.c:6247 describe.c:6434 msgid "Updates" msgstr "ОновленнÑ" -#: describe.c:6191 describe.c:6379 +#: describe.c:6248 describe.c:6435 msgid "Deletes" msgstr "ВидаленнÑ" -#: describe.c:6195 describe.c:6381 +#: describe.c:6252 describe.c:6437 msgid "Truncates" msgstr "ОчищеннÑ" -#: describe.c:6199 describe.c:6383 +#: describe.c:6256 describe.c:6439 msgid "Via root" msgstr "Через root" -#: describe.c:6221 +#: describe.c:6277 msgid "List of publications" msgstr "СпиÑок публікацій" -#: describe.c:6345 +#: describe.c:6401 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "Ðе знайдено жодної публікації під назвою \"%s\"." -#: describe.c:6348 +#: describe.c:6404 #, c-format msgid "Did not find any publications." msgstr "Ðе знайдено жодної публікації." -#: describe.c:6372 +#: describe.c:6428 #, c-format msgid "Publication %s" msgstr "ÐŸÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ %s" -#: describe.c:6425 +#: describe.c:6481 msgid "Tables:" msgstr "Таблиці:" -#: describe.c:6437 +#: describe.c:6493 msgid "Tables from schemas:" msgstr "Таблиці зі Ñхеми:" -#: describe.c:6481 +#: describe.c:6538 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "Сервер (верÑÑ–Ñ %s) не підтримує підпиÑки." -#: describe.c:6497 +#: describe.c:6554 msgid "Publication" msgstr "ПублікаціÑ" -#: describe.c:6506 +#: describe.c:6563 msgid "Binary" msgstr "Бінарний" -#: describe.c:6507 +#: describe.c:6572 describe.c:6576 msgid "Streaming" msgstr "Потокова передача" -#: describe.c:6514 +#: describe.c:6584 msgid "Two-phase commit" msgstr "Двофазовий коміт" -#: describe.c:6515 +#: describe.c:6585 msgid "Disable on error" msgstr "Вимкнути при помилці" -#: describe.c:6520 +#: describe.c:6592 +msgid "Origin" +msgstr "Джерело" + +#: describe.c:6593 +msgid "Password required" +msgstr "Потрібен пароль" + +#: describe.c:6594 +msgid "Run as owner?" +msgstr "ЗапуÑтити Ñк влаÑник?" + +#: describe.c:6599 +msgid "Failover" +msgstr "Ð’Ñ–Ð´Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Ð·Ð±Ð¾ÑŽ" + +#: describe.c:6604 msgid "Synchronous commit" msgstr "Синхронні затвердженнÑ" -#: describe.c:6521 +#: describe.c:6605 msgid "Conninfo" msgstr "Conninfo" -#: describe.c:6527 +#: describe.c:6611 msgid "Skip LSN" msgstr "ПропуÑтити LSN" -#: describe.c:6554 +#: describe.c:6637 msgid "List of subscriptions" msgstr "СпиÑок підпиÑок" -#: describe.c:6616 describe.c:6712 describe.c:6805 describe.c:6900 +#: describe.c:6666 +msgid "(none)" +msgstr "(нічого)" + +#: describe.c:6706 describe.c:6801 describe.c:6893 describe.c:6987 msgid "AM" msgstr "ÐМ" -#: describe.c:6617 +#: describe.c:6707 msgid "Input type" msgstr "Тип вводу" -#: describe.c:6618 +#: describe.c:6708 msgid "Storage type" msgstr "Тип Ñховища" -#: describe.c:6619 +#: describe.c:6709 msgid "Operator class" msgstr "ÐšÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð²" -#: describe.c:6631 describe.c:6713 describe.c:6806 describe.c:6901 +#: describe.c:6721 describe.c:6802 describe.c:6894 describe.c:6988 msgid "Operator family" msgstr "СімейÑтво операторів" -#: describe.c:6667 +#: describe.c:6756 msgid "List of operator classes" msgstr "СпиÑок клаÑів операторів" -#: describe.c:6714 +#: describe.c:6803 msgid "Applicable types" msgstr "Типи Ð´Ð»Ñ Ð·Ð°ÑтоÑуваннÑ" -#: describe.c:6756 +#: describe.c:6844 msgid "List of operator families" msgstr "СпиÑок ÑімейÑтв операторів" -#: describe.c:6807 +#: describe.c:6895 msgid "Operator" msgstr "Оператор" -#: describe.c:6808 +#: describe.c:6896 msgid "Strategy" msgstr "СтратегіÑ" -#: describe.c:6809 +#: describe.c:6897 msgid "ordering" msgstr "упорÑдкуваннÑ" -#: describe.c:6810 +#: describe.c:6898 msgid "search" msgstr "пошук" -#: describe.c:6811 +#: describe.c:6899 msgid "Purpose" msgstr "Ціль" -#: describe.c:6816 +#: describe.c:6904 msgid "Sort opfamily" msgstr "СімейÑтво операторів ÑортуваннÑ" -#: describe.c:6855 +#: describe.c:6942 msgid "List of operators of operator families" msgstr "СпиÑок операторів ÑімейÑтв операторів" -#: describe.c:6902 +#: describe.c:6989 msgid "Registered left type" msgstr "ЗареєÑтрований лівий тип" -#: describe.c:6903 +#: describe.c:6990 msgid "Registered right type" msgstr "ЗареєÑтрований правий тип" -#: describe.c:6904 +#: describe.c:6991 msgid "Number" msgstr "ЧиÑло" -#: describe.c:6948 +#: describe.c:7034 msgid "List of support functions of operator families" msgstr "СпиÑок функцій підтримки ÑімейÑтв операторів" -#: describe.c:6979 +#: describe.c:7065 msgid "ID" msgstr "ID" -#: describe.c:7000 +#: describe.c:7085 msgid "Large objects" msgstr "Великі об'єкти" -#: help.c:75 -msgid "" -"psql is the PostgreSQL interactive terminal.\n" -"\n" -msgstr "" -"psql - це інтерактивний термінал PostgreSQL.\n" -"\n" +#: help.c:63 +msgid "psql is the PostgreSQL interactive terminal.\n\n" +msgstr "psql - це інтерактивний термінал PostgreSQL.\n\n" -#: help.c:76 help.c:393 help.c:473 help.c:516 +#: help.c:64 help.c:372 help.c:456 help.c:502 msgid "Usage:\n" msgstr "ВикориÑтаннÑ:\n" -#: help.c:77 -msgid "" -" psql [OPTION]... [DBNAME [USERNAME]]\n" -"\n" -msgstr "" -" psql [ОПЦІЯ]... [БД [КОРИСТУВÐЧ]]\n" -"\n" +#: help.c:65 +msgid " psql [OPTION]... [DBNAME [USERNAME]]\n\n" +msgstr " psql [ОПЦІЯ]... [БД [КОРИСТУВÐЧ]]\n\n" -#: help.c:79 +#: help.c:67 msgid "General options:\n" msgstr "ОÑновні налаштуваннÑ:\n" -#: help.c:84 +#: help.c:68 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=КОМÐÐДРвиконати лише одну команду (SQL або внутрішню) Ñ– вийти\n" -#: help.c:85 -#, c-format -msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" -msgstr " -d, --dbname=DBNAME ім'Ñ Ð±Ð°Ð·Ð¸ даних Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ (за замовчаннÑ: \"%s\") \n" +#: help.c:69 +msgid " -d, --dbname=DBNAME database name to connect to\n" +msgstr " -d, --dbname=DBNAME назва бази даних Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ\n" -#: help.c:87 +#: help.c:70 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=FILENAME виконує команди з файлу, потім виходить\n" -#: help.c:88 +#: help.c:71 msgid " -l, --list list available databases, then exit\n" msgstr " -l, --list виводить ÑпиÑок доÑтупних баз даних, потім виходить\n" -#: help.c:89 -msgid "" -" -v, --set=, --variable=NAME=VALUE\n" +#: help.c:72 +msgid " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" " (e.g., -v ON_ERROR_STOP=1)\n" -msgstr "" -" -v, --set=, --variable=NAME=VALUE\n" +msgstr " -v, --set=, --variable=NAME=VALUE\n" " приÑвоїти змінній psql NAME Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ VALUE\n" " (наприклад, -v ON_ERROR_STOP=1)\n" -#: help.c:92 +#: help.c:75 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n" -#: help.c:93 +#: help.c:76 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc ігнорувати файл параметрів запуÑка (~/.psqlrc)\n" -#: help.c:94 -msgid "" -" -1 (\"one\"), --single-transaction\n" +#: help.c:77 +msgid " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" -msgstr "" -" -1 (\"один\"), --single-transaction\n" +msgstr " -1 (\"один\"), --single-transaction\n" " виконує Ñк одну транзакцію (Ñкщо не інтерактивна)\n" -#: help.c:96 +#: help.c:79 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help [=options] показати цю довідку, потім вийти\n" -#: help.c:97 +#: help.c:80 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands перерахувати команди, потім вийти\n" -#: help.c:98 +#: help.c:81 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables перерахувати Ñпеціальні змінні, потім вийти\n" -#: help.c:100 -msgid "" -"\n" +#: help.c:83 +msgid "\n" "Input and output options:\n" -msgstr "" -"\n" +msgstr "\n" "Параметри вводу Ñ– виводу:\n" -#: help.c:101 +#: help.c:84 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all відобразити вÑÑ– вхідні дані з Ñкрипта\n" -#: help.c:102 +#: help.c:85 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors відобразити команди з помилками\n" -#: help.c:103 +#: help.c:86 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries відобразити команди, відправлені на Ñервер\n" -#: help.c:104 +#: help.c:87 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden відобразити запити, згенеровані внутрішніми командами\n" -#: help.c:105 +#: help.c:88 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FILENAME зберегти протокол роботи у файл\n" -#: help.c:106 +#: help.c:89 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline вимкнути розширене Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð¾Ð³Ð¾ Ñ€Ñдка (readline)\n" -#: help.c:107 +#: help.c:90 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=FILENAME надÑилати результати запиту до файлу (або до каналу |)\n" -#: help.c:108 +#: help.c:91 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet тихий запуÑк (ніÑких повідомлень, лише результат запитів)\n" -#: help.c:109 +#: help.c:92 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step покроковий режим (Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ запиту)\n" -#: help.c:110 +#: help.c:93 msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" msgstr " -S, --single-line однорÑдковий режим (кінець Ñ€Ñдка завершує команду)\n" -#: help.c:112 -msgid "" -"\n" +#: help.c:95 +msgid "\n" "Output format options:\n" -msgstr "" -"\n" +msgstr "\n" "Параметри формату виводу:\n" -#: help.c:113 +#: help.c:96 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align режим виводу не вирівнÑної таблиці\n" -#: help.c:114 +#: help.c:97 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv режим виводу таблиць CSV (Comma-Separated Values)\n" -#: help.c:115 +#: help.c:98 #, c-format -msgid "" -" -F, --field-separator=STRING\n" +msgid " -F, --field-separator=STRING\n" " field separator for unaligned output (default: \"%s\")\n" -msgstr "" -" -F, --field-separator=СТРОКÐ\n" +msgstr " -F, --field-separator=СТРОКÐ\n" " розділювач полів при не вирівнÑному виводі\n" " (за замовчуваннÑм: \"%s\")\n" -#: help.c:118 +#: help.c:101 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html вивід таблиці у форматі HTML\n" -#: help.c:119 +#: help.c:102 msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" msgstr " -P, --pset=VAR[=ARG] вÑтановити параметр виводу змінної VAR значенню ARG (див. команду \"\\pset\")\n" -#: help.c:120 -msgid "" -" -R, --record-separator=STRING\n" +#: help.c:103 +msgid " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" -msgstr "" -" -R, --record-separator=СТРОКÐ\n" +msgstr " -R, --record-separator=СТРОКÐ\n" " розділювач запиÑів при не вирівнÑному виводі\n" " (за замовчуваннÑм: новий Ñ€Ñдок)\n" -#: help.c:122 +#: help.c:105 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only виводити лише Ñ€Ñдки\n" -#: help.c:123 +#: help.c:106 msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" msgstr " -T, --table-attr=ТЕКСТ вÑтановити атрибути HTML-таблиці (width, border)\n" -#: help.c:124 +#: help.c:107 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded ввімкнути розширене Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–\n" -#: help.c:125 -msgid "" -" -z, --field-separator-zero\n" +#: help.c:108 +msgid " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" -msgstr "" -" -z, --field-separator-zero\n" +msgstr " -z, --field-separator-zero\n" " вÑтановити розділювач полів Ð´Ð»Ñ Ð½Ðµ вирівнÑного виводу в нульовий байт\n" -#: help.c:127 -msgid "" -" -0, --record-separator-zero\n" +#: help.c:110 +msgid " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" -msgstr "" -" -0, --record-separator-zero\n" +msgstr " -0, --record-separator-zero\n" " вÑтановити розділювач запиÑів Ð´Ð»Ñ Ð½Ðµ вирівнÑного виводу в нульовий байт\n" -#: help.c:130 -msgid "" -"\n" +#: help.c:113 +msgid "\n" "Connection options:\n" -msgstr "" -"\n" +msgstr "\n" "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·'єднаннÑ:\n" -#: help.c:133 -#, c-format -msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" -msgstr " -h, --host=HOSTNAME хоÑÑ‚ Ñервера бази даних або каталог Ñокетів (за замовчуваннÑм: \"%s)\n" - -#: help.c:134 -msgid "local socket" -msgstr "локальний Ñокет" +#: help.c:114 +msgid " -h, --host=HOSTNAME database server host or socket directory\n" +msgstr " -h, --host=HOSTNAME хоÑÑ‚ Ñерверу баз даних або каталог Ñокетів\n" -#: help.c:137 -#, c-format -msgid " -p, --port=PORT database server port (default: \"%s\")\n" -msgstr " -p, --port=PORT порт Ñервера бази даних (за замовчуваннÑм: \"%s\")\n" +#: help.c:115 +msgid " -p, --port=PORT database server port\n" +msgstr " -p, --port=ПОРТ порт Ñервера бази даних\n" -#: help.c:140 -#, c-format -msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" -msgstr " -U, --username=USERNAME ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача бази даних (за змовчуваннÑм: \"%s\")\n" +#: help.c:116 +msgid " -U, --username=USERNAME database user name\n" +msgstr " -U, --username=USERNAME ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача бази даних\n" -#: help.c:142 +#: help.c:117 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ніколи не запитувати пароль\n" -#: help.c:143 +#: help.c:118 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password запитувати пароль завжди (повинно траплÑтиÑÑŒ автоматично)\n" -#: help.c:145 -msgid "" -"\n" +#: help.c:120 +msgid "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" "commands) from within psql, or consult the psql section in the PostgreSQL\n" -"documentation.\n" -"\n" -msgstr "" -"\n" -"Щоб дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ, введіть \"\\?\" (Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ–Ñ… команд) або \"\\help\"(Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ SQL) в psql, або звіртеÑÑ Ð· розділом psql документації PostgreSQL. \n" -"\n" +"documentation.\n\n" +msgstr "\n" +"Щоб дізнатиÑÑ Ð±Ñ–Ð»ÑŒÑˆÐµ, введіть \"\\?\" (Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ–Ñ… команд) або \"\\help\"(Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ SQL) в psql, або звіртеÑÑ Ð· розділом psql документації PostgreSQL. \n\n" -#: help.c:148 +#: help.c:123 #, c-format msgid "Report bugs to <%s>.\n" msgstr "ПовідомлÑти про помилки на <%s>.\n" -#: help.c:149 +#: help.c:124 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" -#: help.c:191 +#: help.c:166 msgid "General\n" msgstr "Загальні\n" -#: help.c:192 +#: help.c:167 +msgid " \\bind [PARAM]... set query parameters\n" +msgstr " \\bind [PARAM]... вÑтановити параметри запиту\n" + +#: help.c:168 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright умови викориÑÑ‚Ð°Ð½Ð½Ñ Ñ– розповÑÑŽÐ´Ð¶ÐµÐ½Ð½Ñ PostgreSQL\n" -#: help.c:193 +#: help.c:169 msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" msgstr " \\crosstabview [COLUMNS] виконати запит Ñ– відобразити результат у перехреÑній таблиці\n" -#: help.c:194 +#: help.c:170 msgid " \\errverbose show most recent error message at maximum verbosity\n" msgstr " \\errverbose вивеÑти макÑимально докладне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ оÑтанню помилку\n" -#: help.c:195 -msgid "" -" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" +#: help.c:171 +msgid " \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" " \\g with no arguments is equivalent to a semicolon\n" -msgstr "" -" \\g [(OPTIONS)] [FILE] виконати запит (Ñ– надіÑлати результат до файлу або |каналу);\n" +msgstr " \\g [(OPTIONS)] [FILE] виконати запит (Ñ– надіÑлати результат до файлу або |каналу);\n" " \\g без аргументів рівнозначно крапці з комою\n" -#: help.c:197 +#: help.c:173 msgid " \\gdesc describe result of query, without executing it\n" msgstr " \\gdesc опиÑати результат запиту без виконаннÑ\n" -#: help.c:198 +#: help.c:174 msgid " \\gexec execute query, then execute each value in its result\n" msgstr " \\gexec виконати запит, потім виконати кожне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² його результаті\n" -#: help.c:199 +#: help.c:175 msgid " \\gset [PREFIX] execute query and store result in psql variables\n" msgstr " \\gset [PREFIX] виконати запит та зберегти результат в змінних psql \n" -#: help.c:200 +#: help.c:176 msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [(OPTIONS)] [FILE] Ñк \\g, але вмикає розширений режим виводу\n" -#: help.c:201 +#: help.c:177 msgid " \\q quit psql\n" msgstr " \\q вийти з psql\n" -#: help.c:202 -msgid " \\watch [SEC] execute query every SEC seconds\n" -msgstr " \\watch [SEC] виконувати запит кожні SEC Ñекунд\n" +#: help.c:178 +msgid " \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" execute query every SEC seconds, up to N times,\n" +" stop if less than MIN rows are returned\n" +msgstr " \\watch [[i=]SEC] [c=N] [m=MIN]\n" +" виконувати запит кожні SEC Ñекунд, до N разів або\n" +" зупинитиÑÑ, Ñкщо повернуто менше ніж MIN Ñ€Ñдків\n" -#: help.c:203 help.c:211 help.c:223 help.c:233 help.c:240 help.c:296 help.c:304 -#: help.c:324 help.c:337 help.c:346 +#: help.c:181 help.c:189 help.c:201 help.c:211 help.c:218 help.c:275 help.c:283 +#: help.c:303 help.c:316 help.c:325 msgid "\n" msgstr "\n" -#: help.c:205 +#: help.c:183 msgid "Help\n" msgstr "Довідка\n" -#: help.c:207 +#: help.c:185 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [commands] показати довідку по командах з \\\n" -#: help.c:208 +#: help.c:186 msgid " \\? options show help on psql command-line options\n" msgstr " \\? options показати довідку по параметрах командного Ñ€Ñдку psql\n" -#: help.c:209 +#: help.c:187 msgid " \\? variables show help on special variables\n" msgstr " \\? variables показати довідку по Ñпеціальних змінних\n" -#: help.c:210 +#: help.c:188 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [NAME] довідка з ÑинтакÑиÑу команд SQL, * Ð´Ð»Ñ Ð²ÑÑ–Ñ… команд\n" -#: help.c:213 +#: help.c:191 msgid "Query Buffer\n" msgstr "Буфер запитів\n" -#: help.c:214 +#: help.c:192 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr " \\e [FILE] [LINE] редагувати буфер запитів (або файл) зовнішнім редактором\n" -#: help.c:215 +#: help.c:193 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [FUNCNAME [LINE]] редагувати Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— зовнішнім редактором\n" -#: help.c:216 +#: help.c:194 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [VIEWNAME [LINE]] редагувати Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½Ñ–Ð¼ редактором\n" -#: help.c:217 +#: help.c:195 msgid " \\p show the contents of the query buffer\n" msgstr " \\p показати вміÑÑ‚ буфера запитів\n" -#: help.c:218 +#: help.c:196 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r Ñкинути (очиÑтити) буфер запитів\n" -#: help.c:220 +#: help.c:198 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [FILE] відобразити Ñ–Ñторію або зберегти Ñ—Ñ— до файлу\n" -#: help.c:222 +#: help.c:200 msgid " \\w FILE write query buffer to file\n" msgstr " \\w FILE пиÑати буфер запитів до файлу\n" -#: help.c:225 +#: help.c:203 msgid "Input/Output\n" msgstr "Ввід/Вивід\n" -#: help.c:226 +#: help.c:204 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr " \\copy ... виконати команду SQL COPY з потоком даних на клієнтÑький хоÑÑ‚\n" -#: help.c:227 +#: help.c:205 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [STRING] запиÑати Ñ€Ñдок до Ñтандартного виводу (-n Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку нового Ñ€Ñдка)\n" -#: help.c:228 +#: help.c:206 msgid " \\i FILE execute commands from file\n" msgstr " \\i FILE виконати команди з файлу\n" -#: help.c:229 +#: help.c:207 msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr " \\ir ФÐЙЛ те Ñаме, що \\i, але відноÑно Ñ€Ð¾Ð·Ñ‚Ð°ÑˆÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ Ñценарію\n" -#: help.c:230 +#: help.c:208 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [FILE] надÑилати вÑÑ– результати запитів до файлу або до каналу |\n" -#: help.c:231 +#: help.c:209 msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" msgstr " \\qecho [-n] [STRING] запиÑати Ñ€Ñдок до вихідного потоку \\o (-n Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку нового Ñ€Ñдка)\n" -#: help.c:232 +#: help.c:210 msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr " \\warn [-n] [STRING] запиÑати Ñ€Ñдок до Ñтандартної помилки (-n Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑку нового Ñ€Ñдка)\n" -#: help.c:235 +#: help.c:213 msgid "Conditional\n" msgstr "Умовний\n" -#: help.c:236 +#: help.c:214 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR початок умовного блоку\n" -#: help.c:237 +#: help.c:215 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR альтернатива в рамках поточного блоку\n" -#: help.c:238 +#: help.c:216 msgid " \\else final alternative within current conditional block\n" msgstr " \\else оÑтаточна альтернатива в рамках поточного умовного блоку\n" -#: help.c:239 +#: help.c:217 msgid " \\endif end conditional block\n" msgstr " \\endif кінець умовного блоку\n" -#: help.c:242 +#: help.c:220 msgid "Informational\n" msgstr "Інформаційний\n" -#: help.c:243 +#: help.c:221 msgid " (options: S = show system objects, + = additional detail)\n" msgstr " (параметри: S = показати ÑиÑтемні об'єкти, + = додаткові деталі)\n" -#: help.c:244 +#: help.c:222 msgid " \\d[S+] list tables, views, and sequences\n" msgstr " \\d[S+] вивеÑти таблиці, Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ Ñ– поÑлідовноÑті\n" -#: help.c:245 +#: help.c:223 msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr " \\d[S+] NAME опиÑати таблицю, поданнÑ, поÑлідовніÑть або індекÑ\n" -#: help.c:246 +#: help.c:224 msgid " \\da[S] [PATTERN] list aggregates\n" msgstr " \\da[S] [PATTERN] вивеÑти агрегати\n" -#: help.c:247 +#: help.c:225 msgid " \\dA[+] [PATTERN] list access methods\n" msgstr " \\dA[+] [PATTERN] вивеÑти методи доÑтупу\n" -#: help.c:248 +#: help.c:226 msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] ÑпиÑок клаÑів операторів\n" -#: help.c:249 +#: help.c:227 msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] ÑпиÑок ÑімейÑтв операторів\n" -#: help.c:250 +#: help.c:228 msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] ÑпиÑок операторів ÑімейÑтв операторів\n" -#: help.c:251 +#: help.c:229 msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] ÑпиÑок функцій підтримки ÑімейÑтв операторів\n" -#: help.c:252 +#: help.c:230 msgid " \\db[+] [PATTERN] list tablespaces\n" msgstr " \\db[+] [PATTERN] вивеÑти табличні проÑтори\n" -#: help.c:253 +#: help.c:231 msgid " \\dc[S+] [PATTERN] list conversions\n" msgstr " \\dc[S+] [PATTERN] вивеÑти перетвореннÑ\n" -#: help.c:254 +#: help.c:232 msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" msgstr " \\dconfig[+] [PATTERN] вивеÑти параметри конфігурації\n" -#: help.c:255 +#: help.c:233 msgid " \\dC[+] [PATTERN] list casts\n" msgstr " \\dC[+] [PATTERN] вивеÑти Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð²\n" -#: help.c:256 +#: help.c:234 msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" msgstr " \\dd[S] [PATTERN] показати Ð¾Ð¿Ð¸Ñ Ð¾Ð±'єкта, що не відображаєтьÑÑ Ð² іншому міÑці\n" -#: help.c:257 +#: help.c:235 msgid " \\dD[S+] [PATTERN] list domains\n" msgstr " \\dD[S+] [PATTERN] вивеÑти домени\n" -#: help.c:258 +#: help.c:236 msgid " \\ddp [PATTERN] list default privileges\n" msgstr " \\ddp [PATTERN] вивеÑти привілеї за замовчуваннÑм\n" -#: help.c:259 +#: help.c:237 msgid " \\dE[S+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [PATTERN] вивеÑти зовнішні таблиці\n" -#: help.c:260 +#: help.c:238 msgid " \\des[+] [PATTERN] list foreign servers\n" msgstr " \\des[+] [PATTERN] вивеÑти зовнішні Ñервери\n" -#: help.c:261 +#: help.c:239 msgid " \\det[+] [PATTERN] list foreign tables\n" msgstr " \\dE[S+] [PATTERN] вивеÑти зовнішні таблиці\n" -#: help.c:262 +#: help.c:240 msgid " \\deu[+] [PATTERN] list user mappings\n" msgstr " \\deu[+] [PATTERN] вивеÑти кориÑтувацькі зіÑтавленнÑ\n" -#: help.c:263 +#: help.c:241 msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" msgstr " \\dew[+] [PATTERN] ÑпиÑок джерел Ñторонніх даних\n" -#: help.c:264 -msgid "" -" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +#: help.c:242 +msgid " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" -msgstr "" -" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +msgstr " \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " ÑпиÑок [лише агрегатних/нормальних/процедурних/тригерних/віконних] функцій\n" -#: help.c:266 +#: help.c:244 msgid " \\dF[+] [PATTERN] list text search configurations\n" msgstr " \\dF[+] [PATTERN] вивеÑти конфігурації текÑтового пошуку\n" -#: help.c:267 +#: help.c:245 msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" msgstr " \\dFd[+] [PATTERN] вивеÑти Ñловники текÑтового пошуку\n" -#: help.c:268 +#: help.c:246 msgid " \\dFp[+] [PATTERN] list text search parsers\n" msgstr " \\dFp[+] [PATTERN] вивеÑти парÑери текÑтового пошуку\n" -#: help.c:269 +#: help.c:247 msgid " \\dFt[+] [PATTERN] list text search templates\n" msgstr " \\dFt[+] [PATTERN] вивеÑти шаблони текÑтового пошуку\n" -#: help.c:270 +#: help.c:248 msgid " \\dg[S+] [PATTERN] list roles\n" msgstr " \\dg[S+] [PATTERN] вивеÑти ролі\n" -#: help.c:271 +#: help.c:249 msgid " \\di[S+] [PATTERN] list indexes\n" msgstr " \\di[S+] [PATTERN] вивеÑти індекÑи\n" -#: help.c:272 +#: help.c:250 msgid " \\dl[+] list large objects, same as \\lo_list\n" msgstr " \\dl[+] вивеÑти великі об'єкти, те Ñаме, що \\lo_list\n" -#: help.c:273 +#: help.c:251 msgid " \\dL[S+] [PATTERN] list procedural languages\n" msgstr " \\dL[S+] [PATTERN] вивеÑти процедурні мови\n" -#: help.c:274 +#: help.c:252 msgid " \\dm[S+] [PATTERN] list materialized views\n" msgstr " \\dm[S+] [PATTERN] вивеÑти матеріалізовані поданнÑ\n" -#: help.c:275 +#: help.c:253 msgid " \\dn[S+] [PATTERN] list schemas\n" msgstr " \\dn[S+] [PATTERN] вивеÑти Ñхеми\n" -#: help.c:276 -msgid "" -" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +#: help.c:254 +msgid " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" -msgstr "" -" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +msgstr " \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " ÑпиÑок операторів\n" -#: help.c:278 +#: help.c:256 msgid " \\dO[S+] [PATTERN] list collations\n" msgstr " \\dO[S+] [PATTERN] вивеÑти правила ÑортуваннÑ\n" -#: help.c:279 -msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" -msgstr " \\dp [PATTERN] вивеÑти привілеї доÑтупу до таблиць, подань або поÑлідновноÑтей \n" +#: help.c:257 +msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n" +msgstr " \\dp[S] [PATTERN] вивеÑти привілеї доÑтупу до таблиць, подань або поÑлідовноÑтей \n" -#: help.c:280 +#: help.c:258 msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" msgstr " \\dP[itn+] [PATTERN] вивеÑти [тільки індекÑ/таблицю] Ñекційні Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ [n=вкладені]\n" -#: help.c:281 +#: help.c:259 msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr " \\drds [ROLEPTRN [DBPTRN]] вивеÑти Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð»ÐµÐ¹ побазово\n" -#: help.c:282 +#: help.c:260 +msgid " \\drg[S] [PATTERN] list role grants\n" +msgstr " \\drg[S] [PATTERN] вивеÑти надані ролі\n" + +#: help.c:261 msgid " \\dRp[+] [PATTERN] list replication publications\n" msgstr " \\dRp[+] [PATTERN] вивеÑти реплікаційні публікації\n" -#: help.c:283 +#: help.c:262 msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" msgstr " \\dRs[+] [PATTERN] вивеÑти реплікаційні підпиÑки\n" -#: help.c:284 +#: help.c:263 msgid " \\ds[S+] [PATTERN] list sequences\n" msgstr " \\ds[S+] [PATTERN] вивеÑти поÑлідовноÑті\n" -#: help.c:285 +#: help.c:264 msgid " \\dt[S+] [PATTERN] list tables\n" msgstr " \\dt[S+] [PATTERN] вивеÑти таблиці\n" -#: help.c:286 +#: help.c:265 msgid " \\dT[S+] [PATTERN] list data types\n" msgstr " \\dT[S+] [PATTERN] вивеÑти типи даних\n" -#: help.c:287 +#: help.c:266 msgid " \\du[S+] [PATTERN] list roles\n" msgstr " \\du[S+] [PATTERN] вивеÑти ролі\n" -#: help.c:288 +#: help.c:267 msgid " \\dv[S+] [PATTERN] list views\n" msgstr " \\dv[S+] [PATTERN] вивеÑти поданнÑ\n" -#: help.c:289 +#: help.c:268 msgid " \\dx[+] [PATTERN] list extensions\n" msgstr " \\dx[+] [PATTERN] вивеÑти розширеннÑ\n" -#: help.c:290 +#: help.c:269 msgid " \\dX [PATTERN] list extended statistics\n" msgstr " \\dX [PATTERN] ÑпиÑок розширеної ÑтатиÑтики\n" -#: help.c:291 +#: help.c:270 msgid " \\dy[+] [PATTERN] list event triggers\n" msgstr " \\dy[+] [PATTERN] вивеÑти тригери подій\n" -#: help.c:292 +#: help.c:271 msgid " \\l[+] [PATTERN] list databases\n" msgstr " \\l[+] [PATTERN] вивеÑти бази даних\n" -#: help.c:293 +#: help.c:272 msgid " \\sf[+] FUNCNAME show a function's definition\n" msgstr " \\sf[+] FUNCNAME відобразити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—\n" -#: help.c:294 +#: help.c:273 msgid " \\sv[+] VIEWNAME show a view's definition\n" msgstr " \\sv[+] VIEWNAME відобразити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ\n" -#: help.c:295 -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [PATTERN] те Ñаме, що \\dp\n" +#: help.c:274 +msgid " \\z[S] [PATTERN] same as \\dp\n" +msgstr " \\z[S] [PATTERN] те Ñаме, що \\dp\n" -#: help.c:298 +#: help.c:277 msgid "Large Objects\n" msgstr "Великі об'єкти\n" -#: help.c:299 +#: help.c:278 msgid " \\lo_export LOBOID FILE write large object to file\n" msgstr " \\lo_export LOBOID FILE запиÑати великий об'єкт в файл\n" -#: help.c:300 -msgid "" -" \\lo_import FILE [COMMENT]\n" +#: help.c:279 +msgid " \\lo_import FILE [COMMENT]\n" " read large object from file\n" -msgstr "" -" \\lo_import FILE [COMMENT]\n" +msgstr " \\lo_import FILE [COMMENT]\n" " читати великий об'єкт з файлу\n" -#: help.c:302 +#: help.c:281 msgid " \\lo_list[+] list large objects\n" msgstr " \\lo_list[+] вивеÑти великі об'єкти\n" -#: help.c:303 +#: help.c:282 msgid " \\lo_unlink LOBOID delete a large object\n" msgstr " \\lo_unlink LOBOID видалити великий об’єкт\n" -#: help.c:306 +#: help.c:285 msgid "Formatting\n" msgstr "ФорматуваннÑ\n" -#: help.c:307 +#: help.c:286 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð¼Ñ–Ð¶ режимами виводу: unaligned, aligned\n" -#: help.c:308 +#: help.c:287 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [STRING] вÑтановити заголовок таблиці або прибрати, Ñкщо не задано\n" -#: help.c:309 +#: help.c:288 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr " \\f [STRING] показати або вÑтановити розділювач полів Ð´Ð»Ñ Ð½Ðµ вирівнÑного виводу запиту\n" -#: help.c:310 +#: help.c:289 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H переключити режим виводу HTML (поточний: %s)\n" -#: help.c:312 -msgid "" -" \\pset [NAME [VALUE]] set table output option\n" +#: help.c:291 +msgid " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" " fieldsep_zero|footer|format|linestyle|null|\n" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" -msgstr "" -" \\pset [NAME [VALUE]] вÑтановити параметр виводу таблиці\n" +" unicode_header_linestyle|xheader_width)\n" +msgstr " \\pset [NAME [VALUE]] вÑтановити параметр виводу таблиці\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" " fieldsep_zero|footer|format|linestyle|null|\n" " numericlocale|pager|pager_min_lines|recordsep|\n" " recordsep_zero|tableattr|title|tuples_only|\n" " unicode_border_linestyle|unicode_column_linestyle|\n" -" unicode_header_linestyle)\n" +" unicode_header_linestyle|xheader_width)\n" -#: help.c:319 +#: help.c:298 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] показувати лише Ñ€Ñдки (поточно %s)\n" -#: help.c:321 +#: help.c:300 msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" msgstr " \\T [STRING] вÑтановити атрибути Ð´Ð»Ñ HTML
або прибрати, Ñкщо не задані\n" -#: help.c:322 +#: help.c:301 #, c-format msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" msgstr " \\x [on|off|auto] переключити розширений вивід (поточний: %s)\n" -#: help.c:323 +#: help.c:302 msgid "auto" msgstr "авто" -#: help.c:326 +#: help.c:305 msgid "Connection\n" msgstr "ПідключеннÑ\n" -#: help.c:328 +#: help.c:307 #, c-format -msgid "" -" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" +msgid " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently \"%s\")\n" msgstr " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo} під'єднатиÑÑ Ð´Ð¾ нової бази даних (поточно \"%s\")\n" -#: help.c:332 -msgid "" -" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" +#: help.c:311 +msgid " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" msgstr " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo} під'єднатиÑÑ Ð´Ð¾ нової бази даних (зараз з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ñутнє)\n" -#: help.c:334 +#: help.c:313 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo показати інформацію про поточне з'єднаннÑ\n" -#: help.c:335 +#: help.c:314 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [ENCODING] показати або вÑтановити ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°\n" -#: help.c:336 +#: help.c:315 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [USERNAME] безпечно змінити пароль кориÑтувача \n" -#: help.c:339 +#: help.c:318 msgid "Operating System\n" msgstr "Операційна ÑиÑтема\n" -#: help.c:340 +#: help.c:319 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [DIR] змінити поточний робочий каталог\n" -#: help.c:341 +#: help.c:320 msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" msgstr " \\getenv PSQLVAR ENVAR отримати змінну Ñередовища\n" -#: help.c:342 +#: help.c:321 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv NAME [VALUE] вÑтановити або Ñкинути змінну Ñередовища\n" -#: help.c:343 +#: help.c:322 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] переключити таймер команд (поточний: %s)\n" -#: help.c:345 +#: help.c:324 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr " \\! [COMMAND] виконати команду в оболонці або запуÑтити інтерактивну оболонку\n" -#: help.c:348 +#: help.c:327 msgid "Variables\n" msgstr "Змінні\n" -#: help.c:349 +#: help.c:328 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [TEXT] NAME запитати кориÑтувача Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½ÑŒÐ¾Ñ— змінної\n" -#: help.c:350 +#: help.c:329 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [NAME [VALUE]] вÑтановити внутрішню змінну або вивеÑти вÑÑ–, Ñкщо не задані параметри\n" -#: help.c:351 +#: help.c:330 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset NAME Ñкинути (видалити) Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½ÑŒÐ¾Ñ— змінної\n" -#: help.c:390 -msgid "" -"List of specially treated variables\n" -"\n" -msgstr "" -"СпиÑок Ñпеціальних змінних\n" -"\n" +#: help.c:369 +msgid "List of specially treated variables\n\n" +msgstr "СпиÑок Ñпеціальних змінних\n\n" -#: help.c:392 +#: help.c:371 msgid "psql variables:\n" msgstr "змінні psql:\n" -#: help.c:394 -msgid "" -" psql --set=NAME=VALUE\n" -" or \\set NAME VALUE inside psql\n" -"\n" -msgstr "" -" psql --set=ІМ'Я=ЗÐÐЧЕÐÐЯ\n" -" або \\set ІМ'Я ЗÐÐЧЕÐÐЯ уÑередині psql\n" -"\n" +#: help.c:373 +msgid " psql --set=NAME=VALUE\n" +" or \\set NAME VALUE inside psql\n\n" +msgstr " psql --set=ІМ'Я=ЗÐÐЧЕÐÐЯ\n" +" або \\set ІМ'Я ЗÐÐЧЕÐÐЯ уÑередині psql\n\n" -#: help.c:396 -msgid "" -" AUTOCOMMIT\n" +#: help.c:375 +msgid " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" -msgstr "" -" AUTOCOMMIT\n" +msgstr " AUTOCOMMIT\n" " Ñкщо вÑтановлений, уÑпішні SQL-команди підтверджуютьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾\n" -#: help.c:398 -msgid "" -" COMP_KEYWORD_CASE\n" +#: help.c:377 +msgid " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" " [lower, upper, preserve-lower, preserve-upper]\n" -msgstr "" -" COMP_KEYWORD_CASE\n" +msgstr " COMP_KEYWORD_CASE\n" " визначає регіÑтр Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¸Ñ… Ñлів SQL\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:401 -msgid "" -" DBNAME\n" +#: help.c:380 +msgid " DBNAME\n" " the currently connected database name\n" msgstr " DBNAME назва під'єднаної бази даних\n" -#: help.c:403 -msgid "" -" ECHO\n" +#: help.c:382 +msgid " ECHO\n" " controls what input is written to standard output\n" " [all, errors, none, queries]\n" msgstr " ECHO контролює ввід, що виводитьÑÑ Ð½Ð° Ñтандартний вивід [all, errors, none, queries]\n" -#: help.c:406 -msgid "" -" ECHO_HIDDEN\n" +#: help.c:385 +msgid " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" " if set to \"noexec\", just show them without execution\n" -msgstr "" -" ECHO_HIDDEN\n" +msgstr " ECHO_HIDDEN\n" " Ñкщо ввімкнено, виводить внутрішні запити, виконані за допомогою \"\\\";\n" " Ñкщо вÑтановлено Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"noexec\", тільки виводÑтьÑÑ, але не виконуютьÑÑ\n" -#: help.c:409 -msgid "" -" ENCODING\n" +#: help.c:388 +msgid " ENCODING\n" " current client character set encoding\n" -msgstr "" -" ENCODING\n" +msgstr " ENCODING\n" " поточне ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð±Ð¾Ñ€Ñƒ Ñимволів клієнта\n" -#: help.c:411 -msgid "" -" ERROR\n" -" true if last query failed, else false\n" -msgstr "" -" ERROR\n" -" Ñ–Ñтина, Ñкщо в оÑтанньому запиті Ñ” помилка, в іншому разі - хибніÑть\n" +#: help.c:390 +msgid " ERROR\n" +" \"true\" if last query failed, else \"false\"\n" +msgstr " ERROR\n" +" \"true\", Ñкщо в оÑтанньому запиті Ñ” помилка, в іншому разі - \"false\"\n" -#: help.c:413 -msgid "" -" FETCH_COUNT\n" +#: help.c:392 +msgid " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" -msgstr "" -" FETCH_COUNT\n" +msgstr " FETCH_COUNT\n" " чиÑло Ñ€Ñдків з результатами Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ– та Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð° один раз (0 = необмежено)\n" -#: help.c:415 -msgid "" -" HIDE_TABLEAM\n" +#: help.c:394 +msgid " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" -msgstr "" -" HIDE_TABLEAM\n" +msgstr " HIDE_TABLEAM\n" " Ñкщо вказано, методи доÑтупу до таблиць не відображаютьÑÑ\n" -#: help.c:417 -msgid "" -" HIDE_TOAST_COMPRESSION\n" +#: help.c:396 +msgid " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" -msgstr "" -" HIDE_TOAST_COMPRESSION\n" +msgstr " HIDE_TOAST_COMPRESSION\n" " Ñкщо вÑтановлено, методи ÑтиÑÐºÐ°Ð½Ð½Ñ Ð½Ðµ відображаютьÑÑ\n" -#: help.c:419 -msgid "" -" HISTCONTROL\n" +#: help.c:398 +msgid " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" msgstr " HISTCONTROL контролює Ñ–Ñторію команд [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:421 -msgid "" -" HISTFILE\n" +#: help.c:400 +msgid " HISTFILE\n" " file name used to store the command history\n" msgstr " HISTFILE ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ñ–Ñторії команд\n" -#: help.c:423 -msgid "" -" HISTSIZE\n" +#: help.c:402 +msgid " HISTSIZE\n" " maximum number of commands to store in the command history\n" msgstr " HISTSIZE макÑимальна кількіÑть команд Ð´Ð»Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð² Ñ–Ñторії команд\n" -#: help.c:425 -msgid "" -" HOST\n" +#: help.c:404 +msgid " HOST\n" " the currently connected database server host\n" msgstr " HOST поточний підключений хоÑÑ‚ Ñервера бази даних\n" -#: help.c:427 -msgid "" -" IGNOREEOF\n" +#: help.c:406 +msgid " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" msgstr " IGNOREEOF кількіÑть EOF Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ñ Ñ–Ð½Ñ‚ÐµÑ€Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñ— ÑеÑÑ–Ñ—\n" -#: help.c:429 -msgid "" -" LASTOID\n" +#: help.c:408 +msgid " LASTOID\n" " value of the last affected OID\n" msgstr " LASTOID Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ñтаннього залученого OID\n" -#: help.c:431 -msgid "" -" LAST_ERROR_MESSAGE\n" +#: help.c:410 +msgid " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" " message and SQLSTATE of last error, or empty string and \"00000\" if none\n" -msgstr "" -" LAST_ERROR_MESSAGE\n" +msgstr " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" " Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñ‚Ð° код SQLSTATE оÑтанньої помилки, або пуÑтий Ñ€Ñдок та \"00000\", Ñкщо помилки не було\n" -#: help.c:434 -msgid "" -" ON_ERROR_ROLLBACK\n" +#: help.c:413 +msgid " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" -msgstr "" -" ON_ERROR_ROLLBACK\n" +msgstr " ON_ERROR_ROLLBACK\n" " Ñкщо вÑтановлено, Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ð½Ðµ припинÑєтьÑÑ Ñƒ разі помилки (викориÑтовуютьÑÑ Ð½ÐµÑвні точки збереженнÑ)\n" -#: help.c:436 -msgid "" -" ON_ERROR_STOP\n" +#: help.c:415 +msgid " ON_ERROR_STOP\n" " stop batch execution after error\n" -msgstr "" -" ON_ERROR_STOP\n" +msgstr " ON_ERROR_STOP\n" " зупинÑти Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿Ð°ÐºÐµÑ‚Ñƒ команд піÑÐ»Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸\n" -#: help.c:438 -msgid "" -" PORT\n" +#: help.c:417 +msgid " PORT\n" " server port of the current connection\n" -msgstr "" -" PORT\n" +msgstr " PORT\n" " порт Ñервера Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ з'єднаннÑ\n" -#: help.c:440 -msgid "" -" PROMPT1\n" +#: help.c:419 +msgid " PROMPT1\n" " specifies the standard psql prompt\n" -msgstr "" -" PROMPT1\n" +msgstr " PROMPT1\n" " визначає Ñтандратне Ð·Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ psql \n" -#: help.c:442 -msgid "" -" PROMPT2\n" +#: help.c:421 +msgid " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" -msgstr "" -" PROMPT2\n" +msgstr " PROMPT2\n" " визначає запрошеннÑ, Ñке викориÑтовуєтьÑÑ Ð¿Ñ€Ð¸ продовженні команди з попереднього Ñ€Ñдка\n" -#: help.c:444 -msgid "" -" PROMPT3\n" +#: help.c:423 +msgid " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" -msgstr "" -" PROMPT3\n" +msgstr " PROMPT3\n" " визначає запрошеннÑ, Ñке виконуєтьÑÑ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ COPY ... FROM STDIN\n" -#: help.c:446 -msgid "" -" QUIET\n" +#: help.c:425 +msgid " QUIET\n" " run quietly (same as -q option)\n" -msgstr "" -" QUIET\n" +msgstr " QUIET\n" " тихий запуÑк ( Ñк із параметром -q)\n" -#: help.c:448 -msgid "" -" ROW_COUNT\n" +#: help.c:427 +msgid " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" -msgstr "" -" ROW_COUNT\n" +msgstr " ROW_COUNT\n" " чиÑло повернених або оброблених Ñ€Ñдків оÑтаннім запитом, або 0\n" -#: help.c:450 -msgid "" -" SERVER_VERSION_NAME\n" +#: help.c:429 +msgid " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" " server's version (in short string or numeric format)\n" -msgstr "" -" SERVER_VERSION_NAME\n" +msgstr " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" " верÑÑ–Ñ Ñеревера (у короткому текÑтовому або чиÑловому форматі)\n" -#: help.c:453 -msgid "" -" SHOW_ALL_RESULTS\n" +#: help.c:432 +msgid " SHELL_ERROR\n" +" \"true\" if the last shell command failed, \"false\" if it succeeded\n" +msgstr " SHELL_ERROR\n" +" \"true\", Ñкщо оÑÑ‚Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° оболонки завершилаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾ÑŽ, \"false\", Ñкщо уÑпішно\n" + +#: help.c:434 +msgid " SHELL_EXIT_CODE\n" +" exit status of the last shell command\n" +msgstr " SHEL_EXIT_CODE\n" +" ÑÑ‚Ð°Ñ‚ÑƒÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¾Ñтанньої команди оболонки\n" + +#: help.c:436 +msgid " SHOW_ALL_RESULTS\n" " show all results of a combined query (\\;) instead of only the last\n" -msgstr "" -" SHOW_ALL_RESULTS\n" +msgstr " SHOW_ALL_RESULTS\n" " показати вÑÑ– результати комбінованого запиту (\\;) заміÑть тільки оÑтаннього\n" -#: help.c:455 -msgid "" -" SHOW_CONTEXT\n" +#: help.c:438 +msgid " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" -msgstr "" -" SHOW_CONTEXT\n" +msgstr " SHOW_CONTEXT\n" " керує відображеннÑм полів контекÑту повідомлень [never, errors, always]\n" -#: help.c:457 -msgid "" -" SINGLELINE\n" +#: help.c:440 +msgid " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" -msgstr "" -" SINGLELINE\n" +msgstr " SINGLELINE\n" " Ñкщо вÑтановлено, кінець Ñ€Ñдка завершує режим вводу SQL-команди (Ñк з параметром -S)\n" -#: help.c:459 -msgid "" -" SINGLESTEP\n" +#: help.c:442 +msgid " SINGLESTEP\n" " single-step mode (same as -s option)\n" -msgstr "" -" SINGLESTEP\n" +msgstr " SINGLESTEP\n" " покроковий режим (Ñк з параметром -s)\n" -#: help.c:461 -msgid "" -" SQLSTATE\n" +#: help.c:444 +msgid " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" -msgstr "" -" SQLSTATE\n" +msgstr " SQLSTATE\n" " SQLSTATE оÑтаннього запиту, або \"00000\" Ñкщо немає помилок\n" -#: help.c:463 -msgid "" -" USER\n" +#: help.c:446 +msgid " USER\n" " the currently connected database user\n" -msgstr "" -" USER\n" +msgstr " USER\n" " поточний кориÑтувач, підключений до бази даних\n" -#: help.c:465 -msgid "" -" VERBOSITY\n" +#: help.c:448 +msgid " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" -msgstr "" -" VERBOSITY\n" +msgstr " VERBOSITY\n" " контролює докладніÑть звітів про помилку [default, verbose, terse, sqlstate]\n" -#: help.c:467 -msgid "" -" VERSION\n" +#: help.c:450 +msgid " VERSION\n" " VERSION_NAME\n" " VERSION_NUM\n" " psql's version (in verbose string, short string, or numeric format)\n" -msgstr "" -" VERSION\n" +msgstr " VERSION\n" " VERSION_NAME\n" " VERSION_NUM\n" " psql верÑÑ–Ñ (в розгорнутому, в короткому текÑтовому або чиÑловому форматі)\n" -#: help.c:472 -msgid "" -"\n" +#: help.c:455 +msgid "\n" "Display settings:\n" -msgstr "" -"\n" +msgstr "\n" "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€ÐµÐ¶ÐµÐ½Ð½Ñ:\n" -#: help.c:474 -msgid "" -" psql --pset=NAME[=VALUE]\n" -" or \\pset NAME [VALUE] inside psql\n" -"\n" -msgstr "" -" psql --pset=NAME[=VALUE]\n" -" або \\pset ІМ'Я [VALUE] вÑередині psql\n" -"\n" +#: help.c:457 +msgid " psql --pset=NAME[=VALUE]\n" +" or \\pset NAME [VALUE] inside psql\n\n" +msgstr " psql --pset=NAME[=VALUE]\n" +" або \\pset ІМ'Я [VALUE] вÑередині psql\n\n" -#: help.c:476 -msgid "" -" border\n" +#: help.c:459 +msgid " border\n" " border style (number)\n" -msgstr "" -" border\n" +msgstr " border\n" " Ñтиль рамки (чиÑло)\n" -#: help.c:478 -msgid "" -" columns\n" +#: help.c:461 +msgid " columns\n" " target width for the wrapped format\n" -msgstr "" -" columns\n" +msgstr " columns\n" " цільова ширина Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ñƒ з переноÑом\n" -#: help.c:480 -msgid "" -" expanded (or x)\n" +#: help.c:463 +msgid " expanded (or x)\n" " expanded output [on, off, auto]\n" -msgstr "" -" expanded (or x)\n" +msgstr " expanded (or x)\n" " розширений вивід [on, off, auto]\n" -#: help.c:482 +#: help.c:465 #, c-format -msgid "" -" fieldsep\n" +msgid " fieldsep\n" " field separator for unaligned output (default \"%s\")\n" -msgstr "" -" fieldsep\n" +msgstr " fieldsep\n" " розділювач полів Ð´Ð»Ñ Ð½Ðµ вирівнÑного виводу (за замовчуваннÑм \"%s\")\n" -#: help.c:485 -msgid "" -" fieldsep_zero\n" +#: help.c:468 +msgid " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" -msgstr "" -" fieldsep_zero\n" +msgstr " fieldsep_zero\n" " вÑтановити розділювач полів Ð´Ð»Ñ Ð½ÐµÐ²Ð¸Ñ€Ñ–Ð²Ð½Ñного виводу на нульовий байт\n" -#: help.c:487 -msgid "" -" footer\n" +#: help.c:470 +msgid " footer\n" " enable or disable display of the table footer [on, off]\n" -msgstr "" -" footer\n" +msgstr " footer\n" " вмикає або вимикає вивід підпиÑів таблиці [on, off]\n" -#: help.c:489 -msgid "" -" format\n" +#: help.c:472 +msgid " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -msgstr "" -" format\n" +msgstr " format\n" " вÑтановити формат виводу [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:491 -msgid "" -" linestyle\n" +#: help.c:474 +msgid " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" -msgstr "" -" linestyle\n" +msgstr " linestyle\n" " вÑтановлює Ñтиль Ð¼Ð°Ð»ÑŽÐ²Ð°Ð½Ð½Ñ Ð»Ñ–Ð½Ñ–Ð¹ рамки [ascii, old-ascii, unicode]\n" -#: help.c:493 -msgid "" -" null\n" +#: help.c:476 +msgid " null\n" " set the string to be printed in place of a null value\n" -msgstr "" -" null\n" +msgstr " null\n" " вÑтановлює Ñ€Ñдок, Ñкий буде виведено заміÑть Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ (null)\n" -#: help.c:495 -msgid "" -" numericlocale\n" +#: help.c:478 +msgid " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" -msgstr "" -" numericlocale\n" +msgstr " numericlocale\n" " вмикає Ð²Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð·Ð°Ð´Ð°Ð½Ð¾Ð³Ð¾ локалью роздільника групи цифр\n" -#: help.c:497 -msgid "" -" pager\n" +#: help.c:480 +msgid " pager\n" " control when an external pager is used [yes, no, always]\n" -msgstr "" -" pager\n" +msgstr " pager\n" " контролює викориÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð¾Ð²Ð½Ñ–ÑˆÐ½ÑŒÐ¾Ð³Ð¾ пейджера [yes, no, always]\n" -#: help.c:499 -msgid "" -" recordsep\n" +#: help.c:482 +msgid " recordsep\n" " record (line) separator for unaligned output\n" -msgstr "" -" recordsep\n" +msgstr " recordsep\n" " розділювач запиÑів (Ñ€Ñдків) Ð´Ð»Ñ Ð½Ðµ вирівнÑного виводу\n" -#: help.c:501 -msgid "" -" recordsep_zero\n" +#: help.c:484 +msgid " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" -msgstr "" -" recordsep_zero\n" +msgstr " recordsep_zero\n" " вÑтановлює розділювач запиÑів Ð´Ð»Ñ Ð½ÐµÐ²Ð¸Ñ€Ñ–Ð²Ð½Ñного виводу на нульовий байт\n" -#: help.c:503 -msgid "" -" tableattr (or T)\n" +#: help.c:486 +msgid " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" " column widths for left-aligned data types in latex-longtable format\n" -msgstr "" -" tableattr (або T)\n" +msgstr " tableattr (або T)\n" " вказує атрибути Ð´Ð»Ñ Ñ‚ÐµÐ³Ñƒ table у html форматі або пропорційні \n" " ширини Ñтовпців Ð´Ð»Ñ Ð²Ð¸Ñ€Ñ–Ð²Ð½Ñних вліво даних, у latex-longtable форматі\n" -#: help.c:506 -msgid "" -" title\n" +#: help.c:489 +msgid " title\n" " set the table title for subsequently printed tables\n" -msgstr "" -" title\n" +msgstr " title\n" " задає заголовок таблиці Ð´Ð»Ñ Ð¿Ð¾Ñлідовно друкованих таблиць\n" -#: help.c:508 -msgid "" -" tuples_only\n" +#: help.c:491 +msgid " tuples_only\n" " if set, only actual table data is shown\n" -msgstr "" -" tuples_only\n" +msgstr " tuples_only\n" " Ñкщо вÑтановлено, виводÑтьÑÑ Ð»Ð¸ÑˆÐµ фактичні табличні дані\n" -#: help.c:510 -msgid "" -" unicode_border_linestyle\n" +#: help.c:493 +msgid " unicode_border_linestyle\n" " unicode_column_linestyle\n" " unicode_header_linestyle\n" " set the style of Unicode line drawing [single, double]\n" -msgstr "" -" unicode_border_linestyle\n" +msgstr " unicode_border_linestyle\n" " unicode_column_linestyle\n" " unicode_header_linestyle\n" " задає Ñтиль Ð¼Ð°Ð»ÑŒÑŽÐ²Ð°Ð½Ð½Ñ Ð»Ñ–Ð½Ñ–Ð¹ (Unicode) [single, double]\n" -#: help.c:515 -msgid "" -"\n" +#: help.c:497 +msgid " xheader_width\n" +" set the maximum width of the header for expanded output\n" +" [full, column, page, integer value]\n" +msgstr " xheader_width\n" +" вÑтановити макÑимальну ширину заголовка Ð´Ð»Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¾Ð³Ð¾ виводу\n" +" [full, column, page, integer value]\n" + +#: help.c:501 +msgid "\n" "Environment variables:\n" -msgstr "" -"\n" +msgstr "\n" "Змінні оточеннÑ:\n" -#: help.c:519 -msgid "" -" NAME=VALUE [NAME=VALUE] psql ...\n" -" or \\setenv NAME [VALUE] inside psql\n" -"\n" -msgstr "" -" ІМ'Я=ЗÐÐЧЕÐÐЯ [ІМ'Я=ЗÐÐЧЕÐÐЯ] psql ...\n" -" або \\setenv ІМ'Я [VALUE] вÑередині psql\n" -"\n" +#: help.c:505 +msgid " NAME=VALUE [NAME=VALUE] psql ...\n" +" or \\setenv NAME [VALUE] inside psql\n\n" +msgstr " ІМ'Я=ЗÐÐЧЕÐÐЯ [ІМ'Я=ЗÐÐЧЕÐÐЯ] psql ...\n" +" або \\setenv ІМ'Я [VALUE] вÑередині psql\n\n" -#: help.c:521 -msgid "" -" set NAME=VALUE\n" +#: help.c:507 +msgid " set NAME=VALUE\n" " psql ...\n" -" or \\setenv NAME [VALUE] inside psql\n" -"\n" -msgstr "" -" вÑтановлює ІМ'Я=ЗÐÐЧЕÐÐЯ\n" +" or \\setenv NAME [VALUE] inside psql\n\n" +msgstr " вÑтановлює ІМ'Я=ЗÐÐЧЕÐÐЯ\n" " psql ...\n" -" або \\setenv ІМ'Я [VALUE] вÑередині psql\n" -"\n" +" або \\setenv ІМ'Я [VALUE] вÑередині psql\n\n" -#: help.c:524 -msgid "" -" COLUMNS\n" +#: help.c:510 +msgid " COLUMNS\n" " number of columns for wrapped format\n" -msgstr "" -" COLUMNS\n" +msgstr " COLUMNS\n" " чиÑло Ñтовпців Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð· переноÑом\n" -#: help.c:526 -msgid "" -" PGAPPNAME\n" +#: help.c:512 +msgid " PGAPPNAME\n" " same as the application_name connection parameter\n" -msgstr "" -" PGAPPNAME\n" +msgstr " PGAPPNAME\n" " те Ñаме, що параметр Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ application_name\n" -#: help.c:528 -msgid "" -" PGDATABASE\n" +#: help.c:514 +msgid " PGDATABASE\n" " same as the dbname connection parameter\n" -msgstr "" -" PGDATABASE\n" +msgstr " PGDATABASE\n" " те Ñаме, що параметр Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ dbname\n" -#: help.c:530 -msgid "" -" PGHOST\n" +#: help.c:516 +msgid " PGHOST\n" " same as the host connection parameter\n" -msgstr "" -" PGHOST\n" +msgstr " PGHOST\n" " те Ñаме, що параметр Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ host\n" -#: help.c:532 -msgid "" -" PGPASSFILE\n" +#: help.c:518 +msgid " PGPASSFILE\n" " password file name\n" -msgstr "" -" PGPASSFILE\n" +msgstr " PGPASSFILE\n" " назва файлу з паролем\n" -#: help.c:534 -msgid "" -" PGPASSWORD\n" +#: help.c:520 +msgid " PGPASSWORD\n" " connection password (not recommended)\n" -msgstr "" -" PGPASSWORD\n" +msgstr " PGPASSWORD\n" " пароль Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ (не рекомендуєтьÑÑ)\n" -#: help.c:536 -msgid "" -" PGPORT\n" +#: help.c:522 +msgid " PGPORT\n" " same as the port connection parameter\n" -msgstr "" -" PGPORT\n" +msgstr " PGPORT\n" " те Ñаме, що параметр Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ port\n" -#: help.c:538 -msgid "" -" PGUSER\n" +#: help.c:524 +msgid " PGUSER\n" " same as the user connection parameter\n" -msgstr "" -" PGUSER\n" +msgstr " PGUSER\n" " те Ñаме, що параметр Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ user\n" -#: help.c:540 -msgid "" -" PSQL_EDITOR, EDITOR, VISUAL\n" +#: help.c:526 +msgid " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" -msgstr "" -" PSQL_EDITOR, EDITOR, VISUAL\n" +msgstr " PSQL_EDITOR, EDITOR, VISUAL\n" " редактор Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ \\e, \\ef Ñ– \\ev\n" -#: help.c:542 -msgid "" -" PSQL_EDITOR_LINENUMBER_ARG\n" +#: help.c:528 +msgid " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" -msgstr "" -" PSQL_EDITOR_LINENUMBER_ARG\n" +msgstr " PSQL_EDITOR_LINENUMBER_ARG\n" " Ñк вказати номер Ñ€Ñдка при виклику редактора\n" -#: help.c:544 -msgid "" -" PSQL_HISTORY\n" +#: help.c:530 +msgid " PSQL_HISTORY\n" " alternative location for the command history file\n" -msgstr "" -" PSQL_HISTORY\n" +msgstr " PSQL_HISTORY\n" " альтернативне Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñƒ з Ñ–Ñторією команд\n" -#: help.c:546 -msgid "" -" PSQL_PAGER, PAGER\n" +#: help.c:532 +msgid " PSQL_PAGER, PAGER\n" " name of external pager program\n" -msgstr "" -" PSQL_PAGER, PAGER\n" +msgstr " PSQL_PAGER, PAGER\n" " ім'Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ зовнішнього пейджеру\n" -#: help.c:549 -msgid "" -" PSQL_WATCH_PAGER\n" +#: help.c:535 +msgid " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" -msgstr "" -" PSQL_WATCH_PAGER\n" +msgstr " PSQL_WATCH_PAGER\n" " назва зовнішньої програми-пейджера Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð· \\watch\n" -#: help.c:552 -msgid "" -" PSQLRC\n" +#: help.c:538 +msgid " PSQLRC\n" " alternative location for the user's .psqlrc file\n" -msgstr "" -" PSQLRC\n" +msgstr " PSQLRC\n" " альтернативне Ñ€Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувацького файла .psqlrc\n" -#: help.c:554 -msgid "" -" SHELL\n" +#: help.c:540 +msgid " SHELL\n" " shell used by the \\! command\n" -msgstr "" -" SHELL\n" +msgstr " SHELL\n" " оболонка, що викориÑтовуєтьÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾ÑŽ \\!\n" -#: help.c:556 -msgid "" -" TMPDIR\n" +#: help.c:542 +msgid " TMPDIR\n" " directory for temporary files\n" -msgstr "" -" TMPDIR\n" +msgstr " TMPDIR\n" " каталог Ð´Ð»Ñ Ñ‚Ð¸Ð¼Ñ‡Ð°Ñових файлів\n" -#: help.c:616 +#: help.c:602 msgid "Available help:\n" msgstr "ДоÑтупна довідка:\n" -#: help.c:711 +#: help.c:697 #, c-format -msgid "" -"Command: %s\n" +msgid "Command: %s\n" "Description: %s\n" "Syntax:\n" -"%s\n" -"\n" -"URL: %s\n" -"\n" -msgstr "" -"Команда: %s\n" +"%s\n\n" +"URL: %s\n\n" +msgstr "Команда: %s\n" "ОпиÑ: %s\n" "СинтакÑиÑ:\n" -"%s\n" -"\n" -"URL: %s\n" -"\n" +"%s\n\n" +"URL: %s\n\n" -#: help.c:734 +#: help.c:720 #, c-format -msgid "" -"No help available for \"%s\".\n" +msgid "No help available for \"%s\".\n" "Try \\h with no arguments to see available help.\n" -msgstr "" -"Ðемає доÑтупної довідки по команді \"%s\".\n" +msgstr "Ðемає доÑтупної довідки по команді \"%s\".\n" "Спробуйте \\h без аргументів, щоб подивитиÑÑŒ доÑтупну довідку.\n" -#: input.c:217 +#: input.c:215 #, c-format msgid "could not read from input file: %m" msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з вхідного файлу: %m" -#: input.c:478 input.c:516 +#: input.c:476 input.c:514 #, c-format msgid "could not save history to file \"%s\": %m" msgstr "не можливо зберегти Ñ–Ñторію в файлі \"%s\": %m" -#: input.c:535 +#: input.c:533 #, c-format msgid "history is not supported by this installation" msgstr "Ñ†Ñ ÑƒÑтановка не підтримує Ñ–Ñторію" @@ -3882,11 +3787,9 @@ msgid "Use \"\\q\" to leave %s.\n" msgstr "Введіть \"\\q\", щоб вийти з %s.\n" #: mainloop.c:214 -msgid "" -"The input is a PostgreSQL custom-format dump.\n" +msgid "The input is a PostgreSQL custom-format dump.\n" "Use the pg_restore command-line client to restore this dump to a database.\n" -msgstr "" -"Ввід ÑвлÑÑ” Ñобою Ñпеціальний формат дампу PostgreSQL.\n" +msgstr "Ввід ÑвлÑÑ” Ñобою Ñпеціальний формат дампу PostgreSQL.\n" "Щоб відновити базу даних з цього дампу, ÑкориÑтайтеÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾ÑŽ pg_restore.\n" #: mainloop.c:295 @@ -3903,14 +3806,12 @@ msgstr "Ви викориÑтовуєте psql — Ñ–Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ ÐºÐ¾Ð¼Ð°Ð½ #: mainloop.c:302 #, c-format -msgid "" -"Type: \\copyright for distribution terms\n" +msgid "Type: \\copyright for distribution terms\n" " \\h for help with SQL commands\n" " \\? for help with psql commands\n" " \\g or terminate with semicolon to execute query\n" " \\q to quit\n" -msgstr "" -"Введіть: \\copyright Ð´Ð»Ñ ÑƒÐ¼Ð¾Ð² розповÑюдженнÑ\n" +msgstr "Введіть: \\copyright Ð´Ð»Ñ ÑƒÐ¼Ð¾Ð² розповÑюдженнÑ\n" " \\h Ð´Ð»Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¸ по командах SQL\n" " \\? Ð´Ð»Ñ Ð´Ð¾Ð²Ñ–Ð´ÐºÐ¸ по командах psql\n" " \\g або крапку з комою в кінці Ñ€Ñдка Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð°Ð¿Ð¸Ñ‚Ñƒ\n" @@ -3938,12 +3839,12 @@ msgstr "запит ігноруєтьÑÑ; введіть \\endif або нат msgid "reached EOF without finding closing \\endif(s)" msgstr "доÑÑгнуто ÐºÑ–Ð½Ñ†Ñ Ñ„Ð°Ð¹Ð»Ñƒ без завершального \\endif" -#: psqlscanslash.l:638 +#: psqlscanslash.l:642 #, c-format msgid "unterminated quoted string" msgstr "незавершений Ñ€Ñдок в лапках" -#: psqlscanslash.l:811 +#: psqlscanslash.l:842 #, c-format msgid "%s: out of memory" msgstr "%s: бракує пам'Ñті" @@ -3951,2410 +3852,2447 @@ msgstr "%s: бракує пам'Ñті" #: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 #: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 #: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 -#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238 -#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248 -#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267 -#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323 -#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443 -#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524 -#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595 -#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606 -#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668 -#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714 -#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747 -#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802 -#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859 -#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900 -#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999 -#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 -#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071 -#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086 -#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116 -#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141 -#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 -#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163 -#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310 -#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320 -#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445 -#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474 -#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486 -#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507 -#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523 -#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548 -#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577 -#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 -#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687 -#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696 -#: sql_help.c:1699 sql_help.c:1749 sql_help.c:1765 sql_help.c:1996 -#: sql_help.c:2065 sql_help.c:2084 sql_help.c:2097 sql_help.c:2154 -#: sql_help.c:2161 sql_help.c:2171 sql_help.c:2197 sql_help.c:2228 -#: sql_help.c:2246 sql_help.c:2274 sql_help.c:2385 sql_help.c:2431 -#: sql_help.c:2456 sql_help.c:2479 sql_help.c:2483 sql_help.c:2517 -#: sql_help.c:2537 sql_help.c:2559 sql_help.c:2573 sql_help.c:2594 -#: sql_help.c:2623 sql_help.c:2658 sql_help.c:2683 sql_help.c:2730 -#: sql_help.c:3025 sql_help.c:3038 sql_help.c:3055 sql_help.c:3071 -#: sql_help.c:3111 sql_help.c:3165 sql_help.c:3169 sql_help.c:3171 -#: sql_help.c:3178 sql_help.c:3197 sql_help.c:3224 sql_help.c:3259 -#: sql_help.c:3271 sql_help.c:3280 sql_help.c:3324 sql_help.c:3338 -#: sql_help.c:3366 sql_help.c:3374 sql_help.c:3386 sql_help.c:3396 -#: sql_help.c:3404 sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 -#: sql_help.c:3437 sql_help.c:3448 sql_help.c:3456 sql_help.c:3464 -#: sql_help.c:3472 sql_help.c:3480 sql_help.c:3490 sql_help.c:3499 -#: sql_help.c:3508 sql_help.c:3516 sql_help.c:3526 sql_help.c:3537 -#: sql_help.c:3545 sql_help.c:3554 sql_help.c:3565 sql_help.c:3574 -#: sql_help.c:3582 sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 -#: sql_help.c:3614 sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 -#: sql_help.c:3646 sql_help.c:3654 sql_help.c:3671 sql_help.c:3680 -#: sql_help.c:3688 sql_help.c:3705 sql_help.c:3720 sql_help.c:4030 -#: sql_help.c:4140 sql_help.c:4169 sql_help.c:4184 sql_help.c:4679 -#: sql_help.c:4727 sql_help.c:4878 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:245 +#: sql_help.c:247 sql_help.c:248 sql_help.c:250 sql_help.c:252 sql_help.c:255 +#: sql_help.c:257 sql_help.c:259 sql_help.c:261 sql_help.c:276 sql_help.c:277 +#: sql_help.c:278 sql_help.c:280 sql_help.c:329 sql_help.c:331 sql_help.c:333 +#: sql_help.c:335 sql_help.c:404 sql_help.c:409 sql_help.c:411 sql_help.c:453 +#: sql_help.c:455 sql_help.c:458 sql_help.c:460 sql_help.c:529 sql_help.c:534 +#: sql_help.c:539 sql_help.c:544 sql_help.c:549 sql_help.c:603 sql_help.c:605 +#: sql_help.c:607 sql_help.c:609 sql_help.c:611 sql_help.c:614 sql_help.c:616 +#: sql_help.c:619 sql_help.c:630 sql_help.c:632 sql_help.c:676 sql_help.c:678 +#: sql_help.c:680 sql_help.c:683 sql_help.c:685 sql_help.c:687 sql_help.c:728 +#: sql_help.c:732 sql_help.c:736 sql_help.c:757 sql_help.c:760 sql_help.c:763 +#: sql_help.c:792 sql_help.c:804 sql_help.c:812 sql_help.c:815 sql_help.c:818 +#: sql_help.c:833 sql_help.c:836 sql_help.c:865 sql_help.c:870 sql_help.c:875 +#: sql_help.c:880 sql_help.c:885 sql_help.c:912 sql_help.c:914 sql_help.c:916 +#: sql_help.c:918 sql_help.c:921 sql_help.c:923 sql_help.c:970 sql_help.c:1015 +#: sql_help.c:1020 sql_help.c:1025 sql_help.c:1030 sql_help.c:1035 +#: sql_help.c:1054 sql_help.c:1065 sql_help.c:1067 sql_help.c:1087 +#: sql_help.c:1097 sql_help.c:1098 sql_help.c:1100 sql_help.c:1102 +#: sql_help.c:1114 sql_help.c:1118 sql_help.c:1120 sql_help.c:1132 +#: sql_help.c:1134 sql_help.c:1136 sql_help.c:1138 sql_help.c:1157 +#: sql_help.c:1159 sql_help.c:1163 sql_help.c:1167 sql_help.c:1171 +#: sql_help.c:1174 sql_help.c:1175 sql_help.c:1176 sql_help.c:1179 +#: sql_help.c:1182 sql_help.c:1184 sql_help.c:1324 sql_help.c:1326 +#: sql_help.c:1329 sql_help.c:1332 sql_help.c:1334 sql_help.c:1336 +#: sql_help.c:1339 sql_help.c:1342 sql_help.c:1464 sql_help.c:1466 +#: sql_help.c:1468 sql_help.c:1471 sql_help.c:1492 sql_help.c:1495 +#: sql_help.c:1498 sql_help.c:1501 sql_help.c:1505 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1525 sql_help.c:1528 +#: sql_help.c:1530 sql_help.c:1532 sql_help.c:1542 sql_help.c:1544 +#: sql_help.c:1554 sql_help.c:1556 sql_help.c:1566 sql_help.c:1569 +#: sql_help.c:1592 sql_help.c:1594 sql_help.c:1596 sql_help.c:1598 +#: sql_help.c:1601 sql_help.c:1603 sql_help.c:1606 sql_help.c:1609 +#: sql_help.c:1660 sql_help.c:1703 sql_help.c:1706 sql_help.c:1708 +#: sql_help.c:1710 sql_help.c:1713 sql_help.c:1715 sql_help.c:1717 +#: sql_help.c:1720 sql_help.c:1770 sql_help.c:1786 sql_help.c:2019 +#: sql_help.c:2088 sql_help.c:2107 sql_help.c:2120 sql_help.c:2178 +#: sql_help.c:2186 sql_help.c:2196 sql_help.c:2224 sql_help.c:2257 +#: sql_help.c:2275 sql_help.c:2303 sql_help.c:2414 sql_help.c:2460 +#: sql_help.c:2485 sql_help.c:2508 sql_help.c:2512 sql_help.c:2546 +#: sql_help.c:2566 sql_help.c:2588 sql_help.c:2602 sql_help.c:2623 +#: sql_help.c:2652 sql_help.c:2685 sql_help.c:2708 sql_help.c:2755 +#: sql_help.c:3053 sql_help.c:3066 sql_help.c:3083 sql_help.c:3099 +#: sql_help.c:3139 sql_help.c:3193 sql_help.c:3197 sql_help.c:3199 +#: sql_help.c:3206 sql_help.c:3225 sql_help.c:3252 sql_help.c:3287 +#: sql_help.c:3299 sql_help.c:3308 sql_help.c:3352 sql_help.c:3366 +#: sql_help.c:3394 sql_help.c:3402 sql_help.c:3414 sql_help.c:3424 +#: sql_help.c:3432 sql_help.c:3440 sql_help.c:3448 sql_help.c:3456 +#: sql_help.c:3465 sql_help.c:3476 sql_help.c:3484 sql_help.c:3492 +#: sql_help.c:3500 sql_help.c:3508 sql_help.c:3518 sql_help.c:3527 +#: sql_help.c:3536 sql_help.c:3544 sql_help.c:3554 sql_help.c:3565 +#: sql_help.c:3573 sql_help.c:3582 sql_help.c:3593 sql_help.c:3602 +#: sql_help.c:3610 sql_help.c:3618 sql_help.c:3626 sql_help.c:3634 +#: sql_help.c:3642 sql_help.c:3650 sql_help.c:3658 sql_help.c:3666 +#: sql_help.c:3674 sql_help.c:3682 sql_help.c:3699 sql_help.c:3708 +#: sql_help.c:3716 sql_help.c:3733 sql_help.c:3748 sql_help.c:4061 +#: sql_help.c:4182 sql_help.c:4211 sql_help.c:4227 sql_help.c:4229 +#: sql_help.c:4733 sql_help.c:4781 sql_help.c:4940 msgid "name" msgstr "назва" -#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1846 -#: sql_help.c:3339 sql_help.c:4455 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:340 sql_help.c:1863 +#: sql_help.c:3367 sql_help.c:4500 msgid "aggregate_signature" msgstr "Ñигнатура_агр_функції" -#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253 -#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576 -#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798 -#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008 -#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105 -#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444 -#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534 -#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693 +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:260 +#: sql_help.c:281 sql_help.c:412 sql_help.c:459 sql_help.c:538 sql_help.c:586 +#: sql_help.c:604 sql_help.c:631 sql_help.c:684 sql_help.c:759 sql_help.c:814 +#: sql_help.c:835 sql_help.c:874 sql_help.c:924 sql_help.c:971 sql_help.c:1024 +#: sql_help.c:1056 sql_help.c:1066 sql_help.c:1101 sql_help.c:1121 +#: sql_help.c:1135 sql_help.c:1185 sql_help.c:1333 sql_help.c:1465 +#: sql_help.c:1508 sql_help.c:1529 sql_help.c:1543 sql_help.c:1555 +#: sql_help.c:1568 sql_help.c:1595 sql_help.c:1661 sql_help.c:1714 msgid "new_name" msgstr "нова_назва" -#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251 -#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623 -#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801 -#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 -#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 -#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510 -#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3011 +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:258 +#: sql_help.c:279 sql_help.c:410 sql_help.c:495 sql_help.c:543 sql_help.c:633 +#: sql_help.c:642 sql_help.c:707 sql_help.c:731 sql_help.c:762 sql_help.c:817 +#: sql_help.c:879 sql_help.c:922 sql_help.c:1029 sql_help.c:1068 +#: sql_help.c:1099 sql_help.c:1119 sql_help.c:1133 sql_help.c:1183 +#: sql_help.c:1399 sql_help.c:1467 sql_help.c:1510 sql_help.c:1531 +#: sql_help.c:1593 sql_help.c:1709 sql_help.c:3039 msgid "new_owner" msgstr "новий_влаÑник" -#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322 -#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749 -#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087 -#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512 -#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:262 sql_help.c:332 +#: sql_help.c:461 sql_help.c:548 sql_help.c:686 sql_help.c:735 sql_help.c:765 +#: sql_help.c:820 sql_help.c:884 sql_help.c:1034 sql_help.c:1103 +#: sql_help.c:1137 sql_help.c:1335 sql_help.c:1512 sql_help.c:1533 +#: sql_help.c:1545 sql_help.c:1557 sql_help.c:1597 sql_help.c:1716 msgid "new_schema" msgstr "нова_Ñхема" -#: sql_help.c:44 sql_help.c:1910 sql_help.c:3340 sql_help.c:4484 +#: sql_help.c:44 sql_help.c:1927 sql_help.c:3368 sql_help.c:4529 msgid "where aggregate_signature is:" msgstr "де Ñигнатура_агр_функції:" -#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353 -#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520 -#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 -#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 -#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 -#: sql_help.c:1864 sql_help.c:1881 sql_help.c:1887 sql_help.c:1911 -#: sql_help.c:1914 sql_help.c:1917 sql_help.c:2066 sql_help.c:2085 -#: sql_help.c:2088 sql_help.c:2386 sql_help.c:2595 sql_help.c:3341 -#: sql_help.c:3344 sql_help.c:3347 sql_help.c:3438 sql_help.c:3527 -#: sql_help.c:3555 sql_help.c:3905 sql_help.c:4354 sql_help.c:4461 -#: sql_help.c:4468 sql_help.c:4474 sql_help.c:4485 sql_help.c:4488 -#: sql_help.c:4491 +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:350 sql_help.c:363 +#: sql_help.c:367 sql_help.c:383 sql_help.c:386 sql_help.c:389 sql_help.c:530 +#: sql_help.c:535 sql_help.c:540 sql_help.c:545 sql_help.c:550 sql_help.c:866 +#: sql_help.c:871 sql_help.c:876 sql_help.c:881 sql_help.c:886 sql_help.c:1016 +#: sql_help.c:1021 sql_help.c:1026 sql_help.c:1031 sql_help.c:1036 +#: sql_help.c:1881 sql_help.c:1898 sql_help.c:1904 sql_help.c:1928 +#: sql_help.c:1931 sql_help.c:1934 sql_help.c:2089 sql_help.c:2108 +#: sql_help.c:2111 sql_help.c:2415 sql_help.c:2624 sql_help.c:3369 +#: sql_help.c:3372 sql_help.c:3375 sql_help.c:3466 sql_help.c:3555 +#: sql_help.c:3583 sql_help.c:3936 sql_help.c:4399 sql_help.c:4506 +#: sql_help.c:4513 sql_help.c:4519 sql_help.c:4530 sql_help.c:4533 +#: sql_help.c:4536 msgid "argmode" msgstr "режим_аргументу" -#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354 -#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 -#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 -#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 -#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 -#: sql_help.c:1865 sql_help.c:1882 sql_help.c:1888 sql_help.c:1912 -#: sql_help.c:1915 sql_help.c:1918 sql_help.c:2067 sql_help.c:2086 -#: sql_help.c:2089 sql_help.c:2387 sql_help.c:2596 sql_help.c:3342 -#: sql_help.c:3345 sql_help.c:3348 sql_help.c:3439 sql_help.c:3528 -#: sql_help.c:3556 sql_help.c:4462 sql_help.c:4469 sql_help.c:4475 -#: sql_help.c:4486 sql_help.c:4489 sql_help.c:4492 +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:351 sql_help.c:364 +#: sql_help.c:368 sql_help.c:384 sql_help.c:387 sql_help.c:390 sql_help.c:531 +#: sql_help.c:536 sql_help.c:541 sql_help.c:546 sql_help.c:551 sql_help.c:867 +#: sql_help.c:872 sql_help.c:877 sql_help.c:882 sql_help.c:887 sql_help.c:1017 +#: sql_help.c:1022 sql_help.c:1027 sql_help.c:1032 sql_help.c:1037 +#: sql_help.c:1882 sql_help.c:1899 sql_help.c:1905 sql_help.c:1929 +#: sql_help.c:1932 sql_help.c:1935 sql_help.c:2090 sql_help.c:2109 +#: sql_help.c:2112 sql_help.c:2416 sql_help.c:2625 sql_help.c:3370 +#: sql_help.c:3373 sql_help.c:3376 sql_help.c:3467 sql_help.c:3556 +#: sql_help.c:3584 sql_help.c:4507 sql_help.c:4514 sql_help.c:4520 +#: sql_help.c:4531 sql_help.c:4534 sql_help.c:4537 msgid "argname" msgstr "ім'Ñ_аргументу" -#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355 -#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 -#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 -#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 -#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 -#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 -#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2388 sql_help.c:2597 -#: sql_help.c:3343 sql_help.c:3346 sql_help.c:3349 sql_help.c:3440 -#: sql_help.c:3529 sql_help.c:3557 sql_help.c:4463 sql_help.c:4470 -#: sql_help.c:4476 sql_help.c:4487 sql_help.c:4490 sql_help.c:4493 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:352 sql_help.c:365 +#: sql_help.c:369 sql_help.c:385 sql_help.c:388 sql_help.c:391 sql_help.c:532 +#: sql_help.c:537 sql_help.c:542 sql_help.c:547 sql_help.c:552 sql_help.c:868 +#: sql_help.c:873 sql_help.c:878 sql_help.c:883 sql_help.c:888 sql_help.c:1018 +#: sql_help.c:1023 sql_help.c:1028 sql_help.c:1033 sql_help.c:1038 +#: sql_help.c:1883 sql_help.c:1900 sql_help.c:1906 sql_help.c:1930 +#: sql_help.c:1933 sql_help.c:1936 sql_help.c:2417 sql_help.c:2626 +#: sql_help.c:3371 sql_help.c:3374 sql_help.c:3377 sql_help.c:3468 +#: sql_help.c:3557 sql_help.c:3585 sql_help.c:4508 sql_help.c:4515 +#: sql_help.c:4521 sql_help.c:4532 sql_help.c:4535 sql_help.c:4538 msgid "argtype" msgstr "тип_аргументу" -#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 -#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666 -#: sql_help.c:1718 sql_help.c:1781 sql_help.c:1967 sql_help.c:1974 -#: sql_help.c:2277 sql_help.c:2327 sql_help.c:2334 sql_help.c:2343 -#: sql_help.c:2432 sql_help.c:2659 sql_help.c:2752 sql_help.c:3040 -#: sql_help.c:3225 sql_help.c:3247 sql_help.c:3387 sql_help.c:3742 -#: sql_help.c:3949 sql_help.c:4183 sql_help.c:4941 +#: sql_help.c:114 sql_help.c:407 sql_help.c:484 sql_help.c:496 sql_help.c:965 +#: sql_help.c:1116 sql_help.c:1526 sql_help.c:1655 sql_help.c:1687 +#: sql_help.c:1739 sql_help.c:1798 sql_help.c:1987 sql_help.c:1994 +#: sql_help.c:2306 sql_help.c:2356 sql_help.c:2363 sql_help.c:2372 +#: sql_help.c:2461 sql_help.c:2686 sql_help.c:2777 sql_help.c:3068 +#: sql_help.c:3253 sql_help.c:3275 sql_help.c:3415 sql_help.c:3772 +#: sql_help.c:3980 sql_help.c:4226 sql_help.c:4228 sql_help.c:5006 msgid "option" msgstr "параметр" -#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2433 -#: sql_help.c:2660 sql_help.c:3226 sql_help.c:3388 +#: sql_help.c:115 sql_help.c:966 sql_help.c:1656 sql_help.c:2462 +#: sql_help.c:2687 sql_help.c:3254 sql_help.c:3416 msgid "where option can be:" msgstr "де параметр може бути:" -#: sql_help.c:116 sql_help.c:2209 +#: sql_help.c:116 sql_help.c:2238 msgid "allowconn" msgstr "дозвол_підкл" -#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2210 -#: sql_help.c:2434 sql_help.c:2661 sql_help.c:3227 +#: sql_help.c:117 sql_help.c:967 sql_help.c:1657 sql_help.c:2239 +#: sql_help.c:2463 sql_help.c:2688 sql_help.c:3255 msgid "connlimit" msgstr "ліміт_підключень" -#: sql_help.c:118 sql_help.c:2211 +#: sql_help.c:118 sql_help.c:2240 msgid "istemplate" msgstr "чи_шаблон" -#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322 -#: sql_help.c:1374 sql_help.c:4187 +#: sql_help.c:124 sql_help.c:621 sql_help.c:689 sql_help.c:703 sql_help.c:1338 +#: sql_help.c:1392 sql_help.c:4232 msgid "new_tablespace" msgstr "новий_табл_проÑтір" -#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550 -#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 -#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 -#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643 -#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2398 sql_help.c:2601 -#: sql_help.c:3917 sql_help.c:4205 sql_help.c:4366 sql_help.c:4668 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:558 sql_help.c:560 +#: sql_help.c:561 sql_help.c:891 sql_help.c:893 sql_help.c:894 sql_help.c:974 +#: sql_help.c:978 sql_help.c:981 sql_help.c:1043 sql_help.c:1045 +#: sql_help.c:1046 sql_help.c:1196 sql_help.c:1198 sql_help.c:1664 +#: sql_help.c:1668 sql_help.c:1671 sql_help.c:2427 sql_help.c:2630 +#: sql_help.c:3948 sql_help.c:4250 sql_help.c:4411 sql_help.c:4721 msgid "configuration_parameter" msgstr "параметр_конфігурації" -#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487 -#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876 -#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101 -#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157 -#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182 -#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449 -#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667 -#: sql_help.c:2278 sql_help.c:2328 sql_help.c:2335 sql_help.c:2344 -#: sql_help.c:2399 sql_help.c:2400 sql_help.c:2464 sql_help.c:2467 -#: sql_help.c:2501 sql_help.c:2602 sql_help.c:2603 sql_help.c:2626 -#: sql_help.c:2753 sql_help.c:2792 sql_help.c:2902 sql_help.c:2915 -#: sql_help.c:2929 sql_help.c:2970 sql_help.c:2997 sql_help.c:3014 -#: sql_help.c:3041 sql_help.c:3248 sql_help.c:3950 sql_help.c:4669 -#: sql_help.c:4670 +#: sql_help.c:128 sql_help.c:408 sql_help.c:479 sql_help.c:485 sql_help.c:497 +#: sql_help.c:559 sql_help.c:613 sql_help.c:695 sql_help.c:705 sql_help.c:892 +#: sql_help.c:920 sql_help.c:975 sql_help.c:1044 sql_help.c:1117 +#: sql_help.c:1162 sql_help.c:1166 sql_help.c:1170 sql_help.c:1173 +#: sql_help.c:1178 sql_help.c:1181 sql_help.c:1197 sql_help.c:1371 +#: sql_help.c:1394 sql_help.c:1442 sql_help.c:1450 sql_help.c:1470 +#: sql_help.c:1527 sql_help.c:1611 sql_help.c:1665 sql_help.c:1688 +#: sql_help.c:2307 sql_help.c:2357 sql_help.c:2364 sql_help.c:2373 +#: sql_help.c:2428 sql_help.c:2429 sql_help.c:2493 sql_help.c:2496 +#: sql_help.c:2530 sql_help.c:2631 sql_help.c:2632 sql_help.c:2655 +#: sql_help.c:2778 sql_help.c:2817 sql_help.c:2927 sql_help.c:2940 +#: sql_help.c:2954 sql_help.c:2995 sql_help.c:3003 sql_help.c:3025 +#: sql_help.c:3042 sql_help.c:3069 sql_help.c:3276 sql_help.c:3981 +#: sql_help.c:4722 sql_help.c:4723 sql_help.c:4724 sql_help.c:4725 msgid "value" msgstr "значеннÑ" -#: sql_help.c:200 +#: sql_help.c:202 msgid "target_role" msgstr "цільова_роль" -#: sql_help.c:201 sql_help.c:913 sql_help.c:2262 sql_help.c:2631 -#: sql_help.c:2708 sql_help.c:2713 sql_help.c:3880 sql_help.c:3889 -#: sql_help.c:3908 sql_help.c:3920 sql_help.c:4329 sql_help.c:4338 -#: sql_help.c:4357 sql_help.c:4369 +#: sql_help.c:203 sql_help.c:929 sql_help.c:2291 sql_help.c:2660 +#: sql_help.c:2733 sql_help.c:2738 sql_help.c:3911 sql_help.c:3920 +#: sql_help.c:3939 sql_help.c:3951 sql_help.c:4374 sql_help.c:4383 +#: sql_help.c:4402 sql_help.c:4414 msgid "schema_name" msgstr "ім'Ñ_Ñхеми" -#: sql_help.c:202 +#: sql_help.c:204 msgid "abbreviated_grant_or_revoke" msgstr "Ñкорочено_GRANT_або_REVOKE" -#: sql_help.c:203 +#: sql_help.c:205 msgid "where abbreviated_grant_or_revoke is one of:" msgstr "де Ñкорочено_GRANT_або_REVOKE Ñ” одним з:" -#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 -#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 -#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 -#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2437 sql_help.c:2438 -#: sql_help.c:2439 sql_help.c:2440 sql_help.c:2441 sql_help.c:2575 -#: sql_help.c:2664 sql_help.c:2665 sql_help.c:2666 sql_help.c:2667 -#: sql_help.c:2668 sql_help.c:3230 sql_help.c:3231 sql_help.c:3232 -#: sql_help.c:3233 sql_help.c:3234 sql_help.c:3929 sql_help.c:3933 -#: sql_help.c:4378 sql_help.c:4382 sql_help.c:4689 +#: sql_help.c:206 sql_help.c:207 sql_help.c:208 sql_help.c:209 sql_help.c:210 +#: sql_help.c:211 sql_help.c:212 sql_help.c:213 sql_help.c:214 sql_help.c:215 +#: sql_help.c:584 sql_help.c:620 sql_help.c:688 sql_help.c:838 sql_help.c:985 +#: sql_help.c:1337 sql_help.c:1675 sql_help.c:2466 sql_help.c:2467 +#: sql_help.c:2468 sql_help.c:2469 sql_help.c:2470 sql_help.c:2604 +#: sql_help.c:2691 sql_help.c:2692 sql_help.c:2693 sql_help.c:3258 +#: sql_help.c:3259 sql_help.c:3260 sql_help.c:3261 sql_help.c:3262 +#: sql_help.c:3960 sql_help.c:3964 sql_help.c:4423 sql_help.c:4427 +#: sql_help.c:4743 msgid "role_name" msgstr "ім'Ñ_ролі" -#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339 -#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684 -#: sql_help.c:2231 sql_help.c:2235 sql_help.c:2347 sql_help.c:2352 -#: sql_help.c:2460 sql_help.c:2630 sql_help.c:2769 sql_help.c:2774 -#: sql_help.c:2776 sql_help.c:2897 sql_help.c:2910 sql_help.c:2924 -#: sql_help.c:2933 sql_help.c:2945 sql_help.c:2974 sql_help.c:3981 -#: sql_help.c:3996 sql_help.c:3998 sql_help.c:4085 sql_help.c:4088 -#: sql_help.c:4090 sql_help.c:4546 sql_help.c:4547 sql_help.c:4556 -#: sql_help.c:4598 sql_help.c:4599 sql_help.c:4600 sql_help.c:4601 -#: sql_help.c:4602 sql_help.c:4603 sql_help.c:4643 sql_help.c:4644 -#: sql_help.c:4649 sql_help.c:4654 sql_help.c:4795 sql_help.c:4796 -#: sql_help.c:4805 sql_help.c:4847 sql_help.c:4848 sql_help.c:4849 -#: sql_help.c:4850 sql_help.c:4851 sql_help.c:4852 sql_help.c:4906 -#: sql_help.c:4908 sql_help.c:4968 sql_help.c:5026 sql_help.c:5027 -#: sql_help.c:5036 sql_help.c:5078 sql_help.c:5079 sql_help.c:5080 -#: sql_help.c:5081 sql_help.c:5082 sql_help.c:5083 +#: sql_help.c:246 sql_help.c:265 sql_help.c:472 sql_help.c:928 sql_help.c:1353 +#: sql_help.c:1355 sql_help.c:1359 sql_help.c:1409 sql_help.c:1421 +#: sql_help.c:1446 sql_help.c:1705 sql_help.c:2260 sql_help.c:2264 +#: sql_help.c:2376 sql_help.c:2381 sql_help.c:2489 sql_help.c:2659 +#: sql_help.c:2794 sql_help.c:2799 sql_help.c:2801 sql_help.c:2922 +#: sql_help.c:2935 sql_help.c:2949 sql_help.c:2958 sql_help.c:2970 +#: sql_help.c:2999 sql_help.c:4012 sql_help.c:4027 sql_help.c:4029 +#: sql_help.c:4125 sql_help.c:4128 sql_help.c:4130 sql_help.c:4593 +#: sql_help.c:4594 sql_help.c:4603 sql_help.c:4650 sql_help.c:4651 +#: sql_help.c:4652 sql_help.c:4653 sql_help.c:4654 sql_help.c:4655 +#: sql_help.c:4696 sql_help.c:4697 sql_help.c:4702 sql_help.c:4707 +#: sql_help.c:4851 sql_help.c:4852 sql_help.c:4861 sql_help.c:4908 +#: sql_help.c:4909 sql_help.c:4910 sql_help.c:4911 sql_help.c:4912 +#: sql_help.c:4913 sql_help.c:4968 sql_help.c:4970 sql_help.c:5036 +#: sql_help.c:5096 sql_help.c:5097 sql_help.c:5106 sql_help.c:5153 +#: sql_help.c:5154 sql_help.c:5155 sql_help.c:5156 sql_help.c:5157 +#: sql_help.c:5158 msgid "expression" msgstr "вираз" -#: sql_help.c:242 +#: sql_help.c:249 sql_help.c:2261 msgid "domain_constraint" msgstr "обмеженнÑ_домену" -#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 -#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363 -#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1852 -#: sql_help.c:1854 sql_help.c:2234 sql_help.c:2346 sql_help.c:2351 -#: sql_help.c:2932 sql_help.c:2944 sql_help.c:3993 +#: sql_help.c:251 sql_help.c:253 sql_help.c:256 sql_help.c:264 sql_help.c:487 +#: sql_help.c:488 sql_help.c:1330 sql_help.c:1379 sql_help.c:1380 +#: sql_help.c:1381 sql_help.c:1408 sql_help.c:1420 sql_help.c:1437 +#: sql_help.c:1869 sql_help.c:1871 sql_help.c:2263 sql_help.c:2375 +#: sql_help.c:2380 sql_help.c:2957 sql_help.c:2969 sql_help.c:4024 msgid "constraint_name" msgstr "ім'Ñ_обмеженнÑ" -#: sql_help.c:247 sql_help.c:1315 +#: sql_help.c:254 sql_help.c:1331 msgid "new_constraint_name" msgstr "ім'Ñ_нового_обмеженнÑ" -#: sql_help.c:320 sql_help.c:1099 +#: sql_help.c:263 sql_help.c:2262 +msgid "where domain_constraint is:" +msgstr "де обмеженнÑ_домену:" + +#: sql_help.c:330 sql_help.c:1115 msgid "new_version" msgstr "нова_верÑÑ–Ñ" -#: sql_help.c:324 sql_help.c:326 +#: sql_help.c:334 sql_help.c:336 msgid "member_object" msgstr "елемент_об'єкт" -#: sql_help.c:327 +#: sql_help.c:337 msgid "where member_object is:" msgstr "де елемент_об'єкт Ñ”:" -#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 -#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 -#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 -#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 -#: sql_help.c:371 sql_help.c:1844 sql_help.c:1849 sql_help.c:1856 -#: sql_help.c:1857 sql_help.c:1858 sql_help.c:1859 sql_help.c:1860 -#: sql_help.c:1861 sql_help.c:1862 sql_help.c:1867 sql_help.c:1869 -#: sql_help.c:1873 sql_help.c:1875 sql_help.c:1879 sql_help.c:1884 -#: sql_help.c:1885 sql_help.c:1892 sql_help.c:1893 sql_help.c:1894 -#: sql_help.c:1895 sql_help.c:1896 sql_help.c:1897 sql_help.c:1898 -#: sql_help.c:1899 sql_help.c:1900 sql_help.c:1901 sql_help.c:1902 -#: sql_help.c:1907 sql_help.c:1908 sql_help.c:4451 sql_help.c:4456 -#: sql_help.c:4457 sql_help.c:4458 sql_help.c:4459 sql_help.c:4465 -#: sql_help.c:4466 sql_help.c:4471 sql_help.c:4472 sql_help.c:4477 -#: sql_help.c:4478 sql_help.c:4479 sql_help.c:4480 sql_help.c:4481 -#: sql_help.c:4482 +#: sql_help.c:338 sql_help.c:343 sql_help.c:344 sql_help.c:345 sql_help.c:346 +#: sql_help.c:347 sql_help.c:348 sql_help.c:353 sql_help.c:357 sql_help.c:359 +#: sql_help.c:361 sql_help.c:370 sql_help.c:371 sql_help.c:372 sql_help.c:373 +#: sql_help.c:374 sql_help.c:375 sql_help.c:376 sql_help.c:377 sql_help.c:380 +#: sql_help.c:381 sql_help.c:1861 sql_help.c:1866 sql_help.c:1873 +#: sql_help.c:1874 sql_help.c:1875 sql_help.c:1876 sql_help.c:1877 +#: sql_help.c:1878 sql_help.c:1879 sql_help.c:1884 sql_help.c:1886 +#: sql_help.c:1890 sql_help.c:1892 sql_help.c:1896 sql_help.c:1901 +#: sql_help.c:1902 sql_help.c:1909 sql_help.c:1910 sql_help.c:1911 +#: sql_help.c:1912 sql_help.c:1913 sql_help.c:1914 sql_help.c:1915 +#: sql_help.c:1916 sql_help.c:1917 sql_help.c:1918 sql_help.c:1919 +#: sql_help.c:1924 sql_help.c:1925 sql_help.c:4496 sql_help.c:4501 +#: sql_help.c:4502 sql_help.c:4503 sql_help.c:4504 sql_help.c:4510 +#: sql_help.c:4511 sql_help.c:4516 sql_help.c:4517 sql_help.c:4522 +#: sql_help.c:4523 sql_help.c:4524 sql_help.c:4525 sql_help.c:4526 +#: sql_help.c:4527 msgid "object_name" msgstr "ім'Ñ_об'єкту" -#: sql_help.c:329 sql_help.c:1845 sql_help.c:4454 +#: sql_help.c:339 sql_help.c:1862 sql_help.c:4499 msgid "aggregate_name" msgstr "ім'Ñ_агр_функції" -#: sql_help.c:331 sql_help.c:1847 sql_help.c:2131 sql_help.c:2135 -#: sql_help.c:2137 sql_help.c:3357 +#: sql_help.c:341 sql_help.c:1864 sql_help.c:2154 sql_help.c:2158 +#: sql_help.c:2160 sql_help.c:3385 msgid "source_type" msgstr "початковий_тип" -#: sql_help.c:332 sql_help.c:1848 sql_help.c:2132 sql_help.c:2136 -#: sql_help.c:2138 sql_help.c:3358 +#: sql_help.c:342 sql_help.c:1865 sql_help.c:2155 sql_help.c:2159 +#: sql_help.c:2161 sql_help.c:3386 msgid "target_type" msgstr "тип_цілі" -#: sql_help.c:339 sql_help.c:786 sql_help.c:1863 sql_help.c:2133 -#: sql_help.c:2174 sql_help.c:2250 sql_help.c:2518 sql_help.c:2549 -#: sql_help.c:3117 sql_help.c:4353 sql_help.c:4460 sql_help.c:4575 -#: sql_help.c:4579 sql_help.c:4583 sql_help.c:4586 sql_help.c:4824 -#: sql_help.c:4828 sql_help.c:4832 sql_help.c:4835 sql_help.c:5055 -#: sql_help.c:5059 sql_help.c:5063 sql_help.c:5066 +#: sql_help.c:349 sql_help.c:802 sql_help.c:1880 sql_help.c:2156 +#: sql_help.c:2199 sql_help.c:2279 sql_help.c:2547 sql_help.c:2578 +#: sql_help.c:3145 sql_help.c:4398 sql_help.c:4505 sql_help.c:4622 +#: sql_help.c:4626 sql_help.c:4630 sql_help.c:4633 sql_help.c:4880 +#: sql_help.c:4884 sql_help.c:4888 sql_help.c:4891 sql_help.c:5125 +#: sql_help.c:5129 sql_help.c:5133 sql_help.c:5136 msgid "function_name" msgstr "ім'Ñ_функції" -#: sql_help.c:344 sql_help.c:779 sql_help.c:1870 sql_help.c:2542 +#: sql_help.c:354 sql_help.c:795 sql_help.c:1887 sql_help.c:2571 msgid "operator_name" msgstr "ім'Ñ_оператора" -#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1871 -#: sql_help.c:2519 sql_help.c:3481 +#: sql_help.c:355 sql_help.c:729 sql_help.c:733 sql_help.c:737 sql_help.c:1888 +#: sql_help.c:2548 sql_help.c:3509 msgid "left_type" msgstr "тип_ліворуч" -#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1872 -#: sql_help.c:2520 sql_help.c:3482 +#: sql_help.c:356 sql_help.c:730 sql_help.c:734 sql_help.c:738 sql_help.c:1889 +#: sql_help.c:2549 sql_help.c:3510 msgid "right_type" msgstr "тип_праворуч" -#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 -#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 -#: sql_help.c:1408 sql_help.c:1874 sql_help.c:1876 sql_help.c:2539 -#: sql_help.c:2560 sql_help.c:2950 sql_help.c:3491 sql_help.c:3500 +#: sql_help.c:358 sql_help.c:360 sql_help.c:758 sql_help.c:761 sql_help.c:764 +#: sql_help.c:793 sql_help.c:805 sql_help.c:813 sql_help.c:816 sql_help.c:819 +#: sql_help.c:1426 sql_help.c:1891 sql_help.c:1893 sql_help.c:2568 +#: sql_help.c:2589 sql_help.c:2975 sql_help.c:3519 sql_help.c:3528 msgid "index_method" msgstr "метод_індекÑу" -#: sql_help.c:352 sql_help.c:1880 sql_help.c:4467 +#: sql_help.c:362 sql_help.c:1897 sql_help.c:4512 msgid "procedure_name" msgstr "назва_процедури" -#: sql_help.c:356 sql_help.c:1886 sql_help.c:3904 sql_help.c:4473 +#: sql_help.c:366 sql_help.c:1903 sql_help.c:3935 sql_help.c:4518 msgid "routine_name" msgstr "ім'Ñ_підпрограми" -#: sql_help.c:368 sql_help.c:1380 sql_help.c:1903 sql_help.c:2394 -#: sql_help.c:2600 sql_help.c:2905 sql_help.c:3084 sql_help.c:3662 -#: sql_help.c:3926 sql_help.c:4375 +#: sql_help.c:378 sql_help.c:1398 sql_help.c:1920 sql_help.c:2423 +#: sql_help.c:2629 sql_help.c:2930 sql_help.c:3112 sql_help.c:3690 +#: sql_help.c:3957 sql_help.c:4420 msgid "type_name" msgstr "назва_типу" -#: sql_help.c:369 sql_help.c:1904 sql_help.c:2393 sql_help.c:2599 -#: sql_help.c:3085 sql_help.c:3315 sql_help.c:3663 sql_help.c:3911 -#: sql_help.c:4360 +#: sql_help.c:379 sql_help.c:1921 sql_help.c:2422 sql_help.c:2628 +#: sql_help.c:3113 sql_help.c:3343 sql_help.c:3691 sql_help.c:3942 +#: sql_help.c:4405 msgid "lang_name" msgstr "назва_мови" -#: sql_help.c:372 +#: sql_help.c:382 msgid "and aggregate_signature is:" msgstr "Ñ– Ñигнатура_агр_функції:" -#: sql_help.c:395 sql_help.c:1998 sql_help.c:2275 +#: sql_help.c:405 sql_help.c:2021 sql_help.c:2304 msgid "handler_function" msgstr "функціÑ_обробник" -#: sql_help.c:396 sql_help.c:2276 +#: sql_help.c:406 sql_help.c:2305 msgid "validator_function" msgstr "функціÑ_перевірки" -#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 -#: sql_help.c:1309 sql_help.c:1581 +#: sql_help.c:454 sql_help.c:533 sql_help.c:677 sql_help.c:869 sql_help.c:1019 +#: sql_help.c:1325 sql_help.c:1602 msgid "action" msgstr "діÑ" -#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461 -#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470 -#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683 -#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080 -#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334 -#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 -#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349 -#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 -#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422 -#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683 -#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1726 sql_help.c:1851 -#: sql_help.c:1964 sql_help.c:1970 sql_help.c:1983 sql_help.c:1984 -#: sql_help.c:1985 sql_help.c:2325 sql_help.c:2338 sql_help.c:2391 -#: sql_help.c:2459 sql_help.c:2465 sql_help.c:2498 sql_help.c:2629 -#: sql_help.c:2738 sql_help.c:2773 sql_help.c:2775 sql_help.c:2887 -#: sql_help.c:2896 sql_help.c:2906 sql_help.c:2909 sql_help.c:2919 -#: sql_help.c:2923 sql_help.c:2946 sql_help.c:2948 sql_help.c:2955 -#: sql_help.c:2968 sql_help.c:2973 sql_help.c:2977 sql_help.c:2978 -#: sql_help.c:2994 sql_help.c:3120 sql_help.c:3260 sql_help.c:3883 -#: sql_help.c:3884 sql_help.c:3980 sql_help.c:3995 sql_help.c:3997 -#: sql_help.c:3999 sql_help.c:4084 sql_help.c:4087 sql_help.c:4089 -#: sql_help.c:4332 sql_help.c:4333 sql_help.c:4453 sql_help.c:4607 -#: sql_help.c:4613 sql_help.c:4615 sql_help.c:4856 sql_help.c:4862 -#: sql_help.c:4864 sql_help.c:4905 sql_help.c:4907 sql_help.c:4909 -#: sql_help.c:4956 sql_help.c:5087 sql_help.c:5093 sql_help.c:5095 +#: sql_help.c:456 sql_help.c:463 sql_help.c:467 sql_help.c:468 sql_help.c:471 +#: sql_help.c:473 sql_help.c:474 sql_help.c:475 sql_help.c:477 sql_help.c:480 +#: sql_help.c:482 sql_help.c:483 sql_help.c:681 sql_help.c:691 sql_help.c:693 +#: sql_help.c:696 sql_help.c:698 sql_help.c:699 sql_help.c:927 sql_help.c:1096 +#: sql_help.c:1327 sql_help.c:1345 sql_help.c:1349 sql_help.c:1350 +#: sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 sql_help.c:1358 +#: sql_help.c:1360 sql_help.c:1361 sql_help.c:1363 sql_help.c:1366 +#: sql_help.c:1367 sql_help.c:1369 sql_help.c:1372 sql_help.c:1374 +#: sql_help.c:1375 sql_help.c:1422 sql_help.c:1424 sql_help.c:1431 +#: sql_help.c:1440 sql_help.c:1445 sql_help.c:1452 sql_help.c:1453 +#: sql_help.c:1704 sql_help.c:1707 sql_help.c:1711 sql_help.c:1747 +#: sql_help.c:1868 sql_help.c:1984 sql_help.c:1990 sql_help.c:2004 +#: sql_help.c:2005 sql_help.c:2006 sql_help.c:2354 sql_help.c:2367 +#: sql_help.c:2420 sql_help.c:2488 sql_help.c:2494 sql_help.c:2527 +#: sql_help.c:2658 sql_help.c:2763 sql_help.c:2798 sql_help.c:2800 +#: sql_help.c:2912 sql_help.c:2921 sql_help.c:2931 sql_help.c:2934 +#: sql_help.c:2944 sql_help.c:2948 sql_help.c:2971 sql_help.c:2973 +#: sql_help.c:2980 sql_help.c:2993 sql_help.c:2998 sql_help.c:3005 +#: sql_help.c:3006 sql_help.c:3022 sql_help.c:3148 sql_help.c:3288 +#: sql_help.c:3914 sql_help.c:3915 sql_help.c:4011 sql_help.c:4026 +#: sql_help.c:4028 sql_help.c:4030 sql_help.c:4124 sql_help.c:4127 +#: sql_help.c:4129 sql_help.c:4131 sql_help.c:4377 sql_help.c:4378 +#: sql_help.c:4498 sql_help.c:4659 sql_help.c:4666 sql_help.c:4668 +#: sql_help.c:4917 sql_help.c:4924 sql_help.c:4926 sql_help.c:4967 +#: sql_help.c:4969 sql_help.c:4971 sql_help.c:5024 sql_help.c:5162 +#: sql_help.c:5169 sql_help.c:5171 msgid "column_name" msgstr "назва_ÑтовпцÑ" -#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 +#: sql_help.c:457 sql_help.c:682 sql_help.c:1328 sql_help.c:1712 msgid "new_column_name" msgstr "нова_назва_ÑтовпцÑ" -#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 -#: sql_help.c:1328 sql_help.c:1591 +#: sql_help.c:462 sql_help.c:554 sql_help.c:690 sql_help.c:890 sql_help.c:1040 +#: sql_help.c:1344 sql_help.c:1612 msgid "where action is one of:" msgstr "де допуÑтима діÑ:" -#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330 -#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2229 -#: sql_help.c:2326 sql_help.c:2538 sql_help.c:2731 sql_help.c:2888 -#: sql_help.c:3167 sql_help.c:4141 +#: sql_help.c:464 sql_help.c:469 sql_help.c:1088 sql_help.c:1346 +#: sql_help.c:1351 sql_help.c:1614 sql_help.c:1618 sql_help.c:2258 +#: sql_help.c:2355 sql_help.c:2567 sql_help.c:2756 sql_help.c:2913 +#: sql_help.c:3195 sql_help.c:4183 msgid "data_type" msgstr "тип_даних" -#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336 -#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2230 sql_help.c:2329 -#: sql_help.c:2461 sql_help.c:2890 sql_help.c:2898 sql_help.c:2911 -#: sql_help.c:2925 sql_help.c:3168 sql_help.c:3174 sql_help.c:3990 +#: sql_help.c:465 sql_help.c:470 sql_help.c:1347 sql_help.c:1352 +#: sql_help.c:1447 sql_help.c:1615 sql_help.c:1619 sql_help.c:2259 +#: sql_help.c:2358 sql_help.c:2490 sql_help.c:2915 sql_help.c:2923 +#: sql_help.c:2936 sql_help.c:2950 sql_help.c:3000 sql_help.c:3196 +#: sql_help.c:3202 sql_help.c:4021 msgid "collation" msgstr "правила_ÑортуваннÑ" -#: sql_help.c:456 sql_help.c:1332 sql_help.c:2330 sql_help.c:2339 -#: sql_help.c:2891 sql_help.c:2907 sql_help.c:2920 +#: sql_help.c:466 sql_help.c:1348 sql_help.c:2359 sql_help.c:2368 +#: sql_help.c:2916 sql_help.c:2932 sql_help.c:2945 msgid "column_constraint" msgstr "обмеженнÑ_ÑтовпцÑ" -#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4953 +#: sql_help.c:476 sql_help.c:618 sql_help.c:692 sql_help.c:1368 sql_help.c:5018 msgid "integer" msgstr "ціле" -#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352 -#: sql_help.c:1355 +#: sql_help.c:478 sql_help.c:481 sql_help.c:694 sql_help.c:697 sql_help.c:1370 +#: sql_help.c:1373 msgid "attribute_option" msgstr "параметр_атрибуту" -#: sql_help.c:476 sql_help.c:1359 sql_help.c:2331 sql_help.c:2340 -#: sql_help.c:2892 sql_help.c:2908 sql_help.c:2921 +#: sql_help.c:486 sql_help.c:1377 sql_help.c:2360 sql_help.c:2369 +#: sql_help.c:2917 sql_help.c:2933 sql_help.c:2946 msgid "table_constraint" msgstr "обмеженнÑ_таблиці" -#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364 -#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1905 +#: sql_help.c:489 sql_help.c:490 sql_help.c:491 sql_help.c:492 sql_help.c:1382 +#: sql_help.c:1383 sql_help.c:1384 sql_help.c:1385 sql_help.c:1922 msgid "trigger_name" msgstr "ім'Ñ_тригеру" -#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 -#: sql_help.c:2332 sql_help.c:2337 sql_help.c:2895 sql_help.c:2918 +#: sql_help.c:493 sql_help.c:494 sql_help.c:1396 sql_help.c:1397 +#: sql_help.c:2361 sql_help.c:2366 sql_help.c:2920 sql_help.c:2943 msgid "parent_table" msgstr "батьківÑька_таблицÑ" -#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 -#: sql_help.c:1550 sql_help.c:2261 +#: sql_help.c:553 sql_help.c:610 sql_help.c:679 sql_help.c:889 sql_help.c:1039 +#: sql_help.c:1571 sql_help.c:2290 msgid "extension_name" msgstr "ім'Ñ_розширеннÑ" -#: sql_help.c:545 sql_help.c:1025 sql_help.c:2395 +#: sql_help.c:555 sql_help.c:1041 sql_help.c:2424 msgid "execution_cost" msgstr "вартіÑть_виконаннÑ" -#: sql_help.c:546 sql_help.c:1026 sql_help.c:2396 +#: sql_help.c:556 sql_help.c:1042 sql_help.c:2425 msgid "result_rows" msgstr "Ñ€Ñдки_результату" -#: sql_help.c:547 sql_help.c:2397 +#: sql_help.c:557 sql_help.c:2426 msgid "support_function" msgstr "функціÑ_підтримки" -#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 -#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641 -#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2709 -#: sql_help.c:2711 sql_help.c:2714 sql_help.c:2715 sql_help.c:3881 -#: sql_help.c:3882 sql_help.c:3886 sql_help.c:3887 sql_help.c:3890 -#: sql_help.c:3891 sql_help.c:3893 sql_help.c:3894 sql_help.c:3896 -#: sql_help.c:3897 sql_help.c:3899 sql_help.c:3900 sql_help.c:3902 -#: sql_help.c:3903 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912 -#: sql_help.c:3913 sql_help.c:3915 sql_help.c:3916 sql_help.c:3918 -#: sql_help.c:3919 sql_help.c:3921 sql_help.c:3922 sql_help.c:3924 -#: sql_help.c:3925 sql_help.c:3927 sql_help.c:3928 sql_help.c:3930 -#: sql_help.c:3931 sql_help.c:4330 sql_help.c:4331 sql_help.c:4335 -#: sql_help.c:4336 sql_help.c:4339 sql_help.c:4340 sql_help.c:4342 -#: sql_help.c:4343 sql_help.c:4345 sql_help.c:4346 sql_help.c:4348 -#: sql_help.c:4349 sql_help.c:4351 sql_help.c:4352 sql_help.c:4358 -#: sql_help.c:4359 sql_help.c:4361 sql_help.c:4362 sql_help.c:4364 -#: sql_help.c:4365 sql_help.c:4367 sql_help.c:4368 sql_help.c:4370 -#: sql_help.c:4371 sql_help.c:4373 sql_help.c:4374 sql_help.c:4376 -#: sql_help.c:4377 sql_help.c:4379 sql_help.c:4380 +#: sql_help.c:579 sql_help.c:581 sql_help.c:964 sql_help.c:972 sql_help.c:976 +#: sql_help.c:979 sql_help.c:982 sql_help.c:1654 sql_help.c:1662 +#: sql_help.c:1666 sql_help.c:1669 sql_help.c:1672 sql_help.c:2734 +#: sql_help.c:2736 sql_help.c:2739 sql_help.c:2740 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3917 sql_help.c:3918 sql_help.c:3921 +#: sql_help.c:3922 sql_help.c:3924 sql_help.c:3925 sql_help.c:3927 +#: sql_help.c:3928 sql_help.c:3930 sql_help.c:3931 sql_help.c:3933 +#: sql_help.c:3934 sql_help.c:3940 sql_help.c:3941 sql_help.c:3943 +#: sql_help.c:3944 sql_help.c:3946 sql_help.c:3947 sql_help.c:3949 +#: sql_help.c:3950 sql_help.c:3952 sql_help.c:3953 sql_help.c:3955 +#: sql_help.c:3956 sql_help.c:3958 sql_help.c:3959 sql_help.c:3961 +#: sql_help.c:3962 sql_help.c:4375 sql_help.c:4376 sql_help.c:4380 +#: sql_help.c:4381 sql_help.c:4384 sql_help.c:4385 sql_help.c:4387 +#: sql_help.c:4388 sql_help.c:4390 sql_help.c:4391 sql_help.c:4393 +#: sql_help.c:4394 sql_help.c:4396 sql_help.c:4397 sql_help.c:4403 +#: sql_help.c:4404 sql_help.c:4406 sql_help.c:4407 sql_help.c:4409 +#: sql_help.c:4410 sql_help.c:4412 sql_help.c:4413 sql_help.c:4415 +#: sql_help.c:4416 sql_help.c:4418 sql_help.c:4419 sql_help.c:4421 +#: sql_help.c:4422 sql_help.c:4424 sql_help.c:4425 msgid "role_specification" msgstr "вказаннÑ_ролі" -#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2198 -#: sql_help.c:2717 sql_help.c:3245 sql_help.c:3696 sql_help.c:4699 +#: sql_help.c:580 sql_help.c:582 sql_help.c:1685 sql_help.c:2225 +#: sql_help.c:2742 sql_help.c:3273 sql_help.c:3724 sql_help.c:4753 msgid "user_name" msgstr "ім'Ñ_кориÑтувача" -#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2716 -#: sql_help.c:3932 sql_help.c:4381 +#: sql_help.c:583 sql_help.c:984 sql_help.c:1674 sql_help.c:2741 +#: sql_help.c:3963 sql_help.c:4426 msgid "where role_specification can be:" msgstr "де вказаннÑ_ролі може бути:" -#: sql_help.c:575 +#: sql_help.c:585 msgid "group_name" msgstr "ім'Ñ_групи" -#: sql_help.c:596 sql_help.c:1425 sql_help.c:2208 sql_help.c:2468 -#: sql_help.c:2502 sql_help.c:2903 sql_help.c:2916 sql_help.c:2930 -#: sql_help.c:2971 sql_help.c:2998 sql_help.c:3010 sql_help.c:3923 -#: sql_help.c:4372 +#: sql_help.c:606 sql_help.c:1443 sql_help.c:2237 sql_help.c:2497 +#: sql_help.c:2531 sql_help.c:2928 sql_help.c:2941 sql_help.c:2955 +#: sql_help.c:2996 sql_help.c:3026 sql_help.c:3038 sql_help.c:3954 +#: sql_help.c:4417 msgid "tablespace_name" msgstr "ім'Ñ_табличного_проÑтору" -#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382 -#: sql_help.c:1420 sql_help.c:1780 sql_help.c:1783 +#: sql_help.c:608 sql_help.c:701 sql_help.c:1390 sql_help.c:1400 +#: sql_help.c:1438 sql_help.c:1800 msgid "index_name" msgstr "назва_індекÑу" -#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375 -#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2466 sql_help.c:2500 -#: sql_help.c:2901 sql_help.c:2914 sql_help.c:2928 sql_help.c:2969 -#: sql_help.c:2996 +#: sql_help.c:612 sql_help.c:615 sql_help.c:704 sql_help.c:706 sql_help.c:1393 +#: sql_help.c:1395 sql_help.c:1441 sql_help.c:2495 sql_help.c:2529 +#: sql_help.c:2926 sql_help.c:2939 sql_help.c:2953 sql_help.c:2994 +#: sql_help.c:3024 msgid "storage_parameter" msgstr "параметр_зберіганнÑ" -#: sql_help.c:607 +#: sql_help.c:617 msgid "column_number" msgstr "номер_ÑтовпцÑ" -#: sql_help.c:631 sql_help.c:1868 sql_help.c:4464 +#: sql_help.c:641 sql_help.c:1885 sql_help.c:4509 msgid "large_object_oid" msgstr "oid_великого_об'єкта" -#: sql_help.c:690 sql_help.c:1358 sql_help.c:2889 +#: sql_help.c:700 sql_help.c:1376 sql_help.c:2914 msgid "compression_method" msgstr "compression_method" -#: sql_help.c:692 sql_help.c:1373 +#: sql_help.c:702 sql_help.c:1391 msgid "new_access_method" msgstr "новий_метод_доÑтупа" -#: sql_help.c:725 sql_help.c:2523 +#: sql_help.c:739 sql_help.c:2552 msgid "res_proc" msgstr "res_процедура" -#: sql_help.c:726 sql_help.c:2524 +#: sql_help.c:740 sql_help.c:2553 msgid "join_proc" msgstr "процедура_приєднаннÑ" -#: sql_help.c:778 sql_help.c:790 sql_help.c:2541 +#: sql_help.c:741 sql_help.c:2550 +msgid "com_op" +msgstr "комут_оператор" + +#: sql_help.c:742 sql_help.c:2551 +msgid "neg_op" +msgstr "зворотній_оператор" + +#: sql_help.c:794 sql_help.c:806 sql_help.c:2570 msgid "strategy_number" msgstr "номер_Ñтратегії" -#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 -#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2543 sql_help.c:2544 -#: sql_help.c:2547 sql_help.c:2548 +#: sql_help.c:796 sql_help.c:797 sql_help.c:800 sql_help.c:801 sql_help.c:807 +#: sql_help.c:808 sql_help.c:810 sql_help.c:811 sql_help.c:2572 sql_help.c:2573 +#: sql_help.c:2576 sql_help.c:2577 msgid "op_type" msgstr "тип_операції" -#: sql_help.c:782 sql_help.c:2545 +#: sql_help.c:798 sql_help.c:2574 msgid "sort_family_name" msgstr "ім'Ñ_родини_ÑортуваннÑ" -#: sql_help.c:783 sql_help.c:793 sql_help.c:2546 +#: sql_help.c:799 sql_help.c:809 sql_help.c:2575 msgid "support_number" msgstr "номер_підтримки" -#: sql_help.c:787 sql_help.c:2134 sql_help.c:2550 sql_help.c:3087 -#: sql_help.c:3089 +#: sql_help.c:803 sql_help.c:2157 sql_help.c:2579 sql_help.c:3115 +#: sql_help.c:3117 msgid "argument_type" msgstr "тип_аргументу" -#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 -#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1725 sql_help.c:1779 -#: sql_help.c:1782 sql_help.c:1853 sql_help.c:1878 sql_help.c:1891 -#: sql_help.c:1906 sql_help.c:1963 sql_help.c:1969 sql_help.c:2324 -#: sql_help.c:2336 sql_help.c:2457 sql_help.c:2497 sql_help.c:2574 -#: sql_help.c:2628 sql_help.c:2685 sql_help.c:2737 sql_help.c:2770 -#: sql_help.c:2777 sql_help.c:2886 sql_help.c:2904 sql_help.c:2917 -#: sql_help.c:2993 sql_help.c:3113 sql_help.c:3294 sql_help.c:3517 -#: sql_help.c:3566 sql_help.c:3672 sql_help.c:3879 sql_help.c:3885 -#: sql_help.c:3946 sql_help.c:3978 sql_help.c:4328 sql_help.c:4334 -#: sql_help.c:4452 sql_help.c:4561 sql_help.c:4563 sql_help.c:4620 -#: sql_help.c:4659 sql_help.c:4810 sql_help.c:4812 sql_help.c:4869 -#: sql_help.c:4903 sql_help.c:4955 sql_help.c:5041 sql_help.c:5043 -#: sql_help.c:5100 +#: sql_help.c:834 sql_help.c:837 sql_help.c:926 sql_help.c:1055 sql_help.c:1095 +#: sql_help.c:1567 sql_help.c:1570 sql_help.c:1746 sql_help.c:1799 +#: sql_help.c:1870 sql_help.c:1895 sql_help.c:1908 sql_help.c:1923 +#: sql_help.c:1983 sql_help.c:1989 sql_help.c:2353 sql_help.c:2365 +#: sql_help.c:2486 sql_help.c:2526 sql_help.c:2603 sql_help.c:2657 +#: sql_help.c:2710 sql_help.c:2762 sql_help.c:2795 sql_help.c:2802 +#: sql_help.c:2911 sql_help.c:2929 sql_help.c:2942 sql_help.c:3021 +#: sql_help.c:3141 sql_help.c:3322 sql_help.c:3545 sql_help.c:3594 +#: sql_help.c:3700 sql_help.c:3910 sql_help.c:3916 sql_help.c:3977 +#: sql_help.c:4009 sql_help.c:4373 sql_help.c:4379 sql_help.c:4497 +#: sql_help.c:4610 sql_help.c:4673 sql_help.c:4712 sql_help.c:4868 +#: sql_help.c:4931 sql_help.c:4965 sql_help.c:5023 sql_help.c:5113 +#: sql_help.c:5176 msgid "table_name" msgstr "ім'Ñ_таблиці" -#: sql_help.c:823 sql_help.c:2576 +#: sql_help.c:839 sql_help.c:2605 msgid "using_expression" msgstr "вираз_викориÑтаннÑ" -#: sql_help.c:824 sql_help.c:2577 +#: sql_help.c:840 sql_help.c:2606 msgid "check_expression" msgstr "вираз_перевірки" -#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2624 +#: sql_help.c:913 sql_help.c:915 sql_help.c:917 sql_help.c:2653 msgid "publication_object" msgstr "об'єкт_публікаціÑ" -#: sql_help.c:903 sql_help.c:2625 +#: sql_help.c:919 sql_help.c:2654 msgid "publication_parameter" msgstr "параметр_публікації" -#: sql_help.c:909 sql_help.c:2627 +#: sql_help.c:925 sql_help.c:2656 msgid "where publication_object is one of:" msgstr "де об'єкт_Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ” одним з:" -#: sql_help.c:952 sql_help.c:1637 sql_help.c:2435 sql_help.c:2662 -#: sql_help.c:3228 +#: sql_help.c:968 sql_help.c:1658 sql_help.c:2464 sql_help.c:2689 +#: sql_help.c:3256 msgid "password" msgstr "пароль" -#: sql_help.c:953 sql_help.c:1638 sql_help.c:2436 sql_help.c:2663 -#: sql_help.c:3229 +#: sql_help.c:969 sql_help.c:1659 sql_help.c:2465 sql_help.c:2690 +#: sql_help.c:3257 msgid "timestamp" msgstr "мітка чаÑу" -#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642 -#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3892 -#: sql_help.c:4341 +#: sql_help.c:973 sql_help.c:977 sql_help.c:980 sql_help.c:983 sql_help.c:1663 +#: sql_help.c:1667 sql_help.c:1670 sql_help.c:1673 sql_help.c:3923 +#: sql_help.c:4386 msgid "database_name" msgstr "назва_бази_даних" -#: sql_help.c:1073 sql_help.c:2732 +#: sql_help.c:1089 sql_help.c:2757 msgid "increment" msgstr "інкремент" -#: sql_help.c:1074 sql_help.c:2733 +#: sql_help.c:1090 sql_help.c:2758 msgid "minvalue" msgstr "мін_значеннÑ" -#: sql_help.c:1075 sql_help.c:2734 +#: sql_help.c:1091 sql_help.c:2759 msgid "maxvalue" msgstr "макÑ_значеннÑ" -#: sql_help.c:1076 sql_help.c:2735 sql_help.c:4559 sql_help.c:4657 -#: sql_help.c:4808 sql_help.c:4972 sql_help.c:5039 +#: sql_help.c:1092 sql_help.c:2760 sql_help.c:4606 sql_help.c:4710 +#: sql_help.c:4864 sql_help.c:5040 sql_help.c:5109 msgid "start" msgstr "початок" -#: sql_help.c:1077 sql_help.c:1347 +#: sql_help.c:1093 sql_help.c:1365 msgid "restart" msgstr "перезапуÑк" -#: sql_help.c:1078 sql_help.c:2736 +#: sql_help.c:1094 sql_help.c:2761 msgid "cache" msgstr "кеш" -#: sql_help.c:1123 +#: sql_help.c:1139 msgid "new_target" msgstr "нова_ціль" -#: sql_help.c:1142 sql_help.c:2789 +#: sql_help.c:1158 sql_help.c:2814 msgid "conninfo" msgstr "інформаціÑ_підключеннÑ" -#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2790 +#: sql_help.c:1160 sql_help.c:1164 sql_help.c:1168 sql_help.c:2815 msgid "publication_name" msgstr "назва_публікації" -#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +#: sql_help.c:1161 sql_help.c:1165 sql_help.c:1169 msgid "publication_option" msgstr "publication_option" -#: sql_help.c:1156 +#: sql_help.c:1172 msgid "refresh_option" msgstr "опціÑ_оновленнÑ" -#: sql_help.c:1161 sql_help.c:2791 +#: sql_help.c:1177 sql_help.c:2816 msgid "subscription_parameter" msgstr "параметр_підпиÑки" -#: sql_help.c:1164 +#: sql_help.c:1180 msgid "skip_option" msgstr "опціÑ_пропуÑка" -#: sql_help.c:1324 sql_help.c:1327 +#: sql_help.c:1340 sql_help.c:1343 msgid "partition_name" msgstr "ім'Ñ_розділу" -#: sql_help.c:1325 sql_help.c:2341 sql_help.c:2922 +#: sql_help.c:1341 sql_help.c:2370 sql_help.c:2947 msgid "partition_bound_spec" msgstr "ÑпецифікаціÑ_рамок_розділу" -#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2936 +#: sql_help.c:1362 sql_help.c:1412 sql_help.c:2961 msgid "sequence_options" msgstr "опції_поÑлідовноÑті" -#: sql_help.c:1346 +#: sql_help.c:1364 msgid "sequence_option" msgstr "опціÑ_поÑлідовноÑті" -#: sql_help.c:1360 +#: sql_help.c:1378 msgid "table_constraint_using_index" msgstr "індекÑ_обмеженнÑ_таблиці" -#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 +#: sql_help.c:1386 sql_help.c:1387 sql_help.c:1388 sql_help.c:1389 msgid "rewrite_rule_name" msgstr "ім'Ñ_правила_перезапиÑу" -#: sql_help.c:1383 sql_help.c:2353 sql_help.c:2961 +#: sql_help.c:1401 sql_help.c:2382 sql_help.c:2986 msgid "and partition_bound_spec is:" msgstr "Ñ– ÑпецифікаціÑ_рамок_розділу:" -#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2354 -#: sql_help.c:2355 sql_help.c:2356 sql_help.c:2962 sql_help.c:2963 -#: sql_help.c:2964 +#: sql_help.c:1402 sql_help.c:1403 sql_help.c:1404 sql_help.c:2383 +#: sql_help.c:2384 sql_help.c:2385 sql_help.c:2987 sql_help.c:2988 +#: sql_help.c:2989 msgid "partition_bound_expr" msgstr "код_Ñекції" -#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2357 sql_help.c:2358 -#: sql_help.c:2965 sql_help.c:2966 +#: sql_help.c:1405 sql_help.c:1406 sql_help.c:2386 sql_help.c:2387 +#: sql_help.c:2990 sql_help.c:2991 msgid "numeric_literal" msgstr "чиÑловий_літерал" -#: sql_help.c:1389 +#: sql_help.c:1407 msgid "and column_constraint is:" msgstr "Ñ– обмеженнÑ_ÑтовпцÑ:" -#: sql_help.c:1392 sql_help.c:2348 sql_help.c:2389 sql_help.c:2598 -#: sql_help.c:2934 +#: sql_help.c:1410 sql_help.c:2377 sql_help.c:2418 sql_help.c:2627 +#: sql_help.c:2959 msgid "default_expr" msgstr "вираз_за_замовчуваннÑм" -#: sql_help.c:1393 sql_help.c:2349 sql_help.c:2935 +#: sql_help.c:1411 sql_help.c:2378 sql_help.c:2960 msgid "generation_expr" msgstr "код_генерації" -#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 -#: sql_help.c:1411 sql_help.c:2937 sql_help.c:2938 sql_help.c:2947 -#: sql_help.c:2949 sql_help.c:2953 +#: sql_help.c:1413 sql_help.c:1414 sql_help.c:1423 sql_help.c:1425 +#: sql_help.c:1429 sql_help.c:2962 sql_help.c:2963 sql_help.c:2972 +#: sql_help.c:2974 sql_help.c:2978 msgid "index_parameters" msgstr "параметри_індекÑу" -#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2939 sql_help.c:2956 +#: sql_help.c:1415 sql_help.c:1432 sql_help.c:2964 sql_help.c:2981 msgid "reftable" msgstr "залежна_таблицÑ" -#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2940 sql_help.c:2957 +#: sql_help.c:1416 sql_help.c:1433 sql_help.c:2965 sql_help.c:2982 msgid "refcolumn" msgstr "залежний_Ñтовпець" -#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 -#: sql_help.c:2941 sql_help.c:2942 sql_help.c:2958 sql_help.c:2959 +#: sql_help.c:1417 sql_help.c:1418 sql_help.c:1434 sql_help.c:1435 +#: sql_help.c:2966 sql_help.c:2967 sql_help.c:2983 sql_help.c:2984 msgid "referential_action" msgstr "діÑ_поÑиланнÑ" -#: sql_help.c:1401 sql_help.c:2350 sql_help.c:2943 +#: sql_help.c:1419 sql_help.c:2379 sql_help.c:2968 msgid "and table_constraint is:" msgstr "Ñ– обмеженнÑ_таблиці:" -#: sql_help.c:1409 sql_help.c:2951 +#: sql_help.c:1427 sql_help.c:2976 msgid "exclude_element" msgstr "об'єкт_виключеннÑ" -#: sql_help.c:1410 sql_help.c:2952 sql_help.c:4557 sql_help.c:4655 -#: sql_help.c:4806 sql_help.c:4970 sql_help.c:5037 +#: sql_help.c:1428 sql_help.c:2977 sql_help.c:4604 sql_help.c:4708 +#: sql_help.c:4862 sql_help.c:5038 sql_help.c:5107 msgid "operator" msgstr "оператор" -#: sql_help.c:1412 sql_help.c:2469 sql_help.c:2954 +#: sql_help.c:1430 sql_help.c:2498 sql_help.c:2979 msgid "predicate" msgstr "предикат" -#: sql_help.c:1418 +#: sql_help.c:1436 msgid "and table_constraint_using_index is:" msgstr "Ñ– індекÑ_обмеженнÑ_таблиці:" -#: sql_help.c:1421 sql_help.c:2967 +#: sql_help.c:1439 sql_help.c:2992 msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" msgstr "параметри_індекÑу в обмеженнÑÑ… UNIQUE, PRIMARY KEY, EXCLUDE:" -#: sql_help.c:1426 sql_help.c:2972 +#: sql_help.c:1444 sql_help.c:2997 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "елемент_Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð² обмеженні EXCLUDE:" -#: sql_help.c:1429 sql_help.c:2462 sql_help.c:2899 sql_help.c:2912 -#: sql_help.c:2926 sql_help.c:2975 sql_help.c:3991 +#: sql_help.c:1448 sql_help.c:2491 sql_help.c:2924 sql_help.c:2937 +#: sql_help.c:2951 sql_help.c:3001 sql_help.c:4022 msgid "opclass" msgstr "клаÑ_оператора" -#: sql_help.c:1430 sql_help.c:2976 +#: sql_help.c:1449 sql_help.c:2492 sql_help.c:3002 +msgid "opclass_parameter" +msgstr "opclass_parameter" + +#: sql_help.c:1451 sql_help.c:3004 msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" msgstr "поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° дію в обмеженні FOREIGN KEY/REFERENCES:" -#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3013 +#: sql_help.c:1469 sql_help.c:1472 sql_help.c:3041 msgid "tablespace_option" msgstr "опціÑ_табличного_проÑтору" -#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 +#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1502 sql_help.c:1506 msgid "token_type" msgstr "тип_токену" -#: sql_help.c:1473 sql_help.c:1476 +#: sql_help.c:1494 sql_help.c:1497 msgid "dictionary_name" msgstr "ім'Ñ_Ñловника" -#: sql_help.c:1478 sql_help.c:1482 +#: sql_help.c:1499 sql_help.c:1503 msgid "old_dictionary" msgstr "Ñтарий_Ñловник" -#: sql_help.c:1479 sql_help.c:1483 +#: sql_help.c:1500 sql_help.c:1504 msgid "new_dictionary" msgstr "новий_Ñловник" -#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 -#: sql_help.c:3166 +#: sql_help.c:1599 sql_help.c:1613 sql_help.c:1616 sql_help.c:1617 +#: sql_help.c:3194 msgid "attribute_name" msgstr "ім'Ñ_атрибута" -#: sql_help.c:1579 +#: sql_help.c:1600 msgid "new_attribute_name" msgstr "нове_ім'Ñ_атрибута" -#: sql_help.c:1583 sql_help.c:1587 +#: sql_help.c:1604 sql_help.c:1608 msgid "new_enum_value" msgstr "нове_значеннÑ_перерахуваннÑ" -#: sql_help.c:1584 +#: sql_help.c:1605 msgid "neighbor_enum_value" msgstr "ÑуÑіднє_значеннÑ_перерахуваннÑ" -#: sql_help.c:1586 +#: sql_help.c:1607 msgid "existing_enum_value" msgstr "Ñ–Ñнуюче_значеннÑ_перерахуваннÑ" -#: sql_help.c:1589 +#: sql_help.c:1610 msgid "property" msgstr "влаÑтивіÑть" -#: sql_help.c:1665 sql_help.c:2333 sql_help.c:2342 sql_help.c:2748 -#: sql_help.c:3246 sql_help.c:3697 sql_help.c:3901 sql_help.c:3947 -#: sql_help.c:4350 +#: sql_help.c:1686 sql_help.c:2362 sql_help.c:2371 sql_help.c:2773 +#: sql_help.c:3274 sql_help.c:3725 sql_help.c:3932 sql_help.c:3978 +#: sql_help.c:4395 msgid "server_name" msgstr "назва_Ñерверу" -#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3261 +#: sql_help.c:1718 sql_help.c:1721 sql_help.c:3289 msgid "view_option_name" msgstr "ім'Ñ_параметра_предÑтавленнÑ" -#: sql_help.c:1698 sql_help.c:3262 +#: sql_help.c:1719 sql_help.c:3290 msgid "view_option_value" msgstr "значеннÑ_параметра_предÑтавленнÑ" -#: sql_help.c:1719 sql_help.c:1720 sql_help.c:4942 sql_help.c:4943 +#: sql_help.c:1740 sql_help.c:5007 msgid "table_and_columns" msgstr "таблицÑ_Ñ–_Ñтовпці" -#: sql_help.c:1721 sql_help.c:1784 sql_help.c:1975 sql_help.c:3745 -#: sql_help.c:4185 sql_help.c:4944 +#: sql_help.c:1741 sql_help.c:1801 sql_help.c:1995 sql_help.c:3774 +#: sql_help.c:4230 sql_help.c:5008 msgid "where option can be one of:" msgstr "де параметр може бути одним із:" -#: sql_help.c:1722 sql_help.c:1723 sql_help.c:1785 sql_help.c:1977 -#: sql_help.c:1980 sql_help.c:2159 sql_help.c:3746 sql_help.c:3747 -#: sql_help.c:3748 sql_help.c:3749 sql_help.c:3750 sql_help.c:3751 -#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4186 sql_help.c:4188 -#: sql_help.c:4945 sql_help.c:4946 sql_help.c:4947 sql_help.c:4948 -#: sql_help.c:4949 sql_help.c:4950 sql_help.c:4951 sql_help.c:4952 +#: sql_help.c:1742 sql_help.c:1743 sql_help.c:1802 sql_help.c:1997 +#: sql_help.c:2001 sql_help.c:2183 sql_help.c:3775 sql_help.c:3776 +#: sql_help.c:3777 sql_help.c:3778 sql_help.c:3779 sql_help.c:3780 +#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 +#: sql_help.c:4231 sql_help.c:4233 sql_help.c:5009 sql_help.c:5010 +#: sql_help.c:5011 sql_help.c:5012 sql_help.c:5013 sql_help.c:5014 +#: sql_help.c:5015 sql_help.c:5016 sql_help.c:5017 sql_help.c:5019 +#: sql_help.c:5020 msgid "boolean" msgstr "логічний" -#: sql_help.c:1724 sql_help.c:4954 +#: sql_help.c:1744 sql_help.c:5021 +msgid "size" +msgstr "розмір" + +#: sql_help.c:1745 sql_help.c:5022 msgid "and table_and_columns is:" msgstr "Ñ– таблицÑ_Ñ–_Ñтовпці:" -#: sql_help.c:1740 sql_help.c:4715 sql_help.c:4717 sql_help.c:4741 +#: sql_help.c:1761 sql_help.c:4769 sql_help.c:4771 sql_help.c:4795 msgid "transaction_mode" msgstr "режим_транзакції" -#: sql_help.c:1741 sql_help.c:4718 sql_help.c:4742 +#: sql_help.c:1762 sql_help.c:4772 sql_help.c:4796 msgid "where transaction_mode is one of:" msgstr "де режим_транзакції один з:" -#: sql_help.c:1750 sql_help.c:4567 sql_help.c:4576 sql_help.c:4580 -#: sql_help.c:4584 sql_help.c:4587 sql_help.c:4816 sql_help.c:4825 -#: sql_help.c:4829 sql_help.c:4833 sql_help.c:4836 sql_help.c:5047 -#: sql_help.c:5056 sql_help.c:5060 sql_help.c:5064 sql_help.c:5067 +#: sql_help.c:1771 sql_help.c:4614 sql_help.c:4623 sql_help.c:4627 +#: sql_help.c:4631 sql_help.c:4634 sql_help.c:4872 sql_help.c:4881 +#: sql_help.c:4885 sql_help.c:4889 sql_help.c:4892 sql_help.c:5117 +#: sql_help.c:5126 sql_help.c:5130 sql_help.c:5134 sql_help.c:5137 msgid "argument" msgstr "аргумент" -#: sql_help.c:1850 +#: sql_help.c:1867 msgid "relation_name" msgstr "назва_відношеннÑ" -#: sql_help.c:1855 sql_help.c:3895 sql_help.c:4344 +#: sql_help.c:1872 sql_help.c:3926 sql_help.c:4389 msgid "domain_name" msgstr "назва_домену" -#: sql_help.c:1877 +#: sql_help.c:1894 msgid "policy_name" msgstr "назва_політики" -#: sql_help.c:1890 +#: sql_help.c:1907 msgid "rule_name" msgstr "назва_правила" -#: sql_help.c:1909 -msgid "text" -msgstr "текÑÑ‚" +#: sql_help.c:1926 sql_help.c:4528 +msgid "string_literal" +msgstr "Ñ€Ñдковий_літерал" -#: sql_help.c:1934 sql_help.c:4150 sql_help.c:4397 +#: sql_help.c:1951 sql_help.c:4192 sql_help.c:4442 msgid "transaction_id" msgstr "ідентифікатор_транзакції" -#: sql_help.c:1965 sql_help.c:1972 sql_help.c:4017 +#: sql_help.c:1985 sql_help.c:1992 sql_help.c:4048 msgid "filename" msgstr "ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ" -#: sql_help.c:1966 sql_help.c:1973 sql_help.c:2687 sql_help.c:2688 -#: sql_help.c:2689 +#: sql_help.c:1986 sql_help.c:1993 sql_help.c:2712 sql_help.c:2713 +#: sql_help.c:2714 msgid "command" msgstr "команда" -#: sql_help.c:1968 sql_help.c:2686 sql_help.c:3116 sql_help.c:3297 -#: sql_help.c:4001 sql_help.c:4078 sql_help.c:4081 sql_help.c:4550 -#: sql_help.c:4552 sql_help.c:4648 sql_help.c:4650 sql_help.c:4799 -#: sql_help.c:4801 sql_help.c:4912 sql_help.c:5030 sql_help.c:5032 +#: sql_help.c:1988 sql_help.c:2711 sql_help.c:3144 sql_help.c:3325 +#: sql_help.c:4032 sql_help.c:4115 sql_help.c:4118 sql_help.c:4121 +#: sql_help.c:4597 sql_help.c:4599 sql_help.c:4701 sql_help.c:4703 +#: sql_help.c:4855 sql_help.c:4857 sql_help.c:4974 sql_help.c:5100 +#: sql_help.c:5102 msgid "condition" msgstr "умова" -#: sql_help.c:1971 sql_help.c:2503 sql_help.c:2999 sql_help.c:3263 -#: sql_help.c:3281 sql_help.c:3982 +#: sql_help.c:1991 sql_help.c:2532 sql_help.c:3027 sql_help.c:3291 +#: sql_help.c:3309 sql_help.c:4013 msgid "query" msgstr "запит" -#: sql_help.c:1976 +#: sql_help.c:1996 msgid "format_name" msgstr "назва_формату" -#: sql_help.c:1978 +#: sql_help.c:1998 msgid "delimiter_character" msgstr "Ñимвол_роздільник" -#: sql_help.c:1979 +#: sql_help.c:1999 msgid "null_string" msgstr "предÑтавленнÑ_NULL" -#: sql_help.c:1981 +#: sql_help.c:2000 +msgid "default_string" +msgstr "Ñ€Ñдок_за_замовчуваннÑм" + +#: sql_help.c:2002 msgid "quote_character" msgstr "Ñимвол_лапок" -#: sql_help.c:1982 +#: sql_help.c:2003 msgid "escape_character" msgstr "Ñимвол_екрануваннÑ" -#: sql_help.c:1986 +#: sql_help.c:2007 +msgid "error_action" +msgstr "error_action" + +#: sql_help.c:2008 msgid "encoding_name" msgstr "ім'Ñ_кодуваннÑ" -#: sql_help.c:1997 +#: sql_help.c:2009 +msgid "verbosity" +msgstr "детальніÑть" + +#: sql_help.c:2020 msgid "access_method_type" msgstr "тип_метода_доÑтупа" -#: sql_help.c:2068 sql_help.c:2087 sql_help.c:2090 +#: sql_help.c:2091 sql_help.c:2110 sql_help.c:2113 msgid "arg_data_type" msgstr "тип_даних_аргумента" -#: sql_help.c:2069 sql_help.c:2091 sql_help.c:2099 +#: sql_help.c:2092 sql_help.c:2114 sql_help.c:2122 msgid "sfunc" msgstr "функціÑ_Ñтану" -#: sql_help.c:2070 sql_help.c:2092 sql_help.c:2100 +#: sql_help.c:2093 sql_help.c:2115 sql_help.c:2123 msgid "state_data_type" msgstr "тип_даних_Ñтану" -#: sql_help.c:2071 sql_help.c:2093 sql_help.c:2101 +#: sql_help.c:2094 sql_help.c:2116 sql_help.c:2124 msgid "state_data_size" msgstr "розмір_даних_Ñтану" -#: sql_help.c:2072 sql_help.c:2094 sql_help.c:2102 +#: sql_help.c:2095 sql_help.c:2117 sql_help.c:2125 msgid "ffunc" msgstr "функціÑ_завершеннÑ" -#: sql_help.c:2073 sql_help.c:2103 +#: sql_help.c:2096 sql_help.c:2126 msgid "combinefunc" msgstr "комбінуюча_функціÑ" -#: sql_help.c:2074 sql_help.c:2104 +#: sql_help.c:2097 sql_help.c:2127 msgid "serialfunc" msgstr "функціÑ_Ñеріалізації" -#: sql_help.c:2075 sql_help.c:2105 +#: sql_help.c:2098 sql_help.c:2128 msgid "deserialfunc" msgstr "функціÑ_деÑеріалізації" -#: sql_help.c:2076 sql_help.c:2095 sql_help.c:2106 +#: sql_help.c:2099 sql_help.c:2118 sql_help.c:2129 msgid "initial_condition" msgstr "початкова_умова" -#: sql_help.c:2077 sql_help.c:2107 +#: sql_help.c:2100 sql_help.c:2130 msgid "msfunc" msgstr "функціÑ_Ñтану_рух" -#: sql_help.c:2078 sql_help.c:2108 +#: sql_help.c:2101 sql_help.c:2131 msgid "minvfunc" msgstr "зворотна_функціÑ_рух" -#: sql_help.c:2079 sql_help.c:2109 +#: sql_help.c:2102 sql_help.c:2132 msgid "mstate_data_type" msgstr "тип_даних_Ñтану_рух" -#: sql_help.c:2080 sql_help.c:2110 +#: sql_help.c:2103 sql_help.c:2133 msgid "mstate_data_size" msgstr "розмір_даних_Ñтану_рух" -#: sql_help.c:2081 sql_help.c:2111 +#: sql_help.c:2104 sql_help.c:2134 msgid "mffunc" msgstr "функціÑ_завершеннÑ_рух" -#: sql_help.c:2082 sql_help.c:2112 +#: sql_help.c:2105 sql_help.c:2135 msgid "minitial_condition" msgstr "початкова_умова_рух" -#: sql_help.c:2083 sql_help.c:2113 +#: sql_help.c:2106 sql_help.c:2136 msgid "sort_operator" msgstr "оператор_ÑортуваннÑ" -#: sql_help.c:2096 +#: sql_help.c:2119 msgid "or the old syntax" msgstr "або Ñтарий ÑинтакÑиÑ" -#: sql_help.c:2098 +#: sql_help.c:2121 msgid "base_type" msgstr "базовий_тип" -#: sql_help.c:2155 sql_help.c:2202 +#: sql_help.c:2179 sql_help.c:2229 msgid "locale" msgstr "локаль" -#: sql_help.c:2156 sql_help.c:2203 +#: sql_help.c:2180 sql_help.c:2230 msgid "lc_collate" msgstr "код_правила_ÑортуваннÑ" -#: sql_help.c:2157 sql_help.c:2204 +#: sql_help.c:2181 sql_help.c:2231 msgid "lc_ctype" msgstr "код_клаÑифікації_Ñимволів" -#: sql_help.c:2158 sql_help.c:4450 +#: sql_help.c:2182 sql_help.c:4495 msgid "provider" msgstr "поÑтачальник" -#: sql_help.c:2160 sql_help.c:2263 +#: sql_help.c:2184 +msgid "rules" +msgstr "правила" + +#: sql_help.c:2185 sql_help.c:2292 msgid "version" msgstr "верÑÑ–Ñ" -#: sql_help.c:2162 +#: sql_help.c:2187 msgid "existing_collation" msgstr "Ñ–Ñнуюче_правило_ÑортуваннÑ" -#: sql_help.c:2172 +#: sql_help.c:2197 msgid "source_encoding" msgstr "початкове_кодуваннÑ" -#: sql_help.c:2173 +#: sql_help.c:2198 msgid "dest_encoding" msgstr "цільве_кодуваннÑ" -#: sql_help.c:2199 sql_help.c:3039 +#: sql_help.c:2226 sql_help.c:3067 msgid "template" msgstr "шаблон" -#: sql_help.c:2200 +#: sql_help.c:2227 msgid "encoding" msgstr "кодуваннÑ" -#: sql_help.c:2201 +#: sql_help.c:2228 msgid "strategy" msgstr "ÑтратегіÑ" -#: sql_help.c:2205 +#: sql_help.c:2232 +msgid "builtin_locale" +msgstr "вбудована_локаль" + +#: sql_help.c:2233 msgid "icu_locale" msgstr "icu_locale" -#: sql_help.c:2206 +#: sql_help.c:2234 +msgid "icu_rules" +msgstr "правила_icu" + +#: sql_help.c:2235 msgid "locale_provider" msgstr "локаль_провайдер" -#: sql_help.c:2207 +#: sql_help.c:2236 msgid "collation_version" msgstr "верÑÑ–Ñ_ÑортуваннÑ" -#: sql_help.c:2212 +#: sql_help.c:2241 msgid "oid" msgstr "oid" -#: sql_help.c:2232 -msgid "constraint" -msgstr "обмеженнÑ" - -#: sql_help.c:2233 -msgid "where constraint is:" -msgstr "де обмеженнÑ:" - -#: sql_help.c:2247 sql_help.c:2684 sql_help.c:3112 +#: sql_help.c:2276 sql_help.c:2709 sql_help.c:3140 msgid "event" msgstr "подіÑ" -#: sql_help.c:2248 +#: sql_help.c:2277 msgid "filter_variable" msgstr "змінна_фільтру" -#: sql_help.c:2249 +#: sql_help.c:2278 msgid "filter_value" msgstr "значеннÑ_фільтру" -#: sql_help.c:2345 sql_help.c:2931 +#: sql_help.c:2374 sql_help.c:2956 msgid "where column_constraint is:" msgstr "де обмеженнÑ_Ñтовпців:" -#: sql_help.c:2390 +#: sql_help.c:2419 msgid "rettype" msgstr "тип_результату" -#: sql_help.c:2392 +#: sql_help.c:2421 msgid "column_type" msgstr "тип_ÑтовпцÑ" -#: sql_help.c:2401 sql_help.c:2604 +#: sql_help.c:2430 sql_help.c:2633 msgid "definition" msgstr "визначеннÑ" -#: sql_help.c:2402 sql_help.c:2605 +#: sql_help.c:2431 sql_help.c:2634 msgid "obj_file" msgstr "об'єктний_файл" -#: sql_help.c:2403 sql_help.c:2606 +#: sql_help.c:2432 sql_help.c:2635 msgid "link_symbol" msgstr "Ñимвол_екÑпорту" -#: sql_help.c:2404 sql_help.c:2607 +#: sql_help.c:2433 sql_help.c:2636 msgid "sql_body" msgstr "sql_body" -#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 +#: sql_help.c:2471 sql_help.c:2694 sql_help.c:3263 msgid "uid" msgstr "uid" -#: sql_help.c:2458 sql_help.c:2499 sql_help.c:2900 sql_help.c:2913 -#: sql_help.c:2927 sql_help.c:2995 +#: sql_help.c:2487 sql_help.c:2528 sql_help.c:2925 sql_help.c:2938 +#: sql_help.c:2952 sql_help.c:3023 msgid "method" msgstr "метод" -#: sql_help.c:2463 -msgid "opclass_parameter" -msgstr "opclass_parameter" - -#: sql_help.c:2480 +#: sql_help.c:2509 msgid "call_handler" msgstr "обробник_виклику" -#: sql_help.c:2481 +#: sql_help.c:2510 msgid "inline_handler" msgstr "обробник_впровадженого_коду" -#: sql_help.c:2482 +#: sql_help.c:2511 msgid "valfunction" msgstr "функціÑ_перевірки" -#: sql_help.c:2521 -msgid "com_op" -msgstr "комут_оператор" - -#: sql_help.c:2522 -msgid "neg_op" -msgstr "зворотній_оператор" - -#: sql_help.c:2540 +#: sql_help.c:2569 msgid "family_name" msgstr "назва_ÑімейÑтва" -#: sql_help.c:2551 +#: sql_help.c:2580 msgid "storage_type" msgstr "тип_зберіганнÑ" -#: sql_help.c:2690 sql_help.c:3119 +#: sql_help.c:2715 sql_help.c:3147 msgid "where event can be one of:" msgstr "де Ð¿Ð¾Ð´Ñ–Ñ Ð¼Ð¾Ð¶Ðµ бути однією з:" -#: sql_help.c:2710 sql_help.c:2712 +#: sql_help.c:2735 sql_help.c:2737 msgid "schema_element" msgstr "елемент_Ñхеми" -#: sql_help.c:2749 +#: sql_help.c:2774 msgid "server_type" msgstr "тип_Ñерверу" -#: sql_help.c:2750 +#: sql_help.c:2775 msgid "server_version" msgstr "верÑÑ–Ñ_Ñерверу" -#: sql_help.c:2751 sql_help.c:3898 sql_help.c:4347 +#: sql_help.c:2776 sql_help.c:3929 sql_help.c:4392 msgid "fdw_name" msgstr "назва_fdw" -#: sql_help.c:2768 sql_help.c:2771 +#: sql_help.c:2793 sql_help.c:2796 msgid "statistics_name" msgstr "назва_ÑтатиÑтики" -#: sql_help.c:2772 +#: sql_help.c:2797 msgid "statistics_kind" msgstr "вид_ÑтатиÑтики" -#: sql_help.c:2788 +#: sql_help.c:2813 msgid "subscription_name" msgstr "назва_підпиÑки" -#: sql_help.c:2893 +#: sql_help.c:2918 msgid "source_table" msgstr "вихідна_таблицÑ" -#: sql_help.c:2894 +#: sql_help.c:2919 msgid "like_option" msgstr "параметр_породженнÑ" -#: sql_help.c:2960 +#: sql_help.c:2985 msgid "and like_option is:" msgstr "Ñ– параметр_породженнÑ:" -#: sql_help.c:3012 +#: sql_help.c:3040 msgid "directory" msgstr "каталог" -#: sql_help.c:3026 +#: sql_help.c:3054 msgid "parser_name" msgstr "назва_парÑера" -#: sql_help.c:3027 +#: sql_help.c:3055 msgid "source_config" msgstr "початкова_конфігураціÑ" -#: sql_help.c:3056 +#: sql_help.c:3084 msgid "start_function" msgstr "функціÑ_початку" -#: sql_help.c:3057 +#: sql_help.c:3085 msgid "gettoken_function" msgstr "функціÑ_видачі_токену" -#: sql_help.c:3058 +#: sql_help.c:3086 msgid "end_function" msgstr "функціÑ_завершеннÑ" -#: sql_help.c:3059 +#: sql_help.c:3087 msgid "lextypes_function" msgstr "функціÑ_лекÑ_типів" -#: sql_help.c:3060 +#: sql_help.c:3088 msgid "headline_function" msgstr "функціÑ_ÑтвореннÑ_заголовків" -#: sql_help.c:3072 +#: sql_help.c:3100 msgid "init_function" msgstr "функціÑ_ініціалізації" -#: sql_help.c:3073 +#: sql_help.c:3101 msgid "lexize_function" msgstr "функціÑ_виділеннÑ_лекÑем" -#: sql_help.c:3086 +#: sql_help.c:3114 msgid "from_sql_function_name" msgstr "ім'Ñ_функції_з_sql" -#: sql_help.c:3088 +#: sql_help.c:3116 msgid "to_sql_function_name" msgstr "ім'Ñ_функції_в_sql" -#: sql_help.c:3114 +#: sql_help.c:3142 msgid "referenced_table_name" msgstr "ім'Ñ_залежної_таблиці" -#: sql_help.c:3115 +#: sql_help.c:3143 msgid "transition_relation_name" msgstr "ім'Ñ_перехідного_відношеннÑ" -#: sql_help.c:3118 +#: sql_help.c:3146 msgid "arguments" msgstr "аргументи" -#: sql_help.c:3170 sql_help.c:4483 +#: sql_help.c:3198 msgid "label" msgstr "мітка" -#: sql_help.c:3172 +#: sql_help.c:3200 msgid "subtype" msgstr "підтип" -#: sql_help.c:3173 +#: sql_help.c:3201 msgid "subtype_operator_class" msgstr "клаÑ_оператора_підтипу" -#: sql_help.c:3175 +#: sql_help.c:3203 msgid "canonical_function" msgstr "канонічна_функціÑ" -#: sql_help.c:3176 +#: sql_help.c:3204 msgid "subtype_diff_function" msgstr "функціÑ_розбіжноÑтей_підтипу" -#: sql_help.c:3177 +#: sql_help.c:3205 msgid "multirange_type_name" msgstr "multirange_type_name" -#: sql_help.c:3179 +#: sql_help.c:3207 msgid "input_function" msgstr "функціÑ_вводу" -#: sql_help.c:3180 +#: sql_help.c:3208 msgid "output_function" msgstr "функціÑ_виводу" -#: sql_help.c:3181 +#: sql_help.c:3209 msgid "receive_function" msgstr "функціÑ_отриманнÑ" -#: sql_help.c:3182 +#: sql_help.c:3210 msgid "send_function" msgstr "функціÑ_відправки" -#: sql_help.c:3183 +#: sql_help.c:3211 msgid "type_modifier_input_function" msgstr "функціÑ_введеннÑ_модифікатора_типу" -#: sql_help.c:3184 +#: sql_help.c:3212 msgid "type_modifier_output_function" msgstr "функціÑ_виводу_модифікатора_типу" -#: sql_help.c:3185 +#: sql_help.c:3213 msgid "analyze_function" msgstr "функціÑ_аналізу" -#: sql_help.c:3186 +#: sql_help.c:3214 msgid "subscript_function" msgstr "subscript_function" -#: sql_help.c:3187 +#: sql_help.c:3215 msgid "internallength" msgstr "внутр_довжина" -#: sql_help.c:3188 +#: sql_help.c:3216 msgid "alignment" msgstr "вирівнюваннÑ" -#: sql_help.c:3189 +#: sql_help.c:3217 msgid "storage" msgstr "зберіганнÑ" -#: sql_help.c:3190 +#: sql_help.c:3218 msgid "like_type" msgstr "тип_зразок" -#: sql_help.c:3191 +#: sql_help.c:3219 msgid "category" msgstr "категоріÑ" -#: sql_help.c:3192 +#: sql_help.c:3220 msgid "preferred" msgstr "привілейований" -#: sql_help.c:3193 +#: sql_help.c:3221 msgid "default" msgstr "за_замовчуваннÑм" -#: sql_help.c:3194 +#: sql_help.c:3222 msgid "element" msgstr "елемент" -#: sql_help.c:3195 +#: sql_help.c:3223 msgid "delimiter" msgstr "роздільник" -#: sql_help.c:3196 +#: sql_help.c:3224 msgid "collatable" msgstr "Ñортувальний" -#: sql_help.c:3293 sql_help.c:3977 sql_help.c:4067 sql_help.c:4545 -#: sql_help.c:4642 sql_help.c:4794 sql_help.c:4902 sql_help.c:5025 +#: sql_help.c:3321 sql_help.c:4008 sql_help.c:4102 sql_help.c:4592 +#: sql_help.c:4695 sql_help.c:4850 sql_help.c:4964 sql_help.c:5095 msgid "with_query" msgstr "with_запит" -#: sql_help.c:3295 sql_help.c:3979 sql_help.c:4564 sql_help.c:4570 -#: sql_help.c:4573 sql_help.c:4577 sql_help.c:4581 sql_help.c:4589 -#: sql_help.c:4813 sql_help.c:4819 sql_help.c:4822 sql_help.c:4826 -#: sql_help.c:4830 sql_help.c:4838 sql_help.c:4904 sql_help.c:5044 -#: sql_help.c:5050 sql_help.c:5053 sql_help.c:5057 sql_help.c:5061 -#: sql_help.c:5069 +#: sql_help.c:3323 sql_help.c:4010 sql_help.c:4611 sql_help.c:4617 +#: sql_help.c:4620 sql_help.c:4624 sql_help.c:4628 sql_help.c:4636 +#: sql_help.c:4869 sql_help.c:4875 sql_help.c:4878 sql_help.c:4882 +#: sql_help.c:4886 sql_help.c:4894 sql_help.c:4966 sql_help.c:5114 +#: sql_help.c:5120 sql_help.c:5123 sql_help.c:5127 sql_help.c:5131 +#: sql_help.c:5139 msgid "alias" msgstr "пÑевдонім" -#: sql_help.c:3296 sql_help.c:4549 sql_help.c:4591 sql_help.c:4593 -#: sql_help.c:4647 sql_help.c:4798 sql_help.c:4840 sql_help.c:4842 -#: sql_help.c:4911 sql_help.c:5029 sql_help.c:5071 sql_help.c:5073 +#: sql_help.c:3324 sql_help.c:4596 sql_help.c:4638 sql_help.c:4640 +#: sql_help.c:4644 sql_help.c:4646 sql_help.c:4647 sql_help.c:4648 +#: sql_help.c:4700 sql_help.c:4854 sql_help.c:4896 sql_help.c:4898 +#: sql_help.c:4902 sql_help.c:4904 sql_help.c:4905 sql_help.c:4906 +#: sql_help.c:4973 sql_help.c:5099 sql_help.c:5141 sql_help.c:5143 +#: sql_help.c:5147 sql_help.c:5149 sql_help.c:5150 sql_help.c:5151 msgid "from_item" msgstr "джерело_даних" -#: sql_help.c:3298 sql_help.c:3779 sql_help.c:4117 sql_help.c:4913 +#: sql_help.c:3326 sql_help.c:3810 sql_help.c:4159 sql_help.c:4975 msgid "cursor_name" msgstr "ім'Ñ_курÑору" -#: sql_help.c:3299 sql_help.c:3985 sql_help.c:4914 +#: sql_help.c:3327 sql_help.c:4016 sql_help.c:4108 sql_help.c:4976 msgid "output_expression" msgstr "вираз_результату" -#: sql_help.c:3300 sql_help.c:3986 sql_help.c:4548 sql_help.c:4645 -#: sql_help.c:4797 sql_help.c:4915 sql_help.c:5028 +#: sql_help.c:3328 sql_help.c:4017 sql_help.c:4109 sql_help.c:4595 +#: sql_help.c:4698 sql_help.c:4853 sql_help.c:4977 sql_help.c:5098 msgid "output_name" msgstr "ім'Ñ_результату" -#: sql_help.c:3316 +#: sql_help.c:3344 msgid "code" msgstr "код" -#: sql_help.c:3721 +#: sql_help.c:3749 msgid "parameter" msgstr "параметр" -#: sql_help.c:3743 sql_help.c:3744 sql_help.c:4142 +#: sql_help.c:3773 sql_help.c:4184 msgid "statement" msgstr "оператор" -#: sql_help.c:3778 sql_help.c:4116 +#: sql_help.c:3809 sql_help.c:4158 msgid "direction" msgstr "напрÑмок" -#: sql_help.c:3780 sql_help.c:4118 -msgid "where direction can be empty or one of:" -msgstr "де напрÑмок може бути пуÑтим або одним із:" +#: sql_help.c:3811 sql_help.c:4160 +msgid "where direction can be one of:" +msgstr "де напрÑмок може бути одним із:" -#: sql_help.c:3781 sql_help.c:3782 sql_help.c:3783 sql_help.c:3784 -#: sql_help.c:3785 sql_help.c:4119 sql_help.c:4120 sql_help.c:4121 -#: sql_help.c:4122 sql_help.c:4123 sql_help.c:4558 sql_help.c:4560 -#: sql_help.c:4656 sql_help.c:4658 sql_help.c:4807 sql_help.c:4809 -#: sql_help.c:4971 sql_help.c:4973 sql_help.c:5038 sql_help.c:5040 +#: sql_help.c:3812 sql_help.c:3813 sql_help.c:3814 sql_help.c:3815 +#: sql_help.c:3816 sql_help.c:4161 sql_help.c:4162 sql_help.c:4163 +#: sql_help.c:4164 sql_help.c:4165 sql_help.c:4605 sql_help.c:4607 +#: sql_help.c:4709 sql_help.c:4711 sql_help.c:4863 sql_help.c:4865 +#: sql_help.c:5039 sql_help.c:5041 sql_help.c:5108 sql_help.c:5110 msgid "count" msgstr "кількіÑть" -#: sql_help.c:3888 sql_help.c:4337 +#: sql_help.c:3919 sql_help.c:4382 msgid "sequence_name" msgstr "ім'Ñ_поÑлідовноÑті" -#: sql_help.c:3906 sql_help.c:4355 +#: sql_help.c:3937 sql_help.c:4400 msgid "arg_name" msgstr "ім'Ñ_аргументу" -#: sql_help.c:3907 sql_help.c:4356 +#: sql_help.c:3938 sql_help.c:4401 msgid "arg_type" msgstr "тип_аргументу" -#: sql_help.c:3914 sql_help.c:4363 +#: sql_help.c:3945 sql_help.c:4408 msgid "loid" msgstr "код_вел_об'єкту" -#: sql_help.c:3945 +#: sql_help.c:3976 msgid "remote_schema" msgstr "віддалена_Ñхема" -#: sql_help.c:3948 +#: sql_help.c:3979 msgid "local_schema" msgstr "локальна_Ñхема" -#: sql_help.c:3983 +#: sql_help.c:4014 msgid "conflict_target" msgstr "ціль_конфлікту" -#: sql_help.c:3984 +#: sql_help.c:4015 msgid "conflict_action" msgstr "діÑ_при_конфлікті" -#: sql_help.c:3987 +#: sql_help.c:4018 msgid "where conflict_target can be one of:" msgstr "де ціль_конфлікту може бути одним з:" -#: sql_help.c:3988 +#: sql_help.c:4019 msgid "index_column_name" msgstr "ім'Ñ_ÑтовпцÑ_індекÑу" -#: sql_help.c:3989 +#: sql_help.c:4020 msgid "index_expression" msgstr "вираз_індекÑу" -#: sql_help.c:3992 +#: sql_help.c:4023 msgid "index_predicate" msgstr "предикат_індекÑу" -#: sql_help.c:3994 +#: sql_help.c:4025 msgid "and conflict_action is one of:" msgstr "Ñ– діÑ_при_конфлікті одна з:" -#: sql_help.c:4000 sql_help.c:4910 +#: sql_help.c:4031 sql_help.c:4132 sql_help.c:4972 msgid "sub-SELECT" msgstr "вкладений-SELECT" -#: sql_help.c:4009 sql_help.c:4131 sql_help.c:4886 +#: sql_help.c:4040 sql_help.c:4173 sql_help.c:4948 msgid "channel" msgstr "канал" -#: sql_help.c:4031 +#: sql_help.c:4062 msgid "lockmode" msgstr "режим_блокуваннÑ" -#: sql_help.c:4032 +#: sql_help.c:4063 msgid "where lockmode is one of:" msgstr "де режим_Ð±Ð»Ð¾ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¾Ð´Ð¸Ð½ з:" -#: sql_help.c:4068 +#: sql_help.c:4103 msgid "target_table_name" msgstr "ім'Ñ_цілі_таблиці" -#: sql_help.c:4069 +#: sql_help.c:4104 msgid "target_alias" msgstr "пÑевдонім_цілі" -#: sql_help.c:4070 +#: sql_help.c:4105 msgid "data_source" msgstr "джерело_даних" -#: sql_help.c:4071 sql_help.c:4594 sql_help.c:4843 sql_help.c:5074 +#: sql_help.c:4106 sql_help.c:4641 sql_help.c:4899 sql_help.c:5144 msgid "join_condition" msgstr "умова_поєднаннÑ" -#: sql_help.c:4072 +#: sql_help.c:4107 msgid "when_clause" msgstr "when_твердженнÑ" -#: sql_help.c:4073 +#: sql_help.c:4110 msgid "where data_source is:" msgstr "де джерело_даних:" -#: sql_help.c:4074 +#: sql_help.c:4111 msgid "source_table_name" msgstr "ім'Ñ_початкова_таблиці" -#: sql_help.c:4075 +#: sql_help.c:4112 msgid "source_query" msgstr "джерело_запит" -#: sql_help.c:4076 +#: sql_help.c:4113 msgid "source_alias" msgstr "джерело_пÑевдоніма" -#: sql_help.c:4077 +#: sql_help.c:4114 msgid "and when_clause is:" msgstr "Ñ– when_clause:" -#: sql_help.c:4079 +#: sql_help.c:4116 sql_help.c:4119 msgid "merge_update" msgstr "merge_update" -#: sql_help.c:4080 +#: sql_help.c:4117 sql_help.c:4120 msgid "merge_delete" msgstr "merge_delete" -#: sql_help.c:4082 +#: sql_help.c:4122 msgid "merge_insert" msgstr "merge_insert" -#: sql_help.c:4083 +#: sql_help.c:4123 msgid "and merge_insert is:" msgstr "Ñ– merge_insert:" -#: sql_help.c:4086 +#: sql_help.c:4126 msgid "and merge_update is:" msgstr "Ñ– merge_update:" -#: sql_help.c:4091 +#: sql_help.c:4133 msgid "and merge_delete is:" msgstr "Ñ– merge_delete:" -#: sql_help.c:4132 +#: sql_help.c:4174 msgid "payload" msgstr "зміÑÑ‚" -#: sql_help.c:4159 +#: sql_help.c:4201 msgid "old_role" msgstr "Ñтара_роль" -#: sql_help.c:4160 +#: sql_help.c:4202 msgid "new_role" msgstr "нова_роль" -#: sql_help.c:4196 sql_help.c:4405 sql_help.c:4413 +#: sql_help.c:4241 sql_help.c:4450 sql_help.c:4458 msgid "savepoint_name" msgstr "ім'Ñ_точки_збереженнÑ" -#: sql_help.c:4551 sql_help.c:4604 sql_help.c:4800 sql_help.c:4853 -#: sql_help.c:5031 sql_help.c:5084 +#: sql_help.c:4598 sql_help.c:4656 sql_help.c:4856 sql_help.c:4914 +#: sql_help.c:5101 sql_help.c:5159 msgid "grouping_element" msgstr "елемент_групуваннÑ" -#: sql_help.c:4553 sql_help.c:4651 sql_help.c:4802 sql_help.c:5033 +#: sql_help.c:4600 sql_help.c:4704 sql_help.c:4858 sql_help.c:5103 msgid "window_name" msgstr "назва_вікна" -#: sql_help.c:4554 sql_help.c:4652 sql_help.c:4803 sql_help.c:5034 +#: sql_help.c:4601 sql_help.c:4705 sql_help.c:4859 sql_help.c:5104 msgid "window_definition" msgstr "визначеннÑ_вікна" -#: sql_help.c:4555 sql_help.c:4569 sql_help.c:4608 sql_help.c:4653 -#: sql_help.c:4804 sql_help.c:4818 sql_help.c:4857 sql_help.c:5035 -#: sql_help.c:5049 sql_help.c:5088 +#: sql_help.c:4602 sql_help.c:4616 sql_help.c:4660 sql_help.c:4706 +#: sql_help.c:4860 sql_help.c:4874 sql_help.c:4918 sql_help.c:5105 +#: sql_help.c:5119 sql_help.c:5163 msgid "select" msgstr "виберіть" -#: sql_help.c:4562 sql_help.c:4811 sql_help.c:5042 +#: sql_help.c:4608 sql_help.c:4866 sql_help.c:5111 +msgid "from_reference" +msgstr "from_reference" + +#: sql_help.c:4609 sql_help.c:4867 sql_help.c:5112 msgid "where from_item can be one of:" msgstr "де джерело_даних може бути одним з:" -#: sql_help.c:4565 sql_help.c:4571 sql_help.c:4574 sql_help.c:4578 -#: sql_help.c:4590 sql_help.c:4814 sql_help.c:4820 sql_help.c:4823 -#: sql_help.c:4827 sql_help.c:4839 sql_help.c:5045 sql_help.c:5051 -#: sql_help.c:5054 sql_help.c:5058 sql_help.c:5070 +#: sql_help.c:4612 sql_help.c:4618 sql_help.c:4621 sql_help.c:4625 +#: sql_help.c:4637 sql_help.c:4870 sql_help.c:4876 sql_help.c:4879 +#: sql_help.c:4883 sql_help.c:4895 sql_help.c:5115 sql_help.c:5121 +#: sql_help.c:5124 sql_help.c:5128 sql_help.c:5140 msgid "column_alias" msgstr "пÑевдонім_ÑтовпцÑ" -#: sql_help.c:4566 sql_help.c:4815 sql_help.c:5046 +#: sql_help.c:4613 sql_help.c:4871 sql_help.c:5116 msgid "sampling_method" msgstr "метод_вибірки" -#: sql_help.c:4568 sql_help.c:4817 sql_help.c:5048 +#: sql_help.c:4615 sql_help.c:4873 sql_help.c:5118 msgid "seed" msgstr "початкове_чиÑло" -#: sql_help.c:4572 sql_help.c:4606 sql_help.c:4821 sql_help.c:4855 -#: sql_help.c:5052 sql_help.c:5086 +#: sql_help.c:4619 sql_help.c:4658 sql_help.c:4877 sql_help.c:4916 +#: sql_help.c:5122 sql_help.c:5161 msgid "with_query_name" msgstr "ім'Ñ_запиту_WITH" -#: sql_help.c:4582 sql_help.c:4585 sql_help.c:4588 sql_help.c:4831 -#: sql_help.c:4834 sql_help.c:4837 sql_help.c:5062 sql_help.c:5065 -#: sql_help.c:5068 +#: sql_help.c:4629 sql_help.c:4632 sql_help.c:4635 sql_help.c:4887 +#: sql_help.c:4890 sql_help.c:4893 sql_help.c:5132 sql_help.c:5135 +#: sql_help.c:5138 msgid "column_definition" msgstr "визначеннÑ_ÑтовпцÑ" -#: sql_help.c:4592 sql_help.c:4841 sql_help.c:5072 +#: sql_help.c:4639 sql_help.c:4645 sql_help.c:4897 sql_help.c:4903 +#: sql_help.c:5142 sql_help.c:5148 msgid "join_type" msgstr "тип_поєднаннÑ" -#: sql_help.c:4595 sql_help.c:4844 sql_help.c:5075 +#: sql_help.c:4642 sql_help.c:4900 sql_help.c:5145 msgid "join_column" msgstr "Ñтовпець_поєднаннÑ" -#: sql_help.c:4596 sql_help.c:4845 sql_help.c:5076 +#: sql_help.c:4643 sql_help.c:4901 sql_help.c:5146 msgid "join_using_alias" msgstr "join_using_alias" -#: sql_help.c:4597 sql_help.c:4846 sql_help.c:5077 +#: sql_help.c:4649 sql_help.c:4907 sql_help.c:5152 msgid "and grouping_element can be one of:" msgstr "Ñ– елемент_Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бути одним з:" -#: sql_help.c:4605 sql_help.c:4854 sql_help.c:5085 +#: sql_help.c:4657 sql_help.c:4915 sql_help.c:5160 msgid "and with_query is:" msgstr "Ñ– запит_WITH:" -#: sql_help.c:4609 sql_help.c:4858 sql_help.c:5089 +#: sql_help.c:4661 sql_help.c:4919 sql_help.c:5164 msgid "values" msgstr "значеннÑ" -#: sql_help.c:4610 sql_help.c:4859 sql_help.c:5090 +#: sql_help.c:4662 sql_help.c:4920 sql_help.c:5165 msgid "insert" msgstr "вÑтавка" -#: sql_help.c:4611 sql_help.c:4860 sql_help.c:5091 +#: sql_help.c:4663 sql_help.c:4921 sql_help.c:5166 msgid "update" msgstr "оновленнÑ" -#: sql_help.c:4612 sql_help.c:4861 sql_help.c:5092 +#: sql_help.c:4664 sql_help.c:4922 sql_help.c:5167 msgid "delete" msgstr "видаленнÑ" -#: sql_help.c:4614 sql_help.c:4863 sql_help.c:5094 +#: sql_help.c:4665 sql_help.c:4923 sql_help.c:5168 +msgid "merge" +msgstr "об’єднати" + +#: sql_help.c:4667 sql_help.c:4925 sql_help.c:5170 msgid "search_seq_col_name" msgstr "search_seq_col_name" -#: sql_help.c:4616 sql_help.c:4865 sql_help.c:5096 +#: sql_help.c:4669 sql_help.c:4927 sql_help.c:5172 msgid "cycle_mark_col_name" msgstr "cycle_mark_col_name" -#: sql_help.c:4617 sql_help.c:4866 sql_help.c:5097 +#: sql_help.c:4670 sql_help.c:4928 sql_help.c:5173 msgid "cycle_mark_value" msgstr "cycle_mark_value" -#: sql_help.c:4618 sql_help.c:4867 sql_help.c:5098 +#: sql_help.c:4671 sql_help.c:4929 sql_help.c:5174 msgid "cycle_mark_default" msgstr "cycle_mark_default" -#: sql_help.c:4619 sql_help.c:4868 sql_help.c:5099 +#: sql_help.c:4672 sql_help.c:4930 sql_help.c:5175 msgid "cycle_path_col_name" msgstr "cycle_path_col_name" -#: sql_help.c:4646 +#: sql_help.c:4699 msgid "new_table" msgstr "нова_таблицÑ" -#: sql_help.c:4671 -msgid "timezone" -msgstr "чаÑовий поÑÑ" - -#: sql_help.c:4716 +#: sql_help.c:4770 msgid "snapshot_id" msgstr "код_знімку" -#: sql_help.c:4969 +#: sql_help.c:5037 msgid "sort_expression" msgstr "вираз_ÑортуваннÑ" -#: sql_help.c:5106 sql_help.c:6090 +#: sql_help.c:5182 sql_help.c:6166 msgid "abort the current transaction" msgstr "перервати поточну транзакцію" -#: sql_help.c:5112 +#: sql_help.c:5188 msgid "change the definition of an aggregate function" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð°Ð³Ñ€ÐµÐ³Ð°Ñ‚Ð½Ð¾Ñ— функції" -#: sql_help.c:5118 +#: sql_help.c:5194 msgid "change the definition of a collation" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° ÑортуваннÑ" -#: sql_help.c:5124 +#: sql_help.c:5200 msgid "change the definition of a conversion" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ" -#: sql_help.c:5130 +#: sql_help.c:5206 msgid "change a database" msgstr "змінити базу даних" -#: sql_help.c:5136 +#: sql_help.c:5212 msgid "define default access privileges" msgstr "визначити права доÑтупу за замовчуваннÑм" -#: sql_help.c:5142 +#: sql_help.c:5218 msgid "change the definition of a domain" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¾Ð¼ÐµÐ½Ñƒ" -#: sql_help.c:5148 +#: sql_help.c:5224 msgid "change the definition of an event trigger" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñƒ події" -#: sql_help.c:5154 +#: sql_help.c:5230 msgid "change the definition of an extension" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ" -#: sql_help.c:5160 +#: sql_help.c:5236 msgid "change the definition of a foreign-data wrapper" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð¶ÐµÑ€ÐµÐ»Ð° Ñторонніх даних" -#: sql_help.c:5166 +#: sql_help.c:5242 msgid "change the definition of a foreign table" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñторонньої таблиці" -#: sql_help.c:5172 +#: sql_help.c:5248 msgid "change the definition of a function" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—" -#: sql_help.c:5178 +#: sql_help.c:5254 msgid "change role name or membership" msgstr "змінити назву ролі або членÑтва" -#: sql_help.c:5184 +#: sql_help.c:5260 msgid "change the definition of an index" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу" -#: sql_help.c:5190 +#: sql_help.c:5266 msgid "change the definition of a procedural language" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð½Ð¾Ñ— мови" -#: sql_help.c:5196 +#: sql_help.c:5272 msgid "change the definition of a large object" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²ÐµÐ»Ð¸ÐºÐ¾Ð³Ð¾ об'єкту" -#: sql_help.c:5202 +#: sql_help.c:5278 msgid "change the definition of a materialized view" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð°Ñ‚ÐµÑ€Ñ–Ð°Ð»Ñ–Ð·Ð¾Ð²Ð°Ð½Ð¾Ð³Ð¾ поданнÑ" -#: sql_help.c:5208 +#: sql_help.c:5284 msgid "change the definition of an operator" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°" -#: sql_help.c:5214 +#: sql_help.c:5290 msgid "change the definition of an operator class" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ñа операторів" -#: sql_help.c:5220 +#: sql_help.c:5296 msgid "change the definition of an operator family" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑімейÑтва операторів" -#: sql_help.c:5226 +#: sql_help.c:5302 msgid "change the definition of a row-level security policy" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ñ‚Ð¸ÐºÐ¸ безпеки на рівні Ñ€Ñдків" -#: sql_help.c:5232 +#: sql_help.c:5308 msgid "change the definition of a procedure" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸" -#: sql_help.c:5238 +#: sql_help.c:5314 msgid "change the definition of a publication" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ†Ñ–Ñ—" -#: sql_help.c:5244 sql_help.c:5346 +#: sql_help.c:5320 sql_help.c:5422 msgid "change a database role" msgstr "змінити роль бази даних" -#: sql_help.c:5250 +#: sql_help.c:5326 msgid "change the definition of a routine" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸" -#: sql_help.c:5256 +#: sql_help.c:5332 msgid "change the definition of a rule" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð°" -#: sql_help.c:5262 +#: sql_help.c:5338 msgid "change the definition of a schema" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñхеми" -#: sql_help.c:5268 +#: sql_help.c:5344 msgid "change the definition of a sequence generator" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñƒ поÑлідовноÑті" -#: sql_help.c:5274 +#: sql_help.c:5350 msgid "change the definition of a foreign server" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñтороннього Ñерверу" -#: sql_help.c:5280 +#: sql_help.c:5356 msgid "change the definition of an extended statistics object" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð±'єкту розширеної ÑтатиÑтики" -#: sql_help.c:5286 +#: sql_help.c:5362 msgid "change the definition of a subscription" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´Ð¿Ð¸Ñки" -#: sql_help.c:5292 +#: sql_help.c:5368 msgid "change a server configuration parameter" msgstr "змінити параметр конфігурації Ñервера" -#: sql_help.c:5298 +#: sql_help.c:5374 msgid "change the definition of a table" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–" -#: sql_help.c:5304 +#: sql_help.c:5380 msgid "change the definition of a tablespace" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ проÑтору" -#: sql_help.c:5310 +#: sql_help.c:5386 msgid "change the definition of a text search configuration" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ„Ñ–Ð³ÑƒÑ€Ð°Ñ†Ñ–Ñ— текÑтового пошуку" -#: sql_help.c:5316 +#: sql_help.c:5392 msgid "change the definition of a text search dictionary" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñловника текÑтового пошуку" -#: sql_help.c:5322 +#: sql_help.c:5398 msgid "change the definition of a text search parser" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ñера текÑтового пошуку" -#: sql_help.c:5328 +#: sql_help.c:5404 msgid "change the definition of a text search template" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð° текÑтового пошуку" -#: sql_help.c:5334 +#: sql_help.c:5410 msgid "change the definition of a trigger" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ñƒ" -#: sql_help.c:5340 +#: sql_help.c:5416 msgid "change the definition of a type" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ" -#: sql_help.c:5352 +#: sql_help.c:5428 msgid "change the definition of a user mapping" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ñ–Ñтавлень кориÑтувачів" -#: sql_help.c:5358 +#: sql_help.c:5434 msgid "change the definition of a view" msgstr "змінити Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð´Ð°Ð½Ð½Ñ" -#: sql_help.c:5364 +#: sql_help.c:5440 msgid "collect statistics about a database" msgstr "зібрати ÑтатиÑтику про базу даних" -#: sql_help.c:5370 sql_help.c:6168 +#: sql_help.c:5446 sql_help.c:6244 msgid "start a transaction block" msgstr "розпочати транзакцію" -#: sql_help.c:5376 +#: sql_help.c:5452 msgid "invoke a procedure" msgstr "викликати процедуру" -#: sql_help.c:5382 +#: sql_help.c:5458 msgid "force a write-ahead log checkpoint" msgstr "провеÑти контрольну точку в журналі попереднього запиÑу" -#: sql_help.c:5388 +#: sql_help.c:5464 msgid "close a cursor" msgstr "закрити курÑор" -#: sql_help.c:5394 +#: sql_help.c:5470 msgid "cluster a table according to an index" msgstr "перегрупувати таблицю за індекÑом" -#: sql_help.c:5400 +#: sql_help.c:5476 msgid "define or change the comment of an object" msgstr "задати або змінити коментар об'єкта" -#: sql_help.c:5406 sql_help.c:5964 +#: sql_help.c:5482 sql_help.c:6040 msgid "commit the current transaction" msgstr "затвердити поточну транзакцію" -#: sql_help.c:5412 +#: sql_help.c:5488 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "затвердити транзакцію, раніше підготовлену до двохфазного затвердженнÑ" -#: sql_help.c:5418 +#: sql_help.c:5494 msgid "copy data between a file and a table" msgstr "копіювати дані між файлом та таблицею" -#: sql_help.c:5424 +#: sql_help.c:5500 msgid "define a new access method" msgstr "визначити новий метод доÑтупу" -#: sql_help.c:5430 +#: sql_help.c:5506 msgid "define a new aggregate function" msgstr "визначити нову агрегатну функцію" -#: sql_help.c:5436 +#: sql_help.c:5512 msgid "define a new cast" msgstr "визначити Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð²" -#: sql_help.c:5442 +#: sql_help.c:5518 msgid "define a new collation" msgstr "визначити нове правило ÑортуваннÑ" -#: sql_help.c:5448 +#: sql_help.c:5524 msgid "define a new encoding conversion" msgstr "визначити нове Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ" -#: sql_help.c:5454 +#: sql_help.c:5530 msgid "create a new database" msgstr "Ñтворити нову базу даних" -#: sql_help.c:5460 +#: sql_help.c:5536 msgid "define a new domain" msgstr "визначити новий домен" -#: sql_help.c:5466 +#: sql_help.c:5542 msgid "define a new event trigger" msgstr "визначити новий тригер події" -#: sql_help.c:5472 +#: sql_help.c:5548 msgid "install an extension" msgstr "вÑтановити розширеннÑ" -#: sql_help.c:5478 +#: sql_help.c:5554 msgid "define a new foreign-data wrapper" msgstr "визначити нове джерело Ñторонніх даних" -#: sql_help.c:5484 +#: sql_help.c:5560 msgid "define a new foreign table" msgstr "визначити нову Ñторонню таблицю" -#: sql_help.c:5490 +#: sql_help.c:5566 msgid "define a new function" msgstr "визначити нову функцію" -#: sql_help.c:5496 sql_help.c:5556 sql_help.c:5658 +#: sql_help.c:5572 sql_help.c:5632 sql_help.c:5734 msgid "define a new database role" msgstr "визначити нову роль бази даних" -#: sql_help.c:5502 +#: sql_help.c:5578 msgid "define a new index" msgstr "визначити новий індекÑ" -#: sql_help.c:5508 +#: sql_help.c:5584 msgid "define a new procedural language" msgstr "визначити нову процедурну мову" -#: sql_help.c:5514 +#: sql_help.c:5590 msgid "define a new materialized view" msgstr "визначити нове матеріалізоване поданнÑ" -#: sql_help.c:5520 +#: sql_help.c:5596 msgid "define a new operator" msgstr "визначити новий оператор" -#: sql_help.c:5526 +#: sql_help.c:5602 msgid "define a new operator class" msgstr "визначити новий ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð°" -#: sql_help.c:5532 +#: sql_help.c:5608 msgid "define a new operator family" msgstr "визначити нове ÑімейÑтво операторів" -#: sql_help.c:5538 +#: sql_help.c:5614 msgid "define a new row-level security policy for a table" msgstr "визначити нову політику безпеки на рівні Ñ€Ñдків Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–" -#: sql_help.c:5544 +#: sql_help.c:5620 msgid "define a new procedure" msgstr "визначити нову процедуру" -#: sql_help.c:5550 +#: sql_help.c:5626 msgid "define a new publication" msgstr "визначити нову публікацію" -#: sql_help.c:5562 +#: sql_help.c:5638 msgid "define a new rewrite rule" msgstr "визначити нове правило перезапиÑу" -#: sql_help.c:5568 +#: sql_help.c:5644 msgid "define a new schema" msgstr "визначити нову Ñхему" -#: sql_help.c:5574 +#: sql_help.c:5650 msgid "define a new sequence generator" msgstr "визначити новий генератор поÑлідовноÑтей" -#: sql_help.c:5580 +#: sql_help.c:5656 msgid "define a new foreign server" msgstr "визначити новий Ñторонній Ñервер" -#: sql_help.c:5586 +#: sql_help.c:5662 msgid "define extended statistics" msgstr "визначити розширену ÑтатиÑтику" -#: sql_help.c:5592 +#: sql_help.c:5668 msgid "define a new subscription" msgstr "визначити нову підпиÑку" -#: sql_help.c:5598 +#: sql_help.c:5674 msgid "define a new table" msgstr "визначити нову таблицю" -#: sql_help.c:5604 sql_help.c:6126 +#: sql_help.c:5680 sql_help.c:6202 msgid "define a new table from the results of a query" msgstr "визначити нову таблицю з результатів запиту" -#: sql_help.c:5610 +#: sql_help.c:5686 msgid "define a new tablespace" msgstr "визначити новий табличний проÑтір" -#: sql_help.c:5616 +#: sql_help.c:5692 msgid "define a new text search configuration" msgstr "визначити нову конфігурацію текÑтового пошуку" -#: sql_help.c:5622 +#: sql_help.c:5698 msgid "define a new text search dictionary" msgstr "визначити новий Ñловник текÑтового пошуку" -#: sql_help.c:5628 +#: sql_help.c:5704 msgid "define a new text search parser" msgstr "визначити новий аналізатор текÑтового пошуку" -#: sql_help.c:5634 +#: sql_help.c:5710 msgid "define a new text search template" msgstr "визначити новий шаблон текÑтового пошуку" -#: sql_help.c:5640 +#: sql_help.c:5716 msgid "define a new transform" msgstr "визначити нове перетвореннÑ" -#: sql_help.c:5646 +#: sql_help.c:5722 msgid "define a new trigger" msgstr "визначити новий тригер" -#: sql_help.c:5652 +#: sql_help.c:5728 msgid "define a new data type" msgstr "визначити новий тип даних" -#: sql_help.c:5664 +#: sql_help.c:5740 msgid "define a new mapping of a user to a foreign server" msgstr "визначити нове зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ñтороннього Ñервера" -#: sql_help.c:5670 +#: sql_help.c:5746 msgid "define a new view" msgstr "визначити нове поданнÑ" -#: sql_help.c:5676 +#: sql_help.c:5752 msgid "deallocate a prepared statement" msgstr "звільнити підготовлену команду" -#: sql_help.c:5682 +#: sql_help.c:5758 msgid "define a cursor" msgstr "визначити курÑор" -#: sql_help.c:5688 +#: sql_help.c:5764 msgid "delete rows of a table" msgstr "видалити Ñ€Ñдки таблиці" -#: sql_help.c:5694 +#: sql_help.c:5770 msgid "discard session state" msgstr "очиÑтити Ñтан ÑеÑÑ–Ñ—" -#: sql_help.c:5700 +#: sql_help.c:5776 msgid "execute an anonymous code block" msgstr "виконати анонімний блок коду" -#: sql_help.c:5706 +#: sql_help.c:5782 msgid "remove an access method" msgstr "видалити метод доÑтупу" -#: sql_help.c:5712 +#: sql_help.c:5788 msgid "remove an aggregate function" msgstr "видалити агрегатну функцію" -#: sql_help.c:5718 +#: sql_help.c:5794 msgid "remove a cast" msgstr "видалити Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñ–Ð²" -#: sql_help.c:5724 +#: sql_help.c:5800 msgid "remove a collation" msgstr "видалити правило ÑортуваннÑ" -#: sql_help.c:5730 +#: sql_help.c:5806 msgid "remove a conversion" msgstr "видалити перетвореннÑ" -#: sql_help.c:5736 +#: sql_help.c:5812 msgid "remove a database" msgstr "видалити базу даних" -#: sql_help.c:5742 +#: sql_help.c:5818 msgid "remove a domain" msgstr "видалити домен" -#: sql_help.c:5748 +#: sql_help.c:5824 msgid "remove an event trigger" msgstr "видалити тригер події" -#: sql_help.c:5754 +#: sql_help.c:5830 msgid "remove an extension" msgstr "видалити розширеннÑ" -#: sql_help.c:5760 +#: sql_help.c:5836 msgid "remove a foreign-data wrapper" msgstr "видалити джерело Ñторонніх даних" -#: sql_help.c:5766 +#: sql_help.c:5842 msgid "remove a foreign table" msgstr "видалити Ñторонню таблицю" -#: sql_help.c:5772 +#: sql_help.c:5848 msgid "remove a function" msgstr "видалити функцію" -#: sql_help.c:5778 sql_help.c:5844 sql_help.c:5946 +#: sql_help.c:5854 sql_help.c:5920 sql_help.c:6022 msgid "remove a database role" msgstr "видалити роль бази даних" -#: sql_help.c:5784 +#: sql_help.c:5860 msgid "remove an index" msgstr "видалити індекÑ" -#: sql_help.c:5790 +#: sql_help.c:5866 msgid "remove a procedural language" msgstr "видалити процедурну мову" -#: sql_help.c:5796 +#: sql_help.c:5872 msgid "remove a materialized view" msgstr "видалити матеріалізоване поданнÑ" -#: sql_help.c:5802 +#: sql_help.c:5878 msgid "remove an operator" msgstr "видалити оператор" -#: sql_help.c:5808 +#: sql_help.c:5884 msgid "remove an operator class" msgstr "видалити ÐºÐ»Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ñ–Ð²" -#: sql_help.c:5814 +#: sql_help.c:5890 msgid "remove an operator family" msgstr "видалити ÑімейÑтво операторів" -#: sql_help.c:5820 +#: sql_help.c:5896 msgid "remove database objects owned by a database role" msgstr "видалити об'єкти бази даних, що належать ролі" -#: sql_help.c:5826 +#: sql_help.c:5902 msgid "remove a row-level security policy from a table" msgstr "видалити політику безпеки на рівні Ñ€Ñдків з таблиці" -#: sql_help.c:5832 +#: sql_help.c:5908 msgid "remove a procedure" msgstr "видалити процедуру" -#: sql_help.c:5838 +#: sql_help.c:5914 msgid "remove a publication" msgstr "видалити публікацію" -#: sql_help.c:5850 +#: sql_help.c:5926 msgid "remove a routine" msgstr "видалити підпрограму" -#: sql_help.c:5856 +#: sql_help.c:5932 msgid "remove a rewrite rule" msgstr "видалити правило перезапиÑу" -#: sql_help.c:5862 +#: sql_help.c:5938 msgid "remove a schema" msgstr "видалити Ñхему" -#: sql_help.c:5868 +#: sql_help.c:5944 msgid "remove a sequence" msgstr "видалити поÑлідовніÑть" -#: sql_help.c:5874 +#: sql_help.c:5950 msgid "remove a foreign server descriptor" msgstr "видалити Ð¾Ð¿Ð¸Ñ Ñтороннього Ñерверу" -#: sql_help.c:5880 +#: sql_help.c:5956 msgid "remove extended statistics" msgstr "видалити розширену ÑтатиÑтику" -#: sql_help.c:5886 +#: sql_help.c:5962 msgid "remove a subscription" msgstr "видалити підпиÑку" -#: sql_help.c:5892 +#: sql_help.c:5968 msgid "remove a table" msgstr "видалити таблицю" -#: sql_help.c:5898 +#: sql_help.c:5974 msgid "remove a tablespace" msgstr "видалити табличний проÑтір" -#: sql_help.c:5904 +#: sql_help.c:5980 msgid "remove a text search configuration" msgstr "видалити конфігурацію тектового пошуку" -#: sql_help.c:5910 +#: sql_help.c:5986 msgid "remove a text search dictionary" msgstr "видалити Ñловник тектового пошуку" -#: sql_help.c:5916 +#: sql_help.c:5992 msgid "remove a text search parser" msgstr "видалити парÑер тектового пошуку" -#: sql_help.c:5922 +#: sql_help.c:5998 msgid "remove a text search template" msgstr "видалити шаблон тектового пошуку" -#: sql_help.c:5928 +#: sql_help.c:6004 msgid "remove a transform" msgstr "видалити перетвореннÑ" -#: sql_help.c:5934 +#: sql_help.c:6010 msgid "remove a trigger" msgstr "видалити тригер" -#: sql_help.c:5940 +#: sql_help.c:6016 msgid "remove a data type" msgstr "видалити тип даних" -#: sql_help.c:5952 +#: sql_help.c:6028 msgid "remove a user mapping for a foreign server" msgstr "видалити зіÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ñтороннього Ñерверу" -#: sql_help.c:5958 +#: sql_help.c:6034 msgid "remove a view" msgstr "видалити поданнÑ" -#: sql_help.c:5970 +#: sql_help.c:6046 msgid "execute a prepared statement" msgstr "виконати підготовлену команду" -#: sql_help.c:5976 +#: sql_help.c:6052 msgid "show the execution plan of a statement" msgstr "показати план Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸" -#: sql_help.c:5982 +#: sql_help.c:6058 msgid "retrieve rows from a query using a cursor" msgstr "отримати Ñ€Ñдки запиту з курÑору" -#: sql_help.c:5988 +#: sql_help.c:6064 msgid "define access privileges" msgstr "визначити права доÑтупу" -#: sql_help.c:5994 +#: sql_help.c:6070 msgid "import table definitions from a foreign server" msgstr "імпортувати Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†ÑŒ зі Ñтороннього Ñерверу" -#: sql_help.c:6000 +#: sql_help.c:6076 msgid "create new rows in a table" msgstr "Ñтворити нові Ñ€Ñдки в таблиці" -#: sql_help.c:6006 +#: sql_help.c:6082 msgid "listen for a notification" msgstr "очікувати на повідомленнÑ" -#: sql_help.c:6012 +#: sql_help.c:6088 msgid "load a shared library file" msgstr "завантажити файл Ñпільної бібліотеки" -#: sql_help.c:6018 +#: sql_help.c:6094 msgid "lock a table" msgstr "заблокувати таблицю" -#: sql_help.c:6024 +#: sql_help.c:6100 msgid "conditionally insert, update, or delete rows of a table" msgstr "умовно вÑтавити, оновити або видалити Ñ€Ñдки таблиці" -#: sql_help.c:6030 +#: sql_help.c:6106 msgid "position a cursor" msgstr "розташувати курÑор" -#: sql_help.c:6036 +#: sql_help.c:6112 msgid "generate a notification" msgstr "згенерувати повідомленнÑ" -#: sql_help.c:6042 +#: sql_help.c:6118 msgid "prepare a statement for execution" msgstr "підготувати команду Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ" -#: sql_help.c:6048 +#: sql_help.c:6124 msgid "prepare the current transaction for two-phase commit" msgstr "підготувати поточну транзакцію Ð´Ð»Ñ Ð´Ð²Ð¾Ñ…Ñ„Ð°Ð·Ð½Ð¾Ð³Ð¾ затвердженнÑ" -#: sql_help.c:6054 +#: sql_help.c:6130 msgid "change the ownership of database objects owned by a database role" msgstr "змінити влаÑника об'єктів БД, що належать заданій ролі" -#: sql_help.c:6060 +#: sql_help.c:6136 msgid "replace the contents of a materialized view" msgstr "замінити вміÑÑ‚ матеріалізованого поданнÑ" -#: sql_help.c:6066 +#: sql_help.c:6142 msgid "rebuild indexes" msgstr "перебудувати індекÑи" -#: sql_help.c:6072 -msgid "destroy a previously defined savepoint" -msgstr "видалити раніше визначену точку збереженнÑ" +#: sql_help.c:6148 +msgid "release a previously defined savepoint" +msgstr "звільнити раніше визначену точку збереженнÑ" -#: sql_help.c:6078 +#: sql_help.c:6154 msgid "restore the value of a run-time parameter to the default value" msgstr "відновити початкове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ виконаннÑ" -#: sql_help.c:6084 +#: sql_help.c:6160 msgid "remove access privileges" msgstr "видалити права доÑтупу" -#: sql_help.c:6096 +#: sql_help.c:6172 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "ÑкаÑувати транзакцію, раніше підготовлену до двохфазного затвердженнÑ" -#: sql_help.c:6102 +#: sql_help.c:6178 msgid "roll back to a savepoint" msgstr "відкотитиÑÑ Ð´Ð¾ точки збереженнÑ" -#: sql_help.c:6108 +#: sql_help.c:6184 msgid "define a new savepoint within the current transaction" msgstr "визначити нову точку Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð² рамках поточної транзакції" -#: sql_help.c:6114 +#: sql_help.c:6190 msgid "define or change a security label applied to an object" msgstr "визначити або змінити мітку безпеки, заÑтоÑовану до об'єкта" -#: sql_help.c:6120 sql_help.c:6174 sql_help.c:6210 +#: sql_help.c:6196 sql_help.c:6250 sql_help.c:6286 msgid "retrieve rows from a table or view" msgstr "отримати Ñ€Ñдки з таблиці або поданнÑ" -#: sql_help.c:6132 +#: sql_help.c:6208 msgid "change a run-time parameter" msgstr "змінити параметр виконаннÑ" -#: sql_help.c:6138 +#: sql_help.c:6214 msgid "set constraint check timing for the current transaction" msgstr "вÑтановити Ñ‡Ð°Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐºÐ¸ Ð¾Ð±Ð¼ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ñ— транзакції" -#: sql_help.c:6144 +#: sql_help.c:6220 msgid "set the current user identifier of the current session" msgstr "вÑтановити ідентифікатор поточного кориÑтувача в поточній ÑеÑÑ–Ñ—" -#: sql_help.c:6150 +#: sql_help.c:6226 msgid "set the session user identifier and the current user identifier of the current session" msgstr "вÑтановити ідентифікатор кориÑтувача ÑеÑÑ–Ñ— й ідентифікатор поточного кориÑтувача в поточній ÑеÑÑ–Ñ—" -#: sql_help.c:6156 +#: sql_help.c:6232 msgid "set the characteristics of the current transaction" msgstr "вÑтановити характериÑтики поточної транзакції" -#: sql_help.c:6162 +#: sql_help.c:6238 msgid "show the value of a run-time parameter" msgstr "показати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° виконаннÑ" -#: sql_help.c:6180 +#: sql_help.c:6256 msgid "empty a table or set of tables" msgstr "очиÑтити таблицю або декілька таблиць" -#: sql_help.c:6186 +#: sql_help.c:6262 msgid "stop listening for a notification" msgstr "припинити Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½ÑŒ" -#: sql_help.c:6192 +#: sql_help.c:6268 msgid "update rows of a table" msgstr "змінити Ñ€Ñдки таблиці" -#: sql_help.c:6198 +#: sql_help.c:6274 msgid "garbage-collect and optionally analyze a database" msgstr "виконати збір ÑÐ¼Ñ–Ñ‚Ñ‚Ñ Ñ– проаналізувати базу даних" -#: sql_help.c:6204 +#: sql_help.c:6280 msgid "compute a set of rows" msgstr "отримати набір Ñ€Ñдків" @@ -6370,12 +6308,8 @@ msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл журналу \"%s\": %m" #: startup.c:460 #, c-format -msgid "" -"Type \"help\" for help.\n" -"\n" -msgstr "" -"Введіть \"help\", щоб отримати допомогу.\n" -"\n" +msgid "Type \"help\" for help.\n\n" +msgstr "Введіть \"help\", щоб отримати допомогу.\n\n" #: startup.c:612 #, c-format @@ -6397,14 +6331,12 @@ msgstr "зайвий аргумент \"%s\" проігнорований" msgid "could not find own program executable" msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ ехе файл влаÑної програми" -#: tab-complete.c:5921 +#: tab-complete.c:6216 #, c-format -msgid "" -"tab completion query failed: %s\n" +msgid "tab completion query failed: %s\n" "Query was:\n" "%s" -msgstr "" -"помилка запиту Tab-доповненнÑ: %s\n" +msgstr "помилка запиту Tab-доповненнÑ: %s\n" "Запит:\n" "%s" @@ -6423,11 +6355,10 @@ msgstr "неправильне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ \"%s\": очіку msgid "invalid variable name: \"%s\"" msgstr "неправильне ім'Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ—: \"%s\"" -#: variables.c:419 +#: variables.c:418 #, c-format -msgid "" -"unrecognized value \"%s\" for \"%s\"\n" +msgid "unrecognized value \"%s\" for \"%s\"\n" "Available values are: %s." -msgstr "" -"нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ \"%s\"\n" +msgstr "нерозпізнане Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ \"%s\"\n" "ДопуÑтимі значеннÑ: %s." + diff --git a/src/bin/psql/po/zh_CN.po b/src/bin/psql/po/zh_CN.po index 131e90660a87c..43eff2c82f8c6 100644 --- a/src/bin/psql/po/zh_CN.po +++ b/src/bin/psql/po/zh_CN.po @@ -3098,7 +3098,7 @@ msgstr " \\dX [PATTERN] 列出扩展统计信æ¯\n" #: help.c:270 msgid " \\dy[+] [PATTERN] list event triggers\n" -msgstr " \\dy[+] [PATTERN] l列出所有事件触å‘器\n" +msgstr " \\dy[+] [PATTERN] 列出所有事件触å‘器\n" #: help.c:271 #, c-format diff --git a/src/bin/psql/po/zh_TW.po b/src/bin/psql/po/zh_TW.po index 4a7c05a97da43..8958b9b5a4a5e 100644 --- a/src/bin/psql/po/zh_TW.po +++ b/src/bin/psql/po/zh_TW.po @@ -1,104 +1,306 @@ # Traditional Chinese message translation file for psql -# Copyright (C) 2011 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. -# 2004-12-13 Zhenbang Wei +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the psql (PostgreSQL) package. +# 2004-12-13 Zhenbang Wei # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.1\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2011-05-16 04:41+0000\n" -"PO-Revision-Date: 2013-09-03 23:23-0400\n" +"Project-Id-Version: psql (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-11 20:47+0000\n" +"PO-Revision-Date: 2023-11-06 08:50+0800\n" "Last-Translator: Zhenbang Wei \n" -"Language-Team: The PostgreSQL Global Development Group \n" +"Language-Team: \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Poedit-Language: Chinese\n" -"X-Poedit-Country: TAIWAN\n" -"X-Poedit-SourceCharset: utf-8\n" -"X-Poedit-Bookmarks: 175,-1,-1,-1,-1,-1,-1,-1,-1,-1\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.4.1\n" -# command.c:120 -#: command.c:113 +# libpq/be-secure.c:294 libpq/be-secure.c:387 +#: ../../../src/common/logging.c:276 +#, c-format +msgid "error: " +msgstr "錯誤: " + +#: ../../../src/common/logging.c:283 +#, c-format +msgid "warning: " +msgstr "警告: " + +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "詳細內容: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "æç¤º: " + +# command.c:122 +#: ../../common/exec.c:172 +#, c-format +msgid "invalid binary \"%s\": %m" +msgstr "無效的執行檔 \"%s\": %m" + +# command.c:1103 +#: ../../common/exec.c:215 +#, c-format +msgid "could not read binary \"%s\": %m" +msgstr "無法讀å–執行檔 \"%s\": %m" + +#: ../../common/exec.c:223 +#, c-format +msgid "could not find a \"%s\" to execute" +msgstr "找ä¸åˆ°è¦åŸ·è¡Œçš„ \"%s\"" + +# utils/error/elog.c:1128 +#: ../../common/exec.c:250 +#, c-format +msgid "could not resolve path \"%s\" to absolute form: %m" +msgstr "無法解æžè·¯å¾‘ \"%s\" 為絕å°è·¯å¾‘: %m" + +# fe-misc.c:991 +#: ../../common/exec.c:412 +#, c-format +msgid "%s() failed: %m" +msgstr "%s() 失敗: %m" + +# common.c:123 +#: ../../common/exec.c:550 ../../common/exec.c:595 ../../common/exec.c:687 +#: command.c:1354 command.c:3439 command.c:3488 command.c:3612 input.c:226 +#: mainloop.c:80 mainloop.c:398 +#, c-format +msgid "out of memory" +msgstr "記憶體ä¸è¶³" + +# command.c:681 +# common.c:85 +# common.c:99 +# mainloop.c:71 +#: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 +#, c-format +msgid "out of memory\n" +msgstr "記憶體ä¸è¶³\n" + +# common.c:78 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 +#, c-format +msgid "cannot duplicate null pointer (internal error)\n" +msgstr "無法複製 null 指標(內部錯誤)\n" + +# libpq/be-secure.c:689 +#: ../../common/username.c:43 +#, c-format +msgid "could not look up effective user ID %ld: %s" +msgstr "無法查詢有效的使用者ID %ld: %s" + +# commands/user.c:899 commands/user.c:1012 commands/user.c:1104 +# commands/user.c:1233 commands/variable.c:664 utils/cache/lsyscache.c:2064 +# utils/init/miscinit.c:335 +#: ../../common/username.c:45 command.c:613 +msgid "user does not exist" +msgstr "使用者ä¸å­˜åœ¨" + +# port/win32/security.c:39 +#: ../../common/username.c:60 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "使用者å稱查詢失敗: 錯誤碼 %lu" + +#: ../../common/wait_error.c:55 +#, c-format +msgid "command not executable" +msgstr "無法執行指令" + +#: ../../common/wait_error.c:59 +#, c-format +msgid "command not found" +msgstr "找ä¸åˆ°æŒ‡ä»¤" + +#: ../../common/wait_error.c:64 +#, c-format +msgid "child process exited with exit code %d" +msgstr "å­è¡Œç¨‹çµæŸï¼ŒçµæŸç¢¼ %d" + +#: ../../common/wait_error.c:72 +#, c-format +msgid "child process was terminated by exception 0x%X" +msgstr "å­é€²ç¨‹è¢«ä¾‹å¤– 0x%X 終止" + +#: ../../common/wait_error.c:76 +#, c-format +msgid "child process was terminated by signal %d: %s" +msgstr "å­é€²ç¨‹è¢«ä¿¡è™Ÿ %d 終止: %s" + +#: ../../common/wait_error.c:82 +#, c-format +msgid "child process exited with unrecognized status %d" +msgstr "å­é€²ç¨‹çµæŸï¼Œä¸æ˜Žç‹€æ…‹ä»£ç¢¼ %d" + +#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +msgid "Cancel request sent\n" +msgstr "已傳é€å–消請求\n" + +# fe-connect.c:1427 +#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +msgid "Could not send cancel request: " +msgstr "無法傳é€å–消請求: " + +# print.c:1202 +#: ../../fe_utils/print.c:406 +#, c-format +msgid "(%lu row)" +msgid_plural "(%lu rows)" +msgstr[0] "(%lu 筆資料)" + +#: ../../fe_utils/print.c:3154 #, c-format -msgid "Invalid command \\%s. Try \\? for help.\n" -msgstr "無效的命令 \\%s,用 \\? 顯示說明。\n" +msgid "Interrupted\n" +msgstr "已中斷\n" + +#: ../../fe_utils/print.c:3218 +#, c-format +msgid "Cannot add header to table content: column count of %d exceeded.\n" +msgstr "無法將標題新增至表格內容: æ¬„ä½æ•¸å·²è¶…éŽ %d。\n" + +#: ../../fe_utils/print.c:3258 +#, c-format +msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" +msgstr "無法將儲存格新增至表格內容: ç¸½å„²å­˜æ ¼æ•¸å·²è¶…éŽ %d。\n" + +#: ../../fe_utils/print.c:3516 +#, c-format +msgid "invalid output format (internal error): %d" +msgstr "無效的輸出格å¼(內部錯誤): %d" + +# access/transam/xlog.c:2163 +#: ../../fe_utils/psqlscan.l:717 +#, c-format +msgid "skipping recursive expansion of variable \"%s\"" +msgstr "ç•¥éŽéžè¿´å±•開變數 \"%s\"" + +# utils/fmgr/dfmgr.c:145 +#: ../../port/thread.c:50 ../../port/thread.c:86 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "無法查詢本地使用者ID %d: %s" + +# libpq/hba.c:1481 libpq/hba.c:1512 libpq/hba.c:1582 +#: ../../port/thread.c:55 ../../port/thread.c:91 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "本地使用者ID %d ä¸å­˜åœ¨" # command.c:122 -#: command.c:115 +#: command.c:234 +#, c-format +msgid "invalid command \\%s" +msgstr "無效命令 \\%s" + +#: command.c:236 #, c-format -msgid "invalid command \\%s\n" -msgstr "無效的命令 \\%s\n" +msgid "Try \\? for help." +msgstr "用 \\? 顯示說明。" # command.c:131 -#: command.c:126 +#: command.c:254 +#, c-format +msgid "\\%s: extra argument \"%s\" ignored" +msgstr "\\%s: 忽略é¡å¤–çš„åƒæ•¸ \"%s\"" + +#: command.c:306 #, c-format -msgid "\\%s: extra argument \"%s\" ignored\n" -msgstr "\\%s: å¿½ç•¥å¤šé¤˜çš„åƒæ•¸ \"%s\" \n" +msgid "\\%s command ignored; use \\endif or Ctrl-C to exit current \\if block" +msgstr "\\%s 命令被忽略;請使用 \\endif 或 Ctrl-C 退出當å‰çš„ \\if å€å¡Š" # command.c:240 -#: command.c:268 +#: command.c:611 #, c-format -msgid "could not get home directory: %s\n" -msgstr "無法å–å¾— home 目錄: %s\n" +msgid "could not get home directory for user ID %ld: %s" +msgstr "無法å–得使用者ID %ld 的家目錄: %s" # command.c:256 -#: command.c:284 +#: command.c:630 #, c-format -msgid "\\%s: could not change directory to \"%s\": %s\n" -msgstr "\\%s: 無法切æ›ç›®éŒ„至 \"%s\": %s\n" +msgid "\\%s: could not change directory to \"%s\": %m" +msgstr "%s: 無法變更目錄至 \"%s\": %m" # common.c:636 # common.c:871 -#: command.c:305 +#: command.c:654 +#, c-format +msgid "You are currently not connected to a database.\n" +msgstr "ç›®å‰æœªé€£ç·šè‡³è³‡æ–™åº«ã€‚\n" + +#: command.c:664 #, c-format -msgid "You are not connected.\n" -msgstr "ç›®å‰æ²’有連線。\n" +msgid "You are connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" +msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",ä½å€ \"%s\",連接埠 \"%s\"。\n" -#: command.c:312 +#: command.c:667 #, c-format msgid "You are connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" -msgstr "已經連線到資料庫 \"%s\",使用者 \"%s\",經由 \"%s\" çš„ socket,連接埠 \"%s\"。\n" +msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",socket \"%s\",連接埠 \"%s\"。\n" -#: command.c:315 +#: command.c:673 #, c-format -msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" -msgstr "已經連線到資料庫 \"%s\",使用者 \"%s\",主機 \"%s\",連接埠 \"%s\"。\n" +msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" +msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",主機 \"%s†(ä½å€ \"%s\"),連接埠 \"%s\"。\n" -# common.c:930 -#: command.c:339 -#: common.c:940 +#: command.c:676 #, c-format -msgid "Time: %.3f ms\n" -msgstr "時間: %.3f ms\n" +msgid "You are connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" +msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",主機 \"%s\",連接埠 \"%s\"。\n" # command.c:370 # command.c:760 -#: command.c:524 -#: command.c:588 -#: command.c:1285 -msgid "no query buffer\n" -msgstr "沒有查詢緩存å€\n" +#: command.c:1066 command.c:1159 command.c:2682 +#, c-format +msgid "no query buffer" +msgstr "沒有查詢緩存å€" # commands/user.c:240 commands/user.c:371 -#: command.c:557 -#: command.c:2504 +#: command.c:1099 command.c:5689 #, c-format -msgid "invalid line number: %s\n" -msgstr "無效的行號: %s\n" +msgid "invalid line number: %s" +msgstr "無效的行號: %s" -#: command.c:662 +#: command.c:1237 msgid "No changes" msgstr "沒有變更" # command.c:433 -#: command.c:716 +#: command.c:1315 +#, c-format +msgid "%s: invalid encoding name or conversion procedure not found" +msgstr "%s: 無效的編碼å稱或找ä¸åˆ°ç·¨ç¢¼è½‰æ›ç¨‹åº" + +# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770 +# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285 +#: command.c:1350 command.c:2152 command.c:3435 command.c:3632 command.c:5795 +#: common.c:182 common.c:231 common.c:400 common.c:1102 common.c:1120 +#: common.c:1194 common.c:1313 common.c:1351 common.c:1444 common.c:1480 +#: copy.c:486 copy.c:720 help.c:66 large_obj.c:157 large_obj.c:192 +#: large_obj.c:254 startup.c:304 #, c-format -msgid "%s: invalid encoding name or conversion procedure not found\n" -msgstr "%s: 無效的編碼å稱或找ä¸åˆ°è½‰æ›ç¨‹åº\n" +msgid "%s" +msgstr "%s" + +# parser/analyze.c:3132 parser/parse_coerce.c:221 parser/parse_expr.c:116 +# parser/parse_expr.c:122 +#: command.c:1357 +msgid "There is no previous error." +msgstr "沒有先å‰çš„錯誤。" + +# utils/adt/rowtypes.c:126 +#: command.c:1470 +#, c-format +msgid "\\%s: missing right parenthesis" +msgstr "\\%s: ç¼ºå°‘å³æ‹¬è™Ÿ" # command.c:501 # command.c:535 @@ -107,20 +309,39 @@ msgstr "%s: 無效的編碼å稱或找ä¸åˆ°è½‰æ›ç¨‹åº\n" # command.c:612 # command.c:740 # command.c:771 -#: command.c:795 -#: command.c:829 -#: command.c:843 -#: command.c:860 -#: command.c:964 -#: command.c:1014 -#: command.c:1265 -#: command.c:1296 -#, c-format -msgid "\\%s: missing required argument\n" -msgstr "\\%s: ç¼ºå°‘æ‰€éœ€åƒæ•¸\n" +#: command.c:1554 command.c:1684 command.c:1988 command.c:2002 command.c:2021 +#: command.c:2203 command.c:2444 command.c:2649 command.c:2689 +#, c-format +msgid "\\%s: missing required argument" +msgstr "\\%s: 缺少必è¦çš„åƒæ•¸" + +#: command.c:1815 +#, c-format +msgid "\\elif: cannot occur after \\else" +msgstr "\\elif: ä¸èƒ½å‡ºç¾åœ¨ \\else 之後" + +#: command.c:1820 +#, c-format +msgid "\\elif: no matching \\if" +msgstr "\\elif: æ²’æœ‰å°æ‡‰çš„ \\if" + +#: command.c:1884 +#, c-format +msgid "\\else: cannot occur after \\else" +msgstr "\\else: ä¸èƒ½å‡ºç¾åœ¨ \\else 之後" + +#: command.c:1889 +#, c-format +msgid "\\else: no matching \\if" +msgstr "\\else: æ²’æœ‰å°æ‡‰çš„ \\if" + +#: command.c:1929 +#, c-format +msgid "\\endif: no matching \\if" +msgstr "\\endif: æ²’æœ‰å°æ‡‰çš„ \\if" # command.c:598 -#: command.c:892 +#: command.c:2085 msgid "Query buffer is empty." msgstr "æŸ¥è©¢ç·©å­˜å€æ˜¯ç©ºçš„。" @@ -128,74 +349,63 @@ msgstr "æŸ¥è©¢ç·©å­˜å€æ˜¯ç©ºçš„。" # command.c:939 # startup.c:187 # startup.c:205 -#: command.c:902 -msgid "Enter new password: " -msgstr "輸入新密碼: " +#: command.c:2128 +#, c-format +msgid "Enter new password for user \"%s\": " +msgstr "輸入使用者 \"%s\" 的新密碼: " -#: command.c:903 +#: command.c:2132 msgid "Enter it again: " msgstr "冿¬¡è¼¸å…¥: " -#: command.c:907 -#, c-format -msgid "Passwords didn't match.\n" -msgstr "密碼ä¸ç¬¦ã€‚\n" - -#: command.c:925 +#: command.c:2141 #, c-format -msgid "Password encryption failed.\n" -msgstr "密碼加密失敗。\n" +msgid "Passwords didn't match." +msgstr "密碼ä¸ä¸€è‡´ã€‚" -# command.c:696 -# command.c:745 -#: command.c:993 -#: command.c:1094 -#: command.c:1270 +# startup.c:492 +#: command.c:2238 #, c-format -msgid "\\%s: error\n" -msgstr "\\%s: 錯誤\n" +msgid "\\%s: could not read value for variable" +msgstr "\\%s: 無法讀å–變數的值" # command.c:632 -#: command.c:1034 +#: command.c:2340 msgid "Query buffer reset (cleared)." -msgstr "查詢緩存å€é‡ç½®(清空)。" +msgstr "查詢緩存å€å·²é‡è¨­(已清除)。" # command.c:646 -#: command.c:1047 +#: command.c:2362 #, c-format -msgid "Wrote history to file \"%s/%s\".\n" -msgstr "書寫歷程到檔案 \"%s/%s\".\n" +msgid "Wrote history to file \"%s\".\n" +msgstr "已將歷å²è¨˜éŒ„寫入檔案 \"%s\"。\n" -# command.c:681 -# common.c:85 -# common.c:99 -# mainloop.c:71 -#: command.c:1085 -#: common.c:52 -#: common.c:66 -#: input.c:209 -#: mainloop.c:72 -#: mainloop.c:234 -#: print.c:137 -#: print.c:151 +#: command.c:2449 #, c-format -msgid "out of memory\n" -msgstr "記憶體用盡\n" +msgid "\\%s: environment variable name must not contain \"=\"" +msgstr "\\%s: 環境變數åç¨±ä¸æ‡‰åŒ…å« \"=\"" # copy.c:122 -#: command.c:1115 -msgid "function name is required\n" -msgstr "需è¦å‡½å¼å稱\n" +#: command.c:2497 +#, c-format +msgid "function name is required" +msgstr "需è¦å‡½æ•¸å稱" + +# copy.c:122 +#: command.c:2499 +#, c-format +msgid "view name is required" +msgstr "éœ€è¦æª¢è¦–表å稱" # command.c:726 -#: command.c:1250 +#: command.c:2621 msgid "Timing is on." -msgstr "啟用計時功能." +msgstr "計時功能已啟動。" # command.c:728 -#: command.c:1252 +#: command.c:2623 msgid "Timing is off." -msgstr "åœæ­¢è¨ˆæ™‚功能." +msgstr "è¨ˆæ™‚åŠŸèƒ½å·²åœæ­¢ã€‚" # command.c:788 # command.c:808 @@ -210,29 +420,65 @@ msgstr "åœæ­¢è¨ˆæ™‚功能." # common.c:170 # copy.c:530 # copy.c:575 -#: command.c:1313 -#: command.c:1333 -#: command.c:1892 -#: command.c:1899 -#: command.c:1908 -#: command.c:1918 -#: command.c:1927 -#: command.c:1941 -#: command.c:1958 -#: command.c:1996 -#: common.c:137 -#: copy.c:283 -#: copy.c:361 -#, c-format -msgid "%s: %s\n" -msgstr "%s: %s\n" +#: command.c:2709 command.c:2747 command.c:4074 command.c:4077 command.c:4080 +#: command.c:4086 command.c:4088 command.c:4114 command.c:4124 command.c:4136 +#: command.c:4150 command.c:4177 command.c:4235 common.c:78 copy.c:329 +#: copy.c:401 psqlscanslash.l:788 psqlscanslash.l:800 psqlscanslash.l:818 +#, c-format +msgid "%s: %m" +msgstr "%s: %m" + +# command.c:788 +# command.c:808 +# command.c:1163 +# command.c:1170 +# command.c:1180 +# command.c:1192 +# command.c:1205 +# command.c:1219 +# command.c:1241 +# command.c:1272 +# common.c:170 +# copy.c:530 +# copy.c:575 +#: command.c:2736 copy.c:388 +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +# parser/parse_relation.c:356 parser/parse_relation.c:368 +#: command.c:2806 command.c:2852 +#, c-format +msgid "\\watch: interval value is specified more than once" +msgstr "\\watch: 間隔值被指定多次" + +#: command.c:2816 command.c:2862 +#, c-format +msgid "\\watch: incorrect interval value \"%s\"" +msgstr "\\watch: 錯誤的間隔值 \"%s\"" + +# commands/copy.c:2716 parser/parse_target.c:648 parser/parse_target.c:658 +#: command.c:2826 +#, c-format +msgid "\\watch: iteration count is specified more than once" +msgstr "\\watch: 迭代次數被指定多次" + +#: command.c:2836 +#, c-format +msgid "\\watch: incorrect iteration count \"%s\"" +msgstr "\\watch: 錯誤的迭代次數 \"%s" + +# access/transam/xlog.c:3720 +#: command.c:2843 +#, c-format +msgid "\\watch: unrecognized parameter \"%s\"" +msgstr "\\watch: ç„¡æ³•è­˜åˆ¥çš„åƒæ•¸ \"%s\"" # command.c:915 # command.c:939 # startup.c:187 # startup.c:205 -#: command.c:1415 -#: startup.c:159 +#: command.c:3236 startup.c:243 startup.c:293 msgid "Password: " msgstr "密碼: " @@ -240,313 +486,432 @@ msgstr "密碼: " # command.c:939 # startup.c:187 # startup.c:205 -#: command.c:1422 -#: startup.c:162 -#: startup.c:164 +#: command.c:3241 startup.c:290 #, c-format msgid "Password for user %s: " -msgstr "用戶 %s 的密碼: " - -# command.c:953 -# common.c:216 -# common.c:605 -# common.c:660 -# common.c:903 -#: command.c:1541 -#: command.c:2538 -#: common.c:183 -#: common.c:460 -#: common.c:525 -#: common.c:816 -#: common.c:841 -#: common.c:925 -#: copy.c:432 -#: copy.c:477 -#: copy.c:606 +msgstr "使用者 %s 的密碼: " + +#: command.c:3297 #, c-format -msgid "%s" -msgstr "%s" +msgid "Do not give user, host, or port separately when using a connection string" +msgstr "使用連接字串時,請ä¸è¦åˆ†é–‹æä¾›ä½¿ç”¨è€…ã€ä¸»æ©Ÿæˆ–埠號" + +#: command.c:3332 +#, c-format +msgid "No database connection exists to re-use parameters from" +msgstr "無資料庫連線å¯ä¾›é‡è¤‡ä½¿ç”¨åƒæ•¸" # command.c:957 -#: command.c:1545 -msgid "Previous connection kept\n" -msgstr "ä¿ç•™ä¸Šä¸€æ¬¡é€£ç·š\n" +#: command.c:3638 +#, c-format +msgid "Previous connection kept" +msgstr "ä¿ç•™å‰ä¸€å€‹é€£ç·š" # command.c:969 -#: command.c:1549 +#: command.c:3644 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" # command.c:981 -#: command.c:1582 +#: command.c:3700 +#, c-format +msgid "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at port \"%s\".\n" +msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",ä½å€ \"%s\",連接埠 \"%s\"。\n" + +# command.c:981 +#: command.c:3703 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" at port \"%s\".\n" -msgstr "已經連線到資料庫 \"%s\",使用者 \"%s\",經由 \"%s\" çš„ socket,連接埠 \"%s\"。\n" +msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",socket \"%s\",連接埠 \"%s\"。\n" + +# command.c:981 +#: command.c:3709 +#, c-format +msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" (address \"%s\") at port \"%s\".\n" +msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",主機 “%s†(ä½å€ \"%s\"),連接埠 \"%s\"。\n" # command.c:981 -#: command.c:1585 +#: command.c:3712 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at port \"%s\".\n" -msgstr "已經連線到資料庫 \"%s\",使用者 \"%s\",主機 \"%s\",連接埠 \"%s\"。\n" +msgstr "已連線至資料庫 \"%s\",使用者 \"%s\",主機 “%sâ€ï¼Œé€£æŽ¥åŸ  \"%s\"。\n" # command.c:981 -#: command.c:1589 +#: command.c:3717 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" -msgstr "已經連線到資料庫 \"%s\",使用者 \"%s\"。\n" +msgstr "已連線至資料庫 \"%s\",使用者 \"%s\"。\n" -#: command.c:1623 +#: command.c:3757 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s,伺æœå™¨ %s)\n" -#: command.c:1631 +#: command.c:3770 #, c-format msgid "" -"WARNING: %s version %d.%d, server version %d.%d.\n" +"WARNING: %s major version %s, server major version %s.\n" " Some psql features might not work.\n" msgstr "" -"警告: %s 版本 %d.%d,伺æœå™¨ç‰ˆæœ¬ %d.%d。\n" -"æŸäº› psql 功能å¯èƒ½ç„¡æ³•é‹ä½œã€‚\n" +"警告: %s 主è¦ç‰ˆæœ¬ %s,伺æœå™¨ä¸»è¦ç‰ˆæœ¬ %s。\n" +" æŸäº› psql 功能å¯èƒ½ç„¡æ³•é‹ä½œã€‚\n" # startup.c:652 -#: command.c:1661 +#: command.c:3807 #, c-format -msgid "SSL connection (cipher: %s, bits: %i)\n" -msgstr "SSL 連線 (密文: %s,ä½å…ƒ: %i)\n" +msgid "SSL connection (protocol: %s, cipher: %s, compression: %s)\n" +msgstr "SSL 連線(å”è­°: %s,加密方å¼: %s,壓縮: %s)\n" -# startup.c:652 -#: command.c:1671 +# utils/error/elog.c:1350 utils/error/elog.c:1360 +#: command.c:3808 command.c:3809 +msgid "unknown" +msgstr "unknown" + +# help.c:48 +#: command.c:3810 help.c:42 +msgid "off" +msgstr "off" + +# help.c:48 +#: command.c:3810 help.c:42 +msgid "on" +msgstr "on" + +#: command.c:3824 #, c-format -msgid "SSL connection (unknown cipher)\n" -msgstr "SSL 連線 (䏿˜Žå¯†æ–‡)\n" +msgid "GSSAPI-encrypted connection\n" +msgstr "GSSAPI 加密連線\n" -#: command.c:1692 +#: command.c:3844 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" " 8-bit characters might not work correctly. See psql reference\n" " page \"Notes for Windows users\" for details.\n" msgstr "" -"警告: 主控å°å­—ç¢¼é  (%u) ä¸åŒæ–¼ Windows å­—ç¢¼é  (%u)\n" -" 8 ä½å…ƒå­—å…ƒå¯èƒ½ç„¡æ³•正常é‹ä½œã€‚è«‹åƒé–± psql åƒè€ƒ\n" -" é  \"Windows 使用者注æ„事項\" å–得更多資訊。\n" +"警告: console 字碼é (%u)與 Windows 字碼é (%u)ä¸åŒ\n" +" 8 ä½å…ƒå­—符å¯èƒ½ç„¡æ³•正確é‹ä½œã€‚詳細資訊請åƒé–±\n" +" psql 手冊 \"Windows 使用者注æ„事項\"。\n" -#: command.c:1773 -msgid "EDITOR_LINENUMBER_SWITCH variable must be set to specify a line number\n" -msgstr "EDITOR_LINENUMBER_SWITCH 變數必需設定行號\n" +#: command.c:3949 +#, c-format +msgid "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a line number" +msgstr "必須設定環境變數 PSQL_EDITOR_LINENUMBER_ARG 以指定行號" # command.c:1103 -#: command.c:1810 +#: command.c:3979 #, c-format -msgid "could not start editor \"%s\"\n" -msgstr "無法啟動編輯器 \"%s\"\n" +msgid "could not start editor \"%s\"" +msgstr "無法啟動編輯器 \"%s\"" # command.c:1105 -#: command.c:1812 -msgid "could not start /bin/sh\n" -msgstr "無法啟動 /bin/sh\n" +#: command.c:3981 +#, c-format +msgid "could not start /bin/sh" +msgstr "無法啟動 /bin/sh" # command.c:1148 -#: command.c:1850 +#: command.c:4031 #, c-format -msgid "cannot locate temporary directory: %s" +msgid "could not locate temporary directory: %s" msgstr "找ä¸åˆ°æš«å­˜ç›®éŒ„: %s" # command.c:1148 -#: command.c:1877 +#: command.c:4058 #, c-format -msgid "could not open temporary file \"%s\": %s\n" -msgstr "無法開啟暫存檔 \"%s\": %s\n" +msgid "could not open temporary file \"%s\": %m" +msgstr "無法開啟暫存檔 \"%s\": %m" + +#: command.c:4394 +#, c-format +msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" +msgstr "\\pset: 模稜兩å¯çš„縮寫 \"%s\" åŒæ™‚ç¬¦åˆ \"%s\" å’Œ \"%s\"" # command.c:1340 -#: command.c:2107 -msgid "\\pset: allowed formats are unaligned, aligned, wrapped, html, latex, troff-ms\n" -msgstr "\\pset: å…許的格å¼ç‚º unalignedã€alignedã€wrappedã€htmlã€latexã€troff-ms\n" +#: command.c:4414 +#, c-format +msgid "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" +msgstr "\\pset: å…許的格å¼åŒ…括 aligned, asciidoc, csv, html, latex, latex-longtable, troff-ms, unaligned, wrapped" -# command.c:1345 -#: command.c:2112 +#: command.c:4433 #, c-format -msgid "Output format is %s.\n" -msgstr "輸出格å¼ç‚º %s。\n" +msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" +msgstr "\\pset: å…許的行樣å¼åŒ…括 asciiã€old-asciiã€unicode" -#: command.c:2128 -msgid "\\pset: allowed line styles are ascii, old-ascii, unicode\n" -msgstr "\\pset: å…語的行風格為 asciiã€old-asciiã€unicode\n" +#: command.c:4448 +#, c-format +msgid "\\pset: allowed Unicode border line styles are single, double" +msgstr "\\pset: å…許的 Unicode 邊框線樣å¼åŒ…括 single, double" -# command.c:1355 -#: command.c:2133 +#: command.c:4463 #, c-format -msgid "Line style is %s.\n" -msgstr "行風格為 %s。\n" +msgid "\\pset: allowed Unicode column line styles are single, double" +msgstr "\\pset: å…許的 Unicode 欄線樣å¼åŒ…括 single, double" + +#: command.c:4478 +#, c-format +msgid "\\pset: allowed Unicode header line styles are single, double" +msgstr "\\pset: å…許的 Unicode 標頭線樣å¼åŒ…括 single, double" + +#: command.c:4530 +#, c-format +msgid "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", or a number specifying the exact width" +msgstr "\\pset: å…許的 xheader_width 值為 \"%s\"(é è¨­ï¼‰ã€\"%s\"ã€\"%s\",或指定確切寬度的數字" + +# commands/copy.c:828 +#: command.c:4547 +#, c-format +msgid "\\pset: csv_fieldsep must be a single one-byte character" +msgstr "\\pset: csv_fieldsep 必須是一ä½å…ƒçµ„的字元" + +# commands/copy.c:828 +#: command.c:4552 +#, c-format +msgid "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return" +msgstr "\\pset: csv_fieldsep ä¸èƒ½æ˜¯é›™å¼•è™Ÿã€æ›è¡Œç¬¦è™Ÿæˆ–æ­¸ä½ç¬¦è™Ÿ" + +# command.c:1493 +#: command.c:4690 command.c:4891 +#, c-format +msgid "\\pset: unknown option: %s" +msgstr "\\pset: 䏿˜Žé¸é …: %s" # command.c:1355 -#: command.c:2144 +#: command.c:4710 #, c-format msgid "Border style is %d.\n" -msgstr "邊界風格為 %d。\n" +msgstr "邊框樣å¼ç‚º %d。\n" + +# command.c:1436 +#: command.c:4716 +#, c-format +msgid "Target width is unset.\n" +msgstr "目標寬度未設定。\n" + +#: command.c:4718 +#, c-format +msgid "Target width is %d.\n" +msgstr "目標寬度是 %d。\n" # command.c:1364 -#: command.c:2156 +#: command.c:4725 #, c-format msgid "Expanded display is on.\n" -msgstr "擴展顯示已打開。\n" +msgstr "擴展顯示已啟動。\n" + +# command.c:1364 +#: command.c:4727 +#, c-format +msgid "Expanded display is used automatically.\n" +msgstr "自動使用擴展顯示。\n" # command.c:1365 -#: command.c:2157 +#: command.c:4729 #, c-format msgid "Expanded display is off.\n" msgstr "擴展顯示已關閉。\n" -#: command.c:2170 -msgid "Showing locale-adjusted numeric output." -msgstr "顯示å€åŸŸèª¿æ•´å¾Œçš„æ•¸å­—輸出。" +# command.c:1364 +#: command.c:4736 command.c:4738 command.c:4740 +#, c-format +msgid "Expanded header width is \"%s\".\n" +msgstr "擴展標頭寬度為 \"%s\"。\n" + +# command.c:1364 +#: command.c:4742 +#, c-format +msgid "Expanded header width is %d.\n" +msgstr "擴展標頭寬度為 %d。\n" -#: command.c:2172 -msgid "Locale-adjusted numeric output is off." -msgstr "å€åŸŸèª¿æ•´å¾Œçš„æ•¸å­—輸出已關閉。" +# command.c:1389 +#: command.c:4748 +#, c-format +msgid "Field separator for CSV is \"%s\".\n" +msgstr "CSV 的欄ä½åˆ†éš”符號是 \"%s\"。\n" -# command.c:1377 -#: command.c:2185 +# command.c:1389 +#: command.c:4756 command.c:4764 #, c-format -msgid "Null display is \"%s\".\n" -msgstr " \"%s\" 是空值顯示。\n" +msgid "Field separator is zero byte.\n" +msgstr "欄ä½åˆ†éš”符號為 0 ä½å…ƒçµ„。\n" # command.c:1389 -#: command.c:2197 +#: command.c:4758 #, c-format msgid "Field separator is \"%s\".\n" msgstr "欄ä½åˆ†éš”符號是 \"%s\"。\n" -# command.c:1403 -#: command.c:2211 +# command.c:1485 +#: command.c:4771 #, c-format -msgid "Record separator is ." -msgstr "記錄分隔符號是 。" +msgid "Default footer is on.\n" +msgstr "é è¨­é å°¾å·²å•Ÿå‹•。\n" -# command.c:1405 -#: command.c:2213 +# command.c:1487 +#: command.c:4773 #, c-format -msgid "Record separator is \"%s\".\n" -msgstr "記錄分隔符號是 \"%s\"。\n" - -# command.c:1416 -#: command.c:2227 -msgid "Showing only tuples." -msgstr "åªé¡¯ç¤º Tuples。" +msgid "Default footer is off.\n" +msgstr "é è¨­é å°¾å·²é—œé–‰ã€‚\n" -# command.c:1418 -#: command.c:2229 -msgid "Tuples only is off." -msgstr "關閉åªé¡¯ç¤º Tuples。" +# command.c:1345 +#: command.c:4779 +#, c-format +msgid "Output format is %s.\n" +msgstr "輸出格å¼ç‚º %s。\n" -# command.c:1434 -#: command.c:2245 +# command.c:1355 +#: command.c:4785 #, c-format -msgid "Title is \"%s\".\n" -msgstr "標題是 \"%s\"。\n" +msgid "Line style is %s.\n" +msgstr "行樣å¼ç‚º %s。\n" -# command.c:1436 -#: command.c:2247 +# command.c:1377 +#: command.c:4792 #, c-format -msgid "Title is unset.\n" -msgstr "無標題。\n" +msgid "Null display is \"%s\".\n" +msgstr "空值顯示為 \"%s\"。\n" -# command.c:1452 -#: command.c:2263 +#: command.c:4800 #, c-format -msgid "Table attribute is \"%s\".\n" -msgstr "資料表屬性是 \"%s\"。\n" +msgid "Locale-adjusted numeric output is on.\n" +msgstr "根據å€åŸŸèª¿æ•´æ•¸å­—輸出已啟動。\n" -# command.c:1454 -#: command.c:2265 +#: command.c:4802 #, c-format -msgid "Table attributes unset.\n" -msgstr "未設置資料表屬性。\n" +msgid "Locale-adjusted numeric output is off.\n" +msgstr "根據å€åŸŸèª¿æ•´æ•¸å­—輸出已關閉。\n" # command.c:1470 -#: command.c:2286 -msgid "Pager is used for long output." -msgstr "使用分é é¡¯ç¤ºå¤§é‡è³‡æ–™ã€‚" +#: command.c:4809 +#, c-format +msgid "Pager is used for long output.\n" +msgstr "分é é¡¯ç¤ºå·²å•Ÿå‹•。\n" # command.c:1472 -#: command.c:2288 -msgid "Pager is always used." -msgstr "總是使用分é é¡¯ç¤ºã€‚" +#: command.c:4811 +#, c-format +msgid "Pager is always used.\n" +msgstr "一律使用分é é¡¯ç¤ºã€‚\n" # command.c:1474 -#: command.c:2290 -msgid "Pager usage is off." -msgstr "ä¸ä½¿ç”¨åˆ†é é¡¯ç¤ºã€‚" - -# command.c:1485 -#: command.c:2304 -msgid "Default footer is on." -msgstr "打開é è¨­æ­¥é€²å™¨(Footer)。" - -# command.c:1487 -#: command.c:2306 -msgid "Default footer is off." -msgstr "關閉é è¨­æ­¥é€²å™¨(Footer)。" +#: command.c:4813 +#, c-format +msgid "Pager usage is off.\n" +msgstr "分é é¡¯ç¤ºå·²é—œé–‰ã€‚\n" -#: command.c:2317 +#: command.c:4819 #, c-format -msgid "Target width for \"wrapped\" format is %d.\n" -msgstr "\"wrapped\" æ ¼å¼çš„目標寬度是 %d。\n" +msgid "Pager won't be used for less than %d line.\n" +msgid_plural "Pager won't be used for less than %d lines.\n" +msgstr[0] "å°‘æ–¼ %d 行時ä¸è¦åˆ†é é¡¯ç¤ºã€‚\n" -# command.c:1493 -#: command.c:2322 +# command.c:1405 +#: command.c:4829 command.c:4839 #, c-format -msgid "\\pset: unknown option: %s\n" -msgstr "\\pset: 䏿˜Žé¸é …: %s\n" +msgid "Record separator is zero byte.\n" +msgstr "記錄分隔符號是 0 ä½å…ƒçµ„。\n" -# command.c:1532 -#: command.c:2376 -msgid "\\!: failed\n" -msgstr "\\!: 失敗\n" +# command.c:1403 +#: command.c:4831 +#, c-format +msgid "Record separator is .\n" +msgstr "記錄分隔符號是 。\n" -# common.c:78 -#: common.c:45 +# command.c:1405 +#: command.c:4833 #, c-format -msgid "%s: pg_strdup: cannot duplicate null pointer (internal error)\n" -msgstr "%s: pg_strdup : 無法複製空指標 (內部錯誤)\n" +msgid "Record separator is \"%s\".\n" +msgstr "記錄分隔符號是 \"%s\"。\n" -# common.c:123 -#: common.c:90 -msgid "out of memory" -msgstr "記憶體用盡" +# command.c:1452 +#: command.c:4846 +#, c-format +msgid "Table attributes are \"%s\".\n" +msgstr "表格屬性是 \"%s\"。\n" -# common.c:298 -#: common.c:343 -msgid "connection to server was lost\n" -msgstr "與資料庫的連線éºå¤±\n" +# command.c:1454 +#: command.c:4849 +#, c-format +msgid "Table attributes unset.\n" +msgstr "表格屬性未設定。\n" -# common.c:302 -#: common.c:347 -msgid "The connection to the server was lost. Attempting reset: " -msgstr "與伺æœå™¨çš„連線已éºå¤±ï¼Œå˜—試é‡ç½®: " +# command.c:1434 +#: command.c:4856 +#, c-format +msgid "Title is \"%s\".\n" +msgstr "標題是 \"%s\"。\n" -# common.c:307 -#: common.c:352 -msgid "Failed.\n" -msgstr "失敗。\n" +# command.c:1436 +#: command.c:4858 +#, c-format +msgid "Title is unset.\n" +msgstr "標題未設定。\n" -# common.c:314 -#: common.c:359 -msgid "Succeeded.\n" -msgstr "完æˆã€‚\n" +# command.c:1418 +#: command.c:4865 +#, c-format +msgid "Tuples only is on.\n" +msgstr "åªé¡¯ç¤ºè³‡æ–™ on\n" -# common.c:636 -# common.c:871 -#: common.c:493 -#: common.c:773 -msgid "You are currently not connected to a database.\n" -msgstr "ç›®å‰æ²’有連線至資料庫。\n" +# command.c:1418 +#: command.c:4867 +#, c-format +msgid "Tuples only is off.\n" +msgstr "åªé¡¯ç¤ºè³‡æ–™ off\n" + +# command.c:1355 +#: command.c:4873 +#, c-format +msgid "Unicode border line style is \"%s\".\n" +msgstr "Unicode 邊框樣å¼ç‚º \"%s\"。\n" -#: common.c:499 -#: common.c:506 -#: common.c:799 +# command.c:1355 +#: command.c:4879 +#, c-format +msgid "Unicode column line style is \"%s\".\n" +msgstr "Unicode 欄線樣å¼ç‚º \"%s\"。\n" + +# command.c:1355 +#: command.c:4885 +#, c-format +msgid "Unicode header line style is \"%s\".\n" +msgstr "Unicode 標頭線樣å¼ç‚º \"%s\"。\n" + +# command.c:1532 +#: command.c:5134 +#, c-format +msgid "\\!: failed" +msgstr "\\!: 失敗" + +#: command.c:5168 +#, c-format +msgid "\\watch cannot be used with an empty query" +msgstr "\\watch ä¸èƒ½èˆ‡ç©ºæŸ¥è©¢ä¸€èµ·ä½¿ç”¨" + +# postmaster/syslogger.c:514 postmaster/syslogger.c:527 +#: command.c:5200 +#, c-format +msgid "could not set timer: %m" +msgstr "無法設置計時器: %m" + +#: command.c:5269 +#, c-format +msgid "%s\t%s (every %gs)\n" +msgstr "%s\t%s (æ¯ %gs)\n" + +#: command.c:5272 +#, c-format +msgid "%s (every %gs)\n" +msgstr "%s (æ¯ %gs)\n" + +# access/transam/xlog.c:5319 access/transam/xlog.c:5439 +#: command.c:5340 +#, c-format +msgid "could not wait for signals: %m" +msgstr "無法等待信號: %m" + +#: command.c:5398 command.c:5405 common.c:592 common.c:599 common.c:1083 #, c-format msgid "" "********* QUERY **********\n" @@ -559,907 +924,3577 @@ msgstr "" "**************************\n" "\n" -# common.c:691 -#: common.c:560 +# commands/comment.c:348 commands/view.c:113 tcop/utility.c:88 +#: command.c:5584 #, c-format -msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" -msgstr "從伺æœå™¨è¡Œç¨‹ PID %3$d 收到éžåŒæ­¥é€šçŸ¥ \"%1$s\" å’Œ payload \"%2$s\"。\n" +msgid "\"%s.%s\" is not a view" +msgstr "\"%s.%s\" 䏿˜¯æª¢è¦–表" -# common.c:691 -#: common.c:563 +#: command.c:5600 #, c-format -msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" -msgstr "收到來自伺æœå™¨ \"%s\" 進程 PID %d éžåŒæ­¥é€šçŸ¥ã€‚\n" +msgid "could not parse reloptions array" +msgstr "ç„¡æ³•è§£æž reloption 陣列" -# common.c:879 -#: common.c:781 +#: common.c:167 #, c-format -msgid "" -"***(Single step mode: verify command)*******************************************\n" -"%s\n" -"***(press return to proceed or enter x and return to cancel)********************\n" -msgstr "" -"***(單步(Single step)模å¼: 驗證命令)*******************************************\n" -"%s\n" -"***(按 Enter éµç¹¼çºŒæˆ–éµå…¥ x 來喿¶ˆ)********************\n" +msgid "cannot escape without active connection" +msgstr "沒有活動中連線無法 escape" -# describe.c:117 -#: common.c:832 +# commands/copy.c:828 +#: common.c:208 #, c-format -msgid "The server (version %d.%d) does not support savepoints for ON_ERROR_ROLLBACK.\n" -msgstr "伺æœå™¨ (版本 %d.%d) 䏿”¯æ´ ON_ERROR_ROLLBACK 的儲存點。\n" - -# copy.c:122 -#: copy.c:96 -msgid "\\copy: arguments required\n" -msgstr "\\copy: 需è¦åƒæ•¸\n" +msgid "shell command argument contains a newline or carriage return: \"%s\"" +msgstr "shell å‘½ä»¤çš„åƒæ•¸åŒ…嫿›è¡Œæˆ–æ­¸ä½ç¬¦è™Ÿ: \"%s\"" -# copy.c:408 -#: copy.c:228 +# common.c:298 +#: common.c:312 #, c-format -msgid "\\copy: parse error at \"%s\"\n" -msgstr "\\copy: 在 \"%s\" 發生解讀錯誤\n" - -# copy.c:410 -#: copy.c:230 -msgid "\\copy: parse error at end of line\n" -msgstr "\\copy: 在行尾發生解讀錯誤\n" +msgid "connection to server was lost" +msgstr "與伺æœå™¨çš„連線已中斷" -# copy.c:541 -#: copy.c:294 +# common.c:302 +#: common.c:316 #, c-format -msgid "%s: cannot copy from/to a directory\n" -msgstr "%s: 無法從目錄複製或複製到目錄\n" +msgid "The connection to the server was lost. Attempting reset: " +msgstr "與伺æœå™¨çš„é€£ç·šå·²ä¸­æ–·ã€‚å˜—è©¦é‡æ–°é€£ç·š: " -# copy.c:562 -#: copy.c:331 +# common.c:307 +#: common.c:321 #, c-format -msgid "\\copy: %s" -msgstr "\\copy: %s" +msgid "Failed.\n" +msgstr "失敗。\n" -# copy.c:566 -#: copy.c:335 -#: copy.c:349 +# common.c:314 +#: common.c:338 #, c-format -msgid "\\copy: unexpected response (%d)\n" -msgstr "\\copy: æ„外回應 (%d)\n" - -#: copy.c:353 -msgid "trying to exit copy mode" -msgstr "æ­£åœ¨å˜—è©¦çµæŸè¤‡è£½æ¨¡å¼" +msgid "Succeeded.\n" +msgstr "æˆåŠŸã€‚\n" -# command.c:1103 -#: copy.c:407 -#: copy.c:417 +# fe-exec.c:1204 +#: common.c:390 common.c:1021 #, c-format -msgid "could not write COPY data: %s\n" -msgstr "無法寫入 COPY 資料: %s\n" +msgid "unexpected PQresultStatus: %d" +msgstr "éžé æœŸçš„ PQresultStatus: %d" -#: copy.c:424 +# common.c:930 +#: common.c:531 #, c-format -msgid "COPY data transfer failed: %s" -msgstr "COPY 資料轉æ›å¤±æ•—: %s" - -#: copy.c:472 -msgid "canceled by user" -msgstr "è¢«ç”¨æˆ¶å–æ¶ˆ" - -# copy.c:668 -#: copy.c:487 -msgid "" -"Enter data to be copied followed by a newline.\n" -"End with a backslash and a period on a line by itself." -msgstr "" -"輸入è¦è¤‡è£½çš„資料並且æ›è¡Œã€‚\n" -"在ç¨ç«‹çš„ä¸€è¡Œä¸Šè¼¸å…¥ä¸€å€‹åæ–œç·šå’Œä¸€å€‹å¥é»žçµæŸã€‚" - -#: copy.c:599 -msgid "aborted because of read failure" -msgstr "因讀å–失敗已被中止" - -# help.c:48 -#: help.c:48 -msgid "on" -msgstr "開啟" +msgid "Time: %.3f ms\n" +msgstr "時間: %.3f ms\n" -# help.c:48 -#: help.c:48 -msgid "off" -msgstr "關閉" +# common.c:930 +#: common.c:546 +#, c-format +msgid "Time: %.3f ms (%02d:%06.3f)\n" +msgstr "時間: %.3f ms (%02d:%06.3f)\n" -# help.c:70 -#: help.c:70 +#: common.c:555 #, c-format -msgid "could not get current user name: %s\n" -msgstr "無法å–å¾—ç›®å‰ç”¨æˆ¶å稱: %s\n" +msgid "Time: %.3f ms (%02d:%02d:%06.3f)\n" +msgstr "時間: %.3f ms (%02d:%02d:%06.3f)\n" -# help.c:83 -#: help.c:82 +#: common.c:562 #, c-format -msgid "" -"psql is the PostgreSQL interactive terminal.\n" -"\n" -msgstr "" -"psql 是 PostgreSQL 文字模å¼ä»‹é¢ã€‚\n" -"\n" +msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" +msgstr "時間: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" -#: help.c:83 +# common.c:636 +# common.c:871 +#: common.c:586 common.c:643 common.c:1054 describe.c:6214 #, c-format -msgid "Usage:\n" -msgstr "使用方法:\n" +msgid "You are currently not connected to a database." +msgstr "ç›®å‰å°šæœªé€£ç·šè‡³è³‡æ–™åº«ã€‚" -# help.c:86 -#: help.c:84 +# common.c:691 +#: common.c:674 #, c-format -msgid "" -" psql [OPTION]... [DBNAME [USERNAME]]\n" -"\n" -msgstr "" -" psql [OPTION]...[DBNAME [USERNAME]]\n" -"\n" +msgid "Asynchronous notification \"%s\" with payload \"%s\" received from server process with PID %d.\n" +msgstr "收到來自伺æœå™¨è¡Œç¨‹(PID %3$d)çš„éžåŒæ­¥é€šçŸ¥ \"%1$s\"(資料 \"%2$s\")。\n" -#: help.c:86 +# common.c:691 +#: common.c:677 #, c-format -msgid "General options:\n" -msgstr "一般é¸é …:\n" +msgid "Asynchronous notification \"%s\" received from server process with PID %d.\n" +msgstr "收到來自伺æœå™¨è¡Œç¨‹(PID %2$d)çš„éžåŒæ­¥é€šçŸ¥ \"%1$s\"。\n" -# help.c:94 -#: help.c:91 +# postmaster/syslogger.c:514 postmaster/syslogger.c:527 +#: common.c:708 #, c-format -msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" -msgstr " -c, --command=COMMAND åªåŸ·è¡Œå–®ä¸€æŒ‡ä»¤ (SQL 或內部指令) 然後 çµæŸã€‚\n" +msgid "could not print result table: %m" +msgstr "ç„¡æ³•é¡¯ç¤ºçµæžœè¡¨æ ¼: %m" -# help.c:93 -#: help.c:92 +# catalog/pg_aggregate.c:286 +#: common.c:728 #, c-format -msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" -msgstr " -d, --dbname=DBNAME 指定è¦é€£ç·šçš„資料庫å稱 (é è¨­: \"%s\")\n" +msgid "no rows returned for \\gset" +msgstr "沒有回傳資料給 \\gset" -# help.c:95 -#: help.c:93 +# utils/adt/regproc.c:471 utils/adt/regproc.c:491 +#: common.c:733 #, c-format -msgid " -f, --file=FILENAME execute commands from file, then exit\n" -msgstr " -f, --file=FILENAME å¾žæª”æ¡ˆä¸­åŸ·è¡ŒæŒ‡ä»¤ï¼Œç„¶å¾ŒçµæŸ\n" +msgid "more than one row returned for \\gset" +msgstr "回傳多於一筆資料給 \\gset" -# help.c:96 -#: help.c:94 +# utils/misc/guc.c:4239 +#: common.c:751 #, c-format -msgid " -l, --list list available databases, then exit\n" -msgstr " -l, --list 列出所有å¯ç”¨è³‡æ–™åº«ï¼Œç„¶å¾ŒçµæŸ\n" +msgid "attempt to \\gset into specially treated variable \"%s\" ignored" +msgstr "嘗試將資料用 \\gset 存入特殊變數 \"%s\" çš„æ“作已被忽略" -# help.c:97 -#: help.c:95 +# common.c:879 +#: common.c:1063 #, c-format msgid "" -" -v, --set=, --variable=NAME=VALUE\n" -" set psql variable NAME to VALUE\n" +"***(Single step mode: verify command)*******************************************\n" +"%s\n" +"***(press return to proceed or enter x and return to cancel)********************\n" msgstr "" -" -v, --set=, --variable=NAME=VALUE\n" -" å°‡ psql 變數 NAME 設為 VALUE\n" +"***(單步模å¼: 驗證命令)*******************************************\n" +"%s\n" +"***(按 Enter éµç¹¼çºŒæˆ–輸入 x 然後按 Enter éµå–消)********************\n" +"\n" -# help.c:98 -#: help.c:97 +# utils/error/elog.c:1555 +#: common.c:1146 #, c-format -msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" -msgstr " -X, --no-psqlrc ä¸è¦è®€å–啟動檔 (~/.psqlrc)\n" +msgid "STATEMENT: %s" +msgstr "陳述å¼: %s" -#: help.c:98 +# large_obj.c:58 +#: common.c:1182 #, c-format -msgid "" -" -1 (\"one\"), --single-transaction\n" -" execute command file as a single transaction\n" -msgstr "" -" -1 (\"一\"), --single-transaction\n" -" 執行指令檔åšç‚ºå–®ä¸€äº¤æ˜“\n" +msgid "unexpected transaction status (%d)" +msgstr "éžé æœŸçš„交易狀態(%d)" -#: help.c:100 -#, c-format -msgid " --help show this help, then exit\n" -msgstr " --help é¡¯ç¤ºèªªæ˜Žç„¶å¾ŒçµæŸ\n" +# describe.c:744 +#: common.c:1335 describe.c:2026 +msgid "Column" +msgstr "欄ä½" -#: help.c:101 -#, c-format -msgid " --version output version information, then exit\n" -msgstr " --version é¡¯ç¤ºç‰ˆæœ¬è³‡è¨Šç„¶å¾ŒçµæŸ\n" +# describe.c:415 +# describe.c:745 +# describe.c:1478 +# describe.c:1587 +#: common.c:1336 describe.c:170 describe.c:358 describe.c:376 describe.c:1046 +#: describe.c:1200 describe.c:1732 describe.c:1756 describe.c:2027 +#: describe.c:3958 describe.c:4170 describe.c:4409 describe.c:4571 +#: describe.c:5846 +msgid "Type" +msgstr "型別" -# help.c:102 -#: help.c:103 +# tcop/pquery.c:448 +#: common.c:1385 #, c-format -msgid "" -"\n" -"Input and output options:\n" -msgstr "" -"\n" -"輸入和輸出é¸é …:\n" +msgid "The command has no result, or the result has no columns.\n" +msgstr "å‘½ä»¤æ²’æœ‰çµæžœï¼Œæˆ–çµæžœæ²’有欄ä½ã€‚\n" -# help.c:103 -#: help.c:104 +# copy.c:122 +#: copy.c:98 #, c-format -msgid " -a, --echo-all echo all input from script\n" -msgstr " -a, --echo-all 回饋所有來自指令檔的輸入\n" +msgid "\\copy: arguments required" +msgstr "\\copy: 需è¦åƒæ•¸" -# help.c:104 -#: help.c:105 +# copy.c:408 +#: copy.c:253 #, c-format -msgid " -e, --echo-queries echo commands sent to server\n" -msgstr " -e, --echo-queries 回饋傳é€çµ¦ä¼ºæœå™¨çš„æŒ‡ä»¤\n" +msgid "\\copy: parse error at \"%s\"" +msgstr "\\copy: è§£æžéŒ¯èª¤ï¼Œä½æ–¼ \"%s\"" -# help.c:105 -#: help.c:106 +# copy.c:410 +#: copy.c:255 #, c-format -msgid " -E, --echo-hidden display queries that internal commands generate\n" -msgstr " -E, --echo-hidden 顯示內部指令產生的查詢\n" +msgid "\\copy: parse error at end of line" +msgstr "\\copy: è§£æžéŒ¯èª¤ï¼Œä½æ–¼è¡Œå°¾" -# help.c:107 -#: help.c:107 +#: copy.c:326 #, c-format -msgid " -L, --log-file=FILENAME send session log to file\n" -msgstr " -L, --log-file=FILENAME 將階段記錄傳é€è‡³æª”案\n" +msgid "could not execute command \"%s\": %m" +msgstr "無法執行命令 \"%s\": %m" -# help.c:108 -#: help.c:108 +# access/transam/xlog.c:1936 access/transam/xlog.c:2038 +# access/transam/xlog.c:5291 +#: copy.c:342 #, c-format -msgid " -n, --no-readline disable enhanced command line editing (readline)\n" -msgstr " -n, --no-readline é—œé–‰æŒ‡ä»¤åˆ—åŠ å¼·ç·¨è¼¯æ¨¡å¼ (readline)\n" +msgid "could not stat file \"%s\": %m" +msgstr "無法å–得檔案 \"%s\" 的狀態: %m" -# help.c:107 -#: help.c:109 +# copy.c:541 +#: copy.c:346 #, c-format -msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" -msgstr " -o, --output=FILENAME å°‡æŸ¥è©¢çµæžœå‚³é€è‡³æª”案 (或 | 管線)\n" +msgid "%s: cannot copy from/to a directory" +msgstr "%s: 無法複製至/從目錄" -# help.c:106 -#: help.c:110 +# access/transam/xlog.c:3154 access/transam/xlog.c:3341 +#: copy.c:383 #, c-format -msgid " -q, --quiet run quietly (no messages, only query output)\n" -msgstr " -q, --quiet ä»¥å®‰éœæ¨¡å¼åŸ·è¡Œ (沒有訊æ¯ï¼Œåªæœ‰æŸ¥è©¢çµæžœ)\n" +msgid "could not close pipe to external command: %m" +msgstr "無法關閉å°å¤–部命令的管é“: %m" -# help.c:109 -#: help.c:111 +# command.c:1103 +#: copy.c:451 copy.c:461 #, c-format -msgid " -s, --single-step single-step mode (confirm each query)\n" -msgstr " -s, --single-step å–®æ­¥æ¨¡å¼ (ç¢ºèªæ¯å€‹æŸ¥è©¢)\n" +msgid "could not write COPY data: %m" +msgstr "無法寫入 COPY 資料: %m" -# help.c:110 -#: help.c:112 +#: copy.c:467 #, c-format -msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" -msgstr " -S, --single-line å–®è¡Œæ¨¡å¼ (一行就是一個 SQL 指令列)\n" +msgid "COPY data transfer failed: %s" +msgstr "COPY 資料傳輸失敗: %s" -# help.c:112 -#: help.c:114 -#, c-format +#: copy.c:528 +msgid "canceled by user" +msgstr "å·²è¢«ä½¿ç”¨è€…å–æ¶ˆ" + +# copy.c:668 +#: copy.c:539 msgid "" -"\n" -"Output format options:\n" +"Enter data to be copied followed by a newline.\n" +"End with a backslash and a period on a line by itself, or an EOF signal." msgstr "" -"\n" -"輸出格å¼é¸é …:\n" +"請輸入è¦è¤‡è£½çš„資料,然後加上æ›è¡Œç¬¦è™Ÿã€‚\n" +"以忖œç·šå’Œä¸€å€‹ç¨ç«‹çš„å¥é»žçµæŸï¼Œæˆ–者使用 EOF 信號。" -# help.c:113 -#: help.c:115 +#: copy.c:682 +msgid "aborted because of read failure" +msgstr "因讀å–失敗而中止" + +#: copy.c:716 +msgid "trying to exit copy mode" +msgstr "試圖退出複製模å¼" + +#: crosstabview.c:123 #, c-format -msgid " -A, --no-align unaligned table output mode\n" -msgstr " -A, --no-align 使用éžå°é½Šè³‡æ–™è¡¨è¼¸å‡ºæ¨¡å¼\n" +msgid "\\crosstabview: statement did not return a result set" +msgstr "\\crosstabview: æ•˜è¿°æœªå›žå‚³çµæžœé›†" -# help.c:119 -#: help.c:116 +# parser/parse_expr.c:492 +#: crosstabview.c:129 #, c-format -msgid "" -" -F, --field-separator=STRING\n" -" set field separator (default: \"%s\")\n" -msgstr "" -" -F, --field-separator=STRING\n" -" 設定欄ä½åˆ†éš”符號 (é è¨­: \"%s\")\n" +msgid "\\crosstabview: query must return at least three columns" +msgstr "\\crosstabview: 查詢至少è¦å›žå‚³ä¸‰å€‹æ¬„ä½" -# help.c:114 -#: help.c:119 +#: crosstabview.c:156 #, c-format -msgid " -H, --html HTML table output mode\n" -msgstr " -H, --html HTML 表格輸出模å¼\n" +msgid "\\crosstabview: vertical and horizontal headers must be different columns" +msgstr "\\crosstabview: 垂直和水平標頭必須是ä¸åŒçš„æ¬„ä½" -# help.c:118 -#: help.c:120 +#: crosstabview.c:172 #, c-format -msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" -msgstr " -P, --pset=VAR[=ARG] 將列å°é¸é … VAR 設為 ARG (è«‹åƒé–± \\pset 指令)\n" +msgid "\\crosstabview: data column must be specified when query returns more than three columns" +msgstr "\\crosstabview: 當查詢回傳超éŽä¸‰å€‹æ¬„使™‚,必須指定資料欄ä½" -# help.c:121 -#: help.c:121 +#: crosstabview.c:228 #, c-format -msgid "" -" -R, --record-separator=STRING\n" -" set record separator (default: newline)\n" -msgstr "" -" -R, --record-separator=STRING\n" -" 設定記錄分隔符號(é è¨­: æ›è¡Œç¬¦è™Ÿ)\n" +msgid "\\crosstabview: maximum number of columns (%d) exceeded" +msgstr "\\crosstabview: è¶…éŽæœ€å¤§æ¬„使•¸é™åˆ¶(%d)" -# help.c:115 -#: help.c:123 +#: crosstabview.c:397 #, c-format -msgid " -t, --tuples-only print rows only\n" -msgstr " -t, --tuples-only åªåˆ—å°è³‡æ–™åˆ—\n" +msgid "\\crosstabview: query result contains multiple data values for row \"%s\", column \"%s\"" +msgstr "\\crosstabview: æŸ¥è©¢çµæžœåŒ…å«å¤šå€‹è³‡æ–™å€¼ï¼Œåˆ— â€%sâ€ï¼Œæ¬„ â€%sâ€" -# help.c:116 -#: help.c:124 +# fe-exec.c:1906 +# fe-exec.c:1929 +#: crosstabview.c:645 #, c-format -msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" -msgstr " -T, --table-attr=TEXT 設定 HTML 表格標記屬性 (例如 widthã€border)\n" +msgid "\\crosstabview: column number %d is out of range 1..%d" +msgstr "\\crosstabview: 欄ä½ç·¨è™Ÿ %d è¶…éŽç¯„åœ 1..%d" -# help.c:117 -#: help.c:125 +#: crosstabview.c:670 #, c-format -msgid " -x, --expanded turn on expanded table output\n" -msgstr " -x, --expanded 開啟擴展資料表輸出\n" +msgid "\\crosstabview: ambiguous column name: \"%s\"" +msgstr "\\crosstabview: 模稜兩å¯çš„æ¬„ä½å稱: \"%s\"" -#: help.c:127 +#: crosstabview.c:678 #, c-format -msgid "" -"\n" -"Connection options:\n" -msgstr "" -"\n" -"連線é¸é …:\n" +msgid "\\crosstabview: column name not found: \"%s\"" +msgstr "\\crosstabview: 找ä¸åˆ°æ¬„ä½å稱: \"%s\"" -# help.c:126 -#: help.c:130 -#, c-format -msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" -msgstr " -h, --host=HOSTNAME 資料庫伺æœå™¨ä¸»æ©Ÿæˆ–通訊端目錄 (é è¨­:\"%s\")\n" +# describe.c:82 +# describe.c:177 +# describe.c:247 +# describe.c:320 +# describe.c:415 +# describe.c:469 +# describe.c:1476 +# describe.c:1585 +# describe.c:1633 +#: describe.c:87 describe.c:338 describe.c:630 describe.c:807 describe.c:1038 +#: describe.c:1189 describe.c:1264 describe.c:3947 describe.c:4157 +#: describe.c:4407 describe.c:4489 describe.c:4724 describe.c:4932 +#: describe.c:5174 describe.c:5418 describe.c:5488 describe.c:5499 +#: describe.c:5556 describe.c:5960 describe.c:6038 +msgid "Schema" +msgstr "Schema" -# help.c:127 -#: help.c:131 -msgid "local socket" -msgstr "本地接å£" +# describe.c:82 +# describe.c:128 +# describe.c:177 +# describe.c:247 +# describe.c:320 +# describe.c:362 +# describe.c:415 +# describe.c:469 +# describe.c:1476 +# describe.c:1586 +# describe.c:1634 +# describe.c:1727 +#: describe.c:88 describe.c:167 describe.c:229 describe.c:339 describe.c:631 +#: describe.c:808 describe.c:930 describe.c:1039 describe.c:1265 +#: describe.c:3948 describe.c:4158 describe.c:4323 describe.c:4408 +#: describe.c:4490 describe.c:4653 describe.c:4725 describe.c:4933 +#: describe.c:5046 describe.c:5175 describe.c:5419 describe.c:5489 +#: describe.c:5500 describe.c:5557 describe.c:5756 describe.c:5827 +#: describe.c:6036 describe.c:6265 describe.c:6573 +msgid "Name" +msgstr "å稱" -# help.c:130 -#: help.c:134 -#, c-format -msgid " -p, --port=PORT database server port (default: \"%s\")\n" -msgstr " -p, --port=PORT 資料庫伺æœå™¨åŸ è™Ÿ (é è¨­: \"%s\")\n" +# describe.c:177 +#: describe.c:89 describe.c:351 describe.c:369 +msgid "Result data type" +msgstr "çµæžœè³‡æ–™åž‹åˆ¥" -# help.c:136 -#: help.c:140 -#, c-format -msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" -msgstr " -U, --username=USERNAME 資料庫使用者å稱 (é è¨­: \"%s\")\n" +# describe.c:178 +#: describe.c:90 describe.c:352 describe.c:370 +msgid "Argument data types" +msgstr "åƒæ•¸è³‡æ–™åž‹åˆ¥" -#: help.c:141 -#, c-format -msgid " -w, --no-password never prompt for password\n" -msgstr " -w, --no-password çµ•ä¸æç¤ºå¯†ç¢¼\n" +# describe.c:83 +# describe.c:187 +# describe.c:260 +# describe.c:322 +# describe.c:369 +# describe.c:469 +# describe.c:758 +# describe.c:1488 +# describe.c:1733 +# large_obj.c:256 +#: describe.c:98 describe.c:105 describe.c:178 describe.c:243 describe.c:418 +#: describe.c:662 describe.c:823 describe.c:974 describe.c:1267 describe.c:2047 +#: describe.c:3676 describe.c:4002 describe.c:4204 describe.c:4347 +#: describe.c:4421 describe.c:4499 describe.c:4666 describe.c:4844 +#: describe.c:4982 describe.c:5055 describe.c:5176 describe.c:5327 +#: describe.c:5369 describe.c:5435 describe.c:5492 describe.c:5501 +#: describe.c:5558 describe.c:5774 describe.c:5849 describe.c:5974 +#: describe.c:6039 describe.c:7093 +msgid "Description" +msgstr "æè¿°" -#: help.c:142 -#, c-format -msgid " -W, --password force password prompt (should happen automatically)\n" -msgstr " -W, --password 強制詢å•密碼(應該會自動詢å•)\n" +# describe.c:97 +#: describe.c:128 +msgid "List of aggregate functions" +msgstr "èšåˆå‡½æ•¸åˆ—表" -# help.c:140 -#: help.c:144 +# describe.c:117 +#: describe.c:153 #, c-format -msgid "" -"\n" -"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" -"commands) from within psql, or consult the psql section in the PostgreSQL\n" -"documentation.\n" -"\n" -msgstr "" -"\n" -"如需詳細資訊,請從 psql 中輸入 \"\\?\"(用於內部命令) 或 \"\\help\" (用於 SQL\n" -"命令),或請åƒé–± PostgreSQL\n" -"文件的 psql 章節。\n" -"\n" +msgid "The server (version %s) does not support access methods." +msgstr "伺æœå™¨(版本 %s)䏿”¯æ´å­˜å–æ–¹å¼ã€‚" -#: help.c:147 -#, c-format -msgid "Report bugs to .\n" -msgstr "回報錯誤至。\n" +# describe.c:543 +# describe.c:1477 +#: describe.c:168 +msgid "Index" +msgstr "索引" -# help.c:174 -#: help.c:165 -#, c-format -msgid "General\n" -msgstr "一般性\n" +# describe.c:1483 +#: describe.c:169 describe.c:3966 describe.c:4183 describe.c:5961 +msgid "Table" +msgstr "資料表" -# help.c:179 -#: help.c:166 -#, c-format -msgid " \\copyright show PostgreSQL usage and distribution terms\n" -msgstr " \\copyright 顯示 PostgreSQL çš„ä½¿ç”¨å’Œç™¼è¡Œæ¢æ¬¾\n" +#: describe.c:177 describe.c:5758 +msgid "Handler" +msgstr "Handler" -# help.c:194 -#: help.c:167 -#, c-format -msgid " \\g [FILE] or ; execute query (and send results to file or |pipe)\n" -msgstr " \\g [FILE] 或 ; 執行查詢 (ä¸¦å°‡çµæžœå‚³é€è‡³æª”案或 | 管線)\n" +# describe.c:1703 +#: describe.c:201 +msgid "List of access methods" +msgstr "å­˜å–æ–¹å¼æ¸…å–®" -# help.c:182 -#: help.c:168 -#, c-format -msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" -msgstr " \\h [NAME] SQL 指令語法說明,用 * 顯示全部 指令說明\n" +# describe.c:128 +# describe.c:186 +# describe.c:362 +# describe.c:1478 +# describe.c:1727 +#: describe.c:230 describe.c:404 describe.c:655 describe.c:931 describe.c:1188 +#: describe.c:3959 describe.c:4159 describe.c:4324 describe.c:4655 +#: describe.c:5047 describe.c:5757 describe.c:5828 describe.c:6266 +#: describe.c:6454 describe.c:6574 describe.c:6733 describe.c:6819 +#: describe.c:7081 +msgid "Owner" +msgstr "æ“æœ‰è€…" -# help.c:183 -#: help.c:169 -#, c-format -msgid " \\q quit psql\n" -msgstr " \\q çµæŸ psql\n" +# describe.c:128 +#: describe.c:231 +msgid "Location" +msgstr "ä½ç½®" -# help.c:192 -#: help.c:172 -#, c-format -msgid "Query Buffer\n" -msgstr "查詢緩存å€\n" +# postmaster/postmaster.c:1017 tcop/postgres.c:2115 +#: describe.c:241 describe.c:3517 describe.c:3858 +msgid "Options" +msgstr "é¸é …" -# help.c:193 -#: help.c:173 -#, c-format -msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" -msgstr " \\e [FILE] [LINE] 用外部編輯器編輯查詢緩è¡å€(或檔案)\n" +# describe.c:257 +#: describe.c:242 describe.c:653 describe.c:972 describe.c:4001 +msgid "Size" +msgstr "大å°" -# help.c:193 -#: help.c:174 -#, c-format -msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" -msgstr " \\ef [FUNCNAME [LINE]] 用外部編輯器編輯函å¼å®šç¾©\n" +# describe.c:150 +#: describe.c:266 +msgid "List of tablespaces" +msgstr "表空間清單" -# help.c:195 -#: help.c:175 +#: describe.c:311 #, c-format -msgid " \\p show the contents of the query buffer\n" -msgstr " \\p 顯示查詢緩è¡å€çš„內容\n" +msgid "\\df only takes [anptwS+] as options" +msgstr "\\df åªæŽ¥å— [anptwS+] 作為é¸é …" -# help.c:196 -#: help.c:176 +#: describe.c:319 #, c-format -msgid " \\r reset (clear) the query buffer\n" -msgstr " \\r é‡ç½® (清空) 查詢緩è¡å€\n" +msgid "\\df does not take a \"%c\" option with server version %s" +msgstr "\\df 伺æœå™¨ç‰ˆæœ¬ %2$s ä¸æŽ¥å— \"%1$c\" é¸é …" -# help.c:198 -#: help.c:178 -#, c-format -msgid " \\s [FILE] display history or save it to file\n" -msgstr " \\s [FILE] 顯示歷å²è¨˜éŒ„或將它儲存至檔案\n" +#. translator: "agg" is short for "aggregate" +#: describe.c:354 describe.c:372 +msgid "agg" +msgstr "agg" -# help.c:200 -#: help.c:180 -#, c-format -msgid " \\w FILE write query buffer to file\n" -msgstr " \\w FILE 將查詢緩è¡å€å¯«è‡³æª”案\n" +#: describe.c:355 describe.c:373 +msgid "window" +msgstr "window" -# help.c:203 -#: help.c:183 -#, c-format -msgid "Input/Output\n" -msgstr "輸入/輸出\n" +#: describe.c:356 +msgid "proc" +msgstr "proc" -# help.c:251 -#: help.c:184 -#, c-format -msgid " \\copy ... perform SQL COPY with data stream to the client host\n" -msgstr " \\copy ... 執行 SQL COPY,將資料æµå‚³é€è‡³ç”¨æˆ¶ç«¯ 主機\n" +# describe.c:498 +#: describe.c:357 describe.c:375 +msgid "func" +msgstr "func" -# help.c:204 -#: help.c:185 -#, c-format -msgid " \\echo [STRING] write string to standard output\n" -msgstr " \\echo [STRING] 將字串寫至標準輸出\n" +# describe.c:575 +#: describe.c:374 describe.c:1397 +msgid "trigger" +msgstr "trigger" -# help.c:205 -#: help.c:186 -#, c-format -msgid " \\i FILE execute commands from file\n" -msgstr " \\i FILE 從檔案中執行指令\n" +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: describe.c:386 +msgid "immutable" +msgstr "immutable" -# help.c:206 -#: help.c:187 -#, c-format -msgid " \\o [FILE] send all query results to file or |pipe\n" -msgstr " \\o [FILE] å°‡æ‰€æœ‰æŸ¥è©¢çµæžœå‚³é€è‡³æª”案或 | 管線\n" +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: describe.c:387 +msgid "stable" +msgstr "stable" -# help.c:207 -#: help.c:188 -#, c-format -msgid " \\qecho [STRING] write string to query output stream (see \\o)\n" -msgstr " \\qecho [STRING] å°‡å­—ä¸²å¯«è‡³æŸ¥è©¢è¼¸å‡ºä¸²æµ (è«‹åƒé–± \\o)\n" +#: describe.c:388 +msgid "volatile" +msgstr "volatile" -# help.c:211 -#: help.c:191 -#, c-format -msgid "Informational\n" -msgstr "資訊性\n" +#: describe.c:389 +msgid "Volatility" +msgstr "變動性" -#: help.c:192 -#, c-format -msgid " (options: S = show system objects, + = additional detail)\n" -msgstr " (é¸é …: S = 顯示系統物件,+ = 其他詳細資料)\n" +#: describe.c:397 +msgid "restricted" +msgstr "restricted" -# help.c:226 -#: help.c:193 -#, c-format -msgid " \\d[S+] list tables, views, and sequences\n" -msgstr " \\d[S+] 列出資料表ã€è¦–圖和åºåˆ—\n" +#: describe.c:398 +msgid "safe" +msgstr "safe" -# help.c:212 -#: help.c:194 -#, c-format -msgid " \\d[S+] NAME describe table, view, sequence, or index\n" -msgstr " \\d[S+] NAME æè¿°è³‡æ–™è¡¨ã€è¦–圖ã€åºåˆ—或索引\n" +#: describe.c:399 +msgid "unsafe" +msgstr "unsafe" -# help.c:215 -#: help.c:195 -#, c-format -msgid " \\da[S] [PATTERN] list aggregates\n" -msgstr " \\da[S] [PATTERN] 列出彙總\n" +#: describe.c:400 +msgid "Parallel" +msgstr "並行" -# help.c:228 -#: help.c:196 -#, c-format -msgid " \\db[+] [PATTERN] list tablespaces\n" -msgstr " \\db[+] [PATTERN] 列出資料表空間\n" +# sql_help.h:221 +#: describe.c:405 +msgid "definer" +msgstr "definer" -# help.c:217 -#: help.c:197 -#, c-format -msgid " \\dc[S] [PATTERN] list conversions\n" -msgstr " \\dc[S] [PATTERN] 列出轉æ›\n" +#: describe.c:406 +msgid "invoker" +msgstr "invoker" -# help.c:218 -#: help.c:198 -#, c-format -msgid " \\dC [PATTERN] list casts\n" -msgstr " \\dC [PATTERN] 列出型別轉æ›\n" +#: describe.c:407 +msgid "Security" +msgstr "安全性" -# help.c:219 -#: help.c:199 -#, c-format -msgid " \\dd[S] [PATTERN] show comments on objects\n" -msgstr " \\dd[S] [PATTERN] 顯示物件的註解\n" +# describe.c:186 +#: describe.c:412 +msgid "Language" +msgstr "語言" -# help.c:218 -#: help.c:200 -#, c-format -msgid " \\ddp [PATTERN] list default privileges\n" -msgstr " \\ddp [PATTERN] 列出é è¨­æ¬Šé™\n" +# describe.c:257 +#: describe.c:415 describe.c:652 +msgid "Internal name" +msgstr "內部å稱" -# help.c:220 -#: help.c:201 -#, c-format -msgid " \\dD[S] [PATTERN] list domains\n" -msgstr " \\dD[S] [PATTERN] 列出å¯ç”¨åŸŸ\n" +# describe.c:221 +#: describe.c:589 +msgid "List of functions" +msgstr "函數清單" -# help.c:228 -#: help.c:202 -#, c-format -msgid " \\det[+] [PATTERN] list foreign tables\n" -msgstr " \\det[+] [PATTERN] 列出 foreign 資料表\n" +#: describe.c:654 +msgid "Elements" +msgstr "元素" -# help.c:228 -#: help.c:203 -#, c-format -msgid " \\des[+] [PATTERN] list foreign servers\n" -msgstr " \\des[+] [PATTERN] 列出外部伺æœå™¨\n" +# describe.c:289 +#: describe.c:706 +msgid "List of data types" +msgstr "資料型別清單" -# help.c:228 -#: help.c:204 -#, c-format -msgid " \\deu[+] [PATTERN] list user mappings\n" -msgstr " \\deu[+] [PATTERN] åˆ—å‡ºä½¿ç”¨è€…å°æ‡‰\n" +# describe.c:321 +#: describe.c:809 +msgid "Left arg type" +msgstr "å·¦åƒæ•¸åž‹åˆ¥" -# help.c:222 -#: help.c:205 -#, c-format -msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" -msgstr " \\dew[+] [PATTERN] 列出外部資料包è£å‡½å¼\n" +# describe.c:321 +#: describe.c:810 +msgid "Right arg type" +msgstr "å³åƒæ•¸åž‹åˆ¥" -# help.c:215 -#: help.c:206 -#, c-format -msgid " \\df[antw][S+] [PATRN] list [only agg/normal/trigger/window] functions\n" -msgstr " \\df[antw][S+] [PATRN] 列出 [åªåˆ—出彙總/一般/觸發程åº/視窗] 函å¼\n" +# describe.c:322 +#: describe.c:811 +msgid "Result type" +msgstr "çµæžœé¡žåž‹" -# help.c:221 -#: help.c:207 +# describe.c:1691 +#: describe.c:816 describe.c:4661 describe.c:4827 describe.c:5326 +#: describe.c:7010 describe.c:7014 +msgid "Function" +msgstr "函數" + +# describe.c:336 +#: describe.c:897 +msgid "List of operators" +msgstr "é‹ç®—符清單" + +# describe.c:365 +#: describe.c:932 +msgid "Encoding" +msgstr "字元編碼" + +#: describe.c:936 describe.c:940 +msgid "Locale Provider" +msgstr "å€åŸŸæä¾›è€…" + +# describe.c:128 +#: describe.c:944 describe.c:4947 +msgid "Collate" +msgstr "Collate" + +# describe.c:415 +# describe.c:745 +# describe.c:1478 +# describe.c:1587 +#: describe.c:945 describe.c:4948 +msgid "Ctype" +msgstr "Ctype" + +# help.c:127 +#: describe.c:949 describe.c:953 describe.c:4953 describe.c:4957 +msgid "ICU Locale" +msgstr "ICU å€åŸŸ" + +# describe.c:983 +# describe.c:1204 +#: describe.c:957 describe.c:961 describe.c:4962 describe.c:4966 +msgid "ICU Rules" +msgstr "ICU è¦å‰‡" + +# describe.c:1342 +#: describe.c:973 +msgid "Tablespace" +msgstr "表空間" + +# describe.c:381 +#: describe.c:999 +msgid "List of databases" +msgstr "資料庫清單" + +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: describe.c:1040 describe.c:1191 describe.c:3949 +msgid "table" +msgstr "table" + +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: describe.c:1041 describe.c:3950 +msgid "view" +msgstr "view" + +#: describe.c:1042 describe.c:3951 +msgid "materialized view" +msgstr "materialized view" + +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: describe.c:1043 describe.c:1193 describe.c:3953 +msgid "sequence" +msgstr "sequence" + +# describe.c:933 +#: describe.c:1044 describe.c:3955 +msgid "foreign table" +msgstr "foreign table" + +#: describe.c:1045 describe.c:3956 describe.c:4168 +msgid "partitioned table" +msgstr "partitioned table" + +# sql_help.h:325 +#: describe.c:1056 +msgid "Column privileges" +msgstr "æ¬„ä½æ¬Šé™" + +#: describe.c:1087 describe.c:1121 +msgid "Policies" +msgstr "政策" + +# describe.c:133 +# describe.c:415 +# describe.c:1733 +#: describe.c:1150 describe.c:4577 describe.c:6678 +msgid "Access privileges" +msgstr "å­˜å–æ¬Šé™" + +# describe.c:498 +#: describe.c:1195 +msgid "function" +msgstr "函數" + +# describe.c:415 +# describe.c:745 +# describe.c:1478 +# describe.c:1587 +#: describe.c:1197 +msgid "type" +msgstr "型別" + +# describe.c:82 +# describe.c:177 +# describe.c:247 +# describe.c:320 +# describe.c:415 +# describe.c:469 +# describe.c:1476 +# describe.c:1585 +# describe.c:1633 +#: describe.c:1199 +msgid "schema" +msgstr "schema" + +# sql_help.h:325 +#: describe.c:1222 +msgid "Default access privileges" +msgstr "é è¨­å­˜å–權é™" + +# describe.c:469 +#: describe.c:1266 +msgid "Object" +msgstr "物件" + +# catalog/dependency.c:1511 +#: describe.c:1280 +msgid "table constraint" +msgstr "table constraint" + +#: describe.c:1304 +msgid "domain constraint" +msgstr "domain constraint" + +# catalog/dependency.c:1592 +#: describe.c:1328 +msgid "operator class" +msgstr "operator class" + +# sql_help.h:269 +#: describe.c:1352 +msgid "operator family" +msgstr "operator family" + +# describe.c:559 +#: describe.c:1375 +msgid "rule" +msgstr "rule" + +# describe.c:593 +#: describe.c:1421 +msgid "Object descriptions" +msgstr "物件æè¿°" + +# describe.c:641 +#: describe.c:1486 describe.c:4074 #, c-format -msgid " \\dF[+] [PATTERN] list text search configurations\n" -msgstr " \\dF[+] [PATTERN] 列出文本æœå°‹çµ„æ…‹\n" +msgid "Did not find any relation named \"%s\"." +msgstr "找ä¸åˆ°å為 \"%s\" 的關è¯ã€‚" -# help.c:228 -#: help.c:208 +# describe.c:641 +#: describe.c:1489 describe.c:4077 #, c-format -msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" -msgstr " \\dFd[+] [PATTERN] 列出文本æœå°‹å­—å…¸\n" +msgid "Did not find any relations." +msgstr "找ä¸åˆ°ä»»ä½•é—œè¯ã€‚" -# help.c:228 -#: help.c:209 +# describe.c:728 +#: describe.c:1685 #, c-format -msgid " \\dFp[+] [PATTERN] list text search parsers\n" -msgstr " \\dFp[+] [PATTERN] 列出文本æœå°‹è§£è­¯å™¨\n" +msgid "Did not find any relation with OID %s." +msgstr "找ä¸åˆ°åˆ° OID 為 %s 的關è¯ã€‚" -# help.c:228 -#: help.c:210 +#: describe.c:1733 describe.c:1757 +msgid "Start" +msgstr "é–‹å§‹" + +#: describe.c:1734 describe.c:1758 +msgid "Minimum" +msgstr "最å°" + +#: describe.c:1735 describe.c:1759 +msgid "Maximum" +msgstr "最大" + +#: describe.c:1736 describe.c:1760 +msgid "Increment" +msgstr "增é‡" + +#: describe.c:1737 describe.c:1761 describe.c:1890 describe.c:4493 +#: describe.c:4838 describe.c:4971 describe.c:4976 describe.c:6721 +msgid "yes" +msgstr "是" + +#: describe.c:1738 describe.c:1762 describe.c:1891 describe.c:4493 +#: describe.c:4835 describe.c:4971 describe.c:6722 +msgid "no" +msgstr "å¦" + +#: describe.c:1739 describe.c:1763 +msgid "Cycles?" +msgstr "循環?" + +#: describe.c:1740 describe.c:1764 +msgid "Cache" +msgstr "å¿«å–" + +#: describe.c:1805 #, c-format -msgid " \\dFt[+] [PATTERN] list text search templates\n" -msgstr " \\dFt[+] [PATTERN] 列出文本æœå°‹æ¨£æ¿\n" +msgid "Owned by: %s" +msgstr "æ“æœ‰è€…: %s" -# help.c:222 -#: help.c:211 +#: describe.c:1809 #, c-format -msgid " \\dg[+] [PATTERN] list roles\n" -msgstr " \\dg[+] [PATTERN] 列出 role\n" +msgid "Sequence for identity column: %s" +msgstr "è‡ªå‹•å¢žé‡æ¬„ä½åºåˆ—: %s" -# help.c:220 -#: help.c:212 +# describe.c:871 +#: describe.c:1817 #, c-format -msgid " \\di[S+] [PATTERN] list indexes\n" -msgstr " \\di[S+] [PATTERN] 列出索引\n" +msgid "Unlogged sequence \"%s.%s\"" +msgstr "無日誌åºåˆ— \"%s.%s\"" -# help.c:225 -#: help.c:213 +# describe.c:867 +#: describe.c:1820 #, c-format -msgid " \\dl list large objects, same as \\lo_list\n" -msgstr " \\dl 列出大型物件,與 \\lo_list 相åŒ\n" +msgid "Sequence \"%s.%s\"" +msgstr "åºåˆ— \"%s.%s\"" -# help.c:228 -#: help.c:214 +# describe.c:933 +#: describe.c:1963 #, c-format -msgid " \\dL[S+] [PATTERN] list procedural languages\n" -msgstr " \\dL[S+] [PATTERN] 列出程åºèªžè¨€\n" +msgid "Unlogged table \"%s.%s\"" +msgstr "無日誌資料表 \"%s.%s\"" -# help.c:228 -#: help.c:215 +# describe.c:859 +#: describe.c:1966 #, c-format -msgid " \\dn[S+] [PATTERN] list schemas\n" -msgstr " \\dn[S+] [PATTERN] 列出 schema\n" +msgid "Table \"%s.%s\"" +msgstr "資料表 \"%s.%s\"" -# help.c:224 -#: help.c:216 +# describe.c:863 +#: describe.c:1970 #, c-format -msgid " \\do[S] [PATTERN] list operators\n" -msgstr " \\do[S] [PATTERN] 列出é‹ç®—å­\n" +msgid "View \"%s.%s\"" +msgstr "檢視表 \"%s.%s\"" -# help.c:220 -#: help.c:217 +# describe.c:933 +#: describe.c:1975 #, c-format -msgid " \\dO[S+] [PATTERN] list collations\n" -msgstr " \\dO[S+] [PATTERN] 列出定åº\n" +msgid "Unlogged materialized view \"%s.%s\"" +msgstr "無日誌實體化檢視表 \"%s.%s\"" -# help.c:226 -#: help.c:218 +# commands/analyze.c:198 +#: describe.c:1978 #, c-format -msgid " \\dp [PATTERN] list table, view, and sequence access privileges\n" -msgstr " \\dp [PATTERN] 列出資料表ã€è¦–圖和åºåˆ—çš„å­˜å–æ¬Šé™\n" +msgid "Materialized view \"%s.%s\"" +msgstr "實體化檢視表 \"%s.%s\"" -#: help.c:219 +# describe.c:871 +#: describe.c:1983 #, c-format -msgid " \\drds [PATRN1 [PATRN2]] list per-database role settings\n" -msgstr " \\drds [PATRN1 [PATRN2]] 列出資料庫 role 設定\n" +msgid "Unlogged index \"%s.%s\"" +msgstr "無日誌索引 \"%s.%s\"" -# help.c:228 -#: help.c:220 +# describe.c:871 +#: describe.c:1986 #, c-format -msgid " \\ds[S+] [PATTERN] list sequences\n" -msgstr " \\ds[S+] [PATTERN] 列出åºåˆ—\n" +msgid "Index \"%s.%s\"" +msgstr "索引 \"%s.%s\"" -# help.c:228 -#: help.c:221 +# describe.c:871 +#: describe.c:1991 #, c-format -msgid " \\dt[S+] [PATTERN] list tables\n" -msgstr " \\dt[S+] [PATTERN] 列出資料表\n" +msgid "Unlogged partitioned index \"%s.%s\"" +msgstr "無日誌分割索引 \"%s.%s\"" -# help.c:220 -#: help.c:222 +# describe.c:871 +#: describe.c:1994 #, c-format -msgid " \\dT[S+] [PATTERN] list data types\n" -msgstr " \\dT[S+] [PATTERN] 列出資料型別\n" +msgid "Partitioned index \"%s.%s\"" +msgstr "分割索引 \"%s.%s\"" -# help.c:228 -#: help.c:223 +# describe.c:879 +#: describe.c:1998 +#, c-format +msgid "TOAST table \"%s.%s\"" +msgstr "TOAST 資料表 \"%s.%s\"" + +# describe.c:883 +#: describe.c:2002 +#, c-format +msgid "Composite type \"%s.%s\"" +msgstr "複åˆåž‹åˆ¥ \"%s.%s\"" + +# describe.c:933 +#: describe.c:2006 +#, c-format +msgid "Foreign table \"%s.%s\"" +msgstr "外部資料表 \"%s.%s\"" + +# describe.c:933 +#: describe.c:2011 +#, c-format +msgid "Unlogged partitioned table \"%s.%s\"" +msgstr "無日誌分割資料表 \"%s.%s\"" + +# describe.c:933 +#: describe.c:2014 +#, c-format +msgid "Partitioned table \"%s.%s\"" +msgstr "分割資料表 \"%s.%s\"" + +# describe.c:128 +#: describe.c:2030 describe.c:4410 +msgid "Collation" +msgstr "定åº" + +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: describe.c:2031 describe.c:4411 +msgid "Nullable" +msgstr "能å¦ç‚º NULL" + +# describe.c:1639 +#: describe.c:2032 describe.c:4412 +msgid "Default" +msgstr "é è¨­" + +#: describe.c:2035 +msgid "Key?" +msgstr "索引éµ?" + +# describe.c:1636 +#: describe.c:2037 describe.c:4732 describe.c:4743 +msgid "Definition" +msgstr "定義" + +# postmaster/postmaster.c:1017 tcop/postgres.c:2115 +#: describe.c:2039 describe.c:5773 describe.c:5848 describe.c:5914 +#: describe.c:5973 +msgid "FDW options" +msgstr "FDW é¸é …" + +# describe.c:1635 +#: describe.c:2041 +msgid "Storage" +msgstr "儲存體" + +#: describe.c:2043 +msgid "Compression" +msgstr "壓縮" + +#: describe.c:2045 +msgid "Stats target" +msgstr "統計目標" + +#: describe.c:2181 +#, c-format +msgid "Partition of: %s %s%s" +msgstr "分割來自: %s %s%s" + +#: describe.c:2194 +msgid "No partition constraint" +msgstr "沒有分割è¦å‰‡" + +# catalog/dependency.c:1511 +#: describe.c:2196 +#, c-format +msgid "Partition constraint: %s" +msgstr "分割è¦å‰‡: %s" + +#: describe.c:2220 +#, c-format +msgid "Partition key: %s" +msgstr "分割索引éµ: %s" + +# describe.c:933 +#: describe.c:2246 +#, c-format +msgid "Owning table: \"%s.%s\"" +msgstr "所屬資料表: \"%s.%s\"" + +# describe.c:925 +#: describe.c:2315 +msgid "primary key, " +msgstr "primary key, " + +# describe.c:927 +#: describe.c:2318 +msgid "unique" +msgstr "unique" + +#: describe.c:2320 +msgid " nulls not distinct" +msgstr " nulls not distinct" + +# fe-protocol3.c:691 +#: describe.c:2321 +msgid ", " +msgstr ", " + +# describe.c:933 +#: describe.c:2328 #, c-format -msgid " \\du[+] [PATTERN] list roles\n" -msgstr " \\du[+] [PATTERN] 列出 role\n" +msgid "for table \"%s.%s\"" +msgstr "for table \"%s.%s\"" + +# describe.c:937 +#: describe.c:2332 +#, c-format +msgid ", predicate (%s)" +msgstr ", predicate (%s)" + +# describe.c:940 +#: describe.c:2335 +msgid ", clustered" +msgstr ", clustered" + +#: describe.c:2338 +msgid ", invalid" +msgstr ", invalid" + +#: describe.c:2341 +msgid ", deferrable" +msgstr ", deferrable" + +#: describe.c:2344 +msgid ", initially deferred" +msgstr ", initially deferred" + +#: describe.c:2347 +msgid ", replica identity" +msgstr ", replica identity" + +# describe.c:1138 +#: describe.c:2401 +msgid "Indexes:" +msgstr "索引:" + +# describe.c:1174 +#: describe.c:2484 +msgid "Check constraints:" +msgstr "檢查è¦å‰‡:" + +# describe.c:1189 +#: describe.c:2552 +msgid "Foreign-key constraints:" +msgstr "外鵿ª¢æŸ¥è¦å‰‡:" + +#: describe.c:2615 +msgid "Referenced by:" +msgstr "åƒè€ƒè€…:" + +#: describe.c:2665 +msgid "Policies:" +msgstr "政策:" + +#: describe.c:2668 +msgid "Policies (forced row security enabled):" +msgstr "政策(強制列安全性已啟動):" + +#: describe.c:2671 +msgid "Policies (row security enabled): (none)" +msgstr "政策(列安全性已啟動): (none)" + +#: describe.c:2674 +msgid "Policies (forced row security enabled): (none)" +msgstr "政策(強制列安全性已啟動): (none)" + +#: describe.c:2677 +msgid "Policies (row security disabled):" +msgstr "政策(列安全性已關閉):" + +# utils/misc/guc.c:279 +#: describe.c:2737 describe.c:2841 +msgid "Statistics objects:" +msgstr "統計物件:" + +# describe.c:983 +# describe.c:1204 +#: describe.c:2943 describe.c:3096 +msgid "Rules:" +msgstr "è¦å‰‡:" + +#: describe.c:2946 +msgid "Disabled rules:" +msgstr "å·²åœç”¨è¦å‰‡:" + +#: describe.c:2949 +msgid "Rules firing always:" +msgstr "æ°¸é è§¸ç™¼çš„è¦å‰‡:" + +#: describe.c:2952 +msgid "Rules firing on replica only:" +msgstr "åªåœ¨è¤‡æœ¬è§¸ç™¼çš„è¦å‰‡:" + +# describe.c:1636 +#: describe.c:3031 describe.c:5109 +msgid "Publications:" +msgstr "發布:" + +# describe.c:977 +#: describe.c:3079 +msgid "View definition:" +msgstr "檢視表定義:" + +# describe.c:1223 +#: describe.c:3242 +msgid "Triggers:" +msgstr "觸發器:" + +#: describe.c:3245 +msgid "Disabled user triggers:" +msgstr "åœç”¨çš„使用者觸發器:" + +#: describe.c:3248 +msgid "Disabled internal triggers:" +msgstr "åœç”¨çš„內部觸發器:" + +#: describe.c:3251 +msgid "Triggers firing always:" +msgstr "æ°¸é è§¸ç™¼çš„觸發器:" + +#: describe.c:3254 +msgid "Triggers firing on replica only:" +msgstr "åªåœ¨è¤‡æœ¬è§¸ç™¼çš„觸發器:" + +# postmaster/postmaster.c:2120 postmaster/postmaster.c:2130 +#: describe.c:3325 +#, c-format +msgid "Server: %s" +msgstr "伺æœå™¨: %s" + +#: describe.c:3333 +#, c-format +msgid "FDW options: (%s)" +msgstr "FDW é¸é …: (%s)" + +# describe.c:1245 +#: describe.c:3354 +msgid "Inherits" +msgstr "繼承" + +# utils/adt/array_userfuncs.c:358 utils/adt/arrayfuncs.c:1149 +# utils/adt/arrayfuncs.c:2417 +#: describe.c:3419 +#, c-format +msgid "Number of partitions: %d" +msgstr "分割數é‡: %d" + +#: describe.c:3428 +#, c-format +msgid "Number of partitions: %d (Use \\d+ to list them.)" +msgstr "分割數é‡: %d (用 \\d+ 列舉。)" + +#: describe.c:3430 +#, c-format +msgid "Number of child tables: %d (Use \\d+ to list them.)" +msgstr "å­è³‡æ–™è¡¨æ•¸é‡: %d (用 \\d+ 列舉。)" + +#: describe.c:3437 +msgid "Child tables" +msgstr "å­è³‡æ–™è¡¨" + +# describe.c:498 +#: describe.c:3437 +msgid "Partitions" +msgstr "分割" + +#: describe.c:3470 +#, c-format +msgid "Typed table of type: %s" +msgstr "" + +# describe.c:1636 +#: describe.c:3486 +msgid "Replica Identity" +msgstr "" + +# describe.c:1259 +#: describe.c:3499 +msgid "Has OIDs: yes" +msgstr "有 OID: yes" + +#: describe.c:3508 +#, c-format +msgid "Access method: %s" +msgstr "å­˜å–æ–¹å¼: %s" + +# describe.c:1342 +#: describe.c:3585 +#, c-format +msgid "Tablespace: \"%s\"" +msgstr "表空間: \"%s\"" + +# describe.c:1342 +#. translator: before this string there's an index description like +#. '"foo_pkey" PRIMARY KEY, btree (a)' +#: describe.c:3597 +#, c-format +msgid ", tablespace \"%s\"" +msgstr ", 表空間 \"%s\"" + +# describe.c:1431 +#: describe.c:3670 +msgid "List of roles" +msgstr "角色清單" + +# describe.c:1375 +#: describe.c:3672 describe.c:3841 +msgid "Role name" +msgstr "角色å稱" + +#: describe.c:3673 +msgid "Attributes" +msgstr "屬性" + +# describe.c:1377 +#: describe.c:3684 +msgid "Superuser" +msgstr "超級用戶" + +#: describe.c:3687 +msgid "No inheritance" +msgstr "無繼承" + +#: describe.c:3690 +msgid "Create role" +msgstr "建立角色" + +#: describe.c:3693 +msgid "Create DB" +msgstr "建立資料庫" + +#: describe.c:3696 +msgid "Cannot login" +msgstr "無法登入" + +# describe.c:1636 +#: describe.c:3699 +msgid "Replication" +msgstr "複寫" + +#: describe.c:3703 +msgid "Bypass RLS" +msgstr "忽略 RLS" + +# help.c:123 +#: describe.c:3712 +msgid "No connections" +msgstr "無連線" + +# help.c:123 +#: describe.c:3714 +#, c-format +msgid "%d connection" +msgid_plural "%d connections" +msgstr[0] "%d 連線" + +#: describe.c:3724 +msgid "Password valid until " +msgstr "密碼有效期至 " + +# describe.c:1375 +#: describe.c:3775 +msgid "Role" +msgstr "角色" + +# catalog/dependency.c:1758 +#: describe.c:3776 +msgid "Database" +msgstr "資料庫" + +#: describe.c:3777 +msgid "Settings" +msgstr "設定" + +# describe.c:641 +#: describe.c:3801 +#, c-format +msgid "Did not find any settings for role \"%s\" and database \"%s\"." +msgstr "找ä¸åˆ°è§’色 \"%s\" 和資料庫 \"%s\" 的設定。" + +# describe.c:641 +#: describe.c:3804 +#, c-format +msgid "Did not find any settings for role \"%s\"." +msgstr "找ä¸åˆ°è§’色 \"%s\" 的設定。" + +# describe.c:641 +#: describe.c:3807 +#, c-format +msgid "Did not find any settings." +msgstr "找ä¸åˆ°ä»»ä½•設定。" + +# describe.c:1549 +#: describe.c:3812 +msgid "List of settings" +msgstr "設定清單" + +#: describe.c:3842 +msgid "Member of" +msgstr "æˆå“¡å±¬æ–¼" + +#: describe.c:3859 +msgid "Grantor" +msgstr "" + +# describe.c:1431 +#: describe.c:3886 +msgid "List of role grants" +msgstr "" + +# describe.c:543 +# describe.c:1477 +#: describe.c:3952 +msgid "index" +msgstr "索引" + +# describe.c:879 +#: describe.c:3954 +msgid "TOAST table" +msgstr "TOAST 資料表" + +#: describe.c:3957 describe.c:4169 +msgid "partitioned index" +msgstr "分割索引" + +#: describe.c:3977 +msgid "permanent" +msgstr "永久" + +#: describe.c:3978 +msgid "temporary" +msgstr "暫時" + +#: describe.c:3979 +msgid "unlogged" +msgstr "無日誌" + +#: describe.c:3980 +msgid "Persistence" +msgstr "永續性" + +#: describe.c:3996 +msgid "Access method" +msgstr "å­˜å–æ–¹å¼" + +# describe.c:1549 +#: describe.c:4082 +msgid "List of relations" +msgstr "é—œè¯æ¸…å–®" + +# describe.c:117 +#: describe.c:4130 +#, c-format +msgid "The server (version %s) does not support declarative table partitioning." +msgstr "伺æœå™¨(版本%s)䏿”¯æ´è²æ˜Žå¼è³‡æ–™è¡¨åˆ†å‰²ã€‚" + +# describe.c:1549 +#: describe.c:4141 +msgid "List of partitioned indexes" +msgstr "分割索引清單" + +# describe.c:1653 +#: describe.c:4143 +msgid "List of partitioned tables" +msgstr "分割資料表清單" + +# describe.c:1549 +#: describe.c:4147 +msgid "List of partitioned relations" +msgstr "åˆ†å‰²é—œè¯æ¸…å–®" + +# describe.c:1375 +#: describe.c:4178 +msgid "Parent name" +msgstr "所屬å稱" + +#: describe.c:4191 +msgid "Leaf partition size" +msgstr "" + +#: describe.c:4194 describe.c:4200 +msgid "Total size" +msgstr "總大å°" + +#: describe.c:4325 +msgid "Trusted" +msgstr "信任的" + +# describe.c:257 +#: describe.c:4334 +msgid "Internal language" +msgstr "內部語言" + +#: describe.c:4335 +msgid "Call handler" +msgstr "" + +#: describe.c:4336 describe.c:5759 +msgid "Validator" +msgstr "驗證程å¼" + +#: describe.c:4337 +msgid "Inline handler" +msgstr "" + +# describe.c:1431 +#: describe.c:4372 +msgid "List of languages" +msgstr "語言清單" + +#: describe.c:4413 +msgid "Check" +msgstr "檢查" + +# describe.c:1602 +#: describe.c:4457 +msgid "List of domains" +msgstr "Domain 清單" + +# describe.c:1635 +#: describe.c:4491 +msgid "Source" +msgstr "來æº" + +# describe.c:1636 +#: describe.c:4492 +msgid "Destination" +msgstr "目的" + +# describe.c:1639 +#: describe.c:4494 describe.c:6723 +msgid "Default?" +msgstr "é è¨­ï¼Ÿ" + +# describe.c:1653 +#: describe.c:4536 +msgid "List of conversions" +msgstr "ç·¨ç¢¼è½‰æ›æ¸…å–®" + +#: describe.c:4564 +msgid "Parameter" +msgstr "åƒæ•¸" + +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: describe.c:4565 +msgid "Value" +msgstr "值" + +#: describe.c:4572 +msgid "Context" +msgstr "" + +# sql_help.h:366 +#: describe.c:4605 +msgid "List of configuration parameters" +msgstr "è¨­å®šåƒæ•¸æ¸…å–®" + +# utils/misc/guc.c:3281 utils/misc/guc.c:3970 utils/misc/guc.c:4006 +# utils/misc/guc.c:4062 utils/misc/guc.c:4399 utils/misc/guc.c:4548 +#: describe.c:4607 +msgid "List of non-default configuration parameters" +msgstr "éžé è¨­è¨­å®šåƒæ•¸æ¸…å–®" + +# describe.c:117 +#: describe.c:4634 +#, c-format +msgid "The server (version %s) does not support event triggers." +msgstr "伺æœå™¨(版本 %s)䏿”¯æ´äº‹ä»¶è§¸ç™¼å™¨ã€‚" + +#: describe.c:4654 +msgid "Event" +msgstr "事件" + +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: describe.c:4656 +msgid "enabled" +msgstr "" + +# describe.c:1636 +#: describe.c:4657 +msgid "replica" +msgstr "" + +#: describe.c:4658 +msgid "always" +msgstr "" + +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: describe.c:4659 +msgid "disabled" +msgstr "" + +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: describe.c:4660 describe.c:6575 +msgid "Enabled" +msgstr "" + +#: describe.c:4662 +msgid "Tags" +msgstr "標籤" + +# describe.c:1549 +#: describe.c:4686 +msgid "List of event triggers" +msgstr "事件觸發器清單" + +# describe.c:117 +#: describe.c:4713 +#, c-format +msgid "The server (version %s) does not support extended statistics." +msgstr "伺æœå™¨(版本 %s)䏿”¯æ´æ“´å±•統計資料。" + +#: describe.c:4750 +msgid "Ndistinct" +msgstr "" + +#: describe.c:4751 +msgid "Dependencies" +msgstr "" + +#: describe.c:4761 +msgid "MCV" +msgstr "" + +# describe.c:1549 +#: describe.c:4785 +msgid "List of extended statistics" +msgstr "擴展統計資料清單" + +# describe.c:1688 +#: describe.c:4812 +msgid "Source type" +msgstr "來æºé¡žåž‹" + +# describe.c:1689 +#: describe.c:4813 +msgid "Target type" +msgstr "目標類型" + +# describe.c:1693 +#: describe.c:4837 +msgid "in assignment" +msgstr "" + +# describe.c:1695 +#: describe.c:4839 +msgid "Implicit?" +msgstr "éš±å«çš„?" + +# describe.c:1703 +#: describe.c:4898 +msgid "List of casts" +msgstr "轉型清單" + +#: describe.c:4938 describe.c:4942 +msgid "Provider" +msgstr "æä¾›è€…" + +#: describe.c:4972 describe.c:4977 +msgid "Deterministic?" +msgstr "確定性?" + +# describe.c:1549 +#: describe.c:5017 +msgid "List of collations" +msgstr "å®šåºæ¸…å–®" + +# describe.c:1753 +#: describe.c:5079 +msgid "List of schemas" +msgstr "Schema 清單" + +# describe.c:150 +#: describe.c:5196 +msgid "List of text search parsers" +msgstr "文字æœå°‹è§£æžå™¨æ¸…å–®" + +# describe.c:641 +#: describe.c:5246 +#, c-format +msgid "Did not find any text search parser named \"%s\"." +msgstr "找ä¸åˆ°å為 \"%s\" 的文字æœå°‹è§£æžå™¨ã€‚" + +# describe.c:641 +#: describe.c:5249 +#, c-format +msgid "Did not find any text search parsers." +msgstr "找ä¸åˆ°ä»»ä½•文字æœå°‹è§£æžå™¨ã€‚" + +#: describe.c:5324 +msgid "Start parse" +msgstr "é–‹å§‹è§£æž" + +#: describe.c:5325 +msgid "Method" +msgstr "方法" + +#: describe.c:5329 +msgid "Get next token" +msgstr "å–得下一個 token" + +#: describe.c:5331 +msgid "End parse" +msgstr "çµæŸè§£æž" + +#: describe.c:5333 +msgid "Get headline" +msgstr "å–得標題" + +#: describe.c:5335 +msgid "Get token types" +msgstr "å–å¾— token 類型" + +#: describe.c:5346 +#, c-format +msgid "Text search parser \"%s.%s\"" +msgstr "文字æœå°‹è§£æžå™¨ \"%s.%s\"" + +#: describe.c:5349 +#, c-format +msgid "Text search parser \"%s\"" +msgstr "文字æœå°‹è§£æžå™¨ \"%s\"" + +# describe.c:1375 +#: describe.c:5368 +msgid "Token name" +msgstr "Token å稱" + +#: describe.c:5382 +#, c-format +msgid "Token types for parser \"%s.%s\"" +msgstr "è§£æžå™¨ \"%s.%s\" çš„ token 類型" + +#: describe.c:5385 +#, c-format +msgid "Token types for parser \"%s\"" +msgstr "è§£æžå™¨ \"%s\" çš„ token 類型" + +#: describe.c:5429 +msgid "Template" +msgstr "模版" + +# help.c:88 +#: describe.c:5430 +msgid "Init options" +msgstr "åˆå§‹é¸é …" + +# describe.c:1549 +#: describe.c:5457 +msgid "List of text search dictionaries" +msgstr "文字æœå°‹å­—典清單" + +#: describe.c:5490 +msgid "Init" +msgstr "åˆå§‹åŒ–" + +# describe.c:257 +#: describe.c:5491 +msgid "Lexize" +msgstr "" + +# describe.c:1753 +#: describe.c:5523 +msgid "List of text search templates" +msgstr "文字æœå°‹ç¯„本清單" + +# describe.c:97 +#: describe.c:5578 +msgid "List of text search configurations" +msgstr "文字æœå°‹çµ„態清單" + +# describe.c:641 +#: describe.c:5629 +#, c-format +msgid "Did not find any text search configuration named \"%s\"." +msgstr "找ä¸åˆ°å為 \"%s\" 的文字æœå°‹çµ„態。" + +# describe.c:641 +#: describe.c:5632 +#, c-format +msgid "Did not find any text search configurations." +msgstr "找ä¸åˆ°ä»»ä½•文字æœå°‹çµ„態。" + +#: describe.c:5698 +msgid "Token" +msgstr "Token" + +#: describe.c:5699 +msgid "Dictionaries" +msgstr "å­—å…¸" + +#: describe.c:5710 +#, c-format +msgid "Text search configuration \"%s.%s\"" +msgstr "文字æœå°‹çµ„æ…‹ \"%s.%s\"" + +#: describe.c:5713 +#, c-format +msgid "Text search configuration \"%s\"" +msgstr "文字æœå°‹çµ„æ…‹ \"%s\"" + +# describe.c:859 +#: describe.c:5717 +#, c-format +msgid "" +"\n" +"Parser: \"%s.%s\"" +msgstr "" +"\n" +"è§£æžå™¨: \"%s.%s\"" + +# describe.c:1342 +#: describe.c:5720 +#, c-format +msgid "" +"\n" +"Parser: \"%s\"" +msgstr "" +"\n" +"è§£æžå™¨: \"%s\"" + +# describe.c:289 +#: describe.c:5801 +msgid "List of foreign-data wrappers" +msgstr "外部資料å°è£ç¨‹å¼æ¸…å–®" + +#: describe.c:5829 +msgid "Foreign-data wrapper" +msgstr "外部資料å°è£ç¨‹å¼" + +#: describe.c:5847 describe.c:6037 +msgid "Version" +msgstr "版本" + +# describe.c:1653 +#: describe.c:5878 +msgid "List of foreign servers" +msgstr "外部伺æœå™¨æ¸…å–®" + +# describe.c:1377 +#: describe.c:5903 describe.c:5962 +msgid "Server" +msgstr "伺æœå™¨" + +#: describe.c:5904 +msgid "User name" +msgstr "使用者å稱" + +# describe.c:1602 +#: describe.c:5934 +msgid "List of user mappings" +msgstr "使用者映射清單" + +# describe.c:1653 +#: describe.c:6007 +msgid "List of foreign tables" +msgstr "外部資料表清單" + +# describe.c:1653 +#: describe.c:6059 +msgid "List of installed extensions" +msgstr "å·²å®‰è£æ“´å……模組清單" + +# describe.c:641 +#: describe.c:6107 +#, c-format +msgid "Did not find any extension named \"%s\"." +msgstr "找ä¸åˆ°å為 \"%s\" 的擴充模組。" + +# describe.c:641 +#: describe.c:6110 +#, c-format +msgid "Did not find any extensions." +msgstr "找ä¸åˆ°ä»»ä½•擴充模組。" + +# describe.c:593 +#: describe.c:6154 +msgid "Object description" +msgstr "物件æè¿°" + +#: describe.c:6164 +#, c-format +msgid "Objects in extension \"%s\"" +msgstr "擴充模組 \"%s\" 中的物件" + +# catalog/namespace.c:1201 gram.y:2516 gram.y:7422 parser/parse_expr.c:1183 +# parser/parse_target.c:734 +#: describe.c:6205 +#, c-format +msgid "improper qualified name (too many dotted names): %s" +msgstr "ä¸åˆé©çš„完整å稱(太多點號å稱): %s" + +# catalog/namespace.c:1195 parser/parse_expr.c:1157 parser/parse_target.c:725 +#: describe.c:6219 +#, c-format +msgid "cross-database references are not implemented: %s" +msgstr "尚未實作跨資料庫åƒè€ƒ: %s" + +# describe.c:117 +#: describe.c:6250 describe.c:6377 +#, c-format +msgid "The server (version %s) does not support publications." +msgstr "伺æœå™¨(版本 %s)䏿”¯æ´ç™¼å¸ƒã€‚" + +#: describe.c:6267 describe.c:6455 +msgid "All tables" +msgstr "所有資料表" + +#: describe.c:6268 describe.c:6456 +msgid "Inserts" +msgstr "æ’å…¥" + +#: describe.c:6269 describe.c:6457 +msgid "Updates" +msgstr "æ›´æ–°" + +#: describe.c:6270 describe.c:6458 +msgid "Deletes" +msgstr "刪除" + +#: describe.c:6274 describe.c:6460 +msgid "Truncates" +msgstr "清除" + +#: describe.c:6278 describe.c:6462 +msgid "Via root" +msgstr "ç¶“ç”± root" + +# describe.c:1549 +#: describe.c:6300 +msgid "List of publications" +msgstr "發布清單" + +# describe.c:641 +#: describe.c:6424 +#, c-format +msgid "Did not find any publication named \"%s\"." +msgstr "找ä¸åˆ°å為 \"%s\" 的發布。" + +# describe.c:641 +#: describe.c:6427 +#, c-format +msgid "Did not find any publications." +msgstr "找ä¸åˆ°ä»»ä½•發布。" + +# catalog/dependency.c:1791 +#: describe.c:6451 +#, c-format +msgid "Publication %s" +msgstr "發布 %s" + +# describe.c:1483 +#: describe.c:6504 +msgid "Tables:" +msgstr "資料表:" + +# describe.c:1753 +#: describe.c:6516 +msgid "Tables from schemas:" +msgstr "" + +# describe.c:117 +#: describe.c:6560 +#, c-format +msgid "The server (version %s) does not support subscriptions." +msgstr "伺æœå™¨(版本 %s)䏿”¯æ´ä½¿ç”¨è€…映射。" + +# describe.c:1636 +#: describe.c:6576 +msgid "Publication" +msgstr "發布" + +#: describe.c:6585 +msgid "Binary" +msgstr "" + +#: describe.c:6594 describe.c:6598 +msgid "Streaming" +msgstr "串æµ" + +#: describe.c:6606 +msgid "Two-phase commit" +msgstr "兩階段æäº¤" + +#: describe.c:6607 +msgid "Disable on error" +msgstr "錯誤時åœç”¨" + +#: describe.c:6614 +msgid "Origin" +msgstr "" + +# command.c:915 +# command.c:939 +# startup.c:187 +# startup.c:205 +#: describe.c:6615 +msgid "Password required" +msgstr "需è¦å¯†ç¢¼" + +#: describe.c:6616 +msgid "Run as owner?" +msgstr "ä»¥æ“æœ‰è€…身分執行?" + +#: describe.c:6621 +msgid "Synchronous commit" +msgstr "åŒæ­¥æäº¤" + +# help.c:123 +#: describe.c:6622 +msgid "Conninfo" +msgstr "" + +#: describe.c:6628 +msgid "Skip LSN" +msgstr "ç•¥éŽ LSN" + +# describe.c:221 +#: describe.c:6655 +msgid "List of subscriptions" +msgstr "訂閱清單" + +#: describe.c:6717 describe.c:6813 describe.c:6906 describe.c:7001 +msgid "AM" +msgstr "" + +# describe.c:322 +#: describe.c:6718 +msgid "Input type" +msgstr "輸入類型" + +# describe.c:1635 +#: describe.c:6719 +msgid "Storage type" +msgstr "儲存類型" + +# catalog/dependency.c:1592 +#: describe.c:6720 +msgid "Operator class" +msgstr "æ“作符類別" + +# sql_help.h:269 +#: describe.c:6732 describe.c:6814 describe.c:6907 describe.c:7002 +msgid "Operator family" +msgstr "æ“作符æ—群" + +# describe.c:336 +#: describe.c:6768 +msgid "List of operator classes" +msgstr "æ“作符類別清單" + +#: describe.c:6815 +msgid "Applicable types" +msgstr "é©ç”¨é¡žåž‹" + +# describe.c:336 +#: describe.c:6857 +msgid "List of operator families" +msgstr "æ“作符æ—群清單" + +# describe.c:512 +#: describe.c:6908 +msgid "Operator" +msgstr "æ“作符" + +#: describe.c:6909 +msgid "Strategy" +msgstr "ç­–ç•¥" + +#: describe.c:6910 +msgid "ordering" +msgstr "排åº" + +#: describe.c:6911 +msgid "search" +msgstr "æœå°‹" + +#: describe.c:6912 +msgid "Purpose" +msgstr "用途" + +#: describe.c:6917 +msgid "Sort opfamily" +msgstr "æŽ’åº opfamily" + +# catalog/aclchk.c:1294 +#: describe.c:6956 +msgid "List of operators of operator families" +msgstr "æ“作符æ—群æ“作符清單" + +# describe.c:322 +#: describe.c:7003 +msgid "Registered left type" +msgstr "已註冊左å´åž‹åˆ¥" + +# describe.c:321 +#: describe.c:7004 +msgid "Registered right type" +msgstr "已註冊å³å´åž‹åˆ¥" + +#: describe.c:7005 +msgid "Number" +msgstr "編號" + +# catalog/aclchk.c:1294 +#: describe.c:7049 +msgid "List of support functions of operator families" +msgstr "æ“作符æ—群支æ´å‡½æ•¸æ¸…å–®" + +#: describe.c:7080 +msgid "ID" +msgstr "ID" + +# large_obj.c:264 +#: describe.c:7101 +msgid "Large objects" +msgstr "大物件" + +# help.c:83 +#: help.c:75 +msgid "" +"psql is the PostgreSQL interactive terminal.\n" +"\n" +msgstr "" +"psql 是 PostgreSQL äº’å‹•å¼æ“作介é¢ã€‚\n" +"\n" + +#: help.c:76 help.c:395 help.c:479 help.c:522 +msgid "Usage:\n" +msgstr "用法:\n" + +# help.c:86 +#: help.c:77 +msgid "" +" psql [OPTION]... [DBNAME [USERNAME]]\n" +"\n" +msgstr "" +" psql [OPTION]... [DBNAME [USERNAME]]\n" +"\n" + +#: help.c:79 +msgid "General options:\n" +msgstr "一般é¸é …:\n" + +# help.c:94 +#: help.c:84 +msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" +msgstr " -c, --command=COMMAND 執行單一命令(SQL 或內部命令)å¾ŒçµæŸ\n" + +# help.c:93 +#: help.c:85 +#, c-format +msgid " -d, --dbname=DBNAME database name to connect to (default: \"%s\")\n" +msgstr " -d, --dbname=DBNAME 指定連線資料庫å稱(é è¨­: \"%s\")\n" + +# help.c:95 +#: help.c:87 +msgid " -f, --file=FILENAME execute commands from file, then exit\n" +msgstr " -f, --file=FILENAME åŸ·è¡Œä¾†è‡ªæª”æ¡ˆçš„æŒ‡ä»¤ç„¶å¾ŒçµæŸ\n" + +# help.c:96 +#: help.c:88 +msgid " -l, --list list available databases, then exit\n" +msgstr " -l, --list 列出å¯ç”¨çš„è³‡æ–™åº«ç„¶å¾ŒçµæŸ\n" + +# help.c:97 +#: help.c:89 +msgid "" +" -v, --set=, --variable=NAME=VALUE\n" +" set psql variable NAME to VALUE\n" +" (e.g., -v ON_ERROR_STOP=1)\n" +msgstr "" +" -v, --set=, --variable=NAME=VALUE\n" +" 設定 psql 變數 NAME 為 VALUE\n" +" (例如 -v ON_ERROR_STOP=1)\n" + +#: help.c:92 +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version é¡¯ç¤ºç‰ˆæœ¬ï¼Œç„¶å¾ŒçµæŸ\n" + +# help.c:98 +#: help.c:93 +msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" +msgstr " -X, --no-psqlrc ä¸è¦è®€å–啟動檔(~/.psqlrc)\n" + +#: help.c:94 +msgid "" +" -1 (\"one\"), --single-transaction\n" +" execute as a single transaction (if non-interactive)\n" +msgstr "" +" -1 (\"one\"), --single-transaction\n" +" 以單一交易執行(若為éžäº’動模å¼)\n" + +#: help.c:96 +msgid " -?, --help[=options] show this help, then exit\n" +msgstr " -?, --help[=options] é¡¯ç¤ºèªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" + +#: help.c:97 +msgid " --help=commands list backslash commands, then exit\n" +msgstr " --help=commands åˆ—å‡ºåæ–œç·šå‘½ä»¤ç„¶å¾ŒçµæŸ\n" + +# help.c:96 +#: help.c:98 +msgid " --help=variables list special variables, then exit\n" +msgstr " --help=variables åˆ—å‡ºç‰¹æ®Šè®Šæ•¸ç„¶å¾ŒçµæŸ\n" + +# help.c:102 +#: help.c:100 +msgid "" +"\n" +"Input and output options:\n" +msgstr "" +"\n" +"輸入和輸出é¸é …:\n" + +# help.c:103 +#: help.c:101 +msgid " -a, --echo-all echo all input from script\n" +msgstr " -a, --echo-all 顯示來自腳本的所有輸入\n" + +# help.c:104 +#: help.c:102 +msgid " -b, --echo-errors echo failed commands\n" +msgstr " -b, --echo-errors 顯示失敗的命令\n" + +# help.c:104 +#: help.c:103 +msgid " -e, --echo-queries echo commands sent to server\n" +msgstr " -e, --echo-queries 顯示傳é€è‡³ä¼ºæœå™¨çš„命令\n" + +# help.c:105 +#: help.c:104 +msgid " -E, --echo-hidden display queries that internal commands generate\n" +msgstr " -E, --echo-hidden 顯示內部命令產生的查詢\n" + +# help.c:107 +#: help.c:105 +msgid " -L, --log-file=FILENAME send session log to file\n" +msgstr " -L, --log-file=FILENAME 將工作階段記錄存檔\n" + +# help.c:108 +#: help.c:106 +msgid " -n, --no-readline disable enhanced command line editing (readline)\n" +msgstr " -n, --no-readline åœç”¨å‘½ä»¤åˆ—編輯(readline)\n" + +# help.c:107 +#: help.c:107 +msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" +msgstr " -o, --output=FILENAME å°‡æŸ¥è©¢çµæžœå‚³é€è‡³æª”案(或 | 管é“)\n" + +# help.c:106 +#: help.c:108 +msgid " -q, --quiet run quietly (no messages, only query output)\n" +msgstr " -q, --quiet éœé»˜åŸ·è¡Œ(無訊æ¯ï¼Œåƒ…查詢輸出)\n" + +# help.c:109 +#: help.c:109 +msgid " -s, --single-step single-step mode (confirm each query)\n" +msgstr " -s, --single-step 單步模å¼(ç¢ºèªæ¯å€‹æŸ¥è©¢)\n" + +# help.c:110 +#: help.c:110 +msgid " -S, --single-line single-line mode (end of line terminates SQL command)\n" +msgstr " -S, --single-line 單行模å¼(一行就是一個 SQL 命令)\n" + +# help.c:112 +#: help.c:112 +msgid "" +"\n" +"Output format options:\n" +msgstr "" +"\n" +"輸出格å¼é¸é …:\n" + +# help.c:113 +#: help.c:113 +msgid " -A, --no-align unaligned table output mode\n" +msgstr " -A, --no-align 使用éžå°é½Šè³‡æ–™è¡¨è¼¸å‡ºæ¨¡å¼\n" + +# help.c:234 +#: help.c:114 +msgid " --csv CSV (Comma-Separated Values) table output mode\n" +msgstr " --csv CSV(逗號分隔值)表格輸出模å¼\n" + +# help.c:119 +#: help.c:115 +#, c-format +msgid "" +" -F, --field-separator=STRING\n" +" field separator for unaligned output (default: \"%s\")\n" +msgstr "" +" -F, --field-separator=STRING\n" +" éžå°é½Šè¼¸å‡ºçš„æ¬„ä½åˆ†éš”符號(é è¨­: %s)\n" + +# help.c:114 +#: help.c:118 +msgid " -H, --html HTML table output mode\n" +msgstr " -H, --html HTML 表格輸出模å¼\n" + +# help.c:118 +#: help.c:119 +msgid " -P, --pset=VAR[=ARG] set printing option VAR to ARG (see \\pset command)\n" +msgstr " -P, --pset=VAR[=ARG] 將顯示é¸é … VAR 設為 ARG(åƒé–± \\pset 命令)\n" + +# help.c:121 +#: help.c:120 +msgid "" +" -R, --record-separator=STRING\n" +" record separator for unaligned output (default: newline)\n" +msgstr "" +" -R, --record-separator=STRING\n" +" éžå°é½Šè¼¸å‡ºçš„記錄分隔符號(é è¨­: æ›è¡Œå­—å…ƒ)\n" + +# help.c:115 +#: help.c:122 +msgid " -t, --tuples-only print rows only\n" +msgstr " -t, --tuples-only åªé¡¯ç¤ºè³‡æ–™\n" + +# help.c:116 +#: help.c:123 +msgid " -T, --table-attr=TEXT set HTML table tag attributes (e.g., width, border)\n" +msgstr " -T, --table-attr=TEXT 設定 HTML 表格標籤屬性 (例如: widthã€border)\n" + +# help.c:117 +#: help.c:124 +msgid " -x, --expanded turn on expanded table output\n" +msgstr " -x, --expanded 啟動擴展表格輸出模å¼\n" + +# help.c:119 +#: help.c:125 +msgid "" +" -z, --field-separator-zero\n" +" set field separator for unaligned output to zero byte\n" +msgstr "" +" -z, --field-separator-zero\n" +" å°‡éžå°é½Šè¼¸å‡ºçš„æ¬„ä½åˆ†éš”符設定為 0 ä½å…ƒçµ„\n" + +# help.c:121 +#: help.c:127 +msgid "" +" -0, --record-separator-zero\n" +" set record separator for unaligned output to zero byte\n" +msgstr "" +" -0, --record-separator-zero\n" +" å°‡éžå°é½Šè¼¸å‡ºçš„記錄分隔符設定為 0 ä½å…ƒçµ„\n" + +#: help.c:130 +msgid "" +"\n" +"Connection options:\n" +msgstr "" +"\n" +"連線é¸é …:\n" + +# help.c:126 +#: help.c:133 +#, c-format +msgid " -h, --host=HOSTNAME database server host or socket directory (default: \"%s\")\n" +msgstr " -h, --host=HOSTNAME 資料庫伺æœå™¨ä¸»æ©Ÿæˆ– socket 目錄(é è¨­:\"%s\")\n" + +# help.c:127 +#: help.c:134 +msgid "local socket" +msgstr "本機 socket" + +# help.c:130 +#: help.c:137 +#, c-format +msgid " -p, --port=PORT database server port (default: \"%s\")\n" +msgstr " -p, --port=PORT 資料庫伺æœå™¨é€£æŽ¥åŸ (é è¨­: \"%s\")\n" + +# help.c:136 +#: help.c:140 +#, c-format +msgid " -U, --username=USERNAME database user name (default: \"%s\")\n" +msgstr " -U, --username=USERNAME 資料庫使用者(é è¨­: \"%s\")\n" + +#: help.c:142 +msgid " -w, --no-password never prompt for password\n" +msgstr " -w, --no-password ä¸è©¢å•密碼\n" + +#: help.c:143 +msgid " -W, --password force password prompt (should happen automatically)\n" +msgstr " -W, --password è¦æ±‚輸入密碼(應該是自動的)\n" + +# help.c:140 +#: help.c:145 +msgid "" +"\n" +"For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" +"commands) from within psql, or consult the psql section in the PostgreSQL\n" +"documentation.\n" +"\n" +msgstr "" +"\n" +"若需更多資訊,請在 psql 輸入 \"\\?\"(內部命令)或 \"\\help\"(SQL 命令)\n" +"或查閱 PostgreSQL 文件中的 psql 章節。\n" +"\n" + +#: help.c:148 +#, c-format +msgid "Report bugs to <%s>.\n" +msgstr "回報錯誤至 <%s>。\n" + +#: help.c:149 +#, c-format +msgid "%s home page: <%s>\n" +msgstr "%s ç¶²é : <%s>\n" + +# help.c:174 +#: help.c:191 +msgid "General\n" +msgstr "一般\n" + +# help.c:228 +#: help.c:192 +msgid " \\bind [PARAM]... set query parameters\n" +msgstr " \\bind [PARAM]... è¨­å®šæŸ¥è©¢åƒæ•¸\n" + +# help.c:179 +#: help.c:193 +msgid " \\copyright show PostgreSQL usage and distribution terms\n" +msgstr " \\copyright 顯示 PostgreSQL çš„ä½¿ç”¨å’Œç™¼ä½ˆæ¢æ¬¾\n" + +#: help.c:194 +msgid " \\crosstabview [COLUMNS] execute query and display result in crosstab\n" +msgstr " \\crosstabview [COLUMNS] 執行查詢並以樞ç´åˆ†æžè¡¨é¡¯ç¤ºçµæžœ\n" + +#: help.c:195 +msgid " \\errverbose show most recent error message at maximum verbosity\n" +msgstr " \\errverbose 以最大詳細程度顯示最近的錯誤訊æ¯\n" + +#: help.c:196 +msgid "" +" \\g [(OPTIONS)] [FILE] execute query (and send result to file or |pipe);\n" +" \\g with no arguments is equivalent to a semicolon\n" +msgstr "" +" \\g [(OPTIONS)] [FILE] 執行查詢(ä¸¦å°‡çµæžœç™¼é€åˆ°æª”案或 | 管é“)ï¼›\n" +" \\g è‹¥ç„¡åƒæ•¸ç­‰åŒæ–¼åˆ†è™Ÿ\n" + +#: help.c:198 +msgid " \\gdesc describe result of query, without executing it\n" +msgstr " \\gdesc æè¿°æŸ¥è©¢çš„çµæžœï¼Œä½†ä¸åŸ·è¡Œè©²æŸ¥è©¢\n" + +#: help.c:199 +msgid " \\gexec execute query, then execute each value in its result\n" +msgstr " \\gexec åŸ·è¡ŒæŸ¥è©¢ï¼Œç„¶å¾ŒåŸ·è¡Œçµæžœä¸­çš„æ¯å€‹å€¼\n" + +# help.c:194 +#: help.c:200 +msgid " \\gset [PREFIX] execute query and store result in psql variables\n" +msgstr " \\gset [PREFIX] åŸ·è¡ŒæŸ¥è©¢ä¸¦å°‡çµæžœå­˜å„²åœ¨ psql 變數中\n" + +#: help.c:201 +msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" +msgstr " \\gx [(OPTIONS)] [FILE] 與 \\g 相åŒï¼Œä½†å¼·åˆ¶ä½¿ç”¨æ“´å±•輸出模å¼\n" + +# help.c:183 +#: help.c:202 +msgid " \\q quit psql\n" +msgstr " \\q çµæŸ psql\n" + +#: help.c:203 +msgid " \\watch [[i=]SEC] [c=N] execute query every SEC seconds, up to N times\n" +msgstr " \\watch [[i=]SEC] [c=N] æ¯éš” SEC 秒執行查詢,最多執行 N 次\n" + +#: help.c:204 help.c:212 help.c:224 help.c:234 help.c:241 help.c:298 help.c:306 +#: help.c:326 help.c:339 help.c:348 +msgid "\n" +msgstr "" + +#: help.c:206 +msgid "Help\n" +msgstr "說明\n" + +#: help.c:208 +msgid " \\? [commands] show help on backslash commands\n" +msgstr " \\? [commands] é¡¯ç¤ºåæ–œç·šå‘½ä»¤çš„說明\n" + +#: help.c:209 +msgid " \\? options show help on psql command-line options\n" +msgstr " \\? options 顯示 psql 命令列é¸é …的說明\n" + +#: help.c:210 +msgid " \\? variables show help on special variables\n" +msgstr " \\? variables 顯示特殊變數的說明\n" + +# help.c:182 +#: help.c:211 +msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" +msgstr " \\h [NAME] 顯示 SQL 命令語法的說明,用 * 代表所有命令\n" + +# help.c:192 +#: help.c:214 +msgid "Query Buffer\n" +msgstr "查詢暫存å€\n" + +# help.c:193 +#: help.c:215 +msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" +msgstr " \\e [FILE] [LINE] 使用外部編輯器編輯查詢暫存å€(或檔案)\n" + +# help.c:193 +#: help.c:216 +msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" +msgstr " \\ef [FUNCNAME [LINE]] 使用外部編輯器編輯函數定義\n" + +# help.c:193 +#: help.c:217 +msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" +msgstr " \\ev [VIEWNAME [LINE]] 使用外部編輯器編輯檢視表定義\n" + +# help.c:195 +#: help.c:218 +msgid " \\p show the contents of the query buffer\n" +msgstr " \\p 顯示查詢暫存å€çš„內容\n" + +# help.c:196 +#: help.c:219 +msgid " \\r reset (clear) the query buffer\n" +msgstr " \\r é‡è¨­(清空)查詢暫存å€\n" + +# help.c:198 +#: help.c:221 +msgid " \\s [FILE] display history or save it to file\n" +msgstr " \\s [FILE] 顯示歷å²è¨˜éŒ„或存入檔案\n" + +# help.c:200 +#: help.c:223 +msgid " \\w FILE write query buffer to file\n" +msgstr " \\w FILE 將查詢暫存å€å¯«å…¥æª”案\n" + +# help.c:203 +#: help.c:226 +msgid "Input/Output\n" +msgstr "輸入/輸出\n" + +# help.c:251 +#: help.c:227 +msgid " \\copy ... perform SQL COPY with data stream to the client host\n" +msgstr " \\copy ... 用 SQL çš„ COPY 並將資料æµå‚³é€è‡³ç”¨æˆ¶ç«¯\n" + +# help.c:204 +#: help.c:228 +msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" +msgstr " \\echo [-n] [STRING] 將字串寫入標準輸出(-n è¡¨ç¤ºä¸æ›è¡Œ)\n" + +# help.c:205 +#: help.c:229 +msgid " \\i FILE execute commands from file\n" +msgstr " \\i FILE 執行來自檔案的命令\n" + +# help.c:206 +#: help.c:230 +msgid " \\ir FILE as \\i, but relative to location of current script\n" +msgstr " \\ir FILE 與 \\i é¡žä¼¼ï¼Œä½†ç›¸å°æ–¼ç›®å‰è…³æœ¬çš„ä½ç½®\n" + +# help.c:206 +#: help.c:231 +msgid " \\o [FILE] send all query results to file or |pipe\n" +msgstr " \\o [FILE] å°‡æ‰€æœ‰æŸ¥è©¢çµæžœå‚³é€è‡³æª”案或 | 管é“\n" + +# help.c:207 +#: help.c:232 +msgid " \\qecho [-n] [STRING] write string to \\o output stream (-n for no newline)\n" +msgstr " \\qecho [-n] [STRING] 將字串寫入 \\o 輸出æµ(-n è¡¨ç¤ºä¸æ›è¡Œ)\n" + +# help.c:204 +#: help.c:233 +msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" +msgstr " \\warn [-n] [STRING] 將字串寫入標準錯誤輸出(-n è¡¨ç¤ºä¸æ›è¡Œ)\n" + +# help.c:123 +#: help.c:236 +msgid "Conditional\n" +msgstr "æ¢ä»¶å¼\n" + +# help.c:205 +#: help.c:237 +msgid " \\if EXPR begin conditional block\n" +msgstr " \\if EXPR é–‹å§‹æ¢ä»¶å€å¡Š\n" + +#: help.c:238 +msgid " \\elif EXPR alternative within current conditional block\n" +msgstr " \\elif EXPR ç¾æœ‰æ¢ä»¶å€å¡Šä¸­çš„æ›¿ä»£é¸é …\n" + +#: help.c:239 +msgid " \\else final alternative within current conditional block\n" +msgstr " \\else ç¾æœ‰æ¢ä»¶å€å¡Šä¸­çš„æœ€çµ‚替代é¸é …\n" + +# help.c:183 +#: help.c:240 +msgid " \\endif end conditional block\n" +msgstr " \\endif çµæŸæ¢ä»¶å€å¡Š\n" + +# help.c:211 +#: help.c:243 +msgid "Informational\n" +msgstr "資訊性\n" + +#: help.c:244 +msgid " (options: S = show system objects, + = additional detail)\n" +msgstr " (é¸é …: S = 顯示系統物件,+ = é¡å¤–資訊)\n" + +# help.c:226 +#: help.c:245 +msgid " \\d[S+] list tables, views, and sequences\n" +msgstr " \\d[S+] åˆ—å‡ºè³‡æ–™è¡¨ã€æª¢è¦–表ã€åºåˆ—\n" + +# help.c:212 +#: help.c:246 +msgid " \\d[S+] NAME describe table, view, sequence, or index\n" +msgstr " \\d[S+] NAME æè¿°è³‡æ–™è¡¨ã€æª¢è¦–表ã€åºåˆ—ã€ç´¢å¼•\n" + +# help.c:215 +#: help.c:247 +msgid " \\da[S] [PATTERN] list aggregates\n" +msgstr " \\da[S] [PATTERN] 列出èšåˆå‡½æ•¸\n" + +# help.c:228 +#: help.c:248 +msgid " \\dA[+] [PATTERN] list access methods\n" +msgstr " \\dA[+] [PATTERN] åˆ—å‡ºå­˜å–æ–¹å¼\n" + +# help.c:224 +#: help.c:249 +msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" +msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] 列出é‹ç®—符類別\n" + +# help.c:224 +#: help.c:250 +msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" +msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] 列出é‹ç®—符æ—群\n" + +# help.c:224 +#: help.c:251 +msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" +msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] 列出é‹ç®—符æ—群的é‹ç®—符\n" + +#: help.c:252 +msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] 列出é‹ç®—符æ—群的支æ´å‡½æ•¸\n" + +# help.c:228 +#: help.c:253 +msgid " \\db[+] [PATTERN] list tablespaces\n" +msgstr " \\db[+] [PATTERN] 列出表空間\n" + +# help.c:217 +#: help.c:254 +msgid " \\dc[S+] [PATTERN] list conversions\n" +msgstr " \\dc[S+] [PATTERN] 列出編碼轉æ›\n" + +# help.c:221 +#: help.c:255 +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [PATTERN] åˆ—å‡ºçµ„æ…‹åƒæ•¸\n" + +# help.c:218 +#: help.c:256 +msgid " \\dC[+] [PATTERN] list casts\n" +msgstr " \\dC[+] [PATTERN] 列出轉型\n" + +# help.c:219 +#: help.c:257 +msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" +msgstr " \\dd[S] [PATTERN] 顯示其他地方未顯示的物件æè¿°\n" + +# help.c:220 +#: help.c:258 +msgid " \\dD[S+] [PATTERN] list domains\n" +msgstr " \\dD[S+] [PATTERN] 列出 domain\n" + +# help.c:218 +#: help.c:259 +msgid " \\ddp [PATTERN] list default privileges\n" +msgstr " \\ddp [PATTERN] 列出é è¨­æ¬Šé™\n" + +# help.c:228 +#: help.c:260 +msgid " \\dE[S+] [PATTERN] list foreign tables\n" +msgstr " \\dE[S+] [PATTERN] 列出外部資料表\n" + +# help.c:228 +#: help.c:261 +msgid " \\des[+] [PATTERN] list foreign servers\n" +msgstr " \\des[+] [PATTERN] 列出外部伺æœå™¨\n" + +# help.c:228 +#: help.c:262 +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [PATTERN] 列出外部資料表\n" + +# help.c:228 +#: help.c:263 +msgid " \\deu[+] [PATTERN] list user mappings\n" +msgstr " \\deu[+] [PATTERN] 列出使用者映射\n" + +# help.c:222 +#: help.c:264 +msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" +msgstr " \\dew[+] [PATTERN] 列出外部資料å°è£ç¨‹å¼\n" + +# help.c:215 +#: help.c:265 +msgid "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" list [only agg/normal/procedure/trigger/window] functions\n" +msgstr "" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" +" 列出[僅èšåˆå‡½æ•¸/一般函數/程åº/觸發器/視窗]函数\n" + +# help.c:221 +#: help.c:267 +msgid " \\dF[+] [PATTERN] list text search configurations\n" +msgstr " \\dF[+] [PATTERN] 列出文字æœå°‹çµ„æ…‹\n" + +# help.c:228 +#: help.c:268 +msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" +msgstr " \\dFd[+] [PATTERN] 列出文字æœå°‹å­—å…¸\n" + +# help.c:228 +#: help.c:269 +msgid " \\dFp[+] [PATTERN] list text search parsers\n" +msgstr " \\dFp[+] [PATTERN] 列出文字æœå°‹è§£æžå™¨\n" + +# help.c:228 +#: help.c:270 +msgid " \\dFt[+] [PATTERN] list text search templates\n" +msgstr " \\dFt[+] [PATTERN] 列出文字æœå°‹ç¯„本\n" + +# help.c:222 +#: help.c:271 +msgid " \\dg[S+] [PATTERN] list roles\n" +msgstr " \\dg[S+] [PATTERN] 列出角色\n" + +# help.c:220 +#: help.c:272 +msgid " \\di[S+] [PATTERN] list indexes\n" +msgstr " \\di[S+] [PATTERN] 列出索引\n" + +# help.c:225 +#: help.c:273 +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] åˆ—å‡ºå¤§ç‰©ä»¶ï¼ŒåŒ \\lo_list\n" + +# help.c:228 +#: help.c:274 +msgid " \\dL[S+] [PATTERN] list procedural languages\n" +msgstr " \\dL[S+] [PATTERN] 列出程åºèªžè¨€\n" + +# help.c:228 +#: help.c:275 +msgid " \\dm[S+] [PATTERN] list materialized views\n" +msgstr " \\dm[S+] [PATTERN] 列出實體化檢視表\n" + +# help.c:228 +#: help.c:276 +msgid " \\dn[S+] [PATTERN] list schemas\n" +msgstr " \\dn[S+] [PATTERN] 列出 schema\n" + +# help.c:224 +#: help.c:277 +msgid "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" list operators\n" +msgstr "" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" 列出é‹ç®—符\n" + +# help.c:220 +#: help.c:279 +msgid " \\dO[S+] [PATTERN] list collations\n" +msgstr " \\dO[S+] [PATTERN] 列出定åº\n" + +# help.c:226 +#: help.c:280 +msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n" +msgstr " \\dp[S] [PATTERN] åˆ—å‡ºè³‡æ–™è¡¨ã€æª¢è¦–表ã€åºåˆ—çš„å­˜å–æ¬Šé™\n" + +# help.c:228 +#: help.c:281 +msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" +msgstr " \\dP[itn+] [PATTERN] 列出[僅索引/資料表]的分割關è¯[n=巢狀]\n" + +#: help.c:282 +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgstr " \\drds [ROLEPTRN [DBPTRN]] 列出æ¯å€‹è³‡æ–™åº«çš„角色設定\n" + +# help.c:222 +#: help.c:283 +msgid " \\drg[S] [PATTERN] list role grants\n" +msgstr " \\drg[S] [PATTERN] 列出角色授權\n" + +# help.c:220 +#: help.c:284 +msgid " \\dRp[+] [PATTERN] list replication publications\n" +msgstr " \\dRp[+] [PATTERN] 列出複寫發布\n" + +# help.c:217 +#: help.c:285 +msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" +msgstr " \\dRs[+] [PATTERN] 列出複寫訂閱\n" + +# help.c:228 +#: help.c:286 +msgid " \\ds[S+] [PATTERN] list sequences\n" +msgstr " \\ds[S+] [PATTERN] 列出åºåˆ—\n" + +# help.c:228 +#: help.c:287 +msgid " \\dt[S+] [PATTERN] list tables\n" +msgstr " \\dt[S+] [PATTERN] 列出資料表\n" + +# help.c:220 +#: help.c:288 +msgid " \\dT[S+] [PATTERN] list data types\n" +msgstr " \\dT[S+] [PATTERN] 列出資料型別\n" + +# help.c:228 +#: help.c:289 +msgid " \\du[S+] [PATTERN] list roles\n" +msgstr " \\du[S+] [PATTERN] 列出角色\n" + +# help.c:228 +#: help.c:290 +msgid " \\dv[S+] [PATTERN] list views\n" +msgstr " \\dv[S+] [PATTERN] 列出檢視表\n" + +# help.c:217 +#: help.c:291 +msgid " \\dx[+] [PATTERN] list extensions\n" +msgstr " \\dx[+] [PATTERN] 列出擴充模組\n" + +# help.c:218 +#: help.c:292 +msgid " \\dX [PATTERN] list extended statistics\n" +msgstr " \\dX [PATTERN] 列出擴展統計資料\n" + +# help.c:222 +#: help.c:293 +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [PATTERN] 列出事件觸發器\n" + +# help.c:228 +#: help.c:294 +msgid " \\l[+] [PATTERN] list databases\n" +msgstr " \\l[+] [PATTERN] 列出資料庫\n" + +# help.c:193 +#: help.c:295 +msgid " \\sf[+] FUNCNAME show a function's definition\n" +msgstr " \\sf[+] FUNCNAME 顯示函數的定義\n" + +# help.c:193 +#: help.c:296 +msgid " \\sv[+] VIEWNAME show a view's definition\n" +msgstr " \\sv[+] VIEWNAME 顯示檢視表的定義\n" + +# help.c:218 +#: help.c:297 +msgid " \\z[S] [PATTERN] same as \\dp\n" +msgstr " \\z[S] [PATTERN] åŒ \\dp\n" + +# large_obj.c:264 +#: help.c:300 +msgid "Large Objects\n" +msgstr "大物件\n" + +#: help.c:301 +msgid " \\lo_export LOBOID FILE write large object to file\n" +msgstr " \\lo_export LOBOID FILE 將大物件寫入檔案\n" + +# help.c:205 +#: help.c:302 +msgid "" +" \\lo_import FILE [COMMENT]\n" +" read large object from file\n" +msgstr "" +" \\lo_import FILE [COMMENT]\n" +" 從檔案讀å–大物件\n" + +#: help.c:304 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] 列出大物件\n" + +#: help.c:305 +msgid " \\lo_unlink LOBOID delete a large object\n" +msgstr " \\lo_unlink LOBOID 刪除大物件\n" + +# help.c:233 +#: help.c:308 +msgid "Formatting\n" +msgstr "æ ¼å¼åŒ–\n" + +# help.c:234 +#: help.c:309 +msgid " \\a toggle between unaligned and aligned output mode\n" +msgstr " \\a 切æ›å°é½Šå’Œéžå°é½Šçš„輸出模å¼\n" + +# help.c:235 +#: help.c:310 +msgid " \\C [STRING] set table title, or unset if none\n" +msgstr " \\C [STRING] è¨­å®šè¡¨æ ¼æ¨™é¡Œï¼Œè‹¥ç„¡å‰‡å–æ¶ˆè¨­å®š\n" + +# help.c:236 +#: help.c:311 +msgid " \\f [STRING] show or set field separator for unaligned query output\n" +msgstr " \\f [STRING] 顯示或設定éžå°é½ŠæŸ¥è©¢è¼¸å‡ºçš„æ¬„ä½åˆ†éš”符號\n" + +# help.c:237 +#: help.c:312 +#, c-format +msgid " \\H toggle HTML output mode (currently %s)\n" +msgstr " \\H åˆ‡æ› HTML 輸出模å¼(ç›®å‰æ˜¯ %s)\n" + +#: help.c:314 +msgid "" +" \\pset [NAME [VALUE]] set table output option\n" +" (border|columns|csv_fieldsep|expanded|fieldsep|\n" +" fieldsep_zero|footer|format|linestyle|null|\n" +" numericlocale|pager|pager_min_lines|recordsep|\n" +" recordsep_zero|tableattr|title|tuples_only|\n" +" unicode_border_linestyle|unicode_column_linestyle|\n" +" unicode_header_linestyle)\n" +msgstr "" +" \\pset [NAME [VALUE]] 設定表格輸出é¸é …\n" +" (border|columns|csv_fieldsep|expanded|fieldsep|\n" +" fieldsep_zero|footer|format|linestyle|null|\n" +" numericlocale|pager|pager_min_lines|recordsep|\n" +" recordsep_zero|tableattr|title|tuples_only|\n" +" unicode_border_linestyle|unicode_column_linestyle|\n" +" unicode_header_linestyle)\n" + +# help.c:243 +#: help.c:321 +#, c-format +msgid " \\t [on|off] show only rows (currently %s)\n" +msgstr " \\t [on|off] åªé¡¯ç¤ºè³‡æ–™(ç›®å‰æ˜¯ %s)\n" + +# help.c:245 +#: help.c:323 +msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" +msgstr " \\T [STRING] 設定 HTML
æ¨™ç±¤å±¬æ€§ï¼Œè‹¥ç„¡å‰‡å–æ¶ˆè¨­å®š\n" + +# help.c:246 +#: help.c:324 +#, c-format +msgid " \\x [on|off|auto] toggle expanded output (currently %s)\n" +msgstr " \\x [on|off|auto] åˆ‡æ›æ“´å±•輸出模å¼(ç›®å‰æ˜¯ %s)\n" + +#: help.c:325 +msgid "auto" +msgstr "auto" + +# help.c:123 +#: help.c:328 +msgid "Connection\n" +msgstr "連線\n" + +# help.c:175 +#: help.c:330 +#, c-format +msgid "" +" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" +" connect to new database (currently \"%s\")\n" +msgstr "" +" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" +" 連線至新的資料庫(ç›®å‰æ˜¯ \"%s\")\n" + +# help.c:175 +#: help.c:334 +msgid "" +" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" +" connect to new database (currently no connection)\n" +msgstr "" +" \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" +" 連線至新的資料庫(ç›®å‰æ²’有連線)\n" + +#: help.c:336 +msgid " \\conninfo display information about current connection\n" +msgstr " \\conninfo 顯示目å‰é€£ç·šè³‡è¨Š\n" + +# help.c:180 +#: help.c:337 +msgid " \\encoding [ENCODING] show or set client encoding\n" +msgstr " \\encoding [ENCODING] 顯示或設定用戶端編碼\n" + +#: help.c:338 +msgid " \\password [USERNAME] securely change the password for a user\n" +msgstr " \\password [USERNAME] 安全地變更使用者密碼\n" + +# utils/error/elog.c:1873 +#: help.c:341 +msgid "Operating System\n" +msgstr "作業系統\n" + +# help.c:178 +#: help.c:342 +msgid " \\cd [DIR] change the current working directory\n" +msgstr " \\cd [DIR] 變更目å‰çš„工作目錄\n" + +#: help.c:343 +msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" +msgstr " \\getenv PSQLVAR ENVVAR å–得環境變數\n" + +# help.c:188 +#: help.c:344 +msgid " \\setenv NAME [VALUE] set or unset environment variable\n" +msgstr " \\setenv NAME [VALUE] è¨­å®šæˆ–å–æ¶ˆç’°å¢ƒè®Šæ•¸\n" + +# help.c:186 +#: help.c:345 +#, c-format +msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" +msgstr " \\timing [on|off] åˆ‡æ›æŒ‡ä»¤è¨ˆæ™‚功能(ç›®å‰æ˜¯ %s)\n" + +# help.c:189 +#: help.c:347 +msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" +msgstr " \\! [COMMAND] 用 shell åŸ·è¡Œå‘½ä»¤æˆ–å•Ÿå‹•äº’å‹•å¼ shell\n" + +#: help.c:350 +msgid "Variables\n" +msgstr "變數\n" + +# help.c:188 +#: help.c:351 +msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" +msgstr " \\prompt [TEXT] NAME æç¤ºä½¿ç”¨è€…設定內部變數\n" + +# help.c:184 +#: help.c:352 +msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" +msgstr " \\set [NAME [VALUE]] è¨­å®šå…§éƒ¨è®Šæ•¸ï¼Œå¦‚æžœæ²’æœ‰åƒæ•¸å‰‡åˆ—出所有內部變數\n" + +# help.c:188 +#: help.c:353 +msgid " \\unset NAME unset (delete) internal variable\n" +msgstr " \\unset NAME å–æ¶ˆ(刪除)內部變數\n" + +#: help.c:392 +msgid "" +"List of specially treated variables\n" +"\n" +msgstr "" +"特別變數清單\n" +"\n" + +#: help.c:394 +msgid "psql variables:\n" +msgstr "psql 變數:\n" + +#: help.c:396 +msgid "" +" psql --set=NAME=VALUE\n" +" or \\set NAME VALUE inside psql\n" +"\n" +msgstr "" +" psql --set=NAME=VALUE\n" +" 或在 pgsql 中 \\set NAME VALUE\n" +"\n" + +#: help.c:398 +msgid "" +" AUTOCOMMIT\n" +" if set, successful SQL commands are automatically committed\n" +msgstr "" +" AUTOCOMMIT\n" +" 如果設定,æˆåŠŸçš„ SQL 命令將自動æäº¤\n" + +#: help.c:400 +msgid "" +" COMP_KEYWORD_CASE\n" +" determines the case used to complete SQL key words\n" +" [lower, upper, preserve-lower, preserve-upper]\n" +msgstr "" +" COMP_KEYWORD_CASE\n" +" 決定完æˆSQLé—œéµå­—時使用的大å°å¯«\n" +" [lower, upper, preserve-lower, preserve-upper]\n" + +#: help.c:403 +msgid "" +" DBNAME\n" +" the currently connected database name\n" +msgstr "" +" DBNAME\n" +" ç›®å‰é€£ç·šçš„資料庫å稱\n" + +#: help.c:405 +msgid "" +" ECHO\n" +" controls what input is written to standard output\n" +" [all, errors, none, queries]\n" +msgstr "" +" ECHO\n" +" 控制寫入標準輸出的輸入內容\n" +" [all, errors, none, queries]\n" + +#: help.c:408 +msgid "" +" ECHO_HIDDEN\n" +" if set, display internal queries executed by backslash commands;\n" +" if set to \"noexec\", just show them without execution\n" +msgstr "" +" ECHO_HIDDEN\n" +" è‹¥è¨­å®šï¼Œé¡¯ç¤ºç”±åæ–œç·šæŒ‡ä»¤åŸ·è¡Œçš„內部查詢;\n" +" 若設定為 \"noexec\",僅顯示而ä¸åŸ·è¡Œ\n" + +# utils/misc/guc.c:1432 +#: help.c:411 +msgid "" +" ENCODING\n" +" current client character set encoding\n" +msgstr "" +" ENCODING\n" +" ç›®å‰å®¢æˆ¶ç«¯å­—元集編碼\n" + +#: help.c:413 +msgid "" +" ERROR\n" +" \"true\" if last query failed, else \"false\"\n" +msgstr "" +" ERROR\n" +" 若上一次查詢失敗,則為 \"true\",å¦å‰‡ç‚º \"false\"\n" + +#: help.c:415 +msgid "" +" FETCH_COUNT\n" +" the number of result rows to fetch and display at a time (0 = unlimited)\n" +msgstr "" +" FETCH_COUNT\n" +" æ¯æ¬¡æ“·å–å’Œé¡¯ç¤ºçš„çµæžœåˆ—數(0 = ç„¡é™åˆ¶)\n" + +#: help.c:417 +msgid "" +" HIDE_TABLEAM\n" +" if set, table access methods are not displayed\n" +msgstr "" +" HIDE_TABLEAM\n" +" 若設定,則ä¸é¡¯ç¤ºè³‡æ–™è¡¨å­˜å–æ–¹å¼\n" + +#: help.c:419 +msgid "" +" HIDE_TOAST_COMPRESSION\n" +" if set, compression methods are not displayed\n" +msgstr "" +" HIDE_TOAST_COMPRESSION\n" +" 若設定,則ä¸é¡¯ç¤ºå£“縮方法\n" + +#: help.c:421 +msgid "" +" HISTCONTROL\n" +" controls command history [ignorespace, ignoredups, ignoreboth]\n" +msgstr "" +" HISTCONTROL\n" +" 控制指令歷å²ç´€éŒ„ [ignorespace, ignoredups, ignoreboth]\n" + +#: help.c:423 +msgid "" +" HISTFILE\n" +" file name used to store the command history\n" +msgstr "" +" HISTFILE\n" +" 用於儲存指令歷å²ç´€éŒ„的檔案å稱\n" + +#: help.c:425 +msgid "" +" HISTSIZE\n" +" maximum number of commands to store in the command history\n" +msgstr "" +" HISTSIZE\n" +" 儲存在指令歷å²ç´€éŒ„中的最大指令數é‡\n" + +# common.c:636 +# common.c:871 +#: help.c:427 +msgid "" +" HOST\n" +" the currently connected database server host\n" +msgstr "" +" HOST\n" +" ç›®å‰é€£ç·šçš„資料庫伺æœå™¨ä¸»æ©Ÿ\n" + +#: help.c:429 +msgid "" +" IGNOREEOF\n" +" number of EOFs needed to terminate an interactive session\n" +msgstr "" +" IGNOREEOF\n" +" çµæŸäº’å‹•å¼å·¥ä½œéšŽæ®µæ‰€éœ€çš„EOF次數\n" + +#: help.c:431 +msgid "" +" LASTOID\n" +" value of the last affected OID\n" +msgstr "" +" LASTOID\n" +" 上一個å—影響的OID\n" + +#: help.c:433 +msgid "" +" LAST_ERROR_MESSAGE\n" +" LAST_ERROR_SQLSTATE\n" +" message and SQLSTATE of last error, or empty string and \"00000\" if none\n" +msgstr "" +" LAST_ERROR_MESSAGE\n" +" LAST_ERROR_SQLSTATE\n" +" 上一個錯誤的訊æ¯å’Œ SQLSTATE,若無則為空字串和 \"00000\"\n" + +#: help.c:436 +msgid "" +" ON_ERROR_ROLLBACK\n" +" if set, an error doesn't stop a transaction (uses implicit savepoints)\n" +msgstr "" +" ON_ERROR_ROLLBACK\n" +" è‹¥è¨­å®šï¼ŒéŒ¯èª¤ä¸æœƒåœæ­¢äº¤æ˜“(使用隱å¼ä¿å­˜é»ž)\n" + +#: help.c:438 +msgid "" +" ON_ERROR_STOP\n" +" stop batch execution after error\n" +msgstr "" +" ON_ERROR_STOP\n" +" åœ¨éŒ¯èª¤ç™¼ç”Ÿå¾Œåœæ­¢æ‰¹æ¬¡åŸ·è¡Œ\n" + +#: help.c:440 +msgid "" +" PORT\n" +" server port of the current connection\n" +msgstr "" +" PORT\n" +" ç›®å‰é€£ç·šçš„伺æœå™¨é€£æŽ¥åŸ \n" + +#: help.c:442 +msgid "" +" PROMPT1\n" +" specifies the standard psql prompt\n" +msgstr "" +" PROMPT1\n" +" 指定標準的psqlæç¤ºç¬¦è™Ÿ\n" + +#: help.c:444 +msgid "" +" PROMPT2\n" +" specifies the prompt used when a statement continues from a previous line\n" +msgstr "" +" PROMPT2\n" +" 指定當一個陳述å¼å¾žå‰ä¸€è¡Œç¹¼çºŒæ™‚所使用的æç¤ºç¬¦è™Ÿ\n" + +#: help.c:446 +msgid "" +" PROMPT3\n" +" specifies the prompt used during COPY ... FROM STDIN\n" +msgstr "" +" PROMPT3\n" +" 指定在執行 COPY ... FROM STDIN 時使用的æç¤ºç¬¦è™Ÿ\n" + +#: help.c:448 +msgid "" +" QUIET\n" +" run quietly (same as -q option)\n" +msgstr "" +" QUIET\n" +" éœé»˜åŸ·è¡Œ(åŒ -q é¸é …)\n" + +#: help.c:450 +msgid "" +" ROW_COUNT\n" +" number of rows returned or affected by last query, or 0\n" +msgstr "" +" ROW_COUNT\n" +" 上一次查詢所回傳或å—影響的列數,或為 0\n" + +#: help.c:452 +msgid "" +" SERVER_VERSION_NAME\n" +" SERVER_VERSION_NUM\n" +" server's version (in short string or numeric format)\n" +msgstr "" +" SERVER_VERSION_NAME\n" +" SERVER_VERSION_NUM\n" +" 伺æœå™¨ç‰ˆæœ¬(以簡短字串或數字格å¼è¡¨ç¤º)\n" + +#: help.c:455 +msgid "" +" SHELL_ERROR\n" +" \"true\" if the last shell command failed, \"false\" if it succeeded\n" +msgstr "" +" SHELL_ERROR\n" +" 若上一個 shell 指令失敗,為 \"true\",若æˆåŠŸå‰‡ç‚º \"false\"\n" + +#: help.c:457 +msgid "" +" SHELL_EXIT_CODE\n" +" exit status of the last shell command\n" +msgstr "" +" SHELL_EXIT_CODE\n" +" 上一個 shell å‘½ä»¤çš„çµæŸç¢¼\n" + +#: help.c:459 +msgid "" +" SHOW_ALL_RESULTS\n" +" show all results of a combined query (\\;) instead of only the last\n" +msgstr "" +" SHOW_ALL_RESULTS\n" +" 顯示åˆä½µæŸ¥è©¢(\\;)çš„æ‰€æœ‰çµæžœï¼Œè€Œä¸åƒ…åƒ…æ˜¯æœ€å¾Œä¸€å€‹çµæžœ\n" + +#: help.c:461 +msgid "" +" SHOW_CONTEXT\n" +" controls display of message context fields [never, errors, always]\n" +msgstr "" +" SHOW_CONTEXT\n" +" 控制訊æ¯ä¸Šä¸‹æ–‡æ¬„ä½çš„顯示[never, errors, always]\n" + +#: help.c:463 +msgid "" +" SINGLELINE\n" +" if set, end of line terminates SQL commands (same as -S option)\n" +msgstr "" +" SINGLELINE\n" +" 若設定,SQLå‘½ä»¤åœ¨è¡Œå°¾çµæŸ(åŒ -S é¸é …)\n" + +#: help.c:465 +msgid "" +" SINGLESTEP\n" +" single-step mode (same as -s option)\n" +msgstr "" +" SINGLESTEP\n" +" 單步執行模å¼(åŒ -s é¸é …)\n" + +#: help.c:467 +msgid "" +" SQLSTATE\n" +" SQLSTATE of last query, or \"00000\" if no error\n" +msgstr "" +" SQLSTATE\n" +" 上一個查詢的 SQLSTATE,若無錯誤則為 \"00000\"\n" + +# common.c:636 +# common.c:871 +#: help.c:469 +msgid "" +" USER\n" +" the currently connected database user\n" +msgstr "" +" USER\n" +" ç›®å‰é€£ç·šçš„資料庫使用者\n" + +#: help.c:471 +msgid "" +" VERBOSITY\n" +" controls verbosity of error reports [default, verbose, terse, sqlstate]\n" +msgstr "" +" VERBOSITY\n" +" 控制錯誤報告的詳細程度 [default, verbose, terse, sqlstate]\n" + +#: help.c:473 +msgid "" +" VERSION\n" +" VERSION_NAME\n" +" VERSION_NUM\n" +" psql's version (in verbose string, short string, or numeric format)\n" +msgstr "" +" VERSION\n" +" VERSION_NAME\n" +" VERSION_NUM\n" +" psql的版本(以詳細字串ã€ç°¡çŸ­å­—串或數字格å¼è¡¨ç¤º)\n" + +# describe.c:1549 +#: help.c:478 +msgid "" +"\n" +"Display settings:\n" +msgstr "" +"\n" +"顯示設定:\n" + +#: help.c:480 +msgid "" +" psql --pset=NAME[=VALUE]\n" +" or \\pset NAME [VALUE] inside psql\n" +"\n" +msgstr "" +" psql --pset=NAME[=VALUE]\n" +" 或在 psql 中 \\pset NAME [VALUE]\n" +"\n" + +#: help.c:482 +msgid "" +" border\n" +" border style (number)\n" +msgstr "" +" border\n" +" 邊框樣å¼(數字)\n" + +#: help.c:484 +msgid "" +" columns\n" +" target width for the wrapped format\n" +msgstr "" +" columns\n" +" å°è£æ ¼å¼çš„目標寬度是 %d。\n" + +#: help.c:486 +msgid "" +" expanded (or x)\n" +" expanded output [on, off, auto]\n" +msgstr "" +" expanded (or x)\n" +" 展開輸出 [on, off, auto]\n" + +#: help.c:488 +#, c-format +msgid "" +" fieldsep\n" +" field separator for unaligned output (default \"%s\")\n" +msgstr "" +" fieldsep\n" +" 用於éžå°é½Šè¼¸å‡ºçš„æ¬„ä½åˆ†éš”符(é è¨­å€¼ \"%s\")\n" + +# help.c:236 +#: help.c:491 +msgid "" +" fieldsep_zero\n" +" set field separator for unaligned output to a zero byte\n" +msgstr "" +" fieldsep_zero\n" +" 設定éžå°é½Šè¼¸å‡ºçš„æ¬„ä½åˆ†éš”符為 0 ä½å…ƒçµ„\n" + +#: help.c:493 +msgid "" +" footer\n" +" enable or disable display of the table footer [on, off]\n" +msgstr "" +" footer\n" +" 啟動或åœç”¨é¡¯ç¤ºè¡¨æ ¼é è…³ [on, off]\n" -# help.c:228 -#: help.c:224 -#, c-format -msgid " \\dv[S+] [PATTERN] list views\n" -msgstr " \\dv[S+] [PATTERN] 列出視圖\n" +# command.c:1340 +#: help.c:495 +msgid "" +" format\n" +" set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" +msgstr "" +" format\n" +" è¨­å®šè¼¸å‡ºæ ¼å¼ [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -# help.c:228 -#: help.c:225 -#, c-format -msgid " \\dE[S+] [PATTERN] list foreign tables\n" -msgstr " \\dE[S+] [PATTERN] 列出 foreign 資料表\n" +#: help.c:497 +msgid "" +" linestyle\n" +" set the border line drawing style [ascii, old-ascii, unicode]\n" +msgstr "" +" linestyle\n" +" 設定邊框線æ¢ç¹ªè£½æ¨£å¼ [ascii, old-ascii, unicode]\n" -# help.c:217 -#: help.c:226 -#, c-format -msgid " \\dx[+] [PATTERN] list extensions\n" -msgstr " \\dx[+] [PATTERN] 列出 extension\n" +#: help.c:499 +msgid "" +" null\n" +" set the string to be printed in place of a null value\n" +msgstr "" +" null\n" +" 設定è¦åœ¨ç©ºå€¼ä½ç½®ä¸Šé¡¯ç¤ºçš„字串\n" -#: help.c:227 -#, c-format -msgid " \\l[+] list all databases\n" -msgstr " \\l[+] 列出所有資料庫\n" +#: help.c:501 +msgid "" +" numericlocale\n" +" enable display of a locale-specific character to separate groups of digits\n" +msgstr "" +" numericlocale\n" +" 啟動顯示å€åŸŸç‰¹å®šçš„字符來分隔數字群組\n" -# help.c:193 -#: help.c:228 -#, c-format -msgid " \\sf[+] FUNCNAME show a function's definition\n" -msgstr " \\sf[+] FUNCNAME 顯示函å¼å®šç¾©\n" +#: help.c:503 +msgid "" +" pager\n" +" control when an external pager is used [yes, no, always]\n" +msgstr "" +" pager\n" +" 控制何時使用外部分é ç¨‹å¼ [yes, no, always]\n" -# help.c:218 -#: help.c:229 -#, c-format -msgid " \\z [PATTERN] same as \\dp\n" -msgstr " \\z [PATTERN] 與 \\dp 相åŒ\n" +# help.c:236 +#: help.c:505 +msgid "" +" recordsep\n" +" record (line) separator for unaligned output\n" +msgstr "" +" recordsep\n" +" 用於éžå°é½Šè¼¸å‡ºçš„記錄(行)分隔符號\n" -# help.c:233 -#: help.c:232 -#, c-format -msgid "Formatting\n" -msgstr "æ ¼å¼åŒ–\n" +#: help.c:507 +msgid "" +" recordsep_zero\n" +" set record separator for unaligned output to a zero byte\n" +msgstr "" +" recordsep_zero\n" +" å°‡éžå°é½Šè¼¸å‡ºçš„記錄分隔符設定為 0 ä½å…ƒçµ„\n" -# help.c:234 -#: help.c:233 -#, c-format -msgid " \\a toggle between unaligned and aligned output mode\n" -msgstr " \\a 在éžå°é½Šå’Œå°é½Šè¼¸å‡ºæ¨¡å¼ä¹‹é–“切æ›\n" +#: help.c:509 +msgid "" +" tableattr (or T)\n" +" specify attributes for table tag in html format, or proportional\n" +" column widths for left-aligned data types in latex-longtable format\n" +msgstr "" +" tableattr (or T)\n" +" 指定HTMLæ ¼å¼ä¸­è¡¨æ ¼æ¨™ç±¤çš„屬性,或是LaTeX-longtable\n" +" æ ¼å¼ä¸­å·¦å°é½Šè³‡æ–™åž‹åˆ¥çš„æ¯”例列寬\n" -# help.c:235 -#: help.c:234 -#, c-format -msgid " \\C [STRING] set table title, or unset if none\n" -msgstr " \\C [STRING] 設定資料表標題,如果沒有則ä¸è¨­å®š\n" +#: help.c:512 +msgid "" +" title\n" +" set the table title for subsequently printed tables\n" +msgstr "" +" title\n" +" 設定後續顯示表格的表格標題\n" -# help.c:236 -#: help.c:235 -#, c-format -msgid " \\f [STRING] show or set field separator for unaligned query output\n" -msgstr " \\f [STRING] 顯示或設定éžå°é½ŠæŸ¥è©¢è¼¸å‡ºçš„æ¬„ä½åˆ†éš”符號\n" +#: help.c:514 +msgid "" +" tuples_only\n" +" if set, only actual table data is shown\n" +msgstr "" +" tuples_only\n" +" 若設定則åªé¡¯ç¤ºè³‡æ–™\n" -# help.c:237 -#: help.c:236 -#, c-format -msgid " \\H toggle HTML output mode (currently %s)\n" -msgstr " \\H åˆ‡æ› HTML è¼¸å‡ºæ¨¡å¼ (ç›®å‰æ˜¯ %s)\n" +#: help.c:516 +msgid "" +" unicode_border_linestyle\n" +" unicode_column_linestyle\n" +" unicode_header_linestyle\n" +" set the style of Unicode line drawing [single, double]\n" +msgstr "" +" unicode_border_linestyle\n" +" unicode_column_linestyle\n" +" unicode_header_linestyle\n" +" 設定 Unicode ç·šæ¢ç¹ªè£½æ¨£å¼ [single, double]\n" -# help.c:239 -#: help.c:238 -#, c-format +#: help.c:521 msgid "" -" \\pset NAME [VALUE] set table output option\n" -" (NAME := {format|border|expanded|fieldsep|footer|null|\n" -" numericlocale|recordsep|tuples_only|title|tableattr|pager})\n" +"\n" +"Environment variables:\n" msgstr "" -" \\pset NAME [VALUE] 設定資料表輸出é¸é …\n" -" (NAME := {format|border|expanded|fieldsep|footer|null|\n" -" numericlocale|recordsep|tuples_only|title|tableattr|pager})\n" +"\n" +"環境變數:\n" -# help.c:243 -#: help.c:241 -#, c-format -msgid " \\t [on|off] show only rows (currently %s)\n" -msgstr " \\t [on|off] åªé¡¯ç¤ºè³‡æ–™åˆ— (ç›®å‰æ˜¯ %s)\n" +#: help.c:525 +msgid "" +" NAME=VALUE [NAME=VALUE] psql ...\n" +" or \\setenv NAME [VALUE] inside psql\n" +"\n" +msgstr "" +" NAME=VALUE [NAME=VALUE] psql ...\n" +" 或在 psql 中 \\setenv NAME [VALUE]\n" +"\n" -# help.c:245 -#: help.c:243 -#, c-format -msgid " \\T [STRING] set HTML
tag attributes, or unset if none\n" -msgstr " \\T [STRING] 設定 HTML
標記屬性,如果沒有則ä¸è¨­å®š\n" +#: help.c:527 +msgid "" +" set NAME=VALUE\n" +" psql ...\n" +" or \\setenv NAME [VALUE] inside psql\n" +"\n" +msgstr "" +" set NAME=VALUE\n" +" psql ...\n" +" 或在 psql 中 \\setenv NAME [VALUE]\n" +"\n" -# help.c:246 -#: help.c:244 -#, c-format -msgid " \\x [on|off] toggle expanded output (currently %s)\n" -msgstr " \\x [on|off] åˆ‡æ›æ“´å±•è¼¸å‡ºæ¨¡å¼ (ç›®å‰æ˜¯ %s)\n" +#: help.c:530 +msgid "" +" COLUMNS\n" +" number of columns for wrapped format\n" +msgstr "" +" COLUMNS\n" +" 用於å°è£æ ¼å¼çš„æ¬„使•¸\n" -# help.c:123 -#: help.c:248 -#, c-format -msgid "Connection\n" -msgstr "連線\n" +#: help.c:532 +msgid "" +" PGAPPNAME\n" +" same as the application_name connection parameter\n" +msgstr "" +" PGAPPNAME\n" +" èˆ‡é€£ç·šåƒæ•¸ä¸­çš„ application_name 相åŒ\n" -# help.c:175 -#: help.c:249 -#, c-format +#: help.c:534 msgid "" -" \\c[onnect] [DBNAME|- USER|- HOST|- PORT|-]\n" -" connect to new database (currently \"%s\")\n" +" PGDATABASE\n" +" same as the dbname connection parameter\n" msgstr "" -" \\c[onnect] [DBNAME|- USER|- HOST|- PORT|-]\n" -" 連線至新資料庫 (ç›®å‰æ˜¯ \"%s\")\n" +" PGDATABASE\n" +" èˆ‡é€£ç·šåƒæ•¸ä¸­çš„ dbname 相åŒ\n" -# help.c:180 -#: help.c:252 -#, c-format -msgid " \\encoding [ENCODING] show or set client encoding\n" -msgstr " \\encoding [ENCODING] 顯示或設定用戶端編碼\n" +#: help.c:536 +msgid "" +" PGHOST\n" +" same as the host connection parameter\n" +msgstr "" +" PGHOST\n" +" èˆ‡é€£ç·šåƒæ•¸ä¸­çš„ host 相åŒ\n" -#: help.c:253 -#, c-format -msgid " \\password [USERNAME] securely change the password for a user\n" -msgstr " \\password [USERNAME] 安全地變更使用者密碼\n" +#: help.c:538 +msgid "" +" PGPASSFILE\n" +" password file name\n" +msgstr "" +" PGPASSFILE\n" +" 密碼檔案å稱\n" -#: help.c:254 -#, c-format -msgid " \\conninfo display information about current connection\n" -msgstr " \\conninfo 顯示目å‰é€£ç·šè³‡è¨Š\n" +#: help.c:540 +msgid "" +" PGPASSWORD\n" +" connection password (not recommended)\n" +msgstr "" +" PGPASSWORD\n" +" 連線密碼(ä¸å»ºè­°ä½¿ç”¨)\n" -# utils/error/elog.c:1873 -#: help.c:257 -#, c-format -msgid "Operating System\n" -msgstr "作業系統\n" +#: help.c:542 +msgid "" +" PGPORT\n" +" same as the port connection parameter\n" +msgstr "" +" PGPORT\n" +" èˆ‡é€£ç·šåƒæ•¸ä¸­çš„ port 相åŒ\n" -# help.c:178 -#: help.c:258 -#, c-format -msgid " \\cd [DIR] change the current working directory\n" -msgstr " \\cd [DIR] 變更目å‰çš„工作目錄\n" +#: help.c:544 +msgid "" +" PGUSER\n" +" same as the user connection parameter\n" +msgstr "" +" PGUSER\n" +" èˆ‡é€£ç·šåƒæ•¸ä¸­çš„ user 相åŒ\n" -# help.c:186 -#: help.c:259 -#, c-format -msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" -msgstr " \\timing [on|off] åˆ‡æ›æŒ‡ä»¤è¨ˆæ™‚é–‹é—œ (ç›®å‰æ˜¯ %s)\n" +#: help.c:546 +msgid "" +" PSQL_EDITOR, EDITOR, VISUAL\n" +" editor used by the \\e, \\ef, and \\ev commands\n" +msgstr "" +" PSQL_EDITOR, EDITOR, VISUAL\n" +" \\eã€\\efã€\\ev 命令使用的編輯器\n" -# help.c:189 -#: help.c:261 -#, c-format -msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" -msgstr " \\! [COMMAND] 執行 shell ä¸­çš„æŒ‡ä»¤æˆ–å•Ÿå‹•äº’å‹•å¼ shell\n" +#: help.c:548 +msgid "" +" PSQL_EDITOR_LINENUMBER_ARG\n" +" how to specify a line number when invoking the editor\n" +msgstr "" +" PSQL_EDITOR_LINENUMBER_ARG\n" +" 在呼å«ç·¨è¼¯å™¨æ™‚如何指定行號\n" -#: help.c:264 -#, c-format -msgid "Variables\n" -msgstr "變數\n" +#: help.c:550 +msgid "" +" PSQL_HISTORY\n" +" alternative location for the command history file\n" +msgstr "" +" PSQL_HISTORY\n" +" å‘½ä»¤æ­·å²æª”案的替代ä½ç½®\n" -# help.c:188 -#: help.c:265 -#, c-format -msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" -msgstr " \\prompt [TEXT] NAME æç¤ºä½¿ç”¨è€…設定內部變數\n" +#: help.c:552 +msgid "" +" PSQL_PAGER, PAGER\n" +" name of external pager program\n" +msgstr "" +" PSQL_PAGER, PAGER\n" +" 外部分é ç¨‹å¼çš„å稱\n" -# help.c:184 -#: help.c:266 -#, c-format -msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" -msgstr " \\set [NAME [VALUE]] è¨­å®šå…§éƒ¨è®Šæ•¸ï¼Œå¦‚æžœæ²’æœ‰åƒæ•¸å‰‡åˆ—出所有變數\n" +#: help.c:555 +msgid "" +" PSQL_WATCH_PAGER\n" +" name of external pager program used for \\watch\n" +msgstr "" +" PSQL_WATCH_PAGER\n" +" 用於 \\watch 的外部分é ç¨‹å¼çš„å稱\n" -# help.c:188 -#: help.c:267 -#, c-format -msgid " \\unset NAME unset (delete) internal variable\n" -msgstr " \\unset NAME å–æ¶ˆè¨­å®š (刪除) 內部變數\n" +#: help.c:558 +msgid "" +" PSQLRC\n" +" alternative location for the user's .psqlrc file\n" +msgstr "" +" PSQLRC\n" +" 使用者 .psqlrc 檔案的替代ä½ç½®\n" -# large_obj.c:264 -#: help.c:270 -#, c-format -msgid "Large Objects\n" -msgstr "大型物件\n" +#: help.c:560 +msgid "" +" SHELL\n" +" shell used by the \\! command\n" +msgstr "" +" SHELL\n" +" \\! 命令使用的 shell\n" -# help.c:252 -#: help.c:271 -#, c-format +#: help.c:562 msgid "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID large object operations\n" +" TMPDIR\n" +" directory for temporary files\n" msgstr "" -" \\lo_export LOBOID FILE\n" -" \\lo_import FILE [COMMENT]\n" -" \\lo_list\n" -" \\lo_unlink LOBOID 大型物件é‹ç®—å­\n" +" TMPDIR\n" +" 暫存檔案的目錄\n" # help.c:285 -#: help.c:318 +#: help.c:622 msgid "Available help:\n" msgstr "å¯ç”¨èªªæ˜Ž:\n" # help.c:344 -#: help.c:402 +#: help.c:717 #, c-format msgid "" "Command: %s\n" @@ -1467,133 +4502,96 @@ msgid "" "Syntax:\n" "%s\n" "\n" +"URL: %s\n" +"\n" msgstr "" -"命令: %s\n" -"說明: %s\n" +"命令: %s\n" +"æè¿°: %s\n" "語法:\n" "%s\n" "\n" +"ç¶²å€: %s\n" +"\n" # help.c:357 -#: help.c:418 +#: help.c:740 #, c-format msgid "" "No help available for \"%s\".\n" "Try \\h with no arguments to see available help.\n" msgstr "" "沒有 \"%s\" 的說明。\n" -"å˜—è©¦ç”¨æ²’æœ‰åƒæ•¸çš„ \\h 顯示目å‰å¯ç”¨çš„說明。\n" +"用ä¸å¸¶åƒæ•¸çš„ \\h 查看å¯ç”¨çš„說明。\n" # input.c:210 -#: input.c:198 +#: input.c:216 #, c-format -msgid "could not read from input file: %s\n" -msgstr "無法從輸入檔案讀å–: %s\n" +msgid "could not read from input file: %m" +msgstr "無法從輸入檔讀å–: %m" # input.c:210 -#: input.c:406 +#: input.c:477 input.c:515 #, c-format -msgid "could not save history to file \"%s\": %s\n" -msgstr "無法將歷å²è¨˜éŒ„儲存到 \"%s\": %s\n" +msgid "could not save history to file \"%s\": %m" +msgstr "無法將歷å²è¨˜éŒ„存入檔案 \"%s\": %m" # input.c:213 -#: input.c:411 -msgid "history is not supported by this installation\n" -msgstr "這個安è£ä¸æ”¯æ´å‘½ä»¤è¨˜éŒ„\n" +#: input.c:534 +#, c-format +msgid "history is not supported by this installation" +msgstr "此安è£ä¸æ”¯æ´æ­·å²è¨˜éŒ„" # large_obj.c:36 -#: large_obj.c:66 +#: large_obj.c:65 #, c-format -msgid "%s: not connected to a database\n" -msgstr "%s: 尚未連線至資料庫\n" +msgid "%s: not connected to a database" +msgstr "%s: 尚未連線至資料庫" # large_obj.c:55 -#: large_obj.c:85 +#: large_obj.c:84 #, c-format -msgid "%s: current transaction is aborted\n" -msgstr "%s: ç›®å‰çš„交易被中止\n" +msgid "%s: current transaction is aborted" +msgstr "%s: ç›®å‰çš„交易已被中止" # large_obj.c:58 -#: large_obj.c:88 +#: large_obj.c:87 #, c-format -msgid "%s: unknown transaction status\n" -msgstr "%s: 䏿˜Žäº¤æ˜“狀態\n" - -#: large_obj.c:289 -#: large_obj.c:300 -msgid "ID" -msgstr "ID" - -# describe.c:128 -# describe.c:186 -# describe.c:362 -# describe.c:1478 -# describe.c:1727 -#: large_obj.c:290 -#: describe.c:147 -#: describe.c:335 -#: describe.c:637 -#: describe.c:787 -#: describe.c:2518 -#: describe.c:2636 -#: describe.c:2973 -#: describe.c:3604 -#: describe.c:3669 -msgid "Owner" -msgstr "æ“æœ‰è€…" +msgid "%s: unknown transaction status" +msgstr "%s: 未知的交易狀態" -# describe.c:83 -# describe.c:187 -# describe.c:260 -# describe.c:322 -# describe.c:369 -# describe.c:469 -# describe.c:758 -# describe.c:1488 -# describe.c:1733 -# large_obj.c:256 -#: large_obj.c:291 -#: large_obj.c:301 -#: describe.c:96 -#: describe.c:159 -#: describe.c:338 -#: describe.c:501 -#: describe.c:590 -#: describe.c:661 -#: describe.c:852 -#: describe.c:1382 -#: describe.c:2335 -#: describe.c:2542 -#: describe.c:2916 -#: describe.c:2981 -#: describe.c:3046 -#: describe.c:3182 -#: describe.c:3221 -#: describe.c:3288 -#: describe.c:3347 -#: describe.c:3356 -#: describe.c:3415 -#: describe.c:3854 -msgid "Description" -msgstr "æè¿°" - -# large_obj.c:264 -#: large_obj.c:310 -msgid "Large objects" -msgstr "大型物件" +#: mainloop.c:133 +#, c-format +msgid "\\if: escaped" +msgstr "" # mainloop.c:172 -#: mainloop.c:159 +#: mainloop.c:192 #, c-format msgid "Use \"\\q\" to leave %s.\n" -msgstr "使用 \"\\q\" 離開 %s。\n" +msgstr "用 \"\\q\" 離開 %s。\n" + +#: mainloop.c:214 +msgid "" +"The input is a PostgreSQL custom-format dump.\n" +"Use the pg_restore command-line client to restore this dump to a database.\n" +msgstr "" +"輸入為 PostgreSQL 自訂格å¼çš„備份檔案。\n" +"用 pg_restore 命令列客戶端將此備份還原到資料庫。\n" + +#: mainloop.c:295 +msgid "Use \\? for help or press control-C to clear the input buffer." +msgstr "用 \\? å–得說明,或按 Control-C 清除輸入緩è¡å€ã€‚" -#: mainloop.c:189 +#: mainloop.c:297 +msgid "Use \\? for help." +msgstr "用 \\? å–得說明。" + +#: mainloop.c:301 msgid "You are using psql, the command-line interface to PostgreSQL." -msgstr "您正在使用 PostgreSQL æŒ‡ä»¤åˆ—ä»‹é¢ psql。" +msgstr "您正在使用 psql,這是 PostgreSQL 的命令列界é¢" # startup.c:292 -#: mainloop.c:190 +#: mainloop.c:302 #, c-format msgid "" "Type: \\copyright for distribution terms\n" @@ -1603,4023 +4601,3211 @@ msgid "" " \\q to quit\n" msgstr "" "輸入: \\copyright é¡¯ç¤ºç™¼è¡Œæ¢æ¬¾\n" -" \\h 顯示 SQL 指令的說明\n" -" \\? 顯示 psql 指令的說明\n" -" \\g 或者以分號 (;) çµå°¾ä»¥åŸ·è¡ŒæŸ¥è©¢\n" +" \\h 顯示 SQL 命令的說明\n" +" \\? 顯示 psql 命令的說明\n" +" \\g 或以分號çµå°¾ä»¥åŸ·è¡ŒæŸ¥è©¢\n" " \\q çµæŸ\n" -# print.c:428 -#: print.c:1138 -#, c-format -msgid "(No rows)\n" -msgstr "(無資料列)\n" - -#: print.c:2028 -#, c-format -msgid "Interrupted\n" -msgstr "已中斷\n" - -#: print.c:2097 -#, c-format -msgid "Cannot add header to table content: column count of %d exceeded.\n" -msgstr "無法將標題新增至資料表內容: è¶…éŽè³‡æ–™è¡Œè¨ˆæ•¸ %d。\n" - -#: print.c:2137 -#, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "無法將資料格新增至資料表內容: è¶…éŽè³‡æ–™æ ¼ç¸½è¨ˆ %d。\n" - -#: print.c:2358 -#, c-format -msgid "invalid output format (internal error): %d" -msgstr "ç„¡æ•ˆçš„è¼¸å‡ºæ ¼å¼ (內部錯誤): %d" - -# print.c:1202 -#: print.c:2455 -#, c-format -msgid "(%lu row)" -msgid_plural "(%lu rows)" -msgstr[0] "(%lu 筆資料列)" - -# command.c:1148 -#: startup.c:243 -#, c-format -msgid "%s: could not open log file \"%s\": %s\n" -msgstr "%s: 無法開啟日誌檔 \"%s\": %s\n" - -#: startup.c:305 -#, c-format -msgid "" -"Type \"help\" for help.\n" -"\n" -msgstr "" -"輸入 \"help\" 顯示說明。\n" -"\n" - -# startup.c:446 -#: startup.c:451 -#, c-format -msgid "%s: could not set printing parameter \"%s\"\n" -msgstr "%s: 無法設定列å°åƒæ•¸ \"%s\"\n" - -# startup.c:492 -#: startup.c:490 -#, c-format -msgid "%s: could not delete variable \"%s\"\n" -msgstr "%s: 無法刪除變數 \"%s\"\n" +#: mainloop.c:326 +msgid "Use \\q to quit." +msgstr "用 \\q çµæŸã€‚" -# startup.c:502 -#: startup.c:500 -#, c-format -msgid "%s: could not set variable \"%s\"\n" -msgstr "%s: 無法設定變數 \"%s\"\n" +#: mainloop.c:329 mainloop.c:353 +msgid "Use control-D to quit." +msgstr "用 Control-D çµæŸã€‚" -# startup.c:533 -# startup.c:539 -#: startup.c:537 -#: startup.c:543 +#: mainloop.c:331 mainloop.c:355 +msgid "Use control-C to quit." +msgstr "用 Control-C çµæŸã€‚" + +#: mainloop.c:459 mainloop.c:618 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "嘗試 \"%s --help\" 以得到更多資訊。\n" +msgid "query ignored; use \\endif or Ctrl-C to exit current \\if block" +msgstr "查詢被忽略;使用 \\endif 或按 Ctrl-C 以退出當å‰çš„ \\if å€å¡Š" -# startup.c:557 -#: startup.c:560 +#: mainloop.c:636 #, c-format -msgid "%s: warning: extra command-line argument \"%s\" ignored\n" -msgstr "%s: 警告: å¿½ç•¥å¤šé¤˜çš„å‘½ä»¤åˆ—åƒæ•¸ \"%s\"\n" +msgid "reached EOF without finding closing \\endif(s)" +msgstr "å·²é”到 EOF,但找ä¸åˆ°çµå°¾çš„ \\endif" -# startup.c:629 -#: startup.c:625 -msgid "contains support for command-line editing" -msgstr "包å«å‘½ä»¤åˆ—編輯支æ´" +# scan.l:407 +#: psqlscanslash.l:640 +#, c-format +msgid "unterminated quoted string" +msgstr "未完æˆçš„引號字串" -# describe.c:82 -# describe.c:177 -# describe.c:247 -# describe.c:320 -# describe.c:415 -# describe.c:469 -# describe.c:1476 -# describe.c:1585 -# describe.c:1633 -#: describe.c:69 -#: describe.c:236 -#: describe.c:463 -#: describe.c:585 -#: describe.c:706 -#: describe.c:788 -#: describe.c:849 -#: describe.c:2509 -#: describe.c:2703 -#: describe.c:2773 -#: describe.c:2908 -#: describe.c:3044 -#: describe.c:3271 -#: describe.c:3343 -#: describe.c:3354 -#: describe.c:3413 -#: describe.c:3787 -#: describe.c:3853 -msgid "Schema" -msgstr "架構模å¼" +#: psqlscanslash.l:825 +#, c-format +msgid "%s: out of memory" +msgstr "%s: 記憶體ä¸è¶³" -# describe.c:82 -# describe.c:128 -# describe.c:177 -# describe.c:247 -# describe.c:320 -# describe.c:362 -# describe.c:415 -# describe.c:469 -# describe.c:1476 -# describe.c:1586 -# describe.c:1634 -# describe.c:1727 -#: describe.c:70 -#: describe.c:146 -#: describe.c:237 -#: describe.c:464 -#: describe.c:586 -#: describe.c:636 -#: describe.c:707 -#: describe.c:850 -#: describe.c:2510 -#: describe.c:2632 -#: describe.c:2704 -#: describe.c:2774 -#: describe.c:2909 -#: describe.c:2972 -#: describe.c:3045 -#: describe.c:3272 -#: describe.c:3344 -#: describe.c:3355 -#: describe.c:3414 -#: describe.c:3603 -#: describe.c:3668 -#: describe.c:3851 -msgid "Name" -msgstr "å稱" +# describe.c:1375 +#: sql_help.c:35 sql_help.c:38 sql_help.c:41 sql_help.c:65 sql_help.c:66 +#: sql_help.c:68 sql_help.c:70 sql_help.c:81 sql_help.c:83 sql_help.c:85 +#: sql_help.c:113 sql_help.c:119 sql_help.c:121 sql_help.c:123 sql_help.c:125 +#: sql_help.c:126 sql_help.c:129 sql_help.c:131 sql_help.c:133 sql_help.c:238 +#: sql_help.c:240 sql_help.c:241 sql_help.c:243 sql_help.c:245 sql_help.c:248 +#: sql_help.c:250 sql_help.c:252 sql_help.c:254 sql_help.c:266 sql_help.c:267 +#: sql_help.c:268 sql_help.c:270 sql_help.c:319 sql_help.c:321 sql_help.c:323 +#: sql_help.c:325 sql_help.c:394 sql_help.c:399 sql_help.c:401 sql_help.c:443 +#: sql_help.c:445 sql_help.c:448 sql_help.c:450 sql_help.c:519 sql_help.c:524 +#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:593 sql_help.c:595 +#: sql_help.c:597 sql_help.c:599 sql_help.c:601 sql_help.c:604 sql_help.c:606 +#: sql_help.c:609 sql_help.c:620 sql_help.c:622 sql_help.c:666 sql_help.c:668 +#: sql_help.c:670 sql_help.c:673 sql_help.c:675 sql_help.c:677 sql_help.c:714 +#: sql_help.c:718 sql_help.c:722 sql_help.c:741 sql_help.c:744 sql_help.c:747 +#: sql_help.c:776 sql_help.c:788 sql_help.c:796 sql_help.c:799 sql_help.c:802 +#: sql_help.c:817 sql_help.c:820 sql_help.c:849 sql_help.c:854 sql_help.c:859 +#: sql_help.c:864 sql_help.c:869 sql_help.c:896 sql_help.c:898 sql_help.c:900 +#: sql_help.c:902 sql_help.c:905 sql_help.c:907 sql_help.c:954 sql_help.c:999 +#: sql_help.c:1004 sql_help.c:1009 sql_help.c:1014 sql_help.c:1019 +#: sql_help.c:1038 sql_help.c:1049 sql_help.c:1051 sql_help.c:1071 +#: sql_help.c:1081 sql_help.c:1082 sql_help.c:1084 sql_help.c:1086 +#: sql_help.c:1098 sql_help.c:1102 sql_help.c:1104 sql_help.c:1116 +#: sql_help.c:1118 sql_help.c:1120 sql_help.c:1122 sql_help.c:1141 +#: sql_help.c:1143 sql_help.c:1147 sql_help.c:1151 sql_help.c:1155 +#: sql_help.c:1158 sql_help.c:1159 sql_help.c:1160 sql_help.c:1163 +#: sql_help.c:1166 sql_help.c:1168 sql_help.c:1308 sql_help.c:1310 +#: sql_help.c:1313 sql_help.c:1316 sql_help.c:1318 sql_help.c:1320 +#: sql_help.c:1323 sql_help.c:1326 sql_help.c:1443 sql_help.c:1445 +#: sql_help.c:1447 sql_help.c:1450 sql_help.c:1471 sql_help.c:1474 +#: sql_help.c:1477 sql_help.c:1480 sql_help.c:1484 sql_help.c:1486 +#: sql_help.c:1488 sql_help.c:1490 sql_help.c:1504 sql_help.c:1507 +#: sql_help.c:1509 sql_help.c:1511 sql_help.c:1521 sql_help.c:1523 +#: sql_help.c:1533 sql_help.c:1535 sql_help.c:1545 sql_help.c:1548 +#: sql_help.c:1571 sql_help.c:1573 sql_help.c:1575 sql_help.c:1577 +#: sql_help.c:1580 sql_help.c:1582 sql_help.c:1585 sql_help.c:1588 +#: sql_help.c:1639 sql_help.c:1682 sql_help.c:1685 sql_help.c:1687 +#: sql_help.c:1689 sql_help.c:1692 sql_help.c:1694 sql_help.c:1696 +#: sql_help.c:1699 sql_help.c:1751 sql_help.c:1767 sql_help.c:2000 +#: sql_help.c:2069 sql_help.c:2088 sql_help.c:2101 sql_help.c:2159 +#: sql_help.c:2167 sql_help.c:2177 sql_help.c:2204 sql_help.c:2236 +#: sql_help.c:2254 sql_help.c:2282 sql_help.c:2393 sql_help.c:2439 +#: sql_help.c:2464 sql_help.c:2487 sql_help.c:2491 sql_help.c:2525 +#: sql_help.c:2545 sql_help.c:2567 sql_help.c:2581 sql_help.c:2602 +#: sql_help.c:2631 sql_help.c:2666 sql_help.c:2691 sql_help.c:2738 +#: sql_help.c:3033 sql_help.c:3046 sql_help.c:3063 sql_help.c:3079 +#: sql_help.c:3119 sql_help.c:3173 sql_help.c:3177 sql_help.c:3179 +#: sql_help.c:3186 sql_help.c:3205 sql_help.c:3232 sql_help.c:3267 +#: sql_help.c:3279 sql_help.c:3288 sql_help.c:3332 sql_help.c:3346 +#: sql_help.c:3374 sql_help.c:3382 sql_help.c:3394 sql_help.c:3404 +#: sql_help.c:3412 sql_help.c:3420 sql_help.c:3428 sql_help.c:3436 +#: sql_help.c:3445 sql_help.c:3456 sql_help.c:3464 sql_help.c:3472 +#: sql_help.c:3480 sql_help.c:3488 sql_help.c:3498 sql_help.c:3507 +#: sql_help.c:3516 sql_help.c:3524 sql_help.c:3534 sql_help.c:3545 +#: sql_help.c:3553 sql_help.c:3562 sql_help.c:3573 sql_help.c:3582 +#: sql_help.c:3590 sql_help.c:3598 sql_help.c:3606 sql_help.c:3614 +#: sql_help.c:3622 sql_help.c:3630 sql_help.c:3638 sql_help.c:3646 +#: sql_help.c:3654 sql_help.c:3662 sql_help.c:3679 sql_help.c:3688 +#: sql_help.c:3696 sql_help.c:3713 sql_help.c:3728 sql_help.c:4040 +#: sql_help.c:4150 sql_help.c:4179 sql_help.c:4195 sql_help.c:4197 +#: sql_help.c:4700 sql_help.c:4748 sql_help.c:4906 +msgid "name" +msgstr "name" -# describe.c:177 -#: describe.c:71 -#: describe.c:249 -#: describe.c:295 -#: describe.c:312 -msgid "Result data type" -msgstr "çµæžœè³‡æ–™åž‹åˆ¥" +# describe.c:480 +#: sql_help.c:36 sql_help.c:39 sql_help.c:42 sql_help.c:330 sql_help.c:1848 +#: sql_help.c:3347 sql_help.c:4468 +msgid "aggregate_signature" +msgstr "aggregate_signature" + +#: sql_help.c:37 sql_help.c:67 sql_help.c:82 sql_help.c:120 sql_help.c:253 +#: sql_help.c:271 sql_help.c:402 sql_help.c:449 sql_help.c:528 sql_help.c:576 +#: sql_help.c:594 sql_help.c:621 sql_help.c:674 sql_help.c:743 sql_help.c:798 +#: sql_help.c:819 sql_help.c:858 sql_help.c:908 sql_help.c:955 sql_help.c:1008 +#: sql_help.c:1040 sql_help.c:1050 sql_help.c:1085 sql_help.c:1105 +#: sql_help.c:1119 sql_help.c:1169 sql_help.c:1317 sql_help.c:1444 +#: sql_help.c:1487 sql_help.c:1508 sql_help.c:1522 sql_help.c:1534 +#: sql_help.c:1547 sql_help.c:1574 sql_help.c:1640 sql_help.c:1693 +msgid "new_name" +msgstr "new_name" -# describe.c:178 -#: describe.c:85 -#: describe.c:89 -#: describe.c:250 -#: describe.c:296 -#: describe.c:313 -msgid "Argument data types" -msgstr "åƒæ•¸è³‡æ–™åž‹åˆ¥" +#: sql_help.c:40 sql_help.c:69 sql_help.c:84 sql_help.c:122 sql_help.c:251 +#: sql_help.c:269 sql_help.c:400 sql_help.c:485 sql_help.c:533 sql_help.c:623 +#: sql_help.c:632 sql_help.c:697 sql_help.c:717 sql_help.c:746 sql_help.c:801 +#: sql_help.c:863 sql_help.c:906 sql_help.c:1013 sql_help.c:1052 +#: sql_help.c:1083 sql_help.c:1103 sql_help.c:1117 sql_help.c:1167 +#: sql_help.c:1381 sql_help.c:1446 sql_help.c:1489 sql_help.c:1510 +#: sql_help.c:1572 sql_help.c:1688 sql_help.c:3019 +msgid "new_owner" +msgstr "new_owner" -# describe.c:97 -#: describe.c:114 -msgid "List of aggregate functions" -msgstr "èšé›†å‡½æ•¸åˆ—表" +# catalog/dependency.c:1714 +#: sql_help.c:43 sql_help.c:71 sql_help.c:86 sql_help.c:255 sql_help.c:322 +#: sql_help.c:451 sql_help.c:538 sql_help.c:676 sql_help.c:721 sql_help.c:749 +#: sql_help.c:804 sql_help.c:868 sql_help.c:1018 sql_help.c:1087 +#: sql_help.c:1121 sql_help.c:1319 sql_help.c:1491 sql_help.c:1512 +#: sql_help.c:1524 sql_help.c:1536 sql_help.c:1576 sql_help.c:1695 +msgid "new_schema" +msgstr "new_schema" -# describe.c:117 -#: describe.c:135 -#, c-format -msgid "The server (version %d.%d) does not support tablespaces.\n" -msgstr "伺æœå™¨ (版本 %d.%d) 䏿”¯æ´è³‡æ–™è¡¨ç©ºé–“。\n" +# describe.c:1174 +#: sql_help.c:44 sql_help.c:1912 sql_help.c:3348 sql_help.c:4497 +msgid "where aggregate_signature is:" +msgstr "其中 aggregate_signature 是:" + +#: sql_help.c:45 sql_help.c:48 sql_help.c:51 sql_help.c:340 sql_help.c:353 +#: sql_help.c:357 sql_help.c:373 sql_help.c:376 sql_help.c:379 sql_help.c:520 +#: sql_help.c:525 sql_help.c:530 sql_help.c:535 sql_help.c:540 sql_help.c:850 +#: sql_help.c:855 sql_help.c:860 sql_help.c:865 sql_help.c:870 sql_help.c:1000 +#: sql_help.c:1005 sql_help.c:1010 sql_help.c:1015 sql_help.c:1020 +#: sql_help.c:1866 sql_help.c:1883 sql_help.c:1889 sql_help.c:1913 +#: sql_help.c:1916 sql_help.c:1919 sql_help.c:2070 sql_help.c:2089 +#: sql_help.c:2092 sql_help.c:2394 sql_help.c:2603 sql_help.c:3349 +#: sql_help.c:3352 sql_help.c:3355 sql_help.c:3446 sql_help.c:3535 +#: sql_help.c:3563 sql_help.c:3915 sql_help.c:4367 sql_help.c:4474 +#: sql_help.c:4481 sql_help.c:4487 sql_help.c:4498 sql_help.c:4501 +#: sql_help.c:4504 +msgid "argmode" +msgstr "argmode" -# describe.c:128 -#: describe.c:148 -msgid "Location" -msgstr "所在地" +#: sql_help.c:46 sql_help.c:49 sql_help.c:52 sql_help.c:341 sql_help.c:354 +#: sql_help.c:358 sql_help.c:374 sql_help.c:377 sql_help.c:380 sql_help.c:521 +#: sql_help.c:526 sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:851 +#: sql_help.c:856 sql_help.c:861 sql_help.c:866 sql_help.c:871 sql_help.c:1001 +#: sql_help.c:1006 sql_help.c:1011 sql_help.c:1016 sql_help.c:1021 +#: sql_help.c:1867 sql_help.c:1884 sql_help.c:1890 sql_help.c:1914 +#: sql_help.c:1917 sql_help.c:1920 sql_help.c:2071 sql_help.c:2090 +#: sql_help.c:2093 sql_help.c:2395 sql_help.c:2604 sql_help.c:3350 +#: sql_help.c:3353 sql_help.c:3356 sql_help.c:3447 sql_help.c:3536 +#: sql_help.c:3564 sql_help.c:4475 sql_help.c:4482 sql_help.c:4488 +#: sql_help.c:4499 sql_help.c:4502 sql_help.c:4505 +msgid "argname" +msgstr "argname" -# describe.c:150 -#: describe.c:176 -msgid "List of tablespaces" -msgstr "表空間列表" +# describe.c:1689 +#: sql_help.c:47 sql_help.c:50 sql_help.c:53 sql_help.c:342 sql_help.c:355 +#: sql_help.c:359 sql_help.c:375 sql_help.c:378 sql_help.c:381 sql_help.c:522 +#: sql_help.c:527 sql_help.c:532 sql_help.c:537 sql_help.c:542 sql_help.c:852 +#: sql_help.c:857 sql_help.c:862 sql_help.c:867 sql_help.c:872 sql_help.c:1002 +#: sql_help.c:1007 sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 +#: sql_help.c:1868 sql_help.c:1885 sql_help.c:1891 sql_help.c:1915 +#: sql_help.c:1918 sql_help.c:1921 sql_help.c:2396 sql_help.c:2605 +#: sql_help.c:3351 sql_help.c:3354 sql_help.c:3357 sql_help.c:3448 +#: sql_help.c:3537 sql_help.c:3565 sql_help.c:4476 sql_help.c:4483 +#: sql_help.c:4489 sql_help.c:4500 sql_help.c:4503 sql_help.c:4506 +msgid "argtype" +msgstr "argtype" -#: describe.c:213 -#, c-format -msgid "\\df only takes [antwS+] as options\n" -msgstr "\\df åªæŽ¥å— [antwS+] åšç‚ºé¸é …\n" +# postmaster/postmaster.c:1017 tcop/postgres.c:2115 +#: sql_help.c:114 sql_help.c:397 sql_help.c:474 sql_help.c:486 sql_help.c:949 +#: sql_help.c:1100 sql_help.c:1505 sql_help.c:1634 sql_help.c:1666 +#: sql_help.c:1719 sql_help.c:1783 sql_help.c:1970 sql_help.c:1977 +#: sql_help.c:2285 sql_help.c:2335 sql_help.c:2342 sql_help.c:2351 +#: sql_help.c:2440 sql_help.c:2667 sql_help.c:2760 sql_help.c:3048 +#: sql_help.c:3233 sql_help.c:3255 sql_help.c:3395 sql_help.c:3751 +#: sql_help.c:3959 sql_help.c:4194 sql_help.c:4196 sql_help.c:4973 +msgid "option" +msgstr "option" -#: describe.c:219 -#, c-format -msgid "\\df does not take a \"w\" option with server version %d.%d\n" -msgstr "\\df ä¸æŽ¥å— \"w\" é¸é …æ­é…伺æœå™¨ç‰ˆæœ¬ %d.%d\n" +#: sql_help.c:115 sql_help.c:950 sql_help.c:1635 sql_help.c:2441 +#: sql_help.c:2668 sql_help.c:3234 sql_help.c:3396 +msgid "where option can be:" +msgstr "其中 option å¯ä»¥æ˜¯:" -#. translator: "agg" is short for "aggregate" -#: describe.c:252 -#: describe.c:298 -#: describe.c:315 -msgid "agg" -msgstr "agg" +#: sql_help.c:116 sql_help.c:2217 +msgid "allowconn" +msgstr "allowconn" -#: describe.c:253 -msgid "window" -msgstr "window" +#: sql_help.c:117 sql_help.c:951 sql_help.c:1636 sql_help.c:2218 +#: sql_help.c:2442 sql_help.c:2669 sql_help.c:3235 +msgid "connlimit" +msgstr "connlimit" -# describe.c:575 -#: describe.c:254 -#: describe.c:299 -#: describe.c:316 -#: describe.c:990 -msgid "trigger" -msgstr "trigger" +#: sql_help.c:118 sql_help.c:2219 +msgid "istemplate" +msgstr "istemplate" -# help.c:211 -#: describe.c:255 -#: describe.c:300 -#: describe.c:317 -msgid "normal" -msgstr "normal" +# describe.c:1342 +#: sql_help.c:124 sql_help.c:611 sql_help.c:679 sql_help.c:693 sql_help.c:1322 +#: sql_help.c:1374 sql_help.c:4200 +msgid "new_tablespace" +msgstr "new_tablespace" -# describe.c:415 -# describe.c:745 -# describe.c:1478 -# describe.c:1587 -#: describe.c:256 -#: describe.c:301 -#: describe.c:318 -#: describe.c:710 -#: describe.c:792 -#: describe.c:1362 -#: describe.c:2517 -#: describe.c:2705 -#: describe.c:3681 -msgid "Type" -msgstr "型別" +# sql_help.h:366 +#: sql_help.c:127 sql_help.c:130 sql_help.c:132 sql_help.c:548 sql_help.c:550 +#: sql_help.c:551 sql_help.c:875 sql_help.c:877 sql_help.c:878 sql_help.c:958 +#: sql_help.c:962 sql_help.c:965 sql_help.c:1027 sql_help.c:1029 +#: sql_help.c:1030 sql_help.c:1180 sql_help.c:1183 sql_help.c:1643 +#: sql_help.c:1647 sql_help.c:1650 sql_help.c:2406 sql_help.c:2609 +#: sql_help.c:3927 sql_help.c:4218 sql_help.c:4379 sql_help.c:4688 +msgid "configuration_parameter" +msgstr "configuration_parameter" # describe.c:415 # describe.c:543 # describe.c:1477 -#: describe.c:331 -msgid "immutable" -msgstr "ä¸å¯è®Š" +#: sql_help.c:128 sql_help.c:398 sql_help.c:469 sql_help.c:475 sql_help.c:487 +#: sql_help.c:549 sql_help.c:603 sql_help.c:685 sql_help.c:695 sql_help.c:876 +#: sql_help.c:904 sql_help.c:959 sql_help.c:1028 sql_help.c:1101 +#: sql_help.c:1146 sql_help.c:1150 sql_help.c:1154 sql_help.c:1157 +#: sql_help.c:1162 sql_help.c:1165 sql_help.c:1181 sql_help.c:1182 +#: sql_help.c:1353 sql_help.c:1376 sql_help.c:1424 sql_help.c:1449 +#: sql_help.c:1506 sql_help.c:1590 sql_help.c:1644 sql_help.c:1667 +#: sql_help.c:2286 sql_help.c:2336 sql_help.c:2343 sql_help.c:2352 +#: sql_help.c:2407 sql_help.c:2408 sql_help.c:2472 sql_help.c:2475 +#: sql_help.c:2509 sql_help.c:2610 sql_help.c:2611 sql_help.c:2634 +#: sql_help.c:2761 sql_help.c:2800 sql_help.c:2910 sql_help.c:2923 +#: sql_help.c:2937 sql_help.c:2978 sql_help.c:3005 sql_help.c:3022 +#: sql_help.c:3049 sql_help.c:3256 sql_help.c:3960 sql_help.c:4689 +#: sql_help.c:4690 sql_help.c:4691 sql_help.c:4692 +msgid "value" +msgstr "value" -# describe.c:415 -# describe.c:543 -# describe.c:1477 -#: describe.c:332 -msgid "stable" -msgstr "穩定" +#: sql_help.c:200 +msgid "target_role" +msgstr "target_role" -#: describe.c:333 -msgid "volatile" -msgstr "volatile" +#: sql_help.c:201 sql_help.c:913 sql_help.c:2270 sql_help.c:2639 +#: sql_help.c:2716 sql_help.c:2721 sql_help.c:3890 sql_help.c:3899 +#: sql_help.c:3918 sql_help.c:3930 sql_help.c:4342 sql_help.c:4351 +#: sql_help.c:4370 sql_help.c:4382 +msgid "schema_name" +msgstr "schema_name" -#: describe.c:334 -msgid "Volatility" -msgstr "æ®ç™¼æ€§" +#: sql_help.c:202 +msgid "abbreviated_grant_or_revoke" +msgstr "abbreviated_grant_or_revoke" -# describe.c:186 -#: describe.c:336 -msgid "Language" -msgstr "程åºèªžè¨€" +#: sql_help.c:203 +msgid "where abbreviated_grant_or_revoke is one of:" +msgstr "其中 abbreviated_grant_or_revoke å¯ä»¥æ˜¯:" -# describe.c:187 -#: describe.c:337 -msgid "Source code" -msgstr "原始程å¼" +# describe.c:1375 +#: sql_help.c:204 sql_help.c:205 sql_help.c:206 sql_help.c:207 sql_help.c:208 +#: sql_help.c:209 sql_help.c:210 sql_help.c:211 sql_help.c:212 sql_help.c:213 +#: sql_help.c:574 sql_help.c:610 sql_help.c:678 sql_help.c:822 sql_help.c:969 +#: sql_help.c:1321 sql_help.c:1654 sql_help.c:2445 sql_help.c:2446 +#: sql_help.c:2447 sql_help.c:2448 sql_help.c:2449 sql_help.c:2583 +#: sql_help.c:2672 sql_help.c:2673 sql_help.c:2674 sql_help.c:2675 +#: sql_help.c:2676 sql_help.c:3238 sql_help.c:3239 sql_help.c:3240 +#: sql_help.c:3241 sql_help.c:3242 sql_help.c:3939 sql_help.c:3943 +#: sql_help.c:4391 sql_help.c:4395 sql_help.c:4710 +msgid "role_name" +msgstr "role_name" -# describe.c:221 -#: describe.c:435 -msgid "List of functions" -msgstr "函弿¸…å–®" +#: sql_help.c:239 sql_help.c:462 sql_help.c:912 sql_help.c:1337 sql_help.c:1339 +#: sql_help.c:1391 sql_help.c:1403 sql_help.c:1428 sql_help.c:1684 +#: sql_help.c:2239 sql_help.c:2243 sql_help.c:2355 sql_help.c:2360 +#: sql_help.c:2468 sql_help.c:2638 sql_help.c:2777 sql_help.c:2782 +#: sql_help.c:2784 sql_help.c:2905 sql_help.c:2918 sql_help.c:2932 +#: sql_help.c:2941 sql_help.c:2953 sql_help.c:2982 sql_help.c:3991 +#: sql_help.c:4006 sql_help.c:4008 sql_help.c:4095 sql_help.c:4098 +#: sql_help.c:4100 sql_help.c:4561 sql_help.c:4562 sql_help.c:4571 +#: sql_help.c:4618 sql_help.c:4619 sql_help.c:4620 sql_help.c:4621 +#: sql_help.c:4622 sql_help.c:4623 sql_help.c:4663 sql_help.c:4664 +#: sql_help.c:4669 sql_help.c:4674 sql_help.c:4818 sql_help.c:4819 +#: sql_help.c:4828 sql_help.c:4875 sql_help.c:4876 sql_help.c:4877 +#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4880 sql_help.c:4934 +#: sql_help.c:4936 sql_help.c:5004 sql_help.c:5064 sql_help.c:5065 +#: sql_help.c:5074 sql_help.c:5121 sql_help.c:5122 sql_help.c:5123 +#: sql_help.c:5124 sql_help.c:5125 sql_help.c:5126 +msgid "expression" +msgstr "expression" -# describe.c:257 -#: describe.c:474 -msgid "Internal name" -msgstr "內部å稱" +#: sql_help.c:242 +msgid "domain_constraint" +msgstr "domain_constraint" -# describe.c:257 -#: describe.c:475 -#: describe.c:653 -#: describe.c:2534 -#: describe.c:2538 -msgid "Size" -msgstr "大å°" +# catalog/dependency.c:1511 +#: sql_help.c:244 sql_help.c:246 sql_help.c:249 sql_help.c:477 sql_help.c:478 +#: sql_help.c:1314 sql_help.c:1361 sql_help.c:1362 sql_help.c:1363 +#: sql_help.c:1390 sql_help.c:1402 sql_help.c:1419 sql_help.c:1854 +#: sql_help.c:1856 sql_help.c:2242 sql_help.c:2354 sql_help.c:2359 +#: sql_help.c:2940 sql_help.c:2952 sql_help.c:4003 +msgid "constraint_name" +msgstr "constraint_name" -#: describe.c:496 -msgid "Elements" -msgstr "元素" +# catalog/dependency.c:1511 +#: sql_help.c:247 sql_help.c:1315 +msgid "new_constraint_name" +msgstr "new_constraint_name" -# describe.c:289 -#: describe.c:541 -msgid "List of data types" -msgstr "資料型別清單" +#: sql_help.c:320 sql_help.c:1099 +msgid "new_version" +msgstr "new_version" -# describe.c:321 -#: describe.c:587 -msgid "Left arg type" -msgstr "å·¦åƒæ•¸åž‹åˆ¥" +#: sql_help.c:324 sql_help.c:326 +msgid "member_object" +msgstr "member_object" -# describe.c:321 -#: describe.c:588 -msgid "Right arg type" -msgstr "å³åƒæ•¸åž‹åˆ¥" +#: sql_help.c:327 +msgid "where member_object is:" +msgstr "其中 member_object 是:" -# describe.c:322 -#: describe.c:589 -msgid "Result type" -msgstr "çµæžœåž‹åˆ¥" +# describe.c:1375 +#: sql_help.c:328 sql_help.c:333 sql_help.c:334 sql_help.c:335 sql_help.c:336 +#: sql_help.c:337 sql_help.c:338 sql_help.c:343 sql_help.c:347 sql_help.c:349 +#: sql_help.c:351 sql_help.c:360 sql_help.c:361 sql_help.c:362 sql_help.c:363 +#: sql_help.c:364 sql_help.c:365 sql_help.c:366 sql_help.c:367 sql_help.c:370 +#: sql_help.c:371 sql_help.c:1846 sql_help.c:1851 sql_help.c:1858 +#: sql_help.c:1859 sql_help.c:1860 sql_help.c:1861 sql_help.c:1862 +#: sql_help.c:1863 sql_help.c:1864 sql_help.c:1869 sql_help.c:1871 +#: sql_help.c:1875 sql_help.c:1877 sql_help.c:1881 sql_help.c:1886 +#: sql_help.c:1887 sql_help.c:1894 sql_help.c:1895 sql_help.c:1896 +#: sql_help.c:1897 sql_help.c:1898 sql_help.c:1899 sql_help.c:1900 +#: sql_help.c:1901 sql_help.c:1902 sql_help.c:1903 sql_help.c:1904 +#: sql_help.c:1909 sql_help.c:1910 sql_help.c:4464 sql_help.c:4469 +#: sql_help.c:4470 sql_help.c:4471 sql_help.c:4472 sql_help.c:4478 +#: sql_help.c:4479 sql_help.c:4484 sql_help.c:4485 sql_help.c:4490 +#: sql_help.c:4491 sql_help.c:4492 sql_help.c:4493 sql_help.c:4494 +#: sql_help.c:4495 +msgid "object_name" +msgstr "object_name" -# describe.c:336 -#: describe.c:608 -msgid "List of operators" -msgstr "é‹ç®—å­æ¸…å–®" +# describe.c:480 +#: sql_help.c:329 sql_help.c:1847 sql_help.c:4467 +msgid "aggregate_name" +msgstr "aggregate_name" -# describe.c:365 -#: describe.c:638 -msgid "Encoding" -msgstr "字元編碼" +# describe.c:1688 +#: sql_help.c:331 sql_help.c:1849 sql_help.c:2135 sql_help.c:2139 +#: sql_help.c:2141 sql_help.c:3365 +msgid "source_type" +msgstr "source_type" -# describe.c:128 -#: describe.c:643 -#: describe.c:2910 -msgid "Collate" -msgstr "Collate" +# describe.c:1689 +#: sql_help.c:332 sql_help.c:1850 sql_help.c:2136 sql_help.c:2140 +#: sql_help.c:2142 sql_help.c:3366 +msgid "target_type" +msgstr "target_type" -# describe.c:415 -# describe.c:745 -# describe.c:1478 -# describe.c:1587 -#: describe.c:644 -#: describe.c:2911 -msgid "Ctype" -msgstr "轉æ›åž‹åˆ¥" +# describe.c:498 +#: sql_help.c:339 sql_help.c:786 sql_help.c:1865 sql_help.c:2137 +#: sql_help.c:2180 sql_help.c:2258 sql_help.c:2526 sql_help.c:2557 +#: sql_help.c:3125 sql_help.c:4366 sql_help.c:4473 sql_help.c:4590 +#: sql_help.c:4594 sql_help.c:4598 sql_help.c:4601 sql_help.c:4847 +#: sql_help.c:4851 sql_help.c:4855 sql_help.c:4858 sql_help.c:5093 +#: sql_help.c:5097 sql_help.c:5101 sql_help.c:5104 +msgid "function_name" +msgstr "function_name" -# describe.c:1342 -#: describe.c:657 -msgid "Tablespace" -msgstr "表空間" +# describe.c:512 +#: sql_help.c:344 sql_help.c:779 sql_help.c:1872 sql_help.c:2550 +msgid "operator_name" +msgstr "operator_name" -# describe.c:381 -#: describe.c:674 -msgid "List of databases" -msgstr "資料庫清單" +# describe.c:321 +#: sql_help.c:345 sql_help.c:715 sql_help.c:719 sql_help.c:723 sql_help.c:1873 +#: sql_help.c:2527 sql_help.c:3489 +msgid "left_type" +msgstr "left_type" -# describe.c:415 -# describe.c:543 -# describe.c:1477 -#: describe.c:708 -#: describe.c:789 -#: describe.c:944 -#: describe.c:2511 -#: sql_help.c:595 -#: sql_help.c:844 -#: sql_help.c:971 -#: sql_help.c:1434 -#: sql_help.c:1564 -#: sql_help.c:1598 -#: sql_help.c:1844 -#: sql_help.c:2002 -#: sql_help.c:2187 -#: sql_help.c:2268 -#: sql_help.c:2474 -#: sql_help.c:3105 -#: sql_help.c:3125 -#: sql_help.c:3127 -#: sql_help.c:3128 -msgid "table" -msgstr "table" +# describe.c:321 +#: sql_help.c:346 sql_help.c:716 sql_help.c:720 sql_help.c:724 sql_help.c:1874 +#: sql_help.c:2528 sql_help.c:3490 +msgid "right_type" +msgstr "right_type" -# describe.c:415 -# describe.c:543 -# describe.c:1477 -#: describe.c:708 -#: describe.c:945 -#: describe.c:2512 -msgid "view" -msgstr "view" +#: sql_help.c:348 sql_help.c:350 sql_help.c:742 sql_help.c:745 sql_help.c:748 +#: sql_help.c:777 sql_help.c:789 sql_help.c:797 sql_help.c:800 sql_help.c:803 +#: sql_help.c:1408 sql_help.c:1876 sql_help.c:1878 sql_help.c:2547 +#: sql_help.c:2568 sql_help.c:2958 sql_help.c:3499 sql_help.c:3508 +msgid "index_method" +msgstr "index_method" -# describe.c:415 -# describe.c:543 -# describe.c:1477 -#: describe.c:708 -#: describe.c:790 -#: describe.c:947 -#: describe.c:2514 -msgid "sequence" -msgstr "åºåˆ—數" +#: sql_help.c:352 sql_help.c:1882 sql_help.c:4480 +msgid "procedure_name" +msgstr "procedure_name" -# describe.c:933 -#: describe.c:709 -#: describe.c:948 -#: describe.c:2516 -msgid "foreign table" -msgstr "foreign table" +# describe.c:1375 +#: sql_help.c:356 sql_help.c:1888 sql_help.c:3914 sql_help.c:4486 +msgid "routine_name" +msgstr "routine_name" -# sql_help.h:325 -#: describe.c:721 -msgid "Column access privileges" -msgstr "è³‡æ–™è¡Œå­˜å–æ¬Šé™" +#: sql_help.c:368 sql_help.c:1380 sql_help.c:1905 sql_help.c:2402 +#: sql_help.c:2608 sql_help.c:2913 sql_help.c:3092 sql_help.c:3670 +#: sql_help.c:3936 sql_help.c:4388 +msgid "type_name" +msgstr "type_name" -# describe.c:133 -# describe.c:415 -# describe.c:1733 -#: describe.c:747 -#: describe.c:3998 -#: describe.c:4002 -msgid "Access privileges" -msgstr "å­˜å–æ¬Šé™" +#: sql_help.c:369 sql_help.c:1906 sql_help.c:2401 sql_help.c:2607 +#: sql_help.c:3093 sql_help.c:3323 sql_help.c:3671 sql_help.c:3921 +#: sql_help.c:4373 +msgid "lang_name" +msgstr "lang_name" -# describe.c:117 -#: describe.c:775 -#, c-format -msgid "The server (version %d.%d) does not support altering default privileges.\n" -msgstr "伺æœå™¨(版本 %d.%d) 䏿”¯æ´ä¿®æ”¹é è¨­æ¬Šé™ã€‚\n" +#: sql_help.c:372 +msgid "and aggregate_signature is:" +msgstr "且 aggregate_signature 是:" # describe.c:498 -#: describe.c:791 -#: describe.c:883 -msgid "function" -msgstr "函數" - -# sql_help.h:325 -#: describe.c:815 -msgid "Default access privileges" -msgstr "é è¨­å­˜å–權é™" - -# describe.c:469 -#: describe.c:851 -msgid "Object" -msgstr "物件" +#: sql_help.c:395 sql_help.c:2002 sql_help.c:2283 +msgid "handler_function" +msgstr "handler_function" -# describe.c:480 -#: describe.c:863 -msgid "aggregate" -msgstr "èšé›†å‡½æ•¸" +# commands/define.c:279 +#: sql_help.c:396 sql_help.c:2284 +msgid "validator_function" +msgstr "validator_function" -# describe.c:512 -#: describe.c:902 -#: sql_help.c:1717 -#: sql_help.c:2835 -#: sql_help.c:2905 -#: sql_help.c:3038 -#: sql_help.c:3143 -#: sql_help.c:3194 -msgid "operator" -msgstr "é‹ç®—å­" +# describe.c:498 +#: sql_help.c:444 sql_help.c:523 sql_help.c:667 sql_help.c:853 sql_help.c:1003 +#: sql_help.c:1309 sql_help.c:1581 +msgid "action" +msgstr "action" -# describe.c:526 -#: describe.c:921 -msgid "data type" -msgstr "資料型別" +# describe.c:1375 +#: sql_help.c:446 sql_help.c:453 sql_help.c:457 sql_help.c:458 sql_help.c:461 +#: sql_help.c:463 sql_help.c:464 sql_help.c:465 sql_help.c:467 sql_help.c:470 +#: sql_help.c:472 sql_help.c:473 sql_help.c:671 sql_help.c:681 sql_help.c:683 +#: sql_help.c:686 sql_help.c:688 sql_help.c:689 sql_help.c:911 sql_help.c:1080 +#: sql_help.c:1311 sql_help.c:1329 sql_help.c:1333 sql_help.c:1334 +#: sql_help.c:1338 sql_help.c:1340 sql_help.c:1341 sql_help.c:1342 +#: sql_help.c:1343 sql_help.c:1345 sql_help.c:1348 sql_help.c:1349 +#: sql_help.c:1351 sql_help.c:1354 sql_help.c:1356 sql_help.c:1357 +#: sql_help.c:1404 sql_help.c:1406 sql_help.c:1413 sql_help.c:1422 +#: sql_help.c:1427 sql_help.c:1431 sql_help.c:1432 sql_help.c:1683 +#: sql_help.c:1686 sql_help.c:1690 sql_help.c:1728 sql_help.c:1853 +#: sql_help.c:1967 sql_help.c:1973 sql_help.c:1987 sql_help.c:1988 +#: sql_help.c:1989 sql_help.c:2333 sql_help.c:2346 sql_help.c:2399 +#: sql_help.c:2467 sql_help.c:2473 sql_help.c:2506 sql_help.c:2637 +#: sql_help.c:2746 sql_help.c:2781 sql_help.c:2783 sql_help.c:2895 +#: sql_help.c:2904 sql_help.c:2914 sql_help.c:2917 sql_help.c:2927 +#: sql_help.c:2931 sql_help.c:2954 sql_help.c:2956 sql_help.c:2963 +#: sql_help.c:2976 sql_help.c:2981 sql_help.c:2985 sql_help.c:2986 +#: sql_help.c:3002 sql_help.c:3128 sql_help.c:3268 sql_help.c:3893 +#: sql_help.c:3894 sql_help.c:3990 sql_help.c:4005 sql_help.c:4007 +#: sql_help.c:4009 sql_help.c:4094 sql_help.c:4097 sql_help.c:4099 +#: sql_help.c:4345 sql_help.c:4346 sql_help.c:4466 sql_help.c:4627 +#: sql_help.c:4633 sql_help.c:4635 sql_help.c:4884 sql_help.c:4890 +#: sql_help.c:4892 sql_help.c:4933 sql_help.c:4935 sql_help.c:4937 +#: sql_help.c:4992 sql_help.c:5130 sql_help.c:5136 sql_help.c:5138 +msgid "column_name" +msgstr "column_name" -# describe.c:543 -# describe.c:1477 -#: describe.c:946 -#: describe.c:2513 -msgid "index" -msgstr "索引" +# describe.c:1375 +#: sql_help.c:447 sql_help.c:672 sql_help.c:1312 sql_help.c:1691 +msgid "new_column_name" +msgstr "new_column_name" -# describe.c:559 -#: describe.c:969 -msgid "rule" -msgstr "è¦å‰‡" +#: sql_help.c:452 sql_help.c:544 sql_help.c:680 sql_help.c:874 sql_help.c:1024 +#: sql_help.c:1328 sql_help.c:1591 +msgid "where action is one of:" +msgstr "其中 action å¯ä»¥æ˜¯:" -# describe.c:593 -#: describe.c:1013 -msgid "Object descriptions" -msgstr "物件æè¿°" +# describe.c:526 +#: sql_help.c:454 sql_help.c:459 sql_help.c:1072 sql_help.c:1330 +#: sql_help.c:1335 sql_help.c:1593 sql_help.c:1597 sql_help.c:2237 +#: sql_help.c:2334 sql_help.c:2546 sql_help.c:2739 sql_help.c:2896 +#: sql_help.c:3175 sql_help.c:4151 +msgid "data_type" +msgstr "data_type" -# describe.c:641 -#: describe.c:1066 -#, c-format -msgid "Did not find any relation named \"%s\".\n" -msgstr "沒有找到任何å稱為 \"%s\" 的關è¯ã€‚\n" +# describe.c:128 +#: sql_help.c:455 sql_help.c:460 sql_help.c:1331 sql_help.c:1336 +#: sql_help.c:1594 sql_help.c:1598 sql_help.c:2238 sql_help.c:2337 +#: sql_help.c:2469 sql_help.c:2898 sql_help.c:2906 sql_help.c:2919 +#: sql_help.c:2933 sql_help.c:3176 sql_help.c:3182 sql_help.c:4000 +msgid "collation" +msgstr "collation" -# describe.c:728 -#: describe.c:1238 -#, c-format -msgid "Did not find any relation with OID %s.\n" -msgstr "沒有找到任何OID為 %s 的關è¯ã€‚\n" +# catalog/dependency.c:1511 +#: sql_help.c:456 sql_help.c:1332 sql_help.c:2338 sql_help.c:2347 +#: sql_help.c:2899 sql_help.c:2915 sql_help.c:2928 +msgid "column_constraint" +msgstr "column_constraint" -# describe.c:933 -#: describe.c:1314 -#, c-format -msgid "Unlogged table \"%s.%s\"" -msgstr "無日誌資料表 \"%s.%s\"" +#: sql_help.c:466 sql_help.c:608 sql_help.c:682 sql_help.c:1350 sql_help.c:4986 +msgid "integer" +msgstr "integer" -# describe.c:859 -#: describe.c:1317 -#, c-format -msgid "Table \"%s.%s\"" -msgstr "資料表 \"%s.%s\"" +#: sql_help.c:468 sql_help.c:471 sql_help.c:684 sql_help.c:687 sql_help.c:1352 +#: sql_help.c:1355 +msgid "attribute_option" +msgstr "attribute_option" -# describe.c:863 -#: describe.c:1321 -#, c-format -msgid "View \"%s.%s\"" -msgstr "視觀表 \"%s.%s\"" +# catalog/dependency.c:1511 +#: sql_help.c:476 sql_help.c:1359 sql_help.c:2339 sql_help.c:2348 +#: sql_help.c:2900 sql_help.c:2916 sql_help.c:2929 +msgid "table_constraint" +msgstr "table_constraint" -# describe.c:867 -#: describe.c:1325 -#, c-format -msgid "Sequence \"%s.%s\"" -msgstr "åºåˆ—數 \"%s.%s\"" +# describe.c:575 +#: sql_help.c:479 sql_help.c:480 sql_help.c:481 sql_help.c:482 sql_help.c:1364 +#: sql_help.c:1365 sql_help.c:1366 sql_help.c:1367 sql_help.c:1907 +msgid "trigger_name" +msgstr "trigger_name" -# describe.c:871 -#: describe.c:1330 -#, c-format -msgid "Unlogged index \"%s.%s\"" -msgstr "無日誌索引 \"%s.%s\"" +#: sql_help.c:483 sql_help.c:484 sql_help.c:1378 sql_help.c:1379 +#: sql_help.c:2340 sql_help.c:2345 sql_help.c:2903 sql_help.c:2926 +msgid "parent_table" +msgstr "parent_table" -# describe.c:871 -#: describe.c:1333 -#, c-format -msgid "Index \"%s.%s\"" -msgstr "索引 \"%s.%s\"" +#: sql_help.c:543 sql_help.c:600 sql_help.c:669 sql_help.c:873 sql_help.c:1023 +#: sql_help.c:1550 sql_help.c:2269 +msgid "extension_name" +msgstr "extension_name" -# describe.c:875 -#: describe.c:1338 -#, c-format -msgid "Special relation \"%s.%s\"" -msgstr "ç‰¹æ®Šé—œè¯ \"%s.%s\"" +#: sql_help.c:545 sql_help.c:1025 sql_help.c:2403 +msgid "execution_cost" +msgstr "execution_cost" -# describe.c:879 -#: describe.c:1342 -#, c-format -msgid "TOAST table \"%s.%s\"" -msgstr "TOAST 資料表 \"%s.%s\"" +#: sql_help.c:546 sql_help.c:1026 sql_help.c:2404 +msgid "result_rows" +msgstr "result_rows" -# describe.c:883 -#: describe.c:1346 -#, c-format -msgid "Composite type \"%s.%s\"" -msgstr "åˆæˆåž‹åˆ¥ \"%s.%s\"" +# describe.c:498 +#: sql_help.c:547 sql_help.c:2405 +msgid "support_function" +msgstr "support_function" -# describe.c:933 -#: describe.c:1350 -#, c-format -msgid "Foreign table \"%s.%s\"" -msgstr "foreign 資料表 \"%s.%s\"" +# describe.c:1636 +#: sql_help.c:569 sql_help.c:571 sql_help.c:948 sql_help.c:956 sql_help.c:960 +#: sql_help.c:963 sql_help.c:966 sql_help.c:1633 sql_help.c:1641 +#: sql_help.c:1645 sql_help.c:1648 sql_help.c:1651 sql_help.c:2717 +#: sql_help.c:2719 sql_help.c:2722 sql_help.c:2723 sql_help.c:3891 +#: sql_help.c:3892 sql_help.c:3896 sql_help.c:3897 sql_help.c:3900 +#: sql_help.c:3901 sql_help.c:3903 sql_help.c:3904 sql_help.c:3906 +#: sql_help.c:3907 sql_help.c:3909 sql_help.c:3910 sql_help.c:3912 +#: sql_help.c:3913 sql_help.c:3919 sql_help.c:3920 sql_help.c:3922 +#: sql_help.c:3923 sql_help.c:3925 sql_help.c:3926 sql_help.c:3928 +#: sql_help.c:3929 sql_help.c:3931 sql_help.c:3932 sql_help.c:3934 +#: sql_help.c:3935 sql_help.c:3937 sql_help.c:3938 sql_help.c:3940 +#: sql_help.c:3941 sql_help.c:4343 sql_help.c:4344 sql_help.c:4348 +#: sql_help.c:4349 sql_help.c:4352 sql_help.c:4353 sql_help.c:4355 +#: sql_help.c:4356 sql_help.c:4358 sql_help.c:4359 sql_help.c:4361 +#: sql_help.c:4362 sql_help.c:4364 sql_help.c:4365 sql_help.c:4371 +#: sql_help.c:4372 sql_help.c:4374 sql_help.c:4375 sql_help.c:4377 +#: sql_help.c:4378 sql_help.c:4380 sql_help.c:4381 sql_help.c:4383 +#: sql_help.c:4384 sql_help.c:4386 sql_help.c:4387 sql_help.c:4389 +#: sql_help.c:4390 sql_help.c:4392 sql_help.c:4393 +msgid "role_specification" +msgstr "role_specification" + +#: sql_help.c:570 sql_help.c:572 sql_help.c:1664 sql_help.c:2205 +#: sql_help.c:2725 sql_help.c:3253 sql_help.c:3704 sql_help.c:4720 +msgid "user_name" +msgstr "user_name" -# describe.c:744 -#: describe.c:1361 -msgid "Column" -msgstr "欄ä½" +#: sql_help.c:573 sql_help.c:968 sql_help.c:1653 sql_help.c:2724 +#: sql_help.c:3942 sql_help.c:4394 +msgid "where role_specification can be:" +msgstr "其中 role_specification å¯ä»¥æ˜¯:" -# describe.c:752 -#: describe.c:1369 -msgid "Modifiers" -msgstr "修飾詞" +# utils/misc/guc.c:237 +#: sql_help.c:575 +msgid "group_name" +msgstr "group_name" + +# describe.c:1342 +#: sql_help.c:596 sql_help.c:1425 sql_help.c:2216 sql_help.c:2476 +#: sql_help.c:2510 sql_help.c:2911 sql_help.c:2924 sql_help.c:2938 +#: sql_help.c:2979 sql_help.c:3006 sql_help.c:3018 sql_help.c:3933 +#: sql_help.c:4385 +msgid "tablespace_name" +msgstr "tablespace_name" -# describe.c:415 # describe.c:543 # describe.c:1477 -#: describe.c:1374 -msgid "Value" -msgstr "值" - -# describe.c:1636 -#: describe.c:1377 -msgid "Definition" -msgstr "定義" - -# describe.c:1635 -#: describe.c:1381 -msgid "Storage" -msgstr "儲存" +#: sql_help.c:598 sql_help.c:691 sql_help.c:1372 sql_help.c:1382 +#: sql_help.c:1420 sql_help.c:1782 sql_help.c:1785 +msgid "index_name" +msgstr "index_name" -#: describe.c:1427 -#, c-format -msgid "collate %s" -msgstr "collate %s" +#: sql_help.c:602 sql_help.c:605 sql_help.c:694 sql_help.c:696 sql_help.c:1375 +#: sql_help.c:1377 sql_help.c:1423 sql_help.c:2474 sql_help.c:2508 +#: sql_help.c:2909 sql_help.c:2922 sql_help.c:2936 sql_help.c:2977 +#: sql_help.c:3004 +msgid "storage_parameter" +msgstr "storage_parameter" -#: describe.c:1435 -msgid "not null" -msgstr "éž Null" +# describe.c:1375 +#: sql_help.c:607 +msgid "column_number" +msgstr "column_number" -# describe.c:1639 -#. translator: default values of column definitions -#: describe.c:1445 -#, c-format -msgid "default %s" -msgstr "é è¨­å€¼ %s" +# large_obj.c:264 +#: sql_help.c:631 sql_help.c:1870 sql_help.c:4477 +msgid "large_object_oid" +msgstr "large_object_oid" -# describe.c:925 -#: describe.c:1536 -msgid "primary key, " -msgstr "主éµ, " +#: sql_help.c:690 sql_help.c:1358 sql_help.c:2897 +msgid "compression_method" +msgstr "compression_method" -# describe.c:927 -#: describe.c:1538 -msgid "unique, " -msgstr "唯一的, " +#: sql_help.c:692 sql_help.c:1373 +msgid "new_access_method" +msgstr "new_access_method" -# describe.c:933 -#: describe.c:1544 -#, c-format -msgid "for table \"%s.%s\"" -msgstr "給資料表 \"%s.%s\"" +#: sql_help.c:725 sql_help.c:2531 +msgid "res_proc" +msgstr "res_proc" -# describe.c:937 -#: describe.c:1548 -#, c-format -msgid ", predicate (%s)" -msgstr ", 敘述 (%s)" +#: sql_help.c:726 sql_help.c:2532 +msgid "join_proc" +msgstr "join_proc" -# describe.c:940 -#: describe.c:1551 -msgid ", clustered" -msgstr ", å·²å¢é›†" +#: sql_help.c:778 sql_help.c:790 sql_help.c:2549 +msgid "strategy_number" +msgstr "strategy_number" -#: describe.c:1554 -msgid ", invalid" -msgstr ", 無效的" +# describe.c:415 +# describe.c:745 +# describe.c:1478 +# describe.c:1587 +#: sql_help.c:780 sql_help.c:781 sql_help.c:784 sql_help.c:785 sql_help.c:791 +#: sql_help.c:792 sql_help.c:794 sql_help.c:795 sql_help.c:2551 sql_help.c:2552 +#: sql_help.c:2555 sql_help.c:2556 +msgid "op_type" +msgstr "op_type" -#: describe.c:1557 -msgid ", deferrable" -msgstr ", deferrable" +#: sql_help.c:782 sql_help.c:2553 +msgid "sort_family_name" +msgstr "sort_family_name" -#: describe.c:1560 -msgid ", initially deferred" -msgstr ", initially deferred" +#: sql_help.c:783 sql_help.c:793 sql_help.c:2554 +msgid "support_number" +msgstr "support_number" -# describe.c:977 -#: describe.c:1574 -msgid "View definition:" -msgstr "視圖定義:" +# describe.c:1689 +#: sql_help.c:787 sql_help.c:2138 sql_help.c:2558 sql_help.c:3095 +#: sql_help.c:3097 +msgid "argument_type" +msgstr "argument_type" -# describe.c:983 -# describe.c:1204 -#: describe.c:1591 -#: describe.c:1879 -msgid "Rules:" -msgstr "è¦å‰‡:" +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: sql_help.c:818 sql_help.c:821 sql_help.c:910 sql_help.c:1039 sql_help.c:1079 +#: sql_help.c:1546 sql_help.c:1549 sql_help.c:1727 sql_help.c:1781 +#: sql_help.c:1784 sql_help.c:1855 sql_help.c:1880 sql_help.c:1893 +#: sql_help.c:1908 sql_help.c:1966 sql_help.c:1972 sql_help.c:2332 +#: sql_help.c:2344 sql_help.c:2465 sql_help.c:2505 sql_help.c:2582 +#: sql_help.c:2636 sql_help.c:2693 sql_help.c:2745 sql_help.c:2778 +#: sql_help.c:2785 sql_help.c:2894 sql_help.c:2912 sql_help.c:2925 +#: sql_help.c:3001 sql_help.c:3121 sql_help.c:3302 sql_help.c:3525 +#: sql_help.c:3574 sql_help.c:3680 sql_help.c:3889 sql_help.c:3895 +#: sql_help.c:3956 sql_help.c:3988 sql_help.c:4341 sql_help.c:4347 +#: sql_help.c:4465 sql_help.c:4576 sql_help.c:4578 sql_help.c:4640 +#: sql_help.c:4679 sql_help.c:4833 sql_help.c:4835 sql_help.c:4897 +#: sql_help.c:4931 sql_help.c:4991 sql_help.c:5079 sql_help.c:5081 +#: sql_help.c:5143 +msgid "table_name" +msgstr "table_name" -# describe.c:1138 -#: describe.c:1650 -msgid "Indexes:" -msgstr "索引:" +#: sql_help.c:823 sql_help.c:2584 +msgid "using_expression" +msgstr "using_expression" -# describe.c:1174 -#: describe.c:1730 -msgid "Check constraints:" -msgstr "檢查æ¢ä»¶ç´„æŸ" +#: sql_help.c:824 sql_help.c:2585 +msgid "check_expression" +msgstr "check_expression" -# describe.c:1189 -#: describe.c:1763 -msgid "Foreign-key constraints:" -msgstr "外鵿¢ä»¶ç´„æŸ:" +# describe.c:1636 +#: sql_help.c:897 sql_help.c:899 sql_help.c:901 sql_help.c:2632 +msgid "publication_object" +msgstr "publication_object" -#: describe.c:1797 -msgid "Referenced by:" -msgstr "åƒè€ƒè€…:" +# sql_help.h:366 +#: sql_help.c:903 sql_help.c:2633 +msgid "publication_parameter" +msgstr "publication_parameter" -#: describe.c:1882 -msgid "Disabled rules:" -msgstr "å·²åœç”¨è¦å‰‡:" +#: sql_help.c:909 sql_help.c:2635 +msgid "where publication_object is one of:" +msgstr "其中 publication_object å¯ä»¥æ˜¯:" -#: describe.c:1885 -msgid "Rules firing always:" -msgstr "æ°¸é å¼•發è¦å‰‡:" +# command.c:915 +# command.c:939 +# startup.c:187 +# startup.c:205 +#: sql_help.c:952 sql_help.c:1637 sql_help.c:2443 sql_help.c:2670 +#: sql_help.c:3236 +msgid "password" +msgstr "password" -#: describe.c:1888 -msgid "Rules firing on replica only:" -msgstr "åªåœ¨è¤‡æœ¬å¼•發è¦å‰‡:" +#: sql_help.c:953 sql_help.c:1638 sql_help.c:2444 sql_help.c:2671 +#: sql_help.c:3237 +msgid "timestamp" +msgstr "timestamp" -# describe.c:1223 -#: describe.c:1996 -msgid "Triggers:" -msgstr "觸發器:" +# commands/user.c:240 commands/user.c:371 +#: sql_help.c:957 sql_help.c:961 sql_help.c:964 sql_help.c:967 sql_help.c:1642 +#: sql_help.c:1646 sql_help.c:1649 sql_help.c:1652 sql_help.c:3902 +#: sql_help.c:4354 +msgid "database_name" +msgstr "database_name" -#: describe.c:1999 -msgid "Disabled triggers:" -msgstr "åœç”¨è§¸ç™¼å™¨: " +#: sql_help.c:1073 sql_help.c:2740 +msgid "increment" +msgstr "increment" -#: describe.c:2002 -msgid "Triggers firing always:" -msgstr "æ°¸é å¼•發觸發程åº:" +#: sql_help.c:1074 sql_help.c:2741 +msgid "minvalue" +msgstr "minvalue" -#: describe.c:2005 -msgid "Triggers firing on replica only:" -msgstr "åªåœ¨è¤‡æœ¬å¼•發觸發程åº:" +#: sql_help.c:1075 sql_help.c:2742 +msgid "maxvalue" +msgstr "maxvalue" -# describe.c:1245 -#: describe.c:2071 -msgid "Inherits" -msgstr "繼承" +#: sql_help.c:1076 sql_help.c:2743 sql_help.c:4574 sql_help.c:4677 +#: sql_help.c:4831 sql_help.c:5008 sql_help.c:5077 +msgid "start" +msgstr "start" -#: describe.c:2101 -#, c-format -msgid "Number of child tables: %d (Use \\d+ to list them.)" -msgstr "å­è³‡æ–™è¡¨æ•¸é‡: %d (用 \\d+ 列出。)" +#: sql_help.c:1077 sql_help.c:1347 +msgid "restart" +msgstr "restart" -#: describe.c:2108 -msgid "Child tables" -msgstr "å­è³‡æ–™è¡¨" +#: sql_help.c:1078 sql_help.c:2744 +msgid "cache" +msgstr "cache" -#: describe.c:2130 -#, c-format -msgid "Typed table of type: %s" -msgstr "" +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: sql_help.c:1123 +msgid "new_target" +msgstr "new_target" -# describe.c:1259 -#: describe.c:2137 -msgid "Has OIDs" -msgstr "有 OID" - -# describe.c:1262 -# describe.c:1637 -# describe.c:1694 -#: describe.c:2140 -#: describe.c:2777 -#: describe.c:2851 -msgid "yes" -msgstr "是" +#: sql_help.c:1142 sql_help.c:2797 +msgid "conninfo" +msgstr "conninfo" -# describe.c:1262 -# describe.c:1638 -# describe.c:1692 -#: describe.c:2140 -#: describe.c:2777 -#: describe.c:2851 -msgid "no" -msgstr "å¦" +# describe.c:498 +#: sql_help.c:1144 sql_help.c:1148 sql_help.c:1152 sql_help.c:2798 +msgid "publication_name" +msgstr "publication_name" -# postmaster/postmaster.c:1017 tcop/postgres.c:2115 -#: describe.c:2148 -#: describe.c:3619 -#: describe.c:3683 -#: describe.c:3739 -#: describe.c:3794 -msgid "Options" -msgstr "é¸é …" +# describe.c:1636 +#: sql_help.c:1145 sql_help.c:1149 sql_help.c:1153 +msgid "publication_option" +msgstr "publication_option" -# describe.c:1342 -#: describe.c:2233 -#, c-format -msgid "Tablespace: \"%s\"" -msgstr "資料表空間: \"%s\"" +# help.c:88 +#: sql_help.c:1156 +msgid "refresh_option" +msgstr "refresh_option" -# describe.c:1342 -#: describe.c:2246 -#, c-format -msgid ", tablespace \"%s\"" -msgstr ",資料表空間 \"%s\"" +# sql_help.h:366 +#: sql_help.c:1161 sql_help.c:2799 +msgid "subscription_parameter" +msgstr "subscription_parameter" -# describe.c:1431 -#: describe.c:2328 -msgid "List of roles" -msgstr "角色清單" +# help.c:88 +#: sql_help.c:1164 +msgid "skip_option" +msgstr "skip_option" -# describe.c:1375 -#: describe.c:2330 -msgid "Role name" -msgstr "角色å稱" +#: sql_help.c:1324 sql_help.c:1327 +msgid "partition_name" +msgstr "partition_name" -#: describe.c:2331 -msgid "Attributes" -msgstr "屬性" +#: sql_help.c:1325 sql_help.c:2349 sql_help.c:2930 +msgid "partition_bound_spec" +msgstr "partition_bound_spec" -#: describe.c:2332 -msgid "Member of" -msgstr "æˆå“¡å±¬æ–¼" +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: sql_help.c:1344 sql_help.c:1394 sql_help.c:2944 +msgid "sequence_options" +msgstr "sequence_options" -# describe.c:1377 -#: describe.c:2343 -msgid "Superuser" -msgstr "超級用戶" +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: sql_help.c:1346 +msgid "sequence_option" +msgstr "sequence_option" -#: describe.c:2346 -msgid "No inheritance" -msgstr "無繼承" +#: sql_help.c:1360 +msgid "table_constraint_using_index" +msgstr "table_constraint_using_index" -#: describe.c:2349 -msgid "Create role" -msgstr "建立角色" +#: sql_help.c:1368 sql_help.c:1369 sql_help.c:1370 sql_help.c:1371 +msgid "rewrite_rule_name" +msgstr "rewrite_rule_name" -#: describe.c:2352 -msgid "Create DB" -msgstr "建立 DB" +#: sql_help.c:1383 sql_help.c:2361 sql_help.c:2969 +msgid "and partition_bound_spec is:" +msgstr "且 partition_bound_spec 是:" -#: describe.c:2355 -msgid "Cannot login" -msgstr "無法登入" +#: sql_help.c:1384 sql_help.c:1385 sql_help.c:1386 sql_help.c:2362 +#: sql_help.c:2363 sql_help.c:2364 sql_help.c:2970 sql_help.c:2971 +#: sql_help.c:2972 +msgid "partition_bound_expr" +msgstr "partition_bound_expr" -# describe.c:1636 -#: describe.c:2359 -msgid "Replication" -msgstr "複製" +#: sql_help.c:1387 sql_help.c:1388 sql_help.c:2365 sql_help.c:2366 +#: sql_help.c:2973 sql_help.c:2974 +msgid "numeric_literal" +msgstr "numeric_literal" -# help.c:123 -#: describe.c:2368 -msgid "No connections" -msgstr "無連線" +# describe.c:1174 +#: sql_help.c:1389 +msgid "and column_constraint is:" +msgstr "且 column_constraint 是:" -# help.c:123 -#: describe.c:2370 -#, c-format -msgid "%d connection" -msgid_plural "%d connections" -msgstr[0] "%d 連線" +# describe.c:1639 +#: sql_help.c:1392 sql_help.c:2356 sql_help.c:2397 sql_help.c:2606 +#: sql_help.c:2942 +msgid "default_expr" +msgstr "default_expr" -#: describe.c:2437 -#, c-format -msgid "No per-database role settings support in this server version.\n" -msgstr "此伺æœå™¨ç‰ˆæœ¬ä¸æ”¯æ´ç¨ç«‹è³‡æ–™åº« role 設定。\n" +#: sql_help.c:1393 sql_help.c:2357 sql_help.c:2943 +msgid "generation_expr" +msgstr "generation_expr" -# describe.c:1542 -#: describe.c:2448 -#, c-format -msgid "No matching settings found.\n" -msgstr "沒有找到符åˆçš„設定。\n" +#: sql_help.c:1395 sql_help.c:1396 sql_help.c:1405 sql_help.c:1407 +#: sql_help.c:1411 sql_help.c:2945 sql_help.c:2946 sql_help.c:2955 +#: sql_help.c:2957 sql_help.c:2961 +msgid "index_parameters" +msgstr "index_parameters" -# describe.c:1544 -#: describe.c:2450 -#, c-format -msgid "No settings found.\n" -msgstr "找ä¸åˆ°è¨­å®šã€‚\n" +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: sql_help.c:1397 sql_help.c:1414 sql_help.c:2947 sql_help.c:2964 +msgid "reftable" +msgstr "reftable" -# describe.c:1549 -#: describe.c:2455 -msgid "List of settings" -msgstr "設定清單" +# describe.c:744 +#: sql_help.c:1398 sql_help.c:1415 sql_help.c:2948 sql_help.c:2965 +msgid "refcolumn" +msgstr "refcolumn" -# describe.c:1478 -#: describe.c:2515 -msgid "special" -msgstr "特殊" +#: sql_help.c:1399 sql_help.c:1400 sql_help.c:1416 sql_help.c:1417 +#: sql_help.c:2949 sql_help.c:2950 sql_help.c:2966 sql_help.c:2967 +msgid "referential_action" +msgstr "referential_action" -# describe.c:1483 -#: describe.c:2523 -#: describe.c:3788 -msgid "Table" -msgstr "資料表" +# catalog/dependency.c:1511 +#: sql_help.c:1401 sql_help.c:2358 sql_help.c:2951 +msgid "and table_constraint is:" +msgstr "且 table_constraint 是:" -# describe.c:1542 -#: describe.c:2597 -#, c-format -msgid "No matching relations found.\n" -msgstr "沒有找到符åˆçš„é—œè¯ã€‚\n" +#: sql_help.c:1409 sql_help.c:2959 +msgid "exclude_element" +msgstr "exclude_element" -# describe.c:1544 -#: describe.c:2599 -#, c-format -msgid "No relations found.\n" -msgstr "找ä¸åˆ°é—œè¯ã€‚\n" +# describe.c:512 +#: sql_help.c:1410 sql_help.c:2960 sql_help.c:4572 sql_help.c:4675 +#: sql_help.c:4829 sql_help.c:5006 sql_help.c:5075 +msgid "operator" +msgstr "operator" -# describe.c:1549 -#: describe.c:2604 -msgid "List of relations" -msgstr "relation 清單" +# describe.c:937 +#: sql_help.c:1412 sql_help.c:2477 sql_help.c:2962 +msgid "predicate" +msgstr "predicate" -#: describe.c:2640 -msgid "Trusted" -msgstr "信任的" +#: sql_help.c:1418 +msgid "and table_constraint_using_index is:" +msgstr "並且 table_constraint_using_index 是:" -# describe.c:257 -#: describe.c:2648 -msgid "Internal Language" -msgstr "內部語言" +#: sql_help.c:1421 sql_help.c:2975 +msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" +msgstr "UNIQUE, PRIMARY KEY, and EXCLUDE ç´„æŸæ¢ä»¶ä¸­çš„ index_parameters 是:" -#: describe.c:2649 -msgid "Call Handler" -msgstr "Call Handler" +#: sql_help.c:1426 sql_help.c:2980 +msgid "exclude_element in an EXCLUDE constraint is:" +msgstr "在 EXCLUDE ç´„æŸæ¢ä»¶çš„ exclude_element 是:" -#: describe.c:2650 -#: describe.c:3611 -msgid "Validator" -msgstr "驗證程å¼" +#: sql_help.c:1429 sql_help.c:2470 sql_help.c:2907 sql_help.c:2920 +#: sql_help.c:2934 sql_help.c:2983 sql_help.c:4001 +msgid "opclass" +msgstr "opclass" -#: describe.c:2653 -msgid "Inline Handler" -msgstr "Inline Handler" +#: sql_help.c:1430 sql_help.c:2984 +msgid "referential_action in a FOREIGN KEY/REFERENCES constraint is:" +msgstr "FOREIGN KEY/REFERENCES ç´„æŸä¸­çš„ referential_action 是:" -# describe.c:1431 -#: describe.c:2674 -msgid "List of languages" -msgstr "程åºèªžè¨€æ¸…å–®" +# describe.c:1342 +#: sql_help.c:1448 sql_help.c:1451 sql_help.c:3021 +msgid "tablespace_option" +msgstr "tablespace_option" -# describe.c:1588 -#: describe.c:2714 -msgid "Modifier" -msgstr "修飾詞" +#: sql_help.c:1472 sql_help.c:1475 sql_help.c:1481 sql_help.c:1485 +msgid "token_type" +msgstr "token_type" -#: describe.c:2722 -msgid "Check" -msgstr "檢查" +#: sql_help.c:1473 sql_help.c:1476 +msgid "dictionary_name" +msgstr "dictionary_name" -# describe.c:1602 -#: describe.c:2740 -msgid "List of domains" -msgstr "domain 清單" +#: sql_help.c:1478 sql_help.c:1482 +msgid "old_dictionary" +msgstr "old_dictionary" -# describe.c:1635 -#: describe.c:2775 -msgid "Source" -msgstr "來æº" +#: sql_help.c:1479 sql_help.c:1483 +msgid "new_dictionary" +msgstr "new_dictionary" -# describe.c:1636 -#: describe.c:2776 -msgid "Destination" -msgstr "目的地" +#: sql_help.c:1578 sql_help.c:1592 sql_help.c:1595 sql_help.c:1596 +#: sql_help.c:3174 +msgid "attribute_name" +msgstr "attribute_name" -# describe.c:1639 -#: describe.c:2778 -msgid "Default?" -msgstr "é è¨­ï¼Ÿ" +#: sql_help.c:1579 +msgid "new_attribute_name" +msgstr "new_attribute_name" -# describe.c:1653 -#: describe.c:2796 -msgid "List of conversions" -msgstr "conversion 清單" +#: sql_help.c:1583 sql_help.c:1587 +msgid "new_enum_value" +msgstr "new_enum_value" -# describe.c:1688 -#: describe.c:2848 -msgid "Source type" -msgstr "來æºåž‹åˆ¥" +#: sql_help.c:1584 +msgid "neighbor_enum_value" +msgstr "neighbor_enum_value" -# describe.c:1689 -#: describe.c:2849 -msgid "Target type" -msgstr "目標型別" +#: sql_help.c:1586 +msgid "existing_enum_value" +msgstr "existing_enum_value" -# describe.c:1691 -#: describe.c:2850 -#: describe.c:3181 -msgid "Function" -msgstr "函數" +# describe.c:512 +#: sql_help.c:1589 +msgid "property" +msgstr "property" -# describe.c:1693 -#: describe.c:2851 -msgid "in assignment" -msgstr "在指派中" +#: sql_help.c:1665 sql_help.c:2341 sql_help.c:2350 sql_help.c:2756 +#: sql_help.c:3254 sql_help.c:3705 sql_help.c:3911 sql_help.c:3957 +#: sql_help.c:4363 +msgid "server_name" +msgstr "server_name" -# describe.c:1695 -#: describe.c:2852 -msgid "Implicit?" -msgstr "éš±å«çš„?" +#: sql_help.c:1697 sql_help.c:1700 sql_help.c:3269 +msgid "view_option_name" +msgstr "view_option_name" -# describe.c:1703 -#: describe.c:2878 -msgid "List of casts" -msgstr "åž‹åˆ¥è½‰æ›æ¸…å–®" +#: sql_help.c:1698 sql_help.c:3270 +msgid "view_option_value" +msgstr "view_option_value" -# describe.c:1549 -#: describe.c:2946 -msgid "List of collations" -msgstr "å®šåºæ¸…å–®" +# catalog/dependency.c:1511 +#: sql_help.c:1720 sql_help.c:1721 sql_help.c:4974 sql_help.c:4975 +msgid "table_and_columns" +msgstr "table_and_columns" -# describe.c:1753 -#: describe.c:3004 -msgid "List of schemas" -msgstr "schema 清單" +#: sql_help.c:1722 sql_help.c:1786 sql_help.c:1978 sql_help.c:3754 +#: sql_help.c:4198 sql_help.c:4976 +msgid "where option can be one of:" +msgstr "其中 option å¯ä»¥æ˜¯:" + +#: sql_help.c:1723 sql_help.c:1724 sql_help.c:1787 sql_help.c:1980 +#: sql_help.c:1984 sql_help.c:2164 sql_help.c:3755 sql_help.c:3756 +#: sql_help.c:3757 sql_help.c:3758 sql_help.c:3759 sql_help.c:3760 +#: sql_help.c:3761 sql_help.c:3762 sql_help.c:3763 sql_help.c:4199 +#: sql_help.c:4201 sql_help.c:4977 sql_help.c:4978 sql_help.c:4979 +#: sql_help.c:4980 sql_help.c:4981 sql_help.c:4982 sql_help.c:4983 +#: sql_help.c:4984 sql_help.c:4985 sql_help.c:4987 sql_help.c:4988 +msgid "boolean" +msgstr "boolean" -# describe.c:117 -#: describe.c:3027 -#: describe.c:3260 -#: describe.c:3328 -#: describe.c:3396 -#, c-format -msgid "The server (version %d.%d) does not support full text search.\n" -msgstr "伺æœå™¨ (版本 %d.%d) 䏿”¯æ´æ–‡æœ¬æœå°‹ã€‚\n" +#: sql_help.c:1725 sql_help.c:4989 +msgid "size" +msgstr "size" -# describe.c:150 -#: describe.c:3061 -msgid "List of text search parsers" -msgstr "全文檢索剖æžå™¨æ¸…å–®" +# catalog/dependency.c:1511 +#: sql_help.c:1726 sql_help.c:4990 +msgid "and table_and_columns is:" +msgstr "且 table_constraint 是:" -# describe.c:641 -#: describe.c:3104 -#, c-format -msgid "Did not find any text search parser named \"%s\".\n" -msgstr "沒有找到任何命å為 \"%s\" 的文本剖æžå™¨ã€‚\n" +#: sql_help.c:1742 sql_help.c:4736 sql_help.c:4738 sql_help.c:4762 +msgid "transaction_mode" +msgstr "transaction_mode" -#: describe.c:3179 -msgid "Start parse" -msgstr "開始剖æž" +# access/transam/xact.c:2544 access/transam/xact.c:2635 +#: sql_help.c:1743 sql_help.c:4739 sql_help.c:4763 +msgid "where transaction_mode is one of:" +msgstr "其中 transaction_mode å¯ä»¥æ˜¯:" -#: describe.c:3180 -msgid "Method" -msgstr "方法" +# gram.y:3496 utils/adt/regproc.c:639 +#: sql_help.c:1752 sql_help.c:4582 sql_help.c:4591 sql_help.c:4595 +#: sql_help.c:4599 sql_help.c:4602 sql_help.c:4839 sql_help.c:4848 +#: sql_help.c:4852 sql_help.c:4856 sql_help.c:4859 sql_help.c:5085 +#: sql_help.c:5094 sql_help.c:5098 sql_help.c:5102 sql_help.c:5105 +msgid "argument" +msgstr "argument" -#: describe.c:3184 -msgid "Get next token" -msgstr "å–得下一個標誌符" +#: sql_help.c:1852 +msgid "relation_name" +msgstr "relation_name" -#: describe.c:3186 -msgid "End parse" -msgstr "çµæŸå‰–æž" +# describe.c:1375 +#: sql_help.c:1857 sql_help.c:3905 sql_help.c:4357 +msgid "domain_name" +msgstr "domain_name" -#: describe.c:3188 -msgid "Get headline" -msgstr "å–得首行" +# describe.c:1375 +#: sql_help.c:1879 +msgid "policy_name" +msgstr "policy_name" -#: describe.c:3190 -msgid "Get token types" -msgstr "å–得標誌符型別" +# describe.c:1375 +#: sql_help.c:1892 +msgid "rule_name" +msgstr "rule_name" -#: describe.c:3200 -#, c-format -msgid "Text search parser \"%s.%s\"" -msgstr "文本æœå°‹å‰–æžå™¨ \"%s.%s\"" +#: sql_help.c:1911 sql_help.c:4496 +msgid "string_literal" +msgstr "string_literal" -#: describe.c:3202 -#, c-format -msgid "Text search parser \"%s\"" -msgstr "文本æœå°‹å‰–æžå™¨ \"%s\"" +#: sql_help.c:1936 sql_help.c:4160 sql_help.c:4410 +msgid "transaction_id" +msgstr "transaction_id" # describe.c:1375 -#: describe.c:3220 -msgid "Token name" -msgstr "標誌å稱" +#: sql_help.c:1968 sql_help.c:1975 sql_help.c:4027 +msgid "filename" +msgstr "filename" -#: describe.c:3231 -#, c-format -msgid "Token types for parser \"%s.%s\"" -msgstr "標誌符別型給剖æžå™¨ \"%s.%s\"" +#: sql_help.c:1969 sql_help.c:1976 sql_help.c:2695 sql_help.c:2696 +#: sql_help.c:2697 +msgid "command" +msgstr "command" -#: describe.c:3233 -#, c-format -msgid "Token types for parser \"%s\"" -msgstr "標誌符型別給剖æžå™¨ \"%s\"" +# help.c:123 +#: sql_help.c:1971 sql_help.c:2694 sql_help.c:3124 sql_help.c:3305 +#: sql_help.c:4011 sql_help.c:4088 sql_help.c:4091 sql_help.c:4565 +#: sql_help.c:4567 sql_help.c:4668 sql_help.c:4670 sql_help.c:4822 +#: sql_help.c:4824 sql_help.c:4940 sql_help.c:5068 sql_help.c:5070 +msgid "condition" +msgstr "condition" -#: describe.c:3282 -msgid "Template" -msgstr "模版" +#: sql_help.c:1974 sql_help.c:2511 sql_help.c:3007 sql_help.c:3271 +#: sql_help.c:3289 sql_help.c:3992 +msgid "query" +msgstr "query" -# help.c:88 -#: describe.c:3283 -msgid "Init options" -msgstr "åˆå§‹é¸é …" +# help.c:211 +#: sql_help.c:1979 +msgid "format_name" +msgstr "format_name" -# describe.c:1549 -#: describe.c:3305 -msgid "List of text search dictionaries" -msgstr "全文檢索字典清單" +#: sql_help.c:1981 +msgid "delimiter_character" +msgstr "delimiter_character" -#: describe.c:3345 -msgid "Init" -msgstr "åˆå§‹åŒ–" +#: sql_help.c:1982 +msgid "null_string" +msgstr "null_string" -# describe.c:257 -#: describe.c:3346 -msgid "Lexize" -msgstr "Lexize" +#: sql_help.c:1983 +msgid "default_string" +msgstr "default_string" -# describe.c:1753 -#: describe.c:3373 -msgid "List of text search templates" -msgstr "å…¨æ–‡æª¢ç´¢æ¨¡æ¿æ¸…å–®" +# translator: %s represents a digit string +# fe-protocol3.c:651 +# fe-protocol3.c:659 +#: sql_help.c:1985 +msgid "quote_character" +msgstr "quote_character" -# describe.c:97 -#: describe.c:3430 -msgid "List of text search configurations" -msgstr "全文檢索組態清單" +#: sql_help.c:1986 +msgid "escape_character" +msgstr "escape_character" -# describe.c:641 -#: describe.c:3474 -#, c-format -msgid "Did not find any text search configuration named \"%s\".\n" -msgstr "沒有找到任何命å為 \"%s\" 的文本æœå°‹çµ„態。\n" +# utils/mb/encnames.c:445 +#: sql_help.c:1990 +msgid "encoding_name" +msgstr "encoding_name" -#: describe.c:3540 -msgid "Token" -msgstr "標誌符" +#: sql_help.c:2001 +msgid "access_method_type" +msgstr "access_method_type" -#: describe.c:3541 -msgid "Dictionaries" -msgstr "å­—å…¸" +# describe.c:526 +#: sql_help.c:2072 sql_help.c:2091 sql_help.c:2094 +msgid "arg_data_type" +msgstr "arg_data_type" -#: describe.c:3552 -#, c-format -msgid "Text search configuration \"%s.%s\"" -msgstr "文本æœå°‹çµ„æ…‹ \"%s.%s\"" +# describe.c:498 +#: sql_help.c:2073 sql_help.c:2095 sql_help.c:2103 +msgid "sfunc" +msgstr "sfunc" -#: describe.c:3555 -#, c-format -msgid "Text search configuration \"%s\"" -msgstr "文本æœå°‹çµ„æ…‹ \"%s\"" +# describe.c:526 +#: sql_help.c:2074 sql_help.c:2096 sql_help.c:2104 +msgid "state_data_type" +msgstr "state_data_type" -# describe.c:859 -#: describe.c:3559 -#, c-format -msgid "" -"\n" -"Parser: \"%s.%s\"" -msgstr "" -"\n" -"剖æžå™¨: \"%s.%s\"" +# describe.c:526 +#: sql_help.c:2075 sql_help.c:2097 sql_help.c:2105 +msgid "state_data_size" +msgstr "state_data_size" -# describe.c:1342 -#: describe.c:3562 -#, c-format -msgid "" -"\n" -"Parser: \"%s\"" -msgstr "" -"\n" -"剖æžå™¨: \"%s\"" +# describe.c:498 +#: sql_help.c:2076 sql_help.c:2098 sql_help.c:2106 +msgid "ffunc" +msgstr "ffunc" -# describe.c:117 -#: describe.c:3594 -#, c-format -msgid "The server (version %d.%d) does not support foreign-data wrappers.\n" -msgstr "伺æœå™¨ (版本 %d.%d) 䏿”¯æ´å¤–部資料包è£å‡½å¼ã€‚\n" +#: sql_help.c:2077 sql_help.c:2107 +msgid "combinefunc" +msgstr "combinefunc" + +# describe.c:498 +#: sql_help.c:2078 sql_help.c:2108 +msgid "serialfunc" +msgstr "serialfunc" + +#: sql_help.c:2079 sql_help.c:2109 +msgid "deserialfunc" +msgstr "deserialfunc" -#: describe.c:3608 -msgid "Handler" -msgstr "Handler" +#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2110 +msgid "initial_condition" +msgstr "initial_condition" -# describe.c:289 -#: describe.c:3635 -msgid "List of foreign-data wrappers" -msgstr "外部資料包è£å‡½å¼æ¸…å–®" +# describe.c:498 +#: sql_help.c:2081 sql_help.c:2111 +msgid "msfunc" +msgstr "msfunc" -# describe.c:117 -#: describe.c:3658 -#, c-format -msgid "The server (version %d.%d) does not support foreign servers.\n" -msgstr "伺æœå™¨ (版本 %d.%d) 䏿”¯æ´å¤–部伺æœå™¨ã€‚\n" +#: sql_help.c:2082 sql_help.c:2112 +msgid "minvfunc" +msgstr "minvfunc" -#: describe.c:3670 -msgid "Foreign-data wrapper" -msgstr "外部資料包è£å‡½å¼" +# describe.c:526 +#: sql_help.c:2083 sql_help.c:2113 +msgid "mstate_data_type" +msgstr "mstate_data_type" -#: describe.c:3682 -#: describe.c:3852 -msgid "Version" -msgstr "版本" +# describe.c:526 +#: sql_help.c:2084 sql_help.c:2114 +msgid "mstate_data_size" +msgstr "mstate_data_size" -# describe.c:1653 -#: describe.c:3701 -msgid "List of foreign servers" -msgstr "外部伺æœå™¨æ¸…å–®" +# describe.c:498 +#: sql_help.c:2085 sql_help.c:2115 +msgid "mffunc" +msgstr "mffunc" -# describe.c:117 -#: describe.c:3724 -#, c-format -msgid "The server (version %d.%d) does not support user mappings.\n" -msgstr "伺æœå™¨ (版本 %d.%d) 䏿”¯æ´ä½¿ç”¨è€…å°æ‡‰ã€‚\n" +#: sql_help.c:2086 sql_help.c:2116 +msgid "minitial_condition" +msgstr "minitial_condition" -# describe.c:1377 -#: describe.c:3733 -#: describe.c:3789 -msgid "Server" -msgstr "伺æœå™¨" +# describe.c:512 +#: sql_help.c:2087 sql_help.c:2117 +msgid "sort_operator" +msgstr "sort_operator" -#: describe.c:3734 -msgid "User name" -msgstr "使用者å稱" +#: sql_help.c:2100 +msgid "or the old syntax" +msgstr "或是舊語法" -# describe.c:1602 -#: describe.c:3754 -msgid "List of user mappings" -msgstr "ä½¿ç”¨è€…å°æ‡‰åˆ—表" +# describe.c:1689 +#: sql_help.c:2102 +msgid "base_type" +msgstr "base_type" -# describe.c:117 -#: describe.c:3777 -#, c-format -msgid "The server (version %d.%d) does not support foreign tables.\n" -msgstr "伺æœå™¨(版本 %d.%d) 䏿”¯æ´ foreign 資料表。\n" +# help.c:127 +#: sql_help.c:2160 sql_help.c:2209 +msgid "locale" +msgstr "locale" -# describe.c:1653 -#: describe.c:3815 -msgid "List of foreign tables" -msgstr "foreign 資料表清單" +#: sql_help.c:2161 sql_help.c:2210 +msgid "lc_collate" +msgstr "lc_collate" -# describe.c:117 -#: describe.c:3838 -#: describe.c:3892 -#, c-format -msgid "The server (version %d.%d) does not support extensions.\n" -msgstr "伺æœå™¨(版本 %d.%d) 䏿”¯æ´ extension。\n" +# describe.c:415 +# describe.c:745 +# describe.c:1478 +# describe.c:1587 +#: sql_help.c:2162 sql_help.c:2211 +msgid "lc_ctype" +msgstr "lc_ctype" -# describe.c:1653 -#: describe.c:3869 -msgid "List of installed extensions" -msgstr "å·²å®‰è£æ“´å……功能清單" +#: sql_help.c:2163 sql_help.c:4463 +msgid "provider" +msgstr "provider" -# describe.c:641 -#: describe.c:3919 -#, c-format -msgid "Did not find any extension named \"%s\".\n" -msgstr "沒有找到任何å稱為 \"%s\" çš„ extension。\n" +# describe.c:559 +#: sql_help.c:2165 +msgid "rules" +msgstr "rules" -# describe.c:641 -#: describe.c:3922 -#, c-format -msgid "Did not find any extensions.\n" -msgstr "沒有找到任何 extension。\n" +#: sql_help.c:2166 sql_help.c:2271 +msgid "version" +msgstr "version" -# describe.c:593 -#: describe.c:3966 -msgid "Object Description" -msgstr "物件æè¿°" +# describe.c:1636 +#: sql_help.c:2168 +msgid "existing_collation" +msgstr "existing_collation" -#: describe.c:3975 -#, c-format -msgid "Objects in extension \"%s\"" -msgstr "extension \"%s\" 中的物件 " +# describe.c:187 +#: sql_help.c:2178 +msgid "source_encoding" +msgstr "source_encoding" -# sql_help.h:25 -# sql_help.h:373 -#: sql_help.h:182 -#: sql_help.h:837 -msgid "abort the current transaction" -msgstr "中止目å‰çš„交易" +# describe.c:365 +#: sql_help.c:2179 +msgid "dest_encoding" +msgstr "dest_encoding" -# sql_help.h:29 -#: sql_help.h:187 -msgid "change the definition of an aggregate function" -msgstr "變更彙總函å¼çš„定義" +#: sql_help.c:2206 sql_help.c:3047 +msgid "template" +msgstr "template" -# sql_help.h:45 -#: sql_help.h:192 -msgid "change the definition of a collation" -msgstr "變更定åºçš„定義" +# describe.c:365 +#: sql_help.c:2207 +msgid "encoding" +msgstr "encoding" -# sql_help.h:33 -#: sql_help.h:197 -msgid "change the definition of a conversion" -msgstr "變更 conversion 的定義" +#: sql_help.c:2208 +msgid "strategy" +msgstr "strategy" -# sql_help.h:37 -#: sql_help.h:202 -msgid "change a database" -msgstr "變更資料庫" +# help.c:127 +#: sql_help.c:2212 +msgid "icu_locale" +msgstr "icu_locale" -# sql_help.h:325 -#: sql_help.h:207 -msgid "define default access privileges" -msgstr "定義é è¨­å­˜å–權é™" +# describe.c:559 +#: sql_help.c:2213 +msgid "icu_rules" +msgstr "icu_rules" -# sql_help.h:41 -#: sql_help.h:212 -msgid "change the definition of a domain" -msgstr "變更 domain 的定義" +#: sql_help.c:2214 +msgid "locale_provider" +msgstr "locale_provider" -# sql_help.h:33 -#: sql_help.h:217 -msgid "change the definition of an extension" -msgstr "變更 extension 的定義" +#: sql_help.c:2215 +msgid "collation_version" +msgstr "collation_version" -# sql_help.h:85 -#: sql_help.h:222 -msgid "change the definition of a foreign-data wrapper" -msgstr "變更外部資料包è£å‡½å¼çš„定義" +#: sql_help.c:2220 +msgid "oid" +msgstr "oid" -# sql_help.h:85 -#: sql_help.h:227 -msgid "change the definition of a foreign table" -msgstr "變更 foreign 資料表的定義" +# catalog/dependency.c:1511 +#: sql_help.c:2240 +msgid "constraint" +msgstr "constraint" -# sql_help.h:45 -#: sql_help.h:232 -msgid "change the definition of a function" -msgstr "變更函å¼çš„定義" +# describe.c:1174 +#: sql_help.c:2241 +msgid "where constraint is:" +msgstr "其中 constraint 是:" -#: sql_help.h:237 -msgid "change role name or membership" -msgstr "變更角色å稱或æˆå“¡" +#: sql_help.c:2255 sql_help.c:2692 sql_help.c:3120 +msgid "event" +msgstr "event" -# sql_help.h:53 -#: sql_help.h:242 -msgid "change the definition of an index" -msgstr "變更索引的定義" +#: sql_help.c:2256 +msgid "filter_variable" +msgstr "filter_variable" -# sql_help.h:57 -#: sql_help.h:247 -msgid "change the definition of a procedural language" -msgstr "變更程åºèªžè¨€çš„定義" +#: sql_help.c:2257 +msgid "filter_value" +msgstr "filter_value" -# sql_help.h:77 -#: sql_help.h:252 -msgid "change the definition of a large object" -msgstr "變更 large object 的定義" +# describe.c:1174 +#: sql_help.c:2353 sql_help.c:2939 +msgid "where column_constraint is:" +msgstr "其中 column_constraint 是:" -# sql_help.h:65 -#: sql_help.h:257 -msgid "change the definition of an operator" -msgstr "變更é‹ç®—å­çš„定義" +# describe.c:1689 +#: sql_help.c:2398 +msgid "rettype" +msgstr "rettype" -# sql_help.h:61 -#: sql_help.h:262 -msgid "change the definition of an operator class" -msgstr "變更é‹ç®—å­é¡žåˆ¥çš„定義" +#: sql_help.c:2400 +msgid "column_type" +msgstr "column_type" -# sql_help.h:65 -#: sql_help.h:267 -msgid "change the definition of an operator family" -msgstr "變更é‹ç®—å­å®¶æ—的定義" +# describe.c:977 +#: sql_help.c:2409 sql_help.c:2612 +msgid "definition" +msgstr "definition" -# sql_help.h:37 -#: sql_help.h:272 -#: sql_help.h:332 -msgid "change a database role" -msgstr "變更資料庫角色" +#: sql_help.c:2410 sql_help.c:2613 +msgid "obj_file" +msgstr "obj_file" -# sql_help.h:69 -#: sql_help.h:277 -msgid "change the definition of a schema" -msgstr "變更 schema 的定義" +# utils/adt/encode.c:307 +#: sql_help.c:2411 sql_help.c:2614 +msgid "link_symbol" +msgstr "link_symbol" -# sql_help.h:73 -#: sql_help.h:282 -msgid "change the definition of a sequence generator" -msgstr "變更åºåˆ—數產生器的定義" +#: sql_help.c:2412 sql_help.c:2615 +msgid "sql_body" +msgstr "sql_body" -# sql_help.h:85 -#: sql_help.h:287 -msgid "change the definition of a foreign server" -msgstr "變更外部伺æœå™¨çš„定義" +#: sql_help.c:2450 sql_help.c:2677 sql_help.c:3243 +msgid "uid" +msgstr "uid" -# sql_help.h:77 -#: sql_help.h:292 -msgid "change the definition of a table" -msgstr "變更資料表的定義" +#: sql_help.c:2466 sql_help.c:2507 sql_help.c:2908 sql_help.c:2921 +#: sql_help.c:2935 sql_help.c:3003 +msgid "method" +msgstr "method" -# sql_help.h:81 -#: sql_help.h:297 -msgid "change the definition of a tablespace" -msgstr "變更資料表空間的定義" +#: sql_help.c:2471 +msgid "opclass_parameter" +msgstr "opclass_parameter" -# sql_help.h:33 -#: sql_help.h:302 -msgid "change the definition of a text search configuration" -msgstr "變更全文檢索組態的定義" +#: sql_help.c:2488 +msgid "call_handler" +msgstr "call_handler" -# sql_help.h:45 -#: sql_help.h:307 -msgid "change the definition of a text search dictionary" -msgstr "變更全文檢索字典的定義" +#: sql_help.c:2489 +msgid "inline_handler" +msgstr "inline_handler" -# sql_help.h:81 -#: sql_help.h:312 -msgid "change the definition of a text search parser" -msgstr "變更全文檢索剖æžå™¨çš„定義" +# describe.c:498 +#: sql_help.c:2490 +msgid "valfunction" +msgstr "valfunction" -# sql_help.h:69 -#: sql_help.h:317 -msgid "change the definition of a text search template" -msgstr "變更全文檢索模æ¿çš„定義" +#: sql_help.c:2529 +msgid "com_op" +msgstr "com_op" -# sql_help.h:85 -#: sql_help.h:322 -msgid "change the definition of a trigger" -msgstr "變更觸發器的定義" +#: sql_help.c:2530 +msgid "neg_op" +msgstr "neg_op" -# sql_help.h:89 -#: sql_help.h:327 -msgid "change the definition of a type" -msgstr "變更資料型別的定義" +#: sql_help.c:2548 +msgid "family_name" +msgstr "family_name" -# sql_help.h:41 -#: sql_help.h:337 -msgid "change the definition of a user mapping" -msgstr "è®Šæ›´ä½¿ç”¨è€…å°æ‡‰çš„定義" +# describe.c:1635 +#: sql_help.c:2559 +msgid "storage_type" +msgstr "storage_type" -# sql_help.h:53 -#: sql_help.h:342 -msgid "change the definition of a view" -msgstr "變更檢視表的定義" +#: sql_help.c:2698 sql_help.c:3127 +msgid "where event can be one of:" +msgstr "其中 event å¯ä»¥æ˜¯:" -# sql_help.h:97 -#: sql_help.h:347 -msgid "collect statistics about a database" -msgstr "收集資料庫統計資料" +#: sql_help.c:2718 sql_help.c:2720 +msgid "schema_element" +msgstr "schema_element" -# sql_help.h:101 -# sql_help.h:413 -#: sql_help.h:352 -#: sql_help.h:902 -msgid "start a transaction block" -msgstr "開始交易å€å¡Š" +#: sql_help.c:2757 +msgid "server_type" +msgstr "server_type" -# sql_help.h:105 -#: sql_help.h:357 -msgid "force a transaction log checkpoint" -msgstr "強制交易日誌檢查點" +# utils/misc/guc.c:1652 +#: sql_help.c:2758 +msgid "server_version" +msgstr "server_version" -# sql_help.h:109 -#: sql_help.h:362 -msgid "close a cursor" -msgstr "關閉 cursor" +#: sql_help.c:2759 sql_help.c:3908 sql_help.c:4360 +msgid "fdw_name" +msgstr "fdw_name" -# sql_help.h:113 -#: sql_help.h:367 -msgid "cluster a table according to an index" -msgstr "根據索引將資料表å¢é›†" +# utils/misc/guc.c:279 +#: sql_help.c:2776 sql_help.c:2779 +msgid "statistics_name" +msgstr "statistics_name" -# sql_help.h:117 -#: sql_help.h:372 -msgid "define or change the comment of an object" -msgstr "建立或更改物件的註解" +# utils/misc/guc.c:279 +#: sql_help.c:2780 +msgid "statistics_kind" +msgstr "statistics_kind" -# sql_help.h:121 -# sql_help.h:309 -#: sql_help.h:377 -#: sql_help.h:747 -msgid "commit the current transaction" -msgstr "確èªç›®å‰çš„事物交易" +# describe.c:498 +#: sql_help.c:2796 +msgid "subscription_name" +msgstr "subscription_name" -#: sql_help.h:382 -msgid "commit a transaction that was earlier prepared for two-phase commit" -msgstr "æäº¤ä¸€é …事務交易這是兩階段æäº¤çš„å…ˆå‰æº–å‚™" +# describe.c:1688 +#: sql_help.c:2901 +msgid "source_table" +msgstr "source_table" -# sql_help.h:125 -#: sql_help.h:387 -msgid "copy data between a file and a table" -msgstr "在檔案和資料表間複製資料" +# help.c:88 +#: sql_help.c:2902 +msgid "like_option" +msgstr "like_option" -# sql_help.h:129 -#: sql_help.h:392 -msgid "define a new aggregate function" -msgstr "建立新彙總函數" +#: sql_help.c:2968 +msgid "and like_option is:" +msgstr "且 like_option 是:" -# sql_help.h:133 -#: sql_help.h:397 -msgid "define a new cast" -msgstr "建立新型別轉æ›" +#: sql_help.c:3020 +msgid "directory" +msgstr "directory" + +#: sql_help.c:3034 +msgid "parser_name" +msgstr "parser_name" -# sql_help.h:153 -#: sql_help.h:402 -msgid "define a new collation" -msgstr "建立新定åº" +#: sql_help.c:3035 +msgid "source_config" +msgstr "source_config" -# sql_help.h:141 -#: sql_help.h:407 -msgid "define a new encoding conversion" -msgstr "建立新 conversioin" +# describe.c:498 +#: sql_help.c:3064 +msgid "start_function" +msgstr "start_function" -# sql_help.h:145 -#: sql_help.h:412 -msgid "create a new database" -msgstr "建立新資料庫" +# sql_help.h:249 +#: sql_help.c:3065 +msgid "gettoken_function" +msgstr "gettoken_function" -# sql_help.h:149 -#: sql_help.h:417 -msgid "define a new domain" -msgstr "建立新 domain" +# describe.c:498 +#: sql_help.c:3066 +msgid "end_function" +msgstr "end_function" -#: sql_help.h:422 -msgid "install an extension" -msgstr "å®‰è£æ“´å……功能" +# describe.c:498 +#: sql_help.c:3067 +msgid "lextypes_function" +msgstr "lextypes_function" -# sql_help.h:205 -#: sql_help.h:427 -msgid "define a new foreign-data wrapper" -msgstr "定義新的外部資料包è£å‡½å¼" +# describe.c:498 +#: sql_help.c:3068 +msgid "headline_function" +msgstr "headline_function" -# sql_help.h:201 -#: sql_help.h:432 -msgid "define a new foreign table" -msgstr "建立新 foreign 資料表" +# describe.c:498 +#: sql_help.c:3080 +msgid "init_function" +msgstr "init_function" -# sql_help.h:153 -#: sql_help.h:437 -msgid "define a new function" -msgstr "建立新函å¼" +# describe.c:498 +#: sql_help.c:3081 +msgid "lexize_function" +msgstr "lexize_function" -# sql_help.h:189 -#: sql_help.h:442 -#: sql_help.h:472 -#: sql_help.h:542 -msgid "define a new database role" -msgstr "建立新資料庫角色" +# describe.c:498 +#: sql_help.c:3094 +msgid "from_sql_function_name" +msgstr "from_sql_function_name" -# sql_help.h:161 -#: sql_help.h:447 -msgid "define a new index" -msgstr "建立新索引" +# describe.c:498 +#: sql_help.c:3096 +msgid "to_sql_function_name" +msgstr "to_sql_function_name" -# sql_help.h:165 -#: sql_help.h:452 -msgid "define a new procedural language" -msgstr "建立新程åºèªžè¨€" +#: sql_help.c:3122 +msgid "referenced_table_name" +msgstr "referenced_table_name" -# sql_help.h:173 -#: sql_help.h:457 -msgid "define a new operator" -msgstr "建立新é‹ç®—å­" +#: sql_help.c:3123 +msgid "transition_relation_name" +msgstr "transition_relation_name" -# sql_help.h:169 -#: sql_help.h:462 -msgid "define a new operator class" -msgstr "建立新é‹ç®—å­é¡žåˆ¥" +# utils/adt/regproc.c:644 utils/adt/regproc.c:1276 +#: sql_help.c:3126 +msgid "arguments" +msgstr "arguments" -# sql_help.h:173 -#: sql_help.h:467 -msgid "define a new operator family" -msgstr "建立新é‹ç®—å­å®¶æ—" +#: sql_help.c:3178 +msgid "label" +msgstr "label" -# sql_help.h:177 -#: sql_help.h:477 -msgid "define a new rewrite rule" -msgstr "建立新é‡å¯«è¦å‰‡" +# describe.c:415 +# describe.c:745 +# describe.c:1478 +# describe.c:1587 +#: sql_help.c:3180 +msgid "subtype" +msgstr "subtype" -# sql_help.h:181 -#: sql_help.h:482 -msgid "define a new schema" -msgstr "建立新 schema" +# describe.c:512 +#: sql_help.c:3181 +msgid "subtype_operator_class" +msgstr "subtype_operator_class" -# sql_help.h:185 -#: sql_help.h:487 -msgid "define a new sequence generator" -msgstr "建立新åºåˆ—數產生器" +# describe.c:498 +#: sql_help.c:3183 +msgid "canonical_function" +msgstr "canonical_function" -# sql_help.h:201 -#: sql_help.h:492 -msgid "define a new foreign server" -msgstr "建立新外部伺æœå™¨" +# describe.c:498 +#: sql_help.c:3184 +msgid "subtype_diff_function" +msgstr "subtype_diff_function" -# sql_help.h:189 -#: sql_help.h:497 -msgid "define a new table" -msgstr "建立新資料表" +# describe.c:1635 +#: sql_help.c:3185 +msgid "multirange_type_name" +msgstr "multirange_type_name" -# sql_help.h:193 -# sql_help.h:389 -#: sql_help.h:502 -#: sql_help.h:867 -msgid "define a new table from the results of a query" -msgstr "ä»¥æŸ¥è©¢çµæžœå»ºç«‹æ–°è³‡æ–™è¡¨" +# describe.c:498 +#: sql_help.c:3187 +msgid "input_function" +msgstr "input_function" -# sql_help.h:197 -#: sql_help.h:507 -msgid "define a new tablespace" -msgstr "建立新資料表空間" +# describe.c:498 +#: sql_help.c:3188 +msgid "output_function" +msgstr "output_function" -# sql_help.h:129 -#: sql_help.h:512 -msgid "define a new text search configuration" -msgstr "建立新全文檢索組態" +# sql_help.h:249 +#: sql_help.c:3189 +msgid "receive_function" +msgstr "receive_function" -# sql_help.h:129 -#: sql_help.h:517 -msgid "define a new text search dictionary" -msgstr "建立新全文檢索字典" +# describe.c:498 +#: sql_help.c:3190 +msgid "send_function" +msgstr "send_function" -# sql_help.h:197 -#: sql_help.h:522 -msgid "define a new text search parser" -msgstr "建立新全文檢索剖æžå™¨" +#: sql_help.c:3191 +msgid "type_modifier_input_function" +msgstr "type_modifier_input_function" -# sql_help.h:181 -#: sql_help.h:527 -msgid "define a new text search template" -msgstr "建立新全文檢索模æ¿" +#: sql_help.c:3192 +msgid "type_modifier_output_function" +msgstr "type_modifier_output_function" -# sql_help.h:201 -#: sql_help.h:532 -msgid "define a new trigger" -msgstr "建立新觸發器" +# describe.c:498 +#: sql_help.c:3193 +msgid "analyze_function" +msgstr "analyze_function" -# sql_help.h:205 -#: sql_help.h:537 -msgid "define a new data type" -msgstr "建立新資料型別" +# describe.c:498 +#: sql_help.c:3194 +msgid "subscript_function" +msgstr "subscript_function" -#: sql_help.h:547 -msgid "define a new mapping of a user to a foreign server" -msgstr "建立使用者至外部伺æœå™¨çš„æ–°å°æ‡‰" +#: sql_help.c:3195 +msgid "internallength" +msgstr "internallength" -# sql_help.h:213 -#: sql_help.h:552 -msgid "define a new view" -msgstr "建立新檢視表" +#: sql_help.c:3196 +msgid "alignment" +msgstr "alignment" -# sql_help.h:217 -#: sql_help.h:557 -msgid "deallocate a prepared statement" -msgstr "釋放已é å‚™å¥½çš„æ•˜è¿°å€å¡Š" +# describe.c:1635 +#: sql_help.c:3197 +msgid "storage" +msgstr "storage" -# sql_help.h:221 -#: sql_help.h:562 -msgid "define a cursor" -msgstr "建立 cursor" +#: sql_help.c:3198 +msgid "like_type" +msgstr "like_type" -# sql_help.h:225 -#: sql_help.h:567 -msgid "delete rows of a table" -msgstr "刪除資料表中的資料列" +#: sql_help.c:3199 +msgid "category" +msgstr "category" -#: sql_help.h:572 -msgid "discard session state" -msgstr "拋棄 session 狀態" +#: sql_help.c:3200 +msgid "preferred" +msgstr "preferred" -#: sql_help.h:577 -msgid "execute an anonymous code block" -msgstr "執行匿å程å¼å¡Š" +# describe.c:1639 +#: sql_help.c:3201 +msgid "default" +msgstr "default" -# sql_help.h:229 -#: sql_help.h:582 -msgid "remove an aggregate function" -msgstr "刪除彙總函數" +#: sql_help.c:3202 +msgid "element" +msgstr "element" -# sql_help.h:233 -#: sql_help.h:587 -msgid "remove a cast" -msgstr "除除型別轉æ›" +# utils/adt/encode.c:295 +#: sql_help.c:3203 +msgid "delimiter" +msgstr "delimiter" -# sql_help.h:249 -#: sql_help.h:592 -msgid "remove a collation" -msgstr "刪除定åº" +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: sql_help.c:3204 +msgid "collatable" +msgstr "collatable" -# sql_help.h:237 -#: sql_help.h:597 -msgid "remove a conversion" -msgstr "刪除 conversion" +#: sql_help.c:3301 sql_help.c:3987 sql_help.c:4077 sql_help.c:4560 +#: sql_help.c:4662 sql_help.c:4817 sql_help.c:4930 sql_help.c:5063 +msgid "with_query" +msgstr "with_query" -# sql_help.h:241 -#: sql_help.h:602 -msgid "remove a database" -msgstr "刪除資料庫" +#: sql_help.c:3303 sql_help.c:3989 sql_help.c:4579 sql_help.c:4585 +#: sql_help.c:4588 sql_help.c:4592 sql_help.c:4596 sql_help.c:4604 +#: sql_help.c:4836 sql_help.c:4842 sql_help.c:4845 sql_help.c:4849 +#: sql_help.c:4853 sql_help.c:4861 sql_help.c:4932 sql_help.c:5082 +#: sql_help.c:5088 sql_help.c:5091 sql_help.c:5095 sql_help.c:5099 +#: sql_help.c:5107 +msgid "alias" +msgstr "alias" -# sql_help.h:245 -#: sql_help.h:607 -msgid "remove a domain" -msgstr "刪除 domain" +#: sql_help.c:3304 sql_help.c:4564 sql_help.c:4606 sql_help.c:4608 +#: sql_help.c:4612 sql_help.c:4614 sql_help.c:4615 sql_help.c:4616 +#: sql_help.c:4667 sql_help.c:4821 sql_help.c:4863 sql_help.c:4865 +#: sql_help.c:4869 sql_help.c:4871 sql_help.c:4872 sql_help.c:4873 +#: sql_help.c:4939 sql_help.c:5067 sql_help.c:5109 sql_help.c:5111 +#: sql_help.c:5115 sql_help.c:5117 sql_help.c:5118 sql_help.c:5119 +msgid "from_item" +msgstr "from_item" -# sql_help.h:237 -#: sql_help.h:612 -msgid "remove an extension" -msgstr "刪除擴充功能" +#: sql_help.c:3306 sql_help.c:3789 sql_help.c:4127 sql_help.c:4941 +msgid "cursor_name" +msgstr "cursor_name" -# sql_help.h:297 -#: sql_help.h:617 -msgid "remove a foreign-data wrapper" -msgstr "刪除外部資料包è£å‡½å¼" +# commands/typecmds.c:637 +#: sql_help.c:3307 sql_help.c:3995 sql_help.c:4942 +msgid "output_expression" +msgstr "output_expression" -# sql_help.h:285 -#: sql_help.h:622 -msgid "remove a foreign table" -msgstr "刪除 foreign 資料表" +#: sql_help.c:3308 sql_help.c:3996 sql_help.c:4563 sql_help.c:4665 +#: sql_help.c:4820 sql_help.c:4943 sql_help.c:5066 +msgid "output_name" +msgstr "output_name" -# sql_help.h:249 -#: sql_help.h:627 -msgid "remove a function" -msgstr "除除函å¼" +#: sql_help.c:3324 +msgid "code" +msgstr "code" -# sql_help.h:241 -#: sql_help.h:632 -#: sql_help.h:667 -#: sql_help.h:732 -msgid "remove a database role" -msgstr "刪除資料庫角色" +#: sql_help.c:3729 +msgid "parameter" +msgstr "parameter" -# sql_help.h:257 -#: sql_help.h:637 -msgid "remove an index" -msgstr "刪除索引" +#: sql_help.c:3752 sql_help.c:3753 sql_help.c:4152 +msgid "statement" +msgstr "statement" -# sql_help.h:261 -#: sql_help.h:642 -msgid "remove a procedural language" -msgstr "刪除程åºèªžè¨€" +# help.c:123 +#: sql_help.c:3788 sql_help.c:4126 +msgid "direction" +msgstr "direction" -# sql_help.h:269 -#: sql_help.h:647 -msgid "remove an operator" -msgstr "刪除é‹ç®—å­" +#: sql_help.c:3790 sql_help.c:4128 +msgid "where direction can be one of:" +msgstr "其中 direction å¯ä»¥æ˜¯:" -# sql_help.h:265 -#: sql_help.h:652 -msgid "remove an operator class" -msgstr "刪除é‹ç®—å­é¡žåˆ¥" +#: sql_help.c:3791 sql_help.c:3792 sql_help.c:3793 sql_help.c:3794 +#: sql_help.c:3795 sql_help.c:4129 sql_help.c:4130 sql_help.c:4131 +#: sql_help.c:4132 sql_help.c:4133 sql_help.c:4573 sql_help.c:4575 +#: sql_help.c:4676 sql_help.c:4678 sql_help.c:4830 sql_help.c:4832 +#: sql_help.c:5007 sql_help.c:5009 sql_help.c:5076 sql_help.c:5078 +msgid "count" +msgstr "count" -# sql_help.h:269 -#: sql_help.h:657 -msgid "remove an operator family" -msgstr "刪除é‹ç®—å­å®¶æ—" +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: sql_help.c:3898 sql_help.c:4350 +msgid "sequence_name" +msgstr "sequence_name" -#: sql_help.h:662 -msgid "remove database objects owned by a database role" -msgstr "åˆªé™¤è³‡æ–™åº«è§’è‰²æ“æœ‰çš„資料庫物件" +#: sql_help.c:3916 sql_help.c:4368 +msgid "arg_name" +msgstr "arg_name" -# sql_help.h:273 -#: sql_help.h:672 -msgid "remove a rewrite rule" -msgstr "刪除é‡å¯«è¦å‰‡" +# describe.c:1689 +#: sql_help.c:3917 sql_help.c:4369 +msgid "arg_type" +msgstr "arg_type" + +#: sql_help.c:3924 sql_help.c:4376 +msgid "loid" +msgstr "loid" # sql_help.h:277 -#: sql_help.h:677 -msgid "remove a schema" -msgstr "刪除 schema" +#: sql_help.c:3955 +msgid "remote_schema" +msgstr "remote_schema" -# sql_help.h:281 -#: sql_help.h:682 -msgid "remove a sequence" -msgstr "刪除åºåˆ—數" +# describe.c:82 +# describe.c:177 +# describe.c:247 +# describe.c:320 +# describe.c:415 +# describe.c:469 +# describe.c:1476 +# describe.c:1585 +# describe.c:1633 +#: sql_help.c:3958 +msgid "local_schema" +msgstr "local_schema" -# sql_help.h:237 -#: sql_help.h:687 -msgid "remove a foreign server descriptor" -msgstr "刪除外部伺æœå™¨æè¿°å­" +#: sql_help.c:3993 +msgid "conflict_target" +msgstr "conflict_target" -# sql_help.h:285 -#: sql_help.h:692 -msgid "remove a table" -msgstr "刪除資料表" +# describe.c:128 +#: sql_help.c:3994 +msgid "conflict_action" +msgstr "conflict_action" -# sql_help.h:289 -#: sql_help.h:697 -msgid "remove a tablespace" -msgstr "刪除資料表空間" +#: sql_help.c:3997 +msgid "where conflict_target can be one of:" +msgstr "其中 conflict_target å¯ä»¥æ˜¯:" -# sql_help.h:301 -#: sql_help.h:702 -msgid "remove a text search configuration" -msgstr "刪除全文檢索組態" +# describe.c:1375 +#: sql_help.c:3998 +msgid "index_column_name" +msgstr "index_column_name" -# sql_help.h:301 -#: sql_help.h:707 -msgid "remove a text search dictionary" -msgstr "刪除全文檢索字典" +#: sql_help.c:3999 +msgid "index_expression" +msgstr "index_expression" -# sql_help.h:289 -#: sql_help.h:712 -msgid "remove a text search parser" -msgstr "刪除全文檢索剖æžå™¨" +# describe.c:937 +#: sql_help.c:4002 +msgid "index_predicate" +msgstr "index_predicate" -# sql_help.h:277 -#: sql_help.h:717 -msgid "remove a text search template" -msgstr "刪除全文檢索模æ¿" +#: sql_help.c:4004 +msgid "and conflict_action is one of:" +msgstr "其中 conflict_action å¯ä»¥æ˜¯:" -# sql_help.h:293 -#: sql_help.h:722 -msgid "remove a trigger" -msgstr "刪除觸發器" +#: sql_help.c:4010 sql_help.c:4938 +msgid "sub-SELECT" +msgstr "sub-SELECT" -# sql_help.h:297 -#: sql_help.h:727 -msgid "remove a data type" -msgstr "刪除資料型別" +#: sql_help.c:4019 sql_help.c:4141 sql_help.c:4914 +msgid "channel" +msgstr "channel" -#: sql_help.h:737 -msgid "remove a user mapping for a foreign server" -msgstr "刪除外部伺æœå™¨çš„ä½¿ç”¨è€…å°æ‡‰" +#: sql_help.c:4041 +msgid "lockmode" +msgstr "lockmode" -# sql_help.h:305 -#: sql_help.h:742 -msgid "remove a view" -msgstr "刪除檢視表" +#: sql_help.c:4042 +msgid "where lockmode is one of:" +msgstr "其中 lockmode å¯ä»¥æ˜¯:" -# sql_help.h:313 -#: sql_help.h:752 -msgid "execute a prepared statement" -msgstr "執行 prepared 陳述å¼" +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: sql_help.c:4078 +msgid "target_table_name" +msgstr "target_table_name" -# sql_help.h:317 -#: sql_help.h:757 -msgid "show the execution plan of a statement" -msgstr "顯示陳述å¼çš„執行計劃" +#: sql_help.c:4079 +msgid "target_alias" +msgstr "target_alias" -# sql_help.h:321 -#: sql_help.h:762 -msgid "retrieve rows from a query using a cursor" -msgstr "從使用游標的查詢讀å–資料" +# describe.c:526 +#: sql_help.c:4080 +msgid "data_source" +msgstr "data_source" -# sql_help.h:325 -#: sql_help.h:767 -msgid "define access privileges" -msgstr "å»ºç«‹å­˜å–æ¬Šé™" +#: sql_help.c:4081 sql_help.c:4609 sql_help.c:4866 sql_help.c:5112 +msgid "join_condition" +msgstr "join_condition" -# sql_help.h:329 -#: sql_help.h:772 -msgid "create new rows in a table" -msgstr "在資料表中建立資料" +#: sql_help.c:4082 +msgid "when_clause" +msgstr "when_clause" -# sql_help.h:333 -#: sql_help.h:777 -msgid "listen for a notification" -msgstr "等待通知" +#: sql_help.c:4083 +msgid "where data_source is:" +msgstr "其中 data_source 是:" -# sql_help.h:337 -#: sql_help.h:782 -msgid "load a shared library file" -msgstr "載入共用程å¼åº«æª”案" +# describe.c:415 +# describe.c:543 +# describe.c:1477 +#: sql_help.c:4084 +msgid "source_table_name" +msgstr "source_table_name" -# sql_help.h:341 -#: sql_help.h:787 -msgid "lock a table" -msgstr "鎖ä½è³‡æ–™è¡¨" +# describe.c:1688 +#: sql_help.c:4085 +msgid "source_query" +msgstr "source_query" -# sql_help.h:345 -#: sql_help.h:792 -msgid "position a cursor" -msgstr "移動游標ä½ç½®" +#: sql_help.c:4086 +msgid "source_alias" +msgstr "source_alias" -# sql_help.h:349 -#: sql_help.h:797 -msgid "generate a notification" -msgstr "產生通告" +#: sql_help.c:4087 +msgid "and when_clause is:" +msgstr "且 when_clause 是:" -# sql_help.h:353 -#: sql_help.h:802 -msgid "prepare a statement for execution" -msgstr "é å…ˆç·¨è­¯æ•˜è¿°ä»¥åŸ·è¡Œ" +#: sql_help.c:4089 +msgid "merge_update" +msgstr "merge_update" -# sql_help.h:25 -# sql_help.h:373 -#: sql_help.h:807 -msgid "prepare the current transaction for two-phase commit" -msgstr "é å‚™ç•¶å‰äº‹å‹™äº¤æ˜“çš„äºŒæ®µå¼æäº¤" +#: sql_help.c:4090 +msgid "merge_delete" +msgstr "merge_delete" -#: sql_help.h:812 -msgid "change the ownership of database objects owned by a database role" -msgstr "變更資料庫角色的資料庫物件所有權" +#: sql_help.c:4092 +msgid "merge_insert" +msgstr "merge_insert" -# sql_help.h:357 -#: sql_help.h:817 -msgid "rebuild indexes" -msgstr "釿–°å»ºæ§‹ç´¢å¼•" +# catalog/dependency.c:1511 +#: sql_help.c:4093 +msgid "and merge_insert is:" +msgstr "且 merge_insert 是:" -# sql_help.h:361 -#: sql_help.h:822 -msgid "destroy a previously defined savepoint" -msgstr "刪除先å‰å»ºç«‹çš„儲存點(Savepoint)" +#: sql_help.c:4096 +msgid "and merge_update is:" +msgstr "且 merge_update 是:" -# sql_help.h:365 -#: sql_help.h:827 -msgid "restore the value of a run-time parameter to the default value" -msgstr "å°‡åŸ·è¡Œæ™‚æœŸåƒæ•¸é‚„原æˆé è¨­å€¼" +#: sql_help.c:4101 +msgid "and merge_delete is:" +msgstr "且 merge_delete 是:" -# sql_help.h:369 -#: sql_help.h:832 -msgid "remove access privileges" -msgstr "ç§»é™¤å­˜å–æ¬Šé™" +#: sql_help.c:4142 +msgid "payload" +msgstr "payload" -#: sql_help.h:842 -msgid "cancel a transaction that was earlier prepared for two-phase commit" -msgstr "å–æ¶ˆå…ˆå‰ç‚ºå…©éšŽæ®µèªå¯æº–備的交易" +#: sql_help.c:4169 +msgid "old_role" +msgstr "old_role" -# sql_help.h:377 -#: sql_help.h:847 -msgid "roll back to a savepoint" -msgstr "還原至儲存點" +#: sql_help.c:4170 +msgid "new_role" +msgstr "new_role" -# sql_help.h:381 -#: sql_help.h:852 -msgid "define a new savepoint within the current transaction" -msgstr "在目å‰çš„事物交易中建立新的儲存點(Savepoint)" +# sql_help.h:382 +#: sql_help.c:4209 sql_help.c:4418 sql_help.c:4426 +msgid "savepoint_name" +msgstr "savepoint_name" -# sql_help.h:117 -#: sql_help.h:857 -msgid "define or change a security label applied to an object" -msgstr "定義或變更物件的安全性標籤" +# utils/adt/arrayfuncs.c:1168 +#: sql_help.c:4566 sql_help.c:4624 sql_help.c:4823 sql_help.c:4881 +#: sql_help.c:5069 sql_help.c:5127 +msgid "grouping_element" +msgstr "grouping_element" -# sql_help.h:385 -#: sql_help.h:862 -#: sql_help.h:907 -#: sql_help.h:937 -msgid "retrieve rows from a table or view" -msgstr "從資料表或視觀表讀å–資料" +#: sql_help.c:4568 sql_help.c:4671 sql_help.c:4825 sql_help.c:5071 +msgid "window_name" +msgstr "window_name" -# sql_help.h:393 -#: sql_help.h:872 -msgid "change a run-time parameter" -msgstr "æ›´æ”¹åŸ·è¡Œæ™‚æœŸåƒæ•¸" +# describe.c:977 +#: sql_help.c:4569 sql_help.c:4672 sql_help.c:4826 sql_help.c:5072 +msgid "window_definition" +msgstr "window_definition" -# sql_help.h:397 -#: sql_help.h:877 -msgid "set constraint check timing for the current transaction" -msgstr "設定目å‰äº¤æ˜“çš„æ¢ä»¶ç´„æŸæª¢æŸ¥æ™‚機" +#: sql_help.c:4570 sql_help.c:4584 sql_help.c:4628 sql_help.c:4673 +#: sql_help.c:4827 sql_help.c:4841 sql_help.c:4885 sql_help.c:5073 +#: sql_help.c:5087 sql_help.c:5131 +msgid "select" +msgstr "select" -# sql_help.h:405 -#: sql_help.h:882 -msgid "set the current user identifier of the current session" -msgstr "è¨­ç½®ç•¶å‰ session 的當å‰ç”¨æˆ¶çš„身份標識" +#: sql_help.c:4577 sql_help.c:4834 sql_help.c:5080 +msgid "where from_item can be one of:" +msgstr "其中 from_item å¯ä»¥æ˜¯:" -# sql_help.h:401 -#: sql_help.h:887 -msgid "set the session user identifier and the current user identifier of the current session" -msgstr "設定階段使用者識別字以åŠç›®å‰éšŽæ®µçš„ç›®å‰ä½¿ç”¨è€… 識別字" +#: sql_help.c:4580 sql_help.c:4586 sql_help.c:4589 sql_help.c:4593 +#: sql_help.c:4605 sql_help.c:4837 sql_help.c:4843 sql_help.c:4846 +#: sql_help.c:4850 sql_help.c:4862 sql_help.c:5083 sql_help.c:5089 +#: sql_help.c:5092 sql_help.c:5096 sql_help.c:5108 +msgid "column_alias" +msgstr "column_alias" -# sql_help.h:405 -#: sql_help.h:892 -msgid "set the characteristics of the current transaction" -msgstr "設定目å‰äº‹ç‰©äº¤æ˜“屬性" +#: sql_help.c:4581 sql_help.c:4838 sql_help.c:5084 +msgid "sampling_method" +msgstr "sampling_method" -# sql_help.h:409 -#: sql_help.h:897 -msgid "show the value of a run-time parameter" -msgstr "é¡¯ç¤ºåŸ·è¡Œæ™‚æœŸçš„åƒæ•¸å€¼" +#: sql_help.c:4583 sql_help.c:4840 sql_help.c:5086 +msgid "seed" +msgstr "seed" -# sql_help.h:425 -#: sql_help.h:912 -msgid "empty a table or set of tables" -msgstr "空的資料表或資料表設置" +#: sql_help.c:4587 sql_help.c:4626 sql_help.c:4844 sql_help.c:4883 +#: sql_help.c:5090 sql_help.c:5129 +msgid "with_query_name" +msgstr "with_query_name" -# sql_help.h:421 -#: sql_help.h:917 -msgid "stop listening for a notification" -msgstr "åœæ­¢å‚¾è½é€šå‘Š" +# describe.c:977 +#: sql_help.c:4597 sql_help.c:4600 sql_help.c:4603 sql_help.c:4854 +#: sql_help.c:4857 sql_help.c:4860 sql_help.c:5100 sql_help.c:5103 +#: sql_help.c:5106 +msgid "column_definition" +msgstr "column_definition" -# sql_help.h:425 -#: sql_help.h:922 -msgid "update rows of a table" -msgstr "更新資料表中的資料列" +#: sql_help.c:4607 sql_help.c:4613 sql_help.c:4864 sql_help.c:4870 +#: sql_help.c:5110 sql_help.c:5116 +msgid "join_type" +msgstr "join_type" -# sql_help.h:429 -#: sql_help.h:927 -msgid "garbage-collect and optionally analyze a database" -msgstr "垃圾收集(GC)䏦鏿“‡æ€§çš„分æžè³‡æ–™åº«" +#: sql_help.c:4610 sql_help.c:4867 sql_help.c:5113 +msgid "join_column" +msgstr "join_column" -#: sql_help.h:932 -msgid "compute a set of rows" -msgstr "計算資料列的集åˆ" +#: sql_help.c:4611 sql_help.c:4868 sql_help.c:5114 +msgid "join_using_alias" +msgstr "join_using_alias" -# describe.c:1375 -#: sql_help.c:26 -#: sql_help.c:29 -#: sql_help.c:32 -#: sql_help.c:44 -#: sql_help.c:46 -#: sql_help.c:48 -#: sql_help.c:59 -#: sql_help.c:61 -#: sql_help.c:63 -#: sql_help.c:87 -#: sql_help.c:91 -#: sql_help.c:93 -#: sql_help.c:95 -#: sql_help.c:97 -#: sql_help.c:100 -#: sql_help.c:102 -#: sql_help.c:104 -#: sql_help.c:179 -#: sql_help.c:181 -#: sql_help.c:182 -#: sql_help.c:184 -#: sql_help.c:186 -#: sql_help.c:188 -#: sql_help.c:276 -#: sql_help.c:281 -#: sql_help.c:306 -#: sql_help.c:308 -#: sql_help.c:311 -#: sql_help.c:313 -#: sql_help.c:351 -#: sql_help.c:356 -#: sql_help.c:361 -#: sql_help.c:366 -#: sql_help.c:404 -#: sql_help.c:406 -#: sql_help.c:408 -#: sql_help.c:411 -#: sql_help.c:421 -#: sql_help.c:423 -#: sql_help.c:442 -#: sql_help.c:446 -#: sql_help.c:459 -#: sql_help.c:462 -#: sql_help.c:465 -#: sql_help.c:485 -#: sql_help.c:497 -#: sql_help.c:505 -#: sql_help.c:508 -#: sql_help.c:511 -#: sql_help.c:541 -#: sql_help.c:547 -#: sql_help.c:549 -#: sql_help.c:553 -#: sql_help.c:556 -#: sql_help.c:559 -#: sql_help.c:569 -#: sql_help.c:571 -#: sql_help.c:588 -#: sql_help.c:597 -#: sql_help.c:599 -#: sql_help.c:601 -#: sql_help.c:676 -#: sql_help.c:678 -#: sql_help.c:681 -#: sql_help.c:683 -#: sql_help.c:742 -#: sql_help.c:744 -#: sql_help.c:746 -#: sql_help.c:749 -#: sql_help.c:770 -#: sql_help.c:773 -#: sql_help.c:776 -#: sql_help.c:779 -#: sql_help.c:783 -#: sql_help.c:785 -#: sql_help.c:787 -#: sql_help.c:789 -#: sql_help.c:803 -#: sql_help.c:806 -#: sql_help.c:808 -#: sql_help.c:810 -#: sql_help.c:820 -#: sql_help.c:822 -#: sql_help.c:832 -#: sql_help.c:834 -#: sql_help.c:843 -#: sql_help.c:864 -#: sql_help.c:866 -#: sql_help.c:868 -#: sql_help.c:871 -#: sql_help.c:873 -#: sql_help.c:875 -#: sql_help.c:913 -#: sql_help.c:919 -#: sql_help.c:921 -#: sql_help.c:924 -#: sql_help.c:926 -#: sql_help.c:928 -#: sql_help.c:953 -#: sql_help.c:956 -#: sql_help.c:958 -#: sql_help.c:960 -#: sql_help.c:962 -#: sql_help.c:1002 -#: sql_help.c:1185 -#: sql_help.c:1193 -#: sql_help.c:1237 -#: sql_help.c:1241 -#: sql_help.c:1251 -#: sql_help.c:1269 -#: sql_help.c:1292 -#: sql_help.c:1324 -#: sql_help.c:1369 -#: sql_help.c:1411 -#: sql_help.c:1433 -#: sql_help.c:1453 -#: sql_help.c:1454 -#: sql_help.c:1471 -#: sql_help.c:1491 -#: sql_help.c:1513 -#: sql_help.c:1541 -#: sql_help.c:1562 -#: sql_help.c:1592 -#: sql_help.c:1773 -#: sql_help.c:1786 -#: sql_help.c:1803 -#: sql_help.c:1819 -#: sql_help.c:1842 -#: sql_help.c:1885 -#: sql_help.c:1889 -#: sql_help.c:1891 -#: sql_help.c:1909 -#: sql_help.c:1936 -#: sql_help.c:1969 -#: sql_help.c:1979 -#: sql_help.c:1988 -#: sql_help.c:2032 -#: sql_help.c:2050 -#: sql_help.c:2058 -#: sql_help.c:2066 -#: sql_help.c:2074 -#: sql_help.c:2090 -#: sql_help.c:2098 -#: sql_help.c:2107 -#: sql_help.c:2118 -#: sql_help.c:2126 -#: sql_help.c:2134 -#: sql_help.c:2142 -#: sql_help.c:2152 -#: sql_help.c:2161 -#: sql_help.c:2170 -#: sql_help.c:2178 -#: sql_help.c:2186 -#: sql_help.c:2195 -#: sql_help.c:2203 -#: sql_help.c:2219 -#: sql_help.c:2235 -#: sql_help.c:2243 -#: sql_help.c:2251 -#: sql_help.c:2259 -#: sql_help.c:2267 -#: sql_help.c:2276 -#: sql_help.c:2284 -#: sql_help.c:2301 -#: sql_help.c:2316 -#: sql_help.c:2508 -#: sql_help.c:2559 -#: sql_help.c:2586 -#: sql_help.c:2929 -#: sql_help.c:2975 -#: sql_help.c:3082 -msgid "name" -msgstr "å稱" +#: sql_help.c:4617 sql_help.c:4874 sql_help.c:5120 +msgid "and grouping_element can be one of:" +msgstr "其中 grouping_element å¯ä»¥æ˜¯:" + +#: sql_help.c:4625 sql_help.c:4882 sql_help.c:5128 +msgid "and with_query is:" +msgstr "且 with_query 是:" # describe.c:415 -# describe.c:745 -# describe.c:1478 -# describe.c:1587 -#: sql_help.c:27 -#: sql_help.c:30 -#: sql_help.c:33 -#: sql_help.c:317 -#: sql_help.c:320 -#: sql_help.c:2033 -msgid "type" -msgstr "type" - -#: sql_help.c:28 -#: sql_help.c:45 -#: sql_help.c:60 -#: sql_help.c:92 -#: sql_help.c:312 -#: sql_help.c:360 -#: sql_help.c:393 -#: sql_help.c:405 -#: sql_help.c:422 -#: sql_help.c:461 -#: sql_help.c:507 -#: sql_help.c:548 -#: sql_help.c:570 -#: sql_help.c:600 -#: sql_help.c:682 -#: sql_help.c:743 -#: sql_help.c:786 -#: sql_help.c:807 -#: sql_help.c:821 -#: sql_help.c:833 -#: sql_help.c:845 -#: sql_help.c:872 -#: sql_help.c:920 -#: sql_help.c:961 -msgid "new_name" -msgstr "new_name" +# describe.c:543 +# describe.c:1477 +#: sql_help.c:4629 sql_help.c:4886 sql_help.c:5132 +msgid "values" +msgstr "values" -#: sql_help.c:31 -#: sql_help.c:47 -#: sql_help.c:62 -#: sql_help.c:94 -#: sql_help.c:187 -#: sql_help.c:282 -#: sql_help.c:322 -#: sql_help.c:365 -#: sql_help.c:424 -#: sql_help.c:433 -#: sql_help.c:445 -#: sql_help.c:464 -#: sql_help.c:510 -#: sql_help.c:572 -#: sql_help.c:598 -#: sql_help.c:617 -#: sql_help.c:727 -#: sql_help.c:745 -#: sql_help.c:788 -#: sql_help.c:809 -#: sql_help.c:867 -#: sql_help.c:959 -msgid "new_owner" -msgstr "new_owner" +#: sql_help.c:4630 sql_help.c:4887 sql_help.c:5133 +msgid "insert" +msgstr "insert" -# catalog/dependency.c:1714 -#: sql_help.c:34 -#: sql_help.c:49 -#: sql_help.c:64 -#: sql_help.c:189 -#: sql_help.c:228 -#: sql_help.c:314 -#: sql_help.c:370 -#: sql_help.c:449 -#: sql_help.c:467 -#: sql_help.c:513 -#: sql_help.c:602 -#: sql_help.c:684 -#: sql_help.c:790 -#: sql_help.c:811 -#: sql_help.c:823 -#: sql_help.c:835 -#: sql_help.c:874 -#: sql_help.c:963 -msgid "new_schema" -msgstr "new_schema" +#: sql_help.c:4631 sql_help.c:4888 sql_help.c:5134 +msgid "update" +msgstr "update" -# postmaster/postmaster.c:1017 tcop/postgres.c:2115 -#: sql_help.c:88 -#: sql_help.c:279 -#: sql_help.c:323 -#: sql_help.c:542 -#: sql_help.c:614 -#: sql_help.c:804 -#: sql_help.c:914 -#: sql_help.c:940 -#: sql_help.c:1144 -#: sql_help.c:1149 -#: sql_help.c:1327 -#: sql_help.c:1345 -#: sql_help.c:1412 -#: sql_help.c:1542 -#: sql_help.c:1613 -#: sql_help.c:1788 -#: sql_help.c:1937 -#: sql_help.c:1959 -#: sql_help.c:2334 -msgid "option" -msgstr "é¸é …" +#: sql_help.c:4632 sql_help.c:4889 sql_help.c:5135 +msgid "delete" +msgstr "delete" -#: sql_help.c:89 -#: sql_help.c:543 -#: sql_help.c:915 -#: sql_help.c:1413 -#: sql_help.c:1543 -#: sql_help.c:1938 -msgid "where option can be:" -msgstr "其中é¸é …å¯ä»¥æ˜¯:" - -#: sql_help.c:90 -#: sql_help.c:544 -#: sql_help.c:916 -#: sql_help.c:1276 -#: sql_help.c:1544 -#: sql_help.c:1939 -msgid "connlimit" -msgstr "connlimit" +#: sql_help.c:4634 sql_help.c:4891 sql_help.c:5137 +msgid "search_seq_col_name" +msgstr "search_seq_col_name" -# describe.c:1342 -#: sql_help.c:96 -#: sql_help.c:728 -msgid "new_tablespace" -msgstr "new_tablespace" +#: sql_help.c:4636 sql_help.c:4893 sql_help.c:5139 +msgid "cycle_mark_col_name" +msgstr "cycle_mark_col_name" -# sql_help.h:366 -#: sql_help.c:98 -#: sql_help.c:101 -#: sql_help.c:103 -#: sql_help.c:374 -#: sql_help.c:376 -#: sql_help.c:377 -#: sql_help.c:551 -#: sql_help.c:555 -#: sql_help.c:558 -#: sql_help.c:922 -#: sql_help.c:925 -#: sql_help.c:927 -#: sql_help.c:1380 -#: sql_help.c:2603 -#: sql_help.c:2918 -msgid "configuration_parameter" -msgstr "configuration_parameter" +#: sql_help.c:4637 sql_help.c:4894 sql_help.c:5140 +msgid "cycle_mark_value" +msgstr "cycle_mark_value" + +#: sql_help.c:4638 sql_help.c:4895 sql_help.c:5141 +msgid "cycle_mark_default" +msgstr "cycle_mark_default" + +#: sql_help.c:4639 sql_help.c:4896 sql_help.c:5142 +msgid "cycle_path_col_name" +msgstr "cycle_path_col_name" # describe.c:415 # describe.c:543 # describe.c:1477 -#: sql_help.c:99 -#: sql_help.c:280 -#: sql_help.c:324 -#: sql_help.c:375 -#: sql_help.c:410 -#: sql_help.c:552 -#: sql_help.c:615 -#: sql_help.c:703 -#: sql_help.c:722 -#: sql_help.c:748 -#: sql_help.c:805 -#: sql_help.c:923 -#: sql_help.c:941 -#: sql_help.c:1328 -#: sql_help.c:1346 -#: sql_help.c:1381 -#: sql_help.c:1382 -#: sql_help.c:1441 -#: sql_help.c:1614 -#: sql_help.c:1688 -#: sql_help.c:1696 -#: sql_help.c:1728 -#: sql_help.c:1750 -#: sql_help.c:1789 -#: sql_help.c:1960 -#: sql_help.c:2919 -#: sql_help.c:2920 -msgid "value" -msgstr "value" - -#: sql_help.c:151 -msgid "target_role" -msgstr "target_role" - -#: sql_help.c:152 -#: sql_help.c:1577 -#: sql_help.c:2432 -#: sql_help.c:2439 -#: sql_help.c:2451 -#: sql_help.c:2457 -#: sql_help.c:2686 -#: sql_help.c:2693 -#: sql_help.c:2705 -#: sql_help.c:2711 -msgid "schema_name" -msgstr "schema_name" - -#: sql_help.c:153 -msgid "abbreviated_grant_or_revoke" -msgstr "abbreviated_grant_or_revoke" +#: sql_help.c:4666 +msgid "new_table" +msgstr "new_table" -#: sql_help.c:154 -msgid "where abbreviated_grant_or_revoke is one of:" -msgstr "其中 abbreviated_grant_or_revoke 是:" +#: sql_help.c:4737 +msgid "snapshot_id" +msgstr "snapshot_id" -# describe.c:1375 -#: sql_help.c:155 -#: sql_help.c:156 -#: sql_help.c:157 -#: sql_help.c:158 -#: sql_help.c:159 -#: sql_help.c:160 -#: sql_help.c:1416 -#: sql_help.c:1417 -#: sql_help.c:1418 -#: sql_help.c:1419 -#: sql_help.c:1420 -#: sql_help.c:1547 -#: sql_help.c:1548 -#: sql_help.c:1549 -#: sql_help.c:1550 -#: sql_help.c:1551 -#: sql_help.c:1942 -#: sql_help.c:1943 -#: sql_help.c:1944 -#: sql_help.c:1945 -#: sql_help.c:1946 -#: sql_help.c:2433 -#: sql_help.c:2437 -#: sql_help.c:2440 -#: sql_help.c:2442 -#: sql_help.c:2444 -#: sql_help.c:2446 -#: sql_help.c:2452 -#: sql_help.c:2454 -#: sql_help.c:2456 -#: sql_help.c:2458 -#: sql_help.c:2460 -#: sql_help.c:2461 -#: sql_help.c:2462 -#: sql_help.c:2687 -#: sql_help.c:2691 -#: sql_help.c:2694 -#: sql_help.c:2696 -#: sql_help.c:2698 -#: sql_help.c:2700 -#: sql_help.c:2706 -#: sql_help.c:2708 -#: sql_help.c:2710 -#: sql_help.c:2712 -#: sql_help.c:2714 -#: sql_help.c:2715 -#: sql_help.c:2716 -#: sql_help.c:2939 -msgid "role_name" -msgstr "role_name" +#: sql_help.c:5005 +msgid "sort_expression" +msgstr "sort_expression" -#: sql_help.c:180 -#: sql_help.c:694 -#: sql_help.c:696 -#: sql_help.c:955 -#: sql_help.c:1295 -#: sql_help.c:1299 -#: sql_help.c:1437 -#: sql_help.c:1700 -#: sql_help.c:1710 -#: sql_help.c:1732 -#: sql_help.c:2476 -#: sql_help.c:2824 -#: sql_help.c:2825 -#: sql_help.c:2829 -#: sql_help.c:2834 -#: sql_help.c:2893 -#: sql_help.c:2894 -#: sql_help.c:2899 -#: sql_help.c:2904 -#: sql_help.c:3027 -#: sql_help.c:3028 -#: sql_help.c:3032 -#: sql_help.c:3037 -#: sql_help.c:3108 -#: sql_help.c:3110 -#: sql_help.c:3141 -#: sql_help.c:3183 -#: sql_help.c:3184 -#: sql_help.c:3188 -#: sql_help.c:3193 -msgid "expression" -msgstr "expression" +# sql_help.h:25 +# sql_help.h:373 +#: sql_help.c:5149 sql_help.c:6133 +msgid "abort the current transaction" +msgstr "中止目å‰çš„交易" -#: sql_help.c:183 -msgid "domain_constraint" -msgstr "domain_constraint" +# sql_help.h:29 +#: sql_help.c:5155 +msgid "change the definition of an aggregate function" +msgstr "變更èšåˆå‡½æ•¸çš„定義" -# catalog/dependency.c:1511 -#: sql_help.c:185 -#: sql_help.c:710 -#: sql_help.c:711 -#: sql_help.c:730 -#: sql_help.c:1062 -#: sql_help.c:1298 -#: sql_help.c:1699 -#: sql_help.c:1709 -msgid "constraint_name" -msgstr "constraint_name" +# sql_help.h:45 +#: sql_help.c:5161 +msgid "change the definition of a collation" +msgstr "變更定åºçš„定義" -#: sql_help.c:225 -#: sql_help.c:227 -#: sql_help.c:229 -#: sql_help.c:231 -#: sql_help.c:1310 -#: sql_help.c:2082 -msgid "extension_name" -msgstr "extension_name" +# sql_help.h:33 +#: sql_help.c:5167 +msgid "change the definition of a conversion" +msgstr "變更編碼轉æ›çš„定義" -#: sql_help.c:226 -#: sql_help.c:613 -msgid "new_version" -msgstr "new_version" +# sql_help.h:37 +#: sql_help.c:5173 +msgid "change a database" +msgstr "變更資料庫" -#: sql_help.c:230 -#: sql_help.c:232 -msgid "member_object" -msgstr "member_object" +# sql_help.h:325 +#: sql_help.c:5179 +msgid "define default access privileges" +msgstr "定義é è¨­å­˜å–權é™" -#: sql_help.c:233 -msgid "where member_object is:" -msgstr "其中 member_object 是:" +# sql_help.h:41 +#: sql_help.c:5185 +msgid "change the definition of a domain" +msgstr "變更 domain 的定義" -#: sql_help.c:234 -#: sql_help.c:1057 -#: sql_help.c:2773 -msgid "agg_name" -msgstr "agg_name" +# sql_help.h:85 +#: sql_help.c:5191 +msgid "change the definition of an event trigger" +msgstr "變更事件觸發器的定義" -# describe.c:1689 -#: sql_help.c:235 -#: sql_help.c:1058 -#: sql_help.c:2774 -msgid "agg_type" -msgstr "agg_type" +# sql_help.h:33 +#: sql_help.c:5197 +msgid "change the definition of an extension" +msgstr "變更擴充功能的定義" -# describe.c:1688 -#: sql_help.c:236 -#: sql_help.c:1059 -#: sql_help.c:1217 -#: sql_help.c:1221 -#: sql_help.c:1223 -#: sql_help.c:2041 -msgid "source_type" -msgstr "source_type" +# sql_help.h:85 +#: sql_help.c:5203 +msgid "change the definition of a foreign-data wrapper" +msgstr "變更外部資料å°è£ç¨‹å¼çš„定義" -# describe.c:1689 -#: sql_help.c:237 -#: sql_help.c:1060 -#: sql_help.c:1218 -#: sql_help.c:1222 -#: sql_help.c:1224 -#: sql_help.c:2042 -msgid "target_type" -msgstr "target_type" +# sql_help.h:85 +#: sql_help.c:5209 +msgid "change the definition of a foreign table" +msgstr "變更外部資料表的定義" -# describe.c:1375 -#: sql_help.c:238 -#: sql_help.c:239 -#: sql_help.c:240 -#: sql_help.c:241 -#: sql_help.c:242 -#: sql_help.c:250 -#: sql_help.c:252 -#: sql_help.c:254 -#: sql_help.c:255 -#: sql_help.c:256 -#: sql_help.c:257 -#: sql_help.c:258 -#: sql_help.c:259 -#: sql_help.c:260 -#: sql_help.c:261 -#: sql_help.c:262 -#: sql_help.c:263 -#: sql_help.c:264 -#: sql_help.c:1054 -#: sql_help.c:1061 -#: sql_help.c:1064 -#: sql_help.c:1065 -#: sql_help.c:1066 -#: sql_help.c:1067 -#: sql_help.c:1068 -#: sql_help.c:1069 -#: sql_help.c:1074 -#: sql_help.c:1079 -#: sql_help.c:1081 -#: sql_help.c:1083 -#: sql_help.c:1084 -#: sql_help.c:1087 -#: sql_help.c:1088 -#: sql_help.c:1089 -#: sql_help.c:1090 -#: sql_help.c:1091 -#: sql_help.c:1092 -#: sql_help.c:1093 -#: sql_help.c:1094 -#: sql_help.c:1097 -#: sql_help.c:1098 -#: sql_help.c:2770 -#: sql_help.c:2775 -#: sql_help.c:2776 -#: sql_help.c:2782 -#: sql_help.c:2783 -#: sql_help.c:2784 -#: sql_help.c:2785 -#: sql_help.c:2786 -msgid "object_name" -msgstr "object_name" +# sql_help.h:45 +#: sql_help.c:5215 +msgid "change the definition of a function" +msgstr "變更函數的定義" -# describe.c:498 -#: sql_help.c:243 -#: sql_help.c:495 -#: sql_help.c:1070 -#: sql_help.c:1219 -#: sql_help.c:1254 -#: sql_help.c:1472 -#: sql_help.c:1503 -#: sql_help.c:1847 -#: sql_help.c:2447 -#: sql_help.c:2701 -#: sql_help.c:2777 -#: sql_help.c:2850 -#: sql_help.c:2855 -#: sql_help.c:3053 -#: sql_help.c:3058 -#: sql_help.c:3209 -#: sql_help.c:3214 -msgid "function_name" -msgstr "function_name" +#: sql_help.c:5221 +msgid "change role name or membership" +msgstr "變更角色å稱或æˆå“¡" -#: sql_help.c:244 -#: sql_help.c:352 -#: sql_help.c:357 -#: sql_help.c:362 -#: sql_help.c:367 -#: sql_help.c:1071 -#: sql_help.c:1370 -#: sql_help.c:2108 -#: sql_help.c:2448 -#: sql_help.c:2702 -#: sql_help.c:2778 -msgid "argmode" -msgstr "argmode" +# sql_help.h:53 +#: sql_help.c:5227 +msgid "change the definition of an index" +msgstr "變更索引的定義" -#: sql_help.c:245 -#: sql_help.c:353 -#: sql_help.c:358 -#: sql_help.c:363 -#: sql_help.c:368 -#: sql_help.c:1072 -#: sql_help.c:1371 -#: sql_help.c:2109 -#: sql_help.c:2779 -msgid "argname" -msgstr "argname" +# sql_help.h:57 +#: sql_help.c:5233 +msgid "change the definition of a procedural language" +msgstr "變更程åºèªžè¨€çš„定義" -# describe.c:1689 -#: sql_help.c:246 -#: sql_help.c:354 -#: sql_help.c:359 -#: sql_help.c:364 -#: sql_help.c:369 -#: sql_help.c:1073 -#: sql_help.c:1372 -#: sql_help.c:2110 -#: sql_help.c:2780 -msgid "argtype" -msgstr "argtype" +# sql_help.h:77 +#: sql_help.c:5239 +msgid "change the definition of a large object" +msgstr "變更大物件的定義" -# describe.c:512 -#: sql_help.c:247 -#: sql_help.c:488 -#: sql_help.c:1076 -#: sql_help.c:1496 -msgid "operator_name" -msgstr "operator_name" +# sql_help.h:53 +#: sql_help.c:5245 +msgid "change the definition of a materialized view" +msgstr "變更實體化檢視表的定義" -# describe.c:321 -#: sql_help.c:248 -#: sql_help.c:443 -#: sql_help.c:447 -#: sql_help.c:1077 -#: sql_help.c:1473 -#: sql_help.c:2143 -msgid "left_type" -msgstr "left_type" +# sql_help.h:65 +#: sql_help.c:5251 +msgid "change the definition of an operator" +msgstr "變更é‹ç®—符的定義" -# describe.c:321 -#: sql_help.c:249 -#: sql_help.c:444 -#: sql_help.c:448 -#: sql_help.c:1078 -#: sql_help.c:1474 -#: sql_help.c:2144 -msgid "right_type" -msgstr "right_type" +# sql_help.h:61 +#: sql_help.c:5257 +msgid "change the definition of an operator class" +msgstr "變更é‹ç®—符類別的定義" -#: sql_help.c:251 -#: sql_help.c:253 -#: sql_help.c:460 -#: sql_help.c:463 -#: sql_help.c:466 -#: sql_help.c:486 -#: sql_help.c:498 -#: sql_help.c:506 -#: sql_help.c:509 -#: sql_help.c:512 -#: sql_help.c:1080 -#: sql_help.c:1082 -#: sql_help.c:1493 -#: sql_help.c:1514 -#: sql_help.c:1715 -#: sql_help.c:2153 -#: sql_help.c:2162 -msgid "index_method" -msgstr "index_method" +# sql_help.h:65 +#: sql_help.c:5263 +msgid "change the definition of an operator family" +msgstr "變更é‹ç®—符æ—群的定義" -# describe.c:498 -#: sql_help.c:277 -#: sql_help.c:1325 -msgid "handler_function" -msgstr "handler_function" +# sql_help.h:33 +#: sql_help.c:5269 +msgid "change the definition of a row-level security policy" +msgstr "變更列層級安全政策的定義" -# commands/define.c:279 -#: sql_help.c:278 -#: sql_help.c:1326 -msgid "validator_function" -msgstr "validator_function" +# sql_help.h:57 +#: sql_help.c:5275 +msgid "change the definition of a procedure" +msgstr "變更程åºçš„定義" -# describe.c:498 -#: sql_help.c:307 -#: sql_help.c:355 -#: sql_help.c:677 -#: sql_help.c:865 -#: sql_help.c:1706 -#: sql_help.c:1707 -#: sql_help.c:1723 -#: sql_help.c:1724 -msgid "action" -msgstr "action" +# sql_help.h:45 +#: sql_help.c:5281 +msgid "change the definition of a publication" +msgstr "變更發布的定義" -# describe.c:744 -#: sql_help.c:309 -#: sql_help.c:316 -#: sql_help.c:318 -#: sql_help.c:319 -#: sql_help.c:321 -#: sql_help.c:596 -#: sql_help.c:679 -#: sql_help.c:686 -#: sql_help.c:690 -#: sql_help.c:691 -#: sql_help.c:695 -#: sql_help.c:697 -#: sql_help.c:698 -#: sql_help.c:699 -#: sql_help.c:701 -#: sql_help.c:704 -#: sql_help.c:706 -#: sql_help.c:954 -#: sql_help.c:957 -#: sql_help.c:972 -#: sql_help.c:1142 -#: sql_help.c:1146 -#: sql_help.c:1158 -#: sql_help.c:1159 -#: sql_help.c:1436 -#: sql_help.c:1599 -#: sql_help.c:1731 -#: sql_help.c:2434 -#: sql_help.c:2435 -#: sql_help.c:2475 -#: sql_help.c:2688 -#: sql_help.c:2689 -#: sql_help.c:3107 -#: sql_help.c:3109 -#: sql_help.c:3126 -#: sql_help.c:3129 -msgid "column" -msgstr "column" +# sql_help.h:37 +#: sql_help.c:5287 sql_help.c:5389 +msgid "change a database role" +msgstr "變更資料庫角色" -# describe.c:744 -#: sql_help.c:310 -#: sql_help.c:680 -msgid "new_column" -msgstr "new_column" - -#: sql_help.c:315 -#: sql_help.c:371 -#: sql_help.c:685 -#: sql_help.c:878 -msgid "where action is one of:" -msgstr "其中 action 是:" +# sql_help.h:45 +#: sql_help.c:5293 +msgid "change the definition of a routine" +msgstr "變更 routine 的定義" -#: sql_help.c:372 -#: sql_help.c:1378 -msgid "execution_cost" -msgstr "execution_cost" +# sql_help.h:77 +#: sql_help.c:5299 +msgid "change the definition of a rule" +msgstr "變更è¦å‰‡çš„定義" -#: sql_help.c:373 -#: sql_help.c:1379 -msgid "result_rows" -msgstr "result_rows" +# sql_help.h:69 +#: sql_help.c:5305 +msgid "change the definition of a schema" +msgstr "變更 schema 的定義" -# utils/misc/guc.c:237 -#: sql_help.c:388 -#: sql_help.c:390 -#: sql_help.c:392 -msgid "group_name" -msgstr "group_name" +# sql_help.h:73 +#: sql_help.c:5311 +msgid "change the definition of a sequence generator" +msgstr "變更åºåˆ—產生器的定義" -#: sql_help.c:389 -#: sql_help.c:391 -#: sql_help.c:938 -#: sql_help.c:1270 -#: sql_help.c:1578 -#: sql_help.c:1580 -#: sql_help.c:1761 -#: sql_help.c:1957 -#: sql_help.c:2292 -#: sql_help.c:2949 -msgid "user_name" -msgstr "user_name" +# sql_help.h:85 +#: sql_help.c:5317 +msgid "change the definition of a foreign server" +msgstr "變更外部伺æœå™¨çš„定義" -# describe.c:1342 -#: sql_help.c:407 -#: sql_help.c:1760 -#: sql_help.c:2227 -#: sql_help.c:2459 -#: sql_help.c:2713 -msgid "tablespace_name" -msgstr "tablespace_name" +# sql_help.h:33 +#: sql_help.c:5323 +msgid "change the definition of an extended statistics object" +msgstr "變更擴展統計物件的定義" -#: sql_help.c:409 -#: sql_help.c:412 -#: sql_help.c:721 -#: sql_help.c:723 -#: sql_help.c:1440 -#: sql_help.c:1687 -#: sql_help.c:1695 -#: sql_help.c:1727 -#: sql_help.c:1749 -msgid "storage_parameter" -msgstr "storage_parameter" +# sql_help.h:45 +#: sql_help.c:5329 +msgid "change the definition of a subscription" +msgstr "變更訂閱的定義" -# large_obj.c:264 -#: sql_help.c:432 -#: sql_help.c:1075 -#: sql_help.c:2781 -msgid "large_object_oid" -msgstr "large_object_oid" +# sql_help.h:366 +#: sql_help.c:5335 +msgid "change a server configuration parameter" +msgstr "變更伺æœå™¨çµ„æ…‹åƒæ•¸" -#: sql_help.c:487 -#: sql_help.c:499 -#: sql_help.c:1495 -msgid "strategy_number" -msgstr "strategy_number" +# sql_help.h:77 +#: sql_help.c:5341 +msgid "change the definition of a table" +msgstr "變更資料表的定義" -# describe.c:415 -# describe.c:745 -# describe.c:1478 -# describe.c:1587 -#: sql_help.c:489 -#: sql_help.c:490 -#: sql_help.c:493 -#: sql_help.c:494 -#: sql_help.c:500 -#: sql_help.c:501 -#: sql_help.c:503 -#: sql_help.c:504 -#: sql_help.c:1497 -#: sql_help.c:1498 -#: sql_help.c:1501 -#: sql_help.c:1502 -msgid "op_type" -msgstr "op_type" +# sql_help.h:81 +#: sql_help.c:5347 +msgid "change the definition of a tablespace" +msgstr "變更表空間的定義" -#: sql_help.c:491 -#: sql_help.c:1499 -msgid "sort_family_name" -msgstr "sort_family_name" +# sql_help.h:33 +#: sql_help.c:5353 +msgid "change the definition of a text search configuration" +msgstr "變更文字æœå°‹çµ„態的定義" -#: sql_help.c:492 -#: sql_help.c:502 -#: sql_help.c:1500 -msgid "support_number" -msgstr "support_number" +# sql_help.h:45 +#: sql_help.c:5359 +msgid "change the definition of a text search dictionary" +msgstr "變更文字æœå°‹å­—典的定義" -# describe.c:1689 -#: sql_help.c:496 -#: sql_help.c:1220 -#: sql_help.c:1504 -msgid "argument_type" -msgstr "argument_type" +# sql_help.h:81 +#: sql_help.c:5365 +msgid "change the definition of a text search parser" +msgstr "變更文字æœå°‹è§£æžå™¨çš„定義" -# command.c:915 -# command.c:939 -# startup.c:187 -# startup.c:205 -#: sql_help.c:545 -#: sql_help.c:917 -#: sql_help.c:1414 -#: sql_help.c:1545 -#: sql_help.c:1940 -msgid "password" -msgstr "密碼" +# sql_help.h:69 +#: sql_help.c:5371 +msgid "change the definition of a text search template" +msgstr "變更文字æœå°‹ç¯„本的定義" -#: sql_help.c:546 -#: sql_help.c:918 -#: sql_help.c:1415 -#: sql_help.c:1546 -#: sql_help.c:1941 -msgid "timestamp" -msgstr "timestamp" +# sql_help.h:85 +#: sql_help.c:5377 +msgid "change the definition of a trigger" +msgstr "變更觸發器的定義" -# commands/user.c:240 commands/user.c:371 -#: sql_help.c:550 -#: sql_help.c:554 -#: sql_help.c:557 -#: sql_help.c:560 -#: sql_help.c:2441 -#: sql_help.c:2695 -msgid "database_name" -msgstr "database_name" +# sql_help.h:89 +#: sql_help.c:5383 +msgid "change the definition of a type" +msgstr "變更型別的定義" -#: sql_help.c:589 -#: sql_help.c:1593 -msgid "increment" -msgstr "increment" +# sql_help.h:41 +#: sql_help.c:5395 +msgid "change the definition of a user mapping" +msgstr "變更使用者映射的定義" -#: sql_help.c:590 -#: sql_help.c:1594 -msgid "minvalue" -msgstr "minvalue" +# sql_help.h:53 +#: sql_help.c:5401 +msgid "change the definition of a view" +msgstr "變更檢視表的定義" -#: sql_help.c:591 -#: sql_help.c:1595 -msgid "maxvalue" -msgstr "maxvalue" +# sql_help.h:97 +#: sql_help.c:5407 +msgid "collect statistics about a database" +msgstr "收集資料庫的統計資料" -#: sql_help.c:592 -#: sql_help.c:1596 -#: sql_help.c:2837 -#: sql_help.c:2907 -#: sql_help.c:3040 -#: sql_help.c:3145 -#: sql_help.c:3196 -msgid "start" -msgstr "start" +# sql_help.h:101 +# sql_help.h:413 +#: sql_help.c:5413 sql_help.c:6211 +msgid "start a transaction block" +msgstr "開始交易å€å¡Š" -#: sql_help.c:593 -msgid "restart" -msgstr "restart" +# sql_help.h:261 +#: sql_help.c:5419 +msgid "invoke a procedure" +msgstr "呼å«ç¨‹åº" -#: sql_help.c:594 -#: sql_help.c:1597 -msgid "cache" -msgstr "cache" +# sql_help.h:105 +#: sql_help.c:5425 +msgid "force a write-ahead log checkpoint" +msgstr "強制執行 write-ahead 日誌檢查點" -#: sql_help.c:612 -#: sql_help.c:616 -#: sql_help.c:939 -#: sql_help.c:1344 -#: sql_help.c:1609 -#: sql_help.c:1958 -#: sql_help.c:2211 -#: sql_help.c:2293 -#: sql_help.c:2445 -#: sql_help.c:2699 -msgid "server_name" -msgstr "server_name" +# sql_help.h:109 +#: sql_help.c:5431 +msgid "close a cursor" +msgstr "關閉游標" -# describe.c:526 -#: sql_help.c:687 -#: sql_help.c:692 -#: sql_help.c:880 -#: sql_help.c:884 -#: sql_help.c:1293 -#: sql_help.c:1343 -#: sql_help.c:1492 -#: sql_help.c:1680 -#: sql_help.c:1887 -#: sql_help.c:2560 -msgid "data_type" -msgstr "data_type" +# sql_help.h:113 +#: sql_help.c:5437 +msgid "cluster a table according to an index" +msgstr "根據索引å°è³‡æ–™è¡¨é€²è¡Œåˆ†ç¾¤" -# describe.c:128 -#: sql_help.c:688 -#: sql_help.c:693 -#: sql_help.c:881 -#: sql_help.c:885 -#: sql_help.c:1294 -#: sql_help.c:1438 -#: sql_help.c:1681 -#: sql_help.c:1888 -msgid "collation" -msgstr "定åº" +# sql_help.h:117 +#: sql_help.c:5443 +msgid "define or change the comment of an object" +msgstr "建立或修改物件的註解" -# catalog/dependency.c:1511 -#: sql_help.c:689 -#: sql_help.c:1682 -#: sql_help.c:1693 -msgid "column_constraint" -msgstr "column_constraint" +# sql_help.h:121 +# sql_help.h:309 +#: sql_help.c:5449 sql_help.c:6007 +msgid "commit the current transaction" +msgstr "æäº¤ç›®å‰çš„交易" -#: sql_help.c:700 -msgid "integer" -msgstr "整數" +#: sql_help.c:5455 +msgid "commit a transaction that was earlier prepared for two-phase commit" +msgstr "æäº¤ä¹‹å‰ç‚ºå…©éšŽæ®µæäº¤æ‰€æº–備的交易" -#: sql_help.c:702 -#: sql_help.c:705 -msgid "attribute_option" -msgstr "attribute_option" +# sql_help.h:125 +#: sql_help.c:5461 +msgid "copy data between a file and a table" +msgstr "在檔案和資料表間複製資料" -# catalog/dependency.c:1511 -#: sql_help.c:707 -#: sql_help.c:709 -#: sql_help.c:1683 -#: sql_help.c:1694 -msgid "table_constraint" -msgstr "table_constraint" +# sql_help.h:133 +#: sql_help.c:5467 +msgid "define a new access method" +msgstr "å»ºç«‹å­˜å–æ–¹å¼" -#: sql_help.c:708 -msgid "table_constraint_using_index" -msgstr "table_constraint_using_index" +# sql_help.h:129 +#: sql_help.c:5473 +msgid "define a new aggregate function" +msgstr "建立èšåˆå‡½æ•¸" -# describe.c:575 -#: sql_help.c:712 -#: sql_help.c:713 -#: sql_help.c:714 -#: sql_help.c:715 -#: sql_help.c:1095 -msgid "trigger_name" -msgstr "trigger_name" +# sql_help.h:133 +#: sql_help.c:5479 +msgid "define a new cast" +msgstr "建立轉型" -#: sql_help.c:716 -#: sql_help.c:717 -#: sql_help.c:718 -#: sql_help.c:719 -msgid "rewrite_rule_name" -msgstr "rewrite_rule_name" +# sql_help.h:153 +#: sql_help.c:5485 +msgid "define a new collation" +msgstr "建立定åº" -# describe.c:543 -# describe.c:1477 -#: sql_help.c:720 -#: sql_help.c:731 -#: sql_help.c:1012 -msgid "index_name" -msgstr "index_name" +# sql_help.h:141 +#: sql_help.c:5491 +msgid "define a new encoding conversion" +msgstr "建立編碼轉æ›" -#: sql_help.c:724 -#: sql_help.c:725 -#: sql_help.c:1684 -#: sql_help.c:1686 -msgid "parent_table" -msgstr "parent_table" +# sql_help.h:145 +#: sql_help.c:5497 +msgid "create a new database" +msgstr "建立資料庫" -#: sql_help.c:726 -#: sql_help.c:1691 -msgid "type_name" -msgstr "type_name" +# sql_help.h:149 +#: sql_help.c:5503 +msgid "define a new domain" +msgstr "建立 domain" -#: sql_help.c:729 -msgid "and table_constraint_using_index is:" -msgstr "並且 table_constraint_using_index 是:" +# sql_help.h:201 +#: sql_help.c:5509 +msgid "define a new event trigger" +msgstr "建立事件觸發器" -# describe.c:1342 -#: sql_help.c:747 -#: sql_help.c:750 -msgid "tablespace_option" -msgstr "tablespace_option" +#: sql_help.c:5515 +msgid "install an extension" +msgstr "å®‰è£æ“´å……模組" -#: sql_help.c:771 -#: sql_help.c:774 -#: sql_help.c:780 -#: sql_help.c:784 -msgid "token_type" -msgstr "token_type" +# sql_help.h:205 +#: sql_help.c:5521 +msgid "define a new foreign-data wrapper" +msgstr "建立外部資料å°è£ç¨‹å¼" -#: sql_help.c:772 -#: sql_help.c:775 -msgid "dictionary_name" -msgstr "dictionary_name" +# sql_help.h:201 +#: sql_help.c:5527 +msgid "define a new foreign table" +msgstr "建立外部資料表" -#: sql_help.c:777 -#: sql_help.c:781 -msgid "old_dictionary" -msgstr "old_dictionary" +# sql_help.h:153 +#: sql_help.c:5533 +msgid "define a new function" +msgstr "建立函數" -#: sql_help.c:778 -#: sql_help.c:782 -msgid "new_dictionary" -msgstr "new_dictionary" +# sql_help.h:189 +#: sql_help.c:5539 sql_help.c:5599 sql_help.c:5701 +msgid "define a new database role" +msgstr "建立資料庫角色" -#: sql_help.c:869 -#: sql_help.c:879 -#: sql_help.c:882 -#: sql_help.c:883 -#: sql_help.c:1886 -msgid "attribute_name" -msgstr "attribute_name" +# sql_help.h:161 +#: sql_help.c:5545 +msgid "define a new index" +msgstr "建立索引" -#: sql_help.c:870 -msgid "new_attribute_name" -msgstr "new_attribute_name" +# sql_help.h:165 +#: sql_help.c:5551 +msgid "define a new procedural language" +msgstr "建立程åºèªžè¨€" -#: sql_help.c:876 -msgid "new_enum_value" -msgstr "new_enum_value" +# sql_help.h:213 +#: sql_help.c:5557 +msgid "define a new materialized view" +msgstr "建立實體化檢視表" -#: sql_help.c:877 -msgid "existing_enum_value" -msgstr "existing_enum_value" +# sql_help.h:173 +#: sql_help.c:5563 +msgid "define a new operator" +msgstr "建立é‹ç®—符" -#: sql_help.c:986 -#: sql_help.c:2964 -#: sql_help.c:2965 -#: sql_help.c:2989 -msgid "transaction_mode" -msgstr "transaction_mode" +# sql_help.h:169 +#: sql_help.c:5569 +msgid "define a new operator class" +msgstr "建立é‹ç®—符類別" -# access/transam/xact.c:2544 access/transam/xact.c:2635 -#: sql_help.c:987 -#: sql_help.c:2966 -#: sql_help.c:2990 -msgid "where transaction_mode is one of:" -msgstr "其中 transaction_mode 是:" +# sql_help.h:173 +#: sql_help.c:5575 +msgid "define a new operator family" +msgstr "建立é‹ç®—符æ—群" -# describe.c:415 -# describe.c:543 -# describe.c:1477 -#: sql_help.c:1011 -#: sql_help.c:1055 -#: sql_help.c:1063 -#: sql_help.c:1086 -#: sql_help.c:1096 -#: sql_help.c:1141 -#: sql_help.c:1145 -#: sql_help.c:1341 -#: sql_help.c:1678 -#: sql_help.c:1690 -#: sql_help.c:1747 -#: sql_help.c:2431 -#: sql_help.c:2436 -#: sql_help.c:2685 -#: sql_help.c:2690 -#: sql_help.c:2771 -#: sql_help.c:2839 -#: sql_help.c:2841 -#: sql_help.c:2870 -#: sql_help.c:2909 -#: sql_help.c:3042 -#: sql_help.c:3044 -#: sql_help.c:3073 -#: sql_help.c:3198 -#: sql_help.c:3200 -#: sql_help.c:3229 -msgid "table_name" -msgstr "table_name" +#: sql_help.c:5581 +msgid "define a new row-level security policy for a table" +msgstr "為資料表建立列層級安全政策" -# describe.c:1375 -#: sql_help.c:1056 -#: sql_help.c:1342 -#: sql_help.c:1375 -#: sql_help.c:1679 -#: sql_help.c:1692 -#: sql_help.c:1711 -#: sql_help.c:1713 -#: sql_help.c:1720 -#: sql_help.c:1748 -#: sql_help.c:1850 -#: sql_help.c:1970 -#: sql_help.c:2772 -#: sql_help.c:2865 -#: sql_help.c:3068 -#: sql_help.c:3224 -msgid "column_name" -msgstr "column_name" +# sql_help.h:165 +#: sql_help.c:5587 +msgid "define a new procedure" +msgstr "建立程åº" -# describe.c:1375 -#: sql_help.c:1085 -msgid "rule_name" -msgstr "rule_name" +# sql_help.h:153 +#: sql_help.c:5593 +msgid "define a new publication" +msgstr "建立發布" -#: sql_help.c:1099 -msgid "text" -msgstr "text" +# sql_help.h:177 +#: sql_help.c:5605 +msgid "define a new rewrite rule" +msgstr "建立é‡å¯«è¦å‰‡" -#: sql_help.c:1114 -#: sql_help.c:2569 -#: sql_help.c:2731 -msgid "transaction_id" -msgstr "transaction_id" +# sql_help.h:181 +#: sql_help.c:5611 +msgid "define a new schema" +msgstr "建立 schema" -# describe.c:1375 -#: sql_help.c:1143 -#: sql_help.c:1148 -#: sql_help.c:2495 -msgid "filename" -msgstr "filename" +# sql_help.h:185 +#: sql_help.c:5617 +msgid "define a new sequence generator" +msgstr "建立åºåˆ—產生器" -#: sql_help.c:1147 -#: sql_help.c:1752 -#: sql_help.c:1971 -#: sql_help.c:1989 -#: sql_help.c:2477 -msgid "query" -msgstr "query" +# sql_help.h:201 +#: sql_help.c:5623 +msgid "define a new foreign server" +msgstr "建立外部伺æœå™¨" -#: sql_help.c:1150 -#: sql_help.c:2337 -msgid "where option can be one of:" -msgstr "其中 option 是:" +# sql_help.h:133 +#: sql_help.c:5629 +msgid "define extended statistics" +msgstr "建立擴展統計" -# help.c:211 -#: sql_help.c:1151 -msgid "format_name" -msgstr "format_name" +# sql_help.h:153 +#: sql_help.c:5635 +msgid "define a new subscription" +msgstr "建立訂閱" -#: sql_help.c:1152 -#: sql_help.c:1155 -#: sql_help.c:2338 -#: sql_help.c:2339 -#: sql_help.c:2340 -#: sql_help.c:2341 -msgid "boolean" -msgstr "boolean" +# sql_help.h:189 +#: sql_help.c:5641 +msgid "define a new table" +msgstr "建立資料表" -#: sql_help.c:1153 -msgid "delimiter_character" -msgstr "delimiter_character" +# sql_help.h:193 +# sql_help.h:389 +#: sql_help.c:5647 sql_help.c:6169 +msgid "define a new table from the results of a query" +msgstr "ä»¥æŸ¥è©¢çµæžœå»ºç«‹è³‡æ–™è¡¨" -#: sql_help.c:1154 -msgid "null_string" -msgstr "null_string" +# sql_help.h:197 +#: sql_help.c:5653 +msgid "define a new tablespace" +msgstr "建立表空間" -# translator: %s represents a digit string -# fe-protocol3.c:651 -# fe-protocol3.c:659 -#: sql_help.c:1156 -msgid "quote_character" -msgstr "quote_character" +# sql_help.h:129 +#: sql_help.c:5659 +msgid "define a new text search configuration" +msgstr "建立文字æœå°‹çµ„æ…‹" -#: sql_help.c:1157 -msgid "escape_character" -msgstr "escape_character" +# sql_help.h:129 +#: sql_help.c:5665 +msgid "define a new text search dictionary" +msgstr "建立文字æœå°‹å­—å…¸" -# utils/mb/encnames.c:445 -#: sql_help.c:1160 -msgid "encoding_name" -msgstr "encoding_name" +# sql_help.h:197 +#: sql_help.c:5671 +msgid "define a new text search parser" +msgstr "建立文字æœå°‹è§£æžå™¨" -# describe.c:526 -#: sql_help.c:1186 -msgid "input_data_type" -msgstr "input_data_type" +# sql_help.h:181 +#: sql_help.c:5677 +msgid "define a new text search template" +msgstr "建立文字æœå°‹ç¯„本" -# describe.c:498 -#: sql_help.c:1187 -#: sql_help.c:1195 -msgid "sfunc" -msgstr "sfunc" +# sql_help.h:173 +#: sql_help.c:5683 +msgid "define a new transform" +msgstr "建立 transform" -# describe.c:526 -#: sql_help.c:1188 -#: sql_help.c:1196 -msgid "state_data_type" -msgstr "state_data_type" +# sql_help.h:201 +#: sql_help.c:5689 +msgid "define a new trigger" +msgstr "建立觸發器" -# describe.c:498 -#: sql_help.c:1189 -#: sql_help.c:1197 -msgid "ffunc" -msgstr "ffunc" +# sql_help.h:205 +#: sql_help.c:5695 +msgid "define a new data type" +msgstr "建立資料型別" -#: sql_help.c:1190 -#: sql_help.c:1198 -msgid "initial_condition" -msgstr "initial_condition" +#: sql_help.c:5707 +msgid "define a new mapping of a user to a foreign server" +msgstr "建立使用者至外部伺æœå™¨çš„æ˜ å°„" -# describe.c:512 -#: sql_help.c:1191 -#: sql_help.c:1199 -msgid "sort_operator" -msgstr "sort_operator" +# sql_help.h:213 +#: sql_help.c:5713 +msgid "define a new view" +msgstr "建立檢視表" -#: sql_help.c:1192 -msgid "or the old syntax" -msgstr "或是舊語法" +# sql_help.h:217 +#: sql_help.c:5719 +msgid "deallocate a prepared statement" +msgstr "釋放已編譯陳述å¼" -# describe.c:1689 -#: sql_help.c:1194 -msgid "base_type" -msgstr "base_type" +# sql_help.h:221 +#: sql_help.c:5725 +msgid "define a cursor" +msgstr "建立游標" -# help.c:127 -#: sql_help.c:1238 -msgid "locale" -msgstr "locale" +# sql_help.h:225 +#: sql_help.c:5731 +msgid "delete rows of a table" +msgstr "刪除資料表中的資料列" -#: sql_help.c:1239 -#: sql_help.c:1273 -msgid "lc_collate" -msgstr "lc_collate" +#: sql_help.c:5737 +msgid "discard session state" +msgstr "拋棄工作階段狀態" -# describe.c:415 -# describe.c:745 -# describe.c:1478 -# describe.c:1587 -#: sql_help.c:1240 -#: sql_help.c:1274 -msgid "lc_ctype" -msgstr "lc_ctype" +#: sql_help.c:5743 +msgid "execute an anonymous code block" +msgstr "執行匿å程å¼å€å¡Š" -# describe.c:1636 -#: sql_help.c:1242 -msgid "existing_collation" -msgstr "existing_collation" +# sql_help.h:233 +#: sql_help.c:5749 +msgid "remove an access method" +msgstr "åˆªé™¤å­˜å–æ–¹å¼" -# describe.c:187 -#: sql_help.c:1252 -msgid "source_encoding" -msgstr "source_encoding" +# sql_help.h:229 +#: sql_help.c:5755 +msgid "remove an aggregate function" +msgstr "刪除èšåˆå‡½æ•¸" -# describe.c:365 -#: sql_help.c:1253 -msgid "dest_encoding" -msgstr "dest_encoding" +# sql_help.h:233 +#: sql_help.c:5761 +msgid "remove a cast" +msgstr "刪除轉型" -#: sql_help.c:1271 -#: sql_help.c:1787 -msgid "template" -msgstr "template" +# sql_help.h:249 +#: sql_help.c:5767 +msgid "remove a collation" +msgstr "刪除定åº" -# describe.c:365 -#: sql_help.c:1272 -msgid "encoding" -msgstr "encoding" +# sql_help.h:237 +#: sql_help.c:5773 +msgid "remove a conversion" +msgstr "刪除編碼轉æ›" -# describe.c:1342 -#: sql_help.c:1275 -#: sql_help.c:1442 -#: sql_help.c:1689 -#: sql_help.c:1697 -#: sql_help.c:1729 -#: sql_help.c:1751 -msgid "tablespace" -msgstr "tablespace" +# sql_help.h:241 +#: sql_help.c:5779 +msgid "remove a database" +msgstr "刪除資料庫" -# catalog/dependency.c:1511 -#: sql_help.c:1296 -msgid "constraint" -msgstr "constraint" +# sql_help.h:245 +#: sql_help.c:5785 +msgid "remove a domain" +msgstr "刪除 domain" -# describe.c:1174 -#: sql_help.c:1297 -msgid "where constraint is:" -msgstr "其中 constraint 是:" +# sql_help.h:293 +#: sql_help.c:5791 +msgid "remove an event trigger" +msgstr "刪除事件觸發器" -# describe.c:82 -# describe.c:177 -# describe.c:247 -# describe.c:320 -# describe.c:415 -# describe.c:469 -# describe.c:1476 -# describe.c:1585 -# describe.c:1633 -#: sql_help.c:1311 -msgid "schema" -msgstr "schema" +# sql_help.h:237 +#: sql_help.c:5797 +msgid "remove an extension" +msgstr "刪除擴充模組" -#: sql_help.c:1312 -msgid "version" -msgstr "版本" +# sql_help.h:297 +#: sql_help.c:5803 +msgid "remove a foreign-data wrapper" +msgstr "刪除外部資料å°è£ç¨‹å¼" -#: sql_help.c:1313 -msgid "old_version" -msgstr "舊版本" +# sql_help.h:285 +#: sql_help.c:5809 +msgid "remove a foreign table" +msgstr "刪除外部資料表" -# describe.c:1639 -#: sql_help.c:1373 -#: sql_help.c:1701 -msgid "default_expr" -msgstr "default_expr" +# sql_help.h:249 +#: sql_help.c:5815 +msgid "remove a function" +msgstr "刪除函數" -# describe.c:1689 -#: sql_help.c:1374 -msgid "rettype" -msgstr "rettype" +# sql_help.h:241 +#: sql_help.c:5821 sql_help.c:5887 sql_help.c:5989 +msgid "remove a database role" +msgstr "刪除資料庫角色" -#: sql_help.c:1376 -msgid "column_type" -msgstr "column_type" +# sql_help.h:257 +#: sql_help.c:5827 +msgid "remove an index" +msgstr "刪除索引" -#: sql_help.c:1377 -#: sql_help.c:2023 -#: sql_help.c:2453 -#: sql_help.c:2707 -msgid "lang_name" -msgstr "lang_name" +# sql_help.h:261 +#: sql_help.c:5833 +msgid "remove a procedural language" +msgstr "刪除程åºèªžè¨€" -# describe.c:977 -#: sql_help.c:1383 -msgid "definition" -msgstr "definition" +# sql_help.h:305 +#: sql_help.c:5839 +msgid "remove a materialized view" +msgstr "刪除實體化檢視表" -#: sql_help.c:1384 -msgid "obj_file" -msgstr "obj_file" +# sql_help.h:269 +#: sql_help.c:5845 +msgid "remove an operator" +msgstr "刪除é‹ç®—符" -# utils/adt/encode.c:307 -#: sql_help.c:1385 -msgid "link_symbol" -msgstr "link_symbol" +# sql_help.h:265 +#: sql_help.c:5851 +msgid "remove an operator class" +msgstr "刪除é‹ç®—符類別" -#: sql_help.c:1386 -msgid "attribute" -msgstr "屬性" +# sql_help.h:269 +#: sql_help.c:5857 +msgid "remove an operator family" +msgstr "刪除é‹ç®—符æ—群" -#: sql_help.c:1421 -#: sql_help.c:1552 -#: sql_help.c:1947 -msgid "uid" -msgstr "uid" +#: sql_help.c:5863 +msgid "remove database objects owned by a database role" +msgstr "åˆªé™¤è³‡æ–™åº«è§’è‰²æ“æœ‰çš„資料庫物件" -#: sql_help.c:1435 -msgid "method" -msgstr "方法" +#: sql_help.c:5869 +msgid "remove a row-level security policy from a table" +msgstr "刪除資料表的列層級安全政策" -#: sql_help.c:1439 -#: sql_help.c:1733 -msgid "opclass" -msgstr "opclass" +# sql_help.h:261 +#: sql_help.c:5875 +msgid "remove a procedure" +msgstr "刪除程åº" -# describe.c:937 -#: sql_help.c:1443 -#: sql_help.c:1719 -msgid "predicate" -msgstr "predicate" +# sql_help.h:249 +#: sql_help.c:5881 +msgid "remove a publication" +msgstr "刪除發布" -#: sql_help.c:1455 -msgid "call_handler" -msgstr "call_handler" +# sql_help.h:249 +#: sql_help.c:5893 +msgid "remove a routine" +msgstr "刪除 routine" -#: sql_help.c:1456 -msgid "inline_handler" -msgstr "inline_handler" +# sql_help.h:273 +#: sql_help.c:5899 +msgid "remove a rewrite rule" +msgstr "刪除é‡å¯«è¦å‰‡" -# describe.c:498 -#: sql_help.c:1457 -msgid "valfunction" -msgstr "valfunction" +# sql_help.h:277 +#: sql_help.c:5905 +msgid "remove a schema" +msgstr "刪除 schema" -#: sql_help.c:1475 -msgid "com_op" -msgstr "com_op" +# sql_help.h:281 +#: sql_help.c:5911 +msgid "remove a sequence" +msgstr "刪除åºåˆ—" -#: sql_help.c:1476 -msgid "neg_op" -msgstr "neg_op" +# sql_help.h:237 +#: sql_help.c:5917 +msgid "remove a foreign server descriptor" +msgstr "刪除外部伺æœå™¨æè¿°ç¬¦" -#: sql_help.c:1477 -msgid "res_proc" -msgstr "res_proc" +# sql_help.h:237 +#: sql_help.c:5923 +msgid "remove extended statistics" +msgstr "刪除擴展統計" -#: sql_help.c:1478 -msgid "join_proc" -msgstr "join_proc" +# sql_help.h:249 +#: sql_help.c:5929 +msgid "remove a subscription" +msgstr "刪除訂閱" -#: sql_help.c:1494 -msgid "family_name" -msgstr "family_name" +# sql_help.h:285 +#: sql_help.c:5935 +msgid "remove a table" +msgstr "刪除資料表" -# describe.c:1635 -#: sql_help.c:1505 -msgid "storage_type" -msgstr "storage_type" +# sql_help.h:289 +#: sql_help.c:5941 +msgid "remove a tablespace" +msgstr "刪除表空間" -#: sql_help.c:1563 -#: sql_help.c:1843 -msgid "event" -msgstr "event" +# sql_help.h:301 +#: sql_help.c:5947 +msgid "remove a text search configuration" +msgstr "刪除文字æœå°‹çµ„æ…‹" -# help.c:123 -#: sql_help.c:1565 -#: sql_help.c:1846 -#: sql_help.c:2005 -#: sql_help.c:2828 -#: sql_help.c:2830 -#: sql_help.c:2898 -#: sql_help.c:2900 -#: sql_help.c:3031 -#: sql_help.c:3033 -#: sql_help.c:3112 -#: sql_help.c:3187 -#: sql_help.c:3189 -msgid "condition" -msgstr "condition" +# sql_help.h:301 +#: sql_help.c:5953 +msgid "remove a text search dictionary" +msgstr "刪除文字æœå°‹å­—å…¸" -#: sql_help.c:1566 -#: sql_help.c:1567 -#: sql_help.c:1568 -msgid "command" -msgstr "command" +# sql_help.h:289 +#: sql_help.c:5959 +msgid "remove a text search parser" +msgstr "刪除文字æœå°‹è§£æžå™¨" -#: sql_help.c:1579 -#: sql_help.c:1581 -msgid "schema_element" -msgstr "schema_element" +# sql_help.h:277 +#: sql_help.c:5965 +msgid "remove a text search template" +msgstr "刪除文字æœå°‹ç¯„本" -#: sql_help.c:1610 -msgid "server_type" -msgstr "server_type" +# sql_help.h:269 +#: sql_help.c:5971 +msgid "remove a transform" +msgstr "刪除 transform" -# utils/misc/guc.c:1652 -#: sql_help.c:1611 -msgid "server_version" -msgstr "server_version" +# sql_help.h:293 +#: sql_help.c:5977 +msgid "remove a trigger" +msgstr "刪除觸發器" -#: sql_help.c:1612 -#: sql_help.c:2443 -#: sql_help.c:2697 -msgid "fdw_name" -msgstr "fdw_name" +# sql_help.h:297 +#: sql_help.c:5983 +msgid "remove a data type" +msgstr "刪除資料型別" -# help.c:88 -#: sql_help.c:1685 -msgid "like_option" -msgstr "like_option" +#: sql_help.c:5995 +msgid "remove a user mapping for a foreign server" +msgstr "刪除外部伺æœå™¨çš„使用者映射" -# describe.c:1174 -#: sql_help.c:1698 -msgid "where column_constraint is:" -msgstr "其中 column_constraint 是:" +# sql_help.h:305 +#: sql_help.c:6001 +msgid "remove a view" +msgstr "刪除檢視表" -#: sql_help.c:1702 -#: sql_help.c:1703 -#: sql_help.c:1712 -#: sql_help.c:1714 -#: sql_help.c:1718 -msgid "index_parameters" -msgstr "index_parameters" +# sql_help.h:313 +#: sql_help.c:6013 +msgid "execute a prepared statement" +msgstr "執行已編譯陳述å¼" -# describe.c:415 -# describe.c:543 -# describe.c:1477 -#: sql_help.c:1704 -#: sql_help.c:1721 -msgid "reftable" -msgstr "reftable" +# sql_help.h:317 +#: sql_help.c:6019 +msgid "show the execution plan of a statement" +msgstr "顯示陳述å¼çš„執行計劃" -# describe.c:744 -#: sql_help.c:1705 -#: sql_help.c:1722 -msgid "refcolumn" -msgstr "refcolumn" +# sql_help.h:321 +#: sql_help.c:6025 +msgid "retrieve rows from a query using a cursor" +msgstr "ä½¿ç”¨æ¸¸æ¨™æ“·å–æŸ¥è©¢çš„資料列" -# catalog/dependency.c:1511 -#: sql_help.c:1708 -msgid "and table_constraint is:" -msgstr "並且 table_constraint 是:" +# sql_help.h:325 +#: sql_help.c:6031 +msgid "define access privileges" +msgstr "å®šç¾©å­˜å–æ¬Šé™" -#: sql_help.c:1716 -msgid "exclude_element" -msgstr "exclude_element" +# sql_help.h:85 +#: sql_help.c:6037 +msgid "import table definitions from a foreign server" +msgstr "從外部伺æœå™¨åŒ¯å…¥è³‡æ–™è¡¨å®šç¾©" -#: sql_help.c:1725 -msgid "and like_option is:" -msgstr "並且 like_option 是:" +# sql_help.h:329 +#: sql_help.c:6043 +msgid "create new rows in a table" +msgstr "在資料表中建立新的資料列" -#: sql_help.c:1726 -msgid "index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are:" -msgstr "UNIQUE, PRIMARY KEY, and EXCLUDE æ¢ä»¶ç´„æŸçš„ index_parameters 是:" +# sql_help.h:333 +#: sql_help.c:6049 +msgid "listen for a notification" +msgstr "監è½é€šçŸ¥" -#: sql_help.c:1730 -msgid "exclude_element in an EXCLUDE constraint is:" -msgstr "EXCLUDE ç´„æŸæ¢ä»¶çš„ exclude_element 是:" +# sql_help.h:337 +#: sql_help.c:6055 +msgid "load a shared library file" +msgstr "載入共用程å¼åº«æª”案" -#: sql_help.c:1762 -msgid "directory" -msgstr "directory" +# sql_help.h:341 +#: sql_help.c:6061 +msgid "lock a table" +msgstr "鎖定資料表" -#: sql_help.c:1774 -msgid "parser_name" -msgstr "parser_name" +#: sql_help.c:6067 +msgid "conditionally insert, update, or delete rows of a table" +msgstr "有æ¢ä»¶åœ°æ’å…¥ã€æ›´æ–°æˆ–刪除資料表的資料列" -#: sql_help.c:1775 -msgid "source_config" -msgstr "source_config" +# sql_help.h:345 +#: sql_help.c:6073 +msgid "position a cursor" +msgstr "移動游標ä½ç½®" -# describe.c:498 -#: sql_help.c:1804 -msgid "start_function" -msgstr "start_function" +# sql_help.h:349 +#: sql_help.c:6079 +msgid "generate a notification" +msgstr "產生通知" -# sql_help.h:249 -#: sql_help.c:1805 -msgid "gettoken_function" -msgstr "gettoken_function" +# sql_help.h:353 +#: sql_help.c:6085 +msgid "prepare a statement for execution" +msgstr "é å…ˆç·¨è­¯é™³è¿°å¼ä»¥åŸ·è¡Œ" -# describe.c:498 -#: sql_help.c:1806 -msgid "end_function" -msgstr "end_function" +# sql_help.h:25 +# sql_help.h:373 +#: sql_help.c:6091 +msgid "prepare the current transaction for two-phase commit" +msgstr "為目å‰çš„交易準備兩階段æäº¤" -# describe.c:498 -#: sql_help.c:1807 -msgid "lextypes_function" -msgstr "lextypes_function" +#: sql_help.c:6097 +msgid "change the ownership of database objects owned by a database role" +msgstr "è®Šæ›´ç”±è³‡æ–™åº«è§’è‰²æ“æœ‰çš„資料庫物件的所有權" -# describe.c:498 -#: sql_help.c:1808 -msgid "headline_function" -msgstr "headline_function" +#: sql_help.c:6103 +msgid "replace the contents of a materialized view" +msgstr "替æ›å¯¦é«”化檢視表的內容" -# describe.c:498 -#: sql_help.c:1820 -msgid "init_function" -msgstr "init_function" +# sql_help.h:357 +#: sql_help.c:6109 +msgid "rebuild indexes" +msgstr "é‡å»ºç´¢å¼•" -# describe.c:498 -#: sql_help.c:1821 -msgid "lexize_function" -msgstr "lexize_function" +# sql_help.h:361 +#: sql_help.c:6115 +msgid "release a previously defined savepoint" +msgstr "釋放先å‰å»ºç«‹çš„儲存點" -#: sql_help.c:1845 -msgid "referenced_table_name" -msgstr "referenced_table_name" +# sql_help.h:365 +#: sql_help.c:6121 +msgid "restore the value of a run-time parameter to the default value" +msgstr "å°‡åŸ·è¡Œæ™‚æœŸåƒæ•¸é‚„原æˆé è¨­å€¼" -# utils/adt/regproc.c:644 utils/adt/regproc.c:1276 -#: sql_help.c:1848 -msgid "arguments" -msgstr "arguments" +# sql_help.h:369 +#: sql_help.c:6127 +msgid "remove access privileges" +msgstr "ç§»é™¤å­˜å–æ¬Šé™" -#: sql_help.c:1849 -msgid "where event can be one of:" -msgstr "其中 event 是:" +#: sql_help.c:6139 +msgid "cancel a transaction that was earlier prepared for two-phase commit" +msgstr "å–æ¶ˆå…ˆå‰ç‚ºå…©éšŽæäº¤å¯æº–備的交易" -#: sql_help.c:1890 -#: sql_help.c:2787 -msgid "label" -msgstr "label" +# sql_help.h:377 +#: sql_help.c:6145 +msgid "roll back to a savepoint" +msgstr "還原至儲存點" -# describe.c:498 -#: sql_help.c:1892 -msgid "input_function" -msgstr "input_function" +# sql_help.h:381 +#: sql_help.c:6151 +msgid "define a new savepoint within the current transaction" +msgstr "在目å‰çš„交易中建立新的儲存點" -# describe.c:498 -#: sql_help.c:1893 -msgid "output_function" -msgstr "output_function" +# sql_help.h:117 +#: sql_help.c:6157 +msgid "define or change a security label applied to an object" +msgstr "建立或變更物件的安全性標籤" -# sql_help.h:249 -#: sql_help.c:1894 -msgid "receive_function" -msgstr "receive_function" +# sql_help.h:385 +#: sql_help.c:6163 sql_help.c:6217 sql_help.c:6253 +msgid "retrieve rows from a table or view" +msgstr "從資料表或檢視表讀å–資料列" -# describe.c:498 -#: sql_help.c:1895 -msgid "send_function" -msgstr "send_function" +# sql_help.h:393 +#: sql_help.c:6175 +msgid "change a run-time parameter" +msgstr "è®Šæ›´åŸ·è¡Œæ™‚æœŸåƒæ•¸" -#: sql_help.c:1896 -msgid "type_modifier_input_function" -msgstr "type_modifier_input_function" +# sql_help.h:397 +#: sql_help.c:6181 +msgid "set constraint check timing for the current transaction" +msgstr "設定目å‰äº¤æ˜“çš„ç´„æŸæª¢æŸ¥æ™‚機" -#: sql_help.c:1897 -msgid "type_modifier_output_function" -msgstr "type_modifier_output_function" +# sql_help.h:405 +#: sql_help.c:6187 +msgid "set the current user identifier of the current session" +msgstr "設定目å‰å·¥ä½œéšŽæ®µçš„ç›®å‰ä½¿ç”¨è€…識別碼" -# describe.c:498 -#: sql_help.c:1898 -msgid "analyze_function" -msgstr "analyze_function" +# sql_help.h:401 +#: sql_help.c:6193 +msgid "set the session user identifier and the current user identifier of the current session" +msgstr "設定目å‰å·¥ä½œéšŽæ®µçš„工作階段使用者識別碼和目å‰ä½¿ç”¨è€…識別碼" -#: sql_help.c:1899 -msgid "internallength" -msgstr "internallength" +# sql_help.h:405 +#: sql_help.c:6199 +msgid "set the characteristics of the current transaction" +msgstr "設定目å‰äº¤æ˜“的屬性" -#: sql_help.c:1900 -msgid "alignment" -msgstr "alignment" +# sql_help.h:409 +#: sql_help.c:6205 +msgid "show the value of a run-time parameter" +msgstr "é¡¯ç¤ºåŸ·è¡Œæ™‚æœŸçš„åƒæ•¸å€¼" -# describe.c:1635 -#: sql_help.c:1901 -msgid "storage" -msgstr "storage" +# sql_help.h:425 +#: sql_help.c:6223 +msgid "empty a table or set of tables" +msgstr "清空資料表或一組資料表" -#: sql_help.c:1902 -msgid "like_type" -msgstr "like_type" +# sql_help.h:421 +#: sql_help.c:6229 +msgid "stop listening for a notification" +msgstr "åœæ­¢ç›£è½é€šçŸ¥" -#: sql_help.c:1903 -msgid "category" -msgstr "category" +# sql_help.h:425 +#: sql_help.c:6235 +msgid "update rows of a table" +msgstr "更新資料表中的資料列" -#: sql_help.c:1904 -msgid "preferred" -msgstr "preferred" +# sql_help.h:429 +#: sql_help.c:6241 +msgid "garbage-collect and optionally analyze a database" +msgstr "åžƒåœ¾å›žæ”¶ä¸¦é¸æ“‡æ€§åˆ†æžè³‡æ–™åº«" -# describe.c:1639 -#: sql_help.c:1905 -msgid "default" -msgstr "default" +#: sql_help.c:6247 +msgid "compute a set of rows" +msgstr "計算一組資料列" -#: sql_help.c:1906 -msgid "element" -msgstr "element" +# translator: %s represents an SQL statement name +# access/transam/xact.c:2246 +#: startup.c:220 +#, c-format +msgid "-1 can only be used in non-interactive mode" +msgstr "-1 åªèƒ½åœ¨éžäº’動模å¼ä¸‹ä½¿ç”¨" -# utils/adt/encode.c:295 -#: sql_help.c:1907 -msgid "delimiter" -msgstr "delimiter" +# utils/init/miscinit.c:533 +#: startup.c:343 +#, c-format +msgid "could not open log file \"%s\": %m" +msgstr "無法開啟日誌檔 \"%s\": %m" + +#: startup.c:460 +#, c-format +msgid "" +"Type \"help\" for help.\n" +"\n" +msgstr "" +"輸入 \"help\" 顯示說明。\n" +"\n" -# describe.c:415 -# describe.c:543 -# describe.c:1477 -#: sql_help.c:1908 -msgid "collatable" -msgstr "collatable" +# startup.c:446 +#: startup.c:612 +#, c-format +msgid "could not set printing parameter \"%s\"" +msgstr "ç„¡æ³•è¨­å®šé¡¯ç¤ºåƒæ•¸ \"%s\"" -#: sql_help.c:2001 -#: sql_help.c:2473 -#: sql_help.c:2823 -#: sql_help.c:2892 -#: sql_help.c:3026 -#: sql_help.c:3104 -#: sql_help.c:3182 -msgid "with_query" -msgstr "with_query" +# tcop/postgres.c:2636 tcop/postgres.c:2652 +#: startup.c:719 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "用 \"%s --help\" å–得更多資訊。" -#: sql_help.c:2003 -#: sql_help.c:2842 -#: sql_help.c:2845 -#: sql_help.c:2848 -#: sql_help.c:2852 -#: sql_help.c:3045 -#: sql_help.c:3048 -#: sql_help.c:3051 -#: sql_help.c:3055 -#: sql_help.c:3106 -#: sql_help.c:3201 -#: sql_help.c:3204 -#: sql_help.c:3207 -#: sql_help.c:3211 -msgid "alias" -msgstr "alias" +# startup.c:557 +#: startup.c:735 +#, c-format +msgid "extra command-line argument \"%s\" ignored" +msgstr "é¡å¤–çš„å‘½ä»¤åˆ—åƒæ•¸ \"%s\" 已被忽略" -#: sql_help.c:2004 -msgid "using_list" -msgstr "using_list" +#: startup.c:783 +#, c-format +msgid "could not find own program executable" +msgstr "找ä¸åˆ°è‡ªèº«ç¨‹å¼çš„執行檔" -#: sql_help.c:2006 -#: sql_help.c:2367 -#: sql_help.c:2536 -#: sql_help.c:3113 -msgid "cursor_name" -msgstr "cursor_name" +#: tab-complete.c:6078 +#, c-format +msgid "" +"tab completion query failed: %s\n" +"Query was:\n" +"%s" +msgstr "" +"tab 補全命令失敗: %s\n" +"查詢如下: \n" +"%s" -# commands/typecmds.c:637 -#: sql_help.c:2007 -#: sql_help.c:2478 -#: sql_help.c:3114 -msgid "output_expression" -msgstr "output_expression" +# access/transam/xlog.c:3720 +#: variables.c:139 +#, c-format +msgid "unrecognized value \"%s\" for \"%s\": Boolean expected" +msgstr "值 \"%s\" å°æ–¼ \"%s\" 是無法識別的: é æœŸç‚ºå¸ƒæž—值" -#: sql_help.c:2008 -#: sql_help.c:2479 -#: sql_help.c:2826 -#: sql_help.c:2895 -#: sql_help.c:3029 -#: sql_help.c:3115 -#: sql_help.c:3185 -msgid "output_name" -msgstr "output_name" +# utils/adt/formatting.c:2044 +#: variables.c:176 +#, c-format +msgid "invalid value \"%s\" for \"%s\": integer expected" +msgstr "值 \"%s\" å°æ–¼ \"%s\" 是無效的: é æœŸç‚ºæ•´æ•¸" -#: sql_help.c:2024 -msgid "code" -msgstr "code" +# commands/user.c:209 +#: variables.c:224 +#, c-format +msgid "invalid variable name: \"%s\"" +msgstr "無效的變數å稱: \"%s\"" -#: sql_help.c:2317 -msgid "parameter" -msgstr "parameter" +#: variables.c:418 +#, c-format +msgid "" +"unrecognized value \"%s\" for \"%s\"\n" +"Available values are: %s." +msgstr "" +"\"%s\" å°æ–¼ \"%s\" 是無法識別的值\n" +"å¯ç”¨çš„值為: %s。" -#: sql_help.c:2335 -#: sql_help.c:2336 -#: sql_help.c:2561 -msgid "statement" -msgstr "陳述å¼" +#, c-format +#~ msgid " --help show this help, then exit\n" +#~ msgstr " --help é¡¯ç¤ºèªªæ˜Žç„¶å¾ŒçµæŸ\n" -# help.c:123 -#: sql_help.c:2366 -#: sql_help.c:2535 -msgid "direction" -msgstr "direction" +#, c-format +#~ msgid " --version output version information, then exit\n" +#~ msgstr " --version é¡¯ç¤ºç‰ˆæœ¬è³‡è¨Šç„¶å¾ŒçµæŸ\n" -#: sql_help.c:2368 -#: sql_help.c:2537 -msgid "where direction can be empty or one of:" -msgstr "其中 direction å¯ä»¥æ˜¯ç©ºçš„æˆ–是:" - -#: sql_help.c:2369 -#: sql_help.c:2370 -#: sql_help.c:2371 -#: sql_help.c:2372 -#: sql_help.c:2373 -#: sql_help.c:2538 -#: sql_help.c:2539 -#: sql_help.c:2540 -#: sql_help.c:2541 -#: sql_help.c:2542 -#: sql_help.c:2836 -#: sql_help.c:2838 -#: sql_help.c:2906 -#: sql_help.c:2908 -#: sql_help.c:3039 -#: sql_help.c:3041 -#: sql_help.c:3144 -#: sql_help.c:3146 -#: sql_help.c:3195 -#: sql_help.c:3197 -msgid "count" -msgstr "count" +# help.c:252 +#, c-format +#~ msgid "" +#~ " \\lo_export LOBOID FILE\n" +#~ " \\lo_import FILE [COMMENT]\n" +#~ " \\lo_list\n" +#~ " \\lo_unlink LOBOID large object operations\n" +#~ msgstr "" +#~ " \\lo_export LOBOID FILE\n" +#~ " \\lo_import FILE [COMMENT]\n" +#~ " \\lo_list\n" +#~ " \\lo_unlink LOBOID 大型物件é‹ç®—å­\n" -# describe.c:415 -# describe.c:543 -# describe.c:1477 -#: sql_help.c:2438 -#: sql_help.c:2692 -msgid "sequence_name" -msgstr "sequence_name" +# help.c:239 +#, c-format +#~ msgid "" +#~ " \\pset NAME [VALUE] set table output option\n" +#~ " (NAME := {format|border|expanded|fieldsep|footer|null|\n" +#~ " numericlocale|recordsep|tuples_only|title|tableattr|pager})\n" +#~ msgstr "" +#~ " \\pset NAME [VALUE] 設定資料表輸出é¸é …\n" +#~ " (NAME := {format|border|expanded|fieldsep|footer|null|\n" +#~ " numericlocale|recordsep|tuples_only|title|tableattr|pager})\n" -#: sql_help.c:2449 -#: sql_help.c:2703 -msgid "arg_name" -msgstr "arg_name" +#~ msgid " as user \"%s\"" +#~ msgstr " 用戶 \"%s\"" -# describe.c:1689 -#: sql_help.c:2450 -#: sql_help.c:2704 -msgid "arg_type" -msgstr "arg_type" +#~ msgid " at port \"%s\"" +#~ msgstr " 埠號 \"%s\"" -#: sql_help.c:2455 -#: sql_help.c:2709 -msgid "loid" -msgstr "loid" +#~ msgid " on host \"%s\"" +#~ msgstr " 在 \"%s\" 主機上" -#: sql_help.c:2487 -#: sql_help.c:2550 -#: sql_help.c:3090 -msgid "channel" -msgstr "channel" +# command.c:788 +# command.c:808 +# command.c:1163 +# command.c:1170 +# command.c:1180 +# command.c:1192 +# command.c:1205 +# command.c:1219 +# command.c:1241 +# command.c:1272 +# common.c:170 +# copy.c:530 +# copy.c:575 +#, c-format +#~ msgid "%s: %s\n" +#~ msgstr "%s: %s\n" -#: sql_help.c:2509 -msgid "lockmode" -msgstr "lockmode" +# command.c:1148 +#, c-format +#~ msgid "%s: could not open log file \"%s\": %s\n" +#~ msgstr "%s: 無法開啟日誌檔 \"%s\": %s\n" -#: sql_help.c:2510 -msgid "where lockmode is one of:" -msgstr "其中 lockmode å¯ä»¥æ˜¯:" +# startup.c:502 +#, c-format +#~ msgid "%s: could not set variable \"%s\"\n" +#~ msgstr "%s: 無法設定變數 \"%s\"\n" -#: sql_help.c:2551 -msgid "payload" -msgstr "payload" +# common.c:78 +#, c-format +#~ msgid "%s: pg_strdup: cannot duplicate null pointer (internal error)\n" +#~ msgstr "%s: pg_strdup : 無法複製空指標 (內部錯誤)\n" -#: sql_help.c:2577 -msgid "old_role" -msgstr "old_role" +# print.c:428 +#, c-format +#~ msgid "(No rows)\n" +#~ msgstr "(無資料列)\n" -#: sql_help.c:2578 -msgid "new_role" -msgstr "new_role" +# command.c:915 +# command.c:939 +# startup.c:187 +# startup.c:205 +#~ msgid "Enter new password: " +#~ msgstr "輸入新密碼: " -# sql_help.h:382 -#: sql_help.c:2594 -#: sql_help.c:2739 -#: sql_help.c:2747 -msgid "savepoint_name" -msgstr "savepoint_name" +# command.c:120 +#, c-format +#~ msgid "Invalid command \\%s. Try \\? for help.\n" +#~ msgstr "無效的命令 \\%s,用 \\? 顯示說明。\n" -#: sql_help.c:2769 -msgid "provider" -msgstr "provider" +# describe.c:1588 +#~ msgid "Modifier" +#~ msgstr "修飾詞" -#: sql_help.c:2827 -#: sql_help.c:2858 -#: sql_help.c:2860 -#: sql_help.c:2897 -#: sql_help.c:3030 -#: sql_help.c:3061 -#: sql_help.c:3063 -#: sql_help.c:3186 -#: sql_help.c:3217 -#: sql_help.c:3219 -msgid "from_item" -msgstr "from_item" +# describe.c:752 +#~ msgid "Modifiers" +#~ msgstr "修飾詞" -#: sql_help.c:2831 -#: sql_help.c:2901 -#: sql_help.c:3034 -#: sql_help.c:3190 -msgid "window_name" -msgstr "window_name" +# describe.c:1542 +#, c-format +#~ msgid "No matching relations found.\n" +#~ msgstr "沒有找到符åˆçš„é—œè¯ã€‚\n" -# describe.c:977 -#: sql_help.c:2832 -#: sql_help.c:2902 -#: sql_help.c:3035 -#: sql_help.c:3191 -msgid "window_definition" -msgstr "window_definition" +# describe.c:1542 +#, c-format +#~ msgid "No matching settings found.\n" +#~ msgstr "沒有找到符åˆçš„設定。\n" -#: sql_help.c:2833 -#: sql_help.c:2844 -#: sql_help.c:2866 -#: sql_help.c:2903 -#: sql_help.c:3036 -#: sql_help.c:3047 -#: sql_help.c:3069 -#: sql_help.c:3192 -#: sql_help.c:3203 -#: sql_help.c:3225 -msgid "select" -msgstr "select" +#, c-format +#~ msgid "No per-database role settings support in this server version.\n" +#~ msgstr "此伺æœå™¨ç‰ˆæœ¬ä¸æ”¯æ´ç¨ç«‹è³‡æ–™åº« role 設定。\n" -#: sql_help.c:2840 -#: sql_help.c:3043 -#: sql_help.c:3199 -msgid "where from_item can be one of:" -msgstr "其中 from_item å¯ä»¥æ˜¯:" +# describe.c:1544 +#, c-format +#~ msgid "No relations found.\n" +#~ msgstr "找ä¸åˆ°é—œè¯ã€‚\n" -#: sql_help.c:2843 -#: sql_help.c:2846 -#: sql_help.c:2849 -#: sql_help.c:2853 -#: sql_help.c:3046 -#: sql_help.c:3049 -#: sql_help.c:3052 -#: sql_help.c:3056 -#: sql_help.c:3202 -#: sql_help.c:3205 -#: sql_help.c:3208 -#: sql_help.c:3212 -msgid "column_alias" -msgstr "column_alias" +# describe.c:1544 +#, c-format +#~ msgid "No settings found.\n" +#~ msgstr "找ä¸åˆ°è¨­å®šã€‚\n" -#: sql_help.c:2847 -#: sql_help.c:2864 -#: sql_help.c:3050 -#: sql_help.c:3067 -#: sql_help.c:3206 -#: sql_help.c:3223 -msgid "with_query_name" -msgstr "with_query_name" +# describe.c:593 +#~ msgid "Object Description" +#~ msgstr "物件æè¿°" -# gram.y:3496 utils/adt/regproc.c:639 -#: sql_help.c:2851 -#: sql_help.c:2856 -#: sql_help.c:3054 -#: sql_help.c:3059 -#: sql_help.c:3210 -#: sql_help.c:3215 -msgid "argument" -msgstr "argument" +#, c-format +#~ msgid "Password encryption failed.\n" +#~ msgstr "密碼加密失敗。\n" -# describe.c:977 -#: sql_help.c:2854 -#: sql_help.c:2857 -#: sql_help.c:3057 -#: sql_help.c:3060 -#: sql_help.c:3213 -#: sql_help.c:3216 -msgid "column_definition" -msgstr "column_definition" +# startup.c:652 +#, c-format +#~ msgid "SSL connection (unknown cipher)\n" +#~ msgstr "SSL 連線 (䏿˜Žå¯†æ–‡)\n" -#: sql_help.c:2859 -#: sql_help.c:3062 -#: sql_help.c:3218 -msgid "join_type" -msgstr "join_type" +#~ msgid "Showing locale-adjusted numeric output." +#~ msgstr "顯示å€åŸŸèª¿æ•´å¾Œçš„æ•¸å­—輸出。" -#: sql_help.c:2861 -#: sql_help.c:3064 -#: sql_help.c:3220 -msgid "join_condition" -msgstr "join_condition" +# command.c:1416 +#~ msgid "Showing only tuples." +#~ msgstr "åªé¡¯ç¤º Tuples。" -#: sql_help.c:2862 -#: sql_help.c:3065 -#: sql_help.c:3221 -msgid "join_column" -msgstr "join_column" +# describe.c:187 +#~ msgid "Source code" +#~ msgstr "原始程å¼" -#: sql_help.c:2863 -#: sql_help.c:3066 -#: sql_help.c:3222 -msgid "and with_query is:" -msgstr "並且 with_query 是:" +# describe.c:875 +#, c-format +#~ msgid "Special relation \"%s.%s\"" +#~ msgstr "ç‰¹æ®Šé—œè¯ \"%s.%s\"" -#: sql_help.c:2867 -#: sql_help.c:3070 -#: sql_help.c:3226 -msgid "insert" -msgstr "insert" +# describe.c:117 +#, c-format +#~ msgid "The server (version %d.%d) does not support altering default privileges.\n" +#~ msgstr "伺æœå™¨(版本 %d.%d) 䏿”¯æ´ä¿®æ”¹é è¨­æ¬Šé™ã€‚\n" -#: sql_help.c:2868 -#: sql_help.c:3071 -#: sql_help.c:3227 -msgid "update" -msgstr "update" +# describe.c:117 +#, c-format +#~ msgid "The server (version %d.%d) does not support foreign servers.\n" +#~ msgstr "伺æœå™¨ (版本 %d.%d) 䏿”¯æ´å¤–部伺æœå™¨ã€‚\n" -#: sql_help.c:2869 -#: sql_help.c:3072 -#: sql_help.c:3228 -msgid "delete" -msgstr "delete" +# describe.c:117 +#, c-format +#~ msgid "The server (version %d.%d) does not support foreign tables.\n" +#~ msgstr "伺æœå™¨(版本 %d.%d) 䏿”¯æ´ foreign 資料表。\n" -# describe.c:415 -# describe.c:543 -# describe.c:1477 -#: sql_help.c:2896 -msgid "new_table" -msgstr "new_table" +# describe.c:117 +#, c-format +#~ msgid "The server (version %d.%d) does not support foreign-data wrappers.\n" +#~ msgstr "伺æœå™¨ (版本 %d.%d) 䏿”¯æ´å¤–部資料包è£å‡½å¼ã€‚\n" -#: sql_help.c:2921 -msgid "timezone" -msgstr "timezone" +# describe.c:117 +#, c-format +#~ msgid "The server (version %d.%d) does not support full text search.\n" +#~ msgstr "伺æœå™¨ (版本 %d.%d) 䏿”¯æ´æ–‡æœ¬æœå°‹ã€‚\n" -#: sql_help.c:3111 -msgid "from_list" -msgstr "from_list" +# describe.c:117 +#, c-format +#~ msgid "The server (version %d.%d) does not support savepoints for ON_ERROR_ROLLBACK.\n" +#~ msgstr "伺æœå™¨ (版本 %d.%d) 䏿”¯æ´ ON_ERROR_ROLLBACK 的儲存點。\n" -#: sql_help.c:3142 -msgid "sort_expression" -msgstr "sort_expression" +# startup.c:533 +# startup.c:539 +#, c-format +#~ msgid "Try \"%s --help\" for more information.\n" +#~ msgstr "嘗試 \"%s --help\" 以得到更多資訊。\n" -# command.c:240 -#: ../../port/exec.c:125 -#: ../../port/exec.c:239 -#: ../../port/exec.c:282 +# common.c:636 +# common.c:871 #, c-format -msgid "could not identify current directory: %s" -msgstr "無法識別目å‰ç›®éŒ„: %s" +#~ msgid "You are not connected.\n" +#~ msgstr "ç›®å‰æ²’有連線。\n" -# command.c:122 -#: ../../port/exec.c:144 +# command.c:696 +# command.c:745 #, c-format -msgid "invalid binary \"%s\"" -msgstr "無效的二進制碼 \"%s\"" +#~ msgid "\\%s: error\n" +#~ msgstr "\\%s: 錯誤\n" -# command.c:1103 -#: ../../port/exec.c:193 +# copy.c:562 #, c-format -msgid "could not read binary \"%s\"" -msgstr "無法讀å–二進制碼 \"%s\"" +#~ msgid "\\copy: %s" +#~ msgstr "\\copy: %s" -#: ../../port/exec.c:200 +# copy.c:566 #, c-format -msgid "could not find a \"%s\" to execute" -msgstr "未能找到 \"%s\" 來執行" +#~ msgid "\\copy: unexpected response (%d)\n" +#~ msgstr "\\copy: æ„外回應 (%d)\n" + +#~ msgid "agg_name" +#~ msgstr "agg_name" + +# describe.c:1689 +#~ msgid "agg_type" +#~ msgstr "agg_type" + +#~ msgid "attribute" +#~ msgstr "屬性" -# command.c:256 -#: ../../port/exec.c:255 -#: ../../port/exec.c:291 #, c-format -msgid "could not change directory to \"%s\"" -msgstr "無法切æ›ç›®éŒ„至 \"%s\"" +#~ msgid "child process was terminated by signal %s" +#~ msgstr "å­é€²ç¨‹è¢«ä¿¡è™Ÿ %s 終止" -# command.c:1103 -#: ../../port/exec.c:270 #, c-format -msgid "could not read symbolic link \"%s\"" -msgstr "無法讀å–ç¬¦è™Ÿé€£çµ \"%s\"" +#~ msgid "collate %s" +#~ msgstr "collate %s" -#: ../../port/exec.c:517 +# describe.c:744 +#~ msgid "column" +#~ msgstr "column" + +# startup.c:629 +#~ msgid "contains support for command-line editing" +#~ msgstr "包å«å‘½ä»¤åˆ—編輯支æ´" + +# command.c:256 #, c-format -msgid "child process exited with exit code %d" -msgstr "å­é€²ç¨‹çµæŸï¼ŒçµæŸä»£ç¢¼ %d" +#~ msgid "could not change directory to \"%s\"" +#~ msgstr "無法切æ›ç›®éŒ„至 \"%s\"" -#: ../../port/exec.c:521 +# help.c:70 #, c-format -msgid "child process was terminated by exception 0x%X" -msgstr "å­é€²ç¨‹è¢«ä¾‹å¤–(exception) 0x%X 終止" +#~ msgid "could not get current user name: %s\n" +#~ msgstr "無法å–å¾—ç›®å‰ç”¨æˆ¶å稱: %s\n" -#: ../../port/exec.c:530 +# command.c:240 #, c-format -msgid "child process was terminated by signal %s" -msgstr "å­é€²ç¨‹è¢«ä¿¡è™Ÿ %s 終止" +#~ msgid "could not identify current directory: %s" +#~ msgstr "無法識別目å‰ç›®éŒ„: %s" -#: ../../port/exec.c:533 +# command.c:1103 #, c-format -msgid "child process was terminated by signal %d" -msgstr "å­é€²ç¨‹è¢«ä¿¡è™Ÿ %d 終止" +#~ msgid "could not read symbolic link \"%s\"" +#~ msgstr "無法讀å–ç¬¦è™Ÿé€£çµ \"%s\"" + +# describe.c:526 +#~ msgid "data type" +#~ msgstr "資料型別" -#: ../../port/exec.c:537 +# describe.c:1639 #, c-format -msgid "child process exited with unrecognized status %d" -msgstr "å­é€²ç¨‹çµæŸï¼Œä¸æ˜Žç‹€æ…‹ä»£ç¢¼ %d" +#~ msgid "default %s" +#~ msgstr "é è¨­å€¼ %s" -#~ msgid " on host \"%s\"" -#~ msgstr " 在 \"%s\" 主機上" +#~ msgid "from_list" +#~ msgstr "from_list" -#~ msgid " at port \"%s\"" -#~ msgstr " 埠號 \"%s\"" +# describe.c:526 +#~ msgid "input_data_type" +#~ msgstr "input_data_type" -#~ msgid " as user \"%s\"" -#~ msgstr " 用戶 \"%s\"" +# describe.c:744 +#~ msgid "new_column" +#~ msgstr "new_column" + +# help.c:211 +#~ msgid "normal" +#~ msgstr "normal" + +#~ msgid "not null" +#~ msgstr "éž Null" + +# describe.c:1478 +#~ msgid "special" +#~ msgstr "特殊" + +# describe.c:1342 +#~ msgid "tablespace" +#~ msgstr "tablespace" + +#~ msgid "timezone" +#~ msgstr "timezone" + +#~ msgid "where direction can be empty or one of:" +#~ msgstr "其中 direction å¯ä»¥æ˜¯ç©ºçš„æˆ–是:" diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c index 969cd9908e531..0d99d00ac922c 100644 --- a/src/bin/psql/prompt.c +++ b/src/bin/psql/prompt.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/prompt.c */ diff --git a/src/bin/psql/prompt.h b/src/bin/psql/prompt.h index af5f84cb8a1fe..f7c4cf018b2dd 100644 --- a/src/bin/psql/prompt.h +++ b/src/bin/psql/prompt.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/prompt.h */ diff --git a/src/bin/psql/psqlscanslash.h b/src/bin/psql/psqlscanslash.h index 7724242f371d7..8afd748e87e1f 100644 --- a/src/bin/psql/psqlscanslash.h +++ b/src/bin/psql/psqlscanslash.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/psqlscanslash.h */ @@ -18,7 +18,7 @@ enum slash_option_type OT_SQLID, /* treat as SQL identifier */ OT_SQLIDHACK, /* SQL identifier, but don't downcase */ OT_FILEPIPE, /* it's a filename or pipe */ - OT_WHOLE_LINE /* just snarf the rest of the line */ + OT_WHOLE_LINE, /* just snarf the rest of the line */ }; diff --git a/src/bin/psql/psqlscanslash.l b/src/bin/psql/psqlscanslash.l index 5c020f30b9054..e1ae8627dbf27 100644 --- a/src/bin/psql/psqlscanslash.l +++ b/src/bin/psql/psqlscanslash.l @@ -8,7 +8,7 @@ * * See fe_utils/psqlscan_int.h for additional commentary. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -18,6 +18,8 @@ */ #include "postgres_fe.h" +#include + #include "common.h" #include "psqlscanslash.h" @@ -108,7 +110,7 @@ extern void slash_yyset_column(int column_no, yyscan_t yyscanner); /* * Assorted character class definitions that should match psqlscan.l. */ -space [ \t\n\r\f] +space [ \t\n\r\f\v] quote ' xeoctesc [\\][0-7]{1,3} xehexesc [\\]x[0-9A-Fa-f]{1,2} @@ -608,7 +610,7 @@ psql_scan_slash_option(PsqlScanState state, /* empty arg */ break; case xslasharg: - /* Strip any unquoted trailing semi-colons if requested */ + /* Strip any unquoted trailing semicolons if requested */ if (semicolon) { while (unquoted_option_chars-- > 0 && @@ -640,7 +642,22 @@ psql_scan_slash_option(PsqlScanState state, termPQExpBuffer(&mybuf); return NULL; case xslashwholeline: - /* always okay */ + /* + * In whole-line mode, we interpret semicolon = true as stripping + * trailing whitespace as well as semicolons; this gives the + * nearest equivalent to what semicolon = true does in normal + * mode. Note there's no concept of quoting in this mode. + */ + if (semicolon) + { + while (mybuf.len > 0 && + (mybuf.data[mybuf.len - 1] == ';' || + (isascii((unsigned char) mybuf.data[mybuf.len - 1]) && + isspace((unsigned char) mybuf.data[mybuf.len - 1])))) + { + mybuf.data[--mybuf.len] = '\0'; + } + } break; default: /* can't get here */ diff --git a/src/bin/psql/settings.h b/src/bin/psql/settings.h index 1106954236d73..505f99d8e47de 100644 --- a/src/bin/psql/settings.h +++ b/src/bin/psql/settings.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/settings.h */ @@ -37,21 +37,21 @@ typedef enum PSQL_ECHO_NONE, PSQL_ECHO_QUERIES, PSQL_ECHO_ERRORS, - PSQL_ECHO_ALL + PSQL_ECHO_ALL, } PSQL_ECHO; typedef enum { PSQL_ECHO_HIDDEN_OFF, PSQL_ECHO_HIDDEN_ON, - PSQL_ECHO_HIDDEN_NOEXEC + PSQL_ECHO_HIDDEN_NOEXEC, } PSQL_ECHO_HIDDEN; typedef enum { PSQL_ERROR_ROLLBACK_OFF, PSQL_ERROR_ROLLBACK_INTERACTIVE, - PSQL_ERROR_ROLLBACK_ON + PSQL_ERROR_ROLLBACK_ON, } PSQL_ERROR_ROLLBACK; typedef enum @@ -59,7 +59,7 @@ typedef enum PSQL_COMP_CASE_PRESERVE_UPPER, PSQL_COMP_CASE_PRESERVE_LOWER, PSQL_COMP_CASE_UPPER, - PSQL_COMP_CASE_LOWER + PSQL_COMP_CASE_LOWER, } PSQL_COMP_CASE; typedef enum @@ -67,14 +67,14 @@ typedef enum hctl_none = 0, hctl_ignorespace = 1, hctl_ignoredups = 2, - hctl_ignoreboth = hctl_ignorespace | hctl_ignoredups + hctl_ignoreboth = hctl_ignorespace | hctl_ignoredups, } HistControl; enum trivalue { TRI_DEFAULT, TRI_NO, - TRI_YES + TRI_YES, }; typedef struct _psqlSettings diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c index 5a28b6f71320d..036caaec2ffca 100644 --- a/src/bin/psql/startup.c +++ b/src/bin/psql/startup.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/startup.c */ @@ -47,7 +47,7 @@ enum _actions { ACT_SINGLE_QUERY, ACT_SINGLE_SLASH, - ACT_FILE + ACT_FILE, }; typedef struct SimpleActionListCell diff --git a/src/bin/psql/stringutils.c b/src/bin/psql/stringutils.c index 0e91387be466c..c07f7d13007eb 100644 --- a/src/bin/psql/stringutils.c +++ b/src/bin/psql/stringutils.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/stringutils.c */ diff --git a/src/bin/psql/stringutils.h b/src/bin/psql/stringutils.h index afbaf6f12fbf7..f742b4f87c66d 100644 --- a/src/bin/psql/stringutils.h +++ b/src/bin/psql/stringutils.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/stringutils.h */ diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl index 9ac27db212046..bd4fdd2030a37 100644 --- a/src/bin/psql/t/001_basic.pl +++ b/src/bin/psql/t/001_basic.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use locale; use PostgreSQL::Test::Cluster; @@ -161,7 +161,7 @@ sub psql_fails_like '\errverbose with no previous error'); # There are three main ways to run a query that might affect -# \errverbose: The normal way, using a cursor by setting FETCH_COUNT, +# \errverbose: The normal way, piecemeal retrieval using FETCH_COUNT, # and using \gdesc. Test them all. like( @@ -184,10 +184,10 @@ sub psql_fails_like "\\set FETCH_COUNT 1\nSELECT error;\n\\errverbose", on_error_stop => 0))[2], qr/\A^psql::2: ERROR: .*$ -^LINE 2: SELECT error;$ +^LINE 1: SELECT error;$ ^ *^.*$ ^psql::3: error: ERROR: [0-9A-Z]{5}: .*$ -^LINE 2: SELECT error;$ +^LINE 1: SELECT error;$ ^ *^.*$ ^LOCATION: .*$/m, '\errverbose after FETCH_COUNT query with error'); @@ -352,8 +352,38 @@ sub psql_fails_like # Check \watch # Note: the interval value is parsed with locale-aware strtod() -psql_like($node, sprintf('SELECT 1 \watch c=3 i=%g', 0.01), - qr/1\n1\n1/, '\watch with 3 iterations'); +psql_like( + $node, sprintf('SELECT 1 \watch c=3 i=%g', 0.01), + qr/1\n1\n1/, '\watch with 3 iterations, interval of 0.01'); + +# Sub-millisecond wait works, equivalent to 0. +psql_like( + $node, sprintf('SELECT 1 \watch c=3 i=%g', 0.0001), + qr/1\n1\n1/, '\watch with 3 iterations, interval of 0.0001'); + +# Check \watch minimum row count +psql_fails_like( + $node, + 'SELECT 3 \watch m=x', + qr/incorrect minimum row count/, + '\watch, invalid minimum row setting'); + +psql_fails_like( + $node, + 'SELECT 3 \watch m=1 min_rows=2', + qr/minimum row count specified more than once/, + '\watch, minimum rows is specified more than once'); + +psql_like( + $node, + sprintf( + q{with x as ( + select now()-backend_start AS howlong + from pg_stat_activity + where pid = pg_backend_pid() + ) select 123 from x where howlong < '2 seconds' \watch i=%g m=2}, 0.5), + qr/^123$/, + '\watch, 2 minimum rows'); # Check \watch errors psql_fails_like( @@ -382,4 +412,35 @@ sub psql_fails_like qr/iteration count is specified more than once/, '\watch, iteration count is specified more than once'); +# Test \g output piped into a program. +# The program is perl -pe '' to simply copy the input to the output. +my $g_file = "$tempdir/g_file_1.out"; +my $perlbin = $^X; +$perlbin =~ s!\\!/!g if $PostgreSQL::Test::Utils::windows_os; +my $pipe_cmd = "$perlbin -pe '' >$g_file"; + +psql_like($node, "SELECT 'one' \\g | $pipe_cmd", qr//, "one command \\g"); +my $c1 = slurp_file($g_file); +like($c1, qr/one/); + +psql_like($node, "SELECT 'two' \\; SELECT 'three' \\g | $pipe_cmd", + qr//, "two commands \\g"); +my $c2 = slurp_file($g_file); +like($c2, qr/two.*three/s); + + +psql_like( + $node, + "\\set SHOW_ALL_RESULTS 0\nSELECT 'four' \\; SELECT 'five' \\g | $pipe_cmd", + qr//, + "two commands \\g with only last result"); +my $c3 = slurp_file($g_file); +like($c3, qr/five/); +unlike($c3, qr/four/); + +psql_like($node, "copy (values ('foo'),('bar')) to stdout \\g | $pipe_cmd", + qr//, "copy output passed to \\g pipe"); +my $c4 = slurp_file($g_file); +like($c4, qr/foo.*bar/s); + done_testing(); diff --git a/src/bin/psql/t/010_tab_completion.pl b/src/bin/psql/t/010_tab_completion.pl index 4cd0fa468037b..b45c39f0f5249 100644 --- a/src/bin/psql/t/010_tab_completion.pl +++ b/src/bin/psql/t/010_tab_completion.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -46,25 +46,6 @@ . "CREATE TYPE enum1 AS ENUM ('foo', 'bar', 'baz', 'BLACK');\n" . "CREATE PUBLICATION some_publication;\n"); -# Developers would not appreciate this test adding a bunch of junk to -# their ~/.psql_history, so be sure to redirect history into a temp file. -# We might as well put it in the test log directory, so that buildfarm runs -# capture the result for possible debugging purposes. -my $historyfile = "${PostgreSQL::Test::Utils::log_path}/010_psql_history.txt"; -$ENV{PSQL_HISTORY} = $historyfile; - -# Another pitfall for developers is that they might have a ~/.inputrc -# file that changes readline's behavior enough to affect this test. -# So ignore any such file. -$ENV{INPUTRC} = '/dev/null'; - -# Unset $TERM so that readline/libedit won't use any terminal-dependent -# escape sequences; that leads to way too many cross-version variations -# in the output. -delete $ENV{TERM}; -# Some versions of readline inspect LS_COLORS, so for luck unset that too. -delete $ENV{LS_COLORS}; - # In a VPATH build, we'll be started in the source directory, but we want # to run in the build directory so that we can use relative paths to # access the tab_comp_dir subdirectory; otherwise the output from filename @@ -91,8 +72,13 @@ print $FH "other stuff\n"; close $FH; +# Arrange to capture, not discard, the interactive session's history output. +# Put it in the test log directory, so that buildfarm runs capture the result +# for possible debugging purposes. +my $historyfile = "${PostgreSQL::Test::Utils::log_path}/010_psql_history.txt"; + # fire up an interactive psql session -my $h = $node->interactive_psql('postgres'); +my $h = $node->interactive_psql('postgres', history_file => $historyfile); # Simple test case: type something and see if psql responds as expected sub check_completion @@ -427,6 +413,14 @@ sub clear_line clear_query(); +# check completion for psql variable test +check_completion( + "\\echo :{?VERB\t", + qr/:\{\?VERBOSITY} /, + "complete a psql variable test"); + +clear_query(); + # check no-completions code path check_completion("blarg \t\t", qr//, "check completion failure path"); diff --git a/src/bin/psql/t/020_cancel.pl b/src/bin/psql/t/020_cancel.pl index 0765d82b9288d..7a0c917e3edf8 100644 --- a/src/bin/psql/t/020_cancel.pl +++ b/src/bin/psql/t/020_cancel.pl @@ -1,80 +1,46 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; use Time::HiRes qw(usleep); -my $tempdir = PostgreSQL::Test::Utils::tempdir; +# Test query canceling by sending SIGINT to a running psql +if ($windows_os) +{ + plan skip_all => 'sending SIGINT on Windows terminates the test itself'; +} my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->start; -# Test query canceling by sending SIGINT to a running psql -# -# There is, as of this writing, no documented way to get the PID of -# the process from IPC::Run. As a workaround, we have psql print its -# own PID (which is the parent of the shell launched by psql) to a -# file. -SKIP: -{ - skip "cancel test requires a Unix shell", 2 if $windows_os; - - local %ENV = $node->_get_env(); - - my ($stdin, $stdout, $stderr); - - # Test whether shell supports $PPID. It's part of POSIX, but some - # pre-/non-POSIX shells don't support it (e.g., NetBSD). - $stdin = "\\! echo \$PPID"; - IPC::Run::run([ 'psql', '-X', '-v', 'ON_ERROR_STOP=1' ], - '<', \$stdin, '>', \$stdout, '2>', \$stderr); - $stdout =~ /^\d+$/ or skip "shell apparently does not support \$PPID", 2; +local %ENV = $node->_get_env(); - # Now start the real test - my $h = IPC::Run::start([ 'psql', '-X', '-v', 'ON_ERROR_STOP=1' ], - \$stdin, \$stdout, \$stderr); +my ($stdin, $stdout, $stderr); +my $h = IPC::Run::start([ 'psql', '-X', '-v', 'ON_ERROR_STOP=1' ], + \$stdin, \$stdout, \$stderr); - # Get the PID - $stdout = ''; - $stderr = ''; - $stdin = "\\! echo \$PPID >$tempdir/psql.pid\n"; - pump $h while length $stdin; - my $count; - my $psql_pid; - until ( - -s "$tempdir/psql.pid" - and ($psql_pid = - PostgreSQL::Test::Utils::slurp_file("$tempdir/psql.pid")) =~ - /^\d+\n/s) - { - ($count++ < 100 * $PostgreSQL::Test::Utils::timeout_default) - or die "pid file did not appear"; - usleep(10_000); - } +# Send sleep command and wait until the server has registered it +$stdin = "select pg_sleep($PostgreSQL::Test::Utils::timeout_default);\n"; +pump $h while length $stdin; +$node->poll_query_until('postgres', + q{SELECT (SELECT count(*) FROM pg_stat_activity WHERE query ~ '^select pg_sleep') > 0;} +) or die "timed out"; - # Send sleep command and wait until the server has registered it - $stdin = "select pg_sleep($PostgreSQL::Test::Utils::timeout_default);\n"; - pump $h while length $stdin; - $node->poll_query_until('postgres', - q{SELECT (SELECT count(*) FROM pg_stat_activity WHERE query ~ '^select pg_sleep') > 0;} - ) or die "timed out"; +# Send cancel request +$h->signal('INT'); - # Send cancel request - kill 'INT', $psql_pid; +my $result = finish $h; - my $result = finish $h; - - ok(!$result, 'query failed as expected'); - like( - $stderr, - qr/canceling statement due to user request/, - 'query was canceled'); -} +ok(!$result, 'query failed as expected'); +like( + $stderr, + qr/canceling statement due to user request/, + 'query was canceled'); done_testing(); diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 677847e434e42..1bd01ff865ff5 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/tab-complete.c */ @@ -76,7 +76,7 @@ #endif /* word break characters */ -#define WORD_BREAKS "\t\n@$><=;|&{() " +#define WORD_BREAKS "\t\n@><=;|&() " /* * Since readline doesn't let us pass any state through to the tab completion @@ -832,6 +832,7 @@ static const SchemaQuery Query_for_list_of_mergetargets = { .catname = "pg_catalog.pg_class c", .selcondition = "c.relkind IN (" CppAsString2(RELKIND_RELATION) ", " + CppAsString2(RELKIND_VIEW) ", " CppAsString2(RELKIND_PARTITIONED_TABLE) ") ", .viscondition = "pg_catalog.pg_table_is_visible(c.oid)", .namespace = "c.relnamespace", @@ -1031,9 +1032,13 @@ static const SchemaQuery Query_for_trigger_of_table = { " FROM pg_catalog.pg_roles "\ " WHERE rolname LIKE '%s'" +/* add these to Query_for_list_of_roles in OWNER contexts */ +#define Keywords_for_list_of_owner_roles \ +"CURRENT_ROLE", "CURRENT_USER", "SESSION_USER" + /* add these to Query_for_list_of_roles in GRANT contexts */ #define Keywords_for_list_of_grant_roles \ -"PUBLIC", "CURRENT_ROLE", "CURRENT_USER", "SESSION_USER" +Keywords_for_list_of_owner_roles, "PUBLIC" #define Query_for_all_table_constraints \ "SELECT conname "\ @@ -1325,6 +1330,13 @@ static const char *const table_storage_parameters[] = { NULL }; +/* Optional parameters for CREATE VIEW and ALTER VIEW */ +static const char *const view_optional_parameters[] = { + "check_option", + "security_barrier", + "security_invoker", + NULL +}; /* Forward declaration of functions */ static char **psql_completion(const char *text, int start, int end); @@ -1709,7 +1721,7 @@ psql_completion(const char *text, int start, int end) "\\des", "\\det", "\\deu", "\\dew", "\\dE", "\\df", "\\dF", "\\dFd", "\\dFp", "\\dFt", "\\dg", "\\di", "\\dl", "\\dL", "\\dm", "\\dn", "\\do", "\\dO", "\\dp", "\\dP", "\\dPi", "\\dPt", - "\\drds", "\\dRs", "\\dRp", "\\ds", + "\\drds", "\\drg", "\\dRs", "\\dRp", "\\ds", "\\dt", "\\dT", "\\dv", "\\du", "\\dx", "\\dX", "\\dy", "\\echo", "\\edit", "\\ef", "\\elif", "\\else", "\\encoding", "\\endif", "\\errverbose", "\\ev", @@ -1774,6 +1786,8 @@ psql_completion(const char *text, int start, int end) matches = complete_from_variables(text, ":'", "'", true); else if (text[1] == '"') matches = complete_from_variables(text, ":\"", "\"", true); + else if (text[1] == '{' && text[2] == '?') + matches = complete_from_variables(text, ":{?", "}", true); else matches = complete_from_variables(text, ":", "", true); } @@ -1785,8 +1799,15 @@ psql_completion(const char *text, int start, int end) /* CREATE */ /* complete with something you can create */ else if (TailMatches("CREATE")) - matches = rl_completion_matches(text, create_command_generator); - + { + /* only some object types can be created as part of CREATE SCHEMA */ + if (HeadMatches("CREATE", "SCHEMA")) + COMPLETE_WITH("TABLE", "VIEW", "INDEX", "SEQUENCE", "TRIGGER", + /* for INDEX and TABLE/SEQUENCE, respectively */ + "UNIQUE", "UNLOGGED"); + else + matches = rl_completion_matches(text, create_command_generator); + } /* complete with something you can create or replace */ else if (TailMatches("CREATE", "OR", "REPLACE")) COMPLETE_WITH("FUNCTION", "PROCEDURE", "LANGUAGE", "RULE", "VIEW", @@ -1925,7 +1946,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("(", "PUBLICATION"); /* ALTER SUBSCRIPTION SET ( */ else if (HeadMatches("ALTER", "SUBSCRIPTION", MatchAny) && TailMatches("SET", "(")) - COMPLETE_WITH("binary", "disable_on_error", "origin", + COMPLETE_WITH("binary", "disable_on_error", "failover", "origin", "password_required", "run_as_owner", "slot_name", "streaming", "synchronous_commit"); /* ALTER SUBSCRIPTION SKIP ( */ @@ -2126,7 +2147,7 @@ psql_completion(const char *text, int start, int end) /* ALTER DEFAULT PRIVILEGES */ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES")) - COMPLETE_WITH("FOR ROLE", "IN SCHEMA"); + COMPLETE_WITH("FOR", "GRANT", "IN SCHEMA", "REVOKE"); /* ALTER DEFAULT PRIVILEGES FOR */ else if (Matches("ALTER", "DEFAULT", "PRIVILEGES", "FOR")) COMPLETE_WITH("ROLE"); @@ -2205,8 +2226,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("TO"); /* ALTER VIEW */ else if (Matches("ALTER", "VIEW", MatchAny)) - COMPLETE_WITH("ALTER COLUMN", "OWNER TO", "RENAME", - "SET SCHEMA"); + COMPLETE_WITH("ALTER COLUMN", "OWNER TO", "RENAME", "RESET", "SET"); /* ALTER VIEW xxx RENAME */ else if (Matches("ALTER", "VIEW", MatchAny, "RENAME")) COMPLETE_WITH_ATTR_PLUS(prev2_wd, "COLUMN", "TO"); @@ -2222,6 +2242,21 @@ psql_completion(const char *text, int start, int end) /* ALTER VIEW xxx RENAME COLUMN yyy */ else if (Matches("ALTER", "VIEW", MatchAny, "RENAME", "COLUMN", MatchAnyExcept("TO"))) COMPLETE_WITH("TO"); + /* ALTER VIEW xxx RESET ( */ + else if (Matches("ALTER", "VIEW", MatchAny, "RESET")) + COMPLETE_WITH("("); + /* Complete ALTER VIEW xxx SET with "(" or "SCHEMA" */ + else if (Matches("ALTER", "VIEW", MatchAny, "SET")) + COMPLETE_WITH("(", "SCHEMA"); + /* ALTER VIEW xxx SET|RESET ( yyy [= zzz] ) */ + else if (Matches("ALTER", "VIEW", MatchAny, "SET|RESET", "(")) + COMPLETE_WITH_LIST(view_optional_parameters); + else if (Matches("ALTER", "VIEW", MatchAny, "SET", "(", MatchAny)) + COMPLETE_WITH("="); + else if (Matches("ALTER", "VIEW", MatchAny, "SET", "(", "check_option", "=")) + COMPLETE_WITH("local", "cascaded"); + else if (Matches("ALTER", "VIEW", MatchAny, "SET", "(", "security_barrier|security_invoker", "=")) + COMPLETE_WITH("true", "false"); /* ALTER MATERIALIZED VIEW */ else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny)) @@ -2472,7 +2507,8 @@ psql_completion(const char *text, int start, int end) /* ALTER TABLE ALTER [COLUMN] SET */ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET") || Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET")) - COMPLETE_WITH("(", "COMPRESSION", "DEFAULT", "GENERATED", "NOT NULL", "STATISTICS", "STORAGE", + COMPLETE_WITH("(", "COMPRESSION", "DATA TYPE", "DEFAULT", "EXPRESSION", "GENERATED", "NOT NULL", + "STATISTICS", "STORAGE", /* a subset of ALTER SEQUENCE options */ "INCREMENT", "MINVALUE", "MAXVALUE", "START", "NO", "CACHE", "CYCLE"); /* ALTER TABLE ALTER [COLUMN] SET ( */ @@ -2483,6 +2519,14 @@ psql_completion(const char *text, int start, int end) else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "COMPRESSION") || Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "COMPRESSION")) COMPLETE_WITH("DEFAULT", "PGLZ", "LZ4"); + /* ALTER TABLE ALTER [COLUMN] SET EXPRESSION */ + else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "EXPRESSION") || + Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "EXPRESSION")) + COMPLETE_WITH("AS"); + /* ALTER TABLE ALTER [COLUMN] SET EXPRESSION AS */ + else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "EXPRESSION", "AS") || + Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "EXPRESSION", "AS")) + COMPLETE_WITH("("); /* ALTER TABLE ALTER [COLUMN] SET GENERATED */ else if (Matches("ALTER", "TABLE", MatchAny, "ALTER", "COLUMN", MatchAny, "SET", "GENERATED") || Matches("ALTER", "TABLE", MatchAny, "ALTER", MatchAny, "SET", "GENERATED")) @@ -2522,7 +2566,8 @@ psql_completion(const char *text, int start, int end) * AMs. */ else if (Matches("ALTER", "TABLE", MatchAny, "SET", "ACCESS", "METHOD")) - COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods); + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_table_access_methods, + "DEFAULT"); /* * If we have ALTER TABLE SET TABLESPACE provide a list of @@ -2828,7 +2873,7 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_SCHEMA_QUERY_PLUS(Query_for_list_of_tables, "("); /* Complete COPY ( with legal query commands */ else if (Matches("COPY|\\copy", "(")) - COMPLETE_WITH("SELECT", "TABLE", "VALUES", "INSERT INTO", "UPDATE", "DELETE FROM", "WITH"); + COMPLETE_WITH("SELECT", "TABLE", "VALUES", "INSERT INTO", "UPDATE", "DELETE FROM", "MERGE INTO", "WITH"); /* Complete COPY */ else if (Matches("COPY|\\copy", MatchAny)) COMPLETE_WITH("FROM", "TO"); @@ -2858,12 +2903,21 @@ psql_completion(const char *text, int start, int end) else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", MatchAny, "WITH", "(")) COMPLETE_WITH("FORMAT", "FREEZE", "DELIMITER", "NULL", "HEADER", "QUOTE", "ESCAPE", "FORCE_QUOTE", - "FORCE_NOT_NULL", "FORCE_NULL", "ENCODING", "DEFAULT"); + "FORCE_NOT_NULL", "FORCE_NULL", "ENCODING", "DEFAULT", + "ON_ERROR", "LOG_VERBOSITY"); /* Complete COPY FROM|TO filename WITH (FORMAT */ else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", MatchAny, "WITH", "(", "FORMAT")) COMPLETE_WITH("binary", "csv", "text"); + /* Complete COPY FROM filename WITH (ON_ERROR */ + else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", MatchAny, "WITH", "(", "ON_ERROR")) + COMPLETE_WITH("stop", "ignore"); + + /* Complete COPY FROM filename WITH (LOG_VERBOSITY */ + else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", MatchAny, "WITH", "(", "LOG_VERBOSITY")) + COMPLETE_WITH("default", "verbose"); + /* Complete COPY FROM WITH () */ else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny, "WITH", MatchAny)) COMPLETE_WITH("WHERE"); @@ -3154,6 +3208,20 @@ psql_completion(const char *text, int start, int end) else if (TailMatches("AS", "ON", "SELECT|UPDATE|INSERT|DELETE", "TO")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); +/* CREATE SCHEMA [ ] [ AUTHORIZATION ] */ + else if (Matches("CREATE", "SCHEMA")) + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_schemas, + "AUTHORIZATION"); + else if (Matches("CREATE", "SCHEMA", "AUTHORIZATION") || + Matches("CREATE", "SCHEMA", MatchAny, "AUTHORIZATION")) + COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, + Keywords_for_list_of_owner_roles); + else if (Matches("CREATE", "SCHEMA", "AUTHORIZATION", MatchAny) || + Matches("CREATE", "SCHEMA", MatchAny, "AUTHORIZATION", MatchAny)) + COMPLETE_WITH("CREATE", "GRANT"); + else if (Matches("CREATE", "SCHEMA", MatchAny)) + COMPLETE_WITH("AUTHORIZATION", "CREATE", "GRANT"); + /* CREATE SEQUENCE --- is allowed inside CREATE SCHEMA, so use TailMatches */ else if (TailMatches("CREATE", "SEQUENCE", MatchAny) || TailMatches("CREATE", "TEMP|TEMPORARY", "SEQUENCE", MatchAny)) @@ -3185,9 +3253,15 @@ psql_completion(const char *text, int start, int end) /* Complete "CREATE TEMP/TEMPORARY" with the possible temp objects */ else if (TailMatches("CREATE", "TEMP|TEMPORARY")) COMPLETE_WITH("SEQUENCE", "TABLE", "VIEW"); - /* Complete "CREATE UNLOGGED" with TABLE or MATVIEW */ + /* Complete "CREATE UNLOGGED" with TABLE, SEQUENCE or MATVIEW */ else if (TailMatches("CREATE", "UNLOGGED")) - COMPLETE_WITH("TABLE", "MATERIALIZED VIEW"); + { + /* but not MATVIEW in CREATE SCHEMA */ + if (HeadMatches("CREATE", "SCHEMA")) + COMPLETE_WITH("TABLE", "SEQUENCE"); + else + COMPLETE_WITH("TABLE", "SEQUENCE", "MATERIALIZED VIEW"); + } /* Complete PARTITION BY with RANGE ( or LIST ( or ... */ else if (TailMatches("PARTITION", "BY")) COMPLETE_WITH("RANGE (", "LIST (", "HASH ("); @@ -3197,20 +3271,26 @@ psql_completion(const char *text, int start, int end) /* Limited completion support for partition bound specification */ else if (TailMatches("PARTITION", "OF", MatchAny)) COMPLETE_WITH("FOR VALUES", "DEFAULT"); - /* Complete CREATE TABLE with '(', OF or PARTITION OF */ + /* Complete CREATE TABLE with '(', AS, OF or PARTITION OF */ else if (TailMatches("CREATE", "TABLE", MatchAny) || TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny)) - COMPLETE_WITH("(", "OF", "PARTITION OF"); + COMPLETE_WITH("(", "AS", "OF", "PARTITION OF"); /* Complete CREATE TABLE OF with list of composite types */ else if (TailMatches("CREATE", "TABLE", MatchAny, "OF") || TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "OF")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_composite_datatypes); + /* Complete CREATE TABLE [ (...) ] AS with list of keywords */ + else if (TailMatches("CREATE", "TABLE", MatchAny, "AS") || + TailMatches("CREATE", "TABLE", MatchAny, "(*)", "AS") || + TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "AS") || + TailMatches("CREATE", "TEMP|TEMPORARY|UNLOGGED", "TABLE", MatchAny, "(*)", "AS")) + COMPLETE_WITH("EXECUTE", "SELECT", "TABLE", "VALUES", "WITH"); /* Complete CREATE TABLE name (...) with supported options */ else if (TailMatches("CREATE", "TABLE", MatchAny, "(*)") || TailMatches("CREATE", "UNLOGGED", "TABLE", MatchAny, "(*)")) - COMPLETE_WITH("INHERITS (", "PARTITION BY", "USING", "TABLESPACE", "WITH ("); + COMPLETE_WITH("AS", "INHERITS (", "PARTITION BY", "USING", "TABLESPACE", "WITH ("); else if (TailMatches("CREATE", "TEMP|TEMPORARY", "TABLE", MatchAny, "(*)")) - COMPLETE_WITH("INHERITS (", "ON COMMIT", "PARTITION BY", + COMPLETE_WITH("AS", "INHERITS (", "ON COMMIT", "PARTITION BY", "TABLESPACE", "WITH ("); /* Complete CREATE TABLE (...) USING with table access methods */ else if (TailMatches("CREATE", "TABLE", MatchAny, "(*)", "USING") || @@ -3269,7 +3349,7 @@ psql_completion(const char *text, int start, int end) /* Complete "CREATE SUBSCRIPTION ... WITH ( " */ else if (HeadMatches("CREATE", "SUBSCRIPTION") && TailMatches("WITH", "(")) COMPLETE_WITH("binary", "connect", "copy_data", "create_slot", - "disable_on_error", "enabled", "origin", + "disable_on_error", "enabled", "failover", "origin", "password_required", "run_as_owner", "slot_name", "streaming", "synchronous_commit", "two_phase"); @@ -3494,14 +3574,35 @@ psql_completion(const char *text, int start, int end) } /* CREATE VIEW --- is allowed inside CREATE SCHEMA, so use TailMatches */ - /* Complete CREATE [ OR REPLACE ] VIEW with AS */ + /* Complete CREATE [ OR REPLACE ] VIEW with AS or WITH */ else if (TailMatches("CREATE", "VIEW", MatchAny) || TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny)) - COMPLETE_WITH("AS"); + COMPLETE_WITH("AS", "WITH"); /* Complete "CREATE [ OR REPLACE ] VIEW AS with "SELECT" */ else if (TailMatches("CREATE", "VIEW", MatchAny, "AS") || TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "AS")) COMPLETE_WITH("SELECT"); + /* CREATE [ OR REPLACE ] VIEW WITH ( yyy [= zzz] ) */ + else if (TailMatches("CREATE", "VIEW", MatchAny, "WITH") || + TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "WITH")) + COMPLETE_WITH("("); + else if (TailMatches("CREATE", "VIEW", MatchAny, "WITH", "(") || + TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "WITH", "(")) + COMPLETE_WITH_LIST(view_optional_parameters); + else if (TailMatches("CREATE", "VIEW", MatchAny, "WITH", "(", "check_option") || + TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "WITH", "(", "check_option")) + COMPLETE_WITH("="); + else if (TailMatches("CREATE", "VIEW", MatchAny, "WITH", "(", "check_option", "=") || + TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "WITH", "(", "check_option", "=")) + COMPLETE_WITH("local", "cascaded"); + /* CREATE [ OR REPLACE ] VIEW WITH ( ... ) AS */ + else if (TailMatches("CREATE", "VIEW", MatchAny, "WITH", "(*)") || + TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "WITH", "(*)")) + COMPLETE_WITH("AS"); + /* CREATE [ OR REPLACE ] VIEW WITH ( ... ) AS SELECT */ + else if (TailMatches("CREATE", "VIEW", MatchAny, "WITH", "(*)", "AS") || + TailMatches("CREATE", "OR", "REPLACE", "VIEW", MatchAny, "WITH", "(*)", "AS")) + COMPLETE_WITH("SELECT"); /* CREATE MATERIALIZED VIEW */ else if (Matches("CREATE", "MATERIALIZED")) @@ -3521,8 +3622,8 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH("ON"); /* Complete CREATE EVENT TRIGGER ON with event_type */ else if (Matches("CREATE", "EVENT", "TRIGGER", MatchAny, "ON")) - COMPLETE_WITH("ddl_command_start", "ddl_command_end", "sql_drop", - "table_rewrite"); + COMPLETE_WITH("ddl_command_start", "ddl_command_end", "login", + "sql_drop", "table_rewrite"); /* * Complete CREATE EVENT TRIGGER ON . EXECUTE FUNCTION @@ -3755,9 +3856,12 @@ psql_completion(const char *text, int start, int end) */ if (ends_with(prev_wd, '(') || ends_with(prev_wd, ',')) COMPLETE_WITH("ANALYZE", "VERBOSE", "COSTS", "SETTINGS", "GENERIC_PLAN", - "BUFFERS", "WAL", "TIMING", "SUMMARY", "FORMAT"); - else if (TailMatches("ANALYZE|VERBOSE|COSTS|SETTINGS|GENERIC_PLAN|BUFFERS|WAL|TIMING|SUMMARY")) + "BUFFERS", "SERIALIZE", "WAL", "TIMING", "SUMMARY", + "MEMORY", "FORMAT"); + else if (TailMatches("ANALYZE|VERBOSE|COSTS|SETTINGS|GENERIC_PLAN|BUFFERS|WAL|TIMING|SUMMARY|MEMORY")) COMPLETE_WITH("ON", "OFF"); + else if (TailMatches("SERIALIZE")) + COMPLETE_WITH("TEXT", "NONE", "BINARY"); else if (TailMatches("FORMAT")) COMPLETE_WITH("TEXT", "XML", "JSON", "YAML"); } @@ -3848,9 +3952,18 @@ psql_completion(const char *text, int start, int end) * privileges (can't grant roles) */ if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES")) - COMPLETE_WITH("SELECT", "INSERT", "UPDATE", - "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", - "CREATE", "EXECUTE", "USAGE", "MAINTAIN", "ALL"); + { + if (TailMatches("GRANT") || + TailMatches("REVOKE", "GRANT", "OPTION", "FOR")) + COMPLETE_WITH("SELECT", "INSERT", "UPDATE", + "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", + "CREATE", "EXECUTE", "USAGE", "MAINTAIN", "ALL"); + else if (TailMatches("REVOKE")) + COMPLETE_WITH("SELECT", "INSERT", "UPDATE", + "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER", + "CREATE", "EXECUTE", "USAGE", "MAINTAIN", "ALL", + "GRANT OPTION FOR"); + } else if (TailMatches("GRANT")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, Privilege_options_of_grant_and_revoke); @@ -4032,6 +4145,9 @@ psql_completion(const char *text, int start, int end) else if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES") && TailMatches("TO|FROM")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, Keywords_for_list_of_grant_roles); + /* Offer WITH GRANT OPTION after that */ + else if (HeadMatches("ALTER", "DEFAULT", "PRIVILEGES") && TailMatches("TO", MatchAny)) + COMPLETE_WITH("WITH GRANT OPTION"); /* Complete "GRANT/REVOKE ... ON * *" with TO/FROM */ else if (HeadMatches("GRANT") && TailMatches("ON", MatchAny, MatchAny)) COMPLETE_WITH("TO"); @@ -4239,17 +4355,35 @@ psql_completion(const char *text, int start, int end) TailMatches("USING", MatchAny, MatchAny, "ON", MatchAny, MatchAny, MatchAny, "WHEN")) COMPLETE_WITH("MATCHED", "NOT MATCHED"); - /* Complete ... WHEN [NOT] MATCHED with THEN/AND */ + /* + * Complete ... WHEN MATCHED and WHEN NOT MATCHED BY SOURCE|TARGET with + * THEN/AND + */ else if (TailMatches("WHEN", "MATCHED") || - TailMatches("WHEN", "NOT", "MATCHED")) + TailMatches("WHEN", "NOT", "MATCHED", "BY", "SOURCE|TARGET")) COMPLETE_WITH("THEN", "AND"); - /* Complete ... WHEN MATCHED THEN with UPDATE SET/DELETE/DO NOTHING */ - else if (TailMatches("WHEN", "MATCHED", "THEN")) + /* Complete ... WHEN NOT MATCHED with BY/THEN/AND */ + else if (TailMatches("WHEN", "NOT", "MATCHED")) + COMPLETE_WITH("BY", "THEN", "AND"); + + /* Complete ... WHEN NOT MATCHED BY with SOURCE/TARGET */ + else if (TailMatches("WHEN", "NOT", "MATCHED", "BY")) + COMPLETE_WITH("SOURCE", "TARGET"); + + /* + * Complete ... WHEN MATCHED THEN and WHEN NOT MATCHED BY SOURCE THEN with + * UPDATE SET/DELETE/DO NOTHING + */ + else if (TailMatches("WHEN", "MATCHED", "THEN") || + TailMatches("WHEN", "NOT", "MATCHED", "BY", "SOURCE", "THEN")) COMPLETE_WITH("UPDATE SET", "DELETE", "DO NOTHING"); - /* Complete ... WHEN NOT MATCHED THEN with INSERT/DO NOTHING */ - else if (TailMatches("WHEN", "NOT", "MATCHED", "THEN")) + /* + * Complete ... WHEN NOT MATCHED [BY TARGET] THEN with INSERT/DO NOTHING + */ + else if (TailMatches("WHEN", "NOT", "MATCHED", "THEN") || + TailMatches("WHEN", "NOT", "MATCHED", "BY", "TARGET", "THEN")) COMPLETE_WITH("INSERT", "DO NOTHING"); /* NOTIFY --- can be inside EXPLAIN, RULE, etc */ @@ -4263,9 +4397,7 @@ psql_completion(const char *text, int start, int end) /* OWNER TO - complete with available roles */ else if (TailMatches("OWNER", "TO")) COMPLETE_WITH_QUERY_PLUS(Query_for_list_of_roles, - "CURRENT_ROLE", - "CURRENT_USER", - "SESSION_USER"); + Keywords_for_list_of_owner_roles); /* ORDER BY */ else if (TailMatches("FROM", MatchAny, "ORDER")) @@ -4653,6 +4785,12 @@ psql_completion(const char *text, int start, int end) else if (TailMatches("JOIN")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_selectables); +/* ... AT [ LOCAL | TIME ZONE ] ... */ + else if (TailMatches("AT")) + COMPLETE_WITH("LOCAL", "TIME ZONE"); + else if (TailMatches("AT", "TIME", "ZONE")) + COMPLETE_WITH_TIMEZONE_NAME(); + /* Backslash commands */ /* TODO: \dc \dd \dl */ else if (TailMatchesCS("\\?")) @@ -4731,7 +4869,9 @@ psql_completion(const char *text, int start, int end) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_tables); else if (TailMatchesCS("\\dT*")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_datatypes); - else if (TailMatchesCS("\\du*") || TailMatchesCS("\\dg*")) + else if (TailMatchesCS("\\du*") || + TailMatchesCS("\\dg*") || + TailMatchesCS("\\drg*")) COMPLETE_WITH_QUERY(Query_for_list_of_roles); else if (TailMatchesCS("\\dv*")) COMPLETE_WITH_SCHEMA_QUERY(Query_for_list_of_views); @@ -6030,7 +6170,7 @@ identifier_needs_quotes(const char *ident) /* Check syntax. */ if (!((ident[0] >= 'a' && ident[0] <= 'z') || ident[0] == '_')) return true; - if (strspn(ident, "abcdefghijklmnopqrstuvwxyz0123456789_") != strlen(ident)) + if (strspn(ident, "abcdefghijklmnopqrstuvwxyz0123456789_$") != strlen(ident)) return true; /* diff --git a/src/bin/psql/tab-complete.h b/src/bin/psql/tab-complete.h index ae5b6bee38f46..0adbd754f4d67 100644 --- a/src/bin/psql/tab-complete.h +++ b/src/bin/psql/tab-complete.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/tab-complete.h */ diff --git a/src/bin/psql/variables.c b/src/bin/psql/variables.c index 1c3841ecb7934..56d70f3a1091e 100644 --- a/src/bin/psql/variables.c +++ b/src/bin/psql/variables.c @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/bin/psql/variables.c */ diff --git a/src/bin/psql/variables.h b/src/bin/psql/variables.h index f3e6bc989a621..dca4f06dbbbdc 100644 --- a/src/bin/psql/variables.h +++ b/src/bin/psql/variables.h @@ -1,7 +1,7 @@ /* * psql - the PostgreSQL interactive terminal * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * This implements a sort of variable repository. One could also think of it * as a cheap version of an associative array. Each variable has a string diff --git a/src/bin/scripts/Makefile b/src/bin/scripts/Makefile index a7a9d0fea549b..9633c99136880 100644 --- a/src/bin/scripts/Makefile +++ b/src/bin/scripts/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/bin/scripts # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/bin/scripts/Makefile @@ -48,7 +48,7 @@ installdirs: uninstall: rm -f $(addprefix '$(DESTDIR)$(bindir)'/, $(addsuffix $(X), $(PROGRAMS))) -clean distclean maintainer-clean: +clean distclean: rm -f $(addsuffix $(X), $(PROGRAMS)) $(addsuffix .o, $(PROGRAMS)) rm -f common.o $(WIN32RES) rm -rf tmp_check diff --git a/src/bin/scripts/clusterdb.c b/src/bin/scripts/clusterdb.c index e3585b3272eef..3503a3bb5840f 100644 --- a/src/bin/scripts/clusterdb.c +++ b/src/bin/scripts/clusterdb.c @@ -2,7 +2,7 @@ * * clusterdb * - * Portions Copyright (c) 2002-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2002-2024, PostgreSQL Global Development Group * * src/bin/scripts/clusterdb.c * @@ -21,8 +21,9 @@ static void cluster_one_database(const ConnParams *cparams, const char *table, const char *progname, bool verbose, bool echo); -static void cluster_all_databases(ConnParams *cparams, const char *progname, - bool verbose, bool echo, bool quiet); +static void cluster_all_databases(ConnParams *cparams, SimpleStringList *tables, + const char *progname, bool verbose, bool echo, + bool quiet); static void help(const char *progname); @@ -147,12 +148,10 @@ main(int argc, char *argv[]) if (dbname) pg_fatal("cannot cluster all databases and a specific one at the same time"); - if (tables.head != NULL) - pg_fatal("cannot cluster specific table(s) in all databases"); - cparams.dbname = maintenance_db; - cluster_all_databases(&cparams, progname, verbose, echo, quiet); + cluster_all_databases(&cparams, &tables, + progname, verbose, echo, quiet); } else { @@ -195,7 +194,7 @@ cluster_one_database(const ConnParams *cparams, const char *table, PGconn *conn; - conn = connectDatabase(cparams, progname, echo, false, false); + conn = connectDatabase(cparams, progname, echo, false, true); initPQExpBuffer(&sql); @@ -226,15 +225,18 @@ cluster_one_database(const ConnParams *cparams, const char *table, static void -cluster_all_databases(ConnParams *cparams, const char *progname, - bool verbose, bool echo, bool quiet) +cluster_all_databases(ConnParams *cparams, SimpleStringList *tables, + const char *progname, bool verbose, bool echo, + bool quiet) { PGconn *conn; PGresult *result; int i; conn = connectMaintenanceDatabase(cparams, progname, echo); - result = executeQuery(conn, "SELECT datname FROM pg_database WHERE datallowconn ORDER BY 1;", echo); + result = executeQuery(conn, + "SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;", + echo); PQfinish(conn); for (i = 0; i < PQntuples(result); i++) @@ -249,7 +251,17 @@ cluster_all_databases(ConnParams *cparams, const char *progname, cparams->override_dbname = dbname; - cluster_one_database(cparams, NULL, progname, verbose, echo); + if (tables->head != NULL) + { + SimpleStringListCell *cell; + + for (cell = tables->head; cell; cell = cell->next) + cluster_one_database(cparams, cell->val, + progname, verbose, echo); + } + else + cluster_one_database(cparams, NULL, + progname, verbose, echo); } PQclear(result); diff --git a/src/bin/scripts/common.c b/src/bin/scripts/common.c index 4c52fb6a3e436..4b0e26c0bb13a 100644 --- a/src/bin/scripts/common.c +++ b/src/bin/scripts/common.c @@ -4,7 +4,7 @@ * Common support routines for bin/scripts/ * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/scripts/common.c @@ -112,8 +112,9 @@ appendQualifiedRelation(PQExpBuffer buf, const char *spec, exit(1); } appendPQExpBufferStr(buf, - fmtQualifiedId(PQgetvalue(res, 0, 1), - PQgetvalue(res, 0, 0))); + fmtQualifiedIdEnc(PQgetvalue(res, 0, 1), + PQgetvalue(res, 0, 0), + PQclientEncoding(conn))); appendPQExpBufferStr(buf, columns); PQclear(res); termPQExpBuffer(&sql); diff --git a/src/bin/scripts/common.h b/src/bin/scripts/common.h index b463b1b7ff962..97f19986c3bd6 100644 --- a/src/bin/scripts/common.h +++ b/src/bin/scripts/common.h @@ -2,7 +2,7 @@ * common.h * Common support routines for bin/scripts/ * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * src/bin/scripts/common.h */ diff --git a/src/bin/scripts/createdb.c b/src/bin/scripts/createdb.c index 9ca86a3e53d5e..2fa8477e0ed8b 100644 --- a/src/bin/scripts/createdb.c +++ b/src/bin/scripts/createdb.c @@ -2,7 +2,7 @@ * * createdb * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/scripts/createdb.c @@ -40,8 +40,9 @@ main(int argc, char *argv[]) {"locale", required_argument, NULL, 'l'}, {"maintenance-db", required_argument, NULL, 3}, {"locale-provider", required_argument, NULL, 4}, - {"icu-locale", required_argument, NULL, 5}, - {"icu-rules", required_argument, NULL, 6}, + {"builtin-locale", required_argument, NULL, 5}, + {"icu-locale", required_argument, NULL, 6}, + {"icu-rules", required_argument, NULL, 7}, {NULL, 0, NULL, 0} }; @@ -67,6 +68,7 @@ main(int argc, char *argv[]) char *lc_ctype = NULL; char *locale = NULL; char *locale_provider = NULL; + char *builtin_locale = NULL; char *icu_locale = NULL; char *icu_rules = NULL; @@ -134,9 +136,12 @@ main(int argc, char *argv[]) locale_provider = pg_strdup(optarg); break; case 5: - icu_locale = pg_strdup(optarg); + builtin_locale = pg_strdup(optarg); break; case 6: + icu_locale = pg_strdup(optarg); + break; + case 7: icu_rules = pg_strdup(optarg); break; default: @@ -193,6 +198,8 @@ main(int argc, char *argv[]) conn = connectMaintenanceDatabase(&cparams, progname, echo); + setFmtEncoding(PQclientEncoding(conn)); + initPQExpBuffer(&sql); appendPQExpBuffer(&sql, "CREATE DATABASE %s", @@ -216,6 +223,11 @@ main(int argc, char *argv[]) appendPQExpBufferStr(&sql, " LOCALE "); appendStringLiteralConn(&sql, locale, conn); } + if (builtin_locale) + { + appendPQExpBufferStr(&sql, " BUILTIN_LOCALE "); + appendStringLiteralConn(&sql, builtin_locale, conn); + } if (lc_collate) { appendPQExpBufferStr(&sql, " LC_COLLATE "); @@ -227,7 +239,7 @@ main(int argc, char *argv[]) appendStringLiteralConn(&sql, lc_ctype, conn); } if (locale_provider) - appendPQExpBuffer(&sql, " LOCALE_PROVIDER %s", locale_provider); + appendPQExpBuffer(&sql, " LOCALE_PROVIDER %s", fmtId(locale_provider)); if (icu_locale) { appendPQExpBufferStr(&sql, " ICU_LOCALE "); @@ -294,9 +306,10 @@ help(const char *progname) printf(_(" -l, --locale=LOCALE locale settings for the database\n")); printf(_(" --lc-collate=LOCALE LC_COLLATE setting for the database\n")); printf(_(" --lc-ctype=LOCALE LC_CTYPE setting for the database\n")); + printf(_(" --builtin-locale=LOCALE builtin locale setting for the database\n")); printf(_(" --icu-locale=LOCALE ICU locale setting for the database\n")); printf(_(" --icu-rules=RULES ICU rules setting for the database\n")); - printf(_(" --locale-provider={libc|icu}\n" + printf(_(" --locale-provider={builtin|libc|icu}\n" " locale provider for the database's default collation\n")); printf(_(" -O, --owner=OWNER database user to own the new database\n")); printf(_(" -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n")); diff --git a/src/bin/scripts/createuser.c b/src/bin/scripts/createuser.c index 0709491185c39..9c1f5d23392c9 100644 --- a/src/bin/scripts/createuser.c +++ b/src/bin/scripts/createuser.c @@ -2,7 +2,7 @@ * * createuser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/scripts/createuser.c @@ -292,6 +292,8 @@ main(int argc, char *argv[]) conn = connectMaintenanceDatabase(&cparams, progname, echo); + setFmtEncoding(PQclientEncoding(conn)); + initPQExpBuffer(&sql); printfPQExpBuffer(&sql, "CREATE ROLE %s", fmtId(newuser)); diff --git a/src/bin/scripts/dropdb.c b/src/bin/scripts/dropdb.c index 8d0f432f3d7c7..435837b65ffbc 100644 --- a/src/bin/scripts/dropdb.c +++ b/src/bin/scripts/dropdb.c @@ -2,7 +2,7 @@ * * dropdb * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/scripts/dropdb.c @@ -129,13 +129,6 @@ main(int argc, char *argv[]) exit(0); } - initPQExpBuffer(&sql); - - appendPQExpBuffer(&sql, "DROP DATABASE %s%s%s;", - (if_exists ? "IF EXISTS " : ""), - fmtId(dbname), - force ? " WITH (FORCE)" : ""); - /* Avoid trying to drop postgres db while we are connected to it. */ if (maintenance_db == NULL && strcmp(dbname, "postgres") == 0) maintenance_db = "template1"; @@ -149,6 +142,12 @@ main(int argc, char *argv[]) conn = connectMaintenanceDatabase(&cparams, progname, echo); + initPQExpBuffer(&sql); + appendPQExpBuffer(&sql, "DROP DATABASE %s%s%s;", + (if_exists ? "IF EXISTS " : ""), + fmtIdEnc(dbname, PQclientEncoding(conn)), + force ? " WITH (FORCE)" : ""); + if (echo) printf("%s\n", sql.data); result = PQexec(conn, sql.data); diff --git a/src/bin/scripts/dropuser.c b/src/bin/scripts/dropuser.c index 8aad932e6a5bb..c6357ce10bba2 100644 --- a/src/bin/scripts/dropuser.c +++ b/src/bin/scripts/dropuser.c @@ -2,7 +2,7 @@ * * dropuser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/scripts/dropuser.c @@ -143,7 +143,8 @@ main(int argc, char *argv[]) initPQExpBuffer(&sql); appendPQExpBuffer(&sql, "DROP ROLE %s%s;", - (if_exists ? "IF EXISTS " : ""), fmtId(dropuser)); + (if_exists ? "IF EXISTS " : ""), + fmtIdEnc(dropuser, PQclientEncoding(conn))); if (echo) printf("%s\n", sql.data); diff --git a/src/bin/scripts/meson.build b/src/bin/scripts/meson.build index 5b4f8a6f854f0..cef24d7806bb9 100644 --- a/src/bin/scripts/meson.build +++ b/src/bin/scripts/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group scripts_common = static_library('libscripts_common', files('common.c'), diff --git a/src/bin/scripts/nls.mk b/src/bin/scripts/nls.mk index 5fe63fa710695..4b358da018911 100644 --- a/src/bin/scripts/nls.mk +++ b/src/bin/scripts/nls.mk @@ -16,7 +16,9 @@ GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \ ../../fe_utils/connect_utils.c \ ../../fe_utils/option_utils.c \ ../../fe_utils/query_utils.c \ + ../../fe_utils/string_utils.c \ ../../common/fe_memutils.c \ + ../../common/file_utils.c \ ../../common/username.c GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS) simple_prompt yesno_prompt GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS) diff --git a/src/bin/scripts/pg_isready.c b/src/bin/scripts/pg_isready.c index 64bbffb0b2720..100589da147b0 100644 --- a/src/bin/scripts/pg_isready.c +++ b/src/bin/scripts/pg_isready.c @@ -2,7 +2,7 @@ * * pg_isready --- checks the status of the PostgreSQL server * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * * src/bin/scripts/pg_isready.c * diff --git a/src/bin/scripts/po/de.po b/src/bin/scripts/po/de.po index 43ed18e2a8555..70225e6904436 100644 --- a/src/bin/scripts/po/de.po +++ b/src/bin/scripts/po/de.po @@ -1,14 +1,14 @@ # German message translation file for "scripts". -# Peter Eisentraut , 2003 - 2023. +# Peter Eisentraut , 2003 - 2024. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 16\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-06-07 22:50+0000\n" -"PO-Revision-Date: 2023-06-08 08:40+0200\n" +"POT-Creation-Date: 2024-06-16 10:21+0000\n" +"PO-Revision-Date: 2024-06-16 19:03+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -48,6 +48,48 @@ msgstr "Speicher aufgebraucht\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "kann NULL-Zeiger nicht kopieren (interner Fehler)\n" +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "konnte Datei »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "diese Installation unterstützt Sync-Methode »%s« nicht" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht öffnen: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "konnte Verzeichnis »%s« nicht lesen: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "konnte Datei »%s« nicht fsyncen: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" + #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" @@ -62,11 +104,11 @@ msgstr "Benutzer existiert nicht" msgid "user name lookup failure: error code %lu" msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Abbruchsanforderung gesendet\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "Konnte Abbruchsanforderung nicht senden: " @@ -94,12 +136,27 @@ msgstr "ungültiger Wert »%s« für Option %s" msgid "%s must be in range %d..%d" msgstr "%s muss im Bereich %d..%d sein" -#: ../../fe_utils/parallel_slot.c:299 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "unbekannte Sync-Methode: %s" + +#: ../../fe_utils/parallel_slot.c:317 #, c-format -msgid "too many jobs for this platform" -msgstr "zu viele Jobs für diese Plattform" +msgid "too many jobs for this platform: %d" +msgstr "zu viele Jobs für diese Plattform: %d" -#: ../../fe_utils/parallel_slot.c:520 +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "Socket-Dateideskriptor außerhalb des gültigen Bereichs für select(): %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "Versuchen Sie es mit weniger Jobs." + +#: ../../fe_utils/parallel_slot.c:553 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "Verarbeitung der Datenbank »%s« fehlgeschlagen: %s" @@ -116,17 +173,22 @@ msgstr[1] "(%lu Zeilen)" msgid "Interrupted\n" msgstr "Unterbrochen\n" -#: ../../fe_utils/print.c:3218 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "Kann Tabelleninhalt nicht ausgeben: Anzahl der Zellen %lld ist gleich oder überschreitet Maximum %lld.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Kann keinen weiteren Spaltenkopf zur Tabelle hinzufügen: Spaltenzahl %d überschritten.\n" -#: ../../fe_utils/print.c:3258 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "Cann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl %d überschritten.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "Kann keine weitere Zelle zur Tabelle hinzufügen: Zellengesamtzahl %lld überschritten.\n" -#: ../../fe_utils/print.c:3516 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "ungültiges Ausgabeformat (interner Fehler): %d" @@ -141,46 +203,51 @@ msgstr "Anfrage fehlgeschlagen: %s" msgid "Query was: %s" msgstr "Anfrage war: %s" -#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "Argument des Shell-Befehls enthält Newline oder Carriage Return: »%s«\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "Datenbankname enthält Newline oder Carriage Return: »%s«\n" + +#: clusterdb.c:114 clusterdb.c:133 createdb.c:149 createdb.c:168 #: createuser.c:195 createuser.c:210 dropdb.c:104 dropdb.c:113 dropdb.c:121 #: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 -#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:277 vacuumdb.c:297 +#: reindexdb.c:177 reindexdb.c:196 vacuumdb.c:280 vacuumdb.c:300 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Versuchen Sie »%s --help« für weitere Informationen." -#: clusterdb.c:130 createdb.c:161 createuser.c:208 dropdb.c:119 dropuser.c:108 -#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:295 +#: clusterdb.c:131 createdb.c:166 createuser.c:208 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:194 vacuumdb.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)" -#: clusterdb.c:148 +#: clusterdb.c:149 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig clustern" -#: clusterdb.c:151 -#, c-format -msgid "cannot cluster specific table(s) in all databases" -msgstr "kann nicht bestimmte Tabelle(n) in allen Datenbanken clustern" - -#: clusterdb.c:215 +#: clusterdb.c:214 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "Clustern der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: clusterdb.c:218 +#: clusterdb.c:217 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "Clustern der Datenbank »%s« fehlgeschlagen: %s" -#: clusterdb.c:246 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: clustere Datenbank »%s«\n" -#: clusterdb.c:262 +#: clusterdb.c:274 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -189,19 +256,19 @@ msgstr "" "%s clustert alle vorher geclusterten Tabellen in einer Datenbank.\n" "\n" -#: clusterdb.c:263 createdb.c:291 createuser.c:415 dropdb.c:172 dropuser.c:170 -#: pg_isready.c:226 reindexdb.c:748 vacuumdb.c:1127 +#: clusterdb.c:275 createdb.c:298 createuser.c:415 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:868 vacuumdb.c:1147 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" -#: clusterdb.c:264 reindexdb.c:749 vacuumdb.c:1128 +#: clusterdb.c:276 reindexdb.c:869 vacuumdb.c:1148 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: clusterdb.c:265 createdb.c:293 createuser.c:417 dropdb.c:174 dropuser.c:172 -#: pg_isready.c:229 reindexdb.c:750 vacuumdb.c:1129 +#: clusterdb.c:277 createdb.c:300 createuser.c:417 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:870 vacuumdb.c:1149 #, c-format msgid "" "\n" @@ -210,50 +277,50 @@ msgstr "" "\n" "Optionen:\n" -#: clusterdb.c:266 +#: clusterdb.c:278 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all clustere alle Datenbanken\n" -#: clusterdb.c:267 +#: clusterdb.c:279 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=DBNAME zu clusternde Datenbank\n" -#: clusterdb.c:268 createuser.c:423 dropdb.c:175 dropuser.c:173 +#: clusterdb.c:280 createuser.c:423 dropdb.c:175 dropuser.c:173 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr "" " -e, --echo zeige die Befehle, die an den Server\n" " gesendet werden\n" -#: clusterdb.c:269 +#: clusterdb.c:281 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet unterdrücke alle Mitteilungen\n" -#: clusterdb.c:270 +#: clusterdb.c:282 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=TABELLE clustere nur bestimmte Tabelle(n)\n" -#: clusterdb.c:271 +#: clusterdb.c:283 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: clusterdb.c:272 createuser.c:439 dropdb.c:178 dropuser.c:176 +#: clusterdb.c:284 createuser.c:439 dropdb.c:178 dropuser.c:176 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: clusterdb.c:273 createuser.c:447 dropdb.c:180 dropuser.c:178 +#: clusterdb.c:285 createuser.c:447 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: clusterdb.c:274 createdb.c:309 createuser.c:448 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:235 reindexdb.c:765 vacuumdb.c:1158 +#: clusterdb.c:286 createdb.c:317 createuser.c:448 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:885 vacuumdb.c:1178 #, c-format msgid "" "\n" @@ -262,37 +329,37 @@ msgstr "" "\n" "Verbindungsoptionen:\n" -#: clusterdb.c:275 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1159 +#: clusterdb.c:287 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1179 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: clusterdb.c:276 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1160 +#: clusterdb.c:288 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1180 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT Port des Datenbankservers\n" -#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:1161 +#: clusterdb.c:289 dropdb.c:184 vacuumdb.c:1181 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: clusterdb.c:278 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1162 +#: clusterdb.c:290 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1182 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: clusterdb.c:279 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1163 +#: clusterdb.c:291 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1183 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password Passwortfrage erzwingen\n" -#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:1164 +#: clusterdb.c:292 dropdb.c:187 vacuumdb.c:1184 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n" -#: clusterdb.c:281 +#: clusterdb.c:293 #, c-format msgid "" "\n" @@ -302,8 +369,8 @@ msgstr "" "Für weitere Informationen lesen Sie bitte die Beschreibung des\n" "SQL-Befehls CLUSTER.\n" -#: clusterdb.c:282 createdb.c:317 createuser.c:454 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:773 vacuumdb.c:1166 +#: clusterdb.c:294 createdb.c:325 createuser.c:454 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:893 vacuumdb.c:1186 #, c-format msgid "" "\n" @@ -312,8 +379,8 @@ msgstr "" "\n" "Berichten Sie Fehler an <%s>.\n" -#: clusterdb.c:283 createdb.c:318 createuser.c:455 dropdb.c:189 dropuser.c:186 -#: pg_isready.c:241 reindexdb.c:774 vacuumdb.c:1167 +#: clusterdb.c:295 createdb.c:326 createuser.c:455 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:894 vacuumdb.c:1187 #, c-format msgid "%s home page: <%s>\n" msgstr "%s Homepage: <%s>\n" @@ -347,22 +414,22 @@ msgstr "%s (%s/%s) " msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Bitte antworten Sie »%s« oder »%s«.\n" -#: createdb.c:178 +#: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "»%s« ist kein gültiger Kodierungsname" -#: createdb.c:253 +#: createdb.c:260 #, c-format msgid "database creation failed: %s" msgstr "Erzeugen der Datenbank ist fehlgeschlagen: %s" -#: createdb.c:272 +#: createdb.c:279 #, c-format msgid "comment creation failed (database was created): %s" msgstr "Erzeugen des Kommentars ist fehlgeschlagen (Datenbank wurde erzeugt): %s" -#: createdb.c:290 +#: createdb.c:297 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -371,118 +438,125 @@ msgstr "" "%s erzeugt eine PostgreSQL-Datenbank.\n" "\n" -#: createdb.c:292 +#: createdb.c:299 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [OPTION]... [DBNAME] [BESCHREIBUNG]\n" -#: createdb.c:294 +#: createdb.c:301 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TABLESPACE Standard-Tablespace der Datenbank\n" -#: createdb.c:295 reindexdb.c:754 +#: createdb.c:302 reindexdb.c:874 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr "" " -e, --echo zeige die Befehle, die an den Server\n" " gesendet werden\n" -#: createdb.c:296 +#: createdb.c:303 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=KODIERUNG Kodierung für die Datenbank\n" -#: createdb.c:297 +#: createdb.c:304 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOCALE Locale-Einstellungen für die Datenbank\n" -#: createdb.c:298 +#: createdb.c:305 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE LC_COLLATE-Einstellung für die Datenbank\n" -#: createdb.c:299 +#: createdb.c:306 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOCALE LC_CTYPE-Einstellung für die Datenbank\n" -#: createdb.c:300 +#: createdb.c:307 +#, c-format +msgid " --builtin-locale=LOCALE builtin locale setting for the database\n" +msgstr "" +" --builtin-locale=LOCALE Locale-Einstellung für Provider »builtin« für\n" +" die Datenbank\n" + +#: createdb.c:308 #, c-format msgid " --icu-locale=LOCALE ICU locale setting for the database\n" msgstr " --icu-locale=LOCALE ICU-Locale-Einstellung für die Datenbank\n" -#: createdb.c:301 +#: createdb.c:309 #, c-format msgid " --icu-rules=RULES ICU rules setting for the database\n" msgstr " --icu-rules=REGELN ICU-Regel-Einstellung für die Datenbank\n" -#: createdb.c:302 +#: createdb.c:310 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " locale provider for the database's default collation\n" msgstr "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " Locale-Provider für Standardsortierfolge der Datenbank\n" -#: createdb.c:304 +#: createdb.c:312 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=EIGENTÜMER Eigentümer der neuen Datenbank\n" -#: createdb.c:305 +#: createdb.c:313 #, c-format msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" msgstr " -S, --strategy=STRATEGIE Datenbankerzeugungsstrategie wal_log oder file_copy\n" -#: createdb.c:306 +#: createdb.c:314 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=TEMPLATE zu kopierende Template-Datenbank\n" -#: createdb.c:307 reindexdb.c:763 +#: createdb.c:315 reindexdb.c:883 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: createdb.c:308 reindexdb.c:764 +#: createdb.c:316 reindexdb.c:884 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: createdb.c:310 reindexdb.c:766 +#: createdb.c:318 reindexdb.c:886 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME Name des Datenbankservers oder Socket-Verzeichnis\n" -#: createdb.c:311 reindexdb.c:767 +#: createdb.c:319 reindexdb.c:887 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT Port des Datenbankservers\n" -#: createdb.c:312 reindexdb.c:768 +#: createdb.c:320 reindexdb.c:888 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: createdb.c:313 reindexdb.c:769 +#: createdb.c:321 reindexdb.c:889 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password niemals nach Passwort fragen\n" -#: createdb.c:314 reindexdb.c:770 +#: createdb.c:322 reindexdb.c:890 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password Passwortfrage erzwingen\n" -#: createdb.c:315 reindexdb.c:771 +#: createdb.c:323 reindexdb.c:891 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME alternative Wartungsdatenbank\n" -#: createdb.c:316 +#: createdb.c:324 #, c-format msgid "" "\n" @@ -867,94 +941,54 @@ msgstr " -t, --timeout=SEK Sekunden auf Verbindung warten, 0 schaltet au msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=NAME Datenbankbenutzername\n" -#: reindexdb.c:209 -#, c-format -msgid "cannot reindex all databases and a specific one at the same time" -msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig reindizieren" - -#: reindexdb.c:211 -#, c-format -msgid "cannot reindex all databases and system catalogs at the same time" -msgstr "kann nicht alle Datenbanken und Systemkataloge gleichzeitig reindizieren" - -#: reindexdb.c:213 -#, c-format -msgid "cannot reindex specific schema(s) in all databases" -msgstr "kann nicht bestimmte Schemas in allen Datenbanken reindizieren" - -#: reindexdb.c:215 -#, c-format -msgid "cannot reindex specific table(s) in all databases" -msgstr "kann nicht bestimmte Tabelle(n) in allen Datenbanken reindizieren" - -#: reindexdb.c:217 -#, c-format -msgid "cannot reindex specific index(es) in all databases" -msgstr "kann nicht bestimmte Indexe in allen Datenbanken reindizieren" - -#: reindexdb.c:227 -#, c-format -msgid "cannot reindex specific schema(s) and system catalogs at the same time" -msgstr "kann nicht bestimmte Schemas und Systemkataloge gleichzeitig reindizieren" - -#: reindexdb.c:229 -#, c-format -msgid "cannot reindex specific table(s) and system catalogs at the same time" -msgstr "kann nicht bestimmte Tabelle(n) und Systemkataloge gleichzeitig reindizieren" - -#: reindexdb.c:231 -#, c-format -msgid "cannot reindex specific index(es) and system catalogs at the same time" -msgstr "kann nicht bestimmte Indexe und Systemkataloge gleichzeitig reindizieren" - -#: reindexdb.c:234 +#: reindexdb.c:210 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "kann nicht mehrere Jobs verwenden, um Systemkataloge zu reindizieren" -#: reindexdb.c:260 +#: reindexdb.c:215 #, c-format -msgid "cannot use multiple jobs to reindex indexes" -msgstr "kann nicht mehrere Jobs verwenden, um Indexe zu reindizieren" +msgid "cannot reindex all databases and a specific one at the same time" +msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig reindizieren" -#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:509 vacuumdb.c:516 vacuumdb.c:523 -#: vacuumdb.c:530 vacuumdb.c:537 vacuumdb.c:544 vacuumdb.c:551 vacuumdb.c:556 -#: vacuumdb.c:560 vacuumdb.c:564 vacuumdb.c:568 +#: reindexdb.c:296 reindexdb.c:303 vacuumdb.c:515 vacuumdb.c:522 vacuumdb.c:529 +#: vacuumdb.c:536 vacuumdb.c:543 vacuumdb.c:550 vacuumdb.c:557 vacuumdb.c:562 +#: vacuumdb.c:566 vacuumdb.c:570 vacuumdb.c:574 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "Option »%s« kann nicht mit Serverversionen älter als PostgreSQL %s verwendet werden" -#: reindexdb.c:561 +#: reindexdb.c:584 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "Reindizieren der Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:565 +#: reindexdb.c:588 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "Reindizieren des Index »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:569 +#: reindexdb.c:592 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "Reindizieren des Schemas »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:573 +#: reindexdb.c:596 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "Reindizieren der Systemkataloge in Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:577 +#: reindexdb.c:600 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "Reindizieren der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: reindexdb.c:730 +#: reindexdb.c:824 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: reindiziere Datenbank »%s«\n" -#: reindexdb.c:747 +#: reindexdb.c:867 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -963,64 +997,64 @@ msgstr "" "%s reindiziert eine PostgreSQL-Datenbank.\n" "\n" -#: reindexdb.c:751 +#: reindexdb.c:871 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all alle Datenbanken reindizieren\n" -#: reindexdb.c:752 +#: reindexdb.c:872 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " --concurrently nebenläufig reindizieren\n" -#: reindexdb.c:753 +#: reindexdb.c:873 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=DBNAME zu reindizierende Datenbank\n" -#: reindexdb.c:755 +#: reindexdb.c:875 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=INDEX nur bestimmte(n) Index(e) erneuern\n" -#: reindexdb.c:756 +#: reindexdb.c:876 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" msgstr "" " -j, --jobs=NUM so viele parallele Verbindungen zum Reindizieren\n" " verwenden\n" -#: reindexdb.c:757 +#: reindexdb.c:877 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet unterdrücke alle Mitteilungen\n" -#: reindexdb.c:758 +#: reindexdb.c:878 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system nur Systemkataloge reindizieren\n" -#: reindexdb.c:759 +#: reindexdb.c:879 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=SCHEMA nur bestimmte(s) Schema(s) reindizieren\n" -#: reindexdb.c:760 +#: reindexdb.c:880 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABELLE nur bestimmte Tabelle(n) reindizieren\n" -#: reindexdb.c:761 +#: reindexdb.c:881 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " --tablespace=TABLESPACE Tablespace wo Indexe neu gebaut werden\n" -#: reindexdb.c:762 +#: reindexdb.c:882 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: reindexdb.c:772 +#: reindexdb.c:892 #, c-format msgid "" "\n" @@ -1030,90 +1064,80 @@ msgstr "" "Für weitere Informationen lesen Sie bitte die Beschreibung des\n" "SQL-Befehls REINDEX.\n" -#: vacuumdb.c:310 vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 -#: vacuumdb.c:325 vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:340 +#: vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 vacuumdb.c:325 +#: vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:334 vacuumdb.c:343 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "kann Option »%s« nicht verwenden, wenn nur Analyze durchgeführt wird" -#: vacuumdb.c:343 +#: vacuumdb.c:346 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "kann Option »%s« nicht verwenden, wenn volles Vacuum durchgeführt wird" -#: vacuumdb.c:349 vacuumdb.c:357 +#: vacuumdb.c:352 vacuumdb.c:360 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "kann Option »%s« nicht mit der Option »%s« verwenden" -#: vacuumdb.c:428 +#: vacuumdb.c:432 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "kann nicht alle Datenbanken und eine bestimmte gleichzeitig vacuumen" -#: vacuumdb.c:432 -#, c-format -msgid "cannot vacuum specific table(s) in all databases" -msgstr "kann nicht bestimmte Tabelle(n) in allen Datenbanken vacuumen" - #: vacuumdb.c:436 #, c-format -msgid "cannot vacuum specific schema(s) in all databases" -msgstr "kann nicht bestimmte Schemas in allen Datenbanken vacuumen" - -#: vacuumdb.c:440 -#, c-format -msgid "cannot exclude specific schema(s) in all databases" -msgstr "kann nicht bestimmte Schemas in allen Datenbanken ausschließen" - -#: vacuumdb.c:444 -#, c-format msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time" msgstr "kann nicht alle Tabellen in Schemas und bestimmte Tabellen gleichzeitig vacuumen" -#: vacuumdb.c:448 +#: vacuumdb.c:440 #, c-format msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time" msgstr "kann nicht bestimmte Tabelle(n) vacuumen und gleichzeitig Schemas ausschließen" -#: vacuumdb.c:452 +#: vacuumdb.c:444 #, c-format msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time" msgstr "kann nicht alle Tabellen in Schemas vacuumen und gleichzeitig Schemas ausschließen" -#: vacuumdb.c:496 +#: vacuumdb.c:457 +#, c-format +msgid "out of memory" +msgstr "Speicher aufgebraucht" + +#: vacuumdb.c:502 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Erzeuge minimale Optimierer-Statistiken (1 Ziel)" -#: vacuumdb.c:497 +#: vacuumdb.c:503 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Erzeuge mittlere Optimierer-Statistiken (10 Ziele)" -#: vacuumdb.c:498 +#: vacuumdb.c:504 msgid "Generating default (full) optimizer statistics" msgstr "Erzeuge volle Optimierer-Statistiken" -#: vacuumdb.c:577 +#: vacuumdb.c:583 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: bearbeite Datenbank »%s«: %s\n" -#: vacuumdb.c:580 +#: vacuumdb.c:586 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: führe Vacuum in Datenbank »%s« aus\n" -#: vacuumdb.c:1115 +#: vacuumdb.c:1135 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "Vacuum der Tabelle »%s« in Datenbank »%s« fehlgeschlagen: %s" -#: vacuumdb.c:1118 +#: vacuumdb.c:1138 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "Vacuum der Datenbank »%s« fehlgeschlagen: %s" -#: vacuumdb.c:1126 +#: vacuumdb.c:1146 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1122,148 +1146,148 @@ msgstr "" "%s säubert und analysiert eine PostgreSQL-Datenbank.\n" "\n" -#: vacuumdb.c:1130 +#: vacuumdb.c:1150 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all führe Vacuum in allen Datenbanken aus\n" -#: vacuumdb.c:1131 +#: vacuumdb.c:1151 #, c-format msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n" msgstr " --buffer-usage-limit=GRÖSSE Größe des für Vacuum verwendeten Ringpuffers\n" -#: vacuumdb.c:1132 +#: vacuumdb.c:1152 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=DBNAME führe Vacuum in dieser Datenbank aus\n" -#: vacuumdb.c:1133 +#: vacuumdb.c:1153 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping Page-Skipping-Verhalten abschalten\n" -#: vacuumdb.c:1134 +#: vacuumdb.c:1154 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr "" " -e, --echo zeige die Befehle, die an den Server\n" " gesendet werden\n" -#: vacuumdb.c:1135 +#: vacuumdb.c:1155 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full führe volles Vacuum durch\n" -#: vacuumdb.c:1136 +#: vacuumdb.c:1156 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze Zeilentransaktionsinformationen einfrieren\n" -#: vacuumdb.c:1137 +#: vacuumdb.c:1157 #, c-format msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" msgstr " --force-index-cleanup Indexeinträge, die auf tote Tupel zeigen, immer entfernen\n" -#: vacuumdb.c:1138 +#: vacuumdb.c:1158 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr "" " -j, --jobs=NUM so viele parallele Verbindungen zum Vacuum\n" " verwenden\n" -#: vacuumdb.c:1139 +#: vacuumdb.c:1159 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr "" " --min-mxid-age=MXID-ALTER minimales Multixact-ID-Alter zu bearbeitender\n" " Tabellen\n" -#: vacuumdb.c:1140 +#: vacuumdb.c:1160 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr "" " --min-xid-age=XID-ALTER minimales Transaktions-ID-Alter zu bearbeitender\n" " Tabellen\n" -#: vacuumdb.c:1141 +#: vacuumdb.c:1161 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" msgstr " --no-index-cleanup Indexeinträge, die auf tote Tupel zeigen, nicht entfernen\n" -#: vacuumdb.c:1142 +#: vacuumdb.c:1162 #, c-format msgid " --no-process-main skip the main relation\n" msgstr " --no-process-main die Hauptrelation überspringen\n" -#: vacuumdb.c:1143 +#: vacuumdb.c:1163 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" msgstr " --no-process-toast zur Tabelle gehörige TOAST-Tabelle überspringen\n" -#: vacuumdb.c:1144 +#: vacuumdb.c:1164 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" msgstr " --no-truncate leere Seiten am Ende der Tabelle nicht abschneiden\n" -#: vacuumdb.c:1145 +#: vacuumdb.c:1165 #, c-format -msgid " -n, --schema=PATTERN vacuum tables in the specified schema(s) only\n" -msgstr " -n, --schema=MUSTER nur Tabellen in den angegebenen Schemas vacuumen\n" +msgid " -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n" +msgstr " -n, --schema=SCHEMA nur Tabellen in den angegebenen Schemas vacuumen\n" -#: vacuumdb.c:1146 +#: vacuumdb.c:1166 #, c-format -msgid " -N, --exclude-schema=PATTERN do not vacuum tables in the specified schema(s)\n" -msgstr " -N, --exclude-schema=MUSTER Tabellen in den angegebenen Schemas nicht vacuumen\n" +msgid " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n" +msgstr " -N, --exclude-schema=SCHEMA Tabellen in den angegebenen Schemas nicht vacuumen\n" -#: vacuumdb.c:1147 +#: vacuumdb.c:1167 #, c-format msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr "" " -P, --parallel=PARALLEL-PROZ so viele Background-Worker für Vacuum verwenden,\n" " wenn verfügbar\n" -#: vacuumdb.c:1148 +#: vacuumdb.c:1168 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet unterdrücke alle Mitteilungen\n" -#: vacuumdb.c:1149 +#: vacuumdb.c:1169 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr "" " --skip-locked Relationen überspringen, die nicht sofort\n" " gesperrt werden können\n" -#: vacuumdb.c:1150 +#: vacuumdb.c:1170 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr "" " -t, --table='TABELLE[(SPALTEN)]'\n" " führe Vacuum für bestimmte Tabelle(n) aus\n" -#: vacuumdb.c:1151 +#: vacuumdb.c:1171 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose erzeuge viele Meldungen\n" -#: vacuumdb.c:1152 +#: vacuumdb.c:1172 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n" -#: vacuumdb.c:1153 +#: vacuumdb.c:1173 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze aktualisiere Statistiken für den Optimierer\n" -#: vacuumdb.c:1154 +#: vacuumdb.c:1174 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr "" " -Z, --analyze-only aktualisiere nur Statistiken für den Optimierer;\n" " kein Vacuum\n" -#: vacuumdb.c:1155 +#: vacuumdb.c:1175 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1273,12 +1297,12 @@ msgstr "" " in mehreren Phasen für schnellere Ergebnisse;\n" " kein Vacuum\n" -#: vacuumdb.c:1157 +#: vacuumdb.c:1177 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n" -#: vacuumdb.c:1165 +#: vacuumdb.c:1185 #, c-format msgid "" "\n" diff --git a/src/bin/scripts/po/el.po b/src/bin/scripts/po/el.po index 814e90a3a70d2..321de27e403d7 100644 --- a/src/bin/scripts/po/el.po +++ b/src/bin/scripts/po/el.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: pgscripts (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-14 09:19+0000\n" -"PO-Revision-Date: 2023-04-14 14:51+0200\n" +"POT-Creation-Date: 2023-08-14 23:19+0000\n" +"PO-Revision-Date: 2023-08-15 16:06+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -39,12 +39,12 @@ msgid "hint: " msgstr "υπόδειξη: " #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "έλλειψη μνήμης\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "δεν ήταν δυνατή η αντιγÏαφή δείκτη null (εσωτεÏικό σφάλμα)\n" @@ -71,7 +71,7 @@ msgstr "Αίτηση ακÏÏωσης εστάλη\n" msgid "Could not send cancel request: " msgstr "Δεν ήταν δυνατή η αποστολή αίτησης ακÏÏωσης: " -#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104 +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103 msgid "Password: " msgstr "Κωδικός Ï€Ïόσβασης: " @@ -80,7 +80,7 @@ msgstr "Κωδικός Ï€Ïόσβασης: " msgid "could not connect to database %s: out of memory" msgstr "δεν ήταν δυνατή η σÏνδεση με τη βάσης δεδομένων %s: έλλειψη μνήμης" -#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146 +#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146 #, c-format msgid "%s" msgstr "%s" @@ -95,12 +95,12 @@ msgstr "μη έγκυÏη τιμή «%s» για την επιλογή %s" msgid "%s must be in range %d..%d" msgstr "%s Ï€Ïέπει να βÏίσκεται εντός εÏÏους %d..%d" -#: ../../fe_utils/parallel_slot.c:301 +#: ../../fe_utils/parallel_slot.c:299 #, c-format msgid "too many jobs for this platform" msgstr "πάÏα πολλές εÏγασίες για την παÏοÏσα πλατφόÏμα" -#: ../../fe_utils/parallel_slot.c:519 +#: ../../fe_utils/parallel_slot.c:520 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "η επεξεÏγασία της βάσης δεδομένων «%s» απέτυχε: %s" @@ -112,22 +112,22 @@ msgid_plural "(%lu rows)" msgstr[0] "(%lu σειÏά)" msgstr[1] "(%lu σειÏές)" -#: ../../fe_utils/print.c:3109 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "Διακόπηκε\n" -#: ../../fe_utils/print.c:3173 +#: ../../fe_utils/print.c:3218 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Δεν είναι δυνατή η Ï€Ïοσθήκη κεφαλίδας σε πεÏιεχόμενο πίνακα: υπέÏβαση του πλήθους στηλών %d.\n" -#: ../../fe_utils/print.c:3213 +#: ../../fe_utils/print.c:3258 #, c-format msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" msgstr "Δεν είναι δυνατή η Ï€Ïοσθήκη ÎºÎµÎ»Î¹Î¿Ï ÏƒÎµ πεÏιεχόμενο πίνακα: υπέÏβαση του ÏƒÏ…Î½Î¿Î»Î¹ÎºÎ¿Ï Î±ÏÎ¹Î¸Î¼Î¿Ï ÎºÎµÎ»Î¹ÏŽÎ½ %d.\n" -#: ../../fe_utils/print.c:3471 +#: ../../fe_utils/print.c:3516 #, c-format msgid "invalid output format (internal error): %d" msgstr "μη έγκυÏη μοÏφή εξόδου (εσωτεÏικό σφάλμα): %d" @@ -142,16 +142,16 @@ msgstr "το εÏώτημα απέτυχε: %s" msgid "Query was: %s" msgstr "Το εÏώτημα ήταν: %s" -#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158 -#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121 +#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163 +#: createuser.c:195 createuser.c:210 dropdb.c:104 dropdb.c:113 dropdb.c:121 #: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 -#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260 +#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:277 vacuumdb.c:297 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Δοκιμάστε «%s --help» για πεÏισσότεÏες πληÏοφοÏίες." -#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108 -#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258 +#: clusterdb.c:130 createdb.c:161 createuser.c:208 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:295 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "πάÏα πολλοί παÏαμέτÏοι εισόδου από την γÏαμμή εντολών (ο Ï€Ïώτη είναι η «%s»)" @@ -176,12 +176,12 @@ msgstr "η ομαδοποίηση του πίνακα «%s» στη βάση δ msgid "clustering of database \"%s\" failed: %s" msgstr "η ομαδοποίηση της βάσης δεδομένων «%s» απέτυχε: %s" -#: clusterdb.c:246 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: ομαδοποιείται η βάση δεδομένων «%s»\n" -#: clusterdb.c:262 +#: clusterdb.c:264 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -190,19 +190,19 @@ msgstr "" "%s: ομαδοποιεί όλους του Ï€ÏοηγοÏμενα ομαδοποιημένους πίνακες σε μία βάση δεδομένων\n" "\n" -#: clusterdb.c:263 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170 -#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964 +#: clusterdb.c:265 createdb.c:288 createuser.c:415 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:750 vacuumdb.c:1127 #, c-format msgid "Usage:\n" msgstr "ΧÏήση:\n" -#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 +#: clusterdb.c:266 reindexdb.c:751 vacuumdb.c:1128 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME]\n" -#: clusterdb.c:265 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172 -#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 +#: clusterdb.c:267 createdb.c:290 createuser.c:417 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:752 vacuumdb.c:1129 #, c-format msgid "" "\n" @@ -211,48 +211,48 @@ msgstr "" "\n" "Επιλογές:\n" -#: clusterdb.c:266 +#: clusterdb.c:268 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all ομαδοποίησε όλες τις βάσεις δεδομένων\n" -#: clusterdb.c:267 +#: clusterdb.c:269 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=DBNAME βάση δεδομένων για ομαδοποίηση\n" -#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173 +#: clusterdb.c:270 createuser.c:423 dropdb.c:175 dropuser.c:173 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n" -#: clusterdb.c:269 +#: clusterdb.c:271 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet να μην γÏάψεις κανένα μήνυμα\n" -#: clusterdb.c:270 +#: clusterdb.c:272 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=TABLE να ομαδοποιήσεις μόνο συγκεκÏιμένους πίνακες\n" -#: clusterdb.c:271 +#: clusterdb.c:273 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose γÏάψε πολλά μηνÏματα εξόδου\n" -#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176 +#: clusterdb.c:274 createuser.c:439 dropdb.c:178 dropuser.c:176 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n" -#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178 +#: clusterdb.c:275 createuser.c:447 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" -#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 +#: clusterdb.c:276 createdb.c:306 createuser.c:448 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:767 vacuumdb.c:1158 #, c-format msgid "" "\n" @@ -261,37 +261,37 @@ msgstr "" "\n" "Επιλογές σÏνδεσης:\n" -#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992 +#: clusterdb.c:277 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1159 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n" -#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993 +#: clusterdb.c:278 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1160 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT θÏÏα διακομιστή βάσης δεδομένων\n" -#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994 +#: clusterdb.c:279 dropdb.c:184 vacuumdb.c:1161 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME όνομα χÏήστη με το οποίο να συνδεθεί\n" -#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995 +#: clusterdb.c:280 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1162 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός Ï€Ïόσβασης\n" -#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996 +#: clusterdb.c:281 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1163 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password αναγκαστική Ï€ÏοτÏοπή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης\n" -#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997 +#: clusterdb.c:282 dropdb.c:187 vacuumdb.c:1164 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήÏησης\n" -#: clusterdb.c:281 +#: clusterdb.c:283 #, c-format msgid "" "\n" @@ -300,8 +300,8 @@ msgstr "" "\n" "Διαβάστε την πεÏιγÏαφή της SQL εντολής CLUSTER για λεπτομέÏειες.\n" -#: clusterdb.c:282 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 +#: clusterdb.c:284 createdb.c:314 createuser.c:454 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:775 vacuumdb.c:1166 #, c-format msgid "" "\n" @@ -310,8 +310,8 @@ msgstr "" "\n" "Υποβάλετε αναφοÏές σφάλματων σε <%s>.\n" -#: clusterdb.c:283 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186 -#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000 +#: clusterdb.c:285 createdb.c:315 createuser.c:455 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:776 vacuumdb.c:1167 #, c-format msgid "%s home page: <%s>\n" msgstr "%s αÏχική σελίδα: <%s>\n" @@ -345,22 +345,22 @@ msgstr "%s (%s/%s) " msgid "Please answer \"%s\" or \"%s\".\n" msgstr "ΠαÏακαλώ απαντήστε «%s» ή «%s».\n" -#: createdb.c:173 +#: createdb.c:170 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "«%s» δεν είναι έγκυÏο όνομα κωδικοποίησης" -#: createdb.c:243 +#: createdb.c:250 #, c-format msgid "database creation failed: %s" msgstr "η δημιουÏγία βάσης δεδομένων απέτυχε: %s" -#: createdb.c:262 +#: createdb.c:269 #, c-format msgid "comment creation failed (database was created): %s" msgstr "η δημιουÏγία σχολίων απέτυχε (δημιουÏγήθηκε βάση δεδομένων): %s" -#: createdb.c:280 +#: createdb.c:287 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -369,47 +369,52 @@ msgstr "" "%s δημιουÏγεί μια βάση δεδομένων PostgreSQL.\n" "\n" -#: createdb.c:282 +#: createdb.c:289 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [ΕΠΙΛΟΓΗ]... [DBNAME] [ΠΕΡΙΓΡΑΦΗ]\n" -#: createdb.c:284 +#: createdb.c:291 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TABLESPACE Ï€Ïοεπιλεγμένος πινακοχώÏος για τη βάση δεδομένων\n" -#: createdb.c:285 reindexdb.c:766 +#: createdb.c:292 reindexdb.c:756 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n" -#: createdb.c:286 +#: createdb.c:293 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=ENCODING κωδικοποίηση για την βάση δεδομένων\n" -#: createdb.c:287 +#: createdb.c:294 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOCALE Ïυθμίσεις εντοπιότητας για τη βάση δεδομένων\n" -#: createdb.c:288 +#: createdb.c:295 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE ÏÏθμιση LC_COLLATE για την βάση δεδομένων\n" -#: createdb.c:289 +#: createdb.c:296 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-collate=LOCALE ÏÏθμιση LC_CTYPE για την βάση δεδομένων\n" -#: createdb.c:290 +#: createdb.c:297 #, c-format msgid " --icu-locale=LOCALE ICU locale setting for the database\n" msgstr " --icu-locale=LOCALE ICU Ïυθμίσεις εντοπιότητας για τη βάση δεδομένων\n" -#: createdb.c:291 +#: createdb.c:298 +#, c-format +msgid " --icu-rules=RULES ICU rules setting for the database\n" +msgstr " --icu-rules=RULES ICU Ïυθμίσεις κανόνων για τη βάση δεδομένων\n" + +#: createdb.c:299 #, c-format msgid "" " --locale-provider={libc|icu}\n" @@ -418,62 +423,62 @@ msgstr "" " --locale-provider={libc|icu}\n" " πάÏοχος εντοπιότητας για την Ï€Ïοεπιλεγμένη συÏÏαφή της βάσης\n" -#: createdb.c:293 +#: createdb.c:301 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=OWNER όνομα χÏήστη που θα κατέχει την νέα βάση δεδομένων\n" -#: createdb.c:294 +#: createdb.c:302 #, c-format msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" msgstr " -S, --strategy=STRATEGY δημιουÏγία στÏατηγικής wal_log βάσης δεδομένων ή flle_copy\n" -#: createdb.c:295 +#: createdb.c:303 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=TEMPLATE Ï€Ïωτότυπη βάση δεδομένων για αντιγÏαφή\n" -#: createdb.c:296 reindexdb.c:775 +#: createdb.c:304 reindexdb.c:765 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης και, στη συνέχεια, έξοδος\n" -#: createdb.c:297 reindexdb.c:776 +#: createdb.c:305 reindexdb.c:766 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, και μετά έξοδος\n" -#: createdb.c:299 reindexdb.c:778 +#: createdb.c:307 reindexdb.c:768 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME διακομιστής βάσης δεδομένων ή κατάλογος υποδοχών\n" -#: createdb.c:300 reindexdb.c:779 +#: createdb.c:308 reindexdb.c:769 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT θÏÏα διακομιστή βάσης δεδομένων\n" -#: createdb.c:301 reindexdb.c:780 +#: createdb.c:309 reindexdb.c:770 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME όνομα χÏήστη με το οποίο να συνδεθεί\n" -#: createdb.c:302 reindexdb.c:781 +#: createdb.c:310 reindexdb.c:771 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password να μην ζητείται ποτέ κωδικός Ï€Ïόσβασης\n" -#: createdb.c:303 reindexdb.c:782 +#: createdb.c:311 reindexdb.c:772 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password αναγκαστική Ï€ÏοτÏοπή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης\n" -#: createdb.c:304 reindexdb.c:783 +#: createdb.c:312 reindexdb.c:773 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME εναλλακτική βάση δεδομένων συντήÏησης\n" -#: createdb.c:305 +#: createdb.c:313 #, c-format msgid "" "\n" @@ -482,46 +487,46 @@ msgstr "" "\n" "Από Ï€Ïοεπιλογή, δημιουÏγείται μια βάση δεδομένων με το ίδιο όνομα με τον Ï„Ïέχοντα χÏήστη.\n" -#: createuser.c:193 +#: createuser.c:218 msgid "Enter name of role to add: " msgstr "Εισαγάγετε το όνομα του Ïόλου για να Ï€Ïοσθέσετε: " -#: createuser.c:208 +#: createuser.c:233 msgid "Enter password for new role: " msgstr "Εισαγάγετε κωδικό Ï€Ïόσβασης για νέο Ïόλο: " -#: createuser.c:209 +#: createuser.c:234 msgid "Enter it again: " msgstr "Εισάγετε ξανά: " -#: createuser.c:212 +#: createuser.c:237 #, c-format msgid "Passwords didn't match.\n" msgstr "Οι κωδικοί Ï€Ïόσβασης δεν είναι ίδιοι.\n" -#: createuser.c:220 +#: createuser.c:245 msgid "Shall the new role be a superuser?" msgstr "Îα είναι ο νέος Ïόλος υπεÏχÏήστης;" -#: createuser.c:235 +#: createuser.c:260 msgid "Shall the new role be allowed to create databases?" msgstr "Îα επιτÏαπεί στον νέο Ïόλο η δημιουÏγία βάσεων δεδομένων;" -#: createuser.c:243 +#: createuser.c:268 msgid "Shall the new role be allowed to create more new roles?" msgstr "Îα επιτÏαπεί στον νέο Ïόλο να δημιουÏγήσει πεÏισσότεÏους νέους Ïόλους;" -#: createuser.c:278 +#: createuser.c:309 #, c-format msgid "password encryption failed: %s" msgstr "η κÏυπτογÏάφηση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης απέτυχε: %s" -#: createuser.c:331 +#: createuser.c:400 #, c-format msgid "creation of new role failed: %s" msgstr "η δημιουÏγία νέου Ïόλου απέτυχε: %s" -#: createuser.c:345 +#: createuser.c:414 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -530,32 +535,46 @@ msgstr "" "%s δημιουÏγεί ένα νέο Ïόλο PostgreSQL.\n" "\n" -#: createuser.c:347 dropuser.c:171 +#: createuser.c:416 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [ΕΠΙΛΟΓΗ]... [ROLENAME]\n" -#: createuser.c:349 +#: createuser.c:418 +#, c-format +msgid "" +" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n" +" option\n" +msgstr "" +" -a, --with-admin=ROLE Ο Ρόλος θα είναι μέÏος του καινοÏÏιου Ïόλου με\n" +" επιλογές διαχειÏιστή\n" + +#: createuser.c:420 #, c-format msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr " -c, --connection-limit=N ÏŒÏιο σÏνδεσης για το Ïόλο (Ï€Ïοεπιλογή: κανένα ÏŒÏιο)\n" -#: createuser.c:350 +#: createuser.c:421 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb ο Ïόλος μποÏεί να δημιουÏγήσει νέες βάσεις δεδομένων\n" -#: createuser.c:351 +#: createuser.c:422 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb ο Ïόλος δεν μποÏεί να δημιουÏγήσει βάσεις δεδομένων (Ï€Ïοεπιλογή)\n" -#: createuser.c:353 +#: createuser.c:424 #, c-format -msgid " -g, --role=ROLE new role will be a member of this role\n" -msgstr " -g, --role=ROLE ο καινοÏÏιος Ïόλος να αποτελεί μέλος Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… Ïόλου\n" +msgid " -g, --member-of=ROLE new role will be a member of ROLE\n" +msgstr " -g, --member-of=ROLE ο καινοÏÏιος Ïόλος να αποτελεί μέλος Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… Ρόλου\n" -#: createuser.c:354 +#: createuser.c:425 +#, c-format +msgid " --role=ROLE (same as --member-of, deprecated)\n" +msgstr " --role=ROLE (το ίδιο όπως --member-of, παÏωχημένο)\n" + +#: createuser.c:426 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -564,47 +583,61 @@ msgstr "" " -i, --inherit ο Ïόλος να κληÏονομεί τα Ï€Ïονόμια των Ïόλων των\n" " οποίων είναι μέλος τους (Ï€Ïοεπιλογή)\n" -#: createuser.c:356 +#: createuser.c:428 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit ο Ïόλος δεν κληÏονομεί Ï€Ïονόμια\n" -#: createuser.c:357 +#: createuser.c:429 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login ο Ïόλος μποÏεί να συνδεθεί (Ï€Ïοεπιλογή)\n" -#: createuser.c:358 +#: createuser.c:430 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login ο Ïόλος δεν μποÏεί να συνδεθεί\n" -#: createuser.c:359 +#: createuser.c:431 +#, c-format +msgid " -m, --with-member=ROLE ROLE will be a member of new role\n" +msgstr " -m, --with-member=ROLE Ο Ïόλος να αποτελεί μέλος του καινοÏÏιου Ïόλου\n" + +#: createuser.c:432 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt αντιστοιχίσε έναν κωδικό Ï€Ïόσβασης στο νέο Ïόλο\n" -#: createuser.c:360 +#: createuser.c:433 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole ο Ïόλος μποÏεί να δημιουÏγεί νέους Ïόλους\n" -#: createuser.c:361 +#: createuser.c:434 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole ο Ïόλος δεν μποÏεί να δημιουÏγεί νέους Ïόλους (Ï€Ïοεπιλογή)\n" -#: createuser.c:362 +#: createuser.c:435 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser ο Ïόλος θα είναι υπεÏχÏήστης\n" -#: createuser.c:363 +#: createuser.c:436 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr " -S, --no-superuser ο Ïόλος δεν θα είναι υπεÏχÏήστης (Ï€Ïοεπιλογή)\n" -#: createuser.c:365 +#: createuser.c:437 +#, c-format +msgid "" +" -v, --valid-until=TIMESTAMP\n" +" password expiration date and time for role\n" +msgstr "" +" -v, --valid-until=TIMESTAMP\n" +" ημεÏομηνία και ÏŽÏα για την εκπνοή ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης του Ïόλου\n" + +#: createuser.c:440 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" @@ -613,17 +646,31 @@ msgstr "" " --interactive να Ï€ÏοτÏέψει για το όνομα Ïόλου και τα χαÏακτηÏιστικά αντί\n" " να χÏησιμοποιήσει Ï€Ïοεπιλογές\n" -#: createuser.c:367 +#: createuser.c:442 +#, c-format +msgid " --bypassrls role can bypass row-level security (RLS) policy\n" +msgstr " --bypassrls ο Ïόλος μποÏεί να παÏακάμψει την πολιτική ασφάλειας επιπέδου σειÏάς (RLS)\n" + +#: createuser.c:443 +#, c-format +msgid "" +" --no-bypassrls role cannot bypass row-level security (RLS) policy\n" +" (default)\n" +msgstr "" +" --no-bypassrls ο Ïόλος δεν μποÏεί να παÏακάμψει την πολιτική ασφάλειας\n" +" επιπέδου σειÏάς (RLS) (Ï€Ïοεπιλογή)\n" + +#: createuser.c:445 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication ο Ïόλος μποÏεί να εκκινήσει αναπαÏαγωγή\n" -#: createuser.c:368 +#: createuser.c:446 #, c-format -msgid " --no-replication role cannot initiate replication\n" -msgstr " --no-replication ο Ïόλος να μην μποÏεί να εκκινήσει αναπαÏαγωγή\n" +msgid " --no-replication role cannot initiate replication (default)\n" +msgstr " --no-replication ο Ïόλος να μην μποÏεί να εκκινήσει αναπαÏαγωγή (Ï€Ïοεπιλογή)\n" -#: createuser.c:373 +#: createuser.c:451 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" msgstr " -U, --username=USERNAME όνομα χÏήστη για να συνδεθεί ως (όχι αυτό που θα δημιουÏγηθεί)\n" @@ -859,49 +906,44 @@ msgstr "δεν είναι δυνατή η χÏήση πολλαπλών εÏγα msgid "cannot use multiple jobs to reindex indexes" msgstr "δεν είναι δυνατή η χÏήση πολλαπλών εÏγασιών για την επαναευÏετηÏιοποίηση ευÏετηÏίων" -#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439 -#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469 -#: vacuumdb.c:473 +#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:509 vacuumdb.c:516 vacuumdb.c:523 +#: vacuumdb.c:530 vacuumdb.c:537 vacuumdb.c:544 vacuumdb.c:551 vacuumdb.c:556 +#: vacuumdb.c:560 vacuumdb.c:564 vacuumdb.c:568 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "δεν είναι δυνατή η χÏήση της επιλογής «%s» σε εκδόσεις διακομιστών παλαιότεÏες από την PostgreSQL %s" -#: reindexdb.c:369 -#, c-format -msgid "cannot reindex system catalogs concurrently, skipping all" -msgstr "δεν είναι δυνατή η ταυτόχÏονη επαναευÏετηÏιοποίηση καταλόγων συστήματος, παÏακάμπτονται όλοι" - -#: reindexdb.c:573 +#: reindexdb.c:561 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "επαναευÏετηÏιοποίηση της βάσης δεδομένων «%s» απέτυχε: %s" -#: reindexdb.c:577 +#: reindexdb.c:565 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "η επανενεξάγηση του ευÏετηÏίου «%s» στη βάση δεδομένων «%s» απέτυχε: %s" -#: reindexdb.c:581 +#: reindexdb.c:569 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "η επαναευÏετηÏιοποίηση του σχήματος «%s» στη βάση δεδομένων «%s» απέτυχε: %s" -#: reindexdb.c:585 +#: reindexdb.c:573 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "η επαναευÏετηÏιοποίηση καταλόγων συστήματος στη βάση δεδομένων «%s» απέτυχε: %s" -#: reindexdb.c:589 +#: reindexdb.c:577 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "η επαναευÏετηÏιοποίηση του πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s" -#: reindexdb.c:742 +#: reindexdb.c:732 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: επαναευÏετηÏιοποίηση της βάσης δεδομένων «%s»\n" -#: reindexdb.c:759 +#: reindexdb.c:749 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -910,62 +952,62 @@ msgstr "" "%s επαναευÏετηÏιοποιεί μια βάση δεδομένων PostgreSQL.\n" "\n" -#: reindexdb.c:763 +#: reindexdb.c:753 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all επαναευÏετηÏιοποίηση όλων των βάσεων δεδομένων\n" -#: reindexdb.c:764 +#: reindexdb.c:754 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " -a, --all ταυτόχÏονη επαναευÏετηÏιοποίηση\n" -#: reindexdb.c:765 +#: reindexdb.c:755 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=DBNAME βάση δεδομένων για επαναευÏετηÏιοποίηση\n" -#: reindexdb.c:767 +#: reindexdb.c:757 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=INDEX δημιοÏÏγησε συγκεκÏιμένο(ους) πίνακα(ες) μόνο\n" -#: reindexdb.c:768 +#: reindexdb.c:758 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" msgstr " -j, --jobs=NUM χÏησιμοποιήσε τόσες πολλές ταυτόχÏονες συνδέσεις με το διακομιστή\n" -#: reindexdb.c:769 +#: reindexdb.c:759 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet να μην γÏάψεις κανένα μήνυμα\n" -#: reindexdb.c:770 +#: reindexdb.c:760 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system επαναευÏετηÏιοποίηση μόνο καταλόγων συστήματος\n" -#: reindexdb.c:771 +#: reindexdb.c:761 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=SCHEMA επαναευÏετηÏιοποίησε συγκεκÏιμένο(-α) σχήμα(-τα) μόνο\n" -#: reindexdb.c:772 +#: reindexdb.c:762 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABLE επαναευÏετηÏιοποίησε συγκεκÏιμένο(-ους) πίνακα(-ες) μόνο\n" -#: reindexdb.c:773 +#: reindexdb.c:763 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " --tablespace=TABLESPACE πινακοχώÏος όπου επαναδημιουÏγοÏνται τα ευÏετήÏια\n" -#: reindexdb.c:774 +#: reindexdb.c:764 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose γÏάψε πολλά μηνÏματα εξόδου\n" -#: reindexdb.c:784 +#: reindexdb.c:774 #, c-format msgid "" "\n" @@ -974,65 +1016,90 @@ msgstr "" "\n" "Διαβάστε την πεÏιγÏαφή της SQL εντολής REINDEX για λεπτομέÏειες.\n" -#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279 -#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294 +#: vacuumdb.c:310 vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 +#: vacuumdb.c:325 vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:340 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "δεν είναι δυνατή η χÏήση της επιλογής «%s» κατά την εκτέλεση μόνο της ανάλυσης" -#: vacuumdb.c:297 +#: vacuumdb.c:343 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "δεν είναι δυνατή η χÏήση της επιλογής «%s» κατά την εκτέλεση full vacuum" -#: vacuumdb.c:303 +#: vacuumdb.c:349 vacuumdb.c:357 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "δεν είναι δυνατή η χÏήση της επιλογής «%s» μαζί με την επιλογή«%s»" -#: vacuumdb.c:322 +#: vacuumdb.c:428 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" -msgstr "δεν μποÏεί να εκτελέσει vacuum σε όλες τις βάσεις δεδομένων και μια συγκεκÏιμένη ταυτόχÏονα" +msgstr "δεν είναι δυνατό το vacuum σε όλες τις βάσεις δεδομένων και μια συγκεκÏιμένη ταυτόχÏονα" -#: vacuumdb.c:324 +#: vacuumdb.c:432 #, c-format msgid "cannot vacuum specific table(s) in all databases" -msgstr "δεν μποÏεί να εκτελέσει vacuum συγκεκÏιμένους πίνακες σε όλες τις βάσεις δεδομένων" +msgstr "δεν είναι δυνατό το vacuum συγκεκÏιμένων πινάκων σε όλες τις βάσεις δεδομένων" + +#: vacuumdb.c:436 +#, c-format +msgid "cannot vacuum specific schema(s) in all databases" +msgstr "δεν είναι δυνατό το vacuum συγκεκÏιμένων σχημάτων σε όλες τις βάσεις δεδομένων" -#: vacuumdb.c:412 +#: vacuumdb.c:440 +#, c-format +msgid "cannot exclude specific schema(s) in all databases" +msgstr "δεν είναι δυνατή να αποκλίσει συγκεκÏιμένα σχήματα σε όλες τις βάσεις δεδομένων" + +#: vacuumdb.c:444 +#, c-format +msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time" +msgstr "δεν είναι δυνατό το vacuum όλων των πινάκων σε σχήμα(τα) και συγκεκÏιμένων πινάκων ταυτόχÏονα" + +#: vacuumdb.c:448 +#, c-format +msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time" +msgstr "δεν είναι δυνατό το vacuum συγκεκÏιμένων πινάκων και καταλόγων συστήματος ταυτόχÏονα" + +#: vacuumdb.c:452 +#, c-format +msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time" +msgstr "δεν είναι δυνατό το vacuum όλων των πινάκων σε σχήμα(τα) και η εξαίÏεση συγκεκÏιμένων σχημάτων ταυτόχÏονα" + +#: vacuumdb.c:496 msgid "Generating minimal optimizer statistics (1 target)" msgstr "ΔημιουÏγία ελάχιστων στατιστικών βελτιστοποιητή (1 στόχος)" -#: vacuumdb.c:413 +#: vacuumdb.c:497 msgid "Generating medium optimizer statistics (10 targets)" msgstr "ΔημιουÏγία μεσαίων στατιστικών βελτιστοποιητή (10 στόχοι)" -#: vacuumdb.c:414 +#: vacuumdb.c:498 msgid "Generating default (full) optimizer statistics" msgstr "ΔημιουÏγία Ï€Ïοεπιλεγμένων (πλήÏων) στατιστικών βελτιστοποιητή" -#: vacuumdb.c:479 +#: vacuumdb.c:577 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: επεξεÏγάζεται τη βάση δεδομένων «%s»: %s\n" -#: vacuumdb.c:482 +#: vacuumdb.c:580 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: εκτελεί vacuum στη βάση δεδομένων «%s»\n" -#: vacuumdb.c:952 +#: vacuumdb.c:1115 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "η εκτέλεση vacuum στον πίνακα «%s» στη βάση δεδομένων «%s» απέτυχε: %s" -#: vacuumdb.c:955 +#: vacuumdb.c:1118 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "η εκτέλεση vacuum στη βάση δεδομένων «%s» απέτυχε: %s" -#: vacuumdb.c:963 +#: vacuumdb.c:1126 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1041,114 +1108,134 @@ msgstr "" "%s καθαÏίζει και αναλÏει μια βάση δεδομένων PostgreSQL.\n" "\n" -#: vacuumdb.c:967 +#: vacuumdb.c:1130 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all εκτέλεσε vacuum σε όλες τις βάσεις δεδομένων\n" -#: vacuumdb.c:968 +#: vacuumdb.c:1131 +#, c-format +msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n" +msgstr " --buffer-usage-limit=SIZE μέγεθος δακτυλίου ενδιάμεσης μνήμης για vacuum\n" + +#: vacuumdb.c:1132 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=DBNAME βάση δεδομένων για vacuum\n" -#: vacuumdb.c:969 +#: vacuumdb.c:1133 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping απενεÏγοποιήστε κάθε συμπεÏιφοÏά παÏάλειψης σελίδας\n" -#: vacuumdb.c:970 +#: vacuumdb.c:1134 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo εμφάνισε τις εντολές που αποστέλλονται στο διακομιστή\n" -#: vacuumdb.c:971 +#: vacuumdb.c:1135 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full να εκτελέσει πλήÏες vacuum\n" -#: vacuumdb.c:972 +#: vacuumdb.c:1136 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze πάγωσε τις πληÏοφοÏίες σειÏάς συναλλαγής\n" -#: vacuumdb.c:973 +#: vacuumdb.c:1137 #, c-format msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" msgstr " --force-index-cleanup αφαιÏεί πάντα καταχωÏήσεις ευÏετηÏίου που οδηγοÏν σε νεκÏές πλειάδες\n" -#: vacuumdb.c:974 +#: vacuumdb.c:1138 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=NUM χÏησιμοποιήσε τόσες πολλές ταυτόχÏονες συνδέσεις με το διακομιστή\n" -#: vacuumdb.c:975 +#: vacuumdb.c:1139 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr " --min-mxid-age=MXID_AGE ελάχιστη ηλικία multixact ID πινάκων για vacuum\n" -#: vacuumdb.c:976 +#: vacuumdb.c:1140 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr " --min-xid-age=XID_AGE ελάχιστη ηλικία transaction ID πινάκων για vacuum\n" -#: vacuumdb.c:977 +#: vacuumdb.c:1141 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" msgstr " --no-index-cleanup να μην αφαιÏέσει καταχωÏήσεις ευÏετηÏίου που οδηγοÏν σε νεκÏές πλειάδες\n" -#: vacuumdb.c:978 +#: vacuumdb.c:1142 +#, c-format +msgid " --no-process-main skip the main relation\n" +msgstr " --no-process-main παÏάλειψε την κÏÏια σχέση\n" + +#: vacuumdb.c:1143 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" msgstr " --no-process-toast παÏάλειψε τον πίνακα TOAST που σχετίζεται με τον πίνακα που εκτελείται vacuum\n" -#: vacuumdb.c:979 +#: vacuumdb.c:1144 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" msgstr " --no-truncate να μην πεÏικόψει άδειες σελίδες από το τέλος του πίνακα\n" -#: vacuumdb.c:980 +#: vacuumdb.c:1145 +#, c-format +msgid " -n, --schema=PATTERN vacuum tables in the specified schema(s) only\n" +msgstr " -n, --schema=PATTERN vacuum πίνακες μόνο για τα καθοÏισμένα σχήματα\n" + +#: vacuumdb.c:1146 +#, c-format +msgid " -N, --exclude-schema=PATTERN do not vacuum tables in the specified schema(s)\n" +msgstr " -N, --exclude-schema=PATTERN να μην κάνει vacuum πίνακες στα καθοÏισμένα σχήματα\n" + +#: vacuumdb.c:1147 #, c-format msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr "" " -P, --parallel=PARALLEL_WORKERS χÏησιμοποίησε τόσους πολλοÏÏ‚ εÏγάτες παÏασκηνίου\n" " για την εκτέλεση vacuum, εάν αυτοί είναι διαθέσιμοι\n" -#: vacuumdb.c:981 +#: vacuumdb.c:1148 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet να μην γÏάψεις κανένα μήνυμα\n" -#: vacuumdb.c:982 +#: vacuumdb.c:1149 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked να παÏαλείψει σχέσεις που δεν μποÏοÏν να κλειδωθοÏν άμεσα\n" -#: vacuumdb.c:983 +#: vacuumdb.c:1150 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" -msgstr " -t, --table=‘TABLE[(COLUMNS)]’ να εκτελέσει vacuum μόνο σε συγκεκÏιμένους πίνακες\n" +msgstr " -t, --table='TABLE[(COLUMNS)]' να εκτελέσει vacuum μόνο σε συγκεκÏιμένους πίνακες\n" -#: vacuumdb.c:984 +#: vacuumdb.c:1151 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose γÏάψε πολλά μηνÏματα εξόδου\n" -#: vacuumdb.c:985 +#: vacuumdb.c:1152 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version εμφάνισε πληÏοφοÏίες έκδοσης, στη συνέχεια έξοδος\n" -#: vacuumdb.c:986 +#: vacuumdb.c:1153 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze ενημέÏωσε τα στατιστικά του βελτιστοποιητή\n" -#: vacuumdb.c:987 +#: vacuumdb.c:1154 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr " -z, --analyze μόνο ενημέÏωσε τα στατιστικά του βελτιστοποιητή· χωÏίς vacuum\n" -#: vacuumdb.c:988 +#: vacuumdb.c:1155 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1157,12 +1244,12 @@ msgstr "" " --analyze-in-stages ενημέÏωσε μόνο τα στατιστικά στοιχεία βελτιστοποίησης, σε πολλαπλά\n" " στάδια για ταχÏτεÏα αποτελέσματα· χωÏίς vacuum\n" -#: vacuumdb.c:990 +#: vacuumdb.c:1157 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n" -#: vacuumdb.c:998 +#: vacuumdb.c:1165 #, c-format msgid "" "\n" @@ -1171,6 +1258,9 @@ msgstr "" "\n" "Διαβάστε την πεÏιγÏαφή της SQL εντολής VACUUM για λεπτομέÏειες.\n" +#~ msgid "cannot reindex system catalogs concurrently, skipping all" +#~ msgstr "δεν είναι δυνατή η ταυτόχÏονη επαναευÏετηÏιοποίηση καταλόγων συστήματος, παÏακάμπτονται όλοι" + #~ msgid "fatal: " #~ msgstr "κÏίσιμο: " diff --git a/src/bin/scripts/po/es.po b/src/bin/scripts/po/es.po index 0f19647ede8f0..97f4e2e30684e 100644 --- a/src/bin/scripts/po/es.po +++ b/src/bin/scripts/po/es.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pgscripts (PostgreSQL) 16\n" +"Project-Id-Version: pgscripts (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:20+0000\n" -"PO-Revision-Date: 2023-05-22 12:06+0200\n" +"POT-Creation-Date: 2025-02-16 19:51+0000\n" +"PO-Revision-Date: 2024-11-16 14:24+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -54,6 +54,48 @@ msgstr "memoria agotada\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "no se puede duplicar un puntero nulo (error interno)\n" +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "no se pudo abrir el archivo «%s»: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "no se pudo sincronizar el sistema de archivos para el archivo «%s»: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "no se pudo hacer stat al archivo «%s»: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "esta instalación no soporta el método de sync «%s»" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "no se pudo abrir el directorio «%s»: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "no se pudo leer el directorio «%s»: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "no se pudo sincronizar (fsync) archivo «%s»: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "no se pudo renombrar el archivo de «%s» a «%s»: %m" + #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" @@ -68,11 +110,11 @@ msgstr "el usuario no existe" msgid "user name lookup failure: error code %lu" msgstr "fallo en la búsqueda de nombre de usuario: código de error %lu" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Petición de cancelación enviada\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "No se pudo enviar el paquete de cancelación: " @@ -100,12 +142,27 @@ msgstr "el valor «%s» no es válido para la opción %s" msgid "%s must be in range %d..%d" msgstr "%s debe estar en el rango %d..%d" -#: ../../fe_utils/parallel_slot.c:299 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "método sync no reconocido: %s" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "demasiados procesos para esta plataforma: %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "descriptor de archivo para socket fuera de rango para select(): %d" + +#: ../../fe_utils/parallel_slot.c:328 #, c-format -msgid "too many jobs for this platform" -msgstr "demasiados procesos para esta plataforma" +msgid "Try fewer jobs." +msgstr "Intente con menos trabajos." -#: ../../fe_utils/parallel_slot.c:520 +#: ../../fe_utils/parallel_slot.c:553 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "falló el procesamiento de la base de datos «%s»: %s" @@ -122,17 +179,22 @@ msgstr[1] "(%lu filas)" msgid "Interrupted\n" msgstr "Interrumpido\n" -#: ../../fe_utils/print.c:3218 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "No se puede imprimir el contenido de la tabla: el número de celdas %lld es igual o mayor al máximo %lld.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "No se puede agregar un encabezado al contenido de la tabla: la cantidad de columnas de %d ha sido excedida.\n" -#: ../../fe_utils/print.c:3258 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "No se puede agregar una celda al contenido de la tabla: la cantidad de celdas de %d ha sido excedida.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "No se puede agregar una celda al contenido de la tabla: la cantidad de celdas de %lld ha sido excedida.\n" -#: ../../fe_utils/print.c:3516 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "formato de salida no válido (error interno): %d" @@ -147,46 +209,51 @@ msgstr "la consulta falló: %s" msgid "Query was: %s" msgstr "La consulta era: %s" -#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163 -#: createuser.c:196 createuser.c:211 dropdb.c:104 dropdb.c:113 dropdb.c:121 +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "el argumento de la orden de shell contiene un salto de línea o retorno de carro: «%s»\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "el nombre de base de datos contiene un salto de línea o retorno de carro: «%s»\n" + +#: clusterdb.c:114 clusterdb.c:133 createdb.c:149 createdb.c:168 +#: createuser.c:195 createuser.c:210 dropdb.c:104 dropdb.c:113 dropdb.c:121 #: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 -#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:277 vacuumdb.c:297 +#: reindexdb.c:177 reindexdb.c:196 vacuumdb.c:280 vacuumdb.c:300 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Pruebe «%s --help» para mayor información." -#: clusterdb.c:130 createdb.c:161 createuser.c:209 dropdb.c:119 dropuser.c:108 -#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:295 +#: clusterdb.c:131 createdb.c:166 createuser.c:208 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:194 vacuumdb.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)" -#: clusterdb.c:148 +#: clusterdb.c:149 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "no se puede reordenar todas las bases de datos y una de ellas en particular simultáneamente" -#: clusterdb.c:151 -#, c-format -msgid "cannot cluster specific table(s) in all databases" -msgstr "no es posible reordenar tablas específicas en todas las bases de datos" - -#: clusterdb.c:215 +#: clusterdb.c:214 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "falló el reordenamiento de la tabla «%s» en la base de datos «%s»: %s" -#: clusterdb.c:218 +#: clusterdb.c:217 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "falló el reordenamiento de la base de datos «%s»: %s" -#: clusterdb.c:246 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: reordenando la base de datos «%s»\n" -#: clusterdb.c:262 +#: clusterdb.c:274 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -196,19 +263,19 @@ msgstr "" "en una base de datos.\n" "\n" -#: clusterdb.c:263 createdb.c:291 createuser.c:416 dropdb.c:172 dropuser.c:170 -#: pg_isready.c:226 reindexdb.c:748 vacuumdb.c:1127 +#: clusterdb.c:275 createdb.c:300 createuser.c:417 dropdb.c:171 dropuser.c:171 +#: pg_isready.c:226 reindexdb.c:876 vacuumdb.c:1171 #, c-format msgid "Usage:\n" msgstr "Empleo:\n" -#: clusterdb.c:264 reindexdb.c:749 vacuumdb.c:1128 +#: clusterdb.c:276 reindexdb.c:877 vacuumdb.c:1172 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPCIÓN]... [BASE-DE-DATOS]\n" -#: clusterdb.c:265 createdb.c:293 createuser.c:418 dropdb.c:174 dropuser.c:172 -#: pg_isready.c:229 reindexdb.c:750 vacuumdb.c:1129 +#: clusterdb.c:277 createdb.c:302 createuser.c:419 dropdb.c:173 dropuser.c:173 +#: pg_isready.c:229 reindexdb.c:878 vacuumdb.c:1173 #, c-format msgid "" "\n" @@ -217,48 +284,48 @@ msgstr "" "\n" "Opciones:\n" -#: clusterdb.c:266 +#: clusterdb.c:278 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all reordenar todas las bases de datos\n" -#: clusterdb.c:267 +#: clusterdb.c:279 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=BASE base de datos a reordenar\n" -#: clusterdb.c:268 createuser.c:424 dropdb.c:175 dropuser.c:173 +#: clusterdb.c:280 createuser.c:425 dropdb.c:174 dropuser.c:174 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo mostrar las órdenes a medida que se ejecutan\n" -#: clusterdb.c:269 +#: clusterdb.c:281 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet no escribir ningún mensaje\n" -#: clusterdb.c:270 +#: clusterdb.c:282 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=TABLA reordenar sólo esta(s) tabla(s)\n" -#: clusterdb.c:271 +#: clusterdb.c:283 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose desplegar varios mensajes informativos\n" -#: clusterdb.c:272 createuser.c:439 dropdb.c:178 dropuser.c:176 +#: clusterdb.c:284 createuser.c:441 dropdb.c:177 dropuser.c:177 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión y salir\n" -#: clusterdb.c:273 createuser.c:447 dropdb.c:180 dropuser.c:178 +#: clusterdb.c:285 createuser.c:449 dropdb.c:179 dropuser.c:179 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: clusterdb.c:274 createdb.c:309 createuser.c:448 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:235 reindexdb.c:765 vacuumdb.c:1158 +#: clusterdb.c:286 createdb.c:319 createuser.c:450 dropdb.c:180 dropuser.c:180 +#: pg_isready.c:235 reindexdb.c:893 vacuumdb.c:1202 #, c-format msgid "" "\n" @@ -267,37 +334,37 @@ msgstr "" "\n" "Opciones de conexión:\n" -#: clusterdb.c:275 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1159 +#: clusterdb.c:287 createuser.c:451 dropdb.c:181 dropuser.c:181 vacuumdb.c:1203 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=ANFITRIÓN nombre del servidor o directorio del socket\n" -#: clusterdb.c:276 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1160 +#: clusterdb.c:288 createuser.c:452 dropdb.c:182 dropuser.c:182 vacuumdb.c:1204 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PUERTO puerto del servidor\n" -#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:1161 +#: clusterdb.c:289 dropdb.c:183 vacuumdb.c:1205 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n" -#: clusterdb.c:278 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1162 +#: clusterdb.c:290 createuser.c:454 dropdb.c:184 dropuser.c:184 vacuumdb.c:1206 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password nunca pedir contraseña\n" -#: clusterdb.c:279 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1163 +#: clusterdb.c:291 createuser.c:455 dropdb.c:185 dropuser.c:185 vacuumdb.c:1207 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password forzar la petición de contraseña\n" -#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:1164 +#: clusterdb.c:292 dropdb.c:186 vacuumdb.c:1208 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=BASE base de datos de mantención alternativa\n" -#: clusterdb.c:281 +#: clusterdb.c:293 #, c-format msgid "" "\n" @@ -306,8 +373,8 @@ msgstr "" "\n" "Lea la descripción de la orden CLUSTER de SQL para obtener mayores detalles.\n" -#: clusterdb.c:282 createdb.c:317 createuser.c:454 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:773 vacuumdb.c:1166 +#: clusterdb.c:294 createdb.c:327 createuser.c:456 dropdb.c:187 dropuser.c:186 +#: pg_isready.c:240 reindexdb.c:901 vacuumdb.c:1210 #, c-format msgid "" "\n" @@ -316,8 +383,8 @@ msgstr "" "\n" "Reporte errores a <%s>.\n" -#: clusterdb.c:283 createdb.c:318 createuser.c:455 dropdb.c:189 dropuser.c:186 -#: pg_isready.c:241 reindexdb.c:774 vacuumdb.c:1167 +#: clusterdb.c:295 createdb.c:328 createuser.c:457 dropdb.c:188 dropuser.c:187 +#: pg_isready.c:241 reindexdb.c:902 vacuumdb.c:1211 #, c-format msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" @@ -330,43 +397,43 @@ msgstr[0] "la consulta retornó %d fila en lugar de una: %s" msgstr[1] "la consulta retornó %d filas en lugar de una: %s" #. translator: abbreviation for "yes" -#: common.c:131 +#: common.c:132 msgid "y" msgstr "s" #. translator: abbreviation for "no" -#: common.c:133 +#: common.c:134 msgid "n" msgstr "n" #. translator: This is a question followed by the translated options for #. "yes" and "no". -#: common.c:143 +#: common.c:144 #, c-format msgid "%s (%s/%s) " msgstr "%s (%s/%s) " -#: common.c:164 +#: common.c:165 #, c-format msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Por favor conteste «%s» o «%s».\n" -#: createdb.c:178 +#: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "«%s» no es un nombre válido de codificación" -#: createdb.c:253 +#: createdb.c:262 #, c-format msgid "database creation failed: %s" msgstr "falló la creación de la base de datos: %s" -#: createdb.c:272 +#: createdb.c:281 #, c-format msgid "comment creation failed (database was created): %s" msgstr "falló la creación del comentario (la base de datos fue creada): %s" -#: createdb.c:290 +#: createdb.c:299 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -375,119 +442,124 @@ msgstr "" "%s crea una base de datos PostgreSQL.\n" "\n" -#: createdb.c:292 +#: createdb.c:301 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [OPCIÓN]... [NOMBRE] [DESCRIPCIÓN]\n" -#: createdb.c:294 +#: createdb.c:303 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TBLSPC tablespace por omisión de la base de datos\n" -#: createdb.c:295 reindexdb.c:754 +#: createdb.c:304 reindexdb.c:882 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n" -#: createdb.c:296 +#: createdb.c:305 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=CODIF codificación para la base de datos\n" -#: createdb.c:297 +#: createdb.c:306 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOCALE configuración regional para la base de datos\n" -#: createdb.c:298 +#: createdb.c:307 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE configuración LC_COLLATE para la base de datos\n" -#: createdb.c:299 +#: createdb.c:308 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOCALE configuración LC_CTYPE para la base de datos\n" -#: createdb.c:300 +#: createdb.c:309 +#, c-format +msgid " --builtin-locale=LOCALE builtin locale setting for the database\n" +msgstr " --builtin-locale=LOCALE configuración regional builtin para la base de datos\n" + +#: createdb.c:310 #, c-format msgid " --icu-locale=LOCALE ICU locale setting for the database\n" msgstr " --icu-locale=LOCALE configuración regional ICU para la base de datos\n" -#: createdb.c:301 +#: createdb.c:311 #, c-format msgid " --icu-rules=RULES ICU rules setting for the database\n" msgstr " --icu-rules=REGLAS configuración de reglas ICU para la base de datos\n" -#: createdb.c:302 +#: createdb.c:312 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " locale provider for the database's default collation\n" msgstr "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " proveedor de configuración regional para el ordenamiento\n" " por omisión de las bases de datos\n" -#: createdb.c:304 +#: createdb.c:314 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=DUEÑO usuario que será dueño de la base de datos\n" -#: createdb.c:305 +#: createdb.c:315 #, c-format msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" msgstr "" " -S, --strategy=ESTRATEGIA estrategia de creación de bases de datos\n" " wal_log o file_copy\n" -#: createdb.c:306 +#: createdb.c:316 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=PATRÓN base de datos patrón a copiar\n" -#: createdb.c:307 reindexdb.c:763 +#: createdb.c:317 reindexdb.c:891 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión y salir\n" -#: createdb.c:308 reindexdb.c:764 +#: createdb.c:318 reindexdb.c:892 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: createdb.c:310 reindexdb.c:766 +#: createdb.c:320 reindexdb.c:894 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=ANFITRIÓN nombre del servidor o directorio del socket\n" -#: createdb.c:311 reindexdb.c:767 +#: createdb.c:321 reindexdb.c:895 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PUERTO puerto del servidor\n" -#: createdb.c:312 reindexdb.c:768 +#: createdb.c:322 reindexdb.c:896 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n" -#: createdb.c:313 reindexdb.c:769 +#: createdb.c:323 reindexdb.c:897 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password nunca pedir contraseña\n" -#: createdb.c:314 reindexdb.c:770 +#: createdb.c:324 reindexdb.c:898 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password forzar la petición de contraseña\n" -#: createdb.c:315 reindexdb.c:771 +#: createdb.c:325 reindexdb.c:899 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=BASE base de datos de mantención alternativa\n" -#: createdb.c:316 +#: createdb.c:326 #, c-format msgid "" "\n" @@ -497,46 +569,46 @@ msgstr "" "Si no se especifica, se creará una base de datos con el mismo nombre que\n" "el usuario actual.\n" -#: createuser.c:219 +#: createuser.c:218 msgid "Enter name of role to add: " msgstr "Ingrese el nombre del rol a agregar: " -#: createuser.c:234 +#: createuser.c:233 msgid "Enter password for new role: " msgstr "Ingrese la contraseña para el nuevo rol: " -#: createuser.c:235 +#: createuser.c:234 msgid "Enter it again: " msgstr "Ingrésela nuevamente: " -#: createuser.c:238 +#: createuser.c:237 #, c-format msgid "Passwords didn't match.\n" msgstr "Las contraseñas no coinciden.\n" -#: createuser.c:246 +#: createuser.c:245 msgid "Shall the new role be a superuser?" msgstr "¿Será el nuevo rol un superusuario?" -#: createuser.c:261 +#: createuser.c:260 msgid "Shall the new role be allowed to create databases?" msgstr "¿Debe permitírsele al rol la creación de bases de datos?" -#: createuser.c:269 +#: createuser.c:268 msgid "Shall the new role be allowed to create more new roles?" msgstr "¿Debe permitírsele al rol la creación de otros roles?" -#: createuser.c:310 +#: createuser.c:311 #, c-format msgid "password encryption failed: %s" msgstr "el cifrado de la contraseña falló: %s" -#: createuser.c:401 +#: createuser.c:402 #, c-format msgid "creation of new role failed: %s" msgstr "falló la creación del nuevo rol: %s" -#: createuser.c:415 +#: createuser.c:416 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -545,46 +617,46 @@ msgstr "" "%s crea un nuevo rol de PostgreSQL.\n" "\n" -#: createuser.c:417 dropuser.c:171 +#: createuser.c:418 dropuser.c:172 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [OPCIÓN]... [ROL]\n" -#: createuser.c:419 +#: createuser.c:420 #, c-format -#| msgid "" -#| " -a, --admin=ROLE this role will be a member of new role with admin\n" -#| " option\n" msgid "" " -a, --with-admin=ROLE ROLE will be a member of new role with admin\n" " option\n" -msgstr "" -" -a, --with-admin=ROL ROL será miembro del nuevo rol con “opción de adminâ€\n" +msgstr " -a, --with-admin=ROL ROL será miembro del nuevo rol con “opción de adminâ€\n" -#: createuser.c:421 +#: createuser.c:422 #, c-format msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr "" " -c, --connection-limit=N límite de conexiones para el rol\n" " (predeterminado: sin límite)\n" -#: createuser.c:422 +#: createuser.c:423 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb el rol podrá crear bases de datos\n" -#: createuser.c:423 +#: createuser.c:424 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb el rol no podrá crear bases de datos (predeterm.)\n" -#: createuser.c:425 +#: createuser.c:426 #, c-format -#| msgid " -g, --role=ROLE new role will be a member of this role\n" msgid " -g, --member-of=ROLE new role will be a member of ROLE\n" msgstr " -g, --member-of=ROL el nuevo rol será un miembro de ROL\n" -#: createuser.c:426 +#: createuser.c:427 +#, c-format +msgid " --role=ROLE (same as --member-of, deprecated)\n" +msgstr " --role=ROL (lo mismo que --member-of; obsoleto)\n" + +#: createuser.c:428 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -593,57 +665,53 @@ msgstr "" " -i, --inherit el rol heredará los privilegios de los roles de\n" " los cuales es miembro (predeterminado)\n" -#: createuser.c:428 +#: createuser.c:430 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit rol no heredará privilegios\n" -#: createuser.c:429 +#: createuser.c:431 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login el rol podrá conectarse (predeterminado)\n" -#: createuser.c:430 +#: createuser.c:432 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login el rol no podrá conectarse\n" -#: createuser.c:431 +#: createuser.c:433 #, c-format -#| msgid " -m, --member=ROLE this role will be a member of new role\n" msgid " -m, --with-member=ROLE ROLE will be a member of new role\n" msgstr " -m, --with-member=ROL ROL será miembro del nuevo rol\n" -#: createuser.c:432 +#: createuser.c:434 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt asignar una contraseña al nuevo rol\n" -#: createuser.c:433 +#: createuser.c:435 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole el rol podrá crear otros roles\n" -#: createuser.c:434 +#: createuser.c:436 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole el rol no podrá crear otros roles (predeterminado)\n" -#: createuser.c:435 +#: createuser.c:437 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser el rol será un superusuario\n" -#: createuser.c:436 +#: createuser.c:438 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr " -S, --no-superuser el rol no será un superusuario (predeterminado)\n" -#: createuser.c:437 +#: createuser.c:439 #, c-format -#| msgid "" -#| " -v, --valid-until=TIMESTAMP\n" -#| " password expiration date for role\n" msgid "" " -v, --valid-until=TIMESTAMP\n" " password expiration date and time for role\n" @@ -651,7 +719,7 @@ msgstr "" " -v, --valid-until=TIEMPO\n" " fecha/hora de expiración de contraseña para el rol\n" -#: createuser.c:440 +#: createuser.c:442 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" @@ -660,14 +728,14 @@ msgstr "" " --interactive preguntar los nombres y atributos de rol faltantes\n" " en lugar de asumir los valores por omisión\n" -#: createuser.c:442 +#: createuser.c:444 #, c-format msgid " --bypassrls role can bypass row-level security (RLS) policy\n" msgstr "" " --bypassrls el rol puede sobrepasar la política de\n" -" seguridad de registros (RLS)\n" +" seguridad de registros (RLS)\n" -#: createuser.c:443 +#: createuser.c:445 #, c-format msgid "" " --no-bypassrls role cannot bypass row-level security (RLS) policy\n" @@ -676,17 +744,17 @@ msgstr "" " --no-bypassrls el rol no puede sobrepasar la política de seguridad\n" " de registros (por omisión)\n" -#: createuser.c:445 +#: createuser.c:447 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication el rol podrá iniciar replicación\n" -#: createuser.c:446 +#: createuser.c:448 #, c-format msgid " --no-replication role cannot initiate replication (default)\n" msgstr " --no-replication el rol no puede iniciar replicación (por omisión)\n" -#: createuser.c:451 +#: createuser.c:453 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" msgstr "" @@ -707,12 +775,12 @@ msgstr "La base de datos «%s» será eliminada permanentemente.\n" msgid "Are you sure?" msgstr "¿Está seguro?" -#: dropdb.c:157 +#: dropdb.c:156 #, c-format msgid "database removal failed: %s" msgstr "falló la eliminación de la base de datos: %s" -#: dropdb.c:171 +#: dropdb.c:170 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -721,22 +789,22 @@ msgstr "" "%s elimina una base de datos de PostgreSQL.\n" "\n" -#: dropdb.c:173 +#: dropdb.c:172 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [OPCIÓN]... BASE-DE-DATOS\n" -#: dropdb.c:176 +#: dropdb.c:175 #, c-format msgid " -f, --force try to terminate other connections before dropping\n" msgstr " -f, --force intentar cancelar otras conexiones antes de borrar\n" -#: dropdb.c:177 +#: dropdb.c:176 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive preguntar antes de eliminar\n" -#: dropdb.c:179 +#: dropdb.c:178 #, c-format msgid " --if-exists don't report error if database doesn't exist\n" msgstr " --if-exists no reportar error si la base de datos no existe\n" @@ -755,12 +823,12 @@ msgstr "falta el nombre de rol requerido" msgid "Role \"%s\" will be permanently removed.\n" msgstr "El rol «%s» será eliminado permanentemente.\n" -#: dropuser.c:154 +#: dropuser.c:155 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "falló la eliminación del rol «%s»: %s" -#: dropuser.c:169 +#: dropuser.c:170 #, c-format msgid "" "%s removes a PostgreSQL role.\n" @@ -769,7 +837,7 @@ msgstr "" "%s elimina un rol de PostgreSQL.\n" "\n" -#: dropuser.c:174 +#: dropuser.c:175 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -778,12 +846,12 @@ msgstr "" " -i, --interactive preguntar antes de eliminar cualquier cosa, y\n" " preguntar el nombre de rol si no se especifica\n" -#: dropuser.c:177 +#: dropuser.c:178 #, c-format msgid " --if-exists don't report error if user doesn't exist\n" msgstr " --if-exists no reportar error si el usuario no existe\n" -#: dropuser.c:182 +#: dropuser.c:183 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to drop)\n" msgstr "" @@ -876,94 +944,54 @@ msgstr "" msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USUARIO nombre de usuario para la conexión\n" -#: reindexdb.c:209 -#, c-format -msgid "cannot reindex all databases and a specific one at the same time" -msgstr "no se puede reindexar todas las bases de datos y una de ellas en particular simultáneamente" - -#: reindexdb.c:211 -#, c-format -msgid "cannot reindex all databases and system catalogs at the same time" -msgstr "no se puede reindexar todas las bases de datos y los catálogos del sistema simultáneamente" - -#: reindexdb.c:213 -#, c-format -msgid "cannot reindex specific schema(s) in all databases" -msgstr "no es posible reindexar esquemas específicos en todas las bases de datos" - -#: reindexdb.c:215 -#, c-format -msgid "cannot reindex specific table(s) in all databases" -msgstr "no es posible reindexar tablas específicas en todas las bases de datos" - -#: reindexdb.c:217 -#, c-format -msgid "cannot reindex specific index(es) in all databases" -msgstr "no es posible reindexar índices específicos en todas las bases de datos" - -#: reindexdb.c:227 -#, c-format -msgid "cannot reindex specific schema(s) and system catalogs at the same time" -msgstr "no es posible reindexar esquemas específicos y los catálogos del sistema simultáneamente" - -#: reindexdb.c:229 -#, c-format -msgid "cannot reindex specific table(s) and system catalogs at the same time" -msgstr "no es posible reindexar tablas específicas y los catálogos del sistema simultáneamente" - -#: reindexdb.c:231 -#, c-format -msgid "cannot reindex specific index(es) and system catalogs at the same time" -msgstr "no es posible reindexar índices específicos y los catálogos del sistema simultáneamente" - -#: reindexdb.c:234 +#: reindexdb.c:210 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "no se puede usar múltiples procesos para reindexar índices de sistema" -#: reindexdb.c:260 +#: reindexdb.c:215 #, c-format -msgid "cannot use multiple jobs to reindex indexes" -msgstr "no se puede usar múltiples procesos para reindexar índices" +msgid "cannot reindex all databases and a specific one at the same time" +msgstr "no se puede reindexar todas las bases de datos y una de ellas en particular simultáneamente" -#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:509 vacuumdb.c:516 vacuumdb.c:523 -#: vacuumdb.c:530 vacuumdb.c:537 vacuumdb.c:544 vacuumdb.c:551 vacuumdb.c:556 -#: vacuumdb.c:560 vacuumdb.c:564 vacuumdb.c:568 +#: reindexdb.c:296 reindexdb.c:303 vacuumdb.c:514 vacuumdb.c:521 vacuumdb.c:528 +#: vacuumdb.c:535 vacuumdb.c:542 vacuumdb.c:549 vacuumdb.c:556 vacuumdb.c:563 +#: vacuumdb.c:570 vacuumdb.c:577 vacuumdb.c:584 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "no se puede usar la opción «%s» cuando con versiones más antiguas que PostgreSQL %s" -#: reindexdb.c:561 +#: reindexdb.c:586 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "falló la reindexación de la base de datos «%s»: %s" -#: reindexdb.c:565 +#: reindexdb.c:590 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "falló la reindexación del índice «%s» en la base de datos «%s»: %s" -#: reindexdb.c:569 +#: reindexdb.c:594 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "falló la reindexación del esquema «%s» en la base de datos «%s»: %s" -#: reindexdb.c:573 +#: reindexdb.c:598 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "falló la reindexación de los catálogos de sistema en la base de datos «%s»: %s" -#: reindexdb.c:577 +#: reindexdb.c:602 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "falló la reindexación de la tabla «%s» en la base de datos «%s»: %s" -#: reindexdb.c:730 +#: reindexdb.c:832 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: reindexando la base de datos «%s»\n" -#: reindexdb.c:747 +#: reindexdb.c:875 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -972,62 +1000,62 @@ msgstr "" "%s reindexa una base de datos PostgreSQL.\n" "\n" -#: reindexdb.c:751 +#: reindexdb.c:879 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all reindexar todas las bases de datos\n" -#: reindexdb.c:752 +#: reindexdb.c:880 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " --concurrently reindexar en modo concurrente\n" -#: reindexdb.c:753 +#: reindexdb.c:881 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=BASE-DATOS base de datos a reindexar\n" -#: reindexdb.c:755 +#: reindexdb.c:883 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=ÃNDICE recrear sólo este o estos índice(s)\n" -#: reindexdb.c:756 +#: reindexdb.c:884 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" msgstr " -j, --jobs=NÚM usar esta cantidad de conexiones concurrentes\n" -#: reindexdb.c:757 +#: reindexdb.c:885 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet no desplegar mensajes\n" -#: reindexdb.c:758 +#: reindexdb.c:886 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system sólo reindexar los catálogos del sistema\n" -#: reindexdb.c:759 +#: reindexdb.c:887 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=ESQUEMA reindexar sólo este o estos esquemas\n" -#: reindexdb.c:760 +#: reindexdb.c:888 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABLA reindexar sólo esta(s) tabla(s)\n" -#: reindexdb.c:761 +#: reindexdb.c:889 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " --tablespace=TABLESPACE tablespace donde se reconstruirán los índices\n" -#: reindexdb.c:762 +#: reindexdb.c:890 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose desplegar varios mensajes informativos\n" -#: reindexdb.c:772 +#: reindexdb.c:900 #, c-format msgid "" "\n" @@ -1036,90 +1064,80 @@ msgstr "" "\n" "Lea la descripción de la orden REINDEX de SQL para obtener mayores detalles.\n" -#: vacuumdb.c:310 vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 -#: vacuumdb.c:325 vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:340 +#: vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 vacuumdb.c:325 +#: vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:334 vacuumdb.c:343 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "no se puede usar la opción «%s» cuando se está sólo actualizando estadísticas" -#: vacuumdb.c:343 +#: vacuumdb.c:346 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "no se puede usar la opción «%s» cuando se está ejecutando vacuum full" -#: vacuumdb.c:349 vacuumdb.c:357 +#: vacuumdb.c:352 vacuumdb.c:360 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "no se puede usar la opción «%s» junto con la opción «%s»" -#: vacuumdb.c:428 +#: vacuumdb.c:432 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "no se puede limpiar todas las bases de datos y una de ellas en particular simultáneamente" -#: vacuumdb.c:432 -#, c-format -msgid "cannot vacuum specific table(s) in all databases" -msgstr "no es posible limpiar tablas específicas en todas las bases de datos" - #: vacuumdb.c:436 #, c-format -msgid "cannot vacuum specific schema(s) in all databases" -msgstr "no es posible limpiar esquemas específicos en todas las bases de datos" - -#: vacuumdb.c:440 -#, c-format -msgid "cannot exclude specific schema(s) in all databases" -msgstr "no es posible excluir esquemas específicos en todas las bases de datos" - -#: vacuumdb.c:444 -#, c-format msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time" msgstr "no se puede limpiar todas las tablas en esquema(s) y tabla(s) específicas simultáneamente" -#: vacuumdb.c:448 +#: vacuumdb.c:440 #, c-format msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time" msgstr "no es posible limpiar tablas específicas y excluir esquema(s) simultáneamente" -#: vacuumdb.c:452 +#: vacuumdb.c:444 #, c-format msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time" msgstr "no se puede limpiar todas las tablas en esquema(s) y excluir esquema(s) simultáneamente" -#: vacuumdb.c:496 +#: vacuumdb.c:457 +#, c-format +msgid "out of memory" +msgstr "memoria agotada" + +#: vacuumdb.c:501 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Generando estadísticas mínimas para el optimizador (tamaño = 1)" -#: vacuumdb.c:497 +#: vacuumdb.c:502 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Generando estadísticas medias para el optimizador (tamaño = 10)" -#: vacuumdb.c:498 +#: vacuumdb.c:503 msgid "Generating default (full) optimizer statistics" msgstr "Generando estadísticas predeterminadas (completas) para el optimizador" -#: vacuumdb.c:577 +#: vacuumdb.c:594 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: procesando la base de datos «%s»: %s\n" -#: vacuumdb.c:580 +#: vacuumdb.c:597 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: limpiando la base de datos «%s»\n" -#: vacuumdb.c:1115 +#: vacuumdb.c:1159 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "falló la limpieza de la tabla «%s» en la base de datos «%s»: %s" -#: vacuumdb.c:1118 +#: vacuumdb.c:1162 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "falló la limpieza de la base de datos «%s»: %s" -#: vacuumdb.c:1126 +#: vacuumdb.c:1170 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1128,136 +1146,136 @@ msgstr "" "%s limpia (VACUUM) y analiza una base de datos PostgreSQL.\n" "\n" -#: vacuumdb.c:1130 +#: vacuumdb.c:1174 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all limpia todas las bases de datos\n" -#: vacuumdb.c:1131 +#: vacuumdb.c:1175 #, c-format msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n" msgstr " --buffer-usage-limit=SZ tamaño de anillo de búfers a usar para vacuum\n" -#: vacuumdb.c:1132 +#: vacuumdb.c:1176 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=BASE base de datos a limpiar\n" -#: vacuumdb.c:1133 +#: vacuumdb.c:1177 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping desactiva todo comportamiento de saltar páginas\n" -#: vacuumdb.c:1134 +#: vacuumdb.c:1178 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo mostrar las órdenes enviadas al servidor\n" -#: vacuumdb.c:1135 +#: vacuumdb.c:1179 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full usar «vacuum full»\n" -#: vacuumdb.c:1136 +#: vacuumdb.c:1180 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze usar «vacuum freeze»\n" -#: vacuumdb.c:1137 +#: vacuumdb.c:1181 #, c-format msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" msgstr " --force-index-cleanup siempre eliminar entradas de índice que apunten a tuplas muertas\n" -#: vacuumdb.c:1138 +#: vacuumdb.c:1182 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=NUM usar esta cantidad de conexiones concurrentes\n" -#: vacuumdb.c:1139 +#: vacuumdb.c:1183 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr " --min-mxid-age=EDAD_MXID edad de multixact ID mínima de tablas a limpiar\n" -#: vacuumdb.c:1140 +#: vacuumdb.c:1184 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr " --min-xid-age=EDAD_XID edad de ID de transacción mínima de tablas a limpiar\n" -#: vacuumdb.c:1141 +#: vacuumdb.c:1185 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" msgstr " --no-index-cleanup no eliminar entradas de índice que apunten a tuplas muertas\n" -#: vacuumdb.c:1142 +#: vacuumdb.c:1186 #, c-format msgid " --no-process-main skip the main relation\n" msgstr " --no-process-main omitir la relación principal\n" -#: vacuumdb.c:1143 +#: vacuumdb.c:1187 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" msgstr " --no-process-toast omitir la tabla TOAST asociada con la tabla a la que se hará vacuum\n" -#: vacuumdb.c:1144 +#: vacuumdb.c:1188 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" msgstr " --no-truncate no truncar las páginas vacías al final de la tabla\n" -#: vacuumdb.c:1145 +#: vacuumdb.c:1189 #, c-format -msgid " -n, --schema=PATTERN vacuum tables in the specified schema(s) only\n" -msgstr " -n, --schema=PATRÓN limpia sólo tablas en el/los esquemas especificados\n" +msgid " -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n" +msgstr " -n, --schema=ESQUEMA limpia sólo tablas en el/los esquemas especificados\n" -#: vacuumdb.c:1146 +#: vacuumdb.c:1190 #, c-format -msgid " -N, --exclude-schema=PATTERN do not vacuum tables in the specified schema(s)\n" -msgstr " -N, --exclude-schema=PATRÓN no limpia tablas en el/los esquemas especificados\n" +msgid " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n" +msgstr " -N, --exclude-schema=ESQUEMA no limpia tablas en el/los esquemas especificados\n" -#: vacuumdb.c:1147 +#: vacuumdb.c:1191 #, c-format msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr " -P, --parallel=NPROCS usar esta cantidad de procesos para vacuum, si están disponibles\n" -#: vacuumdb.c:1148 +#: vacuumdb.c:1192 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet no desplegar mensajes\n" -#: vacuumdb.c:1149 +#: vacuumdb.c:1193 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked ignorar relaciones que no pueden bloquearse inmediatamente\n" -#: vacuumdb.c:1150 +#: vacuumdb.c:1194 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr "" " -t, --table='TABLA[(COLUMNAS)]'\n" " limpiar sólo esta(s) tabla(s)\n" -#: vacuumdb.c:1151 +#: vacuumdb.c:1195 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose desplegar varios mensajes informativos\n" -#: vacuumdb.c:1152 +#: vacuumdb.c:1196 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version mostrar información de versión y salir\n" -#: vacuumdb.c:1153 +#: vacuumdb.c:1197 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze actualizar las estadísticas del optimizador\n" -#: vacuumdb.c:1154 +#: vacuumdb.c:1198 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr "" " -Z, --analyze-only sólo actualizar las estadísticas del optimizador;\n" " no hacer vacuum\n" -#: vacuumdb.c:1155 +#: vacuumdb.c:1199 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1267,12 +1285,12 @@ msgstr "" " en múltiples etapas para resultados más rápidos;\n" " no hacer vacuum\n" -#: vacuumdb.c:1157 +#: vacuumdb.c:1201 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help mostrar esta ayuda y salir\n" -#: vacuumdb.c:1165 +#: vacuumdb.c:1209 #, c-format msgid "" "\n" diff --git a/src/bin/scripts/po/fr.po b/src/bin/scripts/po/fr.po index 7301c792c7cc6..1582cf94510a1 100644 --- a/src/bin/scripts/po/fr.po +++ b/src/bin/scripts/po/fr.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-14 10:19+0000\n" -"PO-Revision-Date: 2022-05-14 17:16+0200\n" +"POT-Creation-Date: 2024-08-23 14:21+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -21,39 +21,81 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "erreur : " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "attention : " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "détail : " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "astuce : " #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "mémoire épuisée\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "ne peut pas dupliquer un pointeur nul (erreur interne)\n" +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "n'a pas pu ouvrir le fichier « %s » : %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le système de fichiers pour le fichier « %s » : %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "n'a pas pu tester le fichier « %s » : %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "cette construction ne supporte pas la méthode de synchronisation « %s »" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "n'a pas pu ouvrir le répertoire « %s » : %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "n'a pas pu lire le répertoire « %s » : %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "n'a pas pu synchroniser sur disque (fsync) le fichier « %s » : %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "n'a pas pu renommer le fichier « %s » en « %s » : %m" + #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" @@ -68,15 +110,15 @@ msgstr "l'utilisateur n'existe pas" msgid "user name lookup failure: error code %lu" msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Requête d'annulation envoyée\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "N'a pas pu envoyer la requête d'annulation : " -#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104 +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103 msgid "Password: " msgstr "Mot de passe : " @@ -85,7 +127,7 @@ msgstr "Mot de passe : " msgid "could not connect to database %s: out of memory" msgstr "n'a pas pu se connecter à la base de données %s : plus de mémoire" -#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146 +#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146 #, c-format msgid "%s" msgstr "%s" @@ -100,12 +142,27 @@ msgstr "valeur « %s » invalide pour l'option %s" msgid "%s must be in range %d..%d" msgstr "%s doit être compris entre %d et %d" -#: ../../fe_utils/parallel_slot.c:301 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "méthode de synchronisation non reconnu : %s" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "trop de jobs pour cette plateforme : %d" + +#: ../../fe_utils/parallel_slot.c:326 #, c-format -msgid "too many jobs for this platform" -msgstr "trop de jobs pour cette plateforme" +msgid "socket file descriptor out of range for select(): %d" +msgstr "descripteur de fichier socket hors d'échelle pour select() : %d" -#: ../../fe_utils/parallel_slot.c:519 +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "Essayez moins de jobs." + +#: ../../fe_utils/parallel_slot.c:553 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "le traitement de la base de données « %s » a échoué : %s" @@ -117,26 +174,31 @@ msgid_plural "(%lu rows)" msgstr[0] "(%lu ligne)" msgstr[1] "(%lu lignes)" -#: ../../fe_utils/print.c:3109 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "Interrompu\n" -#: ../../fe_utils/print.c:3173 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "Ne peut pas afficher le contenu de la table : le nombre de cellules %lld est égal à ou dépasse le maximum %lld.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "" "Ne peut pas ajouter l'en-tête au contenu de la table : le nombre de colonnes\n" "%d est dépassé.\n" -#: ../../fe_utils/print.c:3213 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" msgstr "" "Ne peut pas ajouter une cellule au contenu de la table : le nombre total des\n" -"cellules %d est dépassé.\n" +"cellules %lld est dépassé.\n" -#: ../../fe_utils/print.c:3471 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "format de sortie invalide (erreur interne) : %d" @@ -151,46 +213,51 @@ msgstr "échec de la requête : %s" msgid "Query was: %s" msgstr "La requête était : %s" -#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158 -#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "l'argument de la commande shell contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "le nom de la base contient un retour à la ligne ou un retour chariot : « %s »\n" + +#: clusterdb.c:114 clusterdb.c:133 createdb.c:149 createdb.c:168 +#: createuser.c:195 createuser.c:210 dropdb.c:104 dropdb.c:113 dropdb.c:121 #: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 -#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260 +#: reindexdb.c:177 reindexdb.c:196 vacuumdb.c:280 vacuumdb.c:300 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Essayez « %s --help » pour plus d'informations." -#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108 -#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258 +#: clusterdb.c:131 createdb.c:166 createuser.c:208 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:194 vacuumdb.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)" -#: clusterdb.c:148 +#: clusterdb.c:149 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "ne peut pas réorganiser à la fois toutes les bases de données et une base spécifique via la commande CLUSTER" -#: clusterdb.c:151 -#, c-format -msgid "cannot cluster specific table(s) in all databases" -msgstr "ne peut pas réorganiser la(les) table(s) spécifique(s) dans toutes les bases de données" - -#: clusterdb.c:215 +#: clusterdb.c:214 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "la réorganisation de la table « %s » de la base de données « %s » avec la commande CLUSTER a échoué : %s" -#: clusterdb.c:218 +#: clusterdb.c:217 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "la réorganisation de la base de données « %s » via la commande CLUSTER a échoué : %s" -#: clusterdb.c:246 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s : réorganisation de la base de données « %s » via la commande CLUSTER\n" -#: clusterdb.c:262 +#: clusterdb.c:274 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -200,19 +267,19 @@ msgstr "" "base de données via la commande CLUSTER.\n" "\n" -#: clusterdb.c:263 createdb.c:283 createuser.c:346 dropdb.c:172 dropuser.c:170 -#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964 +#: clusterdb.c:275 createdb.c:298 createuser.c:415 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:868 vacuumdb.c:1147 #, c-format msgid "Usage:\n" msgstr "Usage :\n" -#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 +#: clusterdb.c:276 reindexdb.c:869 vacuumdb.c:1148 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [BASE]\n" -#: clusterdb.c:265 createdb.c:285 createuser.c:348 dropdb.c:174 dropuser.c:172 -#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 +#: clusterdb.c:277 createdb.c:300 createuser.c:417 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:870 vacuumdb.c:1149 #, c-format msgid "" "\n" @@ -221,48 +288,48 @@ msgstr "" "\n" "Options :\n" -#: clusterdb.c:266 +#: clusterdb.c:278 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all réorganise toutes les bases de données\n" -#: clusterdb.c:267 +#: clusterdb.c:279 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=BASE réorganise la base de données spécifiée\n" -#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173 +#: clusterdb.c:280 createuser.c:423 dropdb.c:175 dropuser.c:173 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo affiche les commandes envoyées au serveur\n" -#: clusterdb.c:269 +#: clusterdb.c:281 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet n'écrit aucun message\n" -#: clusterdb.c:270 +#: clusterdb.c:282 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=TABLE réorganise uniquement la table spécifiée\n" -#: clusterdb.c:271 +#: clusterdb.c:283 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose mode verbeux\n" -#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176 +#: clusterdb.c:284 createuser.c:439 dropdb.c:178 dropuser.c:176 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178 +#: clusterdb.c:285 createuser.c:447 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: clusterdb.c:274 createdb.c:300 createuser.c:370 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 +#: clusterdb.c:286 createdb.c:317 createuser.c:448 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:885 vacuumdb.c:1178 #, c-format msgid "" "\n" @@ -271,39 +338,39 @@ msgstr "" "\n" "Options de connexion :\n" -#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992 +#: clusterdb.c:287 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1179 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HÔTE hôte du serveur de bases de données ou\n" " répertoire des sockets\n" -#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993 +#: clusterdb.c:288 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1180 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT port du serveur de bases de données\n" -#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994 +#: clusterdb.c:289 dropdb.c:184 vacuumdb.c:1181 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n" -#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995 +#: clusterdb.c:290 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1182 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password empêche la demande d'un mot de passe\n" -#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996 +#: clusterdb.c:291 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1183 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password force la demande d'un mot de passe\n" -#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997 +#: clusterdb.c:292 dropdb.c:187 vacuumdb.c:1184 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=BASE indique une autre base par défaut\n" -#: clusterdb.c:281 +#: clusterdb.c:293 #, c-format msgid "" "\n" @@ -312,8 +379,8 @@ msgstr "" "\n" "Lire la description de la commande SQL CLUSTER pour de plus amples détails.\n" -#: clusterdb.c:282 createdb.c:308 createuser.c:376 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 +#: clusterdb.c:294 createdb.c:325 createuser.c:454 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:893 vacuumdb.c:1186 #, c-format msgid "" "\n" @@ -322,8 +389,8 @@ msgstr "" "\n" "Rapporter les bogues à <%s>.\n" -#: clusterdb.c:283 createdb.c:309 createuser.c:377 dropdb.c:189 dropuser.c:186 -#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000 +#: clusterdb.c:295 createdb.c:326 createuser.c:455 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:894 vacuumdb.c:1187 #, c-format msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" @@ -357,32 +424,22 @@ msgstr "%s (%s/%s) " msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Merci de répondre « %s » ou « %s ».\n" -#: createdb.c:165 -#, c-format -msgid "only one of --locale and --lc-ctype can be specified" -msgstr "une seule des options --locale et --lc-ctype peut être indiquée" - -#: createdb.c:167 -#, c-format -msgid "only one of --locale and --lc-collate can be specified" -msgstr "une seule des options --locale et --lc-collate peut être indiquée" - #: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "« %s » n'est pas un nom d'encodage valide" -#: createdb.c:245 +#: createdb.c:260 #, c-format msgid "database creation failed: %s" msgstr "la création de la base de données a échoué : %s" -#: createdb.c:264 +#: createdb.c:279 #, c-format msgid "comment creation failed (database was created): %s" msgstr "l'ajout du commentaire a échoué (la base de données a été créée) : %s" -#: createdb.c:282 +#: createdb.c:297 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -391,115 +448,125 @@ msgstr "" "%s crée une base de données PostgreSQL.\n" "\n" -#: createdb.c:284 +#: createdb.c:299 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [OPTION]... [BASE] [DESCRIPTION]\n" -#: createdb.c:286 +#: createdb.c:301 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TABLESPACE tablespace par défaut de la base de données\n" -#: createdb.c:287 reindexdb.c:766 +#: createdb.c:302 reindexdb.c:874 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo affiche les commandes envoyées au serveur\n" -#: createdb.c:288 +#: createdb.c:303 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=ENCODAGE encodage de la base de données\n" -#: createdb.c:289 +#: createdb.c:304 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOCALE paramètre de la locale pour la base de données\n" -#: createdb.c:290 +#: createdb.c:305 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE paramètre LC_COLLATE pour la base de données\n" -#: createdb.c:291 +#: createdb.c:306 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOCALE paramètre LC_CTYPE pour la base de données\n" -#: createdb.c:292 +#: createdb.c:307 +#, c-format +msgid " --builtin-locale=LOCALE builtin locale setting for the database\n" +msgstr " --builtin-locale=LOCALE paramètre de la locale native pour la base de données\n" + +#: createdb.c:308 #, c-format msgid " --icu-locale=LOCALE ICU locale setting for the database\n" msgstr " --icu-locale=LOCALE paramètre de la locale ICU pour la base de données\n" -#: createdb.c:293 +#: createdb.c:309 +#, c-format +msgid " --icu-rules=RULES ICU rules setting for the database\n" +msgstr " --icu-rules=RÈGLES configuration des règles ICU pour la base de données\n" + +#: createdb.c:310 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " locale provider for the database's default collation\n" msgstr "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " fournisseur de locale pour la collation par défaut de la base de données\n" -#: createdb.c:295 +#: createdb.c:312 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr "" " -O, --owner=PROPRIÉTAIRE nom du propriétaire de la nouvelle base de\n" " données\n" -#: createdb.c:296 +#: createdb.c:313 #, c-format msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" msgstr " -S, --strategy=STRATEGIE stratégie de création de base (wal_log ou file_copy)\n" -#: createdb.c:297 +#: createdb.c:314 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=MODÈLE base de données modèle à copier\n" -#: createdb.c:298 reindexdb.c:775 +#: createdb.c:315 reindexdb.c:883 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: createdb.c:299 reindexdb.c:776 +#: createdb.c:316 reindexdb.c:884 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: createdb.c:301 reindexdb.c:778 +#: createdb.c:318 reindexdb.c:886 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HÔTE hôte du serveur de bases de données\n" " ou répertoire des sockets\n" -#: createdb.c:302 reindexdb.c:779 +#: createdb.c:319 reindexdb.c:887 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT port du serveur de bases de données\n" -#: createdb.c:303 reindexdb.c:780 +#: createdb.c:320 reindexdb.c:888 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n" -#: createdb.c:304 reindexdb.c:781 +#: createdb.c:321 reindexdb.c:889 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password empêche la demande d'un mot de passe\n" -#: createdb.c:305 reindexdb.c:782 +#: createdb.c:322 reindexdb.c:890 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password force la demande d'un mot de passe\n" -#: createdb.c:306 reindexdb.c:783 +#: createdb.c:323 reindexdb.c:891 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=BASE indique une autre base par défaut\n" -#: createdb.c:307 +#: createdb.c:324 #, c-format msgid "" "\n" @@ -508,46 +575,46 @@ msgstr "" "\n" "Par défaut, la base de donnée créée porte le nom de l'utilisateur courant.\n" -#: createuser.c:193 +#: createuser.c:218 msgid "Enter name of role to add: " msgstr "Saisir le nom du rôle à ajouter : " -#: createuser.c:208 +#: createuser.c:233 msgid "Enter password for new role: " msgstr "Saisir le mot de passe pour le nouveau rôle : " -#: createuser.c:209 +#: createuser.c:234 msgid "Enter it again: " msgstr "Saisir le mot de passe à nouveau : " -#: createuser.c:212 +#: createuser.c:237 #, c-format msgid "Passwords didn't match.\n" msgstr "Les mots de passe ne sont pas identiques.\n" -#: createuser.c:220 +#: createuser.c:245 msgid "Shall the new role be a superuser?" msgstr "Le nouveau rôle est-il super-utilisateur ?" -#: createuser.c:235 +#: createuser.c:260 msgid "Shall the new role be allowed to create databases?" msgstr "Le nouveau rôle est-il autorisé à créer des bases de données ?" -#: createuser.c:243 +#: createuser.c:268 msgid "Shall the new role be allowed to create more new roles?" msgstr "Le nouveau rôle est-il autorisé à créer de nouveaux rôles ?" -#: createuser.c:278 +#: createuser.c:309 #, c-format msgid "password encryption failed: %s" msgstr "échec du chiffrement du mot de passe : %s" -#: createuser.c:331 +#: createuser.c:400 #, c-format msgid "creation of new role failed: %s" msgstr "la création du nouveau rôle a échoué : %s" -#: createuser.c:345 +#: createuser.c:414 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -556,36 +623,48 @@ msgstr "" "%s crée un nouvel rôle PostgreSQL.\n" "\n" -#: createuser.c:347 dropuser.c:171 +#: createuser.c:416 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [OPTION]... [RÔLE]\n" -#: createuser.c:349 +#: createuser.c:418 +#, c-format +msgid "" +" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n" +" option\n" +msgstr " -a, --with-admin=ROLE ROLE sera un membre du nouveau rôle avec l'option admin\n" + +#: createuser.c:420 #, c-format msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr "" " -c, --connection-limit=N nombre maximum de connexions pour le rôle (par\n" " défaut sans limite)\n" -#: createuser.c:350 +#: createuser.c:421 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb le rôle peut créer des bases de données\n" -#: createuser.c:351 +#: createuser.c:422 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr "" " -D, --no-createdb le rôle ne peut pas créer de bases de données\n" " (par défaut)\n" -#: createuser.c:353 +#: createuser.c:424 #, c-format -msgid " -g, --role=ROLE new role will be a member of this role\n" -msgstr " -g, --role=ROLE le nouveau rôle sera un membre de ce rôle\n" +msgid " -g, --member-of=ROLE new role will be a member of ROLE\n" +msgstr " -g, --member-of=ROLE le nouveau rôle sera un membre de ROLE\n" -#: createuser.c:354 +#: createuser.c:425 +#, c-format +msgid " --role=ROLE (same as --member-of, deprecated)\n" +msgstr " --role=ROLE (identique à --member-of, obsolète)\n" + +#: createuser.c:426 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -594,49 +673,61 @@ msgstr "" " -i, --inherit le rôle hérite des droits des rôles dont il est\n" " membre (par défaut)\n" -#: createuser.c:356 +#: createuser.c:428 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit le rôle n'hérite pas des droits\n" -#: createuser.c:357 +#: createuser.c:429 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login le rôle peut se connecter (par défaut)\n" -#: createuser.c:358 +#: createuser.c:430 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login le rôle ne peut pas se connecter\n" -#: createuser.c:359 +#: createuser.c:431 +#, c-format +msgid " -m, --with-member=ROLE ROLE will be a member of new role\n" +msgstr " -m, --with-member=ROLE ROLE sera un membre du nouveau rôle\n" + +#: createuser.c:432 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt affecte un mot de passe au nouveau rôle\n" -#: createuser.c:360 +#: createuser.c:433 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole le rôle peut créer des rôles\n" -#: createuser.c:361 +#: createuser.c:434 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole le rôle ne peut pas créer de rôles (par défaut)\n" -#: createuser.c:362 +#: createuser.c:435 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser le rôle est super-utilisateur\n" -#: createuser.c:363 +#: createuser.c:436 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr "" " -S, --no-superuser le rôle n'est pas super-utilisateur (par\n" " défaut)\n" -#: createuser.c:365 +#: createuser.c:437 +#, c-format +msgid "" +" -v, --valid-until=TIMESTAMP\n" +" password expiration date and time for role\n" +msgstr " -v, --valid-until=TIMESTAMP date et heure d'expiration du mot de passe pour le rôle\n" + +#: createuser.c:440 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" @@ -645,21 +736,35 @@ msgstr "" " --interactive demande le nom du rôle et les attributs\n" " plutôt qu'utiliser des valeurs par défaut\n" -#: createuser.c:367 +#: createuser.c:442 +#, c-format +msgid " --bypassrls role can bypass row-level security (RLS) policy\n" +msgstr " --bypassrls le rôle peut contourner la politique de sécurité niveau ligne (RLS)\n" + +#: createuser.c:443 +#, c-format +msgid "" +" --no-bypassrls role cannot bypass row-level security (RLS) policy\n" +" (default)\n" +msgstr "" +" --no-bypassrls le rôle ne peut pas contourner la politique de sécurité niveau ligne (RLS)\n" +" (par défaut)\n" + +#: createuser.c:445 #, c-format msgid " --replication role can initiate replication\n" msgstr "" " --replication le rôle peut initier une connexion de\n" " réplication\n" -#: createuser.c:368 +#: createuser.c:446 #, c-format -msgid " --no-replication role cannot initiate replication\n" +msgid " --no-replication role cannot initiate replication (default)\n" msgstr "" " --no-replication le rôle ne peut pas initier de connexion de\n" -" réplication\n" +" réplication (par défaut)\n" -#: createuser.c:373 +#: createuser.c:451 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" msgstr "" @@ -860,99 +965,54 @@ msgstr "" msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=UTILISATEUR nom d'utilisateur pour la connexion\n" -#: reindexdb.c:209 -#, c-format -msgid "cannot reindex all databases and a specific one at the same time" -msgstr "ne peut pas réindexer toutes les bases de données et une base spécifique en même temps" - -#: reindexdb.c:211 -#, c-format -msgid "cannot reindex all databases and system catalogs at the same time" -msgstr "ne peut pas réindexer toutes les bases de données et les catalogues système en même temps" - -#: reindexdb.c:213 -#, c-format -msgid "cannot reindex specific schema(s) in all databases" -msgstr "ne peut pas réindexer un (des) schéma(s) spécifique(s) dans toutes les bases de données" - -#: reindexdb.c:215 -#, c-format -msgid "cannot reindex specific table(s) in all databases" -msgstr "ne peut pas réindexer une (des) table(s) spécifique(s) dans toutes les bases de données" - -#: reindexdb.c:217 -#, c-format -msgid "cannot reindex specific index(es) in all databases" -msgstr "ne peut pas réindexer un (des) index spécifique(s) dans toutes les bases de données" - -#: reindexdb.c:227 -#, c-format -msgid "cannot reindex specific schema(s) and system catalogs at the same time" -msgstr "ne peut pas réindexer un (des) schéma(s) spécifique(s) et les catalogues système en même temps" - -#: reindexdb.c:229 -#, c-format -msgid "cannot reindex specific table(s) and system catalogs at the same time" -msgstr "ne peut pas réindexer une (des) table(s) spécifique(s) etles catalogues système en même temps" - -#: reindexdb.c:231 -#, c-format -msgid "cannot reindex specific index(es) and system catalogs at the same time" -msgstr "ne peut pas réindexer un (des) index spécifique(s) et les catalogues système en même temps" - -#: reindexdb.c:234 +#: reindexdb.c:210 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "ne peut pas utiliser plusieurs jobs pour réindexer les catalogues systèmes" -#: reindexdb.c:260 +#: reindexdb.c:215 #, c-format -msgid "cannot use multiple jobs to reindex indexes" -msgstr "ne peut pas utiliser plusieurs jobs pour réindexer les index" +msgid "cannot reindex all databases and a specific one at the same time" +msgstr "ne peut pas réindexer toutes les bases de données et une base spécifique en même temps" -#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439 -#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469 -#: vacuumdb.c:473 +#: reindexdb.c:296 reindexdb.c:303 vacuumdb.c:515 vacuumdb.c:522 vacuumdb.c:529 +#: vacuumdb.c:536 vacuumdb.c:543 vacuumdb.c:550 vacuumdb.c:557 vacuumdb.c:562 +#: vacuumdb.c:566 vacuumdb.c:570 vacuumdb.c:574 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "ne peut utiliser l'option « %s » sur des versions serveurs plus anciennes que PostgreSQL %s" -#: reindexdb.c:369 -#, c-format -msgid "cannot reindex system catalogs concurrently, skipping all" -msgstr "ne peut pas réindexer les catalogues système de manière concurrente, ignore tout" - -#: reindexdb.c:573 +#: reindexdb.c:584 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "la réindexation de la base de données « %s » a échoué : %s" -#: reindexdb.c:577 +#: reindexdb.c:588 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "la réindexation de l'index « %s » dans la base de données « %s » a échoué : %s" -#: reindexdb.c:581 +#: reindexdb.c:592 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "la réindexation du schéma « %s » dans la base de données « %s » a échoué : %s" -#: reindexdb.c:585 +#: reindexdb.c:596 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "la réindexation des catalogues systèmes dans la base de données « %s » a échoué : %s" -#: reindexdb.c:589 +#: reindexdb.c:600 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "la réindexation de la table « %s » dans la base de données « %s » a échoué : %s" -#: reindexdb.c:742 +#: reindexdb.c:824 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s : réindexation de la base de données « %s »\n" -#: reindexdb.c:759 +#: reindexdb.c:867 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -961,66 +1021,66 @@ msgstr "" "%s réindexe une base de données PostgreSQL.\n" "\n" -#: reindexdb.c:763 +#: reindexdb.c:871 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all réindexe toutes les bases de données\n" -#: reindexdb.c:764 +#: reindexdb.c:872 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " --concurrently réindexation en concurrence\n" -#: reindexdb.c:765 +#: reindexdb.c:873 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=BASE réindexe la base de données spécifiée\n" -#: reindexdb.c:767 +#: reindexdb.c:875 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=INDEX réindexe uniquement l'index spécifié\n" -#: reindexdb.c:768 +#: reindexdb.c:876 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" msgstr "" " -j, --jobs=NOMBRE utilise ce nombre de connexions concurrentes\n" " pour l'opération de réindexation\n" -#: reindexdb.c:769 +#: reindexdb.c:877 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet n'écrit aucun message\n" -#: reindexdb.c:770 +#: reindexdb.c:878 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system réindexe seulement les catalogues système\n" -#: reindexdb.c:771 +#: reindexdb.c:879 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=SCHÉMA réindexe uniquement le schéma spécifié\n" -#: reindexdb.c:772 +#: reindexdb.c:880 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABLE réindexe uniquement la table spécifiée\n" -#: reindexdb.c:773 +#: reindexdb.c:881 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr "" " --tablespace=TABLESPACE précise le tablespace où les index seront\n" " reconstruits\n" -#: reindexdb.c:774 +#: reindexdb.c:882 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose mode verbeux\n" -#: reindexdb.c:784 +#: reindexdb.c:892 #, c-format msgid "" "\n" @@ -1029,65 +1089,80 @@ msgstr "" "\n" "Lire la description de la commande SQL REINDEX pour plus d'informations.\n" -#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279 -#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294 +#: vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 vacuumdb.c:325 +#: vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:334 vacuumdb.c:343 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "ne peut pas utiliser l'option « %s » lors de l'exécution d'un ANALYZE seul" -#: vacuumdb.c:297 +#: vacuumdb.c:346 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "ne peut pas utiliser l'option « %s » lors de l'exécution d'un VACUUM FULL" -#: vacuumdb.c:303 +#: vacuumdb.c:352 vacuumdb.c:360 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "ne peut pas utiliser l'option « %s » lors de l'option « %s »" -#: vacuumdb.c:322 +#: vacuumdb.c:432 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "ne peut pas exécuter VACUUM sur toutes les bases de données et sur une base spécifique en même temps" -#: vacuumdb.c:324 +#: vacuumdb.c:436 +#, c-format +msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time" +msgstr "ne peut pas exécuter VACUUM sur toutes les tables des schémas et sur des tables spécifiques en même temps" + +#: vacuumdb.c:440 +#, c-format +msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time" +msgstr "ne peut pas exécuter VACUUM sur des tables spécifiques et exclure des schémas en même temps" + +#: vacuumdb.c:444 +#, c-format +msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time" +msgstr "ne peut pas exécuter VACUUM sur toutes les tables et exclure des schémas en même temps" + +#: vacuumdb.c:457 #, c-format -msgid "cannot vacuum specific table(s) in all databases" -msgstr "ne peut pas exécuter VACUUM sur une(des) table(s) spécifique(s) dans toutes les bases de données" +msgid "out of memory" +msgstr "mémoire épuisée" -#: vacuumdb.c:412 +#: vacuumdb.c:502 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Génération de statistiques minimales pour l'optimiseur (une cible)" -#: vacuumdb.c:413 +#: vacuumdb.c:503 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Génération de statistiques moyennes pour l'optimiseur (dix cibles)" -#: vacuumdb.c:414 +#: vacuumdb.c:504 msgid "Generating default (full) optimizer statistics" msgstr "Génération de statistiques complètes pour l'optimiseur" -#: vacuumdb.c:479 +#: vacuumdb.c:583 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s : traitement de la base de données « %s » %s\n" -#: vacuumdb.c:482 +#: vacuumdb.c:586 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s : exécution de VACUUM sur la base de données « %s »\n" -#: vacuumdb.c:952 +#: vacuumdb.c:1135 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "l'exécution de VACUUM sur la table « %s » dans la base de données « %s » a échoué : %s" -#: vacuumdb.c:955 +#: vacuumdb.c:1138 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "l'exécution de VACUUM sur la base de données « %s » a échoué : %s" -#: vacuumdb.c:963 +#: vacuumdb.c:1146 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1096,134 +1171,154 @@ msgstr "" "%s nettoie et analyse une base de données PostgreSQL.\n" "\n" -#: vacuumdb.c:967 +#: vacuumdb.c:1150 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all exécute VACUUM sur toutes les bases de données\n" -#: vacuumdb.c:968 +#: vacuumdb.c:1151 +#, c-format +msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n" +msgstr " --buffer-usage-limit=TAILLE taille du buffer spécialisé pour VACUUM\n" + +#: vacuumdb.c:1152 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=BASE exécute VACUUM sur cette base de données\n" -#: vacuumdb.c:969 +#: vacuumdb.c:1153 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping désactive le comportement page-skipping\n" -#: vacuumdb.c:970 +#: vacuumdb.c:1154 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo affiche les commandes envoyées au serveur\n" -#: vacuumdb.c:971 +#: vacuumdb.c:1155 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full exécute VACUUM en mode FULL\n" -#: vacuumdb.c:972 +#: vacuumdb.c:1156 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr "" " -F, --freeze gèle les informations de transactions des\n" " lignes\n" -#: vacuumdb.c:973 +#: vacuumdb.c:1157 #, c-format msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" msgstr "" " --force-index-cleanup supprime toujours les enregistrements dans\n" " l'index pointant vers des lignes mortes\n" -#: vacuumdb.c:974 +#: vacuumdb.c:1158 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr "" " -j, --jobs=NOMBRE utilise ce nombre de connexions concurrentes\n" " pour le VACUUM\n" -#: vacuumdb.c:975 +#: vacuumdb.c:1159 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr "" " --min-mxid-age=MXID_AGE âge minimum des identifiants de\n" " multitransactions pour les tables à nettoyer\n" -#: vacuumdb.c:976 +#: vacuumdb.c:1160 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr "" " --min-xid-age=XID_AGE âge minimum des identifiants de transactions\n" " pour les tables à nettoyer\n" -#: vacuumdb.c:977 +#: vacuumdb.c:1161 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" msgstr "" " --no-index-cleanup ne supprime pas les enregistrements dans\n" " l'index pointant vers des lignes mortes\n" -#: vacuumdb.c:978 +#: vacuumdb.c:1162 +#, c-format +msgid " --no-process-main skip the main relation\n" +msgstr " --no-process-main ignore la relation principale\n" + +#: vacuumdb.c:1163 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" msgstr "" " --no-process-toast ignore la table TOAST associée à la table à\n" " traiter\n" -#: vacuumdb.c:979 +#: vacuumdb.c:1164 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" msgstr "" " --no-truncate ne supprime pas les pages vides à la fin de\n" " la table\n" -#: vacuumdb.c:980 +#: vacuumdb.c:1165 +#, c-format +msgid " -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n" +msgstr " -n, --schema=MOTIF exécute VACUUM uniquement sur les tables des schémas indiqués\n" + +#: vacuumdb.c:1166 +#, c-format +msgid " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n" +msgstr " -N, --exclude-schema=MOTIF n'exécute pas VACUUM sur les tables des schémas indiqués\n" + +#: vacuumdb.c:1167 #, c-format msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr "" " -P, --parallel=NOMBRE utilise ce nombre de processus en tâche de\n" " fond pour le VACUUM, si possible\n" -#: vacuumdb.c:981 +#: vacuumdb.c:1168 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet n'écrit aucun message\n" -#: vacuumdb.c:982 +#: vacuumdb.c:1169 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr "" " --skip-locked ignore les relations qui ne peuvent pas être\n" " verrouillées immédiatement\n" -#: vacuumdb.c:983 +#: vacuumdb.c:1170 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr " -t, --table='TABLE[(COLONNES)]' exécute VACUUM sur cette table\n" -#: vacuumdb.c:984 +#: vacuumdb.c:1171 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose mode verbeux\n" -#: vacuumdb.c:985 +#: vacuumdb.c:1172 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version affiche la version puis quitte\n" -#: vacuumdb.c:986 +#: vacuumdb.c:1173 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze met à jour les statistiques de l'optimiseur\n" -#: vacuumdb.c:987 +#: vacuumdb.c:1174 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr "" " -Z, --analyze-only met seulement à jour les statistiques de\n" " l'optimiseur ; pas de VACUUM\n" -#: vacuumdb.c:988 +#: vacuumdb.c:1175 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1233,12 +1328,12 @@ msgstr "" " l'optimiseur, en plusieurs étapes pour de\n" " meilleurs résultats ; pas de VACUUM\n" -#: vacuumdb.c:990 +#: vacuumdb.c:1177 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help affiche cette aide puis quitte\n" -#: vacuumdb.c:998 +#: vacuumdb.c:1185 #, c-format msgid "" "\n" @@ -1246,191 +1341,3 @@ msgid "" msgstr "" "\n" "Lire la description de la commande SQL VACUUM pour plus d'informations.\n" - -#~ msgid "" -#~ "\n" -#~ "If one of -d, -D, -r, -R, -s, -S, and ROLENAME is not specified, you will\n" -#~ "be prompted interactively.\n" -#~ msgstr "" -#~ "\n" -#~ "Si une des options -d, -D, -r, -R, -s, -S et RÔLE n'est pas précisée,\n" -#~ "elle sera demandée interactivement.\n" - -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" - -#~ msgid " %s [OPTION]... LANGNAME [DBNAME]\n" -#~ msgstr " %s [OPTION]... NOMLANGAGE [BASE]\n" - -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide et quitte\n" - -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide et quitte\n" - -#~ msgid " --help show this help, then exit\n" -#~ msgstr " --help affiche cette aide et quitte\n" - -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version et quitte\n" - -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version et quitte\n" - -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version et quitte\n" - -#~ msgid " -E, --encrypted encrypt stored password\n" -#~ msgstr " -E, --encrypted chiffre le mot de passe stocké\n" - -#~ msgid " -N, --unencrypted do not encrypt stored password\n" -#~ msgstr " -N, --unencrypted ne chiffre pas le mot de passe stocké\n" - -#~ msgid " -d, --dbname=DBNAME database from which to remove the language\n" -#~ msgstr "" -#~ " -d, --dbname=BASE base de données à partir de laquelle\n" -#~ " supprimer le langage\n" - -#~ msgid " -d, --dbname=DBNAME database to install language in\n" -#~ msgstr " -d, --dbname=BASE base sur laquelle installer le langage\n" - -#~ msgid " -l, --list show a list of currently installed languages\n" -#~ msgstr "" -#~ " -l, --list affiche la liste des langages déjà\n" -#~ " installés\n" - -#~ msgid "" -#~ "%s installs a procedural language into a PostgreSQL database.\n" -#~ "\n" -#~ msgstr "" -#~ "%s installe un langage de procédures dans une base de données PostgreSQL.\n" -#~ "\n" - -#~ msgid "" -#~ "%s removes a procedural language from a database.\n" -#~ "\n" -#~ msgstr "" -#~ "%s supprime un langage procédural d'une base de données.\n" -#~ "\n" - -#~ msgid "%s: \"%s\" is not a valid encoding name\n" -#~ msgstr "%s : « %s » n'est pas un nom d'encodage valide\n" - -#~ msgid "%s: %s" -#~ msgstr "%s : %s" - -#~ msgid "%s: cannot use the \"freeze\" option when performing only analyze\n" -#~ msgstr "" -#~ "%s : ne peut utiliser l'option « freeze » lors de l'exécution d'un ANALYZE\n" -#~ "seul\n" - -#~ msgid "%s: could not get current user name: %s\n" -#~ msgstr "%s : n'a pas pu récupérer le nom de l'utilisateur actuel : %s\n" - -#~ msgid "%s: could not obtain information about current user: %s\n" -#~ msgstr "%s : n'a pas pu obtenir les informations concernant l'utilisateur actuel : %s\n" - -#~ msgid "%s: invalid socket: %s" -#~ msgstr "%s : socket invalide : %s" - -#~ msgid "%s: language \"%s\" is already installed in database \"%s\"\n" -#~ msgstr "%s : le langage « %s » est déjà installé sur la base de données « %s »\n" - -#~ msgid "%s: language \"%s\" is not installed in database \"%s\"\n" -#~ msgstr "%s : le langage « %s » n'est pas installé dans la base de données « %s »\n" - -#~ msgid "%s: language installation failed: %s" -#~ msgstr "%s : l'installation du langage a échoué : %s" - -#~ msgid "%s: language removal failed: %s" -#~ msgstr "%s : la suppression du langage a échoué : %s" - -#~ msgid "%s: missing required argument language name\n" -#~ msgstr "%s : argument nom du langage requis mais manquant\n" - -#~ msgid "%s: out of memory\n" -#~ msgstr "%s : mémoire épuisée\n" - -#~ msgid "%s: query failed: %s" -#~ msgstr "%s : échec de la requête : %s" - -#~ msgid "%s: query returned %d row instead of one: %s\n" -#~ msgid_plural "%s: query returned %d rows instead of one: %s\n" -#~ msgstr[0] "%s : la requête a renvoyé %d ligne au lieu d'une seule : %s\n" -#~ msgstr[1] "%s : la requête a renvoyé %d lignes au lieu d'une seule : %s\n" - -#~ msgid "%s: query was: %s\n" -#~ msgstr "%s : la requête était : %s\n" - -#~ msgid "%s: still %s functions declared in language \"%s\"; language not removed\n" -#~ msgstr "" -#~ "%s : il existe encore %s fonctions déclarées dans le langage « %s » ;\n" -#~ "langage non supprimé\n" - -#~ msgid "%s: too many command-line arguments (first is \"%s\")\n" -#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n" - -#~ msgid "%s: too many parallel jobs requested (maximum: %d)\n" -#~ msgstr "%s : trop de jobs en parallèle demandés (maximum %d)\n" - -#~ msgid "Could not send cancel request: %s" -#~ msgstr "N'a pas pu envoyer la requête d'annulation : %s" - -#~ msgid "Name" -#~ msgstr "Nom" - -#~ msgid "Procedural Languages" -#~ msgstr "Langages procéduraux" - -#~ msgid "Trusted?" -#~ msgstr "De confiance (trusted) ?" - -#, c-format -#~ msgid "Try \"%s --help\" for more information.\n" -#~ msgstr "Essayer « %s --help » pour plus d'informations.\n" - -#~ msgid "could not connect to database %s: %s" -#~ msgstr "n'a pas pu se connecter à la base de données %s : %s" - -#, c-format -#~ msgid "fatal: " -#~ msgstr "fatal : " - -#, c-format -#~ msgid "invalid value for --connection-limit: %s" -#~ msgstr "valeur invalide pour --connection-limit : %s" - -#, c-format -#~ msgid "minimum multixact ID age must be at least 1" -#~ msgstr "l'âge minimum de l'identifiant de multitransaction doit au moins être 1" - -#, c-format -#~ msgid "minimum transaction ID age must be at least 1" -#~ msgstr "l'identifiant de la transaction (-x) doit valoir au moins 1" - -#~ msgid "no" -#~ msgstr "non" - -#, c-format -#~ msgid "number of parallel jobs must be at least 1" -#~ msgstr "le nombre maximum de jobs en parallèle doit être au moins de 1" - -#~ msgid "parallel vacuum degree must be a non-negative integer" -#~ msgstr "le degré de parallélisation du VACUUM doit être un entier non négatif" - -#, c-format -#~ msgid "parallel workers for vacuum must be greater than or equal to zero" -#~ msgstr "le nombre de processus parallélisés pour l VACUUM doit être supérieur à zéro" - -#~ msgid "pg_strdup: cannot duplicate null pointer (internal error)\n" -#~ msgstr "pg_strdup : ne peut pas dupliquer un pointeur nul (erreur interne)\n" - -#~ msgid "reindexing of system catalogs failed: %s" -#~ msgstr "la réindexation des catalogues système a échoué : %s" - -#~ msgid "yes" -#~ msgstr "oui" diff --git a/src/bin/scripts/po/it.po b/src/bin/scripts/po/it.po index 50551cd364456..bf906add7ffb8 100644 --- a/src/bin/scripts/po/it.po +++ b/src/bin/scripts/po/it.po @@ -20,7 +20,7 @@ msgstr "" "Project-Id-Version: pgscripts (PostgreSQL) 11\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-09-26 08:19+0000\n" -"PO-Revision-Date: 2022-10-03 20:43+0200\n" +"PO-Revision-Date: 2023-09-05 08:41+0200\n" "Last-Translator: Daniele Varrazzo \n" "Language-Team: https://github.com/dvarrazzo/postgresql-it\n" "Language: it\n" @@ -420,7 +420,7 @@ msgstr " --lc-ctype=LOCALE impostazione LC_CTYPE per il database\n" #: createdb.c:290 #, c-format msgid " --icu-locale=LOCALE ICU locale setting for the database\n" -msgstr " --icu-locale=LOCALE Impostazione locale ICU per il database\n" +msgstr " --icu-locale=LOCALE impostazione locale ICU per il database\n" #: createdb.c:291 #, c-format @@ -939,47 +939,47 @@ msgstr " --concurrently reindecizza in contemporanea\n" #: reindexdb.c:765 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" -msgstr " -d, --dbname=database DBNAME da reindicizzare\n" +msgstr " -d, --dbname=DBNAME database da reindicizzare\n" #: reindexdb.c:767 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" -msgstr " -i, --index=INDEX ricrea solo indici specifici\n" +msgstr " -i, --index=INDEX ricrea solo indici specifici\n" #: reindexdb.c:768 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" -msgstr " -j, --jobs=NUM usa questo numero di connessioni simultanee per reindicizzare\n" +msgstr " -j, --jobs=NUM usa questo numero di connessioni simultanee per reindicizzare\n" #: reindexdb.c:769 #, c-format msgid " -q, --quiet don't write any messages\n" -msgstr " -q, --quiet non scrive alcun messaggio\n" +msgstr " -q, --quiet non scrive alcun messaggio\n" #: reindexdb.c:770 #, c-format msgid " -s, --system reindex system catalogs only\n" -msgstr " -s, --system reindex solo i cataloghi di sistema\n" +msgstr " -s, --system reindex solo i cataloghi di sistema\n" #: reindexdb.c:771 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" -msgstr " -S, --schema=SCHEMA reindicizza solo gli schemi specifici\n" +msgstr " -S, --schema=SCHEMA reindicizza solo gli schemi specifici\n" #: reindexdb.c:772 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" -msgstr " -t, --table=TABLE solo per tabelle specifiche per reindicizzare\n" +msgstr " -t, --table=TABLE solo per tabelle specifiche per reindicizzare\n" #: reindexdb.c:773 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" -msgstr " --tablespace=TABLESPACE tablespace in cui vengono ricostruiti gli indici\n" +msgstr " --tablespace=TABLESPACE tablespace in cui vengono ricostruiti gli indici\n" #: reindexdb.c:774 #, c-format msgid " -v, --verbose write a lot of output\n" -msgstr " -v, --verbose scrive molto output\n" +msgstr " -v, --verbose scrive molto output\n" #: reindexdb.c:784 #, c-format @@ -1060,7 +1060,7 @@ msgstr "" #: vacuumdb.c:967 #, c-format msgid " -a, --all vacuum all databases\n" -msgstr " -a, --all pulisci tutti i database\n" +msgstr " -a, --all pulisci tutti i database\n" #: vacuumdb.c:968 #, c-format @@ -1070,41 +1070,41 @@ msgstr " -d, --dbname=NOMEDB database da pulire\n" #: vacuumdb.c:969 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" -msgstr " --disable-page-skipping disabilita tutti i comportamenti di salto di pagina\n" +msgstr " --disable-page-skipping disabilita tutti i comportamenti di salto di pagina\n" #: vacuumdb.c:970 #, c-format msgid " -e, --echo show the commands being sent to the server\n" -msgstr " -e, --echo mostra i comandi inviati al server\n" +msgstr " -e, --echo mostra i comandi inviati al server\n" #: vacuumdb.c:971 #, c-format msgid " -f, --full do full vacuuming\n" -msgstr " -f, --full esegui una pulizia completa\n" +msgstr " -f, --full esegui una pulizia completa\n" #: vacuumdb.c:972 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr "" -" -F, --freeze congela le informazioni per la transazione\n" +" -F, --freeze congela le informazioni per la transazione\n" " sulla riga\n" #: vacuumdb.c:973 #, c-format msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" -msgstr " --force-index-cleanup rimuove sempre le voci di indice che puntano a tuple morte\n" +msgstr " --force-index-cleanup rimuove sempre le voci di indice che puntano a tuple morte\n" #: vacuumdb.c:974 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr "" -" -j, --jobs=NUM usa questo numero di connessioni concorrenti\n" +" -j, --jobs=NUM usa questo numero di connessioni concorrenti\n" " per effetturare il vacuum\n" #: vacuumdb.c:975 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" -msgstr " --min-mxid-age=MXID_AGE età minima dell'ID multixact delle tabelle da aspirare\n" +msgstr " --min-mxid-age=MXID_AGE età minima dell'ID multixact delle tabelle da aspirare\n" #: vacuumdb.c:976 #, c-format @@ -1114,17 +1114,17 @@ msgstr " --min-xid-age=XID_AGE minimo ID transazione età delle tabel #: vacuumdb.c:977 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" -msgstr " --no-index-cleanup non rimuove le voci di indice che puntano a tuple morte\n" +msgstr " --no-index-cleanup non rimuove le voci di indice che puntano a tuple morte\n" #: vacuumdb.c:978 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" -msgstr " --no-process-toast salta la tabella TOAST associata alla tabella da aspirare\n" +msgstr " --no-process-toast salta la tabella TOAST associata alla tabella da aspirare\n" #: vacuumdb.c:979 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" -msgstr " --no-truncate non tronca le pagine vuote alla fine della tabella\n" +msgstr " --no-truncate non tronca le pagine vuote alla fine della tabella\n" #: vacuumdb.c:980 #, c-format @@ -1139,7 +1139,7 @@ msgstr " -q, --quiet non stampare alcun messaggio\n" #: vacuumdb.c:982 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" -msgstr " --skip-locked salta le relazioni che non possono essere bloccate immediatamente\n" +msgstr " --skip-locked salta le relazioni che non possono essere bloccate immediatamente\n" #: vacuumdb.c:983 #, c-format @@ -1164,7 +1164,7 @@ msgstr " -z, --analyze aggiorna le statistiche per l'ottimizz #: vacuumdb.c:987 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" -msgstr " -Z, --analyze-only aggiorna solo le statistiche; niente vacuum\n" +msgstr " -Z, --analyze-only aggiorna solo le statistiche; niente vacuum\n" #: vacuumdb.c:988 #, c-format @@ -1172,13 +1172,13 @@ msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" " stages for faster results; no vacuum\n" msgstr "" -" --analyze-in-stages aggiorna solo le statistiche, in fasi multiple\n" +" --analyze-in-stages aggiorna solo le statistiche, in fasi multiple\n" " per maggiore velocità, niente vacuum\n" #: vacuumdb.c:990 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help mostra questo aiuto ed esci\n" +msgstr " -?, --help mostra questo aiuto ed esci\n" #: vacuumdb.c:998 #, c-format diff --git a/src/bin/scripts/po/ja.po b/src/bin/scripts/po/ja.po index e7547d4db01cb..f9b6d53773052 100644 --- a/src/bin/scripts/po/ja.po +++ b/src/bin/scripts/po/ja.po @@ -1,16 +1,16 @@ # pgscripts.po # Japanese message translation file for scripts # -# Copyright (C) 2011-2022 PostgreSQL Global Development Group +# Copyright (C) 2011-2024 PostgreSQL Global Development Group # # This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: scripts (PostgreSQL 16)\n" +"Project-Id-Version: scripts (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-25 11:29+0900\n" -"PO-Revision-Date: 2023-05-25 14:22+0900\n" +"POT-Creation-Date: 2024-06-14 11:24+0900\n" +"PO-Revision-Date: 2024-06-14 11:31+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" @@ -51,6 +51,48 @@ msgstr "メモリä¸è¶³ã§ã™\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "nullãƒã‚¤ãƒ³ã‚¿ã‚’複製ã§ãã¾ã›ã‚“(内部エラー)。\n" +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "ファイル\"%s\"ã«å¯¾ã—ã¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã‚’åŒæœŸã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ファイル\"%s\"ã®statã«å¤±æ•—ã—ã¾ã—ãŸ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ã“ã®ãƒ“ルドã§ã¯åŒæœŸæ–¹å¼\"%s\"をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ファイル\"%s\"ã‚’fsyncã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "ファイル\"%s\"ã®åå‰ã‚’\"%s\"ã«å¤‰æ›´ã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" + #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" @@ -65,11 +107,11 @@ msgstr "ユーザーãŒå­˜åœ¨ã—ã¾ã›ã‚“" msgid "user name lookup failure: error code %lu" msgstr "ユーザーåã®æ¤œç´¢ã«å¤±æ•—: エラーコード%lu" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "ã‚­ãƒ£ãƒ³ã‚»ãƒ«è¦æ±‚ã‚’é€ä¿¡ã—ã¾ã—ãŸ\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "ã‚­ãƒ£ãƒ³ã‚»ãƒ«è¦æ±‚ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: " @@ -97,12 +139,27 @@ msgstr "オプション %2$s ã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%1$s\"" msgid "%s must be in range %d..%d" msgstr "%sã¯%d..%dã®ç¯„囲ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: ../../fe_utils/parallel_slot.c:299 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "èªè­˜ã§ããªã„åŒæœŸæ–¹å¼: %s" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "ã“ã®ãƒ—ラットフォームã«å¯¾ã—ã¦ã‚¸ãƒ§ãƒ–æ•°ãŒå¤šã™ãŽã¾ã™: %d" + +#: ../../fe_utils/parallel_slot.c:326 #, c-format -msgid "too many jobs for this platform" -msgstr "ã“ã®ãƒ—ラットフォームã§ã¯ã‚¸ãƒ§ãƒ–æ•°ãŒå¤šã™ãŽã¾ã™" +msgid "socket file descriptor out of range for select(): %d" +msgstr "socket() ã®ã‚½ã‚±ãƒƒãƒˆãƒ•ァイル記述å­ãŒç¯„囲外ã§ã™: %d" -#: ../../fe_utils/parallel_slot.c:520 +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "ジョブ数を減らã—ã¦ã¿ã¦ãã ã•ã„。" + +#: ../../fe_utils/parallel_slot.c:553 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "データベース\"%s\"ã®å‡¦ç†ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" @@ -118,17 +175,22 @@ msgstr[0] "(%lu 行)" msgid "Interrupted\n" msgstr "中断ã•れã¾ã—ãŸ\n" -#: ../../fe_utils/print.c:3218 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "テーブルã®å†…容を表示ã§ãã¾ã›ã‚“: セル数%lldãŒä¸Šé™å€¤%lld以上ã§ã™ã€‚\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" -msgstr "テーブルã®å†…容ã«è¦‹å‡ºã—を追加ã§ãã¾ã›ã‚“ã§ã—ãŸï¼šåˆ—æ•°%dãŒåˆ¶é™ã‚’è¶Šãˆã¦ã„ã¾ã™ã€‚\n" +msgstr "テーブルã®å†…容ã«è¦‹å‡ºã—を追加ã§ãã¾ã›ã‚“ã§ã—ãŸï¼šåˆ—æ•°ã®ä¸Šé™å€¤%dã‚’è¶Šãˆã¦ã„ã¾ã™ã€‚\n" -#: ../../fe_utils/print.c:3258 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "テーブルã®å†…容ã«ã‚»ãƒ«ã‚’追加ã§ãã¾ã›ã‚“ã§ã—ãŸï¼šå…¨ã‚»ãƒ«æ•°%dãŒåˆ¶é™ã‚’è¶Šãˆã¦ã„ã¾ã™ã€‚\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "テーブルã®å†…容ã«ã‚»ãƒ«ã‚’追加ã§ãã¾ã›ã‚“: セルã®ç·æ•°%lldã‚’è¶…éŽã—ã¦ã„ã¾ã™ã€‚\n" -#: ../../fe_utils/print.c:3516 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "出力フォーマットãŒç„¡åй(内部エラー):%d" @@ -143,65 +205,70 @@ msgstr "å•ã„åˆã‚ã›ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" msgid "Query was: %s" msgstr "å•ã„åˆã‚ã›: %s" -#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "シェルコマンドã®å¼•æ•°ã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "データベースåã«æ”¹è¡Œ(LF)ã¾ãŸã¯å¾©å¸°(CR)ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: \"%s\"\n" + +#: clusterdb.c:114 clusterdb.c:133 createdb.c:149 createdb.c:168 #: createuser.c:195 createuser.c:210 dropdb.c:104 dropdb.c:113 dropdb.c:121 #: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 -#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:277 vacuumdb.c:297 +#: reindexdb.c:177 reindexdb.c:196 vacuumdb.c:280 vacuumdb.c:300 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。" -#: clusterdb.c:130 createdb.c:161 createuser.c:208 dropdb.c:119 dropuser.c:108 -#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:295 +#: clusterdb.c:131 createdb.c:166 createuser.c:208 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:194 vacuumdb.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数ãŒå¤šã™ãŽã¾ã™ã€‚(先頭ã¯\"%s\")" -#: clusterdb.c:148 +#: clusterdb.c:149 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "全データベースã¨ç‰¹å®šã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’åŒæ™‚ã«ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: clusterdb.c:151 -#, c-format -msgid "cannot cluster specific table(s) in all databases" -msgstr "ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ç‰¹å®šã®ãƒ†ãƒ¼ãƒ–ル(群)ã¯ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã§ãã¾ã›ã‚“" - -#: clusterdb.c:215 +#: clusterdb.c:214 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "データベース\"%2$s\"ã®ãƒ†ãƒ¼ãƒ–ル\"%1$s\"ã®ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ: %3$s" -#: clusterdb.c:218 +#: clusterdb.c:217 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "データベース\"%s\"ã®ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: clusterdb.c:246 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: データベース\"%s\"をクラスタ化ã—ã¦ã„ã¾ã™\n" -#: clusterdb.c:262 +#: clusterdb.c:274 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" "\n" msgstr "%sã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å†…ã§äº‹å‰ã«ã‚¯ãƒ©ã‚¹ã‚¿åŒ–ã•れã¦ã„ã‚‹ã™ã¹ã¦ã®ãƒ†ãƒ¼ãƒ–ルをクラスタ化ã—ã¾ã™ã€‚\n" -#: clusterdb.c:263 createdb.c:291 createuser.c:415 dropdb.c:172 dropuser.c:170 -#: pg_isready.c:226 reindexdb.c:748 vacuumdb.c:1127 +#: clusterdb.c:275 createdb.c:298 createuser.c:415 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:868 vacuumdb.c:1147 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: clusterdb.c:264 reindexdb.c:749 vacuumdb.c:1128 +#: clusterdb.c:276 reindexdb.c:869 vacuumdb.c:1148 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [オプション]... [データベースå]\n" -#: clusterdb.c:265 createdb.c:293 createuser.c:417 dropdb.c:174 dropuser.c:172 -#: pg_isready.c:229 reindexdb.c:750 vacuumdb.c:1129 +#: clusterdb.c:277 createdb.c:300 createuser.c:417 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:870 vacuumdb.c:1149 #, c-format msgid "" "\n" @@ -210,48 +277,48 @@ msgstr "" "\n" "オプション:\n" -#: clusterdb.c:266 +#: clusterdb.c:278 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all ã™ã¹ã¦ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’クラスタ化\n" -#: clusterdb.c:267 +#: clusterdb.c:279 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=DBNAME クラスタ化ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\n" -#: clusterdb.c:268 createuser.c:423 dropdb.c:175 dropuser.c:173 +#: clusterdb.c:280 createuser.c:423 dropdb.c:175 dropuser.c:173 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo サーãƒãƒ¼ã¸é€ä¿¡ã•れるコマンドを表示\n" -#: clusterdb.c:269 +#: clusterdb.c:281 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet メッセージを何も出力ã—ãªã„\n" -#: clusterdb.c:270 +#: clusterdb.c:282 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=ãƒ†ãƒ¼ãƒ–ãƒ«å æŒ‡å®šã—ãŸãƒ†ãƒ¼ãƒ–ル(群)ã®ã¿ã‚’クラスタ化\n" -#: clusterdb.c:271 +#: clusterdb.c:283 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose 多é‡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’出力\n" -#: clusterdb.c:272 createuser.c:439 dropdb.c:178 dropuser.c:176 +#: clusterdb.c:284 createuser.c:439 dropdb.c:178 dropuser.c:176 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: clusterdb.c:273 createuser.c:447 dropdb.c:180 dropuser.c:178 +#: clusterdb.c:285 createuser.c:447 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: clusterdb.c:274 createdb.c:309 createuser.c:448 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:235 reindexdb.c:765 vacuumdb.c:1158 +#: clusterdb.c:286 createdb.c:317 createuser.c:448 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:885 vacuumdb.c:1178 #, c-format msgid "" "\n" @@ -260,39 +327,39 @@ msgstr "" "\n" "接続オプション:\n" -#: clusterdb.c:275 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1159 +#: clusterdb.c:287 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1179 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HOSTNAME データベースサーãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚½ã‚±ãƒƒãƒˆ\n" " ディレクトリ\n" -#: clusterdb.c:276 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1160 +#: clusterdb.c:288 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1180 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆç•ªå·\n" -#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:1161 +#: clusterdb.c:289 dropdb.c:184 vacuumdb.c:1181 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã§æŽ¥ç¶š\n" -#: clusterdb.c:278 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1162 +#: clusterdb.c:290 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1182 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰å…¥åŠ›ã‚’è¦æ±‚ã—ãªã„\n" -#: clusterdb.c:279 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1163 +#: clusterdb.c:291 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1183 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password パスワードプロンプトを強制表示\n" -#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:1164 +#: clusterdb.c:292 dropdb.c:187 vacuumdb.c:1184 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME 別ã®ä¿å®ˆç”¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’指定\n" -#: clusterdb.c:281 +#: clusterdb.c:293 #, c-format msgid "" "\n" @@ -301,8 +368,8 @@ msgstr "" "\n" "詳細㯠SQL コマンド㮠CLUSTER ã®èª¬æ˜Žã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n" -#: clusterdb.c:282 createdb.c:317 createuser.c:454 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:773 vacuumdb.c:1166 +#: clusterdb.c:294 createdb.c:325 createuser.c:454 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:893 vacuumdb.c:1186 #, c-format msgid "" "\n" @@ -311,8 +378,8 @@ msgstr "" "\n" "ãƒã‚°ã¯<%s>ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" -#: clusterdb.c:283 createdb.c:318 createuser.c:455 dropdb.c:189 dropuser.c:186 -#: pg_isready.c:241 reindexdb.c:774 vacuumdb.c:1167 +#: clusterdb.c:295 createdb.c:326 createuser.c:455 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:894 vacuumdb.c:1187 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" @@ -345,22 +412,22 @@ msgstr "%s (%s/%s)" msgid "Please answer \"%s\" or \"%s\".\n" msgstr " \"%s\" ã¾ãŸã¯ \"%s\" ã«ç­”ãˆã¦ãã ã•ã„\n" -#: createdb.c:178 +#: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" ã¯æœ‰åйãªç¬¦å·åŒ–æ–¹å¼åã§ã¯ã‚りã¾ã›ã‚“" -#: createdb.c:253 +#: createdb.c:260 #, c-format msgid "database creation failed: %s" msgstr "データベースã®ç”Ÿæˆã«å¤±æ•—ã—ã¾ã—ãŸï¼š%s" -#: createdb.c:272 +#: createdb.c:279 #, c-format msgid "comment creation failed (database was created): %s" msgstr "コメントã®ç”Ÿæˆã«å¤±æ•—(データベースã¯ç”Ÿæˆã•れã¾ã—ãŸ): %s" -#: createdb.c:290 +#: createdb.c:297 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -369,119 +436,124 @@ msgstr "" "%sã¯PostgreSQLデータベースを生æˆã—ã¾ã™ã€‚\n" "\n" -#: createdb.c:292 +#: createdb.c:299 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [オプション]... [データベースå] [説明]\n" -#: createdb.c:294 +#: createdb.c:301 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TABLESPACE データベースã®ãƒ‡ãƒ•ォルトテーブルスペースå\n" -#: createdb.c:295 reindexdb.c:754 +#: createdb.c:302 reindexdb.c:874 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo サーãƒãƒ¼ã¸é€ä¿¡ã•れるコマンドを表示\n" -#: createdb.c:296 +#: createdb.c:303 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=ENCODING データベースã®ç¬¦å·åŒ–æ–¹å¼\n" -#: createdb.c:297 +#: createdb.c:304 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOCALE データベースã®ãƒ­ã‚±ãƒ¼ãƒ«è¨­å®š\n" -#: createdb.c:298 +#: createdb.c:305 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE データベースã®LC_COLLATE設定\n" -#: createdb.c:299 +#: createdb.c:306 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOCALE データベースã®LC_CTYPE設定\n" -#: createdb.c:300 +#: createdb.c:307 +#, c-format +msgid " --builtin-locale=LOCALE builtin locale setting for the database\n" +msgstr " --builtin-locale=LOCALE データベースã®çµ„ã¿è¾¼ã¿ãƒ­ã‚±ãƒ¼ãƒ«ã‚’指定\n" + +#: createdb.c:308 #, c-format msgid " --icu-locale=LOCALE ICU locale setting for the database\n" -msgstr " --icu-locale=LOCALE データベースã®ICUロケール設定\n" +msgstr " --icu-locale=LOCALE データベースã®ICUロケールを指定\n" -#: createdb.c:301 +#: createdb.c:309 #, c-format msgid " --icu-rules=RULES ICU rules setting for the database\n" msgstr " --icu-rules=RULES データベースã®ICUルール(群)を設定\n" -#: createdb.c:302 +#: createdb.c:310 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " locale provider for the database's default collation\n" msgstr "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " データベースã®ãƒ‡ãƒ•ォルト照åˆé †åºã®ãƒ­ã‚±ãƒ¼ãƒ«\n" " プロãƒã‚¤ãƒ€\n" -#: createdb.c:304 +#: createdb.c:312 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=OWNER æ–°ã—ã„データベースを所有ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ãƒ¦ãƒ¼ã‚¶ãƒ¼\n" -#: createdb.c:305 +#: createdb.c:313 #, c-format msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" msgstr " -S, --strategy=STRATEGY ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ç”Ÿæˆæ–¹æ³• wal_log ã¾ãŸã¯ file_copy\n" -#: createdb.c:306 +#: createdb.c:314 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=TEMPLATE コピーã™ã‚‹ãƒ†ãƒ³ãƒ—レートデータベース\n" -#: createdb.c:307 reindexdb.c:763 +#: createdb.c:315 reindexdb.c:883 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: createdb.c:308 reindexdb.c:764 +#: createdb.c:316 reindexdb.c:884 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: createdb.c:310 reindexdb.c:766 +#: createdb.c:318 reindexdb.c:886 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HOSTNAME データベースサーãƒãƒ¼ãƒ›ã‚¹ãƒˆã¾ãŸã¯ã‚½ã‚±ãƒƒãƒˆ\n" " ディレクトリ\n" -#: createdb.c:311 reindexdb.c:767 +#: createdb.c:319 reindexdb.c:887 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT データベースサーãƒãƒ¼ã®ãƒãƒ¼ãƒˆç•ªå·\n" -#: createdb.c:312 reindexdb.c:768 +#: createdb.c:320 reindexdb.c:888 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME 接続ã™ã‚‹éš›ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼å\n" -#: createdb.c:313 reindexdb.c:769 +#: createdb.c:321 reindexdb.c:889 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰å…¥åŠ›ã‚’è¦æ±‚ã—ãªã„\n" -#: createdb.c:314 reindexdb.c:770 +#: createdb.c:322 reindexdb.c:890 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password パスワードプロンプトを強制\n" -#: createdb.c:315 reindexdb.c:771 +#: createdb.c:323 reindexdb.c:891 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME 別ã®ä¿å®ˆç”¨ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’指定\n" -#: createdb.c:316 +#: createdb.c:324 #, c-format msgid "" "\n" @@ -857,94 +929,54 @@ msgstr " -t, --timeout=SECS 接続試行時ã®å¾…機秒数ã€ã‚¼ãƒ­ã§ç„¡ msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼åã§æŽ¥ç¶šã™ã‚‹\n" -#: reindexdb.c:209 -#, c-format -msgid "cannot reindex all databases and a specific one at the same time" -msgstr "全データベースã¨ç‰¹å®šã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯åŒæ™‚ã«å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“" - -#: reindexdb.c:211 -#, c-format -msgid "cannot reindex all databases and system catalogs at the same time" -msgstr "全データベースã¨ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ã®ä¸¡æ–¹ã¯åŒæ™‚ã«å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“" - -#: reindexdb.c:213 -#, c-format -msgid "cannot reindex specific schema(s) in all databases" -msgstr "全データベースã«ãŠã‘る特定ã®ã‚¹ã‚­ãƒ¼ãƒž(群)ã®å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“" - -#: reindexdb.c:215 -#, c-format -msgid "cannot reindex specific table(s) in all databases" -msgstr "全データベースã«ãŠã‘る特定ã®ãƒ†ãƒ¼ãƒ–ル(群)ã®å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“" - -#: reindexdb.c:217 -#, c-format -msgid "cannot reindex specific index(es) in all databases" -msgstr "全データベースã«ãŠã‘る特定ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹(群)ã®å†ä½œæˆã¯ã§ãã¾ã›ã‚“" - -#: reindexdb.c:227 -#, c-format -msgid "cannot reindex specific schema(s) and system catalogs at the same time" -msgstr "特定ã®ã‚¹ã‚­ãƒ¼ãƒž(群)ã¨ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ã¯åŒæ™‚ã«å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“" - -#: reindexdb.c:229 -#, c-format -msgid "cannot reindex specific table(s) and system catalogs at the same time" -msgstr "特定ã®ãƒ†ãƒ¼ãƒ–ル(群)ã¨ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ã¯åŒæ™‚ã«å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“" - -#: reindexdb.c:231 -#, c-format -msgid "cannot reindex specific index(es) and system catalogs at the same time" -msgstr "特定ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã¨ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ã¯åŒæ™‚ã«å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“" - -#: reindexdb.c:234 +#: reindexdb.c:210 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "システムカタログã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã§ã¯è¤‡æ•°ã‚¸ãƒ§ãƒ–を使用ã§ãã¾ã›ã‚“" -#: reindexdb.c:260 +#: reindexdb.c:215 #, c-format -msgid "cannot use multiple jobs to reindex indexes" -msgstr "ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã«ã¯è¤‡æ•°ã‚¸ãƒ§ãƒ–を使用ã§ãã¾ã›ã‚“" +msgid "cannot reindex all databases and a specific one at the same time" +msgstr "全データベースã¨ç‰¹å®šã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã¯åŒæ™‚ã«å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã¯ã§ãã¾ã›ã‚“" -#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:509 vacuumdb.c:516 vacuumdb.c:523 -#: vacuumdb.c:530 vacuumdb.c:537 vacuumdb.c:544 vacuumdb.c:551 vacuumdb.c:556 -#: vacuumdb.c:560 vacuumdb.c:564 vacuumdb.c:568 +#: reindexdb.c:296 reindexdb.c:303 vacuumdb.c:515 vacuumdb.c:522 vacuumdb.c:529 +#: vacuumdb.c:536 vacuumdb.c:543 vacuumdb.c:550 vacuumdb.c:557 vacuumdb.c:562 +#: vacuumdb.c:566 vacuumdb.c:570 vacuumdb.c:574 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "PostgreSQL %2$sよりもå¤ã„サーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯\"%1$s\"オプションã¯ä½¿ãˆã¾ã›ã‚“" -#: reindexdb.c:561 +#: reindexdb.c:584 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "データベース\"%s\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: reindexdb.c:565 +#: reindexdb.c:588 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "データベース\"%2$s\"中ã«ã‚るインデックス\"%1$s\"ã®å†ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ: %3$s" -#: reindexdb.c:569 +#: reindexdb.c:592 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "データベース\"%2$s\"中ã«ã‚るスキーマ\"%1$s\"ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã«å¤±æ•—ã—ã¾ã—ãŸ: %3$s" -#: reindexdb.c:573 +#: reindexdb.c:596 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "データベース\"%s\"中ã®ã‚·ã‚¹ãƒ†ãƒ ã‚«ã‚¿ãƒ­ã‚°ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: reindexdb.c:577 +#: reindexdb.c:600 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "データベース\"%2$s\"中ã«ã‚るテーブル\"%1$s\"ã®ã‚¤ãƒ³ã§ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã«å¤±æ•—ã—ã¾ã—ãŸ: %3$s" -#: reindexdb.c:730 +#: reindexdb.c:824 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: データベース\"%s\"ã‚’å†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã—ã¦ã„ã¾ã™\n" -#: reindexdb.c:747 +#: reindexdb.c:867 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -953,62 +985,62 @@ msgstr "" "%sã¯PostgreSQLデータベースをå†ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹åŒ–ã—ã¾ã™ã€‚\n" "\n" -#: reindexdb.c:751 +#: reindexdb.c:871 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all 全データベースã§ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã‚’行ã†\n" -#: reindexdb.c:752 +#: reindexdb.c:872 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " --concurrently ä¸¦è¡Œã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰\n" -#: reindexdb.c:753 +#: reindexdb.c:873 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=DBNAME ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰å¯¾è±¡ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹\n" -#: reindexdb.c:755 +#: reindexdb.c:875 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=INDEX 指定ã—ãŸã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹(群)ã®ã¿ã‚’冿§‹ç¯‰\n" -#: reindexdb.c:756 +#: reindexdb.c:876 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" msgstr " -j, --jobs=NUM ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰ã«ã“ã®æ•°ã®ä¸¦åˆ—接続を使用\n" -#: reindexdb.c:757 +#: reindexdb.c:877 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet メッセージを一切出力ã—ãªã„\n" -#: reindexdb.c:758 +#: reindexdb.c:878 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system システムカタログã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ã¿ã‚’冿§‹ç¯‰\n" -#: reindexdb.c:759 +#: reindexdb.c:879 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=SCHEMA 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒž(群)ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã®ã¿ã‚’冿§‹ç¯‰\n" -#: reindexdb.c:760 +#: reindexdb.c:880 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABLE 指定ã—ãŸãƒ†ãƒ¼ãƒ–ル(群)ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’冿§‹ç¯‰\n" -#: reindexdb.c:761 +#: reindexdb.c:881 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " -D, --tablespace=TABLESPACE ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹å†æ§‹ç¯‰å…ˆã®ãƒ†ãƒ¼ãƒ–ル空間\n" -#: reindexdb.c:762 +#: reindexdb.c:882 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose 多é‡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’出力\n" -#: reindexdb.c:772 +#: reindexdb.c:892 #, c-format msgid "" "\n" @@ -1017,234 +1049,224 @@ msgstr "" "\n" "詳細ã¯SQLコマンドREINDEXã«é–¢ã™ã‚‹èª¬æ˜Žã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n" -#: vacuumdb.c:310 vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 -#: vacuumdb.c:325 vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:340 +#: vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 vacuumdb.c:325 +#: vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:334 vacuumdb.c:343 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "analyzeã®ã¿ã‚’実行ã™ã‚‹å ´åˆ\"%s\"ã¯ä½¿ãˆã¾ã›ã‚“" -#: vacuumdb.c:343 +#: vacuumdb.c:346 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "完全(full)VACUUMを実行ã™ã‚‹å ´åˆã¯\"%s\"オプションã¯ä½¿ãˆã¾ã›ã‚“" -#: vacuumdb.c:349 vacuumdb.c:357 +#: vacuumdb.c:352 vacuumdb.c:360 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "\"%s\"オプションã¯\"%s\"ã¨åŒæ™‚ã«ã¯ä½¿ãˆã¾ã›ã‚“" -#: vacuumdb.c:428 +#: vacuumdb.c:432 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "全データベースã¨ç‰¹å®šã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’åŒæ™‚ã«VACUUMã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: vacuumdb.c:432 -#, c-format -msgid "cannot vacuum specific table(s) in all databases" -msgstr "全データベースã®ç‰¹å®šã®ãƒ†ãƒ¼ãƒ–ル(群)ã‚’VACUUMã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" - #: vacuumdb.c:436 #, c-format -msgid "cannot vacuum specific schema(s) in all databases" -msgstr "全データベースã®ç‰¹å®šã®ã‚¹ã‚­ãƒ¼ãƒž(群)ã‚’VACUUMã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" - -#: vacuumdb.c:440 -#, c-format -msgid "cannot exclude specific schema(s) in all databases" -msgstr "全データベースã®ç‰¹å®šã®ã‚¹ã‚­ãƒ¼ãƒž(群)を除外ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" - -#: vacuumdb.c:444 -#, c-format msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time" msgstr "スキーマ(郡)ã«å±žã™ã‚‹ã™ã¹ã¦ã®ãƒ†ãƒ¼ãƒ–ルã¨ã€ç‰¹å®šã®ãƒ†ãƒ¼ãƒ–ル(郡)ã¨ã‚’åŒæ™‚ã«VACUUMã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: vacuumdb.c:448 +#: vacuumdb.c:440 #, c-format msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time" msgstr "特定ã®ãƒ†ãƒ¼ãƒ–ル(郡)ã®VACUUMã¨åŒæ™‚ã«ã‚¹ã‚­ãƒ¼ãƒž(郡)ã®é™¤å¤–を行ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: vacuumdb.c:452 +#: vacuumdb.c:444 #, c-format msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time" msgstr "スキーマ(郡)ã®ã™ã¹ã¦ã®ãƒ†ãƒ¼ãƒ–ルã®VACUUMã¨åŒæ™‚ã«ã‚¹ã‚­ãƒ¼ãƒž(郡)ã®é™¤å¤–を行ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: vacuumdb.c:496 +#: vacuumdb.c:457 +#, c-format +msgid "out of memory" +msgstr "メモリä¸è¶³ã§ã™" + +#: vacuumdb.c:502 msgid "Generating minimal optimizer statistics (1 target)" msgstr "最é©åŒ–ã®ãŸã‚ã®æƒ…報を最å°é™ç”Ÿæˆã—ã¾ã™(1対象)" -#: vacuumdb.c:497 +#: vacuumdb.c:503 msgid "Generating medium optimizer statistics (10 targets)" msgstr "最é©åŒ–ã®ãŸã‚ã®æƒ…報を複数生æˆã—ã¾ã™(10対象)" -#: vacuumdb.c:498 +#: vacuumdb.c:504 msgid "Generating default (full) optimizer statistics" msgstr "最é©åŒ–ã®ãŸã‚ã®æƒ…報をデフォルト数(å…¨ã¦)生æˆã—ã¾ã™" -#: vacuumdb.c:577 +#: vacuumdb.c:583 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: データベース\"%s\"ã®å‡¦ç†ä¸­ã§ã™: %s\n" -#: vacuumdb.c:580 +#: vacuumdb.c:586 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: データベース\"%s\"ã‚’VACUUMã—ã¦ã„ã¾ã™\n" -#: vacuumdb.c:1115 +#: vacuumdb.c:1135 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "データベース \"%2$s\"ã®ãƒ†ãƒ¼ãƒ–ル\"%1$sã®VACUUMã«å¤±æ•—ã—ã¾ã—ãŸï¼š %3$s" -#: vacuumdb.c:1118 +#: vacuumdb.c:1138 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "データベース\"%s\"ã®VACUUMã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: vacuumdb.c:1126 +#: vacuumdb.c:1146 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" "\n" msgstr "%sã¯PostgreSQLデータベースã®ã‚´ãƒŸå›žåŽãŠã‚ˆã³åˆ†æžã‚’行ã„ã¾ã™ã€‚\n" -#: vacuumdb.c:1130 +#: vacuumdb.c:1150 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all 全データベースをVACUUM\n" -#: vacuumdb.c:1131 +#: vacuumdb.c:1151 #, c-format msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n" msgstr " --buffer-usage-limit=SIZE VACUUMã§ä½¿ç”¨ã™ã‚‹ãƒªãƒ³ã‚°ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º\n" -#: vacuumdb.c:1132 +#: vacuumdb.c:1152 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=DBNAME VACUUMã™ã‚‹ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹å\n" -#: vacuumdb.c:1133 +#: vacuumdb.c:1153 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping ã™ã¹ã¦ã®ãƒšãƒ¼ã‚¸ã‚¹ã‚­ãƒƒãƒ—å‹•ä½œã‚’ç¦æ­¢\n" -#: vacuumdb.c:1134 +#: vacuumdb.c:1154 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo サーãƒãƒ¼ã¸é€ä¿¡ã•れるコマンドを表示\n" -#: vacuumdb.c:1135 +#: vacuumdb.c:1155 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full VACUUM FULLを実行\n" -#: vacuumdb.c:1136 +#: vacuumdb.c:1156 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze 行トランザクション情報をå‡çµ\n" -#: vacuumdb.c:1137 +#: vacuumdb.c:1157 #, c-format msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" msgstr "" " --force-index-cleanup デッドタプルを指ã™ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚¨ãƒ³ãƒˆãƒªã‚’常ã«\n" " 除去ã™ã‚‹\n" -#: vacuumdb.c:1138 +#: vacuumdb.c:1158 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=NUM ãƒã‚­ãƒ¥ãƒ¼ãƒ æ™‚ã«æŒ‡å®šã—ãŸåŒæ™‚接続数を使用\n" -#: vacuumdb.c:1139 +#: vacuumdb.c:1159 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr "" " --min-mxid-age=MXID_AGE VACUUM対象ã¨ã™ã‚‹ãƒ†ãƒ¼ãƒ–ãƒ«ã®æœ€å°ã®ãƒžãƒ«ãƒ\n" " トランザクションID差分\n" -#: vacuumdb.c:1140 +#: vacuumdb.c:1160 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr "" " --min-xid-age=XID_AGE VACUUM対象ã¨ã™ã‚‹ãƒ†ãƒ¼ãƒ–ãƒ«ã®æœ€å°ã®\n" " トランザクションID差分\n" -#: vacuumdb.c:1141 +#: vacuumdb.c:1161 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" msgstr "" " --no-index-cleanup デッドタプルを指ã™ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚¨ãƒ³ãƒˆãƒªã‚’\n" " 削除ã—ãªã„\n" -#: vacuumdb.c:1142 +#: vacuumdb.c:1162 #, c-format msgid " --no-process-main skip the main relation\n" msgstr " --no-process-main メインリレーションをスキップ\n" -#: vacuumdb.c:1143 +#: vacuumdb.c:1163 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" msgstr "" " --no-process-toast テーブルã«é–¢é€£ã¥ãTOASTテーブルã®VACUUMã‚’\n" " スキップ\n" -#: vacuumdb.c:1144 +#: vacuumdb.c:1164 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" msgstr " --no-truncate テーブル終端ã®ç©ºãƒšãƒ¼ã‚¸ã®åˆ‡ã‚Šè©°ã‚を行ã‚ãªã„\n" -#: vacuumdb.c:1145 +#: vacuumdb.c:1165 #, c-format -msgid " -n, --schema=PATTERN vacuum tables in the specified schema(s) only\n" -msgstr " -n, --schema=SCHEMA 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒž(郡)ã®ãƒ†ãƒ¼ãƒ–ルã®ã¿ã‚’VACUUMã™ã‚‹\n" +msgid " -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n" +msgstr " - -n, --schema=SCHEMA 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒž(郡)ã®ãƒ†ãƒ¼ãƒ–ルã®ã¿ã‚’VACUUMã™ã‚‹\n" -#: vacuumdb.c:1146 +#: vacuumdb.c:1166 #, c-format -msgid " -N, --exclude-schema=PATTERN do not vacuum tables in the specified schema(s)\n" +msgid " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n" msgstr " -N, --exclude-schema=SCHEMA 指定ã—ãŸã‚¹ã‚­ãƒ¼ãƒž(郡)ã®ãƒ†ãƒ¼ãƒ–ルをVACUUMã—ãªã„\n" -#: vacuumdb.c:1147 +#: vacuumdb.c:1167 #, c-format msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr "" " -P, --parallel=PARALLEL_WORKERS å¯èƒ½ã§ã‚れã°VACUUMã§æŒ‡å®šã®æ•°ã®ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰\n" " ワーカーを使用\n" -#: vacuumdb.c:1148 +#: vacuumdb.c:1168 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet メッセージを出力ã—ãªã„\n" -#: vacuumdb.c:1149 +#: vacuumdb.c:1169 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked ç›´ã¡ã«ãƒ­ãƒƒã‚¯ã§ããªã‹ã£ãŸãƒªãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’スキップ\n" -#: vacuumdb.c:1150 +#: vacuumdb.c:1170 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr " -t, --table='TABLE[(COLUMNS)]' 指定ã—ãŸãƒ†ãƒ¼ãƒ–ル(複数å¯)ã®ã¿ã‚’VACUUM\n" -#: vacuumdb.c:1151 +#: vacuumdb.c:1171 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose 多é‡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’出力\n" -#: vacuumdb.c:1152 +#: vacuumdb.c:1172 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了\n" -#: vacuumdb.c:1153 +#: vacuumdb.c:1173 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze 最é©åŒ–用統計情報を更新\n" -#: vacuumdb.c:1154 +#: vacuumdb.c:1174 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr " -Z, --analyze-only 最é©åŒ–用統計情報ã®ã¿æ›´æ–°; ãƒã‚­ãƒ¥ãƒ¼ãƒ ã¯è¡Œã‚ãªã„\n" -#: vacuumdb.c:1155 +#: vacuumdb.c:1175 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1253,12 +1275,12 @@ msgstr "" " --analyze-in-stages 高速化ã®ãŸã‚最é©åŒ–用統計情報ã®ã¿ã‚’複数段階ã§\n" " æ›´æ–°; VACUUMã¯è¡Œã‚ãªã„\n" -#: vacuumdb.c:1157 +#: vacuumdb.c:1177 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ã“ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¦çµ‚了\n" -#: vacuumdb.c:1165 +#: vacuumdb.c:1185 #, c-format msgid "" "\n" diff --git a/src/bin/scripts/po/ka.po b/src/bin/scripts/po/ka.po index 20301ff759b53..e3e01f6a9ceb2 100644 --- a/src/bin/scripts/po/ka.po +++ b/src/bin/scripts/po/ka.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: pgscripts (PostgreSQL) 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-19 11:20+0000\n" -"PO-Revision-Date: 2023-04-20 08:20+0200\n" +"POT-Creation-Date: 2024-06-14 02:21+0000\n" +"PO-Revision-Date: 2024-08-08 15:28+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.3.2\n" #: ../../../src/common/logging.c:276 #, c-format @@ -49,6 +49,48 @@ msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლის დუბლირებრშეუძლებელირ(შიდრშეცდáƒáƒ›áƒ)\n" +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "შეუძლებელირფáƒáƒ˜áƒšáƒ£áƒ áƒ˜ სისტემის სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ ფáƒáƒ˜áƒšáƒ˜áƒ¡áƒ—ვის \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "áƒáƒ› áƒáƒ’ებáƒáƒ¡ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის \"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის (%s) წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "ფáƒáƒ˜áƒšáƒ˜áƒ¡ (%s) fsync-ის შეცდáƒáƒ›áƒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "გáƒáƒ“áƒáƒ áƒ¥áƒ›áƒ”ვის შეცდáƒáƒ›áƒ %s - %s: %m" + #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" @@ -63,11 +105,11 @@ msgstr "მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" msgid "user name lookup failure: error code %lu" msgstr "მáƒáƒ›áƒ®áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•ნრგáƒáƒ’ზáƒáƒ•ნილიáƒ\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ’ზáƒáƒ•ნრშეუძლებელიáƒ: " @@ -95,12 +137,27 @@ msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘რ\"%s\" პრmsgid "%s must be in range %d..%d" msgstr "%s áƒáƒ áƒáƒ სáƒáƒ–ღვრებში %d-დáƒáƒœ %d-მდე" -#: ../../fe_utils/parallel_slot.c:299 +#: ../../fe_utils/option_utils.c:106 #, c-format -msgid "too many jobs for this platform" -msgstr "მეტისმეტáƒáƒ“ ბევრი დáƒáƒ•áƒáƒšáƒ”ბრáƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒ˜áƒ¡áƒ—ვის" +msgid "unrecognized sync method: %s" +msgstr "უცნáƒáƒ‘ი სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი: %s" -#: ../../fe_utils/parallel_slot.c:520 +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "მეტისმეტáƒáƒ“ ბევრი დáƒáƒ•áƒáƒšáƒ”ბრáƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒ˜áƒ¡áƒ—ვის: %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "სáƒáƒ™áƒ”ტის ფáƒáƒ˜áƒšáƒ˜áƒ¡ დესკრიპტáƒáƒ áƒ˜ დáƒáƒ¡áƒáƒ¨áƒ•ებ შუáƒáƒšáƒ”დს გáƒáƒ áƒ”თáƒáƒ ფუნქციისთვის select(): %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "სცáƒáƒ“ეთ ნáƒáƒ™áƒšáƒ”ბი დáƒáƒ•áƒáƒšáƒ”ბáƒ." + +#: ../../fe_utils/parallel_slot.c:553 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "ბáƒáƒ–ის (%s) დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების შეცდáƒáƒ›áƒ:%s" @@ -112,22 +169,27 @@ msgid_plural "(%lu rows)" msgstr[0] "(%lu მწკრივი)" msgstr[1] "(%lu მწკრივი)" -#: ../../fe_utils/print.c:3153 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "შეწყვეტილიáƒ\n" -#: ../../fe_utils/print.c:3217 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "ვერ გáƒáƒ›áƒáƒ•იტáƒáƒœáƒ” ცხრილის შემცველáƒáƒ‘áƒ: უჯრედების რáƒáƒáƒ“ენáƒáƒ‘რ%lld მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ˜áƒ¡ %lld ტáƒáƒšáƒ˜ áƒáƒœ მáƒáƒ¡áƒ–ე მეტიáƒ.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "ცხრილის შემცველáƒáƒ‘áƒáƒ–ე თáƒáƒ•სáƒáƒ áƒ—ის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ: სვეტების რáƒáƒáƒ“ენáƒáƒ‘რ%d გáƒáƒ“áƒáƒ­áƒáƒ áƒ‘ებულიáƒ.\n" -#: ../../fe_utils/print.c:3257 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "ცხრილის შემცველáƒáƒ‘áƒáƒ–ე უჯრედის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ: უჯრედების რáƒáƒáƒ“ენáƒáƒ‘რ%d-ზე მეტიáƒ.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "ცხრილის შემცველáƒáƒ‘áƒáƒ–ე უჯრედის დáƒáƒ›áƒáƒ¢áƒ”ბრშეუძლებელიáƒ: უჯრედების ჯáƒáƒ›áƒ£áƒ áƒ˜ რáƒáƒáƒ“ენáƒáƒ‘რ%lld-ზე მეტიáƒ.\n" -#: ../../fe_utils/print.c:3515 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ფáƒáƒ áƒ›áƒáƒ¢áƒ˜ (შიდრშეცდáƒáƒ›áƒ): %d" @@ -142,46 +204,51 @@ msgstr "მáƒáƒ—ხáƒáƒ•ნის შეცდáƒáƒ›áƒ: %s" msgid "Query was: %s" msgstr "მáƒáƒ—ხáƒáƒ•ნის შინáƒáƒáƒ áƒ¡áƒ˜: %s" -#: clusterdb.c:113 clusterdb.c:132 createdb.c:144 createdb.c:163 -#: createuser.c:194 createuser.c:209 dropdb.c:104 dropdb.c:113 dropdb.c:121 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "გáƒáƒ áƒ¡áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბის áƒáƒ áƒ’უმენტი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სáƒáƒ®áƒ”ლი ხáƒáƒ–ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒáƒ¡ áƒáƒœ კáƒáƒ áƒ”ტის დáƒáƒ‘რუნებáƒáƒ¡ შეიცáƒáƒ•ს: \"%s\"\n" + +#: clusterdb.c:114 clusterdb.c:133 createdb.c:149 createdb.c:168 +#: createuser.c:195 createuser.c:210 dropdb.c:104 dropdb.c:113 dropdb.c:121 #: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 -#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:277 vacuumdb.c:297 +#: reindexdb.c:177 reindexdb.c:196 vacuumdb.c:280 vacuumdb.c:300 #, c-format msgid "Try \"%s --help\" for more information." msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'." -#: clusterdb.c:130 createdb.c:161 createuser.c:207 dropdb.c:119 dropuser.c:108 -#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:295 +#: clusterdb.c:131 createdb.c:166 createuser.c:208 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:194 vacuumdb.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "მეტისმეტáƒáƒ“ ბევრი ბრძáƒáƒœáƒ”ბის-სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი (პირველირ\"%s\")" -#: clusterdb.c:148 +#: clusterdb.c:149 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "ყველრდრმითითებული ბáƒáƒ–ების ერთდრáƒáƒ£áƒšáƒ˜ დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებრშეუძლებელიáƒ" -#: clusterdb.c:151 -#, c-format -msgid "cannot cluster specific table(s) in all databases" -msgstr "მითითებული ცხრილების ყველრბáƒáƒ–áƒáƒ¨áƒ˜ დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებრშეუძლებელიáƒ" - -#: clusterdb.c:215 +#: clusterdb.c:214 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "ცხრილის (\"%s\"), ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\" დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რების პრáƒáƒ‘ლემáƒ: %s" -#: clusterdb.c:218 +#: clusterdb.c:217 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "ბáƒáƒ–ის (\"%s\") დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რების შეცდáƒáƒ›áƒ: %s" -#: clusterdb.c:246 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: ბáƒáƒ–ის დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებáƒ: \"%s\"\n" -#: clusterdb.c:262 +#: clusterdb.c:274 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -190,19 +257,19 @@ msgstr "" "%s áƒáƒšáƒáƒ’ებს ბáƒáƒ–áƒáƒ¨áƒ˜ áƒáƒ“რე დáƒáƒšáƒáƒ’ებული ცხრილებს.\n" "\n" -#: clusterdb.c:263 createdb.c:291 createuser.c:414 dropdb.c:172 dropuser.c:170 -#: pg_isready.c:226 reindexdb.c:748 vacuumdb.c:1127 +#: clusterdb.c:275 createdb.c:298 createuser.c:415 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:868 vacuumdb.c:1147 #, c-format msgid "Usage:\n" msgstr "გáƒáƒ›áƒáƒ§áƒ”ნებáƒ:\n" -#: clusterdb.c:264 reindexdb.c:749 vacuumdb.c:1128 +#: clusterdb.c:276 reindexdb.c:869 vacuumdb.c:1148 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [ბáƒáƒ–ისსáƒáƒ®áƒ”ლი]\n" -#: clusterdb.c:265 createdb.c:293 createuser.c:416 dropdb.c:174 dropuser.c:172 -#: pg_isready.c:229 reindexdb.c:750 vacuumdb.c:1129 +#: clusterdb.c:277 createdb.c:300 createuser.c:417 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:870 vacuumdb.c:1149 #, c-format msgid "" "\n" @@ -211,48 +278,48 @@ msgstr "" "\n" "პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: clusterdb.c:266 +#: clusterdb.c:278 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all ყველრბáƒáƒ–ის დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებáƒ\n" -#: clusterdb.c:267 +#: clusterdb.c:279 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი დáƒáƒ¡áƒáƒ™áƒšáƒáƒ¡áƒ”რებელი ბáƒáƒ–ის სáƒáƒ®áƒ”ლი\n" -#: clusterdb.c:268 createuser.c:422 dropdb.c:175 dropuser.c:173 +#: clusterdb.c:280 createuser.c:423 dropdb.c:175 dropuser.c:173 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo-queries სერვერზე გáƒáƒ’ზáƒáƒ•ნილი ბრძáƒáƒœáƒ”ბების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: clusterdb.c:269 +#: clusterdb.c:281 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ შეტყáƒáƒ‘ინებები\n" -#: clusterdb.c:270 +#: clusterdb.c:282 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=ცხრილი მხáƒáƒšáƒáƒ“ მითითებული ცხრილების დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებáƒ\n" -#: clusterdb.c:271 +#: clusterdb.c:283 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: clusterdb.c:272 createuser.c:437 dropdb.c:178 dropuser.c:176 +#: clusterdb.c:284 createuser.c:439 dropdb.c:178 dropuser.c:176 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: clusterdb.c:273 createuser.c:445 dropdb.c:180 dropuser.c:178 +#: clusterdb.c:285 createuser.c:447 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: clusterdb.c:274 createdb.c:309 createuser.c:446 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:235 reindexdb.c:765 vacuumdb.c:1158 +#: clusterdb.c:286 createdb.c:317 createuser.c:448 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:885 vacuumdb.c:1178 #, c-format msgid "" "\n" @@ -261,37 +328,37 @@ msgstr "" "\n" "შეერთების პáƒáƒ áƒáƒ›áƒ”ტრები:\n" -#: clusterdb.c:275 createuser.c:447 dropdb.c:182 dropuser.c:180 vacuumdb.c:1159 +#: clusterdb.c:287 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1179 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: clusterdb.c:276 createuser.c:448 dropdb.c:183 dropuser.c:181 vacuumdb.c:1160 +#: clusterdb.c:288 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1180 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜\n" -#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:1161 +#: clusterdb.c:289 dropdb.c:184 vacuumdb.c:1181 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" -msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" +msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბ. ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: clusterdb.c:278 createuser.c:450 dropdb.c:185 dropuser.c:183 vacuumdb.c:1162 +#: clusterdb.c:290 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1182 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password áƒáƒ áƒáƒ¡áƒáƒ“ეს მკითხრპáƒáƒ áƒáƒšáƒ˜\n" -#: clusterdb.c:279 createuser.c:451 dropdb.c:186 dropuser.c:184 vacuumdb.c:1163 +#: clusterdb.c:291 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1183 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password პáƒáƒ áƒáƒšáƒ˜áƒ¡ ყáƒáƒ•ელთვის კითხვáƒ\n" -#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:1164 +#: clusterdb.c:292 dropdb.c:187 vacuumdb.c:1184 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ სáƒáƒáƒ•áƒáƒ áƒ˜áƒ ბáƒáƒ–áƒ\n" -#: clusterdb.c:281 +#: clusterdb.c:293 #, c-format msgid "" "\n" @@ -300,8 +367,8 @@ msgstr "" "\n" "დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რების შესáƒáƒ®áƒ”ბ მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მიღებრSQL ბრძáƒáƒœáƒ”ბის, CLUSTER, დეტáƒáƒšáƒ”ბში შეგიძლიáƒáƒ—.\n" -#: clusterdb.c:282 createdb.c:317 createuser.c:452 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:773 vacuumdb.c:1166 +#: clusterdb.c:294 createdb.c:325 createuser.c:454 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:893 vacuumdb.c:1186 #, c-format msgid "" "\n" @@ -310,8 +377,8 @@ msgstr "" "\n" "შეცდáƒáƒ›áƒ”ბის შესáƒáƒ®áƒ”ბ მიწერეთ: %s\n" -#: clusterdb.c:283 createdb.c:318 createuser.c:453 dropdb.c:189 dropuser.c:186 -#: pg_isready.c:241 reindexdb.c:774 vacuumdb.c:1167 +#: clusterdb.c:295 createdb.c:326 createuser.c:455 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:894 vacuumdb.c:1187 #, c-format msgid "%s home page: <%s>\n" msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" @@ -345,22 +412,22 @@ msgstr "%s (%s/%s) " msgid "Please answer \"%s\" or \"%s\".\n" msgstr "უპáƒáƒ¡áƒ£áƒ®áƒ”თ \"%s\" áƒáƒœ \"%s\".\n" -#: createdb.c:178 +#: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" კáƒáƒ“ირების სწáƒáƒ  სáƒáƒ®áƒ”ლს áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" -#: createdb.c:253 +#: createdb.c:260 #, c-format msgid "database creation failed: %s" msgstr "ბáƒáƒ–ის შექმნის შეცდáƒáƒ›áƒ:%s" -#: createdb.c:272 +#: createdb.c:279 #, c-format msgid "comment creation failed (database was created): %s" msgstr "კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜áƒ¡ შექმნის შეცდáƒáƒ›áƒ (ბáƒáƒ–რშეიქმნáƒ): %s" -#: createdb.c:290 +#: createdb.c:297 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -369,116 +436,121 @@ msgstr "" "%s PostgreSQL-ის ბáƒáƒ–áƒáƒ¡ ქმნის.\n" "\n" -#: createdb.c:292 +#: createdb.c:299 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [ბáƒáƒ–ისსáƒáƒ®áƒ”ლი] [áƒáƒ¦áƒ¬áƒ”რáƒ]\n" -#: createdb.c:294 +#: createdb.c:301 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=ცხრილებისსივრცე მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის ცხრილების ნáƒáƒ’ულისხმები სივრცე\n" -#: createdb.c:295 reindexdb.c:754 +#: createdb.c:302 reindexdb.c:874 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo-queries სერვერზე გáƒáƒ’ზáƒáƒ•ნილი ბრძáƒáƒœáƒ”ბების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: createdb.c:296 +#: createdb.c:303 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" -msgstr " \\encoding [კáƒáƒ“ირებáƒ] კლიენტის კáƒáƒ“ირების ჩვენებრáƒáƒœ დáƒáƒ§áƒ”ნებáƒ\n" +msgstr " \\encoding [კáƒáƒ“ირებáƒ] კლიენტის კáƒáƒ“ირების ჩვენებრáƒáƒœ დáƒáƒ§áƒ”ნებáƒ\n" -#: createdb.c:297 +#: createdb.c:304 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=ენრბáƒáƒ–ის ენის პáƒáƒ áƒáƒ›áƒ”ტრები\n" -#: createdb.c:298 +#: createdb.c:305 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=ენრბáƒáƒ–ის LC_COLLATE პáƒáƒ áƒáƒ›áƒ”ტრი\n" -#: createdb.c:299 +#: createdb.c:306 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=ენრბáƒáƒ–ის LC_CTYPE პáƒáƒ áƒáƒ›áƒ”ტრი\n" -#: createdb.c:300 +#: createdb.c:307 +#, c-format +msgid " --builtin-locale=LOCALE builtin locale setting for the database\n" +msgstr " --builtin-locale=ლáƒáƒ™áƒáƒšáƒ˜ ჩáƒáƒ¨áƒ”ნებული ლáƒáƒ™áƒáƒšáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ისთვის\n" + +#: createdb.c:308 #, c-format msgid " --icu-locale=LOCALE ICU locale setting for the database\n" msgstr " --icu-locale=ენრბáƒáƒ–ის ICU ენის პáƒáƒ áƒáƒ›áƒ”ტრი\n" -#: createdb.c:301 +#: createdb.c:309 #, c-format msgid " --icu-rules=RULES ICU rules setting for the database\n" msgstr " --icu-rules=წესი ბáƒáƒ–ის ICU წესის პáƒáƒ áƒáƒ›áƒ”ტრი\n" -#: createdb.c:302 +#: createdb.c:310 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " locale provider for the database's default collation\n" msgstr "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " ბáƒáƒ–ის ნáƒáƒ’ულისხმები კáƒáƒšáƒáƒªáƒ˜áƒ˜áƒ¡ ენის მáƒáƒ›áƒ¬áƒáƒ“ებელი\n" -#: createdb.c:304 +#: createdb.c:312 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" -msgstr " -O, --owner=მფლáƒáƒ‘ელი áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ის მფლáƒáƒ‘ელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" +msgstr " -O, --owner=მფლáƒáƒ‘ელი áƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ის მფლáƒáƒ‘ელი მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: createdb.c:305 +#: createdb.c:313 #, c-format msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" -msgstr " -S, --strategy=სტრáƒáƒ¢áƒ”გირბáƒáƒ–ის შექმნის სტრáƒáƒ¢áƒ”გიáƒ: wal_log áƒáƒœ file_copy\n" +msgstr " -S, --strategy=სტრáƒáƒ¢áƒ”გირბáƒáƒ–ის შექმნის სტრáƒáƒ¢áƒ”გიáƒ: wal_log áƒáƒœ file_copy\n" -#: createdb.c:306 +#: createdb.c:314 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=შáƒáƒ‘ლáƒáƒœáƒ˜ ბáƒáƒ–ის დáƒáƒ¡áƒáƒ™áƒáƒžáƒ˜áƒ áƒ”ბელი შáƒáƒ‘ლáƒáƒœáƒ˜\n" -#: createdb.c:307 reindexdb.c:763 +#: createdb.c:315 reindexdb.c:883 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: createdb.c:308 reindexdb.c:764 +#: createdb.c:316 reindexdb.c:884 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: createdb.c:310 reindexdb.c:766 +#: createdb.c:318 reindexdb.c:886 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ áƒáƒœ სáƒáƒ™áƒ”ტის სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე\n" -#: createdb.c:311 reindexdb.c:767 +#: createdb.c:319 reindexdb.c:887 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT მáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის სერვერის პáƒáƒ áƒ¢áƒ˜\n" -#: createdb.c:312 reindexdb.c:768 +#: createdb.c:320 reindexdb.c:888 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: createdb.c:313 reindexdb.c:769 +#: createdb.c:321 reindexdb.c:889 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password áƒáƒ áƒáƒ¡áƒáƒ“ეს მკითხრპáƒáƒ áƒáƒšáƒ˜\n" -#: createdb.c:314 reindexdb.c:770 +#: createdb.c:322 reindexdb.c:890 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password პáƒáƒ áƒáƒšáƒ˜áƒ¡ ყáƒáƒ•ელთვის კითხვáƒ\n" -#: createdb.c:315 reindexdb.c:771 +#: createdb.c:323 reindexdb.c:891 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ სáƒáƒáƒ•áƒáƒ áƒ˜áƒ ბáƒáƒ–áƒ\n" -#: createdb.c:316 +#: createdb.c:324 #, c-format msgid "" "\n" @@ -487,46 +559,46 @@ msgstr "" "\n" "ნáƒáƒ’ულისხმებáƒáƒ“ შექმნილი ბáƒáƒ–ის სáƒáƒ®áƒ”ლáƒáƒ“ მიმდინáƒáƒ áƒ” მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ.\n" -#: createuser.c:217 +#: createuser.c:218 msgid "Enter name of role to add: " msgstr "შეიყვáƒáƒœáƒ”თ დáƒáƒ¡áƒáƒ›áƒáƒ¢áƒ”ბელი რáƒáƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლი: " -#: createuser.c:232 +#: createuser.c:233 msgid "Enter password for new role: " msgstr "შეყვáƒáƒœáƒ”თ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜áƒ¡ პáƒáƒ áƒáƒšáƒ˜: " -#: createuser.c:233 +#: createuser.c:234 msgid "Enter it again: " msgstr "შეიყვáƒáƒœáƒ”თ კდევ ერთხელ: " -#: createuser.c:236 +#: createuser.c:237 #, c-format msgid "Passwords didn't match.\n" msgstr "პáƒáƒ áƒáƒšáƒ”ბი áƒáƒ  ემთხვევáƒ.\n" -#: createuser.c:244 +#: createuser.c:245 msgid "Shall the new role be a superuser?" msgstr "იქნებრáƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი?" -#: createuser.c:259 +#: createuser.c:260 msgid "Shall the new role be allowed to create databases?" msgstr "ექნებრáƒáƒ®áƒáƒš რáƒáƒšáƒ¡ ბáƒáƒ–ების შექმნის უფლებáƒ?" -#: createuser.c:267 +#: createuser.c:268 msgid "Shall the new role be allowed to create more new roles?" msgstr "ექნებრáƒáƒ®áƒáƒš რáƒáƒšáƒ¡ სხვრრáƒáƒšáƒ”ბის შექმნს უფლებáƒ?" -#: createuser.c:308 +#: createuser.c:309 #, c-format msgid "password encryption failed: %s" msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ დáƒáƒ¨áƒ˜áƒ¤áƒ•რის შეცდáƒáƒ›áƒ: %s" -#: createuser.c:399 +#: createuser.c:400 #, c-format msgid "creation of new role failed: %s" msgstr "áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜áƒ¡ შექმნის შეცდáƒáƒ›áƒ: %s" -#: createuser.c:413 +#: createuser.c:414 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -535,44 +607,46 @@ msgstr "" "%s PostgreSQL-ის რáƒáƒšáƒ¡ ქმნის.\n" "\n" -#: createuser.c:415 dropuser.c:171 +#: createuser.c:416 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [პáƒáƒ áƒáƒ›áƒ”ტრი]... [რáƒáƒšáƒ˜áƒ¡áƒ¡áƒáƒ®áƒ”ლი]\n" -#: createuser.c:417 +#: createuser.c:418 #, c-format -#| msgid "" -#| " -i, --inherit role inherits privileges of roles it is a\n" -#| " member of (default)\n" msgid "" -" -a, --admin=ROLE this role will be a member of new role with admin\n" +" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n" " option\n" msgstr "" -" -a, --admin=რáƒáƒšáƒ˜ ეს რáƒáƒšáƒ˜ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜áƒ¡ წევრი იქნებáƒ, áƒáƒ“მინისტრირების\n" +" -a, --admin=რáƒáƒšáƒ˜ რáƒáƒšáƒ˜ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜áƒ¡ წევრი იქნებáƒ, áƒáƒ“მინისტრირების\n" " პáƒáƒ áƒáƒ›áƒ”ტრით\n" -#: createuser.c:419 +#: createuser.c:420 #, c-format msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr " -c, --connection-limit=N რáƒáƒšáƒ˜áƒ¡ შეერთებების ლიმიტი (ნáƒáƒ’ულისხმები: ლიმიტის გáƒáƒ áƒ”შე)\n" -#: createuser.c:420 +#: createuser.c:421 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb რáƒáƒšáƒ¡ შეუძლირáƒáƒ®áƒáƒšáƒ˜ ბáƒáƒ–ების შექმნáƒ\n" -#: createuser.c:421 +#: createuser.c:422 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb რáƒáƒšáƒ¡ ბáƒáƒ–ების შექმნრáƒáƒ  შეუძლირ(ნáƒáƒ’ულისხმები)\n" -#: createuser.c:423 +#: createuser.c:424 #, c-format -msgid " -g, --role=ROLE new role will be a member of this role\n" -msgstr " -g, --role=რáƒáƒšáƒ˜ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜ áƒáƒ› რáƒáƒšáƒ˜áƒ¡ წევრი იქნებáƒ\n" +msgid " -g, --member-of=ROLE new role will be a member of ROLE\n" +msgstr " -g, --member-of=რáƒáƒšáƒ˜ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜ áƒáƒ› რáƒáƒšáƒ˜áƒ¡ წევრი იქნებáƒ\n" -#: createuser.c:424 +#: createuser.c:425 +#, c-format +msgid " --role=ROLE (same as --member-of, deprecated)\n" +msgstr " --role=რáƒáƒšáƒ˜ (იგივე, რáƒáƒª --member-of, რáƒáƒ›áƒ”ლიც მáƒáƒ«áƒ•ელებულიáƒ)\n" + +#: createuser.c:426 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -581,61 +655,61 @@ msgstr "" " -i, --inherit რáƒáƒ›áƒšáƒ˜ მემკვიდრეáƒáƒ‘ით იღებს იმ რáƒáƒšáƒ”ბსáƒáƒª, რáƒáƒ›áƒšáƒ˜áƒ¡\n" " წევრიც თვითáƒáƒœáƒáƒ (ნáƒáƒ’ულისხმები)\n" -#: createuser.c:426 +#: createuser.c:428 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit რáƒáƒšáƒ˜ პრივილეგიებს მემკვიდრეáƒáƒ‘ით áƒáƒ  მიიღებს\n" -#: createuser.c:427 +#: createuser.c:429 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login რáƒáƒšáƒ˜áƒ— შესვლრშეიძლებრ(ნáƒáƒ’ულისხმები)\n" -#: createuser.c:428 +#: createuser.c:430 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login რáƒáƒšáƒ¡ შესვლრáƒáƒ  შეუძლიáƒ\n" -#: createuser.c:429 +#: createuser.c:431 #, c-format -msgid " -m, --member=ROLE this role will be a member of new role\n" -msgstr " -m, --member=რáƒáƒšáƒ˜ ეს რáƒáƒšáƒ˜ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜áƒ¡ წევრი იქნებáƒ\n" +msgid " -m, --with-member=ROLE ROLE will be a member of new role\n" +msgstr " -m, --with-member=რáƒáƒšáƒ˜ რáƒáƒšáƒ˜ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ˜áƒ¡ წევრი იქნებáƒ\n" -#: createuser.c:430 +#: createuser.c:432 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt რáƒáƒšáƒ˜áƒ¡áƒ—ვის პáƒáƒ áƒáƒšáƒ˜áƒ¡ მინიჭებáƒ\n" -#: createuser.c:431 +#: createuser.c:433 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole რáƒáƒšáƒ¡ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ”ბის შექმნრშეუძლიáƒ\n" -#: createuser.c:432 +#: createuser.c:434 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole რáƒáƒšáƒ¡ áƒáƒ®áƒáƒšáƒ˜ რáƒáƒšáƒ”ბის შექმნრáƒáƒ  შეუძლირ(ნáƒáƒ’ულისხმები)\n" -#: createuser.c:433 +#: createuser.c:435 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser რáƒáƒšáƒ˜ áƒáƒ®áƒáƒšáƒ˜ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი იქნებáƒ\n" -#: createuser.c:434 +#: createuser.c:436 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr " -S, --no-superuser რáƒáƒšáƒ˜ ზემáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი áƒáƒ  იქნებრ(ნáƒáƒ’ულისხმები)\n" -#: createuser.c:435 +#: createuser.c:437 #, c-format msgid "" " -v, --valid-until=TIMESTAMP\n" -" password expiration date for role\n" +" password expiration date and time for role\n" msgstr "" " -v, --valid-until=დრáƒáƒ˜áƒ¡áƒ¨áƒ¢áƒáƒ›áƒžáƒ˜\n" -" პáƒáƒ áƒáƒšáƒ˜áƒ¡ áƒáƒ›áƒáƒ¬áƒ£áƒ áƒ•ის თáƒáƒ áƒ˜áƒ¦áƒ˜ რáƒáƒšáƒ˜áƒ¡áƒ—ვის\n" +" პáƒáƒ áƒáƒšáƒ˜áƒ¡ áƒáƒ›áƒáƒ¬áƒ£áƒ áƒ•ის თáƒáƒ áƒ˜áƒ¦áƒ˜ დრდრრრáƒáƒšáƒ˜áƒ¡áƒ—ვის\n" -#: createuser.c:438 +#: createuser.c:440 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" @@ -644,16 +718,13 @@ msgstr "" " --interactive ნáƒáƒ’ულისხმები მნიშვნელáƒáƒ‘ების გáƒáƒ›áƒáƒ§áƒ”ნების მáƒáƒ’იერ რáƒáƒšáƒ˜áƒ¡ \n" " ნáƒáƒ™áƒšáƒ£áƒšáƒ˜ სáƒáƒ®áƒ”ლისრდრáƒáƒ¢áƒ áƒ˜áƒ‘უტების ინტერáƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒáƒ“ კითხვáƒs\n" -#: createuser.c:440 +#: createuser.c:442 #, c-format msgid " --bypassrls role can bypass row-level security (RLS) policy\n" msgstr " --bypassrls რáƒáƒšáƒ¡ შეუძლირáƒáƒ˜áƒªáƒ˜áƒšáƒáƒ¡ მწკრივის დáƒáƒœáƒ˜áƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის (RLS) წესები\n" -#: createuser.c:441 +#: createuser.c:443 #, c-format -#| msgid "" -#| " -i, --inherit role inherits privileges of roles it is a\n" -#| " member of (default)\n" msgid "" " --no-bypassrls role cannot bypass row-level security (RLS) policy\n" " (default)\n" @@ -661,17 +732,17 @@ msgstr "" " --no-bypassrls რáƒáƒšáƒ¡ მწკრივის დáƒáƒœáƒ˜áƒ¡ უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის წესების (RLS) áƒáƒªáƒ˜áƒšáƒ”ბáƒ\n" " áƒáƒ  შეუძლირ(ნáƒáƒ’ულისხმები)\n" -#: createuser.c:443 +#: createuser.c:445 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication რáƒáƒšáƒ¡ შეუძლირრეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ინიცირებáƒ\n" -#: createuser.c:444 +#: createuser.c:446 #, c-format msgid " --no-replication role cannot initiate replication (default)\n" msgstr " --no-replication რáƒáƒšáƒ¡ რეპლიკáƒáƒªáƒ˜áƒ˜áƒ¡ ინიცირებრáƒáƒ  შეუძლირ(ნáƒáƒ’ულისხმები)\n" -#: createuser.c:449 +#: createuser.c:451 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი სერვერთáƒáƒœ მიერთების მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი (ის áƒáƒ áƒ, რáƒáƒ›áƒ”ლსáƒáƒª ქმნით)\n" @@ -855,94 +926,54 @@ msgstr " -t, --timeout=წáƒáƒ›áƒ˜ შეერთების ლáƒáƒ“ msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ბáƒáƒ–ის მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლი\n" -#: reindexdb.c:209 -#, c-format -msgid "cannot reindex all databases and a specific one at the same time" -msgstr "ყველრდრმითითებული ბáƒáƒ–ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ" - -#: reindexdb.c:211 -#, c-format -msgid "cannot reindex all databases and system catalogs at the same time" -msgstr "ყველრბáƒáƒ–ის დრსისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ" - -#: reindexdb.c:213 -#, c-format -msgid "cannot reindex specific schema(s) in all databases" -msgstr "მითითებული სქემის ყველრბáƒáƒ–áƒáƒ¨áƒ˜ რეინდექსი შეუძლებელიáƒ" - -#: reindexdb.c:215 -#, c-format -msgid "cannot reindex specific table(s) in all databases" -msgstr "მითითებული ცხრილის ყველრბáƒáƒ–áƒáƒ¨áƒ˜ რეინდექსი შეუძლებელიáƒ" - -#: reindexdb.c:217 -#, c-format -msgid "cannot reindex specific index(es) in all databases" -msgstr "მითითებული ინდექსის ყველრბáƒáƒ–áƒáƒ¨áƒ˜ რეინდექსი შეუძლებელიáƒ" - -#: reindexdb.c:227 -#, c-format -msgid "cannot reindex specific schema(s) and system catalogs at the same time" -msgstr "მითითებული სქემის დრსისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ" - -#: reindexdb.c:229 -#, c-format -msgid "cannot reindex specific table(s) and system catalogs at the same time" -msgstr "მითითებული ცხრილის დრსისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ" - -#: reindexdb.c:231 -#, c-format -msgid "cannot reindex specific index(es) and system catalogs at the same time" -msgstr "მითითებული ინდექსის დრსისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ" - -#: reindexdb.c:234 +#: reindexdb.c:210 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების რეინდექსისთვის ბევრი დáƒáƒ•áƒáƒšáƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" -#: reindexdb.c:260 +#: reindexdb.c:215 #, c-format -msgid "cannot use multiple jobs to reindex indexes" -msgstr "ინდექსების რეინდექსისთვის ბევრი დáƒáƒ•áƒáƒšáƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" +msgid "cannot reindex all databases and a specific one at the same time" +msgstr "ყველრდრმითითებული ბáƒáƒ–ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ" -#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:509 vacuumdb.c:516 vacuumdb.c:523 -#: vacuumdb.c:530 vacuumdb.c:537 vacuumdb.c:544 vacuumdb.c:551 vacuumdb.c:556 -#: vacuumdb.c:560 vacuumdb.c:564 vacuumdb.c:568 +#: reindexdb.c:296 reindexdb.c:303 vacuumdb.c:515 vacuumdb.c:522 vacuumdb.c:529 +#: vacuumdb.c:536 vacuumdb.c:543 vacuumdb.c:550 vacuumdb.c:557 vacuumdb.c:562 +#: vacuumdb.c:566 vacuumdb.c:570 vacuumdb.c:574 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებრPostgreSQL-ის ვერსიáƒáƒ¨áƒ˜ \"%s\" áƒáƒœ უფრრძველში" -#: reindexdb.c:561 +#: reindexdb.c:584 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "ბáƒáƒ–ის (\"%s\") რეინდექსის პრáƒáƒ‘ლემáƒ: %s" -#: reindexdb.c:565 +#: reindexdb.c:588 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "რეინდექსის შეცდáƒáƒ›áƒ ინდექსისთვის \"%s\" ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": %s" -#: reindexdb.c:569 +#: reindexdb.c:592 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "რეინდექსის შეცდáƒáƒ›áƒ სქემისთვის \"%s\" ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": %s" -#: reindexdb.c:573 +#: reindexdb.c:596 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების რეინდექსის შეცდáƒáƒ›áƒ ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": %s" -#: reindexdb.c:577 +#: reindexdb.c:600 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "რეინდექსის შეცდáƒáƒ›áƒ ცხრილისთვის \"%s\" ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\": %s" -#: reindexdb.c:730 +#: reindexdb.c:824 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: ბáƒáƒ–ის თáƒáƒ•იდáƒáƒœ ინდექსირებრ\"%s\"\n" -#: reindexdb.c:747 +#: reindexdb.c:867 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -951,62 +982,62 @@ msgstr "" "%s PostgreSQL ბáƒáƒ–ის თáƒáƒ•იდáƒáƒœ ინდექსირებáƒ.\n" "\n" -#: reindexdb.c:751 +#: reindexdb.c:871 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all ყველრბáƒáƒ–ის თáƒáƒ•იდáƒáƒœ ინდექსირებáƒ\n" -#: reindexdb.c:752 +#: reindexdb.c:872 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " --concurrently ერთდრáƒáƒ£áƒšáƒ˜ ინდექსირებáƒ\n" -#: reindexdb.c:753 +#: reindexdb.c:873 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი დáƒáƒ¡áƒáƒ˜áƒœáƒ“ექსებელი ბáƒáƒ–ის სáƒáƒ®áƒ”ლი\n" -#: reindexdb.c:755 +#: reindexdb.c:875 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=ინდექსი მითითებული ინდექს(ებ)-ი თáƒáƒ•იდáƒáƒœ შეიქმნებáƒ\n" -#: reindexdb.c:756 +#: reindexdb.c:876 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" msgstr " -j, --jobs=რიცხვი თáƒáƒ•იდáƒáƒœ ინდექსირებისთვის მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის შეერთებების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" -#: reindexdb.c:757 +#: reindexdb.c:877 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ შეტყáƒáƒ‘ინებები\n" -#: reindexdb.c:758 +#: reindexdb.c:878 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system მáƒáƒ®áƒ“ებრმხáƒáƒšáƒáƒ“ სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების თáƒáƒ•იდáƒáƒœ ინდექსირებáƒ\n" -#: reindexdb.c:759 +#: reindexdb.c:879 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=სქემრმáƒáƒ®áƒ“ებრმხáƒáƒšáƒáƒ“ მითითებული სქემების თáƒáƒ•იდáƒáƒœ ინდექსირებáƒ\n" -#: reindexdb.c:760 +#: reindexdb.c:880 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=ცხრილი მáƒáƒ®áƒ“ებრმხáƒáƒšáƒáƒ“ მითითებული ცხრილების თáƒáƒ•იდáƒáƒœ ინდექსირებáƒ\n" -#: reindexdb.c:761 +#: reindexdb.c:881 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " --tablespace=ცხრილებისსივრცე ცხრილების სივრცე, სáƒáƒ“áƒáƒª რეინდექსი მáƒáƒ®áƒ“ებáƒ\n" -#: reindexdb.c:762 +#: reindexdb.c:882 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: reindexdb.c:772 +#: reindexdb.c:892 #, c-format msgid "" "\n" @@ -1015,90 +1046,80 @@ msgstr "" "\n" "მეტი დეტáƒáƒšáƒ”ბისთვის იხილეთ SQL-ის ბრძáƒáƒœáƒ”ბის, REINDEX-ის დეტáƒáƒšáƒ”ბი.\n" -#: vacuumdb.c:310 vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 -#: vacuumdb.c:325 vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:340 +#: vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 vacuumdb.c:325 +#: vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:334 vacuumdb.c:343 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "მხáƒáƒšáƒáƒ“ áƒáƒœáƒáƒšáƒ˜áƒ–ის დრáƒáƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის \"%s\" გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" -#: vacuumdb.c:343 +#: vacuumdb.c:346 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "სრული დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის დრáƒáƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრის \"%s\" გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" -#: vacuumdb.c:349 vacuumdb.c:357 +#: vacuumdb.c:352 vacuumdb.c:360 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "\"%s\" პáƒáƒ áƒáƒ›áƒ”ტრთáƒáƒœ ერთáƒáƒ“ \"%s\"-ის გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" -#: vacuumdb.c:428 +#: vacuumdb.c:432 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "ყველრდრმითითებული ბáƒáƒ–ების ერთდრáƒáƒ£áƒšáƒ˜ დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრშეუძლებელიáƒ" -#: vacuumdb.c:432 -#, c-format -msgid "cannot vacuum specific table(s) in all databases" -msgstr "მითითებული ცხრილების ყველრბáƒáƒ–áƒáƒ¨áƒ˜ დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრშეუძლებელიáƒ" - #: vacuumdb.c:436 #, c-format -msgid "cannot vacuum specific schema(s) in all databases" -msgstr "ყველრბáƒáƒ–áƒáƒ¨áƒ˜ მითითებულ სქემებს ვერ მáƒáƒ•áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბ" - -#: vacuumdb.c:440 -#, c-format -msgid "cannot exclude specific schema(s) in all databases" -msgstr "ყველრბáƒáƒ–იდáƒáƒœ მითითებულ სქემებს ვერ áƒáƒ›áƒáƒ•იღებ" - -#: vacuumdb.c:444 -#, c-format msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time" msgstr "სქემებში ყველრცხრილის დრმითითებული ცხრილების ერთდრáƒáƒ£áƒšáƒ˜ მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრშეუძლებელიáƒ" -#: vacuumdb.c:448 +#: vacuumdb.c:440 #, c-format msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time" msgstr "მითითებულ ცხრილების მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრდრსქემების გáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒ•რერთდრáƒáƒ£áƒšáƒáƒ“ შეუძლებელიáƒ" -#: vacuumdb.c:452 +#: vacuumdb.c:444 #, c-format msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time" msgstr "სქემებში ყველრცხრილის მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრდრáƒáƒ›áƒáƒ•ე დრáƒáƒ¡ სქემების გáƒáƒ›áƒáƒ áƒ˜áƒªáƒ®áƒ•რშეუძლებელიáƒ" -#: vacuumdb.c:496 +#: vacuumdb.c:457 +#, c-format +msgid "out of memory" +msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ" + +#: vacuumdb.c:502 msgid "Generating minimal optimizer statistics (1 target)" msgstr "áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ მინიმáƒáƒšáƒ£áƒ áƒ˜ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ (1 სáƒáƒ›áƒ˜áƒ–ნე)" -#: vacuumdb.c:497 +#: vacuumdb.c:503 msgid "Generating medium optimizer statistics (10 targets)" msgstr "áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ სáƒáƒ¨áƒ£áƒáƒšáƒ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ (10 სáƒáƒ›áƒ˜áƒ–ნე)" -#: vacuumdb.c:498 +#: vacuumdb.c:504 msgid "Generating default (full) optimizer statistics" msgstr "áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ ნáƒáƒ’ულისხმები (სრული) სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ" -#: vacuumdb.c:577 +#: vacuumdb.c:583 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: ბáƒáƒ–ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებრ\"%s\": %s\n" -#: vacuumdb.c:580 +#: vacuumdb.c:586 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: ბáƒáƒ–ის \"%s\" დáƒáƒ›áƒ¢áƒ•ერáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ\n" -#: vacuumdb.c:1115 +#: vacuumdb.c:1135 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "ცხრილის (\"%s\") (ბáƒáƒ–áƒáƒ¨áƒ˜ \"%s\") დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის პრáƒáƒ‘ლემáƒ: %s" -#: vacuumdb.c:1118 +#: vacuumdb.c:1138 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "ბáƒáƒ–ის (\"%s\") დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის პრáƒáƒ‘ლემáƒ: %s" -#: vacuumdb.c:1126 +#: vacuumdb.c:1146 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1107,133 +1128,132 @@ msgstr "" "%s PostgreSQL ბáƒáƒ–ის გáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებრდრáƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒªáƒ˜áƒ.\n" "\n" -#: vacuumdb.c:1130 +#: vacuumdb.c:1150 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all ყველრბáƒáƒ–ის დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ\n" -#: vacuumdb.c:1131 +#: vacuumdb.c:1151 #, c-format msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n" msgstr " --buffer-usage-limit=ზáƒáƒ›áƒ მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისთვის გáƒáƒ›áƒáƒ§áƒ”ნებული რგáƒáƒšáƒ˜áƒ¡ ბáƒáƒ¤áƒ”რის ზáƒáƒ›áƒ\n" -#: vacuumdb.c:1132 +#: vacuumdb.c:1152 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=ბáƒáƒ–ისსáƒáƒ®áƒ”ლი დáƒáƒ¡áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბელი ბáƒáƒ–ები\n" -#: vacuumdb.c:1133 +#: vacuumdb.c:1153 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping გვერდის გáƒáƒ›áƒáƒ¢áƒáƒ•ების ყველრვáƒáƒ áƒ˜áƒáƒœáƒ¢áƒ˜áƒ¡ გáƒáƒ›áƒáƒ áƒ—ვáƒ\n" -#: vacuumdb.c:1134 +#: vacuumdb.c:1154 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo-queries სერვერზე გáƒáƒ’ზáƒáƒ•ნილი ბრძáƒáƒœáƒ”ბების გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: vacuumdb.c:1135 +#: vacuumdb.c:1155 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full სრული დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ\n" -#: vacuumdb.c:1136 +#: vacuumdb.c:1156 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze მწკრივის ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ§áƒ˜áƒœáƒ•áƒ\n" -#: vacuumdb.c:1137 +#: vacuumdb.c:1157 #, c-format msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" msgstr " --force-index-cleanup ინდექსის ჩáƒáƒœáƒáƒ¬áƒ”რები, რáƒáƒ›áƒšáƒ”ბიც მკვდáƒáƒ  მáƒáƒœáƒáƒªáƒ”მებზე მიუთითებენ, ყáƒáƒ•ელთვის წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ\n" -#: vacuumdb.c:1138 +#: vacuumdb.c:1158 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=რიცხვი დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისáƒáƒ¡ მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის შეერთებების გáƒáƒ›áƒáƒ§áƒ”ნებáƒ\n" -#: vacuumdb.c:1139 +#: vacuumdb.c:1159 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr " --min-mxid-age=MXID_AGE დáƒáƒ¡áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბელი ცხრილების მულტიტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ID-ის მინიმáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ¡áƒáƒ™áƒ˜\n" -#: vacuumdb.c:1140 +#: vacuumdb.c:1160 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr " --min-xid-age=XID_AGE დáƒáƒ¡áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბელი ცხრილების ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის ID-ის მინიმáƒáƒšáƒ£áƒ áƒ˜ áƒáƒ¡áƒáƒ™áƒ˜\n" -#: vacuumdb.c:1141 +#: vacuumdb.c:1161 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" msgstr " --no-index-cleanup ინდექსის ჩáƒáƒœáƒáƒ¬áƒ”რები, რáƒáƒ›áƒšáƒ”ბიც მკვდáƒáƒ  მáƒáƒœáƒáƒªáƒ”მებზე მიუთითებენ, áƒáƒ  წáƒáƒ˜áƒ¨áƒšáƒ”ბáƒ\n" -#: vacuumdb.c:1142 +#: vacuumdb.c:1162 #, c-format -#| msgid " -P, --progress show progress information\n" msgid " --no-process-main skip the main relation\n" msgstr " --no-process-main მთáƒáƒ•áƒáƒ áƒ˜ ურთიერთáƒáƒ‘ის გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ\n" -#: vacuumdb.c:1143 +#: vacuumdb.c:1163 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" msgstr " --no-process-toast მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბისáƒáƒ¡ ცხრილთáƒáƒœ áƒáƒ¡áƒáƒªáƒ˜áƒ áƒ”ბული TOAST cxrilis gamotoveba\n" -#: vacuumdb.c:1144 +#: vacuumdb.c:1164 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" msgstr " --no-truncate ცხრილის ბáƒáƒšáƒáƒ¨áƒ˜ ცáƒáƒ áƒ˜áƒ”ლი გვერდები áƒáƒ  მáƒáƒ˜áƒ™áƒ•ეთებáƒ\n" -#: vacuumdb.c:1145 +#: vacuumdb.c:1165 #, c-format -msgid " -n, --schema=PATTERN vacuum tables in the specified schema(s) only\n" -msgstr " -n, --schema=PATTERN ცხრილების მხáƒáƒšáƒáƒ“ მითითებულ სქემებში მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ\n" +msgid " -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n" +msgstr " -n, --schema=სქემრცხრილების, მხáƒáƒšáƒáƒ“, მითითებულ სქემებში მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ\n" -#: vacuumdb.c:1146 +#: vacuumdb.c:1166 #, c-format -msgid " -N, --exclude-schema=PATTERN do not vacuum tables in the specified schema(s)\n" -msgstr " -N, --exclude-schema=PATTERN მითითებული სქემებში ცხრილები მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბული áƒáƒ  იქნებáƒ\n" +msgid " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n" +msgstr " -N, --exclude-schema=სქემრმითითებული სქემებში ცხრილები მáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბული áƒáƒ  იქნებáƒ\n" -#: vacuumdb.c:1147 +#: vacuumdb.c:1167 #, c-format msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr " -P, --parallel=პáƒáƒ áƒáƒšáƒ”ლური_დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”_პრáƒáƒªáƒ”სი დáƒáƒ¡áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბლáƒáƒ“ მითითებული რáƒáƒáƒ“ენáƒáƒ‘ის დáƒáƒ›áƒ®áƒ›áƒáƒ áƒ” პრáƒáƒªáƒ”სის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ, თუ ეს შესáƒáƒ«áƒšáƒ”ბელიáƒ\n" -#: vacuumdb.c:1148 +#: vacuumdb.c:1168 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet áƒáƒ  გáƒáƒ›áƒáƒ˜áƒ¢áƒáƒœáƒ შეტყáƒáƒ‘ინებები\n" -#: vacuumdb.c:1149 +#: vacuumdb.c:1169 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked გáƒáƒ›áƒáƒ¢áƒáƒ•ებული იქნებრურთიერთáƒáƒ‘ები, რáƒáƒ›áƒšáƒ˜áƒ¡ მáƒáƒ¨áƒ˜áƒœáƒ•ე ჩáƒáƒ™áƒ”ტვáƒáƒª შეუძლებელიáƒ\n" -#: vacuumdb.c:1150 +#: vacuumdb.c:1170 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr " -t, --table='ცხრილი[(სვეტები)]' მხáƒáƒšáƒáƒ“ მითითებული ცხრილების დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბáƒ\n" -#: vacuumdb.c:1151 +#: vacuumdb.c:1171 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose დáƒáƒ›áƒáƒ¢áƒ”ბითი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ\n" -#: vacuumdb.c:1152 +#: vacuumdb.c:1172 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version ვერსიის ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ დრგáƒáƒ¡áƒ•ლáƒ\n" -#: vacuumdb.c:1153 +#: vacuumdb.c:1173 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ\n" -#: vacuumdb.c:1154 +#: vacuumdb.c:1174 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr " -Z, --analyze-only მხáƒáƒšáƒáƒ“ áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ გáƒáƒœáƒáƒ®áƒšáƒ”ბáƒ; დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის გáƒáƒ áƒ”შე\n" -#: vacuumdb.c:1155 +#: vacuumdb.c:1175 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1242,12 +1262,12 @@ msgstr "" " --analyze-in-stages უკეთესი შედეგებისთვის áƒáƒžáƒ¢áƒ˜áƒ›áƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜áƒ¡ სტáƒáƒ¢áƒ˜áƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡\n" " მრáƒáƒ•áƒáƒšáƒ¡áƒáƒ¤áƒ”ხურიáƒáƒœáƒ˜ რეჟიმი; დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბის გáƒáƒ áƒ”შე\n" -#: vacuumdb.c:1157 +#: vacuumdb.c:1177 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help áƒáƒ› დáƒáƒ®áƒ›áƒáƒ áƒ”ბის ჩვენებრდრგáƒáƒ¡áƒ•ლáƒ\n" -#: vacuumdb.c:1165 +#: vacuumdb.c:1185 #, c-format msgid "" "\n" @@ -1256,10 +1276,58 @@ msgstr "" "\n" "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის იხილეთ SQL ბრძáƒáƒœáƒ”ბის, VACUUM -ის დეტáƒáƒšáƒ”ბი.\n" +#, c-format +#~ msgid "cannot cluster specific table(s) in all databases" +#~ msgstr "მითითებული ცხრილების ყველრბáƒáƒ–áƒáƒ¨áƒ˜ დáƒáƒ™áƒšáƒáƒ¡áƒ¢áƒ”რებრშეუძლებელიáƒ" + +#, c-format +#~ msgid "cannot exclude specific schema(s) in all databases" +#~ msgstr "ყველრბáƒáƒ–იდáƒáƒœ მითითებულ სქემებს ვერ áƒáƒ›áƒáƒ•იღებ" + +#, c-format +#~ msgid "cannot reindex all databases and system catalogs at the same time" +#~ msgstr "ყველრბáƒáƒ–ის დრსისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ" + +#, c-format +#~ msgid "cannot reindex specific index(es) and system catalogs at the same time" +#~ msgstr "მითითებული ინდექსის დრსისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ" + +#, c-format +#~ msgid "cannot reindex specific index(es) in all databases" +#~ msgstr "მითითებული ინდექსის ყველრბáƒáƒ–áƒáƒ¨áƒ˜ რეინდექსი შეუძლებელიáƒ" + +#, c-format +#~ msgid "cannot reindex specific schema(s) and system catalogs at the same time" +#~ msgstr "მითითებული სქემის დრსისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ" + +#, c-format +#~ msgid "cannot reindex specific schema(s) in all databases" +#~ msgstr "მითითებული სქემის ყველრბáƒáƒ–áƒáƒ¨áƒ˜ რეინდექსი შეუძლებელიáƒ" + +#, c-format +#~ msgid "cannot reindex specific table(s) and system catalogs at the same time" +#~ msgstr "მითითებული ცხრილის დრსისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ" + +#, c-format +#~ msgid "cannot reindex specific table(s) in all databases" +#~ msgstr "მითითებული ცხრილის ყველრბáƒáƒ–áƒáƒ¨áƒ˜ რეინდექსი შეუძლებელიáƒ" + #, c-format #~ msgid "cannot reindex system catalogs concurrently, skipping all" #~ msgstr "სისტემური კáƒáƒ¢áƒáƒšáƒáƒ’ების ერთდრáƒáƒ£áƒšáƒ˜ რეინდექსი შეუძლებელიáƒ. ყველáƒáƒ¡ გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ" +#, c-format +#~ msgid "cannot use multiple jobs to reindex indexes" +#~ msgstr "ინდექსების რეინდექსისთვის ბევრი დáƒáƒ•áƒáƒšáƒ”ბის გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" + +#, c-format +#~ msgid "cannot vacuum specific schema(s) in all databases" +#~ msgstr "ყველრბáƒáƒ–áƒáƒ¨áƒ˜ მითითებულ სქემებს ვერ მáƒáƒ•áƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბ" + +#, c-format +#~ msgid "cannot vacuum specific table(s) in all databases" +#~ msgstr "მითითებული ცხრილების ყველრბáƒáƒ–áƒáƒ¨áƒ˜ დáƒáƒ›áƒ¢áƒ•ერსáƒáƒ¡áƒ áƒ£áƒ¢áƒ”ბრშეუძლებელიáƒ" + #, c-format #~ msgid "only one of --locale and --lc-collate can be specified" #~ msgstr "--locale დრ--lc-collate მხáƒáƒšáƒáƒ“ ერთ ერთი შეიძლებრიყáƒáƒ¡ მითითებული" diff --git a/src/bin/scripts/po/ko.po b/src/bin/scripts/po/ko.po index 7593dcfae88a4..5e694f0725165 100644 --- a/src/bin/scripts/po/ko.po +++ b/src/bin/scripts/po/ko.po @@ -3,10 +3,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pgscripts (PostgreSQL) 13\n" +"Project-Id-Version: pgscripts (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 20:45+0000\n" -"PO-Revision-Date: 2020-10-13 15:50+0900\n" +"POT-Creation-Date: 2025-01-17 04:51+0000\n" +"PO-Revision-Date: 2025-01-16 14:23+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -15,32 +15,79 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:236 -#, c-format -msgid "fatal: " -msgstr "심ê°: " - -#: ../../../src/common/logging.c:243 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "오류: " -#: ../../../src/common/logging.c:250 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "경고: " +#: ../../../src/common/logging.c:294 +#, c-format +msgid "detail: " +msgstr "ìƒì„¸ì •ë³´: " + +#: ../../../src/common/logging.c:301 +#, c-format +msgid "hint: " +msgstr "힌트: " + #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "메모리 부족\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "null í¬ì¸í„°ë¥¼ 복제할 수 ì—†ìŒ(ë‚´ë¶€ 오류)\n" +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ 위한 íŒŒì¼ ì‹œìŠ¤í…œ ë™ê¸°í™”를 í•  수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "\"%s\" íŒŒì¼ ìƒíƒœ 정보를 구할 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "ì´ ë¹Œë“œëŠ” \"%s\" ë™ê¸°í™” ë°©ë²•ì„ ì§€ì›í•˜ì§€ 않ìŒ" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ì—´ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "\"%s\" 디렉터리를 ì½ì„ 수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ fsync í•  수 ì—†ìŒ: %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "\"%s\" 파ì¼ì„ \"%s\" 파ì¼ë¡œ ì´ë¦„ì„ ë°”ê¿€ 수 ì—†ìŒ: %m" + #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" @@ -55,80 +102,147 @@ msgstr "ì‚¬ìš©ìž ì—†ìŒ" msgid "user name lookup failure: error code %lu" msgstr "ì‚¬ìš©ìž ì´ë¦„ 찾기 실패: 오류번호 %lu" -#: ../../fe_utils/cancel.c:161 ../../fe_utils/cancel.c:206 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "취소 ìš”ì²­ì„ ì „ì†¡í•¨\n" -#: ../../fe_utils/cancel.c:165 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "취소 ìš”ì²­ì„ ì „ì†¡í•  수 ì—†ìŒ: " -#: ../../fe_utils/cancel.c:210 +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103 +msgid "Password: " +msgstr "암호:" + +#: ../../fe_utils/connect_utils.c:91 +#, c-format +msgid "could not connect to database %s: out of memory" +msgstr "%s ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²° í•  수 ì—†ìŒ: 메모리 부족" + +#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146 +#, c-format +msgid "%s" +msgstr "%s" + +#: ../../fe_utils/option_utils.c:69 +#, c-format +msgid "invalid value \"%s\" for option %s" +msgstr "\"%s\" ê°’ì€ \"%s\" 옵션 값으로 유효하지 않ìŒ" + +#: ../../fe_utils/option_utils.c:76 +#, c-format +msgid "%s must be in range %d..%d" +msgstr "%s ê°’ì€ %d부터 %d까지 지정할 수 있습니다." + +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "알 수 없는 ë™ê¸°í™” 방법: %s" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "ì´ ìš´ì˜ì²´ì œì—서는 너무 ë§Žì€ ë™ì‹œ 작업임: %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "select() ìž‘ì—…ì„ ìœ„í•œ 소켓 íŒŒì¼ ê¸°ìˆ ìž ë²”ìœ„ë¥¼ 벗어남: %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "job 수를 줄ì´ì„¸ìš”." + +#: ../../fe_utils/parallel_slot.c:553 #, c-format -msgid "Could not send cancel request: %s" -msgstr "취소 ìš”ì²­ì„ ì „ì†¡í•  수 ì—†ìŒ: %s" +msgid "processing of database \"%s\" failed: %s" +msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ 작업 실패: %s" -#: ../../fe_utils/print.c:350 +#: ../../fe_utils/print.c:406 #, c-format msgid "(%lu row)" msgid_plural "(%lu rows)" msgstr[0] "(%luê°œ í–‰)" -#: ../../fe_utils/print.c:3055 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "ì¸íŠ¸ëŸ½íŠ¸ë°œìƒ\n" -#: ../../fe_utils/print.c:3119 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "" +"Cannot print table contents: number of cells %lld is equal to or exceeds " +"maximum %lld.\n" +msgstr "" +"í…Œì´ë¸” ë‚´ìš©ì„ ì¶œë ¥í•  수 ì—†ìŒ: %lld ì…€ 수가 최대값 %lld 개와 같거나 초과함.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "í…Œì´ë¸” ë‚´ìš©ì— í—¤ë”를 추가할 수 ì—†ìŒ: ì—´ 수가 %d개를 초과했습니다.\n" -#: ../../fe_utils/print.c:3159 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "í…Œì´ë¸” ë‚´ìš©ì— ì…€ì„ ì¶”ê°€í•  수 ì—†ìŒ: ì´ ì…€ 수가 %d개를 초과했습니다.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "í…Œì´ë¸” ë‚´ìš©ì— ì…€ì„ ì¶”ê°€í•  수 ì—†ìŒ: ì´ ì…€ 수가 %lld개를 초과했습니다.\n" -#: ../../fe_utils/print.c:3414 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "ìž˜ëª»ëœ ì¶œë ¥ í˜•ì‹ (ë‚´ë¶€ 오류): %d" -#: clusterdb.c:114 clusterdb.c:133 createdb.c:121 createdb.c:140 -#: createuser.c:171 createuser.c:186 dropdb.c:101 dropdb.c:110 dropdb.c:118 -#: dropuser.c:92 dropuser.c:107 dropuser.c:122 pg_isready.c:95 pg_isready.c:109 -#: reindexdb.c:168 reindexdb.c:187 vacuumdb.c:227 vacuumdb.c:246 +#: ../../fe_utils/query_utils.c:33 ../../fe_utils/query_utils.c:58 +#, c-format +msgid "query failed: %s" +msgstr "쿼리 실패: %s" + +#: ../../fe_utils/query_utils.c:34 ../../fe_utils/query_utils.c:59 +#, c-format +msgid "Query was: %s" +msgstr "사용한 쿼리: %s" + +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "쉘 명령 ì¸ìžì— 줄바꿈 문ìžê°€ í¬í•¨ë˜ì—ˆìŒ: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 #, c-format -msgid "Try \"%s --help\" for more information.\n" -msgstr "보다 ìžì„¸í•œ ì‚¬ìš©ë²•ì€ \"%s --help\"\n" +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "ë°ì´í„°ë² ì´ìФ ì´ë¦„ì— ì¤„ë°”ê¿ˆ 문ìžê°€ í¬í•¨ë˜ì—ˆìŒ: \"%s\"\n" -#: clusterdb.c:131 createdb.c:138 createuser.c:184 dropdb.c:116 dropuser.c:105 -#: pg_isready.c:107 reindexdb.c:185 vacuumdb.c:244 +#: clusterdb.c:114 clusterdb.c:133 createdb.c:149 createdb.c:168 +#: createuser.c:195 createuser.c:210 dropdb.c:104 dropdb.c:113 dropdb.c:121 +#: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 +#: reindexdb.c:177 reindexdb.c:196 vacuumdb.c:280 vacuumdb.c:300 +#, c-format +msgid "Try \"%s --help\" for more information." +msgstr "ìžì„¸í•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보세요." + +#: clusterdb.c:131 createdb.c:166 createuser.c:208 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:194 vacuumdb.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "명령행 ì¸ìžë¥¼ 너무 ë§Žì´ ì§€ì •í–ˆìŠµë‹ˆë‹¤ (시작: \"%s\")" -#: clusterdb.c:143 +#: clusterdb.c:149 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "모든 DB 작업과 특정 DB ìž‘ì—…ì€ ë™ì‹œì— í•  수 없습니다." -#: clusterdb.c:149 -#, c-format -msgid "cannot cluster specific table(s) in all databases" -msgstr "모든 DB를 대ìƒìœ¼ë¡œ 특정 í…Œì´ë¸”ë“¤ì„ í´ëŸ¬ìŠ¤í„°í•  수 ì—†ìŒ" - -#: clusterdb.c:217 +#: clusterdb.c:214 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "\"%s\" í…Œì´ë¸”(해당DB: \"%s\") í´ëŸ¬ìŠ¤í„° 작업 실패: %s" -#: clusterdb.c:220 +#: clusterdb.c:217 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„° 실패: %s" -#: clusterdb.c:253 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: \"%s\" ë°ì´í„°ë² ì´ìФ í´ëŸ¬ìŠ¤í„° 작업 중\n" @@ -143,19 +257,19 @@ msgstr "" "다시 í´ëŸ¬ìŠ¤í„° ìž‘ì—…ì„ í•©ë‹ˆë‹¤.\n" "\n" -#: clusterdb.c:275 createdb.c:259 createuser.c:347 dropdb.c:164 dropuser.c:163 -#: pg_isready.c:224 reindexdb.c:753 vacuumdb.c:921 +#: clusterdb.c:275 createdb.c:298 createuser.c:415 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:872 vacuumdb.c:1158 #, c-format msgid "Usage:\n" msgstr "사용법:\n" -#: clusterdb.c:276 reindexdb.c:754 vacuumdb.c:922 +#: clusterdb.c:276 reindexdb.c:873 vacuumdb.c:1159 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [옵션]... [DBì´ë¦„]\n" -#: clusterdb.c:277 createdb.c:261 createuser.c:349 dropdb.c:166 dropuser.c:165 -#: pg_isready.c:227 reindexdb.c:755 vacuumdb.c:923 +#: clusterdb.c:277 createdb.c:300 createuser.c:417 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:874 vacuumdb.c:1160 #, c-format msgid "" "\n" @@ -174,13 +288,13 @@ msgstr " -a, --all 모든 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 대ìƒìœ¼ë¡œ\n" msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=DBNAME í´ëŸ¬ìŠ¤í„° 작업할 DB\n" -#: clusterdb.c:280 createuser.c:353 dropdb.c:167 dropuser.c:166 reindexdb.c:759 +#: clusterdb.c:280 createuser.c:423 dropdb.c:175 dropuser.c:173 #, c-format msgid "" " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo 서버로 보내는 작업 ëª…ë ¹ì„ ë³´ì—¬ì¤Œ\n" -#: clusterdb.c:281 reindexdb.c:762 +#: clusterdb.c:281 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet 어떠한 ë©”ì‹œì§€ë„ ë³´ì—¬ì£¼ì§€ 않ìŒ\n" @@ -190,23 +304,23 @@ msgstr " -q, --quiet 어떠한 ë©”ì‹œì§€ë„ ë³´ì—¬ì£¼ì§€ 않ìŒ\n msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=TABLE 지정한 í…Œì´ë¸”들만 í´ëŸ¬ìŠ¤í„°\n" -#: clusterdb.c:283 reindexdb.c:766 +#: clusterdb.c:283 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose ë§Žì€ ì¶œë ¥ 작성\n" -#: clusterdb.c:284 createuser.c:365 dropdb.c:170 dropuser.c:169 reindexdb.c:767 +#: clusterdb.c:284 createuser.c:439 dropdb.c:178 dropuser.c:176 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: clusterdb.c:285 createuser.c:370 dropdb.c:172 dropuser.c:171 reindexdb.c:768 +#: clusterdb.c:285 createuser.c:447 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: clusterdb.c:286 createdb.c:272 createuser.c:371 dropdb.c:173 dropuser.c:172 -#: pg_isready.c:233 reindexdb.c:769 vacuumdb.c:944 +#: clusterdb.c:286 createdb.c:317 createuser.c:448 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:889 vacuumdb.c:1189 #, c-format msgid "" "\n" @@ -215,37 +329,33 @@ msgstr "" "\n" "ì—°ê²° 옵션들:\n" -#: clusterdb.c:287 createuser.c:372 dropdb.c:174 dropuser.c:173 reindexdb.c:770 -#: vacuumdb.c:945 +#: clusterdb.c:287 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1190 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HOSTNAME ë°ì´í„°ë² ì´ìФ 서버 호스트 ë˜ëŠ” 소켓 디렉터리\n" -#: clusterdb.c:288 createuser.c:373 dropdb.c:175 dropuser.c:174 reindexdb.c:771 -#: vacuumdb.c:946 +#: clusterdb.c:288 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1191 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT ë°ì´í„°ë² ì´ìФ 서버 í¬íЏ\n" -#: clusterdb.c:289 dropdb.c:176 reindexdb.c:772 vacuumdb.c:947 +#: clusterdb.c:289 dropdb.c:184 vacuumdb.c:1192 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME ì ‘ì†í•  사용ìžì´ë¦„\n" -#: clusterdb.c:290 createuser.c:375 dropdb.c:177 dropuser.c:176 reindexdb.c:773 -#: vacuumdb.c:948 +#: clusterdb.c:290 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1193 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n" -#: clusterdb.c:291 createuser.c:376 dropdb.c:178 dropuser.c:177 reindexdb.c:774 -#: vacuumdb.c:949 +#: clusterdb.c:291 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1194 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password 암호 프롬프트 표시함\n" -#: clusterdb.c:292 dropdb.c:179 reindexdb.c:775 vacuumdb.c:950 +#: clusterdb.c:292 dropdb.c:187 vacuumdb.c:1195 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME 대체용 관리 ëŒ€ìƒ ë°ì´í„°ë² ì´ìФ\n" @@ -259,8 +369,8 @@ msgstr "" "\n" "보다 ìžì„¸í•œ ë‚´ìš©ì€ CLUSTER SQL 명령어 설명서를 참조하십시오.\n" -#: clusterdb.c:294 createdb.c:280 createuser.c:377 dropdb.c:180 dropuser.c:178 -#: pg_isready.c:238 reindexdb.c:777 vacuumdb.c:952 +#: clusterdb.c:294 createdb.c:325 createuser.c:454 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:897 vacuumdb.c:1197 #, c-format msgid "" "\n" @@ -269,95 +379,56 @@ msgstr "" "\n" "ë¬¸ì œì  ë³´ê³  주소: <%s>\n" -#: clusterdb.c:295 createdb.c:281 createuser.c:378 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:239 reindexdb.c:778 vacuumdb.c:953 +#: clusterdb.c:295 createdb.c:326 createuser.c:455 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:898 vacuumdb.c:1198 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페ì´ì§€: <%s>\n" -#: common.c:79 common.c:125 -msgid "Password: " -msgstr "암호:" - -#: common.c:112 -#, c-format -msgid "could not connect to database %s: out of memory" -msgstr "%s ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²° í•  수 ì—†ìŒ: 메모리 부족" - -#: common.c:139 -#, c-format -msgid "could not connect to database %s: %s" -msgstr "%s ë°ì´í„°ë² ì´ìŠ¤ì— ì—°ê²° í•  수 ì—†ìŒ: %s" - -#: common.c:214 common.c:239 -#, c-format -msgid "query failed: %s" -msgstr "쿼리 실패: %s" - -#: common.c:215 common.c:240 -#, c-format -msgid "query was: %s" -msgstr "사용한 쿼리: %s" - -#: common.c:312 -#, c-format -msgid "processing of database \"%s\" failed: %s" -msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ 작업 실패: %s" - -#: common.c:406 +#: common.c:107 #, c-format msgid "query returned %d row instead of one: %s" msgid_plural "query returned %d rows instead of one: %s" msgstr[0] "쿼리ì—서 한 개가 아닌 %dê°œì˜ í–‰ì„ ë°˜í™˜: %s" #. translator: abbreviation for "yes" -#: common.c:430 +#: common.c:131 msgid "y" msgstr "y" #. translator: abbreviation for "no" -#: common.c:432 +#: common.c:133 msgid "n" msgstr "n" #. translator: This is a question followed by the translated options for #. "yes" and "no". -#: common.c:442 +#: common.c:143 #, c-format msgid "%s (%s/%s) " msgstr "%s (%s/%s) " -#: common.c:456 +#: common.c:164 #, c-format msgid "Please answer \"%s\" or \"%s\".\n" msgstr "\"%s\" ë˜ëŠ” \"%s\" ë§Œ 허용합니다.\n" -#: createdb.c:148 -#, c-format -msgid "only one of --locale and --lc-ctype can be specified" -msgstr "--locale ë° --lc-ctype 중 하나만 지정할 수 있ìŒ" - -#: createdb.c:153 -#, c-format -msgid "only one of --locale and --lc-collate can be specified" -msgstr "--locale ë° --lc-collate 중 하나만 지정할 수 있ìŒ" - -#: createdb.c:164 +#: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" ì´ë¦„ì€ ìž˜ëª»ëœ ì¸ì½”딩 ì´ë¦„ìž„" -#: createdb.c:221 +#: createdb.c:260 #, c-format msgid "database creation failed: %s" msgstr "ë°ì´í„°ë² ì´ìФ 만들기 실패: %s" -#: createdb.c:240 +#: createdb.c:279 #, c-format msgid "comment creation failed (database was created): %s" msgstr "코멘트 추가하기 실패 (ë°ì´í„°ë² ì´ìŠ¤ëŠ” 만들어졌ìŒ): %s" -#: createdb.c:258 +#: createdb.c:297 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -366,96 +437,131 @@ msgstr "" "%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만듭니다.\n" "\n" -#: createdb.c:260 +#: createdb.c:299 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [옵션]... [DBì´ë¦„] [설명]\n" -#: createdb.c:262 +#: createdb.c:301 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr "" " -D, --tablespace=TABLESPACE ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 위한 기본 í…Œì´ë¸”스페ì´ìФ\n" -#: createdb.c:263 +#: createdb.c:302 reindexdb.c:878 #, c-format msgid "" " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo 서버로 보내는 작업 ëª…ë ¹ë“¤ì„ ë³´ì—¬ì¤Œ\n" -#: createdb.c:264 +#: createdb.c:303 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=ENCODING ë°ì´í„°ë² ì´ìФ ì¸ì½”딩\n" -#: createdb.c:265 +#: createdb.c:304 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOCALE ë°ì´í„°ë² ì´ìŠ¤ì˜ ë¡œìº˜ 설정\n" -#: createdb.c:266 +#: createdb.c:305 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOCALE ë°ì´í„°ë² ì´ìŠ¤ì˜ LC_COLLATE 설정\n" -#: createdb.c:267 +#: createdb.c:306 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOCALE ë°ì´í„°ë² ì´ìŠ¤ì˜ LC_CTYPE 설정\n" -#: createdb.c:268 +#: createdb.c:307 +#, c-format +msgid "" +" --builtin-locale=LOCALE builtin locale setting for the database\n" +msgstr " --builtin-locale=LOCALE ë°ì´í„°ë² ì´ìФ 내장 ë¡œì¼€ì¼ ì„¤ì •\n" + +#: createdb.c:308 +#, c-format +msgid " --icu-locale=LOCALE ICU locale setting for the database\n" +msgstr " --icu-locale=LOCALE ë°ì´í„°ë² ì´ìФ ICU 로캘 설정\n" + +#: createdb.c:309 +#, c-format +msgid " --icu-rules=RULES ICU rules setting for the database\n" +msgstr " --icu-rules=RULES ë°ì´í„°ë² ì´ìФ ICU 룰 설정\n" + +#: createdb.c:310 +#, c-format +msgid "" +" --locale-provider={builtin|libc|icu}\n" +" locale provider for the database's default " +"collation\n" +msgstr "" +" --locale-provider={builtin|libc|icu}\n" +" ë°ì´í„°ë² ì´ìФ 기본 ë¬¸ìž ì •ë ¬ ì œê³µìž ì„¤ì •\n" + +#: createdb.c:312 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=OWNER ë°ì´í„°ë² ì´ìФ 소유주\n" -#: createdb.c:269 +#: createdb.c:313 +#, c-format +msgid "" +" -S, --strategy=STRATEGY database creation strategy wal_log or " +"file_copy\n" +msgstr "" +" -S, --strategy=STRATEGY ë°ì´í„°ë² ì´ìФ 만드는 ì „ëžµ(wal_log ë˜ëŠ” " +"file_copy)\n" + +#: createdb.c:314 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=TEMPLATE 복사할 템플릿 ë°ì´í„°ë² ì´ìФ\n" -#: createdb.c:270 +#: createdb.c:315 reindexdb.c:887 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: createdb.c:271 +#: createdb.c:316 reindexdb.c:888 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: createdb.c:273 +#: createdb.c:318 reindexdb.c:890 #, c-format msgid "" " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HOSTNAME ë°ì´í„°ë² ì´ìФ 서버 호스트나 소켓 디렉터리\n" -#: createdb.c:274 +#: createdb.c:319 reindexdb.c:891 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT ë°ì´í„°ë² ì´ìФ 서버 í¬íЏ\n" -#: createdb.c:275 +#: createdb.c:320 reindexdb.c:892 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME ì ‘ì†í•  사용ìž\n" -#: createdb.c:276 +#: createdb.c:321 reindexdb.c:893 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password 암호 프롬프트 표시 안 함\n" -#: createdb.c:277 +#: createdb.c:322 reindexdb.c:894 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password 암호 프롬프트 표시함\n" -#: createdb.c:278 +#: createdb.c:323 reindexdb.c:895 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME 대체용 관리 ëŒ€ìƒ ë°ì´í„°ë² ì´ìФ\n" -#: createdb.c:279 +#: createdb.c:324 #, c-format msgid "" "\n" @@ -465,51 +571,46 @@ msgstr "" "초기값으로, DBì´ë¦„ì„ ì§€ì •í•˜ì§€ 않으면, 현재 사용ìžì˜ ì´ë¦„ê³¼ ê°™ì€ ë°ì´í„°ë² ì´ìФ" "ê°€ 만들어집니다.\n" -#: createuser.c:150 -#, c-format -msgid "invalid value for --connection-limit: %s" -msgstr "--connection-limit 옵션 ê°’ì´ ìž˜ëª»ë¨: %s" - -#: createuser.c:194 +#: createuser.c:218 msgid "Enter name of role to add: " msgstr "추가할 새 롤(role)ì´ë¦„: " -#: createuser.c:211 +#: createuser.c:233 msgid "Enter password for new role: " msgstr "새 ë¡¤ì˜ ì•”í˜¸: " -#: createuser.c:213 +#: createuser.c:234 msgid "Enter it again: " msgstr "암호 확ì¸: " -#: createuser.c:216 +#: createuser.c:237 #, c-format msgid "Passwords didn't match.\n" msgstr "암호가 서로 틀림.\n" -#: createuser.c:224 +#: createuser.c:245 msgid "Shall the new role be a superuser?" msgstr "새 ë¡¤ì„ superuser 권한으로 지정할까요?" -#: createuser.c:239 +#: createuser.c:260 msgid "Shall the new role be allowed to create databases?" msgstr "ì´ ìƒˆ 롤ì—게 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만들 수 있는 ê¶Œí• ì„ ì¤„ê¹Œìš”?" -#: createuser.c:247 +#: createuser.c:268 msgid "Shall the new role be allowed to create more new roles?" msgstr "ì´ ìƒˆ 롤ì—게 ë˜ ë‹¤ë¥¸ ë¡¤ì„ ë§Œë“¤ 수 있는 ê¶Œí•œì„ ì¤„ê¹Œìš”?" -#: createuser.c:277 +#: createuser.c:309 #, c-format msgid "password encryption failed: %s" msgstr "암호 암호화 실패: %s" -#: createuser.c:332 +#: createuser.c:400 #, c-format msgid "creation of new role failed: %s" msgstr "새 롤 만들기 실패: %s" -#: createuser.c:346 +#: createuser.c:414 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -518,34 +619,48 @@ msgstr "" "%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë¡¤ì„ ë§Œë“­ë‹ˆë‹¤.\n" "\n" -#: createuser.c:348 dropuser.c:164 +#: createuser.c:416 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [옵션]... [롤ì´ë¦„]\n" -#: createuser.c:350 +#: createuser.c:418 +#, c-format +msgid "" +" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n" +" option\n" +msgstr "" +" -a, --with-admin=ROLE 지정한 ë¡¤ì´ ìƒˆë¡œ 만들어질 ë¡¤ì˜ ê´€ë¦¬ 권한있는\n" +" 소ì†ì›ì´ ë¨\n" + +#: createuser.c:420 #, c-format msgid "" " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr " -c, --connection-limit=N ì—°ê²° 제한 수 (초기값: 무제한)\n" -#: createuser.c:351 +#: createuser.c:421 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb 새 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만들 수 있ìŒ\n" -#: createuser.c:352 +#: createuser.c:422 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr "" " -D, --no-createdb ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 만들 수 있는 권한 ì—†ìŒ (초기값)\n" -#: createuser.c:354 +#: createuser.c:424 +#, c-format +msgid " -g, --member-of=ROLE new role will be a member of ROLE\n" +msgstr " -g, --member-of=ROLE 만들어지는 ë¡¤ì´ ì´ ROLEì˜ êµ¬ì„±ì›ì´ ë¨\n" + +#: createuser.c:425 #, c-format -msgid " -g, --role=ROLE new role will be a member of this role\n" -msgstr " -g, --role=ROLE 만들어지는 ë¡¤ì´ ì´ ë¡¤ì˜ êµ¬ì„±ì›ì´ ë¨\n" +msgid " --role=ROLE (same as --member-of, deprecated)\n" +msgstr " --role=ROLE (--member-of와 ê°™ìŒ, 옛날 옵션)\n" -#: createuser.c:355 +#: createuser.c:426 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -554,47 +669,61 @@ msgstr "" " -i, --inherit ë¡¤ì˜ ê¶Œí•œì„ ìƒì†í•  수 있ìŒ\n" " (초기값)\n" -#: createuser.c:357 +#: createuser.c:428 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit ì´ ë¡¤ì˜ ê¶Œí•œì„ ìƒì†í•  수 ì—†ìŒ\n" -#: createuser.c:358 +#: createuser.c:429 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login ë¡œê·¸ì¸ í—ˆìš© (초기값)\n" -#: createuser.c:359 +#: createuser.c:430 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login ë¡œê·¸ì¸ í•  수 ì—†ìŒ\n" -#: createuser.c:360 +#: createuser.c:431 +#, c-format +msgid " -m, --with-member=ROLE ROLE will be a member of new role\n" +msgstr " -m, --with-member=ROLE ROLEì´ ìƒˆë¡œ 만들 ë¡¤ì˜ ì†Œì†ì›ì´ ë¨\n" + +#: createuser.c:432 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt 새 ë¡¤ì˜ ì•”í˜¸ 지정\n" -#: createuser.c:361 +#: createuser.c:433 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole 새 ë¡¤ì„ ë§Œë“¤ 수 있ìŒ\n" -#: createuser.c:362 +#: createuser.c:434 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole 롤 만들 수 있는 권한 ì—†ìŒ (초기값)\n" -#: createuser.c:363 +#: createuser.c:435 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser superuser 권한으로 지정\n" -#: createuser.c:364 +#: createuser.c:436 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr " -S, --no-superuser 슈í¼ìœ ì € 권한 ì—†ìŒ (초기값)\n" -#: createuser.c:366 +#: createuser.c:437 +#, c-format +msgid "" +" -v, --valid-until=TIMESTAMP\n" +" password expiration date and time for role\n" +msgstr "" +" -v, --valid-until=TIMESTAMP\n" +" 비밀번호 유효기한 지정\n" + +#: createuser.c:440 #, c-format msgid "" " --interactive prompt for missing role name and attributes " @@ -604,17 +733,34 @@ msgstr "" " --interactive 롤 ì´ë¦„ê³¼ ì†ì„±ì„ ì´ˆê¸°ê°’ì„ ì“°ì§€ 않고\n" " ê°ê° ì§ì ‘ ìž…ë ¥ ì„ íƒ í•¨\n" -#: createuser.c:368 +#: createuser.c:442 +#, c-format +msgid "" +" --bypassrls role can bypass row-level security (RLS) policy\n" +msgstr " --bypassrls ë¡¤ì´ í–‰ 단위 보안 (RLS) ì •ì±…ì„ ë¬´ì‹œí•¨\n" + +#: createuser.c:443 +#, c-format +msgid "" +" --no-bypassrls role cannot bypass row-level security (RLS) " +"policy\n" +" (default)\n" +msgstr "" +" --no-bypassrls ë¡¤ì´ í–‰ 단위 보안 (RLS) ì •ì±…ì„ ë¬´ì‹œ 못함\n" +" (기본값)\n" + +#: createuser.c:445 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication 복제 기능 ì´ìš©í•  수 있는 롤\n" -#: createuser.c:369 +#: createuser.c:446 #, c-format -msgid " --no-replication role cannot initiate replication\n" -msgstr " --no-replication 복제 ê¸°ëŠ¥ì„ ì´ìš©í•  수 ì—†ìŒ\n" +msgid "" +" --no-replication role cannot initiate replication (default)\n" +msgstr " --no-replication 복제 권한 ì—†ìŒ (기본값)\n" -#: createuser.c:374 +#: createuser.c:451 #, c-format msgid "" " -U, --username=USERNAME user name to connect as (not the one to create)\n" @@ -622,26 +768,26 @@ msgstr "" " -U, --username=USERNAME ì„œë²„ì— ì ‘ì†í•  사용ìž\n" " (사용ìžë§Œë“¤ê¸° ìž‘ì—…ì„ í•  사용ìž)\n" -#: dropdb.c:109 +#: dropdb.c:112 #, c-format msgid "missing required argument database name" msgstr "필수 í•­ëª©ì¸ ë°ì´í„°ë² ì´ìФ ì´ë¦„ì´ ë¹ ì¡ŒìŠµë‹ˆë‹¤" -#: dropdb.c:124 +#: dropdb.c:127 #, c-format msgid "Database \"%s\" will be permanently removed.\n" msgstr "\"%s\" ë°ì´í„°ë² ì´ìŠ¤ê°€ 완전히 ì‚­ì œ ë  ê²ƒìž…ë‹ˆë‹¤.\n" -#: dropdb.c:125 dropuser.c:130 +#: dropdb.c:128 dropuser.c:131 msgid "Are you sure?" msgstr "ì •ë§ ê³„ì† í• ê¹Œìš”? (y/n) " -#: dropdb.c:149 +#: dropdb.c:157 #, c-format msgid "database removal failed: %s" msgstr "ë°ì´í„°ë² ì´ìФ ì‚­ì œ 실패: %s" -#: dropdb.c:163 +#: dropdb.c:171 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -650,51 +796,50 @@ msgstr "" "%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 삭제합니다.\n" "\n" -#: dropdb.c:165 +#: dropdb.c:173 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [옵션]... DBì´ë¦„\n" -#: dropdb.c:168 +#: dropdb.c:176 #, c-format msgid "" " -f, --force try to terminate other connections before " "dropping\n" -msgstr "" -" -f, --force ì‚­ì œ ì „ì— ì ‘ì†í•œ 다른 세션들 강제로 ëŠìŒ\n" +msgstr " -f, --force ì‚­ì œ ì „ì— ì ‘ì†í•œ 다른 세션들 강제로 ëŠìŒ\n" -#: dropdb.c:169 +#: dropdb.c:177 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive 지우기 ì „ì— í•œ 번 ë” ë¬¼ì–´ë´„\n" -#: dropdb.c:171 +#: dropdb.c:179 #, c-format msgid "" " --if-exists don't report error if database doesn't exist\n" msgstr "" " --if-exists 해당 ë°ì´í„°ë² ì´ìŠ¤ê°€ ì—†ì–´ë„ ì˜¤ë¥˜ë¥¼ 보고하지 않ìŒ\n" -#: dropuser.c:115 +#: dropuser.c:118 msgid "Enter name of role to drop: " msgstr "삭제할 롤 ì´ë¦„ì„ ìž…ë ¥í•˜ì‹­ì‹œì˜¤: " -#: dropuser.c:121 +#: dropuser.c:122 #, c-format msgid "missing required argument role name" msgstr "롤 ì´ë¦„ì€ í•„ìˆ˜ ìž…ë ¥ ì¸ìžìž…니다" -#: dropuser.c:129 +#: dropuser.c:130 #, c-format msgid "Role \"%s\" will be permanently removed.\n" msgstr "\"%s\" ë¡¤ì€ ì˜êµ¬ížˆ ì‚­ì œë  ê²ƒìž…ë‹ˆë‹¤.\n" -#: dropuser.c:147 +#: dropuser.c:154 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "\"%s\" 롤 ì‚­ì œ 실패: %s" -#: dropuser.c:162 +#: dropuser.c:169 #, c-format msgid "" "%s removes a PostgreSQL role.\n" @@ -703,7 +848,7 @@ msgstr "" "%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë¡¤ì„ ì‚­ì œí•©ë‹ˆë‹¤.\n" "\n" -#: dropuser.c:167 +#: dropuser.c:174 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -712,53 +857,48 @@ msgstr "" " -i, --interactive 롤 ì´ë¦„ì„ ìž…ë ¥í•˜ì§€ 않았다면,\n" " 해당 ì´ë¦„ì„ ë¬¼ì–´ë´„\n" -#: dropuser.c:170 +#: dropuser.c:177 #, c-format msgid " --if-exists don't report error if user doesn't exist\n" msgstr " --if-exists 해당 ë¡¤ì´ ì—†ì–´ë„ ì˜¤ë¥˜ë¥¼ 보고하지 않ìŒ\n" -#: dropuser.c:175 +#: dropuser.c:182 #, c-format msgid "" " -U, --username=USERNAME user name to connect as (not the one to drop)\n" msgstr " -U, --username=USERNAME ì´ ìž‘ì—…ì„ ì§„í–‰í•  DBì— ì ‘ì†í•  사용ìž\n" -#: pg_isready.c:144 -#, c-format -msgid "%s" -msgstr "%s" - -#: pg_isready.c:152 +#: pg_isready.c:154 #, c-format msgid "could not fetch default options" msgstr "기본 옵션 ê°’ì„ ê°€ì ¸ì˜¬ 수 ì—†ìŒ" -#: pg_isready.c:201 +#: pg_isready.c:203 #, c-format msgid "accepting connections\n" msgstr "ì ‘ì†ì„ 받아드리는 중\n" -#: pg_isready.c:204 +#: pg_isready.c:206 #, c-format msgid "rejecting connections\n" msgstr "ì ‘ì†ì„ 거절하는 중\n" -#: pg_isready.c:207 +#: pg_isready.c:209 #, c-format msgid "no response\n" msgstr "ì‘답 ì—†ìŒ\n" -#: pg_isready.c:210 +#: pg_isready.c:212 #, c-format msgid "no attempt\n" msgstr "ì‹œë„ ì—†ìŒ\n" -#: pg_isready.c:213 +#: pg_isready.c:215 #, c-format msgid "unknown\n" msgstr "알수없ìŒ\n" -#: pg_isready.c:223 +#: pg_isready.c:225 #, c-format msgid "" "%s issues a connection check to a PostgreSQL database.\n" @@ -767,163 +907,105 @@ msgstr "" "%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë°ì´í„°ë² ì´ìФ ì ‘ì†ì„ 검사합니다.\n" "\n" -#: pg_isready.c:225 +#: pg_isready.c:227 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [옵션]...\n" -#: pg_isready.c:228 +#: pg_isready.c:230 #, c-format msgid " -d, --dbname=DBNAME database name\n" msgstr " -d, --dbname=DBNAME ë°ì´í„°ë² ì´ìФ ì´ë¦„\n" -#: pg_isready.c:229 +#: pg_isready.c:231 #, c-format msgid " -q, --quiet run quietly\n" msgstr " -q, --quiet 조용히 실행함\n" -#: pg_isready.c:230 +#: pg_isready.c:232 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: pg_isready.c:231 +#: pg_isready.c:233 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: pg_isready.c:234 +#: pg_isready.c:236 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HOSTNAME ì ‘ì†í•  ë°ì´í„°ë² ì´ìФ 서버 ë˜ëŠ” 소켓 디렉터리\n" -#: pg_isready.c:235 +#: pg_isready.c:237 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT ë°ì´í„°ë² ì´ìФ 서버 í¬íЏ\n" -#: pg_isready.c:236 +#: pg_isready.c:238 #, c-format msgid "" " -t, --timeout=SECS seconds to wait when attempting connection, 0 " "disables (default: %s)\n" msgstr " -t, --timeout=ì´ˆ ì—°ê²° 제한 시간, 0 무제한 (초기값: %s)\n" -#: pg_isready.c:237 +#: pg_isready.c:239 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=USERNAME ì ‘ì†í•  사용ìžì´ë¦„\n" -#: reindexdb.c:154 vacuumdb.c:186 +#: reindexdb.c:210 #, c-format -msgid "number of parallel jobs must be at least 1" -msgstr "병렬 작업 숫ìžëŠ” 최소 1ì´ì–´ì•¼ 함" +msgid "cannot use multiple jobs to reindex system catalogs" +msgstr "시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë³‘ë ¬ë¡œ 처리할 수 ì—†ìŒ" -#: reindexdb.c:197 +#: reindexdb.c:215 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "" "모든 ë°ì´í„°ë² ì´ìФ ìž¬ìƒ‰ì¸ ìž‘ì—…ê³¼ 특정 ë°ì´í„°ë² ì´ìФ ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— ì§„í–‰" "í•  수 없습니다" -#: reindexdb.c:202 -#, c-format -msgid "cannot reindex all databases and system catalogs at the same time" -msgstr "" -"모든 ë°ì´í„°ë² ì´ìФ ìž¬ìƒ‰ì¸ ìž‘ì—…ê³¼ 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— 진행할 " -"수 없습니다" - -#: reindexdb.c:207 -#, c-format -msgid "cannot reindex specific schema(s) in all databases" -msgstr "" -"모든 ë°ì´í„°ë² ì´ìФ ìž¬ìƒ‰ì¸ ìž‘ì—…ì—서 특정 ìŠ¤í‚¤ë§ˆë“¤ì˜ ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ ì§€ì •í•  수 ì—†" -"습니다" - -#: reindexdb.c:212 -#, c-format -msgid "cannot reindex specific table(s) in all databases" -msgstr "" -"모든 ë°ì´í„°ë² ì´ìФ ìž¬ìƒ‰ì¸ ìž‘ì—…ì—서 특정 í…Œì´ë¸”ì˜ ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ ì§€ì •í•  수 없습" -"니다" - -#: reindexdb.c:217 -#, c-format -msgid "cannot reindex specific index(es) in all databases" -msgstr "" -"모든 ë°ì´í„°ë² ì´ìФ ìž¬ìƒ‰ì¸ ìž‘ì—…ì—서 특정 ì¸ë±ìФ ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ ì§€ì •í•  수 없습니" -"다" - -#: reindexdb.c:229 -#, c-format -msgid "cannot reindex specific schema(s) and system catalogs at the same time" -msgstr "특정 스키마와 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— 진행할 수 없습니다" - -#: reindexdb.c:234 -#, c-format -msgid "cannot reindex specific table(s) and system catalogs at the same time" -msgstr "특정 í…Œì´ë¸”ê³¼ 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— 진행할 수 없습니다" - -#: reindexdb.c:239 -#, c-format -msgid "cannot reindex specific index(es) and system catalogs at the same time" -msgstr "특정 ì¸ë±ìŠ¤ì™€ 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— 진행할 수 없습니다" - -#: reindexdb.c:245 -#, c-format -msgid "cannot use multiple jobs to reindex system catalogs" -msgstr "시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë³‘ë ¬ë¡œ 처리할 수 ì—†ìŒ" - -#: reindexdb.c:272 -#, c-format -msgid "cannot use multiple jobs to reindex indexes" -msgstr "ì¸ë±ìФ 다시 만들기ì—서는 다중 ìž‘ì—…ì„ ì‚¬ìš©í•  수 ì—†ìŒ" - -#: reindexdb.c:337 vacuumdb.c:410 vacuumdb.c:418 vacuumdb.c:425 vacuumdb.c:432 -#: vacuumdb.c:439 +#: reindexdb.c:296 reindexdb.c:303 vacuumdb.c:514 vacuumdb.c:521 vacuumdb.c:528 +#: vacuumdb.c:535 vacuumdb.c:542 vacuumdb.c:549 vacuumdb.c:556 vacuumdb.c:561 +#: vacuumdb.c:565 vacuumdb.c:569 vacuumdb.c:573 #, c-format msgid "" "cannot use the \"%s\" option on server versions older than PostgreSQL %s" -msgstr "" -"\"%s\" ì˜µì…˜ì€ PostgreSQL %s 버전보다 ì˜¤ëž˜ëœ ì„œë²„ì—서는 사용할 수 ì—†ìŒ" - -#: reindexdb.c:377 -#, c-format -msgid "cannot reindex system catalogs concurrently, skipping all" -msgstr "시스템 카탈로그 ì¸ë±ìŠ¤ëŠ” CONCURRENTLY 다시 만들기 못함, ëª¨ë‘ ê±´ë„ˆ 뜀" +msgstr "\"%s\" ì˜µì…˜ì€ PostgreSQL %s 버전보다 ì˜¤ëž˜ëœ ì„œë²„ì—서는 사용할 수 ì—†ìŒ" -#: reindexdb.c:558 +#: reindexdb.c:584 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ ìž¬ìƒ‰ì¸ ìž‘ì—… 실패: %s" -#: reindexdb.c:562 +#: reindexdb.c:588 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "\"%s\" ì¸ë±ìФ(해당DB: \"%s\") ìž¬ìƒ‰ì¸ ìž‘ì—… 실패: %s" -#: reindexdb.c:566 +#: reindexdb.c:592 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "\"%s\" 스키마(해당DB: \"%s\") ìž¬ìƒ‰ì¸ ìž‘ì—… 실패: %s" -#: reindexdb.c:570 +#: reindexdb.c:596 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—… 실패: %s" -#: reindexdb.c:574 +#: reindexdb.c:600 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "\"%s\" í…Œì´ë¸”(해당DB: \"%s\") ìž¬ìƒ‰ì¸ ìž‘ì—… 실패: %s" -#: reindexdb.c:731 +#: reindexdb.c:828 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: \"%s\" ë°ì´í„°ë² ì´ìФ ìž¬ìƒ‰ì¸ ìž‘ì—… 중\n" -#: reindexdb.c:752 +#: reindexdb.c:871 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -932,49 +1014,66 @@ msgstr "" "%s í”„ë¡œê·¸ëž¨ì€ PostgreSQL ë°ì´í„°ë² ì´ìФ ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ í•©ë‹ˆë‹¤.\n" "\n" -#: reindexdb.c:756 +#: reindexdb.c:875 #, c-format -msgid " -a, --all reindex all databases\n" -msgstr " -a, --all 모든 ë°ì´í„°ë² ì´ìФ 재색ì¸\n" +msgid " -a, --all reindex all databases\n" +msgstr " -a, --all 모든 ë°ì´í„°ë² ì´ìФ 재색ì¸\n" -#: reindexdb.c:757 +#: reindexdb.c:876 #, c-format -msgid " --concurrently reindex concurrently\n" -msgstr " --concurrently í…Œì´ë¸” 잠그지 않는 재색ì¸\n" +msgid " --concurrently reindex concurrently\n" +msgstr " --concurrently í…Œì´ë¸” 잠그지 않는 재색ì¸\n" -#: reindexdb.c:758 +#: reindexdb.c:877 #, c-format -msgid " -d, --dbname=DBNAME database to reindex\n" -msgstr " -d, --dbname=DBNAME 지정한 ë°ì´í„°ë² ì´ìŠ¤ì˜ ìž¬ìƒ‰ì¸ ìž‘ì—…\n" +msgid " -d, --dbname=DBNAME database to reindex\n" +msgstr " -d, --dbname=DBNAME 지정한 ë°ì´í„°ë² ì´ìŠ¤ì˜ ìž¬ìƒ‰ì¸ ìž‘ì—…\n" -#: reindexdb.c:760 +#: reindexdb.c:879 #, c-format -msgid " -i, --index=INDEX recreate specific index(es) only\n" -msgstr " -i, --index=INDEX 지정한 ì¸ë±ìŠ¤ë“¤ë§Œ 다시 만듬\n" +msgid " -i, --index=INDEX recreate specific index(es) only\n" +msgstr " -i, --index=INDEX 지정한 ì¸ë±ìŠ¤ë“¤ë§Œ 다시 만듬\n" -#: reindexdb.c:761 +#: reindexdb.c:880 #, c-format msgid "" -" -j, --jobs=NUM use this many concurrent connections to reindex\n" +" -j, --jobs=NUM use this many concurrent connections to " +"reindex\n" msgstr "" -" -j, --jobs=NUM ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ ì—¬ëŸ¬ê°œì˜ ì—°ê²°ë¡œ ë™ì‹œì— 작업함\n" +" -j, --jobs=NUM ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ ì—¬ëŸ¬ê°œì˜ ì—°ê²°ë¡œ ë™ì‹œì— 작업함\n" + +#: reindexdb.c:881 +#, c-format +msgid " -q, --quiet don't write any messages\n" +msgstr " -q, --quiet 어떠한 ë©”ì‹œì§€ë„ ë³´ì—¬ì£¼ì§€ 않ìŒ\n" + +#: reindexdb.c:882 +#, c-format +msgid " -s, --system reindex system catalogs only\n" +msgstr " -s, --system 시스템 카탈로그 재색ì¸\n" -#: reindexdb.c:763 +#: reindexdb.c:883 #, c-format -msgid " -s, --system reindex system catalogs\n" -msgstr " -s, --system 시스템 카탈로그 재색ì¸\n" +msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" +msgstr " -S, --schema=SCHEMA 지정한 스키마들 ìžë£Œë§Œ ë¤í”„\n" -#: reindexdb.c:764 +#: reindexdb.c:884 #, c-format -msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" -msgstr " -S, --schema=SCHEMA 지정한 스키마들 ìžë£Œë§Œ ë¤í”„\n" +msgid " -t, --table=TABLE reindex specific table(s) only\n" +msgstr " -t, --table=TABLE 지정한 í…Œì´ë¸”들만 ìž¬ìƒ‰ì¸ ìž‘ì—…\n" -#: reindexdb.c:765 +#: reindexdb.c:885 #, c-format -msgid " -t, --table=TABLE reindex specific table(s) only\n" -msgstr " -t, --table=TABLE 지정한 í…Œì´ë¸”들만 ìž¬ìƒ‰ì¸ ìž‘ì—…\n" +msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" +msgstr "" +" --tablespace=TABLESPACE ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 위한 기본 í…Œì´ë¸”스페ì´ìФ\n" + +#: reindexdb.c:886 +#, c-format +msgid " -v, --verbose write a lot of output\n" +msgstr " -v, --verbose ìž‘ì—…ë‚´ì—­ì˜ ìžì„¸í•œ 출력\n" -#: reindexdb.c:776 +#: reindexdb.c:896 #, c-format msgid "" "\n" @@ -983,80 +1082,87 @@ msgstr "" "\n" "보다 ìžì„¸í•œ ë‚´ìš©ì€ REINDEX SQL 명령어 설명서를 참조하십시오.\n" -#: scripts_parallel.c:234 +#: vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 vacuumdb.c:325 +#: vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:334 vacuumdb.c:343 #, c-format -msgid "too many jobs for this platform -- try %d" -msgstr "ì´ ìš´ì˜ì²´ì œì—서는 너무 ë§Žì€ ë™ì‹œ 작업임 -- %d 시ë„" +msgid "cannot use the \"%s\" option when performing only analyze" +msgstr "통계 수집 ì „ìš© 작업ì—서는 \"%s\" ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: vacuumdb.c:194 +#: vacuumdb.c:346 #, c-format -msgid "parallel vacuum degree must be a non-negative integer" -msgstr "병렬 vacuum ê°’ì€ 0 ì´ìƒ 정수형ì´ì–´ì•¼ 함" +msgid "cannot use the \"%s\" option when performing full vacuum" +msgstr "full vacuum 작업ì—서는 \"%s\" ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: vacuumdb.c:214 +#: vacuumdb.c:352 vacuumdb.c:360 #, c-format -msgid "minimum transaction ID age must be at least 1" -msgstr "트랜잭션 ID 나ì´ëŠ” 최소 1ì´ì–´ì•¼ 함" +msgid "cannot use the \"%s\" option with the \"%s\" option" +msgstr "\"%s\" 옵션과 \"%s\" ì˜µì…˜ì„ í•¨ê»˜ 사용할 수 ì—†ìŒ" -#: vacuumdb.c:222 +#: vacuumdb.c:432 #, c-format -msgid "minimum multixact ID age must be at least 1" -msgstr "multixact ID 나ì´ëŠ” 최소 1ì´ì–´ì•¼ 함" +msgid "cannot vacuum all databases and a specific one at the same time" +msgstr "" +"-a ì˜µì…˜ì´ ìžˆì„ ê²½ìš°ëŠ” 한 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 대ìƒìœ¼ë¡œ ìž‘ì—…ì„ ì§„í–‰í•  수 없습니다." -#: vacuumdb.c:254 vacuumdb.c:260 vacuumdb.c:266 vacuumdb.c:278 +#: vacuumdb.c:436 #, c-format -msgid "cannot use the \"%s\" option when performing only analyze" -msgstr "통계 수집 ì „ìš© 작업ì—서는 \"%s\" ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ" +msgid "" +"cannot vacuum all tables in schema(s) and specific table(s) at the same time" +msgstr "" +"스키마 ì•ˆì— ìžˆëŠ” 모든 í…Œì´ë¸”ì„ ì²­ì†Œí•˜ëŠ” 것과 특정 í…Œì´ë¸”ë§Œ 청소하는 ê²ƒì„ ë™ì‹œ" +"ì— í•  수 ì—†ìŒ" -#: vacuumdb.c:284 +#: vacuumdb.c:440 #, c-format -msgid "cannot use the \"%s\" option when performing full vacuum" -msgstr "full vacuum 작업ì—서는 \"%s\" ì˜µì…˜ì„ ì‚¬ìš©í•  수 ì—†ìŒ" +msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time" +msgstr "특정 í…Œì´ë¸”ë§Œ 청소하는 것과 스키마를 제외하는 ê²ƒì€ ë™ì‹œì— í•  수 ì—†ìŒ" -#: vacuumdb.c:300 +#: vacuumdb.c:444 #, c-format -msgid "cannot vacuum all databases and a specific one at the same time" +msgid "" +"cannot vacuum all tables in schema(s) and exclude schema(s) at the same time" msgstr "" -"-a ì˜µì…˜ì´ ìžˆì„ ê²½ìš°ëŠ” 한 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 대ìƒìœ¼ë¡œ ìž‘ì—…ì„ ì§„í–‰í•  수 없습니다." +"스키마 안 모든 í…Œì´ë¸”ë§Œ 청소하는 것과 스키마를 제외하는 ê²ƒì€ ë™ì‹œì— í•  수 ì—†" +"ìŒ" -#: vacuumdb.c:305 +#: vacuumdb.c:457 #, c-format -msgid "cannot vacuum specific table(s) in all databases" -msgstr "모든 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 대ìƒìœ¼ë¡œ 특정 í…Œì´ë¸”ë“¤ì„ ì²­ì†Œí•  수는 ì—†ìŒ" +msgid "out of memory" +msgstr "메모리 부족" -#: vacuumdb.c:396 +#: vacuumdb.c:501 msgid "Generating minimal optimizer statistics (1 target)" msgstr "최소 최ì í™” 통계 수집 수행 중 (1% 대ìƒ)" -#: vacuumdb.c:397 +#: vacuumdb.c:502 msgid "Generating medium optimizer statistics (10 targets)" msgstr "ì¼ë°˜ 최ì í™” 통계 수집 수행 중 (10% 대ìƒ)" -#: vacuumdb.c:398 +#: vacuumdb.c:503 msgid "Generating default (full) optimizer statistics" msgstr "최대 최ì í™” 통계 수집 수행중 (모든 ìžë£Œ 대ìƒ)" -#: vacuumdb.c:447 +#: vacuumdb.c:582 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: \"%s\" ë°ì´í„°ë² ì´ìФ 작업 중: %s\n" -#: vacuumdb.c:450 +#: vacuumdb.c:585 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: \"%s\" ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 청소 중\n" -#: vacuumdb.c:909 +#: vacuumdb.c:1146 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "\"%s\" í…Œì´ë¸” (해당 DB: \"%s\") 청소하기 실패: %s" -#: vacuumdb.c:912 +#: vacuumdb.c:1149 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "\"%s\" ë°ì´í„°ë² ì´ìФ 청소하기 실패: %s" -#: vacuumdb.c:920 +#: vacuumdb.c:1157 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1066,39 +1172,52 @@ msgstr "" "퀴리 최ì í™”ê¸°ì˜ ì°¸ê³  ìžë£Œë¥¼ 갱신합니다.\n" "\n" -#: vacuumdb.c:924 +#: vacuumdb.c:1161 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all 모든 ë°ì´í„°ë² ì´ìФ 청소\n" -#: vacuumdb.c:925 +#: vacuumdb.c:1162 +#, c-format +msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n" +msgstr " --buffer-usage-limit=SIZE 청소를 위한 ë§ ë²„ì»¤ í¬ê¸°\n" + +#: vacuumdb.c:1163 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=DBNAME DBNAME ë°ì´í„°ë² ì´ìФ 청소\n" -#: vacuumdb.c:926 +#: vacuumdb.c:1164 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping 모든 page-skipping 기능 비활성화\n" -#: vacuumdb.c:927 +#: vacuumdb.c:1165 #, c-format msgid "" " -e, --echo show the commands being sent to the " "server\n" msgstr " -e, --echo 서버로 보내는 ëª…ë ¹ë“¤ì„ ë³´ì—¬ì¤Œ\n" -#: vacuumdb.c:928 +#: vacuumdb.c:1166 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full 대청소\n" -#: vacuumdb.c:929 +#: vacuumdb.c:1167 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze í–‰ 트랜잭션 ì •ë³´ ë™ê²°\n" -#: vacuumdb.c:930 +#: vacuumdb.c:1168 +#, c-format +msgid "" +" --force-index-cleanup always remove index entries that point to " +"dead tuples\n" +msgstr "" +" --force-index-cleanup ì‚­ì œëœ íŠœí”Œ ëŒ€ìƒ ì¸ë±ìФ 항목 í•­ìƒ ì‚­ì œ\n" + +#: vacuumdb.c:1169 #, c-format msgid "" " -j, --jobs=NUM use this many concurrent connections to " @@ -1106,7 +1225,7 @@ msgid "" msgstr "" " -j, --jobs=NUM 청소 ìž‘ì—…ì„ ì—¬ëŸ¬ê°œì˜ ì—°ê²°ë¡œ ë™ì‹œì— 작업함\n" -#: vacuumdb.c:931 +#: vacuumdb.c:1170 #, c-format msgid "" " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to " @@ -1114,7 +1233,7 @@ msgid "" msgstr "" " --min-mxid-age=MXID_AGE 청소할 í…Œì´ë¸”ì˜ ìµœì†Œ multixact ID 나ì´\n" -#: vacuumdb.c:932 +#: vacuumdb.c:1171 #, c-format msgid "" " --min-xid-age=XID_AGE minimum transaction ID age of tables to " @@ -1122,21 +1241,67 @@ msgid "" msgstr "" " --min-xid-age=XID_AGE 청소할 í…Œì´ë¸”ì˜ ìµœì†Œ 트랜잭션 ID 나ì´\n" -#: vacuumdb.c:933 +#: vacuumdb.c:1172 +#, c-format +msgid "" +" --no-index-cleanup don't remove index entries that point to " +"dead tuples\n" +msgstr "" +" --no-index-cleanup ì‚­ì œëœ íŠœí”Œ ëŒ€ìƒ ì¸ë±ìФ 항목 지우지 않ìŒ\n" + +#: vacuumdb.c:1173 +#, c-format +msgid " --no-process-main skip the main relation\n" +msgstr " --no-process-main ë©”ì¸ ë¦´ë ˆì´ì…˜ 건너뜀\n" + +#: vacuumdb.c:1174 +#, c-format +msgid "" +" --no-process-toast skip the TOAST table associated with the " +"table to vacuum\n" +msgstr "" +" --no-process-toast vacuum ëŒ€ìƒ í…Œì´ë¸”ê³¼ ê´€ë ¨ëœ TOAST í…Œì´ë¸” ê±´" +"너뜀\n" + +#: vacuumdb.c:1175 +#, c-format +msgid "" +" --no-truncate don't truncate empty pages at the end of " +"the table\n" +msgstr "" +" --no-truncate í…Œì´ë¸” ëì— ìžˆëŠ” 빈 페ì´ì§€ë¥¼ 지우지 않ìŒ\n" + +#: vacuumdb.c:1176 #, c-format msgid "" -" -P, --parallel=PARALLEL_DEGREE use this many background workers for " +" -n, --schema=SCHEMA vacuum tables in the specified schema(s) " +"only\n" +msgstr "" +" -n, --schema=SCHEMA 지정한 스키마 ì•ˆì— ìžˆëŠ” í…Œì´ë¸”ë§Œ 청소함\n" + +#: vacuumdb.c:1177 +#, c-format +msgid "" +" -N, --exclude-schema=SCHEMA do not vacuum tables in the specified " +"schema(s)\n" +msgstr "" +" -N, --exclude-schema=SCHEMA 지정한 스키마 ì•ˆì— ìžˆëŠ” í…Œì´ë¸”ë§Œ 청소안함\n" + +#: vacuumdb.c:1178 +#, c-format +msgid "" +" -P, --parallel=PARALLEL_WORKERS use this many background workers for " "vacuum, if available\n" msgstr "" " -P, --parallel=병렬작업수 vacuum ìž‘ì—…ì„ ë³‘ë ¬ë¡œ 처리 í•  수 있는 경우\n" " 백그ë¼ìš´ë“œ 작업 프로세스 수\n" -#: vacuumdb.c:934 +#: vacuumdb.c:1179 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet 어떠한 ë©”ì‹œì§€ë„ ë³´ì—¬ì£¼ì§€ 않ìŒ\n" -#: vacuumdb.c:935 +#: vacuumdb.c:1180 #, c-format msgid "" " --skip-locked skip relations that cannot be immediately " @@ -1144,28 +1309,28 @@ msgid "" msgstr "" " --skip-locked 즉시 잠글 수 없는 릴레ì´ì…˜ì€ 건너 뜀\n" -#: vacuumdb.c:936 +#: vacuumdb.c:1181 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr " -t, --table='TABLE[(COLUMNS)]' 지정한 특정 í…Œì´ë¸”들만 청소\n" -#: vacuumdb.c:937 +#: vacuumdb.c:1182 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose ìž‘ì—…ë‚´ì—­ì˜ ìžì„¸í•œ 출력\n" -#: vacuumdb.c:938 +#: vacuumdb.c:1183 #, c-format msgid "" " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 정보를 보여주고 마침\n" -#: vacuumdb.c:939 +#: vacuumdb.c:1184 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze 쿼리최ì í™” 통계 정보를 갱신함\n" -#: vacuumdb.c:940 +#: vacuumdb.c:1185 #, c-format msgid "" " -Z, --analyze-only only update optimizer statistics; no " @@ -1174,7 +1339,7 @@ msgstr "" " -Z, --analyze-only 청소 작업 ì—†ì´ ì¿¼ë¦¬ìµœì í™” 통계 ì •ë³´ë§Œ 갱신" "함\n" -#: vacuumdb.c:941 +#: vacuumdb.c:1186 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in " @@ -1184,12 +1349,12 @@ msgstr "" " --analyze-in-stages 보다 빠른 결과를 위해 다중 스테ì´ì§€ì—서\n" " 최ì í™” 통계치만 갱신함;청소 안함\n" -#: vacuumdb.c:943 +#: vacuumdb.c:1188 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 표시하고 종료\n" -#: vacuumdb.c:951 +#: vacuumdb.c:1196 #, c-format msgid "" "\n" @@ -1197,3 +1362,65 @@ msgid "" msgstr "" "\n" "보다 ìžì„¸í•œ ë‚´ìš©ì€ VACUUM SQL 명령어 설명서를 참조하십시오.\n" + +#, c-format +#~ msgid "cannot cluster specific table(s) in all databases" +#~ msgstr "모든 DB를 대ìƒìœ¼ë¡œ 특정 í…Œì´ë¸”ë“¤ì„ í´ëŸ¬ìŠ¤í„°í•  수 ì—†ìŒ" + +#, c-format +#~ msgid "cannot reindex all databases and system catalogs at the same time" +#~ msgstr "" +#~ "모든 ë°ì´í„°ë² ì´ìФ ìž¬ìƒ‰ì¸ ìž‘ì—…ê³¼ 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— ì§„í–‰" +#~ "í•  수 없습니다" + +#, c-format +#~ msgid "cannot reindex specific schema(s) in all databases" +#~ msgstr "" +#~ "모든 ë°ì´í„°ë² ì´ìФ ìž¬ìƒ‰ì¸ ìž‘ì—…ì—서 특정 ìŠ¤í‚¤ë§ˆë“¤ì˜ ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ ì§€ì •í•  수 " +#~ "없습니다" + +#, c-format +#~ msgid "cannot reindex specific table(s) in all databases" +#~ msgstr "" +#~ "모든 ë°ì´í„°ë² ì´ìФ ìž¬ìƒ‰ì¸ ìž‘ì—…ì—서 특정 í…Œì´ë¸”ì˜ ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ ì§€ì •í•  수 ì—†" +#~ "습니다" + +#, c-format +#~ msgid "cannot reindex specific index(es) in all databases" +#~ msgstr "" +#~ "모든 ë°ì´í„°ë² ì´ìФ ìž¬ìƒ‰ì¸ ìž‘ì—…ì—서 특정 ì¸ë±ìФ ìž¬ìƒ‰ì¸ ìž‘ì—…ì„ ì§€ì •í•  수 없습" +#~ "니다" + +#, c-format +#~ msgid "" +#~ "cannot reindex specific schema(s) and system catalogs at the same time" +#~ msgstr "" +#~ "특정 스키마와 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— 진행할 수 없습니다" + +#, c-format +#~ msgid "" +#~ "cannot reindex specific table(s) and system catalogs at the same time" +#~ msgstr "" +#~ "특정 í…Œì´ë¸”ê³¼ 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— 진행할 수 없습니다" + +#, c-format +#~ msgid "" +#~ "cannot reindex specific index(es) and system catalogs at the same time" +#~ msgstr "" +#~ "특정 ì¸ë±ìŠ¤ì™€ 시스템 카탈로그 ìž¬ìƒ‰ì¸ ìž‘ì—…ì€ ë™ì‹œì— 진행할 수 없습니다" + +#, c-format +#~ msgid "cannot use multiple jobs to reindex indexes" +#~ msgstr "ì¸ë±ìФ 다시 만들기ì—서는 다중 ìž‘ì—…ì„ ì‚¬ìš©í•  수 ì—†ìŒ" + +#, c-format +#~ msgid "cannot vacuum specific table(s) in all databases" +#~ msgstr "모든 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 대ìƒìœ¼ë¡œëŠ” 특정 í…Œì´ë¸”ë“¤ì„ ì²­ì†Œí•  수는 ì—†ìŒ" + +#, c-format +#~ msgid "cannot vacuum specific schema(s) in all databases" +#~ msgstr "모든 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 대ìƒìœ¼ë¡œëŠ” 특정 ìŠ¤í‚¤ë§ˆë“¤ì„ ì²­ì†Œí•  수는 ì—†ìŒ" + +#, c-format +#~ msgid "cannot exclude specific schema(s) in all databases" +#~ msgstr "모든 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 대ìƒìœ¼ë¡œëŠ” 특정 스키마를 제외할 수 ì—†ìŒ" diff --git a/src/bin/scripts/po/meson.build b/src/bin/scripts/po/meson.build index 00a9f208acf88..f4dde2c8de4d8 100644 --- a/src/bin/scripts/po/meson.build +++ b/src/bin/scripts/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pgscripts-' + pg_version_major.to_string())] diff --git a/src/bin/scripts/po/pt_BR.po b/src/bin/scripts/po/pt_BR.po index e6abb54d6f05e..011367c29ca93 100644 --- a/src/bin/scripts/po/pt_BR.po +++ b/src/bin/scripts/po/pt_BR.po @@ -10,7 +10,7 @@ msgstr "" "Project-Id-Version: PostgreSQL 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-09-27 13:15-0300\n" -"PO-Revision-Date: 2016-06-07 06:54-0400\n" +"PO-Revision-Date: 2024-06-26 10:46+0200\n" "Last-Translator: Euler Taveira \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" @@ -245,12 +245,12 @@ msgstr " -v, --verbose mostra muitas mensagens\n" #: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176 #, c-format msgid " -V, --version output version information, then exit\n" -msgstr " -V, --version mostra informação sobre a versão e termina\n" +msgstr " -V, --version mostra informação sobre a versão e termina\n" #: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" -msgstr " -?, --help mostra essa ajuda e termina\n" +msgstr " -?, --help mostra essa ajuda e termina\n" #: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179 #: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 @@ -315,7 +315,7 @@ msgstr "" #: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000 #, c-format msgid "%s home page: <%s>\n" -msgstr "página web do %s: <%s>\n" +msgstr "Página web do %s: <%s>\n" #: common.c:107 #, c-format diff --git a/src/bin/scripts/po/ru.po b/src/bin/scripts/po/ru.po index c7445bb3ae0ba..d630253ffc6b7 100644 --- a/src/bin/scripts/po/ru.po +++ b/src/bin/scripts/po/ru.po @@ -3,21 +3,21 @@ # This file is distributed under the same license as the PostgreSQL package. # Serguei A. Mokhov, , 2003-2004. # Oleg Bartunov , 2004. -# Alexander Lakhin , 2012-2017, 2019, 2020, 2021, 2022. +# Alexander Lakhin , 2012-2017, 2019, 2020, 2021, 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: pgscripts (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-29 10:17+0300\n" -"PO-Revision-Date: 2022-09-05 13:37+0300\n" +"POT-Creation-Date: 2025-05-03 16:06+0300\n" +"PO-Revision-Date: 2024-09-05 08:25+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: ../../../src/common/logging.c:276 #, c-format @@ -40,16 +40,58 @@ msgid "hint: " msgstr "подÑказка: " #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "нехватка памÑти\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка Ð´ÑƒÐ±Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñ (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°)\n" +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не удалоÑÑŒ открыть файл \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не удалоÑÑŒ получить информацию о файле \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñта Ñборка программы не поддерживает метод Ñинхронизации \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не удалоÑÑŒ открыть каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не удалоÑÑŒ прочитать каталог \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не удалоÑÑŒ Ñинхронизировать Ñ Ð¤Ð¡ файл \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не удалоÑÑŒ переименовать файл \"%s\" в \"%s\": %m" + #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" @@ -64,15 +106,15 @@ msgstr "пользователь не ÑущеÑтвует" msgid "user name lookup failure: error code %lu" msgstr "раÑпознать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалоÑÑŒ (код ошибки: %lu)" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Сигнал отмены отправлен\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "Отправить Ñигнал отмены не удалоÑÑŒ: " -#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104 +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103 msgid "Password: " msgstr "Пароль: " @@ -81,7 +123,7 @@ msgstr "Пароль: " msgid "could not connect to database %s: out of memory" msgstr "не удалоÑÑŒ подключитьÑÑ Ðº базе %s (нехватка памÑти)" -#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146 +#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146 #, c-format msgid "%s" msgstr "%s" @@ -96,12 +138,27 @@ msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° %s" msgid "%s must be in range %d..%d" msgstr "значение %s должно быть в диапазоне %d..%d" -#: ../../fe_utils/parallel_slot.c:301 +#: ../../fe_utils/option_utils.c:106 #, c-format -msgid "too many jobs for this platform" -msgstr "Ñлишком много заданий Ð´Ð»Ñ Ñтой платформы" +msgid "unrecognized sync method: %s" +msgstr "нераÑпознанный метод Ñинхронизации: %s" -#: ../../fe_utils/parallel_slot.c:519 +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "Ñлишком много заданий Ð´Ð»Ñ Ñтой платформы: %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "деÑкриптор файла Ñокета вне диапазона, допуÑтимого Ð´Ð»Ñ select(): %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "Попробуйте уменьшить количеÑтво заданий." + +#: ../../fe_utils/parallel_slot.c:553 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "ошибка при обработке базы \"%s\": %s" @@ -114,24 +171,33 @@ msgstr[0] "(%lu Ñтрока)" msgstr[1] "(%lu Ñтроки)" msgstr[2] "(%lu Ñтрок)" -#: ../../fe_utils/print.c:3109 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "Прервано\n" -#: ../../fe_utils/print.c:3173 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "" +"Cannot print table contents: number of cells %lld is equal to or exceeds " +"maximum %lld.\n" +msgstr "" +"ВывеÑти Ñодержимое таблицы нельзÑ: чиÑло Ñчеек %lld доÑтигло макÑимума " +"%lld.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "" "Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° таблицы: превышен предел чиÑла Ñтолбцов (%d).\n" -#: ../../fe_utils/print.c:3213 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" msgstr "" -"Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñчейки в таблицу: превышен предел чиÑла Ñчеек (%d).\n" +"Ошибка Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñчейки в таблицу: превышен предел чиÑла Ñчеек (%lld).\n" -#: ../../fe_utils/print.c:3471 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "неверный формат вывода (внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°): %d" @@ -146,46 +212,54 @@ msgstr "ошибка при выполнении запроÑа: %s" msgid "Query was: %s" msgstr "ВыполнÑлÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñ: %s" -#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158 -#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121 +#: ../../fe_utils/string_utils.c:587 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "" +"аргумент команды оболочки Ñодержит Ñимвол новой Ñтроки или перевода каретки: " +"\"%s\"\n" + +#: ../../fe_utils/string_utils.c:760 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "" +"Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ñодержит Ñимвол новой Ñтроки или перевода каретки: \"%s\"\n" + +#: clusterdb.c:114 clusterdb.c:133 createdb.c:149 createdb.c:168 +#: createuser.c:195 createuser.c:210 dropdb.c:104 dropdb.c:113 dropdb.c:121 #: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 -#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260 +#: reindexdb.c:180 reindexdb.c:199 vacuumdb.c:280 vacuumdb.c:300 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\"." -#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108 -#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258 +#: clusterdb.c:131 createdb.c:166 createuser.c:208 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:197 vacuumdb.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "Ñлишком много аргументов командной Ñтроки (первый: \"%s\")" -#: clusterdb.c:148 +#: clusterdb.c:149 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÐºÐ»Ð°Ñтеризовать вÑе базы и одну конкретную одновременно" -#: clusterdb.c:151 -#, c-format -msgid "cannot cluster specific table(s) in all databases" -msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÐºÐ»Ð°Ñтеризовать указанную таблицу(Ñ‹) во вÑех базах" - -#: clusterdb.c:215 +#: clusterdb.c:214 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "клаÑтеризовать таблицу \"%s\" в базе \"%s\" не удалоÑÑŒ: %s" -#: clusterdb.c:218 +#: clusterdb.c:217 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "клаÑтеризовать базу \"%s\" не удалоÑÑŒ: %s" -#: clusterdb.c:246 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð±Ð°Ð·Ñ‹ \"%s\"\n" -#: clusterdb.c:262 +#: clusterdb.c:274 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -194,19 +268,19 @@ msgstr "" "%s упорÑдочивает данные вÑех клаÑтеризованных таблиц в базе данных.\n" "\n" -#: clusterdb.c:263 createdb.c:281 createuser.c:346 dropdb.c:172 dropuser.c:170 -#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964 +#: clusterdb.c:275 createdb.c:300 createuser.c:417 dropdb.c:171 dropuser.c:171 +#: pg_isready.c:226 reindexdb.c:887 vacuumdb.c:1171 #, c-format msgid "Usage:\n" msgstr "ИÑпользование:\n" -#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 +#: clusterdb.c:276 reindexdb.c:888 vacuumdb.c:1172 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [ПÐРÐМЕТР]... [ИМЯ_БД]\n" -#: clusterdb.c:265 createdb.c:283 createuser.c:348 dropdb.c:174 dropuser.c:172 -#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 +#: clusterdb.c:277 createdb.c:302 createuser.c:419 dropdb.c:173 dropuser.c:173 +#: pg_isready.c:229 reindexdb.c:889 vacuumdb.c:1173 #, c-format msgid "" "\n" @@ -215,50 +289,50 @@ msgstr "" "\n" "Параметры:\n" -#: clusterdb.c:266 +#: clusterdb.c:278 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all клаÑтеризовать вÑе базы\n" -#: clusterdb.c:267 +#: clusterdb.c:279 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=ИМЯ_БД Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Ð´Ð»Ñ ÐºÐ»Ð°Ñтеризации\n" -#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173 +#: clusterdb.c:280 createuser.c:425 dropdb.c:174 dropuser.c:174 #, c-format msgid "" " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo отображать команды, отправлÑемые Ñерверу\n" -#: clusterdb.c:269 +#: clusterdb.c:281 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не выводить никакие ÑообщениÑ\n" -#: clusterdb.c:270 +#: clusterdb.c:282 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr "" " -t, --table=ТÐБЛИЦРклаÑтеризовать только указанную таблицу(Ñ‹)\n" -#: clusterdb.c:271 +#: clusterdb.c:283 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose выводить иÑчерпывающие ÑообщениÑ\n" -#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176 +#: clusterdb.c:284 createuser.c:441 dropdb.c:177 dropuser.c:177 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178 +#: clusterdb.c:285 createuser.c:449 dropdb.c:179 dropuser.c:179 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: clusterdb.c:274 createdb.c:298 createuser.c:370 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 +#: clusterdb.c:286 createdb.c:319 createuser.c:450 dropdb.c:180 dropuser.c:180 +#: pg_isready.c:235 reindexdb.c:904 vacuumdb.c:1202 #, c-format msgid "" "\n" @@ -267,39 +341,40 @@ msgstr "" "\n" "Параметры подключениÑ:\n" -#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992 +#: clusterdb.c:287 createuser.c:451 dropdb.c:181 dropuser.c:181 vacuumdb.c:1203 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог Ñокетов\n" +" -h, --host=ИМЯ компьютер Ñ Ñервером баз данных или каталог " +"Ñокетов\n" -#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993 +#: clusterdb.c:288 createuser.c:452 dropdb.c:182 dropuser.c:182 vacuumdb.c:1204 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт Ñервера баз данных\n" -#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994 +#: clusterdb.c:289 dropdb.c:183 vacuumdb.c:1205 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr "" " -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу\n" -#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995 +#: clusterdb.c:290 createuser.c:454 dropdb.c:184 dropuser.c:184 vacuumdb.c:1206 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996 +#: clusterdb.c:291 createuser.c:455 dropdb.c:185 dropuser.c:185 vacuumdb.c:1207 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password запроÑить пароль\n" -#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997 +#: clusterdb.c:292 dropdb.c:186 vacuumdb.c:1208 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=ИМЯ_БД Ñменить опорную базу данных\n" -#: clusterdb.c:281 +#: clusterdb.c:293 #, c-format msgid "" "\n" @@ -308,8 +383,8 @@ msgstr "" "\n" "Подробнее о клаÑтеризации вы можете узнать в опиÑании SQL-команды CLUSTER.\n" -#: clusterdb.c:282 createdb.c:306 createuser.c:376 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 +#: clusterdb.c:294 createdb.c:327 createuser.c:456 dropdb.c:187 dropuser.c:186 +#: pg_isready.c:240 reindexdb.c:912 vacuumdb.c:1210 #, c-format msgid "" "\n" @@ -318,8 +393,8 @@ msgstr "" "\n" "Об ошибках Ñообщайте по адреÑу <%s>.\n" -#: clusterdb.c:283 createdb.c:307 createuser.c:377 dropdb.c:189 dropuser.c:186 -#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000 +#: clusterdb.c:295 createdb.c:328 createuser.c:457 dropdb.c:188 dropuser.c:187 +#: pg_isready.c:241 reindexdb.c:913 vacuumdb.c:1211 #, c-format msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" @@ -333,43 +408,43 @@ msgstr[1] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d Ñтроки вмеÑто одной: %s msgstr[2] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d Ñтрок вмеÑто одной: %s" #. translator: abbreviation for "yes" -#: common.c:131 +#: common.c:132 msgid "y" msgstr "y" #. translator: abbreviation for "no" -#: common.c:133 +#: common.c:134 msgid "n" msgstr "n" #. translator: This is a question followed by the translated options for #. "yes" and "no". -#: common.c:143 +#: common.c:144 #, c-format msgid "%s (%s/%s) " msgstr "%s (%s - да/%s - нет) " -#: common.c:164 +#: common.c:165 #, c-format msgid "Please answer \"%s\" or \"%s\".\n" msgstr "ПожалуйÑта, введите \"%s\" или \"%s\".\n" -#: createdb.c:173 +#: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" не ÑвлÑетÑÑ Ð²ÐµÑ€Ð½Ñ‹Ð¼ названием кодировки" -#: createdb.c:243 +#: createdb.c:262 #, c-format msgid "database creation failed: %s" msgstr "Ñоздать базу данных не удалоÑÑŒ: %s" -#: createdb.c:262 +#: createdb.c:281 #, c-format msgid "comment creation failed (database was created): %s" msgstr "Ñоздать комментарий не удалоÑÑŒ (база данных была Ñоздана): %s" -#: createdb.c:280 +#: createdb.c:299 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -378,69 +453,82 @@ msgstr "" "%s Ñоздаёт базу данных PostgreSQL.\n" "\n" -#: createdb.c:282 +#: createdb.c:301 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [ПÐРÐМЕТР]... [ИМЯ_БД] [ОПИСÐÐИЕ]\n" # well-spelled: ПРОСТР -#: createdb.c:284 +#: createdb.c:303 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr "" " -D, --tablespace=ТÐБЛ_ПРОСТР табличное проÑтранÑтво по умолчанию Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ " "данных\n" -#: createdb.c:285 reindexdb.c:766 +#: createdb.c:304 reindexdb.c:893 #, c-format msgid "" " -e, --echo show the commands being sent to the server\n" msgstr "" " -e, --echo отображать команды, отправлÑемые Ñерверу\n" -#: createdb.c:286 +#: createdb.c:305 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=КОДИРОВКРкодировка базы данных\n" -#: createdb.c:287 +#: createdb.c:306 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=ЛОКÐЛЬ локаль Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных\n" -#: createdb.c:288 +#: createdb.c:307 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=ЛОКÐЛЬ параметр LC_COLLATE Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных\n" -#: createdb.c:289 +#: createdb.c:308 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=ЛОКÐЛЬ параметр LC_CTYPE Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных\n" -#: createdb.c:290 +#: createdb.c:309 +#, c-format +msgid "" +" --builtin-locale=LOCALE builtin locale setting for the database\n" +msgstr " --builtin-locale=ЛОКÐЛЬ Ð¸Ð¼Ñ Ð²Ñтроенной локали Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных\n" + +#: createdb.c:310 #, c-format msgid " --icu-locale=LOCALE ICU locale setting for the database\n" msgstr " --icu-locale=ЛОКÐЛЬ локаль ICU Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ данных\n" -#: createdb.c:291 +#: createdb.c:311 +#, c-format +msgid " --icu-rules=RULES ICU rules setting for the database\n" +msgstr "" +" --icu-rules=ПРÐВИЛРнаÑтройка правил Ñортировки ICU Ð´Ð»Ñ Ð±Ð°Ð·Ñ‹ " +"данных\n" + +#: createdb.c:312 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " locale provider for the database's default " "collation\n" msgstr "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " провайдер локали Ð´Ð»Ñ Ð¾Ñновного правила " "Ñортировки БД\n" -#: createdb.c:293 +#: createdb.c:314 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr "" " -O, --owner=ВЛÐДЕЛЕЦ пользователь-владелец новой базы данных\n" -#: createdb.c:294 +#: createdb.c:315 #, c-format msgid "" " -S, --strategy=STRATEGY database creation strategy wal_log or " @@ -449,55 +537,56 @@ msgstr "" " -S, --strategy=STRATEGY ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ð¸Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных: wal_log или " "file_copy\n" -#: createdb.c:295 +#: createdb.c:316 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=ШÐБЛОРиÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð±Ð°Ð·Ð° данных Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ\n" -#: createdb.c:296 reindexdb.c:775 +#: createdb.c:317 reindexdb.c:902 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: createdb.c:297 reindexdb.c:776 +#: createdb.c:318 reindexdb.c:903 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: createdb.c:299 reindexdb.c:778 +#: createdb.c:320 reindexdb.c:905 #, c-format msgid "" " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог Ñокетов\n" +" -h, --host=ИМЯ компьютер Ñ Ñервером баз данных или каталог " +"Ñокетов\n" -#: createdb.c:300 reindexdb.c:779 +#: createdb.c:321 reindexdb.c:906 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт Ñервера баз данных\n" -#: createdb.c:301 reindexdb.c:780 +#: createdb.c:322 reindexdb.c:907 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr "" " -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу\n" -#: createdb.c:302 reindexdb.c:781 +#: createdb.c:323 reindexdb.c:908 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: createdb.c:303 reindexdb.c:782 +#: createdb.c:324 reindexdb.c:909 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password запроÑить пароль\n" -#: createdb.c:304 reindexdb.c:783 +#: createdb.c:325 reindexdb.c:910 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=ИМЯ_БД Ñменить опорную базу данных\n" -#: createdb.c:305 +#: createdb.c:326 #, c-format msgid "" "\n" @@ -506,46 +595,46 @@ msgstr "" "\n" "По умолчанию именем базы данных ÑчитаетÑÑ Ð¸Ð¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ пользователÑ.\n" -#: createuser.c:193 +#: createuser.c:218 msgid "Enter name of role to add: " msgstr "Введите Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ роли: " -#: createuser.c:208 +#: createuser.c:233 msgid "Enter password for new role: " msgstr "Введите пароль Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ роли: " -#: createuser.c:209 +#: createuser.c:234 msgid "Enter it again: " msgstr "Повторите его: " -#: createuser.c:212 +#: createuser.c:237 #, c-format msgid "Passwords didn't match.\n" msgstr "Пароли не Ñовпадают.\n" -#: createuser.c:220 +#: createuser.c:245 msgid "Shall the new role be a superuser?" msgstr "Должна ли Ð½Ð¾Ð²Ð°Ñ Ñ€Ð¾Ð»ÑŒ иметь Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ‡Ð¸Ñ ÑуперпользователÑ?" -#: createuser.c:235 +#: createuser.c:260 msgid "Shall the new role be allowed to create databases?" msgstr "ÐÐ¾Ð²Ð°Ñ Ñ€Ð¾Ð»ÑŒ должна иметь право Ñоздавать базы данных?" -#: createuser.c:243 +#: createuser.c:268 msgid "Shall the new role be allowed to create more new roles?" msgstr "ÐÐ¾Ð²Ð°Ñ Ñ€Ð¾Ð»ÑŒ должна иметь право Ñоздавать другие роли?" -#: createuser.c:278 +#: createuser.c:311 #, c-format msgid "password encryption failed: %s" msgstr "ошибка при шифровании паролÑ: %s" -#: createuser.c:331 +#: createuser.c:402 #, c-format msgid "creation of new role failed: %s" msgstr "Ñоздать роль не удалоÑÑŒ: %s" -#: createuser.c:345 +#: createuser.c:416 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -554,12 +643,22 @@ msgstr "" "%s Ñоздаёт роль Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ PostgreSQL.\n" "\n" -#: createuser.c:347 dropuser.c:171 +#: createuser.c:418 dropuser.c:172 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [ПÐРÐМЕТР]... [ИМЯ_РОЛИ]\n" -#: createuser.c:349 +#: createuser.c:420 +#, c-format +msgid "" +" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n" +" option\n" +msgstr "" +" -a, --with-admin=РОЛЬ Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ñ€Ð¾Ð»ÑŒ будет членом новой роли Ñ " +"привилегией\n" +" ADMIN\n" + +#: createuser.c:422 #, c-format msgid "" " -c, --connection-limit=N connection limit for role (default: no limit)\n" @@ -567,24 +666,29 @@ msgstr "" " -c, --connection-limit=N предел подключений Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸\n" " (по умолчанию предела нет)\n" -#: createuser.c:350 +#: createuser.c:423 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb роль Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¼ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð°Ð· данных\n" -#: createuser.c:351 +#: createuser.c:424 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr "" " -D, --no-createdb роль без права ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ð°Ð· данных (по " "умолчанию)\n" -#: createuser.c:353 +#: createuser.c:426 #, c-format -msgid " -g, --role=ROLE new role will be a member of this role\n" -msgstr " -g, --role=РОЛЬ Ð½Ð¾Ð²Ð°Ñ Ñ€Ð¾Ð»ÑŒ будет включена в Ñту роль\n" +msgid " -g, --member-of=ROLE new role will be a member of ROLE\n" +msgstr " -g, --member-of=РОЛЬ Ð½Ð¾Ð²Ð°Ñ Ñ€Ð¾Ð»ÑŒ будет членом заданной роли\n" -#: createuser.c:354 +#: createuser.c:427 +#, c-format +msgid " --role=ROLE (same as --member-of, deprecated)\n" +msgstr " --role=РОЛЬ (уÑÑ‚Ð°Ñ€ÐµÐ²ÑˆÐ°Ñ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð° --member-of)\n" + +#: createuser.c:428 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -594,52 +698,66 @@ msgstr "" "она\n" " включена (по умолчанию)\n" -#: createuser.c:356 +#: createuser.c:430 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit роль не наÑледует права\n" -#: createuser.c:357 +#: createuser.c:431 #, c-format msgid " -l, --login role can login (default)\n" msgstr "" " -l, --login роль Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¼ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу (по " "умолчанию)\n" -#: createuser.c:358 +#: createuser.c:432 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login роль без права подключениÑ\n" -#: createuser.c:359 +#: createuser.c:433 +#, c-format +msgid " -m, --with-member=ROLE ROLE will be a member of new role\n" +msgstr " -m, --with-member=РОЛЬ Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ñ€Ð¾Ð»ÑŒ будет членом новой роли\n" + +#: createuser.c:434 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt назначить пароль новой роли\n" -#: createuser.c:360 +#: createuser.c:435 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole роль Ñ Ð¿Ñ€Ð°Ð²Ð¾Ð¼ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… ролей\n" -#: createuser.c:361 +#: createuser.c:436 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr "" " -R, --no-createrole роль без права ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ€Ð¾Ð»ÐµÐ¹ (по умолчанию)\n" -#: createuser.c:362 +#: createuser.c:437 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser роль Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ‡Ð¸Ñми ÑуперпользователÑ\n" -#: createuser.c:363 +#: createuser.c:438 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr "" " -S, --no-superuser роль без полномочий ÑÑƒÐ¿ÐµÑ€Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (по " "умолчанию)\n" -#: createuser.c:365 +#: createuser.c:439 +#, c-format +msgid "" +" -v, --valid-until=TIMESTAMP\n" +" password expiration date and time for role\n" +msgstr "" +" -v, --valid-until=ДÐТÐ_ВРЕМЯ\n" +" дата и Ð²Ñ€ÐµÐ¼Ñ Ð¸ÑÑ‚ÐµÑ‡ÐµÐ½Ð¸Ñ Ñрока Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð»Ñ Ñ€Ð¾Ð»Ð¸\n" + +#: createuser.c:442 #, c-format msgid "" " --interactive prompt for missing role name and attributes " @@ -649,17 +767,38 @@ msgstr "" " --interactive запрашивать отÑутÑтвующие атрибуты и Ð¸Ð¼Ñ Ñ€Ð¾Ð»Ð¸,\n" " а не иÑпользовать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию\n" -#: createuser.c:367 +#: createuser.c:444 +#, c-format +msgid "" +" --bypassrls role can bypass row-level security (RLS) policy\n" +msgstr "" +" --bypassrls роль не будет подчинÑтьÑÑ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ°Ð¼ защиты на\n" +" уровне Ñтрок (RLS)\n" + +#: createuser.c:445 +#, c-format +msgid "" +" --no-bypassrls role cannot bypass row-level security (RLS) " +"policy\n" +" (default)\n" +msgstr "" +" --no-bypassrls роль будет подчинÑтьÑÑ Ð¿Ð¾Ð»Ð¸Ñ‚Ð¸ÐºÐ°Ð¼ защиты на\n" +" уровне Ñтрок (по умолчанию)\n" + +#: createuser.c:447 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication роль может инициировать репликацию\n" -#: createuser.c:368 +#: createuser.c:448 #, c-format -msgid " --no-replication role cannot initiate replication\n" -msgstr " --no-replication роль не может инициировать репликацию\n" +msgid "" +" --no-replication role cannot initiate replication (default)\n" +msgstr "" +" --no-replication роль не может инициировать репликацию\n" +" (по умолчанию)\n" -#: createuser.c:373 +#: createuser.c:453 #, c-format msgid "" " -U, --username=USERNAME user name to connect as (not the one to create)\n" @@ -681,12 +820,12 @@ msgstr "База данных \"%s\" будет удалена безвозвр msgid "Are you sure?" msgstr "Ð’Ñ‹ уверены? (y/n)" -#: dropdb.c:157 +#: dropdb.c:156 #, c-format msgid "database removal failed: %s" msgstr "ошибка при удалении базы данных: %s" -#: dropdb.c:171 +#: dropdb.c:170 #, c-format msgid "" "%s removes a PostgreSQL database.\n" @@ -695,12 +834,12 @@ msgstr "" "%s удалÑет базу данных PostgreSQL.\n" "\n" -#: dropdb.c:173 +#: dropdb.c:172 #, c-format msgid " %s [OPTION]... DBNAME\n" msgstr " %s [ПÐРÐМЕТР]... БД\n" -#: dropdb.c:176 +#: dropdb.c:175 #, c-format msgid "" " -f, --force try to terminate other connections before " @@ -709,12 +848,12 @@ msgstr "" " -f, --force пытатьÑÑ Ð·Ð°ÐºÑ€Ñ‹Ñ‚ÑŒ другие Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´ " "удалением\n" -#: dropdb.c:177 +#: dropdb.c:176 #, c-format msgid " -i, --interactive prompt before deleting anything\n" msgstr " -i, --interactive подтвердить операцию удалениÑ\n" -#: dropdb.c:179 +#: dropdb.c:178 #, c-format msgid "" " --if-exists don't report error if database doesn't exist\n" @@ -735,12 +874,12 @@ msgstr "отÑутÑтвует необходимый аргумент: Ð¸Ð¼Ñ msgid "Role \"%s\" will be permanently removed.\n" msgstr "Роль \"%s\" будет удалена безвозвратно.\n" -#: dropuser.c:154 +#: dropuser.c:155 #, c-format msgid "removal of role \"%s\" failed: %s" msgstr "ошибка при удалении роли \"%s\": %s" -#: dropuser.c:169 +#: dropuser.c:170 #, c-format msgid "" "%s removes a PostgreSQL role.\n" @@ -749,7 +888,7 @@ msgstr "" "%s удалÑет роль PostgreSQL.\n" "\n" -#: dropuser.c:174 +#: dropuser.c:175 #, c-format msgid "" " -i, --interactive prompt before deleting anything, and prompt for\n" @@ -758,13 +897,13 @@ msgstr "" " -i, --interactive подтверждать операцию ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸ запрашивать\n" " Ð¸Ð¼Ñ Ñ€Ð¾Ð»Ð¸, еÑли оно не указано\n" -#: dropuser.c:177 +#: dropuser.c:178 #, c-format msgid " --if-exists don't report error if user doesn't exist\n" msgstr "" " --if-exists не Ñчитать ошибкой отÑутÑтвие пользователÑ\n" -#: dropuser.c:182 +#: dropuser.c:183 #, c-format msgid "" " -U, --username=USERNAME user name to connect as (not the one to drop)\n" @@ -840,7 +979,8 @@ msgstr " -?, --help показать Ñту Ñправку и в #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" -" -h, --host=ИМЯ Ð¸Ð¼Ñ Ñервера баз данных или каталог Ñокетов\n" +" -h, --host=ИМЯ компьютер Ñ Ñервером баз данных или каталог " +"Ñокетов\n" #: pg_isready.c:237 #, c-format @@ -862,112 +1002,59 @@ msgid " -U, --username=USERNAME user name to connect as\n" msgstr "" " -U, --username=ИМЯ Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº Ñерверу\n" -#: reindexdb.c:209 -#, c-format -msgid "cannot reindex all databases and a specific one at the same time" -msgstr "" -"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать вÑе базы данных и одну конкретную одновременно" - -#: reindexdb.c:211 -#, c-format -msgid "cannot reindex all databases and system catalogs at the same time" -msgstr "" -"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать вÑе базы данных и ÑиÑтемные каталоги одновременно" - #: reindexdb.c:213 #, c-format -msgid "cannot reindex specific schema(s) in all databases" -msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанную Ñхему(Ñ‹) во вÑех базах" - -#: reindexdb.c:215 -#, c-format -msgid "cannot reindex specific table(s) in all databases" -msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанную таблицу(Ñ‹) во вÑех базах" - -#: reindexdb.c:217 -#, c-format -msgid "cannot reindex specific index(es) in all databases" -msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанный индекÑ(Ñ‹) во вÑех базах" - -#: reindexdb.c:227 -#, c-format -msgid "cannot reindex specific schema(s) and system catalogs at the same time" -msgstr "" -"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанную Ñхему(Ñ‹) и ÑиÑтемные каталоги одновременно" - -#: reindexdb.c:229 -#, c-format -msgid "cannot reindex specific table(s) and system catalogs at the same time" -msgstr "" -"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанную таблицу(Ñ‹) и ÑиÑтемные каталоги " -"одновременно" - -#: reindexdb.c:231 -#, c-format -msgid "cannot reindex specific index(es) and system catalogs at the same time" -msgstr "" -"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанный индекÑ(Ñ‹) и ÑиÑтемные каталоги " -"одновременно" - -#: reindexdb.c:234 -#, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "" "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´ÐµÐ¹Ñтвовать неÑколько заданий Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑиÑтемных " "каталогов" -#: reindexdb.c:260 +#: reindexdb.c:218 #, c-format -msgid "cannot use multiple jobs to reindex indexes" -msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´ÐµÐ¹Ñтвовать неÑколько заданий Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов" +msgid "cannot reindex all databases and a specific one at the same time" +msgstr "" +"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать вÑе базы данных и одну конкретную одновременно" -#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439 -#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469 -#: vacuumdb.c:473 +#: reindexdb.c:298 reindexdb.c:305 vacuumdb.c:514 vacuumdb.c:521 vacuumdb.c:528 +#: vacuumdb.c:535 vacuumdb.c:542 vacuumdb.c:549 vacuumdb.c:556 vacuumdb.c:563 +#: vacuumdb.c:570 vacuumdb.c:577 vacuumdb.c:584 #, c-format msgid "" "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "" "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñ Ñерверами PostgreSQL верÑии Ñтарее %s" -#: reindexdb.c:369 -#, c-format -msgid "cannot reindex system catalogs concurrently, skipping all" -msgstr "" -"вÑе ÑиÑтемные каталоги пропуÑкаютÑÑ, так как их Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать " -"неблокирующим ÑпоÑобом" - -#: reindexdb.c:573 +#: reindexdb.c:604 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "переиндекÑировать базу данных \"%s\" не удалоÑÑŒ: %s" -#: reindexdb.c:577 +#: reindexdb.c:608 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "переÑтроить Ð¸Ð½Ð´ÐµÐºÑ \"%s\" в базе \"%s\" не удалоÑÑŒ: %s" -#: reindexdb.c:581 +#: reindexdb.c:612 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "переиндекÑировать Ñхему \"%s\" в базе \"%s\" не удалоÑÑŒ: %s" -#: reindexdb.c:585 +#: reindexdb.c:616 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "переиндекÑировать ÑиÑтемные каталоги в базе \"%s\" не удалоÑÑŒ: %s" -#: reindexdb.c:589 +#: reindexdb.c:620 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "переиндекÑировать таблицу \"%s\" в базе \"%s\" не удалоÑÑŒ: %s" -#: reindexdb.c:742 +#: reindexdb.c:843 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: переиндекÑÐ°Ñ†Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных \"%s\"\n" -#: reindexdb.c:759 +#: reindexdb.c:886 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -976,29 +1063,29 @@ msgstr "" "%s переиндекÑирует базу данных PostgreSQL.\n" "\n" -#: reindexdb.c:763 +#: reindexdb.c:890 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all переиндекÑировать вÑе базы данных\n" -#: reindexdb.c:764 +#: reindexdb.c:891 #, c-format msgid " --concurrently reindex concurrently\n" msgstr "" " --concurrently переиндекÑировать в неблокирующем режиме\n" -#: reindexdb.c:765 +#: reindexdb.c:892 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=БД Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑации\n" -#: reindexdb.c:767 +#: reindexdb.c:894 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr "" " -i, --index=ИÐДЕКС переÑоздать только указанный индекÑ(Ñ‹)\n" -#: reindexdb.c:768 +#: reindexdb.c:895 #, c-format msgid "" " -j, --jobs=NUM use this many concurrent connections to " @@ -1007,24 +1094,24 @@ msgstr "" " -j, --jobs=ЧИСЛО запуÑкать Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑации заданное чиÑло\n" " заданий\n" -#: reindexdb.c:769 +#: reindexdb.c:896 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не выводить ÑообщениÑ\n" -#: reindexdb.c:770 +#: reindexdb.c:897 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr "" " -s, --system переиндекÑировать только ÑиÑтемные каталоги\n" -#: reindexdb.c:771 +#: reindexdb.c:898 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr "" " -S, --schema=СХЕМРпереиндекÑировать только указанную Ñхему(Ñ‹)\n" -#: reindexdb.c:772 +#: reindexdb.c:899 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr "" @@ -1032,19 +1119,19 @@ msgstr "" "таблицу(Ñ‹)\n" # well-spelled: ПРОСТР -#: reindexdb.c:773 +#: reindexdb.c:900 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr "" " --tablespace=ТÐБЛ_ПРОСТР табличное проÑтранÑтво, в котором будут\n" " переÑтраиватьÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ‹\n" -#: reindexdb.c:774 +#: reindexdb.c:901 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose выводить иÑчерпывающие ÑообщениÑ\n" -#: reindexdb.c:784 +#: reindexdb.c:911 #, c-format msgid "" "\n" @@ -1053,65 +1140,86 @@ msgstr "" "\n" "Подробнее о переиндекÑации вы можете узнать в опиÑании SQL-команды REINDEX.\n" -#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279 -#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294 +#: vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 vacuumdb.c:325 +#: vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:334 vacuumdb.c:343 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "при выполнении только анализа Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать параметр \"%s\"" -#: vacuumdb.c:297 +#: vacuumdb.c:346 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "при выполнении полной очиÑтки Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать параметр \"%s\"" -#: vacuumdb.c:303 +#: vacuumdb.c:352 vacuumdb.c:360 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "параметр \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать ÑовмеÑтно Ñ \"%s\"" -#: vacuumdb.c:322 +#: vacuumdb.c:432 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить вÑе базы данных и одну конкретную одновременно" -#: vacuumdb.c:324 +#: vacuumdb.c:436 #, c-format -msgid "cannot vacuum specific table(s) in all databases" -msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить только указанную таблицу(Ñ‹) во вÑех базах" +msgid "" +"cannot vacuum all tables in schema(s) and specific table(s) at the same time" +msgstr "" +"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить вÑе таблицы в Ñхеме(ах) и одну конкретную таблицу " +"одновременно" + +#: vacuumdb.c:440 +#, c-format +msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time" +msgstr "" +"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить конкретную таблицу(Ñ‹) и иÑключить Ñхему(Ñ‹) одновременно" + +#: vacuumdb.c:444 +#, c-format +msgid "" +"cannot vacuum all tables in schema(s) and exclude schema(s) at the same time" +msgstr "" +"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить вÑе таблицы в Ñхеме(ах) и иÑключить Ñхему(Ñ‹) одновременно" -#: vacuumdb.c:412 +#: vacuumdb.c:457 +#, c-format +msgid "out of memory" +msgstr "нехватка памÑти" + +#: vacuumdb.c:501 msgid "Generating minimal optimizer statistics (1 target)" msgstr "ВычиÑление минимальной ÑтатиÑтики Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° (1 запиÑÑŒ)" -#: vacuumdb.c:413 +#: vacuumdb.c:502 msgid "Generating medium optimizer statistics (10 targets)" msgstr "ВычиÑление Ñредней ÑтатиÑтики Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° (10 запиÑей)" -#: vacuumdb.c:414 +#: vacuumdb.c:503 msgid "Generating default (full) optimizer statistics" msgstr "ВычиÑление Ñтандартной (полной) ÑтатиÑтики Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð°" -#: vacuumdb.c:479 +#: vacuumdb.c:594 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: обработка базы данных \"%s\": %s\n" -#: vacuumdb.c:482 +#: vacuumdb.c:597 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: очиÑтка базы данных \"%s\"\n" -#: vacuumdb.c:952 +#: vacuumdb.c:1159 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "очиÑтить таблицу \"%s\" в базе \"%s\" не удалоÑÑŒ: %s" -#: vacuumdb.c:955 +#: vacuumdb.c:1162 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "очиÑтить базу данных \"%s\" не удалоÑÑŒ: %s" -#: vacuumdb.c:963 +#: vacuumdb.c:1170 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1120,23 +1228,31 @@ msgstr "" "%s очищает и анализирует базу данных PostgreSQL.\n" "\n" -#: vacuumdb.c:967 +#: vacuumdb.c:1174 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all очиÑтить вÑе базы данных\n" -#: vacuumdb.c:968 +#: vacuumdb.c:1175 +#, c-format +msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n" +msgstr "" +" --buffer-usage-limit=РÐЗМЕР размер кольцевого буфера, иÑпользуемого " +"при\n" +" очиÑтке\n" + +#: vacuumdb.c:1176 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=ИМЯ_БД очиÑтить указанную базу данных\n" -#: vacuumdb.c:969 +#: vacuumdb.c:1177 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr "" " --disable-page-skipping иÑключить вÑе варианты пропуÑка Ñтраниц\n" -#: vacuumdb.c:970 +#: vacuumdb.c:1178 #, c-format msgid "" " -e, --echo show the commands being sent to the " @@ -1144,19 +1260,19 @@ msgid "" msgstr "" " -e, --echo отображать команды, отправлÑемые Ñерверу\n" -#: vacuumdb.c:971 +#: vacuumdb.c:1179 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full произвеÑти полную очиÑтку\n" -#: vacuumdb.c:972 +#: vacuumdb.c:1180 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr "" " -F, --freeze заморозить информацию о транзакциÑÑ… в " "Ñтроках\n" -#: vacuumdb.c:973 +#: vacuumdb.c:1181 #, c-format msgid "" " --force-index-cleanup always remove index entries that point to " @@ -1166,7 +1282,7 @@ msgstr "" "указывающие\n" " на мёртвые кортежи\n" -#: vacuumdb.c:974 +#: vacuumdb.c:1182 #, c-format msgid "" " -j, --jobs=NUM use this many concurrent connections to " @@ -1175,7 +1291,7 @@ msgstr "" " -j, --jobs=ЧИСЛО запуÑкать Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки заданное чиÑло " "заданий\n" -#: vacuumdb.c:975 +#: vacuumdb.c:1183 #, c-format msgid "" " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to " @@ -1184,7 +1300,7 @@ msgstr "" " --min-mxid-age=ВОЗРÐСТ минимальный возраÑÑ‚ мультитранзакций длÑ\n" " таблиц, подлежащих очиÑтке\n" -#: vacuumdb.c:976 +#: vacuumdb.c:1184 #, c-format msgid "" " --min-xid-age=XID_AGE minimum transaction ID age of tables to " @@ -1194,7 +1310,7 @@ msgstr "" "таблиц,\n" " подлежащих очиÑтке\n" -#: vacuumdb.c:977 +#: vacuumdb.c:1185 #, c-format msgid "" " --no-index-cleanup don't remove index entries that point to " @@ -1203,7 +1319,12 @@ msgstr "" " --no-index-cleanup не удалÑть Ñлементы индекÑа, указывающие\n" " на мёртвые кортежи\n" -#: vacuumdb.c:978 +#: vacuumdb.c:1186 +#, c-format +msgid " --no-process-main skip the main relation\n" +msgstr " --no-process-main пропуÑкать оÑновное отношение\n" + +#: vacuumdb.c:1187 #, c-format msgid "" " --no-process-toast skip the TOAST table associated with the " @@ -1212,7 +1333,7 @@ msgstr "" " --no-process-toast пропуÑкать TOAST-таблицу, ÑвÑзанную\n" " Ñ Ð¾Ñ‡Ð¸Ñ‰Ð°ÐµÐ¼Ð¾Ð¹ таблицей\n" -#: vacuumdb.c:979 +#: vacuumdb.c:1188 #, c-format msgid "" " --no-truncate don't truncate empty pages at the end of " @@ -1221,7 +1342,24 @@ msgstr "" " --no-truncate не отÑекать пуÑтые Ñтраницы в конце " "таблицы\n" -#: vacuumdb.c:980 +#: vacuumdb.c:1189 +#, c-format +msgid "" +" -n, --schema=SCHEMA vacuum tables in the specified schema(s) " +"only\n" +msgstr "" +" -n, --schema=СХЕМРочищать таблицы только в указанной " +"Ñхеме(ах)\n" + +#: vacuumdb.c:1190 +#, c-format +msgid "" +" -N, --exclude-schema=SCHEMA do not vacuum tables in the specified " +"schema(s)\n" +msgstr "" +" -N, --exclude-schema=СХЕМРне очищать таблицы в указанной Ñхеме(ах)\n" + +#: vacuumdb.c:1191 #, c-format msgid "" " -P, --parallel=PARALLEL_WORKERS use this many background workers for " @@ -1231,12 +1369,12 @@ msgstr "" " по возможноÑти иÑпользовать Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки\n" " заданное чиÑло фоновых процеÑÑов\n" -#: vacuumdb.c:981 +#: vacuumdb.c:1192 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не выводить ÑообщениÑ\n" -#: vacuumdb.c:982 +#: vacuumdb.c:1193 #, c-format msgid "" " --skip-locked skip relations that cannot be immediately " @@ -1245,29 +1383,29 @@ msgstr "" " --skip-locked пропуÑкать отношениÑ, которые не удаётÑÑ\n" " заблокировать немедленно\n" -#: vacuumdb.c:983 +#: vacuumdb.c:1194 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr "" " -t, --table='ТÐБЛ[(СТОЛБЦЫ)]' очиÑтить только указанную таблицу(Ñ‹)\n" -#: vacuumdb.c:984 +#: vacuumdb.c:1195 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose выводить иÑчерпывающие ÑообщениÑ\n" -#: vacuumdb.c:985 +#: vacuumdb.c:1196 #, c-format msgid "" " -V, --version output version information, then exit\n" msgstr " -V, --version показать верÑию и выйти\n" -#: vacuumdb.c:986 +#: vacuumdb.c:1197 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze обновить ÑтатиÑтику оптимизатора\n" -#: vacuumdb.c:987 +#: vacuumdb.c:1198 #, c-format msgid "" " -Z, --analyze-only only update optimizer statistics; no " @@ -1276,7 +1414,7 @@ msgstr "" " -Z, --analyze-only только обновить ÑтатиÑтику оптимизатора,\n" " не очищать БД\n" -#: vacuumdb.c:988 +#: vacuumdb.c:1199 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in " @@ -1288,12 +1426,12 @@ msgstr "" " (в неÑколько проходов Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐµÐ¹ " "ÑкороÑти), без очиÑтки\n" -#: vacuumdb.c:990 +#: vacuumdb.c:1201 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать Ñту Ñправку и выйти\n" -#: vacuumdb.c:998 +#: vacuumdb.c:1209 #, c-format msgid "" "\n" @@ -1302,6 +1440,70 @@ msgstr "" "\n" "Подробнее об очиÑтке вы можете узнать в опиÑании SQL-команды VACUUM.\n" +#, c-format +#~ msgid "cannot cluster specific table(s) in all databases" +#~ msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÐºÐ»Ð°Ñтеризовать указанную таблицу(Ñ‹) во вÑех базах" + +#, c-format +#~ msgid "cannot reindex all databases and system catalogs at the same time" +#~ msgstr "" +#~ "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать вÑе базы данных и ÑиÑтемные каталоги одновременно" + +#, c-format +#~ msgid "cannot reindex specific schema(s) in all databases" +#~ msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанную Ñхему(Ñ‹) во вÑех базах" + +#, c-format +#~ msgid "cannot reindex specific table(s) in all databases" +#~ msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанную таблицу(Ñ‹) во вÑех базах" + +#, c-format +#~ msgid "cannot reindex specific index(es) in all databases" +#~ msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанный индекÑ(Ñ‹) во вÑех базах" + +#, c-format +#~ msgid "" +#~ "cannot reindex specific schema(s) and system catalogs at the same time" +#~ msgstr "" +#~ "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанную Ñхему(Ñ‹) и ÑиÑтемные каталоги " +#~ "одновременно" + +#, c-format +#~ msgid "" +#~ "cannot reindex specific table(s) and system catalogs at the same time" +#~ msgstr "" +#~ "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанную таблицу(Ñ‹) и ÑиÑтемные каталоги " +#~ "одновременно" + +#, c-format +#~ msgid "" +#~ "cannot reindex specific index(es) and system catalogs at the same time" +#~ msgstr "" +#~ "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать указанный индекÑ(Ñ‹) и ÑиÑтемные каталоги " +#~ "одновременно" + +#, c-format +#~ msgid "cannot use multiple jobs to reindex indexes" +#~ msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´ÐµÐ¹Ñтвовать неÑколько заданий Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов" + +#, c-format +#~ msgid "cannot vacuum specific table(s) in all databases" +#~ msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить только указанную таблицу(Ñ‹) во вÑех базах" + +#, c-format +#~ msgid "cannot vacuum specific schema(s) in all databases" +#~ msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‡Ð¸Ñтить только указанную Ñхему(Ñ‹) во вÑех базах" + +#, c-format +#~ msgid "cannot exclude specific schema(s) in all databases" +#~ msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñключить указанную Ñхему(Ñ‹) во вÑех базах" + +#, c-format +#~ msgid "cannot reindex system catalogs concurrently, skipping all" +#~ msgstr "" +#~ "вÑе ÑиÑтемные каталоги пропуÑкаютÑÑ, так как их Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿ÐµÑ€ÐµÐ¸Ð½Ð´ÐµÐºÑировать " +#~ "неблокирующим ÑпоÑобом" + #~ msgid "only one of --locale and --lc-ctype can be specified" #~ msgstr "можно указать только --locale или --lc-ctype" @@ -1325,9 +1527,6 @@ msgstr "" #~ msgid "minimum multixact ID age must be at least 1" #~ msgstr "минимальный возраÑÑ‚ мультитранзакций должен быть не меньше 1" -#~ msgid "could not connect to database %s: %s" -#~ msgstr "не удалоÑÑŒ подключитьÑÑ Ðº базе %s: %s" - #~ msgid "parallel vacuum degree must be a non-negative integer" #~ msgstr "" #~ "Ñтепень параллельноÑти Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки должна задаватьÑÑ Ð½ÐµÐ¾Ñ‚Ñ€Ð¸Ñ†Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ целым" diff --git a/src/bin/scripts/po/sv.po b/src/bin/scripts/po/sv.po index c33a139413044..6dfeaecb092fb 100644 --- a/src/bin/scripts/po/sv.po +++ b/src/bin/scripts/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for postgresql -# Dennis Björklund , 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. +# Dennis Björklund , 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # Peter Eisentraut , 2013. # Mats Erik Andersson , 2014. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-09 18:50+0000\n" -"PO-Revision-Date: 2022-05-09 21:46+0200\n" +"POT-Creation-Date: 2024-07-12 17:52+0000\n" +"PO-Revision-Date: 2024-07-12 22:17+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,37 +17,79 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: ../../../src/common/logging.c:277 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "fel: " -#: ../../../src/common/logging.c:284 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "varning: " -#: ../../../src/common/logging.c:295 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "detalj: " -#: ../../../src/common/logging.c:302 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "tips: " #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "slut pÃ¥ minne\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "kunde inte öppna fil \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "kunde inte göra stat() pÃ¥ fil \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "detta bygge stöder inte synkmetod \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "kunde inte öppna katalog \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "kunde inte läsa katalog \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "kunde inte fsync:a fil \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" + #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" @@ -62,15 +104,15 @@ msgstr "användaren finns inte" msgid "user name lookup failure: error code %lu" msgstr "misslyckad sökning efter användarnamn: felkod %lu" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "FörfrÃ¥gan om avbrytning skickad\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "Kunde inte skicka förfrÃ¥gan om avbrytning: " -#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104 +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103 msgid "Password: " msgstr "Lösenord: " @@ -79,7 +121,7 @@ msgstr "Lösenord: " msgid "could not connect to database %s: out of memory" msgstr "kunde inte ansluta till databas %s: slut pÃ¥ minne" -#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146 +#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146 #, c-format msgid "%s" msgstr "%s" @@ -94,12 +136,27 @@ msgstr "ogiltigt värde \"%s\" för flaggan \"%s\"" msgid "%s must be in range %d..%d" msgstr "%s mÃ¥ste vara i intervallet %d..%d" -#: ../../fe_utils/parallel_slot.c:301 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "okänd synkmetod: %s" + +#: ../../fe_utils/parallel_slot.c:317 +#, c-format +msgid "too many jobs for this platform: %d" +msgstr "för mÃ¥nga jobb för denna plattform: %d" + +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "deskriptor-index utanför sitt intervall för select(): %d" + +#: ../../fe_utils/parallel_slot.c:328 #, c-format -msgid "too many jobs for this platform" -msgstr "för mÃ¥nga jobb för denna plattform" +msgid "Try fewer jobs." +msgstr "Försök med färre job." -#: ../../fe_utils/parallel_slot.c:519 +#: ../../fe_utils/parallel_slot.c:553 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "processande av databas \"%s\" misslyckades: %s" @@ -111,22 +168,27 @@ msgid_plural "(%lu rows)" msgstr[0] "(%lu rad)" msgstr[1] "(%lu rader)" -#: ../../fe_utils/print.c:3109 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "Avbruten\n" -#: ../../fe_utils/print.c:3173 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "Kan inte skriva ut tabellinnehÃ¥ll: antal celler %lld är lika med eller fler än maximala %lld.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Kan inte lägga till rubrik till tabellinnehÃ¥ll: antal kolumner (%d) överskridet.\n" -#: ../../fe_utils/print.c:3213 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "Kan inte lägga till cell till tabellinnehÃ¥ll: totala cellantalet (%d) överskridet.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "Kan inte lägga till cell till tabellinnehÃ¥ll: totala cellantalet %lld är överskridet.\n" -#: ../../fe_utils/print.c:3471 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "ogiltigt utdataformat (internt fel): %d" @@ -141,46 +203,51 @@ msgstr "frÃ¥ga misslyckades: %s" msgid "Query was: %s" msgstr "FrÃ¥gan var: %s" -#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158 -#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "shell-kommandots argument innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "databasnamnet innehÃ¥ller nyrad eller vagnretur: \"%s\"\n" + +#: clusterdb.c:114 clusterdb.c:133 createdb.c:149 createdb.c:168 +#: createuser.c:195 createuser.c:210 dropdb.c:104 dropdb.c:113 dropdb.c:121 #: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 -#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260 +#: reindexdb.c:177 reindexdb.c:196 vacuumdb.c:280 vacuumdb.c:300 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Försök med \"%s --help\" för mer information." -#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108 -#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258 +#: clusterdb.c:131 createdb.c:166 createuser.c:208 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:194 vacuumdb.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "för mÃ¥nga kommandoradsargument (första är \"%s\")" -#: clusterdb.c:148 +#: clusterdb.c:149 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "kan inte klustra alla databaser och en angiven pÃ¥ samma gÃ¥ng" -#: clusterdb.c:151 -#, c-format -msgid "cannot cluster specific table(s) in all databases" -msgstr "kan inte klustra angivna tabeller i alla databaser" - -#: clusterdb.c:215 +#: clusterdb.c:214 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "klustring av tabell \"%s\" i databas \"%s\" misslyckades: %s" -#: clusterdb.c:218 +#: clusterdb.c:217 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "klustring av databas \"%s\" misslyckades: %s" -#: clusterdb.c:246 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: klustring av databas \"%s\"\n" -#: clusterdb.c:262 +#: clusterdb.c:274 #, c-format msgid "" "%s clusters all previously clustered tables in a database.\n" @@ -189,19 +256,19 @@ msgstr "" "%s klustrar alla tidigare klustrade tabeller i en databas.\n" "\n" -#: clusterdb.c:263 createdb.c:283 createuser.c:346 dropdb.c:172 dropuser.c:170 -#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964 +#: clusterdb.c:275 createdb.c:298 createuser.c:415 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:868 vacuumdb.c:1147 #, c-format msgid "Usage:\n" msgstr "Användning:\n" -#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 +#: clusterdb.c:276 reindexdb.c:869 vacuumdb.c:1148 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [FLAGGA]... [DBNAMN]\n" -#: clusterdb.c:265 createdb.c:285 createuser.c:348 dropdb.c:174 dropuser.c:172 -#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 +#: clusterdb.c:277 createdb.c:300 createuser.c:417 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:870 vacuumdb.c:1149 #, c-format msgid "" "\n" @@ -210,48 +277,48 @@ msgstr "" "\n" "Flaggor:\n" -#: clusterdb.c:266 +#: clusterdb.c:278 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all klustra alla databaser\n" -#: clusterdb.c:267 +#: clusterdb.c:279 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=DBNAME databas att klustra\n" -#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173 +#: clusterdb.c:280 createuser.c:423 dropdb.c:175 dropuser.c:173 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo visa kommandon som skickas till servern\n" -#: clusterdb.c:269 +#: clusterdb.c:281 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet skriv inte ut nÃ¥gra meddelanden\n" -#: clusterdb.c:270 +#: clusterdb.c:282 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=TABELL klustra enbart ingivna tabeller\n" -#: clusterdb.c:271 +#: clusterdb.c:283 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose skriv massor med utdata\n" -#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176 +#: clusterdb.c:284 createuser.c:439 dropdb.c:178 dropuser.c:176 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178 +#: clusterdb.c:285 createuser.c:447 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: clusterdb.c:274 createdb.c:300 createuser.c:370 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 +#: clusterdb.c:286 createdb.c:317 createuser.c:448 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:885 vacuumdb.c:1178 #, c-format msgid "" "\n" @@ -260,37 +327,37 @@ msgstr "" "\n" "Flaggor för anslutning:\n" -#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992 +#: clusterdb.c:287 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1179 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n" -#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993 +#: clusterdb.c:288 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1180 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT databasserverns port\n" -#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994 +#: clusterdb.c:289 dropdb.c:184 vacuumdb.c:1181 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n" -#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995 +#: clusterdb.c:290 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1182 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password frÃ¥ga ej efter lösenord\n" -#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996 +#: clusterdb.c:291 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1183 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password framtvinga frÃ¥ga om lösenord\n" -#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997 +#: clusterdb.c:292 dropdb.c:187 vacuumdb.c:1184 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAMN annat val av underhÃ¥llsdatabas\n" -#: clusterdb.c:281 +#: clusterdb.c:293 #, c-format msgid "" "\n" @@ -299,8 +366,8 @@ msgstr "" "\n" "Läs beskrivningen av SQL-kommandot CLUSTER för detaljer.\n" -#: clusterdb.c:282 createdb.c:308 createuser.c:376 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 +#: clusterdb.c:294 createdb.c:325 createuser.c:454 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:893 vacuumdb.c:1186 #, c-format msgid "" "\n" @@ -309,8 +376,8 @@ msgstr "" "\n" "Rapportera fel till <%s>.\n" -#: clusterdb.c:283 createdb.c:309 createuser.c:377 dropdb.c:189 dropuser.c:186 -#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000 +#: clusterdb.c:295 createdb.c:326 createuser.c:455 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:894 vacuumdb.c:1187 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" @@ -344,32 +411,22 @@ msgstr "%s (%s/%s) " msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Var vänlig att svara \"%s\" eller \"%s\".\n" -#: createdb.c:165 -#, c-format -msgid "only one of --locale and --lc-ctype can be specified" -msgstr "endast en av --locale och --lc-ctype kan anges" - -#: createdb.c:167 -#, c-format -msgid "only one of --locale and --lc-collate can be specified" -msgstr "endast en av --locale och --lc-collate kan anges" - #: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" är inte ett giltigt kodningsnamn" -#: createdb.c:245 +#: createdb.c:260 #, c-format msgid "database creation failed: %s" msgstr "misslyckades att skapa databas: %s" -#: createdb.c:264 +#: createdb.c:279 #, c-format msgid "comment creation failed (database was created): %s" msgstr "misslyckades att skapa kommentar (databasen skapades): %s" -#: createdb.c:282 +#: createdb.c:297 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -378,113 +435,123 @@ msgstr "" "%s skapar en PostgreSQL-databas.\n" "\n" -#: createdb.c:284 +#: createdb.c:299 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [FLAGGA]... [DBNAMN] [BESKRIVNING]\n" -#: createdb.c:286 +#: createdb.c:301 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=TABELLRYMD förvalt tabellutrymme för databasen\n" -#: createdb.c:287 reindexdb.c:766 +#: createdb.c:302 reindexdb.c:874 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo visa kommandon som skickas till servern\n" -#: createdb.c:288 +#: createdb.c:303 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=KODNING teckenkodning för databasen\n" -#: createdb.c:289 +#: createdb.c:304 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=LOKAL lokalnamn för databasen\n" -#: createdb.c:290 +#: createdb.c:305 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=LOKAL värde pÃ¥ LC_COLLATE för databasen\n" -#: createdb.c:291 +#: createdb.c:306 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=LOKAL värde pÃ¥ LC_CTYPE för databasen\n" -#: createdb.c:292 +#: createdb.c:307 +#, c-format +msgid " --builtin-locale=LOCALE builtin locale setting for the database\n" +msgstr " --builtin-locale=LOKAL inbyggd lokal-inställning för databasen\n" + +#: createdb.c:308 #, c-format msgid " --icu-locale=LOCALE ICU locale setting for the database\n" msgstr " --icu-locale=LOKAL värde pÃ¥ ICU-lokal för databasen\n" -#: createdb.c:293 +#: createdb.c:309 +#, c-format +msgid " --icu-rules=RULES ICU rules setting for the database\n" +msgstr " --icu-rules=REGLER ICU-regler för databasen\n" + +#: createdb.c:310 #, c-format msgid "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " locale provider for the database's default collation\n" msgstr "" -" --locale-provider={libc|icu}\n" +" --locale-provider={builtin|libc|icu}\n" " lokalleverantör av databasens standardjämförelser\n" -#: createdb.c:295 +#: createdb.c:312 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --owner=ÄGARE databasanvändare som äger nya databasen\n" -#: createdb.c:296 +#: createdb.c:313 #, c-format msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" msgstr "" " -S, --strategy=STRATEGI strategi för att skapa en databas, wal_log\n" " eller file_copy\n" -#: createdb.c:297 +#: createdb.c:314 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=MALL databasmall att kopiera\n" -#: createdb.c:298 reindexdb.c:775 +#: createdb.c:315 reindexdb.c:883 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: createdb.c:299 reindexdb.c:776 +#: createdb.c:316 reindexdb.c:884 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: createdb.c:301 reindexdb.c:778 +#: createdb.c:318 reindexdb.c:886 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=VÄRDNAMN databasens värdnamn eller socketkatalog\n" -#: createdb.c:302 reindexdb.c:779 +#: createdb.c:319 reindexdb.c:887 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT databasserverns port\n" -#: createdb.c:303 reindexdb.c:780 +#: createdb.c:320 reindexdb.c:888 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n" -#: createdb.c:304 reindexdb.c:781 +#: createdb.c:321 reindexdb.c:889 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password frÃ¥ga ej efter lösenord\n" -#: createdb.c:305 reindexdb.c:782 +#: createdb.c:322 reindexdb.c:890 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password framtvinga frÃ¥ga om lösenord\n" -#: createdb.c:306 reindexdb.c:783 +#: createdb.c:323 reindexdb.c:891 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAMN annat val av underhÃ¥llsdatabas\n" -#: createdb.c:307 +#: createdb.c:324 #, c-format msgid "" "\n" @@ -493,46 +560,46 @@ msgstr "" "\n" "Som standard skapas en databas med samma namn som den nuvarande användares namn.\n" -#: createuser.c:193 +#: createuser.c:218 msgid "Enter name of role to add: " msgstr "Mata in namn pÃ¥ den roll som skall läggas till: " -#: createuser.c:208 +#: createuser.c:233 msgid "Enter password for new role: " msgstr "Mata in lösenord för den nya rollen: " -#: createuser.c:209 +#: createuser.c:234 msgid "Enter it again: " msgstr "Mata in det igen: " -#: createuser.c:212 +#: createuser.c:237 #, c-format msgid "Passwords didn't match.\n" msgstr "Lösenorden stämde inte överens.\n" -#: createuser.c:220 +#: createuser.c:245 msgid "Shall the new role be a superuser?" msgstr "Skall den nya rollen vara en superuser?" -#: createuser.c:235 +#: createuser.c:260 msgid "Shall the new role be allowed to create databases?" msgstr "Skall den nya rollen tillÃ¥tas skapa databaser?" -#: createuser.c:243 +#: createuser.c:268 msgid "Shall the new role be allowed to create more new roles?" msgstr "Skall den nya rollen tillÃ¥tas skapa fler nya roller?" -#: createuser.c:278 +#: createuser.c:309 #, c-format msgid "password encryption failed: %s" msgstr "misslyckades med lösenordskryptering: %s" -#: createuser.c:331 +#: createuser.c:400 #, c-format msgid "creation of new role failed: %s" msgstr "misslyckades med att skapa ny roll: %s" -#: createuser.c:345 +#: createuser.c:414 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -541,32 +608,46 @@ msgstr "" "%s skapar en ny PostgreSQL-roll.\n" "\n" -#: createuser.c:347 dropuser.c:171 +#: createuser.c:416 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [FLAGGA]... [ROLLNAMN]\n" -#: createuser.c:349 +#: createuser.c:418 +#, c-format +msgid "" +" -a, --with-admin=ROLE ROLE will be a member of new role with admin\n" +" option\n" +msgstr "" +" -a, --with-admin=ROLL ROLL kommer bli en medlem i nya rollen med\n" +" adminrättigheter\n" + +#: createuser.c:420 #, c-format msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr " -c, --connection-limit=N anslutningsgräns för roll (standard: ingen gräns)\n" -#: createuser.c:350 +#: createuser.c:421 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb rollen kan skapa nya databaser\n" -#: createuser.c:351 +#: createuser.c:422 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb rollen kan inte skapa databaser (standard)\n" -#: createuser.c:353 +#: createuser.c:424 +#, c-format +msgid " -g, --member-of=ROLE new role will be a member of ROLE\n" +msgstr " -g, --member-of=ROLL nya rollen kommer bli medlem i ROLL\n" + +#: createuser.c:425 #, c-format -msgid " -g, --role=ROLE new role will be a member of this role\n" -msgstr " -g, --role=ROLL nya rollen kommer bli medlem i denna roll\n" +msgid " --role=ROLE (same as --member-of, deprecated)\n" +msgstr " --role=ROLL (samma som --member-of, obsolet)\n" -#: createuser.c:354 +#: createuser.c:426 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -575,47 +656,61 @@ msgstr "" " -i, --inherit rollen ärver rättigheter frÃ¥n roller den\n" " är medlem i (standard)\n" -#: createuser.c:356 +#: createuser.c:428 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit rollen ärver inga rättigheter\n" -#: createuser.c:357 +#: createuser.c:429 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login rollen kan logga in (standard)\n" -#: createuser.c:358 +#: createuser.c:430 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login rollen kan inte logga in\n" -#: createuser.c:359 +#: createuser.c:431 +#, c-format +msgid " -m, --with-member=ROLE ROLE will be a member of new role\n" +msgstr " -m, --with-member=ROLL ROLL kommer bli medlem i den nya rollen\n" + +#: createuser.c:432 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt tilldela den nya rollen ett lösenord\n" -#: createuser.c:360 +#: createuser.c:433 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole rollen kan skapa nya roller\n" -#: createuser.c:361 +#: createuser.c:434 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole rollen kan inte skapa roller (standard)\n" -#: createuser.c:362 +#: createuser.c:435 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser rollen blir en superuser\n" -#: createuser.c:363 +#: createuser.c:436 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr " -S, --no-superuser rollen blir inte superuser (standard)\n" -#: createuser.c:365 +#: createuser.c:437 +#, c-format +msgid "" +" -v, --valid-until=TIMESTAMP\n" +" password expiration date and time for role\n" +msgstr "" +" -v, --valid-until=TIMESTAMP\n" +" datum och tid när rollens lösenord gÃ¥r ut\n" + +#: createuser.c:440 #, c-format msgid "" " --interactive prompt for missing role name and attributes rather\n" @@ -624,17 +719,31 @@ msgstr "" " --interactive frÃ¥ga efter rollnamn och egenskaper, snarare än\n" " att falla tillbaka pÃ¥ förval\n" -#: createuser.c:367 +#: createuser.c:442 +#, c-format +msgid " --bypassrls role can bypass row-level security (RLS) policy\n" +msgstr " --bypassrls rollen kan gÃ¥ förbi säkerhet pÃ¥ radnivÃ¥ (RLS)\n" + +#: createuser.c:443 +#, c-format +msgid "" +" --no-bypassrls role cannot bypass row-level security (RLS) policy\n" +" (default)\n" +msgstr "" +" --no-bypassrls rollen kan inte gÃ¥ förbi säkerhet pÃ¥ radnivÃ¥ (RLS)\n" +" (standard)\n" + +#: createuser.c:445 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication rollen kan starta replikering\n" -#: createuser.c:368 +#: createuser.c:446 #, c-format -msgid " --no-replication role cannot initiate replication\n" -msgstr " --no-replication rollen fÃ¥r inte starta replikering\n" +msgid " --no-replication role cannot initiate replication (default)\n" +msgstr " --no-replication rollen fÃ¥r inte starta replikering (standard)\n" -#: createuser.c:373 +#: createuser.c:451 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som (ej den som skapas)\n" @@ -816,99 +925,54 @@ msgstr " -t, --timeout=SEK sekunder att vänta pÃ¥ anslutning; 0 stänge msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ANVÄNDARE användarnamn att ansluta som\n" -#: reindexdb.c:209 -#, c-format -msgid "cannot reindex all databases and a specific one at the same time" -msgstr "kan inte omindexera alla databaser och samtidigt en specifik databas" - -#: reindexdb.c:211 -#, c-format -msgid "cannot reindex all databases and system catalogs at the same time" -msgstr "kan inte omindexera alla databaser samtidigt med systemkatalogerna" - -#: reindexdb.c:213 -#, c-format -msgid "cannot reindex specific schema(s) in all databases" -msgstr "kan inte omindexera angivna scheman i alla databaser" - -#: reindexdb.c:215 -#, c-format -msgid "cannot reindex specific table(s) in all databases" -msgstr "Kan inte indexera specifik tabell i alla databaser" - -#: reindexdb.c:217 -#, c-format -msgid "cannot reindex specific index(es) in all databases" -msgstr "Kan inte omindexera angivet index i alla databaser" - -#: reindexdb.c:227 -#, c-format -msgid "cannot reindex specific schema(s) and system catalogs at the same time" -msgstr "kan inte omindexera angivna scheman och systemkataloger pÃ¥ samma gÃ¥ng" - -#: reindexdb.c:229 -#, c-format -msgid "cannot reindex specific table(s) and system catalogs at the same time" -msgstr "kan inte omindexera specifik tabell och systemkatalogerna samtidigt" - -#: reindexdb.c:231 -#, c-format -msgid "cannot reindex specific index(es) and system catalogs at the same time" -msgstr "kan inte omindexera angivna index och systemkatalogerna samtidigt." - -#: reindexdb.c:234 +#: reindexdb.c:210 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "kan inte använda multipla jobb för att omindexera systemkataloger" -#: reindexdb.c:260 +#: reindexdb.c:215 #, c-format -msgid "cannot use multiple jobs to reindex indexes" -msgstr "kan inte använda multipla jobb för att omindexera index" +msgid "cannot reindex all databases and a specific one at the same time" +msgstr "kan inte omindexera alla databaser och samtidigt en specifik databas" -#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439 -#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469 -#: vacuumdb.c:473 +#: reindexdb.c:296 reindexdb.c:303 vacuumdb.c:515 vacuumdb.c:522 vacuumdb.c:529 +#: vacuumdb.c:536 vacuumdb.c:543 vacuumdb.c:550 vacuumdb.c:557 vacuumdb.c:562 +#: vacuumdb.c:566 vacuumdb.c:570 vacuumdb.c:574 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "flaggan \"%s\" kan inte användas pÃ¥ serverversioner äldre än PostgreSQL %s" -#: reindexdb.c:369 -#, c-format -msgid "cannot reindex system catalogs concurrently, skipping all" -msgstr "kan inte omindexera systemkataloger parallellt, hoppar över alla" - -#: reindexdb.c:573 +#: reindexdb.c:584 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "omindexering av databasen \"%s\" misslyckades: %s" -#: reindexdb.c:577 +#: reindexdb.c:588 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "omindexering av index \"%s\" i databasen \"%s\" misslyckades: %s" -#: reindexdb.c:581 +#: reindexdb.c:592 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "omindexering av schemat \"%s\" i databasen \"%s\" misslyckades: %s" -#: reindexdb.c:585 +#: reindexdb.c:596 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "omindexering av systemkataloger i databasen \"%s\" misslyckades: %s" -#: reindexdb.c:589 +#: reindexdb.c:600 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "omindexering av tabell \"%s\" i databasen \"%s\" misslyckades: %s" -#: reindexdb.c:742 +#: reindexdb.c:824 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: omindexering av databasen \"%s\"\n" -#: reindexdb.c:759 +#: reindexdb.c:867 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -917,64 +981,64 @@ msgstr "" "%s indexerar om en PostgreSQL-databas.\n" "\n" -#: reindexdb.c:763 +#: reindexdb.c:871 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all indexera om alla databaser\n" -#: reindexdb.c:764 +#: reindexdb.c:872 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " --concurrently indexera om utan att lÃ¥sa\n" -#: reindexdb.c:765 +#: reindexdb.c:873 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=DBNAME databas att indexera om\n" -#: reindexdb.c:767 +#: reindexdb.c:875 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=INDEX Ã¥terskapa enbart angivna index\n" -#: reindexdb.c:768 +#: reindexdb.c:876 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" msgstr "" " -j, --jobs=NUM använd sÃ¥ här mÃ¥nga samtida anslutningar\n" " för omindexering\n" -#: reindexdb.c:769 +#: reindexdb.c:877 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet skriv inte ut nÃ¥gra meddelanden\n" -#: reindexdb.c:770 +#: reindexdb.c:878 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system indexera enbart om systemkataloger\n" -#: reindexdb.c:771 +#: reindexdb.c:879 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=SCHEMA indexera enbart om angivna scheman\n" -#: reindexdb.c:772 +#: reindexdb.c:880 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABELL indexera enbart om angivna tabeller\n" -#: reindexdb.c:773 +#: reindexdb.c:881 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " --tablespace=TABELLRYMD tabellutrymme där index byggs om\n" -#: reindexdb.c:774 +#: reindexdb.c:882 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose skriv massor med utdata\n" -#: reindexdb.c:784 +#: reindexdb.c:892 #, c-format msgid "" "\n" @@ -983,65 +1047,80 @@ msgstr "" "\n" "Läs beskrivningen av SQL-kommandot REINDEX för detaljer.\n" -#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279 -#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294 +#: vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 vacuumdb.c:325 +#: vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:334 vacuumdb.c:343 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "flaggan \"%s\" kan inte användas vid enbart analys" -#: vacuumdb.c:297 +#: vacuumdb.c:346 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "flaggan \"%s\" kan inte användas vid \"full vacuum\"" -#: vacuumdb.c:303 +#: vacuumdb.c:352 vacuumdb.c:360 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "flaggan \"%s\" kan inte användas tillsammans med flaggan \"%s\"" -#: vacuumdb.c:322 +#: vacuumdb.c:432 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "kan inte städa alla databaser och endast en angiven pÃ¥ samma gÃ¥ng" -#: vacuumdb.c:324 +#: vacuumdb.c:436 +#, c-format +msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time" +msgstr "kan inte städa alla tabeller i scheman samt angivna tabeller pÃ¥ samma gÃ¥ng" + +#: vacuumdb.c:440 #, c-format -msgid "cannot vacuum specific table(s) in all databases" -msgstr "kan inte städa en specifik tabell i alla databaser." +msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time" +msgstr "kan inte städa angivna scheman och exkludera scheman pÃ¥ samma gÃ¥ng" -#: vacuumdb.c:412 +#: vacuumdb.c:444 +#, c-format +msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time" +msgstr "kan inte städa alla tabeller i scheman och exkludera scheman pÃ¥ samma gÃ¥ng" + +#: vacuumdb.c:457 +#, c-format +msgid "out of memory" +msgstr "slut pÃ¥ minne" + +#: vacuumdb.c:502 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Skapar minimal optimeringsstatistik (1 mÃ¥l)" -#: vacuumdb.c:413 +#: vacuumdb.c:503 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Skapar medium optimeringsstatistik (10 mÃ¥l)" -#: vacuumdb.c:414 +#: vacuumdb.c:504 msgid "Generating default (full) optimizer statistics" msgstr "Skapar förvald (full) optimeringsstatistik" -#: vacuumdb.c:479 +#: vacuumdb.c:583 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: processar databasen \"%s\": %s\n" -#: vacuumdb.c:482 +#: vacuumdb.c:586 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: städar databasen \"%s\".\n" -#: vacuumdb.c:952 +#: vacuumdb.c:1135 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "städning av tabell \"%s\" i databasen \"%s\" misslyckades: %s" -#: vacuumdb.c:955 +#: vacuumdb.c:1138 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "städning av databasen \"%s\" misslyckades: %s" -#: vacuumdb.c:963 +#: vacuumdb.c:1146 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1050,114 +1129,134 @@ msgstr "" "%s städar och analyserar en PostgreSQL-databas.\n" "\n" -#: vacuumdb.c:967 +#: vacuumdb.c:1150 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all städa i alla databaser\n" -#: vacuumdb.c:968 +#: vacuumdb.c:1151 +#, c-format +msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n" +msgstr " --buffer-usage-limit=STORLEK storlek pÃ¥ ringbuffert som används vid städning\n" + +#: vacuumdb.c:1152 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=DBNAMN databas att städa i\n" -#: vacuumdb.c:969 +#: vacuumdb.c:1153 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping stäng av alla sidöverhoppande beteeenden\n" -#: vacuumdb.c:970 +#: vacuumdb.c:1154 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo visa kommandon som skickas till servern\n" -#: vacuumdb.c:971 +#: vacuumdb.c:1155 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full utför full städning\n" -#: vacuumdb.c:972 +#: vacuumdb.c:1156 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze frys information om radtransaktioner\n" -#: vacuumdb.c:973 +#: vacuumdb.c:1157 #, c-format msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" msgstr " --force-index-cleanup ta alltid bort indexposter som pekar pÃ¥ döda tupler\n" -#: vacuumdb.c:974 +#: vacuumdb.c:1158 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=NUM använd sÃ¥ här mÃ¥nga samtida anslutningar för städning\n" -#: vacuumdb.c:975 +#: vacuumdb.c:1159 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr " --min-mxid-age=MXID_Ã…LDER minimal multixact-ID-Ã¥lder i tabeller som skall städas\n" -#: vacuumdb.c:976 +#: vacuumdb.c:1160 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr " --min-xid-age=XID_Ã…LDER minimal transaktions-ID-Ã¥lder i tabeller som skall städas\n" -#: vacuumdb.c:977 +#: vacuumdb.c:1161 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" msgstr " --no-index-cleanup ta inte bort indexposter som pekar pÃ¥ döda tupler\n" -#: vacuumdb.c:978 +#: vacuumdb.c:1162 +#, c-format +msgid " --no-process-main skip the main relation\n" +msgstr " --no-process-main skippa huvudrelationen\n" + +#: vacuumdb.c:1163 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" msgstr " --no-process-toast hoppa över TOAST-tabellen som hör ihop med tabellen som städas\n" -#: vacuumdb.c:979 +#: vacuumdb.c:1164 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" msgstr " --no-truncate trunkera inte tomma sidor i slutet av tabellen\n" -#: vacuumdb.c:980 +#: vacuumdb.c:1165 +#, c-format +msgid " -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n" +msgstr " -n, --schema=SCHEMA städa enbart tabeller i angiva scheman\n" + +#: vacuumdb.c:1166 +#, c-format +msgid " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n" +msgstr " -N, --exclude-schema=SCHEMA städa inte tabeller i angivna scheman\n" + +#: vacuumdb.c:1167 #, c-format msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr "" " -P, --parallel=PARALLELLA_ARBETARE\n" " använda sÃ¥ här mÃ¥nga bakgrundsarbetare för städning, om det finns\n" -#: vacuumdb.c:981 +#: vacuumdb.c:1168 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet skriv inte ut nÃ¥gra meddelanden\n" -#: vacuumdb.c:982 +#: vacuumdb.c:1169 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked hoppa äver relationer som inte kan lÃ¥sas direkt\n" -#: vacuumdb.c:983 +#: vacuumdb.c:1170 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr " -t, --table='TABELL[(KOLUMNER)]' städa enbart i dessa tabeller\n" -#: vacuumdb.c:984 +#: vacuumdb.c:1171 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose skriv massor med utdata\n" -#: vacuumdb.c:985 +#: vacuumdb.c:1172 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" -#: vacuumdb.c:986 +#: vacuumdb.c:1173 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze uppdatera optimeringsstatistik\n" -#: vacuumdb.c:987 +#: vacuumdb.c:1174 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr " -Z, --analyze-only uppdatera bara optimeringsstatistik; ingen städning\n" -#: vacuumdb.c:988 +#: vacuumdb.c:1175 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in multiple\n" @@ -1166,12 +1265,12 @@ msgstr "" " --analyze-in-stages uppdatera bara optimeringsstatistik, men i\n" " flera steg för snabbare resultat; ingen städning\n" -#: vacuumdb.c:990 +#: vacuumdb.c:1177 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: vacuumdb.c:998 +#: vacuumdb.c:1185 #, c-format msgid "" "\n" diff --git a/src/bin/scripts/po/uk.po b/src/bin/scripts/po/uk.po index 59346f818326e..5ba97aa5045d0 100644 --- a/src/bin/scripts/po/uk.po +++ b/src/bin/scripts/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:50+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:22+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pgscripts.pot\n" -"X-Crowdin-File-ID: 922\n" +"X-Crowdin-File: /REL_17_STABLE/pgscripts.pot\n" +"X-Crowdin-File-ID: 1038\n" #: ../../../src/common/logging.c:276 #, c-format @@ -38,16 +38,58 @@ msgid "hint: " msgstr "підказка: " #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 -#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:162 +#: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 #, c-format msgid "out of memory\n" msgstr "недоÑтатньо пам'Ñті\n" -#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:154 +#: ../../common/fe_memutils.c:92 ../../common/fe_memutils.c:153 #, c-format msgid "cannot duplicate null pointer (internal error)\n" msgstr "неможливо дублювати нульовий покажчик (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°)\n" +#: ../../common/file_utils.c:70 ../../common/file_utils.c:347 +#: ../../common/file_utils.c:406 ../../common/file_utils.c:480 +#, c-format +msgid "could not open file \"%s\": %m" +msgstr "не можливо відкрити файл \"%s\": %m" + +#: ../../common/file_utils.c:76 +#, c-format +msgid "could not synchronize file system for file \"%s\": %m" +msgstr "не вдалоÑÑ Ñинхронізувати файлову ÑиÑтему Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ñƒ \"%s\": %m" + +#: ../../common/file_utils.c:120 ../../common/file_utils.c:566 +#, c-format +msgid "could not stat file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію від файлу \"%s\": %m" + +#: ../../common/file_utils.c:130 ../../common/file_utils.c:227 +#: ../../fe_utils/option_utils.c:99 +#, c-format +msgid "this build does not support sync method \"%s\"" +msgstr "Ñ†Ñ Ð·Ð±Ñ–Ñ€ÐºÐ° не підтримує метод Ñинхронізації \"%s\"" + +#: ../../common/file_utils.c:151 ../../common/file_utils.c:281 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:169 ../../common/file_utils.c:315 +#, c-format +msgid "could not read directory \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог \"%s\": %m" + +#: ../../common/file_utils.c:418 ../../common/file_utils.c:488 +#, c-format +msgid "could not fsync file \"%s\": %m" +msgstr "не вдалоÑÑ fsync файл \"%s\": %m" + +#: ../../common/file_utils.c:498 +#, c-format +msgid "could not rename file \"%s\" to \"%s\": %m" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ¹Ð¼ÐµÐ½ÑƒÐ²Ð°Ñ‚Ð¸ файл \"%s\" на \"%s\": %m" + #: ../../common/username.c:43 #, c-format msgid "could not look up effective user ID %ld: %s" @@ -62,15 +104,15 @@ msgstr "кориÑтувача не Ñ–Ñнує" msgid "user name lookup failure: error code %lu" msgstr "невдала підÑтановка імені кориÑтувача: код помилки %lu" -#: ../../fe_utils/cancel.c:189 ../../fe_utils/cancel.c:238 +#: ../../fe_utils/cancel.c:186 ../../fe_utils/cancel.c:235 msgid "Cancel request sent\n" msgstr "Запит на ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ð¹\n" -#: ../../fe_utils/cancel.c:190 ../../fe_utils/cancel.c:239 +#: ../../fe_utils/cancel.c:187 ../../fe_utils/cancel.c:236 msgid "Could not send cancel request: " msgstr "Ðе вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати запит на ÑкаÑуваннÑ: " -#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:104 +#: ../../fe_utils/connect_utils.c:49 ../../fe_utils/connect_utils.c:103 msgid "Password: " msgstr "Пароль: " @@ -79,7 +121,7 @@ msgstr "Пароль: " msgid "could not connect to database %s: out of memory" msgstr "не можливо під'єднатиÑÑ Ð´Ð¾ бази даних %s: не виÑтачає пам'Ñті" -#: ../../fe_utils/connect_utils.c:117 pg_isready.c:146 +#: ../../fe_utils/connect_utils.c:116 pg_isready.c:146 #, c-format msgid "%s" msgstr "%s" @@ -94,12 +136,27 @@ msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ msgid "%s must be in range %d..%d" msgstr "%s має бути в діапазоні %d..%d" -#: ../../fe_utils/parallel_slot.c:301 +#: ../../fe_utils/option_utils.c:106 +#, c-format +msgid "unrecognized sync method: %s" +msgstr "нерозпізнаний метод Ñинхронізації: %s" + +#: ../../fe_utils/parallel_slot.c:317 #, c-format -msgid "too many jobs for this platform" -msgstr "занадто багато завдань Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— платформи" +msgid "too many jobs for this platform: %d" +msgstr "занадто багато завдань Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— платформи: %d" -#: ../../fe_utils/parallel_slot.c:519 +#: ../../fe_utils/parallel_slot.c:326 +#, c-format +msgid "socket file descriptor out of range for select(): %d" +msgstr "деÑкриптор файлу Ñокету поза діапазоном Ð´Ð»Ñ select(): %d" + +#: ../../fe_utils/parallel_slot.c:328 +#, c-format +msgid "Try fewer jobs." +msgstr "Спробуйте менше робочих завдань." + +#: ../../fe_utils/parallel_slot.c:553 #, c-format msgid "processing of database \"%s\" failed: %s" msgstr "обробка бази даних \"%s\" не вдалаÑÑŒ: %s" @@ -113,22 +170,27 @@ msgstr[1] "(%lu Ñ€Ñдки)" msgstr[2] "(%lu Ñ€Ñдків)" msgstr[3] "(%lu Ñ€Ñдка)" -#: ../../fe_utils/print.c:3109 +#: ../../fe_utils/print.c:3154 #, c-format msgid "Interrupted\n" msgstr "Перервано\n" -#: ../../fe_utils/print.c:3173 +#: ../../fe_utils/print.c:3188 +#, c-format +msgid "Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n" +msgstr "Ðеможливо надрукувати вміÑÑ‚ таблиці: кількіÑть комірок %lld дорівнює або перевищує макÑимальне Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %lld.\n" + +#: ../../fe_utils/print.c:3229 #, c-format msgid "Cannot add header to table content: column count of %d exceeded.\n" msgstr "Ðеможливо додати заголовок до вміÑту таблиці: кількіÑть колонок %d перевищено.\n" -#: ../../fe_utils/print.c:3213 +#: ../../fe_utils/print.c:3272 #, c-format -msgid "Cannot add cell to table content: total cell count of %d exceeded.\n" -msgstr "Ðеможливо додати комірку до вміÑту таблиці: перевищено загальну кількіÑть комірок %d.\n" +msgid "Cannot add cell to table content: total cell count of %lld exceeded.\n" +msgstr "Ðеможливо додати комірку до вміÑту таблиці: перевищено загальну кількіÑть комірок %lld.\n" -#: ../../fe_utils/print.c:3471 +#: ../../fe_utils/print.c:3530 #, c-format msgid "invalid output format (internal error): %d" msgstr "невірний формат виводу (Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°): %d" @@ -143,164 +205,169 @@ msgstr "запит не вдавÑÑ: %s" msgid "Query was: %s" msgstr "Запит був: %s" -#: clusterdb.c:113 clusterdb.c:132 createdb.c:139 createdb.c:158 -#: createuser.c:170 createuser.c:185 dropdb.c:104 dropdb.c:113 dropdb.c:121 +#: ../../fe_utils/string_utils.c:434 +#, c-format +msgid "shell command argument contains a newline or carriage return: \"%s\"\n" +msgstr "аргумент командної оболонки міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: ../../fe_utils/string_utils.c:607 +#, c-format +msgid "database name contains a newline or carriage return: \"%s\"\n" +msgstr "назва бази даних міÑтить Ñимвол нового Ñ€Ñдка або Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ ÐºÐ°Ñ€ÐµÑ‚ÐºÐ¸: \"%s\"\n" + +#: clusterdb.c:114 clusterdb.c:133 createdb.c:149 createdb.c:168 +#: createuser.c:195 createuser.c:210 dropdb.c:104 dropdb.c:113 dropdb.c:121 #: dropuser.c:95 dropuser.c:110 dropuser.c:123 pg_isready.c:97 pg_isready.c:111 -#: reindexdb.c:174 reindexdb.c:193 vacuumdb.c:241 vacuumdb.c:260 +#: reindexdb.c:177 reindexdb.c:196 vacuumdb.c:280 vacuumdb.c:300 #, c-format msgid "Try \"%s --help\" for more information." msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації." -#: clusterdb.c:130 createdb.c:156 createuser.c:183 dropdb.c:119 dropuser.c:108 -#: pg_isready.c:109 reindexdb.c:191 vacuumdb.c:258 +#: clusterdb.c:131 createdb.c:166 createuser.c:208 dropdb.c:119 dropuser.c:108 +#: pg_isready.c:109 reindexdb.c:194 vacuumdb.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному Ñ€Ñдку (перший \"%s\")" -#: clusterdb.c:148 +#: clusterdb.c:149 #, c-format msgid "cannot cluster all databases and a specific one at the same time" msgstr "неможливо клаÑтеризувати вÑÑ– бази даних Ñ– одну вказану одночаÑно" -#: clusterdb.c:151 -#, c-format -msgid "cannot cluster specific table(s) in all databases" -msgstr "неможливо клаÑтеризувати вказані таблиці у вÑÑ–Ñ… базах даних" - -#: clusterdb.c:215 +#: clusterdb.c:214 #, c-format msgid "clustering of table \"%s\" in database \"%s\" failed: %s" msgstr "клаÑтеризувати таблицю \"%s\" у базі даних \"%s\" не вдалоÑÑ: %s" -#: clusterdb.c:218 +#: clusterdb.c:217 #, c-format msgid "clustering of database \"%s\" failed: %s" msgstr "клаÑтеризувати базу даних \"%s\" не вдалоÑÑ: %s" -#: clusterdb.c:246 +#: clusterdb.c:248 #, c-format msgid "%s: clustering database \"%s\"\n" msgstr "%s: клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Ð±Ð°Ð·Ð¸ даних \"%s\"\n" -#: clusterdb.c:262 +#: clusterdb.c:274 #, c-format msgid "%s clusters all previously clustered tables in a database.\n\n" msgstr "%s клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ñ–Ñ ÑƒÑÑ–Ñ… попередньо клаÑтеризованих таблиць в базі даних.\n\n" -#: clusterdb.c:263 createdb.c:283 createuser.c:346 dropdb.c:172 dropuser.c:170 -#: pg_isready.c:226 reindexdb.c:760 vacuumdb.c:964 +#: clusterdb.c:275 createdb.c:298 createuser.c:415 dropdb.c:172 dropuser.c:170 +#: pg_isready.c:226 reindexdb.c:868 vacuumdb.c:1147 #, c-format msgid "Usage:\n" msgstr "ВикориÑтаннÑ:\n" -#: clusterdb.c:264 reindexdb.c:761 vacuumdb.c:965 +#: clusterdb.c:276 reindexdb.c:869 vacuumdb.c:1148 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: clusterdb.c:265 createdb.c:285 createuser.c:348 dropdb.c:174 dropuser.c:172 -#: pg_isready.c:229 reindexdb.c:762 vacuumdb.c:966 +#: clusterdb.c:277 createdb.c:300 createuser.c:417 dropdb.c:174 dropuser.c:172 +#: pg_isready.c:229 reindexdb.c:870 vacuumdb.c:1149 #, c-format msgid "\n" "Options:\n" msgstr "\n" "Параметри:\n" -#: clusterdb.c:266 +#: clusterdb.c:278 #, c-format msgid " -a, --all cluster all databases\n" msgstr " -a, --all клаÑÑ‚ÐµÑ€Ð¸Ð·Ð°Ñ†Ñ–Ñ ÑƒÑÑ–Ñ… баз даних\n" -#: clusterdb.c:267 +#: clusterdb.c:279 #, c-format msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=ІМ'Я_БД база даних Ð´Ð»Ñ ÐºÐ»Ð°Ñтеризації\n" -#: clusterdb.c:268 createuser.c:352 dropdb.c:175 dropuser.c:173 +#: clusterdb.c:280 createuser.c:423 dropdb.c:175 dropuser.c:173 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo показати команди, надіÑлані Ñерверу\n" -#: clusterdb.c:269 +#: clusterdb.c:281 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не виводити жодних повідомлень\n" -#: clusterdb.c:270 +#: clusterdb.c:282 #, c-format msgid " -t, --table=TABLE cluster specific table(s) only\n" msgstr " -t, --table=ТÐБЛИЦЯ клаÑтеризувати тільки вказані таблиці\n" -#: clusterdb.c:271 +#: clusterdb.c:283 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose виводити багато інформації\n" -#: clusterdb.c:272 createuser.c:364 dropdb.c:178 dropuser.c:176 +#: clusterdb.c:284 createuser.c:439 dropdb.c:178 dropuser.c:176 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" -#: clusterdb.c:273 createuser.c:369 dropdb.c:180 dropuser.c:178 +#: clusterdb.c:285 createuser.c:447 dropdb.c:180 dropuser.c:178 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: clusterdb.c:274 createdb.c:300 createuser.c:370 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:235 reindexdb.c:777 vacuumdb.c:991 +#: clusterdb.c:286 createdb.c:317 createuser.c:448 dropdb.c:181 dropuser.c:179 +#: pg_isready.c:235 reindexdb.c:885 vacuumdb.c:1178 #, c-format msgid "\n" "Connection options:\n" msgstr "\n" "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·'єднаннÑ:\n" -#: clusterdb.c:275 createuser.c:371 dropdb.c:182 dropuser.c:180 vacuumdb.c:992 +#: clusterdb.c:287 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1179 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=HOSTNAME хоÑÑ‚ Ñервера бази даних або каталог Ñокетів\n" -#: clusterdb.c:276 createuser.c:372 dropdb.c:183 dropuser.c:181 vacuumdb.c:993 +#: clusterdb.c:288 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1180 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT порт Ñервера бази даних\n" -#: clusterdb.c:277 dropdb.c:184 vacuumdb.c:994 +#: clusterdb.c:289 dropdb.c:184 vacuumdb.c:1181 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ІМ'Я_КОРИСТУВÐЧРім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñервером\n" -#: clusterdb.c:278 createuser.c:374 dropdb.c:185 dropuser.c:183 vacuumdb.c:995 +#: clusterdb.c:290 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1182 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ніколи не запитувати пароль\n" -#: clusterdb.c:279 createuser.c:375 dropdb.c:186 dropuser.c:184 vacuumdb.c:996 +#: clusterdb.c:291 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1183 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password запроÑити пароль\n" -#: clusterdb.c:280 dropdb.c:187 vacuumdb.c:997 +#: clusterdb.c:292 dropdb.c:187 vacuumdb.c:1184 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME альтернативна бази даних Ð´Ð»Ñ Ð¾Ð±ÑлуговуваннÑ\n" -#: clusterdb.c:281 +#: clusterdb.c:293 #, c-format msgid "\n" "Read the description of the SQL command CLUSTER for details.\n" msgstr "\n" "Ð”Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹ читайте Ð¾Ð¿Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ SQL CLUSTER.\n" -#: clusterdb.c:282 createdb.c:308 createuser.c:376 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:785 vacuumdb.c:999 +#: clusterdb.c:294 createdb.c:325 createuser.c:454 dropdb.c:188 dropuser.c:185 +#: pg_isready.c:240 reindexdb.c:893 vacuumdb.c:1186 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "ПовідомлÑти про помилки на <%s>.\n" -#: clusterdb.c:283 createdb.c:309 createuser.c:377 dropdb.c:189 dropuser.c:186 -#: pg_isready.c:241 reindexdb.c:786 vacuumdb.c:1000 +#: clusterdb.c:295 createdb.c:326 createuser.c:455 dropdb.c:189 dropuser.c:186 +#: pg_isready.c:241 reindexdb.c:894 vacuumdb.c:1187 #, c-format msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" @@ -336,278 +403,314 @@ msgstr "%s (%s/%s) " msgid "Please answer \"%s\" or \"%s\".\n" msgstr "Відповідь має бути \"%s\" або \"%s\".\n" -#: createdb.c:165 -#, c-format -msgid "only one of --locale and --lc-ctype can be specified" -msgstr "тільки --locale або --lc-ctype може бути вказаний" - -#: createdb.c:167 -#, c-format -msgid "only one of --locale and --lc-collate can be specified" -msgstr "можна вказати лише одне: або --locale, або --lc-collate" - #: createdb.c:175 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" не Ñ” невірним ім'Ñм кодуваннÑ" -#: createdb.c:245 +#: createdb.c:260 #, c-format msgid "database creation failed: %s" msgstr "Ñтворити базу даних не вдалоÑÑ: %s" -#: createdb.c:264 +#: createdb.c:279 #, c-format msgid "comment creation failed (database was created): %s" msgstr "не вдалоÑÑ Ñтворити коментарі (база даних була Ñтворена): %s" -#: createdb.c:282 +#: createdb.c:297 #, c-format msgid "%s creates a PostgreSQL database.\n\n" msgstr "%s Ñтворює базу даних PostgreSQL.\n\n" -#: createdb.c:284 +#: createdb.c:299 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" -#: createdb.c:286 +#: createdb.c:301 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr " -D, --tablespace=ТÐБЛИЧÐИЙ_ПРОСТІР табличний проÑтір Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних за замовчуваннÑм\n" -#: createdb.c:287 reindexdb.c:766 +#: createdb.c:302 reindexdb.c:874 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo показати команди, надіÑлані Ñерверу\n" -#: createdb.c:288 +#: createdb.c:303 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=КОДУВÐÐÐЯ ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних\n" -#: createdb.c:289 +#: createdb.c:304 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=ЛОКÐЛЬ параметри локалі бази даних\n" -#: createdb.c:290 +#: createdb.c:305 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=ЛОКÐЛЬ параметр LC_COLLATE Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних\n" -#: createdb.c:291 +#: createdb.c:306 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=ЛОКÐЛЬ параметр LC_CTYPE Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних\n" -#: createdb.c:292 +#: createdb.c:307 +#, c-format +msgid " --builtin-locale=LOCALE builtin locale setting for the database\n" +msgstr " --builtin-locale=LOCALE параметри вбудованої локалі бази даних\n" + +#: createdb.c:308 #, c-format msgid " --icu-locale=LOCALE ICU locale setting for the database\n" msgstr " --icu-locale=LOCALE параметр локалі ICU бази даних\n" -#: createdb.c:293 +#: createdb.c:309 +#, c-format +msgid " --icu-rules=RULES ICU rules setting for the database\n" +msgstr " --icu-locale=RULES правила ICU Ð´Ð»Ñ Ð±Ð°Ð·Ð¸ даних\n" + +#: createdb.c:310 #, c-format -msgid " --locale-provider={libc|icu}\n" +msgid " --locale-provider={builtin|libc|icu}\n" " locale provider for the database's default collation\n" -msgstr " --locale-provider={libc|icu}\n" +msgstr " --locale-provider={builtin|libc|icu}\n" " провайдер локалі Ð´Ð»Ñ ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних за замовчуваннÑм\n" -#: createdb.c:295 +#: createdb.c:312 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr " -O, --влаÑник=ВЛÐСÐИК кориÑтувач-влаÑник нової бази даних\n" -#: createdb.c:296 +#: createdb.c:313 #, c-format msgid " -S, --strategy=STRATEGY database creation strategy wal_log or file_copy\n" msgstr " -S, --strategy=STRATEGY ÑÑ‚Ñ€Ð°Ñ‚ÐµÐ³Ñ–Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних Ð´Ð»Ñ wal_log або file_copy\n" -#: createdb.c:297 +#: createdb.c:314 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --шаблон=ШÐБЛОРшаблонна база даних Ð´Ð»Ñ ÐºÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ\n" -#: createdb.c:298 reindexdb.c:775 +#: createdb.c:315 reindexdb.c:883 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ, потім вийти\n" -#: createdb.c:299 reindexdb.c:776 +#: createdb.c:316 reindexdb.c:884 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: createdb.c:301 reindexdb.c:778 +#: createdb.c:318 reindexdb.c:886 #, c-format msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr " -h, --host=ІМ'Я_ХОСТРхоÑÑ‚ Ñервера бази даних або каталог Ñокетів\n" -#: createdb.c:302 reindexdb.c:779 +#: createdb.c:319 reindexdb.c:887 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт Ñервера бази даних\n" -#: createdb.c:303 reindexdb.c:780 +#: createdb.c:320 reindexdb.c:888 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ІМ'Я_КОРИСТУВÐЧРім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñервером\n" -#: createdb.c:304 reindexdb.c:781 +#: createdb.c:321 reindexdb.c:889 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password ніколи не запитувати пароль\n" -#: createdb.c:305 reindexdb.c:782 +#: createdb.c:322 reindexdb.c:890 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password запроÑити пароль\n" -#: createdb.c:306 reindexdb.c:783 +#: createdb.c:323 reindexdb.c:891 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=DBNAME альтернативна бази даних Ð´Ð»Ñ Ð¾Ð±ÑлуговуваннÑ\n" -#: createdb.c:307 +#: createdb.c:324 #, c-format msgid "\n" "By default, a database with the same name as the current user is created.\n" msgstr "\n" "За замовчуваннÑм ім'Ñм бази даних вважаєтьÑÑ Ñ–Ð¼'Ñ Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ кориÑтувача.\n" -#: createuser.c:193 +#: createuser.c:218 msgid "Enter name of role to add: " msgstr "Введіть ім'Ñ Ð½Ð¾Ð²Ð¾Ñ— ролі: " -#: createuser.c:208 +#: createuser.c:233 msgid "Enter password for new role: " msgstr "Введіть пароль Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñ— ролі: " -#: createuser.c:209 +#: createuser.c:234 msgid "Enter it again: " msgstr "Введіть знову: " -#: createuser.c:212 +#: createuser.c:237 #, c-format msgid "Passwords didn't match.\n" msgstr "Паролі не Ñпівпадають.\n" -#: createuser.c:220 +#: createuser.c:245 msgid "Shall the new role be a superuser?" msgstr "Чи буде нова роль ÑуперкориÑтувачем?" -#: createuser.c:235 +#: createuser.c:260 msgid "Shall the new role be allowed to create databases?" msgstr "Чи дозволено новій ролі Ñтворювати бази даних?" -#: createuser.c:243 +#: createuser.c:268 msgid "Shall the new role be allowed to create more new roles?" msgstr "Чи дозволено новій ролі Ñтворювати інші нові ролі?" -#: createuser.c:278 +#: createuser.c:309 #, c-format msgid "password encryption failed: %s" msgstr "помилка ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ: %s" -#: createuser.c:331 +#: createuser.c:400 #, c-format msgid "creation of new role failed: %s" msgstr "не вдалоÑÑ Ñтворити нову роль: %s" -#: createuser.c:345 +#: createuser.c:414 #, c-format msgid "%s creates a new PostgreSQL role.\n\n" msgstr "%s Ñтворює нову роль PostgreSQL.\n\n" -#: createuser.c:347 dropuser.c:171 +#: createuser.c:416 dropuser.c:171 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [OPTION]... [ROLENAME]\n" -#: createuser.c:349 +#: createuser.c:418 +#, c-format +msgid " -a, --with-admin=ROLE ROLE will be a member of new role with admin\n" +" option\n" +msgstr " -a, --with-admin=ROLE ROLE Ñтане членом нової ролі з правом\n" +" адмініÑтратора\n" + +#: createuser.c:420 #, c-format msgid " -c, --connection-limit=N connection limit for role (default: no limit)\n" msgstr " -c, --connection-limit=N ліміт під'єднань Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ– (за замовчуваннÑм ліміту немає)\n" -#: createuser.c:350 +#: createuser.c:421 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb роль може Ñтворювати нові бази даних\n" -#: createuser.c:351 +#: createuser.c:422 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr " -D, --no-createdb роль не може Ñтворювати нові бази даних (за замовчуваннÑм)\n" -#: createuser.c:353 +#: createuser.c:424 +#, c-format +msgid " -g, --member-of=ROLE new role will be a member of ROLE\n" +msgstr " -g, --member-of=ROLE нова роль буде членом ROLE\n" + +#: createuser.c:425 #, c-format -msgid " -g, --role=ROLE new role will be a member of this role\n" -msgstr " -g, --role=РОЛЬ нова роль буде включена в цю роль\n" +msgid " --role=ROLE (same as --member-of, deprecated)\n" +msgstr " --role=ROLE (те Ñаме, що --member-of, заÑтаріло)\n" -#: createuser.c:354 +#: createuser.c:426 #, c-format msgid " -i, --inherit role inherits privileges of roles it is a\n" " member of (default)\n" msgstr " -i, --inherit роль переймає права від ролей до Ñких вона\n" " включена (за замовчуваннÑм)\n" -#: createuser.c:356 +#: createuser.c:428 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit роль не переймає права\n" -#: createuser.c:357 +#: createuser.c:429 #, c-format msgid " -l, --login role can login (default)\n" msgstr " -l, --login роль може увійти (за замовчуваннÑм)\n" -#: createuser.c:358 +#: createuser.c:430 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login роль не може увійти\n" -#: createuser.c:359 +#: createuser.c:431 +#, c-format +msgid " -m, --with-member=ROLE ROLE will be a member of new role\n" +msgstr " -m, --with-member=ROLE ROLE буде членом нової ролі\n" + +#: createuser.c:432 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»ÑŽ Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñ— ролі\n" -#: createuser.c:360 +#: createuser.c:433 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole роль може Ñтворювати нові ролі\n" -#: createuser.c:361 +#: createuser.c:434 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr " -R, --no-createrole роль не може Ñтворювати нові бази даних (за замовчуваннÑм)\n" -#: createuser.c:362 +#: createuser.c:435 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser роль буде ÑуперкориÑтувачем\n" -#: createuser.c:363 +#: createuser.c:436 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr " -S, --no-superuser роль не буде ÑуперкориÑтувачем (за замовчуваннÑм)\n" -#: createuser.c:365 +#: createuser.c:437 +#, c-format +msgid " -v, --valid-until=TIMESTAMP\n" +" password expiration date and time for role\n" +msgstr " -v, --valid-until=TIMESTAMP\n" +" термін дії Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð´Ð»Ñ Ñ€Ð¾Ð»Ñ–\n" + +#: createuser.c:440 #, c-format msgid " --interactive prompt for missing role name and attributes rather\n" " than using defaults\n" msgstr " --interactive запитати пропущені Ñ–Ð¼â€™Ñ Ñ€Ð¾Ð»Ñ– та атрибути, а не викориÑтовувати Ñтандартні\n" -#: createuser.c:367 +#: createuser.c:442 +#, c-format +msgid " --bypassrls role can bypass row-level security (RLS) policy\n" +msgstr " --bypassrls роль може обійти політику безпеки на рівні Ñ€Ñдків (RLS)\n" + +#: createuser.c:443 +#, c-format +msgid " --no-bypassrls role cannot bypass row-level security (RLS) policy\n" +" (default)\n" +msgstr " --no-bypassrls роль не може обходити політику на рівні Ñ€Ñдків (RLS)\n" +" (за замовчуваннÑм)\n" + +#: createuser.c:445 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication роль може ініціювати реплікацію\n" -#: createuser.c:368 +#: createuser.c:446 #, c-format -msgid " --no-replication role cannot initiate replication\n" -msgstr " --no-replication роль не може ініціювати реплікацію\n" +msgid " --no-replication role cannot initiate replication (default)\n" +msgstr " --no-replication роль не може ініціювати реплікацію (за замовчуваннÑм)\n" -#: createuser.c:373 +#: createuser.c:451 #, c-format msgid " -U, --username=USERNAME user name to connect as (not the one to create)\n" msgstr " -U, --username=USERNAME ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ (не Ð´Ð»Ñ ÑтвореннÑ)\n" @@ -777,345 +880,335 @@ msgstr " -t, --timeout=SECS Ñекунд Ð´Ð»Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€ msgid " -U, --username=USERNAME user name to connect as\n" msgstr " -U, --username=ІМ'Я_КОРИСТУВÐЧРім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача Ð´Ð»Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñервером\n" -#: reindexdb.c:209 -#, c-format -msgid "cannot reindex all databases and a specific one at the same time" -msgstr "неможливо переіндекÑувати вÑÑ– бази даних Ñ– одну вказану одночаÑно" - -#: reindexdb.c:211 -#, c-format -msgid "cannot reindex all databases and system catalogs at the same time" -msgstr "не можливо переіндекÑувати вÑÑ– бази даних Ñ– ÑиÑтемні каталоги одночаÑно" - -#: reindexdb.c:213 -#, c-format -msgid "cannot reindex specific schema(s) in all databases" -msgstr "неможливо переіндекÑувати вказані Ñхеми в уÑÑ–Ñ… базах даних" - -#: reindexdb.c:215 -#, c-format -msgid "cannot reindex specific table(s) in all databases" -msgstr "неможливо переіндекÑувати вказані таблиці в уÑÑ–Ñ… базах даних" - -#: reindexdb.c:217 -#, c-format -msgid "cannot reindex specific index(es) in all databases" -msgstr "неможливо переіндекÑувати вказані індекÑи в уÑÑ–Ñ… базах даних" - -#: reindexdb.c:227 -#, c-format -msgid "cannot reindex specific schema(s) and system catalogs at the same time" -msgstr "не можливо переіндекÑувати вказані Ñхеми Ñ– ÑиÑтемні каталоги одночаÑно" - -#: reindexdb.c:229 -#, c-format -msgid "cannot reindex specific table(s) and system catalogs at the same time" -msgstr "не можливо переіндекÑувати вказані таблиці Ñ– ÑиÑтемні каталоги одночаÑно" - -#: reindexdb.c:231 -#, c-format -msgid "cannot reindex specific index(es) and system catalogs at the same time" -msgstr "не можливо переіндекÑувати вказані індекÑи Ñ– ÑиÑтемні каталоги одночаÑно" - -#: reindexdb.c:234 +#: reindexdb.c:210 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "не можна викориÑтовувати декілька завдань Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ–Ð½Ð´ÐµÐºÑÑƒÐ²Ð°Ð½Ð½Ñ ÑиÑтемних каталогів" -#: reindexdb.c:260 +#: reindexdb.c:215 #, c-format -msgid "cannot use multiple jobs to reindex indexes" -msgstr "не можна викориÑтовувати декілька завдань Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ–Ð½Ð´ÐµÐºÑÑƒÐ²Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑів" +msgid "cannot reindex all databases and a specific one at the same time" +msgstr "неможливо переіндекÑувати вÑÑ– бази даних Ñ– одну вказану одночаÑно" -#: reindexdb.c:323 reindexdb.c:330 vacuumdb.c:425 vacuumdb.c:432 vacuumdb.c:439 -#: vacuumdb.c:446 vacuumdb.c:453 vacuumdb.c:460 vacuumdb.c:465 vacuumdb.c:469 -#: vacuumdb.c:473 +#: reindexdb.c:296 reindexdb.c:303 vacuumdb.c:515 vacuumdb.c:522 vacuumdb.c:529 +#: vacuumdb.c:536 vacuumdb.c:543 vacuumdb.c:550 vacuumdb.c:557 vacuumdb.c:562 +#: vacuumdb.c:566 vacuumdb.c:570 vacuumdb.c:574 #, c-format msgid "cannot use the \"%s\" option on server versions older than PostgreSQL %s" msgstr "не можна викориÑтовувати параметр \"%s\" на Ñерверній верÑÑ–Ñ— Ñтарішій за PostgreSQL %s" -#: reindexdb.c:369 -#, c-format -msgid "cannot reindex system catalogs concurrently, skipping all" -msgstr "не можна конкурентно переіндекÑувати ÑиÑтемні каталоги, пропуÑкаємо" - -#: reindexdb.c:573 +#: reindexdb.c:584 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "переіндекÑувати базу даних \"%s\" не вдалоÑÑ: %s" -#: reindexdb.c:577 +#: reindexdb.c:588 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "переіндекÑувати індекÑи \"%s\" в базі даних \"%s\" не вдалоÑÑ: %s" -#: reindexdb.c:581 +#: reindexdb.c:592 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "переіндекÑувати Ñхему \"%s\" в базі даних \"%s\" не вдалоÑÑ: %s" -#: reindexdb.c:585 +#: reindexdb.c:596 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "переіндекÑÑƒÐ²Ð°Ð½Ð½Ñ ÑиÑтемних каталогів в базі даних \"%s\" не вдалоÑÑ: %s" -#: reindexdb.c:589 +#: reindexdb.c:600 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "переіндекÑувати таблиці \"%s\" в базі даних \"%s\" не вдалоÑÑ: %s" -#: reindexdb.c:742 +#: reindexdb.c:824 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: переіндекÑÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð°Ð·Ð¸ даних \"%s\"\n" -#: reindexdb.c:759 +#: reindexdb.c:867 #, c-format msgid "%s reindexes a PostgreSQL database.\n\n" msgstr "%s переіндекÑовує базу даних PostgreSQL.\n\n" -#: reindexdb.c:763 +#: reindexdb.c:871 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all переіндекÑувати вÑÑ– бази даних\n" -#: reindexdb.c:764 +#: reindexdb.c:872 #, c-format msgid " --concurrently reindex concurrently\n" msgstr " --concurrently переіндекÑувати одночаÑно\n" -#: reindexdb.c:765 +#: reindexdb.c:873 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=DBNAME база даних Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ–Ð½Ð´ÐµÐºÑуваннÑ\n" -#: reindexdb.c:767 +#: reindexdb.c:875 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr " -i, --index=INDEX повторно Ñтворити лише вказані індекÑи\n" -#: reindexdb.c:768 +#: reindexdb.c:876 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to reindex\n" msgstr " -j, --jobs=NUM викориÑтати цю кількіÑть паралельних підключень Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ–Ð½Ð´ÐµÐºÑуваннÑ\n" -#: reindexdb.c:769 +#: reindexdb.c:877 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не пиÑати жодних повідомлень\n" -#: reindexdb.c:770 +#: reindexdb.c:878 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr " -s, --system переіндекÑувати тільки ÑиÑтемні каталоги\n" -#: reindexdb.c:771 +#: reindexdb.c:879 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr " -S, --schema=SCHEMA переіндекÑувати лише вказані Ñхеми\n" -#: reindexdb.c:772 +#: reindexdb.c:880 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr " -t, --table=TABLE переіндекÑувати лише вказані таблиці\n" -#: reindexdb.c:773 +#: reindexdb.c:881 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr " --tablespace=TABLESPACE табличний проÑтір Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ±ÑƒÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ… індекÑів\n" -#: reindexdb.c:774 +#: reindexdb.c:882 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose виводити багато повідомлень\n" -#: reindexdb.c:784 +#: reindexdb.c:892 #, c-format msgid "\n" "Read the description of the SQL command REINDEX for details.\n" msgstr "\n" "Ð”Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹ читайте Ð¾Ð¿Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¸ SQL REINDEX.\n" -#: vacuumdb.c:267 vacuumdb.c:270 vacuumdb.c:273 vacuumdb.c:276 vacuumdb.c:279 -#: vacuumdb.c:282 vacuumdb.c:285 vacuumdb.c:294 +#: vacuumdb.c:313 vacuumdb.c:316 vacuumdb.c:319 vacuumdb.c:322 vacuumdb.c:325 +#: vacuumdb.c:328 vacuumdb.c:331 vacuumdb.c:334 vacuumdb.c:343 #, c-format msgid "cannot use the \"%s\" option when performing only analyze" msgstr "не можна викориÑтовувати параметр \"%s\" під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð»Ð¸ÑˆÐµ аналіза" -#: vacuumdb.c:297 +#: vacuumdb.c:346 #, c-format msgid "cannot use the \"%s\" option when performing full vacuum" msgstr "не можна викориÑтовувати параметр \"%s\" під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ VACUUM FULL" -#: vacuumdb.c:303 +#: vacuumdb.c:352 vacuumdb.c:360 #, c-format msgid "cannot use the \"%s\" option with the \"%s\" option" msgstr "викориÑтовувати параметр \"%s\" з параметром \"%s\" не можна" -#: vacuumdb.c:322 +#: vacuumdb.c:432 #, c-format msgid "cannot vacuum all databases and a specific one at the same time" msgstr "неможливо очиÑтити вÑÑ– бази даних Ñ– одну вказану одночаÑно" -#: vacuumdb.c:324 +#: vacuumdb.c:436 #, c-format -msgid "cannot vacuum specific table(s) in all databases" -msgstr "неможливо очиÑтити вказані таблиці в уÑÑ–Ñ… базах даних" +msgid "cannot vacuum all tables in schema(s) and specific table(s) at the same time" +msgstr "неможливо очиÑтити вÑÑ– таблиці в Ñхемах та вказані таблиці одночаÑно" -#: vacuumdb.c:412 +#: vacuumdb.c:440 +#, c-format +msgid "cannot vacuum specific table(s) and exclude schema(s) at the same time" +msgstr "неможливо очиÑтити вказані таблиці Ñ– виключити Ñхеми одночаÑно" + +#: vacuumdb.c:444 +#, c-format +msgid "cannot vacuum all tables in schema(s) and exclude schema(s) at the same time" +msgstr "неможливо очиÑтити вÑÑ– таблиці в Ñхемах та виключити Ñхеми одночаÑно" + +#: vacuumdb.c:457 +#, c-format +msgid "out of memory" +msgstr "недоÑтатньо пам'Ñті" + +#: vacuumdb.c:502 msgid "Generating minimal optimizer statistics (1 target)" msgstr "Ð“ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ñ–Ð½Ñ–Ð¼Ð°Ð»ÑŒÐ½Ð¾Ñ— ÑтатиÑтики Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ñ–Ð¼Ð¸Ð·Ð°Ñ‚Ð¾Ñ€Ð° (1 мета)" -#: vacuumdb.c:413 +#: vacuumdb.c:503 msgid "Generating medium optimizer statistics (10 targets)" msgstr "Ð“ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ñередньої ÑтатиÑтики Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð° (10 цілей)" -#: vacuumdb.c:414 +#: vacuumdb.c:504 msgid "Generating default (full) optimizer statistics" msgstr "Ð“ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ ÑтатиÑтики Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð° за замовчуваннÑм (повніÑтю)" -#: vacuumdb.c:479 +#: vacuumdb.c:583 #, c-format msgid "%s: processing database \"%s\": %s\n" msgstr "%s: обробка бази даних \"%s\": %s\n" -#: vacuumdb.c:482 +#: vacuumdb.c:586 #, c-format msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð±Ð°Ð·Ð¸ даних \"%s\"\n" -#: vacuumdb.c:952 +#: vacuumdb.c:1135 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "очиÑтити таблиці \"%s\" в базі даних \"%s\" не вдалоÑÑ: %s" -#: vacuumdb.c:955 +#: vacuumdb.c:1138 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "очиÑтити базу даних \"%s\" не вдалоÑÑ: %s" -#: vacuumdb.c:963 +#: vacuumdb.c:1146 #, c-format msgid "%s cleans and analyzes a PostgreSQL database.\n\n" msgstr "%s очищує й аналізує базу даних PostgreSQL.\n\n" -#: vacuumdb.c:967 +#: vacuumdb.c:1150 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all очиÑтити уÑÑ– бази даних\n" -#: vacuumdb.c:968 +#: vacuumdb.c:1151 +#, c-format +msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n" +msgstr " --buffer-usage-limit=SIZE розмір кільцевого буферу Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñтки\n" + +#: vacuumdb.c:1152 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=ІМ'Я_БД база даних Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ\n" -#: vacuumdb.c:969 +#: vacuumdb.c:1153 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr " --disable-page-skipping відключити пропуÑк Ñторінок\n" -#: vacuumdb.c:970 +#: vacuumdb.c:1154 #, c-format msgid " -e, --echo show the commands being sent to the server\n" msgstr " -e, --echo показати команди, надіÑлані Ñерверу\n" -#: vacuumdb.c:971 +#: vacuumdb.c:1155 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full зробити повне очищеннÑ\n" -#: vacuumdb.c:972 +#: vacuumdb.c:1156 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr " -F, --freeze заморозити інформацію щодо транзакцій в Ñ€Ñдках\n" -#: vacuumdb.c:973 +#: vacuumdb.c:1157 #, c-format msgid " --force-index-cleanup always remove index entries that point to dead tuples\n" msgstr " --force-index-cleanup завжди видалÑти запиÑи індекÑів, Ñкі вказують на мертві кортежі\n" -#: vacuumdb.c:974 +#: vacuumdb.c:1158 #, c-format msgid " -j, --jobs=NUM use this many concurrent connections to vacuum\n" msgstr " -j, --jobs=ЧИСЛО викориÑтати ці паралельні Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ\n" -#: vacuumdb.c:975 +#: vacuumdb.c:1159 #, c-format msgid " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to vacuum\n" msgstr " --min-mxid-age=MXID_AGE мінімальний ID ери мультитранзакції таблиць Ð´Ð»Ñ Ð²Ð°ÐºÑƒÑƒÐ¼Ñƒ\n" -#: vacuumdb.c:976 +#: vacuumdb.c:1160 #, c-format msgid " --min-xid-age=XID_AGE minimum transaction ID age of tables to vacuum\n" msgstr " --min-mxid-age=MXID_AGE мінімальний ID ери транзакції таблиць Ð´Ð»Ñ Ð²Ð°ÐºÑƒÑƒÐ¼Ñƒ\n" -#: vacuumdb.c:977 +#: vacuumdb.c:1161 #, c-format msgid " --no-index-cleanup don't remove index entries that point to dead tuples\n" msgstr " --no-index-cleanup не видалÑти запиÑи індекÑів, Ñкі вказують на мертві кортежі\n" -#: vacuumdb.c:978 +#: vacuumdb.c:1162 +#, c-format +msgid " --no-process-main skip the main relation\n" +msgstr " --no-process-main пропуÑтити головне відношеннÑ\n" + +#: vacuumdb.c:1163 #, c-format msgid " --no-process-toast skip the TOAST table associated with the table to vacuum\n" msgstr " --no-process-toast пропуÑкати таблицю TOAST, пов'Ñзану з таблицею Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ\n" -#: vacuumdb.c:979 +#: vacuumdb.c:1164 #, c-format msgid " --no-truncate don't truncate empty pages at the end of the table\n" msgstr " --no-truncate не Ñкорочувати пуÑті Ñторінки наприкінці таблиці\n" -#: vacuumdb.c:980 +#: vacuumdb.c:1165 +#, c-format +msgid " -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n" +msgstr " -n, --schema=SCHEMA очиÑтити тільки таблиці у вказаних Ñхемах\n" + +#: vacuumdb.c:1166 +#, c-format +msgid " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n" +msgstr " -N, --exclude-schema=SCHEMA не очищати таблиці у вказаних Ñхемах\n" + +#: vacuumdb.c:1167 #, c-format msgid " -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n" msgstr " -P, --parallel=PARALLEL_WORKERS викориÑтати таку кількіÑть фонових робітників Ð´Ð»Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ, Ñкщо вони доÑтупні\n" -#: vacuumdb.c:981 +#: vacuumdb.c:1168 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не пиÑати жодних повідомлень\n" -#: vacuumdb.c:982 +#: vacuumdb.c:1169 #, c-format msgid " --skip-locked skip relations that cannot be immediately locked\n" msgstr " --skip-locked пропуÑтити відношеннÑ, що не можуть бути заблоковані негайно\n" -#: vacuumdb.c:983 +#: vacuumdb.c:1170 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr " -t, --table='ТÐБЛИЦЯ[(СТОВПЦІ)]' очиÑтити тільки вказані таблиці\n" -#: vacuumdb.c:984 +#: vacuumdb.c:1171 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose виводити багато інформації\n" -#: vacuumdb.c:985 +#: vacuumdb.c:1172 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивеÑти інформацію про верÑÑ–ÑŽ Ñ– вийти\n" -#: vacuumdb.c:986 +#: vacuumdb.c:1173 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze оновити ÑтатиÑтику Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð°\n" -#: vacuumdb.c:987 +#: vacuumdb.c:1174 #, c-format msgid " -Z, --analyze-only only update optimizer statistics; no vacuum\n" msgstr " -Z, --analyze-only оновити лише ÑтатиÑтику Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð°, не очищати\n" -#: vacuumdb.c:988 +#: vacuumdb.c:1175 #, c-format msgid " --analyze-in-stages only update optimizer statistics, in multiple\n" " stages for faster results; no vacuum\n" msgstr " --analyze-in-stages оновити лише ÑтатиÑтику Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ñ–Ð·Ð°Ñ‚Ð¾Ñ€Ð°, у декілька Ñтадій Ð´Ð»Ñ ÑˆÐ²Ð¸Ð´ÑˆÐ¸Ñ… результатів, не очищати\n" -#: vacuumdb.c:990 +#: vacuumdb.c:1177 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю Ñправку, потім вийти\n" -#: vacuumdb.c:998 +#: vacuumdb.c:1185 #, c-format msgid "\n" "Read the description of the SQL command VACUUM for details.\n" diff --git a/src/bin/scripts/po/zh_CN.po b/src/bin/scripts/po/zh_CN.po index 12c75603ec1a9..6a5262d069574 100644 --- a/src/bin/scripts/po/zh_CN.po +++ b/src/bin/scripts/po/zh_CN.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: pgscripts (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2021-08-14 05:47+0000\n" -"PO-Revision-Date: 2021-08-15 18:30+0800\n" +"PO-Revision-Date: 2024-06-26 11:01+0200\n" "Last-Translator: Jie Zhang \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" @@ -892,7 +892,7 @@ msgstr " -a, --all 对所有数æ®åº“进行é‡å»ºç´¢å¼•æ“ #: reindexdb.c:796 msgid " --concurrently reindex concurrently\n" -msgstr " --concurrently åŒæ—¶é‡æ–°ç´¢å¼•\n" +msgstr " --concurrently åŒæ—¶é‡æ–°ç´¢å¼•\n" #: reindexdb.c:797 msgid " -d, --dbname=DBNAME database to reindex\n" diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c index 3e8f6aca40e99..2ff16140ad880 100644 --- a/src/bin/scripts/reindexdb.c +++ b/src/bin/scripts/reindexdb.c @@ -2,7 +2,7 @@ * * reindexdb * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/bin/scripts/reindexdb.c * @@ -30,7 +30,7 @@ typedef enum ReindexType REINDEX_INDEX, REINDEX_SCHEMA, REINDEX_SYSTEM, - REINDEX_TABLE + REINDEX_TABLE, } ReindexType; @@ -46,11 +46,17 @@ static void reindex_one_database(ConnParams *cparams, ReindexType type, static void reindex_all_databases(ConnParams *cparams, const char *progname, bool echo, bool quiet, bool verbose, bool concurrently, - int concurrentCons, const char *tablespace); -static void run_reindex_command(PGconn *conn, ReindexType type, + int concurrentCons, const char *tablespace, + bool syscatalog, SimpleStringList *schemas, + SimpleStringList *tables, + SimpleStringList *indexes); +static void gen_reindex_command(PGconn *conn, ReindexType type, const char *name, bool echo, bool verbose, - bool concurrently, bool async, - const char *tablespace); + bool concurrently, const char *tablespace, + PQExpBufferData *sql); +static void run_reindex_command(PGconn *conn, ReindexType type, + const char *name, bool echo, + PQExpBufferData *sq); static void help(const char *progname); @@ -203,62 +209,22 @@ main(int argc, char *argv[]) setup_cancel_handler(NULL); + if (concurrentCons > 1 && syscatalog) + pg_fatal("cannot use multiple jobs to reindex system catalogs"); + if (alldb) { if (dbname) pg_fatal("cannot reindex all databases and a specific one at the same time"); - if (syscatalog) - pg_fatal("cannot reindex all databases and system catalogs at the same time"); - if (schemas.head != NULL) - pg_fatal("cannot reindex specific schema(s) in all databases"); - if (tables.head != NULL) - pg_fatal("cannot reindex specific table(s) in all databases"); - if (indexes.head != NULL) - pg_fatal("cannot reindex specific index(es) in all databases"); cparams.dbname = maintenance_db; reindex_all_databases(&cparams, progname, echo, quiet, verbose, - concurrently, concurrentCons, tablespace); - } - else if (syscatalog) - { - if (schemas.head != NULL) - pg_fatal("cannot reindex specific schema(s) and system catalogs at the same time"); - if (tables.head != NULL) - pg_fatal("cannot reindex specific table(s) and system catalogs at the same time"); - if (indexes.head != NULL) - pg_fatal("cannot reindex specific index(es) and system catalogs at the same time"); - - if (concurrentCons > 1) - pg_fatal("cannot use multiple jobs to reindex system catalogs"); - - if (dbname == NULL) - { - if (getenv("PGDATABASE")) - dbname = getenv("PGDATABASE"); - else if (getenv("PGUSER")) - dbname = getenv("PGUSER"); - else - dbname = get_user_name_or_exit(progname); - } - - cparams.dbname = dbname; - - reindex_one_database(&cparams, REINDEX_SYSTEM, NULL, - progname, echo, verbose, - concurrently, 1, tablespace); + concurrently, concurrentCons, tablespace, + syscatalog, &schemas, &tables, &indexes); } else { - /* - * Index-level REINDEX is not supported with multiple jobs as we - * cannot control the concurrent processing of multiple indexes - * depending on the same relation. - */ - if (concurrentCons > 1 && indexes.head != NULL) - pg_fatal("cannot use multiple jobs to reindex indexes"); - if (dbname == NULL) { if (getenv("PGDATABASE")) @@ -271,6 +237,11 @@ main(int argc, char *argv[]) cparams.dbname = dbname; + if (syscatalog) + reindex_one_database(&cparams, REINDEX_SYSTEM, NULL, + progname, echo, verbose, + concurrently, 1, tablespace); + if (schemas.head != NULL) reindex_one_database(&cparams, REINDEX_SCHEMA, &schemas, progname, echo, verbose, @@ -279,7 +250,7 @@ main(int argc, char *argv[]) if (indexes.head != NULL) reindex_one_database(&cparams, REINDEX_INDEX, &indexes, progname, echo, verbose, - concurrently, 1, tablespace); + concurrently, concurrentCons, tablespace); if (tables.head != NULL) reindex_one_database(&cparams, REINDEX_TABLE, &tables, @@ -287,10 +258,11 @@ main(int argc, char *argv[]) concurrently, concurrentCons, tablespace); /* - * reindex database only if neither index nor table nor schema is - * specified + * reindex database only if neither index nor table nor schema nor + * system catalogs is specified */ - if (indexes.head == NULL && tables.head == NULL && schemas.head == NULL) + if (!syscatalog && indexes.head == NULL && + tables.head == NULL && schemas.head == NULL) reindex_one_database(&cparams, REINDEX_DATABASE, NULL, progname, echo, verbose, concurrently, concurrentCons, tablespace); @@ -308,14 +280,17 @@ reindex_one_database(ConnParams *cparams, ReindexType type, { PGconn *conn; SimpleStringListCell *cell; + SimpleStringListCell *indices_tables_cell = NULL; bool parallel = concurrentCons > 1; SimpleStringList *process_list = user_list; + SimpleStringList *indices_tables_list = NULL; ReindexType process_type = type; ParallelSlotArray *sa; bool failed = false; int items_count = 0; + ParallelSlot *free_slot = NULL; - conn = connectDatabase(cparams, progname, echo, false, false); + conn = connectDatabase(cparams, progname, echo, false, true); if (concurrently && PQserverVersion(conn) < 120000) { @@ -383,8 +358,33 @@ reindex_one_database(ConnParams *cparams, ReindexType type, return; break; - case REINDEX_SYSTEM: case REINDEX_INDEX: + Assert(user_list != NULL); + + /* + * Build a list of relations from the indices. This will + * accordingly reorder the list of indices too. + */ + indices_tables_list = get_parallel_object_list(conn, process_type, + user_list, echo); + + /* + * Bail out if nothing to process. 'user_list' was modified + * in-place, so check if it has at least one cell. + */ + if (user_list->head == NULL) + return; + + /* + * Assuming 'user_list' is not empty, 'indices_tables_list' + * shouldn't be empty as well. + */ + Assert(indices_tables_list != NULL); + indices_tables_cell = indices_tables_list->head; + + break; + + case REINDEX_SYSTEM: /* not supported */ Assert(false); break; @@ -423,8 +423,8 @@ reindex_one_database(ConnParams *cparams, ReindexType type, cell = process_list->head; do { + PQExpBufferData sql; const char *objname = cell->val; - ParallelSlot *free_slot = NULL; if (CancelRequested) { @@ -440,8 +440,37 @@ reindex_one_database(ConnParams *cparams, ReindexType type, } ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL); + initPQExpBuffer(&sql); + if (parallel && process_type == REINDEX_INDEX) + { + /* + * For parallel index-level REINDEX, the indices of the same table + * are ordered together and they are to be processed by the same + * job. So, we put all the relevant REINDEX commands into the + * same SQL query to be processed by this job at once. + */ + gen_reindex_command(free_slot->connection, process_type, objname, + echo, verbose, concurrently, tablespace, &sql); + while (indices_tables_cell->next && + strcmp(indices_tables_cell->val, indices_tables_cell->next->val) == 0) + { + indices_tables_cell = indices_tables_cell->next; + cell = cell->next; + objname = cell->val; + appendPQExpBufferChar(&sql, '\n'); + gen_reindex_command(free_slot->connection, process_type, objname, + echo, verbose, concurrently, tablespace, &sql); + } + indices_tables_cell = indices_tables_cell->next; + } + else + { + gen_reindex_command(free_slot->connection, process_type, objname, + echo, verbose, concurrently, tablespace, &sql); + } run_reindex_command(free_slot->connection, process_type, objname, - echo, verbose, concurrently, true, tablespace); + echo, &sql); + termPQExpBuffer(&sql); cell = cell->next; } while (cell != NULL); @@ -456,6 +485,12 @@ reindex_one_database(ConnParams *cparams, ReindexType type, pg_free(process_list); } + if (indices_tables_list) + { + simple_string_list_destroy(indices_tables_list); + pg_free(indices_tables_list); + } + ParallelSlotsTerminate(sa); pfree(sa); @@ -463,56 +498,57 @@ reindex_one_database(ConnParams *cparams, ReindexType type, exit(1); } +/* + * Append a SQL command required to reindex a given database object to the + * '*sql' string. + */ static void -run_reindex_command(PGconn *conn, ReindexType type, const char *name, - bool echo, bool verbose, bool concurrently, bool async, - const char *tablespace) +gen_reindex_command(PGconn *conn, ReindexType type, const char *name, + bool echo, bool verbose, bool concurrently, + const char *tablespace, PQExpBufferData *sql) { const char *paren = "("; const char *comma = ", "; const char *sep = paren; - PQExpBufferData sql; - bool status; Assert(name); /* build the REINDEX query */ - initPQExpBuffer(&sql); - - appendPQExpBufferStr(&sql, "REINDEX "); + appendPQExpBufferStr(sql, "REINDEX "); if (verbose) { - appendPQExpBuffer(&sql, "%sVERBOSE", sep); + appendPQExpBuffer(sql, "%sVERBOSE", sep); sep = comma; } if (tablespace) { - appendPQExpBuffer(&sql, "%sTABLESPACE %s", sep, fmtId(tablespace)); + appendPQExpBuffer(sql, "%sTABLESPACE %s", sep, + fmtIdEnc(tablespace, PQclientEncoding(conn))); sep = comma; } if (sep != paren) - appendPQExpBufferStr(&sql, ") "); + appendPQExpBufferStr(sql, ") "); /* object type */ switch (type) { case REINDEX_DATABASE: - appendPQExpBufferStr(&sql, "DATABASE "); + appendPQExpBufferStr(sql, "DATABASE "); break; case REINDEX_INDEX: - appendPQExpBufferStr(&sql, "INDEX "); + appendPQExpBufferStr(sql, "INDEX "); break; case REINDEX_SCHEMA: - appendPQExpBufferStr(&sql, "SCHEMA "); + appendPQExpBufferStr(sql, "SCHEMA "); break; case REINDEX_SYSTEM: - appendPQExpBufferStr(&sql, "SYSTEM "); + appendPQExpBufferStr(sql, "SYSTEM "); break; case REINDEX_TABLE: - appendPQExpBufferStr(&sql, "TABLE "); + appendPQExpBufferStr(sql, "TABLE "); break; } @@ -522,36 +558,43 @@ run_reindex_command(PGconn *conn, ReindexType type, const char *name, * object type. */ if (concurrently) - appendPQExpBufferStr(&sql, "CONCURRENTLY "); + appendPQExpBufferStr(sql, "CONCURRENTLY "); /* object name */ switch (type) { case REINDEX_DATABASE: case REINDEX_SYSTEM: - appendPQExpBufferStr(&sql, fmtId(name)); + appendPQExpBufferStr(sql, + fmtIdEnc(name, PQclientEncoding(conn))); break; case REINDEX_INDEX: case REINDEX_TABLE: - appendQualifiedRelation(&sql, name, conn, echo); + appendQualifiedRelation(sql, name, conn, echo); break; case REINDEX_SCHEMA: - appendPQExpBufferStr(&sql, name); + appendPQExpBufferStr(sql, name); break; } /* finish the query */ - appendPQExpBufferChar(&sql, ';'); + appendPQExpBufferChar(sql, ';'); +} - if (async) - { - if (echo) - printf("%s\n", sql.data); +/* + * Run one or more reindex commands accumulated in the '*sql' string against + * a given database connection. + */ +static void +run_reindex_command(PGconn *conn, ReindexType type, const char *name, + bool echo, PQExpBufferData *sql) +{ + bool status; - status = PQsendQuery(conn, sql.data) == 1; - } - else - status = executeMaintenanceCommand(conn, sql.data, echo); + if (echo) + printf("%s\n", sql->data); + + status = PQsendQuery(conn, sql->data) == 1; if (!status) { @@ -578,14 +621,7 @@ run_reindex_command(PGconn *conn, ReindexType type, const char *name, name, PQdb(conn), PQerrorMessage(conn)); break; } - if (!async) - { - PQfinish(conn); - exit(1); - } } - - termPQExpBuffer(&sql); } /* @@ -626,6 +662,8 @@ get_parallel_object_list(PGconn *conn, ReindexType type, " AND c.relkind IN (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")\n" + " AND c.relpersistence != " + CppAsString2(RELPERSISTENCE_TEMP) "\n" " ORDER BY c.relpages DESC;"); break; @@ -648,6 +686,8 @@ get_parallel_object_list(PGconn *conn, ReindexType type, " WHERE c.relkind IN (" CppAsString2(RELKIND_RELATION) ", " CppAsString2(RELKIND_MATVIEW) ")\n" + " AND c.relpersistence != " + CppAsString2(RELPERSISTENCE_TEMP) "\n" " AND ns.nspname IN ("); for (cell = user_list->head; cell; cell = cell->next) @@ -667,8 +707,61 @@ get_parallel_object_list(PGconn *conn, ReindexType type, } break; - case REINDEX_SYSTEM: case REINDEX_INDEX: + { + SimpleStringListCell *cell; + + Assert(user_list != NULL); + + /* + * Straight-forward index-level REINDEX is not supported with + * multiple jobs as we cannot control the concurrent + * processing of multiple indexes depending on the same + * relation. But we can extract the appropriate table name + * for the index and put REINDEX INDEX commands into different + * jobs, according to the parent tables. + * + * We will order the results to group the same tables + * together. We fetch index names as well to build a new list + * of them with matching order. + */ + appendPQExpBufferStr(&catalog_query, + "SELECT t.relname, n.nspname, i.relname\n" + "FROM pg_catalog.pg_index x\n" + "JOIN pg_catalog.pg_class t ON t.oid = x.indrelid\n" + "JOIN pg_catalog.pg_class i ON i.oid = x.indexrelid\n" + "LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.relnamespace\n" + "WHERE x.indexrelid OPERATOR(pg_catalog.=) ANY(ARRAY['"); + + for (cell = user_list->head; cell; cell = cell->next) + { + if (cell != user_list->head) + appendPQExpBufferStr(&catalog_query, "', '"); + + appendQualifiedRelation(&catalog_query, cell->val, conn, echo); + } + + /* + * Order tables by the size of its greatest index. Within the + * table, order indexes by their sizes. + */ + appendPQExpBufferStr(&catalog_query, + "']::pg_catalog.regclass[])\n" + "ORDER BY max(i.relpages) OVER \n" + " (PARTITION BY n.nspname, t.relname),\n" + " n.nspname, t.relname, i.relpages;\n"); + + /* + * We're going to re-order the user_list to match the order of + * tables. So, empty the user_list to fill it from the query + * result. + */ + simple_string_list_destroy(user_list); + user_list->head = user_list->tail = NULL; + } + break; + + case REINDEX_SYSTEM: case REINDEX_TABLE: Assert(false); break; @@ -695,11 +788,27 @@ get_parallel_object_list(PGconn *conn, ReindexType type, for (i = 0; i < ntups; i++) { appendPQExpBufferStr(&buf, - fmtQualifiedId(PQgetvalue(res, i, 1), - PQgetvalue(res, i, 0))); + fmtQualifiedIdEnc(PQgetvalue(res, i, 1), + PQgetvalue(res, i, 0), + PQclientEncoding(conn))); simple_string_list_append(tables, buf.data); resetPQExpBuffer(&buf); + + if (type == REINDEX_INDEX) + { + /* + * For index-level REINDEX, rebuild the list of indexes to match + * the order of tables list. + */ + appendPQExpBufferStr(&buf, + fmtQualifiedIdEnc(PQgetvalue(res, i, 1), + PQgetvalue(res, i, 2), + PQclientEncoding(conn))); + + simple_string_list_append(user_list, buf.data); + resetPQExpBuffer(&buf); + } } termPQExpBuffer(&buf); PQclear(res); @@ -711,14 +820,18 @@ static void reindex_all_databases(ConnParams *cparams, const char *progname, bool echo, bool quiet, bool verbose, bool concurrently, int concurrentCons, - const char *tablespace) + const char *tablespace, bool syscatalog, + SimpleStringList *schemas, SimpleStringList *tables, + SimpleStringList *indexes) { PGconn *conn; PGresult *result; int i; conn = connectMaintenanceDatabase(cparams, progname, echo); - result = executeQuery(conn, "SELECT datname FROM pg_database WHERE datallowconn ORDER BY 1;", echo); + result = executeQuery(conn, + "SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;", + echo); PQfinish(conn); for (i = 0; i < PQntuples(result); i++) @@ -733,9 +846,35 @@ reindex_all_databases(ConnParams *cparams, cparams->override_dbname = dbname; - reindex_one_database(cparams, REINDEX_DATABASE, NULL, - progname, echo, verbose, concurrently, - concurrentCons, tablespace); + if (syscatalog) + reindex_one_database(cparams, REINDEX_SYSTEM, NULL, + progname, echo, verbose, + concurrently, 1, tablespace); + + if (schemas->head != NULL) + reindex_one_database(cparams, REINDEX_SCHEMA, schemas, + progname, echo, verbose, + concurrently, concurrentCons, tablespace); + + if (indexes->head != NULL) + reindex_one_database(cparams, REINDEX_INDEX, indexes, + progname, echo, verbose, + concurrently, 1, tablespace); + + if (tables->head != NULL) + reindex_one_database(cparams, REINDEX_TABLE, tables, + progname, echo, verbose, + concurrently, concurrentCons, tablespace); + + /* + * reindex database only if neither index nor table nor schema nor + * system catalogs is specified + */ + if (!syscatalog && indexes->head == NULL && + tables->head == NULL && schemas->head == NULL) + reindex_one_database(cparams, REINDEX_DATABASE, NULL, + progname, echo, verbose, + concurrently, concurrentCons, tablespace); } PQclear(result); diff --git a/src/bin/scripts/t/010_clusterdb.pl b/src/bin/scripts/t/010_clusterdb.pl index 715207fb4d169..aa3bb291b2141 100644 --- a/src/bin/scripts/t/010_clusterdb.pl +++ b/src/bin/scripts/t/010_clusterdb.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/scripts/t/011_clusterdb_all.pl b/src/bin/scripts/t/011_clusterdb_all.pl index eb904c08c7061..e0fd2201e547d 100644 --- a/src/bin/scripts/t/011_clusterdb_all.pl +++ b/src/bin/scripts/t/011_clusterdb_all.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -12,13 +12,37 @@ $node->init; $node->start; -# clusterdb -a is not compatible with -d, hence enforce environment variable -# correctly. -$ENV{PGDATABASE} = 'postgres'; - +# clusterdb -a is not compatible with -d. This relies on PGDATABASE to be +# set, something PostgreSQL::Test::Cluster does. $node->issues_sql_like( [ 'clusterdb', '-a' ], qr/statement: CLUSTER.*statement: CLUSTER/s, 'cluster all databases'); +$node->safe_psql( + 'postgres', q( + CREATE DATABASE regression_invalid; + UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid'; +)); +$node->command_ok([ 'clusterdb', '-a' ], + 'invalid database not targeted by clusterdb -a'); + +# Doesn't quite belong here, but don't want to waste time by creating an +# invalid database in 010_clusterdb.pl as well. +$node->command_fails_like( + [ 'clusterdb', '-d', 'regression_invalid' ], + qr/FATAL: cannot connect to invalid database "regression_invalid"/, + 'clusterdb cannot target invalid database'); + +$node->safe_psql('postgres', + 'CREATE TABLE test1 (a int); CREATE INDEX test1x ON test1 (a); CLUSTER test1 USING test1x' +); +$node->safe_psql('template1', + 'CREATE TABLE test1 (a int); CREATE INDEX test1x ON test1 (a); CLUSTER test1 USING test1x' +); +$node->issues_sql_like( + [ 'clusterdb', '-a', '-t', 'test1' ], + qr/statement: CLUSTER public\.test1/s, + 'cluster specific table in all databases'); + done_testing(); diff --git a/src/bin/scripts/t/020_createdb.pl b/src/bin/scripts/t/020_createdb.pl index 40291924e5d12..4a0e2c883a11e 100644 --- a/src/bin/scripts/t/020_createdb.pl +++ b/src/bin/scripts/t/020_createdb.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -105,6 +105,86 @@ 'create database with ICU fails since no ICU support'); } +$node->command_fails( + [ + 'createdb', '-T', + 'template0', '--locale-provider=builtin', + 'tbuiltin1' + ], + 'create database with provider "builtin" fails without --locale'); + +$node->command_ok( + [ + 'createdb', '-T', + 'template0', '--locale-provider=builtin', + '--locale=C', 'tbuiltin2' + ], + 'create database with provider "builtin" and locale "C"'); + +$node->command_ok( + [ + 'createdb', '-T', + 'template0', '--locale-provider=builtin', + '--locale=C', '--lc-collate=C', + 'tbuiltin3' + ], + 'create database with provider "builtin" and LC_COLLATE=C'); + +$node->command_ok( + [ + 'createdb', '-T', + 'template0', '--locale-provider=builtin', + '--locale=C', '--lc-ctype=C', + 'tbuiltin4' + ], + 'create database with provider "builtin" and LC_CTYPE=C'); + +$node->command_ok( + [ + 'createdb', '-T', + 'template0', '--locale-provider=builtin', + '--lc-collate=C', '--lc-ctype=C', + '-E UTF-8', '--builtin-locale=C.UTF8', + 'tbuiltin5' + ], + 'create database with --builtin-locale C.UTF-8 and -E UTF-8'); + +$node->command_fails( + [ + 'createdb', '-T', + 'template0', '--locale-provider=builtin', + '--lc-collate=C', '--lc-ctype=C', + '-E LATIN1', '--builtin-locale=C.UTF-8', + 'tbuiltin6' + ], + 'create database with --builtin-locale C.UTF-8 and -E LATIN1'); + +$node->command_fails( + [ + 'createdb', '-T', + 'template0', '--locale-provider=builtin', + '--locale=C', '--icu-locale=en', + 'tbuiltin7' + ], + 'create database with provider "builtin" and ICU_LOCALE="en"'); + +$node->command_fails( + [ + 'createdb', '-T', + 'template0', '--locale-provider=builtin', + '--locale=C', '--icu-rules=""', + 'tbuiltin8' + ], + 'create database with provider "builtin" and ICU_RULES=""'); + +$node->command_fails( + [ + 'createdb', '-T', + 'template1', '--locale-provider=builtin', + '--locale=C', 'tbuiltin9' + ], + 'create database with provider "builtin" not matching template'); + $node->command_fails([ 'createdb', 'foobar1' ], 'fails if database already exists'); @@ -175,11 +255,21 @@ qr/statement: CREATE DATABASE foobar6 STRATEGY wal_log TEMPLATE foobar2/, 'create database with WAL_LOG strategy'); +$node->issues_sql_like( + [ 'createdb', '-T', 'foobar2', '-S', 'WAL_LOG', 'foobar6s' ], + qr/statement: CREATE DATABASE foobar6s STRATEGY "WAL_LOG" TEMPLATE foobar2/, + 'create database with WAL_LOG strategy'); + $node->issues_sql_like( [ 'createdb', '-T', 'foobar2', '-S', 'file_copy', 'foobar7' ], qr/statement: CREATE DATABASE foobar7 STRATEGY file_copy TEMPLATE foobar2/, 'create database with FILE_COPY strategy'); +$node->issues_sql_like( + [ 'createdb', '-T', 'foobar2', '-S', 'FILE_COPY', 'foobar7s' ], + qr/statement: CREATE DATABASE foobar7s STRATEGY "FILE_COPY" TEMPLATE foobar2/, + 'create database with FILE_COPY strategy'); + # Create database owned by role_foobar. $node->issues_sql_like( [ 'createdb', '-T', 'foobar2', '-O', 'role_foobar', 'foobar8' ], diff --git a/src/bin/scripts/t/040_createuser.pl b/src/bin/scripts/t/040_createuser.pl index 9ca282181d8c8..93b432381f012 100644 --- a/src/bin/scripts/t/040_createuser.pl +++ b/src/bin/scripts/t/040_createuser.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -42,9 +42,8 @@ 'add a role as a member with admin option of the newly created role'); $node->issues_sql_like( [ - 'createuser', '-m', - 'regress_user3', '-m', - 'regress user #4', 'REGRESS_USER5' + 'createuser', 'REGRESS_USER5', '-m', 'regress_user3', + '-m', 'regress user #4' ], qr/statement: CREATE ROLE "REGRESS_USER5" NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS ROLE regress_user3,"regress user #4";/, 'add a role as a member of the newly created role'); @@ -73,11 +72,14 @@ qr/statement: CREATE ROLE regress_user11 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS IN ROLE regress_user1;/, '--role'); $node->issues_sql_like( - [ 'createuser', '--member-of', 'regress_user1', 'regress_user12' ], + [ 'createuser', 'regress_user12', '--member-of', 'regress_user1' ], qr/statement: CREATE ROLE regress_user12 NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN NOREPLICATION NOBYPASSRLS IN ROLE regress_user1;/, '--member-of'); $node->command_fails([ 'createuser', 'regress_user1' ], 'fails if role already exists'); +$node->command_fails( + [ 'createuser', 'regress_user1', '-m', 'regress_user2', 'regress_user3' ], + 'fails for too many non-options'); done_testing(); diff --git a/src/bin/scripts/t/050_dropdb.pl b/src/bin/scripts/t/050_dropdb.pl index 9f2b6463b8244..2cfd18ba1e532 100644 --- a/src/bin/scripts/t/050_dropdb.pl +++ b/src/bin/scripts/t/050_dropdb.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -31,4 +31,13 @@ $node->command_fails([ 'dropdb', 'nonexistent' ], 'fails with nonexistent database'); +# check that invalid database can be dropped with dropdb +$node->safe_psql( + 'postgres', q( + CREATE DATABASE regression_invalid; + UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid'; +)); +$node->command_ok([ 'dropdb', 'regression_invalid' ], + 'invalid database can be dropped'); + done_testing(); diff --git a/src/bin/scripts/t/070_dropuser.pl b/src/bin/scripts/t/070_dropuser.pl index 95c24c4f30dc9..f4de5662d8812 100644 --- a/src/bin/scripts/t/070_dropuser.pl +++ b/src/bin/scripts/t/070_dropuser.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/scripts/t/080_pg_isready.pl b/src/bin/scripts/t/080_pg_isready.pl index 8f53aef573769..dd64502e69610 100644 --- a/src/bin/scripts/t/080_pg_isready.pl +++ b/src/bin/scripts/t/080_pg_isready.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -12,10 +12,11 @@ program_version_ok('pg_isready'); program_options_handling_ok('pg_isready'); -command_fails(['pg_isready'], 'fails with no server running'); - my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; + +$node->command_fails(['pg_isready'], 'fails with no server running'); + $node->start; $node->command_ok( diff --git a/src/bin/scripts/t/090_reindexdb.pl b/src/bin/scripts/t/090_reindexdb.pl index b663d0e741ace..f02822da21859 100644 --- a/src/bin/scripts/t/090_reindexdb.pl +++ b/src/bin/scripts/t/090_reindexdb.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -236,9 +236,11 @@ CREATE SCHEMA s1; CREATE TABLE s1.t1(id integer); CREATE INDEX ON s1.t1(id); + CREATE INDEX i1 ON s1.t1(id); CREATE SCHEMA s2; CREATE TABLE s2.t2(id integer); CREATE INDEX ON s2.t2(id); + CREATE INDEX i2 ON s2.t2(id); -- empty schema CREATE SCHEMA s3; |); @@ -246,9 +248,9 @@ $node->command_fails( [ 'reindexdb', '-j', '2', '-s', 'postgres' ], 'parallel reindexdb cannot process system catalogs'); -$node->command_fails( - [ 'reindexdb', '-j', '2', '-i', 'i1', 'postgres' ], - 'parallel reindexdb cannot process indexes'); +$node->command_ok( + [ 'reindexdb', '-j', '2', '-i', 's1.i1', '-i', 's2.i2', 'postgres' ], + 'parallel reindexdb for indices'); # Note that the ordering of the commands is not stable, so the second # command for s2.t2 is not checked after. $node->issues_sql_like( @@ -262,4 +264,18 @@ [ 'reindexdb', '-j', '2', '--concurrently', '-d', 'postgres' ], 'parallel reindexdb on database, concurrently'); +# combinations of objects +$node->issues_sql_like( + [ 'reindexdb', '-s', '-t', 'test1', 'postgres' ], + qr/statement:\ REINDEX SYSTEM postgres;/, + 'specify both --system and --table'); +$node->issues_sql_like( + [ 'reindexdb', '-s', '-i', 'test1x', 'postgres' ], + qr/statement:\ REINDEX INDEX public.test1x;/, + 'specify both --system and --index'); +$node->issues_sql_like( + [ 'reindexdb', '-s', '-S', 'pg_catalog', 'postgres' ], + qr/statement:\ REINDEX SCHEMA pg_catalog;/, + 'specify both --system and --schema'); + done_testing(); diff --git a/src/bin/scripts/t/091_reindexdb_all.pl b/src/bin/scripts/t/091_reindexdb_all.pl index ac62b9b5585a9..7f5068667e3b7 100644 --- a/src/bin/scripts/t/091_reindexdb_all.pl +++ b/src/bin/scripts/t/091_reindexdb_all.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use Test::More; @@ -13,9 +13,44 @@ $ENV{PGOPTIONS} = '--client-min-messages=WARNING'; +$node->safe_psql('postgres', + 'CREATE TABLE test1 (a int); CREATE INDEX test1x ON test1 (a);'); +$node->safe_psql('template1', + 'CREATE TABLE test1 (a int); CREATE INDEX test1x ON test1 (a);'); $node->issues_sql_like( [ 'reindexdb', '-a' ], qr/statement: REINDEX.*statement: REINDEX/s, 'reindex all databases'); +$node->issues_sql_like( + [ 'reindexdb', '-a', '-s' ], + qr/statement: REINDEX SYSTEM postgres/s, + 'reindex system catalogs in all databases'); +$node->issues_sql_like( + [ 'reindexdb', '-a', '-S', 'public' ], + qr/statement: REINDEX SCHEMA public/s, + 'reindex schema in all databases'); +$node->issues_sql_like( + [ 'reindexdb', '-a', '-i', 'test1x' ], + qr/statement: REINDEX INDEX public\.test1x/s, + 'reindex index in all databases'); +$node->issues_sql_like( + [ 'reindexdb', '-a', '-t', 'test1' ], + qr/statement: REINDEX TABLE public\.test1/s, + 'reindex table in all databases'); + +$node->safe_psql( + 'postgres', q( + CREATE DATABASE regression_invalid; + UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid'; +)); +$node->command_ok([ 'reindexdb', '-a' ], + 'invalid database not targeted by reindexdb -a'); + +# Doesn't quite belong here, but don't want to waste time by creating an +# invalid database in 090_reindexdb.pl as well. +$node->command_fails_like( + [ 'reindexdb', '-d', 'regression_invalid' ], + qr/FATAL: cannot connect to invalid database "regression_invalid"/, + 'reindexdb cannot target invalid database'); done_testing(); diff --git a/src/bin/scripts/t/100_vacuumdb.pl b/src/bin/scripts/t/100_vacuumdb.pl index eccfcc54a1a19..1a2bcb495913a 100644 --- a/src/bin/scripts/t/100_vacuumdb.pl +++ b/src/bin/scripts/t/100_vacuumdb.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -109,15 +109,13 @@ CREATE FUNCTION f1(int) RETURNS int LANGUAGE SQL AS 'SELECT f0($1)'; CREATE TABLE funcidx (x int); INSERT INTO funcidx VALUES (0),(1),(2),(3); - CREATE INDEX i0 ON funcidx ((f1(x))); CREATE SCHEMA "Foo"; CREATE TABLE "Foo".bar(id int); + CREATE SCHEMA "Bar"; + CREATE TABLE "Bar".baz(id int); |); $node->command_ok([qw|vacuumdb -Z --table="need""q(uot"(")x") postgres|], 'column list'); -$node->command_fails( - [qw|vacuumdb -Zt funcidx postgres|], - 'unqualified name via functional index'); $node->command_fails( [ 'vacuumdb', '--analyze', '--table', 'vactable(c)', 'postgres' ], @@ -159,10 +157,24 @@ [ 'vacuumdb', '--schema', '"Foo"', 'postgres' ], qr/VACUUM \(SKIP_DATABASE_STATS\) "Foo".bar/, 'vacuumdb --schema'); +$node->issues_sql_like( + [ 'vacuumdb', '--schema', '"Foo"', '--schema', '"Bar"', 'postgres' ], + qr/VACUUM\ \(SKIP_DATABASE_STATS\)\ "Foo".bar + .*VACUUM\ \(SKIP_DATABASE_STATS\)\ "Bar".baz + /sx, + 'vacuumdb multiple --schema switches'); $node->issues_sql_like( [ 'vacuumdb', '--exclude-schema', '"Foo"', 'postgres' ], - qr/(?:(?!VACUUM "Foo".bar).)*/, + qr/^(?!.*VACUUM \(SKIP_DATABASE_STATS\) "Foo".bar).*$/s, 'vacuumdb --exclude-schema'); +$node->issues_sql_like( + [ + 'vacuumdb', '--exclude-schema', '"Foo"', '--exclude-schema', + '"Bar"', 'postgres' + ], + qr/^(?!.*VACUUM\ \(SKIP_DATABASE_STATS\)\ "Foo".bar + | VACUUM\ \(SKIP_DATABASE_STATS\)\ "Bar".baz).*$/sx, + 'vacuumdb multiple --exclude-schema switches'); $node->command_fails_like( [ 'vacuumdb', '-N', 'pg_catalog', '-t', 'pg_class', 'postgres', ], qr/cannot vacuum specific table\(s\) and exclude schema\(s\) at the same time/, @@ -175,18 +187,18 @@ [ 'vacuumdb', '-n', 'pg_catalog', '-N', '"Foo"', 'postgres' ], qr/cannot vacuum all tables in schema\(s\) and exclude schema\(s\) at the same time/, 'cannot use options -n and -N at the same time'); -$node->command_fails_like( - [ 'vacuumdb', '-a', '-N', '"Foo"' ], - qr/cannot exclude specific schema\(s\) in all databases/, - 'cannot use options -a and -N at the same time'); -$node->command_fails_like( - [ 'vacuumdb', '-a', '-n', '"Foo"' ], - qr/cannot vacuum specific schema\(s\) in all databases/, - 'cannot use options -a and -n at the same time'); -$node->command_fails_like( - [ 'vacuumdb', '-a', '-t', '"Foo".bar' ], - qr/cannot vacuum specific table\(s\) in all databases/, - 'cannot use options -a and -t at the same time'); +$node->issues_sql_like( + [ 'vacuumdb', '-a', '-N', 'pg_catalog' ], + qr/(?:(?!VACUUM \(SKIP_DATABASE_STATS\) pg_catalog.pg_class).)*/, + 'vacuumdb -a -N'); +$node->issues_sql_like( + [ 'vacuumdb', '-a', '-n', 'pg_catalog' ], + qr/VACUUM \(SKIP_DATABASE_STATS\) pg_catalog.pg_class/, + 'vacuumdb -a -n'); +$node->issues_sql_like( + [ 'vacuumdb', '-a', '-t', 'pg_class' ], + qr/VACUUM \(SKIP_DATABASE_STATS\) pg_catalog.pg_class/, + 'vacuumdb -a -t'); $node->command_fails_like( [ 'vacuumdb', '-a', '-d', 'postgres' ], qr/cannot vacuum all databases and a specific one at the same time/, diff --git a/src/bin/scripts/t/101_vacuumdb_all.pl b/src/bin/scripts/t/101_vacuumdb_all.pl index 0f9d5adc48baf..9862f0c2082b8 100644 --- a/src/bin/scripts/t/101_vacuumdb_all.pl +++ b/src/bin/scripts/t/101_vacuumdb_all.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use Test::More; @@ -16,4 +16,19 @@ qr/statement: VACUUM.*statement: VACUUM/s, 'vacuum all databases'); +$node->safe_psql( + 'postgres', q( + CREATE DATABASE regression_invalid; + UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid'; +)); +$node->command_ok([ 'vacuumdb', '-a' ], + 'invalid database not targeted by vacuumdb -a'); + +# Doesn't quite belong here, but don't want to waste time by creating an +# invalid database in 010_vacuumdb.pl as well. +$node->command_fails_like( + [ 'vacuumdb', '-d', 'regression_invalid' ], + qr/FATAL: cannot connect to invalid database "regression_invalid"/, + 'vacuumdb cannot target invalid database'); + done_testing(); diff --git a/src/bin/scripts/t/102_vacuumdb_stages.pl b/src/bin/scripts/t/102_vacuumdb_stages.pl index 64d7ed1575ffc..f41325818d962 100644 --- a/src/bin/scripts/t/102_vacuumdb_stages.pl +++ b/src/bin/scripts/t/102_vacuumdb_stages.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use Test::More; diff --git a/src/bin/scripts/t/200_connstr.pl b/src/bin/scripts/t/200_connstr.pl index 53c5e21ab2ce2..dbb99b6b09274 100644 --- a/src/bin/scripts/t/200_connstr.pl +++ b/src/bin/scripts/t/200_connstr.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/bin/scripts/vacuumdb.c b/src/bin/scripts/vacuumdb.c index 4b17a07089049..5aff0dd25d5a2 100644 --- a/src/bin/scripts/vacuumdb.c +++ b/src/bin/scripts/vacuumdb.c @@ -2,7 +2,7 @@ * * vacuumdb * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/bin/scripts/vacuumdb.c @@ -57,7 +57,7 @@ typedef enum OBJFILTER_DATABASE = (1 << 1), /* -d | --dbname */ OBJFILTER_TABLE = (1 << 2), /* -t | --table */ OBJFILTER_SCHEMA = (1 << 3), /* -n | --schema */ - OBJFILTER_SCHEMA_EXCLUDE = (1 << 4) /* -N | --exclude-schema */ + OBJFILTER_SCHEMA_EXCLUDE = (1 << 4), /* -N | --exclude-schema */ } VacObjFilter; VacObjFilter objfilter = OBJFILTER_NONE; @@ -72,6 +72,7 @@ static void vacuum_one_database(ConnParams *cparams, static void vacuum_all_databases(ConnParams *cparams, vacuumingOptions *vacopts, bool analyze_in_stages, + SimpleStringList *objects, int concurrentCons, const char *progname, bool echo, bool quiet); @@ -85,6 +86,8 @@ static void help(const char *progname); void check_objfilter(void); +static char *escape_quotes(const char *src); + /* For analyze-in-stages mode */ #define ANALYZE_NO_STAGE -1 #define ANALYZE_NUM_STAGES 3 @@ -270,7 +273,7 @@ main(int argc, char *argv[]) vacopts.process_main = false; break; case 13: - vacopts.buffer_usage_limit = pg_strdup(optarg); + vacopts.buffer_usage_limit = escape_quotes(optarg); break; default: /* getopt_long already emitted a complaint */ @@ -376,6 +379,7 @@ main(int argc, char *argv[]) vacuum_all_databases(&cparams, &vacopts, analyze_in_stages, + &objects, concurrentCons, progname, echo, quiet); } @@ -427,18 +431,6 @@ check_objfilter(void) (objfilter & OBJFILTER_DATABASE)) pg_fatal("cannot vacuum all databases and a specific one at the same time"); - if ((objfilter & OBJFILTER_ALL_DBS) && - (objfilter & OBJFILTER_TABLE)) - pg_fatal("cannot vacuum specific table(s) in all databases"); - - if ((objfilter & OBJFILTER_ALL_DBS) && - (objfilter & OBJFILTER_SCHEMA)) - pg_fatal("cannot vacuum specific schema(s) in all databases"); - - if ((objfilter & OBJFILTER_ALL_DBS) && - (objfilter & OBJFILTER_SCHEMA_EXCLUDE)) - pg_fatal("cannot exclude specific schema(s) in all databases"); - if ((objfilter & OBJFILTER_TABLE) && (objfilter & OBJFILTER_SCHEMA)) pg_fatal("cannot vacuum all tables in schema(s) and specific table(s) at the same time"); @@ -452,6 +444,20 @@ check_objfilter(void) pg_fatal("cannot vacuum all tables in schema(s) and exclude schema(s) at the same time"); } +/* + * Returns a newly malloc'd version of 'src' with escaped single quotes and + * backslashes. + */ +static char * +escape_quotes(const char *src) +{ + char *result = escape_single_quotes_ascii(src); + + if (!result) + pg_fatal("out of memory"); + return result; +} + /* * vacuum_one_database * @@ -485,7 +491,6 @@ vacuum_one_database(ConnParams *cparams, int ntups; bool failed = false; bool objects_listed = false; - bool has_where = false; const char *initcmd; const char *stage_commands[] = { "SET default_statistics_target=1; SET vacuum_cost_delay=0;", @@ -553,20 +558,32 @@ vacuum_one_database(ConnParams *cparams, } if (vacopts->min_xid_age != 0 && PQserverVersion(conn) < 90600) + { + PQfinish(conn); pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", "--min-xid-age", "9.6"); + } if (vacopts->min_mxid_age != 0 && PQserverVersion(conn) < 90600) + { + PQfinish(conn); pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", "--min-mxid-age", "9.6"); + } if (vacopts->parallel_workers >= 0 && PQserverVersion(conn) < 130000) + { + PQfinish(conn); pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", "--parallel", "13"); + } if (vacopts->buffer_usage_limit && PQserverVersion(conn) < 160000) + { + PQfinish(conn); pg_fatal("cannot use the \"%s\" option on server versions older than PostgreSQL %s", "--buffer-usage-limit", "16"); + } /* skip_database_stats is used automatically if server supports it */ vacopts->skip_database_stats = (PQserverVersion(conn) >= 160000); @@ -659,16 +676,15 @@ vacuum_one_database(ConnParams *cparams, " LEFT JOIN pg_catalog.pg_class t" " ON c.reltoastrelid OPERATOR(pg_catalog.=) t.oid\n"); - /* Used to match the tables or schemas listed by the user */ + /* + * Used to match the tables or schemas listed by the user, completing the + * JOIN clause. + */ if (objects_listed) { - appendPQExpBufferStr(&catalog_query, " JOIN listed_objects" - " ON listed_objects.object_oid "); - - if (objfilter & OBJFILTER_SCHEMA_EXCLUDE) - appendPQExpBufferStr(&catalog_query, "OPERATOR(pg_catalog.!=) "); - else - appendPQExpBufferStr(&catalog_query, "OPERATOR(pg_catalog.=) "); + appendPQExpBufferStr(&catalog_query, " LEFT JOIN listed_objects" + " ON listed_objects.object_oid" + " OPERATOR(pg_catalog.=) "); if (objfilter & OBJFILTER_TABLE) appendPQExpBufferStr(&catalog_query, "c.oid\n"); @@ -676,6 +692,27 @@ vacuum_one_database(ConnParams *cparams, appendPQExpBufferStr(&catalog_query, "ns.oid\n"); } + /* + * Exclude temporary tables, beginning the WHERE clause. + */ + appendPQExpBufferStr(&catalog_query, + " WHERE c.relpersistence OPERATOR(pg_catalog.!=) " + CppAsString2(RELPERSISTENCE_TEMP) "\n"); + + /* + * Used to match the tables or schemas listed by the user, for the WHERE + * clause. + */ + if (objects_listed) + { + if (objfilter & OBJFILTER_SCHEMA_EXCLUDE) + appendPQExpBuffer(&catalog_query, + " AND listed_objects.object_oid IS NULL\n"); + else + appendPQExpBuffer(&catalog_query, + " AND listed_objects.object_oid IS NOT NULL\n"); + } + /* * If no tables were listed, filter for the relevant relation types. If * tables were given via --table, don't bother filtering by relation type. @@ -684,10 +721,10 @@ vacuum_one_database(ConnParams *cparams, */ if ((objfilter & OBJFILTER_TABLE) == 0) { - appendPQExpBufferStr(&catalog_query, " WHERE c.relkind OPERATOR(pg_catalog.=) ANY (array[" - CppAsString2(RELKIND_RELATION) ", " - CppAsString2(RELKIND_MATVIEW) "])\n"); - has_where = true; + appendPQExpBuffer(&catalog_query, + " AND c.relkind OPERATOR(pg_catalog.=) ANY (array[" + CppAsString2(RELKIND_RELATION) ", " + CppAsString2(RELKIND_MATVIEW) "])\n"); } /* @@ -700,25 +737,23 @@ vacuum_one_database(ConnParams *cparams, if (vacopts->min_xid_age != 0) { appendPQExpBuffer(&catalog_query, - " %s GREATEST(pg_catalog.age(c.relfrozenxid)," + " AND GREATEST(pg_catalog.age(c.relfrozenxid)," " pg_catalog.age(t.relfrozenxid)) " " OPERATOR(pg_catalog.>=) '%d'::pg_catalog.int4\n" " AND c.relfrozenxid OPERATOR(pg_catalog.!=)" " '0'::pg_catalog.xid\n", - has_where ? "AND" : "WHERE", vacopts->min_xid_age); - has_where = true; + vacopts->min_xid_age); } if (vacopts->min_mxid_age != 0) { appendPQExpBuffer(&catalog_query, - " %s GREATEST(pg_catalog.mxid_age(c.relminmxid)," + " AND GREATEST(pg_catalog.mxid_age(c.relminmxid)," " pg_catalog.mxid_age(t.relminmxid)) OPERATOR(pg_catalog.>=)" " '%d'::pg_catalog.int4\n" " AND c.relminmxid OPERATOR(pg_catalog.!=)" " '0'::pg_catalog.xid\n", - has_where ? "AND" : "WHERE", vacopts->min_mxid_age); - has_where = true; + vacopts->min_mxid_age); } /* @@ -750,8 +785,9 @@ vacuum_one_database(ConnParams *cparams, for (i = 0; i < ntups; i++) { appendPQExpBufferStr(&buf, - fmtQualifiedId(PQgetvalue(res, i, 1), - PQgetvalue(res, i, 0))); + fmtQualifiedIdEnc(PQgetvalue(res, i, 1), + PQgetvalue(res, i, 0), + PQclientEncoding(conn))); if (objects_listed && !PQgetisnull(res, i, 2)) appendPQExpBufferStr(&buf, PQgetvalue(res, i, 2)); @@ -873,6 +909,7 @@ static void vacuum_all_databases(ConnParams *cparams, vacuumingOptions *vacopts, bool analyze_in_stages, + SimpleStringList *objects, int concurrentCons, const char *progname, bool echo, bool quiet) { @@ -883,7 +920,7 @@ vacuum_all_databases(ConnParams *cparams, conn = connectMaintenanceDatabase(cparams, progname, echo); result = executeQuery(conn, - "SELECT datname FROM pg_database WHERE datallowconn ORDER BY 1;", + "SELECT datname FROM pg_database WHERE datallowconn AND datconnlimit <> -2 ORDER BY 1;", echo); PQfinish(conn); @@ -905,7 +942,7 @@ vacuum_all_databases(ConnParams *cparams, vacuum_one_database(cparams, vacopts, stage, - NULL, + objects, concurrentCons, progname, echo, quiet); } @@ -919,7 +956,7 @@ vacuum_all_databases(ConnParams *cparams, vacuum_one_database(cparams, vacopts, ANALYZE_NO_STAGE, - NULL, + objects, concurrentCons, progname, echo, quiet); } @@ -964,6 +1001,13 @@ prepare_vacuum_command(PQExpBuffer sql, int serverVersion, appendPQExpBuffer(sql, "%sVERBOSE", sep); sep = comma; } + if (vacopts->buffer_usage_limit) + { + Assert(serverVersion >= 160000); + appendPQExpBuffer(sql, "%sBUFFER_USAGE_LIMIT '%s'", sep, + vacopts->buffer_usage_limit); + sep = comma; + } if (sep != paren) appendPQExpBufferChar(sql, ')'); } @@ -1142,8 +1186,8 @@ help(const char *progname) printf(_(" --no-process-main skip the main relation\n")); printf(_(" --no-process-toast skip the TOAST table associated with the table to vacuum\n")); printf(_(" --no-truncate don't truncate empty pages at the end of the table\n")); - printf(_(" -n, --schema=PATTERN vacuum tables in the specified schema(s) only\n")); - printf(_(" -N, --exclude-schema=PATTERN do not vacuum tables in the specified schema(s)\n")); + printf(_(" -n, --schema=SCHEMA vacuum tables in the specified schema(s) only\n")); + printf(_(" -N, --exclude-schema=SCHEMA do not vacuum tables in the specified schema(s)\n")); printf(_(" -P, --parallel=PARALLEL_WORKERS use this many background workers for vacuum, if available\n")); printf(_(" -q, --quiet don't write any messages\n")); printf(_(" --skip-locked skip relations that cannot be immediately locked\n")); diff --git a/src/common/Makefile b/src/common/Makefile index 113029bf7b915..3d83299432b94 100644 --- a/src/common/Makefile +++ b/src/common/Makefile @@ -43,11 +43,11 @@ override CPPFLAGS += -DVAL_LIBS="\"$(LIBS)\"" override CPPFLAGS := -DFRONTEND -I. -I$(top_srcdir)/src/common $(CPPFLAGS) LIBS += $(PTHREAD_LIBS) -# If you add objects here, see also src/tools/msvc/Mkvcbuild.pm - OBJS_COMMON = \ archive.o \ base64.o \ + binaryheap.o \ + blkreftable.o \ checksum_helper.o \ compression.o \ config_info.o \ @@ -65,6 +65,7 @@ OBJS_COMMON = \ kwlookup.o \ link-canary.o \ md5_common.o \ + parse_manifest.o \ percentrepl.o \ pg_get_line.o \ pg_lzcompress.o \ @@ -77,6 +78,8 @@ OBJS_COMMON = \ scram-common.o \ string.o \ stringinfo.o \ + unicode_case.o \ + unicode_category.o \ unicode_norm.o \ username.o \ wait_error.o \ @@ -96,11 +99,10 @@ OBJS_COMMON += \ sha2.o endif -# A few files are currently only built for frontend, not server -# (Mkvcbuild.pm has a copy of this list, too). logging.c is excluded -# from OBJS_FRONTEND_SHLIB (shared library) as a matter of policy, -# because it is not appropriate for general purpose libraries such -# as libpq to report errors directly. +# A few files are currently only built for frontend, not server. +# logging.c is excluded from OBJS_FRONTEND_SHLIB (shared library) as +# a matter of policy, because it is not appropriate for general purpose +# libraries such as libpq to report errors directly. OBJS_FRONTEND_SHLIB = \ $(OBJS_COMMON) \ fe_memutils.o \ @@ -121,8 +123,6 @@ GEN_KEYWORDLIST_DEPS = $(TOOLSDIR)/gen_keywordlist.pl $(TOOLSDIR)/PerfectHash.pm all: libpgcommon.a libpgcommon_shlib.a libpgcommon_srv.a -distprep: kwlist_d.h - # libpgcommon is needed by some contrib install: all installdirs $(INSTALL_STLIB) libpgcommon.a '$(DESTDIR)$(libdir)/libpgcommon.a' @@ -139,6 +139,13 @@ libpgcommon.a: $(OBJS_FRONTEND) rm -f $@ $(AR) $(AROPT) $@ $^ +# +# Files in libpgcommon.a should use/export the "xxx_private" versions +# of pg_char_to_encoding() and friends. +# +$(OBJS_FRONTEND): CPPFLAGS += -DUSE_PRIVATE_ENCODING_FUNCS + + # # Shared library versions of object files # @@ -188,10 +195,7 @@ RYU_OBJS = $(RYU_FILES) $(RYU_FILES:%.o=%_shlib.o) $(RYU_FILES:%.o=%_srv.o) $(RYU_OBJS): CFLAGS += $(PERMIT_DECLARATION_AFTER_STATEMENT) -# kwlist_d.h is in the distribution tarball, so it is not cleaned here. clean distclean: rm -f libpgcommon.a libpgcommon_shlib.a libpgcommon_srv.a rm -f $(OBJS_FRONTEND) $(OBJS_SHLIB) $(OBJS_SRV) - -maintainer-clean: distclean rm -f kwlist_d.h diff --git a/src/common/archive.c b/src/common/archive.c index 641a58ee88833..00b53705a5106 100644 --- a/src/common/archive.c +++ b/src/common/archive.c @@ -3,7 +3,7 @@ * archive.c * Common WAL archive routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/common/base64.c b/src/common/base64.c index ec4eb49382cca..4f23c96305243 100644 --- a/src/common/base64.c +++ b/src/common/base64.c @@ -3,7 +3,7 @@ * base64.c * Encoding and decoding routines for base64 without whitespace. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/backend/lib/binaryheap.c b/src/common/binaryheap.c similarity index 81% rename from src/backend/lib/binaryheap.c rename to src/common/binaryheap.c index 1737546757852..7377ebdf15681 100644 --- a/src/backend/lib/binaryheap.c +++ b/src/common/binaryheap.c @@ -3,18 +3,25 @@ * binaryheap.c * A simple binary heap implementation * - * Portions Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION - * src/backend/lib/binaryheap.c + * src/common/binaryheap.c * *------------------------------------------------------------------------- */ +#ifdef FRONTEND +#include "postgres_fe.h" +#else #include "postgres.h" +#endif #include +#ifdef FRONTEND +#include "common/logging.h" +#endif #include "lib/binaryheap.h" static void sift_down(binaryheap *heap, int node_off); @@ -34,7 +41,7 @@ binaryheap_allocate(int capacity, binaryheap_comparator compare, void *arg) int sz; binaryheap *heap; - sz = offsetof(binaryheap, bh_nodes) + sizeof(Datum) * capacity; + sz = offsetof(binaryheap, bh_nodes) + sizeof(bh_node_type) * capacity; heap = (binaryheap *) palloc(sz); heap->bh_space = capacity; heap->bh_compare = compare; @@ -106,10 +113,16 @@ parent_offset(int i) * afterwards. */ void -binaryheap_add_unordered(binaryheap *heap, Datum d) +binaryheap_add_unordered(binaryheap *heap, bh_node_type d) { if (heap->bh_size >= heap->bh_space) + { +#ifdef FRONTEND + pg_fatal("out of binary heap slots"); +#else elog(ERROR, "out of binary heap slots"); +#endif + } heap->bh_has_heap_property = false; heap->bh_nodes[heap->bh_size] = d; heap->bh_size++; @@ -138,10 +151,16 @@ binaryheap_build(binaryheap *heap) * the heap property. */ void -binaryheap_add(binaryheap *heap, Datum d) +binaryheap_add(binaryheap *heap, bh_node_type d) { if (heap->bh_size >= heap->bh_space) + { +#ifdef FRONTEND + pg_fatal("out of binary heap slots"); +#else elog(ERROR, "out of binary heap slots"); +#endif + } heap->bh_nodes[heap->bh_size] = d; heap->bh_size++; sift_up(heap, heap->bh_size - 1); @@ -154,7 +173,7 @@ binaryheap_add(binaryheap *heap, Datum d) * without modifying the heap. The caller must ensure that this * routine is not used on an empty heap. Always O(1). */ -Datum +bh_node_type binaryheap_first(binaryheap *heap) { Assert(!binaryheap_empty(heap) && heap->bh_has_heap_property); @@ -169,10 +188,10 @@ binaryheap_first(binaryheap *heap) * that this routine is not used on an empty heap. O(log n) worst * case. */ -Datum +bh_node_type binaryheap_remove_first(binaryheap *heap) { - Datum result; + bh_node_type result; Assert(!binaryheap_empty(heap) && heap->bh_has_heap_property); @@ -196,6 +215,35 @@ binaryheap_remove_first(binaryheap *heap) return result; } +/* + * binaryheap_remove_node + * + * Removes the nth (zero based) node from the heap. The caller must ensure + * that there are at least (n + 1) nodes in the heap. O(log n) worst case. + */ +void +binaryheap_remove_node(binaryheap *heap, int n) +{ + int cmp; + + Assert(!binaryheap_empty(heap) && heap->bh_has_heap_property); + Assert(n >= 0 && n < heap->bh_size); + + /* compare last node to the one that is being removed */ + cmp = heap->bh_compare(heap->bh_nodes[--heap->bh_size], + heap->bh_nodes[n], + heap->bh_arg); + + /* remove the last node, placing it in the vacated entry */ + heap->bh_nodes[n] = heap->bh_nodes[heap->bh_size]; + + /* sift as needed to preserve the heap property */ + if (cmp > 0) + sift_up(heap, n); + else if (cmp < 0) + sift_down(heap, n); +} + /* * binaryheap_replace_first * @@ -204,7 +252,7 @@ binaryheap_remove_first(binaryheap *heap) * sifting the new node down. */ void -binaryheap_replace_first(binaryheap *heap, Datum d) +binaryheap_replace_first(binaryheap *heap, bh_node_type d) { Assert(!binaryheap_empty(heap) && heap->bh_has_heap_property); @@ -221,7 +269,7 @@ binaryheap_replace_first(binaryheap *heap, Datum d) static void sift_up(binaryheap *heap, int node_off) { - Datum node_val = heap->bh_nodes[node_off]; + bh_node_type node_val = heap->bh_nodes[node_off]; /* * Within the loop, the node_off'th array entry is a "hole" that @@ -232,7 +280,7 @@ sift_up(binaryheap *heap, int node_off) { int cmp; int parent_off; - Datum parent_val; + bh_node_type parent_val; /* * If this node is smaller than its parent, the heap condition is @@ -264,7 +312,7 @@ sift_up(binaryheap *heap, int node_off) static void sift_down(binaryheap *heap, int node_off) { - Datum node_val = heap->bh_nodes[node_off]; + bh_node_type node_val = heap->bh_nodes[node_off]; /* * Within the loop, the node_off'th array entry is a "hole" that diff --git a/src/common/blkreftable.c b/src/common/blkreftable.c new file mode 100644 index 0000000000000..845b5d1dc46ed --- /dev/null +++ b/src/common/blkreftable.c @@ -0,0 +1,1311 @@ +/*------------------------------------------------------------------------- + * + * blkreftable.c + * Block reference tables. + * + * A block reference table is used to keep track of which blocks have + * been modified by WAL records within a certain LSN range. + * + * For each relation fork, we keep track of all blocks that have appeared + * in block reference in the WAL. We also keep track of the "limit block", + * which is the smallest relation length in blocks known to have occurred + * during that range of WAL records. This should be set to 0 if the relation + * fork is created or destroyed, and to the post-truncation length if + * truncated. + * + * Whenever we set the limit block, we also forget about any modified blocks + * beyond that point. Those blocks don't exist any more. Such blocks can + * later be marked as modified again; if that happens, it means the relation + * was re-extended. + * + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group + * + * src/common/blkreftable.c + * + *------------------------------------------------------------------------- + */ + + +#ifndef FRONTEND +#include "postgres.h" +#else +#include "postgres_fe.h" +#endif + +#ifdef FRONTEND +#include "common/logging.h" +#endif + +#include "common/blkreftable.h" +#include "common/hashfn.h" +#include "port/pg_crc32c.h" + +/* + * A block reference table keeps track of the status of each relation + * fork individually. + */ +typedef struct BlockRefTableKey +{ + RelFileLocator rlocator; + ForkNumber forknum; +} BlockRefTableKey; + +/* + * We could need to store data either for a relation in which only a + * tiny fraction of the blocks have been modified or for a relation in + * which nearly every block has been modified, and we want a + * space-efficient representation in both cases. To accomplish this, + * we divide the relation into chunks of 2^16 blocks and choose between + * an array representation and a bitmap representation for each chunk. + * + * When the number of modified blocks in a given chunk is small, we + * essentially store an array of block numbers, but we need not store the + * entire block number: instead, we store each block number as a 2-byte + * offset from the start of the chunk. + * + * When the number of modified blocks in a given chunk is large, we switch + * to a bitmap representation. + * + * These same basic representational choices are used both when a block + * reference table is stored in memory and when it is serialized to disk. + * + * In the in-memory representation, we initially allocate each chunk with + * space for a number of entries given by INITIAL_ENTRIES_PER_CHUNK and + * increase that as necessary until we reach MAX_ENTRIES_PER_CHUNK. + * Any chunk whose allocated size reaches MAX_ENTRIES_PER_CHUNK is converted + * to a bitmap, and thus never needs to grow further. + */ +#define BLOCKS_PER_CHUNK (1 << 16) +#define BLOCKS_PER_ENTRY (BITS_PER_BYTE * sizeof(uint16)) +#define MAX_ENTRIES_PER_CHUNK (BLOCKS_PER_CHUNK / BLOCKS_PER_ENTRY) +#define INITIAL_ENTRIES_PER_CHUNK 16 +typedef uint16 *BlockRefTableChunk; + +/* + * State for one relation fork. + * + * 'rlocator' and 'forknum' identify the relation fork to which this entry + * pertains. + * + * 'limit_block' is the shortest known length of the relation in blocks + * within the LSN range covered by a particular block reference table. + * It should be set to 0 if the relation fork is created or dropped. If the + * relation fork is truncated, it should be set to the number of blocks that + * remain after truncation. + * + * 'nchunks' is the allocated length of each of the three arrays that follow. + * We can only represent the status of block numbers less than nchunks * + * BLOCKS_PER_CHUNK. + * + * 'chunk_size' is an array storing the allocated size of each chunk. + * + * 'chunk_usage' is an array storing the number of elements used in each + * chunk. If that value is less than MAX_ENTRIES_PER_CHUNK, the corresponding + * chunk is used as an array; else the corresponding chunk is used as a bitmap. + * When used as a bitmap, the least significant bit of the first array element + * is the status of the lowest-numbered block covered by this chunk. + * + * 'chunk_data' is the array of chunks. + */ +struct BlockRefTableEntry +{ + BlockRefTableKey key; + BlockNumber limit_block; + char status; + uint32 nchunks; + uint16 *chunk_size; + uint16 *chunk_usage; + BlockRefTableChunk *chunk_data; +}; + +/* Declare and define a hash table over type BlockRefTableEntry. */ +#define SH_PREFIX blockreftable +#define SH_ELEMENT_TYPE BlockRefTableEntry +#define SH_KEY_TYPE BlockRefTableKey +#define SH_KEY key +#define SH_HASH_KEY(tb, key) \ + hash_bytes((const unsigned char *) &key, sizeof(BlockRefTableKey)) +#define SH_EQUAL(tb, a, b) (memcmp(&a, &b, sizeof(BlockRefTableKey)) == 0) +#define SH_SCOPE static inline +#ifdef FRONTEND +#define SH_RAW_ALLOCATOR pg_malloc0 +#endif +#define SH_DEFINE +#define SH_DECLARE +#include "lib/simplehash.h" + +/* + * A block reference table is basically just the hash table, but we don't + * want to expose that to outside callers. + * + * We keep track of the memory context in use explicitly too, so that it's + * easy to place all of our allocations in the same context. + */ +struct BlockRefTable +{ + blockreftable_hash *hash; +#ifndef FRONTEND + MemoryContext mcxt; +#endif +}; + +/* + * On-disk serialization format for block reference table entries. + */ +typedef struct BlockRefTableSerializedEntry +{ + RelFileLocator rlocator; + ForkNumber forknum; + BlockNumber limit_block; + uint32 nchunks; +} BlockRefTableSerializedEntry; + +/* + * Buffer size, so that we avoid doing many small I/Os. + */ +#define BUFSIZE 65536 + +/* + * Ad-hoc buffer for file I/O. + */ +typedef struct BlockRefTableBuffer +{ + io_callback_fn io_callback; + void *io_callback_arg; + char data[BUFSIZE]; + int used; + int cursor; + pg_crc32c crc; +} BlockRefTableBuffer; + +/* + * State for keeping track of progress while incrementally reading a block + * table reference file from disk. + * + * total_chunks means the number of chunks for the RelFileLocator/ForkNumber + * combination that is currently being read, and consumed_chunks is the number + * of those that have been read. (We always read all the information for + * a single chunk at one time, so we don't need to be able to represent the + * state where a chunk has been partially read.) + * + * chunk_size is the array of chunk sizes. The length is given by total_chunks. + * + * chunk_data holds the current chunk. + * + * chunk_position helps us figure out how much progress we've made in returning + * the block numbers for the current chunk to the caller. If the chunk is a + * bitmap, it's the number of bits we've scanned; otherwise, it's the number + * of chunk entries we've scanned. + */ +struct BlockRefTableReader +{ + BlockRefTableBuffer buffer; + char *error_filename; + report_error_fn error_callback; + void *error_callback_arg; + uint32 total_chunks; + uint32 consumed_chunks; + uint16 *chunk_size; + uint16 chunk_data[MAX_ENTRIES_PER_CHUNK]; + uint32 chunk_position; +}; + +/* + * State for keeping track of progress while incrementally writing a block + * reference table file to disk. + */ +struct BlockRefTableWriter +{ + BlockRefTableBuffer buffer; +}; + +/* Function prototypes. */ +static int BlockRefTableComparator(const void *a, const void *b); +static void BlockRefTableFlush(BlockRefTableBuffer *buffer); +static void BlockRefTableRead(BlockRefTableReader *reader, void *data, + int length); +static void BlockRefTableWrite(BlockRefTableBuffer *buffer, void *data, + int length); +static void BlockRefTableFileTerminate(BlockRefTableBuffer *buffer); + +/* + * Create an empty block reference table. + */ +BlockRefTable * +CreateEmptyBlockRefTable(void) +{ + BlockRefTable *brtab = palloc(sizeof(BlockRefTable)); + + /* + * Even completely empty database has a few hundred relation forks, so it + * seems best to size the hash on the assumption that we're going to have + * at least a few thousand entries. + */ +#ifdef FRONTEND + brtab->hash = blockreftable_create(4096, NULL); +#else + brtab->mcxt = CurrentMemoryContext; + brtab->hash = blockreftable_create(brtab->mcxt, 4096, NULL); +#endif + + return brtab; +} + +/* + * Set the "limit block" for a relation fork and forget any modified blocks + * with equal or higher block numbers. + * + * The "limit block" is the shortest known length of the relation within the + * range of WAL records covered by this block reference table. + */ +void +BlockRefTableSetLimitBlock(BlockRefTable *brtab, + const RelFileLocator *rlocator, + ForkNumber forknum, + BlockNumber limit_block) +{ + BlockRefTableEntry *brtentry; + BlockRefTableKey key = {{0}}; /* make sure any padding is zero */ + bool found; + + memcpy(&key.rlocator, rlocator, sizeof(RelFileLocator)); + key.forknum = forknum; + brtentry = blockreftable_insert(brtab->hash, key, &found); + + if (!found) + { + /* + * We have no existing data about this relation fork, so just record + * the limit_block value supplied by the caller, and make sure other + * parts of the entry are properly initialized. + */ + brtentry->limit_block = limit_block; + brtentry->nchunks = 0; + brtentry->chunk_size = NULL; + brtentry->chunk_usage = NULL; + brtentry->chunk_data = NULL; + return; + } + + BlockRefTableEntrySetLimitBlock(brtentry, limit_block); +} + +/* + * Mark a block in a given relation fork as known to have been modified. + */ +void +BlockRefTableMarkBlockModified(BlockRefTable *brtab, + const RelFileLocator *rlocator, + ForkNumber forknum, + BlockNumber blknum) +{ + BlockRefTableEntry *brtentry; + BlockRefTableKey key = {{0}}; /* make sure any padding is zero */ + bool found; +#ifndef FRONTEND + MemoryContext oldcontext = MemoryContextSwitchTo(brtab->mcxt); +#endif + + memcpy(&key.rlocator, rlocator, sizeof(RelFileLocator)); + key.forknum = forknum; + brtentry = blockreftable_insert(brtab->hash, key, &found); + + if (!found) + { + /* + * We want to set the initial limit block value to something higher + * than any legal block number. InvalidBlockNumber fits the bill. + */ + brtentry->limit_block = InvalidBlockNumber; + brtentry->nchunks = 0; + brtentry->chunk_size = NULL; + brtentry->chunk_usage = NULL; + brtentry->chunk_data = NULL; + } + + BlockRefTableEntryMarkBlockModified(brtentry, forknum, blknum); + +#ifndef FRONTEND + MemoryContextSwitchTo(oldcontext); +#endif +} + +/* + * Get an entry from a block reference table. + * + * If the entry does not exist, this function returns NULL. Otherwise, it + * returns the entry and sets *limit_block to the value from the entry. + */ +BlockRefTableEntry * +BlockRefTableGetEntry(BlockRefTable *brtab, const RelFileLocator *rlocator, + ForkNumber forknum, BlockNumber *limit_block) +{ + BlockRefTableKey key = {{0}}; /* make sure any padding is zero */ + BlockRefTableEntry *entry; + + Assert(limit_block != NULL); + + memcpy(&key.rlocator, rlocator, sizeof(RelFileLocator)); + key.forknum = forknum; + entry = blockreftable_lookup(brtab->hash, key); + + if (entry != NULL) + *limit_block = entry->limit_block; + + return entry; +} + +/* + * Get block numbers from a table entry. + * + * 'blocks' must point to enough space to hold at least 'nblocks' block + * numbers, and any block numbers we manage to get will be written there. + * The return value is the number of block numbers actually written. + * + * We do not return block numbers unless they are greater than or equal to + * start_blkno and strictly less than stop_blkno. + */ +int +BlockRefTableEntryGetBlocks(BlockRefTableEntry *entry, + BlockNumber start_blkno, + BlockNumber stop_blkno, + BlockNumber *blocks, + int nblocks) +{ + uint32 start_chunkno; + uint32 stop_chunkno; + uint32 chunkno; + int nresults = 0; + + Assert(entry != NULL); + + /* + * Figure out which chunks could potentially contain blocks of interest. + * + * We need to be careful about overflow here, because stop_blkno could be + * InvalidBlockNumber or something very close to it. + */ + start_chunkno = start_blkno / BLOCKS_PER_CHUNK; + stop_chunkno = stop_blkno / BLOCKS_PER_CHUNK; + if ((stop_blkno % BLOCKS_PER_CHUNK) != 0) + ++stop_chunkno; + if (stop_chunkno > entry->nchunks) + stop_chunkno = entry->nchunks; + + /* + * Loop over chunks. + */ + for (chunkno = start_chunkno; chunkno < stop_chunkno; ++chunkno) + { + uint16 chunk_usage = entry->chunk_usage[chunkno]; + BlockRefTableChunk chunk_data = entry->chunk_data[chunkno]; + unsigned start_offset = 0; + unsigned stop_offset = BLOCKS_PER_CHUNK; + + /* + * If the start and/or stop block number falls within this chunk, the + * whole chunk may not be of interest. Figure out which portion we + * care about, if it's not the whole thing. + */ + if (chunkno == start_chunkno) + start_offset = start_blkno % BLOCKS_PER_CHUNK; + if (chunkno == stop_chunkno - 1) + { + Assert(stop_blkno > chunkno * BLOCKS_PER_CHUNK); + stop_offset = stop_blkno - (chunkno * BLOCKS_PER_CHUNK); + Assert(stop_offset <= BLOCKS_PER_CHUNK); + } + + /* + * Handling differs depending on whether this is an array of offsets + * or a bitmap. + */ + if (chunk_usage == MAX_ENTRIES_PER_CHUNK) + { + unsigned i; + + /* It's a bitmap, so test every relevant bit. */ + for (i = start_offset; i < stop_offset; ++i) + { + uint16 w = chunk_data[i / BLOCKS_PER_ENTRY]; + + if ((w & (1 << (i % BLOCKS_PER_ENTRY))) != 0) + { + BlockNumber blkno = chunkno * BLOCKS_PER_CHUNK + i; + + blocks[nresults++] = blkno; + + /* Early exit if we run out of output space. */ + if (nresults == nblocks) + return nresults; + } + } + } + else + { + unsigned i; + + /* It's an array of offsets, so check each one. */ + for (i = 0; i < chunk_usage; ++i) + { + uint16 offset = chunk_data[i]; + + if (offset >= start_offset && offset < stop_offset) + { + BlockNumber blkno = chunkno * BLOCKS_PER_CHUNK + offset; + + blocks[nresults++] = blkno; + + /* Early exit if we run out of output space. */ + if (nresults == nblocks) + return nresults; + } + } + } + } + + return nresults; +} + +/* + * Serialize a block reference table to a file. + */ +void +WriteBlockRefTable(BlockRefTable *brtab, + io_callback_fn write_callback, + void *write_callback_arg) +{ + BlockRefTableSerializedEntry *sdata = NULL; + BlockRefTableBuffer buffer; + uint32 magic = BLOCKREFTABLE_MAGIC; + + /* Prepare buffer. */ + memset(&buffer, 0, sizeof(BlockRefTableBuffer)); + buffer.io_callback = write_callback; + buffer.io_callback_arg = write_callback_arg; + INIT_CRC32C(buffer.crc); + + /* Write magic number. */ + BlockRefTableWrite(&buffer, &magic, sizeof(uint32)); + + /* Write the entries, assuming there are some. */ + if (brtab->hash->members > 0) + { + unsigned i = 0; + blockreftable_iterator it; + BlockRefTableEntry *brtentry; + + /* Extract entries into serializable format and sort them. */ + sdata = + palloc(brtab->hash->members * sizeof(BlockRefTableSerializedEntry)); + blockreftable_start_iterate(brtab->hash, &it); + while ((brtentry = blockreftable_iterate(brtab->hash, &it)) != NULL) + { + BlockRefTableSerializedEntry *sentry = &sdata[i++]; + + sentry->rlocator = brtentry->key.rlocator; + sentry->forknum = brtentry->key.forknum; + sentry->limit_block = brtentry->limit_block; + sentry->nchunks = brtentry->nchunks; + + /* trim trailing zero entries */ + while (sentry->nchunks > 0 && + brtentry->chunk_usage[sentry->nchunks - 1] == 0) + sentry->nchunks--; + } + Assert(i == brtab->hash->members); + qsort(sdata, i, sizeof(BlockRefTableSerializedEntry), + BlockRefTableComparator); + + /* Loop over entries in sorted order and serialize each one. */ + for (i = 0; i < brtab->hash->members; ++i) + { + BlockRefTableSerializedEntry *sentry = &sdata[i]; + BlockRefTableKey key = {{0}}; /* make sure any padding is zero */ + unsigned j; + + /* Write the serialized entry itself. */ + BlockRefTableWrite(&buffer, sentry, + sizeof(BlockRefTableSerializedEntry)); + + /* Look up the original entry so we can access the chunks. */ + memcpy(&key.rlocator, &sentry->rlocator, sizeof(RelFileLocator)); + key.forknum = sentry->forknum; + brtentry = blockreftable_lookup(brtab->hash, key); + Assert(brtentry != NULL); + + /* Write the untruncated portion of the chunk length array. */ + if (sentry->nchunks != 0) + BlockRefTableWrite(&buffer, brtentry->chunk_usage, + sentry->nchunks * sizeof(uint16)); + + /* Write the contents of each chunk. */ + for (j = 0; j < brtentry->nchunks; ++j) + { + if (brtentry->chunk_usage[j] == 0) + continue; + BlockRefTableWrite(&buffer, brtentry->chunk_data[j], + brtentry->chunk_usage[j] * sizeof(uint16)); + } + } + } + + /* Write out appropriate terminator and CRC and flush buffer. */ + BlockRefTableFileTerminate(&buffer); +} + +/* + * Prepare to incrementally read a block reference table file. + * + * 'read_callback' is a function that can be called to read data from the + * underlying file (or other data source) into our internal buffer. + * + * 'read_callback_arg' is an opaque argument to be passed to read_callback. + * + * 'error_filename' is the filename that should be included in error messages + * if the file is found to be malformed. The value is not copied, so the + * caller should ensure that it remains valid until done with this + * BlockRefTableReader. + * + * 'error_callback' is a function to be called if the file is found to be + * malformed. This is not used for I/O errors, which must be handled internally + * by read_callback. + * + * 'error_callback_arg' is an opaque argument to be passed to error_callback. + */ +BlockRefTableReader * +CreateBlockRefTableReader(io_callback_fn read_callback, + void *read_callback_arg, + char *error_filename, + report_error_fn error_callback, + void *error_callback_arg) +{ + BlockRefTableReader *reader; + uint32 magic; + + /* Initialize data structure. */ + reader = palloc0(sizeof(BlockRefTableReader)); + reader->buffer.io_callback = read_callback; + reader->buffer.io_callback_arg = read_callback_arg; + reader->error_filename = error_filename; + reader->error_callback = error_callback; + reader->error_callback_arg = error_callback_arg; + INIT_CRC32C(reader->buffer.crc); + + /* Verify magic number. */ + BlockRefTableRead(reader, &magic, sizeof(uint32)); + if (magic != BLOCKREFTABLE_MAGIC) + error_callback(error_callback_arg, + "file \"%s\" has wrong magic number: expected %u, found %u", + error_filename, + BLOCKREFTABLE_MAGIC, magic); + + return reader; +} + +/* + * Read next relation fork covered by this block reference table file. + * + * After calling this function, you must call BlockRefTableReaderGetBlocks + * until it returns 0 before calling it again. + */ +bool +BlockRefTableReaderNextRelation(BlockRefTableReader *reader, + RelFileLocator *rlocator, + ForkNumber *forknum, + BlockNumber *limit_block) +{ + BlockRefTableSerializedEntry sentry; + BlockRefTableSerializedEntry zentry = {{0}}; + + /* + * Sanity check: caller must read all blocks from all chunks before moving + * on to the next relation. + */ + Assert(reader->total_chunks == reader->consumed_chunks); + + /* Read serialized entry. */ + BlockRefTableRead(reader, &sentry, + sizeof(BlockRefTableSerializedEntry)); + + /* + * If we just read the sentinel entry indicating that we've reached the + * end, read and check the CRC. + */ + if (memcmp(&sentry, &zentry, sizeof(BlockRefTableSerializedEntry)) == 0) + { + pg_crc32c expected_crc; + pg_crc32c actual_crc; + + /* + * We want to know the CRC of the file excluding the 4-byte CRC + * itself, so copy the current value of the CRC accumulator before + * reading those bytes, and use the copy to finalize the calculation. + */ + expected_crc = reader->buffer.crc; + FIN_CRC32C(expected_crc); + + /* Now we can read the actual value. */ + BlockRefTableRead(reader, &actual_crc, sizeof(pg_crc32c)); + + /* Throw an error if there is a mismatch. */ + if (!EQ_CRC32C(expected_crc, actual_crc)) + reader->error_callback(reader->error_callback_arg, + "file \"%s\" has wrong checksum: expected %08X, found %08X", + reader->error_filename, expected_crc, actual_crc); + + return false; + } + + /* Read chunk size array. */ + if (reader->chunk_size != NULL) + pfree(reader->chunk_size); + reader->chunk_size = palloc(sentry.nchunks * sizeof(uint16)); + BlockRefTableRead(reader, reader->chunk_size, + sentry.nchunks * sizeof(uint16)); + + /* Set up for chunk scan. */ + reader->total_chunks = sentry.nchunks; + reader->consumed_chunks = 0; + + /* Return data to caller. */ + memcpy(rlocator, &sentry.rlocator, sizeof(RelFileLocator)); + *forknum = sentry.forknum; + *limit_block = sentry.limit_block; + return true; +} + +/* + * Get modified blocks associated with the relation fork returned by + * the most recent call to BlockRefTableReaderNextRelation. + * + * On return, block numbers will be written into the 'blocks' array, whose + * length should be passed via 'nblocks'. The return value is the number of + * entries actually written into the 'blocks' array, which may be less than + * 'nblocks' if we run out of modified blocks in the relation fork before + * we run out of room in the array. + */ +unsigned +BlockRefTableReaderGetBlocks(BlockRefTableReader *reader, + BlockNumber *blocks, + int nblocks) +{ + unsigned blocks_found = 0; + + /* Must provide space for at least one block number to be returned. */ + Assert(nblocks > 0); + + /* Loop collecting blocks to return to caller. */ + for (;;) + { + uint16 next_chunk_size; + + /* + * If we've read at least one chunk, maybe it contains some block + * numbers that could satisfy caller's request. + */ + if (reader->consumed_chunks > 0) + { + uint32 chunkno = reader->consumed_chunks - 1; + uint16 chunk_size = reader->chunk_size[chunkno]; + + if (chunk_size == MAX_ENTRIES_PER_CHUNK) + { + /* Bitmap format, so search for bits that are set. */ + while (reader->chunk_position < BLOCKS_PER_CHUNK && + blocks_found < nblocks) + { + uint16 chunkoffset = reader->chunk_position; + uint16 w; + + w = reader->chunk_data[chunkoffset / BLOCKS_PER_ENTRY]; + if ((w & (1u << (chunkoffset % BLOCKS_PER_ENTRY))) != 0) + blocks[blocks_found++] = + chunkno * BLOCKS_PER_CHUNK + chunkoffset; + ++reader->chunk_position; + } + } + else + { + /* Not in bitmap format, so each entry is a 2-byte offset. */ + while (reader->chunk_position < chunk_size && + blocks_found < nblocks) + { + blocks[blocks_found++] = chunkno * BLOCKS_PER_CHUNK + + reader->chunk_data[reader->chunk_position]; + ++reader->chunk_position; + } + } + } + + /* We found enough blocks, so we're done. */ + if (blocks_found >= nblocks) + break; + + /* + * We didn't find enough blocks, so we must need the next chunk. If + * there are none left, though, then we're done anyway. + */ + if (reader->consumed_chunks == reader->total_chunks) + break; + + /* + * Read data for next chunk and reset scan position to beginning of + * chunk. Note that the next chunk might be empty, in which case we + * consume the chunk without actually consuming any bytes from the + * underlying file. + */ + next_chunk_size = reader->chunk_size[reader->consumed_chunks]; + if (next_chunk_size > 0) + BlockRefTableRead(reader, reader->chunk_data, + next_chunk_size * sizeof(uint16)); + ++reader->consumed_chunks; + reader->chunk_position = 0; + } + + return blocks_found; +} + +/* + * Release memory used while reading a block reference table from a file. + */ +void +DestroyBlockRefTableReader(BlockRefTableReader *reader) +{ + if (reader->chunk_size != NULL) + { + pfree(reader->chunk_size); + reader->chunk_size = NULL; + } + pfree(reader); +} + +/* + * Prepare to write a block reference table file incrementally. + * + * Caller must be able to supply BlockRefTableEntry objects sorted in the + * appropriate order. + */ +BlockRefTableWriter * +CreateBlockRefTableWriter(io_callback_fn write_callback, + void *write_callback_arg) +{ + BlockRefTableWriter *writer; + uint32 magic = BLOCKREFTABLE_MAGIC; + + /* Prepare buffer and CRC check and save callbacks. */ + writer = palloc0(sizeof(BlockRefTableWriter)); + writer->buffer.io_callback = write_callback; + writer->buffer.io_callback_arg = write_callback_arg; + INIT_CRC32C(writer->buffer.crc); + + /* Write magic number. */ + BlockRefTableWrite(&writer->buffer, &magic, sizeof(uint32)); + + return writer; +} + +/* + * Append one entry to a block reference table file. + * + * Note that entries must be written in the proper order, that is, sorted by + * tablespace, then database, then relfilenumber, then fork number. Caller + * is responsible for supplying data in the correct order. If that seems hard, + * use an in-memory BlockRefTable instead. + */ +void +BlockRefTableWriteEntry(BlockRefTableWriter *writer, BlockRefTableEntry *entry) +{ + BlockRefTableSerializedEntry sentry; + unsigned j; + + /* Convert to serialized entry format. */ + sentry.rlocator = entry->key.rlocator; + sentry.forknum = entry->key.forknum; + sentry.limit_block = entry->limit_block; + sentry.nchunks = entry->nchunks; + + /* Trim trailing zero entries. */ + while (sentry.nchunks > 0 && entry->chunk_usage[sentry.nchunks - 1] == 0) + sentry.nchunks--; + + /* Write the serialized entry itself. */ + BlockRefTableWrite(&writer->buffer, &sentry, + sizeof(BlockRefTableSerializedEntry)); + + /* Write the untruncated portion of the chunk length array. */ + if (sentry.nchunks != 0) + BlockRefTableWrite(&writer->buffer, entry->chunk_usage, + sentry.nchunks * sizeof(uint16)); + + /* Write the contents of each chunk. */ + for (j = 0; j < entry->nchunks; ++j) + { + if (entry->chunk_usage[j] == 0) + continue; + BlockRefTableWrite(&writer->buffer, entry->chunk_data[j], + entry->chunk_usage[j] * sizeof(uint16)); + } +} + +/* + * Finalize an incremental write of a block reference table file. + */ +void +DestroyBlockRefTableWriter(BlockRefTableWriter *writer) +{ + BlockRefTableFileTerminate(&writer->buffer); + pfree(writer); +} + +/* + * Allocate a standalone BlockRefTableEntry. + * + * When we're manipulating a full in-memory BlockRefTable, the entries are + * part of the hash table and are allocated by simplehash. This routine is + * used by callers that want to write out a BlockRefTable to a file without + * needing to store the whole thing in memory at once. + * + * Entries allocated by this function can be manipulated using the functions + * BlockRefTableEntrySetLimitBlock and BlockRefTableEntryMarkBlockModified + * and then written using BlockRefTableWriteEntry and freed using + * BlockRefTableFreeEntry. + */ +BlockRefTableEntry * +CreateBlockRefTableEntry(RelFileLocator rlocator, ForkNumber forknum) +{ + BlockRefTableEntry *entry = palloc0(sizeof(BlockRefTableEntry)); + + memcpy(&entry->key.rlocator, &rlocator, sizeof(RelFileLocator)); + entry->key.forknum = forknum; + entry->limit_block = InvalidBlockNumber; + + return entry; +} + +/* + * Update a BlockRefTableEntry with a new value for the "limit block" and + * forget any equal-or-higher-numbered modified blocks. + * + * The "limit block" is the shortest known length of the relation within the + * range of WAL records covered by this block reference table. + */ +void +BlockRefTableEntrySetLimitBlock(BlockRefTableEntry *entry, + BlockNumber limit_block) +{ + unsigned chunkno; + unsigned limit_chunkno; + unsigned limit_chunkoffset; + BlockRefTableChunk limit_chunk; + + /* If we already have an equal or lower limit block, do nothing. */ + if (limit_block >= entry->limit_block) + return; + + /* Record the new limit block value. */ + entry->limit_block = limit_block; + + /* + * Figure out which chunk would store the state of the new limit block, + * and which offset within that chunk. + */ + limit_chunkno = limit_block / BLOCKS_PER_CHUNK; + limit_chunkoffset = limit_block % BLOCKS_PER_CHUNK; + + /* + * If the number of chunks is not large enough for any blocks with equal + * or higher block numbers to exist, then there is nothing further to do. + */ + if (limit_chunkno >= entry->nchunks) + return; + + /* Discard entire contents of any higher-numbered chunks. */ + for (chunkno = limit_chunkno + 1; chunkno < entry->nchunks; ++chunkno) + entry->chunk_usage[chunkno] = 0; + + /* + * Next, we need to discard any offsets within the chunk that would + * contain the limit_block. We must handle this differently depending on + * whether the chunk that would contain limit_block is a bitmap or an + * array of offsets. + */ + limit_chunk = entry->chunk_data[limit_chunkno]; + if (entry->chunk_usage[limit_chunkno] == MAX_ENTRIES_PER_CHUNK) + { + unsigned chunkoffset; + + /* It's a bitmap. Unset bits. */ + for (chunkoffset = limit_chunkoffset; chunkoffset < BLOCKS_PER_CHUNK; + ++chunkoffset) + limit_chunk[chunkoffset / BLOCKS_PER_ENTRY] &= + ~(1 << (chunkoffset % BLOCKS_PER_ENTRY)); + } + else + { + unsigned i, + j = 0; + + /* It's an offset array. Filter out large offsets. */ + for (i = 0; i < entry->chunk_usage[limit_chunkno]; ++i) + { + Assert(j <= i); + if (limit_chunk[i] < limit_chunkoffset) + limit_chunk[j++] = limit_chunk[i]; + } + Assert(j <= entry->chunk_usage[limit_chunkno]); + entry->chunk_usage[limit_chunkno] = j; + } +} + +/* + * Mark a block in a given BlockRefTableEntry as known to have been modified. + */ +void +BlockRefTableEntryMarkBlockModified(BlockRefTableEntry *entry, + ForkNumber forknum, + BlockNumber blknum) +{ + unsigned chunkno; + unsigned chunkoffset; + unsigned i; + + /* + * Which chunk should store the state of this block? And what is the + * offset of this block relative to the start of that chunk? + */ + chunkno = blknum / BLOCKS_PER_CHUNK; + chunkoffset = blknum % BLOCKS_PER_CHUNK; + + /* + * If 'nchunks' isn't big enough for us to be able to represent the state + * of this block, we need to enlarge our arrays. + */ + if (chunkno >= entry->nchunks) + { + unsigned max_chunks; + unsigned extra_chunks; + + /* + * New array size is a power of 2, at least 16, big enough so that + * chunkno will be a valid array index. + */ + max_chunks = Max(16, entry->nchunks); + while (max_chunks < chunkno + 1) + max_chunks *= 2; + extra_chunks = max_chunks - entry->nchunks; + + if (entry->nchunks == 0) + { + entry->chunk_size = palloc0(sizeof(uint16) * max_chunks); + entry->chunk_usage = palloc0(sizeof(uint16) * max_chunks); + entry->chunk_data = + palloc0(sizeof(BlockRefTableChunk) * max_chunks); + } + else + { + entry->chunk_size = repalloc(entry->chunk_size, + sizeof(uint16) * max_chunks); + memset(&entry->chunk_size[entry->nchunks], 0, + extra_chunks * sizeof(uint16)); + entry->chunk_usage = repalloc(entry->chunk_usage, + sizeof(uint16) * max_chunks); + memset(&entry->chunk_usage[entry->nchunks], 0, + extra_chunks * sizeof(uint16)); + entry->chunk_data = repalloc(entry->chunk_data, + sizeof(BlockRefTableChunk) * max_chunks); + memset(&entry->chunk_data[entry->nchunks], 0, + extra_chunks * sizeof(BlockRefTableChunk)); + } + entry->nchunks = max_chunks; + } + + /* + * If the chunk that covers this block number doesn't exist yet, create it + * as an array and add the appropriate offset to it. We make it pretty + * small initially, because there might only be 1 or a few block + * references in this chunk and we don't want to use up too much memory. + */ + if (entry->chunk_size[chunkno] == 0) + { + entry->chunk_data[chunkno] = + palloc(sizeof(uint16) * INITIAL_ENTRIES_PER_CHUNK); + entry->chunk_size[chunkno] = INITIAL_ENTRIES_PER_CHUNK; + entry->chunk_data[chunkno][0] = chunkoffset; + entry->chunk_usage[chunkno] = 1; + return; + } + + /* + * If the number of entries in this chunk is already maximum, it must be a + * bitmap. Just set the appropriate bit. + */ + if (entry->chunk_usage[chunkno] == MAX_ENTRIES_PER_CHUNK) + { + BlockRefTableChunk chunk = entry->chunk_data[chunkno]; + + chunk[chunkoffset / BLOCKS_PER_ENTRY] |= + 1 << (chunkoffset % BLOCKS_PER_ENTRY); + return; + } + + /* + * There is an existing chunk and it's in array format. Let's find out + * whether it already has an entry for this block. If so, we do not need + * to do anything. + */ + for (i = 0; i < entry->chunk_usage[chunkno]; ++i) + { + if (entry->chunk_data[chunkno][i] == chunkoffset) + return; + } + + /* + * If the number of entries currently used is one less than the maximum, + * it's time to convert to bitmap format. + */ + if (entry->chunk_usage[chunkno] == MAX_ENTRIES_PER_CHUNK - 1) + { + BlockRefTableChunk newchunk; + unsigned j; + + /* Allocate a new chunk. */ + newchunk = palloc0(MAX_ENTRIES_PER_CHUNK * sizeof(uint16)); + + /* Set the bit for each existing entry. */ + for (j = 0; j < entry->chunk_usage[chunkno]; ++j) + { + unsigned coff = entry->chunk_data[chunkno][j]; + + newchunk[coff / BLOCKS_PER_ENTRY] |= + 1 << (coff % BLOCKS_PER_ENTRY); + } + + /* Set the bit for the new entry. */ + newchunk[chunkoffset / BLOCKS_PER_ENTRY] |= + 1 << (chunkoffset % BLOCKS_PER_ENTRY); + + /* Swap the new chunk into place and update metadata. */ + pfree(entry->chunk_data[chunkno]); + entry->chunk_data[chunkno] = newchunk; + entry->chunk_size[chunkno] = MAX_ENTRIES_PER_CHUNK; + entry->chunk_usage[chunkno] = MAX_ENTRIES_PER_CHUNK; + return; + } + + /* + * OK, we currently have an array, and we don't need to convert to a + * bitmap, but we do need to add a new element. If there's not enough + * room, we'll have to expand the array. + */ + if (entry->chunk_usage[chunkno] == entry->chunk_size[chunkno]) + { + unsigned newsize = entry->chunk_size[chunkno] * 2; + + Assert(newsize <= MAX_ENTRIES_PER_CHUNK); + entry->chunk_data[chunkno] = repalloc(entry->chunk_data[chunkno], + newsize * sizeof(uint16)); + entry->chunk_size[chunkno] = newsize; + } + + /* Now we can add the new entry. */ + entry->chunk_data[chunkno][entry->chunk_usage[chunkno]] = + chunkoffset; + entry->chunk_usage[chunkno]++; +} + +/* + * Release memory for a BlockRefTableEntry that was created by + * CreateBlockRefTableEntry. + */ +void +BlockRefTableFreeEntry(BlockRefTableEntry *entry) +{ + if (entry->chunk_size != NULL) + { + pfree(entry->chunk_size); + entry->chunk_size = NULL; + } + + if (entry->chunk_usage != NULL) + { + pfree(entry->chunk_usage); + entry->chunk_usage = NULL; + } + + if (entry->chunk_data != NULL) + { + pfree(entry->chunk_data); + entry->chunk_data = NULL; + } + + pfree(entry); +} + +/* + * Comparator for BlockRefTableSerializedEntry objects. + * + * We make the tablespace OID the first column of the sort key to match + * the on-disk tree structure. + */ +static int +BlockRefTableComparator(const void *a, const void *b) +{ + const BlockRefTableSerializedEntry *sa = a; + const BlockRefTableSerializedEntry *sb = b; + + if (sa->rlocator.spcOid > sb->rlocator.spcOid) + return 1; + if (sa->rlocator.spcOid < sb->rlocator.spcOid) + return -1; + + if (sa->rlocator.dbOid > sb->rlocator.dbOid) + return 1; + if (sa->rlocator.dbOid < sb->rlocator.dbOid) + return -1; + + if (sa->rlocator.relNumber > sb->rlocator.relNumber) + return 1; + if (sa->rlocator.relNumber < sb->rlocator.relNumber) + return -1; + + if (sa->forknum > sb->forknum) + return 1; + if (sa->forknum < sb->forknum) + return -1; + + return 0; +} + +/* + * Flush any buffered data out of a BlockRefTableBuffer. + */ +static void +BlockRefTableFlush(BlockRefTableBuffer *buffer) +{ + buffer->io_callback(buffer->io_callback_arg, buffer->data, buffer->used); + buffer->used = 0; +} + +/* + * Read data from a BlockRefTableBuffer, and update the running CRC + * calculation for the returned data (but not any data that we may have + * buffered but not yet actually returned). + */ +static void +BlockRefTableRead(BlockRefTableReader *reader, void *data, int length) +{ + BlockRefTableBuffer *buffer = &reader->buffer; + + /* Loop until read is fully satisfied. */ + while (length > 0) + { + if (buffer->cursor < buffer->used) + { + /* + * If any buffered data is available, use that to satisfy as much + * of the request as possible. + */ + int bytes_to_copy = Min(length, buffer->used - buffer->cursor); + + memcpy(data, &buffer->data[buffer->cursor], bytes_to_copy); + COMP_CRC32C(buffer->crc, &buffer->data[buffer->cursor], + bytes_to_copy); + buffer->cursor += bytes_to_copy; + data = ((char *) data) + bytes_to_copy; + length -= bytes_to_copy; + } + else if (length >= BUFSIZE) + { + /* + * If the request length is long, read directly into caller's + * buffer. + */ + int bytes_read; + + bytes_read = buffer->io_callback(buffer->io_callback_arg, + data, length); + COMP_CRC32C(buffer->crc, data, bytes_read); + data = ((char *) data) + bytes_read; + length -= bytes_read; + + /* If we didn't get anything, that's bad. */ + if (bytes_read == 0) + reader->error_callback(reader->error_callback_arg, + "file \"%s\" ends unexpectedly", + reader->error_filename); + } + else + { + /* + * Refill our buffer. + */ + buffer->used = buffer->io_callback(buffer->io_callback_arg, + buffer->data, BUFSIZE); + buffer->cursor = 0; + + /* If we didn't get anything, that's bad. */ + if (buffer->used == 0) + reader->error_callback(reader->error_callback_arg, + "file \"%s\" ends unexpectedly", + reader->error_filename); + } + } +} + +/* + * Supply data to a BlockRefTableBuffer for write to the underlying File, + * and update the running CRC calculation for that data. + */ +static void +BlockRefTableWrite(BlockRefTableBuffer *buffer, void *data, int length) +{ + /* Update running CRC calculation. */ + COMP_CRC32C(buffer->crc, data, length); + + /* If the new data can't fit into the buffer, flush the buffer. */ + if (buffer->used + length > BUFSIZE) + { + buffer->io_callback(buffer->io_callback_arg, buffer->data, + buffer->used); + buffer->used = 0; + } + + /* If the new data would fill the buffer, or more, write it directly. */ + if (length >= BUFSIZE) + { + buffer->io_callback(buffer->io_callback_arg, data, length); + return; + } + + /* Otherwise, copy the new data into the buffer. */ + memcpy(&buffer->data[buffer->used], data, length); + buffer->used += length; + Assert(buffer->used <= BUFSIZE); +} + +/* + * Generate the sentinel and CRC required at the end of a block reference + * table file and flush them out of our internal buffer. + */ +static void +BlockRefTableFileTerminate(BlockRefTableBuffer *buffer) +{ + BlockRefTableSerializedEntry zentry = {{0}}; + pg_crc32c crc; + + /* Write a sentinel indicating that there are no more entries. */ + BlockRefTableWrite(buffer, &zentry, + sizeof(BlockRefTableSerializedEntry)); + + /* + * Writing the checksum will perturb the ongoing checksum calculation, so + * copy the state first and finalize the computation using the copy. + */ + crc = buffer->crc; + FIN_CRC32C(crc); + BlockRefTableWrite(buffer, &crc, sizeof(pg_crc32c)); + + /* Flush any leftover data out of our buffer. */ + BlockRefTableFlush(buffer); +} diff --git a/src/common/checksum_helper.c b/src/common/checksum_helper.c index 21ff8954fd8b6..cc111401aebeb 100644 --- a/src/common/checksum_helper.c +++ b/src/common/checksum_helper.c @@ -3,7 +3,7 @@ * checksum_helper.c * Compute a checksum of any of various types using common routines * - * Portions Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/checksum_helper.c diff --git a/src/common/compression.c b/src/common/compression.c index ee937623f0b26..52e9ed01fbc54 100644 --- a/src/common/compression.c +++ b/src/common/compression.c @@ -14,7 +14,7 @@ * * Currently, the supported keywords are "level", "long", and "workers". * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/compression.c diff --git a/src/common/config_info.c b/src/common/config_info.c index 09e78a6efb0b6..89c1ccb7f6273 100644 --- a/src/common/config_info.c +++ b/src/common/config_info.c @@ -4,7 +4,7 @@ * Common code for pg_config output * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/common/controldata_utils.c b/src/common/controldata_utils.c index 97235874662b4..82309b2510771 100644 --- a/src/common/controldata_utils.c +++ b/src/common/controldata_utils.c @@ -4,7 +4,7 @@ * Common code for control data file output. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -50,17 +50,41 @@ */ ControlFileData * get_controlfile(const char *DataDir, bool *crc_ok_p) +{ + char ControlFilePath[MAXPGPATH]; + + snprintf(ControlFilePath, MAXPGPATH, "%s/global/pg_control", DataDir); + + return get_controlfile_by_exact_path(ControlFilePath, crc_ok_p); +} + +/* + * get_controlfile_by_exact_path() + * + * As above, but the caller specifies the path to the control file itself, + * rather than the path to the data directory. + */ +ControlFileData * +get_controlfile_by_exact_path(const char *ControlFilePath, bool *crc_ok_p) { ControlFileData *ControlFile; int fd; - char ControlFilePath[MAXPGPATH]; pg_crc32c crc; int r; +#ifdef FRONTEND + pg_crc32c last_crc; + int retries = 0; +#endif Assert(crc_ok_p); ControlFile = palloc_object(ControlFileData); - snprintf(ControlFilePath, MAXPGPATH, "%s/global/pg_control", DataDir); + +#ifdef FRONTEND + INIT_CRC32C(last_crc); + +retry: +#endif #ifndef FRONTEND if ((fd = OpenTransientFile(ControlFilePath, O_RDONLY | PG_BINARY)) == -1) @@ -117,6 +141,26 @@ get_controlfile(const char *DataDir, bool *crc_ok_p) *crc_ok_p = EQ_CRC32C(crc, ControlFile->crc); +#ifdef FRONTEND + + /* + * If the server was writing at the same time, it is possible that we read + * partially updated contents on some systems. If the CRC doesn't match, + * retry a limited number of times until we compute the same bad CRC twice + * in a row with a short sleep in between. Then the failure is unlikely + * to be due to a concurrent write. + */ + if (!*crc_ok_p && + (retries == 0 || !EQ_CRC32C(crc, last_crc)) && + retries < 10) + { + retries++; + last_crc = crc; + pg_usleep(10000); + goto retry; + } +#endif + /* Make sure the control file is valid byte order. */ if (ControlFile->pg_control_version % 65536 == 0 && ControlFile->pg_control_version / 65536 != 0) diff --git a/src/common/cryptohash.c b/src/common/cryptohash.c index 42dbed722683c..c96f241dc9958 100644 --- a/src/common/cryptohash.c +++ b/src/common/cryptohash.c @@ -6,7 +6,7 @@ * This is the set of in-core functions used when there are no other * alternative options like OpenSSL. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -44,7 +44,7 @@ typedef enum pg_cryptohash_errno { PG_CRYPTOHASH_ERROR_NONE = 0, - PG_CRYPTOHASH_ERROR_DEST_LEN + PG_CRYPTOHASH_ERROR_DEST_LEN, } pg_cryptohash_errno; /* Internal pg_cryptohash_ctx structure */ diff --git a/src/common/cryptohash_openssl.c b/src/common/cryptohash_openssl.c index a654cd4ad4016..2c6eb11dc0e3e 100644 --- a/src/common/cryptohash_openssl.c +++ b/src/common/cryptohash_openssl.c @@ -6,7 +6,7 @@ * * This should only be used if code is compiled with OpenSSL support. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -31,7 +31,6 @@ #ifndef FRONTEND #include "utils/memutils.h" #include "utils/resowner.h" -#include "utils/resowner_private.h" #endif /* @@ -52,7 +51,7 @@ typedef enum pg_cryptohash_errno { PG_CRYPTOHASH_ERROR_NONE = 0, PG_CRYPTOHASH_ERROR_DEST_LEN, - PG_CRYPTOHASH_ERROR_OPENSSL + PG_CRYPTOHASH_ERROR_OPENSSL, } pg_cryptohash_errno; /* @@ -74,6 +73,32 @@ struct pg_cryptohash_ctx #endif }; +/* ResourceOwner callbacks to hold cryptohash contexts */ +#ifndef FRONTEND +static void ResOwnerReleaseCryptoHash(Datum res); + +static const ResourceOwnerDesc cryptohash_resowner_desc = +{ + .name = "OpenSSL cryptohash context", + .release_phase = RESOURCE_RELEASE_BEFORE_LOCKS, + .release_priority = RELEASE_PRIO_CRYPTOHASH_CONTEXTS, + .ReleaseResource = ResOwnerReleaseCryptoHash, + .DebugPrint = NULL /* the default message is fine */ +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberCryptoHash(ResourceOwner owner, pg_cryptohash_ctx *ctx) +{ + ResourceOwnerRemember(owner, PointerGetDatum(ctx), &cryptohash_resowner_desc); +} +static inline void +ResourceOwnerForgetCryptoHash(ResourceOwner owner, pg_cryptohash_ctx *ctx) +{ + ResourceOwnerForget(owner, PointerGetDatum(ctx), &cryptohash_resowner_desc); +} +#endif + static const char * SSLerrmessage(unsigned long ecode) { @@ -104,7 +129,7 @@ pg_cryptohash_create(pg_cryptohash_type type) * allocation to avoid leaking. */ #ifndef FRONTEND - ResourceOwnerEnlargeCryptoHash(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); #endif ctx = ALLOC(sizeof(pg_cryptohash_ctx)); @@ -138,8 +163,7 @@ pg_cryptohash_create(pg_cryptohash_type type) #ifndef FRONTEND ctx->resowner = CurrentResourceOwner; - ResourceOwnerRememberCryptoHash(CurrentResourceOwner, - PointerGetDatum(ctx)); + ResourceOwnerRememberCryptoHash(CurrentResourceOwner, ctx); #endif return ctx; @@ -307,8 +331,8 @@ pg_cryptohash_free(pg_cryptohash_ctx *ctx) EVP_MD_CTX_destroy(ctx->evpctx); #ifndef FRONTEND - ResourceOwnerForgetCryptoHash(ctx->resowner, - PointerGetDatum(ctx)); + if (ctx->resowner) + ResourceOwnerForgetCryptoHash(ctx->resowner, ctx); #endif explicit_bzero(ctx, sizeof(pg_cryptohash_ctx)); @@ -351,3 +375,16 @@ pg_cryptohash_error(pg_cryptohash_ctx *ctx) Assert(false); /* cannot be reached */ return _("success"); } + +/* ResourceOwner callbacks */ + +#ifndef FRONTEND +static void +ResOwnerReleaseCryptoHash(Datum res) +{ + pg_cryptohash_ctx *ctx = (pg_cryptohash_ctx *) DatumGetPointer(res); + + ctx->resowner = NULL; + pg_cryptohash_free(ctx); +} +#endif diff --git a/src/common/d2s.c b/src/common/d2s.c index 614e98192a820..fbdbd70062a5b 100644 --- a/src/common/d2s.c +++ b/src/common/d2s.c @@ -2,7 +2,7 @@ * * Ryu floating-point output for double precision. * - * Portions Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/d2s.c diff --git a/src/common/d2s_full_table.h b/src/common/d2s_full_table.h index 23f5e9a45e22f..e7e728d557741 100644 --- a/src/common/d2s_full_table.h +++ b/src/common/d2s_full_table.h @@ -2,7 +2,7 @@ * * Ryu floating-point output for double precision. * - * Portions Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/d2s_full_table.h diff --git a/src/common/d2s_intrinsics.h b/src/common/d2s_intrinsics.h index ae0f28dbb2f75..cd1b88963d3f8 100644 --- a/src/common/d2s_intrinsics.h +++ b/src/common/d2s_intrinsics.h @@ -2,7 +2,7 @@ * * Ryu floating-point output for double precision. * - * Portions Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/d2s_intrinsics.h diff --git a/src/common/encnames.c b/src/common/encnames.c index 0412a8220ef09..910cc2c7e5cf0 100644 --- a/src/common/encnames.c +++ b/src/common/encnames.c @@ -3,7 +3,7 @@ * encnames.c * Encoding names and routines for working with them. * - * Portions Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2001-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/encnames.c @@ -297,7 +297,6 @@ static const pg_encname pg_encname_tbl[] = /* ---------- * These are "official" encoding names. - * XXX must be sorted by the same order as enum pg_enc (in mb/pg_wchar.h) * ---------- */ #ifndef WIN32 @@ -308,48 +307,48 @@ static const pg_encname pg_encname_tbl[] = const pg_enc2name pg_enc2name_tbl[] = { - DEF_ENC2NAME(SQL_ASCII, 0), - DEF_ENC2NAME(EUC_JP, 20932), - DEF_ENC2NAME(EUC_CN, 20936), - DEF_ENC2NAME(EUC_KR, 51949), - DEF_ENC2NAME(EUC_TW, 0), - DEF_ENC2NAME(EUC_JIS_2004, 20932), - DEF_ENC2NAME(UTF8, 65001), - DEF_ENC2NAME(MULE_INTERNAL, 0), - DEF_ENC2NAME(LATIN1, 28591), - DEF_ENC2NAME(LATIN2, 28592), - DEF_ENC2NAME(LATIN3, 28593), - DEF_ENC2NAME(LATIN4, 28594), - DEF_ENC2NAME(LATIN5, 28599), - DEF_ENC2NAME(LATIN6, 0), - DEF_ENC2NAME(LATIN7, 0), - DEF_ENC2NAME(LATIN8, 0), - DEF_ENC2NAME(LATIN9, 28605), - DEF_ENC2NAME(LATIN10, 0), - DEF_ENC2NAME(WIN1256, 1256), - DEF_ENC2NAME(WIN1258, 1258), - DEF_ENC2NAME(WIN866, 866), - DEF_ENC2NAME(WIN874, 874), - DEF_ENC2NAME(KOI8R, 20866), - DEF_ENC2NAME(WIN1251, 1251), - DEF_ENC2NAME(WIN1252, 1252), - DEF_ENC2NAME(ISO_8859_5, 28595), - DEF_ENC2NAME(ISO_8859_6, 28596), - DEF_ENC2NAME(ISO_8859_7, 28597), - DEF_ENC2NAME(ISO_8859_8, 28598), - DEF_ENC2NAME(WIN1250, 1250), - DEF_ENC2NAME(WIN1253, 1253), - DEF_ENC2NAME(WIN1254, 1254), - DEF_ENC2NAME(WIN1255, 1255), - DEF_ENC2NAME(WIN1257, 1257), - DEF_ENC2NAME(KOI8U, 21866), - DEF_ENC2NAME(SJIS, 932), - DEF_ENC2NAME(BIG5, 950), - DEF_ENC2NAME(GBK, 936), - DEF_ENC2NAME(UHC, 949), - DEF_ENC2NAME(GB18030, 54936), - DEF_ENC2NAME(JOHAB, 0), - DEF_ENC2NAME(SHIFT_JIS_2004, 932) + [PG_SQL_ASCII] = DEF_ENC2NAME(SQL_ASCII, 0), + [PG_EUC_JP] = DEF_ENC2NAME(EUC_JP, 20932), + [PG_EUC_CN] = DEF_ENC2NAME(EUC_CN, 20936), + [PG_EUC_KR] = DEF_ENC2NAME(EUC_KR, 51949), + [PG_EUC_TW] = DEF_ENC2NAME(EUC_TW, 0), + [PG_EUC_JIS_2004] = DEF_ENC2NAME(EUC_JIS_2004, 20932), + [PG_UTF8] = DEF_ENC2NAME(UTF8, 65001), + [PG_MULE_INTERNAL] = DEF_ENC2NAME(MULE_INTERNAL, 0), + [PG_LATIN1] = DEF_ENC2NAME(LATIN1, 28591), + [PG_LATIN2] = DEF_ENC2NAME(LATIN2, 28592), + [PG_LATIN3] = DEF_ENC2NAME(LATIN3, 28593), + [PG_LATIN4] = DEF_ENC2NAME(LATIN4, 28594), + [PG_LATIN5] = DEF_ENC2NAME(LATIN5, 28599), + [PG_LATIN6] = DEF_ENC2NAME(LATIN6, 0), + [PG_LATIN7] = DEF_ENC2NAME(LATIN7, 0), + [PG_LATIN8] = DEF_ENC2NAME(LATIN8, 0), + [PG_LATIN9] = DEF_ENC2NAME(LATIN9, 28605), + [PG_LATIN10] = DEF_ENC2NAME(LATIN10, 0), + [PG_WIN1256] = DEF_ENC2NAME(WIN1256, 1256), + [PG_WIN1258] = DEF_ENC2NAME(WIN1258, 1258), + [PG_WIN866] = DEF_ENC2NAME(WIN866, 866), + [PG_WIN874] = DEF_ENC2NAME(WIN874, 874), + [PG_KOI8R] = DEF_ENC2NAME(KOI8R, 20866), + [PG_WIN1251] = DEF_ENC2NAME(WIN1251, 1251), + [PG_WIN1252] = DEF_ENC2NAME(WIN1252, 1252), + [PG_ISO_8859_5] = DEF_ENC2NAME(ISO_8859_5, 28595), + [PG_ISO_8859_6] = DEF_ENC2NAME(ISO_8859_6, 28596), + [PG_ISO_8859_7] = DEF_ENC2NAME(ISO_8859_7, 28597), + [PG_ISO_8859_8] = DEF_ENC2NAME(ISO_8859_8, 28598), + [PG_WIN1250] = DEF_ENC2NAME(WIN1250, 1250), + [PG_WIN1253] = DEF_ENC2NAME(WIN1253, 1253), + [PG_WIN1254] = DEF_ENC2NAME(WIN1254, 1254), + [PG_WIN1255] = DEF_ENC2NAME(WIN1255, 1255), + [PG_WIN1257] = DEF_ENC2NAME(WIN1257, 1257), + [PG_KOI8U] = DEF_ENC2NAME(KOI8U, 21866), + [PG_SJIS] = DEF_ENC2NAME(SJIS, 932), + [PG_BIG5] = DEF_ENC2NAME(BIG5, 950), + [PG_GBK] = DEF_ENC2NAME(GBK, 936), + [PG_UHC] = DEF_ENC2NAME(UHC, 949), + [PG_GB18030] = DEF_ENC2NAME(GB18030, 54936), + [PG_JOHAB] = DEF_ENC2NAME(JOHAB, 0), + [PG_SHIFT_JIS_2004] = DEF_ENC2NAME(SHIFT_JIS_2004, 932), }; /* ---------- @@ -358,50 +357,50 @@ const pg_enc2name pg_enc2name_tbl[] = * This covers all encodings except MULE_INTERNAL, which is alien to gettext. * ---------- */ -const pg_enc2gettext pg_enc2gettext_tbl[] = +const char *pg_enc2gettext_tbl[] = { - {PG_SQL_ASCII, "US-ASCII"}, - {PG_UTF8, "UTF-8"}, - {PG_LATIN1, "LATIN1"}, - {PG_LATIN2, "LATIN2"}, - {PG_LATIN3, "LATIN3"}, - {PG_LATIN4, "LATIN4"}, - {PG_ISO_8859_5, "ISO-8859-5"}, - {PG_ISO_8859_6, "ISO_8859-6"}, - {PG_ISO_8859_7, "ISO-8859-7"}, - {PG_ISO_8859_8, "ISO-8859-8"}, - {PG_LATIN5, "LATIN5"}, - {PG_LATIN6, "LATIN6"}, - {PG_LATIN7, "LATIN7"}, - {PG_LATIN8, "LATIN8"}, - {PG_LATIN9, "LATIN-9"}, - {PG_LATIN10, "LATIN10"}, - {PG_KOI8R, "KOI8-R"}, - {PG_KOI8U, "KOI8-U"}, - {PG_WIN1250, "CP1250"}, - {PG_WIN1251, "CP1251"}, - {PG_WIN1252, "CP1252"}, - {PG_WIN1253, "CP1253"}, - {PG_WIN1254, "CP1254"}, - {PG_WIN1255, "CP1255"}, - {PG_WIN1256, "CP1256"}, - {PG_WIN1257, "CP1257"}, - {PG_WIN1258, "CP1258"}, - {PG_WIN866, "CP866"}, - {PG_WIN874, "CP874"}, - {PG_EUC_CN, "EUC-CN"}, - {PG_EUC_JP, "EUC-JP"}, - {PG_EUC_KR, "EUC-KR"}, - {PG_EUC_TW, "EUC-TW"}, - {PG_EUC_JIS_2004, "EUC-JP"}, - {PG_SJIS, "SHIFT-JIS"}, - {PG_BIG5, "BIG5"}, - {PG_GBK, "GBK"}, - {PG_UHC, "UHC"}, - {PG_GB18030, "GB18030"}, - {PG_JOHAB, "JOHAB"}, - {PG_SHIFT_JIS_2004, "SHIFT_JISX0213"}, - {0, NULL} + [PG_SQL_ASCII] = "US-ASCII", + [PG_UTF8] = "UTF-8", + [PG_MULE_INTERNAL] = NULL, + [PG_LATIN1] = "LATIN1", + [PG_LATIN2] = "LATIN2", + [PG_LATIN3] = "LATIN3", + [PG_LATIN4] = "LATIN4", + [PG_ISO_8859_5] = "ISO-8859-5", + [PG_ISO_8859_6] = "ISO_8859-6", + [PG_ISO_8859_7] = "ISO-8859-7", + [PG_ISO_8859_8] = "ISO-8859-8", + [PG_LATIN5] = "LATIN5", + [PG_LATIN6] = "LATIN6", + [PG_LATIN7] = "LATIN7", + [PG_LATIN8] = "LATIN8", + [PG_LATIN9] = "LATIN-9", + [PG_LATIN10] = "LATIN10", + [PG_KOI8R] = "KOI8-R", + [PG_KOI8U] = "KOI8-U", + [PG_WIN1250] = "CP1250", + [PG_WIN1251] = "CP1251", + [PG_WIN1252] = "CP1252", + [PG_WIN1253] = "CP1253", + [PG_WIN1254] = "CP1254", + [PG_WIN1255] = "CP1255", + [PG_WIN1256] = "CP1256", + [PG_WIN1257] = "CP1257", + [PG_WIN1258] = "CP1258", + [PG_WIN866] = "CP866", + [PG_WIN874] = "CP874", + [PG_EUC_CN] = "EUC-CN", + [PG_EUC_JP] = "EUC-JP", + [PG_EUC_KR] = "EUC-KR", + [PG_EUC_TW] = "EUC-TW", + [PG_EUC_JIS_2004] = "EUC-JP", + [PG_SJIS] = "SHIFT-JIS", + [PG_BIG5] = "BIG5", + [PG_GBK] = "GBK", + [PG_UHC] = "UHC", + [PG_GB18030] = "GB18030", + [PG_JOHAB] = "JOHAB", + [PG_SHIFT_JIS_2004] = "SHIFT_JISX0213", }; @@ -414,41 +413,41 @@ const pg_enc2gettext pg_enc2gettext_tbl[] = */ static const char *const pg_enc2icu_tbl[] = { - NULL, /* PG_SQL_ASCII */ - "EUC-JP", /* PG_EUC_JP */ - "EUC-CN", /* PG_EUC_CN */ - "EUC-KR", /* PG_EUC_KR */ - "EUC-TW", /* PG_EUC_TW */ - NULL, /* PG_EUC_JIS_2004 */ - "UTF-8", /* PG_UTF8 */ - NULL, /* PG_MULE_INTERNAL */ - "ISO-8859-1", /* PG_LATIN1 */ - "ISO-8859-2", /* PG_LATIN2 */ - "ISO-8859-3", /* PG_LATIN3 */ - "ISO-8859-4", /* PG_LATIN4 */ - "ISO-8859-9", /* PG_LATIN5 */ - "ISO-8859-10", /* PG_LATIN6 */ - "ISO-8859-13", /* PG_LATIN7 */ - "ISO-8859-14", /* PG_LATIN8 */ - "ISO-8859-15", /* PG_LATIN9 */ - NULL, /* PG_LATIN10 */ - "CP1256", /* PG_WIN1256 */ - "CP1258", /* PG_WIN1258 */ - "CP866", /* PG_WIN866 */ - NULL, /* PG_WIN874 */ - "KOI8-R", /* PG_KOI8R */ - "CP1251", /* PG_WIN1251 */ - "CP1252", /* PG_WIN1252 */ - "ISO-8859-5", /* PG_ISO_8859_5 */ - "ISO-8859-6", /* PG_ISO_8859_6 */ - "ISO-8859-7", /* PG_ISO_8859_7 */ - "ISO-8859-8", /* PG_ISO_8859_8 */ - "CP1250", /* PG_WIN1250 */ - "CP1253", /* PG_WIN1253 */ - "CP1254", /* PG_WIN1254 */ - "CP1255", /* PG_WIN1255 */ - "CP1257", /* PG_WIN1257 */ - "KOI8-U", /* PG_KOI8U */ + [PG_SQL_ASCII] = NULL, + [PG_EUC_JP] = "EUC-JP", + [PG_EUC_CN] = "EUC-CN", + [PG_EUC_KR] = "EUC-KR", + [PG_EUC_TW] = "EUC-TW", + [PG_EUC_JIS_2004] = NULL, + [PG_UTF8] = "UTF-8", + [PG_MULE_INTERNAL] = NULL, + [PG_LATIN1] = "ISO-8859-1", + [PG_LATIN2] = "ISO-8859-2", + [PG_LATIN3] = "ISO-8859-3", + [PG_LATIN4] = "ISO-8859-4", + [PG_LATIN5] = "ISO-8859-9", + [PG_LATIN6] = "ISO-8859-10", + [PG_LATIN7] = "ISO-8859-13", + [PG_LATIN8] = "ISO-8859-14", + [PG_LATIN9] = "ISO-8859-15", + [PG_LATIN10] = NULL, + [PG_WIN1256] = "CP1256", + [PG_WIN1258] = "CP1258", + [PG_WIN866] = "CP866", + [PG_WIN874] = NULL, + [PG_KOI8R] = "KOI8-R", + [PG_WIN1251] = "CP1251", + [PG_WIN1252] = "CP1252", + [PG_ISO_8859_5] = "ISO-8859-5", + [PG_ISO_8859_6] = "ISO-8859-6", + [PG_ISO_8859_7] = "ISO-8859-7", + [PG_ISO_8859_8] = "ISO-8859-8", + [PG_WIN1250] = "CP1250", + [PG_WIN1253] = "CP1253", + [PG_WIN1254] = "CP1254", + [PG_WIN1255] = "CP1255", + [PG_WIN1257] = "CP1257", + [PG_KOI8U] = "KOI8-U", }; StaticAssertDecl(lengthof(pg_enc2icu_tbl) == PG_ENCODING_BE_LAST + 1, diff --git a/src/common/exec.c b/src/common/exec.c index f209b934df781..0bee19c1e539f 100644 --- a/src/common/exec.c +++ b/src/common/exec.c @@ -4,7 +4,7 @@ * Functions for finding and validating executable files * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -42,6 +42,8 @@ #endif #endif +#include "common/string.h" + /* Inhibit mingw CRT's auto-globbing of command line arguments */ #if defined(WIN32) && !defined(_MSC_VER) extern int _CRT_glob = 0; /* 0 turns off globbing; 1 turns it on */ @@ -328,7 +330,7 @@ find_other_exec(const char *argv0, const char *target, const char *versionstr, char *retpath) { char cmd[MAXPGPATH]; - char line[MAXPGPATH]; + char *line; if (find_my_exec(argv0, retpath) < 0) return -1; @@ -346,46 +348,56 @@ find_other_exec(const char *argv0, const char *target, snprintf(cmd, sizeof(cmd), "\"%s\" -V", retpath); - if (!pipe_read_line(cmd, line, sizeof(line))) + if ((line = pipe_read_line(cmd)) == NULL) return -1; if (strcmp(line, versionstr) != 0) + { + pfree(line); return -2; + } + pfree(line); return 0; } /* - * Execute a command in a pipe and read the first line from it. + * Execute a command in a pipe and read the first line from it. The returned + * string is palloc'd (malloc'd in frontend code), the caller is responsible + * for freeing. */ char * -pipe_read_line(char *cmd, char *line, int maxsize) +pipe_read_line(char *cmd) { - FILE *pgver; + FILE *pipe_cmd; + char *line; fflush(NULL); errno = 0; - if ((pgver = popen(cmd, "r")) == NULL) + if ((pipe_cmd = popen(cmd, "r")) == NULL) { - perror("popen failure"); + log_error(errcode(ERRCODE_SYSTEM_ERROR), + _("could not execute command \"%s\": %m"), cmd); return NULL; } + /* Make sure popen() didn't change errno */ errno = 0; - if (fgets(line, maxsize, pgver) == NULL) + line = pg_get_line(pipe_cmd, NULL); + + if (line == NULL) { - if (feof(pgver)) - fprintf(stderr, "no data was returned by command \"%s\"\n", cmd); + if (ferror(pipe_cmd)) + log_error(errcode_for_file_access(), + _("could not read from command \"%s\": %m"), cmd); else - perror("fgets failure"); - pclose(pgver); /* no error checking */ - return NULL; + log_error(errcode(ERRCODE_NO_DATA), + _("no data was returned by command \"%s\""), cmd); } - if (pclose_check(pgver)) - return NULL; + (void) pclose_check(pipe_cmd); return line; } diff --git a/src/common/f2s.c b/src/common/f2s.c index ba08dcb6aa5f1..59e89f36f02ae 100644 --- a/src/common/f2s.c +++ b/src/common/f2s.c @@ -2,7 +2,7 @@ * * Ryu floating-point output for single precision. * - * Portions Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/f2s.c diff --git a/src/common/fe_memutils.c b/src/common/fe_memutils.c index 3bad81eafc581..f17a9a5d9f6a3 100644 --- a/src/common/fe_memutils.c +++ b/src/common/fe_memutils.c @@ -3,7 +3,7 @@ * fe_memutils.c * memory management support for frontend code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/common/file_perm.c b/src/common/file_perm.c index 60f88d2caf130..35ce341880cf5 100644 --- a/src/common/file_perm.c +++ b/src/common/file_perm.c @@ -3,7 +3,7 @@ * File and directory permission routines * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/common/file_perm.c @@ -59,12 +59,12 @@ SetDataDirectoryCreatePerm(int dataDirMode) * false is returned. * * Suppress when on Windows, because there may not be proper support for Unix-y - * file permissions. + * file permissions. But we still run stat() on the directory so that callers + * get consistent behavior for example if the directory does not exist. */ bool GetDataDirectoryCreatePerm(const char *dataDir) { -#if !defined(WIN32) && !defined(__CYGWIN__) struct stat statBuf; /* @@ -75,16 +75,12 @@ GetDataDirectoryCreatePerm(const char *dataDir) if (stat(dataDir, &statBuf) == -1) return false; +#if !defined(WIN32) && !defined(__CYGWIN__) /* Set permissions */ SetDataDirectoryCreatePerm(statBuf.st_mode); - return true; -#else /* !defined(WIN32) && !defined(__CYGWIN__) */ - /* - * On Windows, we don't have anything to do here since they don't have - * Unix-y permissions. - */ - return true; #endif + + return true; } diff --git a/src/common/file_utils.c b/src/common/file_utils.c index 74833c4acbbcd..6bac537a1e55c 100644 --- a/src/common/file_utils.c +++ b/src/common/file_utils.c @@ -5,7 +5,7 @@ * Assorted utility functions to work on files. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/common/file_utils.c @@ -51,19 +51,52 @@ static void walkdir(const char *path, int (*action) (const char *fname, bool isdir), bool process_symlinks); +#ifdef HAVE_SYNCFS + +/* + * do_syncfs -- Try to syncfs a file system + * + * Reports errors trying to open the path. syncfs() errors are fatal. + */ +static void +do_syncfs(const char *path) +{ + int fd; + + fd = open(path, O_RDONLY, 0); + + if (fd < 0) + { + pg_log_error("could not open file \"%s\": %m", path); + return; + } + + if (syncfs(fd) < 0) + { + pg_log_error("could not synchronize file system for file \"%s\": %m", path); + (void) close(fd); + exit(EXIT_FAILURE); + } + + (void) close(fd); +} + +#endif /* HAVE_SYNCFS */ + /* - * Issue fsync recursively on PGDATA and all its contents. + * Synchronize PGDATA and all its contents. * - * We fsync regular files and directories wherever they are, but we follow + * We sync regular files and directories wherever they are, but we follow * symlinks only for pg_wal (or pg_xlog) and immediately under pg_tblspc. * Other symlinks are presumed to point at files we're not responsible for - * fsyncing, and might not have privileges to write at all. + * syncing, and might not have privileges to write at all. * - * serverVersion indicates the version of the server to be fsync'd. + * serverVersion indicates the version of the server to be sync'd. */ void -fsync_pgdata(const char *pg_data, - int serverVersion) +sync_pgdata(const char *pg_data, + int serverVersion, + DataDirSyncMethod sync_method) { bool xlog_is_symlink; char pg_wal[MAXPGPATH]; @@ -89,49 +122,135 @@ fsync_pgdata(const char *pg_data, xlog_is_symlink = true; } - /* - * If possible, hint to the kernel that we're soon going to fsync the data - * directory and its contents. - */ + switch (sync_method) + { + case DATA_DIR_SYNC_METHOD_SYNCFS: + { +#ifndef HAVE_SYNCFS + pg_log_error("this build does not support sync method \"%s\"", + "syncfs"); + exit(EXIT_FAILURE); +#else + DIR *dir; + struct dirent *de; + + /* + * On Linux, we don't have to open every single file one by + * one. We can use syncfs() to sync whole filesystems. We + * only expect filesystem boundaries to exist where we + * tolerate symlinks, namely pg_wal and the tablespaces, so we + * call syncfs() for each of those directories. + */ + + /* Sync the top level pgdata directory. */ + do_syncfs(pg_data); + + /* If any tablespaces are configured, sync each of those. */ + dir = opendir(pg_tblspc); + if (dir == NULL) + pg_log_error("could not open directory \"%s\": %m", + pg_tblspc); + else + { + while (errno = 0, (de = readdir(dir)) != NULL) + { + char subpath[MAXPGPATH * 2]; + + if (strcmp(de->d_name, ".") == 0 || + strcmp(de->d_name, "..") == 0) + continue; + + snprintf(subpath, sizeof(subpath), "%s/%s", + pg_tblspc, de->d_name); + do_syncfs(subpath); + } + + if (errno) + pg_log_error("could not read directory \"%s\": %m", + pg_tblspc); + + (void) closedir(dir); + } + + /* If pg_wal is a symlink, process that too. */ + if (xlog_is_symlink) + do_syncfs(pg_wal); +#endif /* HAVE_SYNCFS */ + } + break; + + case DATA_DIR_SYNC_METHOD_FSYNC: + { + /* + * If possible, hint to the kernel that we're soon going to + * fsync the data directory and its contents. + */ #ifdef PG_FLUSH_DATA_WORKS - walkdir(pg_data, pre_sync_fname, false); - if (xlog_is_symlink) - walkdir(pg_wal, pre_sync_fname, false); - walkdir(pg_tblspc, pre_sync_fname, true); + walkdir(pg_data, pre_sync_fname, false); + if (xlog_is_symlink) + walkdir(pg_wal, pre_sync_fname, false); + walkdir(pg_tblspc, pre_sync_fname, true); #endif - /* - * Now we do the fsync()s in the same order. - * - * The main call ignores symlinks, so in addition to specially processing - * pg_wal if it's a symlink, pg_tblspc has to be visited separately with - * process_symlinks = true. Note that if there are any plain directories - * in pg_tblspc, they'll get fsync'd twice. That's not an expected case - * so we don't worry about optimizing it. - */ - walkdir(pg_data, fsync_fname, false); - if (xlog_is_symlink) - walkdir(pg_wal, fsync_fname, false); - walkdir(pg_tblspc, fsync_fname, true); + /* + * Now we do the fsync()s in the same order. + * + * The main call ignores symlinks, so in addition to specially + * processing pg_wal if it's a symlink, pg_tblspc has to be + * visited separately with process_symlinks = true. Note that + * if there are any plain directories in pg_tblspc, they'll + * get fsync'd twice. That's not an expected case so we don't + * worry about optimizing it. + */ + walkdir(pg_data, fsync_fname, false); + if (xlog_is_symlink) + walkdir(pg_wal, fsync_fname, false); + walkdir(pg_tblspc, fsync_fname, true); + } + break; + } } /* - * Issue fsync recursively on the given directory and all its contents. + * Synchronize the given directory and all its contents. * - * This is a convenient wrapper on top of walkdir(). + * This is a convenient wrapper on top of walkdir() and do_syncfs(). */ void -fsync_dir_recurse(const char *dir) +sync_dir_recurse(const char *dir, DataDirSyncMethod sync_method) { - /* - * If possible, hint to the kernel that we're soon going to fsync the data - * directory and its contents. - */ + switch (sync_method) + { + case DATA_DIR_SYNC_METHOD_SYNCFS: + { +#ifndef HAVE_SYNCFS + pg_log_error("this build does not support sync method \"%s\"", + "syncfs"); + exit(EXIT_FAILURE); +#else + /* + * On Linux, we don't have to open every single file one by + * one. We can use syncfs() to sync the whole filesystem. + */ + do_syncfs(dir); +#endif /* HAVE_SYNCFS */ + } + break; + + case DATA_DIR_SYNC_METHOD_FSYNC: + { + /* + * If possible, hint to the kernel that we're soon going to + * fsync the data directory and its contents. + */ #ifdef PG_FLUSH_DATA_WORKS - walkdir(dir, pre_sync_fname, false); + walkdir(dir, pre_sync_fname, false); #endif - walkdir(dir, fsync_fname, false); + walkdir(dir, fsync_fname, false); + } + break; + } } /* @@ -462,6 +581,52 @@ get_dirent_type(const char *path, return result; } +/* + * Compute what remains to be done after a possibly partial vectored read or + * write. The part of 'source' beginning after 'transferred' bytes is copied + * to 'destination', and its length is returned. 'source' and 'destination' + * may point to the same array, for in-place adjustment. A return value of + * zero indicates completion (for callers without a cheaper way to know that). + */ +int +compute_remaining_iovec(struct iovec *destination, + const struct iovec *source, + int iovcnt, + size_t transferred) +{ + Assert(iovcnt > 0); + + /* Skip wholly transferred iovecs. */ + while (source->iov_len <= transferred) + { + transferred -= source->iov_len; + source++; + iovcnt--; + + /* All iovecs transferred? */ + if (iovcnt == 0) + { + /* + * We don't expect the kernel to transfer more than we asked it + * to, or something is out of sync. + */ + Assert(transferred == 0); + return 0; + } + } + + /* Copy the remaining iovecs to the front of the array. */ + if (source != destination) + memmove(destination, source, sizeof(*source) * iovcnt); + + /* Adjust leading iovec, which may have been partially transferred. */ + Assert(destination->iov_len > transferred); + destination->iov_base = (char *) destination->iov_base + transferred; + destination->iov_len -= transferred; + + return iovcnt; +} + /* * pg_pwritev_with_retry * @@ -482,7 +647,7 @@ pg_pwritev_with_retry(int fd, const struct iovec *iov, int iovcnt, off_t offset) return -1; } - for (;;) + do { /* Write as much as we can. */ part = pg_pwritev(fd, iov, iovcnt, offset); @@ -497,33 +662,14 @@ pg_pwritev_with_retry(int fd, const struct iovec *iov, int iovcnt, off_t offset) sum += part; offset += part; - /* Step over iovecs that are done. */ - while (iovcnt > 0 && iov->iov_len <= part) - { - part -= iov->iov_len; - ++iov; - --iovcnt; - } - - /* Are they all done? */ - if (iovcnt == 0) - { - /* We don't expect the kernel to write more than requested. */ - Assert(part == 0); - break; - } - /* - * Move whatever's left to the front of our mutable copy and adjust - * the leading iovec. + * See what is left. On the first loop we used the caller's array, + * but in later loops we'll use our local copy that we are allowed to + * mutate. */ - Assert(iovcnt > 0); - memmove(iov_copy, iov, sizeof(*iov) * iovcnt); - Assert(iov->iov_len > part); - iov_copy[0].iov_base = (char *) iov_copy[0].iov_base + part; - iov_copy[0].iov_len -= part; + iovcnt = compute_remaining_iovec(iov_copy, iov, iovcnt, part); iov = iov_copy; - } + } while (iovcnt > 0); return sum; } diff --git a/src/common/hashfn.c b/src/common/hashfn.c index 2490607eea574..4db468cf85b7b 100644 --- a/src/common/hashfn.c +++ b/src/common/hashfn.c @@ -5,7 +5,7 @@ * hashtables * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/common/hmac.c b/src/common/hmac.c index f0b239dcf09e0..508b2fcd9326d 100644 --- a/src/common/hmac.c +++ b/src/common/hmac.c @@ -5,7 +5,7 @@ * * Fallback implementation of HMAC, as specified in RFC 2104. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -43,7 +43,7 @@ typedef enum pg_hmac_errno { PG_HMAC_ERROR_NONE = 0, PG_HMAC_ERROR_OOM, - PG_HMAC_ERROR_INTERNAL + PG_HMAC_ERROR_INTERNAL, } pg_hmac_errno; /* Internal pg_hmac_ctx structure */ diff --git a/src/common/hmac_openssl.c b/src/common/hmac_openssl.c index 12be542fa27ec..84fcf340d8e57 100644 --- a/src/common/hmac_openssl.c +++ b/src/common/hmac_openssl.c @@ -5,7 +5,7 @@ * * This should only be used if code is compiled with OpenSSL support. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -31,7 +31,6 @@ #ifndef FRONTEND #include "utils/memutils.h" #include "utils/resowner.h" -#include "utils/resowner_private.h" #endif /* @@ -42,6 +41,7 @@ */ #ifndef FRONTEND #ifdef HAVE_HMAC_CTX_NEW +#define USE_RESOWNER_FOR_HMAC #define ALLOC(size) MemoryContextAlloc(TopMemoryContext, size) #else #define ALLOC(size) palloc(size) @@ -57,7 +57,7 @@ typedef enum pg_hmac_errno { PG_HMAC_ERROR_NONE = 0, PG_HMAC_ERROR_DEST_LEN, - PG_HMAC_ERROR_OPENSSL + PG_HMAC_ERROR_OPENSSL, } pg_hmac_errno; /* Internal pg_hmac_ctx structure */ @@ -68,11 +68,37 @@ struct pg_hmac_ctx pg_hmac_errno error; const char *errreason; -#ifndef FRONTEND +#ifdef USE_RESOWNER_FOR_HMAC ResourceOwner resowner; #endif }; +/* ResourceOwner callbacks to hold HMAC contexts */ +#ifdef USE_RESOWNER_FOR_HMAC +static void ResOwnerReleaseHMAC(Datum res); + +static const ResourceOwnerDesc hmac_resowner_desc = +{ + .name = "OpenSSL HMAC context", + .release_phase = RESOURCE_RELEASE_BEFORE_LOCKS, + .release_priority = RELEASE_PRIO_HMAC_CONTEXTS, + .ReleaseResource = ResOwnerReleaseHMAC, + .DebugPrint = NULL /* the default message is fine */ +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberHMAC(ResourceOwner owner, pg_hmac_ctx *ctx) +{ + ResourceOwnerRemember(owner, PointerGetDatum(ctx), &hmac_resowner_desc); +} +static inline void +ResourceOwnerForgetHMAC(ResourceOwner owner, pg_hmac_ctx *ctx) +{ + ResourceOwnerForget(owner, PointerGetDatum(ctx), &hmac_resowner_desc); +} +#endif + static const char * SSLerrmessage(unsigned long ecode) { @@ -113,10 +139,12 @@ pg_hmac_create(pg_cryptohash_type type) * previous runs. */ ERR_clear_error(); -#ifdef HAVE_HMAC_CTX_NEW -#ifndef FRONTEND - ResourceOwnerEnlargeHMAC(CurrentResourceOwner); + +#ifdef USE_RESOWNER_FOR_HMAC + ResourceOwnerEnlarge(CurrentResourceOwner); #endif + +#ifdef HAVE_HMAC_CTX_NEW ctx->hmacctx = HMAC_CTX_new(); #else ctx->hmacctx = ALLOC(sizeof(HMAC_CTX)); @@ -134,14 +162,14 @@ pg_hmac_create(pg_cryptohash_type type) return NULL; } -#ifdef HAVE_HMAC_CTX_NEW -#ifndef FRONTEND +#ifndef HAVE_HMAC_CTX_NEW + memset(ctx->hmacctx, 0, sizeof(HMAC_CTX)); +#endif + +#ifdef USE_RESOWNER_FOR_HMAC ctx->resowner = CurrentResourceOwner; - ResourceOwnerRememberHMAC(CurrentResourceOwner, PointerGetDatum(ctx)); + ResourceOwnerRememberHMAC(CurrentResourceOwner, ctx); #endif -#else - memset(ctx->hmacctx, 0, sizeof(HMAC_CTX)); -#endif /* HAVE_HMAC_CTX_NEW */ return ctx; } @@ -302,14 +330,16 @@ pg_hmac_free(pg_hmac_ctx *ctx) #ifdef HAVE_HMAC_CTX_FREE HMAC_CTX_free(ctx->hmacctx); -#ifndef FRONTEND - ResourceOwnerForgetHMAC(ctx->resowner, PointerGetDatum(ctx)); -#endif #else explicit_bzero(ctx->hmacctx, sizeof(HMAC_CTX)); FREE(ctx->hmacctx); #endif +#ifdef USE_RESOWNER_FOR_HMAC + if (ctx->resowner) + ResourceOwnerForgetHMAC(ctx->resowner, ctx); +#endif + explicit_bzero(ctx, sizeof(pg_hmac_ctx)); FREE(ctx); } @@ -346,3 +376,16 @@ pg_hmac_error(pg_hmac_ctx *ctx) Assert(false); /* cannot be reached */ return _("success"); } + +/* ResourceOwner callbacks */ + +#ifdef USE_RESOWNER_FOR_HMAC +static void +ResOwnerReleaseHMAC(Datum res) +{ + pg_hmac_ctx *ctx = (pg_hmac_ctx *) DatumGetPointer(res); + + ctx->resowner = NULL; + pg_hmac_free(ctx); +} +#endif diff --git a/src/common/ip.c b/src/common/ip.c index 9baad3a337025..b5ba02347aa71 100644 --- a/src/common/ip.c +++ b/src/common/ip.c @@ -3,7 +3,7 @@ * ip.c * IPv6-aware network access. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/common/jsonapi.c b/src/common/jsonapi.c index 2e86589cfd8df..cd34986d1a41d 100644 --- a/src/common/jsonapi.c +++ b/src/common/jsonapi.c @@ -3,7 +3,7 @@ * jsonapi.c * JSON parser and lexer interfaces * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -40,12 +40,179 @@ typedef enum /* contexts of JSON parser */ JSON_PARSE_OBJECT_LABEL, /* saw object label, expecting ':' */ JSON_PARSE_OBJECT_NEXT, /* saw object value, expecting ',' or '}' */ JSON_PARSE_OBJECT_COMMA, /* saw object ',', expecting next label */ - JSON_PARSE_END /* saw the end of a document, expect nothing */ + JSON_PARSE_END, /* saw the end of a document, expect nothing */ } JsonParseContext; +/* + * Setup for table-driven parser. + * These enums need to be separate from the JsonTokenType and from each other + * so we can have all of them on the prediction stack, which consists of + * tokens, non-terminals, and semantic action markers. + */ + +enum JsonNonTerminal +{ + JSON_NT_JSON = 32, + JSON_NT_ARRAY_ELEMENTS, + JSON_NT_MORE_ARRAY_ELEMENTS, + JSON_NT_KEY_PAIRS, + JSON_NT_MORE_KEY_PAIRS, +}; + +enum JsonParserSem +{ + JSON_SEM_OSTART = 64, + JSON_SEM_OEND, + JSON_SEM_ASTART, + JSON_SEM_AEND, + JSON_SEM_OFIELD_INIT, + JSON_SEM_OFIELD_START, + JSON_SEM_OFIELD_END, + JSON_SEM_AELEM_START, + JSON_SEM_AELEM_END, + JSON_SEM_SCALAR_INIT, + JSON_SEM_SCALAR_CALL, +}; + +/* + * struct containing the 3 stacks used in non-recursive parsing, + * and the token and value for scalars that need to be preserved + * across calls. + * + * typedef appears in jsonapi.h + */ +struct JsonParserStack +{ + int stack_size; + char *prediction; + size_t pred_index; + /* these two are indexed by lex_level */ + char **fnames; + bool *fnull; + JsonTokenType scalar_tok; + char *scalar_val; +}; + +/* + * struct containing state used when there is a possible partial token at the + * end of a json chunk when we are doing incremental parsing. + * + * typedef appears in jsonapi.h + */ +struct JsonIncrementalState +{ + bool is_last_chunk; + bool partial_completed; + StringInfoData partial_token; +}; + +/* + * constants and macros used in the nonrecursive parser + */ +#define JSON_NUM_TERMINALS 13 +#define JSON_NUM_NONTERMINALS 5 +#define JSON_NT_OFFSET JSON_NT_JSON +/* for indexing the table */ +#define OFS(NT) (NT) - JSON_NT_OFFSET +/* classify items we get off the stack */ +#define IS_SEM(x) ((x) & 0x40) +#define IS_NT(x) ((x) & 0x20) + +/* + * These productions are stored in reverse order right to left so that when + * they are pushed on the stack what we expect next is at the top of the stack. + */ +static char JSON_PROD_EPSILON[] = {0}; /* epsilon - an empty production */ + +/* JSON -> string */ +static char JSON_PROD_SCALAR_STRING[] = {JSON_SEM_SCALAR_CALL, JSON_TOKEN_STRING, JSON_SEM_SCALAR_INIT, 0}; + +/* JSON -> number */ +static char JSON_PROD_SCALAR_NUMBER[] = {JSON_SEM_SCALAR_CALL, JSON_TOKEN_NUMBER, JSON_SEM_SCALAR_INIT, 0}; + +/* JSON -> 'true' */ +static char JSON_PROD_SCALAR_TRUE[] = {JSON_SEM_SCALAR_CALL, JSON_TOKEN_TRUE, JSON_SEM_SCALAR_INIT, 0}; + +/* JSON -> 'false' */ +static char JSON_PROD_SCALAR_FALSE[] = {JSON_SEM_SCALAR_CALL, JSON_TOKEN_FALSE, JSON_SEM_SCALAR_INIT, 0}; + +/* JSON -> 'null' */ +static char JSON_PROD_SCALAR_NULL[] = {JSON_SEM_SCALAR_CALL, JSON_TOKEN_NULL, JSON_SEM_SCALAR_INIT, 0}; + +/* JSON -> '{' KEY_PAIRS '}' */ +static char JSON_PROD_OBJECT[] = {JSON_SEM_OEND, JSON_TOKEN_OBJECT_END, JSON_NT_KEY_PAIRS, JSON_TOKEN_OBJECT_START, JSON_SEM_OSTART, 0}; + +/* JSON -> '[' ARRAY_ELEMENTS ']' */ +static char JSON_PROD_ARRAY[] = {JSON_SEM_AEND, JSON_TOKEN_ARRAY_END, JSON_NT_ARRAY_ELEMENTS, JSON_TOKEN_ARRAY_START, JSON_SEM_ASTART, 0}; + +/* ARRAY_ELEMENTS -> JSON MORE_ARRAY_ELEMENTS */ +static char JSON_PROD_ARRAY_ELEMENTS[] = {JSON_NT_MORE_ARRAY_ELEMENTS, JSON_SEM_AELEM_END, JSON_NT_JSON, JSON_SEM_AELEM_START, 0}; + +/* MORE_ARRAY_ELEMENTS -> ',' JSON MORE_ARRAY_ELEMENTS */ +static char JSON_PROD_MORE_ARRAY_ELEMENTS[] = {JSON_NT_MORE_ARRAY_ELEMENTS, JSON_SEM_AELEM_END, JSON_NT_JSON, JSON_SEM_AELEM_START, JSON_TOKEN_COMMA, 0}; + +/* KEY_PAIRS -> string ':' JSON MORE_KEY_PAIRS */ +static char JSON_PROD_KEY_PAIRS[] = {JSON_NT_MORE_KEY_PAIRS, JSON_SEM_OFIELD_END, JSON_NT_JSON, JSON_SEM_OFIELD_START, JSON_TOKEN_COLON, JSON_TOKEN_STRING, JSON_SEM_OFIELD_INIT, 0}; + +/* MORE_KEY_PAIRS -> ',' string ':' JSON MORE_KEY_PAIRS */ +static char JSON_PROD_MORE_KEY_PAIRS[] = {JSON_NT_MORE_KEY_PAIRS, JSON_SEM_OFIELD_END, JSON_NT_JSON, JSON_SEM_OFIELD_START, JSON_TOKEN_COLON, JSON_TOKEN_STRING, JSON_SEM_OFIELD_INIT, JSON_TOKEN_COMMA, 0}; + +/* + * Note: there are also epsilon productions for ARRAY_ELEMENTS, + * MORE_ARRAY_ELEMENTS, KEY_PAIRS and MORE_KEY_PAIRS + * They are all the same as none require any semantic actions. + */ + +/* + * Table connecting the productions with their director sets of + * terminal symbols. + * Any combination not specified here represents an error. + */ + +typedef struct +{ + size_t len; + char *prod; +} td_entry; + +#define TD_ENTRY(PROD) { sizeof(PROD) - 1, (PROD) } + +static td_entry td_parser_table[JSON_NUM_NONTERMINALS][JSON_NUM_TERMINALS] = +{ + /* JSON */ + [OFS(JSON_NT_JSON)][JSON_TOKEN_STRING] = TD_ENTRY(JSON_PROD_SCALAR_STRING), + [OFS(JSON_NT_JSON)][JSON_TOKEN_NUMBER] = TD_ENTRY(JSON_PROD_SCALAR_NUMBER), + [OFS(JSON_NT_JSON)][JSON_TOKEN_TRUE] = TD_ENTRY(JSON_PROD_SCALAR_TRUE), + [OFS(JSON_NT_JSON)][JSON_TOKEN_FALSE] = TD_ENTRY(JSON_PROD_SCALAR_FALSE), + [OFS(JSON_NT_JSON)][JSON_TOKEN_NULL] = TD_ENTRY(JSON_PROD_SCALAR_NULL), + [OFS(JSON_NT_JSON)][JSON_TOKEN_ARRAY_START] = TD_ENTRY(JSON_PROD_ARRAY), + [OFS(JSON_NT_JSON)][JSON_TOKEN_OBJECT_START] = TD_ENTRY(JSON_PROD_OBJECT), + /* ARRAY_ELEMENTS */ + [OFS(JSON_NT_ARRAY_ELEMENTS)][JSON_TOKEN_ARRAY_START] = TD_ENTRY(JSON_PROD_ARRAY_ELEMENTS), + [OFS(JSON_NT_ARRAY_ELEMENTS)][JSON_TOKEN_OBJECT_START] = TD_ENTRY(JSON_PROD_ARRAY_ELEMENTS), + [OFS(JSON_NT_ARRAY_ELEMENTS)][JSON_TOKEN_STRING] = TD_ENTRY(JSON_PROD_ARRAY_ELEMENTS), + [OFS(JSON_NT_ARRAY_ELEMENTS)][JSON_TOKEN_NUMBER] = TD_ENTRY(JSON_PROD_ARRAY_ELEMENTS), + [OFS(JSON_NT_ARRAY_ELEMENTS)][JSON_TOKEN_TRUE] = TD_ENTRY(JSON_PROD_ARRAY_ELEMENTS), + [OFS(JSON_NT_ARRAY_ELEMENTS)][JSON_TOKEN_FALSE] = TD_ENTRY(JSON_PROD_ARRAY_ELEMENTS), + [OFS(JSON_NT_ARRAY_ELEMENTS)][JSON_TOKEN_NULL] = TD_ENTRY(JSON_PROD_ARRAY_ELEMENTS), + [OFS(JSON_NT_ARRAY_ELEMENTS)][JSON_TOKEN_ARRAY_END] = TD_ENTRY(JSON_PROD_EPSILON), + /* MORE_ARRAY_ELEMENTS */ + [OFS(JSON_NT_MORE_ARRAY_ELEMENTS)][JSON_TOKEN_COMMA] = TD_ENTRY(JSON_PROD_MORE_ARRAY_ELEMENTS), + [OFS(JSON_NT_MORE_ARRAY_ELEMENTS)][JSON_TOKEN_ARRAY_END] = TD_ENTRY(JSON_PROD_EPSILON), + /* KEY_PAIRS */ + [OFS(JSON_NT_KEY_PAIRS)][JSON_TOKEN_STRING] = TD_ENTRY(JSON_PROD_KEY_PAIRS), + [OFS(JSON_NT_KEY_PAIRS)][JSON_TOKEN_OBJECT_END] = TD_ENTRY(JSON_PROD_EPSILON), + /* MORE_KEY_PAIRS */ + [OFS(JSON_NT_MORE_KEY_PAIRS)][JSON_TOKEN_COMMA] = TD_ENTRY(JSON_PROD_MORE_KEY_PAIRS), + [OFS(JSON_NT_MORE_KEY_PAIRS)][JSON_TOKEN_OBJECT_END] = TD_ENTRY(JSON_PROD_EPSILON), +}; + +/* the GOAL production. Not stored in the table, but will be the initial contents of the prediction stack */ +static char JSON_PROD_GOAL[] = {JSON_TOKEN_END, JSON_NT_JSON, 0}; + static inline JsonParseErrorType json_lex_string(JsonLexContext *lex); -static inline JsonParseErrorType json_lex_number(JsonLexContext *lex, char *s, - bool *num_err, int *total_len); +static inline JsonParseErrorType json_lex_number(JsonLexContext *lex, const char *s, + bool *num_err, size_t *total_len); static inline JsonParseErrorType parse_scalar(JsonLexContext *lex, JsonSemAction *sem); static JsonParseErrorType parse_object_field(JsonLexContext *lex, JsonSemAction *sem); static JsonParseErrorType parse_object(JsonLexContext *lex, JsonSemAction *sem); @@ -60,7 +227,7 @@ JsonSemAction nullSemAction = NULL, NULL, NULL, NULL, NULL }; -/* Recursive Descent parser support routines */ +/* Parser support routines */ /* * lex_peek @@ -102,15 +269,19 @@ lex_expect(JsonParseContext ctx, JsonLexContext *lex, JsonTokenType token) * str is of length len, and need not be null-terminated. */ bool -IsValidJsonNumber(const char *str, int len) +IsValidJsonNumber(const char *str, size_t len) { bool numeric_error; - int total_len; + size_t total_len; JsonLexContext dummy_lex; if (len <= 0) return false; + dummy_lex.incremental = false; + dummy_lex.inc_state = NULL; + dummy_lex.pstack = NULL; + /* * json_lex_number expects a leading '-' to have been eaten already. * @@ -119,15 +290,17 @@ IsValidJsonNumber(const char *str, int len) */ if (*str == '-') { - dummy_lex.input = unconstify(char *, str) + 1; + dummy_lex.input = str + 1; dummy_lex.input_length = len - 1; } else { - dummy_lex.input = unconstify(char *, str); + dummy_lex.input = str; dummy_lex.input_length = len; } + dummy_lex.token_start = dummy_lex.input; + json_lex_number(&dummy_lex, dummy_lex.input, &numeric_error, &total_len); return (!numeric_error) && (total_len == dummy_lex.input_length); @@ -135,26 +308,200 @@ IsValidJsonNumber(const char *str, int len) /* * makeJsonLexContextCstringLen + * Initialize the given JsonLexContext object, or create one + * + * If a valid 'lex' pointer is given, it is initialized. This can + * be used for stack-allocated structs, saving overhead. If NULL is + * given, a new struct is allocated. * - * lex constructor, with or without StringInfo object for de-escaped lexemes. + * If need_escapes is true, ->strval stores the unescaped lexemes. + * Unescaping is expensive, so only request it when necessary. * - * Without is better as it makes the processing faster, so only make one - * if really required. + * If need_escapes is true or lex was given as NULL, then caller is + * responsible for freeing the returned struct, either by calling + * freeJsonLexContext() or (in backend environment) via memory context + * cleanup. */ JsonLexContext * -makeJsonLexContextCstringLen(char *json, int len, int encoding, bool need_escapes) +makeJsonLexContextCstringLen(JsonLexContext *lex, const char *json, + size_t len, int encoding, bool need_escapes) { - JsonLexContext *lex = palloc0(sizeof(JsonLexContext)); + if (lex == NULL) + { + lex = palloc0(sizeof(JsonLexContext)); + lex->flags |= JSONLEX_FREE_STRUCT; + } + else + memset(lex, 0, sizeof(JsonLexContext)); + lex->errormsg = NULL; lex->input = lex->token_terminator = lex->line_start = json; lex->line_number = 1; lex->input_length = len; lex->input_encoding = encoding; if (need_escapes) + { lex->strval = makeStringInfo(); + lex->flags |= JSONLEX_FREE_STRVAL; + } + return lex; } + +/* + * makeJsonLexContextIncremental + * + * Similar to above but set up for use in incremental parsing. That means we + * need explicit stacks for predictions, field names and null indicators, but + * we don't need the input, that will be handed in bit by bit to the + * parse routine. We also need an accumulator for partial tokens in case + * the boundary between chunks happens to fall in the middle of a token. + */ +#define JS_STACK_CHUNK_SIZE 64 +#define JS_MAX_PROD_LEN 10 /* more than we need */ +#define JSON_TD_MAX_STACK 6400 /* hard coded for now - this is a REALLY high + * number */ + +JsonLexContext * +makeJsonLexContextIncremental(JsonLexContext *lex, int encoding, + bool need_escapes) +{ + if (lex == NULL) + { + lex = palloc0(sizeof(JsonLexContext)); + lex->flags |= JSONLEX_FREE_STRUCT; + } + else + memset(lex, 0, sizeof(JsonLexContext)); + + lex->line_number = 1; + lex->input_encoding = encoding; + lex->incremental = true; + lex->inc_state = palloc0(sizeof(JsonIncrementalState)); + initStringInfo(&(lex->inc_state->partial_token)); + lex->pstack = palloc(sizeof(JsonParserStack)); + lex->pstack->stack_size = JS_STACK_CHUNK_SIZE; + lex->pstack->prediction = palloc(JS_STACK_CHUNK_SIZE * JS_MAX_PROD_LEN); + lex->pstack->pred_index = 0; + lex->pstack->fnames = palloc(JS_STACK_CHUNK_SIZE * sizeof(char *)); + lex->pstack->fnull = palloc(JS_STACK_CHUNK_SIZE * sizeof(bool)); + if (need_escapes) + { + lex->strval = makeStringInfo(); + lex->flags |= JSONLEX_FREE_STRVAL; + } + return lex; +} + +static inline void +inc_lex_level(JsonLexContext *lex) +{ + lex->lex_level += 1; + + if (lex->incremental && lex->lex_level >= lex->pstack->stack_size) + { + lex->pstack->stack_size += JS_STACK_CHUNK_SIZE; + lex->pstack->prediction = + repalloc(lex->pstack->prediction, + lex->pstack->stack_size * JS_MAX_PROD_LEN); + if (lex->pstack->fnames) + lex->pstack->fnames = + repalloc(lex->pstack->fnames, + lex->pstack->stack_size * sizeof(char *)); + if (lex->pstack->fnull) + lex->pstack->fnull = + repalloc(lex->pstack->fnull, lex->pstack->stack_size * sizeof(bool)); + } +} + +static inline void +dec_lex_level(JsonLexContext *lex) +{ + lex->lex_level -= 1; +} + +static inline void +push_prediction(JsonParserStack *pstack, td_entry entry) +{ + memcpy(pstack->prediction + pstack->pred_index, entry.prod, entry.len); + pstack->pred_index += entry.len; +} + +static inline char +pop_prediction(JsonParserStack *pstack) +{ + Assert(pstack->pred_index > 0); + return pstack->prediction[--pstack->pred_index]; +} + +static inline char +next_prediction(JsonParserStack *pstack) +{ + Assert(pstack->pred_index > 0); + return pstack->prediction[pstack->pred_index - 1]; +} + +static inline bool +have_prediction(JsonParserStack *pstack) +{ + return pstack->pred_index > 0; +} + +static inline void +set_fname(JsonLexContext *lex, char *fname) +{ + lex->pstack->fnames[lex->lex_level] = fname; +} + +static inline char * +get_fname(JsonLexContext *lex) +{ + return lex->pstack->fnames[lex->lex_level]; +} + +static inline void +set_fnull(JsonLexContext *lex, bool fnull) +{ + lex->pstack->fnull[lex->lex_level] = fnull; +} + +static inline bool +get_fnull(JsonLexContext *lex) +{ + return lex->pstack->fnull[lex->lex_level]; +} + +/* + * Free memory in a JsonLexContext. + * + * There's no need for this if a *lex pointer was given when the object was + * made, need_escapes was false, and json_errdetail() was not called; or if (in + * backend environment) a memory context delete/reset is imminent. + */ +void +freeJsonLexContext(JsonLexContext *lex) +{ + if (lex->flags & JSONLEX_FREE_STRVAL) + destroyStringInfo(lex->strval); + + if (lex->errormsg) + destroyStringInfo(lex->errormsg); + + if (lex->incremental) + { + pfree(lex->inc_state->partial_token.data); + pfree(lex->inc_state); + pfree(lex->pstack->prediction); + pfree(lex->pstack->fnames); + pfree(lex->pstack->fnull); + pfree(lex->pstack); + } + + if (lex->flags & JSONLEX_FREE_STRUCT) + pfree(lex); +} + /* * pg_parse_json * @@ -164,13 +511,44 @@ makeJsonLexContextCstringLen(char *json, int len, int encoding, bool need_escape * makeJsonLexContext(). sem is a structure of function pointers to semantic * action routines to be called at appropriate spots during parsing, and a * pointer to a state object to be passed to those routines. + * + * If FORCE_JSON_PSTACK is defined then the routine will call the non-recursive + * JSON parser. This is a useful way to validate that it's doing the right + * thing at least for non-incremental cases. If this is on we expect to see + * regression diffs relating to error messages about stack depth, but no + * other differences. */ JsonParseErrorType pg_parse_json(JsonLexContext *lex, JsonSemAction *sem) { +#ifdef FORCE_JSON_PSTACK + + lex->incremental = true; + lex->inc_state = palloc0(sizeof(JsonIncrementalState)); + + /* + * We don't need partial token processing, there is only one chunk. But we + * still need to init the partial token string so that freeJsonLexContext + * works. + */ + initStringInfo(&(lex->inc_state->partial_token)); + lex->pstack = palloc(sizeof(JsonParserStack)); + lex->pstack->stack_size = JS_STACK_CHUNK_SIZE; + lex->pstack->prediction = palloc(JS_STACK_CHUNK_SIZE * JS_MAX_PROD_LEN); + lex->pstack->pred_index = 0; + lex->pstack->fnames = palloc(JS_STACK_CHUNK_SIZE * sizeof(char *)); + lex->pstack->fnull = palloc(JS_STACK_CHUNK_SIZE * sizeof(bool)); + + return pg_parse_json_incremental(lex, sem, lex->input, lex->input_length, true); + +#else + JsonTokenType tok; JsonParseErrorType result; + if (lex->incremental) + return JSON_INVALID_LEXER_TYPE; + /* get the initial token */ result = json_lex(lex); if (result != JSON_SUCCESS) @@ -195,6 +573,7 @@ pg_parse_json(JsonLexContext *lex, JsonSemAction *sem) result = lex_expect(JSON_PARSE_END, lex, JSON_TOKEN_END); return result; +#endif } /* @@ -250,6 +629,372 @@ json_count_array_elements(JsonLexContext *lex, int *elements) return JSON_SUCCESS; } +/* + * pg_parse_json_incremental + * + * Routine for incremental parsing of json. This uses the non-recursive top + * down method of the Dragon Book Algorithm 4.3. It's somewhat slower than + * the Recursive Descent pattern used above, so we only use it for incremental + * parsing of JSON. + * + * The lexing context needs to be set up by a call to + * makeJsonLexContextIncremental(). sem is a structure of function pointers + * to semantic action routines, which should function exactly as those used + * in the recursive descent parser. + * + * This routine can be called repeatedly with chunks of JSON. On the final + * chunk is_last must be set to true. len is the length of the json chunk, + * which does not need to be null terminated. + */ +JsonParseErrorType +pg_parse_json_incremental(JsonLexContext *lex, + JsonSemAction *sem, + const char *json, + size_t len, + bool is_last) +{ + JsonTokenType tok; + JsonParseErrorType result; + JsonParseContext ctx = JSON_PARSE_VALUE; + JsonParserStack *pstack = lex->pstack; + + + if (!lex->incremental) + return JSON_INVALID_LEXER_TYPE; + + lex->input = lex->token_terminator = lex->line_start = json; + lex->input_length = len; + lex->inc_state->is_last_chunk = is_last; + + /* get the initial token */ + result = json_lex(lex); + if (result != JSON_SUCCESS) + return result; + + tok = lex_peek(lex); + + /* use prediction stack for incremental parsing */ + + if (!have_prediction(pstack)) + { + td_entry goal = TD_ENTRY(JSON_PROD_GOAL); + + push_prediction(pstack, goal); + } + + while (have_prediction(pstack)) + { + char top = pop_prediction(pstack); + td_entry entry; + + /* + * these first two branches are the guts of the Table Driven method + */ + if (top == tok) + { + /* + * tok can only be a terminal symbol, so top must be too. the + * token matches the top of the stack, so get the next token. + */ + if (tok < JSON_TOKEN_END) + { + result = json_lex(lex); + if (result != JSON_SUCCESS) + return result; + tok = lex_peek(lex); + } + } + else if (IS_NT(top) && (entry = td_parser_table[OFS(top)][tok]).prod != NULL) + { + /* + * the token is in the director set for a production of the + * non-terminal at the top of the stack, so push the reversed RHS + * of the production onto the stack. + */ + push_prediction(pstack, entry); + } + else if (IS_SEM(top)) + { + /* + * top is a semantic action marker, so take action accordingly. + * It's important to have these markers in the prediction stack + * before any token they might need so we don't advance the token + * prematurely. Note in a couple of cases we need to do something + * both before and after the token. + */ + switch (top) + { + case JSON_SEM_OSTART: + { + json_struct_action ostart = sem->object_start; + + if (lex->lex_level >= JSON_TD_MAX_STACK) + return JSON_NESTING_TOO_DEEP; + + if (ostart != NULL) + { + result = (*ostart) (sem->semstate); + if (result != JSON_SUCCESS) + return result; + } + inc_lex_level(lex); + } + break; + case JSON_SEM_OEND: + { + json_struct_action oend = sem->object_end; + + dec_lex_level(lex); + if (oend != NULL) + { + result = (*oend) (sem->semstate); + if (result != JSON_SUCCESS) + return result; + } + } + break; + case JSON_SEM_ASTART: + { + json_struct_action astart = sem->array_start; + + if (lex->lex_level >= JSON_TD_MAX_STACK) + return JSON_NESTING_TOO_DEEP; + + if (astart != NULL) + { + result = (*astart) (sem->semstate); + if (result != JSON_SUCCESS) + return result; + } + inc_lex_level(lex); + } + break; + case JSON_SEM_AEND: + { + json_struct_action aend = sem->array_end; + + dec_lex_level(lex); + if (aend != NULL) + { + result = (*aend) (sem->semstate); + if (result != JSON_SUCCESS) + return result; + } + } + break; + case JSON_SEM_OFIELD_INIT: + { + /* + * all we do here is save out the field name. We have + * to wait to get past the ':' to see if the next + * value is null so we can call the semantic routine + */ + char *fname = NULL; + json_ofield_action ostart = sem->object_field_start; + json_ofield_action oend = sem->object_field_end; + + if ((ostart != NULL || oend != NULL) && lex->strval != NULL) + { + fname = pstrdup(lex->strval->data); + } + set_fname(lex, fname); + } + break; + case JSON_SEM_OFIELD_START: + { + /* + * the current token should be the first token of the + * value + */ + bool isnull = tok == JSON_TOKEN_NULL; + json_ofield_action ostart = sem->object_field_start; + + set_fnull(lex, isnull); + + if (ostart != NULL) + { + char *fname = get_fname(lex); + + result = (*ostart) (sem->semstate, fname, isnull); + if (result != JSON_SUCCESS) + return result; + } + } + break; + case JSON_SEM_OFIELD_END: + { + json_ofield_action oend = sem->object_field_end; + + if (oend != NULL) + { + char *fname = get_fname(lex); + bool isnull = get_fnull(lex); + + result = (*oend) (sem->semstate, fname, isnull); + if (result != JSON_SUCCESS) + return result; + } + } + break; + case JSON_SEM_AELEM_START: + { + json_aelem_action astart = sem->array_element_start; + bool isnull = tok == JSON_TOKEN_NULL; + + set_fnull(lex, isnull); + + if (astart != NULL) + { + result = (*astart) (sem->semstate, isnull); + if (result != JSON_SUCCESS) + return result; + } + } + break; + case JSON_SEM_AELEM_END: + { + json_aelem_action aend = sem->array_element_end; + + if (aend != NULL) + { + bool isnull = get_fnull(lex); + + result = (*aend) (sem->semstate, isnull); + if (result != JSON_SUCCESS) + return result; + } + } + break; + case JSON_SEM_SCALAR_INIT: + { + json_scalar_action sfunc = sem->scalar; + + pstack->scalar_val = NULL; + + if (sfunc != NULL) + { + /* + * extract the de-escaped string value, or the raw + * lexeme + */ + /* + * XXX copied from RD parser but looks like a + * buglet + */ + if (tok == JSON_TOKEN_STRING) + { + if (lex->strval != NULL) + pstack->scalar_val = pstrdup(lex->strval->data); + } + else + { + ptrdiff_t tlen = (lex->token_terminator - lex->token_start); + + pstack->scalar_val = palloc(tlen + 1); + memcpy(pstack->scalar_val, lex->token_start, tlen); + pstack->scalar_val[tlen] = '\0'; + } + pstack->scalar_tok = tok; + } + } + break; + case JSON_SEM_SCALAR_CALL: + { + /* + * We'd like to be able to get rid of this business of + * two bits of scalar action, but we can't. It breaks + * certain semantic actions which expect that when + * called the lexer has consumed the item. See for + * example get_scalar() in jsonfuncs.c. + */ + json_scalar_action sfunc = sem->scalar; + + if (sfunc != NULL) + { + result = (*sfunc) (sem->semstate, pstack->scalar_val, pstack->scalar_tok); + if (result != JSON_SUCCESS) + return result; + } + } + break; + default: + /* should not happen */ + break; + } + } + else + { + /* + * The token didn't match the stack top if it's a terminal nor a + * production for the stack top if it's a non-terminal. + * + * Various cases here are Asserted to be not possible, as the + * token would not appear at the top of the prediction stack + * unless the lookahead matched. + */ + switch (top) + { + case JSON_TOKEN_STRING: + if (next_prediction(pstack) == JSON_TOKEN_COLON) + ctx = JSON_PARSE_STRING; + else + { + Assert(false); + ctx = JSON_PARSE_VALUE; + } + break; + case JSON_TOKEN_NUMBER: + case JSON_TOKEN_TRUE: + case JSON_TOKEN_FALSE: + case JSON_TOKEN_NULL: + case JSON_TOKEN_ARRAY_START: + case JSON_TOKEN_OBJECT_START: + Assert(false); + ctx = JSON_PARSE_VALUE; + break; + case JSON_TOKEN_ARRAY_END: + Assert(false); + ctx = JSON_PARSE_ARRAY_NEXT; + break; + case JSON_TOKEN_OBJECT_END: + Assert(false); + ctx = JSON_PARSE_OBJECT_NEXT; + break; + case JSON_TOKEN_COMMA: + Assert(false); + if (next_prediction(pstack) == JSON_TOKEN_STRING) + ctx = JSON_PARSE_OBJECT_NEXT; + else + ctx = JSON_PARSE_ARRAY_NEXT; + break; + case JSON_TOKEN_COLON: + ctx = JSON_PARSE_OBJECT_LABEL; + break; + case JSON_TOKEN_END: + ctx = JSON_PARSE_END; + break; + case JSON_NT_MORE_ARRAY_ELEMENTS: + ctx = JSON_PARSE_ARRAY_NEXT; + break; + case JSON_NT_ARRAY_ELEMENTS: + ctx = JSON_PARSE_ARRAY_START; + break; + case JSON_NT_MORE_KEY_PAIRS: + ctx = JSON_PARSE_OBJECT_NEXT; + break; + case JSON_NT_KEY_PAIRS: + ctx = JSON_PARSE_OBJECT_START; + break; + default: + ctx = JSON_PARSE_VALUE; + } + return report_parse_error(ctx, lex); + } + } + + return JSON_SUCCESS; +} + /* * Recursive Descent parse routines. There is one for each structural * element in a json document: @@ -547,16 +1292,222 @@ parse_array(JsonLexContext *lex, JsonSemAction *sem) /* * Lex one token from the input stream. + * + * When doing incremental parsing, we can reach the end of the input string + * without having (or knowing we have) a complete token. If it's not the + * final chunk of input, the partial token is then saved to the lex + * structure's ptok StringInfo. On subsequent calls input is appended to this + * buffer until we have something that we think is a complete token, + * which is then lexed using a recursive call to json_lex. Processing then + * continues as normal on subsequent calls. + * + * Note than when doing incremental processing, the lex.prev_token_terminator + * should not be relied on. It could point into a previous input chunk or + * worse. */ JsonParseErrorType json_lex(JsonLexContext *lex) { - char *s; - char *const end = lex->input + lex->input_length; + const char *s; + const char *const end = lex->input + lex->input_length; JsonParseErrorType result; - /* Skip leading whitespace. */ + if (lex->incremental && lex->inc_state->partial_completed) + { + /* + * We just lexed a completed partial token on the last call, so reset + * everything + */ + resetStringInfo(&(lex->inc_state->partial_token)); + lex->token_terminator = lex->input; + lex->inc_state->partial_completed = false; + } + s = lex->token_terminator; + + if (lex->incremental && lex->inc_state->partial_token.len) + { + /* + * We have a partial token. Extend it and if completed lex it by a + * recursive call + */ + StringInfo ptok = &(lex->inc_state->partial_token); + size_t added = 0; + bool tok_done = false; + JsonLexContext dummy_lex; + JsonParseErrorType partial_result; + + if (ptok->data[0] == '"') + { + /* + * It's a string. Accumulate characters until we reach an + * unescaped '"'. + */ + int escapes = 0; + + for (int i = ptok->len - 1; i > 0; i--) + { + /* count the trailing backslashes on the partial token */ + if (ptok->data[i] == '\\') + escapes++; + else + break; + } + + for (size_t i = 0; i < lex->input_length; i++) + { + char c = lex->input[i]; + + appendStringInfoCharMacro(ptok, c); + added++; + if (c == '"' && escapes % 2 == 0) + { + tok_done = true; + break; + } + if (c == '\\') + escapes++; + else + escapes = 0; + } + } + else + { + /* not a string */ + char c = ptok->data[0]; + + if (c == '-' || (c >= '0' && c <= '9')) + { + /* for numbers look for possible numeric continuations */ + + bool numend = false; + + for (size_t i = 0; i < lex->input_length && !numend; i++) + { + char cc = lex->input[i]; + + switch (cc) + { + case '+': + case '-': + case 'e': + case 'E': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + appendStringInfoCharMacro(ptok, cc); + added++; + } + break; + default: + numend = true; + } + } + } + + /* + * Add any remaining alphanumeric chars. This takes care of the + * {null, false, true} literals as well as any trailing + * alphanumeric junk on non-string tokens. + */ + for (size_t i = added; i < lex->input_length; i++) + { + char cc = lex->input[i]; + + if (JSON_ALPHANUMERIC_CHAR(cc)) + { + appendStringInfoCharMacro(ptok, cc); + added++; + } + else + { + tok_done = true; + break; + } + } + if (added == lex->input_length && + lex->inc_state->is_last_chunk) + { + tok_done = true; + } + } + + if (!tok_done) + { + /* We should have consumed the whole chunk in this case. */ + Assert(added == lex->input_length); + + if (!lex->inc_state->is_last_chunk) + return JSON_INCOMPLETE; + + /* json_errdetail() needs access to the accumulated token. */ + lex->token_start = ptok->data; + lex->token_terminator = ptok->data + ptok->len; + return JSON_INVALID_TOKEN; + } + + /* + * Everything up to lex->input[added] has been added to the partial + * token, so move the input past it. + */ + lex->input += added; + lex->input_length -= added; + + dummy_lex.input = dummy_lex.token_terminator = + dummy_lex.line_start = ptok->data; + dummy_lex.line_number = lex->line_number; + dummy_lex.input_length = ptok->len; + dummy_lex.input_encoding = lex->input_encoding; + dummy_lex.incremental = false; + dummy_lex.strval = lex->strval; + + partial_result = json_lex(&dummy_lex); + + /* + * We either have a complete token or an error. In either case we need + * to point to the partial token data for the semantic or error + * routines. If it's not an error we'll readjust on the next call to + * json_lex. + */ + lex->token_type = dummy_lex.token_type; + lex->line_number = dummy_lex.line_number; + + /* + * We know the prev_token_terminator must be back in some previous + * piece of input, so we just make it NULL. + */ + lex->prev_token_terminator = NULL; + + /* + * Normally token_start would be ptok->data, but it could be later, + * see json_lex_string's handling of invalid escapes. + */ + lex->token_start = dummy_lex.token_start; + lex->token_terminator = dummy_lex.token_terminator; + if (partial_result == JSON_SUCCESS) + { + /* make sure we've used all the input */ + if (lex->token_terminator - lex->token_start != ptok->len) + { + Assert(false); + return JSON_INVALID_TOKEN; + } + + lex->inc_state->partial_completed = true; + } + return partial_result; + /* end of partial token processing */ + } + + /* Skip leading whitespace. */ while (s < end && (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r')) { if (*s++ == '\n') @@ -642,7 +1593,7 @@ json_lex(JsonLexContext *lex) break; default: { - char *p; + const char *p; /* * We're not dealing with a string, number, legal @@ -668,6 +1619,14 @@ json_lex(JsonLexContext *lex) return JSON_INVALID_TOKEN; } + if (lex->incremental && !lex->inc_state->is_last_chunk && + p == lex->input + lex->input_length) + { + appendBinaryStringInfo( + &(lex->inc_state->partial_token), s, end - s); + return JSON_INCOMPLETE; + } + /* * We've got a real alphanumeric token here. If it * happens to be true, false, or null, all is well. If @@ -692,7 +1651,10 @@ json_lex(JsonLexContext *lex) } /* end of switch */ } - return JSON_SUCCESS; + if (lex->incremental && lex->token_type == JSON_TOKEN_END && !lex->inc_state->is_last_chunk) + return JSON_INCOMPLETE; + else + return JSON_SUCCESS; } /* @@ -709,20 +1671,29 @@ json_lex(JsonLexContext *lex) static inline JsonParseErrorType json_lex_string(JsonLexContext *lex) { - char *s; - char *const end = lex->input + lex->input_length; + const char *s; + const char *const end = lex->input + lex->input_length; int hi_surrogate = -1; /* Convenience macros for error exits */ -#define FAIL_AT_CHAR_START(code) \ +#define FAIL_OR_INCOMPLETE_AT_CHAR_START(code) \ do { \ + if (lex->incremental && !lex->inc_state->is_last_chunk) \ + { \ + appendBinaryStringInfo(&lex->inc_state->partial_token, \ + lex->token_start, end - lex->token_start); \ + return JSON_INCOMPLETE; \ + } \ lex->token_terminator = s; \ return code; \ } while (0) #define FAIL_AT_CHAR_END(code) \ do { \ - lex->token_terminator = \ - s + pg_encoding_mblen_bounded(lex->input_encoding, s); \ + ptrdiff_t remaining = end - s; \ + int charlen; \ + charlen = pg_encoding_mblen_or_incomplete(lex->input_encoding, \ + s, remaining); \ + lex->token_terminator = (charlen <= remaining) ? s + charlen : end; \ return code; \ } while (0) @@ -736,7 +1707,7 @@ json_lex_string(JsonLexContext *lex) s++; /* Premature end of the string. */ if (s >= end) - FAIL_AT_CHAR_START(JSON_INVALID_TOKEN); + FAIL_OR_INCOMPLETE_AT_CHAR_START(JSON_INVALID_TOKEN); else if (*s == '"') break; else if (*s == '\\') @@ -744,7 +1715,7 @@ json_lex_string(JsonLexContext *lex) /* OK, we have an escape character. */ s++; if (s >= end) - FAIL_AT_CHAR_START(JSON_INVALID_TOKEN); + FAIL_OR_INCOMPLETE_AT_CHAR_START(JSON_INVALID_TOKEN); else if (*s == 'u') { int i; @@ -754,7 +1725,7 @@ json_lex_string(JsonLexContext *lex) { s++; if (s >= end) - FAIL_AT_CHAR_START(JSON_INVALID_TOKEN); + FAIL_OR_INCOMPLETE_AT_CHAR_START(JSON_INVALID_TOKEN); else if (*s >= '0' && *s <= '9') ch = (ch * 16) + (*s - '0'); else if (*s >= 'a' && *s <= 'f') @@ -886,7 +1857,7 @@ json_lex_string(JsonLexContext *lex) } else { - char *p = s; + const char *p = s; if (hi_surrogate != -1) FAIL_AT_CHAR_END(JSON_UNICODE_LOW_SURROGATE); @@ -939,7 +1910,7 @@ json_lex_string(JsonLexContext *lex) lex->token_terminator = s + 1; return JSON_SUCCESS; -#undef FAIL_AT_CHAR_START +#undef FAIL_OR_INCOMPLETE_AT_CHAR_START #undef FAIL_AT_CHAR_END } @@ -972,8 +1943,8 @@ json_lex_string(JsonLexContext *lex) * the distance from lex->input to the token end+1 is returned to *total_len. */ static inline JsonParseErrorType -json_lex_number(JsonLexContext *lex, char *s, - bool *num_err, int *total_len) +json_lex_number(JsonLexContext *lex, const char *s, + bool *num_err, size_t *total_len) { bool error = false; int len = s - lex->input; @@ -1048,7 +2019,17 @@ json_lex_number(JsonLexContext *lex, char *s, if (total_len != NULL) *total_len = len; - if (num_err != NULL) + if (lex->incremental && !lex->inc_state->is_last_chunk && + len >= lex->input_length) + { + appendBinaryStringInfo(&lex->inc_state->partial_token, + lex->token_start, s - lex->token_start); + if (num_err != NULL) + *num_err = error; + + return JSON_INCOMPLETE; + } + else if (num_err != NULL) { /* let the caller handle any error */ *num_err = error; @@ -1109,72 +2090,79 @@ report_parse_error(JsonParseContext ctx, JsonLexContext *lex) return JSON_SUCCESS; /* silence stupider compilers */ } - -#ifndef FRONTEND -/* - * Extract the current token from a lexing context, for error reporting. - */ -static char * -extract_token(JsonLexContext *lex) -{ - int toklen = lex->token_terminator - lex->token_start; - char *token = palloc(toklen + 1); - - memcpy(token, lex->token_start, toklen); - token[toklen] = '\0'; - return token; -} - /* * Construct an (already translated) detail message for a JSON error. * - * Note that the error message generated by this routine may not be - * palloc'd, making it unsafe for frontend code as there is no way to - * know if this can be safely pfree'd or not. + * The returned pointer should not be freed, the allocation is either static + * or owned by the JsonLexContext. */ char * json_errdetail(JsonParseErrorType error, JsonLexContext *lex) { + if (lex->errormsg) + resetStringInfo(lex->errormsg); + else + lex->errormsg = makeStringInfo(); + + /* + * A helper for error messages that should print the current token. The + * format must contain exactly one %.*s specifier. + */ +#define json_token_error(lex, format) \ + appendStringInfo((lex)->errormsg, _(format), \ + (int) ((lex)->token_terminator - (lex)->token_start), \ + (lex)->token_start); + switch (error) { + case JSON_INCOMPLETE: case JSON_SUCCESS: /* fall through to the error code after switch */ break; + case JSON_INVALID_LEXER_TYPE: + if (lex->incremental) + return _("Recursive descent parser cannot use incremental lexer."); + else + return _("Incremental parser requires incremental lexer."); + case JSON_NESTING_TOO_DEEP: + return (_("JSON nested too deep, maximum permitted depth is 6400.")); case JSON_ESCAPING_INVALID: - return psprintf(_("Escape sequence \"\\%s\" is invalid."), - extract_token(lex)); + json_token_error(lex, "Escape sequence \"\\%.*s\" is invalid."); + break; case JSON_ESCAPING_REQUIRED: - return psprintf(_("Character with value 0x%02x must be escaped."), - (unsigned char) *(lex->token_terminator)); + appendStringInfo(lex->errormsg, + _("Character with value 0x%02x must be escaped."), + (unsigned char) *(lex->token_terminator)); + break; case JSON_EXPECTED_END: - return psprintf(_("Expected end of input, but found \"%s\"."), - extract_token(lex)); + json_token_error(lex, "Expected end of input, but found \"%.*s\"."); + break; case JSON_EXPECTED_ARRAY_FIRST: - return psprintf(_("Expected array element or \"]\", but found \"%s\"."), - extract_token(lex)); + json_token_error(lex, "Expected array element or \"]\", but found \"%.*s\"."); + break; case JSON_EXPECTED_ARRAY_NEXT: - return psprintf(_("Expected \",\" or \"]\", but found \"%s\"."), - extract_token(lex)); + json_token_error(lex, "Expected \",\" or \"]\", but found \"%.*s\"."); + break; case JSON_EXPECTED_COLON: - return psprintf(_("Expected \":\", but found \"%s\"."), - extract_token(lex)); + json_token_error(lex, "Expected \":\", but found \"%.*s\"."); + break; case JSON_EXPECTED_JSON: - return psprintf(_("Expected JSON value, but found \"%s\"."), - extract_token(lex)); + json_token_error(lex, "Expected JSON value, but found \"%.*s\"."); + break; case JSON_EXPECTED_MORE: return _("The input string ended unexpectedly."); case JSON_EXPECTED_OBJECT_FIRST: - return psprintf(_("Expected string or \"}\", but found \"%s\"."), - extract_token(lex)); + json_token_error(lex, "Expected string or \"}\", but found \"%.*s\"."); + break; case JSON_EXPECTED_OBJECT_NEXT: - return psprintf(_("Expected \",\" or \"}\", but found \"%s\"."), - extract_token(lex)); + json_token_error(lex, "Expected \",\" or \"}\", but found \"%.*s\"."); + break; case JSON_EXPECTED_STRING: - return psprintf(_("Expected string, but found \"%s\"."), - extract_token(lex)); + json_token_error(lex, "Expected string, but found \"%.*s\"."); + break; case JSON_INVALID_TOKEN: - return psprintf(_("Token \"%s\" is invalid."), - extract_token(lex)); + json_token_error(lex, "Token \"%.*s\" is invalid."); + break; case JSON_UNICODE_CODE_POINT_ZERO: return _("\\u0000 cannot be converted to text."); case JSON_UNICODE_ESCAPE_FORMAT: @@ -1183,9 +2171,19 @@ json_errdetail(JsonParseErrorType error, JsonLexContext *lex) /* note: this case is only reachable in frontend not backend */ return _("Unicode escape values cannot be used for code point values above 007F when the encoding is not UTF8."); case JSON_UNICODE_UNTRANSLATABLE: - /* note: this case is only reachable in backend not frontend */ + + /* + * Note: this case is only reachable in backend and not frontend. + * #ifdef it away so the frontend doesn't try to link against + * backend functionality. + */ +#ifndef FRONTEND return psprintf(_("Unicode escape value could not be translated to the server's encoding %s."), GetDatabaseEncodingName()); +#else + Assert(false); + break; +#endif case JSON_UNICODE_HIGH_SURROGATE: return _("Unicode high surrogate must not follow a high surrogate."); case JSON_UNICODE_LOW_SURROGATE: @@ -1194,13 +2192,17 @@ json_errdetail(JsonParseErrorType error, JsonLexContext *lex) /* fall through to the error code after switch */ break; } +#undef json_token_error /* * We don't use a default: case, so that the compiler will warn about * unhandled enum values. But this needs to be here anyway to cover the * possibility of an incorrect input. */ - elog(ERROR, "unexpected json parse error type: %d", (int) error); - return NULL; + if (lex->errormsg->len == 0) + appendStringInfo(lex->errormsg, + "unexpected json parse error type: %d", + (int) error); + + return lex->errormsg->data; } -#endif diff --git a/src/common/keywords.c b/src/common/keywords.c index b72f0d554ffcc..cfd2cb2983d73 100644 --- a/src/common/keywords.c +++ b/src/common/keywords.c @@ -4,7 +4,7 @@ * PostgreSQL's list of SQL keywords * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/common/kwlookup.c b/src/common/kwlookup.c index 7e49825c7be63..eda06f04925ea 100644 --- a/src/common/kwlookup.c +++ b/src/common/kwlookup.c @@ -4,7 +4,7 @@ * Key word lookup for PostgreSQL * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/common/link-canary.c b/src/common/link-canary.c index f84331a9a47d3..5b2d0fc8854f0 100644 --- a/src/common/link-canary.c +++ b/src/common/link-canary.c @@ -2,7 +2,7 @@ * link-canary.c * Detect whether src/common functions came from frontend or backend. * - * Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Copyright (c) 2018-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/link-canary.c diff --git a/src/common/logging.c b/src/common/logging.c index dab718b482ec3..e9a02e3e46a51 100644 --- a/src/common/logging.c +++ b/src/common/logging.c @@ -1,7 +1,7 @@ /*------------------------------------------------------------------------- * Logging framework for frontend programs * - * Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Copyright (c) 2018-2024, PostgreSQL Global Development Group * * src/common/logging.c * diff --git a/src/common/md5.c b/src/common/md5.c index bf56311b2b712..32b696a66dfd8 100644 --- a/src/common/md5.c +++ b/src/common/md5.c @@ -7,7 +7,7 @@ * implementation is a simple one, in that it needs every input byte * to be buffered before doing any calculations. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -150,10 +150,6 @@ static const uint8 md5_paddat[MD5_BUFLEN] = { 0, 0, 0, 0, 0, 0, 0, 0, }; -#ifdef WORDS_BIGENDIAN -static uint32 X[16]; -#endif - static void md5_calc(const uint8 *b64, pg_md5_ctx *ctx) { @@ -167,6 +163,7 @@ md5_calc(const uint8 *b64, pg_md5_ctx *ctx) #else /* 4 byte words */ /* what a brute force but fast! */ + uint32 X[16]; uint8 *y = (uint8 *) X; y[0] = b64[3]; diff --git a/src/common/md5_common.c b/src/common/md5_common.c index 82ce75dcf2aa1..c654efe9718ac 100644 --- a/src/common/md5_common.c +++ b/src/common/md5_common.c @@ -6,7 +6,7 @@ * * Sverre H. Huseby * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -45,7 +45,8 @@ bytesToHex(uint8 b[16], char *s) * Calculates the MD5 sum of the bytes in a buffer. * * SYNOPSIS #include "md5.h" - * int pg_md5_hash(const void *buff, size_t len, char *hexsum) + * bool pg_md5_hash(const void *buff, size_t len, char *hexsum, + * const char **errstr) * * INPUT buff the buffer containing the bytes that you want * the MD5 sum of. diff --git a/src/common/md5_int.h b/src/common/md5_int.h index 63fd3956f82c6..479e82386f0ef 100644 --- a/src/common/md5_int.h +++ b/src/common/md5_int.h @@ -3,7 +3,7 @@ * md5_int.h * Internal headers for fallback implementation of MD5 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/common/meson.build b/src/common/meson.build index 9efc80ac024ce..b2d45c1d6753b 100644 --- a/src/common/meson.build +++ b/src/common/meson.build @@ -1,8 +1,10 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group common_sources = files( 'archive.c', 'base64.c', + 'binaryheap.c', + 'blkreftable.c', 'checksum_helper.c', 'compression.c', 'controldata_utils.c', @@ -17,6 +19,7 @@ common_sources = files( 'kwlookup.c', 'link-canary.c', 'md5_common.c', + 'parse_manifest.c', 'percentrepl.c', 'pg_get_line.c', 'pg_lzcompress.c', @@ -29,6 +32,8 @@ common_sources = files( 'scram-common.c', 'string.c', 'stringinfo.c', + 'unicode_case.c', + 'unicode_category.c', 'unicode_norm.c', 'username.c', 'wait_error.c', @@ -93,11 +98,10 @@ common_sources_cflags = { } -# A few files are currently only built for frontend, not server -# (Mkvcbuild.pm has a copy of this list, too). logging.c is excluded -# from OBJS_FRONTEND_SHLIB (shared library) as a matter of policy, -# because it is not appropriate for general purpose libraries such -# as libpq to report errors directly. +# A few files are currently only built for frontend, not server. +# logging.c is excluded from OBJS_FRONTEND_SHLIB (shared library) as +# a matter of policy, because it is not appropriate for general purpose +# libraries such as libpq to report errors directly. common_sources_frontend_shlib = common_sources common_sources_frontend_shlib += files( @@ -111,24 +115,28 @@ common_sources_frontend_static += files( 'logging.c', ) -# Build pgport once for backend, once for use in frontend binaries, and once -# for use in shared libraries +# Build pgcommon once for backend, once for use in frontend binaries, and +# once for use in shared libraries # # XXX: in most environments we could probably link_whole pgcommon_shlib # against pgcommon_static, instead of compiling twice. # -# For the server build of pgcommon, depend on lwlocknames_h, because at least -# cryptohash_openssl.c, hmac_openssl.c depend on it. That's arguably a +# For the server build of pgcommon, depend on lwlocknames_h and because at +# least cryptohash_openssl.c, hmac_openssl.c depend on it. +# controldata_utils.c depends on wait_event_types_h. That's arguably a # layering violation, but ... pgcommon = {} pgcommon_variants = { '_srv': internal_lib_args + { - 'sources': common_sources + [lwlocknames_h], + 'sources': common_sources + [lwlocknames_h] + [wait_event_types_h], 'dependencies': [backend_common_code], }, '': default_lib_args + { 'sources': common_sources_frontend_static, 'dependencies': [frontend_common_code], + # Files in libpgcommon.a should use/export the "xxx_private" versions + # of pg_char_to_encoding() and friends. + 'c_args': ['-DUSE_PRIVATE_ENCODING_FUNCS'], }, '_shlib': default_lib_args + { 'pic': true, @@ -161,6 +169,7 @@ foreach name, opts : pgcommon_variants lib = static_library('libpgcommon@0@'.format(name), link_with: cflag_libs, + link_whole: cflag_libs, c_pch: pch_c_h, include_directories: include_directories('.'), kwargs: opts + { diff --git a/src/bin/pg_verifybackup/parse_manifest.c b/src/common/parse_manifest.c similarity index 76% rename from src/bin/pg_verifybackup/parse_manifest.c rename to src/common/parse_manifest.c index 2379f7be7bb92..bc7eebb06aec7 100644 --- a/src/bin/pg_verifybackup/parse_manifest.c +++ b/src/common/parse_manifest.c @@ -3,18 +3,18 @@ * parse_manifest.c * Parse a backup manifest in JSON format. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * src/bin/pg_verifybackup/parse_manifest.c + * src/common/parse_manifest.c * *------------------------------------------------------------------------- */ #include "postgres_fe.h" -#include "parse_manifest.h" #include "common/jsonapi.h" +#include "common/parse_manifest.h" /* * Semantic states for JSON manifest parsing. @@ -25,6 +25,7 @@ typedef enum JM_EXPECT_TOPLEVEL_END, JM_EXPECT_TOPLEVEL_FIELD, JM_EXPECT_VERSION_VALUE, + JM_EXPECT_SYSTEM_IDENTIFIER_VALUE, JM_EXPECT_FILES_START, JM_EXPECT_FILES_NEXT, JM_EXPECT_THIS_FILE_FIELD, @@ -34,7 +35,7 @@ typedef enum JM_EXPECT_THIS_WAL_RANGE_FIELD, JM_EXPECT_THIS_WAL_RANGE_VALUE, JM_EXPECT_MANIFEST_CHECKSUM_VALUE, - JM_EXPECT_EOF + JM_EXPECT_EOF, } JsonManifestSemanticState; /* @@ -47,7 +48,7 @@ typedef enum JMFF_SIZE, JMFF_LAST_MODIFIED, JMFF_CHECKSUM_ALGORITHM, - JMFF_CHECKSUM + JMFF_CHECKSUM, } JsonManifestFileField; /* @@ -57,7 +58,7 @@ typedef enum { JMWRF_TIMELINE, JMWRF_START_LSN, - JMWRF_END_LSN + JMWRF_END_LSN, } JsonManifestWALRangeField; /* @@ -85,9 +86,19 @@ typedef struct /* Miscellaneous other stuff. */ bool saw_version_field; + char *manifest_version; + char *manifest_system_identifier; char *manifest_checksum; } JsonManifestParseState; +/* typedef appears in parse_manifest.h */ +struct JsonManifestParseIncrementalState +{ + JsonLexContext lex; + JsonSemAction sem; + pg_cryptohash_ctx *manifest_ctx; +}; + static JsonParseErrorType json_manifest_object_start(void *state); static JsonParseErrorType json_manifest_object_end(void *state); static JsonParseErrorType json_manifest_array_start(void *state); @@ -96,10 +107,13 @@ static JsonParseErrorType json_manifest_object_field_start(void *state, char *fn bool isnull); static JsonParseErrorType json_manifest_scalar(void *state, char *token, JsonTokenType tokentype); +static void json_manifest_finalize_version(JsonManifestParseState *parse); +static void json_manifest_finalize_system_identifier(JsonManifestParseState *parse); static void json_manifest_finalize_file(JsonManifestParseState *parse); static void json_manifest_finalize_wal_range(JsonManifestParseState *parse); static void verify_manifest_checksum(JsonManifestParseState *parse, - char *buffer, size_t size); + const char *buffer, size_t size, + pg_cryptohash_ctx *incr_ctx); static void json_manifest_parse_failure(JsonManifestParseContext *context, char *msg); @@ -107,16 +121,110 @@ static int hexdecode_char(char c); static bool hexdecode_string(uint8 *result, char *input, int nbytes); static bool parse_xlogrecptr(XLogRecPtr *result, char *input); +/* + * Set up for incremental parsing of the manifest. + */ + +JsonManifestParseIncrementalState * +json_parse_manifest_incremental_init(JsonManifestParseContext *context) +{ + JsonManifestParseIncrementalState *incstate; + JsonManifestParseState *parse; + pg_cryptohash_ctx *manifest_ctx; + + incstate = palloc(sizeof(JsonManifestParseIncrementalState)); + parse = palloc(sizeof(JsonManifestParseState)); + + parse->context = context; + parse->state = JM_EXPECT_TOPLEVEL_START; + parse->saw_version_field = false; + + makeJsonLexContextIncremental(&(incstate->lex), PG_UTF8, true); + + incstate->sem.semstate = parse; + incstate->sem.object_start = json_manifest_object_start; + incstate->sem.object_end = json_manifest_object_end; + incstate->sem.array_start = json_manifest_array_start; + incstate->sem.array_end = json_manifest_array_end; + incstate->sem.object_field_start = json_manifest_object_field_start; + incstate->sem.object_field_end = NULL; + incstate->sem.array_element_start = NULL; + incstate->sem.array_element_end = NULL; + incstate->sem.scalar = json_manifest_scalar; + + manifest_ctx = pg_cryptohash_create(PG_SHA256); + if (manifest_ctx == NULL) + context->error_cb(context, "out of memory"); + if (pg_cryptohash_init(manifest_ctx) < 0) + context->error_cb(context, "could not initialize checksum of manifest"); + incstate->manifest_ctx = manifest_ctx; + + return incstate; +} + +/* + * Free an incremental state object and its contents. + */ +void +json_parse_manifest_incremental_shutdown(JsonManifestParseIncrementalState *incstate) +{ + pfree(incstate->sem.semstate); + freeJsonLexContext(&(incstate->lex)); + /* incstate->manifest_ctx has already been freed */ + pfree(incstate); +} + +/* + * parse the manifest in pieces. + * + * The caller must ensure that the final piece contains the final lines + * with the complete checksum. + */ + +void +json_parse_manifest_incremental_chunk(JsonManifestParseIncrementalState *incstate, + const char *chunk, size_t size, bool is_last) +{ + JsonParseErrorType res, + expected; + JsonManifestParseState *parse = incstate->sem.semstate; + JsonManifestParseContext *context = parse->context; + + res = pg_parse_json_incremental(&(incstate->lex), &(incstate->sem), + chunk, size, is_last); + + expected = is_last ? JSON_SUCCESS : JSON_INCOMPLETE; + + if (res != expected) + json_manifest_parse_failure(context, + json_errdetail(res, &(incstate->lex))); + + if (is_last && parse->state != JM_EXPECT_EOF) + json_manifest_parse_failure(context, "manifest ended unexpectedly"); + + if (!is_last) + { + if (pg_cryptohash_update(incstate->manifest_ctx, + (const uint8 *) chunk, size) < 0) + context->error_cb(context, "could not update checksum of manifest"); + } + else + { + verify_manifest_checksum(parse, chunk, size, incstate->manifest_ctx); + } +} + + /* * Main entrypoint to parse a JSON-format backup manifest. * * Caller should set up the parsing context and then invoke this function. * For each file whose information is extracted from the manifest, - * context->perfile_cb is invoked. In case of trouble, context->error_cb is + * context->per_file_cb is invoked. In case of trouble, context->error_cb is * invoked and is expected not to return. */ void -json_parse_manifest(JsonManifestParseContext *context, char *buffer, +json_parse_manifest(JsonManifestParseContext *context, const char *buffer, size_t size) { JsonLexContext *lex; @@ -130,7 +238,7 @@ json_parse_manifest(JsonManifestParseContext *context, char *buffer, parse.saw_version_field = false; /* Create a JSON lexing context. */ - lex = makeJsonLexContextCstringLen(buffer, size, PG_UTF8, true); + lex = makeJsonLexContextCstringLen(NULL, buffer, size, PG_UTF8, true); /* Set up semantic actions. */ sem.semstate = &parse; @@ -147,12 +255,14 @@ json_parse_manifest(JsonManifestParseContext *context, char *buffer, /* Run the actual JSON parser. */ json_error = pg_parse_json(lex, &sem); if (json_error != JSON_SUCCESS) - json_manifest_parse_failure(context, "parsing failed"); + json_manifest_parse_failure(context, json_errdetail(json_error, lex)); if (parse.state != JM_EXPECT_EOF) json_manifest_parse_failure(context, "manifest ended unexpectedly"); /* Verify the manifest checksum. */ - verify_manifest_checksum(&parse, buffer, size); + verify_manifest_checksum(&parse, buffer, size, NULL); + + freeJsonLexContext(lex); } /* @@ -310,6 +420,13 @@ json_manifest_object_field_start(void *state, char *fname, bool isnull) break; } + /* Is this the system identifier? */ + if (strcmp(fname, "System-Identifier") == 0) + { + parse->state = JM_EXPECT_SYSTEM_IDENTIFIER_VALUE; + break; + } + /* Is this the list of files? */ if (strcmp(fname, "Files") == 0) { @@ -376,6 +493,8 @@ json_manifest_object_field_start(void *state, char *fname, bool isnull) break; } + pfree(fname); + return JSON_SUCCESS; } @@ -402,9 +521,14 @@ json_manifest_scalar(void *state, char *token, JsonTokenType tokentype) switch (parse->state) { case JM_EXPECT_VERSION_VALUE: - if (strcmp(token, "1") != 0) - json_manifest_parse_failure(parse->context, - "unexpected manifest version"); + parse->manifest_version = token; + json_manifest_finalize_version(parse); + parse->state = JM_EXPECT_TOPLEVEL_FIELD; + break; + + case JM_EXPECT_SYSTEM_IDENTIFIER_VALUE: + parse->manifest_system_identifier = token; + json_manifest_finalize_system_identifier(parse); parse->state = JM_EXPECT_TOPLEVEL_FIELD; break; @@ -462,6 +586,59 @@ json_manifest_scalar(void *state, char *token, JsonTokenType tokentype) return JSON_SUCCESS; } +/* + * Do additional parsing and sanity-checking of the manifest version, and invoke + * the callback so that the caller can gets that detail and take actions + * accordingly. This happens for each manifest when the corresponding JSON + * object is completely parsed. + */ +static void +json_manifest_finalize_version(JsonManifestParseState *parse) +{ + JsonManifestParseContext *context = parse->context; + int version; + char *ep; + + Assert(parse->saw_version_field); + + /* Parse version. */ + version = strtoi64(parse->manifest_version, &ep, 10); + if (*ep) + json_manifest_parse_failure(parse->context, + "manifest version not an integer"); + + if (version != 1 && version != 2) + json_manifest_parse_failure(parse->context, + "unexpected manifest version"); + + /* Invoke the callback for version */ + context->version_cb(context, version); +} + +/* + * Do additional parsing and sanity-checking of the system identifier, and + * invoke the callback so that the caller can gets that detail and take actions + * accordingly. + */ +static void +json_manifest_finalize_system_identifier(JsonManifestParseState *parse) +{ + JsonManifestParseContext *context = parse->context; + uint64 system_identifier; + char *ep; + + Assert(parse->manifest_system_identifier != NULL); + + /* Parse system identifier. */ + system_identifier = strtou64(parse->manifest_system_identifier, &ep, 10); + if (*ep) + json_manifest_parse_failure(parse->context, + "system identifier in manifest not an integer"); + + /* Invoke the callback for system identifier */ + context->system_identifier_cb(context, system_identifier); +} + /* * Do additional parsing and sanity-checking of the details gathered for one * file, and invoke the per-file callback so that the caller gets those @@ -543,8 +720,8 @@ json_manifest_finalize_file(JsonManifestParseState *parse) } /* Invoke the callback with the details we've gathered. */ - context->perfile_cb(context, parse->pathname, size, - checksum_type, checksum_length, checksum_payload); + context->per_file_cb(context, parse->pathname, size, + checksum_type, checksum_length, checksum_payload); /* Free memory we no longer need. */ if (parse->size != NULL) @@ -600,7 +777,7 @@ json_manifest_finalize_wal_range(JsonManifestParseState *parse) "could not parse end LSN"); /* Invoke the callback with the details we've gathered. */ - context->perwalrange_cb(context, tli, start_lsn, end_lsn); + context->per_wal_range_cb(context, tli, start_lsn, end_lsn); /* Free memory we no longer need. */ if (parse->timeline != NULL) @@ -626,10 +803,14 @@ json_manifest_finalize_wal_range(JsonManifestParseState *parse) * The last line of the manifest file is excluded from the manifest checksum, * because the last line is expected to contain the checksum that covers * the rest of the file. + * + * For an incremental parse, this will just be called on the last chunk of the + * manifest, and the cryptohash context passed in. For a non-incremental + * parse incr_ctx will be NULL. */ static void -verify_manifest_checksum(JsonManifestParseState *parse, char *buffer, - size_t size) +verify_manifest_checksum(JsonManifestParseState *parse, const char *buffer, + size_t size, pg_cryptohash_ctx *incr_ctx) { JsonManifestParseContext *context = parse->context; size_t i; @@ -664,12 +845,19 @@ verify_manifest_checksum(JsonManifestParseState *parse, char *buffer, "last line not newline-terminated"); /* Checksum the rest. */ - manifest_ctx = pg_cryptohash_create(PG_SHA256); - if (manifest_ctx == NULL) - context->error_cb(context, "out of memory"); - if (pg_cryptohash_init(manifest_ctx) < 0) - context->error_cb(context, "could not initialize checksum of manifest"); - if (pg_cryptohash_update(manifest_ctx, (uint8 *) buffer, penultimate_newline + 1) < 0) + if (incr_ctx == NULL) + { + manifest_ctx = pg_cryptohash_create(PG_SHA256); + if (manifest_ctx == NULL) + context->error_cb(context, "out of memory"); + if (pg_cryptohash_init(manifest_ctx) < 0) + context->error_cb(context, "could not initialize checksum of manifest"); + } + else + { + manifest_ctx = incr_ctx; + } + if (pg_cryptohash_update(manifest_ctx, (const uint8 *) buffer, penultimate_newline + 1) < 0) context->error_cb(context, "could not update checksum of manifest"); if (pg_cryptohash_final(manifest_ctx, manifest_checksum_actual, sizeof(manifest_checksum_actual)) < 0) diff --git a/src/common/percentrepl.c b/src/common/percentrepl.c index 7aa85fdc9406a..acad6aacf3b01 100644 --- a/src/common/percentrepl.c +++ b/src/common/percentrepl.c @@ -3,7 +3,7 @@ * percentrepl.c * Common routines to replace percent placeholders in strings * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/common/pg_get_line.c b/src/common/pg_get_line.c index 3cdf0908d2a1b..ea37a359454cd 100644 --- a/src/common/pg_get_line.c +++ b/src/common/pg_get_line.c @@ -3,7 +3,7 @@ * pg_get_line.c * fgets() with an expansible result buffer * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/common/pg_lzcompress.c b/src/common/pg_lzcompress.c index f14c89fae4710..64237424b512f 100644 --- a/src/common/pg_lzcompress.c +++ b/src/common/pg_lzcompress.c @@ -172,7 +172,7 @@ * * Jan Wieck * - * Copyright (c) 1999-2023, PostgreSQL Global Development Group + * Copyright (c) 1999-2024, PostgreSQL Global Development Group * * src/common/pg_lzcompress.c * ---------- @@ -735,11 +735,15 @@ pglz_decompress(const char *source, int32 slen, char *dest, /* * Check for corrupt data: if we fell off the end of the - * source, or if we obtained off = 0, we have problems. (We - * must check this, else we risk an infinite loop below in the - * face of corrupt data.) + * source, or if we obtained off = 0, or if off is more than + * the distance back to the buffer start, we have problems. + * (We must check for off = 0, else we risk an infinite loop + * below in the face of corrupt data. Likewise, the upper + * limit on off prevents accessing outside the buffer + * boundaries.) */ - if (unlikely(sp > srcend || off == 0)) + if (unlikely(sp > srcend || off == 0 || + off > (dp - (unsigned char *) dest))) return -1; /* diff --git a/src/common/pg_prng.c b/src/common/pg_prng.c index c7bb92ede3887..15b39411a9b69 100644 --- a/src/common/pg_prng.c +++ b/src/common/pg_prng.c @@ -10,7 +10,7 @@ * About these generators: https://prng.di.unimi.it/ * See also https://en.wikipedia.org/wiki/List_of_random_number_generators * - * Copyright (c) 2021-2023, PostgreSQL Global Development Group + * Copyright (c) 2021-2024, PostgreSQL Global Development Group * * src/common/pg_prng.c * @@ -184,6 +184,42 @@ pg_prng_int64p(pg_prng_state *state) return (int64) (xoroshiro128ss(state) & UINT64CONST(0x7FFFFFFFFFFFFFFF)); } +/* + * Select a random int64 uniformly from the range [rmin, rmax]. + * If the range is empty, rmin is always produced. + */ +int64 +pg_prng_int64_range(pg_prng_state *state, int64 rmin, int64 rmax) +{ + int64 val; + + if (likely(rmax > rmin)) + { + uint64 uval; + + /* + * Use pg_prng_uint64_range(). Can't simply pass it rmin and rmax, + * since (uint64) rmin will be larger than (uint64) rmax if rmin < 0. + */ + uval = (uint64) rmin + + pg_prng_uint64_range(state, 0, (uint64) rmax - (uint64) rmin); + + /* + * Safely convert back to int64, avoiding implementation-defined + * behavior for values larger than PG_INT64_MAX. Modern compilers + * will reduce this to a simple assignment. + */ + if (uval > PG_INT64_MAX) + val = (int64) (uval - PG_INT64_MIN) + PG_INT64_MIN; + else + val = (int64) uval; + } + else + val = rmin; + + return val; +} + /* * Select a random uint32 uniformly from the range [0, PG_UINT32_MAX]. */ diff --git a/src/common/pgfnames.c b/src/common/pgfnames.c index 9d2fe9d6592a3..532870812de75 100644 --- a/src/common/pgfnames.c +++ b/src/common/pgfnames.c @@ -3,7 +3,7 @@ * pgfnames.c * directory handling functions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/common/protocol_openssl.c b/src/common/protocol_openssl.c index 089cbd33cca63..ae378685e1f60 100644 --- a/src/common/protocol_openssl.c +++ b/src/common/protocol_openssl.c @@ -5,7 +5,7 @@ * * This should only be used if code is compiled with OpenSSL support. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/common/psprintf.c b/src/common/psprintf.c index c1d2807cea97f..a063fd26d51a2 100644 --- a/src/common/psprintf.c +++ b/src/common/psprintf.c @@ -4,7 +4,7 @@ * sprintf into an allocated-on-demand buffer * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -115,8 +115,8 @@ pvsnprintf(char *buf, size_t len, const char *fmt, va_list args) #ifndef FRONTEND elog(ERROR, "vsnprintf failed: %m with format string \"%s\"", fmt); #else - fprintf(stderr, "vsnprintf failed: %s with format string \"%s\"\n", - strerror(errno), fmt); + fprintf(stderr, "vsnprintf failed: %m with format string \"%s\"\n", + fmt); exit(EXIT_FAILURE); #endif } diff --git a/src/common/relpath.c b/src/common/relpath.c index 87de5f6c9608b..f54c36ef7ac9f 100644 --- a/src/common/relpath.c +++ b/src/common/relpath.c @@ -4,7 +4,7 @@ * * This module also contains some logic associated with fork names. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -20,7 +20,7 @@ #include "catalog/pg_tablespace_d.h" #include "common/relpath.h" -#include "storage/backendid.h" +#include "storage/procnumber.h" /* @@ -31,10 +31,10 @@ * pg_relation_size(). */ const char *const forkNames[] = { - "main", /* MAIN_FORKNUM */ - "fsm", /* FSM_FORKNUM */ - "vm", /* VISIBILITYMAP_FORKNUM */ - "init" /* INIT_FORKNUM */ + [MAIN_FORKNUM] = "main", + [FSM_FORKNUM] = "fsm", + [VISIBILITYMAP_FORKNUM] = "vm", + [INIT_FORKNUM] = "init", }; StaticAssertDecl(lengthof(forkNames) == (MAX_FORKNUM + 1), @@ -133,13 +133,13 @@ GetDatabasePath(Oid dbOid, Oid spcOid) * * Result is a palloc'd string. * - * Note: ideally, backendId would be declared as type BackendId, but relpath.h - * would have to include a backend-only header to do that; doesn't seem worth - * the trouble considering BackendId is just int anyway. + * Note: ideally, procNumber would be declared as type ProcNumber, but + * relpath.h would have to include a backend-only header to do that; doesn't + * seem worth the trouble considering ProcNumber is just int anyway. */ char * GetRelationPath(Oid dbOid, Oid spcOid, RelFileNumber relNumber, - int backendId, ForkNumber forkNumber) + int procNumber, ForkNumber forkNumber) { char *path; @@ -147,7 +147,7 @@ GetRelationPath(Oid dbOid, Oid spcOid, RelFileNumber relNumber, { /* Shared system relations live in {datadir}/global */ Assert(dbOid == 0); - Assert(backendId == InvalidBackendId); + Assert(procNumber == INVALID_PROC_NUMBER); if (forkNumber != MAIN_FORKNUM) path = psprintf("global/%u_%s", relNumber, forkNames[forkNumber]); @@ -157,7 +157,7 @@ GetRelationPath(Oid dbOid, Oid spcOid, RelFileNumber relNumber, else if (spcOid == DEFAULTTABLESPACE_OID) { /* The default tablespace is {datadir}/base */ - if (backendId == InvalidBackendId) + if (procNumber == INVALID_PROC_NUMBER) { if (forkNumber != MAIN_FORKNUM) path = psprintf("base/%u/%u_%s", @@ -171,17 +171,17 @@ GetRelationPath(Oid dbOid, Oid spcOid, RelFileNumber relNumber, { if (forkNumber != MAIN_FORKNUM) path = psprintf("base/%u/t%d_%u_%s", - dbOid, backendId, relNumber, + dbOid, procNumber, relNumber, forkNames[forkNumber]); else path = psprintf("base/%u/t%d_%u", - dbOid, backendId, relNumber); + dbOid, procNumber, relNumber); } } else { /* All other tablespaces are accessed via symlinks */ - if (backendId == InvalidBackendId) + if (procNumber == INVALID_PROC_NUMBER) { if (forkNumber != MAIN_FORKNUM) path = psprintf("pg_tblspc/%u/%s/%u/%u_%s", @@ -198,12 +198,12 @@ GetRelationPath(Oid dbOid, Oid spcOid, RelFileNumber relNumber, if (forkNumber != MAIN_FORKNUM) path = psprintf("pg_tblspc/%u/%s/%u/t%d_%u_%s", spcOid, TABLESPACE_VERSION_DIRECTORY, - dbOid, backendId, relNumber, + dbOid, procNumber, relNumber, forkNames[forkNumber]); else path = psprintf("pg_tblspc/%u/%s/%u/t%d_%u", spcOid, TABLESPACE_VERSION_DIRECTORY, - dbOid, backendId, relNumber); + dbOid, procNumber, relNumber); } } return path; diff --git a/src/common/restricted_token.c b/src/common/restricted_token.c index 4ae1ed1e8ae57..d04101d6d15d2 100644 --- a/src/common/restricted_token.c +++ b/src/common/restricted_token.c @@ -4,7 +4,7 @@ * helper routine to ensure restricted token on Windows * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/common/rmtree.c b/src/common/rmtree.c index cd99d3f4719b2..7871796099970 100644 --- a/src/common/rmtree.c +++ b/src/common/rmtree.c @@ -2,7 +2,7 @@ * * rmtree.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -55,7 +55,7 @@ rmtree(const char *path, bool rmtopdir) bool result = true; size_t dirnames_size = 0; size_t dirnames_capacity = 8; - char **dirnames = palloc(sizeof(char *) * dirnames_capacity); + char **dirnames; dir = OPENDIR(path); if (dir == NULL) @@ -64,6 +64,8 @@ rmtree(const char *path, bool rmtopdir) return false; } + dirnames = (char **) palloc(sizeof(char *) * dirnames_capacity); + while (errno = 0, (de = readdir(dir))) { if (strcmp(de->d_name, ".") == 0 || diff --git a/src/common/ryu_common.h b/src/common/ryu_common.h index ad850acf62f29..3de519bb725d6 100644 --- a/src/common/ryu_common.h +++ b/src/common/ryu_common.h @@ -2,7 +2,7 @@ * * Common routines for Ryu floating-point output. * - * Portions Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/ryu_common.h diff --git a/src/common/saslprep.c b/src/common/saslprep.c index 3cf498866a532..792957bd27555 100644 --- a/src/common/saslprep.c +++ b/src/common/saslprep.c @@ -12,7 +12,7 @@ * http://www.ietf.org/rfc/rfc4013.txt * * - * Portions Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2017-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/saslprep.c @@ -21,8 +21,13 @@ */ #ifndef FRONTEND #include "postgres.h" +#include "utils/memutils.h" #else #include "postgres_fe.h" + +/* It's possible we could use a different value for this in frontend code */ +#define MaxAllocSize ((Size) 0x3fffffff) /* 1 gigabyte - 1 */ + #endif #include "common/saslprep.h" @@ -1077,6 +1082,8 @@ pg_saslprep(const char *input, char **output) input_size = pg_utf8_string_len(input); if (input_size < 0) return SASLPREP_INVALID_UTF8; + if (input_size >= MaxAllocSize / sizeof(pg_wchar)) + goto oom; input_chars = ALLOC((input_size + 1) * sizeof(pg_wchar)); if (!input_chars) diff --git a/src/common/scram-common.c b/src/common/scram-common.c index ef997ef684920..c36ed7124c2a2 100644 --- a/src/common/scram-common.c +++ b/src/common/scram-common.c @@ -6,7 +6,7 @@ * backend, for implement the Salted Challenge Response Authentication * Mechanism (SCRAM), per IETF's RFC 5802. * - * Portions Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2017-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/scram-common.c @@ -22,6 +22,9 @@ #include "common/base64.h" #include "common/hmac.h" #include "common/scram-common.h" +#ifndef FRONTEND +#include "miscadmin.h" +#endif #include "port/pg_bswap.h" /* @@ -71,8 +74,16 @@ scram_SaltedPassword(const char *password, memcpy(result, Ui_prev, key_length); /* Subsequent iterations */ - for (i = 2; i <= iterations; i++) + for (i = 1; i < iterations; i++) { +#ifndef FRONTEND + /* + * Make sure that this is interruptible as scram_iterations could be + * set to a large value. + */ + CHECK_FOR_INTERRUPTS(); +#endif + if (pg_hmac_init(hmac_ctx, (uint8 *) password, password_len) < 0 || pg_hmac_update(hmac_ctx, (uint8 *) Ui_prev, key_length) < 0 || pg_hmac_final(hmac_ctx, Ui, key_length) < 0) @@ -189,8 +200,7 @@ scram_ServerKey(const uint8 *salted_password, * * The password should already have been processed with SASLprep, if necessary! * - * If iterations is 0, default number of iterations is used. The result is - * palloc'd or malloc'd, so caller is responsible for freeing it. + * The result is palloc'd or malloc'd, so caller is responsible for freeing it. * * On error, returns NULL and sets *errstr to point to a message about the * error details. diff --git a/src/common/sha1.c b/src/common/sha1.c index 29dc55e714ae7..0525c4ff31652 100644 --- a/src/common/sha1.c +++ b/src/common/sha1.c @@ -5,7 +5,7 @@ * * Fallback implementation of SHA1, as specified in RFC 3174. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/common/sha1_int.h b/src/common/sha1_int.h index 0ec2c69a06338..ee56488e574c9 100644 --- a/src/common/sha1_int.h +++ b/src/common/sha1_int.h @@ -3,7 +3,7 @@ * sha1_int.h * Internal headers for fallback implementation of SHA1 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/common/sha2.c b/src/common/sha2.c index 89b28b8d30e46..736634b24be5d 100644 --- a/src/common/sha2.c +++ b/src/common/sha2.c @@ -6,7 +6,7 @@ * This includes the fallback implementation for SHA2 cryptographic * hashes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/common/sha2_int.h b/src/common/sha2_int.h index 954e5d78dcc5c..0e32c651c38b1 100644 --- a/src/common/sha2_int.h +++ b/src/common/sha2_int.h @@ -3,7 +3,7 @@ * sha2_int.h * Internal headers for fallback implementation of SHA{224,256,384,512} * - * Portions Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/sha2_int.h diff --git a/src/common/sprompt.c b/src/common/sprompt.c index 201c8317466ff..27c336f03f37c 100644 --- a/src/common/sprompt.c +++ b/src/common/sprompt.c @@ -3,7 +3,7 @@ * sprompt.c * simple_prompt() routine * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/common/string.c b/src/common/string.c index de97413635506..ce9f2bc7ca592 100644 --- a/src/common/string.c +++ b/src/common/string.c @@ -4,7 +4,7 @@ * string handling helpers * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/common/stringinfo.c b/src/common/stringinfo.c index 05b22b5c53c6a..ec5fc2422d81c 100644 --- a/src/common/stringinfo.c +++ b/src/common/stringinfo.c @@ -7,7 +7,7 @@ * (null-terminated text) or arbitrary binary data. All storage is allocated * with palloc() (falling back to malloc in frontend code). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/common/stringinfo.c @@ -70,10 +70,16 @@ initStringInfo(StringInfo str) * * Reset the StringInfo: the data buffer remains valid, but its * previous content, if any, is cleared. + * + * Read-only StringInfos as initialized by initReadOnlyStringInfo cannot be + * reset. */ void resetStringInfo(StringInfo str) { + /* don't allow resets of read-only StringInfos */ + Assert(str->maxlen != 0); + str->data[0] = '\0'; str->len = 0; str->cursor = 0; @@ -284,6 +290,9 @@ enlargeStringInfo(StringInfo str, int needed) { int newlen; + /* validate this is not a read-only StringInfo */ + Assert(str->maxlen != 0); + /* * Guard against out-of-range "needed" values. Without this, we can get * an overflow or infinite loop in the following. @@ -341,3 +350,19 @@ enlargeStringInfo(StringInfo str, int needed) str->maxlen = newlen; } + +/* + * destroyStringInfo + * + * Frees a StringInfo and its buffer (opposite of makeStringInfo()). + * This must only be called on palloc'd StringInfos. + */ +void +destroyStringInfo(StringInfo str) +{ + /* don't allow destroys of read-only StringInfos */ + Assert(str->maxlen != 0); + + pfree(str->data); + pfree(str); +} diff --git a/src/common/unicode/.gitignore b/src/common/unicode/.gitignore index 46243f701df62..7ff76d73de532 100644 --- a/src/common/unicode/.gitignore +++ b/src/common/unicode/.gitignore @@ -1,9 +1,13 @@ +/case_test +/category_test /norm_test /norm_test_table.h # Downloaded files /CompositionExclusions.txt +/DerivedCoreProperties.txt /DerivedNormalizationProps.txt /EastAsianWidth.txt /NormalizationTest.txt +/PropList.txt /UnicodeData.txt diff --git a/src/common/unicode/Makefile b/src/common/unicode/Makefile index 382da476cf98d..c38ab36b1e4a1 100644 --- a/src/common/unicode/Makefile +++ b/src/common/unicode/Makefile @@ -15,19 +15,33 @@ include $(top_builddir)/src/Makefile.global override CPPFLAGS := -DFRONTEND -I. $(CPPFLAGS) LIBS += $(PTHREAD_LIBS) +LDFLAGS_INTERNAL += $(ICU_LIBS) +CPPFLAGS += $(ICU_CFLAGS) + # By default, do nothing. all: -update-unicode: unicode_norm_table.h unicode_nonspacing_table.h unicode_east_asian_fw_table.h unicode_normprops_table.h unicode_norm_hashfunc.h +update-unicode: unicode_case_table.h unicode_category_table.h unicode_east_asian_fw_table.h unicode_nonspacing_table.h unicode_norm_hashfunc.h unicode_norm_table.h unicode_normprops_table.h unicode_version.h mv $^ $(top_srcdir)/src/include/common/ + $(MAKE) case-check + $(MAKE) category-check $(MAKE) normalization-check # These files are part of the Unicode Character Database. Download # them on demand. The dependency on Makefile.global is for # UNICODE_VERSION. -UnicodeData.txt EastAsianWidth.txt DerivedNormalizationProps.txt CompositionExclusions.txt NormalizationTest.txt: $(top_builddir)/src/Makefile.global +CompositionExclusions.txt DerivedCoreProperties.txt DerivedNormalizationProps.txt EastAsianWidth.txt NormalizationTest.txt PropList.txt UnicodeData.txt: $(top_builddir)/src/Makefile.global $(DOWNLOAD) https://www.unicode.org/Public/$(UNICODE_VERSION)/ucd/$(@F) +unicode_version.h: generate-unicode_version.pl + $(PERL) $< --version $(UNICODE_VERSION) + +unicode_case_table.h: generate-unicode_case_table.pl UnicodeData.txt + $(PERL) $< + +unicode_category_table.h: generate-unicode_category_table.pl DerivedCoreProperties.txt PropList.txt UnicodeData.txt + $(PERL) $< + # Generation of conversion tables used for string normalization with # UTF-8 strings. unicode_norm_hashfunc.h: unicode_norm_table.h @@ -45,9 +59,19 @@ unicode_normprops_table.h: generate-unicode_normprops_table.pl DerivedNormalizat $(PERL) $^ >$@ # Test suite +case-check: case_test + ./case_test + +category-check: category_test + ./category_test + normalization-check: norm_test ./norm_test +case_test: case_test.o ../unicode_case.o | submake-common + +category_test: category_test.o ../unicode_category.o | submake-common + norm_test: norm_test.o ../unicode_norm.o | submake-common norm_test.o: norm_test_table.h @@ -64,9 +88,7 @@ norm_test_table.h: generate-norm_test_table.pl NormalizationTest.txt clean: - rm -f $(OBJS) norm_test norm_test.o + rm -f $(OBJS) case_test case_test.o category_test category_test.o norm_test norm_test.o distclean: clean - rm -f UnicodeData.txt EastAsianWidth.txt CompositionExclusions.txt NormalizationTest.txt norm_test_table.h unicode_norm_table.h - -maintainer-clean: distclean + rm -f CompositionExclusions.txt DerivedCoreProperties.txt DerivedNormalizationProps.txt EastAsianWidth.txt NormalizationTest.txt PropList.txt UnicodeData.txt norm_test_table.h unicode_case_table.h unicode_category_table.h unicode_norm_table.h diff --git a/src/common/unicode/README b/src/common/unicode/README index 56956f6a65fc1..4974c3c885df8 100644 --- a/src/common/unicode/README +++ b/src/common/unicode/README @@ -1,22 +1,35 @@ -This directory contains tools to generate the tables in -src/include/common/unicode_norm.h, used for Unicode normalization. The -generated .h file is included in the source tree, so these are normally not -needed to build PostgreSQL, only if you need to re-generate the .h file -from the Unicode data files for some reason, e.g. to update to a new version -of Unicode. +This directory contains tools to download new Unicode data files and +generate static tables. These tables are used to normalize or +determine various properties of Unicode data. -Generating unicode_norm_table.h -------------------------------- +The generated header files are copied to src/include/common/, and +included in the source tree, so these tools are not normally required +to build PostgreSQL. -Run +Update Unicode Version +---------------------- + +Edit src/Makefile.global.in and src/common/unicode/meson.build +to update the UNICODE_VERSION. + +Then, generate the new header files with: make update-unicode -from the top level of the source tree and commit the result. +or if using meson: + + ninja update-unicode + +from the top level of the source tree. Examine the result to make sure +the changes look reasonable (that is, that the diff size and scope is +comparable to the Unicode changes since the last update), and then +commit it. Tests ----- +Normalization tests: + The Unicode consortium publishes a comprehensive test suite for the normalization algorithm, in a file called NormalizationTest.txt. This directory also contains a perl script and some C code, to run our @@ -26,3 +39,14 @@ To download NormalizationTest.txt and run the tests: make normalization-check This is also run as part of the update-unicode target. + +Category, Property and Case tests: + +The files case_test.c and category_test.c test Unicode categories, +properties, and case mapping by exhaustively comparing results with +ICU. For these tests to be effective, the version of the Unicode data +files must be similar to the version of Unicode on which ICU is +based. Mismatched Unicode versions will cause the tests to skip over +codepoints that are assigned in one version and not the other, and may +falsely report failures. This test is run as a part of the +update-unicode target. diff --git a/src/common/unicode/case_test.c b/src/common/unicode/case_test.c new file mode 100644 index 0000000000000..de92811ec7261 --- /dev/null +++ b/src/common/unicode/case_test.c @@ -0,0 +1,195 @@ +/*------------------------------------------------------------------------- + * case_test.c + * Program to test Unicode case mapping functions. + * + * Portions Copyright (c) 2017-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/common/unicode/case_test.c + * + *------------------------------------------------------------------------- + */ +#include "postgres_fe.h" + +#include +#include +#include +#include +#include + +#ifdef USE_ICU +#include +#endif +#include "common/unicode_case.h" +#include "common/unicode_category.h" +#include "common/unicode_version.h" + +#ifdef USE_ICU + +static void +icu_test_simple(pg_wchar code) +{ + pg_wchar lower = unicode_lowercase_simple(code); + pg_wchar title = unicode_titlecase_simple(code); + pg_wchar upper = unicode_uppercase_simple(code); + pg_wchar iculower = u_tolower(code); + pg_wchar icutitle = u_totitle(code); + pg_wchar icuupper = u_toupper(code); + + if (lower != iculower || title != icutitle || upper != icuupper) + { + printf("case_test: FAILURE for codepoint 0x%06x\n", code); + printf("case_test: Postgres lower/title/upper: 0x%06x/0x%06x/0x%06x\n", + lower, title, upper); + printf("case_test: ICU lower/title/upper: 0x%06x/0x%06x/0x%06x\n", + iculower, icutitle, icuupper); + printf("\n"); + exit(1); + } +} + +/* + * Exhaustively compare case mappings with the results from ICU. + */ +static void +test_icu(void) +{ + int successful = 0; + int skipped_mismatch = 0; + + for (pg_wchar code = 0; code <= 0x10ffff; code++) + { + pg_unicode_category category = unicode_category(code); + + if (category != PG_U_UNASSIGNED) + { + uint8_t icu_category = u_charType(code); + + if (icu_category == PG_U_UNASSIGNED) + { + skipped_mismatch++; + continue; + } + + icu_test_simple(code); + successful++; + } + } + + if (skipped_mismatch > 0) + printf("case_test: skipped %d codepoints unassigned in ICU due to Unicode version mismatch\n", + skipped_mismatch); + + printf("case_test: ICU simple mapping test: %d codepoints successful\n", + successful); +} +#endif + +static void +test_strlower(const char *test_string, const char *expected) +{ + size_t src1len = strlen(test_string); + size_t src2len = -1; /* NUL-terminated */ + size_t dst1len = strlen(expected); + size_t dst2len = strlen(expected) + 1; /* NUL-terminated */ + char *src1 = malloc(src1len); + char *dst1 = malloc(dst1len); + char *src2 = strdup(test_string); + char *dst2 = malloc(dst2len); + size_t needed; + + memcpy(src1, test_string, src1len); /* not NUL-terminated */ + + /* neither source nor destination are NUL-terminated */ + memset(dst1, 0x7F, dst1len); + needed = unicode_strlower(dst1, dst1len, src1, src1len); + if (needed != strlen(expected)) + { + printf("case_test: convert_case test1 FAILURE: needed %zu\n", needed); + exit(1); + } + if (memcmp(dst1, expected, dst1len) != 0) + { + printf("case_test: convert_case test1 FAILURE: test: '%s' result: '%.*s' expected: '%s'\n", + test_string, (int) dst1len, dst1, expected); + exit(1); + } + + /* destination is NUL-terminated and source is not */ + memset(dst2, 0x7F, dst2len); + needed = unicode_strlower(dst2, dst2len, src1, src1len); + if (needed != strlen(expected)) + { + printf("case_test: convert_case test2 FAILURE: needed %zu\n", needed); + exit(1); + } + if (strcmp(dst2, expected) != 0) + { + printf("case_test: convert_case test2 FAILURE: test: '%s' result: '%s' expected: '%s'\n", + test_string, dst2, expected); + exit(1); + } + + /* source is NUL-terminated and destination is not */ + memset(dst1, 0x7F, dst1len); + needed = unicode_strlower(dst1, dst1len, src2, src2len); + if (needed != strlen(expected)) + { + printf("case_test: convert_case test3 FAILURE: needed %zu\n", needed); + exit(1); + } + if (memcmp(dst1, expected, dst1len) != 0) + { + printf("case_test: convert_case test3 FAILURE: test: '%s' result: '%.*s' expected: '%s'\n", + test_string, (int) dst1len, dst1, expected); + exit(1); + } + + /* both source and destination are NUL-terminated */ + memset(dst2, 0x7F, dst2len); + needed = unicode_strlower(dst2, dst2len, src2, src2len); + if (needed != strlen(expected)) + { + printf("case_test: convert_case test4 FAILURE: needed %zu\n", needed); + exit(1); + } + if (strcmp(dst2, expected) != 0) + { + printf("case_test: convert_case test4 FAILURE: test: '%s' result: '%s' expected: '%s'\n", + test_string, dst2, expected); + exit(1); + } + + free(src1); + free(dst1); + free(src2); + free(dst2); +} + +static void +test_convert_case() +{ + /* test string with no case changes */ + test_strlower("√∞", "√∞"); + /* test string with case changes */ + test_strlower("ABC", "abc"); + /* test string with case changes and byte length changes */ + test_strlower("ȺȺȺ", "ⱥⱥⱥ"); + + printf("case_test: convert_case: success\n"); +} + +int +main(int argc, char **argv) +{ + printf("case_test: Postgres Unicode version:\t%s\n", PG_UNICODE_VERSION); +#ifdef USE_ICU + printf("case_test: ICU Unicode version:\t\t%s\n", U_UNICODE_VERSION); + test_icu(); +#else + printf("case_test: ICU not available; skipping\n"); +#endif + + test_convert_case(); + exit(0); +} diff --git a/src/common/unicode/category_test.c b/src/common/unicode/category_test.c new file mode 100644 index 0000000000000..ba6aa7be574a9 --- /dev/null +++ b/src/common/unicode/category_test.c @@ -0,0 +1,236 @@ +/*------------------------------------------------------------------------- + * category_test.c + * Program to test Unicode general category and character properties. + * + * Portions Copyright (c) 2017-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/common/unicode/category_test.c + * + *------------------------------------------------------------------------- + */ +#include "postgres_fe.h" + +#include +#include +#include +#include + +#ifdef USE_ICU +#include +#endif + +#include "common/unicode_category.h" +#include "common/unicode_version.h" + +static int pg_unicode_version = 0; +#ifdef USE_ICU +static int icu_unicode_version = 0; +#endif + +/* + * Parse version into integer for easy comparison. + */ +static int +parse_unicode_version(const char *version) +{ + int n PG_USED_FOR_ASSERTS_ONLY; + int major; + int minor; + + n = sscanf(version, "%d.%d", &major, &minor); + + Assert(n == 2); + Assert(minor < 100); + + return major * 100 + minor; +} + +#ifdef USE_ICU +/* + * Test Postgres Unicode tables by comparing with ICU. Test the General + * Category, as well as the properties Alphabetic, Lowercase, Uppercase, + * White_Space, and Hex_Digit. + */ +static void +icu_test() +{ + int successful = 0; + int pg_skipped_codepoints = 0; + int icu_skipped_codepoints = 0; + + for (pg_wchar code = 0; code <= 0x10ffff; code++) + { + uint8_t pg_category = unicode_category(code); + uint8_t icu_category = u_charType(code); + + /* Property tests */ + bool prop_alphabetic = pg_u_prop_alphabetic(code); + bool prop_lowercase = pg_u_prop_lowercase(code); + bool prop_uppercase = pg_u_prop_uppercase(code); + bool prop_cased = pg_u_prop_cased(code); + bool prop_case_ignorable = pg_u_prop_case_ignorable(code); + bool prop_white_space = pg_u_prop_white_space(code); + bool prop_hex_digit = pg_u_prop_hex_digit(code); + bool prop_join_control = pg_u_prop_join_control(code); + + bool icu_prop_alphabetic = u_hasBinaryProperty(code, UCHAR_ALPHABETIC); + bool icu_prop_lowercase = u_hasBinaryProperty(code, UCHAR_LOWERCASE); + bool icu_prop_uppercase = u_hasBinaryProperty(code, UCHAR_UPPERCASE); + bool icu_prop_cased = u_hasBinaryProperty(code, UCHAR_CASED); + bool icu_prop_case_ignorable = u_hasBinaryProperty(code, UCHAR_CASE_IGNORABLE); + bool icu_prop_white_space = u_hasBinaryProperty(code, UCHAR_WHITE_SPACE); + bool icu_prop_hex_digit = u_hasBinaryProperty(code, UCHAR_HEX_DIGIT); + bool icu_prop_join_control = u_hasBinaryProperty(code, UCHAR_JOIN_CONTROL); + + /* + * Compare with ICU for character classes using: + * + * https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/uchar_8h.html#details + * + * which describes how to use ICU to test for membership in regex + * character classes. + * + * NB: the document suggests testing for some properties such as + * UCHAR_POSIX_ALNUM, but that doesn't mean that we're testing for the + * "POSIX Compatible" character classes. + */ + bool isalpha = pg_u_isalpha(code); + bool islower = pg_u_islower(code); + bool isupper = pg_u_isupper(code); + bool ispunct = pg_u_ispunct(code, false); + bool isdigit = pg_u_isdigit(code, false); + bool isxdigit = pg_u_isxdigit(code, false); + bool isalnum = pg_u_isalnum(code, false); + bool isspace = pg_u_isspace(code); + bool isblank = pg_u_isblank(code); + bool iscntrl = pg_u_iscntrl(code); + bool isgraph = pg_u_isgraph(code); + bool isprint = pg_u_isprint(code); + + bool icu_isalpha = u_isUAlphabetic(code); + bool icu_islower = u_isULowercase(code); + bool icu_isupper = u_isUUppercase(code); + bool icu_ispunct = u_ispunct(code); + bool icu_isdigit = u_isdigit(code); + bool icu_isxdigit = u_hasBinaryProperty(code, + UCHAR_POSIX_XDIGIT); + bool icu_isalnum = u_hasBinaryProperty(code, + UCHAR_POSIX_ALNUM); + bool icu_isspace = u_isUWhiteSpace(code); + bool icu_isblank = u_isblank(code); + bool icu_iscntrl = icu_category == PG_U_CONTROL; + bool icu_isgraph = u_hasBinaryProperty(code, + UCHAR_POSIX_GRAPH); + bool icu_isprint = u_hasBinaryProperty(code, + UCHAR_POSIX_PRINT); + + /* + * A version mismatch means that some assigned codepoints in the newer + * version may be unassigned in the older version. That's OK, though + * the test will not cover those codepoints marked unassigned in the + * older version (that is, it will no longer be an exhaustive test). + */ + if (pg_category == PG_U_UNASSIGNED && + icu_category != PG_U_UNASSIGNED && + pg_unicode_version < icu_unicode_version) + { + pg_skipped_codepoints++; + continue; + } + + if (icu_category == PG_U_UNASSIGNED && + pg_category != PG_U_UNASSIGNED && + icu_unicode_version < pg_unicode_version) + { + icu_skipped_codepoints++; + continue; + } + + if (pg_category != icu_category) + { + printf("category_test: FAILURE for codepoint 0x%06x\n", code); + printf("category_test: Postgres category: %02d %s %s\n", pg_category, + unicode_category_abbrev(pg_category), + unicode_category_string(pg_category)); + printf("category_test: ICU category: %02d %s %s\n", icu_category, + unicode_category_abbrev(icu_category), + unicode_category_string(icu_category)); + printf("\n"); + exit(1); + } + + if (prop_alphabetic != icu_prop_alphabetic || + prop_lowercase != icu_prop_lowercase || + prop_uppercase != icu_prop_uppercase || + prop_cased != icu_prop_cased || + prop_case_ignorable != icu_prop_case_ignorable || + prop_white_space != icu_prop_white_space || + prop_hex_digit != icu_prop_hex_digit || + prop_join_control != icu_prop_join_control) + { + printf("category_test: FAILURE for codepoint 0x%06x\n", code); + printf("category_test: Postgres property alphabetic/lowercase/uppercase/cased/case_ignorable/white_space/hex_digit/join_control: %d/%d/%d/%d/%d/%d/%d/%d\n", + prop_alphabetic, prop_lowercase, prop_uppercase, + prop_cased, prop_case_ignorable, + prop_white_space, prop_hex_digit, prop_join_control); + printf("category_test: ICU property alphabetic/lowercase/uppercase/cased/case_ignorable/white_space/hex_digit/join_control: %d/%d/%d/%d/%d/%d/%d/%d\n", + icu_prop_alphabetic, icu_prop_lowercase, icu_prop_uppercase, + icu_prop_cased, icu_prop_case_ignorable, + icu_prop_white_space, icu_prop_hex_digit, icu_prop_join_control); + printf("\n"); + exit(1); + } + + if (isalpha != icu_isalpha || + islower != icu_islower || + isupper != icu_isupper || + ispunct != icu_ispunct || + isdigit != icu_isdigit || + isxdigit != icu_isxdigit || + isalnum != icu_isalnum || + isspace != icu_isspace || + isblank != icu_isblank || + iscntrl != icu_iscntrl || + isgraph != icu_isgraph || + isprint != icu_isprint) + { + printf("category_test: FAILURE for codepoint 0x%06x\n", code); + printf("category_test: Postgres class alpha/lower/upper/punct/digit/xdigit/alnum/space/blank/cntrl/graph/print: %d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d\n", + isalpha, islower, isupper, ispunct, isdigit, isxdigit, isalnum, isspace, isblank, iscntrl, isgraph, isprint); + printf("category_test: ICU class alpha/lower/upper/punct/digit/xdigit/alnum/space/blank/cntrl/graph/print: %d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d/%d\n", + icu_isalpha, icu_islower, icu_isupper, icu_ispunct, icu_isdigit, icu_isxdigit, icu_isalnum, icu_isspace, icu_isblank, icu_iscntrl, icu_isgraph, icu_isprint); + printf("\n"); + exit(1); + } + + if (pg_category != PG_U_UNASSIGNED) + successful++; + } + + if (pg_skipped_codepoints > 0) + printf("category_test: skipped %d codepoints unassigned in Postgres due to Unicode version mismatch\n", + pg_skipped_codepoints); + if (icu_skipped_codepoints > 0) + printf("category_test: skipped %d codepoints unassigned in ICU due to Unicode version mismatch\n", + icu_skipped_codepoints); + + printf("category_test: ICU test: %d codepoints successful\n", successful); +} +#endif + +int +main(int argc, char **argv) +{ + pg_unicode_version = parse_unicode_version(PG_UNICODE_VERSION); + printf("category_test: Postgres Unicode version:\t%s\n", PG_UNICODE_VERSION); + +#ifdef USE_ICU + icu_unicode_version = parse_unicode_version(U_UNICODE_VERSION); + printf("category_test: ICU Unicode version:\t\t%s\n", U_UNICODE_VERSION); + + icu_test(); +#else + printf("category_test: ICU not available; skipping\n"); +#endif +} diff --git a/src/common/unicode/generate-norm_test_table.pl b/src/common/unicode/generate-norm_test_table.pl index 3434f7e2630ba..610fac57cf33f 100644 --- a/src/common/unicode/generate-norm_test_table.pl +++ b/src/common/unicode/generate-norm_test_table.pl @@ -5,10 +5,10 @@ # # NormalizationTest.txt is part of the Unicode Character Database. # -# Copyright (c) 2000-2023, PostgreSQL Global Development Group +# Copyright (c) 2000-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use File::Basename; @@ -30,7 +30,7 @@ * norm_test_table.h * Test strings for Unicode normalization. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/common/unicode/norm_test_table.h diff --git a/src/common/unicode/generate-unicode_case_table.pl b/src/common/unicode/generate-unicode_case_table.pl new file mode 100644 index 0000000000000..508b05af8e9e1 --- /dev/null +++ b/src/common/unicode/generate-unicode_case_table.pl @@ -0,0 +1,134 @@ +#!/usr/bin/perl +# +# Generate Unicode character case mappings. Does not include tailoring +# or locale-specific mappings. +# +# Input: UnicodeData.txt +# Output: unicode_case_table.h +# +# Copyright (c) 2000-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use Getopt::Long; + +use FindBin; +use lib "$FindBin::RealBin/../../tools/"; + +my $output_path = '.'; + +GetOptions('outdir:s' => \$output_path); + +my $output_table_file = "$output_path/unicode_case_table.h"; + +my $FH; + +my %simple = (); + +open($FH, '<', "$output_path/UnicodeData.txt") + or die "Could not open $output_path/UnicodeData.txt: $!."; +while (my $line = <$FH>) +{ + my @elts = split(';', $line); + my $code = hex($elts[0]); + my $simple_uppercase = hex($elts[12] =~ s/^\s+|\s+$//rg); + my $simple_lowercase = hex($elts[13] =~ s/^\s+|\s+$//rg); + my $simple_titlecase = hex($elts[14] =~ s/^\s+|\s+$//rg); + + die "codepoint $code out of range" if $code > 0x10FFFF; + die "Simple_Lowercase $code out of range" if $simple_lowercase > 0x10FFFF; + die "Simple_Titlecase $code out of range" if $simple_titlecase > 0x10FFFF; + die "Simple_Uppercase $code out of range" if $simple_uppercase > 0x10FFFF; + + if ($simple_lowercase || $simple_titlecase || $simple_uppercase) + { + $simple{$code} = { + Simple_Lowercase => ($simple_lowercase || $code), + Simple_Titlecase => ($simple_titlecase || $code), + Simple_Uppercase => ($simple_uppercase || $code) + }; + } +} +close $FH; + +# Start writing out the output files +open my $OT, '>', $output_table_file + or die "Could not open output file $output_table_file: $!\n"; + +# determine size of array given that codepoints <= 0x80 are dense and +# the rest of the entries are sparse +my $num_simple = 0x80; +foreach my $code (sort { $a <=> $b } (keys %simple)) +{ + $num_simple++ unless $code < 0x80; +} + +print $OT <<"EOS"; +/*------------------------------------------------------------------------- + * + * unicode_case_table.h + * Case mapping and information table. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/common/unicode_case_table.h + * + *------------------------------------------------------------------------- + */ + +/* + * File auto-generated by src/common/unicode/generate-unicode_case_table.pl, + * do not edit. There is deliberately not an #ifndef PG_UNICODE_CASE_TABLE_H + * here. + */ + +#include "common/unicode_case.h" +#include "mb/pg_wchar.h" + +typedef enum +{ + CaseLower = 0, + CaseTitle = 1, + CaseUpper = 2, + NCaseKind +} CaseKind; + +typedef struct +{ + pg_wchar codepoint; /* Unicode codepoint */ + pg_wchar simplemap[NCaseKind]; +} pg_case_map; + +/* + * Case mapping table. Dense for codepoints < 0x80 (enabling fast lookup), + * sparse for higher codepoints (requiring scan or binary search). + */ +static const pg_case_map case_map[$num_simple] = +{ +EOS + +printf $OT "\t/* begin dense entries for codepoints < 0x80 */\n"; +for (my $code = 0; $code < 0x80; $code++) +{ + my $lc = ($simple{$code}{Simple_Lowercase} || $code); + my $tc = ($simple{$code}{Simple_Titlecase} || $code); + my $uc = ($simple{$code}{Simple_Uppercase} || $code); + printf $OT + "\t{0x%06x, {[CaseLower] = 0x%06x,[CaseTitle] = 0x%06x,[CaseUpper] = 0x%06x}},\n", + $code, $lc, $tc, $uc; +} +printf $OT "\n"; + +printf $OT "\t/* begin sparse entries for codepoints >= 0x80 */\n"; +foreach my $code (sort { $a <=> $b } (keys %simple)) +{ + next unless $code >= 0x80; # already output above + + my $map = $simple{$code}; + printf $OT + "\t{0x%06x, {[CaseLower] = 0x%06x,[CaseTitle] = 0x%06x,[CaseUpper] = 0x%06x}},\n", + $code, $map->{Simple_Lowercase}, $map->{Simple_Titlecase}, + $map->{Simple_Uppercase}; +} +print $OT "};\n"; diff --git a/src/common/unicode/generate-unicode_category_table.pl b/src/common/unicode/generate-unicode_category_table.pl new file mode 100644 index 0000000000000..12914c0243399 --- /dev/null +++ b/src/common/unicode/generate-unicode_category_table.pl @@ -0,0 +1,523 @@ +#!/usr/bin/perl +# +# Generate a code point category table and its lookup utilities, using +# Unicode data files as input. +# +# Input: UnicodeData.txt +# Output: unicode_category_table.h +# +# Copyright (c) 2000-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use Getopt::Long; + +use FindBin; +use lib "$FindBin::RealBin/../../tools/"; + +my $CATEGORY_UNASSIGNED = 'Cn'; + +my $output_path = '.'; + +GetOptions('outdir:s' => \$output_path); + +my $output_table_file = "$output_path/unicode_category_table.h"; + +my $FH; + +# create a table of all codepoints < 0x80 and their associated +# categories and properties for fast lookups +my %opt_ascii = (); + +# Read entries from UnicodeData.txt into a list of codepoint ranges +# and their general category. +my @category_ranges = (); +my $range_start = undef; +my $range_end = undef; +my $range_category = undef; + +# If between a "<..., First>" entry and a "<..., Last>" entry, the gap in +# codepoints represents a range, and $gap_category is equal to the +# category for both (which must match). Otherwise, the gap represents +# unassigned code points. +my $gap_category = undef; + +open($FH, '<', "$output_path/UnicodeData.txt") + or die "Could not open $output_path/UnicodeData.txt: $!."; +while (my $line = <$FH>) +{ + my @elts = split(';', $line); + my $code = hex($elts[0]); + my $name = $elts[1]; + my $category = $elts[2]; + + die "codepoint out of range" if $code > 0x10FFFF; + die "unassigned codepoint in UnicodeData.txt" + if $category eq $CATEGORY_UNASSIGNED; + + if ($code < 0x80) + { + my @properties = (); + # No ASCII characters have category Titlecase_Letter, + # but include here for completeness. + push @properties, "PG_U_PROP_CASED" if ($category eq 'Lt'); + $opt_ascii{$code} = { + Category => $category, + Properties => \@properties + }; + } + + if (!defined($range_start)) + { + my $code_str = sprintf "0x%06x", $code; + die + if defined($range_end) + || defined($range_category) + || defined($gap_category); + die "unexpected first entry <..., Last>" if ($name =~ /Last>/); + die "expected 0x000000 for first entry, got $code_str" + if $code != 0x000000; + + # initialize + $range_start = $code; + $range_end = $code; + $range_category = $category; + if ($name =~ /<.*, First>$/) + { + $gap_category = $category; + } + else + { + $gap_category = $CATEGORY_UNASSIGNED; + } + next; + } + + # Gap in codepoints detected. If it's a different category than + # the current range, emit the current range and initialize a new + # range representing the gap. + if ($range_end + 1 != $code && $range_category ne $gap_category) + { + if ($range_category ne $CATEGORY_UNASSIGNED) + { + push( + @category_ranges, + { + start => $range_start, + end => $range_end, + category => $range_category + }); + } + $range_start = $range_end + 1; + $range_end = $code - 1; + $range_category = $gap_category; + } + + # different category; new range + if ($range_category ne $category) + { + if ($range_category ne $CATEGORY_UNASSIGNED) + { + push( + @category_ranges, + { + start => $range_start, + end => $range_end, + category => $range_category + }); + } + $range_start = $code; + $range_end = $code; + $range_category = $category; + } + + if ($name =~ /<.*, First>$/) + { + die + "<..., First> entry unexpectedly follows another <..., First> entry" + if $gap_category ne $CATEGORY_UNASSIGNED; + $gap_category = $category; + } + elsif ($name =~ /<.*, Last>$/) + { + die + "<..., First> and <..., Last> entries have mismatching general category" + if $gap_category ne $category; + $gap_category = $CATEGORY_UNASSIGNED; + } + else + { + die "unexpected entry found between <..., First> and <..., Last>" + if $gap_category ne $CATEGORY_UNASSIGNED; + } + + $range_end = $code; +} +close $FH; + +die "<..., First> entry with no corresponding <..., Last> entry" + if $gap_category ne $CATEGORY_UNASSIGNED; + +# emit final range +if ($range_category ne $CATEGORY_UNASSIGNED) +{ + push( + @category_ranges, + { + start => $range_start, + end => $range_end, + category => $range_category + }); +} + +# See: https://www.unicode.org/reports/tr44/#General_Category_Values +my $categories = { + Cn => 'PG_U_UNASSIGNED', + Lu => 'PG_U_UPPERCASE_LETTER', + Ll => 'PG_U_LOWERCASE_LETTER', + Lt => 'PG_U_TITLECASE_LETTER', + Lm => 'PG_U_MODIFIER_LETTER', + Lo => 'PG_U_OTHER_LETTER', + Mn => 'PG_U_NONSPACING_MARK', + Me => 'PG_U_ENCLOSING_MARK', + Mc => 'PG_U_SPACING_MARK', + Nd => 'PG_U_DECIMAL_NUMBER', + Nl => 'PG_U_LETTER_NUMBER', + No => 'PG_U_OTHER_NUMBER', + Zs => 'PG_U_SPACE_SEPARATOR', + Zl => 'PG_U_LINE_SEPARATOR', + Zp => 'PG_U_PARAGRAPH_SEPARATOR', + Cc => 'PG_U_CONTROL', + Cf => 'PG_U_FORMAT', + Co => 'PG_U_PRIVATE_USE', + Cs => 'PG_U_SURROGATE', + Pd => 'PG_U_DASH_PUNCTUATION', + Ps => 'PG_U_OPEN_PUNCTUATION', + Pe => 'PG_U_CLOSE_PUNCTUATION', + Pc => 'PG_U_CONNECTOR_PUNCTUATION', + Po => 'PG_U_OTHER_PUNCTUATION', + Sm => 'PG_U_MATH_SYMBOL', + Sc => 'PG_U_CURRENCY_SYMBOL', + Sk => 'PG_U_MODIFIER_SYMBOL', + So => 'PG_U_OTHER_SYMBOL', + Pi => 'PG_U_INITIAL_PUNCTUATION', + Pf => 'PG_U_FINAL_PUNCTUATION' +}; + +# Find White_Space and Hex_Digit characters +my @white_space = (); +my @hex_digits = (); +my @join_control = (); +open($FH, '<', "$output_path/PropList.txt") + or die "Could not open $output_path/PropList.txt: $!."; +while (my $line = <$FH>) +{ + my $pattern = qr/([0-9A-F\.]+)\s*;\s*(\w+)\s*#.*/s; + next unless $line =~ $pattern; + + my $code = $line =~ s/$pattern/$1/rg; + my $property = $line =~ s/$pattern/$2/rg; + my $start; + my $end; + + if ($code =~ /\.\./) + { + # code range + my @sp = split /\.\./, $code; + $start = hex($sp[0]); + $end = hex($sp[1]); + } + else + { + # single code point + $start = hex($code); + $end = hex($code); + } + + if ($property eq "White_Space") + { + push @white_space, { start => $start, end => $end }; + for (my $i = $start; $i <= $end && $i < 0x80; $i++) + { + push @{ $opt_ascii{$i}{Properties} }, "PG_U_PROP_WHITE_SPACE"; + } + } + elsif ($property eq "Hex_Digit") + { + push @hex_digits, { start => $start, end => $end }; + for (my $i = $start; $i <= $end && $i < 0x80; $i++) + { + push @{ $opt_ascii{$i}{Properties} }, "PG_U_PROP_HEX_DIGIT"; + } + } + elsif ($property eq "Join_Control") + { + push @join_control, { start => $start, end => $end }; + for (my $i = $start; $i <= $end && $i < 0x80; $i++) + { + push @{ $opt_ascii{$i}{Properties} }, "PG_U_PROP_JOIN_CONTROL"; + } + } +} + +# Find Alphabetic, Lowercase, and Uppercase characters +my @alphabetic = (); +my @lowercase = (); +my @uppercase = (); +my @case_ignorable = (); +open($FH, '<', "$output_path/DerivedCoreProperties.txt") + or die "Could not open $output_path/DerivedCoreProperties.txt: $!."; +while (my $line = <$FH>) +{ + my $pattern = qr/^([0-9A-F\.]+)\s*;\s*(\w+)\s*#.*$/s; + next unless $line =~ $pattern; + + my $code = $line =~ s/$pattern/$1/rg; + my $property = $line =~ s/$pattern/$2/rg; + my $start; + my $end; + + if ($code =~ /\.\./) + { + # code range + my @sp = split /\.\./, $code; + die "line: {$line} code: {$code} sp[0] {$sp[0]} sp[1] {$sp[1]}" + unless $sp[0] =~ /^[0-9A-F]+$/ && $sp[1] =~ /^[0-9A-F]+$/; + $start = hex($sp[0]); + $end = hex($sp[1]); + } + else + { + die "line: {$line} code: {$code}" unless $code =~ /^[0-9A-F]+$/; + # single code point + $start = hex($code); + $end = hex($code); + } + + if ($property eq "Alphabetic") + { + push @alphabetic, { start => $start, end => $end }; + for (my $i = $start; $i <= $end && $i < 0x80; $i++) + { + push @{ $opt_ascii{$i}{Properties} }, "PG_U_PROP_ALPHABETIC"; + } + } + elsif ($property eq "Lowercase") + { + push @lowercase, { start => $start, end => $end }; + for (my $i = $start; $i <= $end && $i < 0x80; $i++) + { + push @{ $opt_ascii{$i}{Properties} }, "PG_U_PROP_LOWERCASE"; + push @{ $opt_ascii{$i}{Properties} }, "PG_U_PROP_CASED"; + } + } + elsif ($property eq "Uppercase") + { + push @uppercase, { start => $start, end => $end }; + for (my $i = $start; $i <= $end && $i < 0x80; $i++) + { + push @{ $opt_ascii{$i}{Properties} }, "PG_U_PROP_UPPERCASE"; + push @{ $opt_ascii{$i}{Properties} }, "PG_U_PROP_CASED"; + } + } + elsif ($property eq "Case_Ignorable") + { + push @case_ignorable, { start => $start, end => $end }; + for (my $i = $start; $i <= $end && $i < 0x80; $i++) + { + push @{ $opt_ascii{$i}{Properties} }, "PG_U_PROP_CASE_IGNORABLE"; + } + } +} + +my $num_category_ranges = scalar @category_ranges; +my $num_alphabetic_ranges = scalar @alphabetic; +my $num_lowercase_ranges = scalar @lowercase; +my $num_uppercase_ranges = scalar @uppercase; +my $num_case_ignorable_ranges = scalar @case_ignorable; +my $num_white_space_ranges = scalar @white_space; +my $num_hex_digit_ranges = scalar @hex_digits; +my $num_join_control_ranges = scalar @join_control; + +# Start writing out the output file +open my $OT, '>', $output_table_file + or die "Could not open output file $output_table_file: $!\n"; + +print $OT <<"EOS"; +/*------------------------------------------------------------------------- + * + * unicode_category_table.h + * Category table for Unicode character classification. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/common/unicode_category_table.h + * + *------------------------------------------------------------------------- + */ + +#include "common/unicode_category.h" + +/* + * File auto-generated by src/common/unicode/generate-unicode_category_table.pl, + * do not edit. There is deliberately not an #ifndef PG_UNICODE_CATEGORY_TABLE_H + * here. + */ +typedef struct +{ + uint32 first; /* Unicode codepoint */ + uint32 last; /* Unicode codepoint */ + uint8 category; /* General Category */ +} pg_category_range; + +typedef struct +{ + uint32 first; /* Unicode codepoint */ + uint32 last; /* Unicode codepoint */ +} pg_unicode_range; + +typedef struct +{ + uint8 category; + uint8 properties; +} pg_unicode_properties; + +/* + * The properties currently used, in no particular order. Fits in a uint8, but + * if more properties are added, a wider integer will be needed. + */ +#define PG_U_PROP_ALPHABETIC (1 << 0) +#define PG_U_PROP_LOWERCASE (1 << 1) +#define PG_U_PROP_UPPERCASE (1 << 2) +#define PG_U_PROP_CASED (1 << 3) +#define PG_U_PROP_CASE_IGNORABLE (1 << 4) +#define PG_U_PROP_WHITE_SPACE (1 << 5) +#define PG_U_PROP_JOIN_CONTROL (1 << 6) +#define PG_U_PROP_HEX_DIGIT (1 << 7) + +EOS + +print $OT <<"EOS"; +/* table for fast lookup of ASCII codepoints */ +static const pg_unicode_properties unicode_opt_ascii[128] = +{ +EOS + +for (my $i = 0; $i < 128; $i++) +{ + my $category_str = $categories->{ $opt_ascii{$i}->{Category} }; + my $props_str = (join ' | ', @{ $opt_ascii{$i}{Properties} }) || "0"; + printf $OT + "\t{\n\t\t/* 0x%06x */\n\t\t.category = %s,\n\t\t.properties = %s\n\t},\n", + $i, $category_str, $props_str; +} + +print $OT "};\n\n"; + +print $OT <<"EOS"; +/* table of Unicode codepoint ranges and their categories */ +static const pg_category_range unicode_categories[$num_category_ranges] = +{ +EOS + +foreach my $range (@category_ranges) +{ + my $category = $categories->{ $range->{category} }; + die "category missing: $range->{category}" unless $category; + printf $OT "\t{0x%06x, 0x%06x, %s},\n", $range->{start}, $range->{end}, + $category; +} + +print $OT "};\n\n"; + +print $OT <<"EOS"; +/* table of Unicode codepoint ranges of Alphabetic characters */ +static const pg_unicode_range unicode_alphabetic[$num_alphabetic_ranges] = +{ +EOS + +foreach my $range (@alphabetic) +{ + printf $OT "\t{0x%06x, 0x%06x},\n", $range->{start}, $range->{end}; +} + +print $OT "};\n\n"; + +print $OT <<"EOS"; +/* table of Unicode codepoint ranges of Lowercase characters */ +static const pg_unicode_range unicode_lowercase[$num_lowercase_ranges] = +{ +EOS + +foreach my $range (@lowercase) +{ + printf $OT "\t{0x%06x, 0x%06x},\n", $range->{start}, $range->{end}; +} + +print $OT "};\n\n"; + +print $OT <<"EOS"; +/* table of Unicode codepoint ranges of Uppercase characters */ +static const pg_unicode_range unicode_uppercase[$num_uppercase_ranges] = +{ +EOS + +foreach my $range (@uppercase) +{ + printf $OT "\t{0x%06x, 0x%06x},\n", $range->{start}, $range->{end}; +} + +print $OT "};\n\n"; + +print $OT <<"EOS"; +/* table of Unicode codepoint ranges of Case_Ignorable characters */ +static const pg_unicode_range unicode_case_ignorable[$num_case_ignorable_ranges] = +{ +EOS + +foreach my $range (@case_ignorable) +{ + printf $OT "\t{0x%06x, 0x%06x},\n", $range->{start}, $range->{end}; +} + +print $OT "};\n\n"; + +print $OT <<"EOS"; +/* table of Unicode codepoint ranges of White_Space characters */ +static const pg_unicode_range unicode_white_space[$num_white_space_ranges] = +{ +EOS + +foreach my $range (@white_space) +{ + printf $OT "\t{0x%06x, 0x%06x},\n", $range->{start}, $range->{end}; +} + +print $OT "};\n\n"; + +print $OT <<"EOS"; +/* table of Unicode codepoint ranges of Hex_Digit characters */ +static const pg_unicode_range unicode_hex_digit[$num_hex_digit_ranges] = +{ +EOS + +foreach my $range (@hex_digits) +{ + printf $OT "\t{0x%06x, 0x%06x},\n", $range->{start}, $range->{end}; +} + +print $OT "};\n\n"; + +print $OT <<"EOS"; +/* table of Unicode codepoint ranges of Join_Control characters */ +static const pg_unicode_range unicode_join_control[$num_join_control_ranges] = +{ +EOS + +foreach my $range (@join_control) +{ + printf $OT "\t{0x%06x, 0x%06x},\n", $range->{start}, $range->{end}; +} + +print $OT "};\n"; diff --git a/src/common/unicode/generate-unicode_east_asian_fw_table.pl b/src/common/unicode/generate-unicode_east_asian_fw_table.pl index 2b2df375edfc5..05fb0cfa8002f 100644 --- a/src/common/unicode/generate-unicode_east_asian_fw_table.pl +++ b/src/common/unicode/generate-unicode_east_asian_fw_table.pl @@ -4,10 +4,10 @@ # and East Asian Fullwidth (F) characters, using Unicode data files as input. # Pass EastAsianWidth.txt as argument. The output is on stdout. # -# Copyright (c) 2019-2023, PostgreSQL Global Development Group +# Copyright (c) 2019-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; my $range_start = undef; my ($first, $last); @@ -23,7 +23,7 @@ chomp $line; $line =~ s/\s*#.*$//; next if $line eq ''; - my ($codepoint, $width) = split ';', $line; + my ($codepoint, $width) = split /\s*;\s*/, $line; if ($codepoint =~ /\.\./) { diff --git a/src/common/unicode/generate-unicode_nonspacing_table.pl b/src/common/unicode/generate-unicode_nonspacing_table.pl index ae86e82922f31..04adbaed71fd2 100644 --- a/src/common/unicode/generate-unicode_nonspacing_table.pl +++ b/src/common/unicode/generate-unicode_nonspacing_table.pl @@ -4,10 +4,10 @@ # characters, using Unicode data files as input. Pass UnicodeData.txt # as argument. The output is on stdout. # -# Copyright (c) 2019-2023, PostgreSQL Global Development Group +# Copyright (c) 2019-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; my $range_start = undef; my $codepoint; diff --git a/src/common/unicode/generate-unicode_norm_table.pl b/src/common/unicode/generate-unicode_norm_table.pl index d5914118abfff..456c64aa39488 100644 --- a/src/common/unicode/generate-unicode_norm_table.pl +++ b/src/common/unicode/generate-unicode_norm_table.pl @@ -6,10 +6,10 @@ # Input: UnicodeData.txt and CompositionExclusions.txt # Output: unicode_norm_table.h and unicode_norm_hashfunc.h # -# Copyright (c) 2000-2023, PostgreSQL Global Development Group +# Copyright (c) 2000-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use Getopt::Long; use FindBin; @@ -88,7 +88,7 @@ * unicode_norm_table.h * Composition table used for Unicode normalization * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/unicode_norm_table.h @@ -131,7 +131,7 @@ * unicode_norm_hashfunc.h * Perfect hash functions used for Unicode normalization * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/unicode_norm_hashfunc.h diff --git a/src/common/unicode/generate-unicode_normprops_table.pl b/src/common/unicode/generate-unicode_normprops_table.pl index 1b7473180b335..acc4be7559d65 100644 --- a/src/common/unicode/generate-unicode_normprops_table.pl +++ b/src/common/unicode/generate-unicode_normprops_table.pl @@ -4,10 +4,10 @@ # (see UAX #15). Pass DerivedNormalizationProps.txt as argument. The # output is on stdout. # -# Copyright (c) 2020-2023, PostgreSQL Global Development Group +# Copyright (c) 2020-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use FindBin; use lib "$FindBin::RealBin/../../tools/"; diff --git a/src/common/unicode/generate-unicode_version.pl b/src/common/unicode/generate-unicode_version.pl new file mode 100644 index 0000000000000..d98ab0d9561a8 --- /dev/null +++ b/src/common/unicode/generate-unicode_version.pl @@ -0,0 +1,47 @@ +#!/usr/bin/perl +# +# Generate header file with Unicode version used by Postgres. +# +# Output: unicode_version.h +# +# Copyright (c) 2000-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use Getopt::Long; + +use FindBin; +use lib "$FindBin::RealBin/../../tools/"; + +my $output_path = '.'; +my $version_str = undef; + +GetOptions('outdir:s' => \$output_path, 'version:s' => \$version_str); + +my @version_parts = split /\./, $version_str; + +my $unicode_version_str = sprintf "%d.%d", $version_parts[0], + $version_parts[1]; + +my $output_file = "$output_path/unicode_version.h"; + +# Start writing out the output files +open my $OT, '>', $output_file + or die "Could not open output file $output_file: $!\n"; + +print $OT <simplemap[CaseLower] : code; +} + +pg_wchar +unicode_titlecase_simple(pg_wchar code) +{ + const pg_case_map *map = find_case_map(code); + + return map ? map->simplemap[CaseTitle] : code; +} + +pg_wchar +unicode_uppercase_simple(pg_wchar code) +{ + const pg_case_map *map = find_case_map(code); + + return map ? map->simplemap[CaseUpper] : code; +} + +/* + * unicode_strlower() + * + * Convert src to lowercase, and return the result length (not including + * terminating NUL). + * + * String src must be encoded in UTF-8. If srclen < 0, src must be + * NUL-terminated. + * + * Result string is stored in dst, truncating if larger than dstsize. If + * dstsize is greater than the result length, dst will be NUL-terminated; + * otherwise not. + * + * If dstsize is zero, dst may be NULL. This is useful for calculating the + * required buffer size before allocating. + */ +size_t +unicode_strlower(char *dst, size_t dstsize, const char *src, ssize_t srclen) +{ + return convert_case(dst, dstsize, src, srclen, CaseLower, NULL, NULL); +} + +/* + * unicode_strtitle() + * + * Convert src to titlecase, and return the result length (not including + * terminating NUL). + * + * String src must be encoded in UTF-8. If srclen < 0, src must be + * NUL-terminated. + * + * Result string is stored in dst, truncating if larger than dstsize. If + * dstsize is greater than the result length, dst will be NUL-terminated; + * otherwise not. + * + * If dstsize is zero, dst may be NULL. This is useful for calculating the + * required buffer size before allocating. + * + * Titlecasing requires knowledge about word boundaries, which is provided by + * the callback wbnext. A word boundary is the offset of the start of a word + * or the offset of the character immediately following a word. + * + * The caller is expected to initialize and free the callback state + * wbstate. The callback should first return offset 0 for the first boundary; + * then the offset of each subsequent word boundary; then the total length of + * the string to indicate the final boundary. + */ +size_t +unicode_strtitle(char *dst, size_t dstsize, const char *src, ssize_t srclen, + WordBoundaryNext wbnext, void *wbstate) +{ + return convert_case(dst, dstsize, src, srclen, CaseTitle, wbnext, + wbstate); +} + +/* + * unicode_strupper() + * + * Convert src to uppercase, and return the result length (not including + * terminating NUL). + * + * String src must be encoded in UTF-8. If srclen < 0, src must be + * NUL-terminated. + * + * Result string is stored in dst, truncating if larger than dstsize. If + * dstsize is greater than the result length, dst will be NUL-terminated; + * otherwise not. + * + * If dstsize is zero, dst may be NULL. This is useful for calculating the + * required buffer size before allocating. + */ +size_t +unicode_strupper(char *dst, size_t dstsize, const char *src, ssize_t srclen) +{ + return convert_case(dst, dstsize, src, srclen, CaseUpper, NULL, NULL); +} + +/* + * If str_casekind is CaseLower or CaseUpper, map each character in the string + * for which a mapping is available. + * + * If str_casekind is CaseTitle, maps characters found on a word boundary to + * uppercase and other characters to lowercase. + */ +static size_t +convert_case(char *dst, size_t dstsize, const char *src, ssize_t srclen, + CaseKind str_casekind, WordBoundaryNext wbnext, void *wbstate) +{ + /* character CaseKind varies while titlecasing */ + CaseKind chr_casekind = str_casekind; + size_t srcoff = 0; + size_t result_len = 0; + size_t boundary = 0; + + Assert((str_casekind == CaseTitle && wbnext && wbstate) || + (str_casekind != CaseTitle && !wbnext && !wbstate)); + + if (str_casekind == CaseTitle) + { + boundary = wbnext(wbstate); + Assert(boundary == 0); /* start of text is always a boundary */ + } + + while ((srclen < 0 || srcoff < srclen) && src[srcoff] != '\0') + { + pg_wchar u1 = utf8_to_unicode((unsigned char *) src + srcoff); + int u1len = unicode_utf8len(u1); + const pg_case_map *casemap = find_case_map(u1); + + if (str_casekind == CaseTitle) + { + if (srcoff == boundary) + { + chr_casekind = CaseUpper; + boundary = wbnext(wbstate); + } + else + chr_casekind = CaseLower; + } + + /* perform mapping, update result_len, and write to dst */ + if (casemap) + { + pg_wchar u2 = casemap->simplemap[chr_casekind]; + pg_wchar u2len = unicode_utf8len(u2); + + if (result_len + u2len <= dstsize) + unicode_to_utf8(u2, (unsigned char *) dst + result_len); + + result_len += u2len; + } + else + { + /* no mapping; copy bytes from src */ + if (result_len + u1len <= dstsize) + memcpy(dst + result_len, src + srcoff, u1len); + + result_len += u1len; + } + + srcoff += u1len; + } + + if (result_len < dstsize) + dst[result_len] = '\0'; + + return result_len; +} + +/* find entry in simple case map, if any */ +static const pg_case_map * +find_case_map(pg_wchar ucs) +{ + int min; + int mid; + int max; + + /* all chars <= 0x80 are stored in array for fast lookup */ + Assert(lengthof(case_map) >= 0x80); + if (ucs < 0x80) + { + const pg_case_map *map = &case_map[ucs]; + + Assert(map->codepoint == ucs); + return map; + } + + /* otherwise, binary search */ + min = 0x80; + max = lengthof(case_map) - 1; + while (max >= min) + { + mid = (min + max) / 2; + if (ucs > case_map[mid].codepoint) + min = mid + 1; + else if (ucs < case_map[mid].codepoint) + max = mid - 1; + else + return &case_map[mid]; + } + + return NULL; +} diff --git a/src/common/unicode_category.c b/src/common/unicode_category.c new file mode 100644 index 0000000000000..a615a9056787c --- /dev/null +++ b/src/common/unicode_category.c @@ -0,0 +1,501 @@ +/*------------------------------------------------------------------------- + * unicode_category.c + * Determine general category and character properties of Unicode + * characters. Encoding must be UTF8, where we assume that the pg_wchar + * representation is a code point. + * + * Portions Copyright (c) 2017-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/common/unicode_category.c + * + *------------------------------------------------------------------------- + */ +#ifndef FRONTEND +#include "postgres.h" +#else +#include "postgres_fe.h" +#endif + +#include "common/unicode_category.h" +#include "common/unicode_category_table.h" + +/* + * Create bitmasks from pg_unicode_category values for efficient comparison of + * multiple categories. For instance, PG_U_MN_MASK is a bitmask representing + * the general category Mn; and PG_U_M_MASK represents general categories Mn, + * Me, and Mc. + * + * The number of Unicode General Categories should never grow, so a 32-bit + * mask is fine. + */ +#define PG_U_CATEGORY_MASK(X) ((uint32)(1 << (X))) + +#define PG_U_LU_MASK PG_U_CATEGORY_MASK(PG_U_UPPERCASE_LETTER) +#define PG_U_LL_MASK PG_U_CATEGORY_MASK(PG_U_LOWERCASE_LETTER) +#define PG_U_LT_MASK PG_U_CATEGORY_MASK(PG_U_TITLECASE_LETTER) +#define PG_U_LC_MASK (PG_U_LU_MASK|PG_U_LL_MASK|PG_U_LT_MASK) +#define PG_U_LM_MASK PG_U_CATEGORY_MASK(PG_U_MODIFIER_LETTER) +#define PG_U_LO_MASK PG_U_CATEGORY_MASK(PG_U_OTHER_LETTER) +#define PG_U_L_MASK (PG_U_LU_MASK|PG_U_LL_MASK|PG_U_LT_MASK|PG_U_LM_MASK|\ + PG_U_LO_MASK) +#define PG_U_MN_MASK PG_U_CATEGORY_MASK(PG_U_NONSPACING_MARK) +#define PG_U_ME_MASK PG_U_CATEGORY_MASK(PG_U_ENCLOSING_MARK) +#define PG_U_MC_MASK PG_U_CATEGORY_MASK(PG_U_SPACING_MARK) +#define PG_U_M_MASK (PG_U_MN_MASK|PG_U_MC_MASK|PG_U_ME_MASK) +#define PG_U_ND_MASK PG_U_CATEGORY_MASK(PG_U_DECIMAL_NUMBER) +#define PG_U_NL_MASK PG_U_CATEGORY_MASK(PG_U_LETTER_NUMBER) +#define PG_U_NO_MASK PG_U_CATEGORY_MASK(PG_U_OTHER_NUMBER) +#define PG_U_N_MASK (PG_U_ND_MASK|PG_U_NL_MASK|PG_U_NO_MASK) +#define PG_U_PC_MASK PG_U_CATEGORY_MASK(PG_U_CONNECTOR_PUNCTUATION) +#define PG_U_PD_MASK PG_U_CATEGORY_MASK(PG_U_DASH_PUNCTUATION) +#define PG_U_PS_MASK PG_U_CATEGORY_MASK(PG_U_OPEN_PUNCTUATION) +#define PG_U_PE_MASK PG_U_CATEGORY_MASK(PG_U_CLOSE_PUNCTUATION) +#define PG_U_PI_MASK PG_U_CATEGORY_MASK(PG_U_INITIAL_PUNCTUATION) +#define PG_U_PF_MASK PG_U_CATEGORY_MASK(PG_U_FINAL_PUNCTUATION) +#define PG_U_PO_MASK PG_U_CATEGORY_MASK(PG_U_OTHER_PUNCTUATION) +#define PG_U_P_MASK (PG_U_PC_MASK|PG_U_PD_MASK|PG_U_PS_MASK|PG_U_PE_MASK|\ + PG_U_PI_MASK|PG_U_PF_MASK|PG_U_PO_MASK) +#define PG_U_SM_MASK PG_U_CATEGORY_MASK(PG_U_MATH_SYMBOL) +#define PG_U_SC_MASK PG_U_CATEGORY_MASK(PG_U_CURRENCY_SYMBOL) +#define PG_U_SK_MASK PG_U_CATEGORY_MASK(PG_U_MODIFIER_SYMBOL) +#define PG_U_SO_MASK PG_U_CATEGORY_MASK(PG_U_OTHER_SYMBOL) +#define PG_U_S_MASK (PG_U_SM_MASK|PG_U_SC_MASK|PG_U_SK_MASK|PG_U_SO_MASK) +#define PG_U_ZS_MASK PG_U_CATEGORY_MASK(PG_U_SPACE_SEPARATOR) +#define PG_U_ZL_MASK PG_U_CATEGORY_MASK(PG_U_LINE_SEPARATOR) +#define PG_U_ZP_MASK PG_U_CATEGORY_MASK(PG_U_PARAGRAPH_SEPARATOR) +#define PG_U_Z_MASK (PG_U_ZS_MASK|PG_U_ZL_MASK|PG_U_ZP_MASK) +#define PG_U_CC_MASK PG_U_CATEGORY_MASK(PG_U_CONTROL) +#define PG_U_CF_MASK PG_U_CATEGORY_MASK(PG_U_FORMAT) +#define PG_U_CS_MASK PG_U_CATEGORY_MASK(PG_U_SURROGATE) +#define PG_U_CO_MASK PG_U_CATEGORY_MASK(PG_U_PRIVATE_USE) +#define PG_U_CN_MASK PG_U_CATEGORY_MASK(PG_U_UNASSIGNED) +#define PG_U_C_MASK (PG_U_CC_MASK|PG_U_CF_MASK|PG_U_CS_MASK|PG_U_CO_MASK|\ + PG_U_CN_MASK) + +#define PG_U_CHARACTER_TAB 0x09 + +static bool range_search(const pg_unicode_range *tbl, size_t size, + pg_wchar code); + +/* + * Unicode general category for the given codepoint. + */ +pg_unicode_category +unicode_category(pg_wchar code) +{ + int min = 0; + int mid; + int max = lengthof(unicode_categories) - 1; + + Assert(code <= 0x10ffff); + + if (code < 0x80) + return unicode_opt_ascii[code].category; + + while (max >= min) + { + mid = (min + max) / 2; + if (code > unicode_categories[mid].last) + min = mid + 1; + else if (code < unicode_categories[mid].first) + max = mid - 1; + else + return unicode_categories[mid].category; + } + + return PG_U_UNASSIGNED; +} + +bool +pg_u_prop_alphabetic(pg_wchar code) +{ + if (code < 0x80) + return unicode_opt_ascii[code].properties & PG_U_PROP_ALPHABETIC; + + return range_search(unicode_alphabetic, + lengthof(unicode_alphabetic), + code); +} + +bool +pg_u_prop_lowercase(pg_wchar code) +{ + if (code < 0x80) + return unicode_opt_ascii[code].properties & PG_U_PROP_LOWERCASE; + + return range_search(unicode_lowercase, + lengthof(unicode_lowercase), + code); +} + +bool +pg_u_prop_uppercase(pg_wchar code) +{ + if (code < 0x80) + return unicode_opt_ascii[code].properties & PG_U_PROP_UPPERCASE; + + return range_search(unicode_uppercase, + lengthof(unicode_uppercase), + code); +} + +bool +pg_u_prop_cased(pg_wchar code) +{ + uint32 category_mask; + + if (code < 0x80) + return unicode_opt_ascii[code].properties & PG_U_PROP_CASED; + + category_mask = PG_U_CATEGORY_MASK(unicode_category(code)); + + return category_mask & PG_U_LT_MASK || + pg_u_prop_lowercase(code) || + pg_u_prop_uppercase(code); +} + +bool +pg_u_prop_case_ignorable(pg_wchar code) +{ + if (code < 0x80) + return unicode_opt_ascii[code].properties & PG_U_PROP_CASE_IGNORABLE; + + return range_search(unicode_case_ignorable, + lengthof(unicode_case_ignorable), + code); +} + +bool +pg_u_prop_white_space(pg_wchar code) +{ + if (code < 0x80) + return unicode_opt_ascii[code].properties & PG_U_PROP_WHITE_SPACE; + + return range_search(unicode_white_space, + lengthof(unicode_white_space), + code); +} + +bool +pg_u_prop_hex_digit(pg_wchar code) +{ + if (code < 0x80) + return unicode_opt_ascii[code].properties & PG_U_PROP_HEX_DIGIT; + + return range_search(unicode_hex_digit, + lengthof(unicode_hex_digit), + code); +} + +bool +pg_u_prop_join_control(pg_wchar code) +{ + if (code < 0x80) + return unicode_opt_ascii[code].properties & PG_U_PROP_JOIN_CONTROL; + + return range_search(unicode_join_control, + lengthof(unicode_join_control), + code); +} + +/* + * The following functions implement the Compatibility Properties described + * at: http://www.unicode.org/reports/tr18/#Compatibility_Properties + * + * If 'posix' is true, implements the "POSIX Compatible" variant, otherwise + * the "Standard" variant. + */ + +bool +pg_u_isdigit(pg_wchar code, bool posix) +{ + if (posix) + return ('0' <= code && code <= '9'); + else + return unicode_category(code) == PG_U_DECIMAL_NUMBER; +} + +bool +pg_u_isalpha(pg_wchar code) +{ + return pg_u_prop_alphabetic(code); +} + +bool +pg_u_isalnum(pg_wchar code, bool posix) +{ + return pg_u_isalpha(code) || pg_u_isdigit(code, posix); +} + +bool +pg_u_isword(pg_wchar code) +{ + uint32 category_mask = PG_U_CATEGORY_MASK(unicode_category(code)); + + return + category_mask & (PG_U_M_MASK | PG_U_ND_MASK | PG_U_PC_MASK) || + pg_u_isalpha(code) || + pg_u_prop_join_control(code); +} + +bool +pg_u_isupper(pg_wchar code) +{ + return pg_u_prop_uppercase(code); +} + +bool +pg_u_islower(pg_wchar code) +{ + return pg_u_prop_lowercase(code); +} + +bool +pg_u_isblank(pg_wchar code) +{ + return code == PG_U_CHARACTER_TAB || + unicode_category(code) == PG_U_SPACE_SEPARATOR; +} + +bool +pg_u_iscntrl(pg_wchar code) +{ + return unicode_category(code) == PG_U_CONTROL; +} + +bool +pg_u_isgraph(pg_wchar code) +{ + uint32 category_mask = PG_U_CATEGORY_MASK(unicode_category(code)); + + if (category_mask & (PG_U_CC_MASK | PG_U_CS_MASK | PG_U_CN_MASK) || + pg_u_isspace(code)) + return false; + return true; +} + +bool +pg_u_isprint(pg_wchar code) +{ + pg_unicode_category category = unicode_category(code); + + if (category == PG_U_CONTROL) + return false; + + return pg_u_isgraph(code) || pg_u_isblank(code); +} + +bool +pg_u_ispunct(pg_wchar code, bool posix) +{ + uint32 category_mask; + + if (posix) + { + if (pg_u_isalpha(code)) + return false; + + category_mask = PG_U_CATEGORY_MASK(unicode_category(code)); + return category_mask & (PG_U_P_MASK | PG_U_S_MASK); + } + else + { + category_mask = PG_U_CATEGORY_MASK(unicode_category(code)); + + return category_mask & PG_U_P_MASK; + } +} + +bool +pg_u_isspace(pg_wchar code) +{ + return pg_u_prop_white_space(code); +} + +bool +pg_u_isxdigit(pg_wchar code, bool posix) +{ + if (posix) + return (('0' <= code && code <= '9') || + ('A' <= code && code <= 'F') || + ('a' <= code && code <= 'f')); + else + return unicode_category(code) == PG_U_DECIMAL_NUMBER || + pg_u_prop_hex_digit(code); +} + +/* + * Description of Unicode general category. + */ +const char * +unicode_category_string(pg_unicode_category category) +{ + switch (category) + { + case PG_U_UNASSIGNED: + return "Unassigned"; + case PG_U_UPPERCASE_LETTER: + return "Uppercase_Letter"; + case PG_U_LOWERCASE_LETTER: + return "Lowercase_Letter"; + case PG_U_TITLECASE_LETTER: + return "Titlecase_Letter"; + case PG_U_MODIFIER_LETTER: + return "Modifier_Letter"; + case PG_U_OTHER_LETTER: + return "Other_Letter"; + case PG_U_NONSPACING_MARK: + return "Nonspacing_Mark"; + case PG_U_ENCLOSING_MARK: + return "Enclosing_Mark"; + case PG_U_SPACING_MARK: + return "Spacing_Mark"; + case PG_U_DECIMAL_NUMBER: + return "Decimal_Number"; + case PG_U_LETTER_NUMBER: + return "Letter_Number"; + case PG_U_OTHER_NUMBER: + return "Other_Number"; + case PG_U_SPACE_SEPARATOR: + return "Space_Separator"; + case PG_U_LINE_SEPARATOR: + return "Line_Separator"; + case PG_U_PARAGRAPH_SEPARATOR: + return "Paragraph_Separator"; + case PG_U_CONTROL: + return "Control"; + case PG_U_FORMAT: + return "Format"; + case PG_U_PRIVATE_USE: + return "Private_Use"; + case PG_U_SURROGATE: + return "Surrogate"; + case PG_U_DASH_PUNCTUATION: + return "Dash_Punctuation"; + case PG_U_OPEN_PUNCTUATION: + return "Open_Punctuation"; + case PG_U_CLOSE_PUNCTUATION: + return "Close_Punctuation"; + case PG_U_CONNECTOR_PUNCTUATION: + return "Connector_Punctuation"; + case PG_U_OTHER_PUNCTUATION: + return "Other_Punctuation"; + case PG_U_MATH_SYMBOL: + return "Math_Symbol"; + case PG_U_CURRENCY_SYMBOL: + return "Currency_Symbol"; + case PG_U_MODIFIER_SYMBOL: + return "Modifier_Symbol"; + case PG_U_OTHER_SYMBOL: + return "Other_Symbol"; + case PG_U_INITIAL_PUNCTUATION: + return "Initial_Punctuation"; + case PG_U_FINAL_PUNCTUATION: + return "Final_Punctuation"; + } + + Assert(false); + return "Unrecognized"; /* keep compiler quiet */ +} + +/* + * Short code for Unicode general category. + */ +const char * +unicode_category_abbrev(pg_unicode_category category) +{ + switch (category) + { + case PG_U_UNASSIGNED: + return "Cn"; + case PG_U_UPPERCASE_LETTER: + return "Lu"; + case PG_U_LOWERCASE_LETTER: + return "Ll"; + case PG_U_TITLECASE_LETTER: + return "Lt"; + case PG_U_MODIFIER_LETTER: + return "Lm"; + case PG_U_OTHER_LETTER: + return "Lo"; + case PG_U_NONSPACING_MARK: + return "Mn"; + case PG_U_ENCLOSING_MARK: + return "Me"; + case PG_U_SPACING_MARK: + return "Mc"; + case PG_U_DECIMAL_NUMBER: + return "Nd"; + case PG_U_LETTER_NUMBER: + return "Nl"; + case PG_U_OTHER_NUMBER: + return "No"; + case PG_U_SPACE_SEPARATOR: + return "Zs"; + case PG_U_LINE_SEPARATOR: + return "Zl"; + case PG_U_PARAGRAPH_SEPARATOR: + return "Zp"; + case PG_U_CONTROL: + return "Cc"; + case PG_U_FORMAT: + return "Cf"; + case PG_U_PRIVATE_USE: + return "Co"; + case PG_U_SURROGATE: + return "Cs"; + case PG_U_DASH_PUNCTUATION: + return "Pd"; + case PG_U_OPEN_PUNCTUATION: + return "Ps"; + case PG_U_CLOSE_PUNCTUATION: + return "Pe"; + case PG_U_CONNECTOR_PUNCTUATION: + return "Pc"; + case PG_U_OTHER_PUNCTUATION: + return "Po"; + case PG_U_MATH_SYMBOL: + return "Sm"; + case PG_U_CURRENCY_SYMBOL: + return "Sc"; + case PG_U_MODIFIER_SYMBOL: + return "Sk"; + case PG_U_OTHER_SYMBOL: + return "So"; + case PG_U_INITIAL_PUNCTUATION: + return "Pi"; + case PG_U_FINAL_PUNCTUATION: + return "Pf"; + } + + Assert(false); + return "??"; /* keep compiler quiet */ +} + +/* + * Binary search to test if given codepoint exists in one of the ranges in the + * given table. + */ +static bool +range_search(const pg_unicode_range *tbl, size_t size, pg_wchar code) +{ + int min = 0; + int mid; + int max = size - 1; + + Assert(code <= 0x10ffff); + + while (max >= min) + { + mid = (min + max) / 2; + if (code > tbl[mid].last) + min = mid + 1; + else if (code < tbl[mid].first) + max = mid - 1; + else + return true; + } + + return false; +} diff --git a/src/common/unicode_norm.c b/src/common/unicode_norm.c index 8e17cf0862fea..ff8a03b84939f 100644 --- a/src/common/unicode_norm.c +++ b/src/common/unicode_norm.c @@ -5,7 +5,7 @@ * This implements Unicode normalization, per the documentation at * https://www.unicode.org/reports/tr15/. * - * Portions Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2017-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/unicode_norm.c diff --git a/src/common/username.c b/src/common/username.c index e8ac4c4977077..acaeb13d2e696 100644 --- a/src/common/username.c +++ b/src/common/username.c @@ -3,7 +3,7 @@ * username.c * get user name * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/common/wait_error.c b/src/common/wait_error.c index a90b745f0777c..e79c61a66cfe0 100644 --- a/src/common/wait_error.c +++ b/src/common/wait_error.c @@ -4,7 +4,7 @@ * Convert a wait/waitpid(2) result code to a human-readable string * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/common/wchar.c b/src/common/wchar.c index fb9d9f5c85f81..402ad281eb608 100644 --- a/src/common/wchar.c +++ b/src/common/wchar.c @@ -3,7 +3,7 @@ * wchar.c * Functions for working with multibyte characters in various encodings. * - * Portions Copyright (c) 1998-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1998-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/common/wchar.c @@ -12,7 +12,29 @@ */ #include "c.h" +#include + #include "mb/pg_wchar.h" +#include "utils/ascii.h" + + +/* + * In today's multibyte encodings other than UTF8, this two-byte sequence + * ensures pg_encoding_mblen() == 2 && pg_encoding_verifymbstr() == 0. + * + * For historical reasons, several verifychar implementations opt to reject + * this pair specifically. Byte pair range constraints, in encoding + * originator documentation, always excluded this pair. No core conversion + * could translate it. However, longstanding verifychar implementations + * accepted any non-NUL byte. big5_to_euc_tw and big5_to_mic even translate + * pairs not valid per encoding originator documentation. To avoid tightening + * core or non-core conversions in a security patch, we sought this one pair. + * + * PQescapeString() historically used spaces for BYTE1; many other values + * could suffice for BYTE1. + */ +#define NONUTF8_INVALID_BYTE0 (0x8d) +#define NONUTF8_INVALID_BYTE1 (' ') /* @@ -475,39 +497,6 @@ pg_utf2wchar_with_len(const unsigned char *from, pg_wchar *to, int len) } -/* - * Map a Unicode code point to UTF-8. utf8string must have 4 bytes of - * space allocated. - */ -unsigned char * -unicode_to_utf8(pg_wchar c, unsigned char *utf8string) -{ - if (c <= 0x7F) - { - utf8string[0] = c; - } - else if (c <= 0x7FF) - { - utf8string[0] = 0xC0 | ((c >> 6) & 0x1F); - utf8string[1] = 0x80 | (c & 0x3F); - } - else if (c <= 0xFFFF) - { - utf8string[0] = 0xE0 | ((c >> 12) & 0x0F); - utf8string[1] = 0x80 | ((c >> 6) & 0x3F); - utf8string[2] = 0x80 | (c & 0x3F); - } - else - { - utf8string[0] = 0xF0 | ((c >> 18) & 0x07); - utf8string[1] = 0x80 | ((c >> 12) & 0x3F); - utf8string[2] = 0x80 | ((c >> 6) & 0x3F); - utf8string[3] = 0x80 | (c & 0x3F); - } - - return utf8string; -} - /* * Trivial conversion from pg_wchar to UTF-8. * caller should allocate enough space for "to" @@ -669,34 +658,6 @@ ucs_wcwidth(pg_wchar ucs) return 1; } -/* - * Convert a UTF-8 character to a Unicode code point. - * This is a one-character version of pg_utf2wchar_with_len. - * - * No error checks here, c must point to a long-enough string. - */ -pg_wchar -utf8_to_unicode(const unsigned char *c) -{ - if ((*c & 0x80) == 0) - return (pg_wchar) c[0]; - else if ((*c & 0xe0) == 0xc0) - return (pg_wchar) (((c[0] & 0x1f) << 6) | - (c[1] & 0x3f)); - else if ((*c & 0xf0) == 0xe0) - return (pg_wchar) (((c[0] & 0x0f) << 12) | - ((c[1] & 0x3f) << 6) | - (c[2] & 0x3f)); - else if ((*c & 0xf8) == 0xf0) - return (pg_wchar) (((c[0] & 0x07) << 18) | - ((c[1] & 0x3f) << 12) | - ((c[2] & 0x3f) << 6) | - (c[3] & 0x3f)); - else - /* that is an invalid code on purpose */ - return 0xffffffff; -} - static int pg_utf_dsplen(const unsigned char *s) { @@ -1525,6 +1486,11 @@ pg_big5_verifychar(const unsigned char *s, int len) if (len < l) return -1; + if (l == 2 && + s[0] == NONUTF8_INVALID_BYTE0 && + s[1] == NONUTF8_INVALID_BYTE1) + return -1; + while (--l > 0) { if (*++s == '\0') @@ -1574,6 +1540,11 @@ pg_gbk_verifychar(const unsigned char *s, int len) if (len < l) return -1; + if (l == 2 && + s[0] == NONUTF8_INVALID_BYTE0 && + s[1] == NONUTF8_INVALID_BYTE1) + return -1; + while (--l > 0) { if (*++s == '\0') @@ -1623,6 +1594,11 @@ pg_uhc_verifychar(const unsigned char *s, int len) if (len < l) return -1; + if (l == 2 && + s[0] == NONUTF8_INVALID_BYTE0 && + s[1] == NONUTF8_INVALID_BYTE1) + return -1; + while (--l > 0) { if (*++s == '\0') @@ -2067,64 +2043,93 @@ pg_utf8_islegal(const unsigned char *source, int length) } +/* + * Fills the provided buffer with two bytes such that: + * pg_encoding_mblen(dst) == 2 && pg_encoding_verifymbstr(dst) == 0 + */ +void +pg_encoding_set_invalid(int encoding, char *dst) +{ + Assert(pg_encoding_max_length(encoding) > 1); + + dst[0] = (encoding == PG_UTF8 ? 0xc0 : NONUTF8_INVALID_BYTE0); + dst[1] = NONUTF8_INVALID_BYTE1; +} + /* *------------------------------------------------------------------- * encoding info table - * XXX must be sorted by the same order as enum pg_enc (in mb/pg_wchar.h) *------------------------------------------------------------------- */ const pg_wchar_tbl pg_wchar_table[] = { - {pg_ascii2wchar_with_len, pg_wchar2single_with_len, pg_ascii_mblen, pg_ascii_dsplen, pg_ascii_verifychar, pg_ascii_verifystr, 1}, /* PG_SQL_ASCII */ - {pg_eucjp2wchar_with_len, pg_wchar2euc_with_len, pg_eucjp_mblen, pg_eucjp_dsplen, pg_eucjp_verifychar, pg_eucjp_verifystr, 3}, /* PG_EUC_JP */ - {pg_euccn2wchar_with_len, pg_wchar2euc_with_len, pg_euccn_mblen, pg_euccn_dsplen, pg_euccn_verifychar, pg_euccn_verifystr, 2}, /* PG_EUC_CN */ - {pg_euckr2wchar_with_len, pg_wchar2euc_with_len, pg_euckr_mblen, pg_euckr_dsplen, pg_euckr_verifychar, pg_euckr_verifystr, 3}, /* PG_EUC_KR */ - {pg_euctw2wchar_with_len, pg_wchar2euc_with_len, pg_euctw_mblen, pg_euctw_dsplen, pg_euctw_verifychar, pg_euctw_verifystr, 4}, /* PG_EUC_TW */ - {pg_eucjp2wchar_with_len, pg_wchar2euc_with_len, pg_eucjp_mblen, pg_eucjp_dsplen, pg_eucjp_verifychar, pg_eucjp_verifystr, 3}, /* PG_EUC_JIS_2004 */ - {pg_utf2wchar_with_len, pg_wchar2utf_with_len, pg_utf_mblen, pg_utf_dsplen, pg_utf8_verifychar, pg_utf8_verifystr, 4}, /* PG_UTF8 */ - {pg_mule2wchar_with_len, pg_wchar2mule_with_len, pg_mule_mblen, pg_mule_dsplen, pg_mule_verifychar, pg_mule_verifystr, 4}, /* PG_MULE_INTERNAL */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_LATIN1 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_LATIN2 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_LATIN3 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_LATIN4 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_LATIN5 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_LATIN6 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_LATIN7 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_LATIN8 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_LATIN9 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_LATIN10 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_WIN1256 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_WIN1258 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_WIN866 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_WIN874 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_KOI8R */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_WIN1251 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_WIN1252 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* ISO-8859-5 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* ISO-8859-6 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* ISO-8859-7 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* ISO-8859-8 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_WIN1250 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_WIN1253 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_WIN1254 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_WIN1255 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_WIN1257 */ - {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, /* PG_KOI8U */ - {0, 0, pg_sjis_mblen, pg_sjis_dsplen, pg_sjis_verifychar, pg_sjis_verifystr, 2}, /* PG_SJIS */ - {0, 0, pg_big5_mblen, pg_big5_dsplen, pg_big5_verifychar, pg_big5_verifystr, 2}, /* PG_BIG5 */ - {0, 0, pg_gbk_mblen, pg_gbk_dsplen, pg_gbk_verifychar, pg_gbk_verifystr, 2}, /* PG_GBK */ - {0, 0, pg_uhc_mblen, pg_uhc_dsplen, pg_uhc_verifychar, pg_uhc_verifystr, 2}, /* PG_UHC */ - {0, 0, pg_gb18030_mblen, pg_gb18030_dsplen, pg_gb18030_verifychar, pg_gb18030_verifystr, 4}, /* PG_GB18030 */ - {0, 0, pg_johab_mblen, pg_johab_dsplen, pg_johab_verifychar, pg_johab_verifystr, 3}, /* PG_JOHAB */ - {0, 0, pg_sjis_mblen, pg_sjis_dsplen, pg_sjis_verifychar, pg_sjis_verifystr, 2} /* PG_SHIFT_JIS_2004 */ + [PG_SQL_ASCII] = {pg_ascii2wchar_with_len, pg_wchar2single_with_len, pg_ascii_mblen, pg_ascii_dsplen, pg_ascii_verifychar, pg_ascii_verifystr, 1}, + [PG_EUC_JP] = {pg_eucjp2wchar_with_len, pg_wchar2euc_with_len, pg_eucjp_mblen, pg_eucjp_dsplen, pg_eucjp_verifychar, pg_eucjp_verifystr, 3}, + [PG_EUC_CN] = {pg_euccn2wchar_with_len, pg_wchar2euc_with_len, pg_euccn_mblen, pg_euccn_dsplen, pg_euccn_verifychar, pg_euccn_verifystr, 2}, + [PG_EUC_KR] = {pg_euckr2wchar_with_len, pg_wchar2euc_with_len, pg_euckr_mblen, pg_euckr_dsplen, pg_euckr_verifychar, pg_euckr_verifystr, 3}, + [PG_EUC_TW] = {pg_euctw2wchar_with_len, pg_wchar2euc_with_len, pg_euctw_mblen, pg_euctw_dsplen, pg_euctw_verifychar, pg_euctw_verifystr, 4}, + [PG_EUC_JIS_2004] = {pg_eucjp2wchar_with_len, pg_wchar2euc_with_len, pg_eucjp_mblen, pg_eucjp_dsplen, pg_eucjp_verifychar, pg_eucjp_verifystr, 3}, + [PG_UTF8] = {pg_utf2wchar_with_len, pg_wchar2utf_with_len, pg_utf_mblen, pg_utf_dsplen, pg_utf8_verifychar, pg_utf8_verifystr, 4}, + [PG_MULE_INTERNAL] = {pg_mule2wchar_with_len, pg_wchar2mule_with_len, pg_mule_mblen, pg_mule_dsplen, pg_mule_verifychar, pg_mule_verifystr, 4}, + [PG_LATIN1] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_LATIN2] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_LATIN3] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_LATIN4] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_LATIN5] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_LATIN6] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_LATIN7] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_LATIN8] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_LATIN9] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_LATIN10] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_WIN1256] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_WIN1258] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_WIN866] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_WIN874] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_KOI8R] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_WIN1251] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_WIN1252] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_ISO_8859_5] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_ISO_8859_6] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_ISO_8859_7] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_ISO_8859_8] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_WIN1250] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_WIN1253] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_WIN1254] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_WIN1255] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_WIN1257] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_KOI8U] = {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifychar, pg_latin1_verifystr, 1}, + [PG_SJIS] = {0, 0, pg_sjis_mblen, pg_sjis_dsplen, pg_sjis_verifychar, pg_sjis_verifystr, 2}, + [PG_BIG5] = {0, 0, pg_big5_mblen, pg_big5_dsplen, pg_big5_verifychar, pg_big5_verifystr, 2}, + [PG_GBK] = {0, 0, pg_gbk_mblen, pg_gbk_dsplen, pg_gbk_verifychar, pg_gbk_verifystr, 2}, + [PG_UHC] = {0, 0, pg_uhc_mblen, pg_uhc_dsplen, pg_uhc_verifychar, pg_uhc_verifystr, 2}, + [PG_GB18030] = {0, 0, pg_gb18030_mblen, pg_gb18030_dsplen, pg_gb18030_verifychar, pg_gb18030_verifystr, 4}, + [PG_JOHAB] = {0, 0, pg_johab_mblen, pg_johab_dsplen, pg_johab_verifychar, pg_johab_verifystr, 3}, + [PG_SHIFT_JIS_2004] = {0, 0, pg_sjis_mblen, pg_sjis_dsplen, pg_sjis_verifychar, pg_sjis_verifystr, 2}, }; /* * Returns the byte length of a multibyte character. * - * Caution: when dealing with text that is not certainly valid in the - * specified encoding, the result may exceed the actual remaining - * string length. Callers that are not prepared to deal with that - * should use pg_encoding_mblen_bounded() instead. + * Choose "mblen" functions based on the input string characteristics. + * pg_encoding_mblen() can be used when ANY of these conditions are met: + * + * - The input string is zero-terminated + * + * - The input string is known to be valid in the encoding (e.g., string + * converted from database encoding) + * + * - The encoding is not GB18030 (e.g., when only database encodings are + * passed to 'encoding' parameter) + * + * encoding==GB18030 requires examining up to two bytes to determine character + * length. Therefore, callers satisfying none of those conditions must use + * pg_encoding_mblen_or_incomplete() instead, as access to mbstr[1] cannot be + * guaranteed to be within allocation bounds. + * + * When dealing with text that is not certainly valid in the specified + * encoding, the result may exceed the actual remaining string length. + * Callers that are not prepared to deal with that should use Min(remaining, + * pg_encoding_mblen_or_incomplete()). For zero-terminated strings, that and + * pg_encoding_mblen_bounded() are interchangeable. */ int pg_encoding_mblen(int encoding, const char *mbstr) @@ -2135,8 +2140,28 @@ pg_encoding_mblen(int encoding, const char *mbstr) } /* - * Returns the byte length of a multibyte character; but not more than - * the distance to end of string. + * Returns the byte length of a multibyte character (possibly not + * zero-terminated), or INT_MAX if too few bytes remain to determine a length. + */ +int +pg_encoding_mblen_or_incomplete(int encoding, const char *mbstr, + size_t remaining) +{ + /* + * Define zero remaining as too few, even for single-byte encodings. + * pg_gb18030_mblen() reads one or two bytes; single-byte encodings read + * zero; others read one. + */ + if (remaining < 1 || + (encoding == PG_GB18030 && IS_HIGHBIT_SET(*mbstr) && remaining < 2)) + return INT_MAX; + return pg_encoding_mblen(encoding, mbstr); +} + +/* + * Returns the byte length of a multibyte character; but not more than the + * distance to the terminating zero byte. For input that might lack a + * terminating zero, use Min(remaining, pg_encoding_mblen_or_incomplete()). */ int pg_encoding_mblen_bounded(int encoding, const char *mbstr) @@ -2189,5 +2214,11 @@ pg_encoding_max_length(int encoding) { Assert(PG_VALID_ENCODING(encoding)); - return pg_wchar_table[encoding].maxmblen; + /* + * Check for the encoding despite the assert, due to some mingw versions + * otherwise issuing bogus warnings. + */ + return PG_VALID_ENCODING(encoding) ? + pg_wchar_table[encoding].maxmblen : + pg_wchar_table[PG_SQL_ASCII].maxmblen; } diff --git a/src/fe_utils/Makefile b/src/fe_utils/Makefile index 456d6dd3904e1..946c05258f008 100644 --- a/src/fe_utils/Makefile +++ b/src/fe_utils/Makefile @@ -5,7 +5,7 @@ # This makefile generates a static library, libpgfeutils.a, # for use by client applications # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # IDENTIFICATION @@ -48,8 +48,6 @@ psqlscan.c: FLEXFLAGS = -Cfe -p -p psqlscan.c: FLEX_NO_BACKUP=yes psqlscan.c: FLEX_FIX_WARNING=yes -distprep: psqlscan.c - # libpgfeutils could be useful to contrib, so install it install: all installdirs $(INSTALL_STLIB) libpgfeutils.a '$(DESTDIR)$(libdir)/libpgfeutils.a' @@ -62,8 +60,4 @@ uninstall: clean distclean: rm -f libpgfeutils.a $(OBJS) lex.backup - -# psqlscan.c is supposed to be in the distribution tarball, -# so do not clean it in the clean/distclean rules -maintainer-clean: distclean rm -f psqlscan.c diff --git a/src/fe_utils/archive.c b/src/fe_utils/archive.c index eb1c930ae7f27..f194809d53b65 100644 --- a/src/fe_utils/archive.c +++ b/src/fe_utils/archive.c @@ -3,7 +3,7 @@ * archive.c * Routines to access WAL archives from frontend * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -95,7 +95,7 @@ RestoreArchivedFile(const char *path, const char *xlogfname, * fatal too. */ if (wait_result_is_any_signal(rc, true)) - pg_fatal("restore_command failed: %s", + pg_fatal("\"restore_command\" failed: %s", wait_result_to_str(rc)); /* diff --git a/src/fe_utils/cancel.c b/src/fe_utils/cancel.c index 10c0cd45545e2..dcff9a8564184 100644 --- a/src/fe_utils/cancel.c +++ b/src/fe_utils/cancel.c @@ -6,7 +6,7 @@ * handler for SIGINT. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/fe_utils/cancel.c @@ -152,7 +152,6 @@ ResetCancelConn(void) static void handle_sigint(SIGNAL_ARGS) { - int save_errno = errno; char errbuf[256]; CancelRequested = true; @@ -173,8 +172,6 @@ handle_sigint(SIGNAL_ARGS) write_stderr(errbuf); } } - - errno = save_errno; /* just in case the write changed it */ } /* diff --git a/src/fe_utils/conditional.c b/src/fe_utils/conditional.c index e67fb0dbe8cc2..d9109cf1e98c8 100644 --- a/src/fe_utils/conditional.c +++ b/src/fe_utils/conditional.c @@ -1,7 +1,7 @@ /*------------------------------------------------------------------------- * A stack of automaton states to handle nested conditionals. * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/fe_utils/conditional.c * diff --git a/src/fe_utils/connect_utils.c b/src/fe_utils/connect_utils.c index 7a1edea7c8cd9..5ed9f3ba17b78 100644 --- a/src/fe_utils/connect_utils.c +++ b/src/fe_utils/connect_utils.c @@ -2,7 +2,7 @@ * * Facilities for frontend code to connect to and disconnect from databases. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/fe_utils/connect_utils.c @@ -25,7 +25,7 @@ * * If allow_password_reuse is true, we will try to re-use any password * given during previous calls to this routine. (Callers should not pass - * allow_password_reuse=true unless reconnecting to the same database+user + * allow_password_reuse=true unless reconnecting to the same host+port+user * as before, else we might create password exposure hazards.) */ PGconn * @@ -157,19 +157,14 @@ connectMaintenanceDatabase(ConnParams *cparams, void disconnectDatabase(PGconn *conn) { - char errbuf[256]; - Assert(conn != NULL); if (PQtransactionStatus(conn) == PQTRANS_ACTIVE) { - PGcancel *cancel; + PGcancelConn *cancelConn = PQcancelCreate(conn); - if ((cancel = PQgetCancel(conn))) - { - (void) PQcancel(cancel, errbuf, sizeof(errbuf)); - PQfreeCancel(cancel); - } + (void) PQcancelBlocking(cancelConn); + PQcancelFinish(cancelConn); } PQfinish(conn); diff --git a/src/fe_utils/mbprint.c b/src/fe_utils/mbprint.c index e63be3b4fb1d5..5ad469f5ddd1e 100644 --- a/src/fe_utils/mbprint.c +++ b/src/fe_utils/mbprint.c @@ -3,7 +3,7 @@ * Multibyte character printing support for frontend code * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/fe_utils/mbprint.c diff --git a/src/fe_utils/meson.build b/src/fe_utils/meson.build index ea96e862adb23..14d0482a2cc7a 100644 --- a/src/fe_utils/meson.build +++ b/src/fe_utils/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group fe_utils_sources = files( 'archive.c', diff --git a/src/fe_utils/option_utils.c b/src/fe_utils/option_utils.c index 763c991015ba7..7828ae2b2f2b2 100644 --- a/src/fe_utils/option_utils.c +++ b/src/fe_utils/option_utils.c @@ -2,7 +2,7 @@ * * Command line option processing facilities for frontend code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/fe_utils/option_utils.c @@ -82,3 +82,30 @@ option_parse_int(const char *optarg, const char *optname, *result = val; return true; } + +/* + * Provide strictly harmonized handling of the --sync-method option. + */ +bool +parse_sync_method(const char *optarg, DataDirSyncMethod *sync_method) +{ + if (strcmp(optarg, "fsync") == 0) + *sync_method = DATA_DIR_SYNC_METHOD_FSYNC; + else if (strcmp(optarg, "syncfs") == 0) + { +#ifdef HAVE_SYNCFS + *sync_method = DATA_DIR_SYNC_METHOD_SYNCFS; +#else + pg_log_error("this build does not support sync method \"%s\"", + "syncfs"); + return false; +#endif + } + else + { + pg_log_error("unrecognized sync method: %s", optarg); + return false; + } + + return true; +} diff --git a/src/fe_utils/parallel_slot.c b/src/fe_utils/parallel_slot.c index aca238bce9f5f..ce539699c3d02 100644 --- a/src/fe_utils/parallel_slot.c +++ b/src/fe_utils/parallel_slot.c @@ -4,7 +4,7 @@ * Parallel support for front-end parallel database connections * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/fe_utils/parallel_slot.c @@ -295,8 +295,41 @@ connect_slot(ParallelSlotArray *sa, int slotno, const char *dbname) slot->connection = connectDatabase(sa->cparams, sa->progname, sa->echo, false, true); sa->cparams->override_dbname = old_override; - if (PQsocket(slot->connection) >= FD_SETSIZE) - pg_fatal("too many jobs for this platform"); + /* + * POSIX defines FD_SETSIZE as the highest file descriptor acceptable to + * FD_SET() and allied macros. Windows defines it as a ceiling on the + * count of file descriptors in the set, not a ceiling on the value of + * each file descriptor; see + * https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-select + * and + * https://learn.microsoft.com/en-us/windows/win32/api/winsock/ns-winsock-fd_set. + * We can't ignore that, because Windows starts file descriptors at a + * higher value, delays reuse, and skips values. With less than ten + * concurrent file descriptors, opened and closed rapidly, one can reach + * file descriptor 1024. + * + * Doing a hard exit here is a bit grotty, but it doesn't seem worth + * complicating the API to make it less grotty. + */ +#ifdef WIN32 + if (slotno >= FD_SETSIZE) + { + pg_log_error("too many jobs for this platform: %d", slotno); + exit(1); + } +#else + { + int fd = PQsocket(slot->connection); + + if (fd >= FD_SETSIZE) + { + pg_log_error("socket file descriptor out of range for select(): %d", + fd); + pg_log_error_hint("Try fewer jobs."); + exit(1); + } + } +#endif /* Setup the connection using the supplied command, if any. */ if (sa->initcmd) diff --git a/src/fe_utils/print.c b/src/fe_utils/print.c index 7af1ccb6b562b..d6c4d78f98161 100644 --- a/src/fe_utils/print.c +++ b/src/fe_utils/print.c @@ -8,7 +8,7 @@ * pager open/close functions, all that stuff came with it. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/fe_utils/print.c @@ -1401,7 +1401,7 @@ print_aligned_vertical(const printTableContent *cont, } /* find longest data cell */ - for (i = 0, ptr = cont->cells; *ptr; ptr++, i++) + for (ptr = cont->cells; *ptr; ptr++) { int width, height, @@ -3172,6 +3172,8 @@ void printTableInit(printTableContent *const content, const printTableOpt *opt, const char *title, const int ncolumns, const int nrows) { + uint64 total_cells; + content->opt = opt; content->title = title; content->ncolumns = ncolumns; @@ -3179,7 +3181,16 @@ printTableInit(printTableContent *const content, const printTableOpt *opt, content->headers = pg_malloc0((ncolumns + 1) * sizeof(*content->headers)); - content->cells = pg_malloc0((ncolumns * nrows + 1) * sizeof(*content->cells)); + total_cells = (uint64) ncolumns * nrows; + /* Catch possible overflow. Using >= here allows adding 1 below */ + if (total_cells >= SIZE_MAX / sizeof(*content->cells)) + { + fprintf(stderr, _("Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n"), + (long long int) total_cells, + (long long int) (SIZE_MAX / sizeof(*content->cells))); + exit(EXIT_FAILURE); + } + content->cells = pg_malloc0((total_cells + 1) * sizeof(*content->cells)); content->cellmustfree = NULL; content->footers = NULL; @@ -3249,15 +3260,17 @@ void printTableAddCell(printTableContent *const content, char *cell, const bool translate, const bool mustfree) { + uint64 total_cells; + #ifndef ENABLE_NLS (void) translate; /* unused parameter */ #endif - if (content->cellsadded >= content->ncolumns * content->nrows) + total_cells = (uint64) content->ncolumns * content->nrows; + if (content->cellsadded >= total_cells) { - fprintf(stderr, _("Cannot add cell to table content: " - "total cell count of %d exceeded.\n"), - content->ncolumns * content->nrows); + fprintf(stderr, _("Cannot add cell to table content: total cell count of %lld exceeded.\n"), + (long long int) total_cells); exit(EXIT_FAILURE); } @@ -3273,7 +3286,7 @@ printTableAddCell(printTableContent *const content, char *cell, { if (content->cellmustfree == NULL) content->cellmustfree = - pg_malloc0((content->ncolumns * content->nrows + 1) * sizeof(bool)); + pg_malloc0((total_cells + 1) * sizeof(bool)); content->cellmustfree[content->cellsadded] = true; } @@ -3341,9 +3354,10 @@ printTableCleanup(printTableContent *const content) { if (content->cellmustfree) { - int i; + uint64 total_cells; - for (i = 0; i < content->nrows * content->ncolumns; i++) + total_cells = (uint64) content->ncolumns * content->nrows; + for (uint64 i = 0; i < total_cells; i++) { if (content->cellmustfree[i]) free(unconstify(char *, content->cells[i])); diff --git a/src/fe_utils/psqlscan.l b/src/fe_utils/psqlscan.l index 84754aca4a99b..8e8b049e15f41 100644 --- a/src/fe_utils/psqlscan.l +++ b/src/fe_utils/psqlscan.l @@ -24,7 +24,7 @@ * See psqlscan_int.h for additional commentary. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -149,16 +149,16 @@ extern void psql_yyset_column(int column_no, yyscan_t yyscanner); * versions of Postgres failed to recognize -- as a comment if the input * did not end with a newline. * - * XXX perhaps \f (formfeed) should be treated as a newline as well? + * non_newline_space tracks all space characters except newlines. * * XXX if you change the set of whitespace characters, fix scanner_isspace() * to agree. */ -space [ \t\n\r\f] -horiz_space [ \t\f] -newline [\n\r] -non_newline [^\n\r] +space [ \t\n\r\f\v] +non_newline_space [ \t\f\v] +newline [\n\r] +non_newline [^\n\r] comment ("--"{non_newline}*) @@ -172,8 +172,8 @@ whitespace ({space}+|{comment}) */ special_whitespace ({space}+|{comment}{newline}) -horiz_whitespace ({horiz_space}|{comment}) -whitespace_with_newline ({horiz_whitespace}*{newline}{special_whitespace}*) +non_newline_whitespace ({non_newline_space}|{comment}) +whitespace_with_newline ({non_newline_whitespace}*{newline}{special_whitespace}*) quote ' /* If we see {quote} then {quotecontinue}, the quoted string continues */ @@ -343,20 +343,35 @@ octfail 0[oO]_? binfail 0[bB]_? numeric (({decinteger}\.{decinteger}?)|(\.{decinteger})) -numericfail {decdigit}+\.\. +numericfail {decinteger}\.\. real ({decinteger}|{numeric})[Ee][-+]?{decinteger} realfail ({decinteger}|{numeric})[Ee][-+] -decinteger_junk {decinteger}{ident_start} -hexinteger_junk {hexinteger}{ident_start} -octinteger_junk {octinteger}{ident_start} -bininteger_junk {bininteger}{ident_start} -numeric_junk {numeric}{ident_start} -real_junk {real}{ident_start} +/* Positional parameters don't accept underscores. */ +param \${decdigit}+ -param \${decinteger} -param_junk \${decinteger}{ident_start} +/* + * An identifier immediately following an integer literal is disallowed because + * in some cases it's ambiguous what is meant: for example, 0x1234 could be + * either a hexinteger or a decinteger "0" and an identifier "x1234". We can + * detect such problems by seeing if integer_junk matches a longer substring + * than any of the XXXinteger patterns (decinteger, hexinteger, octinteger, + * bininteger). One "junk" pattern is sufficient because + * {decinteger}{identifier} will match all the same strings we'd match with + * {hexinteger}{identifier} etc. + * + * Note that the rule for integer_junk must appear after the ones for + * XXXinteger to make this work correctly: 0x1234 will match both hexinteger + * and integer_junk, and we need hexinteger to be chosen in that case. + * + * Also disallow strings matched by numeric_junk, real_junk and param_junk + * for consistency. + */ +integer_junk {decinteger}{identifier} +numeric_junk {numeric}{identifier} +real_junk {real}{identifier} +param_junk \${decdigit}+{identifier} /* psql-specific: characters allowed in variable names */ variable_char [A-Za-z\200-\377_0-9] @@ -897,16 +912,7 @@ other . {realfail} { ECHO; } -{decinteger_junk} { - ECHO; - } -{hexinteger_junk} { - ECHO; - } -{octinteger_junk} { - ECHO; - } -{bininteger_junk} { +{integer_junk} { ECHO; } {numeric_junk} { diff --git a/src/fe_utils/query_utils.c b/src/fe_utils/query_utils.c index ee136cfd53d50..4970c4575da85 100644 --- a/src/fe_utils/query_utils.c +++ b/src/fe_utils/query_utils.c @@ -2,7 +2,7 @@ * * Facilities for frontend code to query a databases. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/fe_utils/query_utils.c diff --git a/src/fe_utils/recovery_gen.c b/src/fe_utils/recovery_gen.c index 99834a3b69e4b..c4838a4bddce1 100644 --- a/src/fe_utils/recovery_gen.c +++ b/src/fe_utils/recovery_gen.c @@ -3,7 +3,7 @@ * recovery_gen.c * Generator for recovery configuration * - * Portions Copyright (c) 2011-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2011-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ @@ -18,9 +18,14 @@ static char *escape_quotes(const char *src); /* * Write recovery configuration contents into a fresh PQExpBuffer, and * return it. + * + * This accepts the dbname which will be appended to the primary_conninfo. + * The dbname will be ignored by walreceiver process but slotsync worker uses + * it to connect to the primary server. */ PQExpBuffer -GenerateRecoveryConfig(PGconn *pgconn, char *replication_slot) +GenerateRecoveryConfig(PGconn *pgconn, const char *replication_slot, + char *dbname) { PQconninfoOption *connOptions; PQExpBufferData conninfo_buf; @@ -66,6 +71,20 @@ GenerateRecoveryConfig(PGconn *pgconn, char *replication_slot) appendPQExpBuffer(&conninfo_buf, "%s=", opt->keyword); appendConnStrVal(&conninfo_buf, opt->val); } + + if (dbname) + { + /* + * If dbname is specified in the connection, append the dbname. This + * will be used later for logical replication slot synchronization. + */ + if (conninfo_buf.len != 0) + appendPQExpBufferChar(&conninfo_buf, ' '); + + appendPQExpBuffer(&conninfo_buf, "%s=", "dbname"); + appendConnStrVal(&conninfo_buf, dbname); + } + if (PQExpBufferDataBroken(conninfo_buf)) pg_fatal("out of memory"); @@ -102,7 +121,7 @@ GenerateRecoveryConfig(PGconn *pgconn, char *replication_slot) * configuration is written to recovery.conf. */ void -WriteRecoveryConfig(PGconn *pgconn, char *target_dir, PQExpBuffer contents) +WriteRecoveryConfig(PGconn *pgconn, const char *target_dir, PQExpBuffer contents) { char filename[MAXPGPATH]; FILE *cf; diff --git a/src/fe_utils/simple_list.c b/src/fe_utils/simple_list.c index d446f1aa42fe8..2d88eb540677a 100644 --- a/src/fe_utils/simple_list.c +++ b/src/fe_utils/simple_list.c @@ -7,7 +7,7 @@ * it's all we need in, eg, pg_dump. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/fe_utils/simple_list.c diff --git a/src/fe_utils/string_utils.c b/src/fe_utils/string_utils.c index 0429a72bfe245..8e062c70379a6 100644 --- a/src/fe_utils/string_utils.c +++ b/src/fe_utils/string_utils.c @@ -6,7 +6,7 @@ * and interpreting backend output. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/fe_utils/string_utils.c @@ -19,6 +19,7 @@ #include "common/keywords.h" #include "fe_utils/string_utils.h" +#include "mb/pg_wchar.h" static PQExpBuffer defaultGetLocalPQExpBuffer(void); @@ -26,6 +27,8 @@ static PQExpBuffer defaultGetLocalPQExpBuffer(void); int quote_all_identifiers = 0; PQExpBuffer (*getLocalPQExpBuffer) (void) = defaultGetLocalPQExpBuffer; +static int fmtIdEncoding = -1; + /* * Returns a temporary PQExpBuffer, valid until the next call to the function. @@ -54,19 +57,54 @@ defaultGetLocalPQExpBuffer(void) return id_return; } +/* + * Set the encoding that fmtId() and fmtQualifiedId() use. + * + * This is not safe against multiple connections having different encodings, + * but there is no real other way to address the need to know the encoding for + * fmtId()/fmtQualifiedId() input for safe escaping. Eventually we should get + * rid of fmtId(). + */ +void +setFmtEncoding(int encoding) +{ + fmtIdEncoding = encoding; +} + +/* + * Return the currently configured encoding for fmtId() and fmtQualifiedId(). + */ +static int +getFmtEncoding(void) +{ + if (fmtIdEncoding != -1) + return fmtIdEncoding; + + /* + * In assertion builds it seems best to fail hard if the encoding was not + * set, to make it easier to find places with missing calls. But in + * production builds that seems like a bad idea, thus we instead just + * default to UTF-8. + */ + Assert(fmtIdEncoding != -1); + + return PG_UTF8; +} + /* * Quotes input string if it's not a legitimate SQL identifier as-is. * - * Note that the returned string must be used before calling fmtId again, + * Note that the returned string must be used before calling fmtIdEnc again, * since we re-use the same return buffer each time. */ const char * -fmtId(const char *rawid) +fmtIdEnc(const char *rawid, int encoding) { PQExpBuffer id_return = getLocalPQExpBuffer(); const char *cp; bool need_quotes = false; + size_t remaining = strlen(rawid); /* * These checks need to match the identifier production in scan.l. Don't @@ -80,7 +118,8 @@ fmtId(const char *rawid) else { /* otherwise check the entire string */ - for (cp = rawid; *cp; cp++) + cp = rawid; + for (size_t i = 0; i < remaining; i++, cp++) { if (!((*cp >= 'a' && *cp <= 'z') || (*cp >= '0' && *cp <= '9') @@ -116,17 +155,79 @@ fmtId(const char *rawid) else { appendPQExpBufferChar(id_return, '"'); - for (cp = rawid; *cp; cp++) + + cp = &rawid[0]; + while (remaining > 0) { - /* - * Did we find a double-quote in the string? Then make this a - * double double-quote per SQL99. Before, we put in a - * backslash/double-quote pair. - thomas 2000-08-05 - */ - if (*cp == '"') - appendPQExpBufferChar(id_return, '"'); - appendPQExpBufferChar(id_return, *cp); + int charlen; + + /* Fast path for plain ASCII */ + if (!IS_HIGHBIT_SET(*cp)) + { + /* + * Did we find a double-quote in the string? Then make this a + * double double-quote per SQL99. Before, we put in a + * backslash/double-quote pair. - thomas 2000-08-05 + */ + if (*cp == '"') + appendPQExpBufferChar(id_return, '"'); + appendPQExpBufferChar(id_return, *cp); + remaining--; + cp++; + continue; + } + + /* Slow path for possible multibyte characters */ + charlen = pg_encoding_mblen(encoding, cp); + + if (remaining < charlen || + pg_encoding_verifymbchar(encoding, cp, charlen) == -1) + { + /* + * Multibyte character is invalid. It's important to verify + * that as invalid multibyte characters could e.g. be used to + * "skip" over quote characters, e.g. when parsing + * character-by-character. + * + * Replace the character's first byte with an invalid + * sequence. The invalid sequence ensures that the escaped + * string will trigger an error on the server-side, even if we + * can't directly report an error here. + * + * It would be a bit faster to verify the whole string the + * first time we encounter a set highbit, but this way we can + * replace just the invalid data, which probably makes it + * easier for users to find the invalidly encoded portion of a + * larger string. + */ + if (enlargePQExpBuffer(id_return, 2)) + { + pg_encoding_set_invalid(encoding, + id_return->data + id_return->len); + id_return->len += 2; + id_return->data[id_return->len] = '\0'; + } + + /* + * Handle the following bytes as if this byte didn't exist. + * That's safer in case the subsequent bytes contain + * characters that are significant for the caller (e.g. '>' in + * html). + */ + remaining--; + cp++; + } + else + { + for (int i = 0; i < charlen; i++) + { + appendPQExpBufferChar(id_return, *cp); + remaining--; + cp++; + } + } } + appendPQExpBufferChar(id_return, '"'); } @@ -134,7 +235,24 @@ fmtId(const char *rawid) } /* - * fmtQualifiedId - construct a schema-qualified name, with quoting as needed. + * Quotes input string if it's not a legitimate SQL identifier as-is. + * + * Note that the returned string must be used before calling fmtId again, + * since we re-use the same return buffer each time. + * + * NB: This assumes setFmtEncoding() previously has been called to configure + * the encoding of rawid. It is preferable to use fmtIdEnc() with an + * explicit encoding. + */ +const char * +fmtId(const char *rawid) +{ + return fmtIdEnc(rawid, getFmtEncoding()); +} + +/* + * fmtQualifiedIdEnc - construct a schema-qualified name, with quoting as + * needed. * * Like fmtId, use the result before calling again. * @@ -142,7 +260,7 @@ fmtId(const char *rawid) * use that buffer until we're finished with calling fmtId(). */ const char * -fmtQualifiedId(const char *schema, const char *id) +fmtQualifiedIdEnc(const char *schema, const char *id, int encoding) { PQExpBuffer id_return; PQExpBuffer lcl_pqexp = createPQExpBuffer(); @@ -150,9 +268,9 @@ fmtQualifiedId(const char *schema, const char *id) /* Some callers might fail to provide a schema name */ if (schema && *schema) { - appendPQExpBuffer(lcl_pqexp, "%s.", fmtId(schema)); + appendPQExpBuffer(lcl_pqexp, "%s.", fmtIdEnc(schema, encoding)); } - appendPQExpBufferStr(lcl_pqexp, fmtId(id)); + appendPQExpBufferStr(lcl_pqexp, fmtIdEnc(id, encoding)); id_return = getLocalPQExpBuffer(); @@ -162,6 +280,24 @@ fmtQualifiedId(const char *schema, const char *id) return id_return->data; } +/* + * fmtQualifiedId - construct a schema-qualified name, with quoting as needed. + * + * Like fmtId, use the result before calling again. + * + * Since we call fmtId and it also uses getLocalPQExpBuffer() we cannot + * use that buffer until we're finished with calling fmtId(). + * + * NB: This assumes setFmtEncoding() previously has been called to configure + * the encoding of schema/id. It is preferable to use fmtQualifiedIdEnc() + * with an explicit encoding. + */ +const char * +fmtQualifiedId(const char *schema, const char *id) +{ + return fmtQualifiedIdEnc(schema, id, getFmtEncoding()); +} + /* * Format a Postgres version number (in the PG_VERSION_NUM integer format @@ -218,6 +354,7 @@ appendStringLiteral(PQExpBuffer buf, const char *str, size_t length = strlen(str); const char *source = str; char *target; + size_t remaining = length; if (!enlargePQExpBuffer(buf, 2 * length + 2)) return; @@ -225,10 +362,10 @@ appendStringLiteral(PQExpBuffer buf, const char *str, target = buf->data + buf->len; *target++ = '\''; - while (*source != '\0') + while (remaining > 0) { char c = *source; - int len; + int charlen; int i; /* Fast path for plain ASCII */ @@ -240,39 +377,55 @@ appendStringLiteral(PQExpBuffer buf, const char *str, /* Copy the character */ *target++ = c; source++; + remaining--; continue; } /* Slow path for possible multibyte characters */ - len = PQmblen(source, encoding); + charlen = PQmblen(source, encoding); - /* Copy the character */ - for (i = 0; i < len; i++) + if (remaining < charlen || + pg_encoding_verifymbchar(encoding, source, charlen) == -1) { - if (*source == '\0') - break; - *target++ = *source++; - } + /* + * Multibyte character is invalid. It's important to verify that + * as invalid multibyte characters could e.g. be used to "skip" + * over quote characters, e.g. when parsing + * character-by-character. + * + * Replace the character's first byte with an invalid sequence. + * The invalid sequence ensures that the escaped string will + * trigger an error on the server-side, even if we can't directly + * report an error here. + * + * We know there's enough space for the invalid sequence because + * the "target" buffer is 2 * length + 2 long, and at worst we're + * replacing a single input byte with two invalid bytes. + * + * It would be a bit faster to verify the whole string the first + * time we encounter a set highbit, but this way we can replace + * just the invalid data, which probably makes it easier for users + * to find the invalidly encoded portion of a larger string. + */ + pg_encoding_set_invalid(encoding, target); + target += 2; - /* - * If we hit premature end of string (ie, incomplete multibyte - * character), try to pad out to the correct length with spaces. We - * may not be able to pad completely, but we will always be able to - * insert at least one pad space (since we'd not have quoted a - * multibyte character). This should be enough to make a string that - * the server will error out on. - */ - if (i < len) + /* + * Handle the following bytes as if this byte didn't exist. That's + * safer in case the subsequent bytes contain important characters + * for the caller (e.g. '>' in html). + */ + source++; + remaining--; + } + else { - char *stop = buf->data + buf->maxlen - 2; - - for (; i < len; i++) + /* Copy the character */ + for (i = 0; i < charlen; i++) { - if (target >= stop) - break; - *target++ = ' '; + *target++ = *source++; + remaining--; } - break; } } @@ -616,29 +769,38 @@ appendPsqlMetaConnect(PQExpBuffer buf, const char *dbname) } } - appendPQExpBufferStr(buf, "\\connect "); if (complex) { PQExpBufferData connstr; initPQExpBuffer(&connstr); + + /* + * Force the target psql's encoding to SQL_ASCII. We don't really + * know the encoding of the database name, and it doesn't matter as + * long as psql will forward it to the server unchanged. + */ + appendPQExpBufferStr(buf, "\\encoding SQL_ASCII\n"); + appendPQExpBufferStr(buf, "\\connect -reuse-previous=on "); + appendPQExpBufferStr(&connstr, "dbname="); appendConnStrVal(&connstr, dbname); - appendPQExpBufferStr(buf, "-reuse-previous=on "); - /* * As long as the name does not contain a newline, SQL identifier * quoting satisfies the psql meta-command parser. Prefer not to * involve psql-interpreted single quotes, which behaved differently * before PostgreSQL 9.2. */ - appendPQExpBufferStr(buf, fmtId(connstr.data)); + appendPQExpBufferStr(buf, fmtIdEnc(connstr.data, PG_SQL_ASCII)); termPQExpBuffer(&connstr); } else - appendPQExpBufferStr(buf, fmtId(dbname)); + { + appendPQExpBufferStr(buf, "\\connect "); + appendPQExpBufferStr(buf, fmtIdEnc(dbname, PG_SQL_ASCII)); + } appendPQExpBufferChar(buf, '\n'); } @@ -761,7 +923,7 @@ appendPGArray(PQExpBuffer buffer, const char *value) if (ch == '"' || ch == '\\' || ch == '{' || ch == '}' || ch == ',' || - /* these match array_isspace(): */ + /* these match scanner_isspace(): */ ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' || ch == '\v' || ch == '\f') { diff --git a/src/include/Makefile b/src/include/Makefile index 56576dcf5c9f9..b8b576a4de3b7 100644 --- a/src/include/Makefile +++ b/src/include/Makefile @@ -40,6 +40,7 @@ install: all installdirs $(INSTALL_DATA) $(srcdir)/port.h '$(DESTDIR)$(includedir_internal)' $(INSTALL_DATA) $(srcdir)/postgres_fe.h '$(DESTDIR)$(includedir_internal)' $(INSTALL_DATA) $(srcdir)/libpq/pqcomm.h '$(DESTDIR)$(includedir_internal)/libpq' + $(INSTALL_DATA) $(srcdir)/libpq/protocol.h '$(DESTDIR)$(includedir_internal)/libpq' # These headers are needed for server-side development $(INSTALL_DATA) pg_config.h '$(DESTDIR)$(includedir_server)' $(INSTALL_DATA) pg_config_ext.h '$(DESTDIR)$(includedir_server)' @@ -53,10 +54,11 @@ install: all installdirs $(INSTALL_DATA) $(srcdir)/$$dir/*.h '$(DESTDIR)$(includedir_server)'/$$dir || exit; \ done ifeq ($(vpath_build),yes) - for file in catalog/schemapg.h catalog/system_fk_info.h catalog/pg_*_d.h storage/lwlocknames.h utils/probes.h; do \ + for file in storage/lwlocknames.h utils/probes.h utils/wait_event_types.h; do \ $(INSTALL_DATA) $$file '$(DESTDIR)$(includedir_server)'/$$file || exit; \ done endif + $(MAKE) -C catalog install installdirs: $(MKDIR_P) '$(DESTDIR)$(includedir)/libpq' '$(DESTDIR)$(includedir_internal)/libpq' @@ -65,17 +67,17 @@ installdirs: uninstall: rm -f $(addprefix '$(DESTDIR)$(includedir)'/, pg_config.h pg_config_ext.h pg_config_os.h pg_config_manual.h postgres_ext.h libpq/libpq-fs.h) - rm -f $(addprefix '$(DESTDIR)$(includedir_internal)'/, c.h port.h postgres_fe.h libpq/pqcomm.h) + rm -f $(addprefix '$(DESTDIR)$(includedir_internal)'/, c.h port.h postgres_fe.h libpq/pqcomm.h libpq/protocol.h) # heuristic... rm -rf $(addprefix '$(DESTDIR)$(includedir_server)'/, $(SUBDIRS) *.h) + $(MAKE) -C catalog uninstall clean: rm -f utils/fmgroids.h utils/fmgrprotos.h utils/errcodes.h utils/header-stamp - rm -f storage/lwlocknames.h utils/probes.h - rm -f catalog/schemapg.h catalog/system_fk_info.h - rm -f catalog/pg_*_d.h catalog/header-stamp + rm -f storage/lwlocknames.h utils/probes.h utils/wait_event_types.h rm -f nodes/nodetags.h nodes/header-stamp + $(MAKE) -C catalog clean -distclean maintainer-clean: clean +distclean: clean rm -f pg_config.h pg_config_ext.h pg_config_os.h stamp-h stamp-ext-h diff --git a/src/include/access/amapi.h b/src/include/access/amapi.h index 4476ff7fba173..d3e5e5d591882 100644 --- a/src/include/access/amapi.h +++ b/src/include/access/amapi.h @@ -3,7 +3,7 @@ * amapi.h * API for Postgres index access methods. * - * Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Copyright (c) 2015-2024, PostgreSQL Global Development Group * * src/include/access/amapi.h * @@ -51,7 +51,7 @@ typedef enum IndexAMProperty AMPROP_CAN_UNIQUE, AMPROP_CAN_MULTI_COL, AMPROP_CAN_EXCLUDE, - AMPROP_CAN_INCLUDE + AMPROP_CAN_INCLUDE, } IndexAMProperty; /* @@ -76,6 +76,10 @@ typedef enum IndexAMProperty * opfamily. This allows ALTER OPERATOR FAMILY DROP, and causes that to * happen automatically if the operator or support func is dropped. This * is the right behavior for inessential ("loose") objects. + * + * We also make dependencies on lefttype/righttype, of the same strength as + * the dependency on the operator or support func, unless these dependencies + * are redundant with the dependency on the operator or support func. */ typedef struct OpFamilyMember { @@ -113,6 +117,10 @@ typedef bool (*aminsert_function) (Relation indexRelation, bool indexUnchanged, struct IndexInfo *indexInfo); +/* cleanup after insert */ +typedef void (*aminsertcleanup_function) (Relation indexRelation, + struct IndexInfo *indexInfo); + /* bulk delete */ typedef IndexBulkDeleteResult *(*ambulkdelete_function) (IndexVacuumInfo *info, IndexBulkDeleteResult *stats, @@ -191,7 +199,7 @@ typedef void (*amrestrpos_function) (IndexScanDesc scan); */ /* estimate size of parallel scan descriptor */ -typedef Size (*amestimateparallelscan_function) (void); +typedef Size (*amestimateparallelscan_function) (int nkeys, int norderbys); /* prepare for parallel index scan */ typedef void (*aminitparallelscan_function) (void *target); @@ -240,6 +248,8 @@ typedef struct IndexAmRoutine bool ampredlocks; /* does AM support parallel scan? */ bool amcanparallel; + /* does AM support parallel build? */ + bool amcanbuildparallel; /* does AM support columns included with clause INCLUDE? */ bool amcaninclude; /* does AM use maintenance_work_mem? */ @@ -261,6 +271,7 @@ typedef struct IndexAmRoutine ambuild_function ambuild; ambuildempty_function ambuildempty; aminsert_function aminsert; + aminsertcleanup_function aminsertcleanup; ambulkdelete_function ambulkdelete; amvacuumcleanup_function amvacuumcleanup; amcanreturn_function amcanreturn; /* can be NULL */ diff --git a/src/include/access/amvalidate.h b/src/include/access/amvalidate.h index 63d0e49e710e5..424ab63fa5ac0 100644 --- a/src/include/access/amvalidate.h +++ b/src/include/access/amvalidate.h @@ -4,7 +4,7 @@ * Support routines for index access methods' amvalidate and * amadjustmembers functions. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * src/include/access/amvalidate.h * diff --git a/src/include/access/attmap.h b/src/include/access/attmap.h index 9156a1202bf30..123ec45c1390c 100644 --- a/src/include/access/attmap.h +++ b/src/include/access/attmap.h @@ -4,7 +4,7 @@ * Definitions for PostgreSQL attribute mappings * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/attmap.h diff --git a/src/include/access/attnum.h b/src/include/access/attnum.h index 4c4329526f18b..0c17e33b1437a 100644 --- a/src/include/access/attnum.h +++ b/src/include/access/attnum.h @@ -4,7 +4,7 @@ * POSTGRES attribute number definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/attnum.h diff --git a/src/include/access/brin.h b/src/include/access/brin.h index ed66f1b3d51d7..1c786281dd9f1 100644 --- a/src/include/access/brin.h +++ b/src/include/access/brin.h @@ -1,7 +1,7 @@ /* * AM-callable functions for BRIN indexes * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -11,6 +11,7 @@ #define BRIN_H #include "nodes/execnodes.h" +#include "storage/shm_toc.h" #include "utils/relcache.h" @@ -52,4 +53,6 @@ typedef struct BrinStatsData extern void brinGetStats(Relation index, BrinStatsData *stats); +extern void _brin_parallel_build_main(dsm_segment *seg, shm_toc *toc); + #endif /* BRIN_H */ diff --git a/src/include/access/brin_internal.h b/src/include/access/brin_internal.h index 97ddc925b27fb..a5a9772621c7f 100644 --- a/src/include/access/brin_internal.h +++ b/src/include/access/brin_internal.h @@ -2,7 +2,7 @@ * brin_internal.h * internal declarations for BRIN indexes * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -96,6 +96,7 @@ extern bool brininsert(Relation idxRel, Datum *values, bool *nulls, IndexUniqueCheck checkUnique, bool indexUnchanged, struct IndexInfo *indexInfo); +extern void brininsertcleanup(Relation index, struct IndexInfo *indexInfo); extern IndexScanDesc brinbeginscan(Relation r, int nkeys, int norderbys); extern int64 bringetbitmap(IndexScanDesc scan, TIDBitmap *tbm); extern void brinrescan(IndexScanDesc scan, ScanKey scankey, int nscankeys, diff --git a/src/include/access/brin_page.h b/src/include/access/brin_page.h index 3670ca601027e..70b141c25ec1d 100644 --- a/src/include/access/brin_page.h +++ b/src/include/access/brin_page.h @@ -2,7 +2,7 @@ * brin_page.h * Prototypes and definitions for BRIN page layouts * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/access/brin_pageops.h b/src/include/access/brin_pageops.h index 041cc3241ac23..9b6230993b279 100644 --- a/src/include/access/brin_pageops.h +++ b/src/include/access/brin_pageops.h @@ -2,7 +2,7 @@ * brin_pageops.h * Prototypes for operating on BRIN pages. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/access/brin_revmap.h b/src/include/access/brin_revmap.h index 75323630e077c..62e97965194d2 100644 --- a/src/include/access/brin_revmap.h +++ b/src/include/access/brin_revmap.h @@ -2,7 +2,7 @@ * brin_revmap.h * Prototypes for BRIN reverse range maps * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -24,7 +24,7 @@ typedef struct BrinRevmap BrinRevmap; extern BrinRevmap *brinRevmapInitialize(Relation idxrel, - BlockNumber *pagesPerRange, Snapshot snapshot); + BlockNumber *pagesPerRange); extern void brinRevmapTerminate(BrinRevmap *revmap); extern void brinRevmapExtend(BrinRevmap *revmap, @@ -35,7 +35,7 @@ extern void brinSetHeapBlockItemptr(Buffer buf, BlockNumber pagesPerRange, BlockNumber heapBlk, ItemPointerData tid); extern BrinTuple *brinGetTupleForHeapBlock(BrinRevmap *revmap, BlockNumber heapBlk, Buffer *buf, OffsetNumber *off, - Size *size, int mode, Snapshot snapshot); + Size *size, int mode); extern bool brinRevmapDesummarizeRange(Relation idxrel, BlockNumber heapBlk); #endif /* BRIN_REVMAP_H */ diff --git a/src/include/access/brin_tuple.h b/src/include/access/brin_tuple.h index 6f33ba6b25651..c8850fd6c0824 100644 --- a/src/include/access/brin_tuple.h +++ b/src/include/access/brin_tuple.h @@ -2,7 +2,7 @@ * brin_tuple.h * Declarations for dealing with BRIN-specific tuples. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/access/brin_xlog.h b/src/include/access/brin_xlog.h index ae263a371f4d2..34719344f7c28 100644 --- a/src/include/access/brin_xlog.h +++ b/src/include/access/brin_xlog.h @@ -4,7 +4,7 @@ * POSTGRES BRIN access XLOG definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/brin_xlog.h diff --git a/src/include/access/bufmask.h b/src/include/access/bufmask.h index cf29ba49c6647..83174d1ef0fd9 100644 --- a/src/include/access/bufmask.h +++ b/src/include/access/bufmask.h @@ -7,7 +7,7 @@ * individual rmgr, but we make things easier by providing some * common routines to handle cases which occur in multiple rmgrs. * - * Portions Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group * * src/include/access/bufmask.h * diff --git a/src/include/access/clog.h b/src/include/access/clog.h index d99444f073f04..8e62917e498a4 100644 --- a/src/include/access/clog.h +++ b/src/include/access/clog.h @@ -3,7 +3,7 @@ * * PostgreSQL transaction-commit-log manager * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/clog.h @@ -31,7 +31,7 @@ typedef int XidStatus; typedef struct xl_clog_truncate { - int pageno; + int64 pageno; TransactionId oldestXact; Oid oldestXactDb; } xl_clog_truncate; @@ -40,7 +40,6 @@ extern void TransactionIdSetTreeStatus(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, XLogRecPtr lsn); extern XidStatus TransactionIdGetStatus(TransactionId xid, XLogRecPtr *lsn); -extern Size CLOGShmemBuffers(void); extern Size CLOGShmemSize(void); extern void CLOGShmemInit(void); extern void BootStrapCLOG(void); diff --git a/src/include/access/commit_ts.h b/src/include/access/commit_ts.h index 5087cdce51e2c..82d3aa862753f 100644 --- a/src/include/access/commit_ts.h +++ b/src/include/access/commit_ts.h @@ -3,7 +3,7 @@ * * PostgreSQL commit timestamp manager * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/commit_ts.h @@ -27,7 +27,6 @@ extern bool TransactionIdGetCommitTsData(TransactionId xid, extern TransactionId GetLatestCommitTsData(TimestampTz *ts, RepOriginId *nodeid); -extern Size CommitTsShmemBuffers(void); extern Size CommitTsShmemSize(void); extern void CommitTsShmemInit(void); extern void BootStrapCommitTs(void); @@ -60,7 +59,7 @@ typedef struct xl_commit_ts_set typedef struct xl_commit_ts_truncate { - int pageno; + int64 pageno; TransactionId oldestXid; } xl_commit_ts_truncate; diff --git a/src/include/access/detoast.h b/src/include/access/detoast.h index 908e1fc6919c2..12d8cdb356a84 100644 --- a/src/include/access/detoast.h +++ b/src/include/access/detoast.h @@ -3,7 +3,7 @@ * detoast.h * Access to compressed and external varlena values. * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/include/access/detoast.h * diff --git a/src/include/access/genam.h b/src/include/access/genam.h index a30879566549a..c25f5d11b5342 100644 --- a/src/include/access/genam.h +++ b/src/include/access/genam.h @@ -4,7 +4,7 @@ * POSTGRES generalized index access method definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/genam.h @@ -117,7 +117,7 @@ typedef enum IndexUniqueCheck UNIQUE_CHECK_NO, /* Don't do any uniqueness checking */ UNIQUE_CHECK_YES, /* Enforce uniqueness at insertion time */ UNIQUE_CHECK_PARTIAL, /* Test uniqueness, but no error */ - UNIQUE_CHECK_EXISTING /* Check if existing tuple is unique */ + UNIQUE_CHECK_EXISTING, /* Check if existing tuple is unique */ } IndexUniqueCheck; @@ -139,6 +139,7 @@ typedef struct IndexOrderByDistance #define IndexScanIsValid(scan) PointerIsValid(scan) extern Relation index_open(Oid relationId, LOCKMODE lockmode); +extern Relation try_index_open(Oid relationId, LOCKMODE lockmode); extern void index_close(Relation relation, LOCKMODE lockmode); extern bool index_insert(Relation indexRelation, @@ -148,6 +149,8 @@ extern bool index_insert(Relation indexRelation, IndexUniqueCheck checkUnique, bool indexUnchanged, struct IndexInfo *indexInfo); +extern void index_insert_cleanup(Relation indexRelation, + struct IndexInfo *indexInfo); extern IndexScanDesc index_beginscan(Relation heapRelation, Relation indexRelation, @@ -162,7 +165,8 @@ extern void index_rescan(IndexScanDesc scan, extern void index_endscan(IndexScanDesc scan); extern void index_markpos(IndexScanDesc scan); extern void index_restrpos(IndexScanDesc scan); -extern Size index_parallelscan_estimate(Relation indexRelation, Snapshot snapshot); +extern Size index_parallelscan_estimate(Relation indexRelation, + int nkeys, int norderbys, Snapshot snapshot); extern void index_parallelscan_initialize(Relation heapRelation, Relation indexRelation, Snapshot snapshot, ParallelIndexScanDesc target); @@ -204,7 +208,7 @@ extern IndexScanDesc RelationGetIndexScan(Relation indexRelation, int nkeys, int norderbys); extern void IndexScanEnd(IndexScanDesc scan); extern char *BuildIndexValueDescription(Relation indexRelation, - Datum *values, bool *isnull); + const Datum *values, const bool *isnull); extern TransactionId index_compute_xid_horizon_for_tuples(Relation irel, Relation hrel, Buffer ibuf, @@ -229,5 +233,14 @@ extern SysScanDesc systable_beginscan_ordered(Relation heapRelation, extern HeapTuple systable_getnext_ordered(SysScanDesc sysscan, ScanDirection direction); extern void systable_endscan_ordered(SysScanDesc sysscan); +extern void systable_inplace_update_begin(Relation relation, + Oid indexId, + bool indexOK, + Snapshot snapshot, + int nkeys, const ScanKeyData *key, + HeapTuple *oldtupcopy, + void **state); +extern void systable_inplace_update_finish(void *state, HeapTuple tuple); +extern void systable_inplace_update_cancel(void *state); #endif /* GENAM_H */ diff --git a/src/include/access/generic_xlog.h b/src/include/access/generic_xlog.h index 66941f99a8474..fd1aeb81f46eb 100644 --- a/src/include/access/generic_xlog.h +++ b/src/include/access/generic_xlog.h @@ -4,7 +4,7 @@ * Generic xlog API definition. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/generic_xlog.h @@ -15,7 +15,7 @@ #define GENERIC_XLOG_H #include "access/xlog.h" -#include "access/xlog_internal.h" +#include "access/xlogreader.h" #include "access/xloginsert.h" #include "storage/bufpage.h" #include "utils/rel.h" diff --git a/src/include/access/gin.h b/src/include/access/gin.h index f1655065289a8..25983b7a50566 100644 --- a/src/include/access/gin.h +++ b/src/include/access/gin.h @@ -2,7 +2,7 @@ * gin.h * Public header file for Generalized Inverted Index access method. * - * Copyright (c) 2006-2023, PostgreSQL Global Development Group + * Copyright (c) 2006-2024, PostgreSQL Global Development Group * * src/include/access/gin.h *-------------------------------------------------------------------------- diff --git a/src/include/access/gin_private.h b/src/include/access/gin_private.h index 6da64928b6636..3013a44bae1c2 100644 --- a/src/include/access/gin_private.h +++ b/src/include/access/gin_private.h @@ -2,7 +2,7 @@ * gin_private.h * header file for postgres inverted index access method implementation. * - * Copyright (c) 2006-2023, PostgreSQL Global Development Group + * Copyright (c) 2006-2024, PostgreSQL Global Development Group * * src/include/access/gin_private.h *-------------------------------------------------------------------------- @@ -14,6 +14,7 @@ #include "access/gin.h" #include "access/ginblock.h" #include "access/itup.h" +#include "common/int.h" #include "catalog/pg_am_d.h" #include "fmgr.h" #include "lib/rbtree.h" @@ -143,7 +144,7 @@ typedef enum { GPTP_NO_WORK, GPTP_INSERT, - GPTP_SPLIT + GPTP_SPLIT, } GinPlaceToPageRC; typedef struct GinBtreeData @@ -202,7 +203,7 @@ typedef struct */ extern GinBtreeStack *ginFindLeafPage(GinBtree btree, bool searchMode, - bool rootConflictCheck, Snapshot snapshot); + bool rootConflictCheck); extern Buffer ginStepRight(Buffer buffer, Relation index, int lockmode); extern void freeGinBtreeStack(GinBtreeStack *stack); extern void ginInsertValue(GinBtree btree, GinBtreeStack *stack, @@ -230,7 +231,7 @@ extern void GinPageDeletePostingItem(Page page, OffsetNumber offset); extern void ginInsertItemPointers(Relation index, BlockNumber rootBlkno, ItemPointerData *items, uint32 nitem, GinStatsData *buildStats); -extern GinBtreeStack *ginScanBeginPostingTree(GinBtree btree, Relation index, BlockNumber rootBlkno, Snapshot snapshot); +extern GinBtreeStack *ginScanBeginPostingTree(GinBtree btree, Relation index, BlockNumber rootBlkno); extern void ginDataFillRoot(GinBtree btree, Page root, BlockNumber lblkno, Page lpage, BlockNumber rblkno, Page rpage); /* @@ -489,12 +490,7 @@ ginCompareItemPointers(ItemPointer a, ItemPointer b) uint64 ia = (uint64) GinItemPointerGetBlockNumber(a) << 32 | GinItemPointerGetOffsetNumber(a); uint64 ib = (uint64) GinItemPointerGetBlockNumber(b) << 32 | GinItemPointerGetOffsetNumber(b); - if (ia == ib) - return 0; - else if (ia > ib) - return 1; - else - return -1; + return pg_cmp_u64(ia, ib); } extern int ginTraverseLock(Buffer buffer, bool searchMode); diff --git a/src/include/access/ginblock.h b/src/include/access/ginblock.h index c59790ec5a99d..b3b7daa049ac6 100644 --- a/src/include/access/ginblock.h +++ b/src/include/access/ginblock.h @@ -2,7 +2,7 @@ * ginblock.h * details of structures stored in GIN index blocks * - * Copyright (c) 2006-2023, PostgreSQL Global Development Group + * Copyright (c) 2006-2024, PostgreSQL Global Development Group * * src/include/access/ginblock.h *-------------------------------------------------------------------------- diff --git a/src/include/access/ginxlog.h b/src/include/access/ginxlog.h index 37095e5f17cea..0c2ddbd82a649 100644 --- a/src/include/access/ginxlog.h +++ b/src/include/access/ginxlog.h @@ -2,7 +2,7 @@ * ginxlog.h * header file for postgres inverted index xlog implementation. * - * Copyright (c) 2006-2023, PostgreSQL Global Development Group + * Copyright (c) 2006-2024, PostgreSQL Global Development Group * * src/include/access/ginxlog.h *-------------------------------------------------------------------------- diff --git a/src/include/access/gist.h b/src/include/access/gist.h index 0235716c06f80..c6dcd6a90ddbc 100644 --- a/src/include/access/gist.h +++ b/src/include/access/gist.h @@ -6,7 +6,7 @@ * changes should be made with care. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/gist.h diff --git a/src/include/access/gist_private.h b/src/include/access/gist_private.h index 3edc740a3f34a..7b8749c8db06e 100644 --- a/src/include/access/gist_private.h +++ b/src/include/access/gist_private.h @@ -4,7 +4,7 @@ * private declarations for GiST -- declarations related to the * internal implementation of GiST, not the public API * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/gist_private.h @@ -187,8 +187,8 @@ typedef struct gistxlogPage int num; /* number of index tuples following */ } gistxlogPage; -/* SplitedPageLayout - gistSplit function result */ -typedef struct SplitedPageLayout +/* SplitPageLayout - gistSplit function result */ +typedef struct SplitPageLayout { gistxlogPage block; IndexTupleData *list; @@ -197,8 +197,8 @@ typedef struct SplitedPageLayout Page page; /* to operate */ Buffer buffer; /* to write after all proceed */ - struct SplitedPageLayout *next; -} SplitedPageLayout; + struct SplitPageLayout *next; +} SplitPageLayout; /* * GISTInsertStack used for locking buffers and transfer arguments during @@ -385,7 +385,7 @@ typedef enum GistOptBufferingMode { GIST_OPTION_BUFFERING_AUTO, GIST_OPTION_BUFFERING_ON, - GIST_OPTION_BUFFERING_OFF + GIST_OPTION_BUFFERING_OFF, } GistOptBufferingMode; /* @@ -432,8 +432,8 @@ extern bool gistplacetopage(Relation rel, Size freespace, GISTSTATE *giststate, Relation heapRel, bool is_build); -extern SplitedPageLayout *gistSplit(Relation r, Page page, IndexTuple *itup, - int len, GISTSTATE *giststate); +extern SplitPageLayout *gistSplit(Relation r, Page page, IndexTuple *itup, + int len, GISTSTATE *giststate); /* gistxlog.c */ extern XLogRecPtr gistXLogPageDelete(Buffer buffer, @@ -453,7 +453,7 @@ extern XLogRecPtr gistXLogDelete(Buffer buffer, OffsetNumber *todelete, Relation heaprel); extern XLogRecPtr gistXLogSplit(bool page_is_leaf, - SplitedPageLayout *dist, + SplitPageLayout *dist, BlockNumber origrlink, GistNSN orignsn, Buffer leftchildbuf, bool markfollowright); @@ -502,9 +502,9 @@ extern IndexTuple gistgetadjusted(Relation r, IndexTuple addtup, GISTSTATE *giststate); extern IndexTuple gistFormTuple(GISTSTATE *giststate, - Relation r, Datum *attdata, bool *isnull, bool isleaf); + Relation r, const Datum *attdata, const bool *isnull, bool isleaf); extern void gistCompressValues(GISTSTATE *giststate, Relation r, - Datum *attdata, bool *isnull, bool isleaf, Datum *compatt); + const Datum *attdata, const bool *isnull, bool isleaf, Datum *compatt); extern OffsetNumber gistchoose(Relation r, Page p, IndexTuple it, diff --git a/src/include/access/gistscan.h b/src/include/access/gistscan.h index 65911245f7451..ba2153869a319 100644 --- a/src/include/access/gistscan.h +++ b/src/include/access/gistscan.h @@ -4,7 +4,7 @@ * routines defined in access/gist/gistscan.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/gistscan.h diff --git a/src/include/access/gistxlog.h b/src/include/access/gistxlog.h index aff2ffbdcc242..a0bdc5d7d7bea 100644 --- a/src/include/access/gistxlog.h +++ b/src/include/access/gistxlog.h @@ -3,7 +3,7 @@ * gistxlog.h * gist xlog routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/gistxlog.h @@ -69,7 +69,7 @@ typedef struct gistxlogPageSplit { BlockNumber origrlink; /* rightlink of the page before split */ GistNSN orignsn; /* NSN of the page before split */ - bool origleaf; /* was splitted page a leaf page? */ + bool origleaf; /* was split page a leaf page? */ uint16 npage; /* # of pages in the split */ bool markfollowright; /* set F_FOLLOW_RIGHT flags */ diff --git a/src/include/access/hash.h b/src/include/access/hash.h index 9e035270a16c9..9c7d81525b4f4 100644 --- a/src/include/access/hash.h +++ b/src/include/access/hash.h @@ -4,7 +4,7 @@ * header file for postgres hash access method implementation * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/hash.h @@ -451,7 +451,7 @@ typedef struct HSpool HSpool; /* opaque struct in hashsort.c */ extern HSpool *_h_spoolinit(Relation heap, Relation index, uint32 num_buckets); extern void _h_spooldestroy(HSpool *hspool); extern void _h_spool(HSpool *hspool, ItemPointer self, - Datum *values, bool *isnull); + const Datum *values, const bool *isnull); extern void _h_indexbuild(HSpool *hspool, Relation heapRel); /* hashutil.c */ diff --git a/src/include/access/hash_xlog.h b/src/include/access/hash_xlog.h index b93619d1a8148..daca9531d0c74 100644 --- a/src/include/access/hash_xlog.h +++ b/src/include/access/hash_xlog.h @@ -4,7 +4,7 @@ * header file for Postgres hash AM implementation * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/hash_xlog.h diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h index faf50265191c7..65999dd64e160 100644 --- a/src/include/access/heapam.h +++ b/src/include/access/heapam.h @@ -4,7 +4,7 @@ * POSTGRES heap access method definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/heapam.h @@ -25,6 +25,7 @@ #include "storage/bufpage.h" #include "storage/dsm.h" #include "storage/lockdefs.h" +#include "storage/read_stream.h" #include "storage/shm_toc.h" #include "utils/relcache.h" #include "utils/snapshot.h" @@ -36,6 +37,10 @@ #define HEAP_INSERT_NO_LOGICAL TABLE_INSERT_NO_LOGICAL #define HEAP_INSERT_SPECULATIVE 0x0010 +/* "options" flag bits for heap_page_prune_and_freeze */ +#define HEAP_PAGE_PRUNE_MARK_UNUSED_NOW (1 << 0) +#define HEAP_PAGE_PRUNE_FREEZE (1 << 1) + typedef struct BulkInsertStateData *BulkInsertState; struct TupleTableSlot; struct VacuumCutoffs; @@ -66,12 +71,36 @@ typedef struct HeapScanDescData HeapTupleData rs_ctup; /* current tuple in scan, if any */ + /* For scans that stream reads */ + ReadStream *rs_read_stream; + + /* + * For sequential scans and TID range scans to stream reads. The read + * stream is allocated at the beginning of the scan and reset on rescan or + * when the scan direction changes. The scan direction is saved each time + * a new page is requested. If the scan direction changes from one page to + * the next, the read stream releases all previously pinned buffers and + * resets the prefetch block. + */ + ScanDirection rs_dir; + BlockNumber rs_prefetch_block; + /* * For parallel scans to store page allocation data. NULL when not * performing a parallel scan. */ ParallelBlockTableScanWorkerData *rs_parallelworkerdata; + /* + * These fields are only used for bitmap scans for the "skip fetch" + * optimization. Bitmap scans needing no fields from the heap may skip + * fetching an all visible block, instead using the number of tuples per + * block reported by the bitmap to determine how many NULL-filled tuples + * to return. + */ + Buffer rs_vmbuffer; + int rs_empty_tuples_pending; + /* these fields only used in page-at-a-time mode and for bitmap scans */ int rs_cindex; /* current tuple's index in vistuples */ int rs_ntuples; /* number of visible tuples on page */ @@ -97,7 +126,7 @@ typedef enum HEAPTUPLE_LIVE, /* tuple is live (committed, no deleter) */ HEAPTUPLE_RECENTLY_DEAD, /* tuple is dead, but not deletable yet */ HEAPTUPLE_INSERT_IN_PROGRESS, /* inserting xact is still in progress */ - HEAPTUPLE_DELETE_IN_PROGRESS /* deleting xact is still in progress */ + HEAPTUPLE_DELETE_IN_PROGRESS, /* deleting xact is still in progress */ } HTSV_Result; /* @@ -191,6 +220,57 @@ typedef struct HeapPageFreeze } HeapPageFreeze; +/* + * Per-page state returned by heap_page_prune_and_freeze() + */ +typedef struct PruneFreezeResult +{ + int ndeleted; /* Number of tuples deleted from the page */ + int nnewlpdead; /* Number of newly LP_DEAD items */ + int nfrozen; /* Number of tuples we froze */ + + /* Number of live and recently dead tuples on the page, after pruning */ + int live_tuples; + int recently_dead_tuples; + + /* + * all_visible and all_frozen indicate if the all-visible and all-frozen + * bits in the visibility map can be set for this page, after pruning. + * + * vm_conflict_horizon is the newest xmin of live tuples on the page. The + * caller can use it as the conflict horizon when setting the VM bits. It + * is only valid if we froze some tuples (nfrozen > 0), and all_frozen is + * true. + * + * These are only set if the HEAP_PRUNE_FREEZE option is set. + */ + bool all_visible; + bool all_frozen; + TransactionId vm_conflict_horizon; + + /* + * Whether or not the page makes rel truncation unsafe. This is set to + * 'true', even if the page contains LP_DEAD items. VACUUM will remove + * them before attempting to truncate. + */ + bool hastup; + + /* + * LP_DEAD items on the page after pruning. Includes existing LP_DEAD + * items. + */ + int lpdead_items; + OffsetNumber deadoffsets[MaxHeapTuplesPerPage]; +} PruneFreezeResult; + +/* 'reason' codes for heap_page_prune_and_freeze() */ +typedef enum +{ + PRUNE_ON_ACCESS, /* on-access pruning */ + PRUNE_VACUUM_SCAN, /* VACUUM 1st heap pass */ + PRUNE_VACUUM_CLEANUP, /* VACUUM 2nd heap pass */ +} PruneReason; + /* ---------------- * function prototypes for heap access method * @@ -212,7 +292,7 @@ extern TableScanDesc heap_beginscan(Relation relation, Snapshot snapshot, uint32 flags); extern void heap_setscanlimits(TableScanDesc sscan, BlockNumber startBlk, BlockNumber numBlks); -extern void heapgetpage(TableScanDesc sscan, BlockNumber block); +extern void heap_prepare_pagescan(TableScanDesc sscan); extern void heap_rescan(TableScanDesc sscan, ScanKey key, bool set_params, bool allow_strat, bool allow_sync, bool allow_pagemode); extern void heap_endscan(TableScanDesc sscan); @@ -256,14 +336,24 @@ extern TM_Result heap_lock_tuple(Relation relation, HeapTuple tuple, bool follow_updates, Buffer *buffer, struct TM_FailureData *tmfd); +extern bool heap_inplace_lock(Relation relation, + HeapTuple oldtup_ptr, Buffer buffer, + void (*release_callback) (void *), void *arg); +extern void heap_inplace_update_and_unlock(Relation relation, + HeapTuple oldtup, HeapTuple tuple, + Buffer buffer); +extern void heap_inplace_unlock(Relation relation, + HeapTuple oldtup, Buffer buffer); extern void heap_inplace_update(Relation relation, HeapTuple tuple); extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple, const struct VacuumCutoffs *cutoffs, HeapPageFreeze *pagefrz, HeapTupleFreeze *frz, bool *totally_frozen); -extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer, - TransactionId snapshotConflictHorizon, - HeapTupleFreeze *tuples, int ntuples); + +extern void heap_pre_freeze_checks(Buffer buffer, + HeapTupleFreeze *tuples, int ntuples); +extern void heap_freeze_prepared_tuples(Buffer buffer, + HeapTupleFreeze *tuples, int ntuples); extern bool heap_freeze_tuple(HeapTupleHeader tuple, TransactionId relfrozenxid, TransactionId relminmxid, TransactionId FreezeLimit, TransactionId MultiXactCutoff); @@ -284,17 +374,28 @@ extern TransactionId heap_index_delete_tuples(Relation rel, /* in heap/pruneheap.c */ struct GlobalVisState; extern void heap_page_prune_opt(Relation relation, Buffer buffer); -extern int heap_page_prune(Relation relation, Buffer buffer, - struct GlobalVisState *vistest, - TransactionId old_snap_xmin, - TimestampTz old_snap_ts, - int *nnewlpdead, - OffsetNumber *off_loc); -extern void heap_page_prune_execute(Buffer buffer, +extern void heap_page_prune_and_freeze(Relation relation, Buffer buffer, + struct GlobalVisState *vistest, + int options, + struct VacuumCutoffs *cutoffs, + PruneFreezeResult *presult, + PruneReason reason, + OffsetNumber *off_loc, + TransactionId *new_relfrozen_xid, + MultiXactId *new_relmin_mxid); +extern void heap_page_prune_execute(Buffer buffer, bool lp_truncate_only, OffsetNumber *redirected, int nredirected, OffsetNumber *nowdead, int ndead, OffsetNumber *nowunused, int nunused); extern void heap_get_root_tuples(Page page, OffsetNumber *root_offsets); +extern void log_heap_prune_and_freeze(Relation relation, Buffer buffer, + TransactionId conflict_xid, + bool cleanup_lock, + PruneReason reason, + HeapTupleFreeze *frozen, int nfrozen, + OffsetNumber *redirected, int nredirected, + OffsetNumber *dead, int ndead, + OffsetNumber *unused, int nunused); /* in heap/vacuumlazy.c */ struct VacuumParams; diff --git a/src/include/access/heapam_xlog.h b/src/include/access/heapam_xlog.h index a038450787e38..42736f37e79f3 100644 --- a/src/include/access/heapam_xlog.h +++ b/src/include/access/heapam_xlog.h @@ -4,7 +4,7 @@ * POSTGRES heap access XLOG definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/heapam_xlog.h @@ -49,11 +49,16 @@ * are associated with RM_HEAP2_ID, but are not logically different from * the ones above associated with RM_HEAP_ID. XLOG_HEAP_OPMASK applies to * these, too. + * + * There's no difference between XLOG_HEAP2_PRUNE_ON_ACCESS, + * XLOG_HEAP2_PRUNE_VACUUM_SCAN and XLOG_HEAP2_PRUNE_VACUUM_CLEANUP records. + * They have separate opcodes just for debugging and analysis purposes, to + * indicate why the WAL record was emitted. */ #define XLOG_HEAP2_REWRITE 0x00 -#define XLOG_HEAP2_PRUNE 0x10 -#define XLOG_HEAP2_VACUUM 0x20 -#define XLOG_HEAP2_FREEZE_PAGE 0x30 +#define XLOG_HEAP2_PRUNE_ON_ACCESS 0x10 +#define XLOG_HEAP2_PRUNE_VACUUM_SCAN 0x20 +#define XLOG_HEAP2_PRUNE_VACUUM_CLEANUP 0x30 #define XLOG_HEAP2_VISIBLE 0x40 #define XLOG_HEAP2_MULTI_INSERT 0x50 #define XLOG_HEAP2_LOCK_UPDATED 0x60 @@ -227,44 +232,154 @@ typedef struct xl_heap_update #define SizeOfHeapUpdate (offsetof(xl_heap_update, new_offnum) + sizeof(OffsetNumber)) /* - * This is what we need to know about page pruning (both during VACUUM and - * during opportunistic pruning) + * These structures and flags encode VACUUM pruning and freezing and on-access + * pruning page modifications. + * + * xl_heap_prune is the main record. The XLHP_HAS_* flags indicate which + * "sub-records" are included and the other XLHP_* flags provide additional + * information about the conditions for replay. + * + * The data for block reference 0 contains "sub-records" depending on which of + * the XLHP_HAS_* flags are set. See xlhp_* struct definitions below. The + * sub-records appear in the same order as the XLHP_* flags. An example + * record with every sub-record included: + * + *----------------------------------------------------------------------------- + * Main data section: + * + * xl_heap_prune + * uint8 flags + * TransactionId snapshot_conflict_horizon + * + * Block 0 data section: + * + * xlhp_freeze_plans + * uint16 nplans + * [2 bytes of padding] + * xlhp_freeze_plan plans[nplans] + * + * xlhp_prune_items + * uint16 nredirected + * OffsetNumber redirected[2 * nredirected] + * + * xlhp_prune_items + * uint16 ndead + * OffsetNumber nowdead[ndead] + * + * xlhp_prune_items + * uint16 nunused + * OffsetNumber nowunused[nunused] * - * The array of OffsetNumbers following the fixed part of the record contains: - * * for each redirected item: the item offset, then the offset redirected to - * * for each now-dead item: the item offset - * * for each now-unused item: the item offset - * The total number of OffsetNumbers is therefore 2*nredirected+ndead+nunused. - * Note that nunused is not explicitly stored, but may be found by reference - * to the total record length. + * OffsetNumber frz_offsets[sum([plan.ntuples for plan in plans])] + *----------------------------------------------------------------------------- * - * Acquires a full cleanup lock. + * NOTE: because the record data is assembled from many optional parts, we + * have to pay close attention to alignment. In the main data section, + * 'snapshot_conflict_horizon' is stored unaligned after 'flags', to save + * space. In the block 0 data section, the freeze plans appear first, because + * they contain TransactionId fields that require 4-byte alignment. All the + * other fields require only 2-byte alignment. This is also the reason that + * 'frz_offsets' is stored separately from the xlhp_freeze_plan structs. */ typedef struct xl_heap_prune { - TransactionId snapshotConflictHorizon; - uint16 nredirected; - uint16 ndead; - bool isCatalogRel; /* to handle recovery conflict during logical - * decoding on standby */ - /* OFFSET NUMBERS are in the block reference 0 */ + uint8 reason; + uint8 flags; + + /* + * If XLHP_HAS_CONFLICT_HORIZON is set, the conflict horizon XID follows, + * unaligned + */ } xl_heap_prune; -#define SizeOfHeapPrune (offsetof(xl_heap_prune, isCatalogRel) + sizeof(bool)) +#define SizeOfHeapPrune (offsetof(xl_heap_prune, flags) + sizeof(uint8)) + +/* to handle recovery conflict during logical decoding on standby */ +#define XLHP_IS_CATALOG_REL (1 << 1) + +/* + * Does replaying the record require a cleanup-lock? + * + * Pruning, in VACUUM's first pass or when otherwise accessing a page, + * requires a cleanup lock. For freezing, and VACUUM's second pass which + * marks LP_DEAD line pointers as unused without moving any tuple data, an + * ordinary exclusive lock is sufficient. + */ +#define XLHP_CLEANUP_LOCK (1 << 2) + +/* + * If we remove or freeze any entries that contain xids, we need to include a + * snapshot conflict horizon. It's used in Hot Standby mode to ensure that + * there are no queries running for which the removed tuples are still + * visible, or which still consider the frozen XIDs as running. + */ +#define XLHP_HAS_CONFLICT_HORIZON (1 << 3) + +/* + * Indicates that an xlhp_freeze_plans sub-record and one or more + * xlhp_freeze_plan sub-records are present. + */ +#define XLHP_HAS_FREEZE_PLANS (1 << 4) + +/* + * XLHP_HAS_REDIRECTIONS, XLHP_HAS_DEAD_ITEMS, and XLHP_HAS_NOW_UNUSED_ITEMS + * indicate that xlhp_prune_items sub-records with redirected, dead, and + * unused item offsets are present. + */ +#define XLHP_HAS_REDIRECTIONS (1 << 5) +#define XLHP_HAS_DEAD_ITEMS (1 << 6) +#define XLHP_HAS_NOW_UNUSED_ITEMS (1 << 7) + +/* + * xlhp_freeze_plan describes how to freeze a group of one or more heap tuples + * (appears in xl_heap_prune's xlhp_freeze_plans sub-record) + */ +/* 0x01 was XLH_FREEZE_XMIN */ +#define XLH_FREEZE_XVAC 0x02 +#define XLH_INVALID_XVAC 0x04 + +typedef struct xlhp_freeze_plan +{ + TransactionId xmax; + uint16 t_infomask2; + uint16 t_infomask; + uint8 frzflags; + + /* Length of individual page offset numbers array for this plan */ + uint16 ntuples; +} xlhp_freeze_plan; /* - * The vacuum page record is similar to the prune record, but can only mark - * already LP_DEAD items LP_UNUSED (during VACUUM's second heap pass) + * This is what we need to know about a block being frozen during vacuum * - * Acquires an ordinary exclusive lock only. + * The backup block's data contains an array of xlhp_freeze_plan structs (with + * nplans elements). The individual item offsets are located in an array at + * the end of the entire record with nplans * (each plan's ntuples) members + * Those offsets are in the same order as the plans. The REDO routine uses + * the offsets to freeze the corresponding heap tuples. + * + * (As of PostgreSQL 17, XLOG_HEAP2_PRUNE_VACUUM_SCAN records replace the + * separate XLOG_HEAP2_FREEZE_PAGE records.) + */ +typedef struct xlhp_freeze_plans +{ + uint16 nplans; + xlhp_freeze_plan plans[FLEXIBLE_ARRAY_MEMBER]; +} xlhp_freeze_plans; + +/* + * Generic sub-record type contained in block reference 0 of an xl_heap_prune + * record and used for redirect, dead, and unused items if any of + * XLHP_HAS_REDIRECTIONS/XLHP_HAS_DEAD_ITEMS/XLHP_HAS_NOW_UNUSED_ITEMS are + * set. Note that in the XLHP_HAS_REDIRECTIONS variant, there are actually 2 + * * length number of OffsetNumbers in the data. */ -typedef struct xl_heap_vacuum +typedef struct xlhp_prune_items { - uint16 nunused; - /* OFFSET NUMBERS are in the block reference 0 */ -} xl_heap_vacuum; + uint16 ntargets; + OffsetNumber data[FLEXIBLE_ARRAY_MEMBER]; +} xlhp_prune_items; -#define SizeOfHeapVacuum (offsetof(xl_heap_vacuum, nunused) + sizeof(uint16)) /* flags for infobits_set */ #define XLHL_XMAX_IS_MULTI 0x01 @@ -310,52 +425,10 @@ typedef struct xl_heap_confirm typedef struct xl_heap_inplace { OffsetNumber offnum; /* updated tuple's offset on page */ - /* TUPLE DATA FOLLOWS AT END OF STRUCT */ } xl_heap_inplace; #define SizeOfHeapInplace (offsetof(xl_heap_inplace, offnum) + sizeof(OffsetNumber)) -/* - * This struct represents a 'freeze plan', which describes how to freeze a - * group of one or more heap tuples (appears in xl_heap_freeze_page record) - */ -/* 0x01 was XLH_FREEZE_XMIN */ -#define XLH_FREEZE_XVAC 0x02 -#define XLH_INVALID_XVAC 0x04 - -typedef struct xl_heap_freeze_plan -{ - TransactionId xmax; - uint16 t_infomask2; - uint16 t_infomask; - uint8 frzflags; - - /* Length of individual page offset numbers array for this plan */ - uint16 ntuples; -} xl_heap_freeze_plan; - -/* - * This is what we need to know about a block being frozen during vacuum - * - * Backup block 0's data contains an array of xl_heap_freeze_plan structs - * (with nplans elements), followed by one or more page offset number arrays. - * Each such page offset number array corresponds to a single freeze plan - * (REDO routine freezes corresponding heap tuples using freeze plan). - */ -typedef struct xl_heap_freeze_page -{ - TransactionId snapshotConflictHorizon; - uint16 nplans; - bool isCatalogRel; /* to handle recovery conflict during logical - * decoding on standby */ - - /* - * In payload of blk 0 : FREEZE PLANS and OFFSET NUMBER ARRAY - */ -} xl_heap_freeze_page; - -#define SizeOfHeapFreezePage (offsetof(xl_heap_freeze_page, isCatalogRel) + sizeof(bool)) - /* * This is what we need to know about setting a visibility map bit * @@ -418,4 +491,12 @@ extern XLogRecPtr log_heap_visible(Relation rel, Buffer heap_buffer, TransactionId snapshotConflictHorizon, uint8 vmflags); +/* in heapdesc.c, so it can be shared between frontend/backend code */ +extern void heap_xlog_deserialize_prune_and_freeze(char *cursor, uint8 flags, + int *nplans, xlhp_freeze_plan **plans, + OffsetNumber **frz_offsets, + int *nredirected, OffsetNumber **redirected, + int *ndead, OffsetNumber **nowdead, + int *nunused, OffsetNumber **nowunused); + #endif /* HEAPAM_XLOG_H */ diff --git a/src/include/access/heaptoast.h b/src/include/access/heaptoast.h index 5c0a796f6615a..c376dff48d7d5 100644 --- a/src/include/access/heaptoast.h +++ b/src/include/access/heaptoast.h @@ -4,7 +4,7 @@ * Heap-specific definitions for external and compressed storage * of variable size attributes. * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/include/access/heaptoast.h * diff --git a/src/include/access/hio.h b/src/include/access/hio.h index 228433ee4a2cd..24621cf22b21d 100644 --- a/src/include/access/hio.h +++ b/src/include/access/hio.h @@ -4,7 +4,7 @@ * POSTGRES heap access method input/output definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/hio.h @@ -32,15 +32,22 @@ typedef struct BulkInsertStateData Buffer current_buf; /* current insertion target page */ /* - * State for bulk extensions. Further pages that were unused at the time - * of the extension. They might be in use by the time we use them though, - * so rechecks are needed. + * State for bulk extensions. + * + * last_free..next_free are further pages that were unused at the time of + * the last extension. They might be in use by the time we use them + * though, so rechecks are needed. * * XXX: Eventually these should probably live in RelationData instead, * alongside targetblock. + * + * already_extended_by is the number of pages that this bulk inserted + * extended by. If we already extended by a significant number of pages, + * we can be more aggressive about extending going forward. */ BlockNumber next_free; BlockNumber last_free; + uint32 already_extended_by; } BulkInsertStateData; diff --git a/src/include/access/htup.h b/src/include/access/htup.h index a8f7ff5dfe10a..116cb1bb27315 100644 --- a/src/include/access/htup.h +++ b/src/include/access/htup.h @@ -4,7 +4,7 @@ * POSTGRES heap tuple definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/htup.h diff --git a/src/include/access/htup_details.h b/src/include/access/htup_details.h index e01f4f35c8d3b..5e38ef869697a 100644 --- a/src/include/access/htup_details.h +++ b/src/include/access/htup_details.h @@ -4,7 +4,7 @@ * POSTGRES heap tuple header definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/htup_details.h @@ -696,9 +696,9 @@ struct MinimalTupleData /* prototypes for functions in common/heaptuple.c */ extern Size heap_compute_data_size(TupleDesc tupleDesc, - Datum *values, bool *isnull); + const Datum *values, const bool *isnull); extern void heap_fill_tuple(TupleDesc tupleDesc, - Datum *values, bool *isnull, + const Datum *values, const bool *isnull, char *data, Size data_size, uint16 *infomask, bits8 *bit); extern bool heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc); @@ -712,23 +712,23 @@ extern HeapTuple heap_copytuple(HeapTuple tuple); extern void heap_copytuple_with_tuple(HeapTuple src, HeapTuple dest); extern Datum heap_copy_tuple_as_datum(HeapTuple tuple, TupleDesc tupleDesc); extern HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, - Datum *values, bool *isnull); + const Datum *values, const bool *isnull); extern HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, - Datum *replValues, - bool *replIsnull, - bool *doReplace); + const Datum *replValues, + const bool *replIsnull, + const bool *doReplace); extern HeapTuple heap_modify_tuple_by_cols(HeapTuple tuple, TupleDesc tupleDesc, int nCols, - int *replCols, - Datum *replValues, - bool *replIsnull); + const int *replCols, + const Datum *replValues, + const bool *replIsnull); extern void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc, Datum *values, bool *isnull); extern void heap_freetuple(HeapTuple htup); extern MinimalTuple heap_form_minimal_tuple(TupleDesc tupleDescriptor, - Datum *values, bool *isnull); + const Datum *values, const bool *isnull); extern void heap_free_minimal_tuple(MinimalTuple mtup); extern MinimalTuple heap_copy_minimal_tuple(MinimalTuple mtup); extern HeapTuple heap_tuple_from_minimal_tuple(MinimalTuple mtup); diff --git a/src/include/access/itup.h b/src/include/access/itup.h index 2e2b8c7a4704c..94885751e590f 100644 --- a/src/include/access/itup.h +++ b/src/include/access/itup.h @@ -4,7 +4,7 @@ * POSTGRES index tuple definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/itup.h @@ -75,9 +75,9 @@ typedef IndexAttributeBitMapData * IndexAttributeBitMap; /* routines in indextuple.c */ extern IndexTuple index_form_tuple(TupleDesc tupleDescriptor, - Datum *values, bool *isnull); + const Datum *values, const bool *isnull); extern IndexTuple index_form_tuple_context(TupleDesc tupleDescriptor, - Datum *values, bool *isnull, + const Datum *values, const bool *isnull, MemoryContext context); extern Datum nocache_index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc); diff --git a/src/include/access/multixact.h b/src/include/access/multixact.h index 246f757f6ab04..7ffd256c744d3 100644 --- a/src/include/access/multixact.h +++ b/src/include/access/multixact.h @@ -3,7 +3,7 @@ * * PostgreSQL multi-transaction-log manager * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/multixact.h @@ -29,10 +29,6 @@ #define MaxMultiXactOffset ((MultiXactOffset) 0xFFFFFFFF) -/* Number of SLRU buffers to use for multixact */ -#define NUM_MULTIXACTOFFSET_BUFFERS 8 -#define NUM_MULTIXACTMEMBER_BUFFERS 16 - /* * Possible multixact lock modes ("status"). The first four modes are for * tuple locks (FOR KEY SHARE, FOR SHARE, FOR NO KEY UPDATE, FOR UPDATE); the @@ -47,7 +43,7 @@ typedef enum /* an update that doesn't touch "key" columns */ MultiXactStatusNoKeyUpdate = 0x04, /* other updates, and delete */ - MultiXactStatusUpdate = 0x05 + MultiXactStatusUpdate = 0x05, } MultiXactStatus; #define MaxMultiXactStatus MultiXactStatusUpdate diff --git a/src/include/access/nbtree.h b/src/include/access/nbtree.h index 8891fa79734c0..749304334809e 100644 --- a/src/include/access/nbtree.h +++ b/src/include/access/nbtree.h @@ -4,7 +4,7 @@ * header file for postgres btree access method implementation. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/nbtree.h @@ -267,7 +267,7 @@ BTPageGetDeleteXid(Page page) opaque = BTPageGetOpaque(page); Assert(P_ISDELETED(opaque)); - /* pg_upgrade'd deleted page -- must be safe to delete now */ + /* pg_upgrade'd deleted page -- must be safe to recycle now */ if (!P_HAS_FULLXID(opaque)) return FirstNormalFullTransactionId; @@ -656,7 +656,7 @@ BTreeTupleGetHeapTID(IndexTuple itup) /* * Get maximum heap TID attribute, which could be the only TID in the case of - * a non-pivot tuple that does not have a posting list tuple. + * a non-pivot tuple that does not have a posting list. * * Works with non-pivot tuples only. */ @@ -763,13 +763,8 @@ typedef BTStackData *BTStack; * bit, but may not when inserting into an INCLUDE index (tuple header value * is affected by the NULL-ness of both key and non-key attributes). * - * When nextkey is false (the usual case), _bt_search and _bt_binsrch will - * locate the first item >= scankey. When nextkey is true, they will locate - * the first item > scan key. - * - * pivotsearch is set to true by callers that want to re-find a leaf page - * using a scankey built from a leaf page's high key. Most callers set this - * to false. + * See comments in _bt_first for an explanation of the nextkey and backward + * fields. * * scantid is the heap TID that is used as a final tiebreaker attribute. It * is set to NULL when index scan doesn't need to find a position for a @@ -792,7 +787,7 @@ typedef struct BTScanInsertData bool allequalimage; bool anynullkeys; bool nextkey; - bool pivotsearch; + bool backward; /* backward index scan? */ ItemPointer scantid; /* tiebreaker for scankeys */ int keysz; /* Size of scankeys array */ ScanKeyData scankeys[INDEX_MAX_KEYS]; /* Must appear last */ @@ -965,11 +960,20 @@ typedef struct BTScanPosData * moreLeft and moreRight track whether we think there may be matching * index entries to the left and right of the current page, respectively. * We can clear the appropriate one of these flags when _bt_checkkeys() - * returns continuescan = false. + * sets BTReadPageState.continuescan = false. */ bool moreLeft; bool moreRight; + /* + * Direction of the scan at the time that _bt_readpage was called. + * + * Used by btrestrpos to "restore" the scan's array keys by resetting each + * array to its first element's value (first in this scan direction). This + * avoids the need to directly track the array keys in btmarkpos. + */ + ScanDirection dir; + /* * If we are doing an index-only scan, nextTupleOffset is the first free * location in the associated tuple storage workspace. @@ -1027,9 +1031,8 @@ typedef BTScanPosData *BTScanPos; /* We need one of these for each equality-type SK_SEARCHARRAY scan key */ typedef struct BTArrayKeyInfo { - int scan_key; /* index of associated key in arrayKeyData */ + int scan_key; /* index of associated key in keyData */ int cur_elem; /* index of current element in elem_values */ - int mark_elem; /* index of marked element in elem_values */ int num_elems; /* number of elems in current array value */ Datum *elem_values; /* array of num_elems Datums */ } BTArrayKeyInfo; @@ -1042,12 +1045,11 @@ typedef struct BTScanOpaqueData ScanKey keyData; /* array of preprocessed scan keys */ /* workspace for SK_SEARCHARRAY support */ - ScanKey arrayKeyData; /* modified copy of scan->keyData */ - int numArrayKeys; /* number of equality-type array keys (-1 if - * there are any unsatisfiable array keys) */ - int arrayKeyCount; /* count indicating number of array scan keys - * processed */ + int numArrayKeys; /* number of equality-type array keys */ + bool needPrimScan; /* New prim scan to continue in current dir? */ + bool scanBehind; /* Last array advancement matched -inf attr? */ BTArrayKeyInfo *arrayKeys; /* info about each equality-type array key */ + FmgrInfo *orderProcs; /* ORDER procs for required equality keys */ MemoryContext arrayContext; /* scan-lifespan context for array data */ /* info about killed items if any (killedItems is NULL if never used) */ @@ -1078,6 +1080,42 @@ typedef struct BTScanOpaqueData typedef BTScanOpaqueData *BTScanOpaque; +/* + * _bt_readpage state used across _bt_checkkeys calls for a page + */ +typedef struct BTReadPageState +{ + /* Input parameters, set by _bt_readpage for _bt_checkkeys */ + ScanDirection dir; /* current scan direction */ + OffsetNumber minoff; /* Lowest non-pivot tuple's offset */ + OffsetNumber maxoff; /* Highest non-pivot tuple's offset */ + IndexTuple finaltup; /* Needed by scans with array keys */ + BlockNumber prev_scan_page; /* previous _bt_parallel_release block */ + Page page; /* Page being read */ + + /* Per-tuple input parameters, set by _bt_readpage for _bt_checkkeys */ + OffsetNumber offnum; /* current tuple's page offset number */ + + /* Output parameter, set by _bt_checkkeys for _bt_readpage */ + OffsetNumber skip; /* Array keys "look ahead" skip offnum */ + bool continuescan; /* Terminate ongoing (primitive) index scan? */ + + /* + * Input and output parameters, set and unset by both _bt_readpage and + * _bt_checkkeys to manage precheck optimizations + */ + bool prechecked; /* precheck set continuescan to 'true'? */ + bool firstmatch; /* at least one match so far? */ + + /* + * Private _bt_checkkeys state used to manage "look ahead" optimization + * (only used during scans with array keys) + */ + int16 rechecks; + int16 targetdistance; + +} BTReadPageState; + /* * We use some private sk_flags bits in preprocessed scan keys. We're allowed * to use bits 16-31 (see skey.h). The uppermost bits are copied from the @@ -1131,7 +1169,7 @@ extern bool btinsert(Relation rel, Datum *values, bool *isnull, bool indexUnchanged, struct IndexInfo *indexInfo); extern IndexScanDesc btbeginscan(Relation rel, int nkeys, int norderbys); -extern Size btestimateparallelscan(void); +extern Size btestimateparallelscan(int nkeys, int norderbys); extern void btinitparallelscan(void *target); extern bool btgettuple(IndexScanDesc scan, ScanDirection dir); extern int64 btgetbitmap(IndexScanDesc scan, TIDBitmap *tbm); @@ -1152,10 +1190,12 @@ extern bool btcanreturn(Relation index, int attno); /* * prototypes for internal functions in nbtree.c */ -extern bool _bt_parallel_seize(IndexScanDesc scan, BlockNumber *pageno); +extern bool _bt_parallel_seize(IndexScanDesc scan, BlockNumber *pageno, + bool first); extern void _bt_parallel_release(IndexScanDesc scan, BlockNumber scan_page); extern void _bt_parallel_done(IndexScanDesc scan); -extern void _bt_parallel_advance_array_keys(IndexScanDesc scan); +extern void _bt_parallel_primscan_schedule(IndexScanDesc scan, + BlockNumber prev_scan_page); /* * prototypes for functions in nbtdedup.c @@ -1231,30 +1271,26 @@ extern void _bt_pendingfsm_finalize(Relation rel, BTVacState *vstate); * prototypes for functions in nbtsearch.c */ extern BTStack _bt_search(Relation rel, Relation heaprel, BTScanInsert key, - Buffer *bufP, int access, Snapshot snapshot); + Buffer *bufP, int access); extern Buffer _bt_moveright(Relation rel, Relation heaprel, BTScanInsert key, Buffer buf, bool forupdate, BTStack stack, - int access, Snapshot snapshot); + int access); extern OffsetNumber _bt_binsrch_insert(Relation rel, BTInsertState insertstate); extern int32 _bt_compare(Relation rel, BTScanInsert key, Page page, OffsetNumber offnum); extern bool _bt_first(IndexScanDesc scan, ScanDirection dir); extern bool _bt_next(IndexScanDesc scan, ScanDirection dir); -extern Buffer _bt_get_endpoint(Relation rel, uint32 level, bool rightmost, - Snapshot snapshot); +extern Buffer _bt_get_endpoint(Relation rel, uint32 level, bool rightmost); /* * prototypes for functions in nbtutils.c */ extern BTScanInsert _bt_mkscankey(Relation rel, IndexTuple itup); extern void _bt_freestack(BTStack stack); -extern void _bt_preprocess_array_keys(IndexScanDesc scan); +extern bool _bt_start_prim_scan(IndexScanDesc scan, ScanDirection dir); extern void _bt_start_array_keys(IndexScanDesc scan, ScanDirection dir); -extern bool _bt_advance_array_keys(IndexScanDesc scan, ScanDirection dir); -extern void _bt_mark_array_keys(IndexScanDesc scan); -extern void _bt_restore_array_keys(IndexScanDesc scan); extern void _bt_preprocess_keys(IndexScanDesc scan); -extern bool _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, - int tupnatts, ScanDirection dir, bool *continuescan); +extern bool _bt_checkkeys(IndexScanDesc scan, BTReadPageState *pstate, bool arrayKeys, + IndexTuple tuple, int tupnatts); extern void _bt_killitems(IndexScanDesc scan); extern BTCycleId _bt_vacuum_cycleid(Relation rel); extern BTCycleId _bt_start_vacuum(Relation rel); diff --git a/src/include/access/nbtxlog.h b/src/include/access/nbtxlog.h index 7dd9fd020658a..e42ac1611cddc 100644 --- a/src/include/access/nbtxlog.h +++ b/src/include/access/nbtxlog.h @@ -3,7 +3,7 @@ * nbtxlog.h * header file for postgres btree xlog routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/nbtxlog.h diff --git a/src/include/access/parallel.h b/src/include/access/parallel.h index 061f8a4c4ca32..69ffe5498f9e7 100644 --- a/src/include/access/parallel.h +++ b/src/include/access/parallel.h @@ -3,7 +3,7 @@ * parallel.h * Infrastructure for launching parallel workers * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/parallel.h @@ -26,7 +26,6 @@ typedef struct ParallelWorkerInfo { BackgroundWorkerHandle *bgwhandle; shm_mq_handle *error_mqh; - int32 pid; } ParallelWorkerInfo; typedef struct ParallelContext diff --git a/src/include/access/printsimple.h b/src/include/access/printsimple.h index 9883e72282b8c..5c549dc5164ae 100644 --- a/src/include/access/printsimple.h +++ b/src/include/access/printsimple.h @@ -3,7 +3,7 @@ * printsimple.h * print simple tuples without catalog access * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/printsimple.h diff --git a/src/include/access/printtup.h b/src/include/access/printtup.h index 747ecb800dcd8..b1fecf873b413 100644 --- a/src/include/access/printtup.h +++ b/src/include/access/printtup.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/printtup.h diff --git a/src/include/access/relation.h b/src/include/access/relation.h index 66efd367046cf..aa5ccadc36cca 100644 --- a/src/include/access/relation.h +++ b/src/include/access/relation.h @@ -4,7 +4,7 @@ * Generic relation related routines. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/relation.h diff --git a/src/include/access/reloptions.h b/src/include/access/reloptions.h index 1d5bfa62ffcfd..81829b8270a79 100644 --- a/src/include/access/reloptions.h +++ b/src/include/access/reloptions.h @@ -9,7 +9,7 @@ * into a lot of low-level code. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/reloptions.h @@ -32,7 +32,7 @@ typedef enum relopt_type RELOPT_TYPE_INT, RELOPT_TYPE_REAL, RELOPT_TYPE_ENUM, - RELOPT_TYPE_STRING + RELOPT_TYPE_STRING, } relopt_type; /* kinds supported by reloptions */ diff --git a/src/include/access/relscan.h b/src/include/access/relscan.h index d03360eac04a9..521043304abb9 100644 --- a/src/include/access/relscan.h +++ b/src/include/access/relscan.h @@ -4,7 +4,7 @@ * POSTGRES relation scan descriptor definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/relscan.h diff --git a/src/include/access/rewriteheap.h b/src/include/access/rewriteheap.h index 1125457053c63..5866a26bdddf0 100644 --- a/src/include/access/rewriteheap.h +++ b/src/include/access/rewriteheap.h @@ -3,7 +3,7 @@ * rewriteheap.h * Declarations for heap rewrite support functions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * src/include/access/rewriteheap.h diff --git a/src/include/access/rmgrdesc_utils.h b/src/include/access/rmgrdesc_utils.h index bd414699f21cb..fcf214309c332 100644 --- a/src/include/access/rmgrdesc_utils.h +++ b/src/include/access/rmgrdesc_utils.h @@ -3,7 +3,7 @@ * rmgrdesc_utils.h * Support functions for rmgrdesc routines * - * Copyright (c) 2023, PostgreSQL Global Development Group + * Copyright (c) 2023-2024, PostgreSQL Global Development Group * * src/include/access/rmgrdesc_utils.h * @@ -12,50 +12,6 @@ #ifndef RMGRDESC_UTILS_H_ #define RMGRDESC_UTILS_H_ -/* - * Guidelines for rmgrdesc routine authors: - * - * The goal of these guidelines is to avoid gratuitous inconsistencies across - * each rmgr, and to allow users to parse desc output strings without too much - * difficulty. This is not an API specification or an interchange format. - * (Only heapam and nbtree desc routines follow these guidelines at present, - * in any case.) - * - * Record descriptions are similar to JSON style key/value objects. However, - * there is no explicit "string" type/string escaping. Top-level { } brackets - * should be omitted. For example: - * - * snapshotConflictHorizon: 0, flags: 0x03 - * - * Record descriptions may contain variable-length arrays. For example: - * - * nunused: 5, unused: [1, 2, 3, 4, 5] - * - * Nested objects are supported via { } brackets. They generally appear - * inside variable-length arrays. For example: - * - * ndeleted: 0, nupdated: 1, deleted: [], updated: [{ off: 45, nptids: 1, ptids: [0] }] - * - * Try to output things in an order that faithfully represents the order of - * fields from the underlying physical WAL record struct. Key names should be - * unique (at the same nesting level) to make parsing easy. It's a good idea - * if the number of items in the array appears before the array. - * - * It's okay for individual WAL record types to invent their own conventions. - * For example, Heap2's PRUNE record descriptions use a custom array format - * for the record's "redirected" field: - * - * ... redirected: [1->4, 5->9], dead: [10, 11], unused: [3, 7, 8] - * - * Arguably the desc routine should be using object notation for this instead. - * However, there is value in using a custom format when it conveys useful - * information about the underlying physical data structures. - * - * This ad-hoc format has the advantage of being close to the format used for - * the "dead" and "unused" arrays (which follow the standard desc convention - * for page offset number arrays). It suggests that the "redirected" elements - * shown are just pairs of page offset numbers (which is how it really works). - */ extern void array_desc(StringInfo buf, void *array, size_t elem_size, int count, void (*elem_desc) (StringInfo buf, void *elem, void *data), void *data); diff --git a/src/include/access/rmgrlist.h b/src/include/access/rmgrlist.h index 463bcb67c57a5..78e6b908c6e76 100644 --- a/src/include/access/rmgrlist.h +++ b/src/include/access/rmgrlist.h @@ -6,7 +6,7 @@ * by the PG_RMGR macro, which is not defined in this file; it can be * defined by the caller for special purposes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/rmgrlist.h diff --git a/src/include/access/sdir.h b/src/include/access/sdir.h index 322aeb3ff9d67..d40d809bd2308 100644 --- a/src/include/access/sdir.h +++ b/src/include/access/sdir.h @@ -4,7 +4,7 @@ * POSTGRES scan direction definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/sdir.h diff --git a/src/include/access/sequence.h b/src/include/access/sequence.h new file mode 100644 index 0000000000000..fb8708861b552 --- /dev/null +++ b/src/include/access/sequence.h @@ -0,0 +1,23 @@ +/*------------------------------------------------------------------------- + * + * sequence.h + * Generic routines for sequence-related code. + * + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/access/sequence.h + * + *------------------------------------------------------------------------- + */ +#ifndef ACCESS_SEQUENCE_H +#define ACCESS_SEQUENCE_H + +#include "storage/lockdefs.h" +#include "utils/relcache.h" + +extern Relation sequence_open(Oid relationId, LOCKMODE lockmode); +extern void sequence_close(Relation relation, LOCKMODE lockmode); + +#endif /* ACCESS_SEQUENCE_H */ diff --git a/src/include/access/session.h b/src/include/access/session.h index f905fe446e8a5..ce48449a87195 100644 --- a/src/include/access/session.h +++ b/src/include/access/session.h @@ -3,7 +3,7 @@ * session.h * Encapsulation of user session. * - * Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Copyright (c) 2017-2024, PostgreSQL Global Development Group * * src/include/access/session.h * diff --git a/src/include/access/skey.h b/src/include/access/skey.h index fbdb23c5c7e4d..8054d3edce456 100644 --- a/src/include/access/skey.h +++ b/src/include/access/skey.h @@ -4,7 +4,7 @@ * POSTGRES scan key definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/skey.h diff --git a/src/include/access/slru.h b/src/include/access/slru.h index a8a424d92da35..02fcb3bca5473 100644 --- a/src/include/access/slru.h +++ b/src/include/access/slru.h @@ -3,7 +3,7 @@ * slru.h * Simple LRU buffering for transaction status logfiles * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/slru.h @@ -17,6 +17,11 @@ #include "storage/lwlock.h" #include "storage/sync.h" +/* + * To avoid overflowing internal arithmetic and the size_t data type, the + * number of buffers must not exceed this number. + */ +#define SLRU_MAX_ALLOWED_BUFFERS ((1024 * 1024 * 1024) / BLCKSZ) /* * Define SLRU segment size. A page is the same BLCKSZ as is used everywhere @@ -44,16 +49,17 @@ typedef enum SLRU_PAGE_EMPTY, /* buffer is not in use */ SLRU_PAGE_READ_IN_PROGRESS, /* page is being read in */ SLRU_PAGE_VALID, /* page is valid and not being written */ - SLRU_PAGE_WRITE_IN_PROGRESS /* page is being written out */ + SLRU_PAGE_WRITE_IN_PROGRESS, /* page is being written out */ } SlruPageStatus; /* * Shared-memory state + * + * ControlLock is used to protect access to the other fields, except + * latest_page_number, which uses atomics; see comment in slru.c. */ typedef struct SlruSharedData { - LWLock *ControlLock; - /* Number of buffers managed by this SLRU structure */ int num_slots; @@ -64,38 +70,49 @@ typedef struct SlruSharedData char **page_buffer; SlruPageStatus *page_status; bool *page_dirty; - int *page_number; + int64 *page_number; int *page_lru_count; + + /* The buffer_locks protects the I/O on each buffer slots */ LWLockPadded *buffer_locks; + /* Locks to protect the in memory buffer slot access in SLRU bank. */ + LWLockPadded *bank_locks; + + /*---------- + * A bank-wise LRU counter is maintained because we do a victim buffer + * search within a bank. Furthermore, manipulating an individual bank + * counter avoids frequent cache invalidation since we update it every time + * we access the page. + * + * We mark a page "most recently used" by setting + * page_lru_count[slotno] = ++bank_cur_lru_count[bankno]; + * The oldest page in the bank is therefore the one with the highest value + * of + * bank_cur_lru_count[bankno] - page_lru_count[slotno] + * The counts will eventually wrap around, but this calculation still + * works as long as no page's age exceeds INT_MAX counts. + *---------- + */ + int *bank_cur_lru_count; + /* * Optional array of WAL flush LSNs associated with entries in the SLRU * pages. If not zero/NULL, we must flush WAL before writing pages (true - * for pg_xact, false for multixact, pg_subtrans, pg_notify). group_lsn[] - * has lsn_groups_per_page entries per buffer slot, each containing the + * for pg_xact, false for everything else). group_lsn[] has + * lsn_groups_per_page entries per buffer slot, each containing the * highest LSN known for a contiguous group of SLRU entries on that slot's * page. */ XLogRecPtr *group_lsn; int lsn_groups_per_page; - /*---------- - * We mark a page "most recently used" by setting - * page_lru_count[slotno] = ++cur_lru_count; - * The oldest page is therefore the one with the highest value of - * cur_lru_count - page_lru_count[slotno] - * The counts will eventually wrap around, but this calculation still - * works as long as no page's age exceeds INT_MAX counts. - *---------- - */ - int cur_lru_count; - /* * latest_page_number is the page number of the current end of the log; * this is not critical data, since we use it only to avoid swapping out * the latest page. */ - int latest_page_number; + pg_atomic_uint64 latest_page_number; /* SLRU's index for statistics purposes (might not be unique) */ int slru_stats_idx; @@ -111,6 +128,16 @@ typedef struct SlruCtlData { SlruShared shared; + /* Number of banks in this SLRU. */ + uint16 nbanks; + + /* + * If true, use long segment file names. Otherwise, use short file names. + * + * For details about the file name format, see SlruFileName(). + */ + bool long_segment_names; + /* * Which sync handler function to use when handing sync requests over to * the checkpointer. SYNC_HANDLER_NONE to disable fsync (eg pg_notify). @@ -127,7 +154,7 @@ typedef struct SlruCtlData * the behavior of this callback has no functional implications.) Use * SlruPagePrecedesUnitTests() in SLRUs meeting its criteria. */ - bool (*PagePrecedes) (int, int); + bool (*PagePrecedes) (int64, int64); /* * Dir is set during SimpleLruInit and does not change thereafter. Since @@ -138,15 +165,31 @@ typedef struct SlruCtlData typedef SlruCtlData *SlruCtl; +/* + * Get the SLRU bank lock for given SlruCtl and the pageno. + * + * This lock needs to be acquired to access the slru buffer slots in the + * respective bank. + */ +static inline LWLock * +SimpleLruGetBankLock(SlruCtl ctl, int64 pageno) +{ + int bankno; + + bankno = pageno % ctl->nbanks; + return &(ctl->shared->bank_locks[bankno].lock); +} extern Size SimpleLruShmemSize(int nslots, int nlsns); +extern int SimpleLruAutotuneBuffers(int divisor, int max); extern void SimpleLruInit(SlruCtl ctl, const char *name, int nslots, int nlsns, - LWLock *ctllock, const char *subdir, int tranche_id, - SyncRequestHandler sync_handler); -extern int SimpleLruZeroPage(SlruCtl ctl, int pageno); -extern int SimpleLruReadPage(SlruCtl ctl, int pageno, bool write_ok, + const char *subdir, int buffer_tranche_id, + int bank_tranche_id, SyncRequestHandler sync_handler, + bool long_segment_names); +extern int SimpleLruZeroPage(SlruCtl ctl, int64 pageno); +extern int SimpleLruReadPage(SlruCtl ctl, int64 pageno, bool write_ok, TransactionId xid); -extern int SimpleLruReadPage_ReadOnly(SlruCtl ctl, int pageno, +extern int SimpleLruReadPage_ReadOnly(SlruCtl ctl, int64 pageno, TransactionId xid); extern void SimpleLruWritePage(SlruCtl ctl, int slotno); extern void SimpleLruWriteAll(SlruCtl ctl, bool allow_redirtied); @@ -155,20 +198,21 @@ extern void SlruPagePrecedesUnitTests(SlruCtl ctl, int per_page); #else #define SlruPagePrecedesUnitTests(ctl, per_page) do {} while (0) #endif -extern void SimpleLruTruncate(SlruCtl ctl, int cutoffPage); -extern bool SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int pageno); +extern void SimpleLruTruncate(SlruCtl ctl, int64 cutoffPage); +extern bool SimpleLruDoesPhysicalPageExist(SlruCtl ctl, int64 pageno); -typedef bool (*SlruScanCallback) (SlruCtl ctl, char *filename, int segpage, +typedef bool (*SlruScanCallback) (SlruCtl ctl, char *filename, int64 segpage, void *data); extern bool SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data); -extern void SlruDeleteSegment(SlruCtl ctl, int segno); +extern void SlruDeleteSegment(SlruCtl ctl, int64 segno); extern int SlruSyncFileTag(SlruCtl ctl, const FileTag *ftag, char *path); /* SlruScanDirectory public callbacks */ extern bool SlruScanDirCbReportPresence(SlruCtl ctl, char *filename, - int segpage, void *data); -extern bool SlruScanDirCbDeleteAll(SlruCtl ctl, char *filename, int segpage, + int64 segpage, void *data); +extern bool SlruScanDirCbDeleteAll(SlruCtl ctl, char *filename, int64 segpage, void *data); +extern bool check_slru_buffers(const char *name, int *newval); #endif /* SLRU_H */ diff --git a/src/include/access/spgist.h b/src/include/access/spgist.h index fe31d32dbe9e8..d6a4953120074 100644 --- a/src/include/access/spgist.h +++ b/src/include/access/spgist.h @@ -4,7 +4,7 @@ * Public header file for SP-GiST access method. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/spgist.h @@ -68,7 +68,7 @@ typedef enum spgChooseResultType { spgMatchNode = 1, /* descend into existing node */ spgAddNode, /* add a node to the inner tuple */ - spgSplitTuple /* split inner tuple (change its prefix) */ + spgSplitTuple, /* split inner tuple (change its prefix) */ } spgChooseResultType; typedef struct spgChooseOut diff --git a/src/include/access/spgist_private.h b/src/include/access/spgist_private.h index c6ef46fc2067e..e7cbe10a89b5c 100644 --- a/src/include/access/spgist_private.h +++ b/src/include/access/spgist_private.h @@ -4,7 +4,7 @@ * Private declarations for SP-GiST access method. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/spgist_private.h @@ -157,7 +157,7 @@ typedef struct SpGistState char *deadTupleStorage; /* workspace for spgFormDeadTuple */ - TransactionId myXid; /* XID to use when creating a redirect tuple */ + TransactionId redirectXid; /* XID to use when creating a redirect tuple */ bool isBuild; /* true if doing index build */ } SpGistState; @@ -421,7 +421,8 @@ typedef struct SpGistLeafTupleData * field, to satisfy some Asserts that we make when replacing a leaf tuple * with a dead tuple. * We don't use t_info, but it's needed to align the pointer field. - * pointer and xid are only valid when tupstate = REDIRECT. + * pointer and xid are only valid when tupstate = REDIRECT, and in some + * cases xid can be InvalidTransactionId even then; see initSpGistState. */ typedef struct SpGistDeadTupleData { @@ -464,7 +465,7 @@ typedef SpGistDeadTupleData *SpGistDeadTuple; #define STORE_STATE(s, d) \ do { \ - (d).myXid = (s)->myXid; \ + (d).redirectXid = (s)->redirectXid; \ (d).isBuild = (s)->isBuild; \ } while(0) @@ -506,10 +507,10 @@ extern void SpGistInitBuffer(Buffer b, uint16 f); extern void SpGistInitMetapage(Page page); extern unsigned int SpGistGetInnerTypeSize(SpGistTypeDesc *att, Datum datum); extern Size SpGistGetLeafTupleSize(TupleDesc tupleDescriptor, - Datum *datums, bool *isnulls); + const Datum *datums, const bool *isnulls); extern SpGistLeafTuple spgFormLeafTuple(SpGistState *state, ItemPointer heapPtr, - Datum *datums, bool *isnulls); + const Datum *datums, const bool *isnulls); extern SpGistNodeTuple spgFormNodeTuple(SpGistState *state, Datum label, bool isnull); extern SpGistInnerTuple spgFormInnerTuple(SpGistState *state, diff --git a/src/include/access/spgxlog.h b/src/include/access/spgxlog.h index a7f10bf2d3a2b..16cc73500129c 100644 --- a/src/include/access/spgxlog.h +++ b/src/include/access/spgxlog.h @@ -3,7 +3,7 @@ * spgxlog.h * xlog declarations for SP-GiST access method. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/spgxlog.h @@ -35,7 +35,7 @@ */ typedef struct spgxlogState { - TransactionId myXid; + TransactionId redirectXid; bool isBuild; } spgxlogState; diff --git a/src/include/access/stratnum.h b/src/include/access/stratnum.h index 1b29653a8ab7c..8a47d3c9ec807 100644 --- a/src/include/access/stratnum.h +++ b/src/include/access/stratnum.h @@ -4,7 +4,7 @@ * POSTGRES strategy number definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/stratnum.h diff --git a/src/include/access/subtrans.h b/src/include/access/subtrans.h index 46a473c77f5e0..e2213cf3fd2ef 100644 --- a/src/include/access/subtrans.h +++ b/src/include/access/subtrans.h @@ -3,7 +3,7 @@ * * PostgreSQL subtransaction-log manager * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/subtrans.h @@ -11,9 +11,6 @@ #ifndef SUBTRANS_H #define SUBTRANS_H -/* Number of SLRU buffers to use for subtrans */ -#define NUM_SUBTRANS_BUFFERS 32 - extern void SubTransSetParent(TransactionId xid, TransactionId parent); extern TransactionId SubTransGetParent(TransactionId xid); extern TransactionId SubTransGetTopmostTransaction(TransactionId xid); diff --git a/src/include/access/syncscan.h b/src/include/access/syncscan.h index 01a8eecbfe729..00b6c0dfc635d 100644 --- a/src/include/access/syncscan.h +++ b/src/include/access/syncscan.h @@ -4,7 +4,7 @@ * POSTGRES synchronous scan support functions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/syncscan.h diff --git a/src/include/access/sysattr.h b/src/include/access/sysattr.h index 8f08682750b7b..e88dec71ee94f 100644 --- a/src/include/access/sysattr.h +++ b/src/include/access/sysattr.h @@ -4,7 +4,7 @@ * POSTGRES system attribute definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/sysattr.h diff --git a/src/include/access/table.h b/src/include/access/table.h index e664c7b734cc8..1c0bee79fd8b2 100644 --- a/src/include/access/table.h +++ b/src/include/access/table.h @@ -4,7 +4,7 @@ * Generic routines for table related code. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/table.h diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h index 230bc39cc0ec4..7be7887b4a846 100644 --- a/src/include/access/tableam.h +++ b/src/include/access/tableam.h @@ -4,7 +4,7 @@ * POSTGRES table access method definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/tableam.h @@ -21,6 +21,7 @@ #include "access/sdir.h" #include "access/xact.h" #include "executor/tuptable.h" +#include "storage/read_stream.h" #include "utils/rel.h" #include "utils/snapshot.h" @@ -61,8 +62,15 @@ typedef enum ScanOptions SO_ALLOW_PAGEMODE = 1 << 8, /* unregister snapshot at scan end? */ - SO_TEMP_SNAPSHOT = 1 << 9 -} ScanOptions; + SO_TEMP_SNAPSHOT = 1 << 9, + + /* + * At the discretion of the table AM, bitmap table scans may be able to + * skip fetching a block from the table if none of the table data is + * needed. If table data may be needed, set SO_NEED_TUPLES. + */ + SO_NEED_TUPLES = 1 << 10, +} ScanOptions; /* * Result codes for table_{update,delete,lock_tuple}, and for visibility @@ -99,7 +107,7 @@ typedef enum TM_Result TM_BeingModified, /* lock couldn't be acquired, action skipped. Only used by lock_tuple */ - TM_WouldBlock + TM_WouldBlock, } TM_Result; /* @@ -115,7 +123,7 @@ typedef enum TU_UpdateIndexes TU_All, /* Only summarized columns were updated, TID is unchanged */ - TU_Summarizing + TU_Summarizing, } TU_UpdateIndexes; /* @@ -129,7 +137,8 @@ typedef enum TU_UpdateIndexes * * xmax is the outdating transaction's XID. If the caller wants to visit the * replacement tuple, it must check that this matches before believing the - * replacement is really a match. + * replacement is really a match. This is InvalidTransactionId if the target + * was !LP_NORMAL (expected only for a TID retrieved from syscache). * * cmax is the outdating command's CID, but only when the failure code is * TM_SelfModified (i.e., something in the current transaction outdated the @@ -617,8 +626,8 @@ typedef struct TableAmRoutine const RelFileLocator *newrlocator); /* See table_relation_copy_for_cluster() */ - void (*relation_copy_for_cluster) (Relation NewTable, - Relation OldTable, + void (*relation_copy_for_cluster) (Relation OldTable, + Relation NewTable, Relation OldIndex, bool use_sort, TransactionId OldestXmin, @@ -665,8 +674,7 @@ typedef struct TableAmRoutine * isn't one yet. */ bool (*scan_analyze_next_block) (TableScanDesc scan, - BlockNumber blockno, - BufferAccessStrategy bstrategy); + ReadStream *stream); /* * See table_scan_analyze_next_tuple(). @@ -944,10 +952,13 @@ table_beginscan_strat(Relation rel, Snapshot snapshot, */ static inline TableScanDesc table_beginscan_bm(Relation rel, Snapshot snapshot, - int nkeys, struct ScanKeyData *key) + int nkeys, struct ScanKeyData *key, bool need_tuple) { uint32 flags = SO_TYPE_BITMAPSCAN | SO_ALLOW_PAGEMODE; + if (need_tuple) + flags |= SO_NEED_TUPLES; + return rel->rd_tableam->scan_begin(rel, snapshot, nkeys, key, NULL, flags); } @@ -1038,11 +1049,6 @@ table_rescan_set_params(TableScanDesc scan, struct ScanKeyData *key, allow_pagemode); } -/* - * Update snapshot used by the scan. - */ -extern void table_scan_update_snapshot(TableScanDesc scan, Snapshot snapshot); - /* * Return next tuple from `scan`, store in slot. */ @@ -1479,8 +1485,8 @@ table_multi_insert(Relation rel, TupleTableSlot **slots, int nslots, * TM_BeingModified (the last only possible if wait == false). * * In the failure cases, the routine fills *tmfd with the tuple's t_ctid, - * t_xmax, and, if possible, and, if possible, t_cmax. See comments for - * struct TM_FailureData for additional info. + * t_xmax, and, if possible, t_cmax. See comments for struct + * TM_FailureData for additional info. */ static inline TM_Result table_tuple_delete(Relation rel, ItemPointer tid, CommandId cid, @@ -1706,19 +1712,17 @@ table_relation_vacuum(Relation rel, struct VacuumParams *params, } /* - * Prepare to analyze block `blockno` of `scan`. The scan needs to have been - * started with table_beginscan_analyze(). Note that this routine might - * acquire resources like locks that are held until + * Prepare to analyze the next block in the read stream. The scan needs to + * have been started with table_beginscan_analyze(). Note that this routine + * might acquire resources like locks that are held until * table_scan_analyze_next_tuple() returns false. * * Returns false if block is unsuitable for sampling, true otherwise. */ static inline bool -table_scan_analyze_next_block(TableScanDesc scan, BlockNumber blockno, - BufferAccessStrategy bstrategy) +table_scan_analyze_next_block(TableScanDesc scan, ReadStream *stream) { - return scan->rs_rd->rd_tableam->scan_analyze_next_block(scan, blockno, - bstrategy); + return scan->rs_rd->rd_tableam->scan_analyze_next_block(scan, stream); } /* @@ -2095,6 +2099,12 @@ extern void table_block_relation_estimate_size(Relation rel, */ extern const TableAmRoutine *GetTableAmRoutine(Oid amhandler); + +/* ---------------------------------------------------------------------------- + * Functions in heapam_handler.c + * ---------------------------------------------------------------------------- + */ + extern const TableAmRoutine *GetHeapamTableAmRoutine(void); #endif /* TABLEAM_H */ diff --git a/src/include/access/tidstore.h b/src/include/access/tidstore.h new file mode 100644 index 0000000000000..32aa9995193fa --- /dev/null +++ b/src/include/access/tidstore.h @@ -0,0 +1,50 @@ +/*------------------------------------------------------------------------- + * + * tidstore.h + * TidStore interface. + * + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/access/tidstore.h + * + *------------------------------------------------------------------------- + */ +#ifndef TIDSTORE_H +#define TIDSTORE_H + +#include "storage/itemptr.h" +#include "utils/dsa.h" + +typedef struct TidStore TidStore; +typedef struct TidStoreIter TidStoreIter; + +/* Result struct for TidStoreIterateNext */ +typedef struct TidStoreIterResult +{ + BlockNumber blkno; + int max_offset; + int num_offsets; + OffsetNumber *offsets; +} TidStoreIterResult; + +extern TidStore *TidStoreCreateLocal(size_t max_bytes, bool insert_only); +extern TidStore *TidStoreCreateShared(size_t max_bytes, int tranche_id); +extern TidStore *TidStoreAttach(dsa_handle area_handle, dsa_pointer handle); +extern void TidStoreDetach(TidStore *ts); +extern void TidStoreLockExclusive(TidStore *ts); +extern void TidStoreLockShare(TidStore *ts); +extern void TidStoreUnlock(TidStore *ts); +extern void TidStoreDestroy(TidStore *ts); +extern void TidStoreSetBlockOffsets(TidStore *ts, BlockNumber blkno, OffsetNumber *offsets, + int num_offsets); +extern bool TidStoreIsMember(TidStore *ts, ItemPointer tid); +extern TidStoreIter *TidStoreBeginIterate(TidStore *ts); +extern TidStoreIterResult *TidStoreIterateNext(TidStoreIter *iter); +extern void TidStoreEndIterate(TidStoreIter *iter); +extern size_t TidStoreMemoryUsage(TidStore *ts); +extern dsa_pointer TidStoreGetHandle(TidStore *ts); +extern dsa_area *TidStoreGetDSA(TidStore *ts); + +#endif /* TIDSTORE_H */ diff --git a/src/include/access/timeline.h b/src/include/access/timeline.h index 72e3622b45836..d4356ec120c91 100644 --- a/src/include/access/timeline.h +++ b/src/include/access/timeline.h @@ -3,7 +3,7 @@ * * Functions for reading and writing timeline history files. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/timeline.h diff --git a/src/include/access/toast_compression.h b/src/include/access/toast_compression.h index 7f02820caff5f..64d5e079fa9dd 100644 --- a/src/include/access/toast_compression.h +++ b/src/include/access/toast_compression.h @@ -3,7 +3,7 @@ * toast_compression.h * Functions for toast compression. * - * Copyright (c) 2021-2023, PostgreSQL Global Development Group + * Copyright (c) 2021-2024, PostgreSQL Global Development Group * * src/include/access/toast_compression.h * @@ -38,7 +38,7 @@ typedef enum ToastCompressionId { TOAST_PGLZ_COMPRESSION_ID = 0, TOAST_LZ4_COMPRESSION_ID = 1, - TOAST_INVALID_COMPRESSION_ID = 2 + TOAST_INVALID_COMPRESSION_ID = 2, } ToastCompressionId; /* diff --git a/src/include/access/toast_helper.h b/src/include/access/toast_helper.h index e971bd2c8ef64..349a513f77dd5 100644 --- a/src/include/access/toast_helper.h +++ b/src/include/access/toast_helper.h @@ -4,7 +4,7 @@ * Helper functions for table AMs implementing compressed or * out-of-line storage of varlena attributes. * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/include/access/toast_helper.h * @@ -110,7 +110,7 @@ extern void toast_tuple_externalize(ToastTupleContext *ttc, int attribute, int options); extern void toast_tuple_cleanup(ToastTupleContext *ttc); -extern void toast_delete_external(Relation rel, Datum *values, bool *isnull, +extern void toast_delete_external(Relation rel, const Datum *values, const bool *isnull, bool is_speculative); #endif diff --git a/src/include/access/toast_internals.h b/src/include/access/toast_internals.h index 30dba098936b8..0eeefe59fec08 100644 --- a/src/include/access/toast_internals.h +++ b/src/include/access/toast_internals.h @@ -3,7 +3,7 @@ * toast_internals.h * Internal definitions for the TOAST system. * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/include/access/toast_internals.h * diff --git a/src/include/access/transam.h b/src/include/access/transam.h index f5af6d3055678..07b9be6cdfcbd 100644 --- a/src/include/access/transam.h +++ b/src/include/access/transam.h @@ -4,7 +4,7 @@ * postgres transaction access method support code * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/transam.h @@ -197,7 +197,7 @@ FullTransactionIdAdvance(FullTransactionId *dest) #define FirstNormalObjectId 16384 /* - * VariableCache is a data structure in shared memory that is used to track + * TransamVariables is a data structure in shared memory that is used to track * OID and XID assignment state. For largely historical reasons, there is * just one struct with different fields that are protected by different * LWLocks. @@ -206,7 +206,7 @@ FullTransactionIdAdvance(FullTransactionId *dest) * used just to generate useful messages when xidWarnLimit or xidStopLimit * are exceeded. */ -typedef struct VariableCacheData +typedef struct TransamVariablesData { /* * These fields are protected by OidGenLock. @@ -252,9 +252,7 @@ typedef struct VariableCacheData */ TransactionId oldestClogXid; /* oldest it's safe to look up in clog */ -} VariableCacheData; - -typedef VariableCacheData *VariableCache; +} TransamVariablesData; /* ---------------- @@ -266,7 +264,7 @@ typedef VariableCacheData *VariableCache; extern bool TransactionStartedDuringRecovery(void); /* in transam/varsup.c */ -extern PGDLLIMPORT VariableCache ShmemVariableCache; +extern PGDLLIMPORT TransamVariablesData *TransamVariables; /* * prototypes for functions in transam/transam.c @@ -285,6 +283,8 @@ extern TransactionId TransactionIdLatest(TransactionId mainxid, extern XLogRecPtr TransactionIdGetCommitLSN(TransactionId xid); /* in transam/varsup.c */ +extern Size VarsupShmemSize(void); +extern void VarsupShmemInit(void); extern FullTransactionId GetNewTransactionId(bool isSubXact); extern void AdvanceNextFullTransactionIdPastXid(TransactionId xid); extern FullTransactionId ReadNextFullTransactionId(void); @@ -370,6 +370,49 @@ FullTransactionIdNewer(FullTransactionId a, FullTransactionId b) return b; } +/* + * Compute FullTransactionId for the given TransactionId, assuming xid was + * between [oldestXid, nextXid] at the time when TransamVariables->nextXid was + * nextFullXid. When adding calls, evaluate what prevents xid from preceding + * oldestXid if SetTransactionIdLimit() runs between the collection of xid and + * the collection of nextFullXid. + */ +static inline FullTransactionId +FullTransactionIdFromAllowableAt(FullTransactionId nextFullXid, + TransactionId xid) +{ + uint32 epoch; + + /* Special transaction ID. */ + if (!TransactionIdIsNormal(xid)) + return FullTransactionIdFromEpochAndXid(0, xid); + + Assert(TransactionIdPrecedesOrEquals(xid, + XidFromFullTransactionId(nextFullXid))); + + /* + * The 64 bit result must be <= nextFullXid, since nextFullXid hadn't been + * issued yet when xid was in the past. The xid must therefore be from + * the epoch of nextFullXid or the epoch before. We know this because we + * must remove (by freezing) an XID before assigning the XID half an epoch + * ahead of it. + * + * The unlikely() branch hint is dubious. It's perfect for the first 2^32 + * XIDs of a cluster's life. Right at 2^32 XIDs, misprediction shoots to + * 100%, then improves until perfection returns 2^31 XIDs later. Since + * current callers pass relatively-recent XIDs, expect >90% prediction + * accuracy overall. This favors average latency over tail latency. + */ + epoch = EpochFromFullTransactionId(nextFullXid); + if (unlikely(xid > XidFromFullTransactionId(nextFullXid))) + { + Assert(epoch != 0); + epoch--; + } + + return FullTransactionIdFromEpochAndXid(epoch, xid); +} + #endif /* FRONTEND */ #endif /* TRANSAM_H */ diff --git a/src/include/access/tsmapi.h b/src/include/access/tsmapi.h index 80784bed1ebe0..da9a6c38cd9ad 100644 --- a/src/include/access/tsmapi.h +++ b/src/include/access/tsmapi.h @@ -3,7 +3,7 @@ * tsmapi.h * API for tablesample methods * - * Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Copyright (c) 2015-2024, PostgreSQL Global Development Group * * src/include/access/tsmapi.h * diff --git a/src/include/access/tupconvert.h b/src/include/access/tupconvert.h index f00918b51618d..62a6d127613c9 100644 --- a/src/include/access/tupconvert.h +++ b/src/include/access/tupconvert.h @@ -4,7 +4,7 @@ * Tuple conversion support. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/tupconvert.h diff --git a/src/include/access/tupdesc.h b/src/include/access/tupdesc.h index b4286cf92220d..8930a28d6602e 100644 --- a/src/include/access/tupdesc.h +++ b/src/include/access/tupdesc.h @@ -4,7 +4,7 @@ * POSTGRES tuple descriptor definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/tupdesc.h @@ -126,8 +126,8 @@ extern void DecrTupleDescRefCount(TupleDesc tupdesc); } while (0) extern bool equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2); - -extern uint32 hashTupleDesc(TupleDesc desc); +extern bool equalRowTypes(TupleDesc tupdesc1, TupleDesc tupdesc2); +extern uint32 hashRowType(TupleDesc desc); extern void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, @@ -147,8 +147,8 @@ extern void TupleDescInitEntryCollation(TupleDesc desc, AttrNumber attributeNumber, Oid collationid); -extern TupleDesc BuildDescForRelation(List *schema); +extern TupleDesc BuildDescFromLists(const List *names, const List *types, const List *typmods, const List *collations); -extern TupleDesc BuildDescFromLists(List *names, List *types, List *typmods, List *collations); +extern Node *TupleDescGetDefault(TupleDesc tupdesc, AttrNumber attnum); #endif /* TUPDESC_H */ diff --git a/src/include/access/tupdesc_details.h b/src/include/access/tupdesc_details.h index 8d1b09852505e..cc8ff5149a63c 100644 --- a/src/include/access/tupdesc_details.h +++ b/src/include/access/tupdesc_details.h @@ -4,7 +4,7 @@ * POSTGRES tuple descriptor definitions we can't include everywhere * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/tupdesc_details.h diff --git a/src/include/access/tupmacs.h b/src/include/access/tupmacs.h index 3414446597e91..58b3a58cfd06c 100644 --- a/src/include/access/tupmacs.h +++ b/src/include/access/tupmacs.h @@ -4,7 +4,7 @@ * Tuple macros used by both index tuples and heap tuples. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/tupmacs.h diff --git a/src/include/access/twophase.h b/src/include/access/twophase.h index 21e2af7387b10..56248c0006317 100644 --- a/src/include/access/twophase.h +++ b/src/include/access/twophase.h @@ -4,7 +4,7 @@ * Two-phase-commit related declarations. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/twophase.h @@ -37,7 +37,7 @@ extern void PostPrepare_Twophase(void); extern TransactionId TwoPhaseGetXidByVirtualXID(VirtualTransactionId vxid, bool *have_more); extern PGPROC *TwoPhaseGetDummyProc(TransactionId xid, bool lock_held); -extern BackendId TwoPhaseGetDummyBackendId(TransactionId xid, bool lock_held); +extern int TwoPhaseGetDummyProcNumber(TransactionId xid, bool lock_held); extern GlobalTransaction MarkAsPreparing(TransactionId xid, const char *gid, TimestampTz prepared_at, diff --git a/src/include/access/twophase_rmgr.h b/src/include/access/twophase_rmgr.h index 02f7ba2872cee..bdd2cb7b33998 100644 --- a/src/include/access/twophase_rmgr.h +++ b/src/include/access/twophase_rmgr.h @@ -4,7 +4,7 @@ * Two-phase-commit resource managers definition * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/twophase_rmgr.h diff --git a/src/include/access/valid.h b/src/include/access/valid.h index 85d476aab586a..78c5f023ac420 100644 --- a/src/include/access/valid.h +++ b/src/include/access/valid.h @@ -4,7 +4,7 @@ * POSTGRES tuple qualification validity definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/valid.h diff --git a/src/include/access/visibilitymap.h b/src/include/access/visibilitymap.h index daaa01a2578f6..1a4d467e6f02f 100644 --- a/src/include/access/visibilitymap.h +++ b/src/include/access/visibilitymap.h @@ -4,7 +4,7 @@ * visibility map interface * * - * Portions Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2007-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/visibilitymap.h diff --git a/src/include/access/visibilitymapdefs.h b/src/include/access/visibilitymapdefs.h index 8dfdbfa71efae..472200f29d025 100644 --- a/src/include/access/visibilitymapdefs.h +++ b/src/include/access/visibilitymapdefs.h @@ -4,7 +4,7 @@ * macros for accessing contents of visibility map pages * * - * Copyright (c) 2021-2023, PostgreSQL Global Development Group + * Copyright (c) 2021-2024, PostgreSQL Global Development Group * * src/include/access/visibilitymapdefs.h * diff --git a/src/include/access/xact.h b/src/include/access/xact.h index 7d3b9446e62fb..6d4439f0524ee 100644 --- a/src/include/access/xact.h +++ b/src/include/access/xact.h @@ -4,7 +4,7 @@ * postgres transaction system definitions * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/xact.h @@ -72,8 +72,8 @@ typedef enum SYNCHRONOUS_COMMIT_REMOTE_WRITE, /* wait for local flush and remote * write */ SYNCHRONOUS_COMMIT_REMOTE_FLUSH, /* wait for local and remote flush */ - SYNCHRONOUS_COMMIT_REMOTE_APPLY /* wait for local and remote flush and - * remote apply */ + SYNCHRONOUS_COMMIT_REMOTE_APPLY, /* wait for local and remote flush and + * remote apply */ } SyncCommitLevel; /* Define the default setting for synchronous_commit */ @@ -132,7 +132,7 @@ typedef enum XACT_EVENT_PREPARE, XACT_EVENT_PRE_COMMIT, XACT_EVENT_PARALLEL_PRE_COMMIT, - XACT_EVENT_PRE_PREPARE + XACT_EVENT_PRE_PREPARE, } XactEvent; typedef void (*XactCallback) (XactEvent event, void *arg); @@ -142,7 +142,7 @@ typedef enum SUBXACT_EVENT_START_SUB, SUBXACT_EVENT_COMMIT_SUB, SUBXACT_EVENT_ABORT_SUB, - SUBXACT_EVENT_PRE_COMMIT_SUB + SUBXACT_EVENT_PRE_COMMIT_SUB, } SubXactEvent; typedef void (*SubXactCallback) (SubXactEvent event, SubTransactionId mySubid, diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 48ca8523810cc..2c507ea618c37 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -3,7 +3,7 @@ * * PostgreSQL write-ahead log manager * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/xlog.h @@ -19,12 +19,15 @@ /* Sync methods */ -#define SYNC_METHOD_FSYNC 0 -#define SYNC_METHOD_FDATASYNC 1 -#define SYNC_METHOD_OPEN 2 /* for O_SYNC */ -#define SYNC_METHOD_FSYNC_WRITETHROUGH 3 -#define SYNC_METHOD_OPEN_DSYNC 4 /* for O_DSYNC */ -extern PGDLLIMPORT int sync_method; +enum WalSyncMethod +{ + WAL_SYNC_METHOD_FSYNC = 0, + WAL_SYNC_METHOD_FDATASYNC, + WAL_SYNC_METHOD_OPEN, /* for O_SYNC */ + WAL_SYNC_METHOD_FSYNC_WRITETHROUGH, + WAL_SYNC_METHOD_OPEN_DSYNC /* for O_DSYNC */ +}; +extern PGDLLIMPORT int wal_sync_method; extern PGDLLIMPORT XLogRecPtr ProcLastRecPtr; extern PGDLLIMPORT XLogRecPtr XactLastRecEnd; @@ -59,7 +62,7 @@ typedef enum ArchiveMode { ARCHIVE_MODE_OFF = 0, /* disabled */ ARCHIVE_MODE_ON, /* enabled while server is running normally */ - ARCHIVE_MODE_ALWAYS /* enabled always (even during recovery) */ + ARCHIVE_MODE_ALWAYS, /* enabled always (even during recovery) */ } ArchiveMode; extern PGDLLIMPORT int XLogArchiveMode; @@ -68,7 +71,7 @@ typedef enum WalLevel { WAL_LEVEL_MINIMAL = 0, WAL_LEVEL_REPLICA, - WAL_LEVEL_LOGICAL + WAL_LEVEL_LOGICAL, } WalLevel; /* Compression algorithms for WAL */ @@ -77,7 +80,7 @@ typedef enum WalCompression WAL_COMPRESSION_NONE = 0, WAL_COMPRESSION_PGLZ, WAL_COMPRESSION_LZ4, - WAL_COMPRESSION_ZSTD + WAL_COMPRESSION_ZSTD, } WalCompression; /* Recovery states */ @@ -85,7 +88,7 @@ typedef enum RecoveryState { RECOVERY_STATE_CRASH = 0, /* crash recovery */ RECOVERY_STATE_ARCHIVE, /* archive recovery */ - RECOVERY_STATE_DONE /* currently in production */ + RECOVERY_STATE_DONE, /* currently in production */ } RecoveryState; extern PGDLLIMPORT int wal_level; @@ -187,7 +190,7 @@ typedef enum WALAvailability WALAVAIL_EXTENDED, /* WAL segment is reserved by a slot or * wal_keep_size */ WALAVAIL_UNRESERVED, /* no longer reserved, but not removed yet */ - WALAVAIL_REMOVED /* WAL segment has been removed */ + WALAVAIL_REMOVED, /* WAL segment has been removed */ } WALAvailability; struct XLogRecData; @@ -206,6 +209,7 @@ extern int XLogFileOpen(XLogSegNo segno, TimeLineID tli); extern void CheckXLogRemoved(XLogSegNo segno, TimeLineID tli); extern XLogSegNo XLogGetLastRemovedSegno(void); +extern XLogSegNo XLogGetOldestSegno(TimeLineID tli); extern void XLogSetAsyncXactLSN(XLogRecPtr asyncXactLSN); extern void XLogSetReplicationSlotMinimumLSN(XLogRecPtr lsn); @@ -244,10 +248,14 @@ extern XLogRecPtr GetRedoRecPtr(void); extern XLogRecPtr GetInsertRecPtr(void); extern XLogRecPtr GetFlushRecPtr(TimeLineID *insertTLI); extern TimeLineID GetWALInsertionTimeLine(void); +extern TimeLineID GetWALInsertionTimeLineIfSet(void); extern XLogRecPtr GetLastImportantRecPtr(void); extern void SetWalWriterSleeping(bool sleeping); +extern Size WALReadFromBuffers(char *dstbuf, XLogRecPtr startptr, Size count, + TimeLineID tli); + /* * Routines used by xlogrecovery.c to call back into xlog.c during recovery. */ diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h index b0fd338a00ce7..c6a91fb456055 100644 --- a/src/include/access/xlog_internal.h +++ b/src/include/access/xlog_internal.h @@ -11,7 +11,7 @@ * Note: This file must be includable in both frontend and backend contexts, * to allow stand-alone tools like pg_receivewal to deal with WAL files. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/xlog_internal.h @@ -31,7 +31,7 @@ /* * Each page of XLOG file has a header like this: */ -#define XLOG_PAGE_MAGIC 0xD113 /* can be used as WAL version indicator */ +#define XLOG_PAGE_MAGIC 0xD116 /* can be used as WAL version indicator */ typedef struct XLogPageHeaderData { @@ -302,6 +302,7 @@ typedef struct xl_end_of_recovery TimestampTz end_time; TimeLineID ThisTimeLineID; /* new TLI */ TimeLineID PrevTimeLineID; /* previous TLI we forked off from */ + int wal_level; } xl_end_of_recovery; /* @@ -322,7 +323,7 @@ typedef enum { RECOVERY_TARGET_ACTION_PAUSE, RECOVERY_TARGET_ACTION_PROMOTE, - RECOVERY_TARGET_ACTION_SHUTDOWN + RECOVERY_TARGET_ACTION_SHUTDOWN, } RecoveryTargetAction; struct LogicalDecodingContext; diff --git a/src/include/access/xlogarchive.h b/src/include/access/xlogarchive.h index 31ff20603406b..0701475fb40c9 100644 --- a/src/include/access/xlogarchive.h +++ b/src/include/access/xlogarchive.h @@ -3,7 +3,7 @@ * xlogarchive.h * Prototypes for WAL archives in the backend * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/access/xlogbackup.h b/src/include/access/xlogbackup.h index 1611358137b8d..c30d4a599159f 100644 --- a/src/include/access/xlogbackup.h +++ b/src/include/access/xlogbackup.h @@ -3,7 +3,7 @@ * xlogbackup.h * Definitions for internals of base backups. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -28,6 +28,8 @@ typedef struct BackupState XLogRecPtr checkpointloc; /* last checkpoint location */ pg_time_t starttime; /* backup start time */ bool started_in_recovery; /* backup started in recovery? */ + XLogRecPtr istartpoint; /* incremental based on backup at this LSN */ + TimeLineID istarttli; /* incremental based on backup on this TLI */ /* Fields saved at the end of backup */ XLogRecPtr stoppoint; /* backup stop WAL location */ diff --git a/src/include/access/xlogdefs.h b/src/include/access/xlogdefs.h index fe794c77405a5..30097989521bc 100644 --- a/src/include/access/xlogdefs.h +++ b/src/include/access/xlogdefs.h @@ -4,7 +4,7 @@ * Postgres write-ahead log manager record pointer and * timeline number definitions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/xlogdefs.h @@ -71,12 +71,12 @@ typedef uint16 RepOriginId; * * Note that we define our own O_DSYNC on Windows, but not O_SYNC. */ -#if defined(PLATFORM_DEFAULT_SYNC_METHOD) -#define DEFAULT_SYNC_METHOD PLATFORM_DEFAULT_SYNC_METHOD +#if defined(PLATFORM_DEFAULT_WAL_SYNC_METHOD) +#define DEFAULT_WAL_SYNC_METHOD PLATFORM_DEFAULT_WAL_SYNC_METHOD #elif defined(O_DSYNC) && (!defined(O_SYNC) || O_DSYNC != O_SYNC) -#define DEFAULT_SYNC_METHOD SYNC_METHOD_OPEN_DSYNC +#define DEFAULT_WAL_SYNC_METHOD WAL_SYNC_METHOD_OPEN_DSYNC #else -#define DEFAULT_SYNC_METHOD SYNC_METHOD_FDATASYNC +#define DEFAULT_WAL_SYNC_METHOD WAL_SYNC_METHOD_FDATASYNC #endif #endif /* XLOG_DEFS_H */ diff --git a/src/include/access/xloginsert.h b/src/include/access/xloginsert.h index 31785dc578fc4..b44fa29eac515 100644 --- a/src/include/access/xloginsert.h +++ b/src/include/access/xloginsert.h @@ -3,7 +3,7 @@ * * Functions for generating WAL records * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/xloginsert.h @@ -37,6 +37,7 @@ * will be skipped) */ #define REGBUF_KEEP_DATA 0x10 /* include data even if a full-page image * is taken */ +#define REGBUF_NO_CHANGE 0x20 /* intentionally register clean buffer */ /* prototypes for public functions in xloginsert.c: */ extern void XLogBeginInsert(void); diff --git a/src/include/access/xlogprefetcher.h b/src/include/access/xlogprefetcher.h index 7dd7f20ad0659..98cf990103bc7 100644 --- a/src/include/access/xlogprefetcher.h +++ b/src/include/access/xlogprefetcher.h @@ -3,7 +3,7 @@ * xlogprefetcher.h * Declarations for the recovery prefetching module. * - * Portions Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2022-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -25,7 +25,7 @@ typedef enum { RECOVERY_PREFETCH_OFF, RECOVERY_PREFETCH_ON, - RECOVERY_PREFETCH_TRY + RECOVERY_PREFETCH_TRY, } RecoveryPrefetchValue; struct XLogPrefetcher; diff --git a/src/include/access/xlogreader.h b/src/include/access/xlogreader.h index da32c7db7725a..2e9e5f43eb2de 100644 --- a/src/include/access/xlogreader.h +++ b/src/include/access/xlogreader.h @@ -3,7 +3,7 @@ * xlogreader.h * Definitions for the generic XLog reading facility * - * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/access/xlogreader.h @@ -350,7 +350,7 @@ typedef enum XLogPageReadResult { XLREAD_SUCCESS = 0, /* record is successfully read */ XLREAD_FAIL = -1, /* failed during reading a record */ - XLREAD_WOULDBLOCK = -2 /* nonblocking mode only, no data */ + XLREAD_WOULDBLOCK = -2, /* nonblocking mode only, no data */ } XLogPageReadResult; /* Read the next XLog record. Returns NULL on end-of-WAL or failure */ diff --git a/src/include/access/xlogrecord.h b/src/include/access/xlogrecord.h index f355e08e1d317..b9e5c59fae34d 100644 --- a/src/include/access/xlogrecord.h +++ b/src/include/access/xlogrecord.h @@ -3,7 +3,7 @@ * * Definitions for the WAL record format. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/xlogrecord.h @@ -68,8 +68,8 @@ typedef struct XLogRecord * in length if we ignore any allocation overhead of the XLogReader. * * To accommodate some overhead, this value allows for 4M of allocation - * overhead, that should be plenty enough for what - * DecodeXLogRecordRequiredSpace() expects as extra. + * overhead, that should be plenty enough for what the XLogReader + * infrastructure expects as extra. */ #define XLogRecordMaxSize (1020 * 1024 * 1024) diff --git a/src/include/access/xlogrecovery.h b/src/include/access/xlogrecovery.h index 47c29350f5d9b..c423464e8bc15 100644 --- a/src/include/access/xlogrecovery.h +++ b/src/include/access/xlogrecovery.h @@ -3,7 +3,7 @@ * * Functions for WAL recovery and standby mode * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/xlogrecovery.h @@ -27,7 +27,7 @@ typedef enum RECOVERY_TARGET_TIME, RECOVERY_TARGET_NAME, RECOVERY_TARGET_LSN, - RECOVERY_TARGET_IMMEDIATE + RECOVERY_TARGET_IMMEDIATE, } RecoveryTargetType; /* @@ -37,7 +37,7 @@ typedef enum { RECOVERY_TARGET_TIMELINE_CONTROLFILE, RECOVERY_TARGET_TIMELINE_LATEST, - RECOVERY_TARGET_TIMELINE_NUMERIC + RECOVERY_TARGET_TIMELINE_NUMERIC, } RecoveryTargetTimeLineGoal; /* Recovery pause states */ @@ -45,7 +45,7 @@ typedef enum RecoveryPauseState { RECOVERY_NOT_PAUSED, /* pause not requested */ RECOVERY_PAUSE_REQUESTED, /* pause requested, but not yet paused */ - RECOVERY_PAUSED /* recovery is paused */ + RECOVERY_PAUSED, /* recovery is paused */ } RecoveryPauseState; /* User-settable GUC parameters */ diff --git a/src/include/access/xlogstats.h b/src/include/access/xlogstats.h index 89410ce92b8e9..35bc5c974c687 100644 --- a/src/include/access/xlogstats.h +++ b/src/include/access/xlogstats.h @@ -3,7 +3,7 @@ * xlogstats.h * Definitions for WAL Statitstics * - * Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/access/xlogstats.h diff --git a/src/include/access/xlogutils.h b/src/include/access/xlogutils.h index 5b77b11f508ba..e24613e8f8174 100644 --- a/src/include/access/xlogutils.h +++ b/src/include/access/xlogutils.h @@ -3,7 +3,7 @@ * * Utilities for replaying WAL records. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/access/xlogutils.h @@ -49,7 +49,7 @@ typedef enum STANDBY_DISABLED, STANDBY_INITIALIZED, STANDBY_SNAPSHOT_PENDING, - STANDBY_SNAPSHOT_READY + STANDBY_SNAPSHOT_READY, } HotStandbyState; extern PGDLLIMPORT HotStandbyState standbyState; @@ -71,7 +71,7 @@ typedef enum BLK_NEEDS_REDO, /* changes from WAL record need to be applied */ BLK_DONE, /* block is already up-to-date */ BLK_RESTORED, /* block was restored from a full-page image */ - BLK_NOTFOUND /* block was not found (and hence does not + BLK_NOTFOUND, /* block was not found (and hence does not * need to be replayed) */ } XLogRedoAction; diff --git a/src/include/archive/archive_module.h b/src/include/archive/archive_module.h index 679ce5a6dbde1..763af76e542c7 100644 --- a/src/include/archive/archive_module.h +++ b/src/include/archive/archive_module.h @@ -3,7 +3,7 @@ * archive_module.h * Exports for archive modules. * - * Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * src/include/archive/archive_module.h * @@ -56,4 +56,12 @@ typedef const ArchiveModuleCallbacks *(*ArchiveModuleInit) (void); extern PGDLLEXPORT const ArchiveModuleCallbacks *_PG_archive_module_init(void); +/* Support for messages reported from archive module callbacks. */ + +extern PGDLLIMPORT char *arch_module_check_errdetail_string; + +#define arch_module_check_errdetail \ + pre_format_elog_string(errno, TEXTDOMAIN), \ + arch_module_check_errdetail_string = format_elog_string + #endif /* _ARCHIVE_MODULE_H */ diff --git a/src/include/archive/shell_archive.h b/src/include/archive/shell_archive.h index 9de6f769f121d..6f2e92aa9b138 100644 --- a/src/include/archive/shell_archive.h +++ b/src/include/archive/shell_archive.h @@ -3,7 +3,7 @@ * shell_archive.h * Exports for archiving via shell. * - * Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * src/include/archive/shell_archive.h * diff --git a/src/include/backup/backup_manifest.h b/src/include/backup/backup_manifest.h index d41b4399806f9..3853d2ca90026 100644 --- a/src/include/backup/backup_manifest.h +++ b/src/include/backup/backup_manifest.h @@ -3,7 +3,7 @@ * backup_manifest.h * Routines for generating a backup manifest. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * src/include/backup/backup_manifest.h * @@ -21,7 +21,7 @@ typedef enum manifest_option { MANIFEST_OPTION_YES, MANIFEST_OPTION_NO, - MANIFEST_OPTION_FORCE_ENCODE + MANIFEST_OPTION_FORCE_ENCODE, } backup_manifest_option; typedef struct backup_manifest_info @@ -39,7 +39,7 @@ extern void InitializeBackupManifest(backup_manifest_info *manifest, backup_manifest_option want_manifest, pg_checksum_type manifest_checksum_type); extern void AddFileToBackupManifest(backup_manifest_info *manifest, - const char *spcoid, + Oid spcoid, const char *pathname, size_t size, pg_time_t mtime, pg_checksum_context *checksum_ctx); diff --git a/src/include/backup/basebackup.h b/src/include/backup/basebackup.h index 3e68abc2bb78c..2888ec0f81502 100644 --- a/src/include/backup/basebackup.h +++ b/src/include/backup/basebackup.h @@ -3,7 +3,7 @@ * basebackup.h * Exports from replication/basebackup.c. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * src/include/backup/basebackup.h * @@ -27,13 +27,16 @@ */ typedef struct { - char *oid; /* tablespace's OID, as a decimal string */ + Oid oid; /* tablespace's OID */ char *path; /* full path to tablespace's directory */ char *rpath; /* relative path if it's within PGDATA, else * NULL */ int64 size; /* total size as sent; -1 if not known */ } tablespaceinfo; -extern void SendBaseBackup(BaseBackupCmd *cmd); +struct IncrementalBackupInfo; + +extern void SendBaseBackup(BaseBackupCmd *cmd, + struct IncrementalBackupInfo *ib); #endif /* _BASEBACKUP_H */ diff --git a/src/include/backup/basebackup_incremental.h b/src/include/backup/basebackup_incremental.h new file mode 100644 index 0000000000000..6ba9c9035e250 --- /dev/null +++ b/src/include/backup/basebackup_incremental.h @@ -0,0 +1,56 @@ +/*------------------------------------------------------------------------- + * + * basebackup_incremental.h + * API for incremental backup support + * + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group + * + * src/include/backup/basebackup_incremental.h + * + *------------------------------------------------------------------------- + */ +#ifndef BASEBACKUP_INCREMENTAL_H +#define BASEBACKUP_INCREMENTAL_H + +#include "access/xlogbackup.h" +#include "common/relpath.h" +#include "storage/block.h" +#include "utils/palloc.h" + +#define INCREMENTAL_MAGIC 0xd3ae1f0d + +typedef enum +{ + BACK_UP_FILE_FULLY, + BACK_UP_FILE_INCREMENTALLY +} FileBackupMethod; + +struct IncrementalBackupInfo; +typedef struct IncrementalBackupInfo IncrementalBackupInfo; + +extern IncrementalBackupInfo *CreateIncrementalBackupInfo(MemoryContext); + +extern void AppendIncrementalManifestData(IncrementalBackupInfo *ib, + const char *data, + int len); +extern void FinalizeIncrementalManifest(IncrementalBackupInfo *ib); + +extern void PrepareForIncrementalBackup(IncrementalBackupInfo *ib, + BackupState *backup_state); + +extern char *GetIncrementalFilePath(Oid dboid, Oid spcoid, + RelFileNumber relfilenumber, + ForkNumber forknum, unsigned segno); +extern FileBackupMethod GetFileBackupMethod(IncrementalBackupInfo *ib, + const char *path, + Oid dboid, Oid spcoid, + RelFileNumber relfilenumber, + ForkNumber forknum, + unsigned segno, size_t size, + unsigned *num_blocks_required, + BlockNumber *relative_block_numbers, + unsigned *truncation_block_length); +extern size_t GetIncrementalFileSize(unsigned num_blocks_required); +extern size_t GetIncrementalHeaderSize(unsigned num_blocks_required); + +#endif diff --git a/src/include/backup/basebackup_sink.h b/src/include/backup/basebackup_sink.h index 224732e333597..fcedba75a6543 100644 --- a/src/include/backup/basebackup_sink.h +++ b/src/include/backup/basebackup_sink.h @@ -17,7 +17,7 @@ * single task e.g. command progress reporting, throttling, or * communication with the client. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * src/include/backup/basebackup_sink.h * diff --git a/src/include/backup/basebackup_target.h b/src/include/backup/basebackup_target.h index 250572f6dde12..5814a656f5339 100644 --- a/src/include/backup/basebackup_target.h +++ b/src/include/backup/basebackup_target.h @@ -3,7 +3,7 @@ * basebackup_target.h * Extensibility framework for adding base backup targets. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * src/include/backup/basebackup_target.h * diff --git a/src/include/backup/walsummary.h b/src/include/backup/walsummary.h new file mode 100644 index 0000000000000..6575df8e4067c --- /dev/null +++ b/src/include/backup/walsummary.h @@ -0,0 +1,49 @@ +/*------------------------------------------------------------------------- + * + * walsummary.h + * WAL summary management + * + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group + * + * src/include/backup/walsummary.h + * + *------------------------------------------------------------------------- + */ +#ifndef WALSUMMARY_H +#define WALSUMMARY_H + +#include + +#include "access/xlogdefs.h" +#include "nodes/pg_list.h" +#include "storage/fd.h" + +typedef struct WalSummaryIO +{ + File file; + off_t filepos; +} WalSummaryIO; + +typedef struct WalSummaryFile +{ + XLogRecPtr start_lsn; + XLogRecPtr end_lsn; + TimeLineID tli; +} WalSummaryFile; + +extern List *GetWalSummaries(TimeLineID tli, XLogRecPtr start_lsn, + XLogRecPtr end_lsn); +extern List *FilterWalSummaries(List *wslist, TimeLineID tli, + XLogRecPtr start_lsn, XLogRecPtr end_lsn); +extern bool WalSummariesAreComplete(List *wslist, + XLogRecPtr start_lsn, XLogRecPtr end_lsn, + XLogRecPtr *missing_lsn); +extern File OpenWalSummaryFile(WalSummaryFile *ws, bool missing_ok); +extern void RemoveWalSummaryIfOlderThan(WalSummaryFile *ws, + time_t cutoff_time); + +extern int ReadWalSummary(void *wal_summary_io, void *data, int length); +extern int WriteWalSummary(void *wal_summary_io, void *data, int length); +extern void ReportWalSummaryError(void *callback_arg, char *fmt,...) pg_attribute_printf(2, 3); + +#endif /* WALSUMMARY_H */ diff --git a/src/include/bootstrap/bootstrap.h b/src/include/bootstrap/bootstrap.h index 2c28a52ce71fb..73b78b31335d3 100644 --- a/src/include/bootstrap/bootstrap.h +++ b/src/include/bootstrap/bootstrap.h @@ -4,7 +4,7 @@ * include file for the bootstrapping code * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/bootstrap/bootstrap.h @@ -15,6 +15,7 @@ #define BOOTSTRAP_H #include "nodes/execnodes.h" +#include "nodes/parsenodes.h" /* @@ -42,7 +43,7 @@ extern void InsertOneTuple(void); extern void InsertOneValue(char *value, int i); extern void InsertOneNull(int i); -extern void index_register(Oid heap, Oid ind, IndexInfo *indexInfo); +extern void index_register(Oid heap, Oid ind, const IndexInfo *indexInfo); extern void build_indices(void); extern void boot_get_type_io_data(Oid typid, diff --git a/src/include/c.h b/src/include/c.h index f69d739be5711..bc26c6aa7f10c 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -9,7 +9,7 @@ * polluting the namespace with lots of stuff... * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/c.h @@ -75,6 +75,11 @@ #include #endif +/* Define before including zlib.h to add const decorations to zlib API. */ +#ifdef HAVE_LIBZ +#define ZLIB_CONST +#endif + /* ---------------------------------------------------------------- * Section 1: compiler characteristics @@ -100,8 +105,6 @@ * GCC: https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html * Clang: https://clang.llvm.org/docs/AttributeReference.html * Sunpro: https://docs.oracle.com/cd/E18659_01/html/821-1384/gjzke.html - * XLC: https://www.ibm.com/support/knowledgecenter/SSGH2K_13.1.2/com.ibm.xlc131.aix.doc/language_ref/function_attributes.html - * XLC: https://www.ibm.com/support/knowledgecenter/SSGH2K_13.1.2/com.ibm.xlc131.aix.doc/language_ref/type_attrib.html */ /* @@ -132,6 +135,19 @@ #define pg_nodiscard #endif +/* + * This macro will disable address safety instrumentation for a function + * when running with "-fsanitize=address". Think twice before using this! + */ +#if defined(__clang__) || __GNUC__ >= 8 +#define pg_attribute_no_sanitize_address() __attribute__((no_sanitize("address"))) +#elif __has_attribute(no_sanitize_address) +/* This would work for clang, but it's deprecated. */ +#define pg_attribute_no_sanitize_address() __attribute__((no_sanitize_address)) +#else +#define pg_attribute_no_sanitize_address() +#endif + /* * Place this macro before functions that should be allowed to make misaligned * accesses. Think twice before using it on non-x86-specific code! @@ -166,8 +182,8 @@ #define PG_USED_FOR_ASSERTS_ONLY pg_attribute_unused() #endif -/* GCC and XLC support format attributes */ -#if defined(__GNUC__) || defined(__IBMC__) +/* GCC supports format attributes */ +#if defined(__GNUC__) #define pg_attribute_format_arg(a) __attribute__((format_arg(a))) #define pg_attribute_printf(f,a) __attribute__((format(PG_PRINTF_ATTRIBUTE, f, a))) #else @@ -175,8 +191,8 @@ #define pg_attribute_printf(f,a) #endif -/* GCC, Sunpro and XLC support aligned, packed and noreturn */ -#if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__) +/* GCC and Sunpro support aligned, packed and noreturn */ +#if defined(__GNUC__) || defined(__SUNPRO_C) #define pg_attribute_aligned(a) __attribute__((aligned(a))) #define pg_attribute_noreturn() __attribute__((noreturn)) #define pg_attribute_packed() __attribute__((packed)) @@ -207,8 +223,8 @@ * choose not to. But, if possible, don't force inlining in unoptimized * debug builds. */ -#if (defined(__GNUC__) && __GNUC__ > 3 && defined(__OPTIMIZE__)) || defined(__SUNPRO_C) || defined(__IBMC__) -/* GCC > 3, Sunpro and XLC support always_inline via __attribute__ */ +#if (defined(__GNUC__) && __GNUC__ > 3 && defined(__OPTIMIZE__)) || defined(__SUNPRO_C) +/* GCC > 3 and Sunpro support always_inline via __attribute__ */ #define pg_attribute_always_inline __attribute__((always_inline)) inline #elif defined(_MSC_VER) /* MSVC has a special keyword for this */ @@ -224,8 +240,8 @@ * for proper cost attribution. Note that unlike the pg_attribute_XXX macros * above, this should be placed before the function's return type and name. */ -/* GCC, Sunpro and XLC support noinline via __attribute__ */ -#if (defined(__GNUC__) && __GNUC__ > 2) || defined(__SUNPRO_C) || defined(__IBMC__) +/* GCC and Sunpro support noinline via __attribute__ */ +#if (defined(__GNUC__) && __GNUC__ > 2) || defined(__SUNPRO_C) #define pg_noinline __attribute__((noinline)) /* msvc via declspec */ #elif defined(_MSC_VER) @@ -419,7 +435,7 @@ typedef void (*pg_funcptr_t) (void); * bool * Boolean value, either true or false. * - * We use stdbool.h if available and its bool has size 1. That's useful for + * We use stdbool.h if bool has size 1 after including it. That's useful for * better compiler and debugger output and for compatibility with third-party * libraries. But PostgreSQL currently cannot deal with bool of other sizes; * there are static assertions around the code to prevent that. @@ -1055,30 +1071,6 @@ extern void ExceptionalCondition(const char *conditionName, } while (0) -/* - * MemSetTest/MemSetLoop are a variant version that allow all the tests in - * MemSet to be done at compile time in cases where "val" and "len" are - * constants *and* we know the "start" pointer must be word-aligned. - * If MemSetTest succeeds, then it is okay to use MemSetLoop, otherwise use - * MemSetAligned. Beware of multiple evaluations of the arguments when using - * this approach. - */ -#define MemSetTest(val, len) \ - ( ((len) & LONG_ALIGN_MASK) == 0 && \ - (len) <= MEMSET_LOOP_LIMIT && \ - MEMSET_LOOP_LIMIT != 0 && \ - (val) == 0 ) - -#define MemSetLoop(start, val, len) \ - do \ - { \ - long * _start = (long *) (start); \ - long * _stop = (long *) ((char *) _start + (Size) (len)); \ - \ - while (_start < _stop) \ - *_start++ = 0; \ - } while (0) - /* * Macros for range-checking float values before converting to integer. * We must be careful here that the boundary values are expressed exactly @@ -1240,7 +1232,10 @@ typedef union PGAlignedXLogBlock * Note that this only works in function scope, not for global variables (it'd * be nice, but not trivial, to improve that). */ -#if defined(HAVE__BUILTIN_TYPES_COMPATIBLE_P) +#if defined(__cplusplus) +#define unconstify(underlying_type, expr) const_cast(expr) +#define unvolatize(underlying_type, expr) const_cast(expr) +#elif defined(HAVE__BUILTIN_TYPES_COMPATIBLE_P) #define unconstify(underlying_type, expr) \ (StaticAssertExpr(__builtin_types_compatible_p(__typeof(expr), const underlying_type), \ "wrong cast"), \ diff --git a/src/include/catalog/.gitignore b/src/include/catalog/.gitignore index 6b83d4c7e6e5c..b580f734c7179 100644 --- a/src/include/catalog/.gitignore +++ b/src/include/catalog/.gitignore @@ -1,4 +1,8 @@ +/postgres.bki /schemapg.h +/syscache_ids.h +/syscache_info.h /system_fk_info.h +/system_constraints.sql /pg_*_d.h -/header-stamp +/bki-stamp diff --git a/src/include/catalog/Makefile b/src/include/catalog/Makefile index 6a669caade220..167f91a6e3fb3 100644 --- a/src/include/catalog/Makefile +++ b/src/include/catalog/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/include/catalog # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/Makefile @@ -13,6 +13,158 @@ subdir = src/include/catalog top_builddir = ../../.. include $(top_builddir)/src/Makefile.global +# Note: the order of this list determines the order in which the catalog +# header files are assembled into postgres.bki. BKI_BOOTSTRAP catalogs +# must appear first, and pg_statistic before pg_statistic_ext_data, and +# there are reputedly other, undocumented ordering dependencies. +CATALOG_HEADERS := \ + pg_proc.h \ + pg_type.h \ + pg_attribute.h \ + pg_class.h \ + pg_attrdef.h \ + pg_constraint.h \ + pg_inherits.h \ + pg_index.h \ + pg_operator.h \ + pg_opfamily.h \ + pg_opclass.h \ + pg_am.h \ + pg_amop.h \ + pg_amproc.h \ + pg_language.h \ + pg_largeobject_metadata.h \ + pg_largeobject.h \ + pg_aggregate.h \ + pg_statistic.h \ + pg_statistic_ext.h \ + pg_statistic_ext_data.h \ + pg_rewrite.h \ + pg_trigger.h \ + pg_event_trigger.h \ + pg_description.h \ + pg_cast.h \ + pg_enum.h \ + pg_namespace.h \ + pg_conversion.h \ + pg_depend.h \ + pg_database.h \ + pg_db_role_setting.h \ + pg_tablespace.h \ + pg_authid.h \ + pg_auth_members.h \ + pg_shdepend.h \ + pg_shdescription.h \ + pg_ts_config.h \ + pg_ts_config_map.h \ + pg_ts_dict.h \ + pg_ts_parser.h \ + pg_ts_template.h \ + pg_extension.h \ + pg_foreign_data_wrapper.h \ + pg_foreign_server.h \ + pg_user_mapping.h \ + pg_foreign_table.h \ + pg_policy.h \ + pg_replication_origin.h \ + pg_default_acl.h \ + pg_init_privs.h \ + pg_seclabel.h \ + pg_shseclabel.h \ + pg_collation.h \ + pg_parameter_acl.h \ + pg_partitioned_table.h \ + pg_range.h \ + pg_transform.h \ + pg_sequence.h \ + pg_publication.h \ + pg_publication_namespace.h \ + pg_publication_rel.h \ + pg_subscription.h \ + pg_subscription_rel.h + +GENERATED_HEADERS := $(CATALOG_HEADERS:%.h=%_d.h) + +POSTGRES_BKI_SRCS := $(addprefix $(top_srcdir)/src/include/catalog/, $(CATALOG_HEADERS)) + +# The .dat files we need can just be listed alphabetically. +POSTGRES_BKI_DATA = \ + pg_aggregate.dat \ + pg_am.dat \ + pg_amop.dat \ + pg_amproc.dat \ + pg_authid.dat \ + pg_cast.dat \ + pg_class.dat \ + pg_collation.dat \ + pg_conversion.dat \ + pg_database.dat \ + pg_language.dat \ + pg_namespace.dat \ + pg_opclass.dat \ + pg_operator.dat \ + pg_opfamily.dat \ + pg_proc.dat \ + pg_range.dat \ + pg_tablespace.dat \ + pg_ts_config.dat \ + pg_ts_config_map.dat \ + pg_ts_dict.dat \ + pg_ts_parser.dat \ + pg_ts_template.dat \ + pg_type.dat + +GENBKI_OUTPUT_FILES = \ + $(GENERATED_HEADERS) \ + postgres.bki \ + system_constraints.sql \ + schemapg.h \ + syscache_ids.h \ + syscache_info.h \ + system_fk_info.h + +all: generated-headers + +.PHONY: generated-headers + +generated-headers: bki-stamp + +# bki-stamp records the last time we ran genbki.pl. We don't rely on +# the timestamps of the individual output files, because the Perl script +# won't update them if they didn't change (to avoid unnecessary recompiles). +# Technically, this should depend on Makefile.global which supplies +# $(MAJORVERSION); but then genbki.pl would need to be re-run after every +# configure run, even in distribution tarballs. So depending on configure.ac +# instead is cheating a bit, but it will achieve the goal of updating the +# version number when it changes. +bki-stamp: $(top_srcdir)/src/backend/catalog/genbki.pl $(top_srcdir)/src/backend/catalog/Catalog.pm $(POSTGRES_BKI_SRCS) $(POSTGRES_BKI_DATA) $(top_srcdir)/configure.ac $(top_srcdir)/src/include/access/transam.h + $(PERL) $< --include-path=$(top_srcdir)/src/include/ \ + --set-version=$(MAJORVERSION) $(POSTGRES_BKI_SRCS) + touch $@ + +install: all installdirs + $(INSTALL_DATA) postgres.bki '$(DESTDIR)$(datadir)/postgres.bki' + $(INSTALL_DATA) system_constraints.sql '$(DESTDIR)$(datadir)/system_constraints.sql' +# In non-vpath builds, src/include/Makefile already installs all headers. +ifeq ($(vpath_build),yes) + $(INSTALL_DATA) schemapg.h '$(DESTDIR)$(includedir_server)'/catalog/schemapg.h + $(INSTALL_DATA) syscache_ids.h '$(DESTDIR)$(includedir_server)'/catalog/syscache_ids.h + $(INSTALL_DATA) system_fk_info.h '$(DESTDIR)$(includedir_server)'/catalog/system_fk_info.h + for file in $(GENERATED_HEADERS); do \ + $(INSTALL_DATA) $$file '$(DESTDIR)$(includedir_server)'/catalog/$$file || exit; \ + done +endif + +installdirs: + $(MKDIR_P) '$(DESTDIR)$(datadir)' '$(DESTDIR)$(includedir_server)' + +uninstall: + rm -f $(addprefix '$(DESTDIR)$(datadir)'/, postgres.bki system_constraints.sql) + rm -f $(addprefix '$(DESTDIR)$(includedir_server)'/catalog/, schemapg.h syscache_ids.h system_fk_info.h $(GENERATED_HEADERS)) + +clean: + rm -f bki-stamp $(GENBKI_OUTPUT_FILES) + # 'make reformat-dat-files' is a convenience target for rewriting the # catalog data files in our standard format. This includes collapsing # out any entries that are redundant with a BKI_DEFAULT annotation. diff --git a/src/include/catalog/binary_upgrade.h b/src/include/catalog/binary_upgrade.h index 82a9125ba9c3e..1d5826195e273 100644 --- a/src/include/catalog/binary_upgrade.h +++ b/src/include/catalog/binary_upgrade.h @@ -4,7 +4,7 @@ * variables used for binary upgrades * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/binary_upgrade.h diff --git a/src/include/catalog/catalog.h b/src/include/catalog/catalog.h index 48b0fdc61a575..a8dd304b1ad0d 100644 --- a/src/include/catalog/catalog.h +++ b/src/include/catalog/catalog.h @@ -4,7 +4,7 @@ * prototypes for functions in backend/catalog/catalog.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/catalog.h @@ -21,11 +21,13 @@ extern bool IsSystemRelation(Relation relation); extern bool IsToastRelation(Relation relation); extern bool IsCatalogRelation(Relation relation); +extern bool IsInplaceUpdateRelation(Relation relation); extern bool IsSystemClass(Oid relid, Form_pg_class reltuple); extern bool IsToastClass(Form_pg_class reltuple); extern bool IsCatalogRelationOid(Oid relid); +extern bool IsInplaceUpdateOid(Oid relid); extern bool IsCatalogNamespace(Oid namespaceId); extern bool IsToastNamespace(Oid namespaceId); diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index fe70d8396d6c5..9b4442eb181a3 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -38,7 +38,7 @@ * parsenodes.h will warrant a catversion update. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/catversion.h @@ -57,6 +57,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202306141 +#define CATALOG_VERSION_NO 202406281 #endif diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h index ffd5e9dc82dda..6908ca7180ae1 100644 --- a/src/include/catalog/dependency.h +++ b/src/include/catalog/dependency.h @@ -4,7 +4,7 @@ * Routines to support inter-object dependencies. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/dependency.h @@ -36,7 +36,7 @@ typedef enum DependencyType DEPENDENCY_PARTITION_PRI = 'P', DEPENDENCY_PARTITION_SEC = 'S', DEPENDENCY_EXTENSION = 'e', - DEPENDENCY_AUTO_EXTENSION = 'x' + DEPENDENCY_AUTO_EXTENSION = 'x', } DependencyType; /* @@ -56,11 +56,17 @@ typedef enum DependencyType * created for the owner of an object; hence two objects may be linked by * one or the other, but not both, of these dependency types.) * - * (c) a SHARED_DEPENDENCY_POLICY entry means that the referenced object is + * (c) a SHARED_DEPENDENCY_INITACL entry means that the referenced object is + * a role mentioned in a pg_init_privs entry for the dependent object. + * The referenced object must be a pg_authid entry. (Unlike the case for + * SHARED_DEPENDENCY_ACL, we make an entry for such a role whether or not + * it is the object's owner.) + * + * (d) a SHARED_DEPENDENCY_POLICY entry means that the referenced object is * a role mentioned in a policy object. The referenced object must be a * pg_authid entry. * - * (d) a SHARED_DEPENDENCY_TABLESPACE entry means that the referenced + * (e) a SHARED_DEPENDENCY_TABLESPACE entry means that the referenced * object is a tablespace mentioned in a relation without storage. The * referenced object must be a pg_tablespace entry. (Relations that have * storage don't need this: they are protected by the existence of a physical @@ -73,65 +79,15 @@ typedef enum SharedDependencyType { SHARED_DEPENDENCY_OWNER = 'o', SHARED_DEPENDENCY_ACL = 'a', + SHARED_DEPENDENCY_INITACL = 'i', SHARED_DEPENDENCY_POLICY = 'r', SHARED_DEPENDENCY_TABLESPACE = 't', - SHARED_DEPENDENCY_INVALID = 0 + SHARED_DEPENDENCY_INVALID = 0, } SharedDependencyType; /* expansible list of ObjectAddresses (private in dependency.c) */ typedef struct ObjectAddresses ObjectAddresses; -/* - * This enum covers all system catalogs whose OIDs can appear in - * pg_depend.classId or pg_shdepend.classId. Keep object_classes[] in sync. - */ -typedef enum ObjectClass -{ - OCLASS_CLASS, /* pg_class */ - OCLASS_PROC, /* pg_proc */ - OCLASS_TYPE, /* pg_type */ - OCLASS_CAST, /* pg_cast */ - OCLASS_COLLATION, /* pg_collation */ - OCLASS_CONSTRAINT, /* pg_constraint */ - OCLASS_CONVERSION, /* pg_conversion */ - OCLASS_DEFAULT, /* pg_attrdef */ - OCLASS_LANGUAGE, /* pg_language */ - OCLASS_LARGEOBJECT, /* pg_largeobject */ - OCLASS_OPERATOR, /* pg_operator */ - OCLASS_OPCLASS, /* pg_opclass */ - OCLASS_OPFAMILY, /* pg_opfamily */ - OCLASS_AM, /* pg_am */ - OCLASS_AMOP, /* pg_amop */ - OCLASS_AMPROC, /* pg_amproc */ - OCLASS_REWRITE, /* pg_rewrite */ - OCLASS_TRIGGER, /* pg_trigger */ - OCLASS_SCHEMA, /* pg_namespace */ - OCLASS_STATISTIC_EXT, /* pg_statistic_ext */ - OCLASS_TSPARSER, /* pg_ts_parser */ - OCLASS_TSDICT, /* pg_ts_dict */ - OCLASS_TSTEMPLATE, /* pg_ts_template */ - OCLASS_TSCONFIG, /* pg_ts_config */ - OCLASS_ROLE, /* pg_authid */ - OCLASS_ROLE_MEMBERSHIP, /* pg_auth_members */ - OCLASS_DATABASE, /* pg_database */ - OCLASS_TBLSPACE, /* pg_tablespace */ - OCLASS_FDW, /* pg_foreign_data_wrapper */ - OCLASS_FOREIGN_SERVER, /* pg_foreign_server */ - OCLASS_USER_MAPPING, /* pg_user_mapping */ - OCLASS_DEFACL, /* pg_default_acl */ - OCLASS_EXTENSION, /* pg_extension */ - OCLASS_EVENT_TRIGGER, /* pg_event_trigger */ - OCLASS_PARAMETER_ACL, /* pg_parameter_acl */ - OCLASS_POLICY, /* pg_policy */ - OCLASS_PUBLICATION, /* pg_publication */ - OCLASS_PUBLICATION_NAMESPACE, /* pg_publication_namespace */ - OCLASS_PUBLICATION_REL, /* pg_publication_rel */ - OCLASS_SUBSCRIPTION, /* pg_subscription */ - OCLASS_TRANSFORM /* pg_transform */ -} ObjectClass; - -#define LAST_OCLASS OCLASS_TRANSFORM - /* flag bits for performDeletion/performMultipleDeletions: */ #define PERFORM_DELETION_INTERNAL 0x0001 /* internal action */ #define PERFORM_DELETION_CONCURRENTLY 0x0002 /* concurrent drop */ @@ -164,8 +120,6 @@ extern void recordDependencyOnSingleRelExpr(const ObjectAddress *depender, DependencyType self_behavior, bool reverse_self); -extern ObjectClass getObjectClass(const ObjectAddress *object); - extern ObjectAddresses *new_object_addresses(void); extern void add_exact_object_address(const ObjectAddress *object, @@ -223,7 +177,7 @@ extern List *getAutoExtensionsOfObject(Oid classId, Oid objectId); extern bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId); extern List *getOwnedSequences(Oid relid); -extern Oid getIdentitySequence(Oid relid, AttrNumber attnum, bool missing_ok); +extern Oid getIdentitySequence(Relation rel, AttrNumber attnum, bool missing_ok); extern Oid get_index_constraint(Oid indexId); @@ -254,6 +208,10 @@ extern void updateAclDependencies(Oid classId, Oid objectId, int32 objsubId, int noldmembers, Oid *oldmembers, int nnewmembers, Oid *newmembers); +extern void updateInitAclDependencies(Oid classId, Oid objectId, int32 objsubId, + int noldmembers, Oid *oldmembers, + int nnewmembers, Oid *newmembers); + extern bool checkSharedDependencies(Oid classId, Oid objectId, char **detail_msg, char **detail_log_msg); diff --git a/src/include/catalog/duplicate_oids b/src/include/catalog/duplicate_oids index eb5c3fb084073..8965cfb813703 100755 --- a/src/include/catalog/duplicate_oids +++ b/src/include/catalog/duplicate_oids @@ -9,7 +9,7 @@ # the same catalog, our project policy is that manually assigned OIDs # should be globally unique, to avoid confusion. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/duplicate_oids @@ -17,7 +17,7 @@ #---------------------------------------------------------------------- use strict; -use warnings; +use warnings FATAL => 'all'; # Must run in src/include/catalog use FindBin; diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h index 50518cbbf53ab..201c8c7ef9b76 100644 --- a/src/include/catalog/genbki.h +++ b/src/include/catalog/genbki.h @@ -9,7 +9,7 @@ * bootstrap file from these header files.) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/genbki.h @@ -71,18 +71,19 @@ * DECLARE_UNIQUE_INDEX_PKEY. ("PKEY" marks the index as being the catalog's * primary key; currently this is only cosmetically different from a regular * unique index. By convention, we usually make a catalog's OID column its - * pkey, if it has one.) The first two arguments are the index's name and - * OID, the rest is much like a standard 'create index' SQL command. + * pkey, if it has one.) * - * For each index, we also provide a #define for its OID. References to - * the index in the C code should always use these #defines, not the actual - * index name (much less the numeric OID). + * The first two arguments are the index's name and OID. The third argument + * is the name of a #define to generate for its OID. References to the index + * in the C code should always use these #defines, not the actual index name + * (much less the numeric OID). The fourth argument is the table name. The + * rest is much like a standard 'create index' SQL command. * * The macro definitions are just to keep the C compiler from spitting up. */ -#define DECLARE_INDEX(name,oid,oidmacro,decl) extern int no_such_variable -#define DECLARE_UNIQUE_INDEX(name,oid,oidmacro,decl) extern int no_such_variable -#define DECLARE_UNIQUE_INDEX_PKEY(name,oid,oidmacro,decl) extern int no_such_variable +#define DECLARE_INDEX(name,oid,oidmacro,tblname,decl) extern int no_such_variable +#define DECLARE_UNIQUE_INDEX(name,oid,oidmacro,tblname,decl) extern int no_such_variable +#define DECLARE_UNIQUE_INDEX_PKEY(name,oid,oidmacro,tblname,decl) extern int no_such_variable /* * These lines inform genbki.pl about manually-assigned OIDs that do not @@ -119,6 +120,12 @@ #define DECLARE_ARRAY_FOREIGN_KEY(cols,reftbl,refcols) extern int no_such_variable #define DECLARE_ARRAY_FOREIGN_KEY_OPT(cols,reftbl,refcols) extern int no_such_variable +/* + * Create a syscache with the given name, index, and bucket size. See + * syscache.c. + */ +#define MAKE_SYSCACHE(name,idxname,nbuckets) extern int no_such_variable + /* The following are never defined; they are here only for documentation. */ /* diff --git a/src/include/catalog/heap.h b/src/include/catalog/heap.h index d01ab504b6f2a..9b2ed410f9495 100644 --- a/src/include/catalog/heap.h +++ b/src/include/catalog/heap.h @@ -4,7 +4,7 @@ * prototypes for functions in backend/catalog/heap.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/heap.h @@ -28,7 +28,7 @@ typedef struct RawColumnDefault { AttrNumber attnum; /* attribute to attach default to */ Node *raw_default; /* default value (untransformed parse tree) */ - bool missingMode; /* true if part of add column processing */ + bool missingMode; /* obsolete, no longer used */ char generated; /* attgenerated setting */ } RawColumnDefault; @@ -97,7 +97,7 @@ extern List *heap_truncate_find_FKs(List *relationIds); extern void InsertPgAttributeTuples(Relation pg_attribute_rel, TupleDesc tupdesc, Oid new_rel_oid, - Datum *attoptions, + const FormExtraData_pg_attribute tupdesc_extra[], CatalogIndexState indstate); extern void InsertPgClassTuple(Relation pg_class_desc, @@ -115,6 +115,9 @@ extern List *AddRelationNewConstraints(Relation rel, const char *queryString); extern void RelationClearMissing(Relation rel); + +extern void StoreAttrMissingVal(Relation rel, AttrNumber attnum, + Datum missingval); extern void SetAttrMissing(Oid relid, char *attname, char *value); extern Node *cookDefault(ParseState *pstate, diff --git a/src/include/catalog/index.h b/src/include/catalog/index.h index c8532fb97c810..7d434f8e65354 100644 --- a/src/include/catalog/index.h +++ b/src/include/catalog/index.h @@ -4,7 +4,7 @@ * prototypes for catalog/index.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/index.h @@ -26,7 +26,7 @@ typedef enum INDEX_CREATE_SET_READY, INDEX_CREATE_SET_VALID, INDEX_DROP_CLEAR_VALID, - INDEX_DROP_SET_DEAD + INDEX_DROP_SET_DEAD, } IndexStateFlagsAction; /* options for REINDEX */ @@ -54,9 +54,9 @@ typedef struct ValidateIndexState } ValidateIndexState; extern void index_check_primary_key(Relation heapRel, - IndexInfo *indexInfo, + const IndexInfo *indexInfo, bool is_alter_table, - IndexStmt *stmt); + const IndexStmt *stmt); #define INDEX_CREATE_IS_PRIMARY (1 << 0) #define INDEX_CREATE_ADD_CONSTRAINT (1 << 1) @@ -73,12 +73,14 @@ extern Oid index_create(Relation heapRelation, Oid parentConstraintId, RelFileNumber relFileNumber, IndexInfo *indexInfo, - List *indexColNames, - Oid accessMethodObjectId, + const List *indexColNames, + Oid accessMethodId, Oid tableSpaceId, - Oid *collationObjectId, - Oid *classObjectId, - int16 *coloptions, + const Oid *collationIds, + const Oid *opclassIds, + const Datum *opclassOptions, + const int16 *coloptions, + const NullableDatum *stattargets, Datum reloptions, bits16 flags, bits16 constr_flags, @@ -110,7 +112,7 @@ extern void index_concurrently_set_dead(Oid heapId, extern ObjectAddress index_constraint_create(Relation heapRelation, Oid indexRelationId, Oid parentConstraintId, - IndexInfo *indexInfo, + const IndexInfo *indexInfo, const char *constraintName, char constraintType, bits16 constr_flags, @@ -123,10 +125,10 @@ extern IndexInfo *BuildIndexInfo(Relation index); extern IndexInfo *BuildDummyIndexInfo(Relation index); -extern bool CompareIndexInfo(IndexInfo *info1, IndexInfo *info2, - Oid *collations1, Oid *collations2, - Oid *opfamilies1, Oid *opfamilies2, - AttrMap *attmap); +extern bool CompareIndexInfo(const IndexInfo *info1, const IndexInfo *info2, + const Oid *collations1, const Oid *collations2, + const Oid *opfamilies1, const Oid *opfamilies2, + const AttrMap *attmap); extern void BuildSpeculativeIndexInfo(Relation index, IndexInfo *ii); @@ -148,8 +150,9 @@ extern void index_set_state_flags(Oid indexId, IndexStateFlagsAction action); extern Oid IndexGetRelation(Oid indexId, bool missing_ok); -extern void reindex_index(Oid indexId, bool skip_constraint_checks, - char persistence, ReindexParams *params); +extern void reindex_index(const ReindexStmt *stmt, Oid indexId, + bool skip_constraint_checks, char persistence, + const ReindexParams *params); /* Flag bits for reindex_relation(): */ #define REINDEX_REL_PROCESS_TOAST 0x01 @@ -158,7 +161,8 @@ extern void reindex_index(Oid indexId, bool skip_constraint_checks, #define REINDEX_REL_FORCE_INDEXES_UNLOGGED 0x08 #define REINDEX_REL_FORCE_INDEXES_PERMANENT 0x10 -extern bool reindex_relation(Oid relid, int flags, ReindexParams *params); +extern bool reindex_relation(const ReindexStmt *stmt, Oid relid, int flags, + const ReindexParams *params); extern bool ReindexIsProcessingHeap(Oid heapOid); extern bool ReindexIsProcessingIndex(Oid indexOid); @@ -166,7 +170,7 @@ extern bool ReindexIsProcessingIndex(Oid indexOid); extern void ResetReindexState(int nestLevel); extern Size EstimateReindexStateSpace(void); extern void SerializeReindexState(Size maxsize, char *start_address); -extern void RestoreReindexState(void *reindexstate); +extern void RestoreReindexState(const void *reindexstate); extern void IndexSetParentIndex(Relation partitionIdx, Oid parentOid); diff --git a/src/include/catalog/indexing.h b/src/include/catalog/indexing.h index 5c0693835cdf8..30b5350059965 100644 --- a/src/include/catalog/indexing.h +++ b/src/include/catalog/indexing.h @@ -5,7 +5,7 @@ * on system catalogs * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/indexing.h diff --git a/src/include/catalog/meson.build b/src/include/catalog/meson.build index c3fd05d0279aa..f70d1daba52a3 100644 --- a/src/include/catalog/meson.build +++ b/src/include/catalog/meson.build @@ -1,5 +1,9 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group +# Note: the order of this list determines the order in which the catalog +# header files are assembled into postgres.bki. BKI_BOOTSTRAP catalogs +# must appear first, and pg_statistic before pg_statistic_ext_data, and +# there are reputedly other, undocumented ordering dependencies. catalog_headers = [ 'pg_proc.h', 'pg_type.h', @@ -67,6 +71,7 @@ catalog_headers = [ 'pg_subscription_rel.h', ] +# The .dat files we need can just be listed alphabetically. bki_data = [ 'pg_aggregate.dat', 'pg_am.dat', @@ -97,8 +102,22 @@ bki_data_f = files(bki_data) input = [] -output_files = ['postgres.bki', 'system_constraints.sql', 'schemapg.h', 'system_fk_info.h'] -output_install = [dir_data, dir_data, dir_include_server / 'catalog', dir_include_server / 'catalog'] +output_files = [ + 'postgres.bki', + 'system_constraints.sql', + 'schemapg.h', + 'syscache_ids.h', + 'syscache_info.h', + 'system_fk_info.h', +] +output_install = [ + dir_data, + dir_data, + dir_include_server / 'catalog', + dir_include_server / 'catalog', + false, + dir_include_server / 'catalog', +] foreach h : catalog_headers fname = h.split('.h')[0] + '_d.h' @@ -126,8 +145,7 @@ generated_catalog_headers = custom_target('generated_catalog_headers', generated_headers += generated_catalog_headers.to_list() # autoconf generates the file there, ensure we get a conflict -generated_sources_ac += {'src/backend/catalog': output_files + ['bki-stamp']} -generated_sources_ac += {'src/include/catalog': ['header-stamp']} +generated_sources_ac += {'src/include/catalog': output_files + ['bki-stamp']} # 'reformat-dat-files' is a convenience target for rewriting the # catalog data files in our standard format. This includes collapsing diff --git a/src/include/catalog/namespace.h b/src/include/catalog/namespace.h index f64a0ec26b97b..8d434d48d573a 100644 --- a/src/include/catalog/namespace.h +++ b/src/include/catalog/namespace.h @@ -4,7 +4,7 @@ * prototypes for functions in backend/catalog/namespace.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/namespace.h @@ -16,6 +16,7 @@ #include "nodes/primnodes.h" #include "storage/lock.h" +#include "storage/procnumber.h" /* @@ -45,23 +46,23 @@ typedef enum TempNamespaceStatus { TEMP_NAMESPACE_NOT_TEMP, /* nonexistent, or non-temp namespace */ TEMP_NAMESPACE_IDLE, /* exists, belongs to no active session */ - TEMP_NAMESPACE_IN_USE /* belongs to some active session */ + TEMP_NAMESPACE_IN_USE, /* belongs to some active session */ } TempNamespaceStatus; /* - * Structure for xxxOverrideSearchPath functions + * Structure for xxxSearchPathMatcher functions * * The generation counter is private to namespace.c and shouldn't be touched * by other code. It can be initialized to zero if necessary (that means * "not known equal to the current active path"). */ -typedef struct OverrideSearchPath +typedef struct SearchPathMatcher { List *schemas; /* OIDs of explicitly named schemas */ bool addCatalog; /* implicitly prepend pg_catalog? */ bool addTemp; /* implicitly prepend temp schema? */ uint64 generation; /* for quick detection of equality to active */ -} OverrideSearchPath; +} SearchPathMatcher; /* * Option flag bits for RangeVarGetRelidExtended(). @@ -70,8 +71,8 @@ typedef enum RVROption { RVR_MISSING_OK = 1 << 0, /* don't error if relation doesn't exist */ RVR_NOWAIT = 1 << 1, /* error if relation cannot be locked */ - RVR_SKIP_LOCKED = 1 << 2 /* skip if relation cannot be locked */ -} RVROption; + RVR_SKIP_LOCKED = 1 << 2, /* skip if relation cannot be locked */ +} RVROption; typedef void (*RangeVarGetRelidCallback) (const RangeVar *relation, Oid relId, Oid oldRelId, void *callback_arg); @@ -122,7 +123,7 @@ extern Oid ConversionGetConid(const char *conname); extern bool ConversionIsVisible(Oid conid); extern Oid get_statistics_object_oid(List *names, bool missing_ok); -extern bool StatisticsObjIsVisible(Oid relid); +extern bool StatisticsObjIsVisible(Oid stxid); extern Oid get_ts_parser_oid(List *names, bool missing_ok); extern bool TSParserIsVisible(Oid prsId); @@ -136,7 +137,7 @@ extern bool TSTemplateIsVisible(Oid tmplId); extern Oid get_ts_config_oid(List *names, bool missing_ok); extern bool TSConfigIsVisible(Oid cfgid); -extern void DeconstructQualifiedName(List *names, +extern void DeconstructQualifiedName(const List *names, char **nspname_p, char **objname_p); extern Oid LookupNamespaceNoError(const char *nspname); @@ -145,10 +146,10 @@ extern Oid get_namespace_oid(const char *nspname, bool missing_ok); extern Oid LookupCreationNamespace(const char *nspname); extern void CheckSetNamespace(Oid oldNspOid, Oid nspOid); -extern Oid QualifiedNameGetCreationNamespace(List *names, char **objname_p); -extern RangeVar *makeRangeVarFromNameList(List *names); -extern char *NameListToString(List *names); -extern char *NameListToQuotedString(List *names); +extern Oid QualifiedNameGetCreationNamespace(const List *names, char **objname_p); +extern RangeVar *makeRangeVarFromNameList(const List *names); +extern char *NameListToString(const List *names); +extern char *NameListToQuotedString(const List *names); extern bool isTempNamespace(Oid namespaceId); extern bool isTempToastNamespace(Oid namespaceId); @@ -156,7 +157,7 @@ extern bool isTempOrTempToastNamespace(Oid namespaceId); extern bool isAnyTempNamespace(Oid namespaceId); extern bool isOtherTempNamespace(Oid namespaceId); extern TempNamespaceStatus checkTempNamespaceStatus(Oid namespaceId); -extern int GetTempNamespaceBackendId(Oid namespaceId); +extern ProcNumber GetTempNamespaceProcNumber(Oid namespaceId); extern Oid GetTempToastNamespace(void); extern void GetTempNamespaceState(Oid *tempNamespaceId, Oid *tempToastNamespaceId); @@ -164,11 +165,9 @@ extern void SetTempNamespaceState(Oid tempNamespaceId, Oid tempToastNamespaceId); extern void ResetTempTableNamespace(void); -extern OverrideSearchPath *GetOverrideSearchPath(MemoryContext context); -extern OverrideSearchPath *CopyOverrideSearchPath(OverrideSearchPath *path); -extern bool OverrideSearchPathMatchesCurrent(OverrideSearchPath *path); -extern void PushOverrideSearchPath(OverrideSearchPath *newpath); -extern void PopOverrideSearchPath(void); +extern SearchPathMatcher *GetSearchPathMatcher(MemoryContext context); +extern SearchPathMatcher *CopySearchPathMatcher(SearchPathMatcher *path); +extern bool SearchPathMatchesCurrentEnvironment(SearchPathMatcher *path); extern Oid get_collation_oid(List *collname, bool missing_ok); extern Oid get_conversion_oid(List *conname, bool missing_ok); diff --git a/src/include/catalog/objectaccess.h b/src/include/catalog/objectaccess.h index d8145dd4c6369..88387feb2c322 100644 --- a/src/include/catalog/objectaccess.h +++ b/src/include/catalog/objectaccess.h @@ -3,7 +3,7 @@ * * Object access hooks. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California */ @@ -52,7 +52,7 @@ typedef enum ObjectAccessType OAT_POST_ALTER, OAT_NAMESPACE_SEARCH, OAT_FUNCTION_EXECUTE, - OAT_TRUNCATE + OAT_TRUNCATE, } ObjectAccessType; /* diff --git a/src/include/catalog/objectaddress.h b/src/include/catalog/objectaddress.h index 9caa3109a2e46..c4ba1cb2b3293 100644 --- a/src/include/catalog/objectaddress.h +++ b/src/include/catalog/objectaddress.h @@ -3,7 +3,7 @@ * objectaddress.h * functions for working with object addresses * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/objectaddress.h @@ -69,6 +69,10 @@ extern bool get_object_namensp_unique(Oid class_id); extern HeapTuple get_catalog_object_by_oid(Relation catalog, AttrNumber oidcol, Oid objectId); +extern HeapTuple get_catalog_object_by_oid_extended(Relation catalog, + AttrNumber oidcol, + Oid objectId, + bool locktup); extern char *getObjectDescription(const ObjectAddress *object, bool missing_ok); diff --git a/src/include/catalog/partition.h b/src/include/catalog/partition.h index 79ce711802341..1540fccf4be3b 100644 --- a/src/include/catalog/partition.h +++ b/src/include/catalog/partition.h @@ -4,7 +4,7 @@ * Header file for structures and utility functions related to * partitioning * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * src/include/catalog/partition.h * diff --git a/src/include/catalog/pg_aggregate.dat b/src/include/catalog/pg_aggregate.dat index 1bc1d97d741c0..5f13532abcc89 100644 --- a/src/include/catalog/pg_aggregate.dat +++ b/src/include/catalog/pg_aggregate.dat @@ -3,7 +3,7 @@ # pg_aggregate.dat # Initial contents of the pg_aggregate system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_aggregate.dat @@ -43,12 +43,14 @@ { aggfnoid => 'avg(float8)', aggtransfn => 'float8_accum', aggfinalfn => 'float8_avg', aggcombinefn => 'float8_combine', aggtranstype => '_float8', agginitval => '{0,0,0}' }, -{ aggfnoid => 'avg(interval)', aggtransfn => 'interval_accum', - aggfinalfn => 'interval_avg', aggcombinefn => 'interval_combine', - aggmtransfn => 'interval_accum', aggminvtransfn => 'interval_accum_inv', - aggmfinalfn => 'interval_avg', aggtranstype => '_interval', - aggmtranstype => '_interval', agginitval => '{0 second,0 second}', - aggminitval => '{0 second,0 second}' }, +{ aggfnoid => 'avg(interval)', aggtransfn => 'interval_avg_accum', + aggfinalfn => 'interval_avg', aggcombinefn => 'interval_avg_combine', + aggserialfn => 'interval_avg_serialize', + aggdeserialfn => 'interval_avg_deserialize', + aggmtransfn => 'interval_avg_accum', + aggminvtransfn => 'interval_avg_accum_inv', aggmfinalfn => 'interval_avg', + aggtranstype => 'internal', aggtransspace => '40', + aggmtranstype => 'internal', aggmtransspace => '40' }, # sum { aggfnoid => 'sum(int8)', aggtransfn => 'int8_avg_accum', @@ -72,10 +74,14 @@ { aggfnoid => 'sum(money)', aggtransfn => 'cash_pl', aggcombinefn => 'cash_pl', aggmtransfn => 'cash_pl', aggminvtransfn => 'cash_mi', aggtranstype => 'money', aggmtranstype => 'money' }, -{ aggfnoid => 'sum(interval)', aggtransfn => 'interval_pl', - aggcombinefn => 'interval_pl', aggmtransfn => 'interval_pl', - aggminvtransfn => 'interval_mi', aggtranstype => 'interval', - aggmtranstype => 'interval' }, +{ aggfnoid => 'sum(interval)', aggtransfn => 'interval_avg_accum', + aggfinalfn => 'interval_sum', aggcombinefn => 'interval_avg_combine', + aggserialfn => 'interval_avg_serialize', + aggdeserialfn => 'interval_avg_deserialize', + aggmtransfn => 'interval_avg_accum', + aggminvtransfn => 'interval_avg_accum_inv', aggmfinalfn => 'interval_sum', + aggtranstype => 'internal', aggtransspace => '40', + aggmtranstype => 'internal', aggmtransspace => '40' }, { aggfnoid => 'sum(numeric)', aggtransfn => 'numeric_avg_accum', aggfinalfn => 'numeric_sum', aggcombinefn => 'numeric_avg_combine', aggserialfn => 'numeric_avg_serialize', diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h index 3112881193666..490f64546956e 100644 --- a/src/include/catalog/pg_aggregate.h +++ b/src/include/catalog/pg_aggregate.h @@ -4,7 +4,7 @@ * definition of the "aggregate" system catalog (pg_aggregate) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_aggregate.h @@ -110,7 +110,9 @@ typedef FormData_pg_aggregate *Form_pg_aggregate; DECLARE_TOAST(pg_aggregate, 4159, 4160); -DECLARE_UNIQUE_INDEX_PKEY(pg_aggregate_fnoid_index, 2650, AggregateFnoidIndexId, on pg_aggregate using btree(aggfnoid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_aggregate_fnoid_index, 2650, AggregateFnoidIndexId, pg_aggregate, btree(aggfnoid oid_ops)); + +MAKE_SYSCACHE(AGGFNOID, pg_aggregate_fnoid_index, 16); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/src/include/catalog/pg_am.dat b/src/include/catalog/pg_am.dat index ed641037ddd2a..db8749028206b 100644 --- a/src/include/catalog/pg_am.dat +++ b/src/include/catalog/pg_am.dat @@ -3,7 +3,7 @@ # pg_am.dat # Initial contents of the pg_am system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_am.dat diff --git a/src/include/catalog/pg_am.h b/src/include/catalog/pg_am.h index dab54be130c6a..475593fad4cab 100644 --- a/src/include/catalog/pg_am.h +++ b/src/include/catalog/pg_am.h @@ -4,7 +4,7 @@ * definition of the "access method" system catalog (pg_am) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_am.h @@ -47,8 +47,11 @@ CATALOG(pg_am,2601,AccessMethodRelationId) */ typedef FormData_pg_am *Form_pg_am; -DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, AmNameIndexId, on pg_am using btree(amname name_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_am_oid_index, 2652, AmOidIndexId, on pg_am using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, AmNameIndexId, pg_am, btree(amname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_am_oid_index, 2652, AmOidIndexId, pg_am, btree(oid oid_ops)); + +MAKE_SYSCACHE(AMNAME, pg_am_name_index, 4); +MAKE_SYSCACHE(AMOID, pg_am_oid_index, 4); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/src/include/catalog/pg_amop.dat b/src/include/catalog/pg_amop.dat index c4d6adcd3e166..d8a05214b1184 100644 --- a/src/include/catalog/pg_amop.dat +++ b/src/include/catalog/pg_amop.dat @@ -3,7 +3,7 @@ # pg_amop.dat # Initial contents of the pg_amop system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_amop.dat diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h index 4ca7321409bee..570100fad418d 100644 --- a/src/include/catalog/pg_amop.h +++ b/src/include/catalog/pg_amop.h @@ -29,7 +29,7 @@ * intentional denormalization of the catalogs to buy lookup speed. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_amop.h @@ -87,9 +87,12 @@ CATALOG(pg_amop,2602,AccessMethodOperatorRelationId) */ typedef FormData_pg_amop *Form_pg_amop; -DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, AccessMethodStrategyIndexId, on pg_amop using btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops)); -DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, AccessMethodOperatorIndexId, on pg_amop using btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_amop_oid_index, 2756, AccessMethodOperatorOidIndexId, on pg_amop using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, AccessMethodStrategyIndexId, pg_amop, btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops)); +DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, AccessMethodOperatorIndexId, pg_amop, btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_amop_oid_index, 2756, AccessMethodOperatorOidIndexId, pg_amop, btree(oid oid_ops)); + +MAKE_SYSCACHE(AMOPSTRATEGY, pg_amop_fam_strat_index, 64); +MAKE_SYSCACHE(AMOPOPID, pg_amop_opr_fam_index, 64); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/src/include/catalog/pg_amproc.dat b/src/include/catalog/pg_amproc.dat index 5b950129de0aa..f639c3a6a5180 100644 --- a/src/include/catalog/pg_amproc.dat +++ b/src/include/catalog/pg_amproc.dat @@ -3,7 +3,7 @@ # pg_amproc.dat # Initial contents of the pg_amproc system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_amproc.dat @@ -172,8 +172,6 @@ { amprocfamily => 'btree/interval_ops', amproclefttype => 'interval', amprocrighttype => 'interval', amprocnum => '3', amproc => 'in_range(interval,interval,interval,bool,bool)' }, -{ amprocfamily => 'btree/interval_ops', amproclefttype => 'interval', - amprocrighttype => 'interval', amprocnum => '4', amproc => 'btequalimage' }, { amprocfamily => 'btree/macaddr_ops', amproclefttype => 'macaddr', amprocrighttype => 'macaddr', amprocnum => '1', amproc => 'macaddr_cmp' }, { amprocfamily => 'btree/macaddr_ops', amproclefttype => 'macaddr', diff --git a/src/include/catalog/pg_amproc.h b/src/include/catalog/pg_amproc.h index 3307d5c8447af..1dbebeca1752c 100644 --- a/src/include/catalog/pg_amproc.h +++ b/src/include/catalog/pg_amproc.h @@ -18,7 +18,7 @@ * some don't pay attention to non-default functions at all. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_amproc.h @@ -67,7 +67,9 @@ CATALOG(pg_amproc,2603,AccessMethodProcedureRelationId) */ typedef FormData_pg_amproc *Form_pg_amproc; -DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, AccessMethodProcedureIndexId, on pg_amproc using btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, amprocnum int2_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_amproc_oid_index, 2757, AccessMethodProcedureOidIndexId, on pg_amproc using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, AccessMethodProcedureIndexId, pg_amproc, btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, amprocnum int2_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_amproc_oid_index, 2757, AccessMethodProcedureOidIndexId, pg_amproc, btree(oid oid_ops)); + +MAKE_SYSCACHE(AMPROCNUM, pg_amproc_fam_proc_index, 16); #endif /* PG_AMPROC_H */ diff --git a/src/include/catalog/pg_attrdef.h b/src/include/catalog/pg_attrdef.h index 9dc318ff939bf..14f034a3b52e3 100644 --- a/src/include/catalog/pg_attrdef.h +++ b/src/include/catalog/pg_attrdef.h @@ -4,7 +4,7 @@ * definition of the "attribute defaults" system catalog (pg_attrdef) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_attrdef.h @@ -50,8 +50,8 @@ typedef FormData_pg_attrdef *Form_pg_attrdef; DECLARE_TOAST(pg_attrdef, 2830, 2831); -DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index, 2656, AttrDefaultIndexId, on pg_attrdef using btree(adrelid oid_ops, adnum int2_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_attrdef_oid_index, 2657, AttrDefaultOidIndexId, on pg_attrdef using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index, 2656, AttrDefaultIndexId, pg_attrdef, btree(adrelid oid_ops, adnum int2_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_attrdef_oid_index, 2657, AttrDefaultOidIndexId, pg_attrdef, btree(oid oid_ops)); DECLARE_FOREIGN_KEY((adrelid, adnum), pg_attribute, (attrelid, attnum)); diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h index f8b4861b94ab5..1c62b8bfcb58e 100644 --- a/src/include/catalog/pg_attribute.h +++ b/src/include/catalog/pg_attribute.h @@ -8,7 +8,7 @@ * relations need be included. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_attribute.h @@ -158,22 +158,22 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75, /* Number of times inherited from direct parent relation(s) */ int16 attinhcount BKI_DEFAULT(0); + /* attribute's collation, if any */ + Oid attcollation BKI_LOOKUP_OPT(pg_collation); + +#ifdef CATALOG_VARLEN /* variable-length/nullable fields start here */ + /* NOTE: The following fields are not present in tuple descriptors. */ + /* * attstattarget is the target number of statistics datapoints to collect * during VACUUM ANALYZE of this column. A zero here indicates that we do - * not wish to collect any stats about this column. A "-1" here indicates - * that no value has been explicitly set for this column, so ANALYZE - * should use the default setting. + * not wish to collect any stats about this column. A null value here + * indicates that no value has been explicitly set for this column, so + * ANALYZE should use the default setting. * - * int16 is sufficient because the max value is currently 10000. + * int16 is sufficient for the current max value (MAX_STATISTICS_TARGET). */ - int16 attstattarget BKI_DEFAULT(-1); - - /* attribute's collation, if any */ - Oid attcollation BKI_LOOKUP_OPT(pg_collation); - -#ifdef CATALOG_VARLEN /* variable-length fields start here */ - /* NOTE: The following fields are not present in tuple descriptors. */ + int16 attstattarget BKI_DEFAULT(_null_) BKI_FORCE_NULL; /* Column-level access permissions */ aclitem attacl[1] BKI_DEFAULT(_null_); @@ -208,8 +208,25 @@ CATALOG(pg_attribute,1249,AttributeRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(75, */ typedef FormData_pg_attribute *Form_pg_attribute; -DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, AttributeRelidNameIndexId, on pg_attribute using btree(attrelid oid_ops, attname name_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, AttributeRelidNumIndexId, on pg_attribute using btree(attrelid oid_ops, attnum int2_ops)); +/* + * FormExtraData_pg_attribute contains (some of) the fields that are not in + * FormData_pg_attribute because they are excluded by CATALOG_VARLEN. It is + * meant to be used by DDL code so that the combination of + * FormData_pg_attribute (often via tuple descriptor) and + * FormExtraData_pg_attribute can be used to pass around all the information + * about an attribute. Fields can be included here as needed. + */ +typedef struct FormExtraData_pg_attribute +{ + NullableDatum attstattarget; + NullableDatum attoptions; +} FormExtraData_pg_attribute; + +DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, AttributeRelidNameIndexId, pg_attribute, btree(attrelid oid_ops, attname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_attribute_relid_attnum_index, 2659, AttributeRelidNumIndexId, pg_attribute, btree(attrelid oid_ops, attnum int2_ops)); + +MAKE_SYSCACHE(ATTNAME, pg_attribute_relid_attnam_index, 32); +MAKE_SYSCACHE(ATTNUM, pg_attribute_relid_attnum_index, 128); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/src/include/catalog/pg_auth_members.h b/src/include/catalog/pg_auth_members.h index df2b8b29e0d48..5f4b30756ca65 100644 --- a/src/include/catalog/pg_auth_members.h +++ b/src/include/catalog/pg_auth_members.h @@ -5,7 +5,7 @@ * (pg_auth_members). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_auth_members.h @@ -45,9 +45,12 @@ CATALOG(pg_auth_members,1261,AuthMemRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_ */ typedef FormData_pg_auth_members *Form_pg_auth_members; -DECLARE_UNIQUE_INDEX_PKEY(pg_auth_members_oid_index, 6303, AuthMemOidIndexId, on pg_auth_members using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_auth_members_role_member_index, 2694, AuthMemRoleMemIndexId, on pg_auth_members using btree(roleid oid_ops, member oid_ops, grantor oid_ops)); -DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, AuthMemMemRoleIndexId, on pg_auth_members using btree(member oid_ops, roleid oid_ops, grantor oid_ops)); -DECLARE_INDEX(pg_auth_members_grantor_index, 6302, AuthMemGrantorIndexId, on pg_auth_members using btree(grantor oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_auth_members_oid_index, 6303, AuthMemOidIndexId, pg_auth_members, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_auth_members_role_member_index, 2694, AuthMemRoleMemIndexId, pg_auth_members, btree(roleid oid_ops, member oid_ops, grantor oid_ops)); +DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, AuthMemMemRoleIndexId, pg_auth_members, btree(member oid_ops, roleid oid_ops, grantor oid_ops)); +DECLARE_INDEX(pg_auth_members_grantor_index, 6302, AuthMemGrantorIndexId, pg_auth_members, btree(grantor oid_ops)); + +MAKE_SYSCACHE(AUTHMEMROLEMEM, pg_auth_members_role_member_index, 8); +MAKE_SYSCACHE(AUTHMEMMEMROLE, pg_auth_members_member_role_index, 8); #endif /* PG_AUTH_MEMBERS_H */ diff --git a/src/include/catalog/pg_authid.dat b/src/include/catalog/pg_authid.dat index 1d7e00b2fddef..bf00815c14e47 100644 --- a/src/include/catalog/pg_authid.dat +++ b/src/include/catalog/pg_authid.dat @@ -3,7 +3,7 @@ # pg_authid.dat # Initial contents of the pg_authid system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_authid.dat @@ -84,7 +84,7 @@ rolcreaterole => 'f', rolcreatedb => 'f', rolcanlogin => 'f', rolreplication => 'f', rolbypassrls => 'f', rolconnlimit => '-1', rolpassword => '_null_', rolvaliduntil => '_null_' }, -{ oid => '4549', oid_symbol => 'ROLE_PG_MAINTAIN', +{ oid => '6337', oid_symbol => 'ROLE_PG_MAINTAIN', rolname => 'pg_maintain', rolsuper => 'f', rolinherit => 't', rolcreaterole => 'f', rolcreatedb => 'f', rolcanlogin => 'f', rolreplication => 'f', rolbypassrls => 'f', rolconnlimit => '-1', diff --git a/src/include/catalog/pg_authid.h b/src/include/catalog/pg_authid.h index c70baf7887c15..e08863f78abde 100644 --- a/src/include/catalog/pg_authid.h +++ b/src/include/catalog/pg_authid.h @@ -6,7 +6,7 @@ * pg_shadow and pg_group are now publicly accessible views on pg_authid. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_authid.h @@ -57,7 +57,10 @@ typedef FormData_pg_authid *Form_pg_authid; DECLARE_TOAST_WITH_MACRO(pg_authid, 4175, 4176, PgAuthidToastTable, PgAuthidToastIndex); -DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, AuthIdRolnameIndexId, on pg_authid using btree(rolname name_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, AuthIdOidIndexId, on pg_authid using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, AuthIdRolnameIndexId, pg_authid, btree(rolname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_authid_oid_index, 2677, AuthIdOidIndexId, pg_authid, btree(oid oid_ops)); + +MAKE_SYSCACHE(AUTHNAME, pg_authid_rolname_index, 8); +MAKE_SYSCACHE(AUTHOID, pg_authid_oid_index, 8); #endif /* PG_AUTHID_H */ diff --git a/src/include/catalog/pg_cast.dat b/src/include/catalog/pg_cast.dat index fb3a7b3f3b442..ca7b6d7191f97 100644 --- a/src/include/catalog/pg_cast.dat +++ b/src/include/catalog/pg_cast.dat @@ -3,7 +3,7 @@ # pg_cast.dat # Initial contents of the pg_cast system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_cast.dat diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h index 9ec2b5785b8a6..6c995509bc388 100644 --- a/src/include/catalog/pg_cast.h +++ b/src/include/catalog/pg_cast.h @@ -6,7 +6,7 @@ * As of Postgres 8.0, pg_cast describes not only type coercion functions * but also length coercion functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_cast.h @@ -56,8 +56,10 @@ CATALOG(pg_cast,2605,CastRelationId) */ typedef FormData_pg_cast *Form_pg_cast; -DECLARE_UNIQUE_INDEX_PKEY(pg_cast_oid_index, 2660, CastOidIndexId, on pg_cast using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, CastSourceTargetIndexId, on pg_cast using btree(castsource oid_ops, casttarget oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_cast_oid_index, 2660, CastOidIndexId, pg_cast, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, CastSourceTargetIndexId, pg_cast, btree(castsource oid_ops, casttarget oid_ops)); + +MAKE_SYSCACHE(CASTSOURCETARGET, pg_cast_source_target_index, 256); #ifdef EXPOSE_TO_CLIENT_CODE @@ -74,8 +76,8 @@ typedef enum CoercionCodes { COERCION_CODE_IMPLICIT = 'i', /* coercion in context of expression */ COERCION_CODE_ASSIGNMENT = 'a', /* coercion in context of assignment */ - COERCION_CODE_EXPLICIT = 'e' /* explicit cast operation */ -} CoercionCodes; + COERCION_CODE_EXPLICIT = 'e', /* explicit cast operation */ +} CoercionCodes; /* * The allowable values for pg_cast.castmethod are specified by this enum. @@ -86,8 +88,8 @@ typedef enum CoercionMethod { COERCION_METHOD_FUNCTION = 'f', /* use a function */ COERCION_METHOD_BINARY = 'b', /* types are binary-compatible */ - COERCION_METHOD_INOUT = 'i' /* use input/output functions */ -} CoercionMethod; + COERCION_METHOD_INOUT = 'i', /* use input/output functions */ +} CoercionMethod; #endif /* EXPOSE_TO_CLIENT_CODE */ diff --git a/src/include/catalog/pg_class.dat b/src/include/catalog/pg_class.dat index 17c25267b04de..830e7e425bb08 100644 --- a/src/include/catalog/pg_class.dat +++ b/src/include/catalog/pg_class.dat @@ -3,7 +3,7 @@ # pg_class.dat # Initial contents of the pg_class system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_class.dat diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h index 2d1bb7af3a919..0fc2c093b0d4e 100644 --- a/src/include/catalog/pg_class.h +++ b/src/include/catalog/pg_class.h @@ -4,7 +4,7 @@ * definition of the "relation" system catalog (pg_class) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_class.h @@ -152,9 +152,12 @@ CATALOG(pg_class,1259,RelationRelationId) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83,Relat */ typedef FormData_pg_class *Form_pg_class; -DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, ClassOidIndexId, on pg_class using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, ClassNameNspIndexId, on pg_class using btree(relname name_ops, relnamespace oid_ops)); -DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, ClassTblspcRelfilenodeIndexId, on pg_class using btree(reltablespace oid_ops, relfilenode oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_class_oid_index, 2662, ClassOidIndexId, pg_class, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, ClassNameNspIndexId, pg_class, btree(relname name_ops, relnamespace oid_ops)); +DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, ClassTblspcRelfilenodeIndexId, pg_class, btree(reltablespace oid_ops, relfilenode oid_ops)); + +MAKE_SYSCACHE(RELOID, pg_class_oid_index, 128); +MAKE_SYSCACHE(RELNAMENSP, pg_class_relname_nsp_index, 128); #ifdef EXPOSE_TO_CLIENT_CODE @@ -216,7 +219,9 @@ DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, ClassTblspcRelfilenodeInd /* * Relation kinds with a table access method (rd_tableam). Although sequences * use the heap table AM, they are enough of a special case in most uses that - * they are not included here. + * they are not included here. Likewise, partitioned tables can have an access + * method defined so that their partitions can inherit it, but they do not set + * rd_tableam; hence, this is handled specially outside of this macro. */ #define RELKIND_HAS_TABLE_AM(relkind) \ ((relkind) == RELKIND_RELATION || \ diff --git a/src/include/catalog/pg_collation.dat b/src/include/catalog/pg_collation.dat index b6a69d1d42041..f126201276071 100644 --- a/src/include/catalog/pg_collation.dat +++ b/src/include/catalog/pg_collation.dat @@ -3,7 +3,7 @@ # pg_collation.dat # Initial contents of the pg_collation system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_collation.dat @@ -23,12 +23,16 @@ descr => 'standard POSIX collation', collname => 'POSIX', collprovider => 'c', collencoding => '-1', collcollate => 'POSIX', collctype => 'POSIX' }, -{ oid => '962', descr => 'sorts by Unicode code point', - collname => 'ucs_basic', collprovider => 'c', collencoding => '6', - collcollate => 'C', collctype => 'C' }, +{ oid => '962', descr => 'sorts by Unicode code point, C character semantics', + collname => 'ucs_basic', collprovider => 'b', collencoding => '6', + colllocale => 'C', collversion => '1' }, { oid => '963', descr => 'sorts using the Unicode Collation Algorithm with default settings', collname => 'unicode', collprovider => 'i', collencoding => '-1', - colliculocale => 'und' }, + colllocale => 'und' }, +{ oid => '811', + descr => 'sorts by Unicode code point; Unicode and POSIX character semantics', + collname => 'pg_c_utf8', collprovider => 'b', collencoding => '6', + colllocale => 'C.UTF-8', collversion => '1' }, ] diff --git a/src/include/catalog/pg_collation.h b/src/include/catalog/pg_collation.h index bfa3568451562..5ce289d74bd0e 100644 --- a/src/include/catalog/pg_collation.h +++ b/src/include/catalog/pg_collation.h @@ -4,7 +4,7 @@ * definition of the "collation" system catalog (pg_collation) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_collation.h @@ -42,7 +42,7 @@ CATALOG(pg_collation,3456,CollationRelationId) #ifdef CATALOG_VARLEN /* variable-length fields start here */ text collcollate BKI_DEFAULT(_null_); /* LC_COLLATE setting */ text collctype BKI_DEFAULT(_null_); /* LC_CTYPE setting */ - text colliculocale BKI_DEFAULT(_null_); /* ICU locale ID */ + text colllocale BKI_DEFAULT(_null_); /* locale ID */ text collicurules BKI_DEFAULT(_null_); /* ICU collation rules */ text collversion BKI_DEFAULT(_null_); /* provider-dependent * version of collation @@ -59,12 +59,16 @@ typedef FormData_pg_collation *Form_pg_collation; DECLARE_TOAST(pg_collation, 6175, 6176); -DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, CollationNameEncNspIndexId, on pg_collation using btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, CollationOidIndexId, on pg_collation using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, CollationNameEncNspIndexId, pg_collation, btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_collation_oid_index, 3085, CollationOidIndexId, pg_collation, btree(oid oid_ops)); + +MAKE_SYSCACHE(COLLNAMEENCNSP, pg_collation_name_enc_nsp_index, 8); +MAKE_SYSCACHE(COLLOID, pg_collation_oid_index, 8); #ifdef EXPOSE_TO_CLIENT_CODE #define COLLPROVIDER_DEFAULT 'd' +#define COLLPROVIDER_BUILTIN 'b' #define COLLPROVIDER_ICU 'i' #define COLLPROVIDER_LIBC 'c' @@ -73,6 +77,8 @@ collprovider_name(char c) { switch (c) { + case COLLPROVIDER_BUILTIN: + return "builtin"; case COLLPROVIDER_ICU: return "icu"; case COLLPROVIDER_LIBC: @@ -91,7 +97,7 @@ extern Oid CollationCreate(const char *collname, Oid collnamespace, bool collisdeterministic, int32 collencoding, const char *collcollate, const char *collctype, - const char *colliculocale, + const char *colllocale, const char *collicurules, const char *collversion, bool if_not_exists, diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h index 16bf5f5576e26..7a8017f15b5df 100644 --- a/src/include/catalog/pg_constraint.h +++ b/src/include/catalog/pg_constraint.h @@ -4,7 +4,7 @@ * definition of the "constraint" system catalog (pg_constraint) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_constraint.h @@ -166,11 +166,13 @@ typedef FormData_pg_constraint *Form_pg_constraint; DECLARE_TOAST(pg_constraint, 2832, 2833); -DECLARE_INDEX(pg_constraint_conname_nsp_index, 2664, ConstraintNameNspIndexId, on pg_constraint using btree(conname name_ops, connamespace oid_ops)); -DECLARE_UNIQUE_INDEX(pg_constraint_conrelid_contypid_conname_index, 2665, ConstraintRelidTypidNameIndexId, on pg_constraint using btree(conrelid oid_ops, contypid oid_ops, conname name_ops)); -DECLARE_INDEX(pg_constraint_contypid_index, 2666, ConstraintTypidIndexId, on pg_constraint using btree(contypid oid_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, ConstraintOidIndexId, on pg_constraint using btree(oid oid_ops)); -DECLARE_INDEX(pg_constraint_conparentid_index, 2579, ConstraintParentIndexId, on pg_constraint using btree(conparentid oid_ops)); +DECLARE_INDEX(pg_constraint_conname_nsp_index, 2664, ConstraintNameNspIndexId, pg_constraint, btree(conname name_ops, connamespace oid_ops)); +DECLARE_UNIQUE_INDEX(pg_constraint_conrelid_contypid_conname_index, 2665, ConstraintRelidTypidNameIndexId, pg_constraint, btree(conrelid oid_ops, contypid oid_ops, conname name_ops)); +DECLARE_INDEX(pg_constraint_contypid_index, 2666, ConstraintTypidIndexId, pg_constraint, btree(contypid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_constraint_oid_index, 2667, ConstraintOidIndexId, pg_constraint, btree(oid oid_ops)); +DECLARE_INDEX(pg_constraint_conparentid_index, 2579, ConstraintParentIndexId, pg_constraint, btree(conparentid oid_ops)); + +MAKE_SYSCACHE(CONSTROID, pg_constraint_oid_index, 16); /* conkey can contain zero (InvalidAttrNumber) if a whole-row Var is used */ DECLARE_ARRAY_FOREIGN_KEY_OPT((conrelid, conkey), pg_attribute, (attrelid, attnum)); @@ -181,6 +183,7 @@ DECLARE_ARRAY_FOREIGN_KEY((confrelid, confkey), pg_attribute, (attrelid, attnum) /* Valid values for contype */ #define CONSTRAINT_CHECK 'c' #define CONSTRAINT_FOREIGN 'f' +#define CONSTRAINT_NOTNULL 'n' #define CONSTRAINT_PRIMARY 'p' #define CONSTRAINT_UNIQUE 'u' #define CONSTRAINT_TRIGGER 't' @@ -201,7 +204,7 @@ typedef enum ConstraintCategory { CONSTRAINT_RELATION, CONSTRAINT_DOMAIN, - CONSTRAINT_ASSERTION /* for future expansion */ + CONSTRAINT_ASSERTION, /* for future expansion */ } ConstraintCategory; @@ -237,9 +240,6 @@ extern Oid CreateConstraintEntry(const char *constraintName, bool conNoInherit, bool is_internal); -extern void RemoveConstraintById(Oid conId); -extern void RenameConstraintById(Oid conId, const char *newname); - extern bool ConstraintNameIsUsed(ConstraintCategory conCat, Oid objId, const char *conname); extern bool ConstraintNameExists(const char *conname, Oid namespaceid); @@ -247,6 +247,11 @@ extern char *ChooseConstraintName(const char *name1, const char *name2, const char *label, Oid namespaceid, List *others); +extern HeapTuple findDomainNotNullConstraint(Oid typid); + +extern void RemoveConstraintById(Oid conId); +extern void RenameConstraintById(Oid conId, const char *newname); + extern void AlterConstraintNamespaces(Oid ownerId, Oid oldNspId, Oid newNspId, bool isType, ObjectAddresses *objsMoved); extern void ConstraintSetParentConstraint(Oid childConstrId, diff --git a/src/include/catalog/pg_control.h b/src/include/catalog/pg_control.h index dc953977c5df1..e80ff8e4140a8 100644 --- a/src/include/catalog/pg_control.h +++ b/src/include/catalog/pg_control.h @@ -5,7 +5,7 @@ * However, we define it here so that the format is documented. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_control.h @@ -22,7 +22,7 @@ /* Version identifier for this pg_control format */ -#define PG_CONTROL_VERSION 1300 +#define PG_CONTROL_VERSION 1700 /* Nonce key length, see below */ #define MOCK_AUTH_NONCE_LEN 32 @@ -40,6 +40,7 @@ typedef struct CheckPoint TimeLineID PrevTimeLineID; /* previous TLI, if this record begins a new * timeline (equals ThisTimeLineID otherwise) */ bool fullPageWrites; /* current full_page_writes */ + int wal_level; /* current wal_level */ FullTransactionId nextXid; /* next free transaction ID */ Oid nextOid; /* next free OID */ MultiXactId nextMulti; /* next free MultiXactId */ @@ -78,6 +79,7 @@ typedef struct CheckPoint #define XLOG_FPI 0xB0 /* 0xC0 is used in Postgres 9.5-11 */ #define XLOG_OVERWRITE_CONTRECORD 0xD0 +#define XLOG_CHECKPOINT_REDO 0xE0 /* @@ -92,7 +94,7 @@ typedef enum DBState DB_SHUTDOWNING, DB_IN_CRASH_RECOVERY, DB_IN_ARCHIVE_RECOVERY, - DB_IN_PRODUCTION + DB_IN_PRODUCTION, } DBState; /* diff --git a/src/include/catalog/pg_conversion.dat b/src/include/catalog/pg_conversion.dat index 0c33d9659c737..145c4cc07db7f 100644 --- a/src/include/catalog/pg_conversion.dat +++ b/src/include/catalog/pg_conversion.dat @@ -3,7 +3,7 @@ # pg_conversion.dat # Initial contents of the pg_conversion system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_conversion.dat diff --git a/src/include/catalog/pg_conversion.h b/src/include/catalog/pg_conversion.h index de40909dd3e89..d94f022967256 100644 --- a/src/include/catalog/pg_conversion.h +++ b/src/include/catalog/pg_conversion.h @@ -3,7 +3,7 @@ * pg_conversion.h * definition of the "conversion" system catalog (pg_conversion) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_conversion.h @@ -60,9 +60,13 @@ CATALOG(pg_conversion,2607,ConversionRelationId) */ typedef FormData_pg_conversion *Form_pg_conversion; -DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, ConversionDefaultIndexId, on pg_conversion using btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, ConversionNameNspIndexId, on pg_conversion using btree(conname name_ops, connamespace oid_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_conversion_oid_index, 2670, ConversionOidIndexId, on pg_conversion using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, ConversionDefaultIndexId, pg_conversion, btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, ConversionNameNspIndexId, pg_conversion, btree(conname name_ops, connamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_conversion_oid_index, 2670, ConversionOidIndexId, pg_conversion, btree(oid oid_ops)); + +MAKE_SYSCACHE(CONDEFAULT, pg_conversion_default_index, 8); +MAKE_SYSCACHE(CONNAMENSP, pg_conversion_name_nsp_index, 8); +MAKE_SYSCACHE(CONVOID, pg_conversion_oid_index, 8); extern ObjectAddress ConversionCreate(const char *conname, Oid connamespace, diff --git a/src/include/catalog/pg_database.dat b/src/include/catalog/pg_database.dat index 0754ef1bce409..d134d52bb0fe5 100644 --- a/src/include/catalog/pg_database.dat +++ b/src/include/catalog/pg_database.dat @@ -3,7 +3,7 @@ # pg_database.dat # Initial contents of the pg_database system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_database.dat @@ -16,9 +16,9 @@ descr => 'default template for new databases', datname => 'template1', encoding => 'ENCODING', datlocprovider => 'LOCALE_PROVIDER', datistemplate => 't', - datallowconn => 't', datconnlimit => '-1', datfrozenxid => '0', - datminmxid => '1', dattablespace => 'pg_default', datcollate => 'LC_COLLATE', - datctype => 'LC_CTYPE', daticulocale => 'ICU_LOCALE', + datallowconn => 't', dathasloginevt => 'f', datconnlimit => '-1', + datfrozenxid => '0', datminmxid => '1', dattablespace => 'pg_default', + datcollate => 'LC_COLLATE', datctype => 'LC_CTYPE', datlocale => 'DATLOCALE', daticurules => 'ICU_RULES', datacl => '_null_' }, ] diff --git a/src/include/catalog/pg_database.h b/src/include/catalog/pg_database.h index d004f4dc8aacd..dbd4379ffa5b7 100644 --- a/src/include/catalog/pg_database.h +++ b/src/include/catalog/pg_database.h @@ -4,7 +4,7 @@ * definition of the "database" system catalog (pg_database) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_database.h @@ -49,7 +49,13 @@ CATALOG(pg_database,1262,DatabaseRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID /* new connections allowed? */ bool datallowconn; - /* max connections allowed (-1=no limit) */ + /* database has login event triggers? */ + bool dathasloginevt; + + /* + * Max connections allowed. Negative values have special meaning, see + * DATCONNLIMIT_* defines below. + */ int32 datconnlimit; /* all Xids < this are frozen in this DB */ @@ -69,7 +75,7 @@ CATALOG(pg_database,1262,DatabaseRelationId) BKI_SHARED_RELATION BKI_ROWTYPE_OID text datctype BKI_FORCE_NOT_NULL; /* ICU locale ID */ - text daticulocale; + text datlocale; /* ICU collation rules */ text daticurules; @@ -91,8 +97,10 @@ typedef FormData_pg_database *Form_pg_database; DECLARE_TOAST_WITH_MACRO(pg_database, 4177, 4178, PgDatabaseToastTable, PgDatabaseToastIndex); -DECLARE_UNIQUE_INDEX(pg_database_datname_index, 2671, DatabaseNameIndexId, on pg_database using btree(datname name_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, on pg_database using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_database_datname_index, 2671, DatabaseNameIndexId, pg_database, btree(datname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, pg_database, btree(oid oid_ops)); + +MAKE_SYSCACHE(DATABASEOID, pg_database_oid_index, 4); /* * pg_database.dat contains an entry for template1, but not for the template0 @@ -103,4 +111,19 @@ DECLARE_UNIQUE_INDEX_PKEY(pg_database_oid_index, 2672, DatabaseOidIndexId, on pg DECLARE_OID_DEFINING_MACRO(Template0DbOid, 4); DECLARE_OID_DEFINING_MACRO(PostgresDbOid, 5); +/* + * Special values for pg_database.datconnlimit. Normal values are >= 0. + */ +#define DATCONNLIMIT_UNLIMITED -1 /* no limit */ + +/* + * A database is set to invalid partway through being dropped. Using + * datconnlimit=-2 for this purpose isn't particularly clean, but is + * backpatchable. + */ +#define DATCONNLIMIT_INVALID_DB -2 + +extern bool database_is_invalid_form(Form_pg_database datform); +extern bool database_is_invalid_oid(Oid dboid); + #endif /* PG_DATABASE_H */ diff --git a/src/include/catalog/pg_db_role_setting.h b/src/include/catalog/pg_db_role_setting.h index 4ba0d69e76295..7e1a652381f9a 100644 --- a/src/include/catalog/pg_db_role_setting.h +++ b/src/include/catalog/pg_db_role_setting.h @@ -5,7 +5,7 @@ * configuration settings (pg_db_role_setting) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_db_role_setting.h @@ -48,7 +48,7 @@ typedef FormData_pg_db_role_setting * Form_pg_db_role_setting; DECLARE_TOAST_WITH_MACRO(pg_db_role_setting, 2966, 2967, PgDbRoleSettingToastTable, PgDbRoleSettingToastIndex); -DECLARE_UNIQUE_INDEX_PKEY(pg_db_role_setting_databaseid_rol_index, 2965, DbRoleSettingDatidRolidIndexId, on pg_db_role_setting using btree(setdatabase oid_ops, setrole oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_db_role_setting_databaseid_rol_index, 2965, DbRoleSettingDatidRolidIndexId, pg_db_role_setting, btree(setdatabase oid_ops, setrole oid_ops)); /* * prototypes for functions in pg_db_role_setting.c diff --git a/src/include/catalog/pg_default_acl.h b/src/include/catalog/pg_default_acl.h index d6d0a03f0ce04..d272cdf08b476 100644 --- a/src/include/catalog/pg_default_acl.h +++ b/src/include/catalog/pg_default_acl.h @@ -5,7 +5,7 @@ * (pg_default_acl) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_default_acl.h @@ -51,8 +51,10 @@ typedef FormData_pg_default_acl *Form_pg_default_acl; DECLARE_TOAST(pg_default_acl, 4143, 4144); -DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, DefaultAclRoleNspObjIndexId, on pg_default_acl using btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype char_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_default_acl_oid_index, 828, DefaultAclOidIndexId, on pg_default_acl using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, DefaultAclRoleNspObjIndexId, pg_default_acl, btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype char_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_default_acl_oid_index, 828, DefaultAclOidIndexId, pg_default_acl, btree(oid oid_ops)); + +MAKE_SYSCACHE(DEFACLROLENSPOBJ, pg_default_acl_role_nsp_obj_index, 8); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h index 30dde6f8aa2e0..eb1ee43b012eb 100644 --- a/src/include/catalog/pg_depend.h +++ b/src/include/catalog/pg_depend.h @@ -17,7 +17,7 @@ * convenient to find from the contents of other catalogs. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_depend.h @@ -71,7 +71,7 @@ CATALOG(pg_depend,2608,DependRelationId) */ typedef FormData_pg_depend *Form_pg_depend; -DECLARE_INDEX(pg_depend_depender_index, 2673, DependDependerIndexId, on pg_depend using btree(classid oid_ops, objid oid_ops, objsubid int4_ops)); -DECLARE_INDEX(pg_depend_reference_index, 2674, DependReferenceIndexId, on pg_depend using btree(refclassid oid_ops, refobjid oid_ops, refobjsubid int4_ops)); +DECLARE_INDEX(pg_depend_depender_index, 2673, DependDependerIndexId, pg_depend, btree(classid oid_ops, objid oid_ops, objsubid int4_ops)); +DECLARE_INDEX(pg_depend_reference_index, 2674, DependReferenceIndexId, pg_depend, btree(refclassid oid_ops, refobjid oid_ops, refobjsubid int4_ops)); #endif /* PG_DEPEND_H */ diff --git a/src/include/catalog/pg_description.h b/src/include/catalog/pg_description.h index 7545b92a159fc..e30a6976beb04 100644 --- a/src/include/catalog/pg_description.h +++ b/src/include/catalog/pg_description.h @@ -23,7 +23,7 @@ * for example). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_description.h @@ -65,7 +65,7 @@ typedef FormData_pg_description * Form_pg_description; DECLARE_TOAST(pg_description, 2834, 2835); -DECLARE_UNIQUE_INDEX_PKEY(pg_description_o_c_o_index, 2675, DescriptionObjIndexId, on pg_description using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_description_o_c_o_index, 2675, DescriptionObjIndexId, pg_description, btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops)); /* We do not use BKI_LOOKUP here because it causes problems for genbki.pl */ DECLARE_FOREIGN_KEY((classoid), pg_class, (oid)); diff --git a/src/include/catalog/pg_enum.h b/src/include/catalog/pg_enum.h index 83a06682336ee..4d9a241d34890 100644 --- a/src/include/catalog/pg_enum.h +++ b/src/include/catalog/pg_enum.h @@ -4,7 +4,7 @@ * definition of the "enum" system catalog (pg_enum) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_enum.h @@ -43,9 +43,12 @@ CATALOG(pg_enum,3501,EnumRelationId) */ typedef FormData_pg_enum *Form_pg_enum; -DECLARE_UNIQUE_INDEX_PKEY(pg_enum_oid_index, 3502, EnumOidIndexId, on pg_enum using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, EnumTypIdLabelIndexId, on pg_enum using btree(enumtypid oid_ops, enumlabel name_ops)); -DECLARE_UNIQUE_INDEX(pg_enum_typid_sortorder_index, 3534, EnumTypIdSortOrderIndexId, on pg_enum using btree(enumtypid oid_ops, enumsortorder float4_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_enum_oid_index, 3502, EnumOidIndexId, pg_enum, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, EnumTypIdLabelIndexId, pg_enum, btree(enumtypid oid_ops, enumlabel name_ops)); +DECLARE_UNIQUE_INDEX(pg_enum_typid_sortorder_index, 3534, EnumTypIdSortOrderIndexId, pg_enum, btree(enumtypid oid_ops, enumsortorder float4_ops)); + +MAKE_SYSCACHE(ENUMOID, pg_enum_oid_index, 8); +MAKE_SYSCACHE(ENUMTYPOIDNAME, pg_enum_typid_label_index, 8); /* * prototypes for functions in pg_enum.c diff --git a/src/include/catalog/pg_event_trigger.h b/src/include/catalog/pg_event_trigger.h index e30550f6e1589..9170a4ddfe80f 100644 --- a/src/include/catalog/pg_event_trigger.h +++ b/src/include/catalog/pg_event_trigger.h @@ -4,7 +4,7 @@ * definition of the "event trigger" system catalog (pg_event_trigger) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_event_trigger.h @@ -51,7 +51,10 @@ typedef FormData_pg_event_trigger *Form_pg_event_trigger; DECLARE_TOAST(pg_event_trigger, 4145, 4146); -DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, EventTriggerNameIndexId, on pg_event_trigger using btree(evtname name_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_event_trigger_oid_index, 3468, EventTriggerOidIndexId, on pg_event_trigger using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, EventTriggerNameIndexId, pg_event_trigger, btree(evtname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_event_trigger_oid_index, 3468, EventTriggerOidIndexId, pg_event_trigger, btree(oid oid_ops)); + +MAKE_SYSCACHE(EVENTTRIGGERNAME, pg_event_trigger_evtname_index, 8); +MAKE_SYSCACHE(EVENTTRIGGEROID, pg_event_trigger_oid_index, 8); #endif /* PG_EVENT_TRIGGER_H */ diff --git a/src/include/catalog/pg_extension.h b/src/include/catalog/pg_extension.h index 799c8ed9d098e..cdfacc0930364 100644 --- a/src/include/catalog/pg_extension.h +++ b/src/include/catalog/pg_extension.h @@ -4,7 +4,7 @@ * definition of the "extension" system catalog (pg_extension) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_extension.h @@ -53,7 +53,7 @@ typedef FormData_pg_extension *Form_pg_extension; DECLARE_TOAST(pg_extension, 4147, 4148); -DECLARE_UNIQUE_INDEX_PKEY(pg_extension_oid_index, 3080, ExtensionOidIndexId, on pg_extension using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_extension_name_index, 3081, ExtensionNameIndexId, on pg_extension using btree(extname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_extension_oid_index, 3080, ExtensionOidIndexId, pg_extension, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_extension_name_index, 3081, ExtensionNameIndexId, pg_extension, btree(extname name_ops)); #endif /* PG_EXTENSION_H */ diff --git a/src/include/catalog/pg_foreign_data_wrapper.h b/src/include/catalog/pg_foreign_data_wrapper.h index e7833ec8832f2..0d8759d3fd385 100644 --- a/src/include/catalog/pg_foreign_data_wrapper.h +++ b/src/include/catalog/pg_foreign_data_wrapper.h @@ -4,7 +4,7 @@ * definition of the "foreign-data wrapper" system catalog (pg_foreign_data_wrapper) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_foreign_data_wrapper.h @@ -52,7 +52,10 @@ typedef FormData_pg_foreign_data_wrapper *Form_pg_foreign_data_wrapper; DECLARE_TOAST(pg_foreign_data_wrapper, 4149, 4150); -DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_data_wrapper_oid_index, 112, ForeignDataWrapperOidIndexId, on pg_foreign_data_wrapper using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, ForeignDataWrapperNameIndexId, on pg_foreign_data_wrapper using btree(fdwname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_data_wrapper_oid_index, 112, ForeignDataWrapperOidIndexId, pg_foreign_data_wrapper, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, ForeignDataWrapperNameIndexId, pg_foreign_data_wrapper, btree(fdwname name_ops)); + +MAKE_SYSCACHE(FOREIGNDATAWRAPPEROID, pg_foreign_data_wrapper_oid_index, 2); +MAKE_SYSCACHE(FOREIGNDATAWRAPPERNAME, pg_foreign_data_wrapper_name_index, 2); #endif /* PG_FOREIGN_DATA_WRAPPER_H */ diff --git a/src/include/catalog/pg_foreign_server.h b/src/include/catalog/pg_foreign_server.h index 2a14871d742a0..a4b81936b0954 100644 --- a/src/include/catalog/pg_foreign_server.h +++ b/src/include/catalog/pg_foreign_server.h @@ -3,7 +3,7 @@ * pg_foreign_server.h * definition of the "foreign server" system catalog (pg_foreign_server) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_foreign_server.h @@ -49,7 +49,10 @@ typedef FormData_pg_foreign_server *Form_pg_foreign_server; DECLARE_TOAST(pg_foreign_server, 4151, 4152); -DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_server_oid_index, 113, ForeignServerOidIndexId, on pg_foreign_server using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, ForeignServerNameIndexId, on pg_foreign_server using btree(srvname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_server_oid_index, 113, ForeignServerOidIndexId, pg_foreign_server, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, ForeignServerNameIndexId, pg_foreign_server, btree(srvname name_ops)); + +MAKE_SYSCACHE(FOREIGNSERVEROID, pg_foreign_server_oid_index, 2); +MAKE_SYSCACHE(FOREIGNSERVERNAME, pg_foreign_server_name_index, 2); #endif /* PG_FOREIGN_SERVER_H */ diff --git a/src/include/catalog/pg_foreign_table.h b/src/include/catalog/pg_foreign_table.h index cfa570a88c761..d17ff0e76e18b 100644 --- a/src/include/catalog/pg_foreign_table.h +++ b/src/include/catalog/pg_foreign_table.h @@ -3,7 +3,7 @@ * pg_foreign_table.h * definition of the "foreign table" system catalog (pg_foreign_table) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_foreign_table.h @@ -44,6 +44,8 @@ typedef FormData_pg_foreign_table *Form_pg_foreign_table; DECLARE_TOAST(pg_foreign_table, 4153, 4154); -DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_table_relid_index, 3119, ForeignTableRelidIndexId, on pg_foreign_table using btree(ftrelid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_foreign_table_relid_index, 3119, ForeignTableRelidIndexId, pg_foreign_table, btree(ftrelid oid_ops)); + +MAKE_SYSCACHE(FOREIGNTABLEREL, pg_foreign_table_relid_index, 4); #endif /* PG_FOREIGN_TABLE_H */ diff --git a/src/include/catalog/pg_index.h b/src/include/catalog/pg_index.h index b0592571dae0f..3462572eb55bb 100644 --- a/src/include/catalog/pg_index.h +++ b/src/include/catalog/pg_index.h @@ -4,7 +4,7 @@ * definition of the "index" system catalog (pg_index) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_index.h @@ -69,8 +69,10 @@ CATALOG(pg_index,2610,IndexRelationId) BKI_SCHEMA_MACRO */ typedef FormData_pg_index *Form_pg_index; -DECLARE_INDEX(pg_index_indrelid_index, 2678, IndexIndrelidIndexId, on pg_index using btree(indrelid oid_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, IndexRelidIndexId, on pg_index using btree(indexrelid oid_ops)); +DECLARE_INDEX(pg_index_indrelid_index, 2678, IndexIndrelidIndexId, pg_index, btree(indrelid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_index_indexrelid_index, 2679, IndexRelidIndexId, pg_index, btree(indexrelid oid_ops)); + +MAKE_SYSCACHE(INDEXRELID, pg_index_indexrelid_index, 64); /* indkey can contain zero (InvalidAttrNumber) to represent expressions */ DECLARE_ARRAY_FOREIGN_KEY_OPT((indrelid, indkey), pg_attribute, (attrelid, attnum)); diff --git a/src/include/catalog/pg_inherits.h b/src/include/catalog/pg_inherits.h index ce154ab943bbe..b3da78c24bd6b 100644 --- a/src/include/catalog/pg_inherits.h +++ b/src/include/catalog/pg_inherits.h @@ -4,7 +4,7 @@ * definition of the "inherits" system catalog (pg_inherits) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_inherits.h @@ -44,8 +44,8 @@ CATALOG(pg_inherits,2611,InheritsRelationId) */ typedef FormData_pg_inherits *Form_pg_inherits; -DECLARE_UNIQUE_INDEX_PKEY(pg_inherits_relid_seqno_index, 2680, InheritsRelidSeqnoIndexId, on pg_inherits using btree(inhrelid oid_ops, inhseqno int4_ops)); -DECLARE_INDEX(pg_inherits_parent_index, 2187, InheritsParentIndexId, on pg_inherits using btree(inhparent oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_inherits_relid_seqno_index, 2680, InheritsRelidSeqnoIndexId, pg_inherits, btree(inhrelid oid_ops, inhseqno int4_ops)); +DECLARE_INDEX(pg_inherits_parent_index, 2187, InheritsParentIndexId, pg_inherits, btree(inhparent oid_ops)); extern List *find_inheritance_children(Oid parentrelId, LOCKMODE lockmode); diff --git a/src/include/catalog/pg_init_privs.h b/src/include/catalog/pg_init_privs.h index 34fe2b4d0e319..ecd5d0812b7c5 100644 --- a/src/include/catalog/pg_init_privs.h +++ b/src/include/catalog/pg_init_privs.h @@ -21,7 +21,7 @@ * are loaded near the end of initdb. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_init_privs.h @@ -65,7 +65,7 @@ typedef FormData_pg_init_privs * Form_pg_init_privs; DECLARE_TOAST(pg_init_privs, 4155, 4156); -DECLARE_UNIQUE_INDEX_PKEY(pg_init_privs_o_c_o_index, 3395, InitPrivsObjIndexId, on pg_init_privs using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_init_privs_o_c_o_index, 3395, InitPrivsObjIndexId, pg_init_privs, btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops)); /* * It is important to know if the initial privileges are from initdb or from an @@ -77,7 +77,7 @@ DECLARE_UNIQUE_INDEX_PKEY(pg_init_privs_o_c_o_index, 3395, InitPrivsObjIndexId, typedef enum InitPrivsType { INITPRIVS_INITDB = 'i', - INITPRIVS_EXTENSION = 'e' -} InitPrivsType; + INITPRIVS_EXTENSION = 'e', +} InitPrivsType; #endif /* PG_INIT_PRIVS_H */ diff --git a/src/include/catalog/pg_language.dat b/src/include/catalog/pg_language.dat index b02431abf5024..04c1c738c263b 100644 --- a/src/include/catalog/pg_language.dat +++ b/src/include/catalog/pg_language.dat @@ -3,7 +3,7 @@ # pg_language.dat # Initial contents of the pg_language system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_language.dat diff --git a/src/include/catalog/pg_language.h b/src/include/catalog/pg_language.h index 02003b4627609..7256908a95c8a 100644 --- a/src/include/catalog/pg_language.h +++ b/src/include/catalog/pg_language.h @@ -4,7 +4,7 @@ * definition of the "language" system catalog (pg_language) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_language.h @@ -66,7 +66,10 @@ typedef FormData_pg_language *Form_pg_language; DECLARE_TOAST(pg_language, 4157, 4158); -DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, LanguageNameIndexId, on pg_language using btree(lanname name_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_language_oid_index, 2682, LanguageOidIndexId, on pg_language using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, LanguageNameIndexId, pg_language, btree(lanname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_language_oid_index, 2682, LanguageOidIndexId, pg_language, btree(oid oid_ops)); + +MAKE_SYSCACHE(LANGNAME, pg_language_name_index, 4); +MAKE_SYSCACHE(LANGOID, pg_language_oid_index, 4); #endif /* PG_LANGUAGE_H */ diff --git a/src/include/catalog/pg_largeobject.h b/src/include/catalog/pg_largeobject.h index 95471073a8b7f..b40c90b749db3 100644 --- a/src/include/catalog/pg_largeobject.h +++ b/src/include/catalog/pg_largeobject.h @@ -4,7 +4,7 @@ * definition of the "large object" system catalog (pg_largeobject) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_largeobject.h @@ -44,7 +44,7 @@ CATALOG(pg_largeobject,2613,LargeObjectRelationId) */ typedef FormData_pg_largeobject *Form_pg_largeobject; -DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_loid_pn_index, 2683, LargeObjectLOidPNIndexId, on pg_largeobject using btree(loid oid_ops, pageno int4_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_loid_pn_index, 2683, LargeObjectLOidPNIndexId, pg_largeobject, btree(loid oid_ops, pageno int4_ops)); extern Oid LargeObjectCreate(Oid loid); extern void LargeObjectDrop(Oid loid); diff --git a/src/include/catalog/pg_largeobject_metadata.h b/src/include/catalog/pg_largeobject_metadata.h index 80db926079f76..8a8274421870d 100644 --- a/src/include/catalog/pg_largeobject_metadata.h +++ b/src/include/catalog/pg_largeobject_metadata.h @@ -5,7 +5,7 @@ * (pg_largeobject_metadata) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_largeobject_metadata.h @@ -46,6 +46,6 @@ CATALOG(pg_largeobject_metadata,2995,LargeObjectMetadataRelationId) */ typedef FormData_pg_largeobject_metadata *Form_pg_largeobject_metadata; -DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_metadata_oid_index, 2996, LargeObjectMetadataOidIndexId, on pg_largeobject_metadata using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_metadata_oid_index, 2996, LargeObjectMetadataOidIndexId, pg_largeobject_metadata, btree(oid oid_ops)); #endif /* PG_LARGEOBJECT_METADATA_H */ diff --git a/src/include/catalog/pg_namespace.dat b/src/include/catalog/pg_namespace.dat index b4f0c4daf0381..816ec7ec8d143 100644 --- a/src/include/catalog/pg_namespace.dat +++ b/src/include/catalog/pg_namespace.dat @@ -3,7 +3,7 @@ # pg_namespace.dat # Initial contents of the pg_namespace system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_namespace.dat diff --git a/src/include/catalog/pg_namespace.h b/src/include/catalog/pg_namespace.h index 2b0c2431788f7..e101808ae1e0b 100644 --- a/src/include/catalog/pg_namespace.h +++ b/src/include/catalog/pg_namespace.h @@ -4,7 +4,7 @@ * definition of the "namespace" system catalog (pg_namespace) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_namespace.h @@ -53,8 +53,11 @@ typedef FormData_pg_namespace *Form_pg_namespace; DECLARE_TOAST(pg_namespace, 4163, 4164); -DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, NamespaceNameIndexId, on pg_namespace using btree(nspname name_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_namespace_oid_index, 2685, NamespaceOidIndexId, on pg_namespace using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, NamespaceNameIndexId, pg_namespace, btree(nspname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_namespace_oid_index, 2685, NamespaceOidIndexId, pg_namespace, btree(oid oid_ops)); + +MAKE_SYSCACHE(NAMESPACENAME, pg_namespace_nspname_index, 4); +MAKE_SYSCACHE(NAMESPACEOID, pg_namespace_oid_index, 16); /* * prototypes for functions in pg_namespace.c diff --git a/src/include/catalog/pg_opclass.dat b/src/include/catalog/pg_opclass.dat index c867d99563b23..f503c652ebca6 100644 --- a/src/include/catalog/pg_opclass.dat +++ b/src/include/catalog/pg_opclass.dat @@ -3,7 +3,7 @@ # pg_opclass.dat # Initial contents of the pg_opclass system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_opclass.dat @@ -91,8 +91,11 @@ # Here's an ugly little hack to save space in the system catalog indexes. # btree doesn't ordinarily allow a storage type different from input type; # but cstring and name are the same thing except for trailing padding, -# and we can safely omit that within an index entry. So we declare the -# btree opclass for name as using cstring storage type. +# so we choose to omit that within an index entry. Here we declare the +# btree opclass for name as using cstring storage type. This does require +# that we pad the cstring out with the full NAMEDATALEN bytes when performing +# index-only scans. See corresponding hacks in ExecInitIndexOnlyScan() and +# StoreIndexTuple(). { opcmethod => 'btree', opcname => 'name_ops', opcfamily => 'btree/text_ops', opcintype => 'name', opckeytype => 'cstring' }, diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h index b4b6325c06883..05867d08f9312 100644 --- a/src/include/catalog/pg_opclass.h +++ b/src/include/catalog/pg_opclass.h @@ -24,7 +24,7 @@ * AMs support this. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_opclass.h @@ -82,7 +82,10 @@ CATALOG(pg_opclass,2616,OperatorClassRelationId) */ typedef FormData_pg_opclass *Form_pg_opclass; -DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, OpclassAmNameNspIndexId, on pg_opclass using btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, OpclassOidIndexId, on pg_opclass using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, OpclassAmNameNspIndexId, pg_opclass, btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_opclass_oid_index, 2687, OpclassOidIndexId, pg_opclass, btree(oid oid_ops)); + +MAKE_SYSCACHE(CLAAMNAMENSP, pg_opclass_am_name_nsp_index, 8); +MAKE_SYSCACHE(CLAOID, pg_opclass_oid_index, 8); #endif /* PG_OPCLASS_H */ diff --git a/src/include/catalog/pg_operator.dat b/src/include/catalog/pg_operator.dat index b2cdea66c4bf8..0e7511dde1c64 100644 --- a/src/include/catalog/pg_operator.dat +++ b/src/include/catalog/pg_operator.dat @@ -3,7 +3,7 @@ # pg_operator.dat # Initial contents of the pg_operator system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_operator.dat diff --git a/src/include/catalog/pg_operator.h b/src/include/catalog/pg_operator.h index e60cf782a64cb..3ff1acc37ef9e 100644 --- a/src/include/catalog/pg_operator.h +++ b/src/include/catalog/pg_operator.h @@ -4,7 +4,7 @@ * definition of the "operator" system catalog (pg_operator) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_operator.h @@ -82,9 +82,16 @@ CATALOG(pg_operator,2617,OperatorRelationId) */ typedef FormData_pg_operator *Form_pg_operator; -DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, OperatorOidIndexId, on pg_operator using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, OperatorNameNspIndexId, on pg_operator using btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_operator_oid_index, 2688, OperatorOidIndexId, pg_operator, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, OperatorNameNspIndexId, pg_operator, btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops)); +MAKE_SYSCACHE(OPEROID, pg_operator_oid_index, 32); +MAKE_SYSCACHE(OPERNAMENSP, pg_operator_oprname_l_r_n_index, 256); + +extern Oid OperatorLookup(List *operatorName, + Oid leftObjectId, + Oid rightObjectId, + bool *defined); extern ObjectAddress OperatorCreate(const char *operatorName, Oid operatorNamespace, @@ -102,6 +109,16 @@ extern ObjectAddress makeOperatorDependencies(HeapTuple tuple, bool makeExtensionDep, bool isUpdate); +extern void OperatorValidateParams(Oid leftTypeId, + Oid rightTypeId, + Oid operResultType, + bool hasCommutator, + bool hasNegator, + bool hasRestrictionSelectivity, + bool hasJoinSelectivity, + bool canMerge, + bool canHash); + extern void OperatorUpd(Oid baseId, Oid commId, Oid negId, bool isDelete); #endif /* PG_OPERATOR_H */ diff --git a/src/include/catalog/pg_opfamily.dat b/src/include/catalog/pg_opfamily.dat index 91587b99d0972..c8ac8c73def7e 100644 --- a/src/include/catalog/pg_opfamily.dat +++ b/src/include/catalog/pg_opfamily.dat @@ -3,7 +3,7 @@ # pg_opfamily.dat # Initial contents of the pg_opfamily system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_opfamily.dat @@ -50,7 +50,7 @@ opfmethod => 'btree', opfname => 'integer_ops' }, { oid => '1977', opfmethod => 'hash', opfname => 'integer_ops' }, -{ oid => '1982', +{ oid => '1982', oid_symbol => 'INTERVAL_BTREE_FAM_OID', opfmethod => 'btree', opfname => 'interval_ops' }, { oid => '1983', opfmethod => 'hash', opfname => 'interval_ops' }, diff --git a/src/include/catalog/pg_opfamily.h b/src/include/catalog/pg_opfamily.h index 39b8d7c21952b..52f9c4acf976b 100644 --- a/src/include/catalog/pg_opfamily.h +++ b/src/include/catalog/pg_opfamily.h @@ -4,7 +4,7 @@ * definition of the "operator family" system catalog (pg_opfamily) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_opfamily.h @@ -50,8 +50,11 @@ CATALOG(pg_opfamily,2753,OperatorFamilyRelationId) */ typedef FormData_pg_opfamily *Form_pg_opfamily; -DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, OpfamilyAmNameNspIndexId, on pg_opfamily using btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_opfamily_oid_index, 2755, OpfamilyOidIndexId, on pg_opfamily using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, OpfamilyAmNameNspIndexId, pg_opfamily, btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_opfamily_oid_index, 2755, OpfamilyOidIndexId, pg_opfamily, btree(oid oid_ops)); + +MAKE_SYSCACHE(OPFAMILYAMNAMENSP, pg_opfamily_am_name_nsp_index, 8); +MAKE_SYSCACHE(OPFAMILYOID, pg_opfamily_oid_index, 8); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/src/include/catalog/pg_parameter_acl.h b/src/include/catalog/pg_parameter_acl.h index 1612cebd0e2ee..8f6b6f92b3e6e 100644 --- a/src/include/catalog/pg_parameter_acl.h +++ b/src/include/catalog/pg_parameter_acl.h @@ -5,7 +5,7 @@ * (pg_parameter_acl). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_parameter_acl.h @@ -50,9 +50,11 @@ typedef FormData_pg_parameter_acl * Form_pg_parameter_acl; DECLARE_TOAST_WITH_MACRO(pg_parameter_acl, 6244, 6245, PgParameterAclToastTable, PgParameterAclToastIndex); -DECLARE_UNIQUE_INDEX(pg_parameter_acl_parname_index, 6246, ParameterAclParnameIndexId, on pg_parameter_acl using btree(parname text_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_parameter_acl_oid_index, 6247, ParameterAclOidIndexId, on pg_parameter_acl using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_parameter_acl_parname_index, 6246, ParameterAclParnameIndexId, pg_parameter_acl, btree(parname text_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_parameter_acl_oid_index, 6247, ParameterAclOidIndexId, pg_parameter_acl, btree(oid oid_ops)); +MAKE_SYSCACHE(PARAMETERACLNAME, pg_parameter_acl_parname_index, 4); +MAKE_SYSCACHE(PARAMETERACLOID, pg_parameter_acl_oid_index, 4); extern Oid ParameterAclLookup(const char *parameter, bool missing_ok); extern Oid ParameterAclCreate(const char *parameter); diff --git a/src/include/catalog/pg_partitioned_table.h b/src/include/catalog/pg_partitioned_table.h index eb867ad62b0e8..daf57008b6963 100644 --- a/src/include/catalog/pg_partitioned_table.h +++ b/src/include/catalog/pg_partitioned_table.h @@ -5,7 +5,7 @@ * (pg_partitioned_table) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_partitioned_table.h @@ -66,7 +66,9 @@ typedef FormData_pg_partitioned_table *Form_pg_partitioned_table; DECLARE_TOAST(pg_partitioned_table, 4165, 4166); -DECLARE_UNIQUE_INDEX_PKEY(pg_partitioned_table_partrelid_index, 3351, PartitionedRelidIndexId, on pg_partitioned_table using btree(partrelid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_partitioned_table_partrelid_index, 3351, PartitionedRelidIndexId, pg_partitioned_table, btree(partrelid oid_ops)); + +MAKE_SYSCACHE(PARTRELID, pg_partitioned_table_partrelid_index, 32); /* partattrs can contain zero (InvalidAttrNumber) to represent expressions */ DECLARE_ARRAY_FOREIGN_KEY_OPT((partrelid, partattrs), pg_attribute, (attrelid, attnum)); diff --git a/src/include/catalog/pg_policy.h b/src/include/catalog/pg_policy.h index c9525ece74c7c..05d6398f7b865 100644 --- a/src/include/catalog/pg_policy.h +++ b/src/include/catalog/pg_policy.h @@ -4,7 +4,7 @@ * definition of the "policy" system catalog (pg_policy) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_policy.h @@ -52,7 +52,7 @@ typedef FormData_pg_policy *Form_pg_policy; DECLARE_TOAST(pg_policy, 4167, 4168); -DECLARE_UNIQUE_INDEX_PKEY(pg_policy_oid_index, 3257, PolicyOidIndexId, on pg_policy using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_policy_polrelid_polname_index, 3258, PolicyPolrelidPolnameIndexId, on pg_policy using btree(polrelid oid_ops, polname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_policy_oid_index, 3257, PolicyOidIndexId, pg_policy, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_policy_polrelid_polname_index, 3258, PolicyPolrelidPolnameIndexId, pg_policy, btree(polrelid oid_ops, polname name_ops)); #endif /* PG_POLICY_H */ diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index 6996073989a5d..6a5476d3c4c21 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -3,7 +3,7 @@ # pg_proc.dat # Initial contents of the pg_proc system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_proc.dat @@ -2319,6 +2319,9 @@ { oid => '1159', descr => 'adjust timestamp to new time zone', proname => 'timezone', prorettype => 'timestamp', proargtypes => 'text timestamptz', prosrc => 'timestamptz_zone' }, +{ oid => '6334', descr => 'adjust timestamp to local time zone', + proname => 'timezone', provolatile => 's', prorettype => 'timestamp', + proargtypes => 'timestamptz', prosrc => 'timestamptz_at_local' }, { oid => '1160', descr => 'I/O', proname => 'interval_in', provolatile => 's', prorettype => 'interval', @@ -3378,6 +3381,18 @@ proname => 'random_normal', provolatile => 'v', proparallel => 'r', prorettype => 'float8', proargtypes => 'float8 float8', prosrc => 'drandom_normal' }, +{ oid => '6339', descr => 'random integer in range', + proname => 'random', provolatile => 'v', proparallel => 'r', + prorettype => 'int4', proargtypes => 'int4 int4', proargnames => '{min,max}', + prosrc => 'int4random' }, +{ oid => '6340', descr => 'random bigint in range', + proname => 'random', provolatile => 'v', proparallel => 'r', + prorettype => 'int8', proargtypes => 'int8 int8', proargnames => '{min,max}', + prosrc => 'int8random' }, +{ oid => '6341', descr => 'random numeric in range', + proname => 'random', provolatile => 'v', proparallel => 'r', + prorettype => 'numeric', proargtypes => 'numeric numeric', + proargnames => '{min,max}', prosrc => 'numeric_random' }, { oid => '1599', descr => 'set random seed', proname => 'setseed', provolatile => 'v', proparallel => 'r', prorettype => 'void', proargtypes => 'float8', prosrc => 'setseed' }, @@ -3707,6 +3722,18 @@ { oid => '2768', descr => 'split string by pattern', proname => 'regexp_split_to_array', prorettype => '_text', proargtypes => 'text text text', prosrc => 'regexp_split_to_array' }, +{ oid => '6330', descr => 'convert int4 number to binary', + proname => 'to_bin', prorettype => 'text', proargtypes => 'int4', + prosrc => 'to_bin32' }, +{ oid => '6331', descr => 'convert int8 number to binary', + proname => 'to_bin', prorettype => 'text', proargtypes => 'int8', + prosrc => 'to_bin64' }, +{ oid => '6332', descr => 'convert int4 number to oct', + proname => 'to_oct', prorettype => 'text', proargtypes => 'int4', + prosrc => 'to_oct32' }, +{ oid => '6333', descr => 'convert int8 number to oct', + proname => 'to_oct', prorettype => 'text', proargtypes => 'int8', + prosrc => 'to_oct64' }, { oid => '2089', descr => 'convert int4 number to hex', proname => 'to_hex', prorettype => 'text', proargtypes => 'int4', prosrc => 'to_hex32' }, @@ -3862,6 +3889,9 @@ { oid => '1619', descr => 'type of the argument', proname => 'pg_typeof', proisstrict => 'f', provolatile => 's', prorettype => 'regtype', proargtypes => 'any', prosrc => 'pg_typeof' }, +{ oid => '6315', descr => 'base type of a domain type', + proname => 'pg_basetype', provolatile => 's', prorettype => 'regtype', + proargtypes => 'regtype', prosrc => 'pg_basetype' }, { oid => '3162', descr => 'collation of the argument; implementation of the COLLATION FOR expression', proname => 'pg_collation_for', proisstrict => 'f', provolatile => 's', @@ -4902,17 +4932,28 @@ prosrc => 'numeric_poly_stddev_samp' }, { oid => '1843', descr => 'aggregate transition function', - proname => 'interval_accum', prorettype => '_interval', - proargtypes => '_interval interval', prosrc => 'interval_accum' }, + proname => 'interval_avg_accum', proisstrict => 'f', prorettype => 'internal', + proargtypes => 'internal interval', prosrc => 'interval_avg_accum' }, { oid => '3325', descr => 'aggregate combine function', - proname => 'interval_combine', prorettype => '_interval', - proargtypes => '_interval _interval', prosrc => 'interval_combine' }, + proname => 'interval_avg_combine', proisstrict => 'f', + prorettype => 'internal', proargtypes => 'internal internal', + prosrc => 'interval_avg_combine' }, { oid => '3549', descr => 'aggregate transition function', - proname => 'interval_accum_inv', prorettype => '_interval', - proargtypes => '_interval interval', prosrc => 'interval_accum_inv' }, + proname => 'interval_avg_accum_inv', proisstrict => 'f', + prorettype => 'internal', proargtypes => 'internal interval', + prosrc => 'interval_avg_accum_inv' }, +{ oid => '6324', descr => 'aggregate serial function', + proname => 'interval_avg_serialize', prorettype => 'bytea', + proargtypes => 'internal', prosrc => 'interval_avg_serialize' }, +{ oid => '6325', descr => 'aggregate deserial function', + proname => 'interval_avg_deserialize', prorettype => 'internal', + proargtypes => 'bytea internal', prosrc => 'interval_avg_deserialize' }, { oid => '1844', descr => 'aggregate final function', - proname => 'interval_avg', prorettype => 'interval', - proargtypes => '_interval', prosrc => 'interval_avg' }, + proname => 'interval_avg', proisstrict => 'f', prorettype => 'interval', + proargtypes => 'internal', prosrc => 'interval_avg' }, +{ oid => '6326', descr => 'aggregate final function', + proname => 'interval_sum', proisstrict => 'f', prorettype => 'interval', + proargtypes => 'internal', prosrc => 'interval_sum' }, { oid => '1962', descr => 'aggregate transition function', proname => 'int2_avg_accum', prorettype => '_int8', proargtypes => '_int8 int2', prosrc => 'int2_avg_accum' }, @@ -4992,7 +5033,7 @@ { oid => '3538', descr => 'concatenate aggregate input into a string', proname => 'string_agg', prokind => 'a', proisstrict => 'f', prorettype => 'text', proargtypes => 'text text', - prosrc => 'aggregate_dummy' }, + proargnames => '{value,delimiter}', prosrc => 'aggregate_dummy' }, { oid => '3543', descr => 'aggregate transition function', proname => 'bytea_string_agg_transfn', proisstrict => 'f', prorettype => 'internal', proargtypes => 'internal bytea bytea', @@ -5004,7 +5045,7 @@ { oid => '3545', descr => 'concatenate aggregate input into a bytea', proname => 'string_agg', prokind => 'a', proisstrict => 'f', prorettype => 'bytea', proargtypes => 'bytea bytea', - prosrc => 'aggregate_dummy' }, + proargnames => '{value,delimiter}', prosrc => 'aggregate_dummy' }, # To ASCII conversion { oid => '1845', descr => 'encode text from DB encoding to ASCII text', @@ -5417,6 +5458,12 @@ proargmodes => '{i,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}', proargnames => '{pid,datid,pid,usesysid,application_name,state,query,wait_event_type,wait_event,xact_start,query_start,backend_start,state_change,client_addr,client_hostname,client_port,backend_xid,backend_xmin,backend_type,ssl,sslversion,sslcipher,sslbits,ssl_client_dn,ssl_client_serial,ssl_issuer_dn,gss_auth,gss_princ,gss_enc,gss_delegation,leader_pid,query_id}', prosrc => 'pg_stat_get_activity' }, +{ oid => '6318', descr => 'describe wait events', + proname => 'pg_get_wait_events', procost => '10', prorows => '250', + proretset => 't', provolatile => 'v', prorettype => 'record', + proargtypes => '', proallargtypes => '{text,text,text}', + proargmodes => '{o,o,o}', proargnames => '{type,name,description}', + prosrc => 'pg_get_wait_events' }, { oid => '3318', descr => 'statistics: information about progress of backends running maintenance command', proname => 'pg_stat_get_progress_info', prorows => '100', proretset => 't', @@ -5466,9 +5513,9 @@ proname => 'pg_stat_get_subscription', prorows => '10', proisstrict => 'f', proretset => 't', provolatile => 's', proparallel => 'r', prorettype => 'record', proargtypes => 'oid', - proallargtypes => '{oid,oid,oid,int4,int4,pg_lsn,timestamptz,timestamptz,pg_lsn,timestamptz}', - proargmodes => '{i,o,o,o,o,o,o,o,o,o}', - proargnames => '{subid,subid,relid,pid,leader_pid,received_lsn,last_msg_send_time,last_msg_receipt_time,latest_end_lsn,latest_end_time}', + proallargtypes => '{oid,oid,oid,int4,int4,pg_lsn,timestamptz,timestamptz,pg_lsn,timestamptz,text}', + proargmodes => '{i,o,o,o,o,o,o,o,o,o,o}', + proargnames => '{subid,subid,relid,pid,leader_pid,received_lsn,last_msg_send_time,last_msg_receipt_time,latest_end_lsn,latest_end_time,worker_type}', prosrc => 'pg_stat_get_subscription' }, { oid => '2026', descr => 'statistics: current backend PID', proname => 'pg_backend_pid', provolatile => 's', proparallel => 'r', @@ -5679,20 +5726,41 @@ proargnames => '{archived_count,last_archived_wal,last_archived_time,failed_count,last_failed_wal,last_failed_time,stats_reset}', prosrc => 'pg_stat_get_archiver' }, { oid => '2769', - descr => 'statistics: number of timed checkpoints started by the bgwriter', - proname => 'pg_stat_get_bgwriter_timed_checkpoints', provolatile => 's', + descr => 'statistics: number of timed checkpoints started by the checkpointer', + proname => 'pg_stat_get_checkpointer_num_timed', provolatile => 's', proparallel => 'r', prorettype => 'int8', proargtypes => '', - prosrc => 'pg_stat_get_bgwriter_timed_checkpoints' }, + prosrc => 'pg_stat_get_checkpointer_num_timed' }, { oid => '2770', - descr => 'statistics: number of backend requested checkpoints started by the bgwriter', - proname => 'pg_stat_get_bgwriter_requested_checkpoints', provolatile => 's', + descr => 'statistics: number of backend requested checkpoints started by the checkpointer', + proname => 'pg_stat_get_checkpointer_num_requested', provolatile => 's', + proparallel => 'r', prorettype => 'int8', proargtypes => '', + prosrc => 'pg_stat_get_checkpointer_num_requested' }, +{ oid => '6327', + descr => 'statistics: number of timed restartpoints started by the checkpointer', + proname => 'pg_stat_get_checkpointer_restartpoints_timed', provolatile => 's', proparallel => 'r', prorettype => 'int8', proargtypes => '', - prosrc => 'pg_stat_get_bgwriter_requested_checkpoints' }, + prosrc => 'pg_stat_get_checkpointer_restartpoints_timed' }, +{ oid => '6328', + descr => 'statistics: number of backend requested restartpoints started by the checkpointer', + proname => 'pg_stat_get_checkpointer_restartpoints_requested', + provolatile => 's', proparallel => 'r', prorettype => 'int8', + proargtypes => '', + prosrc => 'pg_stat_get_checkpointer_restartpoints_requested' }, +{ oid => '6329', + descr => 'statistics: number of backend performed restartpoints', + proname => 'pg_stat_get_checkpointer_restartpoints_performed', + provolatile => 's', proparallel => 'r', prorettype => 'int8', + proargtypes => '', + prosrc => 'pg_stat_get_checkpointer_restartpoints_performed' }, { oid => '2771', - descr => 'statistics: number of buffers written by the bgwriter during checkpoints', - proname => 'pg_stat_get_bgwriter_buf_written_checkpoints', provolatile => 's', + descr => 'statistics: number of buffers written during checkpoints and restartpoints', + proname => 'pg_stat_get_checkpointer_buffers_written', provolatile => 's', proparallel => 'r', prorettype => 'int8', proargtypes => '', - prosrc => 'pg_stat_get_bgwriter_buf_written_checkpoints' }, + prosrc => 'pg_stat_get_checkpointer_buffers_written' }, +{ oid => '6314', descr => 'statistics: last reset for the checkpointer', + proname => 'pg_stat_get_checkpointer_stat_reset_time', provolatile => 's', + proparallel => 'r', prorettype => 'timestamptz', proargtypes => '', + prosrc => 'pg_stat_get_checkpointer_stat_reset_time' }, { oid => '2772', descr => 'statistics: number of buffers written by the bgwriter for cleaning dirty buffers', proname => 'pg_stat_get_bgwriter_buf_written_clean', provolatile => 's', @@ -5708,24 +5776,15 @@ proparallel => 'r', prorettype => 'timestamptz', proargtypes => '', prosrc => 'pg_stat_get_bgwriter_stat_reset_time' }, { oid => '3160', - descr => 'statistics: checkpoint time spent writing buffers to disk, in milliseconds', - proname => 'pg_stat_get_checkpoint_write_time', provolatile => 's', + descr => 'statistics: checkpoint/restartpoint time spent writing buffers to disk, in milliseconds', + proname => 'pg_stat_get_checkpointer_write_time', provolatile => 's', proparallel => 'r', prorettype => 'float8', proargtypes => '', - prosrc => 'pg_stat_get_checkpoint_write_time' }, + prosrc => 'pg_stat_get_checkpointer_write_time' }, { oid => '3161', - descr => 'statistics: checkpoint time spent synchronizing buffers to disk, in milliseconds', - proname => 'pg_stat_get_checkpoint_sync_time', provolatile => 's', + descr => 'statistics: checkpoint/restartpoint time spent synchronizing buffers to disk, in milliseconds', + proname => 'pg_stat_get_checkpointer_sync_time', provolatile => 's', proparallel => 'r', prorettype => 'float8', proargtypes => '', - prosrc => 'pg_stat_get_checkpoint_sync_time' }, -{ oid => '2775', descr => 'statistics: number of buffers written by backends', - proname => 'pg_stat_get_buf_written_backend', provolatile => 's', - proparallel => 'r', prorettype => 'int8', proargtypes => '', - prosrc => 'pg_stat_get_buf_written_backend' }, -{ oid => '3063', - descr => 'statistics: number of backend buffer writes that did their own fsync', - proname => 'pg_stat_get_buf_fsync_backend', provolatile => 's', - proparallel => 'r', prorettype => 'int8', proargtypes => '', - prosrc => 'pg_stat_get_buf_fsync_backend' }, + prosrc => 'pg_stat_get_checkpointer_sync_time' }, { oid => '2859', descr => 'statistics: number of buffer allocations', proname => 'pg_stat_get_buf_alloc', provolatile => 's', proparallel => 'r', prorettype => 'int8', proargtypes => '', prosrc => 'pg_stat_get_buf_alloc' }, @@ -5865,8 +5924,9 @@ prorettype => 'void', proargtypes => '', prosrc => 'pg_stat_reset' }, { oid => '3775', descr => 'statistics: reset collected statistics shared across the cluster', - proname => 'pg_stat_reset_shared', provolatile => 'v', prorettype => 'void', - proargtypes => 'text', prosrc => 'pg_stat_reset_shared' }, + proname => 'pg_stat_reset_shared', proisstrict => 'f', provolatile => 'v', + prorettype => 'void', proargtypes => 'text', + prosrc => 'pg_stat_reset_shared' }, { oid => '3776', descr => 'statistics: reset collected statistics for a single table or index in the current database or shared across all databases in the cluster', proname => 'pg_stat_reset_single_table_counters', provolatile => 'v', @@ -5880,7 +5940,8 @@ { oid => '2307', descr => 'statistics: reset collected statistics for a single SLRU', proname => 'pg_stat_reset_slru', proisstrict => 'f', provolatile => 'v', - prorettype => 'void', proargtypes => 'text', prosrc => 'pg_stat_reset_slru' }, + prorettype => 'void', proargtypes => 'text', proargnames => '{target}', + prosrc => 'pg_stat_reset_slru' }, { oid => '6170', descr => 'statistics: reset collected statistics for a single replication slot', proname => 'pg_stat_reset_replication_slot', proisstrict => 'f', @@ -6077,6 +6138,9 @@ { oid => '2038', descr => 'adjust time with time zone to new zone', proname => 'timezone', prorettype => 'timetz', proargtypes => 'interval timetz', prosrc => 'timetz_izone' }, +{ oid => '6336', descr => 'adjust time to local time zone', + proname => 'timezone', provolatile => 's', prorettype => 'timetz', + proargtypes => 'timetz', prosrc => 'timetz_at_local' }, { oid => '2039', descr => 'hash', proname => 'timestamp_hash', prorettype => 'int4', proargtypes => 'timestamp', prosrc => 'timestamp_hash' }, @@ -6172,6 +6236,9 @@ { oid => '2070', descr => 'adjust timestamp to new time zone', proname => 'timezone', prorettype => 'timestamptz', proargtypes => 'interval timestamp', prosrc => 'timestamp_izone' }, +{ oid => '6335', descr => 'adjust timestamp to local time zone', + proname => 'timezone', provolatile => 's', prorettype => 'timestamptz', + proargtypes => 'timestamp', prosrc => 'timestamp_at_local' }, { oid => '2071', proname => 'date_pl_interval', prorettype => 'timestamp', proargtypes => 'date interval', prosrc => 'date_pl_interval' }, @@ -6494,9 +6561,6 @@ proargtypes => '', prosrc => 'pg_reload_conf' }, { oid => '2622', descr => 'rotate log file', proname => 'pg_rotate_logfile', provolatile => 'v', prorettype => 'bool', - proargtypes => '', prosrc => 'pg_rotate_logfile_v2' }, -{ oid => '4099', descr => 'rotate log file - old version for adminpack 1.0', - proname => 'pg_rotate_logfile_old', provolatile => 'v', prorettype => 'bool', proargtypes => '', prosrc => 'pg_rotate_logfile' }, { oid => '3800', descr => 'current logging collector file location', proname => 'pg_current_logfile', proisstrict => 'f', provolatile => 'v', @@ -6527,10 +6591,6 @@ proname => 'pg_read_file', provolatile => 'v', prorettype => 'text', proargtypes => 'text int8 int8 bool', prosrc => 'pg_read_file_off_len_missing' }, -{ oid => '4100', - descr => 'read text from a file - old version for adminpack 1.0', - proname => 'pg_read_file_old', provolatile => 'v', prorettype => 'text', - proargtypes => 'text int8 int8', prosrc => 'pg_read_file' }, { oid => '3826', descr => 'read text from a file', proname => 'pg_read_file', provolatile => 'v', prorettype => 'text', proargtypes => 'text', prosrc => 'pg_read_file_all' }, @@ -7111,6 +7171,9 @@ { oid => '3493', descr => 'convert type name to regtype', proname => 'to_regtype', provolatile => 's', prorettype => 'regtype', proargtypes => 'text', prosrc => 'to_regtype' }, +{ oid => '6317', descr => 'convert type name to type modifier', + proname => 'to_regtypemod', provolatile => 's', prorettype => 'int4', + proargtypes => 'text', prosrc => 'to_regtypemod' }, { oid => '1079', descr => 'convert text to regclass', proname => 'regclass', provolatile => 's', prorettype => 'regclass', proargtypes => 'text', prosrc => 'text_regclass' }, @@ -7403,6 +7466,10 @@ { oid => '2121', descr => 'compression method for the compressed datum', proname => 'pg_column_compression', provolatile => 's', prorettype => 'text', proargtypes => 'any', prosrc => 'pg_column_compression' }, +{ oid => '6316', descr => 'chunk ID of on-disk TOASTed value', + proname => 'pg_column_toast_chunk_id', provolatile => 's', + prorettype => 'oid', proargtypes => 'any', + prosrc => 'pg_column_toast_chunk_id' }, { oid => '2322', descr => 'total disk space usage for the specified tablespace', proname => 'pg_tablespace_size', provolatile => 'v', prorettype => 'int8', @@ -8771,6 +8838,9 @@ { oid => '2922', descr => 'serialize an XML value to a character string', proname => 'text', prorettype => 'text', proargtypes => 'xml', prosrc => 'xmltotext' }, +{ oid => '3813', descr => 'generate XML text node', + proname => 'xmltext', prorettype => 'xml', proargtypes => 'text', + prosrc => 'xmltext' }, { oid => '2923', descr => 'map table contents to XML', proname => 'table_to_xml', procost => '100', provolatile => 's', @@ -8953,21 +9023,22 @@ { oid => '3197', descr => 'aggregate input into a json object', proname => 'json_object_agg', prokind => 'a', proisstrict => 'f', provolatile => 's', prorettype => 'json', proargtypes => 'any any', - prosrc => 'aggregate_dummy' }, + proargnames => '{key,value}', prosrc => 'aggregate_dummy' }, { oid => '6280', descr => 'aggregate non-NULL input into a json object', proname => 'json_object_agg_strict', prokind => 'a', proisstrict => 'f', provolatile => 's', prorettype => 'json', proargtypes => 'any any', - prosrc => 'aggregate_dummy' }, + proargnames => '{key,value}', prosrc => 'aggregate_dummy' }, { oid => '6281', descr => 'aggregate input into a json object with unique keys', proname => 'json_object_agg_unique', prokind => 'a', proisstrict => 'f', provolatile => 's', prorettype => 'json', proargtypes => 'any any', - prosrc => 'aggregate_dummy' }, + proargnames => '{key,value}', prosrc => 'aggregate_dummy' }, { oid => '6282', descr => 'aggregate non-NULL input into a json object with unique keys', proname => 'json_object_agg_unique_strict', prokind => 'a', proisstrict => 'f', provolatile => 's', prorettype => 'json', - proargtypes => 'any any', prosrc => 'aggregate_dummy' }, + proargtypes => 'any any', proargnames => '{key,value}', + prosrc => 'aggregate_dummy' }, { oid => '3198', descr => 'build a json array from any inputs', proname => 'json_build_array', provariadic => 'any', proisstrict => 'f', provolatile => 's', prorettype => 'json', proargtypes => 'any', @@ -9119,6 +9190,13 @@ { oid => '3432', descr => 'generate random UUID', proname => 'gen_random_uuid', proleakproof => 't', provolatile => 'v', prorettype => 'uuid', proargtypes => '', prosrc => 'gen_random_uuid' }, +{ oid => '6342', descr => 'extract timestamp from UUID', + proname => 'uuid_extract_timestamp', proleakproof => 't', + prorettype => 'timestamptz', proargtypes => 'uuid', + prosrc => 'uuid_extract_timestamp' }, +{ oid => '6343', descr => 'extract version from RFC 4122 UUID', + proname => 'uuid_extract_version', proleakproof => 't', prorettype => 'int2', + proargtypes => 'uuid', prosrc => 'uuid_extract_version' }, # pg_lsn { oid => '3229', descr => 'I/O', @@ -9881,22 +9959,22 @@ prosrc => 'jsonb_object_agg_finalfn' }, { oid => '3270', descr => 'aggregate inputs into jsonb object', proname => 'jsonb_object_agg', prokind => 'a', proisstrict => 'f', - prorettype => 'jsonb', proargtypes => 'any any', + prorettype => 'jsonb', proargtypes => 'any any', proargnames => '{key,value}', prosrc => 'aggregate_dummy' }, { oid => '6288', descr => 'aggregate non-NULL inputs into jsonb object', proname => 'jsonb_object_agg_strict', prokind => 'a', proisstrict => 'f', - prorettype => 'jsonb', proargtypes => 'any any', + prorettype => 'jsonb', proargtypes => 'any any', proargnames => '{key,value}', prosrc => 'aggregate_dummy' }, { oid => '6289', descr => 'aggregate inputs into jsonb object checking key uniqueness', proname => 'jsonb_object_agg_unique', prokind => 'a', proisstrict => 'f', - prorettype => 'jsonb', proargtypes => 'any any', + prorettype => 'jsonb', proargtypes => 'any any', proargnames => '{key,value}', prosrc => 'aggregate_dummy' }, { oid => '6290', descr => 'aggregate non-NULL inputs into jsonb object checking key uniqueness', proname => 'jsonb_object_agg_unique_strict', prokind => 'a', proisstrict => 'f', prorettype => 'jsonb', proargtypes => 'any any', - prosrc => 'aggregate_dummy' }, + proargnames => '{key,value}', prosrc => 'aggregate_dummy' }, { oid => '3271', descr => 'build a jsonb array from any inputs', proname => 'jsonb_build_array', provariadic => 'any', proisstrict => 'f', provolatile => 's', prorettype => 'jsonb', proargtypes => 'any', @@ -9977,6 +10055,10 @@ proname => 'jsonb_populate_record', proisstrict => 'f', provolatile => 's', prorettype => 'anyelement', proargtypes => 'anyelement jsonb', prosrc => 'jsonb_populate_record' }, +{ oid => '6338', descr => 'test get record fields from a jsonb object', + proname => 'jsonb_populate_record_valid', proisstrict => 'f', + provolatile => 's', prorettype => 'bool', proargtypes => 'anyelement jsonb', + prosrc => 'jsonb_populate_record_valid' }, { oid => '3475', descr => 'get set of records with fields from a jsonb array of objects', proname => 'jsonb_populate_recordset', prorows => '100', proisstrict => 'f', @@ -10448,13 +10530,15 @@ proname => 'range_overlaps', prorettype => 'bool', proargtypes => 'anyrange anyrange', prosrc => 'range_overlaps' }, { oid => '3858', - proname => 'range_contains_elem', prorettype => 'bool', - proargtypes => 'anyrange anyelement', prosrc => 'range_contains_elem' }, + proname => 'range_contains_elem', prosupport => 'range_contains_elem_support', + prorettype => 'bool', proargtypes => 'anyrange anyelement', + prosrc => 'range_contains_elem' }, { oid => '3859', proname => 'range_contains', prorettype => 'bool', proargtypes => 'anyrange anyrange', prosrc => 'range_contains' }, { oid => '3860', - proname => 'elem_contained_by_range', prorettype => 'bool', + proname => 'elem_contained_by_range', + prosupport => 'elem_contained_by_range_support', prorettype => 'bool', proargtypes => 'anyelement anyrange', prosrc => 'elem_contained_by_range' }, { oid => '3861', proname => 'range_contained_by', prorettype => 'bool', @@ -10477,6 +10561,12 @@ { oid => '3867', proname => 'range_union', prorettype => 'anyrange', proargtypes => 'anyrange anyrange', prosrc => 'range_union' }, +{ oid => '6345', descr => 'planner support for range_contains_elem', + proname => 'range_contains_elem_support', prorettype => 'internal', + proargtypes => 'internal', prosrc => 'range_contains_elem_support' }, +{ oid => '6346', descr => 'planner support for elem_contained_by_range', + proname => 'elem_contained_by_range_support', prorettype => 'internal', + proargtypes => 'internal', prosrc => 'elem_contained_by_range_support' }, { oid => '4057', descr => 'the smallest range which includes both of the given ranges', proname => 'range_merge', prorettype => 'anyrange', @@ -11060,17 +11150,17 @@ proname => 'pg_get_replication_slots', prorows => '10', proisstrict => 'f', proretset => 't', provolatile => 's', prorettype => 'record', proargtypes => '', - proallargtypes => '{name,name,text,oid,bool,bool,int4,xid,xid,pg_lsn,pg_lsn,text,int8,bool,bool}', - proargmodes => '{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}', - proargnames => '{slot_name,plugin,slot_type,datoid,temporary,active,active_pid,xmin,catalog_xmin,restart_lsn,confirmed_flush_lsn,wal_status,safe_wal_size,two_phase,conflicting}', + proallargtypes => '{name,name,text,oid,bool,bool,int4,xid,xid,pg_lsn,pg_lsn,text,int8,bool,timestamptz,bool,text,bool,bool}', + proargmodes => '{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}', + proargnames => '{slot_name,plugin,slot_type,datoid,temporary,active,active_pid,xmin,catalog_xmin,restart_lsn,confirmed_flush_lsn,wal_status,safe_wal_size,two_phase,inactive_since,conflicting,invalidation_reason,failover,synced}', prosrc => 'pg_get_replication_slots' }, { oid => '3786', descr => 'set up a logical replication slot', proname => 'pg_create_logical_replication_slot', provolatile => 'v', proparallel => 'u', prorettype => 'record', - proargtypes => 'name name bool bool', - proallargtypes => '{name,name,bool,bool,name,pg_lsn}', - proargmodes => '{i,i,i,i,o,o}', - proargnames => '{slot_name,plugin,temporary,twophase,slot_name,lsn}', + proargtypes => 'name name bool bool bool', + proallargtypes => '{name,name,bool,bool,bool,name,pg_lsn}', + proargmodes => '{i,i,i,i,i,o,o}', + proargnames => '{slot_name,plugin,temporary,twophase,failover,slot_name,lsn}', prosrc => 'pg_create_logical_replication_slot' }, { oid => '4222', descr => 'copy a logical replication slot, changing temporality and plugin', @@ -11139,12 +11229,17 @@ prosrc => 'pg_replication_slot_advance' }, { oid => '3577', descr => 'emit a textual logical decoding message', proname => 'pg_logical_emit_message', provolatile => 'v', proparallel => 'u', - prorettype => 'pg_lsn', proargtypes => 'bool text text', + prorettype => 'pg_lsn', proargtypes => 'bool text text bool', prosrc => 'pg_logical_emit_message_text' }, { oid => '3578', descr => 'emit a binary logical decoding message', proname => 'pg_logical_emit_message', provolatile => 'v', proparallel => 'u', - prorettype => 'pg_lsn', proargtypes => 'bool text bytea', + prorettype => 'pg_lsn', proargtypes => 'bool text bytea bool', prosrc => 'pg_logical_emit_message_bytea' }, +{ oid => '6344', + descr => 'sync replication slots from the primary to the standby', + proname => 'pg_sync_replication_slots', provolatile => 'v', + proparallel => 'u', prorettype => 'void', proargtypes => '', + prosrc => 'pg_sync_replication_slots' }, # event triggers { oid => '3566', descr => 'list objects dropped by the current command', @@ -11351,6 +11446,20 @@ proname => 'binary_upgrade_set_next_pg_tablespace_oid', provolatile => 'v', proparallel => 'u', prorettype => 'void', proargtypes => 'oid', prosrc => 'binary_upgrade_set_next_pg_tablespace_oid' }, +{ oid => '6312', descr => 'for use by pg_upgrade', + proname => 'binary_upgrade_logical_slot_has_caught_up', provolatile => 'v', + proparallel => 'u', prorettype => 'bool', proargtypes => 'name', + prosrc => 'binary_upgrade_logical_slot_has_caught_up' }, +{ oid => '6319', + descr => 'for use by pg_upgrade (relation for pg_subscription_rel)', + proname => 'binary_upgrade_add_sub_rel_state', proisstrict => 'f', + provolatile => 'v', proparallel => 'u', prorettype => 'void', + proargtypes => 'text oid char pg_lsn', + prosrc => 'binary_upgrade_add_sub_rel_state' }, +{ oid => '6320', descr => 'for use by pg_upgrade (remote_lsn for origin)', + proname => 'binary_upgrade_replorigin_advance', proisstrict => 'f', + provolatile => 'v', proparallel => 'u', prorettype => 'void', + proargtypes => 'text pg_lsn', prosrc => 'binary_upgrade_replorigin_advance' }, # conversion functions { oid => '4302', @@ -11991,6 +12100,18 @@ proname => 'pg_partition_root', prorettype => 'regclass', proargtypes => 'regclass', prosrc => 'pg_partition_root' }, +{ oid => '4549', descr => 'Unicode version used by Postgres', + proname => 'unicode_version', prorettype => 'text', proargtypes => '', + prosrc => 'unicode_version' }, + +{ oid => '6099', descr => 'Unicode version used by ICU, if enabled', + proname => 'icu_unicode_version', prorettype => 'text', proargtypes => '', + prosrc => 'icu_unicode_version' }, + +{ oid => '6105', descr => 'check valid Unicode', + proname => 'unicode_assigned', prorettype => 'bool', proargtypes => 'text', + prosrc => 'unicode_assigned' }, + { oid => '4350', descr => 'Unicode normalization', proname => 'normalize', prorettype => 'text', proargtypes => 'text text', prosrc => 'unicode_normalize_func' }, @@ -12043,4 +12164,25 @@ proname => 'any_value_transfn', prorettype => 'anyelement', proargtypes => 'anyelement anyelement', prosrc => 'any_value_transfn' }, +{ oid => '6321', descr => 'list of available WAL summary files', + proname => 'pg_available_wal_summaries', prorows => '100', proretset => 't', + provolatile => 'v', prorettype => 'record', proargtypes => '', + proallargtypes => '{int8,pg_lsn,pg_lsn}', proargmodes => '{o,o,o}', + proargnames => '{tli,start_lsn,end_lsn}', + prosrc => 'pg_available_wal_summaries' }, +{ oid => '6322', descr => 'contents of a WAL summary file', + proname => 'pg_wal_summary_contents', prorows => '100', proretset => 't', + provolatile => 'v', prorettype => 'record', + proargtypes => 'int8 pg_lsn pg_lsn', + proallargtypes => '{int8,pg_lsn,pg_lsn,oid,oid,oid,int2,int8,bool}', + proargmodes => '{i,i,i,o,o,o,o,o,o}', + proargnames => '{tli,start_lsn,end_lsn,relfilenode,reltablespace,reldatabase,relforknumber,relblocknumber,is_limit_block}', + prosrc => 'pg_wal_summary_contents' }, +{ oid => '6323', descr => 'WAL summarizer state', + proname => 'pg_get_wal_summarizer_state', provolatile => 'v', + prorettype => 'record', proargtypes => '', + proallargtypes => '{int8,pg_lsn,pg_lsn,int4}', proargmodes => '{o,o,o,o}', + proargnames => '{summarized_tli,summarized_lsn,pending_lsn,summarizer_pid}', + prosrc => 'pg_get_wal_summarizer_state' }, + ] diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index e7abe0b497eac..51f43092415e9 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -3,7 +3,7 @@ * pg_proc.h * definition of the "procedure" system catalog (pg_proc) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_proc.h @@ -137,8 +137,11 @@ typedef FormData_pg_proc *Form_pg_proc; DECLARE_TOAST(pg_proc, 2836, 2837); -DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, ProcedureOidIndexId, on pg_proc using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, ProcedureNameArgsNspIndexId, on pg_proc using btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_proc_oid_index, 2690, ProcedureOidIndexId, pg_proc, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, ProcedureNameArgsNspIndexId, pg_proc, btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops)); + +MAKE_SYSCACHE(PROCOID, pg_proc_oid_index, 128); +MAKE_SYSCACHE(PROCNAMEARGSNSP, pg_proc_proname_args_nsp_index, 128); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h index 6ecaa2a01e73e..2f1b6abbfa7c6 100644 --- a/src/include/catalog/pg_publication.h +++ b/src/include/catalog/pg_publication.h @@ -3,7 +3,7 @@ * pg_publication.h * definition of the "publication" system catalog (pg_publication) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_publication.h @@ -63,8 +63,11 @@ CATALOG(pg_publication,6104,PublicationRelationId) */ typedef FormData_pg_publication *Form_pg_publication; -DECLARE_UNIQUE_INDEX_PKEY(pg_publication_oid_index, 6110, PublicationObjectIndexId, on pg_publication using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, PublicationNameIndexId, on pg_publication using btree(pubname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_publication_oid_index, 6110, PublicationObjectIndexId, pg_publication, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_publication_pubname_index, 6111, PublicationNameIndexId, pg_publication, btree(pubname name_ops)); + +MAKE_SYSCACHE(PUBLICATIONOID, pg_publication_oid_index, 8); +MAKE_SYSCACHE(PUBLICATIONNAME, pg_publication_pubname_index, 8); typedef struct PublicationActions { diff --git a/src/include/catalog/pg_publication_namespace.h b/src/include/catalog/pg_publication_namespace.h index f1abcb9f1694f..1cfb557684f9f 100644 --- a/src/include/catalog/pg_publication_namespace.h +++ b/src/include/catalog/pg_publication_namespace.h @@ -4,7 +4,7 @@ * definition of the system catalog for mappings between schemas and * publications (pg_publication_namespace) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_publication_namespace.h @@ -41,7 +41,10 @@ CATALOG(pg_publication_namespace,6237,PublicationNamespaceRelationId) */ typedef FormData_pg_publication_namespace *Form_pg_publication_namespace; -DECLARE_UNIQUE_INDEX_PKEY(pg_publication_namespace_oid_index, 6238, PublicationNamespaceObjectIndexId, on pg_publication_namespace using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_index, 6239, PublicationNamespacePnnspidPnpubidIndexId, on pg_publication_namespace using btree(pnnspid oid_ops, pnpubid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_publication_namespace_oid_index, 6238, PublicationNamespaceObjectIndexId, pg_publication_namespace, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_publication_namespace_pnnspid_pnpubid_index, 6239, PublicationNamespacePnnspidPnpubidIndexId, pg_publication_namespace, btree(pnnspid oid_ops, pnpubid oid_ops)); + +MAKE_SYSCACHE(PUBLICATIONNAMESPACE, pg_publication_namespace_oid_index, 64); +MAKE_SYSCACHE(PUBLICATIONNAMESPACEMAP, pg_publication_namespace_pnnspid_pnpubid_index, 64); #endif /* PG_PUBLICATION_NAMESPACE_H */ diff --git a/src/include/catalog/pg_publication_rel.h b/src/include/catalog/pg_publication_rel.h index 613e9747c2ac6..25fa630675aaa 100644 --- a/src/include/catalog/pg_publication_rel.h +++ b/src/include/catalog/pg_publication_rel.h @@ -4,7 +4,7 @@ * definition of the system catalog for mappings between relations and * publications (pg_publication_rel) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_publication_rel.h @@ -47,8 +47,11 @@ typedef FormData_pg_publication_rel *Form_pg_publication_rel; DECLARE_TOAST(pg_publication_rel, 6228, 6229); -DECLARE_UNIQUE_INDEX_PKEY(pg_publication_rel_oid_index, 6112, PublicationRelObjectIndexId, on pg_publication_rel using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, PublicationRelPrrelidPrpubidIndexId, on pg_publication_rel using btree(prrelid oid_ops, prpubid oid_ops)); -DECLARE_INDEX(pg_publication_rel_prpubid_index, 6116, PublicationRelPrpubidIndexId, on pg_publication_rel using btree(prpubid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_publication_rel_oid_index, 6112, PublicationRelObjectIndexId, pg_publication_rel, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_publication_rel_prrelid_prpubid_index, 6113, PublicationRelPrrelidPrpubidIndexId, pg_publication_rel, btree(prrelid oid_ops, prpubid oid_ops)); +DECLARE_INDEX(pg_publication_rel_prpubid_index, 6116, PublicationRelPrpubidIndexId, pg_publication_rel, btree(prpubid oid_ops)); + +MAKE_SYSCACHE(PUBLICATIONREL, pg_publication_rel_oid_index, 64); +MAKE_SYSCACHE(PUBLICATIONRELMAP, pg_publication_rel_prrelid_prpubid_index, 64); #endif /* PG_PUBLICATION_REL_H */ diff --git a/src/include/catalog/pg_range.dat b/src/include/catalog/pg_range.dat index 3d9ebbc834bbd..76ea2d949e1e9 100644 --- a/src/include/catalog/pg_range.dat +++ b/src/include/catalog/pg_range.dat @@ -3,7 +3,7 @@ # pg_range.dat # Initial contents of the pg_range system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_range.dat diff --git a/src/include/catalog/pg_range.h b/src/include/catalog/pg_range.h index d03ef18851fdd..0bd3ab688bd85 100644 --- a/src/include/catalog/pg_range.h +++ b/src/include/catalog/pg_range.h @@ -4,7 +4,7 @@ * definition of the "range type" system catalog (pg_range) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_range.h @@ -57,8 +57,11 @@ CATALOG(pg_range,3541,RangeRelationId) */ typedef FormData_pg_range *Form_pg_range; -DECLARE_UNIQUE_INDEX_PKEY(pg_range_rngtypid_index, 3542, RangeTypidIndexId, on pg_range using btree(rngtypid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_range_rngmultitypid_index, 2228, RangeMultirangeTypidIndexId, on pg_range using btree(rngmultitypid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_range_rngtypid_index, 3542, RangeTypidIndexId, pg_range, btree(rngtypid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_range_rngmultitypid_index, 2228, RangeMultirangeTypidIndexId, pg_range, btree(rngmultitypid oid_ops)); + +MAKE_SYSCACHE(RANGETYPE, pg_range_rngtypid_index, 4); +MAKE_SYSCACHE(RANGEMULTIRANGE, pg_range_rngmultitypid_index, 4); /* * prototypes for functions in pg_range.c diff --git a/src/include/catalog/pg_replication_origin.h b/src/include/catalog/pg_replication_origin.h index fa54f120e6cfc..e9bc0209c2667 100644 --- a/src/include/catalog/pg_replication_origin.h +++ b/src/include/catalog/pg_replication_origin.h @@ -4,7 +4,7 @@ * definition of the "replication origin" system catalog * (pg_replication_origin) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_replication_origin.h @@ -56,7 +56,10 @@ typedef FormData_pg_replication_origin *Form_pg_replication_origin; DECLARE_TOAST_WITH_MACRO(pg_replication_origin, 4181, 4182, PgReplicationOriginToastTable, PgReplicationOriginToastIndex); -DECLARE_UNIQUE_INDEX_PKEY(pg_replication_origin_roiident_index, 6001, ReplicationOriginIdentIndex, on pg_replication_origin using btree(roident oid_ops)); -DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, ReplicationOriginNameIndex, on pg_replication_origin using btree(roname text_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_replication_origin_roiident_index, 6001, ReplicationOriginIdentIndex, pg_replication_origin, btree(roident oid_ops)); +DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, ReplicationOriginNameIndex, pg_replication_origin, btree(roname text_ops)); + +MAKE_SYSCACHE(REPLORIGIDENT, pg_replication_origin_roiident_index, 16); +MAKE_SYSCACHE(REPLORIGNAME, pg_replication_origin_roname_index, 16); #endif /* PG_REPLICATION_ORIGIN_H */ diff --git a/src/include/catalog/pg_rewrite.h b/src/include/catalog/pg_rewrite.h index 21f24e6d7e842..e42ff73d29c32 100644 --- a/src/include/catalog/pg_rewrite.h +++ b/src/include/catalog/pg_rewrite.h @@ -7,7 +7,7 @@ * --- ie, rule names are only unique among the rules of a given table. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_rewrite.h @@ -53,7 +53,9 @@ typedef FormData_pg_rewrite *Form_pg_rewrite; DECLARE_TOAST(pg_rewrite, 2838, 2839); -DECLARE_UNIQUE_INDEX_PKEY(pg_rewrite_oid_index, 2692, RewriteOidIndexId, on pg_rewrite using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, RewriteRelRulenameIndexId, on pg_rewrite using btree(ev_class oid_ops, rulename name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_rewrite_oid_index, 2692, RewriteOidIndexId, pg_rewrite, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, RewriteRelRulenameIndexId, pg_rewrite, btree(ev_class oid_ops, rulename name_ops)); + +MAKE_SYSCACHE(RULERELNAME, pg_rewrite_rel_rulename_index, 8); #endif /* PG_REWRITE_H */ diff --git a/src/include/catalog/pg_seclabel.h b/src/include/catalog/pg_seclabel.h index 74299cf85d16d..5f6f5c9c05986 100644 --- a/src/include/catalog/pg_seclabel.h +++ b/src/include/catalog/pg_seclabel.h @@ -3,7 +3,7 @@ * pg_seclabel.h * definition of the "security label" system catalog (pg_seclabel) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_seclabel.h @@ -40,6 +40,6 @@ CATALOG(pg_seclabel,3596,SecLabelRelationId) DECLARE_TOAST(pg_seclabel, 3598, 3599); -DECLARE_UNIQUE_INDEX_PKEY(pg_seclabel_object_index, 3597, SecLabelObjectIndexId, on pg_seclabel using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops, provider text_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_seclabel_object_index, 3597, SecLabelObjectIndexId, pg_seclabel, btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops, provider text_ops)); #endif /* PG_SECLABEL_H */ diff --git a/src/include/catalog/pg_sequence.h b/src/include/catalog/pg_sequence.h index d528c9122fa01..8c3f0dd1ab897 100644 --- a/src/include/catalog/pg_sequence.h +++ b/src/include/catalog/pg_sequence.h @@ -3,7 +3,7 @@ * pg_sequence.h * definition of the "sequence" system catalog (pg_sequence) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_sequence.h @@ -39,6 +39,8 @@ CATALOG(pg_sequence,2224,SequenceRelationId) */ typedef FormData_pg_sequence *Form_pg_sequence; -DECLARE_UNIQUE_INDEX_PKEY(pg_sequence_seqrelid_index, 5002, SequenceRelidIndexId, on pg_sequence using btree(seqrelid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_sequence_seqrelid_index, 5002, SequenceRelidIndexId, pg_sequence, btree(seqrelid oid_ops)); + +MAKE_SYSCACHE(SEQRELID, pg_sequence_seqrelid_index, 32); #endif /* PG_SEQUENCE_H */ diff --git a/src/include/catalog/pg_shdepend.h b/src/include/catalog/pg_shdepend.h index 35ba911a22a98..7bd48ab97cbcc 100644 --- a/src/include/catalog/pg_shdepend.h +++ b/src/include/catalog/pg_shdepend.h @@ -13,7 +13,7 @@ * from a relation to its database. Currently, only dependencies on roles * are explicitly stored in pg_shdepend. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_shdepend.h @@ -72,7 +72,7 @@ CATALOG(pg_shdepend,1214,SharedDependRelationId) BKI_SHARED_RELATION */ typedef FormData_pg_shdepend *Form_pg_shdepend; -DECLARE_INDEX(pg_shdepend_depender_index, 1232, SharedDependDependerIndexId, on pg_shdepend using btree(dbid oid_ops, classid oid_ops, objid oid_ops, objsubid int4_ops)); -DECLARE_INDEX(pg_shdepend_reference_index, 1233, SharedDependReferenceIndexId, on pg_shdepend using btree(refclassid oid_ops, refobjid oid_ops)); +DECLARE_INDEX(pg_shdepend_depender_index, 1232, SharedDependDependerIndexId, pg_shdepend, btree(dbid oid_ops, classid oid_ops, objid oid_ops, objsubid int4_ops)); +DECLARE_INDEX(pg_shdepend_reference_index, 1233, SharedDependReferenceIndexId, pg_shdepend, btree(refclassid oid_ops, refobjid oid_ops)); #endif /* PG_SHDEPEND_H */ diff --git a/src/include/catalog/pg_shdescription.h b/src/include/catalog/pg_shdescription.h index 7b66c122244fa..c9433d229ef47 100644 --- a/src/include/catalog/pg_shdescription.h +++ b/src/include/catalog/pg_shdescription.h @@ -16,7 +16,7 @@ * across tables. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_shdescription.h @@ -57,7 +57,7 @@ typedef FormData_pg_shdescription * Form_pg_shdescription; DECLARE_TOAST_WITH_MACRO(pg_shdescription, 2846, 2847, PgShdescriptionToastTable, PgShdescriptionToastIndex); -DECLARE_UNIQUE_INDEX_PKEY(pg_shdescription_o_c_index, 2397, SharedDescriptionObjIndexId, on pg_shdescription using btree(objoid oid_ops, classoid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_shdescription_o_c_index, 2397, SharedDescriptionObjIndexId, pg_shdescription, btree(objoid oid_ops, classoid oid_ops)); /* We do not use BKI_LOOKUP here because it causes problems for genbki.pl */ DECLARE_FOREIGN_KEY((classoid), pg_class, (oid)); diff --git a/src/include/catalog/pg_shseclabel.h b/src/include/catalog/pg_shseclabel.h index 32b03de952e02..478d46969c0b8 100644 --- a/src/include/catalog/pg_shseclabel.h +++ b/src/include/catalog/pg_shseclabel.h @@ -3,7 +3,7 @@ * pg_shseclabel.h * definition of the "shared security label" system catalog (pg_shseclabel) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_shseclabel.h @@ -41,6 +41,6 @@ typedef FormData_pg_shseclabel * Form_pg_shseclabel; DECLARE_TOAST_WITH_MACRO(pg_shseclabel, 4060, 4061, PgShseclabelToastTable, PgShseclabelToastIndex); -DECLARE_UNIQUE_INDEX_PKEY(pg_shseclabel_object_index, 3593, SharedSecLabelObjectIndexId, on pg_shseclabel using btree(objoid oid_ops, classoid oid_ops, provider text_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_shseclabel_object_index, 3593, SharedSecLabelObjectIndexId, pg_shseclabel, btree(objoid oid_ops, classoid oid_ops, provider text_ops)); #endif /* PG_SHSECLABEL_H */ diff --git a/src/include/catalog/pg_statistic.h b/src/include/catalog/pg_statistic.h index 8770c5b4c60d4..041e626390a15 100644 --- a/src/include/catalog/pg_statistic.h +++ b/src/include/catalog/pg_statistic.h @@ -4,7 +4,7 @@ * definition of the "statistics" system catalog (pg_statistic) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_statistic.h @@ -136,7 +136,9 @@ typedef FormData_pg_statistic *Form_pg_statistic; DECLARE_TOAST(pg_statistic, 2840, 2841); -DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_relid_att_inh_index, 2696, StatisticRelidAttnumInhIndexId, on pg_statistic using btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_relid_att_inh_index, 2696, StatisticRelidAttnumInhIndexId, pg_statistic, btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops)); + +MAKE_SYSCACHE(STATRELATTINH, pg_statistic_relid_att_inh_index, 128); DECLARE_FOREIGN_KEY((starelid, staattnum), pg_attribute, (attrelid, attnum)); @@ -152,6 +154,9 @@ DECLARE_FOREIGN_KEY((starelid, staattnum), pg_attribute, (attrelid, attnum)); * data "kind" will appear in any particular slot. Instead, search the * stakind fields to see if the desired data is available. (The standard * function get_attstatsslot() may be used for this.) + * + * Note: The pg_stats view needs to be modified whenever a new slot kind is + * added to core. */ /* @@ -178,7 +183,7 @@ DECLARE_FOREIGN_KEY((starelid, staattnum), pg_attribute, (attrelid, attnum)); * the K most common non-null values appearing in the column, and stanumbers * contains their frequencies (fractions of total row count). The values * shall be ordered in decreasing frequency. Note that since the arrays are - * variable-size, K may be chosen by the statistics collector. Values should + * variable-size, K may be chosen may be chosen at ANALYZE time. Values should * not appear in MCV unless they have been observed to occur more than once; * a unique column will have no MCV slot. */ @@ -262,7 +267,8 @@ DECLARE_FOREIGN_KEY((starelid, staattnum), pg_attribute, (attrelid, attnum)); * a format similar to STATISTIC_KIND_HISTOGRAM: it contains M (>=2) range * values that divide the column data values into M-1 bins of approximately * equal population. The lengths are stored as float8s, as measured by the - * range type's subdiff function. Only non-null rows are considered. + * range type's subdiff function. Only non-null, non-empty rows are + * considered. */ #define STATISTIC_KIND_RANGE_LENGTH_HISTOGRAM 6 diff --git a/src/include/catalog/pg_statistic_ext.h b/src/include/catalog/pg_statistic_ext.h index 53eec9025a52e..50a5c021edf53 100644 --- a/src/include/catalog/pg_statistic_ext.h +++ b/src/include/catalog/pg_statistic_ext.h @@ -8,7 +8,7 @@ * objects, created by CREATE STATISTICS, but not the actual statistical data, * created by running ANALYZE. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_statistic_ext.h @@ -43,15 +43,15 @@ CATALOG(pg_statistic_ext,3381,StatisticExtRelationId) * object's namespace */ Oid stxowner BKI_LOOKUP(pg_authid); /* statistics object's owner */ - int32 stxstattarget BKI_DEFAULT(-1); /* statistics target */ /* - * variable-length fields start here, but we allow direct access to - * stxkeys + * variable-length/nullable fields start here, but we allow direct access + * to stxkeys */ int2vector stxkeys BKI_FORCE_NOT_NULL; /* array of column keys */ #ifdef CATALOG_VARLEN + int16 stxstattarget BKI_DEFAULT(_null_) BKI_FORCE_NULL; /* statistics target */ char stxkind[1] BKI_FORCE_NOT_NULL; /* statistics kinds requested * to build */ pg_node_tree stxexprs; /* A list of expression trees for stats @@ -70,9 +70,12 @@ typedef FormData_pg_statistic_ext *Form_pg_statistic_ext; DECLARE_TOAST(pg_statistic_ext, 3439, 3440); -DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_oid_index, 3380, StatisticExtOidIndexId, on pg_statistic_ext using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, StatisticExtNameIndexId, on pg_statistic_ext using btree(stxname name_ops, stxnamespace oid_ops)); -DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, StatisticExtRelidIndexId, on pg_statistic_ext using btree(stxrelid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_oid_index, 3380, StatisticExtOidIndexId, pg_statistic_ext, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, StatisticExtNameIndexId, pg_statistic_ext, btree(stxname name_ops, stxnamespace oid_ops)); +DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, StatisticExtRelidIndexId, pg_statistic_ext, btree(stxrelid oid_ops)); + +MAKE_SYSCACHE(STATEXTOID, pg_statistic_ext_oid_index, 4); +MAKE_SYSCACHE(STATEXTNAMENSP, pg_statistic_ext_name_index, 4); DECLARE_ARRAY_FOREIGN_KEY((stxrelid, stxkeys), pg_attribute, (attrelid, attnum)); diff --git a/src/include/catalog/pg_statistic_ext_data.h b/src/include/catalog/pg_statistic_ext_data.h index 64d11a9c58c12..18b00ce8b526a 100644 --- a/src/include/catalog/pg_statistic_ext_data.h +++ b/src/include/catalog/pg_statistic_ext_data.h @@ -6,7 +6,7 @@ * * This catalog stores the statistical data for extended statistics objects. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_statistic_ext_data.h @@ -54,7 +54,8 @@ typedef FormData_pg_statistic_ext_data *Form_pg_statistic_ext_data; DECLARE_TOAST(pg_statistic_ext_data, 3430, 3431); -DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_data_stxoid_inh_index, 3433, StatisticExtDataStxoidInhIndexId, on pg_statistic_ext_data using btree(stxoid oid_ops, stxdinherit bool_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_statistic_ext_data_stxoid_inh_index, 3433, StatisticExtDataStxoidInhIndexId, pg_statistic_ext_data, btree(stxoid oid_ops, stxdinherit bool_ops)); +MAKE_SYSCACHE(STATEXTDATASTXOID, pg_statistic_ext_data_stxoid_inh_index, 4); #endif /* PG_STATISTIC_EXT_DATA_H */ diff --git a/src/include/catalog/pg_subscription.h b/src/include/catalog/pg_subscription.h index 1d40eebc78966..0aa14ec4a27ed 100644 --- a/src/include/catalog/pg_subscription.h +++ b/src/include/catalog/pg_subscription.h @@ -3,7 +3,7 @@ * pg_subscription.h * definition of the "subscription" system catalog (pg_subscription) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_subscription.h @@ -93,6 +93,11 @@ CATALOG(pg_subscription,6100,SubscriptionRelationId) BKI_SHARED_RELATION BKI_ROW bool subrunasowner; /* True if replication should execute as the * subscription owner */ + bool subfailover; /* True if the associated replication slots + * (i.e. the main slot and the table sync + * slots) in the upstream database are enabled + * to be synchronized to the standbys. */ + #ifdef CATALOG_VARLEN /* variable-length fields start here */ /* Connection string to the publisher */ text subconninfo BKI_FORCE_NOT_NULL; @@ -115,8 +120,11 @@ typedef FormData_pg_subscription *Form_pg_subscription; DECLARE_TOAST_WITH_MACRO(pg_subscription, 4183, 4184, PgSubscriptionToastTable, PgSubscriptionToastIndex); -DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_oid_index, 6114, SubscriptionObjectIndexId, on pg_subscription using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, SubscriptionNameIndexId, on pg_subscription using btree(subdbid oid_ops, subname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_oid_index, 6114, SubscriptionObjectIndexId, pg_subscription, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_subscription_subname_index, 6115, SubscriptionNameIndexId, pg_subscription, btree(subdbid oid_ops, subname name_ops)); + +MAKE_SYSCACHE(SUBSCRIPTIONOID, pg_subscription_oid_index, 4); +MAKE_SYSCACHE(SUBSCRIPTIONNAME, pg_subscription_subname_index, 4); typedef struct Subscription { @@ -127,6 +135,7 @@ typedef struct Subscription * skipped */ char *name; /* Name of the subscription */ Oid owner; /* Oid of the subscription owner */ + bool ownersuperuser; /* Is the subscription owner a superuser? */ bool enabled; /* Indicates if the subscription is enabled */ bool binary; /* Indicates if the subscription wants data in * binary format */ @@ -138,6 +147,10 @@ typedef struct Subscription * occurs */ bool passwordrequired; /* Must connection use a password? */ bool runasowner; /* Run replication as subscription owner */ + bool failover; /* True if the associated replication slots + * (i.e. the main slot and the table sync + * slots) in the upstream database are enabled + * to be synchronized to the standbys. */ char *conninfo; /* Connection string to the publisher */ char *slotname; /* Name of the replication slot */ char *synccommit; /* Synchronous commit setting for worker */ diff --git a/src/include/catalog/pg_subscription_rel.h b/src/include/catalog/pg_subscription_rel.h index 60a2bcca2382f..8244ad537aea9 100644 --- a/src/include/catalog/pg_subscription_rel.h +++ b/src/include/catalog/pg_subscription_rel.h @@ -4,7 +4,7 @@ * definition of the system catalog containing the state for each * replicated table in each subscription (pg_subscription_rel) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_subscription_rel.h @@ -49,7 +49,9 @@ CATALOG(pg_subscription_rel,6102,SubscriptionRelRelationId) typedef FormData_pg_subscription_rel *Form_pg_subscription_rel; -DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, SubscriptionRelSrrelidSrsubidIndexId, on pg_subscription_rel using btree(srrelid oid_ops, srsubid oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_subscription_rel_srrelid_srsubid_index, 6117, SubscriptionRelSrrelidSrsubidIndexId, pg_subscription_rel, btree(srrelid oid_ops, srsubid oid_ops)); + +MAKE_SYSCACHE(SUBSCRIPTIONRELMAP, pg_subscription_rel_srrelid_srsubid_index, 64); #ifdef EXPOSE_TO_CLIENT_CODE @@ -81,7 +83,7 @@ typedef struct SubscriptionRelState } SubscriptionRelState; extern void AddSubscriptionRelState(Oid subid, Oid relid, char state, - XLogRecPtr sublsn); + XLogRecPtr sublsn, bool retain_lock); extern void UpdateSubscriptionRelState(Oid subid, Oid relid, char state, XLogRecPtr sublsn); extern char GetSubscriptionRelState(Oid subid, Oid relid, XLogRecPtr *sublsn); diff --git a/src/include/catalog/pg_tablespace.dat b/src/include/catalog/pg_tablespace.dat index 9fbc98a44def0..fbd396387c74e 100644 --- a/src/include/catalog/pg_tablespace.dat +++ b/src/include/catalog/pg_tablespace.dat @@ -3,7 +3,7 @@ # pg_tablespace.dat # Initial contents of the pg_tablespace system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_tablespace.dat diff --git a/src/include/catalog/pg_tablespace.h b/src/include/catalog/pg_tablespace.h index ea1593d874eaf..6b9bdcf8b05ec 100644 --- a/src/include/catalog/pg_tablespace.h +++ b/src/include/catalog/pg_tablespace.h @@ -4,7 +4,7 @@ * definition of the "tablespace" system catalog (pg_tablespace) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_tablespace.h @@ -49,7 +49,9 @@ typedef FormData_pg_tablespace *Form_pg_tablespace; DECLARE_TOAST_WITH_MACRO(pg_tablespace, 4185, 4186, PgTablespaceToastTable, PgTablespaceToastIndex); -DECLARE_UNIQUE_INDEX_PKEY(pg_tablespace_oid_index, 2697, TablespaceOidIndexId, on pg_tablespace using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index, 2698, TablespaceNameIndexId, on pg_tablespace using btree(spcname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_tablespace_oid_index, 2697, TablespaceOidIndexId, pg_tablespace, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index, 2698, TablespaceNameIndexId, pg_tablespace, btree(spcname name_ops)); + +MAKE_SYSCACHE(TABLESPACEOID, pg_tablespace_oid_index, 4); #endif /* PG_TABLESPACE_H */ diff --git a/src/include/catalog/pg_transform.h b/src/include/catalog/pg_transform.h index 6273b0a4912e4..3b69960af6046 100644 --- a/src/include/catalog/pg_transform.h +++ b/src/include/catalog/pg_transform.h @@ -4,7 +4,7 @@ * definition of the "transform" system catalog (pg_transform) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_transform.h @@ -42,7 +42,10 @@ CATALOG(pg_transform,3576,TransformRelationId) */ typedef FormData_pg_transform *Form_pg_transform; -DECLARE_UNIQUE_INDEX_PKEY(pg_transform_oid_index, 3574, TransformOidIndexId, on pg_transform using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, TransformTypeLangIndexId, on pg_transform using btree(trftype oid_ops, trflang oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_transform_oid_index, 3574, TransformOidIndexId, pg_transform, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, TransformTypeLangIndexId, pg_transform, btree(trftype oid_ops, trflang oid_ops)); + +MAKE_SYSCACHE(TRFOID, pg_transform_oid_index, 16); +MAKE_SYSCACHE(TRFTYPELANG, pg_transform_type_lang_index, 16); #endif /* PG_TRANSFORM_H */ diff --git a/src/include/catalog/pg_trigger.h b/src/include/catalog/pg_trigger.h index 3679b0395f668..7fdff16118405 100644 --- a/src/include/catalog/pg_trigger.h +++ b/src/include/catalog/pg_trigger.h @@ -4,7 +4,7 @@ * definition of the "trigger" system catalog (pg_trigger) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_trigger.h @@ -81,9 +81,9 @@ typedef FormData_pg_trigger *Form_pg_trigger; DECLARE_TOAST(pg_trigger, 2336, 2337); -DECLARE_INDEX(pg_trigger_tgconstraint_index, 2699, TriggerConstraintIndexId, on pg_trigger using btree(tgconstraint oid_ops)); -DECLARE_UNIQUE_INDEX(pg_trigger_tgrelid_tgname_index, 2701, TriggerRelidNameIndexId, on pg_trigger using btree(tgrelid oid_ops, tgname name_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_trigger_oid_index, 2702, TriggerOidIndexId, on pg_trigger using btree(oid oid_ops)); +DECLARE_INDEX(pg_trigger_tgconstraint_index, 2699, TriggerConstraintIndexId, pg_trigger, btree(tgconstraint oid_ops)); +DECLARE_UNIQUE_INDEX(pg_trigger_tgrelid_tgname_index, 2701, TriggerRelidNameIndexId, pg_trigger, btree(tgrelid oid_ops, tgname name_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_trigger_oid_index, 2702, TriggerOidIndexId, pg_trigger, btree(oid oid_ops)); DECLARE_ARRAY_FOREIGN_KEY((tgrelid, tgattr), pg_attribute, (attrelid, attnum)); diff --git a/src/include/catalog/pg_ts_config.dat b/src/include/catalog/pg_ts_config.dat index 7958d470bb169..949a73be243df 100644 --- a/src/include/catalog/pg_ts_config.dat +++ b/src/include/catalog/pg_ts_config.dat @@ -3,7 +3,7 @@ # pg_ts_config.dat # Initial contents of the pg_ts_config system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_ts_config.dat diff --git a/src/include/catalog/pg_ts_config.h b/src/include/catalog/pg_ts_config.h index aee0bf71af5b5..fc0bf447b1d07 100644 --- a/src/include/catalog/pg_ts_config.h +++ b/src/include/catalog/pg_ts_config.h @@ -5,7 +5,7 @@ * (pg_ts_config) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_ts_config.h @@ -47,7 +47,10 @@ CATALOG(pg_ts_config,3602,TSConfigRelationId) typedef FormData_pg_ts_config *Form_pg_ts_config; -DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, TSConfigNameNspIndexId, on pg_ts_config using btree(cfgname name_ops, cfgnamespace oid_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_oid_index, 3712, TSConfigOidIndexId, on pg_ts_config using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, TSConfigNameNspIndexId, pg_ts_config, btree(cfgname name_ops, cfgnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_oid_index, 3712, TSConfigOidIndexId, pg_ts_config, btree(oid oid_ops)); + +MAKE_SYSCACHE(TSCONFIGNAMENSP, pg_ts_config_cfgname_index, 2); +MAKE_SYSCACHE(TSCONFIGOID, pg_ts_config_oid_index, 2); #endif /* PG_TS_CONFIG_H */ diff --git a/src/include/catalog/pg_ts_config_map.dat b/src/include/catalog/pg_ts_config_map.dat index 801678b4af353..37bd2c98598a1 100644 --- a/src/include/catalog/pg_ts_config_map.dat +++ b/src/include/catalog/pg_ts_config_map.dat @@ -3,7 +3,7 @@ # pg_ts_config_map.dat # Initial contents of the pg_ts_config_map system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_ts_config_map.dat diff --git a/src/include/catalog/pg_ts_config_map.h b/src/include/catalog/pg_ts_config_map.h index 359368ecd612a..efced44941dd6 100644 --- a/src/include/catalog/pg_ts_config_map.h +++ b/src/include/catalog/pg_ts_config_map.h @@ -5,7 +5,7 @@ * (pg_ts_config_map) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_ts_config_map.h @@ -44,6 +44,8 @@ CATALOG(pg_ts_config_map,3603,TSConfigMapRelationId) typedef FormData_pg_ts_config_map *Form_pg_ts_config_map; -DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_map_index, 3609, TSConfigMapIndexId, on pg_ts_config_map using btree(mapcfg oid_ops, maptokentype int4_ops, mapseqno int4_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_ts_config_map_index, 3609, TSConfigMapIndexId, pg_ts_config_map, btree(mapcfg oid_ops, maptokentype int4_ops, mapseqno int4_ops)); + +MAKE_SYSCACHE(TSCONFIGMAP, pg_ts_config_map_index, 2); #endif /* PG_TS_CONFIG_MAP_H */ diff --git a/src/include/catalog/pg_ts_dict.dat b/src/include/catalog/pg_ts_dict.dat index 9ca7377f0a630..ec2ca6bc1f323 100644 --- a/src/include/catalog/pg_ts_dict.dat +++ b/src/include/catalog/pg_ts_dict.dat @@ -3,7 +3,7 @@ # pg_ts_dict.dat # Initial contents of the pg_ts_dict system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_ts_dict.dat diff --git a/src/include/catalog/pg_ts_dict.h b/src/include/catalog/pg_ts_dict.h index 476325f0107ce..1320468de0e1d 100644 --- a/src/include/catalog/pg_ts_dict.h +++ b/src/include/catalog/pg_ts_dict.h @@ -4,7 +4,7 @@ * definition of the "text search dictionary" system catalog (pg_ts_dict) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_ts_dict.h @@ -53,7 +53,10 @@ typedef FormData_pg_ts_dict *Form_pg_ts_dict; DECLARE_TOAST(pg_ts_dict, 4169, 4170); -DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, TSDictionaryNameNspIndexId, on pg_ts_dict using btree(dictname name_ops, dictnamespace oid_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_ts_dict_oid_index, 3605, TSDictionaryOidIndexId, on pg_ts_dict using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, TSDictionaryNameNspIndexId, pg_ts_dict, btree(dictname name_ops, dictnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_ts_dict_oid_index, 3605, TSDictionaryOidIndexId, pg_ts_dict, btree(oid oid_ops)); + +MAKE_SYSCACHE(TSDICTNAMENSP, pg_ts_dict_dictname_index, 2); +MAKE_SYSCACHE(TSDICTOID, pg_ts_dict_oid_index, 2); #endif /* PG_TS_DICT_H */ diff --git a/src/include/catalog/pg_ts_parser.dat b/src/include/catalog/pg_ts_parser.dat index abf001e48ed05..4b838362198c6 100644 --- a/src/include/catalog/pg_ts_parser.dat +++ b/src/include/catalog/pg_ts_parser.dat @@ -3,7 +3,7 @@ # pg_ts_parser.dat # Initial contents of the pg_ts_parser system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_ts_parser.dat diff --git a/src/include/catalog/pg_ts_parser.h b/src/include/catalog/pg_ts_parser.h index 283de252b4617..909644c96f2ec 100644 --- a/src/include/catalog/pg_ts_parser.h +++ b/src/include/catalog/pg_ts_parser.h @@ -4,7 +4,7 @@ * definition of the "text search parser" system catalog (pg_ts_parser) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_ts_parser.h @@ -54,7 +54,10 @@ CATALOG(pg_ts_parser,3601,TSParserRelationId) typedef FormData_pg_ts_parser *Form_pg_ts_parser; -DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, TSParserNameNspIndexId, on pg_ts_parser using btree(prsname name_ops, prsnamespace oid_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_ts_parser_oid_index, 3607, TSParserOidIndexId, on pg_ts_parser using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, TSParserNameNspIndexId, pg_ts_parser, btree(prsname name_ops, prsnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_ts_parser_oid_index, 3607, TSParserOidIndexId, pg_ts_parser, btree(oid oid_ops)); + +MAKE_SYSCACHE(TSPARSERNAMENSP, pg_ts_parser_prsname_index, 2); +MAKE_SYSCACHE(TSPARSEROID, pg_ts_parser_oid_index, 2); #endif /* PG_TS_PARSER_H */ diff --git a/src/include/catalog/pg_ts_template.dat b/src/include/catalog/pg_ts_template.dat index 8fe5556e24e59..a7ff957396f24 100644 --- a/src/include/catalog/pg_ts_template.dat +++ b/src/include/catalog/pg_ts_template.dat @@ -3,7 +3,7 @@ # pg_ts_template.dat # Initial contents of the pg_ts_template system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_ts_template.dat diff --git a/src/include/catalog/pg_ts_template.h b/src/include/catalog/pg_ts_template.h index f4e510c8f91b2..0562a4a7583b9 100644 --- a/src/include/catalog/pg_ts_template.h +++ b/src/include/catalog/pg_ts_template.h @@ -4,7 +4,7 @@ * definition of the "text search template" system catalog (pg_ts_template) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_ts_template.h @@ -45,7 +45,10 @@ CATALOG(pg_ts_template,3764,TSTemplateRelationId) typedef FormData_pg_ts_template *Form_pg_ts_template; -DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, TSTemplateNameNspIndexId, on pg_ts_template using btree(tmplname name_ops, tmplnamespace oid_ops)); -DECLARE_UNIQUE_INDEX_PKEY(pg_ts_template_oid_index, 3767, TSTemplateOidIndexId, on pg_ts_template using btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, TSTemplateNameNspIndexId, pg_ts_template, btree(tmplname name_ops, tmplnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_ts_template_oid_index, 3767, TSTemplateOidIndexId, pg_ts_template, btree(oid oid_ops)); + +MAKE_SYSCACHE(TSTEMPLATENAMENSP, pg_ts_template_tmplname_index, 2); +MAKE_SYSCACHE(TSTEMPLATEOID, pg_ts_template_oid_index, 2); #endif /* PG_TS_TEMPLATE_H */ diff --git a/src/include/catalog/pg_type.dat b/src/include/catalog/pg_type.dat index 92bcaf2c73a53..ceff66ccde1aa 100644 --- a/src/include/catalog/pg_type.dat +++ b/src/include/catalog/pg_type.dat @@ -3,7 +3,7 @@ # pg_type.dat # Initial contents of the pg_type system catalog. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/pg_type.dat @@ -32,7 +32,7 @@ # OIDS 1 - 99 { oid => '16', array_type_oid => '1000', - descr => 'boolean, \'true\'/\'false\'', + descr => 'boolean, format \'t\'/\'f\'', typname => 'bool', typlen => '1', typbyval => 't', typcategory => 'B', typispreferred => 't', typinput => 'boolin', typoutput => 'boolout', typreceive => 'boolrecv', typsend => 'boolsend', typalign => 'c' }, @@ -90,7 +90,7 @@ typispreferred => 't', typinput => 'oidin', typoutput => 'oidout', typreceive => 'oidrecv', typsend => 'oidsend', typalign => 'i' }, { oid => '27', array_type_oid => '1010', - descr => '(block, offset), physical location of tuple', + descr => 'tuple physical location, format \'(block,offset)\'', typname => 'tid', typlen => '6', typbyval => 'f', typcategory => 'U', typinput => 'tidin', typoutput => 'tidout', typreceive => 'tidrecv', typsend => 'tidsend', typalign => 's' }, @@ -179,34 +179,35 @@ # OIDS 600 - 699 { oid => '600', array_type_oid => '1017', - descr => 'geometric point \'(x, y)\'', + descr => 'geometric point, format \'(x,y)\'', typname => 'point', typlen => '16', typbyval => 'f', typcategory => 'G', typsubscript => 'raw_array_subscript_handler', typelem => 'float8', typinput => 'point_in', typoutput => 'point_out', typreceive => 'point_recv', typsend => 'point_send', typalign => 'd' }, { oid => '601', array_type_oid => '1018', - descr => 'geometric line segment \'(pt1,pt2)\'', + descr => 'geometric line segment, format \'[point1,point2]\'', typname => 'lseg', typlen => '32', typbyval => 'f', typcategory => 'G', typsubscript => 'raw_array_subscript_handler', typelem => 'point', typinput => 'lseg_in', typoutput => 'lseg_out', typreceive => 'lseg_recv', typsend => 'lseg_send', typalign => 'd' }, { oid => '602', array_type_oid => '1019', - descr => 'geometric path \'(pt1,...)\'', + descr => 'geometric path, format \'(point1,...)\'', typname => 'path', typlen => '-1', typbyval => 'f', typcategory => 'G', typinput => 'path_in', typoutput => 'path_out', typreceive => 'path_recv', typsend => 'path_send', typalign => 'd', typstorage => 'x' }, { oid => '603', array_type_oid => '1020', - descr => 'geometric box \'(lower left,upper right)\'', + descr => 'geometric box, format \'lower left point,upper right point\'', typname => 'box', typlen => '32', typbyval => 'f', typcategory => 'G', typdelim => ';', typsubscript => 'raw_array_subscript_handler', typelem => 'point', typinput => 'box_in', typoutput => 'box_out', typreceive => 'box_recv', typsend => 'box_send', typalign => 'd' }, { oid => '604', array_type_oid => '1027', - descr => 'geometric polygon \'(pt1,...)\'', + descr => 'geometric polygon, format \'(point1,...)\'', typname => 'polygon', typlen => '-1', typbyval => 'f', typcategory => 'G', typinput => 'poly_in', typoutput => 'poly_out', typreceive => 'poly_recv', typsend => 'poly_send', typalign => 'd', typstorage => 'x' }, -{ oid => '628', array_type_oid => '629', descr => 'geometric line', +{ oid => '628', array_type_oid => '629', + descr => 'geometric line, formats \'{A,B,C}\'/\'[point1,point2]\'', typname => 'line', typlen => '24', typbyval => 'f', typcategory => 'G', typsubscript => 'raw_array_subscript_handler', typelem => 'float8', typinput => 'line_in', typoutput => 'line_out', typreceive => 'line_recv', @@ -230,7 +231,7 @@ typcategory => 'X', typinput => 'unknownin', typoutput => 'unknownout', typreceive => 'unknownrecv', typsend => 'unknownsend', typalign => 'c' }, { oid => '718', array_type_oid => '719', - descr => 'geometric circle \'(center,radius)\'', + descr => 'geometric circle, format \'
\'', typname => 'circle', typlen => '24', typbyval => 'f', typcategory => 'G', typinput => 'circle_in', typoutput => 'circle_out', typreceive => 'circle_recv', typsend => 'circle_send', typalign => 'd' }, @@ -271,14 +272,14 @@ typinput => 'aclitemin', typoutput => 'aclitemout', typreceive => '-', typsend => '-', typalign => 'd' }, { oid => '1042', array_type_oid => '1014', - descr => 'char(length), blank-padded string, fixed storage length', + descr => '\'char(length)\' blank-padded string, fixed storage length', typname => 'bpchar', typlen => '-1', typbyval => 'f', typcategory => 'S', typinput => 'bpcharin', typoutput => 'bpcharout', typreceive => 'bpcharrecv', typsend => 'bpcharsend', typmodin => 'bpchartypmodin', typmodout => 'bpchartypmodout', typalign => 'i', typstorage => 'x', typcollation => 'default' }, { oid => '1043', array_type_oid => '1015', - descr => 'varchar(length), non-blank-padded string, variable storage length', + descr => '\'varchar(length)\' non-blank-padded string, variable storage length', typname => 'varchar', typlen => '-1', typbyval => 'f', typcategory => 'S', typinput => 'varcharin', typoutput => 'varcharout', typreceive => 'varcharrecv', typsend => 'varcharsend', @@ -310,7 +311,7 @@ typsend => 'timestamptz_send', typmodin => 'timestamptztypmodin', typmodout => 'timestamptztypmodout', typalign => 'd' }, { oid => '1186', array_type_oid => '1187', - descr => '@ , time interval', + descr => 'time interval, format \'number units ...\'', typname => 'interval', typlen => '16', typbyval => 'f', typcategory => 'T', typispreferred => 't', typinput => 'interval_in', typoutput => 'interval_out', typreceive => 'interval_recv', typsend => 'interval_send', @@ -345,7 +346,7 @@ # OIDS 1700 - 1799 { oid => '1700', array_type_oid => '1231', - descr => 'numeric(precision, decimal), arbitrary precision number', + descr => '\'numeric(precision, scale)\' arbitrary precision number', typname => 'numeric', typlen => '-1', typbyval => 'f', typcategory => 'N', typinput => 'numeric_in', typoutput => 'numeric_out', typreceive => 'numeric_recv', typsend => 'numeric_send', @@ -400,13 +401,13 @@ typalign => 'i' }, # uuid -{ oid => '2950', array_type_oid => '2951', descr => 'UUID datatype', +{ oid => '2950', array_type_oid => '2951', descr => 'UUID', typname => 'uuid', typlen => '16', typbyval => 'f', typcategory => 'U', typinput => 'uuid_in', typoutput => 'uuid_out', typreceive => 'uuid_recv', typsend => 'uuid_send', typalign => 'c' }, # pg_lsn -{ oid => '3220', array_type_oid => '3221', descr => 'PostgreSQL LSN datatype', +{ oid => '3220', array_type_oid => '3221', descr => 'PostgreSQL LSN', typname => 'pg_lsn', typlen => '8', typbyval => 'FLOAT8PASSBYVAL', typcategory => 'U', typinput => 'pg_lsn_in', typoutput => 'pg_lsn_out', typreceive => 'pg_lsn_recv', typsend => 'pg_lsn_send', typalign => 'd' }, @@ -452,12 +453,12 @@ typreceive => 'jsonpath_recv', typsend => 'jsonpath_send', typalign => 'i', typstorage => 'x' }, -{ oid => '2970', array_type_oid => '2949', descr => 'txid snapshot', +{ oid => '2970', array_type_oid => '2949', descr => 'transaction snapshot', typname => 'txid_snapshot', typlen => '-1', typbyval => 'f', typcategory => 'U', typinput => 'txid_snapshot_in', typoutput => 'txid_snapshot_out', typreceive => 'txid_snapshot_recv', typsend => 'txid_snapshot_send', typalign => 'd', typstorage => 'x' }, -{ oid => '5038', array_type_oid => '5039', descr => 'snapshot', +{ oid => '5038', array_type_oid => '5039', descr => 'transaction snapshot', typname => 'pg_snapshot', typlen => '-1', typbyval => 'f', typcategory => 'U', typinput => 'pg_snapshot_in', typoutput => 'pg_snapshot_out', typreceive => 'pg_snapshot_recv', typsend => 'pg_snapshot_send', @@ -633,6 +634,7 @@ typoutput => 'tsm_handler_out', typreceive => '-', typsend => '-', typalign => 'i' }, { oid => '269', + descr => 'pseudo-type for the result of a table AM handler function', typname => 'table_am_handler', typlen => '4', typbyval => 't', typtype => 'p', typcategory => 'P', typinput => 'table_am_handler_in', typoutput => 'table_am_handler_out', typreceive => '-', typsend => '-', @@ -679,13 +681,14 @@ typtype => 'p', typcategory => 'P', typinput => 'anycompatiblemultirange_in', typoutput => 'anycompatiblemultirange_out', typreceive => '-', typsend => '-', typalign => 'd', typstorage => 'x' }, -{ oid => '4600', descr => 'BRIN bloom summary', +{ oid => '4600', descr => 'pseudo-type representing BRIN bloom summary', typname => 'pg_brin_bloom_summary', typlen => '-1', typbyval => 'f', typcategory => 'Z', typinput => 'brin_bloom_summary_in', typoutput => 'brin_bloom_summary_out', typreceive => 'brin_bloom_summary_recv', typsend => 'brin_bloom_summary_send', typalign => 'i', typstorage => 'x', typcollation => 'default' }, -{ oid => '4601', descr => 'BRIN minmax-multi summary', +{ oid => '4601', + descr => 'pseudo-type representing BRIN minmax-multi summary', typname => 'pg_brin_minmax_multi_summary', typlen => '-1', typbyval => 'f', typcategory => 'Z', typinput => 'brin_minmax_multi_summary_in', typoutput => 'brin_minmax_multi_summary_out', diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h index 519e570c8cedb..e9259697321da 100644 --- a/src/include/catalog/pg_type.h +++ b/src/include/catalog/pg_type.h @@ -4,7 +4,7 @@ * definition of the "type" system catalog (pg_type) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_type.h @@ -262,8 +262,11 @@ typedef FormData_pg_type *Form_pg_type; DECLARE_TOAST(pg_type, 4171, 4172); -DECLARE_UNIQUE_INDEX_PKEY(pg_type_oid_index, 2703, TypeOidIndexId, on pg_type using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, TypeNameNspIndexId, on pg_type using btree(typname name_ops, typnamespace oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_type_oid_index, 2703, TypeOidIndexId, pg_type, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, TypeNameNspIndexId, pg_type, btree(typname name_ops, typnamespace oid_ops)); + +MAKE_SYSCACHE(TYPEOID, pg_type_oid_index, 64); +MAKE_SYSCACHE(TYPENAMENSP, pg_type_typname_nsp_index, 64); #ifdef EXPOSE_TO_CLIENT_CODE diff --git a/src/include/catalog/pg_user_mapping.h b/src/include/catalog/pg_user_mapping.h index 528c94a7c4bed..3632448cce0b0 100644 --- a/src/include/catalog/pg_user_mapping.h +++ b/src/include/catalog/pg_user_mapping.h @@ -3,7 +3,7 @@ * pg_user_mapping.h * definition of the "user mapping" system catalog (pg_user_mapping) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/pg_user_mapping.h @@ -49,7 +49,10 @@ typedef FormData_pg_user_mapping *Form_pg_user_mapping; DECLARE_TOAST(pg_user_mapping, 4173, 4174); -DECLARE_UNIQUE_INDEX_PKEY(pg_user_mapping_oid_index, 174, UserMappingOidIndexId, on pg_user_mapping using btree(oid oid_ops)); -DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, UserMappingUserServerIndexId, on pg_user_mapping using btree(umuser oid_ops, umserver oid_ops)); +DECLARE_UNIQUE_INDEX_PKEY(pg_user_mapping_oid_index, 174, UserMappingOidIndexId, pg_user_mapping, btree(oid oid_ops)); +DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, UserMappingUserServerIndexId, pg_user_mapping, btree(umuser oid_ops, umserver oid_ops)); + +MAKE_SYSCACHE(USERMAPPINGOID, pg_user_mapping_oid_index, 2); +MAKE_SYSCACHE(USERMAPPINGUSERSERVER, pg_user_mapping_user_server_index, 2); #endif /* PG_USER_MAPPING_H */ diff --git a/src/include/catalog/reformat_dat_file.pl b/src/include/catalog/reformat_dat_file.pl index 725117d846c5b..838cd0af73946 100755 --- a/src/include/catalog/reformat_dat_file.pl +++ b/src/include/catalog/reformat_dat_file.pl @@ -10,7 +10,7 @@ # in the same order as the columns of the corresponding catalog. # Comments and blank lines are preserved. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/reformat_dat_file.pl @@ -18,7 +18,7 @@ #---------------------------------------------------------------------- use strict; -use warnings; +use warnings FATAL => 'all'; use FindBin; use Getopt::Long; diff --git a/src/include/catalog/renumber_oids.pl b/src/include/catalog/renumber_oids.pl index ec09584959826..b20a2efada862 100755 --- a/src/include/catalog/renumber_oids.pl +++ b/src/include/catalog/renumber_oids.pl @@ -8,7 +8,7 @@ # Note: This does not reformat the .dat files, so you may want # to run reformat_dat_file.pl afterwards. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/renumber_oids.pl @@ -16,7 +16,7 @@ #---------------------------------------------------------------------- use strict; -use warnings; +use warnings FATAL => 'all'; use FindBin; use Getopt::Long; diff --git a/src/include/catalog/storage.h b/src/include/catalog/storage.h index 45a3c7835cb03..72ef3ee92c012 100644 --- a/src/include/catalog/storage.h +++ b/src/include/catalog/storage.h @@ -4,7 +4,7 @@ * prototypes for functions in backend/catalog/storage.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/storage.h diff --git a/src/include/catalog/storage_xlog.h b/src/include/catalog/storage_xlog.h index 6b0a7aa3dfa20..a490e05f88401 100644 --- a/src/include/catalog/storage_xlog.h +++ b/src/include/catalog/storage_xlog.h @@ -4,7 +4,7 @@ * prototypes for XLog support for backend/catalog/storage.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/storage_xlog.h diff --git a/src/include/catalog/toasting.h b/src/include/catalog/toasting.h index 5880ec675242e..725f31617bbe0 100644 --- a/src/include/catalog/toasting.h +++ b/src/include/catalog/toasting.h @@ -4,7 +4,7 @@ * This file provides some definitions to support creation of toast tables * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/catalog/toasting.h diff --git a/src/include/catalog/unused_oids b/src/include/catalog/unused_oids index ccf3c3f78126f..32f3ca32b43ed 100755 --- a/src/include/catalog/unused_oids +++ b/src/include/catalog/unused_oids @@ -11,7 +11,7 @@ # to take over what was intended as expansion space for something # else. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/include/catalog/unused_oids @@ -19,7 +19,7 @@ #---------------------------------------------------------------------- use strict; -use warnings; +use warnings FATAL => 'all'; # Must run in src/include/catalog use FindBin; diff --git a/src/include/commands/alter.h b/src/include/commands/alter.h index ae79968fadda7..f00af75befff1 100644 --- a/src/include/commands/alter.h +++ b/src/include/commands/alter.h @@ -4,7 +4,7 @@ * prototypes for commands/alter.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/alter.h @@ -17,7 +17,6 @@ #include "catalog/dependency.h" #include "catalog/objectaddress.h" #include "nodes/parsenodes.h" -#include "utils/relcache.h" extern ObjectAddress ExecRenameStmt(RenameStmt *stmt); @@ -29,7 +28,7 @@ extern Oid AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid, ObjectAddresses *objsMoved); extern ObjectAddress ExecAlterOwnerStmt(AlterOwnerStmt *stmt); -extern void AlterObjectOwner_internal(Relation rel, Oid objectId, +extern void AlterObjectOwner_internal(Oid classId, Oid objectId, Oid new_ownerId); #endif /* ALTER_H */ diff --git a/src/include/commands/async.h b/src/include/commands/async.h index 02da6ba7e11a6..78daa25fa0806 100644 --- a/src/include/commands/async.h +++ b/src/include/commands/async.h @@ -3,7 +3,7 @@ * async.h * Asynchronous notification: NOTIFY, LISTEN, UNLISTEN * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/async.h @@ -15,12 +15,8 @@ #include -/* - * The number of SLRU page buffers we use for the notification queue. - */ -#define NUM_NOTIFY_BUFFERS 8 - extern PGDLLIMPORT bool Trace_notify; +extern PGDLLIMPORT int max_notify_queue_pages; extern PGDLLIMPORT volatile sig_atomic_t notifyInterruptPending; extern Size AsyncShmemSize(void); diff --git a/src/include/commands/cluster.h b/src/include/commands/cluster.h index f92ae8f25a68b..4e3238041712b 100644 --- a/src/include/commands/cluster.h +++ b/src/include/commands/cluster.h @@ -3,7 +3,7 @@ * cluster.h * header file for postgres cluster command stuff * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * src/include/commands/cluster.h diff --git a/src/include/commands/collationcmds.h b/src/include/commands/collationcmds.h index b76c7b3dc3c82..718f021656b3f 100644 --- a/src/include/commands/collationcmds.h +++ b/src/include/commands/collationcmds.h @@ -4,7 +4,7 @@ * prototypes for collationcmds.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/collationcmds.h diff --git a/src/include/commands/comment.h b/src/include/commands/comment.h index 1a4ca71e76e0e..18c089de3c069 100644 --- a/src/include/commands/comment.h +++ b/src/include/commands/comment.h @@ -7,7 +7,7 @@ * * Prototypes for functions in commands/comment.c * - * Copyright (c) 1999-2023, PostgreSQL Global Development Group + * Copyright (c) 1999-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ diff --git a/src/include/commands/conversioncmds.h b/src/include/commands/conversioncmds.h index 0e5534da34c26..dc2a1e64ef4ae 100644 --- a/src/include/commands/conversioncmds.h +++ b/src/include/commands/conversioncmds.h @@ -4,7 +4,7 @@ * prototypes for conversioncmds.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/conversioncmds.h diff --git a/src/include/commands/copy.h b/src/include/commands/copy.h index 33175868f653a..141fd48dc10df 100644 --- a/src/include/commands/copy.h +++ b/src/include/commands/copy.h @@ -4,7 +4,7 @@ * Definitions for using the POSTGRES copy command. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/copy.h @@ -30,6 +30,25 @@ typedef enum CopyHeaderChoice COPY_HEADER_MATCH, } CopyHeaderChoice; +/* + * Represents where to save input processing errors. More values to be added + * in the future. + */ +typedef enum CopyOnErrorChoice +{ + COPY_ON_ERROR_STOP = 0, /* immediately throw errors, default */ + COPY_ON_ERROR_IGNORE, /* ignore errors */ +} CopyOnErrorChoice; + +/* + * Represents verbosity of logged messages by COPY command. + */ +typedef enum CopyLogVerbosityChoice +{ + COPY_LOG_VERBOSITY_DEFAULT = 0, /* logs no additional messages, default */ + COPY_LOG_VERBOSITY_VERBOSE, /* logs additional messages */ +} CopyLogVerbosityChoice; + /* * A struct to hold COPY options, in a parsed form. All of these are related * to formatting, except for 'freeze', which doesn't really belong here, but @@ -56,10 +75,14 @@ typedef struct CopyFormatOptions bool force_quote_all; /* FORCE_QUOTE *? */ bool *force_quote_flags; /* per-column CSV FQ flags */ List *force_notnull; /* list of column names */ + bool force_notnull_all; /* FORCE_NOT_NULL *? */ bool *force_notnull_flags; /* per-column CSV FNN flags */ List *force_null; /* list of column names */ + bool force_null_all; /* FORCE_NULL *? */ bool *force_null_flags; /* per-column CSV FN flags */ bool convert_selectively; /* do selective binary conversion? */ + CopyOnErrorChoice on_error; /* what to do when error happened */ + CopyLogVerbosityChoice log_verbosity; /* verbosity of logged messages */ List *convert_select; /* list of column names (can be NIL) */ } CopyFormatOptions; @@ -84,6 +107,7 @@ extern bool NextCopyFrom(CopyFromState cstate, ExprContext *econtext, extern bool NextCopyFromRawFields(CopyFromState cstate, char ***fields, int *nfields); extern void CopyFromErrorCallback(void *arg); +extern char *CopyLimitPrintoutLength(const char *str); extern uint64 CopyFrom(CopyFromState cstate); diff --git a/src/include/commands/copyfrom_internal.h b/src/include/commands/copyfrom_internal.h index ac2c16f8b862c..cad52fcc78370 100644 --- a/src/include/commands/copyfrom_internal.h +++ b/src/include/commands/copyfrom_internal.h @@ -4,7 +4,7 @@ * Internal definitions for COPY FROM command. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/copyfrom_internal.h @@ -16,6 +16,7 @@ #include "commands/copy.h" #include "commands/trigger.h" +#include "nodes/miscnodes.h" /* * Represents the different source cases we need to worry about at @@ -25,7 +26,7 @@ typedef enum CopySource { COPY_FILE, /* from file (or a piped program) */ COPY_FRONTEND, /* from frontend */ - COPY_CALLBACK /* from callback function */ + COPY_CALLBACK, /* from callback function */ } CopySource; /* @@ -36,7 +37,7 @@ typedef enum EolType EOL_UNKNOWN, EOL_NL, EOL_CR, - EOL_CRNL + EOL_CRNL, } EolType; /* @@ -47,7 +48,7 @@ typedef enum CopyInsertMethod CIM_SINGLE, /* use table_tuple_insert or ExecForeignInsert */ CIM_MULTI, /* always use table_multi_insert or * ExecForeignBatchInsert */ - CIM_MULTI_CONDITIONAL /* use table_multi_insert or + CIM_MULTI_CONDITIONAL, /* use table_multi_insert or * ExecForeignBatchInsert only if valid */ } CopyInsertMethod; @@ -94,6 +95,10 @@ typedef struct CopyFromStateData * default value */ FmgrInfo *in_functions; /* array of input functions for each attrs */ Oid *typioparams; /* array of element types for in_functions */ + ErrorSaveContext *escontext; /* soft error trapper during in_functions + * execution */ + uint64 num_errors; /* total number of rows which contained soft + * errors */ int *defmap; /* array of default att numbers related to * missing att */ ExprState **defexprs; /* array of default att expressions for all diff --git a/src/include/commands/createas.h b/src/include/commands/createas.h index 3647f96f73329..94678e3834d2b 100644 --- a/src/include/commands/createas.h +++ b/src/include/commands/createas.h @@ -4,7 +4,7 @@ * prototypes for createas.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/createas.h diff --git a/src/include/commands/dbcommands.h b/src/include/commands/dbcommands.h index 5fbc3ca75289d..92e17c7115857 100644 --- a/src/include/commands/dbcommands.h +++ b/src/include/commands/dbcommands.h @@ -4,7 +4,7 @@ * Database management commands (create/drop database). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/dbcommands.h diff --git a/src/include/commands/dbcommands_xlog.h b/src/include/commands/dbcommands_xlog.h index a1433275f5f77..c008b8ffea0e6 100644 --- a/src/include/commands/dbcommands_xlog.h +++ b/src/include/commands/dbcommands_xlog.h @@ -4,7 +4,7 @@ * Database resource manager XLOG definitions (create/drop database). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/dbcommands_xlog.h diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h index 478203ed4c4d3..29c511e319693 100644 --- a/src/include/commands/defrem.h +++ b/src/include/commands/defrem.h @@ -4,7 +4,7 @@ * POSTGRES define and remove utility definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/defrem.h @@ -24,7 +24,7 @@ extern void RemoveObjects(DropStmt *stmt); /* commands/indexcmds.c */ -extern ObjectAddress DefineIndex(Oid relationId, +extern ObjectAddress DefineIndex(Oid tableId, IndexStmt *stmt, Oid indexRelationId, Oid parentIndexId, @@ -35,7 +35,7 @@ extern ObjectAddress DefineIndex(Oid relationId, bool check_not_in_use, bool skip_build, bool quiet); -extern void ExecReindex(ParseState *pstate, ReindexStmt *stmt, bool isTopLevel); +extern void ExecReindex(ParseState *pstate, const ReindexStmt *stmt, bool isTopLevel); extern char *makeObjectName(const char *name1, const char *name2, const char *label); extern char *ChooseRelationName(const char *name1, const char *name2, @@ -43,10 +43,10 @@ extern char *ChooseRelationName(const char *name1, const char *name2, bool isconstraint); extern bool CheckIndexCompatible(Oid oldId, const char *accessMethodName, - List *attributeList, - List *exclusionOpNames); + const List *attributeList, + const List *exclusionOpNames); extern Oid GetDefaultOpClass(Oid type_id, Oid am_id); -extern Oid ResolveOpClass(List *opclass, Oid attrType, +extern Oid ResolveOpClass(const List *opclass, Oid attrType, const char *accessMethodName, Oid accessMethodId); /* commands/functioncmds.c */ diff --git a/src/include/commands/discard.h b/src/include/commands/discard.h index 68fbbce521cbe..c1f91d8e3f695 100644 --- a/src/include/commands/discard.h +++ b/src/include/commands/discard.h @@ -4,7 +4,7 @@ * prototypes for discard.c. * * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/commands/discard.h * diff --git a/src/include/commands/event_trigger.h b/src/include/commands/event_trigger.h index 5ed6ece555d05..00cfb39758478 100644 --- a/src/include/commands/event_trigger.h +++ b/src/include/commands/event_trigger.h @@ -3,7 +3,7 @@ * event_trigger.h * Declarations for command trigger handling. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/event_trigger.h @@ -29,6 +29,14 @@ typedef struct EventTriggerData CommandTag tag; } EventTriggerData; +extern PGDLLIMPORT bool event_triggers; + +/* + * Reasons for relation rewrites. + * + * pg_event_trigger_table_rewrite_reason() uses these values, so make sure to + * update the documentation when changing this list. + */ #define AT_REWRITE_ALTER_PERSISTENCE 0x01 #define AT_REWRITE_DEFAULT_VAL 0x02 #define AT_REWRITE_COLUMN_REWRITE 0x04 @@ -49,11 +57,12 @@ extern ObjectAddress AlterEventTriggerOwner(const char *name, Oid newOwnerId); extern void AlterEventTriggerOwner_oid(Oid, Oid newOwnerId); extern bool EventTriggerSupportsObjectType(ObjectType obtype); -extern bool EventTriggerSupportsObjectClass(ObjectClass objclass); +extern bool EventTriggerSupportsObject(const ObjectAddress *object); extern void EventTriggerDDLCommandStart(Node *parsetree); extern void EventTriggerDDLCommandEnd(Node *parsetree); extern void EventTriggerSQLDrop(Node *parsetree); extern void EventTriggerTableRewrite(Node *parsetree, Oid tableOid, int reason); +extern void EventTriggerOnLogin(void); extern bool EventTriggerBeginCompleteQuery(void); extern void EventTriggerEndCompleteQuery(void); diff --git a/src/include/commands/explain.h b/src/include/commands/explain.h index 3d3e632a0ccf6..9b8b351d9a218 100644 --- a/src/include/commands/explain.h +++ b/src/include/commands/explain.h @@ -3,7 +3,7 @@ * explain.h * prototypes for explain.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994-5, Regents of the University of California * * src/include/commands/explain.h @@ -17,12 +17,19 @@ #include "lib/stringinfo.h" #include "parser/parse_node.h" +typedef enum ExplainSerializeOption +{ + EXPLAIN_SERIALIZE_NONE, + EXPLAIN_SERIALIZE_TEXT, + EXPLAIN_SERIALIZE_BINARY, +} ExplainSerializeOption; + typedef enum ExplainFormat { EXPLAIN_FORMAT_TEXT, EXPLAIN_FORMAT_XML, EXPLAIN_FORMAT_JSON, - EXPLAIN_FORMAT_YAML + EXPLAIN_FORMAT_YAML, } ExplainFormat; typedef struct ExplainWorkersState @@ -45,8 +52,10 @@ typedef struct ExplainState bool wal; /* print WAL usage */ bool timing; /* print detailed node timing */ bool summary; /* print total planning and execution timing */ + bool memory; /* print planner's memory usage information */ bool settings; /* print modified settings */ bool generic; /* generate a generic plan */ + ExplainSerializeOption serialize; /* serialize the query's output? */ ExplainFormat format; /* output format */ /* state for output formatting --- not reset for each new plan tree */ int indent; /* current indentation level */ @@ -79,6 +88,10 @@ extern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook; extern void ExplainQuery(ParseState *pstate, ExplainStmt *stmt, ParamListInfo params, DestReceiver *dest); +extern void standard_ExplainOneQuery(Query *query, int cursorOptions, + IntoClause *into, ExplainState *es, + const char *queryString, ParamListInfo params, + QueryEnvironment *queryEnv); extern ExplainState *NewExplainState(void); @@ -92,7 +105,8 @@ extern void ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, const char *queryString, ParamListInfo params, QueryEnvironment *queryEnv, const instr_time *planduration, - const BufferUsage *bufusage); + const BufferUsage *bufusage, + const MemoryContextCounters *mem_counters); extern void ExplainPrintPlan(ExplainState *es, QueryDesc *queryDesc); extern void ExplainPrintTriggers(ExplainState *es, QueryDesc *queryDesc); @@ -126,4 +140,6 @@ extern void ExplainOpenGroup(const char *objtype, const char *labelname, extern void ExplainCloseGroup(const char *objtype, const char *labelname, bool labeled, ExplainState *es); +extern DestReceiver *CreateExplainSerializeDestReceiver(ExplainState *es); + #endif /* EXPLAIN_H */ diff --git a/src/include/commands/extension.h b/src/include/commands/extension.h index 74ae39139585a..c6f3f867eb7c1 100644 --- a/src/include/commands/extension.h +++ b/src/include/commands/extension.h @@ -4,7 +4,7 @@ * Extension management commands (create/drop extension). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/extension.h diff --git a/src/include/commands/lockcmds.h b/src/include/commands/lockcmds.h index 6c298c71b36d1..c3b2839f3f151 100644 --- a/src/include/commands/lockcmds.h +++ b/src/include/commands/lockcmds.h @@ -4,7 +4,7 @@ * prototypes for lockcmds.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/lockcmds.h diff --git a/src/include/commands/matview.h b/src/include/commands/matview.h index 9eaa6212a191c..a226b2e68fba5 100644 --- a/src/include/commands/matview.h +++ b/src/include/commands/matview.h @@ -4,7 +4,7 @@ * prototypes for matview.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/matview.h @@ -25,6 +25,9 @@ extern void SetMatViewPopulatedState(Relation relation, bool newstate); extern ObjectAddress ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, ParamListInfo params, QueryCompletion *qc); +extern ObjectAddress RefreshMatViewByOid(Oid matviewOid, bool skipData, bool concurrent, + const char *queryString, ParamListInfo params, + QueryCompletion *qc); extern DestReceiver *CreateTransientRelDestReceiver(Oid transientoid); diff --git a/src/include/commands/policy.h b/src/include/commands/policy.h index f3533920b6aa9..f66ef49831f9b 100644 --- a/src/include/commands/policy.h +++ b/src/include/commands/policy.h @@ -4,7 +4,7 @@ * prototypes for policy.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/policy.h diff --git a/src/include/commands/portalcmds.h b/src/include/commands/portalcmds.h index 96ade48d08a4d..f09a1e17220d6 100644 --- a/src/include/commands/portalcmds.h +++ b/src/include/commands/portalcmds.h @@ -4,7 +4,7 @@ * prototypes for portalcmds.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/portalcmds.h diff --git a/src/include/commands/prepare.h b/src/include/commands/prepare.h index 79f161561e504..61472c111d6ed 100644 --- a/src/include/commands/prepare.h +++ b/src/include/commands/prepare.h @@ -4,7 +4,7 @@ * PREPARE, EXECUTE and DEALLOCATE commands, and prepared-stmt storage * * - * Copyright (c) 2002-2023, PostgreSQL Global Development Group + * Copyright (c) 2002-2024, PostgreSQL Global Development Group * * src/include/commands/prepare.h * diff --git a/src/include/commands/proclang.h b/src/include/commands/proclang.h index 08c68b8c177ca..eebc806edc7c0 100644 --- a/src/include/commands/proclang.h +++ b/src/include/commands/proclang.h @@ -3,7 +3,7 @@ * proclang.h * prototypes for proclang.c. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/proclang.h diff --git a/src/include/commands/progress.h b/src/include/commands/progress.h index e5add41352732..5616d645230ce 100644 --- a/src/include/commands/progress.h +++ b/src/include/commands/progress.h @@ -7,7 +7,7 @@ * constants, you probably also need to update the views based on them * in system_views.sql. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/progress.h @@ -23,8 +23,11 @@ #define PROGRESS_VACUUM_HEAP_BLKS_SCANNED 2 #define PROGRESS_VACUUM_HEAP_BLKS_VACUUMED 3 #define PROGRESS_VACUUM_NUM_INDEX_VACUUMS 4 -#define PROGRESS_VACUUM_MAX_DEAD_TUPLES 5 -#define PROGRESS_VACUUM_NUM_DEAD_TUPLES 6 +#define PROGRESS_VACUUM_MAX_DEAD_TUPLE_BYTES 5 +#define PROGRESS_VACUUM_DEAD_TUPLE_BYTES 6 +#define PROGRESS_VACUUM_NUM_DEAD_ITEM_IDS 7 +#define PROGRESS_VACUUM_INDEXES_TOTAL 8 +#define PROGRESS_VACUUM_INDEXES_PROCESSED 9 /* Phases of vacuum (as advertised via PROGRESS_VACUUM_PHASE) */ #define PROGRESS_VACUUM_PHASE_SCAN_HEAP 1 @@ -140,6 +143,7 @@ #define PROGRESS_COPY_TUPLES_EXCLUDED 3 #define PROGRESS_COPY_COMMAND 4 #define PROGRESS_COPY_TYPE 5 +#define PROGRESS_COPY_TUPLES_SKIPPED 6 /* Commands of COPY (as advertised via PROGRESS_COPY_COMMAND) */ #define PROGRESS_COPY_COMMAND_FROM 1 diff --git a/src/include/commands/publicationcmds.h b/src/include/commands/publicationcmds.h index 70d5e3680a231..5487c571f66c7 100644 --- a/src/include/commands/publicationcmds.h +++ b/src/include/commands/publicationcmds.h @@ -4,7 +4,7 @@ * prototypes for publicationcmds.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/publicationcmds.h diff --git a/src/include/commands/schemacmds.h b/src/include/commands/schemacmds.h index c8c771cef9485..5598dfa5d7665 100644 --- a/src/include/commands/schemacmds.h +++ b/src/include/commands/schemacmds.h @@ -4,7 +4,7 @@ * prototypes for schemacmds.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/schemacmds.h diff --git a/src/include/commands/seclabel.h b/src/include/commands/seclabel.h index e819fe992074a..89def5699a088 100644 --- a/src/include/commands/seclabel.h +++ b/src/include/commands/seclabel.h @@ -3,7 +3,7 @@ * * Prototypes for functions in commands/seclabel.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California */ #ifndef SECLABEL_H diff --git a/src/include/commands/sequence.h b/src/include/commands/sequence.h index 7db7b3da7bc41..e88cbee3b56bc 100644 --- a/src/include/commands/sequence.h +++ b/src/include/commands/sequence.h @@ -3,7 +3,7 @@ * sequence.h * prototypes for sequence.c. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/sequence.h diff --git a/src/include/commands/subscriptioncmds.h b/src/include/commands/subscriptioncmds.h index 214dc6c29e449..6971933190b5d 100644 --- a/src/include/commands/subscriptioncmds.h +++ b/src/include/commands/subscriptioncmds.h @@ -4,7 +4,7 @@ * prototypes for subscriptioncmds.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/subscriptioncmds.h diff --git a/src/include/commands/tablecmds.h b/src/include/commands/tablecmds.h index 250d89ff88b55..85cbad3d0c204 100644 --- a/src/include/commands/tablecmds.h +++ b/src/include/commands/tablecmds.h @@ -4,7 +4,7 @@ * prototypes for tablecmds.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/tablecmds.h @@ -27,6 +27,8 @@ struct AlterTableUtilityContext; /* avoid including tcop/utility.h here */ extern ObjectAddress DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, ObjectAddress *typaddress, const char *queryString); +extern TupleDesc BuildDescForRelation(const List *columns); + extern void RemoveRelations(DropStmt *drop); extern Oid AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode); diff --git a/src/include/commands/tablespace.h b/src/include/commands/tablespace.h index f1961c1813079..b6cec632db9ad 100644 --- a/src/include/commands/tablespace.h +++ b/src/include/commands/tablespace.h @@ -4,7 +4,7 @@ * Tablespace management commands (create/drop tablespace). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/tablespace.h diff --git a/src/include/commands/trigger.h b/src/include/commands/trigger.h index 430e3ca7ddf35..8a5a9fe642274 100644 --- a/src/include/commands/trigger.h +++ b/src/include/commands/trigger.h @@ -3,7 +3,7 @@ * trigger.h * Declarations for trigger handling. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/trigger.h diff --git a/src/include/commands/typecmds.h b/src/include/commands/typecmds.h index 1313d6485e322..e1b02927c4bab 100644 --- a/src/include/commands/typecmds.h +++ b/src/include/commands/typecmds.h @@ -4,7 +4,7 @@ * prototypes for typecmds.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/typecmds.h @@ -50,9 +50,11 @@ extern void AlterTypeOwnerInternal(Oid typeOid, Oid newOwnerId); extern ObjectAddress AlterTypeNamespace(List *names, const char *newschema, ObjectType objecttype, Oid *oldschema); -extern Oid AlterTypeNamespace_oid(Oid typeOid, Oid nspOid, ObjectAddresses *objsMoved); +extern Oid AlterTypeNamespace_oid(Oid typeOid, Oid nspOid, bool ignoreDependent, + ObjectAddresses *objsMoved); extern Oid AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, bool isImplicitArray, + bool ignoreDependent, bool errorOnTableType, ObjectAddresses *objsMoved); diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index cb5b11ab31f73..759f9a87d38e5 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -4,7 +4,7 @@ * header file for postgres vacuum cleaner and statistics analyzer * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/vacuum.h @@ -17,6 +17,7 @@ #include "access/htup.h" #include "access/genam.h" #include "access/parallel.h" +#include "access/tidstore.h" #include "catalog/pg_class.h" #include "catalog/pg_statistic.h" #include "catalog/pg_type.h" @@ -116,16 +117,12 @@ typedef struct VacAttrStats { /* * These fields are set up by the main ANALYZE code before invoking the - * type-specific typanalyze function. - * - * Note: do not assume that the data being analyzed has the same datatype - * shown in attr, ie do not trust attr->atttypid, attlen, etc. This is - * because some index opclasses store a different type than the underlying - * column/expression. Instead use attrtypid, attrtypmod, and attrtype for + * type-specific typanalyze function. They don't necessarily match what + * is in pg_attribute, because some index opclasses store a different type + * than the underlying column/expression. Therefore, use these fields for * information about the datatype being fed to the typanalyze function. - * Likewise, use attrcollid not attr->attcollation. */ - Form_pg_attribute attr; /* copy of pg_attribute row for column */ + int attstattarget; /* -1 to use default */ Oid attrtypid; /* type of data being analyzed */ int32 attrtypmod; /* typmod of data being analyzed */ Form_pg_type attrtype; /* copy of pg_type row for attrtypid */ @@ -191,7 +188,6 @@ typedef struct VacAttrStats #define VACOPT_DISABLE_PAGE_SKIPPING 0x100 /* don't skip any pages */ #define VACOPT_SKIP_DATABASE_STATS 0x200 /* skip vac_update_datfrozenxid() */ #define VACOPT_ONLY_DATABASE_STATS 0x400 /* only vac_update_datfrozenxid() */ -#define VACOPT_SKIP_PRIVS 0x800 /* skip privilege checks */ /* * Values used by index_cleanup and truncate params. @@ -233,6 +229,7 @@ typedef struct VacuumParams * default */ VacOptValue index_cleanup; /* Do index vacuum and cleanup */ VacOptValue truncate; /* Truncate empty pages at the end */ + Oid toast_parent; /* for privilege checks when recursing */ /* * The number of parallel vacuum workers. 0 by default which means choose @@ -282,19 +279,14 @@ struct VacuumCutoffs }; /* - * VacDeadItems stores TIDs whose index tuples are deleted by index vacuuming. + * VacDeadItemsInfo stores supplemental information for dead tuple TID + * storage (i.e. TidStore). */ -typedef struct VacDeadItems +typedef struct VacDeadItemsInfo { - int max_items; /* # slots allocated in array */ - int num_items; /* current # of entries */ - - /* Sorted array of TIDs to delete from indexes */ - ItemPointerData items[FLEXIBLE_ARRAY_MEMBER]; -} VacDeadItems; - -#define MAXDEADITEMS(avail_mem) \ - (((avail_mem) - offsetof(VacDeadItems, items)) / sizeof(ItemPointerData)) + size_t max_bytes; /* the maximum bytes TidStore can use */ + int64 num_items; /* current # of entries */ +} VacDeadItemsInfo; /* GUC parameters */ extern PGDLLIMPORT int default_statistics_target; /* PGDLLIMPORT for PostGIS */ @@ -305,6 +297,13 @@ extern PGDLLIMPORT int vacuum_multixact_freeze_table_age; extern PGDLLIMPORT int vacuum_failsafe_age; extern PGDLLIMPORT int vacuum_multixact_failsafe_age; +/* + * Maximum value for default_statistics_target and per-column statistics + * targets. This is fairly arbitrary, mainly to prevent users from creating + * unreasonably large statistics that the system cannot handle well. + */ +#define MAX_STATISTICS_TARGET 10000 + /* Variables for cost-based parallel vacuum */ extern PGDLLIMPORT pg_atomic_uint32 *VacuumSharedCostBalance; extern PGDLLIMPORT pg_atomic_uint32 *VacuumActiveNWorkers; @@ -348,10 +347,10 @@ extern Relation vacuum_open_relation(Oid relid, RangeVar *relation, LOCKMODE lmode); extern IndexBulkDeleteResult *vac_bulkdel_one_index(IndexVacuumInfo *ivinfo, IndexBulkDeleteResult *istat, - VacDeadItems *dead_items); + TidStore *dead_items, + VacDeadItemsInfo *dead_items_info); extern IndexBulkDeleteResult *vac_cleanup_one_index(IndexVacuumInfo *ivinfo, IndexBulkDeleteResult *istat); -extern Size vac_max_items_to_alloc_size(int max_items); /* In postmaster/autovacuum.c */ extern void AutoVacuumUpdateCostLimit(void); @@ -360,10 +359,12 @@ extern void VacuumUpdateCosts(void); /* in commands/vacuumparallel.c */ extern ParallelVacuumState *parallel_vacuum_init(Relation rel, Relation *indrels, int nindexes, int nrequested_workers, - int max_items, int elevel, + int vac_work_mem, int elevel, BufferAccessStrategy bstrategy); extern void parallel_vacuum_end(ParallelVacuumState *pvs, IndexBulkDeleteResult **istats); -extern VacDeadItems *parallel_vacuum_get_dead_items(ParallelVacuumState *pvs); +extern TidStore *parallel_vacuum_get_dead_items(ParallelVacuumState *pvs, + VacDeadItemsInfo **dead_items_info_p); +extern void parallel_vacuum_reset_dead_items(ParallelVacuumState *pvs); extern void parallel_vacuum_bulkdel_all_indexes(ParallelVacuumState *pvs, long num_table_tuples, int num_index_scans); diff --git a/src/include/commands/view.h b/src/include/commands/view.h index c3a713e165f0a..d2d8588989d1c 100644 --- a/src/include/commands/view.h +++ b/src/include/commands/view.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/commands/view.h diff --git a/src/include/common/archive.h b/src/include/common/archive.h index 95196772c95c9..f3f677ab6556c 100644 --- a/src/include/common/archive.h +++ b/src/include/common/archive.h @@ -3,7 +3,7 @@ * archive.h * Common WAL archive routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/archive.h diff --git a/src/include/common/base64.h b/src/include/common/base64.h index 5bd8186c79ca4..0d6d31b72b03d 100644 --- a/src/include/common/base64.h +++ b/src/include/common/base64.h @@ -3,7 +3,7 @@ * Encoding and decoding routines for base64 without whitespace * support. * - * Portions Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2001-2024, PostgreSQL Global Development Group * * src/include/common/base64.h */ diff --git a/src/include/common/blkreftable.h b/src/include/common/blkreftable.h new file mode 100644 index 0000000000000..43b913a82ecdf --- /dev/null +++ b/src/include/common/blkreftable.h @@ -0,0 +1,116 @@ +/*------------------------------------------------------------------------- + * + * blkreftable.h + * Block reference tables. + * + * A block reference table is used to keep track of which blocks have + * been modified by WAL records within a certain LSN range. + * + * For each relation fork, there is a "limit block number". All existing + * blocks greater than or equal to the limit block number must be + * considered modified; for those less than the limit block number, + * we maintain a bitmap. When a relation fork is created or dropped, + * the limit block number should be set to 0. When it's truncated, + * the limit block number should be set to the length in blocks to + * which it was truncated. + * + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group + * + * src/include/common/blkreftable.h + * + *------------------------------------------------------------------------- + */ +#ifndef BLKREFTABLE_H +#define BLKREFTABLE_H + +#include "storage/block.h" +#include "storage/relfilelocator.h" + +/* Magic number for serialization file format. */ +#define BLOCKREFTABLE_MAGIC 0x652b137b + +typedef struct BlockRefTable BlockRefTable; +typedef struct BlockRefTableEntry BlockRefTableEntry; +typedef struct BlockRefTableReader BlockRefTableReader; +typedef struct BlockRefTableWriter BlockRefTableWriter; + +/* + * The return value of io_callback_fn should be the number of bytes read + * or written. If an error occurs, the functions should report it and + * not return. When used as a write callback, short writes should be retried + * or treated as errors, so that if the callback returns, the return value + * is always the request length. + * + * report_error_fn should not return. + */ +typedef int (*io_callback_fn) (void *callback_arg, void *data, int length); +typedef void (*report_error_fn) (void *callback_arg, char *msg,...) pg_attribute_printf(2, 3); + + +/* + * Functions for manipulating an entire in-memory block reference table. + */ +extern BlockRefTable *CreateEmptyBlockRefTable(void); +extern void BlockRefTableSetLimitBlock(BlockRefTable *brtab, + const RelFileLocator *rlocator, + ForkNumber forknum, + BlockNumber limit_block); +extern void BlockRefTableMarkBlockModified(BlockRefTable *brtab, + const RelFileLocator *rlocator, + ForkNumber forknum, + BlockNumber blknum); +extern void WriteBlockRefTable(BlockRefTable *brtab, + io_callback_fn write_callback, + void *write_callback_arg); + +extern BlockRefTableEntry *BlockRefTableGetEntry(BlockRefTable *brtab, + const RelFileLocator *rlocator, + ForkNumber forknum, + BlockNumber *limit_block); +extern int BlockRefTableEntryGetBlocks(BlockRefTableEntry *entry, + BlockNumber start_blkno, + BlockNumber stop_blkno, + BlockNumber *blocks, + int nblocks); + +/* + * Functions for reading a block reference table incrementally from disk. + */ +extern BlockRefTableReader *CreateBlockRefTableReader(io_callback_fn read_callback, + void *read_callback_arg, + char *error_filename, + report_error_fn error_callback, + void *error_callback_arg); +extern bool BlockRefTableReaderNextRelation(BlockRefTableReader *reader, + RelFileLocator *rlocator, + ForkNumber *forknum, + BlockNumber *limit_block); +extern unsigned BlockRefTableReaderGetBlocks(BlockRefTableReader *reader, + BlockNumber *blocks, + int nblocks); +extern void DestroyBlockRefTableReader(BlockRefTableReader *reader); + +/* + * Functions for writing a block reference table incrementally to disk. + * + * Note that entries must be written in the proper order, that is, sorted by + * database, then tablespace, then relfilenumber, then fork number. Caller + * is responsible for supplying data in the correct order. If that seems hard, + * use an in-memory BlockRefTable instead. + */ +extern BlockRefTableWriter *CreateBlockRefTableWriter(io_callback_fn write_callback, + void *write_callback_arg); +extern void BlockRefTableWriteEntry(BlockRefTableWriter *writer, + BlockRefTableEntry *entry); +extern void DestroyBlockRefTableWriter(BlockRefTableWriter *writer); + +extern BlockRefTableEntry *CreateBlockRefTableEntry(RelFileLocator rlocator, + ForkNumber forknum); +extern void BlockRefTableEntrySetLimitBlock(BlockRefTableEntry *entry, + BlockNumber limit_block); +extern void BlockRefTableEntryMarkBlockModified(BlockRefTableEntry *entry, + ForkNumber forknum, + BlockNumber blknum); +extern void BlockRefTableFreeEntry(BlockRefTableEntry *entry); + +#endif /* BLKREFTABLE_H */ diff --git a/src/include/common/checksum_helper.h b/src/include/common/checksum_helper.h index a74deef67b6dc..116957d52e6ab 100644 --- a/src/include/common/checksum_helper.h +++ b/src/include/common/checksum_helper.h @@ -3,7 +3,7 @@ * checksum_helper.h * Compute a checksum of any of various types using common routines * - * Portions Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/common/checksum_helper.h @@ -33,7 +33,7 @@ typedef enum pg_checksum_type CHECKSUM_TYPE_SHA224, CHECKSUM_TYPE_SHA256, CHECKSUM_TYPE_SHA384, - CHECKSUM_TYPE_SHA512 + CHECKSUM_TYPE_SHA512, } pg_checksum_type; /* diff --git a/src/include/common/compression.h b/src/include/common/compression.h index 38aae9dd87394..b79bed9e245c2 100644 --- a/src/include/common/compression.h +++ b/src/include/common/compression.h @@ -4,7 +4,7 @@ * * Shared definitions for compression methods and specifications. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/common/compression.h @@ -23,7 +23,7 @@ typedef enum pg_compress_algorithm PG_COMPRESSION_NONE, PG_COMPRESSION_GZIP, PG_COMPRESSION_LZ4, - PG_COMPRESSION_ZSTD + PG_COMPRESSION_ZSTD, } pg_compress_algorithm; #define PG_COMPRESSION_OPTION_WORKERS (1 << 0) diff --git a/src/include/common/config_info.h b/src/include/common/config_info.h index a6d076d5e9f40..76d23f8b8beb0 100644 --- a/src/include/common/config_info.h +++ b/src/include/common/config_info.h @@ -2,7 +2,7 @@ * config_info.h * Common code for pg_config output * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * src/include/common/config_info.h */ diff --git a/src/include/common/connect.h b/src/include/common/connect.h index 5913c548b61a8..ddbd33a917b1d 100644 --- a/src/include/common/connect.h +++ b/src/include/common/connect.h @@ -3,7 +3,7 @@ * Interfaces in support of FE/BE connections. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/connect.h diff --git a/src/include/common/controldata_utils.h b/src/include/common/controldata_utils.h index 49e7c52d3129c..6e263ce0de0ce 100644 --- a/src/include/common/controldata_utils.h +++ b/src/include/common/controldata_utils.h @@ -2,7 +2,7 @@ * controldata_utils.h * Common code for pg_controldata output * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/controldata_utils.h @@ -13,6 +13,8 @@ #include "catalog/pg_control.h" extern ControlFileData *get_controlfile(const char *DataDir, bool *crc_ok_p); +extern ControlFileData *get_controlfile_by_exact_path(const char *ControlFilePath, + bool *crc_ok_p); extern void update_controlfile(const char *DataDir, ControlFileData *ControlFile, bool do_sync); diff --git a/src/include/common/cryptohash.h b/src/include/common/cryptohash.h index 24b6dbebbd89f..0fe77341232d3 100644 --- a/src/include/common/cryptohash.h +++ b/src/include/common/cryptohash.h @@ -3,7 +3,7 @@ * cryptohash.h * Generic headers for cryptographic hash functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -23,7 +23,7 @@ typedef enum PG_SHA224, PG_SHA256, PG_SHA384, - PG_SHA512 + PG_SHA512, } pg_cryptohash_type; /* opaque context, private to each cryptohash implementation */ diff --git a/src/include/common/fe_memutils.h b/src/include/common/fe_memutils.h index 89601cc778f93..492cc97e8d19a 100644 --- a/src/include/common/fe_memutils.h +++ b/src/include/common/fe_memutils.h @@ -2,7 +2,7 @@ * fe_memutils.h * memory management support for frontend code * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * src/include/common/fe_memutils.h */ diff --git a/src/include/common/file_perm.h b/src/include/common/file_perm.h index 978c0d072f15a..d1f5616793e6a 100644 --- a/src/include/common/file_perm.h +++ b/src/include/common/file_perm.h @@ -3,7 +3,7 @@ * File and directory permission definitions * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/file_perm.h diff --git a/src/include/common/file_utils.h b/src/include/common/file_utils.h index b7efa1226d6ef..e4339fb7b6c14 100644 --- a/src/include/common/file_utils.h +++ b/src/include/common/file_utils.h @@ -3,7 +3,7 @@ * Assorted utility functions to work on files. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/file_utils.h @@ -21,15 +21,22 @@ typedef enum PGFileType PGFILETYPE_UNKNOWN, PGFILETYPE_REG, PGFILETYPE_DIR, - PGFILETYPE_LNK + PGFILETYPE_LNK, } PGFileType; +typedef enum DataDirSyncMethod +{ + DATA_DIR_SYNC_METHOD_FSYNC, + DATA_DIR_SYNC_METHOD_SYNCFS, +} DataDirSyncMethod; + struct iovec; /* avoid including port/pg_iovec.h here */ #ifdef FRONTEND extern int fsync_fname(const char *fname, bool isdir); -extern void fsync_pgdata(const char *pg_data, int serverVersion); -extern void fsync_dir_recurse(const char *dir); +extern void sync_pgdata(const char *pg_data, int serverVersion, + DataDirSyncMethod sync_method); +extern void sync_dir_recurse(const char *dir, DataDirSyncMethod sync_method); extern int durable_rename(const char *oldfile, const char *newfile); extern int fsync_parent_path(const char *fname); #endif @@ -39,6 +46,11 @@ extern PGFileType get_dirent_type(const char *path, bool look_through_symlinks, int elevel); +extern int compute_remaining_iovec(struct iovec *destination, + const struct iovec *source, + int iovcnt, + size_t transferred); + extern ssize_t pg_pwritev_with_retry(int fd, const struct iovec *iov, int iovcnt, @@ -46,4 +58,8 @@ extern ssize_t pg_pwritev_with_retry(int fd, extern ssize_t pg_pwrite_zeros(int fd, size_t size, off_t offset); +/* Filename components */ +#define PG_TEMP_FILES_DIR "pgsql_tmp" +#define PG_TEMP_FILE_PREFIX "pgsql_tmp" + #endif /* FILE_UTILS_H */ diff --git a/src/include/common/hashfn.h b/src/include/common/hashfn.h index 5e89aef987f1b..0251b30af3e80 100644 --- a/src/include/common/hashfn.h +++ b/src/include/common/hashfn.h @@ -1,7 +1,7 @@ /* * Utilities for working with hash values. * - * Portions Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2017-2024, PostgreSQL Global Development Group */ #ifndef HASHFN_H @@ -101,4 +101,19 @@ murmurhash32(uint32 data) return h; } +/* 64-bit variant */ +static inline uint64 +murmurhash64(uint64 data) +{ + uint64 h = data; + + h ^= h >> 33; + h *= 0xff51afd7ed558ccd; + h ^= h >> 33; + h *= 0xc4ceb9fe1a85ec53; + h ^= h >> 33; + + return h; +} + #endif /* HASHFN_H */ diff --git a/src/include/common/hashfn_unstable.h b/src/include/common/hashfn_unstable.h new file mode 100644 index 0000000000000..101f118077e37 --- /dev/null +++ b/src/include/common/hashfn_unstable.h @@ -0,0 +1,407 @@ +/* + * hashfn_unstable.h + * + * Building blocks for creating fast inlineable hash functions. The + * functions in this file are not guaranteed to be stable between versions, + * and may differ by hardware platform. Hence they must not be used in + * indexes or other on-disk structures. See hashfn.h if you need stability. + * + * + * Portions Copyright (c) 2024, PostgreSQL Global Development Group + * + * src/include/common/hashfn_unstable.h + */ +#ifndef HASHFN_UNSTABLE_H +#define HASHFN_UNSTABLE_H + + +/* + * fasthash is a modification of code taken from + * https://code.google.com/archive/p/fast-hash/source/default/source + * under the terms of the MIT license. The original copyright + * notice follows: + */ + +/* The MIT License + + Copyright (C) 2012 Zilong Tan (eric.zltan@gmail.com) + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +/* + * fasthash as implemented here has two interfaces: + * + * 1) Standalone functions, e.g. fasthash32() for a single value with a + * known length. These return the same hash code as the original, at + * least on little-endian machines. + * + * 2) Incremental interface. This can used for incorporating multiple + * inputs. First, initialize the hash state (here with a zero seed): + * + * fasthash_state hs; + * fasthash_init(&hs, 0); + * + * If the inputs are of types that can be trivially cast to uint64, it's + * sufficient to do: + * + * hs.accum = value1; + * fasthash_combine(&hs); + * hs.accum = value2; + * fasthash_combine(&hs); + * ... + * + * For longer or variable-length input, fasthash_accum() is a more + * flexible, but more verbose method. The standalone functions use this + * internally, so see fasthash64() for an example of this. + * + * After all inputs have been mixed in, finalize the hash: + * + * hashcode = fasthash_final32(&hs, 0); + * + * The incremental interface allows an optimization for NUL-terminated + * C strings: + * + * len = fasthash_accum_cstring(&hs, str); + * hashcode = fasthash_final32(&hs, len); + * + * By handling the terminator on-the-fly, we can avoid needing a strlen() + * call to tell us how many bytes to hash. Experimentation has found that + * SMHasher fails unless we incorporate the length, so it is passed to + * the finalizer as a tweak. + */ + + +typedef struct fasthash_state +{ + /* staging area for chunks of input */ + uint64 accum; + + uint64 hash; +} fasthash_state; + +#define FH_SIZEOF_ACCUM sizeof(uint64) + + +/* + * Initialize the hash state. + * + * 'seed' can be zero. + */ +static inline void +fasthash_init(fasthash_state *hs, uint64 seed) +{ + memset(hs, 0, sizeof(fasthash_state)); + hs->hash = seed ^ 0x880355f21e6d1965; +} + +/* both the finalizer and part of the combining step */ +static inline uint64 +fasthash_mix(uint64 h, uint64 tweak) +{ + h ^= (h >> 23) + tweak; + h *= 0x2127599bf4325c37; + h ^= h >> 47; + return h; +} + +/* combine one chunk of input into the hash */ +static inline void +fasthash_combine(fasthash_state *hs) +{ + hs->hash ^= fasthash_mix(hs->accum, 0); + hs->hash *= 0x880355f21e6d1965; +} + +/* accumulate up to 8 bytes of input and combine it into the hash */ +static inline void +fasthash_accum(fasthash_state *hs, const char *k, size_t len) +{ + uint32 lower_four; + + Assert(len <= FH_SIZEOF_ACCUM); + hs->accum = 0; + + /* + * For consistency, bytewise loads must match the platform's endianness. + */ +#ifdef WORDS_BIGENDIAN + switch (len) + { + case 8: + memcpy(&hs->accum, k, 8); + break; + case 7: + hs->accum |= (uint64) k[6] << 8; + /* FALLTHROUGH */ + case 6: + hs->accum |= (uint64) k[5] << 16; + /* FALLTHROUGH */ + case 5: + hs->accum |= (uint64) k[4] << 24; + /* FALLTHROUGH */ + case 4: + memcpy(&lower_four, k, sizeof(lower_four)); + hs->accum |= (uint64) lower_four << 32; + break; + case 3: + hs->accum |= (uint64) k[2] << 40; + /* FALLTHROUGH */ + case 2: + hs->accum |= (uint64) k[1] << 48; + /* FALLTHROUGH */ + case 1: + hs->accum |= (uint64) k[0] << 56; + break; + case 0: + return; + } +#else + switch (len) + { + case 8: + memcpy(&hs->accum, k, 8); + break; + case 7: + hs->accum |= (uint64) k[6] << 48; + /* FALLTHROUGH */ + case 6: + hs->accum |= (uint64) k[5] << 40; + /* FALLTHROUGH */ + case 5: + hs->accum |= (uint64) k[4] << 32; + /* FALLTHROUGH */ + case 4: + memcpy(&lower_four, k, sizeof(lower_four)); + hs->accum |= lower_four; + break; + case 3: + hs->accum |= (uint64) k[2] << 16; + /* FALLTHROUGH */ + case 2: + hs->accum |= (uint64) k[1] << 8; + /* FALLTHROUGH */ + case 1: + hs->accum |= (uint64) k[0]; + break; + case 0: + return; + } +#endif + + fasthash_combine(hs); +} + +/* + * Set high bit in lowest byte where the input is zero, from: + * https://graphics.stanford.edu/~seander/bithacks.html#ZeroInWord + */ +#define haszero64(v) \ + (((v) - 0x0101010101010101) & ~(v) & 0x8080808080808080) + +/* + * all-purpose workhorse for fasthash_accum_cstring + */ +static inline size_t +fasthash_accum_cstring_unaligned(fasthash_state *hs, const char *str) +{ + const char *const start = str; + + while (*str) + { + size_t chunk_len = 0; + + while (chunk_len < FH_SIZEOF_ACCUM && str[chunk_len] != '\0') + chunk_len++; + + fasthash_accum(hs, str, chunk_len); + str += chunk_len; + } + + return str - start; +} + +/* + * specialized workhorse for fasthash_accum_cstring + * + * With an aligned pointer, we consume the string a word at a time. + * Loading the word containing the NUL terminator cannot segfault since + * allocation boundaries are suitably aligned. To keep from setting + * off alarms with address sanitizers, exclude this function from + * such testing. + */ +pg_attribute_no_sanitize_address() +static inline size_t +fasthash_accum_cstring_aligned(fasthash_state *hs, const char *str) +{ + const char *const start = str; + size_t remainder; + uint64 zero_byte_low; + + Assert(PointerIsAligned(start, uint64)); + + /* + * For every chunk of input, check for zero bytes before mixing into the + * hash. The chunk with zeros must contain the NUL terminator. + */ + for (;;) + { + uint64 chunk = *(uint64 *) str; + + zero_byte_low = haszero64(chunk); + if (zero_byte_low) + break; + + hs->accum = chunk; + fasthash_combine(hs); + str += FH_SIZEOF_ACCUM; + } + + /* mix in remaining bytes */ + remainder = fasthash_accum_cstring_unaligned(hs, str); + str += remainder; + + return str - start; +} + +/* + * Mix 'str' into the hash state and return the length of the string. + */ +static inline size_t +fasthash_accum_cstring(fasthash_state *hs, const char *str) +{ +#if SIZEOF_VOID_P >= 8 + + size_t len; +#ifdef USE_ASSERT_CHECKING + size_t len_check; + fasthash_state hs_check; + + memcpy(&hs_check, hs, sizeof(fasthash_state)); + len_check = fasthash_accum_cstring_unaligned(&hs_check, str); +#endif + if (PointerIsAligned(str, uint64)) + { + len = fasthash_accum_cstring_aligned(hs, str); + Assert(len_check == len); + Assert(hs_check.hash == hs->hash); + return len; + } +#endif /* SIZEOF_VOID_P */ + + /* + * It's not worth it to try to make the word-at-a-time optimization work + * on 32-bit platforms. + */ + return fasthash_accum_cstring_unaligned(hs, str); +} + +/* + * The finalizer + * + * 'tweak' is intended to be the input length when the caller doesn't know + * the length ahead of time, such as for NUL-terminated strings, otherwise + * zero. + */ +static inline uint64 +fasthash_final64(fasthash_state *hs, uint64 tweak) +{ + return fasthash_mix(hs->hash, tweak); +} + +/* + * Reduce a 64-bit hash to a 32-bit hash. + * + * This optional step provides a bit more additional mixing compared to + * just taking the lower 32-bits. + */ +static inline uint32 +fasthash_reduce32(uint64 h) +{ + /* + * Convert the 64-bit hashcode to Fermat residue, which shall retain + * information from both the higher and lower parts of hashcode. + */ + return h - (h >> 32); +} + +/* finalize and reduce */ +static inline uint32 +fasthash_final32(fasthash_state *hs, uint64 tweak) +{ + return fasthash_reduce32(fasthash_final64(hs, tweak)); +} + +/* + * The original fasthash64 function, re-implemented using the incremental + * interface. Returns a 64-bit hashcode. 'len' controls not only how + * many bytes to hash, but also modifies the internal seed. + * 'seed' can be zero. + */ +static inline uint64 +fasthash64(const char *k, size_t len, uint64 seed) +{ + fasthash_state hs; + + fasthash_init(&hs, 0); + + /* re-initialize the seed according to input length */ + hs.hash = seed ^ (len * 0x880355f21e6d1965); + + while (len >= FH_SIZEOF_ACCUM) + { + fasthash_accum(&hs, k, FH_SIZEOF_ACCUM); + k += FH_SIZEOF_ACCUM; + len -= FH_SIZEOF_ACCUM; + } + + fasthash_accum(&hs, k, len); + return fasthash_final64(&hs, 0); +} + +/* like fasthash64, but returns a 32-bit hashcode */ +static inline uint32 +fasthash32(const char *k, size_t len, uint64 seed) +{ + return fasthash_reduce32(fasthash64(k, len, seed)); +} + +/* + * Convenience function for hashing NUL-terminated strings + */ +static inline uint32 +hash_string(const char *s) +{ + fasthash_state hs; + size_t s_len; + + fasthash_init(&hs, 0); + + /* + * Combine string into the hash and save the length for tweaking the final + * mix. + */ + s_len = fasthash_accum_cstring(&hs, s); + + return fasthash_final32(&hs, s_len); +} + +#endif /* HASHFN_UNSTABLE_H */ diff --git a/src/include/common/hmac.h b/src/include/common/hmac.h index e0b2ed202411f..1b93aa2892b70 100644 --- a/src/include/common/hmac.h +++ b/src/include/common/hmac.h @@ -3,7 +3,7 @@ * hmac.h * Generic headers for HMAC * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/common/int.h b/src/include/common/int.h index 450800894ed65..7fc046e78afba 100644 --- a/src/include/common/int.h +++ b/src/include/common/int.h @@ -1,7 +1,7 @@ /*------------------------------------------------------------------------- * * int.h - * Routines to perform integer math, while checking for overflows. + * Overflow-aware integer math and integer comparison routines. * * The routines in this file are intended to be well defined C, without * relying on compiler flags like -fwrapv. @@ -11,7 +11,7 @@ * the 64 bit cases can be considerably faster with intrinsics. In case no * intrinsics are available 128 bit math is used where available. * - * Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Copyright (c) 2017-2024, PostgreSQL Global Development Group * * src/include/common/int.h * @@ -22,7 +22,7 @@ /*--------- - * The following guidelines apply to all the routines: + * The following guidelines apply to all the overflow routines: * - If a + b overflows, return true, otherwise store the result of a + b * into *result. The content of *result is implementation defined in case of * overflow. @@ -200,8 +200,12 @@ pg_sub_s64_overflow(int64 a, int64 b, int64 *result) *result = (int64) res; return false; #else + /* + * Note: overflow is also possible when a == 0 and b < 0 (specifically, + * when b == PG_INT64_MIN). + */ if ((a < 0 && b > 0 && a < PG_INT64_MIN + b) || - (a > 0 && b < 0 && a > PG_INT64_MAX + b)) + (a >= 0 && b < 0 && a > PG_INT64_MAX + b)) { *result = 0x5EED; /* to avoid spurious warnings */ return true; @@ -434,4 +438,75 @@ pg_mul_u64_overflow(uint64 a, uint64 b, uint64 *result) #endif } +/*------------------------------------------------------------------------ + * + * Comparison routines for integer types. + * + * These routines are primarily intended for use in qsort() comparator + * functions and therefore return a positive integer, 0, or a negative + * integer depending on whether "a" is greater than, equal to, or less + * than "b", respectively. These functions are written to be as efficient + * as possible without introducing overflow risks, thereby helping ensure + * the comparators that use them are transitive. + * + * Types with fewer than 32 bits are cast to signed integers and + * subtracted. Other types are compared using > and <, and the results of + * those comparisons (which are either (int) 0 or (int) 1 per the C + * standard) are subtracted. + * + * NB: If the comparator function is inlined, some compilers may produce + * worse code with these helper functions than with code with the + * following form: + * + * if (a < b) + * return -1; + * if (a > b) + * return 1; + * return 0; + * + *------------------------------------------------------------------------ + */ + +static inline int +pg_cmp_s16(int16 a, int16 b) +{ + return (int32) a - (int32) b; +} + +static inline int +pg_cmp_u16(uint16 a, uint16 b) +{ + return (int32) a - (int32) b; +} + +static inline int +pg_cmp_s32(int32 a, int32 b) +{ + return (a > b) - (a < b); +} + +static inline int +pg_cmp_u32(uint32 a, uint32 b) +{ + return (a > b) - (a < b); +} + +static inline int +pg_cmp_s64(int64 a, int64 b) +{ + return (a > b) - (a < b); +} + +static inline int +pg_cmp_u64(uint64 a, uint64 b) +{ + return (a > b) - (a < b); +} + +static inline int +pg_cmp_size(size_t a, size_t b) +{ + return (a > b) - (a < b); +} + #endif /* COMMON_INT_H */ diff --git a/src/include/common/int128.h b/src/include/common/int128.h index eca694b631dd6..bb443303a84c8 100644 --- a/src/include/common/int128.h +++ b/src/include/common/int128.h @@ -8,7 +8,7 @@ * * See src/tools/testint128.c for a simple test harness for this file. * - * Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Copyright (c) 2017-2024, PostgreSQL Global Development Group * * src/include/common/int128.h * diff --git a/src/include/common/ip.h b/src/include/common/ip.h index 9f2ed5fe0aa36..5648b6e52214d 100644 --- a/src/include/common/ip.h +++ b/src/include/common/ip.h @@ -5,7 +5,7 @@ * * These definitions are used by both frontend and backend code. * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * src/include/common/ip.h * diff --git a/src/include/common/jsonapi.h b/src/include/common/jsonapi.h index 4310084b2bdb6..71a491d72dc0e 100644 --- a/src/include/common/jsonapi.h +++ b/src/include/common/jsonapi.h @@ -3,7 +3,7 @@ * jsonapi.h * Declarations for JSON API support. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/jsonapi.h @@ -30,12 +30,15 @@ typedef enum JsonTokenType JSON_TOKEN_TRUE, JSON_TOKEN_FALSE, JSON_TOKEN_NULL, - JSON_TOKEN_END + JSON_TOKEN_END, } JsonTokenType; typedef enum JsonParseErrorType { JSON_SUCCESS, + JSON_INCOMPLETE, + JSON_INVALID_LEXER_TYPE, + JSON_NESTING_TOO_DEEP, JSON_ESCAPING_INVALID, JSON_ESCAPING_REQUIRED, JSON_EXPECTED_ARRAY_FIRST, @@ -54,9 +57,12 @@ typedef enum JsonParseErrorType JSON_UNICODE_UNTRANSLATABLE, JSON_UNICODE_HIGH_SURROGATE, JSON_UNICODE_LOW_SURROGATE, - JSON_SEM_ACTION_FAILED /* error should already be reported */ + JSON_SEM_ACTION_FAILED, /* error should already be reported */ } JsonParseErrorType; +/* Parser state private to jsonapi.c */ +typedef struct JsonParserStack JsonParserStack; +typedef struct JsonIncrementalState JsonIncrementalState; /* * All the fields in this structure should be treated as read-only. @@ -70,20 +76,34 @@ typedef enum JsonParseErrorType * token_terminator and prev_token_terminator point to the character * AFTER the end of the token, i.e. where there would be a nul byte * if we were using nul-terminated strings. + * + * The prev_token_terminator field should not be used when incremental is + * true, as the previous token might have started in a previous piece of input, + * and thus it can't be used in any pointer arithmetic or other operations in + * conjunction with token_start. + * + * JSONLEX_FREE_STRUCT/STRVAL are used to drive freeJsonLexContext. */ +#define JSONLEX_FREE_STRUCT (1 << 0) +#define JSONLEX_FREE_STRVAL (1 << 1) typedef struct JsonLexContext { - char *input; - int input_length; + const char *input; + size_t input_length; int input_encoding; - char *token_start; - char *token_terminator; - char *prev_token_terminator; + const char *token_start; + const char *token_terminator; + const char *prev_token_terminator; + bool incremental; JsonTokenType token_type; int lex_level; + bits32 flags; int line_number; /* line number, starting from 1 */ - char *line_start; /* where that line starts within input */ + const char *line_start; /* where that line starts within input */ + JsonParserStack *pstack; + JsonIncrementalState *inc_state; StringInfo strval; + StringInfo errormsg; } JsonLexContext; typedef JsonParseErrorType (*json_struct_action) (void *state); @@ -135,6 +155,12 @@ typedef struct JsonSemAction extern JsonParseErrorType pg_parse_json(JsonLexContext *lex, JsonSemAction *sem); +extern JsonParseErrorType pg_parse_json_incremental(JsonLexContext *lex, + JsonSemAction *sem, + const char *json, + size_t len, + bool is_last); + /* the null action object used for pure validation */ extern PGDLLIMPORT JsonSemAction nullSemAction; @@ -151,16 +177,37 @@ extern JsonParseErrorType json_count_array_elements(JsonLexContext *lex, int *elements); /* - * constructor for JsonLexContext, with or without strval element. - * If supplied, the strval element will contain a de-escaped version of - * the lexeme. However, doing this imposes a performance penalty, so - * it should be avoided if the de-escaped lexeme is not required. + * initializer for JsonLexContext. + * + * If a valid 'lex' pointer is given, it is initialized. This can be used + * for stack-allocated structs, saving overhead. If NULL is given, a new + * struct is allocated. + * + * If need_escapes is true, ->strval stores the unescaped lexemes. + * Unescaping is expensive, so only request it when necessary. + * + * If need_escapes is true or lex was given as NULL, then the caller is + * responsible for freeing the returned struct, either by calling + * freeJsonLexContext() or (in backend environment) via memory context + * cleanup. */ -extern JsonLexContext *makeJsonLexContextCstringLen(char *json, - int len, +extern JsonLexContext *makeJsonLexContextCstringLen(JsonLexContext *lex, + const char *json, + size_t len, int encoding, bool need_escapes); +/* + * make a JsonLexContext suitable for incremental parsing. + * the string chunks will be handed to pg_parse_json_incremental, + * so there's no need for them here. + */ +extern JsonLexContext *makeJsonLexContextIncremental(JsonLexContext *lex, + int encoding, + bool need_escapes); + +extern void freeJsonLexContext(JsonLexContext *lex); + /* lex one token */ extern JsonParseErrorType json_lex(JsonLexContext *lex); @@ -172,6 +219,6 @@ extern char *json_errdetail(JsonParseErrorType error, JsonLexContext *lex); * * str argument does not need to be nul-terminated. */ -extern bool IsValidJsonNumber(const char *str, int len); +extern bool IsValidJsonNumber(const char *str, size_t len); #endif /* JSONAPI_H */ diff --git a/src/include/common/keywords.h b/src/include/common/keywords.h index 6bb12d8edb3c4..0144377ab5b3e 100644 --- a/src/include/common/keywords.h +++ b/src/include/common/keywords.h @@ -4,7 +4,7 @@ * PostgreSQL's list of SQL keywords * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/keywords.h diff --git a/src/include/common/kwlookup.h b/src/include/common/kwlookup.h index 3fc3faa043475..3725e47cddab6 100644 --- a/src/include/common/kwlookup.h +++ b/src/include/common/kwlookup.h @@ -4,7 +4,7 @@ * Key word lookup for PostgreSQL * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/kwlookup.h diff --git a/src/include/common/link-canary.h b/src/include/common/link-canary.h index 178d123b1a0af..0c6daed0a7520 100644 --- a/src/include/common/link-canary.h +++ b/src/include/common/link-canary.h @@ -3,7 +3,7 @@ * link-canary.h * Detect whether src/common functions came from frontend or backend. * - * Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Copyright (c) 2018-2024, PostgreSQL Global Development Group * * src/include/common/link-canary.h * diff --git a/src/include/common/logging.h b/src/include/common/logging.h index 99e888af93d39..afbd9c059a952 100644 --- a/src/include/common/logging.h +++ b/src/include/common/logging.h @@ -1,7 +1,7 @@ /*------------------------------------------------------------------------- * Logging framework for frontend programs * - * Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Copyright (c) 2018-2024, PostgreSQL Global Development Group * * src/include/common/logging.h * diff --git a/src/include/common/md5.h b/src/include/common/md5.h index b6089bacff544..6c32f10e89af2 100644 --- a/src/include/common/md5.h +++ b/src/include/common/md5.h @@ -6,7 +6,7 @@ * These definitions are needed by both frontend and backend code to work * with MD5-encrypted passwords. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/md5.h diff --git a/src/include/common/openssl.h b/src/include/common/openssl.h index 060675ab33be8..964d691d32de5 100644 --- a/src/include/common/openssl.h +++ b/src/include/common/openssl.h @@ -3,7 +3,7 @@ * openssl.h * OpenSSL supporting functionality shared between frontend and backend * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/common/parse_manifest.h b/src/include/common/parse_manifest.h new file mode 100644 index 0000000000000..ce5cafa96617e --- /dev/null +++ b/src/include/common/parse_manifest.h @@ -0,0 +1,58 @@ +/*------------------------------------------------------------------------- + * + * parse_manifest.h + * Parse a backup manifest in JSON format. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/common/parse_manifest.h + * + *------------------------------------------------------------------------- + */ + +#ifndef PARSE_MANIFEST_H +#define PARSE_MANIFEST_H + +#include "access/xlogdefs.h" +#include "common/checksum_helper.h" +#include "mb/pg_wchar.h" + +struct JsonManifestParseContext; +typedef struct JsonManifestParseContext JsonManifestParseContext; +typedef struct JsonManifestParseIncrementalState JsonManifestParseIncrementalState; + +typedef void (*json_manifest_version_callback) (JsonManifestParseContext *, + int manifest_version); +typedef void (*json_manifest_system_identifier_callback) (JsonManifestParseContext *, + uint64 manifest_system_identifier); +typedef void (*json_manifest_per_file_callback) (JsonManifestParseContext *, + const char *pathname, + size_t size, pg_checksum_type checksum_type, + int checksum_length, uint8 *checksum_payload); +typedef void (*json_manifest_per_wal_range_callback) (JsonManifestParseContext *, + TimeLineID tli, + XLogRecPtr start_lsn, XLogRecPtr end_lsn); +typedef void (*json_manifest_error_callback) (JsonManifestParseContext *, + const char *fmt,...) pg_attribute_printf(2, 3) + pg_attribute_noreturn(); + +struct JsonManifestParseContext +{ + void *private_data; + json_manifest_version_callback version_cb; + json_manifest_system_identifier_callback system_identifier_cb; + json_manifest_per_file_callback per_file_cb; + json_manifest_per_wal_range_callback per_wal_range_cb; + json_manifest_error_callback error_cb; +}; + +extern void json_parse_manifest(JsonManifestParseContext *context, + const char *buffer, size_t size); +extern JsonManifestParseIncrementalState *json_parse_manifest_incremental_init(JsonManifestParseContext *context); +extern void json_parse_manifest_incremental_chunk(JsonManifestParseIncrementalState *incstate, + const char *chunk, size_t size, + bool is_last); +extern void json_parse_manifest_incremental_shutdown(JsonManifestParseIncrementalState *incstate); + +#endif diff --git a/src/include/common/percentrepl.h b/src/include/common/percentrepl.h index 0efb6ecb5bab7..fbca9c1fc901e 100644 --- a/src/include/common/percentrepl.h +++ b/src/include/common/percentrepl.h @@ -3,7 +3,7 @@ * percentrepl.h * Common routines to replace percent placeholders in strings * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/percentrepl.h diff --git a/src/include/common/pg_prng.h b/src/include/common/pg_prng.h index b5c0b8d2883a2..c114c6419d009 100644 --- a/src/include/common/pg_prng.h +++ b/src/include/common/pg_prng.h @@ -2,7 +2,7 @@ * * Pseudo-Random Number Generator * - * Copyright (c) 2021-2023, PostgreSQL Global Development Group + * Copyright (c) 2021-2024, PostgreSQL Global Development Group * * src/include/common/pg_prng.h * @@ -51,6 +51,7 @@ extern uint64 pg_prng_uint64(pg_prng_state *state); extern uint64 pg_prng_uint64_range(pg_prng_state *state, uint64 rmin, uint64 rmax); extern int64 pg_prng_int64(pg_prng_state *state); extern int64 pg_prng_int64p(pg_prng_state *state); +extern int64 pg_prng_int64_range(pg_prng_state *state, int64 rmin, int64 rmax); extern uint32 pg_prng_uint32(pg_prng_state *state); extern int32 pg_prng_int32(pg_prng_state *state); extern int32 pg_prng_int32p(pg_prng_state *state); diff --git a/src/include/common/relpath.h b/src/include/common/relpath.h index 511c21682ecc8..6f006d5a938c5 100644 --- a/src/include/common/relpath.h +++ b/src/include/common/relpath.h @@ -3,7 +3,7 @@ * relpath.h * Declarations for GetRelationPath() and friends * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/relpath.h @@ -50,7 +50,7 @@ typedef enum ForkNumber MAIN_FORKNUM = 0, FSM_FORKNUM, VISIBILITYMAP_FORKNUM, - INIT_FORKNUM + INIT_FORKNUM, /* * NOTE: if you add a new fork, change MAX_FORKNUM and possibly @@ -74,7 +74,7 @@ extern int forkname_chars(const char *str, ForkNumber *fork); extern char *GetDatabasePath(Oid dbOid, Oid spcOid); extern char *GetRelationPath(Oid dbOid, Oid spcOid, RelFileNumber relNumber, - int backendId, ForkNumber forkNumber); + int procNumber, ForkNumber forkNumber); /* * Wrapper macros for GetRelationPath. Beware of multiple @@ -88,7 +88,7 @@ extern char *GetRelationPath(Oid dbOid, Oid spcOid, RelFileNumber relNumber, /* First argument is a RelFileLocator */ #define relpathperm(rlocator, forknum) \ - relpathbackend(rlocator, InvalidBackendId, forknum) + relpathbackend(rlocator, INVALID_PROC_NUMBER, forknum) /* First argument is a RelFileLocatorBackend */ #define relpath(rlocator, forknum) \ diff --git a/src/include/common/restricted_token.h b/src/include/common/restricted_token.h index d4077c76613e2..aa83eb2cd0f07 100644 --- a/src/include/common/restricted_token.h +++ b/src/include/common/restricted_token.h @@ -2,7 +2,7 @@ * restricted_token.h * helper routine to ensure restricted token on Windows * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/restricted_token.h diff --git a/src/include/common/saslprep.h b/src/include/common/saslprep.h index f622db962f8fa..aaf3e8e12cb14 100644 --- a/src/include/common/saslprep.h +++ b/src/include/common/saslprep.h @@ -5,7 +5,7 @@ * * These definitions are used by both frontend and backend code. * - * Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Copyright (c) 2017-2024, PostgreSQL Global Development Group * * src/include/common/saslprep.h * @@ -22,7 +22,7 @@ typedef enum SASLPREP_SUCCESS = 0, SASLPREP_OOM = -1, /* out of memory (only in frontend) */ SASLPREP_INVALID_UTF8 = -2, /* input is not a valid UTF-8 string */ - SASLPREP_PROHIBITED = -3 /* output would contain prohibited characters */ + SASLPREP_PROHIBITED = -3, /* output would contain prohibited characters */ } pg_saslprep_rc; extern pg_saslprep_rc pg_saslprep(const char *input, char **output); diff --git a/src/include/common/scram-common.h b/src/include/common/scram-common.h index 5ccff96eceec0..ce848aa328df9 100644 --- a/src/include/common/scram-common.h +++ b/src/include/common/scram-common.h @@ -3,7 +3,7 @@ * scram-common.h * Declarations for helper functions used for SCRAM authentication * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/scram-common.h diff --git a/src/include/common/sha1.h b/src/include/common/sha1.h index e6933d96bbc88..b66d9ae033c2c 100644 --- a/src/include/common/sha1.h +++ b/src/include/common/sha1.h @@ -3,7 +3,7 @@ * sha1.h * Constants related to SHA1. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/sha1.h diff --git a/src/include/common/sha2.h b/src/include/common/sha2.h index 9b46cd1a37356..ea040c579f32b 100644 --- a/src/include/common/sha2.h +++ b/src/include/common/sha2.h @@ -3,7 +3,7 @@ * sha2.h * Constants related to SHA224, 256, 384 AND 512. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/common/shortest_dec.h b/src/include/common/shortest_dec.h index 8479b98575fc3..d780b23eedf96 100644 --- a/src/include/common/shortest_dec.h +++ b/src/include/common/shortest_dec.h @@ -2,7 +2,7 @@ * * Ryu floating-point output. * - * Portions Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2018-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/common/shortest_dec.h diff --git a/src/include/common/string.h b/src/include/common/string.h index 977ef327d0f35..721aabe9dc1b6 100644 --- a/src/include/common/string.h +++ b/src/include/common/string.h @@ -2,7 +2,7 @@ * string.h * string handling helpers * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/string.h diff --git a/src/include/common/unicode_case.h b/src/include/common/unicode_case.h new file mode 100644 index 0000000000000..5a65c12d45315 --- /dev/null +++ b/src/include/common/unicode_case.h @@ -0,0 +1,32 @@ +/*------------------------------------------------------------------------- + * + * unicode_case.h + * Routines for converting character case. + * + * These definitions can be used by both frontend and backend code. + * + * Copyright (c) 2017-2024, PostgreSQL Global Development Group + * + * src/include/common/unicode_case.h + * + *------------------------------------------------------------------------- + */ +#ifndef UNICODE_CASE_H +#define UNICODE_CASE_H + +#include "mb/pg_wchar.h" + +typedef size_t (*WordBoundaryNext) (void *wbstate); + +pg_wchar unicode_lowercase_simple(pg_wchar code); +pg_wchar unicode_titlecase_simple(pg_wchar code); +pg_wchar unicode_uppercase_simple(pg_wchar code); +size_t unicode_strlower(char *dst, size_t dstsize, const char *src, + ssize_t srclen); +size_t unicode_strtitle(char *dst, size_t dstsize, const char *src, + ssize_t srclen, WordBoundaryNext wbnext, + void *wbstate); +size_t unicode_strupper(char *dst, size_t dstsize, const char *src, + ssize_t srclen); + +#endif /* UNICODE_CASE_H */ diff --git a/src/include/common/unicode_case_table.h b/src/include/common/unicode_case_table.h new file mode 100644 index 0000000000000..eeda045839970 --- /dev/null +++ b/src/include/common/unicode_case_table.h @@ -0,0 +1,3001 @@ +/*------------------------------------------------------------------------- + * + * unicode_case_table.h + * Case mapping and information table. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/common/unicode_case_table.h + * + *------------------------------------------------------------------------- + */ + +/* + * File auto-generated by src/common/unicode/generate-unicode_case_table.pl, + * do not edit. There is deliberately not an #ifndef PG_UNICODE_CASE_TABLE_H + * here. + */ + +#include "common/unicode_case.h" +#include "mb/pg_wchar.h" + +typedef enum +{ + CaseLower = 0, + CaseTitle = 1, + CaseUpper = 2, + NCaseKind +} CaseKind; + +typedef struct +{ + pg_wchar codepoint; /* Unicode codepoint */ + pg_wchar simplemap[NCaseKind]; +} pg_case_map; + +/* + * Case mapping table. Dense for codepoints < 0x80 (enabling fast lookup), + * sparse for higher codepoints (requiring scan or binary search). + */ +static const pg_case_map case_map[2955] = +{ + /* begin dense entries for codepoints < 0x80 */ + {0x000000, {[CaseLower] = 0x000000,[CaseTitle] = 0x000000,[CaseUpper] = 0x000000}}, + {0x000001, {[CaseLower] = 0x000001,[CaseTitle] = 0x000001,[CaseUpper] = 0x000001}}, + {0x000002, {[CaseLower] = 0x000002,[CaseTitle] = 0x000002,[CaseUpper] = 0x000002}}, + {0x000003, {[CaseLower] = 0x000003,[CaseTitle] = 0x000003,[CaseUpper] = 0x000003}}, + {0x000004, {[CaseLower] = 0x000004,[CaseTitle] = 0x000004,[CaseUpper] = 0x000004}}, + {0x000005, {[CaseLower] = 0x000005,[CaseTitle] = 0x000005,[CaseUpper] = 0x000005}}, + {0x000006, {[CaseLower] = 0x000006,[CaseTitle] = 0x000006,[CaseUpper] = 0x000006}}, + {0x000007, {[CaseLower] = 0x000007,[CaseTitle] = 0x000007,[CaseUpper] = 0x000007}}, + {0x000008, {[CaseLower] = 0x000008,[CaseTitle] = 0x000008,[CaseUpper] = 0x000008}}, + {0x000009, {[CaseLower] = 0x000009,[CaseTitle] = 0x000009,[CaseUpper] = 0x000009}}, + {0x00000a, {[CaseLower] = 0x00000a,[CaseTitle] = 0x00000a,[CaseUpper] = 0x00000a}}, + {0x00000b, {[CaseLower] = 0x00000b,[CaseTitle] = 0x00000b,[CaseUpper] = 0x00000b}}, + {0x00000c, {[CaseLower] = 0x00000c,[CaseTitle] = 0x00000c,[CaseUpper] = 0x00000c}}, + {0x00000d, {[CaseLower] = 0x00000d,[CaseTitle] = 0x00000d,[CaseUpper] = 0x00000d}}, + {0x00000e, {[CaseLower] = 0x00000e,[CaseTitle] = 0x00000e,[CaseUpper] = 0x00000e}}, + {0x00000f, {[CaseLower] = 0x00000f,[CaseTitle] = 0x00000f,[CaseUpper] = 0x00000f}}, + {0x000010, {[CaseLower] = 0x000010,[CaseTitle] = 0x000010,[CaseUpper] = 0x000010}}, + {0x000011, {[CaseLower] = 0x000011,[CaseTitle] = 0x000011,[CaseUpper] = 0x000011}}, + {0x000012, {[CaseLower] = 0x000012,[CaseTitle] = 0x000012,[CaseUpper] = 0x000012}}, + {0x000013, {[CaseLower] = 0x000013,[CaseTitle] = 0x000013,[CaseUpper] = 0x000013}}, + {0x000014, {[CaseLower] = 0x000014,[CaseTitle] = 0x000014,[CaseUpper] = 0x000014}}, + {0x000015, {[CaseLower] = 0x000015,[CaseTitle] = 0x000015,[CaseUpper] = 0x000015}}, + {0x000016, {[CaseLower] = 0x000016,[CaseTitle] = 0x000016,[CaseUpper] = 0x000016}}, + {0x000017, {[CaseLower] = 0x000017,[CaseTitle] = 0x000017,[CaseUpper] = 0x000017}}, + {0x000018, {[CaseLower] = 0x000018,[CaseTitle] = 0x000018,[CaseUpper] = 0x000018}}, + {0x000019, {[CaseLower] = 0x000019,[CaseTitle] = 0x000019,[CaseUpper] = 0x000019}}, + {0x00001a, {[CaseLower] = 0x00001a,[CaseTitle] = 0x00001a,[CaseUpper] = 0x00001a}}, + {0x00001b, {[CaseLower] = 0x00001b,[CaseTitle] = 0x00001b,[CaseUpper] = 0x00001b}}, + {0x00001c, {[CaseLower] = 0x00001c,[CaseTitle] = 0x00001c,[CaseUpper] = 0x00001c}}, + {0x00001d, {[CaseLower] = 0x00001d,[CaseTitle] = 0x00001d,[CaseUpper] = 0x00001d}}, + {0x00001e, {[CaseLower] = 0x00001e,[CaseTitle] = 0x00001e,[CaseUpper] = 0x00001e}}, + {0x00001f, {[CaseLower] = 0x00001f,[CaseTitle] = 0x00001f,[CaseUpper] = 0x00001f}}, + {0x000020, {[CaseLower] = 0x000020,[CaseTitle] = 0x000020,[CaseUpper] = 0x000020}}, + {0x000021, {[CaseLower] = 0x000021,[CaseTitle] = 0x000021,[CaseUpper] = 0x000021}}, + {0x000022, {[CaseLower] = 0x000022,[CaseTitle] = 0x000022,[CaseUpper] = 0x000022}}, + {0x000023, {[CaseLower] = 0x000023,[CaseTitle] = 0x000023,[CaseUpper] = 0x000023}}, + {0x000024, {[CaseLower] = 0x000024,[CaseTitle] = 0x000024,[CaseUpper] = 0x000024}}, + {0x000025, {[CaseLower] = 0x000025,[CaseTitle] = 0x000025,[CaseUpper] = 0x000025}}, + {0x000026, {[CaseLower] = 0x000026,[CaseTitle] = 0x000026,[CaseUpper] = 0x000026}}, + {0x000027, {[CaseLower] = 0x000027,[CaseTitle] = 0x000027,[CaseUpper] = 0x000027}}, + {0x000028, {[CaseLower] = 0x000028,[CaseTitle] = 0x000028,[CaseUpper] = 0x000028}}, + {0x000029, {[CaseLower] = 0x000029,[CaseTitle] = 0x000029,[CaseUpper] = 0x000029}}, + {0x00002a, {[CaseLower] = 0x00002a,[CaseTitle] = 0x00002a,[CaseUpper] = 0x00002a}}, + {0x00002b, {[CaseLower] = 0x00002b,[CaseTitle] = 0x00002b,[CaseUpper] = 0x00002b}}, + {0x00002c, {[CaseLower] = 0x00002c,[CaseTitle] = 0x00002c,[CaseUpper] = 0x00002c}}, + {0x00002d, {[CaseLower] = 0x00002d,[CaseTitle] = 0x00002d,[CaseUpper] = 0x00002d}}, + {0x00002e, {[CaseLower] = 0x00002e,[CaseTitle] = 0x00002e,[CaseUpper] = 0x00002e}}, + {0x00002f, {[CaseLower] = 0x00002f,[CaseTitle] = 0x00002f,[CaseUpper] = 0x00002f}}, + {0x000030, {[CaseLower] = 0x000030,[CaseTitle] = 0x000030,[CaseUpper] = 0x000030}}, + {0x000031, {[CaseLower] = 0x000031,[CaseTitle] = 0x000031,[CaseUpper] = 0x000031}}, + {0x000032, {[CaseLower] = 0x000032,[CaseTitle] = 0x000032,[CaseUpper] = 0x000032}}, + {0x000033, {[CaseLower] = 0x000033,[CaseTitle] = 0x000033,[CaseUpper] = 0x000033}}, + {0x000034, {[CaseLower] = 0x000034,[CaseTitle] = 0x000034,[CaseUpper] = 0x000034}}, + {0x000035, {[CaseLower] = 0x000035,[CaseTitle] = 0x000035,[CaseUpper] = 0x000035}}, + {0x000036, {[CaseLower] = 0x000036,[CaseTitle] = 0x000036,[CaseUpper] = 0x000036}}, + {0x000037, {[CaseLower] = 0x000037,[CaseTitle] = 0x000037,[CaseUpper] = 0x000037}}, + {0x000038, {[CaseLower] = 0x000038,[CaseTitle] = 0x000038,[CaseUpper] = 0x000038}}, + {0x000039, {[CaseLower] = 0x000039,[CaseTitle] = 0x000039,[CaseUpper] = 0x000039}}, + {0x00003a, {[CaseLower] = 0x00003a,[CaseTitle] = 0x00003a,[CaseUpper] = 0x00003a}}, + {0x00003b, {[CaseLower] = 0x00003b,[CaseTitle] = 0x00003b,[CaseUpper] = 0x00003b}}, + {0x00003c, {[CaseLower] = 0x00003c,[CaseTitle] = 0x00003c,[CaseUpper] = 0x00003c}}, + {0x00003d, {[CaseLower] = 0x00003d,[CaseTitle] = 0x00003d,[CaseUpper] = 0x00003d}}, + {0x00003e, {[CaseLower] = 0x00003e,[CaseTitle] = 0x00003e,[CaseUpper] = 0x00003e}}, + {0x00003f, {[CaseLower] = 0x00003f,[CaseTitle] = 0x00003f,[CaseUpper] = 0x00003f}}, + {0x000040, {[CaseLower] = 0x000040,[CaseTitle] = 0x000040,[CaseUpper] = 0x000040}}, + {0x000041, {[CaseLower] = 0x000061,[CaseTitle] = 0x000041,[CaseUpper] = 0x000041}}, + {0x000042, {[CaseLower] = 0x000062,[CaseTitle] = 0x000042,[CaseUpper] = 0x000042}}, + {0x000043, {[CaseLower] = 0x000063,[CaseTitle] = 0x000043,[CaseUpper] = 0x000043}}, + {0x000044, {[CaseLower] = 0x000064,[CaseTitle] = 0x000044,[CaseUpper] = 0x000044}}, + {0x000045, {[CaseLower] = 0x000065,[CaseTitle] = 0x000045,[CaseUpper] = 0x000045}}, + {0x000046, {[CaseLower] = 0x000066,[CaseTitle] = 0x000046,[CaseUpper] = 0x000046}}, + {0x000047, {[CaseLower] = 0x000067,[CaseTitle] = 0x000047,[CaseUpper] = 0x000047}}, + {0x000048, {[CaseLower] = 0x000068,[CaseTitle] = 0x000048,[CaseUpper] = 0x000048}}, + {0x000049, {[CaseLower] = 0x000069,[CaseTitle] = 0x000049,[CaseUpper] = 0x000049}}, + {0x00004a, {[CaseLower] = 0x00006a,[CaseTitle] = 0x00004a,[CaseUpper] = 0x00004a}}, + {0x00004b, {[CaseLower] = 0x00006b,[CaseTitle] = 0x00004b,[CaseUpper] = 0x00004b}}, + {0x00004c, {[CaseLower] = 0x00006c,[CaseTitle] = 0x00004c,[CaseUpper] = 0x00004c}}, + {0x00004d, {[CaseLower] = 0x00006d,[CaseTitle] = 0x00004d,[CaseUpper] = 0x00004d}}, + {0x00004e, {[CaseLower] = 0x00006e,[CaseTitle] = 0x00004e,[CaseUpper] = 0x00004e}}, + {0x00004f, {[CaseLower] = 0x00006f,[CaseTitle] = 0x00004f,[CaseUpper] = 0x00004f}}, + {0x000050, {[CaseLower] = 0x000070,[CaseTitle] = 0x000050,[CaseUpper] = 0x000050}}, + {0x000051, {[CaseLower] = 0x000071,[CaseTitle] = 0x000051,[CaseUpper] = 0x000051}}, + {0x000052, {[CaseLower] = 0x000072,[CaseTitle] = 0x000052,[CaseUpper] = 0x000052}}, + {0x000053, {[CaseLower] = 0x000073,[CaseTitle] = 0x000053,[CaseUpper] = 0x000053}}, + {0x000054, {[CaseLower] = 0x000074,[CaseTitle] = 0x000054,[CaseUpper] = 0x000054}}, + {0x000055, {[CaseLower] = 0x000075,[CaseTitle] = 0x000055,[CaseUpper] = 0x000055}}, + {0x000056, {[CaseLower] = 0x000076,[CaseTitle] = 0x000056,[CaseUpper] = 0x000056}}, + {0x000057, {[CaseLower] = 0x000077,[CaseTitle] = 0x000057,[CaseUpper] = 0x000057}}, + {0x000058, {[CaseLower] = 0x000078,[CaseTitle] = 0x000058,[CaseUpper] = 0x000058}}, + {0x000059, {[CaseLower] = 0x000079,[CaseTitle] = 0x000059,[CaseUpper] = 0x000059}}, + {0x00005a, {[CaseLower] = 0x00007a,[CaseTitle] = 0x00005a,[CaseUpper] = 0x00005a}}, + {0x00005b, {[CaseLower] = 0x00005b,[CaseTitle] = 0x00005b,[CaseUpper] = 0x00005b}}, + {0x00005c, {[CaseLower] = 0x00005c,[CaseTitle] = 0x00005c,[CaseUpper] = 0x00005c}}, + {0x00005d, {[CaseLower] = 0x00005d,[CaseTitle] = 0x00005d,[CaseUpper] = 0x00005d}}, + {0x00005e, {[CaseLower] = 0x00005e,[CaseTitle] = 0x00005e,[CaseUpper] = 0x00005e}}, + {0x00005f, {[CaseLower] = 0x00005f,[CaseTitle] = 0x00005f,[CaseUpper] = 0x00005f}}, + {0x000060, {[CaseLower] = 0x000060,[CaseTitle] = 0x000060,[CaseUpper] = 0x000060}}, + {0x000061, {[CaseLower] = 0x000061,[CaseTitle] = 0x000041,[CaseUpper] = 0x000041}}, + {0x000062, {[CaseLower] = 0x000062,[CaseTitle] = 0x000042,[CaseUpper] = 0x000042}}, + {0x000063, {[CaseLower] = 0x000063,[CaseTitle] = 0x000043,[CaseUpper] = 0x000043}}, + {0x000064, {[CaseLower] = 0x000064,[CaseTitle] = 0x000044,[CaseUpper] = 0x000044}}, + {0x000065, {[CaseLower] = 0x000065,[CaseTitle] = 0x000045,[CaseUpper] = 0x000045}}, + {0x000066, {[CaseLower] = 0x000066,[CaseTitle] = 0x000046,[CaseUpper] = 0x000046}}, + {0x000067, {[CaseLower] = 0x000067,[CaseTitle] = 0x000047,[CaseUpper] = 0x000047}}, + {0x000068, {[CaseLower] = 0x000068,[CaseTitle] = 0x000048,[CaseUpper] = 0x000048}}, + {0x000069, {[CaseLower] = 0x000069,[CaseTitle] = 0x000049,[CaseUpper] = 0x000049}}, + {0x00006a, {[CaseLower] = 0x00006a,[CaseTitle] = 0x00004a,[CaseUpper] = 0x00004a}}, + {0x00006b, {[CaseLower] = 0x00006b,[CaseTitle] = 0x00004b,[CaseUpper] = 0x00004b}}, + {0x00006c, {[CaseLower] = 0x00006c,[CaseTitle] = 0x00004c,[CaseUpper] = 0x00004c}}, + {0x00006d, {[CaseLower] = 0x00006d,[CaseTitle] = 0x00004d,[CaseUpper] = 0x00004d}}, + {0x00006e, {[CaseLower] = 0x00006e,[CaseTitle] = 0x00004e,[CaseUpper] = 0x00004e}}, + {0x00006f, {[CaseLower] = 0x00006f,[CaseTitle] = 0x00004f,[CaseUpper] = 0x00004f}}, + {0x000070, {[CaseLower] = 0x000070,[CaseTitle] = 0x000050,[CaseUpper] = 0x000050}}, + {0x000071, {[CaseLower] = 0x000071,[CaseTitle] = 0x000051,[CaseUpper] = 0x000051}}, + {0x000072, {[CaseLower] = 0x000072,[CaseTitle] = 0x000052,[CaseUpper] = 0x000052}}, + {0x000073, {[CaseLower] = 0x000073,[CaseTitle] = 0x000053,[CaseUpper] = 0x000053}}, + {0x000074, {[CaseLower] = 0x000074,[CaseTitle] = 0x000054,[CaseUpper] = 0x000054}}, + {0x000075, {[CaseLower] = 0x000075,[CaseTitle] = 0x000055,[CaseUpper] = 0x000055}}, + {0x000076, {[CaseLower] = 0x000076,[CaseTitle] = 0x000056,[CaseUpper] = 0x000056}}, + {0x000077, {[CaseLower] = 0x000077,[CaseTitle] = 0x000057,[CaseUpper] = 0x000057}}, + {0x000078, {[CaseLower] = 0x000078,[CaseTitle] = 0x000058,[CaseUpper] = 0x000058}}, + {0x000079, {[CaseLower] = 0x000079,[CaseTitle] = 0x000059,[CaseUpper] = 0x000059}}, + {0x00007a, {[CaseLower] = 0x00007a,[CaseTitle] = 0x00005a,[CaseUpper] = 0x00005a}}, + {0x00007b, {[CaseLower] = 0x00007b,[CaseTitle] = 0x00007b,[CaseUpper] = 0x00007b}}, + {0x00007c, {[CaseLower] = 0x00007c,[CaseTitle] = 0x00007c,[CaseUpper] = 0x00007c}}, + {0x00007d, {[CaseLower] = 0x00007d,[CaseTitle] = 0x00007d,[CaseUpper] = 0x00007d}}, + {0x00007e, {[CaseLower] = 0x00007e,[CaseTitle] = 0x00007e,[CaseUpper] = 0x00007e}}, + {0x00007f, {[CaseLower] = 0x00007f,[CaseTitle] = 0x00007f,[CaseUpper] = 0x00007f}}, + + /* begin sparse entries for codepoints >= 0x80 */ + {0x0000b5, {[CaseLower] = 0x0000b5,[CaseTitle] = 0x00039c,[CaseUpper] = 0x00039c}}, + {0x0000c0, {[CaseLower] = 0x0000e0,[CaseTitle] = 0x0000c0,[CaseUpper] = 0x0000c0}}, + {0x0000c1, {[CaseLower] = 0x0000e1,[CaseTitle] = 0x0000c1,[CaseUpper] = 0x0000c1}}, + {0x0000c2, {[CaseLower] = 0x0000e2,[CaseTitle] = 0x0000c2,[CaseUpper] = 0x0000c2}}, + {0x0000c3, {[CaseLower] = 0x0000e3,[CaseTitle] = 0x0000c3,[CaseUpper] = 0x0000c3}}, + {0x0000c4, {[CaseLower] = 0x0000e4,[CaseTitle] = 0x0000c4,[CaseUpper] = 0x0000c4}}, + {0x0000c5, {[CaseLower] = 0x0000e5,[CaseTitle] = 0x0000c5,[CaseUpper] = 0x0000c5}}, + {0x0000c6, {[CaseLower] = 0x0000e6,[CaseTitle] = 0x0000c6,[CaseUpper] = 0x0000c6}}, + {0x0000c7, {[CaseLower] = 0x0000e7,[CaseTitle] = 0x0000c7,[CaseUpper] = 0x0000c7}}, + {0x0000c8, {[CaseLower] = 0x0000e8,[CaseTitle] = 0x0000c8,[CaseUpper] = 0x0000c8}}, + {0x0000c9, {[CaseLower] = 0x0000e9,[CaseTitle] = 0x0000c9,[CaseUpper] = 0x0000c9}}, + {0x0000ca, {[CaseLower] = 0x0000ea,[CaseTitle] = 0x0000ca,[CaseUpper] = 0x0000ca}}, + {0x0000cb, {[CaseLower] = 0x0000eb,[CaseTitle] = 0x0000cb,[CaseUpper] = 0x0000cb}}, + {0x0000cc, {[CaseLower] = 0x0000ec,[CaseTitle] = 0x0000cc,[CaseUpper] = 0x0000cc}}, + {0x0000cd, {[CaseLower] = 0x0000ed,[CaseTitle] = 0x0000cd,[CaseUpper] = 0x0000cd}}, + {0x0000ce, {[CaseLower] = 0x0000ee,[CaseTitle] = 0x0000ce,[CaseUpper] = 0x0000ce}}, + {0x0000cf, {[CaseLower] = 0x0000ef,[CaseTitle] = 0x0000cf,[CaseUpper] = 0x0000cf}}, + {0x0000d0, {[CaseLower] = 0x0000f0,[CaseTitle] = 0x0000d0,[CaseUpper] = 0x0000d0}}, + {0x0000d1, {[CaseLower] = 0x0000f1,[CaseTitle] = 0x0000d1,[CaseUpper] = 0x0000d1}}, + {0x0000d2, {[CaseLower] = 0x0000f2,[CaseTitle] = 0x0000d2,[CaseUpper] = 0x0000d2}}, + {0x0000d3, {[CaseLower] = 0x0000f3,[CaseTitle] = 0x0000d3,[CaseUpper] = 0x0000d3}}, + {0x0000d4, {[CaseLower] = 0x0000f4,[CaseTitle] = 0x0000d4,[CaseUpper] = 0x0000d4}}, + {0x0000d5, {[CaseLower] = 0x0000f5,[CaseTitle] = 0x0000d5,[CaseUpper] = 0x0000d5}}, + {0x0000d6, {[CaseLower] = 0x0000f6,[CaseTitle] = 0x0000d6,[CaseUpper] = 0x0000d6}}, + {0x0000d8, {[CaseLower] = 0x0000f8,[CaseTitle] = 0x0000d8,[CaseUpper] = 0x0000d8}}, + {0x0000d9, {[CaseLower] = 0x0000f9,[CaseTitle] = 0x0000d9,[CaseUpper] = 0x0000d9}}, + {0x0000da, {[CaseLower] = 0x0000fa,[CaseTitle] = 0x0000da,[CaseUpper] = 0x0000da}}, + {0x0000db, {[CaseLower] = 0x0000fb,[CaseTitle] = 0x0000db,[CaseUpper] = 0x0000db}}, + {0x0000dc, {[CaseLower] = 0x0000fc,[CaseTitle] = 0x0000dc,[CaseUpper] = 0x0000dc}}, + {0x0000dd, {[CaseLower] = 0x0000fd,[CaseTitle] = 0x0000dd,[CaseUpper] = 0x0000dd}}, + {0x0000de, {[CaseLower] = 0x0000fe,[CaseTitle] = 0x0000de,[CaseUpper] = 0x0000de}}, + {0x0000e0, {[CaseLower] = 0x0000e0,[CaseTitle] = 0x0000c0,[CaseUpper] = 0x0000c0}}, + {0x0000e1, {[CaseLower] = 0x0000e1,[CaseTitle] = 0x0000c1,[CaseUpper] = 0x0000c1}}, + {0x0000e2, {[CaseLower] = 0x0000e2,[CaseTitle] = 0x0000c2,[CaseUpper] = 0x0000c2}}, + {0x0000e3, {[CaseLower] = 0x0000e3,[CaseTitle] = 0x0000c3,[CaseUpper] = 0x0000c3}}, + {0x0000e4, {[CaseLower] = 0x0000e4,[CaseTitle] = 0x0000c4,[CaseUpper] = 0x0000c4}}, + {0x0000e5, {[CaseLower] = 0x0000e5,[CaseTitle] = 0x0000c5,[CaseUpper] = 0x0000c5}}, + {0x0000e6, {[CaseLower] = 0x0000e6,[CaseTitle] = 0x0000c6,[CaseUpper] = 0x0000c6}}, + {0x0000e7, {[CaseLower] = 0x0000e7,[CaseTitle] = 0x0000c7,[CaseUpper] = 0x0000c7}}, + {0x0000e8, {[CaseLower] = 0x0000e8,[CaseTitle] = 0x0000c8,[CaseUpper] = 0x0000c8}}, + {0x0000e9, {[CaseLower] = 0x0000e9,[CaseTitle] = 0x0000c9,[CaseUpper] = 0x0000c9}}, + {0x0000ea, {[CaseLower] = 0x0000ea,[CaseTitle] = 0x0000ca,[CaseUpper] = 0x0000ca}}, + {0x0000eb, {[CaseLower] = 0x0000eb,[CaseTitle] = 0x0000cb,[CaseUpper] = 0x0000cb}}, + {0x0000ec, {[CaseLower] = 0x0000ec,[CaseTitle] = 0x0000cc,[CaseUpper] = 0x0000cc}}, + {0x0000ed, {[CaseLower] = 0x0000ed,[CaseTitle] = 0x0000cd,[CaseUpper] = 0x0000cd}}, + {0x0000ee, {[CaseLower] = 0x0000ee,[CaseTitle] = 0x0000ce,[CaseUpper] = 0x0000ce}}, + {0x0000ef, {[CaseLower] = 0x0000ef,[CaseTitle] = 0x0000cf,[CaseUpper] = 0x0000cf}}, + {0x0000f0, {[CaseLower] = 0x0000f0,[CaseTitle] = 0x0000d0,[CaseUpper] = 0x0000d0}}, + {0x0000f1, {[CaseLower] = 0x0000f1,[CaseTitle] = 0x0000d1,[CaseUpper] = 0x0000d1}}, + {0x0000f2, {[CaseLower] = 0x0000f2,[CaseTitle] = 0x0000d2,[CaseUpper] = 0x0000d2}}, + {0x0000f3, {[CaseLower] = 0x0000f3,[CaseTitle] = 0x0000d3,[CaseUpper] = 0x0000d3}}, + {0x0000f4, {[CaseLower] = 0x0000f4,[CaseTitle] = 0x0000d4,[CaseUpper] = 0x0000d4}}, + {0x0000f5, {[CaseLower] = 0x0000f5,[CaseTitle] = 0x0000d5,[CaseUpper] = 0x0000d5}}, + {0x0000f6, {[CaseLower] = 0x0000f6,[CaseTitle] = 0x0000d6,[CaseUpper] = 0x0000d6}}, + {0x0000f8, {[CaseLower] = 0x0000f8,[CaseTitle] = 0x0000d8,[CaseUpper] = 0x0000d8}}, + {0x0000f9, {[CaseLower] = 0x0000f9,[CaseTitle] = 0x0000d9,[CaseUpper] = 0x0000d9}}, + {0x0000fa, {[CaseLower] = 0x0000fa,[CaseTitle] = 0x0000da,[CaseUpper] = 0x0000da}}, + {0x0000fb, {[CaseLower] = 0x0000fb,[CaseTitle] = 0x0000db,[CaseUpper] = 0x0000db}}, + {0x0000fc, {[CaseLower] = 0x0000fc,[CaseTitle] = 0x0000dc,[CaseUpper] = 0x0000dc}}, + {0x0000fd, {[CaseLower] = 0x0000fd,[CaseTitle] = 0x0000dd,[CaseUpper] = 0x0000dd}}, + {0x0000fe, {[CaseLower] = 0x0000fe,[CaseTitle] = 0x0000de,[CaseUpper] = 0x0000de}}, + {0x0000ff, {[CaseLower] = 0x0000ff,[CaseTitle] = 0x000178,[CaseUpper] = 0x000178}}, + {0x000100, {[CaseLower] = 0x000101,[CaseTitle] = 0x000100,[CaseUpper] = 0x000100}}, + {0x000101, {[CaseLower] = 0x000101,[CaseTitle] = 0x000100,[CaseUpper] = 0x000100}}, + {0x000102, {[CaseLower] = 0x000103,[CaseTitle] = 0x000102,[CaseUpper] = 0x000102}}, + {0x000103, {[CaseLower] = 0x000103,[CaseTitle] = 0x000102,[CaseUpper] = 0x000102}}, + {0x000104, {[CaseLower] = 0x000105,[CaseTitle] = 0x000104,[CaseUpper] = 0x000104}}, + {0x000105, {[CaseLower] = 0x000105,[CaseTitle] = 0x000104,[CaseUpper] = 0x000104}}, + {0x000106, {[CaseLower] = 0x000107,[CaseTitle] = 0x000106,[CaseUpper] = 0x000106}}, + {0x000107, {[CaseLower] = 0x000107,[CaseTitle] = 0x000106,[CaseUpper] = 0x000106}}, + {0x000108, {[CaseLower] = 0x000109,[CaseTitle] = 0x000108,[CaseUpper] = 0x000108}}, + {0x000109, {[CaseLower] = 0x000109,[CaseTitle] = 0x000108,[CaseUpper] = 0x000108}}, + {0x00010a, {[CaseLower] = 0x00010b,[CaseTitle] = 0x00010a,[CaseUpper] = 0x00010a}}, + {0x00010b, {[CaseLower] = 0x00010b,[CaseTitle] = 0x00010a,[CaseUpper] = 0x00010a}}, + {0x00010c, {[CaseLower] = 0x00010d,[CaseTitle] = 0x00010c,[CaseUpper] = 0x00010c}}, + {0x00010d, {[CaseLower] = 0x00010d,[CaseTitle] = 0x00010c,[CaseUpper] = 0x00010c}}, + {0x00010e, {[CaseLower] = 0x00010f,[CaseTitle] = 0x00010e,[CaseUpper] = 0x00010e}}, + {0x00010f, {[CaseLower] = 0x00010f,[CaseTitle] = 0x00010e,[CaseUpper] = 0x00010e}}, + {0x000110, {[CaseLower] = 0x000111,[CaseTitle] = 0x000110,[CaseUpper] = 0x000110}}, + {0x000111, {[CaseLower] = 0x000111,[CaseTitle] = 0x000110,[CaseUpper] = 0x000110}}, + {0x000112, {[CaseLower] = 0x000113,[CaseTitle] = 0x000112,[CaseUpper] = 0x000112}}, + {0x000113, {[CaseLower] = 0x000113,[CaseTitle] = 0x000112,[CaseUpper] = 0x000112}}, + {0x000114, {[CaseLower] = 0x000115,[CaseTitle] = 0x000114,[CaseUpper] = 0x000114}}, + {0x000115, {[CaseLower] = 0x000115,[CaseTitle] = 0x000114,[CaseUpper] = 0x000114}}, + {0x000116, {[CaseLower] = 0x000117,[CaseTitle] = 0x000116,[CaseUpper] = 0x000116}}, + {0x000117, {[CaseLower] = 0x000117,[CaseTitle] = 0x000116,[CaseUpper] = 0x000116}}, + {0x000118, {[CaseLower] = 0x000119,[CaseTitle] = 0x000118,[CaseUpper] = 0x000118}}, + {0x000119, {[CaseLower] = 0x000119,[CaseTitle] = 0x000118,[CaseUpper] = 0x000118}}, + {0x00011a, {[CaseLower] = 0x00011b,[CaseTitle] = 0x00011a,[CaseUpper] = 0x00011a}}, + {0x00011b, {[CaseLower] = 0x00011b,[CaseTitle] = 0x00011a,[CaseUpper] = 0x00011a}}, + {0x00011c, {[CaseLower] = 0x00011d,[CaseTitle] = 0x00011c,[CaseUpper] = 0x00011c}}, + {0x00011d, {[CaseLower] = 0x00011d,[CaseTitle] = 0x00011c,[CaseUpper] = 0x00011c}}, + {0x00011e, {[CaseLower] = 0x00011f,[CaseTitle] = 0x00011e,[CaseUpper] = 0x00011e}}, + {0x00011f, {[CaseLower] = 0x00011f,[CaseTitle] = 0x00011e,[CaseUpper] = 0x00011e}}, + {0x000120, {[CaseLower] = 0x000121,[CaseTitle] = 0x000120,[CaseUpper] = 0x000120}}, + {0x000121, {[CaseLower] = 0x000121,[CaseTitle] = 0x000120,[CaseUpper] = 0x000120}}, + {0x000122, {[CaseLower] = 0x000123,[CaseTitle] = 0x000122,[CaseUpper] = 0x000122}}, + {0x000123, {[CaseLower] = 0x000123,[CaseTitle] = 0x000122,[CaseUpper] = 0x000122}}, + {0x000124, {[CaseLower] = 0x000125,[CaseTitle] = 0x000124,[CaseUpper] = 0x000124}}, + {0x000125, {[CaseLower] = 0x000125,[CaseTitle] = 0x000124,[CaseUpper] = 0x000124}}, + {0x000126, {[CaseLower] = 0x000127,[CaseTitle] = 0x000126,[CaseUpper] = 0x000126}}, + {0x000127, {[CaseLower] = 0x000127,[CaseTitle] = 0x000126,[CaseUpper] = 0x000126}}, + {0x000128, {[CaseLower] = 0x000129,[CaseTitle] = 0x000128,[CaseUpper] = 0x000128}}, + {0x000129, {[CaseLower] = 0x000129,[CaseTitle] = 0x000128,[CaseUpper] = 0x000128}}, + {0x00012a, {[CaseLower] = 0x00012b,[CaseTitle] = 0x00012a,[CaseUpper] = 0x00012a}}, + {0x00012b, {[CaseLower] = 0x00012b,[CaseTitle] = 0x00012a,[CaseUpper] = 0x00012a}}, + {0x00012c, {[CaseLower] = 0x00012d,[CaseTitle] = 0x00012c,[CaseUpper] = 0x00012c}}, + {0x00012d, {[CaseLower] = 0x00012d,[CaseTitle] = 0x00012c,[CaseUpper] = 0x00012c}}, + {0x00012e, {[CaseLower] = 0x00012f,[CaseTitle] = 0x00012e,[CaseUpper] = 0x00012e}}, + {0x00012f, {[CaseLower] = 0x00012f,[CaseTitle] = 0x00012e,[CaseUpper] = 0x00012e}}, + {0x000130, {[CaseLower] = 0x000069,[CaseTitle] = 0x000130,[CaseUpper] = 0x000130}}, + {0x000131, {[CaseLower] = 0x000131,[CaseTitle] = 0x000049,[CaseUpper] = 0x000049}}, + {0x000132, {[CaseLower] = 0x000133,[CaseTitle] = 0x000132,[CaseUpper] = 0x000132}}, + {0x000133, {[CaseLower] = 0x000133,[CaseTitle] = 0x000132,[CaseUpper] = 0x000132}}, + {0x000134, {[CaseLower] = 0x000135,[CaseTitle] = 0x000134,[CaseUpper] = 0x000134}}, + {0x000135, {[CaseLower] = 0x000135,[CaseTitle] = 0x000134,[CaseUpper] = 0x000134}}, + {0x000136, {[CaseLower] = 0x000137,[CaseTitle] = 0x000136,[CaseUpper] = 0x000136}}, + {0x000137, {[CaseLower] = 0x000137,[CaseTitle] = 0x000136,[CaseUpper] = 0x000136}}, + {0x000139, {[CaseLower] = 0x00013a,[CaseTitle] = 0x000139,[CaseUpper] = 0x000139}}, + {0x00013a, {[CaseLower] = 0x00013a,[CaseTitle] = 0x000139,[CaseUpper] = 0x000139}}, + {0x00013b, {[CaseLower] = 0x00013c,[CaseTitle] = 0x00013b,[CaseUpper] = 0x00013b}}, + {0x00013c, {[CaseLower] = 0x00013c,[CaseTitle] = 0x00013b,[CaseUpper] = 0x00013b}}, + {0x00013d, {[CaseLower] = 0x00013e,[CaseTitle] = 0x00013d,[CaseUpper] = 0x00013d}}, + {0x00013e, {[CaseLower] = 0x00013e,[CaseTitle] = 0x00013d,[CaseUpper] = 0x00013d}}, + {0x00013f, {[CaseLower] = 0x000140,[CaseTitle] = 0x00013f,[CaseUpper] = 0x00013f}}, + {0x000140, {[CaseLower] = 0x000140,[CaseTitle] = 0x00013f,[CaseUpper] = 0x00013f}}, + {0x000141, {[CaseLower] = 0x000142,[CaseTitle] = 0x000141,[CaseUpper] = 0x000141}}, + {0x000142, {[CaseLower] = 0x000142,[CaseTitle] = 0x000141,[CaseUpper] = 0x000141}}, + {0x000143, {[CaseLower] = 0x000144,[CaseTitle] = 0x000143,[CaseUpper] = 0x000143}}, + {0x000144, {[CaseLower] = 0x000144,[CaseTitle] = 0x000143,[CaseUpper] = 0x000143}}, + {0x000145, {[CaseLower] = 0x000146,[CaseTitle] = 0x000145,[CaseUpper] = 0x000145}}, + {0x000146, {[CaseLower] = 0x000146,[CaseTitle] = 0x000145,[CaseUpper] = 0x000145}}, + {0x000147, {[CaseLower] = 0x000148,[CaseTitle] = 0x000147,[CaseUpper] = 0x000147}}, + {0x000148, {[CaseLower] = 0x000148,[CaseTitle] = 0x000147,[CaseUpper] = 0x000147}}, + {0x00014a, {[CaseLower] = 0x00014b,[CaseTitle] = 0x00014a,[CaseUpper] = 0x00014a}}, + {0x00014b, {[CaseLower] = 0x00014b,[CaseTitle] = 0x00014a,[CaseUpper] = 0x00014a}}, + {0x00014c, {[CaseLower] = 0x00014d,[CaseTitle] = 0x00014c,[CaseUpper] = 0x00014c}}, + {0x00014d, {[CaseLower] = 0x00014d,[CaseTitle] = 0x00014c,[CaseUpper] = 0x00014c}}, + {0x00014e, {[CaseLower] = 0x00014f,[CaseTitle] = 0x00014e,[CaseUpper] = 0x00014e}}, + {0x00014f, {[CaseLower] = 0x00014f,[CaseTitle] = 0x00014e,[CaseUpper] = 0x00014e}}, + {0x000150, {[CaseLower] = 0x000151,[CaseTitle] = 0x000150,[CaseUpper] = 0x000150}}, + {0x000151, {[CaseLower] = 0x000151,[CaseTitle] = 0x000150,[CaseUpper] = 0x000150}}, + {0x000152, {[CaseLower] = 0x000153,[CaseTitle] = 0x000152,[CaseUpper] = 0x000152}}, + {0x000153, {[CaseLower] = 0x000153,[CaseTitle] = 0x000152,[CaseUpper] = 0x000152}}, + {0x000154, {[CaseLower] = 0x000155,[CaseTitle] = 0x000154,[CaseUpper] = 0x000154}}, + {0x000155, {[CaseLower] = 0x000155,[CaseTitle] = 0x000154,[CaseUpper] = 0x000154}}, + {0x000156, {[CaseLower] = 0x000157,[CaseTitle] = 0x000156,[CaseUpper] = 0x000156}}, + {0x000157, {[CaseLower] = 0x000157,[CaseTitle] = 0x000156,[CaseUpper] = 0x000156}}, + {0x000158, {[CaseLower] = 0x000159,[CaseTitle] = 0x000158,[CaseUpper] = 0x000158}}, + {0x000159, {[CaseLower] = 0x000159,[CaseTitle] = 0x000158,[CaseUpper] = 0x000158}}, + {0x00015a, {[CaseLower] = 0x00015b,[CaseTitle] = 0x00015a,[CaseUpper] = 0x00015a}}, + {0x00015b, {[CaseLower] = 0x00015b,[CaseTitle] = 0x00015a,[CaseUpper] = 0x00015a}}, + {0x00015c, {[CaseLower] = 0x00015d,[CaseTitle] = 0x00015c,[CaseUpper] = 0x00015c}}, + {0x00015d, {[CaseLower] = 0x00015d,[CaseTitle] = 0x00015c,[CaseUpper] = 0x00015c}}, + {0x00015e, {[CaseLower] = 0x00015f,[CaseTitle] = 0x00015e,[CaseUpper] = 0x00015e}}, + {0x00015f, {[CaseLower] = 0x00015f,[CaseTitle] = 0x00015e,[CaseUpper] = 0x00015e}}, + {0x000160, {[CaseLower] = 0x000161,[CaseTitle] = 0x000160,[CaseUpper] = 0x000160}}, + {0x000161, {[CaseLower] = 0x000161,[CaseTitle] = 0x000160,[CaseUpper] = 0x000160}}, + {0x000162, {[CaseLower] = 0x000163,[CaseTitle] = 0x000162,[CaseUpper] = 0x000162}}, + {0x000163, {[CaseLower] = 0x000163,[CaseTitle] = 0x000162,[CaseUpper] = 0x000162}}, + {0x000164, {[CaseLower] = 0x000165,[CaseTitle] = 0x000164,[CaseUpper] = 0x000164}}, + {0x000165, {[CaseLower] = 0x000165,[CaseTitle] = 0x000164,[CaseUpper] = 0x000164}}, + {0x000166, {[CaseLower] = 0x000167,[CaseTitle] = 0x000166,[CaseUpper] = 0x000166}}, + {0x000167, {[CaseLower] = 0x000167,[CaseTitle] = 0x000166,[CaseUpper] = 0x000166}}, + {0x000168, {[CaseLower] = 0x000169,[CaseTitle] = 0x000168,[CaseUpper] = 0x000168}}, + {0x000169, {[CaseLower] = 0x000169,[CaseTitle] = 0x000168,[CaseUpper] = 0x000168}}, + {0x00016a, {[CaseLower] = 0x00016b,[CaseTitle] = 0x00016a,[CaseUpper] = 0x00016a}}, + {0x00016b, {[CaseLower] = 0x00016b,[CaseTitle] = 0x00016a,[CaseUpper] = 0x00016a}}, + {0x00016c, {[CaseLower] = 0x00016d,[CaseTitle] = 0x00016c,[CaseUpper] = 0x00016c}}, + {0x00016d, {[CaseLower] = 0x00016d,[CaseTitle] = 0x00016c,[CaseUpper] = 0x00016c}}, + {0x00016e, {[CaseLower] = 0x00016f,[CaseTitle] = 0x00016e,[CaseUpper] = 0x00016e}}, + {0x00016f, {[CaseLower] = 0x00016f,[CaseTitle] = 0x00016e,[CaseUpper] = 0x00016e}}, + {0x000170, {[CaseLower] = 0x000171,[CaseTitle] = 0x000170,[CaseUpper] = 0x000170}}, + {0x000171, {[CaseLower] = 0x000171,[CaseTitle] = 0x000170,[CaseUpper] = 0x000170}}, + {0x000172, {[CaseLower] = 0x000173,[CaseTitle] = 0x000172,[CaseUpper] = 0x000172}}, + {0x000173, {[CaseLower] = 0x000173,[CaseTitle] = 0x000172,[CaseUpper] = 0x000172}}, + {0x000174, {[CaseLower] = 0x000175,[CaseTitle] = 0x000174,[CaseUpper] = 0x000174}}, + {0x000175, {[CaseLower] = 0x000175,[CaseTitle] = 0x000174,[CaseUpper] = 0x000174}}, + {0x000176, {[CaseLower] = 0x000177,[CaseTitle] = 0x000176,[CaseUpper] = 0x000176}}, + {0x000177, {[CaseLower] = 0x000177,[CaseTitle] = 0x000176,[CaseUpper] = 0x000176}}, + {0x000178, {[CaseLower] = 0x0000ff,[CaseTitle] = 0x000178,[CaseUpper] = 0x000178}}, + {0x000179, {[CaseLower] = 0x00017a,[CaseTitle] = 0x000179,[CaseUpper] = 0x000179}}, + {0x00017a, {[CaseLower] = 0x00017a,[CaseTitle] = 0x000179,[CaseUpper] = 0x000179}}, + {0x00017b, {[CaseLower] = 0x00017c,[CaseTitle] = 0x00017b,[CaseUpper] = 0x00017b}}, + {0x00017c, {[CaseLower] = 0x00017c,[CaseTitle] = 0x00017b,[CaseUpper] = 0x00017b}}, + {0x00017d, {[CaseLower] = 0x00017e,[CaseTitle] = 0x00017d,[CaseUpper] = 0x00017d}}, + {0x00017e, {[CaseLower] = 0x00017e,[CaseTitle] = 0x00017d,[CaseUpper] = 0x00017d}}, + {0x00017f, {[CaseLower] = 0x00017f,[CaseTitle] = 0x000053,[CaseUpper] = 0x000053}}, + {0x000180, {[CaseLower] = 0x000180,[CaseTitle] = 0x000243,[CaseUpper] = 0x000243}}, + {0x000181, {[CaseLower] = 0x000253,[CaseTitle] = 0x000181,[CaseUpper] = 0x000181}}, + {0x000182, {[CaseLower] = 0x000183,[CaseTitle] = 0x000182,[CaseUpper] = 0x000182}}, + {0x000183, {[CaseLower] = 0x000183,[CaseTitle] = 0x000182,[CaseUpper] = 0x000182}}, + {0x000184, {[CaseLower] = 0x000185,[CaseTitle] = 0x000184,[CaseUpper] = 0x000184}}, + {0x000185, {[CaseLower] = 0x000185,[CaseTitle] = 0x000184,[CaseUpper] = 0x000184}}, + {0x000186, {[CaseLower] = 0x000254,[CaseTitle] = 0x000186,[CaseUpper] = 0x000186}}, + {0x000187, {[CaseLower] = 0x000188,[CaseTitle] = 0x000187,[CaseUpper] = 0x000187}}, + {0x000188, {[CaseLower] = 0x000188,[CaseTitle] = 0x000187,[CaseUpper] = 0x000187}}, + {0x000189, {[CaseLower] = 0x000256,[CaseTitle] = 0x000189,[CaseUpper] = 0x000189}}, + {0x00018a, {[CaseLower] = 0x000257,[CaseTitle] = 0x00018a,[CaseUpper] = 0x00018a}}, + {0x00018b, {[CaseLower] = 0x00018c,[CaseTitle] = 0x00018b,[CaseUpper] = 0x00018b}}, + {0x00018c, {[CaseLower] = 0x00018c,[CaseTitle] = 0x00018b,[CaseUpper] = 0x00018b}}, + {0x00018e, {[CaseLower] = 0x0001dd,[CaseTitle] = 0x00018e,[CaseUpper] = 0x00018e}}, + {0x00018f, {[CaseLower] = 0x000259,[CaseTitle] = 0x00018f,[CaseUpper] = 0x00018f}}, + {0x000190, {[CaseLower] = 0x00025b,[CaseTitle] = 0x000190,[CaseUpper] = 0x000190}}, + {0x000191, {[CaseLower] = 0x000192,[CaseTitle] = 0x000191,[CaseUpper] = 0x000191}}, + {0x000192, {[CaseLower] = 0x000192,[CaseTitle] = 0x000191,[CaseUpper] = 0x000191}}, + {0x000193, {[CaseLower] = 0x000260,[CaseTitle] = 0x000193,[CaseUpper] = 0x000193}}, + {0x000194, {[CaseLower] = 0x000263,[CaseTitle] = 0x000194,[CaseUpper] = 0x000194}}, + {0x000195, {[CaseLower] = 0x000195,[CaseTitle] = 0x0001f6,[CaseUpper] = 0x0001f6}}, + {0x000196, {[CaseLower] = 0x000269,[CaseTitle] = 0x000196,[CaseUpper] = 0x000196}}, + {0x000197, {[CaseLower] = 0x000268,[CaseTitle] = 0x000197,[CaseUpper] = 0x000197}}, + {0x000198, {[CaseLower] = 0x000199,[CaseTitle] = 0x000198,[CaseUpper] = 0x000198}}, + {0x000199, {[CaseLower] = 0x000199,[CaseTitle] = 0x000198,[CaseUpper] = 0x000198}}, + {0x00019a, {[CaseLower] = 0x00019a,[CaseTitle] = 0x00023d,[CaseUpper] = 0x00023d}}, + {0x00019c, {[CaseLower] = 0x00026f,[CaseTitle] = 0x00019c,[CaseUpper] = 0x00019c}}, + {0x00019d, {[CaseLower] = 0x000272,[CaseTitle] = 0x00019d,[CaseUpper] = 0x00019d}}, + {0x00019e, {[CaseLower] = 0x00019e,[CaseTitle] = 0x000220,[CaseUpper] = 0x000220}}, + {0x00019f, {[CaseLower] = 0x000275,[CaseTitle] = 0x00019f,[CaseUpper] = 0x00019f}}, + {0x0001a0, {[CaseLower] = 0x0001a1,[CaseTitle] = 0x0001a0,[CaseUpper] = 0x0001a0}}, + {0x0001a1, {[CaseLower] = 0x0001a1,[CaseTitle] = 0x0001a0,[CaseUpper] = 0x0001a0}}, + {0x0001a2, {[CaseLower] = 0x0001a3,[CaseTitle] = 0x0001a2,[CaseUpper] = 0x0001a2}}, + {0x0001a3, {[CaseLower] = 0x0001a3,[CaseTitle] = 0x0001a2,[CaseUpper] = 0x0001a2}}, + {0x0001a4, {[CaseLower] = 0x0001a5,[CaseTitle] = 0x0001a4,[CaseUpper] = 0x0001a4}}, + {0x0001a5, {[CaseLower] = 0x0001a5,[CaseTitle] = 0x0001a4,[CaseUpper] = 0x0001a4}}, + {0x0001a6, {[CaseLower] = 0x000280,[CaseTitle] = 0x0001a6,[CaseUpper] = 0x0001a6}}, + {0x0001a7, {[CaseLower] = 0x0001a8,[CaseTitle] = 0x0001a7,[CaseUpper] = 0x0001a7}}, + {0x0001a8, {[CaseLower] = 0x0001a8,[CaseTitle] = 0x0001a7,[CaseUpper] = 0x0001a7}}, + {0x0001a9, {[CaseLower] = 0x000283,[CaseTitle] = 0x0001a9,[CaseUpper] = 0x0001a9}}, + {0x0001ac, {[CaseLower] = 0x0001ad,[CaseTitle] = 0x0001ac,[CaseUpper] = 0x0001ac}}, + {0x0001ad, {[CaseLower] = 0x0001ad,[CaseTitle] = 0x0001ac,[CaseUpper] = 0x0001ac}}, + {0x0001ae, {[CaseLower] = 0x000288,[CaseTitle] = 0x0001ae,[CaseUpper] = 0x0001ae}}, + {0x0001af, {[CaseLower] = 0x0001b0,[CaseTitle] = 0x0001af,[CaseUpper] = 0x0001af}}, + {0x0001b0, {[CaseLower] = 0x0001b0,[CaseTitle] = 0x0001af,[CaseUpper] = 0x0001af}}, + {0x0001b1, {[CaseLower] = 0x00028a,[CaseTitle] = 0x0001b1,[CaseUpper] = 0x0001b1}}, + {0x0001b2, {[CaseLower] = 0x00028b,[CaseTitle] = 0x0001b2,[CaseUpper] = 0x0001b2}}, + {0x0001b3, {[CaseLower] = 0x0001b4,[CaseTitle] = 0x0001b3,[CaseUpper] = 0x0001b3}}, + {0x0001b4, {[CaseLower] = 0x0001b4,[CaseTitle] = 0x0001b3,[CaseUpper] = 0x0001b3}}, + {0x0001b5, {[CaseLower] = 0x0001b6,[CaseTitle] = 0x0001b5,[CaseUpper] = 0x0001b5}}, + {0x0001b6, {[CaseLower] = 0x0001b6,[CaseTitle] = 0x0001b5,[CaseUpper] = 0x0001b5}}, + {0x0001b7, {[CaseLower] = 0x000292,[CaseTitle] = 0x0001b7,[CaseUpper] = 0x0001b7}}, + {0x0001b8, {[CaseLower] = 0x0001b9,[CaseTitle] = 0x0001b8,[CaseUpper] = 0x0001b8}}, + {0x0001b9, {[CaseLower] = 0x0001b9,[CaseTitle] = 0x0001b8,[CaseUpper] = 0x0001b8}}, + {0x0001bc, {[CaseLower] = 0x0001bd,[CaseTitle] = 0x0001bc,[CaseUpper] = 0x0001bc}}, + {0x0001bd, {[CaseLower] = 0x0001bd,[CaseTitle] = 0x0001bc,[CaseUpper] = 0x0001bc}}, + {0x0001bf, {[CaseLower] = 0x0001bf,[CaseTitle] = 0x0001f7,[CaseUpper] = 0x0001f7}}, + {0x0001c4, {[CaseLower] = 0x0001c6,[CaseTitle] = 0x0001c5,[CaseUpper] = 0x0001c4}}, + {0x0001c5, {[CaseLower] = 0x0001c6,[CaseTitle] = 0x0001c5,[CaseUpper] = 0x0001c4}}, + {0x0001c6, {[CaseLower] = 0x0001c6,[CaseTitle] = 0x0001c5,[CaseUpper] = 0x0001c4}}, + {0x0001c7, {[CaseLower] = 0x0001c9,[CaseTitle] = 0x0001c8,[CaseUpper] = 0x0001c7}}, + {0x0001c8, {[CaseLower] = 0x0001c9,[CaseTitle] = 0x0001c8,[CaseUpper] = 0x0001c7}}, + {0x0001c9, {[CaseLower] = 0x0001c9,[CaseTitle] = 0x0001c8,[CaseUpper] = 0x0001c7}}, + {0x0001ca, {[CaseLower] = 0x0001cc,[CaseTitle] = 0x0001cb,[CaseUpper] = 0x0001ca}}, + {0x0001cb, {[CaseLower] = 0x0001cc,[CaseTitle] = 0x0001cb,[CaseUpper] = 0x0001ca}}, + {0x0001cc, {[CaseLower] = 0x0001cc,[CaseTitle] = 0x0001cb,[CaseUpper] = 0x0001ca}}, + {0x0001cd, {[CaseLower] = 0x0001ce,[CaseTitle] = 0x0001cd,[CaseUpper] = 0x0001cd}}, + {0x0001ce, {[CaseLower] = 0x0001ce,[CaseTitle] = 0x0001cd,[CaseUpper] = 0x0001cd}}, + {0x0001cf, {[CaseLower] = 0x0001d0,[CaseTitle] = 0x0001cf,[CaseUpper] = 0x0001cf}}, + {0x0001d0, {[CaseLower] = 0x0001d0,[CaseTitle] = 0x0001cf,[CaseUpper] = 0x0001cf}}, + {0x0001d1, {[CaseLower] = 0x0001d2,[CaseTitle] = 0x0001d1,[CaseUpper] = 0x0001d1}}, + {0x0001d2, {[CaseLower] = 0x0001d2,[CaseTitle] = 0x0001d1,[CaseUpper] = 0x0001d1}}, + {0x0001d3, {[CaseLower] = 0x0001d4,[CaseTitle] = 0x0001d3,[CaseUpper] = 0x0001d3}}, + {0x0001d4, {[CaseLower] = 0x0001d4,[CaseTitle] = 0x0001d3,[CaseUpper] = 0x0001d3}}, + {0x0001d5, {[CaseLower] = 0x0001d6,[CaseTitle] = 0x0001d5,[CaseUpper] = 0x0001d5}}, + {0x0001d6, {[CaseLower] = 0x0001d6,[CaseTitle] = 0x0001d5,[CaseUpper] = 0x0001d5}}, + {0x0001d7, {[CaseLower] = 0x0001d8,[CaseTitle] = 0x0001d7,[CaseUpper] = 0x0001d7}}, + {0x0001d8, {[CaseLower] = 0x0001d8,[CaseTitle] = 0x0001d7,[CaseUpper] = 0x0001d7}}, + {0x0001d9, {[CaseLower] = 0x0001da,[CaseTitle] = 0x0001d9,[CaseUpper] = 0x0001d9}}, + {0x0001da, {[CaseLower] = 0x0001da,[CaseTitle] = 0x0001d9,[CaseUpper] = 0x0001d9}}, + {0x0001db, {[CaseLower] = 0x0001dc,[CaseTitle] = 0x0001db,[CaseUpper] = 0x0001db}}, + {0x0001dc, {[CaseLower] = 0x0001dc,[CaseTitle] = 0x0001db,[CaseUpper] = 0x0001db}}, + {0x0001dd, {[CaseLower] = 0x0001dd,[CaseTitle] = 0x00018e,[CaseUpper] = 0x00018e}}, + {0x0001de, {[CaseLower] = 0x0001df,[CaseTitle] = 0x0001de,[CaseUpper] = 0x0001de}}, + {0x0001df, {[CaseLower] = 0x0001df,[CaseTitle] = 0x0001de,[CaseUpper] = 0x0001de}}, + {0x0001e0, {[CaseLower] = 0x0001e1,[CaseTitle] = 0x0001e0,[CaseUpper] = 0x0001e0}}, + {0x0001e1, {[CaseLower] = 0x0001e1,[CaseTitle] = 0x0001e0,[CaseUpper] = 0x0001e0}}, + {0x0001e2, {[CaseLower] = 0x0001e3,[CaseTitle] = 0x0001e2,[CaseUpper] = 0x0001e2}}, + {0x0001e3, {[CaseLower] = 0x0001e3,[CaseTitle] = 0x0001e2,[CaseUpper] = 0x0001e2}}, + {0x0001e4, {[CaseLower] = 0x0001e5,[CaseTitle] = 0x0001e4,[CaseUpper] = 0x0001e4}}, + {0x0001e5, {[CaseLower] = 0x0001e5,[CaseTitle] = 0x0001e4,[CaseUpper] = 0x0001e4}}, + {0x0001e6, {[CaseLower] = 0x0001e7,[CaseTitle] = 0x0001e6,[CaseUpper] = 0x0001e6}}, + {0x0001e7, {[CaseLower] = 0x0001e7,[CaseTitle] = 0x0001e6,[CaseUpper] = 0x0001e6}}, + {0x0001e8, {[CaseLower] = 0x0001e9,[CaseTitle] = 0x0001e8,[CaseUpper] = 0x0001e8}}, + {0x0001e9, {[CaseLower] = 0x0001e9,[CaseTitle] = 0x0001e8,[CaseUpper] = 0x0001e8}}, + {0x0001ea, {[CaseLower] = 0x0001eb,[CaseTitle] = 0x0001ea,[CaseUpper] = 0x0001ea}}, + {0x0001eb, {[CaseLower] = 0x0001eb,[CaseTitle] = 0x0001ea,[CaseUpper] = 0x0001ea}}, + {0x0001ec, {[CaseLower] = 0x0001ed,[CaseTitle] = 0x0001ec,[CaseUpper] = 0x0001ec}}, + {0x0001ed, {[CaseLower] = 0x0001ed,[CaseTitle] = 0x0001ec,[CaseUpper] = 0x0001ec}}, + {0x0001ee, {[CaseLower] = 0x0001ef,[CaseTitle] = 0x0001ee,[CaseUpper] = 0x0001ee}}, + {0x0001ef, {[CaseLower] = 0x0001ef,[CaseTitle] = 0x0001ee,[CaseUpper] = 0x0001ee}}, + {0x0001f1, {[CaseLower] = 0x0001f3,[CaseTitle] = 0x0001f2,[CaseUpper] = 0x0001f1}}, + {0x0001f2, {[CaseLower] = 0x0001f3,[CaseTitle] = 0x0001f2,[CaseUpper] = 0x0001f1}}, + {0x0001f3, {[CaseLower] = 0x0001f3,[CaseTitle] = 0x0001f2,[CaseUpper] = 0x0001f1}}, + {0x0001f4, {[CaseLower] = 0x0001f5,[CaseTitle] = 0x0001f4,[CaseUpper] = 0x0001f4}}, + {0x0001f5, {[CaseLower] = 0x0001f5,[CaseTitle] = 0x0001f4,[CaseUpper] = 0x0001f4}}, + {0x0001f6, {[CaseLower] = 0x000195,[CaseTitle] = 0x0001f6,[CaseUpper] = 0x0001f6}}, + {0x0001f7, {[CaseLower] = 0x0001bf,[CaseTitle] = 0x0001f7,[CaseUpper] = 0x0001f7}}, + {0x0001f8, {[CaseLower] = 0x0001f9,[CaseTitle] = 0x0001f8,[CaseUpper] = 0x0001f8}}, + {0x0001f9, {[CaseLower] = 0x0001f9,[CaseTitle] = 0x0001f8,[CaseUpper] = 0x0001f8}}, + {0x0001fa, {[CaseLower] = 0x0001fb,[CaseTitle] = 0x0001fa,[CaseUpper] = 0x0001fa}}, + {0x0001fb, {[CaseLower] = 0x0001fb,[CaseTitle] = 0x0001fa,[CaseUpper] = 0x0001fa}}, + {0x0001fc, {[CaseLower] = 0x0001fd,[CaseTitle] = 0x0001fc,[CaseUpper] = 0x0001fc}}, + {0x0001fd, {[CaseLower] = 0x0001fd,[CaseTitle] = 0x0001fc,[CaseUpper] = 0x0001fc}}, + {0x0001fe, {[CaseLower] = 0x0001ff,[CaseTitle] = 0x0001fe,[CaseUpper] = 0x0001fe}}, + {0x0001ff, {[CaseLower] = 0x0001ff,[CaseTitle] = 0x0001fe,[CaseUpper] = 0x0001fe}}, + {0x000200, {[CaseLower] = 0x000201,[CaseTitle] = 0x000200,[CaseUpper] = 0x000200}}, + {0x000201, {[CaseLower] = 0x000201,[CaseTitle] = 0x000200,[CaseUpper] = 0x000200}}, + {0x000202, {[CaseLower] = 0x000203,[CaseTitle] = 0x000202,[CaseUpper] = 0x000202}}, + {0x000203, {[CaseLower] = 0x000203,[CaseTitle] = 0x000202,[CaseUpper] = 0x000202}}, + {0x000204, {[CaseLower] = 0x000205,[CaseTitle] = 0x000204,[CaseUpper] = 0x000204}}, + {0x000205, {[CaseLower] = 0x000205,[CaseTitle] = 0x000204,[CaseUpper] = 0x000204}}, + {0x000206, {[CaseLower] = 0x000207,[CaseTitle] = 0x000206,[CaseUpper] = 0x000206}}, + {0x000207, {[CaseLower] = 0x000207,[CaseTitle] = 0x000206,[CaseUpper] = 0x000206}}, + {0x000208, {[CaseLower] = 0x000209,[CaseTitle] = 0x000208,[CaseUpper] = 0x000208}}, + {0x000209, {[CaseLower] = 0x000209,[CaseTitle] = 0x000208,[CaseUpper] = 0x000208}}, + {0x00020a, {[CaseLower] = 0x00020b,[CaseTitle] = 0x00020a,[CaseUpper] = 0x00020a}}, + {0x00020b, {[CaseLower] = 0x00020b,[CaseTitle] = 0x00020a,[CaseUpper] = 0x00020a}}, + {0x00020c, {[CaseLower] = 0x00020d,[CaseTitle] = 0x00020c,[CaseUpper] = 0x00020c}}, + {0x00020d, {[CaseLower] = 0x00020d,[CaseTitle] = 0x00020c,[CaseUpper] = 0x00020c}}, + {0x00020e, {[CaseLower] = 0x00020f,[CaseTitle] = 0x00020e,[CaseUpper] = 0x00020e}}, + {0x00020f, {[CaseLower] = 0x00020f,[CaseTitle] = 0x00020e,[CaseUpper] = 0x00020e}}, + {0x000210, {[CaseLower] = 0x000211,[CaseTitle] = 0x000210,[CaseUpper] = 0x000210}}, + {0x000211, {[CaseLower] = 0x000211,[CaseTitle] = 0x000210,[CaseUpper] = 0x000210}}, + {0x000212, {[CaseLower] = 0x000213,[CaseTitle] = 0x000212,[CaseUpper] = 0x000212}}, + {0x000213, {[CaseLower] = 0x000213,[CaseTitle] = 0x000212,[CaseUpper] = 0x000212}}, + {0x000214, {[CaseLower] = 0x000215,[CaseTitle] = 0x000214,[CaseUpper] = 0x000214}}, + {0x000215, {[CaseLower] = 0x000215,[CaseTitle] = 0x000214,[CaseUpper] = 0x000214}}, + {0x000216, {[CaseLower] = 0x000217,[CaseTitle] = 0x000216,[CaseUpper] = 0x000216}}, + {0x000217, {[CaseLower] = 0x000217,[CaseTitle] = 0x000216,[CaseUpper] = 0x000216}}, + {0x000218, {[CaseLower] = 0x000219,[CaseTitle] = 0x000218,[CaseUpper] = 0x000218}}, + {0x000219, {[CaseLower] = 0x000219,[CaseTitle] = 0x000218,[CaseUpper] = 0x000218}}, + {0x00021a, {[CaseLower] = 0x00021b,[CaseTitle] = 0x00021a,[CaseUpper] = 0x00021a}}, + {0x00021b, {[CaseLower] = 0x00021b,[CaseTitle] = 0x00021a,[CaseUpper] = 0x00021a}}, + {0x00021c, {[CaseLower] = 0x00021d,[CaseTitle] = 0x00021c,[CaseUpper] = 0x00021c}}, + {0x00021d, {[CaseLower] = 0x00021d,[CaseTitle] = 0x00021c,[CaseUpper] = 0x00021c}}, + {0x00021e, {[CaseLower] = 0x00021f,[CaseTitle] = 0x00021e,[CaseUpper] = 0x00021e}}, + {0x00021f, {[CaseLower] = 0x00021f,[CaseTitle] = 0x00021e,[CaseUpper] = 0x00021e}}, + {0x000220, {[CaseLower] = 0x00019e,[CaseTitle] = 0x000220,[CaseUpper] = 0x000220}}, + {0x000222, {[CaseLower] = 0x000223,[CaseTitle] = 0x000222,[CaseUpper] = 0x000222}}, + {0x000223, {[CaseLower] = 0x000223,[CaseTitle] = 0x000222,[CaseUpper] = 0x000222}}, + {0x000224, {[CaseLower] = 0x000225,[CaseTitle] = 0x000224,[CaseUpper] = 0x000224}}, + {0x000225, {[CaseLower] = 0x000225,[CaseTitle] = 0x000224,[CaseUpper] = 0x000224}}, + {0x000226, {[CaseLower] = 0x000227,[CaseTitle] = 0x000226,[CaseUpper] = 0x000226}}, + {0x000227, {[CaseLower] = 0x000227,[CaseTitle] = 0x000226,[CaseUpper] = 0x000226}}, + {0x000228, {[CaseLower] = 0x000229,[CaseTitle] = 0x000228,[CaseUpper] = 0x000228}}, + {0x000229, {[CaseLower] = 0x000229,[CaseTitle] = 0x000228,[CaseUpper] = 0x000228}}, + {0x00022a, {[CaseLower] = 0x00022b,[CaseTitle] = 0x00022a,[CaseUpper] = 0x00022a}}, + {0x00022b, {[CaseLower] = 0x00022b,[CaseTitle] = 0x00022a,[CaseUpper] = 0x00022a}}, + {0x00022c, {[CaseLower] = 0x00022d,[CaseTitle] = 0x00022c,[CaseUpper] = 0x00022c}}, + {0x00022d, {[CaseLower] = 0x00022d,[CaseTitle] = 0x00022c,[CaseUpper] = 0x00022c}}, + {0x00022e, {[CaseLower] = 0x00022f,[CaseTitle] = 0x00022e,[CaseUpper] = 0x00022e}}, + {0x00022f, {[CaseLower] = 0x00022f,[CaseTitle] = 0x00022e,[CaseUpper] = 0x00022e}}, + {0x000230, {[CaseLower] = 0x000231,[CaseTitle] = 0x000230,[CaseUpper] = 0x000230}}, + {0x000231, {[CaseLower] = 0x000231,[CaseTitle] = 0x000230,[CaseUpper] = 0x000230}}, + {0x000232, {[CaseLower] = 0x000233,[CaseTitle] = 0x000232,[CaseUpper] = 0x000232}}, + {0x000233, {[CaseLower] = 0x000233,[CaseTitle] = 0x000232,[CaseUpper] = 0x000232}}, + {0x00023a, {[CaseLower] = 0x002c65,[CaseTitle] = 0x00023a,[CaseUpper] = 0x00023a}}, + {0x00023b, {[CaseLower] = 0x00023c,[CaseTitle] = 0x00023b,[CaseUpper] = 0x00023b}}, + {0x00023c, {[CaseLower] = 0x00023c,[CaseTitle] = 0x00023b,[CaseUpper] = 0x00023b}}, + {0x00023d, {[CaseLower] = 0x00019a,[CaseTitle] = 0x00023d,[CaseUpper] = 0x00023d}}, + {0x00023e, {[CaseLower] = 0x002c66,[CaseTitle] = 0x00023e,[CaseUpper] = 0x00023e}}, + {0x00023f, {[CaseLower] = 0x00023f,[CaseTitle] = 0x002c7e,[CaseUpper] = 0x002c7e}}, + {0x000240, {[CaseLower] = 0x000240,[CaseTitle] = 0x002c7f,[CaseUpper] = 0x002c7f}}, + {0x000241, {[CaseLower] = 0x000242,[CaseTitle] = 0x000241,[CaseUpper] = 0x000241}}, + {0x000242, {[CaseLower] = 0x000242,[CaseTitle] = 0x000241,[CaseUpper] = 0x000241}}, + {0x000243, {[CaseLower] = 0x000180,[CaseTitle] = 0x000243,[CaseUpper] = 0x000243}}, + {0x000244, {[CaseLower] = 0x000289,[CaseTitle] = 0x000244,[CaseUpper] = 0x000244}}, + {0x000245, {[CaseLower] = 0x00028c,[CaseTitle] = 0x000245,[CaseUpper] = 0x000245}}, + {0x000246, {[CaseLower] = 0x000247,[CaseTitle] = 0x000246,[CaseUpper] = 0x000246}}, + {0x000247, {[CaseLower] = 0x000247,[CaseTitle] = 0x000246,[CaseUpper] = 0x000246}}, + {0x000248, {[CaseLower] = 0x000249,[CaseTitle] = 0x000248,[CaseUpper] = 0x000248}}, + {0x000249, {[CaseLower] = 0x000249,[CaseTitle] = 0x000248,[CaseUpper] = 0x000248}}, + {0x00024a, {[CaseLower] = 0x00024b,[CaseTitle] = 0x00024a,[CaseUpper] = 0x00024a}}, + {0x00024b, {[CaseLower] = 0x00024b,[CaseTitle] = 0x00024a,[CaseUpper] = 0x00024a}}, + {0x00024c, {[CaseLower] = 0x00024d,[CaseTitle] = 0x00024c,[CaseUpper] = 0x00024c}}, + {0x00024d, {[CaseLower] = 0x00024d,[CaseTitle] = 0x00024c,[CaseUpper] = 0x00024c}}, + {0x00024e, {[CaseLower] = 0x00024f,[CaseTitle] = 0x00024e,[CaseUpper] = 0x00024e}}, + {0x00024f, {[CaseLower] = 0x00024f,[CaseTitle] = 0x00024e,[CaseUpper] = 0x00024e}}, + {0x000250, {[CaseLower] = 0x000250,[CaseTitle] = 0x002c6f,[CaseUpper] = 0x002c6f}}, + {0x000251, {[CaseLower] = 0x000251,[CaseTitle] = 0x002c6d,[CaseUpper] = 0x002c6d}}, + {0x000252, {[CaseLower] = 0x000252,[CaseTitle] = 0x002c70,[CaseUpper] = 0x002c70}}, + {0x000253, {[CaseLower] = 0x000253,[CaseTitle] = 0x000181,[CaseUpper] = 0x000181}}, + {0x000254, {[CaseLower] = 0x000254,[CaseTitle] = 0x000186,[CaseUpper] = 0x000186}}, + {0x000256, {[CaseLower] = 0x000256,[CaseTitle] = 0x000189,[CaseUpper] = 0x000189}}, + {0x000257, {[CaseLower] = 0x000257,[CaseTitle] = 0x00018a,[CaseUpper] = 0x00018a}}, + {0x000259, {[CaseLower] = 0x000259,[CaseTitle] = 0x00018f,[CaseUpper] = 0x00018f}}, + {0x00025b, {[CaseLower] = 0x00025b,[CaseTitle] = 0x000190,[CaseUpper] = 0x000190}}, + {0x00025c, {[CaseLower] = 0x00025c,[CaseTitle] = 0x00a7ab,[CaseUpper] = 0x00a7ab}}, + {0x000260, {[CaseLower] = 0x000260,[CaseTitle] = 0x000193,[CaseUpper] = 0x000193}}, + {0x000261, {[CaseLower] = 0x000261,[CaseTitle] = 0x00a7ac,[CaseUpper] = 0x00a7ac}}, + {0x000263, {[CaseLower] = 0x000263,[CaseTitle] = 0x000194,[CaseUpper] = 0x000194}}, + {0x000265, {[CaseLower] = 0x000265,[CaseTitle] = 0x00a78d,[CaseUpper] = 0x00a78d}}, + {0x000266, {[CaseLower] = 0x000266,[CaseTitle] = 0x00a7aa,[CaseUpper] = 0x00a7aa}}, + {0x000268, {[CaseLower] = 0x000268,[CaseTitle] = 0x000197,[CaseUpper] = 0x000197}}, + {0x000269, {[CaseLower] = 0x000269,[CaseTitle] = 0x000196,[CaseUpper] = 0x000196}}, + {0x00026a, {[CaseLower] = 0x00026a,[CaseTitle] = 0x00a7ae,[CaseUpper] = 0x00a7ae}}, + {0x00026b, {[CaseLower] = 0x00026b,[CaseTitle] = 0x002c62,[CaseUpper] = 0x002c62}}, + {0x00026c, {[CaseLower] = 0x00026c,[CaseTitle] = 0x00a7ad,[CaseUpper] = 0x00a7ad}}, + {0x00026f, {[CaseLower] = 0x00026f,[CaseTitle] = 0x00019c,[CaseUpper] = 0x00019c}}, + {0x000271, {[CaseLower] = 0x000271,[CaseTitle] = 0x002c6e,[CaseUpper] = 0x002c6e}}, + {0x000272, {[CaseLower] = 0x000272,[CaseTitle] = 0x00019d,[CaseUpper] = 0x00019d}}, + {0x000275, {[CaseLower] = 0x000275,[CaseTitle] = 0x00019f,[CaseUpper] = 0x00019f}}, + {0x00027d, {[CaseLower] = 0x00027d,[CaseTitle] = 0x002c64,[CaseUpper] = 0x002c64}}, + {0x000280, {[CaseLower] = 0x000280,[CaseTitle] = 0x0001a6,[CaseUpper] = 0x0001a6}}, + {0x000282, {[CaseLower] = 0x000282,[CaseTitle] = 0x00a7c5,[CaseUpper] = 0x00a7c5}}, + {0x000283, {[CaseLower] = 0x000283,[CaseTitle] = 0x0001a9,[CaseUpper] = 0x0001a9}}, + {0x000287, {[CaseLower] = 0x000287,[CaseTitle] = 0x00a7b1,[CaseUpper] = 0x00a7b1}}, + {0x000288, {[CaseLower] = 0x000288,[CaseTitle] = 0x0001ae,[CaseUpper] = 0x0001ae}}, + {0x000289, {[CaseLower] = 0x000289,[CaseTitle] = 0x000244,[CaseUpper] = 0x000244}}, + {0x00028a, {[CaseLower] = 0x00028a,[CaseTitle] = 0x0001b1,[CaseUpper] = 0x0001b1}}, + {0x00028b, {[CaseLower] = 0x00028b,[CaseTitle] = 0x0001b2,[CaseUpper] = 0x0001b2}}, + {0x00028c, {[CaseLower] = 0x00028c,[CaseTitle] = 0x000245,[CaseUpper] = 0x000245}}, + {0x000292, {[CaseLower] = 0x000292,[CaseTitle] = 0x0001b7,[CaseUpper] = 0x0001b7}}, + {0x00029d, {[CaseLower] = 0x00029d,[CaseTitle] = 0x00a7b2,[CaseUpper] = 0x00a7b2}}, + {0x00029e, {[CaseLower] = 0x00029e,[CaseTitle] = 0x00a7b0,[CaseUpper] = 0x00a7b0}}, + {0x000345, {[CaseLower] = 0x000345,[CaseTitle] = 0x000399,[CaseUpper] = 0x000399}}, + {0x000370, {[CaseLower] = 0x000371,[CaseTitle] = 0x000370,[CaseUpper] = 0x000370}}, + {0x000371, {[CaseLower] = 0x000371,[CaseTitle] = 0x000370,[CaseUpper] = 0x000370}}, + {0x000372, {[CaseLower] = 0x000373,[CaseTitle] = 0x000372,[CaseUpper] = 0x000372}}, + {0x000373, {[CaseLower] = 0x000373,[CaseTitle] = 0x000372,[CaseUpper] = 0x000372}}, + {0x000376, {[CaseLower] = 0x000377,[CaseTitle] = 0x000376,[CaseUpper] = 0x000376}}, + {0x000377, {[CaseLower] = 0x000377,[CaseTitle] = 0x000376,[CaseUpper] = 0x000376}}, + {0x00037b, {[CaseLower] = 0x00037b,[CaseTitle] = 0x0003fd,[CaseUpper] = 0x0003fd}}, + {0x00037c, {[CaseLower] = 0x00037c,[CaseTitle] = 0x0003fe,[CaseUpper] = 0x0003fe}}, + {0x00037d, {[CaseLower] = 0x00037d,[CaseTitle] = 0x0003ff,[CaseUpper] = 0x0003ff}}, + {0x00037f, {[CaseLower] = 0x0003f3,[CaseTitle] = 0x00037f,[CaseUpper] = 0x00037f}}, + {0x000386, {[CaseLower] = 0x0003ac,[CaseTitle] = 0x000386,[CaseUpper] = 0x000386}}, + {0x000388, {[CaseLower] = 0x0003ad,[CaseTitle] = 0x000388,[CaseUpper] = 0x000388}}, + {0x000389, {[CaseLower] = 0x0003ae,[CaseTitle] = 0x000389,[CaseUpper] = 0x000389}}, + {0x00038a, {[CaseLower] = 0x0003af,[CaseTitle] = 0x00038a,[CaseUpper] = 0x00038a}}, + {0x00038c, {[CaseLower] = 0x0003cc,[CaseTitle] = 0x00038c,[CaseUpper] = 0x00038c}}, + {0x00038e, {[CaseLower] = 0x0003cd,[CaseTitle] = 0x00038e,[CaseUpper] = 0x00038e}}, + {0x00038f, {[CaseLower] = 0x0003ce,[CaseTitle] = 0x00038f,[CaseUpper] = 0x00038f}}, + {0x000391, {[CaseLower] = 0x0003b1,[CaseTitle] = 0x000391,[CaseUpper] = 0x000391}}, + {0x000392, {[CaseLower] = 0x0003b2,[CaseTitle] = 0x000392,[CaseUpper] = 0x000392}}, + {0x000393, {[CaseLower] = 0x0003b3,[CaseTitle] = 0x000393,[CaseUpper] = 0x000393}}, + {0x000394, {[CaseLower] = 0x0003b4,[CaseTitle] = 0x000394,[CaseUpper] = 0x000394}}, + {0x000395, {[CaseLower] = 0x0003b5,[CaseTitle] = 0x000395,[CaseUpper] = 0x000395}}, + {0x000396, {[CaseLower] = 0x0003b6,[CaseTitle] = 0x000396,[CaseUpper] = 0x000396}}, + {0x000397, {[CaseLower] = 0x0003b7,[CaseTitle] = 0x000397,[CaseUpper] = 0x000397}}, + {0x000398, {[CaseLower] = 0x0003b8,[CaseTitle] = 0x000398,[CaseUpper] = 0x000398}}, + {0x000399, {[CaseLower] = 0x0003b9,[CaseTitle] = 0x000399,[CaseUpper] = 0x000399}}, + {0x00039a, {[CaseLower] = 0x0003ba,[CaseTitle] = 0x00039a,[CaseUpper] = 0x00039a}}, + {0x00039b, {[CaseLower] = 0x0003bb,[CaseTitle] = 0x00039b,[CaseUpper] = 0x00039b}}, + {0x00039c, {[CaseLower] = 0x0003bc,[CaseTitle] = 0x00039c,[CaseUpper] = 0x00039c}}, + {0x00039d, {[CaseLower] = 0x0003bd,[CaseTitle] = 0x00039d,[CaseUpper] = 0x00039d}}, + {0x00039e, {[CaseLower] = 0x0003be,[CaseTitle] = 0x00039e,[CaseUpper] = 0x00039e}}, + {0x00039f, {[CaseLower] = 0x0003bf,[CaseTitle] = 0x00039f,[CaseUpper] = 0x00039f}}, + {0x0003a0, {[CaseLower] = 0x0003c0,[CaseTitle] = 0x0003a0,[CaseUpper] = 0x0003a0}}, + {0x0003a1, {[CaseLower] = 0x0003c1,[CaseTitle] = 0x0003a1,[CaseUpper] = 0x0003a1}}, + {0x0003a3, {[CaseLower] = 0x0003c3,[CaseTitle] = 0x0003a3,[CaseUpper] = 0x0003a3}}, + {0x0003a4, {[CaseLower] = 0x0003c4,[CaseTitle] = 0x0003a4,[CaseUpper] = 0x0003a4}}, + {0x0003a5, {[CaseLower] = 0x0003c5,[CaseTitle] = 0x0003a5,[CaseUpper] = 0x0003a5}}, + {0x0003a6, {[CaseLower] = 0x0003c6,[CaseTitle] = 0x0003a6,[CaseUpper] = 0x0003a6}}, + {0x0003a7, {[CaseLower] = 0x0003c7,[CaseTitle] = 0x0003a7,[CaseUpper] = 0x0003a7}}, + {0x0003a8, {[CaseLower] = 0x0003c8,[CaseTitle] = 0x0003a8,[CaseUpper] = 0x0003a8}}, + {0x0003a9, {[CaseLower] = 0x0003c9,[CaseTitle] = 0x0003a9,[CaseUpper] = 0x0003a9}}, + {0x0003aa, {[CaseLower] = 0x0003ca,[CaseTitle] = 0x0003aa,[CaseUpper] = 0x0003aa}}, + {0x0003ab, {[CaseLower] = 0x0003cb,[CaseTitle] = 0x0003ab,[CaseUpper] = 0x0003ab}}, + {0x0003ac, {[CaseLower] = 0x0003ac,[CaseTitle] = 0x000386,[CaseUpper] = 0x000386}}, + {0x0003ad, {[CaseLower] = 0x0003ad,[CaseTitle] = 0x000388,[CaseUpper] = 0x000388}}, + {0x0003ae, {[CaseLower] = 0x0003ae,[CaseTitle] = 0x000389,[CaseUpper] = 0x000389}}, + {0x0003af, {[CaseLower] = 0x0003af,[CaseTitle] = 0x00038a,[CaseUpper] = 0x00038a}}, + {0x0003b1, {[CaseLower] = 0x0003b1,[CaseTitle] = 0x000391,[CaseUpper] = 0x000391}}, + {0x0003b2, {[CaseLower] = 0x0003b2,[CaseTitle] = 0x000392,[CaseUpper] = 0x000392}}, + {0x0003b3, {[CaseLower] = 0x0003b3,[CaseTitle] = 0x000393,[CaseUpper] = 0x000393}}, + {0x0003b4, {[CaseLower] = 0x0003b4,[CaseTitle] = 0x000394,[CaseUpper] = 0x000394}}, + {0x0003b5, {[CaseLower] = 0x0003b5,[CaseTitle] = 0x000395,[CaseUpper] = 0x000395}}, + {0x0003b6, {[CaseLower] = 0x0003b6,[CaseTitle] = 0x000396,[CaseUpper] = 0x000396}}, + {0x0003b7, {[CaseLower] = 0x0003b7,[CaseTitle] = 0x000397,[CaseUpper] = 0x000397}}, + {0x0003b8, {[CaseLower] = 0x0003b8,[CaseTitle] = 0x000398,[CaseUpper] = 0x000398}}, + {0x0003b9, {[CaseLower] = 0x0003b9,[CaseTitle] = 0x000399,[CaseUpper] = 0x000399}}, + {0x0003ba, {[CaseLower] = 0x0003ba,[CaseTitle] = 0x00039a,[CaseUpper] = 0x00039a}}, + {0x0003bb, {[CaseLower] = 0x0003bb,[CaseTitle] = 0x00039b,[CaseUpper] = 0x00039b}}, + {0x0003bc, {[CaseLower] = 0x0003bc,[CaseTitle] = 0x00039c,[CaseUpper] = 0x00039c}}, + {0x0003bd, {[CaseLower] = 0x0003bd,[CaseTitle] = 0x00039d,[CaseUpper] = 0x00039d}}, + {0x0003be, {[CaseLower] = 0x0003be,[CaseTitle] = 0x00039e,[CaseUpper] = 0x00039e}}, + {0x0003bf, {[CaseLower] = 0x0003bf,[CaseTitle] = 0x00039f,[CaseUpper] = 0x00039f}}, + {0x0003c0, {[CaseLower] = 0x0003c0,[CaseTitle] = 0x0003a0,[CaseUpper] = 0x0003a0}}, + {0x0003c1, {[CaseLower] = 0x0003c1,[CaseTitle] = 0x0003a1,[CaseUpper] = 0x0003a1}}, + {0x0003c2, {[CaseLower] = 0x0003c2,[CaseTitle] = 0x0003a3,[CaseUpper] = 0x0003a3}}, + {0x0003c3, {[CaseLower] = 0x0003c3,[CaseTitle] = 0x0003a3,[CaseUpper] = 0x0003a3}}, + {0x0003c4, {[CaseLower] = 0x0003c4,[CaseTitle] = 0x0003a4,[CaseUpper] = 0x0003a4}}, + {0x0003c5, {[CaseLower] = 0x0003c5,[CaseTitle] = 0x0003a5,[CaseUpper] = 0x0003a5}}, + {0x0003c6, {[CaseLower] = 0x0003c6,[CaseTitle] = 0x0003a6,[CaseUpper] = 0x0003a6}}, + {0x0003c7, {[CaseLower] = 0x0003c7,[CaseTitle] = 0x0003a7,[CaseUpper] = 0x0003a7}}, + {0x0003c8, {[CaseLower] = 0x0003c8,[CaseTitle] = 0x0003a8,[CaseUpper] = 0x0003a8}}, + {0x0003c9, {[CaseLower] = 0x0003c9,[CaseTitle] = 0x0003a9,[CaseUpper] = 0x0003a9}}, + {0x0003ca, {[CaseLower] = 0x0003ca,[CaseTitle] = 0x0003aa,[CaseUpper] = 0x0003aa}}, + {0x0003cb, {[CaseLower] = 0x0003cb,[CaseTitle] = 0x0003ab,[CaseUpper] = 0x0003ab}}, + {0x0003cc, {[CaseLower] = 0x0003cc,[CaseTitle] = 0x00038c,[CaseUpper] = 0x00038c}}, + {0x0003cd, {[CaseLower] = 0x0003cd,[CaseTitle] = 0x00038e,[CaseUpper] = 0x00038e}}, + {0x0003ce, {[CaseLower] = 0x0003ce,[CaseTitle] = 0x00038f,[CaseUpper] = 0x00038f}}, + {0x0003cf, {[CaseLower] = 0x0003d7,[CaseTitle] = 0x0003cf,[CaseUpper] = 0x0003cf}}, + {0x0003d0, {[CaseLower] = 0x0003d0,[CaseTitle] = 0x000392,[CaseUpper] = 0x000392}}, + {0x0003d1, {[CaseLower] = 0x0003d1,[CaseTitle] = 0x000398,[CaseUpper] = 0x000398}}, + {0x0003d5, {[CaseLower] = 0x0003d5,[CaseTitle] = 0x0003a6,[CaseUpper] = 0x0003a6}}, + {0x0003d6, {[CaseLower] = 0x0003d6,[CaseTitle] = 0x0003a0,[CaseUpper] = 0x0003a0}}, + {0x0003d7, {[CaseLower] = 0x0003d7,[CaseTitle] = 0x0003cf,[CaseUpper] = 0x0003cf}}, + {0x0003d8, {[CaseLower] = 0x0003d9,[CaseTitle] = 0x0003d8,[CaseUpper] = 0x0003d8}}, + {0x0003d9, {[CaseLower] = 0x0003d9,[CaseTitle] = 0x0003d8,[CaseUpper] = 0x0003d8}}, + {0x0003da, {[CaseLower] = 0x0003db,[CaseTitle] = 0x0003da,[CaseUpper] = 0x0003da}}, + {0x0003db, {[CaseLower] = 0x0003db,[CaseTitle] = 0x0003da,[CaseUpper] = 0x0003da}}, + {0x0003dc, {[CaseLower] = 0x0003dd,[CaseTitle] = 0x0003dc,[CaseUpper] = 0x0003dc}}, + {0x0003dd, {[CaseLower] = 0x0003dd,[CaseTitle] = 0x0003dc,[CaseUpper] = 0x0003dc}}, + {0x0003de, {[CaseLower] = 0x0003df,[CaseTitle] = 0x0003de,[CaseUpper] = 0x0003de}}, + {0x0003df, {[CaseLower] = 0x0003df,[CaseTitle] = 0x0003de,[CaseUpper] = 0x0003de}}, + {0x0003e0, {[CaseLower] = 0x0003e1,[CaseTitle] = 0x0003e0,[CaseUpper] = 0x0003e0}}, + {0x0003e1, {[CaseLower] = 0x0003e1,[CaseTitle] = 0x0003e0,[CaseUpper] = 0x0003e0}}, + {0x0003e2, {[CaseLower] = 0x0003e3,[CaseTitle] = 0x0003e2,[CaseUpper] = 0x0003e2}}, + {0x0003e3, {[CaseLower] = 0x0003e3,[CaseTitle] = 0x0003e2,[CaseUpper] = 0x0003e2}}, + {0x0003e4, {[CaseLower] = 0x0003e5,[CaseTitle] = 0x0003e4,[CaseUpper] = 0x0003e4}}, + {0x0003e5, {[CaseLower] = 0x0003e5,[CaseTitle] = 0x0003e4,[CaseUpper] = 0x0003e4}}, + {0x0003e6, {[CaseLower] = 0x0003e7,[CaseTitle] = 0x0003e6,[CaseUpper] = 0x0003e6}}, + {0x0003e7, {[CaseLower] = 0x0003e7,[CaseTitle] = 0x0003e6,[CaseUpper] = 0x0003e6}}, + {0x0003e8, {[CaseLower] = 0x0003e9,[CaseTitle] = 0x0003e8,[CaseUpper] = 0x0003e8}}, + {0x0003e9, {[CaseLower] = 0x0003e9,[CaseTitle] = 0x0003e8,[CaseUpper] = 0x0003e8}}, + {0x0003ea, {[CaseLower] = 0x0003eb,[CaseTitle] = 0x0003ea,[CaseUpper] = 0x0003ea}}, + {0x0003eb, {[CaseLower] = 0x0003eb,[CaseTitle] = 0x0003ea,[CaseUpper] = 0x0003ea}}, + {0x0003ec, {[CaseLower] = 0x0003ed,[CaseTitle] = 0x0003ec,[CaseUpper] = 0x0003ec}}, + {0x0003ed, {[CaseLower] = 0x0003ed,[CaseTitle] = 0x0003ec,[CaseUpper] = 0x0003ec}}, + {0x0003ee, {[CaseLower] = 0x0003ef,[CaseTitle] = 0x0003ee,[CaseUpper] = 0x0003ee}}, + {0x0003ef, {[CaseLower] = 0x0003ef,[CaseTitle] = 0x0003ee,[CaseUpper] = 0x0003ee}}, + {0x0003f0, {[CaseLower] = 0x0003f0,[CaseTitle] = 0x00039a,[CaseUpper] = 0x00039a}}, + {0x0003f1, {[CaseLower] = 0x0003f1,[CaseTitle] = 0x0003a1,[CaseUpper] = 0x0003a1}}, + {0x0003f2, {[CaseLower] = 0x0003f2,[CaseTitle] = 0x0003f9,[CaseUpper] = 0x0003f9}}, + {0x0003f3, {[CaseLower] = 0x0003f3,[CaseTitle] = 0x00037f,[CaseUpper] = 0x00037f}}, + {0x0003f4, {[CaseLower] = 0x0003b8,[CaseTitle] = 0x0003f4,[CaseUpper] = 0x0003f4}}, + {0x0003f5, {[CaseLower] = 0x0003f5,[CaseTitle] = 0x000395,[CaseUpper] = 0x000395}}, + {0x0003f7, {[CaseLower] = 0x0003f8,[CaseTitle] = 0x0003f7,[CaseUpper] = 0x0003f7}}, + {0x0003f8, {[CaseLower] = 0x0003f8,[CaseTitle] = 0x0003f7,[CaseUpper] = 0x0003f7}}, + {0x0003f9, {[CaseLower] = 0x0003f2,[CaseTitle] = 0x0003f9,[CaseUpper] = 0x0003f9}}, + {0x0003fa, {[CaseLower] = 0x0003fb,[CaseTitle] = 0x0003fa,[CaseUpper] = 0x0003fa}}, + {0x0003fb, {[CaseLower] = 0x0003fb,[CaseTitle] = 0x0003fa,[CaseUpper] = 0x0003fa}}, + {0x0003fd, {[CaseLower] = 0x00037b,[CaseTitle] = 0x0003fd,[CaseUpper] = 0x0003fd}}, + {0x0003fe, {[CaseLower] = 0x00037c,[CaseTitle] = 0x0003fe,[CaseUpper] = 0x0003fe}}, + {0x0003ff, {[CaseLower] = 0x00037d,[CaseTitle] = 0x0003ff,[CaseUpper] = 0x0003ff}}, + {0x000400, {[CaseLower] = 0x000450,[CaseTitle] = 0x000400,[CaseUpper] = 0x000400}}, + {0x000401, {[CaseLower] = 0x000451,[CaseTitle] = 0x000401,[CaseUpper] = 0x000401}}, + {0x000402, {[CaseLower] = 0x000452,[CaseTitle] = 0x000402,[CaseUpper] = 0x000402}}, + {0x000403, {[CaseLower] = 0x000453,[CaseTitle] = 0x000403,[CaseUpper] = 0x000403}}, + {0x000404, {[CaseLower] = 0x000454,[CaseTitle] = 0x000404,[CaseUpper] = 0x000404}}, + {0x000405, {[CaseLower] = 0x000455,[CaseTitle] = 0x000405,[CaseUpper] = 0x000405}}, + {0x000406, {[CaseLower] = 0x000456,[CaseTitle] = 0x000406,[CaseUpper] = 0x000406}}, + {0x000407, {[CaseLower] = 0x000457,[CaseTitle] = 0x000407,[CaseUpper] = 0x000407}}, + {0x000408, {[CaseLower] = 0x000458,[CaseTitle] = 0x000408,[CaseUpper] = 0x000408}}, + {0x000409, {[CaseLower] = 0x000459,[CaseTitle] = 0x000409,[CaseUpper] = 0x000409}}, + {0x00040a, {[CaseLower] = 0x00045a,[CaseTitle] = 0x00040a,[CaseUpper] = 0x00040a}}, + {0x00040b, {[CaseLower] = 0x00045b,[CaseTitle] = 0x00040b,[CaseUpper] = 0x00040b}}, + {0x00040c, {[CaseLower] = 0x00045c,[CaseTitle] = 0x00040c,[CaseUpper] = 0x00040c}}, + {0x00040d, {[CaseLower] = 0x00045d,[CaseTitle] = 0x00040d,[CaseUpper] = 0x00040d}}, + {0x00040e, {[CaseLower] = 0x00045e,[CaseTitle] = 0x00040e,[CaseUpper] = 0x00040e}}, + {0x00040f, {[CaseLower] = 0x00045f,[CaseTitle] = 0x00040f,[CaseUpper] = 0x00040f}}, + {0x000410, {[CaseLower] = 0x000430,[CaseTitle] = 0x000410,[CaseUpper] = 0x000410}}, + {0x000411, {[CaseLower] = 0x000431,[CaseTitle] = 0x000411,[CaseUpper] = 0x000411}}, + {0x000412, {[CaseLower] = 0x000432,[CaseTitle] = 0x000412,[CaseUpper] = 0x000412}}, + {0x000413, {[CaseLower] = 0x000433,[CaseTitle] = 0x000413,[CaseUpper] = 0x000413}}, + {0x000414, {[CaseLower] = 0x000434,[CaseTitle] = 0x000414,[CaseUpper] = 0x000414}}, + {0x000415, {[CaseLower] = 0x000435,[CaseTitle] = 0x000415,[CaseUpper] = 0x000415}}, + {0x000416, {[CaseLower] = 0x000436,[CaseTitle] = 0x000416,[CaseUpper] = 0x000416}}, + {0x000417, {[CaseLower] = 0x000437,[CaseTitle] = 0x000417,[CaseUpper] = 0x000417}}, + {0x000418, {[CaseLower] = 0x000438,[CaseTitle] = 0x000418,[CaseUpper] = 0x000418}}, + {0x000419, {[CaseLower] = 0x000439,[CaseTitle] = 0x000419,[CaseUpper] = 0x000419}}, + {0x00041a, {[CaseLower] = 0x00043a,[CaseTitle] = 0x00041a,[CaseUpper] = 0x00041a}}, + {0x00041b, {[CaseLower] = 0x00043b,[CaseTitle] = 0x00041b,[CaseUpper] = 0x00041b}}, + {0x00041c, {[CaseLower] = 0x00043c,[CaseTitle] = 0x00041c,[CaseUpper] = 0x00041c}}, + {0x00041d, {[CaseLower] = 0x00043d,[CaseTitle] = 0x00041d,[CaseUpper] = 0x00041d}}, + {0x00041e, {[CaseLower] = 0x00043e,[CaseTitle] = 0x00041e,[CaseUpper] = 0x00041e}}, + {0x00041f, {[CaseLower] = 0x00043f,[CaseTitle] = 0x00041f,[CaseUpper] = 0x00041f}}, + {0x000420, {[CaseLower] = 0x000440,[CaseTitle] = 0x000420,[CaseUpper] = 0x000420}}, + {0x000421, {[CaseLower] = 0x000441,[CaseTitle] = 0x000421,[CaseUpper] = 0x000421}}, + {0x000422, {[CaseLower] = 0x000442,[CaseTitle] = 0x000422,[CaseUpper] = 0x000422}}, + {0x000423, {[CaseLower] = 0x000443,[CaseTitle] = 0x000423,[CaseUpper] = 0x000423}}, + {0x000424, {[CaseLower] = 0x000444,[CaseTitle] = 0x000424,[CaseUpper] = 0x000424}}, + {0x000425, {[CaseLower] = 0x000445,[CaseTitle] = 0x000425,[CaseUpper] = 0x000425}}, + {0x000426, {[CaseLower] = 0x000446,[CaseTitle] = 0x000426,[CaseUpper] = 0x000426}}, + {0x000427, {[CaseLower] = 0x000447,[CaseTitle] = 0x000427,[CaseUpper] = 0x000427}}, + {0x000428, {[CaseLower] = 0x000448,[CaseTitle] = 0x000428,[CaseUpper] = 0x000428}}, + {0x000429, {[CaseLower] = 0x000449,[CaseTitle] = 0x000429,[CaseUpper] = 0x000429}}, + {0x00042a, {[CaseLower] = 0x00044a,[CaseTitle] = 0x00042a,[CaseUpper] = 0x00042a}}, + {0x00042b, {[CaseLower] = 0x00044b,[CaseTitle] = 0x00042b,[CaseUpper] = 0x00042b}}, + {0x00042c, {[CaseLower] = 0x00044c,[CaseTitle] = 0x00042c,[CaseUpper] = 0x00042c}}, + {0x00042d, {[CaseLower] = 0x00044d,[CaseTitle] = 0x00042d,[CaseUpper] = 0x00042d}}, + {0x00042e, {[CaseLower] = 0x00044e,[CaseTitle] = 0x00042e,[CaseUpper] = 0x00042e}}, + {0x00042f, {[CaseLower] = 0x00044f,[CaseTitle] = 0x00042f,[CaseUpper] = 0x00042f}}, + {0x000430, {[CaseLower] = 0x000430,[CaseTitle] = 0x000410,[CaseUpper] = 0x000410}}, + {0x000431, {[CaseLower] = 0x000431,[CaseTitle] = 0x000411,[CaseUpper] = 0x000411}}, + {0x000432, {[CaseLower] = 0x000432,[CaseTitle] = 0x000412,[CaseUpper] = 0x000412}}, + {0x000433, {[CaseLower] = 0x000433,[CaseTitle] = 0x000413,[CaseUpper] = 0x000413}}, + {0x000434, {[CaseLower] = 0x000434,[CaseTitle] = 0x000414,[CaseUpper] = 0x000414}}, + {0x000435, {[CaseLower] = 0x000435,[CaseTitle] = 0x000415,[CaseUpper] = 0x000415}}, + {0x000436, {[CaseLower] = 0x000436,[CaseTitle] = 0x000416,[CaseUpper] = 0x000416}}, + {0x000437, {[CaseLower] = 0x000437,[CaseTitle] = 0x000417,[CaseUpper] = 0x000417}}, + {0x000438, {[CaseLower] = 0x000438,[CaseTitle] = 0x000418,[CaseUpper] = 0x000418}}, + {0x000439, {[CaseLower] = 0x000439,[CaseTitle] = 0x000419,[CaseUpper] = 0x000419}}, + {0x00043a, {[CaseLower] = 0x00043a,[CaseTitle] = 0x00041a,[CaseUpper] = 0x00041a}}, + {0x00043b, {[CaseLower] = 0x00043b,[CaseTitle] = 0x00041b,[CaseUpper] = 0x00041b}}, + {0x00043c, {[CaseLower] = 0x00043c,[CaseTitle] = 0x00041c,[CaseUpper] = 0x00041c}}, + {0x00043d, {[CaseLower] = 0x00043d,[CaseTitle] = 0x00041d,[CaseUpper] = 0x00041d}}, + {0x00043e, {[CaseLower] = 0x00043e,[CaseTitle] = 0x00041e,[CaseUpper] = 0x00041e}}, + {0x00043f, {[CaseLower] = 0x00043f,[CaseTitle] = 0x00041f,[CaseUpper] = 0x00041f}}, + {0x000440, {[CaseLower] = 0x000440,[CaseTitle] = 0x000420,[CaseUpper] = 0x000420}}, + {0x000441, {[CaseLower] = 0x000441,[CaseTitle] = 0x000421,[CaseUpper] = 0x000421}}, + {0x000442, {[CaseLower] = 0x000442,[CaseTitle] = 0x000422,[CaseUpper] = 0x000422}}, + {0x000443, {[CaseLower] = 0x000443,[CaseTitle] = 0x000423,[CaseUpper] = 0x000423}}, + {0x000444, {[CaseLower] = 0x000444,[CaseTitle] = 0x000424,[CaseUpper] = 0x000424}}, + {0x000445, {[CaseLower] = 0x000445,[CaseTitle] = 0x000425,[CaseUpper] = 0x000425}}, + {0x000446, {[CaseLower] = 0x000446,[CaseTitle] = 0x000426,[CaseUpper] = 0x000426}}, + {0x000447, {[CaseLower] = 0x000447,[CaseTitle] = 0x000427,[CaseUpper] = 0x000427}}, + {0x000448, {[CaseLower] = 0x000448,[CaseTitle] = 0x000428,[CaseUpper] = 0x000428}}, + {0x000449, {[CaseLower] = 0x000449,[CaseTitle] = 0x000429,[CaseUpper] = 0x000429}}, + {0x00044a, {[CaseLower] = 0x00044a,[CaseTitle] = 0x00042a,[CaseUpper] = 0x00042a}}, + {0x00044b, {[CaseLower] = 0x00044b,[CaseTitle] = 0x00042b,[CaseUpper] = 0x00042b}}, + {0x00044c, {[CaseLower] = 0x00044c,[CaseTitle] = 0x00042c,[CaseUpper] = 0x00042c}}, + {0x00044d, {[CaseLower] = 0x00044d,[CaseTitle] = 0x00042d,[CaseUpper] = 0x00042d}}, + {0x00044e, {[CaseLower] = 0x00044e,[CaseTitle] = 0x00042e,[CaseUpper] = 0x00042e}}, + {0x00044f, {[CaseLower] = 0x00044f,[CaseTitle] = 0x00042f,[CaseUpper] = 0x00042f}}, + {0x000450, {[CaseLower] = 0x000450,[CaseTitle] = 0x000400,[CaseUpper] = 0x000400}}, + {0x000451, {[CaseLower] = 0x000451,[CaseTitle] = 0x000401,[CaseUpper] = 0x000401}}, + {0x000452, {[CaseLower] = 0x000452,[CaseTitle] = 0x000402,[CaseUpper] = 0x000402}}, + {0x000453, {[CaseLower] = 0x000453,[CaseTitle] = 0x000403,[CaseUpper] = 0x000403}}, + {0x000454, {[CaseLower] = 0x000454,[CaseTitle] = 0x000404,[CaseUpper] = 0x000404}}, + {0x000455, {[CaseLower] = 0x000455,[CaseTitle] = 0x000405,[CaseUpper] = 0x000405}}, + {0x000456, {[CaseLower] = 0x000456,[CaseTitle] = 0x000406,[CaseUpper] = 0x000406}}, + {0x000457, {[CaseLower] = 0x000457,[CaseTitle] = 0x000407,[CaseUpper] = 0x000407}}, + {0x000458, {[CaseLower] = 0x000458,[CaseTitle] = 0x000408,[CaseUpper] = 0x000408}}, + {0x000459, {[CaseLower] = 0x000459,[CaseTitle] = 0x000409,[CaseUpper] = 0x000409}}, + {0x00045a, {[CaseLower] = 0x00045a,[CaseTitle] = 0x00040a,[CaseUpper] = 0x00040a}}, + {0x00045b, {[CaseLower] = 0x00045b,[CaseTitle] = 0x00040b,[CaseUpper] = 0x00040b}}, + {0x00045c, {[CaseLower] = 0x00045c,[CaseTitle] = 0x00040c,[CaseUpper] = 0x00040c}}, + {0x00045d, {[CaseLower] = 0x00045d,[CaseTitle] = 0x00040d,[CaseUpper] = 0x00040d}}, + {0x00045e, {[CaseLower] = 0x00045e,[CaseTitle] = 0x00040e,[CaseUpper] = 0x00040e}}, + {0x00045f, {[CaseLower] = 0x00045f,[CaseTitle] = 0x00040f,[CaseUpper] = 0x00040f}}, + {0x000460, {[CaseLower] = 0x000461,[CaseTitle] = 0x000460,[CaseUpper] = 0x000460}}, + {0x000461, {[CaseLower] = 0x000461,[CaseTitle] = 0x000460,[CaseUpper] = 0x000460}}, + {0x000462, {[CaseLower] = 0x000463,[CaseTitle] = 0x000462,[CaseUpper] = 0x000462}}, + {0x000463, {[CaseLower] = 0x000463,[CaseTitle] = 0x000462,[CaseUpper] = 0x000462}}, + {0x000464, {[CaseLower] = 0x000465,[CaseTitle] = 0x000464,[CaseUpper] = 0x000464}}, + {0x000465, {[CaseLower] = 0x000465,[CaseTitle] = 0x000464,[CaseUpper] = 0x000464}}, + {0x000466, {[CaseLower] = 0x000467,[CaseTitle] = 0x000466,[CaseUpper] = 0x000466}}, + {0x000467, {[CaseLower] = 0x000467,[CaseTitle] = 0x000466,[CaseUpper] = 0x000466}}, + {0x000468, {[CaseLower] = 0x000469,[CaseTitle] = 0x000468,[CaseUpper] = 0x000468}}, + {0x000469, {[CaseLower] = 0x000469,[CaseTitle] = 0x000468,[CaseUpper] = 0x000468}}, + {0x00046a, {[CaseLower] = 0x00046b,[CaseTitle] = 0x00046a,[CaseUpper] = 0x00046a}}, + {0x00046b, {[CaseLower] = 0x00046b,[CaseTitle] = 0x00046a,[CaseUpper] = 0x00046a}}, + {0x00046c, {[CaseLower] = 0x00046d,[CaseTitle] = 0x00046c,[CaseUpper] = 0x00046c}}, + {0x00046d, {[CaseLower] = 0x00046d,[CaseTitle] = 0x00046c,[CaseUpper] = 0x00046c}}, + {0x00046e, {[CaseLower] = 0x00046f,[CaseTitle] = 0x00046e,[CaseUpper] = 0x00046e}}, + {0x00046f, {[CaseLower] = 0x00046f,[CaseTitle] = 0x00046e,[CaseUpper] = 0x00046e}}, + {0x000470, {[CaseLower] = 0x000471,[CaseTitle] = 0x000470,[CaseUpper] = 0x000470}}, + {0x000471, {[CaseLower] = 0x000471,[CaseTitle] = 0x000470,[CaseUpper] = 0x000470}}, + {0x000472, {[CaseLower] = 0x000473,[CaseTitle] = 0x000472,[CaseUpper] = 0x000472}}, + {0x000473, {[CaseLower] = 0x000473,[CaseTitle] = 0x000472,[CaseUpper] = 0x000472}}, + {0x000474, {[CaseLower] = 0x000475,[CaseTitle] = 0x000474,[CaseUpper] = 0x000474}}, + {0x000475, {[CaseLower] = 0x000475,[CaseTitle] = 0x000474,[CaseUpper] = 0x000474}}, + {0x000476, {[CaseLower] = 0x000477,[CaseTitle] = 0x000476,[CaseUpper] = 0x000476}}, + {0x000477, {[CaseLower] = 0x000477,[CaseTitle] = 0x000476,[CaseUpper] = 0x000476}}, + {0x000478, {[CaseLower] = 0x000479,[CaseTitle] = 0x000478,[CaseUpper] = 0x000478}}, + {0x000479, {[CaseLower] = 0x000479,[CaseTitle] = 0x000478,[CaseUpper] = 0x000478}}, + {0x00047a, {[CaseLower] = 0x00047b,[CaseTitle] = 0x00047a,[CaseUpper] = 0x00047a}}, + {0x00047b, {[CaseLower] = 0x00047b,[CaseTitle] = 0x00047a,[CaseUpper] = 0x00047a}}, + {0x00047c, {[CaseLower] = 0x00047d,[CaseTitle] = 0x00047c,[CaseUpper] = 0x00047c}}, + {0x00047d, {[CaseLower] = 0x00047d,[CaseTitle] = 0x00047c,[CaseUpper] = 0x00047c}}, + {0x00047e, {[CaseLower] = 0x00047f,[CaseTitle] = 0x00047e,[CaseUpper] = 0x00047e}}, + {0x00047f, {[CaseLower] = 0x00047f,[CaseTitle] = 0x00047e,[CaseUpper] = 0x00047e}}, + {0x000480, {[CaseLower] = 0x000481,[CaseTitle] = 0x000480,[CaseUpper] = 0x000480}}, + {0x000481, {[CaseLower] = 0x000481,[CaseTitle] = 0x000480,[CaseUpper] = 0x000480}}, + {0x00048a, {[CaseLower] = 0x00048b,[CaseTitle] = 0x00048a,[CaseUpper] = 0x00048a}}, + {0x00048b, {[CaseLower] = 0x00048b,[CaseTitle] = 0x00048a,[CaseUpper] = 0x00048a}}, + {0x00048c, {[CaseLower] = 0x00048d,[CaseTitle] = 0x00048c,[CaseUpper] = 0x00048c}}, + {0x00048d, {[CaseLower] = 0x00048d,[CaseTitle] = 0x00048c,[CaseUpper] = 0x00048c}}, + {0x00048e, {[CaseLower] = 0x00048f,[CaseTitle] = 0x00048e,[CaseUpper] = 0x00048e}}, + {0x00048f, {[CaseLower] = 0x00048f,[CaseTitle] = 0x00048e,[CaseUpper] = 0x00048e}}, + {0x000490, {[CaseLower] = 0x000491,[CaseTitle] = 0x000490,[CaseUpper] = 0x000490}}, + {0x000491, {[CaseLower] = 0x000491,[CaseTitle] = 0x000490,[CaseUpper] = 0x000490}}, + {0x000492, {[CaseLower] = 0x000493,[CaseTitle] = 0x000492,[CaseUpper] = 0x000492}}, + {0x000493, {[CaseLower] = 0x000493,[CaseTitle] = 0x000492,[CaseUpper] = 0x000492}}, + {0x000494, {[CaseLower] = 0x000495,[CaseTitle] = 0x000494,[CaseUpper] = 0x000494}}, + {0x000495, {[CaseLower] = 0x000495,[CaseTitle] = 0x000494,[CaseUpper] = 0x000494}}, + {0x000496, {[CaseLower] = 0x000497,[CaseTitle] = 0x000496,[CaseUpper] = 0x000496}}, + {0x000497, {[CaseLower] = 0x000497,[CaseTitle] = 0x000496,[CaseUpper] = 0x000496}}, + {0x000498, {[CaseLower] = 0x000499,[CaseTitle] = 0x000498,[CaseUpper] = 0x000498}}, + {0x000499, {[CaseLower] = 0x000499,[CaseTitle] = 0x000498,[CaseUpper] = 0x000498}}, + {0x00049a, {[CaseLower] = 0x00049b,[CaseTitle] = 0x00049a,[CaseUpper] = 0x00049a}}, + {0x00049b, {[CaseLower] = 0x00049b,[CaseTitle] = 0x00049a,[CaseUpper] = 0x00049a}}, + {0x00049c, {[CaseLower] = 0x00049d,[CaseTitle] = 0x00049c,[CaseUpper] = 0x00049c}}, + {0x00049d, {[CaseLower] = 0x00049d,[CaseTitle] = 0x00049c,[CaseUpper] = 0x00049c}}, + {0x00049e, {[CaseLower] = 0x00049f,[CaseTitle] = 0x00049e,[CaseUpper] = 0x00049e}}, + {0x00049f, {[CaseLower] = 0x00049f,[CaseTitle] = 0x00049e,[CaseUpper] = 0x00049e}}, + {0x0004a0, {[CaseLower] = 0x0004a1,[CaseTitle] = 0x0004a0,[CaseUpper] = 0x0004a0}}, + {0x0004a1, {[CaseLower] = 0x0004a1,[CaseTitle] = 0x0004a0,[CaseUpper] = 0x0004a0}}, + {0x0004a2, {[CaseLower] = 0x0004a3,[CaseTitle] = 0x0004a2,[CaseUpper] = 0x0004a2}}, + {0x0004a3, {[CaseLower] = 0x0004a3,[CaseTitle] = 0x0004a2,[CaseUpper] = 0x0004a2}}, + {0x0004a4, {[CaseLower] = 0x0004a5,[CaseTitle] = 0x0004a4,[CaseUpper] = 0x0004a4}}, + {0x0004a5, {[CaseLower] = 0x0004a5,[CaseTitle] = 0x0004a4,[CaseUpper] = 0x0004a4}}, + {0x0004a6, {[CaseLower] = 0x0004a7,[CaseTitle] = 0x0004a6,[CaseUpper] = 0x0004a6}}, + {0x0004a7, {[CaseLower] = 0x0004a7,[CaseTitle] = 0x0004a6,[CaseUpper] = 0x0004a6}}, + {0x0004a8, {[CaseLower] = 0x0004a9,[CaseTitle] = 0x0004a8,[CaseUpper] = 0x0004a8}}, + {0x0004a9, {[CaseLower] = 0x0004a9,[CaseTitle] = 0x0004a8,[CaseUpper] = 0x0004a8}}, + {0x0004aa, {[CaseLower] = 0x0004ab,[CaseTitle] = 0x0004aa,[CaseUpper] = 0x0004aa}}, + {0x0004ab, {[CaseLower] = 0x0004ab,[CaseTitle] = 0x0004aa,[CaseUpper] = 0x0004aa}}, + {0x0004ac, {[CaseLower] = 0x0004ad,[CaseTitle] = 0x0004ac,[CaseUpper] = 0x0004ac}}, + {0x0004ad, {[CaseLower] = 0x0004ad,[CaseTitle] = 0x0004ac,[CaseUpper] = 0x0004ac}}, + {0x0004ae, {[CaseLower] = 0x0004af,[CaseTitle] = 0x0004ae,[CaseUpper] = 0x0004ae}}, + {0x0004af, {[CaseLower] = 0x0004af,[CaseTitle] = 0x0004ae,[CaseUpper] = 0x0004ae}}, + {0x0004b0, {[CaseLower] = 0x0004b1,[CaseTitle] = 0x0004b0,[CaseUpper] = 0x0004b0}}, + {0x0004b1, {[CaseLower] = 0x0004b1,[CaseTitle] = 0x0004b0,[CaseUpper] = 0x0004b0}}, + {0x0004b2, {[CaseLower] = 0x0004b3,[CaseTitle] = 0x0004b2,[CaseUpper] = 0x0004b2}}, + {0x0004b3, {[CaseLower] = 0x0004b3,[CaseTitle] = 0x0004b2,[CaseUpper] = 0x0004b2}}, + {0x0004b4, {[CaseLower] = 0x0004b5,[CaseTitle] = 0x0004b4,[CaseUpper] = 0x0004b4}}, + {0x0004b5, {[CaseLower] = 0x0004b5,[CaseTitle] = 0x0004b4,[CaseUpper] = 0x0004b4}}, + {0x0004b6, {[CaseLower] = 0x0004b7,[CaseTitle] = 0x0004b6,[CaseUpper] = 0x0004b6}}, + {0x0004b7, {[CaseLower] = 0x0004b7,[CaseTitle] = 0x0004b6,[CaseUpper] = 0x0004b6}}, + {0x0004b8, {[CaseLower] = 0x0004b9,[CaseTitle] = 0x0004b8,[CaseUpper] = 0x0004b8}}, + {0x0004b9, {[CaseLower] = 0x0004b9,[CaseTitle] = 0x0004b8,[CaseUpper] = 0x0004b8}}, + {0x0004ba, {[CaseLower] = 0x0004bb,[CaseTitle] = 0x0004ba,[CaseUpper] = 0x0004ba}}, + {0x0004bb, {[CaseLower] = 0x0004bb,[CaseTitle] = 0x0004ba,[CaseUpper] = 0x0004ba}}, + {0x0004bc, {[CaseLower] = 0x0004bd,[CaseTitle] = 0x0004bc,[CaseUpper] = 0x0004bc}}, + {0x0004bd, {[CaseLower] = 0x0004bd,[CaseTitle] = 0x0004bc,[CaseUpper] = 0x0004bc}}, + {0x0004be, {[CaseLower] = 0x0004bf,[CaseTitle] = 0x0004be,[CaseUpper] = 0x0004be}}, + {0x0004bf, {[CaseLower] = 0x0004bf,[CaseTitle] = 0x0004be,[CaseUpper] = 0x0004be}}, + {0x0004c0, {[CaseLower] = 0x0004cf,[CaseTitle] = 0x0004c0,[CaseUpper] = 0x0004c0}}, + {0x0004c1, {[CaseLower] = 0x0004c2,[CaseTitle] = 0x0004c1,[CaseUpper] = 0x0004c1}}, + {0x0004c2, {[CaseLower] = 0x0004c2,[CaseTitle] = 0x0004c1,[CaseUpper] = 0x0004c1}}, + {0x0004c3, {[CaseLower] = 0x0004c4,[CaseTitle] = 0x0004c3,[CaseUpper] = 0x0004c3}}, + {0x0004c4, {[CaseLower] = 0x0004c4,[CaseTitle] = 0x0004c3,[CaseUpper] = 0x0004c3}}, + {0x0004c5, {[CaseLower] = 0x0004c6,[CaseTitle] = 0x0004c5,[CaseUpper] = 0x0004c5}}, + {0x0004c6, {[CaseLower] = 0x0004c6,[CaseTitle] = 0x0004c5,[CaseUpper] = 0x0004c5}}, + {0x0004c7, {[CaseLower] = 0x0004c8,[CaseTitle] = 0x0004c7,[CaseUpper] = 0x0004c7}}, + {0x0004c8, {[CaseLower] = 0x0004c8,[CaseTitle] = 0x0004c7,[CaseUpper] = 0x0004c7}}, + {0x0004c9, {[CaseLower] = 0x0004ca,[CaseTitle] = 0x0004c9,[CaseUpper] = 0x0004c9}}, + {0x0004ca, {[CaseLower] = 0x0004ca,[CaseTitle] = 0x0004c9,[CaseUpper] = 0x0004c9}}, + {0x0004cb, {[CaseLower] = 0x0004cc,[CaseTitle] = 0x0004cb,[CaseUpper] = 0x0004cb}}, + {0x0004cc, {[CaseLower] = 0x0004cc,[CaseTitle] = 0x0004cb,[CaseUpper] = 0x0004cb}}, + {0x0004cd, {[CaseLower] = 0x0004ce,[CaseTitle] = 0x0004cd,[CaseUpper] = 0x0004cd}}, + {0x0004ce, {[CaseLower] = 0x0004ce,[CaseTitle] = 0x0004cd,[CaseUpper] = 0x0004cd}}, + {0x0004cf, {[CaseLower] = 0x0004cf,[CaseTitle] = 0x0004c0,[CaseUpper] = 0x0004c0}}, + {0x0004d0, {[CaseLower] = 0x0004d1,[CaseTitle] = 0x0004d0,[CaseUpper] = 0x0004d0}}, + {0x0004d1, {[CaseLower] = 0x0004d1,[CaseTitle] = 0x0004d0,[CaseUpper] = 0x0004d0}}, + {0x0004d2, {[CaseLower] = 0x0004d3,[CaseTitle] = 0x0004d2,[CaseUpper] = 0x0004d2}}, + {0x0004d3, {[CaseLower] = 0x0004d3,[CaseTitle] = 0x0004d2,[CaseUpper] = 0x0004d2}}, + {0x0004d4, {[CaseLower] = 0x0004d5,[CaseTitle] = 0x0004d4,[CaseUpper] = 0x0004d4}}, + {0x0004d5, {[CaseLower] = 0x0004d5,[CaseTitle] = 0x0004d4,[CaseUpper] = 0x0004d4}}, + {0x0004d6, {[CaseLower] = 0x0004d7,[CaseTitle] = 0x0004d6,[CaseUpper] = 0x0004d6}}, + {0x0004d7, {[CaseLower] = 0x0004d7,[CaseTitle] = 0x0004d6,[CaseUpper] = 0x0004d6}}, + {0x0004d8, {[CaseLower] = 0x0004d9,[CaseTitle] = 0x0004d8,[CaseUpper] = 0x0004d8}}, + {0x0004d9, {[CaseLower] = 0x0004d9,[CaseTitle] = 0x0004d8,[CaseUpper] = 0x0004d8}}, + {0x0004da, {[CaseLower] = 0x0004db,[CaseTitle] = 0x0004da,[CaseUpper] = 0x0004da}}, + {0x0004db, {[CaseLower] = 0x0004db,[CaseTitle] = 0x0004da,[CaseUpper] = 0x0004da}}, + {0x0004dc, {[CaseLower] = 0x0004dd,[CaseTitle] = 0x0004dc,[CaseUpper] = 0x0004dc}}, + {0x0004dd, {[CaseLower] = 0x0004dd,[CaseTitle] = 0x0004dc,[CaseUpper] = 0x0004dc}}, + {0x0004de, {[CaseLower] = 0x0004df,[CaseTitle] = 0x0004de,[CaseUpper] = 0x0004de}}, + {0x0004df, {[CaseLower] = 0x0004df,[CaseTitle] = 0x0004de,[CaseUpper] = 0x0004de}}, + {0x0004e0, {[CaseLower] = 0x0004e1,[CaseTitle] = 0x0004e0,[CaseUpper] = 0x0004e0}}, + {0x0004e1, {[CaseLower] = 0x0004e1,[CaseTitle] = 0x0004e0,[CaseUpper] = 0x0004e0}}, + {0x0004e2, {[CaseLower] = 0x0004e3,[CaseTitle] = 0x0004e2,[CaseUpper] = 0x0004e2}}, + {0x0004e3, {[CaseLower] = 0x0004e3,[CaseTitle] = 0x0004e2,[CaseUpper] = 0x0004e2}}, + {0x0004e4, {[CaseLower] = 0x0004e5,[CaseTitle] = 0x0004e4,[CaseUpper] = 0x0004e4}}, + {0x0004e5, {[CaseLower] = 0x0004e5,[CaseTitle] = 0x0004e4,[CaseUpper] = 0x0004e4}}, + {0x0004e6, {[CaseLower] = 0x0004e7,[CaseTitle] = 0x0004e6,[CaseUpper] = 0x0004e6}}, + {0x0004e7, {[CaseLower] = 0x0004e7,[CaseTitle] = 0x0004e6,[CaseUpper] = 0x0004e6}}, + {0x0004e8, {[CaseLower] = 0x0004e9,[CaseTitle] = 0x0004e8,[CaseUpper] = 0x0004e8}}, + {0x0004e9, {[CaseLower] = 0x0004e9,[CaseTitle] = 0x0004e8,[CaseUpper] = 0x0004e8}}, + {0x0004ea, {[CaseLower] = 0x0004eb,[CaseTitle] = 0x0004ea,[CaseUpper] = 0x0004ea}}, + {0x0004eb, {[CaseLower] = 0x0004eb,[CaseTitle] = 0x0004ea,[CaseUpper] = 0x0004ea}}, + {0x0004ec, {[CaseLower] = 0x0004ed,[CaseTitle] = 0x0004ec,[CaseUpper] = 0x0004ec}}, + {0x0004ed, {[CaseLower] = 0x0004ed,[CaseTitle] = 0x0004ec,[CaseUpper] = 0x0004ec}}, + {0x0004ee, {[CaseLower] = 0x0004ef,[CaseTitle] = 0x0004ee,[CaseUpper] = 0x0004ee}}, + {0x0004ef, {[CaseLower] = 0x0004ef,[CaseTitle] = 0x0004ee,[CaseUpper] = 0x0004ee}}, + {0x0004f0, {[CaseLower] = 0x0004f1,[CaseTitle] = 0x0004f0,[CaseUpper] = 0x0004f0}}, + {0x0004f1, {[CaseLower] = 0x0004f1,[CaseTitle] = 0x0004f0,[CaseUpper] = 0x0004f0}}, + {0x0004f2, {[CaseLower] = 0x0004f3,[CaseTitle] = 0x0004f2,[CaseUpper] = 0x0004f2}}, + {0x0004f3, {[CaseLower] = 0x0004f3,[CaseTitle] = 0x0004f2,[CaseUpper] = 0x0004f2}}, + {0x0004f4, {[CaseLower] = 0x0004f5,[CaseTitle] = 0x0004f4,[CaseUpper] = 0x0004f4}}, + {0x0004f5, {[CaseLower] = 0x0004f5,[CaseTitle] = 0x0004f4,[CaseUpper] = 0x0004f4}}, + {0x0004f6, {[CaseLower] = 0x0004f7,[CaseTitle] = 0x0004f6,[CaseUpper] = 0x0004f6}}, + {0x0004f7, {[CaseLower] = 0x0004f7,[CaseTitle] = 0x0004f6,[CaseUpper] = 0x0004f6}}, + {0x0004f8, {[CaseLower] = 0x0004f9,[CaseTitle] = 0x0004f8,[CaseUpper] = 0x0004f8}}, + {0x0004f9, {[CaseLower] = 0x0004f9,[CaseTitle] = 0x0004f8,[CaseUpper] = 0x0004f8}}, + {0x0004fa, {[CaseLower] = 0x0004fb,[CaseTitle] = 0x0004fa,[CaseUpper] = 0x0004fa}}, + {0x0004fb, {[CaseLower] = 0x0004fb,[CaseTitle] = 0x0004fa,[CaseUpper] = 0x0004fa}}, + {0x0004fc, {[CaseLower] = 0x0004fd,[CaseTitle] = 0x0004fc,[CaseUpper] = 0x0004fc}}, + {0x0004fd, {[CaseLower] = 0x0004fd,[CaseTitle] = 0x0004fc,[CaseUpper] = 0x0004fc}}, + {0x0004fe, {[CaseLower] = 0x0004ff,[CaseTitle] = 0x0004fe,[CaseUpper] = 0x0004fe}}, + {0x0004ff, {[CaseLower] = 0x0004ff,[CaseTitle] = 0x0004fe,[CaseUpper] = 0x0004fe}}, + {0x000500, {[CaseLower] = 0x000501,[CaseTitle] = 0x000500,[CaseUpper] = 0x000500}}, + {0x000501, {[CaseLower] = 0x000501,[CaseTitle] = 0x000500,[CaseUpper] = 0x000500}}, + {0x000502, {[CaseLower] = 0x000503,[CaseTitle] = 0x000502,[CaseUpper] = 0x000502}}, + {0x000503, {[CaseLower] = 0x000503,[CaseTitle] = 0x000502,[CaseUpper] = 0x000502}}, + {0x000504, {[CaseLower] = 0x000505,[CaseTitle] = 0x000504,[CaseUpper] = 0x000504}}, + {0x000505, {[CaseLower] = 0x000505,[CaseTitle] = 0x000504,[CaseUpper] = 0x000504}}, + {0x000506, {[CaseLower] = 0x000507,[CaseTitle] = 0x000506,[CaseUpper] = 0x000506}}, + {0x000507, {[CaseLower] = 0x000507,[CaseTitle] = 0x000506,[CaseUpper] = 0x000506}}, + {0x000508, {[CaseLower] = 0x000509,[CaseTitle] = 0x000508,[CaseUpper] = 0x000508}}, + {0x000509, {[CaseLower] = 0x000509,[CaseTitle] = 0x000508,[CaseUpper] = 0x000508}}, + {0x00050a, {[CaseLower] = 0x00050b,[CaseTitle] = 0x00050a,[CaseUpper] = 0x00050a}}, + {0x00050b, {[CaseLower] = 0x00050b,[CaseTitle] = 0x00050a,[CaseUpper] = 0x00050a}}, + {0x00050c, {[CaseLower] = 0x00050d,[CaseTitle] = 0x00050c,[CaseUpper] = 0x00050c}}, + {0x00050d, {[CaseLower] = 0x00050d,[CaseTitle] = 0x00050c,[CaseUpper] = 0x00050c}}, + {0x00050e, {[CaseLower] = 0x00050f,[CaseTitle] = 0x00050e,[CaseUpper] = 0x00050e}}, + {0x00050f, {[CaseLower] = 0x00050f,[CaseTitle] = 0x00050e,[CaseUpper] = 0x00050e}}, + {0x000510, {[CaseLower] = 0x000511,[CaseTitle] = 0x000510,[CaseUpper] = 0x000510}}, + {0x000511, {[CaseLower] = 0x000511,[CaseTitle] = 0x000510,[CaseUpper] = 0x000510}}, + {0x000512, {[CaseLower] = 0x000513,[CaseTitle] = 0x000512,[CaseUpper] = 0x000512}}, + {0x000513, {[CaseLower] = 0x000513,[CaseTitle] = 0x000512,[CaseUpper] = 0x000512}}, + {0x000514, {[CaseLower] = 0x000515,[CaseTitle] = 0x000514,[CaseUpper] = 0x000514}}, + {0x000515, {[CaseLower] = 0x000515,[CaseTitle] = 0x000514,[CaseUpper] = 0x000514}}, + {0x000516, {[CaseLower] = 0x000517,[CaseTitle] = 0x000516,[CaseUpper] = 0x000516}}, + {0x000517, {[CaseLower] = 0x000517,[CaseTitle] = 0x000516,[CaseUpper] = 0x000516}}, + {0x000518, {[CaseLower] = 0x000519,[CaseTitle] = 0x000518,[CaseUpper] = 0x000518}}, + {0x000519, {[CaseLower] = 0x000519,[CaseTitle] = 0x000518,[CaseUpper] = 0x000518}}, + {0x00051a, {[CaseLower] = 0x00051b,[CaseTitle] = 0x00051a,[CaseUpper] = 0x00051a}}, + {0x00051b, {[CaseLower] = 0x00051b,[CaseTitle] = 0x00051a,[CaseUpper] = 0x00051a}}, + {0x00051c, {[CaseLower] = 0x00051d,[CaseTitle] = 0x00051c,[CaseUpper] = 0x00051c}}, + {0x00051d, {[CaseLower] = 0x00051d,[CaseTitle] = 0x00051c,[CaseUpper] = 0x00051c}}, + {0x00051e, {[CaseLower] = 0x00051f,[CaseTitle] = 0x00051e,[CaseUpper] = 0x00051e}}, + {0x00051f, {[CaseLower] = 0x00051f,[CaseTitle] = 0x00051e,[CaseUpper] = 0x00051e}}, + {0x000520, {[CaseLower] = 0x000521,[CaseTitle] = 0x000520,[CaseUpper] = 0x000520}}, + {0x000521, {[CaseLower] = 0x000521,[CaseTitle] = 0x000520,[CaseUpper] = 0x000520}}, + {0x000522, {[CaseLower] = 0x000523,[CaseTitle] = 0x000522,[CaseUpper] = 0x000522}}, + {0x000523, {[CaseLower] = 0x000523,[CaseTitle] = 0x000522,[CaseUpper] = 0x000522}}, + {0x000524, {[CaseLower] = 0x000525,[CaseTitle] = 0x000524,[CaseUpper] = 0x000524}}, + {0x000525, {[CaseLower] = 0x000525,[CaseTitle] = 0x000524,[CaseUpper] = 0x000524}}, + {0x000526, {[CaseLower] = 0x000527,[CaseTitle] = 0x000526,[CaseUpper] = 0x000526}}, + {0x000527, {[CaseLower] = 0x000527,[CaseTitle] = 0x000526,[CaseUpper] = 0x000526}}, + {0x000528, {[CaseLower] = 0x000529,[CaseTitle] = 0x000528,[CaseUpper] = 0x000528}}, + {0x000529, {[CaseLower] = 0x000529,[CaseTitle] = 0x000528,[CaseUpper] = 0x000528}}, + {0x00052a, {[CaseLower] = 0x00052b,[CaseTitle] = 0x00052a,[CaseUpper] = 0x00052a}}, + {0x00052b, {[CaseLower] = 0x00052b,[CaseTitle] = 0x00052a,[CaseUpper] = 0x00052a}}, + {0x00052c, {[CaseLower] = 0x00052d,[CaseTitle] = 0x00052c,[CaseUpper] = 0x00052c}}, + {0x00052d, {[CaseLower] = 0x00052d,[CaseTitle] = 0x00052c,[CaseUpper] = 0x00052c}}, + {0x00052e, {[CaseLower] = 0x00052f,[CaseTitle] = 0x00052e,[CaseUpper] = 0x00052e}}, + {0x00052f, {[CaseLower] = 0x00052f,[CaseTitle] = 0x00052e,[CaseUpper] = 0x00052e}}, + {0x000531, {[CaseLower] = 0x000561,[CaseTitle] = 0x000531,[CaseUpper] = 0x000531}}, + {0x000532, {[CaseLower] = 0x000562,[CaseTitle] = 0x000532,[CaseUpper] = 0x000532}}, + {0x000533, {[CaseLower] = 0x000563,[CaseTitle] = 0x000533,[CaseUpper] = 0x000533}}, + {0x000534, {[CaseLower] = 0x000564,[CaseTitle] = 0x000534,[CaseUpper] = 0x000534}}, + {0x000535, {[CaseLower] = 0x000565,[CaseTitle] = 0x000535,[CaseUpper] = 0x000535}}, + {0x000536, {[CaseLower] = 0x000566,[CaseTitle] = 0x000536,[CaseUpper] = 0x000536}}, + {0x000537, {[CaseLower] = 0x000567,[CaseTitle] = 0x000537,[CaseUpper] = 0x000537}}, + {0x000538, {[CaseLower] = 0x000568,[CaseTitle] = 0x000538,[CaseUpper] = 0x000538}}, + {0x000539, {[CaseLower] = 0x000569,[CaseTitle] = 0x000539,[CaseUpper] = 0x000539}}, + {0x00053a, {[CaseLower] = 0x00056a,[CaseTitle] = 0x00053a,[CaseUpper] = 0x00053a}}, + {0x00053b, {[CaseLower] = 0x00056b,[CaseTitle] = 0x00053b,[CaseUpper] = 0x00053b}}, + {0x00053c, {[CaseLower] = 0x00056c,[CaseTitle] = 0x00053c,[CaseUpper] = 0x00053c}}, + {0x00053d, {[CaseLower] = 0x00056d,[CaseTitle] = 0x00053d,[CaseUpper] = 0x00053d}}, + {0x00053e, {[CaseLower] = 0x00056e,[CaseTitle] = 0x00053e,[CaseUpper] = 0x00053e}}, + {0x00053f, {[CaseLower] = 0x00056f,[CaseTitle] = 0x00053f,[CaseUpper] = 0x00053f}}, + {0x000540, {[CaseLower] = 0x000570,[CaseTitle] = 0x000540,[CaseUpper] = 0x000540}}, + {0x000541, {[CaseLower] = 0x000571,[CaseTitle] = 0x000541,[CaseUpper] = 0x000541}}, + {0x000542, {[CaseLower] = 0x000572,[CaseTitle] = 0x000542,[CaseUpper] = 0x000542}}, + {0x000543, {[CaseLower] = 0x000573,[CaseTitle] = 0x000543,[CaseUpper] = 0x000543}}, + {0x000544, {[CaseLower] = 0x000574,[CaseTitle] = 0x000544,[CaseUpper] = 0x000544}}, + {0x000545, {[CaseLower] = 0x000575,[CaseTitle] = 0x000545,[CaseUpper] = 0x000545}}, + {0x000546, {[CaseLower] = 0x000576,[CaseTitle] = 0x000546,[CaseUpper] = 0x000546}}, + {0x000547, {[CaseLower] = 0x000577,[CaseTitle] = 0x000547,[CaseUpper] = 0x000547}}, + {0x000548, {[CaseLower] = 0x000578,[CaseTitle] = 0x000548,[CaseUpper] = 0x000548}}, + {0x000549, {[CaseLower] = 0x000579,[CaseTitle] = 0x000549,[CaseUpper] = 0x000549}}, + {0x00054a, {[CaseLower] = 0x00057a,[CaseTitle] = 0x00054a,[CaseUpper] = 0x00054a}}, + {0x00054b, {[CaseLower] = 0x00057b,[CaseTitle] = 0x00054b,[CaseUpper] = 0x00054b}}, + {0x00054c, {[CaseLower] = 0x00057c,[CaseTitle] = 0x00054c,[CaseUpper] = 0x00054c}}, + {0x00054d, {[CaseLower] = 0x00057d,[CaseTitle] = 0x00054d,[CaseUpper] = 0x00054d}}, + {0x00054e, {[CaseLower] = 0x00057e,[CaseTitle] = 0x00054e,[CaseUpper] = 0x00054e}}, + {0x00054f, {[CaseLower] = 0x00057f,[CaseTitle] = 0x00054f,[CaseUpper] = 0x00054f}}, + {0x000550, {[CaseLower] = 0x000580,[CaseTitle] = 0x000550,[CaseUpper] = 0x000550}}, + {0x000551, {[CaseLower] = 0x000581,[CaseTitle] = 0x000551,[CaseUpper] = 0x000551}}, + {0x000552, {[CaseLower] = 0x000582,[CaseTitle] = 0x000552,[CaseUpper] = 0x000552}}, + {0x000553, {[CaseLower] = 0x000583,[CaseTitle] = 0x000553,[CaseUpper] = 0x000553}}, + {0x000554, {[CaseLower] = 0x000584,[CaseTitle] = 0x000554,[CaseUpper] = 0x000554}}, + {0x000555, {[CaseLower] = 0x000585,[CaseTitle] = 0x000555,[CaseUpper] = 0x000555}}, + {0x000556, {[CaseLower] = 0x000586,[CaseTitle] = 0x000556,[CaseUpper] = 0x000556}}, + {0x000561, {[CaseLower] = 0x000561,[CaseTitle] = 0x000531,[CaseUpper] = 0x000531}}, + {0x000562, {[CaseLower] = 0x000562,[CaseTitle] = 0x000532,[CaseUpper] = 0x000532}}, + {0x000563, {[CaseLower] = 0x000563,[CaseTitle] = 0x000533,[CaseUpper] = 0x000533}}, + {0x000564, {[CaseLower] = 0x000564,[CaseTitle] = 0x000534,[CaseUpper] = 0x000534}}, + {0x000565, {[CaseLower] = 0x000565,[CaseTitle] = 0x000535,[CaseUpper] = 0x000535}}, + {0x000566, {[CaseLower] = 0x000566,[CaseTitle] = 0x000536,[CaseUpper] = 0x000536}}, + {0x000567, {[CaseLower] = 0x000567,[CaseTitle] = 0x000537,[CaseUpper] = 0x000537}}, + {0x000568, {[CaseLower] = 0x000568,[CaseTitle] = 0x000538,[CaseUpper] = 0x000538}}, + {0x000569, {[CaseLower] = 0x000569,[CaseTitle] = 0x000539,[CaseUpper] = 0x000539}}, + {0x00056a, {[CaseLower] = 0x00056a,[CaseTitle] = 0x00053a,[CaseUpper] = 0x00053a}}, + {0x00056b, {[CaseLower] = 0x00056b,[CaseTitle] = 0x00053b,[CaseUpper] = 0x00053b}}, + {0x00056c, {[CaseLower] = 0x00056c,[CaseTitle] = 0x00053c,[CaseUpper] = 0x00053c}}, + {0x00056d, {[CaseLower] = 0x00056d,[CaseTitle] = 0x00053d,[CaseUpper] = 0x00053d}}, + {0x00056e, {[CaseLower] = 0x00056e,[CaseTitle] = 0x00053e,[CaseUpper] = 0x00053e}}, + {0x00056f, {[CaseLower] = 0x00056f,[CaseTitle] = 0x00053f,[CaseUpper] = 0x00053f}}, + {0x000570, {[CaseLower] = 0x000570,[CaseTitle] = 0x000540,[CaseUpper] = 0x000540}}, + {0x000571, {[CaseLower] = 0x000571,[CaseTitle] = 0x000541,[CaseUpper] = 0x000541}}, + {0x000572, {[CaseLower] = 0x000572,[CaseTitle] = 0x000542,[CaseUpper] = 0x000542}}, + {0x000573, {[CaseLower] = 0x000573,[CaseTitle] = 0x000543,[CaseUpper] = 0x000543}}, + {0x000574, {[CaseLower] = 0x000574,[CaseTitle] = 0x000544,[CaseUpper] = 0x000544}}, + {0x000575, {[CaseLower] = 0x000575,[CaseTitle] = 0x000545,[CaseUpper] = 0x000545}}, + {0x000576, {[CaseLower] = 0x000576,[CaseTitle] = 0x000546,[CaseUpper] = 0x000546}}, + {0x000577, {[CaseLower] = 0x000577,[CaseTitle] = 0x000547,[CaseUpper] = 0x000547}}, + {0x000578, {[CaseLower] = 0x000578,[CaseTitle] = 0x000548,[CaseUpper] = 0x000548}}, + {0x000579, {[CaseLower] = 0x000579,[CaseTitle] = 0x000549,[CaseUpper] = 0x000549}}, + {0x00057a, {[CaseLower] = 0x00057a,[CaseTitle] = 0x00054a,[CaseUpper] = 0x00054a}}, + {0x00057b, {[CaseLower] = 0x00057b,[CaseTitle] = 0x00054b,[CaseUpper] = 0x00054b}}, + {0x00057c, {[CaseLower] = 0x00057c,[CaseTitle] = 0x00054c,[CaseUpper] = 0x00054c}}, + {0x00057d, {[CaseLower] = 0x00057d,[CaseTitle] = 0x00054d,[CaseUpper] = 0x00054d}}, + {0x00057e, {[CaseLower] = 0x00057e,[CaseTitle] = 0x00054e,[CaseUpper] = 0x00054e}}, + {0x00057f, {[CaseLower] = 0x00057f,[CaseTitle] = 0x00054f,[CaseUpper] = 0x00054f}}, + {0x000580, {[CaseLower] = 0x000580,[CaseTitle] = 0x000550,[CaseUpper] = 0x000550}}, + {0x000581, {[CaseLower] = 0x000581,[CaseTitle] = 0x000551,[CaseUpper] = 0x000551}}, + {0x000582, {[CaseLower] = 0x000582,[CaseTitle] = 0x000552,[CaseUpper] = 0x000552}}, + {0x000583, {[CaseLower] = 0x000583,[CaseTitle] = 0x000553,[CaseUpper] = 0x000553}}, + {0x000584, {[CaseLower] = 0x000584,[CaseTitle] = 0x000554,[CaseUpper] = 0x000554}}, + {0x000585, {[CaseLower] = 0x000585,[CaseTitle] = 0x000555,[CaseUpper] = 0x000555}}, + {0x000586, {[CaseLower] = 0x000586,[CaseTitle] = 0x000556,[CaseUpper] = 0x000556}}, + {0x0010a0, {[CaseLower] = 0x002d00,[CaseTitle] = 0x0010a0,[CaseUpper] = 0x0010a0}}, + {0x0010a1, {[CaseLower] = 0x002d01,[CaseTitle] = 0x0010a1,[CaseUpper] = 0x0010a1}}, + {0x0010a2, {[CaseLower] = 0x002d02,[CaseTitle] = 0x0010a2,[CaseUpper] = 0x0010a2}}, + {0x0010a3, {[CaseLower] = 0x002d03,[CaseTitle] = 0x0010a3,[CaseUpper] = 0x0010a3}}, + {0x0010a4, {[CaseLower] = 0x002d04,[CaseTitle] = 0x0010a4,[CaseUpper] = 0x0010a4}}, + {0x0010a5, {[CaseLower] = 0x002d05,[CaseTitle] = 0x0010a5,[CaseUpper] = 0x0010a5}}, + {0x0010a6, {[CaseLower] = 0x002d06,[CaseTitle] = 0x0010a6,[CaseUpper] = 0x0010a6}}, + {0x0010a7, {[CaseLower] = 0x002d07,[CaseTitle] = 0x0010a7,[CaseUpper] = 0x0010a7}}, + {0x0010a8, {[CaseLower] = 0x002d08,[CaseTitle] = 0x0010a8,[CaseUpper] = 0x0010a8}}, + {0x0010a9, {[CaseLower] = 0x002d09,[CaseTitle] = 0x0010a9,[CaseUpper] = 0x0010a9}}, + {0x0010aa, {[CaseLower] = 0x002d0a,[CaseTitle] = 0x0010aa,[CaseUpper] = 0x0010aa}}, + {0x0010ab, {[CaseLower] = 0x002d0b,[CaseTitle] = 0x0010ab,[CaseUpper] = 0x0010ab}}, + {0x0010ac, {[CaseLower] = 0x002d0c,[CaseTitle] = 0x0010ac,[CaseUpper] = 0x0010ac}}, + {0x0010ad, {[CaseLower] = 0x002d0d,[CaseTitle] = 0x0010ad,[CaseUpper] = 0x0010ad}}, + {0x0010ae, {[CaseLower] = 0x002d0e,[CaseTitle] = 0x0010ae,[CaseUpper] = 0x0010ae}}, + {0x0010af, {[CaseLower] = 0x002d0f,[CaseTitle] = 0x0010af,[CaseUpper] = 0x0010af}}, + {0x0010b0, {[CaseLower] = 0x002d10,[CaseTitle] = 0x0010b0,[CaseUpper] = 0x0010b0}}, + {0x0010b1, {[CaseLower] = 0x002d11,[CaseTitle] = 0x0010b1,[CaseUpper] = 0x0010b1}}, + {0x0010b2, {[CaseLower] = 0x002d12,[CaseTitle] = 0x0010b2,[CaseUpper] = 0x0010b2}}, + {0x0010b3, {[CaseLower] = 0x002d13,[CaseTitle] = 0x0010b3,[CaseUpper] = 0x0010b3}}, + {0x0010b4, {[CaseLower] = 0x002d14,[CaseTitle] = 0x0010b4,[CaseUpper] = 0x0010b4}}, + {0x0010b5, {[CaseLower] = 0x002d15,[CaseTitle] = 0x0010b5,[CaseUpper] = 0x0010b5}}, + {0x0010b6, {[CaseLower] = 0x002d16,[CaseTitle] = 0x0010b6,[CaseUpper] = 0x0010b6}}, + {0x0010b7, {[CaseLower] = 0x002d17,[CaseTitle] = 0x0010b7,[CaseUpper] = 0x0010b7}}, + {0x0010b8, {[CaseLower] = 0x002d18,[CaseTitle] = 0x0010b8,[CaseUpper] = 0x0010b8}}, + {0x0010b9, {[CaseLower] = 0x002d19,[CaseTitle] = 0x0010b9,[CaseUpper] = 0x0010b9}}, + {0x0010ba, {[CaseLower] = 0x002d1a,[CaseTitle] = 0x0010ba,[CaseUpper] = 0x0010ba}}, + {0x0010bb, {[CaseLower] = 0x002d1b,[CaseTitle] = 0x0010bb,[CaseUpper] = 0x0010bb}}, + {0x0010bc, {[CaseLower] = 0x002d1c,[CaseTitle] = 0x0010bc,[CaseUpper] = 0x0010bc}}, + {0x0010bd, {[CaseLower] = 0x002d1d,[CaseTitle] = 0x0010bd,[CaseUpper] = 0x0010bd}}, + {0x0010be, {[CaseLower] = 0x002d1e,[CaseTitle] = 0x0010be,[CaseUpper] = 0x0010be}}, + {0x0010bf, {[CaseLower] = 0x002d1f,[CaseTitle] = 0x0010bf,[CaseUpper] = 0x0010bf}}, + {0x0010c0, {[CaseLower] = 0x002d20,[CaseTitle] = 0x0010c0,[CaseUpper] = 0x0010c0}}, + {0x0010c1, {[CaseLower] = 0x002d21,[CaseTitle] = 0x0010c1,[CaseUpper] = 0x0010c1}}, + {0x0010c2, {[CaseLower] = 0x002d22,[CaseTitle] = 0x0010c2,[CaseUpper] = 0x0010c2}}, + {0x0010c3, {[CaseLower] = 0x002d23,[CaseTitle] = 0x0010c3,[CaseUpper] = 0x0010c3}}, + {0x0010c4, {[CaseLower] = 0x002d24,[CaseTitle] = 0x0010c4,[CaseUpper] = 0x0010c4}}, + {0x0010c5, {[CaseLower] = 0x002d25,[CaseTitle] = 0x0010c5,[CaseUpper] = 0x0010c5}}, + {0x0010c7, {[CaseLower] = 0x002d27,[CaseTitle] = 0x0010c7,[CaseUpper] = 0x0010c7}}, + {0x0010cd, {[CaseLower] = 0x002d2d,[CaseTitle] = 0x0010cd,[CaseUpper] = 0x0010cd}}, + {0x0010d0, {[CaseLower] = 0x0010d0,[CaseTitle] = 0x0010d0,[CaseUpper] = 0x001c90}}, + {0x0010d1, {[CaseLower] = 0x0010d1,[CaseTitle] = 0x0010d1,[CaseUpper] = 0x001c91}}, + {0x0010d2, {[CaseLower] = 0x0010d2,[CaseTitle] = 0x0010d2,[CaseUpper] = 0x001c92}}, + {0x0010d3, {[CaseLower] = 0x0010d3,[CaseTitle] = 0x0010d3,[CaseUpper] = 0x001c93}}, + {0x0010d4, {[CaseLower] = 0x0010d4,[CaseTitle] = 0x0010d4,[CaseUpper] = 0x001c94}}, + {0x0010d5, {[CaseLower] = 0x0010d5,[CaseTitle] = 0x0010d5,[CaseUpper] = 0x001c95}}, + {0x0010d6, {[CaseLower] = 0x0010d6,[CaseTitle] = 0x0010d6,[CaseUpper] = 0x001c96}}, + {0x0010d7, {[CaseLower] = 0x0010d7,[CaseTitle] = 0x0010d7,[CaseUpper] = 0x001c97}}, + {0x0010d8, {[CaseLower] = 0x0010d8,[CaseTitle] = 0x0010d8,[CaseUpper] = 0x001c98}}, + {0x0010d9, {[CaseLower] = 0x0010d9,[CaseTitle] = 0x0010d9,[CaseUpper] = 0x001c99}}, + {0x0010da, {[CaseLower] = 0x0010da,[CaseTitle] = 0x0010da,[CaseUpper] = 0x001c9a}}, + {0x0010db, {[CaseLower] = 0x0010db,[CaseTitle] = 0x0010db,[CaseUpper] = 0x001c9b}}, + {0x0010dc, {[CaseLower] = 0x0010dc,[CaseTitle] = 0x0010dc,[CaseUpper] = 0x001c9c}}, + {0x0010dd, {[CaseLower] = 0x0010dd,[CaseTitle] = 0x0010dd,[CaseUpper] = 0x001c9d}}, + {0x0010de, {[CaseLower] = 0x0010de,[CaseTitle] = 0x0010de,[CaseUpper] = 0x001c9e}}, + {0x0010df, {[CaseLower] = 0x0010df,[CaseTitle] = 0x0010df,[CaseUpper] = 0x001c9f}}, + {0x0010e0, {[CaseLower] = 0x0010e0,[CaseTitle] = 0x0010e0,[CaseUpper] = 0x001ca0}}, + {0x0010e1, {[CaseLower] = 0x0010e1,[CaseTitle] = 0x0010e1,[CaseUpper] = 0x001ca1}}, + {0x0010e2, {[CaseLower] = 0x0010e2,[CaseTitle] = 0x0010e2,[CaseUpper] = 0x001ca2}}, + {0x0010e3, {[CaseLower] = 0x0010e3,[CaseTitle] = 0x0010e3,[CaseUpper] = 0x001ca3}}, + {0x0010e4, {[CaseLower] = 0x0010e4,[CaseTitle] = 0x0010e4,[CaseUpper] = 0x001ca4}}, + {0x0010e5, {[CaseLower] = 0x0010e5,[CaseTitle] = 0x0010e5,[CaseUpper] = 0x001ca5}}, + {0x0010e6, {[CaseLower] = 0x0010e6,[CaseTitle] = 0x0010e6,[CaseUpper] = 0x001ca6}}, + {0x0010e7, {[CaseLower] = 0x0010e7,[CaseTitle] = 0x0010e7,[CaseUpper] = 0x001ca7}}, + {0x0010e8, {[CaseLower] = 0x0010e8,[CaseTitle] = 0x0010e8,[CaseUpper] = 0x001ca8}}, + {0x0010e9, {[CaseLower] = 0x0010e9,[CaseTitle] = 0x0010e9,[CaseUpper] = 0x001ca9}}, + {0x0010ea, {[CaseLower] = 0x0010ea,[CaseTitle] = 0x0010ea,[CaseUpper] = 0x001caa}}, + {0x0010eb, {[CaseLower] = 0x0010eb,[CaseTitle] = 0x0010eb,[CaseUpper] = 0x001cab}}, + {0x0010ec, {[CaseLower] = 0x0010ec,[CaseTitle] = 0x0010ec,[CaseUpper] = 0x001cac}}, + {0x0010ed, {[CaseLower] = 0x0010ed,[CaseTitle] = 0x0010ed,[CaseUpper] = 0x001cad}}, + {0x0010ee, {[CaseLower] = 0x0010ee,[CaseTitle] = 0x0010ee,[CaseUpper] = 0x001cae}}, + {0x0010ef, {[CaseLower] = 0x0010ef,[CaseTitle] = 0x0010ef,[CaseUpper] = 0x001caf}}, + {0x0010f0, {[CaseLower] = 0x0010f0,[CaseTitle] = 0x0010f0,[CaseUpper] = 0x001cb0}}, + {0x0010f1, {[CaseLower] = 0x0010f1,[CaseTitle] = 0x0010f1,[CaseUpper] = 0x001cb1}}, + {0x0010f2, {[CaseLower] = 0x0010f2,[CaseTitle] = 0x0010f2,[CaseUpper] = 0x001cb2}}, + {0x0010f3, {[CaseLower] = 0x0010f3,[CaseTitle] = 0x0010f3,[CaseUpper] = 0x001cb3}}, + {0x0010f4, {[CaseLower] = 0x0010f4,[CaseTitle] = 0x0010f4,[CaseUpper] = 0x001cb4}}, + {0x0010f5, {[CaseLower] = 0x0010f5,[CaseTitle] = 0x0010f5,[CaseUpper] = 0x001cb5}}, + {0x0010f6, {[CaseLower] = 0x0010f6,[CaseTitle] = 0x0010f6,[CaseUpper] = 0x001cb6}}, + {0x0010f7, {[CaseLower] = 0x0010f7,[CaseTitle] = 0x0010f7,[CaseUpper] = 0x001cb7}}, + {0x0010f8, {[CaseLower] = 0x0010f8,[CaseTitle] = 0x0010f8,[CaseUpper] = 0x001cb8}}, + {0x0010f9, {[CaseLower] = 0x0010f9,[CaseTitle] = 0x0010f9,[CaseUpper] = 0x001cb9}}, + {0x0010fa, {[CaseLower] = 0x0010fa,[CaseTitle] = 0x0010fa,[CaseUpper] = 0x001cba}}, + {0x0010fd, {[CaseLower] = 0x0010fd,[CaseTitle] = 0x0010fd,[CaseUpper] = 0x001cbd}}, + {0x0010fe, {[CaseLower] = 0x0010fe,[CaseTitle] = 0x0010fe,[CaseUpper] = 0x001cbe}}, + {0x0010ff, {[CaseLower] = 0x0010ff,[CaseTitle] = 0x0010ff,[CaseUpper] = 0x001cbf}}, + {0x0013a0, {[CaseLower] = 0x00ab70,[CaseTitle] = 0x0013a0,[CaseUpper] = 0x0013a0}}, + {0x0013a1, {[CaseLower] = 0x00ab71,[CaseTitle] = 0x0013a1,[CaseUpper] = 0x0013a1}}, + {0x0013a2, {[CaseLower] = 0x00ab72,[CaseTitle] = 0x0013a2,[CaseUpper] = 0x0013a2}}, + {0x0013a3, {[CaseLower] = 0x00ab73,[CaseTitle] = 0x0013a3,[CaseUpper] = 0x0013a3}}, + {0x0013a4, {[CaseLower] = 0x00ab74,[CaseTitle] = 0x0013a4,[CaseUpper] = 0x0013a4}}, + {0x0013a5, {[CaseLower] = 0x00ab75,[CaseTitle] = 0x0013a5,[CaseUpper] = 0x0013a5}}, + {0x0013a6, {[CaseLower] = 0x00ab76,[CaseTitle] = 0x0013a6,[CaseUpper] = 0x0013a6}}, + {0x0013a7, {[CaseLower] = 0x00ab77,[CaseTitle] = 0x0013a7,[CaseUpper] = 0x0013a7}}, + {0x0013a8, {[CaseLower] = 0x00ab78,[CaseTitle] = 0x0013a8,[CaseUpper] = 0x0013a8}}, + {0x0013a9, {[CaseLower] = 0x00ab79,[CaseTitle] = 0x0013a9,[CaseUpper] = 0x0013a9}}, + {0x0013aa, {[CaseLower] = 0x00ab7a,[CaseTitle] = 0x0013aa,[CaseUpper] = 0x0013aa}}, + {0x0013ab, {[CaseLower] = 0x00ab7b,[CaseTitle] = 0x0013ab,[CaseUpper] = 0x0013ab}}, + {0x0013ac, {[CaseLower] = 0x00ab7c,[CaseTitle] = 0x0013ac,[CaseUpper] = 0x0013ac}}, + {0x0013ad, {[CaseLower] = 0x00ab7d,[CaseTitle] = 0x0013ad,[CaseUpper] = 0x0013ad}}, + {0x0013ae, {[CaseLower] = 0x00ab7e,[CaseTitle] = 0x0013ae,[CaseUpper] = 0x0013ae}}, + {0x0013af, {[CaseLower] = 0x00ab7f,[CaseTitle] = 0x0013af,[CaseUpper] = 0x0013af}}, + {0x0013b0, {[CaseLower] = 0x00ab80,[CaseTitle] = 0x0013b0,[CaseUpper] = 0x0013b0}}, + {0x0013b1, {[CaseLower] = 0x00ab81,[CaseTitle] = 0x0013b1,[CaseUpper] = 0x0013b1}}, + {0x0013b2, {[CaseLower] = 0x00ab82,[CaseTitle] = 0x0013b2,[CaseUpper] = 0x0013b2}}, + {0x0013b3, {[CaseLower] = 0x00ab83,[CaseTitle] = 0x0013b3,[CaseUpper] = 0x0013b3}}, + {0x0013b4, {[CaseLower] = 0x00ab84,[CaseTitle] = 0x0013b4,[CaseUpper] = 0x0013b4}}, + {0x0013b5, {[CaseLower] = 0x00ab85,[CaseTitle] = 0x0013b5,[CaseUpper] = 0x0013b5}}, + {0x0013b6, {[CaseLower] = 0x00ab86,[CaseTitle] = 0x0013b6,[CaseUpper] = 0x0013b6}}, + {0x0013b7, {[CaseLower] = 0x00ab87,[CaseTitle] = 0x0013b7,[CaseUpper] = 0x0013b7}}, + {0x0013b8, {[CaseLower] = 0x00ab88,[CaseTitle] = 0x0013b8,[CaseUpper] = 0x0013b8}}, + {0x0013b9, {[CaseLower] = 0x00ab89,[CaseTitle] = 0x0013b9,[CaseUpper] = 0x0013b9}}, + {0x0013ba, {[CaseLower] = 0x00ab8a,[CaseTitle] = 0x0013ba,[CaseUpper] = 0x0013ba}}, + {0x0013bb, {[CaseLower] = 0x00ab8b,[CaseTitle] = 0x0013bb,[CaseUpper] = 0x0013bb}}, + {0x0013bc, {[CaseLower] = 0x00ab8c,[CaseTitle] = 0x0013bc,[CaseUpper] = 0x0013bc}}, + {0x0013bd, {[CaseLower] = 0x00ab8d,[CaseTitle] = 0x0013bd,[CaseUpper] = 0x0013bd}}, + {0x0013be, {[CaseLower] = 0x00ab8e,[CaseTitle] = 0x0013be,[CaseUpper] = 0x0013be}}, + {0x0013bf, {[CaseLower] = 0x00ab8f,[CaseTitle] = 0x0013bf,[CaseUpper] = 0x0013bf}}, + {0x0013c0, {[CaseLower] = 0x00ab90,[CaseTitle] = 0x0013c0,[CaseUpper] = 0x0013c0}}, + {0x0013c1, {[CaseLower] = 0x00ab91,[CaseTitle] = 0x0013c1,[CaseUpper] = 0x0013c1}}, + {0x0013c2, {[CaseLower] = 0x00ab92,[CaseTitle] = 0x0013c2,[CaseUpper] = 0x0013c2}}, + {0x0013c3, {[CaseLower] = 0x00ab93,[CaseTitle] = 0x0013c3,[CaseUpper] = 0x0013c3}}, + {0x0013c4, {[CaseLower] = 0x00ab94,[CaseTitle] = 0x0013c4,[CaseUpper] = 0x0013c4}}, + {0x0013c5, {[CaseLower] = 0x00ab95,[CaseTitle] = 0x0013c5,[CaseUpper] = 0x0013c5}}, + {0x0013c6, {[CaseLower] = 0x00ab96,[CaseTitle] = 0x0013c6,[CaseUpper] = 0x0013c6}}, + {0x0013c7, {[CaseLower] = 0x00ab97,[CaseTitle] = 0x0013c7,[CaseUpper] = 0x0013c7}}, + {0x0013c8, {[CaseLower] = 0x00ab98,[CaseTitle] = 0x0013c8,[CaseUpper] = 0x0013c8}}, + {0x0013c9, {[CaseLower] = 0x00ab99,[CaseTitle] = 0x0013c9,[CaseUpper] = 0x0013c9}}, + {0x0013ca, {[CaseLower] = 0x00ab9a,[CaseTitle] = 0x0013ca,[CaseUpper] = 0x0013ca}}, + {0x0013cb, {[CaseLower] = 0x00ab9b,[CaseTitle] = 0x0013cb,[CaseUpper] = 0x0013cb}}, + {0x0013cc, {[CaseLower] = 0x00ab9c,[CaseTitle] = 0x0013cc,[CaseUpper] = 0x0013cc}}, + {0x0013cd, {[CaseLower] = 0x00ab9d,[CaseTitle] = 0x0013cd,[CaseUpper] = 0x0013cd}}, + {0x0013ce, {[CaseLower] = 0x00ab9e,[CaseTitle] = 0x0013ce,[CaseUpper] = 0x0013ce}}, + {0x0013cf, {[CaseLower] = 0x00ab9f,[CaseTitle] = 0x0013cf,[CaseUpper] = 0x0013cf}}, + {0x0013d0, {[CaseLower] = 0x00aba0,[CaseTitle] = 0x0013d0,[CaseUpper] = 0x0013d0}}, + {0x0013d1, {[CaseLower] = 0x00aba1,[CaseTitle] = 0x0013d1,[CaseUpper] = 0x0013d1}}, + {0x0013d2, {[CaseLower] = 0x00aba2,[CaseTitle] = 0x0013d2,[CaseUpper] = 0x0013d2}}, + {0x0013d3, {[CaseLower] = 0x00aba3,[CaseTitle] = 0x0013d3,[CaseUpper] = 0x0013d3}}, + {0x0013d4, {[CaseLower] = 0x00aba4,[CaseTitle] = 0x0013d4,[CaseUpper] = 0x0013d4}}, + {0x0013d5, {[CaseLower] = 0x00aba5,[CaseTitle] = 0x0013d5,[CaseUpper] = 0x0013d5}}, + {0x0013d6, {[CaseLower] = 0x00aba6,[CaseTitle] = 0x0013d6,[CaseUpper] = 0x0013d6}}, + {0x0013d7, {[CaseLower] = 0x00aba7,[CaseTitle] = 0x0013d7,[CaseUpper] = 0x0013d7}}, + {0x0013d8, {[CaseLower] = 0x00aba8,[CaseTitle] = 0x0013d8,[CaseUpper] = 0x0013d8}}, + {0x0013d9, {[CaseLower] = 0x00aba9,[CaseTitle] = 0x0013d9,[CaseUpper] = 0x0013d9}}, + {0x0013da, {[CaseLower] = 0x00abaa,[CaseTitle] = 0x0013da,[CaseUpper] = 0x0013da}}, + {0x0013db, {[CaseLower] = 0x00abab,[CaseTitle] = 0x0013db,[CaseUpper] = 0x0013db}}, + {0x0013dc, {[CaseLower] = 0x00abac,[CaseTitle] = 0x0013dc,[CaseUpper] = 0x0013dc}}, + {0x0013dd, {[CaseLower] = 0x00abad,[CaseTitle] = 0x0013dd,[CaseUpper] = 0x0013dd}}, + {0x0013de, {[CaseLower] = 0x00abae,[CaseTitle] = 0x0013de,[CaseUpper] = 0x0013de}}, + {0x0013df, {[CaseLower] = 0x00abaf,[CaseTitle] = 0x0013df,[CaseUpper] = 0x0013df}}, + {0x0013e0, {[CaseLower] = 0x00abb0,[CaseTitle] = 0x0013e0,[CaseUpper] = 0x0013e0}}, + {0x0013e1, {[CaseLower] = 0x00abb1,[CaseTitle] = 0x0013e1,[CaseUpper] = 0x0013e1}}, + {0x0013e2, {[CaseLower] = 0x00abb2,[CaseTitle] = 0x0013e2,[CaseUpper] = 0x0013e2}}, + {0x0013e3, {[CaseLower] = 0x00abb3,[CaseTitle] = 0x0013e3,[CaseUpper] = 0x0013e3}}, + {0x0013e4, {[CaseLower] = 0x00abb4,[CaseTitle] = 0x0013e4,[CaseUpper] = 0x0013e4}}, + {0x0013e5, {[CaseLower] = 0x00abb5,[CaseTitle] = 0x0013e5,[CaseUpper] = 0x0013e5}}, + {0x0013e6, {[CaseLower] = 0x00abb6,[CaseTitle] = 0x0013e6,[CaseUpper] = 0x0013e6}}, + {0x0013e7, {[CaseLower] = 0x00abb7,[CaseTitle] = 0x0013e7,[CaseUpper] = 0x0013e7}}, + {0x0013e8, {[CaseLower] = 0x00abb8,[CaseTitle] = 0x0013e8,[CaseUpper] = 0x0013e8}}, + {0x0013e9, {[CaseLower] = 0x00abb9,[CaseTitle] = 0x0013e9,[CaseUpper] = 0x0013e9}}, + {0x0013ea, {[CaseLower] = 0x00abba,[CaseTitle] = 0x0013ea,[CaseUpper] = 0x0013ea}}, + {0x0013eb, {[CaseLower] = 0x00abbb,[CaseTitle] = 0x0013eb,[CaseUpper] = 0x0013eb}}, + {0x0013ec, {[CaseLower] = 0x00abbc,[CaseTitle] = 0x0013ec,[CaseUpper] = 0x0013ec}}, + {0x0013ed, {[CaseLower] = 0x00abbd,[CaseTitle] = 0x0013ed,[CaseUpper] = 0x0013ed}}, + {0x0013ee, {[CaseLower] = 0x00abbe,[CaseTitle] = 0x0013ee,[CaseUpper] = 0x0013ee}}, + {0x0013ef, {[CaseLower] = 0x00abbf,[CaseTitle] = 0x0013ef,[CaseUpper] = 0x0013ef}}, + {0x0013f0, {[CaseLower] = 0x0013f8,[CaseTitle] = 0x0013f0,[CaseUpper] = 0x0013f0}}, + {0x0013f1, {[CaseLower] = 0x0013f9,[CaseTitle] = 0x0013f1,[CaseUpper] = 0x0013f1}}, + {0x0013f2, {[CaseLower] = 0x0013fa,[CaseTitle] = 0x0013f2,[CaseUpper] = 0x0013f2}}, + {0x0013f3, {[CaseLower] = 0x0013fb,[CaseTitle] = 0x0013f3,[CaseUpper] = 0x0013f3}}, + {0x0013f4, {[CaseLower] = 0x0013fc,[CaseTitle] = 0x0013f4,[CaseUpper] = 0x0013f4}}, + {0x0013f5, {[CaseLower] = 0x0013fd,[CaseTitle] = 0x0013f5,[CaseUpper] = 0x0013f5}}, + {0x0013f8, {[CaseLower] = 0x0013f8,[CaseTitle] = 0x0013f0,[CaseUpper] = 0x0013f0}}, + {0x0013f9, {[CaseLower] = 0x0013f9,[CaseTitle] = 0x0013f1,[CaseUpper] = 0x0013f1}}, + {0x0013fa, {[CaseLower] = 0x0013fa,[CaseTitle] = 0x0013f2,[CaseUpper] = 0x0013f2}}, + {0x0013fb, {[CaseLower] = 0x0013fb,[CaseTitle] = 0x0013f3,[CaseUpper] = 0x0013f3}}, + {0x0013fc, {[CaseLower] = 0x0013fc,[CaseTitle] = 0x0013f4,[CaseUpper] = 0x0013f4}}, + {0x0013fd, {[CaseLower] = 0x0013fd,[CaseTitle] = 0x0013f5,[CaseUpper] = 0x0013f5}}, + {0x001c80, {[CaseLower] = 0x001c80,[CaseTitle] = 0x000412,[CaseUpper] = 0x000412}}, + {0x001c81, {[CaseLower] = 0x001c81,[CaseTitle] = 0x000414,[CaseUpper] = 0x000414}}, + {0x001c82, {[CaseLower] = 0x001c82,[CaseTitle] = 0x00041e,[CaseUpper] = 0x00041e}}, + {0x001c83, {[CaseLower] = 0x001c83,[CaseTitle] = 0x000421,[CaseUpper] = 0x000421}}, + {0x001c84, {[CaseLower] = 0x001c84,[CaseTitle] = 0x000422,[CaseUpper] = 0x000422}}, + {0x001c85, {[CaseLower] = 0x001c85,[CaseTitle] = 0x000422,[CaseUpper] = 0x000422}}, + {0x001c86, {[CaseLower] = 0x001c86,[CaseTitle] = 0x00042a,[CaseUpper] = 0x00042a}}, + {0x001c87, {[CaseLower] = 0x001c87,[CaseTitle] = 0x000462,[CaseUpper] = 0x000462}}, + {0x001c88, {[CaseLower] = 0x001c88,[CaseTitle] = 0x00a64a,[CaseUpper] = 0x00a64a}}, + {0x001c90, {[CaseLower] = 0x0010d0,[CaseTitle] = 0x001c90,[CaseUpper] = 0x001c90}}, + {0x001c91, {[CaseLower] = 0x0010d1,[CaseTitle] = 0x001c91,[CaseUpper] = 0x001c91}}, + {0x001c92, {[CaseLower] = 0x0010d2,[CaseTitle] = 0x001c92,[CaseUpper] = 0x001c92}}, + {0x001c93, {[CaseLower] = 0x0010d3,[CaseTitle] = 0x001c93,[CaseUpper] = 0x001c93}}, + {0x001c94, {[CaseLower] = 0x0010d4,[CaseTitle] = 0x001c94,[CaseUpper] = 0x001c94}}, + {0x001c95, {[CaseLower] = 0x0010d5,[CaseTitle] = 0x001c95,[CaseUpper] = 0x001c95}}, + {0x001c96, {[CaseLower] = 0x0010d6,[CaseTitle] = 0x001c96,[CaseUpper] = 0x001c96}}, + {0x001c97, {[CaseLower] = 0x0010d7,[CaseTitle] = 0x001c97,[CaseUpper] = 0x001c97}}, + {0x001c98, {[CaseLower] = 0x0010d8,[CaseTitle] = 0x001c98,[CaseUpper] = 0x001c98}}, + {0x001c99, {[CaseLower] = 0x0010d9,[CaseTitle] = 0x001c99,[CaseUpper] = 0x001c99}}, + {0x001c9a, {[CaseLower] = 0x0010da,[CaseTitle] = 0x001c9a,[CaseUpper] = 0x001c9a}}, + {0x001c9b, {[CaseLower] = 0x0010db,[CaseTitle] = 0x001c9b,[CaseUpper] = 0x001c9b}}, + {0x001c9c, {[CaseLower] = 0x0010dc,[CaseTitle] = 0x001c9c,[CaseUpper] = 0x001c9c}}, + {0x001c9d, {[CaseLower] = 0x0010dd,[CaseTitle] = 0x001c9d,[CaseUpper] = 0x001c9d}}, + {0x001c9e, {[CaseLower] = 0x0010de,[CaseTitle] = 0x001c9e,[CaseUpper] = 0x001c9e}}, + {0x001c9f, {[CaseLower] = 0x0010df,[CaseTitle] = 0x001c9f,[CaseUpper] = 0x001c9f}}, + {0x001ca0, {[CaseLower] = 0x0010e0,[CaseTitle] = 0x001ca0,[CaseUpper] = 0x001ca0}}, + {0x001ca1, {[CaseLower] = 0x0010e1,[CaseTitle] = 0x001ca1,[CaseUpper] = 0x001ca1}}, + {0x001ca2, {[CaseLower] = 0x0010e2,[CaseTitle] = 0x001ca2,[CaseUpper] = 0x001ca2}}, + {0x001ca3, {[CaseLower] = 0x0010e3,[CaseTitle] = 0x001ca3,[CaseUpper] = 0x001ca3}}, + {0x001ca4, {[CaseLower] = 0x0010e4,[CaseTitle] = 0x001ca4,[CaseUpper] = 0x001ca4}}, + {0x001ca5, {[CaseLower] = 0x0010e5,[CaseTitle] = 0x001ca5,[CaseUpper] = 0x001ca5}}, + {0x001ca6, {[CaseLower] = 0x0010e6,[CaseTitle] = 0x001ca6,[CaseUpper] = 0x001ca6}}, + {0x001ca7, {[CaseLower] = 0x0010e7,[CaseTitle] = 0x001ca7,[CaseUpper] = 0x001ca7}}, + {0x001ca8, {[CaseLower] = 0x0010e8,[CaseTitle] = 0x001ca8,[CaseUpper] = 0x001ca8}}, + {0x001ca9, {[CaseLower] = 0x0010e9,[CaseTitle] = 0x001ca9,[CaseUpper] = 0x001ca9}}, + {0x001caa, {[CaseLower] = 0x0010ea,[CaseTitle] = 0x001caa,[CaseUpper] = 0x001caa}}, + {0x001cab, {[CaseLower] = 0x0010eb,[CaseTitle] = 0x001cab,[CaseUpper] = 0x001cab}}, + {0x001cac, {[CaseLower] = 0x0010ec,[CaseTitle] = 0x001cac,[CaseUpper] = 0x001cac}}, + {0x001cad, {[CaseLower] = 0x0010ed,[CaseTitle] = 0x001cad,[CaseUpper] = 0x001cad}}, + {0x001cae, {[CaseLower] = 0x0010ee,[CaseTitle] = 0x001cae,[CaseUpper] = 0x001cae}}, + {0x001caf, {[CaseLower] = 0x0010ef,[CaseTitle] = 0x001caf,[CaseUpper] = 0x001caf}}, + {0x001cb0, {[CaseLower] = 0x0010f0,[CaseTitle] = 0x001cb0,[CaseUpper] = 0x001cb0}}, + {0x001cb1, {[CaseLower] = 0x0010f1,[CaseTitle] = 0x001cb1,[CaseUpper] = 0x001cb1}}, + {0x001cb2, {[CaseLower] = 0x0010f2,[CaseTitle] = 0x001cb2,[CaseUpper] = 0x001cb2}}, + {0x001cb3, {[CaseLower] = 0x0010f3,[CaseTitle] = 0x001cb3,[CaseUpper] = 0x001cb3}}, + {0x001cb4, {[CaseLower] = 0x0010f4,[CaseTitle] = 0x001cb4,[CaseUpper] = 0x001cb4}}, + {0x001cb5, {[CaseLower] = 0x0010f5,[CaseTitle] = 0x001cb5,[CaseUpper] = 0x001cb5}}, + {0x001cb6, {[CaseLower] = 0x0010f6,[CaseTitle] = 0x001cb6,[CaseUpper] = 0x001cb6}}, + {0x001cb7, {[CaseLower] = 0x0010f7,[CaseTitle] = 0x001cb7,[CaseUpper] = 0x001cb7}}, + {0x001cb8, {[CaseLower] = 0x0010f8,[CaseTitle] = 0x001cb8,[CaseUpper] = 0x001cb8}}, + {0x001cb9, {[CaseLower] = 0x0010f9,[CaseTitle] = 0x001cb9,[CaseUpper] = 0x001cb9}}, + {0x001cba, {[CaseLower] = 0x0010fa,[CaseTitle] = 0x001cba,[CaseUpper] = 0x001cba}}, + {0x001cbd, {[CaseLower] = 0x0010fd,[CaseTitle] = 0x001cbd,[CaseUpper] = 0x001cbd}}, + {0x001cbe, {[CaseLower] = 0x0010fe,[CaseTitle] = 0x001cbe,[CaseUpper] = 0x001cbe}}, + {0x001cbf, {[CaseLower] = 0x0010ff,[CaseTitle] = 0x001cbf,[CaseUpper] = 0x001cbf}}, + {0x001d79, {[CaseLower] = 0x001d79,[CaseTitle] = 0x00a77d,[CaseUpper] = 0x00a77d}}, + {0x001d7d, {[CaseLower] = 0x001d7d,[CaseTitle] = 0x002c63,[CaseUpper] = 0x002c63}}, + {0x001d8e, {[CaseLower] = 0x001d8e,[CaseTitle] = 0x00a7c6,[CaseUpper] = 0x00a7c6}}, + {0x001e00, {[CaseLower] = 0x001e01,[CaseTitle] = 0x001e00,[CaseUpper] = 0x001e00}}, + {0x001e01, {[CaseLower] = 0x001e01,[CaseTitle] = 0x001e00,[CaseUpper] = 0x001e00}}, + {0x001e02, {[CaseLower] = 0x001e03,[CaseTitle] = 0x001e02,[CaseUpper] = 0x001e02}}, + {0x001e03, {[CaseLower] = 0x001e03,[CaseTitle] = 0x001e02,[CaseUpper] = 0x001e02}}, + {0x001e04, {[CaseLower] = 0x001e05,[CaseTitle] = 0x001e04,[CaseUpper] = 0x001e04}}, + {0x001e05, {[CaseLower] = 0x001e05,[CaseTitle] = 0x001e04,[CaseUpper] = 0x001e04}}, + {0x001e06, {[CaseLower] = 0x001e07,[CaseTitle] = 0x001e06,[CaseUpper] = 0x001e06}}, + {0x001e07, {[CaseLower] = 0x001e07,[CaseTitle] = 0x001e06,[CaseUpper] = 0x001e06}}, + {0x001e08, {[CaseLower] = 0x001e09,[CaseTitle] = 0x001e08,[CaseUpper] = 0x001e08}}, + {0x001e09, {[CaseLower] = 0x001e09,[CaseTitle] = 0x001e08,[CaseUpper] = 0x001e08}}, + {0x001e0a, {[CaseLower] = 0x001e0b,[CaseTitle] = 0x001e0a,[CaseUpper] = 0x001e0a}}, + {0x001e0b, {[CaseLower] = 0x001e0b,[CaseTitle] = 0x001e0a,[CaseUpper] = 0x001e0a}}, + {0x001e0c, {[CaseLower] = 0x001e0d,[CaseTitle] = 0x001e0c,[CaseUpper] = 0x001e0c}}, + {0x001e0d, {[CaseLower] = 0x001e0d,[CaseTitle] = 0x001e0c,[CaseUpper] = 0x001e0c}}, + {0x001e0e, {[CaseLower] = 0x001e0f,[CaseTitle] = 0x001e0e,[CaseUpper] = 0x001e0e}}, + {0x001e0f, {[CaseLower] = 0x001e0f,[CaseTitle] = 0x001e0e,[CaseUpper] = 0x001e0e}}, + {0x001e10, {[CaseLower] = 0x001e11,[CaseTitle] = 0x001e10,[CaseUpper] = 0x001e10}}, + {0x001e11, {[CaseLower] = 0x001e11,[CaseTitle] = 0x001e10,[CaseUpper] = 0x001e10}}, + {0x001e12, {[CaseLower] = 0x001e13,[CaseTitle] = 0x001e12,[CaseUpper] = 0x001e12}}, + {0x001e13, {[CaseLower] = 0x001e13,[CaseTitle] = 0x001e12,[CaseUpper] = 0x001e12}}, + {0x001e14, {[CaseLower] = 0x001e15,[CaseTitle] = 0x001e14,[CaseUpper] = 0x001e14}}, + {0x001e15, {[CaseLower] = 0x001e15,[CaseTitle] = 0x001e14,[CaseUpper] = 0x001e14}}, + {0x001e16, {[CaseLower] = 0x001e17,[CaseTitle] = 0x001e16,[CaseUpper] = 0x001e16}}, + {0x001e17, {[CaseLower] = 0x001e17,[CaseTitle] = 0x001e16,[CaseUpper] = 0x001e16}}, + {0x001e18, {[CaseLower] = 0x001e19,[CaseTitle] = 0x001e18,[CaseUpper] = 0x001e18}}, + {0x001e19, {[CaseLower] = 0x001e19,[CaseTitle] = 0x001e18,[CaseUpper] = 0x001e18}}, + {0x001e1a, {[CaseLower] = 0x001e1b,[CaseTitle] = 0x001e1a,[CaseUpper] = 0x001e1a}}, + {0x001e1b, {[CaseLower] = 0x001e1b,[CaseTitle] = 0x001e1a,[CaseUpper] = 0x001e1a}}, + {0x001e1c, {[CaseLower] = 0x001e1d,[CaseTitle] = 0x001e1c,[CaseUpper] = 0x001e1c}}, + {0x001e1d, {[CaseLower] = 0x001e1d,[CaseTitle] = 0x001e1c,[CaseUpper] = 0x001e1c}}, + {0x001e1e, {[CaseLower] = 0x001e1f,[CaseTitle] = 0x001e1e,[CaseUpper] = 0x001e1e}}, + {0x001e1f, {[CaseLower] = 0x001e1f,[CaseTitle] = 0x001e1e,[CaseUpper] = 0x001e1e}}, + {0x001e20, {[CaseLower] = 0x001e21,[CaseTitle] = 0x001e20,[CaseUpper] = 0x001e20}}, + {0x001e21, {[CaseLower] = 0x001e21,[CaseTitle] = 0x001e20,[CaseUpper] = 0x001e20}}, + {0x001e22, {[CaseLower] = 0x001e23,[CaseTitle] = 0x001e22,[CaseUpper] = 0x001e22}}, + {0x001e23, {[CaseLower] = 0x001e23,[CaseTitle] = 0x001e22,[CaseUpper] = 0x001e22}}, + {0x001e24, {[CaseLower] = 0x001e25,[CaseTitle] = 0x001e24,[CaseUpper] = 0x001e24}}, + {0x001e25, {[CaseLower] = 0x001e25,[CaseTitle] = 0x001e24,[CaseUpper] = 0x001e24}}, + {0x001e26, {[CaseLower] = 0x001e27,[CaseTitle] = 0x001e26,[CaseUpper] = 0x001e26}}, + {0x001e27, {[CaseLower] = 0x001e27,[CaseTitle] = 0x001e26,[CaseUpper] = 0x001e26}}, + {0x001e28, {[CaseLower] = 0x001e29,[CaseTitle] = 0x001e28,[CaseUpper] = 0x001e28}}, + {0x001e29, {[CaseLower] = 0x001e29,[CaseTitle] = 0x001e28,[CaseUpper] = 0x001e28}}, + {0x001e2a, {[CaseLower] = 0x001e2b,[CaseTitle] = 0x001e2a,[CaseUpper] = 0x001e2a}}, + {0x001e2b, {[CaseLower] = 0x001e2b,[CaseTitle] = 0x001e2a,[CaseUpper] = 0x001e2a}}, + {0x001e2c, {[CaseLower] = 0x001e2d,[CaseTitle] = 0x001e2c,[CaseUpper] = 0x001e2c}}, + {0x001e2d, {[CaseLower] = 0x001e2d,[CaseTitle] = 0x001e2c,[CaseUpper] = 0x001e2c}}, + {0x001e2e, {[CaseLower] = 0x001e2f,[CaseTitle] = 0x001e2e,[CaseUpper] = 0x001e2e}}, + {0x001e2f, {[CaseLower] = 0x001e2f,[CaseTitle] = 0x001e2e,[CaseUpper] = 0x001e2e}}, + {0x001e30, {[CaseLower] = 0x001e31,[CaseTitle] = 0x001e30,[CaseUpper] = 0x001e30}}, + {0x001e31, {[CaseLower] = 0x001e31,[CaseTitle] = 0x001e30,[CaseUpper] = 0x001e30}}, + {0x001e32, {[CaseLower] = 0x001e33,[CaseTitle] = 0x001e32,[CaseUpper] = 0x001e32}}, + {0x001e33, {[CaseLower] = 0x001e33,[CaseTitle] = 0x001e32,[CaseUpper] = 0x001e32}}, + {0x001e34, {[CaseLower] = 0x001e35,[CaseTitle] = 0x001e34,[CaseUpper] = 0x001e34}}, + {0x001e35, {[CaseLower] = 0x001e35,[CaseTitle] = 0x001e34,[CaseUpper] = 0x001e34}}, + {0x001e36, {[CaseLower] = 0x001e37,[CaseTitle] = 0x001e36,[CaseUpper] = 0x001e36}}, + {0x001e37, {[CaseLower] = 0x001e37,[CaseTitle] = 0x001e36,[CaseUpper] = 0x001e36}}, + {0x001e38, {[CaseLower] = 0x001e39,[CaseTitle] = 0x001e38,[CaseUpper] = 0x001e38}}, + {0x001e39, {[CaseLower] = 0x001e39,[CaseTitle] = 0x001e38,[CaseUpper] = 0x001e38}}, + {0x001e3a, {[CaseLower] = 0x001e3b,[CaseTitle] = 0x001e3a,[CaseUpper] = 0x001e3a}}, + {0x001e3b, {[CaseLower] = 0x001e3b,[CaseTitle] = 0x001e3a,[CaseUpper] = 0x001e3a}}, + {0x001e3c, {[CaseLower] = 0x001e3d,[CaseTitle] = 0x001e3c,[CaseUpper] = 0x001e3c}}, + {0x001e3d, {[CaseLower] = 0x001e3d,[CaseTitle] = 0x001e3c,[CaseUpper] = 0x001e3c}}, + {0x001e3e, {[CaseLower] = 0x001e3f,[CaseTitle] = 0x001e3e,[CaseUpper] = 0x001e3e}}, + {0x001e3f, {[CaseLower] = 0x001e3f,[CaseTitle] = 0x001e3e,[CaseUpper] = 0x001e3e}}, + {0x001e40, {[CaseLower] = 0x001e41,[CaseTitle] = 0x001e40,[CaseUpper] = 0x001e40}}, + {0x001e41, {[CaseLower] = 0x001e41,[CaseTitle] = 0x001e40,[CaseUpper] = 0x001e40}}, + {0x001e42, {[CaseLower] = 0x001e43,[CaseTitle] = 0x001e42,[CaseUpper] = 0x001e42}}, + {0x001e43, {[CaseLower] = 0x001e43,[CaseTitle] = 0x001e42,[CaseUpper] = 0x001e42}}, + {0x001e44, {[CaseLower] = 0x001e45,[CaseTitle] = 0x001e44,[CaseUpper] = 0x001e44}}, + {0x001e45, {[CaseLower] = 0x001e45,[CaseTitle] = 0x001e44,[CaseUpper] = 0x001e44}}, + {0x001e46, {[CaseLower] = 0x001e47,[CaseTitle] = 0x001e46,[CaseUpper] = 0x001e46}}, + {0x001e47, {[CaseLower] = 0x001e47,[CaseTitle] = 0x001e46,[CaseUpper] = 0x001e46}}, + {0x001e48, {[CaseLower] = 0x001e49,[CaseTitle] = 0x001e48,[CaseUpper] = 0x001e48}}, + {0x001e49, {[CaseLower] = 0x001e49,[CaseTitle] = 0x001e48,[CaseUpper] = 0x001e48}}, + {0x001e4a, {[CaseLower] = 0x001e4b,[CaseTitle] = 0x001e4a,[CaseUpper] = 0x001e4a}}, + {0x001e4b, {[CaseLower] = 0x001e4b,[CaseTitle] = 0x001e4a,[CaseUpper] = 0x001e4a}}, + {0x001e4c, {[CaseLower] = 0x001e4d,[CaseTitle] = 0x001e4c,[CaseUpper] = 0x001e4c}}, + {0x001e4d, {[CaseLower] = 0x001e4d,[CaseTitle] = 0x001e4c,[CaseUpper] = 0x001e4c}}, + {0x001e4e, {[CaseLower] = 0x001e4f,[CaseTitle] = 0x001e4e,[CaseUpper] = 0x001e4e}}, + {0x001e4f, {[CaseLower] = 0x001e4f,[CaseTitle] = 0x001e4e,[CaseUpper] = 0x001e4e}}, + {0x001e50, {[CaseLower] = 0x001e51,[CaseTitle] = 0x001e50,[CaseUpper] = 0x001e50}}, + {0x001e51, {[CaseLower] = 0x001e51,[CaseTitle] = 0x001e50,[CaseUpper] = 0x001e50}}, + {0x001e52, {[CaseLower] = 0x001e53,[CaseTitle] = 0x001e52,[CaseUpper] = 0x001e52}}, + {0x001e53, {[CaseLower] = 0x001e53,[CaseTitle] = 0x001e52,[CaseUpper] = 0x001e52}}, + {0x001e54, {[CaseLower] = 0x001e55,[CaseTitle] = 0x001e54,[CaseUpper] = 0x001e54}}, + {0x001e55, {[CaseLower] = 0x001e55,[CaseTitle] = 0x001e54,[CaseUpper] = 0x001e54}}, + {0x001e56, {[CaseLower] = 0x001e57,[CaseTitle] = 0x001e56,[CaseUpper] = 0x001e56}}, + {0x001e57, {[CaseLower] = 0x001e57,[CaseTitle] = 0x001e56,[CaseUpper] = 0x001e56}}, + {0x001e58, {[CaseLower] = 0x001e59,[CaseTitle] = 0x001e58,[CaseUpper] = 0x001e58}}, + {0x001e59, {[CaseLower] = 0x001e59,[CaseTitle] = 0x001e58,[CaseUpper] = 0x001e58}}, + {0x001e5a, {[CaseLower] = 0x001e5b,[CaseTitle] = 0x001e5a,[CaseUpper] = 0x001e5a}}, + {0x001e5b, {[CaseLower] = 0x001e5b,[CaseTitle] = 0x001e5a,[CaseUpper] = 0x001e5a}}, + {0x001e5c, {[CaseLower] = 0x001e5d,[CaseTitle] = 0x001e5c,[CaseUpper] = 0x001e5c}}, + {0x001e5d, {[CaseLower] = 0x001e5d,[CaseTitle] = 0x001e5c,[CaseUpper] = 0x001e5c}}, + {0x001e5e, {[CaseLower] = 0x001e5f,[CaseTitle] = 0x001e5e,[CaseUpper] = 0x001e5e}}, + {0x001e5f, {[CaseLower] = 0x001e5f,[CaseTitle] = 0x001e5e,[CaseUpper] = 0x001e5e}}, + {0x001e60, {[CaseLower] = 0x001e61,[CaseTitle] = 0x001e60,[CaseUpper] = 0x001e60}}, + {0x001e61, {[CaseLower] = 0x001e61,[CaseTitle] = 0x001e60,[CaseUpper] = 0x001e60}}, + {0x001e62, {[CaseLower] = 0x001e63,[CaseTitle] = 0x001e62,[CaseUpper] = 0x001e62}}, + {0x001e63, {[CaseLower] = 0x001e63,[CaseTitle] = 0x001e62,[CaseUpper] = 0x001e62}}, + {0x001e64, {[CaseLower] = 0x001e65,[CaseTitle] = 0x001e64,[CaseUpper] = 0x001e64}}, + {0x001e65, {[CaseLower] = 0x001e65,[CaseTitle] = 0x001e64,[CaseUpper] = 0x001e64}}, + {0x001e66, {[CaseLower] = 0x001e67,[CaseTitle] = 0x001e66,[CaseUpper] = 0x001e66}}, + {0x001e67, {[CaseLower] = 0x001e67,[CaseTitle] = 0x001e66,[CaseUpper] = 0x001e66}}, + {0x001e68, {[CaseLower] = 0x001e69,[CaseTitle] = 0x001e68,[CaseUpper] = 0x001e68}}, + {0x001e69, {[CaseLower] = 0x001e69,[CaseTitle] = 0x001e68,[CaseUpper] = 0x001e68}}, + {0x001e6a, {[CaseLower] = 0x001e6b,[CaseTitle] = 0x001e6a,[CaseUpper] = 0x001e6a}}, + {0x001e6b, {[CaseLower] = 0x001e6b,[CaseTitle] = 0x001e6a,[CaseUpper] = 0x001e6a}}, + {0x001e6c, {[CaseLower] = 0x001e6d,[CaseTitle] = 0x001e6c,[CaseUpper] = 0x001e6c}}, + {0x001e6d, {[CaseLower] = 0x001e6d,[CaseTitle] = 0x001e6c,[CaseUpper] = 0x001e6c}}, + {0x001e6e, {[CaseLower] = 0x001e6f,[CaseTitle] = 0x001e6e,[CaseUpper] = 0x001e6e}}, + {0x001e6f, {[CaseLower] = 0x001e6f,[CaseTitle] = 0x001e6e,[CaseUpper] = 0x001e6e}}, + {0x001e70, {[CaseLower] = 0x001e71,[CaseTitle] = 0x001e70,[CaseUpper] = 0x001e70}}, + {0x001e71, {[CaseLower] = 0x001e71,[CaseTitle] = 0x001e70,[CaseUpper] = 0x001e70}}, + {0x001e72, {[CaseLower] = 0x001e73,[CaseTitle] = 0x001e72,[CaseUpper] = 0x001e72}}, + {0x001e73, {[CaseLower] = 0x001e73,[CaseTitle] = 0x001e72,[CaseUpper] = 0x001e72}}, + {0x001e74, {[CaseLower] = 0x001e75,[CaseTitle] = 0x001e74,[CaseUpper] = 0x001e74}}, + {0x001e75, {[CaseLower] = 0x001e75,[CaseTitle] = 0x001e74,[CaseUpper] = 0x001e74}}, + {0x001e76, {[CaseLower] = 0x001e77,[CaseTitle] = 0x001e76,[CaseUpper] = 0x001e76}}, + {0x001e77, {[CaseLower] = 0x001e77,[CaseTitle] = 0x001e76,[CaseUpper] = 0x001e76}}, + {0x001e78, {[CaseLower] = 0x001e79,[CaseTitle] = 0x001e78,[CaseUpper] = 0x001e78}}, + {0x001e79, {[CaseLower] = 0x001e79,[CaseTitle] = 0x001e78,[CaseUpper] = 0x001e78}}, + {0x001e7a, {[CaseLower] = 0x001e7b,[CaseTitle] = 0x001e7a,[CaseUpper] = 0x001e7a}}, + {0x001e7b, {[CaseLower] = 0x001e7b,[CaseTitle] = 0x001e7a,[CaseUpper] = 0x001e7a}}, + {0x001e7c, {[CaseLower] = 0x001e7d,[CaseTitle] = 0x001e7c,[CaseUpper] = 0x001e7c}}, + {0x001e7d, {[CaseLower] = 0x001e7d,[CaseTitle] = 0x001e7c,[CaseUpper] = 0x001e7c}}, + {0x001e7e, {[CaseLower] = 0x001e7f,[CaseTitle] = 0x001e7e,[CaseUpper] = 0x001e7e}}, + {0x001e7f, {[CaseLower] = 0x001e7f,[CaseTitle] = 0x001e7e,[CaseUpper] = 0x001e7e}}, + {0x001e80, {[CaseLower] = 0x001e81,[CaseTitle] = 0x001e80,[CaseUpper] = 0x001e80}}, + {0x001e81, {[CaseLower] = 0x001e81,[CaseTitle] = 0x001e80,[CaseUpper] = 0x001e80}}, + {0x001e82, {[CaseLower] = 0x001e83,[CaseTitle] = 0x001e82,[CaseUpper] = 0x001e82}}, + {0x001e83, {[CaseLower] = 0x001e83,[CaseTitle] = 0x001e82,[CaseUpper] = 0x001e82}}, + {0x001e84, {[CaseLower] = 0x001e85,[CaseTitle] = 0x001e84,[CaseUpper] = 0x001e84}}, + {0x001e85, {[CaseLower] = 0x001e85,[CaseTitle] = 0x001e84,[CaseUpper] = 0x001e84}}, + {0x001e86, {[CaseLower] = 0x001e87,[CaseTitle] = 0x001e86,[CaseUpper] = 0x001e86}}, + {0x001e87, {[CaseLower] = 0x001e87,[CaseTitle] = 0x001e86,[CaseUpper] = 0x001e86}}, + {0x001e88, {[CaseLower] = 0x001e89,[CaseTitle] = 0x001e88,[CaseUpper] = 0x001e88}}, + {0x001e89, {[CaseLower] = 0x001e89,[CaseTitle] = 0x001e88,[CaseUpper] = 0x001e88}}, + {0x001e8a, {[CaseLower] = 0x001e8b,[CaseTitle] = 0x001e8a,[CaseUpper] = 0x001e8a}}, + {0x001e8b, {[CaseLower] = 0x001e8b,[CaseTitle] = 0x001e8a,[CaseUpper] = 0x001e8a}}, + {0x001e8c, {[CaseLower] = 0x001e8d,[CaseTitle] = 0x001e8c,[CaseUpper] = 0x001e8c}}, + {0x001e8d, {[CaseLower] = 0x001e8d,[CaseTitle] = 0x001e8c,[CaseUpper] = 0x001e8c}}, + {0x001e8e, {[CaseLower] = 0x001e8f,[CaseTitle] = 0x001e8e,[CaseUpper] = 0x001e8e}}, + {0x001e8f, {[CaseLower] = 0x001e8f,[CaseTitle] = 0x001e8e,[CaseUpper] = 0x001e8e}}, + {0x001e90, {[CaseLower] = 0x001e91,[CaseTitle] = 0x001e90,[CaseUpper] = 0x001e90}}, + {0x001e91, {[CaseLower] = 0x001e91,[CaseTitle] = 0x001e90,[CaseUpper] = 0x001e90}}, + {0x001e92, {[CaseLower] = 0x001e93,[CaseTitle] = 0x001e92,[CaseUpper] = 0x001e92}}, + {0x001e93, {[CaseLower] = 0x001e93,[CaseTitle] = 0x001e92,[CaseUpper] = 0x001e92}}, + {0x001e94, {[CaseLower] = 0x001e95,[CaseTitle] = 0x001e94,[CaseUpper] = 0x001e94}}, + {0x001e95, {[CaseLower] = 0x001e95,[CaseTitle] = 0x001e94,[CaseUpper] = 0x001e94}}, + {0x001e9b, {[CaseLower] = 0x001e9b,[CaseTitle] = 0x001e60,[CaseUpper] = 0x001e60}}, + {0x001e9e, {[CaseLower] = 0x0000df,[CaseTitle] = 0x001e9e,[CaseUpper] = 0x001e9e}}, + {0x001ea0, {[CaseLower] = 0x001ea1,[CaseTitle] = 0x001ea0,[CaseUpper] = 0x001ea0}}, + {0x001ea1, {[CaseLower] = 0x001ea1,[CaseTitle] = 0x001ea0,[CaseUpper] = 0x001ea0}}, + {0x001ea2, {[CaseLower] = 0x001ea3,[CaseTitle] = 0x001ea2,[CaseUpper] = 0x001ea2}}, + {0x001ea3, {[CaseLower] = 0x001ea3,[CaseTitle] = 0x001ea2,[CaseUpper] = 0x001ea2}}, + {0x001ea4, {[CaseLower] = 0x001ea5,[CaseTitle] = 0x001ea4,[CaseUpper] = 0x001ea4}}, + {0x001ea5, {[CaseLower] = 0x001ea5,[CaseTitle] = 0x001ea4,[CaseUpper] = 0x001ea4}}, + {0x001ea6, {[CaseLower] = 0x001ea7,[CaseTitle] = 0x001ea6,[CaseUpper] = 0x001ea6}}, + {0x001ea7, {[CaseLower] = 0x001ea7,[CaseTitle] = 0x001ea6,[CaseUpper] = 0x001ea6}}, + {0x001ea8, {[CaseLower] = 0x001ea9,[CaseTitle] = 0x001ea8,[CaseUpper] = 0x001ea8}}, + {0x001ea9, {[CaseLower] = 0x001ea9,[CaseTitle] = 0x001ea8,[CaseUpper] = 0x001ea8}}, + {0x001eaa, {[CaseLower] = 0x001eab,[CaseTitle] = 0x001eaa,[CaseUpper] = 0x001eaa}}, + {0x001eab, {[CaseLower] = 0x001eab,[CaseTitle] = 0x001eaa,[CaseUpper] = 0x001eaa}}, + {0x001eac, {[CaseLower] = 0x001ead,[CaseTitle] = 0x001eac,[CaseUpper] = 0x001eac}}, + {0x001ead, {[CaseLower] = 0x001ead,[CaseTitle] = 0x001eac,[CaseUpper] = 0x001eac}}, + {0x001eae, {[CaseLower] = 0x001eaf,[CaseTitle] = 0x001eae,[CaseUpper] = 0x001eae}}, + {0x001eaf, {[CaseLower] = 0x001eaf,[CaseTitle] = 0x001eae,[CaseUpper] = 0x001eae}}, + {0x001eb0, {[CaseLower] = 0x001eb1,[CaseTitle] = 0x001eb0,[CaseUpper] = 0x001eb0}}, + {0x001eb1, {[CaseLower] = 0x001eb1,[CaseTitle] = 0x001eb0,[CaseUpper] = 0x001eb0}}, + {0x001eb2, {[CaseLower] = 0x001eb3,[CaseTitle] = 0x001eb2,[CaseUpper] = 0x001eb2}}, + {0x001eb3, {[CaseLower] = 0x001eb3,[CaseTitle] = 0x001eb2,[CaseUpper] = 0x001eb2}}, + {0x001eb4, {[CaseLower] = 0x001eb5,[CaseTitle] = 0x001eb4,[CaseUpper] = 0x001eb4}}, + {0x001eb5, {[CaseLower] = 0x001eb5,[CaseTitle] = 0x001eb4,[CaseUpper] = 0x001eb4}}, + {0x001eb6, {[CaseLower] = 0x001eb7,[CaseTitle] = 0x001eb6,[CaseUpper] = 0x001eb6}}, + {0x001eb7, {[CaseLower] = 0x001eb7,[CaseTitle] = 0x001eb6,[CaseUpper] = 0x001eb6}}, + {0x001eb8, {[CaseLower] = 0x001eb9,[CaseTitle] = 0x001eb8,[CaseUpper] = 0x001eb8}}, + {0x001eb9, {[CaseLower] = 0x001eb9,[CaseTitle] = 0x001eb8,[CaseUpper] = 0x001eb8}}, + {0x001eba, {[CaseLower] = 0x001ebb,[CaseTitle] = 0x001eba,[CaseUpper] = 0x001eba}}, + {0x001ebb, {[CaseLower] = 0x001ebb,[CaseTitle] = 0x001eba,[CaseUpper] = 0x001eba}}, + {0x001ebc, {[CaseLower] = 0x001ebd,[CaseTitle] = 0x001ebc,[CaseUpper] = 0x001ebc}}, + {0x001ebd, {[CaseLower] = 0x001ebd,[CaseTitle] = 0x001ebc,[CaseUpper] = 0x001ebc}}, + {0x001ebe, {[CaseLower] = 0x001ebf,[CaseTitle] = 0x001ebe,[CaseUpper] = 0x001ebe}}, + {0x001ebf, {[CaseLower] = 0x001ebf,[CaseTitle] = 0x001ebe,[CaseUpper] = 0x001ebe}}, + {0x001ec0, {[CaseLower] = 0x001ec1,[CaseTitle] = 0x001ec0,[CaseUpper] = 0x001ec0}}, + {0x001ec1, {[CaseLower] = 0x001ec1,[CaseTitle] = 0x001ec0,[CaseUpper] = 0x001ec0}}, + {0x001ec2, {[CaseLower] = 0x001ec3,[CaseTitle] = 0x001ec2,[CaseUpper] = 0x001ec2}}, + {0x001ec3, {[CaseLower] = 0x001ec3,[CaseTitle] = 0x001ec2,[CaseUpper] = 0x001ec2}}, + {0x001ec4, {[CaseLower] = 0x001ec5,[CaseTitle] = 0x001ec4,[CaseUpper] = 0x001ec4}}, + {0x001ec5, {[CaseLower] = 0x001ec5,[CaseTitle] = 0x001ec4,[CaseUpper] = 0x001ec4}}, + {0x001ec6, {[CaseLower] = 0x001ec7,[CaseTitle] = 0x001ec6,[CaseUpper] = 0x001ec6}}, + {0x001ec7, {[CaseLower] = 0x001ec7,[CaseTitle] = 0x001ec6,[CaseUpper] = 0x001ec6}}, + {0x001ec8, {[CaseLower] = 0x001ec9,[CaseTitle] = 0x001ec8,[CaseUpper] = 0x001ec8}}, + {0x001ec9, {[CaseLower] = 0x001ec9,[CaseTitle] = 0x001ec8,[CaseUpper] = 0x001ec8}}, + {0x001eca, {[CaseLower] = 0x001ecb,[CaseTitle] = 0x001eca,[CaseUpper] = 0x001eca}}, + {0x001ecb, {[CaseLower] = 0x001ecb,[CaseTitle] = 0x001eca,[CaseUpper] = 0x001eca}}, + {0x001ecc, {[CaseLower] = 0x001ecd,[CaseTitle] = 0x001ecc,[CaseUpper] = 0x001ecc}}, + {0x001ecd, {[CaseLower] = 0x001ecd,[CaseTitle] = 0x001ecc,[CaseUpper] = 0x001ecc}}, + {0x001ece, {[CaseLower] = 0x001ecf,[CaseTitle] = 0x001ece,[CaseUpper] = 0x001ece}}, + {0x001ecf, {[CaseLower] = 0x001ecf,[CaseTitle] = 0x001ece,[CaseUpper] = 0x001ece}}, + {0x001ed0, {[CaseLower] = 0x001ed1,[CaseTitle] = 0x001ed0,[CaseUpper] = 0x001ed0}}, + {0x001ed1, {[CaseLower] = 0x001ed1,[CaseTitle] = 0x001ed0,[CaseUpper] = 0x001ed0}}, + {0x001ed2, {[CaseLower] = 0x001ed3,[CaseTitle] = 0x001ed2,[CaseUpper] = 0x001ed2}}, + {0x001ed3, {[CaseLower] = 0x001ed3,[CaseTitle] = 0x001ed2,[CaseUpper] = 0x001ed2}}, + {0x001ed4, {[CaseLower] = 0x001ed5,[CaseTitle] = 0x001ed4,[CaseUpper] = 0x001ed4}}, + {0x001ed5, {[CaseLower] = 0x001ed5,[CaseTitle] = 0x001ed4,[CaseUpper] = 0x001ed4}}, + {0x001ed6, {[CaseLower] = 0x001ed7,[CaseTitle] = 0x001ed6,[CaseUpper] = 0x001ed6}}, + {0x001ed7, {[CaseLower] = 0x001ed7,[CaseTitle] = 0x001ed6,[CaseUpper] = 0x001ed6}}, + {0x001ed8, {[CaseLower] = 0x001ed9,[CaseTitle] = 0x001ed8,[CaseUpper] = 0x001ed8}}, + {0x001ed9, {[CaseLower] = 0x001ed9,[CaseTitle] = 0x001ed8,[CaseUpper] = 0x001ed8}}, + {0x001eda, {[CaseLower] = 0x001edb,[CaseTitle] = 0x001eda,[CaseUpper] = 0x001eda}}, + {0x001edb, {[CaseLower] = 0x001edb,[CaseTitle] = 0x001eda,[CaseUpper] = 0x001eda}}, + {0x001edc, {[CaseLower] = 0x001edd,[CaseTitle] = 0x001edc,[CaseUpper] = 0x001edc}}, + {0x001edd, {[CaseLower] = 0x001edd,[CaseTitle] = 0x001edc,[CaseUpper] = 0x001edc}}, + {0x001ede, {[CaseLower] = 0x001edf,[CaseTitle] = 0x001ede,[CaseUpper] = 0x001ede}}, + {0x001edf, {[CaseLower] = 0x001edf,[CaseTitle] = 0x001ede,[CaseUpper] = 0x001ede}}, + {0x001ee0, {[CaseLower] = 0x001ee1,[CaseTitle] = 0x001ee0,[CaseUpper] = 0x001ee0}}, + {0x001ee1, {[CaseLower] = 0x001ee1,[CaseTitle] = 0x001ee0,[CaseUpper] = 0x001ee0}}, + {0x001ee2, {[CaseLower] = 0x001ee3,[CaseTitle] = 0x001ee2,[CaseUpper] = 0x001ee2}}, + {0x001ee3, {[CaseLower] = 0x001ee3,[CaseTitle] = 0x001ee2,[CaseUpper] = 0x001ee2}}, + {0x001ee4, {[CaseLower] = 0x001ee5,[CaseTitle] = 0x001ee4,[CaseUpper] = 0x001ee4}}, + {0x001ee5, {[CaseLower] = 0x001ee5,[CaseTitle] = 0x001ee4,[CaseUpper] = 0x001ee4}}, + {0x001ee6, {[CaseLower] = 0x001ee7,[CaseTitle] = 0x001ee6,[CaseUpper] = 0x001ee6}}, + {0x001ee7, {[CaseLower] = 0x001ee7,[CaseTitle] = 0x001ee6,[CaseUpper] = 0x001ee6}}, + {0x001ee8, {[CaseLower] = 0x001ee9,[CaseTitle] = 0x001ee8,[CaseUpper] = 0x001ee8}}, + {0x001ee9, {[CaseLower] = 0x001ee9,[CaseTitle] = 0x001ee8,[CaseUpper] = 0x001ee8}}, + {0x001eea, {[CaseLower] = 0x001eeb,[CaseTitle] = 0x001eea,[CaseUpper] = 0x001eea}}, + {0x001eeb, {[CaseLower] = 0x001eeb,[CaseTitle] = 0x001eea,[CaseUpper] = 0x001eea}}, + {0x001eec, {[CaseLower] = 0x001eed,[CaseTitle] = 0x001eec,[CaseUpper] = 0x001eec}}, + {0x001eed, {[CaseLower] = 0x001eed,[CaseTitle] = 0x001eec,[CaseUpper] = 0x001eec}}, + {0x001eee, {[CaseLower] = 0x001eef,[CaseTitle] = 0x001eee,[CaseUpper] = 0x001eee}}, + {0x001eef, {[CaseLower] = 0x001eef,[CaseTitle] = 0x001eee,[CaseUpper] = 0x001eee}}, + {0x001ef0, {[CaseLower] = 0x001ef1,[CaseTitle] = 0x001ef0,[CaseUpper] = 0x001ef0}}, + {0x001ef1, {[CaseLower] = 0x001ef1,[CaseTitle] = 0x001ef0,[CaseUpper] = 0x001ef0}}, + {0x001ef2, {[CaseLower] = 0x001ef3,[CaseTitle] = 0x001ef2,[CaseUpper] = 0x001ef2}}, + {0x001ef3, {[CaseLower] = 0x001ef3,[CaseTitle] = 0x001ef2,[CaseUpper] = 0x001ef2}}, + {0x001ef4, {[CaseLower] = 0x001ef5,[CaseTitle] = 0x001ef4,[CaseUpper] = 0x001ef4}}, + {0x001ef5, {[CaseLower] = 0x001ef5,[CaseTitle] = 0x001ef4,[CaseUpper] = 0x001ef4}}, + {0x001ef6, {[CaseLower] = 0x001ef7,[CaseTitle] = 0x001ef6,[CaseUpper] = 0x001ef6}}, + {0x001ef7, {[CaseLower] = 0x001ef7,[CaseTitle] = 0x001ef6,[CaseUpper] = 0x001ef6}}, + {0x001ef8, {[CaseLower] = 0x001ef9,[CaseTitle] = 0x001ef8,[CaseUpper] = 0x001ef8}}, + {0x001ef9, {[CaseLower] = 0x001ef9,[CaseTitle] = 0x001ef8,[CaseUpper] = 0x001ef8}}, + {0x001efa, {[CaseLower] = 0x001efb,[CaseTitle] = 0x001efa,[CaseUpper] = 0x001efa}}, + {0x001efb, {[CaseLower] = 0x001efb,[CaseTitle] = 0x001efa,[CaseUpper] = 0x001efa}}, + {0x001efc, {[CaseLower] = 0x001efd,[CaseTitle] = 0x001efc,[CaseUpper] = 0x001efc}}, + {0x001efd, {[CaseLower] = 0x001efd,[CaseTitle] = 0x001efc,[CaseUpper] = 0x001efc}}, + {0x001efe, {[CaseLower] = 0x001eff,[CaseTitle] = 0x001efe,[CaseUpper] = 0x001efe}}, + {0x001eff, {[CaseLower] = 0x001eff,[CaseTitle] = 0x001efe,[CaseUpper] = 0x001efe}}, + {0x001f00, {[CaseLower] = 0x001f00,[CaseTitle] = 0x001f08,[CaseUpper] = 0x001f08}}, + {0x001f01, {[CaseLower] = 0x001f01,[CaseTitle] = 0x001f09,[CaseUpper] = 0x001f09}}, + {0x001f02, {[CaseLower] = 0x001f02,[CaseTitle] = 0x001f0a,[CaseUpper] = 0x001f0a}}, + {0x001f03, {[CaseLower] = 0x001f03,[CaseTitle] = 0x001f0b,[CaseUpper] = 0x001f0b}}, + {0x001f04, {[CaseLower] = 0x001f04,[CaseTitle] = 0x001f0c,[CaseUpper] = 0x001f0c}}, + {0x001f05, {[CaseLower] = 0x001f05,[CaseTitle] = 0x001f0d,[CaseUpper] = 0x001f0d}}, + {0x001f06, {[CaseLower] = 0x001f06,[CaseTitle] = 0x001f0e,[CaseUpper] = 0x001f0e}}, + {0x001f07, {[CaseLower] = 0x001f07,[CaseTitle] = 0x001f0f,[CaseUpper] = 0x001f0f}}, + {0x001f08, {[CaseLower] = 0x001f00,[CaseTitle] = 0x001f08,[CaseUpper] = 0x001f08}}, + {0x001f09, {[CaseLower] = 0x001f01,[CaseTitle] = 0x001f09,[CaseUpper] = 0x001f09}}, + {0x001f0a, {[CaseLower] = 0x001f02,[CaseTitle] = 0x001f0a,[CaseUpper] = 0x001f0a}}, + {0x001f0b, {[CaseLower] = 0x001f03,[CaseTitle] = 0x001f0b,[CaseUpper] = 0x001f0b}}, + {0x001f0c, {[CaseLower] = 0x001f04,[CaseTitle] = 0x001f0c,[CaseUpper] = 0x001f0c}}, + {0x001f0d, {[CaseLower] = 0x001f05,[CaseTitle] = 0x001f0d,[CaseUpper] = 0x001f0d}}, + {0x001f0e, {[CaseLower] = 0x001f06,[CaseTitle] = 0x001f0e,[CaseUpper] = 0x001f0e}}, + {0x001f0f, {[CaseLower] = 0x001f07,[CaseTitle] = 0x001f0f,[CaseUpper] = 0x001f0f}}, + {0x001f10, {[CaseLower] = 0x001f10,[CaseTitle] = 0x001f18,[CaseUpper] = 0x001f18}}, + {0x001f11, {[CaseLower] = 0x001f11,[CaseTitle] = 0x001f19,[CaseUpper] = 0x001f19}}, + {0x001f12, {[CaseLower] = 0x001f12,[CaseTitle] = 0x001f1a,[CaseUpper] = 0x001f1a}}, + {0x001f13, {[CaseLower] = 0x001f13,[CaseTitle] = 0x001f1b,[CaseUpper] = 0x001f1b}}, + {0x001f14, {[CaseLower] = 0x001f14,[CaseTitle] = 0x001f1c,[CaseUpper] = 0x001f1c}}, + {0x001f15, {[CaseLower] = 0x001f15,[CaseTitle] = 0x001f1d,[CaseUpper] = 0x001f1d}}, + {0x001f18, {[CaseLower] = 0x001f10,[CaseTitle] = 0x001f18,[CaseUpper] = 0x001f18}}, + {0x001f19, {[CaseLower] = 0x001f11,[CaseTitle] = 0x001f19,[CaseUpper] = 0x001f19}}, + {0x001f1a, {[CaseLower] = 0x001f12,[CaseTitle] = 0x001f1a,[CaseUpper] = 0x001f1a}}, + {0x001f1b, {[CaseLower] = 0x001f13,[CaseTitle] = 0x001f1b,[CaseUpper] = 0x001f1b}}, + {0x001f1c, {[CaseLower] = 0x001f14,[CaseTitle] = 0x001f1c,[CaseUpper] = 0x001f1c}}, + {0x001f1d, {[CaseLower] = 0x001f15,[CaseTitle] = 0x001f1d,[CaseUpper] = 0x001f1d}}, + {0x001f20, {[CaseLower] = 0x001f20,[CaseTitle] = 0x001f28,[CaseUpper] = 0x001f28}}, + {0x001f21, {[CaseLower] = 0x001f21,[CaseTitle] = 0x001f29,[CaseUpper] = 0x001f29}}, + {0x001f22, {[CaseLower] = 0x001f22,[CaseTitle] = 0x001f2a,[CaseUpper] = 0x001f2a}}, + {0x001f23, {[CaseLower] = 0x001f23,[CaseTitle] = 0x001f2b,[CaseUpper] = 0x001f2b}}, + {0x001f24, {[CaseLower] = 0x001f24,[CaseTitle] = 0x001f2c,[CaseUpper] = 0x001f2c}}, + {0x001f25, {[CaseLower] = 0x001f25,[CaseTitle] = 0x001f2d,[CaseUpper] = 0x001f2d}}, + {0x001f26, {[CaseLower] = 0x001f26,[CaseTitle] = 0x001f2e,[CaseUpper] = 0x001f2e}}, + {0x001f27, {[CaseLower] = 0x001f27,[CaseTitle] = 0x001f2f,[CaseUpper] = 0x001f2f}}, + {0x001f28, {[CaseLower] = 0x001f20,[CaseTitle] = 0x001f28,[CaseUpper] = 0x001f28}}, + {0x001f29, {[CaseLower] = 0x001f21,[CaseTitle] = 0x001f29,[CaseUpper] = 0x001f29}}, + {0x001f2a, {[CaseLower] = 0x001f22,[CaseTitle] = 0x001f2a,[CaseUpper] = 0x001f2a}}, + {0x001f2b, {[CaseLower] = 0x001f23,[CaseTitle] = 0x001f2b,[CaseUpper] = 0x001f2b}}, + {0x001f2c, {[CaseLower] = 0x001f24,[CaseTitle] = 0x001f2c,[CaseUpper] = 0x001f2c}}, + {0x001f2d, {[CaseLower] = 0x001f25,[CaseTitle] = 0x001f2d,[CaseUpper] = 0x001f2d}}, + {0x001f2e, {[CaseLower] = 0x001f26,[CaseTitle] = 0x001f2e,[CaseUpper] = 0x001f2e}}, + {0x001f2f, {[CaseLower] = 0x001f27,[CaseTitle] = 0x001f2f,[CaseUpper] = 0x001f2f}}, + {0x001f30, {[CaseLower] = 0x001f30,[CaseTitle] = 0x001f38,[CaseUpper] = 0x001f38}}, + {0x001f31, {[CaseLower] = 0x001f31,[CaseTitle] = 0x001f39,[CaseUpper] = 0x001f39}}, + {0x001f32, {[CaseLower] = 0x001f32,[CaseTitle] = 0x001f3a,[CaseUpper] = 0x001f3a}}, + {0x001f33, {[CaseLower] = 0x001f33,[CaseTitle] = 0x001f3b,[CaseUpper] = 0x001f3b}}, + {0x001f34, {[CaseLower] = 0x001f34,[CaseTitle] = 0x001f3c,[CaseUpper] = 0x001f3c}}, + {0x001f35, {[CaseLower] = 0x001f35,[CaseTitle] = 0x001f3d,[CaseUpper] = 0x001f3d}}, + {0x001f36, {[CaseLower] = 0x001f36,[CaseTitle] = 0x001f3e,[CaseUpper] = 0x001f3e}}, + {0x001f37, {[CaseLower] = 0x001f37,[CaseTitle] = 0x001f3f,[CaseUpper] = 0x001f3f}}, + {0x001f38, {[CaseLower] = 0x001f30,[CaseTitle] = 0x001f38,[CaseUpper] = 0x001f38}}, + {0x001f39, {[CaseLower] = 0x001f31,[CaseTitle] = 0x001f39,[CaseUpper] = 0x001f39}}, + {0x001f3a, {[CaseLower] = 0x001f32,[CaseTitle] = 0x001f3a,[CaseUpper] = 0x001f3a}}, + {0x001f3b, {[CaseLower] = 0x001f33,[CaseTitle] = 0x001f3b,[CaseUpper] = 0x001f3b}}, + {0x001f3c, {[CaseLower] = 0x001f34,[CaseTitle] = 0x001f3c,[CaseUpper] = 0x001f3c}}, + {0x001f3d, {[CaseLower] = 0x001f35,[CaseTitle] = 0x001f3d,[CaseUpper] = 0x001f3d}}, + {0x001f3e, {[CaseLower] = 0x001f36,[CaseTitle] = 0x001f3e,[CaseUpper] = 0x001f3e}}, + {0x001f3f, {[CaseLower] = 0x001f37,[CaseTitle] = 0x001f3f,[CaseUpper] = 0x001f3f}}, + {0x001f40, {[CaseLower] = 0x001f40,[CaseTitle] = 0x001f48,[CaseUpper] = 0x001f48}}, + {0x001f41, {[CaseLower] = 0x001f41,[CaseTitle] = 0x001f49,[CaseUpper] = 0x001f49}}, + {0x001f42, {[CaseLower] = 0x001f42,[CaseTitle] = 0x001f4a,[CaseUpper] = 0x001f4a}}, + {0x001f43, {[CaseLower] = 0x001f43,[CaseTitle] = 0x001f4b,[CaseUpper] = 0x001f4b}}, + {0x001f44, {[CaseLower] = 0x001f44,[CaseTitle] = 0x001f4c,[CaseUpper] = 0x001f4c}}, + {0x001f45, {[CaseLower] = 0x001f45,[CaseTitle] = 0x001f4d,[CaseUpper] = 0x001f4d}}, + {0x001f48, {[CaseLower] = 0x001f40,[CaseTitle] = 0x001f48,[CaseUpper] = 0x001f48}}, + {0x001f49, {[CaseLower] = 0x001f41,[CaseTitle] = 0x001f49,[CaseUpper] = 0x001f49}}, + {0x001f4a, {[CaseLower] = 0x001f42,[CaseTitle] = 0x001f4a,[CaseUpper] = 0x001f4a}}, + {0x001f4b, {[CaseLower] = 0x001f43,[CaseTitle] = 0x001f4b,[CaseUpper] = 0x001f4b}}, + {0x001f4c, {[CaseLower] = 0x001f44,[CaseTitle] = 0x001f4c,[CaseUpper] = 0x001f4c}}, + {0x001f4d, {[CaseLower] = 0x001f45,[CaseTitle] = 0x001f4d,[CaseUpper] = 0x001f4d}}, + {0x001f51, {[CaseLower] = 0x001f51,[CaseTitle] = 0x001f59,[CaseUpper] = 0x001f59}}, + {0x001f53, {[CaseLower] = 0x001f53,[CaseTitle] = 0x001f5b,[CaseUpper] = 0x001f5b}}, + {0x001f55, {[CaseLower] = 0x001f55,[CaseTitle] = 0x001f5d,[CaseUpper] = 0x001f5d}}, + {0x001f57, {[CaseLower] = 0x001f57,[CaseTitle] = 0x001f5f,[CaseUpper] = 0x001f5f}}, + {0x001f59, {[CaseLower] = 0x001f51,[CaseTitle] = 0x001f59,[CaseUpper] = 0x001f59}}, + {0x001f5b, {[CaseLower] = 0x001f53,[CaseTitle] = 0x001f5b,[CaseUpper] = 0x001f5b}}, + {0x001f5d, {[CaseLower] = 0x001f55,[CaseTitle] = 0x001f5d,[CaseUpper] = 0x001f5d}}, + {0x001f5f, {[CaseLower] = 0x001f57,[CaseTitle] = 0x001f5f,[CaseUpper] = 0x001f5f}}, + {0x001f60, {[CaseLower] = 0x001f60,[CaseTitle] = 0x001f68,[CaseUpper] = 0x001f68}}, + {0x001f61, {[CaseLower] = 0x001f61,[CaseTitle] = 0x001f69,[CaseUpper] = 0x001f69}}, + {0x001f62, {[CaseLower] = 0x001f62,[CaseTitle] = 0x001f6a,[CaseUpper] = 0x001f6a}}, + {0x001f63, {[CaseLower] = 0x001f63,[CaseTitle] = 0x001f6b,[CaseUpper] = 0x001f6b}}, + {0x001f64, {[CaseLower] = 0x001f64,[CaseTitle] = 0x001f6c,[CaseUpper] = 0x001f6c}}, + {0x001f65, {[CaseLower] = 0x001f65,[CaseTitle] = 0x001f6d,[CaseUpper] = 0x001f6d}}, + {0x001f66, {[CaseLower] = 0x001f66,[CaseTitle] = 0x001f6e,[CaseUpper] = 0x001f6e}}, + {0x001f67, {[CaseLower] = 0x001f67,[CaseTitle] = 0x001f6f,[CaseUpper] = 0x001f6f}}, + {0x001f68, {[CaseLower] = 0x001f60,[CaseTitle] = 0x001f68,[CaseUpper] = 0x001f68}}, + {0x001f69, {[CaseLower] = 0x001f61,[CaseTitle] = 0x001f69,[CaseUpper] = 0x001f69}}, + {0x001f6a, {[CaseLower] = 0x001f62,[CaseTitle] = 0x001f6a,[CaseUpper] = 0x001f6a}}, + {0x001f6b, {[CaseLower] = 0x001f63,[CaseTitle] = 0x001f6b,[CaseUpper] = 0x001f6b}}, + {0x001f6c, {[CaseLower] = 0x001f64,[CaseTitle] = 0x001f6c,[CaseUpper] = 0x001f6c}}, + {0x001f6d, {[CaseLower] = 0x001f65,[CaseTitle] = 0x001f6d,[CaseUpper] = 0x001f6d}}, + {0x001f6e, {[CaseLower] = 0x001f66,[CaseTitle] = 0x001f6e,[CaseUpper] = 0x001f6e}}, + {0x001f6f, {[CaseLower] = 0x001f67,[CaseTitle] = 0x001f6f,[CaseUpper] = 0x001f6f}}, + {0x001f70, {[CaseLower] = 0x001f70,[CaseTitle] = 0x001fba,[CaseUpper] = 0x001fba}}, + {0x001f71, {[CaseLower] = 0x001f71,[CaseTitle] = 0x001fbb,[CaseUpper] = 0x001fbb}}, + {0x001f72, {[CaseLower] = 0x001f72,[CaseTitle] = 0x001fc8,[CaseUpper] = 0x001fc8}}, + {0x001f73, {[CaseLower] = 0x001f73,[CaseTitle] = 0x001fc9,[CaseUpper] = 0x001fc9}}, + {0x001f74, {[CaseLower] = 0x001f74,[CaseTitle] = 0x001fca,[CaseUpper] = 0x001fca}}, + {0x001f75, {[CaseLower] = 0x001f75,[CaseTitle] = 0x001fcb,[CaseUpper] = 0x001fcb}}, + {0x001f76, {[CaseLower] = 0x001f76,[CaseTitle] = 0x001fda,[CaseUpper] = 0x001fda}}, + {0x001f77, {[CaseLower] = 0x001f77,[CaseTitle] = 0x001fdb,[CaseUpper] = 0x001fdb}}, + {0x001f78, {[CaseLower] = 0x001f78,[CaseTitle] = 0x001ff8,[CaseUpper] = 0x001ff8}}, + {0x001f79, {[CaseLower] = 0x001f79,[CaseTitle] = 0x001ff9,[CaseUpper] = 0x001ff9}}, + {0x001f7a, {[CaseLower] = 0x001f7a,[CaseTitle] = 0x001fea,[CaseUpper] = 0x001fea}}, + {0x001f7b, {[CaseLower] = 0x001f7b,[CaseTitle] = 0x001feb,[CaseUpper] = 0x001feb}}, + {0x001f7c, {[CaseLower] = 0x001f7c,[CaseTitle] = 0x001ffa,[CaseUpper] = 0x001ffa}}, + {0x001f7d, {[CaseLower] = 0x001f7d,[CaseTitle] = 0x001ffb,[CaseUpper] = 0x001ffb}}, + {0x001f80, {[CaseLower] = 0x001f80,[CaseTitle] = 0x001f88,[CaseUpper] = 0x001f88}}, + {0x001f81, {[CaseLower] = 0x001f81,[CaseTitle] = 0x001f89,[CaseUpper] = 0x001f89}}, + {0x001f82, {[CaseLower] = 0x001f82,[CaseTitle] = 0x001f8a,[CaseUpper] = 0x001f8a}}, + {0x001f83, {[CaseLower] = 0x001f83,[CaseTitle] = 0x001f8b,[CaseUpper] = 0x001f8b}}, + {0x001f84, {[CaseLower] = 0x001f84,[CaseTitle] = 0x001f8c,[CaseUpper] = 0x001f8c}}, + {0x001f85, {[CaseLower] = 0x001f85,[CaseTitle] = 0x001f8d,[CaseUpper] = 0x001f8d}}, + {0x001f86, {[CaseLower] = 0x001f86,[CaseTitle] = 0x001f8e,[CaseUpper] = 0x001f8e}}, + {0x001f87, {[CaseLower] = 0x001f87,[CaseTitle] = 0x001f8f,[CaseUpper] = 0x001f8f}}, + {0x001f88, {[CaseLower] = 0x001f80,[CaseTitle] = 0x001f88,[CaseUpper] = 0x001f88}}, + {0x001f89, {[CaseLower] = 0x001f81,[CaseTitle] = 0x001f89,[CaseUpper] = 0x001f89}}, + {0x001f8a, {[CaseLower] = 0x001f82,[CaseTitle] = 0x001f8a,[CaseUpper] = 0x001f8a}}, + {0x001f8b, {[CaseLower] = 0x001f83,[CaseTitle] = 0x001f8b,[CaseUpper] = 0x001f8b}}, + {0x001f8c, {[CaseLower] = 0x001f84,[CaseTitle] = 0x001f8c,[CaseUpper] = 0x001f8c}}, + {0x001f8d, {[CaseLower] = 0x001f85,[CaseTitle] = 0x001f8d,[CaseUpper] = 0x001f8d}}, + {0x001f8e, {[CaseLower] = 0x001f86,[CaseTitle] = 0x001f8e,[CaseUpper] = 0x001f8e}}, + {0x001f8f, {[CaseLower] = 0x001f87,[CaseTitle] = 0x001f8f,[CaseUpper] = 0x001f8f}}, + {0x001f90, {[CaseLower] = 0x001f90,[CaseTitle] = 0x001f98,[CaseUpper] = 0x001f98}}, + {0x001f91, {[CaseLower] = 0x001f91,[CaseTitle] = 0x001f99,[CaseUpper] = 0x001f99}}, + {0x001f92, {[CaseLower] = 0x001f92,[CaseTitle] = 0x001f9a,[CaseUpper] = 0x001f9a}}, + {0x001f93, {[CaseLower] = 0x001f93,[CaseTitle] = 0x001f9b,[CaseUpper] = 0x001f9b}}, + {0x001f94, {[CaseLower] = 0x001f94,[CaseTitle] = 0x001f9c,[CaseUpper] = 0x001f9c}}, + {0x001f95, {[CaseLower] = 0x001f95,[CaseTitle] = 0x001f9d,[CaseUpper] = 0x001f9d}}, + {0x001f96, {[CaseLower] = 0x001f96,[CaseTitle] = 0x001f9e,[CaseUpper] = 0x001f9e}}, + {0x001f97, {[CaseLower] = 0x001f97,[CaseTitle] = 0x001f9f,[CaseUpper] = 0x001f9f}}, + {0x001f98, {[CaseLower] = 0x001f90,[CaseTitle] = 0x001f98,[CaseUpper] = 0x001f98}}, + {0x001f99, {[CaseLower] = 0x001f91,[CaseTitle] = 0x001f99,[CaseUpper] = 0x001f99}}, + {0x001f9a, {[CaseLower] = 0x001f92,[CaseTitle] = 0x001f9a,[CaseUpper] = 0x001f9a}}, + {0x001f9b, {[CaseLower] = 0x001f93,[CaseTitle] = 0x001f9b,[CaseUpper] = 0x001f9b}}, + {0x001f9c, {[CaseLower] = 0x001f94,[CaseTitle] = 0x001f9c,[CaseUpper] = 0x001f9c}}, + {0x001f9d, {[CaseLower] = 0x001f95,[CaseTitle] = 0x001f9d,[CaseUpper] = 0x001f9d}}, + {0x001f9e, {[CaseLower] = 0x001f96,[CaseTitle] = 0x001f9e,[CaseUpper] = 0x001f9e}}, + {0x001f9f, {[CaseLower] = 0x001f97,[CaseTitle] = 0x001f9f,[CaseUpper] = 0x001f9f}}, + {0x001fa0, {[CaseLower] = 0x001fa0,[CaseTitle] = 0x001fa8,[CaseUpper] = 0x001fa8}}, + {0x001fa1, {[CaseLower] = 0x001fa1,[CaseTitle] = 0x001fa9,[CaseUpper] = 0x001fa9}}, + {0x001fa2, {[CaseLower] = 0x001fa2,[CaseTitle] = 0x001faa,[CaseUpper] = 0x001faa}}, + {0x001fa3, {[CaseLower] = 0x001fa3,[CaseTitle] = 0x001fab,[CaseUpper] = 0x001fab}}, + {0x001fa4, {[CaseLower] = 0x001fa4,[CaseTitle] = 0x001fac,[CaseUpper] = 0x001fac}}, + {0x001fa5, {[CaseLower] = 0x001fa5,[CaseTitle] = 0x001fad,[CaseUpper] = 0x001fad}}, + {0x001fa6, {[CaseLower] = 0x001fa6,[CaseTitle] = 0x001fae,[CaseUpper] = 0x001fae}}, + {0x001fa7, {[CaseLower] = 0x001fa7,[CaseTitle] = 0x001faf,[CaseUpper] = 0x001faf}}, + {0x001fa8, {[CaseLower] = 0x001fa0,[CaseTitle] = 0x001fa8,[CaseUpper] = 0x001fa8}}, + {0x001fa9, {[CaseLower] = 0x001fa1,[CaseTitle] = 0x001fa9,[CaseUpper] = 0x001fa9}}, + {0x001faa, {[CaseLower] = 0x001fa2,[CaseTitle] = 0x001faa,[CaseUpper] = 0x001faa}}, + {0x001fab, {[CaseLower] = 0x001fa3,[CaseTitle] = 0x001fab,[CaseUpper] = 0x001fab}}, + {0x001fac, {[CaseLower] = 0x001fa4,[CaseTitle] = 0x001fac,[CaseUpper] = 0x001fac}}, + {0x001fad, {[CaseLower] = 0x001fa5,[CaseTitle] = 0x001fad,[CaseUpper] = 0x001fad}}, + {0x001fae, {[CaseLower] = 0x001fa6,[CaseTitle] = 0x001fae,[CaseUpper] = 0x001fae}}, + {0x001faf, {[CaseLower] = 0x001fa7,[CaseTitle] = 0x001faf,[CaseUpper] = 0x001faf}}, + {0x001fb0, {[CaseLower] = 0x001fb0,[CaseTitle] = 0x001fb8,[CaseUpper] = 0x001fb8}}, + {0x001fb1, {[CaseLower] = 0x001fb1,[CaseTitle] = 0x001fb9,[CaseUpper] = 0x001fb9}}, + {0x001fb3, {[CaseLower] = 0x001fb3,[CaseTitle] = 0x001fbc,[CaseUpper] = 0x001fbc}}, + {0x001fb8, {[CaseLower] = 0x001fb0,[CaseTitle] = 0x001fb8,[CaseUpper] = 0x001fb8}}, + {0x001fb9, {[CaseLower] = 0x001fb1,[CaseTitle] = 0x001fb9,[CaseUpper] = 0x001fb9}}, + {0x001fba, {[CaseLower] = 0x001f70,[CaseTitle] = 0x001fba,[CaseUpper] = 0x001fba}}, + {0x001fbb, {[CaseLower] = 0x001f71,[CaseTitle] = 0x001fbb,[CaseUpper] = 0x001fbb}}, + {0x001fbc, {[CaseLower] = 0x001fb3,[CaseTitle] = 0x001fbc,[CaseUpper] = 0x001fbc}}, + {0x001fbe, {[CaseLower] = 0x001fbe,[CaseTitle] = 0x000399,[CaseUpper] = 0x000399}}, + {0x001fc3, {[CaseLower] = 0x001fc3,[CaseTitle] = 0x001fcc,[CaseUpper] = 0x001fcc}}, + {0x001fc8, {[CaseLower] = 0x001f72,[CaseTitle] = 0x001fc8,[CaseUpper] = 0x001fc8}}, + {0x001fc9, {[CaseLower] = 0x001f73,[CaseTitle] = 0x001fc9,[CaseUpper] = 0x001fc9}}, + {0x001fca, {[CaseLower] = 0x001f74,[CaseTitle] = 0x001fca,[CaseUpper] = 0x001fca}}, + {0x001fcb, {[CaseLower] = 0x001f75,[CaseTitle] = 0x001fcb,[CaseUpper] = 0x001fcb}}, + {0x001fcc, {[CaseLower] = 0x001fc3,[CaseTitle] = 0x001fcc,[CaseUpper] = 0x001fcc}}, + {0x001fd0, {[CaseLower] = 0x001fd0,[CaseTitle] = 0x001fd8,[CaseUpper] = 0x001fd8}}, + {0x001fd1, {[CaseLower] = 0x001fd1,[CaseTitle] = 0x001fd9,[CaseUpper] = 0x001fd9}}, + {0x001fd8, {[CaseLower] = 0x001fd0,[CaseTitle] = 0x001fd8,[CaseUpper] = 0x001fd8}}, + {0x001fd9, {[CaseLower] = 0x001fd1,[CaseTitle] = 0x001fd9,[CaseUpper] = 0x001fd9}}, + {0x001fda, {[CaseLower] = 0x001f76,[CaseTitle] = 0x001fda,[CaseUpper] = 0x001fda}}, + {0x001fdb, {[CaseLower] = 0x001f77,[CaseTitle] = 0x001fdb,[CaseUpper] = 0x001fdb}}, + {0x001fe0, {[CaseLower] = 0x001fe0,[CaseTitle] = 0x001fe8,[CaseUpper] = 0x001fe8}}, + {0x001fe1, {[CaseLower] = 0x001fe1,[CaseTitle] = 0x001fe9,[CaseUpper] = 0x001fe9}}, + {0x001fe5, {[CaseLower] = 0x001fe5,[CaseTitle] = 0x001fec,[CaseUpper] = 0x001fec}}, + {0x001fe8, {[CaseLower] = 0x001fe0,[CaseTitle] = 0x001fe8,[CaseUpper] = 0x001fe8}}, + {0x001fe9, {[CaseLower] = 0x001fe1,[CaseTitle] = 0x001fe9,[CaseUpper] = 0x001fe9}}, + {0x001fea, {[CaseLower] = 0x001f7a,[CaseTitle] = 0x001fea,[CaseUpper] = 0x001fea}}, + {0x001feb, {[CaseLower] = 0x001f7b,[CaseTitle] = 0x001feb,[CaseUpper] = 0x001feb}}, + {0x001fec, {[CaseLower] = 0x001fe5,[CaseTitle] = 0x001fec,[CaseUpper] = 0x001fec}}, + {0x001ff3, {[CaseLower] = 0x001ff3,[CaseTitle] = 0x001ffc,[CaseUpper] = 0x001ffc}}, + {0x001ff8, {[CaseLower] = 0x001f78,[CaseTitle] = 0x001ff8,[CaseUpper] = 0x001ff8}}, + {0x001ff9, {[CaseLower] = 0x001f79,[CaseTitle] = 0x001ff9,[CaseUpper] = 0x001ff9}}, + {0x001ffa, {[CaseLower] = 0x001f7c,[CaseTitle] = 0x001ffa,[CaseUpper] = 0x001ffa}}, + {0x001ffb, {[CaseLower] = 0x001f7d,[CaseTitle] = 0x001ffb,[CaseUpper] = 0x001ffb}}, + {0x001ffc, {[CaseLower] = 0x001ff3,[CaseTitle] = 0x001ffc,[CaseUpper] = 0x001ffc}}, + {0x002126, {[CaseLower] = 0x0003c9,[CaseTitle] = 0x002126,[CaseUpper] = 0x002126}}, + {0x00212a, {[CaseLower] = 0x00006b,[CaseTitle] = 0x00212a,[CaseUpper] = 0x00212a}}, + {0x00212b, {[CaseLower] = 0x0000e5,[CaseTitle] = 0x00212b,[CaseUpper] = 0x00212b}}, + {0x002132, {[CaseLower] = 0x00214e,[CaseTitle] = 0x002132,[CaseUpper] = 0x002132}}, + {0x00214e, {[CaseLower] = 0x00214e,[CaseTitle] = 0x002132,[CaseUpper] = 0x002132}}, + {0x002160, {[CaseLower] = 0x002170,[CaseTitle] = 0x002160,[CaseUpper] = 0x002160}}, + {0x002161, {[CaseLower] = 0x002171,[CaseTitle] = 0x002161,[CaseUpper] = 0x002161}}, + {0x002162, {[CaseLower] = 0x002172,[CaseTitle] = 0x002162,[CaseUpper] = 0x002162}}, + {0x002163, {[CaseLower] = 0x002173,[CaseTitle] = 0x002163,[CaseUpper] = 0x002163}}, + {0x002164, {[CaseLower] = 0x002174,[CaseTitle] = 0x002164,[CaseUpper] = 0x002164}}, + {0x002165, {[CaseLower] = 0x002175,[CaseTitle] = 0x002165,[CaseUpper] = 0x002165}}, + {0x002166, {[CaseLower] = 0x002176,[CaseTitle] = 0x002166,[CaseUpper] = 0x002166}}, + {0x002167, {[CaseLower] = 0x002177,[CaseTitle] = 0x002167,[CaseUpper] = 0x002167}}, + {0x002168, {[CaseLower] = 0x002178,[CaseTitle] = 0x002168,[CaseUpper] = 0x002168}}, + {0x002169, {[CaseLower] = 0x002179,[CaseTitle] = 0x002169,[CaseUpper] = 0x002169}}, + {0x00216a, {[CaseLower] = 0x00217a,[CaseTitle] = 0x00216a,[CaseUpper] = 0x00216a}}, + {0x00216b, {[CaseLower] = 0x00217b,[CaseTitle] = 0x00216b,[CaseUpper] = 0x00216b}}, + {0x00216c, {[CaseLower] = 0x00217c,[CaseTitle] = 0x00216c,[CaseUpper] = 0x00216c}}, + {0x00216d, {[CaseLower] = 0x00217d,[CaseTitle] = 0x00216d,[CaseUpper] = 0x00216d}}, + {0x00216e, {[CaseLower] = 0x00217e,[CaseTitle] = 0x00216e,[CaseUpper] = 0x00216e}}, + {0x00216f, {[CaseLower] = 0x00217f,[CaseTitle] = 0x00216f,[CaseUpper] = 0x00216f}}, + {0x002170, {[CaseLower] = 0x002170,[CaseTitle] = 0x002160,[CaseUpper] = 0x002160}}, + {0x002171, {[CaseLower] = 0x002171,[CaseTitle] = 0x002161,[CaseUpper] = 0x002161}}, + {0x002172, {[CaseLower] = 0x002172,[CaseTitle] = 0x002162,[CaseUpper] = 0x002162}}, + {0x002173, {[CaseLower] = 0x002173,[CaseTitle] = 0x002163,[CaseUpper] = 0x002163}}, + {0x002174, {[CaseLower] = 0x002174,[CaseTitle] = 0x002164,[CaseUpper] = 0x002164}}, + {0x002175, {[CaseLower] = 0x002175,[CaseTitle] = 0x002165,[CaseUpper] = 0x002165}}, + {0x002176, {[CaseLower] = 0x002176,[CaseTitle] = 0x002166,[CaseUpper] = 0x002166}}, + {0x002177, {[CaseLower] = 0x002177,[CaseTitle] = 0x002167,[CaseUpper] = 0x002167}}, + {0x002178, {[CaseLower] = 0x002178,[CaseTitle] = 0x002168,[CaseUpper] = 0x002168}}, + {0x002179, {[CaseLower] = 0x002179,[CaseTitle] = 0x002169,[CaseUpper] = 0x002169}}, + {0x00217a, {[CaseLower] = 0x00217a,[CaseTitle] = 0x00216a,[CaseUpper] = 0x00216a}}, + {0x00217b, {[CaseLower] = 0x00217b,[CaseTitle] = 0x00216b,[CaseUpper] = 0x00216b}}, + {0x00217c, {[CaseLower] = 0x00217c,[CaseTitle] = 0x00216c,[CaseUpper] = 0x00216c}}, + {0x00217d, {[CaseLower] = 0x00217d,[CaseTitle] = 0x00216d,[CaseUpper] = 0x00216d}}, + {0x00217e, {[CaseLower] = 0x00217e,[CaseTitle] = 0x00216e,[CaseUpper] = 0x00216e}}, + {0x00217f, {[CaseLower] = 0x00217f,[CaseTitle] = 0x00216f,[CaseUpper] = 0x00216f}}, + {0x002183, {[CaseLower] = 0x002184,[CaseTitle] = 0x002183,[CaseUpper] = 0x002183}}, + {0x002184, {[CaseLower] = 0x002184,[CaseTitle] = 0x002183,[CaseUpper] = 0x002183}}, + {0x0024b6, {[CaseLower] = 0x0024d0,[CaseTitle] = 0x0024b6,[CaseUpper] = 0x0024b6}}, + {0x0024b7, {[CaseLower] = 0x0024d1,[CaseTitle] = 0x0024b7,[CaseUpper] = 0x0024b7}}, + {0x0024b8, {[CaseLower] = 0x0024d2,[CaseTitle] = 0x0024b8,[CaseUpper] = 0x0024b8}}, + {0x0024b9, {[CaseLower] = 0x0024d3,[CaseTitle] = 0x0024b9,[CaseUpper] = 0x0024b9}}, + {0x0024ba, {[CaseLower] = 0x0024d4,[CaseTitle] = 0x0024ba,[CaseUpper] = 0x0024ba}}, + {0x0024bb, {[CaseLower] = 0x0024d5,[CaseTitle] = 0x0024bb,[CaseUpper] = 0x0024bb}}, + {0x0024bc, {[CaseLower] = 0x0024d6,[CaseTitle] = 0x0024bc,[CaseUpper] = 0x0024bc}}, + {0x0024bd, {[CaseLower] = 0x0024d7,[CaseTitle] = 0x0024bd,[CaseUpper] = 0x0024bd}}, + {0x0024be, {[CaseLower] = 0x0024d8,[CaseTitle] = 0x0024be,[CaseUpper] = 0x0024be}}, + {0x0024bf, {[CaseLower] = 0x0024d9,[CaseTitle] = 0x0024bf,[CaseUpper] = 0x0024bf}}, + {0x0024c0, {[CaseLower] = 0x0024da,[CaseTitle] = 0x0024c0,[CaseUpper] = 0x0024c0}}, + {0x0024c1, {[CaseLower] = 0x0024db,[CaseTitle] = 0x0024c1,[CaseUpper] = 0x0024c1}}, + {0x0024c2, {[CaseLower] = 0x0024dc,[CaseTitle] = 0x0024c2,[CaseUpper] = 0x0024c2}}, + {0x0024c3, {[CaseLower] = 0x0024dd,[CaseTitle] = 0x0024c3,[CaseUpper] = 0x0024c3}}, + {0x0024c4, {[CaseLower] = 0x0024de,[CaseTitle] = 0x0024c4,[CaseUpper] = 0x0024c4}}, + {0x0024c5, {[CaseLower] = 0x0024df,[CaseTitle] = 0x0024c5,[CaseUpper] = 0x0024c5}}, + {0x0024c6, {[CaseLower] = 0x0024e0,[CaseTitle] = 0x0024c6,[CaseUpper] = 0x0024c6}}, + {0x0024c7, {[CaseLower] = 0x0024e1,[CaseTitle] = 0x0024c7,[CaseUpper] = 0x0024c7}}, + {0x0024c8, {[CaseLower] = 0x0024e2,[CaseTitle] = 0x0024c8,[CaseUpper] = 0x0024c8}}, + {0x0024c9, {[CaseLower] = 0x0024e3,[CaseTitle] = 0x0024c9,[CaseUpper] = 0x0024c9}}, + {0x0024ca, {[CaseLower] = 0x0024e4,[CaseTitle] = 0x0024ca,[CaseUpper] = 0x0024ca}}, + {0x0024cb, {[CaseLower] = 0x0024e5,[CaseTitle] = 0x0024cb,[CaseUpper] = 0x0024cb}}, + {0x0024cc, {[CaseLower] = 0x0024e6,[CaseTitle] = 0x0024cc,[CaseUpper] = 0x0024cc}}, + {0x0024cd, {[CaseLower] = 0x0024e7,[CaseTitle] = 0x0024cd,[CaseUpper] = 0x0024cd}}, + {0x0024ce, {[CaseLower] = 0x0024e8,[CaseTitle] = 0x0024ce,[CaseUpper] = 0x0024ce}}, + {0x0024cf, {[CaseLower] = 0x0024e9,[CaseTitle] = 0x0024cf,[CaseUpper] = 0x0024cf}}, + {0x0024d0, {[CaseLower] = 0x0024d0,[CaseTitle] = 0x0024b6,[CaseUpper] = 0x0024b6}}, + {0x0024d1, {[CaseLower] = 0x0024d1,[CaseTitle] = 0x0024b7,[CaseUpper] = 0x0024b7}}, + {0x0024d2, {[CaseLower] = 0x0024d2,[CaseTitle] = 0x0024b8,[CaseUpper] = 0x0024b8}}, + {0x0024d3, {[CaseLower] = 0x0024d3,[CaseTitle] = 0x0024b9,[CaseUpper] = 0x0024b9}}, + {0x0024d4, {[CaseLower] = 0x0024d4,[CaseTitle] = 0x0024ba,[CaseUpper] = 0x0024ba}}, + {0x0024d5, {[CaseLower] = 0x0024d5,[CaseTitle] = 0x0024bb,[CaseUpper] = 0x0024bb}}, + {0x0024d6, {[CaseLower] = 0x0024d6,[CaseTitle] = 0x0024bc,[CaseUpper] = 0x0024bc}}, + {0x0024d7, {[CaseLower] = 0x0024d7,[CaseTitle] = 0x0024bd,[CaseUpper] = 0x0024bd}}, + {0x0024d8, {[CaseLower] = 0x0024d8,[CaseTitle] = 0x0024be,[CaseUpper] = 0x0024be}}, + {0x0024d9, {[CaseLower] = 0x0024d9,[CaseTitle] = 0x0024bf,[CaseUpper] = 0x0024bf}}, + {0x0024da, {[CaseLower] = 0x0024da,[CaseTitle] = 0x0024c0,[CaseUpper] = 0x0024c0}}, + {0x0024db, {[CaseLower] = 0x0024db,[CaseTitle] = 0x0024c1,[CaseUpper] = 0x0024c1}}, + {0x0024dc, {[CaseLower] = 0x0024dc,[CaseTitle] = 0x0024c2,[CaseUpper] = 0x0024c2}}, + {0x0024dd, {[CaseLower] = 0x0024dd,[CaseTitle] = 0x0024c3,[CaseUpper] = 0x0024c3}}, + {0x0024de, {[CaseLower] = 0x0024de,[CaseTitle] = 0x0024c4,[CaseUpper] = 0x0024c4}}, + {0x0024df, {[CaseLower] = 0x0024df,[CaseTitle] = 0x0024c5,[CaseUpper] = 0x0024c5}}, + {0x0024e0, {[CaseLower] = 0x0024e0,[CaseTitle] = 0x0024c6,[CaseUpper] = 0x0024c6}}, + {0x0024e1, {[CaseLower] = 0x0024e1,[CaseTitle] = 0x0024c7,[CaseUpper] = 0x0024c7}}, + {0x0024e2, {[CaseLower] = 0x0024e2,[CaseTitle] = 0x0024c8,[CaseUpper] = 0x0024c8}}, + {0x0024e3, {[CaseLower] = 0x0024e3,[CaseTitle] = 0x0024c9,[CaseUpper] = 0x0024c9}}, + {0x0024e4, {[CaseLower] = 0x0024e4,[CaseTitle] = 0x0024ca,[CaseUpper] = 0x0024ca}}, + {0x0024e5, {[CaseLower] = 0x0024e5,[CaseTitle] = 0x0024cb,[CaseUpper] = 0x0024cb}}, + {0x0024e6, {[CaseLower] = 0x0024e6,[CaseTitle] = 0x0024cc,[CaseUpper] = 0x0024cc}}, + {0x0024e7, {[CaseLower] = 0x0024e7,[CaseTitle] = 0x0024cd,[CaseUpper] = 0x0024cd}}, + {0x0024e8, {[CaseLower] = 0x0024e8,[CaseTitle] = 0x0024ce,[CaseUpper] = 0x0024ce}}, + {0x0024e9, {[CaseLower] = 0x0024e9,[CaseTitle] = 0x0024cf,[CaseUpper] = 0x0024cf}}, + {0x002c00, {[CaseLower] = 0x002c30,[CaseTitle] = 0x002c00,[CaseUpper] = 0x002c00}}, + {0x002c01, {[CaseLower] = 0x002c31,[CaseTitle] = 0x002c01,[CaseUpper] = 0x002c01}}, + {0x002c02, {[CaseLower] = 0x002c32,[CaseTitle] = 0x002c02,[CaseUpper] = 0x002c02}}, + {0x002c03, {[CaseLower] = 0x002c33,[CaseTitle] = 0x002c03,[CaseUpper] = 0x002c03}}, + {0x002c04, {[CaseLower] = 0x002c34,[CaseTitle] = 0x002c04,[CaseUpper] = 0x002c04}}, + {0x002c05, {[CaseLower] = 0x002c35,[CaseTitle] = 0x002c05,[CaseUpper] = 0x002c05}}, + {0x002c06, {[CaseLower] = 0x002c36,[CaseTitle] = 0x002c06,[CaseUpper] = 0x002c06}}, + {0x002c07, {[CaseLower] = 0x002c37,[CaseTitle] = 0x002c07,[CaseUpper] = 0x002c07}}, + {0x002c08, {[CaseLower] = 0x002c38,[CaseTitle] = 0x002c08,[CaseUpper] = 0x002c08}}, + {0x002c09, {[CaseLower] = 0x002c39,[CaseTitle] = 0x002c09,[CaseUpper] = 0x002c09}}, + {0x002c0a, {[CaseLower] = 0x002c3a,[CaseTitle] = 0x002c0a,[CaseUpper] = 0x002c0a}}, + {0x002c0b, {[CaseLower] = 0x002c3b,[CaseTitle] = 0x002c0b,[CaseUpper] = 0x002c0b}}, + {0x002c0c, {[CaseLower] = 0x002c3c,[CaseTitle] = 0x002c0c,[CaseUpper] = 0x002c0c}}, + {0x002c0d, {[CaseLower] = 0x002c3d,[CaseTitle] = 0x002c0d,[CaseUpper] = 0x002c0d}}, + {0x002c0e, {[CaseLower] = 0x002c3e,[CaseTitle] = 0x002c0e,[CaseUpper] = 0x002c0e}}, + {0x002c0f, {[CaseLower] = 0x002c3f,[CaseTitle] = 0x002c0f,[CaseUpper] = 0x002c0f}}, + {0x002c10, {[CaseLower] = 0x002c40,[CaseTitle] = 0x002c10,[CaseUpper] = 0x002c10}}, + {0x002c11, {[CaseLower] = 0x002c41,[CaseTitle] = 0x002c11,[CaseUpper] = 0x002c11}}, + {0x002c12, {[CaseLower] = 0x002c42,[CaseTitle] = 0x002c12,[CaseUpper] = 0x002c12}}, + {0x002c13, {[CaseLower] = 0x002c43,[CaseTitle] = 0x002c13,[CaseUpper] = 0x002c13}}, + {0x002c14, {[CaseLower] = 0x002c44,[CaseTitle] = 0x002c14,[CaseUpper] = 0x002c14}}, + {0x002c15, {[CaseLower] = 0x002c45,[CaseTitle] = 0x002c15,[CaseUpper] = 0x002c15}}, + {0x002c16, {[CaseLower] = 0x002c46,[CaseTitle] = 0x002c16,[CaseUpper] = 0x002c16}}, + {0x002c17, {[CaseLower] = 0x002c47,[CaseTitle] = 0x002c17,[CaseUpper] = 0x002c17}}, + {0x002c18, {[CaseLower] = 0x002c48,[CaseTitle] = 0x002c18,[CaseUpper] = 0x002c18}}, + {0x002c19, {[CaseLower] = 0x002c49,[CaseTitle] = 0x002c19,[CaseUpper] = 0x002c19}}, + {0x002c1a, {[CaseLower] = 0x002c4a,[CaseTitle] = 0x002c1a,[CaseUpper] = 0x002c1a}}, + {0x002c1b, {[CaseLower] = 0x002c4b,[CaseTitle] = 0x002c1b,[CaseUpper] = 0x002c1b}}, + {0x002c1c, {[CaseLower] = 0x002c4c,[CaseTitle] = 0x002c1c,[CaseUpper] = 0x002c1c}}, + {0x002c1d, {[CaseLower] = 0x002c4d,[CaseTitle] = 0x002c1d,[CaseUpper] = 0x002c1d}}, + {0x002c1e, {[CaseLower] = 0x002c4e,[CaseTitle] = 0x002c1e,[CaseUpper] = 0x002c1e}}, + {0x002c1f, {[CaseLower] = 0x002c4f,[CaseTitle] = 0x002c1f,[CaseUpper] = 0x002c1f}}, + {0x002c20, {[CaseLower] = 0x002c50,[CaseTitle] = 0x002c20,[CaseUpper] = 0x002c20}}, + {0x002c21, {[CaseLower] = 0x002c51,[CaseTitle] = 0x002c21,[CaseUpper] = 0x002c21}}, + {0x002c22, {[CaseLower] = 0x002c52,[CaseTitle] = 0x002c22,[CaseUpper] = 0x002c22}}, + {0x002c23, {[CaseLower] = 0x002c53,[CaseTitle] = 0x002c23,[CaseUpper] = 0x002c23}}, + {0x002c24, {[CaseLower] = 0x002c54,[CaseTitle] = 0x002c24,[CaseUpper] = 0x002c24}}, + {0x002c25, {[CaseLower] = 0x002c55,[CaseTitle] = 0x002c25,[CaseUpper] = 0x002c25}}, + {0x002c26, {[CaseLower] = 0x002c56,[CaseTitle] = 0x002c26,[CaseUpper] = 0x002c26}}, + {0x002c27, {[CaseLower] = 0x002c57,[CaseTitle] = 0x002c27,[CaseUpper] = 0x002c27}}, + {0x002c28, {[CaseLower] = 0x002c58,[CaseTitle] = 0x002c28,[CaseUpper] = 0x002c28}}, + {0x002c29, {[CaseLower] = 0x002c59,[CaseTitle] = 0x002c29,[CaseUpper] = 0x002c29}}, + {0x002c2a, {[CaseLower] = 0x002c5a,[CaseTitle] = 0x002c2a,[CaseUpper] = 0x002c2a}}, + {0x002c2b, {[CaseLower] = 0x002c5b,[CaseTitle] = 0x002c2b,[CaseUpper] = 0x002c2b}}, + {0x002c2c, {[CaseLower] = 0x002c5c,[CaseTitle] = 0x002c2c,[CaseUpper] = 0x002c2c}}, + {0x002c2d, {[CaseLower] = 0x002c5d,[CaseTitle] = 0x002c2d,[CaseUpper] = 0x002c2d}}, + {0x002c2e, {[CaseLower] = 0x002c5e,[CaseTitle] = 0x002c2e,[CaseUpper] = 0x002c2e}}, + {0x002c2f, {[CaseLower] = 0x002c5f,[CaseTitle] = 0x002c2f,[CaseUpper] = 0x002c2f}}, + {0x002c30, {[CaseLower] = 0x002c30,[CaseTitle] = 0x002c00,[CaseUpper] = 0x002c00}}, + {0x002c31, {[CaseLower] = 0x002c31,[CaseTitle] = 0x002c01,[CaseUpper] = 0x002c01}}, + {0x002c32, {[CaseLower] = 0x002c32,[CaseTitle] = 0x002c02,[CaseUpper] = 0x002c02}}, + {0x002c33, {[CaseLower] = 0x002c33,[CaseTitle] = 0x002c03,[CaseUpper] = 0x002c03}}, + {0x002c34, {[CaseLower] = 0x002c34,[CaseTitle] = 0x002c04,[CaseUpper] = 0x002c04}}, + {0x002c35, {[CaseLower] = 0x002c35,[CaseTitle] = 0x002c05,[CaseUpper] = 0x002c05}}, + {0x002c36, {[CaseLower] = 0x002c36,[CaseTitle] = 0x002c06,[CaseUpper] = 0x002c06}}, + {0x002c37, {[CaseLower] = 0x002c37,[CaseTitle] = 0x002c07,[CaseUpper] = 0x002c07}}, + {0x002c38, {[CaseLower] = 0x002c38,[CaseTitle] = 0x002c08,[CaseUpper] = 0x002c08}}, + {0x002c39, {[CaseLower] = 0x002c39,[CaseTitle] = 0x002c09,[CaseUpper] = 0x002c09}}, + {0x002c3a, {[CaseLower] = 0x002c3a,[CaseTitle] = 0x002c0a,[CaseUpper] = 0x002c0a}}, + {0x002c3b, {[CaseLower] = 0x002c3b,[CaseTitle] = 0x002c0b,[CaseUpper] = 0x002c0b}}, + {0x002c3c, {[CaseLower] = 0x002c3c,[CaseTitle] = 0x002c0c,[CaseUpper] = 0x002c0c}}, + {0x002c3d, {[CaseLower] = 0x002c3d,[CaseTitle] = 0x002c0d,[CaseUpper] = 0x002c0d}}, + {0x002c3e, {[CaseLower] = 0x002c3e,[CaseTitle] = 0x002c0e,[CaseUpper] = 0x002c0e}}, + {0x002c3f, {[CaseLower] = 0x002c3f,[CaseTitle] = 0x002c0f,[CaseUpper] = 0x002c0f}}, + {0x002c40, {[CaseLower] = 0x002c40,[CaseTitle] = 0x002c10,[CaseUpper] = 0x002c10}}, + {0x002c41, {[CaseLower] = 0x002c41,[CaseTitle] = 0x002c11,[CaseUpper] = 0x002c11}}, + {0x002c42, {[CaseLower] = 0x002c42,[CaseTitle] = 0x002c12,[CaseUpper] = 0x002c12}}, + {0x002c43, {[CaseLower] = 0x002c43,[CaseTitle] = 0x002c13,[CaseUpper] = 0x002c13}}, + {0x002c44, {[CaseLower] = 0x002c44,[CaseTitle] = 0x002c14,[CaseUpper] = 0x002c14}}, + {0x002c45, {[CaseLower] = 0x002c45,[CaseTitle] = 0x002c15,[CaseUpper] = 0x002c15}}, + {0x002c46, {[CaseLower] = 0x002c46,[CaseTitle] = 0x002c16,[CaseUpper] = 0x002c16}}, + {0x002c47, {[CaseLower] = 0x002c47,[CaseTitle] = 0x002c17,[CaseUpper] = 0x002c17}}, + {0x002c48, {[CaseLower] = 0x002c48,[CaseTitle] = 0x002c18,[CaseUpper] = 0x002c18}}, + {0x002c49, {[CaseLower] = 0x002c49,[CaseTitle] = 0x002c19,[CaseUpper] = 0x002c19}}, + {0x002c4a, {[CaseLower] = 0x002c4a,[CaseTitle] = 0x002c1a,[CaseUpper] = 0x002c1a}}, + {0x002c4b, {[CaseLower] = 0x002c4b,[CaseTitle] = 0x002c1b,[CaseUpper] = 0x002c1b}}, + {0x002c4c, {[CaseLower] = 0x002c4c,[CaseTitle] = 0x002c1c,[CaseUpper] = 0x002c1c}}, + {0x002c4d, {[CaseLower] = 0x002c4d,[CaseTitle] = 0x002c1d,[CaseUpper] = 0x002c1d}}, + {0x002c4e, {[CaseLower] = 0x002c4e,[CaseTitle] = 0x002c1e,[CaseUpper] = 0x002c1e}}, + {0x002c4f, {[CaseLower] = 0x002c4f,[CaseTitle] = 0x002c1f,[CaseUpper] = 0x002c1f}}, + {0x002c50, {[CaseLower] = 0x002c50,[CaseTitle] = 0x002c20,[CaseUpper] = 0x002c20}}, + {0x002c51, {[CaseLower] = 0x002c51,[CaseTitle] = 0x002c21,[CaseUpper] = 0x002c21}}, + {0x002c52, {[CaseLower] = 0x002c52,[CaseTitle] = 0x002c22,[CaseUpper] = 0x002c22}}, + {0x002c53, {[CaseLower] = 0x002c53,[CaseTitle] = 0x002c23,[CaseUpper] = 0x002c23}}, + {0x002c54, {[CaseLower] = 0x002c54,[CaseTitle] = 0x002c24,[CaseUpper] = 0x002c24}}, + {0x002c55, {[CaseLower] = 0x002c55,[CaseTitle] = 0x002c25,[CaseUpper] = 0x002c25}}, + {0x002c56, {[CaseLower] = 0x002c56,[CaseTitle] = 0x002c26,[CaseUpper] = 0x002c26}}, + {0x002c57, {[CaseLower] = 0x002c57,[CaseTitle] = 0x002c27,[CaseUpper] = 0x002c27}}, + {0x002c58, {[CaseLower] = 0x002c58,[CaseTitle] = 0x002c28,[CaseUpper] = 0x002c28}}, + {0x002c59, {[CaseLower] = 0x002c59,[CaseTitle] = 0x002c29,[CaseUpper] = 0x002c29}}, + {0x002c5a, {[CaseLower] = 0x002c5a,[CaseTitle] = 0x002c2a,[CaseUpper] = 0x002c2a}}, + {0x002c5b, {[CaseLower] = 0x002c5b,[CaseTitle] = 0x002c2b,[CaseUpper] = 0x002c2b}}, + {0x002c5c, {[CaseLower] = 0x002c5c,[CaseTitle] = 0x002c2c,[CaseUpper] = 0x002c2c}}, + {0x002c5d, {[CaseLower] = 0x002c5d,[CaseTitle] = 0x002c2d,[CaseUpper] = 0x002c2d}}, + {0x002c5e, {[CaseLower] = 0x002c5e,[CaseTitle] = 0x002c2e,[CaseUpper] = 0x002c2e}}, + {0x002c5f, {[CaseLower] = 0x002c5f,[CaseTitle] = 0x002c2f,[CaseUpper] = 0x002c2f}}, + {0x002c60, {[CaseLower] = 0x002c61,[CaseTitle] = 0x002c60,[CaseUpper] = 0x002c60}}, + {0x002c61, {[CaseLower] = 0x002c61,[CaseTitle] = 0x002c60,[CaseUpper] = 0x002c60}}, + {0x002c62, {[CaseLower] = 0x00026b,[CaseTitle] = 0x002c62,[CaseUpper] = 0x002c62}}, + {0x002c63, {[CaseLower] = 0x001d7d,[CaseTitle] = 0x002c63,[CaseUpper] = 0x002c63}}, + {0x002c64, {[CaseLower] = 0x00027d,[CaseTitle] = 0x002c64,[CaseUpper] = 0x002c64}}, + {0x002c65, {[CaseLower] = 0x002c65,[CaseTitle] = 0x00023a,[CaseUpper] = 0x00023a}}, + {0x002c66, {[CaseLower] = 0x002c66,[CaseTitle] = 0x00023e,[CaseUpper] = 0x00023e}}, + {0x002c67, {[CaseLower] = 0x002c68,[CaseTitle] = 0x002c67,[CaseUpper] = 0x002c67}}, + {0x002c68, {[CaseLower] = 0x002c68,[CaseTitle] = 0x002c67,[CaseUpper] = 0x002c67}}, + {0x002c69, {[CaseLower] = 0x002c6a,[CaseTitle] = 0x002c69,[CaseUpper] = 0x002c69}}, + {0x002c6a, {[CaseLower] = 0x002c6a,[CaseTitle] = 0x002c69,[CaseUpper] = 0x002c69}}, + {0x002c6b, {[CaseLower] = 0x002c6c,[CaseTitle] = 0x002c6b,[CaseUpper] = 0x002c6b}}, + {0x002c6c, {[CaseLower] = 0x002c6c,[CaseTitle] = 0x002c6b,[CaseUpper] = 0x002c6b}}, + {0x002c6d, {[CaseLower] = 0x000251,[CaseTitle] = 0x002c6d,[CaseUpper] = 0x002c6d}}, + {0x002c6e, {[CaseLower] = 0x000271,[CaseTitle] = 0x002c6e,[CaseUpper] = 0x002c6e}}, + {0x002c6f, {[CaseLower] = 0x000250,[CaseTitle] = 0x002c6f,[CaseUpper] = 0x002c6f}}, + {0x002c70, {[CaseLower] = 0x000252,[CaseTitle] = 0x002c70,[CaseUpper] = 0x002c70}}, + {0x002c72, {[CaseLower] = 0x002c73,[CaseTitle] = 0x002c72,[CaseUpper] = 0x002c72}}, + {0x002c73, {[CaseLower] = 0x002c73,[CaseTitle] = 0x002c72,[CaseUpper] = 0x002c72}}, + {0x002c75, {[CaseLower] = 0x002c76,[CaseTitle] = 0x002c75,[CaseUpper] = 0x002c75}}, + {0x002c76, {[CaseLower] = 0x002c76,[CaseTitle] = 0x002c75,[CaseUpper] = 0x002c75}}, + {0x002c7e, {[CaseLower] = 0x00023f,[CaseTitle] = 0x002c7e,[CaseUpper] = 0x002c7e}}, + {0x002c7f, {[CaseLower] = 0x000240,[CaseTitle] = 0x002c7f,[CaseUpper] = 0x002c7f}}, + {0x002c80, {[CaseLower] = 0x002c81,[CaseTitle] = 0x002c80,[CaseUpper] = 0x002c80}}, + {0x002c81, {[CaseLower] = 0x002c81,[CaseTitle] = 0x002c80,[CaseUpper] = 0x002c80}}, + {0x002c82, {[CaseLower] = 0x002c83,[CaseTitle] = 0x002c82,[CaseUpper] = 0x002c82}}, + {0x002c83, {[CaseLower] = 0x002c83,[CaseTitle] = 0x002c82,[CaseUpper] = 0x002c82}}, + {0x002c84, {[CaseLower] = 0x002c85,[CaseTitle] = 0x002c84,[CaseUpper] = 0x002c84}}, + {0x002c85, {[CaseLower] = 0x002c85,[CaseTitle] = 0x002c84,[CaseUpper] = 0x002c84}}, + {0x002c86, {[CaseLower] = 0x002c87,[CaseTitle] = 0x002c86,[CaseUpper] = 0x002c86}}, + {0x002c87, {[CaseLower] = 0x002c87,[CaseTitle] = 0x002c86,[CaseUpper] = 0x002c86}}, + {0x002c88, {[CaseLower] = 0x002c89,[CaseTitle] = 0x002c88,[CaseUpper] = 0x002c88}}, + {0x002c89, {[CaseLower] = 0x002c89,[CaseTitle] = 0x002c88,[CaseUpper] = 0x002c88}}, + {0x002c8a, {[CaseLower] = 0x002c8b,[CaseTitle] = 0x002c8a,[CaseUpper] = 0x002c8a}}, + {0x002c8b, {[CaseLower] = 0x002c8b,[CaseTitle] = 0x002c8a,[CaseUpper] = 0x002c8a}}, + {0x002c8c, {[CaseLower] = 0x002c8d,[CaseTitle] = 0x002c8c,[CaseUpper] = 0x002c8c}}, + {0x002c8d, {[CaseLower] = 0x002c8d,[CaseTitle] = 0x002c8c,[CaseUpper] = 0x002c8c}}, + {0x002c8e, {[CaseLower] = 0x002c8f,[CaseTitle] = 0x002c8e,[CaseUpper] = 0x002c8e}}, + {0x002c8f, {[CaseLower] = 0x002c8f,[CaseTitle] = 0x002c8e,[CaseUpper] = 0x002c8e}}, + {0x002c90, {[CaseLower] = 0x002c91,[CaseTitle] = 0x002c90,[CaseUpper] = 0x002c90}}, + {0x002c91, {[CaseLower] = 0x002c91,[CaseTitle] = 0x002c90,[CaseUpper] = 0x002c90}}, + {0x002c92, {[CaseLower] = 0x002c93,[CaseTitle] = 0x002c92,[CaseUpper] = 0x002c92}}, + {0x002c93, {[CaseLower] = 0x002c93,[CaseTitle] = 0x002c92,[CaseUpper] = 0x002c92}}, + {0x002c94, {[CaseLower] = 0x002c95,[CaseTitle] = 0x002c94,[CaseUpper] = 0x002c94}}, + {0x002c95, {[CaseLower] = 0x002c95,[CaseTitle] = 0x002c94,[CaseUpper] = 0x002c94}}, + {0x002c96, {[CaseLower] = 0x002c97,[CaseTitle] = 0x002c96,[CaseUpper] = 0x002c96}}, + {0x002c97, {[CaseLower] = 0x002c97,[CaseTitle] = 0x002c96,[CaseUpper] = 0x002c96}}, + {0x002c98, {[CaseLower] = 0x002c99,[CaseTitle] = 0x002c98,[CaseUpper] = 0x002c98}}, + {0x002c99, {[CaseLower] = 0x002c99,[CaseTitle] = 0x002c98,[CaseUpper] = 0x002c98}}, + {0x002c9a, {[CaseLower] = 0x002c9b,[CaseTitle] = 0x002c9a,[CaseUpper] = 0x002c9a}}, + {0x002c9b, {[CaseLower] = 0x002c9b,[CaseTitle] = 0x002c9a,[CaseUpper] = 0x002c9a}}, + {0x002c9c, {[CaseLower] = 0x002c9d,[CaseTitle] = 0x002c9c,[CaseUpper] = 0x002c9c}}, + {0x002c9d, {[CaseLower] = 0x002c9d,[CaseTitle] = 0x002c9c,[CaseUpper] = 0x002c9c}}, + {0x002c9e, {[CaseLower] = 0x002c9f,[CaseTitle] = 0x002c9e,[CaseUpper] = 0x002c9e}}, + {0x002c9f, {[CaseLower] = 0x002c9f,[CaseTitle] = 0x002c9e,[CaseUpper] = 0x002c9e}}, + {0x002ca0, {[CaseLower] = 0x002ca1,[CaseTitle] = 0x002ca0,[CaseUpper] = 0x002ca0}}, + {0x002ca1, {[CaseLower] = 0x002ca1,[CaseTitle] = 0x002ca0,[CaseUpper] = 0x002ca0}}, + {0x002ca2, {[CaseLower] = 0x002ca3,[CaseTitle] = 0x002ca2,[CaseUpper] = 0x002ca2}}, + {0x002ca3, {[CaseLower] = 0x002ca3,[CaseTitle] = 0x002ca2,[CaseUpper] = 0x002ca2}}, + {0x002ca4, {[CaseLower] = 0x002ca5,[CaseTitle] = 0x002ca4,[CaseUpper] = 0x002ca4}}, + {0x002ca5, {[CaseLower] = 0x002ca5,[CaseTitle] = 0x002ca4,[CaseUpper] = 0x002ca4}}, + {0x002ca6, {[CaseLower] = 0x002ca7,[CaseTitle] = 0x002ca6,[CaseUpper] = 0x002ca6}}, + {0x002ca7, {[CaseLower] = 0x002ca7,[CaseTitle] = 0x002ca6,[CaseUpper] = 0x002ca6}}, + {0x002ca8, {[CaseLower] = 0x002ca9,[CaseTitle] = 0x002ca8,[CaseUpper] = 0x002ca8}}, + {0x002ca9, {[CaseLower] = 0x002ca9,[CaseTitle] = 0x002ca8,[CaseUpper] = 0x002ca8}}, + {0x002caa, {[CaseLower] = 0x002cab,[CaseTitle] = 0x002caa,[CaseUpper] = 0x002caa}}, + {0x002cab, {[CaseLower] = 0x002cab,[CaseTitle] = 0x002caa,[CaseUpper] = 0x002caa}}, + {0x002cac, {[CaseLower] = 0x002cad,[CaseTitle] = 0x002cac,[CaseUpper] = 0x002cac}}, + {0x002cad, {[CaseLower] = 0x002cad,[CaseTitle] = 0x002cac,[CaseUpper] = 0x002cac}}, + {0x002cae, {[CaseLower] = 0x002caf,[CaseTitle] = 0x002cae,[CaseUpper] = 0x002cae}}, + {0x002caf, {[CaseLower] = 0x002caf,[CaseTitle] = 0x002cae,[CaseUpper] = 0x002cae}}, + {0x002cb0, {[CaseLower] = 0x002cb1,[CaseTitle] = 0x002cb0,[CaseUpper] = 0x002cb0}}, + {0x002cb1, {[CaseLower] = 0x002cb1,[CaseTitle] = 0x002cb0,[CaseUpper] = 0x002cb0}}, + {0x002cb2, {[CaseLower] = 0x002cb3,[CaseTitle] = 0x002cb2,[CaseUpper] = 0x002cb2}}, + {0x002cb3, {[CaseLower] = 0x002cb3,[CaseTitle] = 0x002cb2,[CaseUpper] = 0x002cb2}}, + {0x002cb4, {[CaseLower] = 0x002cb5,[CaseTitle] = 0x002cb4,[CaseUpper] = 0x002cb4}}, + {0x002cb5, {[CaseLower] = 0x002cb5,[CaseTitle] = 0x002cb4,[CaseUpper] = 0x002cb4}}, + {0x002cb6, {[CaseLower] = 0x002cb7,[CaseTitle] = 0x002cb6,[CaseUpper] = 0x002cb6}}, + {0x002cb7, {[CaseLower] = 0x002cb7,[CaseTitle] = 0x002cb6,[CaseUpper] = 0x002cb6}}, + {0x002cb8, {[CaseLower] = 0x002cb9,[CaseTitle] = 0x002cb8,[CaseUpper] = 0x002cb8}}, + {0x002cb9, {[CaseLower] = 0x002cb9,[CaseTitle] = 0x002cb8,[CaseUpper] = 0x002cb8}}, + {0x002cba, {[CaseLower] = 0x002cbb,[CaseTitle] = 0x002cba,[CaseUpper] = 0x002cba}}, + {0x002cbb, {[CaseLower] = 0x002cbb,[CaseTitle] = 0x002cba,[CaseUpper] = 0x002cba}}, + {0x002cbc, {[CaseLower] = 0x002cbd,[CaseTitle] = 0x002cbc,[CaseUpper] = 0x002cbc}}, + {0x002cbd, {[CaseLower] = 0x002cbd,[CaseTitle] = 0x002cbc,[CaseUpper] = 0x002cbc}}, + {0x002cbe, {[CaseLower] = 0x002cbf,[CaseTitle] = 0x002cbe,[CaseUpper] = 0x002cbe}}, + {0x002cbf, {[CaseLower] = 0x002cbf,[CaseTitle] = 0x002cbe,[CaseUpper] = 0x002cbe}}, + {0x002cc0, {[CaseLower] = 0x002cc1,[CaseTitle] = 0x002cc0,[CaseUpper] = 0x002cc0}}, + {0x002cc1, {[CaseLower] = 0x002cc1,[CaseTitle] = 0x002cc0,[CaseUpper] = 0x002cc0}}, + {0x002cc2, {[CaseLower] = 0x002cc3,[CaseTitle] = 0x002cc2,[CaseUpper] = 0x002cc2}}, + {0x002cc3, {[CaseLower] = 0x002cc3,[CaseTitle] = 0x002cc2,[CaseUpper] = 0x002cc2}}, + {0x002cc4, {[CaseLower] = 0x002cc5,[CaseTitle] = 0x002cc4,[CaseUpper] = 0x002cc4}}, + {0x002cc5, {[CaseLower] = 0x002cc5,[CaseTitle] = 0x002cc4,[CaseUpper] = 0x002cc4}}, + {0x002cc6, {[CaseLower] = 0x002cc7,[CaseTitle] = 0x002cc6,[CaseUpper] = 0x002cc6}}, + {0x002cc7, {[CaseLower] = 0x002cc7,[CaseTitle] = 0x002cc6,[CaseUpper] = 0x002cc6}}, + {0x002cc8, {[CaseLower] = 0x002cc9,[CaseTitle] = 0x002cc8,[CaseUpper] = 0x002cc8}}, + {0x002cc9, {[CaseLower] = 0x002cc9,[CaseTitle] = 0x002cc8,[CaseUpper] = 0x002cc8}}, + {0x002cca, {[CaseLower] = 0x002ccb,[CaseTitle] = 0x002cca,[CaseUpper] = 0x002cca}}, + {0x002ccb, {[CaseLower] = 0x002ccb,[CaseTitle] = 0x002cca,[CaseUpper] = 0x002cca}}, + {0x002ccc, {[CaseLower] = 0x002ccd,[CaseTitle] = 0x002ccc,[CaseUpper] = 0x002ccc}}, + {0x002ccd, {[CaseLower] = 0x002ccd,[CaseTitle] = 0x002ccc,[CaseUpper] = 0x002ccc}}, + {0x002cce, {[CaseLower] = 0x002ccf,[CaseTitle] = 0x002cce,[CaseUpper] = 0x002cce}}, + {0x002ccf, {[CaseLower] = 0x002ccf,[CaseTitle] = 0x002cce,[CaseUpper] = 0x002cce}}, + {0x002cd0, {[CaseLower] = 0x002cd1,[CaseTitle] = 0x002cd0,[CaseUpper] = 0x002cd0}}, + {0x002cd1, {[CaseLower] = 0x002cd1,[CaseTitle] = 0x002cd0,[CaseUpper] = 0x002cd0}}, + {0x002cd2, {[CaseLower] = 0x002cd3,[CaseTitle] = 0x002cd2,[CaseUpper] = 0x002cd2}}, + {0x002cd3, {[CaseLower] = 0x002cd3,[CaseTitle] = 0x002cd2,[CaseUpper] = 0x002cd2}}, + {0x002cd4, {[CaseLower] = 0x002cd5,[CaseTitle] = 0x002cd4,[CaseUpper] = 0x002cd4}}, + {0x002cd5, {[CaseLower] = 0x002cd5,[CaseTitle] = 0x002cd4,[CaseUpper] = 0x002cd4}}, + {0x002cd6, {[CaseLower] = 0x002cd7,[CaseTitle] = 0x002cd6,[CaseUpper] = 0x002cd6}}, + {0x002cd7, {[CaseLower] = 0x002cd7,[CaseTitle] = 0x002cd6,[CaseUpper] = 0x002cd6}}, + {0x002cd8, {[CaseLower] = 0x002cd9,[CaseTitle] = 0x002cd8,[CaseUpper] = 0x002cd8}}, + {0x002cd9, {[CaseLower] = 0x002cd9,[CaseTitle] = 0x002cd8,[CaseUpper] = 0x002cd8}}, + {0x002cda, {[CaseLower] = 0x002cdb,[CaseTitle] = 0x002cda,[CaseUpper] = 0x002cda}}, + {0x002cdb, {[CaseLower] = 0x002cdb,[CaseTitle] = 0x002cda,[CaseUpper] = 0x002cda}}, + {0x002cdc, {[CaseLower] = 0x002cdd,[CaseTitle] = 0x002cdc,[CaseUpper] = 0x002cdc}}, + {0x002cdd, {[CaseLower] = 0x002cdd,[CaseTitle] = 0x002cdc,[CaseUpper] = 0x002cdc}}, + {0x002cde, {[CaseLower] = 0x002cdf,[CaseTitle] = 0x002cde,[CaseUpper] = 0x002cde}}, + {0x002cdf, {[CaseLower] = 0x002cdf,[CaseTitle] = 0x002cde,[CaseUpper] = 0x002cde}}, + {0x002ce0, {[CaseLower] = 0x002ce1,[CaseTitle] = 0x002ce0,[CaseUpper] = 0x002ce0}}, + {0x002ce1, {[CaseLower] = 0x002ce1,[CaseTitle] = 0x002ce0,[CaseUpper] = 0x002ce0}}, + {0x002ce2, {[CaseLower] = 0x002ce3,[CaseTitle] = 0x002ce2,[CaseUpper] = 0x002ce2}}, + {0x002ce3, {[CaseLower] = 0x002ce3,[CaseTitle] = 0x002ce2,[CaseUpper] = 0x002ce2}}, + {0x002ceb, {[CaseLower] = 0x002cec,[CaseTitle] = 0x002ceb,[CaseUpper] = 0x002ceb}}, + {0x002cec, {[CaseLower] = 0x002cec,[CaseTitle] = 0x002ceb,[CaseUpper] = 0x002ceb}}, + {0x002ced, {[CaseLower] = 0x002cee,[CaseTitle] = 0x002ced,[CaseUpper] = 0x002ced}}, + {0x002cee, {[CaseLower] = 0x002cee,[CaseTitle] = 0x002ced,[CaseUpper] = 0x002ced}}, + {0x002cf2, {[CaseLower] = 0x002cf3,[CaseTitle] = 0x002cf2,[CaseUpper] = 0x002cf2}}, + {0x002cf3, {[CaseLower] = 0x002cf3,[CaseTitle] = 0x002cf2,[CaseUpper] = 0x002cf2}}, + {0x002d00, {[CaseLower] = 0x002d00,[CaseTitle] = 0x0010a0,[CaseUpper] = 0x0010a0}}, + {0x002d01, {[CaseLower] = 0x002d01,[CaseTitle] = 0x0010a1,[CaseUpper] = 0x0010a1}}, + {0x002d02, {[CaseLower] = 0x002d02,[CaseTitle] = 0x0010a2,[CaseUpper] = 0x0010a2}}, + {0x002d03, {[CaseLower] = 0x002d03,[CaseTitle] = 0x0010a3,[CaseUpper] = 0x0010a3}}, + {0x002d04, {[CaseLower] = 0x002d04,[CaseTitle] = 0x0010a4,[CaseUpper] = 0x0010a4}}, + {0x002d05, {[CaseLower] = 0x002d05,[CaseTitle] = 0x0010a5,[CaseUpper] = 0x0010a5}}, + {0x002d06, {[CaseLower] = 0x002d06,[CaseTitle] = 0x0010a6,[CaseUpper] = 0x0010a6}}, + {0x002d07, {[CaseLower] = 0x002d07,[CaseTitle] = 0x0010a7,[CaseUpper] = 0x0010a7}}, + {0x002d08, {[CaseLower] = 0x002d08,[CaseTitle] = 0x0010a8,[CaseUpper] = 0x0010a8}}, + {0x002d09, {[CaseLower] = 0x002d09,[CaseTitle] = 0x0010a9,[CaseUpper] = 0x0010a9}}, + {0x002d0a, {[CaseLower] = 0x002d0a,[CaseTitle] = 0x0010aa,[CaseUpper] = 0x0010aa}}, + {0x002d0b, {[CaseLower] = 0x002d0b,[CaseTitle] = 0x0010ab,[CaseUpper] = 0x0010ab}}, + {0x002d0c, {[CaseLower] = 0x002d0c,[CaseTitle] = 0x0010ac,[CaseUpper] = 0x0010ac}}, + {0x002d0d, {[CaseLower] = 0x002d0d,[CaseTitle] = 0x0010ad,[CaseUpper] = 0x0010ad}}, + {0x002d0e, {[CaseLower] = 0x002d0e,[CaseTitle] = 0x0010ae,[CaseUpper] = 0x0010ae}}, + {0x002d0f, {[CaseLower] = 0x002d0f,[CaseTitle] = 0x0010af,[CaseUpper] = 0x0010af}}, + {0x002d10, {[CaseLower] = 0x002d10,[CaseTitle] = 0x0010b0,[CaseUpper] = 0x0010b0}}, + {0x002d11, {[CaseLower] = 0x002d11,[CaseTitle] = 0x0010b1,[CaseUpper] = 0x0010b1}}, + {0x002d12, {[CaseLower] = 0x002d12,[CaseTitle] = 0x0010b2,[CaseUpper] = 0x0010b2}}, + {0x002d13, {[CaseLower] = 0x002d13,[CaseTitle] = 0x0010b3,[CaseUpper] = 0x0010b3}}, + {0x002d14, {[CaseLower] = 0x002d14,[CaseTitle] = 0x0010b4,[CaseUpper] = 0x0010b4}}, + {0x002d15, {[CaseLower] = 0x002d15,[CaseTitle] = 0x0010b5,[CaseUpper] = 0x0010b5}}, + {0x002d16, {[CaseLower] = 0x002d16,[CaseTitle] = 0x0010b6,[CaseUpper] = 0x0010b6}}, + {0x002d17, {[CaseLower] = 0x002d17,[CaseTitle] = 0x0010b7,[CaseUpper] = 0x0010b7}}, + {0x002d18, {[CaseLower] = 0x002d18,[CaseTitle] = 0x0010b8,[CaseUpper] = 0x0010b8}}, + {0x002d19, {[CaseLower] = 0x002d19,[CaseTitle] = 0x0010b9,[CaseUpper] = 0x0010b9}}, + {0x002d1a, {[CaseLower] = 0x002d1a,[CaseTitle] = 0x0010ba,[CaseUpper] = 0x0010ba}}, + {0x002d1b, {[CaseLower] = 0x002d1b,[CaseTitle] = 0x0010bb,[CaseUpper] = 0x0010bb}}, + {0x002d1c, {[CaseLower] = 0x002d1c,[CaseTitle] = 0x0010bc,[CaseUpper] = 0x0010bc}}, + {0x002d1d, {[CaseLower] = 0x002d1d,[CaseTitle] = 0x0010bd,[CaseUpper] = 0x0010bd}}, + {0x002d1e, {[CaseLower] = 0x002d1e,[CaseTitle] = 0x0010be,[CaseUpper] = 0x0010be}}, + {0x002d1f, {[CaseLower] = 0x002d1f,[CaseTitle] = 0x0010bf,[CaseUpper] = 0x0010bf}}, + {0x002d20, {[CaseLower] = 0x002d20,[CaseTitle] = 0x0010c0,[CaseUpper] = 0x0010c0}}, + {0x002d21, {[CaseLower] = 0x002d21,[CaseTitle] = 0x0010c1,[CaseUpper] = 0x0010c1}}, + {0x002d22, {[CaseLower] = 0x002d22,[CaseTitle] = 0x0010c2,[CaseUpper] = 0x0010c2}}, + {0x002d23, {[CaseLower] = 0x002d23,[CaseTitle] = 0x0010c3,[CaseUpper] = 0x0010c3}}, + {0x002d24, {[CaseLower] = 0x002d24,[CaseTitle] = 0x0010c4,[CaseUpper] = 0x0010c4}}, + {0x002d25, {[CaseLower] = 0x002d25,[CaseTitle] = 0x0010c5,[CaseUpper] = 0x0010c5}}, + {0x002d27, {[CaseLower] = 0x002d27,[CaseTitle] = 0x0010c7,[CaseUpper] = 0x0010c7}}, + {0x002d2d, {[CaseLower] = 0x002d2d,[CaseTitle] = 0x0010cd,[CaseUpper] = 0x0010cd}}, + {0x00a640, {[CaseLower] = 0x00a641,[CaseTitle] = 0x00a640,[CaseUpper] = 0x00a640}}, + {0x00a641, {[CaseLower] = 0x00a641,[CaseTitle] = 0x00a640,[CaseUpper] = 0x00a640}}, + {0x00a642, {[CaseLower] = 0x00a643,[CaseTitle] = 0x00a642,[CaseUpper] = 0x00a642}}, + {0x00a643, {[CaseLower] = 0x00a643,[CaseTitle] = 0x00a642,[CaseUpper] = 0x00a642}}, + {0x00a644, {[CaseLower] = 0x00a645,[CaseTitle] = 0x00a644,[CaseUpper] = 0x00a644}}, + {0x00a645, {[CaseLower] = 0x00a645,[CaseTitle] = 0x00a644,[CaseUpper] = 0x00a644}}, + {0x00a646, {[CaseLower] = 0x00a647,[CaseTitle] = 0x00a646,[CaseUpper] = 0x00a646}}, + {0x00a647, {[CaseLower] = 0x00a647,[CaseTitle] = 0x00a646,[CaseUpper] = 0x00a646}}, + {0x00a648, {[CaseLower] = 0x00a649,[CaseTitle] = 0x00a648,[CaseUpper] = 0x00a648}}, + {0x00a649, {[CaseLower] = 0x00a649,[CaseTitle] = 0x00a648,[CaseUpper] = 0x00a648}}, + {0x00a64a, {[CaseLower] = 0x00a64b,[CaseTitle] = 0x00a64a,[CaseUpper] = 0x00a64a}}, + {0x00a64b, {[CaseLower] = 0x00a64b,[CaseTitle] = 0x00a64a,[CaseUpper] = 0x00a64a}}, + {0x00a64c, {[CaseLower] = 0x00a64d,[CaseTitle] = 0x00a64c,[CaseUpper] = 0x00a64c}}, + {0x00a64d, {[CaseLower] = 0x00a64d,[CaseTitle] = 0x00a64c,[CaseUpper] = 0x00a64c}}, + {0x00a64e, {[CaseLower] = 0x00a64f,[CaseTitle] = 0x00a64e,[CaseUpper] = 0x00a64e}}, + {0x00a64f, {[CaseLower] = 0x00a64f,[CaseTitle] = 0x00a64e,[CaseUpper] = 0x00a64e}}, + {0x00a650, {[CaseLower] = 0x00a651,[CaseTitle] = 0x00a650,[CaseUpper] = 0x00a650}}, + {0x00a651, {[CaseLower] = 0x00a651,[CaseTitle] = 0x00a650,[CaseUpper] = 0x00a650}}, + {0x00a652, {[CaseLower] = 0x00a653,[CaseTitle] = 0x00a652,[CaseUpper] = 0x00a652}}, + {0x00a653, {[CaseLower] = 0x00a653,[CaseTitle] = 0x00a652,[CaseUpper] = 0x00a652}}, + {0x00a654, {[CaseLower] = 0x00a655,[CaseTitle] = 0x00a654,[CaseUpper] = 0x00a654}}, + {0x00a655, {[CaseLower] = 0x00a655,[CaseTitle] = 0x00a654,[CaseUpper] = 0x00a654}}, + {0x00a656, {[CaseLower] = 0x00a657,[CaseTitle] = 0x00a656,[CaseUpper] = 0x00a656}}, + {0x00a657, {[CaseLower] = 0x00a657,[CaseTitle] = 0x00a656,[CaseUpper] = 0x00a656}}, + {0x00a658, {[CaseLower] = 0x00a659,[CaseTitle] = 0x00a658,[CaseUpper] = 0x00a658}}, + {0x00a659, {[CaseLower] = 0x00a659,[CaseTitle] = 0x00a658,[CaseUpper] = 0x00a658}}, + {0x00a65a, {[CaseLower] = 0x00a65b,[CaseTitle] = 0x00a65a,[CaseUpper] = 0x00a65a}}, + {0x00a65b, {[CaseLower] = 0x00a65b,[CaseTitle] = 0x00a65a,[CaseUpper] = 0x00a65a}}, + {0x00a65c, {[CaseLower] = 0x00a65d,[CaseTitle] = 0x00a65c,[CaseUpper] = 0x00a65c}}, + {0x00a65d, {[CaseLower] = 0x00a65d,[CaseTitle] = 0x00a65c,[CaseUpper] = 0x00a65c}}, + {0x00a65e, {[CaseLower] = 0x00a65f,[CaseTitle] = 0x00a65e,[CaseUpper] = 0x00a65e}}, + {0x00a65f, {[CaseLower] = 0x00a65f,[CaseTitle] = 0x00a65e,[CaseUpper] = 0x00a65e}}, + {0x00a660, {[CaseLower] = 0x00a661,[CaseTitle] = 0x00a660,[CaseUpper] = 0x00a660}}, + {0x00a661, {[CaseLower] = 0x00a661,[CaseTitle] = 0x00a660,[CaseUpper] = 0x00a660}}, + {0x00a662, {[CaseLower] = 0x00a663,[CaseTitle] = 0x00a662,[CaseUpper] = 0x00a662}}, + {0x00a663, {[CaseLower] = 0x00a663,[CaseTitle] = 0x00a662,[CaseUpper] = 0x00a662}}, + {0x00a664, {[CaseLower] = 0x00a665,[CaseTitle] = 0x00a664,[CaseUpper] = 0x00a664}}, + {0x00a665, {[CaseLower] = 0x00a665,[CaseTitle] = 0x00a664,[CaseUpper] = 0x00a664}}, + {0x00a666, {[CaseLower] = 0x00a667,[CaseTitle] = 0x00a666,[CaseUpper] = 0x00a666}}, + {0x00a667, {[CaseLower] = 0x00a667,[CaseTitle] = 0x00a666,[CaseUpper] = 0x00a666}}, + {0x00a668, {[CaseLower] = 0x00a669,[CaseTitle] = 0x00a668,[CaseUpper] = 0x00a668}}, + {0x00a669, {[CaseLower] = 0x00a669,[CaseTitle] = 0x00a668,[CaseUpper] = 0x00a668}}, + {0x00a66a, {[CaseLower] = 0x00a66b,[CaseTitle] = 0x00a66a,[CaseUpper] = 0x00a66a}}, + {0x00a66b, {[CaseLower] = 0x00a66b,[CaseTitle] = 0x00a66a,[CaseUpper] = 0x00a66a}}, + {0x00a66c, {[CaseLower] = 0x00a66d,[CaseTitle] = 0x00a66c,[CaseUpper] = 0x00a66c}}, + {0x00a66d, {[CaseLower] = 0x00a66d,[CaseTitle] = 0x00a66c,[CaseUpper] = 0x00a66c}}, + {0x00a680, {[CaseLower] = 0x00a681,[CaseTitle] = 0x00a680,[CaseUpper] = 0x00a680}}, + {0x00a681, {[CaseLower] = 0x00a681,[CaseTitle] = 0x00a680,[CaseUpper] = 0x00a680}}, + {0x00a682, {[CaseLower] = 0x00a683,[CaseTitle] = 0x00a682,[CaseUpper] = 0x00a682}}, + {0x00a683, {[CaseLower] = 0x00a683,[CaseTitle] = 0x00a682,[CaseUpper] = 0x00a682}}, + {0x00a684, {[CaseLower] = 0x00a685,[CaseTitle] = 0x00a684,[CaseUpper] = 0x00a684}}, + {0x00a685, {[CaseLower] = 0x00a685,[CaseTitle] = 0x00a684,[CaseUpper] = 0x00a684}}, + {0x00a686, {[CaseLower] = 0x00a687,[CaseTitle] = 0x00a686,[CaseUpper] = 0x00a686}}, + {0x00a687, {[CaseLower] = 0x00a687,[CaseTitle] = 0x00a686,[CaseUpper] = 0x00a686}}, + {0x00a688, {[CaseLower] = 0x00a689,[CaseTitle] = 0x00a688,[CaseUpper] = 0x00a688}}, + {0x00a689, {[CaseLower] = 0x00a689,[CaseTitle] = 0x00a688,[CaseUpper] = 0x00a688}}, + {0x00a68a, {[CaseLower] = 0x00a68b,[CaseTitle] = 0x00a68a,[CaseUpper] = 0x00a68a}}, + {0x00a68b, {[CaseLower] = 0x00a68b,[CaseTitle] = 0x00a68a,[CaseUpper] = 0x00a68a}}, + {0x00a68c, {[CaseLower] = 0x00a68d,[CaseTitle] = 0x00a68c,[CaseUpper] = 0x00a68c}}, + {0x00a68d, {[CaseLower] = 0x00a68d,[CaseTitle] = 0x00a68c,[CaseUpper] = 0x00a68c}}, + {0x00a68e, {[CaseLower] = 0x00a68f,[CaseTitle] = 0x00a68e,[CaseUpper] = 0x00a68e}}, + {0x00a68f, {[CaseLower] = 0x00a68f,[CaseTitle] = 0x00a68e,[CaseUpper] = 0x00a68e}}, + {0x00a690, {[CaseLower] = 0x00a691,[CaseTitle] = 0x00a690,[CaseUpper] = 0x00a690}}, + {0x00a691, {[CaseLower] = 0x00a691,[CaseTitle] = 0x00a690,[CaseUpper] = 0x00a690}}, + {0x00a692, {[CaseLower] = 0x00a693,[CaseTitle] = 0x00a692,[CaseUpper] = 0x00a692}}, + {0x00a693, {[CaseLower] = 0x00a693,[CaseTitle] = 0x00a692,[CaseUpper] = 0x00a692}}, + {0x00a694, {[CaseLower] = 0x00a695,[CaseTitle] = 0x00a694,[CaseUpper] = 0x00a694}}, + {0x00a695, {[CaseLower] = 0x00a695,[CaseTitle] = 0x00a694,[CaseUpper] = 0x00a694}}, + {0x00a696, {[CaseLower] = 0x00a697,[CaseTitle] = 0x00a696,[CaseUpper] = 0x00a696}}, + {0x00a697, {[CaseLower] = 0x00a697,[CaseTitle] = 0x00a696,[CaseUpper] = 0x00a696}}, + {0x00a698, {[CaseLower] = 0x00a699,[CaseTitle] = 0x00a698,[CaseUpper] = 0x00a698}}, + {0x00a699, {[CaseLower] = 0x00a699,[CaseTitle] = 0x00a698,[CaseUpper] = 0x00a698}}, + {0x00a69a, {[CaseLower] = 0x00a69b,[CaseTitle] = 0x00a69a,[CaseUpper] = 0x00a69a}}, + {0x00a69b, {[CaseLower] = 0x00a69b,[CaseTitle] = 0x00a69a,[CaseUpper] = 0x00a69a}}, + {0x00a722, {[CaseLower] = 0x00a723,[CaseTitle] = 0x00a722,[CaseUpper] = 0x00a722}}, + {0x00a723, {[CaseLower] = 0x00a723,[CaseTitle] = 0x00a722,[CaseUpper] = 0x00a722}}, + {0x00a724, {[CaseLower] = 0x00a725,[CaseTitle] = 0x00a724,[CaseUpper] = 0x00a724}}, + {0x00a725, {[CaseLower] = 0x00a725,[CaseTitle] = 0x00a724,[CaseUpper] = 0x00a724}}, + {0x00a726, {[CaseLower] = 0x00a727,[CaseTitle] = 0x00a726,[CaseUpper] = 0x00a726}}, + {0x00a727, {[CaseLower] = 0x00a727,[CaseTitle] = 0x00a726,[CaseUpper] = 0x00a726}}, + {0x00a728, {[CaseLower] = 0x00a729,[CaseTitle] = 0x00a728,[CaseUpper] = 0x00a728}}, + {0x00a729, {[CaseLower] = 0x00a729,[CaseTitle] = 0x00a728,[CaseUpper] = 0x00a728}}, + {0x00a72a, {[CaseLower] = 0x00a72b,[CaseTitle] = 0x00a72a,[CaseUpper] = 0x00a72a}}, + {0x00a72b, {[CaseLower] = 0x00a72b,[CaseTitle] = 0x00a72a,[CaseUpper] = 0x00a72a}}, + {0x00a72c, {[CaseLower] = 0x00a72d,[CaseTitle] = 0x00a72c,[CaseUpper] = 0x00a72c}}, + {0x00a72d, {[CaseLower] = 0x00a72d,[CaseTitle] = 0x00a72c,[CaseUpper] = 0x00a72c}}, + {0x00a72e, {[CaseLower] = 0x00a72f,[CaseTitle] = 0x00a72e,[CaseUpper] = 0x00a72e}}, + {0x00a72f, {[CaseLower] = 0x00a72f,[CaseTitle] = 0x00a72e,[CaseUpper] = 0x00a72e}}, + {0x00a732, {[CaseLower] = 0x00a733,[CaseTitle] = 0x00a732,[CaseUpper] = 0x00a732}}, + {0x00a733, {[CaseLower] = 0x00a733,[CaseTitle] = 0x00a732,[CaseUpper] = 0x00a732}}, + {0x00a734, {[CaseLower] = 0x00a735,[CaseTitle] = 0x00a734,[CaseUpper] = 0x00a734}}, + {0x00a735, {[CaseLower] = 0x00a735,[CaseTitle] = 0x00a734,[CaseUpper] = 0x00a734}}, + {0x00a736, {[CaseLower] = 0x00a737,[CaseTitle] = 0x00a736,[CaseUpper] = 0x00a736}}, + {0x00a737, {[CaseLower] = 0x00a737,[CaseTitle] = 0x00a736,[CaseUpper] = 0x00a736}}, + {0x00a738, {[CaseLower] = 0x00a739,[CaseTitle] = 0x00a738,[CaseUpper] = 0x00a738}}, + {0x00a739, {[CaseLower] = 0x00a739,[CaseTitle] = 0x00a738,[CaseUpper] = 0x00a738}}, + {0x00a73a, {[CaseLower] = 0x00a73b,[CaseTitle] = 0x00a73a,[CaseUpper] = 0x00a73a}}, + {0x00a73b, {[CaseLower] = 0x00a73b,[CaseTitle] = 0x00a73a,[CaseUpper] = 0x00a73a}}, + {0x00a73c, {[CaseLower] = 0x00a73d,[CaseTitle] = 0x00a73c,[CaseUpper] = 0x00a73c}}, + {0x00a73d, {[CaseLower] = 0x00a73d,[CaseTitle] = 0x00a73c,[CaseUpper] = 0x00a73c}}, + {0x00a73e, {[CaseLower] = 0x00a73f,[CaseTitle] = 0x00a73e,[CaseUpper] = 0x00a73e}}, + {0x00a73f, {[CaseLower] = 0x00a73f,[CaseTitle] = 0x00a73e,[CaseUpper] = 0x00a73e}}, + {0x00a740, {[CaseLower] = 0x00a741,[CaseTitle] = 0x00a740,[CaseUpper] = 0x00a740}}, + {0x00a741, {[CaseLower] = 0x00a741,[CaseTitle] = 0x00a740,[CaseUpper] = 0x00a740}}, + {0x00a742, {[CaseLower] = 0x00a743,[CaseTitle] = 0x00a742,[CaseUpper] = 0x00a742}}, + {0x00a743, {[CaseLower] = 0x00a743,[CaseTitle] = 0x00a742,[CaseUpper] = 0x00a742}}, + {0x00a744, {[CaseLower] = 0x00a745,[CaseTitle] = 0x00a744,[CaseUpper] = 0x00a744}}, + {0x00a745, {[CaseLower] = 0x00a745,[CaseTitle] = 0x00a744,[CaseUpper] = 0x00a744}}, + {0x00a746, {[CaseLower] = 0x00a747,[CaseTitle] = 0x00a746,[CaseUpper] = 0x00a746}}, + {0x00a747, {[CaseLower] = 0x00a747,[CaseTitle] = 0x00a746,[CaseUpper] = 0x00a746}}, + {0x00a748, {[CaseLower] = 0x00a749,[CaseTitle] = 0x00a748,[CaseUpper] = 0x00a748}}, + {0x00a749, {[CaseLower] = 0x00a749,[CaseTitle] = 0x00a748,[CaseUpper] = 0x00a748}}, + {0x00a74a, {[CaseLower] = 0x00a74b,[CaseTitle] = 0x00a74a,[CaseUpper] = 0x00a74a}}, + {0x00a74b, {[CaseLower] = 0x00a74b,[CaseTitle] = 0x00a74a,[CaseUpper] = 0x00a74a}}, + {0x00a74c, {[CaseLower] = 0x00a74d,[CaseTitle] = 0x00a74c,[CaseUpper] = 0x00a74c}}, + {0x00a74d, {[CaseLower] = 0x00a74d,[CaseTitle] = 0x00a74c,[CaseUpper] = 0x00a74c}}, + {0x00a74e, {[CaseLower] = 0x00a74f,[CaseTitle] = 0x00a74e,[CaseUpper] = 0x00a74e}}, + {0x00a74f, {[CaseLower] = 0x00a74f,[CaseTitle] = 0x00a74e,[CaseUpper] = 0x00a74e}}, + {0x00a750, {[CaseLower] = 0x00a751,[CaseTitle] = 0x00a750,[CaseUpper] = 0x00a750}}, + {0x00a751, {[CaseLower] = 0x00a751,[CaseTitle] = 0x00a750,[CaseUpper] = 0x00a750}}, + {0x00a752, {[CaseLower] = 0x00a753,[CaseTitle] = 0x00a752,[CaseUpper] = 0x00a752}}, + {0x00a753, {[CaseLower] = 0x00a753,[CaseTitle] = 0x00a752,[CaseUpper] = 0x00a752}}, + {0x00a754, {[CaseLower] = 0x00a755,[CaseTitle] = 0x00a754,[CaseUpper] = 0x00a754}}, + {0x00a755, {[CaseLower] = 0x00a755,[CaseTitle] = 0x00a754,[CaseUpper] = 0x00a754}}, + {0x00a756, {[CaseLower] = 0x00a757,[CaseTitle] = 0x00a756,[CaseUpper] = 0x00a756}}, + {0x00a757, {[CaseLower] = 0x00a757,[CaseTitle] = 0x00a756,[CaseUpper] = 0x00a756}}, + {0x00a758, {[CaseLower] = 0x00a759,[CaseTitle] = 0x00a758,[CaseUpper] = 0x00a758}}, + {0x00a759, {[CaseLower] = 0x00a759,[CaseTitle] = 0x00a758,[CaseUpper] = 0x00a758}}, + {0x00a75a, {[CaseLower] = 0x00a75b,[CaseTitle] = 0x00a75a,[CaseUpper] = 0x00a75a}}, + {0x00a75b, {[CaseLower] = 0x00a75b,[CaseTitle] = 0x00a75a,[CaseUpper] = 0x00a75a}}, + {0x00a75c, {[CaseLower] = 0x00a75d,[CaseTitle] = 0x00a75c,[CaseUpper] = 0x00a75c}}, + {0x00a75d, {[CaseLower] = 0x00a75d,[CaseTitle] = 0x00a75c,[CaseUpper] = 0x00a75c}}, + {0x00a75e, {[CaseLower] = 0x00a75f,[CaseTitle] = 0x00a75e,[CaseUpper] = 0x00a75e}}, + {0x00a75f, {[CaseLower] = 0x00a75f,[CaseTitle] = 0x00a75e,[CaseUpper] = 0x00a75e}}, + {0x00a760, {[CaseLower] = 0x00a761,[CaseTitle] = 0x00a760,[CaseUpper] = 0x00a760}}, + {0x00a761, {[CaseLower] = 0x00a761,[CaseTitle] = 0x00a760,[CaseUpper] = 0x00a760}}, + {0x00a762, {[CaseLower] = 0x00a763,[CaseTitle] = 0x00a762,[CaseUpper] = 0x00a762}}, + {0x00a763, {[CaseLower] = 0x00a763,[CaseTitle] = 0x00a762,[CaseUpper] = 0x00a762}}, + {0x00a764, {[CaseLower] = 0x00a765,[CaseTitle] = 0x00a764,[CaseUpper] = 0x00a764}}, + {0x00a765, {[CaseLower] = 0x00a765,[CaseTitle] = 0x00a764,[CaseUpper] = 0x00a764}}, + {0x00a766, {[CaseLower] = 0x00a767,[CaseTitle] = 0x00a766,[CaseUpper] = 0x00a766}}, + {0x00a767, {[CaseLower] = 0x00a767,[CaseTitle] = 0x00a766,[CaseUpper] = 0x00a766}}, + {0x00a768, {[CaseLower] = 0x00a769,[CaseTitle] = 0x00a768,[CaseUpper] = 0x00a768}}, + {0x00a769, {[CaseLower] = 0x00a769,[CaseTitle] = 0x00a768,[CaseUpper] = 0x00a768}}, + {0x00a76a, {[CaseLower] = 0x00a76b,[CaseTitle] = 0x00a76a,[CaseUpper] = 0x00a76a}}, + {0x00a76b, {[CaseLower] = 0x00a76b,[CaseTitle] = 0x00a76a,[CaseUpper] = 0x00a76a}}, + {0x00a76c, {[CaseLower] = 0x00a76d,[CaseTitle] = 0x00a76c,[CaseUpper] = 0x00a76c}}, + {0x00a76d, {[CaseLower] = 0x00a76d,[CaseTitle] = 0x00a76c,[CaseUpper] = 0x00a76c}}, + {0x00a76e, {[CaseLower] = 0x00a76f,[CaseTitle] = 0x00a76e,[CaseUpper] = 0x00a76e}}, + {0x00a76f, {[CaseLower] = 0x00a76f,[CaseTitle] = 0x00a76e,[CaseUpper] = 0x00a76e}}, + {0x00a779, {[CaseLower] = 0x00a77a,[CaseTitle] = 0x00a779,[CaseUpper] = 0x00a779}}, + {0x00a77a, {[CaseLower] = 0x00a77a,[CaseTitle] = 0x00a779,[CaseUpper] = 0x00a779}}, + {0x00a77b, {[CaseLower] = 0x00a77c,[CaseTitle] = 0x00a77b,[CaseUpper] = 0x00a77b}}, + {0x00a77c, {[CaseLower] = 0x00a77c,[CaseTitle] = 0x00a77b,[CaseUpper] = 0x00a77b}}, + {0x00a77d, {[CaseLower] = 0x001d79,[CaseTitle] = 0x00a77d,[CaseUpper] = 0x00a77d}}, + {0x00a77e, {[CaseLower] = 0x00a77f,[CaseTitle] = 0x00a77e,[CaseUpper] = 0x00a77e}}, + {0x00a77f, {[CaseLower] = 0x00a77f,[CaseTitle] = 0x00a77e,[CaseUpper] = 0x00a77e}}, + {0x00a780, {[CaseLower] = 0x00a781,[CaseTitle] = 0x00a780,[CaseUpper] = 0x00a780}}, + {0x00a781, {[CaseLower] = 0x00a781,[CaseTitle] = 0x00a780,[CaseUpper] = 0x00a780}}, + {0x00a782, {[CaseLower] = 0x00a783,[CaseTitle] = 0x00a782,[CaseUpper] = 0x00a782}}, + {0x00a783, {[CaseLower] = 0x00a783,[CaseTitle] = 0x00a782,[CaseUpper] = 0x00a782}}, + {0x00a784, {[CaseLower] = 0x00a785,[CaseTitle] = 0x00a784,[CaseUpper] = 0x00a784}}, + {0x00a785, {[CaseLower] = 0x00a785,[CaseTitle] = 0x00a784,[CaseUpper] = 0x00a784}}, + {0x00a786, {[CaseLower] = 0x00a787,[CaseTitle] = 0x00a786,[CaseUpper] = 0x00a786}}, + {0x00a787, {[CaseLower] = 0x00a787,[CaseTitle] = 0x00a786,[CaseUpper] = 0x00a786}}, + {0x00a78b, {[CaseLower] = 0x00a78c,[CaseTitle] = 0x00a78b,[CaseUpper] = 0x00a78b}}, + {0x00a78c, {[CaseLower] = 0x00a78c,[CaseTitle] = 0x00a78b,[CaseUpper] = 0x00a78b}}, + {0x00a78d, {[CaseLower] = 0x000265,[CaseTitle] = 0x00a78d,[CaseUpper] = 0x00a78d}}, + {0x00a790, {[CaseLower] = 0x00a791,[CaseTitle] = 0x00a790,[CaseUpper] = 0x00a790}}, + {0x00a791, {[CaseLower] = 0x00a791,[CaseTitle] = 0x00a790,[CaseUpper] = 0x00a790}}, + {0x00a792, {[CaseLower] = 0x00a793,[CaseTitle] = 0x00a792,[CaseUpper] = 0x00a792}}, + {0x00a793, {[CaseLower] = 0x00a793,[CaseTitle] = 0x00a792,[CaseUpper] = 0x00a792}}, + {0x00a794, {[CaseLower] = 0x00a794,[CaseTitle] = 0x00a7c4,[CaseUpper] = 0x00a7c4}}, + {0x00a796, {[CaseLower] = 0x00a797,[CaseTitle] = 0x00a796,[CaseUpper] = 0x00a796}}, + {0x00a797, {[CaseLower] = 0x00a797,[CaseTitle] = 0x00a796,[CaseUpper] = 0x00a796}}, + {0x00a798, {[CaseLower] = 0x00a799,[CaseTitle] = 0x00a798,[CaseUpper] = 0x00a798}}, + {0x00a799, {[CaseLower] = 0x00a799,[CaseTitle] = 0x00a798,[CaseUpper] = 0x00a798}}, + {0x00a79a, {[CaseLower] = 0x00a79b,[CaseTitle] = 0x00a79a,[CaseUpper] = 0x00a79a}}, + {0x00a79b, {[CaseLower] = 0x00a79b,[CaseTitle] = 0x00a79a,[CaseUpper] = 0x00a79a}}, + {0x00a79c, {[CaseLower] = 0x00a79d,[CaseTitle] = 0x00a79c,[CaseUpper] = 0x00a79c}}, + {0x00a79d, {[CaseLower] = 0x00a79d,[CaseTitle] = 0x00a79c,[CaseUpper] = 0x00a79c}}, + {0x00a79e, {[CaseLower] = 0x00a79f,[CaseTitle] = 0x00a79e,[CaseUpper] = 0x00a79e}}, + {0x00a79f, {[CaseLower] = 0x00a79f,[CaseTitle] = 0x00a79e,[CaseUpper] = 0x00a79e}}, + {0x00a7a0, {[CaseLower] = 0x00a7a1,[CaseTitle] = 0x00a7a0,[CaseUpper] = 0x00a7a0}}, + {0x00a7a1, {[CaseLower] = 0x00a7a1,[CaseTitle] = 0x00a7a0,[CaseUpper] = 0x00a7a0}}, + {0x00a7a2, {[CaseLower] = 0x00a7a3,[CaseTitle] = 0x00a7a2,[CaseUpper] = 0x00a7a2}}, + {0x00a7a3, {[CaseLower] = 0x00a7a3,[CaseTitle] = 0x00a7a2,[CaseUpper] = 0x00a7a2}}, + {0x00a7a4, {[CaseLower] = 0x00a7a5,[CaseTitle] = 0x00a7a4,[CaseUpper] = 0x00a7a4}}, + {0x00a7a5, {[CaseLower] = 0x00a7a5,[CaseTitle] = 0x00a7a4,[CaseUpper] = 0x00a7a4}}, + {0x00a7a6, {[CaseLower] = 0x00a7a7,[CaseTitle] = 0x00a7a6,[CaseUpper] = 0x00a7a6}}, + {0x00a7a7, {[CaseLower] = 0x00a7a7,[CaseTitle] = 0x00a7a6,[CaseUpper] = 0x00a7a6}}, + {0x00a7a8, {[CaseLower] = 0x00a7a9,[CaseTitle] = 0x00a7a8,[CaseUpper] = 0x00a7a8}}, + {0x00a7a9, {[CaseLower] = 0x00a7a9,[CaseTitle] = 0x00a7a8,[CaseUpper] = 0x00a7a8}}, + {0x00a7aa, {[CaseLower] = 0x000266,[CaseTitle] = 0x00a7aa,[CaseUpper] = 0x00a7aa}}, + {0x00a7ab, {[CaseLower] = 0x00025c,[CaseTitle] = 0x00a7ab,[CaseUpper] = 0x00a7ab}}, + {0x00a7ac, {[CaseLower] = 0x000261,[CaseTitle] = 0x00a7ac,[CaseUpper] = 0x00a7ac}}, + {0x00a7ad, {[CaseLower] = 0x00026c,[CaseTitle] = 0x00a7ad,[CaseUpper] = 0x00a7ad}}, + {0x00a7ae, {[CaseLower] = 0x00026a,[CaseTitle] = 0x00a7ae,[CaseUpper] = 0x00a7ae}}, + {0x00a7b0, {[CaseLower] = 0x00029e,[CaseTitle] = 0x00a7b0,[CaseUpper] = 0x00a7b0}}, + {0x00a7b1, {[CaseLower] = 0x000287,[CaseTitle] = 0x00a7b1,[CaseUpper] = 0x00a7b1}}, + {0x00a7b2, {[CaseLower] = 0x00029d,[CaseTitle] = 0x00a7b2,[CaseUpper] = 0x00a7b2}}, + {0x00a7b3, {[CaseLower] = 0x00ab53,[CaseTitle] = 0x00a7b3,[CaseUpper] = 0x00a7b3}}, + {0x00a7b4, {[CaseLower] = 0x00a7b5,[CaseTitle] = 0x00a7b4,[CaseUpper] = 0x00a7b4}}, + {0x00a7b5, {[CaseLower] = 0x00a7b5,[CaseTitle] = 0x00a7b4,[CaseUpper] = 0x00a7b4}}, + {0x00a7b6, {[CaseLower] = 0x00a7b7,[CaseTitle] = 0x00a7b6,[CaseUpper] = 0x00a7b6}}, + {0x00a7b7, {[CaseLower] = 0x00a7b7,[CaseTitle] = 0x00a7b6,[CaseUpper] = 0x00a7b6}}, + {0x00a7b8, {[CaseLower] = 0x00a7b9,[CaseTitle] = 0x00a7b8,[CaseUpper] = 0x00a7b8}}, + {0x00a7b9, {[CaseLower] = 0x00a7b9,[CaseTitle] = 0x00a7b8,[CaseUpper] = 0x00a7b8}}, + {0x00a7ba, {[CaseLower] = 0x00a7bb,[CaseTitle] = 0x00a7ba,[CaseUpper] = 0x00a7ba}}, + {0x00a7bb, {[CaseLower] = 0x00a7bb,[CaseTitle] = 0x00a7ba,[CaseUpper] = 0x00a7ba}}, + {0x00a7bc, {[CaseLower] = 0x00a7bd,[CaseTitle] = 0x00a7bc,[CaseUpper] = 0x00a7bc}}, + {0x00a7bd, {[CaseLower] = 0x00a7bd,[CaseTitle] = 0x00a7bc,[CaseUpper] = 0x00a7bc}}, + {0x00a7be, {[CaseLower] = 0x00a7bf,[CaseTitle] = 0x00a7be,[CaseUpper] = 0x00a7be}}, + {0x00a7bf, {[CaseLower] = 0x00a7bf,[CaseTitle] = 0x00a7be,[CaseUpper] = 0x00a7be}}, + {0x00a7c0, {[CaseLower] = 0x00a7c1,[CaseTitle] = 0x00a7c0,[CaseUpper] = 0x00a7c0}}, + {0x00a7c1, {[CaseLower] = 0x00a7c1,[CaseTitle] = 0x00a7c0,[CaseUpper] = 0x00a7c0}}, + {0x00a7c2, {[CaseLower] = 0x00a7c3,[CaseTitle] = 0x00a7c2,[CaseUpper] = 0x00a7c2}}, + {0x00a7c3, {[CaseLower] = 0x00a7c3,[CaseTitle] = 0x00a7c2,[CaseUpper] = 0x00a7c2}}, + {0x00a7c4, {[CaseLower] = 0x00a794,[CaseTitle] = 0x00a7c4,[CaseUpper] = 0x00a7c4}}, + {0x00a7c5, {[CaseLower] = 0x000282,[CaseTitle] = 0x00a7c5,[CaseUpper] = 0x00a7c5}}, + {0x00a7c6, {[CaseLower] = 0x001d8e,[CaseTitle] = 0x00a7c6,[CaseUpper] = 0x00a7c6}}, + {0x00a7c7, {[CaseLower] = 0x00a7c8,[CaseTitle] = 0x00a7c7,[CaseUpper] = 0x00a7c7}}, + {0x00a7c8, {[CaseLower] = 0x00a7c8,[CaseTitle] = 0x00a7c7,[CaseUpper] = 0x00a7c7}}, + {0x00a7c9, {[CaseLower] = 0x00a7ca,[CaseTitle] = 0x00a7c9,[CaseUpper] = 0x00a7c9}}, + {0x00a7ca, {[CaseLower] = 0x00a7ca,[CaseTitle] = 0x00a7c9,[CaseUpper] = 0x00a7c9}}, + {0x00a7d0, {[CaseLower] = 0x00a7d1,[CaseTitle] = 0x00a7d0,[CaseUpper] = 0x00a7d0}}, + {0x00a7d1, {[CaseLower] = 0x00a7d1,[CaseTitle] = 0x00a7d0,[CaseUpper] = 0x00a7d0}}, + {0x00a7d6, {[CaseLower] = 0x00a7d7,[CaseTitle] = 0x00a7d6,[CaseUpper] = 0x00a7d6}}, + {0x00a7d7, {[CaseLower] = 0x00a7d7,[CaseTitle] = 0x00a7d6,[CaseUpper] = 0x00a7d6}}, + {0x00a7d8, {[CaseLower] = 0x00a7d9,[CaseTitle] = 0x00a7d8,[CaseUpper] = 0x00a7d8}}, + {0x00a7d9, {[CaseLower] = 0x00a7d9,[CaseTitle] = 0x00a7d8,[CaseUpper] = 0x00a7d8}}, + {0x00a7f5, {[CaseLower] = 0x00a7f6,[CaseTitle] = 0x00a7f5,[CaseUpper] = 0x00a7f5}}, + {0x00a7f6, {[CaseLower] = 0x00a7f6,[CaseTitle] = 0x00a7f5,[CaseUpper] = 0x00a7f5}}, + {0x00ab53, {[CaseLower] = 0x00ab53,[CaseTitle] = 0x00a7b3,[CaseUpper] = 0x00a7b3}}, + {0x00ab70, {[CaseLower] = 0x00ab70,[CaseTitle] = 0x0013a0,[CaseUpper] = 0x0013a0}}, + {0x00ab71, {[CaseLower] = 0x00ab71,[CaseTitle] = 0x0013a1,[CaseUpper] = 0x0013a1}}, + {0x00ab72, {[CaseLower] = 0x00ab72,[CaseTitle] = 0x0013a2,[CaseUpper] = 0x0013a2}}, + {0x00ab73, {[CaseLower] = 0x00ab73,[CaseTitle] = 0x0013a3,[CaseUpper] = 0x0013a3}}, + {0x00ab74, {[CaseLower] = 0x00ab74,[CaseTitle] = 0x0013a4,[CaseUpper] = 0x0013a4}}, + {0x00ab75, {[CaseLower] = 0x00ab75,[CaseTitle] = 0x0013a5,[CaseUpper] = 0x0013a5}}, + {0x00ab76, {[CaseLower] = 0x00ab76,[CaseTitle] = 0x0013a6,[CaseUpper] = 0x0013a6}}, + {0x00ab77, {[CaseLower] = 0x00ab77,[CaseTitle] = 0x0013a7,[CaseUpper] = 0x0013a7}}, + {0x00ab78, {[CaseLower] = 0x00ab78,[CaseTitle] = 0x0013a8,[CaseUpper] = 0x0013a8}}, + {0x00ab79, {[CaseLower] = 0x00ab79,[CaseTitle] = 0x0013a9,[CaseUpper] = 0x0013a9}}, + {0x00ab7a, {[CaseLower] = 0x00ab7a,[CaseTitle] = 0x0013aa,[CaseUpper] = 0x0013aa}}, + {0x00ab7b, {[CaseLower] = 0x00ab7b,[CaseTitle] = 0x0013ab,[CaseUpper] = 0x0013ab}}, + {0x00ab7c, {[CaseLower] = 0x00ab7c,[CaseTitle] = 0x0013ac,[CaseUpper] = 0x0013ac}}, + {0x00ab7d, {[CaseLower] = 0x00ab7d,[CaseTitle] = 0x0013ad,[CaseUpper] = 0x0013ad}}, + {0x00ab7e, {[CaseLower] = 0x00ab7e,[CaseTitle] = 0x0013ae,[CaseUpper] = 0x0013ae}}, + {0x00ab7f, {[CaseLower] = 0x00ab7f,[CaseTitle] = 0x0013af,[CaseUpper] = 0x0013af}}, + {0x00ab80, {[CaseLower] = 0x00ab80,[CaseTitle] = 0x0013b0,[CaseUpper] = 0x0013b0}}, + {0x00ab81, {[CaseLower] = 0x00ab81,[CaseTitle] = 0x0013b1,[CaseUpper] = 0x0013b1}}, + {0x00ab82, {[CaseLower] = 0x00ab82,[CaseTitle] = 0x0013b2,[CaseUpper] = 0x0013b2}}, + {0x00ab83, {[CaseLower] = 0x00ab83,[CaseTitle] = 0x0013b3,[CaseUpper] = 0x0013b3}}, + {0x00ab84, {[CaseLower] = 0x00ab84,[CaseTitle] = 0x0013b4,[CaseUpper] = 0x0013b4}}, + {0x00ab85, {[CaseLower] = 0x00ab85,[CaseTitle] = 0x0013b5,[CaseUpper] = 0x0013b5}}, + {0x00ab86, {[CaseLower] = 0x00ab86,[CaseTitle] = 0x0013b6,[CaseUpper] = 0x0013b6}}, + {0x00ab87, {[CaseLower] = 0x00ab87,[CaseTitle] = 0x0013b7,[CaseUpper] = 0x0013b7}}, + {0x00ab88, {[CaseLower] = 0x00ab88,[CaseTitle] = 0x0013b8,[CaseUpper] = 0x0013b8}}, + {0x00ab89, {[CaseLower] = 0x00ab89,[CaseTitle] = 0x0013b9,[CaseUpper] = 0x0013b9}}, + {0x00ab8a, {[CaseLower] = 0x00ab8a,[CaseTitle] = 0x0013ba,[CaseUpper] = 0x0013ba}}, + {0x00ab8b, {[CaseLower] = 0x00ab8b,[CaseTitle] = 0x0013bb,[CaseUpper] = 0x0013bb}}, + {0x00ab8c, {[CaseLower] = 0x00ab8c,[CaseTitle] = 0x0013bc,[CaseUpper] = 0x0013bc}}, + {0x00ab8d, {[CaseLower] = 0x00ab8d,[CaseTitle] = 0x0013bd,[CaseUpper] = 0x0013bd}}, + {0x00ab8e, {[CaseLower] = 0x00ab8e,[CaseTitle] = 0x0013be,[CaseUpper] = 0x0013be}}, + {0x00ab8f, {[CaseLower] = 0x00ab8f,[CaseTitle] = 0x0013bf,[CaseUpper] = 0x0013bf}}, + {0x00ab90, {[CaseLower] = 0x00ab90,[CaseTitle] = 0x0013c0,[CaseUpper] = 0x0013c0}}, + {0x00ab91, {[CaseLower] = 0x00ab91,[CaseTitle] = 0x0013c1,[CaseUpper] = 0x0013c1}}, + {0x00ab92, {[CaseLower] = 0x00ab92,[CaseTitle] = 0x0013c2,[CaseUpper] = 0x0013c2}}, + {0x00ab93, {[CaseLower] = 0x00ab93,[CaseTitle] = 0x0013c3,[CaseUpper] = 0x0013c3}}, + {0x00ab94, {[CaseLower] = 0x00ab94,[CaseTitle] = 0x0013c4,[CaseUpper] = 0x0013c4}}, + {0x00ab95, {[CaseLower] = 0x00ab95,[CaseTitle] = 0x0013c5,[CaseUpper] = 0x0013c5}}, + {0x00ab96, {[CaseLower] = 0x00ab96,[CaseTitle] = 0x0013c6,[CaseUpper] = 0x0013c6}}, + {0x00ab97, {[CaseLower] = 0x00ab97,[CaseTitle] = 0x0013c7,[CaseUpper] = 0x0013c7}}, + {0x00ab98, {[CaseLower] = 0x00ab98,[CaseTitle] = 0x0013c8,[CaseUpper] = 0x0013c8}}, + {0x00ab99, {[CaseLower] = 0x00ab99,[CaseTitle] = 0x0013c9,[CaseUpper] = 0x0013c9}}, + {0x00ab9a, {[CaseLower] = 0x00ab9a,[CaseTitle] = 0x0013ca,[CaseUpper] = 0x0013ca}}, + {0x00ab9b, {[CaseLower] = 0x00ab9b,[CaseTitle] = 0x0013cb,[CaseUpper] = 0x0013cb}}, + {0x00ab9c, {[CaseLower] = 0x00ab9c,[CaseTitle] = 0x0013cc,[CaseUpper] = 0x0013cc}}, + {0x00ab9d, {[CaseLower] = 0x00ab9d,[CaseTitle] = 0x0013cd,[CaseUpper] = 0x0013cd}}, + {0x00ab9e, {[CaseLower] = 0x00ab9e,[CaseTitle] = 0x0013ce,[CaseUpper] = 0x0013ce}}, + {0x00ab9f, {[CaseLower] = 0x00ab9f,[CaseTitle] = 0x0013cf,[CaseUpper] = 0x0013cf}}, + {0x00aba0, {[CaseLower] = 0x00aba0,[CaseTitle] = 0x0013d0,[CaseUpper] = 0x0013d0}}, + {0x00aba1, {[CaseLower] = 0x00aba1,[CaseTitle] = 0x0013d1,[CaseUpper] = 0x0013d1}}, + {0x00aba2, {[CaseLower] = 0x00aba2,[CaseTitle] = 0x0013d2,[CaseUpper] = 0x0013d2}}, + {0x00aba3, {[CaseLower] = 0x00aba3,[CaseTitle] = 0x0013d3,[CaseUpper] = 0x0013d3}}, + {0x00aba4, {[CaseLower] = 0x00aba4,[CaseTitle] = 0x0013d4,[CaseUpper] = 0x0013d4}}, + {0x00aba5, {[CaseLower] = 0x00aba5,[CaseTitle] = 0x0013d5,[CaseUpper] = 0x0013d5}}, + {0x00aba6, {[CaseLower] = 0x00aba6,[CaseTitle] = 0x0013d6,[CaseUpper] = 0x0013d6}}, + {0x00aba7, {[CaseLower] = 0x00aba7,[CaseTitle] = 0x0013d7,[CaseUpper] = 0x0013d7}}, + {0x00aba8, {[CaseLower] = 0x00aba8,[CaseTitle] = 0x0013d8,[CaseUpper] = 0x0013d8}}, + {0x00aba9, {[CaseLower] = 0x00aba9,[CaseTitle] = 0x0013d9,[CaseUpper] = 0x0013d9}}, + {0x00abaa, {[CaseLower] = 0x00abaa,[CaseTitle] = 0x0013da,[CaseUpper] = 0x0013da}}, + {0x00abab, {[CaseLower] = 0x00abab,[CaseTitle] = 0x0013db,[CaseUpper] = 0x0013db}}, + {0x00abac, {[CaseLower] = 0x00abac,[CaseTitle] = 0x0013dc,[CaseUpper] = 0x0013dc}}, + {0x00abad, {[CaseLower] = 0x00abad,[CaseTitle] = 0x0013dd,[CaseUpper] = 0x0013dd}}, + {0x00abae, {[CaseLower] = 0x00abae,[CaseTitle] = 0x0013de,[CaseUpper] = 0x0013de}}, + {0x00abaf, {[CaseLower] = 0x00abaf,[CaseTitle] = 0x0013df,[CaseUpper] = 0x0013df}}, + {0x00abb0, {[CaseLower] = 0x00abb0,[CaseTitle] = 0x0013e0,[CaseUpper] = 0x0013e0}}, + {0x00abb1, {[CaseLower] = 0x00abb1,[CaseTitle] = 0x0013e1,[CaseUpper] = 0x0013e1}}, + {0x00abb2, {[CaseLower] = 0x00abb2,[CaseTitle] = 0x0013e2,[CaseUpper] = 0x0013e2}}, + {0x00abb3, {[CaseLower] = 0x00abb3,[CaseTitle] = 0x0013e3,[CaseUpper] = 0x0013e3}}, + {0x00abb4, {[CaseLower] = 0x00abb4,[CaseTitle] = 0x0013e4,[CaseUpper] = 0x0013e4}}, + {0x00abb5, {[CaseLower] = 0x00abb5,[CaseTitle] = 0x0013e5,[CaseUpper] = 0x0013e5}}, + {0x00abb6, {[CaseLower] = 0x00abb6,[CaseTitle] = 0x0013e6,[CaseUpper] = 0x0013e6}}, + {0x00abb7, {[CaseLower] = 0x00abb7,[CaseTitle] = 0x0013e7,[CaseUpper] = 0x0013e7}}, + {0x00abb8, {[CaseLower] = 0x00abb8,[CaseTitle] = 0x0013e8,[CaseUpper] = 0x0013e8}}, + {0x00abb9, {[CaseLower] = 0x00abb9,[CaseTitle] = 0x0013e9,[CaseUpper] = 0x0013e9}}, + {0x00abba, {[CaseLower] = 0x00abba,[CaseTitle] = 0x0013ea,[CaseUpper] = 0x0013ea}}, + {0x00abbb, {[CaseLower] = 0x00abbb,[CaseTitle] = 0x0013eb,[CaseUpper] = 0x0013eb}}, + {0x00abbc, {[CaseLower] = 0x00abbc,[CaseTitle] = 0x0013ec,[CaseUpper] = 0x0013ec}}, + {0x00abbd, {[CaseLower] = 0x00abbd,[CaseTitle] = 0x0013ed,[CaseUpper] = 0x0013ed}}, + {0x00abbe, {[CaseLower] = 0x00abbe,[CaseTitle] = 0x0013ee,[CaseUpper] = 0x0013ee}}, + {0x00abbf, {[CaseLower] = 0x00abbf,[CaseTitle] = 0x0013ef,[CaseUpper] = 0x0013ef}}, + {0x00ff21, {[CaseLower] = 0x00ff41,[CaseTitle] = 0x00ff21,[CaseUpper] = 0x00ff21}}, + {0x00ff22, {[CaseLower] = 0x00ff42,[CaseTitle] = 0x00ff22,[CaseUpper] = 0x00ff22}}, + {0x00ff23, {[CaseLower] = 0x00ff43,[CaseTitle] = 0x00ff23,[CaseUpper] = 0x00ff23}}, + {0x00ff24, {[CaseLower] = 0x00ff44,[CaseTitle] = 0x00ff24,[CaseUpper] = 0x00ff24}}, + {0x00ff25, {[CaseLower] = 0x00ff45,[CaseTitle] = 0x00ff25,[CaseUpper] = 0x00ff25}}, + {0x00ff26, {[CaseLower] = 0x00ff46,[CaseTitle] = 0x00ff26,[CaseUpper] = 0x00ff26}}, + {0x00ff27, {[CaseLower] = 0x00ff47,[CaseTitle] = 0x00ff27,[CaseUpper] = 0x00ff27}}, + {0x00ff28, {[CaseLower] = 0x00ff48,[CaseTitle] = 0x00ff28,[CaseUpper] = 0x00ff28}}, + {0x00ff29, {[CaseLower] = 0x00ff49,[CaseTitle] = 0x00ff29,[CaseUpper] = 0x00ff29}}, + {0x00ff2a, {[CaseLower] = 0x00ff4a,[CaseTitle] = 0x00ff2a,[CaseUpper] = 0x00ff2a}}, + {0x00ff2b, {[CaseLower] = 0x00ff4b,[CaseTitle] = 0x00ff2b,[CaseUpper] = 0x00ff2b}}, + {0x00ff2c, {[CaseLower] = 0x00ff4c,[CaseTitle] = 0x00ff2c,[CaseUpper] = 0x00ff2c}}, + {0x00ff2d, {[CaseLower] = 0x00ff4d,[CaseTitle] = 0x00ff2d,[CaseUpper] = 0x00ff2d}}, + {0x00ff2e, {[CaseLower] = 0x00ff4e,[CaseTitle] = 0x00ff2e,[CaseUpper] = 0x00ff2e}}, + {0x00ff2f, {[CaseLower] = 0x00ff4f,[CaseTitle] = 0x00ff2f,[CaseUpper] = 0x00ff2f}}, + {0x00ff30, {[CaseLower] = 0x00ff50,[CaseTitle] = 0x00ff30,[CaseUpper] = 0x00ff30}}, + {0x00ff31, {[CaseLower] = 0x00ff51,[CaseTitle] = 0x00ff31,[CaseUpper] = 0x00ff31}}, + {0x00ff32, {[CaseLower] = 0x00ff52,[CaseTitle] = 0x00ff32,[CaseUpper] = 0x00ff32}}, + {0x00ff33, {[CaseLower] = 0x00ff53,[CaseTitle] = 0x00ff33,[CaseUpper] = 0x00ff33}}, + {0x00ff34, {[CaseLower] = 0x00ff54,[CaseTitle] = 0x00ff34,[CaseUpper] = 0x00ff34}}, + {0x00ff35, {[CaseLower] = 0x00ff55,[CaseTitle] = 0x00ff35,[CaseUpper] = 0x00ff35}}, + {0x00ff36, {[CaseLower] = 0x00ff56,[CaseTitle] = 0x00ff36,[CaseUpper] = 0x00ff36}}, + {0x00ff37, {[CaseLower] = 0x00ff57,[CaseTitle] = 0x00ff37,[CaseUpper] = 0x00ff37}}, + {0x00ff38, {[CaseLower] = 0x00ff58,[CaseTitle] = 0x00ff38,[CaseUpper] = 0x00ff38}}, + {0x00ff39, {[CaseLower] = 0x00ff59,[CaseTitle] = 0x00ff39,[CaseUpper] = 0x00ff39}}, + {0x00ff3a, {[CaseLower] = 0x00ff5a,[CaseTitle] = 0x00ff3a,[CaseUpper] = 0x00ff3a}}, + {0x00ff41, {[CaseLower] = 0x00ff41,[CaseTitle] = 0x00ff21,[CaseUpper] = 0x00ff21}}, + {0x00ff42, {[CaseLower] = 0x00ff42,[CaseTitle] = 0x00ff22,[CaseUpper] = 0x00ff22}}, + {0x00ff43, {[CaseLower] = 0x00ff43,[CaseTitle] = 0x00ff23,[CaseUpper] = 0x00ff23}}, + {0x00ff44, {[CaseLower] = 0x00ff44,[CaseTitle] = 0x00ff24,[CaseUpper] = 0x00ff24}}, + {0x00ff45, {[CaseLower] = 0x00ff45,[CaseTitle] = 0x00ff25,[CaseUpper] = 0x00ff25}}, + {0x00ff46, {[CaseLower] = 0x00ff46,[CaseTitle] = 0x00ff26,[CaseUpper] = 0x00ff26}}, + {0x00ff47, {[CaseLower] = 0x00ff47,[CaseTitle] = 0x00ff27,[CaseUpper] = 0x00ff27}}, + {0x00ff48, {[CaseLower] = 0x00ff48,[CaseTitle] = 0x00ff28,[CaseUpper] = 0x00ff28}}, + {0x00ff49, {[CaseLower] = 0x00ff49,[CaseTitle] = 0x00ff29,[CaseUpper] = 0x00ff29}}, + {0x00ff4a, {[CaseLower] = 0x00ff4a,[CaseTitle] = 0x00ff2a,[CaseUpper] = 0x00ff2a}}, + {0x00ff4b, {[CaseLower] = 0x00ff4b,[CaseTitle] = 0x00ff2b,[CaseUpper] = 0x00ff2b}}, + {0x00ff4c, {[CaseLower] = 0x00ff4c,[CaseTitle] = 0x00ff2c,[CaseUpper] = 0x00ff2c}}, + {0x00ff4d, {[CaseLower] = 0x00ff4d,[CaseTitle] = 0x00ff2d,[CaseUpper] = 0x00ff2d}}, + {0x00ff4e, {[CaseLower] = 0x00ff4e,[CaseTitle] = 0x00ff2e,[CaseUpper] = 0x00ff2e}}, + {0x00ff4f, {[CaseLower] = 0x00ff4f,[CaseTitle] = 0x00ff2f,[CaseUpper] = 0x00ff2f}}, + {0x00ff50, {[CaseLower] = 0x00ff50,[CaseTitle] = 0x00ff30,[CaseUpper] = 0x00ff30}}, + {0x00ff51, {[CaseLower] = 0x00ff51,[CaseTitle] = 0x00ff31,[CaseUpper] = 0x00ff31}}, + {0x00ff52, {[CaseLower] = 0x00ff52,[CaseTitle] = 0x00ff32,[CaseUpper] = 0x00ff32}}, + {0x00ff53, {[CaseLower] = 0x00ff53,[CaseTitle] = 0x00ff33,[CaseUpper] = 0x00ff33}}, + {0x00ff54, {[CaseLower] = 0x00ff54,[CaseTitle] = 0x00ff34,[CaseUpper] = 0x00ff34}}, + {0x00ff55, {[CaseLower] = 0x00ff55,[CaseTitle] = 0x00ff35,[CaseUpper] = 0x00ff35}}, + {0x00ff56, {[CaseLower] = 0x00ff56,[CaseTitle] = 0x00ff36,[CaseUpper] = 0x00ff36}}, + {0x00ff57, {[CaseLower] = 0x00ff57,[CaseTitle] = 0x00ff37,[CaseUpper] = 0x00ff37}}, + {0x00ff58, {[CaseLower] = 0x00ff58,[CaseTitle] = 0x00ff38,[CaseUpper] = 0x00ff38}}, + {0x00ff59, {[CaseLower] = 0x00ff59,[CaseTitle] = 0x00ff39,[CaseUpper] = 0x00ff39}}, + {0x00ff5a, {[CaseLower] = 0x00ff5a,[CaseTitle] = 0x00ff3a,[CaseUpper] = 0x00ff3a}}, + {0x010400, {[CaseLower] = 0x010428,[CaseTitle] = 0x010400,[CaseUpper] = 0x010400}}, + {0x010401, {[CaseLower] = 0x010429,[CaseTitle] = 0x010401,[CaseUpper] = 0x010401}}, + {0x010402, {[CaseLower] = 0x01042a,[CaseTitle] = 0x010402,[CaseUpper] = 0x010402}}, + {0x010403, {[CaseLower] = 0x01042b,[CaseTitle] = 0x010403,[CaseUpper] = 0x010403}}, + {0x010404, {[CaseLower] = 0x01042c,[CaseTitle] = 0x010404,[CaseUpper] = 0x010404}}, + {0x010405, {[CaseLower] = 0x01042d,[CaseTitle] = 0x010405,[CaseUpper] = 0x010405}}, + {0x010406, {[CaseLower] = 0x01042e,[CaseTitle] = 0x010406,[CaseUpper] = 0x010406}}, + {0x010407, {[CaseLower] = 0x01042f,[CaseTitle] = 0x010407,[CaseUpper] = 0x010407}}, + {0x010408, {[CaseLower] = 0x010430,[CaseTitle] = 0x010408,[CaseUpper] = 0x010408}}, + {0x010409, {[CaseLower] = 0x010431,[CaseTitle] = 0x010409,[CaseUpper] = 0x010409}}, + {0x01040a, {[CaseLower] = 0x010432,[CaseTitle] = 0x01040a,[CaseUpper] = 0x01040a}}, + {0x01040b, {[CaseLower] = 0x010433,[CaseTitle] = 0x01040b,[CaseUpper] = 0x01040b}}, + {0x01040c, {[CaseLower] = 0x010434,[CaseTitle] = 0x01040c,[CaseUpper] = 0x01040c}}, + {0x01040d, {[CaseLower] = 0x010435,[CaseTitle] = 0x01040d,[CaseUpper] = 0x01040d}}, + {0x01040e, {[CaseLower] = 0x010436,[CaseTitle] = 0x01040e,[CaseUpper] = 0x01040e}}, + {0x01040f, {[CaseLower] = 0x010437,[CaseTitle] = 0x01040f,[CaseUpper] = 0x01040f}}, + {0x010410, {[CaseLower] = 0x010438,[CaseTitle] = 0x010410,[CaseUpper] = 0x010410}}, + {0x010411, {[CaseLower] = 0x010439,[CaseTitle] = 0x010411,[CaseUpper] = 0x010411}}, + {0x010412, {[CaseLower] = 0x01043a,[CaseTitle] = 0x010412,[CaseUpper] = 0x010412}}, + {0x010413, {[CaseLower] = 0x01043b,[CaseTitle] = 0x010413,[CaseUpper] = 0x010413}}, + {0x010414, {[CaseLower] = 0x01043c,[CaseTitle] = 0x010414,[CaseUpper] = 0x010414}}, + {0x010415, {[CaseLower] = 0x01043d,[CaseTitle] = 0x010415,[CaseUpper] = 0x010415}}, + {0x010416, {[CaseLower] = 0x01043e,[CaseTitle] = 0x010416,[CaseUpper] = 0x010416}}, + {0x010417, {[CaseLower] = 0x01043f,[CaseTitle] = 0x010417,[CaseUpper] = 0x010417}}, + {0x010418, {[CaseLower] = 0x010440,[CaseTitle] = 0x010418,[CaseUpper] = 0x010418}}, + {0x010419, {[CaseLower] = 0x010441,[CaseTitle] = 0x010419,[CaseUpper] = 0x010419}}, + {0x01041a, {[CaseLower] = 0x010442,[CaseTitle] = 0x01041a,[CaseUpper] = 0x01041a}}, + {0x01041b, {[CaseLower] = 0x010443,[CaseTitle] = 0x01041b,[CaseUpper] = 0x01041b}}, + {0x01041c, {[CaseLower] = 0x010444,[CaseTitle] = 0x01041c,[CaseUpper] = 0x01041c}}, + {0x01041d, {[CaseLower] = 0x010445,[CaseTitle] = 0x01041d,[CaseUpper] = 0x01041d}}, + {0x01041e, {[CaseLower] = 0x010446,[CaseTitle] = 0x01041e,[CaseUpper] = 0x01041e}}, + {0x01041f, {[CaseLower] = 0x010447,[CaseTitle] = 0x01041f,[CaseUpper] = 0x01041f}}, + {0x010420, {[CaseLower] = 0x010448,[CaseTitle] = 0x010420,[CaseUpper] = 0x010420}}, + {0x010421, {[CaseLower] = 0x010449,[CaseTitle] = 0x010421,[CaseUpper] = 0x010421}}, + {0x010422, {[CaseLower] = 0x01044a,[CaseTitle] = 0x010422,[CaseUpper] = 0x010422}}, + {0x010423, {[CaseLower] = 0x01044b,[CaseTitle] = 0x010423,[CaseUpper] = 0x010423}}, + {0x010424, {[CaseLower] = 0x01044c,[CaseTitle] = 0x010424,[CaseUpper] = 0x010424}}, + {0x010425, {[CaseLower] = 0x01044d,[CaseTitle] = 0x010425,[CaseUpper] = 0x010425}}, + {0x010426, {[CaseLower] = 0x01044e,[CaseTitle] = 0x010426,[CaseUpper] = 0x010426}}, + {0x010427, {[CaseLower] = 0x01044f,[CaseTitle] = 0x010427,[CaseUpper] = 0x010427}}, + {0x010428, {[CaseLower] = 0x010428,[CaseTitle] = 0x010400,[CaseUpper] = 0x010400}}, + {0x010429, {[CaseLower] = 0x010429,[CaseTitle] = 0x010401,[CaseUpper] = 0x010401}}, + {0x01042a, {[CaseLower] = 0x01042a,[CaseTitle] = 0x010402,[CaseUpper] = 0x010402}}, + {0x01042b, {[CaseLower] = 0x01042b,[CaseTitle] = 0x010403,[CaseUpper] = 0x010403}}, + {0x01042c, {[CaseLower] = 0x01042c,[CaseTitle] = 0x010404,[CaseUpper] = 0x010404}}, + {0x01042d, {[CaseLower] = 0x01042d,[CaseTitle] = 0x010405,[CaseUpper] = 0x010405}}, + {0x01042e, {[CaseLower] = 0x01042e,[CaseTitle] = 0x010406,[CaseUpper] = 0x010406}}, + {0x01042f, {[CaseLower] = 0x01042f,[CaseTitle] = 0x010407,[CaseUpper] = 0x010407}}, + {0x010430, {[CaseLower] = 0x010430,[CaseTitle] = 0x010408,[CaseUpper] = 0x010408}}, + {0x010431, {[CaseLower] = 0x010431,[CaseTitle] = 0x010409,[CaseUpper] = 0x010409}}, + {0x010432, {[CaseLower] = 0x010432,[CaseTitle] = 0x01040a,[CaseUpper] = 0x01040a}}, + {0x010433, {[CaseLower] = 0x010433,[CaseTitle] = 0x01040b,[CaseUpper] = 0x01040b}}, + {0x010434, {[CaseLower] = 0x010434,[CaseTitle] = 0x01040c,[CaseUpper] = 0x01040c}}, + {0x010435, {[CaseLower] = 0x010435,[CaseTitle] = 0x01040d,[CaseUpper] = 0x01040d}}, + {0x010436, {[CaseLower] = 0x010436,[CaseTitle] = 0x01040e,[CaseUpper] = 0x01040e}}, + {0x010437, {[CaseLower] = 0x010437,[CaseTitle] = 0x01040f,[CaseUpper] = 0x01040f}}, + {0x010438, {[CaseLower] = 0x010438,[CaseTitle] = 0x010410,[CaseUpper] = 0x010410}}, + {0x010439, {[CaseLower] = 0x010439,[CaseTitle] = 0x010411,[CaseUpper] = 0x010411}}, + {0x01043a, {[CaseLower] = 0x01043a,[CaseTitle] = 0x010412,[CaseUpper] = 0x010412}}, + {0x01043b, {[CaseLower] = 0x01043b,[CaseTitle] = 0x010413,[CaseUpper] = 0x010413}}, + {0x01043c, {[CaseLower] = 0x01043c,[CaseTitle] = 0x010414,[CaseUpper] = 0x010414}}, + {0x01043d, {[CaseLower] = 0x01043d,[CaseTitle] = 0x010415,[CaseUpper] = 0x010415}}, + {0x01043e, {[CaseLower] = 0x01043e,[CaseTitle] = 0x010416,[CaseUpper] = 0x010416}}, + {0x01043f, {[CaseLower] = 0x01043f,[CaseTitle] = 0x010417,[CaseUpper] = 0x010417}}, + {0x010440, {[CaseLower] = 0x010440,[CaseTitle] = 0x010418,[CaseUpper] = 0x010418}}, + {0x010441, {[CaseLower] = 0x010441,[CaseTitle] = 0x010419,[CaseUpper] = 0x010419}}, + {0x010442, {[CaseLower] = 0x010442,[CaseTitle] = 0x01041a,[CaseUpper] = 0x01041a}}, + {0x010443, {[CaseLower] = 0x010443,[CaseTitle] = 0x01041b,[CaseUpper] = 0x01041b}}, + {0x010444, {[CaseLower] = 0x010444,[CaseTitle] = 0x01041c,[CaseUpper] = 0x01041c}}, + {0x010445, {[CaseLower] = 0x010445,[CaseTitle] = 0x01041d,[CaseUpper] = 0x01041d}}, + {0x010446, {[CaseLower] = 0x010446,[CaseTitle] = 0x01041e,[CaseUpper] = 0x01041e}}, + {0x010447, {[CaseLower] = 0x010447,[CaseTitle] = 0x01041f,[CaseUpper] = 0x01041f}}, + {0x010448, {[CaseLower] = 0x010448,[CaseTitle] = 0x010420,[CaseUpper] = 0x010420}}, + {0x010449, {[CaseLower] = 0x010449,[CaseTitle] = 0x010421,[CaseUpper] = 0x010421}}, + {0x01044a, {[CaseLower] = 0x01044a,[CaseTitle] = 0x010422,[CaseUpper] = 0x010422}}, + {0x01044b, {[CaseLower] = 0x01044b,[CaseTitle] = 0x010423,[CaseUpper] = 0x010423}}, + {0x01044c, {[CaseLower] = 0x01044c,[CaseTitle] = 0x010424,[CaseUpper] = 0x010424}}, + {0x01044d, {[CaseLower] = 0x01044d,[CaseTitle] = 0x010425,[CaseUpper] = 0x010425}}, + {0x01044e, {[CaseLower] = 0x01044e,[CaseTitle] = 0x010426,[CaseUpper] = 0x010426}}, + {0x01044f, {[CaseLower] = 0x01044f,[CaseTitle] = 0x010427,[CaseUpper] = 0x010427}}, + {0x0104b0, {[CaseLower] = 0x0104d8,[CaseTitle] = 0x0104b0,[CaseUpper] = 0x0104b0}}, + {0x0104b1, {[CaseLower] = 0x0104d9,[CaseTitle] = 0x0104b1,[CaseUpper] = 0x0104b1}}, + {0x0104b2, {[CaseLower] = 0x0104da,[CaseTitle] = 0x0104b2,[CaseUpper] = 0x0104b2}}, + {0x0104b3, {[CaseLower] = 0x0104db,[CaseTitle] = 0x0104b3,[CaseUpper] = 0x0104b3}}, + {0x0104b4, {[CaseLower] = 0x0104dc,[CaseTitle] = 0x0104b4,[CaseUpper] = 0x0104b4}}, + {0x0104b5, {[CaseLower] = 0x0104dd,[CaseTitle] = 0x0104b5,[CaseUpper] = 0x0104b5}}, + {0x0104b6, {[CaseLower] = 0x0104de,[CaseTitle] = 0x0104b6,[CaseUpper] = 0x0104b6}}, + {0x0104b7, {[CaseLower] = 0x0104df,[CaseTitle] = 0x0104b7,[CaseUpper] = 0x0104b7}}, + {0x0104b8, {[CaseLower] = 0x0104e0,[CaseTitle] = 0x0104b8,[CaseUpper] = 0x0104b8}}, + {0x0104b9, {[CaseLower] = 0x0104e1,[CaseTitle] = 0x0104b9,[CaseUpper] = 0x0104b9}}, + {0x0104ba, {[CaseLower] = 0x0104e2,[CaseTitle] = 0x0104ba,[CaseUpper] = 0x0104ba}}, + {0x0104bb, {[CaseLower] = 0x0104e3,[CaseTitle] = 0x0104bb,[CaseUpper] = 0x0104bb}}, + {0x0104bc, {[CaseLower] = 0x0104e4,[CaseTitle] = 0x0104bc,[CaseUpper] = 0x0104bc}}, + {0x0104bd, {[CaseLower] = 0x0104e5,[CaseTitle] = 0x0104bd,[CaseUpper] = 0x0104bd}}, + {0x0104be, {[CaseLower] = 0x0104e6,[CaseTitle] = 0x0104be,[CaseUpper] = 0x0104be}}, + {0x0104bf, {[CaseLower] = 0x0104e7,[CaseTitle] = 0x0104bf,[CaseUpper] = 0x0104bf}}, + {0x0104c0, {[CaseLower] = 0x0104e8,[CaseTitle] = 0x0104c0,[CaseUpper] = 0x0104c0}}, + {0x0104c1, {[CaseLower] = 0x0104e9,[CaseTitle] = 0x0104c1,[CaseUpper] = 0x0104c1}}, + {0x0104c2, {[CaseLower] = 0x0104ea,[CaseTitle] = 0x0104c2,[CaseUpper] = 0x0104c2}}, + {0x0104c3, {[CaseLower] = 0x0104eb,[CaseTitle] = 0x0104c3,[CaseUpper] = 0x0104c3}}, + {0x0104c4, {[CaseLower] = 0x0104ec,[CaseTitle] = 0x0104c4,[CaseUpper] = 0x0104c4}}, + {0x0104c5, {[CaseLower] = 0x0104ed,[CaseTitle] = 0x0104c5,[CaseUpper] = 0x0104c5}}, + {0x0104c6, {[CaseLower] = 0x0104ee,[CaseTitle] = 0x0104c6,[CaseUpper] = 0x0104c6}}, + {0x0104c7, {[CaseLower] = 0x0104ef,[CaseTitle] = 0x0104c7,[CaseUpper] = 0x0104c7}}, + {0x0104c8, {[CaseLower] = 0x0104f0,[CaseTitle] = 0x0104c8,[CaseUpper] = 0x0104c8}}, + {0x0104c9, {[CaseLower] = 0x0104f1,[CaseTitle] = 0x0104c9,[CaseUpper] = 0x0104c9}}, + {0x0104ca, {[CaseLower] = 0x0104f2,[CaseTitle] = 0x0104ca,[CaseUpper] = 0x0104ca}}, + {0x0104cb, {[CaseLower] = 0x0104f3,[CaseTitle] = 0x0104cb,[CaseUpper] = 0x0104cb}}, + {0x0104cc, {[CaseLower] = 0x0104f4,[CaseTitle] = 0x0104cc,[CaseUpper] = 0x0104cc}}, + {0x0104cd, {[CaseLower] = 0x0104f5,[CaseTitle] = 0x0104cd,[CaseUpper] = 0x0104cd}}, + {0x0104ce, {[CaseLower] = 0x0104f6,[CaseTitle] = 0x0104ce,[CaseUpper] = 0x0104ce}}, + {0x0104cf, {[CaseLower] = 0x0104f7,[CaseTitle] = 0x0104cf,[CaseUpper] = 0x0104cf}}, + {0x0104d0, {[CaseLower] = 0x0104f8,[CaseTitle] = 0x0104d0,[CaseUpper] = 0x0104d0}}, + {0x0104d1, {[CaseLower] = 0x0104f9,[CaseTitle] = 0x0104d1,[CaseUpper] = 0x0104d1}}, + {0x0104d2, {[CaseLower] = 0x0104fa,[CaseTitle] = 0x0104d2,[CaseUpper] = 0x0104d2}}, + {0x0104d3, {[CaseLower] = 0x0104fb,[CaseTitle] = 0x0104d3,[CaseUpper] = 0x0104d3}}, + {0x0104d8, {[CaseLower] = 0x0104d8,[CaseTitle] = 0x0104b0,[CaseUpper] = 0x0104b0}}, + {0x0104d9, {[CaseLower] = 0x0104d9,[CaseTitle] = 0x0104b1,[CaseUpper] = 0x0104b1}}, + {0x0104da, {[CaseLower] = 0x0104da,[CaseTitle] = 0x0104b2,[CaseUpper] = 0x0104b2}}, + {0x0104db, {[CaseLower] = 0x0104db,[CaseTitle] = 0x0104b3,[CaseUpper] = 0x0104b3}}, + {0x0104dc, {[CaseLower] = 0x0104dc,[CaseTitle] = 0x0104b4,[CaseUpper] = 0x0104b4}}, + {0x0104dd, {[CaseLower] = 0x0104dd,[CaseTitle] = 0x0104b5,[CaseUpper] = 0x0104b5}}, + {0x0104de, {[CaseLower] = 0x0104de,[CaseTitle] = 0x0104b6,[CaseUpper] = 0x0104b6}}, + {0x0104df, {[CaseLower] = 0x0104df,[CaseTitle] = 0x0104b7,[CaseUpper] = 0x0104b7}}, + {0x0104e0, {[CaseLower] = 0x0104e0,[CaseTitle] = 0x0104b8,[CaseUpper] = 0x0104b8}}, + {0x0104e1, {[CaseLower] = 0x0104e1,[CaseTitle] = 0x0104b9,[CaseUpper] = 0x0104b9}}, + {0x0104e2, {[CaseLower] = 0x0104e2,[CaseTitle] = 0x0104ba,[CaseUpper] = 0x0104ba}}, + {0x0104e3, {[CaseLower] = 0x0104e3,[CaseTitle] = 0x0104bb,[CaseUpper] = 0x0104bb}}, + {0x0104e4, {[CaseLower] = 0x0104e4,[CaseTitle] = 0x0104bc,[CaseUpper] = 0x0104bc}}, + {0x0104e5, {[CaseLower] = 0x0104e5,[CaseTitle] = 0x0104bd,[CaseUpper] = 0x0104bd}}, + {0x0104e6, {[CaseLower] = 0x0104e6,[CaseTitle] = 0x0104be,[CaseUpper] = 0x0104be}}, + {0x0104e7, {[CaseLower] = 0x0104e7,[CaseTitle] = 0x0104bf,[CaseUpper] = 0x0104bf}}, + {0x0104e8, {[CaseLower] = 0x0104e8,[CaseTitle] = 0x0104c0,[CaseUpper] = 0x0104c0}}, + {0x0104e9, {[CaseLower] = 0x0104e9,[CaseTitle] = 0x0104c1,[CaseUpper] = 0x0104c1}}, + {0x0104ea, {[CaseLower] = 0x0104ea,[CaseTitle] = 0x0104c2,[CaseUpper] = 0x0104c2}}, + {0x0104eb, {[CaseLower] = 0x0104eb,[CaseTitle] = 0x0104c3,[CaseUpper] = 0x0104c3}}, + {0x0104ec, {[CaseLower] = 0x0104ec,[CaseTitle] = 0x0104c4,[CaseUpper] = 0x0104c4}}, + {0x0104ed, {[CaseLower] = 0x0104ed,[CaseTitle] = 0x0104c5,[CaseUpper] = 0x0104c5}}, + {0x0104ee, {[CaseLower] = 0x0104ee,[CaseTitle] = 0x0104c6,[CaseUpper] = 0x0104c6}}, + {0x0104ef, {[CaseLower] = 0x0104ef,[CaseTitle] = 0x0104c7,[CaseUpper] = 0x0104c7}}, + {0x0104f0, {[CaseLower] = 0x0104f0,[CaseTitle] = 0x0104c8,[CaseUpper] = 0x0104c8}}, + {0x0104f1, {[CaseLower] = 0x0104f1,[CaseTitle] = 0x0104c9,[CaseUpper] = 0x0104c9}}, + {0x0104f2, {[CaseLower] = 0x0104f2,[CaseTitle] = 0x0104ca,[CaseUpper] = 0x0104ca}}, + {0x0104f3, {[CaseLower] = 0x0104f3,[CaseTitle] = 0x0104cb,[CaseUpper] = 0x0104cb}}, + {0x0104f4, {[CaseLower] = 0x0104f4,[CaseTitle] = 0x0104cc,[CaseUpper] = 0x0104cc}}, + {0x0104f5, {[CaseLower] = 0x0104f5,[CaseTitle] = 0x0104cd,[CaseUpper] = 0x0104cd}}, + {0x0104f6, {[CaseLower] = 0x0104f6,[CaseTitle] = 0x0104ce,[CaseUpper] = 0x0104ce}}, + {0x0104f7, {[CaseLower] = 0x0104f7,[CaseTitle] = 0x0104cf,[CaseUpper] = 0x0104cf}}, + {0x0104f8, {[CaseLower] = 0x0104f8,[CaseTitle] = 0x0104d0,[CaseUpper] = 0x0104d0}}, + {0x0104f9, {[CaseLower] = 0x0104f9,[CaseTitle] = 0x0104d1,[CaseUpper] = 0x0104d1}}, + {0x0104fa, {[CaseLower] = 0x0104fa,[CaseTitle] = 0x0104d2,[CaseUpper] = 0x0104d2}}, + {0x0104fb, {[CaseLower] = 0x0104fb,[CaseTitle] = 0x0104d3,[CaseUpper] = 0x0104d3}}, + {0x010570, {[CaseLower] = 0x010597,[CaseTitle] = 0x010570,[CaseUpper] = 0x010570}}, + {0x010571, {[CaseLower] = 0x010598,[CaseTitle] = 0x010571,[CaseUpper] = 0x010571}}, + {0x010572, {[CaseLower] = 0x010599,[CaseTitle] = 0x010572,[CaseUpper] = 0x010572}}, + {0x010573, {[CaseLower] = 0x01059a,[CaseTitle] = 0x010573,[CaseUpper] = 0x010573}}, + {0x010574, {[CaseLower] = 0x01059b,[CaseTitle] = 0x010574,[CaseUpper] = 0x010574}}, + {0x010575, {[CaseLower] = 0x01059c,[CaseTitle] = 0x010575,[CaseUpper] = 0x010575}}, + {0x010576, {[CaseLower] = 0x01059d,[CaseTitle] = 0x010576,[CaseUpper] = 0x010576}}, + {0x010577, {[CaseLower] = 0x01059e,[CaseTitle] = 0x010577,[CaseUpper] = 0x010577}}, + {0x010578, {[CaseLower] = 0x01059f,[CaseTitle] = 0x010578,[CaseUpper] = 0x010578}}, + {0x010579, {[CaseLower] = 0x0105a0,[CaseTitle] = 0x010579,[CaseUpper] = 0x010579}}, + {0x01057a, {[CaseLower] = 0x0105a1,[CaseTitle] = 0x01057a,[CaseUpper] = 0x01057a}}, + {0x01057c, {[CaseLower] = 0x0105a3,[CaseTitle] = 0x01057c,[CaseUpper] = 0x01057c}}, + {0x01057d, {[CaseLower] = 0x0105a4,[CaseTitle] = 0x01057d,[CaseUpper] = 0x01057d}}, + {0x01057e, {[CaseLower] = 0x0105a5,[CaseTitle] = 0x01057e,[CaseUpper] = 0x01057e}}, + {0x01057f, {[CaseLower] = 0x0105a6,[CaseTitle] = 0x01057f,[CaseUpper] = 0x01057f}}, + {0x010580, {[CaseLower] = 0x0105a7,[CaseTitle] = 0x010580,[CaseUpper] = 0x010580}}, + {0x010581, {[CaseLower] = 0x0105a8,[CaseTitle] = 0x010581,[CaseUpper] = 0x010581}}, + {0x010582, {[CaseLower] = 0x0105a9,[CaseTitle] = 0x010582,[CaseUpper] = 0x010582}}, + {0x010583, {[CaseLower] = 0x0105aa,[CaseTitle] = 0x010583,[CaseUpper] = 0x010583}}, + {0x010584, {[CaseLower] = 0x0105ab,[CaseTitle] = 0x010584,[CaseUpper] = 0x010584}}, + {0x010585, {[CaseLower] = 0x0105ac,[CaseTitle] = 0x010585,[CaseUpper] = 0x010585}}, + {0x010586, {[CaseLower] = 0x0105ad,[CaseTitle] = 0x010586,[CaseUpper] = 0x010586}}, + {0x010587, {[CaseLower] = 0x0105ae,[CaseTitle] = 0x010587,[CaseUpper] = 0x010587}}, + {0x010588, {[CaseLower] = 0x0105af,[CaseTitle] = 0x010588,[CaseUpper] = 0x010588}}, + {0x010589, {[CaseLower] = 0x0105b0,[CaseTitle] = 0x010589,[CaseUpper] = 0x010589}}, + {0x01058a, {[CaseLower] = 0x0105b1,[CaseTitle] = 0x01058a,[CaseUpper] = 0x01058a}}, + {0x01058c, {[CaseLower] = 0x0105b3,[CaseTitle] = 0x01058c,[CaseUpper] = 0x01058c}}, + {0x01058d, {[CaseLower] = 0x0105b4,[CaseTitle] = 0x01058d,[CaseUpper] = 0x01058d}}, + {0x01058e, {[CaseLower] = 0x0105b5,[CaseTitle] = 0x01058e,[CaseUpper] = 0x01058e}}, + {0x01058f, {[CaseLower] = 0x0105b6,[CaseTitle] = 0x01058f,[CaseUpper] = 0x01058f}}, + {0x010590, {[CaseLower] = 0x0105b7,[CaseTitle] = 0x010590,[CaseUpper] = 0x010590}}, + {0x010591, {[CaseLower] = 0x0105b8,[CaseTitle] = 0x010591,[CaseUpper] = 0x010591}}, + {0x010592, {[CaseLower] = 0x0105b9,[CaseTitle] = 0x010592,[CaseUpper] = 0x010592}}, + {0x010594, {[CaseLower] = 0x0105bb,[CaseTitle] = 0x010594,[CaseUpper] = 0x010594}}, + {0x010595, {[CaseLower] = 0x0105bc,[CaseTitle] = 0x010595,[CaseUpper] = 0x010595}}, + {0x010597, {[CaseLower] = 0x010597,[CaseTitle] = 0x010570,[CaseUpper] = 0x010570}}, + {0x010598, {[CaseLower] = 0x010598,[CaseTitle] = 0x010571,[CaseUpper] = 0x010571}}, + {0x010599, {[CaseLower] = 0x010599,[CaseTitle] = 0x010572,[CaseUpper] = 0x010572}}, + {0x01059a, {[CaseLower] = 0x01059a,[CaseTitle] = 0x010573,[CaseUpper] = 0x010573}}, + {0x01059b, {[CaseLower] = 0x01059b,[CaseTitle] = 0x010574,[CaseUpper] = 0x010574}}, + {0x01059c, {[CaseLower] = 0x01059c,[CaseTitle] = 0x010575,[CaseUpper] = 0x010575}}, + {0x01059d, {[CaseLower] = 0x01059d,[CaseTitle] = 0x010576,[CaseUpper] = 0x010576}}, + {0x01059e, {[CaseLower] = 0x01059e,[CaseTitle] = 0x010577,[CaseUpper] = 0x010577}}, + {0x01059f, {[CaseLower] = 0x01059f,[CaseTitle] = 0x010578,[CaseUpper] = 0x010578}}, + {0x0105a0, {[CaseLower] = 0x0105a0,[CaseTitle] = 0x010579,[CaseUpper] = 0x010579}}, + {0x0105a1, {[CaseLower] = 0x0105a1,[CaseTitle] = 0x01057a,[CaseUpper] = 0x01057a}}, + {0x0105a3, {[CaseLower] = 0x0105a3,[CaseTitle] = 0x01057c,[CaseUpper] = 0x01057c}}, + {0x0105a4, {[CaseLower] = 0x0105a4,[CaseTitle] = 0x01057d,[CaseUpper] = 0x01057d}}, + {0x0105a5, {[CaseLower] = 0x0105a5,[CaseTitle] = 0x01057e,[CaseUpper] = 0x01057e}}, + {0x0105a6, {[CaseLower] = 0x0105a6,[CaseTitle] = 0x01057f,[CaseUpper] = 0x01057f}}, + {0x0105a7, {[CaseLower] = 0x0105a7,[CaseTitle] = 0x010580,[CaseUpper] = 0x010580}}, + {0x0105a8, {[CaseLower] = 0x0105a8,[CaseTitle] = 0x010581,[CaseUpper] = 0x010581}}, + {0x0105a9, {[CaseLower] = 0x0105a9,[CaseTitle] = 0x010582,[CaseUpper] = 0x010582}}, + {0x0105aa, {[CaseLower] = 0x0105aa,[CaseTitle] = 0x010583,[CaseUpper] = 0x010583}}, + {0x0105ab, {[CaseLower] = 0x0105ab,[CaseTitle] = 0x010584,[CaseUpper] = 0x010584}}, + {0x0105ac, {[CaseLower] = 0x0105ac,[CaseTitle] = 0x010585,[CaseUpper] = 0x010585}}, + {0x0105ad, {[CaseLower] = 0x0105ad,[CaseTitle] = 0x010586,[CaseUpper] = 0x010586}}, + {0x0105ae, {[CaseLower] = 0x0105ae,[CaseTitle] = 0x010587,[CaseUpper] = 0x010587}}, + {0x0105af, {[CaseLower] = 0x0105af,[CaseTitle] = 0x010588,[CaseUpper] = 0x010588}}, + {0x0105b0, {[CaseLower] = 0x0105b0,[CaseTitle] = 0x010589,[CaseUpper] = 0x010589}}, + {0x0105b1, {[CaseLower] = 0x0105b1,[CaseTitle] = 0x01058a,[CaseUpper] = 0x01058a}}, + {0x0105b3, {[CaseLower] = 0x0105b3,[CaseTitle] = 0x01058c,[CaseUpper] = 0x01058c}}, + {0x0105b4, {[CaseLower] = 0x0105b4,[CaseTitle] = 0x01058d,[CaseUpper] = 0x01058d}}, + {0x0105b5, {[CaseLower] = 0x0105b5,[CaseTitle] = 0x01058e,[CaseUpper] = 0x01058e}}, + {0x0105b6, {[CaseLower] = 0x0105b6,[CaseTitle] = 0x01058f,[CaseUpper] = 0x01058f}}, + {0x0105b7, {[CaseLower] = 0x0105b7,[CaseTitle] = 0x010590,[CaseUpper] = 0x010590}}, + {0x0105b8, {[CaseLower] = 0x0105b8,[CaseTitle] = 0x010591,[CaseUpper] = 0x010591}}, + {0x0105b9, {[CaseLower] = 0x0105b9,[CaseTitle] = 0x010592,[CaseUpper] = 0x010592}}, + {0x0105bb, {[CaseLower] = 0x0105bb,[CaseTitle] = 0x010594,[CaseUpper] = 0x010594}}, + {0x0105bc, {[CaseLower] = 0x0105bc,[CaseTitle] = 0x010595,[CaseUpper] = 0x010595}}, + {0x010c80, {[CaseLower] = 0x010cc0,[CaseTitle] = 0x010c80,[CaseUpper] = 0x010c80}}, + {0x010c81, {[CaseLower] = 0x010cc1,[CaseTitle] = 0x010c81,[CaseUpper] = 0x010c81}}, + {0x010c82, {[CaseLower] = 0x010cc2,[CaseTitle] = 0x010c82,[CaseUpper] = 0x010c82}}, + {0x010c83, {[CaseLower] = 0x010cc3,[CaseTitle] = 0x010c83,[CaseUpper] = 0x010c83}}, + {0x010c84, {[CaseLower] = 0x010cc4,[CaseTitle] = 0x010c84,[CaseUpper] = 0x010c84}}, + {0x010c85, {[CaseLower] = 0x010cc5,[CaseTitle] = 0x010c85,[CaseUpper] = 0x010c85}}, + {0x010c86, {[CaseLower] = 0x010cc6,[CaseTitle] = 0x010c86,[CaseUpper] = 0x010c86}}, + {0x010c87, {[CaseLower] = 0x010cc7,[CaseTitle] = 0x010c87,[CaseUpper] = 0x010c87}}, + {0x010c88, {[CaseLower] = 0x010cc8,[CaseTitle] = 0x010c88,[CaseUpper] = 0x010c88}}, + {0x010c89, {[CaseLower] = 0x010cc9,[CaseTitle] = 0x010c89,[CaseUpper] = 0x010c89}}, + {0x010c8a, {[CaseLower] = 0x010cca,[CaseTitle] = 0x010c8a,[CaseUpper] = 0x010c8a}}, + {0x010c8b, {[CaseLower] = 0x010ccb,[CaseTitle] = 0x010c8b,[CaseUpper] = 0x010c8b}}, + {0x010c8c, {[CaseLower] = 0x010ccc,[CaseTitle] = 0x010c8c,[CaseUpper] = 0x010c8c}}, + {0x010c8d, {[CaseLower] = 0x010ccd,[CaseTitle] = 0x010c8d,[CaseUpper] = 0x010c8d}}, + {0x010c8e, {[CaseLower] = 0x010cce,[CaseTitle] = 0x010c8e,[CaseUpper] = 0x010c8e}}, + {0x010c8f, {[CaseLower] = 0x010ccf,[CaseTitle] = 0x010c8f,[CaseUpper] = 0x010c8f}}, + {0x010c90, {[CaseLower] = 0x010cd0,[CaseTitle] = 0x010c90,[CaseUpper] = 0x010c90}}, + {0x010c91, {[CaseLower] = 0x010cd1,[CaseTitle] = 0x010c91,[CaseUpper] = 0x010c91}}, + {0x010c92, {[CaseLower] = 0x010cd2,[CaseTitle] = 0x010c92,[CaseUpper] = 0x010c92}}, + {0x010c93, {[CaseLower] = 0x010cd3,[CaseTitle] = 0x010c93,[CaseUpper] = 0x010c93}}, + {0x010c94, {[CaseLower] = 0x010cd4,[CaseTitle] = 0x010c94,[CaseUpper] = 0x010c94}}, + {0x010c95, {[CaseLower] = 0x010cd5,[CaseTitle] = 0x010c95,[CaseUpper] = 0x010c95}}, + {0x010c96, {[CaseLower] = 0x010cd6,[CaseTitle] = 0x010c96,[CaseUpper] = 0x010c96}}, + {0x010c97, {[CaseLower] = 0x010cd7,[CaseTitle] = 0x010c97,[CaseUpper] = 0x010c97}}, + {0x010c98, {[CaseLower] = 0x010cd8,[CaseTitle] = 0x010c98,[CaseUpper] = 0x010c98}}, + {0x010c99, {[CaseLower] = 0x010cd9,[CaseTitle] = 0x010c99,[CaseUpper] = 0x010c99}}, + {0x010c9a, {[CaseLower] = 0x010cda,[CaseTitle] = 0x010c9a,[CaseUpper] = 0x010c9a}}, + {0x010c9b, {[CaseLower] = 0x010cdb,[CaseTitle] = 0x010c9b,[CaseUpper] = 0x010c9b}}, + {0x010c9c, {[CaseLower] = 0x010cdc,[CaseTitle] = 0x010c9c,[CaseUpper] = 0x010c9c}}, + {0x010c9d, {[CaseLower] = 0x010cdd,[CaseTitle] = 0x010c9d,[CaseUpper] = 0x010c9d}}, + {0x010c9e, {[CaseLower] = 0x010cde,[CaseTitle] = 0x010c9e,[CaseUpper] = 0x010c9e}}, + {0x010c9f, {[CaseLower] = 0x010cdf,[CaseTitle] = 0x010c9f,[CaseUpper] = 0x010c9f}}, + {0x010ca0, {[CaseLower] = 0x010ce0,[CaseTitle] = 0x010ca0,[CaseUpper] = 0x010ca0}}, + {0x010ca1, {[CaseLower] = 0x010ce1,[CaseTitle] = 0x010ca1,[CaseUpper] = 0x010ca1}}, + {0x010ca2, {[CaseLower] = 0x010ce2,[CaseTitle] = 0x010ca2,[CaseUpper] = 0x010ca2}}, + {0x010ca3, {[CaseLower] = 0x010ce3,[CaseTitle] = 0x010ca3,[CaseUpper] = 0x010ca3}}, + {0x010ca4, {[CaseLower] = 0x010ce4,[CaseTitle] = 0x010ca4,[CaseUpper] = 0x010ca4}}, + {0x010ca5, {[CaseLower] = 0x010ce5,[CaseTitle] = 0x010ca5,[CaseUpper] = 0x010ca5}}, + {0x010ca6, {[CaseLower] = 0x010ce6,[CaseTitle] = 0x010ca6,[CaseUpper] = 0x010ca6}}, + {0x010ca7, {[CaseLower] = 0x010ce7,[CaseTitle] = 0x010ca7,[CaseUpper] = 0x010ca7}}, + {0x010ca8, {[CaseLower] = 0x010ce8,[CaseTitle] = 0x010ca8,[CaseUpper] = 0x010ca8}}, + {0x010ca9, {[CaseLower] = 0x010ce9,[CaseTitle] = 0x010ca9,[CaseUpper] = 0x010ca9}}, + {0x010caa, {[CaseLower] = 0x010cea,[CaseTitle] = 0x010caa,[CaseUpper] = 0x010caa}}, + {0x010cab, {[CaseLower] = 0x010ceb,[CaseTitle] = 0x010cab,[CaseUpper] = 0x010cab}}, + {0x010cac, {[CaseLower] = 0x010cec,[CaseTitle] = 0x010cac,[CaseUpper] = 0x010cac}}, + {0x010cad, {[CaseLower] = 0x010ced,[CaseTitle] = 0x010cad,[CaseUpper] = 0x010cad}}, + {0x010cae, {[CaseLower] = 0x010cee,[CaseTitle] = 0x010cae,[CaseUpper] = 0x010cae}}, + {0x010caf, {[CaseLower] = 0x010cef,[CaseTitle] = 0x010caf,[CaseUpper] = 0x010caf}}, + {0x010cb0, {[CaseLower] = 0x010cf0,[CaseTitle] = 0x010cb0,[CaseUpper] = 0x010cb0}}, + {0x010cb1, {[CaseLower] = 0x010cf1,[CaseTitle] = 0x010cb1,[CaseUpper] = 0x010cb1}}, + {0x010cb2, {[CaseLower] = 0x010cf2,[CaseTitle] = 0x010cb2,[CaseUpper] = 0x010cb2}}, + {0x010cc0, {[CaseLower] = 0x010cc0,[CaseTitle] = 0x010c80,[CaseUpper] = 0x010c80}}, + {0x010cc1, {[CaseLower] = 0x010cc1,[CaseTitle] = 0x010c81,[CaseUpper] = 0x010c81}}, + {0x010cc2, {[CaseLower] = 0x010cc2,[CaseTitle] = 0x010c82,[CaseUpper] = 0x010c82}}, + {0x010cc3, {[CaseLower] = 0x010cc3,[CaseTitle] = 0x010c83,[CaseUpper] = 0x010c83}}, + {0x010cc4, {[CaseLower] = 0x010cc4,[CaseTitle] = 0x010c84,[CaseUpper] = 0x010c84}}, + {0x010cc5, {[CaseLower] = 0x010cc5,[CaseTitle] = 0x010c85,[CaseUpper] = 0x010c85}}, + {0x010cc6, {[CaseLower] = 0x010cc6,[CaseTitle] = 0x010c86,[CaseUpper] = 0x010c86}}, + {0x010cc7, {[CaseLower] = 0x010cc7,[CaseTitle] = 0x010c87,[CaseUpper] = 0x010c87}}, + {0x010cc8, {[CaseLower] = 0x010cc8,[CaseTitle] = 0x010c88,[CaseUpper] = 0x010c88}}, + {0x010cc9, {[CaseLower] = 0x010cc9,[CaseTitle] = 0x010c89,[CaseUpper] = 0x010c89}}, + {0x010cca, {[CaseLower] = 0x010cca,[CaseTitle] = 0x010c8a,[CaseUpper] = 0x010c8a}}, + {0x010ccb, {[CaseLower] = 0x010ccb,[CaseTitle] = 0x010c8b,[CaseUpper] = 0x010c8b}}, + {0x010ccc, {[CaseLower] = 0x010ccc,[CaseTitle] = 0x010c8c,[CaseUpper] = 0x010c8c}}, + {0x010ccd, {[CaseLower] = 0x010ccd,[CaseTitle] = 0x010c8d,[CaseUpper] = 0x010c8d}}, + {0x010cce, {[CaseLower] = 0x010cce,[CaseTitle] = 0x010c8e,[CaseUpper] = 0x010c8e}}, + {0x010ccf, {[CaseLower] = 0x010ccf,[CaseTitle] = 0x010c8f,[CaseUpper] = 0x010c8f}}, + {0x010cd0, {[CaseLower] = 0x010cd0,[CaseTitle] = 0x010c90,[CaseUpper] = 0x010c90}}, + {0x010cd1, {[CaseLower] = 0x010cd1,[CaseTitle] = 0x010c91,[CaseUpper] = 0x010c91}}, + {0x010cd2, {[CaseLower] = 0x010cd2,[CaseTitle] = 0x010c92,[CaseUpper] = 0x010c92}}, + {0x010cd3, {[CaseLower] = 0x010cd3,[CaseTitle] = 0x010c93,[CaseUpper] = 0x010c93}}, + {0x010cd4, {[CaseLower] = 0x010cd4,[CaseTitle] = 0x010c94,[CaseUpper] = 0x010c94}}, + {0x010cd5, {[CaseLower] = 0x010cd5,[CaseTitle] = 0x010c95,[CaseUpper] = 0x010c95}}, + {0x010cd6, {[CaseLower] = 0x010cd6,[CaseTitle] = 0x010c96,[CaseUpper] = 0x010c96}}, + {0x010cd7, {[CaseLower] = 0x010cd7,[CaseTitle] = 0x010c97,[CaseUpper] = 0x010c97}}, + {0x010cd8, {[CaseLower] = 0x010cd8,[CaseTitle] = 0x010c98,[CaseUpper] = 0x010c98}}, + {0x010cd9, {[CaseLower] = 0x010cd9,[CaseTitle] = 0x010c99,[CaseUpper] = 0x010c99}}, + {0x010cda, {[CaseLower] = 0x010cda,[CaseTitle] = 0x010c9a,[CaseUpper] = 0x010c9a}}, + {0x010cdb, {[CaseLower] = 0x010cdb,[CaseTitle] = 0x010c9b,[CaseUpper] = 0x010c9b}}, + {0x010cdc, {[CaseLower] = 0x010cdc,[CaseTitle] = 0x010c9c,[CaseUpper] = 0x010c9c}}, + {0x010cdd, {[CaseLower] = 0x010cdd,[CaseTitle] = 0x010c9d,[CaseUpper] = 0x010c9d}}, + {0x010cde, {[CaseLower] = 0x010cde,[CaseTitle] = 0x010c9e,[CaseUpper] = 0x010c9e}}, + {0x010cdf, {[CaseLower] = 0x010cdf,[CaseTitle] = 0x010c9f,[CaseUpper] = 0x010c9f}}, + {0x010ce0, {[CaseLower] = 0x010ce0,[CaseTitle] = 0x010ca0,[CaseUpper] = 0x010ca0}}, + {0x010ce1, {[CaseLower] = 0x010ce1,[CaseTitle] = 0x010ca1,[CaseUpper] = 0x010ca1}}, + {0x010ce2, {[CaseLower] = 0x010ce2,[CaseTitle] = 0x010ca2,[CaseUpper] = 0x010ca2}}, + {0x010ce3, {[CaseLower] = 0x010ce3,[CaseTitle] = 0x010ca3,[CaseUpper] = 0x010ca3}}, + {0x010ce4, {[CaseLower] = 0x010ce4,[CaseTitle] = 0x010ca4,[CaseUpper] = 0x010ca4}}, + {0x010ce5, {[CaseLower] = 0x010ce5,[CaseTitle] = 0x010ca5,[CaseUpper] = 0x010ca5}}, + {0x010ce6, {[CaseLower] = 0x010ce6,[CaseTitle] = 0x010ca6,[CaseUpper] = 0x010ca6}}, + {0x010ce7, {[CaseLower] = 0x010ce7,[CaseTitle] = 0x010ca7,[CaseUpper] = 0x010ca7}}, + {0x010ce8, {[CaseLower] = 0x010ce8,[CaseTitle] = 0x010ca8,[CaseUpper] = 0x010ca8}}, + {0x010ce9, {[CaseLower] = 0x010ce9,[CaseTitle] = 0x010ca9,[CaseUpper] = 0x010ca9}}, + {0x010cea, {[CaseLower] = 0x010cea,[CaseTitle] = 0x010caa,[CaseUpper] = 0x010caa}}, + {0x010ceb, {[CaseLower] = 0x010ceb,[CaseTitle] = 0x010cab,[CaseUpper] = 0x010cab}}, + {0x010cec, {[CaseLower] = 0x010cec,[CaseTitle] = 0x010cac,[CaseUpper] = 0x010cac}}, + {0x010ced, {[CaseLower] = 0x010ced,[CaseTitle] = 0x010cad,[CaseUpper] = 0x010cad}}, + {0x010cee, {[CaseLower] = 0x010cee,[CaseTitle] = 0x010cae,[CaseUpper] = 0x010cae}}, + {0x010cef, {[CaseLower] = 0x010cef,[CaseTitle] = 0x010caf,[CaseUpper] = 0x010caf}}, + {0x010cf0, {[CaseLower] = 0x010cf0,[CaseTitle] = 0x010cb0,[CaseUpper] = 0x010cb0}}, + {0x010cf1, {[CaseLower] = 0x010cf1,[CaseTitle] = 0x010cb1,[CaseUpper] = 0x010cb1}}, + {0x010cf2, {[CaseLower] = 0x010cf2,[CaseTitle] = 0x010cb2,[CaseUpper] = 0x010cb2}}, + {0x0118a0, {[CaseLower] = 0x0118c0,[CaseTitle] = 0x0118a0,[CaseUpper] = 0x0118a0}}, + {0x0118a1, {[CaseLower] = 0x0118c1,[CaseTitle] = 0x0118a1,[CaseUpper] = 0x0118a1}}, + {0x0118a2, {[CaseLower] = 0x0118c2,[CaseTitle] = 0x0118a2,[CaseUpper] = 0x0118a2}}, + {0x0118a3, {[CaseLower] = 0x0118c3,[CaseTitle] = 0x0118a3,[CaseUpper] = 0x0118a3}}, + {0x0118a4, {[CaseLower] = 0x0118c4,[CaseTitle] = 0x0118a4,[CaseUpper] = 0x0118a4}}, + {0x0118a5, {[CaseLower] = 0x0118c5,[CaseTitle] = 0x0118a5,[CaseUpper] = 0x0118a5}}, + {0x0118a6, {[CaseLower] = 0x0118c6,[CaseTitle] = 0x0118a6,[CaseUpper] = 0x0118a6}}, + {0x0118a7, {[CaseLower] = 0x0118c7,[CaseTitle] = 0x0118a7,[CaseUpper] = 0x0118a7}}, + {0x0118a8, {[CaseLower] = 0x0118c8,[CaseTitle] = 0x0118a8,[CaseUpper] = 0x0118a8}}, + {0x0118a9, {[CaseLower] = 0x0118c9,[CaseTitle] = 0x0118a9,[CaseUpper] = 0x0118a9}}, + {0x0118aa, {[CaseLower] = 0x0118ca,[CaseTitle] = 0x0118aa,[CaseUpper] = 0x0118aa}}, + {0x0118ab, {[CaseLower] = 0x0118cb,[CaseTitle] = 0x0118ab,[CaseUpper] = 0x0118ab}}, + {0x0118ac, {[CaseLower] = 0x0118cc,[CaseTitle] = 0x0118ac,[CaseUpper] = 0x0118ac}}, + {0x0118ad, {[CaseLower] = 0x0118cd,[CaseTitle] = 0x0118ad,[CaseUpper] = 0x0118ad}}, + {0x0118ae, {[CaseLower] = 0x0118ce,[CaseTitle] = 0x0118ae,[CaseUpper] = 0x0118ae}}, + {0x0118af, {[CaseLower] = 0x0118cf,[CaseTitle] = 0x0118af,[CaseUpper] = 0x0118af}}, + {0x0118b0, {[CaseLower] = 0x0118d0,[CaseTitle] = 0x0118b0,[CaseUpper] = 0x0118b0}}, + {0x0118b1, {[CaseLower] = 0x0118d1,[CaseTitle] = 0x0118b1,[CaseUpper] = 0x0118b1}}, + {0x0118b2, {[CaseLower] = 0x0118d2,[CaseTitle] = 0x0118b2,[CaseUpper] = 0x0118b2}}, + {0x0118b3, {[CaseLower] = 0x0118d3,[CaseTitle] = 0x0118b3,[CaseUpper] = 0x0118b3}}, + {0x0118b4, {[CaseLower] = 0x0118d4,[CaseTitle] = 0x0118b4,[CaseUpper] = 0x0118b4}}, + {0x0118b5, {[CaseLower] = 0x0118d5,[CaseTitle] = 0x0118b5,[CaseUpper] = 0x0118b5}}, + {0x0118b6, {[CaseLower] = 0x0118d6,[CaseTitle] = 0x0118b6,[CaseUpper] = 0x0118b6}}, + {0x0118b7, {[CaseLower] = 0x0118d7,[CaseTitle] = 0x0118b7,[CaseUpper] = 0x0118b7}}, + {0x0118b8, {[CaseLower] = 0x0118d8,[CaseTitle] = 0x0118b8,[CaseUpper] = 0x0118b8}}, + {0x0118b9, {[CaseLower] = 0x0118d9,[CaseTitle] = 0x0118b9,[CaseUpper] = 0x0118b9}}, + {0x0118ba, {[CaseLower] = 0x0118da,[CaseTitle] = 0x0118ba,[CaseUpper] = 0x0118ba}}, + {0x0118bb, {[CaseLower] = 0x0118db,[CaseTitle] = 0x0118bb,[CaseUpper] = 0x0118bb}}, + {0x0118bc, {[CaseLower] = 0x0118dc,[CaseTitle] = 0x0118bc,[CaseUpper] = 0x0118bc}}, + {0x0118bd, {[CaseLower] = 0x0118dd,[CaseTitle] = 0x0118bd,[CaseUpper] = 0x0118bd}}, + {0x0118be, {[CaseLower] = 0x0118de,[CaseTitle] = 0x0118be,[CaseUpper] = 0x0118be}}, + {0x0118bf, {[CaseLower] = 0x0118df,[CaseTitle] = 0x0118bf,[CaseUpper] = 0x0118bf}}, + {0x0118c0, {[CaseLower] = 0x0118c0,[CaseTitle] = 0x0118a0,[CaseUpper] = 0x0118a0}}, + {0x0118c1, {[CaseLower] = 0x0118c1,[CaseTitle] = 0x0118a1,[CaseUpper] = 0x0118a1}}, + {0x0118c2, {[CaseLower] = 0x0118c2,[CaseTitle] = 0x0118a2,[CaseUpper] = 0x0118a2}}, + {0x0118c3, {[CaseLower] = 0x0118c3,[CaseTitle] = 0x0118a3,[CaseUpper] = 0x0118a3}}, + {0x0118c4, {[CaseLower] = 0x0118c4,[CaseTitle] = 0x0118a4,[CaseUpper] = 0x0118a4}}, + {0x0118c5, {[CaseLower] = 0x0118c5,[CaseTitle] = 0x0118a5,[CaseUpper] = 0x0118a5}}, + {0x0118c6, {[CaseLower] = 0x0118c6,[CaseTitle] = 0x0118a6,[CaseUpper] = 0x0118a6}}, + {0x0118c7, {[CaseLower] = 0x0118c7,[CaseTitle] = 0x0118a7,[CaseUpper] = 0x0118a7}}, + {0x0118c8, {[CaseLower] = 0x0118c8,[CaseTitle] = 0x0118a8,[CaseUpper] = 0x0118a8}}, + {0x0118c9, {[CaseLower] = 0x0118c9,[CaseTitle] = 0x0118a9,[CaseUpper] = 0x0118a9}}, + {0x0118ca, {[CaseLower] = 0x0118ca,[CaseTitle] = 0x0118aa,[CaseUpper] = 0x0118aa}}, + {0x0118cb, {[CaseLower] = 0x0118cb,[CaseTitle] = 0x0118ab,[CaseUpper] = 0x0118ab}}, + {0x0118cc, {[CaseLower] = 0x0118cc,[CaseTitle] = 0x0118ac,[CaseUpper] = 0x0118ac}}, + {0x0118cd, {[CaseLower] = 0x0118cd,[CaseTitle] = 0x0118ad,[CaseUpper] = 0x0118ad}}, + {0x0118ce, {[CaseLower] = 0x0118ce,[CaseTitle] = 0x0118ae,[CaseUpper] = 0x0118ae}}, + {0x0118cf, {[CaseLower] = 0x0118cf,[CaseTitle] = 0x0118af,[CaseUpper] = 0x0118af}}, + {0x0118d0, {[CaseLower] = 0x0118d0,[CaseTitle] = 0x0118b0,[CaseUpper] = 0x0118b0}}, + {0x0118d1, {[CaseLower] = 0x0118d1,[CaseTitle] = 0x0118b1,[CaseUpper] = 0x0118b1}}, + {0x0118d2, {[CaseLower] = 0x0118d2,[CaseTitle] = 0x0118b2,[CaseUpper] = 0x0118b2}}, + {0x0118d3, {[CaseLower] = 0x0118d3,[CaseTitle] = 0x0118b3,[CaseUpper] = 0x0118b3}}, + {0x0118d4, {[CaseLower] = 0x0118d4,[CaseTitle] = 0x0118b4,[CaseUpper] = 0x0118b4}}, + {0x0118d5, {[CaseLower] = 0x0118d5,[CaseTitle] = 0x0118b5,[CaseUpper] = 0x0118b5}}, + {0x0118d6, {[CaseLower] = 0x0118d6,[CaseTitle] = 0x0118b6,[CaseUpper] = 0x0118b6}}, + {0x0118d7, {[CaseLower] = 0x0118d7,[CaseTitle] = 0x0118b7,[CaseUpper] = 0x0118b7}}, + {0x0118d8, {[CaseLower] = 0x0118d8,[CaseTitle] = 0x0118b8,[CaseUpper] = 0x0118b8}}, + {0x0118d9, {[CaseLower] = 0x0118d9,[CaseTitle] = 0x0118b9,[CaseUpper] = 0x0118b9}}, + {0x0118da, {[CaseLower] = 0x0118da,[CaseTitle] = 0x0118ba,[CaseUpper] = 0x0118ba}}, + {0x0118db, {[CaseLower] = 0x0118db,[CaseTitle] = 0x0118bb,[CaseUpper] = 0x0118bb}}, + {0x0118dc, {[CaseLower] = 0x0118dc,[CaseTitle] = 0x0118bc,[CaseUpper] = 0x0118bc}}, + {0x0118dd, {[CaseLower] = 0x0118dd,[CaseTitle] = 0x0118bd,[CaseUpper] = 0x0118bd}}, + {0x0118de, {[CaseLower] = 0x0118de,[CaseTitle] = 0x0118be,[CaseUpper] = 0x0118be}}, + {0x0118df, {[CaseLower] = 0x0118df,[CaseTitle] = 0x0118bf,[CaseUpper] = 0x0118bf}}, + {0x016e40, {[CaseLower] = 0x016e60,[CaseTitle] = 0x016e40,[CaseUpper] = 0x016e40}}, + {0x016e41, {[CaseLower] = 0x016e61,[CaseTitle] = 0x016e41,[CaseUpper] = 0x016e41}}, + {0x016e42, {[CaseLower] = 0x016e62,[CaseTitle] = 0x016e42,[CaseUpper] = 0x016e42}}, + {0x016e43, {[CaseLower] = 0x016e63,[CaseTitle] = 0x016e43,[CaseUpper] = 0x016e43}}, + {0x016e44, {[CaseLower] = 0x016e64,[CaseTitle] = 0x016e44,[CaseUpper] = 0x016e44}}, + {0x016e45, {[CaseLower] = 0x016e65,[CaseTitle] = 0x016e45,[CaseUpper] = 0x016e45}}, + {0x016e46, {[CaseLower] = 0x016e66,[CaseTitle] = 0x016e46,[CaseUpper] = 0x016e46}}, + {0x016e47, {[CaseLower] = 0x016e67,[CaseTitle] = 0x016e47,[CaseUpper] = 0x016e47}}, + {0x016e48, {[CaseLower] = 0x016e68,[CaseTitle] = 0x016e48,[CaseUpper] = 0x016e48}}, + {0x016e49, {[CaseLower] = 0x016e69,[CaseTitle] = 0x016e49,[CaseUpper] = 0x016e49}}, + {0x016e4a, {[CaseLower] = 0x016e6a,[CaseTitle] = 0x016e4a,[CaseUpper] = 0x016e4a}}, + {0x016e4b, {[CaseLower] = 0x016e6b,[CaseTitle] = 0x016e4b,[CaseUpper] = 0x016e4b}}, + {0x016e4c, {[CaseLower] = 0x016e6c,[CaseTitle] = 0x016e4c,[CaseUpper] = 0x016e4c}}, + {0x016e4d, {[CaseLower] = 0x016e6d,[CaseTitle] = 0x016e4d,[CaseUpper] = 0x016e4d}}, + {0x016e4e, {[CaseLower] = 0x016e6e,[CaseTitle] = 0x016e4e,[CaseUpper] = 0x016e4e}}, + {0x016e4f, {[CaseLower] = 0x016e6f,[CaseTitle] = 0x016e4f,[CaseUpper] = 0x016e4f}}, + {0x016e50, {[CaseLower] = 0x016e70,[CaseTitle] = 0x016e50,[CaseUpper] = 0x016e50}}, + {0x016e51, {[CaseLower] = 0x016e71,[CaseTitle] = 0x016e51,[CaseUpper] = 0x016e51}}, + {0x016e52, {[CaseLower] = 0x016e72,[CaseTitle] = 0x016e52,[CaseUpper] = 0x016e52}}, + {0x016e53, {[CaseLower] = 0x016e73,[CaseTitle] = 0x016e53,[CaseUpper] = 0x016e53}}, + {0x016e54, {[CaseLower] = 0x016e74,[CaseTitle] = 0x016e54,[CaseUpper] = 0x016e54}}, + {0x016e55, {[CaseLower] = 0x016e75,[CaseTitle] = 0x016e55,[CaseUpper] = 0x016e55}}, + {0x016e56, {[CaseLower] = 0x016e76,[CaseTitle] = 0x016e56,[CaseUpper] = 0x016e56}}, + {0x016e57, {[CaseLower] = 0x016e77,[CaseTitle] = 0x016e57,[CaseUpper] = 0x016e57}}, + {0x016e58, {[CaseLower] = 0x016e78,[CaseTitle] = 0x016e58,[CaseUpper] = 0x016e58}}, + {0x016e59, {[CaseLower] = 0x016e79,[CaseTitle] = 0x016e59,[CaseUpper] = 0x016e59}}, + {0x016e5a, {[CaseLower] = 0x016e7a,[CaseTitle] = 0x016e5a,[CaseUpper] = 0x016e5a}}, + {0x016e5b, {[CaseLower] = 0x016e7b,[CaseTitle] = 0x016e5b,[CaseUpper] = 0x016e5b}}, + {0x016e5c, {[CaseLower] = 0x016e7c,[CaseTitle] = 0x016e5c,[CaseUpper] = 0x016e5c}}, + {0x016e5d, {[CaseLower] = 0x016e7d,[CaseTitle] = 0x016e5d,[CaseUpper] = 0x016e5d}}, + {0x016e5e, {[CaseLower] = 0x016e7e,[CaseTitle] = 0x016e5e,[CaseUpper] = 0x016e5e}}, + {0x016e5f, {[CaseLower] = 0x016e7f,[CaseTitle] = 0x016e5f,[CaseUpper] = 0x016e5f}}, + {0x016e60, {[CaseLower] = 0x016e60,[CaseTitle] = 0x016e40,[CaseUpper] = 0x016e40}}, + {0x016e61, {[CaseLower] = 0x016e61,[CaseTitle] = 0x016e41,[CaseUpper] = 0x016e41}}, + {0x016e62, {[CaseLower] = 0x016e62,[CaseTitle] = 0x016e42,[CaseUpper] = 0x016e42}}, + {0x016e63, {[CaseLower] = 0x016e63,[CaseTitle] = 0x016e43,[CaseUpper] = 0x016e43}}, + {0x016e64, {[CaseLower] = 0x016e64,[CaseTitle] = 0x016e44,[CaseUpper] = 0x016e44}}, + {0x016e65, {[CaseLower] = 0x016e65,[CaseTitle] = 0x016e45,[CaseUpper] = 0x016e45}}, + {0x016e66, {[CaseLower] = 0x016e66,[CaseTitle] = 0x016e46,[CaseUpper] = 0x016e46}}, + {0x016e67, {[CaseLower] = 0x016e67,[CaseTitle] = 0x016e47,[CaseUpper] = 0x016e47}}, + {0x016e68, {[CaseLower] = 0x016e68,[CaseTitle] = 0x016e48,[CaseUpper] = 0x016e48}}, + {0x016e69, {[CaseLower] = 0x016e69,[CaseTitle] = 0x016e49,[CaseUpper] = 0x016e49}}, + {0x016e6a, {[CaseLower] = 0x016e6a,[CaseTitle] = 0x016e4a,[CaseUpper] = 0x016e4a}}, + {0x016e6b, {[CaseLower] = 0x016e6b,[CaseTitle] = 0x016e4b,[CaseUpper] = 0x016e4b}}, + {0x016e6c, {[CaseLower] = 0x016e6c,[CaseTitle] = 0x016e4c,[CaseUpper] = 0x016e4c}}, + {0x016e6d, {[CaseLower] = 0x016e6d,[CaseTitle] = 0x016e4d,[CaseUpper] = 0x016e4d}}, + {0x016e6e, {[CaseLower] = 0x016e6e,[CaseTitle] = 0x016e4e,[CaseUpper] = 0x016e4e}}, + {0x016e6f, {[CaseLower] = 0x016e6f,[CaseTitle] = 0x016e4f,[CaseUpper] = 0x016e4f}}, + {0x016e70, {[CaseLower] = 0x016e70,[CaseTitle] = 0x016e50,[CaseUpper] = 0x016e50}}, + {0x016e71, {[CaseLower] = 0x016e71,[CaseTitle] = 0x016e51,[CaseUpper] = 0x016e51}}, + {0x016e72, {[CaseLower] = 0x016e72,[CaseTitle] = 0x016e52,[CaseUpper] = 0x016e52}}, + {0x016e73, {[CaseLower] = 0x016e73,[CaseTitle] = 0x016e53,[CaseUpper] = 0x016e53}}, + {0x016e74, {[CaseLower] = 0x016e74,[CaseTitle] = 0x016e54,[CaseUpper] = 0x016e54}}, + {0x016e75, {[CaseLower] = 0x016e75,[CaseTitle] = 0x016e55,[CaseUpper] = 0x016e55}}, + {0x016e76, {[CaseLower] = 0x016e76,[CaseTitle] = 0x016e56,[CaseUpper] = 0x016e56}}, + {0x016e77, {[CaseLower] = 0x016e77,[CaseTitle] = 0x016e57,[CaseUpper] = 0x016e57}}, + {0x016e78, {[CaseLower] = 0x016e78,[CaseTitle] = 0x016e58,[CaseUpper] = 0x016e58}}, + {0x016e79, {[CaseLower] = 0x016e79,[CaseTitle] = 0x016e59,[CaseUpper] = 0x016e59}}, + {0x016e7a, {[CaseLower] = 0x016e7a,[CaseTitle] = 0x016e5a,[CaseUpper] = 0x016e5a}}, + {0x016e7b, {[CaseLower] = 0x016e7b,[CaseTitle] = 0x016e5b,[CaseUpper] = 0x016e5b}}, + {0x016e7c, {[CaseLower] = 0x016e7c,[CaseTitle] = 0x016e5c,[CaseUpper] = 0x016e5c}}, + {0x016e7d, {[CaseLower] = 0x016e7d,[CaseTitle] = 0x016e5d,[CaseUpper] = 0x016e5d}}, + {0x016e7e, {[CaseLower] = 0x016e7e,[CaseTitle] = 0x016e5e,[CaseUpper] = 0x016e5e}}, + {0x016e7f, {[CaseLower] = 0x016e7f,[CaseTitle] = 0x016e5f,[CaseUpper] = 0x016e5f}}, + {0x01e900, {[CaseLower] = 0x01e922,[CaseTitle] = 0x01e900,[CaseUpper] = 0x01e900}}, + {0x01e901, {[CaseLower] = 0x01e923,[CaseTitle] = 0x01e901,[CaseUpper] = 0x01e901}}, + {0x01e902, {[CaseLower] = 0x01e924,[CaseTitle] = 0x01e902,[CaseUpper] = 0x01e902}}, + {0x01e903, {[CaseLower] = 0x01e925,[CaseTitle] = 0x01e903,[CaseUpper] = 0x01e903}}, + {0x01e904, {[CaseLower] = 0x01e926,[CaseTitle] = 0x01e904,[CaseUpper] = 0x01e904}}, + {0x01e905, {[CaseLower] = 0x01e927,[CaseTitle] = 0x01e905,[CaseUpper] = 0x01e905}}, + {0x01e906, {[CaseLower] = 0x01e928,[CaseTitle] = 0x01e906,[CaseUpper] = 0x01e906}}, + {0x01e907, {[CaseLower] = 0x01e929,[CaseTitle] = 0x01e907,[CaseUpper] = 0x01e907}}, + {0x01e908, {[CaseLower] = 0x01e92a,[CaseTitle] = 0x01e908,[CaseUpper] = 0x01e908}}, + {0x01e909, {[CaseLower] = 0x01e92b,[CaseTitle] = 0x01e909,[CaseUpper] = 0x01e909}}, + {0x01e90a, {[CaseLower] = 0x01e92c,[CaseTitle] = 0x01e90a,[CaseUpper] = 0x01e90a}}, + {0x01e90b, {[CaseLower] = 0x01e92d,[CaseTitle] = 0x01e90b,[CaseUpper] = 0x01e90b}}, + {0x01e90c, {[CaseLower] = 0x01e92e,[CaseTitle] = 0x01e90c,[CaseUpper] = 0x01e90c}}, + {0x01e90d, {[CaseLower] = 0x01e92f,[CaseTitle] = 0x01e90d,[CaseUpper] = 0x01e90d}}, + {0x01e90e, {[CaseLower] = 0x01e930,[CaseTitle] = 0x01e90e,[CaseUpper] = 0x01e90e}}, + {0x01e90f, {[CaseLower] = 0x01e931,[CaseTitle] = 0x01e90f,[CaseUpper] = 0x01e90f}}, + {0x01e910, {[CaseLower] = 0x01e932,[CaseTitle] = 0x01e910,[CaseUpper] = 0x01e910}}, + {0x01e911, {[CaseLower] = 0x01e933,[CaseTitle] = 0x01e911,[CaseUpper] = 0x01e911}}, + {0x01e912, {[CaseLower] = 0x01e934,[CaseTitle] = 0x01e912,[CaseUpper] = 0x01e912}}, + {0x01e913, {[CaseLower] = 0x01e935,[CaseTitle] = 0x01e913,[CaseUpper] = 0x01e913}}, + {0x01e914, {[CaseLower] = 0x01e936,[CaseTitle] = 0x01e914,[CaseUpper] = 0x01e914}}, + {0x01e915, {[CaseLower] = 0x01e937,[CaseTitle] = 0x01e915,[CaseUpper] = 0x01e915}}, + {0x01e916, {[CaseLower] = 0x01e938,[CaseTitle] = 0x01e916,[CaseUpper] = 0x01e916}}, + {0x01e917, {[CaseLower] = 0x01e939,[CaseTitle] = 0x01e917,[CaseUpper] = 0x01e917}}, + {0x01e918, {[CaseLower] = 0x01e93a,[CaseTitle] = 0x01e918,[CaseUpper] = 0x01e918}}, + {0x01e919, {[CaseLower] = 0x01e93b,[CaseTitle] = 0x01e919,[CaseUpper] = 0x01e919}}, + {0x01e91a, {[CaseLower] = 0x01e93c,[CaseTitle] = 0x01e91a,[CaseUpper] = 0x01e91a}}, + {0x01e91b, {[CaseLower] = 0x01e93d,[CaseTitle] = 0x01e91b,[CaseUpper] = 0x01e91b}}, + {0x01e91c, {[CaseLower] = 0x01e93e,[CaseTitle] = 0x01e91c,[CaseUpper] = 0x01e91c}}, + {0x01e91d, {[CaseLower] = 0x01e93f,[CaseTitle] = 0x01e91d,[CaseUpper] = 0x01e91d}}, + {0x01e91e, {[CaseLower] = 0x01e940,[CaseTitle] = 0x01e91e,[CaseUpper] = 0x01e91e}}, + {0x01e91f, {[CaseLower] = 0x01e941,[CaseTitle] = 0x01e91f,[CaseUpper] = 0x01e91f}}, + {0x01e920, {[CaseLower] = 0x01e942,[CaseTitle] = 0x01e920,[CaseUpper] = 0x01e920}}, + {0x01e921, {[CaseLower] = 0x01e943,[CaseTitle] = 0x01e921,[CaseUpper] = 0x01e921}}, + {0x01e922, {[CaseLower] = 0x01e922,[CaseTitle] = 0x01e900,[CaseUpper] = 0x01e900}}, + {0x01e923, {[CaseLower] = 0x01e923,[CaseTitle] = 0x01e901,[CaseUpper] = 0x01e901}}, + {0x01e924, {[CaseLower] = 0x01e924,[CaseTitle] = 0x01e902,[CaseUpper] = 0x01e902}}, + {0x01e925, {[CaseLower] = 0x01e925,[CaseTitle] = 0x01e903,[CaseUpper] = 0x01e903}}, + {0x01e926, {[CaseLower] = 0x01e926,[CaseTitle] = 0x01e904,[CaseUpper] = 0x01e904}}, + {0x01e927, {[CaseLower] = 0x01e927,[CaseTitle] = 0x01e905,[CaseUpper] = 0x01e905}}, + {0x01e928, {[CaseLower] = 0x01e928,[CaseTitle] = 0x01e906,[CaseUpper] = 0x01e906}}, + {0x01e929, {[CaseLower] = 0x01e929,[CaseTitle] = 0x01e907,[CaseUpper] = 0x01e907}}, + {0x01e92a, {[CaseLower] = 0x01e92a,[CaseTitle] = 0x01e908,[CaseUpper] = 0x01e908}}, + {0x01e92b, {[CaseLower] = 0x01e92b,[CaseTitle] = 0x01e909,[CaseUpper] = 0x01e909}}, + {0x01e92c, {[CaseLower] = 0x01e92c,[CaseTitle] = 0x01e90a,[CaseUpper] = 0x01e90a}}, + {0x01e92d, {[CaseLower] = 0x01e92d,[CaseTitle] = 0x01e90b,[CaseUpper] = 0x01e90b}}, + {0x01e92e, {[CaseLower] = 0x01e92e,[CaseTitle] = 0x01e90c,[CaseUpper] = 0x01e90c}}, + {0x01e92f, {[CaseLower] = 0x01e92f,[CaseTitle] = 0x01e90d,[CaseUpper] = 0x01e90d}}, + {0x01e930, {[CaseLower] = 0x01e930,[CaseTitle] = 0x01e90e,[CaseUpper] = 0x01e90e}}, + {0x01e931, {[CaseLower] = 0x01e931,[CaseTitle] = 0x01e90f,[CaseUpper] = 0x01e90f}}, + {0x01e932, {[CaseLower] = 0x01e932,[CaseTitle] = 0x01e910,[CaseUpper] = 0x01e910}}, + {0x01e933, {[CaseLower] = 0x01e933,[CaseTitle] = 0x01e911,[CaseUpper] = 0x01e911}}, + {0x01e934, {[CaseLower] = 0x01e934,[CaseTitle] = 0x01e912,[CaseUpper] = 0x01e912}}, + {0x01e935, {[CaseLower] = 0x01e935,[CaseTitle] = 0x01e913,[CaseUpper] = 0x01e913}}, + {0x01e936, {[CaseLower] = 0x01e936,[CaseTitle] = 0x01e914,[CaseUpper] = 0x01e914}}, + {0x01e937, {[CaseLower] = 0x01e937,[CaseTitle] = 0x01e915,[CaseUpper] = 0x01e915}}, + {0x01e938, {[CaseLower] = 0x01e938,[CaseTitle] = 0x01e916,[CaseUpper] = 0x01e916}}, + {0x01e939, {[CaseLower] = 0x01e939,[CaseTitle] = 0x01e917,[CaseUpper] = 0x01e917}}, + {0x01e93a, {[CaseLower] = 0x01e93a,[CaseTitle] = 0x01e918,[CaseUpper] = 0x01e918}}, + {0x01e93b, {[CaseLower] = 0x01e93b,[CaseTitle] = 0x01e919,[CaseUpper] = 0x01e919}}, + {0x01e93c, {[CaseLower] = 0x01e93c,[CaseTitle] = 0x01e91a,[CaseUpper] = 0x01e91a}}, + {0x01e93d, {[CaseLower] = 0x01e93d,[CaseTitle] = 0x01e91b,[CaseUpper] = 0x01e91b}}, + {0x01e93e, {[CaseLower] = 0x01e93e,[CaseTitle] = 0x01e91c,[CaseUpper] = 0x01e91c}}, + {0x01e93f, {[CaseLower] = 0x01e93f,[CaseTitle] = 0x01e91d,[CaseUpper] = 0x01e91d}}, + {0x01e940, {[CaseLower] = 0x01e940,[CaseTitle] = 0x01e91e,[CaseUpper] = 0x01e91e}}, + {0x01e941, {[CaseLower] = 0x01e941,[CaseTitle] = 0x01e91f,[CaseUpper] = 0x01e91f}}, + {0x01e942, {[CaseLower] = 0x01e942,[CaseTitle] = 0x01e920,[CaseUpper] = 0x01e920}}, + {0x01e943, {[CaseLower] = 0x01e943,[CaseTitle] = 0x01e921,[CaseUpper] = 0x01e921}}, +}; diff --git a/src/include/common/unicode_category.h b/src/include/common/unicode_category.h new file mode 100644 index 0000000000000..a68f9eb8c89b2 --- /dev/null +++ b/src/include/common/unicode_category.h @@ -0,0 +1,91 @@ +/*------------------------------------------------------------------------- + * + * unicode_category.h + * Routines for determining the category of Unicode characters. + * + * These definitions can be used by both frontend and backend code. + * + * Copyright (c) 2017-2024, PostgreSQL Global Development Group + * + * src/include/common/unicode_category.h + * + *------------------------------------------------------------------------- + */ +#ifndef UNICODE_CATEGORY_H +#define UNICODE_CATEGORY_H + +#include "mb/pg_wchar.h" + +/* + * Unicode General Category Values + * + * See: https://www.unicode.org/reports/tr44/#General_Category_Values + * + * The Unicode stability policy guarantees: "The enumeration of + * General_Category property values is fixed. No new values will be + * added". See: https://www.unicode.org/policies/stability_policy.html + * + * Numeric values chosen to match corresponding ICU UCharCategory. + */ +typedef enum pg_unicode_category +{ + PG_U_UNASSIGNED = 0, /* Cn */ + PG_U_UPPERCASE_LETTER = 1, /* Lu */ + PG_U_LOWERCASE_LETTER = 2, /* Ll */ + PG_U_TITLECASE_LETTER = 3, /* Lt */ + PG_U_MODIFIER_LETTER = 4, /* Lm */ + PG_U_OTHER_LETTER = 5, /* Lo */ + PG_U_NONSPACING_MARK = 6, /* Mn */ + PG_U_ENCLOSING_MARK = 7, /* Me */ + PG_U_SPACING_MARK = 8, /* Mc */ + PG_U_DECIMAL_NUMBER = 9, /* Nd */ + PG_U_LETTER_NUMBER = 10, /* Nl */ + PG_U_OTHER_NUMBER = 11, /* No */ + PG_U_SPACE_SEPARATOR = 12, /* Zs */ + PG_U_LINE_SEPARATOR = 13, /* Zl */ + PG_U_PARAGRAPH_SEPARATOR = 14, /* Zp */ + PG_U_CONTROL = 15, /* Cc */ + PG_U_FORMAT = 16, /* Cf */ + PG_U_PRIVATE_USE = 17, /* Co */ + PG_U_SURROGATE = 18, /* Cs */ + PG_U_DASH_PUNCTUATION = 19, /* Pd */ + PG_U_OPEN_PUNCTUATION = 20, /* Ps */ + PG_U_CLOSE_PUNCTUATION = 21, /* Pe */ + PG_U_CONNECTOR_PUNCTUATION = 22, /* Pc */ + PG_U_OTHER_PUNCTUATION = 23, /* Po */ + PG_U_MATH_SYMBOL = 24, /* Sm */ + PG_U_CURRENCY_SYMBOL = 25, /* Sc */ + PG_U_MODIFIER_SYMBOL = 26, /* Sk */ + PG_U_OTHER_SYMBOL = 27, /* So */ + PG_U_INITIAL_PUNCTUATION = 28, /* Pi */ + PG_U_FINAL_PUNCTUATION = 29 /* Pf */ +} pg_unicode_category; + +extern pg_unicode_category unicode_category(pg_wchar code); +extern const char *unicode_category_string(pg_unicode_category category); +extern const char *unicode_category_abbrev(pg_unicode_category category); + +extern bool pg_u_prop_alphabetic(pg_wchar code); +extern bool pg_u_prop_lowercase(pg_wchar code); +extern bool pg_u_prop_uppercase(pg_wchar code); +extern bool pg_u_prop_cased(pg_wchar code); +extern bool pg_u_prop_case_ignorable(pg_wchar code); +extern bool pg_u_prop_white_space(pg_wchar code); +extern bool pg_u_prop_hex_digit(pg_wchar code); +extern bool pg_u_prop_join_control(pg_wchar code); + +extern bool pg_u_isdigit(pg_wchar code, bool posix); +extern bool pg_u_isalpha(pg_wchar code); +extern bool pg_u_isalnum(pg_wchar code, bool posix); +extern bool pg_u_isword(pg_wchar code); +extern bool pg_u_isupper(pg_wchar code); +extern bool pg_u_islower(pg_wchar code); +extern bool pg_u_isblank(pg_wchar code); +extern bool pg_u_iscntrl(pg_wchar code); +extern bool pg_u_isgraph(pg_wchar code); +extern bool pg_u_isprint(pg_wchar code); +extern bool pg_u_ispunct(pg_wchar code, bool posix); +extern bool pg_u_isspace(pg_wchar code); +extern bool pg_u_isxdigit(pg_wchar code, bool posix); + +#endif /* UNICODE_CATEGORY_H */ diff --git a/src/include/common/unicode_category_table.h b/src/include/common/unicode_category_table.h new file mode 100644 index 0000000000000..65ea5141fca99 --- /dev/null +++ b/src/include/common/unicode_category_table.h @@ -0,0 +1,7025 @@ +/*------------------------------------------------------------------------- + * + * unicode_category_table.h + * Category table for Unicode character classification. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/common/unicode_category_table.h + * + *------------------------------------------------------------------------- + */ + +#include "common/unicode_category.h" + +/* + * File auto-generated by src/common/unicode/generate-unicode_category_table.pl, + * do not edit. There is deliberately not an #ifndef PG_UNICODE_CATEGORY_TABLE_H + * here. + */ +typedef struct +{ + uint32 first; /* Unicode codepoint */ + uint32 last; /* Unicode codepoint */ + uint8 category; /* General Category */ +} pg_category_range; + +typedef struct +{ + uint32 first; /* Unicode codepoint */ + uint32 last; /* Unicode codepoint */ +} pg_unicode_range; + +typedef struct +{ + uint8 category; + uint8 properties; +} pg_unicode_properties; + +/* + * The properties currently used, in no particular order. Fits in a uint8, but + * if more properties are added, a wider integer will be needed. + */ +#define PG_U_PROP_ALPHABETIC (1 << 0) +#define PG_U_PROP_LOWERCASE (1 << 1) +#define PG_U_PROP_UPPERCASE (1 << 2) +#define PG_U_PROP_CASED (1 << 3) +#define PG_U_PROP_CASE_IGNORABLE (1 << 4) +#define PG_U_PROP_WHITE_SPACE (1 << 5) +#define PG_U_PROP_JOIN_CONTROL (1 << 6) +#define PG_U_PROP_HEX_DIGIT (1 << 7) + +/* table for fast lookup of ASCII codepoints */ +static const pg_unicode_properties unicode_opt_ascii[128] = +{ + { + /* 0x000000 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000001 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000002 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000003 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000004 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000005 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000006 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000007 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000008 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000009 */ + .category = PG_U_CONTROL, + .properties = PG_U_PROP_WHITE_SPACE + }, + { + /* 0x00000a */ + .category = PG_U_CONTROL, + .properties = PG_U_PROP_WHITE_SPACE + }, + { + /* 0x00000b */ + .category = PG_U_CONTROL, + .properties = PG_U_PROP_WHITE_SPACE + }, + { + /* 0x00000c */ + .category = PG_U_CONTROL, + .properties = PG_U_PROP_WHITE_SPACE + }, + { + /* 0x00000d */ + .category = PG_U_CONTROL, + .properties = PG_U_PROP_WHITE_SPACE + }, + { + /* 0x00000e */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x00000f */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000010 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000011 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000012 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000013 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000014 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000015 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000016 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000017 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000018 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000019 */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x00001a */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x00001b */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x00001c */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x00001d */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x00001e */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x00001f */ + .category = PG_U_CONTROL, + .properties = 0 + }, + { + /* 0x000020 */ + .category = PG_U_SPACE_SEPARATOR, + .properties = PG_U_PROP_WHITE_SPACE + }, + { + /* 0x000021 */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = 0 + }, + { + /* 0x000022 */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = 0 + }, + { + /* 0x000023 */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = 0 + }, + { + /* 0x000024 */ + .category = PG_U_CURRENCY_SYMBOL, + .properties = 0 + }, + { + /* 0x000025 */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = 0 + }, + { + /* 0x000026 */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = 0 + }, + { + /* 0x000027 */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = PG_U_PROP_CASE_IGNORABLE + }, + { + /* 0x000028 */ + .category = PG_U_OPEN_PUNCTUATION, + .properties = 0 + }, + { + /* 0x000029 */ + .category = PG_U_CLOSE_PUNCTUATION, + .properties = 0 + }, + { + /* 0x00002a */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = 0 + }, + { + /* 0x00002b */ + .category = PG_U_MATH_SYMBOL, + .properties = 0 + }, + { + /* 0x00002c */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = 0 + }, + { + /* 0x00002d */ + .category = PG_U_DASH_PUNCTUATION, + .properties = 0 + }, + { + /* 0x00002e */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = PG_U_PROP_CASE_IGNORABLE + }, + { + /* 0x00002f */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = 0 + }, + { + /* 0x000030 */ + .category = PG_U_DECIMAL_NUMBER, + .properties = PG_U_PROP_HEX_DIGIT + }, + { + /* 0x000031 */ + .category = PG_U_DECIMAL_NUMBER, + .properties = PG_U_PROP_HEX_DIGIT + }, + { + /* 0x000032 */ + .category = PG_U_DECIMAL_NUMBER, + .properties = PG_U_PROP_HEX_DIGIT + }, + { + /* 0x000033 */ + .category = PG_U_DECIMAL_NUMBER, + .properties = PG_U_PROP_HEX_DIGIT + }, + { + /* 0x000034 */ + .category = PG_U_DECIMAL_NUMBER, + .properties = PG_U_PROP_HEX_DIGIT + }, + { + /* 0x000035 */ + .category = PG_U_DECIMAL_NUMBER, + .properties = PG_U_PROP_HEX_DIGIT + }, + { + /* 0x000036 */ + .category = PG_U_DECIMAL_NUMBER, + .properties = PG_U_PROP_HEX_DIGIT + }, + { + /* 0x000037 */ + .category = PG_U_DECIMAL_NUMBER, + .properties = PG_U_PROP_HEX_DIGIT + }, + { + /* 0x000038 */ + .category = PG_U_DECIMAL_NUMBER, + .properties = PG_U_PROP_HEX_DIGIT + }, + { + /* 0x000039 */ + .category = PG_U_DECIMAL_NUMBER, + .properties = PG_U_PROP_HEX_DIGIT + }, + { + /* 0x00003a */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = PG_U_PROP_CASE_IGNORABLE + }, + { + /* 0x00003b */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = 0 + }, + { + /* 0x00003c */ + .category = PG_U_MATH_SYMBOL, + .properties = 0 + }, + { + /* 0x00003d */ + .category = PG_U_MATH_SYMBOL, + .properties = 0 + }, + { + /* 0x00003e */ + .category = PG_U_MATH_SYMBOL, + .properties = 0 + }, + { + /* 0x00003f */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = 0 + }, + { + /* 0x000040 */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = 0 + }, + { + /* 0x000041 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_HEX_DIGIT | PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000042 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_HEX_DIGIT | PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000043 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_HEX_DIGIT | PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000044 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_HEX_DIGIT | PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000045 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_HEX_DIGIT | PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000046 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_HEX_DIGIT | PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000047 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000048 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000049 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x00004a */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x00004b */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x00004c */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x00004d */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x00004e */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x00004f */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000050 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000051 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000052 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000053 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000054 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000055 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000056 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000057 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000058 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x000059 */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x00005a */ + .category = PG_U_UPPERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_UPPERCASE | PG_U_PROP_CASED + }, + { + /* 0x00005b */ + .category = PG_U_OPEN_PUNCTUATION, + .properties = 0 + }, + { + /* 0x00005c */ + .category = PG_U_OTHER_PUNCTUATION, + .properties = 0 + }, + { + /* 0x00005d */ + .category = PG_U_CLOSE_PUNCTUATION, + .properties = 0 + }, + { + /* 0x00005e */ + .category = PG_U_MODIFIER_SYMBOL, + .properties = PG_U_PROP_CASE_IGNORABLE + }, + { + /* 0x00005f */ + .category = PG_U_CONNECTOR_PUNCTUATION, + .properties = 0 + }, + { + /* 0x000060 */ + .category = PG_U_MODIFIER_SYMBOL, + .properties = PG_U_PROP_CASE_IGNORABLE + }, + { + /* 0x000061 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_HEX_DIGIT | PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000062 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_HEX_DIGIT | PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000063 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_HEX_DIGIT | PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000064 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_HEX_DIGIT | PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000065 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_HEX_DIGIT | PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000066 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_HEX_DIGIT | PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000067 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000068 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000069 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x00006a */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x00006b */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x00006c */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x00006d */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x00006e */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x00006f */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000070 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000071 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000072 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000073 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000074 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000075 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000076 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000077 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000078 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x000079 */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x00007a */ + .category = PG_U_LOWERCASE_LETTER, + .properties = PG_U_PROP_ALPHABETIC | PG_U_PROP_LOWERCASE | PG_U_PROP_CASED + }, + { + /* 0x00007b */ + .category = PG_U_OPEN_PUNCTUATION, + .properties = 0 + }, + { + /* 0x00007c */ + .category = PG_U_MATH_SYMBOL, + .properties = 0 + }, + { + /* 0x00007d */ + .category = PG_U_CLOSE_PUNCTUATION, + .properties = 0 + }, + { + /* 0x00007e */ + .category = PG_U_MATH_SYMBOL, + .properties = 0 + }, + { + /* 0x00007f */ + .category = PG_U_CONTROL, + .properties = 0 + }, +}; + +/* table of Unicode codepoint ranges and their categories */ +static const pg_category_range unicode_categories[3302] = +{ + {0x000000, 0x00001f, PG_U_CONTROL}, + {0x000020, 0x000020, PG_U_SPACE_SEPARATOR}, + {0x000021, 0x000023, PG_U_OTHER_PUNCTUATION}, + {0x000024, 0x000024, PG_U_CURRENCY_SYMBOL}, + {0x000025, 0x000027, PG_U_OTHER_PUNCTUATION}, + {0x000028, 0x000028, PG_U_OPEN_PUNCTUATION}, + {0x000029, 0x000029, PG_U_CLOSE_PUNCTUATION}, + {0x00002a, 0x00002a, PG_U_OTHER_PUNCTUATION}, + {0x00002b, 0x00002b, PG_U_MATH_SYMBOL}, + {0x00002c, 0x00002c, PG_U_OTHER_PUNCTUATION}, + {0x00002d, 0x00002d, PG_U_DASH_PUNCTUATION}, + {0x00002e, 0x00002f, PG_U_OTHER_PUNCTUATION}, + {0x000030, 0x000039, PG_U_DECIMAL_NUMBER}, + {0x00003a, 0x00003b, PG_U_OTHER_PUNCTUATION}, + {0x00003c, 0x00003e, PG_U_MATH_SYMBOL}, + {0x00003f, 0x000040, PG_U_OTHER_PUNCTUATION}, + {0x000041, 0x00005a, PG_U_UPPERCASE_LETTER}, + {0x00005b, 0x00005b, PG_U_OPEN_PUNCTUATION}, + {0x00005c, 0x00005c, PG_U_OTHER_PUNCTUATION}, + {0x00005d, 0x00005d, PG_U_CLOSE_PUNCTUATION}, + {0x00005e, 0x00005e, PG_U_MODIFIER_SYMBOL}, + {0x00005f, 0x00005f, PG_U_CONNECTOR_PUNCTUATION}, + {0x000060, 0x000060, PG_U_MODIFIER_SYMBOL}, + {0x000061, 0x00007a, PG_U_LOWERCASE_LETTER}, + {0x00007b, 0x00007b, PG_U_OPEN_PUNCTUATION}, + {0x00007c, 0x00007c, PG_U_MATH_SYMBOL}, + {0x00007d, 0x00007d, PG_U_CLOSE_PUNCTUATION}, + {0x00007e, 0x00007e, PG_U_MATH_SYMBOL}, + {0x00007f, 0x00009f, PG_U_CONTROL}, + {0x0000a0, 0x0000a0, PG_U_SPACE_SEPARATOR}, + {0x0000a1, 0x0000a1, PG_U_OTHER_PUNCTUATION}, + {0x0000a2, 0x0000a5, PG_U_CURRENCY_SYMBOL}, + {0x0000a6, 0x0000a6, PG_U_OTHER_SYMBOL}, + {0x0000a7, 0x0000a7, PG_U_OTHER_PUNCTUATION}, + {0x0000a8, 0x0000a8, PG_U_MODIFIER_SYMBOL}, + {0x0000a9, 0x0000a9, PG_U_OTHER_SYMBOL}, + {0x0000aa, 0x0000aa, PG_U_OTHER_LETTER}, + {0x0000ab, 0x0000ab, PG_U_INITIAL_PUNCTUATION}, + {0x0000ac, 0x0000ac, PG_U_MATH_SYMBOL}, + {0x0000ad, 0x0000ad, PG_U_FORMAT}, + {0x0000ae, 0x0000ae, PG_U_OTHER_SYMBOL}, + {0x0000af, 0x0000af, PG_U_MODIFIER_SYMBOL}, + {0x0000b0, 0x0000b0, PG_U_OTHER_SYMBOL}, + {0x0000b1, 0x0000b1, PG_U_MATH_SYMBOL}, + {0x0000b2, 0x0000b3, PG_U_OTHER_NUMBER}, + {0x0000b4, 0x0000b4, PG_U_MODIFIER_SYMBOL}, + {0x0000b5, 0x0000b5, PG_U_LOWERCASE_LETTER}, + {0x0000b6, 0x0000b7, PG_U_OTHER_PUNCTUATION}, + {0x0000b8, 0x0000b8, PG_U_MODIFIER_SYMBOL}, + {0x0000b9, 0x0000b9, PG_U_OTHER_NUMBER}, + {0x0000ba, 0x0000ba, PG_U_OTHER_LETTER}, + {0x0000bb, 0x0000bb, PG_U_FINAL_PUNCTUATION}, + {0x0000bc, 0x0000be, PG_U_OTHER_NUMBER}, + {0x0000bf, 0x0000bf, PG_U_OTHER_PUNCTUATION}, + {0x0000c0, 0x0000d6, PG_U_UPPERCASE_LETTER}, + {0x0000d7, 0x0000d7, PG_U_MATH_SYMBOL}, + {0x0000d8, 0x0000de, PG_U_UPPERCASE_LETTER}, + {0x0000df, 0x0000f6, PG_U_LOWERCASE_LETTER}, + {0x0000f7, 0x0000f7, PG_U_MATH_SYMBOL}, + {0x0000f8, 0x0000ff, PG_U_LOWERCASE_LETTER}, + {0x000100, 0x000100, PG_U_UPPERCASE_LETTER}, + {0x000101, 0x000101, PG_U_LOWERCASE_LETTER}, + {0x000102, 0x000102, PG_U_UPPERCASE_LETTER}, + {0x000103, 0x000103, PG_U_LOWERCASE_LETTER}, + {0x000104, 0x000104, PG_U_UPPERCASE_LETTER}, + {0x000105, 0x000105, PG_U_LOWERCASE_LETTER}, + {0x000106, 0x000106, PG_U_UPPERCASE_LETTER}, + {0x000107, 0x000107, PG_U_LOWERCASE_LETTER}, + {0x000108, 0x000108, PG_U_UPPERCASE_LETTER}, + {0x000109, 0x000109, PG_U_LOWERCASE_LETTER}, + {0x00010a, 0x00010a, PG_U_UPPERCASE_LETTER}, + {0x00010b, 0x00010b, PG_U_LOWERCASE_LETTER}, + {0x00010c, 0x00010c, PG_U_UPPERCASE_LETTER}, + {0x00010d, 0x00010d, PG_U_LOWERCASE_LETTER}, + {0x00010e, 0x00010e, PG_U_UPPERCASE_LETTER}, + {0x00010f, 0x00010f, PG_U_LOWERCASE_LETTER}, + {0x000110, 0x000110, PG_U_UPPERCASE_LETTER}, + {0x000111, 0x000111, PG_U_LOWERCASE_LETTER}, + {0x000112, 0x000112, PG_U_UPPERCASE_LETTER}, + {0x000113, 0x000113, PG_U_LOWERCASE_LETTER}, + {0x000114, 0x000114, PG_U_UPPERCASE_LETTER}, + {0x000115, 0x000115, PG_U_LOWERCASE_LETTER}, + {0x000116, 0x000116, PG_U_UPPERCASE_LETTER}, + {0x000117, 0x000117, PG_U_LOWERCASE_LETTER}, + {0x000118, 0x000118, PG_U_UPPERCASE_LETTER}, + {0x000119, 0x000119, PG_U_LOWERCASE_LETTER}, + {0x00011a, 0x00011a, PG_U_UPPERCASE_LETTER}, + {0x00011b, 0x00011b, PG_U_LOWERCASE_LETTER}, + {0x00011c, 0x00011c, PG_U_UPPERCASE_LETTER}, + {0x00011d, 0x00011d, PG_U_LOWERCASE_LETTER}, + {0x00011e, 0x00011e, PG_U_UPPERCASE_LETTER}, + {0x00011f, 0x00011f, PG_U_LOWERCASE_LETTER}, + {0x000120, 0x000120, PG_U_UPPERCASE_LETTER}, + {0x000121, 0x000121, PG_U_LOWERCASE_LETTER}, + {0x000122, 0x000122, PG_U_UPPERCASE_LETTER}, + {0x000123, 0x000123, PG_U_LOWERCASE_LETTER}, + {0x000124, 0x000124, PG_U_UPPERCASE_LETTER}, + {0x000125, 0x000125, PG_U_LOWERCASE_LETTER}, + {0x000126, 0x000126, PG_U_UPPERCASE_LETTER}, + {0x000127, 0x000127, PG_U_LOWERCASE_LETTER}, + {0x000128, 0x000128, PG_U_UPPERCASE_LETTER}, + {0x000129, 0x000129, PG_U_LOWERCASE_LETTER}, + {0x00012a, 0x00012a, PG_U_UPPERCASE_LETTER}, + {0x00012b, 0x00012b, PG_U_LOWERCASE_LETTER}, + {0x00012c, 0x00012c, PG_U_UPPERCASE_LETTER}, + {0x00012d, 0x00012d, PG_U_LOWERCASE_LETTER}, + {0x00012e, 0x00012e, PG_U_UPPERCASE_LETTER}, + {0x00012f, 0x00012f, PG_U_LOWERCASE_LETTER}, + {0x000130, 0x000130, PG_U_UPPERCASE_LETTER}, + {0x000131, 0x000131, PG_U_LOWERCASE_LETTER}, + {0x000132, 0x000132, PG_U_UPPERCASE_LETTER}, + {0x000133, 0x000133, PG_U_LOWERCASE_LETTER}, + {0x000134, 0x000134, PG_U_UPPERCASE_LETTER}, + {0x000135, 0x000135, PG_U_LOWERCASE_LETTER}, + {0x000136, 0x000136, PG_U_UPPERCASE_LETTER}, + {0x000137, 0x000138, PG_U_LOWERCASE_LETTER}, + {0x000139, 0x000139, PG_U_UPPERCASE_LETTER}, + {0x00013a, 0x00013a, PG_U_LOWERCASE_LETTER}, + {0x00013b, 0x00013b, PG_U_UPPERCASE_LETTER}, + {0x00013c, 0x00013c, PG_U_LOWERCASE_LETTER}, + {0x00013d, 0x00013d, PG_U_UPPERCASE_LETTER}, + {0x00013e, 0x00013e, PG_U_LOWERCASE_LETTER}, + {0x00013f, 0x00013f, PG_U_UPPERCASE_LETTER}, + {0x000140, 0x000140, PG_U_LOWERCASE_LETTER}, + {0x000141, 0x000141, PG_U_UPPERCASE_LETTER}, + {0x000142, 0x000142, PG_U_LOWERCASE_LETTER}, + {0x000143, 0x000143, PG_U_UPPERCASE_LETTER}, + {0x000144, 0x000144, PG_U_LOWERCASE_LETTER}, + {0x000145, 0x000145, PG_U_UPPERCASE_LETTER}, + {0x000146, 0x000146, PG_U_LOWERCASE_LETTER}, + {0x000147, 0x000147, PG_U_UPPERCASE_LETTER}, + {0x000148, 0x000149, PG_U_LOWERCASE_LETTER}, + {0x00014a, 0x00014a, PG_U_UPPERCASE_LETTER}, + {0x00014b, 0x00014b, PG_U_LOWERCASE_LETTER}, + {0x00014c, 0x00014c, PG_U_UPPERCASE_LETTER}, + {0x00014d, 0x00014d, PG_U_LOWERCASE_LETTER}, + {0x00014e, 0x00014e, PG_U_UPPERCASE_LETTER}, + {0x00014f, 0x00014f, PG_U_LOWERCASE_LETTER}, + {0x000150, 0x000150, PG_U_UPPERCASE_LETTER}, + {0x000151, 0x000151, PG_U_LOWERCASE_LETTER}, + {0x000152, 0x000152, PG_U_UPPERCASE_LETTER}, + {0x000153, 0x000153, PG_U_LOWERCASE_LETTER}, + {0x000154, 0x000154, PG_U_UPPERCASE_LETTER}, + {0x000155, 0x000155, PG_U_LOWERCASE_LETTER}, + {0x000156, 0x000156, PG_U_UPPERCASE_LETTER}, + {0x000157, 0x000157, PG_U_LOWERCASE_LETTER}, + {0x000158, 0x000158, PG_U_UPPERCASE_LETTER}, + {0x000159, 0x000159, PG_U_LOWERCASE_LETTER}, + {0x00015a, 0x00015a, PG_U_UPPERCASE_LETTER}, + {0x00015b, 0x00015b, PG_U_LOWERCASE_LETTER}, + {0x00015c, 0x00015c, PG_U_UPPERCASE_LETTER}, + {0x00015d, 0x00015d, PG_U_LOWERCASE_LETTER}, + {0x00015e, 0x00015e, PG_U_UPPERCASE_LETTER}, + {0x00015f, 0x00015f, PG_U_LOWERCASE_LETTER}, + {0x000160, 0x000160, PG_U_UPPERCASE_LETTER}, + {0x000161, 0x000161, PG_U_LOWERCASE_LETTER}, + {0x000162, 0x000162, PG_U_UPPERCASE_LETTER}, + {0x000163, 0x000163, PG_U_LOWERCASE_LETTER}, + {0x000164, 0x000164, PG_U_UPPERCASE_LETTER}, + {0x000165, 0x000165, PG_U_LOWERCASE_LETTER}, + {0x000166, 0x000166, PG_U_UPPERCASE_LETTER}, + {0x000167, 0x000167, PG_U_LOWERCASE_LETTER}, + {0x000168, 0x000168, PG_U_UPPERCASE_LETTER}, + {0x000169, 0x000169, PG_U_LOWERCASE_LETTER}, + {0x00016a, 0x00016a, PG_U_UPPERCASE_LETTER}, + {0x00016b, 0x00016b, PG_U_LOWERCASE_LETTER}, + {0x00016c, 0x00016c, PG_U_UPPERCASE_LETTER}, + {0x00016d, 0x00016d, PG_U_LOWERCASE_LETTER}, + {0x00016e, 0x00016e, PG_U_UPPERCASE_LETTER}, + {0x00016f, 0x00016f, PG_U_LOWERCASE_LETTER}, + {0x000170, 0x000170, PG_U_UPPERCASE_LETTER}, + {0x000171, 0x000171, PG_U_LOWERCASE_LETTER}, + {0x000172, 0x000172, PG_U_UPPERCASE_LETTER}, + {0x000173, 0x000173, PG_U_LOWERCASE_LETTER}, + {0x000174, 0x000174, PG_U_UPPERCASE_LETTER}, + {0x000175, 0x000175, PG_U_LOWERCASE_LETTER}, + {0x000176, 0x000176, PG_U_UPPERCASE_LETTER}, + {0x000177, 0x000177, PG_U_LOWERCASE_LETTER}, + {0x000178, 0x000179, PG_U_UPPERCASE_LETTER}, + {0x00017a, 0x00017a, PG_U_LOWERCASE_LETTER}, + {0x00017b, 0x00017b, PG_U_UPPERCASE_LETTER}, + {0x00017c, 0x00017c, PG_U_LOWERCASE_LETTER}, + {0x00017d, 0x00017d, PG_U_UPPERCASE_LETTER}, + {0x00017e, 0x000180, PG_U_LOWERCASE_LETTER}, + {0x000181, 0x000182, PG_U_UPPERCASE_LETTER}, + {0x000183, 0x000183, PG_U_LOWERCASE_LETTER}, + {0x000184, 0x000184, PG_U_UPPERCASE_LETTER}, + {0x000185, 0x000185, PG_U_LOWERCASE_LETTER}, + {0x000186, 0x000187, PG_U_UPPERCASE_LETTER}, + {0x000188, 0x000188, PG_U_LOWERCASE_LETTER}, + {0x000189, 0x00018b, PG_U_UPPERCASE_LETTER}, + {0x00018c, 0x00018d, PG_U_LOWERCASE_LETTER}, + {0x00018e, 0x000191, PG_U_UPPERCASE_LETTER}, + {0x000192, 0x000192, PG_U_LOWERCASE_LETTER}, + {0x000193, 0x000194, PG_U_UPPERCASE_LETTER}, + {0x000195, 0x000195, PG_U_LOWERCASE_LETTER}, + {0x000196, 0x000198, PG_U_UPPERCASE_LETTER}, + {0x000199, 0x00019b, PG_U_LOWERCASE_LETTER}, + {0x00019c, 0x00019d, PG_U_UPPERCASE_LETTER}, + {0x00019e, 0x00019e, PG_U_LOWERCASE_LETTER}, + {0x00019f, 0x0001a0, PG_U_UPPERCASE_LETTER}, + {0x0001a1, 0x0001a1, PG_U_LOWERCASE_LETTER}, + {0x0001a2, 0x0001a2, PG_U_UPPERCASE_LETTER}, + {0x0001a3, 0x0001a3, PG_U_LOWERCASE_LETTER}, + {0x0001a4, 0x0001a4, PG_U_UPPERCASE_LETTER}, + {0x0001a5, 0x0001a5, PG_U_LOWERCASE_LETTER}, + {0x0001a6, 0x0001a7, PG_U_UPPERCASE_LETTER}, + {0x0001a8, 0x0001a8, PG_U_LOWERCASE_LETTER}, + {0x0001a9, 0x0001a9, PG_U_UPPERCASE_LETTER}, + {0x0001aa, 0x0001ab, PG_U_LOWERCASE_LETTER}, + {0x0001ac, 0x0001ac, PG_U_UPPERCASE_LETTER}, + {0x0001ad, 0x0001ad, PG_U_LOWERCASE_LETTER}, + {0x0001ae, 0x0001af, PG_U_UPPERCASE_LETTER}, + {0x0001b0, 0x0001b0, PG_U_LOWERCASE_LETTER}, + {0x0001b1, 0x0001b3, PG_U_UPPERCASE_LETTER}, + {0x0001b4, 0x0001b4, PG_U_LOWERCASE_LETTER}, + {0x0001b5, 0x0001b5, PG_U_UPPERCASE_LETTER}, + {0x0001b6, 0x0001b6, PG_U_LOWERCASE_LETTER}, + {0x0001b7, 0x0001b8, PG_U_UPPERCASE_LETTER}, + {0x0001b9, 0x0001ba, PG_U_LOWERCASE_LETTER}, + {0x0001bb, 0x0001bb, PG_U_OTHER_LETTER}, + {0x0001bc, 0x0001bc, PG_U_UPPERCASE_LETTER}, + {0x0001bd, 0x0001bf, PG_U_LOWERCASE_LETTER}, + {0x0001c0, 0x0001c3, PG_U_OTHER_LETTER}, + {0x0001c4, 0x0001c4, PG_U_UPPERCASE_LETTER}, + {0x0001c5, 0x0001c5, PG_U_TITLECASE_LETTER}, + {0x0001c6, 0x0001c6, PG_U_LOWERCASE_LETTER}, + {0x0001c7, 0x0001c7, PG_U_UPPERCASE_LETTER}, + {0x0001c8, 0x0001c8, PG_U_TITLECASE_LETTER}, + {0x0001c9, 0x0001c9, PG_U_LOWERCASE_LETTER}, + {0x0001ca, 0x0001ca, PG_U_UPPERCASE_LETTER}, + {0x0001cb, 0x0001cb, PG_U_TITLECASE_LETTER}, + {0x0001cc, 0x0001cc, PG_U_LOWERCASE_LETTER}, + {0x0001cd, 0x0001cd, PG_U_UPPERCASE_LETTER}, + {0x0001ce, 0x0001ce, PG_U_LOWERCASE_LETTER}, + {0x0001cf, 0x0001cf, PG_U_UPPERCASE_LETTER}, + {0x0001d0, 0x0001d0, PG_U_LOWERCASE_LETTER}, + {0x0001d1, 0x0001d1, PG_U_UPPERCASE_LETTER}, + {0x0001d2, 0x0001d2, PG_U_LOWERCASE_LETTER}, + {0x0001d3, 0x0001d3, PG_U_UPPERCASE_LETTER}, + {0x0001d4, 0x0001d4, PG_U_LOWERCASE_LETTER}, + {0x0001d5, 0x0001d5, PG_U_UPPERCASE_LETTER}, + {0x0001d6, 0x0001d6, PG_U_LOWERCASE_LETTER}, + {0x0001d7, 0x0001d7, PG_U_UPPERCASE_LETTER}, + {0x0001d8, 0x0001d8, PG_U_LOWERCASE_LETTER}, + {0x0001d9, 0x0001d9, PG_U_UPPERCASE_LETTER}, + {0x0001da, 0x0001da, PG_U_LOWERCASE_LETTER}, + {0x0001db, 0x0001db, PG_U_UPPERCASE_LETTER}, + {0x0001dc, 0x0001dd, PG_U_LOWERCASE_LETTER}, + {0x0001de, 0x0001de, PG_U_UPPERCASE_LETTER}, + {0x0001df, 0x0001df, PG_U_LOWERCASE_LETTER}, + {0x0001e0, 0x0001e0, PG_U_UPPERCASE_LETTER}, + {0x0001e1, 0x0001e1, PG_U_LOWERCASE_LETTER}, + {0x0001e2, 0x0001e2, PG_U_UPPERCASE_LETTER}, + {0x0001e3, 0x0001e3, PG_U_LOWERCASE_LETTER}, + {0x0001e4, 0x0001e4, PG_U_UPPERCASE_LETTER}, + {0x0001e5, 0x0001e5, PG_U_LOWERCASE_LETTER}, + {0x0001e6, 0x0001e6, PG_U_UPPERCASE_LETTER}, + {0x0001e7, 0x0001e7, PG_U_LOWERCASE_LETTER}, + {0x0001e8, 0x0001e8, PG_U_UPPERCASE_LETTER}, + {0x0001e9, 0x0001e9, PG_U_LOWERCASE_LETTER}, + {0x0001ea, 0x0001ea, PG_U_UPPERCASE_LETTER}, + {0x0001eb, 0x0001eb, PG_U_LOWERCASE_LETTER}, + {0x0001ec, 0x0001ec, PG_U_UPPERCASE_LETTER}, + {0x0001ed, 0x0001ed, PG_U_LOWERCASE_LETTER}, + {0x0001ee, 0x0001ee, PG_U_UPPERCASE_LETTER}, + {0x0001ef, 0x0001f0, PG_U_LOWERCASE_LETTER}, + {0x0001f1, 0x0001f1, PG_U_UPPERCASE_LETTER}, + {0x0001f2, 0x0001f2, PG_U_TITLECASE_LETTER}, + {0x0001f3, 0x0001f3, PG_U_LOWERCASE_LETTER}, + {0x0001f4, 0x0001f4, PG_U_UPPERCASE_LETTER}, + {0x0001f5, 0x0001f5, PG_U_LOWERCASE_LETTER}, + {0x0001f6, 0x0001f8, PG_U_UPPERCASE_LETTER}, + {0x0001f9, 0x0001f9, PG_U_LOWERCASE_LETTER}, + {0x0001fa, 0x0001fa, PG_U_UPPERCASE_LETTER}, + {0x0001fb, 0x0001fb, PG_U_LOWERCASE_LETTER}, + {0x0001fc, 0x0001fc, PG_U_UPPERCASE_LETTER}, + {0x0001fd, 0x0001fd, PG_U_LOWERCASE_LETTER}, + {0x0001fe, 0x0001fe, PG_U_UPPERCASE_LETTER}, + {0x0001ff, 0x0001ff, PG_U_LOWERCASE_LETTER}, + {0x000200, 0x000200, PG_U_UPPERCASE_LETTER}, + {0x000201, 0x000201, PG_U_LOWERCASE_LETTER}, + {0x000202, 0x000202, PG_U_UPPERCASE_LETTER}, + {0x000203, 0x000203, PG_U_LOWERCASE_LETTER}, + {0x000204, 0x000204, PG_U_UPPERCASE_LETTER}, + {0x000205, 0x000205, PG_U_LOWERCASE_LETTER}, + {0x000206, 0x000206, PG_U_UPPERCASE_LETTER}, + {0x000207, 0x000207, PG_U_LOWERCASE_LETTER}, + {0x000208, 0x000208, PG_U_UPPERCASE_LETTER}, + {0x000209, 0x000209, PG_U_LOWERCASE_LETTER}, + {0x00020a, 0x00020a, PG_U_UPPERCASE_LETTER}, + {0x00020b, 0x00020b, PG_U_LOWERCASE_LETTER}, + {0x00020c, 0x00020c, PG_U_UPPERCASE_LETTER}, + {0x00020d, 0x00020d, PG_U_LOWERCASE_LETTER}, + {0x00020e, 0x00020e, PG_U_UPPERCASE_LETTER}, + {0x00020f, 0x00020f, PG_U_LOWERCASE_LETTER}, + {0x000210, 0x000210, PG_U_UPPERCASE_LETTER}, + {0x000211, 0x000211, PG_U_LOWERCASE_LETTER}, + {0x000212, 0x000212, PG_U_UPPERCASE_LETTER}, + {0x000213, 0x000213, PG_U_LOWERCASE_LETTER}, + {0x000214, 0x000214, PG_U_UPPERCASE_LETTER}, + {0x000215, 0x000215, PG_U_LOWERCASE_LETTER}, + {0x000216, 0x000216, PG_U_UPPERCASE_LETTER}, + {0x000217, 0x000217, PG_U_LOWERCASE_LETTER}, + {0x000218, 0x000218, PG_U_UPPERCASE_LETTER}, + {0x000219, 0x000219, PG_U_LOWERCASE_LETTER}, + {0x00021a, 0x00021a, PG_U_UPPERCASE_LETTER}, + {0x00021b, 0x00021b, PG_U_LOWERCASE_LETTER}, + {0x00021c, 0x00021c, PG_U_UPPERCASE_LETTER}, + {0x00021d, 0x00021d, PG_U_LOWERCASE_LETTER}, + {0x00021e, 0x00021e, PG_U_UPPERCASE_LETTER}, + {0x00021f, 0x00021f, PG_U_LOWERCASE_LETTER}, + {0x000220, 0x000220, PG_U_UPPERCASE_LETTER}, + {0x000221, 0x000221, PG_U_LOWERCASE_LETTER}, + {0x000222, 0x000222, PG_U_UPPERCASE_LETTER}, + {0x000223, 0x000223, PG_U_LOWERCASE_LETTER}, + {0x000224, 0x000224, PG_U_UPPERCASE_LETTER}, + {0x000225, 0x000225, PG_U_LOWERCASE_LETTER}, + {0x000226, 0x000226, PG_U_UPPERCASE_LETTER}, + {0x000227, 0x000227, PG_U_LOWERCASE_LETTER}, + {0x000228, 0x000228, PG_U_UPPERCASE_LETTER}, + {0x000229, 0x000229, PG_U_LOWERCASE_LETTER}, + {0x00022a, 0x00022a, PG_U_UPPERCASE_LETTER}, + {0x00022b, 0x00022b, PG_U_LOWERCASE_LETTER}, + {0x00022c, 0x00022c, PG_U_UPPERCASE_LETTER}, + {0x00022d, 0x00022d, PG_U_LOWERCASE_LETTER}, + {0x00022e, 0x00022e, PG_U_UPPERCASE_LETTER}, + {0x00022f, 0x00022f, PG_U_LOWERCASE_LETTER}, + {0x000230, 0x000230, PG_U_UPPERCASE_LETTER}, + {0x000231, 0x000231, PG_U_LOWERCASE_LETTER}, + {0x000232, 0x000232, PG_U_UPPERCASE_LETTER}, + {0x000233, 0x000239, PG_U_LOWERCASE_LETTER}, + {0x00023a, 0x00023b, PG_U_UPPERCASE_LETTER}, + {0x00023c, 0x00023c, PG_U_LOWERCASE_LETTER}, + {0x00023d, 0x00023e, PG_U_UPPERCASE_LETTER}, + {0x00023f, 0x000240, PG_U_LOWERCASE_LETTER}, + {0x000241, 0x000241, PG_U_UPPERCASE_LETTER}, + {0x000242, 0x000242, PG_U_LOWERCASE_LETTER}, + {0x000243, 0x000246, PG_U_UPPERCASE_LETTER}, + {0x000247, 0x000247, PG_U_LOWERCASE_LETTER}, + {0x000248, 0x000248, PG_U_UPPERCASE_LETTER}, + {0x000249, 0x000249, PG_U_LOWERCASE_LETTER}, + {0x00024a, 0x00024a, PG_U_UPPERCASE_LETTER}, + {0x00024b, 0x00024b, PG_U_LOWERCASE_LETTER}, + {0x00024c, 0x00024c, PG_U_UPPERCASE_LETTER}, + {0x00024d, 0x00024d, PG_U_LOWERCASE_LETTER}, + {0x00024e, 0x00024e, PG_U_UPPERCASE_LETTER}, + {0x00024f, 0x000293, PG_U_LOWERCASE_LETTER}, + {0x000294, 0x000294, PG_U_OTHER_LETTER}, + {0x000295, 0x0002af, PG_U_LOWERCASE_LETTER}, + {0x0002b0, 0x0002c1, PG_U_MODIFIER_LETTER}, + {0x0002c2, 0x0002c5, PG_U_MODIFIER_SYMBOL}, + {0x0002c6, 0x0002d1, PG_U_MODIFIER_LETTER}, + {0x0002d2, 0x0002df, PG_U_MODIFIER_SYMBOL}, + {0x0002e0, 0x0002e4, PG_U_MODIFIER_LETTER}, + {0x0002e5, 0x0002eb, PG_U_MODIFIER_SYMBOL}, + {0x0002ec, 0x0002ec, PG_U_MODIFIER_LETTER}, + {0x0002ed, 0x0002ed, PG_U_MODIFIER_SYMBOL}, + {0x0002ee, 0x0002ee, PG_U_MODIFIER_LETTER}, + {0x0002ef, 0x0002ff, PG_U_MODIFIER_SYMBOL}, + {0x000300, 0x00036f, PG_U_NONSPACING_MARK}, + {0x000370, 0x000370, PG_U_UPPERCASE_LETTER}, + {0x000371, 0x000371, PG_U_LOWERCASE_LETTER}, + {0x000372, 0x000372, PG_U_UPPERCASE_LETTER}, + {0x000373, 0x000373, PG_U_LOWERCASE_LETTER}, + {0x000374, 0x000374, PG_U_MODIFIER_LETTER}, + {0x000375, 0x000375, PG_U_MODIFIER_SYMBOL}, + {0x000376, 0x000376, PG_U_UPPERCASE_LETTER}, + {0x000377, 0x000377, PG_U_LOWERCASE_LETTER}, + {0x00037a, 0x00037a, PG_U_MODIFIER_LETTER}, + {0x00037b, 0x00037d, PG_U_LOWERCASE_LETTER}, + {0x00037e, 0x00037e, PG_U_OTHER_PUNCTUATION}, + {0x00037f, 0x00037f, PG_U_UPPERCASE_LETTER}, + {0x000384, 0x000385, PG_U_MODIFIER_SYMBOL}, + {0x000386, 0x000386, PG_U_UPPERCASE_LETTER}, + {0x000387, 0x000387, PG_U_OTHER_PUNCTUATION}, + {0x000388, 0x00038a, PG_U_UPPERCASE_LETTER}, + {0x00038c, 0x00038c, PG_U_UPPERCASE_LETTER}, + {0x00038e, 0x00038f, PG_U_UPPERCASE_LETTER}, + {0x000390, 0x000390, PG_U_LOWERCASE_LETTER}, + {0x000391, 0x0003a1, PG_U_UPPERCASE_LETTER}, + {0x0003a3, 0x0003ab, PG_U_UPPERCASE_LETTER}, + {0x0003ac, 0x0003ce, PG_U_LOWERCASE_LETTER}, + {0x0003cf, 0x0003cf, PG_U_UPPERCASE_LETTER}, + {0x0003d0, 0x0003d1, PG_U_LOWERCASE_LETTER}, + {0x0003d2, 0x0003d4, PG_U_UPPERCASE_LETTER}, + {0x0003d5, 0x0003d7, PG_U_LOWERCASE_LETTER}, + {0x0003d8, 0x0003d8, PG_U_UPPERCASE_LETTER}, + {0x0003d9, 0x0003d9, PG_U_LOWERCASE_LETTER}, + {0x0003da, 0x0003da, PG_U_UPPERCASE_LETTER}, + {0x0003db, 0x0003db, PG_U_LOWERCASE_LETTER}, + {0x0003dc, 0x0003dc, PG_U_UPPERCASE_LETTER}, + {0x0003dd, 0x0003dd, PG_U_LOWERCASE_LETTER}, + {0x0003de, 0x0003de, PG_U_UPPERCASE_LETTER}, + {0x0003df, 0x0003df, PG_U_LOWERCASE_LETTER}, + {0x0003e0, 0x0003e0, PG_U_UPPERCASE_LETTER}, + {0x0003e1, 0x0003e1, PG_U_LOWERCASE_LETTER}, + {0x0003e2, 0x0003e2, PG_U_UPPERCASE_LETTER}, + {0x0003e3, 0x0003e3, PG_U_LOWERCASE_LETTER}, + {0x0003e4, 0x0003e4, PG_U_UPPERCASE_LETTER}, + {0x0003e5, 0x0003e5, PG_U_LOWERCASE_LETTER}, + {0x0003e6, 0x0003e6, PG_U_UPPERCASE_LETTER}, + {0x0003e7, 0x0003e7, PG_U_LOWERCASE_LETTER}, + {0x0003e8, 0x0003e8, PG_U_UPPERCASE_LETTER}, + {0x0003e9, 0x0003e9, PG_U_LOWERCASE_LETTER}, + {0x0003ea, 0x0003ea, PG_U_UPPERCASE_LETTER}, + {0x0003eb, 0x0003eb, PG_U_LOWERCASE_LETTER}, + {0x0003ec, 0x0003ec, PG_U_UPPERCASE_LETTER}, + {0x0003ed, 0x0003ed, PG_U_LOWERCASE_LETTER}, + {0x0003ee, 0x0003ee, PG_U_UPPERCASE_LETTER}, + {0x0003ef, 0x0003f3, PG_U_LOWERCASE_LETTER}, + {0x0003f4, 0x0003f4, PG_U_UPPERCASE_LETTER}, + {0x0003f5, 0x0003f5, PG_U_LOWERCASE_LETTER}, + {0x0003f6, 0x0003f6, PG_U_MATH_SYMBOL}, + {0x0003f7, 0x0003f7, PG_U_UPPERCASE_LETTER}, + {0x0003f8, 0x0003f8, PG_U_LOWERCASE_LETTER}, + {0x0003f9, 0x0003fa, PG_U_UPPERCASE_LETTER}, + {0x0003fb, 0x0003fc, PG_U_LOWERCASE_LETTER}, + {0x0003fd, 0x00042f, PG_U_UPPERCASE_LETTER}, + {0x000430, 0x00045f, PG_U_LOWERCASE_LETTER}, + {0x000460, 0x000460, PG_U_UPPERCASE_LETTER}, + {0x000461, 0x000461, PG_U_LOWERCASE_LETTER}, + {0x000462, 0x000462, PG_U_UPPERCASE_LETTER}, + {0x000463, 0x000463, PG_U_LOWERCASE_LETTER}, + {0x000464, 0x000464, PG_U_UPPERCASE_LETTER}, + {0x000465, 0x000465, PG_U_LOWERCASE_LETTER}, + {0x000466, 0x000466, PG_U_UPPERCASE_LETTER}, + {0x000467, 0x000467, PG_U_LOWERCASE_LETTER}, + {0x000468, 0x000468, PG_U_UPPERCASE_LETTER}, + {0x000469, 0x000469, PG_U_LOWERCASE_LETTER}, + {0x00046a, 0x00046a, PG_U_UPPERCASE_LETTER}, + {0x00046b, 0x00046b, PG_U_LOWERCASE_LETTER}, + {0x00046c, 0x00046c, PG_U_UPPERCASE_LETTER}, + {0x00046d, 0x00046d, PG_U_LOWERCASE_LETTER}, + {0x00046e, 0x00046e, PG_U_UPPERCASE_LETTER}, + {0x00046f, 0x00046f, PG_U_LOWERCASE_LETTER}, + {0x000470, 0x000470, PG_U_UPPERCASE_LETTER}, + {0x000471, 0x000471, PG_U_LOWERCASE_LETTER}, + {0x000472, 0x000472, PG_U_UPPERCASE_LETTER}, + {0x000473, 0x000473, PG_U_LOWERCASE_LETTER}, + {0x000474, 0x000474, PG_U_UPPERCASE_LETTER}, + {0x000475, 0x000475, PG_U_LOWERCASE_LETTER}, + {0x000476, 0x000476, PG_U_UPPERCASE_LETTER}, + {0x000477, 0x000477, PG_U_LOWERCASE_LETTER}, + {0x000478, 0x000478, PG_U_UPPERCASE_LETTER}, + {0x000479, 0x000479, PG_U_LOWERCASE_LETTER}, + {0x00047a, 0x00047a, PG_U_UPPERCASE_LETTER}, + {0x00047b, 0x00047b, PG_U_LOWERCASE_LETTER}, + {0x00047c, 0x00047c, PG_U_UPPERCASE_LETTER}, + {0x00047d, 0x00047d, PG_U_LOWERCASE_LETTER}, + {0x00047e, 0x00047e, PG_U_UPPERCASE_LETTER}, + {0x00047f, 0x00047f, PG_U_LOWERCASE_LETTER}, + {0x000480, 0x000480, PG_U_UPPERCASE_LETTER}, + {0x000481, 0x000481, PG_U_LOWERCASE_LETTER}, + {0x000482, 0x000482, PG_U_OTHER_SYMBOL}, + {0x000483, 0x000487, PG_U_NONSPACING_MARK}, + {0x000488, 0x000489, PG_U_ENCLOSING_MARK}, + {0x00048a, 0x00048a, PG_U_UPPERCASE_LETTER}, + {0x00048b, 0x00048b, PG_U_LOWERCASE_LETTER}, + {0x00048c, 0x00048c, PG_U_UPPERCASE_LETTER}, + {0x00048d, 0x00048d, PG_U_LOWERCASE_LETTER}, + {0x00048e, 0x00048e, PG_U_UPPERCASE_LETTER}, + {0x00048f, 0x00048f, PG_U_LOWERCASE_LETTER}, + {0x000490, 0x000490, PG_U_UPPERCASE_LETTER}, + {0x000491, 0x000491, PG_U_LOWERCASE_LETTER}, + {0x000492, 0x000492, PG_U_UPPERCASE_LETTER}, + {0x000493, 0x000493, PG_U_LOWERCASE_LETTER}, + {0x000494, 0x000494, PG_U_UPPERCASE_LETTER}, + {0x000495, 0x000495, PG_U_LOWERCASE_LETTER}, + {0x000496, 0x000496, PG_U_UPPERCASE_LETTER}, + {0x000497, 0x000497, PG_U_LOWERCASE_LETTER}, + {0x000498, 0x000498, PG_U_UPPERCASE_LETTER}, + {0x000499, 0x000499, PG_U_LOWERCASE_LETTER}, + {0x00049a, 0x00049a, PG_U_UPPERCASE_LETTER}, + {0x00049b, 0x00049b, PG_U_LOWERCASE_LETTER}, + {0x00049c, 0x00049c, PG_U_UPPERCASE_LETTER}, + {0x00049d, 0x00049d, PG_U_LOWERCASE_LETTER}, + {0x00049e, 0x00049e, PG_U_UPPERCASE_LETTER}, + {0x00049f, 0x00049f, PG_U_LOWERCASE_LETTER}, + {0x0004a0, 0x0004a0, PG_U_UPPERCASE_LETTER}, + {0x0004a1, 0x0004a1, PG_U_LOWERCASE_LETTER}, + {0x0004a2, 0x0004a2, PG_U_UPPERCASE_LETTER}, + {0x0004a3, 0x0004a3, PG_U_LOWERCASE_LETTER}, + {0x0004a4, 0x0004a4, PG_U_UPPERCASE_LETTER}, + {0x0004a5, 0x0004a5, PG_U_LOWERCASE_LETTER}, + {0x0004a6, 0x0004a6, PG_U_UPPERCASE_LETTER}, + {0x0004a7, 0x0004a7, PG_U_LOWERCASE_LETTER}, + {0x0004a8, 0x0004a8, PG_U_UPPERCASE_LETTER}, + {0x0004a9, 0x0004a9, PG_U_LOWERCASE_LETTER}, + {0x0004aa, 0x0004aa, PG_U_UPPERCASE_LETTER}, + {0x0004ab, 0x0004ab, PG_U_LOWERCASE_LETTER}, + {0x0004ac, 0x0004ac, PG_U_UPPERCASE_LETTER}, + {0x0004ad, 0x0004ad, PG_U_LOWERCASE_LETTER}, + {0x0004ae, 0x0004ae, PG_U_UPPERCASE_LETTER}, + {0x0004af, 0x0004af, PG_U_LOWERCASE_LETTER}, + {0x0004b0, 0x0004b0, PG_U_UPPERCASE_LETTER}, + {0x0004b1, 0x0004b1, PG_U_LOWERCASE_LETTER}, + {0x0004b2, 0x0004b2, PG_U_UPPERCASE_LETTER}, + {0x0004b3, 0x0004b3, PG_U_LOWERCASE_LETTER}, + {0x0004b4, 0x0004b4, PG_U_UPPERCASE_LETTER}, + {0x0004b5, 0x0004b5, PG_U_LOWERCASE_LETTER}, + {0x0004b6, 0x0004b6, PG_U_UPPERCASE_LETTER}, + {0x0004b7, 0x0004b7, PG_U_LOWERCASE_LETTER}, + {0x0004b8, 0x0004b8, PG_U_UPPERCASE_LETTER}, + {0x0004b9, 0x0004b9, PG_U_LOWERCASE_LETTER}, + {0x0004ba, 0x0004ba, PG_U_UPPERCASE_LETTER}, + {0x0004bb, 0x0004bb, PG_U_LOWERCASE_LETTER}, + {0x0004bc, 0x0004bc, PG_U_UPPERCASE_LETTER}, + {0x0004bd, 0x0004bd, PG_U_LOWERCASE_LETTER}, + {0x0004be, 0x0004be, PG_U_UPPERCASE_LETTER}, + {0x0004bf, 0x0004bf, PG_U_LOWERCASE_LETTER}, + {0x0004c0, 0x0004c1, PG_U_UPPERCASE_LETTER}, + {0x0004c2, 0x0004c2, PG_U_LOWERCASE_LETTER}, + {0x0004c3, 0x0004c3, PG_U_UPPERCASE_LETTER}, + {0x0004c4, 0x0004c4, PG_U_LOWERCASE_LETTER}, + {0x0004c5, 0x0004c5, PG_U_UPPERCASE_LETTER}, + {0x0004c6, 0x0004c6, PG_U_LOWERCASE_LETTER}, + {0x0004c7, 0x0004c7, PG_U_UPPERCASE_LETTER}, + {0x0004c8, 0x0004c8, PG_U_LOWERCASE_LETTER}, + {0x0004c9, 0x0004c9, PG_U_UPPERCASE_LETTER}, + {0x0004ca, 0x0004ca, PG_U_LOWERCASE_LETTER}, + {0x0004cb, 0x0004cb, PG_U_UPPERCASE_LETTER}, + {0x0004cc, 0x0004cc, PG_U_LOWERCASE_LETTER}, + {0x0004cd, 0x0004cd, PG_U_UPPERCASE_LETTER}, + {0x0004ce, 0x0004cf, PG_U_LOWERCASE_LETTER}, + {0x0004d0, 0x0004d0, PG_U_UPPERCASE_LETTER}, + {0x0004d1, 0x0004d1, PG_U_LOWERCASE_LETTER}, + {0x0004d2, 0x0004d2, PG_U_UPPERCASE_LETTER}, + {0x0004d3, 0x0004d3, PG_U_LOWERCASE_LETTER}, + {0x0004d4, 0x0004d4, PG_U_UPPERCASE_LETTER}, + {0x0004d5, 0x0004d5, PG_U_LOWERCASE_LETTER}, + {0x0004d6, 0x0004d6, PG_U_UPPERCASE_LETTER}, + {0x0004d7, 0x0004d7, PG_U_LOWERCASE_LETTER}, + {0x0004d8, 0x0004d8, PG_U_UPPERCASE_LETTER}, + {0x0004d9, 0x0004d9, PG_U_LOWERCASE_LETTER}, + {0x0004da, 0x0004da, PG_U_UPPERCASE_LETTER}, + {0x0004db, 0x0004db, PG_U_LOWERCASE_LETTER}, + {0x0004dc, 0x0004dc, PG_U_UPPERCASE_LETTER}, + {0x0004dd, 0x0004dd, PG_U_LOWERCASE_LETTER}, + {0x0004de, 0x0004de, PG_U_UPPERCASE_LETTER}, + {0x0004df, 0x0004df, PG_U_LOWERCASE_LETTER}, + {0x0004e0, 0x0004e0, PG_U_UPPERCASE_LETTER}, + {0x0004e1, 0x0004e1, PG_U_LOWERCASE_LETTER}, + {0x0004e2, 0x0004e2, PG_U_UPPERCASE_LETTER}, + {0x0004e3, 0x0004e3, PG_U_LOWERCASE_LETTER}, + {0x0004e4, 0x0004e4, PG_U_UPPERCASE_LETTER}, + {0x0004e5, 0x0004e5, PG_U_LOWERCASE_LETTER}, + {0x0004e6, 0x0004e6, PG_U_UPPERCASE_LETTER}, + {0x0004e7, 0x0004e7, PG_U_LOWERCASE_LETTER}, + {0x0004e8, 0x0004e8, PG_U_UPPERCASE_LETTER}, + {0x0004e9, 0x0004e9, PG_U_LOWERCASE_LETTER}, + {0x0004ea, 0x0004ea, PG_U_UPPERCASE_LETTER}, + {0x0004eb, 0x0004eb, PG_U_LOWERCASE_LETTER}, + {0x0004ec, 0x0004ec, PG_U_UPPERCASE_LETTER}, + {0x0004ed, 0x0004ed, PG_U_LOWERCASE_LETTER}, + {0x0004ee, 0x0004ee, PG_U_UPPERCASE_LETTER}, + {0x0004ef, 0x0004ef, PG_U_LOWERCASE_LETTER}, + {0x0004f0, 0x0004f0, PG_U_UPPERCASE_LETTER}, + {0x0004f1, 0x0004f1, PG_U_LOWERCASE_LETTER}, + {0x0004f2, 0x0004f2, PG_U_UPPERCASE_LETTER}, + {0x0004f3, 0x0004f3, PG_U_LOWERCASE_LETTER}, + {0x0004f4, 0x0004f4, PG_U_UPPERCASE_LETTER}, + {0x0004f5, 0x0004f5, PG_U_LOWERCASE_LETTER}, + {0x0004f6, 0x0004f6, PG_U_UPPERCASE_LETTER}, + {0x0004f7, 0x0004f7, PG_U_LOWERCASE_LETTER}, + {0x0004f8, 0x0004f8, PG_U_UPPERCASE_LETTER}, + {0x0004f9, 0x0004f9, PG_U_LOWERCASE_LETTER}, + {0x0004fa, 0x0004fa, PG_U_UPPERCASE_LETTER}, + {0x0004fb, 0x0004fb, PG_U_LOWERCASE_LETTER}, + {0x0004fc, 0x0004fc, PG_U_UPPERCASE_LETTER}, + {0x0004fd, 0x0004fd, PG_U_LOWERCASE_LETTER}, + {0x0004fe, 0x0004fe, PG_U_UPPERCASE_LETTER}, + {0x0004ff, 0x0004ff, PG_U_LOWERCASE_LETTER}, + {0x000500, 0x000500, PG_U_UPPERCASE_LETTER}, + {0x000501, 0x000501, PG_U_LOWERCASE_LETTER}, + {0x000502, 0x000502, PG_U_UPPERCASE_LETTER}, + {0x000503, 0x000503, PG_U_LOWERCASE_LETTER}, + {0x000504, 0x000504, PG_U_UPPERCASE_LETTER}, + {0x000505, 0x000505, PG_U_LOWERCASE_LETTER}, + {0x000506, 0x000506, PG_U_UPPERCASE_LETTER}, + {0x000507, 0x000507, PG_U_LOWERCASE_LETTER}, + {0x000508, 0x000508, PG_U_UPPERCASE_LETTER}, + {0x000509, 0x000509, PG_U_LOWERCASE_LETTER}, + {0x00050a, 0x00050a, PG_U_UPPERCASE_LETTER}, + {0x00050b, 0x00050b, PG_U_LOWERCASE_LETTER}, + {0x00050c, 0x00050c, PG_U_UPPERCASE_LETTER}, + {0x00050d, 0x00050d, PG_U_LOWERCASE_LETTER}, + {0x00050e, 0x00050e, PG_U_UPPERCASE_LETTER}, + {0x00050f, 0x00050f, PG_U_LOWERCASE_LETTER}, + {0x000510, 0x000510, PG_U_UPPERCASE_LETTER}, + {0x000511, 0x000511, PG_U_LOWERCASE_LETTER}, + {0x000512, 0x000512, PG_U_UPPERCASE_LETTER}, + {0x000513, 0x000513, PG_U_LOWERCASE_LETTER}, + {0x000514, 0x000514, PG_U_UPPERCASE_LETTER}, + {0x000515, 0x000515, PG_U_LOWERCASE_LETTER}, + {0x000516, 0x000516, PG_U_UPPERCASE_LETTER}, + {0x000517, 0x000517, PG_U_LOWERCASE_LETTER}, + {0x000518, 0x000518, PG_U_UPPERCASE_LETTER}, + {0x000519, 0x000519, PG_U_LOWERCASE_LETTER}, + {0x00051a, 0x00051a, PG_U_UPPERCASE_LETTER}, + {0x00051b, 0x00051b, PG_U_LOWERCASE_LETTER}, + {0x00051c, 0x00051c, PG_U_UPPERCASE_LETTER}, + {0x00051d, 0x00051d, PG_U_LOWERCASE_LETTER}, + {0x00051e, 0x00051e, PG_U_UPPERCASE_LETTER}, + {0x00051f, 0x00051f, PG_U_LOWERCASE_LETTER}, + {0x000520, 0x000520, PG_U_UPPERCASE_LETTER}, + {0x000521, 0x000521, PG_U_LOWERCASE_LETTER}, + {0x000522, 0x000522, PG_U_UPPERCASE_LETTER}, + {0x000523, 0x000523, PG_U_LOWERCASE_LETTER}, + {0x000524, 0x000524, PG_U_UPPERCASE_LETTER}, + {0x000525, 0x000525, PG_U_LOWERCASE_LETTER}, + {0x000526, 0x000526, PG_U_UPPERCASE_LETTER}, + {0x000527, 0x000527, PG_U_LOWERCASE_LETTER}, + {0x000528, 0x000528, PG_U_UPPERCASE_LETTER}, + {0x000529, 0x000529, PG_U_LOWERCASE_LETTER}, + {0x00052a, 0x00052a, PG_U_UPPERCASE_LETTER}, + {0x00052b, 0x00052b, PG_U_LOWERCASE_LETTER}, + {0x00052c, 0x00052c, PG_U_UPPERCASE_LETTER}, + {0x00052d, 0x00052d, PG_U_LOWERCASE_LETTER}, + {0x00052e, 0x00052e, PG_U_UPPERCASE_LETTER}, + {0x00052f, 0x00052f, PG_U_LOWERCASE_LETTER}, + {0x000531, 0x000556, PG_U_UPPERCASE_LETTER}, + {0x000559, 0x000559, PG_U_MODIFIER_LETTER}, + {0x00055a, 0x00055f, PG_U_OTHER_PUNCTUATION}, + {0x000560, 0x000588, PG_U_LOWERCASE_LETTER}, + {0x000589, 0x000589, PG_U_OTHER_PUNCTUATION}, + {0x00058a, 0x00058a, PG_U_DASH_PUNCTUATION}, + {0x00058d, 0x00058e, PG_U_OTHER_SYMBOL}, + {0x00058f, 0x00058f, PG_U_CURRENCY_SYMBOL}, + {0x000591, 0x0005bd, PG_U_NONSPACING_MARK}, + {0x0005be, 0x0005be, PG_U_DASH_PUNCTUATION}, + {0x0005bf, 0x0005bf, PG_U_NONSPACING_MARK}, + {0x0005c0, 0x0005c0, PG_U_OTHER_PUNCTUATION}, + {0x0005c1, 0x0005c2, PG_U_NONSPACING_MARK}, + {0x0005c3, 0x0005c3, PG_U_OTHER_PUNCTUATION}, + {0x0005c4, 0x0005c5, PG_U_NONSPACING_MARK}, + {0x0005c6, 0x0005c6, PG_U_OTHER_PUNCTUATION}, + {0x0005c7, 0x0005c7, PG_U_NONSPACING_MARK}, + {0x0005d0, 0x0005ea, PG_U_OTHER_LETTER}, + {0x0005ef, 0x0005f2, PG_U_OTHER_LETTER}, + {0x0005f3, 0x0005f4, PG_U_OTHER_PUNCTUATION}, + {0x000600, 0x000605, PG_U_FORMAT}, + {0x000606, 0x000608, PG_U_MATH_SYMBOL}, + {0x000609, 0x00060a, PG_U_OTHER_PUNCTUATION}, + {0x00060b, 0x00060b, PG_U_CURRENCY_SYMBOL}, + {0x00060c, 0x00060d, PG_U_OTHER_PUNCTUATION}, + {0x00060e, 0x00060f, PG_U_OTHER_SYMBOL}, + {0x000610, 0x00061a, PG_U_NONSPACING_MARK}, + {0x00061b, 0x00061b, PG_U_OTHER_PUNCTUATION}, + {0x00061c, 0x00061c, PG_U_FORMAT}, + {0x00061d, 0x00061f, PG_U_OTHER_PUNCTUATION}, + {0x000620, 0x00063f, PG_U_OTHER_LETTER}, + {0x000640, 0x000640, PG_U_MODIFIER_LETTER}, + {0x000641, 0x00064a, PG_U_OTHER_LETTER}, + {0x00064b, 0x00065f, PG_U_NONSPACING_MARK}, + {0x000660, 0x000669, PG_U_DECIMAL_NUMBER}, + {0x00066a, 0x00066d, PG_U_OTHER_PUNCTUATION}, + {0x00066e, 0x00066f, PG_U_OTHER_LETTER}, + {0x000670, 0x000670, PG_U_NONSPACING_MARK}, + {0x000671, 0x0006d3, PG_U_OTHER_LETTER}, + {0x0006d4, 0x0006d4, PG_U_OTHER_PUNCTUATION}, + {0x0006d5, 0x0006d5, PG_U_OTHER_LETTER}, + {0x0006d6, 0x0006dc, PG_U_NONSPACING_MARK}, + {0x0006dd, 0x0006dd, PG_U_FORMAT}, + {0x0006de, 0x0006de, PG_U_OTHER_SYMBOL}, + {0x0006df, 0x0006e4, PG_U_NONSPACING_MARK}, + {0x0006e5, 0x0006e6, PG_U_MODIFIER_LETTER}, + {0x0006e7, 0x0006e8, PG_U_NONSPACING_MARK}, + {0x0006e9, 0x0006e9, PG_U_OTHER_SYMBOL}, + {0x0006ea, 0x0006ed, PG_U_NONSPACING_MARK}, + {0x0006ee, 0x0006ef, PG_U_OTHER_LETTER}, + {0x0006f0, 0x0006f9, PG_U_DECIMAL_NUMBER}, + {0x0006fa, 0x0006fc, PG_U_OTHER_LETTER}, + {0x0006fd, 0x0006fe, PG_U_OTHER_SYMBOL}, + {0x0006ff, 0x0006ff, PG_U_OTHER_LETTER}, + {0x000700, 0x00070d, PG_U_OTHER_PUNCTUATION}, + {0x00070f, 0x00070f, PG_U_FORMAT}, + {0x000710, 0x000710, PG_U_OTHER_LETTER}, + {0x000711, 0x000711, PG_U_NONSPACING_MARK}, + {0x000712, 0x00072f, PG_U_OTHER_LETTER}, + {0x000730, 0x00074a, PG_U_NONSPACING_MARK}, + {0x00074d, 0x0007a5, PG_U_OTHER_LETTER}, + {0x0007a6, 0x0007b0, PG_U_NONSPACING_MARK}, + {0x0007b1, 0x0007b1, PG_U_OTHER_LETTER}, + {0x0007c0, 0x0007c9, PG_U_DECIMAL_NUMBER}, + {0x0007ca, 0x0007ea, PG_U_OTHER_LETTER}, + {0x0007eb, 0x0007f3, PG_U_NONSPACING_MARK}, + {0x0007f4, 0x0007f5, PG_U_MODIFIER_LETTER}, + {0x0007f6, 0x0007f6, PG_U_OTHER_SYMBOL}, + {0x0007f7, 0x0007f9, PG_U_OTHER_PUNCTUATION}, + {0x0007fa, 0x0007fa, PG_U_MODIFIER_LETTER}, + {0x0007fd, 0x0007fd, PG_U_NONSPACING_MARK}, + {0x0007fe, 0x0007ff, PG_U_CURRENCY_SYMBOL}, + {0x000800, 0x000815, PG_U_OTHER_LETTER}, + {0x000816, 0x000819, PG_U_NONSPACING_MARK}, + {0x00081a, 0x00081a, PG_U_MODIFIER_LETTER}, + {0x00081b, 0x000823, PG_U_NONSPACING_MARK}, + {0x000824, 0x000824, PG_U_MODIFIER_LETTER}, + {0x000825, 0x000827, PG_U_NONSPACING_MARK}, + {0x000828, 0x000828, PG_U_MODIFIER_LETTER}, + {0x000829, 0x00082d, PG_U_NONSPACING_MARK}, + {0x000830, 0x00083e, PG_U_OTHER_PUNCTUATION}, + {0x000840, 0x000858, PG_U_OTHER_LETTER}, + {0x000859, 0x00085b, PG_U_NONSPACING_MARK}, + {0x00085e, 0x00085e, PG_U_OTHER_PUNCTUATION}, + {0x000860, 0x00086a, PG_U_OTHER_LETTER}, + {0x000870, 0x000887, PG_U_OTHER_LETTER}, + {0x000888, 0x000888, PG_U_MODIFIER_SYMBOL}, + {0x000889, 0x00088e, PG_U_OTHER_LETTER}, + {0x000890, 0x000891, PG_U_FORMAT}, + {0x000898, 0x00089f, PG_U_NONSPACING_MARK}, + {0x0008a0, 0x0008c8, PG_U_OTHER_LETTER}, + {0x0008c9, 0x0008c9, PG_U_MODIFIER_LETTER}, + {0x0008ca, 0x0008e1, PG_U_NONSPACING_MARK}, + {0x0008e2, 0x0008e2, PG_U_FORMAT}, + {0x0008e3, 0x000902, PG_U_NONSPACING_MARK}, + {0x000903, 0x000903, PG_U_SPACING_MARK}, + {0x000904, 0x000939, PG_U_OTHER_LETTER}, + {0x00093a, 0x00093a, PG_U_NONSPACING_MARK}, + {0x00093b, 0x00093b, PG_U_SPACING_MARK}, + {0x00093c, 0x00093c, PG_U_NONSPACING_MARK}, + {0x00093d, 0x00093d, PG_U_OTHER_LETTER}, + {0x00093e, 0x000940, PG_U_SPACING_MARK}, + {0x000941, 0x000948, PG_U_NONSPACING_MARK}, + {0x000949, 0x00094c, PG_U_SPACING_MARK}, + {0x00094d, 0x00094d, PG_U_NONSPACING_MARK}, + {0x00094e, 0x00094f, PG_U_SPACING_MARK}, + {0x000950, 0x000950, PG_U_OTHER_LETTER}, + {0x000951, 0x000957, PG_U_NONSPACING_MARK}, + {0x000958, 0x000961, PG_U_OTHER_LETTER}, + {0x000962, 0x000963, PG_U_NONSPACING_MARK}, + {0x000964, 0x000965, PG_U_OTHER_PUNCTUATION}, + {0x000966, 0x00096f, PG_U_DECIMAL_NUMBER}, + {0x000970, 0x000970, PG_U_OTHER_PUNCTUATION}, + {0x000971, 0x000971, PG_U_MODIFIER_LETTER}, + {0x000972, 0x000980, PG_U_OTHER_LETTER}, + {0x000981, 0x000981, PG_U_NONSPACING_MARK}, + {0x000982, 0x000983, PG_U_SPACING_MARK}, + {0x000985, 0x00098c, PG_U_OTHER_LETTER}, + {0x00098f, 0x000990, PG_U_OTHER_LETTER}, + {0x000993, 0x0009a8, PG_U_OTHER_LETTER}, + {0x0009aa, 0x0009b0, PG_U_OTHER_LETTER}, + {0x0009b2, 0x0009b2, PG_U_OTHER_LETTER}, + {0x0009b6, 0x0009b9, PG_U_OTHER_LETTER}, + {0x0009bc, 0x0009bc, PG_U_NONSPACING_MARK}, + {0x0009bd, 0x0009bd, PG_U_OTHER_LETTER}, + {0x0009be, 0x0009c0, PG_U_SPACING_MARK}, + {0x0009c1, 0x0009c4, PG_U_NONSPACING_MARK}, + {0x0009c7, 0x0009c8, PG_U_SPACING_MARK}, + {0x0009cb, 0x0009cc, PG_U_SPACING_MARK}, + {0x0009cd, 0x0009cd, PG_U_NONSPACING_MARK}, + {0x0009ce, 0x0009ce, PG_U_OTHER_LETTER}, + {0x0009d7, 0x0009d7, PG_U_SPACING_MARK}, + {0x0009dc, 0x0009dd, PG_U_OTHER_LETTER}, + {0x0009df, 0x0009e1, PG_U_OTHER_LETTER}, + {0x0009e2, 0x0009e3, PG_U_NONSPACING_MARK}, + {0x0009e6, 0x0009ef, PG_U_DECIMAL_NUMBER}, + {0x0009f0, 0x0009f1, PG_U_OTHER_LETTER}, + {0x0009f2, 0x0009f3, PG_U_CURRENCY_SYMBOL}, + {0x0009f4, 0x0009f9, PG_U_OTHER_NUMBER}, + {0x0009fa, 0x0009fa, PG_U_OTHER_SYMBOL}, + {0x0009fb, 0x0009fb, PG_U_CURRENCY_SYMBOL}, + {0x0009fc, 0x0009fc, PG_U_OTHER_LETTER}, + {0x0009fd, 0x0009fd, PG_U_OTHER_PUNCTUATION}, + {0x0009fe, 0x0009fe, PG_U_NONSPACING_MARK}, + {0x000a01, 0x000a02, PG_U_NONSPACING_MARK}, + {0x000a03, 0x000a03, PG_U_SPACING_MARK}, + {0x000a05, 0x000a0a, PG_U_OTHER_LETTER}, + {0x000a0f, 0x000a10, PG_U_OTHER_LETTER}, + {0x000a13, 0x000a28, PG_U_OTHER_LETTER}, + {0x000a2a, 0x000a30, PG_U_OTHER_LETTER}, + {0x000a32, 0x000a33, PG_U_OTHER_LETTER}, + {0x000a35, 0x000a36, PG_U_OTHER_LETTER}, + {0x000a38, 0x000a39, PG_U_OTHER_LETTER}, + {0x000a3c, 0x000a3c, PG_U_NONSPACING_MARK}, + {0x000a3e, 0x000a40, PG_U_SPACING_MARK}, + {0x000a41, 0x000a42, PG_U_NONSPACING_MARK}, + {0x000a47, 0x000a48, PG_U_NONSPACING_MARK}, + {0x000a4b, 0x000a4d, PG_U_NONSPACING_MARK}, + {0x000a51, 0x000a51, PG_U_NONSPACING_MARK}, + {0x000a59, 0x000a5c, PG_U_OTHER_LETTER}, + {0x000a5e, 0x000a5e, PG_U_OTHER_LETTER}, + {0x000a66, 0x000a6f, PG_U_DECIMAL_NUMBER}, + {0x000a70, 0x000a71, PG_U_NONSPACING_MARK}, + {0x000a72, 0x000a74, PG_U_OTHER_LETTER}, + {0x000a75, 0x000a75, PG_U_NONSPACING_MARK}, + {0x000a76, 0x000a76, PG_U_OTHER_PUNCTUATION}, + {0x000a81, 0x000a82, PG_U_NONSPACING_MARK}, + {0x000a83, 0x000a83, PG_U_SPACING_MARK}, + {0x000a85, 0x000a8d, PG_U_OTHER_LETTER}, + {0x000a8f, 0x000a91, PG_U_OTHER_LETTER}, + {0x000a93, 0x000aa8, PG_U_OTHER_LETTER}, + {0x000aaa, 0x000ab0, PG_U_OTHER_LETTER}, + {0x000ab2, 0x000ab3, PG_U_OTHER_LETTER}, + {0x000ab5, 0x000ab9, PG_U_OTHER_LETTER}, + {0x000abc, 0x000abc, PG_U_NONSPACING_MARK}, + {0x000abd, 0x000abd, PG_U_OTHER_LETTER}, + {0x000abe, 0x000ac0, PG_U_SPACING_MARK}, + {0x000ac1, 0x000ac5, PG_U_NONSPACING_MARK}, + {0x000ac7, 0x000ac8, PG_U_NONSPACING_MARK}, + {0x000ac9, 0x000ac9, PG_U_SPACING_MARK}, + {0x000acb, 0x000acc, PG_U_SPACING_MARK}, + {0x000acd, 0x000acd, PG_U_NONSPACING_MARK}, + {0x000ad0, 0x000ad0, PG_U_OTHER_LETTER}, + {0x000ae0, 0x000ae1, PG_U_OTHER_LETTER}, + {0x000ae2, 0x000ae3, PG_U_NONSPACING_MARK}, + {0x000ae6, 0x000aef, PG_U_DECIMAL_NUMBER}, + {0x000af0, 0x000af0, PG_U_OTHER_PUNCTUATION}, + {0x000af1, 0x000af1, PG_U_CURRENCY_SYMBOL}, + {0x000af9, 0x000af9, PG_U_OTHER_LETTER}, + {0x000afa, 0x000aff, PG_U_NONSPACING_MARK}, + {0x000b01, 0x000b01, PG_U_NONSPACING_MARK}, + {0x000b02, 0x000b03, PG_U_SPACING_MARK}, + {0x000b05, 0x000b0c, PG_U_OTHER_LETTER}, + {0x000b0f, 0x000b10, PG_U_OTHER_LETTER}, + {0x000b13, 0x000b28, PG_U_OTHER_LETTER}, + {0x000b2a, 0x000b30, PG_U_OTHER_LETTER}, + {0x000b32, 0x000b33, PG_U_OTHER_LETTER}, + {0x000b35, 0x000b39, PG_U_OTHER_LETTER}, + {0x000b3c, 0x000b3c, PG_U_NONSPACING_MARK}, + {0x000b3d, 0x000b3d, PG_U_OTHER_LETTER}, + {0x000b3e, 0x000b3e, PG_U_SPACING_MARK}, + {0x000b3f, 0x000b3f, PG_U_NONSPACING_MARK}, + {0x000b40, 0x000b40, PG_U_SPACING_MARK}, + {0x000b41, 0x000b44, PG_U_NONSPACING_MARK}, + {0x000b47, 0x000b48, PG_U_SPACING_MARK}, + {0x000b4b, 0x000b4c, PG_U_SPACING_MARK}, + {0x000b4d, 0x000b4d, PG_U_NONSPACING_MARK}, + {0x000b55, 0x000b56, PG_U_NONSPACING_MARK}, + {0x000b57, 0x000b57, PG_U_SPACING_MARK}, + {0x000b5c, 0x000b5d, PG_U_OTHER_LETTER}, + {0x000b5f, 0x000b61, PG_U_OTHER_LETTER}, + {0x000b62, 0x000b63, PG_U_NONSPACING_MARK}, + {0x000b66, 0x000b6f, PG_U_DECIMAL_NUMBER}, + {0x000b70, 0x000b70, PG_U_OTHER_SYMBOL}, + {0x000b71, 0x000b71, PG_U_OTHER_LETTER}, + {0x000b72, 0x000b77, PG_U_OTHER_NUMBER}, + {0x000b82, 0x000b82, PG_U_NONSPACING_MARK}, + {0x000b83, 0x000b83, PG_U_OTHER_LETTER}, + {0x000b85, 0x000b8a, PG_U_OTHER_LETTER}, + {0x000b8e, 0x000b90, PG_U_OTHER_LETTER}, + {0x000b92, 0x000b95, PG_U_OTHER_LETTER}, + {0x000b99, 0x000b9a, PG_U_OTHER_LETTER}, + {0x000b9c, 0x000b9c, PG_U_OTHER_LETTER}, + {0x000b9e, 0x000b9f, PG_U_OTHER_LETTER}, + {0x000ba3, 0x000ba4, PG_U_OTHER_LETTER}, + {0x000ba8, 0x000baa, PG_U_OTHER_LETTER}, + {0x000bae, 0x000bb9, PG_U_OTHER_LETTER}, + {0x000bbe, 0x000bbf, PG_U_SPACING_MARK}, + {0x000bc0, 0x000bc0, PG_U_NONSPACING_MARK}, + {0x000bc1, 0x000bc2, PG_U_SPACING_MARK}, + {0x000bc6, 0x000bc8, PG_U_SPACING_MARK}, + {0x000bca, 0x000bcc, PG_U_SPACING_MARK}, + {0x000bcd, 0x000bcd, PG_U_NONSPACING_MARK}, + {0x000bd0, 0x000bd0, PG_U_OTHER_LETTER}, + {0x000bd7, 0x000bd7, PG_U_SPACING_MARK}, + {0x000be6, 0x000bef, PG_U_DECIMAL_NUMBER}, + {0x000bf0, 0x000bf2, PG_U_OTHER_NUMBER}, + {0x000bf3, 0x000bf8, PG_U_OTHER_SYMBOL}, + {0x000bf9, 0x000bf9, PG_U_CURRENCY_SYMBOL}, + {0x000bfa, 0x000bfa, PG_U_OTHER_SYMBOL}, + {0x000c00, 0x000c00, PG_U_NONSPACING_MARK}, + {0x000c01, 0x000c03, PG_U_SPACING_MARK}, + {0x000c04, 0x000c04, PG_U_NONSPACING_MARK}, + {0x000c05, 0x000c0c, PG_U_OTHER_LETTER}, + {0x000c0e, 0x000c10, PG_U_OTHER_LETTER}, + {0x000c12, 0x000c28, PG_U_OTHER_LETTER}, + {0x000c2a, 0x000c39, PG_U_OTHER_LETTER}, + {0x000c3c, 0x000c3c, PG_U_NONSPACING_MARK}, + {0x000c3d, 0x000c3d, PG_U_OTHER_LETTER}, + {0x000c3e, 0x000c40, PG_U_NONSPACING_MARK}, + {0x000c41, 0x000c44, PG_U_SPACING_MARK}, + {0x000c46, 0x000c48, PG_U_NONSPACING_MARK}, + {0x000c4a, 0x000c4d, PG_U_NONSPACING_MARK}, + {0x000c55, 0x000c56, PG_U_NONSPACING_MARK}, + {0x000c58, 0x000c5a, PG_U_OTHER_LETTER}, + {0x000c5d, 0x000c5d, PG_U_OTHER_LETTER}, + {0x000c60, 0x000c61, PG_U_OTHER_LETTER}, + {0x000c62, 0x000c63, PG_U_NONSPACING_MARK}, + {0x000c66, 0x000c6f, PG_U_DECIMAL_NUMBER}, + {0x000c77, 0x000c77, PG_U_OTHER_PUNCTUATION}, + {0x000c78, 0x000c7e, PG_U_OTHER_NUMBER}, + {0x000c7f, 0x000c7f, PG_U_OTHER_SYMBOL}, + {0x000c80, 0x000c80, PG_U_OTHER_LETTER}, + {0x000c81, 0x000c81, PG_U_NONSPACING_MARK}, + {0x000c82, 0x000c83, PG_U_SPACING_MARK}, + {0x000c84, 0x000c84, PG_U_OTHER_PUNCTUATION}, + {0x000c85, 0x000c8c, PG_U_OTHER_LETTER}, + {0x000c8e, 0x000c90, PG_U_OTHER_LETTER}, + {0x000c92, 0x000ca8, PG_U_OTHER_LETTER}, + {0x000caa, 0x000cb3, PG_U_OTHER_LETTER}, + {0x000cb5, 0x000cb9, PG_U_OTHER_LETTER}, + {0x000cbc, 0x000cbc, PG_U_NONSPACING_MARK}, + {0x000cbd, 0x000cbd, PG_U_OTHER_LETTER}, + {0x000cbe, 0x000cbe, PG_U_SPACING_MARK}, + {0x000cbf, 0x000cbf, PG_U_NONSPACING_MARK}, + {0x000cc0, 0x000cc4, PG_U_SPACING_MARK}, + {0x000cc6, 0x000cc6, PG_U_NONSPACING_MARK}, + {0x000cc7, 0x000cc8, PG_U_SPACING_MARK}, + {0x000cca, 0x000ccb, PG_U_SPACING_MARK}, + {0x000ccc, 0x000ccd, PG_U_NONSPACING_MARK}, + {0x000cd5, 0x000cd6, PG_U_SPACING_MARK}, + {0x000cdd, 0x000cde, PG_U_OTHER_LETTER}, + {0x000ce0, 0x000ce1, PG_U_OTHER_LETTER}, + {0x000ce2, 0x000ce3, PG_U_NONSPACING_MARK}, + {0x000ce6, 0x000cef, PG_U_DECIMAL_NUMBER}, + {0x000cf1, 0x000cf2, PG_U_OTHER_LETTER}, + {0x000cf3, 0x000cf3, PG_U_SPACING_MARK}, + {0x000d00, 0x000d01, PG_U_NONSPACING_MARK}, + {0x000d02, 0x000d03, PG_U_SPACING_MARK}, + {0x000d04, 0x000d0c, PG_U_OTHER_LETTER}, + {0x000d0e, 0x000d10, PG_U_OTHER_LETTER}, + {0x000d12, 0x000d3a, PG_U_OTHER_LETTER}, + {0x000d3b, 0x000d3c, PG_U_NONSPACING_MARK}, + {0x000d3d, 0x000d3d, PG_U_OTHER_LETTER}, + {0x000d3e, 0x000d40, PG_U_SPACING_MARK}, + {0x000d41, 0x000d44, PG_U_NONSPACING_MARK}, + {0x000d46, 0x000d48, PG_U_SPACING_MARK}, + {0x000d4a, 0x000d4c, PG_U_SPACING_MARK}, + {0x000d4d, 0x000d4d, PG_U_NONSPACING_MARK}, + {0x000d4e, 0x000d4e, PG_U_OTHER_LETTER}, + {0x000d4f, 0x000d4f, PG_U_OTHER_SYMBOL}, + {0x000d54, 0x000d56, PG_U_OTHER_LETTER}, + {0x000d57, 0x000d57, PG_U_SPACING_MARK}, + {0x000d58, 0x000d5e, PG_U_OTHER_NUMBER}, + {0x000d5f, 0x000d61, PG_U_OTHER_LETTER}, + {0x000d62, 0x000d63, PG_U_NONSPACING_MARK}, + {0x000d66, 0x000d6f, PG_U_DECIMAL_NUMBER}, + {0x000d70, 0x000d78, PG_U_OTHER_NUMBER}, + {0x000d79, 0x000d79, PG_U_OTHER_SYMBOL}, + {0x000d7a, 0x000d7f, PG_U_OTHER_LETTER}, + {0x000d81, 0x000d81, PG_U_NONSPACING_MARK}, + {0x000d82, 0x000d83, PG_U_SPACING_MARK}, + {0x000d85, 0x000d96, PG_U_OTHER_LETTER}, + {0x000d9a, 0x000db1, PG_U_OTHER_LETTER}, + {0x000db3, 0x000dbb, PG_U_OTHER_LETTER}, + {0x000dbd, 0x000dbd, PG_U_OTHER_LETTER}, + {0x000dc0, 0x000dc6, PG_U_OTHER_LETTER}, + {0x000dca, 0x000dca, PG_U_NONSPACING_MARK}, + {0x000dcf, 0x000dd1, PG_U_SPACING_MARK}, + {0x000dd2, 0x000dd4, PG_U_NONSPACING_MARK}, + {0x000dd6, 0x000dd6, PG_U_NONSPACING_MARK}, + {0x000dd8, 0x000ddf, PG_U_SPACING_MARK}, + {0x000de6, 0x000def, PG_U_DECIMAL_NUMBER}, + {0x000df2, 0x000df3, PG_U_SPACING_MARK}, + {0x000df4, 0x000df4, PG_U_OTHER_PUNCTUATION}, + {0x000e01, 0x000e30, PG_U_OTHER_LETTER}, + {0x000e31, 0x000e31, PG_U_NONSPACING_MARK}, + {0x000e32, 0x000e33, PG_U_OTHER_LETTER}, + {0x000e34, 0x000e3a, PG_U_NONSPACING_MARK}, + {0x000e3f, 0x000e3f, PG_U_CURRENCY_SYMBOL}, + {0x000e40, 0x000e45, PG_U_OTHER_LETTER}, + {0x000e46, 0x000e46, PG_U_MODIFIER_LETTER}, + {0x000e47, 0x000e4e, PG_U_NONSPACING_MARK}, + {0x000e4f, 0x000e4f, PG_U_OTHER_PUNCTUATION}, + {0x000e50, 0x000e59, PG_U_DECIMAL_NUMBER}, + {0x000e5a, 0x000e5b, PG_U_OTHER_PUNCTUATION}, + {0x000e81, 0x000e82, PG_U_OTHER_LETTER}, + {0x000e84, 0x000e84, PG_U_OTHER_LETTER}, + {0x000e86, 0x000e8a, PG_U_OTHER_LETTER}, + {0x000e8c, 0x000ea3, PG_U_OTHER_LETTER}, + {0x000ea5, 0x000ea5, PG_U_OTHER_LETTER}, + {0x000ea7, 0x000eb0, PG_U_OTHER_LETTER}, + {0x000eb1, 0x000eb1, PG_U_NONSPACING_MARK}, + {0x000eb2, 0x000eb3, PG_U_OTHER_LETTER}, + {0x000eb4, 0x000ebc, PG_U_NONSPACING_MARK}, + {0x000ebd, 0x000ebd, PG_U_OTHER_LETTER}, + {0x000ec0, 0x000ec4, PG_U_OTHER_LETTER}, + {0x000ec6, 0x000ec6, PG_U_MODIFIER_LETTER}, + {0x000ec8, 0x000ece, PG_U_NONSPACING_MARK}, + {0x000ed0, 0x000ed9, PG_U_DECIMAL_NUMBER}, + {0x000edc, 0x000edf, PG_U_OTHER_LETTER}, + {0x000f00, 0x000f00, PG_U_OTHER_LETTER}, + {0x000f01, 0x000f03, PG_U_OTHER_SYMBOL}, + {0x000f04, 0x000f12, PG_U_OTHER_PUNCTUATION}, + {0x000f13, 0x000f13, PG_U_OTHER_SYMBOL}, + {0x000f14, 0x000f14, PG_U_OTHER_PUNCTUATION}, + {0x000f15, 0x000f17, PG_U_OTHER_SYMBOL}, + {0x000f18, 0x000f19, PG_U_NONSPACING_MARK}, + {0x000f1a, 0x000f1f, PG_U_OTHER_SYMBOL}, + {0x000f20, 0x000f29, PG_U_DECIMAL_NUMBER}, + {0x000f2a, 0x000f33, PG_U_OTHER_NUMBER}, + {0x000f34, 0x000f34, PG_U_OTHER_SYMBOL}, + {0x000f35, 0x000f35, PG_U_NONSPACING_MARK}, + {0x000f36, 0x000f36, PG_U_OTHER_SYMBOL}, + {0x000f37, 0x000f37, PG_U_NONSPACING_MARK}, + {0x000f38, 0x000f38, PG_U_OTHER_SYMBOL}, + {0x000f39, 0x000f39, PG_U_NONSPACING_MARK}, + {0x000f3a, 0x000f3a, PG_U_OPEN_PUNCTUATION}, + {0x000f3b, 0x000f3b, PG_U_CLOSE_PUNCTUATION}, + {0x000f3c, 0x000f3c, PG_U_OPEN_PUNCTUATION}, + {0x000f3d, 0x000f3d, PG_U_CLOSE_PUNCTUATION}, + {0x000f3e, 0x000f3f, PG_U_SPACING_MARK}, + {0x000f40, 0x000f47, PG_U_OTHER_LETTER}, + {0x000f49, 0x000f6c, PG_U_OTHER_LETTER}, + {0x000f71, 0x000f7e, PG_U_NONSPACING_MARK}, + {0x000f7f, 0x000f7f, PG_U_SPACING_MARK}, + {0x000f80, 0x000f84, PG_U_NONSPACING_MARK}, + {0x000f85, 0x000f85, PG_U_OTHER_PUNCTUATION}, + {0x000f86, 0x000f87, PG_U_NONSPACING_MARK}, + {0x000f88, 0x000f8c, PG_U_OTHER_LETTER}, + {0x000f8d, 0x000f97, PG_U_NONSPACING_MARK}, + {0x000f99, 0x000fbc, PG_U_NONSPACING_MARK}, + {0x000fbe, 0x000fc5, PG_U_OTHER_SYMBOL}, + {0x000fc6, 0x000fc6, PG_U_NONSPACING_MARK}, + {0x000fc7, 0x000fcc, PG_U_OTHER_SYMBOL}, + {0x000fce, 0x000fcf, PG_U_OTHER_SYMBOL}, + {0x000fd0, 0x000fd4, PG_U_OTHER_PUNCTUATION}, + {0x000fd5, 0x000fd8, PG_U_OTHER_SYMBOL}, + {0x000fd9, 0x000fda, PG_U_OTHER_PUNCTUATION}, + {0x001000, 0x00102a, PG_U_OTHER_LETTER}, + {0x00102b, 0x00102c, PG_U_SPACING_MARK}, + {0x00102d, 0x001030, PG_U_NONSPACING_MARK}, + {0x001031, 0x001031, PG_U_SPACING_MARK}, + {0x001032, 0x001037, PG_U_NONSPACING_MARK}, + {0x001038, 0x001038, PG_U_SPACING_MARK}, + {0x001039, 0x00103a, PG_U_NONSPACING_MARK}, + {0x00103b, 0x00103c, PG_U_SPACING_MARK}, + {0x00103d, 0x00103e, PG_U_NONSPACING_MARK}, + {0x00103f, 0x00103f, PG_U_OTHER_LETTER}, + {0x001040, 0x001049, PG_U_DECIMAL_NUMBER}, + {0x00104a, 0x00104f, PG_U_OTHER_PUNCTUATION}, + {0x001050, 0x001055, PG_U_OTHER_LETTER}, + {0x001056, 0x001057, PG_U_SPACING_MARK}, + {0x001058, 0x001059, PG_U_NONSPACING_MARK}, + {0x00105a, 0x00105d, PG_U_OTHER_LETTER}, + {0x00105e, 0x001060, PG_U_NONSPACING_MARK}, + {0x001061, 0x001061, PG_U_OTHER_LETTER}, + {0x001062, 0x001064, PG_U_SPACING_MARK}, + {0x001065, 0x001066, PG_U_OTHER_LETTER}, + {0x001067, 0x00106d, PG_U_SPACING_MARK}, + {0x00106e, 0x001070, PG_U_OTHER_LETTER}, + {0x001071, 0x001074, PG_U_NONSPACING_MARK}, + {0x001075, 0x001081, PG_U_OTHER_LETTER}, + {0x001082, 0x001082, PG_U_NONSPACING_MARK}, + {0x001083, 0x001084, PG_U_SPACING_MARK}, + {0x001085, 0x001086, PG_U_NONSPACING_MARK}, + {0x001087, 0x00108c, PG_U_SPACING_MARK}, + {0x00108d, 0x00108d, PG_U_NONSPACING_MARK}, + {0x00108e, 0x00108e, PG_U_OTHER_LETTER}, + {0x00108f, 0x00108f, PG_U_SPACING_MARK}, + {0x001090, 0x001099, PG_U_DECIMAL_NUMBER}, + {0x00109a, 0x00109c, PG_U_SPACING_MARK}, + {0x00109d, 0x00109d, PG_U_NONSPACING_MARK}, + {0x00109e, 0x00109f, PG_U_OTHER_SYMBOL}, + {0x0010a0, 0x0010c5, PG_U_UPPERCASE_LETTER}, + {0x0010c7, 0x0010c7, PG_U_UPPERCASE_LETTER}, + {0x0010cd, 0x0010cd, PG_U_UPPERCASE_LETTER}, + {0x0010d0, 0x0010fa, PG_U_LOWERCASE_LETTER}, + {0x0010fb, 0x0010fb, PG_U_OTHER_PUNCTUATION}, + {0x0010fc, 0x0010fc, PG_U_MODIFIER_LETTER}, + {0x0010fd, 0x0010ff, PG_U_LOWERCASE_LETTER}, + {0x001100, 0x001248, PG_U_OTHER_LETTER}, + {0x00124a, 0x00124d, PG_U_OTHER_LETTER}, + {0x001250, 0x001256, PG_U_OTHER_LETTER}, + {0x001258, 0x001258, PG_U_OTHER_LETTER}, + {0x00125a, 0x00125d, PG_U_OTHER_LETTER}, + {0x001260, 0x001288, PG_U_OTHER_LETTER}, + {0x00128a, 0x00128d, PG_U_OTHER_LETTER}, + {0x001290, 0x0012b0, PG_U_OTHER_LETTER}, + {0x0012b2, 0x0012b5, PG_U_OTHER_LETTER}, + {0x0012b8, 0x0012be, PG_U_OTHER_LETTER}, + {0x0012c0, 0x0012c0, PG_U_OTHER_LETTER}, + {0x0012c2, 0x0012c5, PG_U_OTHER_LETTER}, + {0x0012c8, 0x0012d6, PG_U_OTHER_LETTER}, + {0x0012d8, 0x001310, PG_U_OTHER_LETTER}, + {0x001312, 0x001315, PG_U_OTHER_LETTER}, + {0x001318, 0x00135a, PG_U_OTHER_LETTER}, + {0x00135d, 0x00135f, PG_U_NONSPACING_MARK}, + {0x001360, 0x001368, PG_U_OTHER_PUNCTUATION}, + {0x001369, 0x00137c, PG_U_OTHER_NUMBER}, + {0x001380, 0x00138f, PG_U_OTHER_LETTER}, + {0x001390, 0x001399, PG_U_OTHER_SYMBOL}, + {0x0013a0, 0x0013f5, PG_U_UPPERCASE_LETTER}, + {0x0013f8, 0x0013fd, PG_U_LOWERCASE_LETTER}, + {0x001400, 0x001400, PG_U_DASH_PUNCTUATION}, + {0x001401, 0x00166c, PG_U_OTHER_LETTER}, + {0x00166d, 0x00166d, PG_U_OTHER_SYMBOL}, + {0x00166e, 0x00166e, PG_U_OTHER_PUNCTUATION}, + {0x00166f, 0x00167f, PG_U_OTHER_LETTER}, + {0x001680, 0x001680, PG_U_SPACE_SEPARATOR}, + {0x001681, 0x00169a, PG_U_OTHER_LETTER}, + {0x00169b, 0x00169b, PG_U_OPEN_PUNCTUATION}, + {0x00169c, 0x00169c, PG_U_CLOSE_PUNCTUATION}, + {0x0016a0, 0x0016ea, PG_U_OTHER_LETTER}, + {0x0016eb, 0x0016ed, PG_U_OTHER_PUNCTUATION}, + {0x0016ee, 0x0016f0, PG_U_LETTER_NUMBER}, + {0x0016f1, 0x0016f8, PG_U_OTHER_LETTER}, + {0x001700, 0x001711, PG_U_OTHER_LETTER}, + {0x001712, 0x001714, PG_U_NONSPACING_MARK}, + {0x001715, 0x001715, PG_U_SPACING_MARK}, + {0x00171f, 0x001731, PG_U_OTHER_LETTER}, + {0x001732, 0x001733, PG_U_NONSPACING_MARK}, + {0x001734, 0x001734, PG_U_SPACING_MARK}, + {0x001735, 0x001736, PG_U_OTHER_PUNCTUATION}, + {0x001740, 0x001751, PG_U_OTHER_LETTER}, + {0x001752, 0x001753, PG_U_NONSPACING_MARK}, + {0x001760, 0x00176c, PG_U_OTHER_LETTER}, + {0x00176e, 0x001770, PG_U_OTHER_LETTER}, + {0x001772, 0x001773, PG_U_NONSPACING_MARK}, + {0x001780, 0x0017b3, PG_U_OTHER_LETTER}, + {0x0017b4, 0x0017b5, PG_U_NONSPACING_MARK}, + {0x0017b6, 0x0017b6, PG_U_SPACING_MARK}, + {0x0017b7, 0x0017bd, PG_U_NONSPACING_MARK}, + {0x0017be, 0x0017c5, PG_U_SPACING_MARK}, + {0x0017c6, 0x0017c6, PG_U_NONSPACING_MARK}, + {0x0017c7, 0x0017c8, PG_U_SPACING_MARK}, + {0x0017c9, 0x0017d3, PG_U_NONSPACING_MARK}, + {0x0017d4, 0x0017d6, PG_U_OTHER_PUNCTUATION}, + {0x0017d7, 0x0017d7, PG_U_MODIFIER_LETTER}, + {0x0017d8, 0x0017da, PG_U_OTHER_PUNCTUATION}, + {0x0017db, 0x0017db, PG_U_CURRENCY_SYMBOL}, + {0x0017dc, 0x0017dc, PG_U_OTHER_LETTER}, + {0x0017dd, 0x0017dd, PG_U_NONSPACING_MARK}, + {0x0017e0, 0x0017e9, PG_U_DECIMAL_NUMBER}, + {0x0017f0, 0x0017f9, PG_U_OTHER_NUMBER}, + {0x001800, 0x001805, PG_U_OTHER_PUNCTUATION}, + {0x001806, 0x001806, PG_U_DASH_PUNCTUATION}, + {0x001807, 0x00180a, PG_U_OTHER_PUNCTUATION}, + {0x00180b, 0x00180d, PG_U_NONSPACING_MARK}, + {0x00180e, 0x00180e, PG_U_FORMAT}, + {0x00180f, 0x00180f, PG_U_NONSPACING_MARK}, + {0x001810, 0x001819, PG_U_DECIMAL_NUMBER}, + {0x001820, 0x001842, PG_U_OTHER_LETTER}, + {0x001843, 0x001843, PG_U_MODIFIER_LETTER}, + {0x001844, 0x001878, PG_U_OTHER_LETTER}, + {0x001880, 0x001884, PG_U_OTHER_LETTER}, + {0x001885, 0x001886, PG_U_NONSPACING_MARK}, + {0x001887, 0x0018a8, PG_U_OTHER_LETTER}, + {0x0018a9, 0x0018a9, PG_U_NONSPACING_MARK}, + {0x0018aa, 0x0018aa, PG_U_OTHER_LETTER}, + {0x0018b0, 0x0018f5, PG_U_OTHER_LETTER}, + {0x001900, 0x00191e, PG_U_OTHER_LETTER}, + {0x001920, 0x001922, PG_U_NONSPACING_MARK}, + {0x001923, 0x001926, PG_U_SPACING_MARK}, + {0x001927, 0x001928, PG_U_NONSPACING_MARK}, + {0x001929, 0x00192b, PG_U_SPACING_MARK}, + {0x001930, 0x001931, PG_U_SPACING_MARK}, + {0x001932, 0x001932, PG_U_NONSPACING_MARK}, + {0x001933, 0x001938, PG_U_SPACING_MARK}, + {0x001939, 0x00193b, PG_U_NONSPACING_MARK}, + {0x001940, 0x001940, PG_U_OTHER_SYMBOL}, + {0x001944, 0x001945, PG_U_OTHER_PUNCTUATION}, + {0x001946, 0x00194f, PG_U_DECIMAL_NUMBER}, + {0x001950, 0x00196d, PG_U_OTHER_LETTER}, + {0x001970, 0x001974, PG_U_OTHER_LETTER}, + {0x001980, 0x0019ab, PG_U_OTHER_LETTER}, + {0x0019b0, 0x0019c9, PG_U_OTHER_LETTER}, + {0x0019d0, 0x0019d9, PG_U_DECIMAL_NUMBER}, + {0x0019da, 0x0019da, PG_U_OTHER_NUMBER}, + {0x0019de, 0x0019ff, PG_U_OTHER_SYMBOL}, + {0x001a00, 0x001a16, PG_U_OTHER_LETTER}, + {0x001a17, 0x001a18, PG_U_NONSPACING_MARK}, + {0x001a19, 0x001a1a, PG_U_SPACING_MARK}, + {0x001a1b, 0x001a1b, PG_U_NONSPACING_MARK}, + {0x001a1e, 0x001a1f, PG_U_OTHER_PUNCTUATION}, + {0x001a20, 0x001a54, PG_U_OTHER_LETTER}, + {0x001a55, 0x001a55, PG_U_SPACING_MARK}, + {0x001a56, 0x001a56, PG_U_NONSPACING_MARK}, + {0x001a57, 0x001a57, PG_U_SPACING_MARK}, + {0x001a58, 0x001a5e, PG_U_NONSPACING_MARK}, + {0x001a60, 0x001a60, PG_U_NONSPACING_MARK}, + {0x001a61, 0x001a61, PG_U_SPACING_MARK}, + {0x001a62, 0x001a62, PG_U_NONSPACING_MARK}, + {0x001a63, 0x001a64, PG_U_SPACING_MARK}, + {0x001a65, 0x001a6c, PG_U_NONSPACING_MARK}, + {0x001a6d, 0x001a72, PG_U_SPACING_MARK}, + {0x001a73, 0x001a7c, PG_U_NONSPACING_MARK}, + {0x001a7f, 0x001a7f, PG_U_NONSPACING_MARK}, + {0x001a80, 0x001a89, PG_U_DECIMAL_NUMBER}, + {0x001a90, 0x001a99, PG_U_DECIMAL_NUMBER}, + {0x001aa0, 0x001aa6, PG_U_OTHER_PUNCTUATION}, + {0x001aa7, 0x001aa7, PG_U_MODIFIER_LETTER}, + {0x001aa8, 0x001aad, PG_U_OTHER_PUNCTUATION}, + {0x001ab0, 0x001abd, PG_U_NONSPACING_MARK}, + {0x001abe, 0x001abe, PG_U_ENCLOSING_MARK}, + {0x001abf, 0x001ace, PG_U_NONSPACING_MARK}, + {0x001b00, 0x001b03, PG_U_NONSPACING_MARK}, + {0x001b04, 0x001b04, PG_U_SPACING_MARK}, + {0x001b05, 0x001b33, PG_U_OTHER_LETTER}, + {0x001b34, 0x001b34, PG_U_NONSPACING_MARK}, + {0x001b35, 0x001b35, PG_U_SPACING_MARK}, + {0x001b36, 0x001b3a, PG_U_NONSPACING_MARK}, + {0x001b3b, 0x001b3b, PG_U_SPACING_MARK}, + {0x001b3c, 0x001b3c, PG_U_NONSPACING_MARK}, + {0x001b3d, 0x001b41, PG_U_SPACING_MARK}, + {0x001b42, 0x001b42, PG_U_NONSPACING_MARK}, + {0x001b43, 0x001b44, PG_U_SPACING_MARK}, + {0x001b45, 0x001b4c, PG_U_OTHER_LETTER}, + {0x001b50, 0x001b59, PG_U_DECIMAL_NUMBER}, + {0x001b5a, 0x001b60, PG_U_OTHER_PUNCTUATION}, + {0x001b61, 0x001b6a, PG_U_OTHER_SYMBOL}, + {0x001b6b, 0x001b73, PG_U_NONSPACING_MARK}, + {0x001b74, 0x001b7c, PG_U_OTHER_SYMBOL}, + {0x001b7d, 0x001b7e, PG_U_OTHER_PUNCTUATION}, + {0x001b80, 0x001b81, PG_U_NONSPACING_MARK}, + {0x001b82, 0x001b82, PG_U_SPACING_MARK}, + {0x001b83, 0x001ba0, PG_U_OTHER_LETTER}, + {0x001ba1, 0x001ba1, PG_U_SPACING_MARK}, + {0x001ba2, 0x001ba5, PG_U_NONSPACING_MARK}, + {0x001ba6, 0x001ba7, PG_U_SPACING_MARK}, + {0x001ba8, 0x001ba9, PG_U_NONSPACING_MARK}, + {0x001baa, 0x001baa, PG_U_SPACING_MARK}, + {0x001bab, 0x001bad, PG_U_NONSPACING_MARK}, + {0x001bae, 0x001baf, PG_U_OTHER_LETTER}, + {0x001bb0, 0x001bb9, PG_U_DECIMAL_NUMBER}, + {0x001bba, 0x001be5, PG_U_OTHER_LETTER}, + {0x001be6, 0x001be6, PG_U_NONSPACING_MARK}, + {0x001be7, 0x001be7, PG_U_SPACING_MARK}, + {0x001be8, 0x001be9, PG_U_NONSPACING_MARK}, + {0x001bea, 0x001bec, PG_U_SPACING_MARK}, + {0x001bed, 0x001bed, PG_U_NONSPACING_MARK}, + {0x001bee, 0x001bee, PG_U_SPACING_MARK}, + {0x001bef, 0x001bf1, PG_U_NONSPACING_MARK}, + {0x001bf2, 0x001bf3, PG_U_SPACING_MARK}, + {0x001bfc, 0x001bff, PG_U_OTHER_PUNCTUATION}, + {0x001c00, 0x001c23, PG_U_OTHER_LETTER}, + {0x001c24, 0x001c2b, PG_U_SPACING_MARK}, + {0x001c2c, 0x001c33, PG_U_NONSPACING_MARK}, + {0x001c34, 0x001c35, PG_U_SPACING_MARK}, + {0x001c36, 0x001c37, PG_U_NONSPACING_MARK}, + {0x001c3b, 0x001c3f, PG_U_OTHER_PUNCTUATION}, + {0x001c40, 0x001c49, PG_U_DECIMAL_NUMBER}, + {0x001c4d, 0x001c4f, PG_U_OTHER_LETTER}, + {0x001c50, 0x001c59, PG_U_DECIMAL_NUMBER}, + {0x001c5a, 0x001c77, PG_U_OTHER_LETTER}, + {0x001c78, 0x001c7d, PG_U_MODIFIER_LETTER}, + {0x001c7e, 0x001c7f, PG_U_OTHER_PUNCTUATION}, + {0x001c80, 0x001c88, PG_U_LOWERCASE_LETTER}, + {0x001c90, 0x001cba, PG_U_UPPERCASE_LETTER}, + {0x001cbd, 0x001cbf, PG_U_UPPERCASE_LETTER}, + {0x001cc0, 0x001cc7, PG_U_OTHER_PUNCTUATION}, + {0x001cd0, 0x001cd2, PG_U_NONSPACING_MARK}, + {0x001cd3, 0x001cd3, PG_U_OTHER_PUNCTUATION}, + {0x001cd4, 0x001ce0, PG_U_NONSPACING_MARK}, + {0x001ce1, 0x001ce1, PG_U_SPACING_MARK}, + {0x001ce2, 0x001ce8, PG_U_NONSPACING_MARK}, + {0x001ce9, 0x001cec, PG_U_OTHER_LETTER}, + {0x001ced, 0x001ced, PG_U_NONSPACING_MARK}, + {0x001cee, 0x001cf3, PG_U_OTHER_LETTER}, + {0x001cf4, 0x001cf4, PG_U_NONSPACING_MARK}, + {0x001cf5, 0x001cf6, PG_U_OTHER_LETTER}, + {0x001cf7, 0x001cf7, PG_U_SPACING_MARK}, + {0x001cf8, 0x001cf9, PG_U_NONSPACING_MARK}, + {0x001cfa, 0x001cfa, PG_U_OTHER_LETTER}, + {0x001d00, 0x001d2b, PG_U_LOWERCASE_LETTER}, + {0x001d2c, 0x001d6a, PG_U_MODIFIER_LETTER}, + {0x001d6b, 0x001d77, PG_U_LOWERCASE_LETTER}, + {0x001d78, 0x001d78, PG_U_MODIFIER_LETTER}, + {0x001d79, 0x001d9a, PG_U_LOWERCASE_LETTER}, + {0x001d9b, 0x001dbf, PG_U_MODIFIER_LETTER}, + {0x001dc0, 0x001dff, PG_U_NONSPACING_MARK}, + {0x001e00, 0x001e00, PG_U_UPPERCASE_LETTER}, + {0x001e01, 0x001e01, PG_U_LOWERCASE_LETTER}, + {0x001e02, 0x001e02, PG_U_UPPERCASE_LETTER}, + {0x001e03, 0x001e03, PG_U_LOWERCASE_LETTER}, + {0x001e04, 0x001e04, PG_U_UPPERCASE_LETTER}, + {0x001e05, 0x001e05, PG_U_LOWERCASE_LETTER}, + {0x001e06, 0x001e06, PG_U_UPPERCASE_LETTER}, + {0x001e07, 0x001e07, PG_U_LOWERCASE_LETTER}, + {0x001e08, 0x001e08, PG_U_UPPERCASE_LETTER}, + {0x001e09, 0x001e09, PG_U_LOWERCASE_LETTER}, + {0x001e0a, 0x001e0a, PG_U_UPPERCASE_LETTER}, + {0x001e0b, 0x001e0b, PG_U_LOWERCASE_LETTER}, + {0x001e0c, 0x001e0c, PG_U_UPPERCASE_LETTER}, + {0x001e0d, 0x001e0d, PG_U_LOWERCASE_LETTER}, + {0x001e0e, 0x001e0e, PG_U_UPPERCASE_LETTER}, + {0x001e0f, 0x001e0f, PG_U_LOWERCASE_LETTER}, + {0x001e10, 0x001e10, PG_U_UPPERCASE_LETTER}, + {0x001e11, 0x001e11, PG_U_LOWERCASE_LETTER}, + {0x001e12, 0x001e12, PG_U_UPPERCASE_LETTER}, + {0x001e13, 0x001e13, PG_U_LOWERCASE_LETTER}, + {0x001e14, 0x001e14, PG_U_UPPERCASE_LETTER}, + {0x001e15, 0x001e15, PG_U_LOWERCASE_LETTER}, + {0x001e16, 0x001e16, PG_U_UPPERCASE_LETTER}, + {0x001e17, 0x001e17, PG_U_LOWERCASE_LETTER}, + {0x001e18, 0x001e18, PG_U_UPPERCASE_LETTER}, + {0x001e19, 0x001e19, PG_U_LOWERCASE_LETTER}, + {0x001e1a, 0x001e1a, PG_U_UPPERCASE_LETTER}, + {0x001e1b, 0x001e1b, PG_U_LOWERCASE_LETTER}, + {0x001e1c, 0x001e1c, PG_U_UPPERCASE_LETTER}, + {0x001e1d, 0x001e1d, PG_U_LOWERCASE_LETTER}, + {0x001e1e, 0x001e1e, PG_U_UPPERCASE_LETTER}, + {0x001e1f, 0x001e1f, PG_U_LOWERCASE_LETTER}, + {0x001e20, 0x001e20, PG_U_UPPERCASE_LETTER}, + {0x001e21, 0x001e21, PG_U_LOWERCASE_LETTER}, + {0x001e22, 0x001e22, PG_U_UPPERCASE_LETTER}, + {0x001e23, 0x001e23, PG_U_LOWERCASE_LETTER}, + {0x001e24, 0x001e24, PG_U_UPPERCASE_LETTER}, + {0x001e25, 0x001e25, PG_U_LOWERCASE_LETTER}, + {0x001e26, 0x001e26, PG_U_UPPERCASE_LETTER}, + {0x001e27, 0x001e27, PG_U_LOWERCASE_LETTER}, + {0x001e28, 0x001e28, PG_U_UPPERCASE_LETTER}, + {0x001e29, 0x001e29, PG_U_LOWERCASE_LETTER}, + {0x001e2a, 0x001e2a, PG_U_UPPERCASE_LETTER}, + {0x001e2b, 0x001e2b, PG_U_LOWERCASE_LETTER}, + {0x001e2c, 0x001e2c, PG_U_UPPERCASE_LETTER}, + {0x001e2d, 0x001e2d, PG_U_LOWERCASE_LETTER}, + {0x001e2e, 0x001e2e, PG_U_UPPERCASE_LETTER}, + {0x001e2f, 0x001e2f, PG_U_LOWERCASE_LETTER}, + {0x001e30, 0x001e30, PG_U_UPPERCASE_LETTER}, + {0x001e31, 0x001e31, PG_U_LOWERCASE_LETTER}, + {0x001e32, 0x001e32, PG_U_UPPERCASE_LETTER}, + {0x001e33, 0x001e33, PG_U_LOWERCASE_LETTER}, + {0x001e34, 0x001e34, PG_U_UPPERCASE_LETTER}, + {0x001e35, 0x001e35, PG_U_LOWERCASE_LETTER}, + {0x001e36, 0x001e36, PG_U_UPPERCASE_LETTER}, + {0x001e37, 0x001e37, PG_U_LOWERCASE_LETTER}, + {0x001e38, 0x001e38, PG_U_UPPERCASE_LETTER}, + {0x001e39, 0x001e39, PG_U_LOWERCASE_LETTER}, + {0x001e3a, 0x001e3a, PG_U_UPPERCASE_LETTER}, + {0x001e3b, 0x001e3b, PG_U_LOWERCASE_LETTER}, + {0x001e3c, 0x001e3c, PG_U_UPPERCASE_LETTER}, + {0x001e3d, 0x001e3d, PG_U_LOWERCASE_LETTER}, + {0x001e3e, 0x001e3e, PG_U_UPPERCASE_LETTER}, + {0x001e3f, 0x001e3f, PG_U_LOWERCASE_LETTER}, + {0x001e40, 0x001e40, PG_U_UPPERCASE_LETTER}, + {0x001e41, 0x001e41, PG_U_LOWERCASE_LETTER}, + {0x001e42, 0x001e42, PG_U_UPPERCASE_LETTER}, + {0x001e43, 0x001e43, PG_U_LOWERCASE_LETTER}, + {0x001e44, 0x001e44, PG_U_UPPERCASE_LETTER}, + {0x001e45, 0x001e45, PG_U_LOWERCASE_LETTER}, + {0x001e46, 0x001e46, PG_U_UPPERCASE_LETTER}, + {0x001e47, 0x001e47, PG_U_LOWERCASE_LETTER}, + {0x001e48, 0x001e48, PG_U_UPPERCASE_LETTER}, + {0x001e49, 0x001e49, PG_U_LOWERCASE_LETTER}, + {0x001e4a, 0x001e4a, PG_U_UPPERCASE_LETTER}, + {0x001e4b, 0x001e4b, PG_U_LOWERCASE_LETTER}, + {0x001e4c, 0x001e4c, PG_U_UPPERCASE_LETTER}, + {0x001e4d, 0x001e4d, PG_U_LOWERCASE_LETTER}, + {0x001e4e, 0x001e4e, PG_U_UPPERCASE_LETTER}, + {0x001e4f, 0x001e4f, PG_U_LOWERCASE_LETTER}, + {0x001e50, 0x001e50, PG_U_UPPERCASE_LETTER}, + {0x001e51, 0x001e51, PG_U_LOWERCASE_LETTER}, + {0x001e52, 0x001e52, PG_U_UPPERCASE_LETTER}, + {0x001e53, 0x001e53, PG_U_LOWERCASE_LETTER}, + {0x001e54, 0x001e54, PG_U_UPPERCASE_LETTER}, + {0x001e55, 0x001e55, PG_U_LOWERCASE_LETTER}, + {0x001e56, 0x001e56, PG_U_UPPERCASE_LETTER}, + {0x001e57, 0x001e57, PG_U_LOWERCASE_LETTER}, + {0x001e58, 0x001e58, PG_U_UPPERCASE_LETTER}, + {0x001e59, 0x001e59, PG_U_LOWERCASE_LETTER}, + {0x001e5a, 0x001e5a, PG_U_UPPERCASE_LETTER}, + {0x001e5b, 0x001e5b, PG_U_LOWERCASE_LETTER}, + {0x001e5c, 0x001e5c, PG_U_UPPERCASE_LETTER}, + {0x001e5d, 0x001e5d, PG_U_LOWERCASE_LETTER}, + {0x001e5e, 0x001e5e, PG_U_UPPERCASE_LETTER}, + {0x001e5f, 0x001e5f, PG_U_LOWERCASE_LETTER}, + {0x001e60, 0x001e60, PG_U_UPPERCASE_LETTER}, + {0x001e61, 0x001e61, PG_U_LOWERCASE_LETTER}, + {0x001e62, 0x001e62, PG_U_UPPERCASE_LETTER}, + {0x001e63, 0x001e63, PG_U_LOWERCASE_LETTER}, + {0x001e64, 0x001e64, PG_U_UPPERCASE_LETTER}, + {0x001e65, 0x001e65, PG_U_LOWERCASE_LETTER}, + {0x001e66, 0x001e66, PG_U_UPPERCASE_LETTER}, + {0x001e67, 0x001e67, PG_U_LOWERCASE_LETTER}, + {0x001e68, 0x001e68, PG_U_UPPERCASE_LETTER}, + {0x001e69, 0x001e69, PG_U_LOWERCASE_LETTER}, + {0x001e6a, 0x001e6a, PG_U_UPPERCASE_LETTER}, + {0x001e6b, 0x001e6b, PG_U_LOWERCASE_LETTER}, + {0x001e6c, 0x001e6c, PG_U_UPPERCASE_LETTER}, + {0x001e6d, 0x001e6d, PG_U_LOWERCASE_LETTER}, + {0x001e6e, 0x001e6e, PG_U_UPPERCASE_LETTER}, + {0x001e6f, 0x001e6f, PG_U_LOWERCASE_LETTER}, + {0x001e70, 0x001e70, PG_U_UPPERCASE_LETTER}, + {0x001e71, 0x001e71, PG_U_LOWERCASE_LETTER}, + {0x001e72, 0x001e72, PG_U_UPPERCASE_LETTER}, + {0x001e73, 0x001e73, PG_U_LOWERCASE_LETTER}, + {0x001e74, 0x001e74, PG_U_UPPERCASE_LETTER}, + {0x001e75, 0x001e75, PG_U_LOWERCASE_LETTER}, + {0x001e76, 0x001e76, PG_U_UPPERCASE_LETTER}, + {0x001e77, 0x001e77, PG_U_LOWERCASE_LETTER}, + {0x001e78, 0x001e78, PG_U_UPPERCASE_LETTER}, + {0x001e79, 0x001e79, PG_U_LOWERCASE_LETTER}, + {0x001e7a, 0x001e7a, PG_U_UPPERCASE_LETTER}, + {0x001e7b, 0x001e7b, PG_U_LOWERCASE_LETTER}, + {0x001e7c, 0x001e7c, PG_U_UPPERCASE_LETTER}, + {0x001e7d, 0x001e7d, PG_U_LOWERCASE_LETTER}, + {0x001e7e, 0x001e7e, PG_U_UPPERCASE_LETTER}, + {0x001e7f, 0x001e7f, PG_U_LOWERCASE_LETTER}, + {0x001e80, 0x001e80, PG_U_UPPERCASE_LETTER}, + {0x001e81, 0x001e81, PG_U_LOWERCASE_LETTER}, + {0x001e82, 0x001e82, PG_U_UPPERCASE_LETTER}, + {0x001e83, 0x001e83, PG_U_LOWERCASE_LETTER}, + {0x001e84, 0x001e84, PG_U_UPPERCASE_LETTER}, + {0x001e85, 0x001e85, PG_U_LOWERCASE_LETTER}, + {0x001e86, 0x001e86, PG_U_UPPERCASE_LETTER}, + {0x001e87, 0x001e87, PG_U_LOWERCASE_LETTER}, + {0x001e88, 0x001e88, PG_U_UPPERCASE_LETTER}, + {0x001e89, 0x001e89, PG_U_LOWERCASE_LETTER}, + {0x001e8a, 0x001e8a, PG_U_UPPERCASE_LETTER}, + {0x001e8b, 0x001e8b, PG_U_LOWERCASE_LETTER}, + {0x001e8c, 0x001e8c, PG_U_UPPERCASE_LETTER}, + {0x001e8d, 0x001e8d, PG_U_LOWERCASE_LETTER}, + {0x001e8e, 0x001e8e, PG_U_UPPERCASE_LETTER}, + {0x001e8f, 0x001e8f, PG_U_LOWERCASE_LETTER}, + {0x001e90, 0x001e90, PG_U_UPPERCASE_LETTER}, + {0x001e91, 0x001e91, PG_U_LOWERCASE_LETTER}, + {0x001e92, 0x001e92, PG_U_UPPERCASE_LETTER}, + {0x001e93, 0x001e93, PG_U_LOWERCASE_LETTER}, + {0x001e94, 0x001e94, PG_U_UPPERCASE_LETTER}, + {0x001e95, 0x001e9d, PG_U_LOWERCASE_LETTER}, + {0x001e9e, 0x001e9e, PG_U_UPPERCASE_LETTER}, + {0x001e9f, 0x001e9f, PG_U_LOWERCASE_LETTER}, + {0x001ea0, 0x001ea0, PG_U_UPPERCASE_LETTER}, + {0x001ea1, 0x001ea1, PG_U_LOWERCASE_LETTER}, + {0x001ea2, 0x001ea2, PG_U_UPPERCASE_LETTER}, + {0x001ea3, 0x001ea3, PG_U_LOWERCASE_LETTER}, + {0x001ea4, 0x001ea4, PG_U_UPPERCASE_LETTER}, + {0x001ea5, 0x001ea5, PG_U_LOWERCASE_LETTER}, + {0x001ea6, 0x001ea6, PG_U_UPPERCASE_LETTER}, + {0x001ea7, 0x001ea7, PG_U_LOWERCASE_LETTER}, + {0x001ea8, 0x001ea8, PG_U_UPPERCASE_LETTER}, + {0x001ea9, 0x001ea9, PG_U_LOWERCASE_LETTER}, + {0x001eaa, 0x001eaa, PG_U_UPPERCASE_LETTER}, + {0x001eab, 0x001eab, PG_U_LOWERCASE_LETTER}, + {0x001eac, 0x001eac, PG_U_UPPERCASE_LETTER}, + {0x001ead, 0x001ead, PG_U_LOWERCASE_LETTER}, + {0x001eae, 0x001eae, PG_U_UPPERCASE_LETTER}, + {0x001eaf, 0x001eaf, PG_U_LOWERCASE_LETTER}, + {0x001eb0, 0x001eb0, PG_U_UPPERCASE_LETTER}, + {0x001eb1, 0x001eb1, PG_U_LOWERCASE_LETTER}, + {0x001eb2, 0x001eb2, PG_U_UPPERCASE_LETTER}, + {0x001eb3, 0x001eb3, PG_U_LOWERCASE_LETTER}, + {0x001eb4, 0x001eb4, PG_U_UPPERCASE_LETTER}, + {0x001eb5, 0x001eb5, PG_U_LOWERCASE_LETTER}, + {0x001eb6, 0x001eb6, PG_U_UPPERCASE_LETTER}, + {0x001eb7, 0x001eb7, PG_U_LOWERCASE_LETTER}, + {0x001eb8, 0x001eb8, PG_U_UPPERCASE_LETTER}, + {0x001eb9, 0x001eb9, PG_U_LOWERCASE_LETTER}, + {0x001eba, 0x001eba, PG_U_UPPERCASE_LETTER}, + {0x001ebb, 0x001ebb, PG_U_LOWERCASE_LETTER}, + {0x001ebc, 0x001ebc, PG_U_UPPERCASE_LETTER}, + {0x001ebd, 0x001ebd, PG_U_LOWERCASE_LETTER}, + {0x001ebe, 0x001ebe, PG_U_UPPERCASE_LETTER}, + {0x001ebf, 0x001ebf, PG_U_LOWERCASE_LETTER}, + {0x001ec0, 0x001ec0, PG_U_UPPERCASE_LETTER}, + {0x001ec1, 0x001ec1, PG_U_LOWERCASE_LETTER}, + {0x001ec2, 0x001ec2, PG_U_UPPERCASE_LETTER}, + {0x001ec3, 0x001ec3, PG_U_LOWERCASE_LETTER}, + {0x001ec4, 0x001ec4, PG_U_UPPERCASE_LETTER}, + {0x001ec5, 0x001ec5, PG_U_LOWERCASE_LETTER}, + {0x001ec6, 0x001ec6, PG_U_UPPERCASE_LETTER}, + {0x001ec7, 0x001ec7, PG_U_LOWERCASE_LETTER}, + {0x001ec8, 0x001ec8, PG_U_UPPERCASE_LETTER}, + {0x001ec9, 0x001ec9, PG_U_LOWERCASE_LETTER}, + {0x001eca, 0x001eca, PG_U_UPPERCASE_LETTER}, + {0x001ecb, 0x001ecb, PG_U_LOWERCASE_LETTER}, + {0x001ecc, 0x001ecc, PG_U_UPPERCASE_LETTER}, + {0x001ecd, 0x001ecd, PG_U_LOWERCASE_LETTER}, + {0x001ece, 0x001ece, PG_U_UPPERCASE_LETTER}, + {0x001ecf, 0x001ecf, PG_U_LOWERCASE_LETTER}, + {0x001ed0, 0x001ed0, PG_U_UPPERCASE_LETTER}, + {0x001ed1, 0x001ed1, PG_U_LOWERCASE_LETTER}, + {0x001ed2, 0x001ed2, PG_U_UPPERCASE_LETTER}, + {0x001ed3, 0x001ed3, PG_U_LOWERCASE_LETTER}, + {0x001ed4, 0x001ed4, PG_U_UPPERCASE_LETTER}, + {0x001ed5, 0x001ed5, PG_U_LOWERCASE_LETTER}, + {0x001ed6, 0x001ed6, PG_U_UPPERCASE_LETTER}, + {0x001ed7, 0x001ed7, PG_U_LOWERCASE_LETTER}, + {0x001ed8, 0x001ed8, PG_U_UPPERCASE_LETTER}, + {0x001ed9, 0x001ed9, PG_U_LOWERCASE_LETTER}, + {0x001eda, 0x001eda, PG_U_UPPERCASE_LETTER}, + {0x001edb, 0x001edb, PG_U_LOWERCASE_LETTER}, + {0x001edc, 0x001edc, PG_U_UPPERCASE_LETTER}, + {0x001edd, 0x001edd, PG_U_LOWERCASE_LETTER}, + {0x001ede, 0x001ede, PG_U_UPPERCASE_LETTER}, + {0x001edf, 0x001edf, PG_U_LOWERCASE_LETTER}, + {0x001ee0, 0x001ee0, PG_U_UPPERCASE_LETTER}, + {0x001ee1, 0x001ee1, PG_U_LOWERCASE_LETTER}, + {0x001ee2, 0x001ee2, PG_U_UPPERCASE_LETTER}, + {0x001ee3, 0x001ee3, PG_U_LOWERCASE_LETTER}, + {0x001ee4, 0x001ee4, PG_U_UPPERCASE_LETTER}, + {0x001ee5, 0x001ee5, PG_U_LOWERCASE_LETTER}, + {0x001ee6, 0x001ee6, PG_U_UPPERCASE_LETTER}, + {0x001ee7, 0x001ee7, PG_U_LOWERCASE_LETTER}, + {0x001ee8, 0x001ee8, PG_U_UPPERCASE_LETTER}, + {0x001ee9, 0x001ee9, PG_U_LOWERCASE_LETTER}, + {0x001eea, 0x001eea, PG_U_UPPERCASE_LETTER}, + {0x001eeb, 0x001eeb, PG_U_LOWERCASE_LETTER}, + {0x001eec, 0x001eec, PG_U_UPPERCASE_LETTER}, + {0x001eed, 0x001eed, PG_U_LOWERCASE_LETTER}, + {0x001eee, 0x001eee, PG_U_UPPERCASE_LETTER}, + {0x001eef, 0x001eef, PG_U_LOWERCASE_LETTER}, + {0x001ef0, 0x001ef0, PG_U_UPPERCASE_LETTER}, + {0x001ef1, 0x001ef1, PG_U_LOWERCASE_LETTER}, + {0x001ef2, 0x001ef2, PG_U_UPPERCASE_LETTER}, + {0x001ef3, 0x001ef3, PG_U_LOWERCASE_LETTER}, + {0x001ef4, 0x001ef4, PG_U_UPPERCASE_LETTER}, + {0x001ef5, 0x001ef5, PG_U_LOWERCASE_LETTER}, + {0x001ef6, 0x001ef6, PG_U_UPPERCASE_LETTER}, + {0x001ef7, 0x001ef7, PG_U_LOWERCASE_LETTER}, + {0x001ef8, 0x001ef8, PG_U_UPPERCASE_LETTER}, + {0x001ef9, 0x001ef9, PG_U_LOWERCASE_LETTER}, + {0x001efa, 0x001efa, PG_U_UPPERCASE_LETTER}, + {0x001efb, 0x001efb, PG_U_LOWERCASE_LETTER}, + {0x001efc, 0x001efc, PG_U_UPPERCASE_LETTER}, + {0x001efd, 0x001efd, PG_U_LOWERCASE_LETTER}, + {0x001efe, 0x001efe, PG_U_UPPERCASE_LETTER}, + {0x001eff, 0x001f07, PG_U_LOWERCASE_LETTER}, + {0x001f08, 0x001f0f, PG_U_UPPERCASE_LETTER}, + {0x001f10, 0x001f15, PG_U_LOWERCASE_LETTER}, + {0x001f18, 0x001f1d, PG_U_UPPERCASE_LETTER}, + {0x001f20, 0x001f27, PG_U_LOWERCASE_LETTER}, + {0x001f28, 0x001f2f, PG_U_UPPERCASE_LETTER}, + {0x001f30, 0x001f37, PG_U_LOWERCASE_LETTER}, + {0x001f38, 0x001f3f, PG_U_UPPERCASE_LETTER}, + {0x001f40, 0x001f45, PG_U_LOWERCASE_LETTER}, + {0x001f48, 0x001f4d, PG_U_UPPERCASE_LETTER}, + {0x001f50, 0x001f57, PG_U_LOWERCASE_LETTER}, + {0x001f59, 0x001f59, PG_U_UPPERCASE_LETTER}, + {0x001f5b, 0x001f5b, PG_U_UPPERCASE_LETTER}, + {0x001f5d, 0x001f5d, PG_U_UPPERCASE_LETTER}, + {0x001f5f, 0x001f5f, PG_U_UPPERCASE_LETTER}, + {0x001f60, 0x001f67, PG_U_LOWERCASE_LETTER}, + {0x001f68, 0x001f6f, PG_U_UPPERCASE_LETTER}, + {0x001f70, 0x001f7d, PG_U_LOWERCASE_LETTER}, + {0x001f80, 0x001f87, PG_U_LOWERCASE_LETTER}, + {0x001f88, 0x001f8f, PG_U_TITLECASE_LETTER}, + {0x001f90, 0x001f97, PG_U_LOWERCASE_LETTER}, + {0x001f98, 0x001f9f, PG_U_TITLECASE_LETTER}, + {0x001fa0, 0x001fa7, PG_U_LOWERCASE_LETTER}, + {0x001fa8, 0x001faf, PG_U_TITLECASE_LETTER}, + {0x001fb0, 0x001fb4, PG_U_LOWERCASE_LETTER}, + {0x001fb6, 0x001fb7, PG_U_LOWERCASE_LETTER}, + {0x001fb8, 0x001fbb, PG_U_UPPERCASE_LETTER}, + {0x001fbc, 0x001fbc, PG_U_TITLECASE_LETTER}, + {0x001fbd, 0x001fbd, PG_U_MODIFIER_SYMBOL}, + {0x001fbe, 0x001fbe, PG_U_LOWERCASE_LETTER}, + {0x001fbf, 0x001fc1, PG_U_MODIFIER_SYMBOL}, + {0x001fc2, 0x001fc4, PG_U_LOWERCASE_LETTER}, + {0x001fc6, 0x001fc7, PG_U_LOWERCASE_LETTER}, + {0x001fc8, 0x001fcb, PG_U_UPPERCASE_LETTER}, + {0x001fcc, 0x001fcc, PG_U_TITLECASE_LETTER}, + {0x001fcd, 0x001fcf, PG_U_MODIFIER_SYMBOL}, + {0x001fd0, 0x001fd3, PG_U_LOWERCASE_LETTER}, + {0x001fd6, 0x001fd7, PG_U_LOWERCASE_LETTER}, + {0x001fd8, 0x001fdb, PG_U_UPPERCASE_LETTER}, + {0x001fdd, 0x001fdf, PG_U_MODIFIER_SYMBOL}, + {0x001fe0, 0x001fe7, PG_U_LOWERCASE_LETTER}, + {0x001fe8, 0x001fec, PG_U_UPPERCASE_LETTER}, + {0x001fed, 0x001fef, PG_U_MODIFIER_SYMBOL}, + {0x001ff2, 0x001ff4, PG_U_LOWERCASE_LETTER}, + {0x001ff6, 0x001ff7, PG_U_LOWERCASE_LETTER}, + {0x001ff8, 0x001ffb, PG_U_UPPERCASE_LETTER}, + {0x001ffc, 0x001ffc, PG_U_TITLECASE_LETTER}, + {0x001ffd, 0x001ffe, PG_U_MODIFIER_SYMBOL}, + {0x002000, 0x00200a, PG_U_SPACE_SEPARATOR}, + {0x00200b, 0x00200f, PG_U_FORMAT}, + {0x002010, 0x002015, PG_U_DASH_PUNCTUATION}, + {0x002016, 0x002017, PG_U_OTHER_PUNCTUATION}, + {0x002018, 0x002018, PG_U_INITIAL_PUNCTUATION}, + {0x002019, 0x002019, PG_U_FINAL_PUNCTUATION}, + {0x00201a, 0x00201a, PG_U_OPEN_PUNCTUATION}, + {0x00201b, 0x00201c, PG_U_INITIAL_PUNCTUATION}, + {0x00201d, 0x00201d, PG_U_FINAL_PUNCTUATION}, + {0x00201e, 0x00201e, PG_U_OPEN_PUNCTUATION}, + {0x00201f, 0x00201f, PG_U_INITIAL_PUNCTUATION}, + {0x002020, 0x002027, PG_U_OTHER_PUNCTUATION}, + {0x002028, 0x002028, PG_U_LINE_SEPARATOR}, + {0x002029, 0x002029, PG_U_PARAGRAPH_SEPARATOR}, + {0x00202a, 0x00202e, PG_U_FORMAT}, + {0x00202f, 0x00202f, PG_U_SPACE_SEPARATOR}, + {0x002030, 0x002038, PG_U_OTHER_PUNCTUATION}, + {0x002039, 0x002039, PG_U_INITIAL_PUNCTUATION}, + {0x00203a, 0x00203a, PG_U_FINAL_PUNCTUATION}, + {0x00203b, 0x00203e, PG_U_OTHER_PUNCTUATION}, + {0x00203f, 0x002040, PG_U_CONNECTOR_PUNCTUATION}, + {0x002041, 0x002043, PG_U_OTHER_PUNCTUATION}, + {0x002044, 0x002044, PG_U_MATH_SYMBOL}, + {0x002045, 0x002045, PG_U_OPEN_PUNCTUATION}, + {0x002046, 0x002046, PG_U_CLOSE_PUNCTUATION}, + {0x002047, 0x002051, PG_U_OTHER_PUNCTUATION}, + {0x002052, 0x002052, PG_U_MATH_SYMBOL}, + {0x002053, 0x002053, PG_U_OTHER_PUNCTUATION}, + {0x002054, 0x002054, PG_U_CONNECTOR_PUNCTUATION}, + {0x002055, 0x00205e, PG_U_OTHER_PUNCTUATION}, + {0x00205f, 0x00205f, PG_U_SPACE_SEPARATOR}, + {0x002060, 0x002064, PG_U_FORMAT}, + {0x002066, 0x00206f, PG_U_FORMAT}, + {0x002070, 0x002070, PG_U_OTHER_NUMBER}, + {0x002071, 0x002071, PG_U_MODIFIER_LETTER}, + {0x002074, 0x002079, PG_U_OTHER_NUMBER}, + {0x00207a, 0x00207c, PG_U_MATH_SYMBOL}, + {0x00207d, 0x00207d, PG_U_OPEN_PUNCTUATION}, + {0x00207e, 0x00207e, PG_U_CLOSE_PUNCTUATION}, + {0x00207f, 0x00207f, PG_U_MODIFIER_LETTER}, + {0x002080, 0x002089, PG_U_OTHER_NUMBER}, + {0x00208a, 0x00208c, PG_U_MATH_SYMBOL}, + {0x00208d, 0x00208d, PG_U_OPEN_PUNCTUATION}, + {0x00208e, 0x00208e, PG_U_CLOSE_PUNCTUATION}, + {0x002090, 0x00209c, PG_U_MODIFIER_LETTER}, + {0x0020a0, 0x0020c0, PG_U_CURRENCY_SYMBOL}, + {0x0020d0, 0x0020dc, PG_U_NONSPACING_MARK}, + {0x0020dd, 0x0020e0, PG_U_ENCLOSING_MARK}, + {0x0020e1, 0x0020e1, PG_U_NONSPACING_MARK}, + {0x0020e2, 0x0020e4, PG_U_ENCLOSING_MARK}, + {0x0020e5, 0x0020f0, PG_U_NONSPACING_MARK}, + {0x002100, 0x002101, PG_U_OTHER_SYMBOL}, + {0x002102, 0x002102, PG_U_UPPERCASE_LETTER}, + {0x002103, 0x002106, PG_U_OTHER_SYMBOL}, + {0x002107, 0x002107, PG_U_UPPERCASE_LETTER}, + {0x002108, 0x002109, PG_U_OTHER_SYMBOL}, + {0x00210a, 0x00210a, PG_U_LOWERCASE_LETTER}, + {0x00210b, 0x00210d, PG_U_UPPERCASE_LETTER}, + {0x00210e, 0x00210f, PG_U_LOWERCASE_LETTER}, + {0x002110, 0x002112, PG_U_UPPERCASE_LETTER}, + {0x002113, 0x002113, PG_U_LOWERCASE_LETTER}, + {0x002114, 0x002114, PG_U_OTHER_SYMBOL}, + {0x002115, 0x002115, PG_U_UPPERCASE_LETTER}, + {0x002116, 0x002117, PG_U_OTHER_SYMBOL}, + {0x002118, 0x002118, PG_U_MATH_SYMBOL}, + {0x002119, 0x00211d, PG_U_UPPERCASE_LETTER}, + {0x00211e, 0x002123, PG_U_OTHER_SYMBOL}, + {0x002124, 0x002124, PG_U_UPPERCASE_LETTER}, + {0x002125, 0x002125, PG_U_OTHER_SYMBOL}, + {0x002126, 0x002126, PG_U_UPPERCASE_LETTER}, + {0x002127, 0x002127, PG_U_OTHER_SYMBOL}, + {0x002128, 0x002128, PG_U_UPPERCASE_LETTER}, + {0x002129, 0x002129, PG_U_OTHER_SYMBOL}, + {0x00212a, 0x00212d, PG_U_UPPERCASE_LETTER}, + {0x00212e, 0x00212e, PG_U_OTHER_SYMBOL}, + {0x00212f, 0x00212f, PG_U_LOWERCASE_LETTER}, + {0x002130, 0x002133, PG_U_UPPERCASE_LETTER}, + {0x002134, 0x002134, PG_U_LOWERCASE_LETTER}, + {0x002135, 0x002138, PG_U_OTHER_LETTER}, + {0x002139, 0x002139, PG_U_LOWERCASE_LETTER}, + {0x00213a, 0x00213b, PG_U_OTHER_SYMBOL}, + {0x00213c, 0x00213d, PG_U_LOWERCASE_LETTER}, + {0x00213e, 0x00213f, PG_U_UPPERCASE_LETTER}, + {0x002140, 0x002144, PG_U_MATH_SYMBOL}, + {0x002145, 0x002145, PG_U_UPPERCASE_LETTER}, + {0x002146, 0x002149, PG_U_LOWERCASE_LETTER}, + {0x00214a, 0x00214a, PG_U_OTHER_SYMBOL}, + {0x00214b, 0x00214b, PG_U_MATH_SYMBOL}, + {0x00214c, 0x00214d, PG_U_OTHER_SYMBOL}, + {0x00214e, 0x00214e, PG_U_LOWERCASE_LETTER}, + {0x00214f, 0x00214f, PG_U_OTHER_SYMBOL}, + {0x002150, 0x00215f, PG_U_OTHER_NUMBER}, + {0x002160, 0x002182, PG_U_LETTER_NUMBER}, + {0x002183, 0x002183, PG_U_UPPERCASE_LETTER}, + {0x002184, 0x002184, PG_U_LOWERCASE_LETTER}, + {0x002185, 0x002188, PG_U_LETTER_NUMBER}, + {0x002189, 0x002189, PG_U_OTHER_NUMBER}, + {0x00218a, 0x00218b, PG_U_OTHER_SYMBOL}, + {0x002190, 0x002194, PG_U_MATH_SYMBOL}, + {0x002195, 0x002199, PG_U_OTHER_SYMBOL}, + {0x00219a, 0x00219b, PG_U_MATH_SYMBOL}, + {0x00219c, 0x00219f, PG_U_OTHER_SYMBOL}, + {0x0021a0, 0x0021a0, PG_U_MATH_SYMBOL}, + {0x0021a1, 0x0021a2, PG_U_OTHER_SYMBOL}, + {0x0021a3, 0x0021a3, PG_U_MATH_SYMBOL}, + {0x0021a4, 0x0021a5, PG_U_OTHER_SYMBOL}, + {0x0021a6, 0x0021a6, PG_U_MATH_SYMBOL}, + {0x0021a7, 0x0021ad, PG_U_OTHER_SYMBOL}, + {0x0021ae, 0x0021ae, PG_U_MATH_SYMBOL}, + {0x0021af, 0x0021cd, PG_U_OTHER_SYMBOL}, + {0x0021ce, 0x0021cf, PG_U_MATH_SYMBOL}, + {0x0021d0, 0x0021d1, PG_U_OTHER_SYMBOL}, + {0x0021d2, 0x0021d2, PG_U_MATH_SYMBOL}, + {0x0021d3, 0x0021d3, PG_U_OTHER_SYMBOL}, + {0x0021d4, 0x0021d4, PG_U_MATH_SYMBOL}, + {0x0021d5, 0x0021f3, PG_U_OTHER_SYMBOL}, + {0x0021f4, 0x0022ff, PG_U_MATH_SYMBOL}, + {0x002300, 0x002307, PG_U_OTHER_SYMBOL}, + {0x002308, 0x002308, PG_U_OPEN_PUNCTUATION}, + {0x002309, 0x002309, PG_U_CLOSE_PUNCTUATION}, + {0x00230a, 0x00230a, PG_U_OPEN_PUNCTUATION}, + {0x00230b, 0x00230b, PG_U_CLOSE_PUNCTUATION}, + {0x00230c, 0x00231f, PG_U_OTHER_SYMBOL}, + {0x002320, 0x002321, PG_U_MATH_SYMBOL}, + {0x002322, 0x002328, PG_U_OTHER_SYMBOL}, + {0x002329, 0x002329, PG_U_OPEN_PUNCTUATION}, + {0x00232a, 0x00232a, PG_U_CLOSE_PUNCTUATION}, + {0x00232b, 0x00237b, PG_U_OTHER_SYMBOL}, + {0x00237c, 0x00237c, PG_U_MATH_SYMBOL}, + {0x00237d, 0x00239a, PG_U_OTHER_SYMBOL}, + {0x00239b, 0x0023b3, PG_U_MATH_SYMBOL}, + {0x0023b4, 0x0023db, PG_U_OTHER_SYMBOL}, + {0x0023dc, 0x0023e1, PG_U_MATH_SYMBOL}, + {0x0023e2, 0x002426, PG_U_OTHER_SYMBOL}, + {0x002440, 0x00244a, PG_U_OTHER_SYMBOL}, + {0x002460, 0x00249b, PG_U_OTHER_NUMBER}, + {0x00249c, 0x0024e9, PG_U_OTHER_SYMBOL}, + {0x0024ea, 0x0024ff, PG_U_OTHER_NUMBER}, + {0x002500, 0x0025b6, PG_U_OTHER_SYMBOL}, + {0x0025b7, 0x0025b7, PG_U_MATH_SYMBOL}, + {0x0025b8, 0x0025c0, PG_U_OTHER_SYMBOL}, + {0x0025c1, 0x0025c1, PG_U_MATH_SYMBOL}, + {0x0025c2, 0x0025f7, PG_U_OTHER_SYMBOL}, + {0x0025f8, 0x0025ff, PG_U_MATH_SYMBOL}, + {0x002600, 0x00266e, PG_U_OTHER_SYMBOL}, + {0x00266f, 0x00266f, PG_U_MATH_SYMBOL}, + {0x002670, 0x002767, PG_U_OTHER_SYMBOL}, + {0x002768, 0x002768, PG_U_OPEN_PUNCTUATION}, + {0x002769, 0x002769, PG_U_CLOSE_PUNCTUATION}, + {0x00276a, 0x00276a, PG_U_OPEN_PUNCTUATION}, + {0x00276b, 0x00276b, PG_U_CLOSE_PUNCTUATION}, + {0x00276c, 0x00276c, PG_U_OPEN_PUNCTUATION}, + {0x00276d, 0x00276d, PG_U_CLOSE_PUNCTUATION}, + {0x00276e, 0x00276e, PG_U_OPEN_PUNCTUATION}, + {0x00276f, 0x00276f, PG_U_CLOSE_PUNCTUATION}, + {0x002770, 0x002770, PG_U_OPEN_PUNCTUATION}, + {0x002771, 0x002771, PG_U_CLOSE_PUNCTUATION}, + {0x002772, 0x002772, PG_U_OPEN_PUNCTUATION}, + {0x002773, 0x002773, PG_U_CLOSE_PUNCTUATION}, + {0x002774, 0x002774, PG_U_OPEN_PUNCTUATION}, + {0x002775, 0x002775, PG_U_CLOSE_PUNCTUATION}, + {0x002776, 0x002793, PG_U_OTHER_NUMBER}, + {0x002794, 0x0027bf, PG_U_OTHER_SYMBOL}, + {0x0027c0, 0x0027c4, PG_U_MATH_SYMBOL}, + {0x0027c5, 0x0027c5, PG_U_OPEN_PUNCTUATION}, + {0x0027c6, 0x0027c6, PG_U_CLOSE_PUNCTUATION}, + {0x0027c7, 0x0027e5, PG_U_MATH_SYMBOL}, + {0x0027e6, 0x0027e6, PG_U_OPEN_PUNCTUATION}, + {0x0027e7, 0x0027e7, PG_U_CLOSE_PUNCTUATION}, + {0x0027e8, 0x0027e8, PG_U_OPEN_PUNCTUATION}, + {0x0027e9, 0x0027e9, PG_U_CLOSE_PUNCTUATION}, + {0x0027ea, 0x0027ea, PG_U_OPEN_PUNCTUATION}, + {0x0027eb, 0x0027eb, PG_U_CLOSE_PUNCTUATION}, + {0x0027ec, 0x0027ec, PG_U_OPEN_PUNCTUATION}, + {0x0027ed, 0x0027ed, PG_U_CLOSE_PUNCTUATION}, + {0x0027ee, 0x0027ee, PG_U_OPEN_PUNCTUATION}, + {0x0027ef, 0x0027ef, PG_U_CLOSE_PUNCTUATION}, + {0x0027f0, 0x0027ff, PG_U_MATH_SYMBOL}, + {0x002800, 0x0028ff, PG_U_OTHER_SYMBOL}, + {0x002900, 0x002982, PG_U_MATH_SYMBOL}, + {0x002983, 0x002983, PG_U_OPEN_PUNCTUATION}, + {0x002984, 0x002984, PG_U_CLOSE_PUNCTUATION}, + {0x002985, 0x002985, PG_U_OPEN_PUNCTUATION}, + {0x002986, 0x002986, PG_U_CLOSE_PUNCTUATION}, + {0x002987, 0x002987, PG_U_OPEN_PUNCTUATION}, + {0x002988, 0x002988, PG_U_CLOSE_PUNCTUATION}, + {0x002989, 0x002989, PG_U_OPEN_PUNCTUATION}, + {0x00298a, 0x00298a, PG_U_CLOSE_PUNCTUATION}, + {0x00298b, 0x00298b, PG_U_OPEN_PUNCTUATION}, + {0x00298c, 0x00298c, PG_U_CLOSE_PUNCTUATION}, + {0x00298d, 0x00298d, PG_U_OPEN_PUNCTUATION}, + {0x00298e, 0x00298e, PG_U_CLOSE_PUNCTUATION}, + {0x00298f, 0x00298f, PG_U_OPEN_PUNCTUATION}, + {0x002990, 0x002990, PG_U_CLOSE_PUNCTUATION}, + {0x002991, 0x002991, PG_U_OPEN_PUNCTUATION}, + {0x002992, 0x002992, PG_U_CLOSE_PUNCTUATION}, + {0x002993, 0x002993, PG_U_OPEN_PUNCTUATION}, + {0x002994, 0x002994, PG_U_CLOSE_PUNCTUATION}, + {0x002995, 0x002995, PG_U_OPEN_PUNCTUATION}, + {0x002996, 0x002996, PG_U_CLOSE_PUNCTUATION}, + {0x002997, 0x002997, PG_U_OPEN_PUNCTUATION}, + {0x002998, 0x002998, PG_U_CLOSE_PUNCTUATION}, + {0x002999, 0x0029d7, PG_U_MATH_SYMBOL}, + {0x0029d8, 0x0029d8, PG_U_OPEN_PUNCTUATION}, + {0x0029d9, 0x0029d9, PG_U_CLOSE_PUNCTUATION}, + {0x0029da, 0x0029da, PG_U_OPEN_PUNCTUATION}, + {0x0029db, 0x0029db, PG_U_CLOSE_PUNCTUATION}, + {0x0029dc, 0x0029fb, PG_U_MATH_SYMBOL}, + {0x0029fc, 0x0029fc, PG_U_OPEN_PUNCTUATION}, + {0x0029fd, 0x0029fd, PG_U_CLOSE_PUNCTUATION}, + {0x0029fe, 0x002aff, PG_U_MATH_SYMBOL}, + {0x002b00, 0x002b2f, PG_U_OTHER_SYMBOL}, + {0x002b30, 0x002b44, PG_U_MATH_SYMBOL}, + {0x002b45, 0x002b46, PG_U_OTHER_SYMBOL}, + {0x002b47, 0x002b4c, PG_U_MATH_SYMBOL}, + {0x002b4d, 0x002b73, PG_U_OTHER_SYMBOL}, + {0x002b76, 0x002b95, PG_U_OTHER_SYMBOL}, + {0x002b97, 0x002bff, PG_U_OTHER_SYMBOL}, + {0x002c00, 0x002c2f, PG_U_UPPERCASE_LETTER}, + {0x002c30, 0x002c5f, PG_U_LOWERCASE_LETTER}, + {0x002c60, 0x002c60, PG_U_UPPERCASE_LETTER}, + {0x002c61, 0x002c61, PG_U_LOWERCASE_LETTER}, + {0x002c62, 0x002c64, PG_U_UPPERCASE_LETTER}, + {0x002c65, 0x002c66, PG_U_LOWERCASE_LETTER}, + {0x002c67, 0x002c67, PG_U_UPPERCASE_LETTER}, + {0x002c68, 0x002c68, PG_U_LOWERCASE_LETTER}, + {0x002c69, 0x002c69, PG_U_UPPERCASE_LETTER}, + {0x002c6a, 0x002c6a, PG_U_LOWERCASE_LETTER}, + {0x002c6b, 0x002c6b, PG_U_UPPERCASE_LETTER}, + {0x002c6c, 0x002c6c, PG_U_LOWERCASE_LETTER}, + {0x002c6d, 0x002c70, PG_U_UPPERCASE_LETTER}, + {0x002c71, 0x002c71, PG_U_LOWERCASE_LETTER}, + {0x002c72, 0x002c72, PG_U_UPPERCASE_LETTER}, + {0x002c73, 0x002c74, PG_U_LOWERCASE_LETTER}, + {0x002c75, 0x002c75, PG_U_UPPERCASE_LETTER}, + {0x002c76, 0x002c7b, PG_U_LOWERCASE_LETTER}, + {0x002c7c, 0x002c7d, PG_U_MODIFIER_LETTER}, + {0x002c7e, 0x002c80, PG_U_UPPERCASE_LETTER}, + {0x002c81, 0x002c81, PG_U_LOWERCASE_LETTER}, + {0x002c82, 0x002c82, PG_U_UPPERCASE_LETTER}, + {0x002c83, 0x002c83, PG_U_LOWERCASE_LETTER}, + {0x002c84, 0x002c84, PG_U_UPPERCASE_LETTER}, + {0x002c85, 0x002c85, PG_U_LOWERCASE_LETTER}, + {0x002c86, 0x002c86, PG_U_UPPERCASE_LETTER}, + {0x002c87, 0x002c87, PG_U_LOWERCASE_LETTER}, + {0x002c88, 0x002c88, PG_U_UPPERCASE_LETTER}, + {0x002c89, 0x002c89, PG_U_LOWERCASE_LETTER}, + {0x002c8a, 0x002c8a, PG_U_UPPERCASE_LETTER}, + {0x002c8b, 0x002c8b, PG_U_LOWERCASE_LETTER}, + {0x002c8c, 0x002c8c, PG_U_UPPERCASE_LETTER}, + {0x002c8d, 0x002c8d, PG_U_LOWERCASE_LETTER}, + {0x002c8e, 0x002c8e, PG_U_UPPERCASE_LETTER}, + {0x002c8f, 0x002c8f, PG_U_LOWERCASE_LETTER}, + {0x002c90, 0x002c90, PG_U_UPPERCASE_LETTER}, + {0x002c91, 0x002c91, PG_U_LOWERCASE_LETTER}, + {0x002c92, 0x002c92, PG_U_UPPERCASE_LETTER}, + {0x002c93, 0x002c93, PG_U_LOWERCASE_LETTER}, + {0x002c94, 0x002c94, PG_U_UPPERCASE_LETTER}, + {0x002c95, 0x002c95, PG_U_LOWERCASE_LETTER}, + {0x002c96, 0x002c96, PG_U_UPPERCASE_LETTER}, + {0x002c97, 0x002c97, PG_U_LOWERCASE_LETTER}, + {0x002c98, 0x002c98, PG_U_UPPERCASE_LETTER}, + {0x002c99, 0x002c99, PG_U_LOWERCASE_LETTER}, + {0x002c9a, 0x002c9a, PG_U_UPPERCASE_LETTER}, + {0x002c9b, 0x002c9b, PG_U_LOWERCASE_LETTER}, + {0x002c9c, 0x002c9c, PG_U_UPPERCASE_LETTER}, + {0x002c9d, 0x002c9d, PG_U_LOWERCASE_LETTER}, + {0x002c9e, 0x002c9e, PG_U_UPPERCASE_LETTER}, + {0x002c9f, 0x002c9f, PG_U_LOWERCASE_LETTER}, + {0x002ca0, 0x002ca0, PG_U_UPPERCASE_LETTER}, + {0x002ca1, 0x002ca1, PG_U_LOWERCASE_LETTER}, + {0x002ca2, 0x002ca2, PG_U_UPPERCASE_LETTER}, + {0x002ca3, 0x002ca3, PG_U_LOWERCASE_LETTER}, + {0x002ca4, 0x002ca4, PG_U_UPPERCASE_LETTER}, + {0x002ca5, 0x002ca5, PG_U_LOWERCASE_LETTER}, + {0x002ca6, 0x002ca6, PG_U_UPPERCASE_LETTER}, + {0x002ca7, 0x002ca7, PG_U_LOWERCASE_LETTER}, + {0x002ca8, 0x002ca8, PG_U_UPPERCASE_LETTER}, + {0x002ca9, 0x002ca9, PG_U_LOWERCASE_LETTER}, + {0x002caa, 0x002caa, PG_U_UPPERCASE_LETTER}, + {0x002cab, 0x002cab, PG_U_LOWERCASE_LETTER}, + {0x002cac, 0x002cac, PG_U_UPPERCASE_LETTER}, + {0x002cad, 0x002cad, PG_U_LOWERCASE_LETTER}, + {0x002cae, 0x002cae, PG_U_UPPERCASE_LETTER}, + {0x002caf, 0x002caf, PG_U_LOWERCASE_LETTER}, + {0x002cb0, 0x002cb0, PG_U_UPPERCASE_LETTER}, + {0x002cb1, 0x002cb1, PG_U_LOWERCASE_LETTER}, + {0x002cb2, 0x002cb2, PG_U_UPPERCASE_LETTER}, + {0x002cb3, 0x002cb3, PG_U_LOWERCASE_LETTER}, + {0x002cb4, 0x002cb4, PG_U_UPPERCASE_LETTER}, + {0x002cb5, 0x002cb5, PG_U_LOWERCASE_LETTER}, + {0x002cb6, 0x002cb6, PG_U_UPPERCASE_LETTER}, + {0x002cb7, 0x002cb7, PG_U_LOWERCASE_LETTER}, + {0x002cb8, 0x002cb8, PG_U_UPPERCASE_LETTER}, + {0x002cb9, 0x002cb9, PG_U_LOWERCASE_LETTER}, + {0x002cba, 0x002cba, PG_U_UPPERCASE_LETTER}, + {0x002cbb, 0x002cbb, PG_U_LOWERCASE_LETTER}, + {0x002cbc, 0x002cbc, PG_U_UPPERCASE_LETTER}, + {0x002cbd, 0x002cbd, PG_U_LOWERCASE_LETTER}, + {0x002cbe, 0x002cbe, PG_U_UPPERCASE_LETTER}, + {0x002cbf, 0x002cbf, PG_U_LOWERCASE_LETTER}, + {0x002cc0, 0x002cc0, PG_U_UPPERCASE_LETTER}, + {0x002cc1, 0x002cc1, PG_U_LOWERCASE_LETTER}, + {0x002cc2, 0x002cc2, PG_U_UPPERCASE_LETTER}, + {0x002cc3, 0x002cc3, PG_U_LOWERCASE_LETTER}, + {0x002cc4, 0x002cc4, PG_U_UPPERCASE_LETTER}, + {0x002cc5, 0x002cc5, PG_U_LOWERCASE_LETTER}, + {0x002cc6, 0x002cc6, PG_U_UPPERCASE_LETTER}, + {0x002cc7, 0x002cc7, PG_U_LOWERCASE_LETTER}, + {0x002cc8, 0x002cc8, PG_U_UPPERCASE_LETTER}, + {0x002cc9, 0x002cc9, PG_U_LOWERCASE_LETTER}, + {0x002cca, 0x002cca, PG_U_UPPERCASE_LETTER}, + {0x002ccb, 0x002ccb, PG_U_LOWERCASE_LETTER}, + {0x002ccc, 0x002ccc, PG_U_UPPERCASE_LETTER}, + {0x002ccd, 0x002ccd, PG_U_LOWERCASE_LETTER}, + {0x002cce, 0x002cce, PG_U_UPPERCASE_LETTER}, + {0x002ccf, 0x002ccf, PG_U_LOWERCASE_LETTER}, + {0x002cd0, 0x002cd0, PG_U_UPPERCASE_LETTER}, + {0x002cd1, 0x002cd1, PG_U_LOWERCASE_LETTER}, + {0x002cd2, 0x002cd2, PG_U_UPPERCASE_LETTER}, + {0x002cd3, 0x002cd3, PG_U_LOWERCASE_LETTER}, + {0x002cd4, 0x002cd4, PG_U_UPPERCASE_LETTER}, + {0x002cd5, 0x002cd5, PG_U_LOWERCASE_LETTER}, + {0x002cd6, 0x002cd6, PG_U_UPPERCASE_LETTER}, + {0x002cd7, 0x002cd7, PG_U_LOWERCASE_LETTER}, + {0x002cd8, 0x002cd8, PG_U_UPPERCASE_LETTER}, + {0x002cd9, 0x002cd9, PG_U_LOWERCASE_LETTER}, + {0x002cda, 0x002cda, PG_U_UPPERCASE_LETTER}, + {0x002cdb, 0x002cdb, PG_U_LOWERCASE_LETTER}, + {0x002cdc, 0x002cdc, PG_U_UPPERCASE_LETTER}, + {0x002cdd, 0x002cdd, PG_U_LOWERCASE_LETTER}, + {0x002cde, 0x002cde, PG_U_UPPERCASE_LETTER}, + {0x002cdf, 0x002cdf, PG_U_LOWERCASE_LETTER}, + {0x002ce0, 0x002ce0, PG_U_UPPERCASE_LETTER}, + {0x002ce1, 0x002ce1, PG_U_LOWERCASE_LETTER}, + {0x002ce2, 0x002ce2, PG_U_UPPERCASE_LETTER}, + {0x002ce3, 0x002ce4, PG_U_LOWERCASE_LETTER}, + {0x002ce5, 0x002cea, PG_U_OTHER_SYMBOL}, + {0x002ceb, 0x002ceb, PG_U_UPPERCASE_LETTER}, + {0x002cec, 0x002cec, PG_U_LOWERCASE_LETTER}, + {0x002ced, 0x002ced, PG_U_UPPERCASE_LETTER}, + {0x002cee, 0x002cee, PG_U_LOWERCASE_LETTER}, + {0x002cef, 0x002cf1, PG_U_NONSPACING_MARK}, + {0x002cf2, 0x002cf2, PG_U_UPPERCASE_LETTER}, + {0x002cf3, 0x002cf3, PG_U_LOWERCASE_LETTER}, + {0x002cf9, 0x002cfc, PG_U_OTHER_PUNCTUATION}, + {0x002cfd, 0x002cfd, PG_U_OTHER_NUMBER}, + {0x002cfe, 0x002cff, PG_U_OTHER_PUNCTUATION}, + {0x002d00, 0x002d25, PG_U_LOWERCASE_LETTER}, + {0x002d27, 0x002d27, PG_U_LOWERCASE_LETTER}, + {0x002d2d, 0x002d2d, PG_U_LOWERCASE_LETTER}, + {0x002d30, 0x002d67, PG_U_OTHER_LETTER}, + {0x002d6f, 0x002d6f, PG_U_MODIFIER_LETTER}, + {0x002d70, 0x002d70, PG_U_OTHER_PUNCTUATION}, + {0x002d7f, 0x002d7f, PG_U_NONSPACING_MARK}, + {0x002d80, 0x002d96, PG_U_OTHER_LETTER}, + {0x002da0, 0x002da6, PG_U_OTHER_LETTER}, + {0x002da8, 0x002dae, PG_U_OTHER_LETTER}, + {0x002db0, 0x002db6, PG_U_OTHER_LETTER}, + {0x002db8, 0x002dbe, PG_U_OTHER_LETTER}, + {0x002dc0, 0x002dc6, PG_U_OTHER_LETTER}, + {0x002dc8, 0x002dce, PG_U_OTHER_LETTER}, + {0x002dd0, 0x002dd6, PG_U_OTHER_LETTER}, + {0x002dd8, 0x002dde, PG_U_OTHER_LETTER}, + {0x002de0, 0x002dff, PG_U_NONSPACING_MARK}, + {0x002e00, 0x002e01, PG_U_OTHER_PUNCTUATION}, + {0x002e02, 0x002e02, PG_U_INITIAL_PUNCTUATION}, + {0x002e03, 0x002e03, PG_U_FINAL_PUNCTUATION}, + {0x002e04, 0x002e04, PG_U_INITIAL_PUNCTUATION}, + {0x002e05, 0x002e05, PG_U_FINAL_PUNCTUATION}, + {0x002e06, 0x002e08, PG_U_OTHER_PUNCTUATION}, + {0x002e09, 0x002e09, PG_U_INITIAL_PUNCTUATION}, + {0x002e0a, 0x002e0a, PG_U_FINAL_PUNCTUATION}, + {0x002e0b, 0x002e0b, PG_U_OTHER_PUNCTUATION}, + {0x002e0c, 0x002e0c, PG_U_INITIAL_PUNCTUATION}, + {0x002e0d, 0x002e0d, PG_U_FINAL_PUNCTUATION}, + {0x002e0e, 0x002e16, PG_U_OTHER_PUNCTUATION}, + {0x002e17, 0x002e17, PG_U_DASH_PUNCTUATION}, + {0x002e18, 0x002e19, PG_U_OTHER_PUNCTUATION}, + {0x002e1a, 0x002e1a, PG_U_DASH_PUNCTUATION}, + {0x002e1b, 0x002e1b, PG_U_OTHER_PUNCTUATION}, + {0x002e1c, 0x002e1c, PG_U_INITIAL_PUNCTUATION}, + {0x002e1d, 0x002e1d, PG_U_FINAL_PUNCTUATION}, + {0x002e1e, 0x002e1f, PG_U_OTHER_PUNCTUATION}, + {0x002e20, 0x002e20, PG_U_INITIAL_PUNCTUATION}, + {0x002e21, 0x002e21, PG_U_FINAL_PUNCTUATION}, + {0x002e22, 0x002e22, PG_U_OPEN_PUNCTUATION}, + {0x002e23, 0x002e23, PG_U_CLOSE_PUNCTUATION}, + {0x002e24, 0x002e24, PG_U_OPEN_PUNCTUATION}, + {0x002e25, 0x002e25, PG_U_CLOSE_PUNCTUATION}, + {0x002e26, 0x002e26, PG_U_OPEN_PUNCTUATION}, + {0x002e27, 0x002e27, PG_U_CLOSE_PUNCTUATION}, + {0x002e28, 0x002e28, PG_U_OPEN_PUNCTUATION}, + {0x002e29, 0x002e29, PG_U_CLOSE_PUNCTUATION}, + {0x002e2a, 0x002e2e, PG_U_OTHER_PUNCTUATION}, + {0x002e2f, 0x002e2f, PG_U_MODIFIER_LETTER}, + {0x002e30, 0x002e39, PG_U_OTHER_PUNCTUATION}, + {0x002e3a, 0x002e3b, PG_U_DASH_PUNCTUATION}, + {0x002e3c, 0x002e3f, PG_U_OTHER_PUNCTUATION}, + {0x002e40, 0x002e40, PG_U_DASH_PUNCTUATION}, + {0x002e41, 0x002e41, PG_U_OTHER_PUNCTUATION}, + {0x002e42, 0x002e42, PG_U_OPEN_PUNCTUATION}, + {0x002e43, 0x002e4f, PG_U_OTHER_PUNCTUATION}, + {0x002e50, 0x002e51, PG_U_OTHER_SYMBOL}, + {0x002e52, 0x002e54, PG_U_OTHER_PUNCTUATION}, + {0x002e55, 0x002e55, PG_U_OPEN_PUNCTUATION}, + {0x002e56, 0x002e56, PG_U_CLOSE_PUNCTUATION}, + {0x002e57, 0x002e57, PG_U_OPEN_PUNCTUATION}, + {0x002e58, 0x002e58, PG_U_CLOSE_PUNCTUATION}, + {0x002e59, 0x002e59, PG_U_OPEN_PUNCTUATION}, + {0x002e5a, 0x002e5a, PG_U_CLOSE_PUNCTUATION}, + {0x002e5b, 0x002e5b, PG_U_OPEN_PUNCTUATION}, + {0x002e5c, 0x002e5c, PG_U_CLOSE_PUNCTUATION}, + {0x002e5d, 0x002e5d, PG_U_DASH_PUNCTUATION}, + {0x002e80, 0x002e99, PG_U_OTHER_SYMBOL}, + {0x002e9b, 0x002ef3, PG_U_OTHER_SYMBOL}, + {0x002f00, 0x002fd5, PG_U_OTHER_SYMBOL}, + {0x002ff0, 0x002fff, PG_U_OTHER_SYMBOL}, + {0x003000, 0x003000, PG_U_SPACE_SEPARATOR}, + {0x003001, 0x003003, PG_U_OTHER_PUNCTUATION}, + {0x003004, 0x003004, PG_U_OTHER_SYMBOL}, + {0x003005, 0x003005, PG_U_MODIFIER_LETTER}, + {0x003006, 0x003006, PG_U_OTHER_LETTER}, + {0x003007, 0x003007, PG_U_LETTER_NUMBER}, + {0x003008, 0x003008, PG_U_OPEN_PUNCTUATION}, + {0x003009, 0x003009, PG_U_CLOSE_PUNCTUATION}, + {0x00300a, 0x00300a, PG_U_OPEN_PUNCTUATION}, + {0x00300b, 0x00300b, PG_U_CLOSE_PUNCTUATION}, + {0x00300c, 0x00300c, PG_U_OPEN_PUNCTUATION}, + {0x00300d, 0x00300d, PG_U_CLOSE_PUNCTUATION}, + {0x00300e, 0x00300e, PG_U_OPEN_PUNCTUATION}, + {0x00300f, 0x00300f, PG_U_CLOSE_PUNCTUATION}, + {0x003010, 0x003010, PG_U_OPEN_PUNCTUATION}, + {0x003011, 0x003011, PG_U_CLOSE_PUNCTUATION}, + {0x003012, 0x003013, PG_U_OTHER_SYMBOL}, + {0x003014, 0x003014, PG_U_OPEN_PUNCTUATION}, + {0x003015, 0x003015, PG_U_CLOSE_PUNCTUATION}, + {0x003016, 0x003016, PG_U_OPEN_PUNCTUATION}, + {0x003017, 0x003017, PG_U_CLOSE_PUNCTUATION}, + {0x003018, 0x003018, PG_U_OPEN_PUNCTUATION}, + {0x003019, 0x003019, PG_U_CLOSE_PUNCTUATION}, + {0x00301a, 0x00301a, PG_U_OPEN_PUNCTUATION}, + {0x00301b, 0x00301b, PG_U_CLOSE_PUNCTUATION}, + {0x00301c, 0x00301c, PG_U_DASH_PUNCTUATION}, + {0x00301d, 0x00301d, PG_U_OPEN_PUNCTUATION}, + {0x00301e, 0x00301f, PG_U_CLOSE_PUNCTUATION}, + {0x003020, 0x003020, PG_U_OTHER_SYMBOL}, + {0x003021, 0x003029, PG_U_LETTER_NUMBER}, + {0x00302a, 0x00302d, PG_U_NONSPACING_MARK}, + {0x00302e, 0x00302f, PG_U_SPACING_MARK}, + {0x003030, 0x003030, PG_U_DASH_PUNCTUATION}, + {0x003031, 0x003035, PG_U_MODIFIER_LETTER}, + {0x003036, 0x003037, PG_U_OTHER_SYMBOL}, + {0x003038, 0x00303a, PG_U_LETTER_NUMBER}, + {0x00303b, 0x00303b, PG_U_MODIFIER_LETTER}, + {0x00303c, 0x00303c, PG_U_OTHER_LETTER}, + {0x00303d, 0x00303d, PG_U_OTHER_PUNCTUATION}, + {0x00303e, 0x00303f, PG_U_OTHER_SYMBOL}, + {0x003041, 0x003096, PG_U_OTHER_LETTER}, + {0x003099, 0x00309a, PG_U_NONSPACING_MARK}, + {0x00309b, 0x00309c, PG_U_MODIFIER_SYMBOL}, + {0x00309d, 0x00309e, PG_U_MODIFIER_LETTER}, + {0x00309f, 0x00309f, PG_U_OTHER_LETTER}, + {0x0030a0, 0x0030a0, PG_U_DASH_PUNCTUATION}, + {0x0030a1, 0x0030fa, PG_U_OTHER_LETTER}, + {0x0030fb, 0x0030fb, PG_U_OTHER_PUNCTUATION}, + {0x0030fc, 0x0030fe, PG_U_MODIFIER_LETTER}, + {0x0030ff, 0x0030ff, PG_U_OTHER_LETTER}, + {0x003105, 0x00312f, PG_U_OTHER_LETTER}, + {0x003131, 0x00318e, PG_U_OTHER_LETTER}, + {0x003190, 0x003191, PG_U_OTHER_SYMBOL}, + {0x003192, 0x003195, PG_U_OTHER_NUMBER}, + {0x003196, 0x00319f, PG_U_OTHER_SYMBOL}, + {0x0031a0, 0x0031bf, PG_U_OTHER_LETTER}, + {0x0031c0, 0x0031e3, PG_U_OTHER_SYMBOL}, + {0x0031ef, 0x0031ef, PG_U_OTHER_SYMBOL}, + {0x0031f0, 0x0031ff, PG_U_OTHER_LETTER}, + {0x003200, 0x00321e, PG_U_OTHER_SYMBOL}, + {0x003220, 0x003229, PG_U_OTHER_NUMBER}, + {0x00322a, 0x003247, PG_U_OTHER_SYMBOL}, + {0x003248, 0x00324f, PG_U_OTHER_NUMBER}, + {0x003250, 0x003250, PG_U_OTHER_SYMBOL}, + {0x003251, 0x00325f, PG_U_OTHER_NUMBER}, + {0x003260, 0x00327f, PG_U_OTHER_SYMBOL}, + {0x003280, 0x003289, PG_U_OTHER_NUMBER}, + {0x00328a, 0x0032b0, PG_U_OTHER_SYMBOL}, + {0x0032b1, 0x0032bf, PG_U_OTHER_NUMBER}, + {0x0032c0, 0x0033ff, PG_U_OTHER_SYMBOL}, + {0x003400, 0x004dbf, PG_U_OTHER_LETTER}, + {0x004dc0, 0x004dff, PG_U_OTHER_SYMBOL}, + {0x004e00, 0x00a014, PG_U_OTHER_LETTER}, + {0x00a015, 0x00a015, PG_U_MODIFIER_LETTER}, + {0x00a016, 0x00a48c, PG_U_OTHER_LETTER}, + {0x00a490, 0x00a4c6, PG_U_OTHER_SYMBOL}, + {0x00a4d0, 0x00a4f7, PG_U_OTHER_LETTER}, + {0x00a4f8, 0x00a4fd, PG_U_MODIFIER_LETTER}, + {0x00a4fe, 0x00a4ff, PG_U_OTHER_PUNCTUATION}, + {0x00a500, 0x00a60b, PG_U_OTHER_LETTER}, + {0x00a60c, 0x00a60c, PG_U_MODIFIER_LETTER}, + {0x00a60d, 0x00a60f, PG_U_OTHER_PUNCTUATION}, + {0x00a610, 0x00a61f, PG_U_OTHER_LETTER}, + {0x00a620, 0x00a629, PG_U_DECIMAL_NUMBER}, + {0x00a62a, 0x00a62b, PG_U_OTHER_LETTER}, + {0x00a640, 0x00a640, PG_U_UPPERCASE_LETTER}, + {0x00a641, 0x00a641, PG_U_LOWERCASE_LETTER}, + {0x00a642, 0x00a642, PG_U_UPPERCASE_LETTER}, + {0x00a643, 0x00a643, PG_U_LOWERCASE_LETTER}, + {0x00a644, 0x00a644, PG_U_UPPERCASE_LETTER}, + {0x00a645, 0x00a645, PG_U_LOWERCASE_LETTER}, + {0x00a646, 0x00a646, PG_U_UPPERCASE_LETTER}, + {0x00a647, 0x00a647, PG_U_LOWERCASE_LETTER}, + {0x00a648, 0x00a648, PG_U_UPPERCASE_LETTER}, + {0x00a649, 0x00a649, PG_U_LOWERCASE_LETTER}, + {0x00a64a, 0x00a64a, PG_U_UPPERCASE_LETTER}, + {0x00a64b, 0x00a64b, PG_U_LOWERCASE_LETTER}, + {0x00a64c, 0x00a64c, PG_U_UPPERCASE_LETTER}, + {0x00a64d, 0x00a64d, PG_U_LOWERCASE_LETTER}, + {0x00a64e, 0x00a64e, PG_U_UPPERCASE_LETTER}, + {0x00a64f, 0x00a64f, PG_U_LOWERCASE_LETTER}, + {0x00a650, 0x00a650, PG_U_UPPERCASE_LETTER}, + {0x00a651, 0x00a651, PG_U_LOWERCASE_LETTER}, + {0x00a652, 0x00a652, PG_U_UPPERCASE_LETTER}, + {0x00a653, 0x00a653, PG_U_LOWERCASE_LETTER}, + {0x00a654, 0x00a654, PG_U_UPPERCASE_LETTER}, + {0x00a655, 0x00a655, PG_U_LOWERCASE_LETTER}, + {0x00a656, 0x00a656, PG_U_UPPERCASE_LETTER}, + {0x00a657, 0x00a657, PG_U_LOWERCASE_LETTER}, + {0x00a658, 0x00a658, PG_U_UPPERCASE_LETTER}, + {0x00a659, 0x00a659, PG_U_LOWERCASE_LETTER}, + {0x00a65a, 0x00a65a, PG_U_UPPERCASE_LETTER}, + {0x00a65b, 0x00a65b, PG_U_LOWERCASE_LETTER}, + {0x00a65c, 0x00a65c, PG_U_UPPERCASE_LETTER}, + {0x00a65d, 0x00a65d, PG_U_LOWERCASE_LETTER}, + {0x00a65e, 0x00a65e, PG_U_UPPERCASE_LETTER}, + {0x00a65f, 0x00a65f, PG_U_LOWERCASE_LETTER}, + {0x00a660, 0x00a660, PG_U_UPPERCASE_LETTER}, + {0x00a661, 0x00a661, PG_U_LOWERCASE_LETTER}, + {0x00a662, 0x00a662, PG_U_UPPERCASE_LETTER}, + {0x00a663, 0x00a663, PG_U_LOWERCASE_LETTER}, + {0x00a664, 0x00a664, PG_U_UPPERCASE_LETTER}, + {0x00a665, 0x00a665, PG_U_LOWERCASE_LETTER}, + {0x00a666, 0x00a666, PG_U_UPPERCASE_LETTER}, + {0x00a667, 0x00a667, PG_U_LOWERCASE_LETTER}, + {0x00a668, 0x00a668, PG_U_UPPERCASE_LETTER}, + {0x00a669, 0x00a669, PG_U_LOWERCASE_LETTER}, + {0x00a66a, 0x00a66a, PG_U_UPPERCASE_LETTER}, + {0x00a66b, 0x00a66b, PG_U_LOWERCASE_LETTER}, + {0x00a66c, 0x00a66c, PG_U_UPPERCASE_LETTER}, + {0x00a66d, 0x00a66d, PG_U_LOWERCASE_LETTER}, + {0x00a66e, 0x00a66e, PG_U_OTHER_LETTER}, + {0x00a66f, 0x00a66f, PG_U_NONSPACING_MARK}, + {0x00a670, 0x00a672, PG_U_ENCLOSING_MARK}, + {0x00a673, 0x00a673, PG_U_OTHER_PUNCTUATION}, + {0x00a674, 0x00a67d, PG_U_NONSPACING_MARK}, + {0x00a67e, 0x00a67e, PG_U_OTHER_PUNCTUATION}, + {0x00a67f, 0x00a67f, PG_U_MODIFIER_LETTER}, + {0x00a680, 0x00a680, PG_U_UPPERCASE_LETTER}, + {0x00a681, 0x00a681, PG_U_LOWERCASE_LETTER}, + {0x00a682, 0x00a682, PG_U_UPPERCASE_LETTER}, + {0x00a683, 0x00a683, PG_U_LOWERCASE_LETTER}, + {0x00a684, 0x00a684, PG_U_UPPERCASE_LETTER}, + {0x00a685, 0x00a685, PG_U_LOWERCASE_LETTER}, + {0x00a686, 0x00a686, PG_U_UPPERCASE_LETTER}, + {0x00a687, 0x00a687, PG_U_LOWERCASE_LETTER}, + {0x00a688, 0x00a688, PG_U_UPPERCASE_LETTER}, + {0x00a689, 0x00a689, PG_U_LOWERCASE_LETTER}, + {0x00a68a, 0x00a68a, PG_U_UPPERCASE_LETTER}, + {0x00a68b, 0x00a68b, PG_U_LOWERCASE_LETTER}, + {0x00a68c, 0x00a68c, PG_U_UPPERCASE_LETTER}, + {0x00a68d, 0x00a68d, PG_U_LOWERCASE_LETTER}, + {0x00a68e, 0x00a68e, PG_U_UPPERCASE_LETTER}, + {0x00a68f, 0x00a68f, PG_U_LOWERCASE_LETTER}, + {0x00a690, 0x00a690, PG_U_UPPERCASE_LETTER}, + {0x00a691, 0x00a691, PG_U_LOWERCASE_LETTER}, + {0x00a692, 0x00a692, PG_U_UPPERCASE_LETTER}, + {0x00a693, 0x00a693, PG_U_LOWERCASE_LETTER}, + {0x00a694, 0x00a694, PG_U_UPPERCASE_LETTER}, + {0x00a695, 0x00a695, PG_U_LOWERCASE_LETTER}, + {0x00a696, 0x00a696, PG_U_UPPERCASE_LETTER}, + {0x00a697, 0x00a697, PG_U_LOWERCASE_LETTER}, + {0x00a698, 0x00a698, PG_U_UPPERCASE_LETTER}, + {0x00a699, 0x00a699, PG_U_LOWERCASE_LETTER}, + {0x00a69a, 0x00a69a, PG_U_UPPERCASE_LETTER}, + {0x00a69b, 0x00a69b, PG_U_LOWERCASE_LETTER}, + {0x00a69c, 0x00a69d, PG_U_MODIFIER_LETTER}, + {0x00a69e, 0x00a69f, PG_U_NONSPACING_MARK}, + {0x00a6a0, 0x00a6e5, PG_U_OTHER_LETTER}, + {0x00a6e6, 0x00a6ef, PG_U_LETTER_NUMBER}, + {0x00a6f0, 0x00a6f1, PG_U_NONSPACING_MARK}, + {0x00a6f2, 0x00a6f7, PG_U_OTHER_PUNCTUATION}, + {0x00a700, 0x00a716, PG_U_MODIFIER_SYMBOL}, + {0x00a717, 0x00a71f, PG_U_MODIFIER_LETTER}, + {0x00a720, 0x00a721, PG_U_MODIFIER_SYMBOL}, + {0x00a722, 0x00a722, PG_U_UPPERCASE_LETTER}, + {0x00a723, 0x00a723, PG_U_LOWERCASE_LETTER}, + {0x00a724, 0x00a724, PG_U_UPPERCASE_LETTER}, + {0x00a725, 0x00a725, PG_U_LOWERCASE_LETTER}, + {0x00a726, 0x00a726, PG_U_UPPERCASE_LETTER}, + {0x00a727, 0x00a727, PG_U_LOWERCASE_LETTER}, + {0x00a728, 0x00a728, PG_U_UPPERCASE_LETTER}, + {0x00a729, 0x00a729, PG_U_LOWERCASE_LETTER}, + {0x00a72a, 0x00a72a, PG_U_UPPERCASE_LETTER}, + {0x00a72b, 0x00a72b, PG_U_LOWERCASE_LETTER}, + {0x00a72c, 0x00a72c, PG_U_UPPERCASE_LETTER}, + {0x00a72d, 0x00a72d, PG_U_LOWERCASE_LETTER}, + {0x00a72e, 0x00a72e, PG_U_UPPERCASE_LETTER}, + {0x00a72f, 0x00a731, PG_U_LOWERCASE_LETTER}, + {0x00a732, 0x00a732, PG_U_UPPERCASE_LETTER}, + {0x00a733, 0x00a733, PG_U_LOWERCASE_LETTER}, + {0x00a734, 0x00a734, PG_U_UPPERCASE_LETTER}, + {0x00a735, 0x00a735, PG_U_LOWERCASE_LETTER}, + {0x00a736, 0x00a736, PG_U_UPPERCASE_LETTER}, + {0x00a737, 0x00a737, PG_U_LOWERCASE_LETTER}, + {0x00a738, 0x00a738, PG_U_UPPERCASE_LETTER}, + {0x00a739, 0x00a739, PG_U_LOWERCASE_LETTER}, + {0x00a73a, 0x00a73a, PG_U_UPPERCASE_LETTER}, + {0x00a73b, 0x00a73b, PG_U_LOWERCASE_LETTER}, + {0x00a73c, 0x00a73c, PG_U_UPPERCASE_LETTER}, + {0x00a73d, 0x00a73d, PG_U_LOWERCASE_LETTER}, + {0x00a73e, 0x00a73e, PG_U_UPPERCASE_LETTER}, + {0x00a73f, 0x00a73f, PG_U_LOWERCASE_LETTER}, + {0x00a740, 0x00a740, PG_U_UPPERCASE_LETTER}, + {0x00a741, 0x00a741, PG_U_LOWERCASE_LETTER}, + {0x00a742, 0x00a742, PG_U_UPPERCASE_LETTER}, + {0x00a743, 0x00a743, PG_U_LOWERCASE_LETTER}, + {0x00a744, 0x00a744, PG_U_UPPERCASE_LETTER}, + {0x00a745, 0x00a745, PG_U_LOWERCASE_LETTER}, + {0x00a746, 0x00a746, PG_U_UPPERCASE_LETTER}, + {0x00a747, 0x00a747, PG_U_LOWERCASE_LETTER}, + {0x00a748, 0x00a748, PG_U_UPPERCASE_LETTER}, + {0x00a749, 0x00a749, PG_U_LOWERCASE_LETTER}, + {0x00a74a, 0x00a74a, PG_U_UPPERCASE_LETTER}, + {0x00a74b, 0x00a74b, PG_U_LOWERCASE_LETTER}, + {0x00a74c, 0x00a74c, PG_U_UPPERCASE_LETTER}, + {0x00a74d, 0x00a74d, PG_U_LOWERCASE_LETTER}, + {0x00a74e, 0x00a74e, PG_U_UPPERCASE_LETTER}, + {0x00a74f, 0x00a74f, PG_U_LOWERCASE_LETTER}, + {0x00a750, 0x00a750, PG_U_UPPERCASE_LETTER}, + {0x00a751, 0x00a751, PG_U_LOWERCASE_LETTER}, + {0x00a752, 0x00a752, PG_U_UPPERCASE_LETTER}, + {0x00a753, 0x00a753, PG_U_LOWERCASE_LETTER}, + {0x00a754, 0x00a754, PG_U_UPPERCASE_LETTER}, + {0x00a755, 0x00a755, PG_U_LOWERCASE_LETTER}, + {0x00a756, 0x00a756, PG_U_UPPERCASE_LETTER}, + {0x00a757, 0x00a757, PG_U_LOWERCASE_LETTER}, + {0x00a758, 0x00a758, PG_U_UPPERCASE_LETTER}, + {0x00a759, 0x00a759, PG_U_LOWERCASE_LETTER}, + {0x00a75a, 0x00a75a, PG_U_UPPERCASE_LETTER}, + {0x00a75b, 0x00a75b, PG_U_LOWERCASE_LETTER}, + {0x00a75c, 0x00a75c, PG_U_UPPERCASE_LETTER}, + {0x00a75d, 0x00a75d, PG_U_LOWERCASE_LETTER}, + {0x00a75e, 0x00a75e, PG_U_UPPERCASE_LETTER}, + {0x00a75f, 0x00a75f, PG_U_LOWERCASE_LETTER}, + {0x00a760, 0x00a760, PG_U_UPPERCASE_LETTER}, + {0x00a761, 0x00a761, PG_U_LOWERCASE_LETTER}, + {0x00a762, 0x00a762, PG_U_UPPERCASE_LETTER}, + {0x00a763, 0x00a763, PG_U_LOWERCASE_LETTER}, + {0x00a764, 0x00a764, PG_U_UPPERCASE_LETTER}, + {0x00a765, 0x00a765, PG_U_LOWERCASE_LETTER}, + {0x00a766, 0x00a766, PG_U_UPPERCASE_LETTER}, + {0x00a767, 0x00a767, PG_U_LOWERCASE_LETTER}, + {0x00a768, 0x00a768, PG_U_UPPERCASE_LETTER}, + {0x00a769, 0x00a769, PG_U_LOWERCASE_LETTER}, + {0x00a76a, 0x00a76a, PG_U_UPPERCASE_LETTER}, + {0x00a76b, 0x00a76b, PG_U_LOWERCASE_LETTER}, + {0x00a76c, 0x00a76c, PG_U_UPPERCASE_LETTER}, + {0x00a76d, 0x00a76d, PG_U_LOWERCASE_LETTER}, + {0x00a76e, 0x00a76e, PG_U_UPPERCASE_LETTER}, + {0x00a76f, 0x00a76f, PG_U_LOWERCASE_LETTER}, + {0x00a770, 0x00a770, PG_U_MODIFIER_LETTER}, + {0x00a771, 0x00a778, PG_U_LOWERCASE_LETTER}, + {0x00a779, 0x00a779, PG_U_UPPERCASE_LETTER}, + {0x00a77a, 0x00a77a, PG_U_LOWERCASE_LETTER}, + {0x00a77b, 0x00a77b, PG_U_UPPERCASE_LETTER}, + {0x00a77c, 0x00a77c, PG_U_LOWERCASE_LETTER}, + {0x00a77d, 0x00a77e, PG_U_UPPERCASE_LETTER}, + {0x00a77f, 0x00a77f, PG_U_LOWERCASE_LETTER}, + {0x00a780, 0x00a780, PG_U_UPPERCASE_LETTER}, + {0x00a781, 0x00a781, PG_U_LOWERCASE_LETTER}, + {0x00a782, 0x00a782, PG_U_UPPERCASE_LETTER}, + {0x00a783, 0x00a783, PG_U_LOWERCASE_LETTER}, + {0x00a784, 0x00a784, PG_U_UPPERCASE_LETTER}, + {0x00a785, 0x00a785, PG_U_LOWERCASE_LETTER}, + {0x00a786, 0x00a786, PG_U_UPPERCASE_LETTER}, + {0x00a787, 0x00a787, PG_U_LOWERCASE_LETTER}, + {0x00a788, 0x00a788, PG_U_MODIFIER_LETTER}, + {0x00a789, 0x00a78a, PG_U_MODIFIER_SYMBOL}, + {0x00a78b, 0x00a78b, PG_U_UPPERCASE_LETTER}, + {0x00a78c, 0x00a78c, PG_U_LOWERCASE_LETTER}, + {0x00a78d, 0x00a78d, PG_U_UPPERCASE_LETTER}, + {0x00a78e, 0x00a78e, PG_U_LOWERCASE_LETTER}, + {0x00a78f, 0x00a78f, PG_U_OTHER_LETTER}, + {0x00a790, 0x00a790, PG_U_UPPERCASE_LETTER}, + {0x00a791, 0x00a791, PG_U_LOWERCASE_LETTER}, + {0x00a792, 0x00a792, PG_U_UPPERCASE_LETTER}, + {0x00a793, 0x00a795, PG_U_LOWERCASE_LETTER}, + {0x00a796, 0x00a796, PG_U_UPPERCASE_LETTER}, + {0x00a797, 0x00a797, PG_U_LOWERCASE_LETTER}, + {0x00a798, 0x00a798, PG_U_UPPERCASE_LETTER}, + {0x00a799, 0x00a799, PG_U_LOWERCASE_LETTER}, + {0x00a79a, 0x00a79a, PG_U_UPPERCASE_LETTER}, + {0x00a79b, 0x00a79b, PG_U_LOWERCASE_LETTER}, + {0x00a79c, 0x00a79c, PG_U_UPPERCASE_LETTER}, + {0x00a79d, 0x00a79d, PG_U_LOWERCASE_LETTER}, + {0x00a79e, 0x00a79e, PG_U_UPPERCASE_LETTER}, + {0x00a79f, 0x00a79f, PG_U_LOWERCASE_LETTER}, + {0x00a7a0, 0x00a7a0, PG_U_UPPERCASE_LETTER}, + {0x00a7a1, 0x00a7a1, PG_U_LOWERCASE_LETTER}, + {0x00a7a2, 0x00a7a2, PG_U_UPPERCASE_LETTER}, + {0x00a7a3, 0x00a7a3, PG_U_LOWERCASE_LETTER}, + {0x00a7a4, 0x00a7a4, PG_U_UPPERCASE_LETTER}, + {0x00a7a5, 0x00a7a5, PG_U_LOWERCASE_LETTER}, + {0x00a7a6, 0x00a7a6, PG_U_UPPERCASE_LETTER}, + {0x00a7a7, 0x00a7a7, PG_U_LOWERCASE_LETTER}, + {0x00a7a8, 0x00a7a8, PG_U_UPPERCASE_LETTER}, + {0x00a7a9, 0x00a7a9, PG_U_LOWERCASE_LETTER}, + {0x00a7aa, 0x00a7ae, PG_U_UPPERCASE_LETTER}, + {0x00a7af, 0x00a7af, PG_U_LOWERCASE_LETTER}, + {0x00a7b0, 0x00a7b4, PG_U_UPPERCASE_LETTER}, + {0x00a7b5, 0x00a7b5, PG_U_LOWERCASE_LETTER}, + {0x00a7b6, 0x00a7b6, PG_U_UPPERCASE_LETTER}, + {0x00a7b7, 0x00a7b7, PG_U_LOWERCASE_LETTER}, + {0x00a7b8, 0x00a7b8, PG_U_UPPERCASE_LETTER}, + {0x00a7b9, 0x00a7b9, PG_U_LOWERCASE_LETTER}, + {0x00a7ba, 0x00a7ba, PG_U_UPPERCASE_LETTER}, + {0x00a7bb, 0x00a7bb, PG_U_LOWERCASE_LETTER}, + {0x00a7bc, 0x00a7bc, PG_U_UPPERCASE_LETTER}, + {0x00a7bd, 0x00a7bd, PG_U_LOWERCASE_LETTER}, + {0x00a7be, 0x00a7be, PG_U_UPPERCASE_LETTER}, + {0x00a7bf, 0x00a7bf, PG_U_LOWERCASE_LETTER}, + {0x00a7c0, 0x00a7c0, PG_U_UPPERCASE_LETTER}, + {0x00a7c1, 0x00a7c1, PG_U_LOWERCASE_LETTER}, + {0x00a7c2, 0x00a7c2, PG_U_UPPERCASE_LETTER}, + {0x00a7c3, 0x00a7c3, PG_U_LOWERCASE_LETTER}, + {0x00a7c4, 0x00a7c7, PG_U_UPPERCASE_LETTER}, + {0x00a7c8, 0x00a7c8, PG_U_LOWERCASE_LETTER}, + {0x00a7c9, 0x00a7c9, PG_U_UPPERCASE_LETTER}, + {0x00a7ca, 0x00a7ca, PG_U_LOWERCASE_LETTER}, + {0x00a7d0, 0x00a7d0, PG_U_UPPERCASE_LETTER}, + {0x00a7d1, 0x00a7d1, PG_U_LOWERCASE_LETTER}, + {0x00a7d3, 0x00a7d3, PG_U_LOWERCASE_LETTER}, + {0x00a7d5, 0x00a7d5, PG_U_LOWERCASE_LETTER}, + {0x00a7d6, 0x00a7d6, PG_U_UPPERCASE_LETTER}, + {0x00a7d7, 0x00a7d7, PG_U_LOWERCASE_LETTER}, + {0x00a7d8, 0x00a7d8, PG_U_UPPERCASE_LETTER}, + {0x00a7d9, 0x00a7d9, PG_U_LOWERCASE_LETTER}, + {0x00a7f2, 0x00a7f4, PG_U_MODIFIER_LETTER}, + {0x00a7f5, 0x00a7f5, PG_U_UPPERCASE_LETTER}, + {0x00a7f6, 0x00a7f6, PG_U_LOWERCASE_LETTER}, + {0x00a7f7, 0x00a7f7, PG_U_OTHER_LETTER}, + {0x00a7f8, 0x00a7f9, PG_U_MODIFIER_LETTER}, + {0x00a7fa, 0x00a7fa, PG_U_LOWERCASE_LETTER}, + {0x00a7fb, 0x00a801, PG_U_OTHER_LETTER}, + {0x00a802, 0x00a802, PG_U_NONSPACING_MARK}, + {0x00a803, 0x00a805, PG_U_OTHER_LETTER}, + {0x00a806, 0x00a806, PG_U_NONSPACING_MARK}, + {0x00a807, 0x00a80a, PG_U_OTHER_LETTER}, + {0x00a80b, 0x00a80b, PG_U_NONSPACING_MARK}, + {0x00a80c, 0x00a822, PG_U_OTHER_LETTER}, + {0x00a823, 0x00a824, PG_U_SPACING_MARK}, + {0x00a825, 0x00a826, PG_U_NONSPACING_MARK}, + {0x00a827, 0x00a827, PG_U_SPACING_MARK}, + {0x00a828, 0x00a82b, PG_U_OTHER_SYMBOL}, + {0x00a82c, 0x00a82c, PG_U_NONSPACING_MARK}, + {0x00a830, 0x00a835, PG_U_OTHER_NUMBER}, + {0x00a836, 0x00a837, PG_U_OTHER_SYMBOL}, + {0x00a838, 0x00a838, PG_U_CURRENCY_SYMBOL}, + {0x00a839, 0x00a839, PG_U_OTHER_SYMBOL}, + {0x00a840, 0x00a873, PG_U_OTHER_LETTER}, + {0x00a874, 0x00a877, PG_U_OTHER_PUNCTUATION}, + {0x00a880, 0x00a881, PG_U_SPACING_MARK}, + {0x00a882, 0x00a8b3, PG_U_OTHER_LETTER}, + {0x00a8b4, 0x00a8c3, PG_U_SPACING_MARK}, + {0x00a8c4, 0x00a8c5, PG_U_NONSPACING_MARK}, + {0x00a8ce, 0x00a8cf, PG_U_OTHER_PUNCTUATION}, + {0x00a8d0, 0x00a8d9, PG_U_DECIMAL_NUMBER}, + {0x00a8e0, 0x00a8f1, PG_U_NONSPACING_MARK}, + {0x00a8f2, 0x00a8f7, PG_U_OTHER_LETTER}, + {0x00a8f8, 0x00a8fa, PG_U_OTHER_PUNCTUATION}, + {0x00a8fb, 0x00a8fb, PG_U_OTHER_LETTER}, + {0x00a8fc, 0x00a8fc, PG_U_OTHER_PUNCTUATION}, + {0x00a8fd, 0x00a8fe, PG_U_OTHER_LETTER}, + {0x00a8ff, 0x00a8ff, PG_U_NONSPACING_MARK}, + {0x00a900, 0x00a909, PG_U_DECIMAL_NUMBER}, + {0x00a90a, 0x00a925, PG_U_OTHER_LETTER}, + {0x00a926, 0x00a92d, PG_U_NONSPACING_MARK}, + {0x00a92e, 0x00a92f, PG_U_OTHER_PUNCTUATION}, + {0x00a930, 0x00a946, PG_U_OTHER_LETTER}, + {0x00a947, 0x00a951, PG_U_NONSPACING_MARK}, + {0x00a952, 0x00a953, PG_U_SPACING_MARK}, + {0x00a95f, 0x00a95f, PG_U_OTHER_PUNCTUATION}, + {0x00a960, 0x00a97c, PG_U_OTHER_LETTER}, + {0x00a980, 0x00a982, PG_U_NONSPACING_MARK}, + {0x00a983, 0x00a983, PG_U_SPACING_MARK}, + {0x00a984, 0x00a9b2, PG_U_OTHER_LETTER}, + {0x00a9b3, 0x00a9b3, PG_U_NONSPACING_MARK}, + {0x00a9b4, 0x00a9b5, PG_U_SPACING_MARK}, + {0x00a9b6, 0x00a9b9, PG_U_NONSPACING_MARK}, + {0x00a9ba, 0x00a9bb, PG_U_SPACING_MARK}, + {0x00a9bc, 0x00a9bd, PG_U_NONSPACING_MARK}, + {0x00a9be, 0x00a9c0, PG_U_SPACING_MARK}, + {0x00a9c1, 0x00a9cd, PG_U_OTHER_PUNCTUATION}, + {0x00a9cf, 0x00a9cf, PG_U_MODIFIER_LETTER}, + {0x00a9d0, 0x00a9d9, PG_U_DECIMAL_NUMBER}, + {0x00a9de, 0x00a9df, PG_U_OTHER_PUNCTUATION}, + {0x00a9e0, 0x00a9e4, PG_U_OTHER_LETTER}, + {0x00a9e5, 0x00a9e5, PG_U_NONSPACING_MARK}, + {0x00a9e6, 0x00a9e6, PG_U_MODIFIER_LETTER}, + {0x00a9e7, 0x00a9ef, PG_U_OTHER_LETTER}, + {0x00a9f0, 0x00a9f9, PG_U_DECIMAL_NUMBER}, + {0x00a9fa, 0x00a9fe, PG_U_OTHER_LETTER}, + {0x00aa00, 0x00aa28, PG_U_OTHER_LETTER}, + {0x00aa29, 0x00aa2e, PG_U_NONSPACING_MARK}, + {0x00aa2f, 0x00aa30, PG_U_SPACING_MARK}, + {0x00aa31, 0x00aa32, PG_U_NONSPACING_MARK}, + {0x00aa33, 0x00aa34, PG_U_SPACING_MARK}, + {0x00aa35, 0x00aa36, PG_U_NONSPACING_MARK}, + {0x00aa40, 0x00aa42, PG_U_OTHER_LETTER}, + {0x00aa43, 0x00aa43, PG_U_NONSPACING_MARK}, + {0x00aa44, 0x00aa4b, PG_U_OTHER_LETTER}, + {0x00aa4c, 0x00aa4c, PG_U_NONSPACING_MARK}, + {0x00aa4d, 0x00aa4d, PG_U_SPACING_MARK}, + {0x00aa50, 0x00aa59, PG_U_DECIMAL_NUMBER}, + {0x00aa5c, 0x00aa5f, PG_U_OTHER_PUNCTUATION}, + {0x00aa60, 0x00aa6f, PG_U_OTHER_LETTER}, + {0x00aa70, 0x00aa70, PG_U_MODIFIER_LETTER}, + {0x00aa71, 0x00aa76, PG_U_OTHER_LETTER}, + {0x00aa77, 0x00aa79, PG_U_OTHER_SYMBOL}, + {0x00aa7a, 0x00aa7a, PG_U_OTHER_LETTER}, + {0x00aa7b, 0x00aa7b, PG_U_SPACING_MARK}, + {0x00aa7c, 0x00aa7c, PG_U_NONSPACING_MARK}, + {0x00aa7d, 0x00aa7d, PG_U_SPACING_MARK}, + {0x00aa7e, 0x00aaaf, PG_U_OTHER_LETTER}, + {0x00aab0, 0x00aab0, PG_U_NONSPACING_MARK}, + {0x00aab1, 0x00aab1, PG_U_OTHER_LETTER}, + {0x00aab2, 0x00aab4, PG_U_NONSPACING_MARK}, + {0x00aab5, 0x00aab6, PG_U_OTHER_LETTER}, + {0x00aab7, 0x00aab8, PG_U_NONSPACING_MARK}, + {0x00aab9, 0x00aabd, PG_U_OTHER_LETTER}, + {0x00aabe, 0x00aabf, PG_U_NONSPACING_MARK}, + {0x00aac0, 0x00aac0, PG_U_OTHER_LETTER}, + {0x00aac1, 0x00aac1, PG_U_NONSPACING_MARK}, + {0x00aac2, 0x00aac2, PG_U_OTHER_LETTER}, + {0x00aadb, 0x00aadc, PG_U_OTHER_LETTER}, + {0x00aadd, 0x00aadd, PG_U_MODIFIER_LETTER}, + {0x00aade, 0x00aadf, PG_U_OTHER_PUNCTUATION}, + {0x00aae0, 0x00aaea, PG_U_OTHER_LETTER}, + {0x00aaeb, 0x00aaeb, PG_U_SPACING_MARK}, + {0x00aaec, 0x00aaed, PG_U_NONSPACING_MARK}, + {0x00aaee, 0x00aaef, PG_U_SPACING_MARK}, + {0x00aaf0, 0x00aaf1, PG_U_OTHER_PUNCTUATION}, + {0x00aaf2, 0x00aaf2, PG_U_OTHER_LETTER}, + {0x00aaf3, 0x00aaf4, PG_U_MODIFIER_LETTER}, + {0x00aaf5, 0x00aaf5, PG_U_SPACING_MARK}, + {0x00aaf6, 0x00aaf6, PG_U_NONSPACING_MARK}, + {0x00ab01, 0x00ab06, PG_U_OTHER_LETTER}, + {0x00ab09, 0x00ab0e, PG_U_OTHER_LETTER}, + {0x00ab11, 0x00ab16, PG_U_OTHER_LETTER}, + {0x00ab20, 0x00ab26, PG_U_OTHER_LETTER}, + {0x00ab28, 0x00ab2e, PG_U_OTHER_LETTER}, + {0x00ab30, 0x00ab5a, PG_U_LOWERCASE_LETTER}, + {0x00ab5b, 0x00ab5b, PG_U_MODIFIER_SYMBOL}, + {0x00ab5c, 0x00ab5f, PG_U_MODIFIER_LETTER}, + {0x00ab60, 0x00ab68, PG_U_LOWERCASE_LETTER}, + {0x00ab69, 0x00ab69, PG_U_MODIFIER_LETTER}, + {0x00ab6a, 0x00ab6b, PG_U_MODIFIER_SYMBOL}, + {0x00ab70, 0x00abbf, PG_U_LOWERCASE_LETTER}, + {0x00abc0, 0x00abe2, PG_U_OTHER_LETTER}, + {0x00abe3, 0x00abe4, PG_U_SPACING_MARK}, + {0x00abe5, 0x00abe5, PG_U_NONSPACING_MARK}, + {0x00abe6, 0x00abe7, PG_U_SPACING_MARK}, + {0x00abe8, 0x00abe8, PG_U_NONSPACING_MARK}, + {0x00abe9, 0x00abea, PG_U_SPACING_MARK}, + {0x00abeb, 0x00abeb, PG_U_OTHER_PUNCTUATION}, + {0x00abec, 0x00abec, PG_U_SPACING_MARK}, + {0x00abed, 0x00abed, PG_U_NONSPACING_MARK}, + {0x00abf0, 0x00abf9, PG_U_DECIMAL_NUMBER}, + {0x00ac00, 0x00d7a3, PG_U_OTHER_LETTER}, + {0x00d7b0, 0x00d7c6, PG_U_OTHER_LETTER}, + {0x00d7cb, 0x00d7fb, PG_U_OTHER_LETTER}, + {0x00d800, 0x00dfff, PG_U_SURROGATE}, + {0x00e000, 0x00f8ff, PG_U_PRIVATE_USE}, + {0x00f900, 0x00fa6d, PG_U_OTHER_LETTER}, + {0x00fa70, 0x00fad9, PG_U_OTHER_LETTER}, + {0x00fb00, 0x00fb06, PG_U_LOWERCASE_LETTER}, + {0x00fb13, 0x00fb17, PG_U_LOWERCASE_LETTER}, + {0x00fb1d, 0x00fb1d, PG_U_OTHER_LETTER}, + {0x00fb1e, 0x00fb1e, PG_U_NONSPACING_MARK}, + {0x00fb1f, 0x00fb28, PG_U_OTHER_LETTER}, + {0x00fb29, 0x00fb29, PG_U_MATH_SYMBOL}, + {0x00fb2a, 0x00fb36, PG_U_OTHER_LETTER}, + {0x00fb38, 0x00fb3c, PG_U_OTHER_LETTER}, + {0x00fb3e, 0x00fb3e, PG_U_OTHER_LETTER}, + {0x00fb40, 0x00fb41, PG_U_OTHER_LETTER}, + {0x00fb43, 0x00fb44, PG_U_OTHER_LETTER}, + {0x00fb46, 0x00fbb1, PG_U_OTHER_LETTER}, + {0x00fbb2, 0x00fbc2, PG_U_MODIFIER_SYMBOL}, + {0x00fbd3, 0x00fd3d, PG_U_OTHER_LETTER}, + {0x00fd3e, 0x00fd3e, PG_U_CLOSE_PUNCTUATION}, + {0x00fd3f, 0x00fd3f, PG_U_OPEN_PUNCTUATION}, + {0x00fd40, 0x00fd4f, PG_U_OTHER_SYMBOL}, + {0x00fd50, 0x00fd8f, PG_U_OTHER_LETTER}, + {0x00fd92, 0x00fdc7, PG_U_OTHER_LETTER}, + {0x00fdcf, 0x00fdcf, PG_U_OTHER_SYMBOL}, + {0x00fdf0, 0x00fdfb, PG_U_OTHER_LETTER}, + {0x00fdfc, 0x00fdfc, PG_U_CURRENCY_SYMBOL}, + {0x00fdfd, 0x00fdff, PG_U_OTHER_SYMBOL}, + {0x00fe00, 0x00fe0f, PG_U_NONSPACING_MARK}, + {0x00fe10, 0x00fe16, PG_U_OTHER_PUNCTUATION}, + {0x00fe17, 0x00fe17, PG_U_OPEN_PUNCTUATION}, + {0x00fe18, 0x00fe18, PG_U_CLOSE_PUNCTUATION}, + {0x00fe19, 0x00fe19, PG_U_OTHER_PUNCTUATION}, + {0x00fe20, 0x00fe2f, PG_U_NONSPACING_MARK}, + {0x00fe30, 0x00fe30, PG_U_OTHER_PUNCTUATION}, + {0x00fe31, 0x00fe32, PG_U_DASH_PUNCTUATION}, + {0x00fe33, 0x00fe34, PG_U_CONNECTOR_PUNCTUATION}, + {0x00fe35, 0x00fe35, PG_U_OPEN_PUNCTUATION}, + {0x00fe36, 0x00fe36, PG_U_CLOSE_PUNCTUATION}, + {0x00fe37, 0x00fe37, PG_U_OPEN_PUNCTUATION}, + {0x00fe38, 0x00fe38, PG_U_CLOSE_PUNCTUATION}, + {0x00fe39, 0x00fe39, PG_U_OPEN_PUNCTUATION}, + {0x00fe3a, 0x00fe3a, PG_U_CLOSE_PUNCTUATION}, + {0x00fe3b, 0x00fe3b, PG_U_OPEN_PUNCTUATION}, + {0x00fe3c, 0x00fe3c, PG_U_CLOSE_PUNCTUATION}, + {0x00fe3d, 0x00fe3d, PG_U_OPEN_PUNCTUATION}, + {0x00fe3e, 0x00fe3e, PG_U_CLOSE_PUNCTUATION}, + {0x00fe3f, 0x00fe3f, PG_U_OPEN_PUNCTUATION}, + {0x00fe40, 0x00fe40, PG_U_CLOSE_PUNCTUATION}, + {0x00fe41, 0x00fe41, PG_U_OPEN_PUNCTUATION}, + {0x00fe42, 0x00fe42, PG_U_CLOSE_PUNCTUATION}, + {0x00fe43, 0x00fe43, PG_U_OPEN_PUNCTUATION}, + {0x00fe44, 0x00fe44, PG_U_CLOSE_PUNCTUATION}, + {0x00fe45, 0x00fe46, PG_U_OTHER_PUNCTUATION}, + {0x00fe47, 0x00fe47, PG_U_OPEN_PUNCTUATION}, + {0x00fe48, 0x00fe48, PG_U_CLOSE_PUNCTUATION}, + {0x00fe49, 0x00fe4c, PG_U_OTHER_PUNCTUATION}, + {0x00fe4d, 0x00fe4f, PG_U_CONNECTOR_PUNCTUATION}, + {0x00fe50, 0x00fe52, PG_U_OTHER_PUNCTUATION}, + {0x00fe54, 0x00fe57, PG_U_OTHER_PUNCTUATION}, + {0x00fe58, 0x00fe58, PG_U_DASH_PUNCTUATION}, + {0x00fe59, 0x00fe59, PG_U_OPEN_PUNCTUATION}, + {0x00fe5a, 0x00fe5a, PG_U_CLOSE_PUNCTUATION}, + {0x00fe5b, 0x00fe5b, PG_U_OPEN_PUNCTUATION}, + {0x00fe5c, 0x00fe5c, PG_U_CLOSE_PUNCTUATION}, + {0x00fe5d, 0x00fe5d, PG_U_OPEN_PUNCTUATION}, + {0x00fe5e, 0x00fe5e, PG_U_CLOSE_PUNCTUATION}, + {0x00fe5f, 0x00fe61, PG_U_OTHER_PUNCTUATION}, + {0x00fe62, 0x00fe62, PG_U_MATH_SYMBOL}, + {0x00fe63, 0x00fe63, PG_U_DASH_PUNCTUATION}, + {0x00fe64, 0x00fe66, PG_U_MATH_SYMBOL}, + {0x00fe68, 0x00fe68, PG_U_OTHER_PUNCTUATION}, + {0x00fe69, 0x00fe69, PG_U_CURRENCY_SYMBOL}, + {0x00fe6a, 0x00fe6b, PG_U_OTHER_PUNCTUATION}, + {0x00fe70, 0x00fe74, PG_U_OTHER_LETTER}, + {0x00fe76, 0x00fefc, PG_U_OTHER_LETTER}, + {0x00feff, 0x00feff, PG_U_FORMAT}, + {0x00ff01, 0x00ff03, PG_U_OTHER_PUNCTUATION}, + {0x00ff04, 0x00ff04, PG_U_CURRENCY_SYMBOL}, + {0x00ff05, 0x00ff07, PG_U_OTHER_PUNCTUATION}, + {0x00ff08, 0x00ff08, PG_U_OPEN_PUNCTUATION}, + {0x00ff09, 0x00ff09, PG_U_CLOSE_PUNCTUATION}, + {0x00ff0a, 0x00ff0a, PG_U_OTHER_PUNCTUATION}, + {0x00ff0b, 0x00ff0b, PG_U_MATH_SYMBOL}, + {0x00ff0c, 0x00ff0c, PG_U_OTHER_PUNCTUATION}, + {0x00ff0d, 0x00ff0d, PG_U_DASH_PUNCTUATION}, + {0x00ff0e, 0x00ff0f, PG_U_OTHER_PUNCTUATION}, + {0x00ff10, 0x00ff19, PG_U_DECIMAL_NUMBER}, + {0x00ff1a, 0x00ff1b, PG_U_OTHER_PUNCTUATION}, + {0x00ff1c, 0x00ff1e, PG_U_MATH_SYMBOL}, + {0x00ff1f, 0x00ff20, PG_U_OTHER_PUNCTUATION}, + {0x00ff21, 0x00ff3a, PG_U_UPPERCASE_LETTER}, + {0x00ff3b, 0x00ff3b, PG_U_OPEN_PUNCTUATION}, + {0x00ff3c, 0x00ff3c, PG_U_OTHER_PUNCTUATION}, + {0x00ff3d, 0x00ff3d, PG_U_CLOSE_PUNCTUATION}, + {0x00ff3e, 0x00ff3e, PG_U_MODIFIER_SYMBOL}, + {0x00ff3f, 0x00ff3f, PG_U_CONNECTOR_PUNCTUATION}, + {0x00ff40, 0x00ff40, PG_U_MODIFIER_SYMBOL}, + {0x00ff41, 0x00ff5a, PG_U_LOWERCASE_LETTER}, + {0x00ff5b, 0x00ff5b, PG_U_OPEN_PUNCTUATION}, + {0x00ff5c, 0x00ff5c, PG_U_MATH_SYMBOL}, + {0x00ff5d, 0x00ff5d, PG_U_CLOSE_PUNCTUATION}, + {0x00ff5e, 0x00ff5e, PG_U_MATH_SYMBOL}, + {0x00ff5f, 0x00ff5f, PG_U_OPEN_PUNCTUATION}, + {0x00ff60, 0x00ff60, PG_U_CLOSE_PUNCTUATION}, + {0x00ff61, 0x00ff61, PG_U_OTHER_PUNCTUATION}, + {0x00ff62, 0x00ff62, PG_U_OPEN_PUNCTUATION}, + {0x00ff63, 0x00ff63, PG_U_CLOSE_PUNCTUATION}, + {0x00ff64, 0x00ff65, PG_U_OTHER_PUNCTUATION}, + {0x00ff66, 0x00ff6f, PG_U_OTHER_LETTER}, + {0x00ff70, 0x00ff70, PG_U_MODIFIER_LETTER}, + {0x00ff71, 0x00ff9d, PG_U_OTHER_LETTER}, + {0x00ff9e, 0x00ff9f, PG_U_MODIFIER_LETTER}, + {0x00ffa0, 0x00ffbe, PG_U_OTHER_LETTER}, + {0x00ffc2, 0x00ffc7, PG_U_OTHER_LETTER}, + {0x00ffca, 0x00ffcf, PG_U_OTHER_LETTER}, + {0x00ffd2, 0x00ffd7, PG_U_OTHER_LETTER}, + {0x00ffda, 0x00ffdc, PG_U_OTHER_LETTER}, + {0x00ffe0, 0x00ffe1, PG_U_CURRENCY_SYMBOL}, + {0x00ffe2, 0x00ffe2, PG_U_MATH_SYMBOL}, + {0x00ffe3, 0x00ffe3, PG_U_MODIFIER_SYMBOL}, + {0x00ffe4, 0x00ffe4, PG_U_OTHER_SYMBOL}, + {0x00ffe5, 0x00ffe6, PG_U_CURRENCY_SYMBOL}, + {0x00ffe8, 0x00ffe8, PG_U_OTHER_SYMBOL}, + {0x00ffe9, 0x00ffec, PG_U_MATH_SYMBOL}, + {0x00ffed, 0x00ffee, PG_U_OTHER_SYMBOL}, + {0x00fff9, 0x00fffb, PG_U_FORMAT}, + {0x00fffc, 0x00fffd, PG_U_OTHER_SYMBOL}, + {0x010000, 0x01000b, PG_U_OTHER_LETTER}, + {0x01000d, 0x010026, PG_U_OTHER_LETTER}, + {0x010028, 0x01003a, PG_U_OTHER_LETTER}, + {0x01003c, 0x01003d, PG_U_OTHER_LETTER}, + {0x01003f, 0x01004d, PG_U_OTHER_LETTER}, + {0x010050, 0x01005d, PG_U_OTHER_LETTER}, + {0x010080, 0x0100fa, PG_U_OTHER_LETTER}, + {0x010100, 0x010102, PG_U_OTHER_PUNCTUATION}, + {0x010107, 0x010133, PG_U_OTHER_NUMBER}, + {0x010137, 0x01013f, PG_U_OTHER_SYMBOL}, + {0x010140, 0x010174, PG_U_LETTER_NUMBER}, + {0x010175, 0x010178, PG_U_OTHER_NUMBER}, + {0x010179, 0x010189, PG_U_OTHER_SYMBOL}, + {0x01018a, 0x01018b, PG_U_OTHER_NUMBER}, + {0x01018c, 0x01018e, PG_U_OTHER_SYMBOL}, + {0x010190, 0x01019c, PG_U_OTHER_SYMBOL}, + {0x0101a0, 0x0101a0, PG_U_OTHER_SYMBOL}, + {0x0101d0, 0x0101fc, PG_U_OTHER_SYMBOL}, + {0x0101fd, 0x0101fd, PG_U_NONSPACING_MARK}, + {0x010280, 0x01029c, PG_U_OTHER_LETTER}, + {0x0102a0, 0x0102d0, PG_U_OTHER_LETTER}, + {0x0102e0, 0x0102e0, PG_U_NONSPACING_MARK}, + {0x0102e1, 0x0102fb, PG_U_OTHER_NUMBER}, + {0x010300, 0x01031f, PG_U_OTHER_LETTER}, + {0x010320, 0x010323, PG_U_OTHER_NUMBER}, + {0x01032d, 0x010340, PG_U_OTHER_LETTER}, + {0x010341, 0x010341, PG_U_LETTER_NUMBER}, + {0x010342, 0x010349, PG_U_OTHER_LETTER}, + {0x01034a, 0x01034a, PG_U_LETTER_NUMBER}, + {0x010350, 0x010375, PG_U_OTHER_LETTER}, + {0x010376, 0x01037a, PG_U_NONSPACING_MARK}, + {0x010380, 0x01039d, PG_U_OTHER_LETTER}, + {0x01039f, 0x01039f, PG_U_OTHER_PUNCTUATION}, + {0x0103a0, 0x0103c3, PG_U_OTHER_LETTER}, + {0x0103c8, 0x0103cf, PG_U_OTHER_LETTER}, + {0x0103d0, 0x0103d0, PG_U_OTHER_PUNCTUATION}, + {0x0103d1, 0x0103d5, PG_U_LETTER_NUMBER}, + {0x010400, 0x010427, PG_U_UPPERCASE_LETTER}, + {0x010428, 0x01044f, PG_U_LOWERCASE_LETTER}, + {0x010450, 0x01049d, PG_U_OTHER_LETTER}, + {0x0104a0, 0x0104a9, PG_U_DECIMAL_NUMBER}, + {0x0104b0, 0x0104d3, PG_U_UPPERCASE_LETTER}, + {0x0104d8, 0x0104fb, PG_U_LOWERCASE_LETTER}, + {0x010500, 0x010527, PG_U_OTHER_LETTER}, + {0x010530, 0x010563, PG_U_OTHER_LETTER}, + {0x01056f, 0x01056f, PG_U_OTHER_PUNCTUATION}, + {0x010570, 0x01057a, PG_U_UPPERCASE_LETTER}, + {0x01057c, 0x01058a, PG_U_UPPERCASE_LETTER}, + {0x01058c, 0x010592, PG_U_UPPERCASE_LETTER}, + {0x010594, 0x010595, PG_U_UPPERCASE_LETTER}, + {0x010597, 0x0105a1, PG_U_LOWERCASE_LETTER}, + {0x0105a3, 0x0105b1, PG_U_LOWERCASE_LETTER}, + {0x0105b3, 0x0105b9, PG_U_LOWERCASE_LETTER}, + {0x0105bb, 0x0105bc, PG_U_LOWERCASE_LETTER}, + {0x010600, 0x010736, PG_U_OTHER_LETTER}, + {0x010740, 0x010755, PG_U_OTHER_LETTER}, + {0x010760, 0x010767, PG_U_OTHER_LETTER}, + {0x010780, 0x010785, PG_U_MODIFIER_LETTER}, + {0x010787, 0x0107b0, PG_U_MODIFIER_LETTER}, + {0x0107b2, 0x0107ba, PG_U_MODIFIER_LETTER}, + {0x010800, 0x010805, PG_U_OTHER_LETTER}, + {0x010808, 0x010808, PG_U_OTHER_LETTER}, + {0x01080a, 0x010835, PG_U_OTHER_LETTER}, + {0x010837, 0x010838, PG_U_OTHER_LETTER}, + {0x01083c, 0x01083c, PG_U_OTHER_LETTER}, + {0x01083f, 0x010855, PG_U_OTHER_LETTER}, + {0x010857, 0x010857, PG_U_OTHER_PUNCTUATION}, + {0x010858, 0x01085f, PG_U_OTHER_NUMBER}, + {0x010860, 0x010876, PG_U_OTHER_LETTER}, + {0x010877, 0x010878, PG_U_OTHER_SYMBOL}, + {0x010879, 0x01087f, PG_U_OTHER_NUMBER}, + {0x010880, 0x01089e, PG_U_OTHER_LETTER}, + {0x0108a7, 0x0108af, PG_U_OTHER_NUMBER}, + {0x0108e0, 0x0108f2, PG_U_OTHER_LETTER}, + {0x0108f4, 0x0108f5, PG_U_OTHER_LETTER}, + {0x0108fb, 0x0108ff, PG_U_OTHER_NUMBER}, + {0x010900, 0x010915, PG_U_OTHER_LETTER}, + {0x010916, 0x01091b, PG_U_OTHER_NUMBER}, + {0x01091f, 0x01091f, PG_U_OTHER_PUNCTUATION}, + {0x010920, 0x010939, PG_U_OTHER_LETTER}, + {0x01093f, 0x01093f, PG_U_OTHER_PUNCTUATION}, + {0x010980, 0x0109b7, PG_U_OTHER_LETTER}, + {0x0109bc, 0x0109bd, PG_U_OTHER_NUMBER}, + {0x0109be, 0x0109bf, PG_U_OTHER_LETTER}, + {0x0109c0, 0x0109cf, PG_U_OTHER_NUMBER}, + {0x0109d2, 0x0109ff, PG_U_OTHER_NUMBER}, + {0x010a00, 0x010a00, PG_U_OTHER_LETTER}, + {0x010a01, 0x010a03, PG_U_NONSPACING_MARK}, + {0x010a05, 0x010a06, PG_U_NONSPACING_MARK}, + {0x010a0c, 0x010a0f, PG_U_NONSPACING_MARK}, + {0x010a10, 0x010a13, PG_U_OTHER_LETTER}, + {0x010a15, 0x010a17, PG_U_OTHER_LETTER}, + {0x010a19, 0x010a35, PG_U_OTHER_LETTER}, + {0x010a38, 0x010a3a, PG_U_NONSPACING_MARK}, + {0x010a3f, 0x010a3f, PG_U_NONSPACING_MARK}, + {0x010a40, 0x010a48, PG_U_OTHER_NUMBER}, + {0x010a50, 0x010a58, PG_U_OTHER_PUNCTUATION}, + {0x010a60, 0x010a7c, PG_U_OTHER_LETTER}, + {0x010a7d, 0x010a7e, PG_U_OTHER_NUMBER}, + {0x010a7f, 0x010a7f, PG_U_OTHER_PUNCTUATION}, + {0x010a80, 0x010a9c, PG_U_OTHER_LETTER}, + {0x010a9d, 0x010a9f, PG_U_OTHER_NUMBER}, + {0x010ac0, 0x010ac7, PG_U_OTHER_LETTER}, + {0x010ac8, 0x010ac8, PG_U_OTHER_SYMBOL}, + {0x010ac9, 0x010ae4, PG_U_OTHER_LETTER}, + {0x010ae5, 0x010ae6, PG_U_NONSPACING_MARK}, + {0x010aeb, 0x010aef, PG_U_OTHER_NUMBER}, + {0x010af0, 0x010af6, PG_U_OTHER_PUNCTUATION}, + {0x010b00, 0x010b35, PG_U_OTHER_LETTER}, + {0x010b39, 0x010b3f, PG_U_OTHER_PUNCTUATION}, + {0x010b40, 0x010b55, PG_U_OTHER_LETTER}, + {0x010b58, 0x010b5f, PG_U_OTHER_NUMBER}, + {0x010b60, 0x010b72, PG_U_OTHER_LETTER}, + {0x010b78, 0x010b7f, PG_U_OTHER_NUMBER}, + {0x010b80, 0x010b91, PG_U_OTHER_LETTER}, + {0x010b99, 0x010b9c, PG_U_OTHER_PUNCTUATION}, + {0x010ba9, 0x010baf, PG_U_OTHER_NUMBER}, + {0x010c00, 0x010c48, PG_U_OTHER_LETTER}, + {0x010c80, 0x010cb2, PG_U_UPPERCASE_LETTER}, + {0x010cc0, 0x010cf2, PG_U_LOWERCASE_LETTER}, + {0x010cfa, 0x010cff, PG_U_OTHER_NUMBER}, + {0x010d00, 0x010d23, PG_U_OTHER_LETTER}, + {0x010d24, 0x010d27, PG_U_NONSPACING_MARK}, + {0x010d30, 0x010d39, PG_U_DECIMAL_NUMBER}, + {0x010e60, 0x010e7e, PG_U_OTHER_NUMBER}, + {0x010e80, 0x010ea9, PG_U_OTHER_LETTER}, + {0x010eab, 0x010eac, PG_U_NONSPACING_MARK}, + {0x010ead, 0x010ead, PG_U_DASH_PUNCTUATION}, + {0x010eb0, 0x010eb1, PG_U_OTHER_LETTER}, + {0x010efd, 0x010eff, PG_U_NONSPACING_MARK}, + {0x010f00, 0x010f1c, PG_U_OTHER_LETTER}, + {0x010f1d, 0x010f26, PG_U_OTHER_NUMBER}, + {0x010f27, 0x010f27, PG_U_OTHER_LETTER}, + {0x010f30, 0x010f45, PG_U_OTHER_LETTER}, + {0x010f46, 0x010f50, PG_U_NONSPACING_MARK}, + {0x010f51, 0x010f54, PG_U_OTHER_NUMBER}, + {0x010f55, 0x010f59, PG_U_OTHER_PUNCTUATION}, + {0x010f70, 0x010f81, PG_U_OTHER_LETTER}, + {0x010f82, 0x010f85, PG_U_NONSPACING_MARK}, + {0x010f86, 0x010f89, PG_U_OTHER_PUNCTUATION}, + {0x010fb0, 0x010fc4, PG_U_OTHER_LETTER}, + {0x010fc5, 0x010fcb, PG_U_OTHER_NUMBER}, + {0x010fe0, 0x010ff6, PG_U_OTHER_LETTER}, + {0x011000, 0x011000, PG_U_SPACING_MARK}, + {0x011001, 0x011001, PG_U_NONSPACING_MARK}, + {0x011002, 0x011002, PG_U_SPACING_MARK}, + {0x011003, 0x011037, PG_U_OTHER_LETTER}, + {0x011038, 0x011046, PG_U_NONSPACING_MARK}, + {0x011047, 0x01104d, PG_U_OTHER_PUNCTUATION}, + {0x011052, 0x011065, PG_U_OTHER_NUMBER}, + {0x011066, 0x01106f, PG_U_DECIMAL_NUMBER}, + {0x011070, 0x011070, PG_U_NONSPACING_MARK}, + {0x011071, 0x011072, PG_U_OTHER_LETTER}, + {0x011073, 0x011074, PG_U_NONSPACING_MARK}, + {0x011075, 0x011075, PG_U_OTHER_LETTER}, + {0x01107f, 0x011081, PG_U_NONSPACING_MARK}, + {0x011082, 0x011082, PG_U_SPACING_MARK}, + {0x011083, 0x0110af, PG_U_OTHER_LETTER}, + {0x0110b0, 0x0110b2, PG_U_SPACING_MARK}, + {0x0110b3, 0x0110b6, PG_U_NONSPACING_MARK}, + {0x0110b7, 0x0110b8, PG_U_SPACING_MARK}, + {0x0110b9, 0x0110ba, PG_U_NONSPACING_MARK}, + {0x0110bb, 0x0110bc, PG_U_OTHER_PUNCTUATION}, + {0x0110bd, 0x0110bd, PG_U_FORMAT}, + {0x0110be, 0x0110c1, PG_U_OTHER_PUNCTUATION}, + {0x0110c2, 0x0110c2, PG_U_NONSPACING_MARK}, + {0x0110cd, 0x0110cd, PG_U_FORMAT}, + {0x0110d0, 0x0110e8, PG_U_OTHER_LETTER}, + {0x0110f0, 0x0110f9, PG_U_DECIMAL_NUMBER}, + {0x011100, 0x011102, PG_U_NONSPACING_MARK}, + {0x011103, 0x011126, PG_U_OTHER_LETTER}, + {0x011127, 0x01112b, PG_U_NONSPACING_MARK}, + {0x01112c, 0x01112c, PG_U_SPACING_MARK}, + {0x01112d, 0x011134, PG_U_NONSPACING_MARK}, + {0x011136, 0x01113f, PG_U_DECIMAL_NUMBER}, + {0x011140, 0x011143, PG_U_OTHER_PUNCTUATION}, + {0x011144, 0x011144, PG_U_OTHER_LETTER}, + {0x011145, 0x011146, PG_U_SPACING_MARK}, + {0x011147, 0x011147, PG_U_OTHER_LETTER}, + {0x011150, 0x011172, PG_U_OTHER_LETTER}, + {0x011173, 0x011173, PG_U_NONSPACING_MARK}, + {0x011174, 0x011175, PG_U_OTHER_PUNCTUATION}, + {0x011176, 0x011176, PG_U_OTHER_LETTER}, + {0x011180, 0x011181, PG_U_NONSPACING_MARK}, + {0x011182, 0x011182, PG_U_SPACING_MARK}, + {0x011183, 0x0111b2, PG_U_OTHER_LETTER}, + {0x0111b3, 0x0111b5, PG_U_SPACING_MARK}, + {0x0111b6, 0x0111be, PG_U_NONSPACING_MARK}, + {0x0111bf, 0x0111c0, PG_U_SPACING_MARK}, + {0x0111c1, 0x0111c4, PG_U_OTHER_LETTER}, + {0x0111c5, 0x0111c8, PG_U_OTHER_PUNCTUATION}, + {0x0111c9, 0x0111cc, PG_U_NONSPACING_MARK}, + {0x0111cd, 0x0111cd, PG_U_OTHER_PUNCTUATION}, + {0x0111ce, 0x0111ce, PG_U_SPACING_MARK}, + {0x0111cf, 0x0111cf, PG_U_NONSPACING_MARK}, + {0x0111d0, 0x0111d9, PG_U_DECIMAL_NUMBER}, + {0x0111da, 0x0111da, PG_U_OTHER_LETTER}, + {0x0111db, 0x0111db, PG_U_OTHER_PUNCTUATION}, + {0x0111dc, 0x0111dc, PG_U_OTHER_LETTER}, + {0x0111dd, 0x0111df, PG_U_OTHER_PUNCTUATION}, + {0x0111e1, 0x0111f4, PG_U_OTHER_NUMBER}, + {0x011200, 0x011211, PG_U_OTHER_LETTER}, + {0x011213, 0x01122b, PG_U_OTHER_LETTER}, + {0x01122c, 0x01122e, PG_U_SPACING_MARK}, + {0x01122f, 0x011231, PG_U_NONSPACING_MARK}, + {0x011232, 0x011233, PG_U_SPACING_MARK}, + {0x011234, 0x011234, PG_U_NONSPACING_MARK}, + {0x011235, 0x011235, PG_U_SPACING_MARK}, + {0x011236, 0x011237, PG_U_NONSPACING_MARK}, + {0x011238, 0x01123d, PG_U_OTHER_PUNCTUATION}, + {0x01123e, 0x01123e, PG_U_NONSPACING_MARK}, + {0x01123f, 0x011240, PG_U_OTHER_LETTER}, + {0x011241, 0x011241, PG_U_NONSPACING_MARK}, + {0x011280, 0x011286, PG_U_OTHER_LETTER}, + {0x011288, 0x011288, PG_U_OTHER_LETTER}, + {0x01128a, 0x01128d, PG_U_OTHER_LETTER}, + {0x01128f, 0x01129d, PG_U_OTHER_LETTER}, + {0x01129f, 0x0112a8, PG_U_OTHER_LETTER}, + {0x0112a9, 0x0112a9, PG_U_OTHER_PUNCTUATION}, + {0x0112b0, 0x0112de, PG_U_OTHER_LETTER}, + {0x0112df, 0x0112df, PG_U_NONSPACING_MARK}, + {0x0112e0, 0x0112e2, PG_U_SPACING_MARK}, + {0x0112e3, 0x0112ea, PG_U_NONSPACING_MARK}, + {0x0112f0, 0x0112f9, PG_U_DECIMAL_NUMBER}, + {0x011300, 0x011301, PG_U_NONSPACING_MARK}, + {0x011302, 0x011303, PG_U_SPACING_MARK}, + {0x011305, 0x01130c, PG_U_OTHER_LETTER}, + {0x01130f, 0x011310, PG_U_OTHER_LETTER}, + {0x011313, 0x011328, PG_U_OTHER_LETTER}, + {0x01132a, 0x011330, PG_U_OTHER_LETTER}, + {0x011332, 0x011333, PG_U_OTHER_LETTER}, + {0x011335, 0x011339, PG_U_OTHER_LETTER}, + {0x01133b, 0x01133c, PG_U_NONSPACING_MARK}, + {0x01133d, 0x01133d, PG_U_OTHER_LETTER}, + {0x01133e, 0x01133f, PG_U_SPACING_MARK}, + {0x011340, 0x011340, PG_U_NONSPACING_MARK}, + {0x011341, 0x011344, PG_U_SPACING_MARK}, + {0x011347, 0x011348, PG_U_SPACING_MARK}, + {0x01134b, 0x01134d, PG_U_SPACING_MARK}, + {0x011350, 0x011350, PG_U_OTHER_LETTER}, + {0x011357, 0x011357, PG_U_SPACING_MARK}, + {0x01135d, 0x011361, PG_U_OTHER_LETTER}, + {0x011362, 0x011363, PG_U_SPACING_MARK}, + {0x011366, 0x01136c, PG_U_NONSPACING_MARK}, + {0x011370, 0x011374, PG_U_NONSPACING_MARK}, + {0x011400, 0x011434, PG_U_OTHER_LETTER}, + {0x011435, 0x011437, PG_U_SPACING_MARK}, + {0x011438, 0x01143f, PG_U_NONSPACING_MARK}, + {0x011440, 0x011441, PG_U_SPACING_MARK}, + {0x011442, 0x011444, PG_U_NONSPACING_MARK}, + {0x011445, 0x011445, PG_U_SPACING_MARK}, + {0x011446, 0x011446, PG_U_NONSPACING_MARK}, + {0x011447, 0x01144a, PG_U_OTHER_LETTER}, + {0x01144b, 0x01144f, PG_U_OTHER_PUNCTUATION}, + {0x011450, 0x011459, PG_U_DECIMAL_NUMBER}, + {0x01145a, 0x01145b, PG_U_OTHER_PUNCTUATION}, + {0x01145d, 0x01145d, PG_U_OTHER_PUNCTUATION}, + {0x01145e, 0x01145e, PG_U_NONSPACING_MARK}, + {0x01145f, 0x011461, PG_U_OTHER_LETTER}, + {0x011480, 0x0114af, PG_U_OTHER_LETTER}, + {0x0114b0, 0x0114b2, PG_U_SPACING_MARK}, + {0x0114b3, 0x0114b8, PG_U_NONSPACING_MARK}, + {0x0114b9, 0x0114b9, PG_U_SPACING_MARK}, + {0x0114ba, 0x0114ba, PG_U_NONSPACING_MARK}, + {0x0114bb, 0x0114be, PG_U_SPACING_MARK}, + {0x0114bf, 0x0114c0, PG_U_NONSPACING_MARK}, + {0x0114c1, 0x0114c1, PG_U_SPACING_MARK}, + {0x0114c2, 0x0114c3, PG_U_NONSPACING_MARK}, + {0x0114c4, 0x0114c5, PG_U_OTHER_LETTER}, + {0x0114c6, 0x0114c6, PG_U_OTHER_PUNCTUATION}, + {0x0114c7, 0x0114c7, PG_U_OTHER_LETTER}, + {0x0114d0, 0x0114d9, PG_U_DECIMAL_NUMBER}, + {0x011580, 0x0115ae, PG_U_OTHER_LETTER}, + {0x0115af, 0x0115b1, PG_U_SPACING_MARK}, + {0x0115b2, 0x0115b5, PG_U_NONSPACING_MARK}, + {0x0115b8, 0x0115bb, PG_U_SPACING_MARK}, + {0x0115bc, 0x0115bd, PG_U_NONSPACING_MARK}, + {0x0115be, 0x0115be, PG_U_SPACING_MARK}, + {0x0115bf, 0x0115c0, PG_U_NONSPACING_MARK}, + {0x0115c1, 0x0115d7, PG_U_OTHER_PUNCTUATION}, + {0x0115d8, 0x0115db, PG_U_OTHER_LETTER}, + {0x0115dc, 0x0115dd, PG_U_NONSPACING_MARK}, + {0x011600, 0x01162f, PG_U_OTHER_LETTER}, + {0x011630, 0x011632, PG_U_SPACING_MARK}, + {0x011633, 0x01163a, PG_U_NONSPACING_MARK}, + {0x01163b, 0x01163c, PG_U_SPACING_MARK}, + {0x01163d, 0x01163d, PG_U_NONSPACING_MARK}, + {0x01163e, 0x01163e, PG_U_SPACING_MARK}, + {0x01163f, 0x011640, PG_U_NONSPACING_MARK}, + {0x011641, 0x011643, PG_U_OTHER_PUNCTUATION}, + {0x011644, 0x011644, PG_U_OTHER_LETTER}, + {0x011650, 0x011659, PG_U_DECIMAL_NUMBER}, + {0x011660, 0x01166c, PG_U_OTHER_PUNCTUATION}, + {0x011680, 0x0116aa, PG_U_OTHER_LETTER}, + {0x0116ab, 0x0116ab, PG_U_NONSPACING_MARK}, + {0x0116ac, 0x0116ac, PG_U_SPACING_MARK}, + {0x0116ad, 0x0116ad, PG_U_NONSPACING_MARK}, + {0x0116ae, 0x0116af, PG_U_SPACING_MARK}, + {0x0116b0, 0x0116b5, PG_U_NONSPACING_MARK}, + {0x0116b6, 0x0116b6, PG_U_SPACING_MARK}, + {0x0116b7, 0x0116b7, PG_U_NONSPACING_MARK}, + {0x0116b8, 0x0116b8, PG_U_OTHER_LETTER}, + {0x0116b9, 0x0116b9, PG_U_OTHER_PUNCTUATION}, + {0x0116c0, 0x0116c9, PG_U_DECIMAL_NUMBER}, + {0x011700, 0x01171a, PG_U_OTHER_LETTER}, + {0x01171d, 0x01171f, PG_U_NONSPACING_MARK}, + {0x011720, 0x011721, PG_U_SPACING_MARK}, + {0x011722, 0x011725, PG_U_NONSPACING_MARK}, + {0x011726, 0x011726, PG_U_SPACING_MARK}, + {0x011727, 0x01172b, PG_U_NONSPACING_MARK}, + {0x011730, 0x011739, PG_U_DECIMAL_NUMBER}, + {0x01173a, 0x01173b, PG_U_OTHER_NUMBER}, + {0x01173c, 0x01173e, PG_U_OTHER_PUNCTUATION}, + {0x01173f, 0x01173f, PG_U_OTHER_SYMBOL}, + {0x011740, 0x011746, PG_U_OTHER_LETTER}, + {0x011800, 0x01182b, PG_U_OTHER_LETTER}, + {0x01182c, 0x01182e, PG_U_SPACING_MARK}, + {0x01182f, 0x011837, PG_U_NONSPACING_MARK}, + {0x011838, 0x011838, PG_U_SPACING_MARK}, + {0x011839, 0x01183a, PG_U_NONSPACING_MARK}, + {0x01183b, 0x01183b, PG_U_OTHER_PUNCTUATION}, + {0x0118a0, 0x0118bf, PG_U_UPPERCASE_LETTER}, + {0x0118c0, 0x0118df, PG_U_LOWERCASE_LETTER}, + {0x0118e0, 0x0118e9, PG_U_DECIMAL_NUMBER}, + {0x0118ea, 0x0118f2, PG_U_OTHER_NUMBER}, + {0x0118ff, 0x011906, PG_U_OTHER_LETTER}, + {0x011909, 0x011909, PG_U_OTHER_LETTER}, + {0x01190c, 0x011913, PG_U_OTHER_LETTER}, + {0x011915, 0x011916, PG_U_OTHER_LETTER}, + {0x011918, 0x01192f, PG_U_OTHER_LETTER}, + {0x011930, 0x011935, PG_U_SPACING_MARK}, + {0x011937, 0x011938, PG_U_SPACING_MARK}, + {0x01193b, 0x01193c, PG_U_NONSPACING_MARK}, + {0x01193d, 0x01193d, PG_U_SPACING_MARK}, + {0x01193e, 0x01193e, PG_U_NONSPACING_MARK}, + {0x01193f, 0x01193f, PG_U_OTHER_LETTER}, + {0x011940, 0x011940, PG_U_SPACING_MARK}, + {0x011941, 0x011941, PG_U_OTHER_LETTER}, + {0x011942, 0x011942, PG_U_SPACING_MARK}, + {0x011943, 0x011943, PG_U_NONSPACING_MARK}, + {0x011944, 0x011946, PG_U_OTHER_PUNCTUATION}, + {0x011950, 0x011959, PG_U_DECIMAL_NUMBER}, + {0x0119a0, 0x0119a7, PG_U_OTHER_LETTER}, + {0x0119aa, 0x0119d0, PG_U_OTHER_LETTER}, + {0x0119d1, 0x0119d3, PG_U_SPACING_MARK}, + {0x0119d4, 0x0119d7, PG_U_NONSPACING_MARK}, + {0x0119da, 0x0119db, PG_U_NONSPACING_MARK}, + {0x0119dc, 0x0119df, PG_U_SPACING_MARK}, + {0x0119e0, 0x0119e0, PG_U_NONSPACING_MARK}, + {0x0119e1, 0x0119e1, PG_U_OTHER_LETTER}, + {0x0119e2, 0x0119e2, PG_U_OTHER_PUNCTUATION}, + {0x0119e3, 0x0119e3, PG_U_OTHER_LETTER}, + {0x0119e4, 0x0119e4, PG_U_SPACING_MARK}, + {0x011a00, 0x011a00, PG_U_OTHER_LETTER}, + {0x011a01, 0x011a0a, PG_U_NONSPACING_MARK}, + {0x011a0b, 0x011a32, PG_U_OTHER_LETTER}, + {0x011a33, 0x011a38, PG_U_NONSPACING_MARK}, + {0x011a39, 0x011a39, PG_U_SPACING_MARK}, + {0x011a3a, 0x011a3a, PG_U_OTHER_LETTER}, + {0x011a3b, 0x011a3e, PG_U_NONSPACING_MARK}, + {0x011a3f, 0x011a46, PG_U_OTHER_PUNCTUATION}, + {0x011a47, 0x011a47, PG_U_NONSPACING_MARK}, + {0x011a50, 0x011a50, PG_U_OTHER_LETTER}, + {0x011a51, 0x011a56, PG_U_NONSPACING_MARK}, + {0x011a57, 0x011a58, PG_U_SPACING_MARK}, + {0x011a59, 0x011a5b, PG_U_NONSPACING_MARK}, + {0x011a5c, 0x011a89, PG_U_OTHER_LETTER}, + {0x011a8a, 0x011a96, PG_U_NONSPACING_MARK}, + {0x011a97, 0x011a97, PG_U_SPACING_MARK}, + {0x011a98, 0x011a99, PG_U_NONSPACING_MARK}, + {0x011a9a, 0x011a9c, PG_U_OTHER_PUNCTUATION}, + {0x011a9d, 0x011a9d, PG_U_OTHER_LETTER}, + {0x011a9e, 0x011aa2, PG_U_OTHER_PUNCTUATION}, + {0x011ab0, 0x011af8, PG_U_OTHER_LETTER}, + {0x011b00, 0x011b09, PG_U_OTHER_PUNCTUATION}, + {0x011c00, 0x011c08, PG_U_OTHER_LETTER}, + {0x011c0a, 0x011c2e, PG_U_OTHER_LETTER}, + {0x011c2f, 0x011c2f, PG_U_SPACING_MARK}, + {0x011c30, 0x011c36, PG_U_NONSPACING_MARK}, + {0x011c38, 0x011c3d, PG_U_NONSPACING_MARK}, + {0x011c3e, 0x011c3e, PG_U_SPACING_MARK}, + {0x011c3f, 0x011c3f, PG_U_NONSPACING_MARK}, + {0x011c40, 0x011c40, PG_U_OTHER_LETTER}, + {0x011c41, 0x011c45, PG_U_OTHER_PUNCTUATION}, + {0x011c50, 0x011c59, PG_U_DECIMAL_NUMBER}, + {0x011c5a, 0x011c6c, PG_U_OTHER_NUMBER}, + {0x011c70, 0x011c71, PG_U_OTHER_PUNCTUATION}, + {0x011c72, 0x011c8f, PG_U_OTHER_LETTER}, + {0x011c92, 0x011ca7, PG_U_NONSPACING_MARK}, + {0x011ca9, 0x011ca9, PG_U_SPACING_MARK}, + {0x011caa, 0x011cb0, PG_U_NONSPACING_MARK}, + {0x011cb1, 0x011cb1, PG_U_SPACING_MARK}, + {0x011cb2, 0x011cb3, PG_U_NONSPACING_MARK}, + {0x011cb4, 0x011cb4, PG_U_SPACING_MARK}, + {0x011cb5, 0x011cb6, PG_U_NONSPACING_MARK}, + {0x011d00, 0x011d06, PG_U_OTHER_LETTER}, + {0x011d08, 0x011d09, PG_U_OTHER_LETTER}, + {0x011d0b, 0x011d30, PG_U_OTHER_LETTER}, + {0x011d31, 0x011d36, PG_U_NONSPACING_MARK}, + {0x011d3a, 0x011d3a, PG_U_NONSPACING_MARK}, + {0x011d3c, 0x011d3d, PG_U_NONSPACING_MARK}, + {0x011d3f, 0x011d45, PG_U_NONSPACING_MARK}, + {0x011d46, 0x011d46, PG_U_OTHER_LETTER}, + {0x011d47, 0x011d47, PG_U_NONSPACING_MARK}, + {0x011d50, 0x011d59, PG_U_DECIMAL_NUMBER}, + {0x011d60, 0x011d65, PG_U_OTHER_LETTER}, + {0x011d67, 0x011d68, PG_U_OTHER_LETTER}, + {0x011d6a, 0x011d89, PG_U_OTHER_LETTER}, + {0x011d8a, 0x011d8e, PG_U_SPACING_MARK}, + {0x011d90, 0x011d91, PG_U_NONSPACING_MARK}, + {0x011d93, 0x011d94, PG_U_SPACING_MARK}, + {0x011d95, 0x011d95, PG_U_NONSPACING_MARK}, + {0x011d96, 0x011d96, PG_U_SPACING_MARK}, + {0x011d97, 0x011d97, PG_U_NONSPACING_MARK}, + {0x011d98, 0x011d98, PG_U_OTHER_LETTER}, + {0x011da0, 0x011da9, PG_U_DECIMAL_NUMBER}, + {0x011ee0, 0x011ef2, PG_U_OTHER_LETTER}, + {0x011ef3, 0x011ef4, PG_U_NONSPACING_MARK}, + {0x011ef5, 0x011ef6, PG_U_SPACING_MARK}, + {0x011ef7, 0x011ef8, PG_U_OTHER_PUNCTUATION}, + {0x011f00, 0x011f01, PG_U_NONSPACING_MARK}, + {0x011f02, 0x011f02, PG_U_OTHER_LETTER}, + {0x011f03, 0x011f03, PG_U_SPACING_MARK}, + {0x011f04, 0x011f10, PG_U_OTHER_LETTER}, + {0x011f12, 0x011f33, PG_U_OTHER_LETTER}, + {0x011f34, 0x011f35, PG_U_SPACING_MARK}, + {0x011f36, 0x011f3a, PG_U_NONSPACING_MARK}, + {0x011f3e, 0x011f3f, PG_U_SPACING_MARK}, + {0x011f40, 0x011f40, PG_U_NONSPACING_MARK}, + {0x011f41, 0x011f41, PG_U_SPACING_MARK}, + {0x011f42, 0x011f42, PG_U_NONSPACING_MARK}, + {0x011f43, 0x011f4f, PG_U_OTHER_PUNCTUATION}, + {0x011f50, 0x011f59, PG_U_DECIMAL_NUMBER}, + {0x011fb0, 0x011fb0, PG_U_OTHER_LETTER}, + {0x011fc0, 0x011fd4, PG_U_OTHER_NUMBER}, + {0x011fd5, 0x011fdc, PG_U_OTHER_SYMBOL}, + {0x011fdd, 0x011fe0, PG_U_CURRENCY_SYMBOL}, + {0x011fe1, 0x011ff1, PG_U_OTHER_SYMBOL}, + {0x011fff, 0x011fff, PG_U_OTHER_PUNCTUATION}, + {0x012000, 0x012399, PG_U_OTHER_LETTER}, + {0x012400, 0x01246e, PG_U_LETTER_NUMBER}, + {0x012470, 0x012474, PG_U_OTHER_PUNCTUATION}, + {0x012480, 0x012543, PG_U_OTHER_LETTER}, + {0x012f90, 0x012ff0, PG_U_OTHER_LETTER}, + {0x012ff1, 0x012ff2, PG_U_OTHER_PUNCTUATION}, + {0x013000, 0x01342f, PG_U_OTHER_LETTER}, + {0x013430, 0x01343f, PG_U_FORMAT}, + {0x013440, 0x013440, PG_U_NONSPACING_MARK}, + {0x013441, 0x013446, PG_U_OTHER_LETTER}, + {0x013447, 0x013455, PG_U_NONSPACING_MARK}, + {0x014400, 0x014646, PG_U_OTHER_LETTER}, + {0x016800, 0x016a38, PG_U_OTHER_LETTER}, + {0x016a40, 0x016a5e, PG_U_OTHER_LETTER}, + {0x016a60, 0x016a69, PG_U_DECIMAL_NUMBER}, + {0x016a6e, 0x016a6f, PG_U_OTHER_PUNCTUATION}, + {0x016a70, 0x016abe, PG_U_OTHER_LETTER}, + {0x016ac0, 0x016ac9, PG_U_DECIMAL_NUMBER}, + {0x016ad0, 0x016aed, PG_U_OTHER_LETTER}, + {0x016af0, 0x016af4, PG_U_NONSPACING_MARK}, + {0x016af5, 0x016af5, PG_U_OTHER_PUNCTUATION}, + {0x016b00, 0x016b2f, PG_U_OTHER_LETTER}, + {0x016b30, 0x016b36, PG_U_NONSPACING_MARK}, + {0x016b37, 0x016b3b, PG_U_OTHER_PUNCTUATION}, + {0x016b3c, 0x016b3f, PG_U_OTHER_SYMBOL}, + {0x016b40, 0x016b43, PG_U_MODIFIER_LETTER}, + {0x016b44, 0x016b44, PG_U_OTHER_PUNCTUATION}, + {0x016b45, 0x016b45, PG_U_OTHER_SYMBOL}, + {0x016b50, 0x016b59, PG_U_DECIMAL_NUMBER}, + {0x016b5b, 0x016b61, PG_U_OTHER_NUMBER}, + {0x016b63, 0x016b77, PG_U_OTHER_LETTER}, + {0x016b7d, 0x016b8f, PG_U_OTHER_LETTER}, + {0x016e40, 0x016e5f, PG_U_UPPERCASE_LETTER}, + {0x016e60, 0x016e7f, PG_U_LOWERCASE_LETTER}, + {0x016e80, 0x016e96, PG_U_OTHER_NUMBER}, + {0x016e97, 0x016e9a, PG_U_OTHER_PUNCTUATION}, + {0x016f00, 0x016f4a, PG_U_OTHER_LETTER}, + {0x016f4f, 0x016f4f, PG_U_NONSPACING_MARK}, + {0x016f50, 0x016f50, PG_U_OTHER_LETTER}, + {0x016f51, 0x016f87, PG_U_SPACING_MARK}, + {0x016f8f, 0x016f92, PG_U_NONSPACING_MARK}, + {0x016f93, 0x016f9f, PG_U_MODIFIER_LETTER}, + {0x016fe0, 0x016fe1, PG_U_MODIFIER_LETTER}, + {0x016fe2, 0x016fe2, PG_U_OTHER_PUNCTUATION}, + {0x016fe3, 0x016fe3, PG_U_MODIFIER_LETTER}, + {0x016fe4, 0x016fe4, PG_U_NONSPACING_MARK}, + {0x016ff0, 0x016ff1, PG_U_SPACING_MARK}, + {0x017000, 0x0187f7, PG_U_OTHER_LETTER}, + {0x018800, 0x018cd5, PG_U_OTHER_LETTER}, + {0x018d00, 0x018d08, PG_U_OTHER_LETTER}, + {0x01aff0, 0x01aff3, PG_U_MODIFIER_LETTER}, + {0x01aff5, 0x01affb, PG_U_MODIFIER_LETTER}, + {0x01affd, 0x01affe, PG_U_MODIFIER_LETTER}, + {0x01b000, 0x01b122, PG_U_OTHER_LETTER}, + {0x01b132, 0x01b132, PG_U_OTHER_LETTER}, + {0x01b150, 0x01b152, PG_U_OTHER_LETTER}, + {0x01b155, 0x01b155, PG_U_OTHER_LETTER}, + {0x01b164, 0x01b167, PG_U_OTHER_LETTER}, + {0x01b170, 0x01b2fb, PG_U_OTHER_LETTER}, + {0x01bc00, 0x01bc6a, PG_U_OTHER_LETTER}, + {0x01bc70, 0x01bc7c, PG_U_OTHER_LETTER}, + {0x01bc80, 0x01bc88, PG_U_OTHER_LETTER}, + {0x01bc90, 0x01bc99, PG_U_OTHER_LETTER}, + {0x01bc9c, 0x01bc9c, PG_U_OTHER_SYMBOL}, + {0x01bc9d, 0x01bc9e, PG_U_NONSPACING_MARK}, + {0x01bc9f, 0x01bc9f, PG_U_OTHER_PUNCTUATION}, + {0x01bca0, 0x01bca3, PG_U_FORMAT}, + {0x01cf00, 0x01cf2d, PG_U_NONSPACING_MARK}, + {0x01cf30, 0x01cf46, PG_U_NONSPACING_MARK}, + {0x01cf50, 0x01cfc3, PG_U_OTHER_SYMBOL}, + {0x01d000, 0x01d0f5, PG_U_OTHER_SYMBOL}, + {0x01d100, 0x01d126, PG_U_OTHER_SYMBOL}, + {0x01d129, 0x01d164, PG_U_OTHER_SYMBOL}, + {0x01d165, 0x01d166, PG_U_SPACING_MARK}, + {0x01d167, 0x01d169, PG_U_NONSPACING_MARK}, + {0x01d16a, 0x01d16c, PG_U_OTHER_SYMBOL}, + {0x01d16d, 0x01d172, PG_U_SPACING_MARK}, + {0x01d173, 0x01d17a, PG_U_FORMAT}, + {0x01d17b, 0x01d182, PG_U_NONSPACING_MARK}, + {0x01d183, 0x01d184, PG_U_OTHER_SYMBOL}, + {0x01d185, 0x01d18b, PG_U_NONSPACING_MARK}, + {0x01d18c, 0x01d1a9, PG_U_OTHER_SYMBOL}, + {0x01d1aa, 0x01d1ad, PG_U_NONSPACING_MARK}, + {0x01d1ae, 0x01d1ea, PG_U_OTHER_SYMBOL}, + {0x01d200, 0x01d241, PG_U_OTHER_SYMBOL}, + {0x01d242, 0x01d244, PG_U_NONSPACING_MARK}, + {0x01d245, 0x01d245, PG_U_OTHER_SYMBOL}, + {0x01d2c0, 0x01d2d3, PG_U_OTHER_NUMBER}, + {0x01d2e0, 0x01d2f3, PG_U_OTHER_NUMBER}, + {0x01d300, 0x01d356, PG_U_OTHER_SYMBOL}, + {0x01d360, 0x01d378, PG_U_OTHER_NUMBER}, + {0x01d400, 0x01d419, PG_U_UPPERCASE_LETTER}, + {0x01d41a, 0x01d433, PG_U_LOWERCASE_LETTER}, + {0x01d434, 0x01d44d, PG_U_UPPERCASE_LETTER}, + {0x01d44e, 0x01d454, PG_U_LOWERCASE_LETTER}, + {0x01d456, 0x01d467, PG_U_LOWERCASE_LETTER}, + {0x01d468, 0x01d481, PG_U_UPPERCASE_LETTER}, + {0x01d482, 0x01d49b, PG_U_LOWERCASE_LETTER}, + {0x01d49c, 0x01d49c, PG_U_UPPERCASE_LETTER}, + {0x01d49e, 0x01d49f, PG_U_UPPERCASE_LETTER}, + {0x01d4a2, 0x01d4a2, PG_U_UPPERCASE_LETTER}, + {0x01d4a5, 0x01d4a6, PG_U_UPPERCASE_LETTER}, + {0x01d4a9, 0x01d4ac, PG_U_UPPERCASE_LETTER}, + {0x01d4ae, 0x01d4b5, PG_U_UPPERCASE_LETTER}, + {0x01d4b6, 0x01d4b9, PG_U_LOWERCASE_LETTER}, + {0x01d4bb, 0x01d4bb, PG_U_LOWERCASE_LETTER}, + {0x01d4bd, 0x01d4c3, PG_U_LOWERCASE_LETTER}, + {0x01d4c5, 0x01d4cf, PG_U_LOWERCASE_LETTER}, + {0x01d4d0, 0x01d4e9, PG_U_UPPERCASE_LETTER}, + {0x01d4ea, 0x01d503, PG_U_LOWERCASE_LETTER}, + {0x01d504, 0x01d505, PG_U_UPPERCASE_LETTER}, + {0x01d507, 0x01d50a, PG_U_UPPERCASE_LETTER}, + {0x01d50d, 0x01d514, PG_U_UPPERCASE_LETTER}, + {0x01d516, 0x01d51c, PG_U_UPPERCASE_LETTER}, + {0x01d51e, 0x01d537, PG_U_LOWERCASE_LETTER}, + {0x01d538, 0x01d539, PG_U_UPPERCASE_LETTER}, + {0x01d53b, 0x01d53e, PG_U_UPPERCASE_LETTER}, + {0x01d540, 0x01d544, PG_U_UPPERCASE_LETTER}, + {0x01d546, 0x01d546, PG_U_UPPERCASE_LETTER}, + {0x01d54a, 0x01d550, PG_U_UPPERCASE_LETTER}, + {0x01d552, 0x01d56b, PG_U_LOWERCASE_LETTER}, + {0x01d56c, 0x01d585, PG_U_UPPERCASE_LETTER}, + {0x01d586, 0x01d59f, PG_U_LOWERCASE_LETTER}, + {0x01d5a0, 0x01d5b9, PG_U_UPPERCASE_LETTER}, + {0x01d5ba, 0x01d5d3, PG_U_LOWERCASE_LETTER}, + {0x01d5d4, 0x01d5ed, PG_U_UPPERCASE_LETTER}, + {0x01d5ee, 0x01d607, PG_U_LOWERCASE_LETTER}, + {0x01d608, 0x01d621, PG_U_UPPERCASE_LETTER}, + {0x01d622, 0x01d63b, PG_U_LOWERCASE_LETTER}, + {0x01d63c, 0x01d655, PG_U_UPPERCASE_LETTER}, + {0x01d656, 0x01d66f, PG_U_LOWERCASE_LETTER}, + {0x01d670, 0x01d689, PG_U_UPPERCASE_LETTER}, + {0x01d68a, 0x01d6a5, PG_U_LOWERCASE_LETTER}, + {0x01d6a8, 0x01d6c0, PG_U_UPPERCASE_LETTER}, + {0x01d6c1, 0x01d6c1, PG_U_MATH_SYMBOL}, + {0x01d6c2, 0x01d6da, PG_U_LOWERCASE_LETTER}, + {0x01d6db, 0x01d6db, PG_U_MATH_SYMBOL}, + {0x01d6dc, 0x01d6e1, PG_U_LOWERCASE_LETTER}, + {0x01d6e2, 0x01d6fa, PG_U_UPPERCASE_LETTER}, + {0x01d6fb, 0x01d6fb, PG_U_MATH_SYMBOL}, + {0x01d6fc, 0x01d714, PG_U_LOWERCASE_LETTER}, + {0x01d715, 0x01d715, PG_U_MATH_SYMBOL}, + {0x01d716, 0x01d71b, PG_U_LOWERCASE_LETTER}, + {0x01d71c, 0x01d734, PG_U_UPPERCASE_LETTER}, + {0x01d735, 0x01d735, PG_U_MATH_SYMBOL}, + {0x01d736, 0x01d74e, PG_U_LOWERCASE_LETTER}, + {0x01d74f, 0x01d74f, PG_U_MATH_SYMBOL}, + {0x01d750, 0x01d755, PG_U_LOWERCASE_LETTER}, + {0x01d756, 0x01d76e, PG_U_UPPERCASE_LETTER}, + {0x01d76f, 0x01d76f, PG_U_MATH_SYMBOL}, + {0x01d770, 0x01d788, PG_U_LOWERCASE_LETTER}, + {0x01d789, 0x01d789, PG_U_MATH_SYMBOL}, + {0x01d78a, 0x01d78f, PG_U_LOWERCASE_LETTER}, + {0x01d790, 0x01d7a8, PG_U_UPPERCASE_LETTER}, + {0x01d7a9, 0x01d7a9, PG_U_MATH_SYMBOL}, + {0x01d7aa, 0x01d7c2, PG_U_LOWERCASE_LETTER}, + {0x01d7c3, 0x01d7c3, PG_U_MATH_SYMBOL}, + {0x01d7c4, 0x01d7c9, PG_U_LOWERCASE_LETTER}, + {0x01d7ca, 0x01d7ca, PG_U_UPPERCASE_LETTER}, + {0x01d7cb, 0x01d7cb, PG_U_LOWERCASE_LETTER}, + {0x01d7ce, 0x01d7ff, PG_U_DECIMAL_NUMBER}, + {0x01d800, 0x01d9ff, PG_U_OTHER_SYMBOL}, + {0x01da00, 0x01da36, PG_U_NONSPACING_MARK}, + {0x01da37, 0x01da3a, PG_U_OTHER_SYMBOL}, + {0x01da3b, 0x01da6c, PG_U_NONSPACING_MARK}, + {0x01da6d, 0x01da74, PG_U_OTHER_SYMBOL}, + {0x01da75, 0x01da75, PG_U_NONSPACING_MARK}, + {0x01da76, 0x01da83, PG_U_OTHER_SYMBOL}, + {0x01da84, 0x01da84, PG_U_NONSPACING_MARK}, + {0x01da85, 0x01da86, PG_U_OTHER_SYMBOL}, + {0x01da87, 0x01da8b, PG_U_OTHER_PUNCTUATION}, + {0x01da9b, 0x01da9f, PG_U_NONSPACING_MARK}, + {0x01daa1, 0x01daaf, PG_U_NONSPACING_MARK}, + {0x01df00, 0x01df09, PG_U_LOWERCASE_LETTER}, + {0x01df0a, 0x01df0a, PG_U_OTHER_LETTER}, + {0x01df0b, 0x01df1e, PG_U_LOWERCASE_LETTER}, + {0x01df25, 0x01df2a, PG_U_LOWERCASE_LETTER}, + {0x01e000, 0x01e006, PG_U_NONSPACING_MARK}, + {0x01e008, 0x01e018, PG_U_NONSPACING_MARK}, + {0x01e01b, 0x01e021, PG_U_NONSPACING_MARK}, + {0x01e023, 0x01e024, PG_U_NONSPACING_MARK}, + {0x01e026, 0x01e02a, PG_U_NONSPACING_MARK}, + {0x01e030, 0x01e06d, PG_U_MODIFIER_LETTER}, + {0x01e08f, 0x01e08f, PG_U_NONSPACING_MARK}, + {0x01e100, 0x01e12c, PG_U_OTHER_LETTER}, + {0x01e130, 0x01e136, PG_U_NONSPACING_MARK}, + {0x01e137, 0x01e13d, PG_U_MODIFIER_LETTER}, + {0x01e140, 0x01e149, PG_U_DECIMAL_NUMBER}, + {0x01e14e, 0x01e14e, PG_U_OTHER_LETTER}, + {0x01e14f, 0x01e14f, PG_U_OTHER_SYMBOL}, + {0x01e290, 0x01e2ad, PG_U_OTHER_LETTER}, + {0x01e2ae, 0x01e2ae, PG_U_NONSPACING_MARK}, + {0x01e2c0, 0x01e2eb, PG_U_OTHER_LETTER}, + {0x01e2ec, 0x01e2ef, PG_U_NONSPACING_MARK}, + {0x01e2f0, 0x01e2f9, PG_U_DECIMAL_NUMBER}, + {0x01e2ff, 0x01e2ff, PG_U_CURRENCY_SYMBOL}, + {0x01e4d0, 0x01e4ea, PG_U_OTHER_LETTER}, + {0x01e4eb, 0x01e4eb, PG_U_MODIFIER_LETTER}, + {0x01e4ec, 0x01e4ef, PG_U_NONSPACING_MARK}, + {0x01e4f0, 0x01e4f9, PG_U_DECIMAL_NUMBER}, + {0x01e7e0, 0x01e7e6, PG_U_OTHER_LETTER}, + {0x01e7e8, 0x01e7eb, PG_U_OTHER_LETTER}, + {0x01e7ed, 0x01e7ee, PG_U_OTHER_LETTER}, + {0x01e7f0, 0x01e7fe, PG_U_OTHER_LETTER}, + {0x01e800, 0x01e8c4, PG_U_OTHER_LETTER}, + {0x01e8c7, 0x01e8cf, PG_U_OTHER_NUMBER}, + {0x01e8d0, 0x01e8d6, PG_U_NONSPACING_MARK}, + {0x01e900, 0x01e921, PG_U_UPPERCASE_LETTER}, + {0x01e922, 0x01e943, PG_U_LOWERCASE_LETTER}, + {0x01e944, 0x01e94a, PG_U_NONSPACING_MARK}, + {0x01e94b, 0x01e94b, PG_U_MODIFIER_LETTER}, + {0x01e950, 0x01e959, PG_U_DECIMAL_NUMBER}, + {0x01e95e, 0x01e95f, PG_U_OTHER_PUNCTUATION}, + {0x01ec71, 0x01ecab, PG_U_OTHER_NUMBER}, + {0x01ecac, 0x01ecac, PG_U_OTHER_SYMBOL}, + {0x01ecad, 0x01ecaf, PG_U_OTHER_NUMBER}, + {0x01ecb0, 0x01ecb0, PG_U_CURRENCY_SYMBOL}, + {0x01ecb1, 0x01ecb4, PG_U_OTHER_NUMBER}, + {0x01ed01, 0x01ed2d, PG_U_OTHER_NUMBER}, + {0x01ed2e, 0x01ed2e, PG_U_OTHER_SYMBOL}, + {0x01ed2f, 0x01ed3d, PG_U_OTHER_NUMBER}, + {0x01ee00, 0x01ee03, PG_U_OTHER_LETTER}, + {0x01ee05, 0x01ee1f, PG_U_OTHER_LETTER}, + {0x01ee21, 0x01ee22, PG_U_OTHER_LETTER}, + {0x01ee24, 0x01ee24, PG_U_OTHER_LETTER}, + {0x01ee27, 0x01ee27, PG_U_OTHER_LETTER}, + {0x01ee29, 0x01ee32, PG_U_OTHER_LETTER}, + {0x01ee34, 0x01ee37, PG_U_OTHER_LETTER}, + {0x01ee39, 0x01ee39, PG_U_OTHER_LETTER}, + {0x01ee3b, 0x01ee3b, PG_U_OTHER_LETTER}, + {0x01ee42, 0x01ee42, PG_U_OTHER_LETTER}, + {0x01ee47, 0x01ee47, PG_U_OTHER_LETTER}, + {0x01ee49, 0x01ee49, PG_U_OTHER_LETTER}, + {0x01ee4b, 0x01ee4b, PG_U_OTHER_LETTER}, + {0x01ee4d, 0x01ee4f, PG_U_OTHER_LETTER}, + {0x01ee51, 0x01ee52, PG_U_OTHER_LETTER}, + {0x01ee54, 0x01ee54, PG_U_OTHER_LETTER}, + {0x01ee57, 0x01ee57, PG_U_OTHER_LETTER}, + {0x01ee59, 0x01ee59, PG_U_OTHER_LETTER}, + {0x01ee5b, 0x01ee5b, PG_U_OTHER_LETTER}, + {0x01ee5d, 0x01ee5d, PG_U_OTHER_LETTER}, + {0x01ee5f, 0x01ee5f, PG_U_OTHER_LETTER}, + {0x01ee61, 0x01ee62, PG_U_OTHER_LETTER}, + {0x01ee64, 0x01ee64, PG_U_OTHER_LETTER}, + {0x01ee67, 0x01ee6a, PG_U_OTHER_LETTER}, + {0x01ee6c, 0x01ee72, PG_U_OTHER_LETTER}, + {0x01ee74, 0x01ee77, PG_U_OTHER_LETTER}, + {0x01ee79, 0x01ee7c, PG_U_OTHER_LETTER}, + {0x01ee7e, 0x01ee7e, PG_U_OTHER_LETTER}, + {0x01ee80, 0x01ee89, PG_U_OTHER_LETTER}, + {0x01ee8b, 0x01ee9b, PG_U_OTHER_LETTER}, + {0x01eea1, 0x01eea3, PG_U_OTHER_LETTER}, + {0x01eea5, 0x01eea9, PG_U_OTHER_LETTER}, + {0x01eeab, 0x01eebb, PG_U_OTHER_LETTER}, + {0x01eef0, 0x01eef1, PG_U_MATH_SYMBOL}, + {0x01f000, 0x01f02b, PG_U_OTHER_SYMBOL}, + {0x01f030, 0x01f093, PG_U_OTHER_SYMBOL}, + {0x01f0a0, 0x01f0ae, PG_U_OTHER_SYMBOL}, + {0x01f0b1, 0x01f0bf, PG_U_OTHER_SYMBOL}, + {0x01f0c1, 0x01f0cf, PG_U_OTHER_SYMBOL}, + {0x01f0d1, 0x01f0f5, PG_U_OTHER_SYMBOL}, + {0x01f100, 0x01f10c, PG_U_OTHER_NUMBER}, + {0x01f10d, 0x01f1ad, PG_U_OTHER_SYMBOL}, + {0x01f1e6, 0x01f202, PG_U_OTHER_SYMBOL}, + {0x01f210, 0x01f23b, PG_U_OTHER_SYMBOL}, + {0x01f240, 0x01f248, PG_U_OTHER_SYMBOL}, + {0x01f250, 0x01f251, PG_U_OTHER_SYMBOL}, + {0x01f260, 0x01f265, PG_U_OTHER_SYMBOL}, + {0x01f300, 0x01f3fa, PG_U_OTHER_SYMBOL}, + {0x01f3fb, 0x01f3ff, PG_U_MODIFIER_SYMBOL}, + {0x01f400, 0x01f6d7, PG_U_OTHER_SYMBOL}, + {0x01f6dc, 0x01f6ec, PG_U_OTHER_SYMBOL}, + {0x01f6f0, 0x01f6fc, PG_U_OTHER_SYMBOL}, + {0x01f700, 0x01f776, PG_U_OTHER_SYMBOL}, + {0x01f77b, 0x01f7d9, PG_U_OTHER_SYMBOL}, + {0x01f7e0, 0x01f7eb, PG_U_OTHER_SYMBOL}, + {0x01f7f0, 0x01f7f0, PG_U_OTHER_SYMBOL}, + {0x01f800, 0x01f80b, PG_U_OTHER_SYMBOL}, + {0x01f810, 0x01f847, PG_U_OTHER_SYMBOL}, + {0x01f850, 0x01f859, PG_U_OTHER_SYMBOL}, + {0x01f860, 0x01f887, PG_U_OTHER_SYMBOL}, + {0x01f890, 0x01f8ad, PG_U_OTHER_SYMBOL}, + {0x01f8b0, 0x01f8b1, PG_U_OTHER_SYMBOL}, + {0x01f900, 0x01fa53, PG_U_OTHER_SYMBOL}, + {0x01fa60, 0x01fa6d, PG_U_OTHER_SYMBOL}, + {0x01fa70, 0x01fa7c, PG_U_OTHER_SYMBOL}, + {0x01fa80, 0x01fa88, PG_U_OTHER_SYMBOL}, + {0x01fa90, 0x01fabd, PG_U_OTHER_SYMBOL}, + {0x01fabf, 0x01fac5, PG_U_OTHER_SYMBOL}, + {0x01face, 0x01fadb, PG_U_OTHER_SYMBOL}, + {0x01fae0, 0x01fae8, PG_U_OTHER_SYMBOL}, + {0x01faf0, 0x01faf8, PG_U_OTHER_SYMBOL}, + {0x01fb00, 0x01fb92, PG_U_OTHER_SYMBOL}, + {0x01fb94, 0x01fbca, PG_U_OTHER_SYMBOL}, + {0x01fbf0, 0x01fbf9, PG_U_DECIMAL_NUMBER}, + {0x020000, 0x02a6df, PG_U_OTHER_LETTER}, + {0x02a700, 0x02b739, PG_U_OTHER_LETTER}, + {0x02b740, 0x02b81d, PG_U_OTHER_LETTER}, + {0x02b820, 0x02cea1, PG_U_OTHER_LETTER}, + {0x02ceb0, 0x02ebe0, PG_U_OTHER_LETTER}, + {0x02ebf0, 0x02ee5d, PG_U_OTHER_LETTER}, + {0x02f800, 0x02fa1d, PG_U_OTHER_LETTER}, + {0x030000, 0x03134a, PG_U_OTHER_LETTER}, + {0x031350, 0x0323af, PG_U_OTHER_LETTER}, + {0x0e0001, 0x0e0001, PG_U_FORMAT}, + {0x0e0020, 0x0e007f, PG_U_FORMAT}, + {0x0e0100, 0x0e01ef, PG_U_NONSPACING_MARK}, + {0x0f0000, 0x0ffffd, PG_U_PRIVATE_USE}, + {0x100000, 0x10fffd, PG_U_PRIVATE_USE}, +}; + +/* table of Unicode codepoint ranges of Alphabetic characters */ +static const pg_unicode_range unicode_alphabetic[1141] = +{ + {0x000041, 0x00005a}, + {0x000061, 0x00007a}, + {0x0000aa, 0x0000aa}, + {0x0000b5, 0x0000b5}, + {0x0000ba, 0x0000ba}, + {0x0000c0, 0x0000d6}, + {0x0000d8, 0x0000f6}, + {0x0000f8, 0x0001ba}, + {0x0001bb, 0x0001bb}, + {0x0001bc, 0x0001bf}, + {0x0001c0, 0x0001c3}, + {0x0001c4, 0x000293}, + {0x000294, 0x000294}, + {0x000295, 0x0002af}, + {0x0002b0, 0x0002c1}, + {0x0002c6, 0x0002d1}, + {0x0002e0, 0x0002e4}, + {0x0002ec, 0x0002ec}, + {0x0002ee, 0x0002ee}, + {0x000345, 0x000345}, + {0x000370, 0x000373}, + {0x000374, 0x000374}, + {0x000376, 0x000377}, + {0x00037a, 0x00037a}, + {0x00037b, 0x00037d}, + {0x00037f, 0x00037f}, + {0x000386, 0x000386}, + {0x000388, 0x00038a}, + {0x00038c, 0x00038c}, + {0x00038e, 0x0003a1}, + {0x0003a3, 0x0003f5}, + {0x0003f7, 0x000481}, + {0x00048a, 0x00052f}, + {0x000531, 0x000556}, + {0x000559, 0x000559}, + {0x000560, 0x000588}, + {0x0005b0, 0x0005bd}, + {0x0005bf, 0x0005bf}, + {0x0005c1, 0x0005c2}, + {0x0005c4, 0x0005c5}, + {0x0005c7, 0x0005c7}, + {0x0005d0, 0x0005ea}, + {0x0005ef, 0x0005f2}, + {0x000610, 0x00061a}, + {0x000620, 0x00063f}, + {0x000640, 0x000640}, + {0x000641, 0x00064a}, + {0x00064b, 0x000657}, + {0x000659, 0x00065f}, + {0x00066e, 0x00066f}, + {0x000670, 0x000670}, + {0x000671, 0x0006d3}, + {0x0006d5, 0x0006d5}, + {0x0006d6, 0x0006dc}, + {0x0006e1, 0x0006e4}, + {0x0006e5, 0x0006e6}, + {0x0006e7, 0x0006e8}, + {0x0006ed, 0x0006ed}, + {0x0006ee, 0x0006ef}, + {0x0006fa, 0x0006fc}, + {0x0006ff, 0x0006ff}, + {0x000710, 0x000710}, + {0x000711, 0x000711}, + {0x000712, 0x00072f}, + {0x000730, 0x00073f}, + {0x00074d, 0x0007a5}, + {0x0007a6, 0x0007b0}, + {0x0007b1, 0x0007b1}, + {0x0007ca, 0x0007ea}, + {0x0007f4, 0x0007f5}, + {0x0007fa, 0x0007fa}, + {0x000800, 0x000815}, + {0x000816, 0x000817}, + {0x00081a, 0x00081a}, + {0x00081b, 0x000823}, + {0x000824, 0x000824}, + {0x000825, 0x000827}, + {0x000828, 0x000828}, + {0x000829, 0x00082c}, + {0x000840, 0x000858}, + {0x000860, 0x00086a}, + {0x000870, 0x000887}, + {0x000889, 0x00088e}, + {0x0008a0, 0x0008c8}, + {0x0008c9, 0x0008c9}, + {0x0008d4, 0x0008df}, + {0x0008e3, 0x0008e9}, + {0x0008f0, 0x000902}, + {0x000903, 0x000903}, + {0x000904, 0x000939}, + {0x00093a, 0x00093a}, + {0x00093b, 0x00093b}, + {0x00093d, 0x00093d}, + {0x00093e, 0x000940}, + {0x000941, 0x000948}, + {0x000949, 0x00094c}, + {0x00094e, 0x00094f}, + {0x000950, 0x000950}, + {0x000955, 0x000957}, + {0x000958, 0x000961}, + {0x000962, 0x000963}, + {0x000971, 0x000971}, + {0x000972, 0x000980}, + {0x000981, 0x000981}, + {0x000982, 0x000983}, + {0x000985, 0x00098c}, + {0x00098f, 0x000990}, + {0x000993, 0x0009a8}, + {0x0009aa, 0x0009b0}, + {0x0009b2, 0x0009b2}, + {0x0009b6, 0x0009b9}, + {0x0009bd, 0x0009bd}, + {0x0009be, 0x0009c0}, + {0x0009c1, 0x0009c4}, + {0x0009c7, 0x0009c8}, + {0x0009cb, 0x0009cc}, + {0x0009ce, 0x0009ce}, + {0x0009d7, 0x0009d7}, + {0x0009dc, 0x0009dd}, + {0x0009df, 0x0009e1}, + {0x0009e2, 0x0009e3}, + {0x0009f0, 0x0009f1}, + {0x0009fc, 0x0009fc}, + {0x000a01, 0x000a02}, + {0x000a03, 0x000a03}, + {0x000a05, 0x000a0a}, + {0x000a0f, 0x000a10}, + {0x000a13, 0x000a28}, + {0x000a2a, 0x000a30}, + {0x000a32, 0x000a33}, + {0x000a35, 0x000a36}, + {0x000a38, 0x000a39}, + {0x000a3e, 0x000a40}, + {0x000a41, 0x000a42}, + {0x000a47, 0x000a48}, + {0x000a4b, 0x000a4c}, + {0x000a51, 0x000a51}, + {0x000a59, 0x000a5c}, + {0x000a5e, 0x000a5e}, + {0x000a70, 0x000a71}, + {0x000a72, 0x000a74}, + {0x000a75, 0x000a75}, + {0x000a81, 0x000a82}, + {0x000a83, 0x000a83}, + {0x000a85, 0x000a8d}, + {0x000a8f, 0x000a91}, + {0x000a93, 0x000aa8}, + {0x000aaa, 0x000ab0}, + {0x000ab2, 0x000ab3}, + {0x000ab5, 0x000ab9}, + {0x000abd, 0x000abd}, + {0x000abe, 0x000ac0}, + {0x000ac1, 0x000ac5}, + {0x000ac7, 0x000ac8}, + {0x000ac9, 0x000ac9}, + {0x000acb, 0x000acc}, + {0x000ad0, 0x000ad0}, + {0x000ae0, 0x000ae1}, + {0x000ae2, 0x000ae3}, + {0x000af9, 0x000af9}, + {0x000afa, 0x000afc}, + {0x000b01, 0x000b01}, + {0x000b02, 0x000b03}, + {0x000b05, 0x000b0c}, + {0x000b0f, 0x000b10}, + {0x000b13, 0x000b28}, + {0x000b2a, 0x000b30}, + {0x000b32, 0x000b33}, + {0x000b35, 0x000b39}, + {0x000b3d, 0x000b3d}, + {0x000b3e, 0x000b3e}, + {0x000b3f, 0x000b3f}, + {0x000b40, 0x000b40}, + {0x000b41, 0x000b44}, + {0x000b47, 0x000b48}, + {0x000b4b, 0x000b4c}, + {0x000b56, 0x000b56}, + {0x000b57, 0x000b57}, + {0x000b5c, 0x000b5d}, + {0x000b5f, 0x000b61}, + {0x000b62, 0x000b63}, + {0x000b71, 0x000b71}, + {0x000b82, 0x000b82}, + {0x000b83, 0x000b83}, + {0x000b85, 0x000b8a}, + {0x000b8e, 0x000b90}, + {0x000b92, 0x000b95}, + {0x000b99, 0x000b9a}, + {0x000b9c, 0x000b9c}, + {0x000b9e, 0x000b9f}, + {0x000ba3, 0x000ba4}, + {0x000ba8, 0x000baa}, + {0x000bae, 0x000bb9}, + {0x000bbe, 0x000bbf}, + {0x000bc0, 0x000bc0}, + {0x000bc1, 0x000bc2}, + {0x000bc6, 0x000bc8}, + {0x000bca, 0x000bcc}, + {0x000bd0, 0x000bd0}, + {0x000bd7, 0x000bd7}, + {0x000c00, 0x000c00}, + {0x000c01, 0x000c03}, + {0x000c04, 0x000c04}, + {0x000c05, 0x000c0c}, + {0x000c0e, 0x000c10}, + {0x000c12, 0x000c28}, + {0x000c2a, 0x000c39}, + {0x000c3d, 0x000c3d}, + {0x000c3e, 0x000c40}, + {0x000c41, 0x000c44}, + {0x000c46, 0x000c48}, + {0x000c4a, 0x000c4c}, + {0x000c55, 0x000c56}, + {0x000c58, 0x000c5a}, + {0x000c5d, 0x000c5d}, + {0x000c60, 0x000c61}, + {0x000c62, 0x000c63}, + {0x000c80, 0x000c80}, + {0x000c81, 0x000c81}, + {0x000c82, 0x000c83}, + {0x000c85, 0x000c8c}, + {0x000c8e, 0x000c90}, + {0x000c92, 0x000ca8}, + {0x000caa, 0x000cb3}, + {0x000cb5, 0x000cb9}, + {0x000cbd, 0x000cbd}, + {0x000cbe, 0x000cbe}, + {0x000cbf, 0x000cbf}, + {0x000cc0, 0x000cc4}, + {0x000cc6, 0x000cc6}, + {0x000cc7, 0x000cc8}, + {0x000cca, 0x000ccb}, + {0x000ccc, 0x000ccc}, + {0x000cd5, 0x000cd6}, + {0x000cdd, 0x000cde}, + {0x000ce0, 0x000ce1}, + {0x000ce2, 0x000ce3}, + {0x000cf1, 0x000cf2}, + {0x000cf3, 0x000cf3}, + {0x000d00, 0x000d01}, + {0x000d02, 0x000d03}, + {0x000d04, 0x000d0c}, + {0x000d0e, 0x000d10}, + {0x000d12, 0x000d3a}, + {0x000d3d, 0x000d3d}, + {0x000d3e, 0x000d40}, + {0x000d41, 0x000d44}, + {0x000d46, 0x000d48}, + {0x000d4a, 0x000d4c}, + {0x000d4e, 0x000d4e}, + {0x000d54, 0x000d56}, + {0x000d57, 0x000d57}, + {0x000d5f, 0x000d61}, + {0x000d62, 0x000d63}, + {0x000d7a, 0x000d7f}, + {0x000d81, 0x000d81}, + {0x000d82, 0x000d83}, + {0x000d85, 0x000d96}, + {0x000d9a, 0x000db1}, + {0x000db3, 0x000dbb}, + {0x000dbd, 0x000dbd}, + {0x000dc0, 0x000dc6}, + {0x000dcf, 0x000dd1}, + {0x000dd2, 0x000dd4}, + {0x000dd6, 0x000dd6}, + {0x000dd8, 0x000ddf}, + {0x000df2, 0x000df3}, + {0x000e01, 0x000e30}, + {0x000e31, 0x000e31}, + {0x000e32, 0x000e33}, + {0x000e34, 0x000e3a}, + {0x000e40, 0x000e45}, + {0x000e46, 0x000e46}, + {0x000e4d, 0x000e4d}, + {0x000e81, 0x000e82}, + {0x000e84, 0x000e84}, + {0x000e86, 0x000e8a}, + {0x000e8c, 0x000ea3}, + {0x000ea5, 0x000ea5}, + {0x000ea7, 0x000eb0}, + {0x000eb1, 0x000eb1}, + {0x000eb2, 0x000eb3}, + {0x000eb4, 0x000eb9}, + {0x000ebb, 0x000ebc}, + {0x000ebd, 0x000ebd}, + {0x000ec0, 0x000ec4}, + {0x000ec6, 0x000ec6}, + {0x000ecd, 0x000ecd}, + {0x000edc, 0x000edf}, + {0x000f00, 0x000f00}, + {0x000f40, 0x000f47}, + {0x000f49, 0x000f6c}, + {0x000f71, 0x000f7e}, + {0x000f7f, 0x000f7f}, + {0x000f80, 0x000f83}, + {0x000f88, 0x000f8c}, + {0x000f8d, 0x000f97}, + {0x000f99, 0x000fbc}, + {0x001000, 0x00102a}, + {0x00102b, 0x00102c}, + {0x00102d, 0x001030}, + {0x001031, 0x001031}, + {0x001032, 0x001036}, + {0x001038, 0x001038}, + {0x00103b, 0x00103c}, + {0x00103d, 0x00103e}, + {0x00103f, 0x00103f}, + {0x001050, 0x001055}, + {0x001056, 0x001057}, + {0x001058, 0x001059}, + {0x00105a, 0x00105d}, + {0x00105e, 0x001060}, + {0x001061, 0x001061}, + {0x001062, 0x001064}, + {0x001065, 0x001066}, + {0x001067, 0x00106d}, + {0x00106e, 0x001070}, + {0x001071, 0x001074}, + {0x001075, 0x001081}, + {0x001082, 0x001082}, + {0x001083, 0x001084}, + {0x001085, 0x001086}, + {0x001087, 0x00108c}, + {0x00108d, 0x00108d}, + {0x00108e, 0x00108e}, + {0x00108f, 0x00108f}, + {0x00109a, 0x00109c}, + {0x00109d, 0x00109d}, + {0x0010a0, 0x0010c5}, + {0x0010c7, 0x0010c7}, + {0x0010cd, 0x0010cd}, + {0x0010d0, 0x0010fa}, + {0x0010fc, 0x0010fc}, + {0x0010fd, 0x0010ff}, + {0x001100, 0x001248}, + {0x00124a, 0x00124d}, + {0x001250, 0x001256}, + {0x001258, 0x001258}, + {0x00125a, 0x00125d}, + {0x001260, 0x001288}, + {0x00128a, 0x00128d}, + {0x001290, 0x0012b0}, + {0x0012b2, 0x0012b5}, + {0x0012b8, 0x0012be}, + {0x0012c0, 0x0012c0}, + {0x0012c2, 0x0012c5}, + {0x0012c8, 0x0012d6}, + {0x0012d8, 0x001310}, + {0x001312, 0x001315}, + {0x001318, 0x00135a}, + {0x001380, 0x00138f}, + {0x0013a0, 0x0013f5}, + {0x0013f8, 0x0013fd}, + {0x001401, 0x00166c}, + {0x00166f, 0x00167f}, + {0x001681, 0x00169a}, + {0x0016a0, 0x0016ea}, + {0x0016ee, 0x0016f0}, + {0x0016f1, 0x0016f8}, + {0x001700, 0x001711}, + {0x001712, 0x001713}, + {0x00171f, 0x001731}, + {0x001732, 0x001733}, + {0x001740, 0x001751}, + {0x001752, 0x001753}, + {0x001760, 0x00176c}, + {0x00176e, 0x001770}, + {0x001772, 0x001773}, + {0x001780, 0x0017b3}, + {0x0017b6, 0x0017b6}, + {0x0017b7, 0x0017bd}, + {0x0017be, 0x0017c5}, + {0x0017c6, 0x0017c6}, + {0x0017c7, 0x0017c8}, + {0x0017d7, 0x0017d7}, + {0x0017dc, 0x0017dc}, + {0x001820, 0x001842}, + {0x001843, 0x001843}, + {0x001844, 0x001878}, + {0x001880, 0x001884}, + {0x001885, 0x001886}, + {0x001887, 0x0018a8}, + {0x0018a9, 0x0018a9}, + {0x0018aa, 0x0018aa}, + {0x0018b0, 0x0018f5}, + {0x001900, 0x00191e}, + {0x001920, 0x001922}, + {0x001923, 0x001926}, + {0x001927, 0x001928}, + {0x001929, 0x00192b}, + {0x001930, 0x001931}, + {0x001932, 0x001932}, + {0x001933, 0x001938}, + {0x001950, 0x00196d}, + {0x001970, 0x001974}, + {0x001980, 0x0019ab}, + {0x0019b0, 0x0019c9}, + {0x001a00, 0x001a16}, + {0x001a17, 0x001a18}, + {0x001a19, 0x001a1a}, + {0x001a1b, 0x001a1b}, + {0x001a20, 0x001a54}, + {0x001a55, 0x001a55}, + {0x001a56, 0x001a56}, + {0x001a57, 0x001a57}, + {0x001a58, 0x001a5e}, + {0x001a61, 0x001a61}, + {0x001a62, 0x001a62}, + {0x001a63, 0x001a64}, + {0x001a65, 0x001a6c}, + {0x001a6d, 0x001a72}, + {0x001a73, 0x001a74}, + {0x001aa7, 0x001aa7}, + {0x001abf, 0x001ac0}, + {0x001acc, 0x001ace}, + {0x001b00, 0x001b03}, + {0x001b04, 0x001b04}, + {0x001b05, 0x001b33}, + {0x001b35, 0x001b35}, + {0x001b36, 0x001b3a}, + {0x001b3b, 0x001b3b}, + {0x001b3c, 0x001b3c}, + {0x001b3d, 0x001b41}, + {0x001b42, 0x001b42}, + {0x001b43, 0x001b43}, + {0x001b45, 0x001b4c}, + {0x001b80, 0x001b81}, + {0x001b82, 0x001b82}, + {0x001b83, 0x001ba0}, + {0x001ba1, 0x001ba1}, + {0x001ba2, 0x001ba5}, + {0x001ba6, 0x001ba7}, + {0x001ba8, 0x001ba9}, + {0x001bac, 0x001bad}, + {0x001bae, 0x001baf}, + {0x001bba, 0x001be5}, + {0x001be7, 0x001be7}, + {0x001be8, 0x001be9}, + {0x001bea, 0x001bec}, + {0x001bed, 0x001bed}, + {0x001bee, 0x001bee}, + {0x001bef, 0x001bf1}, + {0x001c00, 0x001c23}, + {0x001c24, 0x001c2b}, + {0x001c2c, 0x001c33}, + {0x001c34, 0x001c35}, + {0x001c36, 0x001c36}, + {0x001c4d, 0x001c4f}, + {0x001c5a, 0x001c77}, + {0x001c78, 0x001c7d}, + {0x001c80, 0x001c88}, + {0x001c90, 0x001cba}, + {0x001cbd, 0x001cbf}, + {0x001ce9, 0x001cec}, + {0x001cee, 0x001cf3}, + {0x001cf5, 0x001cf6}, + {0x001cfa, 0x001cfa}, + {0x001d00, 0x001d2b}, + {0x001d2c, 0x001d6a}, + {0x001d6b, 0x001d77}, + {0x001d78, 0x001d78}, + {0x001d79, 0x001d9a}, + {0x001d9b, 0x001dbf}, + {0x001de7, 0x001df4}, + {0x001e00, 0x001f15}, + {0x001f18, 0x001f1d}, + {0x001f20, 0x001f45}, + {0x001f48, 0x001f4d}, + {0x001f50, 0x001f57}, + {0x001f59, 0x001f59}, + {0x001f5b, 0x001f5b}, + {0x001f5d, 0x001f5d}, + {0x001f5f, 0x001f7d}, + {0x001f80, 0x001fb4}, + {0x001fb6, 0x001fbc}, + {0x001fbe, 0x001fbe}, + {0x001fc2, 0x001fc4}, + {0x001fc6, 0x001fcc}, + {0x001fd0, 0x001fd3}, + {0x001fd6, 0x001fdb}, + {0x001fe0, 0x001fec}, + {0x001ff2, 0x001ff4}, + {0x001ff6, 0x001ffc}, + {0x002071, 0x002071}, + {0x00207f, 0x00207f}, + {0x002090, 0x00209c}, + {0x002102, 0x002102}, + {0x002107, 0x002107}, + {0x00210a, 0x002113}, + {0x002115, 0x002115}, + {0x002119, 0x00211d}, + {0x002124, 0x002124}, + {0x002126, 0x002126}, + {0x002128, 0x002128}, + {0x00212a, 0x00212d}, + {0x00212f, 0x002134}, + {0x002135, 0x002138}, + {0x002139, 0x002139}, + {0x00213c, 0x00213f}, + {0x002145, 0x002149}, + {0x00214e, 0x00214e}, + {0x002160, 0x002182}, + {0x002183, 0x002184}, + {0x002185, 0x002188}, + {0x0024b6, 0x0024e9}, + {0x002c00, 0x002c7b}, + {0x002c7c, 0x002c7d}, + {0x002c7e, 0x002ce4}, + {0x002ceb, 0x002cee}, + {0x002cf2, 0x002cf3}, + {0x002d00, 0x002d25}, + {0x002d27, 0x002d27}, + {0x002d2d, 0x002d2d}, + {0x002d30, 0x002d67}, + {0x002d6f, 0x002d6f}, + {0x002d80, 0x002d96}, + {0x002da0, 0x002da6}, + {0x002da8, 0x002dae}, + {0x002db0, 0x002db6}, + {0x002db8, 0x002dbe}, + {0x002dc0, 0x002dc6}, + {0x002dc8, 0x002dce}, + {0x002dd0, 0x002dd6}, + {0x002dd8, 0x002dde}, + {0x002de0, 0x002dff}, + {0x002e2f, 0x002e2f}, + {0x003005, 0x003005}, + {0x003006, 0x003006}, + {0x003007, 0x003007}, + {0x003021, 0x003029}, + {0x003031, 0x003035}, + {0x003038, 0x00303a}, + {0x00303b, 0x00303b}, + {0x00303c, 0x00303c}, + {0x003041, 0x003096}, + {0x00309d, 0x00309e}, + {0x00309f, 0x00309f}, + {0x0030a1, 0x0030fa}, + {0x0030fc, 0x0030fe}, + {0x0030ff, 0x0030ff}, + {0x003105, 0x00312f}, + {0x003131, 0x00318e}, + {0x0031a0, 0x0031bf}, + {0x0031f0, 0x0031ff}, + {0x003400, 0x004dbf}, + {0x004e00, 0x00a014}, + {0x00a015, 0x00a015}, + {0x00a016, 0x00a48c}, + {0x00a4d0, 0x00a4f7}, + {0x00a4f8, 0x00a4fd}, + {0x00a500, 0x00a60b}, + {0x00a60c, 0x00a60c}, + {0x00a610, 0x00a61f}, + {0x00a62a, 0x00a62b}, + {0x00a640, 0x00a66d}, + {0x00a66e, 0x00a66e}, + {0x00a674, 0x00a67b}, + {0x00a67f, 0x00a67f}, + {0x00a680, 0x00a69b}, + {0x00a69c, 0x00a69d}, + {0x00a69e, 0x00a69f}, + {0x00a6a0, 0x00a6e5}, + {0x00a6e6, 0x00a6ef}, + {0x00a717, 0x00a71f}, + {0x00a722, 0x00a76f}, + {0x00a770, 0x00a770}, + {0x00a771, 0x00a787}, + {0x00a788, 0x00a788}, + {0x00a78b, 0x00a78e}, + {0x00a78f, 0x00a78f}, + {0x00a790, 0x00a7ca}, + {0x00a7d0, 0x00a7d1}, + {0x00a7d3, 0x00a7d3}, + {0x00a7d5, 0x00a7d9}, + {0x00a7f2, 0x00a7f4}, + {0x00a7f5, 0x00a7f6}, + {0x00a7f7, 0x00a7f7}, + {0x00a7f8, 0x00a7f9}, + {0x00a7fa, 0x00a7fa}, + {0x00a7fb, 0x00a801}, + {0x00a802, 0x00a802}, + {0x00a803, 0x00a805}, + {0x00a807, 0x00a80a}, + {0x00a80b, 0x00a80b}, + {0x00a80c, 0x00a822}, + {0x00a823, 0x00a824}, + {0x00a825, 0x00a826}, + {0x00a827, 0x00a827}, + {0x00a840, 0x00a873}, + {0x00a880, 0x00a881}, + {0x00a882, 0x00a8b3}, + {0x00a8b4, 0x00a8c3}, + {0x00a8c5, 0x00a8c5}, + {0x00a8f2, 0x00a8f7}, + {0x00a8fb, 0x00a8fb}, + {0x00a8fd, 0x00a8fe}, + {0x00a8ff, 0x00a8ff}, + {0x00a90a, 0x00a925}, + {0x00a926, 0x00a92a}, + {0x00a930, 0x00a946}, + {0x00a947, 0x00a951}, + {0x00a952, 0x00a952}, + {0x00a960, 0x00a97c}, + {0x00a980, 0x00a982}, + {0x00a983, 0x00a983}, + {0x00a984, 0x00a9b2}, + {0x00a9b4, 0x00a9b5}, + {0x00a9b6, 0x00a9b9}, + {0x00a9ba, 0x00a9bb}, + {0x00a9bc, 0x00a9bd}, + {0x00a9be, 0x00a9bf}, + {0x00a9cf, 0x00a9cf}, + {0x00a9e0, 0x00a9e4}, + {0x00a9e5, 0x00a9e5}, + {0x00a9e6, 0x00a9e6}, + {0x00a9e7, 0x00a9ef}, + {0x00a9fa, 0x00a9fe}, + {0x00aa00, 0x00aa28}, + {0x00aa29, 0x00aa2e}, + {0x00aa2f, 0x00aa30}, + {0x00aa31, 0x00aa32}, + {0x00aa33, 0x00aa34}, + {0x00aa35, 0x00aa36}, + {0x00aa40, 0x00aa42}, + {0x00aa43, 0x00aa43}, + {0x00aa44, 0x00aa4b}, + {0x00aa4c, 0x00aa4c}, + {0x00aa4d, 0x00aa4d}, + {0x00aa60, 0x00aa6f}, + {0x00aa70, 0x00aa70}, + {0x00aa71, 0x00aa76}, + {0x00aa7a, 0x00aa7a}, + {0x00aa7b, 0x00aa7b}, + {0x00aa7c, 0x00aa7c}, + {0x00aa7d, 0x00aa7d}, + {0x00aa7e, 0x00aaaf}, + {0x00aab0, 0x00aab0}, + {0x00aab1, 0x00aab1}, + {0x00aab2, 0x00aab4}, + {0x00aab5, 0x00aab6}, + {0x00aab7, 0x00aab8}, + {0x00aab9, 0x00aabd}, + {0x00aabe, 0x00aabe}, + {0x00aac0, 0x00aac0}, + {0x00aac2, 0x00aac2}, + {0x00aadb, 0x00aadc}, + {0x00aadd, 0x00aadd}, + {0x00aae0, 0x00aaea}, + {0x00aaeb, 0x00aaeb}, + {0x00aaec, 0x00aaed}, + {0x00aaee, 0x00aaef}, + {0x00aaf2, 0x00aaf2}, + {0x00aaf3, 0x00aaf4}, + {0x00aaf5, 0x00aaf5}, + {0x00ab01, 0x00ab06}, + {0x00ab09, 0x00ab0e}, + {0x00ab11, 0x00ab16}, + {0x00ab20, 0x00ab26}, + {0x00ab28, 0x00ab2e}, + {0x00ab30, 0x00ab5a}, + {0x00ab5c, 0x00ab5f}, + {0x00ab60, 0x00ab68}, + {0x00ab69, 0x00ab69}, + {0x00ab70, 0x00abbf}, + {0x00abc0, 0x00abe2}, + {0x00abe3, 0x00abe4}, + {0x00abe5, 0x00abe5}, + {0x00abe6, 0x00abe7}, + {0x00abe8, 0x00abe8}, + {0x00abe9, 0x00abea}, + {0x00ac00, 0x00d7a3}, + {0x00d7b0, 0x00d7c6}, + {0x00d7cb, 0x00d7fb}, + {0x00f900, 0x00fa6d}, + {0x00fa70, 0x00fad9}, + {0x00fb00, 0x00fb06}, + {0x00fb13, 0x00fb17}, + {0x00fb1d, 0x00fb1d}, + {0x00fb1e, 0x00fb1e}, + {0x00fb1f, 0x00fb28}, + {0x00fb2a, 0x00fb36}, + {0x00fb38, 0x00fb3c}, + {0x00fb3e, 0x00fb3e}, + {0x00fb40, 0x00fb41}, + {0x00fb43, 0x00fb44}, + {0x00fb46, 0x00fbb1}, + {0x00fbd3, 0x00fd3d}, + {0x00fd50, 0x00fd8f}, + {0x00fd92, 0x00fdc7}, + {0x00fdf0, 0x00fdfb}, + {0x00fe70, 0x00fe74}, + {0x00fe76, 0x00fefc}, + {0x00ff21, 0x00ff3a}, + {0x00ff41, 0x00ff5a}, + {0x00ff66, 0x00ff6f}, + {0x00ff70, 0x00ff70}, + {0x00ff71, 0x00ff9d}, + {0x00ff9e, 0x00ff9f}, + {0x00ffa0, 0x00ffbe}, + {0x00ffc2, 0x00ffc7}, + {0x00ffca, 0x00ffcf}, + {0x00ffd2, 0x00ffd7}, + {0x00ffda, 0x00ffdc}, + {0x010000, 0x01000b}, + {0x01000d, 0x010026}, + {0x010028, 0x01003a}, + {0x01003c, 0x01003d}, + {0x01003f, 0x01004d}, + {0x010050, 0x01005d}, + {0x010080, 0x0100fa}, + {0x010140, 0x010174}, + {0x010280, 0x01029c}, + {0x0102a0, 0x0102d0}, + {0x010300, 0x01031f}, + {0x01032d, 0x010340}, + {0x010341, 0x010341}, + {0x010342, 0x010349}, + {0x01034a, 0x01034a}, + {0x010350, 0x010375}, + {0x010376, 0x01037a}, + {0x010380, 0x01039d}, + {0x0103a0, 0x0103c3}, + {0x0103c8, 0x0103cf}, + {0x0103d1, 0x0103d5}, + {0x010400, 0x01044f}, + {0x010450, 0x01049d}, + {0x0104b0, 0x0104d3}, + {0x0104d8, 0x0104fb}, + {0x010500, 0x010527}, + {0x010530, 0x010563}, + {0x010570, 0x01057a}, + {0x01057c, 0x01058a}, + {0x01058c, 0x010592}, + {0x010594, 0x010595}, + {0x010597, 0x0105a1}, + {0x0105a3, 0x0105b1}, + {0x0105b3, 0x0105b9}, + {0x0105bb, 0x0105bc}, + {0x010600, 0x010736}, + {0x010740, 0x010755}, + {0x010760, 0x010767}, + {0x010780, 0x010785}, + {0x010787, 0x0107b0}, + {0x0107b2, 0x0107ba}, + {0x010800, 0x010805}, + {0x010808, 0x010808}, + {0x01080a, 0x010835}, + {0x010837, 0x010838}, + {0x01083c, 0x01083c}, + {0x01083f, 0x010855}, + {0x010860, 0x010876}, + {0x010880, 0x01089e}, + {0x0108e0, 0x0108f2}, + {0x0108f4, 0x0108f5}, + {0x010900, 0x010915}, + {0x010920, 0x010939}, + {0x010980, 0x0109b7}, + {0x0109be, 0x0109bf}, + {0x010a00, 0x010a00}, + {0x010a01, 0x010a03}, + {0x010a05, 0x010a06}, + {0x010a0c, 0x010a0f}, + {0x010a10, 0x010a13}, + {0x010a15, 0x010a17}, + {0x010a19, 0x010a35}, + {0x010a60, 0x010a7c}, + {0x010a80, 0x010a9c}, + {0x010ac0, 0x010ac7}, + {0x010ac9, 0x010ae4}, + {0x010b00, 0x010b35}, + {0x010b40, 0x010b55}, + {0x010b60, 0x010b72}, + {0x010b80, 0x010b91}, + {0x010c00, 0x010c48}, + {0x010c80, 0x010cb2}, + {0x010cc0, 0x010cf2}, + {0x010d00, 0x010d23}, + {0x010d24, 0x010d27}, + {0x010e80, 0x010ea9}, + {0x010eab, 0x010eac}, + {0x010eb0, 0x010eb1}, + {0x010f00, 0x010f1c}, + {0x010f27, 0x010f27}, + {0x010f30, 0x010f45}, + {0x010f70, 0x010f81}, + {0x010fb0, 0x010fc4}, + {0x010fe0, 0x010ff6}, + {0x011000, 0x011000}, + {0x011001, 0x011001}, + {0x011002, 0x011002}, + {0x011003, 0x011037}, + {0x011038, 0x011045}, + {0x011071, 0x011072}, + {0x011073, 0x011074}, + {0x011075, 0x011075}, + {0x011080, 0x011081}, + {0x011082, 0x011082}, + {0x011083, 0x0110af}, + {0x0110b0, 0x0110b2}, + {0x0110b3, 0x0110b6}, + {0x0110b7, 0x0110b8}, + {0x0110c2, 0x0110c2}, + {0x0110d0, 0x0110e8}, + {0x011100, 0x011102}, + {0x011103, 0x011126}, + {0x011127, 0x01112b}, + {0x01112c, 0x01112c}, + {0x01112d, 0x011132}, + {0x011144, 0x011144}, + {0x011145, 0x011146}, + {0x011147, 0x011147}, + {0x011150, 0x011172}, + {0x011176, 0x011176}, + {0x011180, 0x011181}, + {0x011182, 0x011182}, + {0x011183, 0x0111b2}, + {0x0111b3, 0x0111b5}, + {0x0111b6, 0x0111be}, + {0x0111bf, 0x0111bf}, + {0x0111c1, 0x0111c4}, + {0x0111ce, 0x0111ce}, + {0x0111cf, 0x0111cf}, + {0x0111da, 0x0111da}, + {0x0111dc, 0x0111dc}, + {0x011200, 0x011211}, + {0x011213, 0x01122b}, + {0x01122c, 0x01122e}, + {0x01122f, 0x011231}, + {0x011232, 0x011233}, + {0x011234, 0x011234}, + {0x011237, 0x011237}, + {0x01123e, 0x01123e}, + {0x01123f, 0x011240}, + {0x011241, 0x011241}, + {0x011280, 0x011286}, + {0x011288, 0x011288}, + {0x01128a, 0x01128d}, + {0x01128f, 0x01129d}, + {0x01129f, 0x0112a8}, + {0x0112b0, 0x0112de}, + {0x0112df, 0x0112df}, + {0x0112e0, 0x0112e2}, + {0x0112e3, 0x0112e8}, + {0x011300, 0x011301}, + {0x011302, 0x011303}, + {0x011305, 0x01130c}, + {0x01130f, 0x011310}, + {0x011313, 0x011328}, + {0x01132a, 0x011330}, + {0x011332, 0x011333}, + {0x011335, 0x011339}, + {0x01133d, 0x01133d}, + {0x01133e, 0x01133f}, + {0x011340, 0x011340}, + {0x011341, 0x011344}, + {0x011347, 0x011348}, + {0x01134b, 0x01134c}, + {0x011350, 0x011350}, + {0x011357, 0x011357}, + {0x01135d, 0x011361}, + {0x011362, 0x011363}, + {0x011400, 0x011434}, + {0x011435, 0x011437}, + {0x011438, 0x01143f}, + {0x011440, 0x011441}, + {0x011443, 0x011444}, + {0x011445, 0x011445}, + {0x011447, 0x01144a}, + {0x01145f, 0x011461}, + {0x011480, 0x0114af}, + {0x0114b0, 0x0114b2}, + {0x0114b3, 0x0114b8}, + {0x0114b9, 0x0114b9}, + {0x0114ba, 0x0114ba}, + {0x0114bb, 0x0114be}, + {0x0114bf, 0x0114c0}, + {0x0114c1, 0x0114c1}, + {0x0114c4, 0x0114c5}, + {0x0114c7, 0x0114c7}, + {0x011580, 0x0115ae}, + {0x0115af, 0x0115b1}, + {0x0115b2, 0x0115b5}, + {0x0115b8, 0x0115bb}, + {0x0115bc, 0x0115bd}, + {0x0115be, 0x0115be}, + {0x0115d8, 0x0115db}, + {0x0115dc, 0x0115dd}, + {0x011600, 0x01162f}, + {0x011630, 0x011632}, + {0x011633, 0x01163a}, + {0x01163b, 0x01163c}, + {0x01163d, 0x01163d}, + {0x01163e, 0x01163e}, + {0x011640, 0x011640}, + {0x011644, 0x011644}, + {0x011680, 0x0116aa}, + {0x0116ab, 0x0116ab}, + {0x0116ac, 0x0116ac}, + {0x0116ad, 0x0116ad}, + {0x0116ae, 0x0116af}, + {0x0116b0, 0x0116b5}, + {0x0116b8, 0x0116b8}, + {0x011700, 0x01171a}, + {0x01171d, 0x01171f}, + {0x011720, 0x011721}, + {0x011722, 0x011725}, + {0x011726, 0x011726}, + {0x011727, 0x01172a}, + {0x011740, 0x011746}, + {0x011800, 0x01182b}, + {0x01182c, 0x01182e}, + {0x01182f, 0x011837}, + {0x011838, 0x011838}, + {0x0118a0, 0x0118df}, + {0x0118ff, 0x011906}, + {0x011909, 0x011909}, + {0x01190c, 0x011913}, + {0x011915, 0x011916}, + {0x011918, 0x01192f}, + {0x011930, 0x011935}, + {0x011937, 0x011938}, + {0x01193b, 0x01193c}, + {0x01193f, 0x01193f}, + {0x011940, 0x011940}, + {0x011941, 0x011941}, + {0x011942, 0x011942}, + {0x0119a0, 0x0119a7}, + {0x0119aa, 0x0119d0}, + {0x0119d1, 0x0119d3}, + {0x0119d4, 0x0119d7}, + {0x0119da, 0x0119db}, + {0x0119dc, 0x0119df}, + {0x0119e1, 0x0119e1}, + {0x0119e3, 0x0119e3}, + {0x0119e4, 0x0119e4}, + {0x011a00, 0x011a00}, + {0x011a01, 0x011a0a}, + {0x011a0b, 0x011a32}, + {0x011a35, 0x011a38}, + {0x011a39, 0x011a39}, + {0x011a3a, 0x011a3a}, + {0x011a3b, 0x011a3e}, + {0x011a50, 0x011a50}, + {0x011a51, 0x011a56}, + {0x011a57, 0x011a58}, + {0x011a59, 0x011a5b}, + {0x011a5c, 0x011a89}, + {0x011a8a, 0x011a96}, + {0x011a97, 0x011a97}, + {0x011a9d, 0x011a9d}, + {0x011ab0, 0x011af8}, + {0x011c00, 0x011c08}, + {0x011c0a, 0x011c2e}, + {0x011c2f, 0x011c2f}, + {0x011c30, 0x011c36}, + {0x011c38, 0x011c3d}, + {0x011c3e, 0x011c3e}, + {0x011c40, 0x011c40}, + {0x011c72, 0x011c8f}, + {0x011c92, 0x011ca7}, + {0x011ca9, 0x011ca9}, + {0x011caa, 0x011cb0}, + {0x011cb1, 0x011cb1}, + {0x011cb2, 0x011cb3}, + {0x011cb4, 0x011cb4}, + {0x011cb5, 0x011cb6}, + {0x011d00, 0x011d06}, + {0x011d08, 0x011d09}, + {0x011d0b, 0x011d30}, + {0x011d31, 0x011d36}, + {0x011d3a, 0x011d3a}, + {0x011d3c, 0x011d3d}, + {0x011d3f, 0x011d41}, + {0x011d43, 0x011d43}, + {0x011d46, 0x011d46}, + {0x011d47, 0x011d47}, + {0x011d60, 0x011d65}, + {0x011d67, 0x011d68}, + {0x011d6a, 0x011d89}, + {0x011d8a, 0x011d8e}, + {0x011d90, 0x011d91}, + {0x011d93, 0x011d94}, + {0x011d95, 0x011d95}, + {0x011d96, 0x011d96}, + {0x011d98, 0x011d98}, + {0x011ee0, 0x011ef2}, + {0x011ef3, 0x011ef4}, + {0x011ef5, 0x011ef6}, + {0x011f00, 0x011f01}, + {0x011f02, 0x011f02}, + {0x011f03, 0x011f03}, + {0x011f04, 0x011f10}, + {0x011f12, 0x011f33}, + {0x011f34, 0x011f35}, + {0x011f36, 0x011f3a}, + {0x011f3e, 0x011f3f}, + {0x011f40, 0x011f40}, + {0x011fb0, 0x011fb0}, + {0x012000, 0x012399}, + {0x012400, 0x01246e}, + {0x012480, 0x012543}, + {0x012f90, 0x012ff0}, + {0x013000, 0x01342f}, + {0x013441, 0x013446}, + {0x014400, 0x014646}, + {0x016800, 0x016a38}, + {0x016a40, 0x016a5e}, + {0x016a70, 0x016abe}, + {0x016ad0, 0x016aed}, + {0x016b00, 0x016b2f}, + {0x016b40, 0x016b43}, + {0x016b63, 0x016b77}, + {0x016b7d, 0x016b8f}, + {0x016e40, 0x016e7f}, + {0x016f00, 0x016f4a}, + {0x016f4f, 0x016f4f}, + {0x016f50, 0x016f50}, + {0x016f51, 0x016f87}, + {0x016f8f, 0x016f92}, + {0x016f93, 0x016f9f}, + {0x016fe0, 0x016fe1}, + {0x016fe3, 0x016fe3}, + {0x016ff0, 0x016ff1}, + {0x017000, 0x0187f7}, + {0x018800, 0x018cd5}, + {0x018d00, 0x018d08}, + {0x01aff0, 0x01aff3}, + {0x01aff5, 0x01affb}, + {0x01affd, 0x01affe}, + {0x01b000, 0x01b122}, + {0x01b132, 0x01b132}, + {0x01b150, 0x01b152}, + {0x01b155, 0x01b155}, + {0x01b164, 0x01b167}, + {0x01b170, 0x01b2fb}, + {0x01bc00, 0x01bc6a}, + {0x01bc70, 0x01bc7c}, + {0x01bc80, 0x01bc88}, + {0x01bc90, 0x01bc99}, + {0x01bc9e, 0x01bc9e}, + {0x01d400, 0x01d454}, + {0x01d456, 0x01d49c}, + {0x01d49e, 0x01d49f}, + {0x01d4a2, 0x01d4a2}, + {0x01d4a5, 0x01d4a6}, + {0x01d4a9, 0x01d4ac}, + {0x01d4ae, 0x01d4b9}, + {0x01d4bb, 0x01d4bb}, + {0x01d4bd, 0x01d4c3}, + {0x01d4c5, 0x01d505}, + {0x01d507, 0x01d50a}, + {0x01d50d, 0x01d514}, + {0x01d516, 0x01d51c}, + {0x01d51e, 0x01d539}, + {0x01d53b, 0x01d53e}, + {0x01d540, 0x01d544}, + {0x01d546, 0x01d546}, + {0x01d54a, 0x01d550}, + {0x01d552, 0x01d6a5}, + {0x01d6a8, 0x01d6c0}, + {0x01d6c2, 0x01d6da}, + {0x01d6dc, 0x01d6fa}, + {0x01d6fc, 0x01d714}, + {0x01d716, 0x01d734}, + {0x01d736, 0x01d74e}, + {0x01d750, 0x01d76e}, + {0x01d770, 0x01d788}, + {0x01d78a, 0x01d7a8}, + {0x01d7aa, 0x01d7c2}, + {0x01d7c4, 0x01d7cb}, + {0x01df00, 0x01df09}, + {0x01df0a, 0x01df0a}, + {0x01df0b, 0x01df1e}, + {0x01df25, 0x01df2a}, + {0x01e000, 0x01e006}, + {0x01e008, 0x01e018}, + {0x01e01b, 0x01e021}, + {0x01e023, 0x01e024}, + {0x01e026, 0x01e02a}, + {0x01e030, 0x01e06d}, + {0x01e08f, 0x01e08f}, + {0x01e100, 0x01e12c}, + {0x01e137, 0x01e13d}, + {0x01e14e, 0x01e14e}, + {0x01e290, 0x01e2ad}, + {0x01e2c0, 0x01e2eb}, + {0x01e4d0, 0x01e4ea}, + {0x01e4eb, 0x01e4eb}, + {0x01e7e0, 0x01e7e6}, + {0x01e7e8, 0x01e7eb}, + {0x01e7ed, 0x01e7ee}, + {0x01e7f0, 0x01e7fe}, + {0x01e800, 0x01e8c4}, + {0x01e900, 0x01e943}, + {0x01e947, 0x01e947}, + {0x01e94b, 0x01e94b}, + {0x01ee00, 0x01ee03}, + {0x01ee05, 0x01ee1f}, + {0x01ee21, 0x01ee22}, + {0x01ee24, 0x01ee24}, + {0x01ee27, 0x01ee27}, + {0x01ee29, 0x01ee32}, + {0x01ee34, 0x01ee37}, + {0x01ee39, 0x01ee39}, + {0x01ee3b, 0x01ee3b}, + {0x01ee42, 0x01ee42}, + {0x01ee47, 0x01ee47}, + {0x01ee49, 0x01ee49}, + {0x01ee4b, 0x01ee4b}, + {0x01ee4d, 0x01ee4f}, + {0x01ee51, 0x01ee52}, + {0x01ee54, 0x01ee54}, + {0x01ee57, 0x01ee57}, + {0x01ee59, 0x01ee59}, + {0x01ee5b, 0x01ee5b}, + {0x01ee5d, 0x01ee5d}, + {0x01ee5f, 0x01ee5f}, + {0x01ee61, 0x01ee62}, + {0x01ee64, 0x01ee64}, + {0x01ee67, 0x01ee6a}, + {0x01ee6c, 0x01ee72}, + {0x01ee74, 0x01ee77}, + {0x01ee79, 0x01ee7c}, + {0x01ee7e, 0x01ee7e}, + {0x01ee80, 0x01ee89}, + {0x01ee8b, 0x01ee9b}, + {0x01eea1, 0x01eea3}, + {0x01eea5, 0x01eea9}, + {0x01eeab, 0x01eebb}, + {0x01f130, 0x01f149}, + {0x01f150, 0x01f169}, + {0x01f170, 0x01f189}, + {0x020000, 0x02a6df}, + {0x02a700, 0x02b739}, + {0x02b740, 0x02b81d}, + {0x02b820, 0x02cea1}, + {0x02ceb0, 0x02ebe0}, + {0x02ebf0, 0x02ee5d}, + {0x02f800, 0x02fa1d}, + {0x030000, 0x03134a}, + {0x031350, 0x0323af}, +}; + +/* table of Unicode codepoint ranges of Lowercase characters */ +static const pg_unicode_range unicode_lowercase[686] = +{ + {0x000061, 0x00007a}, + {0x0000aa, 0x0000aa}, + {0x0000b5, 0x0000b5}, + {0x0000ba, 0x0000ba}, + {0x0000df, 0x0000f6}, + {0x0000f8, 0x0000ff}, + {0x000101, 0x000101}, + {0x000103, 0x000103}, + {0x000105, 0x000105}, + {0x000107, 0x000107}, + {0x000109, 0x000109}, + {0x00010b, 0x00010b}, + {0x00010d, 0x00010d}, + {0x00010f, 0x00010f}, + {0x000111, 0x000111}, + {0x000113, 0x000113}, + {0x000115, 0x000115}, + {0x000117, 0x000117}, + {0x000119, 0x000119}, + {0x00011b, 0x00011b}, + {0x00011d, 0x00011d}, + {0x00011f, 0x00011f}, + {0x000121, 0x000121}, + {0x000123, 0x000123}, + {0x000125, 0x000125}, + {0x000127, 0x000127}, + {0x000129, 0x000129}, + {0x00012b, 0x00012b}, + {0x00012d, 0x00012d}, + {0x00012f, 0x00012f}, + {0x000131, 0x000131}, + {0x000133, 0x000133}, + {0x000135, 0x000135}, + {0x000137, 0x000138}, + {0x00013a, 0x00013a}, + {0x00013c, 0x00013c}, + {0x00013e, 0x00013e}, + {0x000140, 0x000140}, + {0x000142, 0x000142}, + {0x000144, 0x000144}, + {0x000146, 0x000146}, + {0x000148, 0x000149}, + {0x00014b, 0x00014b}, + {0x00014d, 0x00014d}, + {0x00014f, 0x00014f}, + {0x000151, 0x000151}, + {0x000153, 0x000153}, + {0x000155, 0x000155}, + {0x000157, 0x000157}, + {0x000159, 0x000159}, + {0x00015b, 0x00015b}, + {0x00015d, 0x00015d}, + {0x00015f, 0x00015f}, + {0x000161, 0x000161}, + {0x000163, 0x000163}, + {0x000165, 0x000165}, + {0x000167, 0x000167}, + {0x000169, 0x000169}, + {0x00016b, 0x00016b}, + {0x00016d, 0x00016d}, + {0x00016f, 0x00016f}, + {0x000171, 0x000171}, + {0x000173, 0x000173}, + {0x000175, 0x000175}, + {0x000177, 0x000177}, + {0x00017a, 0x00017a}, + {0x00017c, 0x00017c}, + {0x00017e, 0x000180}, + {0x000183, 0x000183}, + {0x000185, 0x000185}, + {0x000188, 0x000188}, + {0x00018c, 0x00018d}, + {0x000192, 0x000192}, + {0x000195, 0x000195}, + {0x000199, 0x00019b}, + {0x00019e, 0x00019e}, + {0x0001a1, 0x0001a1}, + {0x0001a3, 0x0001a3}, + {0x0001a5, 0x0001a5}, + {0x0001a8, 0x0001a8}, + {0x0001aa, 0x0001ab}, + {0x0001ad, 0x0001ad}, + {0x0001b0, 0x0001b0}, + {0x0001b4, 0x0001b4}, + {0x0001b6, 0x0001b6}, + {0x0001b9, 0x0001ba}, + {0x0001bd, 0x0001bf}, + {0x0001c6, 0x0001c6}, + {0x0001c9, 0x0001c9}, + {0x0001cc, 0x0001cc}, + {0x0001ce, 0x0001ce}, + {0x0001d0, 0x0001d0}, + {0x0001d2, 0x0001d2}, + {0x0001d4, 0x0001d4}, + {0x0001d6, 0x0001d6}, + {0x0001d8, 0x0001d8}, + {0x0001da, 0x0001da}, + {0x0001dc, 0x0001dd}, + {0x0001df, 0x0001df}, + {0x0001e1, 0x0001e1}, + {0x0001e3, 0x0001e3}, + {0x0001e5, 0x0001e5}, + {0x0001e7, 0x0001e7}, + {0x0001e9, 0x0001e9}, + {0x0001eb, 0x0001eb}, + {0x0001ed, 0x0001ed}, + {0x0001ef, 0x0001f0}, + {0x0001f3, 0x0001f3}, + {0x0001f5, 0x0001f5}, + {0x0001f9, 0x0001f9}, + {0x0001fb, 0x0001fb}, + {0x0001fd, 0x0001fd}, + {0x0001ff, 0x0001ff}, + {0x000201, 0x000201}, + {0x000203, 0x000203}, + {0x000205, 0x000205}, + {0x000207, 0x000207}, + {0x000209, 0x000209}, + {0x00020b, 0x00020b}, + {0x00020d, 0x00020d}, + {0x00020f, 0x00020f}, + {0x000211, 0x000211}, + {0x000213, 0x000213}, + {0x000215, 0x000215}, + {0x000217, 0x000217}, + {0x000219, 0x000219}, + {0x00021b, 0x00021b}, + {0x00021d, 0x00021d}, + {0x00021f, 0x00021f}, + {0x000221, 0x000221}, + {0x000223, 0x000223}, + {0x000225, 0x000225}, + {0x000227, 0x000227}, + {0x000229, 0x000229}, + {0x00022b, 0x00022b}, + {0x00022d, 0x00022d}, + {0x00022f, 0x00022f}, + {0x000231, 0x000231}, + {0x000233, 0x000239}, + {0x00023c, 0x00023c}, + {0x00023f, 0x000240}, + {0x000242, 0x000242}, + {0x000247, 0x000247}, + {0x000249, 0x000249}, + {0x00024b, 0x00024b}, + {0x00024d, 0x00024d}, + {0x00024f, 0x000293}, + {0x000295, 0x0002af}, + {0x0002b0, 0x0002b8}, + {0x0002c0, 0x0002c1}, + {0x0002e0, 0x0002e4}, + {0x000345, 0x000345}, + {0x000371, 0x000371}, + {0x000373, 0x000373}, + {0x000377, 0x000377}, + {0x00037a, 0x00037a}, + {0x00037b, 0x00037d}, + {0x000390, 0x000390}, + {0x0003ac, 0x0003ce}, + {0x0003d0, 0x0003d1}, + {0x0003d5, 0x0003d7}, + {0x0003d9, 0x0003d9}, + {0x0003db, 0x0003db}, + {0x0003dd, 0x0003dd}, + {0x0003df, 0x0003df}, + {0x0003e1, 0x0003e1}, + {0x0003e3, 0x0003e3}, + {0x0003e5, 0x0003e5}, + {0x0003e7, 0x0003e7}, + {0x0003e9, 0x0003e9}, + {0x0003eb, 0x0003eb}, + {0x0003ed, 0x0003ed}, + {0x0003ef, 0x0003f3}, + {0x0003f5, 0x0003f5}, + {0x0003f8, 0x0003f8}, + {0x0003fb, 0x0003fc}, + {0x000430, 0x00045f}, + {0x000461, 0x000461}, + {0x000463, 0x000463}, + {0x000465, 0x000465}, + {0x000467, 0x000467}, + {0x000469, 0x000469}, + {0x00046b, 0x00046b}, + {0x00046d, 0x00046d}, + {0x00046f, 0x00046f}, + {0x000471, 0x000471}, + {0x000473, 0x000473}, + {0x000475, 0x000475}, + {0x000477, 0x000477}, + {0x000479, 0x000479}, + {0x00047b, 0x00047b}, + {0x00047d, 0x00047d}, + {0x00047f, 0x00047f}, + {0x000481, 0x000481}, + {0x00048b, 0x00048b}, + {0x00048d, 0x00048d}, + {0x00048f, 0x00048f}, + {0x000491, 0x000491}, + {0x000493, 0x000493}, + {0x000495, 0x000495}, + {0x000497, 0x000497}, + {0x000499, 0x000499}, + {0x00049b, 0x00049b}, + {0x00049d, 0x00049d}, + {0x00049f, 0x00049f}, + {0x0004a1, 0x0004a1}, + {0x0004a3, 0x0004a3}, + {0x0004a5, 0x0004a5}, + {0x0004a7, 0x0004a7}, + {0x0004a9, 0x0004a9}, + {0x0004ab, 0x0004ab}, + {0x0004ad, 0x0004ad}, + {0x0004af, 0x0004af}, + {0x0004b1, 0x0004b1}, + {0x0004b3, 0x0004b3}, + {0x0004b5, 0x0004b5}, + {0x0004b7, 0x0004b7}, + {0x0004b9, 0x0004b9}, + {0x0004bb, 0x0004bb}, + {0x0004bd, 0x0004bd}, + {0x0004bf, 0x0004bf}, + {0x0004c2, 0x0004c2}, + {0x0004c4, 0x0004c4}, + {0x0004c6, 0x0004c6}, + {0x0004c8, 0x0004c8}, + {0x0004ca, 0x0004ca}, + {0x0004cc, 0x0004cc}, + {0x0004ce, 0x0004cf}, + {0x0004d1, 0x0004d1}, + {0x0004d3, 0x0004d3}, + {0x0004d5, 0x0004d5}, + {0x0004d7, 0x0004d7}, + {0x0004d9, 0x0004d9}, + {0x0004db, 0x0004db}, + {0x0004dd, 0x0004dd}, + {0x0004df, 0x0004df}, + {0x0004e1, 0x0004e1}, + {0x0004e3, 0x0004e3}, + {0x0004e5, 0x0004e5}, + {0x0004e7, 0x0004e7}, + {0x0004e9, 0x0004e9}, + {0x0004eb, 0x0004eb}, + {0x0004ed, 0x0004ed}, + {0x0004ef, 0x0004ef}, + {0x0004f1, 0x0004f1}, + {0x0004f3, 0x0004f3}, + {0x0004f5, 0x0004f5}, + {0x0004f7, 0x0004f7}, + {0x0004f9, 0x0004f9}, + {0x0004fb, 0x0004fb}, + {0x0004fd, 0x0004fd}, + {0x0004ff, 0x0004ff}, + {0x000501, 0x000501}, + {0x000503, 0x000503}, + {0x000505, 0x000505}, + {0x000507, 0x000507}, + {0x000509, 0x000509}, + {0x00050b, 0x00050b}, + {0x00050d, 0x00050d}, + {0x00050f, 0x00050f}, + {0x000511, 0x000511}, + {0x000513, 0x000513}, + {0x000515, 0x000515}, + {0x000517, 0x000517}, + {0x000519, 0x000519}, + {0x00051b, 0x00051b}, + {0x00051d, 0x00051d}, + {0x00051f, 0x00051f}, + {0x000521, 0x000521}, + {0x000523, 0x000523}, + {0x000525, 0x000525}, + {0x000527, 0x000527}, + {0x000529, 0x000529}, + {0x00052b, 0x00052b}, + {0x00052d, 0x00052d}, + {0x00052f, 0x00052f}, + {0x000560, 0x000588}, + {0x0010d0, 0x0010fa}, + {0x0010fc, 0x0010fc}, + {0x0010fd, 0x0010ff}, + {0x0013f8, 0x0013fd}, + {0x001c80, 0x001c88}, + {0x001d00, 0x001d2b}, + {0x001d2c, 0x001d6a}, + {0x001d6b, 0x001d77}, + {0x001d78, 0x001d78}, + {0x001d79, 0x001d9a}, + {0x001d9b, 0x001dbf}, + {0x001e01, 0x001e01}, + {0x001e03, 0x001e03}, + {0x001e05, 0x001e05}, + {0x001e07, 0x001e07}, + {0x001e09, 0x001e09}, + {0x001e0b, 0x001e0b}, + {0x001e0d, 0x001e0d}, + {0x001e0f, 0x001e0f}, + {0x001e11, 0x001e11}, + {0x001e13, 0x001e13}, + {0x001e15, 0x001e15}, + {0x001e17, 0x001e17}, + {0x001e19, 0x001e19}, + {0x001e1b, 0x001e1b}, + {0x001e1d, 0x001e1d}, + {0x001e1f, 0x001e1f}, + {0x001e21, 0x001e21}, + {0x001e23, 0x001e23}, + {0x001e25, 0x001e25}, + {0x001e27, 0x001e27}, + {0x001e29, 0x001e29}, + {0x001e2b, 0x001e2b}, + {0x001e2d, 0x001e2d}, + {0x001e2f, 0x001e2f}, + {0x001e31, 0x001e31}, + {0x001e33, 0x001e33}, + {0x001e35, 0x001e35}, + {0x001e37, 0x001e37}, + {0x001e39, 0x001e39}, + {0x001e3b, 0x001e3b}, + {0x001e3d, 0x001e3d}, + {0x001e3f, 0x001e3f}, + {0x001e41, 0x001e41}, + {0x001e43, 0x001e43}, + {0x001e45, 0x001e45}, + {0x001e47, 0x001e47}, + {0x001e49, 0x001e49}, + {0x001e4b, 0x001e4b}, + {0x001e4d, 0x001e4d}, + {0x001e4f, 0x001e4f}, + {0x001e51, 0x001e51}, + {0x001e53, 0x001e53}, + {0x001e55, 0x001e55}, + {0x001e57, 0x001e57}, + {0x001e59, 0x001e59}, + {0x001e5b, 0x001e5b}, + {0x001e5d, 0x001e5d}, + {0x001e5f, 0x001e5f}, + {0x001e61, 0x001e61}, + {0x001e63, 0x001e63}, + {0x001e65, 0x001e65}, + {0x001e67, 0x001e67}, + {0x001e69, 0x001e69}, + {0x001e6b, 0x001e6b}, + {0x001e6d, 0x001e6d}, + {0x001e6f, 0x001e6f}, + {0x001e71, 0x001e71}, + {0x001e73, 0x001e73}, + {0x001e75, 0x001e75}, + {0x001e77, 0x001e77}, + {0x001e79, 0x001e79}, + {0x001e7b, 0x001e7b}, + {0x001e7d, 0x001e7d}, + {0x001e7f, 0x001e7f}, + {0x001e81, 0x001e81}, + {0x001e83, 0x001e83}, + {0x001e85, 0x001e85}, + {0x001e87, 0x001e87}, + {0x001e89, 0x001e89}, + {0x001e8b, 0x001e8b}, + {0x001e8d, 0x001e8d}, + {0x001e8f, 0x001e8f}, + {0x001e91, 0x001e91}, + {0x001e93, 0x001e93}, + {0x001e95, 0x001e9d}, + {0x001e9f, 0x001e9f}, + {0x001ea1, 0x001ea1}, + {0x001ea3, 0x001ea3}, + {0x001ea5, 0x001ea5}, + {0x001ea7, 0x001ea7}, + {0x001ea9, 0x001ea9}, + {0x001eab, 0x001eab}, + {0x001ead, 0x001ead}, + {0x001eaf, 0x001eaf}, + {0x001eb1, 0x001eb1}, + {0x001eb3, 0x001eb3}, + {0x001eb5, 0x001eb5}, + {0x001eb7, 0x001eb7}, + {0x001eb9, 0x001eb9}, + {0x001ebb, 0x001ebb}, + {0x001ebd, 0x001ebd}, + {0x001ebf, 0x001ebf}, + {0x001ec1, 0x001ec1}, + {0x001ec3, 0x001ec3}, + {0x001ec5, 0x001ec5}, + {0x001ec7, 0x001ec7}, + {0x001ec9, 0x001ec9}, + {0x001ecb, 0x001ecb}, + {0x001ecd, 0x001ecd}, + {0x001ecf, 0x001ecf}, + {0x001ed1, 0x001ed1}, + {0x001ed3, 0x001ed3}, + {0x001ed5, 0x001ed5}, + {0x001ed7, 0x001ed7}, + {0x001ed9, 0x001ed9}, + {0x001edb, 0x001edb}, + {0x001edd, 0x001edd}, + {0x001edf, 0x001edf}, + {0x001ee1, 0x001ee1}, + {0x001ee3, 0x001ee3}, + {0x001ee5, 0x001ee5}, + {0x001ee7, 0x001ee7}, + {0x001ee9, 0x001ee9}, + {0x001eeb, 0x001eeb}, + {0x001eed, 0x001eed}, + {0x001eef, 0x001eef}, + {0x001ef1, 0x001ef1}, + {0x001ef3, 0x001ef3}, + {0x001ef5, 0x001ef5}, + {0x001ef7, 0x001ef7}, + {0x001ef9, 0x001ef9}, + {0x001efb, 0x001efb}, + {0x001efd, 0x001efd}, + {0x001eff, 0x001f07}, + {0x001f10, 0x001f15}, + {0x001f20, 0x001f27}, + {0x001f30, 0x001f37}, + {0x001f40, 0x001f45}, + {0x001f50, 0x001f57}, + {0x001f60, 0x001f67}, + {0x001f70, 0x001f7d}, + {0x001f80, 0x001f87}, + {0x001f90, 0x001f97}, + {0x001fa0, 0x001fa7}, + {0x001fb0, 0x001fb4}, + {0x001fb6, 0x001fb7}, + {0x001fbe, 0x001fbe}, + {0x001fc2, 0x001fc4}, + {0x001fc6, 0x001fc7}, + {0x001fd0, 0x001fd3}, + {0x001fd6, 0x001fd7}, + {0x001fe0, 0x001fe7}, + {0x001ff2, 0x001ff4}, + {0x001ff6, 0x001ff7}, + {0x002071, 0x002071}, + {0x00207f, 0x00207f}, + {0x002090, 0x00209c}, + {0x00210a, 0x00210a}, + {0x00210e, 0x00210f}, + {0x002113, 0x002113}, + {0x00212f, 0x00212f}, + {0x002134, 0x002134}, + {0x002139, 0x002139}, + {0x00213c, 0x00213d}, + {0x002146, 0x002149}, + {0x00214e, 0x00214e}, + {0x002170, 0x00217f}, + {0x002184, 0x002184}, + {0x0024d0, 0x0024e9}, + {0x002c30, 0x002c5f}, + {0x002c61, 0x002c61}, + {0x002c65, 0x002c66}, + {0x002c68, 0x002c68}, + {0x002c6a, 0x002c6a}, + {0x002c6c, 0x002c6c}, + {0x002c71, 0x002c71}, + {0x002c73, 0x002c74}, + {0x002c76, 0x002c7b}, + {0x002c7c, 0x002c7d}, + {0x002c81, 0x002c81}, + {0x002c83, 0x002c83}, + {0x002c85, 0x002c85}, + {0x002c87, 0x002c87}, + {0x002c89, 0x002c89}, + {0x002c8b, 0x002c8b}, + {0x002c8d, 0x002c8d}, + {0x002c8f, 0x002c8f}, + {0x002c91, 0x002c91}, + {0x002c93, 0x002c93}, + {0x002c95, 0x002c95}, + {0x002c97, 0x002c97}, + {0x002c99, 0x002c99}, + {0x002c9b, 0x002c9b}, + {0x002c9d, 0x002c9d}, + {0x002c9f, 0x002c9f}, + {0x002ca1, 0x002ca1}, + {0x002ca3, 0x002ca3}, + {0x002ca5, 0x002ca5}, + {0x002ca7, 0x002ca7}, + {0x002ca9, 0x002ca9}, + {0x002cab, 0x002cab}, + {0x002cad, 0x002cad}, + {0x002caf, 0x002caf}, + {0x002cb1, 0x002cb1}, + {0x002cb3, 0x002cb3}, + {0x002cb5, 0x002cb5}, + {0x002cb7, 0x002cb7}, + {0x002cb9, 0x002cb9}, + {0x002cbb, 0x002cbb}, + {0x002cbd, 0x002cbd}, + {0x002cbf, 0x002cbf}, + {0x002cc1, 0x002cc1}, + {0x002cc3, 0x002cc3}, + {0x002cc5, 0x002cc5}, + {0x002cc7, 0x002cc7}, + {0x002cc9, 0x002cc9}, + {0x002ccb, 0x002ccb}, + {0x002ccd, 0x002ccd}, + {0x002ccf, 0x002ccf}, + {0x002cd1, 0x002cd1}, + {0x002cd3, 0x002cd3}, + {0x002cd5, 0x002cd5}, + {0x002cd7, 0x002cd7}, + {0x002cd9, 0x002cd9}, + {0x002cdb, 0x002cdb}, + {0x002cdd, 0x002cdd}, + {0x002cdf, 0x002cdf}, + {0x002ce1, 0x002ce1}, + {0x002ce3, 0x002ce4}, + {0x002cec, 0x002cec}, + {0x002cee, 0x002cee}, + {0x002cf3, 0x002cf3}, + {0x002d00, 0x002d25}, + {0x002d27, 0x002d27}, + {0x002d2d, 0x002d2d}, + {0x00a641, 0x00a641}, + {0x00a643, 0x00a643}, + {0x00a645, 0x00a645}, + {0x00a647, 0x00a647}, + {0x00a649, 0x00a649}, + {0x00a64b, 0x00a64b}, + {0x00a64d, 0x00a64d}, + {0x00a64f, 0x00a64f}, + {0x00a651, 0x00a651}, + {0x00a653, 0x00a653}, + {0x00a655, 0x00a655}, + {0x00a657, 0x00a657}, + {0x00a659, 0x00a659}, + {0x00a65b, 0x00a65b}, + {0x00a65d, 0x00a65d}, + {0x00a65f, 0x00a65f}, + {0x00a661, 0x00a661}, + {0x00a663, 0x00a663}, + {0x00a665, 0x00a665}, + {0x00a667, 0x00a667}, + {0x00a669, 0x00a669}, + {0x00a66b, 0x00a66b}, + {0x00a66d, 0x00a66d}, + {0x00a681, 0x00a681}, + {0x00a683, 0x00a683}, + {0x00a685, 0x00a685}, + {0x00a687, 0x00a687}, + {0x00a689, 0x00a689}, + {0x00a68b, 0x00a68b}, + {0x00a68d, 0x00a68d}, + {0x00a68f, 0x00a68f}, + {0x00a691, 0x00a691}, + {0x00a693, 0x00a693}, + {0x00a695, 0x00a695}, + {0x00a697, 0x00a697}, + {0x00a699, 0x00a699}, + {0x00a69b, 0x00a69b}, + {0x00a69c, 0x00a69d}, + {0x00a723, 0x00a723}, + {0x00a725, 0x00a725}, + {0x00a727, 0x00a727}, + {0x00a729, 0x00a729}, + {0x00a72b, 0x00a72b}, + {0x00a72d, 0x00a72d}, + {0x00a72f, 0x00a731}, + {0x00a733, 0x00a733}, + {0x00a735, 0x00a735}, + {0x00a737, 0x00a737}, + {0x00a739, 0x00a739}, + {0x00a73b, 0x00a73b}, + {0x00a73d, 0x00a73d}, + {0x00a73f, 0x00a73f}, + {0x00a741, 0x00a741}, + {0x00a743, 0x00a743}, + {0x00a745, 0x00a745}, + {0x00a747, 0x00a747}, + {0x00a749, 0x00a749}, + {0x00a74b, 0x00a74b}, + {0x00a74d, 0x00a74d}, + {0x00a74f, 0x00a74f}, + {0x00a751, 0x00a751}, + {0x00a753, 0x00a753}, + {0x00a755, 0x00a755}, + {0x00a757, 0x00a757}, + {0x00a759, 0x00a759}, + {0x00a75b, 0x00a75b}, + {0x00a75d, 0x00a75d}, + {0x00a75f, 0x00a75f}, + {0x00a761, 0x00a761}, + {0x00a763, 0x00a763}, + {0x00a765, 0x00a765}, + {0x00a767, 0x00a767}, + {0x00a769, 0x00a769}, + {0x00a76b, 0x00a76b}, + {0x00a76d, 0x00a76d}, + {0x00a76f, 0x00a76f}, + {0x00a770, 0x00a770}, + {0x00a771, 0x00a778}, + {0x00a77a, 0x00a77a}, + {0x00a77c, 0x00a77c}, + {0x00a77f, 0x00a77f}, + {0x00a781, 0x00a781}, + {0x00a783, 0x00a783}, + {0x00a785, 0x00a785}, + {0x00a787, 0x00a787}, + {0x00a78c, 0x00a78c}, + {0x00a78e, 0x00a78e}, + {0x00a791, 0x00a791}, + {0x00a793, 0x00a795}, + {0x00a797, 0x00a797}, + {0x00a799, 0x00a799}, + {0x00a79b, 0x00a79b}, + {0x00a79d, 0x00a79d}, + {0x00a79f, 0x00a79f}, + {0x00a7a1, 0x00a7a1}, + {0x00a7a3, 0x00a7a3}, + {0x00a7a5, 0x00a7a5}, + {0x00a7a7, 0x00a7a7}, + {0x00a7a9, 0x00a7a9}, + {0x00a7af, 0x00a7af}, + {0x00a7b5, 0x00a7b5}, + {0x00a7b7, 0x00a7b7}, + {0x00a7b9, 0x00a7b9}, + {0x00a7bb, 0x00a7bb}, + {0x00a7bd, 0x00a7bd}, + {0x00a7bf, 0x00a7bf}, + {0x00a7c1, 0x00a7c1}, + {0x00a7c3, 0x00a7c3}, + {0x00a7c8, 0x00a7c8}, + {0x00a7ca, 0x00a7ca}, + {0x00a7d1, 0x00a7d1}, + {0x00a7d3, 0x00a7d3}, + {0x00a7d5, 0x00a7d5}, + {0x00a7d7, 0x00a7d7}, + {0x00a7d9, 0x00a7d9}, + {0x00a7f2, 0x00a7f4}, + {0x00a7f6, 0x00a7f6}, + {0x00a7f8, 0x00a7f9}, + {0x00a7fa, 0x00a7fa}, + {0x00ab30, 0x00ab5a}, + {0x00ab5c, 0x00ab5f}, + {0x00ab60, 0x00ab68}, + {0x00ab69, 0x00ab69}, + {0x00ab70, 0x00abbf}, + {0x00fb00, 0x00fb06}, + {0x00fb13, 0x00fb17}, + {0x00ff41, 0x00ff5a}, + {0x010428, 0x01044f}, + {0x0104d8, 0x0104fb}, + {0x010597, 0x0105a1}, + {0x0105a3, 0x0105b1}, + {0x0105b3, 0x0105b9}, + {0x0105bb, 0x0105bc}, + {0x010780, 0x010780}, + {0x010783, 0x010785}, + {0x010787, 0x0107b0}, + {0x0107b2, 0x0107ba}, + {0x010cc0, 0x010cf2}, + {0x0118c0, 0x0118df}, + {0x016e60, 0x016e7f}, + {0x01d41a, 0x01d433}, + {0x01d44e, 0x01d454}, + {0x01d456, 0x01d467}, + {0x01d482, 0x01d49b}, + {0x01d4b6, 0x01d4b9}, + {0x01d4bb, 0x01d4bb}, + {0x01d4bd, 0x01d4c3}, + {0x01d4c5, 0x01d4cf}, + {0x01d4ea, 0x01d503}, + {0x01d51e, 0x01d537}, + {0x01d552, 0x01d56b}, + {0x01d586, 0x01d59f}, + {0x01d5ba, 0x01d5d3}, + {0x01d5ee, 0x01d607}, + {0x01d622, 0x01d63b}, + {0x01d656, 0x01d66f}, + {0x01d68a, 0x01d6a5}, + {0x01d6c2, 0x01d6da}, + {0x01d6dc, 0x01d6e1}, + {0x01d6fc, 0x01d714}, + {0x01d716, 0x01d71b}, + {0x01d736, 0x01d74e}, + {0x01d750, 0x01d755}, + {0x01d770, 0x01d788}, + {0x01d78a, 0x01d78f}, + {0x01d7aa, 0x01d7c2}, + {0x01d7c4, 0x01d7c9}, + {0x01d7cb, 0x01d7cb}, + {0x01df00, 0x01df09}, + {0x01df0b, 0x01df1e}, + {0x01df25, 0x01df2a}, + {0x01e030, 0x01e06d}, + {0x01e922, 0x01e943}, +}; + +/* table of Unicode codepoint ranges of Uppercase characters */ +static const pg_unicode_range unicode_uppercase[651] = +{ + {0x000041, 0x00005a}, + {0x0000c0, 0x0000d6}, + {0x0000d8, 0x0000de}, + {0x000100, 0x000100}, + {0x000102, 0x000102}, + {0x000104, 0x000104}, + {0x000106, 0x000106}, + {0x000108, 0x000108}, + {0x00010a, 0x00010a}, + {0x00010c, 0x00010c}, + {0x00010e, 0x00010e}, + {0x000110, 0x000110}, + {0x000112, 0x000112}, + {0x000114, 0x000114}, + {0x000116, 0x000116}, + {0x000118, 0x000118}, + {0x00011a, 0x00011a}, + {0x00011c, 0x00011c}, + {0x00011e, 0x00011e}, + {0x000120, 0x000120}, + {0x000122, 0x000122}, + {0x000124, 0x000124}, + {0x000126, 0x000126}, + {0x000128, 0x000128}, + {0x00012a, 0x00012a}, + {0x00012c, 0x00012c}, + {0x00012e, 0x00012e}, + {0x000130, 0x000130}, + {0x000132, 0x000132}, + {0x000134, 0x000134}, + {0x000136, 0x000136}, + {0x000139, 0x000139}, + {0x00013b, 0x00013b}, + {0x00013d, 0x00013d}, + {0x00013f, 0x00013f}, + {0x000141, 0x000141}, + {0x000143, 0x000143}, + {0x000145, 0x000145}, + {0x000147, 0x000147}, + {0x00014a, 0x00014a}, + {0x00014c, 0x00014c}, + {0x00014e, 0x00014e}, + {0x000150, 0x000150}, + {0x000152, 0x000152}, + {0x000154, 0x000154}, + {0x000156, 0x000156}, + {0x000158, 0x000158}, + {0x00015a, 0x00015a}, + {0x00015c, 0x00015c}, + {0x00015e, 0x00015e}, + {0x000160, 0x000160}, + {0x000162, 0x000162}, + {0x000164, 0x000164}, + {0x000166, 0x000166}, + {0x000168, 0x000168}, + {0x00016a, 0x00016a}, + {0x00016c, 0x00016c}, + {0x00016e, 0x00016e}, + {0x000170, 0x000170}, + {0x000172, 0x000172}, + {0x000174, 0x000174}, + {0x000176, 0x000176}, + {0x000178, 0x000179}, + {0x00017b, 0x00017b}, + {0x00017d, 0x00017d}, + {0x000181, 0x000182}, + {0x000184, 0x000184}, + {0x000186, 0x000187}, + {0x000189, 0x00018b}, + {0x00018e, 0x000191}, + {0x000193, 0x000194}, + {0x000196, 0x000198}, + {0x00019c, 0x00019d}, + {0x00019f, 0x0001a0}, + {0x0001a2, 0x0001a2}, + {0x0001a4, 0x0001a4}, + {0x0001a6, 0x0001a7}, + {0x0001a9, 0x0001a9}, + {0x0001ac, 0x0001ac}, + {0x0001ae, 0x0001af}, + {0x0001b1, 0x0001b3}, + {0x0001b5, 0x0001b5}, + {0x0001b7, 0x0001b8}, + {0x0001bc, 0x0001bc}, + {0x0001c4, 0x0001c4}, + {0x0001c7, 0x0001c7}, + {0x0001ca, 0x0001ca}, + {0x0001cd, 0x0001cd}, + {0x0001cf, 0x0001cf}, + {0x0001d1, 0x0001d1}, + {0x0001d3, 0x0001d3}, + {0x0001d5, 0x0001d5}, + {0x0001d7, 0x0001d7}, + {0x0001d9, 0x0001d9}, + {0x0001db, 0x0001db}, + {0x0001de, 0x0001de}, + {0x0001e0, 0x0001e0}, + {0x0001e2, 0x0001e2}, + {0x0001e4, 0x0001e4}, + {0x0001e6, 0x0001e6}, + {0x0001e8, 0x0001e8}, + {0x0001ea, 0x0001ea}, + {0x0001ec, 0x0001ec}, + {0x0001ee, 0x0001ee}, + {0x0001f1, 0x0001f1}, + {0x0001f4, 0x0001f4}, + {0x0001f6, 0x0001f8}, + {0x0001fa, 0x0001fa}, + {0x0001fc, 0x0001fc}, + {0x0001fe, 0x0001fe}, + {0x000200, 0x000200}, + {0x000202, 0x000202}, + {0x000204, 0x000204}, + {0x000206, 0x000206}, + {0x000208, 0x000208}, + {0x00020a, 0x00020a}, + {0x00020c, 0x00020c}, + {0x00020e, 0x00020e}, + {0x000210, 0x000210}, + {0x000212, 0x000212}, + {0x000214, 0x000214}, + {0x000216, 0x000216}, + {0x000218, 0x000218}, + {0x00021a, 0x00021a}, + {0x00021c, 0x00021c}, + {0x00021e, 0x00021e}, + {0x000220, 0x000220}, + {0x000222, 0x000222}, + {0x000224, 0x000224}, + {0x000226, 0x000226}, + {0x000228, 0x000228}, + {0x00022a, 0x00022a}, + {0x00022c, 0x00022c}, + {0x00022e, 0x00022e}, + {0x000230, 0x000230}, + {0x000232, 0x000232}, + {0x00023a, 0x00023b}, + {0x00023d, 0x00023e}, + {0x000241, 0x000241}, + {0x000243, 0x000246}, + {0x000248, 0x000248}, + {0x00024a, 0x00024a}, + {0x00024c, 0x00024c}, + {0x00024e, 0x00024e}, + {0x000370, 0x000370}, + {0x000372, 0x000372}, + {0x000376, 0x000376}, + {0x00037f, 0x00037f}, + {0x000386, 0x000386}, + {0x000388, 0x00038a}, + {0x00038c, 0x00038c}, + {0x00038e, 0x00038f}, + {0x000391, 0x0003a1}, + {0x0003a3, 0x0003ab}, + {0x0003cf, 0x0003cf}, + {0x0003d2, 0x0003d4}, + {0x0003d8, 0x0003d8}, + {0x0003da, 0x0003da}, + {0x0003dc, 0x0003dc}, + {0x0003de, 0x0003de}, + {0x0003e0, 0x0003e0}, + {0x0003e2, 0x0003e2}, + {0x0003e4, 0x0003e4}, + {0x0003e6, 0x0003e6}, + {0x0003e8, 0x0003e8}, + {0x0003ea, 0x0003ea}, + {0x0003ec, 0x0003ec}, + {0x0003ee, 0x0003ee}, + {0x0003f4, 0x0003f4}, + {0x0003f7, 0x0003f7}, + {0x0003f9, 0x0003fa}, + {0x0003fd, 0x00042f}, + {0x000460, 0x000460}, + {0x000462, 0x000462}, + {0x000464, 0x000464}, + {0x000466, 0x000466}, + {0x000468, 0x000468}, + {0x00046a, 0x00046a}, + {0x00046c, 0x00046c}, + {0x00046e, 0x00046e}, + {0x000470, 0x000470}, + {0x000472, 0x000472}, + {0x000474, 0x000474}, + {0x000476, 0x000476}, + {0x000478, 0x000478}, + {0x00047a, 0x00047a}, + {0x00047c, 0x00047c}, + {0x00047e, 0x00047e}, + {0x000480, 0x000480}, + {0x00048a, 0x00048a}, + {0x00048c, 0x00048c}, + {0x00048e, 0x00048e}, + {0x000490, 0x000490}, + {0x000492, 0x000492}, + {0x000494, 0x000494}, + {0x000496, 0x000496}, + {0x000498, 0x000498}, + {0x00049a, 0x00049a}, + {0x00049c, 0x00049c}, + {0x00049e, 0x00049e}, + {0x0004a0, 0x0004a0}, + {0x0004a2, 0x0004a2}, + {0x0004a4, 0x0004a4}, + {0x0004a6, 0x0004a6}, + {0x0004a8, 0x0004a8}, + {0x0004aa, 0x0004aa}, + {0x0004ac, 0x0004ac}, + {0x0004ae, 0x0004ae}, + {0x0004b0, 0x0004b0}, + {0x0004b2, 0x0004b2}, + {0x0004b4, 0x0004b4}, + {0x0004b6, 0x0004b6}, + {0x0004b8, 0x0004b8}, + {0x0004ba, 0x0004ba}, + {0x0004bc, 0x0004bc}, + {0x0004be, 0x0004be}, + {0x0004c0, 0x0004c1}, + {0x0004c3, 0x0004c3}, + {0x0004c5, 0x0004c5}, + {0x0004c7, 0x0004c7}, + {0x0004c9, 0x0004c9}, + {0x0004cb, 0x0004cb}, + {0x0004cd, 0x0004cd}, + {0x0004d0, 0x0004d0}, + {0x0004d2, 0x0004d2}, + {0x0004d4, 0x0004d4}, + {0x0004d6, 0x0004d6}, + {0x0004d8, 0x0004d8}, + {0x0004da, 0x0004da}, + {0x0004dc, 0x0004dc}, + {0x0004de, 0x0004de}, + {0x0004e0, 0x0004e0}, + {0x0004e2, 0x0004e2}, + {0x0004e4, 0x0004e4}, + {0x0004e6, 0x0004e6}, + {0x0004e8, 0x0004e8}, + {0x0004ea, 0x0004ea}, + {0x0004ec, 0x0004ec}, + {0x0004ee, 0x0004ee}, + {0x0004f0, 0x0004f0}, + {0x0004f2, 0x0004f2}, + {0x0004f4, 0x0004f4}, + {0x0004f6, 0x0004f6}, + {0x0004f8, 0x0004f8}, + {0x0004fa, 0x0004fa}, + {0x0004fc, 0x0004fc}, + {0x0004fe, 0x0004fe}, + {0x000500, 0x000500}, + {0x000502, 0x000502}, + {0x000504, 0x000504}, + {0x000506, 0x000506}, + {0x000508, 0x000508}, + {0x00050a, 0x00050a}, + {0x00050c, 0x00050c}, + {0x00050e, 0x00050e}, + {0x000510, 0x000510}, + {0x000512, 0x000512}, + {0x000514, 0x000514}, + {0x000516, 0x000516}, + {0x000518, 0x000518}, + {0x00051a, 0x00051a}, + {0x00051c, 0x00051c}, + {0x00051e, 0x00051e}, + {0x000520, 0x000520}, + {0x000522, 0x000522}, + {0x000524, 0x000524}, + {0x000526, 0x000526}, + {0x000528, 0x000528}, + {0x00052a, 0x00052a}, + {0x00052c, 0x00052c}, + {0x00052e, 0x00052e}, + {0x000531, 0x000556}, + {0x0010a0, 0x0010c5}, + {0x0010c7, 0x0010c7}, + {0x0010cd, 0x0010cd}, + {0x0013a0, 0x0013f5}, + {0x001c90, 0x001cba}, + {0x001cbd, 0x001cbf}, + {0x001e00, 0x001e00}, + {0x001e02, 0x001e02}, + {0x001e04, 0x001e04}, + {0x001e06, 0x001e06}, + {0x001e08, 0x001e08}, + {0x001e0a, 0x001e0a}, + {0x001e0c, 0x001e0c}, + {0x001e0e, 0x001e0e}, + {0x001e10, 0x001e10}, + {0x001e12, 0x001e12}, + {0x001e14, 0x001e14}, + {0x001e16, 0x001e16}, + {0x001e18, 0x001e18}, + {0x001e1a, 0x001e1a}, + {0x001e1c, 0x001e1c}, + {0x001e1e, 0x001e1e}, + {0x001e20, 0x001e20}, + {0x001e22, 0x001e22}, + {0x001e24, 0x001e24}, + {0x001e26, 0x001e26}, + {0x001e28, 0x001e28}, + {0x001e2a, 0x001e2a}, + {0x001e2c, 0x001e2c}, + {0x001e2e, 0x001e2e}, + {0x001e30, 0x001e30}, + {0x001e32, 0x001e32}, + {0x001e34, 0x001e34}, + {0x001e36, 0x001e36}, + {0x001e38, 0x001e38}, + {0x001e3a, 0x001e3a}, + {0x001e3c, 0x001e3c}, + {0x001e3e, 0x001e3e}, + {0x001e40, 0x001e40}, + {0x001e42, 0x001e42}, + {0x001e44, 0x001e44}, + {0x001e46, 0x001e46}, + {0x001e48, 0x001e48}, + {0x001e4a, 0x001e4a}, + {0x001e4c, 0x001e4c}, + {0x001e4e, 0x001e4e}, + {0x001e50, 0x001e50}, + {0x001e52, 0x001e52}, + {0x001e54, 0x001e54}, + {0x001e56, 0x001e56}, + {0x001e58, 0x001e58}, + {0x001e5a, 0x001e5a}, + {0x001e5c, 0x001e5c}, + {0x001e5e, 0x001e5e}, + {0x001e60, 0x001e60}, + {0x001e62, 0x001e62}, + {0x001e64, 0x001e64}, + {0x001e66, 0x001e66}, + {0x001e68, 0x001e68}, + {0x001e6a, 0x001e6a}, + {0x001e6c, 0x001e6c}, + {0x001e6e, 0x001e6e}, + {0x001e70, 0x001e70}, + {0x001e72, 0x001e72}, + {0x001e74, 0x001e74}, + {0x001e76, 0x001e76}, + {0x001e78, 0x001e78}, + {0x001e7a, 0x001e7a}, + {0x001e7c, 0x001e7c}, + {0x001e7e, 0x001e7e}, + {0x001e80, 0x001e80}, + {0x001e82, 0x001e82}, + {0x001e84, 0x001e84}, + {0x001e86, 0x001e86}, + {0x001e88, 0x001e88}, + {0x001e8a, 0x001e8a}, + {0x001e8c, 0x001e8c}, + {0x001e8e, 0x001e8e}, + {0x001e90, 0x001e90}, + {0x001e92, 0x001e92}, + {0x001e94, 0x001e94}, + {0x001e9e, 0x001e9e}, + {0x001ea0, 0x001ea0}, + {0x001ea2, 0x001ea2}, + {0x001ea4, 0x001ea4}, + {0x001ea6, 0x001ea6}, + {0x001ea8, 0x001ea8}, + {0x001eaa, 0x001eaa}, + {0x001eac, 0x001eac}, + {0x001eae, 0x001eae}, + {0x001eb0, 0x001eb0}, + {0x001eb2, 0x001eb2}, + {0x001eb4, 0x001eb4}, + {0x001eb6, 0x001eb6}, + {0x001eb8, 0x001eb8}, + {0x001eba, 0x001eba}, + {0x001ebc, 0x001ebc}, + {0x001ebe, 0x001ebe}, + {0x001ec0, 0x001ec0}, + {0x001ec2, 0x001ec2}, + {0x001ec4, 0x001ec4}, + {0x001ec6, 0x001ec6}, + {0x001ec8, 0x001ec8}, + {0x001eca, 0x001eca}, + {0x001ecc, 0x001ecc}, + {0x001ece, 0x001ece}, + {0x001ed0, 0x001ed0}, + {0x001ed2, 0x001ed2}, + {0x001ed4, 0x001ed4}, + {0x001ed6, 0x001ed6}, + {0x001ed8, 0x001ed8}, + {0x001eda, 0x001eda}, + {0x001edc, 0x001edc}, + {0x001ede, 0x001ede}, + {0x001ee0, 0x001ee0}, + {0x001ee2, 0x001ee2}, + {0x001ee4, 0x001ee4}, + {0x001ee6, 0x001ee6}, + {0x001ee8, 0x001ee8}, + {0x001eea, 0x001eea}, + {0x001eec, 0x001eec}, + {0x001eee, 0x001eee}, + {0x001ef0, 0x001ef0}, + {0x001ef2, 0x001ef2}, + {0x001ef4, 0x001ef4}, + {0x001ef6, 0x001ef6}, + {0x001ef8, 0x001ef8}, + {0x001efa, 0x001efa}, + {0x001efc, 0x001efc}, + {0x001efe, 0x001efe}, + {0x001f08, 0x001f0f}, + {0x001f18, 0x001f1d}, + {0x001f28, 0x001f2f}, + {0x001f38, 0x001f3f}, + {0x001f48, 0x001f4d}, + {0x001f59, 0x001f59}, + {0x001f5b, 0x001f5b}, + {0x001f5d, 0x001f5d}, + {0x001f5f, 0x001f5f}, + {0x001f68, 0x001f6f}, + {0x001fb8, 0x001fbb}, + {0x001fc8, 0x001fcb}, + {0x001fd8, 0x001fdb}, + {0x001fe8, 0x001fec}, + {0x001ff8, 0x001ffb}, + {0x002102, 0x002102}, + {0x002107, 0x002107}, + {0x00210b, 0x00210d}, + {0x002110, 0x002112}, + {0x002115, 0x002115}, + {0x002119, 0x00211d}, + {0x002124, 0x002124}, + {0x002126, 0x002126}, + {0x002128, 0x002128}, + {0x00212a, 0x00212d}, + {0x002130, 0x002133}, + {0x00213e, 0x00213f}, + {0x002145, 0x002145}, + {0x002160, 0x00216f}, + {0x002183, 0x002183}, + {0x0024b6, 0x0024cf}, + {0x002c00, 0x002c2f}, + {0x002c60, 0x002c60}, + {0x002c62, 0x002c64}, + {0x002c67, 0x002c67}, + {0x002c69, 0x002c69}, + {0x002c6b, 0x002c6b}, + {0x002c6d, 0x002c70}, + {0x002c72, 0x002c72}, + {0x002c75, 0x002c75}, + {0x002c7e, 0x002c80}, + {0x002c82, 0x002c82}, + {0x002c84, 0x002c84}, + {0x002c86, 0x002c86}, + {0x002c88, 0x002c88}, + {0x002c8a, 0x002c8a}, + {0x002c8c, 0x002c8c}, + {0x002c8e, 0x002c8e}, + {0x002c90, 0x002c90}, + {0x002c92, 0x002c92}, + {0x002c94, 0x002c94}, + {0x002c96, 0x002c96}, + {0x002c98, 0x002c98}, + {0x002c9a, 0x002c9a}, + {0x002c9c, 0x002c9c}, + {0x002c9e, 0x002c9e}, + {0x002ca0, 0x002ca0}, + {0x002ca2, 0x002ca2}, + {0x002ca4, 0x002ca4}, + {0x002ca6, 0x002ca6}, + {0x002ca8, 0x002ca8}, + {0x002caa, 0x002caa}, + {0x002cac, 0x002cac}, + {0x002cae, 0x002cae}, + {0x002cb0, 0x002cb0}, + {0x002cb2, 0x002cb2}, + {0x002cb4, 0x002cb4}, + {0x002cb6, 0x002cb6}, + {0x002cb8, 0x002cb8}, + {0x002cba, 0x002cba}, + {0x002cbc, 0x002cbc}, + {0x002cbe, 0x002cbe}, + {0x002cc0, 0x002cc0}, + {0x002cc2, 0x002cc2}, + {0x002cc4, 0x002cc4}, + {0x002cc6, 0x002cc6}, + {0x002cc8, 0x002cc8}, + {0x002cca, 0x002cca}, + {0x002ccc, 0x002ccc}, + {0x002cce, 0x002cce}, + {0x002cd0, 0x002cd0}, + {0x002cd2, 0x002cd2}, + {0x002cd4, 0x002cd4}, + {0x002cd6, 0x002cd6}, + {0x002cd8, 0x002cd8}, + {0x002cda, 0x002cda}, + {0x002cdc, 0x002cdc}, + {0x002cde, 0x002cde}, + {0x002ce0, 0x002ce0}, + {0x002ce2, 0x002ce2}, + {0x002ceb, 0x002ceb}, + {0x002ced, 0x002ced}, + {0x002cf2, 0x002cf2}, + {0x00a640, 0x00a640}, + {0x00a642, 0x00a642}, + {0x00a644, 0x00a644}, + {0x00a646, 0x00a646}, + {0x00a648, 0x00a648}, + {0x00a64a, 0x00a64a}, + {0x00a64c, 0x00a64c}, + {0x00a64e, 0x00a64e}, + {0x00a650, 0x00a650}, + {0x00a652, 0x00a652}, + {0x00a654, 0x00a654}, + {0x00a656, 0x00a656}, + {0x00a658, 0x00a658}, + {0x00a65a, 0x00a65a}, + {0x00a65c, 0x00a65c}, + {0x00a65e, 0x00a65e}, + {0x00a660, 0x00a660}, + {0x00a662, 0x00a662}, + {0x00a664, 0x00a664}, + {0x00a666, 0x00a666}, + {0x00a668, 0x00a668}, + {0x00a66a, 0x00a66a}, + {0x00a66c, 0x00a66c}, + {0x00a680, 0x00a680}, + {0x00a682, 0x00a682}, + {0x00a684, 0x00a684}, + {0x00a686, 0x00a686}, + {0x00a688, 0x00a688}, + {0x00a68a, 0x00a68a}, + {0x00a68c, 0x00a68c}, + {0x00a68e, 0x00a68e}, + {0x00a690, 0x00a690}, + {0x00a692, 0x00a692}, + {0x00a694, 0x00a694}, + {0x00a696, 0x00a696}, + {0x00a698, 0x00a698}, + {0x00a69a, 0x00a69a}, + {0x00a722, 0x00a722}, + {0x00a724, 0x00a724}, + {0x00a726, 0x00a726}, + {0x00a728, 0x00a728}, + {0x00a72a, 0x00a72a}, + {0x00a72c, 0x00a72c}, + {0x00a72e, 0x00a72e}, + {0x00a732, 0x00a732}, + {0x00a734, 0x00a734}, + {0x00a736, 0x00a736}, + {0x00a738, 0x00a738}, + {0x00a73a, 0x00a73a}, + {0x00a73c, 0x00a73c}, + {0x00a73e, 0x00a73e}, + {0x00a740, 0x00a740}, + {0x00a742, 0x00a742}, + {0x00a744, 0x00a744}, + {0x00a746, 0x00a746}, + {0x00a748, 0x00a748}, + {0x00a74a, 0x00a74a}, + {0x00a74c, 0x00a74c}, + {0x00a74e, 0x00a74e}, + {0x00a750, 0x00a750}, + {0x00a752, 0x00a752}, + {0x00a754, 0x00a754}, + {0x00a756, 0x00a756}, + {0x00a758, 0x00a758}, + {0x00a75a, 0x00a75a}, + {0x00a75c, 0x00a75c}, + {0x00a75e, 0x00a75e}, + {0x00a760, 0x00a760}, + {0x00a762, 0x00a762}, + {0x00a764, 0x00a764}, + {0x00a766, 0x00a766}, + {0x00a768, 0x00a768}, + {0x00a76a, 0x00a76a}, + {0x00a76c, 0x00a76c}, + {0x00a76e, 0x00a76e}, + {0x00a779, 0x00a779}, + {0x00a77b, 0x00a77b}, + {0x00a77d, 0x00a77e}, + {0x00a780, 0x00a780}, + {0x00a782, 0x00a782}, + {0x00a784, 0x00a784}, + {0x00a786, 0x00a786}, + {0x00a78b, 0x00a78b}, + {0x00a78d, 0x00a78d}, + {0x00a790, 0x00a790}, + {0x00a792, 0x00a792}, + {0x00a796, 0x00a796}, + {0x00a798, 0x00a798}, + {0x00a79a, 0x00a79a}, + {0x00a79c, 0x00a79c}, + {0x00a79e, 0x00a79e}, + {0x00a7a0, 0x00a7a0}, + {0x00a7a2, 0x00a7a2}, + {0x00a7a4, 0x00a7a4}, + {0x00a7a6, 0x00a7a6}, + {0x00a7a8, 0x00a7a8}, + {0x00a7aa, 0x00a7ae}, + {0x00a7b0, 0x00a7b4}, + {0x00a7b6, 0x00a7b6}, + {0x00a7b8, 0x00a7b8}, + {0x00a7ba, 0x00a7ba}, + {0x00a7bc, 0x00a7bc}, + {0x00a7be, 0x00a7be}, + {0x00a7c0, 0x00a7c0}, + {0x00a7c2, 0x00a7c2}, + {0x00a7c4, 0x00a7c7}, + {0x00a7c9, 0x00a7c9}, + {0x00a7d0, 0x00a7d0}, + {0x00a7d6, 0x00a7d6}, + {0x00a7d8, 0x00a7d8}, + {0x00a7f5, 0x00a7f5}, + {0x00ff21, 0x00ff3a}, + {0x010400, 0x010427}, + {0x0104b0, 0x0104d3}, + {0x010570, 0x01057a}, + {0x01057c, 0x01058a}, + {0x01058c, 0x010592}, + {0x010594, 0x010595}, + {0x010c80, 0x010cb2}, + {0x0118a0, 0x0118bf}, + {0x016e40, 0x016e5f}, + {0x01d400, 0x01d419}, + {0x01d434, 0x01d44d}, + {0x01d468, 0x01d481}, + {0x01d49c, 0x01d49c}, + {0x01d49e, 0x01d49f}, + {0x01d4a2, 0x01d4a2}, + {0x01d4a5, 0x01d4a6}, + {0x01d4a9, 0x01d4ac}, + {0x01d4ae, 0x01d4b5}, + {0x01d4d0, 0x01d4e9}, + {0x01d504, 0x01d505}, + {0x01d507, 0x01d50a}, + {0x01d50d, 0x01d514}, + {0x01d516, 0x01d51c}, + {0x01d538, 0x01d539}, + {0x01d53b, 0x01d53e}, + {0x01d540, 0x01d544}, + {0x01d546, 0x01d546}, + {0x01d54a, 0x01d550}, + {0x01d56c, 0x01d585}, + {0x01d5a0, 0x01d5b9}, + {0x01d5d4, 0x01d5ed}, + {0x01d608, 0x01d621}, + {0x01d63c, 0x01d655}, + {0x01d670, 0x01d689}, + {0x01d6a8, 0x01d6c0}, + {0x01d6e2, 0x01d6fa}, + {0x01d71c, 0x01d734}, + {0x01d756, 0x01d76e}, + {0x01d790, 0x01d7a8}, + {0x01d7ca, 0x01d7ca}, + {0x01e900, 0x01e921}, + {0x01f130, 0x01f149}, + {0x01f150, 0x01f169}, + {0x01f170, 0x01f189}, +}; + +/* table of Unicode codepoint ranges of Case_Ignorable characters */ +static const pg_unicode_range unicode_case_ignorable[491] = +{ + {0x000027, 0x000027}, + {0x00002e, 0x00002e}, + {0x00003a, 0x00003a}, + {0x00005e, 0x00005e}, + {0x000060, 0x000060}, + {0x0000a8, 0x0000a8}, + {0x0000ad, 0x0000ad}, + {0x0000af, 0x0000af}, + {0x0000b4, 0x0000b4}, + {0x0000b7, 0x0000b7}, + {0x0000b8, 0x0000b8}, + {0x0002b0, 0x0002c1}, + {0x0002c2, 0x0002c5}, + {0x0002c6, 0x0002d1}, + {0x0002d2, 0x0002df}, + {0x0002e0, 0x0002e4}, + {0x0002e5, 0x0002eb}, + {0x0002ec, 0x0002ec}, + {0x0002ed, 0x0002ed}, + {0x0002ee, 0x0002ee}, + {0x0002ef, 0x0002ff}, + {0x000300, 0x00036f}, + {0x000374, 0x000374}, + {0x000375, 0x000375}, + {0x00037a, 0x00037a}, + {0x000384, 0x000385}, + {0x000387, 0x000387}, + {0x000483, 0x000487}, + {0x000488, 0x000489}, + {0x000559, 0x000559}, + {0x00055f, 0x00055f}, + {0x000591, 0x0005bd}, + {0x0005bf, 0x0005bf}, + {0x0005c1, 0x0005c2}, + {0x0005c4, 0x0005c5}, + {0x0005c7, 0x0005c7}, + {0x0005f4, 0x0005f4}, + {0x000600, 0x000605}, + {0x000610, 0x00061a}, + {0x00061c, 0x00061c}, + {0x000640, 0x000640}, + {0x00064b, 0x00065f}, + {0x000670, 0x000670}, + {0x0006d6, 0x0006dc}, + {0x0006dd, 0x0006dd}, + {0x0006df, 0x0006e4}, + {0x0006e5, 0x0006e6}, + {0x0006e7, 0x0006e8}, + {0x0006ea, 0x0006ed}, + {0x00070f, 0x00070f}, + {0x000711, 0x000711}, + {0x000730, 0x00074a}, + {0x0007a6, 0x0007b0}, + {0x0007eb, 0x0007f3}, + {0x0007f4, 0x0007f5}, + {0x0007fa, 0x0007fa}, + {0x0007fd, 0x0007fd}, + {0x000816, 0x000819}, + {0x00081a, 0x00081a}, + {0x00081b, 0x000823}, + {0x000824, 0x000824}, + {0x000825, 0x000827}, + {0x000828, 0x000828}, + {0x000829, 0x00082d}, + {0x000859, 0x00085b}, + {0x000888, 0x000888}, + {0x000890, 0x000891}, + {0x000898, 0x00089f}, + {0x0008c9, 0x0008c9}, + {0x0008ca, 0x0008e1}, + {0x0008e2, 0x0008e2}, + {0x0008e3, 0x000902}, + {0x00093a, 0x00093a}, + {0x00093c, 0x00093c}, + {0x000941, 0x000948}, + {0x00094d, 0x00094d}, + {0x000951, 0x000957}, + {0x000962, 0x000963}, + {0x000971, 0x000971}, + {0x000981, 0x000981}, + {0x0009bc, 0x0009bc}, + {0x0009c1, 0x0009c4}, + {0x0009cd, 0x0009cd}, + {0x0009e2, 0x0009e3}, + {0x0009fe, 0x0009fe}, + {0x000a01, 0x000a02}, + {0x000a3c, 0x000a3c}, + {0x000a41, 0x000a42}, + {0x000a47, 0x000a48}, + {0x000a4b, 0x000a4d}, + {0x000a51, 0x000a51}, + {0x000a70, 0x000a71}, + {0x000a75, 0x000a75}, + {0x000a81, 0x000a82}, + {0x000abc, 0x000abc}, + {0x000ac1, 0x000ac5}, + {0x000ac7, 0x000ac8}, + {0x000acd, 0x000acd}, + {0x000ae2, 0x000ae3}, + {0x000afa, 0x000aff}, + {0x000b01, 0x000b01}, + {0x000b3c, 0x000b3c}, + {0x000b3f, 0x000b3f}, + {0x000b41, 0x000b44}, + {0x000b4d, 0x000b4d}, + {0x000b55, 0x000b56}, + {0x000b62, 0x000b63}, + {0x000b82, 0x000b82}, + {0x000bc0, 0x000bc0}, + {0x000bcd, 0x000bcd}, + {0x000c00, 0x000c00}, + {0x000c04, 0x000c04}, + {0x000c3c, 0x000c3c}, + {0x000c3e, 0x000c40}, + {0x000c46, 0x000c48}, + {0x000c4a, 0x000c4d}, + {0x000c55, 0x000c56}, + {0x000c62, 0x000c63}, + {0x000c81, 0x000c81}, + {0x000cbc, 0x000cbc}, + {0x000cbf, 0x000cbf}, + {0x000cc6, 0x000cc6}, + {0x000ccc, 0x000ccd}, + {0x000ce2, 0x000ce3}, + {0x000d00, 0x000d01}, + {0x000d3b, 0x000d3c}, + {0x000d41, 0x000d44}, + {0x000d4d, 0x000d4d}, + {0x000d62, 0x000d63}, + {0x000d81, 0x000d81}, + {0x000dca, 0x000dca}, + {0x000dd2, 0x000dd4}, + {0x000dd6, 0x000dd6}, + {0x000e31, 0x000e31}, + {0x000e34, 0x000e3a}, + {0x000e46, 0x000e46}, + {0x000e47, 0x000e4e}, + {0x000eb1, 0x000eb1}, + {0x000eb4, 0x000ebc}, + {0x000ec6, 0x000ec6}, + {0x000ec8, 0x000ece}, + {0x000f18, 0x000f19}, + {0x000f35, 0x000f35}, + {0x000f37, 0x000f37}, + {0x000f39, 0x000f39}, + {0x000f71, 0x000f7e}, + {0x000f80, 0x000f84}, + {0x000f86, 0x000f87}, + {0x000f8d, 0x000f97}, + {0x000f99, 0x000fbc}, + {0x000fc6, 0x000fc6}, + {0x00102d, 0x001030}, + {0x001032, 0x001037}, + {0x001039, 0x00103a}, + {0x00103d, 0x00103e}, + {0x001058, 0x001059}, + {0x00105e, 0x001060}, + {0x001071, 0x001074}, + {0x001082, 0x001082}, + {0x001085, 0x001086}, + {0x00108d, 0x00108d}, + {0x00109d, 0x00109d}, + {0x0010fc, 0x0010fc}, + {0x00135d, 0x00135f}, + {0x001712, 0x001714}, + {0x001732, 0x001733}, + {0x001752, 0x001753}, + {0x001772, 0x001773}, + {0x0017b4, 0x0017b5}, + {0x0017b7, 0x0017bd}, + {0x0017c6, 0x0017c6}, + {0x0017c9, 0x0017d3}, + {0x0017d7, 0x0017d7}, + {0x0017dd, 0x0017dd}, + {0x00180b, 0x00180d}, + {0x00180e, 0x00180e}, + {0x00180f, 0x00180f}, + {0x001843, 0x001843}, + {0x001885, 0x001886}, + {0x0018a9, 0x0018a9}, + {0x001920, 0x001922}, + {0x001927, 0x001928}, + {0x001932, 0x001932}, + {0x001939, 0x00193b}, + {0x001a17, 0x001a18}, + {0x001a1b, 0x001a1b}, + {0x001a56, 0x001a56}, + {0x001a58, 0x001a5e}, + {0x001a60, 0x001a60}, + {0x001a62, 0x001a62}, + {0x001a65, 0x001a6c}, + {0x001a73, 0x001a7c}, + {0x001a7f, 0x001a7f}, + {0x001aa7, 0x001aa7}, + {0x001ab0, 0x001abd}, + {0x001abe, 0x001abe}, + {0x001abf, 0x001ace}, + {0x001b00, 0x001b03}, + {0x001b34, 0x001b34}, + {0x001b36, 0x001b3a}, + {0x001b3c, 0x001b3c}, + {0x001b42, 0x001b42}, + {0x001b6b, 0x001b73}, + {0x001b80, 0x001b81}, + {0x001ba2, 0x001ba5}, + {0x001ba8, 0x001ba9}, + {0x001bab, 0x001bad}, + {0x001be6, 0x001be6}, + {0x001be8, 0x001be9}, + {0x001bed, 0x001bed}, + {0x001bef, 0x001bf1}, + {0x001c2c, 0x001c33}, + {0x001c36, 0x001c37}, + {0x001c78, 0x001c7d}, + {0x001cd0, 0x001cd2}, + {0x001cd4, 0x001ce0}, + {0x001ce2, 0x001ce8}, + {0x001ced, 0x001ced}, + {0x001cf4, 0x001cf4}, + {0x001cf8, 0x001cf9}, + {0x001d2c, 0x001d6a}, + {0x001d78, 0x001d78}, + {0x001d9b, 0x001dbf}, + {0x001dc0, 0x001dff}, + {0x001fbd, 0x001fbd}, + {0x001fbf, 0x001fc1}, + {0x001fcd, 0x001fcf}, + {0x001fdd, 0x001fdf}, + {0x001fed, 0x001fef}, + {0x001ffd, 0x001ffe}, + {0x00200b, 0x00200f}, + {0x002018, 0x002018}, + {0x002019, 0x002019}, + {0x002024, 0x002024}, + {0x002027, 0x002027}, + {0x00202a, 0x00202e}, + {0x002060, 0x002064}, + {0x002066, 0x00206f}, + {0x002071, 0x002071}, + {0x00207f, 0x00207f}, + {0x002090, 0x00209c}, + {0x0020d0, 0x0020dc}, + {0x0020dd, 0x0020e0}, + {0x0020e1, 0x0020e1}, + {0x0020e2, 0x0020e4}, + {0x0020e5, 0x0020f0}, + {0x002c7c, 0x002c7d}, + {0x002cef, 0x002cf1}, + {0x002d6f, 0x002d6f}, + {0x002d7f, 0x002d7f}, + {0x002de0, 0x002dff}, + {0x002e2f, 0x002e2f}, + {0x003005, 0x003005}, + {0x00302a, 0x00302d}, + {0x003031, 0x003035}, + {0x00303b, 0x00303b}, + {0x003099, 0x00309a}, + {0x00309b, 0x00309c}, + {0x00309d, 0x00309e}, + {0x0030fc, 0x0030fe}, + {0x00a015, 0x00a015}, + {0x00a4f8, 0x00a4fd}, + {0x00a60c, 0x00a60c}, + {0x00a66f, 0x00a66f}, + {0x00a670, 0x00a672}, + {0x00a674, 0x00a67d}, + {0x00a67f, 0x00a67f}, + {0x00a69c, 0x00a69d}, + {0x00a69e, 0x00a69f}, + {0x00a6f0, 0x00a6f1}, + {0x00a700, 0x00a716}, + {0x00a717, 0x00a71f}, + {0x00a720, 0x00a721}, + {0x00a770, 0x00a770}, + {0x00a788, 0x00a788}, + {0x00a789, 0x00a78a}, + {0x00a7f2, 0x00a7f4}, + {0x00a7f8, 0x00a7f9}, + {0x00a802, 0x00a802}, + {0x00a806, 0x00a806}, + {0x00a80b, 0x00a80b}, + {0x00a825, 0x00a826}, + {0x00a82c, 0x00a82c}, + {0x00a8c4, 0x00a8c5}, + {0x00a8e0, 0x00a8f1}, + {0x00a8ff, 0x00a8ff}, + {0x00a926, 0x00a92d}, + {0x00a947, 0x00a951}, + {0x00a980, 0x00a982}, + {0x00a9b3, 0x00a9b3}, + {0x00a9b6, 0x00a9b9}, + {0x00a9bc, 0x00a9bd}, + {0x00a9cf, 0x00a9cf}, + {0x00a9e5, 0x00a9e5}, + {0x00a9e6, 0x00a9e6}, + {0x00aa29, 0x00aa2e}, + {0x00aa31, 0x00aa32}, + {0x00aa35, 0x00aa36}, + {0x00aa43, 0x00aa43}, + {0x00aa4c, 0x00aa4c}, + {0x00aa70, 0x00aa70}, + {0x00aa7c, 0x00aa7c}, + {0x00aab0, 0x00aab0}, + {0x00aab2, 0x00aab4}, + {0x00aab7, 0x00aab8}, + {0x00aabe, 0x00aabf}, + {0x00aac1, 0x00aac1}, + {0x00aadd, 0x00aadd}, + {0x00aaec, 0x00aaed}, + {0x00aaf3, 0x00aaf4}, + {0x00aaf6, 0x00aaf6}, + {0x00ab5b, 0x00ab5b}, + {0x00ab5c, 0x00ab5f}, + {0x00ab69, 0x00ab69}, + {0x00ab6a, 0x00ab6b}, + {0x00abe5, 0x00abe5}, + {0x00abe8, 0x00abe8}, + {0x00abed, 0x00abed}, + {0x00fb1e, 0x00fb1e}, + {0x00fbb2, 0x00fbc2}, + {0x00fe00, 0x00fe0f}, + {0x00fe13, 0x00fe13}, + {0x00fe20, 0x00fe2f}, + {0x00fe52, 0x00fe52}, + {0x00fe55, 0x00fe55}, + {0x00feff, 0x00feff}, + {0x00ff07, 0x00ff07}, + {0x00ff0e, 0x00ff0e}, + {0x00ff1a, 0x00ff1a}, + {0x00ff3e, 0x00ff3e}, + {0x00ff40, 0x00ff40}, + {0x00ff70, 0x00ff70}, + {0x00ff9e, 0x00ff9f}, + {0x00ffe3, 0x00ffe3}, + {0x00fff9, 0x00fffb}, + {0x0101fd, 0x0101fd}, + {0x0102e0, 0x0102e0}, + {0x010376, 0x01037a}, + {0x010780, 0x010785}, + {0x010787, 0x0107b0}, + {0x0107b2, 0x0107ba}, + {0x010a01, 0x010a03}, + {0x010a05, 0x010a06}, + {0x010a0c, 0x010a0f}, + {0x010a38, 0x010a3a}, + {0x010a3f, 0x010a3f}, + {0x010ae5, 0x010ae6}, + {0x010d24, 0x010d27}, + {0x010eab, 0x010eac}, + {0x010efd, 0x010eff}, + {0x010f46, 0x010f50}, + {0x010f82, 0x010f85}, + {0x011001, 0x011001}, + {0x011038, 0x011046}, + {0x011070, 0x011070}, + {0x011073, 0x011074}, + {0x01107f, 0x011081}, + {0x0110b3, 0x0110b6}, + {0x0110b9, 0x0110ba}, + {0x0110bd, 0x0110bd}, + {0x0110c2, 0x0110c2}, + {0x0110cd, 0x0110cd}, + {0x011100, 0x011102}, + {0x011127, 0x01112b}, + {0x01112d, 0x011134}, + {0x011173, 0x011173}, + {0x011180, 0x011181}, + {0x0111b6, 0x0111be}, + {0x0111c9, 0x0111cc}, + {0x0111cf, 0x0111cf}, + {0x01122f, 0x011231}, + {0x011234, 0x011234}, + {0x011236, 0x011237}, + {0x01123e, 0x01123e}, + {0x011241, 0x011241}, + {0x0112df, 0x0112df}, + {0x0112e3, 0x0112ea}, + {0x011300, 0x011301}, + {0x01133b, 0x01133c}, + {0x011340, 0x011340}, + {0x011366, 0x01136c}, + {0x011370, 0x011374}, + {0x011438, 0x01143f}, + {0x011442, 0x011444}, + {0x011446, 0x011446}, + {0x01145e, 0x01145e}, + {0x0114b3, 0x0114b8}, + {0x0114ba, 0x0114ba}, + {0x0114bf, 0x0114c0}, + {0x0114c2, 0x0114c3}, + {0x0115b2, 0x0115b5}, + {0x0115bc, 0x0115bd}, + {0x0115bf, 0x0115c0}, + {0x0115dc, 0x0115dd}, + {0x011633, 0x01163a}, + {0x01163d, 0x01163d}, + {0x01163f, 0x011640}, + {0x0116ab, 0x0116ab}, + {0x0116ad, 0x0116ad}, + {0x0116b0, 0x0116b5}, + {0x0116b7, 0x0116b7}, + {0x01171d, 0x01171f}, + {0x011722, 0x011725}, + {0x011727, 0x01172b}, + {0x01182f, 0x011837}, + {0x011839, 0x01183a}, + {0x01193b, 0x01193c}, + {0x01193e, 0x01193e}, + {0x011943, 0x011943}, + {0x0119d4, 0x0119d7}, + {0x0119da, 0x0119db}, + {0x0119e0, 0x0119e0}, + {0x011a01, 0x011a0a}, + {0x011a33, 0x011a38}, + {0x011a3b, 0x011a3e}, + {0x011a47, 0x011a47}, + {0x011a51, 0x011a56}, + {0x011a59, 0x011a5b}, + {0x011a8a, 0x011a96}, + {0x011a98, 0x011a99}, + {0x011c30, 0x011c36}, + {0x011c38, 0x011c3d}, + {0x011c3f, 0x011c3f}, + {0x011c92, 0x011ca7}, + {0x011caa, 0x011cb0}, + {0x011cb2, 0x011cb3}, + {0x011cb5, 0x011cb6}, + {0x011d31, 0x011d36}, + {0x011d3a, 0x011d3a}, + {0x011d3c, 0x011d3d}, + {0x011d3f, 0x011d45}, + {0x011d47, 0x011d47}, + {0x011d90, 0x011d91}, + {0x011d95, 0x011d95}, + {0x011d97, 0x011d97}, + {0x011ef3, 0x011ef4}, + {0x011f00, 0x011f01}, + {0x011f36, 0x011f3a}, + {0x011f40, 0x011f40}, + {0x011f42, 0x011f42}, + {0x013430, 0x01343f}, + {0x013440, 0x013440}, + {0x013447, 0x013455}, + {0x016af0, 0x016af4}, + {0x016b30, 0x016b36}, + {0x016b40, 0x016b43}, + {0x016f4f, 0x016f4f}, + {0x016f8f, 0x016f92}, + {0x016f93, 0x016f9f}, + {0x016fe0, 0x016fe1}, + {0x016fe3, 0x016fe3}, + {0x016fe4, 0x016fe4}, + {0x01aff0, 0x01aff3}, + {0x01aff5, 0x01affb}, + {0x01affd, 0x01affe}, + {0x01bc9d, 0x01bc9e}, + {0x01bca0, 0x01bca3}, + {0x01cf00, 0x01cf2d}, + {0x01cf30, 0x01cf46}, + {0x01d167, 0x01d169}, + {0x01d173, 0x01d17a}, + {0x01d17b, 0x01d182}, + {0x01d185, 0x01d18b}, + {0x01d1aa, 0x01d1ad}, + {0x01d242, 0x01d244}, + {0x01da00, 0x01da36}, + {0x01da3b, 0x01da6c}, + {0x01da75, 0x01da75}, + {0x01da84, 0x01da84}, + {0x01da9b, 0x01da9f}, + {0x01daa1, 0x01daaf}, + {0x01e000, 0x01e006}, + {0x01e008, 0x01e018}, + {0x01e01b, 0x01e021}, + {0x01e023, 0x01e024}, + {0x01e026, 0x01e02a}, + {0x01e030, 0x01e06d}, + {0x01e08f, 0x01e08f}, + {0x01e130, 0x01e136}, + {0x01e137, 0x01e13d}, + {0x01e2ae, 0x01e2ae}, + {0x01e2ec, 0x01e2ef}, + {0x01e4eb, 0x01e4eb}, + {0x01e4ec, 0x01e4ef}, + {0x01e8d0, 0x01e8d6}, + {0x01e944, 0x01e94a}, + {0x01e94b, 0x01e94b}, + {0x01f3fb, 0x01f3ff}, + {0x0e0001, 0x0e0001}, + {0x0e0020, 0x0e007f}, + {0x0e0100, 0x0e01ef}, +}; + +/* table of Unicode codepoint ranges of White_Space characters */ +static const pg_unicode_range unicode_white_space[11] = +{ + {0x000009, 0x00000d}, + {0x000020, 0x000020}, + {0x000085, 0x000085}, + {0x0000a0, 0x0000a0}, + {0x001680, 0x001680}, + {0x002000, 0x00200a}, + {0x002028, 0x002028}, + {0x002029, 0x002029}, + {0x00202f, 0x00202f}, + {0x00205f, 0x00205f}, + {0x003000, 0x003000}, +}; + +/* table of Unicode codepoint ranges of Hex_Digit characters */ +static const pg_unicode_range unicode_hex_digit[6] = +{ + {0x000030, 0x000039}, + {0x000041, 0x000046}, + {0x000061, 0x000066}, + {0x00ff10, 0x00ff19}, + {0x00ff21, 0x00ff26}, + {0x00ff41, 0x00ff46}, +}; + +/* table of Unicode codepoint ranges of Join_Control characters */ +static const pg_unicode_range unicode_join_control[1] = +{ + {0x00200c, 0x00200d}, +}; diff --git a/src/include/common/unicode_east_asian_fw_table.h b/src/include/common/unicode_east_asian_fw_table.h index f77e6dfd42375..dcd1f136eb777 100644 --- a/src/include/common/unicode_east_asian_fw_table.h +++ b/src/include/common/unicode_east_asian_fw_table.h @@ -39,14 +39,13 @@ static const struct mbinterval east_asian_fw[] = { {0x2E80, 0x2E99}, {0x2E9B, 0x2EF3}, {0x2F00, 0x2FD5}, - {0x2FF0, 0x2FFB}, - {0x3000, 0x303E}, + {0x2FF0, 0x303E}, {0x3041, 0x3096}, {0x3099, 0x30FF}, {0x3105, 0x312F}, {0x3131, 0x318E}, {0x3190, 0x31E3}, - {0x31F0, 0x321E}, + {0x31EF, 0x321E}, {0x3220, 0x3247}, {0x3250, 0x4DBF}, {0x4E00, 0xA48C}, diff --git a/src/include/common/unicode_norm.h b/src/include/common/unicode_norm.h index c6627aeb7c587..740b77a373e18 100644 --- a/src/include/common/unicode_norm.h +++ b/src/include/common/unicode_norm.h @@ -5,7 +5,7 @@ * * These definitions are used by both frontend and backend code. * - * Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Copyright (c) 2017-2024, PostgreSQL Global Development Group * * src/include/common/unicode_norm.h * diff --git a/src/include/common/unicode_norm_hashfunc.h b/src/include/common/unicode_norm_hashfunc.h index 8c824a63218fb..0913ea1c6587e 100644 --- a/src/include/common/unicode_norm_hashfunc.h +++ b/src/include/common/unicode_norm_hashfunc.h @@ -3,7 +3,7 @@ * unicode_norm_hashfunc.h * Perfect hash functions used for Unicode normalization * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/unicode_norm_hashfunc.h diff --git a/src/include/common/unicode_norm_table.h b/src/include/common/unicode_norm_table.h index 36b6ca4044622..7ef8efac8afab 100644 --- a/src/include/common/unicode_norm_table.h +++ b/src/include/common/unicode_norm_table.h @@ -3,7 +3,7 @@ * unicode_norm_table.h * Composition table used for Unicode normalization * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/common/unicode_norm_table.h diff --git a/src/include/common/unicode_version.h b/src/include/common/unicode_version.h new file mode 100644 index 0000000000000..487fcef78a540 --- /dev/null +++ b/src/include/common/unicode_version.h @@ -0,0 +1,14 @@ +/*------------------------------------------------------------------------- + * + * unicode_version.h + * Unicode version used by Postgres. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/common/unicode_version.h + * + *------------------------------------------------------------------------- + */ + +#define PG_UNICODE_VERSION "15.1" diff --git a/src/include/common/username.h b/src/include/common/username.h index fd07df64c1935..60fcc70a970f0 100644 --- a/src/include/common/username.h +++ b/src/include/common/username.h @@ -2,7 +2,7 @@ * username.h * lookup effective username * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * src/include/common/username.h */ diff --git a/src/include/datatype/timestamp.h b/src/include/datatype/timestamp.h index ab8ccf89ca9ea..7d9d2fd0932fd 100644 --- a/src/include/datatype/timestamp.h +++ b/src/include/datatype/timestamp.h @@ -5,7 +5,7 @@ * * Note: this file must be includable in both frontend and backend contexts. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/datatype/timestamp.h @@ -114,6 +114,7 @@ struct pg_itm_in * 30 days. */ #define DAYS_PER_MONTH 30 /* assumes exactly 30 days per month */ +#define DAYS_PER_WEEK 7 #define HOURS_PER_DAY 24 /* assume no daylight savings time changes */ /* @@ -135,7 +136,7 @@ struct pg_itm_in /* * We allow numeric timezone offsets up to 15:59:59 either way from Greenwich. * Currently, the record holders for wackiest offsets in actual use are zones - * Asia/Manila, at -15:56:00 until 1844, and America/Metlakatla, at +15:13:42 + * Asia/Manila, at -15:56:08 until 1844, and America/Metlakatla, at +15:13:42 * until 1867. If we were to reject such values we would fail to dump and * restore old timestamptz values with these zone settings. */ @@ -150,7 +151,7 @@ struct pg_itm_in #define TIMESTAMP_INFINITY PG_INT64_MAX /* - * Historically these alias for infinity have been used. + * Historically these aliases for infinity have been used. */ #define DT_NOBEGIN TIMESTAMP_MINUS_INFINITY #define DT_NOEND TIMESTAMP_INFINITY @@ -167,6 +168,31 @@ struct pg_itm_in #define TIMESTAMP_NOT_FINITE(j) (TIMESTAMP_IS_NOBEGIN(j) || TIMESTAMP_IS_NOEND(j)) +/* + * Infinite intervals are represented by setting all fields to the minimum or + * maximum integer values. + */ +#define INTERVAL_NOBEGIN(i) \ + do { \ + (i)->time = PG_INT64_MIN; \ + (i)->day = PG_INT32_MIN; \ + (i)->month = PG_INT32_MIN; \ + } while (0) + +#define INTERVAL_IS_NOBEGIN(i) \ + ((i)->month == PG_INT32_MIN && (i)->day == PG_INT32_MIN && (i)->time == PG_INT64_MIN) + +#define INTERVAL_NOEND(i) \ + do { \ + (i)->time = PG_INT64_MAX; \ + (i)->day = PG_INT32_MAX; \ + (i)->month = PG_INT32_MAX; \ + } while (0) + +#define INTERVAL_IS_NOEND(i) \ + ((i)->month == PG_INT32_MAX && (i)->day == PG_INT32_MAX && (i)->time == PG_INT64_MAX) + +#define INTERVAL_NOT_FINITE(i) (INTERVAL_IS_NOBEGIN(i) || INTERVAL_IS_NOEND(i)) /* * Julian date support. diff --git a/src/include/executor/execAsync.h b/src/include/executor/execAsync.h index 9c48f052fa07e..c5f26ced6750d 100644 --- a/src/include/executor/execAsync.h +++ b/src/include/executor/execAsync.h @@ -2,7 +2,7 @@ * execAsync.h * Support functions for asynchronous execution * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/executor/execExpr.h b/src/include/executor/execExpr.h index 048573c2bcb57..ef1fa37716de5 100644 --- a/src/include/executor/execExpr.h +++ b/src/include/executor/execExpr.h @@ -4,7 +4,7 @@ * Low level infrastructure related to expression evaluation * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/execExpr.h @@ -16,6 +16,7 @@ #include "executor/nodeAgg.h" #include "nodes/execnodes.h" +#include "nodes/miscnodes.h" /* forward references to avoid circularity */ struct ExprEvalStep; @@ -168,6 +169,7 @@ typedef enum ExprEvalOp /* evaluate assorted special-purpose expression types */ EEOP_IOCOERCE, + EEOP_IOCOERCE_SAFE, EEOP_DISTINCT, EEOP_NOT_DISTINCT, EEOP_NULLIF, @@ -238,9 +240,13 @@ typedef enum ExprEvalOp EEOP_XMLEXPR, EEOP_JSON_CONSTRUCTOR, EEOP_IS_JSON, + EEOP_JSONEXPR_PATH, + EEOP_JSONEXPR_COERCION, + EEOP_JSONEXPR_COERCION_FINISH, EEOP_AGGREF, EEOP_GROUPING_FUNC, EEOP_WINDOW_FUNC, + EEOP_MERGE_SUPPORT_FUNC, EEOP_SUBPLAN, /* aggregation related nodes */ @@ -350,6 +356,7 @@ typedef struct ExprEvalStep /* faster to access without additional indirection: */ PGFunction fn_addr; /* actual call address */ int nargs; /* number of arguments */ + bool make_ro; /* make arg0 R/O (used only for NULLIF) */ } func; /* for EEOP_BOOL_*_STEP */ @@ -547,6 +554,7 @@ typedef struct ExprEvalStep bool *checknull; /* OID of domain type */ Oid resulttype; + ErrorSaveContext *escontext; } domaincheck; /* for EEOP_CONVERT_ROWTYPE */ @@ -689,6 +697,25 @@ typedef struct ExprEvalStep JsonIsPredicate *pred; /* original expression node */ } is_json; + /* for EEOP_JSONEXPR_PATH */ + struct + { + struct JsonExprState *jsestate; + } jsonexpr; + + /* for EEOP_JSONEXPR_COERCION */ + struct + { + Oid targettype; + int32 targettypmod; + bool omit_quotes; + /* exists_* fields only relevant for JSON_EXISTS_OP. */ + bool exists_coerce; + bool exists_cast_to_int; + bool exists_check_domain; + void *json_coercion_cache; + ErrorSaveContext *escontext; + } jsonexpr_coercion; } d; } ExprEvalStep; @@ -776,6 +803,7 @@ extern void ExecEvalParamExec(ExprState *state, ExprEvalStep *op, ExprContext *econtext); extern void ExecEvalParamExtern(ExprState *state, ExprEvalStep *op, ExprContext *econtext); +extern void ExecEvalCoerceViaIOSafe(ExprState *state, ExprEvalStep *op); extern void ExecEvalSQLValueFunction(ExprState *state, ExprEvalStep *op); extern void ExecEvalCurrentOfExpr(ExprState *state, ExprEvalStep *op); extern void ExecEvalNextValueExpr(ExprState *state, ExprEvalStep *op); @@ -805,7 +833,14 @@ extern void ExecEvalXmlExpr(ExprState *state, ExprEvalStep *op); extern void ExecEvalJsonConstructor(ExprState *state, ExprEvalStep *op, ExprContext *econtext); extern void ExecEvalJsonIsPredicate(ExprState *state, ExprEvalStep *op); +extern int ExecEvalJsonExprPath(ExprState *state, ExprEvalStep *op, + ExprContext *econtext); +extern void ExecEvalJsonCoercion(ExprState *state, ExprEvalStep *op, + ExprContext *econtext); +extern void ExecEvalJsonCoercionFinish(ExprState *state, ExprEvalStep *op); extern void ExecEvalGroupingFunc(ExprState *state, ExprEvalStep *op); +extern void ExecEvalMergeSupportFunc(ExprState *state, ExprEvalStep *op, + ExprContext *econtext); extern void ExecEvalSubPlan(ExprState *state, ExprEvalStep *op, ExprContext *econtext); extern void ExecEvalWholeRowVar(ExprState *state, ExprEvalStep *op, diff --git a/src/include/executor/execParallel.h b/src/include/executor/execParallel.h index 39a8792a31909..6b8c00bb0fbfa 100644 --- a/src/include/executor/execParallel.h +++ b/src/include/executor/execParallel.h @@ -2,7 +2,7 @@ * execParallel.h * POSTGRES parallel execution interface * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/executor/execPartition.h b/src/include/executor/execPartition.h index 15ec869ac8124..c09bc83b2ac3c 100644 --- a/src/include/executor/execPartition.h +++ b/src/include/executor/execPartition.h @@ -2,7 +2,7 @@ * execPartition.h * POSTGRES partitioning executor interface * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/executor/execdebug.h b/src/include/executor/execdebug.h index 5a8e5e290c9f0..27e30b16f57a5 100644 --- a/src/include/executor/execdebug.h +++ b/src/include/executor/execdebug.h @@ -7,7 +7,7 @@ * for debug printouts, because that's more flexible than printf(). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/execdebug.h diff --git a/src/include/executor/execdesc.h b/src/include/executor/execdesc.h index af2bf36dfb8e0..79e8b6311145c 100644 --- a/src/include/executor/execdesc.h +++ b/src/include/executor/execdesc.h @@ -5,7 +5,7 @@ * and related modules. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/execdesc.h @@ -48,7 +48,7 @@ typedef struct QueryDesc EState *estate; /* executor's query-wide state */ PlanState *planstate; /* tree of per-plan-node state */ - /* This field is set by ExecutorRun */ + /* This field is set by ExecutePlan */ bool already_executed; /* true if previously executed */ /* This is always set NULL by the core system, but plugins can change it */ diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index ac02247947e7d..9770752ea3c1b 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -4,7 +4,7 @@ * support for the POSTGRES executor module * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/executor.h @@ -210,7 +210,8 @@ extern void standard_ExecutorEnd(QueryDesc *queryDesc); extern void ExecutorRewind(QueryDesc *queryDesc); extern bool ExecCheckPermissions(List *rangeTable, List *rteperminfos, bool ereport_on_violation); -extern void CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation); +extern void CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation, + List *mergeActions); extern void InitResultRelInfo(ResultRelInfo *resultRelInfo, Relation resultRelationDesc, Index resultRelationIndex, @@ -509,7 +510,7 @@ typedef struct TupOutputState extern TupOutputState *begin_tup_output_tupdesc(DestReceiver *dest, TupleDesc tupdesc, const TupleTableSlotOps *tts_ops); -extern void do_tup_output(TupOutputState *tstate, Datum *values, bool *isnull); +extern void do_tup_output(TupOutputState *tstate, const Datum *values, const bool *isnull); extern void do_text_output_multiline(TupOutputState *tstate, const char *txt); extern void end_tup_output(TupOutputState *tstate); @@ -569,7 +570,6 @@ extern void ExecAssignProjectionInfo(PlanState *planstate, TupleDesc inputDesc); extern void ExecConditionalAssignProjectionInfo(PlanState *planstate, TupleDesc inputDesc, int varno); -extern void ExecFreeExprContext(PlanState *planstate); extern void ExecAssignScanType(ScanState *scanstate, TupleDesc tupDesc); extern void ExecCreateScanSlotFromOuterPlan(EState *estate, ScanState *scanstate, @@ -640,12 +640,13 @@ extern bool ExecCheckIndexConstraints(ResultRelInfo *resultRelInfo, extern void check_exclusion_constraint(Relation heap, Relation index, IndexInfo *indexInfo, ItemPointer tupleid, - Datum *values, bool *isnull, + const Datum *values, const bool *isnull, EState *estate, bool newIndex); /* * prototypes from functions in execReplication.c */ +extern StrategyNumber get_equal_strategy_number_for_am(Oid am); extern bool RelationFindReplTupleByIndex(Relation rel, Oid idxoid, LockTupleMode lockmode, TupleTableSlot *searchslot, diff --git a/src/include/executor/functions.h b/src/include/executor/functions.h index 5d9f32569eb10..27f948c6f52eb 100644 --- a/src/include/executor/functions.h +++ b/src/include/executor/functions.h @@ -4,7 +4,7 @@ * Declarations for execution of SQL-language functions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/functions.h @@ -47,6 +47,7 @@ extern void check_sql_fn_statements(List *queryTreeLists); extern bool check_sql_fn_retval(List *queryTreeLists, Oid rettype, TupleDesc rettupdesc, + char prokind, bool insertDroppedCols, List **resultTargetList); diff --git a/src/include/executor/hashjoin.h b/src/include/executor/hashjoin.h index cb2a2cde8a8e9..9197846cda75a 100644 --- a/src/include/executor/hashjoin.h +++ b/src/include/executor/hashjoin.h @@ -4,7 +4,7 @@ * internal structures for hash joins * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/hashjoin.h @@ -236,7 +236,7 @@ typedef enum ParallelHashGrowth /* The memory budget would be exhausted, so we need to repartition. */ PHJ_GROWTH_NEED_MORE_BATCHES, /* Repartitioning didn't help last time, so don't try to do that again. */ - PHJ_GROWTH_DISABLED + PHJ_GROWTH_DISABLED, } ParallelHashGrowth; /* diff --git a/src/include/executor/instrument.h b/src/include/executor/instrument.h index 87e5e2183bd9c..bfd7b6d84452f 100644 --- a/src/include/executor/instrument.h +++ b/src/include/executor/instrument.h @@ -4,7 +4,7 @@ * definitions for run-time statistics collection * * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * src/include/executor/instrument.h * @@ -33,8 +33,10 @@ typedef struct BufferUsage int64 local_blks_written; /* # of local disk blocks written */ int64 temp_blks_read; /* # of temp blocks read */ int64 temp_blks_written; /* # of temp blocks written */ - instr_time blk_read_time; /* time spent reading blocks */ - instr_time blk_write_time; /* time spent writing blocks */ + instr_time shared_blk_read_time; /* time spent reading shared blocks */ + instr_time shared_blk_write_time; /* time spent writing shared blocks */ + instr_time local_blk_read_time; /* time spent reading local blocks */ + instr_time local_blk_write_time; /* time spent writing local blocks */ instr_time temp_blk_read_time; /* time spent reading temp blocks */ instr_time temp_blk_write_time; /* time spent writing temp blocks */ } BufferUsage; diff --git a/src/include/executor/nodeAgg.h b/src/include/executor/nodeAgg.h index 4e43b86d31a65..684779a6a326b 100644 --- a/src/include/executor/nodeAgg.h +++ b/src/include/executor/nodeAgg.h @@ -4,7 +4,7 @@ * prototypes for nodeAgg.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeAgg.h diff --git a/src/include/executor/nodeAppend.h b/src/include/executor/nodeAppend.h index 4427ef371d288..ee75953d116dc 100644 --- a/src/include/executor/nodeAppend.h +++ b/src/include/executor/nodeAppend.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeAppend.h diff --git a/src/include/executor/nodeBitmapAnd.h b/src/include/executor/nodeBitmapAnd.h index 4833fd0df7e6a..299185f53dfea 100644 --- a/src/include/executor/nodeBitmapAnd.h +++ b/src/include/executor/nodeBitmapAnd.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeBitmapAnd.h diff --git a/src/include/executor/nodeBitmapHeapscan.h b/src/include/executor/nodeBitmapHeapscan.h index 3a267a7fbd7dd..ea003a9caaef5 100644 --- a/src/include/executor/nodeBitmapHeapscan.h +++ b/src/include/executor/nodeBitmapHeapscan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeBitmapHeapscan.h diff --git a/src/include/executor/nodeBitmapIndexscan.h b/src/include/executor/nodeBitmapIndexscan.h index 454aa43442502..1de0a57787ac3 100644 --- a/src/include/executor/nodeBitmapIndexscan.h +++ b/src/include/executor/nodeBitmapIndexscan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeBitmapIndexscan.h diff --git a/src/include/executor/nodeBitmapOr.h b/src/include/executor/nodeBitmapOr.h index 2c2e112840f75..8bafc5bec9a37 100644 --- a/src/include/executor/nodeBitmapOr.h +++ b/src/include/executor/nodeBitmapOr.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeBitmapOr.h diff --git a/src/include/executor/nodeCtescan.h b/src/include/executor/nodeCtescan.h index d28e2eb5d5b95..9df8ea71198e1 100644 --- a/src/include/executor/nodeCtescan.h +++ b/src/include/executor/nodeCtescan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeCtescan.h diff --git a/src/include/executor/nodeCustom.h b/src/include/executor/nodeCustom.h index 05f63eb6a29fa..e8b7e53fbd5b0 100644 --- a/src/include/executor/nodeCustom.h +++ b/src/include/executor/nodeCustom.h @@ -4,7 +4,7 @@ * * prototypes for CustomScan nodes * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * ------------------------------------------------------------------------ diff --git a/src/include/executor/nodeForeignscan.h b/src/include/executor/nodeForeignscan.h index 4016c767a8722..747fe4eee4114 100644 --- a/src/include/executor/nodeForeignscan.h +++ b/src/include/executor/nodeForeignscan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeForeignscan.h diff --git a/src/include/executor/nodeFunctionscan.h b/src/include/executor/nodeFunctionscan.h index da71fb84635d7..d957a885f6347 100644 --- a/src/include/executor/nodeFunctionscan.h +++ b/src/include/executor/nodeFunctionscan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeFunctionscan.h diff --git a/src/include/executor/nodeGather.h b/src/include/executor/nodeGather.h index a3915617400e7..045c16d264765 100644 --- a/src/include/executor/nodeGather.h +++ b/src/include/executor/nodeGather.h @@ -4,7 +4,7 @@ * prototypes for nodeGather.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeGather.h diff --git a/src/include/executor/nodeGatherMerge.h b/src/include/executor/nodeGatherMerge.h index 06ef0f44efd54..d828c00f471ae 100644 --- a/src/include/executor/nodeGatherMerge.h +++ b/src/include/executor/nodeGatherMerge.h @@ -4,7 +4,7 @@ * prototypes for nodeGatherMerge.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeGatherMerge.h diff --git a/src/include/executor/nodeGroup.h b/src/include/executor/nodeGroup.h index 79215147e55e6..9578b9229e396 100644 --- a/src/include/executor/nodeGroup.h +++ b/src/include/executor/nodeGroup.h @@ -4,7 +4,7 @@ * prototypes for nodeGroup.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeGroup.h diff --git a/src/include/executor/nodeHash.h b/src/include/executor/nodeHash.h index 56d5350c6159a..a95911c2feeb5 100644 --- a/src/include/executor/nodeHash.h +++ b/src/include/executor/nodeHash.h @@ -4,7 +4,7 @@ * prototypes for nodeHash.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeHash.h diff --git a/src/include/executor/nodeHashjoin.h b/src/include/executor/nodeHashjoin.h index ccb704ede1d01..2b121094f278b 100644 --- a/src/include/executor/nodeHashjoin.h +++ b/src/include/executor/nodeHashjoin.h @@ -4,7 +4,7 @@ * prototypes for nodeHashjoin.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeHashjoin.h diff --git a/src/include/executor/nodeIncrementalSort.h b/src/include/executor/nodeIncrementalSort.h index 4e1900921299a..df020741aff7a 100644 --- a/src/include/executor/nodeIncrementalSort.h +++ b/src/include/executor/nodeIncrementalSort.h @@ -2,7 +2,7 @@ * * nodeIncrementalSort.h * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeIncrementalSort.h diff --git a/src/include/executor/nodeIndexonlyscan.h b/src/include/executor/nodeIndexonlyscan.h index e5260f8777955..607af8c354003 100644 --- a/src/include/executor/nodeIndexonlyscan.h +++ b/src/include/executor/nodeIndexonlyscan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeIndexonlyscan.h diff --git a/src/include/executor/nodeIndexscan.h b/src/include/executor/nodeIndexscan.h index 8ee7969792b5d..3cddece67c8eb 100644 --- a/src/include/executor/nodeIndexscan.h +++ b/src/include/executor/nodeIndexscan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeIndexscan.h diff --git a/src/include/executor/nodeLimit.h b/src/include/executor/nodeLimit.h index 7ff465c0f0a23..7cf5c1cad61f7 100644 --- a/src/include/executor/nodeLimit.h +++ b/src/include/executor/nodeLimit.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeLimit.h diff --git a/src/include/executor/nodeLockRows.h b/src/include/executor/nodeLockRows.h index 27cb169ccfdb8..310d2ba4458db 100644 --- a/src/include/executor/nodeLockRows.h +++ b/src/include/executor/nodeLockRows.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeLockRows.h diff --git a/src/include/executor/nodeMaterial.h b/src/include/executor/nodeMaterial.h index 4af2e8a6ce6c7..0ba7d0edc6d78 100644 --- a/src/include/executor/nodeMaterial.h +++ b/src/include/executor/nodeMaterial.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeMaterial.h diff --git a/src/include/executor/nodeMemoize.h b/src/include/executor/nodeMemoize.h index 2089900a2364d..758dcd6fe1b84 100644 --- a/src/include/executor/nodeMemoize.h +++ b/src/include/executor/nodeMemoize.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 2021-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2021-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeMemoize.h diff --git a/src/include/executor/nodeMergeAppend.h b/src/include/executor/nodeMergeAppend.h index ed24a3529d5c0..c39a9fc0cb284 100644 --- a/src/include/executor/nodeMergeAppend.h +++ b/src/include/executor/nodeMergeAppend.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeMergeAppend.h diff --git a/src/include/executor/nodeMergejoin.h b/src/include/executor/nodeMergejoin.h index 344d9cad825f8..e60e1bb3357b4 100644 --- a/src/include/executor/nodeMergejoin.h +++ b/src/include/executor/nodeMergejoin.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeMergejoin.h diff --git a/src/include/executor/nodeModifyTable.h b/src/include/executor/nodeModifyTable.h index e7eeb307d0f47..681cdaa89dbc8 100644 --- a/src/include/executor/nodeModifyTable.h +++ b/src/include/executor/nodeModifyTable.h @@ -3,7 +3,7 @@ * nodeModifyTable.h * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeModifyTable.h diff --git a/src/include/executor/nodeNamedtuplestorescan.h b/src/include/executor/nodeNamedtuplestorescan.h index 3ff687023afa2..97d1982006331 100644 --- a/src/include/executor/nodeNamedtuplestorescan.h +++ b/src/include/executor/nodeNamedtuplestorescan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeNamedtuplestorescan.h @@ -17,7 +17,6 @@ #include "nodes/execnodes.h" extern NamedTuplestoreScanState *ExecInitNamedTuplestoreScan(NamedTuplestoreScan *node, EState *estate, int eflags); -extern void ExecEndNamedTuplestoreScan(NamedTuplestoreScanState *node); extern void ExecReScanNamedTuplestoreScan(NamedTuplestoreScanState *node); #endif /* NODENAMEDTUPLESTORESCAN_H */ diff --git a/src/include/executor/nodeNestloop.h b/src/include/executor/nodeNestloop.h index c9a339e6a75a4..37dff400d376c 100644 --- a/src/include/executor/nodeNestloop.h +++ b/src/include/executor/nodeNestloop.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeNestloop.h diff --git a/src/include/executor/nodeProjectSet.h b/src/include/executor/nodeProjectSet.h index 9369443bdb0c8..4ae6cffab5424 100644 --- a/src/include/executor/nodeProjectSet.h +++ b/src/include/executor/nodeProjectSet.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeProjectSet.h diff --git a/src/include/executor/nodeRecursiveunion.h b/src/include/executor/nodeRecursiveunion.h index 0053605dcaf15..f108d4553bdf0 100644 --- a/src/include/executor/nodeRecursiveunion.h +++ b/src/include/executor/nodeRecursiveunion.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeRecursiveunion.h diff --git a/src/include/executor/nodeResult.h b/src/include/executor/nodeResult.h index 86ff91a623652..1332640ab92c3 100644 --- a/src/include/executor/nodeResult.h +++ b/src/include/executor/nodeResult.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeResult.h diff --git a/src/include/executor/nodeSamplescan.h b/src/include/executor/nodeSamplescan.h index 888170a59aeb1..838c1bf4abd2b 100644 --- a/src/include/executor/nodeSamplescan.h +++ b/src/include/executor/nodeSamplescan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeSamplescan.h diff --git a/src/include/executor/nodeSeqscan.h b/src/include/executor/nodeSeqscan.h index a5cab9355b522..68f689e69417e 100644 --- a/src/include/executor/nodeSeqscan.h +++ b/src/include/executor/nodeSeqscan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeSeqscan.h diff --git a/src/include/executor/nodeSetOp.h b/src/include/executor/nodeSetOp.h index 1fdaafa31c27c..9c484c1eab958 100644 --- a/src/include/executor/nodeSetOp.h +++ b/src/include/executor/nodeSetOp.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeSetOp.h diff --git a/src/include/executor/nodeSort.h b/src/include/executor/nodeSort.h index 88e84798905df..0fb2a12d8fbdc 100644 --- a/src/include/executor/nodeSort.h +++ b/src/include/executor/nodeSort.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeSort.h diff --git a/src/include/executor/nodeSubplan.h b/src/include/executor/nodeSubplan.h index 3f0e2bba2b7ea..ad4014701f32a 100644 --- a/src/include/executor/nodeSubplan.h +++ b/src/include/executor/nodeSubplan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeSubplan.h diff --git a/src/include/executor/nodeSubqueryscan.h b/src/include/executor/nodeSubqueryscan.h index cc6a90788300a..f3cdec581c643 100644 --- a/src/include/executor/nodeSubqueryscan.h +++ b/src/include/executor/nodeSubqueryscan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeSubqueryscan.h diff --git a/src/include/executor/nodeTableFuncscan.h b/src/include/executor/nodeTableFuncscan.h index 6c002abbc57df..b0fab0728a2f0 100644 --- a/src/include/executor/nodeTableFuncscan.h +++ b/src/include/executor/nodeTableFuncscan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeTableFuncscan.h diff --git a/src/include/executor/nodeTidrangescan.h b/src/include/executor/nodeTidrangescan.h index 2f46bb53c2793..1cfc7a07be9b4 100644 --- a/src/include/executor/nodeTidrangescan.h +++ b/src/include/executor/nodeTidrangescan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeTidrangescan.h diff --git a/src/include/executor/nodeTidscan.h b/src/include/executor/nodeTidscan.h index ca822064435ad..b17de5dd3e917 100644 --- a/src/include/executor/nodeTidscan.h +++ b/src/include/executor/nodeTidscan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeTidscan.h diff --git a/src/include/executor/nodeUnique.h b/src/include/executor/nodeUnique.h index 671e10aff067b..9f1d39a0cc05d 100644 --- a/src/include/executor/nodeUnique.h +++ b/src/include/executor/nodeUnique.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeUnique.h diff --git a/src/include/executor/nodeValuesscan.h b/src/include/executor/nodeValuesscan.h index a52fa678dfe12..56096ce3d86f6 100644 --- a/src/include/executor/nodeValuesscan.h +++ b/src/include/executor/nodeValuesscan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeValuesscan.h @@ -17,7 +17,6 @@ #include "nodes/execnodes.h" extern ValuesScanState *ExecInitValuesScan(ValuesScan *node, EState *estate, int eflags); -extern void ExecEndValuesScan(ValuesScanState *node); extern void ExecReScanValuesScan(ValuesScanState *node); #endif /* NODEVALUESSCAN_H */ diff --git a/src/include/executor/nodeWindowAgg.h b/src/include/executor/nodeWindowAgg.h index 4a60ab28b9c19..1138af953a498 100644 --- a/src/include/executor/nodeWindowAgg.h +++ b/src/include/executor/nodeWindowAgg.h @@ -4,7 +4,7 @@ * prototypes for nodeWindowAgg.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeWindowAgg.h diff --git a/src/include/executor/nodeWorktablescan.h b/src/include/executor/nodeWorktablescan.h index e553a453f3488..7198a67c33903 100644 --- a/src/include/executor/nodeWorktablescan.h +++ b/src/include/executor/nodeWorktablescan.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/nodeWorktablescan.h @@ -17,7 +17,6 @@ #include "nodes/execnodes.h" extern WorkTableScanState *ExecInitWorkTableScan(WorkTableScan *node, EState *estate, int eflags); -extern void ExecEndWorkTableScan(WorkTableScanState *node); extern void ExecReScanWorkTableScan(WorkTableScanState *node); #endif /* NODEWORKTABLESCAN_H */ diff --git a/src/include/executor/spi.h b/src/include/executor/spi.h index d1de139a3b57b..48b87730ea039 100644 --- a/src/include/executor/spi.h +++ b/src/include/executor/spi.h @@ -3,7 +3,7 @@ * spi.h * Server Programming Interface public declarations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/spi.h @@ -97,16 +97,10 @@ typedef struct _SPI_plan *SPIPlanPtr; #define SPI_OK_REL_UNREGISTER 16 #define SPI_OK_TD_REGISTER 17 #define SPI_OK_MERGE 18 +#define SPI_OK_MERGE_RETURNING 19 #define SPI_OPT_NONATOMIC (1 << 0) -/* These used to be functions, now just no-ops for backwards compatibility */ -#define SPI_push() ((void) 0) -#define SPI_pop() ((void) 0) -#define SPI_push_conditional() false -#define SPI_pop_conditional(pushed) ((void) 0) -#define SPI_restore_connection() ((void) 0) - extern PGDLLIMPORT uint64 SPI_processed; extern PGDLLIMPORT SPITupleTable *SPI_tuptable; extern PGDLLIMPORT int SPI_result; diff --git a/src/include/executor/spi_priv.h b/src/include/executor/spi_priv.h index 92d1bcef7821a..1129ae094e2f1 100644 --- a/src/include/executor/spi_priv.h +++ b/src/include/executor/spi_priv.h @@ -3,7 +3,7 @@ * spi_priv.h * Server Programming Interface private declarations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/spi_priv.h diff --git a/src/include/executor/tablefunc.h b/src/include/executor/tablefunc.h index ca235ae1fb940..f8ceef387cf8f 100644 --- a/src/include/executor/tablefunc.h +++ b/src/include/executor/tablefunc.h @@ -3,7 +3,7 @@ * tablefunc.h * interface for TableFunc executor node * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/tablefunc.h diff --git a/src/include/executor/tqueue.h b/src/include/executor/tqueue.h index 440178bc7c29a..093a6b8875ce1 100644 --- a/src/include/executor/tqueue.h +++ b/src/include/executor/tqueue.h @@ -3,7 +3,7 @@ * tqueue.h * Use shm_mq to send & receive tuples between parallel backends * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/tqueue.h diff --git a/src/include/executor/tstoreReceiver.h b/src/include/executor/tstoreReceiver.h index bbdc9ee7950f8..a46adad031698 100644 --- a/src/include/executor/tstoreReceiver.h +++ b/src/include/executor/tstoreReceiver.h @@ -4,7 +4,7 @@ * prototypes for tstoreReceiver.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/tstoreReceiver.h diff --git a/src/include/executor/tuptable.h b/src/include/executor/tuptable.h index 4210d6d838fa7..b82655e7e5551 100644 --- a/src/include/executor/tuptable.h +++ b/src/include/executor/tuptable.h @@ -4,7 +4,7 @@ * tuple table support stuff * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/executor/tuptable.h @@ -166,6 +166,12 @@ struct TupleTableSlotOps */ Datum (*getsysattr) (TupleTableSlot *slot, int attnum, bool *isnull); + /* + * Check if the tuple is created by the current transaction. Throws an + * error if the slot doesn't contain the storage tuple. + */ + bool (*is_current_xact_tuple) (TupleTableSlot *slot); + /* * Make the contents of the slot solely depend on the slot, and not on * underlying resources (like another memory context, buffers, etc). @@ -174,7 +180,8 @@ struct TupleTableSlotOps /* * Copy the contents of the source slot into the destination slot's own - * context. Invoked using callback of the destination slot. + * context. Invoked using callback of the destination slot. 'dstslot' and + * 'srcslot' can be assumed to have the same number of attributes. */ void (*copyslot) (TupleTableSlot *dstslot, TupleTableSlot *srcslot); @@ -425,6 +432,21 @@ slot_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull) return slot->tts_ops->getsysattr(slot, attnum, isnull); } +/* + * slot_is_current_xact_tuple - check if the slot's current tuple is created + * by the current transaction. + * + * If the slot does not contain a storage tuple, this will throw an error. + * Hence before calling this function, callers should make sure that the + * slot type supports storage tuples and that there is currently one inside + * the slot. + */ +static inline bool +slot_is_current_xact_tuple(TupleTableSlot *slot) +{ + return slot->tts_ops->is_current_xact_tuple(slot); +} + /* * ExecClearTuple - clear the slot's contents */ @@ -477,12 +499,19 @@ ExecCopySlotMinimalTuple(TupleTableSlot *slot) * * If a source's system attributes are supposed to be accessed in the target * slot, the target slot and source slot types need to match. + * + * Currently, 'dstslot' and 'srcslot' must have the same number of attributes. + * Future work could see this relaxed to allow the source to contain + * additional attributes and have the code here only copy over the leading + * attributes. */ static inline TupleTableSlot * ExecCopySlot(TupleTableSlot *dstslot, TupleTableSlot *srcslot) { Assert(!TTS_EMPTY(srcslot)); Assert(srcslot != dstslot); + Assert(dstslot->tts_tupleDescriptor->natts == + srcslot->tts_tupleDescriptor->natts); dstslot->tts_ops->copyslot(dstslot, srcslot); diff --git a/src/include/fe_utils/archive.h b/src/include/fe_utils/archive.h index 8f05ccc060876..1df671978fadf 100644 --- a/src/include/fe_utils/archive.h +++ b/src/include/fe_utils/archive.h @@ -3,7 +3,7 @@ * archive.h * Routines to access WAL archives from frontend * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/fe_utils/archive.h diff --git a/src/include/fe_utils/cancel.h b/src/include/fe_utils/cancel.h index 6e8b9ddfc437c..e934f6cdd4c0c 100644 --- a/src/include/fe_utils/cancel.h +++ b/src/include/fe_utils/cancel.h @@ -3,7 +3,7 @@ * Query cancellation support for frontend code * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/fe_utils/cancel.h diff --git a/src/include/fe_utils/conditional.h b/src/include/fe_utils/conditional.h index 36e72c977cea5..1da96ced2eefc 100644 --- a/src/include/fe_utils/conditional.h +++ b/src/include/fe_utils/conditional.h @@ -14,7 +14,7 @@ * a true branch?) so that the interpreter knows whether to execute * code and whether to evaluate conditions. * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/include/fe_utils/conditional.h * @@ -39,7 +39,7 @@ typedef enum ifState * false parent branch */ IFSTATE_ELSE_TRUE, /* currently in an \else that is true and all * parent branches (if any) are true */ - IFSTATE_ELSE_FALSE /* currently in an \else that is false or + IFSTATE_ELSE_FALSE, /* currently in an \else that is false or * ignored */ } ifState; diff --git a/src/include/fe_utils/connect_utils.h b/src/include/fe_utils/connect_utils.h index ddcd8b32c1681..1267d7f8ce8c0 100644 --- a/src/include/fe_utils/connect_utils.h +++ b/src/include/fe_utils/connect_utils.h @@ -2,7 +2,7 @@ * * Facilities for frontend code to connect to and disconnect from databases. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/fe_utils/connect_utils.h diff --git a/src/include/fe_utils/mbprint.h b/src/include/fe_utils/mbprint.h index fd24c5e193dd1..d7f42f893d9f3 100644 --- a/src/include/fe_utils/mbprint.h +++ b/src/include/fe_utils/mbprint.h @@ -3,7 +3,7 @@ * Multibyte character printing support for frontend code * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/fe_utils/mbprint.h diff --git a/src/include/fe_utils/option_utils.h b/src/include/fe_utils/option_utils.h index b7b0654cee7a6..afd108fdabfa4 100644 --- a/src/include/fe_utils/option_utils.h +++ b/src/include/fe_utils/option_utils.h @@ -2,7 +2,7 @@ * * Command line option processing facilities for frontend code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/fe_utils/option_utils.h @@ -14,6 +14,8 @@ #include "postgres_fe.h" +#include "common/file_utils.h" + typedef void (*help_handler) (const char *progname); extern void handle_help_version_opts(int argc, char *argv[], @@ -22,5 +24,7 @@ extern void handle_help_version_opts(int argc, char *argv[], extern bool option_parse_int(const char *optarg, const char *optname, int min_range, int max_range, int *result); +extern bool parse_sync_method(const char *optarg, + DataDirSyncMethod *sync_method); #endif /* OPTION_UTILS_H */ diff --git a/src/include/fe_utils/parallel_slot.h b/src/include/fe_utils/parallel_slot.h index 0eb8c149e9623..4d79030aa6caf 100644 --- a/src/include/fe_utils/parallel_slot.h +++ b/src/include/fe_utils/parallel_slot.h @@ -3,7 +3,7 @@ * parallel_slot.h * Parallel support for bin/scripts/ * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * src/include/fe_utils/parallel_slot.h * diff --git a/src/include/fe_utils/print.h b/src/include/fe_utils/print.h index cc6652def9eba..72824c5c2fa7c 100644 --- a/src/include/fe_utils/print.h +++ b/src/include/fe_utils/print.h @@ -3,7 +3,7 @@ * Query-result printing support for frontend code * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/fe_utils/print.h @@ -36,7 +36,7 @@ enum printFormat PRINT_LATEX_LONGTABLE, PRINT_TROFF_MS, PRINT_UNALIGNED, - PRINT_WRAPPED + PRINT_WRAPPED, /* add your favourite output format here ... */ }; @@ -55,7 +55,7 @@ typedef enum printTextRule PRINT_RULE_TOP, /* top horizontal line */ PRINT_RULE_MIDDLE, /* intra-data horizontal line */ PRINT_RULE_BOTTOM, /* bottom horizontal line */ - PRINT_RULE_DATA /* data line (hrule is unused here) */ + PRINT_RULE_DATA, /* data line (hrule is unused here) */ } printTextRule; typedef enum printTextLineWrap @@ -63,7 +63,7 @@ typedef enum printTextLineWrap /* Line wrapping conditions */ PRINT_LINE_WRAP_NONE, /* No wrapping */ PRINT_LINE_WRAP_WRAP, /* Wraparound due to overlength line */ - PRINT_LINE_WRAP_NEWLINE /* Newline in data */ + PRINT_LINE_WRAP_NEWLINE, /* Newline in data */ } printTextLineWrap; typedef enum printXheaderWidthType @@ -99,7 +99,7 @@ typedef struct printTextFormat typedef enum unicode_linestyle { UNICODE_LINESTYLE_SINGLE = 0, - UNICODE_LINESTYLE_DOUBLE + UNICODE_LINESTYLE_DOUBLE, } unicode_linestyle; struct separator @@ -171,7 +171,7 @@ typedef struct printTableContent const char **cells; /* NULL-terminated array of cell content * strings */ const char **cell; /* Pointer to the last added cell */ - long cellsadded; /* Number of cells added this far */ + uint64 cellsadded; /* Number of cells added this far */ bool *cellmustfree; /* true for cells that need to be free()d */ printTableFooter *footers; /* Pointer to the first footer */ printTableFooter *footer; /* Pointer to the last added footer */ diff --git a/src/include/fe_utils/psqlscan.h b/src/include/fe_utils/psqlscan.h index 6a90fcab9ebe5..ea489efbec26f 100644 --- a/src/include/fe_utils/psqlscan.h +++ b/src/include/fe_utils/psqlscan.h @@ -10,7 +10,7 @@ * backslash commands. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/fe_utils/psqlscan.h @@ -32,7 +32,7 @@ typedef enum PSCAN_SEMICOLON, /* found command-ending semicolon */ PSCAN_BACKSLASH, /* found backslash command */ PSCAN_INCOMPLETE, /* end of line, SQL statement incomplete */ - PSCAN_EOL /* end of line, SQL possibly complete */ + PSCAN_EOL, /* end of line, SQL possibly complete */ } PsqlScanResult; /* Prompt type returned by psql_scan() */ @@ -45,7 +45,7 @@ typedef enum _promptStatus PROMPT_DOUBLEQUOTE, PROMPT_DOLLARQUOTE, PROMPT_PAREN, - PROMPT_COPY + PROMPT_COPY, } promptStatus_t; /* Quoting request types for get_variable() callback */ @@ -54,7 +54,7 @@ typedef enum PQUOTE_PLAIN, /* just return the actual value */ PQUOTE_SQL_LITERAL, /* add quotes to make a valid SQL literal */ PQUOTE_SQL_IDENT, /* quote if needed to make a SQL identifier */ - PQUOTE_SHELL_ARG /* quote if needed to be safe in a shell cmd */ + PQUOTE_SHELL_ARG, /* quote if needed to be safe in a shell cmd */ } PsqlScanQuoteType; /* Callback functions to be used by the lexer */ diff --git a/src/include/fe_utils/psqlscan_int.h b/src/include/fe_utils/psqlscan_int.h index 373e7e1476313..be3524e37e31d 100644 --- a/src/include/fe_utils/psqlscan_int.h +++ b/src/include/fe_utils/psqlscan_int.h @@ -34,7 +34,7 @@ * same flex version, or if they don't use the same flex options. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/fe_utils/psqlscan_int.h diff --git a/src/include/fe_utils/query_utils.h b/src/include/fe_utils/query_utils.h index e461df9e5c566..9a680d5bffe12 100644 --- a/src/include/fe_utils/query_utils.h +++ b/src/include/fe_utils/query_utils.h @@ -2,7 +2,7 @@ * * Facilities for frontend code to query a databases. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/fe_utils/query_utils.h diff --git a/src/include/fe_utils/recovery_gen.h b/src/include/fe_utils/recovery_gen.h index 8fe567563566d..73c1aa8e59e1a 100644 --- a/src/include/fe_utils/recovery_gen.h +++ b/src/include/fe_utils/recovery_gen.h @@ -2,7 +2,7 @@ * * Generator for recovery configuration * - * Portions Copyright (c) 2011-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2011-2024, PostgreSQL Global Development Group * * src/include/fe_utils/recovery_gen.h * @@ -21,8 +21,9 @@ #define MINIMUM_VERSION_FOR_RECOVERY_GUC 120000 extern PQExpBuffer GenerateRecoveryConfig(PGconn *pgconn, - char *replication_slot); -extern void WriteRecoveryConfig(PGconn *pgconn, char *target_dir, + const char *replication_slot, + char *dbname); +extern void WriteRecoveryConfig(PGconn *pgconn, const char *target_dir, PQExpBuffer contents); #endif /* RECOVERY_GEN_H */ diff --git a/src/include/fe_utils/simple_list.h b/src/include/fe_utils/simple_list.h index 9f87138654bf2..d42ecded8ed5d 100644 --- a/src/include/fe_utils/simple_list.h +++ b/src/include/fe_utils/simple_list.h @@ -7,7 +7,7 @@ * facilities, but it's all we need in, eg, pg_dump. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/fe_utils/simple_list.h diff --git a/src/include/fe_utils/string_utils.h b/src/include/fe_utils/string_utils.h index e10c9090754cc..500f585a4a585 100644 --- a/src/include/fe_utils/string_utils.h +++ b/src/include/fe_utils/string_utils.h @@ -6,7 +6,7 @@ * assorted contexts. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/fe_utils/string_utils.h @@ -25,7 +25,10 @@ extern PQExpBuffer (*getLocalPQExpBuffer) (void); /* Functions */ extern const char *fmtId(const char *rawid); +extern const char *fmtIdEnc(const char *rawid, int encoding); extern const char *fmtQualifiedId(const char *schema, const char *id); +extern const char *fmtQualifiedIdEnc(const char *schema, const char *id, int encoding); +extern void setFmtEncoding(int encoding); extern char *formatPGVersionNumber(int version_number, bool include_minor, char *buf, size_t buflen); diff --git a/src/include/fmgr.h b/src/include/fmgr.h index b120f5e7fefac..ccb4070a25140 100644 --- a/src/include/fmgr.h +++ b/src/include/fmgr.h @@ -8,7 +8,7 @@ * or call fmgr-callable functions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/fmgr.h @@ -783,7 +783,7 @@ typedef enum FmgrHookEventType { FHET_START, FHET_END, - FHET_ABORT + FHET_ABORT, } FmgrHookEventType; typedef bool (*needs_fmgr_hook_type) (Oid fn_oid); diff --git a/src/include/foreign/fdwapi.h b/src/include/foreign/fdwapi.h index 996c62e305591..fcde3876b288e 100644 --- a/src/include/foreign/fdwapi.h +++ b/src/include/foreign/fdwapi.h @@ -3,7 +3,7 @@ * fdwapi.h * API for foreign-data wrappers * - * Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Copyright (c) 2010-2024, PostgreSQL Global Development Group * * src/include/foreign/fdwapi.h * diff --git a/src/include/foreign/foreign.h b/src/include/foreign/foreign.h index 5256d4d91f5b7..82b8153100fd1 100644 --- a/src/include/foreign/foreign.h +++ b/src/include/foreign/foreign.h @@ -4,7 +4,7 @@ * support for foreign-data wrappers, servers and user mappings. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/foreign/foreign.h * diff --git a/src/include/funcapi.h b/src/include/funcapi.h index cc0cca32725ad..1529549a657f3 100644 --- a/src/include/funcapi.h +++ b/src/include/funcapi.h @@ -8,7 +8,7 @@ * or call FUNCAPI-callable functions or macros. * * - * Copyright (c) 2002-2023, PostgreSQL Global Development Group + * Copyright (c) 2002-2024, PostgreSQL Global Development Group * * src/include/funcapi.h * @@ -149,7 +149,7 @@ typedef enum TypeFuncClass TYPEFUNC_COMPOSITE, /* determinable rowtype result */ TYPEFUNC_COMPOSITE_DOMAIN, /* domain over determinable rowtype result */ TYPEFUNC_RECORD, /* indeterminate rowtype result */ - TYPEFUNC_OTHER /* bogus type, eg pseudotype */ + TYPEFUNC_OTHER, /* bogus type, eg pseudotype */ } TypeFuncClass; extern TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo, diff --git a/src/include/getopt_long.h b/src/include/getopt_long.h index 62b4a416eda22..0fdbefae7fbc8 100644 --- a/src/include/getopt_long.h +++ b/src/include/getopt_long.h @@ -2,7 +2,7 @@ * Portions Copyright (c) 1987, 1993, 1994 * The Regents of the University of California. All rights reserved. * - * Portions Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2003-2024, PostgreSQL Global Development Group * * src/include/getopt_long.h */ diff --git a/src/include/jit/SectionMemoryManager.h b/src/include/jit/SectionMemoryManager.h new file mode 100644 index 0000000000000..93cf977157063 --- /dev/null +++ b/src/include/jit/SectionMemoryManager.h @@ -0,0 +1,226 @@ +/* + * This is a copy LLVM source code modified by the PostgreSQL project. + * See SectionMemoryManager.cpp for notes on provenance and license. + */ + +//===- SectionMemoryManager.h - Memory manager for MCJIT/RtDyld -*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file contains the declaration of a section-based memory manager used by +// the MCJIT execution engine and RuntimeDyld. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_EXECUTIONENGINE_BACKPORT_SECTIONMEMORYMANAGER_H +#define LLVM_EXECUTIONENGINE_BACKPORT_SECTIONMEMORYMANAGER_H + +#include "llvm/ADT/SmallVector.h" +#include "llvm/ExecutionEngine/RTDyldMemoryManager.h" +#include "llvm/Support/Alignment.h" +#include "llvm/Support/Memory.h" +#include +#include +#include + +namespace llvm { +namespace backport { + +/// This is a simple memory manager which implements the methods called by +/// the RuntimeDyld class to allocate memory for section-based loading of +/// objects, usually those generated by the MCJIT execution engine. +/// +/// This memory manager allocates all section memory as read-write. The +/// RuntimeDyld will copy JITed section memory into these allocated blocks +/// and perform any necessary linking and relocations. +/// +/// Any client using this memory manager MUST ensure that section-specific +/// page permissions have been applied before attempting to execute functions +/// in the JITed object. Permissions can be applied either by calling +/// MCJIT::finalizeObject or by calling SectionMemoryManager::finalizeMemory +/// directly. Clients of MCJIT should call MCJIT::finalizeObject. +class SectionMemoryManager : public RTDyldMemoryManager { +public: + /// This enum describes the various reasons to allocate pages from + /// allocateMappedMemory. + enum class AllocationPurpose { + Code, + ROData, + RWData, + }; + + /// Implementations of this interface are used by SectionMemoryManager to + /// request pages from the operating system. + class MemoryMapper { + public: + /// This method attempts to allocate \p NumBytes bytes of virtual memory for + /// \p Purpose. \p NearBlock may point to an existing allocation, in which + /// case an attempt is made to allocate more memory near the existing block. + /// The actual allocated address is not guaranteed to be near the requested + /// address. \p Flags is used to set the initial protection flags for the + /// block of the memory. \p EC [out] returns an object describing any error + /// that occurs. + /// + /// This method may allocate more than the number of bytes requested. The + /// actual number of bytes allocated is indicated in the returned + /// MemoryBlock. + /// + /// The start of the allocated block must be aligned with the system + /// allocation granularity (64K on Windows, page size on Linux). If the + /// address following \p NearBlock is not so aligned, it will be rounded up + /// to the next allocation granularity boundary. + /// + /// \r a non-null MemoryBlock if the function was successful, otherwise a + /// null MemoryBlock with \p EC describing the error. + virtual sys::MemoryBlock + allocateMappedMemory(AllocationPurpose Purpose, size_t NumBytes, + const sys::MemoryBlock *const NearBlock, + unsigned Flags, std::error_code &EC) = 0; + + /// This method sets the protection flags for a block of memory to the state + /// specified by \p Flags. The behavior is not specified if the memory was + /// not allocated using the allocateMappedMemory method. + /// \p Block describes the memory block to be protected. + /// \p Flags specifies the new protection state to be assigned to the block. + /// + /// If \p Flags is MF_WRITE, the actual behavior varies with the operating + /// system (i.e. MF_READ | MF_WRITE on Windows) and the target architecture + /// (i.e. MF_WRITE -> MF_READ | MF_WRITE on i386). + /// + /// \r error_success if the function was successful, or an error_code + /// describing the failure if an error occurred. + virtual std::error_code protectMappedMemory(const sys::MemoryBlock &Block, + unsigned Flags) = 0; + + /// This method releases a block of memory that was allocated with the + /// allocateMappedMemory method. It should not be used to release any memory + /// block allocated any other way. + /// \p Block describes the memory to be released. + /// + /// \r error_success if the function was successful, or an error_code + /// describing the failure if an error occurred. + virtual std::error_code releaseMappedMemory(sys::MemoryBlock &M) = 0; + + virtual ~MemoryMapper(); + }; + + /// Creates a SectionMemoryManager instance with \p MM as the associated + /// memory mapper. If \p MM is nullptr then a default memory mapper is used + /// that directly calls into the operating system. + /// + /// If \p ReserveAlloc is true all memory will be pre-allocated, and any + /// attempts to allocate beyond pre-allocated memory will fail. + SectionMemoryManager(MemoryMapper *MM = nullptr, bool ReserveAlloc = false); + SectionMemoryManager(const SectionMemoryManager &) = delete; + void operator=(const SectionMemoryManager &) = delete; + ~SectionMemoryManager() override; + + /// Enable reserveAllocationSpace when requested. + bool needsToReserveAllocationSpace() override { return ReserveAllocation; } + + /// Implements allocating all memory in a single block. This is required to + /// limit memory offsets to fit the ARM ABI; large memory systems may + /// otherwise allocate separate sections too far apart. +#if LLVM_VERSION_MAJOR < 16 + virtual void reserveAllocationSpace(uintptr_t CodeSize, uint32_t CodeAlign, + uintptr_t RODataSize, + uint32_t RODataAlign, + uintptr_t RWDataSize, + uint32_t RWDataAlign) override; +#else + void reserveAllocationSpace(uintptr_t CodeSize, Align CodeAlign, + uintptr_t RODataSize, Align RODataAlign, + uintptr_t RWDataSize, Align RWDataAlign) override; +#endif + + /// Allocates a memory block of (at least) the given size suitable for + /// executable code. + /// + /// The value of \p Alignment must be a power of two. If \p Alignment is zero + /// a default alignment of 16 will be used. + uint8_t *allocateCodeSection(uintptr_t Size, unsigned Alignment, + unsigned SectionID, + StringRef SectionName) override; + + /// Allocates a memory block of (at least) the given size suitable for + /// executable code. + /// + /// The value of \p Alignment must be a power of two. If \p Alignment is zero + /// a default alignment of 16 will be used. + uint8_t *allocateDataSection(uintptr_t Size, unsigned Alignment, + unsigned SectionID, StringRef SectionName, + bool isReadOnly) override; + + /// Update section-specific memory permissions and other attributes. + /// + /// This method is called when object loading is complete and section page + /// permissions can be applied. It is up to the memory manager implementation + /// to decide whether or not to act on this method. The memory manager will + /// typically allocate all sections as read-write and then apply specific + /// permissions when this method is called. Code sections cannot be executed + /// until this function has been called. In addition, any cache coherency + /// operations needed to reliably use the memory are also performed. + /// + /// \returns true if an error occurred, false otherwise. + bool finalizeMemory(std::string *ErrMsg = nullptr) override; + + /// Invalidate instruction cache for code sections. + /// + /// Some platforms with separate data cache and instruction cache require + /// explicit cache flush, otherwise JIT code manipulations (like resolved + /// relocations) will get to the data cache but not to the instruction cache. + /// + /// This method is called from finalizeMemory. + virtual void invalidateInstructionCache(); + +private: + struct FreeMemBlock { + // The actual block of free memory + sys::MemoryBlock Free; + // If there is a pending allocation from the same reservation right before + // this block, store it's index in PendingMem, to be able to update the + // pending region if part of this block is allocated, rather than having to + // create a new one + unsigned PendingPrefixIndex; + }; + + struct MemoryGroup { + // PendingMem contains all blocks of memory (subblocks of AllocatedMem) + // which have not yet had their permissions applied, but have been given + // out to the user. FreeMem contains all block of memory, which have + // neither had their permissions applied, nor been given out to the user. + SmallVector PendingMem; + SmallVector FreeMem; + + // All memory blocks that have been requested from the system + SmallVector AllocatedMem; + + sys::MemoryBlock Near; + }; + + uint8_t *allocateSection(AllocationPurpose Purpose, uintptr_t Size, + unsigned Alignment); + + std::error_code applyMemoryGroupPermissions(MemoryGroup &MemGroup, + unsigned Permissions); + + bool hasSpace(const MemoryGroup &MemGroup, uintptr_t Size) const; + + void anchor() override; + + MemoryGroup CodeMem; + MemoryGroup RWDataMem; + MemoryGroup RODataMem; + MemoryMapper *MMapper; + std::unique_ptr OwnedMMapper; + bool ReserveAllocation; +}; + +} // end namespace backport +} // end namespace llvm + +#endif // LLVM_EXECUTIONENGINE_BACKPORT_SECTIONMEMORYMANAGER_H diff --git a/src/include/jit/jit.h b/src/include/jit/jit.h index 14f2e36b3711b..d9a080ce98f50 100644 --- a/src/include/jit/jit.h +++ b/src/include/jit/jit.h @@ -2,7 +2,7 @@ * jit.h * Provider independent JIT infrastructure. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * src/include/jit/jit.h * @@ -32,6 +32,9 @@ typedef struct JitInstrumentation /* accumulated time to generate code */ instr_time generation_counter; + /* accumulated time to deform tuples, included into generation_counter */ + instr_time deform_counter; + /* accumulated time for inlining */ instr_time inlining_counter; @@ -56,8 +59,6 @@ typedef struct JitContext /* see PGJIT_* above */ int flags; - ResourceOwner resowner; - JitInstrumentation instr; } JitContext; diff --git a/src/include/jit/llvmjit.h b/src/include/jit/llvmjit.h index 551b585464671..dc0d86f4c1da9 100644 --- a/src/include/jit/llvmjit.h +++ b/src/include/jit/llvmjit.h @@ -2,7 +2,7 @@ * llvmjit.h * LLVM JIT provider. * - * Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Copyright (c) 2016-2024, PostgreSQL Global Development Group * * src/include/jit/llvmjit.h * @@ -17,7 +17,12 @@ */ #ifdef USE_LLVM +#include "jit/llvmjit_backport.h" + #include +#ifdef USE_LLVM_BACKPORT_SECTION_MEMORY_MANAGER +#include +#endif /* @@ -39,9 +44,19 @@ typedef struct LLVMJitContext { JitContext base; + /* used to ensure cleanup of context */ + ResourceOwner resowner; + /* number of modules created */ size_t module_generation; + /* + * The LLVM Context used by this JIT context. An LLVM context is reused + * across many compilations, but occasionally reset to prevent it using + * too much memory due to more and more types accumulating. + */ + LLVMContextRef llvm_context; + /* current, "open for write", module */ LLVMModuleRef module; @@ -55,9 +70,6 @@ typedef struct LLVMJitContext List *handles; } LLVMJitContext; -/* llvm module containing information about types */ -extern PGDLLIMPORT LLVMModuleRef llvm_types_module; - /* type and struct definitions */ extern PGDLLIMPORT LLVMTypeRef TypeParamBool; extern PGDLLIMPORT LLVMTypeRef TypePGFunction; @@ -67,6 +79,8 @@ extern PGDLLIMPORT LLVMTypeRef TypeStorageBool; extern PGDLLIMPORT LLVMTypeRef StructNullableDatum; extern PGDLLIMPORT LLVMTypeRef StructTupleDescData; extern PGDLLIMPORT LLVMTypeRef StructHeapTupleData; +extern PGDLLIMPORT LLVMTypeRef StructHeapTupleHeaderData; +extern PGDLLIMPORT LLVMTypeRef StructMinimalTupleData; extern PGDLLIMPORT LLVMTypeRef StructTupleTableSlot; extern PGDLLIMPORT LLVMTypeRef StructHeapTupleTableSlot; extern PGDLLIMPORT LLVMTypeRef StructMinimalTupleTableSlot; @@ -78,8 +92,11 @@ extern PGDLLIMPORT LLVMTypeRef StructExprState; extern PGDLLIMPORT LLVMTypeRef StructAggState; extern PGDLLIMPORT LLVMTypeRef StructAggStatePerTransData; extern PGDLLIMPORT LLVMTypeRef StructAggStatePerGroupData; +extern PGDLLIMPORT LLVMTypeRef StructPlanState; extern PGDLLIMPORT LLVMValueRef AttributeTemplate; +extern PGDLLIMPORT LLVMValueRef ExecEvalBoolSubroutineTemplate; +extern PGDLLIMPORT LLVMValueRef ExecEvalSubroutineTemplate; extern void llvm_enter_fatal_on_oom(void); @@ -102,6 +119,7 @@ extern LLVMValueRef llvm_function_reference(LLVMJitContext *context, LLVMModuleRef mod, FunctionCallInfo fcinfo); +extern void llvm_inline_reset_caches(void); extern void llvm_inline(LLVMModuleRef mod); /* @@ -120,20 +138,12 @@ extern LLVMValueRef slot_compile_deform(struct LLVMJitContext *context, TupleDes * Error handling related functions. **************************************************************************** */ -#if defined(HAVE_DECL_LLVMGETHOSTCPUNAME) && !HAVE_DECL_LLVMGETHOSTCPUNAME -/** Get the host CPU as a string. The result needs to be disposed with - LLVMDisposeMessage. */ -extern char *LLVMGetHostCPUName(void); -#endif - -#if defined(HAVE_DECL_LLVMGETHOSTCPUFEATURES) && !HAVE_DECL_LLVMGETHOSTCPUFEATURES -/** Get the host CPU features as a string. The result needs to be disposed - with LLVMDisposeMessage. */ -extern char *LLVMGetHostCPUFeatures(void); +extern LLVMTypeRef LLVMGetFunctionReturnType(LLVMValueRef r); +extern LLVMTypeRef LLVMGetFunctionType(LLVMValueRef r); +#ifdef USE_LLVM_BACKPORT_SECTION_MEMORY_MANAGER +extern LLVMOrcObjectLayerRef LLVMOrcCreateRTDyldObjectLinkingLayerWithSafeSectionMemoryManager(LLVMOrcExecutionSessionRef ES); #endif -extern unsigned LLVMGetAttributeCountAtIndexPG(LLVMValueRef F, uint32 Idx); - #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/src/include/jit/llvmjit_backport.h b/src/include/jit/llvmjit_backport.h new file mode 100644 index 0000000000000..92874f7998ca6 --- /dev/null +++ b/src/include/jit/llvmjit_backport.h @@ -0,0 +1,25 @@ +/* + * A small header than can be included by backported LLVM code or PostgreSQL + * code, to control conditional compilation. + */ +#ifndef LLVMJIT_BACKPORT_H +#define LLVMJIT_BACKPORT_H + +#include + +/* + * LLVM's RuntimeDyld can produce code that crashes on larger memory ARM + * systems, because llvm::SectionMemoryManager allocates multiple pieces of + * memory that can be placed too far apart for the generated code. See + * src/backend/jit/llvm/SectionMemoryManager.cpp for the patched replacement + * class llvm::backport::SectionMemoryManager that we use as a workaround. + * This header controls whether we use it. + * + * We have adjusted it to compile against a range of LLVM versions, but not + * further back than 12 for now. + */ +#if defined(__aarch64__) && LLVM_VERSION_MAJOR > 11 +#define USE_LLVM_BACKPORT_SECTION_MEMORY_MANAGER +#endif + +#endif diff --git a/src/include/jit/llvmjit_emit.h b/src/include/jit/llvmjit_emit.h index 0745dcac9c23e..4f35f3dca139f 100644 --- a/src/include/jit/llvmjit_emit.h +++ b/src/include/jit/llvmjit_emit.h @@ -2,7 +2,7 @@ * llvmjit_emit.h * Helpers to make emitting LLVM IR a bit more concise and pgindent proof. * - * Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Copyright (c) 2018-2024, PostgreSQL Global Development Group * * src/include/jit/llvmjit_emit.h */ @@ -16,6 +16,7 @@ #ifdef USE_LLVM #include +#include #include "jit/llvmjit.h" @@ -44,36 +45,36 @@ l_ptr(LLVMTypeRef t) * Emit constant integer. */ static inline LLVMValueRef -l_int8_const(int8 i) +l_int8_const(LLVMContextRef lc, int8 i) { - return LLVMConstInt(LLVMInt8Type(), i, false); + return LLVMConstInt(LLVMInt8TypeInContext(lc), i, false); } /* * Emit constant integer. */ static inline LLVMValueRef -l_int16_const(int16 i) +l_int16_const(LLVMContextRef lc, int16 i) { - return LLVMConstInt(LLVMInt16Type(), i, false); + return LLVMConstInt(LLVMInt16TypeInContext(lc), i, false); } /* * Emit constant integer. */ static inline LLVMValueRef -l_int32_const(int32 i) +l_int32_const(LLVMContextRef lc, int32 i) { - return LLVMConstInt(LLVMInt32Type(), i, false); + return LLVMConstInt(LLVMInt32TypeInContext(lc), i, false); } /* * Emit constant integer. */ static inline LLVMValueRef -l_int64_const(int64 i) +l_int64_const(LLVMContextRef lc, int64 i) { - return LLVMConstInt(LLVMInt64Type(), i, false); + return LLVMConstInt(LLVMInt64TypeInContext(lc), i, false); } /* @@ -103,26 +104,65 @@ l_pbool_const(bool i) return LLVMConstInt(TypeParamBool, (int) i, false); } +static inline LLVMValueRef +l_struct_gep(LLVMBuilderRef b, LLVMTypeRef t, LLVMValueRef v, int32 idx, const char *name) +{ +#if LLVM_VERSION_MAJOR < 16 + return LLVMBuildStructGEP(b, v, idx, ""); +#else + return LLVMBuildStructGEP2(b, t, v, idx, ""); +#endif +} + +static inline LLVMValueRef +l_gep(LLVMBuilderRef b, LLVMTypeRef t, LLVMValueRef v, LLVMValueRef *indices, int32 nindices, const char *name) +{ +#if LLVM_VERSION_MAJOR < 16 + return LLVMBuildGEP(b, v, indices, nindices, name); +#else + return LLVMBuildGEP2(b, t, v, indices, nindices, name); +#endif +} + +static inline LLVMValueRef +l_load(LLVMBuilderRef b, LLVMTypeRef t, LLVMValueRef v, const char *name) +{ +#if LLVM_VERSION_MAJOR < 16 + return LLVMBuildLoad(b, v, name); +#else + return LLVMBuildLoad2(b, t, v, name); +#endif +} + +static inline LLVMValueRef +l_call(LLVMBuilderRef b, LLVMTypeRef t, LLVMValueRef fn, LLVMValueRef *args, int32 nargs, const char *name) +{ +#if LLVM_VERSION_MAJOR < 16 + return LLVMBuildCall(b, fn, args, nargs, name); +#else + return LLVMBuildCall2(b, t, fn, args, nargs, name); +#endif +} + /* * Load a pointer member idx from a struct. */ static inline LLVMValueRef -l_load_struct_gep(LLVMBuilderRef b, LLVMValueRef v, int32 idx, const char *name) +l_load_struct_gep(LLVMBuilderRef b, LLVMTypeRef t, LLVMValueRef v, int32 idx, const char *name) { - LLVMValueRef v_ptr = LLVMBuildStructGEP(b, v, idx, ""); - - return LLVMBuildLoad(b, v_ptr, name); + return l_load(b, + LLVMStructGetTypeAtIndex(t, idx), + l_struct_gep(b, t, v, idx, ""), + name); } /* * Load value of a pointer, after applying one index operation. */ static inline LLVMValueRef -l_load_gep1(LLVMBuilderRef b, LLVMValueRef v, LLVMValueRef idx, const char *name) +l_load_gep1(LLVMBuilderRef b, LLVMTypeRef t, LLVMValueRef v, LLVMValueRef idx, const char *name) { - LLVMValueRef v_ptr = LLVMBuildGEP(b, v, &idx, 1, ""); - - return LLVMBuildLoad(b, v_ptr, name); + return l_load(b, t, l_gep(b, t, v, &idx, 1, ""), name); } /* separate, because pg_attribute_printf(2, 3) can't appear in definition */ @@ -137,12 +177,15 @@ l_bb_before_v(LLVMBasicBlockRef r, const char *fmt,...) { char buf[512]; va_list args; + LLVMContextRef lc; va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); - return LLVMInsertBasicBlock(r, buf); + lc = LLVMGetTypeContext(LLVMTypeOf(LLVMGetBasicBlockParent(r))); + + return LLVMInsertBasicBlockInContext(lc, r, buf); } /* separate, because pg_attribute_printf(2, 3) can't appear in definition */ @@ -157,12 +200,15 @@ l_bb_append_v(LLVMValueRef f, const char *fmt,...) { char buf[512]; va_list args; + LLVMContextRef lc; va_start(args, fmt); vsnprintf(buf, sizeof(buf), fmt, args); va_end(args); - return LLVMAppendBasicBlock(f, buf); + lc = LLVMGetTypeContext(LLVMTypeOf(f)); + + return LLVMAppendBasicBlockInContext(lc, f, buf); } /* @@ -174,7 +220,7 @@ l_callsite_ro(LLVMValueRef f) const char argname[] = "readonly"; LLVMAttributeRef ref; - ref = LLVMCreateStringAttribute(LLVMGetGlobalContext(), + ref = LLVMCreateStringAttribute(LLVMGetTypeContext(LLVMTypeOf(f)), argname, sizeof(argname) - 1, NULL, 0); @@ -194,7 +240,7 @@ l_callsite_alwaysinline(LLVMValueRef f) id = LLVMGetEnumAttributeKindForName(argname, sizeof(argname) - 1); - attr = LLVMCreateEnumAttribute(LLVMGetGlobalContext(), id, 0); + attr = LLVMCreateEnumAttribute(LLVMGetTypeContext(LLVMTypeOf(f)), id, 0); LLVMAddCallSiteAttribute(f, LLVMAttributeFunctionIndex, attr); } @@ -210,7 +256,7 @@ l_mcxt_switch(LLVMModuleRef mod, LLVMBuilderRef b, LLVMValueRef nc) if (!(cur = LLVMGetNamedGlobal(mod, cmc))) cur = LLVMAddGlobal(mod, l_ptr(StructMemoryContextData), cmc); - ret = LLVMBuildLoad(b, cur, cmc); + ret = l_load(b, l_ptr(StructMemoryContextData), cur, cmc); LLVMBuildStore(b, nc, cur); return ret; @@ -225,13 +271,21 @@ l_funcnullp(LLVMBuilderRef b, LLVMValueRef v_fcinfo, size_t argno) LLVMValueRef v_args; LLVMValueRef v_argn; - v_args = LLVMBuildStructGEP(b, - v_fcinfo, - FIELDNO_FUNCTIONCALLINFODATA_ARGS, - ""); - v_argn = LLVMBuildStructGEP(b, v_args, argno, ""); - - return LLVMBuildStructGEP(b, v_argn, FIELDNO_NULLABLE_DATUM_ISNULL, ""); + v_args = l_struct_gep(b, + StructFunctionCallInfoData, + v_fcinfo, + FIELDNO_FUNCTIONCALLINFODATA_ARGS, + ""); + v_argn = l_struct_gep(b, + LLVMArrayType(StructNullableDatum, 0), + v_args, + argno, + ""); + return l_struct_gep(b, + StructNullableDatum, + v_argn, + FIELDNO_NULLABLE_DATUM_ISNULL, + ""); } /* @@ -243,13 +297,21 @@ l_funcvaluep(LLVMBuilderRef b, LLVMValueRef v_fcinfo, size_t argno) LLVMValueRef v_args; LLVMValueRef v_argn; - v_args = LLVMBuildStructGEP(b, - v_fcinfo, - FIELDNO_FUNCTIONCALLINFODATA_ARGS, - ""); - v_argn = LLVMBuildStructGEP(b, v_args, argno, ""); - - return LLVMBuildStructGEP(b, v_argn, FIELDNO_NULLABLE_DATUM_DATUM, ""); + v_args = l_struct_gep(b, + StructFunctionCallInfoData, + v_fcinfo, + FIELDNO_FUNCTIONCALLINFODATA_ARGS, + ""); + v_argn = l_struct_gep(b, + LLVMArrayType(StructNullableDatum, 0), + v_args, + argno, + ""); + return l_struct_gep(b, + StructNullableDatum, + v_argn, + FIELDNO_NULLABLE_DATUM_DATUM, + ""); } /* @@ -258,7 +320,7 @@ l_funcvaluep(LLVMBuilderRef b, LLVMValueRef v_fcinfo, size_t argno) static inline LLVMValueRef l_funcnull(LLVMBuilderRef b, LLVMValueRef v_fcinfo, size_t argno) { - return LLVMBuildLoad(b, l_funcnullp(b, v_fcinfo, argno), ""); + return l_load(b, TypeStorageBool, l_funcnullp(b, v_fcinfo, argno), ""); } /* @@ -267,7 +329,7 @@ l_funcnull(LLVMBuilderRef b, LLVMValueRef v_fcinfo, size_t argno) static inline LLVMValueRef l_funcvalue(LLVMBuilderRef b, LLVMValueRef v_fcinfo, size_t argno) { - return LLVMBuildLoad(b, l_funcvaluep(b, v_fcinfo, argno), ""); + return l_load(b, TypeSizeT, l_funcvaluep(b, v_fcinfo, argno), ""); } #endif /* USE_LLVM */ diff --git a/src/include/lib/binaryheap.h b/src/include/lib/binaryheap.h index 52f7b06b253e5..19025c08ef1f3 100644 --- a/src/include/lib/binaryheap.h +++ b/src/include/lib/binaryheap.h @@ -3,7 +3,7 @@ * * A simple binary heap implementation * - * Portions Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2024, PostgreSQL Global Development Group * * src/include/lib/binaryheap.h */ @@ -11,11 +11,23 @@ #ifndef BINARYHEAP_H #define BINARYHEAP_H +/* + * We provide a Datum-based API for backend code and a void *-based API for + * frontend code (since the Datum definitions are not available to frontend + * code). You should typically avoid using bh_node_type directly and instead + * use Datum or void * as appropriate. + */ +#ifdef FRONTEND +typedef void *bh_node_type; +#else +typedef Datum bh_node_type; +#endif + /* * For a max-heap, the comparator must return <0 iff a < b, 0 iff a == b, * and >0 iff a > b. For a min-heap, the conditions are reversed. */ -typedef int (*binaryheap_comparator) (Datum a, Datum b, void *arg); +typedef int (*binaryheap_comparator) (bh_node_type a, bh_node_type b, void *arg); /* * binaryheap @@ -34,7 +46,7 @@ typedef struct binaryheap bool bh_has_heap_property; /* debugging cross-check */ binaryheap_comparator bh_compare; void *bh_arg; - Datum bh_nodes[FLEXIBLE_ARRAY_MEMBER]; + bh_node_type bh_nodes[FLEXIBLE_ARRAY_MEMBER]; } binaryheap; extern binaryheap *binaryheap_allocate(int capacity, @@ -42,13 +54,16 @@ extern binaryheap *binaryheap_allocate(int capacity, void *arg); extern void binaryheap_reset(binaryheap *heap); extern void binaryheap_free(binaryheap *heap); -extern void binaryheap_add_unordered(binaryheap *heap, Datum d); +extern void binaryheap_add_unordered(binaryheap *heap, bh_node_type d); extern void binaryheap_build(binaryheap *heap); -extern void binaryheap_add(binaryheap *heap, Datum d); -extern Datum binaryheap_first(binaryheap *heap); -extern Datum binaryheap_remove_first(binaryheap *heap); -extern void binaryheap_replace_first(binaryheap *heap, Datum d); +extern void binaryheap_add(binaryheap *heap, bh_node_type d); +extern bh_node_type binaryheap_first(binaryheap *heap); +extern bh_node_type binaryheap_remove_first(binaryheap *heap); +extern void binaryheap_remove_node(binaryheap *heap, int n); +extern void binaryheap_replace_first(binaryheap *heap, bh_node_type d); #define binaryheap_empty(h) ((h)->bh_size == 0) +#define binaryheap_size(h) ((h)->bh_size) +#define binaryheap_get_node(h, n) ((h)->bh_nodes[n]) #endif /* BINARYHEAP_H */ diff --git a/src/include/lib/bipartite_match.h b/src/include/lib/bipartite_match.h index 8fbbcaeb5000e..f34a7c151d20e 100644 --- a/src/include/lib/bipartite_match.h +++ b/src/include/lib/bipartite_match.h @@ -1,7 +1,7 @@ /* * bipartite_match.h * - * Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Copyright (c) 2015-2024, PostgreSQL Global Development Group * * src/include/lib/bipartite_match.h */ diff --git a/src/include/lib/bloomfilter.h b/src/include/lib/bloomfilter.h index 5a98c09ab8aba..6ec7173843fff 100644 --- a/src/include/lib/bloomfilter.h +++ b/src/include/lib/bloomfilter.h @@ -3,7 +3,7 @@ * bloomfilter.h * Space-efficient set membership testing * - * Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Copyright (c) 2018-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/lib/bloomfilter.h diff --git a/src/include/lib/dshash.h b/src/include/lib/dshash.h index ece5552122683..7dda269b7535e 100644 --- a/src/include/lib/dshash.h +++ b/src/include/lib/dshash.h @@ -3,7 +3,7 @@ * dshash.h * Concurrent hash tables backed by dynamic shared memory areas. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -37,17 +37,19 @@ typedef int (*dshash_compare_function) (const void *a, const void *b, typedef dshash_hash (*dshash_hash_function) (const void *v, size_t size, void *arg); +/* A function type for copying keys. */ +typedef void (*dshash_copy_function) (void *dest, const void *src, size_t size, + void *arg); + /* * The set of parameters needed to create or attach to a hash table. The - * members tranche_id and tranche_name do not need to be initialized when - * attaching to an existing hash table. + * tranche_id member does not need to be initialized when attaching to an + * existing hash table. * - * Compare and hash functions must be supplied even when attaching, because we - * can't safely share function pointers between backends in general. Either - * the arg variants or the non-arg variants should be supplied; the other - * function pointers should be NULL. If the arg variants are supplied then the - * user data pointer supplied to the create and attach functions will be - * passed to the hash and compare functions. + * Compare, hash, and copy functions must be supplied even when attaching, + * because we can't safely share function pointers between backends in general. + * The user data pointer supplied to the create and attach functions will be + * passed to these functions. */ typedef struct dshash_parameters { @@ -55,6 +57,7 @@ typedef struct dshash_parameters size_t entry_size; /* Total size of entry */ dshash_compare_function compare_function; /* Compare function */ dshash_hash_function hash_function; /* Hash function */ + dshash_copy_function copy_function; /* Copy function */ int tranche_id; /* The tranche ID to use for locks */ } dshash_parameters; @@ -105,9 +108,21 @@ extern void *dshash_seq_next(dshash_seq_status *status); extern void dshash_seq_term(dshash_seq_status *status); extern void dshash_delete_current(dshash_seq_status *status); -/* Convenience hash and compare functions wrapping memcmp and tag_hash. */ +/* + * Convenience hash, compare, and copy functions wrapping memcmp, tag_hash, and + * memcpy. + */ extern int dshash_memcmp(const void *a, const void *b, size_t size, void *arg); extern dshash_hash dshash_memhash(const void *v, size_t size, void *arg); +extern void dshash_memcpy(void *dest, const void *src, size_t size, void *arg); + +/* + * Convenience hash, compare, and copy functions wrapping strcmp, string_hash, + * and strcpy. + */ +extern int dshash_strcmp(const void *a, const void *b, size_t size, void *arg); +extern dshash_hash dshash_strhash(const void *v, size_t size, void *arg); +extern void dshash_strcpy(void *dest, const void *src, size_t size, void *arg); /* Debugging support. */ extern void dshash_dump(dshash_table *hash_table); diff --git a/src/include/lib/hyperloglog.h b/src/include/lib/hyperloglog.h index f4150f0e85a74..45f7de710bdc1 100644 --- a/src/include/lib/hyperloglog.h +++ b/src/include/lib/hyperloglog.h @@ -3,7 +3,7 @@ * * A simple HyperLogLog cardinality estimator implementation * - * Portions Copyright (c) 2014-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2014-2024, PostgreSQL Global Development Group * * Based on Hideaki Ohno's C++ implementation. The copyright terms of Ohno's * original version (the MIT license) follow. diff --git a/src/include/lib/ilist.h b/src/include/lib/ilist.h index 095107a99c47a..381f6158645e7 100644 --- a/src/include/lib/ilist.h +++ b/src/include/lib/ilist.h @@ -112,7 +112,7 @@ * } * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/lib/integerset.h b/src/include/lib/integerset.h index d7f711ee8b6b4..fb27466003c1e 100644 --- a/src/include/lib/integerset.h +++ b/src/include/lib/integerset.h @@ -2,7 +2,7 @@ * integerset.h * In-memory data structure to hold a large set of integers efficiently * - * Portions Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2024, PostgreSQL Global Development Group * * src/include/lib/integerset.h */ diff --git a/src/include/lib/knapsack.h b/src/include/lib/knapsack.h index 04427ba7b5c1e..1a93841fdc462 100644 --- a/src/include/lib/knapsack.h +++ b/src/include/lib/knapsack.h @@ -1,7 +1,7 @@ /* * knapsack.h * - * Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Copyright (c) 2017-2024, PostgreSQL Global Development Group * * src/include/lib/knapsack.h */ diff --git a/src/include/lib/pairingheap.h b/src/include/lib/pairingheap.h index 5691e10342d63..7eade81535a5e 100644 --- a/src/include/lib/pairingheap.h +++ b/src/include/lib/pairingheap.h @@ -3,7 +3,7 @@ * * A Pairing Heap implementation * - * Portions Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2024, PostgreSQL Global Development Group * * src/include/lib/pairingheap.h */ diff --git a/src/include/lib/qunique.h b/src/include/lib/qunique.h index 30b67c794f67d..eda617fde5a09 100644 --- a/src/include/lib/qunique.h +++ b/src/include/lib/qunique.h @@ -2,7 +2,7 @@ * * qunique.h * inline array unique functions - * Portions Copyright (c) 2019-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2019-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/lib/qunique.h diff --git a/src/include/lib/radixtree.h b/src/include/lib/radixtree.h new file mode 100644 index 0000000000000..4cbadf4f5ec60 --- /dev/null +++ b/src/include/lib/radixtree.h @@ -0,0 +1,3066 @@ +/*------------------------------------------------------------------------- + * + * radixtree.h + * Template for adaptive radix tree. + * + * A template to generate an "adaptive radix tree", specialized for value + * types and for local/shared memory. + * + * The concept originates from the paper "The Adaptive Radix Tree: ARTful + * Indexing for Main-Memory Databases" by Viktor Leis, Alfons Kemper, + * and Thomas Neumann, 2013. + * + * Radix trees have some advantages over hash tables: + * - The keys are logically ordered, allowing efficient sorted iteration + * and range queries + * - Operations using keys that are lexicographically close together + * will have favorable memory locality + * - Memory use grows gradually rather than by doubling + * - The key does not need to be stored with the value, since the key + * is implicitly contained in the path to the value + * + * Some disadvantages are: + * - Point queries (along with insertion and deletion) are slower than + * a linear probing hash table as in simplehash.h + * - Memory usage varies by key distribution, so is difficult to predict + * + * A classic radix tree consists of nodes, each containing an array of + * pointers to child nodes. The size of the array is determined by the + * "span" of the tree, which is the number of bits of the key used to + * index into the array. For example, with a span of 6, a "chunk" + * of 6 bits is extracted from the key at each node traversal, and + * the arrays thus have a "fanout" of 2^6 or 64 entries. A large span + * allows a shorter tree, but requires larger arrays that may be mostly + * wasted space. + * + * The key idea of the adaptive radix tree is to choose different + * data structures based on the number of child nodes. A node will + * start out small when it is first populated, and when it is full, + * it is replaced by the next larger size. Conversely, when a node + * becomes mostly empty, it is replaced by the next smaller node. The + * bulk of the code complexity in this module stems from this dynamic + * switching. One mitigating factor is using a span of 8, since bytes + * are directly addressable. + * + * The ART paper mentions three ways to implement leaves: + * + * "- Single-value leaves: The values are stored using an addi- + * tional leaf node type which stores one value. + * - Multi-value leaves: The values are stored in one of four + * different leaf node types, which mirror the structure of + * inner nodes, but contain values instead of pointers. + * - Combined pointer/value slots: If values fit into point- + * ers, no separate node types are necessary. Instead, each + * pointer storage location in an inner node can either + * store a pointer or a value." + * + * We use a form of "combined pointer/value slots", as recommended. Values + * of size (if fixed at compile time) equal or smaller than the platform's + * pointer type are stored in the child slots of the last level node, + * while larger values are the same as "single-value" leaves above. This + * offers flexibility and efficiency. Variable-length types are currently + * treated as single-value leaves for simplicity, but future work may + * allow those to be stored in the child pointer arrays, when they're + * small enough. + * + * There are two other techniques described in the paper that are not + * implemented here: + * - path compression "...removes all inner nodes that have only a single child." + * - lazy path expansion "...inner nodes are only created if they are required + * to distinguish at least two leaf nodes." + * + * We do have a form of "poor man's path compression", however, enabled by + * only supporting unsigned integer keys (for now assumed to be 64-bit): + * A tree doesn't contain paths where the highest bytes of all keys are + * zero. That way, the tree's height adapts to the distribution of keys. + * + * To handle concurrency, we use a single reader-writer lock for the + * radix tree. If concurrent write operations are possible, the tree + * must be exclusively locked during write operations such as RT_SET() + * and RT_DELETE(), and share locked during read operations such as + * RT_FIND() and RT_BEGIN_ITERATE(). + * + * TODO: The current locking mechanism is not optimized for high + * concurrency with mixed read-write workloads. In the future it might + * be worthwhile to replace it with the Optimistic Lock Coupling or + * ROWEX mentioned in the paper "The ART of Practical Synchronization" + * by the same authors as the ART paper, 2016. + * + * To generate a radix tree and associated functions for a use case + * several macros have to be #define'ed before this file is included. + * Including the file #undef's all those, so a new radix tree can be + * generated afterwards. + * + * The relevant parameters are: + * - RT_PREFIX - prefix for all symbol names generated. A prefix of "foo" + * will result in radix tree type "foo_radix_tree" and functions like + * "foo_create"/"foo_free" and so forth. + * - RT_DECLARE - if defined function prototypes and type declarations are + * generated + * - RT_DEFINE - if defined function definitions are generated + * - RT_SCOPE - in which scope (e.g. extern, static inline) do function + * declarations reside + * - RT_VALUE_TYPE - the type of the value. + * - RT_VARLEN_VALUE_SIZE() - for variable length values, an expression + * involving a pointer to the value type, to calculate size. + * NOTE: implies that the value is in fact variable-length, + * so do not set for fixed-length values. + * - RT_RUNTIME_EMBEDDABLE_VALUE - for variable length values, allows + * storing the value in a child pointer slot, rather than as a single- + * value leaf, if small enough. This requires that the value, when + * read as a child pointer, can be tagged in the lowest bit. + * + * Optional parameters: + * - RT_SHMEM - if defined, the radix tree is created in the DSA area + * so that multiple processes can access it simultaneously. + * - RT_DEBUG - if defined add stats tracking and debugging functions + * + * Interface + * --------- + * + * RT_CREATE - Create a new, empty radix tree + * RT_FREE - Free the radix tree + * RT_FIND - Lookup the value for a given key + * RT_SET - Set a key-value pair + * RT_BEGIN_ITERATE - Begin iterating through all key-value pairs + * RT_ITERATE_NEXT - Return next key-value pair, if any + * RT_END_ITERATE - End iteration + * RT_MEMORY_USAGE - Get the memory as measured by space in memory context blocks + * + * Interface for Shared Memory + * --------- + * + * RT_ATTACH - Attach to the radix tree + * RT_DETACH - Detach from the radix tree + * RT_LOCK_EXCLUSIVE - Lock the radix tree in exclusive mode + * RT_LOCK_SHARE - Lock the radix tree in share mode + * RT_UNLOCK - Unlock the radix tree + * RT_GET_HANDLE - Return the handle of the radix tree + * + * Optional Interface + * --------- + * + * RT_DELETE - Delete a key-value pair. Declared/defined if RT_USE_DELETE is defined + * + * + * Copyright (c) 2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/include/lib/radixtree.h + * + *------------------------------------------------------------------------- + */ + +#include "nodes/bitmapset.h" +#include "port/pg_bitutils.h" +#include "port/simd.h" +#include "utils/dsa.h" +#include "utils/memutils.h" +#ifdef RT_SHMEM +#include "miscadmin.h" +#include "storage/lwlock.h" +#endif + +/* helpers */ +#define RT_MAKE_PREFIX(a) CppConcat(a,_) +#define RT_MAKE_NAME(name) RT_MAKE_NAME_(RT_MAKE_PREFIX(RT_PREFIX),name) +#define RT_MAKE_NAME_(a,b) CppConcat(a,b) +/* + * stringify a macro constant, from https://gcc.gnu.org/onlinedocs/cpp/Stringizing.html + */ +#define RT_STR(s) RT_STR_(s) +#define RT_STR_(s) #s + +/* function declarations */ +#define RT_CREATE RT_MAKE_NAME(create) +#define RT_FREE RT_MAKE_NAME(free) +#define RT_FIND RT_MAKE_NAME(find) +#ifdef RT_SHMEM +#define RT_ATTACH RT_MAKE_NAME(attach) +#define RT_DETACH RT_MAKE_NAME(detach) +#define RT_GET_HANDLE RT_MAKE_NAME(get_handle) +#define RT_LOCK_EXCLUSIVE RT_MAKE_NAME(lock_exclusive) +#define RT_LOCK_SHARE RT_MAKE_NAME(lock_share) +#define RT_UNLOCK RT_MAKE_NAME(unlock) +#endif +#define RT_SET RT_MAKE_NAME(set) +#define RT_BEGIN_ITERATE RT_MAKE_NAME(begin_iterate) +#define RT_ITERATE_NEXT RT_MAKE_NAME(iterate_next) +#define RT_END_ITERATE RT_MAKE_NAME(end_iterate) +#ifdef RT_USE_DELETE +#define RT_DELETE RT_MAKE_NAME(delete) +#endif +#define RT_MEMORY_USAGE RT_MAKE_NAME(memory_usage) +#define RT_DUMP_NODE RT_MAKE_NAME(dump_node) +#define RT_STATS RT_MAKE_NAME(stats) + +/* internal helper functions (no externally visible prototypes) */ +#define RT_CHILDPTR_IS_VALUE RT_MAKE_NAME(childptr_is_value) +#define RT_VALUE_IS_EMBEDDABLE RT_MAKE_NAME(value_is_embeddable) +#define RT_GET_SLOT_RECURSIVE RT_MAKE_NAME(get_slot_recursive) +#define RT_DELETE_RECURSIVE RT_MAKE_NAME(delete_recursive) +#define RT_ALLOC_NODE RT_MAKE_NAME(alloc_node) +#define RT_ALLOC_LEAF RT_MAKE_NAME(alloc_leaf) +#define RT_FREE_NODE RT_MAKE_NAME(free_node) +#define RT_FREE_LEAF RT_MAKE_NAME(free_leaf) +#define RT_FREE_RECURSE RT_MAKE_NAME(free_recurse) +#define RT_EXTEND_UP RT_MAKE_NAME(extend_up) +#define RT_EXTEND_DOWN RT_MAKE_NAME(extend_down) +#define RT_COPY_COMMON RT_MAKE_NAME(copy_common) +#define RT_PTR_SET_LOCAL RT_MAKE_NAME(ptr_set_local) +#define RT_NODE_16_SEARCH_EQ RT_MAKE_NAME(node_16_search_eq) +#define RT_NODE_4_GET_INSERTPOS RT_MAKE_NAME(node_4_get_insertpos) +#define RT_NODE_16_GET_INSERTPOS RT_MAKE_NAME(node_16_get_insertpos) +#define RT_SHIFT_ARRAYS_FOR_INSERT RT_MAKE_NAME(shift_arrays_for_insert) +#define RT_SHIFT_ARRAYS_AND_DELETE RT_MAKE_NAME(shift_arrays_and_delete) +#define RT_COPY_ARRAYS_FOR_INSERT RT_MAKE_NAME(copy_arrays_for_insert) +#define RT_COPY_ARRAYS_AND_DELETE RT_MAKE_NAME(copy_arrays_and_delete) +#define RT_NODE_48_IS_CHUNK_USED RT_MAKE_NAME(node_48_is_chunk_used) +#define RT_NODE_48_GET_CHILD RT_MAKE_NAME(node_48_get_child) +#define RT_NODE_256_IS_CHUNK_USED RT_MAKE_NAME(node_256_is_chunk_used) +#define RT_NODE_256_GET_CHILD RT_MAKE_NAME(node_256_get_child) +#define RT_KEY_GET_SHIFT RT_MAKE_NAME(key_get_shift) +#define RT_SHIFT_GET_MAX_VAL RT_MAKE_NAME(shift_get_max_val) +#define RT_NODE_SEARCH RT_MAKE_NAME(node_search) +#define RT_NODE_DELETE RT_MAKE_NAME(node_delete) +#define RT_NODE_INSERT RT_MAKE_NAME(node_insert) +#define RT_ADD_CHILD_4 RT_MAKE_NAME(add_child_4) +#define RT_ADD_CHILD_16 RT_MAKE_NAME(add_child_16) +#define RT_ADD_CHILD_48 RT_MAKE_NAME(add_child_48) +#define RT_ADD_CHILD_256 RT_MAKE_NAME(add_child_256) +#define RT_GROW_NODE_4 RT_MAKE_NAME(grow_node_4) +#define RT_GROW_NODE_16 RT_MAKE_NAME(grow_node_16) +#define RT_GROW_NODE_48 RT_MAKE_NAME(grow_node_48) +#define RT_REMOVE_CHILD_4 RT_MAKE_NAME(remove_child_4) +#define RT_REMOVE_CHILD_16 RT_MAKE_NAME(remove_child_16) +#define RT_REMOVE_CHILD_48 RT_MAKE_NAME(remove_child_48) +#define RT_REMOVE_CHILD_256 RT_MAKE_NAME(remove_child_256) +#define RT_SHRINK_NODE_16 RT_MAKE_NAME(shrink_child_16) +#define RT_SHRINK_NODE_48 RT_MAKE_NAME(shrink_child_48) +#define RT_SHRINK_NODE_256 RT_MAKE_NAME(shrink_child_256) +#define RT_NODE_ITERATE_NEXT RT_MAKE_NAME(node_iterate_next) +#define RT_VERIFY_NODE RT_MAKE_NAME(verify_node) + +/* type declarations */ +#define RT_RADIX_TREE RT_MAKE_NAME(radix_tree) +#define RT_RADIX_TREE_CONTROL RT_MAKE_NAME(radix_tree_control) +#define RT_ITER RT_MAKE_NAME(iter) +#ifdef RT_SHMEM +#define RT_HANDLE RT_MAKE_NAME(handle) +#endif +#define RT_NODE RT_MAKE_NAME(node) +#define RT_CHILD_PTR RT_MAKE_NAME(child_ptr) +#define RT_NODE_ITER RT_MAKE_NAME(node_iter) +#define RT_NODE_4 RT_MAKE_NAME(node_4) +#define RT_NODE_16 RT_MAKE_NAME(node_16) +#define RT_NODE_48 RT_MAKE_NAME(node_48) +#define RT_NODE_256 RT_MAKE_NAME(node_256) +#define RT_SIZE_CLASS RT_MAKE_NAME(size_class) +#define RT_SIZE_CLASS_ELEM RT_MAKE_NAME(size_class_elem) +#define RT_SIZE_CLASS_INFO RT_MAKE_NAME(size_class_info) +#define RT_CLASS_4 RT_MAKE_NAME(class_4) +#define RT_CLASS_16_LO RT_MAKE_NAME(class_32_min) +#define RT_CLASS_16_HI RT_MAKE_NAME(class_32_max) +#define RT_CLASS_48 RT_MAKE_NAME(class_48) +#define RT_CLASS_256 RT_MAKE_NAME(class_256) + +/* generate forward declarations necessary to use the radix tree */ +#ifdef RT_DECLARE + +typedef struct RT_RADIX_TREE RT_RADIX_TREE; +typedef struct RT_ITER RT_ITER; + +#ifdef RT_SHMEM +typedef dsa_pointer RT_HANDLE; +#endif + +#ifdef RT_SHMEM +RT_SCOPE RT_RADIX_TREE *RT_CREATE(MemoryContext ctx, dsa_area *dsa, int tranche_id); +RT_SCOPE RT_RADIX_TREE *RT_ATTACH(dsa_area *dsa, dsa_pointer dp); +RT_SCOPE void RT_DETACH(RT_RADIX_TREE * tree); +RT_SCOPE RT_HANDLE RT_GET_HANDLE(RT_RADIX_TREE * tree); +RT_SCOPE void RT_LOCK_EXCLUSIVE(RT_RADIX_TREE * tree); +RT_SCOPE void RT_LOCK_SHARE(RT_RADIX_TREE * tree); +RT_SCOPE void RT_UNLOCK(RT_RADIX_TREE * tree); +#else +RT_SCOPE RT_RADIX_TREE *RT_CREATE(MemoryContext ctx); +#endif +RT_SCOPE void RT_FREE(RT_RADIX_TREE * tree); + +RT_SCOPE RT_VALUE_TYPE *RT_FIND(RT_RADIX_TREE * tree, uint64 key); +RT_SCOPE bool RT_SET(RT_RADIX_TREE * tree, uint64 key, RT_VALUE_TYPE * value_p); + +#ifdef RT_USE_DELETE +RT_SCOPE bool RT_DELETE(RT_RADIX_TREE * tree, uint64 key); +#endif + +RT_SCOPE RT_ITER *RT_BEGIN_ITERATE(RT_RADIX_TREE * tree); +RT_SCOPE RT_VALUE_TYPE *RT_ITERATE_NEXT(RT_ITER * iter, uint64 *key_p); +RT_SCOPE void RT_END_ITERATE(RT_ITER * iter); + +RT_SCOPE uint64 RT_MEMORY_USAGE(RT_RADIX_TREE * tree); + +#ifdef RT_DEBUG +RT_SCOPE void RT_STATS(RT_RADIX_TREE * tree); +#endif + +#endif /* RT_DECLARE */ + + +/* generate implementation of the radix tree */ +#ifdef RT_DEFINE + +/* The number of bits encoded in one tree level */ +#define RT_SPAN BITS_PER_BYTE + +/* + * The number of possible partial keys, and thus the maximum number of + * child pointers, for a node. + */ +#define RT_NODE_MAX_SLOTS (1 << RT_SPAN) + +/* Mask for extracting a chunk from a key */ +#define RT_CHUNK_MASK ((1 << RT_SPAN) - 1) + +/* Maximum shift needed to extract a chunk from a key */ +#define RT_MAX_SHIFT RT_KEY_GET_SHIFT(UINT64_MAX) + +/* Maximum level a tree can reach for a key */ +#define RT_MAX_LEVEL ((sizeof(uint64) * BITS_PER_BYTE) / RT_SPAN) + +/* Get a chunk from the key */ +#define RT_GET_KEY_CHUNK(key, shift) ((uint8) (((key) >> (shift)) & RT_CHUNK_MASK)) + +/* For accessing bitmaps */ +#define RT_BM_IDX(x) ((x) / BITS_PER_BITMAPWORD) +#define RT_BM_BIT(x) ((x) % BITS_PER_BITMAPWORD) + +/* + * Node kinds + * + * The different node kinds are what make the tree "adaptive". + * + * Each node kind is associated with a different datatype and different + * search/set/delete/iterate algorithms adapted for its size. The largest + * kind, node256 is basically the same as a traditional radix tree, + * and would be most wasteful of memory when sparsely populated. The + * smaller nodes expend some additional CPU time to enable a smaller + * memory footprint. + * + * NOTE: There are 4 node kinds, and this should never be increased, + * for several reasons: + * 1. With 5 or more kinds, gcc tends to use a jump table for switch + * statements. + * 2. The 4 kinds can be represented with 2 bits, so we have the option + * in the future to tag the node pointer with the kind, even on + * platforms with 32-bit pointers. That would touch fewer cache lines + * during traversal and allow faster recovery from branch mispredicts. + * 3. We can have multiple size classes per node kind. + */ +#define RT_NODE_KIND_4 0x00 +#define RT_NODE_KIND_16 0x01 +#define RT_NODE_KIND_48 0x02 +#define RT_NODE_KIND_256 0x03 +#define RT_NODE_KIND_COUNT 4 + +/* + * Calculate the slab block size so that we can allocate at least 32 chunks + * from the block. + */ +#define RT_SLAB_BLOCK_SIZE(size) \ + Max(SLAB_DEFAULT_BLOCK_SIZE, pg_nextpower2_32(size * 32)) + +/* Common header for all nodes */ +typedef struct RT_NODE +{ + /* Node kind, one per search/set algorithm */ + uint8 kind; + + /* + * Max capacity for the current size class. Storing this in the node + * enables multiple size classes per node kind. uint8 is sufficient for + * all node kinds, because we only use this number to test if the node + * needs to grow. Since node256 never needs to grow, we let this overflow + * to zero. + */ + uint8 fanout; + + /* + * Number of children. uint8 is sufficient for all node kinds, because + * nodes shrink when this number gets lower than some threshold. Since + * node256 cannot possibly have zero children, we let the counter overflow + * and we interpret zero as "256" for this node kind. + */ + uint8 count; +} RT_NODE; + + +/* pointer returned by allocation */ +#ifdef RT_SHMEM +#define RT_PTR_ALLOC dsa_pointer +#define RT_INVALID_PTR_ALLOC InvalidDsaPointer +#define RT_PTR_ALLOC_IS_VALID(ptr) DsaPointerIsValid(ptr) +#else +#define RT_PTR_ALLOC RT_NODE * +#define RT_INVALID_PTR_ALLOC NULL +#define RT_PTR_ALLOC_IS_VALID(ptr) PointerIsValid(ptr) +#endif + +/* + * A convenience type used when we need to work with a DSA pointer as well + * as its local pointer. For local memory, both members are the same, so + * we use a union. + */ +#ifdef RT_SHMEM +typedef struct RT_CHILD_PTR +#else +typedef union RT_CHILD_PTR +#endif +{ + RT_PTR_ALLOC alloc; + RT_NODE *local; +} RT_CHILD_PTR; + + +/* + * Helper macros and functions for value storage. + * We either embed values in the child slots of the last level + * node or store pointers to values to the child slots, + * depending on the value size. + */ + +#ifdef RT_VARLEN_VALUE_SIZE +#define RT_GET_VALUE_SIZE(v) RT_VARLEN_VALUE_SIZE(v) +#else +#define RT_GET_VALUE_SIZE(v) sizeof(RT_VALUE_TYPE) +#endif + +/* + * Return true if the value can be stored in the child array + * of the lowest-level node, false otherwise. + */ +static inline bool +RT_VALUE_IS_EMBEDDABLE(RT_VALUE_TYPE * value_p) +{ +#ifdef RT_VARLEN_VALUE_SIZE + +#ifdef RT_RUNTIME_EMBEDDABLE_VALUE + return RT_GET_VALUE_SIZE(value_p) <= sizeof(RT_PTR_ALLOC); +#else + return false; +#endif + +#else + return RT_GET_VALUE_SIZE(value_p) <= sizeof(RT_PTR_ALLOC); +#endif +} + +/* + * Return true if the child pointer contains the value, false + * if the child pointer is a leaf pointer. + */ +static inline bool +RT_CHILDPTR_IS_VALUE(RT_PTR_ALLOC child) +{ +#ifdef RT_VARLEN_VALUE_SIZE + +#ifdef RT_RUNTIME_EMBEDDABLE_VALUE + /* check for pointer tag */ +#ifdef RT_SHMEM + return child & 1; +#else + return ((uintptr_t) child) & 1; +#endif + +#else + return false; +#endif + +#else + return sizeof(RT_VALUE_TYPE) <= sizeof(RT_PTR_ALLOC); +#endif +} + +/* + * Symbols for maximum possible fanout are declared first as they are + * required to declare each node kind. The declarations of other fanout + * values are followed as they need the struct sizes of each node kind. + */ + +/* max possible key chunks without struct padding */ +#define RT_FANOUT_4_MAX (8 - sizeof(RT_NODE)) + +/* equal to two 128-bit SIMD registers, regardless of availability */ +#define RT_FANOUT_16_MAX 32 + +/* + * This also determines the number of bits necessary for the isset array, + * so we need to be mindful of the size of bitmapword. Since bitmapword + * can be 64 bits, the only values that make sense here are 64 and 128. + * The ART paper uses at most 64 for this node kind, and one advantage + * for us is that "isset" is a single bitmapword on most platforms, + * rather than an array, allowing the compiler to get rid of loops. + */ +#define RT_FANOUT_48_MAX 64 + +#define RT_FANOUT_256 RT_NODE_MAX_SLOTS + +/* + * Node structs, one for each "kind" + */ + +/* + * node4 and node16 use one array for key chunks and another + * array of the same length for children. The keys and children + * are stored at corresponding positions, sorted by chunk. + */ + +typedef struct RT_NODE_4 +{ + RT_NODE base; + + uint8 chunks[RT_FANOUT_4_MAX]; + + /* number of children depends on size class */ + RT_PTR_ALLOC children[FLEXIBLE_ARRAY_MEMBER]; +} RT_NODE_4; + +typedef struct RT_NODE_16 +{ + RT_NODE base; + + uint8 chunks[RT_FANOUT_16_MAX]; + + /* number of children depends on size class */ + RT_PTR_ALLOC children[FLEXIBLE_ARRAY_MEMBER]; +} RT_NODE_16; + +/* + * node48 uses a 256-element array indexed by key chunks. This array + * stores indexes into a second array containing the children. + */ +typedef struct RT_NODE_48 +{ + RT_NODE base; + + /* bitmap to track which slots are in use */ + bitmapword isset[RT_BM_IDX(RT_FANOUT_48_MAX)]; + + /* + * Lookup table for indexes into the children[] array. We make this the + * last fixed-size member so that it's convenient to memset separately + * from the previous members. + */ + uint8 slot_idxs[RT_NODE_MAX_SLOTS]; + +/* Invalid index */ +#define RT_INVALID_SLOT_IDX 0xFF + + /* number of children depends on size class */ + RT_PTR_ALLOC children[FLEXIBLE_ARRAY_MEMBER]; +} RT_NODE_48; + +/* + * node256 is the largest node type. This node has an array of + * children directly indexed by chunk. Unlike other node kinds, + * its array size is by definition fixed. + */ +typedef struct RT_NODE_256 +{ + RT_NODE base; + + /* bitmap to track which slots are in use */ + bitmapword isset[RT_BM_IDX(RT_FANOUT_256)]; + + /* slots for 256 children */ + RT_PTR_ALLOC children[RT_FANOUT_256]; +} RT_NODE_256; + +#if defined(RT_SHMEM) +/* + * Make sure the all nodes (except for node256) fit neatly into a DSA + * size class. We assume the RT_FANOUT_4 is in the range where DSA size + * classes increment by 8 (as of PG17 up to 64 bytes), so we just hard + * code that one. + */ + +#if SIZEOF_DSA_POINTER < 8 +#define RT_FANOUT_16_LO ((96 - offsetof(RT_NODE_16, children)) / sizeof(RT_PTR_ALLOC)) +#define RT_FANOUT_16_HI Min(RT_FANOUT_16_MAX, (160 - offsetof(RT_NODE_16, children)) / sizeof(RT_PTR_ALLOC)) +#define RT_FANOUT_48 Min(RT_FANOUT_48_MAX, (512 - offsetof(RT_NODE_48, children)) / sizeof(RT_PTR_ALLOC)) +#else +#define RT_FANOUT_16_LO ((160 - offsetof(RT_NODE_16, children)) / sizeof(RT_PTR_ALLOC)) +#define RT_FANOUT_16_HI Min(RT_FANOUT_16_MAX, (320 - offsetof(RT_NODE_16, children)) / sizeof(RT_PTR_ALLOC)) +#define RT_FANOUT_48 Min(RT_FANOUT_48_MAX, (768 - offsetof(RT_NODE_48, children)) / sizeof(RT_PTR_ALLOC)) +#endif /* SIZEOF_DSA_POINTER < 8 */ + +#else /* ! RT_SHMEM */ + +/* doesn't really matter, but may as well use the namesake */ +#define RT_FANOUT_16_LO 16 +/* use maximum possible */ +#define RT_FANOUT_16_HI RT_FANOUT_16_MAX +#define RT_FANOUT_48 RT_FANOUT_48_MAX + +#endif /* RT_SHMEM */ + +/* + * To save memory in trees with sparse keys, it would make sense to have two + * size classes for the smallest kind (perhaps a high class of 5 and a low class + * of 2), but it would be more effective to utilize lazy expansion and + * path compression. + */ +#define RT_FANOUT_4 4 + +StaticAssertDecl(RT_FANOUT_4 <= RT_FANOUT_4_MAX, "watch struct padding"); +StaticAssertDecl(RT_FANOUT_16_LO < RT_FANOUT_16_HI, "LO subclass bigger than HI"); +StaticAssertDecl(RT_FANOUT_48 <= RT_FANOUT_48_MAX, "more slots than isset bits"); + +/* + * Node size classes + * + * Nodes of different kinds necessarily belong to different size classes. + * One innovation in our implementation compared to the ART paper is + * decoupling the notion of size class from kind. + * + * The size classes within a given node kind have the same underlying + * type, but a variable number of children/values. This is possible + * because each type (except node256) contains metadata that work the + * same way regardless of how many child slots there are. The nodes + * can introspect their allocated capacity at runtime. + */ +typedef enum RT_SIZE_CLASS +{ + RT_CLASS_4 = 0, + RT_CLASS_16_LO, + RT_CLASS_16_HI, + RT_CLASS_48, + RT_CLASS_256 +} RT_SIZE_CLASS; + +/* Information for each size class */ +typedef struct RT_SIZE_CLASS_ELEM +{ + const char *name; + int fanout; + size_t allocsize; +} RT_SIZE_CLASS_ELEM; + + +static const RT_SIZE_CLASS_ELEM RT_SIZE_CLASS_INFO[] = { + [RT_CLASS_4] = { + .name = RT_STR(RT_PREFIX) "_radix_tree node4", + .fanout = RT_FANOUT_4, + .allocsize = sizeof(RT_NODE_4) + RT_FANOUT_4 * sizeof(RT_PTR_ALLOC), + }, + [RT_CLASS_16_LO] = { + .name = RT_STR(RT_PREFIX) "_radix_tree node16_lo", + .fanout = RT_FANOUT_16_LO, + .allocsize = sizeof(RT_NODE_16) + RT_FANOUT_16_LO * sizeof(RT_PTR_ALLOC), + }, + [RT_CLASS_16_HI] = { + .name = RT_STR(RT_PREFIX) "_radix_tree node16_hi", + .fanout = RT_FANOUT_16_HI, + .allocsize = sizeof(RT_NODE_16) + RT_FANOUT_16_HI * sizeof(RT_PTR_ALLOC), + }, + [RT_CLASS_48] = { + .name = RT_STR(RT_PREFIX) "_radix_tree node48", + .fanout = RT_FANOUT_48, + .allocsize = sizeof(RT_NODE_48) + RT_FANOUT_48 * sizeof(RT_PTR_ALLOC), + }, + [RT_CLASS_256] = { + .name = RT_STR(RT_PREFIX) "_radix_tree node256", + .fanout = RT_FANOUT_256, + .allocsize = sizeof(RT_NODE_256), + }, +}; + +#define RT_NUM_SIZE_CLASSES lengthof(RT_SIZE_CLASS_INFO) + +#ifdef RT_SHMEM +/* A magic value used to identify our radix tree */ +#define RT_RADIX_TREE_MAGIC 0x54A48167 +#endif + +/* Contains the actual tree, plus ancillary info */ +typedef struct RT_RADIX_TREE_CONTROL +{ +#ifdef RT_SHMEM + RT_HANDLE handle; + uint32 magic; + LWLock lock; +#endif + + RT_PTR_ALLOC root; + uint64 max_val; + int64 num_keys; + int start_shift; + + /* statistics */ +#ifdef RT_DEBUG + int64 num_nodes[RT_NUM_SIZE_CLASSES]; + int64 num_leaves; +#endif +} RT_RADIX_TREE_CONTROL; + +/* Entry point for allocating and accessing the tree */ +struct RT_RADIX_TREE +{ + MemoryContext context; + + /* pointing to either local memory or DSA */ + RT_RADIX_TREE_CONTROL *ctl; + +#ifdef RT_SHMEM + dsa_area *dsa; +#else + MemoryContextData *node_slabs[RT_NUM_SIZE_CLASSES]; + + /* leaf_context is used only for single-value leaves */ + MemoryContextData *leaf_context; +#endif + MemoryContextData *iter_context; +}; + +/* + * Iteration support. + * + * Iterating over the radix tree produces each key/value pair in ascending + * order of the key. + */ + +/* state for iterating over a single node */ +typedef struct RT_NODE_ITER +{ + RT_CHILD_PTR node; + + /* + * The next index of the chunk array in RT_NODE_KIND_4 and RT_NODE_KIND_16 + * nodes, or the next chunk in RT_NODE_KIND_48 and RT_NODE_KIND_256 nodes. + * 0 for the initial value. + */ + int idx; +} RT_NODE_ITER; + +/* state for iterating over the whole radix tree */ +struct RT_ITER +{ + RT_RADIX_TREE *tree; + + /* + * A stack to track iteration for each level. Level 0 is the lowest (or + * leaf) level + */ + RT_NODE_ITER node_iters[RT_MAX_LEVEL]; + int top_level; + int cur_level; + + /* The key constructed during iteration */ + uint64 key; +}; + + +/* verification (available only in assert-enabled builds) */ +static void RT_VERIFY_NODE(RT_NODE * node); + +static inline void +RT_PTR_SET_LOCAL(RT_RADIX_TREE * tree, RT_CHILD_PTR * node) +{ +#ifdef RT_SHMEM + node->local = dsa_get_address(tree->dsa, node->alloc); +#endif +} + +/* Convenience functions for node48 and node256 */ + +/* Return true if there is an entry for "chunk" */ +static inline bool +RT_NODE_48_IS_CHUNK_USED(RT_NODE_48 * node, uint8 chunk) +{ + return node->slot_idxs[chunk] != RT_INVALID_SLOT_IDX; +} + +static inline RT_PTR_ALLOC * +RT_NODE_48_GET_CHILD(RT_NODE_48 * node, uint8 chunk) +{ + return &node->children[node->slot_idxs[chunk]]; +} + +/* Return true if there is an entry for "chunk" */ +static inline bool +RT_NODE_256_IS_CHUNK_USED(RT_NODE_256 * node, uint8 chunk) +{ + int idx = RT_BM_IDX(chunk); + int bitnum = RT_BM_BIT(chunk); + + return (node->isset[idx] & ((bitmapword) 1 << bitnum)) != 0; +} + +static inline RT_PTR_ALLOC * +RT_NODE_256_GET_CHILD(RT_NODE_256 * node, uint8 chunk) +{ + Assert(RT_NODE_256_IS_CHUNK_USED(node, chunk)); + return &node->children[chunk]; +} + +/* + * Return the smallest shift that will allowing storing the given key. + */ +static inline int +RT_KEY_GET_SHIFT(uint64 key) +{ + if (key == 0) + return 0; + else + return (pg_leftmost_one_pos64(key) / RT_SPAN) * RT_SPAN; +} + +/* + * Return the max value that can be stored in the tree with the given shift. + */ +static uint64 +RT_SHIFT_GET_MAX_VAL(int shift) +{ + if (shift == RT_MAX_SHIFT) + return UINT64_MAX; + else + return (UINT64CONST(1) << (shift + RT_SPAN)) - 1; +} + +/* + * Allocate a new node with the given node kind and size class. + */ +static inline RT_CHILD_PTR +RT_ALLOC_NODE(RT_RADIX_TREE * tree, const uint8 kind, const RT_SIZE_CLASS size_class) +{ + RT_CHILD_PTR allocnode; + RT_NODE *node; + size_t allocsize; + + allocsize = RT_SIZE_CLASS_INFO[size_class].allocsize; + +#ifdef RT_SHMEM + allocnode.alloc = dsa_allocate(tree->dsa, allocsize); +#else + allocnode.alloc = (RT_PTR_ALLOC) MemoryContextAlloc(tree->node_slabs[size_class], + allocsize); +#endif + + RT_PTR_SET_LOCAL(tree, &allocnode); + node = allocnode.local; + + /* initialize contents */ + + switch (kind) + { + case RT_NODE_KIND_4: + memset(node, 0, offsetof(RT_NODE_4, children)); + break; + case RT_NODE_KIND_16: + memset(node, 0, offsetof(RT_NODE_16, children)); + break; + case RT_NODE_KIND_48: + { + RT_NODE_48 *n48 = (RT_NODE_48 *) node; + + memset(n48, 0, offsetof(RT_NODE_48, slot_idxs)); + memset(n48->slot_idxs, RT_INVALID_SLOT_IDX, sizeof(n48->slot_idxs)); + break; + } + case RT_NODE_KIND_256: + memset(node, 0, offsetof(RT_NODE_256, children)); + break; + default: + pg_unreachable(); + } + + node->kind = kind; + + /* + * For node256, this will actually overflow to zero, but that's okay + * because that node doesn't need to introspect this value. + */ + node->fanout = RT_SIZE_CLASS_INFO[size_class].fanout; + +#ifdef RT_DEBUG + /* update the statistics */ + tree->ctl->num_nodes[size_class]++; +#endif + + return allocnode; +} + +/* + * Allocate a new leaf. + */ +static RT_CHILD_PTR +RT_ALLOC_LEAF(RT_RADIX_TREE * tree, size_t allocsize) +{ + RT_CHILD_PTR leaf; + +#ifdef RT_SHMEM + leaf.alloc = dsa_allocate(tree->dsa, allocsize); + RT_PTR_SET_LOCAL(tree, &leaf); +#else + leaf.alloc = (RT_PTR_ALLOC) MemoryContextAlloc(tree->leaf_context, allocsize); +#endif + +#ifdef RT_DEBUG + tree->ctl->num_leaves++; +#endif + + return leaf; +} + +/* + * Copy relevant members of the node header. + * This is a separate function in case other fields are added. + */ +static inline void +RT_COPY_COMMON(RT_CHILD_PTR newnode, RT_CHILD_PTR oldnode) +{ + (newnode.local)->count = (oldnode.local)->count; +} + +/* Free the given node */ +static void +RT_FREE_NODE(RT_RADIX_TREE * tree, RT_CHILD_PTR node) +{ +#ifdef RT_DEBUG + int i; + + /* update the statistics */ + + for (i = 0; i < RT_NUM_SIZE_CLASSES; i++) + { + if ((node.local)->fanout == RT_SIZE_CLASS_INFO[i].fanout) + break; + } + + /* + * The fanout of node256 will appear to be zero within the node header + * because of overflow, so we need an extra check here. + */ + if (i == RT_NUM_SIZE_CLASSES) + i = RT_CLASS_256; + + tree->ctl->num_nodes[i]--; + Assert(tree->ctl->num_nodes[i] >= 0); +#endif + +#ifdef RT_SHMEM + dsa_free(tree->dsa, node.alloc); +#else + pfree(node.alloc); +#endif +} + +static inline void +RT_FREE_LEAF(RT_RADIX_TREE * tree, RT_PTR_ALLOC leaf) +{ + Assert(leaf != tree->ctl->root); + +#ifdef RT_DEBUG + /* update the statistics */ + tree->ctl->num_leaves--; + Assert(tree->ctl->num_leaves >= 0); +#endif + +#ifdef RT_SHMEM + dsa_free(tree->dsa, leaf); +#else + pfree(leaf); +#endif +} + +/***************** SEARCH *****************/ + +/* + * Return the address of the child corresponding to "chunk", + * or NULL if there is no such element. + */ +static inline RT_PTR_ALLOC * +RT_NODE_16_SEARCH_EQ(RT_NODE_16 * node, uint8 chunk) +{ + int count = node->base.count; +#ifndef USE_NO_SIMD + Vector8 spread_chunk; + Vector8 haystack1; + Vector8 haystack2; + Vector8 cmp1; + Vector8 cmp2; + uint32 bitfield; + RT_PTR_ALLOC *slot_simd = NULL; +#endif + +#if defined(USE_NO_SIMD) || defined(USE_ASSERT_CHECKING) + RT_PTR_ALLOC *slot = NULL; + + for (int i = 0; i < count; i++) + { + if (node->chunks[i] == chunk) + { + slot = &node->children[i]; + break; + } + } +#endif + +#ifndef USE_NO_SIMD + /* replicate the search key */ + spread_chunk = vector8_broadcast(chunk); + + /* compare to all 32 keys stored in the node */ + vector8_load(&haystack1, &node->chunks[0]); + vector8_load(&haystack2, &node->chunks[sizeof(Vector8)]); + cmp1 = vector8_eq(spread_chunk, haystack1); + cmp2 = vector8_eq(spread_chunk, haystack2); + + /* convert comparison to a bitfield */ + bitfield = vector8_highbit_mask(cmp1) | (vector8_highbit_mask(cmp2) << sizeof(Vector8)); + + /* mask off invalid entries */ + bitfield &= ((UINT64CONST(1) << count) - 1); + + /* convert bitfield to index by counting trailing zeros */ + if (bitfield) + slot_simd = &node->children[pg_rightmost_one_pos32(bitfield)]; + + Assert(slot_simd == slot); + return slot_simd; +#else + return slot; +#endif +} + +/* + * Search for the child pointer corresponding to "key" in the given node. + * + * Return child if the key is found, otherwise return NULL. + */ +static inline RT_PTR_ALLOC * +RT_NODE_SEARCH(RT_NODE * node, uint8 chunk) +{ + /* Make sure we already converted to local pointer */ + Assert(node != NULL); + + switch (node->kind) + { + case RT_NODE_KIND_4: + { + RT_NODE_4 *n4 = (RT_NODE_4 *) node; + + for (int i = 0; i < n4->base.count; i++) + { + if (n4->chunks[i] == chunk) + return &n4->children[i]; + } + return NULL; + } + case RT_NODE_KIND_16: + return RT_NODE_16_SEARCH_EQ((RT_NODE_16 *) node, chunk); + case RT_NODE_KIND_48: + { + RT_NODE_48 *n48 = (RT_NODE_48 *) node; + int slotpos = n48->slot_idxs[chunk]; + + if (slotpos == RT_INVALID_SLOT_IDX) + return NULL; + + return RT_NODE_48_GET_CHILD(n48, chunk); + } + case RT_NODE_KIND_256: + { + RT_NODE_256 *n256 = (RT_NODE_256 *) node; + + if (!RT_NODE_256_IS_CHUNK_USED(n256, chunk)) + return NULL; + + return RT_NODE_256_GET_CHILD(n256, chunk); + } + default: + pg_unreachable(); + } +} + +/* + * Search the given key in the radix tree. Return the pointer to the value if found, + * otherwise return NULL. + * + * Since the function returns a pointer (to support variable-length values), + * the caller is responsible for locking until it's finished with the value. + */ +RT_SCOPE RT_VALUE_TYPE * +RT_FIND(RT_RADIX_TREE * tree, uint64 key) +{ + RT_CHILD_PTR node; + RT_PTR_ALLOC *slot = NULL; + int shift; + +#ifdef RT_SHMEM + Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC); +#endif + + if (key > tree->ctl->max_val) + return NULL; + + Assert(RT_PTR_ALLOC_IS_VALID(tree->ctl->root)); + node.alloc = tree->ctl->root; + shift = tree->ctl->start_shift; + + /* Descend the tree */ + while (shift >= 0) + { + RT_PTR_SET_LOCAL(tree, &node); + slot = RT_NODE_SEARCH(node.local, RT_GET_KEY_CHUNK(key, shift)); + if (slot == NULL) + return NULL; + + node.alloc = *slot; + shift -= RT_SPAN; + } + + if (RT_CHILDPTR_IS_VALUE(*slot)) + return (RT_VALUE_TYPE *) slot; + else + { + RT_PTR_SET_LOCAL(tree, &node); + return (RT_VALUE_TYPE *) node.local; + } +} + +/***************** INSERTION *****************/ + +#define RT_NODE_MUST_GROW(node) \ + ((node)->count == (node)->fanout) + +/* + * Return index of the chunk and slot arrays for inserting into the node, + * such that the arrays remain ordered. + */ +static inline int +RT_NODE_4_GET_INSERTPOS(RT_NODE_4 * node, uint8 chunk, int count) +{ + int idx; + + for (idx = 0; idx < count; idx++) + { + if (node->chunks[idx] >= chunk) + break; + } + + return idx; +} + +/* + * Return index of the chunk and slot arrays for inserting into the node, + * such that the arrays remain ordered. + */ +static inline int +RT_NODE_16_GET_INSERTPOS(RT_NODE_16 * node, uint8 chunk) +{ + int count = node->base.count; +#if defined(USE_NO_SIMD) || defined(USE_ASSERT_CHECKING) + int index; +#endif + +#ifndef USE_NO_SIMD + Vector8 spread_chunk; + Vector8 haystack1; + Vector8 haystack2; + Vector8 cmp1; + Vector8 cmp2; + Vector8 min1; + Vector8 min2; + uint32 bitfield; + int index_simd; +#endif + + /* + * First compare the last element. There are two reasons to branch here: + * + * 1) A realistic pattern is inserting ordered keys. In that case, + * non-SIMD platforms must do a linear search to the last chunk to find + * the insert position. This will get slower as the node fills up. + * + * 2) On SIMD platforms, we must branch anyway to make sure we don't bit + * scan an empty bitfield. Doing the branch here eliminates some work that + * we might otherwise throw away. + */ + Assert(count > 0); + if (node->chunks[count - 1] < chunk) + return count; + +#if defined(USE_NO_SIMD) || defined(USE_ASSERT_CHECKING) + + for (index = 0; index < count; index++) + { + if (node->chunks[index] > chunk) + break; + } +#endif + +#ifndef USE_NO_SIMD + + /* + * This is a bit more complicated than RT_NODE_16_SEARCH_EQ(), because no + * unsigned uint8 comparison instruction exists, at least for SSE2. So we + * need to play some trickery using vector8_min() to effectively get >=. + * There'll never be any equal elements in current uses, but that's what + * we get here... + */ + spread_chunk = vector8_broadcast(chunk); + vector8_load(&haystack1, &node->chunks[0]); + vector8_load(&haystack2, &node->chunks[sizeof(Vector8)]); + min1 = vector8_min(spread_chunk, haystack1); + min2 = vector8_min(spread_chunk, haystack2); + cmp1 = vector8_eq(spread_chunk, min1); + cmp2 = vector8_eq(spread_chunk, min2); + bitfield = vector8_highbit_mask(cmp1) | (vector8_highbit_mask(cmp2) << sizeof(Vector8)); + + Assert((bitfield & ((UINT64CONST(1) << count) - 1)) != 0); + index_simd = pg_rightmost_one_pos32(bitfield); + + Assert(index_simd == index); + return index_simd; +#else + return index; +#endif +} + +/* Shift the elements right at "insertpos" by one */ +static inline void +RT_SHIFT_ARRAYS_FOR_INSERT(uint8 *chunks, RT_PTR_ALLOC * children, int count, int insertpos) +{ + /* + * This is basically a memmove, but written in a simple loop for speed on + * small inputs. + */ + for (int i = count - 1; i >= insertpos; i--) + { + /* workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101481 */ +#ifdef __GNUC__ + __asm__(""); +#endif + chunks[i + 1] = chunks[i]; + children[i + 1] = children[i]; + } +} + +/* + * Copy both chunk and slot arrays into the right + * place. The caller is responsible for inserting the new element. + */ +static inline void +RT_COPY_ARRAYS_FOR_INSERT(uint8 *dst_chunks, RT_PTR_ALLOC * dst_children, + uint8 *src_chunks, RT_PTR_ALLOC * src_children, + int count, int insertpos) +{ + for (int i = 0; i < count; i++) + { + int sourceidx = i; + + /* use a branch-free computation to skip the index of the new element */ + int destidx = i + (i >= insertpos); + + dst_chunks[destidx] = src_chunks[sourceidx]; + dst_children[destidx] = src_children[sourceidx]; + } +} + +static inline RT_PTR_ALLOC * +RT_ADD_CHILD_256(RT_RADIX_TREE * tree, RT_CHILD_PTR node, uint8 chunk) +{ + RT_NODE_256 *n256 = (RT_NODE_256 *) node.local; + int idx = RT_BM_IDX(chunk); + int bitnum = RT_BM_BIT(chunk); + + /* Mark the slot used for "chunk" */ + n256->isset[idx] |= ((bitmapword) 1 << bitnum); + + n256->base.count++; + RT_VERIFY_NODE((RT_NODE *) n256); + + return RT_NODE_256_GET_CHILD(n256, chunk); +} + +static pg_noinline RT_PTR_ALLOC * +RT_GROW_NODE_48(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, + uint8 chunk) +{ + RT_NODE_48 *n48 = (RT_NODE_48 *) node.local; + RT_CHILD_PTR newnode; + RT_NODE_256 *new256; + int i = 0; + + /* initialize new node */ + newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_256, RT_CLASS_256); + new256 = (RT_NODE_256 *) newnode.local; + + /* copy over the entries */ + RT_COPY_COMMON(newnode, node); + for (int word_num = 0; word_num < RT_BM_IDX(RT_NODE_MAX_SLOTS); word_num++) + { + bitmapword bitmap = 0; + + /* + * Bit manipulation is a surprisingly large portion of the overhead in + * the naive implementation. Doing stores word-at-a-time removes a lot + * of that overhead. + */ + for (int bit = 0; bit < BITS_PER_BITMAPWORD; bit++) + { + uint8 offset = n48->slot_idxs[i]; + + if (offset != RT_INVALID_SLOT_IDX) + { + bitmap |= ((bitmapword) 1 << bit); + new256->children[i] = n48->children[offset]; + } + + i++; + } + + new256->isset[word_num] = bitmap; + } + + /* free old node and update reference in parent */ + *parent_slot = newnode.alloc; + RT_FREE_NODE(tree, node); + + return RT_ADD_CHILD_256(tree, newnode, chunk); +} + +static inline RT_PTR_ALLOC * +RT_ADD_CHILD_48(RT_RADIX_TREE * tree, RT_CHILD_PTR node, uint8 chunk) +{ + RT_NODE_48 *n48 = (RT_NODE_48 *) node.local; + int insertpos; + int idx = 0; + bitmapword w, + inverse; + + /* get the first word with at least one bit not set */ + for (int i = 0; i < RT_BM_IDX(RT_FANOUT_48_MAX); i++) + { + w = n48->isset[i]; + if (w < ~((bitmapword) 0)) + { + idx = i; + break; + } + } + + /* To get the first unset bit in w, get the first set bit in ~w */ + inverse = ~w; + insertpos = idx * BITS_PER_BITMAPWORD; + insertpos += bmw_rightmost_one_pos(inverse); + Assert(insertpos < n48->base.fanout); + + /* mark the slot used by setting the rightmost zero bit */ + n48->isset[idx] |= w + 1; + + /* insert new chunk into place */ + n48->slot_idxs[chunk] = insertpos; + + n48->base.count++; + RT_VERIFY_NODE((RT_NODE *) n48); + + return &n48->children[insertpos]; +} + +static pg_noinline RT_PTR_ALLOC * +RT_GROW_NODE_16(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, + uint8 chunk) +{ + RT_NODE_16 *n16 = (RT_NODE_16 *) node.local; + int insertpos; + + if (n16->base.fanout < RT_FANOUT_16_HI) + { + RT_CHILD_PTR newnode; + RT_NODE_16 *new16; + + Assert(n16->base.fanout == RT_FANOUT_16_LO); + + /* initialize new node */ + newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_16, RT_CLASS_16_HI); + new16 = (RT_NODE_16 *) newnode.local; + + /* copy over existing entries */ + RT_COPY_COMMON(newnode, node); + Assert(n16->base.count == RT_FANOUT_16_LO); + insertpos = RT_NODE_16_GET_INSERTPOS(n16, chunk); + RT_COPY_ARRAYS_FOR_INSERT(new16->chunks, new16->children, + n16->chunks, n16->children, + RT_FANOUT_16_LO, insertpos); + + /* insert new chunk into place */ + new16->chunks[insertpos] = chunk; + + new16->base.count++; + RT_VERIFY_NODE((RT_NODE *) new16); + + /* free old node and update references */ + RT_FREE_NODE(tree, node); + *parent_slot = newnode.alloc; + + return &new16->children[insertpos]; + } + else + { + RT_CHILD_PTR newnode; + RT_NODE_48 *new48; + int idx, + bit; + + Assert(n16->base.fanout == RT_FANOUT_16_HI); + + /* initialize new node */ + newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_48, RT_CLASS_48); + new48 = (RT_NODE_48 *) newnode.local; + + /* copy over the entries */ + RT_COPY_COMMON(newnode, node); + for (int i = 0; i < RT_FANOUT_16_HI; i++) + new48->slot_idxs[n16->chunks[i]] = i; + memcpy(&new48->children[0], &n16->children[0], RT_FANOUT_16_HI * sizeof(new48->children[0])); + + /* + * Since we just copied a dense array, we can fill "isset" using a + * single store, provided the length of that array is at most the + * number of bits in a bitmapword. + */ + Assert(RT_FANOUT_16_HI <= BITS_PER_BITMAPWORD); + new48->isset[0] = (bitmapword) (((uint64) 1 << RT_FANOUT_16_HI) - 1); + + /* put the new child at the end of the copied entries */ + insertpos = RT_FANOUT_16_HI; + idx = RT_BM_IDX(insertpos); + bit = RT_BM_BIT(insertpos); + + /* mark the slot used */ + new48->isset[idx] |= ((bitmapword) 1 << bit); + + /* insert new chunk into place */ + new48->slot_idxs[chunk] = insertpos; + + new48->base.count++; + RT_VERIFY_NODE((RT_NODE *) new48); + + /* free old node and update reference in parent */ + *parent_slot = newnode.alloc; + RT_FREE_NODE(tree, node); + + return &new48->children[insertpos]; + } +} + +static inline RT_PTR_ALLOC * +RT_ADD_CHILD_16(RT_RADIX_TREE * tree, RT_CHILD_PTR node, uint8 chunk) +{ + RT_NODE_16 *n16 = (RT_NODE_16 *) node.local; + int insertpos = RT_NODE_16_GET_INSERTPOS(n16, chunk); + + /* shift chunks and children */ + RT_SHIFT_ARRAYS_FOR_INSERT(n16->chunks, n16->children, + n16->base.count, insertpos); + + /* insert new chunk into place */ + n16->chunks[insertpos] = chunk; + + n16->base.count++; + RT_VERIFY_NODE((RT_NODE *) n16); + + return &n16->children[insertpos]; +} + +static pg_noinline RT_PTR_ALLOC * +RT_GROW_NODE_4(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, + uint8 chunk) +{ + RT_NODE_4 *n4 = (RT_NODE_4 *) (node.local); + RT_CHILD_PTR newnode; + RT_NODE_16 *new16; + int insertpos; + + /* initialize new node */ + newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_16, RT_CLASS_16_LO); + new16 = (RT_NODE_16 *) newnode.local; + + /* copy over existing entries */ + RT_COPY_COMMON(newnode, node); + Assert(n4->base.count == RT_FANOUT_4); + insertpos = RT_NODE_4_GET_INSERTPOS(n4, chunk, RT_FANOUT_4); + RT_COPY_ARRAYS_FOR_INSERT(new16->chunks, new16->children, + n4->chunks, n4->children, + RT_FANOUT_4, insertpos); + + /* insert new chunk into place */ + new16->chunks[insertpos] = chunk; + + new16->base.count++; + RT_VERIFY_NODE((RT_NODE *) new16); + + /* free old node and update reference in parent */ + *parent_slot = newnode.alloc; + RT_FREE_NODE(tree, node); + + return &new16->children[insertpos]; +} + +static inline RT_PTR_ALLOC * +RT_ADD_CHILD_4(RT_RADIX_TREE * tree, RT_CHILD_PTR node, uint8 chunk) +{ + RT_NODE_4 *n4 = (RT_NODE_4 *) (node.local); + int count = n4->base.count; + int insertpos = RT_NODE_4_GET_INSERTPOS(n4, chunk, count); + + /* shift chunks and children */ + RT_SHIFT_ARRAYS_FOR_INSERT(n4->chunks, n4->children, + count, insertpos); + + /* insert new chunk into place */ + n4->chunks[insertpos] = chunk; + + n4->base.count++; + RT_VERIFY_NODE((RT_NODE *) n4); + + return &n4->children[insertpos]; +} + +/* + * Reserve slot in "node"'s child array. The caller will populate it + * with the actual child pointer. + * + * "parent_slot" is the address of the parent's child pointer to "node". + * If the node we're inserting into needs to grow, we update the parent's + * child pointer with the pointer to the new larger node. + */ +static inline RT_PTR_ALLOC * +RT_NODE_INSERT(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, + uint8 chunk) +{ + RT_NODE *n = node.local; + + switch (n->kind) + { + case RT_NODE_KIND_4: + { + if (unlikely(RT_NODE_MUST_GROW(n))) + return RT_GROW_NODE_4(tree, parent_slot, node, chunk); + + return RT_ADD_CHILD_4(tree, node, chunk); + } + case RT_NODE_KIND_16: + { + if (unlikely(RT_NODE_MUST_GROW(n))) + return RT_GROW_NODE_16(tree, parent_slot, node, chunk); + + return RT_ADD_CHILD_16(tree, node, chunk); + } + case RT_NODE_KIND_48: + { + if (unlikely(RT_NODE_MUST_GROW(n))) + return RT_GROW_NODE_48(tree, parent_slot, node, chunk); + + return RT_ADD_CHILD_48(tree, node, chunk); + } + case RT_NODE_KIND_256: + return RT_ADD_CHILD_256(tree, node, chunk); + default: + pg_unreachable(); + } +} + +/* + * The radix tree doesn't have sufficient height. Put new node(s) on top, + * and move the old node below it. + */ +static pg_noinline void +RT_EXTEND_UP(RT_RADIX_TREE * tree, uint64 key) +{ + int target_shift = RT_KEY_GET_SHIFT(key); + int shift = tree->ctl->start_shift; + + Assert(shift < target_shift); + + /* Grow tree upwards until start shift can accommodate the key */ + while (shift < target_shift) + { + RT_CHILD_PTR node; + RT_NODE_4 *n4; + + node = RT_ALLOC_NODE(tree, RT_NODE_KIND_4, RT_CLASS_4); + n4 = (RT_NODE_4 *) node.local; + n4->base.count = 1; + n4->chunks[0] = 0; + n4->children[0] = tree->ctl->root; + + /* Update the root */ + tree->ctl->root = node.alloc; + + shift += RT_SPAN; + } + + tree->ctl->max_val = RT_SHIFT_GET_MAX_VAL(target_shift); + tree->ctl->start_shift = target_shift; +} + +/* + * Insert a chain of nodes until we reach the lowest level, + * and return the address of a slot to be filled further up + * the call stack. + */ +static pg_noinline RT_PTR_ALLOC * +RT_EXTEND_DOWN(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, uint64 key, int shift) +{ + RT_CHILD_PTR node, + child; + RT_NODE_4 *n4; + + /* + * The child pointer of the first node in the chain goes in the + * caller-provided slot. + */ + child = RT_ALLOC_NODE(tree, RT_NODE_KIND_4, RT_CLASS_4); + *parent_slot = child.alloc; + + node = child; + shift -= RT_SPAN; + + while (shift > 0) + { + child = RT_ALLOC_NODE(tree, RT_NODE_KIND_4, RT_CLASS_4); + + /* We open-code the insertion ourselves, for speed. */ + n4 = (RT_NODE_4 *) node.local; + n4->base.count = 1; + n4->chunks[0] = RT_GET_KEY_CHUNK(key, shift); + n4->children[0] = child.alloc; + + node = child; + shift -= RT_SPAN; + } + Assert(shift == 0); + + /* Reserve slot for the value. */ + n4 = (RT_NODE_4 *) node.local; + n4->chunks[0] = RT_GET_KEY_CHUNK(key, 0); + n4->base.count = 1; + + return &n4->children[0]; +} + +/* + * Workhorse for RT_SET + * + * "parent_slot" is the address of the child pointer we just followed, + * in the parent's array of children, needed if inserting into the + * current node causes it to grow. + */ +static RT_PTR_ALLOC * +RT_GET_SLOT_RECURSIVE(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, uint64 key, int shift, bool *found) +{ + RT_PTR_ALLOC *slot; + RT_CHILD_PTR node; + uint8 chunk = RT_GET_KEY_CHUNK(key, shift); + + node.alloc = *parent_slot; + RT_PTR_SET_LOCAL(tree, &node); + slot = RT_NODE_SEARCH(node.local, chunk); + + if (slot == NULL) + { + *found = false; + + /* reserve slot for the caller to populate */ + + slot = RT_NODE_INSERT(tree, parent_slot, node, chunk); + + if (shift == 0) + return slot; + else + return RT_EXTEND_DOWN(tree, slot, key, shift); + } + else + { + if (shift == 0) + { + *found = true; + return slot; + } + else + return RT_GET_SLOT_RECURSIVE(tree, slot, key, shift - RT_SPAN, found); + } +} + +/* + * Set key to value that value_p points to. If the entry already exists, we + * update its value and return true. Returns false if entry doesn't yet exist. + * + * Taking a lock in exclusive mode is the caller's responsibility. + */ +RT_SCOPE bool +RT_SET(RT_RADIX_TREE * tree, uint64 key, RT_VALUE_TYPE * value_p) +{ + bool found; + RT_PTR_ALLOC *slot; + size_t value_sz = RT_GET_VALUE_SIZE(value_p); + +#ifdef RT_SHMEM + Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC); +#endif + + Assert(RT_PTR_ALLOC_IS_VALID(tree->ctl->root)); + + /* Extend the tree if necessary */ + if (unlikely(key > tree->ctl->max_val)) + { + if (tree->ctl->num_keys == 0) + { + RT_CHILD_PTR node; + RT_NODE_4 *n4; + int start_shift = RT_KEY_GET_SHIFT(key); + + /* + * With an empty root node, we don't extend the tree upwards, + * since that would result in orphan empty nodes. Instead we open + * code inserting into the root node and extend downward from + * there. + */ + node.alloc = tree->ctl->root; + RT_PTR_SET_LOCAL(tree, &node); + n4 = (RT_NODE_4 *) node.local; + n4->base.count = 1; + n4->chunks[0] = RT_GET_KEY_CHUNK(key, start_shift); + + slot = RT_EXTEND_DOWN(tree, &n4->children[0], key, start_shift); + found = false; + tree->ctl->start_shift = start_shift; + tree->ctl->max_val = RT_SHIFT_GET_MAX_VAL(start_shift); + goto have_slot; + } + else + RT_EXTEND_UP(tree, key); + } + + slot = RT_GET_SLOT_RECURSIVE(tree, &tree->ctl->root, + key, tree->ctl->start_shift, &found); + +have_slot: + Assert(slot != NULL); + + if (RT_VALUE_IS_EMBEDDABLE(value_p)) + { + /* free the existing leaf */ + if (found && !RT_CHILDPTR_IS_VALUE(*slot)) + RT_FREE_LEAF(tree, *slot); + + /* store value directly in child pointer slot */ + memcpy(slot, value_p, value_sz); + +#ifdef RT_RUNTIME_EMBEDDABLE_VALUE + /* tag child pointer */ +#ifdef RT_SHMEM + *slot |= 1; +#else + *((uintptr_t *) slot) |= 1; +#endif +#endif + } + else + { + RT_CHILD_PTR leaf; + + if (found && !RT_CHILDPTR_IS_VALUE(*slot)) + { + Assert(RT_PTR_ALLOC_IS_VALID(*slot)); + leaf.alloc = *slot; + RT_PTR_SET_LOCAL(tree, &leaf); + + if (RT_GET_VALUE_SIZE((RT_VALUE_TYPE *) leaf.local) != value_sz) + { + /* + * different sizes, so first free the existing leaf before + * allocating a new one + */ + RT_FREE_LEAF(tree, *slot); + leaf = RT_ALLOC_LEAF(tree, value_sz); + *slot = leaf.alloc; + } + } + else + { + /* allocate new leaf and store it in the child array */ + leaf = RT_ALLOC_LEAF(tree, value_sz); + *slot = leaf.alloc; + } + + memcpy(leaf.local, value_p, value_sz); + } + + /* Update the statistics */ + if (!found) + tree->ctl->num_keys++; + + return found; +} + +/***************** SETUP / TEARDOWN *****************/ + +/* + * Create the radix tree in the given memory context and return it. + * + * All local memory required for a radix tree is allocated in the given + * memory context and its children. Note that RT_FREE() will delete all + * allocated space within the given memory context, so the dsa_area should + * be created in a different context. + */ +RT_SCOPE RT_RADIX_TREE * +#ifdef RT_SHMEM +RT_CREATE(MemoryContext ctx, dsa_area *dsa, int tranche_id) +#else +RT_CREATE(MemoryContext ctx) +#endif +{ + RT_RADIX_TREE *tree; + MemoryContext old_ctx; + RT_CHILD_PTR rootnode; +#ifdef RT_SHMEM + dsa_pointer dp; +#endif + + old_ctx = MemoryContextSwitchTo(ctx); + + tree = (RT_RADIX_TREE *) palloc0(sizeof(RT_RADIX_TREE)); + tree->context = ctx; + + /* + * Separate context for iteration in case the tree context doesn't support + * pfree + */ + tree->iter_context = AllocSetContextCreate(ctx, + RT_STR(RT_PREFIX) "_radix_tree iter context", + ALLOCSET_SMALL_SIZES); + +#ifdef RT_SHMEM + tree->dsa = dsa; + dp = dsa_allocate0(dsa, sizeof(RT_RADIX_TREE_CONTROL)); + tree->ctl = (RT_RADIX_TREE_CONTROL *) dsa_get_address(dsa, dp); + tree->ctl->handle = dp; + tree->ctl->magic = RT_RADIX_TREE_MAGIC; + LWLockInitialize(&tree->ctl->lock, tranche_id); +#else + tree->ctl = (RT_RADIX_TREE_CONTROL *) palloc0(sizeof(RT_RADIX_TREE_CONTROL)); + + /* Create a slab context for each size class */ + for (int i = 0; i < RT_NUM_SIZE_CLASSES; i++) + { + RT_SIZE_CLASS_ELEM size_class = RT_SIZE_CLASS_INFO[i]; + size_t inner_blocksize = RT_SLAB_BLOCK_SIZE(size_class.allocsize); + + tree->node_slabs[i] = SlabContextCreate(ctx, + size_class.name, + inner_blocksize, + size_class.allocsize); + } + + /* By default we use the passed context for leaves. */ + tree->leaf_context = tree->context; + +#ifndef RT_VARLEN_VALUE_SIZE + + /* + * For leaves storing fixed-length values, we use a slab context to avoid + * the possibility of space wastage by power-of-2 rounding up. + */ + if (sizeof(RT_VALUE_TYPE) > sizeof(RT_PTR_ALLOC)) + tree->leaf_context = SlabContextCreate(ctx, + RT_STR(RT_PREFIX) "_radix_tree leaf context", + RT_SLAB_BLOCK_SIZE(sizeof(RT_VALUE_TYPE)), + sizeof(RT_VALUE_TYPE)); +#endif /* !RT_VARLEN_VALUE_SIZE */ +#endif /* RT_SHMEM */ + + /* add root node now so that RT_SET can assume it exists */ + rootnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_4, RT_CLASS_4); + tree->ctl->root = rootnode.alloc; + tree->ctl->start_shift = 0; + tree->ctl->max_val = RT_SHIFT_GET_MAX_VAL(0); + + MemoryContextSwitchTo(old_ctx); + + return tree; +} + +#ifdef RT_SHMEM +RT_SCOPE RT_RADIX_TREE * +RT_ATTACH(dsa_area *dsa, RT_HANDLE handle) +{ + RT_RADIX_TREE *tree; + dsa_pointer control; + + tree = (RT_RADIX_TREE *) palloc0(sizeof(RT_RADIX_TREE)); + tree->context = CurrentMemoryContext; + + /* Find the control object in shared memory */ + control = handle; + + tree->dsa = dsa; + tree->ctl = (RT_RADIX_TREE_CONTROL *) dsa_get_address(dsa, control); + Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC); + + /* + * Create the iteration context so that the attached backend also can + * begin the iteration. + */ + tree->iter_context = AllocSetContextCreate(CurrentMemoryContext, + RT_STR(RT_PREFIX) "_radix_tree iter context", + ALLOCSET_SMALL_SIZES); + + return tree; +} + +RT_SCOPE void +RT_DETACH(RT_RADIX_TREE * tree) +{ + Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC); + MemoryContextDelete(tree->iter_context); + pfree(tree); +} + +RT_SCOPE RT_HANDLE +RT_GET_HANDLE(RT_RADIX_TREE * tree) +{ + Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC); + return tree->ctl->handle; +} + +RT_SCOPE void +RT_LOCK_EXCLUSIVE(RT_RADIX_TREE * tree) +{ + Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC); + LWLockAcquire(&tree->ctl->lock, LW_EXCLUSIVE); +} + +RT_SCOPE void +RT_LOCK_SHARE(RT_RADIX_TREE * tree) +{ + Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC); + LWLockAcquire(&tree->ctl->lock, LW_SHARED); +} + +RT_SCOPE void +RT_UNLOCK(RT_RADIX_TREE * tree) +{ + Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC); + LWLockRelease(&tree->ctl->lock); +} + +/* + * Recursively free all nodes allocated in the DSA area. + */ +static void +RT_FREE_RECURSE(RT_RADIX_TREE * tree, RT_PTR_ALLOC ptr, int shift) +{ + RT_CHILD_PTR node; + + check_stack_depth(); + + node.alloc = ptr; + RT_PTR_SET_LOCAL(tree, &node); + + switch (node.local->kind) + { + case RT_NODE_KIND_4: + { + RT_NODE_4 *n4 = (RT_NODE_4 *) node.local; + + for (int i = 0; i < n4->base.count; i++) + { + RT_PTR_ALLOC child = n4->children[i]; + + if (shift > 0) + RT_FREE_RECURSE(tree, child, shift - RT_SPAN); + else if (!RT_CHILDPTR_IS_VALUE(child)) + dsa_free(tree->dsa, child); + } + + break; + } + case RT_NODE_KIND_16: + { + RT_NODE_16 *n16 = (RT_NODE_16 *) node.local; + + for (int i = 0; i < n16->base.count; i++) + { + RT_PTR_ALLOC child = n16->children[i]; + + if (shift > 0) + RT_FREE_RECURSE(tree, child, shift - RT_SPAN); + else if (!RT_CHILDPTR_IS_VALUE(child)) + dsa_free(tree->dsa, child); + } + + break; + } + case RT_NODE_KIND_48: + { + RT_NODE_48 *n48 = (RT_NODE_48 *) node.local; + + for (int i = 0; i < RT_NODE_MAX_SLOTS; i++) + { + RT_PTR_ALLOC child; + + if (!RT_NODE_48_IS_CHUNK_USED(n48, i)) + continue; + + child = *RT_NODE_48_GET_CHILD(n48, i); + + if (shift > 0) + RT_FREE_RECURSE(tree, child, shift - RT_SPAN); + else if (!RT_CHILDPTR_IS_VALUE(child)) + dsa_free(tree->dsa, child); + } + + break; + } + case RT_NODE_KIND_256: + { + RT_NODE_256 *n256 = (RT_NODE_256 *) node.local; + + for (int i = 0; i < RT_NODE_MAX_SLOTS; i++) + { + RT_PTR_ALLOC child; + + if (!RT_NODE_256_IS_CHUNK_USED(n256, i)) + continue; + + child = *RT_NODE_256_GET_CHILD(n256, i); + + if (shift > 0) + RT_FREE_RECURSE(tree, child, shift - RT_SPAN); + else if (!RT_CHILDPTR_IS_VALUE(child)) + dsa_free(tree->dsa, child); + } + + break; + } + } + + /* Free the inner node */ + dsa_free(tree->dsa, ptr); +} +#endif + +/* + * Free the radix tree, including all nodes and leaves. + */ +RT_SCOPE void +RT_FREE(RT_RADIX_TREE * tree) +{ +#ifdef RT_SHMEM + Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC); + + /* Free all memory used for radix tree nodes */ + Assert(RT_PTR_ALLOC_IS_VALID(tree->ctl->root)); + RT_FREE_RECURSE(tree, tree->ctl->root, tree->ctl->start_shift); + + /* + * Vandalize the control block to help catch programming error where other + * backends access the memory formerly occupied by this radix tree. + */ + tree->ctl->magic = 0; + dsa_free(tree->dsa, tree->ctl->handle); +#endif + + /* + * Free all space allocated within the tree's context and delete all child + * contexts such as those used for nodes. + */ + MemoryContextReset(tree->context); +} + +/***************** ITERATION *****************/ + +/* + * Create and return the iterator for the given radix tree. + * + * Taking a lock in shared mode during the iteration is the caller's + * responsibility. + */ +RT_SCOPE RT_ITER * +RT_BEGIN_ITERATE(RT_RADIX_TREE * tree) +{ + RT_ITER *iter; + RT_CHILD_PTR root; + + iter = (RT_ITER *) MemoryContextAllocZero(tree->iter_context, + sizeof(RT_ITER)); + iter->tree = tree; + + Assert(RT_PTR_ALLOC_IS_VALID(tree->ctl->root)); + root.alloc = iter->tree->ctl->root; + RT_PTR_SET_LOCAL(tree, &root); + + iter->top_level = iter->tree->ctl->start_shift / RT_SPAN; + + /* Set the root to start */ + iter->cur_level = iter->top_level; + iter->node_iters[iter->cur_level].node = root; + iter->node_iters[iter->cur_level].idx = 0; + + return iter; +} + +/* + * Scan the inner node and return the next child pointer if one exists, otherwise + * return NULL. + */ +static inline RT_PTR_ALLOC * +RT_NODE_ITERATE_NEXT(RT_ITER * iter, int level) +{ + uint8 key_chunk = 0; + RT_NODE_ITER *node_iter; + RT_CHILD_PTR node; + RT_PTR_ALLOC *slot = NULL; + +#ifdef RT_SHMEM + Assert(iter->tree->ctl->magic == RT_RADIX_TREE_MAGIC); +#endif + + node_iter = &(iter->node_iters[level]); + node = node_iter->node; + + Assert(node.local != NULL); + + switch ((node.local)->kind) + { + case RT_NODE_KIND_4: + { + RT_NODE_4 *n4 = (RT_NODE_4 *) (node.local); + + if (node_iter->idx >= n4->base.count) + return NULL; + + slot = &n4->children[node_iter->idx]; + key_chunk = n4->chunks[node_iter->idx]; + node_iter->idx++; + break; + } + case RT_NODE_KIND_16: + { + RT_NODE_16 *n16 = (RT_NODE_16 *) (node.local); + + if (node_iter->idx >= n16->base.count) + return NULL; + + slot = &n16->children[node_iter->idx]; + key_chunk = n16->chunks[node_iter->idx]; + node_iter->idx++; + break; + } + case RT_NODE_KIND_48: + { + RT_NODE_48 *n48 = (RT_NODE_48 *) (node.local); + int chunk; + + for (chunk = node_iter->idx; chunk < RT_NODE_MAX_SLOTS; chunk++) + { + if (RT_NODE_48_IS_CHUNK_USED(n48, chunk)) + break; + } + + if (chunk >= RT_NODE_MAX_SLOTS) + return NULL; + + slot = RT_NODE_48_GET_CHILD(n48, chunk); + + key_chunk = chunk; + node_iter->idx = chunk + 1; + break; + } + case RT_NODE_KIND_256: + { + RT_NODE_256 *n256 = (RT_NODE_256 *) (node.local); + int chunk; + + for (chunk = node_iter->idx; chunk < RT_NODE_MAX_SLOTS; chunk++) + { + if (RT_NODE_256_IS_CHUNK_USED(n256, chunk)) + break; + } + + if (chunk >= RT_NODE_MAX_SLOTS) + return NULL; + + slot = RT_NODE_256_GET_CHILD(n256, chunk); + + key_chunk = chunk; + node_iter->idx = chunk + 1; + break; + } + } + + /* Update the key */ + iter->key &= ~(((uint64) RT_CHUNK_MASK) << (level * RT_SPAN)); + iter->key |= (((uint64) key_chunk) << (level * RT_SPAN)); + + return slot; +} + +/* + * Return pointer to value and set key_p as long as there is a key. Otherwise + * return NULL. + */ +RT_SCOPE RT_VALUE_TYPE * +RT_ITERATE_NEXT(RT_ITER * iter, uint64 *key_p) +{ + RT_PTR_ALLOC *slot = NULL; + + while (iter->cur_level <= iter->top_level) + { + RT_CHILD_PTR node; + + slot = RT_NODE_ITERATE_NEXT(iter, iter->cur_level); + + if (iter->cur_level == 0 && slot != NULL) + { + /* Found a value at the leaf node */ + *key_p = iter->key; + node.alloc = *slot; + + if (RT_CHILDPTR_IS_VALUE(*slot)) + return (RT_VALUE_TYPE *) slot; + else + { + RT_PTR_SET_LOCAL(iter->tree, &node); + return (RT_VALUE_TYPE *) node.local; + } + } + + if (slot != NULL) + { + /* Found the child slot, move down the tree */ + node.alloc = *slot; + RT_PTR_SET_LOCAL(iter->tree, &node); + + iter->cur_level--; + iter->node_iters[iter->cur_level].node = node; + iter->node_iters[iter->cur_level].idx = 0; + } + else + { + /* Not found the child slot, move up the tree */ + iter->cur_level++; + } + } + + /* We've visited all nodes, so the iteration finished */ + return NULL; +} + +/* + * Terminate the iteration. The caller is responsible for releasing any locks. + */ +RT_SCOPE void +RT_END_ITERATE(RT_ITER * iter) +{ + pfree(iter); +} + +/***************** DELETION *****************/ + +#ifdef RT_USE_DELETE + +/* Delete the element at "deletepos" */ +static inline void +RT_SHIFT_ARRAYS_AND_DELETE(uint8 *chunks, RT_PTR_ALLOC * children, int count, int deletepos) +{ + /* + * This is basically a memmove, but written in a simple loop for speed on + * small inputs. + */ + for (int i = deletepos; i < count - 1; i++) + { + /* workaround for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101481 */ +#ifdef __GNUC__ + __asm__(""); +#endif + chunks[i] = chunks[i + 1]; + children[i] = children[i + 1]; + } +} + +/* + * Copy both chunk and slot arrays into the right + * place. The element at "deletepos" is deleted by skipping it. + */ +static inline void +RT_COPY_ARRAYS_AND_DELETE(uint8 *dst_chunks, RT_PTR_ALLOC * dst_children, + uint8 *src_chunks, RT_PTR_ALLOC * src_children, + int count, int deletepos) +{ + for (int i = 0; i < count - 1; i++) + { + /* + * use a branch-free computation to skip the index of the deleted + * element + */ + int sourceidx = i + (i >= deletepos); + int destidx = i; + + dst_chunks[destidx] = src_chunks[sourceidx]; + dst_children[destidx] = src_children[sourceidx]; + } +} + +/* + * Note: While all node-growing functions are called to perform an insertion + * when no more space is available, shrinking is not a hard-and-fast requirement. + * When shrinking nodes, we generally wait until the count is about 3/4 of + * the next lower node's fanout. This prevents ping-ponging between different + * node sizes. + * + * Some shrinking functions delete first and then shrink, either because we + * must or because it's fast and simple that way. Sometimes it's faster to + * delete while shrinking. + */ + +/* + * Move contents of a node256 to a node48. Any deletion should have happened + * in the caller. + */ +static void pg_noinline +RT_SHRINK_NODE_256(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk) +{ + RT_NODE_256 *n256 = (RT_NODE_256 *) node.local; + RT_CHILD_PTR newnode; + RT_NODE_48 *new48; + int slot_idx = 0; + + /* initialize new node */ + newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_48, RT_CLASS_48); + new48 = (RT_NODE_48 *) newnode.local; + + /* copy over the entries */ + RT_COPY_COMMON(newnode, node); + for (int i = 0; i < RT_NODE_MAX_SLOTS; i++) + { + if (RT_NODE_256_IS_CHUNK_USED(n256, i)) + { + new48->slot_idxs[i] = slot_idx; + new48->children[slot_idx] = n256->children[i]; + slot_idx++; + } + } + + /* + * Since we just copied a dense array, we can fill "isset" using a single + * store, provided the length of that array is at most the number of bits + * in a bitmapword. + */ + Assert(n256->base.count <= BITS_PER_BITMAPWORD); + new48->isset[0] = (bitmapword) (((uint64) 1 << n256->base.count) - 1); + + /* free old node and update reference in parent */ + *parent_slot = newnode.alloc; + RT_FREE_NODE(tree, node); +} + +static inline void +RT_REMOVE_CHILD_256(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk) +{ + int shrink_threshold; + RT_NODE_256 *n256 = (RT_NODE_256 *) node.local; + int idx = RT_BM_IDX(chunk); + int bitnum = RT_BM_BIT(chunk); + + /* Mark the slot free for "chunk" */ + n256->isset[idx] &= ~((bitmapword) 1 << bitnum); + + n256->base.count--; + + /* + * A full node256 will have a count of zero because of overflow, so we + * delete first before checking the shrink threshold. + */ + Assert(n256->base.count > 0); + + /* This simplifies RT_SHRINK_NODE_256() */ + shrink_threshold = BITS_PER_BITMAPWORD; + shrink_threshold = Min(RT_FANOUT_48 / 4 * 3, shrink_threshold); + + if (n256->base.count <= shrink_threshold) + RT_SHRINK_NODE_256(tree, parent_slot, node, chunk); +} + +/* + * Move contents of a node48 to a node16. Any deletion should have happened + * in the caller. + */ +static void pg_noinline +RT_SHRINK_NODE_48(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk) +{ + RT_NODE_48 *n48 = (RT_NODE_48 *) (node.local); + RT_CHILD_PTR newnode; + RT_NODE_16 *new16; + int destidx = 0; + + /* + * Initialize new node. For now we skip the larger node16 size class for + * simplicity. + */ + newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_16, RT_CLASS_16_LO); + new16 = (RT_NODE_16 *) newnode.local; + + /* copy over all existing entries */ + RT_COPY_COMMON(newnode, node); + for (int chunk = 0; chunk < RT_NODE_MAX_SLOTS; chunk++) + { + if (n48->slot_idxs[chunk] != RT_INVALID_SLOT_IDX) + { + new16->chunks[destidx] = chunk; + new16->children[destidx] = n48->children[n48->slot_idxs[chunk]]; + destidx++; + } + } + + Assert(destidx < new16->base.fanout); + + RT_VERIFY_NODE((RT_NODE *) new16); + + /* free old node and update reference in parent */ + *parent_slot = newnode.alloc; + RT_FREE_NODE(tree, node); +} + +static inline void +RT_REMOVE_CHILD_48(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk) +{ + RT_NODE_48 *n48 = (RT_NODE_48 *) node.local; + int deletepos = n48->slot_idxs[chunk]; + + /* For now we skip the larger node16 size class for simplicity */ + int shrink_threshold = RT_FANOUT_16_LO / 4 * 3; + int idx; + int bitnum; + + Assert(deletepos != RT_INVALID_SLOT_IDX); + + idx = RT_BM_IDX(deletepos); + bitnum = RT_BM_BIT(deletepos); + n48->isset[idx] &= ~((bitmapword) 1 << bitnum); + n48->slot_idxs[chunk] = RT_INVALID_SLOT_IDX; + + n48->base.count--; + + /* + * To keep shrinking simple, do it after deleting, which is fast for + * node48 anyway. + */ + if (n48->base.count <= shrink_threshold) + RT_SHRINK_NODE_48(tree, parent_slot, node, chunk); +} + +/* + * Move contents of a node16 to a node4, and delete the one at "deletepos". + * By deleting as we move, we can avoid memmove operations in the new + * node. + */ +static void pg_noinline +RT_SHRINK_NODE_16(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 deletepos) +{ + RT_NODE_16 *n16 = (RT_NODE_16 *) (node.local); + RT_CHILD_PTR newnode; + RT_NODE_4 *new4; + + /* initialize new node */ + newnode = RT_ALLOC_NODE(tree, RT_NODE_KIND_4, RT_CLASS_4); + new4 = (RT_NODE_4 *) newnode.local; + + /* copy over existing entries, except for the one at "deletepos" */ + RT_COPY_COMMON(newnode, node); + RT_COPY_ARRAYS_AND_DELETE(new4->chunks, new4->children, + n16->chunks, n16->children, + n16->base.count, deletepos); + + new4->base.count--; + RT_VERIFY_NODE((RT_NODE *) new4); + + /* free old node and update reference in parent */ + *parent_slot = newnode.alloc; + RT_FREE_NODE(tree, node); +} + +static inline void +RT_REMOVE_CHILD_16(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk, RT_PTR_ALLOC * slot) +{ + RT_NODE_16 *n16 = (RT_NODE_16 *) node.local; + int deletepos = slot - n16->children; + + /* + * When shrinking to node4, 4 is hard-coded. After shrinking, the new node + * will end up with 3 elements and 3 is the largest count where linear + * search is faster than SIMD, at least on x86-64. + */ + if (n16->base.count <= 4) + { + RT_SHRINK_NODE_16(tree, parent_slot, node, deletepos); + return; + } + + Assert(deletepos >= 0); + Assert(n16->chunks[deletepos] == chunk); + + RT_SHIFT_ARRAYS_AND_DELETE(n16->chunks, n16->children, + n16->base.count, deletepos); + n16->base.count--; +} + +static inline void +RT_REMOVE_CHILD_4(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk, RT_PTR_ALLOC * slot) +{ + RT_NODE_4 *n4 = (RT_NODE_4 *) node.local; + + if (n4->base.count == 1) + { + Assert(n4->chunks[0] == chunk); + + /* + * If we're deleting the last entry from the root child node don't + * free it, but mark both the tree and the root child node empty. That + * way, RT_SET can assume it exists. + */ + if (parent_slot == &tree->ctl->root) + { + n4->base.count = 0; + tree->ctl->start_shift = 0; + tree->ctl->max_val = RT_SHIFT_GET_MAX_VAL(0); + } + else + { + /* + * Deleting last entry, so just free the entire node. + * RT_DELETE_RECURSIVE has already freed the value and lower-level + * children. + */ + RT_FREE_NODE(tree, node); + + /* + * Also null out the parent's slot -- this tells the next higher + * level to delete its child pointer + */ + *parent_slot = RT_INVALID_PTR_ALLOC; + } + } + else + { + int deletepos = slot - n4->children; + + Assert(deletepos >= 0); + Assert(n4->chunks[deletepos] == chunk); + + RT_SHIFT_ARRAYS_AND_DELETE(n4->chunks, n4->children, + n4->base.count, deletepos); + + n4->base.count--; + } +} + +/* + * Delete the child pointer corresponding to "key" in the given node. + */ +static inline void +RT_NODE_DELETE(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, RT_CHILD_PTR node, uint8 chunk, RT_PTR_ALLOC * slot) +{ + switch ((node.local)->kind) + { + case RT_NODE_KIND_4: + { + RT_REMOVE_CHILD_4(tree, parent_slot, node, chunk, slot); + return; + } + case RT_NODE_KIND_16: + { + RT_REMOVE_CHILD_16(tree, parent_slot, node, chunk, slot); + return; + } + case RT_NODE_KIND_48: + { + RT_REMOVE_CHILD_48(tree, parent_slot, node, chunk); + return; + } + case RT_NODE_KIND_256: + { + RT_REMOVE_CHILD_256(tree, parent_slot, node, chunk); + return; + } + default: + pg_unreachable(); + } +} + +/* workhorse for RT_DELETE */ +static bool +RT_DELETE_RECURSIVE(RT_RADIX_TREE * tree, RT_PTR_ALLOC * parent_slot, uint64 key, int shift) +{ + RT_PTR_ALLOC *slot; + RT_CHILD_PTR node; + uint8 chunk = RT_GET_KEY_CHUNK(key, shift); + + node.alloc = *parent_slot; + RT_PTR_SET_LOCAL(tree, &node); + slot = RT_NODE_SEARCH(node.local, chunk); + + if (slot == NULL) + return false; + + if (shift == 0) + { + if (!RT_CHILDPTR_IS_VALUE(*slot)) + RT_FREE_LEAF(tree, *slot); + + RT_NODE_DELETE(tree, parent_slot, node, chunk, slot); + return true; + } + else + { + bool deleted; + + deleted = RT_DELETE_RECURSIVE(tree, slot, key, shift - RT_SPAN); + + /* Child node was freed, so delete its slot now */ + if (*slot == RT_INVALID_PTR_ALLOC) + { + Assert(deleted); + RT_NODE_DELETE(tree, parent_slot, node, chunk, slot); + } + + return deleted; + } +} + +/* + * Delete the given key from the radix tree. If the key is found delete it + * and return true, otherwise do nothing and return false. + * + * Taking a lock in exclusive mode is the caller's responsibility. + */ +RT_SCOPE bool +RT_DELETE(RT_RADIX_TREE * tree, uint64 key) +{ + bool deleted; + +#ifdef RT_SHMEM + Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC); +#endif + + if (key > tree->ctl->max_val) + return false; + + Assert(RT_PTR_ALLOC_IS_VALID(tree->ctl->root)); + deleted = RT_DELETE_RECURSIVE(tree, &tree->ctl->root, + key, tree->ctl->start_shift); + + /* Found the key to delete. Update the statistics */ + if (deleted) + { + tree->ctl->num_keys--; + Assert(tree->ctl->num_keys >= 0); + } + + return deleted; +} + +#endif /* RT_USE_DELETE */ + +/***************** UTILITY FUNCTIONS *****************/ + +/* + * Return the statistics of the amount of memory used by the radix tree. + * + * Since dsa_get_total_size() does appropriate locking, the caller doesn't + * need to take a lock. + */ +RT_SCOPE uint64 +RT_MEMORY_USAGE(RT_RADIX_TREE * tree) +{ + size_t total = 0; + +#ifdef RT_SHMEM + Assert(tree->ctl->magic == RT_RADIX_TREE_MAGIC); + total = dsa_get_total_size(tree->dsa); +#else + total = MemoryContextMemAllocated(tree->context, true); +#endif + + return total; +} + +/* + * Perform some sanity checks on the given node. + */ +static void +RT_VERIFY_NODE(RT_NODE * node) +{ +#ifdef USE_ASSERT_CHECKING + + switch (node->kind) + { + case RT_NODE_KIND_4: + { + RT_NODE_4 *n4 = (RT_NODE_4 *) node; + + /* RT_DUMP_NODE(node); */ + + for (int i = 1; i < n4->base.count; i++) + Assert(n4->chunks[i - 1] < n4->chunks[i]); + + break; + } + case RT_NODE_KIND_16: + { + RT_NODE_16 *n16 = (RT_NODE_16 *) node; + + /* RT_DUMP_NODE(node); */ + + for (int i = 1; i < n16->base.count; i++) + Assert(n16->chunks[i - 1] < n16->chunks[i]); + + break; + } + case RT_NODE_KIND_48: + { + RT_NODE_48 *n48 = (RT_NODE_48 *) node; + int cnt = 0; + + /* RT_DUMP_NODE(node); */ + + for (int i = 0; i < RT_NODE_MAX_SLOTS; i++) + { + uint8 slot = n48->slot_idxs[i]; + int idx = RT_BM_IDX(slot); + int bitnum = RT_BM_BIT(slot); + + if (!RT_NODE_48_IS_CHUNK_USED(n48, i)) + continue; + + /* Check if the corresponding slot is used */ + Assert(slot < node->fanout); + Assert((n48->isset[idx] & ((bitmapword) 1 << bitnum)) != 0); + + cnt++; + } + + Assert(n48->base.count == cnt); + + break; + } + case RT_NODE_KIND_256: + { + RT_NODE_256 *n256 = (RT_NODE_256 *) node; + int cnt = 0; + + /* RT_DUMP_NODE(node); */ + + for (int i = 0; i < RT_BM_IDX(RT_NODE_MAX_SLOTS); i++) + cnt += bmw_popcount(n256->isset[i]); + + /* + * Check if the number of used chunk matches, accounting for + * overflow + */ + if (cnt == RT_FANOUT_256) + Assert(n256->base.count == 0); + else + Assert(n256->base.count == cnt); + + break; + } + } +#endif +} + +/***************** DEBUG FUNCTIONS *****************/ + +#ifdef RT_DEBUG + +/* + * Print out tree stats, some of which are only collected in debugging builds. + */ +RT_SCOPE void +RT_STATS(RT_RADIX_TREE * tree) +{ + fprintf(stderr, "max_val = " UINT64_FORMAT "\n", tree->ctl->max_val); + fprintf(stderr, "num_keys = %lld\n", (long long) tree->ctl->num_keys); + +#ifdef RT_SHMEM + fprintf(stderr, "handle = " DSA_POINTER_FORMAT "\n", tree->ctl->handle); +#endif + + fprintf(stderr, "height = %d", tree->ctl->start_shift / RT_SPAN); + + for (int i = 0; i < RT_NUM_SIZE_CLASSES; i++) + { + RT_SIZE_CLASS_ELEM size_class = RT_SIZE_CLASS_INFO[i]; + + fprintf(stderr, ", n%d = %lld", size_class.fanout, (long long) tree->ctl->num_nodes[i]); + } + + fprintf(stderr, ", leaves = %lld", (long long) tree->ctl->num_leaves); + + fprintf(stderr, "\n"); +} + +/* + * Print out debugging information about the given node. + */ +static void +pg_attribute_unused() +RT_DUMP_NODE(RT_NODE * node) +{ +#ifdef RT_SHMEM +#define RT_CHILD_PTR_FORMAT DSA_POINTER_FORMAT +#else +#define RT_CHILD_PTR_FORMAT "%p" +#endif + + fprintf(stderr, "kind %d, fanout %d, count %u\n", + (node->kind == RT_NODE_KIND_4) ? 4 : + (node->kind == RT_NODE_KIND_16) ? 16 : + (node->kind == RT_NODE_KIND_48) ? 48 : 256, + node->fanout == 0 ? 256 : node->fanout, + node->count == 0 ? 256 : node->count); + + switch (node->kind) + { + case RT_NODE_KIND_4: + { + RT_NODE_4 *n4 = (RT_NODE_4 *) node; + + fprintf(stderr, "chunks and slots:\n"); + for (int i = 0; i < n4->base.count; i++) + { + fprintf(stderr, " [%d] chunk %x slot " RT_CHILD_PTR_FORMAT "\n", + i, n4->chunks[i], n4->children[i]); + } + + break; + } + case RT_NODE_KIND_16: + { + RT_NODE_16 *n16 = (RT_NODE_16 *) node; + + fprintf(stderr, "chunks and slots:\n"); + for (int i = 0; i < n16->base.count; i++) + { + fprintf(stderr, " [%d] chunk %x slot " RT_CHILD_PTR_FORMAT "\n", + i, n16->chunks[i], n16->children[i]); + } + break; + } + case RT_NODE_KIND_48: + { + RT_NODE_48 *n48 = (RT_NODE_48 *) node; + char *sep = ""; + + fprintf(stderr, "slot_idxs: \n"); + for (int chunk = 0; chunk < RT_NODE_MAX_SLOTS; chunk++) + { + if (!RT_NODE_48_IS_CHUNK_USED(n48, chunk)) + continue; + + fprintf(stderr, " idx[%d] = %d\n", + chunk, n48->slot_idxs[chunk]); + } + + fprintf(stderr, "isset-bitmap: "); + for (int i = 0; i < (RT_FANOUT_48_MAX / BITS_PER_BYTE); i++) + { + fprintf(stderr, "%s%x", sep, ((uint8 *) n48->isset)[i]); + sep = " "; + } + fprintf(stderr, "\n"); + + fprintf(stderr, "chunks and slots:\n"); + for (int chunk = 0; chunk < RT_NODE_MAX_SLOTS; chunk++) + { + if (!RT_NODE_48_IS_CHUNK_USED(n48, chunk)) + continue; + + fprintf(stderr, " chunk %x slot " RT_CHILD_PTR_FORMAT "\n", + chunk, + *RT_NODE_48_GET_CHILD(n48, chunk)); + } + break; + } + case RT_NODE_KIND_256: + { + RT_NODE_256 *n256 = (RT_NODE_256 *) node; + char *sep = ""; + + fprintf(stderr, "isset-bitmap: "); + for (int i = 0; i < (RT_FANOUT_256 / BITS_PER_BYTE); i++) + { + fprintf(stderr, "%s%x", sep, ((uint8 *) n256->isset)[i]); + sep = " "; + } + fprintf(stderr, "\n"); + + fprintf(stderr, "chunks and slots:\n"); + for (int chunk = 0; chunk < RT_NODE_MAX_SLOTS; chunk++) + { + if (!RT_NODE_256_IS_CHUNK_USED(n256, chunk)) + continue; + + fprintf(stderr, " chunk %x slot " RT_CHILD_PTR_FORMAT "\n", + chunk, + *RT_NODE_256_GET_CHILD(n256, chunk)); + } + break; + } + } +} +#endif /* RT_DEBUG */ + +#endif /* RT_DEFINE */ + + +/* undefine external parameters, so next radix tree can be defined */ +#undef RT_PREFIX +#undef RT_SCOPE +#undef RT_DECLARE +#undef RT_DEFINE +#undef RT_VALUE_TYPE +#undef RT_VARLEN_VALUE_SIZE +#undef RT_RUNTIME_EMBEDDABLE_VALUE +#undef RT_SHMEM +#undef RT_USE_DELETE +#undef RT_DEBUG + +/* locally declared macros */ +#undef RT_MAKE_PREFIX +#undef RT_MAKE_NAME +#undef RT_MAKE_NAME_ +#undef RT_STR +#undef RT_STR_ +#undef RT_SPAN +#undef RT_NODE_MAX_SLOTS +#undef RT_CHUNK_MASK +#undef RT_MAX_SHIFT +#undef RT_MAX_LEVEL +#undef RT_GET_KEY_CHUNK +#undef RT_BM_IDX +#undef RT_BM_BIT +#undef RT_NODE_MUST_GROW +#undef RT_NODE_KIND_COUNT +#undef RT_NUM_SIZE_CLASSES +#undef RT_INVALID_SLOT_IDX +#undef RT_SLAB_BLOCK_SIZE +#undef RT_RADIX_TREE_MAGIC +#undef RT_CHILD_PTR_FORMAT + +/* type declarations */ +#undef RT_RADIX_TREE +#undef RT_RADIX_TREE_CONTROL +#undef RT_CHILD_PTR +#undef RT_PTR_ALLOC +#undef RT_INVALID_PTR_ALLOC +#undef RT_HANDLE +#undef RT_ITER +#undef RT_NODE +#undef RT_NODE_ITER +#undef RT_NODE_KIND_4 +#undef RT_NODE_KIND_16 +#undef RT_NODE_KIND_48 +#undef RT_NODE_KIND_256 +#undef RT_NODE_4 +#undef RT_NODE_16 +#undef RT_NODE_48 +#undef RT_NODE_256 +#undef RT_SIZE_CLASS +#undef RT_SIZE_CLASS_ELEM +#undef RT_SIZE_CLASS_INFO +#undef RT_CLASS_4 +#undef RT_CLASS_16_LO +#undef RT_CLASS_16_HI +#undef RT_CLASS_48 +#undef RT_CLASS_256 +#undef RT_FANOUT_4 +#undef RT_FANOUT_4_MAX +#undef RT_FANOUT_16_LO +#undef RT_FANOUT_16_HI +#undef RT_FANOUT_16_MAX +#undef RT_FANOUT_48 +#undef RT_FANOUT_48_MAX +#undef RT_FANOUT_256 + +/* function declarations */ +#undef RT_CREATE +#undef RT_FREE +#undef RT_ATTACH +#undef RT_DETACH +#undef RT_LOCK_EXCLUSIVE +#undef RT_LOCK_SHARE +#undef RT_UNLOCK +#undef RT_GET_HANDLE +#undef RT_FIND +#undef RT_SET +#undef RT_BEGIN_ITERATE +#undef RT_ITERATE_NEXT +#undef RT_END_ITERATE +#undef RT_DELETE +#undef RT_MEMORY_USAGE +#undef RT_DUMP_NODE +#undef RT_STATS + +/* internal helper functions */ +#undef RT_GET_VALUE_SIZE +#undef RT_VALUE_IS_EMBEDDABLE +#undef RT_CHILDPTR_IS_VALUE +#undef RT_GET_SLOT_RECURSIVE +#undef RT_DELETE_RECURSIVE +#undef RT_ALLOC_NODE +#undef RT_ALLOC_LEAF +#undef RT_FREE_NODE +#undef RT_FREE_LEAF +#undef RT_FREE_RECURSE +#undef RT_EXTEND_UP +#undef RT_EXTEND_DOWN +#undef RT_COPY_COMMON +#undef RT_PTR_SET_LOCAL +#undef RT_PTR_ALLOC_IS_VALID +#undef RT_NODE_16_SEARCH_EQ +#undef RT_NODE_4_GET_INSERTPOS +#undef RT_NODE_16_GET_INSERTPOS +#undef RT_SHIFT_ARRAYS_FOR_INSERT +#undef RT_SHIFT_ARRAYS_AND_DELETE +#undef RT_COPY_ARRAYS_FOR_INSERT +#undef RT_COPY_ARRAYS_AND_DELETE +#undef RT_NODE_48_IS_CHUNK_USED +#undef RT_NODE_48_GET_CHILD +#undef RT_NODE_256_IS_CHUNK_USED +#undef RT_NODE_256_GET_CHILD +#undef RT_KEY_GET_SHIFT +#undef RT_SHIFT_GET_MAX_VAL +#undef RT_NODE_SEARCH +#undef RT_ADD_CHILD_4 +#undef RT_ADD_CHILD_16 +#undef RT_ADD_CHILD_48 +#undef RT_ADD_CHILD_256 +#undef RT_GROW_NODE_4 +#undef RT_GROW_NODE_16 +#undef RT_GROW_NODE_48 +#undef RT_REMOVE_CHILD_4 +#undef RT_REMOVE_CHILD_16 +#undef RT_REMOVE_CHILD_48 +#undef RT_REMOVE_CHILD_256 +#undef RT_SHRINK_NODE_16 +#undef RT_SHRINK_NODE_48 +#undef RT_SHRINK_NODE_256 +#undef RT_NODE_DELETE +#undef RT_NODE_INSERT +#undef RT_NODE_ITERATE_NEXT +#undef RT_VERIFY_NODE diff --git a/src/include/lib/rbtree.h b/src/include/lib/rbtree.h index b339d6ea6fe42..16de4c012c8a2 100644 --- a/src/include/lib/rbtree.h +++ b/src/include/lib/rbtree.h @@ -3,7 +3,7 @@ * rbtree.h * interface for PostgreSQL generic Red-Black binary tree package * - * Copyright (c) 2009-2023, PostgreSQL Global Development Group + * Copyright (c) 2009-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/lib/rbtree.h diff --git a/src/include/lib/simplehash.h b/src/include/lib/simplehash.h index 48db837ec8cf7..3e1b1f946167d 100644 --- a/src/include/lib/simplehash.h +++ b/src/include/lib/simplehash.h @@ -87,7 +87,7 @@ * looking or is done - buckets following a deleted element are shifted * backwards, unless they're empty or already at their optimal position. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/lib/simplehash.h @@ -128,7 +128,8 @@ #define SH_STAT SH_MAKE_NAME(stat) /* internal helper functions (no externally visible prototypes) */ -#define SH_COMPUTE_PARAMETERS SH_MAKE_NAME(compute_parameters) +#define SH_COMPUTE_SIZE SH_MAKE_NAME(compute_size) +#define SH_UPDATE_PARAMETERS SH_MAKE_NAME(update_parameters) #define SH_NEXT SH_MAKE_NAME(next) #define SH_PREV SH_MAKE_NAME(prev) #define SH_DISTANCE_FROM_OPTIMAL SH_MAKE_NAME(distance) @@ -303,11 +304,11 @@ SH_SCOPE void SH_STAT(SH_TYPE * tb); #endif /* - * Compute sizing parameters for hashtable. Called when creating and growing - * the hashtable. + * Compute allocation size for hashtable. Result can be passed to + * SH_UPDATE_PARAMETERS. */ -static inline void -SH_COMPUTE_PARAMETERS(SH_TYPE * tb, uint64 newsize) +static inline uint64 +SH_COMPUTE_SIZE(uint64 newsize) { uint64 size; @@ -325,6 +326,18 @@ SH_COMPUTE_PARAMETERS(SH_TYPE * tb, uint64 newsize) if (unlikely((((uint64) sizeof(SH_ELEMENT_TYPE)) * size) >= SIZE_MAX / 2)) sh_error("hash table too large"); + return size; +} + +/* + * Update sizing parameters for hashtable. Called when creating and growing + * the hashtable. + */ +static inline void +SH_UPDATE_PARAMETERS(SH_TYPE * tb, uint64 newsize) +{ + uint64 size = SH_COMPUTE_SIZE(newsize); + /* now set size */ tb->size = size; tb->sizemask = (uint32) (size - 1); @@ -446,10 +459,11 @@ SH_CREATE(MemoryContext ctx, uint32 nelements, void *private_data) /* increase nelements by fillfactor, want to store nelements elements */ size = Min((double) SH_MAX_SIZE, ((double) nelements) / SH_FILLFACTOR); - SH_COMPUTE_PARAMETERS(tb, size); + size = SH_COMPUTE_SIZE(size); - tb->data = (SH_ELEMENT_TYPE *) SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * tb->size); + tb->data = (SH_ELEMENT_TYPE *) SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * size); + SH_UPDATE_PARAMETERS(tb, size); return tb; } @@ -490,10 +504,15 @@ SH_GROW(SH_TYPE * tb, uint64 newsize) Assert(oldsize != SH_MAX_SIZE); Assert(oldsize < newsize); - /* compute parameters for new table */ - SH_COMPUTE_PARAMETERS(tb, newsize); + newsize = SH_COMPUTE_SIZE(newsize); - tb->data = (SH_ELEMENT_TYPE *) SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * tb->size); + tb->data = (SH_ELEMENT_TYPE *) SH_ALLOCATE(tb, sizeof(SH_ELEMENT_TYPE) * newsize); + + /* + * Update parameters for new table after allocation succeeds to avoid + * inconsistent state on OOM. + */ + SH_UPDATE_PARAMETERS(tb, newsize); newdata = tb->data; @@ -751,9 +770,8 @@ SH_INSERT_HASH_INTERNAL(SH_TYPE * tb, SH_KEY_TYPE key, uint32 hash, bool *found) } /* - * Insert the key key into the hash-table, set *found to true if the key - * already exists, false otherwise. Returns the hash-table entry in either - * case. + * Insert the key into the hash-table, set *found to true if the key already + * exists, false otherwise. Returns the hash-table entry in either case. */ SH_SCOPE SH_ELEMENT_TYPE * SH_INSERT(SH_TYPE * tb, SH_KEY_TYPE key, bool *found) @@ -764,9 +782,9 @@ SH_INSERT(SH_TYPE * tb, SH_KEY_TYPE key, bool *found) } /* - * Insert the key key into the hash-table using an already-calculated - * hash. Set *found to true if the key already exists, false - * otherwise. Returns the hash-table entry in either case. + * Insert the key into the hash-table using an already-calculated hash. Set + * *found to true if the key already exists, false otherwise. Returns the + * hash-table entry in either case. */ SH_SCOPE SH_ELEMENT_TYPE * SH_INSERT_HASH(SH_TYPE * tb, SH_KEY_TYPE key, uint32 hash, bool *found) @@ -964,7 +982,6 @@ SH_DELETE_ITEM(SH_TYPE * tb, SH_ELEMENT_TYPE * entry) SH_SCOPE void SH_START_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter) { - int i; uint64 startelem = PG_UINT64_MAX; /* @@ -972,7 +989,7 @@ SH_START_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter) * supported, we want to start/end at an element that cannot be affected * by elements being shifted. */ - for (i = 0; i < tb->size; i++) + for (uint32 i = 0; i < tb->size; i++) { SH_ELEMENT_TYPE *entry = &tb->data[i]; @@ -983,6 +1000,7 @@ SH_START_ITERATE(SH_TYPE * tb, SH_ITERATOR * iter) } } + /* we should have found an empty element */ Assert(startelem < SH_MAX_SIZE); /* @@ -1101,6 +1119,9 @@ SH_STAT(SH_TYPE * tb) max_collisions = curcoll; } + /* large enough to be worth freeing, even if just used for debugging */ + pfree(collisions); + if (tb->members > 0) { fillfactor = tb->members / ((double) tb->size); @@ -1173,7 +1194,8 @@ SH_STAT(SH_TYPE * tb) #undef SH_STAT /* internal function names */ -#undef SH_COMPUTE_PARAMETERS +#undef SH_COMPUTE_SIZE +#undef SH_UPDATE_PARAMETERS #undef SH_COMPARE_KEYS #undef SH_INITIAL_BUCKET #undef SH_NEXT diff --git a/src/include/lib/sort_template.h b/src/include/lib/sort_template.h index 1edd05c7d366b..00a04a6da4878 100644 --- a/src/include/lib/sort_template.h +++ b/src/include/lib/sort_template.h @@ -5,7 +5,7 @@ * A template for a sort algorithm that supports varying degrees of * specialization. * - * Copyright (c) 2021-2023, PostgreSQL Global Development Group + * Copyright (c) 2021-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1992-1994, Regents of the University of California * * Usage notes: @@ -34,6 +34,16 @@ * - ST_COMPARE(a, b, arg) - variant that takes an extra argument * - ST_COMPARE_RUNTIME_POINTER - sort function takes a function pointer * + * NB: If the comparator function is inlined, some compilers may produce + * worse code with the optimized comparison routines in common/int.h than + * with code with the following form: + * + * if (a < b) + * return -1; + * if (a > b) + * return 1; + * return 0; + * * To say that the comparator and therefore also sort function should * receive an extra pass-through argument, specify the type of the * argument. @@ -243,6 +253,9 @@ ST_SCOPE void ST_SORT(ST_ELEMENT_TYPE * first, size_t n * Find the median of three values. Currently, performance seems to be best * if the comparator is inlined here, but the med3 function is not inlined * in the qsort function. + * + * Refer to the comment at the top of this file for known caveats to consider + * when writing inlined comparator functions. */ static pg_noinline ST_ELEMENT_TYPE * ST_MED3(ST_ELEMENT_TYPE * a, diff --git a/src/include/lib/stringinfo.h b/src/include/lib/stringinfo.h index 36a416f8e0a0e..cd9632e3fcacf 100644 --- a/src/include/lib/stringinfo.h +++ b/src/include/lib/stringinfo.h @@ -8,7 +8,7 @@ * (null-terminated text) or arbitrary binary data. All storage is allocated * with palloc() (falling back to malloc in frontend code). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/lib/stringinfo.h @@ -20,17 +20,27 @@ /*------------------------- * StringInfoData holds information about an extensible string. - * data is the current buffer for the string (allocated with palloc). - * len is the current string length. There is guaranteed to be - * a terminating '\0' at data[len], although this is not very - * useful when the string holds binary data rather than text. + * data is the current buffer for the string. + * len is the current string length. Except in the case of read-only + * strings described below, there is guaranteed to be a + * terminating '\0' at data[len]. * maxlen is the allocated size in bytes of 'data', i.e. the maximum * string size (including the terminating '\0' char) that we can * currently store in 'data' without having to reallocate - * more space. We must always have maxlen > len. - * cursor is initialized to zero by makeStringInfo or initStringInfo, - * but is not otherwise touched by the stringinfo.c routines. - * Some routines use it to scan through a StringInfo. + * more space. We must always have maxlen > len, except + * in the read-only case described below. + * cursor is initialized to zero by makeStringInfo, initStringInfo, + * initReadOnlyStringInfo and initStringInfoFromString but is not + * otherwise touched by the stringinfo.c routines. Some routines + * use it to scan through a StringInfo. + * + * As a special case, a StringInfoData can be initialized with a read-only + * string buffer. In this case "data" does not necessarily point at a + * palloc'd chunk, and management of the buffer storage is the caller's + * responsibility. maxlen is set to zero to indicate that this is the case. + * Read-only StringInfoDatas cannot be appended to or reset. + * Also, it is caller's option whether a read-only string buffer has a + * terminating '\0' or not. This depends on the intended usage. *------------------------- */ typedef struct StringInfoData @@ -45,7 +55,7 @@ typedef StringInfoData *StringInfo; /*------------------------ - * There are two ways to create a StringInfo object initially: + * There are four ways to create a StringInfo object initially: * * StringInfo stringptr = makeStringInfo(); * Both the StringInfoData and the data buffer are palloc'd. @@ -56,8 +66,32 @@ typedef StringInfoData *StringInfo; * This is the easiest approach for a StringInfo object that will * only live as long as the current routine. * + * StringInfoData string; + * initReadOnlyStringInfo(&string, existingbuf, len); + * The StringInfoData's data field is set to point directly to the + * existing buffer and the StringInfoData's len is set to the given len. + * The given buffer can point to memory that's not managed by palloc or + * is pointing partway through a palloc'd chunk. The maxlen field is set + * to 0. A read-only StringInfo cannot be appended to using any of the + * appendStringInfo functions or reset with resetStringInfo(). The given + * buffer can optionally omit the trailing NUL. + * + * StringInfoData string; + * initStringInfoFromString(&string, palloced_buf, len); + * The StringInfoData's data field is set to point directly to the given + * buffer and the StringInfoData's len is set to the given len. This + * method of initialization is useful when the buffer already exists. + * StringInfos initialized this way can be appended to using the + * appendStringInfo functions and reset with resetStringInfo(). The + * given buffer must be NUL-terminated. The palloc'd buffer is assumed + * to be len + 1 in size. + * * To destroy a StringInfo, pfree() the data buffer, and then pfree() the - * StringInfoData if it was palloc'd. There's no special support for this. + * StringInfoData if it was palloc'd. For StringInfos created with + * makeStringInfo(), destroyStringInfo() is provided for this purpose. + * However, if the StringInfo was initialized using initReadOnlyStringInfo() + * then the caller will need to consider if it is safe to pfree the data + * buffer. * * NOTE: some routines build up a string using StringInfo, and then * release the StringInfoData but return the data string itself to their @@ -79,6 +113,48 @@ extern StringInfo makeStringInfo(void); */ extern void initStringInfo(StringInfo str); +/*------------------------ + * initReadOnlyStringInfo + * Initialize a StringInfoData struct from an existing string without copying + * the string. The caller is responsible for ensuring the given string + * remains valid as long as the StringInfoData does. Calls to this are used + * in performance critical locations where allocating a new buffer and copying + * would be too costly. Read-only StringInfoData's may not be appended to + * using any of the appendStringInfo functions or reset with + * resetStringInfo(). + * + * 'data' does not need to point directly to a palloc'd chunk of memory and may + * omit the NUL termination character at data[len]. + */ +static inline void +initReadOnlyStringInfo(StringInfo str, char *data, int len) +{ + str->data = data; + str->len = len; + str->maxlen = 0; /* read-only */ + str->cursor = 0; +} + +/*------------------------ + * initStringInfoFromString + * Initialize a StringInfoData struct from an existing string without copying + * the string. 'data' must be a valid palloc'd chunk of memory that can have + * repalloc() called should more space be required during a call to any of the + * appendStringInfo functions. + * + * 'data' must be NUL terminated at 'len' bytes. + */ +static inline void +initStringInfoFromString(StringInfo str, char *data, int len) +{ + Assert(data[len] == '\0'); + + str->data = data; + str->len = len; + str->maxlen = len + 1; + str->cursor = 0; +} + /*------------------------ * resetStringInfo * Clears the current content of the StringInfo, if any. The @@ -158,4 +234,10 @@ extern void appendBinaryStringInfoNT(StringInfo str, */ extern void enlargeStringInfo(StringInfo str, int needed); +/*------------------------ + * destroyStringInfo + * Frees a StringInfo and its buffer (opposite of makeStringInfo()). + */ +extern void destroyStringInfo(StringInfo str); + #endif /* STRINGINFO_H */ diff --git a/src/include/libpq/auth.h b/src/include/libpq/auth.h index 7fac05b813ffc..227b41daf656f 100644 --- a/src/include/libpq/auth.h +++ b/src/include/libpq/auth.h @@ -4,7 +4,7 @@ * Definitions for network authentication routines * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/auth.h diff --git a/src/include/libpq/be-fsstubs.h b/src/include/libpq/be-fsstubs.h index e70a6cb56cc5e..336b9cef12508 100644 --- a/src/include/libpq/be-fsstubs.h +++ b/src/include/libpq/be-fsstubs.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/be-fsstubs.h diff --git a/src/include/libpq/be-gssapi-common.h b/src/include/libpq/be-gssapi-common.h index 0381f0ce771fd..474c3a6c1f1f6 100644 --- a/src/include/libpq/be-gssapi-common.h +++ b/src/include/libpq/be-gssapi-common.h @@ -3,7 +3,7 @@ * be-gssapi-common.h * Definitions for GSSAPI authentication and encryption handling * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/be-gssapi-common.h diff --git a/src/include/libpq/crypt.h b/src/include/libpq/crypt.h index ddcd27469ac4a..f744de4d202b6 100644 --- a/src/include/libpq/crypt.h +++ b/src/include/libpq/crypt.h @@ -3,7 +3,7 @@ * crypt.h * Interface to libpq/crypt.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/crypt.h @@ -28,7 +28,7 @@ typedef enum PasswordType { PASSWORD_TYPE_PLAINTEXT = 0, PASSWORD_TYPE_MD5, - PASSWORD_TYPE_SCRAM_SHA_256 + PASSWORD_TYPE_SCRAM_SHA_256, } PasswordType; extern PasswordType get_password_type(const char *shadow_pass); diff --git a/src/include/libpq/hba.h b/src/include/libpq/hba.h index 189f6d0df2481..8ea837ae82a6b 100644 --- a/src/include/libpq/hba.h +++ b/src/include/libpq/hba.h @@ -38,7 +38,7 @@ typedef enum UserAuth uaLDAP, uaCert, uaRADIUS, - uaPeer + uaPeer, #define USER_AUTH_LAST uaPeer /* Must be last value of this enum */ } UserAuth; @@ -51,7 +51,7 @@ typedef enum IPCompareMethod ipCmpMask, ipCmpSameHost, ipCmpSameNet, - ipCmpAll + ipCmpAll, } IPCompareMethod; typedef enum ConnType @@ -68,13 +68,13 @@ typedef enum ClientCertMode { clientCertOff, clientCertCA, - clientCertFull + clientCertFull, } ClientCertMode; typedef enum ClientCertName { clientCertCN, - clientCertDN + clientCertDN, } ClientCertName; /* diff --git a/src/include/libpq/ifaddr.h b/src/include/libpq/ifaddr.h index fb50efe6ae708..5a117d4fe1f0c 100644 --- a/src/include/libpq/ifaddr.h +++ b/src/include/libpq/ifaddr.h @@ -3,7 +3,7 @@ * ifaddr.h * IP netmask calculations, and enumerating network interfaces. * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * src/include/libpq/ifaddr.h * diff --git a/src/include/libpq/libpq-be-fe-helpers.h b/src/include/libpq/libpq-be-fe-helpers.h index 41e3bb4376ae8..fe508292743f6 100644 --- a/src/include/libpq/libpq-be-fe-helpers.h +++ b/src/include/libpq/libpq-be-fe-helpers.h @@ -5,7 +5,7 @@ * * Code built directly into the backend is not allowed to link to libpq * directly. Extension code is allowed to use libpq however. However, libpq - * used in extensions has to be careful to block inside libpq, otherwise + * used in extensions has to be careful not to block inside libpq, otherwise * interrupts will not be processed, leading to issues like unresolvable * deadlocks. Backend code also needs to take care to acquire/release an * external fd for the connection, otherwise fd.c's accounting of fd's is @@ -20,7 +20,7 @@ * into non-blocking mode. That can lead to blocking even when only the async * libpq functions are used. This should be fixed. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/libpq-be-fe-helpers.h @@ -44,11 +44,14 @@ #include "miscadmin.h" #include "storage/fd.h" #include "storage/latch.h" +#include "utils/timestamp.h" #include "utils/wait_event.h" static inline void libpqsrv_connect_prepare(void); static inline void libpqsrv_connect_internal(PGconn *conn, uint32 wait_event_info); +static inline PGresult *libpqsrv_get_result_last(PGconn *conn, uint32 wait_event_info); +static inline PGresult *libpqsrv_get_result(PGconn *conn, uint32 wait_event_info); /* @@ -239,4 +242,216 @@ libpqsrv_connect_internal(PGconn *conn, uint32 wait_event_info) PG_END_TRY(); } +/* + * PQexec() wrapper that processes interrupts. + * + * Unless PQsetnonblocking(conn, 1) is in effect, this can't process + * interrupts while pushing the query text to the server. Consider that + * setting if query strings can be long relative to TCP buffer size. + * + * This has the preconditions of PQsendQuery(), not those of PQexec(). Most + * notably, PQexec() would silently discard any prior query results. + */ +static inline PGresult * +libpqsrv_exec(PGconn *conn, const char *query, uint32 wait_event_info) +{ + if (!PQsendQuery(conn, query)) + return NULL; + return libpqsrv_get_result_last(conn, wait_event_info); +} + +/* + * PQexecParams() wrapper that processes interrupts. + * + * See notes at libpqsrv_exec(). + */ +static inline PGresult * +libpqsrv_exec_params(PGconn *conn, + const char *command, + int nParams, + const Oid *paramTypes, + const char *const *paramValues, + const int *paramLengths, + const int *paramFormats, + int resultFormat, + uint32 wait_event_info) +{ + if (!PQsendQueryParams(conn, command, nParams, paramTypes, paramValues, + paramLengths, paramFormats, resultFormat)) + return NULL; + return libpqsrv_get_result_last(conn, wait_event_info); +} + +/* + * Like PQexec(), loop over PQgetResult() until it returns NULL or another + * terminal state. Return the last non-NULL result or the terminal state. + */ +static inline PGresult * +libpqsrv_get_result_last(PGconn *conn, uint32 wait_event_info) +{ + PGresult *volatile lastResult = NULL; + + /* In what follows, do not leak any PGresults on an error. */ + PG_TRY(); + { + for (;;) + { + /* Wait for, and collect, the next PGresult. */ + PGresult *result; + + result = libpqsrv_get_result(conn, wait_event_info); + if (result == NULL) + break; /* query is complete, or failure */ + + /* + * Emulate PQexec()'s behavior of returning the last result when + * there are many. + */ + PQclear(lastResult); + lastResult = result; + + if (PQresultStatus(lastResult) == PGRES_COPY_IN || + PQresultStatus(lastResult) == PGRES_COPY_OUT || + PQresultStatus(lastResult) == PGRES_COPY_BOTH || + PQstatus(conn) == CONNECTION_BAD) + break; + } + } + PG_CATCH(); + { + PQclear(lastResult); + PG_RE_THROW(); + } + PG_END_TRY(); + + return lastResult; +} + +/* + * Perform the equivalent of PQgetResult(), but watch for interrupts. + */ +static inline PGresult * +libpqsrv_get_result(PGconn *conn, uint32 wait_event_info) +{ + /* + * Collect data until PQgetResult is ready to get the result without + * blocking. + */ + while (PQisBusy(conn)) + { + int rc; + + rc = WaitLatchOrSocket(MyLatch, + WL_EXIT_ON_PM_DEATH | WL_LATCH_SET | + WL_SOCKET_READABLE, + PQsocket(conn), + 0, + wait_event_info); + + /* Interrupted? */ + if (rc & WL_LATCH_SET) + { + ResetLatch(MyLatch); + CHECK_FOR_INTERRUPTS(); + } + + /* Consume whatever data is available from the socket */ + if (PQconsumeInput(conn) == 0) + { + /* trouble; expect PQgetResult() to return NULL */ + break; + } + } + + /* Now we can collect and return the next PGresult */ + return PQgetResult(conn); +} + +/* + * Submit a cancel request to the given connection, waiting only until + * the given time. + * + * We sleep interruptibly until we receive confirmation that the cancel + * request has been accepted, and if it is, return NULL; if the cancel + * request fails, return an error message string (which is not to be + * freed). + * + * For other problems (to wit: OOM when strdup'ing an error message from + * libpq), this function can ereport(ERROR). + * + * Note: this function leaks a string's worth of memory when reporting + * libpq errors. Make sure to call it in a transient memory context. + */ +static inline const char * +libpqsrv_cancel(PGconn *conn, TimestampTz endtime) +{ + PGcancelConn *cancel_conn; + const char *error = NULL; + + cancel_conn = PQcancelCreate(conn); + if (cancel_conn == NULL) + return "out of memory"; + + /* In what follows, do not leak any PGcancelConn on any errors. */ + + PG_TRY(); + { + if (!PQcancelStart(cancel_conn)) + { + error = pchomp(PQcancelErrorMessage(cancel_conn)); + goto exit; + } + + for (;;) + { + PostgresPollingStatusType pollres; + TimestampTz now; + long cur_timeout; + int waitEvents = WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH; + + pollres = PQcancelPoll(cancel_conn); + if (pollres == PGRES_POLLING_OK) + break; /* success! */ + + /* If timeout has expired, give up, else get sleep time. */ + now = GetCurrentTimestamp(); + cur_timeout = TimestampDifferenceMilliseconds(now, endtime); + if (cur_timeout <= 0) + { + error = "cancel request timed out"; + break; + } + + switch (pollres) + { + case PGRES_POLLING_READING: + waitEvents |= WL_SOCKET_READABLE; + break; + case PGRES_POLLING_WRITING: + waitEvents |= WL_SOCKET_WRITEABLE; + break; + default: + error = pchomp(PQcancelErrorMessage(cancel_conn)); + goto exit; + } + + /* Sleep until there's something to do */ + WaitLatchOrSocket(MyLatch, waitEvents, PQcancelSocket(cancel_conn), + cur_timeout, PG_WAIT_CLIENT); + + ResetLatch(MyLatch); + + CHECK_FOR_INTERRUPTS(); + } +exit: ; + } + PG_FINALLY(); + { + PQcancelFinish(cancel_conn); + } + PG_END_TRY(); + + return error; +} + #endif /* LIBPQ_BE_FE_HELPERS_H */ diff --git a/src/include/libpq/libpq-be.h b/src/include/libpq/libpq-be.h index 3b2ce9908f81d..6a1a2274c5538 100644 --- a/src/include/libpq/libpq-be.h +++ b/src/include/libpq/libpq-be.h @@ -8,7 +8,7 @@ * Structs that need to be client-visible are in pqcomm.h. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/libpq-be.h @@ -58,17 +58,6 @@ typedef struct #include "libpq/pqcomm.h" -typedef enum CAC_state -{ - CAC_OK, - CAC_STARTUP, - CAC_SHUTDOWN, - CAC_RECOVERY, - CAC_NOTCONSISTENT, - CAC_TOOMANY -} CAC_state; - - /* * GSSAPI specific state information */ @@ -121,12 +110,9 @@ typedef struct ClientConnectionInfo } ClientConnectionInfo; /* - * This is used by the postmaster in its communication with frontends. It - * contains all state information needed during this communication before the - * backend is run. The Port structure is kept in malloc'd memory and is - * still available when a backend is running (see MyProcPort). The data - * it points to must also be malloc'd, or else palloc'd in TopMemoryContext, - * so that it survives into PostgresMain execution! + * The Port structure holds state information about a client connection in a + * backend process. It is available in the global variable MyProcPort. The + * struct and all the data it points are kept in TopMemoryContext. * * remote_hostname is set if we did a successful reverse lookup of the * client's IP address during connection setup. @@ -156,7 +142,6 @@ typedef struct Port int remote_hostname_resolv; /* see above */ int remote_hostname_errcode; /* see above */ char *remote_port; /* text rep of remote port */ - CAC_state canAcceptConnections; /* postmaster connection status */ /* * Information that needs to be saved from the startup packet and passed @@ -204,7 +189,8 @@ typedef struct Port /* * If GSSAPI is supported and used on this connection, store GSSAPI * information. Even when GSSAPI is not compiled in, store a NULL pointer - * to keep struct offsets the same (for extension ABI compatibility). + * to keep struct offsets of the "SSL structures" below the same (for + * extension ABI compatibility). */ pg_gssinfo *gss; #else @@ -218,17 +204,44 @@ typedef struct Port char *peer_cn; char *peer_dn; bool peer_cert_valid; + bool alpn_used; /* - * OpenSSL structures. (Keep these last so that the locations of other - * fields are the same whether or not you build with SSL enabled.) + * OpenSSL structures. */ #ifdef USE_OPENSSL SSL *ssl; X509 *peer; #endif + + /* + * This is a bit of a hack. raw_buf is data that was previously read and + * buffered in a higher layer but then "unread" and needs to be read again + * while establishing an SSL connection via the SSL library layer. + * + * There's no API to "unread", the upper layer just places the data in the + * Port structure in raw_buf and sets raw_buf_remaining to the amount of + * bytes unread and raw_buf_consumed to 0. + * + * NB: the offsets of these fields depend on USE_OPENSSL. These should + * not be accessed in an extension because of the ABI incompatibility. + */ + char *raw_buf; + ssize_t raw_buf_consumed, + raw_buf_remaining; } Port; +/* + * ClientSocket holds a socket for an accepted connection, along with the + * information about the remote endpoint. This is passed from postmaster to + * the backend process. + */ +typedef struct ClientSocket +{ + pgsocket sock; /* File descriptor */ + SockAddr raddr; /* remote addr (client) */ +} ClientSocket; + #ifdef USE_SSL /* * Hardcoded DH parameters, used in ephemeral DH keying. (See also @@ -305,14 +318,8 @@ extern void be_tls_get_peer_serial(Port *port, char *ptr, size_t len); * * The result is a palloc'd hash of the server certificate with its * size, and NULL if there is no certificate available. - * - * This is not supported with old versions of OpenSSL that don't have - * the X509_get_signature_nid() function. */ -#if defined(USE_OPENSSL) && (defined(HAVE_X509_GET_SIGNATURE_NID) || defined(HAVE_X509_GET_SIGNATURE_INFO)) -#define HAVE_BE_TLS_GET_CERTIFICATE_HASH extern char *be_tls_get_certificate_hash(Port *port, size_t *len); -#endif /* init hook for SSL, the default sets the password callback if appropriate */ #ifdef USE_OPENSSL diff --git a/src/include/libpq/libpq-fs.h b/src/include/libpq/libpq-fs.h index f89e0f9e3fb06..dd4e4c2edda2d 100644 --- a/src/include/libpq/libpq-fs.h +++ b/src/include/libpq/libpq-fs.h @@ -4,7 +4,7 @@ * definitions for using Inversion file system routines (ie, large objects) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/libpq-fs.h diff --git a/src/include/libpq/libpq.h b/src/include/libpq/libpq.h index 50fc781f471f3..142c98462ed66 100644 --- a/src/include/libpq/libpq.h +++ b/src/include/libpq/libpq.h @@ -4,7 +4,7 @@ * POSTGRES LIBPQ buffer structure definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/libpq.h @@ -64,14 +64,13 @@ extern PGDLLIMPORT WaitEventSet *FeBeWaitSet; #define FeBeWaitSetLatchPos 1 #define FeBeWaitSetNEvents 3 -extern int StreamServerPort(int family, const char *hostName, +extern int ListenServerPort(int family, const char *hostName, unsigned short portNumber, const char *unixSocketDir, - pgsocket ListenSocket[], int MaxListen); -extern int StreamConnection(pgsocket server_fd, Port *port); -extern void StreamClose(pgsocket sock); + pgsocket ListenSockets[], int *NumListenSockets, int MaxListen); +extern int AcceptConnection(pgsocket server_fd, ClientSocket *client_sock); extern void TouchSocketFiles(void); extern void RemoveSocketFiles(void); -extern void pq_init(void); +extern Port *pq_init(ClientSocket *client_sock); extern int pq_getbytes(char *s, size_t len); extern void pq_startmsgread(void); extern void pq_endmsgread(void); @@ -80,7 +79,7 @@ extern int pq_getmessage(StringInfo s, int maxlen); extern int pq_getbyte(void); extern int pq_peekbyte(void); extern int pq_getbyte_if_available(unsigned char *c); -extern bool pq_buffer_has_data(void); +extern ssize_t pq_buffer_remaining_data(void); extern int pq_putmessage_v2(char msgtype, const char *s, size_t len); extern bool pq_check_connection(void); diff --git a/src/include/libpq/pqcomm.h b/src/include/libpq/pqcomm.h index c85090259d9d9..527735e3dba7a 100644 --- a/src/include/libpq/pqcomm.h +++ b/src/include/libpq/pqcomm.h @@ -6,7 +6,7 @@ * NOTE: for historical reasons, this does not correspond to pqcomm.c. * pqcomm.c's routines are declared in libpq.h. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/pqcomm.h @@ -21,6 +21,12 @@ #include #include +/* + * The definitions for the request/response codes are kept in a separate file + * for ease of use in third party programs. + */ +#include "libpq/protocol.h" + typedef struct { struct sockaddr_storage addr; @@ -103,8 +109,6 @@ typedef ProtocolVersion MsgType; typedef uint32 PacketLen; -extern PGDLLIMPORT bool Db_user_namespace; - /* * In protocol 3.0 and later, the startup packet length is not fixed, but * we set an arbitrary limit on it anyway. This is just to prevent simple @@ -114,23 +118,6 @@ extern PGDLLIMPORT bool Db_user_namespace; #define MAX_STARTUP_PACKET_LENGTH 10000 -/* These are the authentication request codes sent by the backend. */ - -#define AUTH_REQ_OK 0 /* User is authenticated */ -#define AUTH_REQ_KRB4 1 /* Kerberos V4. Not supported any more. */ -#define AUTH_REQ_KRB5 2 /* Kerberos V5. Not supported any more. */ -#define AUTH_REQ_PASSWORD 3 /* Password */ -#define AUTH_REQ_CRYPT 4 /* crypt password. Not supported any more. */ -#define AUTH_REQ_MD5 5 /* md5 password */ -/* 6 is available. It was used for SCM creds, not supported any more. */ -#define AUTH_REQ_GSS 7 /* GSSAPI without wrap() */ -#define AUTH_REQ_GSS_CONT 8 /* Continue GSS exchanges */ -#define AUTH_REQ_SSPI 9 /* SSPI negotiate without wrap() */ -#define AUTH_REQ_SASL 10 /* Begin SASL authentication */ -#define AUTH_REQ_SASL_CONT 11 /* Continue SASL authentication */ -#define AUTH_REQ_SASL_FIN 12 /* Final SASL message */ -#define AUTH_REQ_MAX AUTH_REQ_SASL_FIN /* maximum AUTH_REQ_* value */ - typedef uint32 AuthRequest; @@ -152,6 +139,25 @@ typedef struct CancelRequestPacket uint32 cancelAuthCode; /* secret key to authorize cancel */ } CancelRequestPacket; +/* Application-Layer Protocol Negotiation is required for direct connections + * to avoid protocol confusion attacks (e.g https://alpaca-attack.com/). + * + * ALPN is specified in RFC 7301 + * + * This string should be registered at: + * https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids + * + * OpenSSL uses this wire-format for the list of alpn protocols even in the + * API. Both server and client take the same format parameter but the client + * actually sends it to the server as-is and the server it specifies the + * preference order to use to choose the one selected to send back. + * + * c.f. https://www.openssl.org/docs/manmaster/man3/SSL_CTX_set_alpn_select_cb.html + * + * The #define can be used to initialize a char[] vector to use directly in the API + */ +#define PG_ALPN_PROTOCOL "postgresql" +#define PG_ALPN_PROTOCOL_VECTOR { 10, 'p','o','s','t','g','r','e','s','q','l' } /* * A client can also start by sending a SSL or GSSAPI negotiation request to diff --git a/src/include/libpq/pqformat.h b/src/include/libpq/pqformat.h index 0d2f958af33dd..7f48cbded97a7 100644 --- a/src/include/libpq/pqformat.h +++ b/src/include/libpq/pqformat.h @@ -3,7 +3,7 @@ * pqformat.h * Definitions for formatting and parsing frontend/backend messages * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/pqformat.h @@ -23,8 +23,7 @@ extern void pq_endmessage(StringInfo buf); extern void pq_endmessage_reuse(StringInfo buf); extern void pq_sendbytes(StringInfo buf, const void *data, int datalen); -extern void pq_sendcountedtext(StringInfo buf, const char *str, int slen, - bool countincludesself); +extern void pq_sendcountedtext(StringInfo buf, const char *str, int slen); extern void pq_sendtext(StringInfo buf, const char *str, int slen); extern void pq_sendstring(StringInfo buf, const char *str); extern void pq_send_ascii_string(StringInfo buf, const char *str); diff --git a/src/include/libpq/pqmq.h b/src/include/libpq/pqmq.h index af607edf4cbc0..227df8976f40f 100644 --- a/src/include/libpq/pqmq.h +++ b/src/include/libpq/pqmq.h @@ -3,7 +3,7 @@ * pqmq.h * Use the frontend/backend protocol for communication over a shm_mq * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/pqmq.h @@ -17,7 +17,7 @@ #include "storage/shm_mq.h" extern void pq_redirect_to_shm_mq(dsm_segment *seg, shm_mq_handle *mqh); -extern void pq_set_parallel_leader(pid_t pid, BackendId backend_id); +extern void pq_set_parallel_leader(pid_t pid, ProcNumber procNumber); extern void pq_parse_errornotice(StringInfo msg, ErrorData *edata); diff --git a/src/include/libpq/pqsignal.h b/src/include/libpq/pqsignal.h index 023bcd13bd47c..cf6a3942f6598 100644 --- a/src/include/libpq/pqsignal.h +++ b/src/include/libpq/pqsignal.h @@ -3,7 +3,7 @@ * pqsignal.h * Backend signal(2) support (see also src/port/pqsignal.c) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/pqsignal.h diff --git a/src/include/libpq/protocol.h b/src/include/libpq/protocol.h new file mode 100644 index 0000000000000..b71add1ec1508 --- /dev/null +++ b/src/include/libpq/protocol.h @@ -0,0 +1,89 @@ +/*------------------------------------------------------------------------- + * + * protocol.h + * Definitions of the request/response codes for the wire protocol. + * + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/libpq/protocol.h + * + *------------------------------------------------------------------------- + */ +#ifndef PROTOCOL_H +#define PROTOCOL_H + +/* These are the request codes sent by the frontend. */ + +#define PqMsg_Bind 'B' +#define PqMsg_Close 'C' +#define PqMsg_Describe 'D' +#define PqMsg_Execute 'E' +#define PqMsg_FunctionCall 'F' +#define PqMsg_Flush 'H' +#define PqMsg_Parse 'P' +#define PqMsg_Query 'Q' +#define PqMsg_Sync 'S' +#define PqMsg_Terminate 'X' +#define PqMsg_CopyFail 'f' +#define PqMsg_GSSResponse 'p' +#define PqMsg_PasswordMessage 'p' +#define PqMsg_SASLInitialResponse 'p' +#define PqMsg_SASLResponse 'p' + + +/* These are the response codes sent by the backend. */ + +#define PqMsg_ParseComplete '1' +#define PqMsg_BindComplete '2' +#define PqMsg_CloseComplete '3' +#define PqMsg_NotificationResponse 'A' +#define PqMsg_CommandComplete 'C' +#define PqMsg_DataRow 'D' +#define PqMsg_ErrorResponse 'E' +#define PqMsg_CopyInResponse 'G' +#define PqMsg_CopyOutResponse 'H' +#define PqMsg_EmptyQueryResponse 'I' +#define PqMsg_BackendKeyData 'K' +#define PqMsg_NoticeResponse 'N' +#define PqMsg_AuthenticationRequest 'R' +#define PqMsg_ParameterStatus 'S' +#define PqMsg_RowDescription 'T' +#define PqMsg_FunctionCallResponse 'V' +#define PqMsg_CopyBothResponse 'W' +#define PqMsg_ReadyForQuery 'Z' +#define PqMsg_NoData 'n' +#define PqMsg_PortalSuspended 's' +#define PqMsg_ParameterDescription 't' +#define PqMsg_NegotiateProtocolVersion 'v' + + +/* These are the codes sent by both the frontend and backend. */ + +#define PqMsg_CopyDone 'c' +#define PqMsg_CopyData 'd' + + +/* These are the codes sent by parallel workers to leader processes. */ +#define PqMsg_Progress 'P' + + +/* These are the authentication request codes sent by the backend. */ + +#define AUTH_REQ_OK 0 /* User is authenticated */ +#define AUTH_REQ_KRB4 1 /* Kerberos V4. Not supported any more. */ +#define AUTH_REQ_KRB5 2 /* Kerberos V5. Not supported any more. */ +#define AUTH_REQ_PASSWORD 3 /* Password */ +#define AUTH_REQ_CRYPT 4 /* crypt password. Not supported any more. */ +#define AUTH_REQ_MD5 5 /* md5 password */ +/* 6 is available. It was used for SCM creds, not supported any more. */ +#define AUTH_REQ_GSS 7 /* GSSAPI without wrap() */ +#define AUTH_REQ_GSS_CONT 8 /* Continue GSS exchanges */ +#define AUTH_REQ_SSPI 9 /* SSPI negotiate without wrap() */ +#define AUTH_REQ_SASL 10 /* Begin SASL authentication */ +#define AUTH_REQ_SASL_CONT 11 /* Continue SASL authentication */ +#define AUTH_REQ_SASL_FIN 12 /* Final SASL message */ +#define AUTH_REQ_MAX AUTH_REQ_SASL_FIN /* maximum AUTH_REQ_* value */ + +#endif /* PROTOCOL_H */ diff --git a/src/include/libpq/sasl.h b/src/include/libpq/sasl.h index 7a1b1ed0a00c0..7a1f970ccae65 100644 --- a/src/include/libpq/sasl.h +++ b/src/include/libpq/sasl.h @@ -7,7 +7,7 @@ * * See src/interfaces/libpq/fe-auth-sasl.h for the frontend counterpart. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/sasl.h diff --git a/src/include/libpq/scram.h b/src/include/libpq/scram.h index 310bc36517707..2ae90105578e2 100644 --- a/src/include/libpq/scram.h +++ b/src/include/libpq/scram.h @@ -3,7 +3,7 @@ * scram.h * Interface to libpq/scram.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/libpq/scram.h diff --git a/src/include/mb/pg_wchar.h b/src/include/mb/pg_wchar.h index 25276b199fe23..e5babf3e3579a 100644 --- a/src/include/mb/pg_wchar.h +++ b/src/include/mb/pg_wchar.h @@ -3,7 +3,7 @@ * pg_wchar.h * multibyte-character support * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/mb/pg_wchar.h @@ -13,14 +13,15 @@ * included by libpq client programs. In particular, a libpq client * should not assume that the encoding IDs used by the version of libpq * it's linked to match up with the IDs declared here. + * To help prevent mistakes, relevant functions that are exported by + * libpq have a physically different name when being referenced + * statically. * *------------------------------------------------------------------------- */ #ifndef PG_WCHAR_H #define PG_WCHAR_H -#include "port/simd.h" - /* * The pg_wchar type */ @@ -223,11 +224,10 @@ typedef unsigned int pg_wchar; /* * PostgreSQL encoding identifiers * - * WARNING: the order of this enum must be same as order of entries - * in the pg_enc2name_tbl[] array (in src/common/encnames.c), and - * in the pg_wchar_table[] array (in src/common/wchar.c)! - * - * If you add some encoding don't forget to check + * WARNING: If you add some encoding don't forget to update + * the pg_enc2name_tbl[] array (in src/common/encnames.c), + * the pg_enc2gettext_tbl[] array (in src/common/encnames.c) and + * the pg_wchar_table[] array (in src/common/wchar.c) and to check * PG_ENCODING_BE_LAST macro. * * PG_SQL_ASCII is default encoding and must be = 0. @@ -366,13 +366,7 @@ extern PGDLLIMPORT const pg_enc2name pg_enc2name_tbl[]; /* * Encoding names for gettext */ -typedef struct pg_enc2gettext -{ - pg_enc encoding; - const char *name; -} pg_enc2gettext; - -extern PGDLLIMPORT const pg_enc2gettext pg_enc2gettext_tbl[]; +extern PGDLLIMPORT const char *pg_enc2gettext_tbl[]; /* * pg_wchar stuff @@ -561,6 +555,99 @@ surrogate_pair_to_codepoint(pg_wchar first, pg_wchar second) return ((first & 0x3FF) << 10) + 0x10000 + (second & 0x3FF); } +/* + * Convert a UTF-8 character to a Unicode code point. + * This is a one-character version of pg_utf2wchar_with_len. + * + * No error checks here, c must point to a long-enough string. + */ +static inline pg_wchar +utf8_to_unicode(const unsigned char *c) +{ + if ((*c & 0x80) == 0) + return (pg_wchar) c[0]; + else if ((*c & 0xe0) == 0xc0) + return (pg_wchar) (((c[0] & 0x1f) << 6) | + (c[1] & 0x3f)); + else if ((*c & 0xf0) == 0xe0) + return (pg_wchar) (((c[0] & 0x0f) << 12) | + ((c[1] & 0x3f) << 6) | + (c[2] & 0x3f)); + else if ((*c & 0xf8) == 0xf0) + return (pg_wchar) (((c[0] & 0x07) << 18) | + ((c[1] & 0x3f) << 12) | + ((c[2] & 0x3f) << 6) | + (c[3] & 0x3f)); + else + /* that is an invalid code on purpose */ + return 0xffffffff; +} + +/* + * Map a Unicode code point to UTF-8. utf8string must have at least + * unicode_utf8len(c) bytes available. + */ +static inline unsigned char * +unicode_to_utf8(pg_wchar c, unsigned char *utf8string) +{ + if (c <= 0x7F) + { + utf8string[0] = c; + } + else if (c <= 0x7FF) + { + utf8string[0] = 0xC0 | ((c >> 6) & 0x1F); + utf8string[1] = 0x80 | (c & 0x3F); + } + else if (c <= 0xFFFF) + { + utf8string[0] = 0xE0 | ((c >> 12) & 0x0F); + utf8string[1] = 0x80 | ((c >> 6) & 0x3F); + utf8string[2] = 0x80 | (c & 0x3F); + } + else + { + utf8string[0] = 0xF0 | ((c >> 18) & 0x07); + utf8string[1] = 0x80 | ((c >> 12) & 0x3F); + utf8string[2] = 0x80 | ((c >> 6) & 0x3F); + utf8string[3] = 0x80 | (c & 0x3F); + } + + return utf8string; +} + +/* + * Number of bytes needed to represent the given char in UTF8. + */ +static inline int +unicode_utf8len(pg_wchar c) +{ + if (c <= 0x7F) + return 1; + else if (c <= 0x7FF) + return 2; + else if (c <= 0xFFFF) + return 3; + else + return 4; +} + +/* + * The functions in this list are exported by libpq, and we need to be sure + * that we know which calls are satisfied by libpq and which are satisfied + * by static linkage to libpgcommon. (This is because we might be using a + * libpq.so that's of a different major version and has encoding IDs that + * differ from the current version's.) The nominal function names are what + * are actually used in and exported by libpq, while the names exported by + * libpgcommon.a and libpgcommon_srv.a end in "_private". + */ +#if defined(USE_PRIVATE_ENCODING_FUNCS) || !defined(FRONTEND) +#define pg_char_to_encoding pg_char_to_encoding_private +#define pg_encoding_to_char pg_encoding_to_char_private +#define pg_valid_server_encoding pg_valid_server_encoding_private +#define pg_valid_server_encoding_id pg_valid_server_encoding_id_private +#define pg_utf_mblen pg_utf_mblen_private +#endif /* * These functions are considered part of libpq's exported API and @@ -575,7 +662,10 @@ extern int pg_valid_server_encoding_id(int encoding); * (in addition to the ones just above). The constant tables declared * earlier in this file are also available from libpgcommon. */ +extern void pg_encoding_set_invalid(int encoding, char *dst); extern int pg_encoding_mblen(int encoding, const char *mbstr); +extern int pg_encoding_mblen_or_incomplete(int encoding, const char *mbstr, + size_t remaining); extern int pg_encoding_mblen_bounded(int encoding, const char *mbstr); extern int pg_encoding_dsplen(int encoding, const char *mbstr); extern int pg_encoding_verifymbchar(int encoding, const char *mbstr, int len); @@ -702,71 +792,4 @@ extern int mic2latin_with_table(const unsigned char *mic, unsigned char *p, extern WCHAR *pgwin32_message_to_UTF16(const char *str, int len, int *utf16len); #endif - -/* - * Verify a chunk of bytes for valid ASCII. - * - * Returns false if the input contains any zero bytes or bytes with the - * high-bit set. Input len must be a multiple of the chunk size (8 or 16). - */ -static inline bool -is_valid_ascii(const unsigned char *s, int len) -{ - const unsigned char *const s_end = s + len; - Vector8 chunk; - Vector8 highbit_cum = vector8_broadcast(0); -#ifdef USE_NO_SIMD - Vector8 zero_cum = vector8_broadcast(0x80); -#endif - - Assert(len % sizeof(chunk) == 0); - - while (s < s_end) - { - vector8_load(&chunk, s); - - /* Capture any zero bytes in this chunk. */ -#ifdef USE_NO_SIMD - - /* - * First, add 0x7f to each byte. This sets the high bit in each byte, - * unless it was a zero. If any resulting high bits are zero, the - * corresponding high bits in the zero accumulator will be cleared. - * - * If none of the bytes in the chunk had the high bit set, the max - * value each byte can have after the addition is 0x7f + 0x7f = 0xfe, - * and we don't need to worry about carrying over to the next byte. If - * any input bytes did have the high bit set, it doesn't matter - * because we check for those separately. - */ - zero_cum &= (chunk + vector8_broadcast(0x7F)); -#else - - /* - * Set all bits in each lane of the highbit accumulator where input - * bytes are zero. - */ - highbit_cum = vector8_or(highbit_cum, - vector8_eq(chunk, vector8_broadcast(0))); -#endif - - /* Capture all set bits in this chunk. */ - highbit_cum = vector8_or(highbit_cum, chunk); - - s += sizeof(chunk); - } - - /* Check if any high bits in the high bit accumulator got set. */ - if (vector8_is_highbit_set(highbit_cum)) - return false; - -#ifdef USE_NO_SIMD - /* Check if any high bits in the zero accumulator got cleared. */ - if (zero_cum != vector8_broadcast(0x80)) - return false; -#endif - - return true; -} - #endif /* PG_WCHAR_H */ diff --git a/src/include/mb/stringinfo_mb.h b/src/include/mb/stringinfo_mb.h index 9c533f3e76e04..bdef416e41a35 100644 --- a/src/include/mb/stringinfo_mb.h +++ b/src/include/mb/stringinfo_mb.h @@ -3,7 +3,7 @@ * stringinfo_mb.h * multibyte support for StringInfo * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/mb/stringinfo_mb.h diff --git a/src/include/meson.build b/src/include/meson.build index d7e1ecd4c96d7..58b7a9c1e7e96 100644 --- a/src/include/meson.build +++ b/src/include/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_config_ext = configure_file( input: 'pg_config_ext.h.meson', @@ -44,9 +44,9 @@ config_paths_data.set_quoted('MANDIR', dir_prefix / dir_man) var_cc = ' '.join(cc.cmd_array()) var_cpp = ' '.join(cc.cmd_array() + ['-E']) -var_cflags = ' '.join(cflags + cflags_warn + get_option('c_args')) +var_cflags = ' '.join(cflags + cflags_builtin + cflags_warn + get_option('c_args')) if llvm.found() - var_cxxflags = ' '.join(cxxflags + cxxflags_warn + get_option('cpp_args')) + var_cxxflags = ' '.join(cxxflags + cxxflags_builtin + cxxflags_warn + get_option('cpp_args')) else var_cxxflags = '' endif @@ -94,6 +94,7 @@ install_headers( install_headers( 'libpq/pqcomm.h', + 'libpq/protocol.h', install_dir: dir_include_internal / 'libpq', ) diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 14bd574fc24ef..0d563465935d8 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -10,7 +10,7 @@ * Over time, this has also become the preferred place for widely known * resource-limitation stuff, such as work_mem and check_stack_depth(). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/miscadmin.h @@ -91,6 +91,7 @@ extern PGDLLIMPORT volatile sig_atomic_t InterruptPending; extern PGDLLIMPORT volatile sig_atomic_t QueryCancelPending; extern PGDLLIMPORT volatile sig_atomic_t ProcDiePending; extern PGDLLIMPORT volatile sig_atomic_t IdleInTransactionSessionTimeoutPending; +extern PGDLLIMPORT volatile sig_atomic_t TransactionTimeoutPending; extern PGDLLIMPORT volatile sig_atomic_t IdleSessionTimeoutPending; extern PGDLLIMPORT volatile sig_atomic_t ProcSignalBarrierPending; extern PGDLLIMPORT volatile sig_atomic_t LogMemoryContextPending; @@ -164,7 +165,6 @@ do { \ extern PGDLLIMPORT pid_t PostmasterPid; extern PGDLLIMPORT bool IsPostmasterEnvironment; extern PGDLLIMPORT bool IsUnderPostmaster; -extern PGDLLIMPORT bool IsBackgroundWorker; extern PGDLLIMPORT bool IsBinaryUpgrade; extern PGDLLIMPORT bool ExitOnAnyError; @@ -178,6 +178,14 @@ extern PGDLLIMPORT int MaxConnections; extern PGDLLIMPORT int max_worker_processes; extern PGDLLIMPORT int max_parallel_workers; +extern PGDLLIMPORT int commit_timestamp_buffers; +extern PGDLLIMPORT int multixact_member_buffers; +extern PGDLLIMPORT int multixact_offset_buffers; +extern PGDLLIMPORT int notify_buffers; +extern PGDLLIMPORT int serializable_buffers; +extern PGDLLIMPORT int subtransaction_buffers; +extern PGDLLIMPORT int transaction_buffers; + extern PGDLLIMPORT int MyProcPid; extern PGDLLIMPORT pg_time_t MyStartTime; extern PGDLLIMPORT TimestampTz MyStartTimestamp; @@ -194,15 +202,12 @@ extern PGDLLIMPORT char pkglib_path[]; extern PGDLLIMPORT char postgres_exec_path[]; #endif -/* - * done in storage/backendid.h for now. - * - * extern BackendId MyBackendId; - */ extern PGDLLIMPORT Oid MyDatabaseId; extern PGDLLIMPORT Oid MyDatabaseTableSpace; +extern PGDLLIMPORT bool MyDatabaseHasLoginEventTriggers; + /* * Date/Time Configuration * @@ -300,10 +305,6 @@ extern void PreventCommandIfReadOnly(const char *cmdname); extern void PreventCommandIfParallelMode(const char *cmdname); extern void PreventCommandDuringRecovery(const char *cmdname); -/* in utils/misc/guc_tables.c */ -extern PGDLLIMPORT int trace_recovery_messages; -extern int trace_recovery(int trace_level); - /***************************************************************************** * pdir.h -- * * POSTGRES directory path definitions. * @@ -323,28 +324,72 @@ extern void InitProcessLocalLatch(void); extern void SwitchToSharedLatch(void); extern void SwitchBackToLocalLatch(void); +/* + * MyBackendType indicates what kind of a backend this is. + * + * If you add entries, please also update the child_process_kinds array in + * launch_backend.c. + */ typedef enum BackendType { B_INVALID = 0, - B_ARCHIVER, + + /* Backends and other backend-like processes */ + B_BACKEND, B_AUTOVAC_LAUNCHER, B_AUTOVAC_WORKER, - B_BACKEND, B_BG_WORKER, + B_WAL_SENDER, + B_SLOTSYNC_WORKER, + + B_STANDALONE_BACKEND, + + /* + * Auxiliary processes. These have PGPROC entries, but they are not + * attached to any particular database, and cannot run transactions or + * even take heavyweight locks. There can be only one of each of these + * running at a time. + * + * If you modify these, make sure to update NUM_AUXILIARY_PROCS and the + * glossary in the docs. + */ + B_ARCHIVER, B_BG_WRITER, B_CHECKPOINTER, - B_LOGGER, - B_STANDALONE_BACKEND, B_STARTUP, B_WAL_RECEIVER, - B_WAL_SENDER, + B_WAL_SUMMARIZER, B_WAL_WRITER, + + /* + * Logger is not connected to shared memory and does not have a PGPROC + * entry. + */ + B_LOGGER, } BackendType; -#define BACKEND_NUM_TYPES (B_WAL_WRITER + 1) +#define BACKEND_NUM_TYPES (B_LOGGER + 1) extern PGDLLIMPORT BackendType MyBackendType; +#define AmRegularBackendProcess() (MyBackendType == B_BACKEND) +#define AmAutoVacuumLauncherProcess() (MyBackendType == B_AUTOVAC_LAUNCHER) +#define AmAutoVacuumWorkerProcess() (MyBackendType == B_AUTOVAC_WORKER) +#define AmBackgroundWorkerProcess() (MyBackendType == B_BG_WORKER) +#define AmWalSenderProcess() (MyBackendType == B_WAL_SENDER) +#define AmLogicalSlotSyncWorkerProcess() (MyBackendType == B_SLOTSYNC_WORKER) +#define AmArchiverProcess() (MyBackendType == B_ARCHIVER) +#define AmBackgroundWriterProcess() (MyBackendType == B_BG_WRITER) +#define AmCheckpointerProcess() (MyBackendType == B_CHECKPOINTER) +#define AmStartupProcess() (MyBackendType == B_STARTUP) +#define AmWalReceiverProcess() (MyBackendType == B_WAL_RECEIVER) +#define AmWalSummarizerProcess() (MyBackendType == B_WAL_SUMMARIZER) +#define AmWalWriterProcess() (MyBackendType == B_WAL_WRITER) + +#define AmSpecialWorkerProcess() \ + (AmAutoVacuumLauncherProcess() || \ + AmLogicalSlotSyncWorkerProcess()) + extern const char *GetBackendTypeDesc(BackendType backendType); extern void SetDatabasePath(const char *path); @@ -356,7 +401,9 @@ extern char *GetUserNameFromId(Oid roleid, bool noerr); extern Oid GetUserId(void); extern Oid GetOuterUserId(void); extern Oid GetSessionUserId(void); +extern bool GetSessionUserIsSuperuser(void); extern Oid GetAuthenticatedUserId(void); +extern void SetAuthenticatedUserId(Oid userid); extern void GetUserIdAndSecContext(Oid *userid, int *sec_context); extern void SetUserIdAndSecContext(Oid userid, int sec_context); extern bool InLocalUserIdChange(void); @@ -364,7 +411,8 @@ extern bool InSecurityRestrictedOperation(void); extern bool InNoForceRLSOperation(void); extern void GetUserIdAndContext(Oid *userid, bool *sec_def_context); extern void SetUserIdAndContext(Oid userid, bool sec_def_context); -extern void InitializeSessionUserId(const char *rolename, Oid roleid); +extern void InitializeSessionUserId(const char *rolename, Oid roleid, + bool bypass_login_check); extern void InitializeSessionUserIdStandalone(void); extern void SetSessionAuthorization(Oid userid, bool is_superuser); extern Oid GetCurrentRoleId(void); @@ -406,7 +454,7 @@ typedef enum ProcessingMode { BootstrapProcessing, /* bootstrap creation of template database */ InitProcessing, /* initializing system */ - NormalProcessing /* normal processing */ + NormalProcessing, /* normal processing */ } ProcessingMode; extern PGDLLIMPORT ProcessingMode Mode; @@ -426,49 +474,21 @@ extern PGDLLIMPORT ProcessingMode Mode; } while(0) -/* - * Auxiliary-process type identifiers. These used to be in bootstrap.h - * but it seems saner to have them here, with the ProcessingMode stuff. - * The MyAuxProcType global is defined and set in auxprocess.c. - * - * Make sure to list in the glossary any items you add here. - */ - -typedef enum -{ - NotAnAuxProcess = -1, - StartupProcess = 0, - BgWriterProcess, - ArchiverProcess, - CheckpointerProcess, - WalWriterProcess, - WalReceiverProcess, - - NUM_AUXPROCTYPES /* Must be last! */ -} AuxProcType; - -extern PGDLLIMPORT AuxProcType MyAuxProcType; - -#define AmStartupProcess() (MyAuxProcType == StartupProcess) -#define AmBackgroundWriterProcess() (MyAuxProcType == BgWriterProcess) -#define AmArchiverProcess() (MyAuxProcType == ArchiverProcess) -#define AmCheckpointerProcess() (MyAuxProcType == CheckpointerProcess) -#define AmWalWriterProcess() (MyAuxProcType == WalWriterProcess) -#define AmWalReceiverProcess() (MyAuxProcType == WalReceiverProcess) - - /***************************************************************************** * pinit.h -- * * POSTGRES initialization and cleanup definitions. * *****************************************************************************/ /* in utils/init/postinit.c */ +/* flags for InitPostgres() */ +#define INIT_PG_LOAD_SESSION_LIBS 0x0001 +#define INIT_PG_OVERRIDE_ALLOW_CONNS 0x0002 +#define INIT_PG_OVERRIDE_ROLE_LOGIN 0x0004 extern void pg_split_opts(char **argv, int *argcp, const char *optstr); extern void InitializeMaxBackends(void); extern void InitPostgres(const char *in_dbname, Oid dboid, const char *username, Oid useroid, - bool load_session_libraries, - bool override_allow_connections, + bits32 flags, char *out_dbname); extern void BaseInit(void); diff --git a/src/include/nodes/bitmapset.h b/src/include/nodes/bitmapset.h index 14de6a9ff1e26..283bea5ea961d 100644 --- a/src/include/nodes/bitmapset.h +++ b/src/include/nodes/bitmapset.h @@ -9,7 +9,7 @@ * empty set by a NULL pointer. * * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * src/include/nodes/bitmapset.h * @@ -62,7 +62,7 @@ typedef enum BMS_EQUAL, /* sets are equal */ BMS_SUBSET1, /* first set is a subset of the second */ BMS_SUBSET2, /* second set is a subset of the first */ - BMS_DIFFERENT /* neither set is a subset of the other */ + BMS_DIFFERENT, /* neither set is a subset of the other */ } BMS_Comparison; /* result of bms_membership */ @@ -70,9 +70,22 @@ typedef enum { BMS_EMPTY_SET, /* 0 members */ BMS_SINGLETON, /* 1 member */ - BMS_MULTIPLE /* >1 member */ + BMS_MULTIPLE, /* >1 member */ } BMS_Membership; +/* Select appropriate bit-twiddling functions for bitmap word size */ +#if BITS_PER_BITMAPWORD == 32 +#define bmw_leftmost_one_pos(w) pg_leftmost_one_pos32(w) +#define bmw_rightmost_one_pos(w) pg_rightmost_one_pos32(w) +#define bmw_popcount(w) pg_popcount32(w) +#elif BITS_PER_BITMAPWORD == 64 +#define bmw_leftmost_one_pos(w) pg_leftmost_one_pos64(w) +#define bmw_rightmost_one_pos(w) pg_rightmost_one_pos64(w) +#define bmw_popcount(w) pg_popcount64(w) +#else +#error "invalid BITS_PER_BITMAPWORD" +#endif + /* * function prototypes in nodes/bitmapset.c @@ -109,6 +122,7 @@ extern BMS_Membership bms_membership(const Bitmapset *a); extern Bitmapset *bms_add_member(Bitmapset *a, int x); extern Bitmapset *bms_del_member(Bitmapset *a, int x); extern Bitmapset *bms_add_members(Bitmapset *a, const Bitmapset *b); +extern Bitmapset *bms_replace_members(Bitmapset *a, const Bitmapset *b); extern Bitmapset *bms_add_range(Bitmapset *a, int lower, int upper); extern Bitmapset *bms_int_members(Bitmapset *a, const Bitmapset *b); extern Bitmapset *bms_del_members(Bitmapset *a, const Bitmapset *b); diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index cb714f4a196b8..17b0ec513864a 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -19,7 +19,7 @@ * not provided. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/execnodes.h @@ -34,6 +34,7 @@ #include "fmgr.h" #include "lib/ilist.h" #include "lib/pairingheap.h" +#include "nodes/miscnodes.h" #include "nodes/params.h" #include "nodes/plannodes.h" #include "nodes/tidbitmap.h" @@ -129,6 +130,14 @@ typedef struct ExprState Datum *innermost_domainval; bool *innermost_domainnull; + + /* + * For expression nodes that support soft errors. Should be set to NULL if + * the caller wants errors to be thrown. Callers that do not want errors + * thrown should set it to a valid ErrorSaveContext before calling + * ExecInitExprRec(). + */ + ErrorSaveContext *escontext; } ExprState; @@ -187,7 +196,6 @@ typedef struct IndexInfo Oid *ii_UniqueOps; /* array with one entry per column */ Oid *ii_UniqueProcs; /* array with one entry per column */ uint16 *ii_UniqueStrats; /* array with one entry per column */ - Datum *ii_OpclassOptions; /* array with one entry per column */ bool ii_Unique; bool ii_NullsNotDistinct; bool ii_ReadyForInserts; @@ -296,7 +304,7 @@ typedef enum { ExprSingleResult, /* expression does not return a set */ ExprMultipleResult, /* this result is an element of a set */ - ExprEndResult /* there are no more elements in the set */ + ExprEndResult, /* there are no more elements in the set */ } ExprDoneCond; /* @@ -310,7 +318,7 @@ typedef enum SFRM_ValuePerCall = 0x01, /* one value returned per call */ SFRM_Materialize = 0x02, /* result set instantiated in Tuplestore */ SFRM_Materialize_Random = 0x04, /* Tuplestore needs randomAccess */ - SFRM_Materialize_Preferred = 0x08 /* caller prefers Tuplestore */ + SFRM_Materialize_Preferred = 0x08, /* caller prefers Tuplestore */ } SetFunctionReturnMode; /* @@ -476,6 +484,9 @@ typedef struct ResultRelInfo /* Have the projection and the slots above been initialized? */ bool ri_projectNewInfoValid; + /* updates do LockTuple() before oldtup read; see README.tuplock */ + bool ri_needLockTagTuple; + /* triggers to be fired, if any */ TriggerDesc *ri_TrigDesc; @@ -538,9 +549,11 @@ typedef struct ResultRelInfo /* ON CONFLICT evaluation state */ OnConflictSetState *ri_onConflict; - /* for MERGE, lists of MergeActionState */ - List *ri_matchedMergeAction; - List *ri_notMatchedMergeAction; + /* for MERGE, lists of MergeActionState (one per MergeMatchKind) */ + List *ri_MergeActions[NUM_MERGE_MATCH_KINDS]; + + /* for MERGE, expr state for checking the join condition */ + ExprState *ri_MergeJoinCondition; /* partition check expression state (NULL if not set up yet) */ ExprState *ri_PartitionCheckExpr; @@ -721,8 +734,8 @@ typedef struct EState * ExecRowMark - * runtime representation of FOR [KEY] UPDATE/SHARE clauses * - * When doing UPDATE, DELETE, or SELECT FOR [KEY] UPDATE/SHARE, we will have an - * ExecRowMark for each non-target relation in the query (except inheritance + * When doing UPDATE/DELETE/MERGE/SELECT FOR [KEY] UPDATE/SHARE, we will have + * an ExecRowMark for each non-target relation in the query (except inheritance * parent RTEs, which can be ignored at runtime). Virtual relations such as * subqueries-in-FROM will have an ExecRowMark with relation == NULL. See * PlanRowMark for details about most of the fields. In addition to fields @@ -990,7 +1003,7 @@ typedef struct SubPlanState typedef enum DomainConstraintType { DOM_CONSTRAINT_NOTNULL, - DOM_CONSTRAINT_CHECK + DOM_CONSTRAINT_CHECK, } DomainConstraintType; typedef struct DomainConstraintState @@ -1002,6 +1015,77 @@ typedef struct DomainConstraintState ExprState *check_exprstate; /* check_expr's eval state, or NULL */ } DomainConstraintState; +/* + * State for JsonExpr evaluation, too big to inline. + * + * This contains the information going into and coming out of the + * EEOP_JSONEXPR_PATH eval step. + */ +typedef struct JsonExprState +{ + /* original expression node */ + JsonExpr *jsexpr; + + /* value/isnull for formatted_expr */ + NullableDatum formatted_expr; + + /* value/isnull for pathspec */ + NullableDatum pathspec; + + /* JsonPathVariable entries for passing_values */ + List *args; + + /* + * Output variables that drive the EEOP_JUMP_IF_NOT_TRUE steps that are + * added for ON ERROR and ON EMPTY expressions, if any. + * + * Reset for each evaluation of EEOP_JSONEXPR_PATH. + */ + + /* Set to true if jsonpath evaluation cause an error. */ + NullableDatum error; + + /* Set to true if the jsonpath evaluation returned 0 items. */ + NullableDatum empty; + + /* + * Addresses of steps that implement the non-ERROR variant of ON EMPTY and + * ON ERROR behaviors, respectively. + */ + int jump_empty; + int jump_error; + + /* + * Address of the step to coerce the result value of jsonpath evaluation + * to the RETURNING type. -1 if no coercion if JsonExpr.use_io_coercion + * is true. + */ + int jump_eval_coercion; + + /* + * Address to jump to when skipping all the steps after performing + * ExecEvalJsonExprPath() so as to return whatever the JsonPath* function + * returned as is, that is, in the cases where there's no error and no + * coercion is necessary. + */ + int jump_end; + + /* + * RETURNING type input function invocation info when + * JsonExpr.use_io_coercion is true. + */ + FunctionCallInfo input_fcinfo; + + /* + * For error-safe evaluation of coercions. When the ON ERROR behavior is + * not ERROR, a pointer to this is passed to ExecInitExprRec() when + * initializing the coercion expressions or to ExecInitJsonCoercion(). + * + * Reset for each evaluation of EEOP_JSONEXPR_PATH. + */ + ErrorSaveContext escontext; +} JsonExprState; + /* ---------------------------------------------------------------- * Executor State Trees @@ -1319,6 +1403,16 @@ typedef struct ModifyTableState /* Flags showing which subcommands are present INS/UPD/DEL/DO NOTHING */ int mt_merge_subcommands; + /* For MERGE, the action currently being executed */ + MergeActionState *mt_merge_action; + + /* + * For MERGE, if there is a pending NOT MATCHED [BY TARGET] action to be + * performed, this will be the last tuple read from the subplan; otherwise + * it will be NULL --- see the comments in ExecMerge(). + */ + TupleTableSlot *mt_merge_pending_not_matched; + /* tuple counters for MERGE */ double mt_merge_inserted; double mt_merge_updated; @@ -1600,6 +1694,8 @@ typedef struct IndexScanState * TableSlot slot for holding tuples fetched from the table * VMBuffer buffer in use for visibility map testing, if any * PscanLen size of parallel index-only scan descriptor + * NameCStringAttNums attnums of name typed columns to pad to NAMEDATALEN + * NameCStringCount number of elements in the NameCStringAttNums array * ---------------- */ typedef struct IndexOnlyScanState @@ -1619,6 +1715,8 @@ typedef struct IndexOnlyScanState TupleTableSlot *ioss_TableSlot; Buffer ioss_VMBuffer; Size ioss_PscanLen; + AttrNumber *ioss_NameCStringAttNums; + int ioss_NameCStringCount; } IndexOnlyScanState; /* ---------------- @@ -1670,7 +1768,7 @@ typedef enum { BM_INITIAL, BM_INPROGRESS, - BM_FINISHED + BM_FINISHED, } SharedBitmapState; /* ---------------- @@ -1683,7 +1781,6 @@ typedef enum * prefetch_target current target prefetch distance * state current state of the TIDBitmap * cv conditional wait variable - * phs_snapshot_data snapshot data shared to workers * ---------------- */ typedef struct ParallelBitmapHeapState @@ -1695,7 +1792,6 @@ typedef struct ParallelBitmapHeapState int prefetch_target; SharedBitmapState state; ConditionVariable cv; - char phs_snapshot_data[FLEXIBLE_ARRAY_MEMBER]; } ParallelBitmapHeapState; /* ---------------- @@ -1705,17 +1801,13 @@ typedef struct ParallelBitmapHeapState * tbm bitmap obtained from child index scan(s) * tbmiterator iterator for scanning current pages * tbmres current-page data - * can_skip_fetch can we potentially skip tuple fetches in this scan? - * return_empty_tuples number of empty tuples to return - * vmbuffer buffer for visibility-map lookups - * pvmbuffer ditto, for prefetched pages + * pvmbuffer buffer for visibility-map lookups of prefetched pages * exact_pages total number of exact pages retrieved * lossy_pages total number of lossy pages retrieved * prefetch_iterator iterator for prefetching ahead of current page * prefetch_pages # pages prefetch iterator is ahead of current * prefetch_target current target prefetch distance * prefetch_maximum maximum value for prefetch_target - * pscan_len size of the shared memory for parallel bitmap * initialized is node is ready to iterate * shared_tbmiterator shared iterator * shared_prefetch_iterator shared iterator for prefetching @@ -1729,9 +1821,6 @@ typedef struct BitmapHeapScanState TIDBitmap *tbm; TBMIterator *tbmiterator; TBMIterateResult *tbmres; - bool can_skip_fetch; - int return_empty_tuples; - Buffer vmbuffer; Buffer pvmbuffer; long exact_pages; long lossy_pages; @@ -1739,7 +1828,6 @@ typedef struct BitmapHeapScanState int prefetch_pages; int prefetch_target; int prefetch_maximum; - Size pscan_len; bool initialized; TBMSharedIterator *shared_tbmiterator; TBMSharedIterator *shared_prefetch_iterator; @@ -1754,7 +1842,6 @@ typedef struct BitmapHeapScanState * NumTids number of tids in this scan * TidPtr index of currently fetched tid * TidList evaluated item pointers (array of size NumTids) - * htup currently-fetched tuple, if any * ---------------- */ typedef struct TidScanState @@ -1765,7 +1852,6 @@ typedef struct TidScanState int tss_NumTids; int tss_TidPtr; ItemPointerData *tss_TidList; - HeapTupleData tss_htup; } TidScanState; /* ---------------- @@ -1876,6 +1962,8 @@ typedef struct TableFuncScanState ExprState *rowexpr; /* state for row-generating expression */ List *colexprs; /* state for column-generating expression */ List *coldefexprs; /* state for column default expressions */ + List *colvalexprs; /* state for column value expressions */ + List *passingvalexprs; /* state for PASSING argument expressions */ List *ns_names; /* same as TableFunc.ns_names */ List *ns_uris; /* list of states of namespace URI exprs */ Bitmapset *notnulls; /* nullability flag for each output column */ @@ -2447,7 +2535,6 @@ typedef struct AggState #define FIELDNO_AGGSTATE_ALL_PERGROUPS 53 AggStatePerGroup *all_pergroups; /* array of first ->pergroups, than * ->hash_pergroup */ - ProjectionInfo *combinedproj; /* projection machinery */ SharedAggInfo *shared_info; /* one entry per worker */ } AggState; @@ -2467,7 +2554,7 @@ typedef enum WindowAggStatus WINDOWAGG_DONE, /* No more processing to do */ WINDOWAGG_RUN, /* Normal processing of window funcs */ WINDOWAGG_PASSTHROUGH, /* Don't eval window funcs */ - WINDOWAGG_PASSTHROUGH_STRICT /* Pass-through plus don't store new + WINDOWAGG_PASSTHROUGH_STRICT, /* Pass-through plus don't store new * tuples during spool */ } WindowAggStatus; @@ -2745,7 +2832,7 @@ typedef enum LIMIT_WINDOWEND_TIES, /* have returned a tied row */ LIMIT_SUBPLANEOF, /* at EOF of subplan (within window) */ LIMIT_WINDOWEND, /* stepped off end of window */ - LIMIT_WINDOWSTART /* stepped off beginning of window */ + LIMIT_WINDOWSTART, /* stepped off beginning of window */ } LimitStateCond; typedef struct LimitState diff --git a/src/include/nodes/extensible.h b/src/include/nodes/extensible.h index 7d51c6033e718..697a0282de41f 100644 --- a/src/include/nodes/extensible.h +++ b/src/include/nodes/extensible.h @@ -4,7 +4,7 @@ * Definitions for extensible nodes and custom scans * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/extensible.h diff --git a/src/include/nodes/lockoptions.h b/src/include/nodes/lockoptions.h index bc5e98336f177..044ef42ee101b 100644 --- a/src/include/nodes/lockoptions.h +++ b/src/include/nodes/lockoptions.h @@ -4,7 +4,7 @@ * Common header for some locking-related declarations. * * - * Copyright (c) 2014-2023, PostgreSQL Global Development Group + * Copyright (c) 2014-2024, PostgreSQL Global Development Group * * src/include/nodes/lockoptions.h * @@ -24,7 +24,7 @@ typedef enum LockClauseStrength LCS_FORKEYSHARE, /* FOR KEY SHARE */ LCS_FORSHARE, /* FOR SHARE */ LCS_FORNOKEYUPDATE, /* FOR NO KEY UPDATE */ - LCS_FORUPDATE /* FOR UPDATE */ + LCS_FORUPDATE, /* FOR UPDATE */ } LockClauseStrength; /* @@ -40,7 +40,7 @@ typedef enum LockWaitPolicy /* Skip rows that can't be locked (SKIP LOCKED) */ LockWaitSkip, /* Raise an error if a row cannot be locked (NOWAIT) */ - LockWaitError + LockWaitError, } LockWaitPolicy; /* @@ -55,7 +55,7 @@ typedef enum LockTupleMode /* SELECT FOR NO KEY UPDATE, and UPDATEs that don't modify key columns */ LockTupleNoKeyExclusive, /* SELECT FOR UPDATE, UPDATEs that modify key columns, and DELETE */ - LockTupleExclusive + LockTupleExclusive, } LockTupleMode; #endif /* LOCKOPTIONS_H */ diff --git a/src/include/nodes/makefuncs.h b/src/include/nodes/makefuncs.h index 06d991b7257f7..5209d3de89cd2 100644 --- a/src/include/nodes/makefuncs.h +++ b/src/include/nodes/makefuncs.h @@ -4,7 +4,7 @@ * prototypes for the creator functions of various nodes * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/makefuncs.h @@ -100,6 +100,7 @@ extern IndexInfo *makeIndexInfo(int numattrs, int numkeyattrs, Oid amoid, bool isready, bool concurrent, bool summarizing); +extern Node *makeStringConst(char *str, int location); extern DefElem *makeDefElem(char *name, Node *arg, int location); extern DefElem *makeDefElemExtended(char *nameSpace, char *name, Node *arg, DefElemAction defaction, int location); @@ -110,11 +111,17 @@ extern VacuumRelation *makeVacuumRelation(RangeVar *relation, Oid oid, List *va_ extern JsonFormat *makeJsonFormat(JsonFormatType type, JsonEncoding encoding, int location); -extern JsonValueExpr *makeJsonValueExpr(Expr *expr, JsonFormat *format); +extern JsonValueExpr *makeJsonValueExpr(Expr *raw_expr, Expr *formatted_expr, + JsonFormat *format); extern Node *makeJsonKeyValue(Node *key, Node *value); extern Node *makeJsonIsPredicate(Node *expr, JsonFormat *format, JsonValueType item_type, bool unique_keys, int location); -extern JsonEncoding makeJsonEncoding(char *name); +extern JsonBehavior *makeJsonBehavior(JsonBehaviorType btype, Node *expr, + int location); +extern JsonTablePath *makeJsonTablePath(Const *pathvalue, char *pathname); +extern JsonTablePathSpec *makeJsonTablePathSpec(char *string, char *name, + int string_location, + int name_location); #endif /* MAKEFUNC_H */ diff --git a/src/include/nodes/memnodes.h b/src/include/nodes/memnodes.h index ff6453bb7ac71..c4c9fd3e3e1bb 100644 --- a/src/include/nodes/memnodes.h +++ b/src/include/nodes/memnodes.h @@ -4,7 +4,7 @@ * POSTGRES memory context node definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/memnodes.h @@ -57,20 +57,58 @@ typedef void (*MemoryStatsPrintFunc) (MemoryContext context, void *passthru, typedef struct MemoryContextMethods { - void *(*alloc) (MemoryContext context, Size size); + /* + * Function to handle memory allocation requests of 'size' to allocate + * memory into the given 'context'. The function must handle flags + * MCXT_ALLOC_HUGE and MCXT_ALLOC_NO_OOM. MCXT_ALLOC_ZERO is handled by + * the calling function. + */ + void *(*alloc) (MemoryContext context, Size size, int flags); + /* call this free_p in case someone #define's free() */ void (*free_p) (void *pointer); - void *(*realloc) (void *pointer, Size size); + + /* + * Function to handle a size change request for an existing allocation. + * The implementation must handle flags MCXT_ALLOC_HUGE and + * MCXT_ALLOC_NO_OOM. MCXT_ALLOC_ZERO is handled by the calling function. + */ + void *(*realloc) (void *pointer, Size size, int flags); + + /* + * Invalidate all previous allocations in the given memory context and + * prepare the context for a new set of allocations. Implementations may + * optionally free() excess memory back to the OS during this time. + */ void (*reset) (MemoryContext context); + + /* Free all memory consumed by the given MemoryContext. */ void (*delete_context) (MemoryContext context); + + /* Return the MemoryContext that the given pointer belongs to. */ MemoryContext (*get_chunk_context) (void *pointer); + + /* + * Return the number of bytes consumed by the given pointer within its + * memory context, including the overhead of alignment and chunk headers. + */ Size (*get_chunk_space) (void *pointer); + + /* + * Return true if the given MemoryContext has not had any allocations + * since it was created or last reset. + */ bool (*is_empty) (MemoryContext context); void (*stats) (MemoryContext context, MemoryStatsPrintFunc printfunc, void *passthru, MemoryContextCounters *totals, bool print_to_stderr); #ifdef MEMORY_CONTEXT_CHECKING + + /* + * Perform validation checks on the given context and raise any discovered + * anomalies as WARNINGs. + */ void (*check) (MemoryContext context); #endif } MemoryContextMethods; @@ -108,6 +146,7 @@ typedef struct MemoryContextData ((context) != NULL && \ (IsA((context), AllocSetContext) || \ IsA((context), SlabContext) || \ - IsA((context), GenerationContext))) + IsA((context), GenerationContext) || \ + IsA((context), BumpContext))) #endif /* MEMNODES_H */ diff --git a/src/include/nodes/meson.build b/src/include/nodes/meson.build index 626dc696d51f1..b665e55b6571f 100644 --- a/src/include/nodes/meson.build +++ b/src/include/nodes/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group node_support_input_i = [ 'nodes/nodes.h', diff --git a/src/include/nodes/miscnodes.h b/src/include/nodes/miscnodes.h index 79cc0db475497..1612b63acda0b 100644 --- a/src/include/nodes/miscnodes.h +++ b/src/include/nodes/miscnodes.h @@ -10,7 +10,7 @@ * "context" pointers. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/miscnodes.h diff --git a/src/include/nodes/multibitmapset.h b/src/include/nodes/multibitmapset.h index 505f017d688a8..d6f23b87368c3 100644 --- a/src/include/nodes/multibitmapset.h +++ b/src/include/nodes/multibitmapset.h @@ -18,7 +18,7 @@ * a small fraction of that has been built out; we'll add more as needed. * * - * Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * src/include/nodes/multibitmapset.h * diff --git a/src/include/nodes/nodeFuncs.h b/src/include/nodes/nodeFuncs.h index 20921b45b9e10..eaba59bed834b 100644 --- a/src/include/nodes/nodeFuncs.h +++ b/src/include/nodes/nodeFuncs.h @@ -3,7 +3,7 @@ * nodeFuncs.h * Various general-purpose manipulations of Node trees * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/nodeFuncs.h diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h index f8e8fe699ab42..855009fd6e208 100644 --- a/src/include/nodes/nodes.h +++ b/src/include/nodes/nodes.h @@ -4,7 +4,7 @@ * Definitions for tagged nodes. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/nodes.h @@ -139,39 +139,18 @@ typedef struct Node * * !WARNING!: Avoid using newNode directly. You should be using the * macro makeNode. eg. to create a Query node, use makeNode(Query) - * - * Note: the size argument should always be a compile-time constant, so the - * apparent risk of multiple evaluation doesn't matter in practice. - */ -#ifdef __GNUC__ - -/* With GCC, we can use a compound statement within an expression */ -#define newNode(size, tag) \ -({ Node *_result; \ - AssertMacro((size) >= sizeof(Node)); /* need the tag, at least */ \ - _result = (Node *) palloc0fast(size); \ - _result->type = (tag); \ - _result; \ -}) -#else - -/* - * There is no way to dereference the palloc'ed pointer to assign the - * tag, and also return the pointer itself, so we need a holder variable. - * Fortunately, this macro isn't recursive so we just define - * a global variable for this purpose. */ -extern PGDLLIMPORT Node *newNodeMacroHolder; +static inline Node * +newNode(size_t size, NodeTag tag) +{ + Node *result; -#define newNode(size, tag) \ -( \ - AssertMacro((size) >= sizeof(Node)), /* need the tag, at least */ \ - newNodeMacroHolder = (Node *) palloc0fast(size), \ - newNodeMacroHolder->type = (tag), \ - newNodeMacroHolder \ -) -#endif /* __GNUC__ */ + Assert(size >= sizeof(Node)); /* need the tag, at least */ + result = (Node *) palloc0(size); + result->type = tag; + return result; +} #define makeNode(_type_) ((_type_ *) newNode(sizeof(_type_),T_##_type_)) #define NodeSetTag(nodeptr,t) (((Node*)(nodeptr))->type = (t)) @@ -216,6 +195,7 @@ extern void outBitmapset(struct StringInfoData *str, extern void outDatum(struct StringInfoData *str, uintptr_t value, int typlen, bool typbyval); extern char *nodeToString(const void *obj); +extern char *nodeToStringWithLocations(const void *obj); extern char *bmsToString(const struct Bitmapset *bms); /* @@ -251,9 +231,18 @@ extern bool equal(const void *a, const void *b); /* - * Typedefs for identifying qualifier selectivities and plan costs as such. - * These are just plain "double"s, but declaring a variable as Selectivity - * or Cost makes the intent more obvious. + * Typedef for parse location. This is just an int, but this way + * gen_node_support.pl knows which fields should get special treatment for + * location values. + * + * -1 is used for unknown. + */ +typedef int ParseLoc; + +/* + * Typedefs for identifying qualifier selectivities, plan costs, and row + * counts as such. These are just plain "double"s, but declaring a variable + * as Selectivity, Cost, or Cardinality makes the intent more obvious. * * These could have gone into plannodes.h or some such, but many files * depend on them... @@ -280,7 +269,7 @@ typedef enum CmdType CMD_MERGE, /* merge stmt */ CMD_UTILITY, /* cmds like create, destroy, copy, vacuum, * etc. */ - CMD_NOTHING /* dummy command for instead nothing rules + CMD_NOTHING, /* dummy command for instead nothing rules * with qual */ } CmdType; @@ -324,7 +313,7 @@ typedef enum JoinType * by the executor (nor, indeed, by most of the planner). */ JOIN_UNIQUE_OUTER, /* LHS path must be made unique */ - JOIN_UNIQUE_INNER /* RHS path must be made unique */ + JOIN_UNIQUE_INNER, /* RHS path must be made unique */ /* * We might need additional join types someday. @@ -364,7 +353,7 @@ typedef enum AggStrategy AGG_PLAIN, /* simple agg across all input rows */ AGG_SORTED, /* grouped agg, input must be sorted */ AGG_HASHED, /* grouped agg, use internal hashtable */ - AGG_MIXED /* grouped agg, hash and sort both used */ + AGG_MIXED, /* grouped agg, hash and sort both used */ } AggStrategy; /* @@ -388,7 +377,7 @@ typedef enum AggSplit /* Initial phase of partial aggregation, with serialization: */ AGGSPLIT_INITIAL_SERIAL = AGGSPLITOP_SKIPFINAL | AGGSPLITOP_SERIALIZE, /* Final phase of partial aggregation, with deserialization: */ - AGGSPLIT_FINAL_DESERIAL = AGGSPLITOP_COMBINE | AGGSPLITOP_DESERIALIZE + AGGSPLIT_FINAL_DESERIAL = AGGSPLITOP_COMBINE | AGGSPLITOP_DESERIALIZE, } AggSplit; /* Test whether an AggSplit value selects each primitive option: */ @@ -408,13 +397,13 @@ typedef enum SetOpCmd SETOPCMD_INTERSECT, SETOPCMD_INTERSECT_ALL, SETOPCMD_EXCEPT, - SETOPCMD_EXCEPT_ALL + SETOPCMD_EXCEPT_ALL, } SetOpCmd; typedef enum SetOpStrategy { SETOP_SORTED, /* input must be sorted */ - SETOP_HASHED /* use internal hashtable */ + SETOP_HASHED, /* use internal hashtable */ } SetOpStrategy; /* @@ -427,7 +416,7 @@ typedef enum OnConflictAction { ONCONFLICT_NONE, /* No "ON CONFLICT" clause */ ONCONFLICT_NOTHING, /* ON CONFLICT ... DO NOTHING */ - ONCONFLICT_UPDATE /* ON CONFLICT ... DO UPDATE */ + ONCONFLICT_UPDATE, /* ON CONFLICT ... DO UPDATE */ } OnConflictAction; /* @@ -440,7 +429,6 @@ typedef enum LimitOption { LIMIT_OPTION_COUNT, /* FETCH FIRST... ONLY */ LIMIT_OPTION_WITH_TIES, /* FETCH FIRST... WITH TIES */ - LIMIT_OPTION_DEFAULT, /* No limit present */ } LimitOption; #endif /* NODES_H */ diff --git a/src/include/nodes/params.h b/src/include/nodes/params.h index ad23113a61cfa..10c9fc5413b12 100644 --- a/src/include/nodes/params.h +++ b/src/include/nodes/params.h @@ -4,7 +4,7 @@ * Support for finding the values associated with Param nodes. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/params.h diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index b3bec90e526a5..67c90a2bd328d 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -12,7 +12,7 @@ * identifying statement boundaries in multi-statement source strings. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/parsenodes.h @@ -30,13 +30,6 @@ #include "partitioning/partdefs.h" -typedef enum OverridingKind -{ - OVERRIDING_NOT_SET = 0, - OVERRIDING_USER_VALUE, - OVERRIDING_SYSTEM_VALUE -} OverridingKind; - /* Possible sources of a Query */ typedef enum QuerySource { @@ -44,7 +37,7 @@ typedef enum QuerySource QSRC_PARSER, /* added by parse analysis (now unused) */ QSRC_INSTEAD_RULE, /* added by unconditional INSTEAD rule */ QSRC_QUAL_INSTEAD_RULE, /* added by conditional INSTEAD rule */ - QSRC_NON_INSTEAD_RULE /* added by non-INSTEAD rule */ + QSRC_NON_INSTEAD_RULE, /* added by non-INSTEAD rule */ } QuerySource; /* Sort ordering options for ORDER BY and CREATE INDEX */ @@ -53,14 +46,14 @@ typedef enum SortByDir SORTBY_DEFAULT, SORTBY_ASC, SORTBY_DESC, - SORTBY_USING /* not allowed in CREATE INDEX ... */ + SORTBY_USING, /* not allowed in CREATE INDEX ... */ } SortByDir; typedef enum SortByNulls { SORTBY_NULLS_DEFAULT, SORTBY_NULLS_FIRST, - SORTBY_NULLS_LAST + SORTBY_NULLS_LAST, } SortByNulls; /* Options for [ ALL | DISTINCT ] */ @@ -68,7 +61,7 @@ typedef enum SetQuantifier { SET_QUANTIFIER_DEFAULT, SET_QUANTIFIER_ALL, - SET_QUANTIFIER_DISTINCT + SET_QUANTIFIER_DISTINCT, } SetQuantifier; /* @@ -94,7 +87,7 @@ typedef uint64 AclMode; /* a bitmask of privilege bits */ #define ACL_CONNECT (1<<11) /* for databases */ #define ACL_SET (1<<12) /* for configuration parameters */ #define ACL_ALTER_SYSTEM (1<<13) /* for configuration parameters */ -#define ACL_MAINTAIN (1<<14) /* for relations */ +#define ACL_MAINTAIN (1<<14) /* for relations */ #define N_ACL_RIGHTS 15 /* 1 plus the last 1<), (), ... */ RTE_CTE, /* common table expr (WITH list element) */ RTE_NAMEDTUPLESTORE, /* tuplestore, e.g. for AFTER triggers */ - RTE_RESULT /* RTE represents an empty FROM clause; such + RTE_RESULT, /* RTE represents an empty FROM clause; such * RTEs are added by the planner, they're not * present during parsing or rewriting */ } RTEKind; typedef struct RangeTblEntry { - pg_node_attr(custom_read_write, custom_query_jumble) + pg_node_attr(custom_read_write) NodeTag type; - RTEKind rtekind; /* see above */ - /* - * XXX the fields applicable to only some rte kinds should be merged into - * a union. I didn't do this yet because the diffs would impact a lot of - * code that is being actively worked on. FIXME someday. + * Fields valid in all RTEs: + * + * put alias + eref first to make dump more legible */ + /* user-written alias clause, if any */ + Alias *alias pg_node_attr(query_jumble_ignore); + /* expanded reference names */ + Alias *eref pg_node_attr(query_jumble_ignore); + + RTEKind rtekind; /* see above */ /* * Fields valid for a plain relation RTE (else zero): * + * inh is true for relation references that should be expanded to include + * inheritance children, if the rel has any. In the parser, this will + * only be true for RTE_RELATION entries. The planner also uses this + * field to mark RTE_SUBQUERY entries that contain UNION ALL queries that + * it has flattened into pulled-up subqueries (creating a structure much + * like the effects of inheritance). + * * rellockmode is really LOCKMODE, but it's declared int to avoid having * to include lock-related headers here. It must be RowExclusiveLock if * the RTE is an INSERT/UPDATE/DELETE/MERGE target, else RowShareLock if @@ -1069,17 +1091,26 @@ typedef struct RangeTblEntry * relation. This allows plans referencing AFTER trigger transition * tables to be invalidated if the underlying table is altered. */ - Oid relid; /* OID of the relation */ - char relkind; /* relation kind (see pg_class.relkind) */ - int rellockmode; /* lock level that query requires on the rel */ - struct TableSampleClause *tablesample; /* sampling info, or NULL */ - Index perminfoindex; + /* OID of the relation */ + Oid relid; + /* inheritance requested? */ + bool inh; + /* relation kind (see pg_class.relkind) */ + char relkind pg_node_attr(query_jumble_ignore); + /* lock level that query requires on the rel */ + int rellockmode pg_node_attr(query_jumble_ignore); + /* index of RTEPermissionInfo entry, or 0 */ + Index perminfoindex pg_node_attr(query_jumble_ignore); + /* sampling info, or NULL */ + struct TableSampleClause *tablesample; /* * Fields valid for a subquery RTE (else NULL): */ - Query *subquery; /* the sub-query */ - bool security_barrier; /* is from security_barrier view? */ + /* the sub-query */ + Query *subquery; + /* is from security_barrier view? */ + bool security_barrier pg_node_attr(query_jumble_ignore); /* * Fields valid for a join RTE (else NULL/zero): @@ -1124,18 +1155,22 @@ typedef struct RangeTblEntry * merged columns could not be dropped); this is not accounted for in * joinleftcols/joinrighttcols. */ - JoinType jointype; /* type of join */ - int joinmergedcols; /* number of merged (JOIN USING) columns */ - List *joinaliasvars; /* list of alias-var expansions */ - List *joinleftcols; /* left-side input column numbers */ - List *joinrightcols; /* right-side input column numbers */ + JoinType jointype; + /* number of merged (JOIN USING) columns */ + int joinmergedcols pg_node_attr(query_jumble_ignore); + /* list of alias-var expansions */ + List *joinaliasvars pg_node_attr(query_jumble_ignore); + /* left-side input column numbers */ + List *joinleftcols pg_node_attr(query_jumble_ignore); + /* right-side input column numbers */ + List *joinrightcols pg_node_attr(query_jumble_ignore); /* * join_using_alias is an alias clause attached directly to JOIN/USING. It * is different from the alias field (below) in that it does not hide the * range variables of the tables being joined. */ - Alias *join_using_alias; + Alias *join_using_alias pg_node_attr(query_jumble_ignore); /* * Fields valid for a function RTE (else NIL/zero): @@ -1145,8 +1180,10 @@ typedef struct RangeTblEntry * implicit, and must be accounted for "by hand" in places such as * expandRTE(). */ - List *functions; /* list of RangeTblFunction nodes */ - bool funcordinality; /* is this called WITH ORDINALITY? */ + /* list of RangeTblFunction nodes */ + List *functions; + /* is this called WITH ORDINALITY? */ + bool funcordinality; /* * Fields valid for a TableFunc RTE (else NULL): @@ -1156,14 +1193,18 @@ typedef struct RangeTblEntry /* * Fields valid for a values RTE (else NIL): */ - List *values_lists; /* list of expression lists */ + /* list of expression lists */ + List *values_lists; /* * Fields valid for a CTE RTE (else NULL/zero): */ - char *ctename; /* name of the WITH list item */ - Index ctelevelsup; /* number of query levels up */ - bool self_reference; /* is this a recursive self-reference? */ + /* name of the WITH list item */ + char *ctename; + /* number of query levels up */ + Index ctelevelsup; + /* is this a recursive self-reference? */ + bool self_reference pg_node_attr(query_jumble_ignore); /* * Fields valid for CTE, VALUES, ENR, and TableFunc RTEs (else NIL): @@ -1183,25 +1224,30 @@ typedef struct RangeTblEntry * all three lists (as well as an empty-string entry in eref). Testing * for zero coltype is the standard way to detect a dropped column. */ - List *coltypes; /* OID list of column type OIDs */ - List *coltypmods; /* integer list of column typmods */ - List *colcollations; /* OID list of column collation OIDs */ + /* OID list of column type OIDs */ + List *coltypes pg_node_attr(query_jumble_ignore); + /* integer list of column typmods */ + List *coltypmods pg_node_attr(query_jumble_ignore); + /* OID list of column collation OIDs */ + List *colcollations pg_node_attr(query_jumble_ignore); /* * Fields valid for ENR RTEs (else NULL/zero): */ - char *enrname; /* name of ephemeral named relation */ - Cardinality enrtuples; /* estimated or actual from caller */ + /* name of ephemeral named relation */ + char *enrname; + /* estimated or actual from caller */ + Cardinality enrtuples pg_node_attr(query_jumble_ignore); /* * Fields valid in all RTEs: */ - Alias *alias; /* user-written alias clause, if any */ - Alias *eref; /* expanded reference names */ - bool lateral; /* subquery, function, or values is LATERAL? */ - bool inh; /* inheritance requested? */ - bool inFromCl; /* present in FROM clause? */ - List *securityQuals; /* security barrier quals to apply, if any */ + /* was LATERAL specified? */ + bool lateral pg_node_attr(query_jumble_ignore); + /* present in FROM clause? */ + bool inFromCl pg_node_attr(query_jumble_ignore); + /* security barrier quals to apply, if any */ + List *securityQuals pg_node_attr(query_jumble_ignore); } RangeTblEntry; /* @@ -1316,7 +1362,7 @@ typedef enum WCOKind WCO_RLS_UPDATE_CHECK, /* RLS UPDATE WITH CHECK policy */ WCO_RLS_CONFLICT_CHECK, /* RLS ON CONFLICT DO UPDATE USING policy */ WCO_RLS_MERGE_UPDATE_CHECK, /* RLS MERGE UPDATE USING policy */ - WCO_RLS_MERGE_DELETE_CHECK /* RLS MERGE DELETE USING policy */ + WCO_RLS_MERGE_DELETE_CHECK, /* RLS MERGE DELETE USING policy */ } WCOKind; typedef struct WithCheckOption @@ -1454,7 +1500,7 @@ typedef enum GroupingSetKind GROUPING_SET_SIMPLE, GROUPING_SET_ROLLUP, GROUPING_SET_CUBE, - GROUPING_SET_SETS + GROUPING_SET_SETS, } GroupingSetKind; typedef struct GroupingSet @@ -1462,7 +1508,7 @@ typedef struct GroupingSet NodeTag type; GroupingSetKind kind pg_node_attr(query_jumble_ignore); List *content; - int location; + ParseLoc location; } GroupingSet; /* @@ -1473,6 +1519,8 @@ typedef struct GroupingSet * if the clause originally came from WINDOW, and is NULL if it originally * was an OVER clause (but note that we collapse out duplicate OVERs). * partitionClause and orderClause are lists of SortGroupClause structs. + * partitionClause is sanitized by the query planner to remove any columns or + * expressions belonging to redundant PathKeys. * If we have RANGE with offset PRECEDING/FOLLOWING, the semantics of that are * specified by startInRangeFunc/inRangeColl/inRangeAsc/inRangeNullsFirst * for the start offset, or endInRangeFunc/inRange* for the end offset. @@ -1498,8 +1546,6 @@ typedef struct WindowClause int frameOptions; /* frame_clause options, see WindowDef */ Node *startOffset; /* expression for starting bound, if any */ Node *endOffset; /* expression for ending bound, if any */ - /* qual to help short-circuit execution */ - List *runCondition pg_node_attr(query_jumble_ignore); /* in_range function for startOffset */ Oid startInRangeFunc pg_node_attr(query_jumble_ignore); /* in_range function for endOffset */ @@ -1548,7 +1594,7 @@ typedef struct WithClause NodeTag type; List *ctes; /* list of CommonTableExprs */ bool recursive; /* true = WITH RECURSIVE */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } WithClause; /* @@ -1563,7 +1609,7 @@ typedef struct InferClause List *indexElems; /* IndexElems to infer unique index */ Node *whereClause; /* qualification (partial-index predicate) */ char *conname; /* Constraint name, or NULL if unnamed */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } InferClause; /* @@ -1579,7 +1625,7 @@ typedef struct OnConflictClause InferClause *infer; /* Optional index inference clause */ List *targetList; /* the target list (of ResTarget) */ Node *whereClause; /* qualifications */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } OnConflictClause; /* @@ -1591,7 +1637,7 @@ typedef enum CTEMaterialize { CTEMaterializeDefault, /* no option specified */ CTEMaterializeAlways, /* MATERIALIZED */ - CTEMaterializeNever /* NOT MATERIALIZED */ + CTEMaterializeNever, /* NOT MATERIALIZED */ } CTEMaterialize; typedef struct CTESearchClause @@ -1600,7 +1646,7 @@ typedef struct CTESearchClause List *search_col_list; bool search_breadth_first; char *search_seq_column; - int location; + ParseLoc location; } CTESearchClause; typedef struct CTECycleClause @@ -1611,7 +1657,7 @@ typedef struct CTECycleClause Node *cycle_mark_value; Node *cycle_mark_default; char *cycle_path_column; - int location; + ParseLoc location; /* These fields are set during parse analysis: */ Oid cycle_mark_type; /* common type of _value and _default */ int cycle_mark_typmod; @@ -1635,7 +1681,7 @@ typedef struct CommonTableExpr Node *ctequery; /* the CTE's subquery */ CTESearchClause *search_clause pg_node_attr(query_jumble_ignore); CTECycleClause *cycle_clause pg_node_attr(query_jumble_ignore); - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ /* These fields are set during parse analysis: */ /* is this CTE actually recursive? */ bool cterecursive pg_node_attr(query_jumble_ignore); @@ -1671,7 +1717,7 @@ typedef struct CommonTableExpr typedef struct MergeWhenClause { NodeTag type; - bool matched; /* true=MATCHED, false=NOT MATCHED */ + MergeMatchKind matchKind; /* MATCHED/NOT MATCHED BY SOURCE/TARGET */ CmdType commandType; /* INSERT/UPDATE/DELETE/DO NOTHING */ OverridingKind override; /* OVERRIDING clause */ Node *condition; /* WHEN conditions (raw parser) */ @@ -1680,23 +1726,6 @@ typedef struct MergeWhenClause List *values; /* VALUES to INSERT, or NULL */ } MergeWhenClause; -/* - * MergeAction - - * Transformed representation of a WHEN clause in a MERGE statement - */ -typedef struct MergeAction -{ - NodeTag type; - bool matched; /* true=MATCHED, false=NOT MATCHED */ - CmdType commandType; /* INSERT/UPDATE/DELETE/DO NOTHING */ - /* OVERRIDING clause */ - OverridingKind override pg_node_attr(query_jumble_ignore); - Node *qual; /* transformed WHEN conditions */ - List *targetList; /* the target list (of TargetEntry) */ - /* target attribute numbers of an UPDATE */ - List *updateColnos pg_node_attr(query_jumble_ignore); -} MergeAction; - /* * TriggerTransition - * representation of transition row or table naming clause @@ -1726,6 +1755,115 @@ typedef struct JsonOutput JsonReturning *returning; /* RETURNING FORMAT clause and type Oids */ } JsonOutput; +/* + * JsonArgument - + * representation of argument from JSON PASSING clause + */ +typedef struct JsonArgument +{ + NodeTag type; + JsonValueExpr *val; /* argument value expression */ + char *name; /* argument name */ +} JsonArgument; + +/* + * JsonQuotes - + * representation of [KEEP|OMIT] QUOTES clause for JSON_QUERY() + */ +typedef enum JsonQuotes +{ + JS_QUOTES_UNSPEC, /* unspecified */ + JS_QUOTES_KEEP, /* KEEP QUOTES */ + JS_QUOTES_OMIT, /* OMIT QUOTES */ +} JsonQuotes; + +/* + * JsonFuncExpr - + * untransformed representation of function expressions for + * SQL/JSON query functions + */ +typedef struct JsonFuncExpr +{ + NodeTag type; + JsonExprOp op; /* expression type */ + char *column_name; /* JSON_TABLE() column name or NULL if this is + * not for a JSON_TABLE() */ + JsonValueExpr *context_item; /* context item expression */ + Node *pathspec; /* JSON path specification expression */ + List *passing; /* list of PASSING clause arguments, if any */ + JsonOutput *output; /* output clause, if specified */ + JsonBehavior *on_empty; /* ON EMPTY behavior */ + JsonBehavior *on_error; /* ON ERROR behavior */ + JsonWrapper wrapper; /* array wrapper behavior (JSON_QUERY only) */ + JsonQuotes quotes; /* omit or keep quotes? (JSON_QUERY only) */ + ParseLoc location; /* token location, or -1 if unknown */ +} JsonFuncExpr; + +/* + * JsonTablePathSpec + * untransformed specification of JSON path expression with an optional + * name + */ +typedef struct JsonTablePathSpec +{ + NodeTag type; + + Node *string; + char *name; + ParseLoc name_location; + ParseLoc location; /* location of 'string' */ +} JsonTablePathSpec; + +/* + * JsonTable - + * untransformed representation of JSON_TABLE + */ +typedef struct JsonTable +{ + NodeTag type; + JsonValueExpr *context_item; /* context item expression */ + JsonTablePathSpec *pathspec; /* JSON path specification */ + List *passing; /* list of PASSING clause arguments, if any */ + List *columns; /* list of JsonTableColumn */ + JsonBehavior *on_error; /* ON ERROR behavior */ + Alias *alias; /* table alias in FROM clause */ + bool lateral; /* does it have LATERAL prefix? */ + ParseLoc location; /* token location, or -1 if unknown */ +} JsonTable; + +/* + * JsonTableColumnType - + * enumeration of JSON_TABLE column types + */ +typedef enum JsonTableColumnType +{ + JTC_FOR_ORDINALITY, + JTC_REGULAR, + JTC_EXISTS, + JTC_FORMATTED, + JTC_NESTED, +} JsonTableColumnType; + +/* + * JsonTableColumn - + * untransformed representation of JSON_TABLE column + */ +typedef struct JsonTableColumn +{ + NodeTag type; + JsonTableColumnType coltype; /* column type */ + char *name; /* column name */ + TypeName *typeName; /* column type name */ + JsonTablePathSpec *pathspec; /* JSON path specification */ + JsonFormat *format; /* JSON format clause, if specified */ + JsonWrapper wrapper; /* WRAPPER behavior for formatted columns */ + JsonQuotes quotes; /* omit or keep quotes on scalar strings? */ + List *columns; /* nested columns */ + JsonBehavior *on_empty; /* ON EMPTY behavior */ + JsonBehavior *on_error; /* ON ERROR behavior */ + ParseLoc location; /* token location, or -1 if unknown */ +} JsonTableColumn; + /* * JsonKeyValue - * untransformed representation of JSON object key-value pair for @@ -1738,6 +1876,43 @@ typedef struct JsonKeyValue JsonValueExpr *value; /* JSON value expression */ } JsonKeyValue; +/* + * JsonParseExpr - + * untransformed representation of JSON() + */ +typedef struct JsonParseExpr +{ + NodeTag type; + JsonValueExpr *expr; /* string expression */ + JsonOutput *output; /* RETURNING clause, if specified */ + bool unique_keys; /* WITH UNIQUE KEYS? */ + ParseLoc location; /* token location, or -1 if unknown */ +} JsonParseExpr; + +/* + * JsonScalarExpr - + * untransformed representation of JSON_SCALAR() + */ +typedef struct JsonScalarExpr +{ + NodeTag type; + Expr *expr; /* scalar expression */ + JsonOutput *output; /* RETURNING clause, if specified */ + ParseLoc location; /* token location, or -1 if unknown */ +} JsonScalarExpr; + +/* + * JsonSerializeExpr - + * untransformed representation of JSON_SERIALIZE() function + */ +typedef struct JsonSerializeExpr +{ + NodeTag type; + JsonValueExpr *expr; /* json value expression */ + JsonOutput *output; /* RETURNING clause, if specified */ + ParseLoc location; /* token location, or -1 if unknown */ +} JsonSerializeExpr; + /* * JsonObjectConstructor - * untransformed representation of JSON_OBJECT() constructor @@ -1749,7 +1924,7 @@ typedef struct JsonObjectConstructor JsonOutput *output; /* RETURNING clause, if specified */ bool absent_on_null; /* skip NULL values? */ bool unique; /* check key uniqueness? */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } JsonObjectConstructor; /* @@ -1762,7 +1937,7 @@ typedef struct JsonArrayConstructor List *exprs; /* list of JsonValueExpr elements */ JsonOutput *output; /* RETURNING clause, if specified */ bool absent_on_null; /* skip NULL elements? */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } JsonArrayConstructor; /* @@ -1776,7 +1951,7 @@ typedef struct JsonArrayQueryConstructor JsonOutput *output; /* RETURNING clause, if specified */ JsonFormat *format; /* FORMAT clause for subquery, if specified */ bool absent_on_null; /* skip NULL elements? */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } JsonArrayQueryConstructor; /* @@ -1791,7 +1966,7 @@ typedef struct JsonAggConstructor Node *agg_filter; /* FILTER clause, if any */ List *agg_order; /* ORDER BY clause, if any */ struct WindowDef *over; /* OVER clause, if any */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } JsonAggConstructor; /* @@ -1845,8 +2020,8 @@ typedef struct RawStmt NodeTag type; Node *stmt; /* raw parse tree */ - int stmt_location; /* start location, or -1 if unknown */ - int stmt_len; /* length in bytes; 0 means "rest of string" */ + ParseLoc stmt_location; /* start location, or -1 if unknown */ + ParseLoc stmt_len; /* length in bytes; 0 means "rest of string" */ } RawStmt; /***************************************************************************** @@ -1913,6 +2088,7 @@ typedef struct MergeStmt Node *sourceRelation; /* source relation */ Node *joinCondition; /* join condition between source and target */ List *mergeWhenClauses; /* list of MergeWhenClause(es) */ + List *returningList; /* list of expressions to return */ WithClause *withClause; /* WITH clause */ } MergeStmt; @@ -1934,7 +2110,7 @@ typedef enum SetOperation SETOP_NONE = 0, SETOP_UNION, SETOP_INTERSECT, - SETOP_EXCEPT + SETOP_EXCEPT, } SetOperation; typedef struct SelectStmt @@ -2053,7 +2229,7 @@ typedef struct PLAssignStmt List *indirection; /* subscripts and field names, if any */ int nnames; /* number of names to use in ColumnRef */ SelectStmt *val; /* the PL/pgSQL expression to assign */ - int location; /* name's token location, or -1 if unknown */ + ParseLoc location; /* name's token location, or -1 if unknown */ } PLAssignStmt; @@ -2130,7 +2306,7 @@ typedef enum ObjectType OBJECT_TSTEMPLATE, OBJECT_TYPE, OBJECT_USER_MAPPING, - OBJECT_VIEW + OBJECT_VIEW, } ObjectType; /* ---------------------- @@ -2153,7 +2329,7 @@ typedef struct CreateSchemaStmt typedef enum DropBehavior { DROP_RESTRICT, /* drop fails if any dependent objects */ - DROP_CASCADE /* remove dependent objects too */ + DROP_CASCADE, /* remove dependent objects too */ } DropBehavior; /* ---------------------- @@ -2177,6 +2353,7 @@ typedef enum AlterTableType AT_CookedColumnDefault, /* add a pre-cooked column default */ AT_DropNotNull, /* alter column drop not null */ AT_SetNotNull, /* alter column set not null */ + AT_SetExpression, /* alter column set expression */ AT_DropExpression, /* alter column drop expression */ AT_CheckNotNull, /* check column is already marked not null */ AT_SetStatistics, /* alter column set statistics */ @@ -2236,7 +2413,7 @@ typedef enum AlterTableType AT_AddIdentity, /* ADD IDENTITY */ AT_SetIdentity, /* SET identity column options */ AT_DropIdentity, /* DROP IDENTITY */ - AT_ReAddStatistics /* internal to commands/tablecmds.c */ + AT_ReAddStatistics, /* internal to commands/tablecmds.c */ } AlterTableType; typedef struct ReplicaIdentityStmt @@ -2251,7 +2428,7 @@ typedef struct AlterTableCmd /* one subcommand of an ALTER TABLE */ NodeTag type; AlterTableType subtype; /* Type of table alteration to apply */ char *name; /* column, constraint, or trigger to act on, - * or tablespace */ + * or tablespace, access method */ int16 num; /* attribute number for columns referenced by * number */ RoleSpec *newowner; @@ -2308,7 +2485,7 @@ typedef enum GrantTargetType { ACL_TARGET_OBJECT, /* grant on specific named object(s) */ ACL_TARGET_ALL_IN_SCHEMA, /* grant on all objects in given schema(s) */ - ACL_TARGET_DEFAULTS /* ALTER DEFAULT PRIVILEGES */ + ACL_TARGET_DEFAULTS, /* ALTER DEFAULT PRIVILEGES */ } GrantTargetType; typedef struct GrantStmt @@ -2435,7 +2612,7 @@ typedef enum VariableSetKind VAR_SET_CURRENT, /* SET var FROM CURRENT */ VAR_SET_MULTI, /* special case for SET TRANSACTION ... */ VAR_RESET, /* RESET var */ - VAR_RESET_ALL /* RESET ALL */ + VAR_RESET_ALL, /* RESET ALL */ } VariableSetKind; typedef struct VariableSetStmt @@ -2533,7 +2710,7 @@ typedef enum ConstrType /* types of constraints */ CONSTR_ATTR_DEFERRABLE, /* attributes for previous constraint node */ CONSTR_ATTR_NOT_DEFERRABLE, CONSTR_ATTR_DEFERRED, - CONSTR_ATTR_IMMEDIATE + CONSTR_ATTR_IMMEDIATE, } ConstrType; /* Foreign key action codes */ @@ -2550,40 +2727,33 @@ typedef enum ConstrType /* types of constraints */ typedef struct Constraint { - pg_node_attr(custom_read_write) - NodeTag type; ConstrType contype; /* see above */ - - /* Fields used for most/all constraint types: */ char *conname; /* Constraint name, or NULL if unnamed */ bool deferrable; /* DEFERRABLE? */ bool initdeferred; /* INITIALLY DEFERRED? */ - int location; /* token location, or -1 if unknown */ - - /* Fields used for constraints with expressions (CHECK and DEFAULT): */ + bool skip_validation; /* skip validation of existing rows? */ + bool initially_valid; /* mark the new constraint as valid? */ bool is_no_inherit; /* is constraint non-inheritable? */ - Node *raw_expr; /* expr, as untransformed parse tree */ - char *cooked_expr; /* expr, as nodeToString representation */ + Node *raw_expr; /* CHECK or DEFAULT expression, as + * untransformed parse tree */ + char *cooked_expr; /* CHECK or DEFAULT expression, as + * nodeToString representation */ char generated_when; /* ALWAYS or BY DEFAULT */ - - /* Fields used for unique constraints (UNIQUE and PRIMARY KEY): */ + int inhcount; /* initial inheritance count to apply, for + * "raw" NOT NULL constraints */ bool nulls_not_distinct; /* null treatment for UNIQUE constraints */ List *keys; /* String nodes naming referenced key - * column(s) */ + * column(s); for UNIQUE/PK/NOT NULL */ List *including; /* String nodes naming referenced nonkey - * column(s) */ - - /* Fields used for EXCLUSION constraints: */ - List *exclusions; /* list of (IndexElem, operator name) pairs */ - - /* Fields used for index constraints (UNIQUE, PRIMARY KEY, EXCLUSION): */ + * column(s); for UNIQUE/PK */ + List *exclusions; /* list of (IndexElem, operator name) pairs; + * for exclusion constraints */ List *options; /* options from WITH clause */ char *indexname; /* existing index to use; otherwise NULL */ char *indexspace; /* index tablespace; NULL for default */ bool reset_default_tblspc; /* reset default_tablespace prior to * creating the index */ - /* These could be, but currently are not, used for UNIQUE/PKEY: */ char *access_method; /* index access method; NULL for default */ Node *where_clause; /* partial index predicate */ @@ -2599,9 +2769,7 @@ typedef struct Constraint Oid old_pktable_oid; /* pg_constraint.confrelid of my former * self */ - /* Fields used for constraints that allow a NOT VALID specification */ - bool skip_validation; /* skip validation of existing rows? */ - bool initially_valid; /* mark the new constraint as valid? */ + ParseLoc location; /* token location, or -1 if unknown */ } Constraint; /* ---------------------- @@ -2770,7 +2938,7 @@ typedef enum ImportForeignSchemaType { FDW_IMPORT_SCHEMA_ALL, /* all relations wanted */ FDW_IMPORT_SCHEMA_LIMIT_TO, /* include only listed tables in import */ - FDW_IMPORT_SCHEMA_EXCEPT /* exclude listed tables from import */ + FDW_IMPORT_SCHEMA_EXCEPT, /* exclude listed tables from import */ } ImportForeignSchemaType; typedef struct ImportForeignSchemaStmt @@ -2907,7 +3075,7 @@ typedef enum RoleStmtType { ROLESTMT_ROLE, ROLESTMT_USER, - ROLESTMT_GROUP + ROLESTMT_GROUP, } RoleStmtType; typedef struct CreateRoleStmt @@ -3152,7 +3320,7 @@ typedef enum FetchDirection FETCH_BACKWARD, /* for these, howMany indicates a position; only one row is fetched */ FETCH_ABSOLUTE, - FETCH_RELATIVE + FETCH_RELATIVE, } FetchDirection; #define FETCH_ALL LONG_MAX @@ -3248,7 +3416,7 @@ typedef struct AlterStatsStmt { NodeTag type; List *defnames; /* qualified name (list of String) */ - int stxstattarget; /* statistics target */ + Node *stxstattarget; /* statistics target */ bool missing_ok; /* skip error if statistics object is missing */ } AlterStatsStmt; @@ -3277,7 +3445,7 @@ typedef enum FunctionParameterMode FUNC_PARAM_VARIADIC = 'v', /* variadic (always input) */ FUNC_PARAM_TABLE = 't', /* table function output column */ /* this is not used in pg_proc: */ - FUNC_PARAM_DEFAULT = 'd' /* default; effectively same as IN */ + FUNC_PARAM_DEFAULT = 'd', /* default; effectively same as IN */ } FunctionParameterMode; typedef struct FunctionParameter @@ -3334,11 +3502,12 @@ typedef struct InlineCodeBlock typedef struct CallStmt { NodeTag type; - FuncCall *funccall; /* from the parser */ + /* from the parser */ + FuncCall *funccall pg_node_attr(query_jumble_ignore); /* transformed call, with only input args */ - FuncExpr *funcexpr pg_node_attr(query_jumble_ignore); + FuncExpr *funcexpr; /* transformed output-argument expressions */ - List *outargs pg_node_attr(query_jumble_ignore); + List *outargs; } CallStmt; typedef struct CallContext @@ -3492,7 +3661,7 @@ typedef enum TransactionStmtKind TRANS_STMT_ROLLBACK_TO, TRANS_STMT_PREPARE, TRANS_STMT_COMMIT_PREPARED, - TRANS_STMT_ROLLBACK_PREPARED + TRANS_STMT_ROLLBACK_PREPARED, } TransactionStmtKind; typedef struct TransactionStmt @@ -3500,9 +3669,13 @@ typedef struct TransactionStmt NodeTag type; TransactionStmtKind kind; /* see above */ List *options; /* for BEGIN/START commands */ - char *savepoint_name; /* for savepoint commands */ - char *gid; /* for two-phase-commit related commands */ + /* for savepoint commands */ + char *savepoint_name pg_node_attr(query_jumble_ignore); + /* for two-phase-commit related commands */ + char *gid pg_node_attr(query_jumble_ignore); bool chain; /* AND CHAIN option */ + /* token location, or -1 if unknown */ + ParseLoc location pg_node_attr(query_jumble_location); } TransactionStmt; /* ---------------------- @@ -3561,7 +3734,7 @@ typedef enum ViewCheckOption { NO_CHECK_OPTION, LOCAL_CHECK_OPTION, - CASCADED_CHECK_OPTION + CASCADED_CHECK_OPTION, } ViewCheckOption; typedef struct ViewStmt @@ -3753,7 +3926,7 @@ typedef enum DiscardMode DISCARD_ALL, DISCARD_PLANS, DISCARD_SEQUENCES, - DISCARD_TEMP + DISCARD_TEMP, } DiscardMode; typedef struct DiscardStmt @@ -3795,7 +3968,7 @@ typedef enum ReindexObjectType REINDEX_OBJECT_TABLE, /* table or materialized view */ REINDEX_OBJECT_SCHEMA, /* schema */ REINDEX_OBJECT_SYSTEM, /* system catalogs */ - REINDEX_OBJECT_DATABASE /* database */ + REINDEX_OBJECT_DATABASE, /* database */ } ReindexObjectType; typedef struct ReindexStmt @@ -3883,8 +4056,17 @@ typedef struct ExecuteStmt typedef struct DeallocateStmt { NodeTag type; - char *name; /* The name of the plan to remove */ - /* NULL means DEALLOCATE ALL */ + /* The name of the plan to remove, NULL if DEALLOCATE ALL */ + char *name pg_node_attr(query_jumble_ignore); + + /* + * True if DEALLOCATE ALL. This is redundant with "name == NULL", but we + * make it a separate field so that exactly this condition (and not the + * precise name) will be accounted for in query jumbling. + */ + bool isall; + /* token location, or -1 if unknown */ + ParseLoc location pg_node_attr(query_jumble_location); } DeallocateStmt; /* @@ -3926,7 +4108,7 @@ typedef enum AlterTSConfigType ALTER_TSCONFIG_ALTER_MAPPING_FOR_TOKEN, ALTER_TSCONFIG_REPLACE_DICT, ALTER_TSCONFIG_REPLACE_DICT_FOR_TOKEN, - ALTER_TSCONFIG_DROP_MAPPING + ALTER_TSCONFIG_DROP_MAPPING, } AlterTSConfigType; typedef struct AlterTSConfigurationStmt @@ -3963,7 +4145,7 @@ typedef enum PublicationObjSpecType PUBLICATIONOBJ_TABLES_IN_SCHEMA, /* All tables in schema */ PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA, /* All tables in first element of * search_path */ - PUBLICATIONOBJ_CONTINUATION /* Continuation of previous type */ + PUBLICATIONOBJ_CONTINUATION, /* Continuation of previous type */ } PublicationObjSpecType; typedef struct PublicationObjSpec @@ -3972,7 +4154,7 @@ typedef struct PublicationObjSpec PublicationObjSpecType pubobjtype; /* type of this publication object */ char *name; PublicationTable *pubtable; - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } PublicationObjSpec; typedef struct CreatePublicationStmt @@ -3988,7 +4170,7 @@ typedef enum AlterPublicationAction { AP_AddObjects, /* add objects to publication */ AP_DropObjects, /* remove objects from publication */ - AP_SetObjects /* set list of objects */ + AP_SetObjects, /* set list of objects */ } AlterPublicationAction; typedef struct AlterPublicationStmt @@ -4027,7 +4209,7 @@ typedef enum AlterSubscriptionType ALTER_SUBSCRIPTION_DROP_PUBLICATION, ALTER_SUBSCRIPTION_REFRESH, ALTER_SUBSCRIPTION_ENABLED, - ALTER_SUBSCRIPTION_SKIP + ALTER_SUBSCRIPTION_SKIP, } AlterSubscriptionType; typedef struct AlterSubscriptionStmt diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h index c17b53f7adbd5..576f1c7e9b911 100644 --- a/src/include/nodes/pathnodes.h +++ b/src/include/nodes/pathnodes.h @@ -6,7 +6,7 @@ * We don't support copying RelOptInfo, IndexOptInfo, or Path nodes. * There are some subsidiary structs that are useful to copy, though. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/pathnodes.h @@ -76,7 +76,7 @@ typedef enum UpperRelationKind UPPERREL_PARTIAL_DISTINCT, /* result of partial "SELECT DISTINCT", if any */ UPPERREL_DISTINCT, /* result of "SELECT DISTINCT", if any */ UPPERREL_ORDERED, /* result of ORDER BY, if any */ - UPPERREL_FINAL /* result of any remaining top-level actions */ + UPPERREL_FINAL, /* result of any remaining top-level actions */ /* NB: UPPERREL_FINAL must be last enum entry; it's used to size arrays */ } UpperRelationKind; @@ -104,6 +104,9 @@ typedef struct PlannerGlobal /* Plans for SubPlan nodes */ List *subplans; + /* Paths from which the SubPlan Plans were made */ + List *subpaths; + /* PlannerInfos for SubPlan nodes */ List *subroots pg_node_attr(read_write_ignore); @@ -397,6 +400,8 @@ struct PlannerInfo List *distinct_pathkeys; /* sortClause pathkeys, if any */ List *sort_pathkeys; + /* set operator pathkeys, if any */ + List *setop_pathkeys; /* Canonicalised partition schemes used in the query. */ List *part_schemes pg_node_attr(read_write_ignore); @@ -421,7 +426,11 @@ struct PlannerInfo * items to be proven redundant, implying that there is only one group * containing all the query's rows. Hence, if you want to check whether * GROUP BY was specified, test for nonempty parse->groupClause, not for - * nonempty processed_groupClause. + * nonempty processed_groupClause. Optimizer chooses specific order of + * group-by clauses during the upper paths generation process, attempting + * to use different strategies to minimize number of sorts or engage + * incremental sort. See preprocess_groupclause() and + * get_useful_group_keys_orderings() for details. * * Currently, when grouping sets are specified we do not attempt to * optimize the groupClause, so that processed_groupClause will be @@ -814,7 +823,7 @@ typedef enum RelOptKind RELOPT_OTHER_MEMBER_REL, RELOPT_OTHER_JOINREL, RELOPT_UPPER_REL, - RELOPT_OTHER_UPPER_REL + RELOPT_OTHER_UPPER_REL, } RelOptKind; /* @@ -913,6 +922,12 @@ typedef struct RelOptInfo Relids *attr_needed pg_node_attr(read_write_ignore); /* array indexed [min_attr .. max_attr] */ int32 *attr_widths pg_node_attr(read_write_ignore); + + /* + * Zero-based set containing attnums of NOT NULL columns. Not populated + * for rels corresponding to non-partitioned inh==true RTEs. + */ + Bitmapset *notnullattnums; /* relids of outer joins that can null this baserel */ Relids nulling_relids; /* LATERAL Vars and PHVs referenced by rel */ @@ -1086,6 +1101,8 @@ typedef struct IndexOptInfo IndexOptInfo; #define HAVE_INDEXOPTINFO_TYPEDEF 1 #endif +struct IndexPath; /* forward declaration */ + struct IndexOptInfo { pg_node_attr(no_copy_equal, no_read, no_query_jumble) @@ -1185,7 +1202,7 @@ struct IndexOptInfo bool amcanmarkpos; /* AM's cost estimator */ /* Rather than include amapi.h here, we declare amcostestimate like this */ - void (*amcostestimate) () pg_node_attr(read_write_ignore); + void (*amcostestimate) (struct PlannerInfo *, struct IndexPath *, double, Cost *, Cost *, Selectivity *, double *, double *) pg_node_attr(read_write_ignore); }; /* @@ -1456,6 +1473,23 @@ typedef struct PathKey bool pk_nulls_first; /* do NULLs come before normal values? */ } PathKey; +/* + * Contains an order of group-by clauses and the corresponding list of + * pathkeys. + * + * The elements of 'clauses' list should have the same order as the head of + * 'pathkeys' list. The tleSortGroupRef of the clause should be equal to + * ec_sortref of the pathkey equivalence class. If there are redundant + * clauses with the same tleSortGroupRef, they must be grouped together. + */ +typedef struct GroupByOrdering +{ + NodeTag type; + + List *pathkeys; + List *clauses; +} GroupByOrdering; + /* * VolatileFunctionStatus -- allows nodes to cache their * contain_volatile_functions properties. VOLATILITY_UNKNOWN means not yet @@ -1465,7 +1499,7 @@ typedef enum VolatileFunctionStatus { VOLATILITY_UNKNOWN = 0, VOLATILITY_VOLATILE, - VOLATILITY_NOVOLATILE + VOLATILITY_NOVOLATILE, } VolatileFunctionStatus; /* @@ -1822,6 +1856,10 @@ typedef struct SubqueryScanPath * ForeignPath represents a potential scan of a foreign table, foreign join * or foreign upper-relation. * + * In the case of a foreign join, fdw_restrictinfo stores the RestrictInfos to + * apply to the join, which are used by createplan.c to get pseudoconstant + * clauses evaluated as one-time quals in a gating Result plan node. + * * fdw_private stores FDW private data about the scan. While fdw_private is * not actually touched by the core code during normal operations, it's * generally a good idea to use a representation that can be dumped by @@ -1832,19 +1870,27 @@ typedef struct ForeignPath { Path path; Path *fdw_outerpath; + List *fdw_restrictinfo; List *fdw_private; } ForeignPath; /* - * CustomPath represents a table scan done by some out-of-core extension. + * CustomPath represents a table scan or a table join done by some out-of-core + * extension. * * We provide a set of hooks here - which the provider must take care to set * up correctly - to allow extensions to supply their own methods of scanning - * a relation. For example, a provider might provide GPU acceleration, a - * cache-based scan, or some other kind of logic we haven't dreamed up yet. + * a relation or join relations. For example, a provider might provide GPU + * acceleration, a cache-based scan, or some other kind of logic we haven't + * dreamed up yet. * - * CustomPaths can be injected into the planning process for a relation by - * set_rel_pathlist_hook functions. + * CustomPaths can be injected into the planning process for a base or join + * relation by set_rel_pathlist_hook or set_join_pathlist_hook functions, + * respectively. + * + * In the case of a table join, custom_restrictinfo stores the RestrictInfos + * to apply to the join, which are used by createplan.c to get pseudoconstant + * clauses evaluated as one-time quals in a gating Result plan node. * * Core code must avoid assuming that the CustomPath is only as large as * the structure declared here; providers are allowed to make it the first @@ -1862,6 +1908,7 @@ typedef struct CustomPath uint32 flags; /* mask of CUSTOMPATH_* flags, see * nodes/extensible.h */ List *custom_paths; /* list of child Path nodes, if any */ + List *custom_restrictinfo; List *custom_private; const struct CustomPathMethods *methods; } CustomPath; @@ -1974,7 +2021,7 @@ typedef enum UniquePathMethod { UNIQUE_PATH_NOOP, /* input is known unique already */ UNIQUE_PATH_HASH, /* use hashing */ - UNIQUE_PATH_SORT /* use sorting */ + UNIQUE_PATH_SORT, /* use sorting */ } UniquePathMethod; typedef struct UniquePath @@ -2274,6 +2321,7 @@ typedef struct WindowAggPath Path *subpath; /* path representing input source */ WindowClause *winclause; /* WindowClause we'll be using */ List *qual; /* lower-level WindowAgg runconditions */ + List *runCondition; /* OpExpr List to short-circuit execution */ bool topwindow; /* false for all apart from the WindowAgg * that's closest to the root of the plan */ } WindowAggPath; @@ -2331,7 +2379,7 @@ typedef struct ModifyTablePath CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */ bool canSetTag; /* do we set the command tag/es_processed? */ Index nominalRelation; /* Parent RT index for use of EXPLAIN */ - Index rootRelation; /* Root RT index, if target is partitioned */ + Index rootRelation; /* Root RT index, if partitioned/inherited */ bool partColsUpdated; /* some part key in hierarchy updated? */ List *resultRelations; /* integer list of RT indexes */ List *updateColnosLists; /* per-target-table update_colnos lists */ @@ -2342,6 +2390,8 @@ typedef struct ModifyTablePath int epqParam; /* ID of Param for EvalPlanQual re-eval */ List *mergeActionLists; /* per-target-table lists of actions for * MERGE */ + List *mergeJoinConditions; /* per-target-table join conditions + * for MERGE */ } ModifyTablePath; /* @@ -2575,7 +2625,10 @@ typedef struct RestrictInfo * 2. If we manufacture a commuted version of a qual to use as an index * condition, it copies the original's rinfo_serial, since it is in * practice the same condition. - * 3. RestrictInfos made for a child relation copy their parent's + * 3. If we reduce a qual to constant-FALSE, the new constant-FALSE qual + * copies the original's rinfo_serial, since it is in practice the same + * condition. + * 4. RestrictInfos made for a child relation copy their parent's * rinfo_serial. Likewise, when an EquivalenceClass makes a derived * equality clause for a child relation, it copies the rinfo_serial of * the matching equality clause for the parent. This allows detection @@ -2826,6 +2879,9 @@ typedef struct PlaceHolderVar * cost estimation purposes it is sometimes useful to know the join size under * plain innerjoin semantics. Note that lhs_strict and the semi_xxx fields * are not set meaningfully within such structs. + * + * We also create transient SpecialJoinInfos for child joins during + * partitionwise join planning, which are also not present in join_info_list. */ #ifndef HAVE_SPECIALJOININFO_TYPEDEF typedef struct SpecialJoinInfo SpecialJoinInfo; @@ -3215,7 +3271,7 @@ typedef enum { PARTITIONWISE_AGGREGATE_NONE, PARTITIONWISE_AGGREGATE_FULL, - PARTITIONWISE_AGGREGATE_PARTIAL + PARTITIONWISE_AGGREGATE_PARTIAL, } PartitionwiseAggregateType; /* diff --git a/src/include/nodes/pg_list.h b/src/include/nodes/pg_list.h index 529a382d284c3..d131350e10746 100644 --- a/src/include/nodes/pg_list.h +++ b/src/include/nodes/pg_list.h @@ -29,7 +29,7 @@ * always be so; be careful to use the appropriate list type for your data.) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/pg_list.h @@ -381,26 +381,26 @@ lnext(const List *l, const ListCell *c) /* * foreach_delete_current - * delete the current list element from the List associated with a - * surrounding foreach() loop, returning the new List pointer. + * surrounding foreach() or foreach_*() loop, returning the new List + * pointer; pass the name of the iterator variable. * - * This is equivalent to list_delete_cell(), but it also adjusts the foreach - * loop's state so that no list elements will be missed. Do not delete - * elements from an active foreach loop's list in any other way! + * This is similar to list_delete_cell(), but it also adjusts the loop's state + * so that no list elements will be missed. Do not delete elements from an + * active foreach or foreach_* loop's list in any other way! */ -#define foreach_delete_current(lst, cell) \ - (cell##__state.i--, \ - (List *) (cell##__state.l = list_delete_cell(lst, cell))) +#define foreach_delete_current(lst, var_or_cell) \ + ((List *) (var_or_cell##__state.l = list_delete_nth_cell(lst, var_or_cell##__state.i--))) /* * foreach_current_index - - * get the zero-based list index of a surrounding foreach() loop's - * current element; pass the name of the "ListCell *" iterator variable. + * get the zero-based list index of a surrounding foreach() or foreach_*() + * loop's current element; pass the name of the iterator variable. * * Beware of using this after foreach_delete_current(); the value will be * out of sync for the rest of the current loop iteration. Anyway, since * you just deleted the current element, the value is pretty meaningless. */ -#define foreach_current_index(cell) (cell##__state.i) +#define foreach_current_index(var_or_cell) (var_or_cell##__state.i) /* * for_each_from - @@ -452,6 +452,57 @@ for_each_cell_setup(const List *lst, const ListCell *initcell) return r; } +/* + * Convenience macros that loop through a list without needing a separate + * "ListCell *" variable. Instead, the macros declare a locally-scoped loop + * variable with the provided name and the appropriate type. + * + * Since the variable is scoped to the loop, it's not possible to detect an + * early break by checking its value after the loop completes, as is common + * practice. If you need to do this, you can either use foreach() instead or + * manually track early breaks with a separate variable declared outside of the + * loop. + * + * Note that the caveats described in the comment above the foreach() macro + * also apply to these convenience macros. + */ +#define foreach_ptr(type, var, lst) foreach_internal(type, *, var, lst, lfirst) +#define foreach_int(var, lst) foreach_internal(int, , var, lst, lfirst_int) +#define foreach_oid(var, lst) foreach_internal(Oid, , var, lst, lfirst_oid) +#define foreach_xid(var, lst) foreach_internal(TransactionId, , var, lst, lfirst_xid) + +/* + * The internal implementation of the above macros. Do not use directly. + * + * This macro actually generates two loops in order to declare two variables of + * different types. The outer loop only iterates once, so we expect optimizing + * compilers will unroll it, thereby optimizing it away. + */ +#define foreach_internal(type, pointer, var, lst, func) \ + for (type pointer var = 0, pointer var##__outerloop = (type pointer) 1; \ + var##__outerloop; \ + var##__outerloop = 0) \ + for (ForEachState var##__state = {(lst), 0}; \ + (var##__state.l != NIL && \ + var##__state.i < var##__state.l->length && \ + (var = (type pointer) func(&var##__state.l->elements[var##__state.i]), true)); \ + var##__state.i++) + +/* + * foreach_node - + * The same as foreach_ptr, but asserts that the element is of the specified + * node type. + */ +#define foreach_node(type, var, lst) \ + for (type * var = 0, *var##__outerloop = (type *) 1; \ + var##__outerloop; \ + var##__outerloop = 0) \ + for (ForEachState var##__state = {(lst), 0}; \ + (var##__state.l != NIL && \ + var##__state.i < var##__state.l->length && \ + (var = lfirst_node(type, &var##__state.l->elements[var##__state.i]), true)); \ + var##__state.i++) + /* * forboth - * a convenience macro for advancing through two linked lists diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h index 1b787fe03184a..1aeeaec95e14c 100644 --- a/src/include/nodes/plannodes.h +++ b/src/include/nodes/plannodes.h @@ -4,7 +4,7 @@ * definitions for query plan nodes * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/plannodes.h @@ -20,7 +20,6 @@ #include "lib/stringinfo.h" #include "nodes/bitmapset.h" #include "nodes/lockoptions.h" -#include "nodes/parsenodes.h" #include "nodes/primnodes.h" @@ -54,9 +53,9 @@ typedef struct PlannedStmt uint64 queryId; /* query identifier (copied from Query) */ - bool hasReturning; /* is it insert|update|delete RETURNING? */ + bool hasReturning; /* is it insert|update|delete|merge RETURNING? */ - bool hasModifyingCTE; /* has insert|update|delete in WITH? */ + bool hasModifyingCTE; /* has insert|update|delete|merge in WITH? */ bool canSetTag; /* do I set the command result tag? */ @@ -96,8 +95,8 @@ typedef struct PlannedStmt Node *utilityStmt; /* non-null if this is utility stmt */ /* statement location in source string (copied from Query) */ - int stmt_location; /* start location, or -1 if unknown */ - int stmt_len; /* length in bytes; 0 means "rest of string" */ + ParseLoc stmt_location; /* start location, or -1 if unknown */ + ParseLoc stmt_len; /* length in bytes; 0 means "rest of string" */ } PlannedStmt; /* macro for fetching the Plan associated with a SubPlan node */ @@ -216,11 +215,12 @@ typedef struct ProjectSet * Apply rows produced by outer plan to result table(s), * by inserting, updating, or deleting. * - * If the originally named target table is a partitioned table, both - * nominalRelation and rootRelation contain the RT index of the partition - * root, which is not otherwise mentioned in the plan. Otherwise rootRelation - * is zero. However, nominalRelation will always be set, as it's the rel that - * EXPLAIN should claim is the INSERT/UPDATE/DELETE/MERGE target. + * If the originally named target table is a partitioned table or inheritance + * tree, both nominalRelation and rootRelation contain the RT index of the + * partition root or appendrel RTE, which is not otherwise mentioned in the + * plan. Otherwise rootRelation is zero. However, nominalRelation will + * always be set, as it's the rel that EXPLAIN should claim is the + * INSERT/UPDATE/DELETE/MERGE target. * * Note that rowMarks and epqParam are presumed to be valid for all the * table(s); they can't contain any info that varies across tables. @@ -232,7 +232,7 @@ typedef struct ModifyTable CmdType operation; /* INSERT, UPDATE, DELETE, or MERGE */ bool canSetTag; /* do we set the command tag/es_processed? */ Index nominalRelation; /* Parent RT index for use of EXPLAIN */ - Index rootRelation; /* Root RT index, if target is partitioned */ + Index rootRelation; /* Root RT index, if partitioned/inherited */ bool partColsUpdated; /* some part key in hierarchy updated? */ List *resultRelations; /* integer list of RT indexes */ List *updateColnosLists; /* per-target-table update_colnos lists */ @@ -251,6 +251,8 @@ typedef struct ModifyTable List *exclRelTlist; /* tlist of the EXCLUDED pseudo relation */ List *mergeActionLists; /* per-target-table lists of actions for * MERGE */ + List *mergeJoinConditions; /* per-target-table join conditions + * for MERGE */ } ModifyTable; struct PartitionPruneInfo; /* forward reference to struct below */ @@ -590,7 +592,7 @@ typedef enum SubqueryScanStatus { SUBQUERY_SCAN_UNKNOWN, SUBQUERY_SCAN_TRIVIAL, - SUBQUERY_SCAN_NONTRIVIAL + SUBQUERY_SCAN_NONTRIVIAL, } SubqueryScanStatus; typedef struct SubqueryScan @@ -1309,7 +1311,7 @@ typedef struct Limit * doing a separate remote query to lock each selected row is usually pretty * unappealing, so early locking remains a credible design choice for FDWs. * - * When doing UPDATE, DELETE, or SELECT FOR UPDATE/SHARE, we have to uniquely + * When doing UPDATE/DELETE/MERGE/SELECT FOR UPDATE/SHARE, we have to uniquely * identify all the source rows, not only those from the target relations, so * that we can perform EvalPlanQual rechecking at need. For plain tables we * can just fetch the TID, much as for a target relation; this case is @@ -1329,7 +1331,7 @@ typedef enum RowMarkType ROW_MARK_SHARE, /* obtain shared tuple lock */ ROW_MARK_KEYSHARE, /* obtain keyshare tuple lock */ ROW_MARK_REFERENCE, /* just fetch the TID, don't lock it */ - ROW_MARK_COPY /* physically copy the row value */ + ROW_MARK_COPY, /* physically copy the row value */ } RowMarkType; #define RowMarkRequiresRowShareLock(marktype) ((marktype) <= ROW_MARK_KEYSHARE) @@ -1338,7 +1340,7 @@ typedef enum RowMarkType * PlanRowMark - * plan-time representation of FOR [KEY] UPDATE/SHARE clauses * - * When doing UPDATE, DELETE, or SELECT FOR UPDATE/SHARE, we create a separate + * When doing UPDATE/DELETE/MERGE/SELECT FOR UPDATE/SHARE, we create a separate * PlanRowMark node for each non-target relation in the query. Relations that * are not specified as FOR UPDATE/SHARE are marked ROW_MARK_REFERENCE (if * regular tables or supported foreign tables) or ROW_MARK_COPY (if not). @@ -1541,7 +1543,7 @@ typedef struct PartitionPruneStepOp typedef enum PartitionPruneCombineOp { PARTPRUNE_COMBINE_UNION, - PARTPRUNE_COMBINE_INTERSECT + PARTPRUNE_COMBINE_INTERSECT, } PartitionPruneCombineOp; typedef struct PartitionPruneStepCombine @@ -1585,7 +1587,7 @@ typedef enum MonotonicFunction MONOTONICFUNC_NONE = 0, MONOTONICFUNC_INCREASING = (1 << 0), MONOTONICFUNC_DECREASING = (1 << 1), - MONOTONICFUNC_BOTH = MONOTONICFUNC_INCREASING | MONOTONICFUNC_DECREASING + MONOTONICFUNC_BOTH = MONOTONICFUNC_INCREASING | MONOTONICFUNC_DECREASING, } MonotonicFunction; #endif /* PLANNODES_H */ diff --git a/src/include/nodes/primnodes.h b/src/include/nodes/primnodes.h index 792a743f72ea1..94f6b85524211 100644 --- a/src/include/nodes/primnodes.h +++ b/src/include/nodes/primnodes.h @@ -7,7 +7,7 @@ * and join trees. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/primnodes.h @@ -22,6 +22,14 @@ #include "nodes/pg_list.h" +typedef enum OverridingKind +{ + OVERRIDING_NOT_SET = 0, + OVERRIDING_USER_VALUE, + OVERRIDING_SYSTEM_VALUE, +} OverridingKind; + + /* ---------------------------------------------------------------- * node definitions * ---------------------------------------------------------------- @@ -49,7 +57,7 @@ typedef enum OnCommitAction ONCOMMIT_NOOP, /* No ON COMMIT clause (do nothing) */ ONCOMMIT_PRESERVE_ROWS, /* ON COMMIT PRESERVE ROWS (do nothing) */ ONCOMMIT_DELETE_ROWS, /* ON COMMIT DELETE ROWS */ - ONCOMMIT_DROP /* ON COMMIT DROP */ + ONCOMMIT_DROP, /* ON COMMIT DROP */ } OnCommitAction; /* @@ -83,11 +91,17 @@ typedef struct RangeVar Alias *alias; /* token location, or -1 if unknown */ - int location; + ParseLoc location; } RangeVar; +typedef enum TableFuncType +{ + TFT_XMLTABLE, + TFT_JSON_TABLE, +} TableFuncType; + /* - * TableFunc - node for a table function, such as XMLTABLE. + * TableFunc - node for a table function, such as XMLTABLE and JSON_TABLE. * * Entries in the ns_names list are either String nodes containing * literal namespace names, or NULL pointers to represent DEFAULT. @@ -95,6 +109,8 @@ typedef struct RangeVar typedef struct TableFunc { NodeTag type; + /* XMLTABLE or JSON_TABLE */ + TableFuncType functype; /* list of namespace URI expressions */ List *ns_uris pg_node_attr(query_jumble_ignore); /* list of namespace names or NULL */ @@ -115,12 +131,18 @@ typedef struct TableFunc List *colexprs; /* list of column default expressions */ List *coldefexprs pg_node_attr(query_jumble_ignore); + /* JSON_TABLE: list of column value expressions */ + List *colvalexprs pg_node_attr(query_jumble_ignore); + /* JSON_TABLE: list of PASSING argument expressions */ + List *passingvalexprs pg_node_attr(query_jumble_ignore); /* nullability flag for each output column */ Bitmapset *notnulls pg_node_attr(query_jumble_ignore); + /* JSON_TABLE plan */ + Node *plan pg_node_attr(query_jumble_ignore); /* counts from 0; -1 if none specified */ int ordinalitycol pg_node_attr(query_jumble_ignore); /* token location, or -1 if unknown */ - int location; + ParseLoc location; } TableFunc; /* @@ -268,7 +290,7 @@ typedef struct Var AttrNumber varattnosyn pg_node_attr(equal_ignore, query_jumble_ignore); /* token location, or -1 if unknown */ - int location; + ParseLoc location; } Var; /* @@ -310,7 +332,7 @@ typedef struct Const * token location, or -1 if unknown. All constants are tracked as * locations in query jumbling, to be marked as parameters. */ - int location pg_node_attr(query_jumble_location); + ParseLoc location pg_node_attr(query_jumble_location); } Const; /* @@ -345,7 +367,7 @@ typedef enum ParamKind PARAM_EXTERN, PARAM_EXEC, PARAM_SUBLINK, - PARAM_MULTIEXPR + PARAM_MULTIEXPR, } ParamKind; typedef struct Param @@ -359,7 +381,7 @@ typedef struct Param /* OID of collation, or InvalidOid if none */ Oid paramcollid pg_node_attr(query_jumble_ignore); /* token location, or -1 if unknown */ - int location; + ParseLoc location; } Param; /* @@ -482,7 +504,7 @@ typedef struct Aggref int aggtransno pg_node_attr(query_jumble_ignore); /* token location, or -1 if unknown */ - int location; + ParseLoc location; } Aggref; /* @@ -529,7 +551,7 @@ typedef struct GroupingFunc Index agglevelsup; /* token location */ - int location; + ParseLoc location; } GroupingFunc; /* @@ -553,6 +575,8 @@ typedef struct WindowFunc List *args; /* FILTER expression, if any */ Expr *aggfilter; + /* List of WindowFuncRunConditions to help short-circuit execution */ + List *runCondition pg_node_attr(query_jumble_ignore); /* index of associated WindowClause */ Index winref; /* true if argument list was really '*' */ @@ -560,9 +584,58 @@ typedef struct WindowFunc /* is function a simple aggregate? */ bool winagg pg_node_attr(query_jumble_ignore); /* token location, or -1 if unknown */ - int location; + ParseLoc location; } WindowFunc; +/* + * WindowFuncRunCondition + * + * Represents intermediate OpExprs which will be used by WindowAgg to + * short-circuit execution. + */ +typedef struct WindowFuncRunCondition +{ + Expr xpr; + + /* PG_OPERATOR OID of the operator */ + Oid opno; + /* OID of collation that operator should use */ + Oid inputcollid pg_node_attr(query_jumble_ignore); + + /* + * true of WindowFunc belongs on the left of the resulting OpExpr or false + * if the WindowFunc is on the right. + */ + bool wfunc_left; + + /* + * The Expr being compared to the WindowFunc to use in the OpExpr in the + * WindowAgg's runCondition + */ + Expr *arg; +} WindowFuncRunCondition; + +/* + * MergeSupportFunc + * + * A MergeSupportFunc is a merge support function expression that can only + * appear in the RETURNING list of a MERGE command. It returns information + * about the currently executing merge action. + * + * Currently, the only supported function is MERGE_ACTION(), which returns the + * command executed ("INSERT", "UPDATE", or "DELETE"). + */ +typedef struct MergeSupportFunc +{ + Expr xpr; + /* type Oid of result */ + Oid msftype; + /* OID of collation, or InvalidOid if none */ + Oid msfcollid; + /* token location, or -1 if unknown */ + ParseLoc location; +} MergeSupportFunc; + /* * SubscriptingRef: describes a subscripting operation over a container * (array, etc). @@ -641,7 +714,7 @@ typedef enum CoercionContext COERCION_IMPLICIT, /* coercion in context of expression */ COERCION_ASSIGNMENT, /* coercion in context of assignment */ COERCION_PLPGSQL, /* if no assignment cast, use CoerceViaIO */ - COERCION_EXPLICIT /* explicit cast operation */ + COERCION_EXPLICIT, /* explicit cast operation */ } CoercionContext; /* @@ -661,7 +734,7 @@ typedef enum CoercionForm COERCE_EXPLICIT_CALL, /* display as a function call */ COERCE_EXPLICIT_CAST, /* display as an explicit cast */ COERCE_IMPLICIT_CAST, /* implicit cast, so hide it */ - COERCE_SQL_SYNTAX /* display with SQL-mandated special syntax */ + COERCE_SQL_SYNTAX, /* display with SQL-mandated special syntax */ } CoercionForm; /* @@ -694,7 +767,7 @@ typedef struct FuncExpr /* arguments to the function */ List *args; /* token location, or -1 if unknown */ - int location; + ParseLoc location; } FuncExpr; /* @@ -721,7 +794,7 @@ typedef struct NamedArgExpr /* argument's number in positional notation */ int argnumber; /* argument name location, or -1 if unknown */ - int location; + ParseLoc location; } NamedArgExpr; /* @@ -763,7 +836,7 @@ typedef struct OpExpr List *args; /* token location, or -1 if unknown */ - int location; + ParseLoc location; } OpExpr; /* @@ -843,7 +916,7 @@ typedef struct ScalarArrayOpExpr List *args; /* token location, or -1 if unknown */ - int location; + ParseLoc location; } ScalarArrayOpExpr; /* @@ -865,7 +938,7 @@ typedef struct BoolExpr Expr xpr; BoolExprType boolop; List *args; /* arguments to this expression */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } BoolExpr; /* @@ -928,7 +1001,7 @@ typedef enum SubLinkType EXPR_SUBLINK, MULTIEXPR_SUBLINK, ARRAY_SUBLINK, - CTE_SUBLINK /* for SubPlans only */ + CTE_SUBLINK, /* for SubPlans only */ } SubLinkType; @@ -942,7 +1015,7 @@ typedef struct SubLink List *operName pg_node_attr(query_jumble_ignore); /* subselect as Query* or raw parsetree */ Node *subselect; - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } SubLink; /* @@ -1116,7 +1189,7 @@ typedef struct RelabelType Oid resultcollid pg_node_attr(query_jumble_ignore); /* how to display this node */ CoercionForm relabelformat pg_node_attr(query_jumble_ignore); - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } RelabelType; /* ---------------- @@ -1138,7 +1211,7 @@ typedef struct CoerceViaIO Oid resultcollid pg_node_attr(query_jumble_ignore); /* how to display this node */ CoercionForm coerceformat pg_node_attr(query_jumble_ignore); - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } CoerceViaIO; /* ---------------- @@ -1166,7 +1239,7 @@ typedef struct ArrayCoerceExpr Oid resultcollid pg_node_attr(query_jumble_ignore); /* how to display this node */ CoercionForm coerceformat pg_node_attr(query_jumble_ignore); - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } ArrayCoerceExpr; /* ---------------- @@ -1190,7 +1263,7 @@ typedef struct ConvertRowtypeExpr /* Like RowExpr, we deliberately omit a typmod and collation here */ /* how to display this node */ CoercionForm convertformat pg_node_attr(query_jumble_ignore); - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } ConvertRowtypeExpr; /*---------- @@ -1205,7 +1278,7 @@ typedef struct CollateExpr Expr xpr; Expr *arg; /* input expression */ Oid collOid; /* collation's OID */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } CollateExpr; /*---------- @@ -1240,7 +1313,7 @@ typedef struct CaseExpr Expr *arg; /* implicit equality comparison argument */ List *args; /* the arguments (list of WHEN clauses) */ Expr *defresult; /* the default result (ELSE clause) */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } CaseExpr; /* @@ -1251,7 +1324,7 @@ typedef struct CaseWhen Expr xpr; Expr *expr; /* condition expression */ Expr *result; /* substitution result */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } CaseWhen; /* @@ -1264,6 +1337,8 @@ typedef struct CaseWhen * see build_coercion_expression(). * * Nested FieldStore/SubscriptingRef assignment expressions in INSERT/UPDATE; * see transformAssignmentIndirection(). + * * Placeholder for intermediate results in some SQL/JSON expression nodes, + * such as JsonConstructorExpr. * * The uses in CaseExpr and ArrayCoerceExpr are safe only to the extent that * there is not any other CaseExpr or ArrayCoerceExpr between the value source @@ -1306,7 +1381,7 @@ typedef struct ArrayExpr /* true if elements are sub-arrays */ bool multidims pg_node_attr(query_jumble_ignore); /* token location, or -1 if unknown */ - int location; + ParseLoc location; } ArrayExpr; /* @@ -1357,7 +1432,7 @@ typedef struct RowExpr /* list of String, or NIL */ List *colnames pg_node_attr(query_jumble_ignore); - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } RowExpr; /* @@ -1382,7 +1457,7 @@ typedef enum RowCompareType ROWCOMPARE_EQ = 3, /* BTEqualStrategyNumber */ ROWCOMPARE_GE = 4, /* BTGreaterEqualStrategyNumber */ ROWCOMPARE_GT = 5, /* BTGreaterStrategyNumber */ - ROWCOMPARE_NE = 6 /* no such btree strategy */ + ROWCOMPARE_NE = 6, /* no such btree strategy */ } RowCompareType; typedef struct RowCompareExpr @@ -1416,7 +1491,7 @@ typedef struct CoalesceExpr /* the arguments */ List *args; /* token location, or -1 if unknown */ - int location; + ParseLoc location; } CoalesceExpr; /* @@ -1442,7 +1517,7 @@ typedef struct MinMaxExpr /* the arguments */ List *args; /* token location, or -1 if unknown */ - int location; + ParseLoc location; } MinMaxExpr; /* @@ -1472,7 +1547,7 @@ typedef enum SQLValueFunctionOp SVFOP_USER, SVFOP_SESSION_USER, SVFOP_CURRENT_CATALOG, - SVFOP_CURRENT_SCHEMA + SVFOP_CURRENT_SCHEMA, } SQLValueFunctionOp; typedef struct SQLValueFunction @@ -1486,7 +1561,7 @@ typedef struct SQLValueFunction */ Oid type pg_node_attr(query_jumble_ignore); int32 typmod; - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } SQLValueFunction; /* @@ -1509,13 +1584,13 @@ typedef enum XmlExprOp IS_XMLPI, /* XMLPI(name [, args]) */ IS_XMLROOT, /* XMLROOT(xml, version, standalone) */ IS_XMLSERIALIZE, /* XMLSERIALIZE(is_document, xmlval, indent) */ - IS_DOCUMENT /* xmlval IS DOCUMENT */ + IS_DOCUMENT, /* xmlval IS DOCUMENT */ } XmlExprOp; typedef enum XmlOptionType { XMLOPTION_DOCUMENT, - XMLOPTION_CONTENT + XMLOPTION_CONTENT, } XmlOptionType; typedef struct XmlExpr @@ -1539,7 +1614,7 @@ typedef struct XmlExpr Oid type pg_node_attr(query_jumble_ignore); int32 typmod pg_node_attr(query_jumble_ignore); /* token location, or -1 if unknown */ - int location; + ParseLoc location; } XmlExpr; /* @@ -1562,7 +1637,7 @@ typedef enum JsonFormatType { JS_FORMAT_DEFAULT, /* unspecified */ JS_FORMAT_JSON, /* FORMAT JSON [ENCODING ...] */ - JS_FORMAT_JSONB /* implicit internal format for RETURNING + JS_FORMAT_JSONB, /* implicit internal format for RETURNING * jsonb */ } JsonFormatType; @@ -1575,7 +1650,7 @@ typedef struct JsonFormat NodeTag type; JsonFormatType format_type; /* format type */ JsonEncoding encoding; /* JSON encoding */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } JsonFormat; /* @@ -1593,12 +1668,20 @@ typedef struct JsonReturning /* * JsonValueExpr - * representation of JSON value expression (expr [FORMAT JsonFormat]) + * + * raw_expr is the user-specified value, while formatted_expr is the value + * obtained by coercing raw_expr to the type required by either the FORMAT + * clause or an enclosing node's RETURNING clause. + * + * When deparsing a JsonValueExpr, get_rule_expr() prints raw_expr. However, + * during the evaluation of a JsonValueExpr, the value of formatted_expr + * takes precedence over that of raw_expr. */ typedef struct JsonValueExpr { NodeTag type; - Expr *raw_expr; /* raw expression */ - Expr *formatted_expr; /* formatted expression or NULL */ + Expr *raw_expr; /* user-specified expression */ + Expr *formatted_expr; /* coerced formatted expression */ JsonFormat *format; /* FORMAT clause, if specified */ } JsonValueExpr; @@ -1607,7 +1690,10 @@ typedef enum JsonConstructorType JSCTOR_JSON_OBJECT = 1, JSCTOR_JSON_ARRAY = 2, JSCTOR_JSON_OBJECTAGG = 3, - JSCTOR_JSON_ARRAYAGG = 4 + JSCTOR_JSON_ARRAYAGG = 4, + JSCTOR_JSON_PARSE = 5, + JSCTOR_JSON_SCALAR = 6, + JSCTOR_JSON_SERIALIZE = 7, } JsonConstructorType; /* @@ -1624,7 +1710,7 @@ typedef struct JsonConstructorExpr JsonReturning *returning; /* RETURNING clause */ bool absent_on_null; /* ABSENT ON NULL? */ bool unique; /* WITH UNIQUE KEYS? (JSON_OBJECT[AGG] only) */ - int location; + ParseLoc location; } JsonConstructorExpr; /* @@ -1636,7 +1722,7 @@ typedef enum JsonValueType JS_TYPE_ANY, /* IS JSON [VALUE] */ JS_TYPE_OBJECT, /* IS JSON OBJECT */ JS_TYPE_ARRAY, /* IS JSON ARRAY */ - JS_TYPE_SCALAR /* IS JSON SCALAR */ + JS_TYPE_SCALAR, /* IS JSON SCALAR */ } JsonValueType; /* @@ -1650,9 +1736,198 @@ typedef struct JsonIsPredicate JsonFormat *format; /* FORMAT clause, if specified */ JsonValueType item_type; /* JSON item type */ bool unique_keys; /* check key uniqueness? */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } JsonIsPredicate; +/* Nodes used in SQL/JSON query functions */ + +/* + * JsonWrapper - + * representation of WRAPPER clause for JSON_QUERY() + */ +typedef enum JsonWrapper +{ + JSW_UNSPEC, + JSW_NONE, + JSW_CONDITIONAL, + JSW_UNCONDITIONAL, +} JsonWrapper; + +/* + * JsonBehaviorType - + * enumeration of behavior types used in SQL/JSON ON ERROR/EMPTY clauses + * + * If enum members are reordered, get_json_behavior() from ruleutils.c + * must be updated accordingly. + */ +typedef enum JsonBehaviorType +{ + JSON_BEHAVIOR_NULL = 0, + JSON_BEHAVIOR_ERROR, + JSON_BEHAVIOR_EMPTY, + JSON_BEHAVIOR_TRUE, + JSON_BEHAVIOR_FALSE, + JSON_BEHAVIOR_UNKNOWN, + JSON_BEHAVIOR_EMPTY_ARRAY, + JSON_BEHAVIOR_EMPTY_OBJECT, + JSON_BEHAVIOR_DEFAULT, +} JsonBehaviorType; + +/* + * JsonBehavior + * Specifications for ON ERROR / ON EMPTY behaviors of SQL/JSON + * query functions specified by a JsonExpr + * + * 'expr' is the expression to emit when a given behavior (EMPTY or ERROR) + * occurs on evaluating the SQL/JSON query function. 'coerce' is set to true + * if 'expr' isn't already of the expected target type given by + * JsonExpr.returning. + */ +typedef struct JsonBehavior +{ + NodeTag type; + + JsonBehaviorType btype; + Node *expr; + bool coerce; + ParseLoc location; /* token location, or -1 if unknown */ +} JsonBehavior; + +/* + * JsonExprOp - + * enumeration of SQL/JSON query function types + */ +typedef enum JsonExprOp +{ + JSON_EXISTS_OP, /* JSON_EXISTS() */ + JSON_QUERY_OP, /* JSON_QUERY() */ + JSON_VALUE_OP, /* JSON_VALUE() */ + JSON_TABLE_OP, /* JSON_TABLE() */ +} JsonExprOp; + +/* + * JsonExpr - + * Transformed representation of JSON_VALUE(), JSON_QUERY(), and + * JSON_EXISTS() + */ +typedef struct JsonExpr +{ + Expr xpr; + + JsonExprOp op; + + char *column_name; /* JSON_TABLE() column name or NULL if this is + * not for a JSON_TABLE() */ + + /* jsonb-valued expression to query */ + Node *formatted_expr; + + /* Format of the above expression needed by ruleutils.c */ + JsonFormat *format; + + /* jsonpath-valued expression containing the query pattern */ + Node *path_spec; + + /* Expected type/format of the output. */ + JsonReturning *returning; + + /* Information about the PASSING argument expressions */ + List *passing_names; + List *passing_values; + + /* User-specified or default ON EMPTY and ON ERROR behaviors */ + JsonBehavior *on_empty; + JsonBehavior *on_error; + + /* + * Information about converting the result of jsonpath functions + * JsonPathQuery() and JsonPathValue() to the RETURNING type. + */ + bool use_io_coercion; + bool use_json_coercion; + + /* WRAPPER specification for JSON_QUERY */ + JsonWrapper wrapper; + + /* KEEP or OMIT QUOTES for singleton scalars returned by JSON_QUERY() */ + bool omit_quotes; + + /* JsonExpr's collation. */ + Oid collation; + + /* Original JsonFuncExpr's location */ + ParseLoc location; +} JsonExpr; + +/* + * JsonTablePath + * A JSON path expression to be computed as part of evaluating + * a JSON_TABLE plan node + */ +typedef struct JsonTablePath +{ + NodeTag type; + + Const *value; + char *name; +} JsonTablePath; + +/* + * JsonTablePlan - + * Abstract class to represent different types of JSON_TABLE "plans". + * A plan is used to generate a "row pattern" value by evaluating a JSON + * path expression against an input JSON document, which is then used for + * populating JSON_TABLE() columns + */ +typedef struct JsonTablePlan +{ + pg_node_attr(abstract) + + NodeTag type; +} JsonTablePlan; + +/* + * JSON_TABLE plan to evaluate a JSON path expression and NESTED paths, if + * any. + */ +typedef struct JsonTablePathScan +{ + JsonTablePlan plan; + + /* JSON path to evaluate */ + JsonTablePath *path; + + /* + * ERROR/EMPTY ON ERROR behavior; only significant in the plan for the + * top-level path. + */ + bool errorOnError; + + /* Plan(s) for nested columns, if any. */ + JsonTablePlan *child; + + /* + * 0-based index in TableFunc.colvalexprs of the 1st and the last column + * covered by this plan. Both are -1 if all columns are nested and thus + * computed by the child plan(s). + */ + int colMin; + int colMax; +} JsonTablePathScan; + +/* + * JsonTableSiblingJoin - + * Plan to join rows of sibling NESTED COLUMNS clauses in the same parent + * COLUMNS clause + */ +typedef struct JsonTableSiblingJoin +{ + JsonTablePlan plan; + + JsonTablePlan *lplan; + JsonTablePlan *rplan; +} JsonTableSiblingJoin; + /* ---------------- * NullTest * @@ -1684,7 +1959,7 @@ typedef struct NullTest NullTestType nulltesttype; /* IS NULL, IS NOT NULL */ /* T to perform field-by-field null checks */ bool argisrow pg_node_attr(query_jumble_ignore); - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } NullTest; /* @@ -1706,9 +1981,38 @@ typedef struct BooleanTest Expr xpr; Expr *arg; /* input expression */ BoolTestType booltesttype; /* test type */ - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } BooleanTest; + +/* + * MergeAction + * + * Transformed representation of a WHEN clause in a MERGE statement + */ + +typedef enum MergeMatchKind +{ + MERGE_WHEN_MATCHED, + MERGE_WHEN_NOT_MATCHED_BY_SOURCE, + MERGE_WHEN_NOT_MATCHED_BY_TARGET +} MergeMatchKind; + +#define NUM_MERGE_MATCH_KINDS (MERGE_WHEN_NOT_MATCHED_BY_TARGET + 1) + +typedef struct MergeAction +{ + NodeTag type; + MergeMatchKind matchKind; /* MATCHED/NOT MATCHED BY SOURCE/TARGET */ + CmdType commandType; /* INSERT/UPDATE/DELETE/DO NOTHING */ + /* OVERRIDING clause */ + OverridingKind override pg_node_attr(query_jumble_ignore); + Node *qual; /* transformed WHEN conditions */ + List *targetList; /* the target list (of TargetEntry) */ + /* target attribute numbers of an UPDATE */ + List *updateColnos pg_node_attr(query_jumble_ignore); +} MergeAction; + /* * CoerceToDomain * @@ -1729,7 +2033,7 @@ typedef struct CoerceToDomain Oid resultcollid pg_node_attr(query_jumble_ignore); /* how to display this node */ CoercionForm coercionformat pg_node_attr(query_jumble_ignore); - int location; /* token location, or -1 if unknown */ + ParseLoc location; /* token location, or -1 if unknown */ } CoerceToDomain; /* @@ -1751,7 +2055,7 @@ typedef struct CoerceToDomainValue /* collation for the substituted value */ Oid collation pg_node_attr(query_jumble_ignore); /* token location, or -1 if unknown */ - int location; + ParseLoc location; } CoerceToDomainValue; /* @@ -1771,7 +2075,7 @@ typedef struct SetToDefault /* collation for the substituted value */ Oid collation pg_node_attr(query_jumble_ignore); /* token location, or -1 if unknown */ - int location; + ParseLoc location; } SetToDefault; /* diff --git a/src/include/nodes/print.h b/src/include/nodes/print.h index 3c0473fd4c2a5..333103a4051b0 100644 --- a/src/include/nodes/print.h +++ b/src/include/nodes/print.h @@ -4,7 +4,7 @@ * definitions for nodes/print.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/print.h diff --git a/src/include/nodes/queryjumble.h b/src/include/nodes/queryjumble.h index 7649e095aa572..f1c55c8067f40 100644 --- a/src/include/nodes/queryjumble.h +++ b/src/include/nodes/queryjumble.h @@ -3,7 +3,7 @@ * queryjumble.h * Query normalization and fingerprinting. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -56,7 +56,7 @@ enum ComputeQueryIdType COMPUTE_QUERY_ID_OFF, COMPUTE_QUERY_ID_ON, COMPUTE_QUERY_ID_AUTO, - COMPUTE_QUERY_ID_REGRESS + COMPUTE_QUERY_ID_REGRESS, }; /* GUC parameters */ diff --git a/src/include/nodes/readfuncs.h b/src/include/nodes/readfuncs.h index cba6f0be75a74..8466038ed0677 100644 --- a/src/include/nodes/readfuncs.h +++ b/src/include/nodes/readfuncs.h @@ -4,7 +4,7 @@ * header file for read.c and readfuncs.c. These functions are internal * to the stringToNode interface and should not be used by anyone else. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/readfuncs.h diff --git a/src/include/nodes/replnodes.h b/src/include/nodes/replnodes.h index 4321ba8f866a3..ed23333e9286a 100644 --- a/src/include/nodes/replnodes.h +++ b/src/include/nodes/replnodes.h @@ -4,7 +4,7 @@ * definitions for replication grammar parse nodes * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/replnodes.h @@ -20,7 +20,7 @@ typedef enum ReplicationKind { REPLICATION_KIND_PHYSICAL, - REPLICATION_KIND_LOGICAL + REPLICATION_KIND_LOGICAL, } ReplicationKind; @@ -72,6 +72,18 @@ typedef struct DropReplicationSlotCmd } DropReplicationSlotCmd; +/* ---------------------- + * ALTER_REPLICATION_SLOT command + * ---------------------- + */ +typedef struct AlterReplicationSlotCmd +{ + NodeTag type; + char *slotname; + List *options; +} AlterReplicationSlotCmd; + + /* ---------------------- * START_REPLICATION command * ---------------------- @@ -108,4 +120,13 @@ typedef struct TimeLineHistoryCmd TimeLineID timeline; } TimeLineHistoryCmd; +/* ---------------------- + * UPLOAD_MANIFEST command + * ---------------------- + */ +typedef struct UploadManifestCmd +{ + NodeTag type; +} UploadManifestCmd; + #endif /* REPLNODES_H */ diff --git a/src/include/nodes/subscripting.h b/src/include/nodes/subscripting.h index 02d98f2e47fc2..597209ba42d0e 100644 --- a/src/include/nodes/subscripting.h +++ b/src/include/nodes/subscripting.h @@ -3,7 +3,7 @@ * subscripting.h * API for generic type subscripting * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/subscripting.h diff --git a/src/include/nodes/supportnodes.h b/src/include/nodes/supportnodes.h index 4cfa661d882e5..5f7bcde891c7b 100644 --- a/src/include/nodes/supportnodes.h +++ b/src/include/nodes/supportnodes.h @@ -23,7 +23,7 @@ * allows for future extensions of the set of request cases. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/nodes/supportnodes.h diff --git a/src/include/nodes/tidbitmap.h b/src/include/nodes/tidbitmap.h index b64e36437a066..1945f0639bf15 100644 --- a/src/include/nodes/tidbitmap.h +++ b/src/include/nodes/tidbitmap.h @@ -13,7 +13,7 @@ * fact that a particular page needs to be visited. * * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * src/include/nodes/tidbitmap.h * diff --git a/src/include/nodes/value.h b/src/include/nodes/value.h index b24c4c1afef41..8072cfb33f9bb 100644 --- a/src/include/nodes/value.h +++ b/src/include/nodes/value.h @@ -4,7 +4,7 @@ * interface for value nodes * * - * Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Copyright (c) 2003-2024, PostgreSQL Global Development Group * * src/include/nodes/value.h * diff --git a/src/include/optimizer/appendinfo.h b/src/include/optimizer/appendinfo.h index a05f91f77d005..cc12c9c743da8 100644 --- a/src/include/optimizer/appendinfo.h +++ b/src/include/optimizer/appendinfo.h @@ -4,7 +4,7 @@ * Routines for mapping expressions between append rel parent(s) and * children * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/appendinfo.h diff --git a/src/include/optimizer/clauses.h b/src/include/optimizer/clauses.h index cbe0607e85ac3..34b301e537f52 100644 --- a/src/include/optimizer/clauses.h +++ b/src/include/optimizer/clauses.h @@ -4,7 +4,7 @@ * prototypes for clauses.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/clauses.h diff --git a/src/include/optimizer/cost.h b/src/include/optimizer/cost.h index 6cf49705d3afd..b1c51a4e70ffc 100644 --- a/src/include/optimizer/cost.h +++ b/src/include/optimizer/cost.h @@ -4,7 +4,7 @@ * prototypes for costsize.c and clausesel.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/cost.h @@ -37,7 +37,7 @@ typedef enum { CONSTRAINT_EXCLUSION_OFF, /* do not use c_e */ CONSTRAINT_EXCLUSION_ON, /* apply c_e to all rels */ - CONSTRAINT_EXCLUSION_PARTITION /* apply c_e to otherrels only */ + CONSTRAINT_EXCLUSION_PARTITION, /* apply c_e to otherrels only */ } ConstraintExclusionType; @@ -131,7 +131,7 @@ extern void cost_agg(Path *path, PlannerInfo *root, Cost input_startup_cost, Cost input_total_cost, double input_tuples, double input_width); extern void cost_windowagg(Path *path, PlannerInfo *root, - List *windowFuncs, int numPartCols, int numOrderCols, + List *windowFuncs, WindowClause *winclause, Cost input_startup_cost, Cost input_total_cost, double input_tuples); extern void cost_group(Path *path, PlannerInfo *root, @@ -210,6 +210,7 @@ extern void set_result_size_estimates(PlannerInfo *root, RelOptInfo *rel); extern void set_foreign_size_estimates(PlannerInfo *root, RelOptInfo *rel); extern PathTarget *set_pathtarget_cost_width(PlannerInfo *root, PathTarget *target); extern double compute_bitmap_pages(PlannerInfo *root, RelOptInfo *baserel, - Path *bitmapqual, int loop_count, Cost *cost, double *tuple); + Path *bitmapqual, double loop_count, + Cost *cost_p, double *tuples_p); #endif /* COST_H */ diff --git a/src/include/optimizer/geqo.h b/src/include/optimizer/geqo.h index c7981973bc7a1..c52906d0916e1 100644 --- a/src/include/optimizer/geqo.h +++ b/src/include/optimizer/geqo.h @@ -3,7 +3,7 @@ * geqo.h * prototypes for various files in optimizer/geqo * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/geqo.h diff --git a/src/include/optimizer/geqo_copy.h b/src/include/optimizer/geqo_copy.h index 9a78de65c97e1..b204dad5d373b 100644 --- a/src/include/optimizer/geqo_copy.h +++ b/src/include/optimizer/geqo_copy.h @@ -3,7 +3,7 @@ * geqo_copy.h * prototypes for copy functions in optimizer/geqo * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/geqo_copy.h diff --git a/src/include/optimizer/geqo_gene.h b/src/include/optimizer/geqo_gene.h index 40256a4cde646..49b31bae30f80 100644 --- a/src/include/optimizer/geqo_gene.h +++ b/src/include/optimizer/geqo_gene.h @@ -3,7 +3,7 @@ * geqo_gene.h * genome representation in optimizer/geqo * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/geqo_gene.h diff --git a/src/include/optimizer/geqo_misc.h b/src/include/optimizer/geqo_misc.h index 25e1681273950..722399de30adf 100644 --- a/src/include/optimizer/geqo_misc.h +++ b/src/include/optimizer/geqo_misc.h @@ -3,7 +3,7 @@ * geqo_misc.h * prototypes for printout routines in optimizer/geqo * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/geqo_misc.h diff --git a/src/include/optimizer/geqo_mutation.h b/src/include/optimizer/geqo_mutation.h index d0f7ed94206ee..f6f2247c992c4 100644 --- a/src/include/optimizer/geqo_mutation.h +++ b/src/include/optimizer/geqo_mutation.h @@ -3,7 +3,7 @@ * geqo_mutation.h * prototypes for mutation functions in optimizer/geqo * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/geqo_mutation.h diff --git a/src/include/optimizer/geqo_pool.h b/src/include/optimizer/geqo_pool.h index d1464f70aa862..b5e8055472457 100644 --- a/src/include/optimizer/geqo_pool.h +++ b/src/include/optimizer/geqo_pool.h @@ -3,7 +3,7 @@ * geqo_pool.h * pool representation in optimizer/geqo * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/geqo_pool.h diff --git a/src/include/optimizer/geqo_random.h b/src/include/optimizer/geqo_random.h index 08b0c08d85f94..236f5954c158a 100644 --- a/src/include/optimizer/geqo_random.h +++ b/src/include/optimizer/geqo_random.h @@ -3,7 +3,7 @@ * geqo_random.h * random number generator * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/geqo_random.h @@ -24,8 +24,6 @@ #ifndef GEQO_RANDOM_H #define GEQO_RANDOM_H -#include - #include "optimizer/geqo.h" diff --git a/src/include/optimizer/geqo_recombination.h b/src/include/optimizer/geqo_recombination.h index 1c3c7d5f64655..5d38276efb4f8 100644 --- a/src/include/optimizer/geqo_recombination.h +++ b/src/include/optimizer/geqo_recombination.h @@ -3,7 +3,7 @@ * geqo_recombination.h * prototypes for recombination in the genetic query optimizer * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/geqo_recombination.h diff --git a/src/include/optimizer/geqo_selection.h b/src/include/optimizer/geqo_selection.h index 45d1078e696e5..fb1dcecdca843 100644 --- a/src/include/optimizer/geqo_selection.h +++ b/src/include/optimizer/geqo_selection.h @@ -3,7 +3,7 @@ * geqo_selection.h * prototypes for selection routines in optimizer/geqo * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/geqo_selection.h diff --git a/src/include/optimizer/inherit.h b/src/include/optimizer/inherit.h index 76e958d639eba..c36c11837874f 100644 --- a/src/include/optimizer/inherit.h +++ b/src/include/optimizer/inherit.h @@ -4,7 +4,7 @@ * prototypes for inherit.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/inherit.h diff --git a/src/include/optimizer/joininfo.h b/src/include/optimizer/joininfo.h index 2cd6a13223405..da48a6b6c3bd3 100644 --- a/src/include/optimizer/joininfo.h +++ b/src/include/optimizer/joininfo.h @@ -4,7 +4,7 @@ * prototypes for joininfo.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/joininfo.h diff --git a/src/include/optimizer/optimizer.h b/src/include/optimizer/optimizer.h index 514746c58523b..7b63c5cf718db 100644 --- a/src/include/optimizer/optimizer.h +++ b/src/include/optimizer/optimizer.h @@ -12,7 +12,7 @@ * example. For the most part, however, code outside the core planner * should not need to include any optimizer/ header except this one. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/optimizer.h @@ -90,6 +90,7 @@ extern PGDLLIMPORT double recursive_worktable_factor; extern PGDLLIMPORT int effective_cache_size; extern double clamp_row_est(double nrows); +extern int32 clamp_width_est(int64 tuple_width); extern long clamp_cardinality_to_long(Cardinality x); /* in path/indxpath.c: */ @@ -104,7 +105,7 @@ typedef enum { DEBUG_PARALLEL_OFF, DEBUG_PARALLEL_ON, - DEBUG_PARALLEL_REGRESS + DEBUG_PARALLEL_REGRESS, } DebugParallelMode; /* GUC parameters */ @@ -138,7 +139,9 @@ extern Expr *canonicalize_qual(Expr *qual, bool is_check); /* in util/clauses.c: */ extern bool contain_mutable_functions(Node *clause); +extern bool contain_mutable_functions_after_planning(Expr *expr); extern bool contain_volatile_functions(Node *clause); +extern bool contain_volatile_functions_after_planning(Expr *expr); extern bool contain_volatile_functions_not_nextval(Node *clause); extern Node *eval_const_expressions(PlannerInfo *root, Node *node); diff --git a/src/include/optimizer/orclauses.h b/src/include/optimizer/orclauses.h index f9dbe6a29721c..3ef275357556c 100644 --- a/src/include/optimizer/orclauses.h +++ b/src/include/optimizer/orclauses.h @@ -4,7 +4,7 @@ * prototypes for orclauses.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/orclauses.h diff --git a/src/include/optimizer/paramassign.h b/src/include/optimizer/paramassign.h index 55c27a62e5784..4026b74fab459 100644 --- a/src/include/optimizer/paramassign.h +++ b/src/include/optimizer/paramassign.h @@ -3,7 +3,7 @@ * paramassign.h * Functions for assigning PARAM_EXEC slots during planning. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/paramassign.h @@ -20,6 +20,8 @@ extern Param *replace_outer_placeholdervar(PlannerInfo *root, PlaceHolderVar *phv); extern Param *replace_outer_agg(PlannerInfo *root, Aggref *agg); extern Param *replace_outer_grouping(PlannerInfo *root, GroupingFunc *grp); +extern Param *replace_outer_merge_support(PlannerInfo *root, + MergeSupportFunc *msf); extern Param *replace_nestloop_param_var(PlannerInfo *root, Var *var); extern Param *replace_nestloop_param_placeholdervar(PlannerInfo *root, PlaceHolderVar *phv); diff --git a/src/include/optimizer/pathnode.h b/src/include/optimizer/pathnode.h index 001e75b5b7695..112e7c23d4e1a 100644 --- a/src/include/optimizer/pathnode.h +++ b/src/include/optimizer/pathnode.h @@ -4,7 +4,7 @@ * prototypes for pathnode.c, relnode.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/pathnode.h @@ -115,7 +115,7 @@ extern Path *create_valuesscan_path(PlannerInfo *root, RelOptInfo *rel, extern Path *create_tablefuncscan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer); extern Path *create_ctescan_path(PlannerInfo *root, RelOptInfo *rel, - Relids required_outer); + List *pathkeys, Relids required_outer); extern Path *create_namedtuplestorescan_path(PlannerInfo *root, RelOptInfo *rel, Relids required_outer); extern Path *create_resultscan_path(PlannerInfo *root, RelOptInfo *rel, @@ -128,6 +128,7 @@ extern ForeignPath *create_foreignscan_path(PlannerInfo *root, RelOptInfo *rel, List *pathkeys, Relids required_outer, Path *fdw_outerpath, + List *fdw_restrictinfo, List *fdw_private); extern ForeignPath *create_foreign_join_path(PlannerInfo *root, RelOptInfo *rel, PathTarget *target, @@ -135,12 +136,14 @@ extern ForeignPath *create_foreign_join_path(PlannerInfo *root, RelOptInfo *rel, List *pathkeys, Relids required_outer, Path *fdw_outerpath, + List *fdw_restrictinfo, List *fdw_private); extern ForeignPath *create_foreign_upper_path(PlannerInfo *root, RelOptInfo *rel, PathTarget *target, double rows, Cost startup_cost, Cost total_cost, List *pathkeys, Path *fdw_outerpath, + List *fdw_restrictinfo, List *fdw_private); extern Relids calc_nestloop_required_outer(Relids outerrelids, @@ -247,6 +250,7 @@ extern WindowAggPath *create_windowagg_path(PlannerInfo *root, Path *subpath, PathTarget *target, List *windowFuncs, + List *runCondition, WindowClause *winclause, List *qual, bool topwindow); @@ -280,7 +284,8 @@ extern ModifyTablePath *create_modifytable_path(PlannerInfo *root, List *updateColnosLists, List *withCheckOptionLists, List *returningLists, List *rowMarks, OnConflictExpr *onconflict, - List *mergeActionLists, int epqParam); + List *mergeActionLists, List *mergeJoinConditions, + int epqParam); extern LimitPath *create_limit_path(PlannerInfo *root, RelOptInfo *rel, Path *subpath, Node *limitOffset, Node *limitCount, @@ -295,6 +300,8 @@ extern Path *reparameterize_path(PlannerInfo *root, Path *path, double loop_count); extern Path *reparameterize_path_by_child(PlannerInfo *root, Path *path, RelOptInfo *child_rel); +extern bool path_is_reparameterizable_by_child(Path *path, + RelOptInfo *child_rel); /* * prototypes for relnode.c @@ -304,6 +311,7 @@ extern void expand_planner_arrays(PlannerInfo *root, int add_size); extern RelOptInfo *build_simple_rel(PlannerInfo *root, int relid, RelOptInfo *parent); extern RelOptInfo *find_base_rel(PlannerInfo *root, int relid); +extern RelOptInfo *find_base_rel_noerr(PlannerInfo *root, int relid); extern RelOptInfo *find_base_rel_ignore_join(PlannerInfo *root, int relid); extern RelOptInfo *find_join_rel(PlannerInfo *root, Relids relids); extern RelOptInfo *build_join_rel(PlannerInfo *root, diff --git a/src/include/optimizer/paths.h b/src/include/optimizer/paths.h index 50bc3b503a65b..5e88c0224a417 100644 --- a/src/include/optimizer/paths.h +++ b/src/include/optimizer/paths.h @@ -4,7 +4,7 @@ * prototypes for various files in optimizer/path * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/paths.h @@ -24,6 +24,7 @@ extern PGDLLIMPORT bool enable_geqo; extern PGDLLIMPORT int geqo_threshold; extern PGDLLIMPORT int min_parallel_table_scan_size; extern PGDLLIMPORT int min_parallel_index_scan_size; +extern PGDLLIMPORT bool enable_group_by_reordering; /* Hook for plugins to get control in set_rel_pathlist() */ typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root, @@ -63,10 +64,6 @@ extern void create_partial_bitmap_paths(PlannerInfo *root, RelOptInfo *rel, extern void generate_partitionwise_join_paths(PlannerInfo *root, RelOptInfo *rel); -#ifdef OPTIMIZER_DEBUG -extern void debug_print_rel(PlannerInfo *root, RelOptInfo *rel); -#endif - /* * indxpath.c * routines to generate index paths @@ -83,7 +80,7 @@ extern bool match_index_to_operand(Node *operand, int indexcol, extern void check_index_predicates(PlannerInfo *root, RelOptInfo *rel); /* - * tidpath.h + * tidpath.c * routines to generate tid paths */ extern void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel); @@ -112,6 +109,8 @@ extern bool have_join_order_restriction(PlannerInfo *root, extern bool have_dangerous_phv(PlannerInfo *root, Relids outer_relids, Relids inner_params); extern void mark_dummy_rel(RelOptInfo *rel); +extern void init_dummy_sjinfo(SpecialJoinInfo *sjinfo, Relids left_relids, + Relids right_relids); /* * equivclass.c @@ -174,6 +173,10 @@ extern void add_child_join_rel_equivalences(PlannerInfo *root, AppendRelInfo **appinfos, RelOptInfo *parent_joinrel, RelOptInfo *child_joinrel); +extern void add_setop_child_rel_equivalences(PlannerInfo *root, + RelOptInfo *child_rel, + List *child_tlist, + List *setop_pathkeys); extern List *generate_implied_equalities_for_column(PlannerInfo *root, RelOptInfo *rel, ec_matches_callback_type callback, @@ -199,12 +202,13 @@ typedef enum PATHKEYS_EQUAL, /* pathkeys are identical */ PATHKEYS_BETTER1, /* pathkey 1 is a superset of pathkey 2 */ PATHKEYS_BETTER2, /* vice versa */ - PATHKEYS_DIFFERENT /* neither pathkey includes the other */ + PATHKEYS_DIFFERENT, /* neither pathkey includes the other */ } PathKeysComparison; extern PathKeysComparison compare_pathkeys(List *keys1, List *keys2); extern bool pathkeys_contained_in(List *keys1, List *keys2); extern bool pathkeys_count_contained_in(List *keys1, List *keys2, int *n_common); +extern List *get_useful_group_keys_orderings(PlannerInfo *root, Path *path); extern Path *get_cheapest_path_for_pathkeys(List *paths, List *pathkeys, Relids required_outer, CostSelector cost_criterion, @@ -235,7 +239,8 @@ extern List *make_pathkeys_for_sortclauses_extended(PlannerInfo *root, List **sortclauses, List *tlist, bool remove_redundant, - bool *sortable); + bool *sortable, + bool set_ec_sortref); extern void initialize_mergeclause_eclasses(PlannerInfo *root, RestrictInfo *restrictinfo); extern void update_mergeclause_eclasses(PlannerInfo *root, diff --git a/src/include/optimizer/placeholder.h b/src/include/optimizer/placeholder.h index acb9cf9f05cc0..d8610863fc5ca 100644 --- a/src/include/optimizer/placeholder.h +++ b/src/include/optimizer/placeholder.h @@ -4,7 +4,7 @@ * prototypes for optimizer/util/placeholder.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/placeholder.h diff --git a/src/include/optimizer/plancat.h b/src/include/optimizer/plancat.h index eb1c3ccc4bfb2..f59b77b10125c 100644 --- a/src/include/optimizer/plancat.h +++ b/src/include/optimizer/plancat.h @@ -4,7 +4,7 @@ * prototypes for plancat.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/plancat.h diff --git a/src/include/optimizer/planmain.h b/src/include/optimizer/planmain.h index 5fc900737d8ff..aafc173792151 100644 --- a/src/include/optimizer/planmain.h +++ b/src/include/optimizer/planmain.h @@ -4,7 +4,7 @@ * prototypes for various files in optimizer/plan * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/planmain.h @@ -75,6 +75,10 @@ extern void add_vars_to_targetlist(PlannerInfo *root, List *vars, extern void find_lateral_references(PlannerInfo *root); extern void create_lateral_join_info(PlannerInfo *root); extern List *deconstruct_jointree(PlannerInfo *root); +extern bool restriction_is_always_true(PlannerInfo *root, + RestrictInfo *restrictinfo); +extern bool restriction_is_always_false(PlannerInfo *root, + RestrictInfo *restrictinfo); extern void distribute_restrictinfo_to_rels(PlannerInfo *root, RestrictInfo *restrictinfo); extern RestrictInfo *process_implied_equality(PlannerInfo *root, @@ -110,6 +114,8 @@ extern bool innerrel_is_unique(PlannerInfo *root, */ extern Plan *set_plan_references(PlannerInfo *root, Plan *plan); extern bool trivial_subqueryscan(SubqueryScan *plan); +extern Param *find_minmax_agg_replacement_param(PlannerInfo *root, + Aggref *aggref); extern void record_plan_function_dependency(PlannerInfo *root, Oid funcid); extern void record_plan_type_dependency(PlannerInfo *root, Oid typid); extern bool extract_query_dependencies_walker(Node *node, PlannerInfo *context); diff --git a/src/include/optimizer/planner.h b/src/include/optimizer/planner.h index fc2e15496ddfc..5aeff21b967f0 100644 --- a/src/include/optimizer/planner.h +++ b/src/include/optimizer/planner.h @@ -8,7 +8,7 @@ * non-planner code. Declarations here are meant for use by other * planner modules. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/planner.h @@ -44,7 +44,8 @@ extern PlannedStmt *standard_planner(Query *parse, const char *query_string, extern PlannerInfo *subquery_planner(PlannerGlobal *glob, Query *parse, PlannerInfo *parent_root, - bool hasRecursion, double tuple_fraction); + bool hasRecursion, double tuple_fraction, + SetOperationStmt *setops); extern RowMarkType select_rowmark_type(RangeTblEntry *rte, LockClauseStrength strength); diff --git a/src/include/optimizer/prep.h b/src/include/optimizer/prep.h index 54fd61c9c3ee2..a52dec285d569 100644 --- a/src/include/optimizer/prep.h +++ b/src/include/optimizer/prep.h @@ -4,7 +4,7 @@ * prototypes for files in optimizer/prep/ * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/prep.h @@ -53,6 +53,6 @@ extern void preprocess_aggrefs(PlannerInfo *root, Node *clause); * prototypes for prepunion.c */ extern RelOptInfo *plan_set_operations(PlannerInfo *root); - +extern bool set_operation_ordered_results_useful(SetOperationStmt *setop); #endif /* PREP_H */ diff --git a/src/include/optimizer/restrictinfo.h b/src/include/optimizer/restrictinfo.h index e140e619ace72..1b42c832c5923 100644 --- a/src/include/optimizer/restrictinfo.h +++ b/src/include/optimizer/restrictinfo.h @@ -4,7 +4,7 @@ * prototypes for restrictinfo.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/restrictinfo.h diff --git a/src/include/optimizer/subselect.h b/src/include/optimizer/subselect.h index c03ffc56bf61d..c20bd9924b85b 100644 --- a/src/include/optimizer/subselect.h +++ b/src/include/optimizer/subselect.h @@ -3,7 +3,7 @@ * subselect.h * Planning routines for subselects. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/subselect.h @@ -28,6 +28,9 @@ extern Node *SS_replace_correlation_vars(PlannerInfo *root, Node *expr); extern Node *SS_process_sublinks(PlannerInfo *root, Node *expr, bool isQual); extern void SS_identify_outer_params(PlannerInfo *root); extern void SS_charge_for_initplans(PlannerInfo *root, RelOptInfo *final_rel); +extern void SS_compute_initplan_cost(List *init_plans, + Cost *initplan_cost_p, + bool *unsafe_initplans_p); extern void SS_attach_initplans(PlannerInfo *root, Plan *plan); extern void SS_finalize_plan(PlannerInfo *root, Plan *plan); extern Param *SS_make_initplan_output_param(PlannerInfo *root, diff --git a/src/include/optimizer/tlist.h b/src/include/optimizer/tlist.h index ca64309c32945..15f8f4a4b0061 100644 --- a/src/include/optimizer/tlist.h +++ b/src/include/optimizer/tlist.h @@ -4,7 +4,7 @@ * prototypes for tlist.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/optimizer/tlist.h diff --git a/src/include/parser/analyze.h b/src/include/parser/analyze.h index 1cef1833a66ae..28b66fccb4339 100644 --- a/src/include/parser/analyze.h +++ b/src/include/parser/analyze.h @@ -4,7 +4,7 @@ * parse analysis for optimizable statements * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/analyze.h @@ -44,9 +44,12 @@ extern List *transformInsertRow(ParseState *pstate, List *exprlist, bool strip_indirection); extern List *transformUpdateTargetList(ParseState *pstate, List *origTlist); +extern List *transformReturningList(ParseState *pstate, List *returningList, + ParseExprKind exprKind); extern Query *transformTopLevelStmt(ParseState *pstate, RawStmt *parseTree); extern Query *transformStmt(ParseState *pstate, Node *parseTree); +extern bool stmt_requires_parse_analysis(RawStmt *parseTree); extern bool analyze_requires_snapshot(RawStmt *parseTree); extern const char *LCS_asString(LockClauseStrength strength); diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index f5b2e61ca527b..658d7ff6a9814 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -7,7 +7,7 @@ * by the PG_KEYWORD macro, which is not defined in this file; it can * be defined by the caller for special purposes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -93,6 +93,7 @@ PG_KEYWORD("commit", COMMIT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("committed", COMMITTED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("compression", COMPRESSION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("concurrently", CONCURRENTLY, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("conditional", CONDITIONAL, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("configuration", CONFIGURATION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("conflict", CONFLICT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("connection", CONNECTION, UNRESERVED_KEYWORD, BARE_LABEL) @@ -147,11 +148,13 @@ PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("else", ELSE, RESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("empty", EMPTY_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("encrypted", ENCRYPTED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("end", END_P, RESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("enum", ENUM_P, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("error", ERROR_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("escape", ESCAPE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("event", EVENT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("except", EXCEPT, RESERVED_KEYWORD, AS_LABEL) @@ -230,11 +233,18 @@ PG_KEYWORD("is", IS, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD, AS_LABEL) PG_KEYWORD("isolation", ISOLATION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("join", JOIN, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) -PG_KEYWORD("json", JSON, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("json", JSON, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_array", JSON_ARRAY, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_arrayagg", JSON_ARRAYAGG, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_exists", JSON_EXISTS, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_object", JSON_OBJECT, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("json_objectagg", JSON_OBJECTAGG, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_query", JSON_QUERY, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_scalar", JSON_SCALAR, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_serialize", JSON_SERIALIZE, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_table", JSON_TABLE, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("json_value", JSON_VALUE, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("keep", KEEP, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("key", KEY, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("keys", KEYS, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("label", LABEL, UNRESERVED_KEYWORD, BARE_LABEL) @@ -264,6 +274,7 @@ PG_KEYWORD("matched", MATCHED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("materialized", MATERIALIZED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("maxvalue", MAXVALUE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("merge", MERGE, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("merge_action", MERGE_ACTION, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("method", METHOD, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("minute", MINUTE_P, UNRESERVED_KEYWORD, AS_LABEL) PG_KEYWORD("minvalue", MINVALUE, UNRESERVED_KEYWORD, BARE_LABEL) @@ -275,6 +286,7 @@ PG_KEYWORD("names", NAMES, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("national", NATIONAL, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("natural", NATURAL, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("nchar", NCHAR, COL_NAME_KEYWORD, BARE_LABEL) +PG_KEYWORD("nested", NESTED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("new", NEW, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("next", NEXT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("nfc", NFC, UNRESERVED_KEYWORD, BARE_LABEL) @@ -300,6 +312,7 @@ PG_KEYWORD("off", OFF, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("offset", OFFSET, RESERVED_KEYWORD, AS_LABEL) PG_KEYWORD("oids", OIDS, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("old", OLD, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("omit", OMIT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("on", ON, RESERVED_KEYWORD, AS_LABEL) PG_KEYWORD("only", ONLY, RESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("operator", OPERATOR, UNRESERVED_KEYWORD, BARE_LABEL) @@ -324,7 +337,9 @@ PG_KEYWORD("partial", PARTIAL, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("partition", PARTITION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("passing", PASSING, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("password", PASSWORD, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("path", PATH, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("placing", PLACING, RESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("plan", PLAN, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("plans", PLANS, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("policy", POLICY, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("position", POSITION, COL_NAME_KEYWORD, BARE_LABEL) @@ -342,6 +357,7 @@ PG_KEYWORD("procedures", PROCEDURES, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("program", PROGRAM, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("publication", PUBLICATION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("quote", QUOTE, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("quotes", QUOTES, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("range", RANGE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("read", READ, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("real", REAL, COL_NAME_KEYWORD, BARE_LABEL) @@ -401,6 +417,7 @@ PG_KEYWORD("skip", SKIP, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("smallint", SMALLINT, COL_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("snapshot", SNAPSHOT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("some", SOME, RESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("source", SOURCE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("sql", SQL_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("stable", STABLE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("standalone", STANDALONE_P, UNRESERVED_KEYWORD, BARE_LABEL) @@ -412,6 +429,7 @@ PG_KEYWORD("stdout", STDOUT, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("storage", STORAGE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("stored", STORED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("strict", STRICT_P, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("string", STRING_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("strip", STRIP_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("subscription", SUBSCRIPTION, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("substring", SUBSTRING, COL_NAME_KEYWORD, BARE_LABEL) @@ -424,6 +442,7 @@ PG_KEYWORD("table", TABLE, RESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("tables", TABLES, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("tablesample", TABLESAMPLE, TYPE_FUNC_NAME_KEYWORD, BARE_LABEL) PG_KEYWORD("tablespace", TABLESPACE, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("target", TARGET, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("temp", TEMP, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("template", TEMPLATE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("temporary", TEMPORARY, UNRESERVED_KEYWORD, BARE_LABEL) @@ -447,6 +466,7 @@ PG_KEYWORD("types", TYPES_P, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("uescape", UESCAPE, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("unbounded", UNBOUNDED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("uncommitted", UNCOMMITTED, UNRESERVED_KEYWORD, BARE_LABEL) +PG_KEYWORD("unconditional", UNCONDITIONAL, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("unencrypted", UNENCRYPTED, UNRESERVED_KEYWORD, BARE_LABEL) PG_KEYWORD("union", UNION, RESERVED_KEYWORD, AS_LABEL) PG_KEYWORD("unique", UNIQUE, RESERVED_KEYWORD, BARE_LABEL) diff --git a/src/include/parser/parse_agg.h b/src/include/parser/parse_agg.h index e9afd99d11fc5..4df9b37e6d966 100644 --- a/src/include/parser/parse_agg.h +++ b/src/include/parser/parse_agg.h @@ -3,7 +3,7 @@ * parse_agg.h * handle aggregates and window functions in parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_agg.h diff --git a/src/include/parser/parse_clause.h b/src/include/parser/parse_clause.h index 8e26482db4200..e71762b10cff0 100644 --- a/src/include/parser/parse_clause.h +++ b/src/include/parser/parse_clause.h @@ -4,7 +4,7 @@ * handle clauses in parser * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_clause.h @@ -51,4 +51,7 @@ extern List *addTargetToSortList(ParseState *pstate, TargetEntry *tle, extern Index assignSortGroupRef(TargetEntry *tle, List *tlist); extern bool targetIsInSortList(TargetEntry *tle, Oid sortop, List *sortList); +/* functions in parse_jsontable.c */ +extern ParseNamespaceItem *transformJsonTable(ParseState *pstate, JsonTable *jt); + #endif /* PARSE_CLAUSE_H */ diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h index 35ce4a3547a15..41ef39433fd5d 100644 --- a/src/include/parser/parse_coerce.h +++ b/src/include/parser/parse_coerce.h @@ -4,7 +4,7 @@ * Routines for type coercion. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_coerce.h @@ -27,7 +27,7 @@ typedef enum CoercionPathType COERCION_PATH_FUNC, /* apply the specified coercion function */ COERCION_PATH_RELABELTYPE, /* binary-compatible cast, no function */ COERCION_PATH_ARRAYCOERCE, /* need an ArrayCoerceExpr node */ - COERCION_PATH_COERCEVIAIO /* need a CoerceViaIO node */ + COERCION_PATH_COERCEVIAIO, /* need a CoerceViaIO node */ } CoercionPathType; @@ -63,6 +63,9 @@ extern Node *coerce_to_specific_type_typmod(ParseState *pstate, Node *node, Oid targetTypeId, int32 targetTypmod, const char *constructName); +extern Node *coerce_null_to_domain(Oid typid, int32 typmod, Oid collation, + int typlen, bool typbyval); + extern int parser_coercion_errposition(ParseState *pstate, int coerce_location, Node *input_expr); diff --git a/src/include/parser/parse_collate.h b/src/include/parser/parse_collate.h index a858deb0bce74..af69d13f5c1d5 100644 --- a/src/include/parser/parse_collate.h +++ b/src/include/parser/parse_collate.h @@ -4,7 +4,7 @@ * Routines for assigning collation information. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_collate.h diff --git a/src/include/parser/parse_cte.h b/src/include/parser/parse_cte.h index 3eebc770565a6..96547d420b38b 100644 --- a/src/include/parser/parse_cte.h +++ b/src/include/parser/parse_cte.h @@ -4,7 +4,7 @@ * handle CTEs (common table expressions) in parser * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_cte.h diff --git a/src/include/parser/parse_enr.h b/src/include/parser/parse_enr.h index edb2ee0d03e1b..5e259e1e311e6 100644 --- a/src/include/parser/parse_enr.h +++ b/src/include/parser/parse_enr.h @@ -4,7 +4,7 @@ * Internal definitions for parser * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_enr.h diff --git a/src/include/parser/parse_expr.h b/src/include/parser/parse_expr.h index 7d38ca75f7bd6..9b46dfd9ecc68 100644 --- a/src/include/parser/parse_expr.h +++ b/src/include/parser/parse_expr.h @@ -3,7 +3,7 @@ * parse_expr.h * handle expressions in parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_expr.h diff --git a/src/include/parser/parse_func.h b/src/include/parser/parse_func.h index e316f5da49853..c7ba99dee74aa 100644 --- a/src/include/parser/parse_func.h +++ b/src/include/parser/parse_func.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_func.h @@ -27,7 +27,7 @@ typedef enum FUNCDETAIL_PROCEDURE, /* found a matching procedure */ FUNCDETAIL_AGGREGATE, /* found a matching aggregate function */ FUNCDETAIL_WINDOWFUNC, /* found a matching window function */ - FUNCDETAIL_COERCION /* it's a type coercion request */ + FUNCDETAIL_COERCION, /* it's a type coercion request */ } FuncDetailCode; diff --git a/src/include/parser/parse_merge.h b/src/include/parser/parse_merge.h index 751cbdf112a7d..3fad202ae60ec 100644 --- a/src/include/parser/parse_merge.h +++ b/src/include/parser/parse_merge.h @@ -4,7 +4,7 @@ * handle MERGE statement in parser * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_merge.h diff --git a/src/include/parser/parse_node.h b/src/include/parser/parse_node.h index f589112d5e5f0..5b781d87a9d24 100644 --- a/src/include/parser/parse_node.h +++ b/src/include/parser/parse_node.h @@ -4,7 +4,7 @@ * Internal definitions for parser * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_node.h @@ -61,7 +61,8 @@ typedef enum ParseExprKind EXPR_KIND_DISTINCT_ON, /* DISTINCT ON */ EXPR_KIND_LIMIT, /* LIMIT */ EXPR_KIND_OFFSET, /* OFFSET */ - EXPR_KIND_RETURNING, /* RETURNING */ + EXPR_KIND_RETURNING, /* RETURNING in INSERT/UPDATE/DELETE */ + EXPR_KIND_MERGE_RETURNING, /* RETURNING in MERGE */ EXPR_KIND_VALUES, /* VALUES */ EXPR_KIND_VALUES_SINGLE, /* single-row VALUES (in INSERT only) */ EXPR_KIND_CHECK_CONSTRAINT, /* CHECK constraint for a table */ diff --git a/src/include/parser/parse_oper.h b/src/include/parser/parse_oper.h index 5768a1ce87a50..beffe144c9a71 100644 --- a/src/include/parser/parse_oper.h +++ b/src/include/parser/parse_oper.h @@ -4,7 +4,7 @@ * handle operator things for parser * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_oper.h @@ -42,6 +42,9 @@ extern Operator compatible_oper(ParseState *pstate, List *op, /* currently no need for compatible_left_oper/compatible_right_oper */ +/* Error reporting support */ +extern const char *op_signature_string(List *op, Oid arg1, Oid arg2); + /* Routines for identifying "<", "=", ">" operators for a type */ extern void get_sort_group_operators(Oid argtype, bool needLT, bool needEQ, bool needGT, diff --git a/src/include/parser/parse_param.h b/src/include/parser/parse_param.h index d4865e50f6780..6459d4ab6f3ea 100644 --- a/src/include/parser/parse_param.h +++ b/src/include/parser/parse_param.h @@ -3,7 +3,7 @@ * parse_param.h * handle parameters in parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_param.h diff --git a/src/include/parser/parse_relation.h b/src/include/parser/parse_relation.h index 67d9b1e412c6a..bea2da549617a 100644 --- a/src/include/parser/parse_relation.h +++ b/src/include/parser/parse_relation.h @@ -4,7 +4,7 @@ * prototypes for parse_relation.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_relation.h diff --git a/src/include/parser/parse_target.h b/src/include/parser/parse_target.h index d84c311bbcaf9..3281f63494631 100644 --- a/src/include/parser/parse_target.h +++ b/src/include/parser/parse_target.h @@ -4,7 +4,7 @@ * handle target lists * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_target.h diff --git a/src/include/parser/parse_type.h b/src/include/parser/parse_type.h index 848c467a182c2..b62e7a6ce99a8 100644 --- a/src/include/parser/parse_type.h +++ b/src/include/parser/parse_type.h @@ -3,7 +3,7 @@ * parse_type.h * handle type operations for parser * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_type.h @@ -36,7 +36,7 @@ extern char *TypeNameToString(const TypeName *typeName); extern char *TypeNameListToString(List *typenames); extern Oid LookupCollation(ParseState *pstate, List *collnames, int location); -extern Oid GetColumnDefCollation(ParseState *pstate, ColumnDef *coldef, Oid typeOid); +extern Oid GetColumnDefCollation(ParseState *pstate, const ColumnDef *coldef, Oid typeOid); extern Type typeidType(Oid id); diff --git a/src/include/parser/parse_utilcmd.h b/src/include/parser/parse_utilcmd.h index 2b40a0b5b19d9..1406589477942 100644 --- a/src/include/parser/parse_utilcmd.h +++ b/src/include/parser/parse_utilcmd.h @@ -4,7 +4,7 @@ * parse analysis for utility commands * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parse_utilcmd.h diff --git a/src/include/parser/parser.h b/src/include/parser/parser.h index 8d90064d87ba1..be184ec50667c 100644 --- a/src/include/parser/parser.h +++ b/src/include/parser/parser.h @@ -5,7 +5,7 @@ * * This is the external API for the raw lexing/parsing functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parser.h @@ -41,7 +41,7 @@ typedef enum RAW_PARSE_PLPGSQL_EXPR, RAW_PARSE_PLPGSQL_ASSIGN1, RAW_PARSE_PLPGSQL_ASSIGN2, - RAW_PARSE_PLPGSQL_ASSIGN3 + RAW_PARSE_PLPGSQL_ASSIGN3, } RawParseMode; /* Values for the backslash_quote GUC */ @@ -49,7 +49,7 @@ typedef enum { BACKSLASH_QUOTE_OFF, BACKSLASH_QUOTE_ON, - BACKSLASH_QUOTE_SAFE_ENCODING + BACKSLASH_QUOTE_SAFE_ENCODING, } BackslashQuoteType; /* GUC variables in scan.l (every one of these is a bad idea :-() */ diff --git a/src/include/parser/parsetree.h b/src/include/parser/parsetree.h index 69a9a258318a1..3d51cd1530f5d 100644 --- a/src/include/parser/parsetree.h +++ b/src/include/parser/parsetree.h @@ -5,7 +5,7 @@ * parse trees. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/parsetree.h diff --git a/src/include/parser/scanner.h b/src/include/parser/scanner.h index da013837cd918..d6293b1e87872 100644 --- a/src/include/parser/scanner.h +++ b/src/include/parser/scanner.h @@ -8,7 +8,7 @@ * higher-level API provided by parser.h. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/scanner.h diff --git a/src/include/parser/scansup.h b/src/include/parser/scansup.h index f2fa19779189f..4b68ddc2d8dac 100644 --- a/src/include/parser/scansup.h +++ b/src/include/parser/scansup.h @@ -3,7 +3,7 @@ * scansup.h * scanner support routines used by the core lexer * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/parser/scansup.h diff --git a/src/include/partitioning/partbounds.h b/src/include/partitioning/partbounds.h index d2e01f92dfec1..3d9cc1031f731 100644 --- a/src/include/partitioning/partbounds.h +++ b/src/include/partitioning/partbounds.h @@ -2,7 +2,7 @@ * * partbounds.h * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * src/include/partitioning/partbounds.h * @@ -100,8 +100,8 @@ typedef struct PartitionBoundInfoData extern int get_hash_partition_greatest_modulus(PartitionBoundInfo bound); extern uint64 compute_partition_hash_value(int partnatts, FmgrInfo *partsupfunc, - Oid *partcollation, - Datum *values, bool *isnull); + const Oid *partcollation, + const Datum *values, const bool *isnull); extern List *get_qual_from_partbound(Relation parent, PartitionBoundSpec *spec); extern PartitionBoundInfo partition_bounds_create(PartitionBoundSpec **boundspecs, diff --git a/src/include/partitioning/partdefs.h b/src/include/partitioning/partdefs.h index 55bb49c816cc2..fcfd18f2ba1aa 100644 --- a/src/include/partitioning/partdefs.h +++ b/src/include/partitioning/partdefs.h @@ -3,7 +3,7 @@ * partdefs.h * Base definitions for partitioned table handling * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * src/include/partitioning/partdefs.h * diff --git a/src/include/partitioning/partdesc.h b/src/include/partitioning/partdesc.h index e157eae9c1ebf..87abfd76d7889 100644 --- a/src/include/partitioning/partdesc.h +++ b/src/include/partitioning/partdesc.h @@ -2,7 +2,7 @@ * * partdesc.h * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/partitioning/partdesc.h * diff --git a/src/include/partitioning/partprune.h b/src/include/partitioning/partprune.h index 8636e04e374e0..bd490d154f355 100644 --- a/src/include/partitioning/partprune.h +++ b/src/include/partitioning/partprune.h @@ -4,7 +4,7 @@ * prototypes for partprune.c * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/partitioning/partprune.h diff --git a/src/include/pch/meson.build b/src/include/pch/meson.build index 6a8bfee6c9281..942d4c9956f62 100644 --- a/src/include/pch/meson.build +++ b/src/include/pch/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # See https://github.com/mesonbuild/meson/issues/10338 pch_c_h = meson.source_root() / meson.current_source_dir() / 'c_pch.h' diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 6d572c3820420..0ee4a63eaa63d 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -51,10 +51,6 @@ /* Define to 1 if you want National Language Support. (--enable-nls) */ #undef ENABLE_NLS -/* Define to 1 to build client libraries as thread-safe code. - (--enable-thread-safety) */ -#undef ENABLE_THREAD_SAFETY - /* Define to 1 if you have the `append_history' function. */ #undef HAVE_APPEND_HISTORY @@ -70,9 +66,6 @@ /* Define to 1 if you have the `backtrace_symbols' function. */ #undef HAVE_BACKTRACE_SYMBOLS -/* Define to 1 if you have the `BIO_get_data' function. */ -#undef HAVE_BIO_GET_DATA - /* Define to 1 if you have the `BIO_meth_new' function. */ #undef HAVE_BIO_METH_NEW @@ -85,6 +78,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_COPYFILE_H +/* Define to 1 if you have the `copy_file_range' function. */ +#undef HAVE_COPY_FILE_RANGE + /* Define to 1 if you have the header file. */ #undef HAVE_CRTDEFS_H @@ -107,18 +103,6 @@ `LLVMCreatePerfJITEventListener', and to 0 if you don't. */ #undef HAVE_DECL_LLVMCREATEPERFJITEVENTLISTENER -/* Define to 1 if you have the declaration of `LLVMGetHostCPUFeatures', and to - 0 if you don't. */ -#undef HAVE_DECL_LLVMGETHOSTCPUFEATURES - -/* Define to 1 if you have the declaration of `LLVMGetHostCPUName', and to 0 - if you don't. */ -#undef HAVE_DECL_LLVMGETHOSTCPUNAME - -/* Define to 1 if you have the declaration of `LLVMOrcGetSymbolAddressIn', and - to 0 if you don't. */ -#undef HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN - /* Define to 1 if you have the declaration of `posix_fadvise', and to 0 if you don't. */ #undef HAVE_DECL_POSIX_FADVISE @@ -131,6 +115,10 @@ don't. */ #undef HAVE_DECL_PWRITEV +/* Define to 1 if you have the declaration of `strchrnul', and to 0 if you + don't. */ +#undef HAVE_DECL_STRCHRNUL + /* Define to 1 if you have the declaration of `strlcat', and to 0 if you don't. */ #undef HAVE_DECL_STRLCAT @@ -298,9 +286,6 @@ /* Define to 1 if you have the `zstd' library (-lzstd). */ #undef HAVE_LIBZSTD -/* Define to 1 if the system has the type `locale_t'. */ -#undef HAVE_LOCALE_T - /* Define to 1 if `long int' works and is 64 bits. */ #undef HAVE_LONG_INT_64 @@ -403,8 +388,8 @@ /* Define to 1 if you have the `SSL_CTX_set_cert_cb' function. */ #undef HAVE_SSL_CTX_SET_CERT_CB -/* Define to 1 if stdbool.h conforms to C99. */ -#undef HAVE_STDBOOL_H +/* Define to 1 if you have the `SSL_CTX_set_num_tickets' function. */ +#undef HAVE_SSL_CTX_SET_NUM_TICKETS /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H @@ -412,9 +397,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H -/* Define to 1 if you have the `strchrnul' function. */ -#undef HAVE_STRCHRNUL - /* Define to 1 if you have the `strerror_r' function. */ #undef HAVE_STRERROR_R @@ -529,14 +511,11 @@ /* Define to 1 if you have the `X509_get_signature_info' function. */ #undef HAVE_X509_GET_SIGNATURE_INFO -/* Define to 1 if you have the `X509_get_signature_nid' function. */ -#undef HAVE_X509_GET_SIGNATURE_NID - /* Define to 1 if the assembler supports X86_64's POPCNTQ instruction. */ #undef HAVE_X86_64_POPCNTQ -/* Define to 1 if the system has the type `_Bool'. */ -#undef HAVE__BOOL +/* Define to 1 if you have XSAVE intrinsics. */ +#undef HAVE_XSAVE_INTRINSICS /* Define to 1 if your compiler understands __builtin_bswap16. */ #undef HAVE__BUILTIN_BSWAP16 @@ -577,9 +556,15 @@ /* Define to 1 if you have __cpuid. */ #undef HAVE__CPUID +/* Define to 1 if you have __cpuidex. */ +#undef HAVE__CPUIDEX + /* Define to 1 if you have __get_cpuid. */ #undef HAVE__GET_CPUID +/* Define to 1 if you have __get_cpuid_count. */ +#undef HAVE__GET_CPUID_COUNT + /* Define to 1 if your compiler understands _Static_assert. */ #undef HAVE__STATIC_ASSERT @@ -702,6 +687,9 @@ /* Define to 1 to build with assertion checks. (--enable-cassert) */ #undef USE_ASSERT_CHECKING +/* Define to 1 to use AVX-512 popcount instructions with a runtime check. */ +#undef USE_AVX512_POPCNT_WITH_RUNTIME_CHECK + /* Define to 1 to build with Bonjour support. (--with-bonjour) */ #undef USE_BONJOUR @@ -711,6 +699,9 @@ /* Define to build with ICU support. (--with-icu) */ #undef USE_ICU +/* Define to 1 to build with injection points. (--enable-injection-points) */ +#undef USE_INJECTION_POINTS + /* Define to 1 to build with LDAP support. (--with-ldap) */ #undef USE_LDAP @@ -724,6 +715,9 @@ /* Define to 1 to build with LLVM based JIT support. (--with-llvm) */ #undef USE_LLVM +/* Define to 1 to use LoongArch CRCC instructions. */ +#undef USE_LOONGARCH_CRC32C + /* Define to 1 to build with LZ4 support. (--with-lz4) */ #undef USE_LZ4 diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h index a1a93ad706e8c..f941ee2faf86b 100644 --- a/src/include/pg_config_manual.h +++ b/src/include/pg_config_manual.h @@ -6,7 +6,7 @@ * for developers. If you edit any of these, be sure to do a *full* * rebuild (and an initdb if noted). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/pg_config_manual.h @@ -217,13 +217,13 @@ #define DEFAULT_EVENT_SOURCE "PostgreSQL" /* - * Assumed cache line size. This doesn't affect correctness, but can be used - * for low-level optimizations. Currently, this is used to pad some data - * structures in xlog.c, to ensure that highly-contended fields are on - * different cache lines. Too small a value can hurt performance due to false - * sharing, while the only downside of too large a value is a few bytes of - * wasted memory. The default is 128, which should be large enough for all - * supported platforms. + * Assumed cache line size. This doesn't affect correctness, but can be used + * for low-level optimizations. This is mostly used to pad various data + * structures, to ensure that highly-contended fields are on different cache + * lines. Too small a value can hurt performance due to false sharing, while + * the only downside of too large a value is a few bytes of wasted memory. + * The default is 128, which should be large enough for all supported + * platforms. */ #define PG_CACHE_LINE_SIZE 128 @@ -240,6 +240,13 @@ *------------------------------------------------------------------------ */ +/* + * Force use of the non-recursive JSON parser in all cases. This is useful + * to validate the working of the parser, and the regression tests should + * pass except for some different error messages about the stack limit. + */ +/* #define FORCE_JSON_PSTACK */ + /* * Include Valgrind "client requests", mostly in the memory allocator, so * Valgrind understands PostgreSQL memory contexts. This permits detecting @@ -335,6 +342,12 @@ */ /* #define COPY_PARSE_PLAN_TREES */ +/* + * Define this to force Bitmapset reallocation on each modification. Helps + * to find dangling pointers to Bitmapset's. + */ +/* #define REALLOCATE_BITMAPSETS */ + /* * Define this to force all parse and plan trees to be passed through * outfuncs.c/readfuncs.c, to facilitate catching errors and omissions in diff --git a/src/include/pg_getopt.h b/src/include/pg_getopt.h index 252b4e193b9c1..c87ea20b14f0e 100644 --- a/src/include/pg_getopt.h +++ b/src/include/pg_getopt.h @@ -11,7 +11,7 @@ * Portions Copyright (c) 1987, 1993, 1994 * The Regents of the University of California. All rights reserved. * - * Portions Copyright (c) 2003-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2003-2024, PostgreSQL Global Development Group * * src/include/pg_getopt.h */ diff --git a/src/include/pg_trace.h b/src/include/pg_trace.h index c31bb4a746bf9..bae819ab4669d 100644 --- a/src/include/pg_trace.h +++ b/src/include/pg_trace.h @@ -3,7 +3,7 @@ * * Definitions for the PostgreSQL tracing framework * - * Copyright (c) 2006-2023, PostgreSQL Global Development Group + * Copyright (c) 2006-2024, PostgreSQL Global Development Group * * src/include/pg_trace.h * ---------- diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 57a2c0866a2f5..2136239710e33 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -3,7 +3,7 @@ * * Definitions for the PostgreSQL cumulative statistics system. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * src/include/pgstat.h * ---------- @@ -62,7 +62,7 @@ typedef enum TrackFunctionsLevel { TRACK_FUNC_OFF, TRACK_FUNC_PL, - TRACK_FUNC_ALL + TRACK_FUNC_ALL, } TrackFunctionsLevel; typedef enum PgStat_FetchConsistency @@ -79,7 +79,7 @@ typedef enum SessionEndType DISCONNECT_NORMAL, DISCONNECT_CLIENT_EOF, DISCONNECT_FATAL, - DISCONNECT_KILLED + DISCONNECT_KILLED, } SessionEndType; /* ---------- @@ -260,13 +260,15 @@ typedef struct PgStat_BgWriterStats typedef struct PgStat_CheckpointerStats { - PgStat_Counter timed_checkpoints; - PgStat_Counter requested_checkpoints; - PgStat_Counter checkpoint_write_time; /* times in milliseconds */ - PgStat_Counter checkpoint_sync_time; - PgStat_Counter buf_written_checkpoints; - PgStat_Counter buf_written_backend; - PgStat_Counter buf_fsync_backend; + PgStat_Counter num_timed; + PgStat_Counter num_requested; + PgStat_Counter restartpoints_timed; + PgStat_Counter restartpoints_requested; + PgStat_Counter restartpoints_performed; + PgStat_Counter write_time; /* times in milliseconds */ + PgStat_Counter sync_time; + PgStat_Counter buffers_written; + TimestampTz stat_reset_timestamp; } PgStat_CheckpointerStats; @@ -520,7 +522,7 @@ extern bool pgstat_bktype_io_stats_valid(PgStat_BktypeIO *backend_io, BackendType bktype); extern void pgstat_count_io_op(IOObject io_object, IOContext io_context, IOOp io_op); extern void pgstat_count_io_op_n(IOObject io_object, IOContext io_context, IOOp io_op, uint32 cnt); -extern instr_time pgstat_prepare_io_time(void); +extern instr_time pgstat_prepare_io_time(bool track_io_guc); extern void pgstat_count_io_op_time(IOObject io_object, IOContext io_context, IOOp io_op, instr_time start_time, uint32 cnt); diff --git a/src/include/pgtar.h b/src/include/pgtar.h index 661f9d7c59f10..b1ca71a673474 100644 --- a/src/include/pgtar.h +++ b/src/include/pgtar.h @@ -4,7 +4,7 @@ * Functions for manipulating tarfile datastructures (src/port/tar.c) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/pgtar.h @@ -20,7 +20,46 @@ enum tarError { TAR_OK = 0, TAR_NAME_TOO_LONG, - TAR_SYMLINK_TOO_LONG + TAR_SYMLINK_TOO_LONG, +}; + +/* + * Offsets of fields within a 512-byte tar header. + * + * "tar number" values should be generated using print_tar_number() and can be + * read using read_tar_number(). Fields that contain strings are generally + * both filled and read using strlcpy(). + * + * The value for the checksum field can be computed using tarChecksum(). + * + * Some fields are not used by PostgreSQL; see tarCreateHeader(). + */ +enum tarHeaderOffset +{ + TAR_OFFSET_NAME = 0, /* 100 byte string */ + TAR_OFFSET_MODE = 100, /* 8 byte tar number, excludes S_IFMT */ + TAR_OFFSET_UID = 108, /* 8 byte tar number */ + TAR_OFFSET_GID = 116, /* 8 byte tar number */ + TAR_OFFSET_SIZE = 124, /* 8 byte tar number */ + TAR_OFFSET_MTIME = 136, /* 12 byte tar number */ + TAR_OFFSET_CHECKSUM = 148, /* 8 byte tar number */ + TAR_OFFSET_TYPEFLAG = 156, /* 1 byte file type, see TAR_FILETYPE_* */ + TAR_OFFSET_LINKNAME = 157, /* 100 byte string */ + TAR_OFFSET_MAGIC = 257, /* "ustar" with terminating zero byte */ + TAR_OFFSET_VERSION = 263, /* "00" */ + TAR_OFFSET_UNAME = 265, /* 32 byte string */ + TAR_OFFSET_GNAME = 297, /* 32 byte string */ + TAR_OFFSET_DEVMAJOR = 329, /* 8 byte tar number */ + TAR_OFFSET_DEVMINOR = 337, /* 8 byte tar number */ + TAR_OFFSET_PREFIX = 345, /* 155 byte string */ + /* last 12 bytes of the 512-byte block are unassigned */ +}; + +enum tarFileType +{ + TAR_FILETYPE_PLAIN = '0', + TAR_FILETYPE_SYMLINK = '2', + TAR_FILETYPE_DIRECTORY = '5', }; extern enum tarError tarCreateHeader(char *h, const char *filename, diff --git a/src/include/pgtime.h b/src/include/pgtime.h index 9d4b2efe942b6..27420867110cb 100644 --- a/src/include/pgtime.h +++ b/src/include/pgtime.h @@ -3,7 +3,7 @@ * pgtime.h * PostgreSQL internal timezone library * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/pgtime.h diff --git a/src/include/port.h b/src/include/port.h index a88d403483eab..85cf26c752112 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -3,7 +3,7 @@ * port.h * Header for src/port/ compatibility functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/port.h @@ -53,6 +53,7 @@ extern char *first_path_var_separator(const char *pathlist); extern void join_path_components(char *ret_path, const char *head, const char *tail); extern void canonicalize_path(char *path); +extern void canonicalize_path_enc(char *path, int encoding); extern void make_native_path(char *filename); extern void cleanup_path(char *path); extern bool path_contains_parent_reference(const char *path); @@ -137,7 +138,7 @@ extern int validate_exec(const char *path); extern int find_my_exec(const char *argv0, char *retpath); extern int find_other_exec(const char *argv0, const char *target, const char *versionstr, char *retpath); -extern char *pipe_read_line(char *cmd, char *line, int maxsize); +extern char *pipe_read_line(char *cmd); /* Doesn't belong here, but this is used with find_other_exec(), so... */ #define PG_BACKEND_VERSIONSTR "postgres (PostgreSQL) " PG_VERSION "\n" @@ -306,6 +307,33 @@ extern bool rmtree(const char *path, bool rmtopdir); #if defined(WIN32) && !defined(__CYGWIN__) +/* + * We want the 64-bit variant of lseek(). + * + * For Visual Studio, this must be after to avoid messing up its + * lseek() and _lseeki64() function declarations. + * + * For MinGW there is already a macro, so we have to undefine it (depending on + * _FILE_OFFSET_BITS, it may point at its own lseek64, but we don't want to + * count on that being set). + */ +#undef lseek +#define lseek(a,b,c) _lseeki64((a),(b),(c)) + +/* + * We want the 64-bit variant of chsize(). It sets errno and also returns it, + * so convert non-zero result to -1 to match POSIX. + * + * Prevent MinGW from declaring functions, and undefine its macro before we + * define our own. + */ +#ifndef _MSC_VER +#define FTRUNCATE_DEFINED +#include +#undef ftruncate +#endif +#define ftruncate(a,b) (_chsize_s((a),(b)) == 0 ? 0 : -1) + /* * open() and fopen() replacements to allow deletion of open files and * passing of other special options. @@ -432,12 +460,16 @@ extern size_t strlcpy(char *dst, const char *src, size_t siz); extern size_t strnlen(const char *str, size_t maxlen); #endif -/* thread.c */ +/* port/user.c */ #ifndef WIN32 extern bool pg_get_user_name(uid_t user_id, char *buffer, size_t buflen); extern bool pg_get_user_home_dir(uid_t user_id, char *buffer, size_t buflen); #endif +/* + * Callers should use the qsort() macro defined below instead of calling + * pg_qsort() directly. + */ extern void pg_qsort(void *base, size_t nel, size_t elsize, int (*cmp) (const void *, const void *)); extern int pg_qsort_strcmp(const void *a, const void *b); @@ -484,7 +516,10 @@ extern int pg_check_dir(const char *dir); /* port/pgmkdirp.c */ extern int pg_mkdir_p(char *path, int omode); -/* port/pqsignal.c */ +/* port/pqsignal.c (see also interfaces/libpq/legacy-pqsignal.c) */ +#ifdef FRONTEND +#define pqsignal pqsignal_fe +#endif typedef void (*pqsigfunc) (SIGNAL_ARGS); extern pqsigfunc pqsignal(int signo, pqsigfunc func); diff --git a/src/include/port/aix.h b/src/include/port/aix.h deleted file mode 100644 index 5b1159c578574..0000000000000 --- a/src/include/port/aix.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * src/include/port/aix.h - */ -#define CLASS_CONFLICT -#define DISABLE_XOPEN_NLS - -/* - * "IBM XL C/C++ for AIX, V12.1" miscompiles, for 32-bit, some inline - * expansions of ginCompareItemPointers() "long long" arithmetic. To take - * advantage of inlining, build a 64-bit PostgreSQL. - */ -#if defined(__ILP32__) && defined(__IBMC__) -#define PG_FORCE_DISABLE_INLINE -#endif diff --git a/src/include/port/atomics.h b/src/include/port/atomics.h index bbff945ebad0f..36a9b0925e131 100644 --- a/src/include/port/atomics.h +++ b/src/include/port/atomics.h @@ -28,7 +28,7 @@ * For an introduction to using memory barriers within the PostgreSQL backend, * see src/backend/storage/lmgr/README.barrier * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/port/atomics.h @@ -84,11 +84,9 @@ * using compiler intrinsics are a good idea. */ /* - * gcc or compatible, including clang and icc. Exclude xlc. The ppc64le "IBM - * XL C/C++ for Linux, V13.1.2" emulates gcc, but __sync_lock_test_and_set() - * of one-byte types elicits SIGSEGV. That bug was gone by V13.1.5 (2016-12). + * gcc or compatible, including clang and icc. */ -#if (defined(__GNUC__) || defined(__INTEL_COMPILER)) && !(defined(__IBMC__) || defined(__IBMCPP__)) +#if defined(__GNUC__) || defined(__INTEL_COMPILER) #include "port/atomics/generic-gcc.h" #elif defined(_MSC_VER) #include "port/atomics/generic-msvc.h" @@ -239,6 +237,26 @@ pg_atomic_read_u32(volatile pg_atomic_uint32 *ptr) return pg_atomic_read_u32_impl(ptr); } +/* + * pg_atomic_read_membarrier_u32 - read with barrier semantics. + * + * This read is guaranteed to return the current value, provided that the value + * is only ever updated via operations with barrier semantics, such as + * pg_atomic_compare_exchange_u32() and pg_atomic_write_membarrier_u32(). + * While this may be less performant than pg_atomic_read_u32(), it may be + * easier to reason about correctness with this function in less performance- + * sensitive code. + * + * Full barrier semantics. + */ +static inline uint32 +pg_atomic_read_membarrier_u32(volatile pg_atomic_uint32 *ptr) +{ + AssertPointerAlignment(ptr, 4); + + return pg_atomic_read_membarrier_u32_impl(ptr); +} + /* * pg_atomic_write_u32 - write to atomic variable. * @@ -276,6 +294,26 @@ pg_atomic_unlocked_write_u32(volatile pg_atomic_uint32 *ptr, uint32 val) pg_atomic_unlocked_write_u32_impl(ptr, val); } +/* + * pg_atomic_write_membarrier_u32 - write with barrier semantics. + * + * The write is guaranteed to succeed as a whole, i.e., it's not possible to + * observe a partial write for any reader. Note that this correctly interacts + * with both pg_atomic_compare_exchange_u32() and + * pg_atomic_read_membarrier_u32(). While this may be less performant than + * pg_atomic_write_u32(), it may be easier to reason about correctness with + * this function in less performance-sensitive code. + * + * Full barrier semantics. + */ +static inline void +pg_atomic_write_membarrier_u32(volatile pg_atomic_uint32 *ptr, uint32 val) +{ + AssertPointerAlignment(ptr, 4); + + pg_atomic_write_membarrier_u32_impl(ptr, val); +} + /* * pg_atomic_exchange_u32 - exchange newval with current value * @@ -429,6 +467,15 @@ pg_atomic_read_u64(volatile pg_atomic_uint64 *ptr) return pg_atomic_read_u64_impl(ptr); } +static inline uint64 +pg_atomic_read_membarrier_u64(volatile pg_atomic_uint64 *ptr) +{ +#ifndef PG_HAVE_ATOMIC_U64_SIMULATION + AssertPointerAlignment(ptr, 8); +#endif + return pg_atomic_read_membarrier_u64_impl(ptr); +} + static inline void pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val) { @@ -438,6 +485,15 @@ pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val) pg_atomic_write_u64_impl(ptr, val); } +static inline void +pg_atomic_write_membarrier_u64(volatile pg_atomic_uint64 *ptr, uint64 val) +{ +#ifndef PG_HAVE_ATOMIC_U64_SIMULATION + AssertPointerAlignment(ptr, 8); +#endif + pg_atomic_write_membarrier_u64_impl(ptr, val); +} + static inline uint64 pg_atomic_exchange_u64(volatile pg_atomic_uint64 *ptr, uint64 newval) { @@ -453,7 +509,6 @@ pg_atomic_compare_exchange_u64(volatile pg_atomic_uint64 *ptr, { #ifndef PG_HAVE_ATOMIC_U64_SIMULATION AssertPointerAlignment(ptr, 8); - AssertPointerAlignment(expected, 8); #endif return pg_atomic_compare_exchange_u64_impl(ptr, expected, newval); } @@ -514,6 +569,38 @@ pg_atomic_sub_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 sub_) return pg_atomic_sub_fetch_u64_impl(ptr, sub_); } +/* + * Monotonically advance the given variable using only atomic operations until + * it's at least the target value. Returns the latest value observed, which + * may or may not be the target value. + * + * Full barrier semantics (even when value is unchanged). + */ +static inline uint64 +pg_atomic_monotonic_advance_u64(volatile pg_atomic_uint64 *ptr, uint64 target) +{ + uint64 currval; + +#ifndef PG_HAVE_ATOMIC_U64_SIMULATION + AssertPointerAlignment(ptr, 8); +#endif + + currval = pg_atomic_read_u64_impl(ptr); + if (currval >= target) + { + pg_memory_barrier(); + return currval; + } + + while (currval < target) + { + if (pg_atomic_compare_exchange_u64(ptr, &currval, target)) + return target; + } + + return currval; +} + #undef INSIDE_ATOMICS_H #endif /* ATOMICS_H */ diff --git a/src/include/port/atomics/arch-arm.h b/src/include/port/atomics/arch-arm.h index c90bf58029cbe..3ca2dbbd2da6d 100644 --- a/src/include/port/atomics/arch-arm.h +++ b/src/include/port/atomics/arch-arm.h @@ -3,7 +3,7 @@ * arch-arm.h * Atomic operations considerations specific to ARM * - * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group * * NOTES: * diff --git a/src/include/port/atomics/arch-hppa.h b/src/include/port/atomics/arch-hppa.h index 4c89fbff71992..50812a7f31788 100644 --- a/src/include/port/atomics/arch-hppa.h +++ b/src/include/port/atomics/arch-hppa.h @@ -3,7 +3,7 @@ * arch-hppa.h * Atomic operations considerations specific to HPPA * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * NOTES: diff --git a/src/include/port/atomics/arch-ppc.h b/src/include/port/atomics/arch-ppc.h index d992d4c8a265b..edaab7c8957fc 100644 --- a/src/include/port/atomics/arch-ppc.h +++ b/src/include/port/atomics/arch-ppc.h @@ -3,7 +3,7 @@ * arch-ppc.h * Atomic operations considerations specific to PowerPC * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * NOTES: @@ -173,6 +173,8 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint32 condition_register; bool ret; + AssertPointerAlignment(expected, 8); + /* Like u32, but s/lwarx/ldarx/; s/stwcx/stdcx/; s/cmpw/cmpd/ */ #ifdef HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P if (__builtin_constant_p(*expected) && diff --git a/src/include/port/atomics/arch-x86.h b/src/include/port/atomics/arch-x86.h index bb84b9bad8386..2a8eca30fcf9d 100644 --- a/src/include/port/atomics/arch-x86.h +++ b/src/include/port/atomics/arch-x86.h @@ -7,7 +7,7 @@ * support for xadd and cmpxchg. Given that the 386 isn't supported anywhere * anymore that's not much of a restriction luckily. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * NOTES: @@ -207,6 +207,8 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, { char ret; + AssertPointerAlignment(expected, 8); + /* * Perform cmpxchg and use the zero flag which it implicitly sets when * equal to measure the success. diff --git a/src/include/port/atomics/fallback.h b/src/include/port/atomics/fallback.h index a9e8e77c036ce..71c1df5d28ce7 100644 --- a/src/include/port/atomics/fallback.h +++ b/src/include/port/atomics/fallback.h @@ -4,7 +4,7 @@ * Fallback for platforms without spinlock and/or atomics support. Slower * than native atomics support, but not unusably slow. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/port/atomics/fallback.h diff --git a/src/include/port/atomics/generic-gcc.h b/src/include/port/atomics/generic-gcc.h index da04e9f0dc3a6..872d2f02af4a2 100644 --- a/src/include/port/atomics/generic-gcc.h +++ b/src/include/port/atomics/generic-gcc.h @@ -3,7 +3,7 @@ * generic-gcc.h * Atomic operations, implemented using gcc (or compatible) intrinsics. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * NOTES: @@ -176,6 +176,23 @@ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, } #endif +/* + * __sync_lock_test_and_set() only supports setting the value to 1 on some + * platforms, so we only provide an __atomic implementation for + * pg_atomic_exchange. + * + * We assume the availability of 32-bit __atomic_compare_exchange_n() implies + * the availability of 32-bit __atomic_exchange_n(). + */ +#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U32) && defined(HAVE_GCC__ATOMIC_INT32_CAS) +#define PG_HAVE_ATOMIC_EXCHANGE_U32 +static inline uint32 +pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval) +{ + return __atomic_exchange_n(&ptr->value, newval, __ATOMIC_SEQ_CST); +} +#endif + /* if we have 32-bit __sync_val_compare_and_swap, assume we have these too: */ #if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U32) && defined(HAVE_GCC__SYNC_INT32_CAS) @@ -223,6 +240,7 @@ static inline bool pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 *expected, uint64 newval) { + AssertPointerAlignment(expected, 8); return __atomic_compare_exchange_n(&ptr->value, expected, newval, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); } @@ -236,6 +254,8 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, { bool ret; uint64 current; + + AssertPointerAlignment(expected, 8); current = __sync_val_compare_and_swap(&ptr->value, *expected, newval); ret = current == *expected; *expected = current; @@ -243,6 +263,23 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, } #endif +/* + * __sync_lock_test_and_set() only supports setting the value to 1 on some + * platforms, so we only provide an __atomic implementation for + * pg_atomic_exchange. + * + * We assume the availability of 64-bit __atomic_compare_exchange_n() implies + * the availability of 64-bit __atomic_exchange_n(). + */ +#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U64) && defined(HAVE_GCC__ATOMIC_INT64_CAS) +#define PG_HAVE_ATOMIC_EXCHANGE_U64 +static inline uint64 +pg_atomic_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 newval) +{ + return __atomic_exchange_n(&ptr->value, newval, __ATOMIC_SEQ_CST); +} +#endif + /* if we have 64-bit __sync_val_compare_and_swap, assume we have these too: */ #if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U64) && defined(HAVE_GCC__SYNC_INT64_CAS) diff --git a/src/include/port/atomics/generic-msvc.h b/src/include/port/atomics/generic-msvc.h index 8835f4ceea81f..c013aca5e7cfd 100644 --- a/src/include/port/atomics/generic-msvc.h +++ b/src/include/port/atomics/generic-msvc.h @@ -3,7 +3,7 @@ * generic-msvc.h * Atomic operations support when using MSVC * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * NOTES: @@ -58,6 +58,13 @@ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, return ret; } +#define PG_HAVE_ATOMIC_EXCHANGE_U32 +static inline uint32 +pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval) +{ + return InterlockedExchange(&ptr->value, newval); +} + #define PG_HAVE_ATOMIC_FETCH_ADD_U32 static inline uint32 pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_) @@ -88,6 +95,16 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, /* Only implemented on 64bit builds */ #ifdef _WIN64 + +#pragma intrinsic(_InterlockedExchange64) + +#define PG_HAVE_ATOMIC_EXCHANGE_U64 +static inline uint64 +pg_atomic_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 newval) +{ + return _InterlockedExchange64(&ptr->value, newval); +} + #pragma intrinsic(_InterlockedExchangeAdd64) #define PG_HAVE_ATOMIC_FETCH_ADD_U64 @@ -96,6 +113,7 @@ pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_) { return _InterlockedExchangeAdd64(&ptr->value, add_); } + #endif /* _WIN64 */ #endif /* HAVE_ATOMICS */ diff --git a/src/include/port/atomics/generic-sunpro.h b/src/include/port/atomics/generic-sunpro.h index 30f7d8b5362a2..840a45e7788c7 100644 --- a/src/include/port/atomics/generic-sunpro.h +++ b/src/include/port/atomics/generic-sunpro.h @@ -3,7 +3,7 @@ * generic-sunpro.h * Atomic operations for solaris' CC * - * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group * * NOTES: * @@ -87,6 +87,13 @@ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, return ret; } +#define PG_HAVE_ATOMIC_EXCHANGE_U32 +static inline uint32 +pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 newval) +{ + return atomic_swap_32(&ptr->value, newval); +} + #define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64 static inline bool pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, @@ -95,12 +102,20 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, bool ret; uint64 current; + AssertPointerAlignment(expected, 8); current = atomic_cas_64(&ptr->value, *expected, newval); ret = current == *expected; *expected = current; return ret; } +#define PG_HAVE_ATOMIC_EXCHANGE_U64 +static inline uint64 +pg_atomic_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 newval) +{ + return atomic_swap_64(&ptr->value, newval); +} + #endif /* HAVE_ATOMIC_H */ #endif /* defined(HAVE_ATOMICS) */ diff --git a/src/include/port/atomics/generic.h b/src/include/port/atomics/generic.h index cb5804adbf949..6113ab62a31ad 100644 --- a/src/include/port/atomics/generic.h +++ b/src/include/port/atomics/generic.h @@ -4,7 +4,7 @@ * Implement higher level operations based on some lower level atomic * operations. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/port/atomics/generic.h @@ -83,7 +83,7 @@ pg_atomic_init_flag_impl(volatile pg_atomic_flag *ptr) static inline bool pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr) { - return pg_atomic_exchange_u32_impl(ptr, &value, 1) == 0; + return pg_atomic_exchange_u32_impl(ptr, 1) == 0; } #define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG @@ -243,6 +243,24 @@ pg_atomic_sub_fetch_u32_impl(volatile pg_atomic_uint32 *ptr, int32 sub_) } #endif +#if !defined(PG_HAVE_ATOMIC_READ_MEMBARRIER_U32) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U32) +#define PG_HAVE_ATOMIC_READ_MEMBARRIER_U32 +static inline uint32 +pg_atomic_read_membarrier_u32_impl(volatile pg_atomic_uint32 *ptr) +{ + return pg_atomic_fetch_add_u32_impl(ptr, 0); +} +#endif + +#if !defined(PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U32) && defined(PG_HAVE_ATOMIC_EXCHANGE_U32) +#define PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U32 +static inline void +pg_atomic_write_membarrier_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val) +{ + (void) pg_atomic_exchange_u32_impl(ptr, val); +} +#endif + #if !defined(PG_HAVE_ATOMIC_EXCHANGE_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64) #define PG_HAVE_ATOMIC_EXCHANGE_U64 static inline uint64 @@ -399,3 +417,21 @@ pg_atomic_sub_fetch_u64_impl(volatile pg_atomic_uint64 *ptr, int64 sub_) return pg_atomic_fetch_sub_u64_impl(ptr, sub_) - sub_; } #endif + +#if !defined(PG_HAVE_ATOMIC_READ_MEMBARRIER_U64) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U64) +#define PG_HAVE_ATOMIC_READ_MEMBARRIER_U64 +static inline uint64 +pg_atomic_read_membarrier_u64_impl(volatile pg_atomic_uint64 *ptr) +{ + return pg_atomic_fetch_add_u64_impl(ptr, 0); +} +#endif + +#if !defined(PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U64) && defined(PG_HAVE_ATOMIC_EXCHANGE_U64) +#define PG_HAVE_ATOMIC_WRITE_MEMBARRIER_U64 +static inline void +pg_atomic_write_membarrier_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val) +{ + (void) pg_atomic_exchange_u64_impl(ptr, val); +} +#endif diff --git a/src/include/port/freebsd.h b/src/include/port/freebsd.h index 0e3fde55d6d9a..c604187acdd3a 100644 --- a/src/include/port/freebsd.h +++ b/src/include/port/freebsd.h @@ -5,4 +5,4 @@ * would prefer open_datasync on FreeBSD 13+, but that is not a good choice on * many systems. */ -#define PLATFORM_DEFAULT_SYNC_METHOD SYNC_METHOD_FDATASYNC +#define PLATFORM_DEFAULT_WAL_SYNC_METHOD WAL_SYNC_METHOD_FDATASYNC diff --git a/src/include/port/linux.h b/src/include/port/linux.h index 7a6e46cdbb787..8101af2b93f55 100644 --- a/src/include/port/linux.h +++ b/src/include/port/linux.h @@ -19,4 +19,4 @@ * perform better and (b) causes outright failures on ext4 data=journal * filesystems, because those don't support O_DIRECT. */ -#define PLATFORM_DEFAULT_SYNC_METHOD SYNC_METHOD_FDATASYNC +#define PLATFORM_DEFAULT_WAL_SYNC_METHOD WAL_SYNC_METHOD_FDATASYNC diff --git a/src/include/port/pg_bitutils.h b/src/include/port/pg_bitutils.h index 21a4fa0341059..4d88478c9c24d 100644 --- a/src/include/port/pg_bitutils.h +++ b/src/include/port/pg_bitutils.h @@ -4,7 +4,7 @@ * Miscellaneous functions for bit-wise operations. * * - * Copyright (c) 2019-2023, PostgreSQL Global Development Group + * Copyright (c) 2019-2024, PostgreSQL Global Development Group * * src/include/port/pg_bitutils.h * @@ -48,8 +48,9 @@ pg_leftmost_one_pos32(uint32 word) unsigned long result; bool non_zero; + Assert(word != 0); + non_zero = _BitScanReverse(&result, word); - Assert(non_zero); return (int) result; #else int shift = 32 - 8; @@ -85,8 +86,9 @@ pg_leftmost_one_pos64(uint64 word) unsigned long result; bool non_zero; + Assert(word != 0); + non_zero = _BitScanReverse64(&result, word); - Assert(non_zero); return (int) result; #else int shift = 64 - 8; @@ -116,8 +118,9 @@ pg_rightmost_one_pos32(uint32 word) unsigned long result; bool non_zero; + Assert(word != 0); + non_zero = _BitScanForward(&result, word); - Assert(non_zero); return (int) result; #else int result = 0; @@ -156,8 +159,9 @@ pg_rightmost_one_pos64(uint64 word) unsigned long result; bool non_zero; + Assert(word != 0); + non_zero = _BitScanForward64(&result, word); - Assert(non_zero); return (int) result; #else int result = 0; @@ -296,18 +300,96 @@ pg_ceil_log2_64(uint64 num) #ifdef TRY_POPCNT_FAST /* Attempt to use the POPCNT instruction, but perform a runtime check first */ -extern int (*pg_popcount32) (uint32 word); -extern int (*pg_popcount64) (uint64 word); +extern PGDLLIMPORT int (*pg_popcount32) (uint32 word); +extern PGDLLIMPORT int (*pg_popcount64) (uint64 word); +extern PGDLLIMPORT uint64 (*pg_popcount_optimized) (const char *buf, int bytes); +extern PGDLLIMPORT uint64 (*pg_popcount_masked_optimized) (const char *buf, int bytes, bits8 mask); + +/* + * We can also try to use the AVX-512 popcount instruction on some systems. + * The implementation of that is located in its own file because it may + * require special compiler flags that we don't want to apply to any other + * files. + */ +#ifdef USE_AVX512_POPCNT_WITH_RUNTIME_CHECK +extern bool pg_popcount_avx512_available(void); +extern uint64 pg_popcount_avx512(const char *buf, int bytes); +extern uint64 pg_popcount_masked_avx512(const char *buf, int bytes, bits8 mask); +#endif #else /* Use a portable implementation -- no need for a function pointer. */ extern int pg_popcount32(uint32 word); extern int pg_popcount64(uint64 word); +extern uint64 pg_popcount_optimized(const char *buf, int bytes); +extern uint64 pg_popcount_masked_optimized(const char *buf, int bytes, bits8 mask); #endif /* TRY_POPCNT_FAST */ -/* Count the number of one-bits in a byte array */ -extern uint64 pg_popcount(const char *buf, int bytes); +/* + * Returns the number of 1-bits in buf. + * + * If there aren't many bytes to process, the function call overhead of the + * optimized versions isn't worth taking, so we inline a loop that consults + * pg_number_of_ones in that case. If there are many bytes to process, we + * accept the function call overhead because the optimized versions are likely + * to be faster. + */ +static inline uint64 +pg_popcount(const char *buf, int bytes) +{ + /* + * We set the threshold to the point at which we'll first use special + * instructions in the optimized version. + */ +#if SIZEOF_VOID_P >= 8 + int threshold = 8; +#else + int threshold = 4; +#endif + + if (bytes < threshold) + { + uint64 popcnt = 0; + + while (bytes--) + popcnt += pg_number_of_ones[(unsigned char) *buf++]; + return popcnt; + } + + return pg_popcount_optimized(buf, bytes); +} + +/* + * Returns the number of 1-bits in buf after applying the mask to each byte. + * + * Similar to pg_popcount(), we only take on the function pointer overhead when + * it's likely to be faster. + */ +static inline uint64 +pg_popcount_masked(const char *buf, int bytes, bits8 mask) +{ + /* + * We set the threshold to the point at which we'll first use special + * instructions in the optimized version. + */ +#if SIZEOF_VOID_P >= 8 + int threshold = 8; +#else + int threshold = 4; +#endif + + if (bytes < threshold) + { + uint64 popcnt = 0; + + while (bytes--) + popcnt += pg_number_of_ones[(unsigned char) *buf++ & mask]; + return popcnt; + } + + return pg_popcount_masked_optimized(buf, bytes, mask); +} /* * Rotate the bits of "word" to the right/left by n bits. diff --git a/src/include/port/pg_bswap.h b/src/include/port/pg_bswap.h index 80abd750d41b3..2379513f6570c 100644 --- a/src/include/port/pg_bswap.h +++ b/src/include/port/pg_bswap.h @@ -11,7 +11,7 @@ * return the same. Use caution when using these wrapper macros with signed * integers. * - * Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Copyright (c) 2015-2024, PostgreSQL Global Development Group * * src/include/port/pg_bswap.h * diff --git a/src/include/port/pg_crc32c.h b/src/include/port/pg_crc32c.h index 7f8779261c3c9..63c8e3a00b638 100644 --- a/src/include/port/pg_crc32c.h +++ b/src/include/port/pg_crc32c.h @@ -23,7 +23,7 @@ * EQ_CRC32C(c1, c2) * Check for equality of two CRCs. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/port/pg_crc32c.h @@ -58,6 +58,15 @@ extern pg_crc32c pg_comp_crc32c_sse42(pg_crc32c crc, const void *data, size_t le extern pg_crc32c pg_comp_crc32c_armv8(pg_crc32c crc, const void *data, size_t len); +#elif defined(USE_LOONGARCH_CRC32C) +/* Use LoongArch CRCC instructions. */ + +#define COMP_CRC32C(crc, data, len) \ + ((crc) = pg_comp_crc32c_loongarch((crc), (data), (len))) +#define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF) + +extern pg_crc32c pg_comp_crc32c_loongarch(pg_crc32c crc, const void *data, size_t len); + #elif defined(USE_SSE42_CRC32C_WITH_RUNTIME_CHECK) || defined(USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK) /* diff --git a/src/include/port/pg_iovec.h b/src/include/port/pg_iovec.h index 689799c425801..e5fe677b3711e 100644 --- a/src/include/port/pg_iovec.h +++ b/src/include/port/pg_iovec.h @@ -3,7 +3,7 @@ * pg_iovec.h * Header for vectored I/O functions, to use in place of . * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/port/pg_iovec.h @@ -17,6 +17,7 @@ #include #include +#include #else @@ -36,20 +37,81 @@ struct iovec #define PG_IOV_MAX Min(IOV_MAX, 32) /* - * Note that pg_preadv and pg_pwritev have a pg_ prefix as a warning that the - * Windows implementations have the side-effect of changing the file position. + * Like preadv(), but with a prefix to remind us of a side-effect: on Windows + * this changes the current file position. */ - +static inline ssize_t +pg_preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset) +{ #if HAVE_DECL_PREADV -#define pg_preadv preadv + /* + * Avoid a small amount of argument copying overhead in the kernel if + * there is only one iovec. + */ + if (iovcnt == 1) + return pread(fd, iov[0].iov_base, iov[0].iov_len, offset); + else + return preadv(fd, iov, iovcnt, offset); #else -extern ssize_t pg_preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset); + ssize_t sum = 0; + ssize_t part; + + for (int i = 0; i < iovcnt; ++i) + { + part = pg_pread(fd, iov[i].iov_base, iov[i].iov_len, offset); + if (part < 0) + { + if (i == 0) + return -1; + else + return sum; + } + sum += part; + offset += part; + if ((size_t) part < iov[i].iov_len) + return sum; + } + return sum; #endif +} +/* + * Like pwritev(), but with a prefix to remind us of a side-effect: on Windows + * this changes the current file position. + */ +static inline ssize_t +pg_pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset) +{ #if HAVE_DECL_PWRITEV -#define pg_pwritev pwritev + /* + * Avoid a small amount of argument copying overhead in the kernel if + * there is only one iovec. + */ + if (iovcnt == 1) + return pwrite(fd, iov[0].iov_base, iov[0].iov_len, offset); + else + return pwritev(fd, iov, iovcnt, offset); #else -extern ssize_t pg_pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset); + ssize_t sum = 0; + ssize_t part; + + for (int i = 0; i < iovcnt; ++i) + { + part = pg_pwrite(fd, iov[i].iov_base, iov[i].iov_len, offset); + if (part < 0) + { + if (i == 0) + return -1; + else + return sum; + } + sum += part; + offset += part; + if ((size_t) part < iov[i].iov_len) + return sum; + } + return sum; #endif +} #endif /* PG_IOVEC_H */ diff --git a/src/include/port/pg_lfind.h b/src/include/port/pg_lfind.h index 59aa8245edc33..4b1431ed00201 100644 --- a/src/include/port/pg_lfind.h +++ b/src/include/port/pg_lfind.h @@ -4,7 +4,7 @@ * Optimized linear search routines using SIMD intrinsics where * available. * - * Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/port/pg_lfind.h @@ -80,6 +80,69 @@ pg_lfind8_le(uint8 key, uint8 *base, uint32 nelem) return false; } +/* + * pg_lfind32_one_by_one_helper + * + * Searches the array of integers one-by-one. The caller is responsible for + * ensuring that there are at least "nelem" integers in the array. + */ +static inline bool +pg_lfind32_one_by_one_helper(uint32 key, const uint32 *base, uint32 nelem) +{ + for (uint32 i = 0; i < nelem; i++) + { + if (key == base[i]) + return true; + } + + return false; +} + +#ifndef USE_NO_SIMD +/* + * pg_lfind32_simd_helper + * + * Searches one 4-register-block of integers. The caller is responsible for + * ensuring that there are at least 4-registers-worth of integers remaining. + */ +static inline bool +pg_lfind32_simd_helper(const Vector32 keys, const uint32 *base) +{ + const uint32 nelem_per_vector = sizeof(Vector32) / sizeof(uint32); + Vector32 vals1, + vals2, + vals3, + vals4, + result1, + result2, + result3, + result4, + tmp1, + tmp2, + result; + + /* load the next block into 4 registers */ + vector32_load(&vals1, base); + vector32_load(&vals2, &base[nelem_per_vector]); + vector32_load(&vals3, &base[nelem_per_vector * 2]); + vector32_load(&vals4, &base[nelem_per_vector * 3]); + + /* compare each value to the key */ + result1 = vector32_eq(keys, vals1); + result2 = vector32_eq(keys, vals2); + result3 = vector32_eq(keys, vals3); + result4 = vector32_eq(keys, vals4); + + /* combine the results into a single variable */ + tmp1 = vector32_or(result1, result2); + tmp2 = vector32_or(result3, result4); + result = vector32_or(tmp1, tmp2); + + /* return whether there was a match */ + return vector32_is_highbit_set(result); +} +#endif /* ! USE_NO_SIMD */ + /* * pg_lfind32 * @@ -87,16 +150,14 @@ pg_lfind8_le(uint8 key, uint8 *base, uint32 nelem) * return false. */ static inline bool -pg_lfind32(uint32 key, uint32 *base, uint32 nelem) +pg_lfind32(uint32 key, const uint32 *base, uint32 nelem) { - uint32 i = 0; - #ifndef USE_NO_SIMD + uint32 i = 0; /* * For better instruction-level parallelism, each loop iteration operates - * on a block of four registers. Testing for SSE2 has showed this is ~40% - * faster than using a block of two registers. + * on a block of four registers. */ const Vector32 keys = vector32_broadcast(key); /* load copies of key */ const uint32 nelem_per_vector = sizeof(Vector32) / sizeof(uint32); @@ -106,75 +167,43 @@ pg_lfind32(uint32 key, uint32 *base, uint32 nelem) const uint32 tail_idx = nelem & ~(nelem_per_iteration - 1); #if defined(USE_ASSERT_CHECKING) - bool assert_result = false; - - /* pre-compute the result for assert checking */ - for (i = 0; i < nelem; i++) - { - if (key == base[i]) - { - assert_result = true; - break; - } - } + bool assert_result = pg_lfind32_one_by_one_helper(key, base, nelem); #endif - for (i = 0; i < tail_idx; i += nelem_per_iteration) - { - Vector32 vals1, - vals2, - vals3, - vals4, - result1, - result2, - result3, - result4, - tmp1, - tmp2, - result; - - /* load the next block into 4 registers */ - vector32_load(&vals1, &base[i]); - vector32_load(&vals2, &base[i + nelem_per_vector]); - vector32_load(&vals3, &base[i + nelem_per_vector * 2]); - vector32_load(&vals4, &base[i + nelem_per_vector * 3]); - - /* compare each value to the key */ - result1 = vector32_eq(keys, vals1); - result2 = vector32_eq(keys, vals2); - result3 = vector32_eq(keys, vals3); - result4 = vector32_eq(keys, vals4); - - /* combine the results into a single variable */ - tmp1 = vector32_or(result1, result2); - tmp2 = vector32_or(result3, result4); - result = vector32_or(tmp1, tmp2); - - /* see if there was a match */ - if (vector32_is_highbit_set(result)) - { - Assert(assert_result == true); - return true; - } - } -#endif /* ! USE_NO_SIMD */ + /* + * If there aren't enough elements for the SIMD code, use the standard + * one-by-one linear search code. + */ + if (nelem < nelem_per_iteration) + return pg_lfind32_one_by_one_helper(key, base, nelem); - /* Process the remaining elements one at a time. */ - for (; i < nelem; i++) + /* + * Process as many elements as possible with a block of 4 registers. + */ + do { - if (key == base[i]) + if (pg_lfind32_simd_helper(keys, &base[i])) { -#ifndef USE_NO_SIMD Assert(assert_result == true); -#endif return true; } - } -#ifndef USE_NO_SIMD - Assert(assert_result == false); + i += nelem_per_iteration; + + } while (i < tail_idx); + + /* + * Process the last 'nelem_per_iteration' elements in the array with a + * 4-register block. This will cause us to check a subset of the elements + * more than once, but that won't affect correctness, and testing has + * demonstrated that this helps more cases than it harms. + */ + Assert(assert_result == pg_lfind32_simd_helper(keys, &base[nelem - nelem_per_iteration])); + return pg_lfind32_simd_helper(keys, &base[nelem - nelem_per_iteration]); +#else + /* Process the elements one at a time. */ + return pg_lfind32_one_by_one_helper(key, base, nelem); #endif - return false; } #endif /* PG_LFIND_H */ diff --git a/src/include/port/simd.h b/src/include/port/simd.h index 1fa6c3bc6c496..597496f2fb7ed 100644 --- a/src/include/port/simd.h +++ b/src/include/port/simd.h @@ -3,7 +3,7 @@ * simd.h * Support for platform-specific vector operations. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/port/simd.h @@ -79,6 +79,7 @@ static inline bool vector8_has_le(const Vector8 v, const uint8 c); static inline bool vector8_is_highbit_set(const Vector8 v); #ifndef USE_NO_SIMD static inline bool vector32_is_highbit_set(const Vector32 v); +static inline uint32 vector8_highbit_mask(const Vector8 v); #endif /* arithmetic operations */ @@ -96,6 +97,7 @@ static inline Vector8 vector8_ssub(const Vector8 v1, const Vector8 v2); */ #ifndef USE_NO_SIMD static inline Vector8 vector8_eq(const Vector8 v1, const Vector8 v2); +static inline Vector8 vector8_min(const Vector8 v1, const Vector8 v2); static inline Vector32 vector32_eq(const Vector32 v1, const Vector32 v2); #endif @@ -299,6 +301,36 @@ vector32_is_highbit_set(const Vector32 v) } #endif /* ! USE_NO_SIMD */ +/* + * Return a bitmask formed from the high-bit of each element. + */ +#ifndef USE_NO_SIMD +static inline uint32 +vector8_highbit_mask(const Vector8 v) +{ +#ifdef USE_SSE2 + return (uint32) _mm_movemask_epi8(v); +#elif defined(USE_NEON) + /* + * Note: It would be faster to use vget_lane_u64 and vshrn_n_u16, but that + * returns a uint64, making it inconvenient to combine mask values from + * multiple vectors. + */ + static const uint8 mask[16] = { + 1 << 0, 1 << 1, 1 << 2, 1 << 3, + 1 << 4, 1 << 5, 1 << 6, 1 << 7, + 1 << 0, 1 << 1, 1 << 2, 1 << 3, + 1 << 4, 1 << 5, 1 << 6, 1 << 7, + }; + + uint8x16_t masked = vandq_u8(vld1q_u8(mask), (uint8x16_t) vshrq_n_s8((int8x16_t) v, 7)); + uint8x16_t maskedhi = vextq_u8(masked, masked, 8); + + return (uint32) vaddvq_u16((uint16x8_t) vzip1q_u8(masked, maskedhi)); +#endif +} +#endif /* ! USE_NO_SIMD */ + /* * Return the bitwise OR of the inputs */ @@ -372,4 +404,19 @@ vector32_eq(const Vector32 v1, const Vector32 v2) } #endif /* ! USE_NO_SIMD */ +/* + * Given two vectors, return a vector with the minimum element of each. + */ +#ifndef USE_NO_SIMD +static inline Vector8 +vector8_min(const Vector8 v1, const Vector8 v2) +{ +#ifdef USE_SSE2 + return _mm_min_epu8(v1, v2); +#elif defined(USE_NEON) + return vminq_u8(v1, v2); +#endif +} +#endif /* ! USE_NO_SIMD */ + #endif /* SIMD_H */ diff --git a/src/include/port/win32/sys/socket.h b/src/include/port/win32/sys/socket.h index 0c32c0f7b2ec3..f2b475df5e5e0 100644 --- a/src/include/port/win32/sys/socket.h +++ b/src/include/port/win32/sys/socket.h @@ -23,4 +23,12 @@ #define ERROR PGERROR #endif +/* + * We don't use the Windows gai_strerror[A] function because it is not + * thread-safe. We define our own in src/port/win32gai_strerror.c. + */ +#undef gai_strerror + +extern const char *gai_strerror(int ecode); + #endif /* WIN32_SYS_SOCKET_H */ diff --git a/src/include/port/win32_port.h b/src/include/port/win32_port.h index b957d5c598149..2d4d2c5868941 100644 --- a/src/include/port/win32_port.h +++ b/src/include/port/win32_port.h @@ -6,7 +6,7 @@ * Note this is read in MinGW as well as native Windows builds, * but not in Cygwin builds. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/port/win32_port.h @@ -79,19 +79,9 @@ /* Must be here to avoid conflicting with prototype in windows.h */ #define mkdir(a,b) mkdir(a) -#define ftruncate(a,b) chsize(a,b) - /* Windows doesn't have fsync() as such, use _commit() */ #define fsync(fd) _commit(fd) -/* - * For historical reasons, we allow setting wal_sync_method to - * fsync_writethrough on Windows, even though it's really identical to fsync - * (both code paths wind up at _commit()). - */ -#define HAVE_FSYNC_WRITETHROUGH -#define FSYNC_WRITETHROUGH_IS_FSYNC - #define USES_WINSOCK /* @@ -455,8 +445,6 @@ extern int _pglstat64(const char *name, struct stat *buf); #define strcoll_l _strcoll_l #define strxfrm_l _strxfrm_l #define wcscoll_l _wcscoll_l -#define wcstombs_l _wcstombs_l -#define mbstowcs_l _mbstowcs_l /* * Versions of libintl >= 0.18? try to replace setlocale() with a macro diff --git a/src/include/port/win32ntdll.h b/src/include/port/win32ntdll.h index 1ce9360ec125e..c8d22734832ca 100644 --- a/src/include/port/win32ntdll.h +++ b/src/include/port/win32ntdll.h @@ -3,7 +3,7 @@ * win32ntdll.h * Dynamically loaded Windows NT functions. * - * Portions Copyright (c) 2021-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2021-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/port/win32ntdll.h diff --git a/src/include/portability/instr_time.h b/src/include/portability/instr_time.h index cc85138e21faa..a6fc1922f2080 100644 --- a/src/include/portability/instr_time.h +++ b/src/include/portability/instr_time.h @@ -47,7 +47,7 @@ * Beware of multiple evaluations of the macro arguments. * * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * src/include/portability/instr_time.h * diff --git a/src/include/portability/mem.h b/src/include/portability/mem.h index 92c56225ae731..2cd05313b829c 100644 --- a/src/include/portability/mem.h +++ b/src/include/portability/mem.h @@ -3,7 +3,7 @@ * mem.h * portability definitions for various memory operations * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * src/include/portability/mem.h * diff --git a/src/include/postgres.h b/src/include/postgres.h index 8a028ff789bc8..5d5fd7813e808 100644 --- a/src/include/postgres.h +++ b/src/include/postgres.h @@ -7,7 +7,7 @@ * Client-side code should include postgres_fe.h instead. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1995, Regents of the University of California * * src/include/postgres.h diff --git a/src/include/postgres_fe.h b/src/include/postgres_fe.h index 5bc71dd0b377f..9c605daa3655b 100644 --- a/src/include/postgres_fe.h +++ b/src/include/postgres_fe.h @@ -8,7 +8,7 @@ * postgres.h. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1995, Regents of the University of California * * src/include/postgres_fe.h diff --git a/src/include/postmaster/autovacuum.h b/src/include/postmaster/autovacuum.h index 65afd1ea1e8f4..cae1e8b3294f2 100644 --- a/src/include/postmaster/autovacuum.h +++ b/src/include/postmaster/autovacuum.h @@ -4,7 +4,7 @@ * header file for integrated autovacuum daemon * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/postmaster/autovacuum.h @@ -22,7 +22,7 @@ */ typedef enum { - AVW_BRINSummarizeRange + AVW_BRINSummarizeRange, } AutoVacuumWorkItemType; @@ -49,26 +49,15 @@ extern PGDLLIMPORT int Log_autovacuum_min_duration; /* Status inquiry functions */ extern bool AutoVacuumingActive(void); -extern bool IsAutoVacuumLauncherProcess(void); -extern bool IsAutoVacuumWorkerProcess(void); -#define IsAnyAutoVacuumProcess() \ - (IsAutoVacuumLauncherProcess() || IsAutoVacuumWorkerProcess()) - -/* Functions to start autovacuum process, called from postmaster */ +/* called from postmaster at server startup */ extern void autovac_init(void); -extern int StartAutoVacLauncher(void); -extern int StartAutoVacWorker(void); /* called from postmaster when a worker could not be forked */ extern void AutoVacWorkerFailed(void); -#ifdef EXEC_BACKEND -extern void AutoVacLauncherMain(int argc, char *argv[]) pg_attribute_noreturn(); -extern void AutoVacWorkerMain(int argc, char *argv[]) pg_attribute_noreturn(); -extern void AutovacuumWorkerIAm(void); -extern void AutovacuumLauncherIAm(void); -#endif +extern void AutoVacLauncherMain(char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); +extern void AutoVacWorkerMain(char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); extern bool AutoVacuumRequestWork(AutoVacuumWorkItemType type, Oid relationId, BlockNumber blkno); diff --git a/src/include/postmaster/auxprocess.h b/src/include/postmaster/auxprocess.h index 5c2d6527ff62f..4e80b1cfec7f3 100644 --- a/src/include/postmaster/auxprocess.h +++ b/src/include/postmaster/auxprocess.h @@ -3,7 +3,7 @@ * include file for functions related to auxiliary processes. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -13,8 +13,6 @@ #ifndef AUXPROCESS_H #define AUXPROCESS_H -#include "miscadmin.h" - -extern void AuxiliaryProcessMain(AuxProcType auxtype) pg_attribute_noreturn(); +extern void AuxiliaryProcessMainCommon(void); #endif /* AUXPROCESS_H */ diff --git a/src/include/postmaster/bgworker.h b/src/include/postmaster/bgworker.h index 845d4498e65dd..22fc49ec27f4e 100644 --- a/src/include/postmaster/bgworker.h +++ b/src/include/postmaster/bgworker.h @@ -31,7 +31,7 @@ * different) code. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -78,7 +78,7 @@ typedef enum { BgWorkerStart_PostmasterStart, BgWorkerStart_ConsistentState, - BgWorkerStart_RecoveryFinished + BgWorkerStart_RecoveryFinished, } BgWorkerStartTime; #define BGW_DEFAULT_RESTART_INTERVAL 60 @@ -93,7 +93,7 @@ typedef struct BackgroundWorker int bgw_flags; BgWorkerStartTime bgw_start_time; int bgw_restart_time; /* in seconds, or BGW_NEVER_RESTART */ - char bgw_library_name[BGW_MAXLEN]; + char bgw_library_name[MAXPGPATH]; char bgw_function_name[BGW_MAXLEN]; Datum bgw_main_arg; char bgw_extra[BGW_EXTRALEN]; @@ -105,7 +105,7 @@ typedef enum BgwHandleStatus BGWH_STARTED, /* worker is running */ BGWH_NOT_YET_STARTED, /* worker hasn't been started yet */ BGWH_STOPPED, /* worker has exited */ - BGWH_POSTMASTER_DIED /* postmaster died; worker status unclear */ + BGWH_POSTMASTER_DIED, /* postmaster died; worker status unclear */ } BgwHandleStatus; struct BackgroundWorkerHandle; @@ -150,9 +150,11 @@ extern void BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid, ui * Flags to BackgroundWorkerInitializeConnection et al * * - * Allow bypassing datallowconn restrictions when connecting to database + * Allow bypassing datallowconn restrictions and login check when connecting + * to database */ -#define BGWORKER_BYPASS_ALLOWCONN 1 +#define BGWORKER_BYPASS_ALLOWCONN 0x0001 +#define BGWORKER_BYPASS_ROLELOGINCHECK 0x0002 /* Block/unblock signals in a background worker process */ diff --git a/src/include/postmaster/bgworker_internals.h b/src/include/postmaster/bgworker_internals.h index 4ad63fd9bd7f9..9106a0ef3f08e 100644 --- a/src/include/postmaster/bgworker_internals.h +++ b/src/include/postmaster/bgworker_internals.h @@ -2,7 +2,7 @@ * bgworker_internals.h * POSTGRES pluggable background workers internals * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -54,11 +54,7 @@ extern void BackgroundWorkerStopNotifications(pid_t pid); extern void ForgetUnstartedBackgroundWorkers(void); extern void ResetBackgroundWorkerCrashTimes(void); -/* Function to start a background worker, called from postmaster.c */ -extern void StartBackgroundWorker(void) pg_attribute_noreturn(); - -#ifdef EXEC_BACKEND -extern BackgroundWorker *BackgroundWorkerEntry(int slotno); -#endif +/* Entry point for background worker processes */ +extern void BackgroundWorkerMain(char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); #endif /* BGWORKER_INTERNALS_H */ diff --git a/src/include/postmaster/bgwriter.h b/src/include/postmaster/bgwriter.h index a66722873f426..407f26e53025f 100644 --- a/src/include/postmaster/bgwriter.h +++ b/src/include/postmaster/bgwriter.h @@ -6,7 +6,7 @@ * The bgwriter process used to handle checkpointing duties too. Now * there is a separate process, but we did not bother to split this header. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/postmaster/bgwriter.h * @@ -27,8 +27,8 @@ extern PGDLLIMPORT int CheckPointTimeout; extern PGDLLIMPORT int CheckPointWarning; extern PGDLLIMPORT double CheckPointCompletionTarget; -extern void BackgroundWriterMain(void) pg_attribute_noreturn(); -extern void CheckpointerMain(void) pg_attribute_noreturn(); +extern void BackgroundWriterMain(char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); +extern void CheckpointerMain(char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); extern void RequestCheckpoint(int flags); extern void CheckpointWriteDelay(int flags, double progress); diff --git a/src/include/postmaster/fork_process.h b/src/include/postmaster/fork_process.h index 12decc8133bc9..d27d3d28fef58 100644 --- a/src/include/postmaster/fork_process.h +++ b/src/include/postmaster/fork_process.h @@ -3,7 +3,7 @@ * fork_process.h * Exports from postmaster/fork_process.c. * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/postmaster/fork_process.h * diff --git a/src/include/postmaster/interrupt.h b/src/include/postmaster/interrupt.h index 218f5ea3b12b6..341a09d83fe46 100644 --- a/src/include/postmaster/interrupt.h +++ b/src/include/postmaster/interrupt.h @@ -7,7 +7,7 @@ * have their own implementations, but we provide a few generic things * here to facilitate code reuse. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/postmaster/pgarch.h b/src/include/postmaster/pgarch.h index 3bd4fac71e524..a7a417226b012 100644 --- a/src/include/postmaster/pgarch.h +++ b/src/include/postmaster/pgarch.h @@ -3,7 +3,7 @@ * pgarch.h * Exports from postmaster/pgarch.c. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/postmaster/pgarch.h @@ -29,7 +29,7 @@ extern Size PgArchShmemSize(void); extern void PgArchShmemInit(void); extern bool PgArchCanRestart(void); -extern void PgArchiverMain(void) pg_attribute_noreturn(); +extern void PgArchiverMain(char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); extern void PgArchWakeup(void); extern void PgArchForceDirScan(void); diff --git a/src/include/postmaster/postmaster.h b/src/include/postmaster/postmaster.h index 3b3889c58c049..89ad13b788b1e 100644 --- a/src/include/postmaster/postmaster.h +++ b/src/include/postmaster/postmaster.h @@ -3,7 +3,7 @@ * postmaster.h * Exports from postmaster/postmaster.c. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/postmaster/postmaster.h @@ -13,6 +13,8 @@ #ifndef _POSTMASTER_H #define _POSTMASTER_H +#include "miscadmin.h" + /* GUC options */ extern PGDLLIMPORT bool EnableSSL; extern PGDLLIMPORT int SuperuserReservedConnections; @@ -50,6 +52,8 @@ extern PGDLLIMPORT int postmaster_alive_fds[2]; extern PGDLLIMPORT const char *progname; +extern PGDLLIMPORT bool LoadedSSL; + extern void PostmasterMain(int argc, char *argv[]) pg_attribute_noreturn(); extern void ClosePostmasterPorts(bool am_syslogger); extern void InitProcessGlobals(void); @@ -58,12 +62,28 @@ extern int MaxLivePostmasterChildren(void); extern bool PostmasterMarkPIDForWorkerNotify(int); -#ifdef EXEC_BACKEND -extern pid_t postmaster_forkexec(int argc, char *argv[]); -extern void SubPostmasterMain(int argc, char *argv[]) pg_attribute_noreturn(); +extern void processCancelRequest(int backendPID, int32 cancelAuthCode); +#ifdef EXEC_BACKEND extern Size ShmemBackendArraySize(void); extern void ShmemBackendArrayAllocation(void); + +#ifdef WIN32 +extern void pgwin32_register_deadchild_callback(HANDLE procHandle, DWORD procId); +#endif +#endif + +/* defined in globals.c */ +extern PGDLLIMPORT struct ClientSocket *MyClientSocket; + +/* prototypes for functions in launch_backend.c */ +extern pid_t postmaster_child_launch(BackendType child_type, + char *startup_data, + size_t startup_data_len, + struct ClientSocket *client_sock); +const char *PostmasterChildName(BackendType child_type); +#ifdef EXEC_BACKEND +extern void SubPostmasterMain(int argc, char *argv[]) pg_attribute_noreturn(); #endif /* @@ -72,7 +92,7 @@ extern void ShmemBackendArrayAllocation(void); * by using a 64bit state; but it's unlikely to be worthwhile as 2^18-1 * backends exceed currently realistic configurations. Even if that limitation * were removed, we still could not a) exceed 2^23-1 because inval.c stores - * the backend ID as a 3-byte signed integer, b) INT_MAX/4 because some places + * the ProcNumber as a 3-byte signed integer, b) INT_MAX/4 because some places * compute 4*MaxBackends without any overflow check. This is rechecked in the * relevant GUC check hooks and in RegisterBackgroundWorker(). */ diff --git a/src/include/postmaster/startup.h b/src/include/postmaster/startup.h index 6a2e4c4526be6..dde7ebde88124 100644 --- a/src/include/postmaster/startup.h +++ b/src/include/postmaster/startup.h @@ -3,7 +3,7 @@ * startup.h * Exports from postmaster/startup.c. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/postmaster/startup.h * @@ -26,7 +26,7 @@ extern PGDLLIMPORT int log_startup_progress_interval; extern void HandleStartupProcInterrupts(void); -extern void StartupProcessMain(void) pg_attribute_noreturn(); +extern void StartupProcessMain(char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); extern void PreRestoreCommand(void); extern void PostRestoreCommand(void); extern bool IsPromoteSignaled(void); diff --git a/src/include/postmaster/syslogger.h b/src/include/postmaster/syslogger.h index 34da778f1efae..0f28ebcba5515 100644 --- a/src/include/postmaster/syslogger.h +++ b/src/include/postmaster/syslogger.h @@ -3,7 +3,7 @@ * syslogger.h * Exports from postmaster/syslogger.c. * - * Copyright (c) 2004-2023, PostgreSQL Global Development Group + * Copyright (c) 2004-2024, PostgreSQL Global Development Group * * src/include/postmaster/syslogger.h * @@ -86,9 +86,7 @@ extern int SysLogger_Start(void); extern void write_syslogger_file(const char *buffer, int count, int destination); -#ifdef EXEC_BACKEND -extern void SysLoggerMain(int argc, char *argv[]) pg_attribute_noreturn(); -#endif +extern void SysLoggerMain(char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); extern bool CheckLogrotateSignal(void); extern void RemoveLogrotateSignalFiles(void); diff --git a/src/include/postmaster/walsummarizer.h b/src/include/postmaster/walsummarizer.h new file mode 100644 index 0000000000000..aedca556764c4 --- /dev/null +++ b/src/include/postmaster/walsummarizer.h @@ -0,0 +1,35 @@ +/*------------------------------------------------------------------------- + * + * walsummarizer.h + * + * Header file for background WAL summarization process. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/include/postmaster/walsummarizer.h + * + *------------------------------------------------------------------------- + */ +#ifndef WALSUMMARIZER_H +#define WALSUMMARIZER_H + +#include "access/xlogdefs.h" + +extern PGDLLIMPORT bool summarize_wal; +extern PGDLLIMPORT int wal_summary_keep_time; + +extern Size WalSummarizerShmemSize(void); +extern void WalSummarizerShmemInit(void); +extern void WalSummarizerMain(char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); + +extern void GetWalSummarizerState(TimeLineID *summarized_tli, + XLogRecPtr *summarized_lsn, + XLogRecPtr *pending_lsn, + int *summarizer_pid); +extern XLogRecPtr GetOldestUnsummarizedLSN(TimeLineID *tli, + bool *lsn_is_exact); +extern void SetWalSummarizerLatch(void); +extern void WaitForWalSummarization(XLogRecPtr lsn); + +#endif diff --git a/src/include/postmaster/walwriter.h b/src/include/postmaster/walwriter.h index 6eba7ad79cf8b..5884d69fed110 100644 --- a/src/include/postmaster/walwriter.h +++ b/src/include/postmaster/walwriter.h @@ -3,7 +3,7 @@ * walwriter.h * Exports from postmaster/walwriter.c. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/postmaster/walwriter.h * @@ -18,6 +18,6 @@ extern PGDLLIMPORT int WalWriterDelay; extern PGDLLIMPORT int WalWriterFlushAfter; -extern void WalWriterMain(void) pg_attribute_noreturn(); +extern void WalWriterMain(char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); #endif /* _WALWRITER_H */ diff --git a/src/include/regex/regex.h b/src/include/regex/regex.h index d08113724f6c9..f34ee3a85bd57 100644 --- a/src/include/regex/regex.h +++ b/src/include/regex/regex.h @@ -1,5 +1,5 @@ -#ifndef _REGEX_H_ -#define _REGEX_H_ /* never again */ +#ifndef _PG_REGEX_H_ +#define _PG_REGEX_H_ /* never again */ /* * regular expressions * @@ -32,6 +32,84 @@ * src/include/regex/regex.h */ +/* + * This is an implementation of POSIX regex_t, so it clashes with the + * system-provided header. That header might be unintentionally + * included already, so we force that to happen now on all systems to show that + * we can cope and that we completely replace the system regex interfaces. + * + * Note that we avoided using _REGEX_H_ as an include guard, as that confuses + * matters on BSD family systems including macOS that use the same include + * guard. + */ +#ifndef _WIN32 +#include +#endif + +/* Avoid redefinition errors due to the system header. */ +#undef REG_UBACKREF +#undef REG_ULOOKAROUND +#undef REG_UBOUNDS +#undef REG_UBRACES +#undef REG_UBSALNUM +#undef REG_UPBOTCH +#undef REG_UBBS +#undef REG_UNONPOSIX +#undef REG_UUNSPEC +#undef REG_UUNPORT +#undef REG_ULOCALE +#undef REG_UEMPTYMATCH +#undef REG_UIMPOSSIBLE +#undef REG_USHORTEST +#undef REG_BASIC +#undef REG_EXTENDED +#undef REG_ADVF +#undef REG_ADVANCED +#undef REG_QUOTE +#undef REG_NOSPEC +#undef REG_ICASE +#undef REG_NOSUB +#undef REG_EXPANDED +#undef REG_NLSTOP +#undef REG_NLANCH +#undef REG_NEWLINE +#undef REG_PEND +#undef REG_EXPECT +#undef REG_BOSONLY +#undef REG_DUMP +#undef REG_FAKE +#undef REG_PROGRESS +#undef REG_NOTBOL +#undef REG_NOTEOL +#undef REG_STARTEND +#undef REG_FTRACE +#undef REG_MTRACE +#undef REG_SMALL +#undef REG_OKAY +#undef REG_NOMATCH +#undef REG_BADPAT +#undef REG_ECOLLATE +#undef REG_ECTYPE +#undef REG_EESCAPE +#undef REG_ESUBREG +#undef REG_EBRACK +#undef REG_EPAREN +#undef REG_EBRACE +#undef REG_BADBR +#undef REG_ERANGE +#undef REG_ESPACE +#undef REG_BADRPT +#undef REG_ASSERT +#undef REG_INVARG +#undef REG_MIXED +#undef REG_BADOPT +#undef REG_ETOOBIG +#undef REG_ECOLORS +#undef REG_ATOI +#undef REG_ITOA +#undef REG_PREFIX +#undef REG_EXACT + /* * Add your own defines, if needed, here. */ @@ -45,7 +123,7 @@ * regoff_t has to be large enough to hold either off_t or ssize_t, * and must be signed; it's only a guess that long is suitable. */ -typedef long regoff_t; +typedef long pg_regoff_t; /* * other interface types @@ -79,19 +157,19 @@ typedef struct /* the rest is opaque pointers to hidden innards */ char *re_guts; /* `char *' is more portable than `void *' */ char *re_fns; -} regex_t; +} pg_regex_t; /* result reporting (may acquire more fields later) */ typedef struct { - regoff_t rm_so; /* start of substring */ - regoff_t rm_eo; /* end of substring */ -} regmatch_t; + pg_regoff_t rm_so; /* start of substring */ + pg_regoff_t rm_eo; /* end of substring */ +} pg_regmatch_t; /* supplementary control and reporting */ typedef struct { - regmatch_t rm_extend; /* see REG_EXPECT */ + pg_regmatch_t rm_extend; /* see REG_EXPECT */ } rm_detail_t; @@ -164,6 +242,11 @@ typedef struct #define REG_EXACT (-2) /* identified an exact match */ +/* Redirect the standard typenames to our typenames. */ +#define regoff_t pg_regoff_t +#define regex_t pg_regex_t +#define regmatch_t pg_regmatch_t + /* * the prototypes for exported functions @@ -186,4 +269,4 @@ extern bool RE_compile_and_execute(text *text_re, char *dat, int dat_len, int cflags, Oid collation, int nmatch, regmatch_t *pmatch); -#endif /* _REGEX_H_ */ +#endif /* _PG_REGEX_H_ */ diff --git a/src/include/regex/regexport.h b/src/include/regex/regexport.h index 8fdddc18805d3..ada36990f6f3a 100644 --- a/src/include/regex/regexport.h +++ b/src/include/regex/regexport.h @@ -17,7 +17,7 @@ * line and start/end of string. Colors are numbered 0..C-1, but note that * color 0 is "white" (all unused characters) and can generally be ignored. * - * Portions Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2013-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1998, 1999 Henry Spencer * * IDENTIFICATION diff --git a/src/include/regex/regguts.h b/src/include/regex/regguts.h index 3ca3647e118ea..fd69299a16d24 100644 --- a/src/include/regex/regguts.h +++ b/src/include/regex/regguts.h @@ -410,6 +410,8 @@ struct cnfa int flags; /* bitmask of the following flags: */ #define HASLACONS 01 /* uses lookaround constraints */ #define MATCHALL 02 /* matches all strings of a range of lengths */ +#define HASCANTMATCH 04 /* contains CANTMATCH arcs */ + /* Note: HASCANTMATCH appears in nfa structs' flags, but never in cnfas */ int pre; /* setup state number */ int post; /* teardown state number */ color bos[2]; /* colors, if any, assigned to BOS and BOL */ diff --git a/src/include/replication/decode.h b/src/include/replication/decode.h index 14fa921ab4773..17a5b5e95ab84 100644 --- a/src/include/replication/decode.h +++ b/src/include/replication/decode.h @@ -2,7 +2,7 @@ * decode.h * PostgreSQL WAL to logical transformation * - * Portions Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ diff --git a/src/include/replication/logical.h b/src/include/replication/logical.h index 5f49554ea0533..aff38e8d049f2 100644 --- a/src/include/replication/logical.h +++ b/src/include/replication/logical.h @@ -2,7 +2,7 @@ * logical.h * PostgreSQL logical decoding coordination * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ @@ -109,6 +109,9 @@ typedef struct LogicalDecodingContext TransactionId write_xid; /* Are we processing the end LSN of a transaction? */ bool end_xact; + + /* Do we need to process any change in fast_forward mode? */ + bool processing_required; } LogicalDecodingContext; @@ -145,4 +148,8 @@ extern bool filter_by_origin_cb_wrapper(LogicalDecodingContext *ctx, RepOriginId extern void ResetLogicalStreamingState(void); extern void UpdateDecodingStats(LogicalDecodingContext *ctx); +extern bool LogicalReplicationSlotHasPendingWal(XLogRecPtr end_of_wal); +extern XLogRecPtr LogicalSlotAdvanceAndCheckSnapState(XLogRecPtr moveto, + bool *found_consistent_snapshot); + #endif diff --git a/src/include/replication/logicallauncher.h b/src/include/replication/logicallauncher.h index a07c9cb311a75..ff0438b5bb723 100644 --- a/src/include/replication/logicallauncher.h +++ b/src/include/replication/logicallauncher.h @@ -3,7 +3,7 @@ * logicallauncher.h * Exports for logical replication launcher. * - * Portions Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group * * src/include/replication/logicallauncher.h * diff --git a/src/include/replication/logicalproto.h b/src/include/replication/logicalproto.h index 0ea2df5088928..c409638a2eff6 100644 --- a/src/include/replication/logicalproto.h +++ b/src/include/replication/logicalproto.h @@ -3,7 +3,7 @@ * logicalproto.h * logical replication protocol * - * Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Copyright (c) 2015-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/replication/logicalproto.h @@ -74,7 +74,7 @@ typedef enum LogicalRepMsgType LOGICAL_REP_MSG_STREAM_STOP = 'E', LOGICAL_REP_MSG_STREAM_COMMIT = 'c', LOGICAL_REP_MSG_STREAM_ABORT = 'A', - LOGICAL_REP_MSG_STREAM_PREPARE = 'p' + LOGICAL_REP_MSG_STREAM_PREPARE = 'p', } LogicalRepMsgType; /* @@ -269,6 +269,6 @@ extern void logicalrep_write_stream_abort(StringInfo out, TransactionId xid, extern void logicalrep_read_stream_abort(StringInfo in, LogicalRepStreamAbortData *abort_data, bool read_abort_info); -extern char *logicalrep_message_type(LogicalRepMsgType action); +extern const char *logicalrep_message_type(LogicalRepMsgType action); #endif /* LOGICAL_PROTO_H */ diff --git a/src/include/replication/logicalrelation.h b/src/include/replication/logicalrelation.h index 921b9974db781..e687b40a566f1 100644 --- a/src/include/replication/logicalrelation.h +++ b/src/include/replication/logicalrelation.h @@ -3,7 +3,7 @@ * logicalrelation.h * Relation definitions for logical replication relation mapping. * - * Portions Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group * * src/include/replication/logicalrelation.h * @@ -48,7 +48,7 @@ extern LogicalRepRelMapEntry *logicalrep_partition_open(LogicalRepRelMapEntry *r Relation partrel, AttrMap *map); extern void logicalrep_rel_close(LogicalRepRelMapEntry *rel, LOCKMODE lockmode); -extern bool IsIndexUsableForReplicaIdentityFull(IndexInfo *indexInfo); +extern bool IsIndexUsableForReplicaIdentityFull(IndexInfo *indexInfo, AttrMap *attrmap); extern Oid GetRelationIdentityOrPK(Relation rel); #endif /* LOGICALRELATION_H */ diff --git a/src/include/replication/logicalworker.h b/src/include/replication/logicalworker.h index 39588da79fd54..a18d79d1b2817 100644 --- a/src/include/replication/logicalworker.h +++ b/src/include/replication/logicalworker.h @@ -3,7 +3,7 @@ * logicalworker.h * Exports for logical replication workers. * - * Portions Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group * * src/include/replication/logicalworker.h * @@ -18,6 +18,7 @@ extern PGDLLIMPORT volatile sig_atomic_t ParallelApplyMessagePending; extern void ApplyWorkerMain(Datum main_arg); extern void ParallelApplyWorkerMain(Datum main_arg); +extern void TablesyncWorkerMain(Datum main_arg); extern bool IsLogicalWorker(void); extern bool IsLogicalParallelApplyWorker(void); diff --git a/src/include/replication/message.h b/src/include/replication/message.h index 6ce7f2038b226..d5fb2fe017205 100644 --- a/src/include/replication/message.h +++ b/src/include/replication/message.h @@ -2,7 +2,7 @@ * message.h * Exports from replication/logical/message.c * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * * src/include/replication/message.h *------------------------------------------------------------------------- @@ -30,7 +30,8 @@ typedef struct xl_logical_message #define SizeOfLogicalMessage (offsetof(xl_logical_message, message)) extern XLogRecPtr LogLogicalMessage(const char *prefix, const char *message, - size_t size, bool transactional); + size_t size, bool transactional, + bool flush); /* RMGR API */ #define XLOG_LOGICAL_MESSAGE 0x00 diff --git a/src/include/replication/origin.h b/src/include/replication/origin.h index 531351093e6b8..7189ba9e7693a 100644 --- a/src/include/replication/origin.h +++ b/src/include/replication/origin.h @@ -2,7 +2,7 @@ * origin.h * Exports from replication/logical/origin.c * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * * src/include/replication/origin.h *------------------------------------------------------------------------- diff --git a/src/include/replication/output_plugin.h b/src/include/replication/output_plugin.h index 3ac67293861d1..44988ebdd89e9 100644 --- a/src/include/replication/output_plugin.h +++ b/src/include/replication/output_plugin.h @@ -2,7 +2,7 @@ * output_plugin.h * PostgreSQL Logical Decode Plugin Interface * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ @@ -17,7 +17,7 @@ struct OutputPluginCallbacks; typedef enum OutputPluginOutputType { OUTPUT_PLUGIN_BINARY_OUTPUT, - OUTPUT_PLUGIN_TEXTUAL_OUTPUT + OUTPUT_PLUGIN_TEXTUAL_OUTPUT, } OutputPluginOutputType; /* diff --git a/src/include/replication/pgoutput.h b/src/include/replication/pgoutput.h index b4a8015403b50..89f94e114726f 100644 --- a/src/include/replication/pgoutput.h +++ b/src/include/replication/pgoutput.h @@ -3,7 +3,7 @@ * pgoutput.h * Logical Replication output plugin * - * Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Copyright (c) 2015-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/replication/pgoutput.h @@ -21,6 +21,9 @@ typedef struct PGOutputData * allocations */ MemoryContext cachectx; /* private memory context for cache data */ + bool in_streaming; /* true if we are streaming a chunk of + * transaction */ + /* client-supplied info: */ uint32 protocol_version; List *publication_names; @@ -29,7 +32,7 @@ typedef struct PGOutputData char streaming; bool messages; bool two_phase; - char *origin; + bool publish_no_origin; } PGOutputData; #endif /* PGOUTPUT_H */ diff --git a/src/include/replication/reorderbuffer.h b/src/include/replication/reorderbuffer.h index 1b9db22acbd7f..4c56f219fd8fd 100644 --- a/src/include/replication/reorderbuffer.h +++ b/src/include/replication/reorderbuffer.h @@ -2,7 +2,7 @@ * reorderbuffer.h * PostgreSQL logical replay/reorder buffer management. * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * * src/include/replication/reorderbuffer.h */ @@ -11,6 +11,7 @@ #include "access/htup_details.h" #include "lib/ilist.h" +#include "lib/pairingheap.h" #include "storage/sinval.h" #include "utils/hsearch.h" #include "utils/relcache.h" @@ -19,33 +20,14 @@ /* GUC variables */ extern PGDLLIMPORT int logical_decoding_work_mem; -extern PGDLLIMPORT int logical_replication_mode; +extern PGDLLIMPORT int debug_logical_replication_streaming; -/* possible values for logical_replication_mode */ +/* possible values for debug_logical_replication_streaming */ typedef enum { - LOGICAL_REP_MODE_BUFFERED, - LOGICAL_REP_MODE_IMMEDIATE -} LogicalRepMode; - -/* an individual tuple, stored in one chunk of memory */ -typedef struct ReorderBufferTupleBuf -{ - /* position in preallocated list */ - slist_node node; - - /* tuple header, the interesting bit for users of logical decoding */ - HeapTupleData tuple; - - /* pre-allocated size of tuple buffer, different from tuple size */ - Size alloc_tuple_size; - - /* actual tuple data follows */ -} ReorderBufferTupleBuf; - -/* pointer to the data stored in a TupleBuf */ -#define ReorderBufferTupleBufData(p) \ - ((HeapTupleHeader) MAXALIGN(((char *) p) + sizeof(ReorderBufferTupleBuf))) + DEBUG_LOGICAL_REP_STREAMING_BUFFERED, + DEBUG_LOGICAL_REP_STREAMING_IMMEDIATE, +} DebugLogicalRepStreamingMode; /* * Types of the change passed to a 'change' callback. @@ -73,7 +55,7 @@ typedef enum ReorderBufferChangeType REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT, REORDER_BUFFER_CHANGE_INTERNAL_SPEC_CONFIRM, REORDER_BUFFER_CHANGE_INTERNAL_SPEC_ABORT, - REORDER_BUFFER_CHANGE_TRUNCATE + REORDER_BUFFER_CHANGE_TRUNCATE, } ReorderBufferChangeType; /* forward declaration */ @@ -114,9 +96,9 @@ typedef struct ReorderBufferChange bool clear_toast_afterwards; /* valid for DELETE || UPDATE */ - ReorderBufferTupleBuf *oldtuple; + HeapTuple oldtuple; /* valid for INSERT || UPDATE */ - ReorderBufferTupleBuf *newtuple; + HeapTuple newtuple; } tp; /* @@ -420,6 +402,11 @@ typedef struct ReorderBufferTXN */ dlist_node catchange_node; + /* + * A node in txn_heap + */ + pairingheap_node txn_node; + /* * Size of this transaction (changes currently in memory, in bytes). */ @@ -491,45 +478,38 @@ typedef void (*ReorderBufferRollbackPreparedCB) (ReorderBuffer *rb, TimestampTz prepare_time); /* start streaming transaction callback signature */ -typedef void (*ReorderBufferStreamStartCB) ( - ReorderBuffer *rb, +typedef void (*ReorderBufferStreamStartCB) (ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr first_lsn); /* stop streaming transaction callback signature */ -typedef void (*ReorderBufferStreamStopCB) ( - ReorderBuffer *rb, +typedef void (*ReorderBufferStreamStopCB) (ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr last_lsn); /* discard streamed transaction callback signature */ -typedef void (*ReorderBufferStreamAbortCB) ( - ReorderBuffer *rb, +typedef void (*ReorderBufferStreamAbortCB) (ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr abort_lsn); /* prepare streamed transaction callback signature */ -typedef void (*ReorderBufferStreamPrepareCB) ( - ReorderBuffer *rb, +typedef void (*ReorderBufferStreamPrepareCB) (ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr prepare_lsn); /* commit streamed transaction callback signature */ -typedef void (*ReorderBufferStreamCommitCB) ( - ReorderBuffer *rb, +typedef void (*ReorderBufferStreamCommitCB) (ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr commit_lsn); /* stream change callback signature */ -typedef void (*ReorderBufferStreamChangeCB) ( - ReorderBuffer *rb, +typedef void (*ReorderBufferStreamChangeCB) (ReorderBuffer *rb, ReorderBufferTXN *txn, Relation relation, ReorderBufferChange *change); /* stream message callback signature */ -typedef void (*ReorderBufferStreamMessageCB) ( - ReorderBuffer *rb, +typedef void (*ReorderBufferStreamMessageCB) (ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr message_lsn, bool transactional, @@ -537,16 +517,14 @@ typedef void (*ReorderBufferStreamMessageCB) ( const char *message); /* stream truncate callback signature */ -typedef void (*ReorderBufferStreamTruncateCB) ( - ReorderBuffer *rb, +typedef void (*ReorderBufferStreamTruncateCB) (ReorderBuffer *rb, ReorderBufferTXN *txn, int nrelations, Relation relations[], ReorderBufferChange *change); /* update progress txn callback signature */ -typedef void (*ReorderBufferUpdateProgressTxnCB) ( - ReorderBuffer *rb, +typedef void (*ReorderBufferUpdateProgressTxnCB) (ReorderBuffer *rb, ReorderBufferTXN *txn, XLogRecPtr lsn); @@ -650,6 +628,9 @@ struct ReorderBuffer /* memory accounting */ Size size; + /* Max-heap for sizes of all top-level and sub transactions */ + pairingheap *txn_heap; + /* * Statistics about transactions spilled to disk. * @@ -678,10 +659,10 @@ struct ReorderBuffer extern ReorderBuffer *ReorderBufferAllocate(void); extern void ReorderBufferFree(ReorderBuffer *rb); -extern ReorderBufferTupleBuf *ReorderBufferGetTupleBuf(ReorderBuffer *rb, - Size tuple_len); -extern void ReorderBufferReturnTupleBuf(ReorderBuffer *rb, - ReorderBufferTupleBuf *tuple); +extern HeapTuple ReorderBufferGetTupleBuf(ReorderBuffer *rb, + Size tuple_len); +extern void ReorderBufferReturnTupleBuf(HeapTuple tuple); + extern ReorderBufferChange *ReorderBufferGetChange(ReorderBuffer *rb); extern void ReorderBufferReturnChange(ReorderBuffer *rb, ReorderBufferChange *change, bool upd_mem); @@ -748,6 +729,10 @@ extern TransactionId *ReorderBufferGetCatalogChangesXacts(ReorderBuffer *rb); extern void ReorderBufferSetRestartPoint(ReorderBuffer *rb, XLogRecPtr ptr); +extern uint32 ReorderBufferGetInvalidations(ReorderBuffer *rb, + TransactionId xid, + SharedInvalidationMessage **msgs); + extern void StartupReorderBuffer(void); #endif diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h index a8a89dc7844ee..07561bc474292 100644 --- a/src/include/replication/slot.h +++ b/src/include/replication/slot.h @@ -2,7 +2,7 @@ * slot.h * Replication slot management. * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * *------------------------------------------------------------------------- */ @@ -34,12 +34,15 @@ typedef enum ReplicationSlotPersistency { RS_PERSISTENT, RS_EPHEMERAL, - RS_TEMPORARY + RS_TEMPORARY, } ReplicationSlotPersistency; /* * Slots can be invalidated, e.g. due to max_slot_wal_keep_size. If so, the * 'invalidated' field is set to a value other than _NONE. + * + * When adding a new invalidation cause here, remember to update + * SlotInvalidationCauses and RS_INVAL_MAX_CAUSES. */ typedef enum ReplicationSlotInvalidationCause { @@ -52,6 +55,8 @@ typedef enum ReplicationSlotInvalidationCause RS_INVAL_WAL_LEVEL, } ReplicationSlotInvalidationCause; +extern PGDLLIMPORT const char *const SlotInvalidationCauses[]; + /* * On-Disk data of a replication slot, preserved across restarts. */ @@ -111,6 +116,17 @@ typedef struct ReplicationSlotPersistentData /* plugin name */ NameData plugin; + + /* + * Was this slot synchronized from the primary server? + */ + char synced; + + /* + * Is this a failover slot (sync candidate for standbys)? Only relevant + * for logical slots on the primary server. + */ + bool failover; } ReplicationSlotPersistentData; /* @@ -178,6 +194,20 @@ typedef struct ReplicationSlot XLogRecPtr candidate_xmin_lsn; XLogRecPtr candidate_restart_valid; XLogRecPtr candidate_restart_lsn; + + /* + * This value tracks the last confirmed_flush LSN flushed which is used + * during a shutdown checkpoint to decide if logical's slot data should be + * forcibly flushed or not. + */ + XLogRecPtr last_saved_confirmed_flush; + + /* + * The time when the slot became inactive. For synced slots on a standby + * server, it represents the time when slot synchronization was most + * recently stopped. + */ + TimestampTz inactive_since; } ReplicationSlot; #define SlotIsPhysical(slot) ((slot)->data.database == InvalidOid) @@ -203,6 +233,7 @@ extern PGDLLIMPORT ReplicationSlot *MyReplicationSlot; /* GUCs */ extern PGDLLIMPORT int max_replication_slots; +extern PGDLLIMPORT char *synchronized_standby_slots; /* shmem initialization functions */ extern Size ReplicationSlotsShmemSize(void); @@ -211,13 +242,16 @@ extern void ReplicationSlotsShmemInit(void); /* management of individual slots */ extern void ReplicationSlotCreate(const char *name, bool db_specific, ReplicationSlotPersistency persistency, - bool two_phase); + bool two_phase, bool failover, + bool synced); extern void ReplicationSlotPersist(void); extern void ReplicationSlotDrop(const char *name, bool nowait); +extern void ReplicationSlotDropAcquired(void); +extern void ReplicationSlotAlter(const char *name, bool failover); extern void ReplicationSlotAcquire(const char *name, bool nowait); extern void ReplicationSlotRelease(void); -extern void ReplicationSlotCleanup(void); +extern void ReplicationSlotCleanup(bool synced_only); extern void ReplicationSlotSave(void); extern void ReplicationSlotMarkDirty(void); @@ -241,9 +275,15 @@ extern void ReplicationSlotNameForTablesync(Oid suboid, Oid relid, char *syncslo extern void ReplicationSlotDropAtPubNode(WalReceiverConn *wrconn, char *slotname, bool missing_ok); extern void StartupReplicationSlots(void); -extern void CheckPointReplicationSlots(void); +extern void CheckPointReplicationSlots(bool is_shutdown); extern void CheckSlotRequirements(void); extern void CheckSlotPermissions(void); +extern ReplicationSlotInvalidationCause + GetSlotInvalidationCause(const char *invalidation_reason); + +extern bool SlotExistsInSyncStandbySlots(const char *slot_name); +extern bool StandbySlotsHaveCaughtup(XLogRecPtr wait_for_lsn, int elevel); +extern void WaitForStandbyConfirmation(XLogRecPtr wait_for_lsn); #endif /* SLOT_H */ diff --git a/src/include/replication/slotsync.h b/src/include/replication/slotsync.h new file mode 100644 index 0000000000000..e03c2a005a429 --- /dev/null +++ b/src/include/replication/slotsync.h @@ -0,0 +1,38 @@ +/*------------------------------------------------------------------------- + * + * slotsync.h + * Exports for slot synchronization. + * + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group + * + * src/include/replication/slotsync.h + * + *------------------------------------------------------------------------- + */ +#ifndef SLOTSYNC_H +#define SLOTSYNC_H + +#include "replication/walreceiver.h" + +extern PGDLLIMPORT bool sync_replication_slots; + +/* + * GUCs needed by slot sync worker to connect to the primary + * server and carry on with slots synchronization. + */ +extern PGDLLIMPORT char *PrimaryConnInfo; +extern PGDLLIMPORT char *PrimarySlotName; + +extern char *CheckAndGetDbnameFromConninfo(void); +extern bool ValidateSlotSyncParams(int elevel); + +extern void ReplSlotSyncWorkerMain(char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); + +extern void ShutDownSlotSync(void); +extern bool SlotSyncWorkerCanRestart(void); +extern bool IsSyncingReplicationSlots(void); +extern Size SlotSyncShmemSize(void); +extern void SlotSyncShmemInit(void); +extern void SyncReplicationSlots(WalReceiverConn *wrconn); + +#endif /* SLOTSYNC_H */ diff --git a/src/include/replication/snapbuild.h b/src/include/replication/snapbuild.h index f49b941b53ebc..caa5113ff81a8 100644 --- a/src/include/replication/snapbuild.h +++ b/src/include/replication/snapbuild.h @@ -3,7 +3,7 @@ * snapbuild.h * Exports from replication/logical/snapbuild.c. * - * Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Copyright (c) 2012-2024, PostgreSQL Global Development Group * * src/include/replication/snapbuild.h * @@ -43,7 +43,7 @@ typedef enum * were running at that point finished. Till we reach that we hold off * calling any commit callbacks. */ - SNAPBUILD_CONSISTENT = 2 + SNAPBUILD_CONSISTENT = 2, } SnapBuildState; /* forward declare so we don't have to expose the struct to the public */ @@ -62,6 +62,7 @@ extern void CheckPointSnapBuild(void); extern SnapBuild *AllocateSnapshotBuilder(struct ReorderBuffer *reorder, TransactionId xmin_horizon, XLogRecPtr start_lsn, bool need_full_snapshot, + bool in_slot_creation, XLogRecPtr two_phase_at); extern void FreeSnapshotBuilder(SnapBuild *builder); @@ -91,4 +92,6 @@ extern void SnapBuildProcessRunningXacts(SnapBuild *builder, XLogRecPtr lsn, struct xl_running_xacts *running); extern void SnapBuildSerializationPoint(SnapBuild *builder, XLogRecPtr lsn); +extern bool SnapBuildSnapshotExists(XLogRecPtr lsn); + #endif /* SNAPBUILD_H */ diff --git a/src/include/replication/syncrep.h b/src/include/replication/syncrep.h index 0aec4cb1d51b5..ea439e6da6004 100644 --- a/src/include/replication/syncrep.h +++ b/src/include/replication/syncrep.h @@ -3,7 +3,7 @@ * syncrep.h * Exports from replication/syncrep.c. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/replication/syncrep.h diff --git a/src/include/replication/walreceiver.h b/src/include/replication/walreceiver.h index 281626fa6f5d8..12f71fa99b0ca 100644 --- a/src/include/replication/walreceiver.h +++ b/src/include/replication/walreceiver.h @@ -3,7 +3,7 @@ * walreceiver.h * Exports from replication/walreceiverfuncs.c. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * src/include/replication/walreceiver.h * @@ -13,7 +13,6 @@ #define _WALRECEIVER_H #include -#include #include "access/xlog.h" #include "access/xlogdefs.h" @@ -52,7 +51,7 @@ typedef enum WALRCV_STREAMING, /* walreceiver is streaming */ WALRCV_WAITING, /* stopped streaming, waiting for orders */ WALRCV_RESTARTING, /* asked to restart streaming */ - WALRCV_STOPPING /* requested to stop, but still running */ + WALRCV_STOPPING, /* requested to stop, but still running */ } WalRcvState; /* Shared memory area for management of walreceiver process */ @@ -207,7 +206,7 @@ typedef enum WALRCV_OK_TUPLES, /* Query returned tuples. */ WALRCV_OK_COPY_IN, /* Query started COPY FROM. */ WALRCV_OK_COPY_OUT, /* Query started COPY TO. */ - WALRCV_OK_COPY_BOTH /* Query started COPY BOTH replication + WALRCV_OK_COPY_BOTH, /* Query started COPY BOTH replication * protocol. */ } WalRcvExecStatus; @@ -229,8 +228,10 @@ typedef struct WalRcvExecResult /* * walrcv_connect_fn * - * Establish connection to a cluster. 'logical' is true if the - * connection is logical, and false if the connection is physical. + * Establish connection to a cluster. 'replication' is true if the + * connection is a replication connection, and false if it is a + * regular connection. If it is a replication connection, it could + * be either logical or physical based on input argument 'logical'. * 'appname' is a name associated to the connection, to use for example * with fallback_application_name or application_name. Returns the * details about the connection established, as defined by @@ -238,6 +239,7 @@ typedef struct WalRcvExecResult * returned with 'err' including the error generated. */ typedef WalReceiverConn *(*walrcv_connect_fn) (const char *conninfo, + bool replication, bool logical, bool must_use_password, const char *appname, @@ -280,6 +282,13 @@ typedef void (*walrcv_get_senderinfo_fn) (WalReceiverConn *conn, typedef char *(*walrcv_identify_system_fn) (WalReceiverConn *conn, TimeLineID *primary_tli); +/* + * walrcv_get_dbname_from_conninfo_fn + * + * Returns the database name from the primary_conninfo + */ +typedef char *(*walrcv_get_dbname_from_conninfo_fn) (const char *conninfo); + /* * walrcv_server_version_fn * @@ -356,9 +365,20 @@ typedef char *(*walrcv_create_slot_fn) (WalReceiverConn *conn, const char *slotname, bool temporary, bool two_phase, + bool failover, CRSSnapshotAction snapshot_action, XLogRecPtr *lsn); +/* + * walrcv_alter_slot_fn + * + * Change the definition of a replication slot. Currently, it only supports + * changing the failover property of the slot. + */ +typedef void (*walrcv_alter_slot_fn) (WalReceiverConn *conn, + const char *slotname, + bool failover); + /* * walrcv_get_backend_pid_fn * @@ -393,6 +413,7 @@ typedef struct WalReceiverFunctionsType walrcv_get_conninfo_fn walrcv_get_conninfo; walrcv_get_senderinfo_fn walrcv_get_senderinfo; walrcv_identify_system_fn walrcv_identify_system; + walrcv_get_dbname_from_conninfo_fn walrcv_get_dbname_from_conninfo; walrcv_server_version_fn walrcv_server_version; walrcv_readtimelinehistoryfile_fn walrcv_readtimelinehistoryfile; walrcv_startstreaming_fn walrcv_startstreaming; @@ -400,6 +421,7 @@ typedef struct WalReceiverFunctionsType walrcv_receive_fn walrcv_receive; walrcv_send_fn walrcv_send; walrcv_create_slot_fn walrcv_create_slot; + walrcv_alter_slot_fn walrcv_alter_slot; walrcv_get_backend_pid_fn walrcv_get_backend_pid; walrcv_exec_fn walrcv_exec; walrcv_disconnect_fn walrcv_disconnect; @@ -407,8 +429,8 @@ typedef struct WalReceiverFunctionsType extern PGDLLIMPORT WalReceiverFunctionsType *WalReceiverFunctions; -#define walrcv_connect(conninfo, logical, must_use_password, appname, err) \ - WalReceiverFunctions->walrcv_connect(conninfo, logical, must_use_password, appname, err) +#define walrcv_connect(conninfo, replication, logical, must_use_password, appname, err) \ + WalReceiverFunctions->walrcv_connect(conninfo, replication, logical, must_use_password, appname, err) #define walrcv_check_conninfo(conninfo, must_use_password) \ WalReceiverFunctions->walrcv_check_conninfo(conninfo, must_use_password) #define walrcv_get_conninfo(conn) \ @@ -417,6 +439,8 @@ extern PGDLLIMPORT WalReceiverFunctionsType *WalReceiverFunctions; WalReceiverFunctions->walrcv_get_senderinfo(conn, sender_host, sender_port) #define walrcv_identify_system(conn, primary_tli) \ WalReceiverFunctions->walrcv_identify_system(conn, primary_tli) +#define walrcv_get_dbname_from_conninfo(conninfo) \ + WalReceiverFunctions->walrcv_get_dbname_from_conninfo(conninfo) #define walrcv_server_version(conn) \ WalReceiverFunctions->walrcv_server_version(conn) #define walrcv_readtimelinehistoryfile(conn, tli, filename, content, size) \ @@ -429,8 +453,10 @@ extern PGDLLIMPORT WalReceiverFunctionsType *WalReceiverFunctions; WalReceiverFunctions->walrcv_receive(conn, buffer, wait_fd) #define walrcv_send(conn, buffer, nbytes) \ WalReceiverFunctions->walrcv_send(conn, buffer, nbytes) -#define walrcv_create_slot(conn, slotname, temporary, two_phase, snapshot_action, lsn) \ - WalReceiverFunctions->walrcv_create_slot(conn, slotname, temporary, two_phase, snapshot_action, lsn) +#define walrcv_create_slot(conn, slotname, temporary, two_phase, failover, snapshot_action, lsn) \ + WalReceiverFunctions->walrcv_create_slot(conn, slotname, temporary, two_phase, failover, snapshot_action, lsn) +#define walrcv_alter_slot(conn, slotname, failover) \ + WalReceiverFunctions->walrcv_alter_slot(conn, slotname, failover) #define walrcv_get_backend_pid(conn) \ WalReceiverFunctions->walrcv_get_backend_pid(conn) #define walrcv_exec(conn, exec, nRetTypes, retTypes) \ @@ -457,7 +483,7 @@ walrcv_clear_result(WalRcvExecResult *walres) } /* prototypes for functions in walreceiver.c */ -extern void WalReceiverMain(void) pg_attribute_noreturn(); +extern void WalReceiverMain(char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); extern void ProcessWalRcvInterrupts(void); extern void WalRcvForceReply(void); diff --git a/src/include/replication/walsender.h b/src/include/replication/walsender.h index 9df7e50f94305..f2d8297f016ea 100644 --- a/src/include/replication/walsender.h +++ b/src/include/replication/walsender.h @@ -3,7 +3,7 @@ * walsender.h * Exports from replication/walsender.c. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * src/include/replication/walsender.h * @@ -12,7 +12,7 @@ #ifndef _WALSENDER_H #define _WALSENDER_H -#include +#include "access/xlogdefs.h" /* * What to do with a snapshot in create replication slot command. @@ -21,7 +21,7 @@ typedef enum { CRS_EXPORT_SNAPSHOT, CRS_NOEXPORT_SNAPSHOT, - CRS_USE_SNAPSHOT + CRS_USE_SNAPSHOT, } CRSSnapshotAction; /* global state */ @@ -39,6 +39,8 @@ extern void InitWalSender(void); extern bool exec_replication_command(const char *cmd_string); extern void WalSndErrorCleanup(void); extern void WalSndResourceCleanup(bool isCommit); +extern void PhysicalWakeupLogicalWalSnd(void); +extern XLogRecPtr GetStandbyFlushRecPtr(TimeLineID *tli); extern void WalSndSignals(void); extern Size WalSndShmemSize(void); extern void WalSndShmemInit(void); diff --git a/src/include/replication/walsender_private.h b/src/include/replication/walsender_private.h index 7d919583bd36a..443644bae1b73 100644 --- a/src/include/replication/walsender_private.h +++ b/src/include/replication/walsender_private.h @@ -3,7 +3,7 @@ * walsender_private.h * Private definitions from replication/walsender.c. * - * Portions Copyright (c) 2010-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2010-2024, PostgreSQL Global Development Group * * src/include/replication/walsender_private.h * @@ -28,7 +28,7 @@ typedef enum WalSndState WALSNDSTATE_BACKUP, WALSNDSTATE_CATCHUP, WALSNDSTATE_STREAMING, - WALSNDSTATE_STOPPING + WALSNDSTATE_STOPPING, } WalSndState; /* @@ -103,19 +103,41 @@ typedef struct XLogRecPtr lsn[NUM_SYNC_REP_WAIT_MODE]; /* - * Are any sync standbys defined? Waiting backends can't reload the - * config file safely, so checkpointer updates this value as needed. - * Protected by SyncRepLock. + * Status of data related to the synchronous standbys. Waiting backends + * can't reload the config file safely, so checkpointer updates this value + * as needed. Protected by SyncRepLock. */ - bool sync_standbys_defined; + bits8 sync_standbys_status; /* used as a registry of physical / logical walsenders to wake */ ConditionVariable wal_flush_cv; ConditionVariable wal_replay_cv; + /* + * Used by physical walsenders holding slots specified in + * synchronized_standby_slots to wake up logical walsenders holding + * logical failover slots when a walreceiver confirms the receipt of LSN. + */ + ConditionVariable wal_confirm_rcv_cv; + WalSnd walsnds[FLEXIBLE_ARRAY_MEMBER]; } WalSndCtlData; +/* Flags for WalSndCtlData->sync_standbys_status */ + +/* + * Is the synchronous standby data initialized from the GUC? This is set the + * first time synchronous_standby_names is processed by the checkpointer. + */ +#define SYNC_STANDBY_INIT (1 << 0) + +/* + * Is the synchronous standby data defined? This is set when + * synchronous_standby_names has some data, after being processed by the + * checkpointer. + */ +#define SYNC_STANDBY_DEFINED (1 << 1) + extern PGDLLIMPORT WalSndCtlData *WalSndCtl; diff --git a/src/include/replication/worker_internal.h b/src/include/replication/worker_internal.h index 343e7818965aa..515aefd519125 100644 --- a/src/include/replication/worker_internal.h +++ b/src/include/replication/worker_internal.h @@ -3,7 +3,7 @@ * worker_internal.h * Internal headers shared by logical replication workers. * - * Portions Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group * * src/include/replication/worker_internal.h * @@ -12,13 +12,12 @@ #ifndef WORKER_INTERNAL_H #define WORKER_INTERNAL_H -#include - #include "access/xlogdefs.h" #include "catalog/pg_subscription.h" #include "datatype/timestamp.h" #include "miscadmin.h" #include "replication/logicalrelation.h" +#include "replication/walreceiver.h" #include "storage/buffile.h" #include "storage/fileset.h" #include "storage/lock.h" @@ -26,9 +25,20 @@ #include "storage/shm_toc.h" #include "storage/spin.h" +/* Different types of worker */ +typedef enum LogicalRepWorkerType +{ + WORKERTYPE_UNKNOWN = 0, + WORKERTYPE_TABLESYNC, + WORKERTYPE_APPLY, + WORKERTYPE_PARALLEL_APPLY, +} LogicalRepWorkerType; typedef struct LogicalRepWorker { + /* What type of worker is this? */ + LogicalRepWorkerType type; + /* Time at which this worker was launched. */ TimestampTz launch_time; @@ -94,7 +104,7 @@ typedef enum ParallelTransState { PARALLEL_TRANS_UNKNOWN, PARALLEL_TRANS_STARTED, - PARALLEL_TRANS_FINISHED + PARALLEL_TRANS_FINISHED, } ParallelTransState; /* @@ -118,7 +128,7 @@ typedef enum PartialFileSetState FS_EMPTY, FS_SERIALIZE_IN_PROGRESS, FS_SERIALIZE_DONE, - FS_READY + FS_READY, } PartialFileSetState; /* @@ -231,7 +241,8 @@ extern void logicalrep_worker_attach(int slot); extern LogicalRepWorker *logicalrep_worker_find(Oid subid, Oid relid, bool only_running); extern List *logicalrep_workers_find(Oid subid, bool only_running); -extern bool logicalrep_worker_launch(Oid dbid, Oid subid, const char *subname, +extern bool logicalrep_worker_launch(LogicalRepWorkerType wtype, + Oid dbid, Oid subid, const char *subname, Oid userid, Oid relid, dsm_handle subworker_dsm); extern void logicalrep_worker_stop(Oid subid, Oid relid); @@ -243,7 +254,6 @@ extern int logicalrep_sync_worker_count(Oid subid); extern void ReplicationOriginNameForLogicalRep(Oid suboid, Oid relid, char *originname, Size szoriginname); -extern char *LogicalRepSyncTableStart(XLogRecPtr *origin_startpos); extern bool AllTablesyncsReady(void); extern void UpdateTwoPhaseState(Oid suboid, char new_state); @@ -265,7 +275,17 @@ extern void maybe_reread_subscription(void); extern void stream_cleanup_files(Oid subid, TransactionId xid); -extern void InitializeApplyWorker(void); +extern void set_stream_options(WalRcvStreamOptions *options, + char *slotname, + XLogRecPtr *origin_startpos); + +extern void start_apply(XLogRecPtr origin_startpos); + +extern void InitializeLogRepWorker(void); + +extern void SetupApplyOrSyncWorker(int worker_slot); + +extern void DisableSubscriptionAndExit(void); extern void store_flush_position(XLogRecPtr remote_lsn, XLogRecPtr local_lsn); @@ -305,24 +325,28 @@ extern void pa_decr_and_wait_stream_block(void); extern void pa_xact_finish(ParallelApplyWorkerInfo *winfo, XLogRecPtr remote_lsn); -#define isParallelApplyWorker(worker) ((worker)->leader_pid != InvalidPid) +#define isParallelApplyWorker(worker) ((worker)->in_use && \ + (worker)->type == WORKERTYPE_PARALLEL_APPLY) +#define isTablesyncWorker(worker) ((worker)->in_use && \ + (worker)->type == WORKERTYPE_TABLESYNC) static inline bool am_tablesync_worker(void) { - return OidIsValid(MyLogicalRepWorker->relid); + return isTablesyncWorker(MyLogicalRepWorker); } static inline bool am_leader_apply_worker(void) { - return (!am_tablesync_worker() && - !isParallelApplyWorker(MyLogicalRepWorker)); + Assert(MyLogicalRepWorker->in_use); + return (MyLogicalRepWorker->type == WORKERTYPE_APPLY); } static inline bool am_parallel_apply_worker(void) { + Assert(MyLogicalRepWorker->in_use); return isParallelApplyWorker(MyLogicalRepWorker); } diff --git a/src/include/rewrite/prs2lock.h b/src/include/rewrite/prs2lock.h index f94bdfd245e65..fcc9beb0c92d9 100644 --- a/src/include/rewrite/prs2lock.h +++ b/src/include/rewrite/prs2lock.h @@ -3,7 +3,7 @@ * prs2lock.h * data structures for POSTGRES Rule System II (rewrite rules only) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/rewrite/prs2lock.h diff --git a/src/include/rewrite/rewriteDefine.h b/src/include/rewrite/rewriteDefine.h index 81a7ea034f399..30569a1fde1c1 100644 --- a/src/include/rewrite/rewriteDefine.h +++ b/src/include/rewrite/rewriteDefine.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/rewrite/rewriteDefine.h diff --git a/src/include/rewrite/rewriteHandler.h b/src/include/rewrite/rewriteHandler.h index b71e20b087c06..1b65cda71cfc7 100644 --- a/src/include/rewrite/rewriteHandler.h +++ b/src/include/rewrite/rewriteHandler.h @@ -4,7 +4,7 @@ * External interface to query rewriter. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/rewrite/rewriteHandler.h @@ -25,11 +25,17 @@ extern void AcquireRewriteLocks(Query *parsetree, extern Node *build_column_default(Relation rel, int attrno); extern Query *get_view_query(Relation view); +extern bool view_has_instead_trigger(Relation view, CmdType event, + List *mergeActionList); extern const char *view_query_is_auto_updatable(Query *viewquery, bool check_cols); extern int relation_is_updatable(Oid reloid, List *outer_reloids, bool include_triggers, Bitmapset *include_cols); +extern void error_view_not_updatable(Relation view, + CmdType command, + List *mergeActionList, + const char *detail); #endif /* REWRITEHANDLER_H */ diff --git a/src/include/rewrite/rewriteManip.h b/src/include/rewrite/rewriteManip.h index 365061fff44c3..ac6d2049e8006 100644 --- a/src/include/rewrite/rewriteManip.h +++ b/src/include/rewrite/rewriteManip.h @@ -4,7 +4,7 @@ * Querytree manipulation subroutines for query rewriter. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/rewrite/rewriteManip.h @@ -37,7 +37,7 @@ typedef enum ReplaceVarsNoMatchOption { REPLACEVARS_REPORT_ERROR, /* throw error if no match */ REPLACEVARS_CHANGE_VARNO, /* change the Var's varno, nothing else */ - REPLACEVARS_SUBSTITUTE_NULL /* replace with a NULL Const */ + REPLACEVARS_SUBSTITUTE_NULL, /* replace with a NULL Const */ } ReplaceVarsNoMatchOption; diff --git a/src/include/rewrite/rewriteRemove.h b/src/include/rewrite/rewriteRemove.h index 1413c11b66797..fb439e88babeb 100644 --- a/src/include/rewrite/rewriteRemove.h +++ b/src/include/rewrite/rewriteRemove.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/rewrite/rewriteRemove.h diff --git a/src/include/rewrite/rewriteSearchCycle.h b/src/include/rewrite/rewriteSearchCycle.h index 102db81dc4031..ce809731b404c 100644 --- a/src/include/rewrite/rewriteSearchCycle.h +++ b/src/include/rewrite/rewriteSearchCycle.h @@ -4,7 +4,7 @@ * Support for rewriting SEARCH and CYCLE clauses. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/rewrite/rewriteSearchCycle.h diff --git a/src/include/rewrite/rewriteSupport.h b/src/include/rewrite/rewriteSupport.h index e5dc367e23af3..381713554844c 100644 --- a/src/include/rewrite/rewriteSupport.h +++ b/src/include/rewrite/rewriteSupport.h @@ -4,7 +4,7 @@ * * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/rewrite/rewriteSupport.h diff --git a/src/include/rewrite/rowsecurity.h b/src/include/rewrite/rowsecurity.h index d208435723476..1717ed4e5e82a 100644 --- a/src/include/rewrite/rowsecurity.h +++ b/src/include/rewrite/rowsecurity.h @@ -5,7 +5,7 @@ * prototypes for rewrite/rowsecurity.c and the structures for managing * the row security policies for relations in relcache. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * ------------------------------------------------------------------------- diff --git a/src/include/snowball/header.h b/src/include/snowball/header.h index dbf04e39657c6..0495fd53b6310 100644 --- a/src/include/snowball/header.h +++ b/src/include/snowball/header.h @@ -13,7 +13,7 @@ * * NOTE: this file should not be included into any non-snowball sources! * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/snowball/header.h * diff --git a/src/include/statistics/extended_stats_internal.h b/src/include/statistics/extended_stats_internal.h index 7b55eb8ffac33..8eed9b338d4db 100644 --- a/src/include/statistics/extended_stats_internal.h +++ b/src/include/statistics/extended_stats_internal.h @@ -3,7 +3,7 @@ * extended_stats_internal.h * POSTGRES extended statistics internal declarations * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/statistics/statistics.h b/src/include/statistics/statistics.h index 17e3e7f881dfa..7f2bf18716d48 100644 --- a/src/include/statistics/statistics.h +++ b/src/include/statistics/statistics.h @@ -3,7 +3,7 @@ * statistics.h * Extended statistics and selectivity estimation functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/statistics/statistics.h @@ -66,8 +66,8 @@ typedef struct MVDependencies #define STATS_MCV_MAGIC 0xE1A651C2 /* marks serialized bytea */ #define STATS_MCV_TYPE_BASIC 1 /* basic MCV list type */ -/* max items in MCV list (should be equal to max default_statistics_target) */ -#define STATS_MCVLIST_MAX_ITEMS 10000 +/* max items in MCV list */ +#define STATS_MCVLIST_MAX_ITEMS MAX_STATISTICS_TARGET /* * Multivariate MCV (most-common value) lists diff --git a/src/include/storage/backendid.h b/src/include/storage/backendid.h deleted file mode 100644 index 1e90b602f0cb5..0000000000000 --- a/src/include/storage/backendid.h +++ /dev/null @@ -1,37 +0,0 @@ -/*------------------------------------------------------------------------- - * - * backendid.h - * POSTGRES backend id communication definitions - * - * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * src/include/storage/backendid.h - * - *------------------------------------------------------------------------- - */ -#ifndef BACKENDID_H -#define BACKENDID_H - -/* ---------------- - * -cim 8/17/90 - * ---------------- - */ -typedef int BackendId; /* unique currently active backend identifier */ - -#define InvalidBackendId (-1) - -extern PGDLLIMPORT BackendId MyBackendId; /* backend id of this backend */ - -/* backend id of our parallel session leader, or InvalidBackendId if none */ -extern PGDLLIMPORT BackendId ParallelLeaderBackendId; - -/* - * The BackendId to use for our session's temp relations is normally our own, - * but parallel workers should use their leader's ID. - */ -#define BackendIdForTempRelations() \ - (ParallelLeaderBackendId == InvalidBackendId ? MyBackendId : ParallelLeaderBackendId) - -#endif /* BACKENDID_H */ diff --git a/src/include/storage/barrier.h b/src/include/storage/barrier.h index e965c7ba75fba..6bb1f665c8e14 100644 --- a/src/include/storage/barrier.h +++ b/src/include/storage/barrier.h @@ -3,7 +3,7 @@ * barrier.h * Barriers for synchronizing cooperating processes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/barrier.h diff --git a/src/include/storage/block.h b/src/include/storage/block.h index 31a036df0dbed..ecde8e051822f 100644 --- a/src/include/storage/block.h +++ b/src/include/storage/block.h @@ -4,7 +4,7 @@ * POSTGRES disk block definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/block.h diff --git a/src/include/storage/buf.h b/src/include/storage/buf.h index 6520d9ae1e850..64a1ad9d2c47a 100644 --- a/src/include/storage/buf.h +++ b/src/include/storage/buf.h @@ -4,7 +4,7 @@ * Basic buffer manager data types. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/buf.h diff --git a/src/include/storage/buf_internals.h b/src/include/storage/buf_internals.h index 30807d5d97ea5..f190e6e5e462b 100644 --- a/src/include/storage/buf_internals.h +++ b/src/include/storage/buf_internals.h @@ -5,7 +5,7 @@ * strategy. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/buf_internals.h @@ -26,6 +26,7 @@ #include "storage/smgr.h" #include "storage/spin.h" #include "utils/relcache.h" +#include "utils/resowner.h" /* * Buffer state is a single 32-bit variable where following data is combined. @@ -212,7 +213,7 @@ BufMappingPartitionLockByIndex(uint32 index) * is held. Thus buffer header lock holder can do complex updates of the * state variable in single write, simultaneously with lock release (cleaning * BM_LOCKED flag). On the other hand, updating of state without holding - * buffer header lock is restricted to CAS, which insure that BM_LOCKED flag + * buffer header lock is restricted to CAS, which ensures that BM_LOCKED flag * is not set. Atomic increment/decrement, OR/AND etc. are not allowed. * * An exception is that if we have the buffer pinned, its tag can't change @@ -383,6 +384,32 @@ typedef struct CkptSortItem extern PGDLLIMPORT CkptSortItem *CkptBufferIds; +/* ResourceOwner callbacks to hold buffer I/Os and pins */ +extern PGDLLIMPORT const ResourceOwnerDesc buffer_io_resowner_desc; +extern PGDLLIMPORT const ResourceOwnerDesc buffer_pin_resowner_desc; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberBuffer(ResourceOwner owner, Buffer buffer) +{ + ResourceOwnerRemember(owner, Int32GetDatum(buffer), &buffer_pin_resowner_desc); +} +static inline void +ResourceOwnerForgetBuffer(ResourceOwner owner, Buffer buffer) +{ + ResourceOwnerForget(owner, Int32GetDatum(buffer), &buffer_pin_resowner_desc); +} +static inline void +ResourceOwnerRememberBufferIO(ResourceOwner owner, Buffer buffer) +{ + ResourceOwnerRemember(owner, Int32GetDatum(buffer), &buffer_io_resowner_desc); +} +static inline void +ResourceOwnerForgetBufferIO(ResourceOwner owner, Buffer buffer) +{ + ResourceOwnerForget(owner, Int32GetDatum(buffer), &buffer_io_resowner_desc); +} + /* * Internal buffer management routines */ @@ -418,12 +445,13 @@ extern void BufTableDelete(BufferTag *tagPtr, uint32 hashcode); /* localbuf.c */ extern bool PinLocalBuffer(BufferDesc *buf_hdr, bool adjust_usagecount); extern void UnpinLocalBuffer(Buffer buffer); +extern void UnpinLocalBufferNoOwner(Buffer buffer); extern PrefetchBufferResult PrefetchLocalBuffer(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum); extern BufferDesc *LocalBufferAlloc(SMgrRelation smgr, ForkNumber forkNum, BlockNumber blockNum, bool *foundPtr); -extern BlockNumber ExtendBufferedRelLocal(ExtendBufferedWhat eb, +extern BlockNumber ExtendBufferedRelLocal(BufferManagerRelation bmr, ForkNumber fork, uint32 flags, uint32 extend_by, diff --git a/src/include/storage/buffile.h b/src/include/storage/buffile.h index 658376671933c..5f6d7c8e3ffba 100644 --- a/src/include/storage/buffile.h +++ b/src/include/storage/buffile.h @@ -15,7 +15,7 @@ * but currently we have no need for oversize temp files without buffered * access. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/buffile.h @@ -44,9 +44,9 @@ extern size_t BufFileReadMaybeEOF(BufFile *file, void *ptr, size_t size, bool eo extern void BufFileWrite(BufFile *file, const void *ptr, size_t size); extern int BufFileSeek(BufFile *file, int fileno, off_t offset, int whence); extern void BufFileTell(BufFile *file, int *fileno, off_t *offset); -extern int BufFileSeekBlock(BufFile *file, long blknum); +extern int BufFileSeekBlock(BufFile *file, int64 blknum); extern int64 BufFileSize(BufFile *file); -extern long BufFileAppend(BufFile *target, BufFile *source); +extern int64 BufFileAppend(BufFile *target, BufFile *source); extern BufFile *BufFileCreateFileSet(FileSet *fileset, const char *name); extern void BufFileExportFileSet(BufFile *file); diff --git a/src/include/storage/bufmgr.h b/src/include/storage/bufmgr.h index 0f5fb6be00e06..a1e71013d328f 100644 --- a/src/include/storage/bufmgr.h +++ b/src/include/storage/bufmgr.h @@ -4,7 +4,7 @@ * POSTGRES buffer manager definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/bufmgr.h @@ -14,6 +14,7 @@ #ifndef BUFMGR_H #define BUFMGR_H +#include "port/pg_iovec.h" #include "storage/block.h" #include "storage/buf.h" #include "storage/bufpage.h" @@ -35,7 +36,7 @@ typedef enum BufferAccessStrategyType BAS_BULKREAD, /* Large read-only scan (hint bit updates are * ok) */ BAS_BULKWRITE, /* Large multi-block write (e.g. COPY IN) */ - BAS_VACUUM /* VACUUM */ + BAS_VACUUM, /* VACUUM */ } BufferAccessStrategyType; /* Possible modes for ReadBufferExtended() */ @@ -47,7 +48,7 @@ typedef enum RBM_ZERO_AND_CLEANUP_LOCK, /* Like RBM_ZERO_AND_LOCK, but locks the page * in "cleanup" mode */ RBM_ZERO_ON_ERROR, /* Read, but return an all-zeros page on error */ - RBM_NORMAL_NO_LOG /* Don't log page as invalid during WAL + RBM_NORMAL_NO_LOG, /* Don't log page as invalid during WAL * replay; otherwise same as RBM_NORMAL */ } ReadBufferMode; @@ -92,20 +93,51 @@ typedef enum ExtendBufferedFlags } ExtendBufferedFlags; /* - * To identify the relation - either relation or smgr + relpersistence has to - * be specified. Used via the EB_REL()/EB_SMGR() macros below. This allows us - * to use the same function for both crash recovery and normal operation. + * Some functions identify relations either by relation or smgr + + * relpersistence. Used via the BMR_REL()/BMR_SMGR() macros below. This + * allows us to use the same function for both recovery and normal operation. */ -typedef struct ExtendBufferedWhat +typedef struct BufferManagerRelation { Relation rel; struct SMgrRelationData *smgr; char relpersistence; -} ExtendBufferedWhat; +} BufferManagerRelation; -#define EB_REL(p_rel) ((ExtendBufferedWhat){.rel = p_rel}) -#define EB_SMGR(p_smgr, p_relpersistence) ((ExtendBufferedWhat){.smgr = p_smgr, .relpersistence = p_relpersistence}) +#define BMR_REL(p_rel) ((BufferManagerRelation){.rel = p_rel}) +#define BMR_SMGR(p_smgr, p_relpersistence) ((BufferManagerRelation){.smgr = p_smgr, .relpersistence = p_relpersistence}) +/* Zero out page if reading fails. */ +#define READ_BUFFERS_ZERO_ON_ERROR (1 << 0) +/* Call smgrprefetch() if I/O necessary. */ +#define READ_BUFFERS_ISSUE_ADVICE (1 << 1) + +struct ReadBuffersOperation +{ + /* + * The following members should be set by the caller. If only smgr is + * provided without rel, then smgr_persistence can be set to override the + * default assumption of RELPERSISTENCE_PERMANENT. + */ + Relation rel; + struct SMgrRelationData *smgr; + char smgr_persistence; + ForkNumber forknum; + BufferAccessStrategy strategy; + + /* + * The following private members are private state for communication + * between StartReadBuffers() and WaitReadBuffers(), initialized only if + * an actual read is required, and should not be modified. + */ + Buffer *buffers; + BlockNumber blocknum; + int flags; + int16 nblocks; + int16 io_buffers_len; +}; + +typedef struct ReadBuffersOperation ReadBuffersOperation; /* forward declared, to avoid having to expose buf_internals.h here */ struct WritebackContext; @@ -133,6 +165,10 @@ extern PGDLLIMPORT bool track_io_timing; extern PGDLLIMPORT int effective_io_concurrency; extern PGDLLIMPORT int maintenance_io_concurrency; +#define MAX_IO_COMBINE_LIMIT PG_IOV_MAX +#define DEFAULT_IO_COMBINE_LIMIT Min(MAX_IO_COMBINE_LIMIT, (128 * 1024) / BLCKSZ) +extern PGDLLIMPORT int io_combine_limit; + extern PGDLLIMPORT int checkpoint_flush_after; extern PGDLLIMPORT int backend_flush_after; extern PGDLLIMPORT int bgwriter_flush_after; @@ -177,26 +213,40 @@ extern Buffer ReadBufferWithoutRelcache(RelFileLocator rlocator, ForkNumber forkNum, BlockNumber blockNum, ReadBufferMode mode, BufferAccessStrategy strategy, bool permanent); + +extern bool StartReadBuffer(ReadBuffersOperation *operation, + Buffer *buffer, + BlockNumber blocknum, + int flags); +extern bool StartReadBuffers(ReadBuffersOperation *operation, + Buffer *buffers, + BlockNumber blockNum, + int *nblocks, + int flags); +extern void WaitReadBuffers(ReadBuffersOperation *operation); + extern void ReleaseBuffer(Buffer buffer); extern void UnlockReleaseBuffer(Buffer buffer); +extern bool BufferIsExclusiveLocked(Buffer buffer); +extern bool BufferIsDirty(Buffer buffer); extern void MarkBufferDirty(Buffer buffer); extern void IncrBufferRefCount(Buffer buffer); extern void CheckBufferIsPinnedOnce(Buffer buffer); extern Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation, BlockNumber blockNum); -extern Buffer ExtendBufferedRel(ExtendBufferedWhat eb, +extern Buffer ExtendBufferedRel(BufferManagerRelation bmr, ForkNumber forkNum, BufferAccessStrategy strategy, uint32 flags); -extern BlockNumber ExtendBufferedRelBy(ExtendBufferedWhat eb, +extern BlockNumber ExtendBufferedRelBy(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, uint32 extend_by, Buffer *buffers, uint32 *extended_by); -extern Buffer ExtendBufferedRelTo(ExtendBufferedWhat eb, +extern Buffer ExtendBufferedRelTo(BufferManagerRelation bmr, ForkNumber fork, BufferAccessStrategy strategy, uint32 flags, @@ -205,7 +255,7 @@ extern Buffer ExtendBufferedRelTo(ExtendBufferedWhat eb, extern void InitBufferPoolAccess(void); extern void AtEOXact_Buffers(bool isCommit); -extern void PrintBufferLeakWarning(Buffer buffer); +extern char *DebugPrintBufferRefcount(Buffer buffer); extern void CheckPointBuffers(int flags); extern BlockNumber BufferGetBlockNumber(Buffer buffer); extern BlockNumber RelationGetNumberOfBlocksInFork(Relation relation, @@ -246,11 +296,12 @@ extern bool ConditionalLockBufferForCleanup(Buffer buffer); extern bool IsBufferCleanupOK(Buffer buffer); extern bool HoldingBufferPinThatDelaysRecovery(void); -extern void AbortBufferIO(Buffer buffer); - extern bool BgBufferSync(struct WritebackContext *wb_context); -extern void TestForOldSnapshot_impl(Snapshot snapshot, Relation relation); +extern void LimitAdditionalPins(uint32 *additional_pins); +extern void LimitAdditionalLocalPins(uint32 *additional_pins); + +extern bool EvictUnpinnedBuffer(Buffer buf); /* in buf_init.c */ extern void InitBufferPool(void); @@ -265,6 +316,7 @@ extern BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype); extern BufferAccessStrategy GetAccessStrategyWithSize(BufferAccessStrategyType btype, int ring_size_kb); extern int GetAccessStrategyBufferCount(BufferAccessStrategy strategy); +extern int GetAccessStrategyPinLimit(BufferAccessStrategy strategy); extern void FreeAccessStrategy(BufferAccessStrategy strategy); @@ -347,9 +399,6 @@ BufferGetPageSize(Buffer buffer) /* * BufferGetPage * Returns the page associated with a buffer. - * - * When this is called as part of a scan, there may be a need for a nearby - * call to TestForOldSnapshot(). See the definition of that for details. */ static inline Page BufferGetPage(Buffer buffer) @@ -357,37 +406,6 @@ BufferGetPage(Buffer buffer) return (Page) BufferGetBlock(buffer); } -/* - * Check whether the given snapshot is too old to have safely read the given - * page from the given table. If so, throw a "snapshot too old" error. - * - * This test generally needs to be performed after every BufferGetPage() call - * that is executed as part of a scan. It is not needed for calls made for - * modifying the page (for example, to position to the right place to insert a - * new index tuple or for vacuuming). It may also be omitted where calls to - * lower-level functions will have already performed the test. - * - * Note that a NULL snapshot argument is allowed and causes a fast return - * without error; this is to support call sites which can be called from - * either scans or index modification areas. - * - * For best performance, keep the tests that are fastest and/or most likely to - * exclude a page from old snapshot testing near the front. - */ -static inline void -TestForOldSnapshot(Snapshot snapshot, Relation relation, Page page) -{ - Assert(relation != NULL); - - if (old_snapshot_threshold >= 0 - && (snapshot) != NULL - && ((snapshot)->snapshot_type == SNAPSHOT_MVCC - || (snapshot)->snapshot_type == SNAPSHOT_TOAST) - && !XLogRecPtrIsInvalid((snapshot)->lsn) - && PageGetLSN(page) > (snapshot)->lsn) - TestForOldSnapshot_impl(snapshot, relation); -} - #endif /* FRONTEND */ #endif /* BUFMGR_H */ diff --git a/src/include/storage/bufpage.h b/src/include/storage/bufpage.h index 424ecba028fc7..d0df02d39c526 100644 --- a/src/include/storage/bufpage.h +++ b/src/include/storage/bufpage.h @@ -4,7 +4,7 @@ * Standard POSTGRES buffer page definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/bufpage.h diff --git a/src/include/storage/bulk_write.h b/src/include/storage/bulk_write.h new file mode 100644 index 0000000000000..cf6f6fcb3f286 --- /dev/null +++ b/src/include/storage/bulk_write.h @@ -0,0 +1,41 @@ +/*------------------------------------------------------------------------- + * + * bulk_write.h + * Efficiently and reliably populate a new relation + * + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/storage/bulk_write.h + * + *------------------------------------------------------------------------- + */ +#ifndef BULK_WRITE_H +#define BULK_WRITE_H + +#include "storage/smgr.h" +#include "utils/rel.h" + +/* Bulk writer state, contents are private to bulk_write.c */ +typedef struct BulkWriteState BulkWriteState; + +/* + * Temporary buffer to hold a page to until it's written out. Use + * smgr_bulk_get_buf() to reserve one of these. This is a separate typedef to + * distinguish it from other block-sized buffers passed around in the system. + */ +typedef PGIOAlignedBlock *BulkWriteBuffer; + +/* forward declared from smgr.h */ +struct SMgrRelationData; + +extern BulkWriteState *smgr_bulk_start_rel(Relation rel, ForkNumber forknum); +extern BulkWriteState *smgr_bulk_start_smgr(struct SMgrRelationData *smgr, ForkNumber forknum, bool use_wal); + +extern BulkWriteBuffer smgr_bulk_get_buf(BulkWriteState *bulkstate); +extern void smgr_bulk_write(BulkWriteState *bulkstate, BlockNumber blocknum, BulkWriteBuffer buf, bool page_std); + +extern void smgr_bulk_finish(BulkWriteState *bulkstate); + +#endif /* BULK_WRITE_H */ diff --git a/src/include/storage/checksum.h b/src/include/storage/checksum.h index 4afd25a0af129..08e9d598ce61c 100644 --- a/src/include/storage/checksum.h +++ b/src/include/storage/checksum.h @@ -3,7 +3,7 @@ * checksum.h * Checksum implementation for data pages. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/checksum.h diff --git a/src/include/storage/checksum_impl.h b/src/include/storage/checksum_impl.h index 7b157161a2db8..7f20de373b4ea 100644 --- a/src/include/storage/checksum_impl.h +++ b/src/include/storage/checksum_impl.h @@ -8,7 +8,7 @@ * referenced by storage/checksum.h. (Note: you may need to redefine * Assert() as empty to compile this successfully externally.) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/checksum_impl.h diff --git a/src/include/storage/condition_variable.h b/src/include/storage/condition_variable.h index 589bdd323cbde..d4720d4bb525d 100644 --- a/src/include/storage/condition_variable.h +++ b/src/include/storage/condition_variable.h @@ -12,7 +12,7 @@ * can be canceled prior to the fulfillment of the condition) and do not * use pointers internally (so that they are safe to use within DSMs). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/condition_variable.h @@ -56,7 +56,7 @@ extern void ConditionVariableInit(ConditionVariable *cv); extern void ConditionVariableSleep(ConditionVariable *cv, uint32 wait_event_info); extern bool ConditionVariableTimedSleep(ConditionVariable *cv, long timeout, uint32 wait_event_info); -extern void ConditionVariableCancelSleep(void); +extern bool ConditionVariableCancelSleep(void); /* * Optionally, ConditionVariablePrepareToSleep can be called before entering diff --git a/src/include/storage/copydir.h b/src/include/storage/copydir.h index a8be5b21e0b2e..a25e258f4797e 100644 --- a/src/include/storage/copydir.h +++ b/src/include/storage/copydir.h @@ -3,7 +3,7 @@ * copydir.h * Copy a directory. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/copydir.h diff --git a/src/include/storage/dsm.h b/src/include/storage/dsm.h index 858bbf61c28d3..1a22b32df1a4d 100644 --- a/src/include/storage/dsm.h +++ b/src/include/storage/dsm.h @@ -3,7 +3,7 @@ * dsm.h * manage dynamic shared memory segments * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/dsm.h diff --git a/src/include/storage/dsm_impl.h b/src/include/storage/dsm_impl.h index daf07bd19cd68..882269603daf7 100644 --- a/src/include/storage/dsm_impl.h +++ b/src/include/storage/dsm_impl.h @@ -3,7 +3,7 @@ * dsm_impl.h * low-level dynamic shared memory primitives * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/dsm_impl.h @@ -63,7 +63,7 @@ typedef enum DSM_OP_CREATE, DSM_OP_ATTACH, DSM_OP_DETACH, - DSM_OP_DESTROY + DSM_OP_DESTROY, } dsm_op; /* Create, attach to, detach from, resize, or destroy a segment. */ diff --git a/src/include/storage/dsm_registry.h b/src/include/storage/dsm_registry.h new file mode 100644 index 0000000000000..5fa79731d2801 --- /dev/null +++ b/src/include/storage/dsm_registry.h @@ -0,0 +1,23 @@ +/*------------------------------------------------------------------------- + * + * dsm_registry.h + * Functions for interfacing with the dynamic shared memory registry. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/storage/dsm_registry.h + * + *------------------------------------------------------------------------- + */ +#ifndef DSM_REGISTRY_H +#define DSM_REGISTRY_H + +extern void *GetNamedDSMSegment(const char *name, size_t size, + void (*init_callback) (void *ptr), + bool *found); + +extern Size DSMRegistryShmemSize(void); +extern void DSMRegistryShmemInit(void); + +#endif /* DSM_REGISTRY_H */ diff --git a/src/include/storage/fd.h b/src/include/storage/fd.h index 6791a406fc114..1456ab383a424 100644 --- a/src/include/storage/fd.h +++ b/src/include/storage/fd.h @@ -4,7 +4,7 @@ * Virtual file descriptor definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/fd.h @@ -15,7 +15,7 @@ /* * calls: * - * File {Close, Read, Write, Size, Sync} + * File {Close, Read, ReadV, Write, WriteV, Size, Sync} * {Path Name Open, Allocate, Free} File * * These are NOT JUST RENAMINGS OF THE UNIX ROUTINES. @@ -43,15 +43,11 @@ #ifndef FD_H #define FD_H +#include "port/pg_iovec.h" + #include #include -typedef enum RecoveryInitSyncMethod -{ - RECOVERY_INIT_SYNC_METHOD_FSYNC, - RECOVERY_INIT_SYNC_METHOD_SYNCFS -} RecoveryInitSyncMethod; - typedef int File; @@ -111,8 +107,8 @@ extern File PathNameOpenFilePerm(const char *fileName, int fileFlags, mode_t fil extern File OpenTemporaryFile(bool interXact); extern void FileClose(File file); extern int FilePrefetch(File file, off_t offset, off_t amount, uint32 wait_event_info); -extern int FileRead(File file, void *buffer, size_t amount, off_t offset, uint32 wait_event_info); -extern int FileWrite(File file, const void *buffer, size_t amount, off_t offset, uint32 wait_event_info); +extern ssize_t FileReadV(File file, const struct iovec *iov, int iovcnt, off_t offset, uint32 wait_event_info); +extern ssize_t FileWriteV(File file, const struct iovec *iov, int iovcnt, off_t offset, uint32 wait_event_info); extern int FileSync(File file, uint32 wait_event_info); extern int FileZero(File file, off_t offset, off_t amount, uint32 wait_event_info); extern int FileFallocate(File file, off_t offset, off_t amount, uint32 wait_event_info); @@ -186,6 +182,7 @@ extern int pg_fsync(int fd); extern int pg_fsync_no_writethrough(int fd); extern int pg_fsync_writethrough(int fd); extern int pg_fdatasync(int fd); +extern bool pg_file_exists(const char *name); extern void pg_flush_data(int fd, off_t offset, off_t nbytes); extern int pg_truncate(const char *path, off_t length); extern void fsync_fname(const char *fname, bool isdir); @@ -195,8 +192,28 @@ extern int durable_unlink(const char *fname, int elevel); extern void SyncDataDirectory(void); extern int data_sync_elevel(int elevel); -/* Filename components */ -#define PG_TEMP_FILES_DIR "pgsql_tmp" -#define PG_TEMP_FILE_PREFIX "pgsql_tmp" +static inline ssize_t +FileRead(File file, void *buffer, size_t amount, off_t offset, + uint32 wait_event_info) +{ + struct iovec iov = { + .iov_base = buffer, + .iov_len = amount + }; + + return FileReadV(file, &iov, 1, offset, wait_event_info); +} + +static inline ssize_t +FileWrite(File file, const void *buffer, size_t amount, off_t offset, + uint32 wait_event_info) +{ + struct iovec iov = { + .iov_base = unconstify(void *, buffer), + .iov_len = amount + }; + + return FileWriteV(file, &iov, 1, offset, wait_event_info); +} #endif /* FD_H */ diff --git a/src/include/storage/fileset.h b/src/include/storage/fileset.h index 9aa6581d29693..1674f086d4ff6 100644 --- a/src/include/storage/fileset.h +++ b/src/include/storage/fileset.h @@ -3,7 +3,7 @@ * fileset.h * Management of named temporary files. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/fileset.h diff --git a/src/include/storage/freespace.h b/src/include/storage/freespace.h index 9e1a85a141c56..d64a634be35c6 100644 --- a/src/include/storage/freespace.h +++ b/src/include/storage/freespace.h @@ -4,7 +4,7 @@ * POSTGRES free space map for quickly finding free space in relations * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/freespace.h diff --git a/src/include/storage/fsm_internals.h b/src/include/storage/fsm_internals.h index 9e314c83fa4f0..a922e691fe067 100644 --- a/src/include/storage/fsm_internals.h +++ b/src/include/storage/fsm_internals.h @@ -4,7 +4,7 @@ * internal functions for free space map * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/fsm_internals.h diff --git a/src/include/storage/indexfsm.h b/src/include/storage/indexfsm.h index aed77a7a9f071..ad376b1131933 100644 --- a/src/include/storage/indexfsm.h +++ b/src/include/storage/indexfsm.h @@ -4,7 +4,7 @@ * POSTGRES free space map for quickly finding an unused page in index * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/indexfsm.h diff --git a/src/include/storage/ipc.h b/src/include/storage/ipc.h index 888c08b30675e..b2d062781ecdb 100644 --- a/src/include/storage/ipc.h +++ b/src/include/storage/ipc.h @@ -8,7 +8,7 @@ * exit-time cleanup for either a postmaster or a backend. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/ipc.h @@ -79,6 +79,9 @@ extern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook; extern Size CalculateShmemSize(int *num_semaphores); extern void CreateSharedMemoryAndSemaphores(void); +#ifdef EXEC_BACKEND +extern void AttachSharedMemoryStructs(void); +#endif extern void InitializeShmemGUCs(void); #endif /* IPC_H */ diff --git a/src/include/storage/item.h b/src/include/storage/item.h index 56d59a70cdf32..d524246fb125b 100644 --- a/src/include/storage/item.h +++ b/src/include/storage/item.h @@ -4,7 +4,7 @@ * POSTGRES disk item definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/item.h diff --git a/src/include/storage/itemid.h b/src/include/storage/itemid.h index e5cfb8c3ccb89..6d29722ec1fe7 100644 --- a/src/include/storage/itemid.h +++ b/src/include/storage/itemid.h @@ -4,7 +4,7 @@ * Standard POSTGRES buffer page item identifier/line pointer definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/itemid.h diff --git a/src/include/storage/itemptr.h b/src/include/storage/itemptr.h index fafefa14cd8cb..cfe21df765067 100644 --- a/src/include/storage/itemptr.h +++ b/src/include/storage/itemptr.h @@ -4,7 +4,7 @@ * POSTGRES disk item pointer definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/itemptr.h diff --git a/src/include/storage/large_object.h b/src/include/storage/large_object.h index db521f23eb80c..9cfb7aa777a6f 100644 --- a/src/include/storage/large_object.h +++ b/src/include/storage/large_object.h @@ -5,7 +5,7 @@ * zillions of large objects (internal, external, jaquith, inversion). * Now we only support inversion. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/large_object.h diff --git a/src/include/storage/latch.h b/src/include/storage/latch.h index 99cc47874ac66..7e194d536f055 100644 --- a/src/include/storage/latch.h +++ b/src/include/storage/latch.h @@ -90,7 +90,7 @@ * efficient than using WaitLatch or WaitLatchOrSocket. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/latch.h @@ -102,6 +102,8 @@ #include +#include "utils/resowner.h" + /* * Latch structure should be treated as opaque and only accessed through * the public functions. It is defined here to allow embedding Latches as @@ -173,7 +175,7 @@ extern void SetLatch(Latch *latch); extern void ResetLatch(Latch *latch); extern void ShutdownLatchSupport(void); -extern WaitEventSet *CreateWaitEventSet(MemoryContext context, int nevents); +extern WaitEventSet *CreateWaitEventSet(ResourceOwner resowner, int nevents); extern void FreeWaitEventSet(WaitEventSet *set); extern void FreeWaitEventSetAfterFork(WaitEventSet *set); extern int AddWaitEventToSet(WaitEventSet *set, uint32 events, pgsocket fd, diff --git a/src/include/storage/lmgr.h b/src/include/storage/lmgr.h index 4ee91e3cf93cd..ce15125ac3bc0 100644 --- a/src/include/storage/lmgr.h +++ b/src/include/storage/lmgr.h @@ -4,7 +4,7 @@ * POSTGRES lock manager definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/lmgr.h @@ -31,7 +31,7 @@ typedef enum XLTW_Oper XLTW_InsertIndex, XLTW_InsertIndexUnique, XLTW_FetchUpdated, - XLTW_RecheckExclusionConstr + XLTW_RecheckExclusionConstr, } XLTW_Oper; extern void RelationInitLockInfo(Relation relation); @@ -48,6 +48,8 @@ extern bool ConditionalLockRelation(Relation relation, LOCKMODE lockmode); extern void UnlockRelation(Relation relation, LOCKMODE lockmode); extern bool CheckRelationLockedByMe(Relation relation, LOCKMODE lockmode, bool orstronger); +extern bool CheckRelationOidLockedByMe(Oid relid, LOCKMODE lockmode, + bool orstronger); extern bool LockHasWaitersRelation(Relation relation, LOCKMODE lockmode); extern void LockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode); @@ -93,12 +95,16 @@ extern void SpeculativeInsertionWait(TransactionId xid, uint32 token); /* Lock a general object (other than a relation) of the current database */ extern void LockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode); +extern bool ConditionalLockDatabaseObject(Oid classid, Oid objid, + uint16 objsubid, LOCKMODE lockmode); extern void UnlockDatabaseObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode); /* Lock a shared-across-databases object (other than a relation) */ extern void LockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode); +extern bool ConditionalLockSharedObject(Oid classid, Oid objid, uint16 objsubid, + LOCKMODE lockmode); extern void UnlockSharedObject(Oid classid, Oid objid, uint16 objsubid, LOCKMODE lockmode); diff --git a/src/include/storage/lock.h b/src/include/storage/lock.h index 8575bea25c764..cc1f6e78c396c 100644 --- a/src/include/storage/lock.h +++ b/src/include/storage/lock.h @@ -4,7 +4,7 @@ * POSTGRES low-level lock mechanism * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/lock.h @@ -19,9 +19,9 @@ #endif #include "lib/ilist.h" -#include "storage/backendid.h" #include "storage/lockdefs.h" #include "storage/lwlock.h" +#include "storage/procnumber.h" #include "storage/shmem.h" #include "utils/timestamp.h" @@ -42,7 +42,7 @@ extern PGDLLIMPORT bool Debug_deadlocks; /* * Top-level transactions are identified by VirtualTransactionIDs comprising - * PGPROC fields backendId and lxid. For recovered prepared transactions, the + * PGPROC fields procNumber and lxid. For recovered prepared transactions, the * LocalTransactionId is an ordinary XID; LOCKTAG_VIRTUALTRANSACTION never * refers to that kind. These are guaranteed unique over the short term, but * will be reused after a database restart or XID wraparound; hence they @@ -50,7 +50,7 @@ extern PGDLLIMPORT bool Debug_deadlocks; * * Note that struct VirtualTransactionId can not be assumed to be atomically * assignable as a whole. However, type LocalTransactionId is assumed to - * be atomically assignable, and the backend ID doesn't change often enough + * be atomically assignable, and the proc number doesn't change often enough * to be a problem, so we can fetch or assign the two fields separately. * We deliberately refrain from using the struct within PGPROC, to prevent * coding errors from trying to use struct assignment with it; instead use @@ -58,7 +58,7 @@ extern PGDLLIMPORT bool Debug_deadlocks; */ typedef struct { - BackendId backendId; /* backendId from PGPROC */ + ProcNumber procNumber; /* proc number of the PGPROC */ LocalTransactionId localTransactionId; /* lxid from PGPROC */ } VirtualTransactionId; @@ -67,16 +67,16 @@ typedef struct #define VirtualTransactionIdIsValid(vxid) \ (LocalTransactionIdIsValid((vxid).localTransactionId)) #define VirtualTransactionIdIsRecoveredPreparedXact(vxid) \ - ((vxid).backendId == InvalidBackendId) + ((vxid).procNumber == INVALID_PROC_NUMBER) #define VirtualTransactionIdEquals(vxid1, vxid2) \ - ((vxid1).backendId == (vxid2).backendId && \ + ((vxid1).procNumber == (vxid2).procNumber && \ (vxid1).localTransactionId == (vxid2).localTransactionId) #define SetInvalidVirtualTransactionId(vxid) \ - ((vxid).backendId = InvalidBackendId, \ + ((vxid).procNumber = INVALID_PROC_NUMBER, \ (vxid).localTransactionId = InvalidLocalTransactionId) -#define GET_VXID_FROM_PGPROC(vxid, proc) \ - ((vxid).backendId = (proc).backendId, \ - (vxid).localTransactionId = (proc).lxid) +#define GET_VXID_FROM_PGPROC(vxid_dst, proc) \ + ((vxid_dst).procNumber = (proc).vxid.procNumber, \ + (vxid_dst).localTransactionId = (proc).vxid.lxid) /* MAX_LOCKMODES cannot be larger than the # of bits in LOCKMASK */ #define MAX_LOCKMODES 10 @@ -145,7 +145,7 @@ typedef enum LockTagType LOCKTAG_OBJECT, /* non-relation database object */ LOCKTAG_USERLOCK, /* reserved for old contrib/userlock code */ LOCKTAG_ADVISORY, /* advisory user locks */ - LOCKTAG_APPLY_TRANSACTION /* transaction being applied on a logical + LOCKTAG_APPLY_TRANSACTION, /* transaction being applied on a logical * replication subscriber */ } LockTagType; @@ -233,7 +233,7 @@ typedef struct LOCKTAG /* ID info for a virtual transaction is its VirtualTransactionId */ #define SET_LOCKTAG_VIRTUALTRANSACTION(locktag,vxid) \ - ((locktag).locktag_field1 = (vxid).backendId, \ + ((locktag).locktag_field1 = (vxid).procNumber, \ (locktag).locktag_field2 = (vxid).localTransactionId, \ (locktag).locktag_field3 = 0, \ (locktag).locktag_field4 = 0, \ @@ -454,8 +454,7 @@ typedef struct LockInstanceData LOCKTAG locktag; /* tag for locked object */ LOCKMASK holdMask; /* locks held by this PGPROC */ LOCKMODE waitLockMode; /* lock awaited by this PGPROC, if any */ - BackendId backend; /* backend ID of this PGPROC */ - LocalTransactionId lxid; /* local transaction ID of this PGPROC */ + VirtualTransactionId vxid; /* virtual transaction ID of this PGPROC */ TimestampTz waitStart; /* time at which this PGPROC started waiting * for lock */ int pid; /* pid of this PGPROC */ @@ -502,7 +501,7 @@ typedef enum LOCKACQUIRE_NOT_AVAIL, /* lock not available, and dontWait=true */ LOCKACQUIRE_OK, /* lock successfully acquired */ LOCKACQUIRE_ALREADY_HELD, /* incremented count for lock already held */ - LOCKACQUIRE_ALREADY_CLEAR /* incremented count for lock already clear */ + LOCKACQUIRE_ALREADY_CLEAR, /* incremented count for lock already clear */ } LockAcquireResult; /* Deadlock states identified by DeadLockCheck() */ @@ -512,7 +511,7 @@ typedef enum DS_NO_DEADLOCK, /* no deadlock detected */ DS_SOFT_DEADLOCK, /* deadlock avoided by queue rearrangement */ DS_HARD_DEADLOCK, /* deadlock, no way out but ERROR */ - DS_BLOCKED_BY_AUTOVACUUM /* no deadlock; queue blocked by autovacuum + DS_BLOCKED_BY_AUTOVACUUM, /* no deadlock; queue blocked by autovacuum * worker */ } DeadLockState; @@ -540,7 +539,7 @@ typedef enum * used for a given lock group is determined by the group leader's pgprocno. */ #define LockHashPartitionLockByProc(leader_pgproc) \ - LockHashPartitionLock((leader_pgproc)->pgprocno) + LockHashPartitionLock(GetNumberFromPGProc(leader_pgproc)) /* * function prototypes @@ -568,7 +567,8 @@ extern void LockReleaseAll(LOCKMETHODID lockmethodid, bool allLocks); extern void LockReleaseSession(LOCKMETHODID lockmethodid); extern void LockReleaseCurrentOwner(LOCALLOCK **locallocks, int nlocks); extern void LockReassignCurrentOwner(LOCALLOCK **locallocks, int nlocks); -extern bool LockHeldByMe(const LOCKTAG *locktag, LOCKMODE lockmode); +extern bool LockHeldByMe(const LOCKTAG *locktag, + LOCKMODE lockmode, bool orstronger); #ifdef USE_ASSERT_CHECKING extern HTAB *GetLockMethodLocalHash(void); #endif diff --git a/src/include/storage/lockdefs.h b/src/include/storage/lockdefs.h index e25216e03658e..810b297edf95b 100644 --- a/src/include/storage/lockdefs.h +++ b/src/include/storage/lockdefs.h @@ -7,7 +7,7 @@ * contains definition that have to (indirectly) be available when included by * FRONTEND code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/lockdefs.h @@ -47,6 +47,8 @@ typedef int LOCKMODE; #define MaxLockMode 8 /* highest standard lock mode */ +/* See README.tuplock section "Locking to write inplace-updated tables" */ +#define InplaceUpdateTupleLock ExclusiveLock /* WAL representation of an AccessExclusiveLock on a table */ typedef struct xl_standby_lock diff --git a/src/include/storage/lwlock.h b/src/include/storage/lwlock.h index 34169e5889e4f..d70e6d37e097a 100644 --- a/src/include/storage/lwlock.h +++ b/src/include/storage/lwlock.h @@ -4,7 +4,7 @@ * Lightweight lock manager * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/lwlock.h @@ -19,6 +19,7 @@ #endif #include "port/atomics.h" +#include "storage/lwlocknames.h" #include "storage/proclist_types.h" struct PGPROC; @@ -82,9 +83,6 @@ typedef struct NamedLWLockTranche extern PGDLLIMPORT NamedLWLockTranche *NamedLWLockTrancheArray; extern PGDLLIMPORT int NamedLWLockTrancheRequests; -/* Names for fixed lwlocks */ -#include "storage/lwlocknames.h" - /* * It's a bit odd to declare NUM_BUFFER_PARTITIONS and NUM_LOCK_PARTITIONS * here, but we need them to figure out offsets within MainLWLockArray, and @@ -115,7 +113,7 @@ typedef enum LWLockMode { LW_EXCLUSIVE, LW_SHARED, - LW_WAIT_UNTIL_FREE /* A special mode used in PGPROC->lwWaitMode, + LW_WAIT_UNTIL_FREE, /* A special mode used in PGPROC->lwWaitMode, * when waiting for lock to become free. Not * to be used as LWLockAcquire argument */ } LWLockMode; @@ -129,14 +127,14 @@ extern bool LWLockAcquire(LWLock *lock, LWLockMode mode); extern bool LWLockConditionalAcquire(LWLock *lock, LWLockMode mode); extern bool LWLockAcquireOrWait(LWLock *lock, LWLockMode mode); extern void LWLockRelease(LWLock *lock); -extern void LWLockReleaseClearVar(LWLock *lock, uint64 *valptr, uint64 val); +extern void LWLockReleaseClearVar(LWLock *lock, pg_atomic_uint64 *valptr, uint64 val); extern void LWLockReleaseAll(void); extern bool LWLockHeldByMe(LWLock *lock); extern bool LWLockAnyHeldByMe(LWLock *lock, int nlocks, size_t stride); extern bool LWLockHeldByMeInMode(LWLock *lock, LWLockMode mode); -extern bool LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval); -extern void LWLockUpdateVar(LWLock *lock, uint64 *valptr, uint64 val); +extern bool LWLockWaitForVar(LWLock *lock, pg_atomic_uint64 *valptr, uint64 oldval, uint64 *newval); +extern void LWLockUpdateVar(LWLock *lock, pg_atomic_uint64 *valptr, uint64 val); extern Size LWLockShmemSize(void); extern void CreateLWLocks(void); @@ -207,7 +205,17 @@ typedef enum BuiltinTrancheIds LWTRANCHE_PGSTATS_DATA, LWTRANCHE_LAUNCHER_DSA, LWTRANCHE_LAUNCHER_HASH, - LWTRANCHE_FIRST_USER_DEFINED + LWTRANCHE_DSM_REGISTRY_DSA, + LWTRANCHE_DSM_REGISTRY_HASH, + LWTRANCHE_COMMITTS_SLRU, + LWTRANCHE_MULTIXACTMEMBER_SLRU, + LWTRANCHE_MULTIXACTOFFSET_SLRU, + LWTRANCHE_NOTIFY_SLRU, + LWTRANCHE_SERIAL_SLRU, + LWTRANCHE_SUBTRANS_SLRU, + LWTRANCHE_XACT_SLRU, + LWTRANCHE_PARALLEL_VACUUM_DSA, + LWTRANCHE_FIRST_USER_DEFINED, } BuiltinTrancheIds; /* diff --git a/src/include/storage/lwlocklist.h b/src/include/storage/lwlocklist.h new file mode 100644 index 0000000000000..6a2f64c54fb57 --- /dev/null +++ b/src/include/storage/lwlocklist.h @@ -0,0 +1,85 @@ +/*------------------------------------------------------------------------- + * + * lwlocklist.h + * + * The predefined LWLock list is kept in its own source file for use by + * automatic tools. The exact representation of a keyword is determined by + * the PG_LWLOCK macro, which is not defined in this file; it can be + * defined by the caller for special purposes. + * + * Also, generate-lwlocknames.pl processes this file to create lwlocknames.h. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/include/storage/lwlocklist.h + * + *------------------------------------------------------------------------- + */ + +/* + * Some commonly-used locks have predefined positions within MainLWLockArray; + * these are defined here. If you add a lock, add it to the end to avoid + * renumbering the existing locks; if you remove a lock, consider leaving a gap + * in the numbering sequence for the benefit of DTrace and other external + * debugging scripts. Also, do not forget to update the section + * WaitEventLWLock of src/backend/utils/activity/wait_event_names.txt. + * + * Note that the names here don't include the Lock suffix, to appease the + * C preprocessor; it's added elsewhere. + */ + +/* 0 is available; was formerly BufFreelistLock */ +PG_LWLOCK(1, ShmemIndex) +PG_LWLOCK(2, OidGen) +PG_LWLOCK(3, XidGen) +PG_LWLOCK(4, ProcArray) +PG_LWLOCK(5, SInvalRead) +PG_LWLOCK(6, SInvalWrite) +PG_LWLOCK(7, WALBufMapping) +PG_LWLOCK(8, WALWrite) +PG_LWLOCK(9, ControlFile) +/* 10 was CheckpointLock */ +/* 11 was XactSLRULock */ +/* 12 was SubtransSLRULock */ +PG_LWLOCK(13, MultiXactGen) +/* 14 was MultiXactOffsetSLRULock */ +/* 15 was MultiXactMemberSLRULock */ +PG_LWLOCK(16, RelCacheInit) +PG_LWLOCK(17, CheckpointerComm) +PG_LWLOCK(18, TwoPhaseState) +PG_LWLOCK(19, TablespaceCreate) +PG_LWLOCK(20, BtreeVacuum) +PG_LWLOCK(21, AddinShmemInit) +PG_LWLOCK(22, Autovacuum) +PG_LWLOCK(23, AutovacuumSchedule) +PG_LWLOCK(24, SyncScan) +PG_LWLOCK(25, RelationMapping) +/* 26 was NotifySLRULock */ +PG_LWLOCK(27, NotifyQueue) +PG_LWLOCK(28, SerializableXactHash) +PG_LWLOCK(29, SerializableFinishedList) +PG_LWLOCK(30, SerializablePredicateList) +/* 31 was SerialSLRULock */ +PG_LWLOCK(32, SyncRep) +PG_LWLOCK(33, BackgroundWorker) +PG_LWLOCK(34, DynamicSharedMemoryControl) +PG_LWLOCK(35, AutoFile) +PG_LWLOCK(36, ReplicationSlotAllocation) +PG_LWLOCK(37, ReplicationSlotControl) +/* 38 was CommitTsSLRULock */ +PG_LWLOCK(39, CommitTs) +PG_LWLOCK(40, ReplicationOrigin) +PG_LWLOCK(41, MultiXactTruncation) +/* 42 was OldSnapshotTimeMapLock */ +PG_LWLOCK(43, LogicalRepWorker) +PG_LWLOCK(44, XactTruncation) +/* 45 was XactTruncationLock until removal of BackendRandomLock */ +PG_LWLOCK(46, WrapLimitsVacuum) +PG_LWLOCK(47, NotifyQueueTail) +PG_LWLOCK(48, WaitEventCustom) +PG_LWLOCK(49, WALSummarizer) +PG_LWLOCK(50, DSMRegistry) +PG_LWLOCK(51, InjectionPoint) +PG_LWLOCK(52, SerialControl) diff --git a/src/include/storage/md.h b/src/include/storage/md.h index 941879ee6a8fd..5dbd0033c6f25 100644 --- a/src/include/storage/md.h +++ b/src/include/storage/md.h @@ -4,7 +4,7 @@ * magnetic disk storage manager public interface declarations. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/md.h @@ -31,17 +31,19 @@ extern void mdextend(SMgrRelation reln, ForkNumber forknum, extern void mdzeroextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, int nblocks, bool skipFsync); extern bool mdprefetch(SMgrRelation reln, ForkNumber forknum, - BlockNumber blocknum); -extern void mdread(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, - void *buffer); -extern void mdwrite(SMgrRelation reln, ForkNumber forknum, - BlockNumber blocknum, const void *buffer, bool skipFsync); + BlockNumber blocknum, int nblocks); +extern void mdreadv(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, + void **buffers, BlockNumber nblocks); +extern void mdwritev(SMgrRelation reln, ForkNumber forknum, + BlockNumber blocknum, + const void **buffers, BlockNumber nblocks, bool skipFsync); extern void mdwriteback(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, BlockNumber nblocks); extern BlockNumber mdnblocks(SMgrRelation reln, ForkNumber forknum); extern void mdtruncate(SMgrRelation reln, ForkNumber forknum, - BlockNumber nblocks); + BlockNumber old_blocks, BlockNumber nblocks); extern void mdimmedsync(SMgrRelation reln, ForkNumber forknum); +extern void mdregistersync(SMgrRelation reln, ForkNumber forknum); extern void ForgetDatabaseSyncRequests(Oid dbid); extern void DropRelationFiles(RelFileLocator *delrels, int ndelrels, bool isRedo); diff --git a/src/include/storage/meson.build b/src/include/storage/meson.build index c2f64517e02c2..f889093117e39 100644 --- a/src/include/storage/meson.build +++ b/src/include/storage/meson.build @@ -1,8 +1,10 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group -lwlocknames = custom_target('lwlocknames', - input: files('../../backend/storage/lmgr/lwlocknames.txt'), - output: ['lwlocknames.h', 'lwlocknames.c'], +lwlocknames_h = custom_target('lwlocknames_h', + input: files( + '../../include/storage/lwlocklist.h', + '../../backend/utils/activity/wait_event_names.txt'), + output: ['lwlocknames.h'], command: [ perl, files('../../backend/storage/lmgr/generate-lwlocknames.pl'), '-o', '@OUTDIR@', @@ -10,12 +12,10 @@ lwlocknames = custom_target('lwlocknames', ], build_by_default: true, install: true, - install_dir: [dir_include_server / 'storage', false], + install_dir: dir_include_server / 'storage', ) -lwlocknames_h = lwlocknames[0] - generated_backend_headers += lwlocknames_h # autoconf generates the file there, ensure we get a conflict -generated_sources_ac += {'src/backend/storage/lmgr': ['lwlocknames.c', 'lwlocknames.h']} +generated_sources_ac += {'src/backend/storage/lmgr': ['lwlocknames.h']} diff --git a/src/include/storage/off.h b/src/include/storage/off.h index 3540308069aef..575cca83dd19c 100644 --- a/src/include/storage/off.h +++ b/src/include/storage/off.h @@ -4,7 +4,7 @@ * POSTGRES disk "offset" definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/off.h diff --git a/src/include/storage/pg_sema.h b/src/include/storage/pg_sema.h index 3bf03420741a8..dfef79ac96384 100644 --- a/src/include/storage/pg_sema.h +++ b/src/include/storage/pg_sema.h @@ -10,7 +10,7 @@ * be provided by each port. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/pg_sema.h diff --git a/src/include/storage/pg_shmem.h b/src/include/storage/pg_shmem.h index 4dd05f156d547..3065ff5be71c1 100644 --- a/src/include/storage/pg_shmem.h +++ b/src/include/storage/pg_shmem.h @@ -14,7 +14,7 @@ * only one ID number. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/pg_shmem.h @@ -46,12 +46,13 @@ extern PGDLLIMPORT int shared_memory_type; extern PGDLLIMPORT int huge_pages; extern PGDLLIMPORT int huge_page_size; -/* Possible values for huge_pages */ +/* Possible values for huge_pages and huge_pages_status */ typedef enum { HUGE_PAGES_OFF, HUGE_PAGES_ON, - HUGE_PAGES_TRY + HUGE_PAGES_TRY, /* only for huge_pages */ + HUGE_PAGES_UNKNOWN, /* only for huge_pages_status */ } HugePagesType; /* Possible values for shared_memory_type */ @@ -59,7 +60,7 @@ typedef enum { SHMEM_TYPE_WINDOWS, SHMEM_TYPE_SYSV, - SHMEM_TYPE_MMAP + SHMEM_TYPE_MMAP, } PGShmemType; #ifndef WIN32 diff --git a/src/include/storage/pmsignal.h b/src/include/storage/pmsignal.h index 92dc764667142..029b7201093b3 100644 --- a/src/include/storage/pmsignal.h +++ b/src/include/storage/pmsignal.h @@ -4,7 +4,7 @@ * routines for signaling between the postmaster and its child processes * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/pmsignal.h @@ -51,7 +51,7 @@ typedef enum { PMQUIT_NOT_SENT = 0, /* postmaster hasn't sent SIGQUIT */ PMQUIT_FOR_CRASH, /* some other backend bought the farm */ - PMQUIT_FOR_STOP /* immediate stop was commanded */ + PMQUIT_FOR_STOP, /* immediate stop was commanded */ } QuitSignalReason; /* PMSignalData is an opaque struct, details known only within pmsignal.c */ diff --git a/src/include/storage/predicate.h b/src/include/storage/predicate.h index cd48afa17b267..14ee9b94a2ff6 100644 --- a/src/include/storage/predicate.h +++ b/src/include/storage/predicate.h @@ -4,7 +4,7 @@ * POSTGRES public predicate locking definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/predicate.h @@ -26,10 +26,6 @@ extern PGDLLIMPORT int max_predicate_locks_per_xact; extern PGDLLIMPORT int max_predicate_locks_per_relation; extern PGDLLIMPORT int max_predicate_locks_per_page; - -/* Number of SLRU buffers to use for Serial SLRU */ -#define NUM_SERIAL_BUFFERS 16 - /* * A handle used for sharing SERIALIZABLEXACT objects between the participants * in a parallel query. diff --git a/src/include/storage/predicate_internals.h b/src/include/storage/predicate_internals.h index 93f84500bf0c8..cb0ec9bc98e33 100644 --- a/src/include/storage/predicate_internals.h +++ b/src/include/storage/predicate_internals.h @@ -4,7 +4,7 @@ * POSTGRES internal predicate locking definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/predicate_internals.h @@ -362,7 +362,7 @@ typedef enum PredicateLockTargetType { PREDLOCKTAG_RELATION, PREDLOCKTAG_PAGE, - PREDLOCKTAG_TUPLE + PREDLOCKTAG_TUPLE, /* TODO SSI: Other types may be needed for index locking */ } PredicateLockTargetType; @@ -424,7 +424,7 @@ typedef struct PredicateLockData typedef enum TwoPhasePredicateRecordType { TWOPHASEPREDICATERECORD_XACT, - TWOPHASEPREDICATERECORD_LOCK + TWOPHASEPREDICATERECORD_LOCK, } TwoPhasePredicateRecordType; /* diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h index ef74f3269324a..bf0a714d60e37 100644 --- a/src/include/storage/proc.h +++ b/src/include/storage/proc.h @@ -4,7 +4,7 @@ * per-process shared memory data structures * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/proc.h @@ -21,6 +21,7 @@ #include "storage/lock.h" #include "storage/pg_sema.h" #include "storage/proclist_types.h" +#include "storage/procnumber.h" /* * Each backend advertises up to PGPROC_MAX_CACHED_SUBXIDS TransactionIds @@ -84,12 +85,6 @@ struct XidCache */ #define FP_LOCK_SLOTS_PER_BACKEND 16 -/* - * An invalid pgprocno. Must be larger than the maximum number of PGPROC - * structures we could possibly have. See comments for MAX_BACKENDS. - */ -#define INVALID_PGPROCNO PG_INT32_MAX - /* * Flags for PGPROC.delayChkptFlags * @@ -186,28 +181,38 @@ struct PGPROC * vacuum must not remove tuples deleted by * xid >= xmin ! */ - LocalTransactionId lxid; /* local id of top-level transaction currently - * being executed by this proc, if running; - * else InvalidLocalTransactionId */ int pid; /* Backend's process ID; 0 if prepared xact */ int pgxactoff; /* offset into various ProcGlobal->arrays with * data mirrored from this PGPROC */ - int pgprocno; /* Number of this PGPROC in - * ProcGlobal->allProcs array. This is set - * once by InitProcGlobal(). - * ProcGlobal->allProcs[n].pgprocno == n */ + /* + * Currently running top-level transaction's virtual xid. Together these + * form a VirtualTransactionId, but we don't use that struct because this + * is not atomically assignable as whole, and we want to enforce code to + * consider both parts separately. See comments at VirtualTransactionId. + */ + struct + { + ProcNumber procNumber; /* For regular backends, equal to + * GetNumberFromPGProc(proc). For prepared + * xacts, ID of the original backend that + * processed the transaction. For unused + * PGPROC entries, INVALID_PROC_NUMBER. */ + LocalTransactionId lxid; /* local id of top-level transaction + * currently * being executed by this + * proc, if running; else + * InvalidLocalTransactionId */ + } vxid; /* These fields are zero while a backend is still starting up: */ - BackendId backendId; /* This backend's backend ID (if assigned) */ Oid databaseId; /* OID of database this backend is using */ Oid roleId; /* OID of role using this backend */ Oid tempNamespaceId; /* OID of temp schema this backend is * using */ - bool isBackgroundWorker; /* true if background worker. */ + bool isBackgroundWorker; /* true if not a regular backend. */ /* * While in hot standby mode, shows that a conflict signal has been sent @@ -281,7 +286,7 @@ struct PGPROC TransactionId clogGroupMemberXid; /* transaction id of clog group member */ XidStatus clogGroupMemberXidStatus; /* transaction status of clog * group member */ - int clogGroupMemberPage; /* clog page corresponding to + int64 clogGroupMemberPage; /* clog page corresponding to * transaction id of clog group member */ XLogRecPtr clogGroupMemberLsn; /* WAL location of commit record for clog * group member */ @@ -386,7 +391,7 @@ typedef struct PROC_HDR uint32 allProcCount; /* Head of list of free PGPROC structures */ dlist_head freeProcs; - /* Head of list of autovacuum's free PGPROC structures */ + /* Head of list of autovacuum & special worker free PGPROC structures */ dlist_head autovacFreeProcs; /* Head of list of bgworker free PGPROC structures */ dlist_head bgworkerFreeProcs; @@ -410,24 +415,39 @@ extern PGDLLIMPORT PROC_HDR *ProcGlobal; extern PGDLLIMPORT PGPROC *PreparedXactProcs; -/* Accessor for PGPROC given a pgprocno. */ +/* + * Accessors for getting PGPROC given a ProcNumber and vice versa. + */ #define GetPGProcByNumber(n) (&ProcGlobal->allProcs[(n)]) +#define GetNumberFromPGProc(proc) ((proc) - &ProcGlobal->allProcs[0]) + +/* + * We set aside some extra PGPROC structures for "special worker" processes, + * which are full-fledged backends (they can run transactions) + * but are unique animals that there's never more than one of. + * Currently there are two such processes: the autovacuum launcher + * and the slotsync worker. + */ +#define NUM_SPECIAL_WORKER_PROCS 2 /* * We set aside some extra PGPROC structures for auxiliary processes, - * ie things that aren't full-fledged backends but need shmem access. + * ie things that aren't full-fledged backends (they cannot run transactions + * or take heavyweight locks) but need shmem access. * - * Background writer, checkpointer, WAL writer and archiver run during normal - * operation. Startup process and WAL receiver also consume 2 slots, but WAL - * writer is launched only after startup has exited, so we only need 5 slots. + * Background writer, checkpointer, WAL writer, WAL summarizer, and archiver + * run during normal operation. Startup process and WAL receiver also consume + * 2 slots, but WAL writer is launched only after startup has exited, so we + * only need 6 slots. */ -#define NUM_AUXILIARY_PROCS 5 +#define NUM_AUXILIARY_PROCS 6 /* configurable options */ extern PGDLLIMPORT int DeadlockTimeout; extern PGDLLIMPORT int StatementTimeout; extern PGDLLIMPORT int LockTimeout; extern PGDLLIMPORT int IdleInTransactionSessionTimeout; +extern PGDLLIMPORT int TransactionTimeout; extern PGDLLIMPORT int IdleSessionTimeout; extern PGDLLIMPORT bool log_lock_waits; @@ -448,7 +468,9 @@ extern int GetStartupBufferPinWaitBufId(void); extern bool HaveNFreeProcs(int n, int *nfree); extern void ProcReleaseLocks(bool isCommit); -extern ProcWaitStatus ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable); +extern ProcWaitStatus ProcSleep(LOCALLOCK *locallock, + LockMethod lockMethodTable, + bool dontWait); extern void ProcWakeup(PGPROC *proc, ProcWaitStatus waitStatus); extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock); extern void CheckDeadLockAlert(void); @@ -456,7 +478,7 @@ extern bool IsWaitingForLock(void); extern void LockErrorCleanup(void); extern void ProcWaitForSignal(uint32 wait_event_info); -extern void ProcSendSignal(int pgprocno); +extern void ProcSendSignal(ProcNumber procNumber); extern PGPROC *AuxiliaryPidGetProc(int pid); diff --git a/src/include/storage/procarray.h b/src/include/storage/procarray.h index d8cae3ce1c521..8ca6050462252 100644 --- a/src/include/storage/procarray.h +++ b/src/include/storage/procarray.h @@ -4,7 +4,7 @@ * POSTGRES process array definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/procarray.h @@ -64,6 +64,10 @@ extern VirtualTransactionId *GetVirtualXIDsDelayingChkpt(int *nvxids, int type); extern bool HaveVirtualXIDsDelayingChkpt(VirtualTransactionId *vxids, int nvxids, int type); +extern PGPROC *ProcNumberGetProc(int procNumber); +extern void ProcNumberGetTransactionIds(int procNumber, TransactionId *xid, + TransactionId *xmin, int *nsubxid, + bool *overflowed); extern PGPROC *BackendPidGetProc(int pid); extern PGPROC *BackendPidGetProcWithLock(int pid); extern int BackendXidGetPid(TransactionId xid); diff --git a/src/include/storage/proclist.h b/src/include/storage/proclist.h index e7d00e5ce12f9..34a1b7dcab56e 100644 --- a/src/include/storage/proclist.h +++ b/src/include/storage/proclist.h @@ -10,7 +10,7 @@ * See proclist_types.h for the structs that these functions operate on. They * are separated to break a header dependency cycle with proc.h. * - * Portions Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/storage/proclist.h @@ -28,7 +28,7 @@ static inline void proclist_init(proclist_head *list) { - list->head = list->tail = INVALID_PGPROCNO; + list->head = list->tail = INVALID_PROC_NUMBER; } /* @@ -37,7 +37,7 @@ proclist_init(proclist_head *list) static inline bool proclist_is_empty(const proclist_head *list) { - return list->head == INVALID_PGPROCNO; + return list->head == INVALID_PROC_NUMBER; } /* @@ -62,20 +62,20 @@ proclist_push_head_offset(proclist_head *list, int procno, size_t node_offset) Assert(node->next == 0 && node->prev == 0); - if (list->head == INVALID_PGPROCNO) + if (list->head == INVALID_PROC_NUMBER) { - Assert(list->tail == INVALID_PGPROCNO); - node->next = node->prev = INVALID_PGPROCNO; + Assert(list->tail == INVALID_PROC_NUMBER); + node->next = node->prev = INVALID_PROC_NUMBER; list->head = list->tail = procno; } else { - Assert(list->tail != INVALID_PGPROCNO); + Assert(list->tail != INVALID_PROC_NUMBER); Assert(list->head != procno); Assert(list->tail != procno); node->next = list->head; proclist_node_get(node->next, node_offset)->prev = procno; - node->prev = INVALID_PGPROCNO; + node->prev = INVALID_PROC_NUMBER; list->head = procno; } } @@ -90,20 +90,20 @@ proclist_push_tail_offset(proclist_head *list, int procno, size_t node_offset) Assert(node->next == 0 && node->prev == 0); - if (list->tail == INVALID_PGPROCNO) + if (list->tail == INVALID_PROC_NUMBER) { - Assert(list->head == INVALID_PGPROCNO); - node->next = node->prev = INVALID_PGPROCNO; + Assert(list->head == INVALID_PROC_NUMBER); + node->next = node->prev = INVALID_PROC_NUMBER; list->head = list->tail = procno; } else { - Assert(list->head != INVALID_PGPROCNO); + Assert(list->head != INVALID_PROC_NUMBER); Assert(list->head != procno); Assert(list->tail != procno); node->prev = list->tail; proclist_node_get(node->prev, node_offset)->next = procno; - node->next = INVALID_PGPROCNO; + node->next = INVALID_PROC_NUMBER; list->tail = procno; } } @@ -118,7 +118,7 @@ proclist_delete_offset(proclist_head *list, int procno, size_t node_offset) Assert(node->next != 0 || node->prev != 0); - if (node->prev == INVALID_PGPROCNO) + if (node->prev == INVALID_PROC_NUMBER) { Assert(list->head == procno); list->head = node->next; @@ -126,7 +126,7 @@ proclist_delete_offset(proclist_head *list, int procno, size_t node_offset) else proclist_node_get(node->prev, node_offset)->next = node->next; - if (node->next == INVALID_PGPROCNO) + if (node->next == INVALID_PROC_NUMBER) { Assert(list->tail == procno); list->tail = node->prev; @@ -160,8 +160,8 @@ proclist_contains_offset(const proclist_head *list, int procno, * tail, and that seems worth doing, since in practice that should often * be enough to catch mistakes. */ - Assert(node->prev != INVALID_PGPROCNO || list->head == procno); - Assert(node->next != INVALID_PGPROCNO || list->tail == procno); + Assert(node->prev != INVALID_PROC_NUMBER || list->head == procno); + Assert(node->next != INVALID_PROC_NUMBER || list->tail == procno); return true; } @@ -207,12 +207,12 @@ proclist_pop_head_node_offset(proclist_head *list, size_t node_offset) for (AssertVariableIsOfTypeMacro(iter, proclist_mutable_iter), \ AssertVariableIsOfTypeMacro(lhead, proclist_head *), \ (iter).cur = (lhead)->head, \ - (iter).next = (iter).cur == INVALID_PGPROCNO ? INVALID_PGPROCNO : \ + (iter).next = (iter).cur == INVALID_PROC_NUMBER ? INVALID_PROC_NUMBER : \ proclist_node_get((iter).cur, \ offsetof(PGPROC, link_member))->next; \ - (iter).cur != INVALID_PGPROCNO; \ + (iter).cur != INVALID_PROC_NUMBER; \ (iter).cur = (iter).next, \ - (iter).next = (iter).cur == INVALID_PGPROCNO ? INVALID_PGPROCNO : \ + (iter).next = (iter).cur == INVALID_PROC_NUMBER ? INVALID_PROC_NUMBER : \ proclist_node_get((iter).cur, \ offsetof(PGPROC, link_member))->next) diff --git a/src/include/storage/proclist_types.h b/src/include/storage/proclist_types.h index 526c3ea6f99b3..a4fb88c1d0de3 100644 --- a/src/include/storage/proclist_types.h +++ b/src/include/storage/proclist_types.h @@ -5,7 +5,7 @@ * * See proclist.h for functions that operate on these types. * - * Portions Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/storage/proclist_types.h @@ -15,28 +15,30 @@ #ifndef PROCLIST_TYPES_H #define PROCLIST_TYPES_H +#include "storage/procnumber.h" + /* * A node in a doubly-linked list of processes. The link fields contain * the 0-based PGPROC indexes of the next and previous process, or - * INVALID_PGPROCNO in the next-link of the last node and the prev-link + * INVALID_PROC_NUMBER in the next-link of the last node and the prev-link * of the first node. A node that is currently not in any list * should have next == prev == 0; this is not a possible state for a node * that is in a list, because we disallow circularity. */ typedef struct proclist_node { - int next; /* pgprocno of the next PGPROC */ - int prev; /* pgprocno of the prev PGPROC */ + ProcNumber next; /* pgprocno of the next PGPROC */ + ProcNumber prev; /* pgprocno of the prev PGPROC */ } proclist_node; /* * Header of a doubly-linked list of PGPROCs, identified by pgprocno. - * An empty list is represented by head == tail == INVALID_PGPROCNO. + * An empty list is represented by head == tail == INVALID_PROC_NUMBER. */ typedef struct proclist_head { - int head; /* pgprocno of the head PGPROC */ - int tail; /* pgprocno of the tail PGPROC */ + ProcNumber head; /* pgprocno of the head PGPROC */ + ProcNumber tail; /* pgprocno of the tail PGPROC */ } proclist_head; /* @@ -44,8 +46,8 @@ typedef struct proclist_head */ typedef struct proclist_mutable_iter { - int cur; /* pgprocno of the current PGPROC */ - int next; /* pgprocno of the next PGPROC */ + ProcNumber cur; /* pgprocno of the current PGPROC */ + ProcNumber next; /* pgprocno of the next PGPROC */ } proclist_mutable_iter; #endif /* PROCLIST_TYPES_H */ diff --git a/src/include/storage/procnumber.h b/src/include/storage/procnumber.h new file mode 100644 index 0000000000000..49eb0e215ccad --- /dev/null +++ b/src/include/storage/procnumber.h @@ -0,0 +1,43 @@ +/*------------------------------------------------------------------------- + * + * procnumber.h + * definition of process number + * + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/storage/procnumber.h + * + *------------------------------------------------------------------------- + */ +#ifndef PROCNUMBER_H +#define PROCNUMBER_H + +/* + * ProcNumber uniquely identifies an active backend or auxiliary process. + * It's assigned at backend startup after authentication, when the process + * adds itself to the proc array. It is an index into the proc array, + * starting from 0. Note that a ProcNumber can be reused for a different + * backend immediately after a backend exits. + */ +typedef int ProcNumber; + +#define INVALID_PROC_NUMBER (-1) + +/* + * Proc number of this backend (same as GetNumberFromPGProc(MyProc)) + */ +extern PGDLLIMPORT ProcNumber MyProcNumber; + +/* proc number of our parallel session leader, or INVALID_PROC_NUMBER if none */ +extern PGDLLIMPORT ProcNumber ParallelLeaderProcNumber; + +/* + * The ProcNumber to use for our session's temp relations is normally our own, + * but parallel workers should use their leader's proc number. + */ +#define ProcNumberForTempRelations() \ + (ParallelLeaderProcNumber == INVALID_PROC_NUMBER ? MyProcNumber : ParallelLeaderProcNumber) + +#endif /* PROCNUMBER_H */ diff --git a/src/include/storage/procsignal.h b/src/include/storage/procsignal.h index 2f52100b009cf..7d290ea7d05cc 100644 --- a/src/include/storage/procsignal.h +++ b/src/include/storage/procsignal.h @@ -4,7 +4,7 @@ * Routines for interprocess signaling * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/procsignal.h @@ -14,7 +14,7 @@ #ifndef PROCSIGNAL_H #define PROCSIGNAL_H -#include "storage/backendid.h" +#include "storage/procnumber.h" /* @@ -38,20 +38,22 @@ typedef enum PROCSIG_PARALLEL_APPLY_MESSAGE, /* Message from parallel apply workers */ /* Recovery conflict reasons */ - PROCSIG_RECOVERY_CONFLICT_DATABASE, + PROCSIG_RECOVERY_CONFLICT_FIRST, + PROCSIG_RECOVERY_CONFLICT_DATABASE = PROCSIG_RECOVERY_CONFLICT_FIRST, PROCSIG_RECOVERY_CONFLICT_TABLESPACE, PROCSIG_RECOVERY_CONFLICT_LOCK, PROCSIG_RECOVERY_CONFLICT_SNAPSHOT, PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT, PROCSIG_RECOVERY_CONFLICT_BUFFERPIN, PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK, + PROCSIG_RECOVERY_CONFLICT_LAST = PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK, NUM_PROCSIGNALS /* Must be last! */ } ProcSignalReason; typedef enum { - PROCSIGNAL_BARRIER_SMGRRELEASE /* ask smgr to close files */ + PROCSIGNAL_BARRIER_SMGRRELEASE, /* ask smgr to close files */ } ProcSignalBarrierType; /* @@ -60,9 +62,9 @@ typedef enum extern Size ProcSignalShmemSize(void); extern void ProcSignalShmemInit(void); -extern void ProcSignalInit(int pss_idx); +extern void ProcSignalInit(void); extern int SendProcSignal(pid_t pid, ProcSignalReason reason, - BackendId backendId); + ProcNumber procNumber); extern uint64 EmitProcSignalBarrier(ProcSignalBarrierType type); extern void WaitForProcSignalBarrier(uint64 generation); diff --git a/src/include/storage/read_stream.h b/src/include/storage/read_stream.h new file mode 100644 index 0000000000000..7b9005e87bc46 --- /dev/null +++ b/src/include/storage/read_stream.h @@ -0,0 +1,65 @@ +/*------------------------------------------------------------------------- + * + * read_stream.h + * Mechanism for accessing buffered relation data with look-ahead + * + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/storage/read_stream.h + * + *------------------------------------------------------------------------- + */ +#ifndef READ_STREAM_H +#define READ_STREAM_H + +#include "storage/bufmgr.h" + +/* Default tuning, reasonable for many users. */ +#define READ_STREAM_DEFAULT 0x00 + +/* + * I/O streams that are performing maintenance work on behalf of potentially + * many users, and thus should be governed by maintenance_io_concurrency + * instead of effective_io_concurrency. For example, VACUUM or CREATE INDEX. + */ +#define READ_STREAM_MAINTENANCE 0x01 + +/* + * We usually avoid issuing prefetch advice automatically when sequential + * access is detected, but this flag explicitly disables it, for cases that + * might not be correctly detected. Explicit advice is known to perform worse + * than letting the kernel (at least Linux) detect sequential access. + */ +#define READ_STREAM_SEQUENTIAL 0x02 + +/* + * We usually ramp up from smaller reads to larger ones, to support users who + * don't know if it's worth reading lots of buffers yet. This flag disables + * that, declaring ahead of time that we'll be reading all available buffers. + */ +#define READ_STREAM_FULL 0x04 + +struct ReadStream; +typedef struct ReadStream ReadStream; + +/* Callback that returns the next block number to read. */ +typedef BlockNumber (*ReadStreamBlockNumberCB) (ReadStream *stream, + void *callback_private_data, + void *per_buffer_data); + +extern ReadStream *read_stream_begin_relation(int flags, + BufferAccessStrategy strategy, + Relation rel, + ForkNumber forknum, + ReadStreamBlockNumberCB callback, + void *callback_private_data, + size_t per_buffer_data_size); +extern Buffer read_stream_next_buffer(ReadStream *stream, void **per_buffer_data); +extern BlockNumber read_stream_next_block(ReadStream *stream, + BufferAccessStrategy *strategy); +extern void read_stream_reset(ReadStream *stream); +extern void read_stream_end(ReadStream *stream); + +#endif /* READ_STREAM_H */ diff --git a/src/include/storage/reinit.h b/src/include/storage/reinit.h index e2bbb5abe9f33..1373d509df236 100644 --- a/src/include/storage/reinit.h +++ b/src/include/storage/reinit.h @@ -4,7 +4,7 @@ * Reinitialization of unlogged relations * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/reinit.h @@ -20,8 +20,9 @@ extern void ResetUnloggedRelations(int op); extern bool parse_filename_for_nontemp_relation(const char *name, - int *relnumchars, - ForkNumber *fork); + RelFileNumber *relnumber, + ForkNumber *fork, + unsigned *segno); #define UNLOGGED_RELATION_CLEANUP 0x0001 #define UNLOGGED_RELATION_INIT 0x0002 diff --git a/src/include/storage/relfilelocator.h b/src/include/storage/relfilelocator.h index 61cf0169bd749..2f970a25c36c7 100644 --- a/src/include/storage/relfilelocator.h +++ b/src/include/storage/relfilelocator.h @@ -4,7 +4,7 @@ * Physical access information for relations. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/relfilelocator.h @@ -15,14 +15,15 @@ #define RELFILELOCATOR_H #include "common/relpath.h" -#include "storage/backendid.h" +#include "storage/procnumber.h" /* * RelFileLocator must provide all that we need to know to physically access - * a relation, with the exception of the backend ID, which can be provided - * separately. Note, however, that a "physical" relation is comprised of - * multiple files on the filesystem, as each fork is stored as a separate - * file, and each fork can be divided into multiple segments. See md.c. + * a relation, with the exception of the backend's proc number, which can be + * provided separately. Note, however, that a "physical" relation is + * comprised of multiple files on the filesystem, as each fork is stored as + * a separate file, and each fork can be divided into multiple segments. See + * md.c. * * spcOid identifies the tablespace of the relation. It corresponds to * pg_tablespace.oid. @@ -62,28 +63,28 @@ typedef struct RelFileLocator } RelFileLocator; /* - * Augmenting a relfilelocator with the backend ID provides all the information - * we need to locate the physical storage. The backend ID is InvalidBackendId - * for regular relations (those accessible to more than one backend), or the - * owning backend's ID for backend-local relations. Backend-local relations - * are always transient and removed in case of a database crash; they are - * never WAL-logged or fsync'd. + * Augmenting a relfilelocator with the backend's proc number provides all the + * information we need to locate the physical storage. 'backend' is + * INVALID_PROC_NUMBER for regular relations (those accessible to more than + * one backend), or the owning backend's proc number for backend-local + * relations. Backend-local relations are always transient and removed in + * case of a database crash; they are never WAL-logged or fsync'd. */ typedef struct RelFileLocatorBackend { RelFileLocator locator; - BackendId backend; + ProcNumber backend; } RelFileLocatorBackend; #define RelFileLocatorBackendIsTemp(rlocator) \ - ((rlocator).backend != InvalidBackendId) + ((rlocator).backend != INVALID_PROC_NUMBER) /* * Note: RelFileLocatorEquals and RelFileLocatorBackendEquals compare relNumber * first since that is most likely to be different in two unequal * RelFileLocators. It is probably redundant to compare spcOid if the other * fields are found equal, but do it anyway to be sure. Likewise for checking - * the backend ID in RelFileLocatorBackendEquals. + * the backend number in RelFileLocatorBackendEquals. */ #define RelFileLocatorEquals(locator1, locator2) \ ((locator1).relNumber == (locator2).relNumber && \ diff --git a/src/include/storage/s_lock.h b/src/include/storage/s_lock.h index c9fa84cc43c9d..29ac6cdcd928b 100644 --- a/src/include/storage/s_lock.h +++ b/src/include/storage/s_lock.h @@ -86,7 +86,7 @@ * when using the SysV semaphore code. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/s_lock.h @@ -414,12 +414,6 @@ typedef unsigned int slock_t; * an isync is a sufficient synchronization barrier after a lwarx/stwcx loop. * But if the spinlock is in ordinary memory, we can use lwsync instead for * better performance. - * - * Ordinarily, we'd code the branches here using GNU-style local symbols, that - * is "1f" referencing "1:" and so on. But some people run gcc on AIX with - * IBM's assembler as backend, and IBM's assembler doesn't do local symbols. - * So hand-code the branch offsets; fortunately, all PPC instructions are - * exactly 4 bytes each, so it's not too hard to count. */ static __inline__ int tas(volatile slock_t *lock) @@ -430,15 +424,17 @@ tas(volatile slock_t *lock) __asm__ __volatile__( " lwarx %0,0,%3,1 \n" " cmpwi %0,0 \n" -" bne $+16 \n" /* branch to li %1,1 */ +" bne 1f \n" " addi %0,%0,1 \n" " stwcx. %0,0,%3 \n" -" beq $+12 \n" /* branch to lwsync */ +" beq 2f \n" +"1: \n" " li %1,1 \n" -" b $+12 \n" /* branch to end of asm sequence */ +" b 3f \n" +"2: \n" " lwsync \n" " li %1,0 \n" - +"3: \n" : "=&b"(_t), "=r"(_res), "+m"(*lock) : "r"(lock) : "memory", "cc"); @@ -666,21 +662,6 @@ tas(volatile slock_t *lock) #if !defined(HAS_TEST_AND_SET) /* We didn't trigger above, let's try here */ -#if defined(_AIX) /* AIX */ -/* - * AIX (POWER) - */ -#define HAS_TEST_AND_SET - -#include - -typedef int slock_t; - -#define TAS(lock) _check_lock((slock_t *) (lock), 0, 1) -#define S_UNLOCK(lock) _clear_lock((slock_t *) (lock), 0) -#endif /* _AIX */ - - /* These are in sunstudio_(sparc|x86).s */ #if defined(__SUNPRO_C) && (defined(__i386) || defined(__x86_64__) || defined(__sparc__) || defined(__sparc)) @@ -821,7 +802,6 @@ extern int tas(volatile slock_t *lock); /* in port/.../tas.s, or #define TAS_SPIN(lock) TAS(lock) #endif /* TAS_SPIN */ -extern PGDLLIMPORT slock_t dummy_spinlock; /* * Platform-independent out-of-line support routines diff --git a/src/include/storage/sharedfileset.h b/src/include/storage/sharedfileset.h index aa6f97f8c7081..7186aba2698c1 100644 --- a/src/include/storage/sharedfileset.h +++ b/src/include/storage/sharedfileset.h @@ -4,7 +4,7 @@ * Shared temporary file management. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/sharedfileset.h diff --git a/src/include/storage/shm_mq.h b/src/include/storage/shm_mq.h index 2e04e4183781b..80f63f4fba5e4 100644 --- a/src/include/storage/shm_mq.h +++ b/src/include/storage/shm_mq.h @@ -3,7 +3,7 @@ * shm_mq.h * single-reader, single-writer shared memory message queue * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/shm_mq.h @@ -37,7 +37,7 @@ typedef enum { SHM_MQ_SUCCESS, /* Sent or received a message. */ SHM_MQ_WOULD_BLOCK, /* Not completed; retry later. */ - SHM_MQ_DETACHED /* Other process has detached queue. */ + SHM_MQ_DETACHED, /* Other process has detached queue. */ } shm_mq_result; /* diff --git a/src/include/storage/shm_toc.h b/src/include/storage/shm_toc.h index 7a2f8e993493f..a46470d68b8a0 100644 --- a/src/include/storage/shm_toc.h +++ b/src/include/storage/shm_toc.h @@ -12,7 +12,7 @@ * other data structure within the segment and only put the pointer to * the data structure itself in the table of contents. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/shm_toc.h diff --git a/src/include/storage/shmem.h b/src/include/storage/shmem.h index 0e1fb2006c188..3b0cc9d380033 100644 --- a/src/include/storage/shmem.h +++ b/src/include/storage/shmem.h @@ -11,7 +11,7 @@ * at the same address. This means shared memory pointers can be passed * around directly between different processes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/shmem.h diff --git a/src/include/storage/sinval.h b/src/include/storage/sinval.h index 0721e4d205887..8f5744b21bc9a 100644 --- a/src/include/storage/sinval.h +++ b/src/include/storage/sinval.h @@ -4,7 +4,7 @@ * POSTGRES shared cache invalidation communication definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/sinval.h @@ -88,8 +88,8 @@ typedef struct { /* note: field layout chosen to pack into 16 bytes */ int8 id; /* type field --- must be first */ - int8 backend_hi; /* high bits of backend ID, if temprel */ - uint16 backend_lo; /* low bits of backend ID, if temprel */ + int8 backend_hi; /* high bits of backend procno, if temprel */ + uint16 backend_lo; /* low bits of backend procno, if temprel */ RelFileLocator rlocator; /* spcOid, dbOid, relNumber */ } SharedInvalSmgrMsg; diff --git a/src/include/storage/sinvaladt.h b/src/include/storage/sinvaladt.h index db38819bfd726..7c8f450db7c30 100644 --- a/src/include/storage/sinvaladt.h +++ b/src/include/storage/sinvaladt.h @@ -12,7 +12,7 @@ * The struct type SharedInvalidationMessage, defining the contents of * a single message, is defined in sinval.h. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/sinvaladt.h @@ -31,14 +31,11 @@ extern Size SInvalShmemSize(void); extern void CreateSharedInvalidationState(void); extern void SharedInvalBackendInit(bool sendOnly); -extern PGPROC *BackendIdGetProc(int backendID); -extern void BackendIdGetTransactionIds(int backendID, TransactionId *xid, - TransactionId *xmin, int *nsubxid, - bool *overflowed); extern void SIInsertDataEntries(const SharedInvalidationMessage *data, int n); extern int SIGetDataEntries(SharedInvalidationMessage *data, int datasize); extern void SICleanupQueue(bool callerHasWriteLock, int minFree); +extern void SIResetAll(void); extern LocalTransactionId GetNextLocalTransactionId(void); diff --git a/src/include/storage/smgr.h b/src/include/storage/smgr.h index a9a179aabacc4..3856d1d4f8b6c 100644 --- a/src/include/storage/smgr.h +++ b/src/include/storage/smgr.h @@ -4,7 +4,7 @@ * storage manager switch public interface declarations. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/smgr.h @@ -21,29 +21,21 @@ /* * smgr.c maintains a table of SMgrRelation objects, which are essentially * cached file handles. An SMgrRelation is created (if not already present) - * by smgropen(), and destroyed by smgrclose(). Note that neither of these - * operations imply I/O, they just create or destroy a hashtable entry. - * (But smgrclose() may release associated resources, such as OS-level file + * by smgropen(), and destroyed by smgrdestroy(). Note that neither of these + * operations imply I/O, they just create or destroy a hashtable entry. (But + * smgrdestroy() may release associated resources, such as OS-level file * descriptors.) * - * An SMgrRelation may have an "owner", which is just a pointer to it from - * somewhere else; smgr.c will clear this pointer if the SMgrRelation is - * closed. We use this to avoid dangling pointers from relcache to smgr - * without having to make the smgr explicitly aware of relcache. There - * can't be more than one "owner" pointer per SMgrRelation, but that's - * all we need. - * - * SMgrRelations that do not have an "owner" are considered to be transient, - * and are deleted at end of transaction. + * An SMgrRelation may be "pinned", to prevent it from being destroyed while + * it's in use. We use this to prevent pointers relcache to smgr from being + * invalidated. SMgrRelations that are not pinned are deleted at end of + * transaction. */ typedef struct SMgrRelationData { /* rlocator is the hashtable lookup key, so it must be first! */ RelFileLocatorBackend smgr_rlocator; /* relation physical identifier */ - /* pointer to owning pointer, or NULL if none */ - struct SMgrRelationData **smgr_owner; - /* * The following fields are reset to InvalidBlockNumber upon a cache flush * event, and hold the last known size for each fork. This information is @@ -68,7 +60,11 @@ typedef struct SMgrRelationData int md_num_open_segs[MAX_FORKNUM + 1]; struct _MdfdVec *md_seg_fds[MAX_FORKNUM + 1]; - /* if unowned, list link in list of all unowned SMgrRelations */ + /* + * Pinning support. If unpinned (ie. pincount == 0), 'node' is a list + * link in list of all unpinned SMgrRelations. + */ + int pincount; dlist_node node; } SMgrRelationData; @@ -78,15 +74,15 @@ typedef SMgrRelationData *SMgrRelation; RelFileLocatorBackendIsTemp((smgr)->smgr_rlocator) extern void smgrinit(void); -extern SMgrRelation smgropen(RelFileLocator rlocator, BackendId backend); +extern SMgrRelation smgropen(RelFileLocator rlocator, ProcNumber backend); extern bool smgrexists(SMgrRelation reln, ForkNumber forknum); -extern void smgrsetowner(SMgrRelation *owner, SMgrRelation reln); -extern void smgrclearowner(SMgrRelation *owner, SMgrRelation reln); +extern void smgrpin(SMgrRelation reln); +extern void smgrunpin(SMgrRelation reln); extern void smgrclose(SMgrRelation reln); -extern void smgrcloseall(void); -extern void smgrcloserellocator(RelFileLocatorBackend rlocator); +extern void smgrdestroyall(void); extern void smgrrelease(SMgrRelation reln); extern void smgrreleaseall(void); +extern void smgrreleaserellocator(RelFileLocatorBackend rlocator); extern void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo); extern void smgrdosyncall(SMgrRelation *rels, int nrels); extern void smgrdounlinkall(SMgrRelation *rels, int nrels, bool isRedo); @@ -95,19 +91,40 @@ extern void smgrextend(SMgrRelation reln, ForkNumber forknum, extern void smgrzeroextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, int nblocks, bool skipFsync); extern bool smgrprefetch(SMgrRelation reln, ForkNumber forknum, - BlockNumber blocknum); -extern void smgrread(SMgrRelation reln, ForkNumber forknum, - BlockNumber blocknum, void *buffer); -extern void smgrwrite(SMgrRelation reln, ForkNumber forknum, - BlockNumber blocknum, const void *buffer, bool skipFsync); + BlockNumber blocknum, int nblocks); +extern void smgrreadv(SMgrRelation reln, ForkNumber forknum, + BlockNumber blocknum, + void **buffers, BlockNumber nblocks); +extern void smgrwritev(SMgrRelation reln, ForkNumber forknum, + BlockNumber blocknum, + const void **buffers, BlockNumber nblocks, + bool skipFsync); extern void smgrwriteback(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, BlockNumber nblocks); extern BlockNumber smgrnblocks(SMgrRelation reln, ForkNumber forknum); extern BlockNumber smgrnblocks_cached(SMgrRelation reln, ForkNumber forknum); -extern void smgrtruncate(SMgrRelation reln, ForkNumber *forknum, - int nforks, BlockNumber *nblocks); +extern void smgrtruncate(SMgrRelation reln, ForkNumber *forknum, int nforks, + BlockNumber *nblocks); +extern void smgrtruncate2(SMgrRelation reln, ForkNumber *forknum, int nforks, + BlockNumber *old_nblocks, + BlockNumber *nblocks); extern void smgrimmedsync(SMgrRelation reln, ForkNumber forknum); +extern void smgrregistersync(SMgrRelation reln, ForkNumber forknum); extern void AtEOXact_SMgr(void); extern bool ProcessBarrierSmgrRelease(void); +static inline void +smgrread(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, + void *buffer) +{ + smgrreadv(reln, forknum, blocknum, &buffer, 1); +} + +static inline void +smgrwrite(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, + const void *buffer, bool skipFsync) +{ + smgrwritev(reln, forknum, blocknum, &buffer, 1, skipFsync); +} + #endif /* SMGR_H */ diff --git a/src/include/storage/spin.h b/src/include/storage/spin.h index 5d809cc980c39..c0679c599921f 100644 --- a/src/include/storage/spin.h +++ b/src/include/storage/spin.h @@ -41,7 +41,7 @@ * be again. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/spin.h diff --git a/src/include/storage/standby.h b/src/include/storage/standby.h index e8f5056949123..cce0bc521e758 100644 --- a/src/include/storage/standby.h +++ b/src/include/storage/standby.h @@ -4,7 +4,7 @@ * Definitions for hot standby mode. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/standby.h @@ -75,13 +75,23 @@ extern void StandbyReleaseOldLocks(TransactionId oldxid); * almost immediately see the data we need to begin executing queries. */ +typedef enum +{ + SUBXIDS_IN_ARRAY, /* xids array includes all running subxids */ + SUBXIDS_MISSING, /* snapshot overflowed, subxids are missing */ + SUBXIDS_IN_SUBTRANS, /* subxids are not included in 'xids', but + * pg_subtrans is fully up-to-date */ +} subxids_array_status; + typedef struct RunningTransactionsData { int xcnt; /* # of xact ids in xids[] */ int subxcnt; /* # of subxact ids in xids[] */ - bool subxid_overflow; /* snapshot overflowed, subxids missing */ - TransactionId nextXid; /* xid from ShmemVariableCache->nextXid */ + subxids_array_status subxid_status; + TransactionId nextXid; /* xid from TransamVariables->nextXid */ TransactionId oldestRunningXid; /* *not* oldestXmin */ + TransactionId oldestDatabaseRunningXid; /* same as above, but within the + * current database */ TransactionId latestCompletedXid; /* so we can set xmax */ TransactionId *xids; /* array of (sub)xids still running */ diff --git a/src/include/storage/standbydefs.h b/src/include/storage/standbydefs.h index 188e348618abb..fe12f463a8628 100644 --- a/src/include/storage/standbydefs.h +++ b/src/include/storage/standbydefs.h @@ -4,7 +4,7 @@ * Frontend exposed definitions for hot standby mode. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/standbydefs.h @@ -49,7 +49,7 @@ typedef struct xl_running_xacts int xcnt; /* # of xact ids in xids[] */ int subxcnt; /* # of subxact ids in xids[] */ bool subxid_overflow; /* snapshot overflowed, subxids missing */ - TransactionId nextXid; /* xid from ShmemVariableCache->nextXid */ + TransactionId nextXid; /* xid from TransamVariables->nextXid */ TransactionId oldestRunningXid; /* *not* oldestXmin */ TransactionId latestCompletedXid; /* so we can set xmax */ diff --git a/src/include/storage/sync.h b/src/include/storage/sync.h index cfbcfa6797d83..9dee8fa6e5bb3 100644 --- a/src/include/storage/sync.h +++ b/src/include/storage/sync.h @@ -3,7 +3,7 @@ * sync.h * File synchronization management code. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/storage/sync.h @@ -25,7 +25,7 @@ typedef enum SyncRequestType SYNC_REQUEST, /* schedule a call of sync function */ SYNC_UNLINK_REQUEST, /* schedule a call of unlink function */ SYNC_FORGET_REQUEST, /* forget all calls for a tag */ - SYNC_FILTER_REQUEST /* forget all calls satisfying match fn */ + SYNC_FILTER_REQUEST, /* forget all calls satisfying match fn */ } SyncRequestType; /* @@ -39,7 +39,7 @@ typedef enum SyncRequestHandler SYNC_HANDLER_COMMIT_TS, SYNC_HANDLER_MULTIXACT_OFFSET, SYNC_HANDLER_MULTIXACT_MEMBER, - SYNC_HANDLER_NONE + SYNC_HANDLER_NONE, } SyncRequestHandler; /* @@ -52,7 +52,7 @@ typedef struct FileTag int16 handler; /* SyncRequestHandler value, saving space */ int16 forknum; /* ForkNumber, saving space */ RelFileLocator rlocator; - uint32 segno; + uint64 segno; } FileTag; extern void InitSync(void); diff --git a/src/include/tcop/backend_startup.h b/src/include/tcop/backend_startup.h new file mode 100644 index 0000000000000..16a68c7758456 --- /dev/null +++ b/src/include/tcop/backend_startup.h @@ -0,0 +1,41 @@ +/*------------------------------------------------------------------------- + * + * backend_startup.h + * prototypes for backend_startup.c. + * + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/include/tcop/backend_startup.h + * + *------------------------------------------------------------------------- + */ +#ifndef BACKEND_STARTUP_H +#define BACKEND_STARTUP_H + +/* + * CAC_state is passed from postmaster to the backend process, to indicate + * whether the connection should be accepted, or if the process should just + * send an error to the client and close the connection. Note that the + * connection can fail for various reasons even if postmaster passed CAC_OK. + */ +typedef enum CAC_state +{ + CAC_OK, + CAC_STARTUP, + CAC_SHUTDOWN, + CAC_RECOVERY, + CAC_NOTCONSISTENT, + CAC_TOOMANY, +} CAC_state; + +/* Information passed from postmaster to backend process in 'startup_data' */ +typedef struct BackendStartupData +{ + CAC_state canAcceptConnections; +} BackendStartupData; + +extern void BackendMain(char *startup_data, size_t startup_data_len) pg_attribute_noreturn(); + +#endif /* BACKEND_STARTUP_H */ diff --git a/src/include/tcop/cmdtag.h b/src/include/tcop/cmdtag.h index 1e7514dcff75d..23c99d7eca654 100644 --- a/src/include/tcop/cmdtag.h +++ b/src/include/tcop/cmdtag.h @@ -3,7 +3,7 @@ * cmdtag.h * Declarations for commandtag names and enumeration. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/tcop/cmdtag.h @@ -22,7 +22,6 @@ typedef enum CommandTag { #include "tcop/cmdtaglist.h" - COMMAND_TAG_NEXTTAG } CommandTag; #undef PG_CMDTAG diff --git a/src/include/tcop/cmdtaglist.h b/src/include/tcop/cmdtaglist.h index e738ac1c09732..7fdcec6dd93d9 100644 --- a/src/include/tcop/cmdtaglist.h +++ b/src/include/tcop/cmdtaglist.h @@ -8,7 +8,7 @@ * determined by the PG_CMDTAG macro, which is not defined in this file; * it can be defined by the caller for special purposes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/tcop/cmdtaglist.h @@ -186,6 +186,7 @@ PG_CMDTAG(CMDTAG_INSERT, "INSERT", false, false, true) PG_CMDTAG(CMDTAG_LISTEN, "LISTEN", false, false, false) PG_CMDTAG(CMDTAG_LOAD, "LOAD", false, false, false) PG_CMDTAG(CMDTAG_LOCK_TABLE, "LOCK TABLE", false, false, false) +PG_CMDTAG(CMDTAG_LOGIN, "LOGIN", true, false, false) PG_CMDTAG(CMDTAG_MERGE, "MERGE", false, false, true) PG_CMDTAG(CMDTAG_MOVE, "MOVE", false, false, true) PG_CMDTAG(CMDTAG_NOTIFY, "NOTIFY", false, false, false) @@ -193,7 +194,7 @@ PG_CMDTAG(CMDTAG_PREPARE, "PREPARE", false, false, false) PG_CMDTAG(CMDTAG_PREPARE_TRANSACTION, "PREPARE TRANSACTION", false, false, false) PG_CMDTAG(CMDTAG_REASSIGN_OWNED, "REASSIGN OWNED", false, false, false) PG_CMDTAG(CMDTAG_REFRESH_MATERIALIZED_VIEW, "REFRESH MATERIALIZED VIEW", true, false, false) -PG_CMDTAG(CMDTAG_REINDEX, "REINDEX", false, false, false) +PG_CMDTAG(CMDTAG_REINDEX, "REINDEX", true, false, false) PG_CMDTAG(CMDTAG_RELEASE, "RELEASE", false, false, false) PG_CMDTAG(CMDTAG_RESET, "RESET", false, false, false) PG_CMDTAG(CMDTAG_REVOKE, "REVOKE", true, false, false) diff --git a/src/include/tcop/deparse_utility.h b/src/include/tcop/deparse_utility.h index b585810b9a692..bb94342119e6e 100644 --- a/src/include/tcop/deparse_utility.h +++ b/src/include/tcop/deparse_utility.h @@ -2,7 +2,7 @@ * * deparse_utility.h * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/tcop/deparse_utility.h @@ -29,7 +29,7 @@ typedef enum CollectedCommandType SCT_AlterOpFamily, SCT_AlterDefaultPrivileges, SCT_CreateOpClass, - SCT_AlterTSConfig + SCT_AlterTSConfig, } CollectedCommandType; /* diff --git a/src/include/tcop/dest.h b/src/include/tcop/dest.h index a7d86e7abd4d0..a3d521b6f97f8 100644 --- a/src/include/tcop/dest.h +++ b/src/include/tcop/dest.h @@ -57,7 +57,7 @@ * calls in portal and cursor manipulations. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/tcop/dest.h @@ -95,7 +95,8 @@ typedef enum DestCopyOut, /* results sent to COPY TO code */ DestSQLFunction, /* results sent to SQL-language func mgr */ DestTransientRel, /* results sent to transient relation */ - DestTupleQueue /* results sent to tuple queue */ + DestTupleQueue, /* results sent to tuple queue */ + DestExplainSerialize, /* results are serialized and discarded */ } CommandDest; /* ---------------- diff --git a/src/include/tcop/fastpath.h b/src/include/tcop/fastpath.h index 9d57f79def9d0..da0bd715f517e 100644 --- a/src/include/tcop/fastpath.h +++ b/src/include/tcop/fastpath.h @@ -3,7 +3,7 @@ * fastpath.h * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/tcop/fastpath.h diff --git a/src/include/tcop/pquery.h b/src/include/tcop/pquery.h index a5e65b98aa30b..073fb323bc128 100644 --- a/src/include/tcop/pquery.h +++ b/src/include/tcop/pquery.h @@ -4,7 +4,7 @@ * prototypes for pquery.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/tcop/pquery.h diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h index abd7b4fff33dd..180d5a2d2275f 100644 --- a/src/include/tcop/tcopprot.h +++ b/src/include/tcop/tcopprot.h @@ -4,7 +4,7 @@ * prototypes for postgres.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/tcop/tcopprot.h @@ -15,7 +15,6 @@ #define TCOPPROT_H #include "nodes/params.h" -#include "nodes/parsenodes.h" #include "nodes/plannodes.h" #include "storage/procsignal.h" #include "utils/guc.h" @@ -38,11 +37,17 @@ typedef enum LOGSTMT_NONE, /* log no statements */ LOGSTMT_DDL, /* log data definition statements */ LOGSTMT_MOD, /* log modification statements, plus DDL */ - LOGSTMT_ALL /* log all statements */ + LOGSTMT_ALL, /* log all statements */ } LogStmtLevel; extern PGDLLIMPORT int log_statement; +/* Flags for restrict_nonsystem_relation_kind value */ +#define RESTRICT_RELKIND_VIEW 0x01 +#define RESTRICT_RELKIND_FOREIGN_TABLE 0x02 + +extern PGDLLIMPORT int restrict_nonsystem_relation_kind; + extern List *pg_parse_query(const char *query_string); extern List *pg_rewrite_query(Query *query); extern List *pg_analyze_and_rewrite_fixedparams(RawStmt *parsetree, @@ -70,8 +75,7 @@ extern void die(SIGNAL_ARGS); extern void quickdie(SIGNAL_ARGS) pg_attribute_noreturn(); extern void StatementCancelHandler(SIGNAL_ARGS); extern void FloatExceptionHandler(SIGNAL_ARGS) pg_attribute_noreturn(); -extern void RecoveryConflictInterrupt(ProcSignalReason reason); /* called from SIGUSR1 - * handler */ +extern void HandleRecoveryConflictInterrupt(ProcSignalReason reason); extern void ProcessClientReadInterrupt(bool blocked); extern void ProcessClientWriteInterrupt(bool blocked); diff --git a/src/include/tcop/utility.h b/src/include/tcop/utility.h index 59e64aea07355..9aa1de3879000 100644 --- a/src/include/tcop/utility.h +++ b/src/include/tcop/utility.h @@ -4,7 +4,7 @@ * prototypes for utility.c. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/tcop/utility.h @@ -23,7 +23,7 @@ typedef enum PROCESS_UTILITY_QUERY, /* a complete query, but not toplevel */ PROCESS_UTILITY_QUERY_NONATOMIC, /* a complete query, nonatomic * execution context */ - PROCESS_UTILITY_SUBCOMMAND /* a portion of a query */ + PROCESS_UTILITY_SUBCOMMAND, /* a portion of a query */ } ProcessUtilityContext; /* Info needed when recursing from ALTER TABLE */ diff --git a/src/include/tsearch/dicts/regis.h b/src/include/tsearch/dicts/regis.h index 0b81729128776..d3d9b6ec22da3 100644 --- a/src/include/tsearch/dicts/regis.h +++ b/src/include/tsearch/dicts/regis.h @@ -4,7 +4,7 @@ * * Declarations for fast regex subset, used by ISpell * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/tsearch/dicts/regis.h * diff --git a/src/include/tsearch/dicts/spell.h b/src/include/tsearch/dicts/spell.h index 0763f9ffe7b04..10c05769ac734 100644 --- a/src/include/tsearch/dicts/spell.h +++ b/src/include/tsearch/dicts/spell.h @@ -4,7 +4,7 @@ * * Declarations for ISpell dictionary * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/tsearch/dicts/spell.h * @@ -158,7 +158,7 @@ typedef enum { FM_CHAR, /* one character (like ispell) */ FM_LONG, /* two characters */ - FM_NUM /* number, >= 0 and < 65536 */ + FM_NUM, /* number, >= 0 and < 65536 */ } FlagMode; /* diff --git a/src/include/tsearch/ts_cache.h b/src/include/tsearch/ts_cache.h index d432bd0ace4c0..2f8fcd4e9c9f6 100644 --- a/src/include/tsearch/ts_cache.h +++ b/src/include/tsearch/ts_cache.h @@ -3,7 +3,7 @@ * ts_cache.h * Tsearch related object caches. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/tsearch/ts_cache.h diff --git a/src/include/tsearch/ts_locale.h b/src/include/tsearch/ts_locale.h index 58d594d400698..abc21a7ebeae6 100644 --- a/src/include/tsearch/ts_locale.h +++ b/src/include/tsearch/ts_locale.h @@ -3,7 +3,7 @@ * ts_locale.h * locale compatibility layer for tsearch * - * Copyright (c) 1998-2023, PostgreSQL Global Development Group + * Copyright (c) 1998-2024, PostgreSQL Global Development Group * * src/include/tsearch/ts_locale.h * diff --git a/src/include/tsearch/ts_public.h b/src/include/tsearch/ts_public.h index 0c9bc1498efa2..e1549863a12c8 100644 --- a/src/include/tsearch/ts_public.h +++ b/src/include/tsearch/ts_public.h @@ -4,7 +4,7 @@ * Public interface to various tsearch modules, such as * parsers and dictionaries. * - * Copyright (c) 1998-2023, PostgreSQL Global Development Group + * Copyright (c) 1998-2024, PostgreSQL Global Development Group * * src/include/tsearch/ts_public.h * diff --git a/src/include/tsearch/ts_type.h b/src/include/tsearch/ts_type.h index b076039c1c1a1..060d539096e8a 100644 --- a/src/include/tsearch/ts_type.h +++ b/src/include/tsearch/ts_type.h @@ -3,7 +3,7 @@ * ts_type.h * Definitions for the tsvector and tsquery types * - * Copyright (c) 1998-2023, PostgreSQL Global Development Group + * Copyright (c) 1998-2024, PostgreSQL Global Development Group * * src/include/tsearch/ts_type.h * diff --git a/src/include/tsearch/ts_utils.h b/src/include/tsearch/ts_utils.h index d3dc8bae47585..6dc739086494a 100644 --- a/src/include/tsearch/ts_utils.h +++ b/src/include/tsearch/ts_utils.h @@ -3,7 +3,7 @@ * ts_utils.h * helper utilities for tsearch * - * Copyright (c) 1998-2023, PostgreSQL Global Development Group + * Copyright (c) 1998-2024, PostgreSQL Global Development Group * * src/include/tsearch/ts_utils.h * @@ -81,8 +81,10 @@ extern void pushOperator(TSQueryParserState state, int8 oper, int16 distance); */ typedef struct { + uint16 flags; /* currently, only TSL_PREFIX */ uint16 len; uint16 nvariant; + uint16 alen; union { uint16 pos; @@ -90,13 +92,11 @@ typedef struct /* * When apos array is used, apos[0] is the number of elements in the * array (excluding apos[0]), and alen is the allocated size of the - * array. + * array. We do not allow more than MAXNUMPOS array elements. */ uint16 *apos; } pos; - uint16 flags; /* currently, only TSL_PREFIX */ char *word; - uint32 alen; } ParsedWord; typedef struct @@ -133,7 +133,7 @@ typedef enum { TS_NO, /* definitely no match */ TS_YES, /* definitely does match */ - TS_MAYBE /* can't verify match for lack of pos data */ + TS_MAYBE, /* can't verify match for lack of pos data */ } TSTernaryValue; /* diff --git a/src/include/utils/.gitignore b/src/include/utils/.gitignore index 05cfa7a8d6cee..c1b4c662139b1 100644 --- a/src/include/utils/.gitignore +++ b/src/include/utils/.gitignore @@ -3,3 +3,4 @@ /probes.h /errcodes.h /header-stamp +/wait_event_types.h diff --git a/src/include/utils/acl.h b/src/include/utils/acl.h index f8e1238fa2cfa..731d84b2a939c 100644 --- a/src/include/utils/acl.h +++ b/src/include/utils/acl.h @@ -4,7 +4,7 @@ * Definition of (and support for) access control list data structures. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/acl.h @@ -174,7 +174,7 @@ typedef struct ArrayType Acl; typedef enum { ACLMASK_ALL, /* normal case: compute all bits */ - ACLMASK_ANY /* return when result is known nonzero */ + ACLMASK_ANY, /* return when result is known nonzero */ } AclMaskHow; /* result codes for pg_*_aclcheck */ @@ -182,7 +182,7 @@ typedef enum { ACLCHECK_OK = 0, ACLCHECK_NO_PRIV, - ACLCHECK_NOT_OWNER + ACLCHECK_NOT_OWNER, } AclResult; @@ -240,8 +240,12 @@ extern void RemoveRoleFromObjectACL(Oid roleid, Oid classid, Oid objid); extern AclMode pg_class_aclmask(Oid table_oid, Oid roleid, AclMode mask, AclMaskHow how); -/* generic function */ -extern AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode); +/* generic functions */ +extern AclResult object_aclcheck(Oid classid, Oid objectid, + Oid roleid, AclMode mode); +extern AclResult object_aclcheck_ext(Oid classid, Oid objectid, + Oid roleid, AclMode mode, + bool *is_missing); /* special cases */ extern AclResult pg_attribute_aclcheck(Oid table_oid, AttrNumber attnum, @@ -251,6 +255,9 @@ extern AclResult pg_attribute_aclcheck_ext(Oid table_oid, AttrNumber attnum, bool *is_missing); extern AclResult pg_attribute_aclcheck_all(Oid table_oid, Oid roleid, AclMode mode, AclMaskHow how); +extern AclResult pg_attribute_aclcheck_all_ext(Oid table_oid, Oid roleid, + AclMode mode, AclMaskHow how, + bool *is_missing); extern AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode); extern AclResult pg_class_aclcheck_ext(Oid table_oid, Oid roleid, AclMode mode, bool *is_missing); @@ -269,6 +276,10 @@ extern void aclcheck_error_type(AclResult aclerr, Oid typeOid); extern void recordExtObjInitPriv(Oid objoid, Oid classoid); extern void removeExtObjInitPriv(Oid objoid, Oid classoid); +extern void ReplaceRoleInInitPriv(Oid oldroleid, Oid newroleid, + Oid classid, Oid objid, int32 objsubid); +extern void RemoveRoleFromInitPriv(Oid roleid, + Oid classid, Oid objid, int32 objsubid); /* ownercheck routines just return true (owner) or false (not) */ diff --git a/src/include/utils/aclchk_internal.h b/src/include/utils/aclchk_internal.h index 55af624fb3435..11cd87dda7dfe 100644 --- a/src/include/utils/aclchk_internal.h +++ b/src/include/utils/aclchk_internal.h @@ -2,7 +2,7 @@ * * aclchk_internal.h * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/aclchk_internal.h diff --git a/src/include/utils/array.h b/src/include/utils/array.h index b13dfb345efcb..157cc0e4c6e77 100644 --- a/src/include/utils/array.h +++ b/src/include/utils/array.h @@ -51,7 +51,7 @@ * arrays holding the elements. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/array.h @@ -74,6 +74,13 @@ struct ExprContext; */ #define MAXDIM 6 +/* + * Maximum number of elements in an array. We limit this to at most about a + * quarter billion elements, so that it's not necessary to check for overflow + * in quite so many places --- for instance when palloc'ing Datum arrays. + */ +#define MaxArraySize ((Size) (MaxAllocSize / sizeof(Datum))) + /* * Arrays are varlena objects, so must meet the varlena convention that * the first int32 of the object contains the total object size in bytes. @@ -448,7 +455,6 @@ extern void array_free_iterator(ArrayIterator iterator); */ extern int ArrayGetOffset(int n, const int *dim, const int *lb, const int *indx); -extern int ArrayGetOffset0(int n, const int *tup, const int *scale); extern int ArrayGetNItems(int ndim, const int *dims); extern int ArrayGetNItemsSafe(int ndim, const int *dims, struct Node *escontext); diff --git a/src/include/utils/arrayaccess.h b/src/include/utils/arrayaccess.h index fd267d5480420..fff31e2984611 100644 --- a/src/include/utils/arrayaccess.h +++ b/src/include/utils/arrayaccess.h @@ -4,7 +4,7 @@ * Declarations for element-by-element access to Postgres arrays. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/arrayaccess.h diff --git a/src/include/utils/ascii.h b/src/include/utils/ascii.h index 630acd9bfda32..863f0f7e0e8d1 100644 --- a/src/include/utils/ascii.h +++ b/src/include/utils/ascii.h @@ -1,7 +1,7 @@ /*----------------------------------------------------------------------- * ascii.h * - * Portions Copyright (c) 1999-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1999-2024, PostgreSQL Global Development Group * * src/include/utils/ascii.h * @@ -11,6 +11,74 @@ #ifndef _ASCII_H_ #define _ASCII_H_ +#include "port/simd.h" + extern void ascii_safe_strlcpy(char *dest, const char *src, size_t destsiz); +/* + * Verify a chunk of bytes for valid ASCII. + * + * Returns false if the input contains any zero bytes or bytes with the + * high-bit set. Input len must be a multiple of the chunk size (8 or 16). + */ +static inline bool +is_valid_ascii(const unsigned char *s, int len) +{ + const unsigned char *const s_end = s + len; + Vector8 chunk; + Vector8 highbit_cum = vector8_broadcast(0); +#ifdef USE_NO_SIMD + Vector8 zero_cum = vector8_broadcast(0x80); +#endif + + Assert(len % sizeof(chunk) == 0); + + while (s < s_end) + { + vector8_load(&chunk, s); + + /* Capture any zero bytes in this chunk. */ +#ifdef USE_NO_SIMD + + /* + * First, add 0x7f to each byte. This sets the high bit in each byte, + * unless it was a zero. If any resulting high bits are zero, the + * corresponding high bits in the zero accumulator will be cleared. + * + * If none of the bytes in the chunk had the high bit set, the max + * value each byte can have after the addition is 0x7f + 0x7f = 0xfe, + * and we don't need to worry about carrying over to the next byte. If + * any input bytes did have the high bit set, it doesn't matter + * because we check for those separately. + */ + zero_cum &= (chunk + vector8_broadcast(0x7F)); +#else + + /* + * Set all bits in each lane of the highbit accumulator where input + * bytes are zero. + */ + highbit_cum = vector8_or(highbit_cum, + vector8_eq(chunk, vector8_broadcast(0))); +#endif + + /* Capture all set bits in this chunk. */ + highbit_cum = vector8_or(highbit_cum, chunk); + + s += sizeof(chunk); + } + + /* Check if any high bits in the high bit accumulator got set. */ + if (vector8_is_highbit_set(highbit_cum)) + return false; + +#ifdef USE_NO_SIMD + /* Check if any high bits in the zero accumulator got cleared. */ + if (zero_cum != vector8_broadcast(0x80)) + return false; +#endif + + return true; +} + #endif /* _ASCII_H_ */ diff --git a/src/include/utils/attoptcache.h b/src/include/utils/attoptcache.h index e4119b6aa2899..a1a9bfc0fb906 100644 --- a/src/include/utils/attoptcache.h +++ b/src/include/utils/attoptcache.h @@ -3,7 +3,7 @@ * attoptcache.h * Attribute options cache. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/attoptcache.h diff --git a/src/include/utils/backend_progress.h b/src/include/utils/backend_progress.h index a84752ade99a1..7b63d38f9756f 100644 --- a/src/include/utils/backend_progress.h +++ b/src/include/utils/backend_progress.h @@ -6,7 +6,7 @@ * backend's command progress counters, without ascribing meaning to the * individual fields. See commands/progress.h and system_views.sql for that. * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * src/include/utils/backend_progress.h * ---------- @@ -27,7 +27,7 @@ typedef enum ProgressCommandType PROGRESS_COMMAND_CLUSTER, PROGRESS_COMMAND_CREATE_INDEX, PROGRESS_COMMAND_BASEBACKUP, - PROGRESS_COMMAND_COPY + PROGRESS_COMMAND_COPY, } ProgressCommandType; #define PGSTAT_NUM_PROGRESS_PARAM 20 @@ -37,6 +37,7 @@ extern void pgstat_progress_start_command(ProgressCommandType cmdtype, Oid relid); extern void pgstat_progress_update_param(int index, int64 val); extern void pgstat_progress_incr_param(int index, int64 incr); +extern void pgstat_progress_parallel_incr_param(int index, int64 incr); extern void pgstat_progress_update_multi_param(int nparam, const int *index, const int64 *val); extern void pgstat_progress_end_command(void); diff --git a/src/include/utils/backend_status.h b/src/include/utils/backend_status.h index 77939a0aedea3..7b7f6f59d07a8 100644 --- a/src/include/utils/backend_status.h +++ b/src/include/utils/backend_status.h @@ -2,7 +2,7 @@ * backend_status.h * Definitions related to backend status reporting * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * src/include/utils/backend_status.h * ---------- @@ -13,7 +13,7 @@ #include "datatype/timestamp.h" #include "libpq/pqcomm.h" #include "miscadmin.h" /* for BackendType */ -#include "storage/backendid.h" +#include "storage/procnumber.h" #include "utils/backend_progress.h" @@ -29,7 +29,7 @@ typedef enum BackendState STATE_IDLEINTRANSACTION, STATE_FASTPATH, STATE_IDLEINTRANSACTION_ABORTED, - STATE_DISABLED + STATE_DISABLED, } BackendState; @@ -87,7 +87,7 @@ typedef struct PgBackendGSSStatus * * Each live backend maintains a PgBackendStatus struct in shared memory * showing its current activity. (The structs are allocated according to - * BackendId, but that is not critical.) Note that this is unrelated to the + * ProcNumber, but that is not critical.) Note that this is unrelated to the * cumulative stats system (i.e. pgstat.c et al). * * Each auxiliary process also maintains a PgBackendStatus struct in shared @@ -250,11 +250,9 @@ typedef struct LocalPgBackendStatus PgBackendStatus backendStatus; /* - * The backend ID. For auxiliary processes, this will be set to a value - * greater than MaxBackends (since auxiliary processes do not have proper - * backend IDs). + * The proc number. */ - BackendId backend_id; + ProcNumber proc_number; /* * The xid of the current transaction if available, InvalidTransactionId @@ -333,8 +331,9 @@ extern uint64 pgstat_get_my_query_id(void); * ---------- */ extern int pgstat_fetch_stat_numbackends(void); -extern PgBackendStatus *pgstat_fetch_stat_beentry(BackendId beid); -extern LocalPgBackendStatus *pgstat_fetch_stat_local_beentry(int beid); +extern PgBackendStatus *pgstat_get_beentry_by_proc_number(ProcNumber procNumber); +extern LocalPgBackendStatus *pgstat_get_local_beentry_by_proc_number(ProcNumber procNumber); +extern LocalPgBackendStatus *pgstat_get_local_beentry_by_index(int idx); extern char *pgstat_clip_activity(const char *raw_activity); diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index 2f8b46d6da32e..359c570f23e20 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -4,7 +4,7 @@ * Declarations for operations on built-in types. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/builtins.h @@ -28,6 +28,9 @@ extern bool parse_bool_with_len(const char *value, size_t len, bool *result); /* domains.c */ extern void domain_check(Datum value, bool isnull, Oid domainType, void **extra, MemoryContext mcxt); +extern bool domain_check_safe(Datum value, bool isnull, Oid domainType, + void **extra, MemoryContext mcxt, + Node *escontext); extern int errdatatype(Oid datatypeOid); extern int errdomainconstraint(Oid datatypeOid, const char *conname); diff --git a/src/include/utils/bytea.h b/src/include/utils/bytea.h index 166dd0366e63f..dcc55d879b920 100644 --- a/src/include/utils/bytea.h +++ b/src/include/utils/bytea.h @@ -4,7 +4,7 @@ * Declarations for BYTEA data type support. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/bytea.h @@ -19,7 +19,7 @@ typedef enum { BYTEA_OUTPUT_ESCAPE, - BYTEA_OUTPUT_HEX + BYTEA_OUTPUT_HEX, } ByteaOutputType; extern PGDLLIMPORT int bytea_output; /* ByteaOutputType, but int for GUC diff --git a/src/include/utils/catcache.h b/src/include/utils/catcache.h index af0b3418736f4..99169a93d9145 100644 --- a/src/include/utils/catcache.h +++ b/src/include/utils/catcache.h @@ -10,7 +10,7 @@ * guarantee that there can only be one matching row for a key combination. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/catcache.h @@ -51,9 +51,11 @@ typedef struct catcache CCFastEqualFN cc_fastequal[CATCACHE_MAXKEYS]; /* fast equal function for * each key */ int cc_keyno[CATCACHE_MAXKEYS]; /* AttrNumber of each key */ - dlist_head cc_lists; /* list of CatCList structs */ - int cc_ntup; /* # of tuples currently in this cache */ int cc_nkeys; /* # of keys (1..CATCACHE_MAXKEYS) */ + int cc_ntup; /* # of tuples currently in this cache */ + int cc_nlist; /* # of CatCLists currently in this cache */ + int cc_nlbuckets; /* # of CatCList hash buckets in this cache */ + dlist_head *cc_lbucket; /* hash buckets for CatCLists */ const char *cc_relname; /* name of relation the tuples come from */ Oid cc_reloid; /* OID of relation the tuples come from */ Oid cc_indexoid; /* OID of index matching cache keys */ @@ -218,6 +220,7 @@ extern CatCList *SearchCatCacheList(CatCache *cache, int nkeys, extern void ReleaseCatCacheList(CatCList *list); extern void ResetCatalogCaches(void); +extern void ResetCatalogCachesExt(bool debug_discard); extern void CatalogCacheFlushCatalog(Oid catId); extern void CatCacheInvalidate(CatCache *cache, uint32 hashValue); extern void PrepareToInvalidateCacheTuple(Relation relation, @@ -225,7 +228,4 @@ extern void PrepareToInvalidateCacheTuple(Relation relation, HeapTuple newtuple, void (*function) (int, uint32, Oid)); -extern void PrintCatCacheLeakWarning(HeapTuple tuple); -extern void PrintCatCacheListLeakWarning(CatCList *list); - #endif /* CATCACHE_H */ diff --git a/src/include/utils/combocid.h b/src/include/utils/combocid.h index 2b496ee634622..00a9b561ec98f 100644 --- a/src/include/utils/combocid.h +++ b/src/include/utils/combocid.h @@ -4,7 +4,7 @@ * Combo command ID support routines * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/combocid.h diff --git a/src/include/utils/conffiles.h b/src/include/utils/conffiles.h index e3868fbc23df8..82ca89bbccf5a 100644 --- a/src/include/utils/conffiles.h +++ b/src/include/utils/conffiles.h @@ -3,7 +3,7 @@ * * Utilities related to configuration files. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/conffiles.h diff --git a/src/include/utils/date.h b/src/include/utils/date.h index 97e1a0212172e..aaed6471a633a 100644 --- a/src/include/utils/date.h +++ b/src/include/utils/date.h @@ -4,7 +4,7 @@ * Definitions for the SQL "date" and "time" types. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/date.h diff --git a/src/include/utils/datetime.h b/src/include/utils/datetime.h index a871e3223de66..e4ac2b8e7f6c9 100644 --- a/src/include/utils/datetime.h +++ b/src/include/utils/datetime.h @@ -6,7 +6,7 @@ * including date, and time. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/datetime.h @@ -348,6 +348,9 @@ extern int DecodeUnits(int field, const char *lowtoken, int *val); extern int DecodeTimezoneName(const char *tzname, int *offset, pg_tz **tz); extern pg_tz *DecodeTimezoneNameToTz(const char *tzname); +extern int DecodeTimezoneAbbrevPrefix(const char *str, + int *offset, pg_tz **tz); + extern int j2day(int date); extern struct Node *TemporalSimplify(int32 max_precis, struct Node *node); diff --git a/src/include/utils/datum.h b/src/include/utils/datum.h index 70a47f33c18ed..8e3728f1b551f 100644 --- a/src/include/utils/datum.h +++ b/src/include/utils/datum.h @@ -8,7 +8,7 @@ * of the Datum. (We do it this way because in most situations the caller * can look up the info just once and use it for many per-datum operations.) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/datum.h diff --git a/src/include/utils/dsa.h b/src/include/utils/dsa.h index 3ce4ee300a567..8dff964bf3334 100644 --- a/src/include/utils/dsa.h +++ b/src/include/utils/dsa.h @@ -3,7 +3,7 @@ * dsa.h * Dynamic shared memory areas. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -77,6 +77,31 @@ typedef pg_atomic_uint64 dsa_pointer_atomic; /* A sentinel value for dsa_pointer used to indicate failure to allocate. */ #define InvalidDsaPointer ((dsa_pointer) 0) +/* + * The number of bits used to represent the offset part of a dsa_pointer. + * This controls the maximum size of a segment, the maximum possible + * allocation size and also the maximum number of segments per area. + */ +#if SIZEOF_DSA_POINTER == 4 +#define DSA_OFFSET_WIDTH 27 /* 32 segments of size up to 128MB */ +#else +#define DSA_OFFSET_WIDTH 40 /* 1024 segments of size up to 1TB */ +#endif + +/* + * The default size of the initial DSM segment that backs a dsa_area created + * by dsa_create. After creating some number of segments of the initial size + * we'll double this size, and so on. Larger segments may be created if + * necessary to satisfy large requests. + */ +#define DSA_DEFAULT_INIT_SEGMENT_SIZE ((size_t) (1 * 1024 * 1024)) + +/* The minimum size of a DSM segment. */ +#define DSA_MIN_SEGMENT_SIZE ((size_t) (256 * 1024L)) + +/* The maximum size of a DSM segment. */ +#define DSA_MAX_SEGMENT_SIZE ((size_t) 1 << DSA_OFFSET_WIDTH) + /* Check if a dsa_pointer value is valid. */ #define DsaPointerIsValid(x) ((x) != InvalidDsaPointer) @@ -88,6 +113,17 @@ typedef pg_atomic_uint64 dsa_pointer_atomic; #define dsa_allocate0(area, size) \ dsa_allocate_extended(area, size, DSA_ALLOC_ZERO) +/* Create dsa_area with default segment sizes */ +#define dsa_create(tranch_id) \ + dsa_create_ext(tranch_id, DSA_DEFAULT_INIT_SEGMENT_SIZE, \ + DSA_MAX_SEGMENT_SIZE) + +/* Create dsa_area with default segment sizes in an existing share memory space */ +#define dsa_create_in_place(place, size, tranch_id, segment) \ + dsa_create_in_place_ext(place, size, tranch_id, segment, \ + DSA_DEFAULT_INIT_SEGMENT_SIZE, \ + DSA_MAX_SEGMENT_SIZE) + /* * The type used for dsa_area handles. dsa_handle values can be shared with * other processes, so that they can attach to them. This provides a way to @@ -102,10 +138,12 @@ typedef dsm_handle dsa_handle; /* Sentinel value to use for invalid dsa_handles. */ #define DSA_HANDLE_INVALID ((dsa_handle) DSM_HANDLE_INVALID) - -extern dsa_area *dsa_create(int tranche_id); -extern dsa_area *dsa_create_in_place(void *place, size_t size, - int tranche_id, dsm_segment *segment); +extern dsa_area *dsa_create_ext(int tranche_id, size_t init_segment_size, + size_t max_segment_size); +extern dsa_area *dsa_create_in_place_ext(void *place, size_t size, + int tranche_id, dsm_segment *segment, + size_t init_segment_size, + size_t max_segment_size); extern dsa_area *dsa_attach(dsa_handle handle); extern dsa_area *dsa_attach_in_place(void *place, dsm_segment *segment); extern void dsa_release_in_place(void *place); @@ -121,6 +159,7 @@ extern dsa_handle dsa_get_handle(dsa_area *area); extern dsa_pointer dsa_allocate_extended(dsa_area *area, size_t size, int flags); extern void dsa_free(dsa_area *area, dsa_pointer dp); extern void *dsa_get_address(dsa_area *area, dsa_pointer dp); +extern size_t dsa_get_total_size(dsa_area *area); extern void dsa_trim(dsa_area *area); extern void dsa_dump(dsa_area *area); diff --git a/src/include/utils/dynahash.h b/src/include/utils/dynahash.h index 866677abd863b..418166f01ec93 100644 --- a/src/include/utils/dynahash.h +++ b/src/include/utils/dynahash.h @@ -4,7 +4,7 @@ * POSTGRES dynahash.h file definitions * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h index 4a9562fdaae27..e54eca5b4891e 100644 --- a/src/include/utils/elog.h +++ b/src/include/utils/elog.h @@ -4,7 +4,7 @@ * POSTGRES error reporting/logging definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/elog.h @@ -226,6 +226,7 @@ extern int internalerrquery(const char *query); extern int err_generic_string(int field, const char *str); extern int geterrcode(void); +extern int geterrlevel(void); extern int geterrposition(void); extern int getinternalerrposition(void); @@ -492,7 +493,7 @@ typedef enum { PGERROR_TERSE, /* single-line error messages */ PGERROR_DEFAULT, /* recommended style */ - PGERROR_VERBOSE /* all the facts, ma'am */ + PGERROR_VERBOSE, /* all the facts, ma'am */ } PGErrorVerbosity; extern PGDLLIMPORT int Log_error_verbosity; diff --git a/src/include/utils/evtcache.h b/src/include/utils/evtcache.h index d340026518ae9..573e1de4066c9 100644 --- a/src/include/utils/evtcache.h +++ b/src/include/utils/evtcache.h @@ -3,7 +3,7 @@ * evtcache.h * Special-purpose cache for event trigger data. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -22,7 +22,8 @@ typedef enum EVT_DDLCommandStart, EVT_DDLCommandEnd, EVT_SQLDrop, - EVT_TableRewrite + EVT_TableRewrite, + EVT_Login, } EventTriggerEvent; typedef struct diff --git a/src/include/utils/expandeddatum.h b/src/include/utils/expandeddatum.h index a77bb7e7e9ae3..4a6637dae3478 100644 --- a/src/include/utils/expandeddatum.h +++ b/src/include/utils/expandeddatum.h @@ -34,7 +34,7 @@ * value if they fail partway through. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/expandeddatum.h diff --git a/src/include/utils/expandedrecord.h b/src/include/utils/expandedrecord.h index 7e7c114b829a2..936aaf19a1f59 100644 --- a/src/include/utils/expandedrecord.h +++ b/src/include/utils/expandedrecord.h @@ -3,7 +3,7 @@ * expandedrecord.h * Declarations for composite expanded objects. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/expandedrecord.h diff --git a/src/include/utils/float.h b/src/include/utils/float.h index 7529899d63c65..7d1badd292ad1 100644 --- a/src/include/utils/float.h +++ b/src/include/utils/float.h @@ -3,7 +3,7 @@ * float.h * Definitions for the built-in floating-point types * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/include/utils/fmgrtab.h b/src/include/utils/fmgrtab.h index 838ffe3bc1c2d..151dd74055d0b 100644 --- a/src/include/utils/fmgrtab.h +++ b/src/include/utils/fmgrtab.h @@ -3,7 +3,7 @@ * fmgrtab.h * The function manager's table of internal functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/fmgrtab.h diff --git a/src/include/utils/formatting.h b/src/include/utils/formatting.h index 0cad3a2709040..cde030414ee44 100644 --- a/src/include/utils/formatting.h +++ b/src/include/utils/formatting.h @@ -4,7 +4,7 @@ * src/include/utils/formatting.h * * - * Portions Copyright (c) 1999-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1999-2024, PostgreSQL Global Development Group * * The PostgreSQL routines for a DateTime/int/float/numeric formatting, * inspired by the Oracle TO_CHAR() / TO_DATE() / TO_NUMBER() routines. @@ -29,5 +29,6 @@ extern char *asc_initcap(const char *buff, size_t nbytes); extern Datum parse_datetime(text *date_txt, text *fmt, Oid collid, bool strict, Oid *typid, int32 *typmod, int *tz, struct Node *escontext); +extern bool datetime_format_has_tz(const char *fmt_str); #endif diff --git a/src/include/utils/freepage.h b/src/include/utils/freepage.h index 8d1ebb4c47cff..c7c004657f015 100644 --- a/src/include/utils/freepage.h +++ b/src/include/utils/freepage.h @@ -3,7 +3,7 @@ * freepage.h * Management of page-organized free memory. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/freepage.h diff --git a/src/include/utils/geo_decls.h b/src/include/utils/geo_decls.h index d176f589d4b65..02e2062e8f0df 100644 --- a/src/include/utils/geo_decls.h +++ b/src/include/utils/geo_decls.h @@ -3,7 +3,7 @@ * geo_decls.h - Declarations for various 2D constructs. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/geo_decls.h diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index d5253c7ed23d2..2207a77b36977 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -3,7 +3,7 @@ * * External declarations pertaining to Grand Unified Configuration. * - * Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Copyright (c) 2000-2024, PostgreSQL Global Development Group * Written by Peter Eisentraut . * * src/include/utils/guc.h @@ -72,7 +72,7 @@ typedef enum PGC_SU_BACKEND, PGC_BACKEND, PGC_SUSET, - PGC_USERSET + PGC_USERSET, } GucContext; /* @@ -119,7 +119,7 @@ typedef enum PGC_S_OVERRIDE, /* special case to forcibly set default */ PGC_S_INTERACTIVE, /* dividing line for error reporting */ PGC_S_TEST, /* test per-database or per-user setting */ - PGC_S_SESSION /* SET command */ + PGC_S_SESSION, /* SET command */ } GucSource; /* @@ -144,6 +144,8 @@ typedef struct ConfigVariable struct ConfigVariable *next; } ConfigVariable; +typedef struct config_generic config_handle; + extern bool ParseConfigFile(const char *config_file, bool strict, const char *calling_file, int calling_lineno, int depth, int elevel, @@ -196,7 +198,7 @@ typedef enum /* Types of set_config_option actions */ GUC_ACTION_SET, /* regular SET command */ GUC_ACTION_LOCAL, /* SET LOCAL command */ - GUC_ACTION_SAVE /* function SET option, or temp assignment */ + GUC_ACTION_SAVE, /* function SET option, or temp assignment */ } GucAction; #define GUC_QUALIFIER_SEPARATOR '.' @@ -221,6 +223,7 @@ typedef enum #define GUC_DISALLOW_IN_AUTO_FILE \ 0x002000 /* can't set in PG_AUTOCONF_FILENAME */ #define GUC_RUNTIME_COMPUTED 0x004000 /* delay processing in 'postgres -C' */ +#define GUC_ALLOW_IN_PARALLEL 0x008000 /* allow setting in parallel mode */ #define GUC_UNIT_KB 0x01000000 /* value is in kilobytes */ #define GUC_UNIT_BLOCKS 0x02000000 /* value is in blocks */ @@ -250,8 +253,9 @@ extern PGDLLIMPORT bool log_statement_stats; extern PGDLLIMPORT bool log_btree_build_stats; extern PGDLLIMPORT bool check_function_bodies; -extern PGDLLIMPORT bool session_auth_is_superuser; +extern PGDLLIMPORT bool current_role_is_superuser; +extern PGDLLIMPORT bool AllowAlterSystem; extern PGDLLIMPORT bool log_duration; extern PGDLLIMPORT int log_parameter_max_length; extern PGDLLIMPORT int log_parameter_max_length_on_error; @@ -363,12 +367,13 @@ extern const char *GetConfigOptionResetString(const char *name); extern int GetConfigOptionFlags(const char *name, bool missing_ok); extern void ProcessConfigFile(GucContext context); extern char *convert_GUC_name_for_parameter_acl(const char *name); -extern bool check_GUC_name_for_parameter_acl(const char *name); +extern void check_GUC_name_for_parameter_acl(const char *name); extern void InitializeGUCOptions(void); extern bool SelectConfigFiles(const char *userDoption, const char *progname); extern void ResetAllOptions(void); extern void AtStart_GUC(void); extern int NewGUCNestLevel(void); +extern void RestrictSearchPath(void); extern void AtEOXact_GUC(bool isCommit, int nestLevel); extern void BeginReportingGUCOptions(void); extern void ReportChangedGUCOptions(void); @@ -387,10 +392,19 @@ extern int set_config_option_ext(const char *name, const char *value, Oid srole, GucAction action, bool changeVal, int elevel, bool is_reload); +extern int set_config_with_handle(const char *name, config_handle *handle, + const char *value, + GucContext context, GucSource source, + Oid srole, + GucAction action, bool changeVal, + int elevel, bool is_reload); +extern config_handle *get_config_handle(const char *name); extern void AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt); extern char *GetConfigOptionByName(const char *name, const char **varname, bool missing_ok); +extern void TransformGUCArray(ArrayType *array, List **names, + List **values); extern void ProcessGUCArray(ArrayType *array, GucContext context, GucSource source, GucAction action); extern ArrayType *GUCArrayAdd(ArrayType *array, const char *name, const char *value); diff --git a/src/include/utils/guc_hooks.h b/src/include/utils/guc_hooks.h index 2ecb9fc0866b3..8fd91af3887f7 100644 --- a/src/include/utils/guc_hooks.h +++ b/src/include/utils/guc_hooks.h @@ -7,7 +7,7 @@ * declare them all here to avoid having to propagate guc.h into * a lot of unrelated header files. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/utils/guc_hooks.h * @@ -46,9 +46,13 @@ extern bool check_client_connection_check_interval(int *newval, void **extra, extern bool check_client_encoding(char **newval, void **extra, GucSource source); extern void assign_client_encoding(const char *newval, void *extra); extern bool check_cluster_name(char **newval, void **extra, GucSource source); +extern bool check_commit_ts_buffers(int *newval, void **extra, + GucSource source); extern const char *show_data_directory_mode(void); extern bool check_datestyle(char **newval, void **extra, GucSource source); extern void assign_datestyle(const char *newval, void *extra); +extern bool check_debug_io_direct(char **newval, void **extra, GucSource source); +extern void assign_debug_io_direct(const char *newval, void *extra); extern bool check_default_table_access_method(char **newval, void **extra, GucSource source); extern bool check_default_tablespace(char **newval, void **extra, @@ -82,11 +86,18 @@ extern bool check_maintenance_io_concurrency(int *newval, void **extra, extern void assign_maintenance_io_concurrency(int newval, void *extra); extern bool check_max_connections(int *newval, void **extra, GucSource source); extern bool check_max_wal_senders(int *newval, void **extra, GucSource source); +extern bool check_max_slot_wal_keep_size(int *newval, void **extra, + GucSource source); extern void assign_max_wal_size(int newval, void *extra); extern bool check_max_worker_processes(int *newval, void **extra, GucSource source); extern bool check_max_stack_depth(int *newval, void **extra, GucSource source); extern void assign_max_stack_depth(int newval, void *extra); +extern bool check_multixact_member_buffers(int *newval, void **extra, + GucSource source); +extern bool check_multixact_offset_buffers(int *newval, void **extra, + GucSource source); +extern bool check_notify_buffers(int *newval, void **extra, GucSource source); extern bool check_primary_slot_name(char **newval, void **extra, GucSource source); extern bool check_random_seed(double *newval, void **extra, GucSource source); @@ -116,14 +127,20 @@ extern void assign_recovery_target_xid(const char *newval, void *extra); extern bool check_role(char **newval, void **extra, GucSource source); extern void assign_role(const char *newval, void *extra); extern const char *show_role(void); +extern bool check_restrict_nonsystem_relation_kind(char **newval, void **extra, + GucSource source); +extern void assign_restrict_nonsystem_relation_kind(const char *newval, void *extra); extern bool check_search_path(char **newval, void **extra, GucSource source); extern void assign_search_path(const char *newval, void *extra); +extern bool check_serial_buffers(int *newval, void **extra, GucSource source); extern bool check_session_authorization(char **newval, void **extra, GucSource source); extern void assign_session_authorization(const char *newval, void *extra); extern void assign_session_replication_role(int newval, void *extra); extern void assign_stats_fetch_consistency(int newval, void *extra); extern bool check_ssl(bool *newval, void **extra, GucSource source); extern bool check_stage_log_stats(bool *newval, void **extra, GucSource source); +extern bool check_subtrans_buffers(int *newval, void **extra, + GucSource source); extern bool check_synchronous_standby_names(char **newval, void **extra, GucSource source); extern void assign_synchronous_standby_names(const char *newval, void *extra); @@ -148,16 +165,20 @@ extern const char *show_timezone(void); extern bool check_timezone_abbreviations(char **newval, void **extra, GucSource source); extern void assign_timezone_abbreviations(const char *newval, void *extra); +extern bool check_transaction_buffers(int *newval, void **extra, GucSource source); extern bool check_transaction_deferrable(bool *newval, void **extra, GucSource source); extern bool check_transaction_isolation(int *newval, void **extra, GucSource source); extern bool check_transaction_read_only(bool *newval, void **extra, GucSource source); +extern void assign_transaction_timeout(int newval, void *extra); extern const char *show_unix_socket_permissions(void); extern bool check_wal_buffers(int *newval, void **extra, GucSource source); extern bool check_wal_consistency_checking(char **newval, void **extra, GucSource source); extern void assign_wal_consistency_checking(const char *newval, void *extra); -extern void assign_xlog_sync_method(int new_sync_method, void *extra); -extern bool check_io_direct(char **newval, void **extra, GucSource source); -extern void assign_io_direct(const char *newval, void *extra); +extern bool check_wal_segment_size(int *newval, void **extra, GucSource source); +extern void assign_wal_sync_method(int new_wal_sync_method, void *extra); +extern bool check_synchronized_standby_slots(char **newval, void **extra, + GucSource source); +extern void assign_synchronized_standby_slots(const char *newval, void *extra); #endif /* GUC_HOOKS_H */ diff --git a/src/include/utils/guc_tables.h b/src/include/utils/guc_tables.h index d5a08806782fe..0c0277c423026 100644 --- a/src/include/utils/guc_tables.h +++ b/src/include/utils/guc_tables.h @@ -5,7 +5,7 @@ * * See src/backend/utils/misc/README for design notes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/utils/guc_tables.h * @@ -26,7 +26,7 @@ enum config_type PGC_INT, PGC_REAL, PGC_STRING, - PGC_ENUM + PGC_ENUM, }; union config_var_val @@ -72,6 +72,7 @@ enum config_group WAL_RECOVERY, WAL_ARCHIVE_RECOVERY, WAL_RECOVERY_TARGET, + WAL_SUMMARIZATION, REPLICATION_SENDING, REPLICATION_PRIMARY, REPLICATION_STANDBY, @@ -93,11 +94,11 @@ enum config_group CLIENT_CONN_OTHER, LOCK_MANAGEMENT, COMPAT_OPTIONS_PREVIOUS, - COMPAT_OPTIONS_CLIENT, + COMPAT_OPTIONS_OTHER, ERROR_HANDLING_OPTIONS, PRESET_OPTIONS, CUSTOM_OPTIONS, - DEVELOPER_OPTIONS + DEVELOPER_OPTIONS, }; /* @@ -110,7 +111,7 @@ typedef enum GUC_SAVE, /* entry caused by function SET option */ GUC_SET, /* entry caused by plain SET command */ GUC_LOCAL, /* entry caused by SET LOCAL command */ - GUC_SET_LOCAL /* entry caused by SET then SET LOCAL */ + GUC_SET_LOCAL, /* entry caused by SET then SET LOCAL */ } GucStackState; typedef struct guc_stack @@ -240,6 +241,16 @@ struct config_real void *reset_extra; }; +/* + * A note about string GUCs: the boot_val is allowed to be NULL, which leads + * to the reset_val and the actual variable value (*variable) also being NULL. + * However, there is no way to set a NULL value subsequently using + * set_config_option or any other GUC API. Also, GUC APIs such as SHOW will + * display a NULL value as an empty string. Callers that choose to use a NULL + * boot_val should overwrite the setting later in startup, or else be careful + * that NULL doesn't have semantics that are visibly different from an empty + * string. + */ struct config_string { struct config_generic gen; diff --git a/src/include/utils/help_config.h b/src/include/utils/help_config.h index e9bc417ca45fb..c27a54f1b913c 100644 --- a/src/include/utils/help_config.h +++ b/src/include/utils/help_config.h @@ -3,7 +3,7 @@ * help_config.h * Interface to the --help-config option of main.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/utils/help_config.h * diff --git a/src/include/utils/hsearch.h b/src/include/utils/hsearch.h index bc3d5efa9637b..da26941f6db5f 100644 --- a/src/include/utils/hsearch.h +++ b/src/include/utils/hsearch.h @@ -4,7 +4,7 @@ * exported definitions for utils/hash/dynahash.c; see notes therein * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/hsearch.h @@ -113,7 +113,7 @@ typedef enum HASH_FIND, HASH_ENTER, HASH_REMOVE, - HASH_ENTER_NULL + HASH_ENTER_NULL, } HASHACTION; /* hash_seq status (should be considered an opaque type by callers) */ diff --git a/src/include/utils/index_selfuncs.h b/src/include/utils/index_selfuncs.h index f081a1a326b3d..a41cd2b7fd979 100644 --- a/src/include/utils/index_selfuncs.h +++ b/src/include/utils/index_selfuncs.h @@ -9,7 +9,7 @@ * If you make it depend on anything besides access/amapi.h, that's likely * a mistake. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/index_selfuncs.h diff --git a/src/include/utils/inet.h b/src/include/utils/inet.h index 96d9f6a234b36..882617c704a04 100644 --- a/src/include/utils/inet.h +++ b/src/include/utils/inet.h @@ -4,7 +4,7 @@ * Declarations for operations on INET datatypes. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/inet.h diff --git a/src/include/utils/injection_point.h b/src/include/utils/injection_point.h new file mode 100644 index 0000000000000..6e417cedc60b3 --- /dev/null +++ b/src/include/utils/injection_point.h @@ -0,0 +1,44 @@ +/*------------------------------------------------------------------------- + * injection_point.h + * Definitions related to injection points. + * + * Copyright (c) 2001-2024, PostgreSQL Global Development Group + * + * src/include/utils/injection_point.h + *------------------------------------------------------------------------- + */ + +#ifndef INJECTION_POINT_H +#define INJECTION_POINT_H + +/* + * Injections points require --enable-injection-points. + */ +#ifdef USE_INJECTION_POINTS +#define INJECTION_POINT(name) InjectionPointRun(name) +#else +#define INJECTION_POINT(name) ((void) name) +#endif + +/* + * Typedef for callback function launched by an injection point. + */ +typedef void (*InjectionPointCallback) (const char *name, + const void *private_data); + +extern Size InjectionPointShmemSize(void); +extern void InjectionPointShmemInit(void); + +extern void InjectionPointAttach(const char *name, + const char *library, + const char *function, + const void *private_data, + int private_data_size); +extern void InjectionPointRun(const char *name); +extern bool InjectionPointDetach(const char *name); + +#ifdef EXEC_BACKEND +extern PGDLLIMPORT struct InjectionPointsCtl *ActiveInjectionPoints; +#endif + +#endif /* INJECTION_POINT_H */ diff --git a/src/include/utils/inval.h b/src/include/utils/inval.h index 14b4eac06304d..24695facf2218 100644 --- a/src/include/utils/inval.h +++ b/src/include/utils/inval.h @@ -4,7 +4,7 @@ * POSTGRES cache invalidation dispatcher definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/inval.h diff --git a/src/include/utils/json.h b/src/include/utils/json.h index 35a9a5545d85e..6d7f1b387d1ed 100644 --- a/src/include/utils/json.h +++ b/src/include/utils/json.h @@ -3,7 +3,7 @@ * json.h * Declarations for JSON data type support. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/json.h @@ -21,11 +21,11 @@ extern void escape_json(StringInfo buf, const char *str); extern char *JsonEncodeDateTime(char *buf, Datum value, Oid typid, const int *tzp); extern bool to_json_is_immutable(Oid typoid); -extern Datum json_build_object_worker(int nargs, Datum *args, bool *nulls, - Oid *types, bool absent_on_null, +extern Datum json_build_object_worker(int nargs, const Datum *args, const bool *nulls, + const Oid *types, bool absent_on_null, bool unique_keys); -extern Datum json_build_array_worker(int nargs, Datum *args, bool *nulls, - Oid *types, bool absent_on_null); +extern Datum json_build_array_worker(int nargs, const Datum *args, const bool *nulls, + const Oid *types, bool absent_on_null); extern bool json_validate(text *json, bool check_unique_keys, bool throw_error); #endif /* JSON_H */ diff --git a/src/include/utils/jsonb.h b/src/include/utils/jsonb.h index 649a1644f24c2..d589ace5a21e2 100644 --- a/src/include/utils/jsonb.h +++ b/src/include/utils/jsonb.h @@ -3,7 +3,7 @@ * jsonb.h * Declarations for jsonb data type support. * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/utils/jsonb.h * @@ -26,7 +26,7 @@ typedef enum WJB_BEGIN_ARRAY, WJB_END_ARRAY, WJB_BEGIN_OBJECT, - WJB_END_OBJECT + WJB_END_OBJECT, } JsonbIteratorToken; /* Strategy numbers for GIN index opclasses */ @@ -335,7 +335,7 @@ typedef enum JBI_ARRAY_ELEM, JBI_OBJECT_START, JBI_OBJECT_KEY, - JBI_OBJECT_VALUE + JBI_OBJECT_VALUE, } JsonbIterState; typedef struct JsonbIterator @@ -422,6 +422,7 @@ extern char *JsonbToCString(StringInfo out, JsonbContainer *in, int estimated_len); extern char *JsonbToCStringIndent(StringInfo out, JsonbContainer *in, int estimated_len); +extern char *JsonbUnquote(Jsonb *jb); extern bool JsonbExtractScalar(JsonbContainer *jbc, JsonbValue *res); extern const char *JsonbTypeName(JsonbValue *val); @@ -430,10 +431,10 @@ extern Datum jsonb_set_element(Jsonb *jb, Datum *path, int path_len, extern Datum jsonb_get_element(Jsonb *jb, Datum *path, int npath, bool *isnull, bool as_text); extern bool to_jsonb_is_immutable(Oid typoid); -extern Datum jsonb_build_object_worker(int nargs, Datum *args, bool *nulls, - Oid *types, bool absent_on_null, +extern Datum jsonb_build_object_worker(int nargs, const Datum *args, const bool *nulls, + const Oid *types, bool absent_on_null, bool unique_keys); -extern Datum jsonb_build_array_worker(int nargs, Datum *args, bool *nulls, - Oid *types, bool absent_on_null); +extern Datum jsonb_build_array_worker(int nargs, const Datum *args, const bool *nulls, + const Oid *types, bool absent_on_null); #endif /* __JSONB_H__ */ diff --git a/src/include/utils/jsonfuncs.h b/src/include/utils/jsonfuncs.h index a85203d4a4ba4..93384d900a098 100644 --- a/src/include/utils/jsonfuncs.h +++ b/src/include/utils/jsonfuncs.h @@ -3,7 +3,7 @@ * jsonfuncs.h * Functions to process JSON data types. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/jsonfuncs.h @@ -15,6 +15,7 @@ #define JSONFUNCS_H #include "common/jsonapi.h" +#include "nodes/nodes.h" #include "utils/jsonb.h" /* @@ -36,8 +37,8 @@ typedef void (*JsonIterateStringValuesAction) (void *state, char *elem_value, in /* an action that will be applied to each value in transform_json(b)_values functions */ typedef text *(*JsonTransformStringValuesAction) (void *state, char *elem_value, int elem_len); -/* build a JsonLexContext from a text datum */ -extern JsonLexContext *makeJsonLexContext(text *json, bool need_escapes); +/* build a JsonLexContext from a text datum; see also freeJsonLexContext */ +extern JsonLexContext *makeJsonLexContext(JsonLexContext *lex, text *json, bool need_escapes); /* try to parse json, and errsave(escontext) on failure */ extern bool pg_parse_json_or_errsave(JsonLexContext *lex, JsonSemAction *sem, @@ -63,4 +64,36 @@ extern Jsonb *transform_jsonb_string_values(Jsonb *jsonb, void *action_state, extern text *transform_json_string_values(text *json, void *action_state, JsonTransformStringValuesAction transform_action); +/* Type categories returned by json_categorize_type */ +typedef enum +{ + JSONTYPE_NULL, /* null, so we didn't bother to identify */ + JSONTYPE_BOOL, /* boolean (built-in types only) */ + JSONTYPE_NUMERIC, /* numeric (ditto) */ + JSONTYPE_DATE, /* we use special formatting for datetimes */ + JSONTYPE_TIMESTAMP, + JSONTYPE_TIMESTAMPTZ, + JSONTYPE_JSON, /* JSON (and JSONB, if not is_jsonb) */ + JSONTYPE_JSONB, /* JSONB (if is_jsonb) */ + JSONTYPE_ARRAY, /* array */ + JSONTYPE_COMPOSITE, /* composite */ + JSONTYPE_CAST, /* something with an explicit cast to JSON */ + JSONTYPE_OTHER, /* all else */ +} JsonTypeCategory; + +extern void json_categorize_type(Oid typoid, bool is_jsonb, + JsonTypeCategory *tcategory, Oid *outfuncoid); +extern Datum datum_to_json(Datum val, JsonTypeCategory tcategory, + Oid outfuncoid); +extern Datum datum_to_jsonb(Datum val, JsonTypeCategory tcategory, + Oid outfuncoid); +extern Datum jsonb_from_text(text *js, bool unique_keys); + +extern Datum json_populate_type(Datum json_val, Oid json_type, + Oid typid, int32 typmod, + void **cache, MemoryContext mcxt, + bool *isnull, + bool omit_quotes, + Node *escontext); + #endif diff --git a/src/include/utils/jsonpath.h b/src/include/utils/jsonpath.h index f0181e045f795..ee35698d083ef 100644 --- a/src/include/utils/jsonpath.h +++ b/src/include/utils/jsonpath.h @@ -3,7 +3,7 @@ * jsonpath.h * Definitions for jsonpath datatype * - * Copyright (c) 2019-2023, PostgreSQL Global Development Group + * Copyright (c) 2019-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/include/utils/jsonpath.h @@ -14,8 +14,10 @@ #ifndef JSONPATH_H #define JSONPATH_H +#include "executor/tablefunc.h" #include "fmgr.h" #include "nodes/pg_list.h" +#include "nodes/primnodes.h" #include "utils/jsonb.h" typedef struct @@ -49,6 +51,13 @@ DatumGetJsonPathPCopy(Datum d) /* * All node's type of jsonpath expression + * + * These become part of the on-disk representation of the jsonpath type. + * Therefore, to preserve pg_upgradability, the order must not be changed, and + * new values must be added at the end. + * + * It is recommended that switch cases etc. in other parts of the code also + * use this order, to maintain some consistency. */ typedef enum JsonPathItemType { @@ -95,6 +104,17 @@ typedef enum JsonPathItemType jpiLast, /* LAST array subscript */ jpiStartsWith, /* STARTS WITH predicate */ jpiLikeRegex, /* LIKE_REGEX predicate */ + jpiBigint, /* .bigint() item method */ + jpiBoolean, /* .boolean() item method */ + jpiDate, /* .date() item method */ + jpiDecimal, /* .decimal() item method */ + jpiInteger, /* .integer() item method */ + jpiNumber, /* .number() item method */ + jpiStringFunc, /* .string() item method */ + jpiTime, /* .time() item method */ + jpiTimeTz, /* .time_tz() item method */ + jpiTimestamp, /* .timestamp() item method */ + jpiTimestampTz, /* .timestamp_tz() item method */ } JsonPathItemType; /* XQuery regex mode flags for LIKE_REGEX predicate */ @@ -184,6 +204,7 @@ extern bool jspGetBool(JsonPathItem *v); extern char *jspGetString(JsonPathItem *v, int32 *len); extern bool jspGetArraySubscript(JsonPathItem *v, JsonPathItem *from, JsonPathItem *to, int i); +extern bool jspIsMutable(JsonPath *path, List *varnames, List *varexprs); extern const char *jspOperationName(JsonPathItemType type); @@ -260,5 +281,30 @@ extern JsonPathParseResult *parsejsonpath(const char *str, int len, extern bool jspConvertRegexFlags(uint32 xflags, int *result, struct Node *escontext); +/* + * Struct for details about external variables passed into jsonpath executor + */ +typedef struct JsonPathVariable +{ + char *name; + int namelen; /* strlen(name) as cache for GetJsonPathVar() */ + Oid typid; + int32 typmod; + Datum value; + bool isnull; +} JsonPathVariable; + + +/* SQL/JSON query functions */ +extern bool JsonPathExists(Datum jb, JsonPath *jp, bool *error, List *vars); +extern Datum JsonPathQuery(Datum jb, JsonPath *jp, JsonWrapper wrapper, + bool *empty, bool *error, List *vars, + const char *column_name); +extern JsonbValue *JsonPathValue(Datum jb, JsonPath *jp, bool *empty, + bool *error, List *vars, + const char *column_name); + +/* For JSON_TABLE() */ +extern PGDLLIMPORT const TableFuncRoutine JsonbTableRoutine; #endif diff --git a/src/include/utils/logtape.h b/src/include/utils/logtape.h index 5420a24ac9b9a..d310b974f92df 100644 --- a/src/include/utils/logtape.h +++ b/src/include/utils/logtape.h @@ -5,7 +5,7 @@ * * See logtape.c for explanations. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/logtape.h @@ -51,7 +51,7 @@ typedef struct TapeShare * Currently, all the leader process needs is the location of the * materialized tape's first block. */ - long firstblocknumber; + int64 firstblocknumber; } TapeShare; /* @@ -70,8 +70,8 @@ extern void LogicalTapeWrite(LogicalTape *lt, const void *ptr, size_t size); extern void LogicalTapeRewindForRead(LogicalTape *lt, size_t buffer_size); extern void LogicalTapeFreeze(LogicalTape *lt, TapeShare *share); extern size_t LogicalTapeBackspace(LogicalTape *lt, size_t size); -extern void LogicalTapeSeek(LogicalTape *lt, long blocknum, int offset); -extern void LogicalTapeTell(LogicalTape *lt, long *blocknum, int *offset); -extern long LogicalTapeSetBlocks(LogicalTapeSet *lts); +extern void LogicalTapeSeek(LogicalTape *lt, int64 blocknum, int offset); +extern void LogicalTapeTell(LogicalTape *lt, int64 *blocknum, int *offset); +extern int64 LogicalTapeSetBlocks(LogicalTapeSet *lts); #endif /* LOGTAPE_H */ diff --git a/src/include/utils/lsyscache.h b/src/include/utils/lsyscache.h index 4f5418b9728fd..20446f6f8368d 100644 --- a/src/include/utils/lsyscache.h +++ b/src/include/utils/lsyscache.h @@ -3,7 +3,7 @@ * lsyscache.h * Convenience routines for common queries in the system catalog cache. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/lsyscache.h @@ -35,7 +35,7 @@ typedef enum IOFuncSelector IOFunc_input, IOFunc_output, IOFunc_receive, - IOFunc_send + IOFunc_send, } IOFuncSelector; /* Flag bits for get_attstatsslot */ @@ -90,7 +90,6 @@ extern Oid get_opfamily_proc(Oid opfamily, Oid lefttype, Oid righttype, int16 procnum); extern char *get_attname(Oid relid, AttrNumber attnum, bool missing_ok); extern AttrNumber get_attnum(Oid relid, const char *attname); -extern int get_attstattarget(Oid relid, AttrNumber attnum); extern char get_attgenerated(Oid relid, AttrNumber attnum); extern Oid get_atttype(Oid relid, AttrNumber attnum); extern void get_atttypetypmodcoll(Oid relid, AttrNumber attnum, @@ -101,11 +100,14 @@ extern char *get_collation_name(Oid colloid); extern bool get_collation_isdeterministic(Oid colloid); extern char *get_constraint_name(Oid conoid); extern Oid get_constraint_index(Oid conoid); +extern char get_constraint_type(Oid conoid); + extern char *get_language_name(Oid langoid, bool missing_ok); extern Oid get_opclass_family(Oid opclass); extern Oid get_opclass_input_type(Oid opclass); extern bool get_opclass_opfamily_and_input_type(Oid opclass, Oid *opfamily, Oid *opcintype); +extern Oid get_opclass_method(Oid opclass); extern RegProcedure get_opcode(Oid opno); extern char *get_opname(Oid opno); extern Oid get_op_rettype(Oid opno); @@ -139,6 +141,7 @@ extern char get_rel_relkind(Oid relid); extern bool get_rel_relispartition(Oid relid); extern Oid get_rel_tablespace(Oid relid); extern char get_rel_persistence(Oid relid); +extern Oid get_rel_relam(Oid relid); extern Oid get_transform_fromsql(Oid typid, Oid langid, List *trftypes); extern Oid get_transform_tosql(Oid typid, Oid langid, List *trftypes); extern bool get_typisdefined(Oid typid); diff --git a/src/include/utils/memdebug.h b/src/include/utils/memdebug.h index 804ed1fbc079a..f62b10cbbd161 100644 --- a/src/include/utils/memdebug.h +++ b/src/include/utils/memdebug.h @@ -7,7 +7,7 @@ * empty definitions for Valgrind client request macros we use. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/memdebug.h diff --git a/src/include/utils/memutils.h b/src/include/utils/memutils.h index 21640d62a647d..cd9596ff21930 100644 --- a/src/include/utils/memutils.h +++ b/src/include/utils/memutils.h @@ -7,7 +7,7 @@ * of the API of the memory management subsystem. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/memutils.h @@ -66,9 +66,6 @@ extern PGDLLIMPORT MemoryContext CurTransactionContext; /* This is a transient link to the active portal's memory context: */ extern PGDLLIMPORT MemoryContext PortalContext; -/* Backwards compatibility macro */ -#define MemoryContextResetAndDeleteChildren(ctx) MemoryContextReset(ctx) - /* * Memory-context-type-independent functions in mcxt.c @@ -87,8 +84,11 @@ extern Size GetMemoryChunkSpace(void *pointer); extern MemoryContext MemoryContextGetParent(MemoryContext context); extern bool MemoryContextIsEmpty(MemoryContext context); extern Size MemoryContextMemAllocated(MemoryContext context, bool recurse); +extern void MemoryContextMemConsumed(MemoryContext context, + MemoryContextCounters *consumed); extern void MemoryContextStats(MemoryContext context); -extern void MemoryContextStatsDetail(MemoryContext context, int max_children, +extern void MemoryContextStatsDetail(MemoryContext context, + int max_level, int max_children, bool print_to_stderr); extern void MemoryContextAllowInCriticalSection(MemoryContext context, bool allow); @@ -143,6 +143,13 @@ extern MemoryContext GenerationContextCreate(MemoryContext parent, Size initBlockSize, Size maxBlockSize); +/* bump.c */ +extern MemoryContext BumpContextCreate(MemoryContext parent, + const char *name, + Size minContextSize, + Size initBlockSize, + Size maxBlockSize); + /* * Recommended default alloc parameters, suitable for "ordinary" contexts * that might hold quite a lot of data. diff --git a/src/include/utils/memutils_internal.h b/src/include/utils/memutils_internal.h index 2d107bbf9d441..5ce2d9b5877a5 100644 --- a/src/include/utils/memutils_internal.h +++ b/src/include/utils/memutils_internal.h @@ -5,7 +5,7 @@ * functions for internal use. * * - * Portions Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2022-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/memutils_internal.h @@ -19,9 +19,9 @@ #include "utils/memutils.h" /* These functions implement the MemoryContext API for AllocSet context. */ -extern void *AllocSetAlloc(MemoryContext context, Size size); +extern void *AllocSetAlloc(MemoryContext context, Size size, int flags); extern void AllocSetFree(void *pointer); -extern void *AllocSetRealloc(void *pointer, Size size); +extern void *AllocSetRealloc(void *pointer, Size size, int flags); extern void AllocSetReset(MemoryContext context); extern void AllocSetDelete(MemoryContext context); extern MemoryContext AllocSetGetChunkContext(void *pointer); @@ -36,9 +36,9 @@ extern void AllocSetCheck(MemoryContext context); #endif /* These functions implement the MemoryContext API for Generation context. */ -extern void *GenerationAlloc(MemoryContext context, Size size); +extern void *GenerationAlloc(MemoryContext context, Size size, int flags); extern void GenerationFree(void *pointer); -extern void *GenerationRealloc(void *pointer, Size size); +extern void *GenerationRealloc(void *pointer, Size size, int flags); extern void GenerationReset(MemoryContext context); extern void GenerationDelete(MemoryContext context); extern MemoryContext GenerationGetChunkContext(void *pointer); @@ -54,9 +54,9 @@ extern void GenerationCheck(MemoryContext context); /* These functions implement the MemoryContext API for Slab context. */ -extern void *SlabAlloc(MemoryContext context, Size size); +extern void *SlabAlloc(MemoryContext context, Size size, int flags); extern void SlabFree(void *pointer); -extern void *SlabRealloc(void *pointer, Size size); +extern void *SlabRealloc(void *pointer, Size size, int flags); extern void SlabReset(MemoryContext context); extern void SlabDelete(MemoryContext context); extern MemoryContext SlabGetChunkContext(void *pointer); @@ -75,10 +75,26 @@ extern void SlabCheck(MemoryContext context); * part of a fully-fledged MemoryContext type. */ extern void AlignedAllocFree(void *pointer); -extern void *AlignedAllocRealloc(void *pointer, Size size); +extern void *AlignedAllocRealloc(void *pointer, Size size, int flags); extern MemoryContext AlignedAllocGetChunkContext(void *pointer); extern Size AlignedAllocGetChunkSpace(void *pointer); + /* These functions implement the MemoryContext API for the Bump context. */ +extern void *BumpAlloc(MemoryContext context, Size size, int flags); +extern void BumpFree(void *pointer); +extern void *BumpRealloc(void *pointer, Size size, int flags); +extern void BumpReset(MemoryContext context); +extern void BumpDelete(MemoryContext context); +extern MemoryContext BumpGetChunkContext(void *pointer); +extern Size BumpGetChunkSpace(void *pointer); +extern bool BumpIsEmpty(MemoryContext context); +extern void BumpStats(MemoryContext context, MemoryStatsPrintFunc printfunc, + void *passthru, MemoryContextCounters *totals, + bool print_to_stderr); +#ifdef MEMORY_CONTEXT_CHECKING +extern void BumpCheck(MemoryContext context); +#endif + /* * How many extra bytes do we need to request in order to ensure that we can * align a pointer to 'alignto'. Since palloc'd pointers are already aligned @@ -104,21 +120,29 @@ extern Size AlignedAllocGetChunkSpace(void *pointer); */ typedef enum MemoryContextMethodID { - MCTX_UNUSED1_ID, /* 000 occurs in never-used memory */ - MCTX_UNUSED2_ID, /* glibc malloc'd chunks usually match 001 */ - MCTX_UNUSED3_ID, /* glibc malloc'd chunks > 128kB match 010 */ + MCTX_0_RESERVED_UNUSEDMEM_ID, /* 0000 occurs in never-used memory */ + MCTX_1_RESERVED_GLIBC_ID, /* glibc malloc'd chunks usually match 0001 */ + MCTX_2_RESERVED_GLIBC_ID, /* glibc malloc'd chunks > 128kB match 0010 */ MCTX_ASET_ID, MCTX_GENERATION_ID, MCTX_SLAB_ID, MCTX_ALIGNED_REDIRECT_ID, - MCTX_UNUSED4_ID /* 111 occurs in wipe_mem'd memory */ + MCTX_BUMP_ID, + MCTX_8_UNUSED_ID, + MCTX_9_UNUSED_ID, + MCTX_10_UNUSED_ID, + MCTX_11_UNUSED_ID, + MCTX_12_UNUSED_ID, + MCTX_13_UNUSED_ID, + MCTX_14_UNUSED_ID, + MCTX_15_RESERVED_WIPEDMEM_ID /* 1111 occurs in wipe_mem'd memory */ } MemoryContextMethodID; /* * The number of bits that 8-byte memory chunk headers can use to encode the * MemoryContextMethodID. */ -#define MEMORY_CONTEXT_METHODID_BITS 3 +#define MEMORY_CONTEXT_METHODID_BITS 4 #define MEMORY_CONTEXT_METHODID_MASK \ ((((uint64) 1) << MEMORY_CONTEXT_METHODID_BITS) - 1) @@ -133,4 +157,20 @@ extern void MemoryContextCreate(MemoryContext node, MemoryContext parent, const char *name); +extern void *MemoryContextAllocationFailure(MemoryContext context, Size size, + int flags); + +extern void MemoryContextSizeFailure(MemoryContext context, Size size, + int flags) pg_attribute_noreturn(); + +static inline void +MemoryContextCheckSize(MemoryContext context, Size size, int flags) +{ + if (unlikely(!AllocSizeIsValid(size))) + { + if (!(flags & MCXT_ALLOC_HUGE) || !AllocHugeSizeIsValid(size)) + MemoryContextSizeFailure(context, size, flags); + } +} + #endif /* MEMUTILS_INTERNAL_H */ diff --git a/src/include/utils/memutils_memorychunk.h b/src/include/utils/memutils_memorychunk.h index ffa91131c88e2..56c49d604c395 100644 --- a/src/include/utils/memutils_memorychunk.h +++ b/src/include/utils/memutils_memorychunk.h @@ -12,7 +12,7 @@ * Although MemoryChunks are used by each of our MemoryContexts, future * implementations may choose to implement their own method for storing chunk * headers. The only requirement is that the header ends with an 8-byte value - * which the least significant 3-bits of are set to the MemoryContextMethodID + * which the least significant 4-bits of are set to the MemoryContextMethodID * of the given context. * * By default, a MemoryChunk is 8 bytes in size, however, when @@ -25,15 +25,23 @@ * used to encode 4 separate pieces of information. Starting with the least * significant bits of 'hdrmask', the bit space is reserved as follows: * - * 1. 3-bits to indicate the MemoryContextMethodID as defined by + * 1. 4-bits to indicate the MemoryContextMethodID as defined by * MEMORY_CONTEXT_METHODID_MASK * 2. 1-bit to denote an "external" chunk (see below) * 3. 30-bits reserved for the MemoryContext to use for anything it - * requires. Most MemoryContext likely want to store the size of the + * requires. Most MemoryContexts likely want to store the size of the * chunk here. * 4. 30-bits for the number of bytes that must be subtracted from the chunk * to obtain the address of the block that the chunk is stored on. * + * If you're paying close attention, you'll notice this adds up to 65 bits + * rather than 64 bits. This is because the highest-order bit of #3 is the + * same bit as the lowest-order bit of #4. We can do this as we insist that + * the chunk and block pointers are both MAXALIGNed, therefore the relative + * offset between those will always be a MAXALIGNed value which means the + * lowest order bit is always 0. When fetching the chunk to block offset we + * mask out the lowest-order bit to ensure it's still zero. + * * In some cases, for example when memory allocations become large, it's * possible fields 3 and 4 above are not large enough to store the values * required for the chunk. In this case, the MemoryContext can choose to mark @@ -68,7 +76,7 @@ * PointerGetMemoryChunk * MemoryChunkGetPointer * - * Portions Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2022-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/memutils_memorychunk.h @@ -93,10 +101,16 @@ */ #define MEMORYCHUNK_MAX_BLOCKOFFSET UINT64CONST(0x3FFFFFFF) +/* + * As above, but mask out the lowest-order (always zero) bit as this is shared + * with the MemoryChunkGetValue field. + */ +#define MEMORYCHUNK_BLOCKOFFSET_MASK UINT64CONST(0x3FFFFFFE) + /* define the least significant base-0 bit of each portion of the hdrmask */ #define MEMORYCHUNK_EXTERNAL_BASEBIT MEMORY_CONTEXT_METHODID_BITS #define MEMORYCHUNK_VALUE_BASEBIT (MEMORYCHUNK_EXTERNAL_BASEBIT + 1) -#define MEMORYCHUNK_BLOCKOFFSET_BASEBIT (MEMORYCHUNK_VALUE_BASEBIT + 30) +#define MEMORYCHUNK_BLOCKOFFSET_BASEBIT (MEMORYCHUNK_VALUE_BASEBIT + 29) /* * A magic number for storing in the free bits of an external chunk. This @@ -131,11 +145,11 @@ typedef struct MemoryChunk (((hdrmask) >> MEMORYCHUNK_VALUE_BASEBIT) & MEMORYCHUNK_MAX_VALUE) /* - * We should have used up all the bits here, so the compiler is likely to - * optimize out the & MEMORYCHUNK_MAX_BLOCKOFFSET. + * Shift the block offset down to the 0th bit position and mask off the single + * bit that's shared with the MemoryChunkGetValue field. */ #define HdrMaskBlockOffset(hdrmask) \ - (((hdrmask) >> MEMORYCHUNK_BLOCKOFFSET_BASEBIT) & MEMORYCHUNK_MAX_BLOCKOFFSET) + (((hdrmask) >> MEMORYCHUNK_BLOCKOFFSET_BASEBIT) & MEMORYCHUNK_BLOCKOFFSET_MASK) /* For external chunks only, check the magic number matches */ #define HdrMaskCheckMagic(hdrmask) \ @@ -149,6 +163,7 @@ typedef struct MemoryChunk * The number of bytes between 'block' and 'chunk' must be <= * MEMORYCHUNK_MAX_BLOCKOFFSET. * 'value' must be <= MEMORYCHUNK_MAX_VALUE. + * Both 'chunk' and 'block' must be MAXALIGNed pointers. */ static inline void MemoryChunkSetHdrMask(MemoryChunk *chunk, void *block, @@ -157,7 +172,7 @@ MemoryChunkSetHdrMask(MemoryChunk *chunk, void *block, Size blockoffset = (char *) chunk - (char *) block; Assert((char *) chunk >= (char *) block); - Assert(blockoffset <= MEMORYCHUNK_MAX_BLOCKOFFSET); + Assert((blockoffset & MEMORYCHUNK_BLOCKOFFSET_MASK) == blockoffset); Assert(value <= MEMORYCHUNK_MAX_VALUE); Assert((int) methodid <= MEMORY_CONTEXT_METHODID_MASK); @@ -225,6 +240,7 @@ MemoryChunkGetBlock(MemoryChunk *chunk) } /* cleanup all internal definitions */ +#undef MEMORYCHUNK_BLOCKOFFSET_MASK #undef MEMORYCHUNK_EXTERNAL_BASEBIT #undef MEMORYCHUNK_VALUE_BASEBIT #undef MEMORYCHUNK_BLOCKOFFSET_BASEBIT diff --git a/src/include/utils/meson.build b/src/include/utils/meson.build index c212c4091f790..8d0cd4565369b 100644 --- a/src/include/utils/meson.build +++ b/src/include/utils/meson.build @@ -1,4 +1,21 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group + +wait_event_output = ['wait_event_types.h', 'pgstat_wait_event.c', 'wait_event_funcs_data.c'] +wait_event_target = custom_target('wait_event_names', + input: files('../../backend/utils/activity/wait_event_names.txt'), + output: wait_event_output, + command: [ + perl, files('../../backend/utils/activity/generate-wait_event_types.pl'), + '--outdir', '@OUTDIR@', '--code', + '@INPUT@' + ], + build_by_default: true, + install: true, + install_dir: [dir_include_server / 'utils', false, false], +) + +wait_event_types_h = wait_event_target[0] +generated_backend_headers += wait_event_types_h errcodes = custom_target('errcodes', input: files('../../backend/utils/errcodes.txt'), @@ -32,7 +49,7 @@ else input: files('../../backend/utils/probes.d'), output: 'probes.h', capture: true, - command: [sed, '-f', files('../../backend/utils/Gen_dummy_probes.sed'), '@INPUT@'], + command: [perl, '-n', files('../../backend/utils/Gen_dummy_probes.pl'), '@INPUT@'], install: true, install_dir: dir_include_server / 'utils', ) @@ -58,3 +75,5 @@ generated_sources_ac += { 'src/backend/utils': fmgrtab_output + ['errcodes.h', 'probes.h', 'fmgr-stamp'], 'src/include/utils': ['header-stamp'], } + +generated_sources_ac += {'src/backend/utils/activity': ['wait_event_types.h']} diff --git a/src/include/utils/multirangetypes.h b/src/include/utils/multirangetypes.h index 7663d35d56a6d..845254395b671 100644 --- a/src/include/utils/multirangetypes.h +++ b/src/include/utils/multirangetypes.h @@ -4,7 +4,7 @@ * Declarations for Postgres multirange types. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/multirangetypes.h diff --git a/src/include/utils/numeric.h b/src/include/utils/numeric.h index 08e4f8c217de7..43c75c436fe6b 100644 --- a/src/include/utils/numeric.h +++ b/src/include/utils/numeric.h @@ -5,7 +5,7 @@ * * Original coding 1998, Jan Wieck. Heavily revised 2003, Tom Lane. * - * Copyright (c) 1998-2023, PostgreSQL Global Development Group + * Copyright (c) 1998-2024, PostgreSQL Global Development Group * * src/include/utils/numeric.h * @@ -14,6 +14,7 @@ #ifndef _PG_NUMERIC_H_ #define _PG_NUMERIC_H_ +#include "common/pg_prng.h" #include "fmgr.h" /* @@ -101,5 +102,9 @@ extern Numeric numeric_div_opt_error(Numeric num1, Numeric num2, extern Numeric numeric_mod_opt_error(Numeric num1, Numeric num2, bool *have_error); extern int32 numeric_int4_opt_error(Numeric num, bool *have_error); +extern int64 numeric_int8_opt_error(Numeric num, bool *have_error); + +extern Numeric random_numeric(pg_prng_state *state, + Numeric rmin, Numeric rmax); #endif /* _PG_NUMERIC_H_ */ diff --git a/src/include/utils/old_snapshot.h b/src/include/utils/old_snapshot.h deleted file mode 100644 index f1978a28e1c94..0000000000000 --- a/src/include/utils/old_snapshot.h +++ /dev/null @@ -1,75 +0,0 @@ -/*------------------------------------------------------------------------- - * - * old_snapshot.h - * Data structures for 'snapshot too old' - * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * IDENTIFICATION - * src/include/utils/old_snapshot.h - * - *------------------------------------------------------------------------- - */ - -#ifndef OLD_SNAPSHOT_H -#define OLD_SNAPSHOT_H - -#include "datatype/timestamp.h" -#include "storage/s_lock.h" - -/* - * Structure for dealing with old_snapshot_threshold implementation. - */ -typedef struct OldSnapshotControlData -{ - /* - * Variables for old snapshot handling are shared among processes and are - * only allowed to move forward. - */ - slock_t mutex_current; /* protect current_timestamp */ - TimestampTz current_timestamp; /* latest snapshot timestamp */ - slock_t mutex_latest_xmin; /* protect latest_xmin and next_map_update */ - TransactionId latest_xmin; /* latest snapshot xmin */ - TimestampTz next_map_update; /* latest snapshot valid up to */ - slock_t mutex_threshold; /* protect threshold fields */ - TimestampTz threshold_timestamp; /* earlier snapshot is old */ - TransactionId threshold_xid; /* earlier xid may be gone */ - - /* - * Keep one xid per minute for old snapshot error handling. - * - * Use a circular buffer with a head offset, a count of entries currently - * used, and a timestamp corresponding to the xid at the head offset. A - * count_used value of zero means that there are no times stored; a - * count_used value of OLD_SNAPSHOT_TIME_MAP_ENTRIES means that the buffer - * is full and the head must be advanced to add new entries. Use - * timestamps aligned to minute boundaries, since that seems less - * surprising than aligning based on the first usage timestamp. The - * latest bucket is effectively stored within latest_xmin. The circular - * buffer is updated when we get a new xmin value that doesn't fall into - * the same interval. - * - * It is OK if the xid for a given time slot is from earlier than - * calculated by adding the number of minutes corresponding to the - * (possibly wrapped) distance from the head offset to the time of the - * head entry, since that just results in the vacuuming of old tuples - * being slightly less aggressive. It would not be OK for it to be off in - * the other direction, since it might result in vacuuming tuples that are - * still expected to be there. - * - * Use of an SLRU was considered but not chosen because it is more - * heavyweight than is needed for this, and would probably not be any less - * code to implement. - * - * Persistence is not needed. - */ - int head_offset; /* subscript of oldest tracked time */ - TimestampTz head_timestamp; /* time corresponding to head xid */ - int count_used; /* how many slots are in use */ - TransactionId xid_by_minute[FLEXIBLE_ARRAY_MEMBER]; -} OldSnapshotControlData; - -extern PGDLLIMPORT volatile OldSnapshotControlData *oldSnapshotControl; - -#endif diff --git a/src/include/utils/palloc.h b/src/include/utils/palloc.h index d1146c1235104..773a5d2c34738 100644 --- a/src/include/utils/palloc.h +++ b/src/include/utils/palloc.h @@ -18,7 +18,7 @@ * everything that should be freed. See utils/mmgr/README for more info. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/palloc.h @@ -70,7 +70,6 @@ extern PGDLLIMPORT MemoryContext CurrentMemoryContext; */ extern void *MemoryContextAlloc(MemoryContext context, Size size); extern void *MemoryContextAllocZero(MemoryContext context, Size size); -extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size); extern void *MemoryContextAllocExtended(MemoryContext context, Size size, int flags); extern void *MemoryContextAllocAligned(MemoryContext context, @@ -109,19 +108,6 @@ extern void pfree(void *pointer); #define repalloc_array(pointer, type, count) ((type *) repalloc(pointer, sizeof(type) * (count))) #define repalloc0_array(pointer, type, oldcount, count) ((type *) repalloc0(pointer, sizeof(type) * (oldcount), sizeof(type) * (count))) -/* - * The result of palloc() is always word-aligned, so we can skip testing - * alignment of the pointer when deciding which MemSet variant to use. - * Note that this variant does not offer any advantage, and should not be - * used, unless its "sz" argument is a compile-time constant; therefore, the - * issue that it evaluates the argument multiple times isn't a problem in - * practice. - */ -#define palloc0fast(sz) \ - ( MemSetTest(0, sz) ? \ - MemoryContextAllocZeroAligned(CurrentMemoryContext, sz) : \ - MemoryContextAllocZero(CurrentMemoryContext, sz) ) - /* Higher-limit allocators. */ extern void *MemoryContextAllocHuge(MemoryContext context, Size size); extern pg_nodiscard void *repalloc_huge(void *pointer, Size size); diff --git a/src/include/utils/partcache.h b/src/include/utils/partcache.h index eb9bc4b0dcf59..a4ffa03622469 100644 --- a/src/include/utils/partcache.h +++ b/src/include/utils/partcache.h @@ -2,7 +2,7 @@ * * partcache.h * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/include/utils/partcache.h * diff --git a/src/include/utils/pg_crc.h b/src/include/utils/pg_crc.h index a0369c647173d..6d76ce977192c 100644 --- a/src/include/utils/pg_crc.h +++ b/src/include/utils/pg_crc.h @@ -26,7 +26,7 @@ * * The CRC-32C variant is in port/pg_crc32c.h. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/pg_crc.h diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h index e2a72435427cf..040968d6ff295 100644 --- a/src/include/utils/pg_locale.h +++ b/src/include/utils/pg_locale.h @@ -4,7 +4,7 @@ * * src/include/utils/pg_locale.h * - * Copyright (c) 2002-2023, PostgreSQL Global Development Group + * Copyright (c) 2002-2024, PostgreSQL Global Development Group * *----------------------------------------------------------------------- */ @@ -67,9 +67,7 @@ extern void cache_locale_time(void); /* - * We define our own wrapper around locale_t so we can keep the same - * function signatures for all builds, while not having to create a - * fake version of the standard type locale_t in the global namespace. + * We use a discriminated union to hold either a locale_t or an ICU collator. * pg_locale_t is occasionally checked for truth, so make it a pointer. */ struct pg_locale_struct @@ -78,9 +76,11 @@ struct pg_locale_struct bool deterministic; union { -#ifdef HAVE_LOCALE_T + struct + { + const char *locale; + } builtin; locale_t lt; -#endif #ifdef USE_ICU struct { @@ -88,7 +88,6 @@ struct pg_locale_struct UCollator *ucol; } icu; #endif - int dummy; /* in case we have neither LOCALE_T nor ICU */ } info; }; @@ -118,6 +117,8 @@ extern size_t pg_strxfrm_prefix(char *dest, const char *src, size_t destsize, extern size_t pg_strnxfrm_prefix(char *dest, size_t destsize, const char *src, size_t srclen, pg_locale_t locale); +extern int builtin_locale_encoding(const char *locale); +extern const char *builtin_validate_locale(int encoding, const char *locale); extern void icu_validate_locale(const char *loc_str); extern char *icu_language_tag(const char *loc_str, int elevel); diff --git a/src/include/utils/pg_lsn.h b/src/include/utils/pg_lsn.h index 7bda26b40ac00..e885ecdb1e132 100644 --- a/src/include/utils/pg_lsn.h +++ b/src/include/utils/pg_lsn.h @@ -5,7 +5,7 @@ * PostgreSQL. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/pg_lsn.h diff --git a/src/include/utils/pg_rusage.h b/src/include/utils/pg_rusage.h index 219ee678856ce..a299c19fb8b89 100644 --- a/src/include/utils/pg_rusage.h +++ b/src/include/utils/pg_rusage.h @@ -4,7 +4,7 @@ * header file for resource usage measurement support routines * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/pg_rusage.h diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index 60fbf9394b98c..2210677839622 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -5,7 +5,7 @@ * only be needed by files implementing statistics support (rather than ones * reporting / querying stats). * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * src/include/utils/pgstat_internal.h * ---------- @@ -14,7 +14,7 @@ #define PGSTAT_INTERNAL_H -#include "common/hashfn.h" +#include "common/hashfn_unstable.h" #include "lib/dshash.h" #include "lib/ilist.h" #include "pgstat.h" @@ -93,6 +93,19 @@ typedef struct PgStatShared_HashEntry */ pg_atomic_uint32 refcount; + /* + * Counter tracking the number of times the entry has been reused. + * + * Set to 0 when the entry is created, and incremented by one each time + * the shared entry is reinitialized with pgstat_reinit_entry(). + * + * May only be incremented / decremented while holding at least a shared + * lock on the dshash partition containing the entry. Like refcount, it + * needs to be an atomic variable because multiple backends can increment + * the generation with just a shared lock. + */ + pg_atomic_uint32 generation; + /* * Pointer to shared stats. The stats entry always starts with * PgStatShared_Common, embedded in a larger struct containing the @@ -132,6 +145,12 @@ typedef struct PgStat_EntryRef */ PgStatShared_Common *shared_stats; + /* + * Copy of PgStatShared_HashEntry->generation, keeping locally track of + * the shared stats entry "generation" retrieved (number of times reused). + */ + uint32 generation; + /* * Pending statistics data that will need to be flushed to shared memory * stats eventually. Each stats kind utilizing pending data defines what @@ -269,13 +288,13 @@ typedef struct PgStat_KindInfo * definitions. */ static const char *const slru_names[] = { - "CommitTs", - "MultiXactMember", - "MultiXactOffset", - "Notify", - "Serial", - "Subtrans", - "Xact", + "commit_timestamp", + "multixact_member", + "multixact_offset", + "notify", + "serializable", + "subtransaction", + "transaction", "other" /* has to be last */ }; @@ -776,16 +795,10 @@ pgstat_cmp_hash_key(const void *a, const void *b, size_t size, void *arg) static inline uint32 pgstat_hash_hash_key(const void *d, size_t size, void *arg) { - const PgStat_HashKey *key = (PgStat_HashKey *) d; - uint32 hash; + const char *key = (const char *) d; Assert(size == sizeof(PgStat_HashKey) && arg == NULL); - - hash = murmurhash32(key->kind); - hash = hash_combine(hash, murmurhash32(key->dboid)); - hash = hash_combine(hash, murmurhash32(key->objoid)); - - return hash; + return fasthash32(key, size, 0); } /* diff --git a/src/include/utils/pidfile.h b/src/include/utils/pidfile.h index 1393a534f6076..f0d00d398fd47 100644 --- a/src/include/utils/pidfile.h +++ b/src/include/utils/pidfile.h @@ -3,7 +3,7 @@ * pidfile.h * Declarations describing the data directory lock file (postmaster.pid) * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/pidfile.h diff --git a/src/include/utils/plancache.h b/src/include/utils/plancache.h index a443181d41654..a90dfdf9067a4 100644 --- a/src/include/utils/plancache.h +++ b/src/include/utils/plancache.h @@ -5,7 +5,7 @@ * * See plancache.c for comments. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/plancache.h @@ -31,7 +31,7 @@ typedef enum { PLAN_CACHE_MODE_AUTO, PLAN_CACHE_MODE_FORCE_GENERIC_PLAN, - PLAN_CACHE_MODE_FORCE_CUSTOM_PLAN + PLAN_CACHE_MODE_FORCE_CUSTOM_PLAN, } PlanCacheMode; /* GUC parameter */ @@ -111,7 +111,7 @@ typedef struct CachedPlanSource List *query_list; /* list of Query nodes, or NIL if not valid */ List *relationOids; /* OIDs of relations the queries depend on */ List *invalItems; /* other dependencies, as PlanInvalItems */ - struct OverrideSearchPath *search_path; /* search_path used for parsing + struct SearchPathMatcher *search_path; /* search_path used for parsing * and planning */ MemoryContext query_context; /* context holding the above, or NULL */ Oid rewriteRoleId; /* Role ID we did rewriting for */ @@ -188,6 +188,8 @@ typedef struct CachedExpression extern void InitPlanCache(void); extern void ResetPlanCache(void); +extern void ReleaseAllPlanCacheRefsInOwner(ResourceOwner owner); + extern CachedPlanSource *CreateCachedPlan(struct RawStmt *raw_parse_tree, const char *query_string, CommandTag commandTag); diff --git a/src/include/utils/portal.h b/src/include/utils/portal.h index aa08b1e0fca7d..6c635150742eb 100644 --- a/src/include/utils/portal.h +++ b/src/include/utils/portal.h @@ -36,7 +36,7 @@ * to look like NO SCROLL cursors. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/portal.h @@ -64,9 +64,9 @@ * supports holdable cursors (the Executor results can be dumped into a * tuplestore for access after transaction completion). * - * PORTAL_ONE_RETURNING: the portal contains a single INSERT/UPDATE/DELETE - * query with a RETURNING clause (plus possibly auxiliary queries added by - * rule rewriting). On first execution, we run the portal to completion + * PORTAL_ONE_RETURNING: the portal contains a single INSERT/UPDATE/DELETE/ + * MERGE query with a RETURNING clause (plus possibly auxiliary queries added + * by rule rewriting). On first execution, we run the portal to completion * and dump the primary query's results into the portal tuplestore; the * results are then returned to the client as demanded. (We can't support * suspension of the query partway through, because the AFTER TRIGGER code @@ -92,7 +92,7 @@ typedef enum PortalStrategy PORTAL_ONE_RETURNING, PORTAL_ONE_MOD_WITH, PORTAL_UTIL_SELECT, - PORTAL_MULTI_QUERY + PORTAL_MULTI_QUERY, } PortalStrategy; /* @@ -107,7 +107,7 @@ typedef enum PortalStatus PORTAL_READY, /* PortalStart complete, can run it */ PORTAL_ACTIVE, /* portal is running (can't delete it) */ PORTAL_DONE, /* portal is finished (don't re-run it) */ - PORTAL_FAILED /* portal got error (can't re-run it) */ + PORTAL_FAILED, /* portal got error (can't re-run it) */ } PortalStatus; typedef struct PortalData *Portal; @@ -145,7 +145,7 @@ typedef struct PortalData /* Features/options */ PortalStrategy strategy; /* see above */ int cursorOptions; /* DECLARE CURSOR option bits */ - bool run_once; /* portal will only be run once */ + bool run_once; /* unused */ /* Status data */ PortalStatus status; /* see above */ @@ -170,9 +170,9 @@ typedef struct PortalData Snapshot portalSnapshot; /* active snapshot, or NULL if none */ /* - * Where we store tuples for a held cursor or a PORTAL_ONE_RETURNING or - * PORTAL_UTIL_SELECT query. (A cursor held past the end of its - * transaction no longer has any active executor state.) + * Where we store tuples for a held cursor or a PORTAL_ONE_RETURNING, + * PORTAL_ONE_MOD_WITH, or PORTAL_UTIL_SELECT query. (A cursor held past + * the end of its transaction no longer has any active executor state.) */ Tuplestorestate *holdStore; /* store for holdable cursors */ MemoryContext holdContext; /* memory containing holdStore */ diff --git a/src/include/utils/queryenvironment.h b/src/include/utils/queryenvironment.h index 532219ade2392..10a9b6d553017 100644 --- a/src/include/utils/queryenvironment.h +++ b/src/include/utils/queryenvironment.h @@ -4,7 +4,7 @@ * Access to functions to mutate the query environment and retrieve the * actual data related to entries (if any). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/queryenvironment.h @@ -19,7 +19,7 @@ typedef enum EphemeralNameRelationType { - ENR_NAMED_TUPLESTORE /* named tuplestore relation; e.g., deltas */ + ENR_NAMED_TUPLESTORE, /* named tuplestore relation; e.g., deltas */ } EphemeralNameRelationType; /* diff --git a/src/include/utils/rangetypes.h b/src/include/utils/rangetypes.h index 6b420a8618d55..2b574873cefde 100644 --- a/src/include/utils/rangetypes.h +++ b/src/include/utils/rangetypes.h @@ -4,7 +4,7 @@ * Declarations for Postgres range types. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/rangetypes.h diff --git a/src/include/utils/regproc.h b/src/include/utils/regproc.h index a1f7c6b0cdc3e..53e0298fb307a 100644 --- a/src/include/utils/regproc.h +++ b/src/include/utils/regproc.h @@ -3,7 +3,7 @@ * regproc.h * Functions for the built-in types regproc, regclass, regtype, etc. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/regproc.h diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h index 1426a353cd01c..87002049538a8 100644 --- a/src/include/utils/rel.h +++ b/src/include/utils/rel.h @@ -4,7 +4,7 @@ * POSTGRES relation descriptor (a/k/a relcache entry) definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/rel.h @@ -57,7 +57,7 @@ typedef struct RelationData RelFileLocator rd_locator; /* relation physical identifier */ SMgrRelation rd_smgr; /* cached file handle, or NULL */ int rd_refcnt; /* reference count */ - BackendId rd_backend; /* owning backend id, if temporary relation */ + ProcNumber rd_backend; /* owning backend's proc number, if temp rel */ bool rd_islocaltemp; /* rel is a temp rel of this session */ bool rd_isnailed; /* rel is nailed in cache */ bool rd_isvalid; /* relcache entry is valid */ @@ -150,7 +150,8 @@ typedef struct RelationData /* data managed by RelationGetIndexList: */ List *rd_indexlist; /* list of OIDs of indexes on relation */ - Oid rd_pkindex; /* OID of primary key, if any */ + Oid rd_pkindex; /* OID of (deferrable?) primary key, if any */ + bool rd_ispkdeferrable; /* is rd_pkindex a deferrable PK? */ Oid rd_replidindex; /* OID of replica identity index, if any */ /* data managed by RelationGetStatExtList: */ @@ -329,7 +330,7 @@ typedef enum StdRdOptIndexCleanup { STDRD_OPTION_VACUUM_INDEX_CLEANUP_AUTO = 0, STDRD_OPTION_VACUUM_INDEX_CLEANUP_OFF, - STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON + STDRD_OPTION_VACUUM_INDEX_CLEANUP_ON, } StdRdOptIndexCleanup; typedef struct StdRdOptions @@ -402,7 +403,7 @@ typedef enum ViewOptCheckOption { VIEW_OPTION_CHECK_OPTION_NOT_SET, VIEW_OPTION_CHECK_OPTION_LOCAL, - VIEW_OPTION_CHECK_OPTION_CASCADED + VIEW_OPTION_CHECK_OPTION_CASCADED, } ViewOptCheckOption; /* @@ -561,18 +562,15 @@ typedef struct ViewOptions * * Very little code is authorized to touch rel->rd_smgr directly. Instead * use this function to fetch its value. - * - * Note: since a relcache flush can cause the file handle to be closed again, - * it's unwise to hold onto the pointer returned by this function for any - * long period. Recommended practice is to just re-execute RelationGetSmgr - * each time you need to access the SMgrRelation. It's quite cheap in - * comparison to whatever an smgr function is going to do. */ static inline SMgrRelation RelationGetSmgr(Relation rel) { if (unlikely(rel->rd_smgr == NULL)) - smgrsetowner(&(rel->rd_smgr), smgropen(rel->rd_locator, rel->rd_backend)); + { + rel->rd_smgr = smgropen(rel->rd_locator, rel->rd_backend); + smgrpin(rel->rd_smgr); + } return rel->rd_smgr; } @@ -584,10 +582,11 @@ static inline void RelationCloseSmgr(Relation relation) { if (relation->rd_smgr != NULL) + { + smgrunpin(relation->rd_smgr); smgrclose(relation->rd_smgr); - - /* smgrclose should unhook from owner pointer */ - Assert(relation->rd_smgr == NULL); + relation->rd_smgr = NULL; + } } #endif /* !FRONTEND */ diff --git a/src/include/utils/relcache.h b/src/include/utils/relcache.h index beeb28b83cb89..18c32ea7008d4 100644 --- a/src/include/utils/relcache.h +++ b/src/include/utils/relcache.h @@ -4,7 +4,7 @@ * Relation descriptor cache definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/relcache.h @@ -51,16 +51,18 @@ extern Oid RelationGetReplicaIndex(Relation relation); extern List *RelationGetIndexExpressions(Relation relation); extern List *RelationGetDummyIndexExpressions(Relation relation); extern List *RelationGetIndexPredicate(Relation relation); -extern Datum *RelationGetIndexRawAttOptions(Relation indexrel); extern bytea **RelationGetIndexAttOptions(Relation relation, bool copy); +/* + * Which set of columns to return by RelationGetIndexAttrBitmap. + */ typedef enum IndexAttrBitmapKind { INDEX_ATTR_BITMAP_KEY, INDEX_ATTR_BITMAP_PRIMARY_KEY, INDEX_ATTR_BITMAP_IDENTITY_KEY, INDEX_ATTR_BITMAP_HOT_BLOCKING, - INDEX_ATTR_BITMAP_SUMMARIZED + INDEX_ATTR_BITMAP_SUMMARIZED, } IndexAttrBitmapKind; extern Bitmapset *RelationGetIndexAttrBitmap(Relation relation, @@ -127,8 +129,6 @@ extern void RelationCacheInvalidateEntry(Oid relationId); extern void RelationCacheInvalidate(bool debug_discard); -extern void RelationCloseSmgrByOid(Oid relationId); - #ifdef USE_ASSERT_CHECKING extern void AssertPendingSyncs_RelationCache(void); #else diff --git a/src/include/utils/relfilenumbermap.h b/src/include/utils/relfilenumbermap.h index d9b280d3a1077..0ca89e452adb9 100644 --- a/src/include/utils/relfilenumbermap.h +++ b/src/include/utils/relfilenumbermap.h @@ -3,7 +3,7 @@ * relfilenumbermap.h * relfilenumber to oid mapping cache. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/relfilenumbermap.h diff --git a/src/include/utils/relmapper.h b/src/include/utils/relmapper.h index 5c173bdbb3ca9..4c1a74743d87e 100644 --- a/src/include/utils/relmapper.h +++ b/src/include/utils/relmapper.h @@ -4,7 +4,7 @@ * Catalog-to-filenumber mapping * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/relmapper.h diff --git a/src/include/utils/relptr.h b/src/include/utils/relptr.h index 365cea14b93ed..622039e87e885 100644 --- a/src/include/utils/relptr.h +++ b/src/include/utils/relptr.h @@ -3,7 +3,7 @@ * relptr.h * This file contains basic declarations for relative pointers. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/relptr.h diff --git a/src/include/utils/reltrigger.h b/src/include/utils/reltrigger.h index df9a2fb690ea7..dfef4c055a48e 100644 --- a/src/include/utils/reltrigger.h +++ b/src/include/utils/reltrigger.h @@ -4,7 +4,7 @@ * POSTGRES relation trigger definitions. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/reltrigger.h diff --git a/src/include/utils/resowner.h b/src/include/utils/resowner.h index cd070b6080eae..4e534bc3e709c 100644 --- a/src/include/utils/resowner.h +++ b/src/include/utils/resowner.h @@ -9,7 +9,7 @@ * See utils/resowner/README for more info. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/resowner.h @@ -37,19 +37,88 @@ extern PGDLLIMPORT ResourceOwner AuxProcessResourceOwner; /* * Resource releasing is done in three phases: pre-locks, locks, and - * post-locks. The pre-lock phase must release any resources that are - * visible to other backends (such as pinned buffers); this ensures that - * when we release a lock that another backend may be waiting on, it will - * see us as being fully out of our transaction. The post-lock phase - * should be used for backend-internal cleanup. + * post-locks. The pre-lock phase must release any resources that are visible + * to other backends (such as pinned buffers); this ensures that when we + * release a lock that another backend may be waiting on, it will see us as + * being fully out of our transaction. The post-lock phase should be used for + * backend-internal cleanup. + * + * Within each phase, resources are released in priority order. Priority is + * just an integer specified in ResourceOwnerDesc. The priorities of built-in + * resource types are given below, extensions may use any priority relative to + * those or RELEASE_PRIO_FIRST/LAST. RELEASE_PRIO_FIRST is a fine choice if + * your resource doesn't depend on any other resources. */ typedef enum { - RESOURCE_RELEASE_BEFORE_LOCKS, + RESOURCE_RELEASE_BEFORE_LOCKS = 1, RESOURCE_RELEASE_LOCKS, - RESOURCE_RELEASE_AFTER_LOCKS + RESOURCE_RELEASE_AFTER_LOCKS, } ResourceReleasePhase; +typedef uint32 ResourceReleasePriority; + +/* priorities of built-in BEFORE_LOCKS resources */ +#define RELEASE_PRIO_BUFFER_IOS 100 +#define RELEASE_PRIO_BUFFER_PINS 200 +#define RELEASE_PRIO_RELCACHE_REFS 300 +#define RELEASE_PRIO_DSMS 400 +#define RELEASE_PRIO_JIT_CONTEXTS 500 +#define RELEASE_PRIO_CRYPTOHASH_CONTEXTS 600 +#define RELEASE_PRIO_HMAC_CONTEXTS 700 + +/* priorities of built-in AFTER_LOCKS resources */ +#define RELEASE_PRIO_CATCACHE_REFS 100 +#define RELEASE_PRIO_CATCACHE_LIST_REFS 200 +#define RELEASE_PRIO_PLANCACHE_REFS 300 +#define RELEASE_PRIO_TUPDESC_REFS 400 +#define RELEASE_PRIO_SNAPSHOT_REFS 500 +#define RELEASE_PRIO_FILES 600 +#define RELEASE_PRIO_WAITEVENTSETS 700 + +/* 0 is considered invalid */ +#define RELEASE_PRIO_FIRST 1 +#define RELEASE_PRIO_LAST UINT32_MAX + +/* + * In order to track an object, resowner.c needs a few callbacks for it. + * The callbacks for resources of a specific kind are encapsulated in + * ResourceOwnerDesc. + * + * Note that the callbacks occur post-commit or post-abort, so the callback + * functions can only do noncritical cleanup and must not fail. + */ +typedef struct ResourceOwnerDesc +{ + const char *name; /* name for the object kind, for debugging */ + + /* when are these objects released? */ + ResourceReleasePhase release_phase; + ResourceReleasePriority release_priority; + + /* + * Release resource. + * + * This is called for each resource in the resource owner, in the order + * specified by 'release_phase' and 'release_priority' when the whole + * resource owner is been released or when ResourceOwnerReleaseAllOfKind() + * is called. The resource is implicitly removed from the owner, the + * callback function doesn't need to call ResourceOwnerForget. + */ + void (*ReleaseResource) (Datum res); + + /* + * Format a string describing the resource, for debugging purposes. If a + * resource has not been properly released before commit, this is used to + * print a WARNING. + * + * This can be left to NULL, in which case a generic "[resource name]: %p" + * format is used. + */ + char *(*DebugPrint) (Datum res); + +} ResourceOwnerDesc; + /* * Dynamically loaded modules can get control during ResourceOwnerRelease * by providing a callback of this form. @@ -71,16 +140,28 @@ extern void ResourceOwnerRelease(ResourceOwner owner, ResourceReleasePhase phase, bool isCommit, bool isTopLevel); -extern void ResourceOwnerReleaseAllPlanCacheRefs(ResourceOwner owner); extern void ResourceOwnerDelete(ResourceOwner owner); extern ResourceOwner ResourceOwnerGetParent(ResourceOwner owner); extern void ResourceOwnerNewParent(ResourceOwner owner, ResourceOwner newparent); + +extern void ResourceOwnerEnlarge(ResourceOwner owner); +extern void ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind); +extern void ResourceOwnerForget(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind); + +extern void ResourceOwnerReleaseAllOfKind(ResourceOwner owner, const ResourceOwnerDesc *kind); + extern void RegisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg); extern void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback, void *arg); + extern void CreateAuxProcessResourceOwner(void); extern void ReleaseAuxProcessResources(bool isCommit); +/* special support for local lock management */ +struct LOCALLOCK; +extern void ResourceOwnerRememberLock(ResourceOwner owner, struct LOCALLOCK *locallock); +extern void ResourceOwnerForgetLock(ResourceOwner owner, struct LOCALLOCK *locallock); + #endif /* RESOWNER_H */ diff --git a/src/include/utils/resowner_private.h b/src/include/utils/resowner_private.h deleted file mode 100644 index ae58438ec767d..0000000000000 --- a/src/include/utils/resowner_private.h +++ /dev/null @@ -1,117 +0,0 @@ -/*------------------------------------------------------------------------- - * - * resowner_private.h - * POSTGRES resource owner private definitions. - * - * See utils/resowner/README for more info. - * - * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * src/include/utils/resowner_private.h - * - *------------------------------------------------------------------------- - */ -#ifndef RESOWNER_PRIVATE_H -#define RESOWNER_PRIVATE_H - -#include "storage/dsm.h" -#include "storage/fd.h" -#include "storage/lock.h" -#include "utils/catcache.h" -#include "utils/plancache.h" -#include "utils/resowner.h" -#include "utils/snapshot.h" - - -/* support for buffer refcount management */ -extern void ResourceOwnerEnlargeBuffers(ResourceOwner owner); -extern void ResourceOwnerRememberBuffer(ResourceOwner owner, Buffer buffer); -extern void ResourceOwnerForgetBuffer(ResourceOwner owner, Buffer buffer); - -/* support for IO-in-progress management */ -extern void ResourceOwnerEnlargeBufferIOs(ResourceOwner owner); -extern void ResourceOwnerRememberBufferIO(ResourceOwner owner, Buffer buffer); -extern void ResourceOwnerForgetBufferIO(ResourceOwner owner, Buffer buffer); - -/* support for local lock management */ -extern void ResourceOwnerRememberLock(ResourceOwner owner, LOCALLOCK *locallock); -extern void ResourceOwnerForgetLock(ResourceOwner owner, LOCALLOCK *locallock); - -/* support for catcache refcount management */ -extern void ResourceOwnerEnlargeCatCacheRefs(ResourceOwner owner); -extern void ResourceOwnerRememberCatCacheRef(ResourceOwner owner, - HeapTuple tuple); -extern void ResourceOwnerForgetCatCacheRef(ResourceOwner owner, - HeapTuple tuple); -extern void ResourceOwnerEnlargeCatCacheListRefs(ResourceOwner owner); -extern void ResourceOwnerRememberCatCacheListRef(ResourceOwner owner, - CatCList *list); -extern void ResourceOwnerForgetCatCacheListRef(ResourceOwner owner, - CatCList *list); - -/* support for relcache refcount management */ -extern void ResourceOwnerEnlargeRelationRefs(ResourceOwner owner); -extern void ResourceOwnerRememberRelationRef(ResourceOwner owner, - Relation rel); -extern void ResourceOwnerForgetRelationRef(ResourceOwner owner, - Relation rel); - -/* support for plancache refcount management */ -extern void ResourceOwnerEnlargePlanCacheRefs(ResourceOwner owner); -extern void ResourceOwnerRememberPlanCacheRef(ResourceOwner owner, - CachedPlan *plan); -extern void ResourceOwnerForgetPlanCacheRef(ResourceOwner owner, - CachedPlan *plan); - -/* support for tupledesc refcount management */ -extern void ResourceOwnerEnlargeTupleDescs(ResourceOwner owner); -extern void ResourceOwnerRememberTupleDesc(ResourceOwner owner, - TupleDesc tupdesc); -extern void ResourceOwnerForgetTupleDesc(ResourceOwner owner, - TupleDesc tupdesc); - -/* support for snapshot refcount management */ -extern void ResourceOwnerEnlargeSnapshots(ResourceOwner owner); -extern void ResourceOwnerRememberSnapshot(ResourceOwner owner, - Snapshot snapshot); -extern void ResourceOwnerForgetSnapshot(ResourceOwner owner, - Snapshot snapshot); - -/* support for temporary file management */ -extern void ResourceOwnerEnlargeFiles(ResourceOwner owner); -extern void ResourceOwnerRememberFile(ResourceOwner owner, - File file); -extern void ResourceOwnerForgetFile(ResourceOwner owner, - File file); - -/* support for dynamic shared memory management */ -extern void ResourceOwnerEnlargeDSMs(ResourceOwner owner); -extern void ResourceOwnerRememberDSM(ResourceOwner owner, - dsm_segment *); -extern void ResourceOwnerForgetDSM(ResourceOwner owner, - dsm_segment *); - -/* support for JITContext management */ -extern void ResourceOwnerEnlargeJIT(ResourceOwner owner); -extern void ResourceOwnerRememberJIT(ResourceOwner owner, - Datum handle); -extern void ResourceOwnerForgetJIT(ResourceOwner owner, - Datum handle); - -/* support for cryptohash context management */ -extern void ResourceOwnerEnlargeCryptoHash(ResourceOwner owner); -extern void ResourceOwnerRememberCryptoHash(ResourceOwner owner, - Datum handle); -extern void ResourceOwnerForgetCryptoHash(ResourceOwner owner, - Datum handle); - -/* support for HMAC context management */ -extern void ResourceOwnerEnlargeHMAC(ResourceOwner owner); -extern void ResourceOwnerRememberHMAC(ResourceOwner owner, - Datum handle); -extern void ResourceOwnerForgetHMAC(ResourceOwner owner, - Datum handle); - -#endif /* RESOWNER_PRIVATE_H */ diff --git a/src/include/utils/rls.h b/src/include/utils/rls.h index 1e95f83ef350f..fafc4ee89caab 100644 --- a/src/include/utils/rls.h +++ b/src/include/utils/rls.h @@ -4,7 +4,7 @@ * Header file for Row Level Security (RLS) utility commands to be used * with the rowsecurity feature. * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * src/include/utils/rls.h * @@ -42,7 +42,7 @@ enum CheckEnableRlsResult { RLS_NONE, RLS_NONE_ENV, - RLS_ENABLED + RLS_ENABLED, }; extern int check_enable_rls(Oid relid, Oid checkAsUser, bool noError); diff --git a/src/include/utils/ruleutils.h b/src/include/utils/ruleutils.h index b006d9d475ebf..161fb5ef02c6e 100644 --- a/src/include/utils/ruleutils.h +++ b/src/include/utils/ruleutils.h @@ -3,7 +3,7 @@ * ruleutils.h * Declarations for ruleutils.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/ruleutils.h diff --git a/src/include/utils/sampling.h b/src/include/utils/sampling.h index e26944887ebc4..be48ee52bac4b 100644 --- a/src/include/utils/sampling.h +++ b/src/include/utils/sampling.h @@ -3,7 +3,7 @@ * sampling.h * definitions for sampling functions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/sampling.h diff --git a/src/include/utils/selfuncs.h b/src/include/utils/selfuncs.h index 2f76c473db418..f2563ad1cb3a8 100644 --- a/src/include/utils/selfuncs.h +++ b/src/include/utils/selfuncs.h @@ -5,7 +5,7 @@ * infrastructure for selectivity and cost estimation. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/selfuncs.h @@ -117,6 +117,9 @@ typedef struct VariableStatData * Callers should initialize all fields of GenericCosts to zero. In addition, * they can set numIndexTuples to some positive value if they have a better * than default way of estimating the number of leaf index tuples visited. + * Similarly, they can set num_sa_scans to some value >= 1 for an index AM + * that doesn't necessarily perform exactly one primitive index scan per + * distinct combination of ScalarArrayOp array elements. */ typedef struct { @@ -200,7 +203,7 @@ extern Selectivity scalararraysel(PlannerInfo *root, ScalarArrayOpExpr *clause, bool is_join_clause, int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo); -extern int estimate_array_length(Node *arrayexpr); +extern double estimate_array_length(PlannerInfo *root, Node *arrayexpr); extern Selectivity rowcomparesel(PlannerInfo *root, RowCompareExpr *clause, int varRelid, JoinType jointype, SpecialJoinInfo *sjinfo); diff --git a/src/include/utils/sharedtuplestore.h b/src/include/utils/sharedtuplestore.h index c7075ad055d14..dcf676ff5fbb9 100644 --- a/src/include/utils/sharedtuplestore.h +++ b/src/include/utils/sharedtuplestore.h @@ -3,7 +3,7 @@ * sharedtuplestore.h * Simple mechanism for sharing tuples between backends. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/sharedtuplestore.h diff --git a/src/include/utils/snapmgr.h b/src/include/utils/snapmgr.h index 980d37a1947e6..9398a84051c5e 100644 --- a/src/include/utils/snapmgr.h +++ b/src/include/utils/snapmgr.h @@ -3,7 +3,7 @@ * snapmgr.h * POSTGRES snapshot manager * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/snapmgr.h @@ -19,40 +19,6 @@ #include "utils/snapshot.h" -/* - * The structure used to map times to TransactionId values for the "snapshot - * too old" feature must have a few entries at the tail to hold old values; - * otherwise the lookup will often fail and the expected early pruning or - * vacuum will not usually occur. It is best if this padding is for a number - * of minutes greater than a thread would normally be stalled, but it's OK if - * early vacuum opportunities are occasionally missed, so there's no need to - * use an extreme value or get too fancy. 10 minutes seems plenty. - */ -#define OLD_SNAPSHOT_PADDING_ENTRIES 10 -#define OLD_SNAPSHOT_TIME_MAP_ENTRIES (old_snapshot_threshold + OLD_SNAPSHOT_PADDING_ENTRIES) - -/* - * Common definition of relation properties that allow early pruning/vacuuming - * when old_snapshot_threshold >= 0. - */ -#define RelationAllowsEarlyPruning(rel) \ -( \ - RelationIsPermanent(rel) && !IsCatalogRelation(rel) \ - && !RelationIsAccessibleInLogicalDecoding(rel) \ -) - -#define EarlyPruningEnabled(rel) (old_snapshot_threshold >= 0 && RelationAllowsEarlyPruning(rel)) - -/* GUC variables */ -extern PGDLLIMPORT int old_snapshot_threshold; - - -extern Size SnapMgrShmemSize(void); -extern void SnapMgrInit(void); -extern TimestampTz GetSnapshotCurrentTimestamp(void); -extern TimestampTz GetOldSnapshotThresholdTimestamp(void); -extern void SnapshotTooOldMagicForTest(void); - extern PGDLLIMPORT bool FirstSnapshotSet; extern PGDLLIMPORT TransactionId TransactionXmin; @@ -97,14 +63,6 @@ extern PGDLLIMPORT SnapshotData CatalogSnapshotData; ((snapshot)->snapshot_type == SNAPSHOT_MVCC || \ (snapshot)->snapshot_type == SNAPSHOT_HISTORIC_MVCC) -#ifndef FRONTEND -static inline bool -OldSnapshotThresholdActive(void) -{ - return old_snapshot_threshold >= 0; -} -#endif - extern Snapshot GetTransactionSnapshot(void); extern Snapshot GetLatestSnapshot(void); extern void SnapshotSetCommandId(CommandId curcid); @@ -138,13 +96,6 @@ extern void DeleteAllExportedSnapshotFiles(void); extern void WaitForOlderSnapshots(TransactionId limitXmin, bool progress); extern bool ThereAreNoPriorRegisteredSnapshots(void); extern bool HaveRegisteredOrActiveSnapshot(void); -extern bool TransactionIdLimitedForOldSnapshots(TransactionId recentXmin, - Relation relation, - TransactionId *limit_xid, - TimestampTz *limit_ts); -extern void SetOldSnapshotThresholdTimestamp(TimestampTz ts, TransactionId xlimit); -extern void MaintainOldSnapshotTimeMapping(TimestampTz whenTaken, - TransactionId xmin); extern char *ExportSnapshot(Snapshot snapshot); @@ -156,8 +107,6 @@ typedef struct GlobalVisState GlobalVisState; extern GlobalVisState *GlobalVisTestFor(Relation rel); extern bool GlobalVisTestIsRemovableXid(GlobalVisState *state, TransactionId xid); extern bool GlobalVisTestIsRemovableFullXid(GlobalVisState *state, FullTransactionId fxid); -extern FullTransactionId GlobalVisTestNonRemovableFullHorizon(GlobalVisState *state); -extern TransactionId GlobalVisTestNonRemovableHorizon(GlobalVisState *state); extern bool GlobalVisCheckRemovableXid(Relation rel, TransactionId xid); extern bool GlobalVisCheckRemovableFullXid(Relation rel, FullTransactionId fxid); diff --git a/src/include/utils/snapshot.h b/src/include/utils/snapshot.h index 583a667a40ab5..8d1e31e888eea 100644 --- a/src/include/utils/snapshot.h +++ b/src/include/utils/snapshot.h @@ -3,7 +3,7 @@ * snapshot.h * POSTGRES snapshot definition * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/snapshot.h @@ -115,7 +115,7 @@ typedef enum SnapshotType * For visibility checks snapshot->min must have been set up with the xmin * horizon to use. */ - SNAPSHOT_NON_VACUUMABLE + SNAPSHOT_NON_VACUUMABLE, } SnapshotType; typedef struct SnapshotData *Snapshot; diff --git a/src/include/utils/sortsupport.h b/src/include/utils/sortsupport.h index 475ed1d5b82b4..4bf99584f8881 100644 --- a/src/include/utils/sortsupport.h +++ b/src/include/utils/sortsupport.h @@ -42,7 +42,7 @@ * function for such cases, but probably not any other acceleration method. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/sortsupport.h diff --git a/src/include/utils/spccache.h b/src/include/utils/spccache.h index c6c754a2ec4d4..11cfa719955ed 100644 --- a/src/include/utils/spccache.h +++ b/src/include/utils/spccache.h @@ -3,7 +3,7 @@ * spccache.h * Tablespace cache. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/spccache.h diff --git a/src/include/utils/syscache.h b/src/include/utils/syscache.h index 67ea6e4945275..b541911c8fc27 100644 --- a/src/include/utils/syscache.h +++ b/src/include/utils/syscache.h @@ -6,7 +6,7 @@ * See also lsyscache.h, which provides convenience routines for * common cache-lookup operations. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/syscache.h @@ -20,103 +20,7 @@ #include "access/htup.h" /* we intentionally do not include utils/catcache.h here */ -/* - * SysCache identifiers. - * - * The order of these identifiers must match the order - * of the entries in the array cacheinfo[] in syscache.c. - * Keep them in alphabetical order (renumbering only costs a - * backend rebuild). - */ - -enum SysCacheIdentifier -{ - AGGFNOID = 0, - AMNAME, - AMOID, - AMOPOPID, - AMOPSTRATEGY, - AMPROCNUM, - ATTNAME, - ATTNUM, - AUTHMEMMEMROLE, - AUTHMEMROLEMEM, - AUTHNAME, - AUTHOID, - CASTSOURCETARGET, - CLAAMNAMENSP, - CLAOID, - COLLNAMEENCNSP, - COLLOID, - CONDEFAULT, - CONNAMENSP, - CONSTROID, - CONVOID, - DATABASEOID, - DEFACLROLENSPOBJ, - ENUMOID, - ENUMTYPOIDNAME, - EVENTTRIGGERNAME, - EVENTTRIGGEROID, - FOREIGNDATAWRAPPERNAME, - FOREIGNDATAWRAPPEROID, - FOREIGNSERVERNAME, - FOREIGNSERVEROID, - FOREIGNTABLEREL, - INDEXRELID, - LANGNAME, - LANGOID, - NAMESPACENAME, - NAMESPACEOID, - OPERNAMENSP, - OPEROID, - OPFAMILYAMNAMENSP, - OPFAMILYOID, - PARAMETERACLNAME, - PARAMETERACLOID, - PARTRELID, - PROCNAMEARGSNSP, - PROCOID, - PUBLICATIONNAME, - PUBLICATIONNAMESPACE, - PUBLICATIONNAMESPACEMAP, - PUBLICATIONOID, - PUBLICATIONREL, - PUBLICATIONRELMAP, - RANGEMULTIRANGE, - RANGETYPE, - RELNAMENSP, - RELOID, - REPLORIGIDENT, - REPLORIGNAME, - RULERELNAME, - SEQRELID, - STATEXTDATASTXOID, - STATEXTNAMENSP, - STATEXTOID, - STATRELATTINH, - SUBSCRIPTIONNAME, - SUBSCRIPTIONOID, - SUBSCRIPTIONRELMAP, - TABLESPACEOID, - TRFOID, - TRFTYPELANG, - TSCONFIGMAP, - TSCONFIGNAMENSP, - TSCONFIGOID, - TSDICTNAMENSP, - TSDICTOID, - TSPARSERNAMENSP, - TSPARSEROID, - TSTEMPLATENAMENSP, - TSTEMPLATEOID, - TYPENAMENSP, - TYPEOID, - USERMAPPINGOID, - USERMAPPINGUSERSERVER - -#define SysCacheSize (USERMAPPINGUSERSERVER + 1) -}; +#include "catalog/syscache_ids.h" extern void InitCatalogCache(void); extern void InitCatalogCachePhase2(void); @@ -139,9 +43,14 @@ extern HeapTuple SearchSysCache4(int cacheId, extern void ReleaseSysCache(HeapTuple tuple); +extern HeapTuple SearchSysCacheLocked1(int cacheId, + Datum key1); + /* convenience routines */ extern HeapTuple SearchSysCacheCopy(int cacheId, Datum key1, Datum key2, Datum key3, Datum key4); +extern HeapTuple SearchSysCacheLockedCopy1(int cacheId, + Datum key1); extern bool SearchSysCacheExists(int cacheId, Datum key1, Datum key2, Datum key3, Datum key4); extern Oid GetSysCacheOid(int cacheId, AttrNumber oidcol, diff --git a/src/include/utils/timeout.h b/src/include/utils/timeout.h index e561a1cde920c..a5d8f078246fc 100644 --- a/src/include/utils/timeout.h +++ b/src/include/utils/timeout.h @@ -4,7 +4,7 @@ * Routines to multiplex SIGALRM interrupts for multiple timeout reasons. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/timeout.h @@ -31,6 +31,7 @@ typedef enum TimeoutId STANDBY_TIMEOUT, STANDBY_LOCK_TIMEOUT, IDLE_IN_TRANSACTION_SESSION_TIMEOUT, + TRANSACTION_TIMEOUT, IDLE_SESSION_TIMEOUT, IDLE_STATS_UPDATE_TIMEOUT, CLIENT_CONNECTION_CHECK_TIMEOUT, @@ -51,7 +52,7 @@ typedef enum TimeoutType { TMPARAM_AFTER, TMPARAM_AT, - TMPARAM_EVERY + TMPARAM_EVERY, } TimeoutType; typedef struct diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h index c4dd96c8c97c8..a6ce03ed46045 100644 --- a/src/include/utils/timestamp.h +++ b/src/include/utils/timestamp.h @@ -3,7 +3,7 @@ * timestamp.h * Definitions for the SQL "timestamp" and "interval" types. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/timestamp.h diff --git a/src/include/utils/tuplesort.h b/src/include/utils/tuplesort.h index af057b6358efa..cde83f6201525 100644 --- a/src/include/utils/tuplesort.h +++ b/src/include/utils/tuplesort.h @@ -11,7 +11,7 @@ * algorithm. Parallel sorts use a variant of this external sort * algorithm, and are typically only used for large amounts of data. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/tuplesort.h @@ -21,6 +21,7 @@ #ifndef TUPLESORT_H #define TUPLESORT_H +#include "access/brin_tuple.h" #include "access/itup.h" #include "executor/tuptable.h" #include "storage/dsm.h" @@ -77,7 +78,7 @@ typedef enum SORT_TYPE_TOP_N_HEAPSORT = 1 << 0, SORT_TYPE_QUICKSORT = 1 << 1, SORT_TYPE_EXTERNAL_SORT = 1 << 2, - SORT_TYPE_EXTERNAL_MERGE = 1 << 3 + SORT_TYPE_EXTERNAL_MERGE = 1 << 3, } TuplesortMethod; #define NUM_TUPLESORTMETHODS 4 @@ -85,7 +86,7 @@ typedef enum typedef enum { SORT_SPACE_TYPE_DISK, - SORT_SPACE_TYPE_MEMORY + SORT_SPACE_TYPE_MEMORY, } TuplesortSpaceType; /* Bitwise option flags for tuple sorts */ @@ -97,6 +98,15 @@ typedef enum /* specifies if the tuplesort is able to support bounded sorts */ #define TUPLESORT_ALLOWBOUNDED (1 << 1) +/* + * For bounded sort, tuples get pfree'd when they fall outside of the bound. + * When bounded sorts are not required, we can use a bump context for tuple + * allocation as there's no risk that pfree will ever be called for a tuple. + * Define a macro to make it easier for code to figure out if we're using a + * bump allocator. + */ +#define TupleSortUseBumpTupleCxt(opt) (((opt) & TUPLESORT_ALLOWBOUNDED) == 0) + typedef struct TuplesortInstrumentation { TuplesortMethod sortMethod; /* sort algorithm used */ @@ -108,10 +118,11 @@ typedef struct TuplesortInstrumentation * The objects we actually sort are SortTuple structs. These contain * a pointer to the tuple proper (might be a MinimalTuple or IndexTuple), * which is a separate palloc chunk --- we assume it is just one chunk and - * can be freed by a simple pfree() (except during merge, when we use a - * simple slab allocator). SortTuples also contain the tuple's first key - * column in Datum/nullflag format, and a source/input tape number that - * tracks which tape each heap element/slot belongs to during merging. + * can be freed by a simple pfree() (except during merge, where we use a + * simple slab allocator, and during a non-bounded sort where we use a bump + * allocator). SortTuples also contain the tuple's first key column in + * Datum/nullflag format, and a source/input tape number that tracks which + * tape each heap element/slot belongs to during merging. * * Storing the first key column lets us save heap_getattr or index_getattr * calls during tuple comparisons. We could extract and save all the key @@ -162,6 +173,13 @@ typedef struct */ SortTupleComparator comparetup; + /* + * Fall back to the full tuple for comparison, but only compare the first + * sortkey if it was abbreviated. Otherwise, only compare second and later + * sortkeys. + */ + SortTupleComparator comparetup_tiebreak; + /* * Alter datum1 representation in the SortTuple's array back from the * abbreviated key to the first column value. @@ -275,6 +293,9 @@ typedef struct * The "index_hash" API is similar to index_btree, but the tuples are * actually sorted by their hash codes not the raw data. * + * The "index_brin" API is similar to index_btree, but the tuples are + * BrinTuple and are sorted by their block number not the raw data. + * * Parallel sort callers are required to coordinate multiple tuplesort states * in a leader process and one or more worker processes. The leader process * must launch workers, and have each perform an independent "partial" @@ -356,7 +377,8 @@ extern Tuplesortstate *tuplesort_begin_common(int workMem, extern void tuplesort_set_bound(Tuplesortstate *state, int64 bound); extern bool tuplesort_used_bound(Tuplesortstate *state); extern void tuplesort_puttuple_common(Tuplesortstate *state, - SortTuple *tuple, bool useAbbrev); + SortTuple *tuple, bool useAbbrev, + Size tuplen); extern void tuplesort_performsort(Tuplesortstate *state); extern bool tuplesort_gettuple_common(Tuplesortstate *state, bool forward, SortTuple *stup); @@ -419,6 +441,8 @@ extern Tuplesortstate *tuplesort_begin_index_gist(Relation heapRel, Relation indexRel, int workMem, SortCoordinate coordinate, int sortopt); +extern Tuplesortstate *tuplesort_begin_index_brin(int workMem, SortCoordinate coordinate, + int sortopt); extern Tuplesortstate *tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation, bool nullsFirstFlag, @@ -430,7 +454,8 @@ extern void tuplesort_puttupleslot(Tuplesortstate *state, extern void tuplesort_putheaptuple(Tuplesortstate *state, HeapTuple tup); extern void tuplesort_putindextuplevalues(Tuplesortstate *state, Relation rel, ItemPointer self, - Datum *values, bool *isnull); + const Datum *values, const bool *isnull); +extern void tuplesort_putbrintuple(Tuplesortstate *state, BrinTuple *tuple, Size size); extern void tuplesort_putdatum(Tuplesortstate *state, Datum val, bool isNull); @@ -438,6 +463,8 @@ extern bool tuplesort_gettupleslot(Tuplesortstate *state, bool forward, bool copy, TupleTableSlot *slot, Datum *abbrev); extern HeapTuple tuplesort_getheaptuple(Tuplesortstate *state, bool forward); extern IndexTuple tuplesort_getindextuple(Tuplesortstate *state, bool forward); +extern BrinTuple *tuplesort_getbrintuple(Tuplesortstate *state, Size *len, + bool forward); extern bool tuplesort_getdatum(Tuplesortstate *state, bool forward, bool copy, Datum *val, bool *isNull, Datum *abbrev); diff --git a/src/include/utils/tuplestore.h b/src/include/utils/tuplestore.h index 36424b80b1b9e..419613c17bab1 100644 --- a/src/include/utils/tuplestore.h +++ b/src/include/utils/tuplestore.h @@ -21,7 +21,7 @@ * Also, we have changed the API to return tuples in TupleTableSlots, * so that there is a check to prevent attempted access to system columns. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/tuplestore.h @@ -54,10 +54,7 @@ extern void tuplestore_puttupleslot(Tuplestorestate *state, TupleTableSlot *slot); extern void tuplestore_puttuple(Tuplestorestate *state, HeapTuple tuple); extern void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, - Datum *values, bool *isnull); - -/* Backwards compatibility macro */ -#define tuplestore_donestoring(state) ((void) 0) + const Datum *values, const bool *isnull); extern int tuplestore_alloc_read_pointer(Tuplestorestate *state, int eflags); diff --git a/src/include/utils/typcache.h b/src/include/utils/typcache.h index 95f3a9ee308e9..f506cc4aa35d4 100644 --- a/src/include/utils/typcache.h +++ b/src/include/utils/typcache.h @@ -6,7 +6,7 @@ * The type cache exists to speed lookup of certain information about data * types that is not directly available from a type's pg_type row. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/typcache.h @@ -96,6 +96,7 @@ typedef struct TypeCacheEntry * btree comparison function. */ struct TypeCacheEntry *rngelemtype; /* range's element type */ + Oid rng_opfamily; /* opfamily to use for range comparisons */ Oid rng_collation; /* collation for comparisons, if any */ FmgrInfo rng_cmp_proc_finfo; /* comparison function */ FmgrInfo rng_canonical_finfo; /* canonicalization function, if any */ diff --git a/src/include/utils/tzparser.h b/src/include/utils/tzparser.h index 760785b2bf2d8..5d5edfff2baa6 100644 --- a/src/include/utils/tzparser.h +++ b/src/include/utils/tzparser.h @@ -3,7 +3,7 @@ * tzparser.h * Timezone offset file parsing definitions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/tzparser.h diff --git a/src/include/utils/uuid.h b/src/include/utils/uuid.h index 11177171b2c18..ae631e75d557d 100644 --- a/src/include/utils/uuid.h +++ b/src/include/utils/uuid.h @@ -5,7 +5,7 @@ * to avoid conflicts with any uuid_t type that might be defined by * the system headers. * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * src/include/utils/uuid.h * diff --git a/src/include/utils/varbit.h b/src/include/utils/varbit.h index 3bb7945ed99fb..312062cac6456 100644 --- a/src/include/utils/varbit.h +++ b/src/include/utils/varbit.h @@ -5,7 +5,7 @@ * * Code originally contributed by Adriaan Joubert. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/varbit.h diff --git a/src/include/utils/varlena.h b/src/include/utils/varlena.h index 77f5b247351d6..e6d90b94be81a 100644 --- a/src/include/utils/varlena.h +++ b/src/include/utils/varlena.h @@ -3,7 +3,7 @@ * varlena.h * Functions for the variable-length built-in types. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/varlena.h diff --git a/src/include/utils/wait_event.h b/src/include/utils/wait_event.h index 518d3b0a1f768..9f18a753d47ef 100644 --- a/src/include/utils/wait_event.h +++ b/src/include/utils/wait_event.h @@ -2,7 +2,7 @@ * wait_event.h * Definitions related to wait event reporting * - * Copyright (c) 2001-2023, PostgreSQL Global Development Group + * Copyright (c) 2001-2024, PostgreSQL Global Development Group * * src/include/utils/wait_event.h * ---------- @@ -17,226 +17,17 @@ */ #define PG_WAIT_LWLOCK 0x01000000U #define PG_WAIT_LOCK 0x03000000U -#define PG_WAIT_BUFFER_PIN 0x04000000U +#define PG_WAIT_BUFFERPIN 0x04000000U #define PG_WAIT_ACTIVITY 0x05000000U #define PG_WAIT_CLIENT 0x06000000U #define PG_WAIT_EXTENSION 0x07000000U #define PG_WAIT_IPC 0x08000000U #define PG_WAIT_TIMEOUT 0x09000000U #define PG_WAIT_IO 0x0A000000U +#define PG_WAIT_INJECTIONPOINT 0x0B000000U -/* ---------- - * Wait Events - Activity - * - * Use this category when a process is waiting because it has no work to do, - * unless the "Client" or "Timeout" category describes the situation better. - * Typically, this should only be used for background processes. - * ---------- - */ -typedef enum -{ - WAIT_EVENT_ARCHIVER_MAIN = PG_WAIT_ACTIVITY, - WAIT_EVENT_AUTOVACUUM_MAIN, - WAIT_EVENT_BGWRITER_HIBERNATE, - WAIT_EVENT_BGWRITER_MAIN, - WAIT_EVENT_CHECKPOINTER_MAIN, - WAIT_EVENT_LOGICAL_APPLY_MAIN, - WAIT_EVENT_LOGICAL_LAUNCHER_MAIN, - WAIT_EVENT_LOGICAL_PARALLEL_APPLY_MAIN, - WAIT_EVENT_RECOVERY_WAL_STREAM, - WAIT_EVENT_SYSLOGGER_MAIN, - WAIT_EVENT_WAL_RECEIVER_MAIN, - WAIT_EVENT_WAL_SENDER_MAIN, - WAIT_EVENT_WAL_WRITER_MAIN -} WaitEventActivity; - -/* ---------- - * Wait Events - Client - * - * Use this category when a process is waiting to send data to or receive data - * from the frontend process to which it is connected. This is never used for - * a background process, which has no client connection. - * ---------- - */ -typedef enum -{ - WAIT_EVENT_CLIENT_READ = PG_WAIT_CLIENT, - WAIT_EVENT_CLIENT_WRITE, - WAIT_EVENT_GSS_OPEN_SERVER, - WAIT_EVENT_LIBPQWALRECEIVER_CONNECT, - WAIT_EVENT_LIBPQWALRECEIVER_RECEIVE, - WAIT_EVENT_SSL_OPEN_SERVER, - WAIT_EVENT_WAL_SENDER_WAIT_WAL, - WAIT_EVENT_WAL_SENDER_WRITE_DATA, -} WaitEventClient; - -/* ---------- - * Wait Events - IPC - * - * Use this category when a process cannot complete the work it is doing because - * it is waiting for a notification from another process. - * ---------- - */ -typedef enum -{ - WAIT_EVENT_APPEND_READY = PG_WAIT_IPC, - WAIT_EVENT_ARCHIVE_CLEANUP_COMMAND, - WAIT_EVENT_ARCHIVE_COMMAND, - WAIT_EVENT_BACKEND_TERMINATION, - WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE, - WAIT_EVENT_BGWORKER_SHUTDOWN, - WAIT_EVENT_BGWORKER_STARTUP, - WAIT_EVENT_BTREE_PAGE, - WAIT_EVENT_BUFFER_IO, - WAIT_EVENT_CHECKPOINT_DONE, - WAIT_EVENT_CHECKPOINT_START, - WAIT_EVENT_EXECUTE_GATHER, - WAIT_EVENT_HASH_BATCH_ALLOCATE, - WAIT_EVENT_HASH_BATCH_ELECT, - WAIT_EVENT_HASH_BATCH_LOAD, - WAIT_EVENT_HASH_BUILD_ALLOCATE, - WAIT_EVENT_HASH_BUILD_ELECT, - WAIT_EVENT_HASH_BUILD_HASH_INNER, - WAIT_EVENT_HASH_BUILD_HASH_OUTER, - WAIT_EVENT_HASH_GROW_BATCHES_DECIDE, - WAIT_EVENT_HASH_GROW_BATCHES_ELECT, - WAIT_EVENT_HASH_GROW_BATCHES_FINISH, - WAIT_EVENT_HASH_GROW_BATCHES_REALLOCATE, - WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION, - WAIT_EVENT_HASH_GROW_BUCKETS_ELECT, - WAIT_EVENT_HASH_GROW_BUCKETS_REALLOCATE, - WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT, - WAIT_EVENT_LOGICAL_APPLY_SEND_DATA, - WAIT_EVENT_LOGICAL_PARALLEL_APPLY_STATE_CHANGE, - WAIT_EVENT_LOGICAL_SYNC_DATA, - WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE, - WAIT_EVENT_MQ_INTERNAL, - WAIT_EVENT_MQ_PUT_MESSAGE, - WAIT_EVENT_MQ_RECEIVE, - WAIT_EVENT_MQ_SEND, - WAIT_EVENT_PARALLEL_BITMAP_SCAN, - WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN, - WAIT_EVENT_PARALLEL_FINISH, - WAIT_EVENT_PROCARRAY_GROUP_UPDATE, - WAIT_EVENT_PROC_SIGNAL_BARRIER, - WAIT_EVENT_PROMOTE, - WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT, - WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE, - WAIT_EVENT_RECOVERY_END_COMMAND, - WAIT_EVENT_RECOVERY_PAUSE, - WAIT_EVENT_REPLICATION_ORIGIN_DROP, - WAIT_EVENT_REPLICATION_SLOT_DROP, - WAIT_EVENT_RESTORE_COMMAND, - WAIT_EVENT_SAFE_SNAPSHOT, - WAIT_EVENT_SYNC_REP, - WAIT_EVENT_WAL_RECEIVER_EXIT, - WAIT_EVENT_WAL_RECEIVER_WAIT_START, - WAIT_EVENT_XACT_GROUP_UPDATE -} WaitEventIPC; - -/* ---------- - * Wait Events - Timeout - * - * Use this category when a process is waiting for a timeout to expire. - * ---------- - */ -typedef enum -{ - WAIT_EVENT_BASE_BACKUP_THROTTLE = PG_WAIT_TIMEOUT, - WAIT_EVENT_CHECKPOINT_WRITE_DELAY, - WAIT_EVENT_PG_SLEEP, - WAIT_EVENT_RECOVERY_APPLY_DELAY, - WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL, - WAIT_EVENT_REGISTER_SYNC_REQUEST, - WAIT_EVENT_SPIN_DELAY, - WAIT_EVENT_VACUUM_DELAY, - WAIT_EVENT_VACUUM_TRUNCATE -} WaitEventTimeout; - -/* ---------- - * Wait Events - IO - * - * Use this category when a process is waiting for a IO. - * ---------- - */ -typedef enum -{ - WAIT_EVENT_BASEBACKUP_READ = PG_WAIT_IO, - WAIT_EVENT_BASEBACKUP_SYNC, - WAIT_EVENT_BASEBACKUP_WRITE, - WAIT_EVENT_BUFFILE_READ, - WAIT_EVENT_BUFFILE_WRITE, - WAIT_EVENT_BUFFILE_TRUNCATE, - WAIT_EVENT_CONTROL_FILE_READ, - WAIT_EVENT_CONTROL_FILE_SYNC, - WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE, - WAIT_EVENT_CONTROL_FILE_WRITE, - WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE, - WAIT_EVENT_COPY_FILE_READ, - WAIT_EVENT_COPY_FILE_WRITE, - WAIT_EVENT_DATA_FILE_EXTEND, - WAIT_EVENT_DATA_FILE_FLUSH, - WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC, - WAIT_EVENT_DATA_FILE_PREFETCH, - WAIT_EVENT_DATA_FILE_READ, - WAIT_EVENT_DATA_FILE_SYNC, - WAIT_EVENT_DATA_FILE_TRUNCATE, - WAIT_EVENT_DATA_FILE_WRITE, - WAIT_EVENT_DSM_ALLOCATE, - WAIT_EVENT_DSM_FILL_ZERO_WRITE, - WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ, - WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC, - WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE, - WAIT_EVENT_LOCK_FILE_CREATE_READ, - WAIT_EVENT_LOCK_FILE_CREATE_SYNC, - WAIT_EVENT_LOCK_FILE_CREATE_WRITE, - WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ, - WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC, - WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC, - WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE, - WAIT_EVENT_LOGICAL_REWRITE_SYNC, - WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE, - WAIT_EVENT_LOGICAL_REWRITE_WRITE, - WAIT_EVENT_RELATION_MAP_READ, - WAIT_EVENT_RELATION_MAP_REPLACE, - WAIT_EVENT_RELATION_MAP_WRITE, - WAIT_EVENT_REORDER_BUFFER_READ, - WAIT_EVENT_REORDER_BUFFER_WRITE, - WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ, - WAIT_EVENT_REPLICATION_SLOT_READ, - WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC, - WAIT_EVENT_REPLICATION_SLOT_SYNC, - WAIT_EVENT_REPLICATION_SLOT_WRITE, - WAIT_EVENT_SLRU_FLUSH_SYNC, - WAIT_EVENT_SLRU_READ, - WAIT_EVENT_SLRU_SYNC, - WAIT_EVENT_SLRU_WRITE, - WAIT_EVENT_SNAPBUILD_READ, - WAIT_EVENT_SNAPBUILD_SYNC, - WAIT_EVENT_SNAPBUILD_WRITE, - WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC, - WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE, - WAIT_EVENT_TIMELINE_HISTORY_READ, - WAIT_EVENT_TIMELINE_HISTORY_SYNC, - WAIT_EVENT_TIMELINE_HISTORY_WRITE, - WAIT_EVENT_TWOPHASE_FILE_READ, - WAIT_EVENT_TWOPHASE_FILE_SYNC, - WAIT_EVENT_TWOPHASE_FILE_WRITE, - WAIT_EVENT_VERSION_FILE_WRITE, - WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ, - WAIT_EVENT_WAL_BOOTSTRAP_SYNC, - WAIT_EVENT_WAL_BOOTSTRAP_WRITE, - WAIT_EVENT_WAL_COPY_READ, - WAIT_EVENT_WAL_COPY_SYNC, - WAIT_EVENT_WAL_COPY_WRITE, - WAIT_EVENT_WAL_INIT_SYNC, - WAIT_EVENT_WAL_INIT_WRITE, - WAIT_EVENT_WAL_READ, - WAIT_EVENT_WAL_SYNC, - WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN, - WAIT_EVENT_WAL_WRITE -} WaitEventIO; - +/* enums for wait events */ +#include "utils/wait_event_types.h" extern const char *pgstat_get_wait_event(uint32 wait_event_info); extern const char *pgstat_get_wait_event_type(uint32 wait_event_info); @@ -248,6 +39,29 @@ extern void pgstat_reset_wait_event_storage(void); extern PGDLLIMPORT uint32 *my_wait_event_info; +/* + * Wait Events - Extension, InjectionPoint + * + * Use InjectionPoint when the server process is waiting in an injection + * point. Use Extension for other cases of the server process waiting for + * some condition defined by an extension module. + * + * Extensions can define their own wait events in these categories. They + * should call one of these functions with a wait event string. If the wait + * event associated to a string is already allocated, it returns the wait + * event information to use. If not, it gets one wait event ID allocated from + * a shared counter, associates the string to the ID in the shared dynamic + * hash and returns the wait event information. + * + * The ID retrieved can be used with pgstat_report_wait_start() or equivalent. + */ +extern uint32 WaitEventExtensionNew(const char *wait_event_name); +extern uint32 WaitEventInjectionPointNew(const char *wait_event_name); + +extern void WaitEventCustomShmemInit(void); +extern Size WaitEventCustomShmemSize(void); +extern char **GetWaitEventCustomNames(uint32 classId, int *nwaitevents); + /* ---------- * pgstat_report_wait_start() - * diff --git a/src/include/utils/xid8.h b/src/include/utils/xid8.h index 2f5e14baad4d6..e8f887c633331 100644 --- a/src/include/utils/xid8.h +++ b/src/include/utils/xid8.h @@ -3,7 +3,7 @@ * xid8.h * Header file for the "xid8" ADT. * - * Copyright (c) 2020-2023, PostgreSQL Global Development Group + * Copyright (c) 2020-2024, PostgreSQL Global Development Group * * src/include/utils/xid8.h * diff --git a/src/include/utils/xml.h b/src/include/utils/xml.h index 224f6d75ffde3..ed20e213753ac 100644 --- a/src/include/utils/xml.h +++ b/src/include/utils/xml.h @@ -4,7 +4,7 @@ * Declarations for XML data type support. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/include/utils/xml.h @@ -27,13 +27,13 @@ typedef enum XML_STANDALONE_YES, XML_STANDALONE_NO, XML_STANDALONE_NO_VALUE, - XML_STANDALONE_OMITTED + XML_STANDALONE_OMITTED, } XmlStandaloneType; typedef enum { XMLBINARY_BASE64, - XMLBINARY_HEX + XMLBINARY_HEX, } XmlBinaryType; typedef enum @@ -41,7 +41,7 @@ typedef enum PG_XML_STRICTNESS_LEGACY, /* ignore errors unless function result * indicates error condition */ PG_XML_STRICTNESS_WELLFORMED, /* ignore non-parser messages */ - PG_XML_STRICTNESS_ALL /* report all notices/warnings/errors */ + PG_XML_STRICTNESS_ALL, /* report all notices/warnings/errors */ } PgXmlStrictness; /* struct PgXmlErrorContext is private to xml.c */ diff --git a/src/include/varatt.h b/src/include/varatt.h index e34870526ba2c..f04435e9ef340 100644 --- a/src/include/varatt.h +++ b/src/include/varatt.h @@ -4,7 +4,7 @@ * variable-length datatypes (TOAST support) * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1995, Regents of the University of California * * src/include/varatt.h diff --git a/src/include/windowapi.h b/src/include/windowapi.h index b8c2c565d175e..5c39b4f1cbab3 100644 --- a/src/include/windowapi.h +++ b/src/include/windowapi.h @@ -19,7 +19,7 @@ * function in nodeWindowAgg.c for details. * * - * Portions Copyright (c) 2000-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2000-2024, PostgreSQL Global Development Group * * src/include/windowapi.h * diff --git a/src/interfaces/ecpg/Makefile b/src/interfaces/ecpg/Makefile index e4bbf7b8a865b..3002bc3c1bb66 100644 --- a/src/interfaces/ecpg/Makefile +++ b/src/interfaces/ecpg/Makefile @@ -23,7 +23,7 @@ install-pgtypeslib-recurse install-ecpglib-recurse install-compatlib-recurse ins install-compatlib-recurse: install-ecpglib-recurse install-ecpglib-recurse: install-pgtypeslib-recurse -clean distclean maintainer-clean: +clean distclean: $(MAKE) -C test clean checktcp: | temp-install diff --git a/src/interfaces/ecpg/compatlib/Makefile b/src/interfaces/ecpg/compatlib/Makefile index b9483fba08a1f..229a1bcaa05e3 100644 --- a/src/interfaces/ecpg/compatlib/Makefile +++ b/src/interfaces/ecpg/compatlib/Makefile @@ -2,7 +2,7 @@ # # Makefile for ecpg compatibility library # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/interfaces/ecpg/compatlib/Makefile @@ -55,5 +55,3 @@ uninstall: uninstall-lib clean distclean: clean-lib rm -f $(OBJS) - -maintainer-clean: distclean diff --git a/src/interfaces/ecpg/compatlib/informix.c b/src/interfaces/ecpg/compatlib/informix.c index dccf39582da55..65a0b2e46c4c8 100644 --- a/src/interfaces/ecpg/compatlib/informix.c +++ b/src/interfaces/ecpg/compatlib/informix.c @@ -175,6 +175,25 @@ deccopy(decimal *src, decimal *target) memcpy(target, src, sizeof(decimal)); } +static char * +ecpg_strndup(const char *str, size_t len) +{ + size_t real_len = strlen(str); + int use_len = (int) ((real_len > len) ? len : real_len); + + char *new = malloc(use_len + 1); + + if (new) + { + memcpy(new, str, use_len); + new[use_len] = '\0'; + } + else + errno = ENOMEM; + + return new; +} + int deccvasc(const char *cp, int len, decimal *np) { @@ -186,8 +205,8 @@ deccvasc(const char *cp, int len, decimal *np) if (risnull(CSTRINGTYPE, cp)) return 0; - str = pnstrdup(cp, len); /* decimal_in always converts the complete - * string */ + str = ecpg_strndup(cp, len); /* decimal_in always converts the complete + * string */ if (!str) ret = ECPG_INFORMIX_NUM_UNDERFLOW; else @@ -435,6 +454,7 @@ dectoint(decimal *np, int *ip) { int ret; numeric *nres = PGTYPESnumeric_new(); + int errnum; if (nres == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY; @@ -445,10 +465,12 @@ dectoint(decimal *np, int *ip) return ECPG_INFORMIX_OUT_OF_MEMORY; } + errno = 0; ret = PGTYPESnumeric_to_int(nres, ip); + errnum = errno; PGTYPESnumeric_free(nres); - if (ret == PGTYPES_NUM_OVERFLOW) + if (ret == -1 && errnum == PGTYPES_NUM_OVERFLOW) ret = ECPG_INFORMIX_NUM_OVERFLOW; return ret; @@ -459,6 +481,7 @@ dectolong(decimal *np, long *lngp) { int ret; numeric *nres = PGTYPESnumeric_new(); + int errnum; if (nres == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY; @@ -469,10 +492,12 @@ dectolong(decimal *np, long *lngp) return ECPG_INFORMIX_OUT_OF_MEMORY; } + errno = 0; ret = PGTYPESnumeric_to_long(nres, lngp); + errnum = errno; PGTYPESnumeric_free(nres); - if (ret == PGTYPES_NUM_OVERFLOW) + if (ret == -1 && errnum == PGTYPES_NUM_OVERFLOW) ret = ECPG_INFORMIX_NUM_OVERFLOW; return ret; @@ -654,7 +679,7 @@ intoasc(interval * i, char *str) if (!tmp) return -errno; - memcpy(str, tmp, strlen(tmp)); + strcpy(str, tmp); free(tmp); return 0; } diff --git a/src/interfaces/ecpg/compatlib/meson.build b/src/interfaces/ecpg/compatlib/meson.build index 16d73db88bbee..3c57dd6508b23 100644 --- a/src/interfaces/ecpg/compatlib/meson.build +++ b/src/interfaces/ecpg/compatlib/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group ecpg_compat_sources = files( 'informix.c', diff --git a/src/interfaces/ecpg/ecpglib/Makefile b/src/interfaces/ecpg/ecpglib/Makefile index 652e0234050ab..5e159eb2a492b 100644 --- a/src/interfaces/ecpg/ecpglib/Makefile +++ b/src/interfaces/ecpg/ecpglib/Makefile @@ -2,7 +2,7 @@ # # Makefile for ecpg library # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/interfaces/ecpg/ecpglib/Makefile @@ -66,5 +66,3 @@ uninstall: uninstall-lib clean distclean: clean-lib rm -f $(OBJS) - -maintainer-clean: distclean diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c index db0bae1fe08ac..8afb1f0a26fba 100644 --- a/src/interfaces/ecpg/ecpglib/connect.c +++ b/src/interfaces/ecpg/ecpglib/connect.c @@ -14,15 +14,12 @@ locale_t ecpg_clocale = (locale_t) 0; #endif -#ifdef ENABLE_THREAD_SAFETY static pthread_mutex_t connections_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_key_t actual_connection_key; static pthread_once_t actual_connection_key_once = PTHREAD_ONCE_INIT; -#endif static struct connection *actual_connection = NULL; static struct connection *all_connections = NULL; -#ifdef ENABLE_THREAD_SAFETY static void ecpg_actual_connection_init(void) { @@ -34,7 +31,6 @@ ecpg_pthreads_init(void) { pthread_once(&actual_connection_key_once, ecpg_actual_connection_init); } -#endif static struct connection * ecpg_get_connection_nr(const char *connection_name) @@ -43,7 +39,6 @@ ecpg_get_connection_nr(const char *connection_name) if ((connection_name == NULL) || (strcmp(connection_name, "CURRENT") == 0)) { -#ifdef ENABLE_THREAD_SAFETY ecpg_pthreads_init(); /* ensure actual_connection_key is valid */ ret = pthread_getspecific(actual_connection_key); @@ -56,9 +51,6 @@ ecpg_get_connection_nr(const char *connection_name) if (ret == NULL) /* no TSD connection, going for global */ ret = actual_connection; -#else - ret = actual_connection; -#endif } else { @@ -82,7 +74,6 @@ ecpg_get_connection(const char *connection_name) if ((connection_name == NULL) || (strcmp(connection_name, "CURRENT") == 0)) { -#ifdef ENABLE_THREAD_SAFETY ecpg_pthreads_init(); /* ensure actual_connection_key is valid */ ret = pthread_getspecific(actual_connection_key); @@ -95,21 +86,14 @@ ecpg_get_connection(const char *connection_name) if (ret == NULL) /* no TSD connection here either, using global */ ret = actual_connection; -#else - ret = actual_connection; -#endif } else { -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_lock(&connections_mutex); -#endif ret = ecpg_get_connection_nr(connection_name); -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&connections_mutex); -#endif } return ret; @@ -143,10 +127,8 @@ ecpg_finish(struct connection *act) con->next = act->next; } -#ifdef ENABLE_THREAD_SAFETY if (pthread_getspecific(actual_connection_key) == act) pthread_setspecific(actual_connection_key, all_connections); -#endif if (actual_connection == act) actual_connection = all_connections; @@ -212,11 +194,7 @@ ECPGsetconn(int lineno, const char *connection_name) if (!ecpg_init(con, connection_name, lineno)) return false; -#ifdef ENABLE_THREAD_SAFETY pthread_setspecific(actual_connection_key, con); -#else - actual_connection = con; -#endif return true; } @@ -326,9 +304,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p if (dbname == NULL && connection_name == NULL) connection_name = "DEFAULT"; -#if ENABLE_THREAD_SAFETY ecpg_pthreads_init(); -#endif /* check if the identifier is unique */ if (ecpg_get_connection(connection_name)) @@ -505,9 +481,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p } /* add connection to our list */ -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_lock(&connections_mutex); -#endif /* * ... but first, make certain we have created ecpg_clocale. Rely on @@ -519,9 +493,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p ecpg_clocale = newlocale(LC_NUMERIC_MASK, "C", (locale_t) 0); if (!ecpg_clocale) { -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&connections_mutex); -#endif ecpg_raise(lineno, ECPG_OUT_OF_MEMORY, ECPG_SQLSTATE_ECPG_OUT_OF_MEMORY, NULL); if (host) @@ -558,9 +530,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p this->next = all_connections; all_connections = this; -#ifdef ENABLE_THREAD_SAFETY pthread_setspecific(actual_connection_key, all_connections); -#endif actual_connection = all_connections; ecpg_log("ECPGconnect: opening database %s on %s port %s %s%s %s%s\n", @@ -678,9 +648,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p ecpg_log("ECPGconnect: %s", errmsg); ecpg_finish(this); -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&connections_mutex); -#endif ecpg_raise(lineno, ECPG_CONNECT, ECPG_SQLSTATE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION, db); if (realname) @@ -692,9 +660,7 @@ ECPGconnect(int lineno, int c, const char *name, const char *user, const char *p if (realname) ecpg_free(realname); -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&connections_mutex); -#endif this->autocommit = autocommit; @@ -716,9 +682,7 @@ ECPGdisconnect(int lineno, const char *connection_name) return false; } -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_lock(&connections_mutex); -#endif if (strcmp(connection_name, "ALL") == 0) { @@ -737,18 +701,14 @@ ECPGdisconnect(int lineno, const char *connection_name) if (!ecpg_init(con, connection_name, lineno)) { -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&connections_mutex); -#endif return false; } else ecpg_finish(con); } -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&connections_mutex); -#endif return true; } diff --git a/src/interfaces/ecpg/ecpglib/descriptor.c b/src/interfaces/ecpg/ecpglib/descriptor.c index 883a210a8129b..ad279e245c4ac 100644 --- a/src/interfaces/ecpg/ecpglib/descriptor.c +++ b/src/interfaces/ecpg/ecpglib/descriptor.c @@ -19,7 +19,6 @@ static void descriptor_free(struct descriptor *desc); /* We manage descriptors separately for each thread. */ -#ifdef ENABLE_THREAD_SAFETY static pthread_key_t descriptor_key; static pthread_once_t descriptor_once = PTHREAD_ONCE_INIT; @@ -49,12 +48,6 @@ set_descriptors(struct descriptor *value) { pthread_setspecific(descriptor_key, value); } -#else -static struct descriptor *all_descriptors = NULL; - -#define get_descriptors() (all_descriptors) -#define set_descriptors(value) do { all_descriptors = (value); } while(0) -#endif /* old internal convenience function that might go away later */ static PGresult * @@ -782,8 +775,6 @@ ECPGdeallocate_desc(int line, const char *name) return false; } -#ifdef ENABLE_THREAD_SAFETY - /* Deallocate all descriptors in the list */ static void descriptor_deallocate_all(struct descriptor *list) @@ -796,7 +787,6 @@ descriptor_deallocate_all(struct descriptor *list) list = next; } } -#endif /* ENABLE_THREAD_SAFETY */ bool ECPGallocate_desc(int line, const char *name) diff --git a/src/interfaces/ecpg/ecpglib/ecpglib_extern.h b/src/interfaces/ecpg/ecpglib/ecpglib_extern.h index 8b8f081f27ce8..01b4309a71049 100644 --- a/src/interfaces/ecpg/ecpglib/ecpglib_extern.h +++ b/src/interfaces/ecpg/ecpglib/ecpglib_extern.h @@ -169,9 +169,7 @@ bool ecpg_get_data(const PGresult *, int, int, int, enum ECPGttype type, enum ECPGttype, char *, char *, long, long, long, enum ARRAY_TYPE, enum COMPAT_MODE, bool); -#ifdef ENABLE_THREAD_SAFETY void ecpg_pthreads_init(void); -#endif struct connection *ecpg_get_connection(const char *connection_name); char *ecpg_alloc(long size, int lineno); char *ecpg_auto_alloc(long size, int lineno); diff --git a/src/interfaces/ecpg/ecpglib/execute.c b/src/interfaces/ecpg/ecpglib/execute.c index 93926fd4fb177..04d0b40c5376b 100644 --- a/src/interfaces/ecpg/ecpglib/execute.c +++ b/src/interfaces/ecpg/ecpglib/execute.c @@ -1961,9 +1961,7 @@ ecpg_do_prologue(int lineno, const int compat, const int force_indicator, return false; } -#ifdef ENABLE_THREAD_SAFETY ecpg_pthreads_init(); -#endif con = ecpg_get_connection(connection_name); diff --git a/src/interfaces/ecpg/ecpglib/memory.c b/src/interfaces/ecpg/ecpglib/memory.c index bd8125105495b..a83637ac75836 100644 --- a/src/interfaces/ecpg/ecpglib/memory.c +++ b/src/interfaces/ecpg/ecpglib/memory.c @@ -68,7 +68,6 @@ struct auto_mem struct auto_mem *next; }; -#ifdef ENABLE_THREAD_SAFETY static pthread_key_t auto_mem_key; static pthread_once_t auto_mem_once = PTHREAD_ONCE_INIT; @@ -97,12 +96,6 @@ set_auto_allocs(struct auto_mem *am) { pthread_setspecific(auto_mem_key, am); } -#else -static struct auto_mem *auto_allocs = NULL; - -#define get_auto_allocs() (auto_allocs) -#define set_auto_allocs(am) do { auto_allocs = (am); } while(0) -#endif char * ecpg_auto_alloc(long size, int lineno) diff --git a/src/interfaces/ecpg/ecpglib/meson.build b/src/interfaces/ecpg/ecpglib/meson.build index da8d304f54969..8e030a794336a 100644 --- a/src/interfaces/ecpg/ecpglib/meson.build +++ b/src/interfaces/ecpg/ecpglib/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group ecpglib_sources = files( 'connect.c', diff --git a/src/interfaces/ecpg/ecpglib/misc.c b/src/interfaces/ecpg/ecpglib/misc.c index 7f75e18733eeb..2ae989e3e5d82 100644 --- a/src/interfaces/ecpg/ecpglib/misc.c +++ b/src/interfaces/ecpg/ecpglib/misc.c @@ -55,43 +55,12 @@ static struct sqlca_t sqlca_init = } }; -#ifdef ENABLE_THREAD_SAFETY static pthread_key_t sqlca_key; static pthread_once_t sqlca_key_once = PTHREAD_ONCE_INIT; -#else -static struct sqlca_t sqlca = -{ - { - 'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' ' - }, - sizeof(struct sqlca_t), - 0, - { - 0, - { - 0 - } - }, - { - 'N', 'O', 'T', ' ', 'S', 'E', 'T', ' ' - }, - { - 0, 0, 0, 0, 0, 0 - }, - { - 0, 0, 0, 0, 0, 0, 0, 0 - }, - { - '0', '0', '0', '0', '0' - } -}; -#endif -#ifdef ENABLE_THREAD_SAFETY static pthread_mutex_t debug_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t debug_init_mutex = PTHREAD_MUTEX_INITIALIZER; -#endif -static int simple_debug = 0; +static volatile int simple_debug = 0; static FILE *debugstream = NULL; void @@ -123,7 +92,6 @@ ecpg_init(const struct connection *con, const char *connection_name, const int l return true; } -#ifdef ENABLE_THREAD_SAFETY static void ecpg_sqlca_key_destructor(void *arg) { @@ -135,12 +103,10 @@ ecpg_sqlca_key_init(void) { pthread_key_create(&sqlca_key, ecpg_sqlca_key_destructor); } -#endif struct sqlca_t * ECPGget_sqlca(void) { -#ifdef ENABLE_THREAD_SAFETY struct sqlca_t *sqlca; pthread_once(&sqlca_key_once, ecpg_sqlca_key_init); @@ -155,9 +121,6 @@ ECPGget_sqlca(void) pthread_setspecific(sqlca_key, sqlca); } return sqlca; -#else - return &sqlca; -#endif } bool @@ -240,9 +203,11 @@ ECPGtrans(int lineno, const char *connection_name, const char *transaction) void ECPGdebug(int n, FILE *dbgs) { -#ifdef ENABLE_THREAD_SAFETY + /* Interlock against concurrent executions of ECPGdebug() */ pthread_mutex_lock(&debug_init_mutex); -#endif + + /* Prevent ecpg_log() from printing while we change settings */ + pthread_mutex_lock(&debug_mutex); if (n > 100) { @@ -254,11 +219,13 @@ ECPGdebug(int n, FILE *dbgs) debugstream = dbgs; + /* We must release debug_mutex before invoking ecpg_log() ... */ + pthread_mutex_unlock(&debug_mutex); + + /* ... but keep holding debug_init_mutex to avoid racy printout */ ecpg_log("ECPGdebug: set to %d\n", simple_debug); -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&debug_init_mutex); -#endif } void @@ -270,6 +237,11 @@ ecpg_log(const char *format,...) int bufsize; char *fmt; + /* + * For performance reasons, inspect simple_debug without taking the mutex. + * This could be problematic if fetching an int isn't atomic, but we + * assume that it is in many other places too. + */ if (!simple_debug) return; @@ -290,26 +262,26 @@ ecpg_log(const char *format,...) else snprintf(fmt, bufsize, "[%d]: %s", (int) getpid(), intl_format); -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_lock(&debug_mutex); -#endif - - va_start(ap, format); - vfprintf(debugstream, fmt, ap); - va_end(ap); - /* dump out internal sqlca variables */ - if (ecpg_internal_regression_mode && sqlca != NULL) + /* Now that we hold the mutex, recheck simple_debug */ + if (simple_debug) { - fprintf(debugstream, "[NO_PID]: sqlca: code: %ld, state: %s\n", - sqlca->sqlcode, sqlca->sqlstate); - } + va_start(ap, format); + vfprintf(debugstream, fmt, ap); + va_end(ap); - fflush(debugstream); + /* dump out internal sqlca variables */ + if (ecpg_internal_regression_mode && sqlca != NULL) + { + fprintf(debugstream, "[NO_PID]: sqlca: code: %ld, state: %s\n", + sqlca->sqlcode, sqlca->sqlstate); + } + + fflush(debugstream); + } -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&debug_mutex); -#endif free(fmt); } @@ -451,19 +423,39 @@ ECPGis_noind_null(enum ECPGttype type, const void *ptr) } #ifdef WIN32 -#ifdef ENABLE_THREAD_SAFETY -void -win32_pthread_mutex(volatile pthread_mutex_t *mutex) +int +pthread_mutex_init(pthread_mutex_t *mp, void *attr) +{ + mp->initstate = 0; + return 0; +} + +int +pthread_mutex_lock(pthread_mutex_t *mp) { - if (mutex->handle == NULL) + /* Initialize the csection if not already done */ + if (mp->initstate != 1) { - while (InterlockedExchange((LONG *) &mutex->initlock, 1) == 1) - Sleep(0); - if (mutex->handle == NULL) - mutex->handle = CreateMutex(NULL, FALSE, NULL); - InterlockedExchange((LONG *) &mutex->initlock, 0); + LONG istate; + + while ((istate = InterlockedExchange(&mp->initstate, 2)) == 2) + Sleep(0); /* wait, another thread is doing this */ + if (istate != 1) + InitializeCriticalSection(&mp->csection); + InterlockedExchange(&mp->initstate, 1); } + EnterCriticalSection(&mp->csection); + return 0; +} + +int +pthread_mutex_unlock(pthread_mutex_t *mp) +{ + if (mp->initstate != 1) + return EINVAL; + LeaveCriticalSection(&mp->csection); + return 0; } static pthread_mutex_t win32_pthread_once_lock = PTHREAD_MUTEX_INITIALIZER; @@ -482,7 +474,6 @@ win32_pthread_once(volatile pthread_once_t *once, void (*fn) (void)) pthread_mutex_unlock(&win32_pthread_once_lock); } } -#endif /* ENABLE_THREAD_SAFETY */ #endif /* WIN32 */ #ifdef ENABLE_NLS @@ -491,13 +482,14 @@ char * ecpg_gettext(const char *msgid) { /* - * If multiple threads come through here at about the same time, it's okay - * for more than one of them to call bindtextdomain(). But it's not okay - * for any of them to reach dgettext() before bindtextdomain() is - * complete, so don't set the flag till that's done. Use "volatile" just - * to be sure the compiler doesn't try to get cute. + * At least on Windows, there are gettext implementations that fail if + * multiple threads call bindtextdomain() concurrently. Use a mutex and + * flag variable to ensure that we call it just once per process. It is + * not known that similar bugs exist on non-Windows platforms, but we + * might as well do it the same way everywhere. */ static volatile bool already_bound = false; + static pthread_mutex_t binddomain_mutex = PTHREAD_MUTEX_INITIALIZER; if (!already_bound) { @@ -507,14 +499,26 @@ ecpg_gettext(const char *msgid) #else int save_errno = errno; #endif - const char *ldir; - - /* No relocatable lookup here because the binary could be anywhere */ - ldir = getenv("PGLOCALEDIR"); - if (!ldir) - ldir = LOCALEDIR; - bindtextdomain(PG_TEXTDOMAIN("ecpglib"), ldir); - already_bound = true; + + (void) pthread_mutex_lock(&binddomain_mutex); + + if (!already_bound) + { + const char *ldir; + + /* + * No relocatable lookup here because the calling executable could + * be anywhere + */ + ldir = getenv("PGLOCALEDIR"); + if (!ldir) + ldir = LOCALEDIR; + bindtextdomain(PG_TEXTDOMAIN("ecpglib"), ldir); + already_bound = true; + } + + (void) pthread_mutex_unlock(&binddomain_mutex); + #ifdef WIN32 SetLastError(save_errno); #else diff --git a/src/interfaces/ecpg/ecpglib/po/LINGUAS b/src/interfaces/ecpg/ecpglib/po/LINGUAS index 312956920df20..4cc8bed767c42 100644 --- a/src/interfaces/ecpg/ecpglib/po/LINGUAS +++ b/src/interfaces/ecpg/ecpglib/po/LINGUAS @@ -1 +1 @@ -cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN +cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN zh_TW diff --git a/src/interfaces/ecpg/ecpglib/po/es.po b/src/interfaces/ecpg/ecpglib/po/es.po index 8dec975e62ef0..0a957e220c5ab 100644 --- a/src/interfaces/ecpg/ecpglib/po/es.po +++ b/src/interfaces/ecpg/ecpglib/po/es.po @@ -7,10 +7,10 @@ # msgid "" msgstr "" -"Project-Id-Version: ecpglib (PostgreSQL) 16\n" +"Project-Id-Version: ecpglib (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:09+0000\n" -"PO-Revision-Date: 2023-05-22 12:04+0200\n" +"POT-Creation-Date: 2025-02-16 19:40+0000\n" +"PO-Revision-Date: 2024-11-16 14:23+0100\n" "Last-Translator: Emanuel Calvo Franco \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -18,15 +18,15 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: connect.c:243 +#: connect.c:221 msgid "empty message text" msgstr "mensaje de texto vacío" -#: connect.c:410 connect.c:675 +#: connect.c:386 connect.c:645 msgid "" msgstr "" -#: descriptor.c:876 misc.c:119 +#: descriptor.c:866 misc.c:88 msgid "NULL" msgstr "NULL" @@ -195,6 +195,6 @@ msgstr "se ha perdido la conexión al servidor" msgid "SQL error: %s\n" msgstr "error SQL: %s\n" -#: execute.c:2188 execute.c:2195 +#: execute.c:2186 execute.c:2193 msgid "" msgstr "" diff --git a/src/interfaces/ecpg/ecpglib/po/fr.po b/src/interfaces/ecpg/ecpglib/po/fr.po index e976d5cb0ef7f..8bdd59b1f2ebd 100644 --- a/src/interfaces/ecpg/ecpglib/po/fr.po +++ b/src/interfaces/ecpg/ecpglib/po/fr.po @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-04-12 05:16+0000\n" -"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" #: connect.c:237 msgid "empty message text" @@ -74,7 +74,7 @@ msgstr "syntaxe invalide en entrée pour le type int : « %s » sur la ligne %d" #: error.c:75 #, c-format msgid "invalid input syntax for type unsigned int: \"%s\", on line %d" -msgstr "syntaxe invalide en entrée pour le type unisgned int : « %s » sur la ligne %d" +msgstr "syntaxe invalide en entrée pour le type unsigned int : « %s » sur la ligne %d" #. translator: this string will be truncated at 149 characters expanded. #: error.c:82 diff --git a/src/interfaces/ecpg/ecpglib/po/ja.po b/src/interfaces/ecpg/ecpglib/po/ja.po index 000f4e19781d4..a8cea1069fc40 100644 --- a/src/interfaces/ecpg/ecpglib/po/ja.po +++ b/src/interfaces/ecpg/ecpglib/po/ja.po @@ -1,10 +1,10 @@ # Japanese message translation file for ecpglib -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: ecpglib (PostgreSQL 16)\n" +"Project-Id-Version: ecpglib (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-07-14 10:48+0900\n" "PO-Revision-Date: 2019-06-11 09:04+0900\n" diff --git a/src/interfaces/ecpg/ecpglib/po/meson.build b/src/interfaces/ecpg/ecpglib/po/meson.build index 39fcc93bfcc42..8d6c0e69a0497 100644 --- a/src/interfaces/ecpg/ecpglib/po/meson.build +++ b/src/interfaces/ecpg/ecpglib/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('ecpglib' + '6' + '-' + pg_version_major.to_string())] diff --git a/src/interfaces/ecpg/ecpglib/po/ru.po b/src/interfaces/ecpg/ecpglib/po/ru.po index 2a1f9ae8367c2..91b23dbc9fc07 100644 --- a/src/interfaces/ecpg/ecpglib/po/ru.po +++ b/src/interfaces/ecpg/ecpglib/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: ecpglib (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-27 14:52+0300\n" +"POT-Creation-Date: 2024-09-02 09:29+0300\n" "PO-Revision-Date: 2019-09-09 13:30+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -14,18 +14,18 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: connect.c:243 +#: connect.c:221 msgid "empty message text" msgstr "пуÑтое Ñообщение" -#: connect.c:410 connect.c:675 +#: connect.c:386 connect.c:645 msgid "" msgstr "<ПО_УМОЛЧÐÐИЮ>" -#: descriptor.c:876 misc.c:119 +#: descriptor.c:866 misc.c:88 msgid "NULL" msgstr "NULL" @@ -196,7 +196,7 @@ msgstr "подключение к Ñерверу потерÑно" msgid "SQL error: %s\n" msgstr "ошибка SQL: %s\n" -#: execute.c:2189 execute.c:2196 +#: execute.c:2186 execute.c:2193 msgid "" msgstr "<>" diff --git a/src/interfaces/ecpg/ecpglib/po/sv.po b/src/interfaces/ecpg/ecpglib/po/sv.po index 7ccde101caf21..9e499cc68d36d 100644 --- a/src/interfaces/ecpg/ecpglib/po/sv.po +++ b/src/interfaces/ecpg/ecpglib/po/sv.po @@ -1,14 +1,14 @@ # SWEDISH message translation file for ecpglib # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020, 2021. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-10 02:39+0000\n" -"PO-Revision-Date: 2021-11-07 10:36+0100\n" +"POT-Creation-Date: 2024-07-12 11:10+0000\n" +"PO-Revision-Date: 2024-07-12 15:08+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,15 +17,15 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: connect.c:237 +#: connect.c:221 msgid "empty message text" msgstr "tom meddelandetext" -#: connect.c:401 connect.c:430 connect.c:653 +#: connect.c:386 connect.c:645 msgid "" msgstr "" -#: descriptor.c:871 misc.c:119 +#: descriptor.c:866 misc.c:88 msgid "NULL" msgstr "NULL" @@ -185,15 +185,15 @@ msgstr "kunde inte ansluta till databas \"%s\" pÃ¥ rad %d" msgid "SQL error %d on line %d" msgstr "SQL-fel %d pÃ¥ rad %d" -#: error.c:254 +#: error.c:253 msgid "the connection to the server was lost" msgstr "anslutningen till servern tappades" -#: error.c:347 +#: error.c:345 #, c-format msgid "SQL error: %s\n" msgstr "SQL-fel: %s\n" -#: execute.c:2196 execute.c:2203 +#: execute.c:2186 execute.c:2193 msgid "" msgstr "" diff --git a/src/interfaces/ecpg/ecpglib/po/uk.po b/src/interfaces/ecpg/ecpglib/po/uk.po index dcb1738702c9b..e1ca3efd440b7 100644 --- a/src/interfaces/ecpg/ecpglib/po/uk.po +++ b/src/interfaces/ecpg/ecpglib/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:39+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-02-24 00:09+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,18 +14,18 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/ecpglib.pot\n" -"X-Crowdin-File-ID: 890\n" +"X-Crowdin-File: /REL_17_STABLE/ecpglib.pot\n" +"X-Crowdin-File-ID: 1022\n" -#: connect.c:243 +#: connect.c:221 msgid "empty message text" msgstr "пуÑте повідомленнÑ" -#: connect.c:410 connect.c:675 +#: connect.c:386 connect.c:645 msgid "" msgstr "<ЗÐ_ЗÐМОВЧУВÐÐÐЯМ>" -#: descriptor.c:876 misc.c:119 +#: descriptor.c:866 misc.c:88 msgid "NULL" msgstr "NULL" @@ -194,7 +194,7 @@ msgstr "з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· Ñервером втрачено" msgid "SQL error: %s\n" msgstr "помилка SQL: %s\n" -#: execute.c:2189 execute.c:2196 +#: execute.c:2186 execute.c:2193 msgid "" msgstr "<пуÑто>" diff --git a/src/interfaces/ecpg/ecpglib/po/zh_TW.po b/src/interfaces/ecpg/ecpglib/po/zh_TW.po new file mode 100644 index 0000000000000..478fe926eb8bf --- /dev/null +++ b/src/interfaces/ecpg/ecpglib/po/zh_TW.po @@ -0,0 +1,199 @@ +# Traditional Chinese message translation file for ecpglib +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the ecpglib (PostgreSQL) package. +# 2023-09-06 Zhenbang Wei +# +msgid "" +msgstr "" +"Project-Id-Version: ecpglib (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-05 20:39+0000\n" +"PO-Revision-Date: 2023-11-06 08:48+0800\n" +"Last-Translator: Zhenbang Wei \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.4.1\n" + +#: connect.c:243 +msgid "empty message text" +msgstr "空白的訊æ¯å…§å®¹" + +#: connect.c:410 connect.c:675 +msgid "" +msgstr "" + +#: descriptor.c:876 misc.c:119 +msgid "NULL" +msgstr "NULL" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:33 +#, c-format +msgid "no data found on line %d" +msgstr "第 %d 行找ä¸åˆ°è³‡æ–™" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:40 +#, c-format +msgid "out of memory on line %d" +msgstr "第 %d 行記憶體ä¸è¶³" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:47 +#, c-format +msgid "unsupported type \"%s\" on line %d" +msgstr "第 %2$d è¡Œæœ‰ä¸æ”¯æ´çš„類型 \"%1$s\"" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:54 +#, c-format +msgid "too many arguments on line %d" +msgstr "第 %d è¡Œåƒæ•¸éŽå¤š" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:61 +#, c-format +msgid "too few arguments on line %d" +msgstr "第 %d è¡Œåƒæ•¸éŽå°‘" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:68 +#, c-format +msgid "invalid input syntax for type int: \"%s\", on line %d" +msgstr "第 %2$d 行無效的 int 類型輸入語法: \"%1$s\"" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:75 +#, c-format +msgid "invalid input syntax for type unsigned int: \"%s\", on line %d" +msgstr "第 %2$d 行無效的 unsigned int 類型輸入語法: \" %1$s\"" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:82 +#, c-format +msgid "invalid input syntax for floating-point type: \"%s\", on line %d" +msgstr "第 %2$d 行無效的浮點數類型輸入語法: \"%1$s\"" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:90 +#, c-format +msgid "invalid syntax for type boolean: \"%s\", on line %d" +msgstr "第 %2$d 行無效的布林語法: \"%1$s\"" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:95 +#, c-format +msgid "could not convert boolean value: size mismatch, on line %d" +msgstr "第 %d 行無法轉æ›å¸ƒæž—值: 大å°ä¸ä¸€è‡´" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:102 +#, c-format +msgid "empty query on line %d" +msgstr "第 %d 行的查詢為空" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:109 +#, c-format +msgid "null value without indicator on line %d" +msgstr "第 %d 行沒有指示符號的空值" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:116 +#, c-format +msgid "variable does not have an array type on line %d" +msgstr "第 %d 行變數並éžé™£åˆ—類型" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:123 +#, c-format +msgid "data read from server is not an array on line %d" +msgstr "第 %d 行從伺æœå™¨è®€å–的資料並éžé™£åˆ—" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:130 +#, c-format +msgid "inserting an array of variables is not supported on line %d" +msgstr "第 %d è¡Œä¸æ”¯æ´æ’入變數陣列" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:137 +#, c-format +msgid "connection \"%s\" does not exist on line %d" +msgstr "第 %2$d 行連線 \"%1$s\" ä¸å­˜åœ¨" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:144 +#, c-format +msgid "not connected to connection \"%s\" on line %d" +msgstr "第 %2$d 行未連接至連線 \"%1$s\"" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:151 +#, c-format +msgid "invalid statement name \"%s\" on line %d" +msgstr "第 %2$d 行無效的陳述å稱 \"%1$s\"" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:158 +#, c-format +msgid "descriptor \"%s\" not found on line %d" +msgstr "第 %2$d 行找ä¸åˆ°æè¿°ç¬¦ \"%1$s\"" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:165 +#, c-format +msgid "descriptor index out of range on line %d" +msgstr "第 %d 行æè¿°ç¬¦ç´¢å¼•超出範åœ" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:172 +#, c-format +msgid "unrecognized descriptor item \"%s\" on line %d" +msgstr "第 %2$d 行無法識別的æè¿°ç¬¦ \"%1$s\"" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:179 +#, c-format +msgid "variable does not have a numeric type on line %d" +msgstr "第 %d è¡Œè®Šæ•¸ä¸¦éžæ•¸å€¼é¡žåž‹" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:186 +#, c-format +msgid "variable does not have a character type on line %d" +msgstr "第 %d 行變數並éžå­—符類型" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:193 +#, c-format +msgid "error in transaction processing on line %d" +msgstr "第 %d 行交易處ç†ä¸­ç™¼ç”ŸéŒ¯èª¤" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:200 +#, c-format +msgid "could not connect to database \"%s\" on line %d" +msgstr "第 %2$d 行無法連線至資料庫 \"%1$s\"" + +#. translator: this string will be truncated at 149 characters expanded. +#: error.c:207 +#, c-format +msgid "SQL error %d on line %d" +msgstr "第 %2$d 行 SQL 錯誤 %1$d" + +#: error.c:253 +msgid "the connection to the server was lost" +msgstr "與伺æœå™¨çš„連線已中斷" + +#: error.c:345 +#, c-format +msgid "SQL error: %s\n" +msgstr "SQL 錯誤: %s\n" + +#: execute.c:2188 execute.c:2195 +msgid "" +msgstr "" diff --git a/src/interfaces/ecpg/include/Makefile b/src/interfaces/ecpg/include/Makefile index 9c68bf3c4770c..3476409cefb97 100644 --- a/src/interfaces/ecpg/include/Makefile +++ b/src/interfaces/ecpg/include/Makefile @@ -31,5 +31,5 @@ uninstall: rm -f $(addprefix '$(DESTDIR)$(informix_esql_dir)'/, $(informix_headers)) rm -f '$(DESTDIR)$(includedir)'/$(notdir $(ecpg_config_h)) -distclean maintainer-clean: +distclean: rm -f ecpg_config.h stamp-h diff --git a/src/interfaces/ecpg/include/ecpg-pthread-win32.h b/src/interfaces/ecpg/include/ecpg-pthread-win32.h index 33c897b633c57..7b6ba46b349b9 100644 --- a/src/interfaces/ecpg/include/ecpg-pthread-win32.h +++ b/src/interfaces/ecpg/include/ecpg-pthread-win32.h @@ -5,8 +5,6 @@ #ifndef _ECPG_PTHREAD_WIN32_H #define _ECPG_PTHREAD_WIN32_H -#ifdef ENABLE_THREAD_SAFETY - #ifndef WIN32 #include @@ -14,28 +12,22 @@ typedef struct pthread_mutex_t { - HANDLE handle; - LONG initlock; + /* initstate = 0: not initialized; 1: init done; 2: init in progress */ + LONG initstate; + CRITICAL_SECTION csection; } pthread_mutex_t; typedef DWORD pthread_key_t; typedef bool pthread_once_t; -#define PTHREAD_MUTEX_INITIALIZER { NULL, 0 } +#define PTHREAD_MUTEX_INITIALIZER { 0 } #define PTHREAD_ONCE_INIT false -void win32_pthread_mutex(volatile pthread_mutex_t *mutex); -void win32_pthread_once(volatile pthread_once_t *once, void (*fn) (void)); - -#define pthread_mutex_lock(mutex) \ - do { \ - if ((mutex)->handle == NULL) \ - win32_pthread_mutex((mutex)); \ - WaitForSingleObject((mutex)->handle, INFINITE); \ - } while(0) +int pthread_mutex_init(pthread_mutex_t *, void *attr); +int pthread_mutex_lock(pthread_mutex_t *); +int pthread_mutex_unlock(pthread_mutex_t *); -#define pthread_mutex_unlock(mutex) \ - ReleaseMutex((mutex)->handle) +void win32_pthread_once(volatile pthread_once_t *once, void (*fn) (void)); #define pthread_getspecific(key) \ TlsGetValue((key)) @@ -53,6 +45,5 @@ void win32_pthread_once(volatile pthread_once_t *once, void (*fn) (void)); win32_pthread_once((once), (fn)); \ } while(0) #endif /* WIN32 */ -#endif /* ENABLE_THREAD_SAFETY */ #endif /* _ECPG_PTHREAD_WIN32_H */ diff --git a/src/interfaces/ecpg/include/ecpg_config.h.in b/src/interfaces/ecpg/include/ecpg_config.h.in index cbd24f11a01b6..824617b917528 100644 --- a/src/interfaces/ecpg/include/ecpg_config.h.in +++ b/src/interfaces/ecpg/include/ecpg_config.h.in @@ -1,6 +1,5 @@ -/* Define to 1 to build client libraries as thread-safe code. - * (--enable-thread-safety) */ -#undef ENABLE_THREAD_SAFETY +/* Define to 1 to build client libraries as thread-safe code. */ +#define ENABLE_THREAD_SAFETY 1 /* Define to 1 if the system has the type `int64'. */ #undef HAVE_INT64 @@ -8,9 +7,6 @@ /* Define to 1 if `long int' works and is 64 bits. */ #undef HAVE_LONG_INT_64 -/* Define to 1 if the system has the type `long long int'. */ -#define HAVE_LONG_LONG_INT 1 - /* Define to 1 if `long long int' works and is 64 bits. */ #undef HAVE_LONG_LONG_INT_64 diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.h index 21a213448306c..771761ffe4969 100644 --- a/src/interfaces/ecpg/include/ecpglib.h +++ b/src/interfaces/ecpg/include/ecpglib.h @@ -98,9 +98,7 @@ void *ECPGget_var(int number); /* dynamic result allocation */ void ECPGfree_auto_mem(void); -#ifdef ENABLE_THREAD_SAFETY void ecpg_pthreads_init(void); -#endif #ifdef __cplusplus } diff --git a/src/interfaces/ecpg/include/meson.build b/src/interfaces/ecpg/include/meson.build index 2278f0d3055ba..31610fef58929 100644 --- a/src/interfaces/ecpg/include/meson.build +++ b/src/interfaces/ecpg/include/meson.build @@ -1,9 +1,8 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group ecpg_inc = include_directories('.') ecpg_conf_keys = [ - 'ENABLE_THREAD_SAFETY', 'HAVE_INT64', 'HAVE_LONG_INT_64', 'HAVE_LONG_LONG_INT_64', @@ -12,6 +11,8 @@ ecpg_conf_keys = [ ecpg_conf_data = configuration_data() +ecpg_conf_data.set('ENABLE_THREAD_SAFETY', 1) + foreach key : ecpg_conf_keys if cdata.has(key) ecpg_conf_data.set(key, cdata.get(key)) diff --git a/src/interfaces/ecpg/meson.build b/src/interfaces/ecpg/meson.build index 57e3656c1c29a..ac42a70a31f8d 100644 --- a/src/interfaces/ecpg/meson.build +++ b/src/interfaces/ecpg/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group ecpg_targets = [] diff --git a/src/interfaces/ecpg/pgtypeslib/Makefile b/src/interfaces/ecpg/pgtypeslib/Makefile index b0e154eb15f2a..a10b0b584bc91 100644 --- a/src/interfaces/ecpg/pgtypeslib/Makefile +++ b/src/interfaces/ecpg/pgtypeslib/Makefile @@ -2,7 +2,7 @@ # # Makefile for ecpg pgtypes library # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/interfaces/ecpg/pgtypeslib/Makefile @@ -50,5 +50,3 @@ uninstall: uninstall-lib clean distclean: clean-lib rm -f $(OBJS) - -maintainer-clean: distclean diff --git a/src/interfaces/ecpg/pgtypeslib/dt_common.c b/src/interfaces/ecpg/pgtypeslib/dt_common.c index 99bdc94d6d73b..f0889dddaf95a 100644 --- a/src/interfaces/ecpg/pgtypeslib/dt_common.c +++ b/src/interfaces/ecpg/pgtypeslib/dt_common.c @@ -2325,10 +2325,10 @@ DecodeDateTime(char **field, int *ftype, int nf, return ((fmask & DTK_TIME_M) == DTK_TIME_M) ? 1 : -1; /* - * check for valid day of month, now that we know for sure the month - * and year... + * check for valid day of month and month, now that we know for sure + * the month and year... */ - if (tm->tm_mday < 1 || tm->tm_mday > day_tab[isleap(tm->tm_year)][tm->tm_mon - 1]) + if (tm->tm_mon < 1 || tm->tm_mday < 1 || tm->tm_mday > day_tab[isleap(tm->tm_year)][tm->tm_mon - 1]) return -1; /* @@ -2659,6 +2659,8 @@ PGTYPEStimestamp_defmt_scan(char **str, char *fmt, timestamp * d, */ pfmt++; tmp = pgtypes_alloc(strlen("%m/%d/%y") + strlen(pstr) + 1); + if (!tmp) + return 1; strcpy(tmp, "%m/%d/%y"); strcat(tmp, pfmt); err = PGTYPEStimestamp_defmt_scan(&pstr, tmp, d, year, month, day, hour, minute, second, tz); @@ -2784,6 +2786,8 @@ PGTYPEStimestamp_defmt_scan(char **str, char *fmt, timestamp * d, case 'r': pfmt++; tmp = pgtypes_alloc(strlen("%I:%M:%S %p") + strlen(pstr) + 1); + if (!tmp) + return 1; strcpy(tmp, "%I:%M:%S %p"); strcat(tmp, pfmt); err = PGTYPEStimestamp_defmt_scan(&pstr, tmp, d, year, month, day, hour, minute, second, tz); @@ -2792,6 +2796,8 @@ PGTYPEStimestamp_defmt_scan(char **str, char *fmt, timestamp * d, case 'R': pfmt++; tmp = pgtypes_alloc(strlen("%H:%M") + strlen(pstr) + 1); + if (!tmp) + return 1; strcpy(tmp, "%H:%M"); strcat(tmp, pfmt); err = PGTYPEStimestamp_defmt_scan(&pstr, tmp, d, year, month, day, hour, minute, second, tz); @@ -2837,6 +2843,8 @@ PGTYPEStimestamp_defmt_scan(char **str, char *fmt, timestamp * d, case 'T': pfmt++; tmp = pgtypes_alloc(strlen("%H:%M:%S") + strlen(pstr) + 1); + if (!tmp) + return 1; strcpy(tmp, "%H:%M:%S"); strcat(tmp, pfmt); err = PGTYPEStimestamp_defmt_scan(&pstr, tmp, d, year, month, day, hour, minute, second, tz); diff --git a/src/interfaces/ecpg/pgtypeslib/meson.build b/src/interfaces/ecpg/pgtypeslib/meson.build index f177dd35a9c66..04a1ba379278d 100644 --- a/src/interfaces/ecpg/pgtypeslib/meson.build +++ b/src/interfaces/ecpg/pgtypeslib/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group ecpg_pgtypes_sources = files( 'common.c', diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile index 77ae9ab722e84..934b7cef1b0f5 100644 --- a/src/interfaces/ecpg/preproc/Makefile +++ b/src/interfaces/ecpg/preproc/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/interfaces/ecpg/preproc # -# Copyright (c) 1998-2023, PostgreSQL Global Development Group +# Copyright (c) 1998-2024, PostgreSQL Global Development Group # # src/interfaces/ecpg/preproc/Makefile # @@ -81,8 +81,6 @@ ecpg_keywords.o: ecpg_kwlist_d.h c_keywords.o: c_kwlist_d.h keywords.o: $(top_srcdir)/src/include/parser/kwlist.h -distprep: preproc.y preproc.c preproc.h pgc.c c_kwlist_d.h ecpg_kwlist_d.h - install: all installdirs $(INSTALL_PROGRAM) ecpg$(X) '$(DESTDIR)$(bindir)' @@ -92,11 +90,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/ecpg$(X)' -# preproc.y, preproc.c, preproc.h, pgc.c, c_kwlist_d.h, and ecpg_kwlist_d.h -# are in the distribution tarball, so they are not cleaned here. clean distclean: rm -f *.o ecpg$(X) rm -f typename.c - -maintainer-clean: distclean rm -f preproc.y preproc.c preproc.h pgc.c c_kwlist_d.h ecpg_kwlist_d.h diff --git a/src/interfaces/ecpg/preproc/c_kwlist.h b/src/interfaces/ecpg/preproc/c_kwlist.h index 6a0fa68203e7a..701de8e2b19c0 100644 --- a/src/interfaces/ecpg/preproc/c_kwlist.h +++ b/src/interfaces/ecpg/preproc/c_kwlist.h @@ -7,7 +7,7 @@ * by the PG_KEYWORD macro, which is not defined in this file; it can * be defined by the caller for special purposes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/interfaces/ecpg/preproc/c_kwlist.h diff --git a/src/interfaces/ecpg/preproc/check_rules.pl b/src/interfaces/ecpg/preproc/check_rules.pl index 5e823fa30e09a..1ee1aed2f67c9 100644 --- a/src/interfaces/ecpg/preproc/check_rules.pl +++ b/src/interfaces/ecpg/preproc/check_rules.pl @@ -3,7 +3,7 @@ # test parser generator for ecpg # call with backend grammar as stdin # -# Copyright (c) 2009-2023, PostgreSQL Global Development Group +# Copyright (c) 2009-2024, PostgreSQL Global Development Group # # Written by Michael Meskes # Andy Colson @@ -17,7 +17,7 @@ # Then it checks to make sure each rule in ecpg.addons was found in gram.y use strict; -use warnings; +use warnings FATAL => 'all'; use Getopt::Long; my $srcdir = '.'; diff --git a/src/interfaces/ecpg/preproc/ecpg.addons b/src/interfaces/ecpg/preproc/ecpg.addons index e94da2a3f8d4c..50601554763d4 100644 --- a/src/interfaces/ecpg/preproc/ecpg.addons +++ b/src/interfaces/ecpg/preproc/ecpg.addons @@ -248,7 +248,7 @@ ECPG: where_or_current_clauseWHERECURRENT_POFcursor_name block $$ = cat_str(2,mm_strdup("where current of"), cursor_marker); } ECPG: CopyStmtCOPYopt_binaryqualified_nameopt_column_listcopy_fromopt_programcopy_file_namecopy_delimiteropt_withcopy_optionswhere_clause addon - if (strcmp($6, "from") == 0 && + if (strcmp($5, "from") == 0 && (strcmp($7, "stdin") == 0 || strcmp($7, "stdout") == 0)) mmerror(PARSE_ERROR, ET_WARNING, "COPY FROM STDIN is not implemented"); ECPG: var_valueNumericOnly addon diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c index 16cfc49e5e3d6..73c37631acc6e 100644 --- a/src/interfaces/ecpg/preproc/ecpg.c +++ b/src/interfaces/ecpg/preproc/ecpg.c @@ -1,7 +1,7 @@ /* src/interfaces/ecpg/preproc/ecpg.c */ /* Main for ecpg, the PostgreSQL embedded SQL precompiler. */ -/* Copyright (c) 1996-2023, PostgreSQL Global Development Group */ +/* Copyright (c) 1996-2024, PostgreSQL Global Development Group */ #include "postgres_fe.h" @@ -82,35 +82,46 @@ add_include_path(char *path) } } +/* + * Process a command line -D switch + */ static void add_preprocessor_define(char *define) { - struct _defines *pd = defines; - char *ptr, - *define_copy = mm_strdup(define); + /* copy the argument to avoid relying on argv storage */ + char *define_copy = mm_strdup(define); + char *ptr; + struct _defines *newdef; - defines = mm_alloc(sizeof(struct _defines)); + newdef = mm_alloc(sizeof(struct _defines)); /* look for = sign */ ptr = strchr(define_copy, '='); if (ptr != NULL) { + /* symbol has a value */ char *tmp; - /* symbol has a value */ - for (tmp = ptr - 1; *tmp == ' '; tmp--); + /* strip any spaces between name and '=' */ + for (tmp = ptr - 1; tmp >= define_copy && *tmp == ' '; tmp--); tmp[1] = '\0'; - defines->olddef = define_copy; - defines->newdef = ptr + 1; + + /* + * Note we don't bother to separately malloc cmdvalue; it will never + * be freed so that's not necessary. + */ + newdef->cmdvalue = ptr + 1; } else { - defines->olddef = define_copy; - defines->newdef = mm_strdup("1"); + /* define it as "1"; again no need to malloc it */ + newdef->cmdvalue = "1"; } - defines->pertinent = true; - defines->used = NULL; - defines->next = pd; + newdef->name = define_copy; + newdef->value = mm_strdup(newdef->cmdvalue); + newdef->used = NULL; + newdef->next = defines; + defines = newdef; } #define ECPG_GETOPT_LONG_REGRESSION 1 @@ -216,8 +227,8 @@ main(int argc, char *const argv[]) if (base_yyout == NULL) { - fprintf(stderr, _("%s: could not open file \"%s\": %s\n"), - progname, output_filename, strerror(errno)); + fprintf(stderr, _("%s: could not open file \"%s\": %m\n"), + progname, output_filename); output_filename = NULL; } else @@ -331,8 +342,8 @@ main(int argc, char *const argv[]) base_yyout = fopen(output_filename, PG_BINARY_W); if (base_yyout == NULL) { - fprintf(stderr, _("%s: could not open file \"%s\": %s\n"), - progname, output_filename, strerror(errno)); + fprintf(stderr, _("%s: could not open file \"%s\": %m\n"), + progname, output_filename); free(output_filename); output_filename = NULL; free(input_filename); @@ -342,12 +353,14 @@ main(int argc, char *const argv[]) } if (base_yyin == NULL) - fprintf(stderr, _("%s: could not open file \"%s\": %s\n"), - progname, argv[fnr], strerror(errno)); + fprintf(stderr, _("%s: could not open file \"%s\": %m\n"), + progname, argv[fnr]); else { struct cursor *ptr; struct _defines *defptr; + struct _defines *prevdefptr; + struct _defines *nextdefptr; struct typedefs *typeptr; struct declared_list *list; @@ -385,28 +398,28 @@ main(int argc, char *const argv[]) free(this); } - /* remove non-pertinent old defines as well */ - while (defines && !defines->pertinent) + /* restore defines to their command-line state */ + prevdefptr = NULL; + for (defptr = defines; defptr != NULL; defptr = nextdefptr) { - defptr = defines; - defines = defines->next; - - free(defptr->newdef); - free(defptr->olddef); - free(defptr); - } - - for (defptr = defines; defptr != NULL; defptr = defptr->next) - { - struct _defines *this = defptr->next; - - if (this && !this->pertinent) + nextdefptr = defptr->next; + if (defptr->cmdvalue != NULL) { - defptr->next = this->next; - - free(this->newdef); - free(this->olddef); - free(this); + /* keep it, resetting the value */ + free(defptr->value); + defptr->value = mm_strdup(defptr->cmdvalue); + prevdefptr = defptr; + } + else + { + /* remove it */ + if (prevdefptr != NULL) + prevdefptr->next = nextdefptr; + else + defines = nextdefptr; + free(defptr->name); + free(defptr->value); + free(defptr); } } diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer index 435c139ec2658..b2aa44f36ddc3 100644 --- a/src/interfaces/ecpg/preproc/ecpg.trailer +++ b/src/interfaces/ecpg/preproc/ecpg.trailer @@ -651,6 +651,34 @@ var_type: simple_type $$.type_index = mm_strdup("-1"); $$.type_sizeof = NULL; } + | STRING_P + { + if (INFORMIX_MODE) + { + /* In Informix mode, "string" is automatically a typedef */ + $$.type_enum = ECPGt_string; + $$.type_str = mm_strdup("char"); + $$.type_dimension = mm_strdup("-1"); + $$.type_index = mm_strdup("-1"); + $$.type_sizeof = NULL; + } + else + { + /* Otherwise, legal only if user typedef'ed it */ + struct typedefs *this = get_typedef("string", false); + + $$.type_str = (this->type->type_enum == ECPGt_varchar || this->type->type_enum == ECPGt_bytea) ? EMPTY : mm_strdup(this->name); + $$.type_enum = this->type->type_enum; + $$.type_dimension = this->type->type_dimension; + $$.type_index = this->type->type_index; + if (this->type->type_sizeof && strlen(this->type->type_sizeof) != 0) + $$.type_sizeof = this->type->type_sizeof; + else + $$.type_sizeof = cat_str(3, mm_strdup("sizeof("), mm_strdup(this->name), mm_strdup(")")); + + struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list); + } + } | INTERVAL ecpg_interval { $$.type_enum = ECPGt_interval; diff --git a/src/interfaces/ecpg/preproc/ecpg_kwlist.h b/src/interfaces/ecpg/preproc/ecpg_kwlist.h index 42b3f1f115fb4..7244fbab1b33a 100644 --- a/src/interfaces/ecpg/preproc/ecpg_kwlist.h +++ b/src/interfaces/ecpg/preproc/ecpg_kwlist.h @@ -7,7 +7,7 @@ * by the PG_KEYWORD macro, which is not defined in this file; it can * be defined by the caller for special purposes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/interfaces/ecpg/preproc/ecpg_kwlist.h diff --git a/src/interfaces/ecpg/preproc/keywords.c b/src/interfaces/ecpg/preproc/keywords.c index e7956ab3f4837..bdaa454e4a7a9 100644 --- a/src/interfaces/ecpg/preproc/keywords.c +++ b/src/interfaces/ecpg/preproc/keywords.c @@ -4,7 +4,7 @@ * lexical token lookup for key words in PostgreSQL * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/interfaces/ecpg/preproc/meson.build b/src/interfaces/ecpg/preproc/meson.build index eef8f1864feef..ddd7a66547f54 100644 --- a/src/interfaces/ecpg/preproc/meson.build +++ b/src/interfaces/ecpg/preproc/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group ecpg_sources = files( '../ecpglib/typename.c', diff --git a/src/interfaces/ecpg/preproc/parse.pl b/src/interfaces/ecpg/preproc/parse.pl index 7574fc31106f7..fe8d3e5178058 100644 --- a/src/interfaces/ecpg/preproc/parse.pl +++ b/src/interfaces/ecpg/preproc/parse.pl @@ -3,7 +3,7 @@ # parser generator for ecpg version 2 # call with backend parser as stdin # -# Copyright (c) 2007-2023, PostgreSQL Global Development Group +# Copyright (c) 2007-2024, PostgreSQL Global Development Group # # Written by Mike Aubury # Michael Meskes @@ -13,7 +13,7 @@ # use strict; -use warnings; +use warnings FATAL => 'all'; use Getopt::Long; my $srcdir = '.'; @@ -34,7 +34,8 @@ my $yaccmode = 0; my $in_rule = 0; my $header_included = 0; -my $feature_not_supported = 0; +my $has_feature_not_supported = 0; +my $has_if_command = 0; my $tokenmode = 0; my (%buff, $infield, $comment, %tokens, %addons); @@ -151,12 +152,6 @@ sub main { line: while (<$parserfh>) { - if (/ERRCODE_FEATURE_NOT_SUPPORTED/) - { - $feature_not_supported = 1; - next line; - } - chomp; # comment out the line below to make the result file match (blank line wise) @@ -182,6 +177,13 @@ sub main $infield = 0; } + if ($yaccmode == 1) + { + # Check for rules that throw FEATURE_NOT_SUPPORTED + $has_feature_not_supported = 1 if /ERRCODE_FEATURE_NOT_SUPPORTED/; + $has_if_command = 1 if /^\s*if/; + } + my $prec = 0; # Make sure any braces are split @@ -541,20 +543,17 @@ sub dump_fields #Normal add_to_buffer('rules', $ln); - if ($feature_not_supported == 1) + if ($has_feature_not_supported and not $has_if_command) { - - # we found an unsupported feature, but we have to - # filter out ExecuteStmt: CREATE OptTemp TABLE ... - # because the warning there is only valid in some situations - if ($flds->[0] ne 'create' || $flds->[2] ne 'table') - { - add_to_buffer('rules', - 'mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");' - ); - } - $feature_not_supported = 0; + # The backend unconditionally reports + # FEATURE_NOT_SUPPORTED in this rule, so let's emit + # a warning on the ecpg side. + add_to_buffer('rules', + 'mmerror(PARSE_ERROR, ET_WARNING, "unsupported feature will be passed to server");' + ); } + $has_feature_not_supported = 0; + $has_if_command = 0; if ($len == 0) { diff --git a/src/interfaces/ecpg/preproc/parser.c b/src/interfaces/ecpg/preproc/parser.c index 38e7acb680464..9daeee330344a 100644 --- a/src/interfaces/ecpg/preproc/parser.c +++ b/src/interfaces/ecpg/preproc/parser.c @@ -10,7 +10,7 @@ * This file will need work if we ever want it to. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l index dcd567e8c3a1d..ba0db5614570d 100644 --- a/src/interfaces/ecpg/preproc/pgc.l +++ b/src/interfaces/ecpg/preproc/pgc.l @@ -10,7 +10,7 @@ * only here to simplify syncing this file with scan.l. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -69,7 +69,14 @@ char *token_start; static int state_before_str_start; static int state_before_str_stop; -struct _yy_buffer +/* + * State for handling include files and macro expansion. We use a new + * flex input buffer for each level of include or macro, and create a + * struct _yy_buffer to remember the previous level. There is not a struct + * for the currently active input source; that state is kept in the global + * variables YY_CURRENT_BUFFER, yylineno, and input_filename. + */ +static struct _yy_buffer { YY_BUFFER_STATE buffer; long lineno; @@ -77,8 +84,6 @@ struct _yy_buffer struct _yy_buffer *next; } *yy_buffer = NULL; -static char *old; - /* * Vars for handling ifdef/elif/endif constructs. preproc_tos is the current * nesting depth of such constructs, and stacked_if_value[preproc_tos] is the @@ -180,16 +185,16 @@ static struct _if_value * versions of Postgres failed to recognize -- as a comment if the input * did not end with a newline. * - * XXX perhaps \f (formfeed) should be treated as a newline as well? + * non_newline_space tracks all space characters except newlines. * * XXX if you change the set of whitespace characters, fix ecpg_isspace() * to agree. */ -space [ \t\n\r\f] -horiz_space [ \t\f] -newline [\n\r] -non_newline [^\n\r] +space [ \t\n\r\f\v] +non_newline_space [ \t\f\v] +newline [\n\r] +non_newline [^\n\r] comment ("--"{non_newline}*) @@ -202,8 +207,8 @@ whitespace ({space}+|{comment}) * it, whereas {whitespace} should generally have a * after it... */ -horiz_whitespace ({horiz_space}|{comment}) -whitespace_with_newline ({horiz_whitespace}*{newline}{whitespace}*) +non_newline_whitespace ({non_newline_space}|{comment}) +whitespace_with_newline ({non_newline_whitespace}*{newline}{whitespace}*) quote ' /* If we see {quote} then {quotecontinue}, the quoted string continues */ @@ -371,20 +376,35 @@ octfail 0[oO]_? binfail 0[bB]_? numeric (({decinteger}\.{decinteger}?)|(\.{decinteger})) -numericfail {decdigit}+\.\. +numericfail {decinteger}\.\. real ({decinteger}|{numeric})[Ee][-+]?{decinteger} realfail ({decinteger}|{numeric})[Ee][-+] -decinteger_junk {decinteger}{ident_start} -hexinteger_junk {hexinteger}{ident_start} -octinteger_junk {octinteger}{ident_start} -bininteger_junk {bininteger}{ident_start} -numeric_junk {numeric}{ident_start} -real_junk {real}{ident_start} +/* Positional parameters don't accept underscores. */ +param \${decdigit}+ -param \${decinteger} -param_junk \${decinteger}{ident_start} +/* + * An identifier immediately following an integer literal is disallowed because + * in some cases it's ambiguous what is meant: for example, 0x1234 could be + * either a hexinteger or a decinteger "0" and an identifier "x1234". We can + * detect such problems by seeing if integer_junk matches a longer substring + * than any of the XXXinteger patterns (decinteger, hexinteger, octinteger, + * bininteger). One "junk" pattern is sufficient because + * {decinteger}{identifier} will match all the same strings we'd match with + * {hexinteger}{identifier} etc. + * + * Note that the rule for integer_junk must appear after the ones for + * XXXinteger to make this work correctly: 0x1234 will match both hexinteger + * and integer_junk, and we need hexinteger to be chosen in that case. + * + * Also disallow strings matched by numeric_junk, real_junk and param_junk + * for consistency. + */ +integer_junk {decinteger}{identifier} +numeric_junk {numeric}{identifier} +real_junk {real}{identifier} +param_junk \${decdigit}+{identifier} /* special characters for other dbms */ /* we have to react differently in compat mode */ @@ -444,6 +464,8 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ %{ /* code to execute during start of each call of yylex() */ + char *newdefsymbol = NULL; + token_start = NULL; %} @@ -985,16 +1007,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ * Note that some trailing junk is valid in C (such as 100LL), so we * contain this to SQL mode. */ -{decinteger_junk} { - mmfatal(PARSE_ERROR, "trailing junk after numeric literal"); - } -{hexinteger_junk} { - mmfatal(PARSE_ERROR, "trailing junk after numeric literal"); - } -{octinteger_junk} { - mmfatal(PARSE_ERROR, "trailing junk after numeric literal"); - } -{bininteger_junk} { +{integer_junk} { mmfatal(PARSE_ERROR, "trailing junk after numeric literal"); } {numeric_junk} { @@ -1010,6 +1023,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ } {identifier} { + /* First check to see if it's a define symbol to expand */ if (!isdefine()) { int kwvalue; @@ -1198,17 +1212,23 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ yytext[i+1] = '\0'; - for (ptr = defines; ptr != NULL; ptr2 = ptr, ptr = ptr->next) + /* Find and unset any matching define; should be only 1 */ + for (ptr = defines; ptr; ptr2 = ptr, ptr = ptr->next) { - if (strcmp(yytext, ptr->olddef) == 0) + if (strcmp(yytext, ptr->name) == 0) { - if (ptr2 == NULL) - defines = ptr->next; - else - ptr2->next = ptr->next; - free(ptr->newdef); - free(ptr->olddef); - free(ptr); + free(ptr->value); + ptr->value = NULL; + /* We cannot forget it if there's a cmdvalue */ + if (ptr->cmdvalue == NULL) + { + if (ptr2 == NULL) + defines = ptr->next; + else + ptr2->next = ptr->next; + free(ptr->name); + free(ptr); + } break; } } @@ -1413,11 +1433,17 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ ; yytext[i+1] = '\0'; - for (defptr = defines; - defptr != NULL && - strcmp(yytext, defptr->olddef) != 0; - defptr = defptr->next) - /* skip */ ; + /* Does a definition exist? */ + for (defptr = defines; defptr; defptr = defptr->next) + { + if (strcmp(yytext, defptr->name) == 0) + { + /* Found it, but is it currently undefined? */ + if (defptr->value == NULL) + defptr = NULL; /* pretend it's not found */ + break; + } + } this_active = (defptr ? ifcond : !ifcond); stacked_if_value[preproc_tos].active = @@ -1438,7 +1464,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ yyterminate(); } {identifier} { - old = mm_strdup(yytext); + newdefsymbol = mm_strdup(yytext); BEGIN(def); startlit(); } @@ -1447,26 +1473,31 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ yyterminate(); } {space}*";" { - struct _defines *ptr, *this; + struct _defines *ptr; + /* Does it already exist? */ for (ptr = defines; ptr != NULL; ptr = ptr->next) { - if (strcmp(old, ptr->olddef) == 0) - { - free(ptr->newdef); - ptr->newdef = mm_strdup(literalbuf); - } + if (strcmp(newdefsymbol, ptr->name) == 0) + { + free(ptr->value); + ptr->value = mm_strdup(literalbuf); + /* Don't leak newdefsymbol */ + free(newdefsymbol); + break; + } } if (ptr == NULL) { - this = (struct _defines *) mm_alloc(sizeof(struct _defines)); - - /* initial definition */ - this->olddef = old; - this->newdef = mm_strdup(literalbuf); - this->next = defines; - this->used = NULL; - defines = this; + /* Not present, make a new entry */ + ptr = (struct _defines *) mm_alloc(sizeof(struct _defines)); + + ptr->name = newdefsymbol; + ptr->value = mm_strdup(literalbuf); + ptr->cmdvalue = NULL; + ptr->used = NULL; + ptr->next = defines; + defines = ptr; } BEGIN(C); @@ -1483,6 +1514,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ <> { if (yy_buffer == NULL) { + /* No more input */ if (preproc_tos > 0) { preproc_tos = 0; @@ -1492,16 +1524,20 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+ } else { + /* Revert to previous input source */ struct _yy_buffer *yb = yy_buffer; int i; struct _defines *ptr; + /* Check to see if we are exiting a macro value */ for (ptr = defines; ptr; ptr = ptr->next) + { if (ptr->used == yy_buffer) { ptr->used = NULL; - break; + break; /* there can't be multiple matches */ } + } if (yyin != NULL) fclose(yyin); @@ -1721,20 +1757,30 @@ ecpg_isspace(char ch) ch == '\t' || ch == '\n' || ch == '\r' || - ch == '\f') + ch == '\f' || + ch == '\v') return true; return false; } -static bool isdefine(void) +/* + * If yytext matches a define symbol, begin scanning the symbol's value + * and return true + */ +static bool +isdefine(void) { struct _defines *ptr; /* is it a define? */ for (ptr = defines; ptr; ptr = ptr->next) { - if (strcmp(yytext, ptr->olddef) == 0 && ptr->used == NULL) + /* notice we do not match anything being actively expanded */ + if (strcmp(yytext, ptr->name) == 0 && + ptr->value != NULL && + ptr->used == NULL) { + /* Save state associated with the current buffer */ struct _yy_buffer *yb; yb = mm_alloc(sizeof(struct _yy_buffer)); @@ -1743,10 +1789,17 @@ static bool isdefine(void) yb->lineno = yylineno; yb->filename = mm_strdup(input_filename); yb->next = yy_buffer; + yy_buffer = yb; - ptr->used = yy_buffer = yb; + /* Mark symbol as being actively expanded */ + ptr->used = yb; - yy_scan_string(ptr->newdef); + /* + * We use yy_scan_string which will copy the value, so there's + * no need to worry about a possible undef happening while we + * are still scanning it. + */ + yy_scan_string(ptr->value); return true; } } @@ -1754,7 +1807,12 @@ static bool isdefine(void) return false; } -static bool isinformixdefine(void) +/* + * Handle replacement of INFORMIX built-in defines. This works just + * like isdefine() except for the source of the string to scan. + */ +static bool +isinformixdefine(void) { const char *new = NULL; diff --git a/src/interfaces/ecpg/preproc/po/de.po b/src/interfaces/ecpg/preproc/po/de.po index 9575a1a296fe7..cf9fa6aaee452 100644 --- a/src/interfaces/ecpg/preproc/po/de.po +++ b/src/interfaces/ecpg/preproc/po/de.po @@ -1,15 +1,15 @@ # German message translation file for ecpg -# Copyright (C) 2009-2022 PostgreSQL Global Development Group +# Copyright (C) 2009-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-08 07:39+0000\n" -"PO-Revision-Date: 2022-05-08 13:50+0200\n" +"POT-Creation-Date: 2024-03-12 17:10+0000\n" +"PO-Revision-Date: 2024-03-12 21:11+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -23,37 +23,37 @@ msgstr "" msgid "variable \"%s\" must have a numeric type" msgstr "Variable »%s« muss einen numerischen Typ haben" -#: descriptor.c:125 descriptor.c:156 +#: descriptor.c:124 descriptor.c:155 #, c-format msgid "descriptor %s bound to connection %s does not exist" msgstr "Deskriptor %s gebunden an Verbindung %s existiert nicht" -#: descriptor.c:127 descriptor.c:158 +#: descriptor.c:126 descriptor.c:157 #, c-format msgid "descriptor %s bound to the default connection does not exist" msgstr "Deskriptor %s gebunden an die Standardverbindung existiert nicht" -#: descriptor.c:173 descriptor.c:225 +#: descriptor.c:172 descriptor.c:224 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "Deskriptorkopfelement »%d« existiert nicht" -#: descriptor.c:195 +#: descriptor.c:194 #, c-format msgid "nullable is always 1" msgstr "nullable ist immer 1" -#: descriptor.c:198 +#: descriptor.c:197 #, c-format msgid "key_member is always 0" msgstr "key_member ist immer 0" -#: descriptor.c:292 +#: descriptor.c:291 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "Deskriptorelement »%s« ist nicht implementiert" -#: descriptor.c:302 +#: descriptor.c:301 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "Deskriptorelement »%s« kann nicht gesetzt werden" @@ -190,172 +190,172 @@ msgstr "%s Homepage: <%s>\n" msgid "%s: could not locate my own executable path\n" msgstr "%s: konnte Pfad des eigenen Programs nicht finden\n" -#: ecpg.c:176 ecpg.c:333 ecpg.c:344 -#, c-format -msgid "%s: could not open file \"%s\": %s\n" -msgstr "%s: konnte Datei »%s« nicht öffnen: %s\n" - -#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 +#: ecpg.c:184 ecpg.c:235 ecpg.c:249 ecpg.c:275 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Versuchen Sie »%s --help« für weitere Informationen.\n" -#: ecpg.c:243 +#: ecpg.c:192 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: Unterstützung für Parserdebugging (-d) nicht verfügbar\n" -#: ecpg.c:262 +#: ecpg.c:219 ecpg.c:334 ecpg.c:345 +#, c-format +msgid "%s: could not open file \"%s\": %m\n" +msgstr "%s: konnte Datei »%s« nicht öffnen: %m\n" + +#: ecpg.c:263 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, der PostgreSQL-Embedded-C-Präprozessor, Version %s\n" -#: ecpg.c:264 +#: ecpg.c:265 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "EXEC SQL INCLUDE ... Suche beginnt hier:\n" -#: ecpg.c:267 +#: ecpg.c:268 #, c-format msgid "end of search list\n" msgstr "Ende der Suchliste\n" -#: ecpg.c:273 +#: ecpg.c:274 #, c-format msgid "%s: no input files specified\n" msgstr "%s: keine Eingabedateien angegeben\n" -#: ecpg.c:477 +#: ecpg.c:478 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "Cursor »%s« wurde deklariert aber nicht geöffnet" -#: ecpg.c:490 preproc.y:130 +#: ecpg.c:491 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "konnte Ausgabedatei »%s« nicht entfernen\n" -#: pgc.l:508 +#: pgc.l:520 #, c-format msgid "unterminated /* comment" msgstr "/*-Kommentar nicht abgeschlossen" -#: pgc.l:525 +#: pgc.l:537 #, c-format msgid "unterminated bit string literal" msgstr "Bitkettenkonstante nicht abgeschlossen" -#: pgc.l:533 +#: pgc.l:545 #, c-format msgid "unterminated hexadecimal string literal" msgstr "hexadezimale Zeichenkette nicht abgeschlossen" -#: pgc.l:608 +#: pgc.l:620 #, c-format msgid "invalid bit string literal" msgstr "ungültige Bitkettenkonstante" -#: pgc.l:613 +#: pgc.l:625 #, c-format msgid "invalid hexadecimal string literal" msgstr "ungültige hexadezimale Zeichenkettenkonstante" -#: pgc.l:631 +#: pgc.l:643 #, c-format msgid "unhandled previous state in xqs\n" msgstr "unbehandelter vorheriger Zustand in xqs\n" -#: pgc.l:657 pgc.l:766 +#: pgc.l:669 pgc.l:778 #, c-format msgid "unterminated quoted string" msgstr "Zeichenkette in Anführungszeichen nicht abgeschlossen" -#: pgc.l:708 +#: pgc.l:720 #, c-format msgid "unterminated dollar-quoted string" msgstr "Dollar-Quotes nicht abgeschlossen" -#: pgc.l:726 pgc.l:746 +#: pgc.l:738 pgc.l:758 #, c-format msgid "zero-length delimited identifier" msgstr "Bezeichner in Anführungszeichen hat Länge null" -#: pgc.l:757 +#: pgc.l:769 #, c-format msgid "unterminated quoted identifier" msgstr "Bezeichner in Anführungszeichen nicht abgeschlossen" -#: pgc.l:926 +#: pgc.l:938 #, c-format msgid "trailing junk after parameter" msgstr "Müll folgt auf Parameter" -#: pgc.l:968 pgc.l:971 pgc.l:974 +#: pgc.l:990 pgc.l:993 pgc.l:996 pgc.l:999 pgc.l:1002 pgc.l:1005 #, c-format msgid "trailing junk after numeric literal" msgstr "Müll folgt auf numerische Konstante" -#: pgc.l:1100 +#: pgc.l:1127 #, c-format msgid "nested /* ... */ comments" msgstr "geschachtelte /* ... */-Kommentare" -#: pgc.l:1193 +#: pgc.l:1220 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "fehlender Bezeichner im Befehl EXEC SQL UNDEF" -#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 +#: pgc.l:1238 pgc.l:1251 pgc.l:1267 pgc.l:1280 #, c-format msgid "too many nested EXEC SQL IFDEF conditions" msgstr "zu viele verschachtelte EXEC SQL IFDEF-Bedingungen" -#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 +#: pgc.l:1296 pgc.l:1307 pgc.l:1322 pgc.l:1344 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "passendes »EXEC SQL IFDEF« / »EXEC SQL IFNDEF« fehlt" -#: pgc.l:1271 pgc.l:1282 pgc.l:1463 +#: pgc.l:1298 pgc.l:1309 pgc.l:1490 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "»EXEC SQL ENDIF;« fehlt" -#: pgc.l:1297 pgc.l:1319 +#: pgc.l:1324 pgc.l:1346 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "mehr als ein EXEC SQL ENDIF" -#: pgc.l:1342 pgc.l:1356 +#: pgc.l:1369 pgc.l:1383 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "unzusammenhängendes EXEC SQL ENDIF" -#: pgc.l:1411 +#: pgc.l:1438 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "fehlender Bezeichner im Befehl EXEC SQL IFDEF" -#: pgc.l:1420 +#: pgc.l:1447 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "fehlender Bezeichner im Befehl EXEC SQL DEFINE" -#: pgc.l:1453 +#: pgc.l:1480 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "Syntaxfehler im Befehl EXEC SQL INCLUDE" -#: pgc.l:1503 +#: pgc.l:1530 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "interner Fehler: unerreichbarer Zustand; bitte an <%s> berichten" -#: pgc.l:1655 +#: pgc.l:1682 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "Fehler: Include-Pfad »%s/%s« ist zu lang auf Zeile %d, wird übersprungen\n" -#: pgc.l:1678 +#: pgc.l:1705 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "konnte Include-Datei »%s« nicht öffnen auf Zeile %d" @@ -389,12 +389,12 @@ msgstr "Initialisierungswert nicht erlaubt in Typdefinition" msgid "type name \"string\" is reserved in Informix mode" msgstr "Typname »string« ist im Informix-Modus reserviert" -#: preproc.y:552 preproc.y:19317 +#: preproc.y:552 preproc.y:18523 #, c-format msgid "type \"%s\" is already defined" msgstr "Typ »%s« ist bereits definiert" -#: preproc.y:577 preproc.y:19952 preproc.y:20277 variable.c:621 +#: preproc.y:577 preproc.y:19158 preproc.y:19480 variable.c:625 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "mehrdimensionale Arrays für einfache Datentypen werden nicht unterstützt" @@ -404,180 +404,175 @@ msgstr "mehrdimensionale Arrays für einfache Datentypen werden nicht unterstüt msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "Verbindung %s wird mit %s überschrieben, durch DECLARE-Anweisung %s" -#: preproc.y:1872 +#: preproc.y:1810 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "AT-Option ist nicht erlaubt im Befehl CLOSE DATABASE" -#: preproc.y:2122 +#: preproc.y:2060 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "AT-Option ist nicht erlaubt im Befehl CONNECT" -#: preproc.y:2162 +#: preproc.y:2100 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "AT-Option ist nicht erlaubt im Befehl DISCONNECT" -#: preproc.y:2217 +#: preproc.y:2155 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "AT-Option ist nicht erlaubt im Befehl SET CONNECTION" -#: preproc.y:2239 +#: preproc.y:2177 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "AT-Option ist nicht erlaubt im TYPE-Befehl" -#: preproc.y:2248 +#: preproc.y:2186 #, c-format msgid "AT option not allowed in VAR statement" msgstr "AT-Option ist nicht erlaubt im VAR-Befehl" -#: preproc.y:2255 +#: preproc.y:2193 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "AT-Option ist nicht erlaubt im WHENEVER-Befehl" -#: preproc.y:2332 preproc.y:2504 preproc.y:2509 preproc.y:2632 preproc.y:4283 -#: preproc.y:4357 preproc.y:4948 preproc.y:5481 preproc.y:5819 preproc.y:6119 -#: preproc.y:7687 preproc.y:9288 preproc.y:9293 preproc.y:12272 +#: preproc.y:2318 preproc.y:2490 preproc.y:2495 preproc.y:2607 preproc.y:4317 +#: preproc.y:4391 preproc.y:4982 preproc.y:5515 preproc.y:5853 preproc.y:6057 +#: preproc.y:6158 preproc.y:7722 preproc.y:9330 preproc.y:9335 preproc.y:12308 #, c-format msgid "unsupported feature will be passed to server" msgstr "nicht mehr unterstütztes Feature wird an Server weitergereicht werden" -#: preproc.y:2890 +#: preproc.y:2865 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL ist nicht implementiert" -#: preproc.y:3589 +#: preproc.y:3577 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN ist nicht implementiert" -#: preproc.y:10335 preproc.y:18892 +#: preproc.y:10385 preproc.y:18020 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "»database« kann im INFORMIX-Modus nicht als Cursorname verwendet werden" -#: preproc.y:10342 preproc.y:18902 +#: preproc.y:10392 preproc.y:18030 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "Verwendung der Variable »%s« in verschiedenen DECLARE-Anweisungen wird nicht unterstützt" -#: preproc.y:10344 preproc.y:18904 +#: preproc.y:10394 preproc.y:18032 #, c-format msgid "cursor \"%s\" is already defined" msgstr "Cursor »%s« ist bereits definiert" -#: preproc.y:10818 +#: preproc.y:10868 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "nicht mehr unterstützte Syntax LIMIT x,y wird an Server weitergereicht" -#: preproc.y:11151 preproc.y:11158 -#, c-format -msgid "subquery in FROM must have an alias" -msgstr "Unteranfrage in FROM muss Aliasnamen erhalten" - -#: preproc.y:18584 preproc.y:18591 +#: preproc.y:17712 preproc.y:17719 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS kann INTO nicht verwenden" -#: preproc.y:18627 +#: preproc.y:17755 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "»@« erwartet, »%s« gefunden" -#: preproc.y:18639 +#: preproc.y:17767 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "er werden nur die Protokolle »tcp« und »unix« und der Datenbanktyp »postgresql« unterstützt" -#: preproc.y:18642 +#: preproc.y:17770 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "»://« erwartet, »%s« gefunden" -#: preproc.y:18647 +#: preproc.y:17775 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unix-Domain-Sockets funktionieren nur mit »localhost«, aber nicht mit »%s«" -#: preproc.y:18673 +#: preproc.y:17801 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "»postgresql« erwartet, »%s« gefunden" -#: preproc.y:18676 +#: preproc.y:17804 #, c-format msgid "invalid connection type: %s" msgstr "ungültiger Verbindungstyp: %s" -#: preproc.y:18685 +#: preproc.y:17813 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "»@« oder »://« erwartet, »%s« gefunden" -#: preproc.y:18760 preproc.y:18778 +#: preproc.y:17888 preproc.y:17906 #, c-format msgid "invalid data type" msgstr "ungültiger Datentyp" -#: preproc.y:18789 preproc.y:18806 +#: preproc.y:17917 preproc.y:17934 #, c-format msgid "incomplete statement" msgstr "unvollständige Anweisung" -#: preproc.y:18792 preproc.y:18809 +#: preproc.y:17920 preproc.y:17937 #, c-format msgid "unrecognized token \"%s\"" msgstr "nicht erkanntes Token »%s«" -#: preproc.y:18854 +#: preproc.y:17982 #, c-format msgid "name \"%s\" is already declared" msgstr "Name »%s« ist bereits deklariert" -#: preproc.y:19120 +#: preproc.y:18271 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "nur die Datentypen NUMERIC und DECIMAL haben Argumente für Präzision und Skala" -#: preproc.y:19132 +#: preproc.y:18342 #, c-format msgid "interval specification not allowed here" msgstr "Intervallangabe hier nicht erlaubt" -#: preproc.y:19292 preproc.y:19344 +#: preproc.y:18498 preproc.y:18550 #, c-format msgid "too many levels in nested structure/union definition" msgstr "zu viele Ebenen in verschachtelter Definition von Struktur/Union" -#: preproc.y:19467 +#: preproc.y:18673 #, c-format msgid "pointers to varchar are not implemented" msgstr "Zeiger auf varchar sind nicht implementiert" -#: preproc.y:19918 +#: preproc.y:19124 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "Initialisierungswert nicht erlaubt in Befehl EXEC SQL VAR" -#: preproc.y:20235 +#: preproc.y:19438 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "Array aus Indikatoren bei der Eingabe nicht erlaubt" -#: preproc.y:20422 +#: preproc.y:19625 #, c-format msgid "operator not allowed in variable definition" msgstr "Operator nicht erlaubt in Variablendefinition" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:20463 +#: preproc.y:19666 #, c-format msgid "%s at or near \"%s\"" msgstr "%s bei »%s«" @@ -647,64 +642,64 @@ msgstr "Indikator-Struct »%s« hat zu viele Mitglieder" msgid "unrecognized descriptor item code %d" msgstr "unbekannter Deskriptorelementcode %d" -#: variable.c:89 variable.c:116 +#: variable.c:89 variable.c:115 #, c-format msgid "incorrectly formed variable \"%s\"" msgstr "falsch geformte Variable »%s«" -#: variable.c:139 +#: variable.c:138 #, c-format msgid "variable \"%s\" is not a pointer" msgstr "Variable »%s« ist kein Zeiger" -#: variable.c:142 variable.c:167 +#: variable.c:141 variable.c:166 #, c-format msgid "variable \"%s\" is not a pointer to a structure or a union" msgstr "Variable »%s« ist kein Zeiger auf eine Struktur oder Union" -#: variable.c:154 +#: variable.c:153 #, c-format msgid "variable \"%s\" is neither a structure nor a union" msgstr "Variable »%s« ist keine Struktur oder Union" -#: variable.c:164 +#: variable.c:163 #, c-format msgid "variable \"%s\" is not an array" msgstr "Variable »%s« ist kein Array" -#: variable.c:233 variable.c:255 +#: variable.c:232 variable.c:254 #, c-format msgid "variable \"%s\" is not declared" msgstr "Variable »%s« ist nicht deklariert" -#: variable.c:494 +#: variable.c:493 #, c-format msgid "indicator variable must have an integer type" msgstr "Indikatorvariable muss einen ganzzahligen Typ haben" -#: variable.c:506 +#: variable.c:510 #, c-format msgid "unrecognized data type name \"%s\"" msgstr "unbekannter Datentypname »%s«" -#: variable.c:517 variable.c:525 variable.c:542 variable.c:545 +#: variable.c:521 variable.c:529 variable.c:546 variable.c:549 #, c-format msgid "multidimensional arrays are not supported" msgstr "mehrdimensionale Arrays werden nicht unterstützt" -#: variable.c:534 +#: variable.c:538 #, c-format msgid "multilevel pointers (more than 2 levels) are not supported; found %d level" msgid_plural "multilevel pointers (more than 2 levels) are not supported; found %d levels" msgstr[0] "Zeiger mit mehr als 2 Ebenen werden nicht unterstützt; %d Ebene gefunden" msgstr[1] "Zeiger mit mehr als 2 Ebenen werden nicht unterstützt; %d Ebenen gefunden" -#: variable.c:539 +#: variable.c:543 #, c-format msgid "pointer to pointer is not supported for this data type" msgstr "Zeiger auf Zeiger wird für diesen Datentyp nicht unterstützt" -#: variable.c:559 +#: variable.c:563 #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "mehrdimensionale Arrays für Strukturen werden nicht unterstützt" diff --git a/src/interfaces/ecpg/preproc/po/es.po b/src/interfaces/ecpg/preproc/po/es.po index 5a550b56e1882..f8e3c4a34ecc1 100644 --- a/src/interfaces/ecpg/preproc/po/es.po +++ b/src/interfaces/ecpg/preproc/po/es.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: ecpg (PostgreSQL) 16\n" +"Project-Id-Version: ecpg (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:10+0000\n" -"PO-Revision-Date: 2023-05-22 12:05+0200\n" +"POT-Creation-Date: 2025-02-16 19:40+0000\n" +"PO-Revision-Date: 2024-11-16 14:23+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -191,177 +191,177 @@ msgstr "" msgid "%s home page: <%s>\n" msgstr "Sitio web de %s: <%s>\n" -#: ecpg.c:141 +#: ecpg.c:152 #, c-format msgid "%s: could not locate my own executable path\n" msgstr "%s: no se pudo localizar la ruta de mi propio ejecutable\n" -#: ecpg.c:184 ecpg.c:235 ecpg.c:249 ecpg.c:275 +#: ecpg.c:195 ecpg.c:246 ecpg.c:260 ecpg.c:286 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Utilice «%s --help» para obtener mayor información.\n" -#: ecpg.c:192 +#: ecpg.c:203 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: la depuración del analizador (parser, -d) no está disponible)\n" -#: ecpg.c:219 ecpg.c:334 ecpg.c:345 +#: ecpg.c:230 ecpg.c:345 ecpg.c:356 #, c-format -msgid "%s: could not open file \"%s\": %s\n" -msgstr "%s: no se pudo abrir el archivo «%s»: %s\n" +msgid "%s: could not open file \"%s\": %m\n" +msgstr "%s: no se pudo abrir el archivo «%s»: %m\n" -#: ecpg.c:263 +#: ecpg.c:274 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, el preprocesador de C incrustado de PostgreSQL, versión %s\n" -#: ecpg.c:265 +#: ecpg.c:276 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "EXEC SQL INCLUDE ... la búsqueda comienza aquí:\n" -#: ecpg.c:268 +#: ecpg.c:279 #, c-format msgid "end of search list\n" msgstr "fin de la lista de búsqueda\n" -#: ecpg.c:274 +#: ecpg.c:285 #, c-format msgid "%s: no input files specified\n" msgstr "%s: no se especificaron archivos de entrada\n" -#: ecpg.c:478 +#: ecpg.c:491 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "el cursor «%s» fue declarado pero no abierto" -#: ecpg.c:491 preproc.y:130 +#: ecpg.c:504 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "no se pudo eliminar el archivo de salida «%s»\n" -#: pgc.l:520 +#: pgc.l:542 #, c-format msgid "unterminated /* comment" msgstr "comentario /* no cerrado" -#: pgc.l:537 +#: pgc.l:559 #, c-format msgid "unterminated bit string literal" msgstr "una cadena de bits está inconclusa" -#: pgc.l:545 +#: pgc.l:567 #, c-format msgid "unterminated hexadecimal string literal" msgstr "una cadena hexadecimal está inconclusa" -#: pgc.l:620 +#: pgc.l:642 #, c-format msgid "invalid bit string literal" msgstr "cadena de bits no válida" -#: pgc.l:625 +#: pgc.l:647 #, c-format msgid "invalid hexadecimal string literal" msgstr "cadena hexadecimal no válida" -#: pgc.l:643 +#: pgc.l:665 #, c-format msgid "unhandled previous state in xqs\n" msgstr "estado previo no manejado en xqs\n" -#: pgc.l:669 pgc.l:778 +#: pgc.l:691 pgc.l:800 #, c-format msgid "unterminated quoted string" msgstr "una cadena en comillas está inconclusa" -#: pgc.l:720 +#: pgc.l:742 #, c-format msgid "unterminated dollar-quoted string" msgstr "una cadena separada por $ está inconclusa" -#: pgc.l:738 pgc.l:758 +#: pgc.l:760 pgc.l:780 #, c-format msgid "zero-length delimited identifier" msgstr "identificador delimitado de longitud cero" -#: pgc.l:769 +#: pgc.l:791 #, c-format msgid "unterminated quoted identifier" msgstr "un identificador en comillas está inconcluso" -#: pgc.l:938 +#: pgc.l:960 #, c-format msgid "trailing junk after parameter" msgstr "basura sigue después de un parámetro" -#: pgc.l:990 pgc.l:993 pgc.l:996 pgc.l:999 pgc.l:1002 pgc.l:1005 +#: pgc.l:1012 pgc.l:1015 pgc.l:1018 #, c-format msgid "trailing junk after numeric literal" msgstr "basura sigue después de un literal numérico" -#: pgc.l:1127 +#: pgc.l:1141 #, c-format msgid "nested /* ... */ comments" msgstr "comentarios /* ... */ anidados" -#: pgc.l:1220 +#: pgc.l:1240 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "falta un identificador en la orden EXEC SQL UNDEF" -#: pgc.l:1238 pgc.l:1251 pgc.l:1267 pgc.l:1280 +#: pgc.l:1258 pgc.l:1271 pgc.l:1287 pgc.l:1300 #, c-format msgid "too many nested EXEC SQL IFDEF conditions" msgstr "demasiadas condiciones EXEC SQL IFDEF anidadas" -#: pgc.l:1296 pgc.l:1307 pgc.l:1322 pgc.l:1344 +#: pgc.l:1316 pgc.l:1327 pgc.l:1342 pgc.l:1364 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "falta el «EXEC SQL IFDEF» / «EXEC SQL IFNDEF»" -#: pgc.l:1298 pgc.l:1309 pgc.l:1490 +#: pgc.l:1318 pgc.l:1329 pgc.l:1522 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "falta el «EXEC SQL ENDIF;»" -#: pgc.l:1324 pgc.l:1346 +#: pgc.l:1344 pgc.l:1366 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "hay más de un EXEC SQL ELSE" -#: pgc.l:1369 pgc.l:1383 +#: pgc.l:1389 pgc.l:1403 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "EXEC SQL ENDIF sin coincidencia" -#: pgc.l:1438 +#: pgc.l:1464 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "identificador faltante en la orden EXEC SQL IFDEF" -#: pgc.l:1447 +#: pgc.l:1473 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "identificador faltante en la orden EXEC SQL DEFINE" -#: pgc.l:1480 +#: pgc.l:1511 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "error de sintaxis en orden EXEC SQL INCLUDE" -#: pgc.l:1530 +#: pgc.l:1566 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "error interno: estado no esperado; por favor reporte a <%s>" -#: pgc.l:1682 +#: pgc.l:1718 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "Error: ruta de inclusión «%s/%s» es demasiada larga en la línea %d, omitiendo\n" -#: pgc.l:1705 +#: pgc.l:1741 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "no se pudo abrir el archivo a incluir «%s» en la línea %d" @@ -395,12 +395,12 @@ msgstr "inicializador no permitido en definición de tipo" msgid "type name \"string\" is reserved in Informix mode" msgstr "el nombre de tipo «string» está reservado en modo Informix" -#: preproc.y:552 preproc.y:18392 +#: preproc.y:552 preproc.y:19034 #, c-format msgid "type \"%s\" is already defined" msgstr "el tipo «%s» ya está definido" -#: preproc.y:577 preproc.y:19027 preproc.y:19349 variable.c:625 +#: preproc.y:577 preproc.y:19669 preproc.y:19991 variable.c:624 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "los arrays multidimensionales para tipos de datos simples no están soportados" @@ -410,175 +410,174 @@ msgstr "los arrays multidimensionales para tipos de datos simples no están sopo msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "la conexión %s es sobrescrita con %s por la sentencia DECLARE %s" -#: preproc.y:1792 +#: preproc.y:1831 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "la opción AT no está permitida en la sentencia CLOSE DATABASE" -#: preproc.y:2042 +#: preproc.y:2081 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "la opción AT no está permitida en la sentencia CONNECT" -#: preproc.y:2082 +#: preproc.y:2121 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "la opción AT no está permitida en la sentencia DISCONNECT" -#: preproc.y:2137 +#: preproc.y:2176 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "la opción AT no está permitida en la sentencia SET CONNECTION" -#: preproc.y:2159 +#: preproc.y:2198 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "la opción AT no está permitida en la sentencia TYPE" -#: preproc.y:2168 +#: preproc.y:2207 #, c-format msgid "AT option not allowed in VAR statement" msgstr "la opción AT no está permitida en la sentencia VAR" -#: preproc.y:2175 +#: preproc.y:2214 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "la opción AT no está permitida en la sentencia WHENEVER" -#: preproc.y:2300 preproc.y:2472 preproc.y:2477 preproc.y:2589 preproc.y:4248 -#: preproc.y:4322 preproc.y:4913 preproc.y:5446 preproc.y:5784 preproc.y:6084 -#: preproc.y:7648 preproc.y:9252 preproc.y:9257 preproc.y:12206 +#: preproc.y:2339 preproc.y:2626 preproc.y:4349 preproc.y:5021 preproc.y:5891 +#: preproc.y:6095 preproc.y:6196 preproc.y:12460 #, c-format msgid "unsupported feature will be passed to server" msgstr "característica no soportada será pasada al servidor" -#: preproc.y:2847 +#: preproc.y:2884 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL no está implementado" -#: preproc.y:3531 +#: preproc.y:3596 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN no está implementado" -#: preproc.y:10303 preproc.y:17889 +#: preproc.y:10444 preproc.y:18503 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "no se puede usar «database» como nombre de cursor en modo INFORMIX" -#: preproc.y:10310 preproc.y:17899 +#: preproc.y:10451 preproc.y:18513 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "el uso de la variable «%s» en diferentes sentencias declare no está soportado" -#: preproc.y:10312 preproc.y:17901 +#: preproc.y:10453 preproc.y:18515 #, c-format msgid "cursor \"%s\" is already defined" msgstr "el cursor «%s» ya está definido" -#: preproc.y:10786 +#: preproc.y:10927 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "la sintaxis LIMIT #,# que ya no está soportada ha sido pasada al servidor" -#: preproc.y:17581 preproc.y:17588 +#: preproc.y:18195 preproc.y:18202 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS no puede especificar INTO" -#: preproc.y:17624 +#: preproc.y:18238 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "se esperaba «@», se encontró «%s»" -#: preproc.y:17636 +#: preproc.y:18250 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "sólo los protocolos «tcp» y «unix» y tipo de bases de datos «postgresql» están soportados" -#: preproc.y:17639 +#: preproc.y:18253 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "se esperaba «://», se encontró «%s»" -#: preproc.y:17644 +#: preproc.y:18258 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "los sockets de dominio unix sólo trabajan en «localhost» pero no en «%s»" -#: preproc.y:17670 +#: preproc.y:18284 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "se esperaba «postgresql», se encontró «%s»" -#: preproc.y:17673 +#: preproc.y:18287 #, c-format msgid "invalid connection type: %s" msgstr "tipo de conexión no válido: %s" -#: preproc.y:17682 +#: preproc.y:18296 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "se esperaba «@» o «://», se encontró «%s»" -#: preproc.y:17757 preproc.y:17775 +#: preproc.y:18371 preproc.y:18389 #, c-format msgid "invalid data type" msgstr "tipo de dato no válido" -#: preproc.y:17786 preproc.y:17803 +#: preproc.y:18400 preproc.y:18417 #, c-format msgid "incomplete statement" msgstr "sentencia incompleta" -#: preproc.y:17789 preproc.y:17806 +#: preproc.y:18403 preproc.y:18420 #, c-format msgid "unrecognized token \"%s\"" msgstr "elemento «%s» no reconocido" -#: preproc.y:17851 +#: preproc.y:18465 #, c-format msgid "name \"%s\" is already declared" msgstr "el nombre «%s» ya está declarado" -#: preproc.y:18140 +#: preproc.y:18754 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "sólo los tipos de dato numeric y decimal tienen argumento de precisión/escala" -#: preproc.y:18211 +#: preproc.y:18853 #, c-format msgid "interval specification not allowed here" msgstr "la especificación de intervalo no está permitida aquí" -#: preproc.y:18367 preproc.y:18419 +#: preproc.y:19009 preproc.y:19061 #, c-format msgid "too many levels in nested structure/union definition" msgstr "demasiados niveles en la definición anidada de estructura/unión" -#: preproc.y:18542 +#: preproc.y:19184 #, c-format msgid "pointers to varchar are not implemented" msgstr "los punteros a varchar no están implementados" -#: preproc.y:18993 +#: preproc.y:19635 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "inicializador no permitido en la orden EXEC SQL VAR" -#: preproc.y:19307 +#: preproc.y:19949 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "no se permiten los arrays de indicadores en la entrada" -#: preproc.y:19494 +#: preproc.y:20136 #, c-format msgid "operator not allowed in variable definition" msgstr "operador no permitido en definición de variable" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:19535 +#: preproc.y:20177 #, c-format msgid "%s at or near \"%s\"" msgstr "%s en o cerca de «%s»" @@ -678,34 +677,34 @@ msgstr "la variable «%s» no es un array" msgid "variable \"%s\" is not declared" msgstr "la variable «%s» no está declarada" -#: variable.c:493 +#: variable.c:492 #, c-format msgid "indicator variable must have an integer type" msgstr "la variable de un indicador debe ser de algún tipo numérico entero" -#: variable.c:510 +#: variable.c:509 #, c-format msgid "unrecognized data type name \"%s\"" msgstr "nombre de tipo de datos «%s» no reconocido" -#: variable.c:521 variable.c:529 variable.c:546 variable.c:549 +#: variable.c:520 variable.c:528 variable.c:545 variable.c:548 #, c-format msgid "multidimensional arrays are not supported" msgstr "los arrays multidimensionales no están soportados" -#: variable.c:538 +#: variable.c:537 #, c-format msgid "multilevel pointers (more than 2 levels) are not supported; found %d level" msgid_plural "multilevel pointers (more than 2 levels) are not supported; found %d levels" msgstr[0] "no se soportan los punteros multinivel (más de 2); se encontró 1 nivel" msgstr[1] "no se soportan los punteros multinivel (más de 2); se encontraron %d niveles" -#: variable.c:543 +#: variable.c:542 #, c-format msgid "pointer to pointer is not supported for this data type" msgstr "los punteros a puntero no están soportados para este tipo de dato" -#: variable.c:563 +#: variable.c:562 #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "los arrays multidimensionales para estructuras no están soportados" diff --git a/src/interfaces/ecpg/preproc/po/fr.po b/src/interfaces/ecpg/preproc/po/fr.po index ca4aa527eea65..6d841e85359fd 100644 --- a/src/interfaces/ecpg/preproc/po/fr.po +++ b/src/interfaces/ecpg/preproc/po/fr.po @@ -9,10 +9,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-12 05:16+0000\n" -"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"POT-Creation-Date: 2024-07-20 21:10+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -20,44 +20,44 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" #: descriptor.c:64 #, c-format msgid "variable \"%s\" must have a numeric type" msgstr "la variable « %s » doit avoir un type numeric" -#: descriptor.c:125 descriptor.c:156 +#: descriptor.c:124 descriptor.c:155 #, c-format msgid "descriptor %s bound to connection %s does not exist" msgstr "le descripteur %s lié à la connexion %s n'existe pas" -#: descriptor.c:127 descriptor.c:158 +#: descriptor.c:126 descriptor.c:157 #, c-format msgid "descriptor %s bound to the default connection does not exist" msgstr "le descripteur %s lié à la connexion par défaut n'existe pas" -#: descriptor.c:173 descriptor.c:225 +#: descriptor.c:172 descriptor.c:224 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "l'élément d'en-tête du descripteur « %d » n'existe pas" -#: descriptor.c:195 +#: descriptor.c:194 #, c-format msgid "nullable is always 1" msgstr "nullable vaut toujours 1" -#: descriptor.c:198 +#: descriptor.c:197 #, c-format msgid "key_member is always 0" msgstr "key_member vaut toujours 0" -#: descriptor.c:292 +#: descriptor.c:291 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "l'élément du descripteur « %s » n'est pas implanté" -#: descriptor.c:302 +#: descriptor.c:301 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "l'élément du descripteur « %s » ne peut pas être initialisé" @@ -192,179 +192,179 @@ msgstr "" msgid "%s home page: <%s>\n" msgstr "Page d'accueil de %s : <%s>\n" -#: ecpg.c:141 +#: ecpg.c:152 #, c-format msgid "%s: could not locate my own executable path\n" msgstr "%s : n'a pas pu localiser le chemin de mon propre exécutable\n" -#: ecpg.c:176 ecpg.c:333 ecpg.c:344 -#, c-format -msgid "%s: could not open file \"%s\": %s\n" -msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n" - -#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 +#: ecpg.c:195 ecpg.c:246 ecpg.c:260 ecpg.c:286 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Essayer « %s --help » pour plus d'informations.\n" -#: ecpg.c:243 +#: ecpg.c:203 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s : support de débogage de l'analyseur (-d) non disponible\n" -#: ecpg.c:262 +#: ecpg.c:230 ecpg.c:345 ecpg.c:356 +#, c-format +msgid "%s: could not open file \"%s\": %m\n" +msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %m\n" + +#: ecpg.c:274 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, le préprocesseur C embarqué de PostgreSQL, version %s\n" -#: ecpg.c:264 +#: ecpg.c:276 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "la recherche EXEC SQL INCLUDE ... commence ici :\n" -#: ecpg.c:267 +#: ecpg.c:279 #, c-format msgid "end of search list\n" msgstr "fin de la liste de recherche\n" -#: ecpg.c:273 +#: ecpg.c:285 #, c-format msgid "%s: no input files specified\n" msgstr "%s : aucun fichier précisé en entrée\n" -#: ecpg.c:477 +#: ecpg.c:491 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "le curseur « %s » est déclaré mais non ouvert" -#: ecpg.c:490 preproc.y:130 +#: ecpg.c:504 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "n'a pas pu supprimer le fichier « %s » en sortie\n" -#: pgc.l:508 +#: pgc.l:528 #, c-format msgid "unterminated /* comment" msgstr "commentaire /* non terminé" -#: pgc.l:525 +#: pgc.l:545 #, c-format msgid "unterminated bit string literal" -msgstr "chaîne bit litéral non terminée" +msgstr "chaîne bit littéral non terminée" -#: pgc.l:533 +#: pgc.l:553 #, c-format msgid "unterminated hexadecimal string literal" -msgstr "chaîne hexadécimale litérale non terminée" +msgstr "chaîne hexadécimale littérale non terminée" -#: pgc.l:608 +#: pgc.l:628 #, c-format msgid "invalid bit string literal" -msgstr "chaîne bit litéral invalide" +msgstr "chaîne bit littéral invalide" -#: pgc.l:613 +#: pgc.l:633 #, c-format msgid "invalid hexadecimal string literal" msgstr "chaîne hexadécimale invalide" -#: pgc.l:631 +#: pgc.l:651 #, c-format msgid "unhandled previous state in xqs\n" msgstr "état précédent non géré dans xqs\n" -#: pgc.l:657 pgc.l:766 +#: pgc.l:677 pgc.l:786 #, c-format msgid "unterminated quoted string" msgstr "chaîne entre guillemets non terminée" -#: pgc.l:708 +#: pgc.l:728 #, c-format msgid "unterminated dollar-quoted string" msgstr "chaîne entre guillemets dollars non terminée" -#: pgc.l:726 pgc.l:746 +#: pgc.l:746 pgc.l:766 #, c-format msgid "zero-length delimited identifier" msgstr "identifiant délimité de longueur nulle" -#: pgc.l:757 +#: pgc.l:777 #, c-format msgid "unterminated quoted identifier" msgstr "identifiant entre guillemets non terminé" -#: pgc.l:926 +#: pgc.l:946 #, c-format msgid "trailing junk after parameter" msgstr "élément indésirable après le paramètre" -#: pgc.l:968 pgc.l:971 pgc.l:974 +#: pgc.l:998 pgc.l:1001 pgc.l:1004 pgc.l:1007 pgc.l:1010 pgc.l:1013 #, c-format msgid "trailing junk after numeric literal" msgstr "élément indésirable après la valeur numérique" -#: pgc.l:1100 +#: pgc.l:1136 #, c-format msgid "nested /* ... */ comments" msgstr "commentaires /* ... */ imbriqués" -#: pgc.l:1193 +#: pgc.l:1235 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "identifiant manquant dans la commande EXEC SQL UNDEF" -#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 +#: pgc.l:1253 pgc.l:1266 pgc.l:1282 pgc.l:1295 #, c-format msgid "too many nested EXEC SQL IFDEF conditions" msgstr "trop de conditions EXEC SQL IFDEF imbriquées" -#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 +#: pgc.l:1311 pgc.l:1322 pgc.l:1337 pgc.l:1359 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "correspondance manquante « EXEC SQL IFDEF » / « EXEC SQL IFNDEF »" -#: pgc.l:1271 pgc.l:1282 pgc.l:1463 +#: pgc.l:1313 pgc.l:1324 pgc.l:1517 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "« EXEC SQL ENDIF; » manquant" -#: pgc.l:1297 pgc.l:1319 +#: pgc.l:1339 pgc.l:1361 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "plusieurs EXEC SQL ELSE" -#: pgc.l:1342 pgc.l:1356 +#: pgc.l:1384 pgc.l:1398 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "EXEC SQL ENDIF différent" -#: pgc.l:1411 +#: pgc.l:1459 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "identifiant manquant dans la commande EXEC SQL IFDEF" -#: pgc.l:1420 +#: pgc.l:1468 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "identifiant manquant dans la commande EXEC SQL DEFINE" -#: pgc.l:1453 +#: pgc.l:1506 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "erreur de syntaxe dans la commande EXEC SQL INCLUDE" -#: pgc.l:1503 +#: pgc.l:1561 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "erreur interne : l'état ne peut être atteint ; merci de rapporter ceci à <%s>" -#: pgc.l:1655 +#: pgc.l:1713 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "" "Erreur : le chemin d'en-tête « %s/%s » est trop long sur la ligne %d,\n" "ignoré\n" -#: pgc.l:1678 +#: pgc.l:1736 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "n'a pas pu ouvrir le fichier d'en-tête « %s » sur la ligne %d" @@ -398,12 +398,12 @@ msgstr "initialiseur non autorisé dans la définition du type" msgid "type name \"string\" is reserved in Informix mode" msgstr "le nom du type « string » est réservé dans le mode Informix" -#: preproc.y:552 preproc.y:19317 +#: preproc.y:552 preproc.y:19072 #, c-format msgid "type \"%s\" is already defined" msgstr "le type « %s » est déjà défini" -#: preproc.y:577 preproc.y:19952 preproc.y:20277 variable.c:621 +#: preproc.y:577 preproc.y:19707 preproc.y:20029 variable.c:625 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "" @@ -415,186 +415,180 @@ msgstr "" msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "la connexion %s est surchargée avec %s par l'instruction DECLARE %s" -#: preproc.y:1872 +#: preproc.y:1833 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "option AT non autorisée dans une instruction CLOSE DATABASE" -#: preproc.y:2122 +#: preproc.y:2083 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "option AT non autorisée dans une instruction CONNECT" -#: preproc.y:2162 +#: preproc.y:2123 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "option AT non autorisée dans une instruction DISCONNECT" -#: preproc.y:2217 +#: preproc.y:2178 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "option AT non autorisée dans une instruction SET CONNECTION" -#: preproc.y:2239 +#: preproc.y:2200 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "option AT non autorisée dans une instruction TYPE" -#: preproc.y:2248 +#: preproc.y:2209 #, c-format msgid "AT option not allowed in VAR statement" msgstr "option AT non autorisée dans une instruction VAR" -#: preproc.y:2255 +#: preproc.y:2216 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "option AT non autorisée dans une instruction WHENEVER" -#: preproc.y:2332 preproc.y:2504 preproc.y:2509 preproc.y:2632 preproc.y:4283 preproc.y:4357 -#: preproc.y:4948 preproc.y:5481 preproc.y:5819 preproc.y:6119 preproc.y:7687 preproc.y:9288 -#: preproc.y:9293 preproc.y:12272 +#: preproc.y:2341 preproc.y:2628 preproc.y:4379 preproc.y:5043 preproc.y:5913 preproc.y:6117 +#: preproc.y:6218 preproc.y:12482 #, c-format msgid "unsupported feature will be passed to server" msgstr "la fonctionnalité non supportée sera passée au serveur" -#: preproc.y:2890 +#: preproc.y:2886 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL n'est pas implanté" -#: preproc.y:3589 +#: preproc.y:3626 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN n'est pas implanté" -#: preproc.y:10335 preproc.y:18892 +#: preproc.y:10466 preproc.y:18541 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "« database » ne peut pas être utilisé comme nom de curseur dans le mode INFORMIX" -#: preproc.y:10342 preproc.y:18902 +#: preproc.y:10473 preproc.y:18551 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "" "l'utilisation de la variable « %s » dans différentes instructions de déclaration\n" "n'est pas supportée" -#: preproc.y:10344 preproc.y:18904 +#: preproc.y:10475 preproc.y:18553 #, c-format msgid "cursor \"%s\" is already defined" msgstr "le curseur « %s » est déjà défini" -#: preproc.y:10818 +#: preproc.y:10949 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "la syntaxe obsolète LIMIT #,# a été passée au serveur" -#: preproc.y:11151 preproc.y:11158 -#, c-format -msgid "subquery in FROM must have an alias" -msgstr "la sous-requête du FROM doit avoir un alias" - -#: preproc.y:18584 preproc.y:18591 +#: preproc.y:18233 preproc.y:18240 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS ne peut pas indiquer INTO" -#: preproc.y:18627 +#: preproc.y:18276 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "« @ » attendu, « %s » trouvé" -#: preproc.y:18639 +#: preproc.y:18288 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "" "seuls les protocoles « tcp » et « unix » et les types de base de données\n" "« postgresql » sont supportés" -#: preproc.y:18642 +#: preproc.y:18291 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "« :// » attendu, « %s » trouvé" -#: preproc.y:18647 +#: preproc.y:18296 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "les sockets de domaine Unix fonctionnent seulement sur « localhost », mais pas sur « %s »" -#: preproc.y:18673 +#: preproc.y:18322 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "« postgresql » attendu, « %s » trouvé" -#: preproc.y:18676 +#: preproc.y:18325 #, c-format msgid "invalid connection type: %s" msgstr "type de connexion invalide : %s" -#: preproc.y:18685 +#: preproc.y:18334 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "« @ » ou « :// » attendu, « %s » trouvé" -#: preproc.y:18760 preproc.y:18778 +#: preproc.y:18409 preproc.y:18427 #, c-format msgid "invalid data type" msgstr "type de données invalide" -#: preproc.y:18789 preproc.y:18806 +#: preproc.y:18438 preproc.y:18455 #, c-format msgid "incomplete statement" msgstr "instruction incomplète" -#: preproc.y:18792 preproc.y:18809 +#: preproc.y:18441 preproc.y:18458 #, c-format msgid "unrecognized token \"%s\"" msgstr "jeton « %s » non reconnu" -#: preproc.y:18854 +#: preproc.y:18503 #, c-format msgid "name \"%s\" is already declared" msgstr "le nom « %s » est déjà défini" -#: preproc.y:19120 +#: preproc.y:18792 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "" "seuls les types de données numeric et decimal ont des arguments de\n" "précision et d'échelle" -#: preproc.y:19132 +#: preproc.y:18891 #, c-format msgid "interval specification not allowed here" msgstr "interval de spécification non autorisé ici" -#: preproc.y:19292 preproc.y:19344 +#: preproc.y:19047 preproc.y:19099 #, c-format msgid "too many levels in nested structure/union definition" msgstr "trop de niveaux dans la définition de structure/union imbriquée" -#: preproc.y:19467 +#: preproc.y:19222 #, c-format msgid "pointers to varchar are not implemented" msgstr "les pointeurs sur des chaînes de caractères (varchar) ne sont pas implantés" -#: preproc.y:19918 +#: preproc.y:19673 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "initialiseur non autorisé dans la commande EXEC SQL VAR" -#: preproc.y:20235 +#: preproc.y:19987 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "les tableaux d'indicateurs ne sont pas autorisés en entrée" -#: preproc.y:20422 +#: preproc.y:20174 #, c-format msgid "operator not allowed in variable definition" msgstr "opérateur non autorisé dans la définition de la variable" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:20463 +#: preproc.y:20215 #, c-format msgid "%s at or near \"%s\"" msgstr "%s sur ou près de « %s »" @@ -668,52 +662,52 @@ msgstr "le struct indicateur « %s » a trop de membres" msgid "unrecognized descriptor item code %d" msgstr "code %d de l'élément du descripteur non reconnu" -#: variable.c:89 variable.c:116 +#: variable.c:89 variable.c:115 #, c-format msgid "incorrectly formed variable \"%s\"" msgstr "variable « %s » mal formée" -#: variable.c:139 +#: variable.c:138 #, c-format msgid "variable \"%s\" is not a pointer" msgstr "la variable « %s » n'est pas un pointeur" -#: variable.c:142 variable.c:167 +#: variable.c:141 variable.c:166 #, c-format msgid "variable \"%s\" is not a pointer to a structure or a union" msgstr "la variable « %s » n'est pas un pointeur vers une structure ou une union" -#: variable.c:154 +#: variable.c:153 #, c-format msgid "variable \"%s\" is neither a structure nor a union" msgstr "la variable « %s » n'est ni une structure ni une union" -#: variable.c:164 +#: variable.c:163 #, c-format msgid "variable \"%s\" is not an array" msgstr "la variable « %s » n'est pas un tableau" -#: variable.c:233 variable.c:255 +#: variable.c:232 variable.c:254 #, c-format msgid "variable \"%s\" is not declared" msgstr "la variable « %s » n'est pas déclarée" -#: variable.c:494 +#: variable.c:493 #, c-format msgid "indicator variable must have an integer type" msgstr "la variable d'indicateur doit avoir un type integer" -#: variable.c:506 +#: variable.c:510 #, c-format msgid "unrecognized data type name \"%s\"" msgstr "nom « %s » non reconnu pour un type de données" -#: variable.c:517 variable.c:525 variable.c:542 variable.c:545 +#: variable.c:521 variable.c:529 variable.c:546 variable.c:549 #, c-format msgid "multidimensional arrays are not supported" msgstr "les tableaux multidimensionnels ne sont pas supportés" -#: variable.c:534 +#: variable.c:538 #, c-format msgid "multilevel pointers (more than 2 levels) are not supported; found %d level" msgid_plural "multilevel pointers (more than 2 levels) are not supported; found %d levels" @@ -724,46 +718,12 @@ msgstr[1] "" "les pointeurs multi-niveaux (plus de deux) ne sont pas supportés :\n" "%d niveaux trouvés" -#: variable.c:539 +#: variable.c:543 #, c-format msgid "pointer to pointer is not supported for this data type" msgstr "ce type de données ne supporte pas les pointeurs de pointeur" -#: variable.c:559 +#: variable.c:563 #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "les tableaux multidimensionnels ne sont pas supportés pour les structures" - -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "Rapporter les bogues à .\n" - -#~ msgid " --version output version information, then exit\n" -#~ msgstr " --version affiche la version et quitte\n" - -#~ msgid "AT option not allowed in DEALLOCATE statement" -#~ msgstr "option AT non autorisée dans une instruction DEALLOCATE" - -#~ msgid "COPY FROM STDOUT is not possible" -#~ msgstr "COPY FROM STDOUT n'est pas possible" - -#~ msgid "COPY TO STDIN is not possible" -#~ msgstr "COPY TO STDIN n'est pas possible" - -#~ msgid "NEW used in query that is not in a rule" -#~ msgstr "NEW utilisé dans une requête qui n'est pas dans une règle" - -#~ msgid "OLD used in query that is not in a rule" -#~ msgstr "OLD utilisé dans une requête qui n'est pas dans une règle" - -#~ msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" -#~ msgstr "une contrainte déclarée INITIALLY DEFERRED doit être DEFERRABLE" - -#~ msgid "declared name %s is already defined" -#~ msgstr "le nom déclaré %s est déjà défini" - -#~ msgid "using unsupported DESCRIBE statement" -#~ msgstr "utilisation de l'instruction DESCRIBE non supporté" diff --git a/src/interfaces/ecpg/preproc/po/ja.po b/src/interfaces/ecpg/preproc/po/ja.po index f0862f9a001a1..df2902110f9a4 100644 --- a/src/interfaces/ecpg/preproc/po/ja.po +++ b/src/interfaces/ecpg/preproc/po/ja.po @@ -1,13 +1,13 @@ # Japanese message translation file for ecpg-preproc -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # msgid "" msgstr "" -"Project-Id-Version: ecpg (PostgreSQL 16)\n" +"Project-Id-Version: ecpg (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-14 10:48+0900\n" -"PO-Revision-Date: 2022-05-11 14:50+0900\n" +"POT-Creation-Date: 2025-02-28 10:05+0900\n" +"PO-Revision-Date: 2025-03-03 17:38+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" @@ -186,177 +186,177 @@ msgstr "" msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: ecpg.c:141 +#: ecpg.c:152 #, c-format msgid "%s: could not locate my own executable path\n" msgstr "%s: 自身ã®å®Ÿè¡Œãƒ•ァイルã®å ´æ‰€ãŒã‚ã‹ã‚Šã¾ã›ã‚“\n" -#: ecpg.c:176 ecpg.c:333 ecpg.c:344 -#, c-format -msgid "%s: could not open file \"%s\": %s\n" -msgstr "%s: ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\n" - -#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 +#: ecpg.c:195 ecpg.c:246 ecpg.c:260 ecpg.c:286 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "詳細ã¯\"%s --help\"を実行ã—ã¦ãã ã•ã„。\n" -#: ecpg.c:243 +#: ecpg.c:203 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: パーサデãƒãƒƒã‚°ã®ã‚µãƒãƒ¼ãƒˆ(-d)を利用ã§ãã¾ã›ã‚“\n" -#: ecpg.c:262 +#: ecpg.c:230 ecpg.c:345 ecpg.c:356 +#, c-format +msgid "%s: could not open file \"%s\": %m\n" +msgstr "%s: ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %m\n" + +#: ecpg.c:274 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, PostgreSQL埋込ã¿C言語プリプロセッサ, ãƒãƒ¼ã‚¸ãƒ§ãƒ³%s\n" -#: ecpg.c:264 +#: ecpg.c:276 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "EXEC SQL INCLUDE ... 検索ãŒå§‹ã¾ã‚Šã¾ã™\n" -#: ecpg.c:267 +#: ecpg.c:279 #, c-format msgid "end of search list\n" msgstr "検索リストã®çµ‚端ã§ã™\n" -#: ecpg.c:273 +#: ecpg.c:285 #, c-format msgid "%s: no input files specified\n" msgstr "%s: å…¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“\n" -#: ecpg.c:477 +#: ecpg.c:491 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "カーソル%sã¯å®£è¨€ã•れã¾ã—ãŸãŒã€ã‚ªãƒ¼ãƒ—ンã•れã¦ã„ã¾ã›ã‚“" -#: ecpg.c:490 preproc.y:130 +#: ecpg.c:504 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "出力ファイル\"%s\"を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ\n" -#: pgc.l:507 +#: pgc.l:542 #, c-format msgid "unterminated /* comment" msgstr "/*コメントãŒé–‰ã˜ã¦ã„ã¾ã›ã‚“" -#: pgc.l:524 +#: pgc.l:559 #, c-format msgid "unterminated bit string literal" msgstr "ビット文字列リテラルã®çµ‚端ãŒã‚りã¾ã›ã‚“" -#: pgc.l:532 +#: pgc.l:567 #, c-format msgid "unterminated hexadecimal string literal" msgstr "16進数文字列リテラルã®çµ‚端ãŒã‚りã¾ã›ã‚“" -#: pgc.l:607 +#: pgc.l:642 #, c-format msgid "invalid bit string literal" msgstr "無効ãªãƒ“ット列リテラルã§ã™" -#: pgc.l:612 +#: pgc.l:647 #, c-format msgid "invalid hexadecimal string literal" msgstr "䏿­£ãª16進数文字列リテラル" -#: pgc.l:630 +#: pgc.l:665 #, c-format msgid "unhandled previous state in xqs\n" msgstr "xqsã®ä¸­ã§å‡¦ç†ã•れãªã„å‰ã‚¹ãƒ†ãƒ¼ãƒˆ\n" -#: pgc.l:656 pgc.l:765 +#: pgc.l:691 pgc.l:800 #, c-format msgid "unterminated quoted string" msgstr "文字列ã®å¼•用符ãŒé–‰ã˜ã¦ã„ã¾ã›ã‚“" -#: pgc.l:707 +#: pgc.l:742 #, c-format msgid "unterminated dollar-quoted string" msgstr "文字列ã®ãƒ‰ãƒ«å¼•用符ãŒé–‰ã˜ã¦ã„ã¾ã›ã‚“" -#: pgc.l:725 pgc.l:745 +#: pgc.l:760 pgc.l:780 #, c-format msgid "zero-length delimited identifier" msgstr "区切りã¤ã識別å­ã®é•·ã•ãŒã‚¼ãƒ­ã§ã™" -#: pgc.l:756 +#: pgc.l:791 #, c-format msgid "unterminated quoted identifier" msgstr "識別å­ã®å¼•用符ãŒé–‰ã˜ã¦ã„ã¾ã›ã‚“" -#: pgc.l:925 +#: pgc.l:960 #, c-format msgid "trailing junk after parameter" msgstr "パラメータã®å¾Œã«ä½™åˆ†ãªæ–‡å­—" -#: pgc.l:967 pgc.l:970 pgc.l:973 +#: pgc.l:1012 pgc.l:1015 pgc.l:1018 #, c-format msgid "trailing junk after numeric literal" msgstr "数値リテラルã®å¾Œã‚ã«ã‚´ãƒŸãŒã‚りã¾ã™" -#: pgc.l:1108 +#: pgc.l:1141 #, c-format msgid "nested /* ... */ comments" msgstr "入れå­çŠ¶ã® /* ... */ コメント" -#: pgc.l:1201 +#: pgc.l:1240 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "EXEC SQL UNDEFコマンドã«ãŠã„ã¦è­˜åˆ¥å­ãŒã‚りã¾ã›ã‚“" -#: pgc.l:1219 pgc.l:1232 pgc.l:1248 pgc.l:1261 +#: pgc.l:1258 pgc.l:1271 pgc.l:1287 pgc.l:1300 #, c-format msgid "too many nested EXEC SQL IFDEF conditions" msgstr "入れå­çжã®EXEC SQL IFDEFæ¡ä»¶ãŒå¤šã™ãŽã¾ã™" -#: pgc.l:1277 pgc.l:1288 pgc.l:1303 pgc.l:1325 +#: pgc.l:1316 pgc.l:1327 pgc.l:1342 pgc.l:1364 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "対応ã™ã‚‹\"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"ãŒã‚りã¾ã›ã‚“" -#: pgc.l:1279 pgc.l:1290 pgc.l:1471 +#: pgc.l:1318 pgc.l:1329 pgc.l:1522 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "\"EXEC SQL ENDIF;\"ãŒã‚りã¾ã›ã‚“" -#: pgc.l:1305 pgc.l:1327 +#: pgc.l:1344 pgc.l:1366 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "1ã¤ä»¥ä¸Šã®EXEC SQL ELSE\"ãŒå­˜åœ¨ã—ã¾ã™" -#: pgc.l:1350 pgc.l:1364 +#: pgc.l:1389 pgc.l:1403 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "EXEC SQL ENDIFã«å¯¾å¿œã™ã‚‹ã‚‚ã®ãŒã‚りã¾ã›ã‚“" -#: pgc.l:1419 +#: pgc.l:1464 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "EXEC SQL IFDEFコマンドã«ãŠã„ã¦è­˜åˆ¥å­ãŒã‚りã¾ã›ã‚“" -#: pgc.l:1428 +#: pgc.l:1473 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "EXEC SQL DEFINEコマンドã«ãŠã„ã¦è­˜åˆ¥å­ãŒã‚りã¾ã›ã‚“" -#: pgc.l:1461 +#: pgc.l:1511 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "EXEC SQL INCLUDEコマンドã«ãŠã„ã¦æ§‹æ–‡ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã™" -#: pgc.l:1511 +#: pgc.l:1566 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "内部エラー: 到é”ã—ãªã„ã¯ãšã®çŠ¶æ…‹ã§ã™ã€‚<%s>ã¾ã§å ±å‘Šã—ã¦ãã ã•ã„" -#: pgc.l:1664 +#: pgc.l:1718 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "エラー:行番å·%3$dã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ãƒ‘ス\"%1$s/%2$s\"ãŒé•·ã™ãŽã¾ã™ã€‚無視ã—ã¾ã—ãŸã€‚\n" -#: pgc.l:1687 +#: pgc.l:1741 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "行番å·%2$dã®ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ãƒ•ァイル\"%1$s\"をオープンã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸ" @@ -390,12 +390,12 @@ msgstr "型定義ã§ã¯åˆæœŸåŒ–å­ã¯è¨±ã•れã¾ã›ã‚“" msgid "type name \"string\" is reserved in Informix mode" msgstr "åž‹å\"string\"ã¯Informixモードã§ã™ã§ã«äºˆç´„ã•れã¦ã„ã¾ã™" -#: preproc.y:552 preproc.y:19420 +#: preproc.y:552 preproc.y:19034 #, c-format msgid "type \"%s\" is already defined" msgstr "\"%s\"åž‹ã¯ã™ã§ã«å®šç¾©ã•れã¦ã„ã¾ã™" -#: preproc.y:577 preproc.y:20055 preproc.y:20377 variable.c:626 +#: preproc.y:577 preproc.y:19669 preproc.y:19991 variable.c:624 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "å˜ç´”ãªãƒ‡ãƒ¼ã‚¿åž‹ã®å¤šæ¬¡å…ƒé…列ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" @@ -405,180 +405,174 @@ msgstr "å˜ç´”ãªãƒ‡ãƒ¼ã‚¿åž‹ã®å¤šæ¬¡å…ƒé…列ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã› msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "DECLAREæ–‡%3$sã«ã‚ˆã‚ŠæŽ¥ç¶š%1$sã¯%2$sã§ä¸Šæ›¸ãã•れã¾ã™" -#: preproc.y:1871 +#: preproc.y:1831 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "CLOSE DATABASEæ–‡ã§ã¯ATオプションã¯è¨±ã•れã¾ã›ã‚“" -#: preproc.y:2121 +#: preproc.y:2081 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "CONNECTæ–‡ã§ã¯ATオプションã¯è¨±ã•れã¾ã›ã‚“" -#: preproc.y:2161 +#: preproc.y:2121 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "DISCONNECTæ–‡ã§ã¯ATオプションã¯è¨±ã•れã¾ã›ã‚“" -#: preproc.y:2216 +#: preproc.y:2176 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "SET CONNECTIONæ–‡ã§ã¯ATオプションã¯è¨±ã•れã¾ã›ã‚“" -#: preproc.y:2238 +#: preproc.y:2198 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "TYPEæ–‡ã§ã¯ATオプションã¯è¨±ã•れã¾ã›ã‚“" -#: preproc.y:2247 +#: preproc.y:2207 #, c-format msgid "AT option not allowed in VAR statement" msgstr "VARæ–‡ã§ã¯ATオプションã¯è¨±ã•れã¾ã›ã‚“" -#: preproc.y:2254 +#: preproc.y:2214 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "WHENEVERæ–‡ã§ã¯ATオプションã¯è¨±ã•れã¾ã›ã‚“" -#: preproc.y:2331 preproc.y:2503 preproc.y:2508 preproc.y:2631 preproc.y:4282 -#: preproc.y:4356 preproc.y:4947 preproc.y:5480 preproc.y:5818 preproc.y:6118 -#: preproc.y:7686 preproc.y:9287 preproc.y:9292 preproc.y:12271 +#: preproc.y:2339 preproc.y:2626 preproc.y:4349 preproc.y:5021 preproc.y:5891 +#: preproc.y:6095 preproc.y:6196 preproc.y:12460 #, c-format msgid "unsupported feature will be passed to server" msgstr "éžã‚µãƒãƒ¼ãƒˆã®æ©Ÿèƒ½ãŒã‚µãƒ¼ãƒãƒ¼ã«æ¸¡ã•れã¾ã™" -#: preproc.y:2889 +#: preproc.y:2884 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALLã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: preproc.y:3588 +#: preproc.y:3596 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDINã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: preproc.y:10334 preproc.y:18891 +#: preproc.y:10444 preproc.y:18503 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "INFORMIXモードã§ã¯\"database\"をカーソルåã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: preproc.y:10341 preproc.y:18901 +#: preproc.y:10451 preproc.y:18513 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "ç•°ãªã£ãŸdeclareステートメントã«ãŠã‘る変数\"%s\"ã®ä½¿ç”¨ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: preproc.y:10343 preproc.y:18903 +#: preproc.y:10453 preproc.y:18515 #, c-format msgid "cursor \"%s\" is already defined" msgstr "カーソル\"%s\"ã¯ã™ã§ã«å®šç¾©ã•れã¦ã„ã¾ã™" -#: preproc.y:10817 +#: preproc.y:10927 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "サーãƒãƒ¼ã«æ¸¡ã•れるLIMIT #,#æ§‹æ–‡ã¯ã‚‚ã¯ã‚„サãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: preproc.y:11150 preproc.y:11157 -#, c-format -msgid "subquery in FROM must have an alias" -msgstr "FROMå¥ã®å‰¯å•ã„åˆã‚ã›ã¯åˆ¥åã‚’æŒãŸãªã‘れã°ãªã‚Šã¾ã›ã‚“" - -#: preproc.y:18583 preproc.y:18590 +#: preproc.y:18195 preproc.y:18202 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE ASã¯INTOを指定ã§ãã¾ã›ã‚“" -#: preproc.y:18626 +#: preproc.y:18238 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "想定ã§ã¯\"@\"ã€çµæžœã§ã¯\"%s\"" -#: preproc.y:18638 +#: preproc.y:18250 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "プロトコルã§ã¯\"tcp\"ãŠã‚ˆã³\"unix\"ã®ã¿ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã®ç¨®é¡žã§ã¯\"postgresql\"ã®ã¿ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™" -#: preproc.y:18641 +#: preproc.y:18253 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "想定ã§ã¯\"://\"ã€çµæžœã§ã¯\"%s\"" -#: preproc.y:18646 +#: preproc.y:18258 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unixドメインソケットã¯\"localhost\"ã§ã®ã¿ã§å‹•作ã—ã€\"%s\"ã§ã¯å‹•作ã—ã¾ã›ã‚“" -#: preproc.y:18672 +#: preproc.y:18284 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "想定ã§ã¯\"postgresql\"ã€çµæžœã§ã¯\"%s\"" -#: preproc.y:18675 +#: preproc.y:18287 #, c-format msgid "invalid connection type: %s" msgstr "ç„¡åŠ¹ãªæŽ¥ç¶šç¨®é¡ž: %s" -#: preproc.y:18684 +#: preproc.y:18296 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "想定ã§ã¯\"@ã¾ãŸã¯\"\"://\"ã€çµæžœã§ã¯\"%s\"" -#: preproc.y:18759 preproc.y:18777 +#: preproc.y:18371 preproc.y:18389 #, c-format msgid "invalid data type" msgstr "無効ãªãƒ‡ãƒ¼ã‚¿åž‹" -#: preproc.y:18788 preproc.y:18805 +#: preproc.y:18400 preproc.y:18417 #, c-format msgid "incomplete statement" msgstr "ä¸å®Œå…¨ãªæ–‡" -#: preproc.y:18791 preproc.y:18808 +#: preproc.y:18403 preproc.y:18420 #, c-format msgid "unrecognized token \"%s\"" msgstr "èªè­˜ã§ããªã„トークン\"%s\"" -#: preproc.y:18853 +#: preproc.y:18465 #, c-format msgid "name \"%s\" is already declared" msgstr "åå‰\"%s\"ã¯ã™ã§ã«å®šç¾©ã•れã¦ã„ã¾ã™" -#: preproc.y:19140 +#: preproc.y:18754 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "数値データ型ã¾ãŸã¯10進数データ型ã®ã¿ãŒç²¾åº¦/ä½å–り引数ã¨å–ã‚‹ã“ã¨ãŒã§ãã¾ã™" -#: preproc.y:19239 +#: preproc.y:18853 #, c-format msgid "interval specification not allowed here" msgstr "æ™‚é–“é–“éš”ã®æŒ‡å®šã¯ã“ã“ã§ã¯è¨±ã•れã¾ã›ã‚“" -#: preproc.y:19395 preproc.y:19447 +#: preproc.y:19009 preproc.y:19061 #, c-format msgid "too many levels in nested structure/union definition" msgstr "構造体/ユニオンã®å®šç¾©ã®å…¥ã‚Œå­ãƒ¬ãƒ™ãƒ«ãŒæ·±ã™ãŽã¾ã™" -#: preproc.y:19570 +#: preproc.y:19184 #, c-format msgid "pointers to varchar are not implemented" msgstr "varcharを指ã—示ã™ãƒã‚¤ãƒ³ã‚¿ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: preproc.y:20021 +#: preproc.y:19635 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "EXEC SQL VARコマンドã§ã¯åˆæœŸåŒ–å­ã¯è¨±ã•れã¾ã›ã‚“" -#: preproc.y:20335 +#: preproc.y:19949 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "指示å­é…列ã¯å…¥åŠ›ã¨ã—ã¦è¨±ã•れã¾ã›ã‚“" -#: preproc.y:20522 +#: preproc.y:20136 #, c-format msgid "operator not allowed in variable definition" msgstr "変数定義ã§ã¯æ¼”ç®—å­ã¯è¨±ã•れã¾ã›ã‚“" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:20563 +#: preproc.y:20177 #, c-format msgid "%s at or near \"%s\"" msgstr "\"%2$s\"ã¾ãŸã¯ãã®è¿‘辺ã§%1$s" @@ -648,80 +642,69 @@ msgstr "æŒ‡ç¤ºå­æ§‹é€ ä½“\"%s\"ã®ãƒ¡ãƒ³ãƒãŒå¤šã™ãŽã¾ã™" msgid "unrecognized descriptor item code %d" msgstr "èªè­˜ã§ããªã„記述å­é …目コード%dã§ã™" -#: variable.c:89 variable.c:116 +#: variable.c:89 variable.c:115 #, c-format msgid "incorrectly formed variable \"%s\"" msgstr "æ­£ã—ãæˆå½¢ã•れã¦ã„ãªã„変数\"%s\"ã§ã™" -#: variable.c:139 +#: variable.c:138 #, c-format msgid "variable \"%s\" is not a pointer" msgstr "変数\"%s\"ã¯ãƒã‚¤ãƒ³ã‚¿ã§ã¯ã‚りã¾ã›ã‚“" -#: variable.c:142 variable.c:167 +#: variable.c:141 variable.c:166 #, c-format msgid "variable \"%s\" is not a pointer to a structure or a union" msgstr "変数\"%s\"ã¯æ§‹é€ ä½“ã¾ãŸã¯ãƒ¦ãƒ‹ã‚ªãƒ³ã‚’指ã—示ã™ãƒã‚¤ãƒ³ã‚¿ã§ã¯ã‚りã¾ã›ã‚“" -#: variable.c:154 +#: variable.c:153 #, c-format msgid "variable \"%s\" is neither a structure nor a union" msgstr "変数\"%s\"ã¯æ§‹é€ ä½“ã§ã‚‚ユニオンã§ã‚‚ã‚りã¾ã›ã‚“" -#: variable.c:164 +#: variable.c:163 #, c-format msgid "variable \"%s\" is not an array" msgstr "変数\"%s\"ã¯é…列ã§ã¯ã‚りã¾ã›ã‚“" -#: variable.c:233 variable.c:255 +#: variable.c:232 variable.c:254 #, c-format msgid "variable \"%s\" is not declared" msgstr "変数\"%s\"ã¯å®£è¨€ã•れã¦ã„ã¾ã›ã‚“" -#: variable.c:494 +#: variable.c:492 #, c-format msgid "indicator variable must have an integer type" msgstr "指示å­å¤‰æ•°ã¯æ•´æ•°åž‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: variable.c:511 +#: variable.c:509 #, c-format msgid "unrecognized data type name \"%s\"" msgstr "データ型å\"%s\"ã¯èªè­˜ã§ãã¾ã›ã‚“" -#: variable.c:522 variable.c:530 variable.c:547 variable.c:550 +#: variable.c:520 variable.c:528 variable.c:545 variable.c:548 #, c-format msgid "multidimensional arrays are not supported" msgstr "多次元é…列ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" -#: variable.c:539 +#: variable.c:537 #, c-format msgid "multilevel pointers (more than 2 levels) are not supported; found %d level" msgid_plural "multilevel pointers (more than 2 levels) are not supported; found %d levels" msgstr[0] "複数レベルã®ãƒã‚¤ãƒ³ã‚¿ï¼ˆ2レベル以上)ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。%dレベルã‚りã¾ã™" -#: variable.c:544 +#: variable.c:542 #, c-format msgid "pointer to pointer is not supported for this data type" msgstr "ã“ã®ãƒ‡ãƒ¼ã‚¿åž‹ã§ã¯ã€ãƒã‚¤ãƒ³ã‚¿ã‚’指ã—示ã™ãƒã‚¤ãƒ³ã‚¿ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: variable.c:564 +#: variable.c:562 #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "構造体ã®å¤šæ¬¡å…ƒé…列ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "ä¸å…·åˆã¯ã¾ã§å ±å‘Šã—ã¦ãã ã•ã„。\n" - -#~ msgid "using unsupported DESCRIBE statement" -#~ msgstr "未サãƒãƒ¼ãƒˆã®DESCRIBEæ–‡ã®ä½¿ç”¨" - -#~ msgid "" -#~ "\n" -#~ "Report bugs to .\n" -#~ msgstr "" -#~ "\n" -#~ "ä¸å…·åˆã¯ã«å ±å‘Šã—ã¦ãã ã•ã„。\n" +#~ msgid "parameter number too large" +#~ msgstr "パラメータ数ãŒå¤šã™ãŽã¾ã™" + +#~ msgid "unmatched brace in variable \"%s\"" +#~ msgstr "変数\"%s\"ã«é–‰ã˜ã‚‰ã‚Œã¦ã„ãªã„ブレースãŒã‚りã¾ã™" diff --git a/src/interfaces/ecpg/preproc/po/ka.po b/src/interfaces/ecpg/preproc/po/ka.po index 6399849fe4f51..604fb6758bd4d 100644 --- a/src/interfaces/ecpg/preproc/po/ka.po +++ b/src/interfaces/ecpg/preproc/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: ecpg (PostgreSQL) 15\n" +"Project-Id-Version: ecpg (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-02 04:39+0000\n" -"PO-Revision-Date: 2022-07-13 13:13+0200\n" +"POT-Creation-Date: 2024-03-13 00:40+0000\n" +"PO-Revision-Date: 2024-03-13 02:00+0100\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,44 +16,44 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.1.1\n" +"X-Generator: Poedit 3.3.2\n" #: descriptor.c:64 #, c-format msgid "variable \"%s\" must have a numeric type" msgstr "ცვლáƒáƒ“ \"%s\"-ს რიცხვáƒáƒ‘რივი ტიპი უნდრგáƒáƒáƒ©áƒœáƒ“ეს" -#: descriptor.c:125 descriptor.c:156 +#: descriptor.c:124 descriptor.c:155 #, c-format msgid "descriptor %s bound to connection %s does not exist" msgstr "დესკრიპტáƒáƒ áƒ˜ %s მიბმულირშეერთებáƒáƒ–ე %s, áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: descriptor.c:127 descriptor.c:158 +#: descriptor.c:126 descriptor.c:157 #, c-format msgid "descriptor %s bound to the default connection does not exist" msgstr "ნáƒáƒ’ულისხმებ შეერთებáƒáƒ–ე მიბმული დესკრიპტáƒáƒ áƒ˜ (\"%s\") áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: descriptor.c:173 descriptor.c:225 +#: descriptor.c:172 descriptor.c:224 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "დესკრიპტáƒáƒ áƒ˜áƒ¡ თáƒáƒ•სáƒáƒ áƒ—ის ჩáƒáƒœáƒáƒ¬áƒ”რი \"%d\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: descriptor.c:195 +#: descriptor.c:194 #, c-format msgid "nullable is always 1" msgstr "გáƒáƒœáƒ£áƒšáƒ”ბáƒáƒ“ი ყáƒáƒ•ელთვის 1-ს უდრის" -#: descriptor.c:198 +#: descriptor.c:197 #, c-format msgid "key_member is always 0" msgstr "key_member ყáƒáƒ•ელთვის 0-ს უდრის" -#: descriptor.c:292 +#: descriptor.c:291 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "დესკრიპტáƒáƒ áƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რი \"%s\" გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" -#: descriptor.c:302 +#: descriptor.c:301 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "დესკრიპტáƒáƒ áƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რის (\"%s\") დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ" @@ -64,8 +64,7 @@ msgid "" "%s is the PostgreSQL embedded SQL preprocessor for C programs.\n" "\n" msgstr "" -"%s PostgreSQL-ში ჩáƒáƒ¨áƒ”ნებული SQL პრეპრáƒáƒªáƒ”სáƒáƒ áƒ˜áƒ C-ზე დáƒáƒ¬áƒ”რილი " -"პრáƒáƒ’რáƒáƒ›áƒ”ბისთვის.\n" +"%s PostgreSQL-ში ჩáƒáƒ¨áƒ”ნებული SQL პრეპრáƒáƒªáƒ”სáƒáƒ áƒ˜áƒ C-ზე დáƒáƒ¬áƒ”რილი პრáƒáƒ’რáƒáƒ›áƒ”ბისთვის.\n" "\n" #: ecpg.c:38 @@ -114,11 +113,8 @@ msgstr " -D ფუნქცირფუნქციის áƒáƒ¦áƒ¬áƒ”რ #: ecpg.c:50 #, c-format -msgid "" -" -h parse a header file, this option includes option \"-c\"\n" -msgstr "" -" -h თáƒáƒ•სáƒáƒ áƒ—ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒ. ეს პáƒáƒ áƒáƒ›áƒ”ტრი áƒáƒ¡áƒ”ვე შეიცáƒáƒ•ს " -"პáƒáƒ áƒáƒ›áƒ”ტრს \"-c\"\n" +msgid " -h parse a header file, this option includes option \"-c\"\n" +msgstr " -h თáƒáƒ•სáƒáƒ áƒ—ის ფáƒáƒ˜áƒšáƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒ. ეს პáƒáƒ áƒáƒ›áƒ”ტრი áƒáƒ¡áƒ”ვე შეიცáƒáƒ•ს პáƒáƒ áƒáƒ›áƒ”ტრს \"-c\"\n" #: ecpg.c:51 #, c-format @@ -128,14 +124,12 @@ msgstr " -i დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებისáƒáƒ¡ სისტე #: ecpg.c:52 #, c-format msgid " -I DIRECTORY search DIRECTORY for include files\n" -msgstr "" -" -I სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე თáƒáƒ•სáƒáƒ áƒ—ის ფáƒáƒ˜áƒšáƒ”ბის ძებნისáƒáƒ¡ მáƒáƒ—ი áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n" +msgstr " -I სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ე თáƒáƒ•სáƒáƒ áƒ—ის ფáƒáƒ˜áƒšáƒ”ბის ძებნისáƒáƒ¡ მáƒáƒ—ი áƒáƒšáƒ¢áƒ”რნáƒáƒ¢áƒ˜áƒ£áƒšáƒ˜ მდებáƒáƒ áƒ”áƒáƒ‘áƒ\n" #: ecpg.c:53 #, c-format msgid " -o OUTFILE write result to OUTFILE\n" -msgstr "" -" -o გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜áƒ¤áƒáƒ˜áƒšáƒ˜ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მითითებულ ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ\n" +msgstr " -o გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜áƒ¤áƒáƒ˜áƒšáƒ˜ გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒšáƒ˜ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ მითითებულ ფáƒáƒ˜áƒšáƒ¨áƒ˜ ჩáƒáƒ¬áƒ”რáƒ\n" #: ecpg.c:54 #, c-format @@ -175,8 +169,7 @@ msgid "" msgstr "" "\n" "თუ გáƒáƒ›áƒáƒ¡áƒáƒ¢áƒáƒœáƒ˜ ფáƒáƒ˜áƒšáƒ˜ მითითებული áƒáƒ áƒáƒ, სáƒáƒ®áƒ”ლი იქმნებრ\n" -"შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლისთვის .c- ს დáƒáƒ›áƒáƒ¢áƒ”ბით, წáƒáƒ áƒ“გენის შემთხვევáƒáƒ¨áƒ˜ .pgc- ის " -"მáƒáƒ¨áƒšáƒ˜áƒ¡ შემდეგ.\n" +"შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ სáƒáƒ®áƒ”ლისთვის .c- ს დáƒáƒ›áƒáƒ¢áƒ”ბით, წáƒáƒ áƒ“გენის შემთხვევáƒáƒ¨áƒ˜ .pgc- ის მáƒáƒ¨áƒšáƒ˜áƒ¡ შემდეგ.\n" #: ecpg.c:62 #, c-format @@ -197,173 +190,172 @@ msgstr "%s-ის სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ გვერდიáƒ: <%s>\n" msgid "%s: could not locate my own executable path\n" msgstr "%s: ჩემი სáƒáƒ™áƒ£áƒ—áƒáƒ áƒ˜ გáƒáƒ›áƒ¨áƒ•ები ფáƒáƒ˜áƒšáƒ˜áƒ¡ ბილიკის მáƒáƒ«áƒ”ბნრშეუძლებელიáƒ\n" -#: ecpg.c:176 ecpg.c:333 ecpg.c:344 -#, c-format -msgid "%s: could not open file \"%s\": %s\n" -msgstr "%s: ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %s\n" - -#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 +#: ecpg.c:184 ecpg.c:235 ecpg.c:249 ecpg.c:275 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "მეტი ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡áƒ—ვის სცáƒáƒ“ეთ '%s --help'.\n" -#: ecpg.c:243 +#: ecpg.c:192 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის გáƒáƒ›áƒáƒ áƒ—ვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრ(-d) áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს\n" -#: ecpg.c:262 +#: ecpg.c:219 ecpg.c:334 ecpg.c:345 +#, c-format +msgid "%s: could not open file \"%s\": %m\n" +msgstr "%s: ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %m\n" + +#: ecpg.c:263 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, PostgreSQL-ის ჩáƒáƒ¨áƒ”ნებული C პრეპრáƒáƒªáƒ”სáƒáƒ áƒ˜, ვერსირ%s\n" -#: ecpg.c:264 +#: ecpg.c:265 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "EXEC SQL INCLUDE ... ძებნრიწყებრáƒáƒ¥:\n" -#: ecpg.c:267 +#: ecpg.c:268 #, c-format msgid "end of search list\n" msgstr "ძებნის სიის დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜\n" -#: ecpg.c:273 +#: ecpg.c:274 #, c-format msgid "%s: no input files specified\n" msgstr "%s: შეყვáƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ”ბი მითითებული áƒáƒ áƒáƒ\n" -#: ecpg.c:477 +#: ecpg.c:478 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "კურსáƒáƒ áƒ˜ \"%s\" áƒáƒ¦áƒ¬áƒ”რილიáƒ, მáƒáƒ’რáƒáƒ› áƒáƒ áƒ გáƒáƒ®áƒ¡áƒœáƒ˜áƒšáƒ˜" -#: ecpg.c:490 preproc.y:130 +#: ecpg.c:491 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ¨áƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: \"%s\"\n" -#: pgc.l:508 +#: pgc.l:520 #, c-format msgid "unterminated /* comment" msgstr "დáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელი /* კáƒáƒ›áƒ”ნტáƒáƒ áƒ˜" -#: pgc.l:525 +#: pgc.l:537 #, c-format msgid "unterminated bit string literal" msgstr "გáƒáƒ¬áƒ§áƒ•ეტილი ბიტური სტრიქáƒáƒœáƒ˜" -#: pgc.l:533 +#: pgc.l:545 #, c-format msgid "unterminated hexadecimal string literal" msgstr "გáƒáƒ¬áƒ§áƒ•ეტილი თექვსმეტáƒáƒ‘ითი სტრიქáƒáƒœáƒ˜" -#: pgc.l:608 +#: pgc.l:620 #, c-format msgid "invalid bit string literal" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ბიტური სტრიქáƒáƒœáƒ˜" -#: pgc.l:613 +#: pgc.l:625 #, c-format msgid "invalid hexadecimal string literal" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ თექვსმეტáƒáƒ‘ითი სტრიქáƒáƒœáƒ˜" -#: pgc.l:631 +#: pgc.l:643 #, c-format msgid "unhandled previous state in xqs\n" msgstr "დáƒáƒ£áƒ›áƒ£áƒ¨áƒáƒ•ებელი წინრმდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘რდáƒáƒ£áƒ®áƒ£áƒ áƒáƒ•ი ბრჭყáƒáƒšáƒ˜áƒ¡ áƒáƒ¦áƒ›áƒáƒ©áƒ”ნისáƒáƒ¡\n" -#: pgc.l:657 pgc.l:766 +#: pgc.l:669 pgc.l:778 #, c-format msgid "unterminated quoted string" msgstr "ბრჭყáƒáƒšáƒ”ბში ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ ციტáƒáƒ¢áƒ˜áƒ¡ დáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელი სტრიქáƒáƒœáƒ˜" -#: pgc.l:708 +#: pgc.l:720 #, c-format msgid "unterminated dollar-quoted string" msgstr "$-ით დáƒáƒ¬áƒ§áƒ”ბული სტრიქáƒáƒœ დáƒáƒ£áƒ›áƒ—áƒáƒ•რებელიáƒ" -#: pgc.l:726 pgc.l:746 +#: pgc.l:738 pgc.l:758 #, c-format msgid "zero-length delimited identifier" msgstr "გáƒáƒ›áƒ§áƒáƒ¤áƒ˜áƒ¡ ნულáƒáƒ•áƒáƒœáƒ˜ სიგრძის იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜" -#: pgc.l:757 +#: pgc.l:769 #, c-format msgid "unterminated quoted identifier" msgstr "დáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელი იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ ბრჭყáƒáƒšáƒ”ბში" -#: pgc.l:926 +#: pgc.l:938 #, c-format msgid "trailing junk after parameter" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის შემდეგ მáƒáƒ§áƒáƒšáƒ˜áƒšáƒ˜ მáƒáƒœáƒáƒªáƒ”მები ნáƒáƒ’áƒáƒ•იáƒ" -#: pgc.l:968 pgc.l:971 pgc.l:974 +#: pgc.l:990 pgc.l:993 pgc.l:996 pgc.l:999 pgc.l:1002 pgc.l:1005 #, c-format msgid "trailing junk after numeric literal" msgstr "რიცხვითი მნიშვნელáƒáƒ‘ის შემდეგ მáƒáƒœáƒáƒªáƒ”მები ნáƒáƒ’áƒáƒ•იáƒ" -#: pgc.l:1100 +#: pgc.l:1127 #, c-format msgid "nested /* ... */ comments" msgstr "ჩáƒáƒ“გმული /* ... */ კáƒáƒ›áƒ”ნტáƒáƒ áƒ”ბი" -#: pgc.l:1193 +#: pgc.l:1220 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "ბრძáƒáƒœáƒ”ბáƒáƒ¨áƒ˜ EXEC SQL UNDEF იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ áƒáƒ™áƒšáƒ˜áƒ" -#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 +#: pgc.l:1238 pgc.l:1251 pgc.l:1267 pgc.l:1280 #, c-format msgid "too many nested EXEC SQL IFDEF conditions" msgstr "\"EXEC SQL IFDEF\"-ის მეტისმეტáƒáƒ“ ბევრი ჩáƒáƒ“გმული პირáƒáƒ‘áƒ" -#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 +#: pgc.l:1296 pgc.l:1307 pgc.l:1322 pgc.l:1344 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "შესáƒáƒ¢áƒ§áƒ•ისი \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pgc.l:1271 pgc.l:1282 pgc.l:1463 +#: pgc.l:1298 pgc.l:1309 pgc.l:1490 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "áƒáƒ™áƒšáƒ˜áƒ \"EXEC SQL ENDIF;\"" -#: pgc.l:1297 pgc.l:1319 +#: pgc.l:1324 pgc.l:1346 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "ერთზე მეტი EXEC SQL ELSE" -#: pgc.l:1342 pgc.l:1356 +#: pgc.l:1369 pgc.l:1383 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "უწყვილრEXEC SQL ENDIF" -#: pgc.l:1411 +#: pgc.l:1438 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "ბრძáƒáƒœáƒ”ბáƒáƒ¡: EXEC SQL IFDEFიდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ áƒáƒ™áƒšáƒ˜áƒ" -#: pgc.l:1420 +#: pgc.l:1447 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "ბრძáƒáƒœáƒ”ბáƒáƒ¡: EXEC SQL DEFINE იდენტიფიკáƒáƒ¢áƒáƒ áƒ˜ áƒáƒ™áƒšáƒ˜áƒ" -#: pgc.l:1453 +#: pgc.l:1480 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "სინტáƒáƒ¥áƒ¡áƒ£áƒ áƒ˜ შეცდáƒáƒ›áƒ ბრძáƒáƒœáƒ”ბáƒáƒ¨áƒ˜: EXEC SQL INCLUDE" -#: pgc.l:1503 +#: pgc.l:1530 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "შიდრშეცდáƒáƒ›áƒ: მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘რმიუწვდáƒáƒ›áƒ”ლიáƒ; მისწერეთ ეს <%s>-ს" -#: pgc.l:1655 +#: pgc.l:1682 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" -msgstr "" -"შეცდáƒáƒ›áƒ: ჩáƒáƒ¡áƒáƒ áƒ—áƒáƒ•ი ბილიკი \"%s/%s\" ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ, ხáƒáƒ–ზე %d. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ\n" +msgstr "შეცდáƒáƒ›áƒ: ჩáƒáƒ¡áƒáƒ áƒ—áƒáƒ•ი ბილიკი \"%s/%s\" ძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ, ხáƒáƒ–ზე %d. გáƒáƒ›áƒáƒ¢áƒáƒ•ებáƒ\n" -#: pgc.l:1678 +#: pgc.l:1705 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "ჩáƒáƒ¡áƒáƒ¡áƒ›áƒ”ლი ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ. ხáƒáƒ–ზე %d" @@ -397,206 +389,190 @@ msgstr "ტიპის áƒáƒ¦áƒ¬áƒ”რისáƒáƒ¡ ინიციáƒáƒšáƒ˜áƒ– msgid "type name \"string\" is reserved in Informix mode" msgstr "informix-ის რეჟიმში ტიპის სáƒáƒ®áƒ”ლი \"string\" დáƒáƒªáƒ£áƒšáƒ˜áƒ" -#: preproc.y:552 preproc.y:19354 +#: preproc.y:552 preproc.y:18523 #, c-format msgid "type \"%s\" is already defined" msgstr "ტიპი უკვე áƒáƒ¦áƒ¬áƒ”რილიáƒ: %s" -#: preproc.y:577 preproc.y:19989 preproc.y:20314 variable.c:621 +#: preproc.y:577 preproc.y:19158 preproc.y:19480 variable.c:625 #, c-format msgid "multidimensional arrays for simple data types are not supported" -msgstr "" -"მრáƒáƒ•áƒáƒšáƒ’áƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœáƒ˜ მáƒáƒ¡áƒ˜áƒ•ები მáƒáƒœáƒáƒªáƒ”მების მáƒáƒ áƒ¢áƒ˜áƒ•ი ტიპებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი " -"áƒáƒ áƒáƒ" +msgstr "მრáƒáƒ•áƒáƒšáƒ’áƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœáƒ˜ მáƒáƒ¡áƒ˜áƒ•ები მáƒáƒœáƒáƒªáƒ”მების მáƒáƒ áƒ¢áƒ˜áƒ•ი ტიპებისთვის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" #: preproc.y:599 #, c-format msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "კáƒáƒ•შირი %s გáƒáƒ“áƒáƒ¬áƒ”რილირ%s-სთáƒáƒœ ერთáƒáƒ“ DECLARE ბრძáƒáƒœáƒ”ბის მიერ %s" -#: preproc.y:1872 +#: preproc.y:1810 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¨áƒ˜ \"CLOSE DATABASE\" პáƒáƒ áƒáƒ›áƒ”ტრი \"AT\" დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: preproc.y:2122 +#: preproc.y:2060 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¨áƒ˜ \"CONNECT\" პáƒáƒ áƒáƒ›áƒ”ტრი \"AT\" დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: preproc.y:2162 +#: preproc.y:2100 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¨áƒ˜ \"DISCONNECT\" პáƒáƒ áƒáƒ›áƒ”ტრი \"AT\" დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: preproc.y:2217 +#: preproc.y:2155 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¨áƒ˜ \"SET CONNECTION\" პáƒáƒ áƒáƒ›áƒ”ტრი \"AT\" დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: preproc.y:2239 +#: preproc.y:2177 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¨áƒ˜ \"TYPE\" პáƒáƒ áƒáƒ›áƒ”ტრი \"AT\" დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: preproc.y:2248 +#: preproc.y:2186 #, c-format msgid "AT option not allowed in VAR statement" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¨áƒ˜ \"VAR\" პáƒáƒ áƒáƒ›áƒ”ტრი \"AT\" დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: preproc.y:2255 +#: preproc.y:2193 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¨áƒ˜ \"WHENEVER\" პáƒáƒ áƒáƒ›áƒ”ტრი \"AT\" დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: preproc.y:2332 preproc.y:2504 preproc.y:2509 preproc.y:2632 preproc.y:4283 -#: preproc.y:4357 preproc.y:4948 preproc.y:5481 preproc.y:5819 preproc.y:6119 -#: preproc.y:7687 preproc.y:9288 preproc.y:9293 preproc.y:12272 +#: preproc.y:2318 preproc.y:2490 preproc.y:2495 preproc.y:2607 preproc.y:4317 +#: preproc.y:4391 preproc.y:4982 preproc.y:5515 preproc.y:5853 preproc.y:6057 +#: preproc.y:6158 preproc.y:7722 preproc.y:9330 preproc.y:9335 preproc.y:12308 #, c-format msgid "unsupported feature will be passed to server" msgstr "მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი ფუნქცირსერვერს გáƒáƒ“áƒáƒ”ცემáƒ" -#: preproc.y:2890 +#: preproc.y:2865 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" -#: preproc.y:3589 +#: preproc.y:3577 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" -#: preproc.y:10335 preproc.y:18892 +#: preproc.y:10385 preproc.y:18020 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" -msgstr "" -"\"database\" áƒáƒ  შეიძლებრგáƒáƒ›áƒáƒ§áƒ”ნებულ იქნáƒáƒ¡ რáƒáƒ’áƒáƒ áƒª კურსáƒáƒ áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი INFORMIX " -"რეჟიმში" +msgstr "\"database\" áƒáƒ  შეიძლებრგáƒáƒ›áƒáƒ§áƒ”ნებულ იქნáƒáƒ¡ რáƒáƒ’áƒáƒ áƒª კურსáƒáƒ áƒ˜áƒ¡ სáƒáƒ®áƒ”ლი INFORMIX რეჟიმში" -#: preproc.y:10342 preproc.y:18902 +#: preproc.y:10392 preproc.y:18030 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "\"%s\"ცვლáƒáƒ“ის სხვáƒáƒ“áƒáƒ¡áƒ®áƒ•რპირáƒáƒ‘ებში áƒáƒ¦áƒ¬áƒ”რრმხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" -#: preproc.y:10344 preproc.y:18904 +#: preproc.y:10394 preproc.y:18032 #, c-format msgid "cursor \"%s\" is already defined" msgstr "კურსáƒáƒ áƒ˜ უკვე áƒáƒ¦áƒ¬áƒ”რილიáƒ: \"%s\"" -#: preproc.y:10818 +#: preproc.y:10868 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "სერვერზე გáƒáƒ“áƒáƒªáƒ”მული LIMIT #.# სინტáƒáƒ¥áƒ¡áƒ˜ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ¦áƒáƒ áƒáƒ" -#: preproc.y:11151 preproc.y:11158 -#, c-format -msgid "subquery in FROM must have an alias" -msgstr "ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ \"FROM\"-ში მეტსáƒáƒ®áƒ”ლი უნდრჰქáƒáƒœáƒ“ეს" - -#: preproc.y:18584 preproc.y:18591 +#: preproc.y:17712 preproc.y:17719 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS áƒáƒ  შეიძლებრINTO მიეთითáƒáƒ¡" -#: preproc.y:18627 +#: preproc.y:17755 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "მáƒáƒ•ელáƒáƒ“ი \"@\", მივიღე \"%s\"" -#: preproc.y:18639 +#: preproc.y:17767 #, c-format -msgid "" -"only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are " -"supported" -msgstr "" -"მხáƒáƒ áƒ“áƒáƒ­áƒ”რილირმხáƒáƒšáƒáƒ“ პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ”ბი \"tcp\" დრ\"unix\" დრმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის " -"ტიპი \"postgresql\"" +msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" +msgstr "მხáƒáƒ áƒ“áƒáƒ­áƒ”რილირმხáƒáƒšáƒáƒ“ პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ”ბი \"tcp\" დრ\"unix\" დრმáƒáƒœáƒáƒªáƒ”მთრბáƒáƒ–ის ტიპი \"postgresql\"" -#: preproc.y:18642 +#: preproc.y:17770 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "მáƒáƒ•ელáƒáƒ“ი \"://\", მივიღე \"%s\"" -#: preproc.y:18647 +#: preproc.y:17775 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" -msgstr "" -"Unix-დáƒáƒ›áƒ”ნის სáƒáƒ™áƒ”ტები მხáƒáƒšáƒáƒ“ \"localhost\"-ზე მუშáƒáƒáƒ‘ს. მáƒáƒ’რáƒáƒ› áƒáƒ áƒ \"%s\"-ზე" +msgstr "Unix-დáƒáƒ›áƒ”ნის სáƒáƒ™áƒ”ტები მხáƒáƒšáƒáƒ“ \"localhost\"-ზე მუშáƒáƒáƒ‘ს. მáƒáƒ’რáƒáƒ› áƒáƒ áƒ \"%s\"-ზე" -#: preproc.y:18673 +#: preproc.y:17801 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "მáƒáƒ•ელáƒáƒ“ი \"postgresql\", მივიღე \"%s\"" -#: preproc.y:18676 +#: preproc.y:17804 #, c-format msgid "invalid connection type: %s" msgstr "შეერთების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი: %s" -#: preproc.y:18685 +#: preproc.y:17813 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "მáƒáƒ•ელáƒáƒ“ი \"@\"-ს áƒáƒœ \"://\"-ს, მივიღე \"%s\"" -#: preproc.y:18760 preproc.y:18778 +#: preproc.y:17888 preproc.y:17906 #, c-format msgid "invalid data type" msgstr "მáƒáƒœáƒáƒªáƒ”მების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ტიპი" -#: preproc.y:18789 preproc.y:18806 +#: preproc.y:17917 preproc.y:17934 #, c-format msgid "incomplete statement" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პირáƒáƒ‘áƒ" -#: preproc.y:18792 preproc.y:18809 +#: preproc.y:17920 preproc.y:17937 #, c-format msgid "unrecognized token \"%s\"" msgstr "უცნáƒáƒ‘ი კáƒáƒ“ი \"%s\"" -#: preproc.y:18854 +#: preproc.y:17982 #, c-format msgid "name \"%s\" is already declared" msgstr "სáƒáƒ®áƒ”ლი \"%s\" უკვე áƒáƒ¦áƒ¬áƒ”რილიáƒ" -#: preproc.y:19120 +#: preproc.y:18271 #, c-format msgid "only data types numeric and decimal have precision/scale argument" -msgstr "" -"სიზუსტის / მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ის áƒáƒ áƒ’უმენტი მხáƒáƒšáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრტიპებს numeric დრdecimal " -"áƒáƒ¥áƒ•თ" +msgstr "სიზუსტის / მáƒáƒ¡áƒ¨áƒ¢áƒáƒ‘ის áƒáƒ áƒ’უმენტი მხáƒáƒšáƒáƒ“ მáƒáƒœáƒáƒªáƒ”მთრტიპებს numeric დრdecimal áƒáƒ¥áƒ•თ" -#: preproc.y:19132 +#: preproc.y:18342 #, c-format msgid "interval specification not allowed here" msgstr "áƒáƒ¥ ინტერვáƒáƒšáƒ˜áƒ¡ სპეციფიკáƒáƒªáƒ˜áƒ დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: preproc.y:19329 preproc.y:19381 +#: preproc.y:18498 preproc.y:18550 #, c-format msgid "too many levels in nested structure/union definition" msgstr "ჩáƒáƒ“გმული სტრუქტურის/გáƒáƒ”რთიáƒáƒœáƒ”ბის მეტისმეტáƒáƒ“ ბევრი დáƒáƒœáƒ”" -#: preproc.y:19504 +#: preproc.y:18673 #, c-format msgid "pointers to varchar are not implemented" msgstr "varchar-ზე მáƒáƒ©áƒ•ენებლები მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" -#: preproc.y:19955 +#: preproc.y:19124 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "ინიციáƒáƒšáƒ˜áƒ–áƒáƒ¢áƒáƒ áƒ˜ დáƒáƒ£áƒ¨áƒ•ებელირEXEC SQL VAR ბრძáƒáƒœáƒ”ბáƒáƒ¨áƒ˜" -#: preproc.y:20272 +#: preproc.y:19438 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "შესáƒáƒ§áƒ•áƒáƒœáƒáƒ“ ინდიკáƒáƒ¢áƒáƒ áƒ”ბის მáƒáƒ¡áƒ˜áƒ•ები დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: preproc.y:20459 +#: preproc.y:19625 #, c-format msgid "operator not allowed in variable definition" msgstr "ცვლáƒáƒ“ის áƒáƒ¦áƒ¬áƒ”რისáƒáƒ¡ áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¡ ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:20500 +#: preproc.y:19666 #, c-format msgid "%s at or near \"%s\"" msgstr "%s \"%s\"-სთáƒáƒœ áƒáƒœ áƒáƒ®áƒšáƒáƒ¡" @@ -623,8 +599,7 @@ msgstr "ცვლáƒáƒ“ი \"%s\" დáƒáƒ›áƒáƒšáƒ£áƒšáƒ˜áƒ ლáƒáƒ™áƒáƒšáƒ£ #: type.c:277 #, c-format -msgid "" -"indicator variable \"%s\" is hidden by a local variable of a different type" +msgid "indicator variable \"%s\" is hidden by a local variable of a different type" msgstr "ინდიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ცვლáƒáƒ“ი \"%s\" იმáƒáƒšáƒ”ბრსხვრტიპის ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ ცვლáƒáƒ“ის მიერ" #: type.c:279 @@ -667,68 +642,68 @@ msgstr "ინდიკáƒáƒ¢áƒáƒ áƒ˜áƒ¡ სტრუქტურáƒáƒ¡ ძრmsgid "unrecognized descriptor item code %d" msgstr "დესკრიპტáƒáƒ áƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რის უცნáƒáƒ‘ი კáƒáƒ“ი: %d" -#: variable.c:89 variable.c:116 +#: variable.c:89 variable.c:115 #, c-format msgid "incorrectly formed variable \"%s\"" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒáƒ“ ჩáƒáƒ›áƒáƒ§áƒáƒšáƒ˜áƒ‘ებული ცვლáƒáƒ“ი \"%s\"" -#: variable.c:139 +#: variable.c:138 #, c-format msgid "variable \"%s\" is not a pointer" msgstr "ცვლáƒáƒ“ი %s მáƒáƒ©áƒ•ენებელი áƒáƒ áƒáƒ" -#: variable.c:142 variable.c:167 +#: variable.c:141 variable.c:166 #, c-format msgid "variable \"%s\" is not a pointer to a structure or a union" msgstr "ცვლáƒáƒ“ი %s სტრუქტურáƒáƒ–ე დრგáƒáƒ”რთიáƒáƒœáƒ”ბáƒáƒ–ე მáƒáƒ©áƒ•ენებელი áƒáƒ áƒáƒ" -#: variable.c:154 +#: variable.c:153 #, c-format msgid "variable \"%s\" is neither a structure nor a union" msgstr "ცვლáƒáƒ“ი \"%s\" áƒáƒ áƒª სტრუქტურáƒáƒ, áƒáƒ áƒª გáƒáƒ”რთიáƒáƒœáƒ”ბáƒ" -#: variable.c:164 +#: variable.c:163 #, c-format msgid "variable \"%s\" is not an array" msgstr "ცვლáƒáƒ“ი %s მáƒáƒ¡áƒ˜áƒ•ი áƒáƒ áƒáƒ" -#: variable.c:233 variable.c:255 +#: variable.c:232 variable.c:254 #, c-format msgid "variable \"%s\" is not declared" msgstr "ცვლáƒáƒ“ი %s áƒáƒ¦áƒ¬áƒ”რილი áƒáƒ áƒáƒ" -#: variable.c:494 +#: variable.c:493 #, c-format msgid "indicator variable must have an integer type" msgstr "ინდიკáƒáƒ¢áƒáƒ  ცვლáƒáƒ“ს მთელი რიცხვის ტიპი უნდრჰქáƒáƒœáƒ“ეს" -#: variable.c:506 +#: variable.c:510 #, c-format msgid "unrecognized data type name \"%s\"" msgstr "მáƒáƒœáƒáƒªáƒ”მების ტიპის უცნáƒáƒ‘ი სáƒáƒ®áƒ”ლი \"%s\"" -#: variable.c:517 variable.c:525 variable.c:542 variable.c:545 +#: variable.c:521 variable.c:529 variable.c:546 variable.c:549 #, c-format msgid "multidimensional arrays are not supported" msgstr "მრáƒáƒ•áƒáƒšáƒ’áƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœáƒ˜ მáƒáƒ¡áƒ˜áƒ•ები მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" -#: variable.c:534 +#: variable.c:538 #, c-format -msgid "" -"multilevel pointers (more than 2 levels) are not supported; found %d level" -msgid_plural "" -"multilevel pointers (more than 2 levels) are not supported; found %d levels" -msgstr[0] "" -"მრáƒáƒ•áƒáƒšáƒ“áƒáƒœáƒ˜áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლები (2-ზე მეტი დáƒáƒœáƒ”) მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ; ნáƒáƒžáƒáƒ•ნირ%d დáƒáƒœáƒ”" -msgstr[1] "" -"მრáƒáƒ•áƒáƒšáƒ“áƒáƒœáƒ˜áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლები (2-ზე მეტი დáƒáƒœáƒ”) მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ; ნáƒáƒžáƒáƒ•ნირ%d დáƒáƒœáƒ”" +msgid "multilevel pointers (more than 2 levels) are not supported; found %d level" +msgid_plural "multilevel pointers (more than 2 levels) are not supported; found %d levels" +msgstr[0] "მრáƒáƒ•áƒáƒšáƒ“áƒáƒœáƒ˜áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლები (2-ზე მეტი დáƒáƒœáƒ”) მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ; ნáƒáƒžáƒáƒ•ნირ%d დáƒáƒœáƒ”" +msgstr[1] "მრáƒáƒ•áƒáƒšáƒ“áƒáƒœáƒ˜áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებლები (2-ზე მეტი დáƒáƒœáƒ”) მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ; ნáƒáƒžáƒáƒ•ნირ%d დáƒáƒœáƒ”" -#: variable.c:539 +#: variable.c:543 #, c-format msgid "pointer to pointer is not supported for this data type" msgstr "მáƒáƒœáƒáƒªáƒ”მების áƒáƒ› ტიპისთვის მáƒáƒ©áƒ•ენებელი მáƒáƒ©áƒ•ენებელზე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" -#: variable.c:559 +#: variable.c:563 #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "სტრუქტურების მრáƒáƒ•áƒáƒšáƒ’áƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœáƒ˜ მáƒáƒ¡áƒ˜áƒ•ები მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ" + +#, c-format +#~ msgid "subquery in FROM must have an alias" +#~ msgstr "ქვემáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ \"FROM\"-ში მეტსáƒáƒ®áƒ”ლი უნდრჰქáƒáƒœáƒ“ეს" diff --git a/src/interfaces/ecpg/preproc/po/ko.po b/src/interfaces/ecpg/preproc/po/ko.po index 43516f9f85182..77d4029a5866b 100644 --- a/src/interfaces/ecpg/preproc/po/ko.po +++ b/src/interfaces/ecpg/preproc/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: ecpg (PostgreSQL) 13\n" +"Project-Id-Version: ecpg (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 01:09+0000\n" -"PO-Revision-Date: 2020-10-05 16:55+0900\n" +"POT-Creation-Date: 2025-01-17 04:40+0000\n" +"PO-Revision-Date: 2025-01-16 10:32+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean Team \n" "Language: ko\n" @@ -22,37 +22,42 @@ msgstr "" msgid "variable \"%s\" must have a numeric type" msgstr "\"%s\" 변수는 ìˆ«ìž í˜•ì‹ì´ì–´ì•¼ 함" -#: descriptor.c:124 descriptor.c:146 +#: descriptor.c:124 descriptor.c:155 #, c-format -msgid "descriptor \"%s\" does not exist" -msgstr "\"%s\" 설명ìžê°€ ì—†ìŒ" +msgid "descriptor %s bound to connection %s does not exist" +msgstr "%s 설명ìž(해당 ì—°ê²°: %s)ê°€ ì—†ìŒ" -#: descriptor.c:161 descriptor.c:213 +#: descriptor.c:126 descriptor.c:157 +#, c-format +msgid "descriptor %s bound to the default connection does not exist" +msgstr "기본 ì—°ê²°ì„ ìœ„í•œ %s 설명ìžê°€ ì—†ìŒ" + +#: descriptor.c:172 descriptor.c:224 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "ì„¤ëª…ìž í—¤ë” í•­ëª© \"%d\"ì´(ê°€) ì—†ìŒ" -#: descriptor.c:183 +#: descriptor.c:194 #, c-format msgid "nullable is always 1" msgstr "null 허용 여부는 í•­ìƒ 1" -#: descriptor.c:186 +#: descriptor.c:197 #, c-format msgid "key_member is always 0" msgstr "key_member는 í•­ìƒ 0" -#: descriptor.c:280 +#: descriptor.c:291 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "ì„¤ëª…ìž í•­ëª© \"%s\"ì´(ê°€) 구현ë˜ì§€ 않ìŒ" -#: descriptor.c:290 +#: descriptor.c:301 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "ì„¤ëª…ìž í•­ëª© \"%s\"ì„(를) 설정할 수 ì—†ìŒ" -#: ecpg.c:35 +#: ecpg.c:36 #, c-format msgid "" "%s is the PostgreSQL embedded SQL preprocessor for C programs.\n" @@ -61,7 +66,7 @@ msgstr "" "%sì€(는) C 프로그램용 PostgreSQL í¬í•¨ SQL 전처리기입니다.\n" "\n" -#: ecpg.c:37 +#: ecpg.c:38 #, c-format msgid "" "Usage:\n" @@ -72,12 +77,12 @@ msgstr "" " %s [OPTION]... 파ì¼...\n" "\n" -#: ecpg.c:40 +#: ecpg.c:41 #, c-format msgid "Options:\n" msgstr "옵션들:\n" -#: ecpg.c:41 +#: ecpg.c:42 #, c-format msgid "" " -c automatically generate C code from embedded SQL code;\n" @@ -86,7 +91,7 @@ msgstr "" " -c í¬í•¨ëœ SQL 코드ì—서 ìžë™ìœ¼ë¡œ C 코드를 ìƒì„±í•©ë‹ˆë‹¤.\n" " EXEC SQL TYPEì— ì˜í–¥ì„ ì¤ë‹ˆë‹¤.\n" -#: ecpg.c:43 +#: ecpg.c:44 #, c-format msgid "" " -C MODE set compatibility mode; MODE can be one of\n" @@ -96,38 +101,38 @@ msgstr "" "다.\n" " \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n" -#: ecpg.c:46 +#: ecpg.c:47 #, c-format msgid " -d generate parser debug output\n" msgstr " -d 파서 디버그 출력 ìƒì„±\n" -#: ecpg.c:48 +#: ecpg.c:49 #, c-format msgid " -D SYMBOL define SYMBOL\n" msgstr " -D SYMBOL SYMBOL ì •ì˜\n" -#: ecpg.c:49 +#: ecpg.c:50 #, c-format msgid "" " -h parse a header file, this option includes option \"-c\"\n" msgstr " -h í—¤ë” íŒŒì¼ êµ¬ë¬¸ ë¶„ì„. ì´ ì˜µì…˜ì€ \"-c\" 옵션 í¬í•¨\n" -#: ecpg.c:50 +#: ecpg.c:51 #, c-format msgid " -i parse system include files as well\n" msgstr " -i 시스템 í¬í•¨ 파ì¼ë„ 구문 ë¶„ì„\n" -#: ecpg.c:51 +#: ecpg.c:52 #, c-format msgid " -I DIRECTORY search DIRECTORY for include files\n" msgstr " -I DIRECTORY DIRECTORYì—서 í¬í•¨ íŒŒì¼ ê²€ìƒ‰\n" -#: ecpg.c:52 +#: ecpg.c:53 #, c-format msgid " -o OUTFILE write result to OUTFILE\n" msgstr " -o OUTFILE OUTFILEì— ê²°ê³¼ 쓰기\n" -#: ecpg.c:53 +#: ecpg.c:54 #, c-format msgid "" " -r OPTION specify run-time behavior; OPTION can be:\n" @@ -137,27 +142,27 @@ msgstr "" "다.\n" " \"no_indicator\", \"prepare\", \"questionmarks\"\n" -#: ecpg.c:55 +#: ecpg.c:56 #, c-format msgid " --regression run in regression testing mode\n" msgstr " --regression 회귀 테스트 모드ì—서 실행\n" -#: ecpg.c:56 +#: ecpg.c:57 #, c-format msgid " -t turn on autocommit of transactions\n" msgstr " -t 트랜잭션 ìžë™ 커밋 설정\n" -#: ecpg.c:57 +#: ecpg.c:58 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version 버전 ì •ë³´ 보여주고 마침\n" -#: ecpg.c:58 +#: ecpg.c:59 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help ì´ ë„움ë§ì„ 보여주고 마침\n" -#: ecpg.c:59 +#: ecpg.c:60 #, c-format msgid "" "\n" @@ -168,7 +173,7 @@ msgstr "" "출력 íŒŒì¼ ì´ë¦„ì„ ì§€ì •í•˜ì§€ 않으면 ìž…ë ¥ íŒŒì¼ ì´ë¦„ì— .pgcê°€ ìžˆì„ ê²½ìš° 제거하고\n" ".c를 추가하여 ì´ë¦„ì´ ì§€ì •ë©ë‹ˆë‹¤.\n" -#: ecpg.c:61 +#: ecpg.c:62 #, c-format msgid "" "\n" @@ -177,169 +182,183 @@ msgstr "" "\n" "ë¬¸ì œì  ë³´ê³  주소: <%s>\n" -#: ecpg.c:62 +#: ecpg.c:63 #, c-format msgid "%s home page: <%s>\n" msgstr "%s 홈페ì´ì§€: <%s>\n" -#: ecpg.c:140 +#: ecpg.c:152 #, c-format msgid "%s: could not locate my own executable path\n" msgstr "%s: 실행 가능한 경로를 지정할 수 없습니다\n" -#: ecpg.c:175 ecpg.c:332 ecpg.c:343 -#, c-format -msgid "%s: could not open file \"%s\": %s\n" -msgstr "%s: \"%s\" íŒŒì¼ ì—´ 수 ì—†ìŒ: %s\n" - -#: ecpg.c:218 ecpg.c:231 ecpg.c:247 ecpg.c:273 +#: ecpg.c:195 ecpg.c:246 ecpg.c:260 ecpg.c:286 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "ìžì œí•œ ì‚¬í•­ì€ \"%s --help\" 명령으로 살펴보십시오.\n" -#: ecpg.c:242 +#: ecpg.c:203 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: 파서 디버그 ì§€ì›(-d)ì„ ì‚¬ìš©í•  수 ì—†ìŒ\n" -#: ecpg.c:261 +#: ecpg.c:230 ecpg.c:345 ecpg.c:356 +#, c-format +msgid "%s: could not open file \"%s\": %m\n" +msgstr "%s: \"%s\" íŒŒì¼ ì—´ 수 ì—†ìŒ: %m\n" + +#: ecpg.c:274 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, PostgreSQL í¬í•¨ C 전처리기, 버전 %s\n" -#: ecpg.c:263 +#: ecpg.c:276 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "EXEC SQL INCLUDE ... 여기서 검색 시작:\n" -#: ecpg.c:266 +#: ecpg.c:279 #, c-format msgid "end of search list\n" msgstr "검색 목ë¡ì˜ ë\n" -#: ecpg.c:272 +#: ecpg.c:285 #, c-format msgid "%s: no input files specified\n" msgstr "%s: ì§€ì •ëœ ìž…ë ¥ íŒŒì¼ ì—†ìŒ\n" -#: ecpg.c:466 +#: ecpg.c:491 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "\"%s\" 커서가 ì„ ì–¸ë˜ì—ˆì§€ë§Œ 열리지 않ìŒ" -#: ecpg.c:479 preproc.y:128 +#: ecpg.c:504 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "출력 íŒŒì¼ \"%s\"ì„(를) 제거할 수 ì—†ìŒ\n" -#: pgc.l:502 +#: pgc.l:542 #, c-format msgid "unterminated /* comment" msgstr "마무리 ì•ˆëœ /* 주ì„" -#: pgc.l:519 +#: pgc.l:559 #, c-format msgid "unterminated bit string literal" msgstr "마무리 ì•ˆëœ ë¹„íŠ¸ 문ìžì—´ 문ìž" -#: pgc.l:527 +#: pgc.l:567 #, c-format msgid "unterminated hexadecimal string literal" msgstr "마무리 ì•ˆëœ 16진수 문ìžì—´ 문ìž" -#: pgc.l:602 +#: pgc.l:642 #, c-format msgid "invalid bit string literal" msgstr "ìž˜ëª»ëœ ë¹„íŠ¸ 문ìžì—´ 리터럴" -#: pgc.l:623 +#: pgc.l:647 +#, c-format +msgid "invalid hexadecimal string literal" +msgstr "ìž˜ëª»ëœ 16진수 문ìžì—´ 문ìž" + +#: pgc.l:665 #, c-format msgid "unhandled previous state in xqs\n" msgstr "xqs ì•ˆì— ë‹¤ë£° 수 없는 ì´ì „ ìƒíƒœê°’ 있ìŒ\n" -#: pgc.l:652 pgc.l:754 +#: pgc.l:691 pgc.l:800 #, c-format msgid "unterminated quoted string" msgstr "마무리 ì•ˆëœ ë”°ì˜´í‘œ ì•ˆì˜ ë¬¸ìžì—´" -#: pgc.l:703 +#: pgc.l:742 #, c-format msgid "unterminated dollar-quoted string" msgstr "마무리 ì•ˆëœ ë”°ì˜´í‘œ ì•ˆì˜ ë¬¸ìžì—´" -#: pgc.l:721 pgc.l:734 +#: pgc.l:760 pgc.l:780 #, c-format msgid "zero-length delimited identifier" msgstr "길ì´ê°€ 0ì¸ êµ¬ë¶„ ì‹ë³„ìž" -#: pgc.l:745 +#: pgc.l:791 #, c-format msgid "unterminated quoted identifier" msgstr "마무리 ì•ˆëœ ë”°ì˜´í‘œ ì•ˆì˜ ì‹ë³„ìž" -#: pgc.l:1076 +#: pgc.l:960 +#, c-format +msgid "trailing junk after parameter" +msgstr "매개 변수 ë’¤ì— ë­”ê°€ 붙었ìŒ" + +#: pgc.l:1012 pgc.l:1015 pgc.l:1018 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "ìˆ«ìž ë’¤ì— ë¬¸ìžê°€ 붙었습니다" + +#: pgc.l:1141 #, c-format msgid "nested /* ... */ comments" msgstr "ì¤‘ì²©ëœ /* ... */ 주ì„" -#: pgc.l:1169 +#: pgc.l:1240 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "EXEC SQL UNDEF ëª…ë ¹ì— ì‹ë³„ìž ëˆ„ë½" -#: pgc.l:1187 pgc.l:1200 pgc.l:1216 pgc.l:1229 +#: pgc.l:1258 pgc.l:1271 pgc.l:1287 pgc.l:1300 #, c-format msgid "too many nested EXEC SQL IFDEF conditions" msgstr "ì¤‘ì²©ëœ EXEC SQL IFDEF ì¡°ê±´ì´ ë„ˆë¬´ ë§ŽìŒ" -#: pgc.l:1245 pgc.l:1256 pgc.l:1271 pgc.l:1293 +#: pgc.l:1316 pgc.l:1327 pgc.l:1342 pgc.l:1364 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "ì¼ì¹˜í•˜ëŠ” \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\" 누ë½" -#: pgc.l:1247 pgc.l:1258 pgc.l:1439 +#: pgc.l:1318 pgc.l:1329 pgc.l:1522 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "\"EXEC SQL ENDIF;\" 누ë½" -#: pgc.l:1273 pgc.l:1295 +#: pgc.l:1344 pgc.l:1366 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "ë‘ ê°œ ì´ìƒì˜ EXEC SQL ELSE" -#: pgc.l:1318 pgc.l:1332 +#: pgc.l:1389 pgc.l:1403 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "ì¼ì¹˜í•˜ì§€ 않는 EXEC SQL ENDIF" -#: pgc.l:1387 +#: pgc.l:1464 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "EXEC SQL IFDEF ëª…ë ¹ì— ì‹ë³„ìž ëˆ„ë½" -#: pgc.l:1396 +#: pgc.l:1473 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "EXEC SQL DEFINE ëª…ë ¹ì— ì‹ë³„ìž ëˆ„ë½" -#: pgc.l:1429 +#: pgc.l:1511 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "EXEC SQL INCLUDE ëª…ë ¹ì— êµ¬ë¬¸ 오류 ë°œìƒ" -#: pgc.l:1479 +#: pgc.l:1566 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "" -"ë‚´ë¶€ 오류: ìƒíƒœê°’ì„ ì•Œ 수 없습니다. ì´ ë¬¸ì œë¥¼ <%s> 주소로 " -"알려주십시오." +"ë‚´ë¶€ 오류: ìƒíƒœê°’ì„ ì•Œ 수 없습니다. ì´ ë¬¸ì œë¥¼ <%s> 주소로 알려주십시오." -#: pgc.l:1631 +#: pgc.l:1718 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "오류: í¬í•¨ 경로 \"%s/%s\"ì´(ê°€) %d줄ì—서 너무 길어서 건너뜀\n" -#: pgc.l:1654 +#: pgc.l:1741 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "í¬í•¨ íŒŒì¼ \"%s\"ì„(를) %d줄ì—서 ì—´ 수 ì—†ìŒ" @@ -348,124 +367,128 @@ msgstr "í¬í•¨ íŒŒì¼ \"%s\"ì„(를) %d줄ì—서 ì—´ 수 ì—†ìŒ" msgid "syntax error" msgstr "구문 오류" -#: preproc.y:82 +#: preproc.y:84 #, c-format msgid "WARNING: " msgstr "경고: " -#: preproc.y:85 +#: preproc.y:87 #, c-format msgid "ERROR: " msgstr "오류: " -#: preproc.y:512 +#: preproc.y:514 #, c-format msgid "cursor \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ì»¤ì„œê°€ ì—†ìŒ" -#: preproc.y:541 +#: preproc.y:543 #, c-format msgid "initializer not allowed in type definition" msgstr "í˜•ì‹ ì •ì˜ì— ì´ë‹ˆì…œë¼ì´ì €ê°€ 허용ë˜ì§€ 않ìŒ" -#: preproc.y:543 +#: preproc.y:545 #, c-format msgid "type name \"string\" is reserved in Informix mode" msgstr "\"string\" ìžë£Œí˜• ì´ë¦„ì€ ì¸í¬ë¯¹ìФ 모드ì—서 예약어로 쓰입니다" -#: preproc.y:550 preproc.y:15960 +#: preproc.y:552 preproc.y:19034 #, c-format msgid "type \"%s\" is already defined" msgstr "\"%s\" 형ì‹ì´ ì´ë¯¸ ì •ì˜ë¨" -#: preproc.y:575 preproc.y:16603 preproc.y:16928 variable.c:621 +#: preproc.y:577 preproc.y:19669 preproc.y:19991 variable.c:624 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "단순 ë°ì´í„° 형ì‹ì— ë‹¤ì°¨ì› ë°°ì—´ì´ ì§€ì›ë˜ì§€ 않ìŒ" -#: preproc.y:1704 +#: preproc.y:599 +#, c-format +msgid "connection %s is overwritten with %s by DECLARE statement %s" +msgstr "%s ì—°ê²°ì€ %s 연결로 바뀌었ìŒ, 해당 DECLARE 구문: %s" + +#: preproc.y:1831 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "CLOSE DATABASE ë¬¸ì— AT ì˜µì…˜ì´ í—ˆìš©ë˜ì§€ 않ìŒ" -#: preproc.y:1952 +#: preproc.y:2081 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "CONNECT ë¬¸ì— AT ì˜µì…˜ì´ í—ˆìš©ë˜ì§€ 않ìŒ" -#: preproc.y:1986 +#: preproc.y:2121 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "DISCONNECT ë¬¸ì— AT ì˜µì…˜ì´ í—ˆìš©ë˜ì§€ 않ìŒ" -#: preproc.y:2041 +#: preproc.y:2176 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "SET CONNECTION ë¬¸ì— AT ì˜µì…˜ì´ í—ˆìš©ë˜ì§€ 않ìŒ" -#: preproc.y:2063 +#: preproc.y:2198 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "TYPE ë¬¸ì— AT ì˜µì…˜ì´ í—ˆìš©ë˜ì§€ 않ìŒ" -#: preproc.y:2072 +#: preproc.y:2207 #, c-format msgid "AT option not allowed in VAR statement" msgstr "VAR ë¬¸ì— AT ì˜µì…˜ì´ í—ˆìš©ë˜ì§€ 않ìŒ" -#: preproc.y:2079 +#: preproc.y:2214 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "WHENEVER ë¬¸ì— AT ì˜µì…˜ì´ í—ˆìš©ë˜ì§€ 않ìŒ" -#: preproc.y:2156 preproc.y:2328 preproc.y:2333 preproc.y:2456 preproc.y:4034 -#: preproc.y:4682 preproc.y:5624 preproc.y:5924 preproc.y:7542 preproc.y:9081 -#: preproc.y:9086 preproc.y:11921 +#: preproc.y:2339 preproc.y:2626 preproc.y:4349 preproc.y:5021 preproc.y:5891 +#: preproc.y:6095 preproc.y:6196 preproc.y:12460 #, c-format msgid "unsupported feature will be passed to server" msgstr "ì§€ì›ë˜ì§€ 않는 ê¸°ëŠ¥ì´ ì„œë²„ì— ì „ë‹¬ë¨" -#: preproc.y:2714 +#: preproc.y:2884 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALLì´ êµ¬í˜„ë˜ì§€ 않ìŒ" -#: preproc.y:3382 +#: preproc.y:3596 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDINì´ êµ¬í˜„ë˜ì§€ 않ìŒ" -#: preproc.y:10060 preproc.y:15545 +#: preproc.y:10444 preproc.y:18503 +#, c-format +msgid "\"database\" cannot be used as cursor name in INFORMIX mode" +msgstr "INFORMIX 모드ì—서는 \"database\"를 커서 ì´ë¦„으로 사용할 수 ì—†ìŒ" + +#: preproc.y:10451 preproc.y:18513 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "서로 다른 ì„ ì–¸ 구문ì—서 \"%s\" 변수 ì‚¬ìš©ì€ ì§€ì›í•˜ì§€ 않습니다" -#: preproc.y:10062 preproc.y:15547 +#: preproc.y:10453 preproc.y:18515 #, c-format msgid "cursor \"%s\" is already defined" msgstr "\"%s\" 커서가 ì´ë¯¸ ì •ì˜ë¨" -#: preproc.y:10502 +#: preproc.y:10927 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "ë” ì´ìƒ ì§€ì›ë˜ì§€ 않는 LIMIT #,# êµ¬ë¬¸ì´ ì„œë²„ì— ì „ë‹¬ë¨" -#: preproc.y:10835 preproc.y:10842 -#, c-format -msgid "subquery in FROM must have an alias" -msgstr "FROM ì ˆ ë‚´ì˜ subquery ì—는 반드시 alias 를 가져야만 합니다" - -#: preproc.y:15268 preproc.y:15275 +#: preproc.y:18195 preproc.y:18202 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE ASì—서 INTO를 지정할 수 ì—†ìŒ" -#: preproc.y:15311 +#: preproc.y:18238 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "\"@\"ì´ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" -#: preproc.y:15323 +#: preproc.y:18250 #, c-format msgid "" "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are " @@ -473,89 +496,89 @@ msgid "" msgstr "" "\"tcp\" ë° \"unix\" 프로토콜과 ë°ì´í„°ë² ì´ìФ í˜•ì‹ \"postgresql\"ë§Œ ì§€ì›ë¨" -#: preproc.y:15326 +#: preproc.y:18253 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "\"://\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" -#: preproc.y:15331 +#: preproc.y:18258 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "" "Unix-domain ì†Œì¼“ì€ \"localhost\"ì—서만 ìž‘ë™í•˜ë©° \"%s\"ì—서는 ìž‘ë™í•˜ì§€ 않ìŒ" -#: preproc.y:15357 +#: preproc.y:18284 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "\"postgresql\"ì´ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" -#: preproc.y:15360 +#: preproc.y:18287 #, c-format msgid "invalid connection type: %s" msgstr "ìž˜ëª»ëœ ì—°ê²° 형ì‹: %s" -#: preproc.y:15369 +#: preproc.y:18296 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "\"@\" ë˜ëŠ” \"://\"ê°€ í•„ìš”í•œë° \"%s\"ì´(ê°€) 있ìŒ" -#: preproc.y:15444 preproc.y:15462 +#: preproc.y:18371 preproc.y:18389 #, c-format msgid "invalid data type" msgstr "ìž˜ëª»ëœ ë°ì´í„° 형ì‹" -#: preproc.y:15473 preproc.y:15490 +#: preproc.y:18400 preproc.y:18417 #, c-format msgid "incomplete statement" msgstr "불완전한 문" -#: preproc.y:15476 preproc.y:15493 +#: preproc.y:18403 preproc.y:18420 #, c-format msgid "unrecognized token \"%s\"" msgstr "ì¸ì‹í•  수 없는 í† í° \"%s\"" -#: preproc.y:15763 +#: preproc.y:18465 +#, c-format +msgid "name \"%s\" is already declared" +msgstr "\"%s\" ì´ë¦„ì´ ì´ë¯¸ ì •ì˜ë¨" + +#: preproc.y:18754 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "ìˆ«ìž ë° 10진수 ë°ì´í„° 형ì‹ì—ë§Œ ì „ì²´ ìžë¦¿ìˆ˜/소수 ìžë¦¿ìˆ˜ ì¸ìˆ˜ í¬í•¨" -#: preproc.y:15775 +#: preproc.y:18853 #, c-format msgid "interval specification not allowed here" msgstr "여기ì—는 간격 ì§€ì •ì´ í—ˆìš©ë˜ì§€ 않ìŒ" -#: preproc.y:15935 preproc.y:15987 +#: preproc.y:19009 preproc.y:19061 #, c-format msgid "too many levels in nested structure/union definition" msgstr "ì¤‘ì²©ëœ êµ¬ì¡°/union ì •ì˜ì— ìˆ˜ì¤€ì´ ë„ˆë¬´ ë§ŽìŒ" -#: preproc.y:16110 +#: preproc.y:19184 #, c-format msgid "pointers to varchar are not implemented" msgstr "varcharì— ëŒ€í•œ í¬ì¸í„°ê°€ 구현ë˜ì§€ 않ìŒ" -#: preproc.y:16297 preproc.y:16322 -#, c-format -msgid "using unsupported DESCRIBE statement" -msgstr "ì§€ì›ë˜ì§€ 않는 DESCRIBE 문 사용" - -#: preproc.y:16569 +#: preproc.y:19635 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "EXEC SQL VAR ëª…ë ¹ì— ì´ë‹ˆì…œë¼ì´ì €ê°€ 허용ë˜ì§€ 않ìŒ" -#: preproc.y:16886 +#: preproc.y:19949 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "ìž…ë ¥ì—서 í‘œì‹œê¸°ì˜ ë°°ì—´ì´ í—ˆìš©ë˜ì§€ 않ìŒ" -#: preproc.y:17073 +#: preproc.y:20136 #, c-format msgid "operator not allowed in variable definition" msgstr "ì—°ì‚°ìžëŠ” ë™ì  ì •ì˜ ì˜ì—­ì—서는 사용할 수 ì—†ìŒ" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:17114 +#: preproc.y:20177 #, c-format msgid "%s at or near \"%s\"" msgstr "%s, \"%s\" 부근" @@ -626,52 +649,52 @@ msgstr "\"%s\" 지시 구조체는 맴버가 너무 ë§ŽìŒ" msgid "unrecognized descriptor item code %d" msgstr "ì¸ì‹í•  수 없는 ì„¤ëª…ìž í•­ëª© 코드 %d" -#: variable.c:89 variable.c:116 +#: variable.c:89 variable.c:115 #, c-format msgid "incorrectly formed variable \"%s\"" msgstr "ìž˜ëª»ëœ í˜•ì‹ì˜ 변수 \"%s\"" -#: variable.c:139 +#: variable.c:138 #, c-format msgid "variable \"%s\" is not a pointer" msgstr "\"%s\" 변수가 í¬ì¸í„°ê°€ 아님" -#: variable.c:142 variable.c:167 +#: variable.c:141 variable.c:166 #, c-format msgid "variable \"%s\" is not a pointer to a structure or a union" msgstr "\"%s\" 변수가 구조나 unionì˜ í¬ì¸í„°ê°€ 아님" -#: variable.c:154 +#: variable.c:153 #, c-format msgid "variable \"%s\" is neither a structure nor a union" msgstr "\"%s\" 변수가 구조나 unionì´ ì•„ë‹˜" -#: variable.c:164 +#: variable.c:163 #, c-format msgid "variable \"%s\" is not an array" msgstr "\"%s\" 변수가 ë°°ì—´ì´ ì•„ë‹˜" -#: variable.c:233 variable.c:255 +#: variable.c:232 variable.c:254 #, c-format msgid "variable \"%s\" is not declared" msgstr "\"%s\" 변수가 ì„ ì–¸ë˜ì§€ 않ìŒ" -#: variable.c:494 +#: variable.c:492 #, c-format msgid "indicator variable must have an integer type" msgstr "표시기 ë³€ìˆ˜ì— ì •ìˆ˜ 형ì‹ì´ 있어야 함" -#: variable.c:506 +#: variable.c:509 #, c-format msgid "unrecognized data type name \"%s\"" msgstr "ì¸ì‹í•  수 없는 ë°ì´í„° í˜•ì‹ ì´ë¦„ \"%s\"" -#: variable.c:517 variable.c:525 variable.c:542 variable.c:545 +#: variable.c:520 variable.c:528 variable.c:545 variable.c:548 #, c-format msgid "multidimensional arrays are not supported" msgstr "ë‹¤ì°¨ì› ë°°ì—´ì´ ì§€ì›ë˜ì§€ 않ìŒ" -#: variable.c:534 +#: variable.c:537 #, c-format msgid "" "multilevel pointers (more than 2 levels) are not supported; found %d level" @@ -679,12 +702,12 @@ msgid_plural "" "multilevel pointers (more than 2 levels) are not supported; found %d levels" msgstr[0] "다중단계 í¬ì¸í„°(2단계 ì´ìƒ)는 ì§€ì›í•˜ì§€ 않ìŒ; ë°œê²¬ëœ ë ˆë²¨: %d" -#: variable.c:539 +#: variable.c:542 #, c-format msgid "pointer to pointer is not supported for this data type" msgstr "ì´ ë°ì´í„° 형ì‹ì—는 í¬ì¸í„°ì— 대한 í¬ì¸í„°ê°€ ì§€ì›ë˜ì§€ 않ìŒ" -#: variable.c:559 +#: variable.c:562 #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "구조ì—는 ë‹¤ì°¨ì› ë°°ì—´ì´ ì§€ì›ë˜ì§€ 않ìŒ" diff --git a/src/interfaces/ecpg/preproc/po/meson.build b/src/interfaces/ecpg/preproc/po/meson.build index 43f825b88bb0c..c37de37037dc5 100644 --- a/src/interfaces/ecpg/preproc/po/meson.build +++ b/src/interfaces/ecpg/preproc/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('ecpg-' + pg_version_major.to_string())] diff --git a/src/interfaces/ecpg/preproc/po/pl.po b/src/interfaces/ecpg/preproc/po/pl.po index c3a2fe257cae8..f58e78d4412bd 100644 --- a/src/interfaces/ecpg/preproc/po/pl.po +++ b/src/interfaces/ecpg/preproc/po/pl.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: ecpg (PostgreSQL 9.1)\n" "Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" "POT-Creation-Date: 2017-03-14 17:38+0000\n" -"PO-Revision-Date: 2017-03-14 19:42+0200\n" +"PO-Revision-Date: 2023-09-05 08:41+0200\n" "Last-Translator: grzegorz \n" "Language-Team: begina.felicysym@wp.eu\n" "Language: pl\n" @@ -120,7 +120,7 @@ msgstr " -i parsuje również systemowe pliki nagłówkowe\n" #: ecpg.c:51 #, c-format msgid " -I DIRECTORY search DIRECTORY for include files\n" -msgstr " -I FOLDER przeszukuje FOLDER w poszukiwaniu plików nagłówkowych\n" +msgstr " -I FOLDER przeszukuje FOLDER w poszukiwaniu plików nagłówkowych\n" #: ecpg.c:52 #, c-format diff --git a/src/interfaces/ecpg/preproc/po/ru.po b/src/interfaces/ecpg/preproc/po/ru.po index 12f4d1e28654c..874da38e6428d 100644 --- a/src/interfaces/ecpg/preproc/po/ru.po +++ b/src/interfaces/ecpg/preproc/po/ru.po @@ -1,58 +1,58 @@ # Russian message translation file for ecpg # Copyright (C) 2012-2016 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2024. msgid "" msgstr "" "Project-Id-Version: ecpg (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-29 10:17+0300\n" -"PO-Revision-Date: 2022-09-05 13:32+0300\n" +"POT-Creation-Date: 2025-02-08 07:44+0200\n" +"PO-Revision-Date: 2024-09-04 07:22+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: descriptor.c:64 #, c-format msgid "variable \"%s\" must have a numeric type" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\" должна иметь чиÑловой тип" -#: descriptor.c:125 descriptor.c:156 +#: descriptor.c:124 descriptor.c:155 #, c-format msgid "descriptor %s bound to connection %s does not exist" msgstr "деÑкриптор %s, привÑзанный к Ñоединению %s, не ÑущеÑтвует" -#: descriptor.c:127 descriptor.c:158 +#: descriptor.c:126 descriptor.c:157 #, c-format msgid "descriptor %s bound to the default connection does not exist" msgstr "деÑкриптор %s, привÑзанный к Ñоединению по умолчанию, не ÑущеÑтвует" -#: descriptor.c:173 descriptor.c:225 +#: descriptor.c:172 descriptor.c:224 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "заголовок деÑкриптора не Ñодержит Ñлемент \"%d\"" -#: descriptor.c:195 +#: descriptor.c:194 #, c-format msgid "nullable is always 1" msgstr "NULLABLE вÑегда равно 1" -#: descriptor.c:198 +#: descriptor.c:197 #, c-format msgid "key_member is always 0" msgstr "KEY_MEMBER вÑегда равно 0" -#: descriptor.c:292 +#: descriptor.c:291 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "поле \"%s\" в деÑкрипторе не реализовано" -#: descriptor.c:302 +#: descriptor.c:301 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "уÑтановить поле \"%s\" в деÑкрипторе нельзÑ" @@ -186,181 +186,181 @@ msgstr "" msgid "%s home page: <%s>\n" msgstr "ДомашнÑÑ Ñтраница %s: <%s>\n" -#: ecpg.c:141 +#: ecpg.c:152 #, c-format msgid "%s: could not locate my own executable path\n" msgstr "%s: не удалоÑÑŒ найти путь к ÑобÑтвенному иÑполнÑемому файлу\n" -#: ecpg.c:176 ecpg.c:333 ecpg.c:344 -#, c-format -msgid "%s: could not open file \"%s\": %s\n" -msgstr "%s: не удалоÑÑŒ открыть файл \"%s\": %s\n" - -#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 +#: ecpg.c:195 ecpg.c:246 ecpg.c:260 ecpg.c:286 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Ð”Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации попробуйте \"%s --help\".\n" -#: ecpg.c:243 +#: ecpg.c:203 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: отладочные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ разборе (-d) не поддерживаютÑÑ\n" -#: ecpg.c:262 +#: ecpg.c:230 ecpg.c:345 ecpg.c:356 +#, c-format +msgid "%s: could not open file \"%s\": %m\n" +msgstr "%s: не удалоÑÑŒ открыть файл \"%s\": %m\n" + +#: ecpg.c:274 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, препроцеÑÑор внедрённого в С Ñзыка СУБД PostgreSQL, верÑÐ¸Ñ %s\n" -#: ecpg.c:264 +#: ecpg.c:276 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "поиÑк файлов Ð´Ð»Ñ EXEC SQL INCLUDE ... начинаетÑÑ Ð² каталогах:\n" -#: ecpg.c:267 +#: ecpg.c:279 #, c-format msgid "end of search list\n" msgstr "конец ÑпиÑка поиÑка\n" -#: ecpg.c:273 +#: ecpg.c:285 #, c-format msgid "%s: no input files specified\n" msgstr "%s: нет входных файлов\n" -#: ecpg.c:477 +#: ecpg.c:491 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "курÑор \"%s\" был объÑвлен, но не открыт" -#: ecpg.c:490 preproc.y:130 +#: ecpg.c:504 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "ошибка при удалении выходного файла \"%s\"\n" -#: pgc.l:508 +#: pgc.l:542 #, c-format msgid "unterminated /* comment" msgstr "незавершённый комментарий /*" -#: pgc.l:525 +#: pgc.l:559 #, c-format msgid "unterminated bit string literal" msgstr "Ð¾Ð±Ð¾Ñ€Ð²Ð°Ð½Ð½Ð°Ñ Ð±Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтрока" -#: pgc.l:533 +#: pgc.l:567 #, c-format msgid "unterminated hexadecimal string literal" msgstr "Ð¾Ð±Ð¾Ñ€Ð²Ð°Ð½Ð½Ð°Ñ ÑˆÐµÑÑ‚Ð½Ð°Ð´Ñ†Ð°Ñ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ Ñтрока" -#: pgc.l:608 +#: pgc.l:642 #, c-format msgid "invalid bit string literal" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð±Ð¸Ñ‚Ð¾Ð²Ð°Ñ Ñтрока" -#: pgc.l:613 +#: pgc.l:647 #, c-format msgid "invalid hexadecimal string literal" msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑˆÐµÑÑ‚Ð½Ð°Ð´Ñ†Ð°Ñ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ Ñтрока" -#: pgc.l:631 +#: pgc.l:665 #, c-format msgid "unhandled previous state in xqs\n" msgstr "" "необрабатываемое предыдущее ÑоÑтоÑние при обнаружении закрывающего " "апоÑтрофа\n" -#: pgc.l:657 pgc.l:766 +#: pgc.l:691 pgc.l:800 #, c-format msgid "unterminated quoted string" msgstr "Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ Ñтрока в кавычках" -#: pgc.l:708 +#: pgc.l:742 #, c-format msgid "unterminated dollar-quoted string" msgstr "Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÑ‘Ð½Ð½Ð°Ñ Ñтрока Ñ $" -#: pgc.l:726 pgc.l:746 +#: pgc.l:760 pgc.l:780 #, c-format msgid "zero-length delimited identifier" msgstr "пуÑтой идентификатор в кавычках" -#: pgc.l:757 +#: pgc.l:791 #, c-format msgid "unterminated quoted identifier" msgstr "незавершённый идентификатор в кавычках" -#: pgc.l:926 +#: pgc.l:960 #, c-format msgid "trailing junk after parameter" msgstr "муÑорное Ñодержимое поÑле параметра" -#: pgc.l:968 pgc.l:971 pgc.l:974 +#: pgc.l:1012 pgc.l:1015 pgc.l:1018 #, c-format msgid "trailing junk after numeric literal" msgstr "муÑорное Ñодержимое поÑле чиÑловой конÑтанты" -#: pgc.l:1100 +#: pgc.l:1141 #, c-format msgid "nested /* ... */ comments" msgstr "вложенные комментарии /* ... */" -#: pgc.l:1193 +#: pgc.l:1240 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "в команде EXEC SQL UNDEF отÑутÑтвует идентификатор" -#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 +#: pgc.l:1258 pgc.l:1271 pgc.l:1287 pgc.l:1300 #, c-format msgid "too many nested EXEC SQL IFDEF conditions" msgstr "Ñлишком много вложенных уÑловий EXEC SQL IFDEF" -#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 +#: pgc.l:1316 pgc.l:1327 pgc.l:1342 pgc.l:1364 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "нет ÑоответÑтвующего \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" -#: pgc.l:1271 pgc.l:1282 pgc.l:1463 +#: pgc.l:1318 pgc.l:1329 pgc.l:1522 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "отÑутÑтвует \"EXEC SQL ENDIF;\"" -#: pgc.l:1297 pgc.l:1319 +#: pgc.l:1344 pgc.l:1366 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "Ð½ÐµÐ¾Ð´Ð½Ð¾ÐºÑ€Ð°Ñ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° EXEC SQL ELSE" -#: pgc.l:1342 pgc.l:1356 +#: pgc.l:1389 pgc.l:1403 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "Ð½ÐµÐ¿Ð°Ñ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° EXEC SQL ENDIF" -#: pgc.l:1411 +#: pgc.l:1464 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "в команде EXEC SQL IFDEF отÑутÑтвует идентификатор" -#: pgc.l:1420 +#: pgc.l:1473 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "в команде EXEC SQL DEFINE отÑутÑтвует идентификатор" -#: pgc.l:1453 +#: pgc.l:1511 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "ошибка ÑинтакÑиÑа в команде EXEC SQL INCLUDE" -#: pgc.l:1503 +#: pgc.l:1566 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°: недоÑтижимое ÑоÑтоÑние; пожалуйÑта, Ñообщите в <%s>" -#: pgc.l:1655 +#: pgc.l:1718 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "" "Ошибка: путь включаемых файлов \"%s/%s\" в Ñтроке %d Ñлишком длинный, " "пропуÑкаетÑÑ\n" -#: pgc.l:1678 +#: pgc.l:1741 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "не удалоÑÑŒ открыть включаемый файл \"%s\" (Ñтрока %d)" @@ -394,12 +394,12 @@ msgstr "определение типа не может включать ини msgid "type name \"string\" is reserved in Informix mode" msgstr "Ð¸Ð¼Ñ Ñ‚Ð¸Ð¿Ð° \"string\" в режиме Informix зарезервировано" -#: preproc.y:552 preproc.y:17925 +#: preproc.y:552 preproc.y:19034 #, c-format msgid "type \"%s\" is already defined" msgstr "тип \"%s\" уже определён" -#: preproc.y:577 preproc.y:18560 preproc.y:18885 variable.c:621 +#: preproc.y:577 preproc.y:19669 preproc.y:19991 variable.c:624 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "многомерные маÑÑивы Ñ Ð¿Ñ€Ð¾Ñтыми типами данных не поддерживаютÑÑ" @@ -409,96 +409,90 @@ msgstr "многомерные маÑÑивы Ñ Ð¿Ñ€Ð¾Ñтыми типами msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "подключение %s заменÑетÑÑ Ð½Ð° %s оператором DECLARE %s" -#: preproc.y:1767 +#: preproc.y:1831 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "оператор CLOSE DATABASE Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ AT не поддерживаетÑÑ" -#: preproc.y:2017 +#: preproc.y:2081 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "оператор CONNECT Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ AT не поддерживаетÑÑ" -#: preproc.y:2057 +#: preproc.y:2121 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "оператор DISCONNECT Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ AT не поддерживаетÑÑ" -#: preproc.y:2112 +#: preproc.y:2176 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "оператор SET CONNECTION Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ AT не поддерживаетÑÑ" -#: preproc.y:2134 +#: preproc.y:2198 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "оператор TYPE Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ AT не поддерживаетÑÑ" -#: preproc.y:2143 +#: preproc.y:2207 #, c-format msgid "AT option not allowed in VAR statement" msgstr "оператор VAR Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ AT не поддерживаетÑÑ" -#: preproc.y:2150 +#: preproc.y:2214 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "оператор WHENEVER Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ AT не поддерживаетÑÑ" -#: preproc.y:2227 preproc.y:2399 preproc.y:2404 preproc.y:2527 preproc.y:4178 -#: preproc.y:4252 preproc.y:4843 preproc.y:5376 preproc.y:5714 preproc.y:6014 -#: preproc.y:7582 preproc.y:9183 preproc.y:9188 preproc.y:12139 +#: preproc.y:2339 preproc.y:2626 preproc.y:4349 preproc.y:5021 preproc.y:5891 +#: preproc.y:6095 preproc.y:6196 preproc.y:12460 #, c-format msgid "unsupported feature will be passed to server" msgstr "Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ передана Ñерверу" -#: preproc.y:2785 +#: preproc.y:2884 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL не реализовано" -#: preproc.y:3484 +#: preproc.y:3596 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ COPY FROM STDIN не реализована" -#: preproc.y:10230 preproc.y:17498 +#: preproc.y:10444 preproc.y:18503 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "" "в режиме INFORMIX Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать \"database\" в качеÑтве имени курÑора" -#: preproc.y:10237 preproc.y:17508 +#: preproc.y:10451 preproc.y:18513 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "" "иÑпользование переменной \"%s\" в разных операторах DECLARE не поддерживаетÑÑ" -#: preproc.y:10239 preproc.y:17510 +#: preproc.y:10453 preproc.y:18515 #, c-format msgid "cursor \"%s\" is already defined" msgstr "курÑор \"%s\" уже определён" -#: preproc.y:10713 +#: preproc.y:10927 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "не поддерживаемое более предложение LIMIT #,# передано на Ñервер" -#: preproc.y:11046 preproc.y:11053 -#, c-format -msgid "subquery in FROM must have an alias" -msgstr "Ð¿Ð¾Ð´Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾ FROM должен иметь пÑевдоним" - -#: preproc.y:17190 preproc.y:17197 +#: preproc.y:18195 preproc.y:18202 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "в CREATE TABLE AS Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ INTO" -#: preproc.y:17233 +#: preproc.y:18238 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "ожидалÑÑ Ð·Ð½Ð°Ðº \"@\", но на Ñтом меÑте \"%s\"" -#: preproc.y:17245 +#: preproc.y:18250 #, c-format msgid "" "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are " @@ -507,89 +501,89 @@ msgstr "" "поддерживаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ протоколы \"tcp\" и \"unix\", а тип базы данных - " "\"postgresql\"" -#: preproc.y:17248 +#: preproc.y:18253 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "ожидалоÑÑŒ \"://\", но на Ñтом меÑте \"%s\"" -#: preproc.y:17253 +#: preproc.y:18258 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unix-Ñокеты работают только Ñ \"localhost\", но не Ñ Ð°Ð´Ñ€ÐµÑом \"%s\"" -#: preproc.y:17279 +#: preproc.y:18284 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "ожидалÑÑ Ñ‚Ð¸Ð¿ \"postgresql\", но на Ñтом меÑте \"%s\"" -#: preproc.y:17282 +#: preproc.y:18287 #, c-format msgid "invalid connection type: %s" msgstr "неверный тип подключениÑ: %s" -#: preproc.y:17291 +#: preproc.y:18296 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "ожидалоÑÑŒ \"@\" или \"://\", но на Ñтом меÑте \"%s\"" -#: preproc.y:17366 preproc.y:17384 +#: preproc.y:18371 preproc.y:18389 #, c-format msgid "invalid data type" msgstr "неверный тип данных" -#: preproc.y:17395 preproc.y:17412 +#: preproc.y:18400 preproc.y:18417 #, c-format msgid "incomplete statement" msgstr "неполный оператор" -#: preproc.y:17398 preproc.y:17415 +#: preproc.y:18403 preproc.y:18420 #, c-format msgid "unrecognized token \"%s\"" msgstr "нераÑпознанное ключевое Ñлово \"%s\"" -#: preproc.y:17460 +#: preproc.y:18465 #, c-format msgid "name \"%s\" is already declared" msgstr "Ð¸Ð¼Ñ \"%s\" уже объÑвлено" -#: preproc.y:17728 +#: preproc.y:18754 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "" "точноÑть/маÑштаб можно указать только Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð¾Ð² данных numeric и decimal" -#: preproc.y:17740 +#: preproc.y:18853 #, c-format msgid "interval specification not allowed here" msgstr "определение интервала здеÑÑŒ не допуÑкаетÑÑ" -#: preproc.y:17900 preproc.y:17952 +#: preproc.y:19009 preproc.y:19061 #, c-format msgid "too many levels in nested structure/union definition" msgstr "Ñлишком много уровней в определении вложенной Ñтруктуры/объединениÑ" -#: preproc.y:18075 +#: preproc.y:19184 #, c-format msgid "pointers to varchar are not implemented" msgstr "указатели на varchar не реализованы" -#: preproc.y:18526 +#: preproc.y:19635 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "команда EXEC SQL VAR не может включать инициализатор" -#: preproc.y:18843 +#: preproc.y:19949 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "маÑÑивы индикаторов на входе недопуÑтимы" -#: preproc.y:19030 +#: preproc.y:20136 #, c-format msgid "operator not allowed in variable definition" msgstr "недопуÑтимый оператор в определении переменной" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:19071 +#: preproc.y:20177 #, c-format msgid "%s at or near \"%s\"" msgstr "%s (примерное положение: \"%s\")" @@ -660,52 +654,52 @@ msgstr "в Ñтруктуре индикаторе \"%s\" Ñлишком мно msgid "unrecognized descriptor item code %d" msgstr "нераÑпознанный код Ñлемента деÑкриптора %d" -#: variable.c:89 variable.c:116 +#: variable.c:89 variable.c:115 #, c-format msgid "incorrectly formed variable \"%s\"" msgstr "неправильно Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\"" -#: variable.c:139 +#: variable.c:138 #, c-format msgid "variable \"%s\" is not a pointer" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\" - не указатель" -#: variable.c:142 variable.c:167 +#: variable.c:141 variable.c:166 #, c-format msgid "variable \"%s\" is not a pointer to a structure or a union" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\" - не указатель на Ñтруктуру или объединение" -#: variable.c:154 +#: variable.c:153 #, c-format msgid "variable \"%s\" is neither a structure nor a union" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\" - не Ñтруктура и не объединение" -#: variable.c:164 +#: variable.c:163 #, c-format msgid "variable \"%s\" is not an array" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\" - не маÑÑив" -#: variable.c:233 variable.c:255 +#: variable.c:232 variable.c:254 #, c-format msgid "variable \"%s\" is not declared" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\" не объÑвлена" -#: variable.c:494 +#: variable.c:492 #, c-format msgid "indicator variable must have an integer type" msgstr "переменнаÑ-индикатор должна быть целочиÑленной" -#: variable.c:506 +#: variable.c:509 #, c-format msgid "unrecognized data type name \"%s\"" msgstr "нераÑпознанное Ð¸Ð¼Ñ Ñ‚Ð¸Ð¿Ð° данных \"%s\"" -#: variable.c:517 variable.c:525 variable.c:542 variable.c:545 +#: variable.c:520 variable.c:528 variable.c:545 variable.c:548 #, c-format msgid "multidimensional arrays are not supported" msgstr "многомерные маÑÑивы не поддерживаютÑÑ" -#: variable.c:534 +#: variable.c:537 #, c-format msgid "" "multilevel pointers (more than 2 levels) are not supported; found %d level" @@ -721,16 +715,20 @@ msgstr[2] "" "многоуровневые указатели (больше 2 уровней) не поддерживаютÑÑ, обнаружено %d " "уровней" -#: variable.c:539 +#: variable.c:542 #, c-format msgid "pointer to pointer is not supported for this data type" msgstr "Ð´Ð»Ñ Ñтого типа данных указатели на указатели не поддерживаютÑÑ" -#: variable.c:559 +#: variable.c:562 #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "многомерные маÑÑивы Ñтруктур не поддерживаютÑÑ" +#, c-format +#~ msgid "subquery in FROM must have an alias" +#~ msgstr "Ð¿Ð¾Ð´Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²Ð¾ FROM должен иметь пÑевдоним" + #~ msgid "using unsupported DESCRIBE statement" #~ msgstr "иÑпользуетÑÑ Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ñ‹Ð¹ оператор DESCRIBE" diff --git a/src/interfaces/ecpg/preproc/po/sv.po b/src/interfaces/ecpg/preproc/po/sv.po index 3b8d67c61ddd6..2fb7e68894a3b 100644 --- a/src/interfaces/ecpg/preproc/po/sv.po +++ b/src/interfaces/ecpg/preproc/po/sv.po @@ -1,14 +1,14 @@ # SWEDISHE message translation file for ecpg # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-11 09:09+0000\n" -"PO-Revision-Date: 2022-04-11 14:39+0200\n" +"POT-Creation-Date: 2024-07-12 11:10+0000\n" +"PO-Revision-Date: 2024-07-12 15:07+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -22,37 +22,37 @@ msgstr "" msgid "variable \"%s\" must have a numeric type" msgstr "variabel \"%s\" mÃ¥ste ha en numerisk typ" -#: descriptor.c:125 descriptor.c:156 +#: descriptor.c:124 descriptor.c:155 #, c-format msgid "descriptor %s bound to connection %s does not exist" msgstr "deskriptor %s kopplad till anslutning %s finns inte" -#: descriptor.c:127 descriptor.c:158 +#: descriptor.c:126 descriptor.c:157 #, c-format msgid "descriptor %s bound to the default connection does not exist" msgstr "deskriptor %s kopplad till standardanslutning finns inte" -#: descriptor.c:173 descriptor.c:225 +#: descriptor.c:172 descriptor.c:224 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "deskriptor-header-post \"%d\" finns inte" -#: descriptor.c:195 +#: descriptor.c:194 #, c-format msgid "nullable is always 1" msgstr "nullable är alltid 1" -#: descriptor.c:198 +#: descriptor.c:197 #, c-format msgid "key_member is always 0" msgstr "key_member är alltid 0" -#: descriptor.c:292 +#: descriptor.c:291 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "deskriptor-post \"%s\" är inte implementerad" -#: descriptor.c:302 +#: descriptor.c:301 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "deskriptor-post \"%s\" kan inte sättas" @@ -184,177 +184,177 @@ msgstr "" msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" -#: ecpg.c:141 +#: ecpg.c:152 #, c-format msgid "%s: could not locate my own executable path\n" msgstr "%s: kunde inte hitta min egna körbara fils sökväg\n" -#: ecpg.c:176 ecpg.c:333 ecpg.c:344 -#, c-format -msgid "%s: could not open file \"%s\": %s\n" -msgstr "%s: kunde inte öppna fil \"%s\": %s\n" - -#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 +#: ecpg.c:195 ecpg.c:246 ecpg.c:260 ecpg.c:286 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Försök med \"%s --help\" för mer information.\n" -#: ecpg.c:243 +#: ecpg.c:203 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: parser-debug-stöd (-d) är inte tillgängligt\n" -#: ecpg.c:262 +#: ecpg.c:230 ecpg.c:345 ecpg.c:356 +#, c-format +msgid "%s: could not open file \"%s\": %m\n" +msgstr "%s: kunde inte öppna fil \"%s\": %m\n" + +#: ecpg.c:274 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, PostgreSQLs inbäddade C-preprocessor, version %s\n" -#: ecpg.c:264 +#: ecpg.c:276 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "EXEC SQL INCLUDE ... sökning startar här:\n" -#: ecpg.c:267 +#: ecpg.c:279 #, c-format msgid "end of search list\n" msgstr "slut pÃ¥ söklista\n" -#: ecpg.c:273 +#: ecpg.c:285 #, c-format msgid "%s: no input files specified\n" msgstr "%s: inga indatafiler angivna\n" -#: ecpg.c:477 +#: ecpg.c:491 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "markören \"%s\" har deklarerats men inte öppnats" -#: ecpg.c:490 preproc.y:130 +#: ecpg.c:504 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "kunde inte ta bort utdatafil \"%s\"\n" -#: pgc.l:508 +#: pgc.l:528 #, c-format msgid "unterminated /* comment" msgstr "ej avslutad /*-kommentar" -#: pgc.l:525 +#: pgc.l:545 #, c-format msgid "unterminated bit string literal" msgstr "ej avslutad bitsträngslitteral" -#: pgc.l:533 +#: pgc.l:553 #, c-format msgid "unterminated hexadecimal string literal" msgstr "ej avslutad hexadecimal stränglitteral" -#: pgc.l:608 +#: pgc.l:628 #, c-format msgid "invalid bit string literal" msgstr "ogiltig bit-sträng-literal" -#: pgc.l:613 +#: pgc.l:633 #, c-format msgid "invalid hexadecimal string literal" msgstr "ogiltig hexdecimal sträng-literal" -#: pgc.l:631 +#: pgc.l:651 #, c-format msgid "unhandled previous state in xqs\n" msgstr "tidigare state i xqs som ej kan hanteras\n" -#: pgc.l:657 pgc.l:766 +#: pgc.l:677 pgc.l:786 #, c-format msgid "unterminated quoted string" msgstr "icketerminerad citerad sträng" -#: pgc.l:708 +#: pgc.l:728 #, c-format msgid "unterminated dollar-quoted string" msgstr "icke terminerad dollarciterad sträng" -#: pgc.l:726 pgc.l:746 +#: pgc.l:746 pgc.l:766 #, c-format msgid "zero-length delimited identifier" msgstr "noll-längds avdelad identifierare" -#: pgc.l:757 +#: pgc.l:777 #, c-format msgid "unterminated quoted identifier" msgstr "ej avslutad citerad identifierare" -#: pgc.l:926 +#: pgc.l:946 #, c-format msgid "trailing junk after parameter" msgstr "efterföljande skräp efter parameter" -#: pgc.l:968 pgc.l:971 pgc.l:974 +#: pgc.l:998 pgc.l:1001 pgc.l:1004 pgc.l:1007 pgc.l:1010 pgc.l:1013 #, c-format msgid "trailing junk after numeric literal" msgstr "efterföljande skräp efter numerisk literal" -#: pgc.l:1100 +#: pgc.l:1136 #, c-format msgid "nested /* ... */ comments" msgstr "nästlade /* ... */-kommentarer" -#: pgc.l:1193 +#: pgc.l:1235 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "saknar identifierare i EXEC SQL UNDEF-kommando" -#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 +#: pgc.l:1253 pgc.l:1266 pgc.l:1282 pgc.l:1295 #, c-format msgid "too many nested EXEC SQL IFDEF conditions" msgstr "för mÃ¥nga nästlade EXEC SQL IFDEF-villkor" -#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 +#: pgc.l:1311 pgc.l:1322 pgc.l:1337 pgc.l:1359 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "saknar matchande \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" -#: pgc.l:1271 pgc.l:1282 pgc.l:1463 +#: pgc.l:1313 pgc.l:1324 pgc.l:1517 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "saknar \"EXEC SQL ENDIF;\"" -#: pgc.l:1297 pgc.l:1319 +#: pgc.l:1339 pgc.l:1361 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "mer än en EXEC SQL ELSE" -#: pgc.l:1342 pgc.l:1356 +#: pgc.l:1384 pgc.l:1398 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "ej matchad EXEC SQL ENDIF" -#: pgc.l:1411 +#: pgc.l:1459 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "saknar identifierare i EXEC SQL IFDEF-kommando" -#: pgc.l:1420 +#: pgc.l:1468 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "saknar identifierare i EXEC SQL DEFINE-kommando" -#: pgc.l:1453 +#: pgc.l:1506 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "syntaxfel i EXEC SQL INCLUDE-kommando" -#: pgc.l:1503 +#: pgc.l:1561 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "internt fel: state som ej skall kunna nÃ¥s; vänligen rapportera detta till <%s>" -#: pgc.l:1655 +#: pgc.l:1713 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "Fel: include-sökväg \"%s/%s\" är för lÃ¥ng pÃ¥ rad %d, hoppar över\n" -#: pgc.l:1678 +#: pgc.l:1736 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "kunde inte öppna inkludefil \"%s\" pÃ¥ rad %d" @@ -388,12 +388,12 @@ msgstr "initialiserare tillÃ¥ts inte i typdefinition" msgid "type name \"string\" is reserved in Informix mode" msgstr "typnamn \"string\" är reserverat i Informix-läge" -#: preproc.y:552 preproc.y:19317 +#: preproc.y:552 preproc.y:19072 #, c-format msgid "type \"%s\" is already defined" msgstr "typen \"%s\" är redan definierad" -#: preproc.y:577 preproc.y:19952 preproc.y:20277 variable.c:621 +#: preproc.y:577 preproc.y:19707 preproc.y:20029 variable.c:625 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "multidimensionella array:er för enkla datatyper stöds inte" @@ -403,180 +403,174 @@ msgstr "multidimensionella array:er för enkla datatyper stöds inte" msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "anslutning %s överskriven med %s av DECLARE-sats %s" -#: preproc.y:1872 +#: preproc.y:1833 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "AT-flaggan tillÃ¥ts inte i CLOSE DATABASE-sats" -#: preproc.y:2122 +#: preproc.y:2083 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "AT-flaggan tillÃ¥ts inte i CONNECT-sats" -#: preproc.y:2162 +#: preproc.y:2123 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "AT-flaggan tillÃ¥ts inte i DISCONNECT-sats" -#: preproc.y:2217 +#: preproc.y:2178 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "AT-flaggan tillÃ¥ts inte i SET CONNECTION-sats" -#: preproc.y:2239 +#: preproc.y:2200 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "AT-flaggan tillÃ¥ts inte i TYPE-sats" -#: preproc.y:2248 +#: preproc.y:2209 #, c-format msgid "AT option not allowed in VAR statement" msgstr "AT-flaggan tillÃ¥ts inte i VAR-sats" -#: preproc.y:2255 +#: preproc.y:2216 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "AT-flaggan tillÃ¥ts inte i WHENEVER-sats" -#: preproc.y:2332 preproc.y:2504 preproc.y:2509 preproc.y:2632 preproc.y:4283 -#: preproc.y:4357 preproc.y:4948 preproc.y:5481 preproc.y:5819 preproc.y:6119 -#: preproc.y:7687 preproc.y:9288 preproc.y:9293 preproc.y:12272 +#: preproc.y:2341 preproc.y:2628 preproc.y:4379 preproc.y:5043 preproc.y:5913 +#: preproc.y:6117 preproc.y:6218 preproc.y:12482 #, c-format msgid "unsupported feature will be passed to server" msgstr "ej stödd funktion skickass till servern" -#: preproc.y:2890 +#: preproc.y:2886 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL är inte implementerad" -#: preproc.y:3589 +#: preproc.y:3626 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN är inte implementerad" -#: preproc.y:10335 preproc.y:18892 +#: preproc.y:10466 preproc.y:18541 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "\"database\" kan inte användas som markörsnamn i INFORMIX-läge" -#: preproc.y:10342 preproc.y:18902 +#: preproc.y:10473 preproc.y:18551 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "använda variabel \"%s\" i olika deklarationssatser stöds inte" -#: preproc.y:10344 preproc.y:18904 +#: preproc.y:10475 preproc.y:18553 #, c-format msgid "cursor \"%s\" is already defined" msgstr "markören \"%s\" är redan definierad" -#: preproc.y:10818 +#: preproc.y:10949 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "ej längre stödd syntax LIMIT #,# har skickats till servern" -#: preproc.y:11151 preproc.y:11158 -#, c-format -msgid "subquery in FROM must have an alias" -msgstr "subfrÃ¥ga i FROM mÃ¥ste ha ett alias" - -#: preproc.y:18584 preproc.y:18591 +#: preproc.y:18233 preproc.y:18240 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS kan inte ange INTO" -#: preproc.y:18627 +#: preproc.y:18276 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "förväntade \"@\", hittade \"%s\"" -#: preproc.y:18639 +#: preproc.y:18288 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "bara protokoll \"tcp\" och \"unix\" samt databastyp \"postgresql\" stöds" -#: preproc.y:18642 +#: preproc.y:18291 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "förväntade \"://\", hittade \"%s\"" -#: preproc.y:18647 +#: preproc.y:18296 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unix-domän-socket fungerart bara pÃ¥ \"localhost\" men inte pÃ¥ \"%s\"" -#: preproc.y:18673 +#: preproc.y:18322 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "förväntade \"postgresql\", hittade \"%s\"" -#: preproc.y:18676 +#: preproc.y:18325 #, c-format msgid "invalid connection type: %s" msgstr "ogiltig anslutningstyp: %s" -#: preproc.y:18685 +#: preproc.y:18334 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "förväntade \"@\" eller \"://\", hittade \"%s\"" -#: preproc.y:18760 preproc.y:18778 +#: preproc.y:18409 preproc.y:18427 #, c-format msgid "invalid data type" msgstr "ogiltig datatyp" -#: preproc.y:18789 preproc.y:18806 +#: preproc.y:18438 preproc.y:18455 #, c-format msgid "incomplete statement" msgstr "ofullständig sats" -#: preproc.y:18792 preproc.y:18809 +#: preproc.y:18441 preproc.y:18458 #, c-format msgid "unrecognized token \"%s\"" msgstr "okänd symbol \"%s\"" -#: preproc.y:18854 +#: preproc.y:18503 #, c-format msgid "name \"%s\" is already declared" msgstr "namnet \"%s\" är redan deklarerat" -#: preproc.y:19120 +#: preproc.y:18792 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "bara datatyperna numeric och decimal har precision/skala-argument" -#: preproc.y:19132 +#: preproc.y:18891 #, c-format msgid "interval specification not allowed here" msgstr "intervallspecifikation tillÃ¥ts inte här" -#: preproc.y:19292 preproc.y:19344 +#: preproc.y:19047 preproc.y:19099 #, c-format msgid "too many levels in nested structure/union definition" msgstr "för mÃ¥nga nästlade nivÃ¥er i struktur/union-definition" -#: preproc.y:19467 +#: preproc.y:19222 #, c-format msgid "pointers to varchar are not implemented" msgstr "pekare till varchar är inte implementerat" -#: preproc.y:19918 +#: preproc.y:19673 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "initialiserare tillÃ¥ts inte i EXEC SQL VAR-kommando" -#: preproc.y:20235 +#: preproc.y:19987 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "array:er av indikatorer tillÃ¥ts inte vid indata" -#: preproc.y:20422 +#: preproc.y:20174 #, c-format msgid "operator not allowed in variable definition" msgstr "operator tillÃ¥ts inte i variabeldefinition" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:20463 +#: preproc.y:20215 #, c-format msgid "%s at or near \"%s\"" msgstr "%s vid eller nära \"%s\"" @@ -646,64 +640,64 @@ msgstr "indikatorstruktur \"%s\" har för mÃ¥nga medlemmar" msgid "unrecognized descriptor item code %d" msgstr "okänd deskriptor-post-kod %d" -#: variable.c:89 variable.c:116 +#: variable.c:89 variable.c:115 #, c-format msgid "incorrectly formed variable \"%s\"" msgstr "inkorrekt formatterad variabel \"%s\"" -#: variable.c:139 +#: variable.c:138 #, c-format msgid "variable \"%s\" is not a pointer" msgstr "variabel \"%s\" är inte en pekare" -#: variable.c:142 variable.c:167 +#: variable.c:141 variable.c:166 #, c-format msgid "variable \"%s\" is not a pointer to a structure or a union" msgstr "variabel \"%s\" är inte en pekare till en struktur eller union" -#: variable.c:154 +#: variable.c:153 #, c-format msgid "variable \"%s\" is neither a structure nor a union" msgstr "variabel \"%s\" är varken en struktur eller en union" -#: variable.c:164 +#: variable.c:163 #, c-format msgid "variable \"%s\" is not an array" msgstr "variabel \"%s\" är inte en array" -#: variable.c:233 variable.c:255 +#: variable.c:232 variable.c:254 #, c-format msgid "variable \"%s\" is not declared" msgstr "variabel \"%s\" är inte deklarerad" -#: variable.c:494 +#: variable.c:493 #, c-format msgid "indicator variable must have an integer type" msgstr "indikatorvariabel mÃ¥ste ha en heltalstyp" -#: variable.c:506 +#: variable.c:510 #, c-format msgid "unrecognized data type name \"%s\"" msgstr "okänt datatypsnamn \"%s\"" -#: variable.c:517 variable.c:525 variable.c:542 variable.c:545 +#: variable.c:521 variable.c:529 variable.c:546 variable.c:549 #, c-format msgid "multidimensional arrays are not supported" msgstr "multidimensionella array:er stöds inte" -#: variable.c:534 +#: variable.c:538 #, c-format msgid "multilevel pointers (more than 2 levels) are not supported; found %d level" msgid_plural "multilevel pointers (more than 2 levels) are not supported; found %d levels" msgstr[0] "multinivÃ¥pekare (mer än 2 nivÃ¥er) stöds inte; hittade %d nivÃ¥" msgstr[1] "multinivÃ¥pekare (mer än 2 nivÃ¥er) stöds inte; hittade %d nivÃ¥er" -#: variable.c:539 +#: variable.c:543 #, c-format msgid "pointer to pointer is not supported for this data type" msgstr "pekare till pekare stöds inte för denna datatyp" -#: variable.c:559 +#: variable.c:563 #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "multidimensionella array:er av strukturer stöds inte" diff --git a/src/interfaces/ecpg/preproc/po/uk.po b/src/interfaces/ecpg/preproc/po/uk.po index f5c64240c6bf3..27ca851c33dd9 100644 --- a/src/interfaces/ecpg/preproc/po/uk.po +++ b/src/interfaces/ecpg/preproc/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:40+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-09-23 10:40+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,45 +14,45 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/ecpg.pot\n" -"X-Crowdin-File-ID: 906\n" +"X-Crowdin-File: /REL_17_STABLE/ecpg.pot\n" +"X-Crowdin-File-ID: 990\n" #: descriptor.c:64 #, c-format msgid "variable \"%s\" must have a numeric type" msgstr "змінна \"%s\" повинна мати чиÑловий тип" -#: descriptor.c:125 descriptor.c:156 +#: descriptor.c:124 descriptor.c:155 #, c-format msgid "descriptor %s bound to connection %s does not exist" msgstr "деÑкриптор %s, прив'Ñзаний до Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ %s, не Ñ–Ñнує" -#: descriptor.c:127 descriptor.c:158 +#: descriptor.c:126 descriptor.c:157 #, c-format msgid "descriptor %s bound to the default connection does not exist" msgstr "деÑкриптор %s, прив'Ñзаний до Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм, не Ñ–Ñнує" -#: descriptor.c:173 descriptor.c:225 +#: descriptor.c:172 descriptor.c:224 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "елемент заголовка деÑкриптору \"%d\" не Ñ–Ñнує" -#: descriptor.c:195 +#: descriptor.c:194 #, c-format msgid "nullable is always 1" msgstr "nullable завжди 1" -#: descriptor.c:198 +#: descriptor.c:197 #, c-format msgid "key_member is always 0" msgstr "key_member завжди 0" -#: descriptor.c:292 +#: descriptor.c:291 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "елемент деÑкриптору \"%s\" не реалізовано" -#: descriptor.c:302 +#: descriptor.c:301 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "елемент деÑкриптору \"%s\" не можна вÑтановити" @@ -165,177 +165,177 @@ msgstr "\n" msgid "%s home page: <%s>\n" msgstr "Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка %s: <%s>\n" -#: ecpg.c:141 +#: ecpg.c:152 #, c-format msgid "%s: could not locate my own executable path\n" msgstr "%s: не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ Ñвій влаÑний шлÑÑ… Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ\n" -#: ecpg.c:176 ecpg.c:333 ecpg.c:344 -#, c-format -msgid "%s: could not open file \"%s\": %s\n" -msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %s\n" - -#: ecpg.c:219 ecpg.c:232 ecpg.c:248 ecpg.c:274 +#: ecpg.c:195 ecpg.c:246 ecpg.c:260 ecpg.c:286 #, c-format msgid "Try \"%s --help\" for more information.\n" msgstr "Спробуйте \"%s --help\" Ð´Ð»Ñ Ð´Ð¾Ð´Ð°Ñ‚ÐºÐ¾Ð²Ð¾Ñ— інформації.\n" -#: ecpg.c:243 +#: ecpg.c:203 #, c-format msgid "%s: parser debug support (-d) not available\n" msgstr "%s: налагоджувальні Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ Ð°Ð½Ð°Ð»Ñ–Ð·Ñƒ (-d) не підтримуютьÑÑ\n" -#: ecpg.c:262 +#: ecpg.c:230 ecpg.c:345 ecpg.c:356 +#, c-format +msgid "%s: could not open file \"%s\": %m\n" +msgstr "%s: не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %m\n" + +#: ecpg.c:274 #, c-format msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" msgstr "%s, вбудований препроцеÑор PostgreSQL, верÑÑ–Ñ %s\n" -#: ecpg.c:264 +#: ecpg.c:276 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" msgstr "EXEC SQL INCLUDE ... пошук починаєтьÑÑ Ñ‚ÑƒÑ‚:\n" -#: ecpg.c:267 +#: ecpg.c:279 #, c-format msgid "end of search list\n" msgstr "кінець ÑпиÑку пошуку\n" -#: ecpg.c:273 +#: ecpg.c:285 #, c-format msgid "%s: no input files specified\n" msgstr "%s: не вказано вхідні файли\n" -#: ecpg.c:477 +#: ecpg.c:491 #, c-format msgid "cursor \"%s\" has been declared but not opened" msgstr "курÑор \"%s\" був оголошений, але не відкритий" -#: ecpg.c:490 preproc.y:130 +#: ecpg.c:504 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "не вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл виводу \"%s\"\n" -#: pgc.l:508 +#: pgc.l:542 #, c-format msgid "unterminated /* comment" msgstr "незавершений коментар /*" -#: pgc.l:525 +#: pgc.l:559 #, c-format msgid "unterminated bit string literal" msgstr "незавершений бітовий Ñ€Ñдок" -#: pgc.l:533 +#: pgc.l:567 #, c-format msgid "unterminated hexadecimal string literal" msgstr "незавершений шіÑтнадцÑтковий Ñ€Ñдок" -#: pgc.l:608 +#: pgc.l:642 #, c-format msgid "invalid bit string literal" msgstr "неприпуÑтимий літерал бітового Ñ€Ñдка" -#: pgc.l:613 +#: pgc.l:647 #, c-format msgid "invalid hexadecimal string literal" msgstr "неприпуÑтимий шіÑтнадцÑтковий Ñ€Ñдок" -#: pgc.l:631 +#: pgc.l:665 #, c-format msgid "unhandled previous state in xqs\n" msgstr "необроблений попередній Ñтан у xqs\n" -#: pgc.l:657 pgc.l:766 +#: pgc.l:691 pgc.l:800 #, c-format msgid "unterminated quoted string" msgstr "незавершений Ñ€Ñдок в лапках" -#: pgc.l:708 +#: pgc.l:742 #, c-format msgid "unterminated dollar-quoted string" msgstr "незавершений Ñ€Ñдок з $" -#: pgc.l:726 pgc.l:746 +#: pgc.l:760 pgc.l:780 #, c-format msgid "zero-length delimited identifier" msgstr "пуÑтий ідентифікатор із роздільниками" -#: pgc.l:757 +#: pgc.l:791 #, c-format msgid "unterminated quoted identifier" msgstr "незавершений ідентифікатор в лапках" -#: pgc.l:926 +#: pgc.l:960 #, c-format msgid "trailing junk after parameter" msgstr "ÑÐ¼Ñ–Ñ‚Ñ‚Ñ Ð¿Ñ–ÑÐ»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ" -#: pgc.l:968 pgc.l:971 pgc.l:974 +#: pgc.l:1012 pgc.l:1015 pgc.l:1018 #, c-format msgid "trailing junk after numeric literal" msgstr "ÑÐ¼Ñ–Ñ‚Ñ‚Ñ Ð¿Ñ–ÑÐ»Ñ Ñ‡Ð¸Ñлового літерала" -#: pgc.l:1100 +#: pgc.l:1141 #, c-format msgid "nested /* ... */ comments" msgstr "вкладені /* ... */ коменарі" -#: pgc.l:1193 +#: pgc.l:1240 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "відÑутній ідентифікатор у команді EXEC SQL UNDEF" -#: pgc.l:1211 pgc.l:1224 pgc.l:1240 pgc.l:1253 +#: pgc.l:1258 pgc.l:1271 pgc.l:1287 pgc.l:1300 #, c-format msgid "too many nested EXEC SQL IFDEF conditions" msgstr "забагато вкладених умов EXEC SQL IFDEF" -#: pgc.l:1269 pgc.l:1280 pgc.l:1295 pgc.l:1317 +#: pgc.l:1316 pgc.l:1327 pgc.l:1342 pgc.l:1364 #, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" msgstr "немає відповідного \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" -#: pgc.l:1271 pgc.l:1282 pgc.l:1463 +#: pgc.l:1318 pgc.l:1329 pgc.l:1522 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "відÑутній \"EXEC SQL ENDIF;\"" -#: pgc.l:1297 pgc.l:1319 +#: pgc.l:1344 pgc.l:1366 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "більше ніж один EXEC SQL ELSE" -#: pgc.l:1342 pgc.l:1356 +#: pgc.l:1389 pgc.l:1403 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "невідповідний EXEC SQL ENDIF" -#: pgc.l:1411 +#: pgc.l:1464 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "відÑутній ідентифікатор у команді EXEC SQL IFDEF" -#: pgc.l:1420 +#: pgc.l:1473 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "відÑутній ідентифікатор у команді EXEC SQL DEFINE" -#: pgc.l:1453 +#: pgc.l:1511 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "ÑинтакÑична помилка у команді EXEC SQL INCLUDE" -#: pgc.l:1503 +#: pgc.l:1566 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ°: недоÑÑжний Ñтан; будь лаÑка, повідомте про це на <%s>" -#: pgc.l:1655 +#: pgc.l:1718 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" msgstr "Помилка: шлÑÑ… Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ \"%s/%s\" занадто довгий у Ñ€Ñдку %d, пропуÑкаєтьÑÑ\n" -#: pgc.l:1678 +#: pgc.l:1741 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ \"%s\" у Ñ€Ñдку %d" @@ -369,12 +369,12 @@ msgstr "Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ Ð·Ð°Ð±Ð¾Ñ€Ð¾Ð½ÐµÐ½Ð° у визначенні msgid "type name \"string\" is reserved in Informix mode" msgstr "Ñ–Ð¼â€™Ñ Ñ‚Ð¸Ð¿Ñƒ \"string\" зарезервовано у режимі Informix" -#: preproc.y:552 preproc.y:19354 +#: preproc.y:552 preproc.y:19034 #, c-format msgid "type \"%s\" is already defined" msgstr "тип \"%s\" вже визначений" -#: preproc.y:577 preproc.y:19989 preproc.y:20314 variable.c:621 +#: preproc.y:577 preproc.y:19669 preproc.y:19991 variable.c:625 #, c-format msgid "multidimensional arrays for simple data types are not supported" msgstr "багатовимірні маÑиви Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñтих типів даних не підтримуютьÑÑ" @@ -384,180 +384,174 @@ msgstr "багатовимірні маÑиви Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñтих типів msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ %s було перезапиÑано з %s командою DECLARE %s" -#: preproc.y:1872 +#: preproc.y:1831 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "Параметр AT не дозволений в інÑтрукції CLOSE DATABASE" -#: preproc.y:2122 +#: preproc.y:2081 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "Параметр AT не дозволений в інÑтрукції CONNECT" -#: preproc.y:2162 +#: preproc.y:2121 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "Параметр AT не дозволений в інÑтрукції DISCONNECT" -#: preproc.y:2217 +#: preproc.y:2176 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "Параметр AT не дозволений в інÑтрукції SET CONNECTION" -#: preproc.y:2239 +#: preproc.y:2198 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "Параметр AT не дозволений в інÑтрукції TYPE" -#: preproc.y:2248 +#: preproc.y:2207 #, c-format msgid "AT option not allowed in VAR statement" msgstr "Параметр AT не дозволений в інÑтрукції VAR" -#: preproc.y:2255 +#: preproc.y:2214 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "Параметр AT не дозволений в інÑтрукції WHENEVER" -#: preproc.y:2332 preproc.y:2504 preproc.y:2509 preproc.y:2632 preproc.y:4283 -#: preproc.y:4357 preproc.y:4948 preproc.y:5481 preproc.y:5819 preproc.y:6119 -#: preproc.y:7687 preproc.y:9288 preproc.y:9293 preproc.y:12272 +#: preproc.y:2339 preproc.y:2626 preproc.y:4349 preproc.y:5021 preproc.y:5891 +#: preproc.y:6095 preproc.y:6196 preproc.y:12460 #, c-format msgid "unsupported feature will be passed to server" msgstr "непідтримувана Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð±ÑƒÐ´Ðµ передана до Ñервера" -#: preproc.y:2890 +#: preproc.y:2884 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALL не реалізовано" -#: preproc.y:3589 +#: preproc.y:3596 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDIN не реалізовано" -#: preproc.y:10335 preproc.y:18892 +#: preproc.y:10444 preproc.y:18503 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "\"database\" не може викориÑтовуватиÑÑŒ Ñк назва курÑора в режимі INFORMIX" -#: preproc.y:10342 preproc.y:18902 +#: preproc.y:10451 preproc.y:18513 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "викориÑÑ‚Ð°Ð½Ð½Ñ Ð·Ð¼Ñ–Ð½Ð½Ð¾Ñ— \"%s\" у різних інÑтрукціÑÑ… declare не підтримуєтьÑÑ" -#: preproc.y:10344 preproc.y:18904 +#: preproc.y:10453 preproc.y:18515 #, c-format msgid "cursor \"%s\" is already defined" msgstr "курÑор \"%s\" вже визначено" -#: preproc.y:10818 +#: preproc.y:10927 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "непідтримуваний ÑинтакÑÐ¸Ñ LIMIT #,# передано до Ñервера" -#: preproc.y:11151 preproc.y:11158 -#, c-format -msgid "subquery in FROM must have an alias" -msgstr "підзапит в FROM повинен мати пÑевдонім" - -#: preproc.y:18584 preproc.y:18591 +#: preproc.y:18195 preproc.y:18202 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS не може міÑтити INTO" -#: preproc.y:18627 +#: preproc.y:18238 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "очікувалоÑÑ \"@\", знайдено \"%s\"" -#: preproc.y:18639 +#: preproc.y:18250 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "підтримуютьÑÑ Ð»Ð¸ÑˆÐµ протоколи \"tcp\" та \"unix\" Ñ– тип бази даних \"postgresql\"" -#: preproc.y:18642 +#: preproc.y:18253 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "очікувалоÑÑ \"://\", знайдено \"%s\"" -#: preproc.y:18647 +#: preproc.y:18258 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unix-Ñокети працюють лише з \"localhost\", але не з \"%s\"" -#: preproc.y:18673 +#: preproc.y:18284 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "очікувалоÑÑŒ \"postgresql\", знайдено \"%s\"" -#: preproc.y:18676 +#: preproc.y:18287 #, c-format msgid "invalid connection type: %s" msgstr "неприпуÑтимий тип підключеннÑ: %s" -#: preproc.y:18685 +#: preproc.y:18296 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "очікувалоÑÑŒ \"@\" або \"://\", знайдено \"%s\"" -#: preproc.y:18760 preproc.y:18778 +#: preproc.y:18371 preproc.y:18389 #, c-format msgid "invalid data type" msgstr "неприпуÑтимий тип даних" -#: preproc.y:18789 preproc.y:18806 +#: preproc.y:18400 preproc.y:18417 #, c-format msgid "incomplete statement" msgstr "неповний оператор" -#: preproc.y:18792 preproc.y:18809 +#: preproc.y:18403 preproc.y:18420 #, c-format msgid "unrecognized token \"%s\"" msgstr "нерозпізнаний токен \"%s\"" -#: preproc.y:18854 +#: preproc.y:18465 #, c-format msgid "name \"%s\" is already declared" msgstr "ім'Ñ \"%s\" вже оголошена" -#: preproc.y:19120 +#: preproc.y:18754 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "точніÑть/маÑштаб можна вказати лише Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñ–Ð² даних numeric Ñ– decimal" -#: preproc.y:19132 +#: preproc.y:18853 #, c-format msgid "interval specification not allowed here" msgstr "ÑÐ¿ÐµÑ†Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ñ–Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ñƒ тут не допуÑкаєтьÑÑ" -#: preproc.y:19329 preproc.y:19381 +#: preproc.y:19009 preproc.y:19061 #, c-format msgid "too many levels in nested structure/union definition" msgstr "занадто багато рівнів у визначенні вкладеної Ñтруктури/об'єднаннÑ" -#: preproc.y:19504 +#: preproc.y:19184 #, c-format msgid "pointers to varchar are not implemented" msgstr "вказівників на varchar не реалізовано" -#: preproc.y:19955 +#: preproc.y:19635 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "команда EXEC SQL VAR не допуÑкає ініціалізатор" -#: preproc.y:20272 +#: preproc.y:19949 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "вхідні маÑиви індикаторів не допуÑкаютьÑÑ" -#: preproc.y:20459 +#: preproc.y:20136 #, c-format msgid "operator not allowed in variable definition" msgstr "у визначенні змінної оператор не допуÑкаєтьÑÑ" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:20500 +#: preproc.y:20177 #, c-format msgid "%s at or near \"%s\"" msgstr "%s в або поблизу \"%s\"" @@ -627,52 +621,52 @@ msgstr "індикатор Ñтруктури \"%s\" має занадто ба msgid "unrecognized descriptor item code %d" msgstr "нерозпізнаний код елементу деÑкриптора %d" -#: variable.c:89 variable.c:116 +#: variable.c:89 variable.c:115 #, c-format msgid "incorrectly formed variable \"%s\"" msgstr "неправильно Ñтворена змінна \"%s\"" -#: variable.c:139 +#: variable.c:138 #, c-format msgid "variable \"%s\" is not a pointer" msgstr "змінна \"%s\" не Ñ” вказівником" -#: variable.c:142 variable.c:167 +#: variable.c:141 variable.c:166 #, c-format msgid "variable \"%s\" is not a pointer to a structure or a union" msgstr "змінна \"%s\" не Ñ” вказівником на Ñтруктуру або об'єднаннÑ" -#: variable.c:154 +#: variable.c:153 #, c-format msgid "variable \"%s\" is neither a structure nor a union" msgstr "змінна \"%s\" не Ñ” Ñтруктурою або об'єднаннÑм" -#: variable.c:164 +#: variable.c:163 #, c-format msgid "variable \"%s\" is not an array" msgstr "змінна \"%s\" не Ñ” маÑивом" -#: variable.c:233 variable.c:255 +#: variable.c:232 variable.c:254 #, c-format msgid "variable \"%s\" is not declared" msgstr "змінна \"%s\" не проголошена" -#: variable.c:494 +#: variable.c:493 #, c-format msgid "indicator variable must have an integer type" msgstr "змінна-індикатор повинна бути цілим чиÑлом" -#: variable.c:506 +#: variable.c:510 #, c-format msgid "unrecognized data type name \"%s\"" msgstr "нерозпізнане ім'Ñ Ñ‚Ð¸Ð¿Ñƒ даних \"%s\"" -#: variable.c:517 variable.c:525 variable.c:542 variable.c:545 +#: variable.c:521 variable.c:529 variable.c:546 variable.c:549 #, c-format msgid "multidimensional arrays are not supported" msgstr "багатовимірні маÑиви не підтримуютьÑÑ" -#: variable.c:534 +#: variable.c:538 #, c-format msgid "multilevel pointers (more than 2 levels) are not supported; found %d level" msgid_plural "multilevel pointers (more than 2 levels) are not supported; found %d levels" @@ -681,12 +675,12 @@ msgstr[1] "багаторівневі вказівники (більше 2 рі msgstr[2] "багаторівневі вказівники (більше 2 рівнів) не підтримуютьÑÑ; знайдено %d рівнів" msgstr[3] "багаторівневі вказівники (більше 2 рівнів) не підтримуютьÑÑ; знайдено %d рівень" -#: variable.c:539 +#: variable.c:543 #, c-format msgid "pointer to pointer is not supported for this data type" msgstr "Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ типу даних вказівники на вказівники не підтримуютьÑÑ" -#: variable.c:559 +#: variable.c:563 #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "багатовимірні маÑиви Ñтруктур не підтримуютьÑÑ" diff --git a/src/interfaces/ecpg/preproc/po/zh_TW.po b/src/interfaces/ecpg/preproc/po/zh_TW.po index 9d94f8c1d1350..ed50343362e9e 100644 --- a/src/interfaces/ecpg/preproc/po/zh_TW.po +++ b/src/interfaces/ecpg/preproc/po/zh_TW.po @@ -1,512 +1,596 @@ # Traditional Chinese message translation file for ecpg -# Copyright (C) 2010 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the ecpg (PostgreSQL) package. +# msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.1\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2011-05-11 20:42+0000\n" -"PO-Revision-Date: 2013-09-03 23:28-0400\n" +"Project-Id-Version: ecpg (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-06 06:39+0000\n" +"PO-Revision-Date: 2023-09-11 08:36+0800\n" "Last-Translator: Zhenbang Wei \n" -"Language-Team: EnterpriseDB translation team \n" +"Language-Team: \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.3.2\n" #: descriptor.c:64 #, c-format msgid "variable \"%s\" must have a numeric type" -msgstr "變數 \"%s\" 必須具有數值型別" +msgstr "變數 \"%s\" 必須具有數值類型" -#: descriptor.c:124 descriptor.c:146 +#: descriptor.c:124 descriptor.c:155 #, c-format -msgid "descriptor \"%s\" does not exist" -msgstr "æè¿°å­ \"%s\" ä¸å­˜åœ¨" +msgid "descriptor %s bound to connection %s does not exist" +msgstr "ç¶å®šåˆ°é€£ç·š %2$s çš„æè¿°ç¬¦ %1$s ä¸å­˜åœ¨" -#: descriptor.c:161 descriptor.c:210 +#: descriptor.c:126 descriptor.c:157 +#, c-format +msgid "descriptor %s bound to the default connection does not exist" +msgstr "ç¶å®šåˆ°é è¨­é€£ç·šçš„æè¿°ç¬¦ %s ä¸å­˜åœ¨" + +#: descriptor.c:172 descriptor.c:224 #, c-format msgid "descriptor header item \"%d\" does not exist" -msgstr "æè¿°å­æ¨™é ­é …ç›® \"%d\" ä¸å­˜åœ¨" +msgstr "æè¿°ç¬¦æ¨™é ­é …ç›® \"%d\" ä¸å­˜åœ¨" -#: descriptor.c:182 +#: descriptor.c:194 +#, c-format msgid "nullable is always 1" -msgstr "Nullable 一律為 1" +msgstr "nullable æ°¸é ç‚º 1" -#: descriptor.c:185 +#: descriptor.c:197 +#, c-format msgid "key_member is always 0" -msgstr "key_member 一律為 0" +msgstr "key_member æ°¸é ç‚º 0" -#: descriptor.c:277 +#: descriptor.c:291 #, c-format msgid "descriptor item \"%s\" is not implemented" -msgstr "未實作æè¿°å­é …ç›® \"%s\"" +msgstr "未實作æè¿°ç¬¦é …ç›® \"%s\"" -#: descriptor.c:287 +#: descriptor.c:301 #, c-format msgid "descriptor item \"%s\" cannot be set" -msgstr "ä¸èƒ½è¨­å®šæè¿°å­é …ç›® \"%s\"" +msgstr "無法設定æè¿°ç¬¦é …ç›® \"%s\"" -#: ecpg.c:35 +#: ecpg.c:36 #, c-format msgid "" "%s is the PostgreSQL embedded SQL preprocessor for C programs.\n" "\n" msgstr "" -"%s 是 PostgreSQL 內嵌 SQL å‰ç½®è™•ç†å™¨ï¼Œé©ç”¨æ–¼ C 程å¼ã€‚\n" +"%s 是用於 C 程å¼çš„ PostgreSQL åµŒå…¥å¼ SQL é è™•ç†å™¨ã€‚\n" "\n" -#: ecpg.c:37 +#: ecpg.c:38 #, c-format msgid "" "Usage:\n" " %s [OPTION]... FILE...\n" "\n" msgstr "" -"使用方法:\n" -"%s [é¸é …]...檔案...\n" +"用法:\n" +" %s [OPTION]... FILE...\n" "\n" # postmaster/postmaster.c:1017 tcop/postgres.c:2115 -#: ecpg.c:40 +#: ecpg.c:41 #, c-format msgid "Options:\n" -msgstr "é¸é …:\n" +msgstr "é¸é …: \n" -#: ecpg.c:41 +#: ecpg.c:42 #, c-format msgid "" " -c automatically generate C code from embedded SQL code;\n" " this affects EXEC SQL TYPE\n" msgstr "" -" -c 自動從內嵌 SQL 程å¼ç¢¼ç”¢ç”Ÿ C 程å¼ç¢¼ï¼Œ\n" -" EXEC SQL TYPE 會å—到影響\n" +" -c è‡ªå‹•å¾žåµŒå…¥å¼ SQL ç¢¼ç”Ÿæˆ C 程å¼ç¢¼ï¼›\n" +" 這會影響 EXEC SQL TYPE\n" -#: ecpg.c:43 +#: ecpg.c:44 #, c-format msgid "" " -C MODE set compatibility mode; MODE can be one of\n" -" \"INFORMIX\", \"INFORMIX_SE\"\n" +" \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n" msgstr "" -" -C æ¨¡å¼ è¨­å®šç›¸å®¹æ€§æ¨¡å¼ï¼Œæ¨¡å¼å¯ä»¥æ˜¯ä¸‹åˆ—其中一項\n" -" \"INFORMIX\"ã€\"INFORMIX_SE\"\n" +" -C MODE 設定相容性模å¼ï¼›MODE å¯ä»¥æ˜¯:\n" +" \"INFORMIX\", \"INFORMIX_SE\", \"ORACLE\"\n" -#: ecpg.c:46 +#: ecpg.c:47 #, c-format msgid " -d generate parser debug output\n" -msgstr " -d 產生解譯器åµéŒ¯è¼¸å‡º\n" +msgstr " -d 產生解æžå™¨çš„除錯輸出\n" -#: ecpg.c:48 +#: ecpg.c:49 #, c-format msgid " -D SYMBOL define SYMBOL\n" -msgstr " -D 符號 定義符號\n" +msgstr " -D SYMBOL 定義 SYMBOL\n" -#: ecpg.c:49 +#: ecpg.c:50 #, c-format -msgid "" -" -h parse a header file, this option includes option \"-c\"\n" -msgstr " -h 解譯標頭檔,此é¸é …包å«é¸é … \"-c\"\n" +msgid " -h parse a header file, this option includes option \"-c\"\n" +msgstr " -h è§£æžæ¨™é ­æª”,此é¸é …包括é¸é … \"-c\"\n" -#: ecpg.c:50 +#: ecpg.c:51 #, c-format msgid " -i parse system include files as well\n" -msgstr " -i åŒæ™‚解譯系統引用檔案\n" +msgstr " -i 也解æžç³»çµ±å¼•用檔\n" -#: ecpg.c:51 +#: ecpg.c:52 #, c-format msgid " -I DIRECTORY search DIRECTORY for include files\n" -msgstr " -I 目錄 æœå°‹å¼•用檔案的目錄\n" +msgstr " -I DIRECTORY 在 DIRECTORY 目錄中尋找引用檔\n" -#: ecpg.c:52 +#: ecpg.c:53 #, c-format msgid " -o OUTFILE write result to OUTFILE\n" -msgstr " -o 輸出檔 å°‡çµæžœå¯«å…¥è¼¸å‡ºæª”\n" +msgstr " -o OUTFILE å°‡çµæžœå¯«å…¥ OUTFILE\n" -#: ecpg.c:53 +#: ecpg.c:54 #, c-format msgid "" " -r OPTION specify run-time behavior; OPTION can be:\n" " \"no_indicator\", \"prepare\", \"questionmarks\"\n" msgstr "" -" -r é¸é … 指定執行階段行為,é¸é …å¯ä»¥æ˜¯:\n" -" \"no_indicator\"ã€\"prepare\"ã€\"questionmarks\"\n" +" -r OPTION 指定執行階段行為,é¸é …å¯ä»¥æ˜¯:\n" +" \"no_indicator\", \"prepare\", \"questionmarks\"\n" -#: ecpg.c:55 +#: ecpg.c:56 #, c-format msgid " --regression run in regression testing mode\n" msgstr " --regression 以迴歸測試模å¼åŸ·è¡Œ\n" -#: ecpg.c:56 -#, c-format -msgid " -t turn on autocommit of transactions\n" -msgstr " -t 開啟交易自動æäº¤åŠŸèƒ½\n" - #: ecpg.c:57 #, c-format -msgid " --help show this help, then exit\n" -msgstr " --help é¡¯ç¤ºæ­¤èªªæ˜Žç„¶å¾ŒçµæŸ\n" +msgid " -t turn on autocommit of transactions\n" +msgstr " -t 開啟交易的自動æäº¤åŠŸèƒ½\n" #: ecpg.c:58 #, c-format -msgid " --version output version information, then exit\n" -msgstr " --version è¼¸å‡ºç‰ˆæœ¬è³‡è¨Šç„¶å¾ŒçµæŸ\n" +msgid " -V, --version output version information, then exit\n" +msgstr " -V, --version é¡¯ç¤ºç‰ˆæœ¬ï¼Œç„¶å¾ŒçµæŸ\n" #: ecpg.c:59 #, c-format +msgid " -?, --help show this help, then exit\n" +msgstr " -?, --help é¡¯ç¤ºèªªæ˜Žï¼Œç„¶å¾ŒçµæŸ\n" + +#: ecpg.c:60 +#, c-format msgid "" "\n" "If no output file is specified, the name is formed by adding .c to the\n" "input file name, after stripping off .pgc if present.\n" msgstr "" "\n" -"如果未指定輸出檔,檔å就是將輸入檔的檔å\n" -"去掉 .pgc (如果有的話) å†åŠ ä¸Š .c。\n" +"如果未指定輸出檔案,檔å就是先將輸入檔å\n" +"去掉 .pgc(如果有的話)å†åŠ ä¸Š .c。\n" # tcop/postgres.c:2140 -#: ecpg.c:61 +#: ecpg.c:62 #, c-format msgid "" "\n" -"Report bugs to .\n" +"Report bugs to <%s>.\n" msgstr "" "\n" -"回報錯誤給 。\n" +"回報錯誤至 <%s>。\n" -#: ecpg.c:182 ecpg.c:333 ecpg.c:343 +#: ecpg.c:63 #, c-format -msgid "%s: could not open file \"%s\": %s\n" -msgstr "%s: 無法開啟檔案\"%s\": %s\n" +msgid "%s home page: <%s>\n" +msgstr "%s ç¶²é : <%s>\n" + +#: ecpg.c:141 +#, c-format +msgid "%s: could not locate my own executable path\n" +msgstr "%s: 無法找到自己的執行檔路徑\n" # postmaster/postmaster.c:512 postmaster/postmaster.c:525 -#: ecpg.c:221 ecpg.c:234 ecpg.c:250 ecpg.c:275 +#: ecpg.c:184 ecpg.c:235 ecpg.c:249 ecpg.c:275 #, c-format msgid "Try \"%s --help\" for more information.\n" -msgstr "執行\"%s --help\"顯示更多資訊。\n" +msgstr "用 \"%s --help\" å–得更多資訊。\n" -#: ecpg.c:245 +#: ecpg.c:192 #, c-format msgid "%s: parser debug support (-d) not available\n" -msgstr "%s: 解譯器åµéŒ¯æ”¯æ´ (-d) 無法使用\n" +msgstr "%s: è§£æžå™¨çš„é™¤éŒ¯æ”¯æ´ (-d) ä¸å¯ç”¨\n" + +#: ecpg.c:219 ecpg.c:334 ecpg.c:345 +#, c-format +msgid "%s: could not open file \"%s\": %s\n" +msgstr "%s: 無法開啟檔案 \"%s\": %s\n" #: ecpg.c:263 #, c-format -msgid "%s, the PostgreSQL embedded C preprocessor, version %d.%d.%d\n" -msgstr "%s,PostgreSQL 內嵌 C å‰ç½®è™•ç†å™¨ï¼Œç‰ˆæœ¬ %d.%d.%d\n" +msgid "%s, the PostgreSQL embedded C preprocessor, version %s\n" +msgstr "%s,PostgreSQL åµŒå…¥å¼ C é è™•ç†å™¨ï¼Œç‰ˆæœ¬ %s\n" #: ecpg.c:265 #, c-format msgid "EXEC SQL INCLUDE ... search starts here:\n" -msgstr "EXEC SQL INCLUDE ... 在此處開始æœå°‹:\n" +msgstr "EXEC SQL INCLUDE ... æœå°‹é–‹å§‹æ–¼:\n" #: ecpg.c:268 #, c-format msgid "end of search list\n" -msgstr "æœå°‹æ¸…å–®çµå°¾\n" +msgstr "æœå°‹æ¸…å–®çµæŸ\n" #: ecpg.c:274 #, c-format msgid "%s: no input files specified\n" msgstr "%s: 未指定輸入檔\n" -#: ecpg.c:466 +#: ecpg.c:478 #, c-format msgid "cursor \"%s\" has been declared but not opened" -msgstr "指標 \"%s\" 已宣告但尚未開啟" +msgstr "指標 \"%s\" 已經被宣告但尚未開啟" -#: ecpg.c:479 preproc.y:109 +#: ecpg.c:491 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" -msgstr "無法移除輸出檔 \"%s\"\n" +msgstr "無法刪除輸出檔 \"%s\"\n" # scan.l:312 -#: pgc.l:402 +#: pgc.l:520 +#, c-format msgid "unterminated /* comment" msgstr "æœªçµæŸçš„ /* 註解" -#: pgc.l:415 -msgid "invalid bit string literal" -msgstr "ä½å…ƒå­—串實é‡ç„¡æ•ˆ" - # scan.l:339 -#: pgc.l:424 +#: pgc.l:537 +#, c-format msgid "unterminated bit string literal" -msgstr "æœªçµæŸçš„ä½å…ƒå­—串實é‡" +msgstr "æœªçµæŸçš„ä½å…ƒå­—串" # scan.l:358 -#: pgc.l:440 +#: pgc.l:545 +#, c-format msgid "unterminated hexadecimal string literal" -msgstr "æœªçµæŸçš„å六進ä½å­—串實é‡" +msgstr "æœªçµæŸçš„å六進ä½å­—串" + +#: pgc.l:620 +#, c-format +msgid "invalid bit string literal" +msgstr "無效的ä½å…ƒå­—串" + +# scan.l:358 +#: pgc.l:625 +#, c-format +msgid "invalid hexadecimal string literal" +msgstr "æœªçµæŸçš„å六進ä½å­—串" + +#: pgc.l:643 +#, c-format +msgid "unhandled previous state in xqs\n" +msgstr "在 xqs 中未處ç†çš„å…ˆå‰ç‹€æ…‹\n" # scan.l:407 -#: pgc.l:518 +#: pgc.l:669 pgc.l:778 +#, c-format msgid "unterminated quoted string" msgstr "æœªçµæŸçš„引號字串" -#: pgc.l:573 pgc.l:586 +# scan.l:441 +#: pgc.l:720 +#, c-format +msgid "unterminated dollar-quoted string" +msgstr "æœªçµæŸçš„錢號引號字串" + +#: pgc.l:738 pgc.l:758 +#, c-format msgid "zero-length delimited identifier" msgstr "長度為零的分隔識別字" -#: pgc.l:594 +#: pgc.l:769 +#, c-format msgid "unterminated quoted identifier" msgstr "æœªçµæŸçš„引號識別字" -#: pgc.l:940 +# gram.y:3496 utils/adt/regproc.c:639 +#: pgc.l:938 +#, c-format +msgid "trailing junk after parameter" +msgstr "åƒæ•¸å¾Œæœ‰å¤šé¤˜çš„垃圾字符" + +#: pgc.l:990 pgc.l:993 pgc.l:996 pgc.l:999 pgc.l:1002 pgc.l:1005 +#, c-format +msgid "trailing junk after numeric literal" +msgstr "數字文字後有多餘的垃圾字符" + +# scan.l:312 +#: pgc.l:1127 +#, c-format +msgid "nested /* ... */ comments" +msgstr "巢狀的 /* ... */ 註解" + +#: pgc.l:1220 +#, c-format msgid "missing identifier in EXEC SQL UNDEF command" -msgstr "EXEC SQL UNDEF æŒ‡ä»¤éºæ¼è­˜åˆ¥å­—" +msgstr "在 EXEC SQL UNDEF 指令中缺少識別字" -#: pgc.l:986 pgc.l:1000 +#: pgc.l:1238 pgc.l:1251 pgc.l:1267 pgc.l:1280 +#, c-format +msgid "too many nested EXEC SQL IFDEF conditions" +msgstr "太多巢狀的 EXEC SQL IFDEF æ¢ä»¶" + +#: pgc.l:1296 pgc.l:1307 pgc.l:1322 pgc.l:1344 +#, c-format msgid "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" -msgstr "éºæ¼ç›¸ç¬¦çš„ \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" +msgstr "缺少相å°çš„ \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\"" -#: pgc.l:989 pgc.l:1002 pgc.l:1178 +#: pgc.l:1298 pgc.l:1309 pgc.l:1490 +#, c-format msgid "missing \"EXEC SQL ENDIF;\"" -msgstr "éºæ¼ \"EXEC SQL ENDIF;\"" +msgstr "缺少 \"EXEC SQL ENDIF;\"" -#: pgc.l:1018 pgc.l:1037 +#: pgc.l:1324 pgc.l:1346 +#, c-format msgid "more than one EXEC SQL ELSE" msgstr "多個 EXEC SQL ELSE" -#: pgc.l:1059 pgc.l:1073 +#: pgc.l:1369 pgc.l:1383 +#, c-format msgid "unmatched EXEC SQL ENDIF" -msgstr "EXEC SQL ENDIF ä¸ç›¸ç¬¦" - -#: pgc.l:1093 -msgid "too many nested EXEC SQL IFDEF conditions" -msgstr "éŽå¤šå·¢ç‹€ EXEC SQL IFDEF æ¢ä»¶" +msgstr "ä¸ç›¸ç¬¦çš„ EXEC SQL ENDIF" -#: pgc.l:1126 +#: pgc.l:1438 +#, c-format msgid "missing identifier in EXEC SQL IFDEF command" -msgstr "EXEC SQL IFDEF æŒ‡ä»¤éºæ¼è­˜åˆ¥å­—" +msgstr "在 EXEC SQL IFDEF 指令中缺少識別字" -#: pgc.l:1135 +#: pgc.l:1447 +#, c-format msgid "missing identifier in EXEC SQL DEFINE command" -msgstr "EXEC SQL DEFINE æŒ‡ä»¤éºæ¼è­˜åˆ¥å­—" +msgstr "在 EXEC SQL DEFINE 指令中缺少識別字" -#: pgc.l:1168 +#: pgc.l:1480 +#, c-format msgid "syntax error in EXEC SQL INCLUDE command" -msgstr "EXEC SQL INCLUDE 指令的語法錯誤" +msgstr "在 EXEC SQL INCLUDE 指令中的語法錯誤" -#: pgc.l:1217 -msgid "" -"internal error: unreachable state; please report this to " -msgstr "內部錯誤: 無法連線狀態,請將錯誤回報給 " +#: pgc.l:1530 +#, c-format +msgid "internal error: unreachable state; please report this to <%s>" +msgstr "內部錯誤: éžé æœŸçš„狀態,請將錯誤回報至 <%s>" -#: pgc.l:1342 +#: pgc.l:1682 #, c-format msgid "Error: include path \"%s/%s\" is too long on line %d, skipping\n" -msgstr "錯誤: 引用檔路徑 \"%s/%s\" 太長 (使–¼è¡Œ %d),略éŽ\n" +msgstr "錯誤: 引用檔路徑 \"%s/%s\" 第 %d 行太長,略éŽ\n" -#: pgc.l:1364 +#: pgc.l:1705 #, c-format msgid "could not open include file \"%s\" on line %d" -msgstr "無法開啟引用檔 \"%s\" (使–¼è¡Œ %d)" +msgstr "無法開啟第 %2$d 行的引用檔 \"%1$s\"" # gram.y:8218 gram.y:8220 y.tab.c:19175 #: preproc.y:31 msgid "syntax error" msgstr "語法錯誤" -#: preproc.y:81 +#: preproc.y:84 #, c-format msgid "WARNING: " -msgstr "警告:" +msgstr "警告: " -#: preproc.y:85 +#: preproc.y:87 #, c-format msgid "ERROR: " -msgstr "錯誤:" +msgstr "錯誤: " # commands/portalcmds.c:182 commands/portalcmds.c:229 -#: preproc.y:391 +#: preproc.y:514 #, c-format msgid "cursor \"%s\" does not exist" -msgstr "指標 \"%s\"ä¸å­˜åœ¨" +msgstr "指標 \"%s\" ä¸å­˜åœ¨" -#: preproc.y:419 +#: preproc.y:543 +#, c-format msgid "initializer not allowed in type definition" -msgstr "型別定義中ä¸å…許使用åˆå§‹è¨­å®šå¼" +msgstr "在型別定義中ä¸å…許åˆå§‹å€¼è¨­å®š" # commands/user.c:1396 -#: preproc.y:421 +#: preproc.y:545 +#, c-format msgid "type name \"string\" is reserved in Informix mode" -msgstr "型別å稱 \"string\" 在 Informix 是ä¿ç•™å­—" +msgstr "型別å稱 \"string\" 在 Informix æ¨¡å¼æ˜¯ä¿ç•™å­—" -#: preproc.y:428 preproc.y:13035 +#: preproc.y:552 preproc.y:18392 #, c-format msgid "type \"%s\" is already defined" -msgstr "型別 \"%s\" 已定義" +msgstr "型別 \"%s\" 已被定義" -#: preproc.y:452 preproc.y:13675 preproc.y:13996 variable.c:610 +#: preproc.y:577 preproc.y:19027 preproc.y:19349 variable.c:625 +#, c-format msgid "multidimensional arrays for simple data types are not supported" -msgstr "䏿”¯æ´ç°¡å–®è³‡æ–™åž‹åˆ¥çš„多維度陣列" +msgstr "䏿”¯æ´ç°¡å–®è³‡æ–™é¡žåž‹çš„多維陣列" -#: preproc.y:1426 +#: preproc.y:599 +#, c-format +msgid "connection %s is overwritten with %s by DECLARE statement %s" +msgstr "連線 %1$s 被 DECLARE é™³è¿°å¼ %3$s 覆寫為 %2$s" + +#: preproc.y:1792 +#, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "CLOSE DATABASE 陳述å¼ä¸­ä¸å…許使用 AT é¸é …" -#: preproc.y:1496 preproc.y:1640 -msgid "AT option not allowed in DEALLOCATE statement" -msgstr "DEALLOCATE 陳述å¼ä¸­ä¸å…許使用 AT é¸é …" - -#: preproc.y:1626 +#: preproc.y:2042 +#, c-format msgid "AT option not allowed in CONNECT statement" msgstr "CONNECT 陳述å¼ä¸­ä¸å…許使用 AT é¸é …" -#: preproc.y:1662 +#: preproc.y:2082 +#, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "DISCONNECT 陳述å¼ä¸­ä¸å…許使用 AT é¸é …" -#: preproc.y:1717 +#: preproc.y:2137 +#, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "SET CONNECTION 陳述å¼ä¸­ä¸å…許使用 AT é¸é …" -#: preproc.y:1739 +#: preproc.y:2159 +#, c-format msgid "AT option not allowed in TYPE statement" msgstr "TYPE 陳述å¼ä¸­ä¸å…許使用 AT é¸é …" -#: preproc.y:1748 +#: preproc.y:2168 +#, c-format msgid "AT option not allowed in VAR statement" msgstr "VAR 陳述å¼ä¸­ä¸å…許使用 AT é¸é …" -#: preproc.y:1755 +#: preproc.y:2175 +#, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "WHENEVER 陳述å¼ä¸­ä¸å…許使用 AT é¸é …" -#: preproc.y:2101 preproc.y:3272 preproc.y:3344 preproc.y:4550 preproc.y:4559 -#: preproc.y:4840 preproc.y:7127 preproc.y:7132 preproc.y:7137 preproc.y:9471 -#: preproc.y:10014 +#: preproc.y:2300 preproc.y:2472 preproc.y:2477 preproc.y:2589 preproc.y:4248 +#: preproc.y:4322 preproc.y:4913 preproc.y:5446 preproc.y:5784 preproc.y:6084 +#: preproc.y:7648 preproc.y:9252 preproc.y:9257 preproc.y:12206 +#, c-format msgid "unsupported feature will be passed to server" -msgstr "䏿”¯æ´çš„功能將會傳éžåˆ°ä¼ºæœå™¨" +msgstr "䏿”¯æ´çš„功能將被傳到伺æœå™¨" -#: preproc.y:2327 +#: preproc.y:2847 +#, c-format msgid "SHOW ALL is not implemented" msgstr "未實作 SHOW ALL" -#: preproc.y:2750 preproc.y:2761 -msgid "COPY TO STDIN is not possible" -msgstr "COPY TO STDIN ä¸å¯è¡Œ" - -#: preproc.y:2752 -msgid "COPY FROM STDOUT is not possible" -msgstr "COPY FROM STDOUT ä¸å¯è¡Œ" - -#: preproc.y:2754 +#: preproc.y:3531 +#, c-format msgid "COPY FROM STDIN is not implemented" msgstr "未實作 COPY FROM STDIN" -#: preproc.y:4490 preproc.y:4501 -msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" -msgstr "é™åˆ¶å®£å‘Šçš„ INITIALLY DEFERRED 必須是 DEFERRABLE" +#: preproc.y:10303 preproc.y:17889 +#, c-format +msgid "\"database\" cannot be used as cursor name in INFORMIX mode" +msgstr "在 INFORMIX 模å¼ä¸‹ç„¡æ³•使用 \"database\" 作為指標å稱" -#: preproc.y:7933 preproc.y:12624 +#: preproc.y:10310 preproc.y:17899 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" -msgstr "在多個宣告陳述å¼ä¸­ä½¿ç”¨è®Šæ•¸ \"%s\" 未被支æ´" +msgstr "䏿”¯æ´åœ¨ä¸åŒçš„ DECLARE 陳述å¼ä¸­ä½¿ç”¨è®Šæ•¸ \"%s\"" -#: preproc.y:7935 preproc.y:12626 +#: preproc.y:10312 preproc.y:17901 #, c-format msgid "cursor \"%s\" is already defined" -msgstr "指標 \"%s\" 已定義" +msgstr "指標 \"%s\" 已被定義" -#: preproc.y:8353 +#: preproc.y:10786 +#, c-format msgid "no longer supported LIMIT #,# syntax passed to server" -msgstr "ä¸å†æ”¯æ´çš„ LIMIT #,# 語法已傳éžåˆ°ä¼ºæœå™¨" +msgstr "ä¸å†æ”¯æ´çš„ LIMIT #,# 語法已傳到伺æœå™¨" -# gram.y:5166 parser/parse_clause.c:423 -#: preproc.y:8588 -msgid "subquery in FROM must have an alias" -msgstr "FROMä¸­çš„å­æŸ¥è©¢è¦æœ‰åˆ¥å" - -#: preproc.y:12356 +#: preproc.y:17581 preproc.y:17588 +#, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE AS ä¸èƒ½æŒ‡å®š INTO" -#: preproc.y:12393 +#: preproc.y:17624 #, c-format msgid "expected \"@\", found \"%s\"" -msgstr "é æœŸ \"@\",找到 \"%s\"" +msgstr "é æœŸæ˜¯ \"@\"ï¼Œä½†ç™¼ç¾ \"%s\"" -#: preproc.y:12405 -msgid "" -"only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are " -"supported" -msgstr "åªæ”¯æ´é€šè¨Šå”定 \"tcp\" å’Œ \"unix\" 以åŠè³‡æ–™åº«é¡žåž‹ \"postgresql\"" +#: preproc.y:17636 +#, c-format +msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" +msgstr "僅支æ´å”è­° \"tcp\"ã€\"unix\" 和資料庫類型 \"postgresql\"" -#: preproc.y:12408 +#: preproc.y:17639 #, c-format msgid "expected \"://\", found \"%s\"" -msgstr "é æœŸ \"://\",找到 \"%s\"" +msgstr "é æœŸæ˜¯ \"://\"ï¼Œä½†ç™¼ç¾ \"%s\"" -#: preproc.y:12413 +#: preproc.y:17644 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" -msgstr "Unix-å¯ç”¨åŸŸé€šè¨Šç«¯åƒ…é©ç”¨ \"localhost\",ä¸é©ç”¨ \"%s\"" +msgstr "Unix-domain socket 僅é©ç”¨æ–¼ \"localhost\",ä¸èƒ½ç”¨åœ¨ \"%s\"" -#: preproc.y:12439 +#: preproc.y:17670 #, c-format msgid "expected \"postgresql\", found \"%s\"" -msgstr "é æœŸ \"postgresql\",找到 \"%s\"" +msgstr "é æœŸæ˜¯ \"postgresql\"ï¼Œä½†ç™¼ç¾ \"%s\"" -#: preproc.y:12442 +#: preproc.y:17673 #, c-format msgid "invalid connection type: %s" -msgstr "連線類型無效:%s" +msgstr "無效的連線類型: %s" -#: preproc.y:12451 +#: preproc.y:17682 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" -msgstr "é æœŸ \"@\" 或 \"://\",找到 \"%s\"" +msgstr "é æœŸæ˜¯ \"@\" 或 \"://\"ï¼Œä½†ç™¼ç¾ \"%s\"" -#: preproc.y:12526 preproc.y:12544 +#: preproc.y:17757 preproc.y:17775 +#, c-format msgid "invalid data type" -msgstr "資料型別無效" +msgstr "無效的資料類型" -#: preproc.y:12555 preproc.y:12570 +#: preproc.y:17786 preproc.y:17803 +#, c-format msgid "incomplete statement" -msgstr "陳述å¼ä¸å®Œæ•´" +msgstr "ä¸å®Œæ•´çš„陳述å¼" -#: preproc.y:12558 preproc.y:12573 +#: preproc.y:17789 preproc.y:17806 #, c-format msgid "unrecognized token \"%s\"" -msgstr "無法辨識的 token \"%s\"" +msgstr "無法識別的 token \"%s\"" + +#: preproc.y:17851 +#, c-format +msgid "name \"%s\" is already declared" +msgstr "å稱 \"%s\" 已被宣告" -#: preproc.y:12846 +#: preproc.y:18140 +#, c-format msgid "only data types numeric and decimal have precision/scale argument" -msgstr "åªæœ‰æ•¸å€¼å’Œå進ä½è³‡æ–™åž‹åˆ¥æœ‰ç²¾ç¢ºåº¦/å°æ•¸ä½æ•¸åƒæ•¸" +msgstr "åªæœ‰æ•¸å€¼å’Œå°æ•¸è³‡æ–™é¡žåž‹å…·æœ‰ç²¾ç¢ºåº¦/å°æ•¸ä½æ•¸åƒæ•¸" -#: preproc.y:12858 +#: preproc.y:18211 +#, c-format msgid "interval specification not allowed here" -msgstr "這裡ä¸å…è¨±ä½¿ç”¨é–“éš”è¦æ ¼" +msgstr "此處ä¸å…è¨±é–“éš”è¦æ ¼" -#: preproc.y:13010 preproc.y:13062 +#: preproc.y:18367 preproc.y:18419 +#, c-format msgid "too many levels in nested structure/union definition" msgstr "å·¢ç‹€çµæ§‹/è¯é›†å®šç¾©ä¸­çš„層級éŽå¤š" -#: preproc.y:13193 +#: preproc.y:18542 +#, c-format msgid "pointers to varchar are not implemented" -msgstr "Varchar 的指標未實作" +msgstr "æœªå¯¦ä½œæŒ‡å‘ varchar 的指標" -#: preproc.y:13380 preproc.y:13405 -msgid "using unsupported DESCRIBE statement" -msgstr "ä½¿ç”¨ä¸æ”¯æ´çš„ DESCRIBE 陳述å¼" - -#: preproc.y:13642 +#: preproc.y:18993 +#, c-format msgid "initializer not allowed in EXEC SQL VAR command" -msgstr "EXEC SQL VAR 指令中ä¸å…許使用åˆå§‹è¨­å®šå¼" +msgstr "在 EXEC SQL VAR 命令中ä¸å…許åˆå§‹å€¼è¨­å®š" -#: preproc.y:13954 +#: preproc.y:19307 +#, c-format msgid "arrays of indicators are not allowed on input" -msgstr "輸入中ä¸å…許使用指標陣列" +msgstr "輸入ä¸å…許使用指標陣列" + +#: preproc.y:19494 +#, c-format +msgid "operator not allowed in variable definition" +msgstr "變數定義中ä¸å…許使用此é‹ç®—å­" # translator: first %s is typically "syntax error" # scan.l:629 #. translator: %s is typically the translation of "syntax error" -#: preproc.y:14208 +#: preproc.y:19535 #, c-format msgid "%s at or near \"%s\"" -msgstr "在\"%s\"附近發生 %s" +msgstr "%s æ–¼ %s" # commands/sequence.c:798 executor/execGrouping.c:328 # executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43 @@ -529,117 +613,152 @@ msgstr "在\"%s\"附近發生 %s" # utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503 # utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75 #: type.c:18 type.c:30 +#, c-format msgid "out of memory" -msgstr "記憶體用盡" +msgstr "記憶體ä¸è¶³" -#: type.c:212 type.c:594 +#: type.c:214 type.c:685 #, c-format msgid "unrecognized variable type code %d" -msgstr "無法辨識的變數型別程å¼ç¢¼ %d " +msgstr "無法識別的變數類型碼 %d" -#: type.c:261 +#: type.c:263 #, c-format msgid "variable \"%s\" is hidden by a local variable of a different type" msgstr "變數 \"%s\" 被ä¸åŒåž‹åˆ¥çš„å€åŸŸè®Šæ•¸é®è”½" -#: type.c:263 +#: type.c:265 #, c-format msgid "variable \"%s\" is hidden by a local variable" msgstr "變數 \"%s\" 被å€åŸŸè®Šæ•¸é®è”½" -#: type.c:275 +#: type.c:277 #, c-format -msgid "" -"indicator variable \"%s\" is hidden by a local variable of a different type" +msgid "indicator variable \"%s\" is hidden by a local variable of a different type" msgstr "指標變數 \"%s\" 被ä¸åŒåž‹åˆ¥çš„å€åŸŸè®Šæ•¸é®è”½" -#: type.c:277 +#: type.c:279 #, c-format msgid "indicator variable \"%s\" is hidden by a local variable" msgstr "指標變數 \"%s\" 被å€åŸŸè®Šæ•¸é®è”½" -#: type.c:285 +#: type.c:287 +#, c-format msgid "indicator for array/pointer has to be array/pointer" msgstr "陣列/指標的指標必須是陣列/指標" -#: type.c:289 +#: type.c:291 +#, c-format msgid "nested arrays are not supported (except strings)" -msgstr "䏿”¯æ´å·¢ç‹€é™£åˆ— (字串除外)" +msgstr "䏿”¯æ´å·¢ç‹€é™£åˆ—(字串除外)" -#: type.c:322 +#: type.c:333 +#, c-format msgid "indicator for struct has to be a struct" -msgstr "建構的指標必須是建構" +msgstr "çµæ§‹é«”çš„æŒ‡ç¤ºå™¨å¿…é ˆæ˜¯ä¸€å€‹çµæ§‹é«”" -#: type.c:331 type.c:339 type.c:347 +#: type.c:353 type.c:374 type.c:394 +#, c-format msgid "indicator for simple data type has to be simple" -msgstr "簡單資料型別的指標必須簡單" +msgstr "簡單資料類型的指示器必須是簡單的" + +#: type.c:625 +#, c-format +msgid "indicator struct \"%s\" has too few members" +msgstr "æŒ‡ç¤ºå™¨çµæ§‹é«” \"%s\" æˆå“¡éŽå°‘" -#: type.c:653 +#: type.c:633 +#, c-format +msgid "indicator struct \"%s\" has too many members" +msgstr "æŒ‡ç¤ºå™¨çµæ§‹é«” \"%s\" æˆå“¡éŽå¤š" + +#: type.c:744 #, c-format msgid "unrecognized descriptor item code %d" -msgstr "無法辨識的æè¿°å­é …目程å¼ç¢¼ %d" +msgstr "無法辨識的æè¿°å­é …目代碼 %d" -#: variable.c:89 variable.c:112 +#: variable.c:89 variable.c:115 #, c-format msgid "incorrectly formed variable \"%s\"" -msgstr "變數 \"%s\" 的格å¼ä¸æ­£ç¢º" +msgstr "æ ¼å¼ä¸æ­£ç¢ºçš„變數 \"%s\"" -#: variable.c:135 +#: variable.c:138 #, c-format msgid "variable \"%s\" is not a pointer" msgstr "變數 \"%s\" 䏿˜¯æŒ‡æ¨™" -#: variable.c:138 variable.c:163 +#: variable.c:141 variable.c:166 #, c-format msgid "variable \"%s\" is not a pointer to a structure or a union" msgstr "變數 \"%s\" 䏿˜¯çµæ§‹æˆ–è¯é›†çš„æŒ‡æ¨™" -#: variable.c:150 +#: variable.c:153 #, c-format msgid "variable \"%s\" is neither a structure nor a union" msgstr "變數 \"%s\" 䏿˜¯çµæ§‹æˆ–è¯é›†" -#: variable.c:160 +#: variable.c:163 #, c-format msgid "variable \"%s\" is not an array" msgstr "變數 \"%s\" 䏿˜¯é™£åˆ—" -#: variable.c:229 variable.c:251 +#: variable.c:232 variable.c:254 #, c-format msgid "variable \"%s\" is not declared" msgstr "變數 \"%s\" 未宣告" -#: variable.c:484 +#: variable.c:493 +#, c-format msgid "indicator variable must have an integer type" msgstr "指標變數必須是整數型別" -#: variable.c:496 +#: variable.c:510 #, c-format msgid "unrecognized data type name \"%s\"" -msgstr " 無法辨識的資料型別å稱 \"%s\"" +msgstr "無法辨識的資料類型å稱 \"%s\"" -#: variable.c:507 variable.c:515 variable.c:532 variable.c:535 +#: variable.c:521 variable.c:529 variable.c:546 variable.c:549 +#, c-format msgid "multidimensional arrays are not supported" -msgstr "䏿”¯æ´å¤šç¶­åº¦é™£åˆ—" +msgstr "䏿”¯æ´å¤šç¶­é™£åˆ—" -#: variable.c:524 +#: variable.c:538 #, c-format -msgid "" -"multilevel pointers (more than 2 levels) are not supported; found %d level" -msgid_plural "" -"multilevel pointers (more than 2 levels) are not supported; found %d levels" +msgid "multilevel pointers (more than 2 levels) are not supported; found %d level" +msgid_plural "multilevel pointers (more than 2 levels) are not supported; found %d levels" msgstr[0] "䏿”¯æ´å¤šå±¤æŒ‡æ¨™(2層以上)ï¼Œç™¼ç¾ %d 層" -#: variable.c:529 +#: variable.c:543 +#, c-format msgid "pointer to pointer is not supported for this data type" msgstr "æ­¤è³‡æ–™åž‹åˆ¥ä¸æ”¯æ´æŒ‡æ¨™çš„æŒ‡æ¨™" -#: variable.c:549 +#: variable.c:563 +#, c-format msgid "multidimensional arrays for structures are not supported" -msgstr "䏿”¯æ´å¤šç¶­åº¦çš„çµæ§‹é™£åˆ—" +msgstr "䏿”¯æ´çµæ§‹çš„多維陣列" -#~ msgid "OLD used in query that is not in a rule" -#~ msgstr "查詢中使用的 OLD ä¸åœ¨è¦å‰‡ä¸­" +#~ msgid "AT option not allowed in DEALLOCATE statement" +#~ msgstr "DEALLOCATE 陳述å¼ä¸­ä¸å…許使用 AT é¸é …" + +#~ msgid "COPY FROM STDOUT is not possible" +#~ msgstr "COPY FROM STDOUT ä¸å¯è¡Œ" + +#~ msgid "COPY TO STDIN is not possible" +#~ msgstr "COPY TO STDIN ä¸å¯è¡Œ" #~ msgid "NEW used in query that is not in a rule" #~ msgstr "查詢中使用的 NEW ä¸åœ¨è¦å‰‡ä¸­" + +#~ msgid "OLD used in query that is not in a rule" +#~ msgstr "查詢中使用的 OLD ä¸åœ¨è¦å‰‡ä¸­" + +#~ msgid "constraint declared INITIALLY DEFERRED must be DEFERRABLE" +#~ msgstr "é™åˆ¶å®£å‘Šçš„ INITIALLY DEFERRED 必須是 DEFERRABLE" + +# gram.y:5166 parser/parse_clause.c:423 +#~ msgid "subquery in FROM must have an alias" +#~ msgstr "FROMä¸­çš„å­æŸ¥è©¢è¦æœ‰åˆ¥å" + +#~ msgid "using unsupported DESCRIBE statement" +#~ msgstr "ä½¿ç”¨ä¸æ”¯æ´çš„ DESCRIBE 陳述å¼" diff --git a/src/interfaces/ecpg/preproc/type.c b/src/interfaces/ecpg/preproc/type.c index 91adb89de9aa2..a842bb6a1fed7 100644 --- a/src/interfaces/ecpg/preproc/type.c +++ b/src/interfaces/ecpg/preproc/type.c @@ -695,7 +695,7 @@ get_dtype(enum ECPGdtype type) switch (type) { case ECPGd_count: - return "ECPGd_countr"; + return "ECPGd_count"; break; case ECPGd_data: return "ECPGd_data"; diff --git a/src/interfaces/ecpg/preproc/type.h b/src/interfaces/ecpg/preproc/type.h index 5935cd7473063..ce2124361fd0a 100644 --- a/src/interfaces/ecpg/preproc/type.h +++ b/src/interfaces/ecpg/preproc/type.h @@ -163,13 +163,25 @@ struct typedefs struct typedefs *next; }; +/* + * Info about a defined symbol (macro), coming from a -D command line switch + * or a define command in the program. These are stored in a simple list. + * Because ecpg supports compiling multiple files per run, we have to remember + * the command-line definitions and be able to revert to those; this motivates + * storing cmdvalue separately from value. + * name and value are separately-malloc'd strings; cmdvalue typically isn't. + * used is NULL unless we are currently expanding the macro, in which case + * it points to the buffer before the one scanning the macro; we reset it + * to NULL upon returning to that buffer. This is used to prevent recursive + * expansion of the macro. + */ struct _defines { - char *olddef; - char *newdef; - int pertinent; - void *used; - struct _defines *next; + char *name; /* symbol's name */ + char *value; /* current value, or NULL if undefined */ + const char *cmdvalue; /* value set on command line, or NULL */ + void *used; /* buffer pointer, or NULL */ + struct _defines *next; /* list link */ }; /* This is a linked list of the variable names and types. */ diff --git a/src/interfaces/ecpg/preproc/variable.c b/src/interfaces/ecpg/preproc/variable.c index b23ed5edf460f..5a63ecaab836c 100644 --- a/src/interfaces/ecpg/preproc/variable.c +++ b/src/interfaces/ecpg/preproc/variable.c @@ -260,33 +260,28 @@ void remove_typedefs(int brace_level) { struct typedefs *p, - *prev; + *prev, + *next; - for (p = prev = types; p;) + for (p = types, prev = NULL; p; p = next) { + next = p->next; if (p->brace_level >= brace_level) { /* remove it */ - if (p == types) - prev = types = p->next; + if (prev) + prev->next = next; else - prev->next = p->next; + types = next; if (p->type->type_enum == ECPGt_struct || p->type->type_enum == ECPGt_union) free(p->struct_member_list); free(p->type); free(p->name); free(p); - if (prev == types) - p = types; - else - p = prev ? prev->next : NULL; } else - { prev = p; - p = prev->next; - } } } @@ -294,63 +289,67 @@ void remove_variables(int brace_level) { struct variable *p, - *prev; + *prev, + *next; - for (p = prev = allvariables; p;) + for (p = allvariables, prev = NULL; p; p = next) { + next = p->next; if (p->brace_level >= brace_level) { - /* is it still referenced by a cursor? */ + /* remove it, but first remove any references from cursors */ struct cursor *ptr; for (ptr = cur; ptr != NULL; ptr = ptr->next) { struct arguments *varptr, - *prevvar; + *prevvar, + *nextvar; - for (varptr = prevvar = ptr->argsinsert; varptr != NULL; varptr = varptr->next) + for (varptr = ptr->argsinsert, prevvar = NULL; + varptr != NULL; varptr = nextvar) { + nextvar = varptr->next; if (p == varptr->variable) { /* remove from list */ - if (varptr == ptr->argsinsert) - ptr->argsinsert = varptr->next; + if (prevvar) + prevvar->next = nextvar; else - prevvar->next = varptr->next; + ptr->argsinsert = nextvar; } + else + prevvar = varptr; } - for (varptr = prevvar = ptr->argsresult; varptr != NULL; varptr = varptr->next) + for (varptr = ptr->argsresult, prevvar = NULL; + varptr != NULL; varptr = nextvar) { + nextvar = varptr->next; if (p == varptr->variable) { /* remove from list */ - if (varptr == ptr->argsresult) - ptr->argsresult = varptr->next; + if (prevvar) + prevvar->next = nextvar; else - prevvar->next = varptr->next; + ptr->argsresult = nextvar; } + else + prevvar = varptr; } } /* remove it */ - if (p == allvariables) - prev = allvariables = p->next; + if (prev) + prev->next = next; else - prev->next = p->next; + allvariables = next; ECPGfree_type(p->type); free(p->name); free(p); - if (prev == allvariables) - p = allvariables; - else - p = prev ? prev->next : NULL; } else - { prev = p; - p = prev->next; - } } } diff --git a/src/interfaces/ecpg/test/Makefile b/src/interfaces/ecpg/test/Makefile index cf841a3a5b2ff..be2418ba2642c 100644 --- a/src/interfaces/ecpg/test/Makefile +++ b/src/interfaces/ecpg/test/Makefile @@ -10,6 +10,7 @@ include $(top_builddir)/src/Makefile.global override CPPFLAGS := \ '-I$(top_builddir)/src/port' \ '-I$(top_srcdir)/src/test/regress' \ + '-I$(libpq_srcdir)' \ '-DHOST_TUPLE="$(host_tuple)"' \ '-DSHELLPROG="$(SHELL)"' \ $(CPPFLAGS) @@ -20,7 +21,7 @@ else abs_builddir := $(shell sh -c "pwd -W") endif -all install installdirs uninstall distprep: +all install installdirs uninstall: $(MAKE) -C connect $@ $(MAKE) -C sql $@ $(MAKE) -C pgtypeslib $@ @@ -29,7 +30,7 @@ all install installdirs uninstall distprep: $(MAKE) -C compat_oracle $@ $(MAKE) -C thread $@ -clean distclean maintainer-clean: +clean distclean: $(MAKE) -C connect $@ $(MAKE) -C sql $@ $(MAKE) -C pgtypeslib $@ @@ -45,7 +46,7 @@ clean distclean maintainer-clean: all: pg_regress$(X) pg_regress$(X): pg_regress_ecpg.o $(WIN32RES) $(top_builddir)/src/test/regress/pg_regress.o - $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@ + $(CC) $(CFLAGS) $^ $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@ $(top_builddir)/src/test/regress/pg_regress.o: $(MAKE) -C $(dir $@) $(notdir $@) diff --git a/src/interfaces/ecpg/test/compat_informix/.gitignore b/src/interfaces/ecpg/test/compat_informix/.gitignore index f97706ba4bee0..6967ae77cd2dd 100644 --- a/src/interfaces/ecpg/test/compat_informix/.gitignore +++ b/src/interfaces/ecpg/test/compat_informix/.gitignore @@ -4,6 +4,8 @@ /dec_test.c /describe /describe.c +/intoasc +/intoasc.c /rfmtdate /rfmtdate.c /rfmtlong diff --git a/src/interfaces/ecpg/test/compat_informix/Makefile b/src/interfaces/ecpg/test/compat_informix/Makefile index d50fdc29fd1c0..638b4e0af7820 100644 --- a/src/interfaces/ecpg/test/compat_informix/Makefile +++ b/src/interfaces/ecpg/test/compat_informix/Makefile @@ -16,7 +16,8 @@ TESTS = test_informix test_informix.c \ rnull rnull.c \ sqlda sqlda.c \ describe describe.c \ - charfuncs charfuncs.c + charfuncs charfuncs.c \ + intoasc intoasc.c all: $(TESTS) diff --git a/src/interfaces/ecpg/test/compat_informix/dec_test.pgc b/src/interfaces/ecpg/test/compat_informix/dec_test.pgc index f6a9f425d6f1d..830ab5890b24d 100644 --- a/src/interfaces/ecpg/test/compat_informix/dec_test.pgc +++ b/src/interfaces/ecpg/test/compat_informix/dec_test.pgc @@ -142,6 +142,16 @@ main(void) c = deccmp(decarr[i], decarr[j]); printf("dec[c,%d,%d]: %d\n", i, j, c); + /* + * decarr[count-1] is risnull(), which makes these functions + * return 0 without changing the output parameter. Make that + * clear by initializing each output parameter. + */ + deccvint(7654321, &a); + deccvint(7654321, &s); + deccvint(7654321, &m); + deccvint(7654321, &d); + r = decadd(decarr[i], decarr[j], &a); if (r) { diff --git a/src/interfaces/ecpg/test/compat_informix/intoasc.pgc b/src/interfaces/ecpg/test/compat_informix/intoasc.pgc new file mode 100644 index 0000000000000..d13c83bb7a7a2 --- /dev/null +++ b/src/interfaces/ecpg/test/compat_informix/intoasc.pgc @@ -0,0 +1,21 @@ +#include +#include + +#include "pgtypes_interval.h" + +EXEC SQL BEGIN DECLARE SECTION; + char dirty_str[100] = "aaaaaaaaa_bbbbbbbb_ccccccccc_ddddddddd_"; + interval *interval_ptr; +EXEC SQL END DECLARE SECTION; + +int main() +{ + interval_ptr = (interval *) malloc(sizeof(interval)); + interval_ptr->time = 100000000; + interval_ptr->month = 240; + + printf("dirty_str contents before intoasc: %s\n", dirty_str); + intoasc(interval_ptr, dirty_str); + printf("dirty_str contents after intoasc: %s\n", dirty_str); + return 0; +} diff --git a/src/interfaces/ecpg/test/compat_informix/meson.build b/src/interfaces/ecpg/test/compat_informix/meson.build index e2f8802330d52..c6ed52f51c557 100644 --- a/src/interfaces/ecpg/test/compat_informix/meson.build +++ b/src/interfaces/ecpg/test/compat_informix/meson.build @@ -1,9 +1,10 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pgc_files = [ 'charfuncs', 'dec_test', 'describe', + 'intoasc', 'rfmtdate', 'rfmtlong', 'rnull', diff --git a/src/interfaces/ecpg/test/compat_oracle/meson.build b/src/interfaces/ecpg/test/compat_oracle/meson.build index f07d9859d100b..e1202e5abaa02 100644 --- a/src/interfaces/ecpg/test/compat_oracle/meson.build +++ b/src/interfaces/ecpg/test/compat_oracle/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pgc_files = [ 'char_array', diff --git a/src/interfaces/ecpg/test/connect/meson.build b/src/interfaces/ecpg/test/connect/meson.build index 453fd9d1be95d..3e1469d51cccf 100644 --- a/src/interfaces/ecpg/test/connect/meson.build +++ b/src/interfaces/ecpg/test/connect/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pgc_files = [ 'test1', diff --git a/src/interfaces/ecpg/test/ecpg_schedule b/src/interfaces/ecpg/test/ecpg_schedule index 39814a39c1767..254a0bacc755e 100644 --- a/src/interfaces/ecpg/test/ecpg_schedule +++ b/src/interfaces/ecpg/test/ecpg_schedule @@ -7,6 +7,7 @@ test: compat_informix/sqlda test: compat_informix/describe test: compat_informix/test_informix test: compat_informix/test_informix2 +test: compat_informix/intoasc test: compat_oracle/char_array test: connect/test2 test: connect/test3 @@ -51,6 +52,7 @@ test: sql/oldexec test: sql/quote test: sql/show test: sql/sqljson +test: sql/sqljson_jsontable test: sql/insupd test: sql/parser test: sql/prepareas diff --git a/src/interfaces/ecpg/test/expected/compat_informix-dec_test.c b/src/interfaces/ecpg/test/expected/compat_informix-dec_test.c index 8586650e879be..3e68b2e026797 100644 --- a/src/interfaces/ecpg/test/expected/compat_informix-dec_test.c +++ b/src/interfaces/ecpg/test/expected/compat_informix-dec_test.c @@ -195,6 +195,16 @@ main(void) c = deccmp(decarr[i], decarr[j]); printf("dec[c,%d,%d]: %d\n", i, j, c); + /* + * decarr[count-1] is risnull(), which makes these functions + * return 0 without changing the output parameter. Make that + * clear by initializing each output parameter. + */ + deccvint(7654321, &a); + deccvint(7654321, &s); + deccvint(7654321, &m); + deccvint(7654321, &d); + r = decadd(decarr[i], decarr[j], &a); if (r) { diff --git a/src/interfaces/ecpg/test/expected/compat_informix-dec_test.stdout b/src/interfaces/ecpg/test/expected/compat_informix-dec_test.stdout index 1f8675b3f3c3b..7e50493868b34 100644 --- a/src/interfaces/ecpg/test/expected/compat_informix-dec_test.stdout +++ b/src/interfaces/ecpg/test/expected/compat_informix-dec_test.stdout @@ -3,8 +3,8 @@ (no errno set) - dec[0,3]: r: -1, * (no errno set) - dec[0,4]: r: -1, * dec[0,5]: r: 0, 0.00 -(errno == PGTYPES_NUM_OVERFLOW) - dec[0,6]: 0 (r: -1) -(errno == PGTYPES_NUM_OVERFLOW) - dec[0,8]: 0 (r: -1) +(errno == PGTYPES_NUM_OVERFLOW) - dec[0,6]: 0 (r: -1200) +(errno == PGTYPES_NUM_OVERFLOW) - dec[0,8]: 0 (r: -1200) (errno == PGTYPES_NUM_OVERFLOW) - dec[0,10]: 0 (r: -1) dec[1,1]: r: 0, -2 @@ -45,8 +45,8 @@ dec[4,2]: r: 0, 592490000000000000000000 dec[4,3]: r: 0, 592490000000000000000000.0 dec[4,4]: r: 0, 592490000000000000000000.00 dec[4,5]: r: 0, 0.00 -(errno == PGTYPES_NUM_OVERFLOW) - dec[4,6]: 0 (r: -1) -(errno == PGTYPES_NUM_OVERFLOW) - dec[4,8]: 0 (r: -1) +(errno == PGTYPES_NUM_OVERFLOW) - dec[4,6]: 0 (r: -1200) +(errno == PGTYPES_NUM_OVERFLOW) - dec[4,8]: 0 (r: -1200) dec[4,10]: 5.9249e+23 (r: 0) dec[5,1]: r: 0, -328400 @@ -141,8 +141,8 @@ dec[13,2]: r: 0, 1234567890123456789012345679 dec[13,3]: r: 0, 1234567890123456789012345678.9 dec[13,4]: r: 0, 1234567890123456789012345678.91 dec[13,5]: r: 0, 0.00 -(errno == PGTYPES_NUM_OVERFLOW) - dec[13,6]: 0 (r: -1) -(errno == PGTYPES_NUM_OVERFLOW) - dec[13,8]: 0 (r: -1) +(errno == PGTYPES_NUM_OVERFLOW) - dec[13,6]: 0 (r: -1200) +(errno == PGTYPES_NUM_OVERFLOW) - dec[13,8]: 0 (r: -1200) dec[13,10]: 1.23457e+27 (r: 0) (errno == PGTYPES_NUM_OVERFLOW) - dec[14,0]: r: -1200 @@ -222,10 +222,10 @@ dec[s,0,13]: dec[m,0,13]: * dec[d,0,13]: dec[c,0,14]: 2147483647 -dec[a,0,14]: -dec[s,0,14]: -dec[m,0,14]: * -dec[d,0,14]: +dec[a,0,14]: 7654321.0 +dec[s,0,14]: 7654321.0 +dec[m,0,14]: 7654321.0 +dec[d,0,14]: 7654321.0 dec[c,1,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,1,0]: @@ -297,10 +297,10 @@ dec[s,1,13]: -1234567890123456789012345680.91 dec[m,1,13]: -2469135780246913578024691357.82 dec[d,1,13]: -0.0000000000000000000000000016200000145800001 dec[c,1,14]: 2147483647 -dec[a,1,14]: 1234567890123456789012345676.91 -dec[s,1,14]: -1234567890123456789012345680.91 -dec[m,1,14]: -2469135780246913578024691357.82 -dec[d,1,14]: -0.0000000000000000000000000016200000145800001 +dec[a,1,14]: 7654321.0 +dec[s,1,14]: 7654321.0 +dec[m,1,14]: 7654321.0 +dec[d,1,14]: 7654321.0 dec[c,2,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,2,0]: @@ -372,10 +372,10 @@ dec[s,2,13]: dec[m,2,13]: dec[d,2,13]: 0.00000000000000000000000000064314000578826005 dec[c,2,14]: 2147483647 -dec[a,2,14]: -dec[s,2,14]: -dec[m,2,14]: -dec[d,2,14]: 0.00000000000000000000000000064314000578826005 +dec[a,2,14]: 7654321.0 +dec[s,2,14]: 7654321.0 +dec[m,2,14]: 7654321.0 +dec[d,2,14]: 7654321.0 dec[c,3,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,3,0]: @@ -447,10 +447,10 @@ dec[s,3,13]: -1234567890123456789012345675.47 dec[m,3,13]: dec[d,3,13]: 0.0000000000000000000000000027864000250776002 dec[c,3,14]: 2147483647 -dec[a,3,14]: 1234567890123456789012345682.35 -dec[s,3,14]: -1234567890123456789012345675.47 -dec[m,3,14]: -dec[d,3,14]: 0.0000000000000000000000000027864000250776002 +dec[a,3,14]: 7654321.0 +dec[s,3,14]: 7654321.0 +dec[m,3,14]: 7654321.0 +dec[d,3,14]: 7654321.0 dec[c,4,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,4,0]: @@ -522,10 +522,10 @@ dec[s,4,13]: -1233975400123456789012345678.91 dec[m,4,13]: dec[d,4,13]: 0.00047991690431925214 dec[c,4,14]: 2147483647 -dec[a,4,14]: 1235160380123456789012345678.91 -dec[s,4,14]: -1233975400123456789012345678.91 -dec[m,4,14]: -dec[d,4,14]: 0.00047991690431925214 +dec[a,4,14]: 7654321.0 +dec[s,4,14]: 7654321.0 +dec[m,4,14]: 7654321.0 +dec[d,4,14]: 7654321.0 dec[c,5,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,5,0]: @@ -597,10 +597,10 @@ dec[s,5,13]: -1234567890123456789012674078.91 dec[m,5,13]: dec[d,5,13]: -0.00000000000000000000026600400239403602 dec[c,5,14]: 2147483647 -dec[a,5,14]: 1234567890123456789012017278.91 -dec[s,5,14]: -1234567890123456789012674078.91 -dec[m,5,14]: -dec[d,5,14]: -0.00000000000000000000026600400239403602 +dec[a,5,14]: 7654321.0 +dec[s,5,14]: 7654321.0 +dec[m,5,14]: 7654321.0 +dec[d,5,14]: 7654321.0 dec[c,6,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,6,0]: @@ -672,10 +672,10 @@ dec[s,6,13]: dec[m,6,13]: * dec[d,6,13]: * dec[c,6,14]: 2147483647 -dec[a,6,14]: -dec[s,6,14]: -dec[m,6,14]: * -dec[d,6,14]: * +dec[a,6,14]: 7654321.0 +dec[s,6,14]: 7654321.0 +dec[m,6,14]: 7654321.0 +dec[d,6,14]: 7654321.0 dec[c,7,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,7,0]: @@ -747,10 +747,10 @@ dec[s,7,13]: dec[m,7,13]: 1234567890123456789012345.67891 dec[d,7,13]: 0.00000000000000000000000000000081000000729000007 dec[c,7,14]: 2147483647 -dec[a,7,14]: -dec[s,7,14]: -dec[m,7,14]: 1234567890123456789012345.67891 -dec[d,7,14]: 0.00000000000000000000000000000081000000729000007 +dec[a,7,14]: 7654321.0 +dec[s,7,14]: 7654321.0 +dec[m,7,14]: 7654321.0 +dec[d,7,14]: 7654321.0 dec[c,8,0]: -1 dec[a,8,0]: * dec[s,8,0]: * @@ -822,10 +822,10 @@ dec[s,8,13]: -1234567890123456789012345678.91 dec[m,8,13]: 0.000 dec[d,8,13]: 0 dec[c,8,14]: 2147483647 -dec[a,8,14]: 1234567890123456789012345678.91 -dec[s,8,14]: -1234567890123456789012345678.91 -dec[m,8,14]: 0.000 -dec[d,8,14]: 0 +dec[a,8,14]: 7654321.0 +dec[s,8,14]: 7654321.0 +dec[m,8,14]: 7654321.0 +dec[d,8,14]: 7654321.0 dec[c,9,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,9,0]: @@ -897,10 +897,10 @@ dec[s,9,13]: dec[m,9,13]: dec[d,9,13]: -0.000000000000000000000000000000047991690431925214 dec[c,9,14]: 2147483647 -dec[a,9,14]: -dec[s,9,14]: -dec[m,9,14]: -dec[d,9,14]: -0.000000000000000000000000000000047991690431925214 +dec[a,9,14]: 7654321.0 +dec[s,9,14]: 7654321.0 +dec[m,9,14]: 7654321.0 +dec[d,9,14]: 7654321.0 dec[c,10,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,10,0]: @@ -972,10 +972,10 @@ dec[s,10,13]: dec[m,10,13]: dec[d,10,13]: 0.0000000000000000000000000000026600400239403602 dec[c,10,14]: 2147483647 -dec[a,10,14]: -dec[s,10,14]: -dec[m,10,14]: -dec[d,10,14]: 0.0000000000000000000000000000026600400239403602 +dec[a,10,14]: 7654321.0 +dec[s,10,14]: 7654321.0 +dec[m,10,14]: 7654321.0 +dec[d,10,14]: 7654321.0 dec[c,11,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,11,0]: @@ -1047,10 +1047,10 @@ dec[s,11,13]: dec[m,11,13]: dec[d,11,13]: 0.00000000000000000000000000040500081364500732 dec[c,11,14]: 2147483647 -dec[a,11,14]: -dec[s,11,14]: -dec[m,11,14]: -dec[d,11,14]: 0.00000000000000000000000000040500081364500732 +dec[a,11,14]: 7654321.0 +dec[s,11,14]: 7654321.0 +dec[m,11,14]: 7654321.0 +dec[d,11,14]: 7654321.0 dec[c,12,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,12,0]: @@ -1122,10 +1122,10 @@ dec[s,12,13]: dec[m,12,13]: dec[d,12,13]: -0.00000000000000000000000000040500008464500076 dec[c,12,14]: 2147483647 -dec[a,12,14]: -dec[s,12,14]: -dec[m,12,14]: -dec[d,12,14]: -0.00000000000000000000000000040500008464500076 +dec[a,12,14]: 7654321.0 +dec[s,12,14]: 7654321.0 +dec[m,12,14]: 7654321.0 +dec[d,12,14]: 7654321.0 dec[c,13,0]: -1 (errno == PGTYPES_NUM_OVERFLOW) - r: -1200 dec[s,13,0]: @@ -1197,85 +1197,85 @@ dec[s,13,13]: 0.00 dec[m,13,13]: dec[d,13,13]: 1.00000000000000000 dec[c,13,14]: 2147483647 -dec[a,13,14]: 2469135780246913578024691357.82 -dec[s,13,14]: 0.00 -dec[m,13,14]: -dec[d,13,14]: 1.00000000000000000 +dec[a,13,14]: 7654321.0 +dec[s,13,14]: 7654321.0 +dec[m,13,14]: 7654321.0 +dec[d,13,14]: 7654321.0 dec[c,14,0]: 2147483647 -dec[a,14,0]: 2469135780246913578024691357.82 -dec[s,14,0]: 0.00 -dec[m,14,0]: -dec[d,14,0]: 1.00000000000000000 +dec[a,14,0]: 7654321.0 +dec[s,14,0]: 7654321.0 +dec[m,14,0]: 7654321.0 +dec[d,14,0]: 7654321.0 dec[c,14,1]: 2147483647 -dec[a,14,1]: 2469135780246913578024691357.82 -dec[s,14,1]: 0.00 -dec[m,14,1]: -dec[d,14,1]: 1.00000000000000000 +dec[a,14,1]: 7654321.0 +dec[s,14,1]: 7654321.0 +dec[m,14,1]: 7654321.0 +dec[d,14,1]: 7654321.0 dec[c,14,2]: 2147483647 -dec[a,14,2]: 2469135780246913578024691357.82 -dec[s,14,2]: 0.00 -dec[m,14,2]: -dec[d,14,2]: 1.00000000000000000 +dec[a,14,2]: 7654321.0 +dec[s,14,2]: 7654321.0 +dec[m,14,2]: 7654321.0 +dec[d,14,2]: 7654321.0 dec[c,14,3]: 2147483647 -dec[a,14,3]: 2469135780246913578024691357.82 -dec[s,14,3]: 0.00 -dec[m,14,3]: -dec[d,14,3]: 1.00000000000000000 +dec[a,14,3]: 7654321.0 +dec[s,14,3]: 7654321.0 +dec[m,14,3]: 7654321.0 +dec[d,14,3]: 7654321.0 dec[c,14,4]: 2147483647 -dec[a,14,4]: 2469135780246913578024691357.82 -dec[s,14,4]: 0.00 -dec[m,14,4]: -dec[d,14,4]: 1.00000000000000000 +dec[a,14,4]: 7654321.0 +dec[s,14,4]: 7654321.0 +dec[m,14,4]: 7654321.0 +dec[d,14,4]: 7654321.0 dec[c,14,5]: 2147483647 -dec[a,14,5]: 2469135780246913578024691357.82 -dec[s,14,5]: 0.00 -dec[m,14,5]: -dec[d,14,5]: 1.00000000000000000 +dec[a,14,5]: 7654321.0 +dec[s,14,5]: 7654321.0 +dec[m,14,5]: 7654321.0 +dec[d,14,5]: 7654321.0 dec[c,14,6]: 2147483647 -dec[a,14,6]: 2469135780246913578024691357.82 -dec[s,14,6]: 0.00 -dec[m,14,6]: -dec[d,14,6]: 1.00000000000000000 +dec[a,14,6]: 7654321.0 +dec[s,14,6]: 7654321.0 +dec[m,14,6]: 7654321.0 +dec[d,14,6]: 7654321.0 dec[c,14,7]: 2147483647 -dec[a,14,7]: 2469135780246913578024691357.82 -dec[s,14,7]: 0.00 -dec[m,14,7]: -dec[d,14,7]: 1.00000000000000000 +dec[a,14,7]: 7654321.0 +dec[s,14,7]: 7654321.0 +dec[m,14,7]: 7654321.0 +dec[d,14,7]: 7654321.0 dec[c,14,8]: 2147483647 -dec[a,14,8]: 2469135780246913578024691357.82 -dec[s,14,8]: 0.00 -dec[m,14,8]: -dec[d,14,8]: 1.00000000000000000 +dec[a,14,8]: 7654321.0 +dec[s,14,8]: 7654321.0 +dec[m,14,8]: 7654321.0 +dec[d,14,8]: 7654321.0 dec[c,14,9]: 2147483647 -dec[a,14,9]: 2469135780246913578024691357.82 -dec[s,14,9]: 0.00 -dec[m,14,9]: -dec[d,14,9]: 1.00000000000000000 +dec[a,14,9]: 7654321.0 +dec[s,14,9]: 7654321.0 +dec[m,14,9]: 7654321.0 +dec[d,14,9]: 7654321.0 dec[c,14,10]: 2147483647 -dec[a,14,10]: 2469135780246913578024691357.82 -dec[s,14,10]: 0.00 -dec[m,14,10]: -dec[d,14,10]: 1.00000000000000000 +dec[a,14,10]: 7654321.0 +dec[s,14,10]: 7654321.0 +dec[m,14,10]: 7654321.0 +dec[d,14,10]: 7654321.0 dec[c,14,11]: 2147483647 -dec[a,14,11]: 2469135780246913578024691357.82 -dec[s,14,11]: 0.00 -dec[m,14,11]: -dec[d,14,11]: 1.00000000000000000 +dec[a,14,11]: 7654321.0 +dec[s,14,11]: 7654321.0 +dec[m,14,11]: 7654321.0 +dec[d,14,11]: 7654321.0 dec[c,14,12]: 2147483647 -dec[a,14,12]: 2469135780246913578024691357.82 -dec[s,14,12]: 0.00 -dec[m,14,12]: -dec[d,14,12]: 1.00000000000000000 +dec[a,14,12]: 7654321.0 +dec[s,14,12]: 7654321.0 +dec[m,14,12]: 7654321.0 +dec[d,14,12]: 7654321.0 dec[c,14,13]: 2147483647 -dec[a,14,13]: 2469135780246913578024691357.82 -dec[s,14,13]: 0.00 -dec[m,14,13]: -dec[d,14,13]: 1.00000000000000000 +dec[a,14,13]: 7654321.0 +dec[s,14,13]: 7654321.0 +dec[m,14,13]: 7654321.0 +dec[d,14,13]: 7654321.0 dec[c,14,14]: 2147483647 -dec[a,14,14]: 2469135780246913578024691357.82 -dec[s,14,14]: 0.00 -dec[m,14,14]: -dec[d,14,14]: 1.00000000000000000 +dec[a,14,14]: 7654321.0 +dec[s,14,14]: 7654321.0 +dec[m,14,14]: 7654321.0 +dec[d,14,14]: 7654321.0 0: * 1: -2 2: 0.794 diff --git a/src/interfaces/ecpg/test/expected/compat_informix-intoasc.c b/src/interfaces/ecpg/test/expected/compat_informix-intoasc.c new file mode 100644 index 0000000000000..30988809e92e9 --- /dev/null +++ b/src/interfaces/ecpg/test/expected/compat_informix-intoasc.c @@ -0,0 +1,40 @@ +/* Processed by ecpg (regression mode) */ +/* These include files are added by the preprocessor */ +#include +#include +#include +/* Needed for informix compatibility */ +#include +/* End of automatic include section */ +#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y)) + +#line 1 "intoasc.pgc" +#include +#include + +#include "pgtypes_interval.h" + +/* exec sql begin declare section */ + + + +#line 7 "intoasc.pgc" + char dirty_str [ 100 ] = "aaaaaaaaa_bbbbbbbb_ccccccccc_ddddddddd_" ; + +#line 8 "intoasc.pgc" + interval * interval_ptr ; +/* exec sql end declare section */ +#line 9 "intoasc.pgc" + + +int main() +{ + interval_ptr = (interval *) malloc(sizeof(interval)); + interval_ptr->time = 100000000; + interval_ptr->month = 240; + + printf("dirty_str contents before intoasc: %s\n", dirty_str); + intoasc(interval_ptr, dirty_str); + printf("dirty_str contents after intoasc: %s\n", dirty_str); + return 0; +} diff --git a/src/interfaces/ecpg/test/expected/compat_informix-intoasc.stderr b/src/interfaces/ecpg/test/expected/compat_informix-intoasc.stderr new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/src/interfaces/ecpg/test/expected/compat_informix-intoasc.stdout b/src/interfaces/ecpg/test/expected/compat_informix-intoasc.stdout new file mode 100644 index 0000000000000..0769465b84037 --- /dev/null +++ b/src/interfaces/ecpg/test/expected/compat_informix-intoasc.stdout @@ -0,0 +1,2 @@ +dirty_str contents before intoasc: aaaaaaaaa_bbbbbbbb_ccccccccc_ddddddddd_ +dirty_str contents after intoasc: @ 20 years 1 min 40 secs diff --git a/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.c b/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.c index ee867b6dd862e..1f1d341a4acca 100644 --- a/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.c +++ b/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -22,9 +23,11 @@ -#line 8 "dt_test.pgc" +#line 9 "dt_test.pgc" +static void check_errno(void); + int main(void) { @@ -34,19 +37,19 @@ main(void) -#line 14 "dt_test.pgc" +#line 17 "dt_test.pgc" date date1 ; -#line 15 "dt_test.pgc" +#line 18 "dt_test.pgc" timestamp ts1 ; -#line 16 "dt_test.pgc" +#line 19 "dt_test.pgc" interval * iv1 , iv2 ; -#line 17 "dt_test.pgc" +#line 20 "dt_test.pgc" char * text ; /* exec sql end declare section */ -#line 18 "dt_test.pgc" +#line 21 "dt_test.pgc" date date2; int mdy[3] = { 4, 19, 1998 }; @@ -57,31 +60,31 @@ main(void) ECPGdebug(1, stderr); /* exec sql whenever sqlerror do sqlprint ( ) ; */ -#line 27 "dt_test.pgc" +#line 30 "dt_test.pgc" { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); -#line 28 "dt_test.pgc" +#line 31 "dt_test.pgc" if (sqlca.sqlcode < 0) sqlprint ( );} -#line 28 "dt_test.pgc" +#line 31 "dt_test.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table date_test ( d date , ts timestamp )", ECPGt_EOIT, ECPGt_EORT); -#line 29 "dt_test.pgc" +#line 32 "dt_test.pgc" if (sqlca.sqlcode < 0) sqlprint ( );} -#line 29 "dt_test.pgc" +#line 32 "dt_test.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "set datestyle to iso", ECPGt_EOIT, ECPGt_EORT); -#line 30 "dt_test.pgc" +#line 33 "dt_test.pgc" if (sqlca.sqlcode < 0) sqlprint ( );} -#line 30 "dt_test.pgc" +#line 33 "dt_test.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "set intervalstyle to postgres_verbose", ECPGt_EOIT, ECPGt_EORT); -#line 31 "dt_test.pgc" +#line 34 "dt_test.pgc" if (sqlca.sqlcode < 0) sqlprint ( );} -#line 31 "dt_test.pgc" +#line 34 "dt_test.pgc" date1 = PGTYPESdate_from_asc(d1, NULL); @@ -92,10 +95,10 @@ if (sqlca.sqlcode < 0) sqlprint ( );} ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_timestamp,&(ts1),(long)1,(long)1,sizeof(timestamp), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT); -#line 36 "dt_test.pgc" +#line 39 "dt_test.pgc" if (sqlca.sqlcode < 0) sqlprint ( );} -#line 36 "dt_test.pgc" +#line 39 "dt_test.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select * from date_test where d = $1 ", @@ -105,10 +108,10 @@ if (sqlca.sqlcode < 0) sqlprint ( );} ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_timestamp,&(ts1),(long)1,(long)1,sizeof(timestamp), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); -#line 38 "dt_test.pgc" +#line 41 "dt_test.pgc" if (sqlca.sqlcode < 0) sqlprint ( );} -#line 38 "dt_test.pgc" +#line 41 "dt_test.pgc" text = PGTYPESdate_to_asc(date1); @@ -263,10 +266,19 @@ if (sqlca.sqlcode < 0) sqlprint ( );} PGTYPESchar_free(text); ts1 = PGTYPEStimestamp_from_asc("1994-02-11 26:10:35", NULL); + /* failure, check error code */ + check_errno(); text = PGTYPEStimestamp_to_asc(ts1); printf("timestamp_to_asc3: %s\n", text); PGTYPESchar_free(text); + ts1 = PGTYPEStimestamp_from_asc("AM95000062", NULL); + /* failure, check error code */ + check_errno(); + text = PGTYPEStimestamp_to_asc(ts1); + printf("timestamp_to_asc4: %s\n", text); + PGTYPESchar_free(text); + /* abc-03:10:35-def-02/11/94-gh */ /* 12345678901234567890123456789 */ @@ -453,17 +465,35 @@ if (sqlca.sqlcode < 0) sqlprint ( );} free(out); { ECPGtrans(__LINE__, NULL, "rollback"); -#line 381 "dt_test.pgc" +#line 393 "dt_test.pgc" if (sqlca.sqlcode < 0) sqlprint ( );} -#line 381 "dt_test.pgc" +#line 393 "dt_test.pgc" { ECPGdisconnect(__LINE__, "CURRENT"); -#line 382 "dt_test.pgc" +#line 394 "dt_test.pgc" if (sqlca.sqlcode < 0) sqlprint ( );} -#line 382 "dt_test.pgc" +#line 394 "dt_test.pgc" return 0; } + +static void +check_errno(void) +{ + switch(errno) + { + case 0: + printf("(no errno set) - "); + break; + case PGTYPES_TS_BAD_TIMESTAMP: + printf("(errno == PGTYPES_TS_BAD_TIMESTAMP) - "); + break; + default: + printf("(unknown errno (%d))\n", errno); + printf("(libc: (%s)) ", strerror(errno)); + break; + } +} diff --git a/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.stderr b/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.stderr index 6e9ed3d3dbad3..2a109ee7fa145 100644 --- a/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.stderr +++ b/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.stderr @@ -2,47 +2,47 @@ [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ECPGconnect: opening database ecpg1_regression on port [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_execute on line 29: query: create table date_test ( d date , ts timestamp ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: ecpg_execute on line 32: query: create table date_test ( d date , ts timestamp ); with 0 parameter(s) on connection ecpg1_regression [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_execute on line 29: using PQexec +[NO_PID]: ecpg_execute on line 32: using PQexec [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_process_output on line 29: OK: CREATE TABLE +[NO_PID]: ecpg_process_output on line 32: OK: CREATE TABLE [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_execute on line 30: query: set datestyle to iso; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: ecpg_execute on line 33: query: set datestyle to iso; with 0 parameter(s) on connection ecpg1_regression [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_execute on line 30: using PQexec +[NO_PID]: ecpg_execute on line 33: using PQexec [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_process_output on line 30: OK: SET +[NO_PID]: ecpg_process_output on line 33: OK: SET [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_execute on line 31: query: set intervalstyle to postgres_verbose; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: ecpg_execute on line 34: query: set intervalstyle to postgres_verbose; with 0 parameter(s) on connection ecpg1_regression [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_execute on line 31: using PQexec +[NO_PID]: ecpg_execute on line 34: using PQexec [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_process_output on line 31: OK: SET +[NO_PID]: ecpg_process_output on line 34: OK: SET [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_execute on line 36: query: insert into date_test ( d , ts ) values ( $1 , $2 ); with 2 parameter(s) on connection ecpg1_regression +[NO_PID]: ecpg_execute on line 39: query: insert into date_test ( d , ts ) values ( $1 , $2 ); with 2 parameter(s) on connection ecpg1_regression [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_execute on line 36: using PQexecParams +[NO_PID]: ecpg_execute on line 39: using PQexecParams [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_free_params on line 36: parameter 1 = 1966-01-17 +[NO_PID]: ecpg_free_params on line 39: parameter 1 = 1966-01-17 [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_free_params on line 36: parameter 2 = 2000-07-12 17:34:29 +[NO_PID]: ecpg_free_params on line 39: parameter 2 = 2000-07-12 17:34:29 [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_process_output on line 36: OK: INSERT 0 1 +[NO_PID]: ecpg_process_output on line 39: OK: INSERT 0 1 [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_execute on line 38: query: select * from date_test where d = $1 ; with 1 parameter(s) on connection ecpg1_regression +[NO_PID]: ecpg_execute on line 41: query: select * from date_test where d = $1 ; with 1 parameter(s) on connection ecpg1_regression [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_execute on line 38: using PQexecParams +[NO_PID]: ecpg_execute on line 41: using PQexecParams [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_free_params on line 38: parameter 1 = 1966-01-17 +[NO_PID]: ecpg_free_params on line 41: parameter 1 = 1966-01-17 [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_process_output on line 38: correctly got 1 tuples with 2 fields +[NO_PID]: ecpg_process_output on line 41: correctly got 1 tuples with 2 fields [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_get_data on line 38: RESULT: 1966-01-17 offset: -1; array: no +[NO_PID]: ecpg_get_data on line 41: RESULT: 1966-01-17 offset: -1; array: no [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_get_data on line 38: RESULT: 2000-07-12 17:34:29 offset: -1; array: no +[NO_PID]: ecpg_get_data on line 41: RESULT: 2000-07-12 17:34:29 offset: -1; array: no [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGtrans on line 381: action "rollback"; connection "ecpg1_regression" +[NO_PID]: ECPGtrans on line 393: action "rollback"; connection "ecpg1_regression" [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_finish: connection ecpg1_regression closed [NO_PID]: sqlca: code: 0, state: 00000 diff --git a/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.stdout b/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.stdout index 4b582fd7a2802..6b8bcc9fc2737 100644 --- a/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.stdout +++ b/src/interfaces/ecpg/test/expected/pgtypeslib-dt_test.stdout @@ -20,7 +20,8 @@ date_defmt_asc10: 1995-12-25 date_defmt_asc12: 0095-12-25 timestamp_to_asc1: 1996-02-29 00:00:00 timestamp_to_asc2: 1994-02-11 03:10:35 -timestamp_to_asc3: 2000-01-01 00:00:00 +(errno == PGTYPES_TS_BAD_TIMESTAMP) - timestamp_to_asc3: 2000-01-01 00:00:00 +(errno == PGTYPES_TS_BAD_TIMESTAMP) - timestamp_to_asc4: 2000-01-01 00:00:00 timestamp_fmt_asc: 0: abc-00:00:00-def-01/01/00-ghi% timestamp_defmt_asc(This is a 4/12/80 3-39l12test, This is a %m/%d/%y %H-%Ml%Stest) = 1980-04-12 03:39:12, error: 0 timestamp_defmt_asc(Tue Jul 22 17:28:44 +0200 2003, %a %b %d %H:%M:%S %z %Y) = 2003-07-22 15:28:44, error: 0 diff --git a/src/interfaces/ecpg/test/expected/sql-define.c b/src/interfaces/ecpg/test/expected/sql-define.c index 29583ecd74112..e97caec5b05f6 100644 --- a/src/interfaces/ecpg/test/expected/sql-define.c +++ b/src/interfaces/ecpg/test/expected/sql-define.c @@ -6,6 +6,21 @@ /* End of automatic include section */ #define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y)) +#line 1 "define_prelim.pgc" +/* + * Test that the effects of these commands don't carry over to the next + * file named on the ecpg command line. + */ + + +/* Processed by ecpg (regression mode) */ +/* These include files are added by the preprocessor */ +#include +#include +#include +/* End of automatic include section */ +#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y)) + #line 1 "define.pgc" #line 1 "sqlca.h" @@ -195,11 +210,57 @@ if (sqlca.sqlcode < 0) sqlprint ( );} + /* test handling of a macro defined on the command line */ + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select 123", ECPGt_EOIT, + ECPGt_int,&(i),(long)1,(long)1,sizeof(int), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 57 "define.pgc" + +if (sqlca.sqlcode < 0) sqlprint ( );} +#line 57 "define.pgc" + + printf("original CMDLINESYM: %d\n", i); + + + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select 42", ECPGt_EOIT, + ECPGt_int,&(i),(long)1,(long)1,sizeof(int), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 62 "define.pgc" + +if (sqlca.sqlcode < 0) sqlprint ( );} +#line 62 "define.pgc" + + printf("redefined CMDLINESYM: %d\n", i); + + + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select 43", ECPGt_EOIT, + ECPGt_int,&(i),(long)1,(long)1,sizeof(int), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 67 "define.pgc" + +if (sqlca.sqlcode < 0) sqlprint ( );} +#line 67 "define.pgc" + + printf("redefined CMDLINESYM: %d\n", i); + + + + + + + + /* this macro should not have carried over from define_prelim.pgc */ + + + + { ECPGdisconnect(__LINE__, "CURRENT"); -#line 56 "define.pgc" +#line 81 "define.pgc" if (sqlca.sqlcode < 0) sqlprint ( );} -#line 56 "define.pgc" +#line 81 "define.pgc" return 0; } diff --git a/src/interfaces/ecpg/test/expected/sql-define.stderr b/src/interfaces/ecpg/test/expected/sql-define.stderr index 20601b63cf93f..c4da9927e8c44 100644 --- a/src/interfaces/ecpg/test/expected/sql-define.stderr +++ b/src/interfaces/ecpg/test/expected/sql-define.stderr @@ -48,5 +48,29 @@ [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_process_output on line 53: OK: SET [NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 57: query: select 123; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 57: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 57: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 57: RESULT: 123 offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 62: query: select 42; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 62: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 62: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 62: RESULT: 42 offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 67: query: select 43; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 67: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 67: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 67: RESULT: 43 offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_finish: connection ecpg1_regression closed [NO_PID]: sqlca: code: 0, state: 00000 diff --git a/src/interfaces/ecpg/test/expected/sql-define.stdout b/src/interfaces/ecpg/test/expected/sql-define.stdout index 864cd850bf35d..eaddc7f8c32cf 100644 --- a/src/interfaces/ecpg/test/expected/sql-define.stdout +++ b/src/interfaces/ecpg/test/expected/sql-define.stdout @@ -1 +1,4 @@ i: 1, s: 29-abcdef +original CMDLINESYM: 123 +redefined CMDLINESYM: 42 +redefined CMDLINESYM: 43 diff --git a/src/interfaces/ecpg/test/expected/sql-sqljson.c b/src/interfaces/ecpg/test/expected/sql-sqljson.c index a2c49b54f99e3..39221f9ea5dbe 100644 --- a/src/interfaces/ecpg/test/expected/sql-sqljson.c +++ b/src/interfaces/ecpg/test/expected/sql-sqljson.c @@ -196,6 +196,202 @@ if (sqlca.sqlcode < 0) sqlprint();} printf("Found json=%s\n", json); + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json ( null )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 42 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 42 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json ( '{ \"a\" : 1 } ' format json )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 45 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 45 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json ( '{ \"a\" : 1 } ' format json encoding UTF8 )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 48 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 48 "sqljson.pgc" + + // error + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json ( ' 1 ' :: jsonb )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 51 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 51 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json ( ' 1 ' :: json with unique keys ) into json", ECPGt_EOIT, ECPGt_EORT); +#line 54 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 54 "sqljson.pgc" + + // error + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json ( '{\"a\": 1, \"a\": 2}' )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 57 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 57 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json ( '{\"a\": 1, \"a\": 2}' with unique keys )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 60 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 60 "sqljson.pgc" + + // error + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json_scalar ( null )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 63 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 63 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json_scalar ( null :: int )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 66 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 66 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json_scalar ( 123.45 )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 69 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 69 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json_scalar ( true )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 72 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 72 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json_scalar ( ' 123.45' )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 75 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 75 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json_scalar ( '2020-06-07 01:02:03' :: timestamp )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 78 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 78 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json_scalar ( '{}' :: jsonb )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 81 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 81 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json_serialize ( null )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 84 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 84 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json_serialize ( json ( '{ \"a\" : 1 } ' ) )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 87 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 87 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json_serialize ( '{ \"a\" : 1 } ' )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 90 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 90 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json_serialize ( '1' format json )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 93 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 93 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json_serialize ( '{ \"a\" : 1 } ' returning varchar )", ECPGt_EOIT, + ECPGt_char,(json),(long)1024,(long)1,(1024)*sizeof(char), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 96 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 96 "sqljson.pgc" + + printf("Found json=%s\n", json); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select json_serialize ( '{ \"a\" : 1 } ' returning jsonb )", ECPGt_EOIT, ECPGt_EORT); +#line 99 "sqljson.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 99 "sqljson.pgc" + + // error + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "with val ( js ) as ( values ( '{ \"a\": 1, \"b\": [{ \"a\": 1, \"b\": 0, \"a\": 2 }] }' ) ) select js is json \"IS JSON\" , js is not json \"IS NOT JSON\" , js is json value \"IS VALUE\" , js is json object \"IS OBJECT\" , js is json array \"IS ARRAY\" , js is json scalar \"IS SCALAR\" , js is json without unique keys \"WITHOUT UNIQUE\" , js is json with unique keys \"WITH UNIQUE\" from val", ECPGt_EOIT, ECPGt_bool,&(is_json[0]),(long)1,(long)1,sizeof(bool), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, @@ -213,19 +409,19 @@ if (sqlca.sqlcode < 0) sqlprint();} ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_bool,&(is_json[7]),(long)1,(long)1,sizeof(bool), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); -#line 54 "sqljson.pgc" +#line 114 "sqljson.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 54 "sqljson.pgc" +#line 114 "sqljson.pgc" for (int i = 0; i < sizeof(is_json); i++) printf("Found is_json[%d]: %s\n", i, is_json[i] ? "true" : "false"); { ECPGdisconnect(__LINE__, "CURRENT"); -#line 58 "sqljson.pgc" +#line 118 "sqljson.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 58 "sqljson.pgc" +#line 118 "sqljson.pgc" return 0; diff --git a/src/interfaces/ecpg/test/expected/sql-sqljson.stderr b/src/interfaces/ecpg/test/expected/sql-sqljson.stderr index 1252cb3b66ac2..e55a95dd711a4 100644 --- a/src/interfaces/ecpg/test/expected/sql-sqljson.stderr +++ b/src/interfaces/ecpg/test/expected/sql-sqljson.stderr @@ -42,11 +42,11 @@ [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 33: using PQexec [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_check_PQresult on line 33: bad response - ERROR: duplicate JSON key "1" +[NO_PID]: ecpg_check_PQresult on line 33: bad response - ERROR: duplicate JSON object key value: "1" [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: raising sqlstate 22030 (sqlcode -400): duplicate JSON key "1" on line 33 +[NO_PID]: raising sqlstate 22030 (sqlcode -400): duplicate JSON object key value: "1" on line 33 [NO_PID]: sqlca: code: -400, state: 22030 -SQL error: duplicate JSON key "1" on line 33 +SQL error: duplicate JSON object key value: "1" on line 33 [NO_PID]: ecpg_execute on line 36: query: select json_object ( 1 : 1 , '2' : null , 1 : '2' absent on null without unique keys ); with 0 parameter(s) on connection ecpg1_regression [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 36: using PQexec @@ -65,27 +65,208 @@ SQL error: duplicate JSON key "1" on line 33 [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_get_data on line 39: RESULT: {"1": 1} offset: -1; array: no [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_execute on line 42: query: with val ( js ) as ( values ( '{ "a": 1, "b": [{ "a": 1, "b": 0, "a": 2 }] }' ) ) select js is json "IS JSON" , js is not json "IS NOT JSON" , js is json value "IS VALUE" , js is json object "IS OBJECT" , js is json array "IS ARRAY" , js is json scalar "IS SCALAR" , js is json without unique keys "WITHOUT UNIQUE" , js is json with unique keys "WITH UNIQUE" from val; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: ecpg_execute on line 42: query: select json ( null ); with 0 parameter(s) on connection ecpg1_regression [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 42: using PQexec [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_process_output on line 42: correctly got 1 tuples with 8 fields +[NO_PID]: ecpg_process_output on line 42: correctly got 1 tuples with 1 fields [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_get_data on line 42: RESULT: t offset: -1; array: no +[NO_PID]: ecpg_get_data on line 42: RESULT: offset: -1; array: no [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_get_data on line 42: RESULT: f offset: -1; array: no +[NO_PID]: raising sqlcode -213 on line 42: null value without indicator on line 42 +[NO_PID]: sqlca: code: -213, state: 22002 +SQL error: null value without indicator on line 42 +[NO_PID]: ecpg_execute on line 45: query: select json ( '{ "a" : 1 } ' format json ); with 0 parameter(s) on connection ecpg1_regression [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_get_data on line 42: RESULT: t offset: -1; array: no +[NO_PID]: ecpg_execute on line 45: using PQexec [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_get_data on line 42: RESULT: t offset: -1; array: no +[NO_PID]: ecpg_process_output on line 45: correctly got 1 tuples with 1 fields [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_get_data on line 42: RESULT: f offset: -1; array: no +[NO_PID]: ecpg_get_data on line 45: RESULT: { "a" : 1 } offset: -1; array: no [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_get_data on line 42: RESULT: f offset: -1; array: no +[NO_PID]: ecpg_execute on line 48: query: select json ( '{ "a" : 1 } ' format json encoding UTF8 ); with 0 parameter(s) on connection ecpg1_regression [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_get_data on line 42: RESULT: t offset: -1; array: no +[NO_PID]: ecpg_execute on line 48: using PQexec [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ecpg_get_data on line 42: RESULT: f offset: -1; array: no +[NO_PID]: ecpg_check_PQresult on line 48: bad response - ERROR: JSON ENCODING clause is only allowed for bytea input type +LINE 1: select json ( '{ "a" : 1 } ' format json encoding UTF8 ) + ^ +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: raising sqlstate 42804 (sqlcode -400): JSON ENCODING clause is only allowed for bytea input type on line 48 +[NO_PID]: sqlca: code: -400, state: 42804 +SQL error: JSON ENCODING clause is only allowed for bytea input type on line 48 +[NO_PID]: ecpg_execute on line 51: query: select json ( ' 1 ' :: jsonb ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 51: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 51: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 51: RESULT: 1 offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 54: query: select json ( ' 1 ' :: json with unique keys ) into json; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 54: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_check_PQresult on line 54: bad response - ERROR: cannot use non-string types with WITH UNIQUE KEYS clause +LINE 1: select json ( ' 1 ' :: json with unique keys ) into json + ^ +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: raising sqlstate 42804 (sqlcode -400): cannot use non-string types with WITH UNIQUE KEYS clause on line 54 +[NO_PID]: sqlca: code: -400, state: 42804 +SQL error: cannot use non-string types with WITH UNIQUE KEYS clause on line 54 +[NO_PID]: ecpg_execute on line 57: query: select json ( '{"a": 1, "a": 2}' ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 57: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 57: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 57: RESULT: {"a": 1, "a": 2} offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 60: query: select json ( '{"a": 1, "a": 2}' with unique keys ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 60: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_check_PQresult on line 60: bad response - ERROR: duplicate JSON object key value +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: raising sqlstate 22030 (sqlcode -400): duplicate JSON object key value on line 60 +[NO_PID]: sqlca: code: -400, state: 22030 +SQL error: duplicate JSON object key value on line 60 +[NO_PID]: ecpg_execute on line 63: query: select json_scalar ( null ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 63: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 63: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 63: RESULT: offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: raising sqlcode -213 on line 63: null value without indicator on line 63 +[NO_PID]: sqlca: code: -213, state: 22002 +SQL error: null value without indicator on line 63 +[NO_PID]: ecpg_execute on line 66: query: select json_scalar ( null :: int ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 66: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 66: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 66: RESULT: offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: raising sqlcode -213 on line 66: null value without indicator on line 66 +[NO_PID]: sqlca: code: -213, state: 22002 +SQL error: null value without indicator on line 66 +[NO_PID]: ecpg_execute on line 69: query: select json_scalar ( 123.45 ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 69: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 69: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 69: RESULT: 123.45 offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 72: query: select json_scalar ( true ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 72: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 72: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 72: RESULT: true offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 75: query: select json_scalar ( ' 123.45' ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 75: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 75: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 75: RESULT: " 123.45" offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 78: query: select json_scalar ( '2020-06-07 01:02:03' :: timestamp ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 78: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 78: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 78: RESULT: "2020-06-07T01:02:03" offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 81: query: select json_scalar ( '{}' :: jsonb ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 81: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 81: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 81: RESULT: {} offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 84: query: select json_serialize ( null ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 84: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 84: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 84: RESULT: offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: raising sqlcode -213 on line 84: null value without indicator on line 84 +[NO_PID]: sqlca: code: -213, state: 22002 +SQL error: null value without indicator on line 84 +[NO_PID]: ecpg_execute on line 87: query: select json_serialize ( json ( '{ "a" : 1 } ' ) ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 87: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 87: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 87: RESULT: { "a" : 1 } offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 90: query: select json_serialize ( '{ "a" : 1 } ' ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 90: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 90: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 90: RESULT: { "a" : 1 } offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 93: query: select json_serialize ( '1' format json ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 93: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 93: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 93: RESULT: 1 offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 96: query: select json_serialize ( '{ "a" : 1 } ' returning varchar ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 96: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 96: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 96: RESULT: { "a" : 1 } offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 99: query: select json_serialize ( '{ "a" : 1 } ' returning jsonb ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 99: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_check_PQresult on line 99: bad response - ERROR: cannot use type jsonb in RETURNING clause of JSON_SERIALIZE() +HINT: Try returning a string type or bytea. +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: raising sqlstate 42804 (sqlcode -400): cannot use type jsonb in RETURNING clause of JSON_SERIALIZE() on line 99 +[NO_PID]: sqlca: code: -400, state: 42804 +SQL error: cannot use type jsonb in RETURNING clause of JSON_SERIALIZE() on line 99 +[NO_PID]: ecpg_execute on line 102: query: with val ( js ) as ( values ( '{ "a": 1, "b": [{ "a": 1, "b": 0, "a": 2 }] }' ) ) select js is json "IS JSON" , js is not json "IS NOT JSON" , js is json value "IS VALUE" , js is json object "IS OBJECT" , js is json array "IS ARRAY" , js is json scalar "IS SCALAR" , js is json without unique keys "WITHOUT UNIQUE" , js is json with unique keys "WITH UNIQUE" from val; with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 102: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 102: correctly got 1 tuples with 8 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 102: RESULT: t offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 102: RESULT: f offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 102: RESULT: t offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 102: RESULT: t offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 102: RESULT: f offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 102: RESULT: f offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 102: RESULT: t offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 102: RESULT: f offset: -1; array: no [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_finish: connection ecpg1_regression closed [NO_PID]: sqlca: code: 0, state: 00000 diff --git a/src/interfaces/ecpg/test/expected/sql-sqljson.stdout b/src/interfaces/ecpg/test/expected/sql-sqljson.stdout index 558901c406809..83f8df13e5a38 100644 --- a/src/interfaces/ecpg/test/expected/sql-sqljson.stdout +++ b/src/interfaces/ecpg/test/expected/sql-sqljson.stdout @@ -4,6 +4,22 @@ Found json=[] Found json=[] Found json={"1" : 1, "1" : "2"} Found json={"1": 1} +Found json={"1": 1} +Found json={ "a" : 1 } +Found json=1 +Found json={"a": 1, "a": 2} +Found json={"a": 1, "a": 2} +Found json={"a": 1, "a": 2} +Found json=123.45 +Found json=true +Found json=" 123.45" +Found json="2020-06-07T01:02:03" +Found json={} +Found json={} +Found json={ "a" : 1 } +Found json={ "a" : 1 } +Found json=1 +Found json={ "a" : 1 } Found is_json[0]: true Found is_json[1]: false Found is_json[2]: true diff --git a/src/interfaces/ecpg/test/expected/sql-sqljson_jsontable.c b/src/interfaces/ecpg/test/expected/sql-sqljson_jsontable.c new file mode 100644 index 0000000000000..b2a0f11eb6e42 --- /dev/null +++ b/src/interfaces/ecpg/test/expected/sql-sqljson_jsontable.c @@ -0,0 +1,153 @@ +/* Processed by ecpg (regression mode) */ +/* These include files are added by the preprocessor */ +#include +#include +#include +/* End of automatic include section */ +#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y)) + +#line 1 "sqljson_jsontable.pgc" +#include + + +#line 1 "sqlca.h" +#ifndef POSTGRES_SQLCA_H +#define POSTGRES_SQLCA_H + +#ifndef PGDLLIMPORT +#if defined(WIN32) || defined(__CYGWIN__) +#define PGDLLIMPORT __declspec (dllimport) +#else +#define PGDLLIMPORT +#endif /* __CYGWIN__ */ +#endif /* PGDLLIMPORT */ + +#define SQLERRMC_LEN 150 + +#ifdef __cplusplus +extern "C" +{ +#endif + +struct sqlca_t +{ + char sqlcaid[8]; + long sqlabc; + long sqlcode; + struct + { + int sqlerrml; + char sqlerrmc[SQLERRMC_LEN]; + } sqlerrm; + char sqlerrp[8]; + long sqlerrd[6]; + /* Element 0: empty */ + /* 1: OID of processed tuple if applicable */ + /* 2: number of rows processed */ + /* after an INSERT, UPDATE or */ + /* DELETE statement */ + /* 3: empty */ + /* 4: empty */ + /* 5: empty */ + char sqlwarn[8]; + /* Element 0: set to 'W' if at least one other is 'W' */ + /* 1: if 'W' at least one character string */ + /* value was truncated when it was */ + /* stored into a host variable. */ + + /* + * 2: if 'W' a (hopefully) non-fatal notice occurred + */ /* 3: empty */ + /* 4: empty */ + /* 5: empty */ + /* 6: empty */ + /* 7: empty */ + + char sqlstate[5]; +}; + +struct sqlca_t *ECPGget_sqlca(void); + +#ifndef POSTGRES_ECPG_INTERNAL +#define sqlca (*ECPGget_sqlca()) +#endif + +#ifdef __cplusplus +} +#endif + +#endif + +#line 3 "sqljson_jsontable.pgc" + + +#line 1 "regression.h" + + + + + + +#line 4 "sqljson_jsontable.pgc" + + +/* exec sql whenever sqlerror sqlprint ; */ +#line 6 "sqljson_jsontable.pgc" + + +int +main () +{ +/* exec sql begin declare section */ + + +#line 12 "sqljson_jsontable.pgc" + int foo ; +/* exec sql end declare section */ +#line 13 "sqljson_jsontable.pgc" + + + ECPGdebug (1, stderr); + + { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); +#line 17 "sqljson_jsontable.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 17 "sqljson_jsontable.pgc" + + { ECPGsetcommit(__LINE__, "on", NULL); +#line 18 "sqljson_jsontable.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 18 "sqljson_jsontable.pgc" + + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select foo from json_table ( jsonb '[{\"foo\":1}]' , '$[*]' as p0 columns ( foo int ) ) jt ( foo )", ECPGt_EOIT, + ECPGt_int,&(foo),(long)1,(long)1,sizeof(int), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 23 "sqljson_jsontable.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 23 "sqljson_jsontable.pgc" + + printf("Found foo=%d\n", foo); + + { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select foo from json_table ( jsonb '[{\"foo\":\"1\"}]' , '$[*]' as p0 columns ( nested '$' as p1 columns ( nested path '$' as p11 columns ( foo int ) ) ) ) jt ( foo )", ECPGt_EOIT, + ECPGt_int,&(foo),(long)1,(long)1,sizeof(int), + ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); +#line 31 "sqljson_jsontable.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 31 "sqljson_jsontable.pgc" + + printf("Found foo=%d\n", foo); + + { ECPGdisconnect(__LINE__, "CURRENT"); +#line 34 "sqljson_jsontable.pgc" + +if (sqlca.sqlcode < 0) sqlprint();} +#line 34 "sqljson_jsontable.pgc" + + + return 0; +} diff --git a/src/interfaces/ecpg/test/expected/sql-sqljson_jsontable.stderr b/src/interfaces/ecpg/test/expected/sql-sqljson_jsontable.stderr new file mode 100644 index 0000000000000..9262cf71a1073 --- /dev/null +++ b/src/interfaces/ecpg/test/expected/sql-sqljson_jsontable.stderr @@ -0,0 +1,24 @@ +[NO_PID]: ECPGdebug: set to 1 +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ECPGconnect: opening database ecpg1_regression on port +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ECPGsetcommit on line 18: action "on"; connection "ecpg1_regression" +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 20: query: select foo from json_table ( jsonb '[{"foo":1}]' , '$[*]' as p0 columns ( foo int ) ) jt ( foo ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 20: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 20: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 20: RESULT: 1 offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 26: query: select foo from json_table ( jsonb '[{"foo":"1"}]' , '$[*]' as p0 columns ( nested '$' as p1 columns ( nested path '$' as p11 columns ( foo int ) ) ) ) jt ( foo ); with 0 parameter(s) on connection ecpg1_regression +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_execute on line 26: using PQexec +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_process_output on line 26: correctly got 1 tuples with 1 fields +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_get_data on line 26: RESULT: 1 offset: -1; array: no +[NO_PID]: sqlca: code: 0, state: 00000 +[NO_PID]: ecpg_finish: connection ecpg1_regression closed +[NO_PID]: sqlca: code: 0, state: 00000 diff --git a/src/interfaces/ecpg/test/expected/sql-sqljson_jsontable.stdout b/src/interfaces/ecpg/test/expected/sql-sqljson_jsontable.stdout new file mode 100644 index 0000000000000..1e6f358a89460 --- /dev/null +++ b/src/interfaces/ecpg/test/expected/sql-sqljson_jsontable.stdout @@ -0,0 +1,2 @@ +Found foo=1 +Found foo=1 diff --git a/src/interfaces/ecpg/test/expected/sql-twophase.c b/src/interfaces/ecpg/test/expected/sql-twophase.c index 20b54d35e56a4..1e82525712269 100644 --- a/src/interfaces/ecpg/test/expected/sql-twophase.c +++ b/src/interfaces/ecpg/test/expected/sql-twophase.c @@ -79,7 +79,7 @@ if (sqlca.sqlcode < 0) sqlprint();} strcpy(msg, "prepare transaction"); - { ECPGtrans(__LINE__, NULL, "prepare transaction 'gxid'"); + { ECPGtrans(__LINE__, NULL, "prepare transaction 'ecpg_twophase'"); #line 32 "twophase.pgc" if (sqlca.sqlcode < 0) sqlprint();} @@ -87,7 +87,7 @@ if (sqlca.sqlcode < 0) sqlprint();} strcpy(msg, "commit prepared"); - { ECPGtrans(__LINE__, NULL, "commit prepared 'gxid'"); + { ECPGtrans(__LINE__, NULL, "commit prepared 'ecpg_twophase'"); #line 35 "twophase.pgc" if (sqlca.sqlcode < 0) sqlprint();} diff --git a/src/interfaces/ecpg/test/expected/sql-twophase.stderr b/src/interfaces/ecpg/test/expected/sql-twophase.stderr index 18415ff5a3dcf..7d19ac3cbf21d 100644 --- a/src/interfaces/ecpg/test/expected/sql-twophase.stderr +++ b/src/interfaces/ecpg/test/expected/sql-twophase.stderr @@ -20,9 +20,9 @@ [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_process_output on line 29: OK: INSERT 0 1 [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGtrans on line 32: action "prepare transaction 'gxid'"; connection "ecpg1_regression" +[NO_PID]: ECPGtrans on line 32: action "prepare transaction 'ecpg_twophase'"; connection "ecpg1_regression" [NO_PID]: sqlca: code: 0, state: 00000 -[NO_PID]: ECPGtrans on line 35: action "commit prepared 'gxid'"; connection "ecpg1_regression" +[NO_PID]: ECPGtrans on line 35: action "commit prepared 'ecpg_twophase'"; connection "ecpg1_regression" [NO_PID]: sqlca: code: 0, state: 00000 [NO_PID]: ecpg_execute on line 38: query: drop table t1; with 0 parameter(s) on connection ecpg1_regression [NO_PID]: sqlca: code: 0, state: 00000 diff --git a/src/interfaces/ecpg/test/expected/thread-alloc.c b/src/interfaces/ecpg/test/expected/thread-alloc.c index 37ef44ed94bd0..3b31d27fd3476 100644 --- a/src/interfaces/ecpg/test/expected/thread-alloc.c +++ b/src/interfaces/ecpg/test/expected/thread-alloc.c @@ -11,14 +11,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -101,7 +93,7 @@ struct sqlca_t *ECPGget_sqlca(void); #endif -#line 26 "alloc.pgc" +#line 18 "alloc.pgc" #line 1 "regression.h" @@ -111,14 +103,14 @@ struct sqlca_t *ECPGget_sqlca(void); -#line 27 "alloc.pgc" +#line 19 "alloc.pgc" /* exec sql whenever sqlerror sqlprint ; */ -#line 29 "alloc.pgc" +#line 21 "alloc.pgc" /* exec sql whenever not found sqlprint ; */ -#line 30 "alloc.pgc" +#line 22 "alloc.pgc" #ifdef WIN32 @@ -134,54 +126,54 @@ static void* fn(void* arg) -#line 41 "alloc.pgc" +#line 33 "alloc.pgc" int value ; -#line 42 "alloc.pgc" +#line 34 "alloc.pgc" char name [ 100 ] ; -#line 43 "alloc.pgc" +#line 35 "alloc.pgc" char ** r = NULL ; /* exec sql end declare section */ -#line 44 "alloc.pgc" +#line 36 "alloc.pgc" value = (intptr_t) arg; sprintf(name, "Connection: %d", value); { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , name, 0); -#line 49 "alloc.pgc" +#line 41 "alloc.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 49 "alloc.pgc" +#line 41 "alloc.pgc" { ECPGsetcommit(__LINE__, "on", NULL); -#line 50 "alloc.pgc" +#line 42 "alloc.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 50 "alloc.pgc" +#line 42 "alloc.pgc" for (i = 1; i <= REPEATS; ++i) { { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select relname from pg_class where relname = 'pg_class'", ECPGt_EOIT, ECPGt_char,&(r),(long)0,(long)0,(1)*sizeof(char), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT); -#line 53 "alloc.pgc" +#line 45 "alloc.pgc" if (sqlca.sqlcode == ECPG_NOT_FOUND) sqlprint(); -#line 53 "alloc.pgc" +#line 45 "alloc.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 53 "alloc.pgc" +#line 45 "alloc.pgc" free(r); r = NULL; } { ECPGdisconnect(__LINE__, name); -#line 57 "alloc.pgc" +#line 49 "alloc.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 57 "alloc.pgc" +#line 49 "alloc.pgc" return 0; @@ -215,4 +207,3 @@ int main () return 0; } -#endif diff --git a/src/interfaces/ecpg/test/expected/thread-descriptor.c b/src/interfaces/ecpg/test/expected/thread-descriptor.c index f56cc25ab0284..e34f4708d1379 100644 --- a/src/interfaces/ecpg/test/expected/thread-descriptor.c +++ b/src/interfaces/ecpg/test/expected/thread-descriptor.c @@ -7,7 +7,6 @@ #define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y)) #line 1 "descriptor.pgc" -#ifdef ENABLE_THREAD_SAFETY #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -16,7 +15,6 @@ #else #include #endif -#endif #include #define THREADS 16 @@ -91,16 +89,16 @@ struct sqlca_t *ECPGget_sqlca(void); #endif -#line 16 "descriptor.pgc" +#line 14 "descriptor.pgc" /* exec sql whenever sqlerror sqlprint ; */ -#line 17 "descriptor.pgc" +#line 15 "descriptor.pgc" /* exec sql whenever not found sqlprint ; */ -#line 18 "descriptor.pgc" +#line 16 "descriptor.pgc" -#if defined(ENABLE_THREAD_SAFETY) && defined(WIN32) +#if defined(WIN32) static unsigned __stdcall fn(void* arg) #else static void* fn(void* arg) @@ -111,16 +109,16 @@ static void* fn(void* arg) for (i = 1; i <= REPEATS; ++i) { ECPGallocate_desc(__LINE__, "mydesc"); -#line 30 "descriptor.pgc" +#line 28 "descriptor.pgc" if (sqlca.sqlcode < 0) sqlprint(); -#line 30 "descriptor.pgc" +#line 28 "descriptor.pgc" ECPGdeallocate_desc(__LINE__, "mydesc"); -#line 31 "descriptor.pgc" +#line 29 "descriptor.pgc" if (sqlca.sqlcode < 0) sqlprint(); -#line 31 "descriptor.pgc" +#line 29 "descriptor.pgc" } @@ -129,7 +127,6 @@ if (sqlca.sqlcode < 0) sqlprint(); int main () { -#ifdef ENABLE_THREAD_SAFETY int i; #ifdef WIN32 HANDLE threads[THREADS]; @@ -153,9 +150,6 @@ int main () for (i = 0; i < THREADS; ++i) pthread_join(threads[i], NULL); #endif -#else - fn(NULL); -#endif return 0; } diff --git a/src/interfaces/ecpg/test/expected/thread-prep.c b/src/interfaces/ecpg/test/expected/thread-prep.c index 7cdf2505d3f33..052e27b634f98 100644 --- a/src/interfaces/ecpg/test/expected/thread-prep.c +++ b/src/interfaces/ecpg/test/expected/thread-prep.c @@ -11,14 +11,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -101,7 +93,7 @@ struct sqlca_t *ECPGget_sqlca(void); #endif -#line 26 "prep.pgc" +#line 18 "prep.pgc" #line 1 "regression.h" @@ -111,14 +103,14 @@ struct sqlca_t *ECPGget_sqlca(void); -#line 27 "prep.pgc" +#line 19 "prep.pgc" /* exec sql whenever sqlerror sqlprint ; */ -#line 29 "prep.pgc" +#line 21 "prep.pgc" /* exec sql whenever not found sqlprint ; */ -#line 30 "prep.pgc" +#line 22 "prep.pgc" #ifdef WIN32 @@ -134,64 +126,64 @@ static void* fn(void* arg) -#line 41 "prep.pgc" +#line 33 "prep.pgc" int value ; -#line 42 "prep.pgc" +#line 34 "prep.pgc" char name [ 100 ] ; -#line 43 "prep.pgc" +#line 35 "prep.pgc" char query [ 256 ] = "INSERT INTO T VALUES ( ? )" ; /* exec sql end declare section */ -#line 44 "prep.pgc" +#line 36 "prep.pgc" value = (intptr_t) arg; sprintf(name, "Connection: %d", value); { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , name, 0); -#line 49 "prep.pgc" +#line 41 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 49 "prep.pgc" +#line 41 "prep.pgc" { ECPGsetcommit(__LINE__, "on", NULL); -#line 50 "prep.pgc" +#line 42 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 50 "prep.pgc" +#line 42 "prep.pgc" for (i = 1; i <= REPEATS; ++i) { { ECPGprepare(__LINE__, NULL, 0, "i", query); -#line 53 "prep.pgc" +#line 45 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 53 "prep.pgc" +#line 45 "prep.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_execute, "i", ECPGt_int,&(value),(long)1,(long)1,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT); -#line 54 "prep.pgc" +#line 46 "prep.pgc" if (sqlca.sqlcode == ECPG_NOT_FOUND) sqlprint(); -#line 54 "prep.pgc" +#line 46 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 54 "prep.pgc" +#line 46 "prep.pgc" } { ECPGdeallocate(__LINE__, 0, NULL, "i"); -#line 56 "prep.pgc" +#line 48 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 56 "prep.pgc" +#line 48 "prep.pgc" { ECPGdisconnect(__LINE__, name); -#line 57 "prep.pgc" +#line 49 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 57 "prep.pgc" +#line 49 "prep.pgc" return 0; @@ -207,34 +199,34 @@ int main () #endif { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); -#line 71 "prep.pgc" +#line 63 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 71 "prep.pgc" +#line 63 "prep.pgc" { ECPGsetcommit(__LINE__, "on", NULL); -#line 72 "prep.pgc" +#line 64 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 72 "prep.pgc" +#line 64 "prep.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table if exists T", ECPGt_EOIT, ECPGt_EORT); -#line 73 "prep.pgc" +#line 65 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 73 "prep.pgc" +#line 65 "prep.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table T ( i int )", ECPGt_EOIT, ECPGt_EORT); -#line 74 "prep.pgc" +#line 66 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 74 "prep.pgc" +#line 66 "prep.pgc" { ECPGdisconnect(__LINE__, "CURRENT"); -#line 75 "prep.pgc" +#line 67 "prep.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 75 "prep.pgc" +#line 67 "prep.pgc" #ifdef WIN32 @@ -256,4 +248,3 @@ if (sqlca.sqlcode < 0) sqlprint();} return 0; } -#endif diff --git a/src/interfaces/ecpg/test/expected/thread-thread.c b/src/interfaces/ecpg/test/expected/thread-thread.c index 0e75c47fab26e..95faa223c2002 100644 --- a/src/interfaces/ecpg/test/expected/thread-thread.c +++ b/src/interfaces/ecpg/test/expected/thread-thread.c @@ -15,14 +15,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifndef WIN32 #include #else @@ -38,7 +30,7 @@ main(void) -#line 24 "thread.pgc" +#line 16 "thread.pgc" void *test_thread(void *arg); @@ -57,10 +49,10 @@ int main() /* exec sql begin declare section */ -#line 40 "thread.pgc" +#line 32 "thread.pgc" int l_rows ; /* exec sql end declare section */ -#line 41 "thread.pgc" +#line 33 "thread.pgc" /* Do not switch on debug output for regression tests. The threads get executed in @@ -69,22 +61,22 @@ int main() /* setup test_thread table */ { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); } -#line 48 "thread.pgc" +#line 40 "thread.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table test_thread", ECPGt_EOIT, ECPGt_EORT);} -#line 49 "thread.pgc" +#line 41 "thread.pgc" /* DROP might fail */ { ECPGtrans(__LINE__, NULL, "commit");} -#line 50 "thread.pgc" +#line 42 "thread.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table test_thread ( tstamp timestamp not null default cast ( timeofday ( ) as timestamp ) , thread text not null , iteration integer not null , primary key ( thread , iteration ) )", ECPGt_EOIT, ECPGt_EORT);} -#line 55 "thread.pgc" +#line 47 "thread.pgc" { ECPGtrans(__LINE__, NULL, "commit");} -#line 56 "thread.pgc" +#line 48 "thread.pgc" { ECPGdisconnect(__LINE__, "CURRENT");} -#line 57 "thread.pgc" +#line 49 "thread.pgc" /* create, and start, threads */ @@ -116,18 +108,18 @@ int main() /* and check results */ { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); } -#line 87 "thread.pgc" +#line 79 "thread.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select count ( * ) from test_thread", ECPGt_EOIT, ECPGt_int,&(l_rows),(long)1,(long)1,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} -#line 88 "thread.pgc" +#line 80 "thread.pgc" { ECPGtrans(__LINE__, NULL, "commit");} -#line 89 "thread.pgc" +#line 81 "thread.pgc" { ECPGdisconnect(__LINE__, "CURRENT");} -#line 90 "thread.pgc" +#line 82 "thread.pgc" if( l_rows == (nthreads * iterations) ) printf("Success.\n"); @@ -145,13 +137,13 @@ void *test_thread(void *arg) -#line 104 "thread.pgc" +#line 96 "thread.pgc" int l_i ; -#line 105 "thread.pgc" +#line 97 "thread.pgc" char l_connection [ 128 ] ; /* exec sql end declare section */ -#line 106 "thread.pgc" +#line 98 "thread.pgc" /* build up connection name, and connect to database */ @@ -161,13 +153,13 @@ void *test_thread(void *arg) _snprintf(l_connection, sizeof(l_connection), "thread_%03ld", threadnum); #endif /* exec sql whenever sqlerror sqlprint ; */ -#line 114 "thread.pgc" +#line 106 "thread.pgc" { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , l_connection, 0); -#line 115 "thread.pgc" +#line 107 "thread.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 115 "thread.pgc" +#line 107 "thread.pgc" if( sqlca.sqlcode != 0 ) { @@ -175,10 +167,10 @@ if (sqlca.sqlcode < 0) sqlprint();} return NULL; } { ECPGtrans(__LINE__, l_connection, "begin"); -#line 121 "thread.pgc" +#line 113 "thread.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 121 "thread.pgc" +#line 113 "thread.pgc" /* insert into test_thread table */ @@ -189,10 +181,10 @@ if (sqlca.sqlcode < 0) sqlprint();} ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_int,&(l_i),(long)1,(long)1,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT); -#line 126 "thread.pgc" +#line 118 "thread.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 126 "thread.pgc" +#line 118 "thread.pgc" if( sqlca.sqlcode != 0 ) printf("%s: ERROR: insert failed!\n", l_connection); @@ -200,17 +192,16 @@ if (sqlca.sqlcode < 0) sqlprint();} /* all done */ { ECPGtrans(__LINE__, l_connection, "commit"); -#line 132 "thread.pgc" +#line 124 "thread.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 132 "thread.pgc" +#line 124 "thread.pgc" { ECPGdisconnect(__LINE__, l_connection); -#line 133 "thread.pgc" +#line 125 "thread.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 133 "thread.pgc" +#line 125 "thread.pgc" return NULL; } -#endif /* ENABLE_THREAD_SAFETY */ diff --git a/src/interfaces/ecpg/test/expected/thread-thread_implicit.c b/src/interfaces/ecpg/test/expected/thread-thread_implicit.c index 0df2794530c92..7ac0297a234a3 100644 --- a/src/interfaces/ecpg/test/expected/thread-thread_implicit.c +++ b/src/interfaces/ecpg/test/expected/thread-thread_implicit.c @@ -15,14 +15,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifndef WIN32 #include #else @@ -38,7 +30,7 @@ main(void) -#line 24 "thread_implicit.pgc" +#line 16 "thread_implicit.pgc" void *test_thread(void *arg); @@ -57,10 +49,10 @@ int main() /* exec sql begin declare section */ -#line 40 "thread_implicit.pgc" +#line 32 "thread_implicit.pgc" int l_rows ; /* exec sql end declare section */ -#line 41 "thread_implicit.pgc" +#line 33 "thread_implicit.pgc" /* Do not switch on debug output for regression tests. The threads get executed in @@ -69,22 +61,22 @@ int main() /* setup test_thread table */ { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); } -#line 48 "thread_implicit.pgc" +#line 40 "thread_implicit.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table test_thread", ECPGt_EOIT, ECPGt_EORT);} -#line 49 "thread_implicit.pgc" +#line 41 "thread_implicit.pgc" /* DROP might fail */ { ECPGtrans(__LINE__, NULL, "commit");} -#line 50 "thread_implicit.pgc" +#line 42 "thread_implicit.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "create table test_thread ( tstamp timestamp not null default cast ( timeofday ( ) as timestamp ) , thread text not null , iteration integer not null , primary key ( thread , iteration ) )", ECPGt_EOIT, ECPGt_EORT);} -#line 55 "thread_implicit.pgc" +#line 47 "thread_implicit.pgc" { ECPGtrans(__LINE__, NULL, "commit");} -#line 56 "thread_implicit.pgc" +#line 48 "thread_implicit.pgc" { ECPGdisconnect(__LINE__, "CURRENT");} -#line 57 "thread_implicit.pgc" +#line 49 "thread_implicit.pgc" /* create, and start, threads */ @@ -116,18 +108,18 @@ int main() /* and check results */ { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , NULL, 0); } -#line 87 "thread_implicit.pgc" +#line 79 "thread_implicit.pgc" { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "select count ( * ) from test_thread", ECPGt_EOIT, ECPGt_int,&(l_rows),(long)1,(long)1,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EORT);} -#line 88 "thread_implicit.pgc" +#line 80 "thread_implicit.pgc" { ECPGtrans(__LINE__, NULL, "commit");} -#line 89 "thread_implicit.pgc" +#line 81 "thread_implicit.pgc" { ECPGdisconnect(__LINE__, "CURRENT");} -#line 90 "thread_implicit.pgc" +#line 82 "thread_implicit.pgc" if( l_rows == (nthreads * iterations) ) printf("Success.\n"); @@ -145,13 +137,13 @@ void *test_thread(void *arg) -#line 104 "thread_implicit.pgc" +#line 96 "thread_implicit.pgc" int l_i ; -#line 105 "thread_implicit.pgc" +#line 97 "thread_implicit.pgc" char l_connection [ 128 ] ; /* exec sql end declare section */ -#line 106 "thread_implicit.pgc" +#line 98 "thread_implicit.pgc" /* build up connection name, and connect to database */ @@ -161,13 +153,13 @@ void *test_thread(void *arg) _snprintf(l_connection, sizeof(l_connection), "thread_%03ld", threadnum); #endif /* exec sql whenever sqlerror sqlprint ; */ -#line 114 "thread_implicit.pgc" +#line 106 "thread_implicit.pgc" { ECPGconnect(__LINE__, 0, "ecpg1_regression" , NULL, NULL , l_connection, 0); -#line 115 "thread_implicit.pgc" +#line 107 "thread_implicit.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 115 "thread_implicit.pgc" +#line 107 "thread_implicit.pgc" if( sqlca.sqlcode != 0 ) { @@ -175,10 +167,10 @@ if (sqlca.sqlcode < 0) sqlprint();} return NULL; } { ECPGtrans(__LINE__, NULL, "begin"); -#line 121 "thread_implicit.pgc" +#line 113 "thread_implicit.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 121 "thread_implicit.pgc" +#line 113 "thread_implicit.pgc" /* insert into test_thread table */ @@ -189,10 +181,10 @@ if (sqlca.sqlcode < 0) sqlprint();} ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_int,&(l_i),(long)1,(long)1,sizeof(int), ECPGt_NO_INDICATOR, NULL , 0L, 0L, 0L, ECPGt_EOIT, ECPGt_EORT); -#line 126 "thread_implicit.pgc" +#line 118 "thread_implicit.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 126 "thread_implicit.pgc" +#line 118 "thread_implicit.pgc" if( sqlca.sqlcode != 0 ) printf("%s: ERROR: insert failed!\n", l_connection); @@ -200,17 +192,16 @@ if (sqlca.sqlcode < 0) sqlprint();} /* all done */ { ECPGtrans(__LINE__, NULL, "commit"); -#line 132 "thread_implicit.pgc" +#line 124 "thread_implicit.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 132 "thread_implicit.pgc" +#line 124 "thread_implicit.pgc" { ECPGdisconnect(__LINE__, l_connection); -#line 133 "thread_implicit.pgc" +#line 125 "thread_implicit.pgc" if (sqlca.sqlcode < 0) sqlprint();} -#line 133 "thread_implicit.pgc" +#line 125 "thread_implicit.pgc" return NULL; } -#endif /* ENABLE_THREAD_SAFETY */ diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build index 04c6819a79983..a0d0f38d19af2 100644 --- a/src/interfaces/ecpg/test/meson.build +++ b/src/interfaces/ecpg/test/meson.build @@ -1,10 +1,12 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # can't run ecpg to build test dependencies, at least not without an emulator if meson.is_cross_build() subdir_done() endif +ecpg_test_dependencies = [] + pg_regress_ecpg_sources = pg_regress_c + files( 'pg_regress_ecpg.c', ) @@ -18,12 +20,12 @@ pg_regress_ecpg = executable('pg_regress_ecpg', pg_regress_ecpg_sources, c_args: pg_regress_cflags, include_directories: [pg_regress_inc, include_directories('.')], - dependencies: [frontend_code], + dependencies: [frontend_code, libpq], kwargs: default_bin_args + { 'install': false }, ) -testprep_targets += pg_regress_ecpg +ecpg_test_dependencies += pg_regress_ecpg # create .c files and executables from .pgc files ecpg_test_exec_kw = { @@ -50,8 +52,6 @@ ecpg_preproc_test_command_end = [ '-o', '@OUTPUT@', '@INPUT@' ] -ecpg_test_dependencies = [] - subdir('compat_informix') subdir('compat_oracle') subdir('connect') diff --git a/src/interfaces/ecpg/test/pg_regress_ecpg.c b/src/interfaces/ecpg/test/pg_regress_ecpg.c index ea7add84a2129..c9960b8d202ab 100644 --- a/src/interfaces/ecpg/test/pg_regress_ecpg.c +++ b/src/interfaces/ecpg/test/pg_regress_ecpg.c @@ -8,7 +8,7 @@ * * This code is released under the terms of the PostgreSQL License. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/interfaces/ecpg/test/pg_regress_ecpg.c @@ -18,9 +18,9 @@ #include "postgres_fe.h" -#include "pg_regress.h" #include "common/string.h" #include "lib/stringinfo.h" +#include "pg_regress.h" /* diff --git a/src/interfaces/ecpg/test/pgtypeslib/dt_test.pgc b/src/interfaces/ecpg/test/pgtypeslib/dt_test.pgc index f81a392665505..645c273e503cd 100644 --- a/src/interfaces/ecpg/test/pgtypeslib/dt_test.pgc +++ b/src/interfaces/ecpg/test/pgtypeslib/dt_test.pgc @@ -2,11 +2,14 @@ #include #include #include +#include #include #include exec sql include ../regression; +static void check_errno(void); + int main(void) { @@ -189,10 +192,19 @@ main(void) PGTYPESchar_free(text); ts1 = PGTYPEStimestamp_from_asc("1994-02-11 26:10:35", NULL); + /* failure, check error code */ + check_errno(); text = PGTYPEStimestamp_to_asc(ts1); printf("timestamp_to_asc3: %s\n", text); PGTYPESchar_free(text); + ts1 = PGTYPEStimestamp_from_asc("AM95000062", NULL); + /* failure, check error code */ + check_errno(); + text = PGTYPEStimestamp_to_asc(ts1); + printf("timestamp_to_asc4: %s\n", text); + PGTYPESchar_free(text); + /* abc-03:10:35-def-02/11/94-gh */ /* 12345678901234567890123456789 */ @@ -383,3 +395,21 @@ main(void) return 0; } + +static void +check_errno(void) +{ + switch(errno) + { + case 0: + printf("(no errno set) - "); + break; + case PGTYPES_TS_BAD_TIMESTAMP: + printf("(errno == PGTYPES_TS_BAD_TIMESTAMP) - "); + break; + default: + printf("(unknown errno (%d))\n", errno); + printf("(libc: (%s)) ", strerror(errno)); + break; + } +} diff --git a/src/interfaces/ecpg/test/pgtypeslib/meson.build b/src/interfaces/ecpg/test/pgtypeslib/meson.build index ae9bb1d6e3f72..6266dc6b364db 100644 --- a/src/interfaces/ecpg/test/pgtypeslib/meson.build +++ b/src/interfaces/ecpg/test/pgtypeslib/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pgc_files = [ 'dt_test', diff --git a/src/interfaces/ecpg/test/preproc/meson.build b/src/interfaces/ecpg/test/preproc/meson.build index 8ea77a2050fd4..949bbbb57cb03 100644 --- a/src/interfaces/ecpg/test/preproc/meson.build +++ b/src/interfaces/ecpg/test/preproc/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pgc_files = [ 'array_of_struct', diff --git a/src/interfaces/ecpg/test/sql/.gitignore b/src/interfaces/ecpg/test/sql/.gitignore index 057480a8f897c..46adc571b4829 100644 --- a/src/interfaces/ecpg/test/sql/.gitignore +++ b/src/interfaces/ecpg/test/sql/.gitignore @@ -48,5 +48,7 @@ /sqlda.c /sqljson /sqljson.c +/sqljson_jsontable +/sqljson_jsontable.c /twophase /twophase.c diff --git a/src/interfaces/ecpg/test/sql/Makefile b/src/interfaces/ecpg/test/sql/Makefile index d8213b25ceaef..3ff190a523365 100644 --- a/src/interfaces/ecpg/test/sql/Makefile +++ b/src/interfaces/ecpg/test/sql/Makefile @@ -24,6 +24,7 @@ TESTS = array array.c \ quote quote.c \ show show.c \ sqljson sqljson.c \ + sqljson_jsontable sqljson_jsontable.c \ insupd insupd.c \ twophase twophase.c \ insupd insupd.c \ @@ -33,5 +34,8 @@ TESTS = array array.c \ all: $(TESTS) +define.c: define.pgc define_prelim.pgc $(ECPG_TEST_DEPENDENCIES) + $(ECPG) -DCMDLINESYM=123 -o $@ $(srcdir)/define_prelim.pgc $< + oldexec.c: oldexec.pgc $(ECPG_TEST_DEPENDENCIES) $(ECPG) -r questionmarks -o $@ $< diff --git a/src/interfaces/ecpg/test/sql/define.pgc b/src/interfaces/ecpg/test/sql/define.pgc index ed58a4bde0c19..83f328df46865 100644 --- a/src/interfaces/ecpg/test/sql/define.pgc +++ b/src/interfaces/ecpg/test/sql/define.pgc @@ -53,6 +53,31 @@ int main(void) exec sql SET TIMEZONE TO TZVAR; exec sql endif; + /* test handling of a macro defined on the command line */ + exec sql select CMDLINESYM INTO :i; + printf("original CMDLINESYM: %d\n", i); + + exec sql define CMDLINESYM 42; + + exec sql select CMDLINESYM INTO :i; + printf("redefined CMDLINESYM: %d\n", i); + + exec sql define CMDLINESYM 43; + + exec sql select CMDLINESYM INTO :i; + printf("redefined CMDLINESYM: %d\n", i); + + exec sql undef CMDLINESYM; + + exec sql ifdef CMDLINESYM; + exec sql insert into test values (NUMBER, 'no string'); + exec sql endif; + + /* this macro should not have carried over from define_prelim.pgc */ + exec sql ifdef NONCMDLINESYM; + exec sql insert into test values (NUMBER, 'no string'); + exec sql endif; + exec sql disconnect; return 0; } diff --git a/src/interfaces/ecpg/test/sql/define_prelim.pgc b/src/interfaces/ecpg/test/sql/define_prelim.pgc new file mode 100644 index 0000000000000..7a984f74c84ef --- /dev/null +++ b/src/interfaces/ecpg/test/sql/define_prelim.pgc @@ -0,0 +1,6 @@ +/* + * Test that the effects of these commands don't carry over to the next + * file named on the ecpg command line. + */ +exec sql define CMDLINESYM 999; +exec sql define NONCMDLINESYM 1234; diff --git a/src/interfaces/ecpg/test/sql/meson.build b/src/interfaces/ecpg/test/sql/meson.build index f4c9418abb88e..4da6e19f5f13e 100644 --- a/src/interfaces/ecpg/test/sql/meson.build +++ b/src/interfaces/ecpg/test/sql/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pgc_files = [ 'array', @@ -26,10 +26,12 @@ pgc_files = [ 'show', 'sqlda', 'sqljson', + 'sqljson_jsontable', 'twophase', ] pgc_extra_flags = { + 'define': ['-DCMDLINESYM=123', files('define_prelim.pgc')], 'oldexec': ['-r', 'questionmarks'], } diff --git a/src/interfaces/ecpg/test/sql/sqljson.pgc b/src/interfaces/ecpg/test/sql/sqljson.pgc index a00550383447b..ddcbcc3b3cb53 100644 --- a/src/interfaces/ecpg/test/sql/sqljson.pgc +++ b/src/interfaces/ecpg/test/sql/sqljson.pgc @@ -39,6 +39,66 @@ EXEC SQL END DECLARE SECTION; EXEC SQL SELECT JSON_OBJECT(1: 1, '2': NULL ABSENT ON NULL WITHOUT UNIQUE RETURNING jsonb) INTO :json; printf("Found json=%s\n", json); + EXEC SQL SELECT JSON(NULL) INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON('{ "a" : 1 } ' FORMAT JSON) INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON('{ "a" : 1 } ' FORMAT JSON ENCODING UTF8) INTO :json; + // error + + EXEC SQL SELECT JSON(' 1 '::jsonb) INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON(' 1 '::json WITH UNIQUE KEYS) INTO json; + // error + + EXEC SQL SELECT JSON('{"a": 1, "a": 2}') INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON('{"a": 1, "a": 2}' WITH UNIQUE KEYS) INTO :json; + // error + + EXEC SQL SELECT JSON_SCALAR(NULL) INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON_SCALAR(NULL::int) INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON_SCALAR(123.45) INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON_SCALAR(true) INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON_SCALAR(' 123.45') INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON_SCALAR('2020-06-07 01:02:03'::timestamp) INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON_SCALAR('{}'::jsonb) INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON_SERIALIZE(NULL) INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON_SERIALIZE(JSON('{ "a" : 1 } ')) INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON_SERIALIZE('{ "a" : 1 } ') INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON_SERIALIZE('1' FORMAT JSON) INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON_SERIALIZE('{ "a" : 1 } ' RETURNING varchar) INTO :json; + printf("Found json=%s\n", json); + + EXEC SQL SELECT JSON_SERIALIZE('{ "a" : 1 } ' RETURNING jsonb); + // error + EXEC SQL WITH val (js) AS (VALUES ('{ "a": 1, "b": [{ "a": 1, "b": 0, "a": 2 }] }')) SELECT js IS JSON "IS JSON", diff --git a/src/interfaces/ecpg/test/sql/sqljson_jsontable.pgc b/src/interfaces/ecpg/test/sql/sqljson_jsontable.pgc new file mode 100644 index 0000000000000..aa2b4494bb6eb --- /dev/null +++ b/src/interfaces/ecpg/test/sql/sqljson_jsontable.pgc @@ -0,0 +1,37 @@ +#include + +EXEC SQL INCLUDE sqlca; +exec sql include ../regression; + +EXEC SQL WHENEVER SQLERROR sqlprint; + +int +main () +{ +EXEC SQL BEGIN DECLARE SECTION; + int foo; +EXEC SQL END DECLARE SECTION; + + ECPGdebug (1, stderr); + + EXEC SQL CONNECT TO REGRESSDB1; + EXEC SQL SET AUTOCOMMIT = ON; + + EXEC SQL SELECT foo INTO :foo FROM JSON_TABLE(jsonb '[{"foo":1}]', '$[*]' AS p0 + COLUMNS ( + foo int + )) jt (foo); + printf("Found foo=%d\n", foo); + + EXEC SQL SELECT foo INTO :foo FROM JSON_TABLE(jsonb '[{"foo":"1"}]', '$[*]' AS p0 + COLUMNS ( + NESTED '$' AS p1 COLUMNS ( + NESTED PATH '$' AS p11 COLUMNS ( foo int ) + ) + )) jt (foo); + printf("Found foo=%d\n", foo); + + EXEC SQL DISCONNECT; + + return 0; +} diff --git a/src/interfaces/ecpg/test/sql/twophase.pgc b/src/interfaces/ecpg/test/sql/twophase.pgc index 38913d7af2d7c..13106ffc638af 100644 --- a/src/interfaces/ecpg/test/sql/twophase.pgc +++ b/src/interfaces/ecpg/test/sql/twophase.pgc @@ -29,10 +29,10 @@ int main(void) exec sql insert into t1 values(1); strcpy(msg, "prepare transaction"); - exec sql prepare transaction 'gxid'; + exec sql prepare transaction 'ecpg_twophase'; strcpy(msg, "commit prepared"); - exec sql commit prepared 'gxid'; + exec sql commit prepared 'ecpg_twophase'; strcpy(msg, "drop"); exec sql drop table t1; diff --git a/src/interfaces/ecpg/test/thread/alloc.pgc b/src/interfaces/ecpg/test/thread/alloc.pgc index c0021a737ed31..d3d35493bf99e 100644 --- a/src/interfaces/ecpg/test/thread/alloc.pgc +++ b/src/interfaces/ecpg/test/thread/alloc.pgc @@ -2,14 +2,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -87,4 +79,3 @@ int main () return 0; } -#endif diff --git a/src/interfaces/ecpg/test/thread/descriptor.pgc b/src/interfaces/ecpg/test/thread/descriptor.pgc index 76a7a5dff544b..30bce7c87bcc8 100644 --- a/src/interfaces/ecpg/test/thread/descriptor.pgc +++ b/src/interfaces/ecpg/test/thread/descriptor.pgc @@ -1,4 +1,3 @@ -#ifdef ENABLE_THREAD_SAFETY #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -7,7 +6,6 @@ #else #include #endif -#endif #include #define THREADS 16 @@ -17,7 +15,7 @@ EXEC SQL include sqlca; EXEC SQL whenever sqlerror sqlprint; EXEC SQL whenever not found sqlprint; -#if defined(ENABLE_THREAD_SAFETY) && defined(WIN32) +#if defined(WIN32) static unsigned __stdcall fn(void* arg) #else static void* fn(void* arg) @@ -36,7 +34,6 @@ static void* fn(void* arg) int main () { -#ifdef ENABLE_THREAD_SAFETY int i; #ifdef WIN32 HANDLE threads[THREADS]; @@ -60,9 +57,6 @@ int main () for (i = 0; i < THREADS; ++i) pthread_join(threads[i], NULL); #endif -#else - fn(NULL); -#endif return 0; } diff --git a/src/interfaces/ecpg/test/thread/meson.build b/src/interfaces/ecpg/test/thread/meson.build index 608498a62fce0..5ed67ccbcd14e 100644 --- a/src/interfaces/ecpg/test/thread/meson.build +++ b/src/interfaces/ecpg/test/thread/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pgc_files = [ 'thread_implicit', diff --git a/src/interfaces/ecpg/test/thread/prep.pgc b/src/interfaces/ecpg/test/thread/prep.pgc index d7ecfd4855598..f61b31ce101ce 100644 --- a/src/interfaces/ecpg/test/thread/prep.pgc +++ b/src/interfaces/ecpg/test/thread/prep.pgc @@ -2,14 +2,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -93,4 +85,3 @@ int main () return 0; } -#endif diff --git a/src/interfaces/ecpg/test/thread/thread.pgc b/src/interfaces/ecpg/test/thread/thread.pgc index e7d8c00af6f4b..b9b9ebb441de8 100644 --- a/src/interfaces/ecpg/test/thread/thread.pgc +++ b/src/interfaces/ecpg/test/thread/thread.pgc @@ -6,14 +6,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifndef WIN32 #include #else @@ -133,4 +125,3 @@ void *test_thread(void *arg) EXEC SQL DISCONNECT :l_connection; return NULL; } -#endif /* ENABLE_THREAD_SAFETY */ diff --git a/src/interfaces/ecpg/test/thread/thread_implicit.pgc b/src/interfaces/ecpg/test/thread/thread_implicit.pgc index b4cae7e1aecf3..ff9b12a943707 100644 --- a/src/interfaces/ecpg/test/thread/thread_implicit.pgc +++ b/src/interfaces/ecpg/test/thread/thread_implicit.pgc @@ -6,14 +6,6 @@ #include #include "ecpg_config.h" -#ifndef ENABLE_THREAD_SAFETY -int -main(void) -{ - printf("No threading enabled.\n"); - return 0; -} -#else #ifndef WIN32 #include #else @@ -133,4 +125,3 @@ void *test_thread(void *arg) EXEC SQL DISCONNECT :l_connection; return NULL; } -#endif /* ENABLE_THREAD_SAFETY */ diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile index 0919d8f32f696..b36a7657648a7 100644 --- a/src/interfaces/libpq/Makefile +++ b/src/interfaces/libpq/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/interfaces/libpq library # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/interfaces/libpq/Makefile @@ -13,7 +13,7 @@ subdir = src/interfaces/libpq top_builddir = ../../.. include $(top_builddir)/src/Makefile.global -export with_ssl +export with_ssl with_gssapi with_krb_srvnam PGFILEDESC = "PostgreSQL Access Library" @@ -27,12 +27,10 @@ ifneq ($(PORTNAME), win32) override CFLAGS += $(PTHREAD_CFLAGS) endif -# The MSVC build system scrapes OBJS from this file. If you change any of -# the conditional additions of files to OBJS, update Mkvcbuild.pm to match. - OBJS = \ $(WIN32RES) \ fe-auth-scram.o \ + fe-cancel.o \ fe-connect.o \ fe-exec.o \ fe-lobj.o \ @@ -69,11 +67,8 @@ endif ifeq ($(PORTNAME), win32) OBJS += \ + pthread-win32.o \ win32.o - -ifeq ($(enable_thread_safety), yes) -OBJS += pthread-win32.o -endif endif @@ -110,15 +105,17 @@ backend_src = $(top_srcdir)/src/backend # build toolchains insert abort() calls, e.g. to implement assert().) # If nm doesn't exist or doesn't work on shlibs, this test will do nothing, # which is fine. The exclusion of __cxa_atexit is necessary on OpenBSD, -# which seems to insert references to that even in pure C code. +# which seems to insert references to that even in pure C code. Excluding +# __tsan_func_exit is necessary when using ThreadSanitizer data race detector +# which use this function for instrumentation of function exit. # Skip the test when profiling, as gcc may insert exit() calls for that. # Also skip the test on platforms where libpq infrastructure may be provided # by statically-linked libraries, as we can't expect them to honor this # coding rule. libpq-refs-stamp: $(shlib) ifneq ($(enable_coverage), yes) -ifeq (,$(filter aix solaris,$(PORTNAME))) - @if nm -A -u $< 2>/dev/null | grep -v __cxa_atexit | grep exit; then \ +ifeq (,$(filter solaris,$(PORTNAME))) + @if nm -A -u $< 2>/dev/null | grep -v -e __cxa_atexit -e __tsan_func_exit | grep exit; then \ echo 'libpq must not be calling any function which invokes exit'; exit 1; \ fi endif @@ -168,6 +165,3 @@ clean distclean: clean-lib rm -f $(OBJS) pthread.h libpq-refs-stamp # Might be left over from a Win32 client-only build rm -f pg_config_paths.h - -maintainer-clean: distclean - $(MAKE) -C test $@ diff --git a/src/interfaces/libpq/exports.txt b/src/interfaces/libpq/exports.txt index 7ded77aff37de..5d8213e0b571a 100644 --- a/src/interfaces/libpq/exports.txt +++ b/src/interfaces/libpq/exports.txt @@ -187,3 +187,21 @@ PQsetTraceFlags 184 PQmblenBounded 185 PQsendFlushRequest 186 PQconnectionUsedGSSAPI 187 +PQclosePrepared 188 +PQclosePortal 189 +PQsendClosePrepared 190 +PQsendClosePortal 191 +PQchangePassword 192 +PQsendPipelineSync 193 +PQcancelBlocking 194 +PQcancelStart 195 +PQcancelCreate 196 +PQcancelPoll 197 +PQcancelStatus 198 +PQcancelSocket 199 +PQcancelErrorMessage 200 +PQcancelReset 201 +PQcancelFinish 202 +PQsocketPoll 203 +PQsetChunkedRowsMode 204 +PQgetCurrentTimeUSec 205 diff --git a/src/interfaces/libpq/fe-auth-sasl.h b/src/interfaces/libpq/fe-auth-sasl.h index ddf6ea3f3f43b..4eecf53a15030 100644 --- a/src/interfaces/libpq/fe-auth-sasl.h +++ b/src/interfaces/libpq/fe-auth-sasl.h @@ -8,7 +8,7 @@ * * See src/include/libpq/sasl.h for the backend counterpart. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/interfaces/libpq/fe-auth-sasl.h @@ -21,6 +21,17 @@ #include "libpq-fe.h" +/* + * Possible states for the SASL exchange, see the comment on exchange for an + * explanation of these. + */ +typedef enum +{ + SASL_COMPLETE = 0, + SASL_FAILED, + SASL_CONTINUE, +} SASLStatus; + /* * Frontend SASL mechanism callbacks. * @@ -59,7 +70,8 @@ typedef struct pg_fe_sasl_mech * Produces a client response to a server challenge. As a special case * for client-first SASL mechanisms, exchange() is called with a NULL * server response once at the start of the authentication exchange to - * generate an initial response. + * generate an initial response. Returns a SASLStatus indicating the + * state and status of the exchange. * * Input parameters: * @@ -79,22 +91,23 @@ typedef struct pg_fe_sasl_mech * * output: A malloc'd buffer containing the client's response to * the server (can be empty), or NULL if the exchange should - * be aborted. (*success should be set to false in the + * be aborted. (The callback should return SASL_FAILED in the * latter case.) * * outputlen: The length (0 or higher) of the client response buffer, * ignored if output is NULL. * - * done: Set to true if the SASL exchange should not continue, - * because the exchange is either complete or failed + * Return value: * - * success: Set to true if the SASL exchange completed successfully. - * Ignored if *done is false. + * SASL_CONTINUE: The output buffer is filled with a client response. + * Additional server challenge is expected + * SASL_COMPLETE: The SASL exchange has completed successfully. + * SASL_FAILED: The exchange has failed and the connection should be + * dropped. *-------- */ - void (*exchange) (void *state, char *input, int inputlen, - char **output, int *outputlen, - bool *done, bool *success); + SASLStatus (*exchange) (void *state, char *input, int inputlen, + char **output, int *outputlen); /*-------- * channel_bound() diff --git a/src/interfaces/libpq/fe-auth-scram.c b/src/interfaces/libpq/fe-auth-scram.c index 6b779ec7ffd1e..0bb820e0d9741 100644 --- a/src/interfaces/libpq/fe-auth-scram.c +++ b/src/interfaces/libpq/fe-auth-scram.c @@ -3,7 +3,7 @@ * fe-auth-scram.c * The front-end (client) implementation of SCRAM authentication. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -24,9 +24,8 @@ /* The exported SCRAM callback mechanism. */ static void *scram_init(PGconn *conn, const char *password, const char *sasl_mechanism); -static void scram_exchange(void *opaq, char *input, int inputlen, - char **output, int *outputlen, - bool *done, bool *success); +static SASLStatus scram_exchange(void *opaq, char *input, int inputlen, + char **output, int *outputlen); static bool scram_channel_bound(void *opaq); static void scram_free(void *opaq); @@ -46,7 +45,7 @@ typedef enum FE_SCRAM_INIT, FE_SCRAM_NONCE_SENT, FE_SCRAM_PROOF_SENT, - FE_SCRAM_FINISHED + FE_SCRAM_FINISHED, } fe_scram_state_enum; typedef struct @@ -202,17 +201,14 @@ scram_free(void *opaq) /* * Exchange a SCRAM message with backend. */ -static void +static SASLStatus scram_exchange(void *opaq, char *input, int inputlen, - char **output, int *outputlen, - bool *done, bool *success) + char **output, int *outputlen) { fe_scram_state *state = (fe_scram_state *) opaq; PGconn *conn = state->conn; const char *errstr = NULL; - *done = false; - *success = false; *output = NULL; *outputlen = 0; @@ -225,12 +221,12 @@ scram_exchange(void *opaq, char *input, int inputlen, if (inputlen == 0) { libpq_append_conn_error(conn, "malformed SCRAM message (empty message)"); - goto error; + return SASL_FAILED; } if (inputlen != strlen(input)) { libpq_append_conn_error(conn, "malformed SCRAM message (length mismatch)"); - goto error; + return SASL_FAILED; } } @@ -240,61 +236,59 @@ scram_exchange(void *opaq, char *input, int inputlen, /* Begin the SCRAM handshake, by sending client nonce */ *output = build_client_first_message(state); if (*output == NULL) - goto error; + return SASL_FAILED; *outputlen = strlen(*output); - *done = false; state->state = FE_SCRAM_NONCE_SENT; - break; + return SASL_CONTINUE; case FE_SCRAM_NONCE_SENT: /* Receive salt and server nonce, send response. */ if (!read_server_first_message(state, input)) - goto error; + return SASL_FAILED; *output = build_client_final_message(state); if (*output == NULL) - goto error; + return SASL_FAILED; *outputlen = strlen(*output); - *done = false; state->state = FE_SCRAM_PROOF_SENT; - break; + return SASL_CONTINUE; case FE_SCRAM_PROOF_SENT: - /* Receive server signature */ - if (!read_server_final_message(state, input)) - goto error; - - /* - * Verify server signature, to make sure we're talking to the - * genuine server. - */ - if (!verify_server_signature(state, success, &errstr)) - { - libpq_append_conn_error(conn, "could not verify server signature: %s", errstr); - goto error; - } - - if (!*success) { - libpq_append_conn_error(conn, "incorrect server signature"); + bool match; + + /* Receive server signature */ + if (!read_server_final_message(state, input)) + return SASL_FAILED; + + /* + * Verify server signature, to make sure we're talking to the + * genuine server. + */ + if (!verify_server_signature(state, &match, &errstr)) + { + libpq_append_conn_error(conn, "could not verify server signature: %s", errstr); + return SASL_FAILED; + } + + if (!match) + { + libpq_append_conn_error(conn, "incorrect server signature"); + } + state->state = FE_SCRAM_FINISHED; + state->conn->client_finished_auth = true; + return match ? SASL_COMPLETE : SASL_FAILED; } - *done = true; - state->state = FE_SCRAM_FINISHED; - state->conn->client_finished_auth = true; - break; default: /* shouldn't happen */ libpq_append_conn_error(conn, "invalid SCRAM exchange state"); - goto error; + break; } - return; -error: - *done = true; - *success = false; + return SASL_FAILED; } /* @@ -401,7 +395,7 @@ build_client_first_message(fe_scram_state *state) Assert(conn->ssl_in_use); appendPQExpBufferStr(&buf, "p=tls-server-end-point"); } -#ifdef HAVE_PGTLS_GET_PEER_CERTIFICATE_HASH +#ifdef USE_SSL else if (conn->channel_binding[0] != 'd' && /* disable */ conn->ssl_in_use) { @@ -474,7 +468,7 @@ build_client_final_message(fe_scram_state *state) */ if (strcmp(state->sasl_mechanism, SCRAM_SHA_256_PLUS_NAME) == 0) { -#ifdef HAVE_PGTLS_GET_PEER_CERTIFICATE_HASH +#ifdef USE_SSL char *cbind_data = NULL; size_t cbind_data_len = 0; size_t cbind_header_len; @@ -540,9 +534,9 @@ build_client_final_message(fe_scram_state *state) appendPQExpBufferStr(&conn->errorMessage, "channel binding not supported by this build\n"); return NULL; -#endif /* HAVE_PGTLS_GET_PEER_CERTIFICATE_HASH */ +#endif /* USE_SSL */ } -#ifdef HAVE_PGTLS_GET_PEER_CERTIFICATE_HASH +#ifdef USE_SSL else if (conn->channel_binding[0] != 'd' && /* disable */ conn->ssl_in_use) appendPQExpBufferStr(&buf, "c=eSws"); /* base64 of "y,," */ diff --git a/src/interfaces/libpq/fe-auth.c b/src/interfaces/libpq/fe-auth.c index 88fd0f3d80220..3b25d8afda475 100644 --- a/src/interfaces/libpq/fe-auth.c +++ b/src/interfaces/libpq/fe-auth.c @@ -3,7 +3,7 @@ * fe-auth.c * The front-end (client) authorization routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -27,6 +27,7 @@ #else #include #include +#include #include /* for MAXHOSTNAMELEN on most */ #include #ifdef HAVE_SYS_UCRED_H @@ -123,7 +124,7 @@ pg_GSS_continue(PGconn *conn, int payloadlen) * first or subsequent packet, just send the same kind of password * packet. */ - if (pqPacketSend(conn, 'p', + if (pqPacketSend(conn, PqMsg_GSSResponse, goutbuf.value, goutbuf.length) != STATUS_OK) { gss_release_buffer(&lmin_s, &goutbuf); @@ -323,7 +324,7 @@ pg_SSPI_continue(PGconn *conn, int payloadlen) */ if (outbuf.pBuffers[0].cbBuffer > 0) { - if (pqPacketSend(conn, 'p', + if (pqPacketSend(conn, PqMsg_GSSResponse, outbuf.pBuffers[0].pvBuffer, outbuf.pBuffers[0].cbBuffer)) { FreeContextBuffer(outbuf.pBuffers[0].pvBuffer); @@ -422,11 +423,10 @@ pg_SASL_init(PGconn *conn, int payloadlen) { char *initialresponse = NULL; int initialresponselen; - bool done; - bool success; const char *selected_mechanism; PQExpBufferData mechanism_buf; - char *password; + char *password = NULL; + SASLStatus status; initPQExpBuffer(&mechanism_buf); @@ -446,8 +446,7 @@ pg_SASL_init(PGconn *conn, int payloadlen) /* * Parse the list of SASL authentication mechanisms in the * AuthenticationSASL message, and select the best mechanism that we - * support. SCRAM-SHA-256-PLUS and SCRAM-SHA-256 are the only ones - * supported at the moment, listed by order of decreasing importance. + * support. Mechanisms are listed by order of decreasing importance. */ selected_mechanism = NULL; for (;;) @@ -478,7 +477,7 @@ pg_SASL_init(PGconn *conn, int payloadlen) { /* The server has offered SCRAM-SHA-256-PLUS. */ -#ifdef HAVE_PGTLS_GET_PEER_CERTIFICATE_HASH +#ifdef USE_SSL /* * The client supports channel binding, which is chosen if * channel_binding is not disabled. @@ -487,6 +486,7 @@ pg_SASL_init(PGconn *conn, int payloadlen) { selected_mechanism = SCRAM_SHA_256_PLUS_NAME; conn->sasl = &pg_scram_mech; + conn->password_needed = true; } #else /* @@ -522,6 +522,7 @@ pg_SASL_init(PGconn *conn, int payloadlen) { selected_mechanism = SCRAM_SHA_256_NAME; conn->sasl = &pg_scram_mech; + conn->password_needed = true; } } @@ -545,18 +546,19 @@ pg_SASL_init(PGconn *conn, int payloadlen) /* * First, select the password to use for the exchange, complaining if - * there isn't one. Currently, all supported SASL mechanisms require a - * password, so we can just go ahead here without further distinction. + * there isn't one and the selected SASL mechanism needs it. */ - conn->password_needed = true; - password = conn->connhost[conn->whichhost].password; - if (password == NULL) - password = conn->pgpass; - if (password == NULL || password[0] == '\0') + if (conn->password_needed) { - appendPQExpBufferStr(&conn->errorMessage, - PQnoPasswordSupplied); - goto error; + password = conn->connhost[conn->whichhost].password; + if (password == NULL) + password = conn->pgpass; + if (password == NULL || password[0] == '\0') + { + appendPQExpBufferStr(&conn->errorMessage, + PQnoPasswordSupplied); + goto error; + } } Assert(conn->sasl); @@ -574,18 +576,17 @@ pg_SASL_init(PGconn *conn, int payloadlen) goto oom_error; /* Get the mechanism-specific Initial Client Response, if any */ - conn->sasl->exchange(conn->sasl_state, - NULL, -1, - &initialresponse, &initialresponselen, - &done, &success); + status = conn->sasl->exchange(conn->sasl_state, + NULL, -1, + &initialresponse, &initialresponselen); - if (done && !success) + if (status == SASL_FAILED) goto error; /* * Build a SASLInitialResponse message, and send it. */ - if (pqPutMsgStart('p', conn)) + if (pqPutMsgStart(PqMsg_SASLInitialResponse, conn)) goto error; if (pqPuts(selected_mechanism, conn)) goto error; @@ -628,10 +629,9 @@ pg_SASL_continue(PGconn *conn, int payloadlen, bool final) { char *output; int outputlen; - bool done; - bool success; int res; char *challenge; + SASLStatus status; /* Read the SASL challenge from the AuthenticationSASLContinue message. */ challenge = malloc(payloadlen + 1); @@ -650,13 +650,12 @@ pg_SASL_continue(PGconn *conn, int payloadlen, bool final) /* For safety and convenience, ensure the buffer is NULL-terminated. */ challenge[payloadlen] = '\0'; - conn->sasl->exchange(conn->sasl_state, - challenge, payloadlen, - &output, &outputlen, - &done, &success); + status = conn->sasl->exchange(conn->sasl_state, + challenge, payloadlen, + &output, &outputlen); free(challenge); /* don't need the input anymore */ - if (final && !done) + if (final && status == SASL_CONTINUE) { if (outputlen != 0) free(output); @@ -669,7 +668,7 @@ pg_SASL_continue(PGconn *conn, int payloadlen, bool final) * If the exchange is not completed yet, we need to make sure that the * SASL mechanism has generated a message to send back. */ - if (output == NULL && !done) + if (output == NULL && status == SASL_CONTINUE) { libpq_append_conn_error(conn, "no client response found after SASL exchange success"); return STATUS_ERROR; @@ -684,14 +683,14 @@ pg_SASL_continue(PGconn *conn, int payloadlen, bool final) /* * Send the SASL response to the server. */ - res = pqPacketSend(conn, 'p', output, outputlen); + res = pqPacketSend(conn, PqMsg_SASLResponse, output, outputlen); free(output); if (res != STATUS_OK) return STATUS_ERROR; } - if (done && !success) + if (status == SASL_FAILED) return STATUS_ERROR; return STATUS_OK; @@ -755,7 +754,8 @@ pg_password_sendauth(PGconn *conn, const char *password, AuthRequest areq) default: return STATUS_ERROR; } - ret = pqPacketSend(conn, 'p', pwd_to_send, strlen(pwd_to_send) + 1); + ret = pqPacketSend(conn, PqMsg_PasswordMessage, + pwd_to_send, strlen(pwd_to_send) + 1); free(crypt_pwd); return ret; } @@ -1179,15 +1179,6 @@ pg_fe_getusername(uid_t user_id, PQExpBuffer errorMessage) char pwdbuf[BUFSIZ]; #endif - /* - * Some users are using configure --enable-thread-safety-force, so we - * might as well do the locking within our library to protect getpwuid(). - * In fact, application developers can use getpwuid() in their application - * if they use the locking call we provide, or install their own locking - * function using PQregisterThreadLock(). - */ - pglock_thread(); - #ifdef WIN32 if (GetUserName(username, &namesize)) name = username; @@ -1209,8 +1200,6 @@ pg_fe_getusername(uid_t user_id, PQExpBuffer errorMessage) libpq_append_error(errorMessage, "out of memory"); } - pgunlock_thread(); - return result; } @@ -1325,7 +1314,7 @@ PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, if (strlen(val) > MAX_ALGORITHM_NAME_LEN) { PQclear(res); - libpq_append_conn_error(conn, "password_encryption value too long"); + libpq_append_conn_error(conn, "\"password_encryption\" value too long"); return NULL; } strcpy(algobuf, val); @@ -1382,3 +1371,84 @@ PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, return crypt_pwd; } + +/* + * PQchangePassword -- exported routine to change a password + * + * This is intended to be used by client applications that wish to + * change the password for a user. The password is not sent in + * cleartext because it is encrypted on the client side. This is + * good because it ensures the cleartext password is never known by + * the server, and therefore won't end up in logs, pg_stat displays, + * etc. The password encryption is performed by PQencryptPasswordConn(), + * which is passed a NULL for the algorithm argument. Hence encryption + * is done according to the server's password_encryption + * setting. We export the function so that clients won't be dependent + * on the implementation specific details with respect to how the + * server changes passwords. + * + * Arguments are a connection object, the SQL name of the target user, + * and the cleartext password. + * + * Return value is the PGresult of the executed ALTER USER statement + * or NULL if we never get there. The caller is responsible to PQclear() + * the returned PGresult. + * + * PQresultStatus() should be called to check the return value for errors, + * and PQerrorMessage() used to get more information about such errors. + */ +PGresult * +PQchangePassword(PGconn *conn, const char *user, const char *passwd) +{ + char *encrypted_password = PQencryptPasswordConn(conn, passwd, + user, NULL); + + if (!encrypted_password) + { + /* PQencryptPasswordConn() already registered the error */ + return NULL; + } + else + { + char *fmtpw = PQescapeLiteral(conn, encrypted_password, + strlen(encrypted_password)); + + /* no longer needed, so clean up now */ + PQfreemem(encrypted_password); + + if (!fmtpw) + { + /* PQescapeLiteral() already registered the error */ + return NULL; + } + else + { + char *fmtuser = PQescapeIdentifier(conn, user, strlen(user)); + + if (!fmtuser) + { + /* PQescapeIdentifier() already registered the error */ + PQfreemem(fmtpw); + return NULL; + } + else + { + PQExpBufferData buf; + PGresult *res; + + initPQExpBuffer(&buf); + printfPQExpBuffer(&buf, "ALTER USER %s PASSWORD %s", + fmtuser, fmtpw); + + res = PQexec(conn, buf.data); + + /* clean up */ + termPQExpBuffer(&buf); + PQfreemem(fmtuser); + PQfreemem(fmtpw); + + return res; + } + } + } +} diff --git a/src/interfaces/libpq/fe-auth.h b/src/interfaces/libpq/fe-auth.h index 124dd5d031332..a18c5086882f0 100644 --- a/src/interfaces/libpq/fe-auth.h +++ b/src/interfaces/libpq/fe-auth.h @@ -4,7 +4,7 @@ * * Definitions for network authentication routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/interfaces/libpq/fe-auth.h diff --git a/src/interfaces/libpq/fe-cancel.c b/src/interfaces/libpq/fe-cancel.c new file mode 100644 index 0000000000000..213a6f43c2d76 --- /dev/null +++ b/src/interfaces/libpq/fe-cancel.c @@ -0,0 +1,702 @@ +/*------------------------------------------------------------------------- + * + * fe-cancel.c + * functions related to setting up a connection to the backend + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/interfaces/libpq/fe-cancel.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres_fe.h" + +#include + +#include "libpq-fe.h" +#include "libpq-int.h" +#include "port/pg_bswap.h" + + +/* + * pg_cancel_conn (backing struct for PGcancelConn) is a wrapper around a + * PGconn to send cancellations using PQcancelBlocking and PQcancelStart. + * This isn't just a typedef because we want the compiler to complain when a + * PGconn is passed to a function that expects a PGcancelConn, and vice versa. + */ +struct pg_cancel_conn +{ + PGconn conn; +}; + +/* + * pg_cancel (backing struct for PGcancel) stores all data necessary to send a + * cancel request. + */ +struct pg_cancel +{ + SockAddr raddr; /* Remote address */ + int be_pid; /* PID of to-be-canceled backend */ + int be_key; /* cancel key of to-be-canceled backend */ + int pgtcp_user_timeout; /* tcp user timeout */ + int keepalives; /* use TCP keepalives? */ + int keepalives_idle; /* time between TCP keepalives */ + int keepalives_interval; /* time between TCP keepalive + * retransmits */ + int keepalives_count; /* maximum number of TCP keepalive + * retransmits */ +}; + + +/* + * PQcancelCreate + * + * Create and return a PGcancelConn, which can be used to securely cancel a + * query on the given connection. + * + * This requires either following the non-blocking flow through + * PQcancelStart() and PQcancelPoll(), or the blocking PQcancelBlocking(). + */ +PGcancelConn * +PQcancelCreate(PGconn *conn) +{ + PGconn *cancelConn = pqMakeEmptyPGconn(); + pg_conn_host originalHost; + + if (cancelConn == NULL) + return NULL; + + /* Check we have an open connection */ + if (!conn) + { + libpq_append_conn_error(cancelConn, "connection pointer is NULL"); + return (PGcancelConn *) cancelConn; + } + + if (conn->sock == PGINVALID_SOCKET) + { + libpq_append_conn_error(cancelConn, "connection not open"); + return (PGcancelConn *) cancelConn; + } + + /* + * Indicate that this connection is used to send a cancellation + */ + cancelConn->cancelRequest = true; + + if (!pqCopyPGconn(conn, cancelConn)) + return (PGcancelConn *) cancelConn; + + /* + * Compute derived options + */ + if (!pqConnectOptions2(cancelConn)) + return (PGcancelConn *) cancelConn; + + /* + * Copy cancellation token data from the original connection + */ + cancelConn->be_pid = conn->be_pid; + cancelConn->be_key = conn->be_key; + + /* + * Cancel requests should not iterate over all possible hosts. The request + * needs to be sent to the exact host and address that the original + * connection used. So we manually create the host and address arrays with + * a single element after freeing the host array that we generated from + * the connection options. + */ + pqReleaseConnHosts(cancelConn); + cancelConn->nconnhost = 1; + cancelConn->naddr = 1; + + cancelConn->connhost = calloc(cancelConn->nconnhost, sizeof(pg_conn_host)); + if (!cancelConn->connhost) + goto oom_error; + + originalHost = conn->connhost[conn->whichhost]; + if (originalHost.host) + { + cancelConn->connhost[0].host = strdup(originalHost.host); + if (!cancelConn->connhost[0].host) + goto oom_error; + } + if (originalHost.hostaddr) + { + cancelConn->connhost[0].hostaddr = strdup(originalHost.hostaddr); + if (!cancelConn->connhost[0].hostaddr) + goto oom_error; + } + if (originalHost.port) + { + cancelConn->connhost[0].port = strdup(originalHost.port); + if (!cancelConn->connhost[0].port) + goto oom_error; + } + if (originalHost.password) + { + cancelConn->connhost[0].password = strdup(originalHost.password); + if (!cancelConn->connhost[0].password) + goto oom_error; + } + + cancelConn->addr = calloc(cancelConn->naddr, sizeof(AddrInfo)); + if (!cancelConn->addr) + goto oom_error; + + cancelConn->addr[0].addr = conn->raddr; + cancelConn->addr[0].family = conn->raddr.addr.ss_family; + + cancelConn->status = CONNECTION_ALLOCATED; + return (PGcancelConn *) cancelConn; + +oom_error: + cancelConn->status = CONNECTION_BAD; + libpq_append_conn_error(cancelConn, "out of memory"); + return (PGcancelConn *) cancelConn; +} + + +/* + * PQcancelBlocking + * + * Send a cancellation request in a blocking fashion. + * Returns 1 if successful 0 if not. + */ +int +PQcancelBlocking(PGcancelConn *cancelConn) +{ + if (!PQcancelStart(cancelConn)) + return 0; + return pqConnectDBComplete(&cancelConn->conn); +} + +/* + * PQcancelStart + * + * Starts sending a cancellation request in a non-blocking fashion. Returns + * 1 if successful 0 if not. + */ +int +PQcancelStart(PGcancelConn *cancelConn) +{ + if (!cancelConn || cancelConn->conn.status == CONNECTION_BAD) + return 0; + + if (cancelConn->conn.status != CONNECTION_ALLOCATED) + { + libpq_append_conn_error(&cancelConn->conn, + "cancel request is already being sent on this connection"); + cancelConn->conn.status = CONNECTION_BAD; + return 0; + } + + return pqConnectDBStart(&cancelConn->conn); +} + +/* + * PQcancelPoll + * + * Poll a cancel connection. For usage details see PQconnectPoll. + */ +PostgresPollingStatusType +PQcancelPoll(PGcancelConn *cancelConn) +{ + PGconn *conn = &cancelConn->conn; + int n; + + /* + * We leave most of the connection establishment to PQconnectPoll, since + * it's very similar to normal connection establishment. But once we get + * to the CONNECTION_AWAITING_RESPONSE we need to start doing our own + * thing. + */ + if (conn->status != CONNECTION_AWAITING_RESPONSE) + { + return PQconnectPoll(conn); + } + + /* + * At this point we are waiting on the server to close the connection, + * which is its way of communicating that the cancel has been handled. + */ + + n = pqReadData(conn); + + if (n == 0) + return PGRES_POLLING_READING; + +#ifndef WIN32 + + /* + * If we receive an error report it, but only if errno is non-zero. + * Otherwise we assume it's an EOF, which is what we expect from the + * server. + * + * We skip this for Windows, because Windows is a bit special in its EOF + * behaviour for TCP. Sometimes it will error with an ECONNRESET when + * there is a clean connection closure. See these threads for details: + * https://www.postgresql.org/message-id/flat/90b34057-4176-7bb0-0dbb-9822a5f6425b%40greiz-reinsdorf.de + * + * https://www.postgresql.org/message-id/flat/CA%2BhUKG%2BOeoETZQ%3DQw5Ub5h3tmwQhBmDA%3DnuNO3KG%3DzWfUypFAw%40mail.gmail.com + * + * PQcancel ignores such errors and reports success for the cancellation + * anyway, so even if this is not always correct we do the same here. + */ + if (n < 0 && errno != 0) + { + conn->status = CONNECTION_BAD; + return PGRES_POLLING_FAILED; + } +#endif + + /* + * We don't expect any data, only connection closure. So if we strangely + * do receive some data we consider that an error. + */ + if (n > 0) + { + libpq_append_conn_error(conn, "unexpected response from server"); + conn->status = CONNECTION_BAD; + return PGRES_POLLING_FAILED; + } + + /* + * Getting here means that we received an EOF, which is what we were + * expecting -- the cancel request has completed. + */ + cancelConn->conn.status = CONNECTION_OK; + resetPQExpBuffer(&conn->errorMessage); + return PGRES_POLLING_OK; +} + +/* + * PQcancelStatus + * + * Get the status of a cancel connection. + */ +ConnStatusType +PQcancelStatus(const PGcancelConn *cancelConn) +{ + return PQstatus(&cancelConn->conn); +} + +/* + * PQcancelSocket + * + * Get the socket of the cancel connection. + */ +int +PQcancelSocket(const PGcancelConn *cancelConn) +{ + return PQsocket(&cancelConn->conn); +} + +/* + * PQcancelErrorMessage + * + * Returns the error message most recently generated by an operation on the + * cancel connection. + */ +char * +PQcancelErrorMessage(const PGcancelConn *cancelConn) +{ + return PQerrorMessage(&cancelConn->conn); +} + +/* + * PQcancelReset + * + * Resets the cancel connection, so it can be reused to send a new cancel + * request. + */ +void +PQcancelReset(PGcancelConn *cancelConn) +{ + pqClosePGconn(&cancelConn->conn); + cancelConn->conn.status = CONNECTION_ALLOCATED; + cancelConn->conn.whichhost = 0; + cancelConn->conn.whichaddr = 0; + cancelConn->conn.try_next_host = false; + cancelConn->conn.try_next_addr = false; +} + +/* + * PQcancelFinish + * + * Closes and frees the cancel connection. + */ +void +PQcancelFinish(PGcancelConn *cancelConn) +{ + PQfinish(&cancelConn->conn); +} + +/* + * PQgetCancel: get a PGcancel structure corresponding to a connection. + * + * A copy is needed to be able to cancel a running query from a different + * thread. If the same structure is used all structure members would have + * to be individually locked (if the entire structure was locked, it would + * be impossible to cancel a synchronous query because the structure would + * have to stay locked for the duration of the query). + */ +PGcancel * +PQgetCancel(PGconn *conn) +{ + PGcancel *cancel; + + if (!conn) + return NULL; + + if (conn->sock == PGINVALID_SOCKET) + return NULL; + + cancel = malloc(sizeof(PGcancel)); + if (cancel == NULL) + return NULL; + + memcpy(&cancel->raddr, &conn->raddr, sizeof(SockAddr)); + cancel->be_pid = conn->be_pid; + cancel->be_key = conn->be_key; + /* We use -1 to indicate an unset connection option */ + cancel->pgtcp_user_timeout = -1; + cancel->keepalives = -1; + cancel->keepalives_idle = -1; + cancel->keepalives_interval = -1; + cancel->keepalives_count = -1; + if (conn->pgtcp_user_timeout != NULL) + { + if (!pqParseIntParam(conn->pgtcp_user_timeout, + &cancel->pgtcp_user_timeout, + conn, "tcp_user_timeout")) + goto fail; + } + if (conn->keepalives != NULL) + { + if (!pqParseIntParam(conn->keepalives, + &cancel->keepalives, + conn, "keepalives")) + goto fail; + } + if (conn->keepalives_idle != NULL) + { + if (!pqParseIntParam(conn->keepalives_idle, + &cancel->keepalives_idle, + conn, "keepalives_idle")) + goto fail; + } + if (conn->keepalives_interval != NULL) + { + if (!pqParseIntParam(conn->keepalives_interval, + &cancel->keepalives_interval, + conn, "keepalives_interval")) + goto fail; + } + if (conn->keepalives_count != NULL) + { + if (!pqParseIntParam(conn->keepalives_count, + &cancel->keepalives_count, + conn, "keepalives_count")) + goto fail; + } + + return cancel; + +fail: + free(cancel); + return NULL; +} + +/* PQfreeCancel: free a cancel structure */ +void +PQfreeCancel(PGcancel *cancel) +{ + free(cancel); +} + + +/* + * Sets an integer socket option on a TCP socket, if the provided value is + * not negative. Returns false if setsockopt fails for some reason. + * + * CAUTION: This needs to be signal safe, since it's used by PQcancel. + */ +#if defined(TCP_USER_TIMEOUT) || !defined(WIN32) +static bool +optional_setsockopt(int fd, int protoid, int optid, int value) +{ + if (value < 0) + return true; + if (setsockopt(fd, protoid, optid, (char *) &value, sizeof(value)) < 0) + return false; + return true; +} +#endif + + +/* + * PQcancel: old, non-encrypted, but signal-safe way of requesting query cancel + * + * The return value is true if the cancel request was successfully + * dispatched, false if not (in which case an error message is available). + * Note: successful dispatch is no guarantee that there will be any effect at + * the backend. The application must read the operation result as usual. + * + * On failure, an error message is stored in *errbuf, which must be of size + * errbufsize (recommended size is 256 bytes). *errbuf is not changed on + * success return. + * + * CAUTION: we want this routine to be safely callable from a signal handler + * (for example, an application might want to call it in a SIGINT handler). + * This means we cannot use any C library routine that might be non-reentrant. + * malloc/free are often non-reentrant, and anything that might call them is + * just as dangerous. We avoid sprintf here for that reason. Building up + * error messages with strcpy/strcat is tedious but should be quite safe. + * We also save/restore errno in case the signal handler support doesn't. + */ +int +PQcancel(PGcancel *cancel, char *errbuf, int errbufsize) +{ + int save_errno = SOCK_ERRNO; + pgsocket tmpsock = PGINVALID_SOCKET; + int maxlen; + struct + { + uint32 packetlen; + CancelRequestPacket cp; + } crp; + + if (!cancel) + { + strlcpy(errbuf, "PQcancel() -- no cancel object supplied", errbufsize); + /* strlcpy probably doesn't change errno, but be paranoid */ + SOCK_ERRNO_SET(save_errno); + return false; + } + + /* + * We need to open a temporary connection to the postmaster. Do this with + * only kernel calls. + */ + if ((tmpsock = socket(cancel->raddr.addr.ss_family, SOCK_STREAM, 0)) == PGINVALID_SOCKET) + { + strlcpy(errbuf, "PQcancel() -- socket() failed: ", errbufsize); + goto cancel_errReturn; + } + + /* + * Since this connection will only be used to send a single packet of + * data, we don't need NODELAY. We also don't set the socket to + * nonblocking mode, because the API definition of PQcancel requires the + * cancel to be sent in a blocking way. + * + * We do set socket options related to keepalives and other TCP timeouts. + * This ensures that this function does not block indefinitely when + * reasonable keepalive and timeout settings have been provided. + */ + if (cancel->raddr.addr.ss_family != AF_UNIX && + cancel->keepalives != 0) + { +#ifndef WIN32 + if (!optional_setsockopt(tmpsock, SOL_SOCKET, SO_KEEPALIVE, 1)) + { + strlcpy(errbuf, "PQcancel() -- setsockopt(SO_KEEPALIVE) failed: ", errbufsize); + goto cancel_errReturn; + } + +#ifdef PG_TCP_KEEPALIVE_IDLE + if (!optional_setsockopt(tmpsock, IPPROTO_TCP, PG_TCP_KEEPALIVE_IDLE, + cancel->keepalives_idle)) + { + strlcpy(errbuf, "PQcancel() -- setsockopt(" PG_TCP_KEEPALIVE_IDLE_STR ") failed: ", errbufsize); + goto cancel_errReturn; + } +#endif + +#ifdef TCP_KEEPINTVL + if (!optional_setsockopt(tmpsock, IPPROTO_TCP, TCP_KEEPINTVL, + cancel->keepalives_interval)) + { + strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_KEEPINTVL) failed: ", errbufsize); + goto cancel_errReturn; + } +#endif + +#ifdef TCP_KEEPCNT + if (!optional_setsockopt(tmpsock, IPPROTO_TCP, TCP_KEEPCNT, + cancel->keepalives_count)) + { + strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_KEEPCNT) failed: ", errbufsize); + goto cancel_errReturn; + } +#endif + +#else /* WIN32 */ + +#ifdef SIO_KEEPALIVE_VALS + if (!pqSetKeepalivesWin32(tmpsock, + cancel->keepalives_idle, + cancel->keepalives_interval)) + { + strlcpy(errbuf, "PQcancel() -- WSAIoctl(SIO_KEEPALIVE_VALS) failed: ", errbufsize); + goto cancel_errReturn; + } +#endif /* SIO_KEEPALIVE_VALS */ +#endif /* WIN32 */ + + /* TCP_USER_TIMEOUT works the same way on Unix and Windows */ +#ifdef TCP_USER_TIMEOUT + if (!optional_setsockopt(tmpsock, IPPROTO_TCP, TCP_USER_TIMEOUT, + cancel->pgtcp_user_timeout)) + { + strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_USER_TIMEOUT) failed: ", errbufsize); + goto cancel_errReturn; + } +#endif + } + +retry3: + if (connect(tmpsock, (struct sockaddr *) &cancel->raddr.addr, + cancel->raddr.salen) < 0) + { + if (SOCK_ERRNO == EINTR) + /* Interrupted system call - we'll just try again */ + goto retry3; + strlcpy(errbuf, "PQcancel() -- connect() failed: ", errbufsize); + goto cancel_errReturn; + } + + /* Create and send the cancel request packet. */ + + crp.packetlen = pg_hton32((uint32) sizeof(crp)); + crp.cp.cancelRequestCode = (MsgType) pg_hton32(CANCEL_REQUEST_CODE); + crp.cp.backendPID = pg_hton32(cancel->be_pid); + crp.cp.cancelAuthCode = pg_hton32(cancel->be_key); + +retry4: + if (send(tmpsock, (char *) &crp, sizeof(crp), 0) != (int) sizeof(crp)) + { + if (SOCK_ERRNO == EINTR) + /* Interrupted system call - we'll just try again */ + goto retry4; + strlcpy(errbuf, "PQcancel() -- send() failed: ", errbufsize); + goto cancel_errReturn; + } + + /* + * Wait for the postmaster to close the connection, which indicates that + * it's processed the request. Without this delay, we might issue another + * command only to find that our cancel zaps that command instead of the + * one we thought we were canceling. Note we don't actually expect this + * read to obtain any data, we are just waiting for EOF to be signaled. + */ +retry5: + if (recv(tmpsock, (char *) &crp, 1, 0) < 0) + { + if (SOCK_ERRNO == EINTR) + /* Interrupted system call - we'll just try again */ + goto retry5; + /* we ignore other error conditions */ + } + + /* All done */ + closesocket(tmpsock); + SOCK_ERRNO_SET(save_errno); + return true; + +cancel_errReturn: + + /* + * Make sure we don't overflow the error buffer. Leave space for the \n at + * the end, and for the terminating zero. + */ + maxlen = errbufsize - strlen(errbuf) - 2; + if (maxlen >= 0) + { + /* + * We can't invoke strerror here, since it's not signal-safe. Settle + * for printing the decimal value of errno. Even that has to be done + * the hard way. + */ + int val = SOCK_ERRNO; + char buf[32]; + char *bufp; + + bufp = buf + sizeof(buf) - 1; + *bufp = '\0'; + do + { + *(--bufp) = (val % 10) + '0'; + val /= 10; + } while (val > 0); + bufp -= 6; + memcpy(bufp, "error ", 6); + strncat(errbuf, bufp, maxlen); + strcat(errbuf, "\n"); + } + if (tmpsock != PGINVALID_SOCKET) + closesocket(tmpsock); + SOCK_ERRNO_SET(save_errno); + return false; +} + +/* + * PQrequestCancel: old, not thread-safe function for requesting query cancel + * + * Returns true if able to send the cancel request, false if not. + * + * On failure, the error message is saved in conn->errorMessage; this means + * that this can't be used when there might be other active operations on + * the connection object. + * + * NOTE: error messages will be cut off at the current size of the + * error message buffer, since we dare not try to expand conn->errorMessage! + */ +int +PQrequestCancel(PGconn *conn) +{ + int r; + PGcancel *cancel; + + /* Check we have an open connection */ + if (!conn) + return false; + + if (conn->sock == PGINVALID_SOCKET) + { + strlcpy(conn->errorMessage.data, + "PQrequestCancel() -- connection is not open\n", + conn->errorMessage.maxlen); + conn->errorMessage.len = strlen(conn->errorMessage.data); + conn->errorReported = 0; + + return false; + } + + cancel = PQgetCancel(conn); + if (cancel) + { + r = PQcancel(cancel, conn->errorMessage.data, + conn->errorMessage.maxlen); + PQfreeCancel(cancel); + } + else + { + strlcpy(conn->errorMessage.data, "out of memory", + conn->errorMessage.maxlen); + r = false; + } + + if (!r) + { + conn->errorMessage.len = strlen(conn->errorMessage.data); + conn->errorReported = 0; + } + + return r; +} diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index a8584d2c68492..2f87961a71ede 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -3,7 +3,7 @@ * fe-connect.c * functions related to setting up a connection to the backend * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -52,13 +52,11 @@ #include #endif -#ifdef ENABLE_THREAD_SAFETY #ifdef WIN32 #include "pthread-win32.h" #else #include #endif -#endif #ifdef USE_LDAP #ifdef WIN32 @@ -131,6 +129,7 @@ static int ldapServiceLookup(const char *purl, PQconninfoOption *options, #define DefaultSSLMode "disable" #define DefaultSSLCertMode "disable" #endif +#define DefaultSSLNegotiation "postgres" #ifdef ENABLE_GSS #include "fe-gssapi-common.h" #define DefaultGSSMode "prefer" @@ -274,6 +273,10 @@ static const internalPQconninfoOption PQconninfoOptions[] = { "SSL-Mode", "", 12, /* sizeof("verify-full") == 12 */ offsetof(struct pg_conn, sslmode)}, + {"sslnegotiation", "PGSSLNEGOTIATION", DefaultSSLNegotiation, NULL, + "SSL-Negotiation", "", 9, /* sizeof("postgres") == 9 */ + offsetof(struct pg_conn, sslnegotiation)}, + {"sslcompression", "PGSSLCOMPRESSION", "0", NULL, "SSL-Compression", "", 1, offsetof(struct pg_conn, sslcompression)}, @@ -389,15 +392,16 @@ static const char uri_designator[] = "postgresql://"; static const char short_uri_designator[] = "postgres://"; static bool connectOptions1(PGconn *conn, const char *conninfo); -static bool connectOptions2(PGconn *conn); -static int connectDBStart(PGconn *conn); -static int connectDBComplete(PGconn *conn); +static bool init_allowed_encryption_methods(PGconn *conn); +#if defined(USE_SSL) || defined(ENABLE_GSS) +static int encryption_negotiation_failed(PGconn *conn); +#endif +static bool connection_failed(PGconn *conn); +static bool select_next_encryption_method(PGconn *conn, bool have_valid_connection); static PGPing internal_ping(PGconn *conn); -static PGconn *makeEmptyPGconn(void); static void pqFreeCommandQueue(PGcmdQueueEntry *queue); static bool fillPGconn(PGconn *conn, PQconninfoOption *connOptions); static void freePGconn(PGconn *conn); -static void closePGconn(PGconn *conn); static void release_conn_addrinfo(PGconn *conn); static int store_conn_addrinfo(PGconn *conn, struct addrinfo *addrlist); static void sendTerminateConn(PGconn *conn); @@ -445,8 +449,6 @@ static void pgpassfileWarning(PGconn *conn); static void default_threadlock(int acquire); static bool sslVerifyProtocolVersion(const char *version); static bool sslVerifyProtocolRange(const char *min, const char *max); -static bool parse_int_param(const char *value, int *result, PGconn *conn, - const char *context); /* global variable because fe-auth.c needs to access it */ @@ -625,8 +627,17 @@ pqDropServerData(PGconn *conn) conn->write_failed = false; free(conn->write_err_msg); conn->write_err_msg = NULL; - conn->be_pid = 0; - conn->be_key = 0; + + /* + * Cancel connections need to retain their be_pid and be_key across + * PQcancelReset invocations, otherwise they would not have access to the + * secret token of the connection they are supposed to cancel. + */ + if (!conn->cancelRequest) + { + conn->be_pid = 0; + conn->be_key = 0; + } } @@ -648,8 +659,8 @@ pqDropServerData(PGconn *conn) * PQconnectStart or PQconnectStartParams (which differ in the same way as * PQconnectdb and PQconnectdbParams) and PQconnectPoll. * - * Internally, the static functions connectDBStart, connectDBComplete - * are part of the connection procedure. + * The non-exported functions pqConnectDBStart, pqConnectDBComplete are + * part of the connection procedure implementation. */ /* @@ -682,7 +693,7 @@ PQconnectdbParams(const char *const *keywords, PGconn *conn = PQconnectStartParams(keywords, values, expand_dbname); if (conn && conn->status != CONNECTION_BAD) - (void) connectDBComplete(conn); + (void) pqConnectDBComplete(conn); return conn; } @@ -735,7 +746,7 @@ PQconnectdb(const char *conninfo) PGconn *conn = PQconnectStart(conninfo); if (conn && conn->status != CONNECTION_BAD) - (void) connectDBComplete(conn); + (void) pqConnectDBComplete(conn); return conn; } @@ -789,7 +800,7 @@ PQconnectStartParams(const char *const *keywords, * to initialize conn->errorMessage to empty. All subsequent steps during * connection initialization will only append to that buffer. */ - conn = makeEmptyPGconn(); + conn = pqMakeEmptyPGconn(); if (conn == NULL) return NULL; @@ -823,15 +834,15 @@ PQconnectStartParams(const char *const *keywords, /* * Compute derived options */ - if (!connectOptions2(conn)) + if (!pqConnectOptions2(conn)) return conn; /* * Connect to the database */ - if (!connectDBStart(conn)) + if (!pqConnectDBStart(conn)) { - /* Just in case we failed to set it in connectDBStart */ + /* Just in case we failed to set it in pqConnectDBStart */ conn->status = CONNECTION_BAD; } @@ -867,7 +878,7 @@ PQconnectStart(const char *conninfo) * to initialize conn->errorMessage to empty. All subsequent steps during * connection initialization will only append to that buffer. */ - conn = makeEmptyPGconn(); + conn = pqMakeEmptyPGconn(); if (conn == NULL) return NULL; @@ -880,15 +891,15 @@ PQconnectStart(const char *conninfo) /* * Compute derived options */ - if (!connectOptions2(conn)) + if (!pqConnectOptions2(conn)) return conn; /* * Connect to the database */ - if (!connectDBStart(conn)) + if (!pqConnectDBStart(conn)) { - /* Just in case we failed to set it in connectDBStart */ + /* Just in case we failed to set it in pqConnectDBStart */ conn->status = CONNECTION_BAD; } @@ -899,7 +910,7 @@ PQconnectStart(const char *conninfo) * Move option values into conn structure * * Don't put anything cute here --- intelligence should be in - * connectOptions2 ... + * pqConnectOptions2 ... * * Returns true on success. On failure, returns false and sets error message. */ @@ -932,12 +943,51 @@ fillPGconn(PGconn *conn, PQconninfoOption *connOptions) return true; } +/* + * Copy over option values from srcConn to dstConn + * + * Don't put anything cute here --- intelligence should be in + * connectOptions2 ... + * + * Returns true on success. On failure, returns false and sets error message of + * dstConn. + */ +bool +pqCopyPGconn(PGconn *srcConn, PGconn *dstConn) +{ + const internalPQconninfoOption *option; + + /* copy over connection options */ + for (option = PQconninfoOptions; option->keyword; option++) + { + if (option->connofs >= 0) + { + const char **tmp = (const char **) ((char *) srcConn + option->connofs); + + if (*tmp) + { + char **dstConnmember = (char **) ((char *) dstConn + option->connofs); + + if (*dstConnmember) + free(*dstConnmember); + *dstConnmember = strdup(*tmp); + if (*dstConnmember == NULL) + { + libpq_append_conn_error(dstConn, "out of memory"); + return false; + } + } + } + } + return true; +} + /* * connectOptions1 * * Internal subroutine to set up connection parameters given an already- * created PGconn and a conninfo string. Derived settings should be - * processed by calling connectOptions2 next. (We split them because + * processed by calling pqConnectOptions2 next. (We split them because * PQsetdbLogin overrides defaults in between.) * * Returns true if OK, false if trouble (in which case errorMessage is set @@ -1059,15 +1109,15 @@ libpq_prng_init(PGconn *conn) } /* - * connectOptions2 + * pqConnectOptions2 * * Compute derived connection options after absorbing all user-supplied info. * * Returns true if OK, false if trouble (in which case errorMessage is set * and so is conn->status). */ -static bool -connectOptions2(PGconn *conn) +bool +pqConnectOptions2(PGconn *conn) { int i; @@ -1533,6 +1583,57 @@ connectOptions2(PGconn *conn) goto oom_error; } + /* + * validate sslnegotiation option, default is "postgres" for the postgres + * style negotiated connection with an extra round trip but more options. + */ + if (conn->sslnegotiation) + { + if (strcmp(conn->sslnegotiation, "postgres") != 0 + && strcmp(conn->sslnegotiation, "direct") != 0) + { + conn->status = CONNECTION_BAD; + libpq_append_conn_error(conn, "invalid %s value: \"%s\"", + "sslnegotiation", conn->sslnegotiation); + return false; + } + +#ifndef USE_SSL + if (conn->sslnegotiation[0] != 'p') + { + conn->status = CONNECTION_BAD; + libpq_append_conn_error(conn, "%s value \"%s\" invalid when SSL support is not compiled in", + "sslnegotiation", conn->sslnegotiation); + return false; + } +#endif + + /* + * Don't allow direct SSL negotiation with sslmode='prefer', because + * that poses a risk of unintentional fallback to plaintext connection + * when connecting to a pre-v17 server that does not support direct + * SSL connections. To keep things simple, don't allow it with + * sslmode='allow' or sslmode='disable' either. If a user goes through + * the trouble of setting sslnegotiation='direct', they probably + * intend to use SSL, and sslmode=disable or allow is probably a user + * user mistake anyway. + */ + if (conn->sslnegotiation[0] == 'd' && + conn->sslmode[0] != 'r' && conn->sslmode[0] != 'v') + { + conn->status = CONNECTION_BAD; + libpq_append_conn_error(conn, "weak sslmode \"%s\" may not be used with sslnegotiation=direct (use \"require\", \"verify-ca\", or \"verify-full\")", + conn->sslmode); + return false; + } + } + else + { + conn->sslnegotiation = strdup(DefaultSSLNegotiation); + if (!conn->sslnegotiation) + goto oom_error; + } + #ifdef USE_SSL /* @@ -1556,7 +1657,7 @@ connectOptions2(PGconn *conn) if (!sslVerifyProtocolVersion(conn->ssl_min_protocol_version)) { conn->status = CONNECTION_BAD; - libpq_append_conn_error(conn, "invalid %s value: \"%s\"", + libpq_append_conn_error(conn, "invalid \"%s\" value: \"%s\"", "ssl_min_protocol_version", conn->ssl_min_protocol_version); return false; @@ -1564,7 +1665,7 @@ connectOptions2(PGconn *conn) if (!sslVerifyProtocolVersion(conn->ssl_max_protocol_version)) { conn->status = CONNECTION_BAD; - libpq_append_conn_error(conn, "invalid %s value: \"%s\"", + libpq_append_conn_error(conn, "invalid \"%s\" value: \"%s\"", "ssl_max_protocol_version", conn->ssl_max_protocol_version); return false; @@ -1826,7 +1927,7 @@ PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, * to initialize conn->errorMessage to empty. All subsequent steps during * connection initialization will only append to that buffer. */ - conn = makeEmptyPGconn(); + conn = pqMakeEmptyPGconn(); if (conn == NULL) return NULL; @@ -1905,14 +2006,14 @@ PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, /* * Compute derived options */ - if (!connectOptions2(conn)) + if (!pqConnectOptions2(conn)) return conn; /* * Connect to the database */ - if (connectDBStart(conn)) - (void) connectDBComplete(conn); + if (pqConnectDBStart(conn)) + (void) pqConnectDBComplete(conn); return conn; @@ -2067,61 +2168,15 @@ connectFailureMessage(PGconn *conn, int errorno) static int useKeepalives(PGconn *conn) { - char *ep; int val; if (conn->keepalives == NULL) return 1; - val = strtol(conn->keepalives, &ep, 10); - if (*ep) - return -1; - return val != 0 ? 1 : 0; -} - -/* - * Parse and try to interpret "value" as an integer value, and if successful, - * store it in *result, complaining if there is any trailing garbage or an - * overflow. This allows any number of leading and trailing whitespaces. - */ -static bool -parse_int_param(const char *value, int *result, PGconn *conn, - const char *context) -{ - char *end; - long numval; - - Assert(value != NULL); - - *result = 0; - - /* strtol(3) skips leading whitespaces */ - errno = 0; - numval = strtol(value, &end, 10); - - /* - * If no progress was done during the parsing or an error happened, fail. - * This tests properly for overflows of the result. - */ - if (value == end || errno != 0 || numval != (int) numval) - goto error; - - /* - * Skip any trailing whitespace; if anything but whitespace remains before - * the terminating character, fail - */ - while (*end != '\0' && isspace((unsigned char) *end)) - end++; - - if (*end != '\0') - goto error; - *result = numval; - return true; + if (!pqParseIntParam(conn->keepalives, &val, conn, "keepalives")) + return -1; -error: - libpq_append_conn_error(conn, "invalid integer value \"%s\" for connection option \"%s\"", - value, context); - return false; + return val != 0 ? 1 : 0; } #ifndef WIN32 @@ -2136,7 +2191,7 @@ setKeepalivesIdle(PGconn *conn) if (conn->keepalives_idle == NULL) return 1; - if (!parse_int_param(conn->keepalives_idle, &idle, conn, + if (!pqParseIntParam(conn->keepalives_idle, &idle, conn, "keepalives_idle")) return 0; if (idle < 0) @@ -2170,7 +2225,7 @@ setKeepalivesInterval(PGconn *conn) if (conn->keepalives_interval == NULL) return 1; - if (!parse_int_param(conn->keepalives_interval, &interval, conn, + if (!pqParseIntParam(conn->keepalives_interval, &interval, conn, "keepalives_interval")) return 0; if (interval < 0) @@ -2205,7 +2260,7 @@ setKeepalivesCount(PGconn *conn) if (conn->keepalives_count == NULL) return 1; - if (!parse_int_param(conn->keepalives_count, &count, conn, + if (!pqParseIntParam(conn->keepalives_count, &count, conn, "keepalives_count")) return 0; if (count < 0) @@ -2235,8 +2290,8 @@ setKeepalivesCount(PGconn *conn) * * CAUTION: This needs to be signal safe, since it's used by PQcancel. */ -static int -setKeepalivesWin32(pgsocket sock, int idle, int interval) +int +pqSetKeepalivesWin32(pgsocket sock, int idle, int interval) { struct tcp_keepalive ka; DWORD retsize; @@ -2271,15 +2326,15 @@ prepKeepalivesWin32(PGconn *conn) int interval = -1; if (conn->keepalives_idle && - !parse_int_param(conn->keepalives_idle, &idle, conn, + !pqParseIntParam(conn->keepalives_idle, &idle, conn, "keepalives_idle")) return 0; if (conn->keepalives_interval && - !parse_int_param(conn->keepalives_interval, &interval, conn, + !pqParseIntParam(conn->keepalives_interval, &interval, conn, "keepalives_interval")) return 0; - if (!setKeepalivesWin32(conn->sock, idle, interval)) + if (!pqSetKeepalivesWin32(conn->sock, idle, interval)) { libpq_append_conn_error(conn, "%s(%s) failed: error code %d", "WSAIoctl", "SIO_KEEPALIVE_VALS", @@ -2302,7 +2357,7 @@ setTCPUserTimeout(PGconn *conn) if (conn->pgtcp_user_timeout == NULL) return 1; - if (!parse_int_param(conn->pgtcp_user_timeout, &timeout, conn, + if (!pqParseIntParam(conn->pgtcp_user_timeout, &timeout, conn, "tcp_user_timeout")) return 0; @@ -2327,14 +2382,14 @@ setTCPUserTimeout(PGconn *conn) } /* ---------- - * connectDBStart - + * pqConnectDBStart - * Begin the process of making a connection to the backend. * * Returns 1 if successful, 0 if not. * ---------- */ -static int -connectDBStart(PGconn *conn) +int +pqConnectDBStart(PGconn *conn) { if (!conn) return 0; @@ -2363,10 +2418,18 @@ connectDBStart(PGconn *conn) * Set up to try to connect to the first host. (Setting whichhost = -1 is * a bit of a cheat, but PQconnectPoll will advance it to 0 before * anything else looks at it.) + * + * Cancel requests are special though, they should only try one host and + * address, and these fields have already been set up in PQcancelCreate, + * so leave these fields alone for cancel requests. */ - conn->whichhost = -1; - conn->try_next_addr = false; - conn->try_next_host = true; + if (!conn->cancelRequest) + { + conn->whichhost = -1; + conn->try_next_host = true; + conn->try_next_addr = false; + } + conn->status = CONNECTION_NEEDED; /* Also reset the target_server_type state if needed */ @@ -2397,17 +2460,17 @@ connectDBStart(PGconn *conn) /* - * connectDBComplete + * pqConnectDBComplete * * Block and complete a connection. * * Returns 1 on success, 0 on failure. */ -static int -connectDBComplete(PGconn *conn) +int +pqConnectDBComplete(PGconn *conn) { PostgresPollingStatusType flag = PGRES_POLLING_WRITING; - time_t finish_time = ((time_t) -1); + pg_usec_time_t end_time = -1; int timeout = 0; int last_whichhost = -2; /* certainly different from whichhost */ int last_whichaddr = -2; /* certainly different from whichaddr */ @@ -2416,30 +2479,17 @@ connectDBComplete(PGconn *conn) return 0; /* - * Set up a time limit, if connect_timeout isn't zero. + * Set up a time limit, if connect_timeout is greater than zero. */ if (conn->connect_timeout != NULL) { - if (!parse_int_param(conn->connect_timeout, &timeout, conn, + if (!pqParseIntParam(conn->connect_timeout, &timeout, conn, "connect_timeout")) { /* mark the connection as bad to report the parsing failure */ conn->status = CONNECTION_BAD; return 0; } - - if (timeout > 0) - { - /* - * Rounding could cause connection to fail unexpectedly quickly; - * to prevent possibly waiting hardly-at-all, insist on at least - * two seconds. - */ - if (timeout < 2) - timeout = 2; - } - else /* negative means 0 */ - timeout = 0; } for (;;) @@ -2456,7 +2506,7 @@ connectDBComplete(PGconn *conn) (conn->whichhost != last_whichhost || conn->whichaddr != last_whichaddr)) { - finish_time = time(NULL) + timeout; + end_time = PQgetCurrentTimeUSec() + (pg_usec_time_t) timeout * 1000000; last_whichhost = conn->whichhost; last_whichaddr = conn->whichaddr; } @@ -2471,7 +2521,7 @@ connectDBComplete(PGconn *conn) return 1; /* success! */ case PGRES_POLLING_READING: - ret = pqWaitTimed(1, 0, conn, finish_time); + ret = pqWaitTimed(1, 0, conn, end_time); if (ret == -1) { /* hard failure, eg select() problem, aborts everything */ @@ -2481,7 +2531,7 @@ connectDBComplete(PGconn *conn) break; case PGRES_POLLING_WRITING: - ret = pqWaitTimed(0, 1, conn, finish_time); + ret = pqWaitTimed(0, 1, conn, end_time); if (ret == -1) { /* hard failure, eg select() problem, aborts everything */ @@ -2508,7 +2558,10 @@ connectDBComplete(PGconn *conn) /* * Now try to advance the state machine. */ - flag = PQconnectPoll(conn); + if (conn->cancelRequest) + flag = PQcancelPoll((PGcancelConn *) conn); + else + flag = PQconnectPoll(conn); } } @@ -2633,13 +2686,17 @@ PQconnectPoll(PGconn *conn) * Oops, no more hosts. * * If we are trying to connect in "prefer-standby" mode, then drop - * the standby requirement and start over. + * the standby requirement and start over. Don't do this for + * cancel requests though, since we are certain the list of + * servers won't change as the target_server_type option is not + * applicable to those connections. * * Otherwise, an appropriate error message is already set up, so * we just need to set the right status. */ if (conn->target_server_type == SERVER_TYPE_PREFER_STANDBY && - conn->nconnhost > 0) + conn->nconnhost > 0 && + !conn->cancelRequest) { conn->target_server_type = SERVER_TYPE_PREFER_STANDBY_PASS2; conn->whichhost = 0; @@ -2668,7 +2725,7 @@ PQconnectPoll(PGconn *conn) thisport = DEF_PGPORT; else { - if (!parse_int_param(ch->port, &thisport, conn, "port")) + if (!pqParseIntParam(ch->port, &thisport, conn, "port")) goto error_return; if (thisport < 1 || thisport > 65535) @@ -2754,7 +2811,7 @@ PQconnectPoll(PGconn *conn) * combining it with the insertion. * * We don't need to initialize conn->prng_state here, because that - * already happened in connectOptions2. + * already happened in pqConnectOptions2. */ for (int i = 1; i < conn->naddr; i++) { @@ -2781,15 +2838,9 @@ PQconnectPoll(PGconn *conn) */ conn->pversion = PG_PROTOCOL(3, 0); conn->send_appname = true; -#ifdef USE_SSL - /* initialize these values based on SSL mode */ - conn->allow_ssl_try = (conn->sslmode[0] != 'd'); /* "disable" */ - conn->wait_ssl_try = (conn->sslmode[0] == 'a'); /* "allow" */ -#endif -#ifdef ENABLE_GSS - conn->try_gss = (conn->gssencmode[0] != 'd'); /* "disable" */ -#endif - + conn->failed_enc_methods = 0; + conn->current_enc_method = 0; + conn->allowed_enc_methods = 0; reset_connection_state_machine = false; need_new_connection = true; } @@ -2815,6 +2866,43 @@ PQconnectPoll(PGconn *conn) need_new_connection = false; } + /* + * Decide what to do next, if server rejects SSL or GSS negotiation, but + * the connection is still valid. If there are no options left, error out + * with 'msg'. + */ +#define ENCRYPTION_NEGOTIATION_FAILED(msg) \ + do { \ + switch (encryption_negotiation_failed(conn)) \ + { \ + case 0: \ + libpq_append_conn_error(conn, (msg)); \ + goto error_return; \ + case 1: \ + conn->status = CONNECTION_MADE; \ + return PGRES_POLLING_WRITING; \ + case 2: \ + need_new_connection = true; \ + goto keep_going; \ + } \ + } while(0); + + /* + * Decide what to do next, if connection fails. If there are no options + * left, return with an error. The error message has already been written + * to the connection's error buffer. + */ +#define CONNECTION_FAILED() \ + do { \ + if (connection_failed(conn)) \ + { \ + need_new_connection = true; \ + goto keep_going; \ + } \ + else \ + goto error_return; \ + } while(0); + /* Now try to advance the state machine for this connection */ switch (conn->status) { @@ -2847,6 +2935,43 @@ PQconnectPoll(PGconn *conn) /* Remember current address for possible use later */ memcpy(&conn->raddr, &addr_cur->addr, sizeof(SockAddr)); +#ifdef ENABLE_GSS + + /* + * Before establishing the connection, check if it's + * doomed to fail because gssencmode='require' but GSSAPI + * is not available. + */ + if (conn->gssencmode[0] == 'r') + { + if (conn->raddr.addr.ss_family == AF_UNIX) + { + libpq_append_conn_error(conn, + "GSSAPI encryption required but it is not supported over a local socket"); + goto error_return; + } + if (conn->gcred == GSS_C_NO_CREDENTIAL) + { + if (!pg_GSS_have_cred_cache(&conn->gcred)) + { + libpq_append_conn_error(conn, + "GSSAPI encryption required but no credential cache"); + goto error_return; + } + } + } +#endif + + /* + * Choose the encryption method to try first. Do this + * before establishing the connection, so that if none of + * the modes allowed by the connections options are + * available, we can error out before establishing the + * connection. + */ + if (!init_allowed_encryption_methods(conn)) + goto error_return; + /* * Set connip, too. Note we purposely ignore strdup * failure; not a big problem if it fails. @@ -2958,7 +3083,7 @@ PQconnectPoll(PGconn *conn) if (usekeepalives < 0) { - libpq_append_conn_error(conn, "keepalives parameter must be an integer"); + /* error is already reported */ err = 1; } else if (usekeepalives == 0) @@ -3129,18 +3254,6 @@ PQconnectPoll(PGconn *conn) goto error_return; } - /* - * Make sure we can write before advancing to next step. - */ - conn->status = CONNECTION_MADE; - return PGRES_POLLING_WRITING; - } - - case CONNECTION_MADE: - { - char *startpacket; - int packetlen; - /* * Implement requirepeer check, if requested and it's a * Unix-domain socket. @@ -3189,30 +3302,27 @@ PQconnectPoll(PGconn *conn) #endif /* WIN32 */ } - if (conn->raddr.addr.ss_family == AF_UNIX) - { - /* Don't request SSL or GSSAPI over Unix sockets */ -#ifdef USE_SSL - conn->allow_ssl_try = false; -#endif -#ifdef ENABLE_GSS - conn->try_gss = false; -#endif - } + /* + * Make sure we can write before advancing to next step. + */ + conn->status = CONNECTION_MADE; + return PGRES_POLLING_WRITING; + } + + case CONNECTION_MADE: + { + char *startpacket; + int packetlen; #ifdef ENABLE_GSS /* - * If GSSAPI encryption is enabled, then call - * pg_GSS_have_cred_cache() which will return true if we can - * acquire credentials (and give us a handle to use in - * conn->gcred), and then send a packet to the server asking - * for GSSAPI Encryption (and skip past SSL negotiation and - * regular startup below). + * If GSSAPI encryption is enabled, send a packet to the + * server asking for GSSAPI Encryption and proceed with GSSAPI + * handshake. We will come back here after GSSAPI encryption + * has been established, with conn->gctx set. */ - if (conn->try_gss && !conn->gctx) - conn->try_gss = pg_GSS_have_cred_cache(&conn->gcred); - if (conn->try_gss && !conn->gctx) + if (conn->current_enc_method == ENC_GSSAPI && !conn->gctx) { ProtocolVersion pv = pg_hton32(NEGOTIATE_GSS_CODE); @@ -3227,12 +3337,6 @@ PQconnectPoll(PGconn *conn) conn->status = CONNECTION_GSS_STARTUP; return PGRES_POLLING_READING; } - else if (!conn->gctx && conn->gssencmode[0] == 'r') - { - libpq_append_conn_error(conn, - "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)"); - goto error_return; - } #endif #ifdef USE_SSL @@ -3248,42 +3352,77 @@ PQconnectPoll(PGconn *conn) goto error_return; /* - * If SSL is enabled and we haven't already got encryption of - * some sort running, request SSL instead of sending the - * startup message. + * If SSL is enabled, start the SSL negotiation. We will come + * back here after SSL encryption has been established, with + * ssl_in_use set. */ - if (conn->allow_ssl_try && !conn->wait_ssl_try && - !conn->ssl_in_use -#ifdef ENABLE_GSS - && !conn->gssenc -#endif - ) + if (conn->current_enc_method == ENC_SSL && !conn->ssl_in_use) { - ProtocolVersion pv; - /* - * Send the SSL request packet. - * - * Theoretically, this could block, but it really - * shouldn't since we only got here if the socket is - * write-ready. + * If traditional postgres SSL negotiation is used, send + * the SSL request. In direct negotiation, jump straight + * into the SSL handshake. */ - pv = pg_hton32(NEGOTIATE_SSL_CODE); - if (pqPacketSend(conn, 0, &pv, sizeof(pv)) != STATUS_OK) + if (conn->sslnegotiation[0] == 'p') + { + ProtocolVersion pv; + + /* + * Send the SSL request packet. + * + * Theoretically, this could block, but it really + * shouldn't since we only got here if the socket is + * write-ready. + */ + pv = pg_hton32(NEGOTIATE_SSL_CODE); + if (pqPacketSend(conn, 0, &pv, sizeof(pv)) != STATUS_OK) + { + libpq_append_conn_error(conn, "could not send SSL negotiation packet: %s", + SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf))); + goto error_return; + } + /* Ok, wait for response */ + conn->status = CONNECTION_SSL_STARTUP; + return PGRES_POLLING_READING; + } + else + { + Assert(conn->sslnegotiation[0] == 'd'); + conn->status = CONNECTION_SSL_STARTUP; + return PGRES_POLLING_WRITING; + } + } +#endif /* USE_SSL */ + + /* + * For cancel requests this is as far as we need to go in the + * connection establishment. Now we can actually send our + * cancellation request. + */ + if (conn->cancelRequest) + { + CancelRequestPacket cancelpacket; + + packetlen = sizeof(cancelpacket); + cancelpacket.cancelRequestCode = (MsgType) pg_hton32(CANCEL_REQUEST_CODE); + cancelpacket.backendPID = pg_hton32(conn->be_pid); + cancelpacket.cancelAuthCode = pg_hton32(conn->be_key); + if (pqPacketSend(conn, 0, &cancelpacket, packetlen) != STATUS_OK) { - libpq_append_conn_error(conn, "could not send SSL negotiation packet: %s", + libpq_append_conn_error(conn, "could not send cancel packet: %s", SOCK_STRERROR(SOCK_ERRNO, sebuf, sizeof(sebuf))); goto error_return; } - /* Ok, wait for response */ - conn->status = CONNECTION_SSL_STARTUP; + conn->status = CONNECTION_AWAITING_RESPONSE; return PGRES_POLLING_READING; } -#endif /* USE_SSL */ /* - * Build the startup packet. + * We have now established encryption, or we are happy to + * proceed without. */ + + /* Build the startup packet. */ startpacket = pqBuildStartupPacket3(conn, &packetlen, EnvironmentOptions); if (!startpacket) @@ -3322,10 +3461,11 @@ PQconnectPoll(PGconn *conn) PostgresPollingStatusType pollres; /* - * On first time through, get the postmaster's response to our - * SSL negotiation packet. + * On first time through with traditional SSL negotiation, get + * the postmaster's response to our SSLRequest packet. With + * sslnegotiation='direct', go straight to initiating SSL. */ - if (!conn->ssl_in_use) + if (!conn->ssl_in_use && conn->sslnegotiation[0] == 'p') { /* * We use pqReadData here since it has the logic to @@ -3355,49 +3495,29 @@ PQconnectPoll(PGconn *conn) { /* mark byte consumed */ conn->inStart = conn->inCursor; - - /* - * Set up global SSL state if required. The crypto - * state has already been set if libpq took care of - * doing that, so there is no need to make that happen - * again. - */ - if (pqsecure_initialize(conn, true, false) != 0) - goto error_return; } else if (SSLok == 'N') { /* mark byte consumed */ conn->inStart = conn->inCursor; - /* OK to do without SSL? */ - if (conn->sslmode[0] == 'r' || /* "require" */ - conn->sslmode[0] == 'v') /* "verify-ca" or - * "verify-full" */ - { - /* Require SSL, but server does not want it */ - libpq_append_conn_error(conn, "server does not support SSL, but SSL was required"); - goto error_return; - } - /* Otherwise, proceed with normal startup */ - conn->allow_ssl_try = false; - /* We can proceed using this connection */ - conn->status = CONNECTION_MADE; - return PGRES_POLLING_WRITING; + + /* + * The connection is still valid, so if it's OK to + * continue without SSL, we can proceed using this + * connection. Otherwise return with an error. + */ + ENCRYPTION_NEGOTIATION_FAILED(libpq_gettext("server does not support SSL, but SSL was required")); } else if (SSLok == 'E') { /* * Server failure of some sort, such as failure to - * fork a backend process. We need to process and - * report the error message, which might be formatted - * according to either protocol 2 or protocol 3. - * Rather than duplicate the code for that, we flip - * into AWAITING_RESPONSE state and let the code there - * deal with it. Note we have *not* consumed the "E" - * byte here. + * fork a backend process. Don't bother retrieving + * the error message; we should not trust it as the + * server has not been authenticated yet. */ - conn->status = CONNECTION_AWAITING_RESPONSE; - goto keep_going; + libpq_append_conn_error(conn, "server sent an error response during SSL exchange"); + goto error_return; } else { @@ -3407,6 +3527,14 @@ PQconnectPoll(PGconn *conn) } } + /* + * Set up global SSL state if required. The crypto state has + * already been set if libpq took care of doing that, so there + * is no need to make that happen again. + */ + if (pqsecure_initialize(conn, true, false) != 0) + goto error_return; + /* * Begin or continue the SSL negotiation process. */ @@ -3432,20 +3560,10 @@ PQconnectPoll(PGconn *conn) if (pollres == PGRES_POLLING_FAILED) { /* - * Failed ... if sslmode is "prefer" then do a non-SSL - * retry + * SSL handshake failed. We will retry with a plaintext + * connection, if permitted by sslmode. */ - if (conn->sslmode[0] == 'p' /* "prefer" */ - && conn->allow_ssl_try /* redundant? */ - && !conn->wait_ssl_try) /* redundant? */ - { - /* only retry once */ - conn->allow_ssl_try = false; - need_new_connection = true; - goto keep_going; - } - /* Else it's a hard failure */ - goto error_return; + CONNECTION_FAILED(); } /* Else, return POLLING_READING or POLLING_WRITING status */ return pollres; @@ -3464,7 +3582,7 @@ PQconnectPoll(PGconn *conn) * If we haven't yet, get the postmaster's response to our * negotiation packet */ - if (conn->try_gss && !conn->gctx) + if (!conn->gctx) { char gss_ok; int rdresult = pqReadData(conn); @@ -3482,15 +3600,20 @@ PQconnectPoll(PGconn *conn) if (gss_ok == 'E') { /* - * Server failure of some sort. Assume it's a - * protocol version support failure, and let's see if - * we can't recover (if it's not, we'll get a better - * error message on retry). Server gets fussy if we - * don't hang up the socket, though. + * Server failure of some sort, possibly protocol + * version support failure. Don't bother retrieving + * the error message; we should not trust it anyway as + * the server has not authenticated yet. + * + * Note that unlike on an error response to + * SSLRequest, we allow falling back to SSL or + * plaintext connection here. GSS support was + * introduced in PostgreSQL version 12, so an error + * response might mean that we are connecting to a + * pre-v12 server. */ - conn->try_gss = false; - need_new_connection = true; - goto keep_going; + libpq_append_conn_error(conn, "server sent an error response during GSS encryption exchange"); + CONNECTION_FAILED(); } /* mark byte consumed */ @@ -3498,17 +3621,12 @@ PQconnectPoll(PGconn *conn) if (gss_ok == 'N') { - /* Server doesn't want GSSAPI; fall back if we can */ - if (conn->gssencmode[0] == 'r') - { - libpq_append_conn_error(conn, "server doesn't support GSSAPI encryption, but it was required"); - goto error_return; - } - - conn->try_gss = false; - /* We can proceed using this connection */ - conn->status = CONNECTION_MADE; - return PGRES_POLLING_WRITING; + /* + * The connection is still valid, so if it's OK to + * continue without GSS, we can proceed using this + * connection. Otherwise return with an error. + */ + ENCRYPTION_NEGOTIATION_FAILED(libpq_gettext("server doesn't support GSSAPI encryption, but it was required")); } else if (gss_ok != 'G') { @@ -3540,18 +3658,11 @@ PQconnectPoll(PGconn *conn) } else if (pollres == PGRES_POLLING_FAILED) { - if (conn->gssencmode[0] == 'p') - { - /* - * We failed, but we can retry on "prefer". Have to - * drop the current connection to do so, though. - */ - conn->try_gss = false; - need_new_connection = true; - goto keep_going; - } - /* Else it's a hard failure */ - goto error_return; + /* + * GSS handshake failed. We will retry with an SSL or + * plaintext connection, if permitted by the options. + */ + CONNECTION_FAILED(); } /* Else, return POLLING_READING or POLLING_WRITING status */ return pollres; @@ -3593,7 +3704,9 @@ PQconnectPoll(PGconn *conn) * Anything else probably means it's not Postgres on the other * end at all. */ - if (!(beresp == 'R' || beresp == 'v' || beresp == 'E')) + if (beresp != PqMsg_AuthenticationRequest && + beresp != PqMsg_ErrorResponse && + beresp != PqMsg_NegotiateProtocolVersion) { libpq_append_conn_error(conn, "expected authentication request from server, but received %c", beresp); @@ -3620,19 +3733,22 @@ PQconnectPoll(PGconn *conn) * version 14, the server also used the old protocol for * errors that happened before processing the startup packet.) */ - if (beresp == 'R' && (msgLength < 8 || msgLength > 2000)) + if (beresp == PqMsg_AuthenticationRequest && + (msgLength < 8 || msgLength > 2000)) { libpq_append_conn_error(conn, "received invalid authentication request"); goto error_return; } - if (beresp == 'v' && (msgLength < 8 || msgLength > 2000)) + if (beresp == PqMsg_NegotiateProtocolVersion && + (msgLength < 8 || msgLength > 2000)) { libpq_append_conn_error(conn, "received invalid protocol negotiation message"); goto error_return; } #define MAX_ERRLEN 30000 - if (beresp == 'E' && (msgLength < 8 || msgLength > MAX_ERRLEN)) + if (beresp == PqMsg_ErrorResponse && + (msgLength < 8 || msgLength > MAX_ERRLEN)) { /* Handle error from a pre-3.0 server */ conn->inCursor = conn->inStart + 1; /* reread data */ @@ -3695,7 +3811,7 @@ PQconnectPoll(PGconn *conn) } /* Handle errors. */ - if (beresp == 'E') + if (beresp == PqMsg_ErrorResponse) { if (pqGetErrorNotice3(conn, true)) { @@ -3722,57 +3838,9 @@ PQconnectPoll(PGconn *conn) /* Check to see if we should mention pgpassfile */ pgpassfileWarning(conn); -#ifdef ENABLE_GSS - - /* - * If gssencmode is "prefer" and we're using GSSAPI, retry - * without it. - */ - if (conn->gssenc && conn->gssencmode[0] == 'p') - { - /* only retry once */ - conn->try_gss = false; - need_new_connection = true; - goto keep_going; - } -#endif - -#ifdef USE_SSL - - /* - * if sslmode is "allow" and we haven't tried an SSL - * connection already, then retry with an SSL connection - */ - if (conn->sslmode[0] == 'a' /* "allow" */ - && !conn->ssl_in_use - && conn->allow_ssl_try - && conn->wait_ssl_try) - { - /* only retry once */ - conn->wait_ssl_try = false; - need_new_connection = true; - goto keep_going; - } - - /* - * if sslmode is "prefer" and we're in an SSL connection, - * then do a non-SSL retry - */ - if (conn->sslmode[0] == 'p' /* "prefer" */ - && conn->ssl_in_use - && conn->allow_ssl_try /* redundant? */ - && !conn->wait_ssl_try) /* redundant? */ - { - /* only retry once */ - conn->allow_ssl_try = false; - need_new_connection = true; - goto keep_going; - } -#endif - - goto error_return; + CONNECTION_FAILED(); } - else if (beresp == 'v') + else if (beresp == PqMsg_NegotiateProtocolVersion) { if (pqGetNegotiateProtocolVersion3(conn)) { @@ -4025,8 +4093,14 @@ PQconnectPoll(PGconn *conn) } } - /* We can release the address list now. */ - release_conn_addrinfo(conn); + /* + * For non cancel requests we can release the address list + * now. For cancel requests we never actually resolve + * addresses and instead the addrinfo exists for the lifetime + * of the connection. + */ + if (!conn->cancelRequest) + release_conn_addrinfo(conn); /* * Contents of conn->errorMessage are no longer interesting @@ -4210,6 +4284,182 @@ PQconnectPoll(PGconn *conn) return PGRES_POLLING_FAILED; } +/* + * Initialize the state machine for negotiating encryption + */ +static bool +init_allowed_encryption_methods(PGconn *conn) +{ + if (conn->raddr.addr.ss_family == AF_UNIX) + { + /* Don't request SSL or GSSAPI over Unix sockets */ + conn->allowed_enc_methods &= ~(ENC_SSL | ENC_GSSAPI); + + /* + * XXX: we probably should not do this. sslmode=require works + * differently + */ + if (conn->gssencmode[0] == 'r') + { + libpq_append_conn_error(conn, + "GSSAPI encryption required but it is not supported over a local socket"); + conn->allowed_enc_methods = 0; + conn->current_enc_method = ENC_ERROR; + return false; + } + + conn->allowed_enc_methods = ENC_PLAINTEXT; + conn->current_enc_method = ENC_PLAINTEXT; + return true; + } + + /* initialize based on sslmode and gssencmode */ + conn->allowed_enc_methods = 0; + +#ifdef USE_SSL + /* sslmode anything but 'disable', and GSSAPI not required */ + if (conn->sslmode[0] != 'd' && conn->gssencmode[0] != 'r') + { + conn->allowed_enc_methods |= ENC_SSL; + } +#endif + +#ifdef ENABLE_GSS + if (conn->gssencmode[0] != 'd') + conn->allowed_enc_methods |= ENC_GSSAPI; +#endif + + if ((conn->sslmode[0] == 'd' || conn->sslmode[0] == 'p' || conn->sslmode[0] == 'a') && + (conn->gssencmode[0] == 'd' || conn->gssencmode[0] == 'p')) + { + conn->allowed_enc_methods |= ENC_PLAINTEXT; + } + + return select_next_encryption_method(conn, false); +} + +/* + * Out-of-line portion of the ENCRYPTION_NEGOTIATION_FAILED() macro in the + * PQconnectPoll state machine. + * + * Return value: + * 0: connection failed and we are out of encryption methods to try. return an error + * 1: Retry with next connection method. The TCP connection is still valid and in + * known state, so we can proceed with the negotiating next method without + * reconnecting. + * 2: Disconnect, and retry with next connection method. + * + * conn->current_enc_method is updated to the next method to try. + */ +#if defined(USE_SSL) || defined(ENABLE_GSS) +static int +encryption_negotiation_failed(PGconn *conn) +{ + Assert((conn->failed_enc_methods & conn->current_enc_method) == 0); + conn->failed_enc_methods |= conn->current_enc_method; + + if (select_next_encryption_method(conn, true)) + { + /* An existing connection cannot be reused for direct SSL */ + if (conn->current_enc_method == ENC_SSL && conn->sslnegotiation[0] == 'd') + return 2; + else + return 1; + } + else + return 0; +} +#endif + +/* + * Out-of-line portion of the CONNECTION_FAILED() macro + * + * Returns true, if we should reconnect and retry with a different encryption + * method. conn->current_enc_method is updated to the next method to try. + */ +static bool +connection_failed(PGconn *conn) +{ + Assert((conn->failed_enc_methods & conn->current_enc_method) == 0); + conn->failed_enc_methods |= conn->current_enc_method; + + return select_next_encryption_method(conn, false); +} + +/* + * Choose the next encryption method to try. If this is a retry, + * conn->failed_enc_methods has already been updated. The function sets + * conn->current_enc_method to the next method to try. Returns false if no + * encryption methods remain. + */ +static bool +select_next_encryption_method(PGconn *conn, bool have_valid_connection) +{ + int remaining_methods; + +#define SELECT_NEXT_METHOD(method) \ + do { \ + if ((remaining_methods & method) != 0) \ + { \ + conn->current_enc_method = method; \ + return true; \ + } \ + } while (false) + + remaining_methods = conn->allowed_enc_methods & ~conn->failed_enc_methods; + + /* + * Try GSSAPI before SSL + */ +#ifdef ENABLE_GSS + if ((remaining_methods & ENC_GSSAPI) != 0) + { + /* + * If GSSAPI encryption is enabled, then call pg_GSS_have_cred_cache() + * which will return true if we can acquire credentials (and give us a + * handle to use in conn->gcred), and then send a packet to the server + * asking for GSSAPI Encryption (and skip past SSL negotiation and + * regular startup below). + */ + if (!conn->gctx) + { + if (!pg_GSS_have_cred_cache(&conn->gcred)) + { + conn->allowed_enc_methods &= ~ENC_GSSAPI; + remaining_methods &= ~ENC_GSSAPI; + + if (conn->gssencmode[0] == 'r') + { + libpq_append_conn_error(conn, + "GSSAPI encryption required but no credential cache"); + } + } + } + } + + SELECT_NEXT_METHOD(ENC_GSSAPI); +#endif + + /* + * The order between SSL encryption and plaintext depends on sslmode. With + * sslmode=allow, try plaintext connection before SSL. With + * sslmode=prefer, it's the other way round. With other modes, we only try + * plaintext or SSL connections so the order they're listed here doesn't + * matter. + */ + if (conn->sslmode[0] == 'a') + SELECT_NEXT_METHOD(ENC_PLAINTEXT); + + SELECT_NEXT_METHOD(ENC_SSL); + + if (conn->sslmode[0] != 'a') + SELECT_NEXT_METHOD(ENC_PLAINTEXT); + + /* No more options */ + conn->current_enc_method = ENC_ERROR; + return false; +#undef SELECT_NEXT_METHOD +} /* * internal_ping @@ -4226,7 +4476,7 @@ internal_ping(PGconn *conn) /* Attempt to complete the connection */ if (conn->status != CONNECTION_BAD) - (void) connectDBComplete(conn); + (void) pqConnectDBComplete(conn); /* Definitely OK if we succeeded */ if (conn->status != CONNECTION_BAD) @@ -4278,11 +4528,11 @@ internal_ping(PGconn *conn) /* - * makeEmptyPGconn + * pqMakeEmptyPGconn * - create a PGconn data structure with (as yet) no interesting data */ -static PGconn * -makeEmptyPGconn(void) +PGconn * +pqMakeEmptyPGconn(void) { PGconn *conn; @@ -4375,7 +4625,7 @@ makeEmptyPGconn(void) * freePGconn * - free an idle (closed) PGconn data structure * - * NOTE: this should not overlap any functionality with closePGconn(). + * NOTE: this should not overlap any functionality with pqClosePGconn(). * Clearing/resetting of transient state belongs there; what we do here is * release data that is to be held for the life of the PGconn structure. * If a value ought to be cleared/freed during PQreset(), do it there not here. @@ -4394,19 +4644,8 @@ freePGconn(PGconn *conn) free(conn->events[i].name); } - /* clean up pg_conn_host structures */ - for (int i = 0; i < conn->nconnhost; ++i) - { - free(conn->connhost[i].host); - free(conn->connhost[i].hostaddr); - free(conn->connhost[i].port); - if (conn->connhost[i].password != NULL) - { - explicit_bzero(conn->connhost[i].password, strlen(conn->connhost[i].password)); - free(conn->connhost[i].password); - } - } - free(conn->connhost); + release_conn_addrinfo(conn); + pqReleaseConnHosts(conn); free(conn->client_encoding_initial); free(conn->events); @@ -4433,6 +4672,7 @@ freePGconn(PGconn *conn) free(conn->keepalives_interval); free(conn->keepalives_count); free(conn->sslmode); + free(conn->sslnegotiation); free(conn->sslcert); free(conn->sslkey); if (conn->sslpassword) @@ -4468,6 +4708,31 @@ freePGconn(PGconn *conn) free(conn); } +/* + * pqReleaseConnHosts + * - Free the host list in the PGconn. + */ +void +pqReleaseConnHosts(PGconn *conn) +{ + if (conn->connhost) + { + for (int i = 0; i < conn->nconnhost; ++i) + { + free(conn->connhost[i].host); + free(conn->connhost[i].hostaddr); + free(conn->connhost[i].port); + if (conn->connhost[i].password != NULL) + { + explicit_bzero(conn->connhost[i].password, + strlen(conn->connhost[i].password)); + free(conn->connhost[i].password); + } + } + free(conn->connhost); + } +} + /* * store_conn_addrinfo * - copy addrinfo to PGconn object @@ -4532,6 +4797,13 @@ release_conn_addrinfo(PGconn *conn) static void sendTerminateConn(PGconn *conn) { + /* + * The Postgres cancellation protocol does not have a notion of a + * Terminate message, so don't send one. + */ + if (conn->cancelRequest) + return; + /* * Note that the protocol doesn't allow us to send Terminate messages * during the startup phase. @@ -4542,22 +4814,22 @@ sendTerminateConn(PGconn *conn) * Try to send "close connection" message to backend. Ignore any * error. */ - pqPutMsgStart('X', conn); + pqPutMsgStart(PqMsg_Terminate, conn); pqPutMsgEnd(conn); (void) pqFlush(conn); } } /* - * closePGconn + * pqClosePGconn * - properly close a connection to the backend * * This should reset or release all transient state, but NOT the connection * parameters. On exit, the PGconn should be in condition to start a fresh * connection with the same parameters (see PQreset()). */ -static void -closePGconn(PGconn *conn) +void +pqClosePGconn(PGconn *conn) { /* * If possible, send Terminate message to close the connection politely. @@ -4585,7 +4857,14 @@ closePGconn(PGconn *conn) conn->pipelineStatus = PQ_PIPELINE_OFF; pqClearAsyncResult(conn); /* deallocate result */ pqClearConnErrorState(conn); - release_conn_addrinfo(conn); + + /* + * Release addrinfo, but since cancel requests never change their addrinfo + * we don't do that. Otherwise we would have to rebuild it during a + * PQcancelReset. + */ + if (!conn->cancelRequest) + release_conn_addrinfo(conn); /* Reset all state obtained from server, too */ pqDropServerData(conn); @@ -4600,7 +4879,7 @@ PQfinish(PGconn *conn) { if (conn) { - closePGconn(conn); + pqClosePGconn(conn); freePGconn(conn); } } @@ -4614,9 +4893,9 @@ PQreset(PGconn *conn) { if (conn) { - closePGconn(conn); + pqClosePGconn(conn); - if (connectDBStart(conn) && connectDBComplete(conn)) + if (pqConnectDBStart(conn) && pqConnectDBComplete(conn)) { /* * Notify event procs of successful reset. @@ -4647,9 +4926,9 @@ PQresetStart(PGconn *conn) { if (conn) { - closePGconn(conn); + pqClosePGconn(conn); - return connectDBStart(conn); + return pqConnectDBStart(conn); } return 0; @@ -4691,373 +4970,6 @@ PQresetPoll(PGconn *conn) return PGRES_POLLING_FAILED; } -/* - * PQgetCancel: get a PGcancel structure corresponding to a connection. - * - * A copy is needed to be able to cancel a running query from a different - * thread. If the same structure is used all structure members would have - * to be individually locked (if the entire structure was locked, it would - * be impossible to cancel a synchronous query because the structure would - * have to stay locked for the duration of the query). - */ -PGcancel * -PQgetCancel(PGconn *conn) -{ - PGcancel *cancel; - - if (!conn) - return NULL; - - if (conn->sock == PGINVALID_SOCKET) - return NULL; - - cancel = malloc(sizeof(PGcancel)); - if (cancel == NULL) - return NULL; - - memcpy(&cancel->raddr, &conn->raddr, sizeof(SockAddr)); - cancel->be_pid = conn->be_pid; - cancel->be_key = conn->be_key; - /* We use -1 to indicate an unset connection option */ - cancel->pgtcp_user_timeout = -1; - cancel->keepalives = -1; - cancel->keepalives_idle = -1; - cancel->keepalives_interval = -1; - cancel->keepalives_count = -1; - if (conn->pgtcp_user_timeout != NULL) - { - if (!parse_int_param(conn->pgtcp_user_timeout, - &cancel->pgtcp_user_timeout, - conn, "tcp_user_timeout")) - goto fail; - } - if (conn->keepalives != NULL) - { - if (!parse_int_param(conn->keepalives, - &cancel->keepalives, - conn, "keepalives")) - goto fail; - } - if (conn->keepalives_idle != NULL) - { - if (!parse_int_param(conn->keepalives_idle, - &cancel->keepalives_idle, - conn, "keepalives_idle")) - goto fail; - } - if (conn->keepalives_interval != NULL) - { - if (!parse_int_param(conn->keepalives_interval, - &cancel->keepalives_interval, - conn, "keepalives_interval")) - goto fail; - } - if (conn->keepalives_count != NULL) - { - if (!parse_int_param(conn->keepalives_count, - &cancel->keepalives_count, - conn, "keepalives_count")) - goto fail; - } - - return cancel; - -fail: - free(cancel); - return NULL; -} - -/* PQfreeCancel: free a cancel structure */ -void -PQfreeCancel(PGcancel *cancel) -{ - free(cancel); -} - - -/* - * Sets an integer socket option on a TCP socket, if the provided value is - * not negative. Returns false if setsockopt fails for some reason. - * - * CAUTION: This needs to be signal safe, since it's used by PQcancel. - */ -#if defined(TCP_USER_TIMEOUT) || !defined(WIN32) -static bool -optional_setsockopt(int fd, int protoid, int optid, int value) -{ - if (value < 0) - return true; - if (setsockopt(fd, protoid, optid, (char *) &value, sizeof(value)) < 0) - return false; - return true; -} -#endif - - -/* - * PQcancel: request query cancel - * - * The return value is true if the cancel request was successfully - * dispatched, false if not (in which case an error message is available). - * Note: successful dispatch is no guarantee that there will be any effect at - * the backend. The application must read the operation result as usual. - * - * On failure, an error message is stored in *errbuf, which must be of size - * errbufsize (recommended size is 256 bytes). *errbuf is not changed on - * success return. - * - * CAUTION: we want this routine to be safely callable from a signal handler - * (for example, an application might want to call it in a SIGINT handler). - * This means we cannot use any C library routine that might be non-reentrant. - * malloc/free are often non-reentrant, and anything that might call them is - * just as dangerous. We avoid sprintf here for that reason. Building up - * error messages with strcpy/strcat is tedious but should be quite safe. - * We also save/restore errno in case the signal handler support doesn't. - */ -int -PQcancel(PGcancel *cancel, char *errbuf, int errbufsize) -{ - int save_errno = SOCK_ERRNO; - pgsocket tmpsock = PGINVALID_SOCKET; - int maxlen; - struct - { - uint32 packetlen; - CancelRequestPacket cp; - } crp; - - if (!cancel) - { - strlcpy(errbuf, "PQcancel() -- no cancel object supplied", errbufsize); - /* strlcpy probably doesn't change errno, but be paranoid */ - SOCK_ERRNO_SET(save_errno); - return false; - } - - /* - * We need to open a temporary connection to the postmaster. Do this with - * only kernel calls. - */ - if ((tmpsock = socket(cancel->raddr.addr.ss_family, SOCK_STREAM, 0)) == PGINVALID_SOCKET) - { - strlcpy(errbuf, "PQcancel() -- socket() failed: ", errbufsize); - goto cancel_errReturn; - } - - /* - * Since this connection will only be used to send a single packet of - * data, we don't need NODELAY. We also don't set the socket to - * nonblocking mode, because the API definition of PQcancel requires the - * cancel to be sent in a blocking way. - * - * We do set socket options related to keepalives and other TCP timeouts. - * This ensures that this function does not block indefinitely when - * reasonable keepalive and timeout settings have been provided. - */ - if (cancel->raddr.addr.ss_family != AF_UNIX && - cancel->keepalives != 0) - { -#ifndef WIN32 - if (!optional_setsockopt(tmpsock, SOL_SOCKET, SO_KEEPALIVE, 1)) - { - strlcpy(errbuf, "PQcancel() -- setsockopt(SO_KEEPALIVE) failed: ", errbufsize); - goto cancel_errReturn; - } - -#ifdef PG_TCP_KEEPALIVE_IDLE - if (!optional_setsockopt(tmpsock, IPPROTO_TCP, PG_TCP_KEEPALIVE_IDLE, - cancel->keepalives_idle)) - { - strlcpy(errbuf, "PQcancel() -- setsockopt(" PG_TCP_KEEPALIVE_IDLE_STR ") failed: ", errbufsize); - goto cancel_errReturn; - } -#endif - -#ifdef TCP_KEEPINTVL - if (!optional_setsockopt(tmpsock, IPPROTO_TCP, TCP_KEEPINTVL, - cancel->keepalives_interval)) - { - strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_KEEPINTVL) failed: ", errbufsize); - goto cancel_errReturn; - } -#endif - -#ifdef TCP_KEEPCNT - if (!optional_setsockopt(tmpsock, IPPROTO_TCP, TCP_KEEPCNT, - cancel->keepalives_count)) - { - strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_KEEPCNT) failed: ", errbufsize); - goto cancel_errReturn; - } -#endif - -#else /* WIN32 */ - -#ifdef SIO_KEEPALIVE_VALS - if (!setKeepalivesWin32(tmpsock, - cancel->keepalives_idle, - cancel->keepalives_interval)) - { - strlcpy(errbuf, "PQcancel() -- WSAIoctl(SIO_KEEPALIVE_VALS) failed: ", errbufsize); - goto cancel_errReturn; - } -#endif /* SIO_KEEPALIVE_VALS */ -#endif /* WIN32 */ - - /* TCP_USER_TIMEOUT works the same way on Unix and Windows */ -#ifdef TCP_USER_TIMEOUT - if (!optional_setsockopt(tmpsock, IPPROTO_TCP, TCP_USER_TIMEOUT, - cancel->pgtcp_user_timeout)) - { - strlcpy(errbuf, "PQcancel() -- setsockopt(TCP_USER_TIMEOUT) failed: ", errbufsize); - goto cancel_errReturn; - } -#endif - } - -retry3: - if (connect(tmpsock, (struct sockaddr *) &cancel->raddr.addr, - cancel->raddr.salen) < 0) - { - if (SOCK_ERRNO == EINTR) - /* Interrupted system call - we'll just try again */ - goto retry3; - strlcpy(errbuf, "PQcancel() -- connect() failed: ", errbufsize); - goto cancel_errReturn; - } - - /* Create and send the cancel request packet. */ - - crp.packetlen = pg_hton32((uint32) sizeof(crp)); - crp.cp.cancelRequestCode = (MsgType) pg_hton32(CANCEL_REQUEST_CODE); - crp.cp.backendPID = pg_hton32(cancel->be_pid); - crp.cp.cancelAuthCode = pg_hton32(cancel->be_key); - -retry4: - if (send(tmpsock, (char *) &crp, sizeof(crp), 0) != (int) sizeof(crp)) - { - if (SOCK_ERRNO == EINTR) - /* Interrupted system call - we'll just try again */ - goto retry4; - strlcpy(errbuf, "PQcancel() -- send() failed: ", errbufsize); - goto cancel_errReturn; - } - - /* - * Wait for the postmaster to close the connection, which indicates that - * it's processed the request. Without this delay, we might issue another - * command only to find that our cancel zaps that command instead of the - * one we thought we were canceling. Note we don't actually expect this - * read to obtain any data, we are just waiting for EOF to be signaled. - */ -retry5: - if (recv(tmpsock, (char *) &crp, 1, 0) < 0) - { - if (SOCK_ERRNO == EINTR) - /* Interrupted system call - we'll just try again */ - goto retry5; - /* we ignore other error conditions */ - } - - /* All done */ - closesocket(tmpsock); - SOCK_ERRNO_SET(save_errno); - return true; - -cancel_errReturn: - - /* - * Make sure we don't overflow the error buffer. Leave space for the \n at - * the end, and for the terminating zero. - */ - maxlen = errbufsize - strlen(errbuf) - 2; - if (maxlen >= 0) - { - /* - * We can't invoke strerror here, since it's not signal-safe. Settle - * for printing the decimal value of errno. Even that has to be done - * the hard way. - */ - int val = SOCK_ERRNO; - char buf[32]; - char *bufp; - - bufp = buf + sizeof(buf) - 1; - *bufp = '\0'; - do - { - *(--bufp) = (val % 10) + '0'; - val /= 10; - } while (val > 0); - bufp -= 6; - memcpy(bufp, "error ", 6); - strncat(errbuf, bufp, maxlen); - strcat(errbuf, "\n"); - } - if (tmpsock != PGINVALID_SOCKET) - closesocket(tmpsock); - SOCK_ERRNO_SET(save_errno); - return false; -} - - -/* - * PQrequestCancel: old, not thread-safe function for requesting query cancel - * - * Returns true if able to send the cancel request, false if not. - * - * On failure, the error message is saved in conn->errorMessage; this means - * that this can't be used when there might be other active operations on - * the connection object. - * - * NOTE: error messages will be cut off at the current size of the - * error message buffer, since we dare not try to expand conn->errorMessage! - */ -int -PQrequestCancel(PGconn *conn) -{ - int r; - PGcancel *cancel; - - /* Check we have an open connection */ - if (!conn) - return false; - - if (conn->sock == PGINVALID_SOCKET) - { - strlcpy(conn->errorMessage.data, - "PQrequestCancel() -- connection is not open\n", - conn->errorMessage.maxlen); - conn->errorMessage.len = strlen(conn->errorMessage.data); - conn->errorReported = 0; - - return false; - } - - cancel = PQgetCancel(conn); - if (cancel) - { - r = PQcancel(cancel, conn->errorMessage.data, - conn->errorMessage.maxlen); - PQfreeCancel(cancel); - } - else - { - strlcpy(conn->errorMessage.data, "out of memory", - conn->errorMessage.maxlen); - r = false; - } - - if (!r) - { - conn->errorMessage.len = strlen(conn->errorMessage.data); - conn->errorReported = 0; - } - - return r; -} - - /* * pqPacketSend() -- convenience routine to send a message to server. * @@ -7771,6 +7683,52 @@ pqGetHomeDirectory(char *buf, int bufsize) #endif } +/* + * Parse and try to interpret "value" as an integer value, and if successful, + * store it in *result, complaining if there is any trailing garbage or an + * overflow. This allows any number of leading and trailing whitespaces. + */ +bool +pqParseIntParam(const char *value, int *result, PGconn *conn, + const char *context) +{ + char *end; + long numval; + + Assert(value != NULL); + + *result = 0; + + /* strtol(3) skips leading whitespaces */ + errno = 0; + numval = strtol(value, &end, 10); + + /* + * If no progress was done during the parsing or an error happened, fail. + * This tests properly for overflows of the result. + */ + if (value == end || errno != 0 || numval != (int) numval) + goto error; + + /* + * Skip any trailing whitespace; if anything but whitespace remains before + * the terminating character, fail + */ + while (*end != '\0' && isspace((unsigned char) *end)) + end++; + + if (*end != '\0') + goto error; + + *result = numval; + return true; + +error: + libpq_append_conn_error(conn, "invalid integer value \"%s\" for connection option \"%s\"", + value, context); + return false; +} + /* * To keep the API consistent, the locking stubs are always provided, even * if they are not required. @@ -7784,25 +7742,8 @@ pqGetHomeDirectory(char *buf, int bufsize) static void default_threadlock(int acquire) { -#ifdef ENABLE_THREAD_SAFETY -#ifndef WIN32 static pthread_mutex_t singlethread_lock = PTHREAD_MUTEX_INITIALIZER; -#else - static pthread_mutex_t singlethread_lock = NULL; - static long mutex_initlock = 0; - if (singlethread_lock == NULL) - { - while (InterlockedExchange(&mutex_initlock, 1) == 1) - /* loop, another thread own the lock */ ; - if (singlethread_lock == NULL) - { - if (pthread_mutex_init(&singlethread_lock, NULL)) - Assert(false); - } - InterlockedExchange(&mutex_initlock, 0); - } -#endif if (acquire) { if (pthread_mutex_lock(&singlethread_lock)) @@ -7813,7 +7754,6 @@ default_threadlock(int acquire) if (pthread_mutex_unlock(&singlethread_lock)) Assert(false); } -#endif } pgthreadlock_t diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index 14d706efd57b5..91063b159e676 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -3,7 +3,7 @@ * fe-exec.c * functions related to sending a query down to the backend * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -41,7 +41,8 @@ char *const pgresStatus[] = { "PGRES_COPY_BOTH", "PGRES_SINGLE_TUPLE", "PGRES_PIPELINE_SYNC", - "PGRES_PIPELINE_ABORTED" + "PGRES_PIPELINE_ABORTED", + "PGRES_TUPLES_CHUNK" }; /* We return this if we're unable to make a PGresult at all */ @@ -77,10 +78,11 @@ static void parseInput(PGconn *conn); static PGresult *getCopyResult(PGconn *conn, ExecStatusType copytype); static bool PQexecStart(PGconn *conn); static PGresult *PQexecFinish(PGconn *conn); -static int PQsendDescribe(PGconn *conn, char desc_type, - const char *desc_target); +static int PQsendTypedCommand(PGconn *conn, char command, char type, + const char *target); static int check_field_number(const PGresult *res, int field_num); static void pqPipelineProcessQueue(PGconn *conn); +static int pqPipelineSyncInternal(PGconn *conn, bool immediate_flush); static int pqPipelineFlush(PGconn *conn); @@ -199,6 +201,7 @@ PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status) case PGRES_COPY_IN: case PGRES_COPY_BOTH: case PGRES_SINGLE_TUPLE: + case PGRES_TUPLES_CHUNK: /* non-error cases */ break; default: @@ -770,7 +773,7 @@ PQclear(PGresult *res) /* * Handy subroutine to deallocate any partially constructed async result. * - * Any "next" result gets cleared too. + * Any "saved" result gets cleared too. */ void pqClearAsyncResult(PGconn *conn) @@ -778,8 +781,8 @@ pqClearAsyncResult(PGconn *conn) PQclear(conn->result); conn->result = NULL; conn->error_result = false; - PQclear(conn->next_result); - conn->next_result = NULL; + PQclear(conn->saved_result); + conn->saved_result = NULL; } /* @@ -841,6 +844,8 @@ pqSaveWriteError(PGconn *conn) * using whatever is in conn->errorMessage. In any case, clear the async * result storage, and update our notion of how much error text has been * returned to the application. + * + * Note that in no case (not even OOM) do we return NULL. */ PGresult * pqPrepareAsyncResult(PGconn *conn) @@ -908,14 +913,14 @@ pqPrepareAsyncResult(PGconn *conn) } /* - * Replace conn->result with next_result, if any. In the normal case - * there isn't a next result and we're just dropping ownership of the - * current result. In single-row mode this restores the situation to what - * it was before we created the current single-row result. + * Replace conn->result with saved_result, if any. In the normal case + * there isn't a saved result and we're just dropping ownership of the + * current result. In partial-result mode this restores the situation to + * what it was before we created the current partial result. */ - conn->result = conn->next_result; - conn->error_result = false; /* next_result is never an error */ - conn->next_result = NULL; + conn->result = conn->saved_result; + conn->error_result = false; /* saved_result is never an error */ + conn->saved_result = NULL; return res; } @@ -1196,11 +1201,6 @@ pqSaveParameterStatus(PGconn *conn, const char *name, const char *value) * On error, *errmsgp can be set to an error string to be returned. * (Such a string should already be translated via libpq_gettext().) * If it is left NULL, the error is presumed to be "out of memory". - * - * In single-row mode, we create a new result holding just the current row, - * stashing the previous result in conn->next_result so that it becomes - * active again after pqPrepareAsyncResult(). This allows the result metadata - * (column descriptions) to be carried forward to each result row. */ int pqRowProcessor(PGconn *conn, const char **errmsgp) @@ -1212,11 +1212,14 @@ pqRowProcessor(PGconn *conn, const char **errmsgp) int i; /* - * In single-row mode, make a new PGresult that will hold just this one - * row; the original conn->result is left unchanged so that it can be used - * again as the template for future rows. + * In partial-result mode, if we don't already have a partial PGresult + * then make one by cloning conn->result (which should hold the correct + * result metadata by now). Then the original conn->result is moved over + * to saved_result so that we can re-use it as a reference for future + * partial results. The saved result will become active again after + * pqPrepareAsyncResult() returns the partial result to the application. */ - if (conn->singleRowMode) + if (conn->partialResMode && conn->saved_result == NULL) { /* Copy everything that should be in the result at this point */ res = PQcopyResult(res, @@ -1224,6 +1227,11 @@ pqRowProcessor(PGconn *conn, const char **errmsgp) PG_COPYRES_NOTICEHOOKS); if (!res) return 0; + /* Change result status to appropriate special value */ + res->resultStatus = (conn->singleRowMode ? PGRES_SINGLE_TUPLE : PGRES_TUPLES_CHUNK); + /* And stash it as the active result */ + conn->saved_result = conn->result; + conn->result = res; } /* @@ -1238,7 +1246,7 @@ pqRowProcessor(PGconn *conn, const char **errmsgp) tup = (PGresAttValue *) pqResultAlloc(res, nfields * sizeof(PGresAttValue), true); if (tup == NULL) - goto fail; + return 0; for (i = 0; i < nfields; i++) { @@ -1257,7 +1265,7 @@ pqRowProcessor(PGconn *conn, const char **errmsgp) val = (char *) pqResultAlloc(res, clen + 1, isbinary); if (val == NULL) - goto fail; + return 0; /* copy and zero-terminate the data (even if it's binary) */ memcpy(val, columns[i].value, clen); @@ -1270,30 +1278,16 @@ pqRowProcessor(PGconn *conn, const char **errmsgp) /* And add the tuple to the PGresult's tuple array */ if (!pqAddTuple(res, tup, errmsgp)) - goto fail; + return 0; /* - * Success. In single-row mode, make the result available to the client - * immediately. + * Success. In partial-result mode, if we have enough rows then make the + * result available to the client immediately. */ - if (conn->singleRowMode) - { - /* Change result status to special single-row value */ - res->resultStatus = PGRES_SINGLE_TUPLE; - /* Stash old result for re-use later */ - conn->next_result = conn->result; - conn->result = res; - /* And mark the result ready to return */ + if (conn->partialResMode && res->ntups >= conn->maxChunkSize) conn->asyncStatus = PGASYNC_READY_MORE; - } return 1; - -fail: - /* release locally allocated PGresult, if we made one */ - if (res != conn->result) - PQclear(res); - return 0; } @@ -1458,7 +1452,7 @@ PQsendQueryInternal(PGconn *conn, const char *query, bool newQuery) /* Send the query message(s) */ /* construct the outgoing Query message */ - if (pqPutMsgStart('Q', conn) < 0 || + if (pqPutMsgStart(PqMsg_Query, conn) < 0 || pqPuts(query, conn) < 0 || pqPutMsgEnd(conn) < 0) { @@ -1571,7 +1565,7 @@ PQsendPrepare(PGconn *conn, return 0; /* error msg already set */ /* construct the Parse message */ - if (pqPutMsgStart('P', conn) < 0 || + if (pqPutMsgStart(PqMsg_Parse, conn) < 0 || pqPuts(stmtName, conn) < 0 || pqPuts(query, conn) < 0) goto sendFailed; @@ -1599,7 +1593,7 @@ PQsendPrepare(PGconn *conn, /* Add a Sync, unless in pipeline mode. */ if (conn->pipelineStatus == PQ_PIPELINE_OFF) { - if (pqPutMsgStart('S', conn) < 0 || + if (pqPutMsgStart(PqMsg_Sync, conn) < 0 || pqPutMsgEnd(conn) < 0) goto sendFailed; } @@ -1742,8 +1736,10 @@ PQsendQueryStart(PGconn *conn, bool newQuery) */ pqClearAsyncResult(conn); - /* reset single-row processing mode */ + /* reset partial-result mode */ + conn->partialResMode = false; conn->singleRowMode = false; + conn->maxChunkSize = 0; } /* ready to send command message */ @@ -1784,7 +1780,7 @@ PQsendQueryGuts(PGconn *conn, if (command) { /* construct the Parse message */ - if (pqPutMsgStart('P', conn) < 0 || + if (pqPutMsgStart(PqMsg_Parse, conn) < 0 || pqPuts(stmtName, conn) < 0 || pqPuts(command, conn) < 0) goto sendFailed; @@ -1808,7 +1804,7 @@ PQsendQueryGuts(PGconn *conn, } /* Construct the Bind message */ - if (pqPutMsgStart('B', conn) < 0 || + if (pqPutMsgStart(PqMsg_Bind, conn) < 0 || pqPuts("", conn) < 0 || pqPuts(stmtName, conn) < 0) goto sendFailed; @@ -1874,14 +1870,14 @@ PQsendQueryGuts(PGconn *conn, goto sendFailed; /* construct the Describe Portal message */ - if (pqPutMsgStart('D', conn) < 0 || + if (pqPutMsgStart(PqMsg_Describe, conn) < 0 || pqPutc('P', conn) < 0 || pqPuts("", conn) < 0 || pqPutMsgEnd(conn) < 0) goto sendFailed; /* construct the Execute message */ - if (pqPutMsgStart('E', conn) < 0 || + if (pqPutMsgStart(PqMsg_Execute, conn) < 0 || pqPuts("", conn) < 0 || pqPutInt(0, 4, conn) < 0 || pqPutMsgEnd(conn) < 0) @@ -1890,7 +1886,7 @@ PQsendQueryGuts(PGconn *conn, /* construct the Sync message if not in pipeline mode */ if (conn->pipelineStatus == PQ_PIPELINE_OFF) { - if (pqPutMsgStart('S', conn) < 0 || + if (pqPutMsgStart(PqMsg_Sync, conn) < 0 || pqPutMsgEnd(conn) < 0) goto sendFailed; } @@ -1923,29 +1919,60 @@ PQsendQueryGuts(PGconn *conn, } /* - * Select row-by-row processing mode + * Is it OK to change partial-result mode now? */ -int -PQsetSingleRowMode(PGconn *conn) +static bool +canChangeResultMode(PGconn *conn) { /* - * Only allow setting the flag when we have launched a query and not yet + * Only allow changing the mode when we have launched a query and not yet * received any results. */ if (!conn) - return 0; + return false; if (conn->asyncStatus != PGASYNC_BUSY) - return 0; + return false; if (!conn->cmd_queue_head || (conn->cmd_queue_head->queryclass != PGQUERY_SIMPLE && conn->cmd_queue_head->queryclass != PGQUERY_EXTENDED)) - return 0; + return false; if (pgHavePendingResult(conn)) + return false; + return true; +} + +/* + * Select row-by-row processing mode + */ +int +PQsetSingleRowMode(PGconn *conn) +{ + if (canChangeResultMode(conn)) + { + conn->partialResMode = true; + conn->singleRowMode = true; + conn->maxChunkSize = 1; + return 1; + } + else return 0; +} - /* OK, set flag */ - conn->singleRowMode = true; - return 1; +/* + * Select chunked results processing mode + */ +int +PQsetChunkedRowsMode(PGconn *conn, int chunkSize) +{ + if (chunkSize > 0 && canChangeResultMode(conn)) + { + conn->partialResMode = true; + conn->singleRowMode = false; + conn->maxChunkSize = chunkSize; + return 1; + } + else + return 0; } /* @@ -2112,19 +2139,26 @@ PQgetResult(PGconn *conn) break; case PGASYNC_READY: + res = pqPrepareAsyncResult(conn); /* - * For any query type other than simple query protocol, we advance - * the command queue here. This is because for simple query - * protocol we can get the READY state multiple times before the - * command is actually complete, since the command string can - * contain many queries. In simple query protocol, the queue - * advance is done by fe-protocol3 when it receives ReadyForQuery. + * Normally pqPrepareAsyncResult will have left conn->result + * empty. Otherwise, "res" must be a not-full PGRES_TUPLES_CHUNK + * result, which we want to return to the caller while staying in + * PGASYNC_READY state. Then the next call here will return the + * empty PGRES_TUPLES_OK result that was restored from + * saved_result, after which we can proceed. */ - if (conn->cmd_queue_head && - conn->cmd_queue_head->queryclass != PGQUERY_SIMPLE) - pqCommandQueueAdvance(conn); - res = pqPrepareAsyncResult(conn); + if (conn->result) + { + Assert(res->resultStatus == PGRES_TUPLES_CHUNK); + break; + } + + /* Advance the queue as appropriate */ + pqCommandQueueAdvance(conn, false, + res->resultStatus == PGRES_PIPELINE_SYNC); + if (conn->pipelineStatus != PQ_PIPELINE_OFF) { /* @@ -2144,7 +2178,7 @@ PQgetResult(PGconn *conn) * (In other words: we don't return a NULL after a pipeline * sync.) */ - if (res && res->resultStatus == PGRES_PIPELINE_SYNC) + if (res->resultStatus == PGRES_PIPELINE_SYNC) pqPipelineProcessQueue(conn); } else @@ -2422,7 +2456,7 @@ PQdescribePrepared(PGconn *conn, const char *stmt) { if (!PQexecStart(conn)) return NULL; - if (!PQsendDescribe(conn, 'S', stmt)) + if (!PQsendTypedCommand(conn, PqMsg_Describe, 'S', stmt)) return NULL; return PQexecFinish(conn); } @@ -2441,7 +2475,7 @@ PQdescribePortal(PGconn *conn, const char *portal) { if (!PQexecStart(conn)) return NULL; - if (!PQsendDescribe(conn, 'P', portal)) + if (!PQsendTypedCommand(conn, PqMsg_Describe, 'P', portal)) return NULL; return PQexecFinish(conn); } @@ -2456,7 +2490,7 @@ PQdescribePortal(PGconn *conn, const char *portal) int PQsendDescribePrepared(PGconn *conn, const char *stmt) { - return PQsendDescribe(conn, 'S', stmt); + return PQsendTypedCommand(conn, PqMsg_Describe, 'S', stmt); } /* @@ -2469,26 +2503,96 @@ PQsendDescribePrepared(PGconn *conn, const char *stmt) int PQsendDescribePortal(PGconn *conn, const char *portal) { - return PQsendDescribe(conn, 'P', portal); + return PQsendTypedCommand(conn, PqMsg_Describe, 'P', portal); +} + +/* + * PQclosePrepared + * Close a previously prepared statement + * + * If the query was not even sent, return NULL; conn->errorMessage is set to + * a relevant message. + * If the query was sent, a new PGresult is returned (which could indicate + * either success or failure). On success, the PGresult contains status + * PGRES_COMMAND_OK. The user is responsible for freeing the PGresult via + * PQclear() when done with it. + */ +PGresult * +PQclosePrepared(PGconn *conn, const char *stmt) +{ + if (!PQexecStart(conn)) + return NULL; + if (!PQsendTypedCommand(conn, PqMsg_Close, 'S', stmt)) + return NULL; + return PQexecFinish(conn); +} + +/* + * PQclosePortal + * Close a previously created portal + * + * This is exactly like PQclosePrepared, but for portals. Note that at the + * moment, libpq doesn't really expose portals to the client; but this can be + * used with a portal created by a SQL DECLARE CURSOR command. + */ +PGresult * +PQclosePortal(PGconn *conn, const char *portal) +{ + if (!PQexecStart(conn)) + return NULL; + if (!PQsendTypedCommand(conn, PqMsg_Close, 'P', portal)) + return NULL; + return PQexecFinish(conn); +} + +/* + * PQsendClosePrepared + * Submit a Close Statement command, but don't wait for it to finish + * + * Returns: 1 if successfully submitted + * 0 if error (conn->errorMessage is set) + */ +int +PQsendClosePrepared(PGconn *conn, const char *stmt) +{ + return PQsendTypedCommand(conn, PqMsg_Close, 'S', stmt); } /* - * PQsendDescribe - * Common code to send a Describe command + * PQsendClosePortal + * Submit a Close Portal command, but don't wait for it to finish + * + * Returns: 1 if successfully submitted + * 0 if error (conn->errorMessage is set) + */ +int +PQsendClosePortal(PGconn *conn, const char *portal) +{ + return PQsendTypedCommand(conn, PqMsg_Close, 'P', portal); +} + +/* + * PQsendTypedCommand + * Common code to send a Describe or Close command + * + * Available options for "command" are + * PqMsg_Close for Close; or + * PqMsg_Describe for Describe. + * + * Available options for "type" are + * 'S' to run a command on a prepared statement; or + * 'P' to run a command on a portal. * - * Available options for desc_type are - * 'S' to describe a prepared statement; or - * 'P' to describe a portal. * Returns 1 on success and 0 on failure. */ static int -PQsendDescribe(PGconn *conn, char desc_type, const char *desc_target) +PQsendTypedCommand(PGconn *conn, char command, char type, const char *target) { PGcmdQueueEntry *entry = NULL; - /* Treat null desc_target as empty string */ - if (!desc_target) - desc_target = ""; + /* Treat null target as empty string */ + if (!target) + target = ""; if (!PQsendQueryStart(conn, true)) return 0; @@ -2497,23 +2601,35 @@ PQsendDescribe(PGconn *conn, char desc_type, const char *desc_target) if (entry == NULL) return 0; /* error msg already set */ - /* construct the Describe message */ - if (pqPutMsgStart('D', conn) < 0 || - pqPutc(desc_type, conn) < 0 || - pqPuts(desc_target, conn) < 0 || + /* construct the Close message */ + if (pqPutMsgStart(command, conn) < 0 || + pqPutc(type, conn) < 0 || + pqPuts(target, conn) < 0 || pqPutMsgEnd(conn) < 0) goto sendFailed; /* construct the Sync message */ if (conn->pipelineStatus == PQ_PIPELINE_OFF) { - if (pqPutMsgStart('S', conn) < 0 || + if (pqPutMsgStart(PqMsg_Sync, conn) < 0 || pqPutMsgEnd(conn) < 0) goto sendFailed; } - /* remember we are doing a Describe */ - entry->queryclass = PGQUERY_DESCRIBE; + /* remember if we are doing a Close or a Describe */ + if (command == PqMsg_Close) + { + entry->queryclass = PGQUERY_CLOSE; + } + else if (command == PqMsg_Describe) + { + entry->queryclass = PGQUERY_DESCRIBE; + } + else + { + libpq_append_conn_error(conn, "unrecognized message type \"%c\"", command); + goto sendFailed; + } /* * Give the data a push (in pipeline mode, only if we're past the size @@ -2614,7 +2730,7 @@ PQputCopyData(PGconn *conn, const char *buffer, int nbytes) return pqIsnonblocking(conn) ? 0 : -1; } /* Send the data (too simple to delegate to fe-protocol files) */ - if (pqPutMsgStart('d', conn) < 0 || + if (pqPutMsgStart(PqMsg_CopyData, conn) < 0 || pqPutnchar(buffer, nbytes, conn) < 0 || pqPutMsgEnd(conn) < 0) return -1; @@ -2627,8 +2743,7 @@ PQputCopyData(PGconn *conn, const char *buffer, int nbytes) * * After calling this, use PQgetResult() to check command completion status. * - * Returns 1 if successful, 0 if data could not be sent (only possible - * in nonblock mode), or -1 if an error occurs. + * Returns 1 if successful, or -1 if an error occurs. */ int PQputCopyEnd(PGconn *conn, const char *errormsg) @@ -2649,7 +2764,7 @@ PQputCopyEnd(PGconn *conn, const char *errormsg) if (errormsg) { /* Send COPY FAIL */ - if (pqPutMsgStart('f', conn) < 0 || + if (pqPutMsgStart(PqMsg_CopyFail, conn) < 0 || pqPuts(errormsg, conn) < 0 || pqPutMsgEnd(conn) < 0) return -1; @@ -2657,7 +2772,7 @@ PQputCopyEnd(PGconn *conn, const char *errormsg) else { /* Send COPY DONE */ - if (pqPutMsgStart('c', conn) < 0 || + if (pqPutMsgStart(PqMsg_CopyDone, conn) < 0 || pqPutMsgEnd(conn) < 0) return -1; } @@ -2669,7 +2784,7 @@ PQputCopyEnd(PGconn *conn, const char *errormsg) if (conn->cmd_queue_head && conn->cmd_queue_head->queryclass != PGQUERY_SIMPLE) { - if (pqPutMsgStart('S', conn) < 0 || + if (pqPutMsgStart(PqMsg_Sync, conn) < 0 || pqPutMsgEnd(conn) < 0) return -1; } @@ -3007,18 +3122,44 @@ PQexitPipelineMode(PGconn *conn) /* * pqCommandQueueAdvance - * Remove one query from the command queue, when we receive - * all results from the server that pertain to it. + * Remove one query from the command queue, if appropriate. + * + * If we have received all results corresponding to the head element + * in the command queue, remove it. + * + * In simple query protocol we must not advance the command queue until the + * ReadyForQuery message has been received. This is because in simple mode a + * command can have multiple queries, and we must process result for all of + * them before moving on to the next command. + * + * Another consideration is synchronization during error processing in + * extended query protocol: we refuse to advance the queue past a SYNC queue + * element, unless the result we've received is also a SYNC. In particular + * this protects us from advancing when an error is received at an + * inappropriate moment. */ void -pqCommandQueueAdvance(PGconn *conn) +pqCommandQueueAdvance(PGconn *conn, bool isReadyForQuery, bool gotSync) { PGcmdQueueEntry *prevquery; if (conn->cmd_queue_head == NULL) return; - /* delink from queue */ + /* + * If processing a query of simple query protocol, we only advance the + * queue when we receive the ReadyForQuery message for it. + */ + if (conn->cmd_queue_head->queryclass == PGQUERY_SIMPLE && !isReadyForQuery) + return; + + /* + * If we're waiting for a SYNC, don't advance the queue until we get one. + */ + if (conn->cmd_queue_head->queryclass == PGQUERY_SYNC && !gotSync) + return; + + /* delink element from queue */ prevquery = conn->cmd_queue_head; conn->cmd_queue_head = conn->cmd_queue_head->next; @@ -3026,7 +3167,7 @@ pqCommandQueueAdvance(PGconn *conn) if (conn->cmd_queue_head == NULL) conn->cmd_queue_tail = NULL; - /* and make it recyclable */ + /* and make the queue element recyclable */ prevquery->next = NULL; pqRecycleCmdQueueEntry(conn, prevquery); } @@ -3070,10 +3211,12 @@ pqPipelineProcessQueue(PGconn *conn) } /* - * Reset single-row processing mode. (Client has to set it up for each - * query, if desired.) + * Reset partial-result mode. (Client has to set it up for each query, if + * desired.) */ + conn->partialResMode = false; conn->singleRowMode = false; + conn->maxChunkSize = 0; /* * If there are no further commands to process in the queue, get us in @@ -3124,25 +3267,31 @@ pqPipelineProcessQueue(PGconn *conn) /* * PQpipelineSync * Send a Sync message as part of a pipeline, and flush to server - * - * It's legal to start submitting more commands in the pipeline immediately, - * without waiting for the results of the current pipeline. There's no need to - * end pipeline mode and start it again. - * - * If a command in a pipeline fails, every subsequent command up to and including - * the result to the Sync message sent by PQpipelineSync gets set to - * PGRES_PIPELINE_ABORTED state. If the whole pipeline is processed without - * error, a PGresult with PGRES_PIPELINE_SYNC is produced. - * - * Queries can already have been sent before PQpipelineSync is called, but - * PQpipelineSync need to be called before retrieving command results. - * - * The connection will remain in pipeline mode and unavailable for new - * synchronous command execution functions until all results from the pipeline - * are processed by the client. */ int PQpipelineSync(PGconn *conn) +{ + return pqPipelineSyncInternal(conn, true); +} + +/* + * PQsendPipelineSync + * Send a Sync message as part of a pipeline, without flushing to server + */ +int +PQsendPipelineSync(PGconn *conn) +{ + return pqPipelineSyncInternal(conn, false); +} + +/* + * Workhorse function for PQpipelineSync and PQsendPipelineSync. + * + * immediate_flush controls if the flush happens immediately after sending the + * Sync message or not. + */ +static int +pqPipelineSyncInternal(PGconn *conn, bool immediate_flush) { PGcmdQueueEntry *entry; @@ -3181,16 +3330,26 @@ PQpipelineSync(PGconn *conn) entry->query = NULL; /* construct the Sync message */ - if (pqPutMsgStart('S', conn) < 0 || + if (pqPutMsgStart(PqMsg_Sync, conn) < 0 || pqPutMsgEnd(conn) < 0) goto sendFailed; /* * Give the data a push. In nonblock mode, don't complain if we're unable * to send it all; PQgetResult() will do any additional flushing needed. + * If immediate_flush is disabled, the data is pushed if we are past the + * size threshold. */ - if (PQflush(conn) < 0) - goto sendFailed; + if (immediate_flush) + { + if (pqFlush(conn) < 0) + goto sendFailed; + } + else + { + if (pqPipelineFlush(conn) < 0) + goto sendFailed; + } /* OK, it's launched! */ pqAppendCmdQueueEntry(conn, entry); @@ -3229,12 +3388,20 @@ PQsendFlushRequest(PGconn *conn) return 0; } - if (pqPutMsgStart('H', conn) < 0 || + if (pqPutMsgStart(PqMsg_Flush, conn) < 0 || pqPutMsgEnd(conn) < 0) { return 0; } + /* + * Give the data a push (in pipeline mode, only if we're past the size + * threshold). In nonblock mode, don't complain if we're unable to send + * it all; PQgetResult() will do any additional flushing needed. + */ + if (pqPipelineFlush(conn) < 0) + return 0; + return 1; } @@ -3824,11 +3991,7 @@ PQisnonblocking(const PGconn *conn) int PQisthreadsafe(void) { -#ifdef ENABLE_THREAD_SAFETY return true; -#else - return false; -#endif } @@ -3912,15 +4075,16 @@ PQescapeStringInternal(PGconn *conn, { const char *source = from; char *target = to; - size_t remaining = length; + size_t remaining = strnlen(from, length); + bool already_complained = false; if (error) *error = 0; - while (remaining > 0 && *source != '\0') + while (remaining > 0) { char c = *source; - int len; + int charlen; int i; /* Fast path for plain ASCII */ @@ -3937,38 +4101,69 @@ PQescapeStringInternal(PGconn *conn, } /* Slow path for possible multibyte characters */ - len = pg_encoding_mblen(encoding, source); + charlen = pg_encoding_mblen_or_incomplete(encoding, + source, remaining); - /* Copy the character */ - for (i = 0; i < len; i++) + if (remaining < charlen || + pg_encoding_verifymbchar(encoding, source, charlen) == -1) { - if (remaining == 0 || *source == '\0') - break; - *target++ = *source++; + /* + * Multibyte character is invalid. It's important to verify that + * as invalid multibyte characters could e.g. be used to "skip" + * over quote characters, e.g. when parsing + * character-by-character. + * + * Report an error if possible, and replace the character's first + * byte with an invalid sequence. The invalid sequence ensures + * that the escaped string will trigger an error on the + * server-side, even if we can't directly report an error here. + * + * This isn't *that* crucial when we can report an error to the + * caller; but if we can't or the caller ignores it, the caller + * will use this string unmodified and it needs to be safe for + * parsing. + * + * We know there's enough space for the invalid sequence because + * the "to" buffer needs to be at least 2 * length + 1 long, and + * at worst we're replacing a single input byte with two invalid + * bytes. + * + * It would be a bit faster to verify the whole string the first + * time we encounter a set highbit, but this way we can replace + * just the invalid data, which probably makes it easier for users + * to find the invalidly encoded portion of a larger string. + */ + if (error) + *error = 1; + if (conn && !already_complained) + { + if (remaining < charlen) + libpq_append_conn_error(conn, "incomplete multibyte character"); + else + libpq_append_conn_error(conn, "invalid multibyte character"); + /* Issue a complaint only once per string */ + already_complained = true; + } + + pg_encoding_set_invalid(encoding, target); + target += 2; + + /* + * Handle the following bytes as if this byte didn't exist. That's + * safer in case the subsequent bytes contain important characters + * for the caller (e.g. '>' in html). + */ + source++; remaining--; } - - /* - * If we hit premature end of string (ie, incomplete multibyte - * character), try to pad out to the correct length with spaces. We - * may not be able to pad completely, but we will always be able to - * insert at least one pad space (since we'd not have quoted a - * multibyte character). This should be enough to make a string that - * the server will error out on. - */ - if (i < len) + else { - if (error) - *error = 1; - if (conn) - libpq_append_conn_error(conn, "incomplete multibyte character"); - for (; i < len; i++) + /* Copy the character */ + for (i = 0; i < charlen; i++) { - if (((size_t) (target - to)) / 2 >= length) - break; - *target++ = ' '; + *target++ = *source++; + remaining--; } - break; } } @@ -4023,9 +4218,10 @@ PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident) char *rp; int num_quotes = 0; /* single or double, depending on as_ident */ int num_backslashes = 0; - int input_len; - int result_size; + size_t input_len = strnlen(str, len); + size_t result_size; char quote_char = as_ident ? '"' : '\''; + bool validated_mb = false; /* We must have a connection, else fail immediately. */ if (!conn) @@ -4034,8 +4230,12 @@ PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident) if (conn->cmd_queue_head == NULL) pqClearConnErrorState(conn); - /* Scan the string for characters that must be escaped. */ - for (s = str; (s - str) < len && *s != '\0'; ++s) + /* + * Scan the string for characters that must be escaped and for invalidly + * encoded data. + */ + s = str; + for (size_t remaining = input_len; remaining > 0; remaining--, s++) { if (*s == quote_char) ++num_quotes; @@ -4046,22 +4246,44 @@ PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident) int charlen; /* Slow path for possible multibyte characters */ - charlen = pg_encoding_mblen(conn->client_encoding, s); + charlen = pg_encoding_mblen_or_incomplete(conn->client_encoding, + s, remaining); - /* Multibyte character overruns allowable length. */ - if ((s - str) + charlen > len || memchr(s, 0, charlen) != NULL) + if (charlen > remaining) { + /* Multibyte character overruns allowable length. */ libpq_append_conn_error(conn, "incomplete multibyte character"); return NULL; } + /* + * If we haven't already, check that multibyte characters are + * valid. It's important to verify that as invalid multi-byte + * characters could e.g. be used to "skip" over quote characters, + * e.g. when parsing character-by-character. + * + * We check validity once, for the whole remainder of the string, + * when we first encounter any multi-byte character. Some + * encodings have optimized implementations for longer strings. + */ + if (!validated_mb) + { + if (pg_encoding_verifymbstr(conn->client_encoding, s, remaining) + != remaining) + { + libpq_append_conn_error(conn, "invalid multibyte character"); + return NULL; + } + validated_mb = true; + } + /* Adjust s, bearing in mind that for loop will increment it. */ s += charlen - 1; + remaining -= charlen - 1; } } /* Allocate output buffer. */ - input_len = s - str; result_size = input_len + num_quotes + 3; /* two quotes, plus a NUL */ if (!as_ident && num_backslashes > 0) result_size += num_backslashes + 2; @@ -4106,7 +4328,8 @@ PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident) } else { - for (s = str; s - str < input_len; ++s) + s = str; + for (size_t remaining = input_len; remaining > 0; remaining--, s++) { if (*s == quote_char || (!as_ident && *s == '\\')) { @@ -4124,6 +4347,7 @@ PQescapeInternal(PGconn *conn, const char *str, size_t len, bool as_ident) *rp++ = *s; if (--i == 0) break; + remaining--; ++s; /* for loop will provide the final increment */ } } diff --git a/src/interfaces/libpq/fe-gssapi-common.c b/src/interfaces/libpq/fe-gssapi-common.c index f17ce09427cdf..29d8fea6290c9 100644 --- a/src/interfaces/libpq/fe-gssapi-common.c +++ b/src/interfaces/libpq/fe-gssapi-common.c @@ -3,7 +3,7 @@ * fe-gssapi-common.c * The front-end (client) GSSAPI common code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/interfaces/libpq/fe-gssapi-common.h b/src/interfaces/libpq/fe-gssapi-common.h index 5f93b7e1b5920..e3504811eb597 100644 --- a/src/interfaces/libpq/fe-gssapi-common.h +++ b/src/interfaces/libpq/fe-gssapi-common.h @@ -4,7 +4,7 @@ * * Definitions for GSSAPI common routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/interfaces/libpq/fe-gssapi-common.h diff --git a/src/interfaces/libpq/fe-lobj.c b/src/interfaces/libpq/fe-lobj.c index 206266fd0437d..c17585e38b784 100644 --- a/src/interfaces/libpq/fe-lobj.c +++ b/src/interfaces/libpq/fe-lobj.c @@ -3,7 +3,7 @@ * fe-lobj.c * Front-end large object interface * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c index 660cdec93c9c9..c76a9878cc5fc 100644 --- a/src/interfaces/libpq/fe-misc.c +++ b/src/interfaces/libpq/fe-misc.c @@ -19,7 +19,7 @@ * routines. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -54,8 +54,7 @@ static int pqPutMsgBytes(const void *buf, size_t len, PGconn *conn); static int pqSendSome(PGconn *conn, int len); static int pqSocketCheck(PGconn *conn, int forRead, int forWrite, - time_t end_time); -static int pqSocketPoll(int sock, int forRead, int forWrite, time_t end_time); + pg_usec_time_t end_time); /* * PQlibVersion: return the libpq version number @@ -978,22 +977,25 @@ pqFlush(PGconn *conn) int pqWait(int forRead, int forWrite, PGconn *conn) { - return pqWaitTimed(forRead, forWrite, conn, (time_t) -1); + return pqWaitTimed(forRead, forWrite, conn, -1); } /* - * pqWaitTimed: wait, but not past finish_time. - * - * finish_time = ((time_t) -1) disables the wait limit. + * pqWaitTimed: wait, but not past end_time. * * Returns -1 on failure, 0 if the socket is readable/writable, 1 if it timed out. + * + * The timeout is specified by end_time, which is the int64 number of + * microseconds since the Unix epoch (that is, time_t times 1 million). + * Timeout is infinite if end_time is -1. Timeout is immediate (no blocking) + * if end_time is 0 (or indeed, any time before now). */ int -pqWaitTimed(int forRead, int forWrite, PGconn *conn, time_t finish_time) +pqWaitTimed(int forRead, int forWrite, PGconn *conn, pg_usec_time_t end_time) { int result; - result = pqSocketCheck(conn, forRead, forWrite, finish_time); + result = pqSocketCheck(conn, forRead, forWrite, end_time); if (result < 0) return -1; /* errorMessage is already set */ @@ -1014,7 +1016,7 @@ pqWaitTimed(int forRead, int forWrite, PGconn *conn, time_t finish_time) int pqReadReady(PGconn *conn) { - return pqSocketCheck(conn, 1, 0, (time_t) 0); + return pqSocketCheck(conn, 1, 0, 0); } /* @@ -1024,7 +1026,7 @@ pqReadReady(PGconn *conn) int pqWriteReady(PGconn *conn) { - return pqSocketCheck(conn, 0, 1, (time_t) 0); + return pqSocketCheck(conn, 0, 1, 0); } /* @@ -1036,7 +1038,7 @@ pqWriteReady(PGconn *conn) * for read data directly. */ static int -pqSocketCheck(PGconn *conn, int forRead, int forWrite, time_t end_time) +pqSocketCheck(PGconn *conn, int forRead, int forWrite, pg_usec_time_t end_time) { int result; @@ -1059,7 +1061,7 @@ pqSocketCheck(PGconn *conn, int forRead, int forWrite, time_t end_time) /* We will retry as long as we get EINTR */ do - result = pqSocketPoll(conn->sock, forRead, forWrite, end_time); + result = PQsocketPoll(conn->sock, forRead, forWrite, end_time); while (result < 0 && SOCK_ERRNO == EINTR); if (result < 0) @@ -1080,11 +1082,13 @@ pqSocketCheck(PGconn *conn, int forRead, int forWrite, time_t end_time) * condition (without waiting). Return >0 if condition is met, 0 * if a timeout occurred, -1 if an error or interrupt occurred. * + * The timeout is specified by end_time, which is the int64 number of + * microseconds since the Unix epoch (that is, time_t times 1 million). * Timeout is infinite if end_time is -1. Timeout is immediate (no blocking) * if end_time is 0 (or indeed, any time before now). */ -static int -pqSocketPoll(int sock, int forRead, int forWrite, time_t end_time) +int +PQsocketPoll(int sock, int forRead, int forWrite, pg_usec_time_t end_time) { /* We use poll(2) if available, otherwise select(2) */ #ifdef HAVE_POLL @@ -1104,14 +1108,16 @@ pqSocketPoll(int sock, int forRead, int forWrite, time_t end_time) input_fd.events |= POLLOUT; /* Compute appropriate timeout interval */ - if (end_time == ((time_t) -1)) + if (end_time == -1) timeout_ms = -1; + else if (end_time == 0) + timeout_ms = 0; else { - time_t now = time(NULL); + pg_usec_time_t now = PQgetCurrentTimeUSec(); if (end_time > now) - timeout_ms = (end_time - now) * 1000; + timeout_ms = (end_time - now) / 1000; else timeout_ms = 0; } @@ -1139,17 +1145,28 @@ pqSocketPoll(int sock, int forRead, int forWrite, time_t end_time) FD_SET(sock, &except_mask); /* Compute appropriate timeout interval */ - if (end_time == ((time_t) -1)) + if (end_time == -1) ptr_timeout = NULL; + else if (end_time == 0) + { + timeout.tv_sec = 0; + timeout.tv_usec = 0; + ptr_timeout = &timeout; + } else { - time_t now = time(NULL); + pg_usec_time_t now = PQgetCurrentTimeUSec(); if (end_time > now) - timeout.tv_sec = end_time - now; + { + timeout.tv_sec = (end_time - now) / 1000000; + timeout.tv_usec = (end_time - now) % 1000000; + } else + { timeout.tv_sec = 0; - timeout.tv_usec = 0; + timeout.tv_usec = 0; + } ptr_timeout = &timeout; } @@ -1158,6 +1175,21 @@ pqSocketPoll(int sock, int forRead, int forWrite, time_t end_time) #endif /* HAVE_POLL */ } +/* + * PQgetCurrentTimeUSec: get current time with microsecond precision + * + * This provides a platform-independent way of producing a reference + * value for PQsocketPoll's timeout parameter. + */ +pg_usec_time_t +PQgetCurrentTimeUSec(void) +{ + struct timeval tval; + + gettimeofday(&tval, NULL); + return (pg_usec_time_t) tval.tv_sec * 1000000 + tval.tv_usec; +} + /* * A couple of "miscellaneous" multibyte related functions. They used @@ -1165,13 +1197,9 @@ pqSocketPoll(int sock, int forRead, int forWrite, time_t end_time) */ /* - * Returns the byte length of the character beginning at s, using the - * specified encoding. - * - * Caution: when dealing with text that is not certainly valid in the - * specified encoding, the result may exceed the actual remaining - * string length. Callers that are not prepared to deal with that - * should use PQmblenBounded() instead. + * Like pg_encoding_mblen(). Use this in callers that want the + * dynamically-linked libpq's stance on encodings, even if that means + * different behavior in different startups of the executable. */ int PQmblen(const char *s, int encoding) @@ -1180,8 +1208,9 @@ PQmblen(const char *s, int encoding) } /* - * Returns the byte length of the character beginning at s, using the - * specified encoding; but not more than the distance to end of string. + * Like pg_encoding_mblen_bounded(). Use this in callers that want the + * dynamically-linked libpq's stance on encodings, even if that means + * different behavior in different startups of the executable. */ int PQmblenBounded(const char *s, int encoding) @@ -1225,13 +1254,14 @@ static void libpq_binddomain(void) { /* - * If multiple threads come through here at about the same time, it's okay - * for more than one of them to call bindtextdomain(). But it's not okay - * for any of them to return to caller before bindtextdomain() is - * complete, so don't set the flag till that's done. Use "volatile" just - * to be sure the compiler doesn't try to get cute. + * At least on Windows, there are gettext implementations that fail if + * multiple threads call bindtextdomain() concurrently. Use a mutex and + * flag variable to ensure that we call it just once per process. It is + * not known that similar bugs exist on non-Windows platforms, but we + * might as well do it the same way everywhere. */ static volatile bool already_bound = false; + static pthread_mutex_t binddomain_mutex = PTHREAD_MUTEX_INITIALIZER; if (!already_bound) { @@ -1241,14 +1271,26 @@ libpq_binddomain(void) #else int save_errno = errno; #endif - const char *ldir; - - /* No relocatable lookup here because the binary could be anywhere */ - ldir = getenv("PGLOCALEDIR"); - if (!ldir) - ldir = LOCALEDIR; - bindtextdomain(PG_TEXTDOMAIN("libpq"), ldir); - already_bound = true; + + (void) pthread_mutex_lock(&binddomain_mutex); + + if (!already_bound) + { + const char *ldir; + + /* + * No relocatable lookup here because the calling executable could + * be anywhere + */ + ldir = getenv("PGLOCALEDIR"); + if (!ldir) + ldir = LOCALEDIR; + bindtextdomain(PG_TEXTDOMAIN("libpq"), ldir); + already_bound = true; + } + + (void) pthread_mutex_unlock(&binddomain_mutex); + #ifdef WIN32 SetLastError(save_errno); #else diff --git a/src/interfaces/libpq/fe-print.c b/src/interfaces/libpq/fe-print.c index 40620b47e9409..df95f059efa94 100644 --- a/src/interfaces/libpq/fe-print.c +++ b/src/interfaces/libpq/fe-print.c @@ -3,7 +3,7 @@ * fe-print.c * functions for pretty-printing query results * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * These functions were formerly part of fe-exec.c, but they @@ -88,14 +88,11 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po) bool usePipe = false; char *pagerenv; -#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32) +#if !defined(WIN32) sigset_t osigset; bool sigpipe_masked = false; bool sigpipe_pending; #endif -#if !defined(ENABLE_THREAD_SAFETY) && !defined(WIN32) - pqsigfunc oldsigpipehandler = NULL; -#endif #ifdef TIOCGWINSZ struct winsize screen_size; @@ -186,12 +183,8 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po) { usePipe = true; #ifndef WIN32 -#ifdef ENABLE_THREAD_SAFETY if (pq_block_sigpipe(&osigset, &sigpipe_pending) == 0) sigpipe_masked = true; -#else - oldsigpipehandler = pqsignal(SIGPIPE, SIG_IGN); -#endif /* ENABLE_THREAD_SAFETY */ #endif /* WIN32 */ } else @@ -324,13 +317,9 @@ PQprint(FILE *fout, const PGresult *res, const PQprintOpt *po) #else pclose(fout); -#ifdef ENABLE_THREAD_SAFETY /* we can't easily verify if EPIPE occurred, so say it did */ if (sigpipe_masked) pq_reset_sigpipe(&osigset, sigpipe_pending, true); -#else - pqsignal(SIGPIPE, oldsigpipehandler); -#endif /* ENABLE_THREAD_SAFETY */ #endif /* WIN32 */ } } diff --git a/src/interfaces/libpq/fe-protocol3.c b/src/interfaces/libpq/fe-protocol3.c index 32b66d561cb3f..3170d484f026a 100644 --- a/src/interfaces/libpq/fe-protocol3.c +++ b/src/interfaces/libpq/fe-protocol3.c @@ -3,7 +3,7 @@ * fe-protocol3.c * functions that are specific to frontend/backend protocol version 3 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -34,8 +34,13 @@ * than a couple of kilobytes). */ #define VALID_LONG_MESSAGE_TYPE(id) \ - ((id) == 'T' || (id) == 'D' || (id) == 'd' || (id) == 'V' || \ - (id) == 'E' || (id) == 'N' || (id) == 'A') + ((id) == PqMsg_CopyData || \ + (id) == PqMsg_DataRow || \ + (id) == PqMsg_ErrorResponse || \ + (id) == PqMsg_FunctionCallResponse || \ + (id) == PqMsg_NoticeResponse || \ + (id) == PqMsg_NotificationResponse || \ + (id) == PqMsg_RowDescription) static void handleSyncLoss(PGconn *conn, char id, int msgLength); @@ -140,12 +145,12 @@ pqParseInput3(PGconn *conn) * from config file due to SIGHUP), but otherwise we hold off until * BUSY state. */ - if (id == 'A') + if (id == PqMsg_NotificationResponse) { if (getNotify(conn)) return; } - else if (id == 'N') + else if (id == PqMsg_NoticeResponse) { if (pqGetErrorNotice3(conn, false)) return; @@ -165,12 +170,12 @@ pqParseInput3(PGconn *conn) * it is about to close the connection, so we don't want to just * discard it...) */ - if (id == 'E') + if (id == PqMsg_ErrorResponse) { if (pqGetErrorNotice3(conn, false /* treat as notice */ )) return; } - else if (id == 'S') + else if (id == PqMsg_ParameterStatus) { if (getParameterStatus(conn)) return; @@ -192,7 +197,7 @@ pqParseInput3(PGconn *conn) */ switch (id) { - case 'C': /* command complete */ + case PqMsg_CommandComplete: if (pqGets(&conn->workBuffer, conn)) return; if (!pgHavePendingResult(conn)) @@ -210,13 +215,12 @@ pqParseInput3(PGconn *conn) CMDSTATUS_LEN); conn->asyncStatus = PGASYNC_READY; break; - case 'E': /* error return */ + case PqMsg_ErrorResponse: if (pqGetErrorNotice3(conn, true)) return; conn->asyncStatus = PGASYNC_READY; break; - case 'Z': /* sync response, backend is ready for new - * query */ + case PqMsg_ReadyForQuery: if (getReadyForQuery(conn)) return; if (conn->pipelineStatus != PQ_PIPELINE_OFF) @@ -236,17 +240,12 @@ pqParseInput3(PGconn *conn) } else { - /* - * In simple query protocol, advance the command queue - * (see PQgetResult). - */ - if (conn->cmd_queue_head && - conn->cmd_queue_head->queryclass == PGQUERY_SIMPLE) - pqCommandQueueAdvance(conn); + /* Advance the command queue and set us idle */ + pqCommandQueueAdvance(conn, true, false); conn->asyncStatus = PGASYNC_IDLE; } break; - case 'I': /* empty query */ + case PqMsg_EmptyQueryResponse: if (!pgHavePendingResult(conn)) { conn->result = PQmakeEmptyPGresult(conn, @@ -259,7 +258,7 @@ pqParseInput3(PGconn *conn) } conn->asyncStatus = PGASYNC_READY; break; - case '1': /* Parse Complete */ + case PqMsg_ParseComplete: /* If we're doing PQprepare, we're done; else ignore */ if (conn->cmd_queue_head && conn->cmd_queue_head->queryclass == PGQUERY_PREPARE) @@ -277,15 +276,32 @@ pqParseInput3(PGconn *conn) conn->asyncStatus = PGASYNC_READY; } break; - case '2': /* Bind Complete */ - case '3': /* Close Complete */ - /* Nothing to do for these message types */ + case PqMsg_BindComplete: + /* Nothing to do for this message type */ + break; + case PqMsg_CloseComplete: + /* If we're doing PQsendClose, we're done; else ignore */ + if (conn->cmd_queue_head && + conn->cmd_queue_head->queryclass == PGQUERY_CLOSE) + { + if (!pgHavePendingResult(conn)) + { + conn->result = PQmakeEmptyPGresult(conn, + PGRES_COMMAND_OK); + if (!conn->result) + { + libpq_append_conn_error(conn, "out of memory"); + pqSaveErrorResult(conn); + } + } + conn->asyncStatus = PGASYNC_READY; + } break; - case 'S': /* parameter status */ + case PqMsg_ParameterStatus: if (getParameterStatus(conn)) return; break; - case 'K': /* secret key data from the backend */ + case PqMsg_BackendKeyData: /* * This is expected only during backend startup, but it's @@ -297,7 +313,7 @@ pqParseInput3(PGconn *conn) if (pqGetInt(&(conn->be_key), 4, conn)) return; break; - case 'T': /* Row Description */ + case PqMsg_RowDescription: if (conn->error_result || (conn->result != NULL && conn->result->resultStatus == PGRES_FATAL_ERROR)) @@ -329,7 +345,7 @@ pqParseInput3(PGconn *conn) return; } break; - case 'n': /* No Data */ + case PqMsg_NoData: /* * NoData indicates that we will not be seeing a @@ -357,13 +373,14 @@ pqParseInput3(PGconn *conn) conn->asyncStatus = PGASYNC_READY; } break; - case 't': /* Parameter Description */ + case PqMsg_ParameterDescription: if (getParamDescriptions(conn, msgLength)) return; break; - case 'D': /* Data Row */ + case PqMsg_DataRow: if (conn->result != NULL && - conn->result->resultStatus == PGRES_TUPLES_OK) + (conn->result->resultStatus == PGRES_TUPLES_OK || + conn->result->resultStatus == PGRES_TUPLES_CHUNK)) { /* Read another tuple of a normal query response */ if (getAnotherTuple(conn, msgLength)) @@ -388,24 +405,24 @@ pqParseInput3(PGconn *conn) conn->inCursor += msgLength; } break; - case 'G': /* Start Copy In */ + case PqMsg_CopyInResponse: if (getCopyStart(conn, PGRES_COPY_IN)) return; conn->asyncStatus = PGASYNC_COPY_IN; break; - case 'H': /* Start Copy Out */ + case PqMsg_CopyOutResponse: if (getCopyStart(conn, PGRES_COPY_OUT)) return; conn->asyncStatus = PGASYNC_COPY_OUT; conn->copy_already_done = 0; break; - case 'W': /* Start Copy Both */ + case PqMsg_CopyBothResponse: if (getCopyStart(conn, PGRES_COPY_BOTH)) return; conn->asyncStatus = PGASYNC_COPY_BOTH; conn->copy_already_done = 0; break; - case 'd': /* Copy Data */ + case PqMsg_CopyData: /* * If we see Copy Data, just silently drop it. This would @@ -414,7 +431,7 @@ pqParseInput3(PGconn *conn) */ conn->inCursor += msgLength; break; - case 'c': /* Copy Done */ + case PqMsg_CopyDone: /* * If we see Copy Done, just silently drop it. This is @@ -1675,21 +1692,21 @@ getCopyDataMessage(PGconn *conn) */ switch (id) { - case 'A': /* NOTIFY */ + case PqMsg_NotificationResponse: if (getNotify(conn)) return 0; break; - case 'N': /* NOTICE */ + case PqMsg_NoticeResponse: if (pqGetErrorNotice3(conn, false)) return 0; break; - case 'S': /* ParameterStatus */ + case PqMsg_ParameterStatus: if (getParameterStatus(conn)) return 0; break; - case 'd': /* Copy Data, pass it back to caller */ + case PqMsg_CopyData: return msgLength; - case 'c': + case PqMsg_CopyDone: /* * If this is a CopyDone message, exit COPY_OUT mode and let @@ -1912,7 +1929,7 @@ pqEndcopy3(PGconn *conn) if (conn->asyncStatus == PGASYNC_COPY_IN || conn->asyncStatus == PGASYNC_COPY_BOTH) { - if (pqPutMsgStart('c', conn) < 0 || + if (pqPutMsgStart(PqMsg_CopyDone, conn) < 0 || pqPutMsgEnd(conn) < 0) return 1; @@ -1923,7 +1940,7 @@ pqEndcopy3(PGconn *conn) if (conn->cmd_queue_head && conn->cmd_queue_head->queryclass != PGQUERY_SIMPLE) { - if (pqPutMsgStart('S', conn) < 0 || + if (pqPutMsgStart(PqMsg_Sync, conn) < 0 || pqPutMsgEnd(conn) < 0) return 1; } @@ -2006,7 +2023,7 @@ pqFunctionCall3(PGconn *conn, Oid fnid, /* PQfn already validated connection state */ - if (pqPutMsgStart('F', conn) < 0 || /* function call msg */ + if (pqPutMsgStart(PqMsg_FunctionCall, conn) < 0 || pqPutInt(fnid, 4, conn) < 0 || /* function id */ pqPutInt(1, 2, conn) < 0 || /* # of format codes */ pqPutInt(1, 2, conn) < 0 || /* format code: BINARY */ diff --git a/src/interfaces/libpq/fe-secure-common.c b/src/interfaces/libpq/fe-secure-common.c index 3ecc7bf6159ca..a21376e85128a 100644 --- a/src/interfaces/libpq/fe-secure-common.c +++ b/src/interfaces/libpq/fe-secure-common.c @@ -8,7 +8,7 @@ * file contains support routines that are used by the library-specific * implementations such as fe-secure-openssl.c. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/interfaces/libpq/fe-secure-common.h b/src/interfaces/libpq/fe-secure-common.h index e048f97b01d30..ecd5ab6ac356d 100644 --- a/src/interfaces/libpq/fe-secure-common.h +++ b/src/interfaces/libpq/fe-secure-common.h @@ -4,7 +4,7 @@ * * common implementation-independent SSL support code * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/interfaces/libpq/fe-secure-gssapi.c b/src/interfaces/libpq/fe-secure-gssapi.c index 7e373236e9200..98b314613c36c 100644 --- a/src/interfaces/libpq/fe-secure-gssapi.c +++ b/src/interfaces/libpq/fe-secure-gssapi.c @@ -3,7 +3,7 @@ * fe-secure-gssapi.c * The front-end (client) encryption support for GSSAPI * - * Portions Copyright (c) 2016-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2016-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/interfaces/libpq/fe-secure-gssapi.c @@ -79,8 +79,8 @@ * On success, returns the number of data bytes consumed (possibly less than * len). On failure, returns -1 with errno set appropriately. If the errno * indicates a non-retryable error, a message is added to conn->errorMessage. - * For retryable errors, caller should call again (passing the same data) - * once the socket is ready. + * For retryable errors, caller should call again (passing the same or more + * data) once the socket is ready. */ ssize_t pg_GSS_write(PGconn *conn, const void *ptr, size_t len) @@ -90,19 +90,25 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len) gss_buffer_desc input, output = GSS_C_EMPTY_BUFFER; ssize_t ret = -1; - size_t bytes_sent = 0; size_t bytes_to_encrypt; size_t bytes_encrypted; gss_ctx_id_t gctx = conn->gctx; /* - * When we get a failure, we must not tell the caller we have successfully - * transmitted everything, else it won't retry. Hence a "success" - * (positive) return value must only count source bytes corresponding to - * fully-transmitted encrypted packets. The amount of source data - * corresponding to the current partly-transmitted packet is remembered in + * When we get a retryable failure, we must not tell the caller we have + * successfully transmitted everything, else it won't retry. For + * simplicity, we claim we haven't transmitted anything until we have + * successfully transmitted all "len" bytes. Between calls, the amount of + * the current input data that's already been encrypted and placed into + * PqGSSSendBuffer (and perhaps transmitted) is remembered in * PqGSSSendConsumed. On a retry, the caller *must* be sending that data * again, so if it offers a len less than that, something is wrong. + * + * Note: it may seem attractive to report partial write completion once + * we've successfully sent any encrypted packets. However, that can cause + * problems for callers; notably, pqPutMsgEnd's heuristic to send only + * full 8K blocks interacts badly with such a hack. We won't save much, + * typically, by letting callers discard data early, so don't risk it. */ if (len < PqGSSSendConsumed) { @@ -140,33 +146,20 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len) retval = pqsecure_raw_write(conn, PqGSSSendBuffer + PqGSSSendNext, amount); if (retval <= 0) - { - /* - * Report any previously-sent data; if there was none, reflect - * the pqsecure_raw_write result up to our caller. When there - * was some, we're effectively assuming that any interesting - * failure condition will recur on the next try. - */ - if (bytes_sent) - return bytes_sent; return retval; - } /* * Check if this was a partial write, and if so, move forward that * far in our buffer and try again. */ - if (retval != amount) + if (retval < amount) { PqGSSSendNext += retval; continue; } - /* We've successfully sent whatever data was in that packet. */ - bytes_sent += PqGSSSendConsumed; - - /* All encrypted data was sent, our buffer is empty now. */ - PqGSSSendLength = PqGSSSendNext = PqGSSSendConsumed = 0; + /* We've successfully sent whatever data was in the buffer. */ + PqGSSSendLength = PqGSSSendNext = 0; } /* @@ -192,7 +185,7 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len) /* * Create the next encrypted packet. Any failure here is considered a - * hard failure, so we return -1 even if bytes_sent > 0. + * hard failure, so we return -1 even if some data has been sent. */ major = gss_wrap(&minor, gctx, 1, GSS_C_QOP_DEFAULT, &input, &conf_state, &output); @@ -236,10 +229,13 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len) } /* If we get here, our counters should all match up. */ - Assert(bytes_sent == len); - Assert(bytes_sent == bytes_encrypted); + Assert(len == PqGSSSendConsumed); + Assert(len == bytes_encrypted); + + /* We're reporting all the data as sent, so reset PqGSSSendConsumed. */ + PqGSSSendConsumed = 0; - ret = bytes_sent; + ret = bytes_encrypted; cleanup: /* Release GSSAPI buffer storage, if we didn't already */ diff --git a/src/interfaces/libpq/fe-secure-openssl.c b/src/interfaces/libpq/fe-secure-openssl.c index 390c888c9628b..b6fffd7b9b066 100644 --- a/src/interfaces/libpq/fe-secure-openssl.c +++ b/src/interfaces/libpq/fe-secure-openssl.c @@ -4,7 +4,7 @@ * OpenSSL support * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -44,13 +44,11 @@ #include -#ifdef ENABLE_THREAD_SAFETY #ifdef WIN32 #include "pthread-win32.h" #else #include #endif -#endif /* * These SSL-related #includes must come after all system-provided headers. @@ -91,16 +89,9 @@ static bool pq_init_crypto_lib = true; static bool ssl_lib_initialized = false; -#ifdef ENABLE_THREAD_SAFETY static long crypto_open_connections = 0; -#ifndef WIN32 static pthread_mutex_t ssl_config_mutex = PTHREAD_MUTEX_INITIALIZER; -#else -static pthread_mutex_t ssl_config_mutex = NULL; -static long win32_ssl_create_mutex = 0; -#endif -#endif /* ENABLE_THREAD_SAFETY */ static PQsslKeyPassHook_OpenSSL_type PQsslKeyPassHook = NULL; static int ssl_protocol_version_to_openssl(const char *protocol); @@ -112,15 +103,12 @@ static int ssl_protocol_version_to_openssl(const char *protocol); void pgtls_init_library(bool do_ssl, int do_crypto) { -#ifdef ENABLE_THREAD_SAFETY - /* * Disallow changing the flags while we have open connections, else we'd * get completely confused. */ if (crypto_open_connections != 0) return; -#endif pq_init_ssl_lib = do_ssl; pq_init_crypto_lib = do_crypto; @@ -207,7 +195,7 @@ pgtls_read(PGconn *conn, void *ptr, size_t len) */ goto rloop; case SSL_ERROR_SYSCALL: - if (n < 0) + if (n < 0 && SOCK_ERRNO != 0) { result_errno = SOCK_ERRNO; if (result_errno == EPIPE || @@ -308,7 +296,13 @@ pgtls_write(PGconn *conn, const void *ptr, size_t len) n = 0; break; case SSL_ERROR_SYSCALL: - if (n < 0) + + /* + * If errno is still zero then assume it's a read EOF situation, + * and report EOF. (This seems possible because SSL_write can + * also do reads.) + */ + if (n < 0 && SOCK_ERRNO != 0) { result_errno = SOCK_ERRNO; if (result_errno == EPIPE || result_errno == ECONNRESET) @@ -364,7 +358,6 @@ pgtls_write(PGconn *conn, const void *ptr, size_t len) return n; } -#if defined(HAVE_X509_GET_SIGNATURE_NID) || defined(HAVE_X509_GET_SIGNATURE_INFO) char * pgtls_get_peer_certificate_hash(PGconn *conn, size_t *len) { @@ -439,7 +432,6 @@ pgtls_get_peer_certificate_hash(PGconn *conn, size_t *len) return cert_hash; } -#endif /* HAVE_X509_GET_SIGNATURE_NID */ /* ------------------------------------------------------------ */ /* OpenSSL specific code */ @@ -720,7 +712,7 @@ pgtls_verify_peer_name_matches_certificate_guts(PGconn *conn, return rc; } -#if defined(ENABLE_THREAD_SAFETY) && defined(HAVE_CRYPTO_LOCK) +#if defined(HAVE_CRYPTO_LOCK) /* * Callback functions for OpenSSL internal locking. (OpenSSL 1.1.0 * does its own locking, and doesn't need these anymore. The @@ -761,7 +753,7 @@ pq_lockingcallback(int mode, int n, const char *file, int line) Assert(false); } } -#endif /* ENABLE_THREAD_SAFETY && HAVE_CRYPTO_LOCK */ +#endif /* HAVE_CRYPTO_LOCK */ /* * Initialize SSL library. @@ -776,21 +768,6 @@ pq_lockingcallback(int mode, int n, const char *file, int line) int pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto) { -#ifdef ENABLE_THREAD_SAFETY -#ifdef WIN32 - /* Also see similar code in fe-connect.c, default_threadlock() */ - if (ssl_config_mutex == NULL) - { - while (InterlockedExchange(&win32_ssl_create_mutex, 1) == 1) - /* loop, another thread own the lock */ ; - if (ssl_config_mutex == NULL) - { - if (pthread_mutex_init(&ssl_config_mutex, NULL)) - return -1; - } - InterlockedExchange(&win32_ssl_create_mutex, 0); - } -#endif if (pthread_mutex_lock(&ssl_config_mutex)) return -1; @@ -842,7 +819,6 @@ pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto) } } #endif /* HAVE_CRYPTO_LOCK */ -#endif /* ENABLE_THREAD_SAFETY */ if (!ssl_lib_initialized && do_ssl) { @@ -859,9 +835,7 @@ pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto) ssl_lib_initialized = true; } -#ifdef ENABLE_THREAD_SAFETY pthread_mutex_unlock(&ssl_config_mutex); -#endif return 0; } @@ -880,8 +854,7 @@ pgtls_init(PGconn *conn, bool do_ssl, bool do_crypto) static void destroy_ssl_system(void) { -#if defined(ENABLE_THREAD_SAFETY) && defined(HAVE_CRYPTO_LOCK) - /* Mutex is created in pgtls_init() */ +#if defined(HAVE_CRYPTO_LOCK) if (pthread_mutex_lock(&ssl_config_mutex)) return; @@ -912,6 +885,9 @@ destroy_ssl_system(void) #endif } +/* See pqcomm.h comments on OpenSSL implementation of ALPN (RFC 7301) */ +static unsigned char alpn_protos[] = PG_ALPN_PROTOCOL_VECTOR; + /* * Create per-connection SSL object, and load the client certificate, * private key, and trusted CA certs. @@ -929,7 +905,6 @@ initialize_SSL(PGconn *conn) bool have_homedir; bool have_cert; bool have_rootcert; - EVP_PKEY *pkey = NULL; /* * We'll need the home directory if any of the relevant parameters are @@ -1261,6 +1236,22 @@ initialize_SSL(PGconn *conn) } } + /* Set ALPN */ + { + int retval; + + retval = SSL_set_alpn_protos(conn->ssl, alpn_protos, sizeof(alpn_protos)); + + if (retval != 0) + { + char *err = SSLerrmessage(ERR_get_error()); + + libpq_append_conn_error(conn, "could not set SSL ALPN extension: %s", err); + SSLerrfree(err); + return -1; + } + } + /* * Read the SSL key. If a key is specified, treat it as an engine:key * combination if there is colon present - we don't support files with @@ -1279,6 +1270,7 @@ initialize_SSL(PGconn *conn) /* Colon, but not in second character, treat as engine:key */ char *engine_str = strdup(conn->sslkey); char *engine_colon; + EVP_PKEY *pkey; if (engine_str == NULL) { @@ -1523,11 +1515,12 @@ open_client_SSL(PGconn *conn) * was using the system CA pool. For other errors, log * them using the normal SYSCALL logging. */ - if (!save_errno && vcode == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY && + if (save_errno == 0 && + vcode == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY && strcmp(conn->sslrootcert, "system") == 0) libpq_append_conn_error(conn, "SSL error: certificate verify failed: %s", X509_verify_cert_error_string(vcode)); - else if (r == -1) + else if (r == -1 && save_errno != 0) libpq_append_conn_error(conn, "SSL SYSCALL error: %s", SOCK_STRERROR(save_errno, sebuf, sizeof(sebuf))); else @@ -1592,6 +1585,34 @@ open_client_SSL(PGconn *conn) } } + /* ALPN is mandatory with direct SSL connections */ + if (conn->current_enc_method == ENC_SSL && conn->sslnegotiation[0] == 'd') + { + const unsigned char *selected; + unsigned int len; + + SSL_get0_alpn_selected(conn->ssl, &selected, &len); + + if (selected == NULL) + { + libpq_append_conn_error(conn, "direct SSL connection was established without ALPN protocol negotiation extension"); + pgtls_close(conn); + return PGRES_POLLING_FAILED; + } + + /* + * We only support one protocol so that's what the negotiation should + * always choose, but doesn't hurt to check. + */ + if (len != strlen(PG_ALPN_PROTOCOL) || + memcmp(selected, PG_ALPN_PROTOCOL, strlen(PG_ALPN_PROTOCOL)) != 0) + { + libpq_append_conn_error(conn, "SSL connection was established with unexpected ALPN protocol"); + pgtls_close(conn); + return PGRES_POLLING_FAILED; + } + } + /* * We already checked the server certificate in initialize_SSL() using * SSL_CTX_set_verify(), if root.crt exists. @@ -1638,6 +1659,7 @@ pgtls_close(PGconn *conn) SSL_free(conn->ssl); conn->ssl = NULL; conn->ssl_in_use = false; + conn->ssl_handshake_started = false; destroy_needed = true; } @@ -1661,7 +1683,7 @@ pgtls_close(PGconn *conn) { /* * In the non-SSL case, just remove the crypto callbacks if the - * connection has then loaded. This code path has no dependency on + * connection has them loaded. This code path has no dependency on * any pending SSL calls. */ if (conn->crypto_loaded) @@ -1688,10 +1710,11 @@ pgtls_close(PGconn *conn) * Obtain reason string for passed SSL errcode * * ERR_get_error() is used by caller to get errcode to pass here. + * The result must be freed after use, using SSLerrfree. * - * Some caution is needed here since ERR_reason_error_string will - * return NULL if it doesn't recognize the error code. We don't - * want to return NULL ever. + * Some caution is needed here since ERR_reason_error_string will return NULL + * if it doesn't recognize the error code, or (in OpenSSL >= 3) if the code + * represents a system errno value. We don't want to return NULL ever. */ static char ssl_nomem[] = "out of memory allocating error description"; @@ -1717,6 +1740,40 @@ SSLerrmessage(unsigned long ecode) strlcpy(errbuf, errreason, SSL_ERR_LEN); return errbuf; } + + /* + * Server aborted the connection with TLS "no_application_protocol" alert. + * The ERR_reason_error_string() function doesn't give any error string + * for that for some reason, so do it ourselves. See + * https://github.com/openssl/openssl/issues/24300. This is available in + * OpenSSL 1.1.0 and later, as well as in LibreSSL 3.4.3 (OpenBSD 7.0) and + * later. + */ +#ifdef SSL_AD_NO_APPLICATION_PROTOCOL + if (ERR_GET_LIB(ecode) == ERR_LIB_SSL && + ERR_GET_REASON(ecode) == SSL_AD_REASON_OFFSET + SSL_AD_NO_APPLICATION_PROTOCOL) + { + snprintf(errbuf, SSL_ERR_LEN, "no application protocol"); + return errbuf; + } +#endif + + /* + * In OpenSSL 3.0.0 and later, ERR_reason_error_string does not map system + * errno values anymore. (See OpenSSL source code for the explanation.) + * We can cover that shortcoming with this bit of code. Older OpenSSL + * versions don't have the ERR_SYSTEM_ERROR macro, but that's okay because + * they don't have the shortcoming either. + */ +#ifdef ERR_SYSTEM_ERROR + if (ERR_SYSTEM_ERROR(ecode)) + { + strerror_r(ERR_GET_REASON(ecode), errbuf, SSL_ERR_LEN); + return errbuf; + } +#endif + + /* No choice but to report the numeric ecode */ snprintf(errbuf, SSL_ERR_LEN, libpq_gettext("SSL error code %lu"), ecode); return errbuf; } @@ -1762,6 +1819,7 @@ PQsslAttributeNames(PGconn *conn) "cipher", "compression", "protocol", + "alpn", NULL }; static const char *const empty_attrs[] = {NULL}; @@ -1816,6 +1874,21 @@ PQsslAttribute(PGconn *conn, const char *attribute_name) if (strcmp(attribute_name, "protocol") == 0) return SSL_get_version(conn->ssl); + if (strcmp(attribute_name, "alpn") == 0) + { + const unsigned char *data; + unsigned int len; + static char alpn_str[256]; /* alpn doesn't support longer than 255 + * bytes */ + + SSL_get0_alpn_selected(conn->ssl, &data, &len); + if (data == NULL || len == 0 || len > sizeof(alpn_str) - 1) + return ""; + memcpy(alpn_str, data, len); + alpn_str[len] = 0; + return alpn_str; + } + return NULL; /* unknown attribute */ } @@ -1826,23 +1899,18 @@ PQsslAttribute(PGconn *conn, const char *attribute_name) * * These functions are closely modelled on the standard socket BIO in OpenSSL; * see sock_read() and sock_write() in OpenSSL's crypto/bio/bss_sock.c. - * XXX OpenSSL 1.0.1e considers many more errcodes than just EINTR as reasons - * to retry; do we need to adopt their logic for that? */ -#ifndef HAVE_BIO_GET_DATA -#define BIO_get_data(bio) (bio->ptr) -#define BIO_set_data(bio, data) (bio->ptr = data) -#endif - +/* protected by ssl_config_mutex */ static BIO_METHOD *my_bio_methods; static int my_sock_read(BIO *h, char *buf, int size) { + PGconn *conn = (PGconn *) BIO_get_app_data(h); int res; - res = pqsecure_raw_read((PGconn *) BIO_get_data(h), buf, size); + res = pqsecure_raw_read(conn, buf, size); BIO_clear_retry_flags(h); if (res < 0) { @@ -1864,6 +1932,9 @@ my_sock_read(BIO *h, char *buf, int size) } } + if (res > 0) + conn->ssl_handshake_started = true; + return res; } @@ -1872,7 +1943,7 @@ my_sock_write(BIO *h, const char *buf, int size) { int res; - res = pqsecure_raw_write((PGconn *) BIO_get_data(h), buf, size); + res = pqsecure_raw_write((PGconn *) BIO_get_app_data(h), buf, size); BIO_clear_retry_flags(h); if (res < 0) { @@ -1900,6 +1971,13 @@ my_sock_write(BIO *h, const char *buf, int size) static BIO_METHOD * my_BIO_s_socket(void) { + BIO_METHOD *res; + + if (pthread_mutex_lock(&ssl_config_mutex)) + return NULL; + + res = my_bio_methods; + if (!my_bio_methods) { BIO_METHOD *biom = (BIO_METHOD *) BIO_s_socket(); @@ -1908,39 +1986,51 @@ my_BIO_s_socket(void) my_bio_index = BIO_get_new_index(); if (my_bio_index == -1) - return NULL; + goto err; my_bio_index |= (BIO_TYPE_DESCRIPTOR | BIO_TYPE_SOURCE_SINK); - my_bio_methods = BIO_meth_new(my_bio_index, "libpq socket"); - if (!my_bio_methods) - return NULL; + res = BIO_meth_new(my_bio_index, "libpq socket"); + if (!res) + goto err; /* * As of this writing, these functions never fail. But check anyway, * like OpenSSL's own examples do. */ - if (!BIO_meth_set_write(my_bio_methods, my_sock_write) || - !BIO_meth_set_read(my_bio_methods, my_sock_read) || - !BIO_meth_set_gets(my_bio_methods, BIO_meth_get_gets(biom)) || - !BIO_meth_set_puts(my_bio_methods, BIO_meth_get_puts(biom)) || - !BIO_meth_set_ctrl(my_bio_methods, BIO_meth_get_ctrl(biom)) || - !BIO_meth_set_create(my_bio_methods, BIO_meth_get_create(biom)) || - !BIO_meth_set_destroy(my_bio_methods, BIO_meth_get_destroy(biom)) || - !BIO_meth_set_callback_ctrl(my_bio_methods, BIO_meth_get_callback_ctrl(biom))) + if (!BIO_meth_set_write(res, my_sock_write) || + !BIO_meth_set_read(res, my_sock_read) || + !BIO_meth_set_gets(res, BIO_meth_get_gets(biom)) || + !BIO_meth_set_puts(res, BIO_meth_get_puts(biom)) || + !BIO_meth_set_ctrl(res, BIO_meth_get_ctrl(biom)) || + !BIO_meth_set_create(res, BIO_meth_get_create(biom)) || + !BIO_meth_set_destroy(res, BIO_meth_get_destroy(biom)) || + !BIO_meth_set_callback_ctrl(res, BIO_meth_get_callback_ctrl(biom))) { - BIO_meth_free(my_bio_methods); - my_bio_methods = NULL; - return NULL; + goto err; } #else - my_bio_methods = malloc(sizeof(BIO_METHOD)); - if (!my_bio_methods) - return NULL; - memcpy(my_bio_methods, biom, sizeof(BIO_METHOD)); - my_bio_methods->bread = my_sock_read; - my_bio_methods->bwrite = my_sock_write; + res = malloc(sizeof(BIO_METHOD)); + if (!res) + goto err; + memcpy(res, biom, sizeof(BIO_METHOD)); + res->bread = my_sock_read; + res->bwrite = my_sock_write; #endif } - return my_bio_methods; + + my_bio_methods = res; + pthread_mutex_unlock(&ssl_config_mutex); + return res; + +err: +#ifdef HAVE_BIO_METH_NEW + if (res) + BIO_meth_free(res); +#else + if (res) + free(res); +#endif + pthread_mutex_unlock(&ssl_config_mutex); + return NULL; } /* This should exactly match OpenSSL's SSL_set_fd except for using my BIO */ @@ -1963,7 +2053,7 @@ my_SSL_set_fd(PGconn *conn, int fd) SSLerr(SSL_F_SSL_SET_FD, ERR_R_BUF_LIB); goto err; } - BIO_set_data(bio, conn); + BIO_set_app_data(bio, conn); SSL_set_bio(conn->ssl, bio, bio); BIO_set_fd(bio, fd, BIO_NOCLOSE); diff --git a/src/interfaces/libpq/fe-secure.c b/src/interfaces/libpq/fe-secure.c index 8069e381424ac..f628082337ebc 100644 --- a/src/interfaces/libpq/fe-secure.c +++ b/src/interfaces/libpq/fe-secure.c @@ -6,7 +6,7 @@ * message integrity and endpoint authentication. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -35,13 +35,11 @@ #include -#ifdef ENABLE_THREAD_SAFETY #ifdef WIN32 #include "pthread-win32.h" #else #include #endif -#endif #include "fe-auth.h" #include "libpq-fe.h" @@ -56,8 +54,6 @@ #define SIGPIPE_MASKED(conn) ((conn)->sigpipe_so || (conn)->sigpipe_flag) -#ifdef ENABLE_THREAD_SAFETY - struct sigpipe_info { sigset_t oldsigmask; @@ -90,24 +86,6 @@ struct sigpipe_info pq_reset_sigpipe(&(spinfo).oldsigmask, (spinfo).sigpipe_pending, \ (spinfo).got_epipe); \ } while (0) -#else /* !ENABLE_THREAD_SAFETY */ - -#define DECLARE_SIGPIPE_INFO(spinfo) pqsigfunc spinfo = NULL - -#define DISABLE_SIGPIPE(conn, spinfo, failaction) \ - do { \ - if (!SIGPIPE_MASKED(conn)) \ - spinfo = pqsignal(SIGPIPE, SIG_IGN); \ - } while (0) - -#define REMEMBER_EPIPE(spinfo, cond) - -#define RESTORE_SIGPIPE(conn, spinfo) \ - do { \ - if (!SIGPIPE_MASKED(conn)) \ - pqsignal(SIGPIPE, spinfo); \ - } while (0) -#endif /* ENABLE_THREAD_SAFETY */ #else /* WIN32 */ #define DECLARE_SIGPIPE_INFO(spinfo) @@ -233,6 +211,8 @@ pqsecure_raw_read(PGconn *conn, void *ptr, size_t len) int result_errno = 0; char sebuf[PG_STRERROR_R_BUFLEN]; + SOCK_ERRNO_SET(0); + n = recv(conn->sock, ptr, len, 0); if (n < 0) @@ -259,6 +239,11 @@ pqsecure_raw_read(PGconn *conn, void *ptr, size_t len) "\tbefore or while processing the request."); break; + case 0: + /* If errno didn't get set, treat it as regular EOF */ + n = 0; + break; + default: libpq_append_conn_error(conn, "could not receive data from server: %s", SOCK_STRERROR(result_errno, @@ -524,7 +509,7 @@ PQgssEncInUse(PGconn *conn) #endif /* ENABLE_GSS */ -#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32) +#if !defined(WIN32) /* * Block SIGPIPE for this thread. This prevents send()/write() from exiting @@ -608,4 +593,4 @@ pq_reset_sigpipe(sigset_t *osigset, bool sigpipe_pending, bool got_epipe) SOCK_ERRNO_SET(save_errno); } -#endif /* ENABLE_THREAD_SAFETY && !WIN32 */ +#endif /* !WIN32 */ diff --git a/src/interfaces/libpq/fe-trace.c b/src/interfaces/libpq/fe-trace.c index 402784f40e3e1..d7a61ec9cc172 100644 --- a/src/interfaces/libpq/fe-trace.c +++ b/src/interfaces/libpq/fe-trace.c @@ -3,7 +3,7 @@ * fe-trace.c * functions for libpq protocol tracing * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -215,9 +215,8 @@ pqTraceOutputNchar(FILE *pfdebug, int len, const char *data, int *cursor) * Output functions by protocol message type */ -/* NotificationResponse */ static void -pqTraceOutputA(FILE *f, const char *message, int *cursor, bool regress) +pqTraceOutput_NotificationResponse(FILE *f, const char *message, int *cursor, bool regress) { fprintf(f, "NotificationResponse\t"); pqTraceOutputInt32(f, message, cursor, regress); @@ -225,9 +224,8 @@ pqTraceOutputA(FILE *f, const char *message, int *cursor, bool regress) pqTraceOutputString(f, message, cursor, false); } -/* Bind */ static void -pqTraceOutputB(FILE *f, const char *message, int *cursor) +pqTraceOutput_Bind(FILE *f, const char *message, int *cursor) { int nparams; @@ -256,52 +254,48 @@ pqTraceOutputB(FILE *f, const char *message, int *cursor) pqTraceOutputInt16(f, message, cursor); } -/* Close(F) or CommandComplete(B) */ static void -pqTraceOutputC(FILE *f, bool toServer, const char *message, int *cursor) +pqTraceOutput_Close(FILE *f, const char *message, int *cursor) { - if (toServer) - { - fprintf(f, "Close\t"); - pqTraceOutputByte1(f, message, cursor); - pqTraceOutputString(f, message, cursor, false); - } - else - { - fprintf(f, "CommandComplete\t"); - pqTraceOutputString(f, message, cursor, false); - } + fprintf(f, "Close\t"); + pqTraceOutputByte1(f, message, cursor); + pqTraceOutputString(f, message, cursor, false); +} + +static void +pqTraceOutput_CommandComplete(FILE *f, const char *message, int *cursor) +{ + fprintf(f, "CommandComplete\t"); + pqTraceOutputString(f, message, cursor, false); } -/* Describe(F) or DataRow(B) */ static void -pqTraceOutputD(FILE *f, bool toServer, const char *message, int *cursor) +pqTraceOutput_DataRow(FILE *f, const char *message, int *cursor) { - if (toServer) + int nfields; + int len; + int i; + + fprintf(f, "DataRow\t"); + nfields = pqTraceOutputInt16(f, message, cursor); + for (i = 0; i < nfields; i++) { - fprintf(f, "Describe\t"); - pqTraceOutputByte1(f, message, cursor); - pqTraceOutputString(f, message, cursor, false); + len = pqTraceOutputInt32(f, message, cursor, false); + if (len == -1) + continue; + pqTraceOutputNchar(f, len, message, cursor); } - else - { - int nfields; - int len; - int i; +} - fprintf(f, "DataRow\t"); - nfields = pqTraceOutputInt16(f, message, cursor); - for (i = 0; i < nfields; i++) - { - len = pqTraceOutputInt32(f, message, cursor, false); - if (len == -1) - continue; - pqTraceOutputNchar(f, len, message, cursor); - } - } +static void +pqTraceOutput_Describe(FILE *f, const char *message, int *cursor) +{ + fprintf(f, "Describe\t"); + pqTraceOutputByte1(f, message, cursor); + pqTraceOutputString(f, message, cursor, false); } -/* NoticeResponse / ErrorResponse */ +/* shared code NoticeResponse / ErrorResponse */ static void pqTraceOutputNR(FILE *f, const char *type, const char *message, int *cursor, bool regress) @@ -322,31 +316,35 @@ pqTraceOutputNR(FILE *f, const char *type, const char *message, int *cursor, } } -/* Execute(F) or ErrorResponse(B) */ static void -pqTraceOutputE(FILE *f, bool toServer, const char *message, int *cursor, bool regress) +pqTraceOutput_ErrorResponse(FILE *f, const char *message, int *cursor, bool regress) { - if (toServer) - { - fprintf(f, "Execute\t"); - pqTraceOutputString(f, message, cursor, false); - pqTraceOutputInt32(f, message, cursor, false); - } - else - pqTraceOutputNR(f, "ErrorResponse", message, cursor, regress); + pqTraceOutputNR(f, "ErrorResponse", message, cursor, regress); +} + +static void +pqTraceOutput_NoticeResponse(FILE *f, const char *message, int *cursor, bool regress) +{ + pqTraceOutputNR(f, "NoticeResponse", message, cursor, regress); } -/* CopyFail */ static void -pqTraceOutputf(FILE *f, const char *message, int *cursor) +pqTraceOutput_Execute(FILE *f, const char *message, int *cursor, bool regress) +{ + fprintf(f, "Execute\t"); + pqTraceOutputString(f, message, cursor, false); + pqTraceOutputInt32(f, message, cursor, false); +} + +static void +pqTraceOutput_CopyFail(FILE *f, const char *message, int *cursor) { fprintf(f, "CopyFail\t"); pqTraceOutputString(f, message, cursor, false); } -/* FunctionCall */ static void -pqTraceOutputF(FILE *f, const char *message, int *cursor, bool regress) +pqTraceOutput_FunctionCall(FILE *f, const char *message, int *cursor, bool regress) { int nfields; int nbytes; @@ -371,9 +369,8 @@ pqTraceOutputF(FILE *f, const char *message, int *cursor, bool regress) pqTraceOutputInt16(f, message, cursor); } -/* CopyInResponse */ static void -pqTraceOutputG(FILE *f, const char *message, int *cursor) +pqTraceOutput_CopyInResponse(FILE *f, const char *message, int *cursor) { int nfields; @@ -385,9 +382,8 @@ pqTraceOutputG(FILE *f, const char *message, int *cursor) pqTraceOutputInt16(f, message, cursor); } -/* CopyOutResponse */ static void -pqTraceOutputH(FILE *f, const char *message, int *cursor) +pqTraceOutput_CopyOutResponse(FILE *f, const char *message, int *cursor) { int nfields; @@ -399,18 +395,16 @@ pqTraceOutputH(FILE *f, const char *message, int *cursor) pqTraceOutputInt16(f, message, cursor); } -/* BackendKeyData */ static void -pqTraceOutputK(FILE *f, const char *message, int *cursor, bool regress) +pqTraceOutput_BackendKeyData(FILE *f, const char *message, int *cursor, bool regress) { fprintf(f, "BackendKeyData\t"); pqTraceOutputInt32(f, message, cursor, regress); pqTraceOutputInt32(f, message, cursor, regress); } -/* Parse */ static void -pqTraceOutputP(FILE *f, const char *message, int *cursor, bool regress) +pqTraceOutput_Parse(FILE *f, const char *message, int *cursor, bool regress) { int nparams; @@ -423,34 +417,30 @@ pqTraceOutputP(FILE *f, const char *message, int *cursor, bool regress) pqTraceOutputInt32(f, message, cursor, regress); } -/* Query */ static void -pqTraceOutputQ(FILE *f, const char *message, int *cursor) +pqTraceOutput_Query(FILE *f, const char *message, int *cursor) { fprintf(f, "Query\t"); pqTraceOutputString(f, message, cursor, false); } -/* Authentication */ static void -pqTraceOutputR(FILE *f, const char *message, int *cursor) +pqTraceOutput_Authentication(FILE *f, const char *message, int *cursor) { fprintf(f, "Authentication\t"); pqTraceOutputInt32(f, message, cursor, false); } -/* ParameterStatus */ static void -pqTraceOutputS(FILE *f, const char *message, int *cursor) +pqTraceOutput_ParameterStatus(FILE *f, const char *message, int *cursor) { fprintf(f, "ParameterStatus\t"); pqTraceOutputString(f, message, cursor, false); pqTraceOutputString(f, message, cursor, false); } -/* ParameterDescription */ static void -pqTraceOutputt(FILE *f, const char *message, int *cursor, bool regress) +pqTraceOutput_ParameterDescription(FILE *f, const char *message, int *cursor, bool regress) { int nfields; @@ -461,9 +451,8 @@ pqTraceOutputt(FILE *f, const char *message, int *cursor, bool regress) pqTraceOutputInt32(f, message, cursor, regress); } -/* RowDescription */ static void -pqTraceOutputT(FILE *f, const char *message, int *cursor, bool regress) +pqTraceOutput_RowDescription(FILE *f, const char *message, int *cursor, bool regress) { int nfields; @@ -482,18 +471,16 @@ pqTraceOutputT(FILE *f, const char *message, int *cursor, bool regress) } } -/* NegotiateProtocolVersion */ static void -pqTraceOutputv(FILE *f, const char *message, int *cursor) +pqTraceOutput_NegotiateProtocolVersion(FILE *f, const char *message, int *cursor) { fprintf(f, "NegotiateProtocolVersion\t"); pqTraceOutputInt32(f, message, cursor, false); pqTraceOutputInt32(f, message, cursor, false); } -/* FunctionCallResponse */ static void -pqTraceOutputV(FILE *f, const char *message, int *cursor) +pqTraceOutput_FunctionCallResponse(FILE *f, const char *message, int *cursor) { int len; @@ -503,9 +490,8 @@ pqTraceOutputV(FILE *f, const char *message, int *cursor) pqTraceOutputNchar(f, len, message, cursor); } -/* CopyBothResponse */ static void -pqTraceOutputW(FILE *f, const char *message, int *cursor, int length) +pqTraceOutput_CopyBothResponse(FILE *f, const char *message, int *cursor, int length) { fprintf(f, "CopyBothResponse\t"); pqTraceOutputByte1(f, message, cursor); @@ -514,9 +500,8 @@ pqTraceOutputW(FILE *f, const char *message, int *cursor, int length) pqTraceOutputInt16(f, message, cursor); } -/* ReadyForQuery */ static void -pqTraceOutputZ(FILE *f, const char *message, int *cursor) +pqTraceOutput_ReadyForQuery(FILE *f, const char *message, int *cursor) { fprintf(f, "ReadyForQuery\t"); pqTraceOutputByte1(f, message, cursor); @@ -555,118 +540,135 @@ pqTraceOutputMessage(PGconn *conn, const char *message, bool toServer) * name) fields can change as server code is modified, and if their * lengths differ from the originals, that would break tests. */ - if (regress && !toServer && (id == 'E' || id == 'N')) + if (regress && !toServer && (id == PqMsg_ErrorResponse || id == PqMsg_NoticeResponse)) fprintf(conn->Pfdebug, "%s\tNN\t", prefix); else fprintf(conn->Pfdebug, "%s\t%d\t", prefix, length); switch (id) { - case '1': + case PqMsg_ParseComplete: fprintf(conn->Pfdebug, "ParseComplete"); /* No message content */ break; - case '2': + case PqMsg_BindComplete: fprintf(conn->Pfdebug, "BindComplete"); /* No message content */ break; - case '3': + case PqMsg_CloseComplete: fprintf(conn->Pfdebug, "CloseComplete"); /* No message content */ break; - case 'A': /* Notification Response */ - pqTraceOutputA(conn->Pfdebug, message, &logCursor, regress); + case PqMsg_NotificationResponse: + pqTraceOutput_NotificationResponse(conn->Pfdebug, message, &logCursor, regress); break; - case 'B': /* Bind */ - pqTraceOutputB(conn->Pfdebug, message, &logCursor); + case PqMsg_Bind: + pqTraceOutput_Bind(conn->Pfdebug, message, &logCursor); break; - case 'c': + case PqMsg_CopyDone: fprintf(conn->Pfdebug, "CopyDone"); /* No message content */ break; - case 'C': /* Close(F) or Command Complete(B) */ - pqTraceOutputC(conn->Pfdebug, toServer, message, &logCursor); + case PqMsg_CommandComplete: + /* Close(F) and CommandComplete(B) use the same identifier. */ + Assert(PqMsg_Close == PqMsg_CommandComplete); + if (toServer) + pqTraceOutput_Close(conn->Pfdebug, message, &logCursor); + else + pqTraceOutput_CommandComplete(conn->Pfdebug, message, &logCursor); break; - case 'd': /* Copy Data */ + case PqMsg_CopyData: /* Drop COPY data to reduce the overhead of logging. */ break; - case 'D': /* Describe(F) or Data Row(B) */ - pqTraceOutputD(conn->Pfdebug, toServer, message, &logCursor); + case PqMsg_Describe: + /* Describe(F) and DataRow(B) use the same identifier. */ + Assert(PqMsg_Describe == PqMsg_DataRow); + if (toServer) + pqTraceOutput_Describe(conn->Pfdebug, message, &logCursor); + else + pqTraceOutput_DataRow(conn->Pfdebug, message, &logCursor); break; - case 'E': /* Execute(F) or Error Response(B) */ - pqTraceOutputE(conn->Pfdebug, toServer, message, &logCursor, - regress); + case PqMsg_Execute: + /* Execute(F) and ErrorResponse(B) use the same identifier. */ + Assert(PqMsg_Execute == PqMsg_ErrorResponse); + if (toServer) + pqTraceOutput_Execute(conn->Pfdebug, message, &logCursor, regress); + else + pqTraceOutput_ErrorResponse(conn->Pfdebug, message, &logCursor, regress); break; - case 'f': /* Copy Fail */ - pqTraceOutputf(conn->Pfdebug, message, &logCursor); + case PqMsg_CopyFail: + pqTraceOutput_CopyFail(conn->Pfdebug, message, &logCursor); break; - case 'F': /* Function Call */ - pqTraceOutputF(conn->Pfdebug, message, &logCursor, regress); + case PqMsg_FunctionCall: + pqTraceOutput_FunctionCall(conn->Pfdebug, message, &logCursor, regress); break; - case 'G': /* Start Copy In */ - pqTraceOutputG(conn->Pfdebug, message, &logCursor); + case PqMsg_CopyInResponse: + pqTraceOutput_CopyInResponse(conn->Pfdebug, message, &logCursor); break; - case 'H': /* Flush(F) or Start Copy Out(B) */ - if (!toServer) - pqTraceOutputH(conn->Pfdebug, message, &logCursor); - else + case PqMsg_Flush: + /* Flush(F) and CopyOutResponse(B) use the same identifier */ + Assert(PqMsg_CopyOutResponse == PqMsg_Flush); + if (toServer) fprintf(conn->Pfdebug, "Flush"); /* no message content */ + else + pqTraceOutput_CopyOutResponse(conn->Pfdebug, message, &logCursor); break; - case 'I': + case PqMsg_EmptyQueryResponse: fprintf(conn->Pfdebug, "EmptyQueryResponse"); /* No message content */ break; - case 'K': /* secret key data from the backend */ - pqTraceOutputK(conn->Pfdebug, message, &logCursor, regress); + case PqMsg_BackendKeyData: + pqTraceOutput_BackendKeyData(conn->Pfdebug, message, &logCursor, regress); break; - case 'n': + case PqMsg_NoData: fprintf(conn->Pfdebug, "NoData"); /* No message content */ break; - case 'N': - pqTraceOutputNR(conn->Pfdebug, "NoticeResponse", message, - &logCursor, regress); + case PqMsg_NoticeResponse: + pqTraceOutput_NoticeResponse(conn->Pfdebug, message, &logCursor, regress); break; - case 'P': /* Parse */ - pqTraceOutputP(conn->Pfdebug, message, &logCursor, regress); + case PqMsg_Parse: + pqTraceOutput_Parse(conn->Pfdebug, message, &logCursor, regress); break; - case 'Q': /* Query */ - pqTraceOutputQ(conn->Pfdebug, message, &logCursor); + case PqMsg_Query: + pqTraceOutput_Query(conn->Pfdebug, message, &logCursor); break; - case 'R': /* Authentication */ - pqTraceOutputR(conn->Pfdebug, message, &logCursor); + case PqMsg_AuthenticationRequest: + pqTraceOutput_Authentication(conn->Pfdebug, message, &logCursor); break; - case 's': + case PqMsg_PortalSuspended: fprintf(conn->Pfdebug, "PortalSuspended"); /* No message content */ break; - case 'S': /* Parameter Status(B) or Sync(F) */ - if (!toServer) - pqTraceOutputS(conn->Pfdebug, message, &logCursor); - else + case PqMsg_Sync: + /* ParameterStatus(B) and Sync(F) use the same identifier */ + Assert(PqMsg_ParameterStatus == PqMsg_Sync); + if (toServer) fprintf(conn->Pfdebug, "Sync"); /* no message content */ + else + pqTraceOutput_ParameterStatus(conn->Pfdebug, message, &logCursor); break; - case 't': /* Parameter Description */ - pqTraceOutputt(conn->Pfdebug, message, &logCursor, regress); + case PqMsg_ParameterDescription: + pqTraceOutput_ParameterDescription(conn->Pfdebug, message, &logCursor, regress); break; - case 'T': /* Row Description */ - pqTraceOutputT(conn->Pfdebug, message, &logCursor, regress); + case PqMsg_RowDescription: + pqTraceOutput_RowDescription(conn->Pfdebug, message, &logCursor, regress); break; - case 'v': /* Negotiate Protocol Version */ - pqTraceOutputv(conn->Pfdebug, message, &logCursor); + case PqMsg_NegotiateProtocolVersion: + pqTraceOutput_NegotiateProtocolVersion(conn->Pfdebug, message, &logCursor); break; - case 'V': /* Function Call response */ - pqTraceOutputV(conn->Pfdebug, message, &logCursor); + case PqMsg_FunctionCallResponse: + pqTraceOutput_FunctionCallResponse(conn->Pfdebug, message, &logCursor); break; - case 'W': /* Start Copy Both */ - pqTraceOutputW(conn->Pfdebug, message, &logCursor, length); + case PqMsg_CopyBothResponse: + pqTraceOutput_CopyBothResponse(conn->Pfdebug, message, &logCursor, length); break; - case 'X': + case PqMsg_Terminate: fprintf(conn->Pfdebug, "Terminate"); /* No message content */ break; - case 'Z': /* Ready For Query */ - pqTraceOutputZ(conn->Pfdebug, message, &logCursor); + case PqMsg_ReadyForQuery: + pqTraceOutput_ReadyForQuery(conn->Pfdebug, message, &logCursor); break; default: fprintf(conn->Pfdebug, "Unknown message: %02x", id); diff --git a/src/interfaces/libpq/legacy-pqsignal.c b/src/interfaces/libpq/legacy-pqsignal.c index 790ab5a18c07c..6db349bcbc123 100644 --- a/src/interfaces/libpq/legacy-pqsignal.c +++ b/src/interfaces/libpq/legacy-pqsignal.c @@ -4,7 +4,7 @@ * reliable BSD-style signal(2) routine stolen from RWW who stole it * from Stevens... * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -28,10 +28,16 @@ * with the semantics it had in 9.2; in particular, this has different * behavior for SIGALRM than the version in src/port/pqsignal.c. * - * libpq itself uses this only for SIGPIPE (and even then, only in - * non-ENABLE_THREAD_SAFETY builds), so the incompatibility isn't - * troublesome for internal references. + * libpq itself does not use this, nor does anything else in our code. + * + * src/include/port.h will #define pqsignal as pqsignal_fe, + * but here we want to export just plain "pqsignal". We can't rely on + * port.h's extern declaration either. (The point of that #define + * is to ensure that no in-tree code accidentally calls this version.) */ +#undef pqsignal +extern pqsigfunc pqsignal(int signo, pqsigfunc func); + pqsigfunc pqsignal(int signo, pqsigfunc func) { diff --git a/src/interfaces/libpq/libpq-events.c b/src/interfaces/libpq/libpq-events.c index 229bed910f403..c9d156ac35abb 100644 --- a/src/interfaces/libpq/libpq-events.c +++ b/src/interfaces/libpq/libpq-events.c @@ -3,7 +3,7 @@ * libpq-events.c * functions for supporting the libpq "events" API * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/interfaces/libpq/libpq-events.h b/src/interfaces/libpq/libpq-events.h index b9d513763424c..21af13b34d81f 100644 --- a/src/interfaces/libpq/libpq-events.h +++ b/src/interfaces/libpq/libpq-events.h @@ -5,7 +5,7 @@ * that invoke the libpq "events" API, but are not interesting to * ordinary users of libpq. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/interfaces/libpq/libpq-events.h diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h index 7476dbe0e90f5..ca3e028a512d0 100644 --- a/src/interfaces/libpq/libpq-fe.h +++ b/src/interfaces/libpq/libpq-fe.h @@ -4,7 +4,7 @@ * This file contains definitions for structures and * externs for functions used by frontend postgres applications. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/interfaces/libpq/libpq-fe.h @@ -30,15 +30,32 @@ extern "C" /* * These symbols may be used in compile-time #ifdef tests for the availability - * of newer libpq features. + * of v14-and-newer libpq features. */ +/* Features added in PostgreSQL v14: */ /* Indicates presence of PQenterPipelineMode and friends */ #define LIBPQ_HAS_PIPELINING 1 /* Indicates presence of PQsetTraceFlags; also new PQtrace output format */ #define LIBPQ_HAS_TRACE_FLAGS 1 + +/* Features added in PostgreSQL v15: */ /* Indicates that PQsslAttribute(NULL, "library") is useful */ #define LIBPQ_HAS_SSL_LIBRARY_DETECTION 1 +/* Features added in PostgreSQL v17: */ +/* Indicates presence of PGcancelConn typedef and associated routines */ +#define LIBPQ_HAS_ASYNC_CANCEL 1 +/* Indicates presence of PQchangePassword */ +#define LIBPQ_HAS_CHANGE_PASSWORD 1 +/* Indicates presence of PQsetChunkedRowsMode, PGRES_TUPLES_CHUNK */ +#define LIBPQ_HAS_CHUNK_MODE 1 +/* Indicates presence of PQclosePrepared, PQclosePortal, etc */ +#define LIBPQ_HAS_CLOSE_PREPARED 1 +/* Indicates presence of PQsendPipelineSync */ +#define LIBPQ_HAS_SEND_PIPELINE_SYNC 1 +/* Indicates presence of PQsocketPoll, PQgetCurrentTimeUSec */ +#define LIBPQ_HAS_SOCKET_POLL 1 + /* * Option flags for PQcopyResult */ @@ -72,13 +89,16 @@ typedef enum CONNECTION_AUTH_OK, /* Received authentication; waiting for * backend startup. */ CONNECTION_SETENV, /* This state is no longer used. */ - CONNECTION_SSL_STARTUP, /* Negotiating SSL. */ - CONNECTION_NEEDED, /* Internal state: connect() needed */ + CONNECTION_SSL_STARTUP, /* Performing SSL handshake. */ + CONNECTION_NEEDED, /* Internal state: connect() needed. */ CONNECTION_CHECK_WRITABLE, /* Checking if session is read-write. */ CONNECTION_CONSUME, /* Consuming any extra messages. */ CONNECTION_GSS_STARTUP, /* Negotiating GSSAPI. */ - CONNECTION_CHECK_TARGET, /* Checking target server properties. */ - CONNECTION_CHECK_STANDBY /* Checking if server is in standby mode. */ + CONNECTION_CHECK_TARGET, /* Internal state: checking target server + * properties. */ + CONNECTION_CHECK_STANDBY, /* Checking if server is in standby mode. */ + CONNECTION_ALLOCATED, /* Waiting for connection attempt to be + * started. */ } ConnStatusType; typedef enum @@ -87,8 +107,7 @@ typedef enum PGRES_POLLING_READING, /* These two indicate that one may */ PGRES_POLLING_WRITING, /* use select before polling again. */ PGRES_POLLING_OK, - PGRES_POLLING_ACTIVE /* unused; keep for awhile for backwards - * compatibility */ + PGRES_POLLING_ACTIVE /* unused; keep for backwards compatibility */ } PostgresPollingStatusType; typedef enum @@ -109,8 +128,9 @@ typedef enum PGRES_COPY_BOTH, /* Copy In/Out data transfer in progress */ PGRES_SINGLE_TUPLE, /* single tuple from larger resultset */ PGRES_PIPELINE_SYNC, /* pipeline synchronization point */ - PGRES_PIPELINE_ABORTED /* Command didn't run because of an abort + PGRES_PIPELINE_ABORTED, /* Command didn't run because of an abort * earlier in a pipeline */ + PGRES_TUPLES_CHUNK /* chunk of tuples from larger resultset */ } ExecStatusType; typedef enum @@ -165,6 +185,11 @@ typedef enum */ typedef struct pg_conn PGconn; +/* PGcancelConn encapsulates a cancel connection to the backend. + * The contents of this struct are not supposed to be known to applications. + */ +typedef struct pg_cancel_conn PGcancelConn; + /* PGresult encapsulates the result of a query (or more precisely, of a single * SQL command --- a query string given to PQsendQuery can contain multiple * commands and thus return multiple PGresult objects). @@ -193,6 +218,9 @@ typedef struct pgNotify struct pgNotify *next; /* list link */ } PGnotify; +/* pg_usec_time_t is like time_t, but with microsecond resolution */ +typedef pg_int64 pg_usec_time_t; + /* Function types for notice-handling callbacks */ typedef void (*PQnoticeReceiver) (void *arg, const PGresult *res); typedef void (*PQnoticeProcessor) (void *arg, const char *message); @@ -321,16 +349,34 @@ extern PostgresPollingStatusType PQresetPoll(PGconn *conn); /* Synchronous (blocking) */ extern void PQreset(PGconn *conn); +/* Create a PGcancelConn that's used to cancel a query on the given PGconn */ +extern PGcancelConn *PQcancelCreate(PGconn *conn); + +/* issue a cancel request in a non-blocking manner */ +extern int PQcancelStart(PGcancelConn *cancelConn); + +/* issue a blocking cancel request */ +extern int PQcancelBlocking(PGcancelConn *cancelConn); + +/* poll a non-blocking cancel request */ +extern PostgresPollingStatusType PQcancelPoll(PGcancelConn *cancelConn); +extern ConnStatusType PQcancelStatus(const PGcancelConn *cancelConn); +extern int PQcancelSocket(const PGcancelConn *cancelConn); +extern char *PQcancelErrorMessage(const PGcancelConn *cancelConn); +extern void PQcancelReset(PGcancelConn *cancelConn); +extern void PQcancelFinish(PGcancelConn *cancelConn); + + /* request a cancel structure */ extern PGcancel *PQgetCancel(PGconn *conn); /* free a cancel structure */ extern void PQfreeCancel(PGcancel *cancel); -/* issue a cancel request */ +/* deprecated version of PQcancelBlocking, but one which is signal-safe */ extern int PQcancel(PGcancel *cancel, char *errbuf, int errbufsize); -/* backwards compatible version of PQcancel; not thread-safe */ +/* deprecated version of PQcancel; not thread-safe */ extern int PQrequestCancel(PGconn *conn); /* Accessor functions for PGconn objects */ @@ -463,6 +509,7 @@ extern int PQsendQueryPrepared(PGconn *conn, const int *paramFormats, int resultFormat); extern int PQsetSingleRowMode(PGconn *conn); +extern int PQsetChunkedRowsMode(PGconn *conn, int chunkSize); extern PGresult *PQgetResult(PGconn *conn); /* Routines for managing an asynchronous query */ @@ -474,6 +521,7 @@ extern int PQenterPipelineMode(PGconn *conn); extern int PQexitPipelineMode(PGconn *conn); extern int PQpipelineSync(PGconn *conn); extern int PQsendFlushRequest(PGconn *conn); +extern int PQsendPipelineSync(PGconn *conn); /* LISTEN/NOTIFY support */ extern PGnotify *PQnotifies(PGconn *conn); @@ -548,6 +596,12 @@ extern PGresult *PQdescribePortal(PGconn *conn, const char *portal); extern int PQsendDescribePrepared(PGconn *conn, const char *stmt); extern int PQsendDescribePortal(PGconn *conn, const char *portal); +/* Close prepared statements and portals */ +extern PGresult *PQclosePrepared(PGconn *conn, const char *stmt); +extern PGresult *PQclosePortal(PGconn *conn, const char *portal); +extern int PQsendClosePrepared(PGconn *conn, const char *stmt); +extern int PQsendClosePortal(PGconn *conn, const char *portal); + /* Delete a PGresult */ extern void PQclear(PGresult *res); @@ -637,6 +691,13 @@ extern int lo_export(PGconn *conn, Oid lobjId, const char *filename); /* Get the version of the libpq library in use */ extern int PQlibVersion(void); +/* Poll a socket for reading and/or writing with an optional timeout */ +extern int PQsocketPoll(int sock, int forRead, int forWrite, + pg_usec_time_t end_time); + +/* Get current time in the form PQsocketPoll wants */ +extern pg_usec_time_t PQgetCurrentTimeUSec(void); + /* Determine length of multibyte encoded char at *s */ extern int PQmblen(const char *s, int encoding); @@ -653,6 +714,7 @@ extern int PQenv2encoding(void); extern char *PQencryptPassword(const char *passwd, const char *user); extern char *PQencryptPasswordConn(PGconn *conn, const char *passwd, const char *user, const char *algorithm); +extern PGresult *PQchangePassword(PGconn *conn, const char *user, const char *passwd); /* === in encnames.c === */ diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index 0045f83cbfde8..f36d76bf3fedf 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -9,7 +9,7 @@ * more likely to break across PostgreSQL releases than code that uses * only the official API. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/interfaces/libpq/libpq-int.h @@ -31,14 +31,12 @@ #include #endif -#ifdef ENABLE_THREAD_SAFETY #ifdef WIN32 #include "pthread-win32.h" #else #include #endif #include -#endif /* include stuff common to fe and be */ #include "libpq/pqcomm.h" @@ -233,6 +231,12 @@ typedef enum PGASYNC_PIPELINE_IDLE, /* "Idle" between commands in pipeline mode */ } PGAsyncStatusType; +/* Bitmasks for allowed_enc_methods and failed_enc_methods */ +#define ENC_ERROR 0 +#define ENC_PLAINTEXT 0x01 +#define ENC_GSSAPI 0x02 +#define ENC_SSL 0x04 + /* Target server type (decoded value of target_session_attrs) */ typedef enum { @@ -324,7 +328,7 @@ typedef enum PGQUERY_PREPARE, /* Parse only (PQprepare) */ PGQUERY_DESCRIBE, /* Describe Statement or Portal */ PGQUERY_SYNC, /* Sync (at end of a pipeline) */ - PGQUERY_CLOSE + PGQUERY_CLOSE /* Close Statement or Portal */ } PGQueryClass; /* @@ -390,6 +394,7 @@ struct pg_conn char *keepalives_count; /* maximum number of TCP keepalive * retransmits */ char *sslmode; /* SSL mode (require,prefer,allow,disable) */ + char *sslnegotiation; /* SSL initiation style (postgres,direct) */ char *sslcompression; /* SSL compression (0 or 1) */ char *sslkey; /* client key filename */ char *sslcert; /* client certificate filename */ @@ -411,6 +416,10 @@ struct pg_conn char *require_auth; /* name of the expected auth method */ char *load_balance_hosts; /* load balance over hosts */ + bool cancelRequest; /* true if this connection is used to send a + * cancel request, instead of being a normal + * connection that's used for queries */ + /* Optional file to write trace info to */ FILE *Pfdebug; int traceFlags; @@ -432,7 +441,10 @@ struct pg_conn bool nonblocking; /* whether this connection is using nonblock * sending semantics */ PGpipelineStatus pipelineStatus; /* status of pipeline mode */ + bool partialResMode; /* true if single-row or chunked mode */ bool singleRowMode; /* return current query result row-by-row? */ + int maxChunkSize; /* return query result in chunks not exceeding + * this number of rows */ char copy_is_binary; /* 1 = copy binary, 0 = copy text */ int copy_already_done; /* # bytes already returned in COPY OUT */ PGnotify *notifyHead; /* oldest unreported Notify msg */ @@ -533,27 +545,30 @@ struct pg_conn * and error_result is true, then we need to return a PGRES_FATAL_ERROR * result, but haven't yet constructed it; text for the error has been * appended to conn->errorMessage. (Delaying construction simplifies - * dealing with out-of-memory cases.) If next_result isn't NULL, it is a - * PGresult that will replace "result" after we return that one. + * dealing with out-of-memory cases.) If saved_result isn't NULL, it is a + * PGresult that will replace "result" after we return that one; we use + * that in partial-result mode to remember the query's tuple metadata. */ PGresult *result; /* result being constructed */ bool error_result; /* do we need to make an ERROR result? */ - PGresult *next_result; /* next result (used in single-row mode) */ + PGresult *saved_result; /* original, empty result in partialResMode */ /* Assorted state for SASL, SSL, GSS, etc */ const pg_fe_sasl_mech *sasl; void *sasl_state; int scram_sha_256_iterations; + uint8 allowed_enc_methods; + uint8 failed_enc_methods; + uint8 current_enc_method; + /* SSL structures */ bool ssl_in_use; + bool ssl_handshake_started; bool ssl_cert_requested; /* Did the server ask us for a cert? */ bool ssl_cert_sent; /* Did we send one in reply? */ #ifdef USE_SSL - bool allow_ssl_try; /* Allowed to try SSL negotiation */ - bool wait_ssl_try; /* Delay SSL negotiation until after - * attempting normal connection */ #ifdef USE_OPENSSL SSL *ssl; /* SSL status, if have SSL connection */ X509 *peer; /* X509 cert of server */ @@ -576,7 +591,6 @@ struct pg_conn gss_name_t gtarg_nam; /* GSS target name */ /* The following are encryption-only */ - bool try_gss; /* GSS attempting permitted */ bool gssenc; /* GSS encryption is usable */ gss_cred_id_t gcred; /* GSS credential temp storage. */ @@ -585,8 +599,8 @@ struct pg_conn int gss_SendLength; /* End of data available in gss_SendBuffer */ int gss_SendNext; /* Next index to send a byte from * gss_SendBuffer */ - int gss_SendConsumed; /* Number of *unencrypted* bytes consumed - * for current contents of gss_SendBuffer */ + int gss_SendConsumed; /* Number of source bytes encrypted but + * not yet reported as sent */ char *gss_RecvBuffer; /* Received, encrypted data */ int gss_RecvLength; /* End of data available in gss_RecvBuffer */ char *gss_ResultBuffer; /* Decryption of data in gss_RecvBuffer */ @@ -623,24 +637,6 @@ struct pg_conn PQExpBufferData workBuffer; /* expansible string */ }; -/* PGcancel stores all data necessary to cancel a connection. A copy of this - * data is required to safely cancel a connection running on a different - * thread. - */ -struct pg_cancel -{ - SockAddr raddr; /* Remote address */ - int be_pid; /* PID of backend --- needed for cancels */ - int be_key; /* key of backend --- needed for cancels */ - int pgtcp_user_timeout; /* tcp user timeout */ - int keepalives; /* use TCP keepalives? */ - int keepalives_idle; /* time between TCP keepalives */ - int keepalives_interval; /* time between TCP keepalive - * retransmits */ - int keepalives_count; /* maximum number of TCP keepalive - * retransmits */ -}; - /* String descriptions of the ExecStatusTypes. * direct use of this array is deprecated; call PQresStatus() instead. @@ -677,19 +673,26 @@ extern char *const pgresStatus[]; /* === in fe-connect.c === */ extern void pqDropConnection(PGconn *conn, bool flushInput); +extern bool pqConnectOptions2(PGconn *conn); +#if defined(WIN32) && defined(SIO_KEEPALIVE_VALS) +extern int pqSetKeepalivesWin32(pgsocket sock, int idle, int interval); +#endif +extern int pqConnectDBStart(PGconn *conn); +extern int pqConnectDBComplete(PGconn *conn); +extern PGconn *pqMakeEmptyPGconn(void); +extern void pqReleaseConnHosts(PGconn *conn); +extern void pqClosePGconn(PGconn *conn); extern int pqPacketSend(PGconn *conn, char pack_type, const void *buf, size_t buf_len); extern bool pqGetHomeDirectory(char *buf, int bufsize); +extern bool pqCopyPGconn(PGconn *srcConn, PGconn *dstConn); +extern bool pqParseIntParam(const char *value, int *result, PGconn *conn, + const char *context); -#ifdef ENABLE_THREAD_SAFETY extern pgthreadlock_t pg_g_threadlock; #define pglock_thread() pg_g_threadlock(true) #define pgunlock_thread() pg_g_threadlock(false) -#else -#define pglock_thread() ((void) 0) -#define pgunlock_thread() ((void) 0) -#endif /* === in fe-exec.c === */ @@ -705,7 +708,8 @@ extern void pqSaveMessageField(PGresult *res, char code, extern void pqSaveParameterStatus(PGconn *conn, const char *name, const char *value); extern int pqRowProcessor(PGconn *conn, const char **errmsgp); -extern void pqCommandQueueAdvance(PGconn *conn); +extern void pqCommandQueueAdvance(PGconn *conn, bool isReadyForQuery, + bool gotSync); extern int PQsendQueryContinue(PGconn *conn, const char *query); /* === in fe-protocol3.c === */ @@ -751,7 +755,7 @@ extern int pqReadData(PGconn *conn); extern int pqFlush(PGconn *conn); extern int pqWait(int forRead, int forWrite, PGconn *conn); extern int pqWaitTimed(int forRead, int forWrite, PGconn *conn, - time_t finish_time); + pg_usec_time_t end_time); extern int pqReadReady(PGconn *conn); extern int pqWriteReady(PGconn *conn); @@ -765,7 +769,7 @@ extern ssize_t pqsecure_write(PGconn *, const void *ptr, size_t len); extern ssize_t pqsecure_raw_read(PGconn *, void *ptr, size_t len); extern ssize_t pqsecure_raw_write(PGconn *, const void *ptr, size_t len); -#if defined(ENABLE_THREAD_SAFETY) && !defined(WIN32) +#if !defined(WIN32) extern int pq_block_sigpipe(sigset_t *osigset, bool *sigpipe_pending); extern void pq_reset_sigpipe(sigset_t *osigset, bool sigpipe_pending, bool got_epipe); @@ -833,14 +837,8 @@ extern ssize_t pgtls_write(PGconn *conn, const void *ptr, size_t len); * * NULL is sent back to the caller in the event of an error, with an * error message for the caller to consume. - * - * This is not supported with old versions of OpenSSL that don't have - * the X509_get_signature_nid() function. */ -#if defined(USE_OPENSSL) && (defined(HAVE_X509_GET_SIGNATURE_NID) || defined(HAVE_X509_GET_SIGNATURE_INFO)) -#define HAVE_PGTLS_GET_PEER_CERTIFICATE_HASH extern char *pgtls_get_peer_certificate_hash(PGconn *conn, size_t *len); -#endif /* * Verify that the server certificate matches the host name we connected to. diff --git a/src/interfaces/libpq/meson.build b/src/interfaces/libpq/meson.build index 80e6a15adf82c..57fe8c3eaecf4 100644 --- a/src/interfaces/libpq/meson.build +++ b/src/interfaces/libpq/meson.build @@ -1,11 +1,9 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group - -# test/ is entered via top-level meson.build, that way it can use the default -# args for executables (which depend on libpq). +# Copyright (c) 2022-2024, PostgreSQL Global Development Group libpq_sources = files( 'fe-auth-scram.c', 'fe-auth.c', + 'fe-cancel.c', 'fe-connect.c', 'fe-exec.c', 'fe-lobj.c', @@ -53,9 +51,8 @@ libpq_c_args = ['-DSO_MAJOR_VERSION=5'] # libpq_st, and {pgport,common}_shlib for libpq_sh # # We could try to avoid building the source files twice, but it probably adds -# more complexity than its worth (AIX doesn't support link_whole yet, reusing -# object files requires also linking to the library on windows or breaks -# precompiled headers). +# more complexity than its worth (reusing object files requires also linking +# to the library on windows or breaks precompiled headers). libpq_st = static_library('libpq', libpq_sources, include_directories: [libpq_inc], @@ -107,6 +104,7 @@ install_data('pg_service.conf.sample', install_dir: dir_data, ) +subdir('test') tests += { 'name': 'libpq', @@ -118,8 +116,14 @@ tests += { 't/002_api.pl', 't/003_load_balance_host_list.pl', 't/004_load_balance_dns.pl', + 't/005_negotiate_encryption.pl', ], - 'env': {'with_ssl': ssl_library}, + 'env': { + 'with_ssl': ssl_library, + 'with_gssapi': gssapi.found() ? 'yes' : 'no', + 'with_krb_srvnam': 'postgres', + }, + 'deps': libpq_test_deps, }, } diff --git a/src/interfaces/libpq/nls.mk b/src/interfaces/libpq/nls.mk index 5959fa0c07449..4788088eb9365 100644 --- a/src/interfaces/libpq/nls.mk +++ b/src/interfaces/libpq/nls.mk @@ -2,6 +2,7 @@ CATALOG_NAME = libpq GETTEXT_FILES = fe-auth.c \ fe-auth-scram.c \ + fe-cancel.c \ fe-connect.c \ fe-exec.c \ fe-gssapi-common.c \ @@ -13,7 +14,7 @@ GETTEXT_FILES = fe-auth.c \ fe-secure-gssapi.c \ fe-secure-openssl.c \ win32.c \ - ../../port/thread.c + ../../port/user.c GETTEXT_TRIGGERS = libpq_append_conn_error:2 \ libpq_append_error:2 \ libpq_gettext \ diff --git a/src/interfaces/libpq/po/de.po b/src/interfaces/libpq/po/de.po index bdf67b54faff3..a43d355e53ad0 100644 --- a/src/interfaces/libpq/po/de.po +++ b/src/interfaces/libpq/po/de.po @@ -1,14 +1,14 @@ # German message translation file for libpq -# Peter Eisentraut , 2001 - 2023. +# Peter Eisentraut , 2001 - 2025. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 16\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-06-23 12:40+0000\n" -"PO-Revision-Date: 2023-06-23 15:13+0200\n" +"POT-Creation-Date: 2025-03-07 03:59+0000\n" +"PO-Revision-Date: 2025-03-07 11:34+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -17,164 +17,165 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../port/thread.c:50 ../../port/thread.c:86 +#: ../../port/user.c:43 ../../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "konnte lokale Benutzer-ID %d nicht nachschlagen: %s" -#: ../../port/thread.c:55 ../../port/thread.c:91 +#: ../../port/user.c:48 ../../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "lokaler Benutzer mit ID %d existiert nicht" -#: fe-auth-scram.c:227 +#: fe-auth-scram.c:223 #, c-format msgid "malformed SCRAM message (empty message)" msgstr "fehlerhafte SCRAM-Nachricht (leere Nachricht)" -#: fe-auth-scram.c:232 +#: fe-auth-scram.c:228 #, c-format msgid "malformed SCRAM message (length mismatch)" msgstr "fehlerhafte SCRAM-Nachricht (Länge stimmt nicht überein)" -#: fe-auth-scram.c:275 +#: fe-auth-scram.c:272 #, c-format msgid "could not verify server signature: %s" msgstr "konnte Serversignatur nicht überprüfen: %s" -#: fe-auth-scram.c:281 +#: fe-auth-scram.c:278 #, c-format msgid "incorrect server signature" msgstr "falsche Serversignatur" -#: fe-auth-scram.c:290 +#: fe-auth-scram.c:287 #, c-format msgid "invalid SCRAM exchange state" msgstr "ungültiger Zustand des SCRAM-Austauschs" -#: fe-auth-scram.c:317 +#: fe-auth-scram.c:311 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)" msgstr "fehlerhafte SCRAM-Nachricht (Attribut »%c« erwartet)" -#: fe-auth-scram.c:326 +#: fe-auth-scram.c:320 #, c-format msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")" msgstr "fehlerhafte SCRAM-Nachricht (Zeichen »=« für Attribut »%c« erwartet)" -#: fe-auth-scram.c:366 +#: fe-auth-scram.c:360 #, c-format msgid "could not generate nonce" msgstr "konnte Nonce nicht erzeugen" -#: fe-auth-scram.c:375 fe-auth-scram.c:448 fe-auth-scram.c:600 -#: fe-auth-scram.c:620 fe-auth-scram.c:644 fe-auth-scram.c:658 -#: fe-auth-scram.c:704 fe-auth-scram.c:740 fe-auth-scram.c:914 fe-auth.c:295 -#: fe-auth.c:368 fe-auth.c:402 fe-auth.c:617 fe-auth.c:728 fe-auth.c:1209 -#: fe-auth.c:1374 fe-connect.c:925 fe-connect.c:1759 fe-connect.c:1921 -#: fe-connect.c:3291 fe-connect.c:4496 fe-connect.c:5161 fe-connect.c:5416 -#: fe-connect.c:5534 fe-connect.c:5781 fe-connect.c:5861 fe-connect.c:5959 -#: fe-connect.c:6210 fe-connect.c:6237 fe-connect.c:6313 fe-connect.c:6336 -#: fe-connect.c:6360 fe-connect.c:6395 fe-connect.c:6481 fe-connect.c:6489 -#: fe-connect.c:6846 fe-connect.c:6996 fe-exec.c:527 fe-exec.c:1321 -#: fe-exec.c:3111 fe-exec.c:4071 fe-exec.c:4235 fe-gssapi-common.c:109 -#: fe-lobj.c:870 fe-protocol3.c:204 fe-protocol3.c:228 fe-protocol3.c:256 -#: fe-protocol3.c:273 fe-protocol3.c:353 fe-protocol3.c:720 fe-protocol3.c:959 -#: fe-protocol3.c:1770 fe-protocol3.c:2170 fe-secure-common.c:110 -#: fe-secure-gssapi.c:500 fe-secure-openssl.c:434 fe-secure-openssl.c:1285 +#: fe-auth-scram.c:369 fe-auth-scram.c:442 fe-auth-scram.c:594 +#: fe-auth-scram.c:614 fe-auth-scram.c:638 fe-auth-scram.c:652 +#: fe-auth-scram.c:698 fe-auth-scram.c:734 fe-auth-scram.c:908 fe-auth.c:296 +#: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:727 fe-auth.c:1200 +#: fe-auth.c:1363 fe-cancel.c:159 fe-connect.c:936 fe-connect.c:976 +#: fe-connect.c:1860 fe-connect.c:2022 fe-connect.c:3430 fe-connect.c:4761 +#: fe-connect.c:5073 fe-connect.c:5328 fe-connect.c:5446 fe-connect.c:5693 +#: fe-connect.c:5773 fe-connect.c:5871 fe-connect.c:6122 fe-connect.c:6149 +#: fe-connect.c:6225 fe-connect.c:6248 fe-connect.c:6272 fe-connect.c:6307 +#: fe-connect.c:6393 fe-connect.c:6401 fe-connect.c:6758 fe-connect.c:6908 +#: fe-exec.c:530 fe-exec.c:1315 fe-exec.c:3254 fe-exec.c:4291 fe-exec.c:4457 +#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:209 fe-protocol3.c:232 +#: fe-protocol3.c:255 fe-protocol3.c:272 fe-protocol3.c:293 fe-protocol3.c:369 +#: fe-protocol3.c:737 fe-protocol3.c:976 fe-protocol3.c:1787 +#: fe-protocol3.c:2187 fe-secure-common.c:110 fe-secure-gssapi.c:496 +#: fe-secure-openssl.c:427 fe-secure-openssl.c:1277 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" -#: fe-auth-scram.c:382 +#: fe-auth-scram.c:376 #, c-format msgid "could not encode nonce" msgstr "konnte Nonce nicht kodieren" -#: fe-auth-scram.c:570 +#: fe-auth-scram.c:564 #, c-format msgid "could not calculate client proof: %s" msgstr "konnte Client-Proof nicht berechnen: %s" -#: fe-auth-scram.c:585 +#: fe-auth-scram.c:579 #, c-format msgid "could not encode client proof" msgstr "konnte Client-Proof nicht kodieren" -#: fe-auth-scram.c:637 +#: fe-auth-scram.c:631 #, c-format msgid "invalid SCRAM response (nonce mismatch)" msgstr "ungültige SCRAM-Antwort (Nonce stimmt nicht überein)" -#: fe-auth-scram.c:667 +#: fe-auth-scram.c:661 #, c-format msgid "malformed SCRAM message (invalid salt)" msgstr "fehlerhafte SCRAM-Nachricht (ungültiges Salt)" -#: fe-auth-scram.c:680 +#: fe-auth-scram.c:674 #, c-format msgid "malformed SCRAM message (invalid iteration count)" msgstr "fehlerhafte SCRAM-Nachricht (ungültige Iterationszahl)" -#: fe-auth-scram.c:685 +#: fe-auth-scram.c:679 #, c-format msgid "malformed SCRAM message (garbage at end of server-first-message)" msgstr "fehlerhafte SCRAM-Nachricht (Müll am Ende der »server-first-message«)" -#: fe-auth-scram.c:719 +#: fe-auth-scram.c:713 #, c-format msgid "error received from server in SCRAM exchange: %s" msgstr "Fehler vom Server empfangen im SCRAM-Austausch: %s" -#: fe-auth-scram.c:734 +#: fe-auth-scram.c:728 #, c-format msgid "malformed SCRAM message (garbage at end of server-final-message)" msgstr "fehlerhafte SCRAM-Nachricht (Müll am Ende der »server-final-message«)" -#: fe-auth-scram.c:751 +#: fe-auth-scram.c:745 #, c-format msgid "malformed SCRAM message (invalid server signature)" msgstr "fehlerhafte SCRAM-Nachricht (ungültige Serversignatur)" -#: fe-auth-scram.c:923 +#: fe-auth-scram.c:917 msgid "could not generate random salt" msgstr "konnte zufälliges Salt nicht erzeugen" -#: fe-auth.c:76 +#: fe-auth.c:77 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)" msgstr "Speicher aufgebraucht beim Anlegen des GSSAPI-Puffers (%d)" -#: fe-auth.c:137 +#: fe-auth.c:138 msgid "GSSAPI continuation error" msgstr "GSSAPI-Fortsetzungsfehler" -#: fe-auth.c:167 fe-auth.c:396 fe-gssapi-common.c:97 fe-secure-common.c:99 +#: fe-auth.c:168 fe-auth.c:397 fe-gssapi-common.c:97 fe-secure-common.c:99 #: fe-secure-common.c:173 #, c-format msgid "host name must be specified" msgstr "Hostname muss angegeben werden" -#: fe-auth.c:173 +#: fe-auth.c:174 #, c-format msgid "duplicate GSS authentication request" msgstr "doppelte GSSAPI-Authentifizierungsanfrage" -#: fe-auth.c:237 +#: fe-auth.c:238 #, c-format msgid "out of memory allocating SSPI buffer (%d)" msgstr "Speicher aufgebraucht beim Anlegen des SSPI-Puffers (%d)" -#: fe-auth.c:284 +#: fe-auth.c:285 msgid "SSPI continuation error" msgstr "SSPI-Fortsetzungsfehler" -#: fe-auth.c:358 +#: fe-auth.c:359 #, c-format msgid "duplicate SSPI authentication request" msgstr "doppelte SSPI-Authentifizierungsanfrage" -#: fe-auth.c:383 +#: fe-auth.c:384 msgid "could not acquire SSPI credentials" msgstr "konnte SSPI-Credentials nicht erhalten" @@ -198,12 +199,12 @@ msgstr "Channel-Binding wurde verlangt, aber der Client unterstützt es nicht" msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection" msgstr "Server hat Authentifizierung mit SCRAM-SHA-256-PLUS über eine Verbindung ohne SSL angeboten" -#: fe-auth.c:530 +#: fe-auth.c:531 #, c-format msgid "none of the server's SASL authentication mechanisms are supported" msgstr "keine der SASL-Authentifizierungsmechanismen des Servers werden unterstützt" -#: fe-auth.c:537 +#: fe-auth.c:538 #, c-format msgid "channel binding is required, but server did not offer an authentication method that supports channel binding" msgstr "Channel-Binding wurde verlangt, aber der Server hat keine Authentifizierungsmethode mit Channel-Binding angeboten" @@ -213,17 +214,17 @@ msgstr "Channel-Binding wurde verlangt, aber der Server hat keine Authentifizier msgid "out of memory allocating SASL buffer (%d)" msgstr "Speicher aufgebraucht beim Anlegen des SASL-Puffers (%d)" -#: fe-auth.c:664 +#: fe-auth.c:663 #, c-format msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed" msgstr "AuthenticationSASLFinal vom Server empfangen, aber SASL-Authentifizierung war noch nicht abgeschlossen" -#: fe-auth.c:674 +#: fe-auth.c:673 #, c-format msgid "no client response found after SASL exchange success" msgstr "keine Client-Antwort gefunden nach Erfolg des SASL-Austauschs" -#: fe-auth.c:737 fe-auth.c:744 fe-auth.c:1357 fe-auth.c:1368 +#: fe-auth.c:736 fe-auth.c:743 fe-auth.c:1346 fe-auth.c:1357 #, c-format msgid "could not encrypt password: %s" msgstr "konnte Passwort nicht verschlüsseln: %s" @@ -311,627 +312,679 @@ msgstr "Authentifizierung mit Crypt nicht unterstützt" msgid "authentication method %u not supported" msgstr "Authentifizierungsmethode %u nicht unterstützt" -#: fe-auth.c:1196 +#: fe-auth.c:1187 #, c-format msgid "user name lookup failure: error code %lu" msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu" -#: fe-auth.c:1320 +#: fe-auth.c:1309 #, c-format msgid "unexpected shape of result set returned for SHOW" msgstr "unerwartete Form der Ergebnismenge von SHOW" -#: fe-auth.c:1328 +#: fe-auth.c:1317 #, c-format -msgid "password_encryption value too long" -msgstr "Wert von password_encryption ist zu lang" +msgid "\"password_encryption\" value too long" +msgstr "Wert von »password_encryption« ist zu lang" -#: fe-auth.c:1378 +#: fe-auth.c:1367 #, c-format msgid "unrecognized password encryption algorithm \"%s\"" msgstr "unbekannter Passwortverschlüsselungsalgorithmus »%s«" -#: fe-connect.c:1132 +#: fe-cancel.c:76 +#, c-format +msgid "connection pointer is NULL" +msgstr "Verbindung ist ein NULL-Zeiger" + +#: fe-cancel.c:82 fe-misc.c:572 +#, c-format +msgid "connection not open" +msgstr "Verbindung nicht offen" + +#: fe-cancel.c:193 +#, c-format +msgid "cancel request is already being sent on this connection" +msgstr "Stornierungsanfrage wird auf dieser Verbindung bereits gesendet" + +#: fe-cancel.c:263 +#, c-format +msgid "unexpected response from server" +msgstr "unerwartete Antwort vom Server" + +#: fe-connect.c:1182 #, c-format msgid "could not match %d host names to %d hostaddr values" msgstr "fehlerhafte Angabe: %d Hostnamen und %d hostaddr-Angaben" -#: fe-connect.c:1212 +#: fe-connect.c:1262 #, c-format msgid "could not match %d port numbers to %d hosts" msgstr "fehlerhafte Angabe: %d Portnummern und %d Hosts" -#: fe-connect.c:1337 +#: fe-connect.c:1387 #, c-format msgid "negative require_auth method \"%s\" cannot be mixed with non-negative methods" msgstr "negative require_auth-Methode »%s« kann nicht mit nicht-negativen Methoden vermischt werden" -#: fe-connect.c:1350 +#: fe-connect.c:1400 #, c-format msgid "require_auth method \"%s\" cannot be mixed with negative methods" msgstr "require_auth-Methode »%s« kann nicht mit negativen Methoden vermischt werden" -#: fe-connect.c:1410 fe-connect.c:1461 fe-connect.c:1503 fe-connect.c:1559 -#: fe-connect.c:1567 fe-connect.c:1598 fe-connect.c:1644 fe-connect.c:1684 -#: fe-connect.c:1705 +#: fe-connect.c:1460 fe-connect.c:1511 fe-connect.c:1553 fe-connect.c:1596 +#: fe-connect.c:1699 fe-connect.c:1745 fe-connect.c:1785 fe-connect.c:1806 #, c-format msgid "invalid %s value: \"%s\"" msgstr "ungültiger %s-Wert: »%s«" -#: fe-connect.c:1443 +#: fe-connect.c:1493 #, c-format msgid "require_auth method \"%s\" is specified more than once" msgstr "require_auth-Methode »%s« ist mehrmals angegeben" -#: fe-connect.c:1484 fe-connect.c:1523 fe-connect.c:1606 +#: fe-connect.c:1534 fe-connect.c:1573 fe-connect.c:1605 fe-connect.c:1707 #, c-format msgid "%s value \"%s\" invalid when SSL support is not compiled in" msgstr "%s-Wert »%s« ist ungültig, wenn SSL-Unterstützung nicht einkompiliert worden ist" -#: fe-connect.c:1546 +#: fe-connect.c:1625 +#, c-format +msgid "weak sslmode \"%s\" may not be used with sslnegotiation=direct (use \"require\", \"verify-ca\", or \"verify-full\")" +msgstr "schwacher sslmode »%s« darf nicht mit sslnegotiation=direct verwendet werden (»require«, »verify-ca« oder »verify-full« verwenden)" + +#: fe-connect.c:1647 #, c-format msgid "weak sslmode \"%s\" may not be used with sslrootcert=system (use \"verify-full\")" msgstr "schwacher sslmode »%s« darf nicht mit sslrootcert=system verwendet werden (»verify-full« verwenden)" -#: fe-connect.c:1584 +#: fe-connect.c:1660 fe-connect.c:1668 +#, c-format +msgid "invalid \"%s\" value: \"%s\"" +msgstr "ungültiger »%s«-Wert: »%s«" + +#: fe-connect.c:1685 #, c-format msgid "invalid SSL protocol version range" msgstr "ungültiges SSL-Protokollsintervall" -#: fe-connect.c:1621 +#: fe-connect.c:1722 #, c-format msgid "%s value \"%s\" is not supported (check OpenSSL version)" msgstr "%s-Wert »%s« wird nicht unterstützt (OpenSSL-Version prüfen)" -#: fe-connect.c:1651 +#: fe-connect.c:1752 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in" msgstr "gssencmode-Wert »%s« ist ungültig, wenn GSSAPI-Unterstützung nicht einkompiliert worden ist" -#: fe-connect.c:1944 +#: fe-connect.c:2045 #, c-format msgid "could not set socket to TCP no delay mode: %s" msgstr "konnte Socket nicht auf TCP »No Delay«-Modus umstellen: %s" -#: fe-connect.c:2003 +#: fe-connect.c:2104 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "Verbindung zum Server auf Socket »%s« fehlgeschlagen: " -#: fe-connect.c:2029 +#: fe-connect.c:2130 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "Verbindung zum Server auf »%s« (%s), Port %s fehlgeschlagen: " -#: fe-connect.c:2034 +#: fe-connect.c:2135 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "Verbindung zum Server auf »%s«, Port %s fehlgeschlagen: " -#: fe-connect.c:2057 +#: fe-connect.c:2158 #, c-format msgid "\tIs the server running locally and accepting connections on that socket?" msgstr "\tLäuft der Server lokal und akzeptiert er Verbindungen auf diesem Socket?" -#: fe-connect.c:2059 +#: fe-connect.c:2160 #, c-format msgid "\tIs the server running on that host and accepting TCP/IP connections?" msgstr "\tLäuft der Server auf diesem Host und akzeptiert er TCP/IP-Verbindungen?" -#: fe-connect.c:2122 -#, c-format -msgid "invalid integer value \"%s\" for connection option \"%s\"" -msgstr "ungültiger Zahlenwert »%s« für Verbindungsoption »%s«" - -#: fe-connect.c:2151 fe-connect.c:2185 fe-connect.c:2220 fe-connect.c:2318 -#: fe-connect.c:2973 +#: fe-connect.c:2206 fe-connect.c:2240 fe-connect.c:2275 fe-connect.c:2373 +#: fe-connect.c:3098 #, c-format msgid "%s(%s) failed: %s" msgstr "%s(%s) fehlgeschlagen: %s" -#: fe-connect.c:2284 +#: fe-connect.c:2339 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s) fehlgeschlagen: Fehlercode %d" -#: fe-connect.c:2597 +#: fe-connect.c:2650 #, c-format msgid "invalid connection state, probably indicative of memory corruption" msgstr "ungültiger Verbindungszustand, möglicherweise ein Speicherproblem" -#: fe-connect.c:2676 +#: fe-connect.c:2733 #, c-format msgid "invalid port number: \"%s\"" msgstr "ungültige Portnummer: »%s«" -#: fe-connect.c:2690 +#: fe-connect.c:2747 #, c-format msgid "could not translate host name \"%s\" to address: %s" msgstr "konnte Hostnamen »%s« nicht in Adresse übersetzen: %s" -#: fe-connect.c:2702 +#: fe-connect.c:2759 #, c-format msgid "could not parse network address \"%s\": %s" msgstr "konnte Netzwerkadresse »%s« nicht interpretieren: %s" -#: fe-connect.c:2713 +#: fe-connect.c:2770 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "Unix-Domain-Socket-Pfad »%s« ist zu lang (maximal %d Bytes)" -#: fe-connect.c:2727 +#: fe-connect.c:2784 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s" msgstr "konnte Unix-Domain-Socket-Pfad »%s« nicht in Adresse übersetzen: %s" -#: fe-connect.c:2901 +#: fe-connect.c:2950 fe-connect.c:4305 +#, c-format +msgid "GSSAPI encryption required but it is not supported over a local socket" +msgstr "GSSAPI-Verschlüsselung war gefordert aber wird über lokales Socket nicht unterstützt" + +#: fe-connect.c:2958 fe-connect.c:4434 +#, c-format +msgid "GSSAPI encryption required but no credential cache" +msgstr "GSSAPI-Verschlüsselung war gefordert aber kein Credential-Cache" + +#: fe-connect.c:3026 #, c-format msgid "could not create socket: %s" msgstr "konnte Socket nicht erzeugen: %s" -#: fe-connect.c:2932 +#: fe-connect.c:3057 #, c-format msgid "could not set socket to nonblocking mode: %s" msgstr "konnte Socket nicht auf nicht-blockierenden Modus umstellen: %s" -#: fe-connect.c:2943 +#: fe-connect.c:3068 #, c-format msgid "could not set socket to close-on-exec mode: %s" msgstr "konnte Socket nicht auf »Close on exec«-Modus umstellen: %s" -#: fe-connect.c:2961 -#, c-format -msgid "keepalives parameter must be an integer" -msgstr "Parameter »keepalives« muss eine ganze Zahl sein" - -#: fe-connect.c:3100 +#: fe-connect.c:3225 #, c-format msgid "could not get socket error status: %s" msgstr "konnte Socket-Fehlerstatus nicht ermitteln: %s" -#: fe-connect.c:3127 +#: fe-connect.c:3252 #, c-format msgid "could not get client address from socket: %s" msgstr "konnte Client-Adresse vom Socket nicht ermitteln: %s" -#: fe-connect.c:3165 +#: fe-connect.c:3278 #, c-format msgid "requirepeer parameter is not supported on this platform" msgstr "Parameter »requirepeer« wird auf dieser Plattform nicht unterstützt" -#: fe-connect.c:3167 +#: fe-connect.c:3280 #, c-format msgid "could not get peer credentials: %s" msgstr "konnte Credentials von Gegenstelle nicht ermitteln: %s" -#: fe-connect.c:3180 +#: fe-connect.c:3293 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"" msgstr "requirepeer gibt »%s« an, aber tatsächlicher Benutzername der Gegenstelle ist »%s«" -#: fe-connect.c:3221 +#: fe-connect.c:3331 #, c-format msgid "could not send GSSAPI negotiation packet: %s" msgstr "konnte Paket zur GSSAPI-Verhandlung nicht senden: %s" -#: fe-connect.c:3233 -#, c-format -msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)" -msgstr "GSSAPI-Verschlüsselung war gefordert aber war nicht möglich (möglicherweise kein Credential-Cache, keine Serverunterstützung oder lokales Socket wird verwendet)" - -#: fe-connect.c:3274 +#: fe-connect.c:3380 #, c-format msgid "could not send SSL negotiation packet: %s" msgstr "konnte Paket zur SSL-Verhandlung nicht senden: %s" -#: fe-connect.c:3303 +#: fe-connect.c:3412 +#, c-format +msgid "could not send cancel packet: %s" +msgstr "konnte Cancel-Paket nicht senden: %s" + +#: fe-connect.c:3442 #, c-format msgid "could not send startup packet: %s" msgstr "konnte Startpaket nicht senden: %s" -#: fe-connect.c:3378 -#, c-format +#: fe-connect.c:3509 msgid "server does not support SSL, but SSL was required" msgstr "Server unterstützt kein SSL, aber SSL wurde verlangt" -#: fe-connect.c:3404 +#: fe-connect.c:3519 +#, c-format +msgid "server sent an error response during SSL exchange" +msgstr "Server hat während des SSL-Austauschs eine Fehlermeldung gesendet" + +#: fe-connect.c:3524 #, c-format msgid "received invalid response to SSL negotiation: %c" msgstr "ungültige Antwort auf SSL-Verhandlungspaket empfangen: %c" -#: fe-connect.c:3424 +#: fe-connect.c:3552 #, c-format msgid "received unencrypted data after SSL response" msgstr "unverschlüsselte Daten nach SSL-Antwort empfangen" -#: fe-connect.c:3504 +#: fe-connect.c:3615 #, c-format +msgid "server sent an error response during GSS encryption exchange" +msgstr "Server hat während des GSS-Verschlüsselungsaustauschs eine Fehlermeldung gesendet" + +#: fe-connect.c:3629 msgid "server doesn't support GSSAPI encryption, but it was required" msgstr "Server unterstützt keine GSSAPI-Verschlüsselung, sie wurde aber verlangt" -#: fe-connect.c:3515 +#: fe-connect.c:3633 #, c-format msgid "received invalid response to GSSAPI negotiation: %c" msgstr "ungültige Antwort auf GSSAPI-Verhandlungspaket empfangen: %c" -#: fe-connect.c:3533 +#: fe-connect.c:3651 #, c-format msgid "received unencrypted data after GSSAPI encryption response" msgstr "unverschlüsselte Daten nach GSSAPI-Verschlüsselungsantwort empfangen" -#: fe-connect.c:3598 +#: fe-connect.c:3711 #, c-format msgid "expected authentication request from server, but received %c" msgstr "Authentifizierungsanfrage wurde vom Server erwartet, aber %c wurde empfangen" -#: fe-connect.c:3625 fe-connect.c:3794 +#: fe-connect.c:3739 fe-connect.c:3862 #, c-format msgid "received invalid authentication request" msgstr "ungültige Authentifizierungsanforderung empfangen" -#: fe-connect.c:3630 fe-connect.c:3779 +#: fe-connect.c:3745 fe-connect.c:3847 #, c-format msgid "received invalid protocol negotiation message" msgstr "ungültige Protokollverhandlungsnachricht empfangen" -#: fe-connect.c:3648 fe-connect.c:3702 +#: fe-connect.c:3764 fe-connect.c:3818 #, c-format msgid "received invalid error message" msgstr "ungültige Fehlermeldung empfangen" -#: fe-connect.c:3865 +#: fe-connect.c:3933 #, c-format msgid "unexpected message from server during startup" msgstr "unerwartete Nachricht vom Server beim Start" -#: fe-connect.c:3956 +#: fe-connect.c:4024 #, c-format msgid "session is read-only" msgstr "Sitzung ist read-only" -#: fe-connect.c:3958 +#: fe-connect.c:4026 #, c-format msgid "session is not read-only" msgstr "Sitzung ist nicht read-only" -#: fe-connect.c:4011 +#: fe-connect.c:4079 #, c-format msgid "server is in hot standby mode" msgstr "Server ist im Hot-Standby-Modus" -#: fe-connect.c:4013 +#: fe-connect.c:4081 #, c-format msgid "server is not in hot standby mode" msgstr "Server ist nicht im Hot-Standby-Modus" -#: fe-connect.c:4129 fe-connect.c:4179 +#: fe-connect.c:4203 fe-connect.c:4253 #, c-format msgid "\"%s\" failed" msgstr "»%s« fehlgeschlagen" -#: fe-connect.c:4193 +#: fe-connect.c:4267 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption" msgstr "ungültiger Verbindungszustand %d, möglicherweise ein Speicherproblem" -#: fe-connect.c:5174 +#: fe-connect.c:5086 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://" msgstr "ungültige LDAP-URL »%s«: Schema muss ldap:// sein" -#: fe-connect.c:5189 +#: fe-connect.c:5101 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name" msgstr "ungültige LDAP-URL »%s«: Distinguished Name fehlt" -#: fe-connect.c:5201 fe-connect.c:5259 +#: fe-connect.c:5113 fe-connect.c:5171 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute" msgstr "ungültige LDAP-URL »%s«: muss genau ein Attribut haben" -#: fe-connect.c:5213 fe-connect.c:5275 +#: fe-connect.c:5125 fe-connect.c:5187 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" msgstr "ungültige LDAP-URL »%s«: Suchbereich fehlt (base/one/sub)" -#: fe-connect.c:5225 +#: fe-connect.c:5137 #, c-format msgid "invalid LDAP URL \"%s\": no filter" msgstr "ungültige LDAP-URL »%s«: kein Filter" -#: fe-connect.c:5247 +#: fe-connect.c:5159 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number" msgstr "ungültige LDAP-URL »%s«: ungültige Portnummer" -#: fe-connect.c:5284 +#: fe-connect.c:5196 #, c-format msgid "could not create LDAP structure" msgstr "konnte LDAP-Struktur nicht erzeugen" -#: fe-connect.c:5359 +#: fe-connect.c:5271 #, c-format msgid "lookup on LDAP server failed: %s" msgstr "Suche auf LDAP-Server fehlgeschlagen: %s" -#: fe-connect.c:5369 +#: fe-connect.c:5281 #, c-format msgid "more than one entry found on LDAP lookup" msgstr "LDAP-Suche ergab mehr als einen Eintrag" -#: fe-connect.c:5371 fe-connect.c:5382 +#: fe-connect.c:5283 fe-connect.c:5294 #, c-format msgid "no entry found on LDAP lookup" msgstr "kein Eintrag gefunden bei LDAP-Suche" -#: fe-connect.c:5392 fe-connect.c:5404 +#: fe-connect.c:5304 fe-connect.c:5316 #, c-format msgid "attribute has no values on LDAP lookup" msgstr "Attribut hat keine Werte bei LDAP-Suche" -#: fe-connect.c:5455 fe-connect.c:5474 fe-connect.c:5998 +#: fe-connect.c:5367 fe-connect.c:5386 fe-connect.c:5910 #, c-format msgid "missing \"=\" after \"%s\" in connection info string" msgstr "fehlendes »=« nach »%s« in der Zeichenkette der Verbindungsdaten" -#: fe-connect.c:5545 fe-connect.c:6181 fe-connect.c:6979 +#: fe-connect.c:5457 fe-connect.c:6093 fe-connect.c:6891 #, c-format msgid "invalid connection option \"%s\"" msgstr "ungültige Verbindungsoption »%s«" -#: fe-connect.c:5560 fe-connect.c:6046 +#: fe-connect.c:5472 fe-connect.c:5958 #, c-format msgid "unterminated quoted string in connection info string" msgstr "fehlendes schließendes Anführungszeichen (\") in der Zeichenkette der Verbindungsdaten" -#: fe-connect.c:5640 +#: fe-connect.c:5552 #, c-format msgid "definition of service \"%s\" not found" msgstr "Definition von Service »%s« nicht gefunden" -#: fe-connect.c:5666 +#: fe-connect.c:5578 #, c-format msgid "service file \"%s\" not found" msgstr "Servicedatei »%s« nicht gefunden" -#: fe-connect.c:5679 +#: fe-connect.c:5591 #, c-format msgid "line %d too long in service file \"%s\"" msgstr "Zeile %d zu lang in Servicedatei »%s«" -#: fe-connect.c:5750 fe-connect.c:5793 +#: fe-connect.c:5662 fe-connect.c:5705 #, c-format msgid "syntax error in service file \"%s\", line %d" msgstr "Syntaxfehler in Servicedatei »%s«, Zeile %d" -#: fe-connect.c:5761 +#: fe-connect.c:5673 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d" msgstr "geschachtelte »service«-Definitionen werden nicht unterstützt in Servicedatei »%s«, Zeile %d" -#: fe-connect.c:6500 +#: fe-connect.c:6412 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"" msgstr "ungültige URI an interne Parserroutine weitergeleitet: »%s«" -#: fe-connect.c:6577 +#: fe-connect.c:6489 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"" msgstr "Ende der Eingabezeichenkette gefunden beim Suchen nach passendem »]« in IPv6-Hostadresse in URI: »%s«" -#: fe-connect.c:6584 +#: fe-connect.c:6496 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"" msgstr "IPv6-Hostadresse darf nicht leer sein in URI: »%s«" -#: fe-connect.c:6599 +#: fe-connect.c:6511 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"" msgstr "unerwartetes Zeichen »%c« an Position %d in URI (»:« oder »/« erwartet): »%s«" -#: fe-connect.c:6728 +#: fe-connect.c:6640 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "zusätzliches Schlüssel/Wert-Trennzeichen »=« in URI-Query-Parameter: »%s«" -#: fe-connect.c:6748 +#: fe-connect.c:6660 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "fehlendes Schlüssel/Wert-Trennzeichen »=« in URI-Query-Parameter: »%s«" -#: fe-connect.c:6800 +#: fe-connect.c:6712 #, c-format msgid "invalid URI query parameter: \"%s\"" msgstr "ungültiger URI-Query-Parameter: »%s«" -#: fe-connect.c:6874 +#: fe-connect.c:6786 #, c-format msgid "invalid percent-encoded token: \"%s\"" msgstr "ungültiges Prozent-kodiertes Token: »%s«" -#: fe-connect.c:6884 +#: fe-connect.c:6796 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"" msgstr "verbotener Wert %%00 in Prozent-kodiertem Wert: »%s«" -#: fe-connect.c:7248 +#: fe-connect.c:7160 msgid "connection pointer is NULL\n" msgstr "Verbindung ist ein NULL-Zeiger\n" -#: fe-connect.c:7256 fe-exec.c:710 fe-exec.c:970 fe-exec.c:3292 -#: fe-protocol3.c:974 fe-protocol3.c:1007 +#: fe-connect.c:7168 fe-exec.c:713 fe-exec.c:975 fe-exec.c:3459 +#: fe-protocol3.c:991 fe-protocol3.c:1024 msgid "out of memory\n" msgstr "Speicher aufgebraucht\n" -#: fe-connect.c:7547 +#: fe-connect.c:7459 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "WARNUNG: Passwortdatei »%s« ist keine normale Datei\n" -#: fe-connect.c:7556 +#: fe-connect.c:7468 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "WARNUNG: Passwortdatei »%s« erlaubt Lesezugriff für Gruppe oder Andere; Rechte sollten u=rw (0600) oder weniger sein\n" -#: fe-connect.c:7663 +#: fe-connect.c:7575 #, c-format msgid "password retrieved from file \"%s\"" msgstr "Passwort wurde aus Datei »%s« gelesen" -#: fe-exec.c:466 fe-exec.c:3366 +#: fe-connect.c:7727 +#, c-format +msgid "invalid integer value \"%s\" for connection option \"%s\"" +msgstr "ungültiger Zahlenwert »%s« für Verbindungsoption »%s«" + +#: fe-exec.c:469 fe-exec.c:3533 #, c-format msgid "row number %d is out of range 0..%d" msgstr "Zeilennummer %d ist außerhalb des zulässigen Bereichs 0..%d" -#: fe-exec.c:528 fe-protocol3.c:1976 +#: fe-exec.c:531 fe-protocol3.c:1993 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:831 +#: fe-exec.c:834 #, c-format msgid "write to server failed" msgstr "Schreiben zum Server fehlgeschlagen" -#: fe-exec.c:869 +#: fe-exec.c:874 #, c-format msgid "no error text available" msgstr "kein Fehlertext verfügbar" -#: fe-exec.c:958 +#: fe-exec.c:963 msgid "NOTICE" msgstr "HINWEIS" -#: fe-exec.c:1016 +#: fe-exec.c:1021 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult kann nicht mehr als INT_MAX Tupel enthalten" -#: fe-exec.c:1028 +#: fe-exec.c:1033 msgid "size_t overflow" msgstr "Überlauf von size_t" -#: fe-exec.c:1444 fe-exec.c:1513 fe-exec.c:1559 +#: fe-exec.c:1438 fe-exec.c:1507 fe-exec.c:1553 #, c-format msgid "command string is a null pointer" msgstr "Befehlszeichenkette ist ein NULL-Zeiger" -#: fe-exec.c:1450 fe-exec.c:2888 +#: fe-exec.c:1444 fe-exec.c:3003 #, c-format msgid "%s not allowed in pipeline mode" msgstr "%s im Pipeline-Modus nicht erlaubt" -#: fe-exec.c:1518 fe-exec.c:1564 fe-exec.c:1658 +#: fe-exec.c:1512 fe-exec.c:1558 fe-exec.c:1652 #, c-format msgid "number of parameters must be between 0 and %d" msgstr "Anzahl der Parameter muss zwischen 0 und %d sein" -#: fe-exec.c:1554 fe-exec.c:1653 +#: fe-exec.c:1548 fe-exec.c:1647 #, c-format msgid "statement name is a null pointer" msgstr "Anweisungsname ist ein NULL-Zeiger" -#: fe-exec.c:1695 fe-exec.c:3220 +#: fe-exec.c:1689 fe-exec.c:3379 #, c-format msgid "no connection to the server" msgstr "keine Verbindung mit dem Server" -#: fe-exec.c:1703 fe-exec.c:3228 +#: fe-exec.c:1697 fe-exec.c:3387 #, c-format msgid "another command is already in progress" msgstr "ein anderer Befehl ist bereits in Ausführung" -#: fe-exec.c:1733 +#: fe-exec.c:1727 #, c-format msgid "cannot queue commands during COPY" msgstr "während COPY können keine Befehle aufgereiht werden" -#: fe-exec.c:1850 +#: fe-exec.c:1846 #, c-format msgid "length must be given for binary parameter" msgstr "für binäre Parameter muss eine Länge angegeben werden" -#: fe-exec.c:2171 +#: fe-exec.c:2205 #, c-format msgid "unexpected asyncStatus: %d" msgstr "unerwarteter asyncStatus: %d" -#: fe-exec.c:2327 +#: fe-exec.c:2361 #, c-format msgid "synchronous command execution functions are not allowed in pipeline mode" msgstr "synchrone Befehlsausführungsfunktionen sind im Pipeline-Modus nicht erlaubt" -#: fe-exec.c:2344 +#: fe-exec.c:2378 msgid "COPY terminated by new PQexec" msgstr "COPY von neuem PQexec beendet" -#: fe-exec.c:2360 +#: fe-exec.c:2394 #, c-format msgid "PQexec not allowed during COPY BOTH" msgstr "PQexec ist während COPY BOTH nicht erlaubt" -#: fe-exec.c:2586 fe-exec.c:2641 fe-exec.c:2709 fe-protocol3.c:1907 +#: fe-exec.c:2630 +#, c-format +msgid "unrecognized message type \"%c\"" +msgstr "unbekannter Message-Typ »%c«" + +#: fe-exec.c:2702 fe-exec.c:2756 fe-exec.c:2824 fe-protocol3.c:1924 #, c-format msgid "no COPY in progress" msgstr "keine COPY in Ausführung" -#: fe-exec.c:2895 +#: fe-exec.c:3010 #, c-format msgid "connection in wrong state" msgstr "Verbindung im falschen Zustand" -#: fe-exec.c:2938 +#: fe-exec.c:3053 #, c-format msgid "cannot enter pipeline mode, connection not idle" msgstr "kann Pipeline-Modus nicht einschalten, Verbindung ist nicht inaktiv" -#: fe-exec.c:2974 fe-exec.c:2995 +#: fe-exec.c:3089 fe-exec.c:3110 #, c-format msgid "cannot exit pipeline mode with uncollected results" msgstr "kann Pipeline-Modus nicht beenden, wegen nicht eingesammelter Ergebnisse" -#: fe-exec.c:2978 +#: fe-exec.c:3093 #, c-format msgid "cannot exit pipeline mode while busy" msgstr "kann Pipeline-Modus nicht beenden während die Verbindung beschäftigt ist" -#: fe-exec.c:2989 +#: fe-exec.c:3104 #, c-format msgid "cannot exit pipeline mode while in COPY" msgstr "kann Pipeline-Modus nicht beenden während COPY aktiv ist" -#: fe-exec.c:3154 +#: fe-exec.c:3303 #, c-format msgid "cannot send pipeline when not in pipeline mode" msgstr "Pipeline kann nicht gesendet werden, wenn der Pipeline-Modus aus ist" -#: fe-exec.c:3255 +#: fe-exec.c:3422 msgid "invalid ExecStatusType code" msgstr "ungültiger ExecStatusType-Kode" -#: fe-exec.c:3282 +#: fe-exec.c:3449 msgid "PGresult is not an error result\n" msgstr "PGresult ist kein Fehlerresultat\n" -#: fe-exec.c:3350 fe-exec.c:3373 +#: fe-exec.c:3517 fe-exec.c:3540 #, c-format msgid "column number %d is out of range 0..%d" msgstr "Spaltennummer %d ist außerhalb des zulässigen Bereichs 0..%d" -#: fe-exec.c:3388 +#: fe-exec.c:3555 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "Parameternummer %d ist außerhalb des zulässigen Bereichs 0..%d" -#: fe-exec.c:3699 +#: fe-exec.c:3866 #, c-format msgid "could not interpret result from server: %s" msgstr "konnte Ergebnis vom Server nicht interpretieren: %s" -#: fe-exec.c:3964 fe-exec.c:4054 +#: fe-exec.c:4140 fe-exec.c:4253 #, c-format msgid "incomplete multibyte character" msgstr "unvollständiges Mehrbyte-Zeichen" +#: fe-exec.c:4142 fe-exec.c:4272 +#, c-format +msgid "invalid multibyte character" +msgstr "ungültiges Mehrbytezeichen" + #: fe-gssapi-common.c:122 msgid "GSSAPI name import error" msgstr "GSSAPI-Namensimportfehler" @@ -978,23 +1031,18 @@ msgstr "konnte nicht in Datei »%s« schreiben: %s" msgid "query to initialize large object functions did not return data" msgstr "Abfrage zur Initialisierung der Large-Object-Funktionen ergab keine Daten" -#: fe-misc.c:240 +#: fe-misc.c:239 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "Integer der Größe %lu wird von pqGetInt nicht unterstützt" -#: fe-misc.c:273 +#: fe-misc.c:272 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "Integer der Größe %lu wird von pqPutInt nicht unterstützt" -#: fe-misc.c:573 -#, c-format -msgid "connection not open" -msgstr "Verbindung nicht offen" - -#: fe-misc.c:751 fe-secure-openssl.c:215 fe-secure-openssl.c:315 -#: fe-secure.c:257 fe-secure.c:419 +#: fe-misc.c:750 fe-secure-openssl.c:203 fe-secure-openssl.c:309 +#: fe-secure.c:237 fe-secure.c:404 #, c-format msgid "" "server closed the connection unexpectedly\n" @@ -1005,172 +1053,172 @@ msgstr "" "\tDas heißt wahrscheinlich, dass der Server abnormal beendete\n" "\tbevor oder während die Anweisung bearbeitet wurde." -#: fe-misc.c:818 +#: fe-misc.c:817 msgid "connection not open\n" msgstr "Verbindung nicht offen\n" -#: fe-misc.c:1003 +#: fe-misc.c:1005 #, c-format msgid "timeout expired" msgstr "Timeout abgelaufen" -#: fe-misc.c:1047 +#: fe-misc.c:1049 #, c-format msgid "invalid socket" msgstr "ungültiges Socket" -#: fe-misc.c:1069 +#: fe-misc.c:1071 #, c-format msgid "%s() failed: %s" msgstr "%s() fehlgeschlagen: %s" -#: fe-protocol3.c:182 +#: fe-protocol3.c:187 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "Nachricht vom Typ 0x%02x kam vom Server im Ruhezustand" -#: fe-protocol3.c:385 +#: fe-protocol3.c:402 #, c-format msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" msgstr "Server sendete Daten (»D«-Nachricht) ohne vorherige Zeilenbeschreibung (»T«-Nachricht)" -#: fe-protocol3.c:427 +#: fe-protocol3.c:444 #, c-format msgid "unexpected response from server; first received character was \"%c\"" msgstr "unerwartete Antwort vom Server; erstes empfangenes Zeichen war »%c«" -#: fe-protocol3.c:450 +#: fe-protocol3.c:467 #, c-format msgid "message contents do not agree with length in message type \"%c\"" msgstr "Nachrichteninhalt stimmt nicht mit Länge in Nachrichtentyp »%c« überein" -#: fe-protocol3.c:468 +#: fe-protocol3.c:485 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d" msgstr "Synchronisation mit Server verloren: Nachrichtentyp »%c« empfangen, Länge %d" -#: fe-protocol3.c:520 fe-protocol3.c:560 +#: fe-protocol3.c:537 fe-protocol3.c:577 msgid "insufficient data in \"T\" message" msgstr "nicht genug Daten in »T«-Nachricht" -#: fe-protocol3.c:631 fe-protocol3.c:837 +#: fe-protocol3.c:648 fe-protocol3.c:854 msgid "out of memory for query result" msgstr "Speicher für Anfrageergebnis aufgebraucht" -#: fe-protocol3.c:700 +#: fe-protocol3.c:717 msgid "insufficient data in \"t\" message" msgstr "nicht genug Daten in »t«-Nachricht" -#: fe-protocol3.c:759 fe-protocol3.c:791 fe-protocol3.c:809 +#: fe-protocol3.c:776 fe-protocol3.c:808 fe-protocol3.c:826 msgid "insufficient data in \"D\" message" msgstr "nicht genug Daten in »D«-Nachricht" -#: fe-protocol3.c:765 +#: fe-protocol3.c:782 msgid "unexpected field count in \"D\" message" msgstr "unerwartete Feldzahl in »D«-Nachricht" -#: fe-protocol3.c:1020 +#: fe-protocol3.c:1037 msgid "no error message available\n" msgstr "keine Fehlermeldung verfügbar\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1068 fe-protocol3.c:1087 +#: fe-protocol3.c:1085 fe-protocol3.c:1104 #, c-format msgid " at character %s" msgstr " bei Zeichen %s" -#: fe-protocol3.c:1100 +#: fe-protocol3.c:1117 #, c-format msgid "DETAIL: %s\n" msgstr "DETAIL: %s\n" -#: fe-protocol3.c:1103 +#: fe-protocol3.c:1120 #, c-format msgid "HINT: %s\n" msgstr "TIP: %s\n" -#: fe-protocol3.c:1106 +#: fe-protocol3.c:1123 #, c-format msgid "QUERY: %s\n" msgstr "ANFRAGE: %s\n" -#: fe-protocol3.c:1113 +#: fe-protocol3.c:1130 #, c-format msgid "CONTEXT: %s\n" msgstr "KONTEXT: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1139 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMANAME: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1143 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABELLENNAME: %s\n" -#: fe-protocol3.c:1130 +#: fe-protocol3.c:1147 #, c-format msgid "COLUMN NAME: %s\n" msgstr "SPALTENNAME: %s\n" -#: fe-protocol3.c:1134 +#: fe-protocol3.c:1151 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATENTYPNAME: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1155 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "CONSTRAINT-NAME: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1167 msgid "LOCATION: " msgstr "ORT: " -#: fe-protocol3.c:1152 +#: fe-protocol3.c:1169 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1171 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1349 +#: fe-protocol3.c:1366 #, c-format msgid "LINE %d: " msgstr "ZEILE %d: " -#: fe-protocol3.c:1423 +#: fe-protocol3.c:1440 #, c-format msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u" msgstr "Protokollversion nicht vom Server unterstützt: Client verwendet %u.%u, Server unterstützt bis %u.%u" -#: fe-protocol3.c:1429 +#: fe-protocol3.c:1446 #, c-format msgid "protocol extension not supported by server: %s" msgid_plural "protocol extensions not supported by server: %s" msgstr[0] "Protokollerweiterung nicht vom Server unterstützt: %s" msgstr[1] "Protokollerweiterungen nicht vom Server unterstützt: %s" -#: fe-protocol3.c:1437 +#: fe-protocol3.c:1454 #, c-format msgid "invalid %s message" msgstr "ungültige %s-Nachricht" -#: fe-protocol3.c:1802 +#: fe-protocol3.c:1819 #, c-format msgid "PQgetline: not doing text COPY OUT" msgstr "PQgetline: Text COPY OUT nicht ausgeführt" -#: fe-protocol3.c:2176 +#: fe-protocol3.c:2193 #, c-format msgid "protocol error: no function result" msgstr "Protokollfehler: kein Funktionsergebnis" -#: fe-protocol3.c:2187 +#: fe-protocol3.c:2204 #, c-format msgid "protocol error: id=0x%x" msgstr "Protokollfehler: id=0x%x" @@ -1212,132 +1260,132 @@ msgstr "Server-Zertifikat für »%s« stimmt nicht mit dem Hostnamen »%s« übe msgid "could not get server's host name from server certificate" msgstr "konnte Hostnamen des Servers nicht aus dem Serverzertifikat ermitteln" -#: fe-secure-gssapi.c:201 +#: fe-secure-gssapi.c:194 msgid "GSSAPI wrap error" msgstr "GSSAPI-Wrap-Fehler" -#: fe-secure-gssapi.c:208 +#: fe-secure-gssapi.c:201 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "ausgehende GSSAPI-Nachricht würde keine Vertraulichkeit verwenden" -#: fe-secure-gssapi.c:215 +#: fe-secure-gssapi.c:208 #, c-format msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "Client versuchte übergroßes GSSAPI-Paket zu senden (%zu > %zu)" -#: fe-secure-gssapi.c:351 fe-secure-gssapi.c:593 +#: fe-secure-gssapi.c:347 fe-secure-gssapi.c:589 #, c-format msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" msgstr "übergroßes GSSAPI-Paket vom Server gesendet (%zu > %zu)" -#: fe-secure-gssapi.c:390 +#: fe-secure-gssapi.c:386 msgid "GSSAPI unwrap error" msgstr "GSSAPI-Unwrap-Fehler" -#: fe-secure-gssapi.c:399 +#: fe-secure-gssapi.c:395 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "eingehende GSSAPI-Nachricht verwendete keine Vertraulichkeit" -#: fe-secure-gssapi.c:656 +#: fe-secure-gssapi.c:652 msgid "could not initiate GSSAPI security context" msgstr "konnte GSSAPI-Sicherheitskontext nicht initiieren" -#: fe-secure-gssapi.c:685 +#: fe-secure-gssapi.c:681 msgid "GSSAPI size check error" msgstr "GSSAPI-Fehler bei der Größenprüfung" -#: fe-secure-gssapi.c:696 +#: fe-secure-gssapi.c:692 msgid "GSSAPI context establishment error" msgstr "GSSAPI-Fehler beim Einrichten des Kontexts" -#: fe-secure-openssl.c:219 fe-secure-openssl.c:319 fe-secure-openssl.c:1531 +#: fe-secure-openssl.c:207 fe-secure-openssl.c:313 fe-secure-openssl.c:1524 #, c-format msgid "SSL SYSCALL error: %s" msgstr "SSL-SYSCALL-Fehler: %s" -#: fe-secure-openssl.c:225 fe-secure-openssl.c:325 fe-secure-openssl.c:1534 +#: fe-secure-openssl.c:213 fe-secure-openssl.c:319 fe-secure-openssl.c:1527 #, c-format msgid "SSL SYSCALL error: EOF detected" msgstr "SSL-SYSCALL-Fehler: Dateiende entdeckt" -#: fe-secure-openssl.c:235 fe-secure-openssl.c:335 fe-secure-openssl.c:1542 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:329 fe-secure-openssl.c:1535 #, c-format msgid "SSL error: %s" msgstr "SSL-Fehler: %s" -#: fe-secure-openssl.c:249 fe-secure-openssl.c:349 +#: fe-secure-openssl.c:237 fe-secure-openssl.c:343 #, c-format msgid "SSL connection has been closed unexpectedly" msgstr "SSL-Verbindung wurde unerwartet geschlossen" -#: fe-secure-openssl.c:254 fe-secure-openssl.c:354 fe-secure-openssl.c:1589 +#: fe-secure-openssl.c:242 fe-secure-openssl.c:348 fe-secure-openssl.c:1582 #, c-format msgid "unrecognized SSL error code: %d" msgstr "unbekannter SSL-Fehlercode: %d" -#: fe-secure-openssl.c:397 +#: fe-secure-openssl.c:390 #, c-format msgid "could not determine server certificate signature algorithm" msgstr "konnte Signaturalgorithmus des Serverzertifikats nicht ermitteln" -#: fe-secure-openssl.c:417 +#: fe-secure-openssl.c:410 #, c-format msgid "could not find digest for NID %s" msgstr "konnte Digest für NID %s nicht finden" -#: fe-secure-openssl.c:426 +#: fe-secure-openssl.c:419 #, c-format msgid "could not generate peer certificate hash" msgstr "konnte Hash des Zertifikats der Gegenstelle nicht erzeugen" -#: fe-secure-openssl.c:509 +#: fe-secure-openssl.c:501 #, c-format msgid "SSL certificate's name entry is missing" msgstr "Namenseintrag fehlt im SSL-Zertifikat" -#: fe-secure-openssl.c:543 +#: fe-secure-openssl.c:535 #, c-format msgid "SSL certificate's address entry is missing" msgstr "Adresseintrag fehlt im SSL-Zertifikat" -#: fe-secure-openssl.c:960 +#: fe-secure-openssl.c:935 #, c-format msgid "could not create SSL context: %s" msgstr "konnte SSL-Kontext nicht erzeugen: %s" -#: fe-secure-openssl.c:1002 +#: fe-secure-openssl.c:977 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version" msgstr "ungültiger Wert »%s« für minimale SSL-Protokollversion" -#: fe-secure-openssl.c:1012 +#: fe-secure-openssl.c:987 #, c-format msgid "could not set minimum SSL protocol version: %s" msgstr "konnte minimale SSL-Protokollversion nicht setzen: %s" -#: fe-secure-openssl.c:1028 +#: fe-secure-openssl.c:1003 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version" msgstr "ungültiger Wert »%s« für maximale SSL-Protokollversion" -#: fe-secure-openssl.c:1038 +#: fe-secure-openssl.c:1013 #, c-format msgid "could not set maximum SSL protocol version: %s" msgstr "konnte maximale SSL-Protokollversion nicht setzen: %s" -#: fe-secure-openssl.c:1076 +#: fe-secure-openssl.c:1051 #, c-format msgid "could not load system root certificate paths: %s" msgstr "konnte System-Root-Zertifikat-Pfade nicht laden: %s" -#: fe-secure-openssl.c:1093 +#: fe-secure-openssl.c:1068 #, c-format msgid "could not read root certificate file \"%s\": %s" msgstr "konnte Root-Zertifikat-Datei »%s« nicht lesen: %s" -#: fe-secure-openssl.c:1145 +#: fe-secure-openssl.c:1120 #, c-format msgid "" "could not get home directory to locate root certificate file\n" @@ -1346,7 +1394,7 @@ msgstr "" "konnte Home-Verzeichnis nicht ermitteln, um Root-Zertifikat-Datei zu finden\n" "Legen Sie entweder die Datei an, verwenden Sie die vertrauenswürdigen Roots des Systems mit sslrootcert=system, oder ändern Sie sslmode, um die Überprüfung der Serverzertifikate abzuschalten." -#: fe-secure-openssl.c:1148 +#: fe-secure-openssl.c:1123 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1355,112 +1403,127 @@ msgstr "" "Root-Zertifikat-Datei »%s« existiert nicht\n" "Legen Sie entweder die Datei an, verwenden Sie die vertrauenswürdigen Roots des Systems mit sslrootcert=system, oder ändern Sie sslmode, um die Überprüfung der Serverzertifikate abzuschalten." -#: fe-secure-openssl.c:1183 +#: fe-secure-openssl.c:1158 #, c-format msgid "could not open certificate file \"%s\": %s" msgstr "konnte Zertifikatdatei »%s« nicht öffnen: %s" -#: fe-secure-openssl.c:1201 +#: fe-secure-openssl.c:1176 #, c-format msgid "could not read certificate file \"%s\": %s" msgstr "konnte Zertifikatdatei »%s« nicht lesen: %s" -#: fe-secure-openssl.c:1225 +#: fe-secure-openssl.c:1200 #, c-format msgid "could not establish SSL connection: %s" msgstr "konnte SSL-Verbindung nicht aufbauen: %s" -#: fe-secure-openssl.c:1257 +#: fe-secure-openssl.c:1232 #, c-format msgid "could not set SSL Server Name Indication (SNI): %s" msgstr "konnte SSL-Server-Name-Indication (SNI) nicht setzen: %s" -#: fe-secure-openssl.c:1300 +#: fe-secure-openssl.c:1249 +#, c-format +msgid "could not set SSL ALPN extension: %s" +msgstr "konnte SSL-ALPN-Erweiterung nicht setzen: %s" + +#: fe-secure-openssl.c:1292 #, c-format msgid "could not load SSL engine \"%s\": %s" msgstr "konnte SSL-Engine »%s« nicht laden: %s" -#: fe-secure-openssl.c:1311 +#: fe-secure-openssl.c:1303 #, c-format msgid "could not initialize SSL engine \"%s\": %s" msgstr "konnte SSL-Engine »%s« nicht initialisieren: %s" -#: fe-secure-openssl.c:1326 +#: fe-secure-openssl.c:1318 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" msgstr "konnte privaten SSL-Schlüssel »%s« nicht von Engine »%s« lesen: %s" -#: fe-secure-openssl.c:1339 +#: fe-secure-openssl.c:1331 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" msgstr "konnte privaten SSL-Schlüssel »%s« nicht von Engine »%s« laden: %s" -#: fe-secure-openssl.c:1376 +#: fe-secure-openssl.c:1368 #, c-format msgid "certificate present, but not private key file \"%s\"" msgstr "Zertifikat vorhanden, aber keine private Schlüsseldatei »%s«" -#: fe-secure-openssl.c:1379 +#: fe-secure-openssl.c:1371 #, c-format msgid "could not stat private key file \"%s\": %m" msgstr "konnte »stat« für private Schlüsseldatei »%s« nicht ausführen: %m" -#: fe-secure-openssl.c:1387 +#: fe-secure-openssl.c:1379 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "private Schlüsseldatei »%s« ist keine normale Datei" -#: fe-secure-openssl.c:1420 +#: fe-secure-openssl.c:1412 #, c-format msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root" msgstr "private Schlüsseldatei »%s« erlaubt Lesezugriff für Gruppe oder Andere; Dateirechte müssen u=rw (0600) oder weniger sein, wenn der Eigentümer der aktuelle Benutzer ist, oder u=rw,g=r (0640) oder weniger, wenn der Eigentümer »root« ist" -#: fe-secure-openssl.c:1444 +#: fe-secure-openssl.c:1436 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "konnte private Schlüsseldatei »%s« nicht laden: %s" -#: fe-secure-openssl.c:1460 +#: fe-secure-openssl.c:1452 #, c-format msgid "certificate does not match private key file \"%s\": %s" msgstr "Zertifikat passt nicht zur privaten Schlüsseldatei »%s«: %s" -#: fe-secure-openssl.c:1528 +#: fe-secure-openssl.c:1521 #, c-format msgid "SSL error: certificate verify failed: %s" msgstr "SSL-Fehler: Zertifikatsüberprüfung fehlgeschlagen: %s" -#: fe-secure-openssl.c:1573 +#: fe-secure-openssl.c:1566 #, c-format msgid "This may indicate that the server does not support any SSL protocol version between %s and %s." msgstr "Das zeigt möglicherweise an, dass der Server keine SSL-Protokollversion zwischen %s und %s unterstützt." -#: fe-secure-openssl.c:1606 +#: fe-secure-openssl.c:1598 +#, c-format +msgid "direct SSL connection was established without ALPN protocol negotiation extension" +msgstr "direkte SSL-Verbindung wurde ohne ALPN-Erweiterung zur Protokollverhandlung aufgebaut" + +#: fe-secure-openssl.c:1610 +#, c-format +msgid "SSL connection was established with unexpected ALPN protocol" +msgstr "SSL-Verbindung wurde mit unerwartetem ALPN-Protokoll aufgebaut" + +#: fe-secure-openssl.c:1627 #, c-format msgid "certificate could not be obtained: %s" msgstr "Zertifikat konnte nicht ermittelt werden: %s" -#: fe-secure-openssl.c:1711 +#: fe-secure-openssl.c:1734 #, c-format msgid "no SSL error reported" msgstr "kein SSL-Fehler berichtet" -#: fe-secure-openssl.c:1720 +#: fe-secure-openssl.c:1777 #, c-format msgid "SSL error code %lu" msgstr "SSL-Fehlercode %lu" -#: fe-secure-openssl.c:1986 +#: fe-secure-openssl.c:2076 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "WARNUNG: sslpassword abgeschnitten\n" -#: fe-secure.c:263 +#: fe-secure.c:248 #, c-format msgid "could not receive data from server: %s" msgstr "konnte keine Daten vom Server empfangen: %s" -#: fe-secure.c:434 +#: fe-secure.c:419 #, c-format msgid "could not send data to server: %s" msgstr "konnte keine Daten an den Server senden: %s" diff --git a/src/interfaces/libpq/po/el.po b/src/interfaces/libpq/po/el.po index cb286d41b0da5..d957fe85a5dde 100644 --- a/src/interfaces/libpq/po/el.po +++ b/src/interfaces/libpq/po/el.po @@ -7,1308 +7,1581 @@ # msgid "" msgstr "" -"Project-Id-Version: libpq (PostgreSQL) 14\n" +"Project-Id-Version: libpq (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-07-14 05:09+0000\n" -"PO-Revision-Date: 2021-07-14 10:16+0200\n" +"POT-Creation-Date: 2023-08-14 23:10+0000\n" +"PO-Revision-Date: 2023-08-15 11:46+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.3.2\n" -#: fe-auth-scram.c:213 -msgid "malformed SCRAM message (empty message)\n" -msgstr "κακοσχηματισμένο μήνυμα SCRAM (κενό μήνυμα)\n" - -#: fe-auth-scram.c:219 -msgid "malformed SCRAM message (length mismatch)\n" -msgstr "κακοσχηματισμένο μήνυμα SCRAM (αναντιστοιχία μήκους)\n" - -#: fe-auth-scram.c:263 -msgid "could not verify server signature\n" -msgstr "δεν ήταν δυνατή πιστοποίηση της υπογÏαφής του διακομιστή\n" - -#: fe-auth-scram.c:270 -msgid "incorrect server signature\n" -msgstr "λανθασμένη υπογÏαφή διακομιστή\n" - -#: fe-auth-scram.c:279 -msgid "invalid SCRAM exchange state\n" -msgstr "άκυÏη κατάσταση ανταλλαγής SCRAM\n" - -#: fe-auth-scram.c:306 -#, c-format -msgid "malformed SCRAM message (attribute \"%c\" expected)\n" -msgstr "κακοσχηματισμένο μήνυμα SCRAM (αναμένεται χαÏακτηÏιστικό «%c»)\n" - -#: fe-auth-scram.c:315 -#, c-format -msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" -msgstr "κακοσχηματισμένο μήνυμα SCRAM (αναμένεται χαÏακτήÏας «=» για το χαÏακτηÏιστικό «%c»)\n" - -#: fe-auth-scram.c:356 -msgid "could not generate nonce\n" -msgstr "δεν δÏναται να δημιουÏγήσει nonce\n" - -#: fe-auth-scram.c:366 fe-auth-scram.c:441 fe-auth-scram.c:595 -#: fe-auth-scram.c:616 fe-auth-scram.c:642 fe-auth-scram.c:657 -#: fe-auth-scram.c:707 fe-auth-scram.c:746 fe-auth.c:290 fe-auth.c:362 -#: fe-auth.c:398 fe-auth.c:615 fe-auth.c:774 fe-auth.c:1132 fe-auth.c:1282 -#: fe-connect.c:911 fe-connect.c:1455 fe-connect.c:1624 fe-connect.c:2976 -#: fe-connect.c:4657 fe-connect.c:4918 fe-connect.c:5037 fe-connect.c:5289 -#: fe-connect.c:5370 fe-connect.c:5469 fe-connect.c:5725 fe-connect.c:5754 -#: fe-connect.c:5826 fe-connect.c:5850 fe-connect.c:5868 fe-connect.c:5969 -#: fe-connect.c:5978 fe-connect.c:6336 fe-connect.c:6486 fe-exec.c:1209 -#: fe-exec.c:3029 fe-exec.c:3212 fe-exec.c:3985 fe-exec.c:4150 -#: fe-gssapi-common.c:111 fe-lobj.c:881 fe-protocol3.c:1016 fe-protocol3.c:1724 -#: fe-secure-common.c:110 fe-secure-gssapi.c:504 fe-secure-openssl.c:440 -#: fe-secure-openssl.c:1133 -msgid "out of memory\n" -msgstr "έλλειψη μνήμης\n" +#: ../../port/thread.c:50 ../../port/thread.c:86 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "δεν ήταν δυνατή η αναζήτηση ID Ï„Î¿Ï€Î¹ÎºÎ¿Ï Ï‡Ïήστη %d: %s" + +#: ../../port/thread.c:55 ../../port/thread.c:91 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "δεν υπάÏχει τοπικός χÏήστης με ID %d" + +#: fe-auth-scram.c:227 +#, c-format +msgid "malformed SCRAM message (empty message)" +msgstr "κακοσχηματισμένο μήνυμα SCRAM (κενό μήνυμα)" + +#: fe-auth-scram.c:232 +#, c-format +msgid "malformed SCRAM message (length mismatch)" +msgstr "κακοσχηματισμένο μήνυμα SCRAM (αναντιστοιχία μήκους)" + +#: fe-auth-scram.c:275 +#, c-format +msgid "could not verify server signature: %s" +msgstr "δεν ήταν δυνατή πιστοποίηση της υπογÏαφής του διακομιστή: %s" + +#: fe-auth-scram.c:281 +#, c-format +msgid "incorrect server signature" +msgstr "λανθασμένη υπογÏαφή διακομιστή" + +#: fe-auth-scram.c:290 +#, c-format +msgid "invalid SCRAM exchange state" +msgstr "άκυÏη κατάσταση ανταλλαγής SCRAM" + +#: fe-auth-scram.c:317 +#, c-format +msgid "malformed SCRAM message (attribute \"%c\" expected)" +msgstr "κακοσχηματισμένο μήνυμα SCRAM (αναμένεται χαÏακτηÏιστικό «%c»)" + +#: fe-auth-scram.c:326 +#, c-format +msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")" +msgstr "κακοσχηματισμένο μήνυμα SCRAM (αναμένεται χαÏακτήÏας «=» για το χαÏακτηÏιστικό «%c»)" -#: fe-auth-scram.c:374 -msgid "could not encode nonce\n" -msgstr "δεν δÏναται να κωδικοποιήσει nonce\n" +#: fe-auth-scram.c:366 +#, c-format +msgid "could not generate nonce" +msgstr "δεν δÏναται να δημιουÏγήσει nonce" + +#: fe-auth-scram.c:375 fe-auth-scram.c:448 fe-auth-scram.c:600 +#: fe-auth-scram.c:620 fe-auth-scram.c:644 fe-auth-scram.c:658 +#: fe-auth-scram.c:704 fe-auth-scram.c:740 fe-auth-scram.c:914 fe-auth.c:296 +#: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:729 fe-auth.c:1210 +#: fe-auth.c:1375 fe-connect.c:925 fe-connect.c:1759 fe-connect.c:1921 +#: fe-connect.c:3291 fe-connect.c:4496 fe-connect.c:5161 fe-connect.c:5416 +#: fe-connect.c:5534 fe-connect.c:5781 fe-connect.c:5861 fe-connect.c:5959 +#: fe-connect.c:6210 fe-connect.c:6237 fe-connect.c:6313 fe-connect.c:6336 +#: fe-connect.c:6360 fe-connect.c:6395 fe-connect.c:6481 fe-connect.c:6489 +#: fe-connect.c:6846 fe-connect.c:6996 fe-exec.c:527 fe-exec.c:1321 +#: fe-exec.c:3111 fe-exec.c:4071 fe-exec.c:4235 fe-gssapi-common.c:109 +#: fe-lobj.c:870 fe-protocol3.c:204 fe-protocol3.c:228 fe-protocol3.c:256 +#: fe-protocol3.c:273 fe-protocol3.c:353 fe-protocol3.c:720 fe-protocol3.c:959 +#: fe-protocol3.c:1770 fe-protocol3.c:2170 fe-secure-common.c:110 +#: fe-secure-gssapi.c:500 fe-secure-openssl.c:434 fe-secure-openssl.c:1285 +#, c-format +msgid "out of memory" +msgstr "έλλειψη μνήμης" -#: fe-auth-scram.c:563 -msgid "could not calculate client proof\n" -msgstr "δεν δÏναται να υπολογίσει την απόδειξη του πελάτη\n" +#: fe-auth-scram.c:382 +#, c-format +msgid "could not encode nonce" +msgstr "δεν δÏναται να κωδικοποιήσει nonce" -#: fe-auth-scram.c:579 -msgid "could not encode client proof\n" -msgstr "δεν δÏναται να κωδικοποιήσει την απόδειξη του πελάτη\n" +#: fe-auth-scram.c:570 +#, c-format +msgid "could not calculate client proof: %s" +msgstr "δεν μπόÏεσε να υπολογίσει την απόδειξη του πελάτη: %s" -#: fe-auth-scram.c:634 -msgid "invalid SCRAM response (nonce mismatch)\n" -msgstr "μη έγκυÏη απόκÏιση SCRAM (ασυμφωνία nonce)\n" +#: fe-auth-scram.c:585 +#, c-format +msgid "could not encode client proof" +msgstr "δεν δÏναται να κωδικοποιήσει την απόδειξη του πελάτη" + +#: fe-auth-scram.c:637 +#, c-format +msgid "invalid SCRAM response (nonce mismatch)" +msgstr "μη έγκυÏη απόκÏιση SCRAM (ασυμφωνία nonce)" #: fe-auth-scram.c:667 -msgid "malformed SCRAM message (invalid salt)\n" -msgstr "κακοσχηματισμένο μήνυμα SCRAM (άκυÏο salt)\n" +#, c-format +msgid "malformed SCRAM message (invalid salt)" +msgstr "κακοσχηματισμένο μήνυμα SCRAM (άκυÏο salt)" -#: fe-auth-scram.c:681 -msgid "malformed SCRAM message (invalid iteration count)\n" -msgstr "κακοσχηματισμένο μήνυμα SCRAM (άκυÏη μέτÏηση επαναλήψεων)\n" +#: fe-auth-scram.c:680 +#, c-format +msgid "malformed SCRAM message (invalid iteration count)" +msgstr "κακοσχηματισμένο μήνυμα SCRAM (άκυÏη μέτÏηση επαναλήψεων)" -#: fe-auth-scram.c:687 -msgid "malformed SCRAM message (garbage at end of server-first-message)\n" -msgstr "κακοσχηματισμένο μήνυμα SCRAM (σκουπίδια στο τέλος του Ï€Ïώτου-μηνÏματος-διακομιστή)\n" +#: fe-auth-scram.c:685 +#, c-format +msgid "malformed SCRAM message (garbage at end of server-first-message)" +msgstr "κακοσχηματισμένο μήνυμα SCRAM (σκουπίδια στο τέλος του Ï€Ïώτου-μηνÏματος-διακομιστή)" -#: fe-auth-scram.c:723 +#: fe-auth-scram.c:719 #, c-format -msgid "error received from server in SCRAM exchange: %s\n" -msgstr "ελήφθει σφάλμα από τον διακομιστή κατά την ανταλλαγή SCRAM: %s\n" +msgid "error received from server in SCRAM exchange: %s" +msgstr "ελήφθει σφάλμα από τον διακομιστή κατά την ανταλλαγή SCRAM: %s" -#: fe-auth-scram.c:739 -msgid "malformed SCRAM message (garbage at end of server-final-message)\n" -msgstr "κακοσχηματισμένο μήνυμα SCRAM (σκουπίδια στο τέλος του τελικοÏ-μηνÏματος-διακομιστή)\n" +#: fe-auth-scram.c:734 +#, c-format +msgid "malformed SCRAM message (garbage at end of server-final-message)" +msgstr "κακοσχηματισμένο μήνυμα SCRAM (σκουπίδια στο τέλος του τελικοÏ-μηνÏματος-διακομιστή)" -#: fe-auth-scram.c:758 -msgid "malformed SCRAM message (invalid server signature)\n" -msgstr "κακοσχηματισμένο μήνυμα SCRAM (άκυÏη υπογÏαφή διακομιστή)\n" +#: fe-auth-scram.c:751 +#, c-format +msgid "malformed SCRAM message (invalid server signature)" +msgstr "κακοσχηματισμένο μήνυμα SCRAM (άκυÏη υπογÏαφή διακομιστή)" -#: fe-auth.c:76 +#: fe-auth-scram.c:923 +msgid "could not generate random salt" +msgstr "δεν δÏναται να δημιουÏγήσει τυχαίο salt" + +#: fe-auth.c:77 #, c-format -msgid "out of memory allocating GSSAPI buffer (%d)\n" -msgstr "η μνήμη δεν επαÏκεί για την εκχώÏηση της ενδιάμεσης μνήμης του GSSAPI (%d)\n" +msgid "out of memory allocating GSSAPI buffer (%d)" +msgstr "η μνήμη δεν επαÏκεί για την εκχώÏηση της ενδιάμεσης μνήμης του GSSAPI (%d)" -#: fe-auth.c:131 +#: fe-auth.c:138 msgid "GSSAPI continuation error" msgstr "σφάλμα συνέχισης GSSAPI" -#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:98 -msgid "host name must be specified\n" -msgstr "Ï€Ïέπει να καθοÏιστεί το όνομα κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î®\n" +#: fe-auth.c:168 fe-auth.c:397 fe-gssapi-common.c:97 fe-secure-common.c:99 +#: fe-secure-common.c:173 +#, c-format +msgid "host name must be specified" +msgstr "Ï€Ïέπει να καθοÏιστεί το όνομα κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î®" -#: fe-auth.c:165 -msgid "duplicate GSS authentication request\n" -msgstr "διπλότυπη αίτηση ελέγχου ταυτότητας GSS\n" +#: fe-auth.c:174 +#, c-format +msgid "duplicate GSS authentication request" +msgstr "διπλότυπη αίτηση ελέγχου ταυτότητας GSS" -#: fe-auth.c:230 +#: fe-auth.c:238 #, c-format -msgid "out of memory allocating SSPI buffer (%d)\n" -msgstr "η μνήμη δεν επαÏκεί για την εκχώÏηση της ενδιάμεσης μνήμης του SSPI (%d)\n" +msgid "out of memory allocating SSPI buffer (%d)" +msgstr "η μνήμη δεν επαÏκεί για την εκχώÏηση της ενδιάμεσης μνήμης του SSPI (%d)" -#: fe-auth.c:278 +#: fe-auth.c:285 msgid "SSPI continuation error" msgstr "σφάλμα συνέχισης SSPI" -#: fe-auth.c:351 -msgid "duplicate SSPI authentication request\n" -msgstr "διπλότυπη αίτηση ελέγχου ταυτότητας SSPI\n" +#: fe-auth.c:359 +#, c-format +msgid "duplicate SSPI authentication request" +msgstr "διπλότυπη αίτηση ελέγχου ταυτότητας SSPI" -#: fe-auth.c:377 +#: fe-auth.c:384 msgid "could not acquire SSPI credentials" msgstr "δεν δÏναται η απόκτηση διαπιστευτηÏίων SSPI" -#: fe-auth.c:433 -msgid "channel binding required, but SSL not in use\n" -msgstr "απαιτείται σÏνδεση καναλιοÏ, αλλά δεν χÏησιμοποιείται SSL\n" +#: fe-auth.c:437 +#, c-format +msgid "channel binding required, but SSL not in use" +msgstr "απαιτείται σÏνδεση καναλιοÏ, αλλά δεν χÏησιμοποιείται SSL" + +#: fe-auth.c:443 +#, c-format +msgid "duplicate SASL authentication request" +msgstr "διπλότυπη αίτηση ελέγχου ταυτότητας SASL" + +#: fe-auth.c:501 +#, c-format +msgid "channel binding is required, but client does not support it" +msgstr "απαιτείται σÏνδεση καναλιοÏ, αλλά ο πελάτης δεν την υποστηÏίζει" + +#: fe-auth.c:517 +#, c-format +msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection" +msgstr "ο διακομιστής Ï€ÏοσέφεÏε έλεγχο ταυτότητας SCRAM-SHA-256-PLUS μέσω σÏνδεσης που δεν είναι SSL" + +#: fe-auth.c:531 +#, c-format +msgid "none of the server's SASL authentication mechanisms are supported" +msgstr "δεν υποστηÏίζεται κανένας από τους μηχανισμοÏÏ‚ ελέγχου ταυτότητας SASL του διακομιστή" + +#: fe-auth.c:538 +#, c-format +msgid "channel binding is required, but server did not offer an authentication method that supports channel binding" +msgstr "απαιτείται σÏνδεση καναλιοÏ, αλλά ο διακομιστής δεν Ï€ÏοσέφεÏε καμία μέθοδο ελέγχου ταυτότητας που να υποστηÏίζει σÏνδεση καναλιοÏ" + +#: fe-auth.c:641 +#, c-format +msgid "out of memory allocating SASL buffer (%d)" +msgstr "η μνήμη δεν επαÏκεί για την εκχώÏηση της ενδιάμεσης μνήμης του SASL (%d)" + +#: fe-auth.c:665 +#, c-format +msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed" +msgstr "παÏαλήφθηκε AuthenticationSASLFinal από το διακομιστή, αλλά ο έλεγχος ταυτότητας SASL δεν έχει ολοκληÏωθεί" + +#: fe-auth.c:675 +#, c-format +msgid "no client response found after SASL exchange success" +msgstr "δεν βÏέθηκε απάντηση πελάτη μετά την επιτυχία της ανταλλαγής SASL" + +#: fe-auth.c:738 fe-auth.c:745 fe-auth.c:1358 fe-auth.c:1369 +#, c-format +msgid "could not encrypt password: %s" +msgstr "δεν ήταν δυνατή η κÏυπτογÏάφηση του ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης : %s" -#: fe-auth.c:440 -msgid "duplicate SASL authentication request\n" -msgstr "διπλότυπη αίτηση ελέγχου ταυτότητας SASL\n" +#: fe-auth.c:773 +msgid "server requested a cleartext password" +msgstr "ο διακομιστής απαίτησε έναν κωδικό Ï€Ïόσβασης καθαÏÎ¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï…" -#: fe-auth.c:496 -msgid "channel binding is required, but client does not support it\n" -msgstr "απαιτείται σÏνδεση καναλιοÏ, αλλά ο πελάτης δεν την υποστηÏίζει\n" +#: fe-auth.c:775 +msgid "server requested a hashed password" +msgstr "ο διακομιστής απαίτησε έναν κατακεÏματισμένο κωδικό Ï€Ïόσβασης" -#: fe-auth.c:513 -msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" -msgstr "ο διακομιστής Ï€ÏοσέφεÏε έλεγχο ταυτότητας SCRAM-SHA-256-PLUS μέσω σÏνδεσης που δεν είναι SSL\n" +#: fe-auth.c:778 +msgid "server requested GSSAPI authentication" +msgstr "ο διακομιστής απαίτησε έλεγχο ταυτότητας GSSAPI" -#: fe-auth.c:525 -msgid "none of the server's SASL authentication mechanisms are supported\n" -msgstr "δεν υποστηÏίζεται κανένας από τους μηχανισμοÏÏ‚ ελέγχου ταυτότητας SASL του διακομιστή\n" +#: fe-auth.c:780 +msgid "server requested SSPI authentication" +msgstr "ο διακομιστής απαίτησε έλεγχο ταυτότητας SSPI" -#: fe-auth.c:533 -msgid "channel binding is required, but server did not offer an authentication method that supports channel binding\n" -msgstr "απαιτείται σÏνδεση καναλιοÏ, αλλά ο διακομιστής δεν Ï€ÏοσέφεÏε καμία μέθοδο ελέγχου ταυτότητας που να υποστηÏίζει σÏνδεση καναλιοÏ\n" +#: fe-auth.c:784 +msgid "server requested SASL authentication" +msgstr "ο διακομιστής απαίτησε έλεγχο ταυτότητας SASL" -#: fe-auth.c:639 +#: fe-auth.c:787 +msgid "server requested an unknown authentication type" +msgstr "ο διακομιστής απαίτησε έναν άγνωστο Ï„Ïπο ελέγχου ταυτότητας" + +#: fe-auth.c:820 #, c-format -msgid "out of memory allocating SASL buffer (%d)\n" -msgstr "η μνήμη δεν επαÏκεί για την εκχώÏηση της ενδιάμεσης μνήμης του SASL (%d)\n" +msgid "server did not request an SSL certificate" +msgstr "ο διακομιστής δεν απαίτησε πιστοποιητικό SSL" -#: fe-auth.c:664 -msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed\n" -msgstr "παÏαλήφθηκε AuthenticationSASLFinal από το διακομιστή, αλλά ο έλεγχος ταυτότητας SASL έχει ολοκληÏωθεί\n" +#: fe-auth.c:825 +#, c-format +msgid "server accepted connection without a valid SSL certificate" +msgstr "ο διακομιστής αποδέχθηκε σÏνδεση χωÏίς έγκυÏο πιστοποιητικό SSL" -#: fe-auth.c:741 -msgid "SCM_CRED authentication method not supported\n" -msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης SCM_CRED\n" +#: fe-auth.c:879 +msgid "server did not complete authentication" +msgstr "ο διακομιστής δεν ολοκλήÏωσε την πιστοποίηση" -#: fe-auth.c:836 -msgid "channel binding required, but server authenticated client without channel binding\n" -msgstr "απαιτείται σÏνδεση καναλιοÏ, αλλά ο διακομιστής πιστοποίησε τον πελάτη χωÏίς σÏνδεση καναλιοÏ\n" +#: fe-auth.c:913 +#, c-format +msgid "authentication method requirement \"%s\" failed: %s" +msgstr "η απαιτοÏμενη μέθοδος πιστοποίησης «%s» απέτυχε: %s" -#: fe-auth.c:842 -msgid "channel binding required but not supported by server's authentication request\n" -msgstr "απαιτείται σÏνδεση ÎºÎ±Î½Î±Î»Î¹Î¿Ï Î±Î»Î»Î¬ αυτή δεν υποστηÏίζεται από την αίτηση ελέγχου ταυτότητας του διακομιστή\n" +#: fe-auth.c:936 +#, c-format +msgid "channel binding required, but server authenticated client without channel binding" +msgstr "απαιτείται σÏνδεση καναλιοÏ, αλλά ο διακομιστής πιστοποίησε τον πελάτη χωÏίς σÏνδεση καναλιοÏ" -#: fe-auth.c:877 -msgid "Kerberos 4 authentication not supported\n" -msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης Kerberos 4\n" +#: fe-auth.c:941 +#, c-format +msgid "channel binding required but not supported by server's authentication request" +msgstr "απαιτείται σÏνδεση ÎºÎ±Î½Î±Î»Î¹Î¿Ï Î±Î»Î»Î¬ αυτή δεν υποστηÏίζεται από την αίτηση ελέγχου ταυτότητας του διακομιστή" -#: fe-auth.c:882 -msgid "Kerberos 5 authentication not supported\n" -msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης Kerberos 5\n" +#: fe-auth.c:975 +#, c-format +msgid "Kerberos 4 authentication not supported" +msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης Kerberos 4" -#: fe-auth.c:953 -msgid "GSSAPI authentication not supported\n" -msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης GSSAPI\n" +#: fe-auth.c:979 +#, c-format +msgid "Kerberos 5 authentication not supported" +msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης Kerberos 5" -#: fe-auth.c:985 -msgid "SSPI authentication not supported\n" -msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης SSPI\n" +#: fe-auth.c:1049 +#, c-format +msgid "GSSAPI authentication not supported" +msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης GSSAPI" -#: fe-auth.c:993 -msgid "Crypt authentication not supported\n" -msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης Crypt\n" +#: fe-auth.c:1080 +#, c-format +msgid "SSPI authentication not supported" +msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης SSPI" -#: fe-auth.c:1060 +#: fe-auth.c:1087 #, c-format -msgid "authentication method %u not supported\n" -msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης %u\n" +msgid "Crypt authentication not supported" +msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης Crypt" -#: fe-auth.c:1107 +#: fe-auth.c:1151 #, c-format -msgid "user name lookup failure: error code %lu\n" -msgstr "αποτυχία αναζήτησης ονόματος χÏήστη: κωδικός σφάλματος % lu\n" +msgid "authentication method %u not supported" +msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης %u" -#: fe-auth.c:1117 fe-connect.c:2851 +#: fe-auth.c:1197 #, c-format -msgid "could not look up local user ID %d: %s\n" -msgstr "δεν ήταν δυνατή η αναζήτηση ID Ï„Î¿Ï€Î¹ÎºÎ¿Ï Ï‡Ïήστη %d: %s\n" +msgid "user name lookup failure: error code %lu" +msgstr "αποτυχία αναζήτησης ονόματος χÏήστη: κωδικός σφάλματος %lu" -#: fe-auth.c:1122 fe-connect.c:2856 +#: fe-auth.c:1321 #, c-format -msgid "local user with ID %d does not exist\n" -msgstr "δεν υπάÏχει τοπικός χÏήστης με ID %d\n" +msgid "unexpected shape of result set returned for SHOW" +msgstr "μη αναμενόμενο σχήμα συνόλου αποτελεσμάτων που επιστÏάφηκε από την εντολή SHOW" -#: fe-auth.c:1226 -msgid "unexpected shape of result set returned for SHOW\n" -msgstr "μη αναμενόμενο σχήμα συνόλου αποτελεσμάτων που επιστÏάφηκε από την εντολή SHOW\n" +#: fe-auth.c:1329 +#, c-format +msgid "password_encryption value too long" +msgstr "Ï€Î¿Î»Ï Î¼Î±ÎºÏυά τιμή password_encryption" -#: fe-auth.c:1235 -msgid "password_encryption value too long\n" -msgstr "Ï€Î¿Î»Ï Î¼Î±ÎºÏυά τιμή password_encryption\n" +#: fe-auth.c:1379 +#, c-format +msgid "unrecognized password encryption algorithm \"%s\"" +msgstr "μη αναγνωÏίσιμος αλγόÏιθμος κÏυπτογÏάφησης «%s» ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης" + +#: fe-connect.c:1132 +#, c-format +msgid "could not match %d host names to %d hostaddr values" +msgstr "δεν μπόÏεσε να ταιÏιάξει %d ονομασίες διακομιστών με %d τιμές hostaddr" + +#: fe-connect.c:1212 +#, c-format +msgid "could not match %d port numbers to %d hosts" +msgstr "δεν μπόÏεσε να ταιÏιάξει %d αÏιθμοÏÏ‚ θυÏών με %d διακομιστές" + +#: fe-connect.c:1337 +#, c-format +msgid "negative require_auth method \"%s\" cannot be mixed with non-negative methods" +msgstr "η αÏνητική μέθοδος require_auth «%s» δεν μποÏεί να συνδυαστεί με μη αÏνητικές μεθόδους" + +#: fe-connect.c:1350 +#, c-format +msgid "require_auth method \"%s\" cannot be mixed with negative methods" +msgstr "η μέθοδος require_auth «%s» δεν μποÏεί να συνδυαστεί με αÏνητικές μεθόδους" -#: fe-auth.c:1275 +#: fe-connect.c:1410 fe-connect.c:1461 fe-connect.c:1503 fe-connect.c:1559 +#: fe-connect.c:1567 fe-connect.c:1598 fe-connect.c:1644 fe-connect.c:1684 +#: fe-connect.c:1705 #, c-format -msgid "unrecognized password encryption algorithm \"%s\"\n" -msgstr "μη αναγνωÏίσιμος αλγόÏιθμος κÏυπτογÏάφησης «%s» ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης\n" +msgid "invalid %s value: \"%s\"" +msgstr "άκυÏο %s τιμή: «%s»" -#: fe-connect.c:1094 +#: fe-connect.c:1443 #, c-format -msgid "could not match %d host names to %d hostaddr values\n" -msgstr "δεν μπόÏεσε να ταιÏιάξει %d ονομασίες διακομιστών με %d τιμές hostaddr\n" +msgid "require_auth method \"%s\" is specified more than once" +msgstr "η μέθοδος require_auth «%s» χÏησιμοποιείται πεÏισσότεÏες από μία φοÏές" -#: fe-connect.c:1175 +#: fe-connect.c:1484 fe-connect.c:1523 fe-connect.c:1606 #, c-format -msgid "could not match %d port numbers to %d hosts\n" -msgstr "δεν μπόÏεσε να ταιÏιάξει %d αÏιθμοÏÏ‚ θυÏών με %d διακομιστές\n" +msgid "%s value \"%s\" invalid when SSL support is not compiled in" +msgstr "%s τιμή «%s» είναι άκυÏη όταν η υποστήÏιξη SSL δεν έχει μεταγλωττιστεί (compiled)" -#: fe-connect.c:1268 fe-connect.c:1294 fe-connect.c:1336 fe-connect.c:1345 -#: fe-connect.c:1378 fe-connect.c:1422 +#: fe-connect.c:1546 #, c-format -msgid "invalid %s value: \"%s\"\n" -msgstr "άκυÏο %s τιμή: «%s»\n" +msgid "weak sslmode \"%s\" may not be used with sslrootcert=system (use \"verify-full\")" +msgstr "το αδÏναμο sslmode «%s» δεν μποÏεί να χÏησιμοποιηθεί με sslrootcert=system (χÏησιμοποιήστε το «verify-full»)" -#: fe-connect.c:1315 +#: fe-connect.c:1584 #, c-format -msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" -msgstr "η τιμή SSLmode «%s» είναι άκυÏη όταν η υποστήÏιξη SSL δεν έχει μεταγλωττιστεί (compiled)\n" +msgid "invalid SSL protocol version range" +msgstr "άκυÏο εÏÏος εκδόσεων Ï€Ïωτοκόλλου SSL" -#: fe-connect.c:1363 -msgid "invalid SSL protocol version range\n" -msgstr "άκυÏο εÏÏος εκδόσεων Ï€Ïωτοκόλλου SSL\n" +#: fe-connect.c:1621 +#, c-format +msgid "%s value \"%s\" is not supported (check OpenSSL version)" +msgstr "%s τιμή «%s» δεν υποστοιÏίζεται (έλεγξε την έκδοση OpenSSL)" -#: fe-connect.c:1388 +#: fe-connect.c:1651 #, c-format -msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" -msgstr "η τιμή SSLmode «%s» είναι άκυÏη όταν η υποστήÏιξη GSSAPI δεν έχει μεταγλωττιστεί (compiled)\n" +msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in" +msgstr "η τιμή SSLmode «%s» είναι άκυÏη όταν η υποστήÏιξη GSSAPI δεν έχει μεταγλωττιστεί (compiled)" -#: fe-connect.c:1648 +#: fe-connect.c:1944 #, c-format -msgid "could not set socket to TCP no delay mode: %s\n" -msgstr "δεν μπόÏεσε να οÏίσει τον υποδοχέα σε λειτουÏγία TCP χωÏίς καθυστέÏηση: %s\n" +msgid "could not set socket to TCP no delay mode: %s" +msgstr "δεν μπόÏεσε να οÏίσει τον υποδοχέα σε λειτουÏγία TCP χωÏίς καθυστέÏηση: %s" -#: fe-connect.c:1710 +#: fe-connect.c:2003 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "σÏνδεση στον διακομιστή στην υποδοχή «%s» απέτυχε: " -#: fe-connect.c:1737 +#: fe-connect.c:2029 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "σÏνδεση στον διακομιστή σε «%s» (%s), θÏÏα %s απέτυχε: " -#: fe-connect.c:1742 +#: fe-connect.c:2034 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "σÏνδεση στον διακομιστή σε «%s», θÏÏα %s απέτυχε: " -#: fe-connect.c:1767 -msgid "\tIs the server running locally and accepting connections on that socket?\n" -msgstr "\tΕκτελείται τοπικά ο διακομιστής και αποδέχεται συνδέσεις σε αυτή την υποδοχή;\n" +#: fe-connect.c:2057 +#, c-format +msgid "\tIs the server running locally and accepting connections on that socket?" +msgstr "\tΕκτελείται τοπικά ο διακομιστής και αποδέχεται συνδέσεις σε αυτή την υποδοχή;" -#: fe-connect.c:1771 -msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" -msgstr "\tΕκτελείται ο διακομιστής σε αυτόν τον κεντÏικό υπολογιστή και αποδέχεται συνδέσεις TCP/IP;\n" +#: fe-connect.c:2059 +#, c-format +msgid "\tIs the server running on that host and accepting TCP/IP connections?" +msgstr "\tΕκτελείται ο διακομιστής σε αυτόν τον κεντÏικό υπολογιστή και αποδέχεται συνδέσεις TCP/IP;" -#: fe-connect.c:1835 +#: fe-connect.c:2122 #, c-format -msgid "invalid integer value \"%s\" for connection option \"%s\"\n" -msgstr "άκυÏη τιμή ακεÏαίου »%s» για την επιλογή σÏνδεσης «%s»\n" +msgid "invalid integer value \"%s\" for connection option \"%s\"" +msgstr "άκυÏη τιμή ακεÏαίου »%s» για την επιλογή σÏνδεσης «%s»" -#: fe-connect.c:1865 fe-connect.c:1900 fe-connect.c:1936 fe-connect.c:2025 -#: fe-connect.c:2639 +#: fe-connect.c:2151 fe-connect.c:2185 fe-connect.c:2220 fe-connect.c:2318 +#: fe-connect.c:2973 #, c-format -msgid "%s(%s) failed: %s\n" -msgstr "%s(%s) απέτυχε: %s\n" +msgid "%s(%s) failed: %s" +msgstr "%s(%s) απέτυχε: %s" -#: fe-connect.c:1990 +#: fe-connect.c:2284 #, c-format -msgid "%s(%s) failed: error code %d\n" -msgstr "%s(%s) απέτυχε: κωδικός σφάλματος %d\n" +msgid "%s(%s) failed: error code %d" +msgstr "%s(%s) απέτυχε: κωδικός σφάλματος %d" -#: fe-connect.c:2305 -msgid "invalid connection state, probably indicative of memory corruption\n" -msgstr "μη έγκυÏη κατάσταση σÏνδεσης, πιθανώς ενδεικτική αλλοίωσης μνήμης\n" +#: fe-connect.c:2597 +#, c-format +msgid "invalid connection state, probably indicative of memory corruption" +msgstr "μη έγκυÏη κατάσταση σÏνδεσης, πιθανώς ενδεικτική αλλοίωσης μνήμης" -#: fe-connect.c:2384 +#: fe-connect.c:2676 #, c-format -msgid "invalid port number: \"%s\"\n" -msgstr "μη έγκυÏος αÏιθμός Ï€Ïλης: «%s»\n" +msgid "invalid port number: \"%s\"" +msgstr "μη έγκυÏος αÏιθμός Ï€Ïλης: «%s»" -#: fe-connect.c:2400 +#: fe-connect.c:2690 #, c-format -msgid "could not translate host name \"%s\" to address: %s\n" -msgstr "δεν ήταν δυνατή η μετάφÏαση του ονόματος κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® «%s» στη διεÏθυνση: %s\n" +msgid "could not translate host name \"%s\" to address: %s" +msgstr "δεν ήταν δυνατή η μετάφÏαση του ονόματος κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® «%s» στη διεÏθυνση: %s" -#: fe-connect.c:2413 +#: fe-connect.c:2702 #, c-format -msgid "could not parse network address \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η ανάλυση της διεÏθυνσης δικτÏου «%s»: %s\n" +msgid "could not parse network address \"%s\": %s" +msgstr "δεν ήταν δυνατή η ανάλυση της διεÏθυνσης δικτÏου «%s»: %s" -#: fe-connect.c:2426 +#: fe-connect.c:2713 #, c-format -msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" -msgstr "η διαδÏομή υποδοχής τομέα Unix «%s» είναι Ï€Î¿Î»Ï Î¼Î±ÎºÏυά (μέγιστο %d bytes)\n" +msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" +msgstr "η διαδÏομή υποδοχής τομέα Unix «%s» είναι Ï€Î¿Î»Ï Î¼Î±ÎºÏυά (μέγιστο %d bytes)" -#: fe-connect.c:2441 +#: fe-connect.c:2727 #, c-format -msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" -msgstr "δεν ήταν δυνατή η μετάφÏαση της διαδÏομής υποδοχής πεδίου-Unix «%s» στη διεÏθυνση: %s\n" +msgid "could not translate Unix-domain socket path \"%s\" to address: %s" +msgstr "δεν ήταν δυνατή η μετάφÏαση της διαδÏομής υποδοχής πεδίου-Unix «%s» στη διεÏθυνση: %s" -#: fe-connect.c:2567 +#: fe-connect.c:2901 #, c-format -msgid "could not create socket: %s\n" -msgstr "δεν ήταν δυνατή η δημιουÏγία υποδοχέα: %s\n" +msgid "could not create socket: %s" +msgstr "δεν ήταν δυνατή η δημιουÏγία υποδοχέα: %s" -#: fe-connect.c:2598 +#: fe-connect.c:2932 #, c-format -msgid "could not set socket to nonblocking mode: %s\n" -msgstr "δεν ήταν δυνατή η ÏÏθμιση της υποδοχής σε λειτουÏγία μη αποκλεισμοÏ: %s\n" +msgid "could not set socket to nonblocking mode: %s" +msgstr "δεν ήταν δυνατή η ÏÏθμιση της υποδοχής σε λειτουÏγία μη αποκλεισμοÏ: %s" -#: fe-connect.c:2608 +#: fe-connect.c:2943 #, c-format -msgid "could not set socket to close-on-exec mode: %s\n" -msgstr "δεν ήταν δυνατή η ÏÏθμιση της υποδοχής σε λειτουÏγία close-on-exec: %s\n" +msgid "could not set socket to close-on-exec mode: %s" +msgstr "δεν ήταν δυνατή η ÏÏθμιση της υποδοχής σε λειτουÏγία close-on-exec: %s" -#: fe-connect.c:2626 -msgid "keepalives parameter must be an integer\n" -msgstr "η παÏάμετÏος keepalives Ï€Ïέπει να είναι ακέÏαιος\n" +#: fe-connect.c:2961 +#, c-format +msgid "keepalives parameter must be an integer" +msgstr "η παÏάμετÏος keepalives Ï€Ïέπει να είναι ακέÏαιος" -#: fe-connect.c:2767 +#: fe-connect.c:3100 #, c-format -msgid "could not get socket error status: %s\n" -msgstr "δεν ήταν δυνατή η απόκτηση κατάστασης σφάλματος της υποδοχής: %s\n" +msgid "could not get socket error status: %s" +msgstr "δεν ήταν δυνατή η απόκτηση κατάστασης σφάλματος της υποδοχής: %s" -#: fe-connect.c:2795 +#: fe-connect.c:3127 #, c-format -msgid "could not get client address from socket: %s\n" -msgstr "δεν ήταν δυνατή η απόκτηση διεÏθυνσης πελάτη από την υποδοχή: %s\n" +msgid "could not get client address from socket: %s" +msgstr "δεν ήταν δυνατή η απόκτηση διεÏθυνσης πελάτη από την υποδοχή: %s" -#: fe-connect.c:2837 -msgid "requirepeer parameter is not supported on this platform\n" -msgstr "η παÏάμετÏος requirepeer δεν υποστηÏίζεται από την παÏοÏσα πλατφόÏμα\n" +#: fe-connect.c:3165 +#, c-format +msgid "requirepeer parameter is not supported on this platform" +msgstr "η παÏάμετÏος requirepeer δεν υποστηÏίζεται από την παÏοÏσα πλατφόÏμα" -#: fe-connect.c:2840 +#: fe-connect.c:3167 #, c-format -msgid "could not get peer credentials: %s\n" -msgstr "δεν ήταν δυνατή η απόκτηση διαπιστευτηÏίων από peer: %s\n" +msgid "could not get peer credentials: %s" +msgstr "δεν ήταν δυνατή η απόκτηση διαπιστευτηÏίων από peer: %s" -#: fe-connect.c:2864 +#: fe-connect.c:3180 #, c-format -msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" -msgstr "το requirepeer καθοÏίζει «%s», αλλά το Ï€Ïαγματικό όνομα ομότιμου χÏήστη είναι «%s»\n" +msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"" +msgstr "το requirepeer καθοÏίζει «%s», αλλά το Ï€Ïαγματικό όνομα ομότιμου χÏήστη είναι «%s»" -#: fe-connect.c:2904 +#: fe-connect.c:3221 #, c-format -msgid "could not send GSSAPI negotiation packet: %s\n" -msgstr "δεν ήταν δυνατή η αποστολή GSSAPI πακέτου διαπÏαγμάτευσης: %s\n" +msgid "could not send GSSAPI negotiation packet: %s" +msgstr "δεν ήταν δυνατή η αποστολή GSSAPI πακέτου διαπÏαγμάτευσης: %s" -#: fe-connect.c:2916 -msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)\n" -msgstr "GSSAPI κÏυπτογÏάφηση απαιτείται αλλά ήταν αδÏνατη (πιθανώς απουσία cache διαπιστευτηÏίων, απουσία υποστήÏιξης διακομιστή, ή χÏησιμοποιείται τοπική υποδοχή)\n" +#: fe-connect.c:3233 +#, c-format +msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)" +msgstr "GSSAPI κÏυπτογÏάφηση απαιτείται αλλά ήταν αδÏνατη (πιθανώς απουσία cache διαπιστευτηÏίων, απουσία υποστήÏιξης διακομιστή, ή χÏησιμοποιείται τοπική υποδοχή)" -#: fe-connect.c:2958 +#: fe-connect.c:3274 #, c-format -msgid "could not send SSL negotiation packet: %s\n" -msgstr "" -"δεν ήταν δυνατή η αποστολή SSL πακέτου διαπÏαγμάτευσης: %s\n" -"\n" +msgid "could not send SSL negotiation packet: %s" +msgstr "δεν ήταν δυνατή η αποστολή SSL πακέτου διαπÏαγμάτευσης: %s" -#: fe-connect.c:2989 +#: fe-connect.c:3303 #, c-format -msgid "could not send startup packet: %s\n" -msgstr "δεν ήταν δυνατή η αποστολή πακέτου εκκίνησης: %s\n" +msgid "could not send startup packet: %s" +msgstr "δεν ήταν δυνατή η αποστολή πακέτου εκκίνησης: %s" -#: fe-connect.c:3065 -msgid "server does not support SSL, but SSL was required\n" -msgstr "ο διακομιστής δεν υποστηÏίζει SSL, αλλά απαιτείται SSL\n" +#: fe-connect.c:3378 +#, c-format +msgid "server does not support SSL, but SSL was required" +msgstr "ο διακομιστής δεν υποστηÏίζει SSL, αλλά απαιτείται SSL" -#: fe-connect.c:3092 +#: fe-connect.c:3404 #, c-format -msgid "received invalid response to SSL negotiation: %c\n" -msgstr "έλαβε μη έγκυÏη απάντηση κατά τη διαπÏαγμάτευση SSL: %c\n" +msgid "received invalid response to SSL negotiation: %c" +msgstr "έλαβε μη έγκυÏη απάντηση κατά τη διαπÏαγμάτευση SSL: %c" -#: fe-connect.c:3181 -msgid "server doesn't support GSSAPI encryption, but it was required\n" -msgstr "ο διακομιστής δεν υποστηÏίζει κÏυπτογÏάφηση GSSAPI, αλλά αυτή ήταν απαÏαίτητη\n" +#: fe-connect.c:3424 +#, c-format +msgid "received unencrypted data after SSL response" +msgstr "έλαβε μη κÏυπτογÏαφημένα δεδομένα μετά την απάντηση SSL" -#: fe-connect.c:3193 +#: fe-connect.c:3504 #, c-format -msgid "received invalid response to GSSAPI negotiation: %c\n" -msgstr "έλαβε μη έγκυÏη απάντηση κατά τη διαπÏαγμάτευση GSSAPI: %c\n" +msgid "server doesn't support GSSAPI encryption, but it was required" +msgstr "ο διακομιστής δεν υποστηÏίζει κÏυπτογÏάφηση GSSAPI, αλλά αυτή ήταν απαÏαίτητη" -#: fe-connect.c:3259 fe-connect.c:3284 +#: fe-connect.c:3515 #, c-format -msgid "expected authentication request from server, but received %c\n" -msgstr "ανέμενε αίτηση ελέγχου ταυτότητας από το διακομιστή, αλλά αντί αυτής ελήφθη %c\n" +msgid "received invalid response to GSSAPI negotiation: %c" +msgstr "έλαβε μη έγκυÏη απάντηση κατά τη διαπÏαγμάτευση GSSAPI: %c" -#: fe-connect.c:3491 -msgid "unexpected message from server during startup\n" -msgstr "μη αναμενόμενο μήνυμα από το διακομιστή κατά την εκκίνηση\n" +#: fe-connect.c:3533 +#, c-format +msgid "received unencrypted data after GSSAPI encryption response" +msgstr "λήψη μη κÏυπτογÏαφημένων δεδομένων μετά την απάντηση κÏυπτογÏάφησης GSSAPI" + +#: fe-connect.c:3598 +#, c-format +msgid "expected authentication request from server, but received %c" +msgstr "ανέμενε αίτηση ελέγχου ταυτότητας από το διακομιστή, αλλά αντί αυτής ελήφθη %c" + +#: fe-connect.c:3625 fe-connect.c:3794 +#, c-format +msgid "received invalid authentication request" +msgstr "έλαβε μη έγκυÏη αίτηση πιστοποίησης" + +#: fe-connect.c:3630 fe-connect.c:3779 +#, c-format +msgid "received invalid protocol negotiation message" +msgstr "έλαβε μη έγκυÏο μήνυμα διαπÏαγμάτευσης Ï€Ïωτοκόλλου" + +#: fe-connect.c:3648 fe-connect.c:3702 +#, c-format +msgid "received invalid error message" +msgstr "έλαβε άκυÏο μήνυμα σφάλματος" -#: fe-connect.c:3583 -msgid "session is read-only\n" -msgstr "η πεÏίοδος λειτουÏγίας είναι μόνο για ανάγνωση\n" +#: fe-connect.c:3865 +#, c-format +msgid "unexpected message from server during startup" +msgstr "μη αναμενόμενο μήνυμα από το διακομιστή κατά την εκκίνηση" -#: fe-connect.c:3586 -msgid "session is not read-only\n" -msgstr "η πεÏίοδος λειτουÏγίας δεν είναι μόνο για ανάγνωση\n" +#: fe-connect.c:3956 +#, c-format +msgid "session is read-only" +msgstr "η πεÏίοδος λειτουÏγίας είναι μόνο για ανάγνωση" -#: fe-connect.c:3640 -msgid "server is in hot standby mode\n" -msgstr "%s: ο διακομιστής βÏίσκεται σε hot κατάσταση αναμονής\n" +#: fe-connect.c:3958 +#, c-format +msgid "session is not read-only" +msgstr "η πεÏίοδος λειτουÏγίας δεν είναι μόνο για ανάγνωση" -#: fe-connect.c:3643 -msgid "server is not in hot standby mode\n" -msgstr "ο διακομιστής δεν βÏίσκεται σε hot κατάσταση αναμονής\n" +#: fe-connect.c:4011 +#, c-format +msgid "server is in hot standby mode" +msgstr "ο διακομιστής βÏίσκεται σε hot κατάσταση αναμονής" -#: fe-connect.c:3754 fe-connect.c:3806 +#: fe-connect.c:4013 #, c-format -msgid "\"%s\" failed\n" -msgstr "«%s» απέτυχε.\n" +msgid "server is not in hot standby mode" +msgstr "ο διακομιστής δεν βÏίσκεται σε hot κατάσταση αναμονής" -#: fe-connect.c:3820 +#: fe-connect.c:4129 fe-connect.c:4179 #, c-format -msgid "invalid connection state %d, probably indicative of memory corruption\n" -msgstr "κατάσταση μη έγκυÏης σÏνδεσης %d, πιθανώς ενδεικτική αλλοίωσης της μνήμης\n" +msgid "\"%s\" failed" +msgstr "«%s» απέτυχε" -#: fe-connect.c:4266 fe-connect.c:4326 +#: fe-connect.c:4193 #, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEventProc «%s» απέτυχε κατά τη διάÏκεια συμβάντος PGEVT_CONNRESET\n" +msgid "invalid connection state %d, probably indicative of memory corruption" +msgstr "κατάσταση μη έγκυÏης σÏνδεσης %d, πιθανώς ενδεικτική αλλοίωσης της μνήμης" -#: fe-connect.c:4670 +#: fe-connect.c:5174 #, c-format -msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" -msgstr "άκυÏη διεÏθυνση URL LDAP «%s»: ο συνδυασμός Ï€Ïέπει να είναι ldap://\n" +msgid "invalid LDAP URL \"%s\": scheme must be ldap://" +msgstr "άκυÏη διεÏθυνση URL LDAP «%s»: ο συνδυασμός Ï€Ïέπει να είναι ldap://" -#: fe-connect.c:4685 +#: fe-connect.c:5189 #, c-format -msgid "invalid LDAP URL \"%s\": missing distinguished name\n" -msgstr "άκυÏη διεÏθυνση URL LDAP «%s»: λείπει το αποκλειστικό όνομα\n" +msgid "invalid LDAP URL \"%s\": missing distinguished name" +msgstr "άκυÏη διεÏθυνση URL LDAP «%s»: λείπει το αποκλειστικό όνομα" -#: fe-connect.c:4697 fe-connect.c:4755 +#: fe-connect.c:5201 fe-connect.c:5259 #, c-format -msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" -msgstr "άκυÏη διεÏθυνση URL LDAP «%s»: Ï€Ïέπει να πεÏιέχει ακÏιβώς ένα χαÏακτηÏιστικό\n" +msgid "invalid LDAP URL \"%s\": must have exactly one attribute" +msgstr "άκυÏη διεÏθυνση URL LDAP «%s»: Ï€Ïέπει να πεÏιέχει ακÏιβώς ένα χαÏακτηÏιστικό" -#: fe-connect.c:4709 fe-connect.c:4771 +#: fe-connect.c:5213 fe-connect.c:5275 #, c-format -msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" -msgstr "άκυÏη διεÏθυνση URL LDAP «%s»: Ï€Ïέπει να έχει εμβέλεια αναζήτησης (base/one/sub)\n" +msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" +msgstr "άκυÏη διεÏθυνση URL LDAP «%s»: Ï€Ïέπει να έχει εμβέλεια αναζήτησης (base/one/sub)" -#: fe-connect.c:4721 +#: fe-connect.c:5225 #, c-format -msgid "invalid LDAP URL \"%s\": no filter\n" -msgstr "άκυÏη διεÏθυνση URL LDAP «%s»: κανένα φίλτÏο\n" +msgid "invalid LDAP URL \"%s\": no filter" +msgstr "άκυÏη διεÏθυνση URL LDAP «%s»: κανένα φίλτÏο" -#: fe-connect.c:4743 +#: fe-connect.c:5247 #, c-format -msgid "invalid LDAP URL \"%s\": invalid port number\n" -msgstr "άκυÏη διεÏθυνση URL LDAP «%s»: άκυÏος αÏιθμός θÏÏας\n" +msgid "invalid LDAP URL \"%s\": invalid port number" +msgstr "άκυÏη διεÏθυνση URL LDAP «%s»: άκυÏος αÏιθμός θÏÏας" -#: fe-connect.c:4781 -msgid "could not create LDAP structure\n" -msgstr "δεν ήταν δυνατή η δημιουÏγία δομής LDAP\n" +#: fe-connect.c:5284 +#, c-format +msgid "could not create LDAP structure" +msgstr "δεν ήταν δυνατή η δημιουÏγία δομής LDAP" -#: fe-connect.c:4857 +#: fe-connect.c:5359 #, c-format -msgid "lookup on LDAP server failed: %s\n" -msgstr "απέτυχε η αναζήτηση στον διακομιστή LDAP: %s\n" +msgid "lookup on LDAP server failed: %s" +msgstr "απέτυχε η αναζήτηση στον διακομιστή LDAP: %s" -#: fe-connect.c:4868 -msgid "more than one entry found on LDAP lookup\n" -msgstr "βÏέθηκαν πεÏισσότεÏες από μία καταχωÏήσεις στην αναζήτηση LDAP\n" +#: fe-connect.c:5369 +#, c-format +msgid "more than one entry found on LDAP lookup" +msgstr "βÏέθηκαν πεÏισσότεÏες από μία καταχωÏήσεις στην αναζήτηση LDAP" -#: fe-connect.c:4869 fe-connect.c:4881 -msgid "no entry found on LDAP lookup\n" -msgstr "δεν βÏέθηκε καταχώÏηση στην αναζήτηση LDAP\n" +#: fe-connect.c:5371 fe-connect.c:5382 +#, c-format +msgid "no entry found on LDAP lookup" +msgstr "δεν βÏέθηκε καταχώÏηση στην αναζήτηση LDAP" -#: fe-connect.c:4892 fe-connect.c:4905 -msgid "attribute has no values on LDAP lookup\n" -msgstr "το χαÏακτηÏιστικό δεν έχει τιμές στην αναζήτηση LDAP\n" +#: fe-connect.c:5392 fe-connect.c:5404 +#, c-format +msgid "attribute has no values on LDAP lookup" +msgstr "το χαÏακτηÏιστικό δεν έχει τιμές στην αναζήτηση LDAP" -#: fe-connect.c:4957 fe-connect.c:4976 fe-connect.c:5508 +#: fe-connect.c:5455 fe-connect.c:5474 fe-connect.c:5998 #, c-format -msgid "missing \"=\" after \"%s\" in connection info string\n" -msgstr "λείπει το «=» μετά από «%s» στην συμβολοσειÏά πληÏοφοÏίας σÏνδεσης\n" +msgid "missing \"=\" after \"%s\" in connection info string" +msgstr "λείπει το «=» μετά από «%s» στην συμβολοσειÏά πληÏοφοÏίας σÏνδεσης" -#: fe-connect.c:5049 fe-connect.c:5693 fe-connect.c:6469 +#: fe-connect.c:5545 fe-connect.c:6181 fe-connect.c:6979 #, c-format -msgid "invalid connection option \"%s\"\n" -msgstr "άκυÏη επιλογή σÏνδεσης «%s»\n" +msgid "invalid connection option \"%s\"" +msgstr "άκυÏη επιλογή σÏνδεσης «%s»" -#: fe-connect.c:5065 fe-connect.c:5557 -msgid "unterminated quoted string in connection info string\n" -msgstr "ατεÏμάτιστη συμβολοσειÏά με εισαγωγικά στην συμβολοσειÏά πληÏοφοÏίας σÏνδεσης\n" +#: fe-connect.c:5560 fe-connect.c:6046 +#, c-format +msgid "unterminated quoted string in connection info string" +msgstr "ατεÏμάτιστη συμβολοσειÏά με εισαγωγικά στην συμβολοσειÏά πληÏοφοÏίας σÏνδεσης" -#: fe-connect.c:5146 +#: fe-connect.c:5640 #, c-format -msgid "definition of service \"%s\" not found\n" -msgstr "δεν βÏέθηκε ο οÏισμός της υπηÏεσίας «%s»\n" +msgid "definition of service \"%s\" not found" +msgstr "δεν βÏέθηκε ο οÏισμός της υπηÏεσίας «%s»" -#: fe-connect.c:5172 +#: fe-connect.c:5666 #, c-format -msgid "service file \"%s\" not found\n" -msgstr "δεν βÏέθηκε αÏχείο υπηÏεσίας «%s»\n" +msgid "service file \"%s\" not found" +msgstr "δεν βÏέθηκε αÏχείο υπηÏεσίας «%s»" -#: fe-connect.c:5186 +#: fe-connect.c:5679 #, c-format -msgid "line %d too long in service file \"%s\"\n" -msgstr "Î Î¿Î»Ï Î¼Î±ÎºÏυά γÏαμμή %d στο αÏχείο υπηÏεσίας «%s»\n" +msgid "line %d too long in service file \"%s\"" +msgstr "Ï€Î¿Î»Ï Î¼Î±ÎºÏυά γÏαμμή %d στο αÏχείο υπηÏεσίας «%s»" -#: fe-connect.c:5257 fe-connect.c:5301 +#: fe-connect.c:5750 fe-connect.c:5793 #, c-format -msgid "syntax error in service file \"%s\", line %d\n" -msgstr "συντακτικό σφάλμα στο αÏχείο υπηÏεσίας «%s», γÏαμμή %d\n" +msgid "syntax error in service file \"%s\", line %d" +msgstr "συντακτικό σφάλμα στο αÏχείο υπηÏεσίας «%s», γÏαμμή %d" -#: fe-connect.c:5268 +#: fe-connect.c:5761 #, c-format -msgid "nested service specifications not supported in service file \"%s\", line %d\n" -msgstr "οι ένθετες Ï€ÏοδιαγÏαφές υπηÏεσίας δεν υποστηÏίζονται στο αÏχείο υπηÏεσίας «%s», γÏαμμή %d\n" +msgid "nested service specifications not supported in service file \"%s\", line %d" +msgstr "οι ένθετες Ï€ÏοδιαγÏαφές υπηÏεσίας δεν υποστηÏίζονται στο αÏχείο υπηÏεσίας «%s», γÏαμμή %d" -#: fe-connect.c:5989 +#: fe-connect.c:6500 #, c-format -msgid "invalid URI propagated to internal parser routine: \"%s\"\n" -msgstr "μη έγκυÏο URI διαδόθηκε στη Ïουτίνα εσωτεÏικής ανάλυσης: «%s»\n" +msgid "invalid URI propagated to internal parser routine: \"%s\"" +msgstr "μη έγκυÏο URI διαδόθηκε στη Ïουτίνα εσωτεÏικής ανάλυσης: «%s»" -#: fe-connect.c:6066 +#: fe-connect.c:6577 #, c-format -msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" -msgstr "έφτασε στο τέλος της συμβολοσειÏάς κατά την αναζήτηση αντίστοιχου «]» στη διεÏθυνση IPv6 κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® στο URI: «%s»\n" +msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"" +msgstr "έφτασε στο τέλος της συμβολοσειÏάς κατά την αναζήτηση αντίστοιχου «]» στη διεÏθυνση IPv6 κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® στο URI: «%s»" -#: fe-connect.c:6073 +#: fe-connect.c:6584 #, c-format -msgid "IPv6 host address may not be empty in URI: \"%s\"\n" -msgstr "η διεÏθυνση IPv6 κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® δεν δÏναται να είναι κενή στο URI: «%s»\n" +msgid "IPv6 host address may not be empty in URI: \"%s\"" +msgstr "η διεÏθυνση IPv6 κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® δεν δÏναται να είναι κενή στο URI: «%s»" -#: fe-connect.c:6088 +#: fe-connect.c:6599 #, c-format -msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" -msgstr "μη αναμενόμενος χαÏακτήÏας «%c» στη θέση %d του URI (αναμένεται «:» ή «/»): «%s»\n" +msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"" +msgstr "μη αναμενόμενος χαÏακτήÏας «%c» στη θέση %d του URI (αναμένεται «:» ή «/»): «%s»" -#: fe-connect.c:6218 +#: fe-connect.c:6728 #, c-format -msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "επιπλέον διαχωÏιστικό κλειδιοÏ/τιμής «=» στην παÏάμετÏο εÏωτήματος URI: «%s»\n" +msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "επιπλέον διαχωÏιστικό κλειδιοÏ/τιμής «=» στην παÏάμετÏο εÏωτήματος URI: «%s»" -#: fe-connect.c:6238 +#: fe-connect.c:6748 #, c-format -msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "λείπει διαχωÏιστικό κλειδιοÏ/τιμής «=» στην παÏάμετÏο εÏωτήματος URI: «%s»\n" +msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "λείπει διαχωÏιστικό κλειδιοÏ/τιμής «=» στην παÏάμετÏο εÏωτήματος URI: «%s»" -#: fe-connect.c:6290 +#: fe-connect.c:6800 #, c-format -msgid "invalid URI query parameter: \"%s\"\n" -msgstr "άκυÏη παÏάμετÏος εÏωτήματος URI: «%s»\n" +msgid "invalid URI query parameter: \"%s\"" +msgstr "άκυÏη παÏάμετÏος εÏωτήματος URI: «%s»" -#: fe-connect.c:6364 +#: fe-connect.c:6874 #, c-format -msgid "invalid percent-encoded token: \"%s\"\n" -msgstr "άκυÏο διακÏιτικό με κωδικοποίηση ποσοστοÏ: «%s»\n" +msgid "invalid percent-encoded token: \"%s\"" +msgstr "άκυÏο διακÏιτικό με κωδικοποίηση ποσοστοÏ: «%s»" -#: fe-connect.c:6374 +#: fe-connect.c:6884 #, c-format -msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" -msgstr "απαγοÏευμένη τιμή %%00 σε τιμή κωδικοποιημένου ποσοστοÏ: «%s»\n" +msgid "forbidden value %%00 in percent-encoded value: \"%s\"" +msgstr "απαγοÏευμένη τιμή %%00 σε τιμή κωδικοποιημένου ποσοστοÏ: «%s»" -#: fe-connect.c:6744 +#: fe-connect.c:7248 msgid "connection pointer is NULL\n" msgstr "ο δείκτης σÏνδεσης είναι NULL\n" -#: fe-connect.c:7024 +#: fe-connect.c:7256 fe-exec.c:710 fe-exec.c:970 fe-exec.c:3292 +#: fe-protocol3.c:974 fe-protocol3.c:1007 +msgid "out of memory\n" +msgstr "έλλειψη μνήμης\n" + +#: fe-connect.c:7547 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: το αÏχείο κωδικών Ï€Ïόσβασης «%s» δεν είναι ένα απλό αÏχείο\n" -#: fe-connect.c:7033 +#: fe-connect.c:7556 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "ΠΡΟΕΙΔΟΠΟΙΗΣΗ: το αÏχείο ÎºÏ‰Î´Î¹ÎºÎ¿Ï Ï€Ïόσβασης «%s» έχει ομαδική ή παγκόσμια Ï€Ïόσβαση· τα δικαιώματα Ï€Ïέπει να είναι U=RW (0600) ή λιγότεÏα\n" -#: fe-connect.c:7141 +#: fe-connect.c:7663 #, c-format -msgid "password retrieved from file \"%s\"\n" -msgstr "ο κωδικός Ï€Ïόσβασης ελήφθει από αÏχείο «%s»\n" +msgid "password retrieved from file \"%s\"" +msgstr "ο κωδικός Ï€Ïόσβασης ελήφθει από αÏχείο «%s»" -#: fe-exec.c:449 fe-exec.c:3286 +#: fe-exec.c:466 fe-exec.c:3366 #, c-format msgid "row number %d is out of range 0..%d" msgstr "ο αÏιθμός σειÏάς %d βÏίσκεται εκτός εÏÏους 0..%d" -#: fe-exec.c:510 fe-protocol3.c:219 fe-protocol3.c:244 fe-protocol3.c:273 -#: fe-protocol3.c:291 fe-protocol3.c:371 fe-protocol3.c:743 fe-protocol3.c:975 -msgid "out of memory" -msgstr "έλλειψη μνήμης" - -#: fe-exec.c:511 fe-protocol3.c:1932 +#: fe-exec.c:528 fe-protocol3.c:1976 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:778 -msgid "write to server failed\n" -msgstr "απέτυχε η εγγÏαφή στον διακομιστή\n" +#: fe-exec.c:831 +#, c-format +msgid "write to server failed" +msgstr "απέτυχε η εγγÏαφή στον διακομιστή" + +#: fe-exec.c:869 +#, c-format +msgid "no error text available" +msgstr "κανένα μήνυμα σφάλματος διαθέσιμο" -#: fe-exec.c:850 +#: fe-exec.c:958 msgid "NOTICE" msgstr "NOTICE" -#: fe-exec.c:908 +#: fe-exec.c:1016 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "το PGresult δεν μποÏεί να υποστηÏίξει πεÏισσότεÏες πλείαδες από INT_MAX" -#: fe-exec.c:920 +#: fe-exec.c:1028 msgid "size_t overflow" msgstr "υπεÏχείλιση overflow" -#: fe-exec.c:1335 fe-exec.c:1440 fe-exec.c:1489 -msgid "command string is a null pointer\n" -msgstr "η συμβολοσειÏά εντολής είναι ένας κενός δείκτης\n" +#: fe-exec.c:1444 fe-exec.c:1513 fe-exec.c:1559 +#, c-format +msgid "command string is a null pointer" +msgstr "η συμβολοσειÏά εντολής είναι ένας κενός δείκτης" -#: fe-exec.c:1446 fe-exec.c:1495 fe-exec.c:1591 +#: fe-exec.c:1450 fe-exec.c:2888 #, c-format -msgid "number of parameters must be between 0 and %d\n" -msgstr "ο αÏιθμός των παÏαμέτÏων Ï€Ïέπει να είναι Î¼ÎµÏ„Î±Î¾Ï 0 και %d\n" +msgid "%s not allowed in pipeline mode" +msgstr "%s δεν επιτÏέπεται σε λειτουÏγία αγωγοÏ" -#: fe-exec.c:1483 fe-exec.c:1585 -msgid "statement name is a null pointer\n" -msgstr "η ονομασία της δήλωσης είναι ένας κενός δείκτης\n" +#: fe-exec.c:1518 fe-exec.c:1564 fe-exec.c:1658 +#, c-format +msgid "number of parameters must be between 0 and %d" +msgstr "ο αÏιθμός των παÏαμέτÏων Ï€Ïέπει να είναι Î¼ÎµÏ„Î±Î¾Ï 0 και %d" -#: fe-exec.c:1627 fe-exec.c:3139 -msgid "no connection to the server\n" -msgstr "καμία σÏνδεση στον διακομιστή\n" +#: fe-exec.c:1554 fe-exec.c:1653 +#, c-format +msgid "statement name is a null pointer" +msgstr "η ονομασία της δήλωσης είναι ένας κενός δείκτης" -#: fe-exec.c:1636 fe-exec.c:3148 -msgid "another command is already in progress\n" -msgstr "υπάÏχει άλλη εντολή σε Ï€Ïόοδο\n" +#: fe-exec.c:1695 fe-exec.c:3220 +#, c-format +msgid "no connection to the server" +msgstr "καμία σÏνδεση στον διακομιστή" -#: fe-exec.c:1665 -msgid "cannot queue commands during COPY\n" -msgstr "δεν είναι δυνατή η ουÏά εντολών κατά τη διάÏκεια του COPY\n" +#: fe-exec.c:1703 fe-exec.c:3228 +#, c-format +msgid "another command is already in progress" +msgstr "υπάÏχει άλλη εντολή σε Ï€Ïόοδο" -#: fe-exec.c:1783 -msgid "length must be given for binary parameter\n" -msgstr "το μήκος Ï€Ïέπει να πεÏαστεί ως δυαδική παÏάμετÏος\n" +#: fe-exec.c:1733 +#, c-format +msgid "cannot queue commands during COPY" +msgstr "δεν είναι δυνατή η ουÏά εντολών κατά τη διάÏκεια του COPY" -#: fe-exec.c:2103 +#: fe-exec.c:1850 #, c-format -msgid "unexpected asyncStatus: %d\n" -msgstr "μη αναμενόμενο asyncStatus: %d\n" +msgid "length must be given for binary parameter" +msgstr "το μήκος Ï€Ïέπει να πεÏαστεί ως δυαδική παÏάμετÏος" -#: fe-exec.c:2123 +#: fe-exec.c:2171 #, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "PGEventProc «%s» κατά τη διάÏκεια συμβάντος PGEVT_RESULTCREATE\n" +msgid "unexpected asyncStatus: %d" +msgstr "μη αναμενόμενο asyncStatus: %d" -#: fe-exec.c:2271 -msgid "synchronous command execution functions are not allowed in pipeline mode\n" -msgstr "οι συναÏτήσεις σÏγχÏονης εκτέλεσης εντολών δεν επιτÏέπονται σε λειτουÏγία διοχέτευσης\n" +#: fe-exec.c:2327 +#, c-format +msgid "synchronous command execution functions are not allowed in pipeline mode" +msgstr "οι συναÏτήσεις σÏγχÏονης εκτέλεσης εντολών δεν επιτÏέπονται σε λειτουÏγία διοχέτευσης" -#: fe-exec.c:2293 +#: fe-exec.c:2344 msgid "COPY terminated by new PQexec" msgstr "COPY τεÏματίστηκε από νέο PQexec" -#: fe-exec.c:2310 -msgid "PQexec not allowed during COPY BOTH\n" -msgstr "PQexec δεν επιτÏέπεται κατά τη διάÏκεια COPY BOTH\n" +#: fe-exec.c:2360 +#, c-format +msgid "PQexec not allowed during COPY BOTH" +msgstr "PQexec δεν επιτÏέπεται κατά τη διάÏκεια COPY BOTH" -#: fe-exec.c:2538 fe-exec.c:2594 fe-exec.c:2663 fe-protocol3.c:1863 -msgid "no COPY in progress\n" -msgstr "κανένα COPY σε εξέλιξη\n" +#: fe-exec.c:2586 fe-exec.c:2641 fe-exec.c:2709 fe-protocol3.c:1907 +#, c-format +msgid "no COPY in progress" +msgstr "κανένα COPY σε εξέλιξη" -#: fe-exec.c:2840 -msgid "PQfn not allowed in pipeline mode\n" -msgstr "το PQfn δεν επιτÏέπεται σε λειτουÏγία διοχέτευσης\n" +#: fe-exec.c:2895 +#, c-format +msgid "connection in wrong state" +msgstr "σÏνδεση σε λανθάνουσα κατάσταση" -#: fe-exec.c:2848 -msgid "connection in wrong state\n" -msgstr "σÏνδεση σε λανθάνουσα κατάσταση\n" +#: fe-exec.c:2938 +#, c-format +msgid "cannot enter pipeline mode, connection not idle" +msgstr "δεν ήταν δυνατή η είσοδος σε λειτουÏγία διοχέτευσης, σÏνδεση μη αδÏανή" -#: fe-exec.c:2892 -msgid "cannot enter pipeline mode, connection not idle\n" -msgstr "δεν ήταν δυνατή η είσοδος σε λειτουÏγία διοχέτευσης, σÏνδεση μη αδÏανή\n" +#: fe-exec.c:2974 fe-exec.c:2995 +#, c-format +msgid "cannot exit pipeline mode with uncollected results" +msgstr "δεν είναι δυνατή η έξοδος από τη λειτουÏγία διοχέτευσης με μη λαμβανόμενα αποτελέσματα" -#: fe-exec.c:2926 fe-exec.c:2943 -msgid "cannot exit pipeline mode with uncollected results\n" -msgstr "δεν είναι δυνατή η έξοδος από τη λειτουÏγία διοχέτευσης με μη λαμβανόμενα αποτελέσματα\n" +#: fe-exec.c:2978 +#, c-format +msgid "cannot exit pipeline mode while busy" +msgstr "δεν είναι δυνατή η έξοδος από τη λειτουÏγία διοχέτευσης ενώ απασχολείται" -#: fe-exec.c:2931 -msgid "cannot exit pipeline mode while busy\n" -msgstr "δεν είναι δυνατή η έξοδος από τη λειτουÏγία διοχέτευσης ενώ απασχολείται\n" +#: fe-exec.c:2989 +#, c-format +msgid "cannot exit pipeline mode while in COPY" +msgstr "δεν μποÏεί να εξέλθει από τη λειτουÏγία Î±Î³Ï‰Î³Î¿Ï ÎµÎ½ÏŽ βÏίσκεται σε COPY" -#: fe-exec.c:3073 -msgid "cannot send pipeline when not in pipeline mode\n" -msgstr "δεν είναι δυνατή η αποστολή διοχέτευσης όταν δεν βÏίσκεται σε λειτουÏγία διοχέτευσης\n" +#: fe-exec.c:3154 +#, c-format +msgid "cannot send pipeline when not in pipeline mode" +msgstr "δεν είναι δυνατή η αποστολή διοχέτευσης όταν δεν βÏίσκεται σε λειτουÏγία διοχέτευσης" -#: fe-exec.c:3175 +#: fe-exec.c:3255 msgid "invalid ExecStatusType code" msgstr "άκυÏος κωδικός ExecStatusType" -#: fe-exec.c:3202 +#: fe-exec.c:3282 msgid "PGresult is not an error result\n" msgstr "PGresult δεν είναι ένα αποτέλεσμα σφάλματος\n" -#: fe-exec.c:3270 fe-exec.c:3293 +#: fe-exec.c:3350 fe-exec.c:3373 #, c-format msgid "column number %d is out of range 0..%d" msgstr "αÏιθμός στήλης %d βÏίσκεται εκτός εÏÏους 0..%d" -#: fe-exec.c:3308 +#: fe-exec.c:3388 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "αÏιθμός παÏαμέτÏου %d βÏίσκεται εκτός εÏÏους 0..%d" -#: fe-exec.c:3618 +#: fe-exec.c:3699 #, c-format msgid "could not interpret result from server: %s" msgstr "δεν μπόÏεσε να εÏμηνεÏσει το αποτέλεσμα από τον διακομιστή: %s" -#: fe-exec.c:3878 fe-exec.c:3967 -msgid "incomplete multibyte character\n" -msgstr "ελλιπής χαÏακτήÏας πολλαπλών byte\n" +#: fe-exec.c:3964 fe-exec.c:4054 +#, c-format +msgid "incomplete multibyte character" +msgstr "ελλιπής χαÏακτήÏας πολλαπλών byte" -#: fe-gssapi-common.c:124 +#: fe-gssapi-common.c:122 msgid "GSSAPI name import error" msgstr "σφάλμα εισαγωγής ονόματος GSSAPI" -#: fe-lobj.c:145 fe-lobj.c:210 fe-lobj.c:403 fe-lobj.c:494 fe-lobj.c:568 -#: fe-lobj.c:969 fe-lobj.c:977 fe-lobj.c:985 fe-lobj.c:993 fe-lobj.c:1001 -#: fe-lobj.c:1009 fe-lobj.c:1017 fe-lobj.c:1025 +#: fe-lobj.c:144 fe-lobj.c:207 fe-lobj.c:397 fe-lobj.c:487 fe-lobj.c:560 +#: fe-lobj.c:956 fe-lobj.c:963 fe-lobj.c:970 fe-lobj.c:977 fe-lobj.c:984 +#: fe-lobj.c:991 fe-lobj.c:998 fe-lobj.c:1005 #, c-format -msgid "cannot determine OID of function %s\n" -msgstr "δεν ήταν δυνατός ο Ï€ÏοσδιοÏισμός του OID της συνάÏτησης %s\n" +msgid "cannot determine OID of function %s" +msgstr "δεν ήταν δυνατός ο Ï€ÏοσδιοÏισμός του OID της συνάÏτησης %s" -#: fe-lobj.c:162 -msgid "argument of lo_truncate exceeds integer range\n" -msgstr "η παÏάμετÏος του lo_truncate υπεÏβαίνει το εÏÏος ακέÏαιων\n" +#: fe-lobj.c:160 +#, c-format +msgid "argument of lo_truncate exceeds integer range" +msgstr "η παÏάμετÏος του lo_truncate υπεÏβαίνει το εÏÏος ακέÏαιων" -#: fe-lobj.c:266 -msgid "argument of lo_read exceeds integer range\n" -msgstr "η παÏάμετÏος του lo_read υπεÏβαίνει το εÏÏος ακέÏαιων\n" +#: fe-lobj.c:262 +#, c-format +msgid "argument of lo_read exceeds integer range" +msgstr "η παÏάμετÏος του lo_read υπεÏβαίνει το εÏÏος ακέÏαιων" -#: fe-lobj.c:318 -msgid "argument of lo_write exceeds integer range\n" -msgstr "η παÏάμετÏος του lo_write υπεÏβαίνει το εÏÏος ακέÏαιων\n" +#: fe-lobj.c:313 +#, c-format +msgid "argument of lo_write exceeds integer range" +msgstr "η παÏάμετÏος του lo_write υπεÏβαίνει το εÏÏος ακέÏαιων" -#: fe-lobj.c:678 fe-lobj.c:789 +#: fe-lobj.c:669 fe-lobj.c:780 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»: %s\n" +msgid "could not open file \"%s\": %s" +msgstr "δεν ήταν δυνατό το άνοιγμα του αÏχείου «%s»: %s" -#: fe-lobj.c:734 +#: fe-lobj.c:725 #, c-format -msgid "could not read from file \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η ανάγνωση από το αÏχείο «%s»: %s\n" +msgid "could not read from file \"%s\": %s" +msgstr "δεν ήταν δυνατή η ανάγνωση από το αÏχείο «%s»: %s" -#: fe-lobj.c:810 fe-lobj.c:834 +#: fe-lobj.c:801 fe-lobj.c:824 #, c-format -msgid "could not write to file \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η εγγÏαφή στο αÏχείο »%s»: %s\n" +msgid "could not write to file \"%s\": %s" +msgstr "δεν ήταν δυνατή η εγγÏαφή στο αÏχείο »%s»: %s" -#: fe-lobj.c:920 -msgid "query to initialize large object functions did not return data\n" -msgstr "το εÏώτημα αÏχικοποίησης συναÏτήσεων μεγάλων αντικειμένων δεν επέστÏεψε δεδομένα\n" +#: fe-lobj.c:908 +#, c-format +msgid "query to initialize large object functions did not return data" +msgstr "το εÏώτημα αÏχικοποίησης συναÏτήσεων μεγάλων αντικειμένων δεν επέστÏεψε δεδομένα" -#: fe-misc.c:242 +#: fe-misc.c:240 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "ακέÏαιος μεγέθους %lu δεν υποστηÏίζεται από pqGetInt" -#: fe-misc.c:275 +#: fe-misc.c:273 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "ακέÏαιος μεγέθους %lu δεν υποστηÏίζεται από pqPutInt" -#: fe-misc.c:576 fe-misc.c:822 -msgid "connection not open\n" -msgstr "μη ανοικτή σÏνδεση\n" +#: fe-misc.c:573 +#, c-format +msgid "connection not open" +msgstr "μη ανοικτή σÏνδεση" -#: fe-misc.c:755 fe-secure-openssl.c:209 fe-secure-openssl.c:316 -#: fe-secure.c:260 fe-secure.c:373 +#: fe-misc.c:751 fe-secure-openssl.c:215 fe-secure-openssl.c:315 +#: fe-secure.c:257 fe-secure.c:419 +#, c-format msgid "" "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" -"\tbefore or while processing the request.\n" +"\tbefore or while processing the request." msgstr "" "ο διακομιστής έκλεισε απÏοσδόκητα τη σÏνδεση\n" "\tΑυτό πιθανώς σημαίνει ότι ο διακομιστής τεÏματίστηκε ασυνήθιστα\n" -"\tÏ€Ïιν ή κατά την επεξεÏγασία του αιτήματος.\n" +"\tÏ€Ïιν ή κατά την επεξεÏγασία του αιτήματος." + +#: fe-misc.c:818 +msgid "connection not open\n" +msgstr "μη ανοικτή σÏνδεση\n" -#: fe-misc.c:1015 -msgid "timeout expired\n" -msgstr "έληξε το χÏονικό ÏŒÏιο\n" +#: fe-misc.c:1003 +#, c-format +msgid "timeout expired" +msgstr "έληξε το χÏονικό ÏŒÏιο" -#: fe-misc.c:1060 -msgid "invalid socket\n" -msgstr "άκυÏος υποδοχέας\n" +#: fe-misc.c:1047 +#, c-format +msgid "invalid socket" +msgstr "άκυÏος υποδοχέας" -#: fe-misc.c:1083 +#: fe-misc.c:1069 #, c-format -msgid "%s() failed: %s\n" -msgstr "%s() απέτυχε: %s\n" +msgid "%s() failed: %s" +msgstr "%s() απέτυχε: %s" -#: fe-protocol3.c:196 +#: fe-protocol3.c:182 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "μήνυμα Ï„Ïπου 0x%02x έφτασε από το διακομιστή ενώ αυτός ήταν αδÏανής" -#: fe-protocol3.c:403 -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" -msgstr "ο διακομιστής έστειλε δεδομένα («D» μήνυμα) χωÏίς Ï€ÏοηγοÏμενη πεÏιγÏαφή γÏαμμής («T» μήνυμα)\n" +#: fe-protocol3.c:385 +#, c-format +msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" +msgstr "ο διακομιστής έστειλε δεδομένα («D» μήνυμα) χωÏίς Ï€ÏοηγοÏμενη πεÏιγÏαφή γÏαμμής («T» μήνυμα)" -#: fe-protocol3.c:446 +#: fe-protocol3.c:427 #, c-format -msgid "unexpected response from server; first received character was \"%c\"\n" -msgstr "μη αναμενόμενη απόκÏιση από το διακομιστή· Ï€Ïώτος χαÏακτήÏας που ελήφθη ήταν «%c»\n" +msgid "unexpected response from server; first received character was \"%c\"" +msgstr "μη αναμενόμενη απόκÏιση από το διακομιστή· Ï€Ïώτος χαÏακτήÏας που ελήφθη ήταν «%c»" -#: fe-protocol3.c:471 +#: fe-protocol3.c:450 #, c-format -msgid "message contents do not agree with length in message type \"%c\"\n" -msgstr "τα πεÏιεχόμενα του μηνÏματος δεν συμφωνοÏν με το μήκος του σε Ï„Ïπο μηνÏματος «%c»\n" +msgid "message contents do not agree with length in message type \"%c\"" +msgstr "τα πεÏιεχόμενα του μηνÏματος δεν συμφωνοÏν με το μήκος του σε Ï„Ïπο μηνÏματος «%c»" -#: fe-protocol3.c:491 +#: fe-protocol3.c:468 #, c-format -msgid "lost synchronization with server: got message type \"%c\", length %d\n" -msgstr "χάθηκε ο συγχÏονισμός με το διακομιστή: ελήφθει Ï„Ïπος μηνÏματος «%c», μήκους %d\n" +msgid "lost synchronization with server: got message type \"%c\", length %d" +msgstr "χάθηκε ο συγχÏονισμός με το διακομιστή: ελήφθει Ï„Ïπος μηνÏματος «%c», μήκους %d" -#: fe-protocol3.c:543 fe-protocol3.c:583 +#: fe-protocol3.c:520 fe-protocol3.c:560 msgid "insufficient data in \"T\" message" msgstr "ανεπαÏκή δεδομένα σε «T» μήνυμα" -#: fe-protocol3.c:654 fe-protocol3.c:860 +#: fe-protocol3.c:631 fe-protocol3.c:837 msgid "out of memory for query result" msgstr "έλλειψη μνήμης για το αποτέλεσμα εÏωτήματος" -#: fe-protocol3.c:723 +#: fe-protocol3.c:700 msgid "insufficient data in \"t\" message" msgstr "ανεπαÏκή δεδομένα σε «t» μήνυμα" -#: fe-protocol3.c:782 fe-protocol3.c:814 fe-protocol3.c:832 +#: fe-protocol3.c:759 fe-protocol3.c:791 fe-protocol3.c:809 msgid "insufficient data in \"D\" message" msgstr "ανεπαÏκή δεδομένα σε «D» μήνυμα" -#: fe-protocol3.c:788 +#: fe-protocol3.c:765 msgid "unexpected field count in \"D\" message" msgstr "μη αναμενόμενο πλήθος πεδίων σε »D» μήνυμα" -#: fe-protocol3.c:1029 +#: fe-protocol3.c:1020 msgid "no error message available\n" msgstr "κανένα μήνυμα σφάλματος διαθέσιμο\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1077 fe-protocol3.c:1096 +#: fe-protocol3.c:1068 fe-protocol3.c:1087 #, c-format msgid " at character %s" -msgstr "σε χαÏακτήÏα %s" +msgstr " στο χαÏακτήÏα %s" -#: fe-protocol3.c:1109 +#: fe-protocol3.c:1100 #, c-format msgid "DETAIL: %s\n" msgstr "DETAIL: %s\n" -#: fe-protocol3.c:1112 +#: fe-protocol3.c:1103 #, c-format msgid "HINT: %s\n" msgstr "HINT: %s\n" -#: fe-protocol3.c:1115 +#: fe-protocol3.c:1106 #, c-format msgid "QUERY: %s\n" msgstr "ΕΡΩΤΗΜΑ: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1113 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXT: %s\n" -#: fe-protocol3.c:1131 +#: fe-protocol3.c:1122 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMA NAME: %s\n" -#: fe-protocol3.c:1135 +#: fe-protocol3.c:1126 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABLE NAME: %s\n" -#: fe-protocol3.c:1139 +#: fe-protocol3.c:1130 #, c-format msgid "COLUMN NAME: %s\n" msgstr "COLUMN NAME: %s\n" -#: fe-protocol3.c:1143 +#: fe-protocol3.c:1134 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATATYPE NAME: %s\n" -#: fe-protocol3.c:1147 +#: fe-protocol3.c:1138 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "CONSTRAINT NAME: %s\n" -#: fe-protocol3.c:1159 +#: fe-protocol3.c:1150 msgid "LOCATION: " msgstr "LOCATION: " -#: fe-protocol3.c:1161 +#: fe-protocol3.c:1152 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1163 +#: fe-protocol3.c:1154 #, c-format msgid "%s:%s" msgstr "%s: %s" -#: fe-protocol3.c:1358 +#: fe-protocol3.c:1349 #, c-format msgid "LINE %d: " msgstr "ΓΡΑΜΜΗ %d: " -#: fe-protocol3.c:1757 -msgid "PQgetline: not doing text COPY OUT\n" -msgstr "PQgetline: δεν κάνει το κείμενο COPY OUT\n" +#: fe-protocol3.c:1423 +#, c-format +msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u" +msgstr "έκδοση Ï€Ïωτοκόλλου που δεν υποστηÏίζεται από τον διακομιστή: ο πελάτης χÏησιμοποιεί %u.%u, ο διακομιστής υποστηÏίζει έως και %u.%u" -#: fe-protocol3.c:2123 +#: fe-protocol3.c:1429 #, c-format -msgid "protocol error: id=0x%x\n" -msgstr "σφάλμα Ï€Ïωτοκόλλου: id=0x%x\n" +msgid "protocol extension not supported by server: %s" +msgid_plural "protocol extensions not supported by server: %s" +msgstr[0] "η επέκταση Ï€Ïωτοκόλλου δεν υποστηÏίζεται από τον διακομιστή: %s" +msgstr[1] "οι επεκτάσεις Ï€Ïωτοκόλλου δεν υποστηÏίζονται από τον διακομιστή: %s" -#: fe-secure-common.c:124 -msgid "SSL certificate's name contains embedded null\n" -msgstr "το όνομα του Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï SSL πεÏιέχει ενσωματωμένο null\n" +#: fe-protocol3.c:1437 +#, c-format +msgid "invalid %s message" +msgstr "μη έγκυÏη μήνυμα %s" -#: fe-secure-common.c:171 -msgid "host name must be specified for a verified SSL connection\n" -msgstr "το όνομα κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® Ï€Ïέπει να έχει καθοÏιστεί για μια επαληθευμένη σÏνδεση SSL\n" +#: fe-protocol3.c:1802 +#, c-format +msgid "PQgetline: not doing text COPY OUT" +msgstr "PQgetline: δεν κάνει το κείμενο COPY OUT" -#: fe-secure-common.c:196 +#: fe-protocol3.c:2176 #, c-format -msgid "server certificate for \"%s\" does not match host name \"%s\"\n" -msgstr "το πιστοποιητικό διακομιστή για το «%s» δεν ταιÏιάζει με το όνομα κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® «%s»\n" +msgid "protocol error: no function result" +msgstr "σφάλμα Ï€Ïωτοκόλλου: κανένα αποτέλεσμα συνάÏτησης" -#: fe-secure-common.c:202 -msgid "could not get server's host name from server certificate\n" -msgstr "δεν ήταν δυνατή η απόκτηση του όνοματος κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® του διακομιστή από το πιστοποιητικό διακομιστή\n" +#: fe-protocol3.c:2187 +#, c-format +msgid "protocol error: id=0x%x" +msgstr "σφάλμα Ï€Ïωτοκόλλου: id=0x%x" + +#: fe-secure-common.c:123 +#, c-format +msgid "SSL certificate's name contains embedded null" +msgstr "το όνομα του Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï SSL πεÏιέχει ενσωματωμένο null" + +#: fe-secure-common.c:228 +#, c-format +msgid "certificate contains IP address with invalid length %zu" +msgstr "το πιστοποιητικό πεÏιέχει διεÏθυνση IP με μη έγκυÏο μήκος %zu" + +#: fe-secure-common.c:237 +#, c-format +msgid "could not convert certificate's IP address to string: %s" +msgstr "δεν μπόÏεσε να μετατÏέψει τη διεÏθυνση IP του Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï ÏƒÎµ συμβολοσειÏά: %s" + +#: fe-secure-common.c:269 +#, c-format +msgid "host name must be specified for a verified SSL connection" +msgstr "το όνομα κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® Ï€Ïέπει να έχει καθοÏιστεί για μια επαληθευμένη σÏνδεση SSL" + +#: fe-secure-common.c:286 +#, c-format +msgid "server certificate for \"%s\" (and %d other name) does not match host name \"%s\"" +msgid_plural "server certificate for \"%s\" (and %d other names) does not match host name \"%s\"" +msgstr[0] "το πιστοποιητικό διακομιστή για το «%s» (όπως και %d άλλο όνομα) δεν ταιÏιάζει με το όνομα κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® «%s»" +msgstr[1] "το πιστοποιητικό διακομιστή για το «%s» (όπως και %d άλλα ονόματα) δεν ταιÏιάζει με το όνομα κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® «%s»" + +#: fe-secure-common.c:294 +#, c-format +msgid "server certificate for \"%s\" does not match host name \"%s\"" +msgstr "το πιστοποιητικό διακομιστή για το «%s» δεν ταιÏιάζει με το όνομα κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® «%s»" + +#: fe-secure-common.c:299 +#, c-format +msgid "could not get server's host name from server certificate" +msgstr "δεν ήταν δυνατή η απόκτηση του όνοματος κεντÏÎ¹ÎºÎ¿Ï Ï…Ï€Î¿Î»Î¿Î³Î¹ÏƒÏ„Î® του διακομιστή από το πιστοποιητικό διακομιστή" #: fe-secure-gssapi.c:201 msgid "GSSAPI wrap error" msgstr "σφάλμα αναδίπλωσης GSSAPI" -#: fe-secure-gssapi.c:209 -msgid "outgoing GSSAPI message would not use confidentiality\n" -msgstr "το εξεÏχόμενο μήνυμα GSSAPI δεν θα χÏησιμοποιοÏσε εμπιστευτικότητα\n" +#: fe-secure-gssapi.c:208 +#, c-format +msgid "outgoing GSSAPI message would not use confidentiality" +msgstr "το εξεÏχόμενο μήνυμα GSSAPI δεν θα χÏησιμοποιοÏσε εμπιστευτικότητα" -#: fe-secure-gssapi.c:217 +#: fe-secure-gssapi.c:215 #, c-format -msgid "client tried to send oversize GSSAPI packet (%zu > %zu)\n" -msgstr "ο πελάτης Ï€Ïοσπάθησε να στείλει υπεÏμέγεθες πακέτο GSSAPI (%zu > %zu)\n" +msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" +msgstr "ο πελάτης Ï€Ïοσπάθησε να στείλει υπεÏμέγεθες πακέτο GSSAPI (%zu > %zu)" -#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:596 +#: fe-secure-gssapi.c:351 fe-secure-gssapi.c:593 #, c-format -msgid "oversize GSSAPI packet sent by the server (%zu > %zu)\n" -msgstr "ο διακομιστής έστειλε υπεÏμέγεθες πακέτο GSSAPI (%zu > %zu)\n" +msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" +msgstr "ο διακομιστής έστειλε υπεÏμέγεθες πακέτο GSSAPI (%zu > %zu)" -#: fe-secure-gssapi.c:393 +#: fe-secure-gssapi.c:390 msgid "GSSAPI unwrap error" msgstr "σφάλμα ξεδιπλώσης GSSAPI" -#: fe-secure-gssapi.c:403 -msgid "incoming GSSAPI message did not use confidentiality\n" -msgstr "εισεÏχόμενο μήνυμα GSSAPI δεν χÏησιμοποίησε εμπιστευτικότητα\n" +#: fe-secure-gssapi.c:399 +#, c-format +msgid "incoming GSSAPI message did not use confidentiality" +msgstr "εισεÏχόμενο μήνυμα GSSAPI δεν χÏησιμοποίησε εμπιστευτικότητα" -#: fe-secure-gssapi.c:642 +#: fe-secure-gssapi.c:656 msgid "could not initiate GSSAPI security context" msgstr "δεν ήταν δυνατή η έναÏξη πεÏιεχομένου ασφαλείας GSSAPI" -#: fe-secure-gssapi.c:670 +#: fe-secure-gssapi.c:685 msgid "GSSAPI size check error" msgstr "σφάλμα ελέγχου μεγέθους GSSAPI" -#: fe-secure-gssapi.c:681 +#: fe-secure-gssapi.c:696 msgid "GSSAPI context establishment error" msgstr "σφάλμα δημιουÏγίας πεÏιεχομένου GSSAPI" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1333 +#: fe-secure-openssl.c:219 fe-secure-openssl.c:319 fe-secure-openssl.c:1531 #, c-format -msgid "SSL SYSCALL error: %s\n" -msgstr "SSL SYSCALL σφάλμα: %s\n" +msgid "SSL SYSCALL error: %s" +msgstr "SSL SYSCALL σφάλμα: %s" -#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1337 -msgid "SSL SYSCALL error: EOF detected\n" -msgstr "SSL SYSCALL σφάλμα: ανιχνεÏτηκε EOF\n" +#: fe-secure-openssl.c:225 fe-secure-openssl.c:325 fe-secure-openssl.c:1534 +#, c-format +msgid "SSL SYSCALL error: EOF detected" +msgstr "SSL SYSCALL σφάλμα: ανιχνεÏτηκε EOF" -#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1346 +#: fe-secure-openssl.c:235 fe-secure-openssl.c:335 fe-secure-openssl.c:1542 #, c-format -msgid "SSL error: %s\n" -msgstr "SSL σφάλμα: %s\n" +msgid "SSL error: %s" +msgstr "SSL σφάλμα: %s" -#: fe-secure-openssl.c:247 fe-secure-openssl.c:354 -msgid "SSL connection has been closed unexpectedly\n" -msgstr "η σÏνδεση SSL έκλεισε απÏοσδόκητα\n" +#: fe-secure-openssl.c:249 fe-secure-openssl.c:349 +#, c-format +msgid "SSL connection has been closed unexpectedly" +msgstr "η σÏνδεση SSL έκλεισε απÏοσδόκητα" + +#: fe-secure-openssl.c:254 fe-secure-openssl.c:354 fe-secure-openssl.c:1589 +#, c-format +msgid "unrecognized SSL error code: %d" +msgstr "μη αναγνωÏίσιμος κωδικός σφάλματος SSL: %d" + +#: fe-secure-openssl.c:397 +#, c-format +msgid "could not determine server certificate signature algorithm" +msgstr "δεν μπόÏεσε να Ï€ÏοσδιοÏίσει τον αλγόÏιθμο υπογÏαφής Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏƒÏ„Î®" -#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1396 +#: fe-secure-openssl.c:417 #, c-format -msgid "unrecognized SSL error code: %d\n" -msgstr "μη αναγνωÏίσιμος κωδικός σφάλματος SSL: %d\n" +msgid "could not find digest for NID %s" +msgstr "δεν μπόÏεσε να βÏεθεί σÏνοψη (digest) για NID %s" -#: fe-secure-openssl.c:400 -msgid "could not determine server certificate signature algorithm\n" -msgstr "δεν μπόÏεσε να Ï€ÏοσδιοÏίσει τον αλγόÏιθμο υπογÏαφής Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏƒÏ„Î®\n" +#: fe-secure-openssl.c:426 +#, c-format +msgid "could not generate peer certificate hash" +msgstr "δεν ήταν δυνατή η δημιουÏγία ομότιμου Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï hash" -#: fe-secure-openssl.c:421 +#: fe-secure-openssl.c:509 #, c-format -msgid "could not find digest for NID %s\n" -msgstr "δεν μπόÏεσε να βÏεθεί σÏνοψη (digest) για NID %s\n" +msgid "SSL certificate's name entry is missing" +msgstr "λείπει καταχώÏηση ονόματος του Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï SSL" -#: fe-secure-openssl.c:431 -msgid "could not generate peer certificate hash\n" -msgstr "δεν ήταν δυνατή η δημιουÏγία ομότιμου Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï hash\n" +#: fe-secure-openssl.c:543 +#, c-format +msgid "SSL certificate's address entry is missing" +msgstr "λείπει καταχώÏηση ονόματος του Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï SSL" -#: fe-secure-openssl.c:488 -msgid "SSL certificate's name entry is missing\n" -msgstr "λείπει καταχώÏηση ονόματος του Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï SSL\n" +#: fe-secure-openssl.c:960 +#, c-format +msgid "could not create SSL context: %s" +msgstr "δεν ήταν δυνατή η δημιουÏγία πεÏιεχομένου SSL: %s" -#: fe-secure-openssl.c:822 +#: fe-secure-openssl.c:1002 #, c-format -msgid "could not create SSL context: %s\n" -msgstr "δεν ήταν δυνατή η δημιουÏγία πεÏιεχομένου SSL: %s\n" +msgid "invalid value \"%s\" for minimum SSL protocol version" +msgstr "άκυÏη τιμή «%s» για την ελάχιστη έκδοση Ï€Ïωτοκόλλου SSL" -#: fe-secure-openssl.c:861 +#: fe-secure-openssl.c:1012 #, c-format -msgid "invalid value \"%s\" for minimum SSL protocol version\n" -msgstr "άκυÏη τιμή «%s» για την ελάχιστη έκδοση Ï€Ïωτοκόλλου SSL\n" +msgid "could not set minimum SSL protocol version: %s" +msgstr "δεν ήταν δυνατό να οÏίσει ελάχιστη έκδοση Ï€Ïωτοκόλλου SSL: %s" -#: fe-secure-openssl.c:872 +#: fe-secure-openssl.c:1028 #, c-format -msgid "could not set minimum SSL protocol version: %s\n" -msgstr "δεν ήταν δυνατό να οÏίσει ελάχιστη έκδοση Ï€Ïωτοκόλλου SSL: %s\n" +msgid "invalid value \"%s\" for maximum SSL protocol version" +msgstr "άκυÏη τιμή «%s» για μέγιστη έκδοση Ï€Ïωτοκόλλου SSL" -#: fe-secure-openssl.c:890 +#: fe-secure-openssl.c:1038 #, c-format -msgid "invalid value \"%s\" for maximum SSL protocol version\n" -msgstr "άκυÏη τιμή «%s» για μέγιστη έκδοση Ï€Ïωτοκόλλου SSL\n" +msgid "could not set maximum SSL protocol version: %s" +msgstr "δεν ήταν δυνατό να οÏίσει μέγιστη έκδοση Ï€Ïωτοκόλλου SSL: %s" -#: fe-secure-openssl.c:901 +#: fe-secure-openssl.c:1076 #, c-format -msgid "could not set maximum SSL protocol version: %s\n" -msgstr "δεν ήταν δυνατό να οÏίσει μέγιστη έκδοση Ï€Ïωτοκόλλου SSL: %s\n" +msgid "could not load system root certificate paths: %s" +msgstr "δεν ήταν δυνατή η φόÏτωση διαδÏομών βασικών αÏχείων πιστοποιητικών: %s" -#: fe-secure-openssl.c:937 +#: fe-secure-openssl.c:1093 #, c-format -msgid "could not read root certificate file \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η ανάγνωση Î²Î±ÏƒÎ¹ÎºÎ¿Ï Î±Ïχείου Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Â«%s»: %s\n" +msgid "could not read root certificate file \"%s\": %s" +msgstr "δεν ήταν δυνατή η ανάγνωση Î²Î±ÏƒÎ¹ÎºÎ¿Ï Î±Ïχείου Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Â«%s»: %s" -#: fe-secure-openssl.c:990 +#: fe-secure-openssl.c:1145 +#, c-format msgid "" "could not get home directory to locate root certificate file\n" -"Either provide the file or change sslmode to disable server certificate verification.\n" +"Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." msgstr "" "δεν ήταν δυνατή η δημιουÏγία του Ï€ÏÎ¿ÏƒÏ‰Ï€Î¹ÎºÎ¿Ï ÎºÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï… για τον εντοπισμό Î²Î±ÏƒÎ¹ÎºÎ¿Ï Î±Ïχείου πιστοποιητικοÏ\n" -"Δώστε το αÏχείο ή αλλάξτε το sslmode για να απενεÏγοποιήσετε την επαλήθευση Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏƒÏ„Î®.\n" +"Δώστε το αÏχείο ή αλλάξτε το sslmode για να απενεÏγοποιήσετε την επαλήθευση Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏƒÏ„Î®." -#: fe-secure-openssl.c:994 +#: fe-secure-openssl.c:1148 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" -"Either provide the file or change sslmode to disable server certificate verification.\n" +"Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." msgstr "" -"βασικό αÏχείο Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï \"%s\" δεν υπάÏχει\n" -"Είτε παÏουσιάστε το αÏχείο ή αλλάξτε το sslmode για να απενεÏγοποιήσετε την επαλήθευση Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏƒÏ„Î®.\n" +"βασικό αÏχείο Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Â«%s» δεν υπάÏχει\n" +"Είτε παÏουσιάστε το αÏχείο, χÏησιμοποιήστε τις επαληθευμένες roots του συστήματος με sslrootcert=system, ή αλλάξτε το sslmode για να απενεÏγοποιήσετε την επαλήθευση Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏƒÏ„Î®." -#: fe-secure-openssl.c:1025 +#: fe-secure-openssl.c:1183 #, c-format -msgid "could not open certificate file \"%s\": %s\n" -msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Â«%s»: %s\n" +msgid "could not open certificate file \"%s\": %s" +msgstr "δεν ήταν δυνατό το άνοιγμα αÏχείου Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Â«%s»: %s" -#: fe-secure-openssl.c:1044 +#: fe-secure-openssl.c:1201 #, c-format -msgid "could not read certificate file \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η ανάγνωση αÏχείου Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Â«%s»: %s\n" +msgid "could not read certificate file \"%s\": %s" +msgstr "δεν ήταν δυνατή η ανάγνωση αÏχείου Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Â«%s»: %s" -#: fe-secure-openssl.c:1069 +#: fe-secure-openssl.c:1225 #, c-format -msgid "could not establish SSL connection: %s\n" -msgstr "δεν ήταν δυνατή η δημιουÏγία σÏνδεσης SSL: %s\n" +msgid "could not establish SSL connection: %s" +msgstr "δεν ήταν δυνατή η δημιουÏγία σÏνδεσης SSL: %s" -#: fe-secure-openssl.c:1103 +#: fe-secure-openssl.c:1257 #, c-format -msgid "could not set SSL Server Name Indication (SNI): %s\n" -msgstr "δεν ήταν δυνατός ο οÏισμός SSL Server Name Indication (SNI): %s\n" +msgid "could not set SSL Server Name Indication (SNI): %s" +msgstr "δεν ήταν δυνατός ο οÏισμός SSL Server Name Indication (SNI): %s" -#: fe-secure-openssl.c:1149 +#: fe-secure-openssl.c:1300 #, c-format -msgid "could not load SSL engine \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η φόÏτωση της μηχανής SSL «%s»: %s\n" +msgid "could not load SSL engine \"%s\": %s" +msgstr "δεν ήταν δυνατή η φόÏτωση της μηχανής SSL «%s»: %s" -#: fe-secure-openssl.c:1161 +#: fe-secure-openssl.c:1311 #, c-format -msgid "could not initialize SSL engine \"%s\": %s\n" -msgstr "" -"δεν ήταν δυνατή η εκκίνηση του κινητήÏα SSL »%s»: %s\n" -"\n" +msgid "could not initialize SSL engine \"%s\": %s" +msgstr "δεν ήταν δυνατή η εκκίνηση του κινητήÏα SSL «%s»: %s" -#: fe-secure-openssl.c:1177 +#: fe-secure-openssl.c:1326 #, c-format -msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η ανάγνωση του Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï SSL «%s» από την μηχανή «%s»: %s\n" +msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" +msgstr "δεν ήταν δυνατή η ανάγνωση του Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï SSL «%s» από την μηχανή «%s»: %s" -#: fe-secure-openssl.c:1191 +#: fe-secure-openssl.c:1339 #, c-format -msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η φόÏτωση του Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï SSL «%s» από την μηχανή «%s»: %s\n" +msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" +msgstr "δεν ήταν δυνατή η φόÏτωση του Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï SSL «%s» από την μηχανή «%s»: %s" -#: fe-secure-openssl.c:1228 +#: fe-secure-openssl.c:1376 #, c-format -msgid "certificate present, but not private key file \"%s\"\n" -msgstr "υπάÏχει πιστοποιητικό, αλλά όχι αÏχείο Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Â«%s»\n" +msgid "certificate present, but not private key file \"%s\"" +msgstr "υπάÏχει πιστοποιητικό, αλλά όχι αÏχείο Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Â«%s»" -#: fe-secure-openssl.c:1236 +#: fe-secure-openssl.c:1379 #, c-format -msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" -msgstr "αÏχείο Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Â«%s» έχει ομαδική ή παγκόσμια Ï€Ïόσβαση· τα δικαιώματα Ï€Ïέπει να είναι U=RW (0600) ή λιγότεÏα\n" +msgid "could not stat private key file \"%s\": %m" +msgstr "δεν ήταν δυνατή η φόÏτωση αÏχείου Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Â«%s»: %m" -#: fe-secure-openssl.c:1261 +#: fe-secure-openssl.c:1387 #, c-format -msgid "could not load private key file \"%s\": %s\n" -msgstr "δεν ήταν δυνατή η φόÏτωση αÏχείου Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Â«%s»: %s\n" +msgid "private key file \"%s\" is not a regular file" +msgstr "το αÏχείο Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Â«%s» δεν είναι κανονικό αÏχείο" -#: fe-secure-openssl.c:1279 +#: fe-secure-openssl.c:1420 #, c-format -msgid "certificate does not match private key file \"%s\": %s\n" -msgstr "το πιστοποιητικό δεν ταιÏιάζει με το αÏχείο Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Â«%s»: %s\n" +msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root" +msgstr "το αÏχείο Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Â«%s» έχει Ï€Ïόσβαση σε ομάδα ή κόσμο- το αÏχείο Ï€Ïέπει να έχει δικαιώματα u=rw (0600) ή λιγότεÏα αν ανήκει στον Ï„Ïέχοντα χÏήστη, ή δικαιώματα u=rw,g=r (0640) ή λιγότεÏα αν ανήκει στον υπεÏχÏήστη" -#: fe-secure-openssl.c:1379 +#: fe-secure-openssl.c:1444 #, c-format -msgid "This may indicate that the server does not support any SSL protocol version between %s and %s.\n" -msgstr "Αυτό μποÏεί να υποδεικνÏει ότι ο διακομιστής δεν υποστηÏίζει καμία έκδοση Ï€Ïωτοκόλλου SSL Î¼ÎµÏ„Î±Î¾Ï %s και %s.\n" +msgid "could not load private key file \"%s\": %s" +msgstr "δεν ήταν δυνατή η φόÏτωση αÏχείου Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Â«%s»: %s" -#: fe-secure-openssl.c:1415 +#: fe-secure-openssl.c:1460 #, c-format -msgid "certificate could not be obtained: %s\n" -msgstr "" -"δεν ήταν δυνατή η λήψη πιστοποιητικοÏ: %s\n" -"\n" +msgid "certificate does not match private key file \"%s\": %s" +msgstr "το πιστοποιητικό δεν ταιÏιάζει με το αÏχείο Î¹Î´Î¹Ï‰Ï„Î¹ÎºÎ¿Ï ÎºÎ»ÎµÎ¹Î´Î¹Î¿Ï Â«%s»: %s" + +#: fe-secure-openssl.c:1528 +#, c-format +msgid "SSL error: certificate verify failed: %s" +msgstr "SSL σφάλμα: η επαλήθευση Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï Î±Ï€Î­Ï„Ï…Ï‡Îµ: %s" -#: fe-secure-openssl.c:1521 +#: fe-secure-openssl.c:1573 +#, c-format +msgid "This may indicate that the server does not support any SSL protocol version between %s and %s." +msgstr "Αυτό μποÏεί να υποδεικνÏει ότι ο διακομιστής δεν υποστηÏίζει καμία έκδοση Ï€Ïωτοκόλλου SSL Î¼ÎµÏ„Î±Î¾Ï %s και %s." + +#: fe-secure-openssl.c:1606 +#, c-format +msgid "certificate could not be obtained: %s" +msgstr "δεν ήταν δυνατή η λήψη πιστοποιητικοÏ: %s" + +#: fe-secure-openssl.c:1711 #, c-format msgid "no SSL error reported" msgstr "δεν αναφέÏθηκε κανένα σφάλμα SSL" -#: fe-secure-openssl.c:1530 +#: fe-secure-openssl.c:1720 #, c-format msgid "SSL error code %lu" msgstr "κωδικός σφάλματος SSL %lu" -#: fe-secure-openssl.c:1777 +#: fe-secure-openssl.c:1986 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "WARNING: πεÏικομμένο sslpassword\n" -#: fe-secure.c:267 +#: fe-secure.c:263 #, c-format -msgid "could not receive data from server: %s\n" -msgstr "δεν ήταν δυνατή η λήψη δεδομένων από το διακομιστή: %s\n" +msgid "could not receive data from server: %s" +msgstr "δεν ήταν δυνατή η λήψη δεδομένων από το διακομιστή: %s" -#: fe-secure.c:380 +#: fe-secure.c:434 #, c-format -msgid "could not send data to server: %s\n" -msgstr "δεν ήταν δυνατή η αποστολή δεδομένων στο διακομιστή: %s\n" +msgid "could not send data to server: %s" +msgstr "δεν ήταν δυνατή η αποστολή δεδομένων στο διακομιστή: %s" -#: win32.c:314 +#: win32.c:310 #, c-format msgid "unrecognized socket error: 0x%08X/%d" msgstr "μη αναγνωÏίσιμο σφάλμα υποδοχής: 0x%08X/%d" -#~ msgid "invalid channel_binding value: \"%s\"\n" -#~ msgstr "άκυÏη τιμή channel_binding: «%s»\n" - -#~ msgid "invalid ssl_min_protocol_version value: \"%s\"\n" -#~ msgstr "άκυÏη τιμή ssl_min_protocol_version: «%s»\n" - -#~ msgid "invalid ssl_max_protocol_version value: \"%s\"\n" -#~ msgstr "άκυÏη τιμή ssl_max_protocol_version: «%s»\n" +#~ msgid "COPY IN state must be terminated first\n" +#~ msgstr "" +#~ "Ï€Ïέπει Ï€Ïώτα να τεÏματιστεί η κατάσταση COPY IN\n" +#~ "\n" -#~ msgid "invalid gssencmode value: \"%s\"\n" -#~ msgstr "άκυÏη τιμή gssencmode: «%s»\n" +#~ msgid "COPY OUT state must be terminated first\n" +#~ msgstr "Ï€Ïέπει Ï€Ïώτα να τεÏματιστεί η κατάσταση COPY OUT\n" -#~ msgid "invalid target_session_attrs value: \"%s\"\n" -#~ msgstr "άκυÏη τιμή target_session_attrs: «%s»\n" +#~ msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" +#~ msgstr "PGEventProc «%s» απέτυχε κατά τη διάÏκεια συμβάντος PGEVT_CONNRESET\n" -#~ msgid "" -#~ "could not connect to server: %s\n" -#~ "\tIs the server running on host \"%s\" (%s) and accepting\n" -#~ "\tTCP/IP connections on port %s?\n" -#~ msgstr "" -#~ "δεν ήταν δυνατή η σÏνδεση με το διακομιστή: %s\n" -#~ "\tΕκτελείται ο διακομιστής στον κεντÏικό υπολογιστή »%s» (%s) και αποδέχεται\n" -#~ "\tσυνδέσεις TCP/IP στην θÏÏα %s;\n" +#~ msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" +#~ msgstr "PGEventProc «%s» κατά τη διάÏκεια συμβάντος PGEVT_RESULTCREATE\n" -#~ msgid "setsockopt(%s) failed: %s\n" -#~ msgstr "setsockopt(%s) απέτυχε: %s\n" +#~ msgid "SCM_CRED authentication method not supported\n" +#~ msgstr "δεν υποστηÏίζεται η μέθοδος πιστοποίησης SCM_CRED\n" #~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" #~ msgstr "WSAIoctl(SIO_KEEPALIVE_VALS) απέτυχε: %ui\n" -#~ msgid "could not make a writable connection to server \"%s:%s\"\n" -#~ msgstr "δεν ήταν δυνατή η Ï€Ïαγματοποίηση εγγÏάψιμης σÏνδεσης με το διακομιστή \"%s:%s\"\n" - -#~ msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" -#~ msgstr "το τεστ «SHOW transaction_read_only» απέτυχε στον διακομιστή «%s:%s»\n" - -#~ msgid "function requires at least protocol version 3.0\n" -#~ msgstr "η συνάÏτηση απαιτεί Ï€Ïωτόκολλο ελάχιστης έκδοσης 3.0\n" - -#~ msgid "COPY IN state must be terminated first\n" -#~ msgstr "" -#~ "Ï€Ïέπει Ï€Ïώτα να τεÏματιστεί η κατάσταση COPY IN\n" -#~ "\n" - -#~ msgid "COPY OUT state must be terminated first\n" -#~ msgstr "Ï€Ïέπει Ï€Ïώτα να τεÏματιστεί η κατάσταση COPY OUT\n" +#~ msgid "cannot determine OID of function lo_creat\n" +#~ msgstr "δεν είναι δυνατός ο Ï€ÏοσδιοÏισμός του OID της συνάÏτησης lo_creat\n" -#~ msgid "cannot determine OID of function lo_truncate\n" -#~ msgstr "δεν μπόÏεσε να Ï€ÏοσδιοÏίσει το OID της συνάÏτησης lo_truncate\n" +#~ msgid "cannot determine OID of function lo_create\n" +#~ msgstr "δεν μπόÏεσε να Ï€ÏοσδιοÏίσει το OID της συνάÏτησης lo_create\n" -#~ msgid "cannot determine OID of function lo_truncate64\n" -#~ msgstr "δεν μπόÏεσε να Ï€ÏοσδιοÏίσει το OID της συνάÏτησης lo_truncate64\n" +#~ msgid "cannot determine OID of function lo_lseek\n" +#~ msgstr "δεν είναι δυνατός ο Ï€ÏοσδιοÏισμός του OID της συνάÏτησης lo_lseek\n" #~ msgid "cannot determine OID of function lo_lseek64\n" #~ msgstr "δεν μπόÏεσε να Ï€ÏοσδιοÏίσει το OID της συνάÏτησης lo_lseek64\n" -#~ msgid "cannot determine OID of function lo_create\n" -#~ msgstr "δεν μπόÏεσε να Ï€ÏοσδιοÏίσει το OID της συνάÏτησης lo_create\n" +#~ msgid "cannot determine OID of function lo_open\n" +#~ msgstr "δεν είναι δυνατός ο Ï€ÏοσδιοÏισμός του OID της συνάÏτησης lo_open\n" #~ msgid "cannot determine OID of function lo_tell64\n" #~ msgstr "δεν μπόÏεσε να Ï€ÏοσδιοÏίσει το OID της συνάÏτησης lo_tell64\n" -#~ msgid "cannot determine OID of function lo_open\n" -#~ msgstr "δεν είναι δυνατός ο Ï€ÏοσδιοÏισμός του OID της συνάÏτησης lo_open\n" +#~ msgid "cannot determine OID of function lo_truncate\n" +#~ msgstr "δεν μπόÏεσε να Ï€ÏοσδιοÏίσει το OID της συνάÏτησης lo_truncate\n" -#~ msgid "cannot determine OID of function lo_creat\n" -#~ msgstr "δεν είναι δυνατός ο Ï€ÏοσδιοÏισμός του OID της συνάÏτησης lo_creat\n" +#~ msgid "cannot determine OID of function lo_truncate64\n" +#~ msgstr "δεν μπόÏεσε να Ï€ÏοσδιοÏίσει το OID της συνάÏτησης lo_truncate64\n" #~ msgid "cannot determine OID of function lo_unlink\n" #~ msgstr "δεν είναι δυνατός ο Ï€ÏοσδιοÏισμός του OID της συνάÏτησης lo_unlink\n" -#~ msgid "cannot determine OID of function lo_lseek\n" -#~ msgstr "δεν είναι δυνατός ο Ï€ÏοσδιοÏισμός του OID της συνάÏτησης lo_lseek\n" - #~ msgid "cannot determine OID of function loread\n" #~ msgstr "δεν είναι δυνατός ο Ï€ÏοσδιοÏισμός του OID της συνάÏτησης loread\n" #~ msgid "cannot determine OID of function lowrite\n" #~ msgstr "δεν είναι δυνατός ο Ï€ÏοσδιοÏισμός του OID της συνάÏτησης lowrite\n" -#~ msgid "select() failed: %s\n" -#~ msgstr "απέτυχε το select(): %s\n" +#~ msgid "" +#~ "could not connect to server: %s\n" +#~ "\tIs the server running on host \"%s\" (%s) and accepting\n" +#~ "\tTCP/IP connections on port %s?\n" +#~ msgstr "" +#~ "δεν ήταν δυνατή η σÏνδεση με το διακομιστή: %s\n" +#~ "\tΕκτελείται ο διακομιστής στον κεντÏικό υπολογιστή »%s» (%s) και αποδέχεται\n" +#~ "\tσυνδέσεις TCP/IP στην θÏÏα %s;\n" + +#~ msgid "could not make a writable connection to server \"%s:%s\"\n" +#~ msgstr "δεν ήταν δυνατή η Ï€Ïαγματοποίηση εγγÏάψιμης σÏνδεσης με το διακομιστή \"%s:%s\"\n" + +#~ msgid "function requires at least protocol version 3.0\n" +#~ msgstr "η συνάÏτηση απαιτεί Ï€Ïωτόκολλο ελάχιστης έκδοσης 3.0\n" + +#~ msgid "invalid channel_binding value: \"%s\"\n" +#~ msgstr "άκυÏη τιμή channel_binding: «%s»\n" + +#~ msgid "invalid gssencmode value: \"%s\"\n" +#~ msgstr "άκυÏη τιμή gssencmode: «%s»\n" #~ msgid "invalid setenv state %c, probably indicative of memory corruption\n" #~ msgstr "μη έγκυÏη κατάσταση %c setenv, πιθανώς ενδεικτική αλλοίωσης μνήμης\n" +#~ msgid "invalid ssl_max_protocol_version value: \"%s\"\n" +#~ msgstr "άκυÏη τιμή ssl_max_protocol_version: «%s»\n" + +#~ msgid "invalid ssl_min_protocol_version value: \"%s\"\n" +#~ msgstr "άκυÏη τιμή ssl_min_protocol_version: «%s»\n" + #~ msgid "invalid state %c, probably indicative of memory corruption\n" #~ msgstr "μη έγκυÏη κατάσταση %c, πιθανώς ενδεικτική αλλοίωσης μνήμης\n" -#~ msgid "unexpected character %c following empty query response (\"I\" message)" -#~ msgstr "μη αναμενόμενος χαÏακτήÏας %c μετά από κενή απόκÏιση εÏωτήματος («I» μήνυμα)" +#~ msgid "invalid target_session_attrs value: \"%s\"\n" +#~ msgstr "άκυÏη τιμή target_session_attrs: «%s»\n" -#~ msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" -#~ msgstr "ο διακομιστής έστειλε δεδομένα («D» μήνυμα) χωÏίς Ï€ÏοηγοÏμενη πεÏιγÏαφή γÏαμμής («T» μήνυμα)" +#~ msgid "lost synchronization with server, resetting connection" +#~ msgstr "χάθηκε ο συγχÏονισμός με τον διακομιστή, επαναÏυθμίζεται η σÏνδεση" + +#~ msgid "select() failed: %s\n" +#~ msgstr "απέτυχε το select(): %s\n" #~ msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" #~ msgstr "ο διακομιστής έστειλε δυαδικά δεδομένα («B» μήνυμα) χωÏίς Ï€ÏοηγοÏμενη πεÏιγÏαφή γÏαμμής («T» μήνυμα)" -#~ msgid "lost synchronization with server, resetting connection" -#~ msgstr "χάθηκε ο συγχÏονισμός με τον διακομιστή, επαναÏυθμίζεται η σÏνδεση" +#~ msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" +#~ msgstr "ο διακομιστής έστειλε δεδομένα («D» μήνυμα) χωÏίς Ï€ÏοηγοÏμενη πεÏιγÏαφή γÏαμμής («T» μήνυμα)\n" + +#~ msgid "setsockopt(%s) failed: %s\n" +#~ msgstr "setsockopt(%s) απέτυχε: %s\n" + +#~ msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" +#~ msgstr "το τεστ «SHOW transaction_read_only» απέτυχε στον διακομιστή «%s:%s»\n" + +#~ msgid "unexpected character %c following empty query response (\"I\" message)" +#~ msgstr "μη αναμενόμενος χαÏακτήÏας %c μετά από κενή απόκÏιση εÏωτήματος («I» μήνυμα)" + +#~ msgid "user name lookup failure: error code %lu\n" +#~ msgstr "αποτυχία αναζήτησης ονόματος χÏήστη: κωδικός σφάλματος %lu\n" diff --git a/src/interfaces/libpq/po/es.po b/src/interfaces/libpq/po/es.po index de91d5bfbf0f0..705b7b6d8f4b0 100644 --- a/src/interfaces/libpq/po/es.po +++ b/src/interfaces/libpq/po/es.po @@ -10,176 +10,178 @@ # msgid "" msgstr "" -"Project-Id-Version: libpq (PostgreSQL) 16\n" +"Project-Id-Version: libpq (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:10+0000\n" -"PO-Revision-Date: 2023-05-22 12:05+0200\n" +"POT-Creation-Date: 2025-02-16 19:40+0000\n" +"PO-Revision-Date: 2025-02-17 15:15+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: BlackCAT 1.1\n" -#: ../../port/thread.c:50 ../../port/thread.c:86 +#: ../../port/user.c:43 ../../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "no se pudo buscar el usuario local de ID %d: %s" -#: ../../port/thread.c:55 ../../port/thread.c:91 +#: ../../port/user.c:48 ../../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "no existe un usuario local con ID %d" -#: fe-auth-scram.c:227 +#: fe-auth-scram.c:223 #, c-format msgid "malformed SCRAM message (empty message)" msgstr "mensaje SCRAM mal formado (mensaje vacío)" -#: fe-auth-scram.c:232 +#: fe-auth-scram.c:228 #, c-format msgid "malformed SCRAM message (length mismatch)" msgstr "mensaje SCRAM mal formado (longitud no coincide)" -#: fe-auth-scram.c:275 +#: fe-auth-scram.c:272 #, c-format msgid "could not verify server signature: %s" msgstr "no se pudo verificar la signatura del servidor: %s" -#: fe-auth-scram.c:281 +#: fe-auth-scram.c:278 #, c-format msgid "incorrect server signature" msgstr "signatura de servidor incorrecta" -#: fe-auth-scram.c:290 +#: fe-auth-scram.c:287 #, c-format msgid "invalid SCRAM exchange state" msgstr "estado de intercambio SCRAM no es válido" -#: fe-auth-scram.c:317 +#: fe-auth-scram.c:311 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)" msgstr "mensaje SCRAM mal formado (se esperaba atributo «%c»)" -#: fe-auth-scram.c:326 +#: fe-auth-scram.c:320 #, c-format msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")" msgstr "mensaje SCRAM mal formado (se esperaba el carácter «=» para el atributo «%c»)" -#: fe-auth-scram.c:366 +#: fe-auth-scram.c:360 #, c-format msgid "could not generate nonce" msgstr "no se pudo generar nonce" -#: fe-auth-scram.c:375 fe-auth-scram.c:448 fe-auth-scram.c:600 -#: fe-auth-scram.c:620 fe-auth-scram.c:644 fe-auth-scram.c:658 -#: fe-auth-scram.c:704 fe-auth-scram.c:740 fe-auth-scram.c:914 fe-auth.c:295 -#: fe-auth.c:368 fe-auth.c:402 fe-auth.c:617 fe-auth.c:728 fe-auth.c:1209 -#: fe-auth.c:1374 fe-connect.c:925 fe-connect.c:1759 fe-connect.c:1921 -#: fe-connect.c:3291 fe-connect.c:4496 fe-connect.c:5161 fe-connect.c:5416 -#: fe-connect.c:5534 fe-connect.c:5781 fe-connect.c:5861 fe-connect.c:5959 -#: fe-connect.c:6210 fe-connect.c:6237 fe-connect.c:6313 fe-connect.c:6336 -#: fe-connect.c:6360 fe-connect.c:6395 fe-connect.c:6481 fe-connect.c:6489 -#: fe-connect.c:6846 fe-connect.c:6996 fe-exec.c:527 fe-exec.c:1321 -#: fe-exec.c:3111 fe-exec.c:4071 fe-exec.c:4235 fe-gssapi-common.c:109 -#: fe-lobj.c:870 fe-protocol3.c:204 fe-protocol3.c:228 fe-protocol3.c:256 -#: fe-protocol3.c:273 fe-protocol3.c:353 fe-protocol3.c:720 fe-protocol3.c:959 -#: fe-protocol3.c:1769 fe-protocol3.c:2169 fe-secure-common.c:110 -#: fe-secure-gssapi.c:500 fe-secure-openssl.c:434 fe-secure-openssl.c:1285 +#: fe-auth-scram.c:369 fe-auth-scram.c:442 fe-auth-scram.c:594 +#: fe-auth-scram.c:614 fe-auth-scram.c:638 fe-auth-scram.c:652 +#: fe-auth-scram.c:698 fe-auth-scram.c:734 fe-auth-scram.c:908 fe-auth.c:296 +#: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:727 fe-auth.c:1200 +#: fe-auth.c:1363 fe-cancel.c:159 fe-connect.c:936 fe-connect.c:976 +#: fe-connect.c:1860 fe-connect.c:2022 fe-connect.c:3430 fe-connect.c:4761 +#: fe-connect.c:5073 fe-connect.c:5328 fe-connect.c:5446 fe-connect.c:5693 +#: fe-connect.c:5773 fe-connect.c:5871 fe-connect.c:6122 fe-connect.c:6149 +#: fe-connect.c:6225 fe-connect.c:6248 fe-connect.c:6272 fe-connect.c:6307 +#: fe-connect.c:6393 fe-connect.c:6401 fe-connect.c:6758 fe-connect.c:6908 +#: fe-exec.c:530 fe-exec.c:1315 fe-exec.c:3254 fe-exec.c:4291 fe-exec.c:4457 +#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:209 fe-protocol3.c:232 +#: fe-protocol3.c:255 fe-protocol3.c:272 fe-protocol3.c:293 fe-protocol3.c:369 +#: fe-protocol3.c:737 fe-protocol3.c:976 fe-protocol3.c:1787 +#: fe-protocol3.c:2187 fe-secure-common.c:110 fe-secure-gssapi.c:496 +#: fe-secure-openssl.c:427 fe-secure-openssl.c:1277 #, c-format msgid "out of memory" msgstr "memoria agotada" -#: fe-auth-scram.c:382 +#: fe-auth-scram.c:376 #, c-format msgid "could not encode nonce" msgstr "no se pudo codificar nonce" -#: fe-auth-scram.c:570 +#: fe-auth-scram.c:564 #, c-format msgid "could not calculate client proof: %s" msgstr "no se pudo calcular la prueba del cliente: %s" -#: fe-auth-scram.c:585 +#: fe-auth-scram.c:579 #, c-format msgid "could not encode client proof" msgstr "no se pudo codificar la prueba del cliente" -#: fe-auth-scram.c:637 +#: fe-auth-scram.c:631 #, c-format msgid "invalid SCRAM response (nonce mismatch)" msgstr "respuesta SCRAM no es válida (nonce no coincide)" -#: fe-auth-scram.c:667 +#: fe-auth-scram.c:661 #, c-format msgid "malformed SCRAM message (invalid salt)" msgstr "mensaje SCRAM mal formado (sal no válida)" -#: fe-auth-scram.c:680 +#: fe-auth-scram.c:674 #, c-format msgid "malformed SCRAM message (invalid iteration count)" msgstr "mensaje SCRAM mal formado (el conteo de iteración no es válido)" -#: fe-auth-scram.c:685 +#: fe-auth-scram.c:679 #, c-format msgid "malformed SCRAM message (garbage at end of server-first-message)" msgstr "mensaje SCRAM mal formado (se encontró basura al final de server-first-message)" -#: fe-auth-scram.c:719 +#: fe-auth-scram.c:713 #, c-format msgid "error received from server in SCRAM exchange: %s" msgstr "se recibió un error desde el servidor durante el intercambio SCRAM: %s" -#: fe-auth-scram.c:734 +#: fe-auth-scram.c:728 #, c-format msgid "malformed SCRAM message (garbage at end of server-final-message)" msgstr "mensaje SCRAM mal formado (se encontró basura al final de server-final-message)" -#: fe-auth-scram.c:751 +#: fe-auth-scram.c:745 #, c-format msgid "malformed SCRAM message (invalid server signature)" msgstr "mensaje SCRAM mal formado (la signatura del servidor no es válida)" -#: fe-auth-scram.c:923 +#: fe-auth-scram.c:917 msgid "could not generate random salt" msgstr "no se pudo generar una sal aleatoria" -#: fe-auth.c:76 +#: fe-auth.c:77 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)" msgstr "memoria agotada creando el búfer GSSAPI (%d)" -#: fe-auth.c:137 +#: fe-auth.c:138 msgid "GSSAPI continuation error" msgstr "error en continuación de GSSAPI" -#: fe-auth.c:167 fe-auth.c:396 fe-gssapi-common.c:97 fe-secure-common.c:99 +#: fe-auth.c:168 fe-auth.c:397 fe-gssapi-common.c:97 fe-secure-common.c:99 #: fe-secure-common.c:173 #, c-format msgid "host name must be specified" msgstr "el nombre de servidor debe ser especificado" -#: fe-auth.c:173 +#: fe-auth.c:174 #, c-format msgid "duplicate GSS authentication request" msgstr "petición de autentificación GSS duplicada" -#: fe-auth.c:237 +#: fe-auth.c:238 #, c-format msgid "out of memory allocating SSPI buffer (%d)" msgstr "memoria agotada creando el búfer SSPI (%d)" -#: fe-auth.c:284 +#: fe-auth.c:285 msgid "SSPI continuation error" msgstr "error en continuación de SSPI" -#: fe-auth.c:358 +#: fe-auth.c:359 #, c-format msgid "duplicate SSPI authentication request" msgstr "petición de autentificación SSPI duplicada" -#: fe-auth.c:383 +#: fe-auth.c:384 msgid "could not acquire SSPI credentials" msgstr "no se pudo obtener las credenciales SSPI" @@ -203,12 +205,12 @@ msgstr "se requiere enlazado de canal (channel binding), pero no está soportado msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection" msgstr "el servidor ofreció autenticación SCRAM-SHA-256-PLUS sobre una conexión no-SSL" -#: fe-auth.c:530 +#: fe-auth.c:531 #, c-format msgid "none of the server's SASL authentication mechanisms are supported" msgstr "ningún método de autentificación SASL del servidor está soportado" -#: fe-auth.c:537 +#: fe-auth.c:538 #, c-format msgid "channel binding is required, but server did not offer an authentication method that supports channel binding" msgstr "se requiere enlazado de canal (channel binding), pero el servidor no ofrece un método de autenticación que lo soporte" @@ -218,28 +220,28 @@ msgstr "se requiere enlazado de canal (channel binding), pero el servidor no ofr msgid "out of memory allocating SASL buffer (%d)" msgstr "memoria agotada creando el búfer SASL (%d)" -#: fe-auth.c:664 +#: fe-auth.c:663 #, c-format msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed" msgstr "Se recibió AuthenticationSASLFinal desde el servidor, pero la autentificación SASL no se completó" -#: fe-auth.c:674 +#: fe-auth.c:673 #, c-format msgid "no client response found after SASL exchange success" msgstr "no se encontró respuesta del cliente luego del intercambio SASL exitoso" -#: fe-auth.c:737 fe-auth.c:744 fe-auth.c:1357 fe-auth.c:1368 +#: fe-auth.c:736 fe-auth.c:743 fe-auth.c:1346 fe-auth.c:1357 #, c-format msgid "could not encrypt password: %s" msgstr "no se pudo cifrar contraseña: %s" #: fe-auth.c:772 msgid "server requested a cleartext password" -msgstr "el servidor solicitó una contraseña en texto claro" +msgstr "el servidor solicitó clave en texto plano" #: fe-auth.c:774 msgid "server requested a hashed password" -msgstr "el servidor solicitó una contraseña cifrada" +msgstr "el servidor solicitó una clave digerida (hashed)" #: fe-auth.c:777 msgid "server requested GSSAPI authentication" @@ -316,628 +318,680 @@ msgstr "el método de autentificación Crypt no está soportado" msgid "authentication method %u not supported" msgstr "el método de autentificación %u no está soportado" -#: fe-auth.c:1196 +#: fe-auth.c:1187 #, c-format msgid "user name lookup failure: error code %lu" msgstr "fallo en la búsqueda de nombre de usuario: código de error %lu" -#: fe-auth.c:1320 +#: fe-auth.c:1309 #, c-format msgid "unexpected shape of result set returned for SHOW" msgstr "SHOW retornó un conjunto de resultados con estructura inesperada" -#: fe-auth.c:1328 +#: fe-auth.c:1317 #, c-format -msgid "password_encryption value too long" -msgstr "el valor para password_encryption es demasiado largo" +msgid "\"password_encryption\" value too long" +msgstr "el valor de «password_encryption» es demasiado largo" -#: fe-auth.c:1378 +#: fe-auth.c:1367 #, c-format msgid "unrecognized password encryption algorithm \"%s\"" msgstr "algoritmo para cifrado de contraseña «%s» desconocido" -#: fe-connect.c:1132 +#: fe-cancel.c:76 +#, c-format +msgid "connection pointer is NULL" +msgstr "el puntero de conexión es NULL" + +#: fe-cancel.c:82 fe-misc.c:572 +#, c-format +msgid "connection not open" +msgstr "la conexión no está abierta" + +#: fe-cancel.c:193 +#, c-format +msgid "cancel request is already being sent on this connection" +msgstr "petición de cancelación ya fue enviada en esta conexión" + +#: fe-cancel.c:263 +#, c-format +msgid "unexpected response from server" +msgstr "respuesta inesperada del servidor" + +#: fe-connect.c:1182 #, c-format msgid "could not match %d host names to %d hostaddr values" msgstr "no se pudo emparejar %d nombres de host a %d direcciones de host" -#: fe-connect.c:1212 +#: fe-connect.c:1262 #, c-format msgid "could not match %d port numbers to %d hosts" msgstr "no se pudo emparejar %d números de puertos a %d hosts" -#: fe-connect.c:1337 +#: fe-connect.c:1387 #, c-format msgid "negative require_auth method \"%s\" cannot be mixed with non-negative methods" -msgstr "el método require_auth negativo «%s» no puede ser mezclado con métodos no-negativos" +msgstr "el método negativo require_auth «%s» no puede mezclarse con métodos no negativos" -#: fe-connect.c:1350 +#: fe-connect.c:1400 #, c-format msgid "require_auth method \"%s\" cannot be mixed with negative methods" -msgstr "el método require_auth «%s» no puede ser mezclado con métodos negativos" +msgstr "el método require_auth «%s» no puede mezclarse con métodos negativos" -#: fe-connect.c:1410 fe-connect.c:1461 fe-connect.c:1503 fe-connect.c:1559 -#: fe-connect.c:1567 fe-connect.c:1598 fe-connect.c:1644 fe-connect.c:1684 -#: fe-connect.c:1705 +#: fe-connect.c:1460 fe-connect.c:1511 fe-connect.c:1553 fe-connect.c:1596 +#: fe-connect.c:1699 fe-connect.c:1745 fe-connect.c:1785 fe-connect.c:1806 #, c-format msgid "invalid %s value: \"%s\"" msgstr "valor %s no válido: «%s»" -#: fe-connect.c:1443 +#: fe-connect.c:1493 #, c-format msgid "require_auth method \"%s\" is specified more than once" msgstr "el método “require_auth†«%s» se especifica más de una vez" -#: fe-connect.c:1484 fe-connect.c:1523 fe-connect.c:1606 +#: fe-connect.c:1534 fe-connect.c:1573 fe-connect.c:1605 fe-connect.c:1707 #, c-format msgid "%s value \"%s\" invalid when SSL support is not compiled in" msgstr "el valor «%2$s» de %1$s no es válido cuando el soporte SSL no está compilado" -#: fe-connect.c:1546 +#: fe-connect.c:1625 +#, c-format +msgid "weak sslmode \"%s\" may not be used with sslnegotiation=direct (use \"require\", \"verify-ca\", or \"verify-full\")" +msgstr "el sslmode «%s» débil no puede usarse con sslnegotiation=direct (use «require», «verify-ca» o «verify-full»)" + +#: fe-connect.c:1647 #, c-format -#| msgid "weak sslmode \"%s\" may not be used with sslrootcert=system (use verify-full)" msgid "weak sslmode \"%s\" may not be used with sslrootcert=system (use \"verify-full\")" -msgstr "el sslmode débil «%s» no puede ser usado con sslrootcert=system (use «verify-full»)" +msgstr "el sslmode «%s» débil no puede usarse con sslrootcert=system (use «verify-full»)" -#: fe-connect.c:1584 +#: fe-connect.c:1660 fe-connect.c:1668 +#, c-format +msgid "invalid \"%s\" value: \"%s\"" +msgstr "valor «%s» no válido: «%s»" + +#: fe-connect.c:1685 #, c-format msgid "invalid SSL protocol version range" msgstr "rango de versión de protocolo SSL no válido " -#: fe-connect.c:1621 +#: fe-connect.c:1722 #, c-format msgid "%s value \"%s\" is not supported (check OpenSSL version)" -msgstr "el valor «%2$s» de %1$s no está soportado (verifique la versión de OpenSSL)" +msgstr "el valor «%s» de %s no está soportado (verifique la versión de OpenSSL)" -#: fe-connect.c:1651 +#: fe-connect.c:1752 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in" msgstr "el valor gssencmode «%s» no es válido cuando no se ha compilado con soporte GSSAPI" -#: fe-connect.c:1944 +#: fe-connect.c:2045 #, c-format msgid "could not set socket to TCP no delay mode: %s" msgstr "no se pudo establecer el socket en modo TCP sin retardo: %s" -#: fe-connect.c:2003 +#: fe-connect.c:2104 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "falló la conexión al servidor en el socket «%s»: " -#: fe-connect.c:2029 +#: fe-connect.c:2130 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "falló la conexión al servidor en «%s» (%s), puerto %s: " -#: fe-connect.c:2034 +#: fe-connect.c:2135 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "falló la conexión al servidor en «%s», puerto %s: " -#: fe-connect.c:2057 +#: fe-connect.c:2158 #, c-format msgid "\tIs the server running locally and accepting connections on that socket?" msgstr "\t¿Está el servidor en ejecución localmente y aceptando conexiones en ese socket?" -#: fe-connect.c:2059 +#: fe-connect.c:2160 #, c-format msgid "\tIs the server running on that host and accepting TCP/IP connections?" msgstr "\t¿Está el servidor en ejecución en ese host y aceptando conexiones TCP/IP?" -#: fe-connect.c:2122 -#, c-format -msgid "invalid integer value \"%s\" for connection option \"%s\"" -msgstr "valor entero «%s» no válido para la opción de conexión «%s»" - -#: fe-connect.c:2151 fe-connect.c:2185 fe-connect.c:2220 fe-connect.c:2318 -#: fe-connect.c:2973 +#: fe-connect.c:2206 fe-connect.c:2240 fe-connect.c:2275 fe-connect.c:2373 +#: fe-connect.c:3098 #, c-format msgid "%s(%s) failed: %s" msgstr "%s(%s) falló: %s" -#: fe-connect.c:2284 +#: fe-connect.c:2339 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s) falló: código de error %d" -#: fe-connect.c:2597 +#: fe-connect.c:2650 #, c-format msgid "invalid connection state, probably indicative of memory corruption" msgstr "el estado de conexión no es válido, probablemente por corrupción de memoria" -#: fe-connect.c:2676 +#: fe-connect.c:2733 #, c-format msgid "invalid port number: \"%s\"" msgstr "número de puerto no válido: «%s»" -#: fe-connect.c:2690 +#: fe-connect.c:2747 #, c-format msgid "could not translate host name \"%s\" to address: %s" msgstr "no se pudo traducir el nombre «%s» a una dirección: %s" -#: fe-connect.c:2702 +#: fe-connect.c:2759 #, c-format msgid "could not parse network address \"%s\": %s" msgstr "no se pudo interpretar la dirección de red «%s»: %s" -#: fe-connect.c:2713 +#: fe-connect.c:2770 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "la ruta al socket de dominio Unix «%s» es demasiado larga (máximo %d bytes)" -#: fe-connect.c:2727 +#: fe-connect.c:2784 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s" msgstr "no se pudo traducir la ruta del socket Unix «%s» a una dirección: %s" -#: fe-connect.c:2901 +#: fe-connect.c:2950 fe-connect.c:4305 +#, c-format +msgid "GSSAPI encryption required but it is not supported over a local socket" +msgstr "cifrado GSSAPI requerido pero no está soportado en un socket local" + +#: fe-connect.c:2958 fe-connect.c:4434 +#, c-format +msgid "GSSAPI encryption required but no credential cache" +msgstr "cifrado GSSAPI requerido pero no hay caché de credenciales" + +#: fe-connect.c:3026 #, c-format msgid "could not create socket: %s" msgstr "no se pudo crear el socket: %s" -#: fe-connect.c:2932 +#: fe-connect.c:3057 #, c-format msgid "could not set socket to nonblocking mode: %s" msgstr "no se pudo establecer el socket en modo no bloqueante: %s" -#: fe-connect.c:2943 +#: fe-connect.c:3068 #, c-format msgid "could not set socket to close-on-exec mode: %s" msgstr "no se pudo poner el socket en modo close-on-exec: %s" -#: fe-connect.c:2961 -#, c-format -msgid "keepalives parameter must be an integer" -msgstr "el parámetro de keepalives debe ser un entero" - -#: fe-connect.c:3100 +#: fe-connect.c:3225 #, c-format msgid "could not get socket error status: %s" msgstr "no se pudo determinar el estado de error del socket: %s" -#: fe-connect.c:3127 +#: fe-connect.c:3252 #, c-format msgid "could not get client address from socket: %s" msgstr "no se pudo obtener la dirección del cliente desde el socket: %s" -#: fe-connect.c:3165 +#: fe-connect.c:3278 #, c-format msgid "requirepeer parameter is not supported on this platform" msgstr "el parámetro requirepeer no está soportado en esta plataforma" -#: fe-connect.c:3167 +#: fe-connect.c:3280 #, c-format msgid "could not get peer credentials: %s" msgstr "no se pudo obtener credenciales de la contraparte: %s" -#: fe-connect.c:3180 +#: fe-connect.c:3293 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"" msgstr "requirepeer especifica «%s», pero el nombre de usuario de la contraparte es «%s»" -#: fe-connect.c:3221 +#: fe-connect.c:3331 #, c-format msgid "could not send GSSAPI negotiation packet: %s" msgstr "no se pudo enviar el paquete de negociación GSSAPI: %s" -#: fe-connect.c:3233 -#, c-format -msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)" -msgstr "cifrado GSSAPI requerido, pero fue imposible (posiblemente no hay cache de credenciales, no hay soporte de servidor, o se está usando un socket local)" - -#: fe-connect.c:3274 +#: fe-connect.c:3380 #, c-format msgid "could not send SSL negotiation packet: %s" msgstr "no se pudo enviar el paquete de negociación SSL: %s" -#: fe-connect.c:3303 +#: fe-connect.c:3412 +#, c-format +msgid "could not send cancel packet: %s" +msgstr "no se pudo enviar el paquete de cancelación: %s" + +#: fe-connect.c:3442 #, c-format msgid "could not send startup packet: %s" msgstr "no se pudo enviar el paquete de inicio: %s" -#: fe-connect.c:3378 -#, c-format +#: fe-connect.c:3509 msgid "server does not support SSL, but SSL was required" msgstr "el servidor no soporta SSL, pero SSL es requerida" -#: fe-connect.c:3404 +#: fe-connect.c:3519 +#, c-format +msgid "server sent an error response during SSL exchange" +msgstr "el servidor envió una respuesta de error durante el intercambio SSL" + +#: fe-connect.c:3524 #, c-format msgid "received invalid response to SSL negotiation: %c" msgstr "se ha recibido una respuesta no válida en la negociación SSL: %c" -#: fe-connect.c:3424 +#: fe-connect.c:3552 #, c-format msgid "received unencrypted data after SSL response" msgstr "se recibieron datos no cifrados después de la respuesta SSL" -#: fe-connect.c:3504 +#: fe-connect.c:3615 #, c-format +msgid "server sent an error response during GSS encryption exchange" +msgstr "el servidor envió una respuesta de error durante un intercambio de cifrado GSS" + +#: fe-connect.c:3629 msgid "server doesn't support GSSAPI encryption, but it was required" msgstr "el servidor no soporta cifrado GSSAPI, pero es requerida" -#: fe-connect.c:3515 +#: fe-connect.c:3633 #, c-format msgid "received invalid response to GSSAPI negotiation: %c" msgstr "se ha recibido una respuesta no válida en la negociación GSSAPI: %c" -#: fe-connect.c:3533 +#: fe-connect.c:3651 #, c-format msgid "received unencrypted data after GSSAPI encryption response" msgstr "se recibieron datos no cifrados después de la respuesta de cifrado GSSAPI" -#: fe-connect.c:3598 +#: fe-connect.c:3711 #, c-format msgid "expected authentication request from server, but received %c" msgstr "se esperaba una petición de autentificación desde el servidor, pero se ha recibido %c" -#: fe-connect.c:3625 fe-connect.c:3794 +#: fe-connect.c:3739 fe-connect.c:3862 #, c-format msgid "received invalid authentication request" msgstr "se recibió una solicitud de autentificación no válida" -#: fe-connect.c:3630 fe-connect.c:3779 +#: fe-connect.c:3745 fe-connect.c:3847 #, c-format msgid "received invalid protocol negotiation message" msgstr "se recibió un mensaje de negociación de protocolo no válido" -#: fe-connect.c:3648 fe-connect.c:3702 +#: fe-connect.c:3764 fe-connect.c:3818 #, c-format msgid "received invalid error message" msgstr "se recibió un mensaje de error no válido" -#: fe-connect.c:3865 +#: fe-connect.c:3933 #, c-format msgid "unexpected message from server during startup" msgstr "se ha recibido un mensaje inesperado del servidor durante el inicio" -#: fe-connect.c:3956 +#: fe-connect.c:4024 #, c-format msgid "session is read-only" msgstr "la sesión es de solo lectura" -#: fe-connect.c:3958 +#: fe-connect.c:4026 #, c-format msgid "session is not read-only" msgstr "la sesión no es de solo lectura" -#: fe-connect.c:4011 +#: fe-connect.c:4079 #, c-format msgid "server is in hot standby mode" msgstr "el servidor está en modo hot standby" -#: fe-connect.c:4013 +#: fe-connect.c:4081 #, c-format msgid "server is not in hot standby mode" msgstr "el servidor no está en modo hot standby" -#: fe-connect.c:4129 fe-connect.c:4179 +#: fe-connect.c:4203 fe-connect.c:4253 #, c-format msgid "\"%s\" failed" msgstr "«%s» falló" -#: fe-connect.c:4193 +#: fe-connect.c:4267 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption" msgstr "estado de conexión no válido %d, probablemente por corrupción de memoria" -#: fe-connect.c:5174 +#: fe-connect.c:5086 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://" msgstr "URL LDAP no válida «%s»: el esquema debe ser ldap://" -#: fe-connect.c:5189 +#: fe-connect.c:5101 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name" msgstr "URL LDAP no válida «%s»: distinguished name faltante" -#: fe-connect.c:5201 fe-connect.c:5259 +#: fe-connect.c:5113 fe-connect.c:5171 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute" msgstr "URL LDAP no válida «%s»: debe tener exactamente un atributo" -#: fe-connect.c:5213 fe-connect.c:5275 +#: fe-connect.c:5125 fe-connect.c:5187 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" msgstr "URL LDAP no válida «%s»: debe tener ámbito de búsqueda (base/one/sub)" -#: fe-connect.c:5225 +#: fe-connect.c:5137 #, c-format msgid "invalid LDAP URL \"%s\": no filter" msgstr "URL LDAP no válida «%s»: no tiene filtro" -#: fe-connect.c:5247 +#: fe-connect.c:5159 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number" msgstr "URL LDAP no válida «%s»: número de puerto no válido" -#: fe-connect.c:5284 +#: fe-connect.c:5196 #, c-format msgid "could not create LDAP structure" msgstr "no se pudo crear estructura LDAP" -#: fe-connect.c:5359 +#: fe-connect.c:5271 #, c-format msgid "lookup on LDAP server failed: %s" msgstr "búsqueda en servidor LDAP falló: %s" -#: fe-connect.c:5369 +#: fe-connect.c:5281 #, c-format msgid "more than one entry found on LDAP lookup" msgstr "se encontro más de una entrada en búsqueda LDAP" -#: fe-connect.c:5371 fe-connect.c:5382 +#: fe-connect.c:5283 fe-connect.c:5294 #, c-format msgid "no entry found on LDAP lookup" msgstr "no se encontró ninguna entrada en búsqueda LDAP" -#: fe-connect.c:5392 fe-connect.c:5404 +#: fe-connect.c:5304 fe-connect.c:5316 #, c-format msgid "attribute has no values on LDAP lookup" msgstr "la búsqueda LDAP entregó atributo sin valores" -#: fe-connect.c:5455 fe-connect.c:5474 fe-connect.c:5998 +#: fe-connect.c:5367 fe-connect.c:5386 fe-connect.c:5910 #, c-format msgid "missing \"=\" after \"%s\" in connection info string" msgstr "falta «=» después de «%s» en la cadena de información de la conexión" -#: fe-connect.c:5545 fe-connect.c:6181 fe-connect.c:6979 +#: fe-connect.c:5457 fe-connect.c:6093 fe-connect.c:6891 #, c-format msgid "invalid connection option \"%s\"" msgstr "opción de conexión no válida «%s»" -#: fe-connect.c:5560 fe-connect.c:6046 +#: fe-connect.c:5472 fe-connect.c:5958 #, c-format msgid "unterminated quoted string in connection info string" msgstr "cadena de caracteres entre comillas sin terminar en la cadena de información de conexión" -#: fe-connect.c:5640 +#: fe-connect.c:5552 #, c-format msgid "definition of service \"%s\" not found" msgstr "la definición de servicio «%s» no fue encontrada" -#: fe-connect.c:5666 +#: fe-connect.c:5578 #, c-format msgid "service file \"%s\" not found" msgstr "el archivo de servicio «%s» no fue encontrado" -#: fe-connect.c:5679 +#: fe-connect.c:5591 #, c-format msgid "line %d too long in service file \"%s\"" msgstr "la línea %d es demasiado larga en archivo de servicio «%s»" -#: fe-connect.c:5750 fe-connect.c:5793 +#: fe-connect.c:5662 fe-connect.c:5705 #, c-format msgid "syntax error in service file \"%s\", line %d" msgstr "error de sintaxis en archivo de servicio «%s», línea %d" -#: fe-connect.c:5761 +#: fe-connect.c:5673 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d" msgstr "especificaciones de servicio anidadas no soportadas en archivo de servicio «%s», línea %d" -#: fe-connect.c:6500 +#: fe-connect.c:6412 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"" msgstr "URI no válida propagada a rutina interna de procesamiento: «%s»" -#: fe-connect.c:6577 +#: fe-connect.c:6489 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"" msgstr "se encontró el fin de la cadena mientras se buscaba el «]» correspondiente en dirección IPv6 en URI: «%s»" -#: fe-connect.c:6584 +#: fe-connect.c:6496 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"" msgstr "la dirección IPv6 no puede ser vacía en la URI: «%s»" -#: fe-connect.c:6599 +#: fe-connect.c:6511 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"" msgstr "carácter «%c» inesperado en la posición %d en URI (se esperaba «:» o «/»): «%s»" -#: fe-connect.c:6728 +#: fe-connect.c:6640 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "separador llave/valor «=» extra en parámetro de la URI: «%s»" -#: fe-connect.c:6748 +#: fe-connect.c:6660 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "separador llave/valor «=» faltante en parámetro de la URI: «%s»" -#: fe-connect.c:6800 +#: fe-connect.c:6712 #, c-format msgid "invalid URI query parameter: \"%s\"" msgstr "parámetro de URI no válido: «%s»" -#: fe-connect.c:6874 +#: fe-connect.c:6786 #, c-format msgid "invalid percent-encoded token: \"%s\"" msgstr "elemento escapado con %% no válido: «%s»" -#: fe-connect.c:6884 +#: fe-connect.c:6796 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"" msgstr "valor no permitido %%00 en valor escapado con %%: «%s»" -#: fe-connect.c:7248 +#: fe-connect.c:7160 msgid "connection pointer is NULL\n" msgstr "el puntero de conexión es NULL\n" -#: fe-connect.c:7256 fe-exec.c:710 fe-exec.c:970 fe-exec.c:3292 -#: fe-protocol3.c:974 fe-protocol3.c:1007 +#: fe-connect.c:7168 fe-exec.c:713 fe-exec.c:975 fe-exec.c:3459 +#: fe-protocol3.c:991 fe-protocol3.c:1024 msgid "out of memory\n" msgstr "memoria agotada\n" -#: fe-connect.c:7547 +#: fe-connect.c:7459 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ADVERTENCIA: El archivo de claves «%s» no es un archivo plano\n" -#: fe-connect.c:7556 +#: fe-connect.c:7468 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "ADVERTENCIA: El archivo de claves «%s» tiene permiso de lectura para el grupo u otros; los permisos deberían ser u=rw (0600) o menos\n" -#: fe-connect.c:7663 +#: fe-connect.c:7575 #, c-format msgid "password retrieved from file \"%s\"" msgstr "contraseña obtenida desde el archivo «%s»" -#: fe-exec.c:466 fe-exec.c:3366 +#: fe-connect.c:7727 +#, c-format +msgid "invalid integer value \"%s\" for connection option \"%s\"" +msgstr "valor entero «%s» no válido para la opción de conexión «%s»" + +#: fe-exec.c:469 fe-exec.c:3533 #, c-format msgid "row number %d is out of range 0..%d" msgstr "el número de fila %d está fuera del rango 0..%d" -#: fe-exec.c:528 fe-protocol3.c:1975 +#: fe-exec.c:531 fe-protocol3.c:1993 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:831 +#: fe-exec.c:834 #, c-format msgid "write to server failed" msgstr "falló escritura al servidor" -#: fe-exec.c:869 +#: fe-exec.c:874 #, c-format msgid "no error text available" msgstr "no hay mensaje de error disponible" -#: fe-exec.c:958 +#: fe-exec.c:963 msgid "NOTICE" msgstr "AVISO" -#: fe-exec.c:1016 +#: fe-exec.c:1021 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult no puede soportar un número de tuplas mayor que INT_MAX" -#: fe-exec.c:1028 +#: fe-exec.c:1033 msgid "size_t overflow" msgstr "desbordamiento de size_t" -#: fe-exec.c:1444 fe-exec.c:1513 fe-exec.c:1559 +#: fe-exec.c:1438 fe-exec.c:1507 fe-exec.c:1553 #, c-format msgid "command string is a null pointer" msgstr "la cadena de orden es un puntero nulo" -#: fe-exec.c:1450 fe-exec.c:2888 +#: fe-exec.c:1444 fe-exec.c:3003 #, c-format msgid "%s not allowed in pipeline mode" msgstr "no se permite %s en modo pipeline" -#: fe-exec.c:1518 fe-exec.c:1564 fe-exec.c:1658 +#: fe-exec.c:1512 fe-exec.c:1558 fe-exec.c:1652 #, c-format msgid "number of parameters must be between 0 and %d" msgstr "el número de parámetros debe estar entre 0 y %d" -#: fe-exec.c:1554 fe-exec.c:1653 +#: fe-exec.c:1548 fe-exec.c:1647 #, c-format msgid "statement name is a null pointer" msgstr "el nombre de sentencia es un puntero nulo" -#: fe-exec.c:1695 fe-exec.c:3220 +#: fe-exec.c:1689 fe-exec.c:3379 #, c-format msgid "no connection to the server" msgstr "no hay conexión con el servidor" -#: fe-exec.c:1703 fe-exec.c:3228 +#: fe-exec.c:1697 fe-exec.c:3387 #, c-format msgid "another command is already in progress" msgstr "hay otra orden en ejecución" -#: fe-exec.c:1733 +#: fe-exec.c:1727 #, c-format msgid "cannot queue commands during COPY" msgstr "no se puede agregar órdenes a la cola mientras se hace COPY" -#: fe-exec.c:1850 +#: fe-exec.c:1846 #, c-format msgid "length must be given for binary parameter" msgstr "el largo debe ser especificado para un parámetro binario" -#: fe-exec.c:2171 +#: fe-exec.c:2205 #, c-format msgid "unexpected asyncStatus: %d" msgstr "asyncStatus no esperado: %d" -#: fe-exec.c:2327 +#: fe-exec.c:2361 #, c-format msgid "synchronous command execution functions are not allowed in pipeline mode" msgstr "no se permiten funciones que ejecuten órdenes sincrónicas en modo pipeline" -#: fe-exec.c:2344 +#: fe-exec.c:2378 msgid "COPY terminated by new PQexec" msgstr "COPY terminado por un nuevo PQexec" -#: fe-exec.c:2360 +#: fe-exec.c:2394 #, c-format msgid "PQexec not allowed during COPY BOTH" msgstr "PQexec no está permitido durante COPY BOTH" -#: fe-exec.c:2586 fe-exec.c:2641 fe-exec.c:2709 fe-protocol3.c:1906 +#: fe-exec.c:2630 +#, c-format +msgid "unrecognized message type \"%c\"" +msgstr "tipo de mensaje «%c» no reconocido" + +#: fe-exec.c:2702 fe-exec.c:2756 fe-exec.c:2824 fe-protocol3.c:1924 #, c-format msgid "no COPY in progress" msgstr "no hay COPY alguno en ejecución" -#: fe-exec.c:2895 +#: fe-exec.c:3010 #, c-format msgid "connection in wrong state" msgstr "la conexión está en un estado incorrecto" -#: fe-exec.c:2938 +#: fe-exec.c:3053 #, c-format msgid "cannot enter pipeline mode, connection not idle" msgstr "no se puede entrar en modo pipeline, la conexión no está inactiva" -#: fe-exec.c:2974 fe-exec.c:2995 +#: fe-exec.c:3089 fe-exec.c:3110 #, c-format msgid "cannot exit pipeline mode with uncollected results" msgstr "no se puede salir de modo pipeline al tener resultados sin recolectar" -#: fe-exec.c:2978 +#: fe-exec.c:3093 #, c-format msgid "cannot exit pipeline mode while busy" msgstr "no se puede salir de modo pipeline mientras haya actividad" -#: fe-exec.c:2989 +#: fe-exec.c:3104 #, c-format msgid "cannot exit pipeline mode while in COPY" msgstr "no se puede salir de modo pipeline mientras se está en COPY" -#: fe-exec.c:3154 +#: fe-exec.c:3303 #, c-format msgid "cannot send pipeline when not in pipeline mode" msgstr "no se puede enviar pipeline cuando no se está en modo pipeline" -#: fe-exec.c:3255 +#: fe-exec.c:3422 msgid "invalid ExecStatusType code" msgstr "el código de ExecStatusType no es válido" -#: fe-exec.c:3282 +#: fe-exec.c:3449 msgid "PGresult is not an error result\n" msgstr "PGresult no es un resultado de error\n" -#: fe-exec.c:3350 fe-exec.c:3373 +#: fe-exec.c:3517 fe-exec.c:3540 #, c-format msgid "column number %d is out of range 0..%d" msgstr "el número de columna %d está fuera del rango 0..%d" -#: fe-exec.c:3388 +#: fe-exec.c:3555 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "el número de parámetro %d está fuera del rango 0..%d" -#: fe-exec.c:3699 +#: fe-exec.c:3866 #, c-format msgid "could not interpret result from server: %s" msgstr "no se pudo interpretar el resultado del servidor: %s" -#: fe-exec.c:3964 fe-exec.c:4054 +#: fe-exec.c:4140 fe-exec.c:4253 #, c-format msgid "incomplete multibyte character" msgstr "carácter multibyte incompleto" +#: fe-exec.c:4142 fe-exec.c:4272 +#, c-format +#| msgid "invalid multibyte character for locale" +msgid "invalid multibyte character" +msgstr "carácter multibyte no válido" + #: fe-gssapi-common.c:122 msgid "GSSAPI name import error" msgstr "error de importación de nombre de GSSAPI" @@ -984,23 +1038,18 @@ msgstr "no se pudo escribir a archivo «%s»: %s" msgid "query to initialize large object functions did not return data" msgstr "la consulta para inicializar las funciones de objetos grandes no devuelve datos" -#: fe-misc.c:240 +#: fe-misc.c:239 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "el entero de tamaño %lu no está soportado por pqGetInt" -#: fe-misc.c:273 +#: fe-misc.c:272 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "el entero de tamaño %lu no está soportado por pqPutInt" -#: fe-misc.c:573 -#, c-format -msgid "connection not open" -msgstr "la conexión no está abierta" - -#: fe-misc.c:751 fe-secure-openssl.c:215 fe-secure-openssl.c:315 -#: fe-secure.c:257 fe-secure.c:419 +#: fe-misc.c:750 fe-secure-openssl.c:203 fe-secure-openssl.c:309 +#: fe-secure.c:237 fe-secure.c:404 #, c-format msgid "" "server closed the connection unexpectedly\n" @@ -1011,165 +1060,172 @@ msgstr "" "\tProbablemente se debe a que el servidor terminó de manera anormal\n" "\tantes o durante el procesamiento de la petición." -#: fe-misc.c:818 +#: fe-misc.c:817 msgid "connection not open\n" msgstr "la conexión no está abierta\n" -#: fe-misc.c:1003 +#: fe-misc.c:1005 #, c-format msgid "timeout expired" msgstr "tiempo de espera agotado" -#: fe-misc.c:1047 +#: fe-misc.c:1049 #, c-format msgid "invalid socket" msgstr "socket no válido" -#: fe-misc.c:1069 +#: fe-misc.c:1071 #, c-format msgid "%s() failed: %s" msgstr "%s() falló: %s" -#: fe-protocol3.c:182 +#: fe-protocol3.c:187 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "un mensaje de tipo 0x%02x llegó del servidor estando inactivo" -#: fe-protocol3.c:385 +#: fe-protocol3.c:402 #, c-format msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" msgstr "el servidor envió datos (mensaje «D») sin precederlos con una descripción de fila (mensaje «T»)" -#: fe-protocol3.c:427 +#: fe-protocol3.c:444 #, c-format msgid "unexpected response from server; first received character was \"%c\"" msgstr "se ha recibido una respuesta inesperada del servidor; el primer carácter recibido fue «%c»" -#: fe-protocol3.c:450 +#: fe-protocol3.c:467 #, c-format msgid "message contents do not agree with length in message type \"%c\"" msgstr "el contenido del mensaje no concuerda con el largo, en el mensaje tipo «%c»" -#: fe-protocol3.c:468 +#: fe-protocol3.c:485 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d" msgstr "se perdió la sincronía con el servidor: se recibió un mensaje de tipo «%c», largo %d" -#: fe-protocol3.c:520 fe-protocol3.c:560 +#: fe-protocol3.c:537 fe-protocol3.c:577 msgid "insufficient data in \"T\" message" msgstr "datos insuficientes en el mensaje «T»" -#: fe-protocol3.c:631 fe-protocol3.c:837 +#: fe-protocol3.c:648 fe-protocol3.c:854 msgid "out of memory for query result" msgstr "no hay suficiente memoria para el resultado de la consulta" -#: fe-protocol3.c:700 +#: fe-protocol3.c:717 msgid "insufficient data in \"t\" message" msgstr "datos insuficientes en el mensaje «t»" -#: fe-protocol3.c:759 fe-protocol3.c:791 fe-protocol3.c:809 +#: fe-protocol3.c:776 fe-protocol3.c:808 fe-protocol3.c:826 msgid "insufficient data in \"D\" message" msgstr "datos insuficientes en el mensaje «D»" -#: fe-protocol3.c:765 +#: fe-protocol3.c:782 msgid "unexpected field count in \"D\" message" msgstr "cantidad de campos inesperada en mensaje «D»" -#: fe-protocol3.c:1020 +#: fe-protocol3.c:1037 msgid "no error message available\n" msgstr "no hay mensaje de error disponible\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1068 fe-protocol3.c:1087 +#: fe-protocol3.c:1085 fe-protocol3.c:1104 #, c-format msgid " at character %s" msgstr " en el carácter %s" -#: fe-protocol3.c:1100 +#: fe-protocol3.c:1117 #, c-format msgid "DETAIL: %s\n" msgstr "DETALLE: %s\n" -#: fe-protocol3.c:1103 +#: fe-protocol3.c:1120 #, c-format msgid "HINT: %s\n" msgstr "SUGERENCIA: %s\n" -#: fe-protocol3.c:1106 +#: fe-protocol3.c:1123 #, c-format msgid "QUERY: %s\n" msgstr "CONSULTA: %s\n" -#: fe-protocol3.c:1113 +#: fe-protocol3.c:1130 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXTO: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1139 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "NOMBRE DE ESQUEMA: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1143 #, c-format msgid "TABLE NAME: %s\n" msgstr "NOMBRE DE TABLA: %s\n" -#: fe-protocol3.c:1130 +#: fe-protocol3.c:1147 #, c-format msgid "COLUMN NAME: %s\n" msgstr "NOMBRE DE COLUMNA: %s\n" -#: fe-protocol3.c:1134 +#: fe-protocol3.c:1151 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "NOMBRE TIPO DE DATO: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1155 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "NOMBRE DE RESTRICCIÓN: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1167 msgid "LOCATION: " msgstr "UBICACIÓN: " -#: fe-protocol3.c:1152 +#: fe-protocol3.c:1169 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1171 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1349 +#: fe-protocol3.c:1366 #, c-format msgid "LINE %d: " msgstr "LÃNEA %d: " -#: fe-protocol3.c:1424 +#: fe-protocol3.c:1440 #, c-format -msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u\n" -msgstr "versión de protocolo no soportada por el servidor: cliente usa %u.%u, servidor soporta hasta %u.%u\n" +msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u" +msgstr "versión de protocolo no soportada por el servidor: cliente usa %u.%u, servidor soporta hasta %u.%u" -#: fe-protocol3.c:1436 +#: fe-protocol3.c:1446 +#, c-format +msgid "protocol extension not supported by server: %s" +msgid_plural "protocol extensions not supported by server: %s" +msgstr[0] "extensión del protocolo no soportada por el servidor: %s" +msgstr[1] "extensiones del protocolo no soportadas por el servidor: %s" + +#: fe-protocol3.c:1454 #, c-format msgid "invalid %s message" msgstr "mensaje %s no válido" -#: fe-protocol3.c:1801 +#: fe-protocol3.c:1819 #, c-format msgid "PQgetline: not doing text COPY OUT" msgstr "PQgetline: no se está haciendo COPY OUT de texto" -#: fe-protocol3.c:2175 +#: fe-protocol3.c:2193 #, c-format msgid "protocol error: no function result" msgstr "error de protocolo: no hay resultado de función" -#: fe-protocol3.c:2186 +#: fe-protocol3.c:2204 #, c-format msgid "protocol error: id=0x%x" msgstr "error de protocolo: id=0x%x" @@ -1194,6 +1250,13 @@ msgstr "no se pudo convertir la dirección IP del certificado a cadena: %s" msgid "host name must be specified for a verified SSL connection" msgstr "el nombre de servidor debe ser especificado para una conexión SSL verificada" +#: fe-secure-common.c:286 +#, c-format +msgid "server certificate for \"%s\" (and %d other name) does not match host name \"%s\"" +msgid_plural "server certificate for \"%s\" (and %d other names) does not match host name \"%s\"" +msgstr[0] "el certificado de servidor para «%s» (y %d otro nombre) no coincide con el nombre de servidor «%s»" +msgstr[1] "el certificado de servidor para «%s» (y %d otros nombres) no coincide con el nombre de servidor «%s»" + #: fe-secure-common.c:294 #, c-format msgid "server certificate for \"%s\" does not match host name \"%s\"" @@ -1204,132 +1267,132 @@ msgstr "el certificado de servidor para «%s» no coincide con el nombre de serv msgid "could not get server's host name from server certificate" msgstr "no se pudo obtener el nombre de servidor desde el certificado del servidor" -#: fe-secure-gssapi.c:201 +#: fe-secure-gssapi.c:194 msgid "GSSAPI wrap error" msgstr "error de «wrap» de GSSAPI" -#: fe-secure-gssapi.c:208 +#: fe-secure-gssapi.c:201 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "mensaje saliente GSSAPI no proveería confidencialidad" -#: fe-secure-gssapi.c:215 +#: fe-secure-gssapi.c:208 #, c-format msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "el cliente intentó enviar un paquete GSSAPI demasiado grande (%zu > %zu)" -#: fe-secure-gssapi.c:351 fe-secure-gssapi.c:593 +#: fe-secure-gssapi.c:347 fe-secure-gssapi.c:589 #, c-format msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" msgstr "paquete GSSAPI demasiado grande enviado por el servidor (%zu > %zu)" -#: fe-secure-gssapi.c:390 +#: fe-secure-gssapi.c:386 msgid "GSSAPI unwrap error" msgstr "error de «unwrap» de GSSAPI" -#: fe-secure-gssapi.c:399 +#: fe-secure-gssapi.c:395 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "mensaje GSSAPI entrante no usó confidencialidad" -#: fe-secure-gssapi.c:656 +#: fe-secure-gssapi.c:652 msgid "could not initiate GSSAPI security context" msgstr "no se pudo iniciar un contexto de seguridad GSSAPI" -#: fe-secure-gssapi.c:685 +#: fe-secure-gssapi.c:681 msgid "GSSAPI size check error" msgstr "error de verificación de tamaño GSSAPI" -#: fe-secure-gssapi.c:696 +#: fe-secure-gssapi.c:692 msgid "GSSAPI context establishment error" msgstr "error de establecimiento de contexto de GSSAPI" -#: fe-secure-openssl.c:219 fe-secure-openssl.c:319 fe-secure-openssl.c:1531 +#: fe-secure-openssl.c:207 fe-secure-openssl.c:313 fe-secure-openssl.c:1524 #, c-format msgid "SSL SYSCALL error: %s" msgstr "ERROR en llamada SSL: %s" -#: fe-secure-openssl.c:225 fe-secure-openssl.c:325 fe-secure-openssl.c:1534 +#: fe-secure-openssl.c:213 fe-secure-openssl.c:319 fe-secure-openssl.c:1527 #, c-format msgid "SSL SYSCALL error: EOF detected" msgstr "ERROR en llamada SSL: detectado fin de archivo" -#: fe-secure-openssl.c:235 fe-secure-openssl.c:335 fe-secure-openssl.c:1542 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:329 fe-secure-openssl.c:1535 #, c-format msgid "SSL error: %s" msgstr "error de SSL: %s" -#: fe-secure-openssl.c:249 fe-secure-openssl.c:349 +#: fe-secure-openssl.c:237 fe-secure-openssl.c:343 #, c-format msgid "SSL connection has been closed unexpectedly" msgstr "la conexión SSL se ha cerrado inesperadamente" -#: fe-secure-openssl.c:254 fe-secure-openssl.c:354 fe-secure-openssl.c:1589 +#: fe-secure-openssl.c:242 fe-secure-openssl.c:348 fe-secure-openssl.c:1582 #, c-format msgid "unrecognized SSL error code: %d" msgstr "código de error SSL no reconocido: %d" -#: fe-secure-openssl.c:397 +#: fe-secure-openssl.c:390 #, c-format msgid "could not determine server certificate signature algorithm" msgstr "no se pudo determinar el algoritmo de firma del certificado del servidor" -#: fe-secure-openssl.c:417 +#: fe-secure-openssl.c:410 #, c-format msgid "could not find digest for NID %s" msgstr "no se pudo encontrar «digest» para el NID %s" -#: fe-secure-openssl.c:426 +#: fe-secure-openssl.c:419 #, c-format msgid "could not generate peer certificate hash" msgstr "no se pudo generar hash de certificado de la contraparte" -#: fe-secure-openssl.c:509 +#: fe-secure-openssl.c:501 #, c-format msgid "SSL certificate's name entry is missing" msgstr "falta el elemento de nombre en el certificado SSL" -#: fe-secure-openssl.c:543 +#: fe-secure-openssl.c:535 #, c-format msgid "SSL certificate's address entry is missing" msgstr "falta el elemento de dirección en el certificado SSL" -#: fe-secure-openssl.c:960 +#: fe-secure-openssl.c:935 #, c-format msgid "could not create SSL context: %s" msgstr "no se pudo crear un contexto SSL: %s" -#: fe-secure-openssl.c:1002 +#: fe-secure-openssl.c:977 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version" msgstr "valor entero «%s» no válido para la versión mínima del protocolo SSL" -#: fe-secure-openssl.c:1012 +#: fe-secure-openssl.c:987 #, c-format msgid "could not set minimum SSL protocol version: %s" msgstr "no se pudo definir la versión mínima de protocolo SSL: %s" -#: fe-secure-openssl.c:1028 +#: fe-secure-openssl.c:1003 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version" msgstr "valor entero «%s» no válido para la versión máxima del protocolo SSL" -#: fe-secure-openssl.c:1038 +#: fe-secure-openssl.c:1013 #, c-format msgid "could not set maximum SSL protocol version: %s" msgstr "no se pudo definir la versión máxima de protocolo SSL: %s" -#: fe-secure-openssl.c:1076 +#: fe-secure-openssl.c:1051 #, c-format msgid "could not load system root certificate paths: %s" msgstr "no se pudo cargar las rutas de los certificados raíz del sistema: %s" -#: fe-secure-openssl.c:1093 +#: fe-secure-openssl.c:1068 #, c-format msgid "could not read root certificate file \"%s\": %s" msgstr "no se pudo leer la lista de certificado raíz «%s»: %s" -#: fe-secure-openssl.c:1145 +#: fe-secure-openssl.c:1120 #, c-format msgid "" "could not get home directory to locate root certificate file\n" @@ -1338,7 +1401,7 @@ msgstr "" "no se pudo obtener el directorio «home» para ubicar el archivo del certificado raíz\n" "Debe ya sea entregar este archivo, usar las raíces confiadas por el sistema con sslrootcert=system, o bien cambiar sslmode para inhabilitarla verificación de certificados del servidor." -#: fe-secure-openssl.c:1148 +#: fe-secure-openssl.c:1123 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1347,112 +1410,127 @@ msgstr "" "el archivo de certificado raíz «%s» no existe\n" "Debe ya sea entregar este archivo, usar las raíces confiadas por el sistema con sslrootcert=system, o bien cambiar sslmode para inhabilitar la verificación de certificados del servidor." -#: fe-secure-openssl.c:1183 +#: fe-secure-openssl.c:1158 #, c-format msgid "could not open certificate file \"%s\": %s" msgstr "no se pudo abrir el archivo de certificado «%s»: %s" -#: fe-secure-openssl.c:1201 +#: fe-secure-openssl.c:1176 #, c-format msgid "could not read certificate file \"%s\": %s" msgstr "no se pudo leer el archivo de certificado «%s»: %s" -#: fe-secure-openssl.c:1225 +#: fe-secure-openssl.c:1200 #, c-format msgid "could not establish SSL connection: %s" msgstr "no se pudo establecer conexión SSL: %s" -#: fe-secure-openssl.c:1257 +#: fe-secure-openssl.c:1232 #, c-format msgid "could not set SSL Server Name Indication (SNI): %s" msgstr "no se pudo establecer el Indicador de Nombre del Servidor (SNI) de SSL: %s" -#: fe-secure-openssl.c:1300 +#: fe-secure-openssl.c:1249 +#, c-format +msgid "could not set SSL ALPN extension: %s" +msgstr "no se pudo definir la extensión ALPN de SSL: %s" + +#: fe-secure-openssl.c:1292 #, c-format msgid "could not load SSL engine \"%s\": %s" msgstr "no se pudo cargar el motor SSL «%s»: %s" -#: fe-secure-openssl.c:1311 +#: fe-secure-openssl.c:1303 #, c-format msgid "could not initialize SSL engine \"%s\": %s" msgstr "no se pudo inicializar el motor SSL «%s»: %s" -#: fe-secure-openssl.c:1326 +#: fe-secure-openssl.c:1318 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" msgstr "no se pudo leer el archivo de la llave privada SSL «%s» desde el motor «%s»: %s" -#: fe-secure-openssl.c:1339 +#: fe-secure-openssl.c:1331 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" msgstr "no se pudo leer la llave privada SSL «%s» desde el motor «%s»: %s" -#: fe-secure-openssl.c:1376 +#: fe-secure-openssl.c:1368 #, c-format msgid "certificate present, but not private key file \"%s\"" msgstr "el certificado está presente, pero no la llave privada «%s»" -#: fe-secure-openssl.c:1379 +#: fe-secure-openssl.c:1371 #, c-format msgid "could not stat private key file \"%s\": %m" msgstr "no se pudo hacer stat del archivo de la llave privada «%s»: %m" -#: fe-secure-openssl.c:1387 +#: fe-secure-openssl.c:1379 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "el archivo de llave privada «%s» no es un archivo regular" -#: fe-secure-openssl.c:1420 +#: fe-secure-openssl.c:1412 #, c-format msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root" msgstr "el archivo de llave privada «%s» tiene acceso de grupo o para todos; debe tener permisos u=rw (0600) o menos si es de propiedad del usuario de base de datos, o permisos u=rw,g=r (0640) o menos si es de root" -#: fe-secure-openssl.c:1444 +#: fe-secure-openssl.c:1436 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "no se pudo cargar el archivo de la llave privada «%s»: %s" -#: fe-secure-openssl.c:1460 +#: fe-secure-openssl.c:1452 #, c-format msgid "certificate does not match private key file \"%s\": %s" msgstr "el certificado no coincide con la llave privada «%s»: %s" -#: fe-secure-openssl.c:1528 +#: fe-secure-openssl.c:1521 #, c-format msgid "SSL error: certificate verify failed: %s" msgstr "error SSL: falló la verificación de certificado: %s" -#: fe-secure-openssl.c:1573 +#: fe-secure-openssl.c:1566 #, c-format msgid "This may indicate that the server does not support any SSL protocol version between %s and %s." msgstr "Esto puede indicar que el servidor no soporta ninguna versión del protocolo SSL entre %s y %s." -#: fe-secure-openssl.c:1606 +#: fe-secure-openssl.c:1598 +#, c-format +msgid "direct SSL connection was established without ALPN protocol negotiation extension" +msgstr "conexión SSL directa fue establecida sin extensión de negociación de protocolo ALPN" + +#: fe-secure-openssl.c:1610 +#, c-format +msgid "SSL connection was established with unexpected ALPN protocol" +msgstr "la conexión SSL fue establecida con protocolo ALPN inesperado" + +#: fe-secure-openssl.c:1627 #, c-format msgid "certificate could not be obtained: %s" msgstr "el certificado no pudo ser obtenido: %s" -#: fe-secure-openssl.c:1711 +#: fe-secure-openssl.c:1734 #, c-format msgid "no SSL error reported" msgstr "código de error SSL no reportado" -#: fe-secure-openssl.c:1720 +#: fe-secure-openssl.c:1777 #, c-format msgid "SSL error code %lu" msgstr "código de error SSL %lu" -#: fe-secure-openssl.c:1986 +#: fe-secure-openssl.c:2076 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ADVERTENCIA: sslpassword truncada\n" -#: fe-secure.c:263 +#: fe-secure.c:248 #, c-format msgid "could not receive data from server: %s" msgstr "no se pudo recibir datos del servidor: %s" -#: fe-secure.c:434 +#: fe-secure.c:419 #, c-format msgid "could not send data to server: %s" msgstr "no se pudo enviar datos al servidor: %s" diff --git a/src/interfaces/libpq/po/fr.po b/src/interfaces/libpq/po/fr.po index 1a7f5203b781f..dabac01a3ef7f 100644 --- a/src/interfaces/libpq/po/fr.po +++ b/src/interfaces/libpq/po/fr.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-14 10:10+0000\n" -"PO-Revision-Date: 2022-05-14 17:15+0200\n" +"POT-Creation-Date: 2025-02-15 21:41+0000\n" +"PO-Revision-Date: 2025-02-16 09:12+0100\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -21,636 +21,800 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: ../../port/thread.c:100 ../../port/thread.c:136 +#: ../../port/user.c:43 ../../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "n'a pas pu rechercher l'identifiant de l'utilisateur local %d : %s" -#: ../../port/thread.c:105 ../../port/thread.c:141 +#: ../../port/user.c:48 ../../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "l'utilisateur local dont l'identifiant est %d n'existe pas" -#: fe-auth-scram.c:231 -msgid "malformed SCRAM message (empty message)\n" -msgstr "message SCRAM malformé (message vide)\n" - -#: fe-auth-scram.c:237 -msgid "malformed SCRAM message (length mismatch)\n" -msgstr "message SCRAM malformé (pas de correspondance sur la longueur)\n" +#: fe-auth-scram.c:223 +#, c-format +msgid "malformed SCRAM message (empty message)" +msgstr "message SCRAM malformé (message vide)" -#: fe-auth-scram.c:281 +#: fe-auth-scram.c:228 #, c-format -msgid "could not verify server signature: %s\n" -msgstr "n'a pas pu vérifier la signature du serveur : %s\n" +msgid "malformed SCRAM message (length mismatch)" +msgstr "message SCRAM malformé (pas de correspondance sur la longueur)" -#: fe-auth-scram.c:288 -msgid "incorrect server signature\n" -msgstr "signature invalide du serveur\n" +#: fe-auth-scram.c:272 +#, c-format +msgid "could not verify server signature: %s" +msgstr "n'a pas pu vérifier la signature du serveur : %s" -#: fe-auth-scram.c:297 -msgid "invalid SCRAM exchange state\n" -msgstr "état d'échange SCRAM invalide\n" +#: fe-auth-scram.c:278 +#, c-format +msgid "incorrect server signature" +msgstr "signature invalide du serveur" -#: fe-auth-scram.c:324 +#: fe-auth-scram.c:287 #, c-format -msgid "malformed SCRAM message (attribute \"%c\" expected)\n" -msgstr "message SCRAM malformé (attribut « %c » attendu)\n" +msgid "invalid SCRAM exchange state" +msgstr "état d'échange SCRAM invalide" -#: fe-auth-scram.c:333 +#: fe-auth-scram.c:311 #, c-format -msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" -msgstr "message SCRAM malformé (caractère « = » attendu pour l'attribut « %c »)\n" +msgid "malformed SCRAM message (attribute \"%c\" expected)" +msgstr "message SCRAM malformé (attribut « %c » attendu)" -#: fe-auth-scram.c:374 -msgid "could not generate nonce\n" -msgstr "n'a pas pu générer le nonce\n" +#: fe-auth-scram.c:320 +#, c-format +msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")" +msgstr "message SCRAM malformé (caractère « = » attendu pour l'attribut « %c »)" -#: fe-auth-scram.c:384 fe-auth-scram.c:459 fe-auth-scram.c:615 -#: fe-auth-scram.c:636 fe-auth-scram.c:662 fe-auth-scram.c:677 -#: fe-auth-scram.c:727 fe-auth-scram.c:766 fe-auth.c:290 fe-auth.c:362 -#: fe-auth.c:398 fe-auth.c:623 fe-auth.c:799 fe-auth.c:1152 fe-auth.c:1322 -#: fe-connect.c:907 fe-connect.c:1456 fe-connect.c:1625 fe-connect.c:2977 -#: fe-connect.c:4824 fe-connect.c:5085 fe-connect.c:5204 fe-connect.c:5456 -#: fe-connect.c:5537 fe-connect.c:5636 fe-connect.c:5892 fe-connect.c:5921 -#: fe-connect.c:5993 fe-connect.c:6017 fe-connect.c:6035 fe-connect.c:6136 -#: fe-connect.c:6145 fe-connect.c:6503 fe-connect.c:6653 fe-connect.c:6919 -#: fe-exec.c:710 fe-exec.c:976 fe-exec.c:1324 fe-exec.c:3135 fe-exec.c:3318 -#: fe-exec.c:4096 fe-exec.c:4261 fe-gssapi-common.c:111 fe-lobj.c:884 -#: fe-protocol3.c:985 fe-protocol3.c:1000 fe-protocol3.c:1033 -#: fe-protocol3.c:1741 fe-protocol3.c:2144 fe-secure-common.c:112 -#: fe-secure-gssapi.c:504 fe-secure-openssl.c:449 fe-secure-openssl.c:1261 -msgid "out of memory\n" -msgstr "mémoire épuisée\n" +#: fe-auth-scram.c:360 +#, c-format +msgid "could not generate nonce" +msgstr "n'a pas pu générer le nonce" -#: fe-auth-scram.c:392 -msgid "could not encode nonce\n" -msgstr "n'a pas pu encoder le nonce\n" +#: fe-auth-scram.c:369 fe-auth-scram.c:442 fe-auth-scram.c:594 +#: fe-auth-scram.c:614 fe-auth-scram.c:638 fe-auth-scram.c:652 +#: fe-auth-scram.c:698 fe-auth-scram.c:734 fe-auth-scram.c:908 fe-auth.c:296 +#: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:727 fe-auth.c:1200 +#: fe-auth.c:1363 fe-cancel.c:159 fe-connect.c:936 fe-connect.c:976 +#: fe-connect.c:1860 fe-connect.c:2022 fe-connect.c:3430 fe-connect.c:4761 +#: fe-connect.c:5073 fe-connect.c:5328 fe-connect.c:5446 fe-connect.c:5693 +#: fe-connect.c:5773 fe-connect.c:5871 fe-connect.c:6122 fe-connect.c:6149 +#: fe-connect.c:6225 fe-connect.c:6248 fe-connect.c:6272 fe-connect.c:6307 +#: fe-connect.c:6393 fe-connect.c:6401 fe-connect.c:6758 fe-connect.c:6908 +#: fe-exec.c:530 fe-exec.c:1315 fe-exec.c:3254 fe-exec.c:4291 fe-exec.c:4457 +#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:209 fe-protocol3.c:232 +#: fe-protocol3.c:255 fe-protocol3.c:272 fe-protocol3.c:293 fe-protocol3.c:369 +#: fe-protocol3.c:737 fe-protocol3.c:976 fe-protocol3.c:1787 +#: fe-protocol3.c:2187 fe-secure-common.c:110 fe-secure-gssapi.c:496 +#: fe-secure-openssl.c:427 fe-secure-openssl.c:1277 +#, c-format +msgid "out of memory" +msgstr "mémoire épuisée" -#: fe-auth-scram.c:582 +#: fe-auth-scram.c:376 #, c-format -msgid "could not calculate client proof: %s\n" -msgstr "n'a pas pu calculer la preuve du client : %s\n" +msgid "could not encode nonce" +msgstr "n'a pas pu encoder le nonce" -#: fe-auth-scram.c:599 -msgid "could not encode client proof\n" -msgstr "n'a pas pu encoder la preuve du client\n" +#: fe-auth-scram.c:564 +#, c-format +msgid "could not calculate client proof: %s" +msgstr "n'a pas pu calculer la preuve du client : %s" -#: fe-auth-scram.c:654 -msgid "invalid SCRAM response (nonce mismatch)\n" -msgstr "réponse SCRAM invalide (pas de correspondance sur nonce)\n" +#: fe-auth-scram.c:579 +#, c-format +msgid "could not encode client proof" +msgstr "n'a pas pu encoder la preuve du client" -#: fe-auth-scram.c:687 -msgid "malformed SCRAM message (invalid salt)\n" -msgstr "message SCRAM malformé (sel invalide)\n" +#: fe-auth-scram.c:631 +#, c-format +msgid "invalid SCRAM response (nonce mismatch)" +msgstr "réponse SCRAM invalide (pas de correspondance sur nonce)" -#: fe-auth-scram.c:701 -msgid "malformed SCRAM message (invalid iteration count)\n" -msgstr "message SCRAM malformé (décompte d'itération invalide)\n" +#: fe-auth-scram.c:661 +#, c-format +msgid "malformed SCRAM message (invalid salt)" +msgstr "message SCRAM malformé (sel invalide)" -#: fe-auth-scram.c:707 -msgid "malformed SCRAM message (garbage at end of server-first-message)\n" -msgstr "message SCRAM malformé (problème à la fin du server-first-message)\n" +#: fe-auth-scram.c:674 +#, c-format +msgid "malformed SCRAM message (invalid iteration count)" +msgstr "message SCRAM malformé (décompte d'itération invalide)" -#: fe-auth-scram.c:743 +#: fe-auth-scram.c:679 #, c-format -msgid "error received from server in SCRAM exchange: %s\n" -msgstr "réception d'une erreur du serveur dans l'échange SCRAM : %s\n" +msgid "malformed SCRAM message (garbage at end of server-first-message)" +msgstr "message SCRAM malformé (problème à la fin du server-first-message)" -#: fe-auth-scram.c:759 -msgid "malformed SCRAM message (garbage at end of server-final-message)\n" -msgstr "message SCRAM malformé (problème à la fin du server-final-message)\n" +#: fe-auth-scram.c:713 +#, c-format +msgid "error received from server in SCRAM exchange: %s" +msgstr "réception d'une erreur du serveur dans l'échange SCRAM : %s" -#: fe-auth-scram.c:778 -msgid "malformed SCRAM message (invalid server signature)\n" -msgstr "message SCRAM malformé (signature serveur invalide)\n" +#: fe-auth-scram.c:728 +#, c-format +msgid "malformed SCRAM message (garbage at end of server-final-message)" +msgstr "message SCRAM malformé (problème à la fin du server-final-message)" -#: fe-auth-scram.c:934 fe-exec.c:527 fe-protocol3.c:219 fe-protocol3.c:244 -#: fe-protocol3.c:273 fe-protocol3.c:291 fe-protocol3.c:372 fe-protocol3.c:745 -msgid "out of memory" -msgstr "mémoire épuisée" +#: fe-auth-scram.c:745 +#, c-format +msgid "malformed SCRAM message (invalid server signature)" +msgstr "message SCRAM malformé (signature serveur invalide)" -#: fe-auth-scram.c:943 -msgid "failed to generate random salt" -msgstr "a échoué à générer le sel aléatoire" +#: fe-auth-scram.c:917 +msgid "could not generate random salt" +msgstr "n'a pas pu générer le sel aléatoire" -#: fe-auth.c:76 +#: fe-auth.c:77 #, c-format -msgid "out of memory allocating GSSAPI buffer (%d)\n" -msgstr "mémoire épuisée lors de l'allocation du tampon GSSAPI (%d)\n" +msgid "out of memory allocating GSSAPI buffer (%d)" +msgstr "mémoire épuisée lors de l'allocation du tampon GSSAPI (%d)" -#: fe-auth.c:131 +#: fe-auth.c:138 msgid "GSSAPI continuation error" msgstr "erreur de suite GSSAPI" -#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:100 -#: fe-secure-common.c:177 -msgid "host name must be specified\n" -msgstr "le nom d'hôte doit être précisé\n" +#: fe-auth.c:168 fe-auth.c:397 fe-gssapi-common.c:97 fe-secure-common.c:99 +#: fe-secure-common.c:173 +#, c-format +msgid "host name must be specified" +msgstr "le nom d'hôte doit être précisé" -#: fe-auth.c:165 -msgid "duplicate GSS authentication request\n" -msgstr "requête d'authentification GSS dupliquée\n" +#: fe-auth.c:174 +#, c-format +msgid "duplicate GSS authentication request" +msgstr "requête d'authentification GSS dupliquée" -#: fe-auth.c:230 +#: fe-auth.c:238 #, c-format -msgid "out of memory allocating SSPI buffer (%d)\n" -msgstr "mémoire épuisée lors de l'allocation du tampon SSPI (%d)\n" +msgid "out of memory allocating SSPI buffer (%d)" +msgstr "mémoire épuisée lors de l'allocation du tampon SSPI (%d)" -#: fe-auth.c:278 +#: fe-auth.c:285 msgid "SSPI continuation error" msgstr "erreur de suite SSPI" -#: fe-auth.c:351 -msgid "duplicate SSPI authentication request\n" -msgstr "requête d'authentification SSPI dupliquée\n" +#: fe-auth.c:359 +#, c-format +msgid "duplicate SSPI authentication request" +msgstr "requête d'authentification SSPI dupliquée" -#: fe-auth.c:377 +#: fe-auth.c:384 msgid "could not acquire SSPI credentials" msgstr "n'a pas pu obtenir les pièces d'identité SSPI" -#: fe-auth.c:433 -msgid "channel binding required, but SSL not in use\n" -msgstr "lien de canal requis, mais SSL non utilisé\n" +#: fe-auth.c:436 +#, c-format +msgid "channel binding required, but SSL not in use" +msgstr "lien de canal requis, mais SSL non utilisé" -#: fe-auth.c:440 -msgid "duplicate SASL authentication request\n" -msgstr "requête d'authentification SASL dupliquée\n" +#: fe-auth.c:442 +#, c-format +msgid "duplicate SASL authentication request" +msgstr "requête d'authentification SASL dupliquée" -#: fe-auth.c:499 -msgid "channel binding is required, but client does not support it\n" -msgstr "le lien de canal SCRAM est requis mais le client ne supporte par cette option\n" +#: fe-auth.c:500 +#, c-format +msgid "channel binding is required, but client does not support it" +msgstr "le lien de canal SCRAM est requis mais le client ne supporte par cette option" #: fe-auth.c:516 -msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" -msgstr "le serveur a proposé une authentification SCRAM-SHA-256-PLUS sur une connexion non SSL\n" +#, c-format +msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection" +msgstr "le serveur a proposé une authentification SCRAM-SHA-256-PLUS sur une connexion non SSL" #: fe-auth.c:531 -msgid "none of the server's SASL authentication mechanisms are supported\n" -msgstr "" -"authentification Kerberos 4 non supportée\n" -"aucun des mécanismes d'authentification SASL du serveur n'est supporté\n" +#, c-format +msgid "none of the server's SASL authentication mechanisms are supported" +msgstr "aucun des mécanismes d'authentification SASL du serveur n'est supporté" + +#: fe-auth.c:538 +#, c-format +msgid "channel binding is required, but server did not offer an authentication method that supports channel binding" +msgstr "Lien de canal requis, mais le serveur ne propose pas de méthode d'authentification le supportant" -#: fe-auth.c:539 -msgid "channel binding is required, but server did not offer an authentication method that supports channel binding\n" -msgstr "Lien de canal requis, mais le serveur ne propose pas de méthode d'authentification le supportant\n" +#: fe-auth.c:640 +#, c-format +msgid "out of memory allocating SASL buffer (%d)" +msgstr "mémoire épuisée lors de l'allocation du tampon SASL (%d)" + +#: fe-auth.c:663 +#, c-format +msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed" +msgstr "AuthenticationSASLFinal reçu du serveur mais l'authentification SASL n'a pas été terminée" + +#: fe-auth.c:673 +#, c-format +msgid "no client response found after SASL exchange success" +msgstr "aucune réponse client trouvée après le succès de l'échange SASL" + +#: fe-auth.c:736 fe-auth.c:743 fe-auth.c:1346 fe-auth.c:1357 +#, c-format +msgid "could not encrypt password: %s" +msgstr "n'a pas pu chiffré le mot de passe : %s" + +#: fe-auth.c:772 +msgid "server requested a cleartext password" +msgstr "le serveur a demandé un mot de passe en clair" + +#: fe-auth.c:774 +msgid "server requested a hashed password" +msgstr "le serveur a demandé un mot de passe haché" + +#: fe-auth.c:777 +msgid "server requested GSSAPI authentication" +msgstr "le serveur a demandé l'authentification GSSAPI" + +#: fe-auth.c:779 +msgid "server requested SSPI authentication" +msgstr "le serveur a demandé l'authentification SSPI" + +#: fe-auth.c:783 +msgid "server requested SASL authentication" +msgstr "le serveur a demandé l'authentification SASL" + +#: fe-auth.c:786 +msgid "server requested an unknown authentication type" +msgstr "le serveur a demandé un type d'authentification inconnu" + +#: fe-auth.c:819 +#, c-format +msgid "server did not request an SSL certificate" +msgstr "le serveur n'a pas réclamé de certificat SSL" + +#: fe-auth.c:824 +#, c-format +msgid "server accepted connection without a valid SSL certificate" +msgstr "le serveur a accepté la connexion sans certificat SSL valide" + +#: fe-auth.c:878 +msgid "server did not complete authentication" +msgstr "le serveur n'a pas terminé l'authentification" + +#: fe-auth.c:912 +#, c-format +msgid "authentication method requirement \"%s\" failed: %s" +msgstr "la demande de la méthode d'authentification « %s » a échoué : %s" + +#: fe-auth.c:935 +#, c-format +msgid "channel binding required, but server authenticated client without channel binding" +msgstr "lien de canal requis, mais le serveur a authentifié le client sans lien de canal" + +#: fe-auth.c:940 +#, c-format +msgid "channel binding required but not supported by server's authentication request" +msgstr "lien de canal requis, mais non supporté par la requête d'authentification du serveur" + +#: fe-auth.c:974 +#, c-format +msgid "Kerberos 4 authentication not supported" +msgstr "authentification Kerberos 4 non supportée" + +#: fe-auth.c:978 +#, c-format +msgid "Kerberos 5 authentication not supported" +msgstr "authentification Kerberos 5 non supportée" + +#: fe-auth.c:1048 +#, c-format +msgid "GSSAPI authentication not supported" +msgstr "authentification GSSAPI non supportée" + +#: fe-auth.c:1079 +#, c-format +msgid "SSPI authentication not supported" +msgstr "authentification SSPI non supportée" -#: fe-auth.c:647 +#: fe-auth.c:1086 #, c-format -msgid "out of memory allocating SASL buffer (%d)\n" -msgstr "mémoire épuisée lors de l'allocation du tampon SASL (%d)\n" +msgid "Crypt authentication not supported" +msgstr "authentification crypt non supportée" -#: fe-auth.c:672 -msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed\n" -msgstr "AuthenticationSASLFinal reçu du serveur mais l'authentification SASL n'a pas été terminée\n" +#: fe-auth.c:1150 +#, c-format +msgid "authentication method %u not supported" +msgstr "méthode d'authentification %u non supportée" -#: fe-auth.c:683 -msgid "no client response found after SASL exchange success\n" -msgstr "aucune réponse client trouvée après le succès de l'échange SASL\n" +#: fe-auth.c:1187 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu" -#: fe-auth.c:765 -msgid "SCM_CRED authentication method not supported\n" -msgstr "authentification SCM_CRED non supportée\n" +#: fe-auth.c:1309 +#, c-format +msgid "unexpected shape of result set returned for SHOW" +msgstr "forme du résultat inattendu pour SHOW" -#: fe-auth.c:809 fe-auth.c:818 fe-auth.c:1301 fe-auth.c:1314 +#: fe-auth.c:1317 #, c-format -msgid "could not encrypt password: %s\n" -msgstr "n'a pas pu chiffré le mot de passe : %s\n" +msgid "\"password_encryption\" value too long" +msgstr "valeur trop longue pour password_encryption" -#: fe-auth.c:868 -msgid "channel binding required, but server authenticated client without channel binding\n" -msgstr "lien de canal requis, mais le serveur a authentifié le client sans lien de canal\n" +#: fe-auth.c:1367 +#, c-format +msgid "unrecognized password encryption algorithm \"%s\"" +msgstr "algorithme de chiffrement du mot de passe « %s » non reconnu" -#: fe-auth.c:874 -msgid "channel binding required but not supported by server's authentication request\n" -msgstr "lien de canal requis, mais non supporté par la requête d'authentification du serveur\n" +#: fe-cancel.c:76 +#, c-format +msgid "connection pointer is NULL" +msgstr "le pointeur de connexion est NULL" -#: fe-auth.c:909 -msgid "Kerberos 4 authentication not supported\n" -msgstr "authentification Kerberos 4 non supportée\n" +#: fe-cancel.c:82 fe-misc.c:572 +#, c-format +msgid "connection not open" +msgstr "la connexion n'est pas active" -#: fe-auth.c:914 -msgid "Kerberos 5 authentication not supported\n" -msgstr "authentification Kerberos 5 non supportée\n" +#: fe-cancel.c:193 +#, c-format +msgid "cancel request is already being sent on this connection" +msgstr "la demande d'annulation est déjà envoyée sur cette connexion" -#: fe-auth.c:985 -msgid "GSSAPI authentication not supported\n" -msgstr "authentification GSSAPI non supportée\n" +#: fe-cancel.c:263 +#, c-format +msgid "unexpected response from server" +msgstr "réponse inattendue du serveur" -#: fe-auth.c:1017 -msgid "SSPI authentication not supported\n" -msgstr "authentification SSPI non supportée\n" +#: fe-connect.c:1182 +#, c-format +msgid "could not match %d host names to %d hostaddr values" +msgstr "n'a pas pu faire correspondre les %d noms d'hôte aux %d valeurs hostaddr" -#: fe-auth.c:1025 -msgid "Crypt authentication not supported\n" -msgstr "authentification crypt non supportée\n" +#: fe-connect.c:1262 +#, c-format +msgid "could not match %d port numbers to %d hosts" +msgstr "n'a pas pu faire correspondre les %d numéros de port aux %d hôtes" -#: fe-auth.c:1092 +#: fe-connect.c:1387 #, c-format -msgid "authentication method %u not supported\n" -msgstr "méthode d'authentification %u non supportée\n" +msgid "negative require_auth method \"%s\" cannot be mixed with non-negative methods" +msgstr "la méthode négative require_auth « %s » ne peut pas être mélangée avec des méthodes non négatives" -#: fe-auth.c:1138 +#: fe-connect.c:1400 #, c-format -msgid "user name lookup failure: error code %lu\n" -msgstr "échec de la recherche du nom d'utilisateur : code d'erreur %lu\n" +msgid "require_auth method \"%s\" cannot be mixed with negative methods" +msgstr "la méthode require_auth « %s » ne peut pas être mélangée avec des méthodes négatives" -#: fe-auth.c:1264 -msgid "unexpected shape of result set returned for SHOW\n" -msgstr "forme du résultat inattendu pour SHOW\n" +#: fe-connect.c:1460 fe-connect.c:1511 fe-connect.c:1553 fe-connect.c:1596 +#: fe-connect.c:1699 fe-connect.c:1745 fe-connect.c:1785 fe-connect.c:1806 +#, c-format +msgid "invalid %s value: \"%s\"" +msgstr "valeur %s invalide : « %s »" -#: fe-auth.c:1273 -msgid "password_encryption value too long\n" -msgstr "la valeur de password_encryption est trop longue\n" +#: fe-connect.c:1493 +#, c-format +msgid "require_auth method \"%s\" is specified more than once" +msgstr "require_auth method \"%s\" est spécifié plus d'une fois" -#: fe-auth.c:1327 +#: fe-connect.c:1534 fe-connect.c:1573 fe-connect.c:1605 fe-connect.c:1707 #, c-format -msgid "unrecognized password encryption algorithm \"%s\"\n" -msgstr "algorithme de chiffrement du mot de passe « %s » non reconnu\n" +msgid "%s value \"%s\" invalid when SSL support is not compiled in" +msgstr "valeur %s « %s » invalide si le support SSL n'est pas compilé" -#: fe-connect.c:1090 +#: fe-connect.c:1625 #, c-format -msgid "could not match %d host names to %d hostaddr values\n" -msgstr "n'a pas pu faire correspondre les %d noms d'hôte aux %d valeurs hostaddr\n" +msgid "weak sslmode \"%s\" may not be used with sslnegotiation=direct (use \"require\", \"verify-ca\", or \"verify-full\")" +msgstr "le sslmode faible « %s » pourrait ne pas être utilisable avec sslnegotiation=direct (utilisez « require », « verify-ca » ou « verify-full »)" -#: fe-connect.c:1176 +#: fe-connect.c:1647 #, c-format -msgid "could not match %d port numbers to %d hosts\n" -msgstr "n'a pas pu faire correspondre les %d numéros de port aux %d hôtes\n" +msgid "weak sslmode \"%s\" may not be used with sslrootcert=system (use \"verify-full\")" +msgstr "le sslmode fiable « %s » pourrait ne pas être utilisé avec sslrootcert=system (utilisez \"verify-full\")" -#: fe-connect.c:1269 fe-connect.c:1295 fe-connect.c:1337 fe-connect.c:1346 -#: fe-connect.c:1379 fe-connect.c:1423 +#: fe-connect.c:1660 fe-connect.c:1668 #, c-format -msgid "invalid %s value: \"%s\"\n" -msgstr "valeur %s invalide : « %s »\n" +msgid "invalid \"%s\" value: \"%s\"" +msgstr "valeur « %s » invalide : « %s »" -#: fe-connect.c:1316 +#: fe-connect.c:1685 #, c-format -msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" -msgstr "valeur sslmode « %s » invalide si le support SSL n'est pas compilé initialement\n" +msgid "invalid SSL protocol version range" +msgstr "intervalle de version invalide pour le protocole SSL" -#: fe-connect.c:1364 -msgid "invalid SSL protocol version range\n" -msgstr "intervalle de version invalide pour le protocole SSL\n" +#: fe-connect.c:1722 +#, c-format +msgid "%s value \"%s\" is not supported (check OpenSSL version)" +msgstr "%s la valeur « %s » n'est pas supportée (vérifiez la version d'OpenSSL)" -#: fe-connect.c:1389 +#: fe-connect.c:1752 #, c-format -msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" -msgstr "valeur gssencmode « %s » invalide si le support GSSAPI n'est pas compilé\n" +msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in" +msgstr "valeur gssencmode « %s » invalide si le support GSSAPI n'est pas compilé" -#: fe-connect.c:1649 +#: fe-connect.c:2045 #, c-format -msgid "could not set socket to TCP no delay mode: %s\n" -msgstr "n'a pas pu activer le mode TCP sans délai pour la socket : %s\n" +msgid "could not set socket to TCP no delay mode: %s" +msgstr "n'a pas pu activer le mode TCP sans délai pour la socket : %s" -#: fe-connect.c:1711 +#: fe-connect.c:2104 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "la connexion au serveur sur le socket « %s » a échoué : " -#: fe-connect.c:1738 +#: fe-connect.c:2130 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "la connexion au serveur sur « %s » (%s), port %s a échoué : " -#: fe-connect.c:1743 +#: fe-connect.c:2135 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "la connexion au serveur sur « %s », port %s a échoué : " -#: fe-connect.c:1768 -msgid "\tIs the server running locally and accepting connections on that socket?\n" -msgstr "\tLe serveur est-il actif localement et accepte-t-il les connexions sur ce socket ?\n" +#: fe-connect.c:2158 +#, c-format +msgid "\tIs the server running locally and accepting connections on that socket?" +msgstr "\tLe serveur est-il actif localement et accepte-t-il les connexions sur ce socket ?" -#: fe-connect.c:1772 -msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" -msgstr "\tLe serveur est-il actif sur cet hôte et accepte-t-il les connexions ?\n" +#: fe-connect.c:2160 +#, c-format +msgid "\tIs the server running on that host and accepting TCP/IP connections?" +msgstr "\tLe serveur est-il actif sur cet hôte et accepte-t-il les connexions ?" -#: fe-connect.c:1836 +#: fe-connect.c:2206 fe-connect.c:2240 fe-connect.c:2275 fe-connect.c:2373 +#: fe-connect.c:3098 #, c-format -msgid "invalid integer value \"%s\" for connection option \"%s\"\n" -msgstr "valeur entière « %s » invalide pour l'option de connexion « %s »\n" +msgid "%s(%s) failed: %s" +msgstr "échec de %s(%s) : %s" -#: fe-connect.c:1866 fe-connect.c:1901 fe-connect.c:1937 fe-connect.c:2037 -#: fe-connect.c:2651 +#: fe-connect.c:2339 #, c-format -msgid "%s(%s) failed: %s\n" -msgstr "échec de %s(%s) : %s\n" +msgid "%s(%s) failed: error code %d" +msgstr "échec de %s(%s) : code d'erreur %d" -#: fe-connect.c:2002 +#: fe-connect.c:2650 #, c-format -msgid "%s(%s) failed: error code %d\n" -msgstr "échec de %s(%s) : code d'erreur %d\n" +msgid "invalid connection state, probably indicative of memory corruption" +msgstr "état de connexion invalide, indique probablement une corruption de mémoire" -#: fe-connect.c:2317 -msgid "invalid connection state, probably indicative of memory corruption\n" -msgstr "état de connexion invalide, indique probablement une corruption de mémoire\n" +#: fe-connect.c:2733 +#, c-format +msgid "invalid port number: \"%s\"" +msgstr "numéro de port invalide : « %s »" -#: fe-connect.c:2396 +#: fe-connect.c:2747 #, c-format -msgid "invalid port number: \"%s\"\n" -msgstr "numéro de port invalide : « %s »\n" +msgid "could not translate host name \"%s\" to address: %s" +msgstr "n'a pas pu traduire le nom d'hôte « %s » en adresse : %s" -#: fe-connect.c:2412 +#: fe-connect.c:2759 #, c-format -msgid "could not translate host name \"%s\" to address: %s\n" -msgstr "n'a pas pu traduire le nom d'hôte « %s » en adresse : %s\n" +msgid "could not parse network address \"%s\": %s" +msgstr "n'a pas pu analyser l'adresse réseau « %s » : %s" -#: fe-connect.c:2425 +#: fe-connect.c:2770 #, c-format -msgid "could not parse network address \"%s\": %s\n" -msgstr "n'a pas pu analyser l'adresse réseau « %s » : %s\n" +msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" +msgstr "Le chemin du socket de domaine Unix, « %s », est trop (maximum %d octets)" -#: fe-connect.c:2438 +#: fe-connect.c:2784 #, c-format -msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" -msgstr "Le chemin du socket de domaine Unix, « %s », est trop (maximum %d octets)\n" +msgid "could not translate Unix-domain socket path \"%s\" to address: %s" +msgstr "n'a pas pu traduire le chemin de la socket du domaine Unix « %s » en adresse : %s" -#: fe-connect.c:2453 +#: fe-connect.c:2950 fe-connect.c:4305 #, c-format -msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" -msgstr "" -"n'a pas pu traduire le chemin de la socket du domaine Unix « %s » en adresse :\n" -"%s\n" +msgid "GSSAPI encryption required but it is not supported over a local socket" +msgstr "le chiffrage avec GSSAPI était requis, mais il n'est pas supporté sur une socket locale" -#: fe-connect.c:2579 +#: fe-connect.c:2958 fe-connect.c:4434 #, c-format -msgid "could not create socket: %s\n" -msgstr "n'a pas pu créer la socket : %s\n" +msgid "GSSAPI encryption required but no credential cache" +msgstr "chiffrage GSSAPI requis mais pas de cache d'identifiant" -#: fe-connect.c:2610 +#: fe-connect.c:3026 #, c-format -msgid "could not set socket to nonblocking mode: %s\n" -msgstr "n'a pas pu activer le mode non-bloquant pour la socket : %s\n" +msgid "could not create socket: %s" +msgstr "n'a pas pu créer la socket : %s" -#: fe-connect.c:2620 +#: fe-connect.c:3057 #, c-format -msgid "could not set socket to close-on-exec mode: %s\n" -msgstr "n'a pas pu paramétrer la socket en mode close-on-exec : %s\n" +msgid "could not set socket to nonblocking mode: %s" +msgstr "n'a pas pu activer le mode non-bloquant pour la socket : %s" -#: fe-connect.c:2638 -msgid "keepalives parameter must be an integer\n" -msgstr "le paramètre keepalives doit être un entier\n" +#: fe-connect.c:3068 +#, c-format +msgid "could not set socket to close-on-exec mode: %s" +msgstr "n'a pas pu paramétrer la socket en mode close-on-exec : %s" -#: fe-connect.c:2779 +#: fe-connect.c:3225 #, c-format -msgid "could not get socket error status: %s\n" -msgstr "n'a pas pu déterminer le statut d'erreur de la socket : %s\n" +msgid "could not get socket error status: %s" +msgstr "n'a pas pu déterminer le statut d'erreur de la socket : %s" -#: fe-connect.c:2807 +#: fe-connect.c:3252 #, c-format -msgid "could not get client address from socket: %s\n" -msgstr "n'a pas pu obtenir l'adresse du client depuis la socket : %s\n" +msgid "could not get client address from socket: %s" +msgstr "n'a pas pu obtenir l'adresse du client depuis la socket : %s" -#: fe-connect.c:2846 -msgid "requirepeer parameter is not supported on this platform\n" -msgstr "le paramètre requirepeer n'est pas supporté sur cette plateforme\n" +#: fe-connect.c:3278 +#, c-format +msgid "requirepeer parameter is not supported on this platform" +msgstr "le paramètre requirepeer n'est pas supporté sur cette plateforme" -#: fe-connect.c:2849 +#: fe-connect.c:3280 #, c-format -msgid "could not get peer credentials: %s\n" -msgstr "n'a pas pu obtenir l'authentification de l'autre : %s\n" +msgid "could not get peer credentials: %s" +msgstr "n'a pas pu obtenir l'authentification de l'autre : %s" -#: fe-connect.c:2863 +#: fe-connect.c:3293 #, c-format -msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" -msgstr "requirepeer indique « %s » mais le nom de l'utilisateur réel est « %s »\n" +msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"" +msgstr "requirepeer indique « %s » mais le nom de l'utilisateur réel est « %s »" -#: fe-connect.c:2905 +#: fe-connect.c:3331 #, c-format -msgid "could not send GSSAPI negotiation packet: %s\n" -msgstr "n'a pas pu transmettre le paquet de négociation GSSAPI : %s\n" +msgid "could not send GSSAPI negotiation packet: %s" +msgstr "n'a pas pu transmettre le paquet de négociation GSSAPI : %s" -#: fe-connect.c:2917 -msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)\n" -msgstr "le chiffrage avec GSSAPI était requis, mais impossible (potentiellement pas de cache, de support serveur ou de socket local)\n" +#: fe-connect.c:3380 +#, c-format +msgid "could not send SSL negotiation packet: %s" +msgstr "n'a pas pu transmettre le paquet de négociation SSL : %s" -#: fe-connect.c:2959 +#: fe-connect.c:3412 #, c-format -msgid "could not send SSL negotiation packet: %s\n" -msgstr "n'a pas pu transmettre le paquet de négociation SSL : %s\n" +msgid "could not send cancel packet: %s" +msgstr "n'a pas pu envoyer le paquet d'annulation : %s" -#: fe-connect.c:2990 +#: fe-connect.c:3442 #, c-format -msgid "could not send startup packet: %s\n" -msgstr "n'a pas pu transmettre le paquet de démarrage : %s\n" +msgid "could not send startup packet: %s" +msgstr "n'a pas pu transmettre le paquet de démarrage : %s" -#: fe-connect.c:3066 -msgid "server does not support SSL, but SSL was required\n" -msgstr "le serveur ne supporte pas SSL alors que SSL était réclamé\n" +#: fe-connect.c:3509 +msgid "server does not support SSL, but SSL was required" +msgstr "le serveur ne supporte pas SSL alors que SSL était réclamé" -#: fe-connect.c:3093 +#: fe-connect.c:3519 #, c-format -msgid "received invalid response to SSL negotiation: %c\n" -msgstr "a reçu une réponse invalide à la négociation SSL : %c\n" +msgid "server sent an error response during SSL exchange" +msgstr "le serveur a envoyé une erreur lors de l'échange SSL" -#: fe-connect.c:3114 -msgid "received unencrypted data after SSL response\n" -msgstr "a reçu des données non chiffrées après la réponse SSL\n" +#: fe-connect.c:3524 +#, c-format +msgid "received invalid response to SSL negotiation: %c" +msgstr "a reçu une réponse invalide à la négociation SSL : %c" -#: fe-connect.c:3195 -msgid "server doesn't support GSSAPI encryption, but it was required\n" -msgstr "le serveur ne supporte pas le chiffrage GSSAPI alors qu'il était réclamé\n" +#: fe-connect.c:3552 +#, c-format +msgid "received unencrypted data after SSL response" +msgstr "a reçu des données non chiffrées après la réponse SSL" -#: fe-connect.c:3207 +#: fe-connect.c:3615 #, c-format -msgid "received invalid response to GSSAPI negotiation: %c\n" -msgstr "a reçu une réponse invalide à la négociation GSSAPI : %c\n" +msgid "server sent an error response during GSS encryption exchange" +msgstr "le serveur a envoyé une erreur lors de l'échange de chiffrage GSS" -#: fe-connect.c:3226 -msgid "received unencrypted data after GSSAPI encryption response\n" -msgstr "a reçu des données non chiffrées après la réponse de chiffrement GSSAPI\n" +#: fe-connect.c:3629 +msgid "server doesn't support GSSAPI encryption, but it was required" +msgstr "le serveur ne supporte pas le chiffrage GSSAPI alors qu'il était réclamé" -#: fe-connect.c:3286 fe-connect.c:3311 +#: fe-connect.c:3633 #, c-format -msgid "expected authentication request from server, but received %c\n" -msgstr "" -"attendait une requête d'authentification en provenance du serveur, mais a\n" -" reçu %c\n" +msgid "received invalid response to GSSAPI negotiation: %c" +msgstr "a reçu une réponse invalide à la négociation GSSAPI : %c" + +#: fe-connect.c:3651 +#, c-format +msgid "received unencrypted data after GSSAPI encryption response" +msgstr "a reçu des données non chiffrées après la réponse de chiffrement GSSAPI" -#: fe-connect.c:3518 -msgid "unexpected message from server during startup\n" -msgstr "message inattendu du serveur lors du démarrage\n" +#: fe-connect.c:3711 +#, c-format +msgid "expected authentication request from server, but received %c" +msgstr "attendait une requête d'authentification du serveur, mais a reçu %c" -#: fe-connect.c:3610 -msgid "session is read-only\n" -msgstr "la session est en lecture seule\n" +#: fe-connect.c:3739 fe-connect.c:3862 +#, c-format +msgid "received invalid authentication request" +msgstr "méthode d'authentification invalide reçue" -#: fe-connect.c:3613 -msgid "session is not read-only\n" -msgstr "la session n'est pas en lecture seule\n" +#: fe-connect.c:3745 fe-connect.c:3847 +#, c-format +msgid "received invalid protocol negotiation message" +msgstr "a reçu un message invalide pour la négociation du protocole" -#: fe-connect.c:3667 -msgid "server is in hot standby mode\n" -msgstr "le serveur est dans le mode hot standby\n" +#: fe-connect.c:3764 fe-connect.c:3818 +#, c-format +msgid "received invalid error message" +msgstr "a reçu un message d'erreur invalide" -#: fe-connect.c:3670 -msgid "server is not in hot standby mode\n" -msgstr "le serveur n'est pas dans le mode hot standby\n" +#: fe-connect.c:3933 +#, c-format +msgid "unexpected message from server during startup" +msgstr "message inattendu du serveur lors du démarrage" -#: fe-connect.c:3788 fe-connect.c:3840 +#: fe-connect.c:4024 #, c-format -msgid "\"%s\" failed\n" -msgstr "échec de « %s »\n" +msgid "session is read-only" +msgstr "la session est en lecture seule" -#: fe-connect.c:3854 +#: fe-connect.c:4026 #, c-format -msgid "invalid connection state %d, probably indicative of memory corruption\n" -msgstr "" -"état de connexion invalide (%d), indiquant probablement une corruption de\n" -" mémoire\n" +msgid "session is not read-only" +msgstr "la session n'est pas en lecture seule" + +#: fe-connect.c:4079 +#, c-format +msgid "server is in hot standby mode" +msgstr "le serveur est dans le mode hot standby" + +#: fe-connect.c:4081 +#, c-format +msgid "server is not in hot standby mode" +msgstr "le serveur n'est pas dans le mode hot standby" + +#: fe-connect.c:4203 fe-connect.c:4253 +#, c-format +msgid "\"%s\" failed" +msgstr "échec de « %s »" + +#: fe-connect.c:4267 +#, c-format +msgid "invalid connection state %d, probably indicative of memory corruption" +msgstr "état de connexion invalide (%d), indiquant probablement une corruption de mémoire" -#: fe-connect.c:4837 +#: fe-connect.c:5086 #, c-format -msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" -msgstr "URL LDAP « %s » invalide : le schéma doit être ldap://\n" +msgid "invalid LDAP URL \"%s\": scheme must be ldap://" +msgstr "URL LDAP « %s » invalide : le schéma doit être ldap://" -#: fe-connect.c:4852 +#: fe-connect.c:5101 #, c-format -msgid "invalid LDAP URL \"%s\": missing distinguished name\n" -msgstr "URL LDAP « %s » invalide : le « distinguished name » manque\n" +msgid "invalid LDAP URL \"%s\": missing distinguished name" +msgstr "URL LDAP « %s » invalide : le « distinguished name » manque" -#: fe-connect.c:4864 fe-connect.c:4922 +#: fe-connect.c:5113 fe-connect.c:5171 #, c-format -msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" -msgstr "URL LDAP « %s » invalide : doit avoir exactement un attribut\n" +msgid "invalid LDAP URL \"%s\": must have exactly one attribute" +msgstr "URL LDAP « %s » invalide : doit avoir exactement un attribut" -#: fe-connect.c:4876 fe-connect.c:4938 +#: fe-connect.c:5125 fe-connect.c:5187 #, c-format -msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" -msgstr "URL LDAP « %s » invalide : doit avoir une échelle de recherche (base/un/sous)\n" +msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" +msgstr "URL LDAP « %s » invalide : doit avoir une échelle de recherche (base/un/sous)" -#: fe-connect.c:4888 +#: fe-connect.c:5137 #, c-format -msgid "invalid LDAP URL \"%s\": no filter\n" -msgstr "URL LDAP « %s » invalide : aucun filtre\n" +msgid "invalid LDAP URL \"%s\": no filter" +msgstr "URL LDAP « %s » invalide : aucun filtre" -#: fe-connect.c:4910 +#: fe-connect.c:5159 #, c-format -msgid "invalid LDAP URL \"%s\": invalid port number\n" -msgstr "URL LDAP « %s » invalide : numéro de port invalide\n" +msgid "invalid LDAP URL \"%s\": invalid port number" +msgstr "URL LDAP « %s » invalide : numéro de port invalide" -#: fe-connect.c:4948 -msgid "could not create LDAP structure\n" -msgstr "n'a pas pu créer la structure LDAP\n" +#: fe-connect.c:5196 +#, c-format +msgid "could not create LDAP structure" +msgstr "n'a pas pu créer la structure LDAP" -#: fe-connect.c:5024 +#: fe-connect.c:5271 #, c-format -msgid "lookup on LDAP server failed: %s\n" -msgstr "échec de la recherche sur le serveur LDAP : %s\n" +msgid "lookup on LDAP server failed: %s" +msgstr "échec de la recherche sur le serveur LDAP : %s" -#: fe-connect.c:5035 -msgid "more than one entry found on LDAP lookup\n" -msgstr "plusieurs entrées trouvées pendant la recherche LDAP\n" +#: fe-connect.c:5281 +#, c-format +msgid "more than one entry found on LDAP lookup" +msgstr "plusieurs entrées trouvées pendant la recherche LDAP" -#: fe-connect.c:5036 fe-connect.c:5048 -msgid "no entry found on LDAP lookup\n" -msgstr "aucune entrée trouvée pendant la recherche LDAP\n" +#: fe-connect.c:5283 fe-connect.c:5294 +#, c-format +msgid "no entry found on LDAP lookup" +msgstr "aucune entrée trouvée pendant la recherche LDAP" -#: fe-connect.c:5059 fe-connect.c:5072 -msgid "attribute has no values on LDAP lookup\n" -msgstr "l'attribut n'a pas de valeur après la recherche LDAP\n" +#: fe-connect.c:5304 fe-connect.c:5316 +#, c-format +msgid "attribute has no values on LDAP lookup" +msgstr "l'attribut n'a pas de valeur après la recherche LDAP" -#: fe-connect.c:5124 fe-connect.c:5143 fe-connect.c:5675 +#: fe-connect.c:5367 fe-connect.c:5386 fe-connect.c:5910 #, c-format -msgid "missing \"=\" after \"%s\" in connection info string\n" -msgstr "« = » manquant après « %s » dans la chaîne des paramètres de connexion\n" +msgid "missing \"=\" after \"%s\" in connection info string" +msgstr "« = » manquant après « %s » dans la chaîne des paramètres de connexion" -#: fe-connect.c:5216 fe-connect.c:5860 fe-connect.c:6636 +#: fe-connect.c:5457 fe-connect.c:6093 fe-connect.c:6891 #, c-format -msgid "invalid connection option \"%s\"\n" -msgstr "option de connexion « %s » invalide\n" +msgid "invalid connection option \"%s\"" +msgstr "option de connexion « %s » invalide" -#: fe-connect.c:5232 fe-connect.c:5724 -msgid "unterminated quoted string in connection info string\n" -msgstr "guillemets non refermés dans la chaîne des paramètres de connexion\n" +#: fe-connect.c:5472 fe-connect.c:5958 +#, c-format +msgid "unterminated quoted string in connection info string" +msgstr "guillemets non refermés dans la chaîne des paramètres de connexion" -#: fe-connect.c:5313 +#: fe-connect.c:5552 #, c-format -msgid "definition of service \"%s\" not found\n" -msgstr "définition du service « %s » introuvable\n" +msgid "definition of service \"%s\" not found" +msgstr "définition du service « %s » introuvable" -#: fe-connect.c:5339 +#: fe-connect.c:5578 #, c-format -msgid "service file \"%s\" not found\n" -msgstr "fichier de service « %s » introuvable\n" +msgid "service file \"%s\" not found" +msgstr "fichier de service « %s » introuvable" -#: fe-connect.c:5353 +#: fe-connect.c:5591 #, c-format -msgid "line %d too long in service file \"%s\"\n" -msgstr "ligne %d trop longue dans le fichier service « %s »\n" +msgid "line %d too long in service file \"%s\"" +msgstr "ligne %d trop longue dans le fichier service « %s »" -#: fe-connect.c:5424 fe-connect.c:5468 +#: fe-connect.c:5662 fe-connect.c:5705 #, c-format -msgid "syntax error in service file \"%s\", line %d\n" -msgstr "erreur de syntaxe dans le fichier service « %s », ligne %d\n" +msgid "syntax error in service file \"%s\", line %d" +msgstr "erreur de syntaxe dans le fichier service « %s », ligne %d" -#: fe-connect.c:5435 +#: fe-connect.c:5673 #, c-format -msgid "nested service specifications not supported in service file \"%s\", line %d\n" -msgstr "spécifications imbriquées de service non supportées dans le fichier service « %s », ligne %d\n" +msgid "nested service specifications not supported in service file \"%s\", line %d" +msgstr "spécifications imbriquées de service non supportées dans le fichier service « %s », ligne %d" -#: fe-connect.c:6156 +#: fe-connect.c:6412 #, c-format -msgid "invalid URI propagated to internal parser routine: \"%s\"\n" -msgstr "URI invalide propagée à la routine d'analyse interne : « %s »\n" +msgid "invalid URI propagated to internal parser routine: \"%s\"" +msgstr "URI invalide propagée à la routine d'analyse interne : « %s »" -#: fe-connect.c:6233 +#: fe-connect.c:6489 #, c-format -msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" +msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"" msgstr "" "fin de chaîne atteinte lors de la recherche du « ] » correspondant dans\n" -"l'adresse IPv6 de l'hôte indiquée dans l'URI : « %s »\n" +"l'adresse IPv6 de l'hôte indiquée dans l'URI : « %s »" -#: fe-connect.c:6240 +#: fe-connect.c:6496 #, c-format -msgid "IPv6 host address may not be empty in URI: \"%s\"\n" -msgstr "l'adresse IPv6 de l'hôte ne peut pas être vide dans l'URI : « %s »\n" +msgid "IPv6 host address may not be empty in URI: \"%s\"" +msgstr "l'adresse IPv6 de l'hôte ne peut pas être vide dans l'URI : « %s »" -#: fe-connect.c:6255 +#: fe-connect.c:6511 #, c-format -msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" -msgstr "" -"caractère « %c » inattendu à la position %d de l'URI (caractère « : » ou\n" -"« / » attendu) : « %s »\n" +msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"" +msgstr "caractère « %c » inattendu à la position %d de l'URI (caractère « : » ou « / » attendu) : « %s »" -#: fe-connect.c:6385 +#: fe-connect.c:6640 #, c-format -msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "séparateur « = » de clé/valeur en trop dans le paramètre de requête URI : « %s »\n" +msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "séparateur « = » de clé/valeur en trop dans le paramètre de requête URI : « %s »" -#: fe-connect.c:6405 +#: fe-connect.c:6660 #, c-format -msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "séparateur « = » de clé/valeur manquant dans le paramètre de requête URI : « %s »\n" +msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "séparateur « = » de clé/valeur manquant dans le paramètre de requête URI : « %s »" -#: fe-connect.c:6457 +#: fe-connect.c:6712 #, c-format -msgid "invalid URI query parameter: \"%s\"\n" -msgstr "paramètre de la requête URI invalide : « %s »\n" +msgid "invalid URI query parameter: \"%s\"" +msgstr "paramètre de la requête URI invalide : « %s »" -#: fe-connect.c:6531 +#: fe-connect.c:6786 #, c-format -msgid "invalid percent-encoded token: \"%s\"\n" -msgstr "jeton encodé en pourcentage invalide : « %s »\n" +msgid "invalid percent-encoded token: \"%s\"" +msgstr "jeton encodé en pourcentage invalide : « %s »" -#: fe-connect.c:6541 +#: fe-connect.c:6796 #, c-format -msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" -msgstr "valeur %%00 interdite dans la valeur codée en pourcentage : « %s »\n" +msgid "forbidden value %%00 in percent-encoded value: \"%s\"" +msgstr "valeur %%00 interdite dans la valeur codée en pourcentage : « %s »" -#: fe-connect.c:6911 +#: fe-connect.c:7160 msgid "connection pointer is NULL\n" msgstr "le pointeur de connexion est NULL\n" -#: fe-connect.c:7199 +#: fe-connect.c:7168 fe-exec.c:713 fe-exec.c:975 fe-exec.c:3459 +#: fe-protocol3.c:991 fe-protocol3.c:1024 +msgid "out of memory\n" +msgstr "mémoire épuisée\n" + +#: fe-connect.c:7459 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ATTENTION : le fichier de mots de passe « %s » n'est pas un fichier texte\n" -#: fe-connect.c:7208 +#: fe-connect.c:7468 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "" @@ -658,847 +822,730 @@ msgstr "" "lecture pour le groupe ou universel ; les droits devraient être u=rw (0600)\n" "ou inférieur\n" -#: fe-connect.c:7316 +#: fe-connect.c:7575 #, c-format -msgid "password retrieved from file \"%s\"\n" -msgstr "mot de passe récupéré dans le fichier « %s »\n" +msgid "password retrieved from file \"%s\"" +msgstr "mot de passe récupéré dans le fichier « %s »" -#: fe-exec.c:466 fe-exec.c:3392 +#: fe-connect.c:7727 +#, c-format +msgid "invalid integer value \"%s\" for connection option \"%s\"" +msgstr "valeur entière « %s » invalide pour l'option de connexion « %s »" + +#: fe-exec.c:469 fe-exec.c:3533 #, c-format msgid "row number %d is out of range 0..%d" msgstr "le numéro de ligne %d est en dehors des limites 0..%d" -#: fe-exec.c:528 fe-protocol3.c:1949 +#: fe-exec.c:531 fe-protocol3.c:1993 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:836 -msgid "write to server failed\n" -msgstr "échec en écriture vers le serveur\n" +#: fe-exec.c:834 +#, c-format +msgid "write to server failed" +msgstr "échec en écriture vers le serveur" -#: fe-exec.c:875 -msgid "no error text available\n" -msgstr "aucun texte d'erreur disponible\n" +#: fe-exec.c:874 +#, c-format +msgid "no error text available" +msgstr "aucun texte d'erreur disponible" -#: fe-exec.c:964 +#: fe-exec.c:963 msgid "NOTICE" msgstr "NOTICE" -#: fe-exec.c:1022 +#: fe-exec.c:1021 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult ne supporte pas plus de INT_MAX lignes" -#: fe-exec.c:1034 +#: fe-exec.c:1033 msgid "size_t overflow" msgstr "saturation de size_t" -#: fe-exec.c:1447 fe-exec.c:1552 fe-exec.c:1601 -msgid "command string is a null pointer\n" -msgstr "la chaîne de commande est un pointeur nul\n" +#: fe-exec.c:1438 fe-exec.c:1507 fe-exec.c:1553 +#, c-format +msgid "command string is a null pointer" +msgstr "la chaîne de commande est un pointeur nul" + +#: fe-exec.c:1444 fe-exec.c:3003 +#, c-format +msgid "%s not allowed in pipeline mode" +msgstr "%s non autorisé dans le mode pipeline" -#: fe-exec.c:1558 fe-exec.c:1607 fe-exec.c:1703 +#: fe-exec.c:1512 fe-exec.c:1558 fe-exec.c:1652 #, c-format -msgid "number of parameters must be between 0 and %d\n" -msgstr "le nombre de paramètres doit être compris entre 0 et %d\n" +msgid "number of parameters must be between 0 and %d" +msgstr "le nombre de paramètres doit être compris entre 0 et %d" -#: fe-exec.c:1595 fe-exec.c:1697 -msgid "statement name is a null pointer\n" -msgstr "le nom de l'instruction est un pointeur nul\n" +#: fe-exec.c:1548 fe-exec.c:1647 +#, c-format +msgid "statement name is a null pointer" +msgstr "le nom de l'instruction est un pointeur nul" -#: fe-exec.c:1741 fe-exec.c:3245 -msgid "no connection to the server\n" -msgstr "aucune connexion au serveur\n" +#: fe-exec.c:1689 fe-exec.c:3379 +#, c-format +msgid "no connection to the server" +msgstr "aucune connexion au serveur" -#: fe-exec.c:1750 fe-exec.c:3254 -msgid "another command is already in progress\n" -msgstr "une autre commande est déjà en cours\n" +#: fe-exec.c:1697 fe-exec.c:3387 +#, c-format +msgid "another command is already in progress" +msgstr "une autre commande est déjà en cours" -#: fe-exec.c:1779 -msgid "cannot queue commands during COPY\n" -msgstr "ne peut pas mettre en queue les commandes lors du COPY\n" +#: fe-exec.c:1727 +#, c-format +msgid "cannot queue commands during COPY" +msgstr "ne peut pas mettre en queue les commandes lors du COPY" -#: fe-exec.c:1897 -msgid "length must be given for binary parameter\n" -msgstr "la longueur doit être indiquée pour les paramètres binaires\n" +#: fe-exec.c:1846 +#, c-format +msgid "length must be given for binary parameter" +msgstr "la longueur doit être indiquée pour les paramètres binaires" -#: fe-exec.c:2215 +#: fe-exec.c:2205 #, c-format -msgid "unexpected asyncStatus: %d\n" -msgstr "asyncStatus inattendu : %d\n" +msgid "unexpected asyncStatus: %d" +msgstr "asyncStatus inattendu : %d" -#: fe-exec.c:2373 -msgid "synchronous command execution functions are not allowed in pipeline mode\n" -msgstr "les fonctions d'exécution de commande synchrone ne sont pas autorisées en mode pipeline\n" +#: fe-exec.c:2361 +#, c-format +msgid "synchronous command execution functions are not allowed in pipeline mode" +msgstr "les fonctions d'exécution de commande synchrone ne sont pas autorisées en mode pipeline" -#: fe-exec.c:2390 +#: fe-exec.c:2378 msgid "COPY terminated by new PQexec" msgstr "COPY terminé par un nouveau PQexec" -#: fe-exec.c:2407 -msgid "PQexec not allowed during COPY BOTH\n" -msgstr "PQexec non autorisé pendant COPY BOTH\n" +#: fe-exec.c:2394 +#, c-format +msgid "PQexec not allowed during COPY BOTH" +msgstr "PQexec non autorisé pendant COPY BOTH" -#: fe-exec.c:2635 fe-exec.c:2691 fe-exec.c:2760 fe-protocol3.c:1880 -msgid "no COPY in progress\n" -msgstr "aucun COPY en cours\n" +#: fe-exec.c:2630 +#, c-format +msgid "unrecognized message type \"%c\"" +msgstr "type de message « %c » non reconnu" -#: fe-exec.c:2940 -msgid "PQfn not allowed in pipeline mode\n" -msgstr "PQfn non autorisé dans le mode pipeline\n" +#: fe-exec.c:2702 fe-exec.c:2756 fe-exec.c:2824 fe-protocol3.c:1924 +#, c-format +msgid "no COPY in progress" +msgstr "aucun COPY en cours" -#: fe-exec.c:2948 -msgid "connection in wrong state\n" -msgstr "connexion dans un état erroné\n" +#: fe-exec.c:3010 +#, c-format +msgid "connection in wrong state" +msgstr "connexion dans un état erroné" + +#: fe-exec.c:3053 +#, c-format +msgid "cannot enter pipeline mode, connection not idle" +msgstr "ne peut pas entrer dans le mode pipeline, connexion active" -#: fe-exec.c:2992 -msgid "cannot enter pipeline mode, connection not idle\n" -msgstr "ne peut pas entrer dans le mode pipeline, connexion active\n" +#: fe-exec.c:3089 fe-exec.c:3110 +#, c-format +msgid "cannot exit pipeline mode with uncollected results" +msgstr "ne peut pas sortir du mode pipeline avec des résultats non récupérés" -#: fe-exec.c:3026 fe-exec.c:3043 -msgid "cannot exit pipeline mode with uncollected results\n" -msgstr "ne peut pas sortir du mode pipeline avec des résultats non récupérés\n" +#: fe-exec.c:3093 +#, c-format +msgid "cannot exit pipeline mode while busy" +msgstr "ne peut pas sortir du mode pipeline alors qu'il est occupé" -#: fe-exec.c:3031 -msgid "cannot exit pipeline mode while busy\n" -msgstr "ne peut pas sortir du mode pipeline alors qu'il est occupé\n" +#: fe-exec.c:3104 +#, c-format +msgid "cannot exit pipeline mode while in COPY" +msgstr "ne peut pas sortir du mode pipeline pendant un COPY" -#: fe-exec.c:3179 -msgid "cannot send pipeline when not in pipeline mode\n" -msgstr "ne peut pas envoyer le pipeline lorsqu'il n'est pas en mode pipeline\n" +#: fe-exec.c:3303 +#, c-format +msgid "cannot send pipeline when not in pipeline mode" +msgstr "ne peut pas envoyer le pipeline lorsqu'il n'est pas en mode pipeline" -#: fe-exec.c:3281 +#: fe-exec.c:3422 msgid "invalid ExecStatusType code" msgstr "code ExecStatusType invalide" -#: fe-exec.c:3308 +#: fe-exec.c:3449 msgid "PGresult is not an error result\n" msgstr "PGresult n'est pas un résultat d'erreur\n" -#: fe-exec.c:3376 fe-exec.c:3399 +#: fe-exec.c:3517 fe-exec.c:3540 #, c-format msgid "column number %d is out of range 0..%d" msgstr "le numéro de colonne %d est en dehors des limites 0..%d" -#: fe-exec.c:3414 +#: fe-exec.c:3555 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "le numéro de paramètre %d est en dehors des limites 0..%d" -#: fe-exec.c:3725 +#: fe-exec.c:3866 #, c-format msgid "could not interpret result from server: %s" msgstr "n'a pas pu interpréter la réponse du serveur : %s" -#: fe-exec.c:3987 fe-exec.c:4078 -msgid "incomplete multibyte character\n" -msgstr "caractère multi-octet incomplet\n" +#: fe-exec.c:4140 fe-exec.c:4253 +#, c-format +msgid "incomplete multibyte character" +msgstr "caractère multi-octet incomplet" + +#: fe-exec.c:4142 fe-exec.c:4272 +#, c-format +msgid "invalid multibyte character" +msgstr "caractère multi-octets invalide" -#: fe-gssapi-common.c:124 +#: fe-gssapi-common.c:122 msgid "GSSAPI name import error" msgstr "erreur d'import du nom GSSAPI" -#: fe-lobj.c:145 fe-lobj.c:210 fe-lobj.c:403 fe-lobj.c:494 fe-lobj.c:568 -#: fe-lobj.c:972 fe-lobj.c:980 fe-lobj.c:988 fe-lobj.c:996 fe-lobj.c:1004 -#: fe-lobj.c:1012 fe-lobj.c:1020 fe-lobj.c:1028 +#: fe-lobj.c:144 fe-lobj.c:207 fe-lobj.c:397 fe-lobj.c:487 fe-lobj.c:560 +#: fe-lobj.c:956 fe-lobj.c:963 fe-lobj.c:970 fe-lobj.c:977 fe-lobj.c:984 +#: fe-lobj.c:991 fe-lobj.c:998 fe-lobj.c:1005 #, c-format -msgid "cannot determine OID of function %s\n" -msgstr "ne peut pas déterminer l'OID de la fonction %s\n" +msgid "cannot determine OID of function %s" +msgstr "ne peut pas déterminer l'OID de la fonction %s" -#: fe-lobj.c:162 -msgid "argument of lo_truncate exceeds integer range\n" -msgstr "l'argument de lo_truncate dépasse l'échelle des entiers\n" +#: fe-lobj.c:160 +#, c-format +msgid "argument of lo_truncate exceeds integer range" +msgstr "l'argument de lo_truncate dépasse l'échelle des entiers" -#: fe-lobj.c:266 -msgid "argument of lo_read exceeds integer range\n" -msgstr "l'argument de lo_read dépasse l'échelle des entiers\n" +#: fe-lobj.c:262 +#, c-format +msgid "argument of lo_read exceeds integer range" +msgstr "l'argument de lo_read dépasse l'échelle des entiers" -#: fe-lobj.c:318 -msgid "argument of lo_write exceeds integer range\n" -msgstr "l'argument de lo_write dépasse l'échelle des entiers\n" +#: fe-lobj.c:313 +#, c-format +msgid "argument of lo_write exceeds integer range" +msgstr "l'argument de lo_write dépasse l'échelle des entiers" -#: fe-lobj.c:678 fe-lobj.c:791 +#: fe-lobj.c:669 fe-lobj.c:780 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "n'a pas pu ouvrir le fichier « %s » : %s\n" +msgid "could not open file \"%s\": %s" +msgstr "n'a pas pu ouvrir le fichier « %s » : %s" -#: fe-lobj.c:735 +#: fe-lobj.c:725 #, c-format -msgid "could not read from file \"%s\": %s\n" -msgstr "n'a pas pu lire le fichier « %s » : %s\n" +msgid "could not read from file \"%s\": %s" +msgstr "n'a pas pu lire le fichier « %s » : %s" -#: fe-lobj.c:813 fe-lobj.c:837 +#: fe-lobj.c:801 fe-lobj.c:824 #, c-format -msgid "could not write to file \"%s\": %s\n" -msgstr "n'a pas pu écrire dans le fichier « %s » : %s\n" +msgid "could not write to file \"%s\": %s" +msgstr "n'a pas pu écrire dans le fichier « %s » : %s" -#: fe-lobj.c:923 -msgid "query to initialize large object functions did not return data\n" -msgstr "" -"la requête d'initialisation des fonctions pour « Larges Objects » ne renvoie\n" -"pas de données\n" +#: fe-lobj.c:908 +#, c-format +msgid "query to initialize large object functions did not return data" +msgstr "la requête d'initialisation des fonctions pour « Larges Objects » ne renvoie pas de données" -#: fe-misc.c:242 +#: fe-misc.c:239 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "entier de taille %lu non supporté par pqGetInt" -#: fe-misc.c:275 +#: fe-misc.c:272 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "entier de taille %lu non supporté par pqPutInt" -#: fe-misc.c:576 fe-misc.c:822 -msgid "connection not open\n" -msgstr "la connexion n'est pas active\n" - -#: fe-misc.c:755 fe-secure-openssl.c:218 fe-secure-openssl.c:325 -#: fe-secure.c:260 fe-secure.c:423 +#: fe-misc.c:750 fe-secure-openssl.c:203 fe-secure-openssl.c:309 +#: fe-secure.c:237 fe-secure.c:404 #, c-format msgid "" "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" -"\tbefore or while processing the request.\n" +"\tbefore or while processing the request." msgstr "" "la connexion au serveur a été coupée de façon inattendue\n" "\tLe serveur s'est peut-être arrêté anormalement avant ou durant le\n" -"\ttraitement de la requête.\n" +"\ttraitement de la requête." + +#: fe-misc.c:817 +msgid "connection not open\n" +msgstr "la connexion n'est pas active\n" -#: fe-misc.c:1008 -msgid "timeout expired\n" -msgstr "le délai est dépassé\n" +#: fe-misc.c:1005 +#, c-format +msgid "timeout expired" +msgstr "le délai est dépassé" -#: fe-misc.c:1053 -msgid "invalid socket\n" -msgstr "socket invalide\n" +#: fe-misc.c:1049 +#, c-format +msgid "invalid socket" +msgstr "socket invalide" -#: fe-misc.c:1076 +#: fe-misc.c:1071 #, c-format -msgid "%s() failed: %s\n" -msgstr "échec de %s() : %s\n" +msgid "%s() failed: %s" +msgstr "échec de %s() : %s" -#: fe-protocol3.c:196 +#: fe-protocol3.c:187 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "le message de type 0x%02x est arrivé alors que le serveur était en attente" -#: fe-protocol3.c:405 -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" +#: fe-protocol3.c:402 +#, c-format +msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" msgstr "" "le serveur a envoyé des données (message « D ») sans description préalable\n" -"de la ligne (message « T »)\n" +"de la ligne (message « T »)" -#: fe-protocol3.c:448 +#: fe-protocol3.c:444 #, c-format -msgid "unexpected response from server; first received character was \"%c\"\n" -msgstr "réponse inattendue du serveur, le premier caractère reçu étant « %c »\n" +msgid "unexpected response from server; first received character was \"%c\"" +msgstr "réponse inattendue du serveur, le premier caractère reçu étant « %c »" -#: fe-protocol3.c:473 +#: fe-protocol3.c:467 #, c-format -msgid "message contents do not agree with length in message type \"%c\"\n" -msgstr "" -"le contenu du message ne correspond pas avec la longueur du type de message\n" -"« %c »\n" +msgid "message contents do not agree with length in message type \"%c\"" +msgstr "le contenu du message ne correspond pas avec la longueur du type de message « %c »" -#: fe-protocol3.c:493 +#: fe-protocol3.c:485 #, c-format -msgid "lost synchronization with server: got message type \"%c\", length %d\n" -msgstr "" -"synchronisation perdue avec le serveur : a reçu le type de message « %c »,\n" -"longueur %d\n" +msgid "lost synchronization with server: got message type \"%c\", length %d" +msgstr "synchronisation perdue avec le serveur : a reçu le type de message « %c », longueur %d" -#: fe-protocol3.c:545 fe-protocol3.c:585 +#: fe-protocol3.c:537 fe-protocol3.c:577 msgid "insufficient data in \"T\" message" msgstr "données insuffisantes dans le message « T »" -#: fe-protocol3.c:656 fe-protocol3.c:862 +#: fe-protocol3.c:648 fe-protocol3.c:854 msgid "out of memory for query result" msgstr "mémoire épuisée pour le résultat de la requête" -#: fe-protocol3.c:725 +#: fe-protocol3.c:717 msgid "insufficient data in \"t\" message" msgstr "données insuffisantes dans le message « t »" -#: fe-protocol3.c:784 fe-protocol3.c:816 fe-protocol3.c:834 +#: fe-protocol3.c:776 fe-protocol3.c:808 fe-protocol3.c:826 msgid "insufficient data in \"D\" message" msgstr "données insuffisantes dans le message « D »" -#: fe-protocol3.c:790 +#: fe-protocol3.c:782 msgid "unexpected field count in \"D\" message" msgstr "nombre de champs inattendu dans le message « D »" -#: fe-protocol3.c:1046 +#: fe-protocol3.c:1037 msgid "no error message available\n" msgstr "aucun message d'erreur disponible\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1094 fe-protocol3.c:1113 +#: fe-protocol3.c:1085 fe-protocol3.c:1104 #, c-format msgid " at character %s" msgstr " au caractère %s" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1117 #, c-format msgid "DETAIL: %s\n" msgstr "DÉTAIL : %s\n" -#: fe-protocol3.c:1129 +#: fe-protocol3.c:1120 #, c-format msgid "HINT: %s\n" msgstr "ASTUCE : %s\n" -#: fe-protocol3.c:1132 +#: fe-protocol3.c:1123 #, c-format msgid "QUERY: %s\n" msgstr "REQUÊTE : %s\n" -#: fe-protocol3.c:1139 +#: fe-protocol3.c:1130 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXTE : %s\n" -#: fe-protocol3.c:1148 +#: fe-protocol3.c:1139 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "NOM DE SCHÉMA : %s\n" -#: fe-protocol3.c:1152 +#: fe-protocol3.c:1143 #, c-format msgid "TABLE NAME: %s\n" msgstr "NOM DE TABLE : %s\n" -#: fe-protocol3.c:1156 +#: fe-protocol3.c:1147 #, c-format msgid "COLUMN NAME: %s\n" msgstr "NOM DE COLONNE : %s\n" -#: fe-protocol3.c:1160 +#: fe-protocol3.c:1151 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "NOM DU TYPE DE DONNÉES : %s\n" -#: fe-protocol3.c:1164 +#: fe-protocol3.c:1155 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "NOM DE CONTRAINTE : %s\n" -#: fe-protocol3.c:1176 +#: fe-protocol3.c:1167 msgid "LOCATION: " msgstr "EMPLACEMENT : " -#: fe-protocol3.c:1178 +#: fe-protocol3.c:1169 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1180 +#: fe-protocol3.c:1171 #, c-format msgid "%s:%s" msgstr "%s : %s" -#: fe-protocol3.c:1375 +#: fe-protocol3.c:1366 #, c-format msgid "LINE %d: " msgstr "LIGNE %d : " -#: fe-protocol3.c:1774 -msgid "PQgetline: not doing text COPY OUT\n" -msgstr "PQgetline : ne va pas réaliser un COPY OUT au format texte\n" +#: fe-protocol3.c:1440 +#, c-format +msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u" +msgstr "version du protocole non supportée par le serveur : le client utilise %u.%u, le serveur supporte jusqu'à %u.%u" + +#: fe-protocol3.c:1446 +#, c-format +msgid "protocol extension not supported by server: %s" +msgid_plural "protocol extensions not supported by server: %s" +msgstr[0] "extension du protocole non supportée par le serveur : %s" +msgstr[1] "extensions du protocole non supportées par le serveur : %s" + +#: fe-protocol3.c:1454 +#, c-format +msgid "invalid %s message" +msgstr "message %s invalide" + +#: fe-protocol3.c:1819 +#, c-format +msgid "PQgetline: not doing text COPY OUT" +msgstr "PQgetline : ne va pas réaliser un COPY OUT au format texte" -#: fe-protocol3.c:2151 -msgid "protocol error: no function result\n" -msgstr "erreur de protocole : aucun résultat de fonction\n" +#: fe-protocol3.c:2193 +#, c-format +msgid "protocol error: no function result" +msgstr "erreur de protocole : aucun résultat de fonction" -#: fe-protocol3.c:2163 +#: fe-protocol3.c:2204 #, c-format -msgid "protocol error: id=0x%x\n" -msgstr "erreur de protocole : id=0x%x\n" +msgid "protocol error: id=0x%x" +msgstr "erreur de protocole : id=0x%x" -#: fe-secure-common.c:126 -msgid "SSL certificate's name contains embedded null\n" -msgstr "le nom du certificat SSL contient des NULL\n" +#: fe-secure-common.c:123 +#, c-format +msgid "SSL certificate's name contains embedded null" +msgstr "le nom du certificat SSL contient des NULL" -#: fe-secure-common.c:233 +#: fe-secure-common.c:228 #, c-format -msgid "certificate contains IP address with invalid length %lu\n" -msgstr "le certificat contient une adresse IP de longueur invalide %lu\n" +msgid "certificate contains IP address with invalid length %zu" +msgstr "le certificat contient une adresse IP de longueur invalide %zu" -#: fe-secure-common.c:243 +#: fe-secure-common.c:237 #, c-format -msgid "could not convert certificate's IP address to string: %s\n" -msgstr "n'a pas pu convertir l'adresse IP du certificat en chaîne de caractères : %s\n" +msgid "could not convert certificate's IP address to string: %s" +msgstr "n'a pas pu convertir l'adresse IP du certificat en chaîne de caractères : %s" -#: fe-secure-common.c:276 -msgid "host name must be specified for a verified SSL connection\n" -msgstr "le nom d'hôte doit être précisé pour une connexion SSL vérifiée\n" +#: fe-secure-common.c:269 +#, c-format +msgid "host name must be specified for a verified SSL connection" +msgstr "le nom d'hôte doit être précisé pour une connexion SSL vérifiée" -#: fe-secure-common.c:301 +#: fe-secure-common.c:286 #, c-format -msgid "server certificate for \"%s\" does not match host name \"%s\"\n" -msgstr "le certificat serveur pour « %s » ne correspond pas au nom d'hôte « %s »\n" +msgid "server certificate for \"%s\" (and %d other name) does not match host name \"%s\"" +msgid_plural "server certificate for \"%s\" (and %d other names) does not match host name \"%s\"" +msgstr[0] "le certificat serveur pour « %s » (et %d autre nom) ne correspond pas au nom d'hôte « %s »" +msgstr[1] "le certificat serveur pour « %s » (et %d autres noms) ne correspond pas au nom d'hôte « %s »" -#: fe-secure-common.c:307 -msgid "could not get server's host name from server certificate\n" -msgstr "n'a pas pu récupérer le nom d'hôte du serveur à partir du certificat serveur\n" +#: fe-secure-common.c:294 +#, c-format +msgid "server certificate for \"%s\" does not match host name \"%s\"" +msgstr "le certificat serveur pour « %s » ne correspond pas au nom d'hôte « %s »" -#: fe-secure-gssapi.c:201 +#: fe-secure-common.c:299 +#, c-format +msgid "could not get server's host name from server certificate" +msgstr "n'a pas pu récupérer le nom d'hôte du serveur à partir du certificat serveur" + +#: fe-secure-gssapi.c:194 msgid "GSSAPI wrap error" msgstr "erreur d'emballage GSSAPI" -#: fe-secure-gssapi.c:209 -msgid "outgoing GSSAPI message would not use confidentiality\n" -msgstr "le message sortant GSSAPI n'utiliserait pas la confidentialité\n" +#: fe-secure-gssapi.c:201 +#, c-format +msgid "outgoing GSSAPI message would not use confidentiality" +msgstr "le message sortant GSSAPI n'utiliserait pas la confidentialité" -#: fe-secure-gssapi.c:217 +#: fe-secure-gssapi.c:208 #, c-format -msgid "client tried to send oversize GSSAPI packet (%zu > %zu)\n" -msgstr "le client a essayé d'envoyer un paquet GSSAPI trop gros (%zu > %zu)\n" +msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" +msgstr "le client a essayé d'envoyer un paquet GSSAPI trop gros (%zu > %zu)" -#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:596 +#: fe-secure-gssapi.c:347 fe-secure-gssapi.c:589 #, c-format -msgid "oversize GSSAPI packet sent by the server (%zu > %zu)\n" -msgstr "paquet GSSAPI trop gros envoyé par le serveur (%zu > %zu)\n" +msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" +msgstr "paquet GSSAPI trop gros envoyé par le serveur (%zu > %zu)" -#: fe-secure-gssapi.c:393 +#: fe-secure-gssapi.c:386 msgid "GSSAPI unwrap error" msgstr "erreur de dépaquetage GSSAPI" -#: fe-secure-gssapi.c:403 -msgid "incoming GSSAPI message did not use confidentiality\n" -msgstr "le message entrant GSSAPI n'a pas utilisé pas la confidentialité\n" +#: fe-secure-gssapi.c:395 +#, c-format +msgid "incoming GSSAPI message did not use confidentiality" +msgstr "le message entrant GSSAPI n'a pas utilisé la confidentialité" -#: fe-secure-gssapi.c:642 +#: fe-secure-gssapi.c:652 msgid "could not initiate GSSAPI security context" msgstr "n'a pas pu initier le contexte de sécurité GSSAPI" -#: fe-secure-gssapi.c:670 +#: fe-secure-gssapi.c:681 msgid "GSSAPI size check error" msgstr "erreur de vérification de la taille GSSAPI" -#: fe-secure-gssapi.c:681 +#: fe-secure-gssapi.c:692 msgid "GSSAPI context establishment error" msgstr "erreur d'établissement du contexte GSSAPI" -#: fe-secure-openssl.c:223 fe-secure-openssl.c:330 fe-secure-openssl.c:1499 +#: fe-secure-openssl.c:207 fe-secure-openssl.c:313 fe-secure-openssl.c:1524 +#, c-format +msgid "SSL SYSCALL error: %s" +msgstr "erreur SYSCALL SSL : %s" + +#: fe-secure-openssl.c:213 fe-secure-openssl.c:319 fe-secure-openssl.c:1527 #, c-format -msgid "SSL SYSCALL error: %s\n" -msgstr "erreur SYSCALL SSL : %s\n" +msgid "SSL SYSCALL error: EOF detected" +msgstr "erreur SYSCALL SSL : EOF détecté" -#: fe-secure-openssl.c:230 fe-secure-openssl.c:337 fe-secure-openssl.c:1503 -msgid "SSL SYSCALL error: EOF detected\n" -msgstr "erreur SYSCALL SSL : EOF détecté\n" +#: fe-secure-openssl.c:223 fe-secure-openssl.c:329 fe-secure-openssl.c:1535 +#, c-format +msgid "SSL error: %s" +msgstr "erreur SSL : %s" -#: fe-secure-openssl.c:241 fe-secure-openssl.c:348 fe-secure-openssl.c:1512 +#: fe-secure-openssl.c:237 fe-secure-openssl.c:343 #, c-format -msgid "SSL error: %s\n" -msgstr "erreur SSL : %s\n" +msgid "SSL connection has been closed unexpectedly" +msgstr "la connexion SSL a été fermée de façon inattendu" -#: fe-secure-openssl.c:256 fe-secure-openssl.c:363 -msgid "SSL connection has been closed unexpectedly\n" -msgstr "la connexion SSL a été fermée de façon inattendu\n" +#: fe-secure-openssl.c:242 fe-secure-openssl.c:348 fe-secure-openssl.c:1582 +#, c-format +msgid "unrecognized SSL error code: %d" +msgstr "code d'erreur SSL inconnu : %d" -#: fe-secure-openssl.c:262 fe-secure-openssl.c:369 fe-secure-openssl.c:1562 +#: fe-secure-openssl.c:390 #, c-format -msgid "unrecognized SSL error code: %d\n" -msgstr "code d'erreur SSL inconnu : %d\n" +msgid "could not determine server certificate signature algorithm" +msgstr "n'a pas pu déterminer l'algorithme de signature du certificat serveur" -#: fe-secure-openssl.c:409 -msgid "could not determine server certificate signature algorithm\n" -msgstr "n'a pas pu déterminer l'algorithme de signature du certificat serveur\n" +#: fe-secure-openssl.c:410 +#, c-format +msgid "could not find digest for NID %s" +msgstr "n'a pas pu trouver l'entrée pour le NID %s" -#: fe-secure-openssl.c:430 +#: fe-secure-openssl.c:419 #, c-format -msgid "could not find digest for NID %s\n" -msgstr "n'a pas pu trouver l'entrée pour le NID %s\n" +msgid "could not generate peer certificate hash" +msgstr "n'a pas pu générer le hachage du certificat peer" -#: fe-secure-openssl.c:440 -msgid "could not generate peer certificate hash\n" -msgstr "n'a pas pu générer le hachage du certificat peer\n" +#: fe-secure-openssl.c:501 +#, c-format +msgid "SSL certificate's name entry is missing" +msgstr "l'entrée du nom du certificat SSL est manquante" -#: fe-secure-openssl.c:497 -msgid "SSL certificate's name entry is missing\n" -msgstr "l'entrée du nom du certificat SSL est manquante\n" +#: fe-secure-openssl.c:535 +#, c-format +msgid "SSL certificate's address entry is missing" +msgstr "l'entrée d'adresse du certificat SSL est manquante" -#: fe-secure-openssl.c:532 -msgid "SSL certificate's address entry is missing\n" -msgstr "l'entrée d'adresse du certificat SSL est manquante\n" +#: fe-secure-openssl.c:935 +#, c-format +msgid "could not create SSL context: %s" +msgstr "n'a pas pu créer le contexte SSL : %s" -#: fe-secure-openssl.c:950 +#: fe-secure-openssl.c:977 #, c-format -msgid "could not create SSL context: %s\n" -msgstr "n'a pas pu créer le contexte SSL : %s\n" +msgid "invalid value \"%s\" for minimum SSL protocol version" +msgstr "valeur « %s » invalide pour la version minimale du protocole SSL" -#: fe-secure-openssl.c:989 +#: fe-secure-openssl.c:987 #, c-format -msgid "invalid value \"%s\" for minimum SSL protocol version\n" -msgstr "valeur « %s » invalide pour la version minimale du protocole SSL\n" +msgid "could not set minimum SSL protocol version: %s" +msgstr "n'a pas pu configurer la version minimale de protocole SSL : %s" -#: fe-secure-openssl.c:1000 +#: fe-secure-openssl.c:1003 #, c-format -msgid "could not set minimum SSL protocol version: %s\n" -msgstr "n'a pas pu configurer la version minimale de protocole SSL : %s\n" +msgid "invalid value \"%s\" for maximum SSL protocol version" +msgstr "valeur « %s » invalide pour la version maximale du protocole SSL" -#: fe-secure-openssl.c:1018 +#: fe-secure-openssl.c:1013 #, c-format -msgid "invalid value \"%s\" for maximum SSL protocol version\n" -msgstr "valeur « %s » invalide pour la version maximale du protocole SSL\n" +msgid "could not set maximum SSL protocol version: %s" +msgstr "n'a pas pu configurer la version maximale de protocole SSL : %s" -#: fe-secure-openssl.c:1029 +#: fe-secure-openssl.c:1051 #, c-format -msgid "could not set maximum SSL protocol version: %s\n" -msgstr "n'a pas pu configurer la version maximale de protocole SSL : %s\n" +msgid "could not load system root certificate paths: %s" +msgstr "n'a pas pu charger les chemins du certificat racine système : %s" -#: fe-secure-openssl.c:1065 +#: fe-secure-openssl.c:1068 #, c-format -msgid "could not read root certificate file \"%s\": %s\n" -msgstr "n'a pas pu lire le certificat racine « %s » : %s\n" +msgid "could not read root certificate file \"%s\": %s" +msgstr "n'a pas pu lire le certificat racine « %s » : %s" -#: fe-secure-openssl.c:1118 +#: fe-secure-openssl.c:1120 +#, c-format msgid "" "could not get home directory to locate root certificate file\n" -"Either provide the file or change sslmode to disable server certificate verification.\n" +"Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." msgstr "" "n'a pas pu obtenir le répertoire personnel pour situer le fichier de certificat racine.\n" -"Fournissez le fichier ou modifiez sslmode pour désactiver la vérification du\n" -"certificat par le serveur.\n" +"Fournissez le fichier, utilisez les racines de confiance du système avec sslrootcert=system, ou modifiez sslmode pour désactiver la vérification du certificat par le serveur." -#: fe-secure-openssl.c:1122 +#: fe-secure-openssl.c:1123 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" -"Either provide the file or change sslmode to disable server certificate verification.\n" +"Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." msgstr "" "le fichier de certificat racine « %s » n'existe pas.\n" -"Fournissez le fichier ou modifiez sslmode pour désactiver la vérification du\n" -"certificat par le serveur.\n" +"Fournissez le fichier, utilisez les racines de confiance du système avec sslrootcert=system, ou modifiez sslmode pour désactiver la vérification du certificat par le serveur." -#: fe-secure-openssl.c:1153 +#: fe-secure-openssl.c:1158 #, c-format -msgid "could not open certificate file \"%s\": %s\n" -msgstr "n'a pas pu ouvrir le certificat « %s » : %s\n" +msgid "could not open certificate file \"%s\": %s" +msgstr "n'a pas pu ouvrir le certificat « %s » : %s" -#: fe-secure-openssl.c:1172 +#: fe-secure-openssl.c:1176 #, c-format -msgid "could not read certificate file \"%s\": %s\n" -msgstr "n'a pas pu lire le certificat « %s » : %s\n" +msgid "could not read certificate file \"%s\": %s" +msgstr "n'a pas pu lire le certificat « %s » : %s" -#: fe-secure-openssl.c:1197 +#: fe-secure-openssl.c:1200 #, c-format -msgid "could not establish SSL connection: %s\n" -msgstr "n'a pas pu établir la connexion SSL : %s\n" +msgid "could not establish SSL connection: %s" +msgstr "n'a pas pu établir la connexion SSL : %s" -#: fe-secure-openssl.c:1231 +#: fe-secure-openssl.c:1232 #, c-format -msgid "could not set SSL Server Name Indication (SNI): %s\n" -msgstr "n'a pas pu configurer le SSL Server Name Indication (SNI) : %s\n" +msgid "could not set SSL Server Name Indication (SNI): %s" +msgstr "n'a pas pu configurer le SSL Server Name Indication (SNI) : %s" -#: fe-secure-openssl.c:1277 +#: fe-secure-openssl.c:1249 #, c-format -msgid "could not load SSL engine \"%s\": %s\n" -msgstr "n'a pas pu charger le moteur SSL « %s » : %s\n" +msgid "could not set SSL ALPN extension: %s" +msgstr "n'a pas pu configurer l'extension ALPN de SSL : %s" -#: fe-secure-openssl.c:1289 +#: fe-secure-openssl.c:1292 #, c-format -msgid "could not initialize SSL engine \"%s\": %s\n" -msgstr "n'a pas pu initialiser le moteur SSL « %s » : %s\n" +msgid "could not load SSL engine \"%s\": %s" +msgstr "n'a pas pu charger le moteur SSL « %s » : %s" -#: fe-secure-openssl.c:1305 +#: fe-secure-openssl.c:1303 #, c-format -msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "n'a pas pu lire la clé privée SSL « %s » à partir du moteur « %s » : %s\n" +msgid "could not initialize SSL engine \"%s\": %s" +msgstr "n'a pas pu initialiser le moteur SSL « %s » : %s" -#: fe-secure-openssl.c:1319 +#: fe-secure-openssl.c:1318 #, c-format -msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "n'a pas pu charger la clé privée SSL « %s » à partir du moteur « %s » : %s\n" +msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" +msgstr "n'a pas pu lire la clé privée SSL « %s » à partir du moteur « %s » : %s" -#: fe-secure-openssl.c:1357 +#: fe-secure-openssl.c:1331 #, c-format -msgid "certificate present, but not private key file \"%s\"\n" -msgstr "le certificat est présent, mais la clé privée « %s » est absente\n" +msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" +msgstr "n'a pas pu charger la clé privée SSL « %s » à partir du moteur « %s » : %s" -#: fe-secure-openssl.c:1361 +#: fe-secure-openssl.c:1368 #, c-format -msgid "could not stat private key file \"%s\": %m\n" -msgstr "n'a pas pu interroger le fichier de clé privée « %s » : %m\n" +msgid "certificate present, but not private key file \"%s\"" +msgstr "le certificat est présent, mais la clé privée « %s » est absente" -#: fe-secure-openssl.c:1370 +#: fe-secure-openssl.c:1371 #, c-format -msgid "private key file \"%s\" is not a regular file\n" -msgstr "le fichier de clé privée « %s » n'est pas un fichier standard\n" +msgid "could not stat private key file \"%s\": %m" +msgstr "n'a pas pu interroger le fichier de clé privée « %s » : %m" -#: fe-secure-openssl.c:1394 +#: fe-secure-openssl.c:1379 #, c-format -msgid "private key file \"%s\" must be owned by the current user or root\n" -msgstr "le fichier de clé privée « %s » doit avoir comme propriétaire l'utilisateur courant ou root\n" +msgid "private key file \"%s\" is not a regular file" +msgstr "le fichier de clé privée « %s » n'est pas un fichier" -#: fe-secure-openssl.c:1403 +#: fe-secure-openssl.c:1412 #, c-format -msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root\n" -msgstr "le fichier de clé privée « %s » a des droits d'accès pour le groupe ou le monde ; le fichier doit avoir les droits u=rw (0600) ou moins si le propriétaire est l'utilisateur courant, ou les droits u=rw,g=r (0640) ou moins si le propriétaire est root\n" +msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root" +msgstr "le fichier de clé privée « %s » a des droits d'accès pour le groupe ou le monde ; le fichier doit avoir les droits u=rw (0600) ou moins si le propriétaire est l'utilisateur courant, ou les droits u=rw,g=r (0640) ou moins si le propriétaire est root" -#: fe-secure-openssl.c:1428 +#: fe-secure-openssl.c:1436 #, c-format -msgid "could not load private key file \"%s\": %s\n" -msgstr "n'a pas pu charger le fichier de clé privée « %s » : %s\n" +msgid "could not load private key file \"%s\": %s" +msgstr "n'a pas pu charger le fichier de clé privée « %s » : %s" -#: fe-secure-openssl.c:1445 +#: fe-secure-openssl.c:1452 #, c-format -msgid "certificate does not match private key file \"%s\": %s\n" -msgstr "le certificat ne correspond pas à la clé privée « %s » : %s\n" +msgid "certificate does not match private key file \"%s\": %s" +msgstr "le certificat ne correspond pas à la clé privée « %s » : %s" -#: fe-secure-openssl.c:1545 +#: fe-secure-openssl.c:1521 #, c-format -msgid "This may indicate that the server does not support any SSL protocol version between %s and %s.\n" -msgstr "Ceci pourrait indiquer que le serveur ne supporte aucune des versions du protocole SSL entre %s et %s.\n" +msgid "SSL error: certificate verify failed: %s" +msgstr "erreur SSL : échec de la vérification du certificat : %s" -#: fe-secure-openssl.c:1581 +#: fe-secure-openssl.c:1566 #, c-format -msgid "certificate could not be obtained: %s\n" -msgstr "le certificat n'a pas pu être obtenu : %s\n" +msgid "This may indicate that the server does not support any SSL protocol version between %s and %s." +msgstr "Ceci pourrait indiquer que le serveur ne supporte aucune des versions du protocole SSL entre %s et %s." -#: fe-secure-openssl.c:1687 +#: fe-secure-openssl.c:1598 +#, c-format +msgid "direct SSL connection was established without ALPN protocol negotiation extension" +msgstr "la connexion SSL directe a été établie sans l'extension de négociation du protocole ALPN" + +#: fe-secure-openssl.c:1610 +#, c-format +msgid "SSL connection was established with unexpected ALPN protocol" +msgstr "la connexion SSL a été établie avec un protocole ALPN inattendu" + +#: fe-secure-openssl.c:1627 +#, c-format +msgid "certificate could not be obtained: %s" +msgstr "le certificat n'a pas pu être obtenu : %s" + +#: fe-secure-openssl.c:1734 #, c-format msgid "no SSL error reported" msgstr "aucune erreur SSL reportée" -#: fe-secure-openssl.c:1696 +#: fe-secure-openssl.c:1777 #, c-format msgid "SSL error code %lu" msgstr "code d'erreur SSL %lu" -#: fe-secure-openssl.c:1944 +#: fe-secure-openssl.c:2076 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ATTENTION : sslpassword tronqué\n" -#: fe-secure.c:267 +#: fe-secure.c:248 #, c-format -msgid "could not receive data from server: %s\n" -msgstr "n'a pas pu recevoir des données depuis le serveur : %s\n" +msgid "could not receive data from server: %s" +msgstr "n'a pas pu recevoir des données depuis le serveur : %s" -#: fe-secure.c:436 +#: fe-secure.c:419 #, c-format -msgid "could not send data to server: %s\n" -msgstr "n'a pas pu transmettre les données au serveur : %s\n" +msgid "could not send data to server: %s" +msgstr "n'a pas pu transmettre les données au serveur : %s" -#: win32.c:314 +#: win32.c:310 #, c-format msgid "unrecognized socket error: 0x%08X/%d" msgstr "erreur de socket non reconnue : 0x%08X/%d" -#~ msgid "\"SELECT pg_is_in_recovery()\" failed\n" -#~ msgstr "\"SELECT pg_is_in_recovery()\" a échoué\n" - -#~ msgid "\"SHOW transaction_read_only\" failed\n" -#~ msgstr "\"SHOW transaction_read_only\" a échoué\n" - -#~ msgid "COPY IN state must be terminated first\n" -#~ msgstr "l'état COPY IN doit d'abord être terminé\n" - -#~ msgid "COPY OUT state must be terminated first\n" -#~ msgstr "l'état COPY OUT doit d'abord être terminé\n" - -#~ msgid "Kerberos 5 authentication rejected: %*s\n" -#~ msgstr "authentification Kerberos 5 rejetée : %*s\n" - -#, c-format -#~ msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -#~ msgstr "échec de PGEventProc « %s » lors de l'événement PGEVT_CONNRESET\n" - #, c-format -#~ msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -#~ msgstr "échec de PGEventProc « %s » lors de l'événement PGEVT_RESULTCREATE\n" - -#~ msgid "SSL library does not support CRL certificates (file \"%s\")\n" -#~ msgstr "la bibliothèque SSL ne supporte pas les certificats CRL (fichier « %s »)\n" - -#~ msgid "WARNING: line %d too long in password file \"%s\"\n" -#~ msgstr "ATTENTION : ligne %d trop longue dans le fichier de mots de passe « %s »\n" - -#~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %d\n" -#~ msgstr "échec de WSAIoctl(SIO_KEEPALIVE_VALS) : %d\n" - -#~ msgid "cannot determine OID of function lo_creat\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_creat\n" - -#~ msgid "cannot determine OID of function lo_create\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_create\n" - -#~ msgid "cannot determine OID of function lo_lseek\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_lseek\n" - -#~ msgid "cannot determine OID of function lo_lseek64\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_lseek64\n" - -#~ msgid "cannot determine OID of function lo_open\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_open\n" - -#~ msgid "cannot determine OID of function lo_tell64\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_tell64\n" - -#~ msgid "cannot determine OID of function lo_truncate\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_truncate\n" - -#~ msgid "cannot determine OID of function lo_truncate64\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_truncate64\n" - -#~ msgid "cannot determine OID of function lo_unlink\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lo_unlink\n" - -#~ msgid "cannot determine OID of function loread\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction loread\n" - -#~ msgid "cannot determine OID of function lowrite\n" -#~ msgstr "ne peut pas déterminer l'OID de la fonction lowrite\n" - -#~ msgid "could not acquire mutex: %s\n" -#~ msgstr "n'a pas pu acquérir le mutex : %s\n" - -#~ msgid "" -#~ "could not connect to server: %s\n" -#~ "\tIs the server running on host \"%s\" (%s) and accepting\n" -#~ "\tTCP/IP connections on port %s?\n" -#~ msgstr "" -#~ "n'a pas pu se connecter au serveur : %s\n" -#~ "\tLe serveur est-il actif sur l'hôte « %s » (%s)\n" -#~ "\tet accepte-t-il les connexionsTCP/IP sur le port %s ?\n" - -#~ msgid "could not get home directory to locate client certificate files\n" -#~ msgstr "" -#~ "n'a pas pu récupérer le répertoire personnel pour trouver les certificats\n" -#~ "du client\n" - -#~ msgid "could not get home directory to locate password file\n" -#~ msgstr "" -#~ "n'a pas pu obtenir le répertoire personnel pour trouver le fichier de\n" -#~ "mot de passe\n" - -#~ msgid "could not get home directory to locate service definition file" -#~ msgstr "" -#~ "n'a pas pu obtenir le répertoire personnel pour trouver le certificat de\n" -#~ "définition du service" - -#~ msgid "could not make a writable connection to server \"%s:%s\"\n" -#~ msgstr "n'a pas pu réaliser une connexion en écriture au serveur « %s » : %s\n" - -#~ msgid "could not open private key file \"%s\": %s\n" -#~ msgstr "n'a pas pu ouvrir le fichier de clé privée « %s » : %s\n" - -#~ msgid "could not read private key file \"%s\": %s\n" -#~ msgstr "n'a pas pu lire la clé privée « %s » : %s\n" - -#~ msgid "could not restore nonblocking mode on socket: %s\n" -#~ msgstr "n'a pas pu rétablir le mode non-bloquant pour la socket : %s\n" - -#~ msgid "could not set maximum version of SSL protocol: %s\n" -#~ msgstr "n'a pas pu mettre en place la version maximale du protocole SSL : %s\n" - -#~ msgid "could not set minimum version of SSL protocol: %s\n" -#~ msgstr "n'a pas pu mettre en place la version minimale du protocole SSL : %s\n" - -#~ msgid "could not set socket to blocking mode: %s\n" -#~ msgstr "n'a pas pu activer le mode bloquant pour la socket : %s\n" - -#~ msgid "extraneous data in \"D\" message" -#~ msgstr "données supplémentaires dans le message « D »" - -#~ msgid "extraneous data in \"T\" message" -#~ msgstr "données supplémentaires dans le message « T »" - -#~ msgid "extraneous data in \"t\" message" -#~ msgstr "données supplémentaires dans le message « t »" - -#~ msgid "failed to generate nonce\n" -#~ msgstr "échec pour la génération de nonce\n" - -#~ msgid "function requires at least protocol version 3.0\n" -#~ msgstr "la fonction nécessite au minimum le protocole 3.0\n" - -#~ msgid "invalid appname state %d, probably indicative of memory corruption\n" -#~ msgstr "état appname %d invalide, indiquant probablement une corruption de la mémoire\n" - -#~ msgid "invalid channel_binding value: \"%s\"\n" -#~ msgstr "valeur de channel_binding invalide : « %s »\n" - -#~ msgid "invalid gssencmode value: \"%s\"\n" -#~ msgstr "valeur gssencmode invalide : « %s »\n" - -#~ msgid "invalid setenv state %c, probably indicative of memory corruption\n" -#~ msgstr "état setenv %c invalide, indiquant probablement une corruption de la mémoire\n" - -#~ msgid "invalid ssl_max_protocol_version value: \"%s\"\n" -#~ msgstr "valeur ssl_max_protocol_version invalide : « %s »\n" - -#~ msgid "invalid ssl_min_protocol_version value: \"%s\"\n" -#~ msgstr "valeur ssl_min_protocol_version invalide : « %s »\n" - -#~ msgid "invalid state %c, probably indicative of memory corruption\n" -#~ msgstr "état %c invalide, indiquant probablement une corruption de la mémoire\n" - -#~ msgid "invalid target_session_attrs value: \"%s\"\n" -#~ msgstr "valeur target_session_attrs invalide : « %s »\n" - -#, c-format -#~ msgid "local user with ID %d does not exist\n" -#~ msgstr "l'utilisateur local dont l'identifiant est %d n'existe pas\n" - -#~ msgid "lost synchronization with server, resetting connection" -#~ msgstr "synchronisation perdue avec le serveur, réinitialisation de la connexion" - -#~ msgid "no GSSAPI support; cannot require GSSAPI\n" -#~ msgstr "pas de support de GSSAPI : ne peut pas nécessiter GSSAPI\n" - -#~ msgid "private key file \"%s\" changed during execution\n" -#~ msgstr "la clé privée « %s » a été modifiée durant l'exécution\n" - -#, c-format -#~ msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" -#~ msgstr "" -#~ "le fichier de la clé privée « %s » a des droits d'accès en lecture\n" -#~ "pour le groupe ou universel ; les droits devraient être u=rw (0600)\n" -#~ "ou inférieur\n" - -#~ msgid "select() failed: %s\n" -#~ msgstr "échec de select() : %s\n" - -#~ msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" -#~ msgstr "" -#~ "le serveur a envoyé des données binaires (message « B ») sans description\n" -#~ "préalable de la ligne (message « T »)" - -#~ msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" -#~ msgstr "" -#~ "le serveur a envoyé des données (message « D ») sans description préalable\n" -#~ "de la ligne (message « T »)" - -#~ msgid "setsockopt(%s) failed: %s\n" -#~ msgstr "setsockopt(%s) a échoué : %s\n" - -#~ msgid "setsockopt(SO_KEEPALIVE) failed: %s\n" -#~ msgstr "setsockopt(SO_KEEPALIVE) a échoué : %s\n" - -#~ msgid "setsockopt(TCP_KEEPALIVE) failed: %s\n" -#~ msgstr "setsockopt(TCP_KEEPALIVE) a échoué : %s\n" - -#~ msgid "setsockopt(TCP_KEEPIDLE) failed: %s\n" -#~ msgstr "setsockopt(TCP_KEEPIDLE) a échoué : %s\n" - -#~ msgid "setsockopt(TCP_KEEPINTVL) failed: %s\n" -#~ msgstr "setsockopt(TCP_KEEPINTVL) a échoué : %s\n" - -#~ msgid "socket not open\n" -#~ msgstr "socket non ouvert\n" - -#~ msgid "unexpected character %c following empty query response (\"I\" message)" -#~ msgstr "" -#~ "caractère %c inattendu à la suite d'une réponse de requête vide (message\n" -#~ "« I »)" - -#~ msgid "unrecognized return value from row processor" -#~ msgstr "valeur de retour du traitement de la ligne non reconnue" - -#~ msgid "verified SSL connections are only supported when connecting to a host name\n" -#~ msgstr "" -#~ "les connexions SSL vérifiées ne sont supportées que lors de la connexion\n" -#~ "à un alias hôte\n" +#~ msgid "keepalives parameter must be an integer" +#~ msgstr "le paramètre keepalives doit être un entier" diff --git a/src/interfaces/libpq/po/ja.po b/src/interfaces/libpq/po/ja.po index aa9aa5bed64f5..0dc7053bc1310 100644 --- a/src/interfaces/libpq/po/ja.po +++ b/src/interfaces/libpq/po/ja.po @@ -1,16 +1,16 @@ # libpq.po # Japanese message translation file for libpq # -# Copyright (C) 2011-2022 PostgreSQL Global Development Group +# Copyright (C) 2011-2024 PostgreSQL Global Development Group # # This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" -"Project-Id-Version: libpq (PostgreSQL 16)\n" +"Project-Id-Version: libpq (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-06-19 09:32+0900\n" -"PO-Revision-Date: 2023-06-19 10:02+0900\n" +"POT-Creation-Date: 2025-02-12 11:26+0900\n" +"PO-Revision-Date: 2025-02-12 14:58+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -20,921 +20,1024 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../port/thread.c:50 ../../port/thread.c:86 -#, c-format -msgid "could not look up local user ID %d: %s" -msgstr "ローカルユーザーID %dã®å‚ç…§ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" - -#: ../../port/thread.c:55 ../../port/thread.c:91 -#, c-format -msgid "local user with ID %d does not exist" -msgstr "ID %d ã‚’æŒã¤ãƒ­ãƒ¼ã‚«ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯å­˜åœ¨ã—ã¾ã›ã‚“" - -#: fe-auth-scram.c:227 +#: fe-auth-scram.c:228 #, c-format msgid "malformed SCRAM message (empty message)" msgstr "SCRAMメッセージã®ãƒ•ォーマット異常 (空ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸)" -#: fe-auth-scram.c:232 +#: fe-auth-scram.c:233 #, c-format msgid "malformed SCRAM message (length mismatch)" msgstr "SCRAMメッセージã®ãƒ•ォーマット異常 (é•·ã•ã®ä¸æ•´åˆ)" -#: fe-auth-scram.c:275 +#: fe-auth-scram.c:277 #, c-format msgid "could not verify server signature: %s" msgstr "サーãƒãƒ¼ç½²åを検証ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-auth-scram.c:281 +#: fe-auth-scram.c:283 #, c-format msgid "incorrect server signature" msgstr "æ­£ã—ããªã„サーãƒãƒ¼ç½²å" -#: fe-auth-scram.c:290 +#: fe-auth-scram.c:292 #, c-format msgid "invalid SCRAM exchange state" msgstr "䏿­£ãªSCRAM交æ›çŠ¶æ…‹" -#: fe-auth-scram.c:317 +#: fe-auth-scram.c:316 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)" msgstr "SCRAMメッセージã®ãƒ•ォーマット異常 (属性 \"%c\" ãŒå¿…è¦)" -#: fe-auth-scram.c:326 +#: fe-auth-scram.c:325 #, c-format msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")" msgstr "SCRAMメッセージã®ãƒ•ォーマット異常 (属性 \"%c\" ã«æ–‡å­— \"=\" ãŒå¿…è¦)" -#: fe-auth-scram.c:366 +#: fe-auth-scram.c:365 #, c-format msgid "could not generate nonce" msgstr "nonce を生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: fe-auth-scram.c:375 fe-auth-scram.c:448 fe-auth-scram.c:600 -#: fe-auth-scram.c:620 fe-auth-scram.c:644 fe-auth-scram.c:658 -#: fe-auth-scram.c:704 fe-auth-scram.c:740 fe-auth-scram.c:914 fe-auth.c:295 -#: fe-auth.c:368 fe-auth.c:402 fe-auth.c:617 fe-auth.c:728 fe-auth.c:1209 -#: fe-auth.c:1374 fe-connect.c:925 fe-connect.c:1759 fe-connect.c:1921 -#: fe-connect.c:3291 fe-connect.c:4496 fe-connect.c:5161 fe-connect.c:5416 -#: fe-connect.c:5534 fe-connect.c:5781 fe-connect.c:5861 fe-connect.c:5959 -#: fe-connect.c:6210 fe-connect.c:6237 fe-connect.c:6313 fe-connect.c:6336 -#: fe-connect.c:6360 fe-connect.c:6395 fe-connect.c:6481 fe-connect.c:6489 -#: fe-connect.c:6846 fe-connect.c:6996 fe-exec.c:527 fe-exec.c:1321 -#: fe-exec.c:3111 fe-exec.c:4071 fe-exec.c:4235 fe-gssapi-common.c:109 -#: fe-lobj.c:870 fe-protocol3.c:204 fe-protocol3.c:228 fe-protocol3.c:256 -#: fe-protocol3.c:273 fe-protocol3.c:353 fe-protocol3.c:720 fe-protocol3.c:959 -#: fe-protocol3.c:1770 fe-protocol3.c:2170 fe-secure-common.c:110 -#: fe-secure-gssapi.c:500 fe-secure-openssl.c:434 fe-secure-openssl.c:1285 +#: fe-auth-scram.c:374 fe-auth-scram.c:447 fe-auth-scram.c:599 +#: fe-auth-scram.c:619 fe-auth-scram.c:643 fe-auth-scram.c:657 +#: fe-auth-scram.c:703 fe-auth-scram.c:739 fe-auth-scram.c:931 fe-auth.c:306 +#: fe-auth.c:380 fe-auth.c:414 fe-auth.c:692 fe-auth.c:825 fe-auth.c:1328 +#: fe-auth.c:1491 fe-cancel.c:159 fe-connect.c:964 fe-connect.c:1004 +#: fe-connect.c:2082 fe-connect.c:2244 fe-connect.c:3643 fe-connect.c:5061 +#: fe-connect.c:5373 fe-connect.c:5628 fe-connect.c:5746 fe-connect.c:5993 +#: fe-connect.c:6073 fe-connect.c:6171 fe-connect.c:6422 fe-connect.c:6449 +#: fe-connect.c:6525 fe-connect.c:6548 fe-connect.c:6572 fe-connect.c:6607 +#: fe-connect.c:6693 fe-connect.c:6701 fe-connect.c:7058 fe-connect.c:7240 +#: fe-exec.c:530 fe-exec.c:1315 fe-exec.c:3254 fe-exec.c:4298 fe-exec.c:4464 +#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:209 fe-protocol3.c:232 +#: fe-protocol3.c:255 fe-protocol3.c:272 fe-protocol3.c:293 fe-protocol3.c:369 +#: fe-protocol3.c:733 fe-protocol3.c:972 fe-protocol3.c:1779 +#: fe-protocol3.c:2180 fe-secure-common.c:110 fe-secure-gssapi.c:496 +#: fe-secure-openssl.c:404 fe-secure-openssl.c:1073 #, c-format msgid "out of memory" msgstr "メモリä¸è¶³ã§ã™" -#: fe-auth-scram.c:382 +#: fe-auth-scram.c:381 #, c-format msgid "could not encode nonce" msgstr "nonceをエンコードã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: fe-auth-scram.c:570 +#: fe-auth-scram.c:569 #, c-format msgid "could not calculate client proof: %s" msgstr "クライアント証明ã®ç®—出ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: fe-auth-scram.c:585 +#: fe-auth-scram.c:584 #, c-format msgid "could not encode client proof" msgstr "クライアントã®è¨¼æ˜Žã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ" -#: fe-auth-scram.c:637 +#: fe-auth-scram.c:636 #, c-format msgid "invalid SCRAM response (nonce mismatch)" msgstr "䏿­£ãªSCRAM応答 (nonce ã®ä¸ä¸€è‡´)" -#: fe-auth-scram.c:667 +#: fe-auth-scram.c:666 #, c-format msgid "malformed SCRAM message (invalid salt)" msgstr "SCRAMメッセージã®ãƒ•ォーマット異常 (䏿­£ãªã‚½ãƒ«ãƒˆ)" -#: fe-auth-scram.c:680 +#: fe-auth-scram.c:679 #, c-format msgid "malformed SCRAM message (invalid iteration count)" msgstr "SCRAMメッセージã®ãƒ•ォーマット異常 (䏿­£ãªç¹°ã‚Šè¿”ã—回数)" -#: fe-auth-scram.c:685 +#: fe-auth-scram.c:684 #, c-format msgid "malformed SCRAM message (garbage at end of server-first-message)" msgstr "SCRAMメッセージã®ãƒ•ォーマット異常 (server-first-message 終端ã®ä½™åˆ†ãªãƒ‡ãƒ¼ã‚¿)" -#: fe-auth-scram.c:719 +#: fe-auth-scram.c:718 #, c-format msgid "error received from server in SCRAM exchange: %s" msgstr "SCRAM交æ›ä¸­ã«ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰ã®ã‚¨ãƒ©ãƒ¼ã‚’å—ä¿¡ã—ã¾ã—ãŸ: %s" -#: fe-auth-scram.c:734 +#: fe-auth-scram.c:733 #, c-format msgid "malformed SCRAM message (garbage at end of server-final-message)" msgstr "SCRAMメッセージã®ãƒ•ォーマット異常 (server-final-message 終端ã®ä½™åˆ†ãªãƒ‡ãƒ¼ã‚¿)" -#: fe-auth-scram.c:751 +#: fe-auth-scram.c:750 #, c-format msgid "malformed SCRAM message (invalid server signature)" msgstr "SCRAMメッセージã®ãƒ•ォーマット異常 (䏿­£ãªã‚µãƒ¼ãƒãƒ¼ç½²å)" -#: fe-auth-scram.c:923 +#: fe-auth-scram.c:940 msgid "could not generate random salt" msgstr "乱数ソルトを生æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: fe-auth.c:76 +#: fe-auth.c:78 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)" msgstr "GSSAPIãƒãƒƒãƒ•ã‚¡ã®å‰²ã‚Šå½“ã¦ã®éš›ã®ãƒ¡ãƒ¢ãƒªä¸è¶³(%d)" -#: fe-auth.c:137 +#: fe-auth.c:144 msgid "GSSAPI continuation error" msgstr "GSSAI続行エラー" -#: fe-auth.c:167 fe-auth.c:396 fe-gssapi-common.c:97 fe-secure-common.c:99 +#: fe-auth.c:174 fe-auth.c:408 fe-gssapi-common.c:97 fe-secure-common.c:99 #: fe-secure-common.c:173 #, c-format msgid "host name must be specified" msgstr "ホストåを指定ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: fe-auth.c:173 +#: fe-auth.c:180 #, c-format msgid "duplicate GSS authentication request" msgstr "é‡è¤‡ã™ã‚‹GSSèªè¨¼è¦æ±‚" -#: fe-auth.c:237 +#: fe-auth.c:244 #, c-format msgid "out of memory allocating SSPI buffer (%d)" msgstr "SSPIãƒãƒƒãƒ•ã‚¡ã®å‰²ã‚Šå½“ã¦ã®éš›ã®ãƒ¡ãƒ¢ãƒªä¸è¶³(%d)" -#: fe-auth.c:284 +#: fe-auth.c:295 msgid "SSPI continuation error" msgstr "SSPI続行エラー" -#: fe-auth.c:358 +#: fe-auth.c:370 #, c-format msgid "duplicate SSPI authentication request" msgstr "é‡è¤‡ã—ãŸSSPIèªè¨¼è¦æ±‚" -#: fe-auth.c:383 +#: fe-auth.c:395 msgid "could not acquire SSPI credentials" msgstr "SSPI資格を入手ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: fe-auth.c:436 +#: fe-auth.c:447 #, c-format msgid "channel binding required, but SSL not in use" msgstr "ãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒè¦æ±‚ã•れã¦ã„ã¾ã™ãŒã€SSLãŒä½¿ç”¨ã•れã¦ã„ã¾ã›ã‚“" -#: fe-auth.c:442 +#: fe-auth.c:453 #, c-format msgid "duplicate SASL authentication request" msgstr "é‡è¤‡ã™ã‚‹SASLèªè¨¼è¦æ±‚" -#: fe-auth.c:500 +#: fe-auth.c:511 #, c-format msgid "channel binding is required, but client does not support it" msgstr "ãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒè¦æ±‚ã•れã¦ã„ã¾ã™ãŒã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“" -#: fe-auth.c:516 +#: fe-auth.c:527 #, c-format msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection" msgstr "サーãƒãƒ¼ãŒéžSSL接続上㧠SCRAM-SHA-256-PLUS èªè¨¼ã‚’æç¤ºã—ã¦ãã¾ã—ãŸ" -#: fe-auth.c:530 +#: fe-auth.c:542 #, c-format msgid "none of the server's SASL authentication mechanisms are supported" msgstr "サーãƒãƒ¼å´ã®ã„ãšã‚Œã®SASLèªè¨¼æ©Ÿæ§‹ã‚‚サãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: fe-auth.c:537 +#: fe-auth.c:569 +#, c-format +msgid "authentication method requirement \"%s\" failed: server requested %s authentication" +msgstr "å¿…é ˆã®èªè¨¼æ–¹å¼\"%s\"を満ãŸã›ã¾ã›ã‚“ã§ã—ãŸ: サーãƒãƒ¼ã¯ %s èªè¨¼ã‚’è¦æ±‚ã—ã¾ã—ãŸ" + +#: fe-auth.c:578 #, c-format msgid "channel binding is required, but server did not offer an authentication method that supports channel binding" msgstr "ãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒè¦æ±‚ã•れã¦ã„ã¾ã™ãŒã€ã‚µãƒ¼ãƒãƒ¼ãŒãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚’サãƒãƒ¼ãƒˆã™ã‚‹èªè¨¼æ–¹å¼ã‚’æä¾›ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: fe-auth.c:640 +#: fe-auth.c:714 #, c-format msgid "out of memory allocating SASL buffer (%d)" msgstr "SASLãƒãƒƒãƒ•ã‚¡ã®å‰²ã‚Šå½“ã¦ã®éš›ã®ãƒ¡ãƒ¢ãƒªä¸è¶³(%d)" -#: fe-auth.c:664 +#: fe-auth.c:756 #, c-format msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed" msgstr "サーãƒãƒ¼ã‹ã‚‰AuthenticationSASLFinalã‚’å—ä¿¡ã—ã¾ã—ãŸã€ã—ã‹ã—SASLèªè¨¼ã¯å®Œäº†ã—ã¦ã„ã¾ã›ã‚“" -#: fe-auth.c:674 +#: fe-auth.c:766 #, c-format msgid "no client response found after SASL exchange success" msgstr "SASL交æ›ã®æˆåŠŸå¾Œã«ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‹ã‚‰ã®å¿œç­”ãŒã‚りã¾ã›ã‚“" -#: fe-auth.c:737 fe-auth.c:744 fe-auth.c:1357 fe-auth.c:1368 +#: fe-auth.c:834 fe-auth.c:841 fe-auth.c:1474 fe-auth.c:1485 #, c-format msgid "could not encrypt password: %s" msgstr "パスワードを暗å·åŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-auth.c:772 +#: fe-auth.c:871 msgid "server requested a cleartext password" msgstr "サーãƒãƒ¼ãŒå¹³æ–‡ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã‚’è¦æ±‚ã—ã¦ãã¾ã—ãŸ" -#: fe-auth.c:774 +#: fe-auth.c:873 msgid "server requested a hashed password" msgstr "サーãƒãƒ¼ãŒãƒãƒƒã‚·ãƒ¥åŒ–ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ã‚’è¦æ±‚ã—ã¦ãã¾ã—ãŸ" -#: fe-auth.c:777 +#: fe-auth.c:876 msgid "server requested GSSAPI authentication" msgstr "サーãƒãƒ¼ãŒGSSAPIèªè¨¼ã‚’è¦æ±‚ã—ã¦ãã¾ã—ãŸ" -#: fe-auth.c:779 +#: fe-auth.c:878 msgid "server requested SSPI authentication" msgstr "サーãƒãƒ¼ãŒSSPIèªè¨¼ã‚’è¦æ±‚ã—ã¦ãã¾ã—ãŸ" -#: fe-auth.c:783 +#: fe-auth.c:882 msgid "server requested SASL authentication" msgstr "サーãƒãƒ¼ãŒSASLèªè¨¼ã‚’è¦æ±‚ã—ã¦ãã¾ã—ãŸ" -#: fe-auth.c:786 +#: fe-auth.c:885 msgid "server requested an unknown authentication type" msgstr "サーãƒãƒ¼ãŒä¸æ˜Žãªèªè¨¼ã‚¿ã‚¤ãƒ—ã‚’è¦æ±‚ã—ã¦ãã¾ã—ãŸ" -#: fe-auth.c:819 +#: fe-auth.c:918 #, c-format msgid "server did not request an SSL certificate" msgstr "サーãƒãƒ¼ãŒSSLè¨¼æ˜Žæ›¸ã‚’è¦æ±‚ã—ã¦ãã¾ã›ã‚“ã§ã—ãŸ" -#: fe-auth.c:824 +#: fe-auth.c:923 #, c-format msgid "server accepted connection without a valid SSL certificate" msgstr "サーãƒãƒ¼ã¯æœ‰åйãªSSL証明書ãªã—ã§æŽ¥ç¶šã‚’å—ã‘付ã‘ã¾ã—ãŸ" -#: fe-auth.c:878 +#: fe-auth.c:977 msgid "server did not complete authentication" msgstr "サーãƒãƒ¼ãŒèªè¨¼ã‚’完了ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: fe-auth.c:912 +#: fe-auth.c:1011 #, c-format msgid "authentication method requirement \"%s\" failed: %s" msgstr "å¿…é ˆã®èªè¨¼æ–¹å¼\"%s\"ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" -#: fe-auth.c:935 +#: fe-auth.c:1034 #, c-format msgid "channel binding required, but server authenticated client without channel binding" msgstr "ãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒè¦æ±‚ã•れã¦ã„ã¾ã™ãŒã€ã‚µãƒ¼ãƒãƒ¼ã¯ãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚’使用ã›ãšã«èªè¨¼ã‚’行ã„ã¾ã—ãŸ" -#: fe-auth.c:940 +#: fe-auth.c:1039 #, c-format msgid "channel binding required but not supported by server's authentication request" msgstr "ãƒãƒ£ãƒãƒ«ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒè¦æ±‚ã•れã¦ã„ã¾ã™ãŒã€ã‚µãƒ¼ãƒãƒ¼ã®èªè¨¼è¦æ±‚ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: fe-auth.c:974 +#: fe-auth.c:1079 #, c-format msgid "Kerberos 4 authentication not supported" msgstr "Kerberos 4èªè¨¼ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: fe-auth.c:978 +#: fe-auth.c:1083 #, c-format msgid "Kerberos 5 authentication not supported" msgstr "Kerberos 5èªè¨¼ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: fe-auth.c:1048 +#: fe-auth.c:1153 #, c-format msgid "GSSAPI authentication not supported" msgstr "GSSAPIèªè¨¼ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: fe-auth.c:1079 +#: fe-auth.c:1184 #, c-format msgid "SSPI authentication not supported" msgstr "SSPIèªè¨¼ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: fe-auth.c:1086 +#: fe-auth.c:1191 #, c-format msgid "Crypt authentication not supported" msgstr "Cryptèªè¨¼ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: fe-auth.c:1150 +#: fe-auth.c:1265 #, c-format msgid "authentication method %u not supported" msgstr "èªè¨¼æ–¹å¼%uã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: fe-auth.c:1196 +#: fe-auth.c:1305 #, c-format msgid "user name lookup failure: error code %lu" msgstr "ユーザーåã®å‚ç…§ã«å¤±æ•—: エラーコード %lu" -#: fe-auth.c:1320 +#: fe-auth.c:1313 +#, c-format +msgid "could not look up local user ID %ld: %m" +msgstr "ローカルユーザーID %ldã®å‚ç…§ã«å¤±æ•—ã—ã¾ã—ãŸ: %m" + +#: fe-auth.c:1318 +#, c-format +msgid "local user with ID %ld does not exist" +msgstr "ID %ld ã‚’æŒã¤ãƒ­ãƒ¼ã‚«ãƒ«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã¯å­˜åœ¨ã—ã¾ã›ã‚“" + +#: fe-auth.c:1437 #, c-format msgid "unexpected shape of result set returned for SHOW" msgstr "SHOW ã«å¯¾ã™ã‚‹äºˆæœŸã—ãªã„å½¢ã®ãƒªã‚¶ãƒ«ãƒˆã‚»ãƒƒãƒˆ" -#: fe-auth.c:1328 +#: fe-auth.c:1445 #, c-format -msgid "password_encryption value too long" -msgstr "password_encryptionã®å€¤ãŒé•·ã™ãŽã¾ã™" +msgid "\"password_encryption\" value too long" +msgstr "\"password_encryption\"ã®å€¤ãŒé•·ã™ãŽã¾ã™" -#: fe-auth.c:1378 +#: fe-auth.c:1495 #, c-format msgid "unrecognized password encryption algorithm \"%s\"" msgstr "èªè­˜ã§ããªã„パスワード暗å·åŒ–アルゴリズム \"%s\"" -#: fe-connect.c:1132 +#: fe-cancel.c:76 +#, c-format +msgid "connection pointer is NULL" +msgstr "接続ãƒã‚¤ãƒ³ã‚¿ã¯NULLã§ã™" + +#: fe-cancel.c:82 fe-misc.c:587 +#, c-format +msgid "connection not open" +msgstr "接続ã¯ã‚ªãƒ¼ãƒ—ンã•れã¦ã„ã¾ã›ã‚“" + +#: fe-cancel.c:193 +#, c-format +msgid "cancel request is already being sent on this connection" +msgstr "ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã§ã¯ã™ã§ã«ã‚­ãƒ£ãƒ³ã‚»ãƒ«è¦æ±‚ã‚’é€å‡ºæ¸ˆã¿ã§ã™" + +#: fe-cancel.c:263 +#, c-format +msgid "unexpected response from server" +msgstr "サーãƒãƒ¼ã‹ã‚‰ã®æƒ³å®šå¤–ã®å¿œç­”" + +#: fe-connect.c:1261 #, c-format msgid "could not match %d host names to %d hostaddr values" msgstr "%d個ã®ãƒ›ã‚¹ãƒˆåã¨%d個ã®hostaddrã®å€¤ã¨ã®çªãåˆã›ã¯ã§ãã¾ã›ã‚“" -#: fe-connect.c:1212 +#: fe-connect.c:1341 #, c-format msgid "could not match %d port numbers to %d hosts" msgstr "%d個ã®ãƒãƒ¼ãƒˆç•ªå·ã¨%d個ã®ãƒ›ã‚¹ãƒˆã¨ã®çªãåˆã›ã¯ã§ãã¾ã›ã‚“" -#: fe-connect.c:1337 +#: fe-connect.c:1469 #, c-format msgid "negative require_auth method \"%s\" cannot be mixed with non-negative methods" msgstr "require_authã®æ–¹å¼å¦å®š\"%s\"ã¯æ–¹å¼è¦æ±‚ã¨åŒæ™‚ã«æŒ‡å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: fe-connect.c:1350 +#: fe-connect.c:1482 #, c-format msgid "require_auth method \"%s\" cannot be mixed with negative methods" msgstr "require_authã®æ–¹å¼è¦æ±‚\"%s\"ã¯æ–¹å¼å¦å®šã¨åŒæ™‚ã«æŒ‡å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: fe-connect.c:1410 fe-connect.c:1461 fe-connect.c:1503 fe-connect.c:1559 -#: fe-connect.c:1567 fe-connect.c:1598 fe-connect.c:1644 fe-connect.c:1684 -#: fe-connect.c:1705 +#: fe-connect.c:1554 fe-connect.c:1683 fe-connect.c:1725 fe-connect.c:1768 +#: fe-connect.c:1871 fe-connect.c:1917 fe-connect.c:1957 fe-connect.c:2028 #, c-format msgid "invalid %s value: \"%s\"" msgstr "%s ã®å€¤ãŒä¸æ­£: \"%s\"" -#: fe-connect.c:1443 +#: fe-connect.c:1596 +#, c-format +msgid "internal error: no space in allowed_sasl_mechs" +msgstr "内部エラー: allowed_sasl_mechs ã«ç©ºããŒã‚りã¾ã›ã‚“" + +#: fe-connect.c:1635 #, c-format msgid "require_auth method \"%s\" is specified more than once" msgstr "require_authã§æ–¹å¼\"%s\"ãŒè¤‡æ•°å›žæŒ‡å®šã•れã¾ã—ãŸ" -#: fe-connect.c:1484 fe-connect.c:1523 fe-connect.c:1606 +#: fe-connect.c:1706 fe-connect.c:1745 fe-connect.c:1777 fe-connect.c:1879 #, c-format msgid "%s value \"%s\" invalid when SSL support is not compiled in" msgstr "%s 値\"%s\"ã¯SSLサãƒãƒ¼ãƒˆãŒã‚³ãƒ³ãƒ‘イルã•れã¦ã„ãªã„å ´åˆã¯ç„¡åйã§ã™" -#: fe-connect.c:1546 +#: fe-connect.c:1797 +#, c-format +msgid "weak sslmode \"%s\" may not be used with sslnegotiation=direct (use \"require\", \"verify-ca\", or \"verify-full\")" +msgstr "å¼±ã„sslmode\"%s\"ã¯sslnegotiation=direct ã¨ã¨ã‚‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“( \"require\", \"verify-ca\"ã¾ãŸã¯\"verify-full\"を使用ã—ã¦ãã ã•ã„)" + +#: fe-connect.c:1819 #, c-format msgid "weak sslmode \"%s\" may not be used with sslrootcert=system (use \"verify-full\")" msgstr "å¼±ã„sslmode\"%s\"ã¯sslrootcert=systemã¨ã¨ã‚‚ã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“(\"verify-full\"を使用ã—ã¦ãã ã•ã„)" -#: fe-connect.c:1584 +#: fe-connect.c:1832 fe-connect.c:1840 +#, c-format +msgid "invalid \"%s\" value: \"%s\"" +msgstr "\"%s\"ã®å€¤ãŒä¸æ­£: \"%s\"" + +#: fe-connect.c:1857 #, c-format msgid "invalid SSL protocol version range" msgstr "䏿­£ãªSSLプロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ç¯„囲" -#: fe-connect.c:1621 +#: fe-connect.c:1894 #, c-format msgid "%s value \"%s\" is not supported (check OpenSSL version)" msgstr "%s 値\"%s\"ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“(OpenSSLã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’確èªã—ã¦ãã ã•ã„)" -#: fe-connect.c:1651 +#: fe-connect.c:1924 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in" msgstr "gssencmodeã®å€¤\"%s\"ã¯GSSAPIサãƒãƒ¼ãƒˆãŒã‚³ãƒ³ãƒ‘イルã•れã¦ã„ãªã„å ´åˆã¯ä¸æ­£" -#: fe-connect.c:1944 +#: fe-connect.c:1978 +#, c-format +msgid "invalid SCRAM client key" +msgstr "䏿­£ãªSCRAMクライアントキー" + +#: fe-connect.c:1984 +#, c-format +msgid "invalid SCRAM client key length: %d" +msgstr "䏿­£ãªSCRAMクライアントキー長: %d" + +#: fe-connect.c:2003 +#, c-format +msgid "invalid SCRAM server key" +msgstr "䏿­£ãªSCRAMサーãƒãƒ¼ã‚­ãƒ¼" + +#: fe-connect.c:2009 +#, c-format +msgid "invalid SCRAM server key length: %d" +msgstr "䏿­£ãªSCRAMサーãƒãƒ¼ã‚­ãƒ¼é•·: %d" + +#: fe-connect.c:2267 #, c-format msgid "could not set socket to TCP no delay mode: %s" msgstr "TCPソケットをéžé…延モードã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-connect.c:2003 +#: fe-connect.c:2326 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "ソケット\"%s\"ã®ã‚µãƒ¼ãƒãƒ¼ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸ: " -#: fe-connect.c:2029 +#: fe-connect.c:2352 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "\"%s\"(%s)ã€ãƒãƒ¼ãƒˆ%sã®ã‚µãƒ¼ãƒãƒ¼ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸ: " -#: fe-connect.c:2034 +#: fe-connect.c:2357 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "\"%s\"ã€ãƒãƒ¼ãƒˆ%sã®ã‚µãƒ¼ãƒãƒ¼ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸ: " -#: fe-connect.c:2057 +#: fe-connect.c:2380 #, c-format msgid "\tIs the server running locally and accepting connections on that socket?" msgstr "\tサーãƒãƒ¼ã¯ãƒ­ãƒ¼ã‚«ãƒ«ã§ç¨¼åƒã—ã¦ã„ã¦ãã®ã‚½ã‚±ãƒƒãƒˆã§æŽ¥ç¶šã‚’å—ã‘付ã‘ã¦ã„ã¾ã™ã‹?" -#: fe-connect.c:2059 +#: fe-connect.c:2382 #, c-format msgid "\tIs the server running on that host and accepting TCP/IP connections?" msgstr "\tサーãƒãƒ¼ã¯ãã®ãƒ›ã‚¹ãƒˆä¸Šã§ç¨¼åƒã—ã¦ã„ã¦TCP/IP接続をå—ã‘付ã‘ã¦ã„ã¾ã™ã‹?" -#: fe-connect.c:2122 -#, c-format -msgid "invalid integer value \"%s\" for connection option \"%s\"" -msgstr "接続オプション\"%2$s\"ã«å¯¾ã™ã‚‹ä¸æ­£ãªæ•´æ•°å€¤\"%1$s\"" - -#: fe-connect.c:2151 fe-connect.c:2185 fe-connect.c:2220 fe-connect.c:2318 -#: fe-connect.c:2973 +#: fe-connect.c:2428 fe-connect.c:2462 fe-connect.c:2497 fe-connect.c:2595 +#: fe-connect.c:3321 #, c-format msgid "%s(%s) failed: %s" msgstr "%s(%s)ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" -#: fe-connect.c:2284 +#: fe-connect.c:2561 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s)ãŒå¤±æ•—ã—ã¾ã—ãŸ: エラーコード %d" -#: fe-connect.c:2597 +#: fe-connect.c:2873 #, c-format msgid "invalid connection state, probably indicative of memory corruption" msgstr "接続状態ãŒä¸æ­£ã§ã™ã€‚メモリ障害ã®å¯èƒ½æ€§ãŒã‚りã¾ã™" -#: fe-connect.c:2676 +#: fe-connect.c:2956 #, c-format msgid "invalid port number: \"%s\"" msgstr "䏿­£ãªãƒãƒ¼ãƒˆç•ªå·ã§ã™: \"%s\"" -#: fe-connect.c:2690 +#: fe-connect.c:2970 #, c-format msgid "could not translate host name \"%s\" to address: %s" msgstr "ホストå\"%s\"をアドレスã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-connect.c:2702 +#: fe-connect.c:2982 #, c-format msgid "could not parse network address \"%s\": %s" msgstr "ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¢ãƒ‰ãƒ¬ã‚¹\"%s\"をパースã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-connect.c:2713 +#: fe-connect.c:2993 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "Unixドメインソケットã®ãƒ‘ス\"%s\"ãŒé•·ã™ãŽã¾ã™(最大 %d ãƒã‚¤ãƒˆ)" -#: fe-connect.c:2727 +#: fe-connect.c:3007 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s" msgstr "Unixドメインソケットã®ãƒ‘ス\"%s\"をアドレスã«å¤‰æ›ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-connect.c:2901 +#: fe-connect.c:3173 fe-connect.c:4602 +#, c-format +msgid "GSSAPI encryption required but it is not supported over a local socket" +msgstr "GSSAPIæš—å·åŒ–ãŒè¦æ±‚ã•れã¦ã„ã¾ã™ãŒã€ãƒ­ãƒ¼ã‚«ãƒ«ã‚½ã‚±ãƒƒãƒˆã§ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“" + +#: fe-connect.c:3181 fe-connect.c:4731 +#, c-format +msgid "GSSAPI encryption required but no credential cache" +msgstr "GSSAPIæš—å·åŒ–ãŒè¦æ±‚ã•れã¾ã—ãŸãŒã€è³‡æ ¼è¨¼æ˜Žã‚­ãƒ£ãƒƒã‚·ãƒ¥ãŒã‚りã¾ã›ã‚“" + +#: fe-connect.c:3249 #, c-format msgid "could not create socket: %s" msgstr "ソケットを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-connect.c:2932 +#: fe-connect.c:3280 #, c-format msgid "could not set socket to nonblocking mode: %s" msgstr "ソケットをéžãƒ–ロッキングモードã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s\\" -#: fe-connect.c:2943 +#: fe-connect.c:3291 #, c-format msgid "could not set socket to close-on-exec mode: %s" msgstr "ソケットをclose-on-execモードã«è¨­å®šã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-connect.c:2961 -#, c-format -msgid "keepalives parameter must be an integer" -msgstr "keepaliveã®ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã¯æ•´æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" - -#: fe-connect.c:3100 +#: fe-connect.c:3448 #, c-format msgid "could not get socket error status: %s" msgstr "ソケットã®ã‚¨ãƒ©ãƒ¼çŠ¶æ…‹ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-connect.c:3127 +#: fe-connect.c:3475 #, c-format msgid "could not get client address from socket: %s" msgstr "ソケットã‹ã‚‰ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-connect.c:3165 +#: fe-connect.c:3501 #, c-format msgid "requirepeer parameter is not supported on this platform" msgstr "ã“ã®ãƒ—ラットフォームã§ã¯ requirepeer パラメータã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: fe-connect.c:3167 +#: fe-connect.c:3503 #, c-format msgid "could not get peer credentials: %s" msgstr "接続先ã®è³‡æ ¼è¨¼æ˜Žã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-connect.c:3180 +#: fe-connect.c:3516 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"" msgstr "requirepeerã¯\"%s\"を指定ã—ã¦ã„ã¾ã™ãŒã€å®Ÿéš›ã®æŽ¥ç¶šå…ˆåã¯\"%s\"ã§ã™" -#: fe-connect.c:3221 +#: fe-connect.c:3554 #, c-format msgid "could not send GSSAPI negotiation packet: %s" msgstr "GSSAPIãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ãƒ‘ケットをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-connect.c:3233 -#, c-format -msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)" -msgstr "GSSAPIæš—å·åŒ–ãŒè¦æ±‚ã•れã¦ã„ã¾ã™ãŒã€å®Ÿè¡Œã§ãã¾ã›ã‚“ã§ã—ãŸ(ãŠãらã資格キャッシュãŒãªã„ã€ã‚µãƒ¼ãƒãƒ¼ãŒã‚µãƒãƒ¼ãƒˆã—ã¦ã„ãªã„ã‚ã‚‹ã„ã¯ãƒ­ãƒ¼ã‚«ãƒ«ã‚½ã‚±ãƒƒãƒˆã§æŽ¥ç¶šã—ã¦ã„ã¾ã™)" - -#: fe-connect.c:3274 +#: fe-connect.c:3593 #, c-format msgid "could not send SSL negotiation packet: %s" msgstr "SSLãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ãƒ‘ケットをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-connect.c:3303 +#: fe-connect.c:3625 +#, c-format +msgid "could not send cancel packet: %s" +msgstr "キャンセルパケットをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: fe-connect.c:3655 #, c-format msgid "could not send startup packet: %s" msgstr "開始パケットをé€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-connect.c:3378 -#, c-format +#: fe-connect.c:3728 msgid "server does not support SSL, but SSL was required" -msgstr "サーãƒãƒ¼ã¯SSLをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“ãŒã€SSLãŒè¦æ±‚ã•れã¾ã—ãŸ" +msgstr "サーãƒãƒ¼ã¯SSLをサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“ãŒã€è¦æ±‚ã•れã¦ã„ã¾ã™" + +#: fe-connect.c:3738 +#, c-format +msgid "server sent an error response during SSL exchange" +msgstr "SSLãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰ã‚¨ãƒ©ãƒ¼å¿œç­”ãŒè¿”ã•れã¾ã—ãŸ" -#: fe-connect.c:3404 +#: fe-connect.c:3743 #, c-format msgid "received invalid response to SSL negotiation: %c" msgstr "SSLãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã«å¯¾ã—ã¦ä¸æ­£ãªå¿œç­”ã‚’å—ä¿¡ã—ã¾ã—ãŸ: %c" -#: fe-connect.c:3424 +#: fe-connect.c:3763 #, c-format msgid "received unencrypted data after SSL response" msgstr "SSL応答ã®å¾Œã«éžæš—å·åŒ–データをå—ä¿¡ã—ã¾ã—ãŸ" -#: fe-connect.c:3504 +#: fe-connect.c:3826 #, c-format +msgid "server sent an error response during GSS encryption exchange" +msgstr "GSSæš—å·åŒ–ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ä¸­ã«ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰ã‚¨ãƒ©ãƒ¼å¿œç­”ãŒè¿”ã•れã¾ã—ãŸ" + +#: fe-connect.c:3844 msgid "server doesn't support GSSAPI encryption, but it was required" -msgstr "サーãƒãƒ¼ã¯GSSAPIæš—å·åŒ–をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“ãŒã€è¦æ±‚ã•れã¾ã—ãŸ" +msgstr "サーãƒãƒ¼ãŒGSSAPIæš—å·åŒ–サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“ãŒã€è¦æ±‚ã•れã¦ã¾ã™" -#: fe-connect.c:3515 +#: fe-connect.c:3848 #, c-format msgid "received invalid response to GSSAPI negotiation: %c" msgstr "GSSAPIãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ã«å¯¾ã—ã¦ä¸æ­£ãªå¿œç­”ã‚’å—ä¿¡ã—ã¾ã—ãŸ: %c" -#: fe-connect.c:3533 +#: fe-connect.c:3870 #, c-format msgid "received unencrypted data after GSSAPI encryption response" msgstr "GSSAPIæš—å·åŒ–応答ã®å¾Œã«éžæš—å·åŒ–データをå—ä¿¡ã—ã¾ã—ãŸ" -#: fe-connect.c:3598 +#: fe-connect.c:3931 #, c-format msgid "expected authentication request from server, but received %c" msgstr "サーãƒãƒ¼ã‹ã‚‰ã®èªè¨¼è¦æ±‚を想定ã—ã¦ã„ã¾ã—ãŸãŒã€%cã‚’å—ä¿¡ã—ã¾ã—ãŸ" -#: fe-connect.c:3625 fe-connect.c:3794 +#: fe-connect.c:3959 fe-connect.c:4082 #, c-format msgid "received invalid authentication request" msgstr "䏿­£ãªèªè¨¼è¦æ±‚ã‚’å—ä¿¡ã—ã¾ã—ãŸ" -#: fe-connect.c:3630 fe-connect.c:3779 +#: fe-connect.c:3965 fe-connect.c:4067 #, c-format msgid "received invalid protocol negotiation message" msgstr "䏿­£ãªãƒ—ロトコルãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ã¾ã—ãŸ" -#: fe-connect.c:3648 fe-connect.c:3702 +#: fe-connect.c:3984 fe-connect.c:4038 #, c-format msgid "received invalid error message" msgstr "䏿­£ãªã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ã¾ã—ãŸ" -#: fe-connect.c:3865 +#: fe-connect.c:4149 +#, c-format +msgid "internal error: async authentication has no handler" +msgstr "内部エラー: éžåŒæœŸèªè¨¼ã®ãƒãƒ³ãƒ‰ãƒ©ãƒ¼ãŒã‚りã¾ã›ã‚“" + +#: fe-connect.c:4174 +#, c-format +msgid "internal error: async cleanup did not release polling socket" +msgstr "内部エラー: éžåŒæœŸã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—ãŒãƒãƒ¼ãƒªãƒ³ã‚°ä¸­ã®ã‚½ã‚±ãƒƒãƒˆã‚’解放ã—ã¾ã›ã‚“ã§ã—ãŸ" + +#: fe-connect.c:4197 +#, c-format +msgid "internal error: async authentication did not set a socket for polling" +msgstr "内部エラー: éžåŒæœŸèªè¨¼ãŒãƒãƒ¼ãƒªãƒ³ã‚°å¯¾è±¡ã®ã‚½ã‚±ãƒƒãƒˆã‚’設定ã—ã¾ã›ã‚“ã§ã—ãŸ" + +#: fe-connect.c:4230 #, c-format msgid "unexpected message from server during startup" msgstr "起動中ã«ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰æƒ³å®šå¤–ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚りã¾ã—ãŸ" -#: fe-connect.c:3956 +#: fe-connect.c:4321 #, c-format msgid "session is read-only" msgstr "セッションã¯èª­ã¿å–り専用ã§ã™" -#: fe-connect.c:3958 +#: fe-connect.c:4323 #, c-format msgid "session is not read-only" msgstr "セッションã¯èª­ã¿å–り専用ã§ã¯ã‚りã¾ã›ã‚“" -#: fe-connect.c:4011 +#: fe-connect.c:4376 #, c-format msgid "server is in hot standby mode" msgstr "サーãƒãƒ¼ã¯ãƒ›ãƒƒãƒˆã‚¹ã‚¿ãƒ³ãƒã‚¤ãƒ¢ãƒ¼ãƒ‰ã§ã™" -#: fe-connect.c:4013 +#: fe-connect.c:4378 #, c-format msgid "server is not in hot standby mode" msgstr "サーãƒãƒ¼ã¯ã‚¹ã‚¿ãƒ³ãƒã‚¤ãƒ¢ãƒ¼ãƒ‰ã§ã¯ã‚りã¾ã›ã‚“" -#: fe-connect.c:4129 fe-connect.c:4179 +#: fe-connect.c:4500 fe-connect.c:4550 #, c-format msgid "\"%s\" failed" msgstr "\"%s\"ãŒå¤±æ•—ã—ã¾ã—ãŸ" -#: fe-connect.c:4193 +#: fe-connect.c:4564 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption" msgstr "接続状態%dã¯ä¸æ­£ã§ã™ã€‚メモリ障害ã®å¯èƒ½æ€§ãŒã‚りã¾ã™" -#: fe-connect.c:5174 +#: fe-connect.c:5386 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://" msgstr "䏿­£ãªLDAP URL\"%s\":スキームã¯ldap://ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: fe-connect.c:5189 +#: fe-connect.c:5401 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name" msgstr "䏿­£ãªLDAP URL \"%s\": 識別åãŒã‚りã¾ã›ã‚“" -#: fe-connect.c:5201 fe-connect.c:5259 +#: fe-connect.c:5413 fe-connect.c:5471 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute" msgstr "䏿­£ãªLDAP URL \"%s\": ã¡ã‚‡ã†ã©1ã¤ã®å±žæ€§ã‚’æŒãŸãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: fe-connect.c:5213 fe-connect.c:5275 +#: fe-connect.c:5425 fe-connect.c:5487 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" msgstr "䏿­£ãªLDAP URL \"%s\": 検索スコープ(base/one/sub)ã‚’æŒãŸãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: fe-connect.c:5225 +#: fe-connect.c:5437 #, c-format msgid "invalid LDAP URL \"%s\": no filter" msgstr "䏿­£ãªLDAP URL \"%s\": フィルタãŒã‚りã¾ã›ã‚“" -#: fe-connect.c:5247 +#: fe-connect.c:5459 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number" msgstr "䏿­£ãªLDAP URL \"%s\": ãƒãƒ¼ãƒˆç•ªå·ãŒä¸æ­£ã§ã™" -#: fe-connect.c:5284 +#: fe-connect.c:5496 #, c-format msgid "could not create LDAP structure" msgstr "LDAP構造体を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: fe-connect.c:5359 +#: fe-connect.c:5571 #, c-format msgid "lookup on LDAP server failed: %s" msgstr "LDAPサーãƒãƒ¼ã§æ¤œç´¢ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: fe-connect.c:5369 +#: fe-connect.c:5581 #, c-format msgid "more than one entry found on LDAP lookup" msgstr "LDAPå‚ç…§ã§è¤‡æ•°ã®ã‚¨ãƒ³ãƒˆãƒªãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ" -#: fe-connect.c:5371 fe-connect.c:5382 +#: fe-connect.c:5583 fe-connect.c:5594 #, c-format msgid "no entry found on LDAP lookup" msgstr "LDAPå‚ç…§ã§ã‚¨ãƒ³ãƒˆãƒªãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: fe-connect.c:5392 fe-connect.c:5404 +#: fe-connect.c:5604 fe-connect.c:5616 #, c-format msgid "attribute has no values on LDAP lookup" msgstr "LDAPå‚ç…§ã§å±žæ€§ã«å€¤ãŒã‚りã¾ã›ã‚“" -#: fe-connect.c:5455 fe-connect.c:5474 fe-connect.c:5998 +#: fe-connect.c:5667 fe-connect.c:5686 fe-connect.c:6210 #, c-format msgid "missing \"=\" after \"%s\" in connection info string" msgstr "接続情報文字列ã«ãŠã„ã¦\"%s\"ã®å¾Œã«\"=\"ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: fe-connect.c:5545 fe-connect.c:6181 fe-connect.c:6979 +#: fe-connect.c:5757 fe-connect.c:6393 fe-connect.c:7223 #, c-format msgid "invalid connection option \"%s\"" msgstr "䏿­£ãªæŽ¥ç¶šã‚ªãƒ—ション\"%s\"" -#: fe-connect.c:5560 fe-connect.c:6046 +#: fe-connect.c:5772 fe-connect.c:6258 #, c-format msgid "unterminated quoted string in connection info string" msgstr "接続情報文字列内ã®é–‰ã˜ã¦ã„ãªã„引用符" -#: fe-connect.c:5640 +#: fe-connect.c:5852 #, c-format msgid "definition of service \"%s\" not found" msgstr "サービス定義\"%s\"ãŒã¿ã¤ã‹ã‚Šã¾ã›ã‚“" -#: fe-connect.c:5666 +#: fe-connect.c:5878 #, c-format msgid "service file \"%s\" not found" msgstr "サービスファイル\"%s\"ãŒã¿ã¤ã‹ã‚Šã¾ã›ã‚“" -#: fe-connect.c:5679 +#: fe-connect.c:5891 #, c-format msgid "line %d too long in service file \"%s\"" msgstr "サービスファイル\"%2$s\"ã®è¡Œ%1$dãŒé•·ã™ãŽã¾ã™" -#: fe-connect.c:5750 fe-connect.c:5793 +#: fe-connect.c:5962 fe-connect.c:6005 #, c-format msgid "syntax error in service file \"%s\", line %d" msgstr "サービスファイル\"%s\"ã®è¡Œ%dã§æ§‹æ–‡ã‚¨ãƒ©ãƒ¼" -#: fe-connect.c:5761 +#: fe-connect.c:5973 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d" msgstr "サービスファイル\"%s\"ã€è¡Œ%dã§ã®ãƒã‚¹ãƒˆã—ãŸã‚µãƒ¼ãƒ“ス指定ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: fe-connect.c:6500 +#: fe-connect.c:6712 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"" msgstr "内部パーサ処ç†ã¸ä¼æ’­ã—ãŸä¸æ­£ãªURI: \"%s\"" -#: fe-connect.c:6577 +#: fe-connect.c:6789 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"" msgstr "URI \"%s\"内ã®IPv6ホストアドレスã«ãŠã„ã¦å¯¾å¿œã™ã‚‹\"]\"を探ã—ã¦ã„ã‚‹é–“ã«æ–‡å­—列ãŒçµ‚ã‚りã¾ã—ãŸ" -#: fe-connect.c:6584 +#: fe-connect.c:6796 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"" msgstr "URI内ã§ã¯IPv6ホストアドレスã¯ç©ºã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“: \"%s\"" -#: fe-connect.c:6599 +#: fe-connect.c:6811 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"" msgstr "URI内ã®ä½ç½®%2$dã«æƒ³å®šå¤–ã®æ–‡å­—\"%1$c\"ãŒã‚りã¾ã™(\":\"ã¾ãŸã¯\"/\"を期待ã—ã¦ã„ã¾ã—ãŸ): \"%3$s\"" -#: fe-connect.c:6728 +#: fe-connect.c:6940 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "URIå•ã„åˆã‚ã›ãƒ‘ラメータ内ã«ã‚­ãƒ¼ã¨å€¤ã‚’分ã‘ã‚‹\"=\"ãŒä½™åˆ†ã«ã‚りã¾ã™: \"%s\"" -#: fe-connect.c:6748 +#: fe-connect.c:6960 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "URIå•ã„åˆã‚ã›ãƒ‘ラメータ内ã«ã‚­ãƒ¼ã¨å€¤ã‚’分ã‘ã‚‹\\\"=\\\"ãŒã‚りã¾ã›ã‚“: \"%s\"" -#: fe-connect.c:6800 +#: fe-connect.c:7012 #, c-format msgid "invalid URI query parameter: \"%s\"" msgstr "䏿­£ãªURIå•ã„åˆã‚ã›ãƒ‘ラメータ:\"%s\"" -#: fe-connect.c:6874 +#: fe-connect.c:7096 #, c-format msgid "invalid percent-encoded token: \"%s\"" msgstr "䏿­£ãªãƒ‘ーセント符å·åŒ–トークン: \"%s\"" -#: fe-connect.c:6884 +#: fe-connect.c:7106 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"" msgstr "パーセント符å·åŒ–ã•れãŸå€¤ã§ã¯å€¤%%00ã¯è¨±ã•れã¾ã›ã‚“: \"%s\"" -#: fe-connect.c:7248 +#: fe-connect.c:7128 +#, c-format +msgid "unexpected spaces found in \"%s\", use percent-encoded spaces (%%20) instead" +msgstr "\"%s\"ã«äºˆæœŸã—ãªã„空白文字ãŒã‚りã¾ã™ã€ä»£ã‚りã«ãƒ‘ーセントエンコードã•れãŸç©ºç™½æ–‡å­—(%%20)を使用ã—ã¦ãã ã•ã„" + +#: fe-connect.c:7510 msgid "connection pointer is NULL\n" msgstr "接続ãƒã‚¤ãƒ³ã‚¿ã¯NULLã§ã™\n" -#: fe-connect.c:7256 fe-exec.c:710 fe-exec.c:970 fe-exec.c:3292 -#: fe-protocol3.c:974 fe-protocol3.c:1007 +#: fe-connect.c:7518 fe-exec.c:713 fe-exec.c:975 fe-exec.c:3459 +#: fe-protocol3.c:987 fe-protocol3.c:1020 msgid "out of memory\n" msgstr "メモリä¸è¶³\n" -#: fe-connect.c:7547 +#: fe-connect.c:7820 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "WARNING: パスワードファイル\"%s\"ãŒãƒ†ã‚­ã‚¹ãƒˆãƒ•ァイルã§ã¯ã‚りã¾ã›ã‚“\n" -#: fe-connect.c:7556 +#: fe-connect.c:7830 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "警告: パスワードファイル \"%s\" ãŒã‚°ãƒ«ãƒ¼ãƒ—メンãƒã‚‚ã—ãã¯ä»–ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‹ã‚‰èª­ã‚る状態ã«ãªã£ã¦ã„ã¾ã™ã€‚ã“ã®æ¨©é™ã¯u=rw (0600)以下ã«ã™ã¹ãã§ã™\n" -#: fe-connect.c:7663 +#: fe-connect.c:7934 #, c-format msgid "password retrieved from file \"%s\"" msgstr "パスワードã¯ãƒ•ァイル\"%s\"ã‹ã‚‰å–り出ã—ã¾ã—ãŸ" -#: fe-exec.c:466 fe-exec.c:3366 +#: fe-connect.c:8100 +#, c-format +msgid "invalid integer value \"%s\" for connection option \"%s\"" +msgstr "接続オプション\"%2$s\"ã«å¯¾ã™ã‚‹ä¸æ­£ãªæ•´æ•°å€¤\"%1$s\"" + +#: fe-exec.c:469 fe-exec.c:3533 #, c-format msgid "row number %d is out of range 0..%d" msgstr "行番å·%dã¯0..%dã®ç¯„囲を超ãˆã¦ã„ã¾ã™" -#: fe-exec.c:528 fe-protocol3.c:1976 +#: fe-exec.c:531 fe-protocol3.c:1985 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:831 +#: fe-exec.c:834 #, c-format msgid "write to server failed" msgstr "サーãƒãƒ¼ã¸ã®æ›¸ãè¾¼ã¿ã«å¤±æ•—" -#: fe-exec.c:869 +#: fe-exec.c:874 #, c-format msgid "no error text available" msgstr "エラー文字列ãŒã‚りã¾ã›ã‚“" -#: fe-exec.c:958 +#: fe-exec.c:963 msgid "NOTICE" msgstr "注æ„" -#: fe-exec.c:1016 +#: fe-exec.c:1021 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresultã¯INT_MAX個以上ã®ã‚¿ãƒ—ルを扱ãˆã¾ã›ã‚“" -#: fe-exec.c:1028 +#: fe-exec.c:1033 msgid "size_t overflow" msgstr "size_t オーãƒãƒ¼ãƒ•ロー" -#: fe-exec.c:1444 fe-exec.c:1513 fe-exec.c:1559 +#: fe-exec.c:1438 fe-exec.c:1507 fe-exec.c:1553 #, c-format msgid "command string is a null pointer" msgstr "コマンド文字列ãŒãƒŒãƒ«ãƒã‚¤ãƒ³ã‚¿ã§ã™" -#: fe-exec.c:1450 fe-exec.c:2888 +#: fe-exec.c:1444 fe-exec.c:3003 #, c-format msgid "%s not allowed in pipeline mode" msgstr "%sã¯ãƒ‘イプラインモードã§ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“" -#: fe-exec.c:1518 fe-exec.c:1564 fe-exec.c:1658 +#: fe-exec.c:1512 fe-exec.c:1558 fe-exec.c:1652 #, c-format msgid "number of parameters must be between 0 and %d" msgstr "パラメータ数ã¯0ã‹ã‚‰%dã¾ã§ã®é–“ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: fe-exec.c:1554 fe-exec.c:1653 +#: fe-exec.c:1548 fe-exec.c:1647 #, c-format msgid "statement name is a null pointer" msgstr "æ–‡ã®åå‰ãŒãƒŒãƒ«ãƒã‚¤ãƒ³ã‚¿ã§ã™" -#: fe-exec.c:1695 fe-exec.c:3220 +#: fe-exec.c:1689 fe-exec.c:3379 #, c-format msgid "no connection to the server" msgstr "サーãƒãƒ¼ã¸ã®æŽ¥ç¶šãŒã‚りã¾ã›ã‚“" -#: fe-exec.c:1703 fe-exec.c:3228 +#: fe-exec.c:1697 fe-exec.c:3387 #, c-format msgid "another command is already in progress" msgstr "ä»–ã®ã‚³ãƒžãƒ³ãƒ‰ãŒã™ã§ã«å‡¦ç†ä¸­ã§ã™" -#: fe-exec.c:1733 +#: fe-exec.c:1727 #, c-format msgid "cannot queue commands during COPY" msgstr "COPY中ã¯ã‚³ãƒžãƒ³ãƒ‰ã®ã‚­ãƒ¥ãƒ¼ã‚¤ãƒ³ã‚°ã¯ã§ãã¾ã›ã‚“" -#: fe-exec.c:1850 +#: fe-exec.c:1846 #, c-format msgid "length must be given for binary parameter" msgstr "ãƒã‚¤ãƒŠãƒªãƒ‘ラメータã«ã¯é•·ã•を指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™" -#: fe-exec.c:2171 +#: fe-exec.c:2205 #, c-format msgid "unexpected asyncStatus: %d" msgstr "想定外ã®asyncStatus: %d" -#: fe-exec.c:2327 +#: fe-exec.c:2361 #, c-format msgid "synchronous command execution functions are not allowed in pipeline mode" msgstr "åŒæœŸçš„ã«ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚‹é–¢æ•°ã¯ãƒ‘イプラインモード中ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“" -#: fe-exec.c:2344 +#: fe-exec.c:2378 msgid "COPY terminated by new PQexec" msgstr "æ–°ãŸãªPQexec\"ã«ã‚ˆã‚ŠCOPYãŒçµ‚了ã—ã¾ã—ãŸ" -#: fe-exec.c:2360 +#: fe-exec.c:2394 #, c-format msgid "PQexec not allowed during COPY BOTH" msgstr "COPY BOTH 実行中㮠PQexec ã¯è¨±å¯ã•れã¦ã„ã¾ã›ã‚“" -#: fe-exec.c:2586 fe-exec.c:2641 fe-exec.c:2709 fe-protocol3.c:1907 +#: fe-exec.c:2630 +#, c-format +msgid "unrecognized message type \"%c\"" +msgstr "èªè­˜ã§ããªã„メッセージタイプ\"%c\"" + +#: fe-exec.c:2702 fe-exec.c:2756 fe-exec.c:2824 fe-protocol3.c:1916 #, c-format msgid "no COPY in progress" msgstr "実行中ã®COPYã¯ã‚りã¾ã›ã‚“" -#: fe-exec.c:2895 +#: fe-exec.c:3010 #, c-format msgid "connection in wrong state" msgstr "接続状態ãŒç•°å¸¸ã§ã™" -#: fe-exec.c:2938 +#: fe-exec.c:3053 #, c-format msgid "cannot enter pipeline mode, connection not idle" msgstr "パイプラインモードã«å…¥ã‚Œã¾ã›ã‚“ã€æŽ¥ç¶šãŒã‚¢ã‚¤ãƒ‰ãƒ«çŠ¶æ…‹ã§ã¯ã‚りã¾ã›ã‚“" -#: fe-exec.c:2974 fe-exec.c:2995 +#: fe-exec.c:3089 fe-exec.c:3110 #, c-format msgid "cannot exit pipeline mode with uncollected results" msgstr "未回åŽã®çµæžœãŒæ®‹ã£ã¦ã„る状態ã§ãƒ‘イプラインモードを抜ã‘ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: fe-exec.c:2978 +#: fe-exec.c:3093 #, c-format msgid "cannot exit pipeline mode while busy" msgstr "ビジー状態ã§ãƒ‘イプラインモードを抜ã‘ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: fe-exec.c:2989 +#: fe-exec.c:3104 #, c-format msgid "cannot exit pipeline mode while in COPY" msgstr "COPY実行中ã«ãƒ‘イプラインモードを抜ã‘ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: fe-exec.c:3154 +#: fe-exec.c:3303 #, c-format msgid "cannot send pipeline when not in pipeline mode" msgstr "パイプラインモード外ã§ãƒ‘イプラインé€å‡ºã¯ã§ãã¾ã›ã‚“" -#: fe-exec.c:3255 +#: fe-exec.c:3422 msgid "invalid ExecStatusType code" msgstr "ExecStatusTypeコードãŒä¸æ­£ã§ã™" -#: fe-exec.c:3282 +#: fe-exec.c:3449 msgid "PGresult is not an error result\n" msgstr "PGresutãŒã‚¨ãƒ©ãƒ¼çµæžœã§ã¯ã‚りã¾ã›ã‚“\n" -#: fe-exec.c:3350 fe-exec.c:3373 +#: fe-exec.c:3517 fe-exec.c:3540 #, c-format msgid "column number %d is out of range 0..%d" msgstr "列番å·%dã¯0..%dã®ç¯„囲を超ãˆã¦ã„ã¾ã™" -#: fe-exec.c:3388 +#: fe-exec.c:3555 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "パラメータ%dã¯0..%dã®ç¯„囲を超ãˆã¦ã„ã¾ã™" -#: fe-exec.c:3699 +#: fe-exec.c:3866 #, c-format msgid "could not interpret result from server: %s" msgstr "サーãƒãƒ¼ã‹ã‚‰ã®çµæžœã‚’解釈ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-exec.c:3964 fe-exec.c:4054 +#: fe-exec.c:4126 fe-exec.c:4260 #, c-format msgid "incomplete multibyte character" msgstr "ä¸å®Œå…¨ãªãƒžãƒ«ãƒãƒã‚¤ãƒˆæ–‡å­—" +#: fe-exec.c:4153 fe-exec.c:4279 +#, c-format +msgid "invalid multibyte character" +msgstr "䏿­£ãªãƒžãƒ«ãƒãƒã‚¤ãƒˆæ–‡å­—" + #: fe-gssapi-common.c:122 msgid "GSSAPI name import error" msgstr "GSSAPIåã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã‚¨ãƒ©ãƒ¼" @@ -981,23 +1084,18 @@ msgstr "ファイル\"%s\"ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s" msgid "query to initialize large object functions did not return data" msgstr "ãƒ©ãƒ¼ã‚¸ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆæ©Ÿèƒ½ã‚’åˆæœŸåŒ–ã™ã‚‹å•ã„åˆã‚ã›ãŒãƒ‡ãƒ¼ã‚¿ã‚’è¿”ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: fe-misc.c:240 +#: fe-misc.c:239 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "サイズ%luã®æ•´æ•°ã¯pqGetIntã§ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: fe-misc.c:273 +#: fe-misc.c:272 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "サイズ%luã®æ•´æ•°ã¯pqPutIntã§ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: fe-misc.c:573 -#, c-format -msgid "connection not open" -msgstr "接続ã¯ã‚ªãƒ¼ãƒ—ンã•れã¦ã„ã¾ã›ã‚“" - -#: fe-misc.c:751 fe-secure-openssl.c:215 fe-secure-openssl.c:315 -#: fe-secure.c:257 fe-secure.c:419 +#: fe-misc.c:765 fe-secure-openssl.c:180 fe-secure-openssl.c:286 +#: fe-secure.c:222 fe-secure.c:389 #, c-format msgid "" "server closed the connection unexpectedly\n" @@ -1008,171 +1106,171 @@ msgstr "" " ãŠãらãè¦æ±‚ã®å‡¦ç†å‰ã¾ãŸã¯å‡¦ç†ä¸­ã«ã‚µãƒ¼ãƒãƒ¼ãŒç•°å¸¸çµ‚了\n" " ã—ãŸã“ã¨ã‚’æ„味ã—ã¦ã„ã¾ã™ã€‚" -#: fe-misc.c:818 +#: fe-misc.c:832 msgid "connection not open\n" msgstr "接続ã¯ã‚ªãƒ¼ãƒ—ンã•れã¦ã„ã¾ã›ã‚“\n" -#: fe-misc.c:1003 +#: fe-misc.c:1020 #, c-format msgid "timeout expired" msgstr "タイムアウト期間ãŒéŽãŽã¾ã—ãŸ" -#: fe-misc.c:1047 +#: fe-misc.c:1072 #, c-format msgid "invalid socket" msgstr "䏿­£ãªã‚½ã‚±ãƒƒãƒˆã§ã™" -#: fe-misc.c:1069 +#: fe-misc.c:1095 #, c-format msgid "%s() failed: %s" msgstr "%s() ãŒå¤±æ•—ã—ã¾ã—ãŸ: %s" -#: fe-protocol3.c:182 +#: fe-protocol3.c:187 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "待機中ã«ã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ç¨®é¡ž0x%02xãŒå±Šãã¾ã—ãŸ" -#: fe-protocol3.c:385 +#: fe-protocol3.c:402 #, c-format msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" msgstr "サーãƒãƒ¼ãŒå…ˆè¡Œã®è¡Œè¨˜è¿°(\"T\"メッセージ)ãªã—ã§ãƒ‡ãƒ¼ã‚¿(\"D\"メッセージ)ã‚’é€ä¿¡ã—ã¾ã—ãŸ" -#: fe-protocol3.c:427 +#: fe-protocol3.c:444 #, c-format msgid "unexpected response from server; first received character was \"%c\"" msgstr "サーãƒãƒ¼ã‹ã‚‰æƒ³å®šå¤–ã®å¿œç­”ãŒã‚りã¾ã—ãŸã€‚å—ã‘付ã‘ãŸå…ˆé ­æ–‡å­—ã¯\"%c\"ã§ã™" -#: fe-protocol3.c:450 +#: fe-protocol3.c:463 #, c-format msgid "message contents do not agree with length in message type \"%c\"" msgstr "メッセージã®å†…容ãŒãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—\"%c\"ã§ã®é•·ã•ã¨åˆã£ã¦ã„ã¾ã›ã‚“" -#: fe-protocol3.c:468 +#: fe-protocol3.c:481 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d" msgstr "サーãƒãƒ¼ã¨ã®åŒæœŸãŒå¤±ã‚れã¾ã—ãŸã€‚å—ä¿¡ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚¿ã‚¤ãƒ—ã¯\"%c\"ã€é•·ã•ã¯%d" -#: fe-protocol3.c:520 fe-protocol3.c:560 +#: fe-protocol3.c:533 fe-protocol3.c:573 msgid "insufficient data in \"T\" message" msgstr "\"T\"メッセージ内ã®ãƒ‡ãƒ¼ã‚¿ãŒä¸å分ã§ã™" -#: fe-protocol3.c:631 fe-protocol3.c:837 +#: fe-protocol3.c:644 fe-protocol3.c:850 msgid "out of memory for query result" msgstr "å•ã„åˆã‚ã›çµæžœç”¨ã®ãƒ¡ãƒ¢ãƒªãŒä¸è¶³ã—ã¦ã„ã¾ã™" -#: fe-protocol3.c:700 +#: fe-protocol3.c:713 msgid "insufficient data in \"t\" message" msgstr "\"t\"メッセージ内ã®ãƒ‡ãƒ¼ã‚¿ãŒè¶³ã‚Šã¾ã›ã‚“" -#: fe-protocol3.c:759 fe-protocol3.c:791 fe-protocol3.c:809 +#: fe-protocol3.c:772 fe-protocol3.c:804 fe-protocol3.c:822 msgid "insufficient data in \"D\" message" msgstr "\"D\"\"メッセージ内ã®ãƒ‡ãƒ¼ã‚¿ãŒä¸å分ã§ã™" -#: fe-protocol3.c:765 +#: fe-protocol3.c:778 msgid "unexpected field count in \"D\" message" msgstr "\"D\"メッセージ内ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰æ•°ãŒæƒ³å®šå¤–ã§ã™ã€‚" -#: fe-protocol3.c:1020 +#: fe-protocol3.c:1033 msgid "no error message available\n" msgstr "エラーメッセージãŒã‚りã¾ã›ã‚“\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1068 fe-protocol3.c:1087 +#: fe-protocol3.c:1081 fe-protocol3.c:1100 #, c-format msgid " at character %s" msgstr "(文字ä½ç½®: %s)" -#: fe-protocol3.c:1100 +#: fe-protocol3.c:1113 #, c-format msgid "DETAIL: %s\n" msgstr "DETAIL: %s\n" -#: fe-protocol3.c:1103 +#: fe-protocol3.c:1116 #, c-format msgid "HINT: %s\n" msgstr "HINT: %s\n" -#: fe-protocol3.c:1106 +#: fe-protocol3.c:1119 #, c-format msgid "QUERY: %s\n" msgstr "QUERY: %s\n" -#: fe-protocol3.c:1113 +#: fe-protocol3.c:1126 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXT: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1135 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMA NAME: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1139 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABLE NAME: %s\n" -#: fe-protocol3.c:1130 +#: fe-protocol3.c:1143 #, c-format msgid "COLUMN NAME: %s\n" msgstr "COLUMN NAME: %s\n" -#: fe-protocol3.c:1134 +#: fe-protocol3.c:1147 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATATYPE NAME: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1151 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "CONSTRAINT NAME: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1163 msgid "LOCATION: " msgstr "LOCATION: " -#: fe-protocol3.c:1152 +#: fe-protocol3.c:1165 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1167 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1349 +#: fe-protocol3.c:1362 #, c-format msgid "LINE %d: " msgstr "行 %d: " -#: fe-protocol3.c:1423 +#: fe-protocol3.c:1436 #, c-format msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u" msgstr "サーãƒãƒ¼ã¯ã“ã®ãƒ—ロトコルãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。クライアントã¯%u.%uを使用〠サーãƒãƒ¼ã¯%u.%uã¾ã§ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™" -#: fe-protocol3.c:1429 +#: fe-protocol3.c:1442 #, c-format msgid "protocol extension not supported by server: %s" msgid_plural "protocol extensions not supported by server: %s" msgstr[0] "サーãƒãƒ¼ã§ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ãªã„プロトコル拡張: %s" -#: fe-protocol3.c:1437 +#: fe-protocol3.c:1450 #, c-format msgid "invalid %s message" msgstr "䏿­£ãª%sメッセージ" -#: fe-protocol3.c:1802 +#: fe-protocol3.c:1811 #, c-format msgid "PQgetline: not doing text COPY OUT" msgstr "PQgetline: テキストã®COPY OUTを行ã£ã¦ã„ã¾ã›ã‚“" -#: fe-protocol3.c:2176 +#: fe-protocol3.c:2186 #, c-format msgid "protocol error: no function result" msgstr "プロトコルエラー: 関数ã®çµæžœãŒã‚りã¾ã›ã‚“" -#: fe-protocol3.c:2187 +#: fe-protocol3.c:2198 #, c-format msgid "protocol error: id=0x%x" msgstr "プロトコルエラー: id=0x%x" @@ -1213,255 +1311,270 @@ msgstr "\"%s\"ã®ã‚µãƒ¼ãƒãƒ¼è¨¼æ˜Žæ›¸ãŒãƒ›ã‚¹ãƒˆå\"%s\"ã¨ãƒžãƒƒãƒã—ã¾ã› msgid "could not get server's host name from server certificate" msgstr "サーãƒãƒ¼è¨¼æ˜Žæ›¸ã‹ã‚‰ã‚µãƒ¼ãƒãƒ¼ã®ãƒ›ã‚¹ãƒˆåã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: fe-secure-gssapi.c:201 +#: fe-secure-gssapi.c:194 msgid "GSSAPI wrap error" msgstr "GSSAPIåラップエラー" -#: fe-secure-gssapi.c:208 +#: fe-secure-gssapi.c:201 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "é€å‡ºã•れるGSSAPIãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æ©Ÿå¯†æ€§ãŒé©ç”¨ã•れã¾ã›ã‚“" -#: fe-secure-gssapi.c:215 +#: fe-secure-gssapi.c:208 #, c-format msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "クライアントã¯éŽå¤§ãªGSSAPIパケットをé€ä¿¡ã—よã†ã¨ã—ã¾ã—ãŸ: (%zu > %zu)" -#: fe-secure-gssapi.c:351 fe-secure-gssapi.c:593 +#: fe-secure-gssapi.c:347 fe-secure-gssapi.c:589 #, c-format msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" msgstr "éŽå¤§ãªGSSAPIパケットãŒã‚µãƒ¼ãƒãƒ¼ã‹ã‚‰é€å‡ºã•れã¾ã—ãŸ: (%zu > %zu)" -#: fe-secure-gssapi.c:390 +#: fe-secure-gssapi.c:386 msgid "GSSAPI unwrap error" msgstr "GSSAPIアンラップエラー" -#: fe-secure-gssapi.c:399 +#: fe-secure-gssapi.c:395 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "到ç€ã—ãŸGSSAPIメッセージã«ã¯æ©Ÿå¯†æ€§ãŒé©ç”¨ã•れã¦ã„ã¾ã›ã‚“" -#: fe-secure-gssapi.c:656 +#: fe-secure-gssapi.c:652 msgid "could not initiate GSSAPI security context" msgstr "GSSAPIセキュリティコンテキストを開始ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: fe-secure-gssapi.c:685 +#: fe-secure-gssapi.c:681 msgid "GSSAPI size check error" msgstr "GSSAPIサイズãƒã‚§ãƒƒã‚¯ã‚¨ãƒ©ãƒ¼" -#: fe-secure-gssapi.c:696 +#: fe-secure-gssapi.c:692 msgid "GSSAPI context establishment error" msgstr "GSSAPIコンテクスト確立エラー" -#: fe-secure-openssl.c:219 fe-secure-openssl.c:319 fe-secure-openssl.c:1531 +#: fe-secure-openssl.c:184 fe-secure-openssl.c:290 fe-secure-openssl.c:1320 #, c-format msgid "SSL SYSCALL error: %s" msgstr "SSL SYSCALLエラー: %s" -#: fe-secure-openssl.c:225 fe-secure-openssl.c:325 fe-secure-openssl.c:1534 +#: fe-secure-openssl.c:190 fe-secure-openssl.c:296 fe-secure-openssl.c:1323 #, c-format msgid "SSL SYSCALL error: EOF detected" msgstr "SSL SYSCALLエラー: EOFを検出" -#: fe-secure-openssl.c:235 fe-secure-openssl.c:335 fe-secure-openssl.c:1542 +#: fe-secure-openssl.c:200 fe-secure-openssl.c:306 fe-secure-openssl.c:1331 #, c-format msgid "SSL error: %s" msgstr "SSLエラー: %s" -#: fe-secure-openssl.c:249 fe-secure-openssl.c:349 +#: fe-secure-openssl.c:214 fe-secure-openssl.c:320 #, c-format msgid "SSL connection has been closed unexpectedly" msgstr "SSLæŽ¥ç¶šãŒæ„図ã›ãšã«ã‚¯ãƒ­ãƒ¼ã‚ºã•れã¾ã—ãŸ" -#: fe-secure-openssl.c:254 fe-secure-openssl.c:354 fe-secure-openssl.c:1589 +#: fe-secure-openssl.c:219 fe-secure-openssl.c:325 fe-secure-openssl.c:1378 #, c-format msgid "unrecognized SSL error code: %d" msgstr "èªè­˜ã§ããªã„SSLエラーコード: %d" -#: fe-secure-openssl.c:397 +#: fe-secure-openssl.c:367 #, c-format msgid "could not determine server certificate signature algorithm" msgstr "サーãƒãƒ¼è¨¼æ˜Žæ›¸ã®ç½²åアルゴリズムを特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: fe-secure-openssl.c:417 +#: fe-secure-openssl.c:387 #, c-format msgid "could not find digest for NID %s" msgstr "NID %sã®ãƒ€ã‚¤ã‚¸ã‚§ã‚¹ãƒˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ" -#: fe-secure-openssl.c:426 +#: fe-secure-openssl.c:396 #, c-format msgid "could not generate peer certificate hash" msgstr "接続先ã®è¨¼æ˜Žæ›¸ãƒãƒƒã‚·ãƒ¥ã®ç”Ÿæˆã«å¤±æ•—ã—ã¾ã—ãŸ" -#: fe-secure-openssl.c:509 +#: fe-secure-openssl.c:478 #, c-format msgid "SSL certificate's name entry is missing" msgstr "SSL証明書ã«åå‰ã®ã‚¨ãƒ³ãƒˆãƒªãŒã‚りã¾ã›ã‚“" -#: fe-secure-openssl.c:543 +#: fe-secure-openssl.c:508 #, c-format msgid "SSL certificate's address entry is missing" msgstr "SSL証明書ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ã‚¨ãƒ³ãƒˆãƒªãŒã‚りã¾ã›ã‚“" -#: fe-secure-openssl.c:960 +#: fe-secure-openssl.c:731 #, c-format msgid "could not create SSL context: %s" msgstr "SSLコンテキストを作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1002 +#: fe-secure-openssl.c:773 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version" msgstr "SSLプロトコル最å°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%s\"" -#: fe-secure-openssl.c:1012 +#: fe-secure-openssl.c:783 #, c-format msgid "could not set minimum SSL protocol version: %s" msgstr "SSLプロトコル最å°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1028 +#: fe-secure-openssl.c:799 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version" msgstr "SSLプロトコル最大ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«å¯¾ã™ã‚‹ä¸æ­£ãªå€¤\"%s\"" -#: fe-secure-openssl.c:1038 +#: fe-secure-openssl.c:809 #, c-format msgid "could not set maximum SSL protocol version: %s" msgstr "SSLプロトコル最大ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1076 +#: fe-secure-openssl.c:847 #, c-format msgid "could not load system root certificate paths: %s" msgstr "システムルート証明書パスをロードã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1093 +#: fe-secure-openssl.c:864 #, c-format msgid "could not read root certificate file \"%s\": %s" msgstr "ルート証明書ファイル\"%s\"を読ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1145 +#: fe-secure-openssl.c:916 #, c-format msgid "" "could not get home directory to locate root certificate file\n" "Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." msgstr "" "ルート証明書ファイルを特定ã™ã‚‹ãŸã‚ã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ\n" -"ファイルを用æ„ã™ã‚‹ã€ sslrootcert=systemã§ã—ã™ã¦ã‚€ã®ä¿¡é ¼æ¸ˆã¿ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ã‚’使用ã™ã‚‹ã€ã¾ãŸã¯ sslmode を変更ã—ã¦ã‚µãƒ¼ãƒãƒ¼è¨¼æ˜Žæ›¸ã®æ¤œè¨¼ã‚’無効ã«ã—ã¦ãã ã•ã„。" +"ファイルを用æ„ã™ã‚‹ã€ sslrootcert=systemã§ã‚·ã‚¹ãƒ†ãƒ ã®ä¿¡é ¼æ¸ˆã¿ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ã‚’使用ã™ã‚‹ã€ã¾ãŸã¯ sslmode を変更ã—ã¦ã‚µãƒ¼ãƒãƒ¼è¨¼æ˜Žæ›¸ã®æ¤œè¨¼ã‚’無効ã«ã—ã¦ãã ã•ã„。" -#: fe-secure-openssl.c:1148 +#: fe-secure-openssl.c:919 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" "Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." msgstr "" "ルート証明書ファイル\"%s\"ãŒå­˜åœ¨ã—ã¾ã›ã‚“\n" -"ファイルを用æ„ã™ã‚‹ã€sslrootcert=systemã§ã—ã™ã¦ã‚€ã®ä¿¡é ¼æ¸ˆã¿ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ã‚’使用ã™ã‚‹ã€ã¾ãŸã¯sslmodeを変更ã—ã¦ã‚µãƒ¼ãƒãƒ¼è¨¼æ˜Žæ›¸ã®æ¤œè¨¼ã‚’無効ã«ã—ã¦ãã ã•ã„。" +"ファイルを用æ„ã™ã‚‹ã€sslrootcert=systemã§ã‚·ã‚¹ãƒ†ãƒ ã®ä¿¡é ¼æ¸ˆã¿ãƒ«ãƒ¼ãƒˆè¨¼æ˜Žæ›¸ã‚’使用ã™ã‚‹ã€ã¾ãŸã¯sslmodeを変更ã—ã¦ã‚µãƒ¼ãƒãƒ¼è¨¼æ˜Žæ›¸ã®æ¤œè¨¼ã‚’無効ã«ã—ã¦ãã ã•ã„。" -#: fe-secure-openssl.c:1183 +#: fe-secure-openssl.c:954 #, c-format msgid "could not open certificate file \"%s\": %s" msgstr "証明書ファイル\"%s\"をオープンã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1201 +#: fe-secure-openssl.c:972 #, c-format msgid "could not read certificate file \"%s\": %s" msgstr "証明書ファイル\"%s\"を読ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1225 +#: fe-secure-openssl.c:996 #, c-format msgid "could not establish SSL connection: %s" msgstr "SSL接続を確立ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1257 +#: fe-secure-openssl.c:1028 #, c-format msgid "could not set SSL Server Name Indication (SNI): %s" msgstr "SSLサーãƒãƒ¼å表示(SNI)を設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1300 +#: fe-secure-openssl.c:1045 +#, c-format +msgid "could not set SSL ALPN extension: %s" +msgstr "SSL ALPN拡張を設定ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: fe-secure-openssl.c:1088 #, c-format msgid "could not load SSL engine \"%s\": %s" msgstr "SSLエンジン\"%s\"を読ã¿è¾¼ã¿ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1311 +#: fe-secure-openssl.c:1099 #, c-format msgid "could not initialize SSL engine \"%s\": %s" msgstr "SSLエンジン\"%s\"ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1326 +#: fe-secure-openssl.c:1114 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" msgstr "SSL秘密éµ\"%s\"をエンジン\"%s\"ã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1339 +#: fe-secure-openssl.c:1127 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" msgstr "SSL秘密éµ\"%s\"をエンジン\"%s\"ã‹ã‚‰èª­ã¿å–れã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1376 +#: fe-secure-openssl.c:1164 #, c-format msgid "certificate present, but not private key file \"%s\"" msgstr "証明書ã¯ã‚りã¾ã™ãŒã€ç§˜å¯†éµãƒ•ァイル\"%s\"ã¯ã‚りã¾ã›ã‚“" -#: fe-secure-openssl.c:1379 +#: fe-secure-openssl.c:1167 #, c-format msgid "could not stat private key file \"%s\": %m" msgstr "秘密éµãƒ•ァイル\"%s\"ã‚’statã§ãã¾ã›ã‚“ã§ã—ãŸ: %m" -#: fe-secure-openssl.c:1387 +#: fe-secure-openssl.c:1175 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "秘密éµãƒ•ァイル\"%s\"ã¯é€šå¸¸ã®ãƒ•ァイルã§ã¯ã‚りã¾ã›ã‚“" -#: fe-secure-openssl.c:1420 +#: fe-secure-openssl.c:1208 #, c-format msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root" msgstr "秘密éµãƒ•ァイル\"%s\"ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«å¯¾ã—ã¦ã€ã‚‚ã—ãã¯ç„¡åˆ¶é™ã«ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¦ã„ã¾ã™; ファイルã®ãƒ‘ーミッション㯠u=rw (0600) ã‹ãれよりも狭ã„å¿…è¦ãŒã‚りã¾ã™ã€rootãŒæ‰€æœ‰ã—ã¦ã„ã‚‹å ´åˆã¯ u=rw,g=r (0640) ã‹ãれよりも狭ã„å¿…è¦ãŒã‚りã¾ã™" -#: fe-secure-openssl.c:1444 +#: fe-secure-openssl.c:1232 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "秘密éµãƒ•ァイル\"%s\"をロードã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1460 +#: fe-secure-openssl.c:1248 #, c-format msgid "certificate does not match private key file \"%s\": %s" msgstr "証明書ã¨ç§˜å¯†éµãƒ•ァイル\"%s\"ãŒä¸€è‡´ã—ã¾ã›ã‚“: %s" -#: fe-secure-openssl.c:1528 +#: fe-secure-openssl.c:1317 #, c-format msgid "SSL error: certificate verify failed: %s" msgstr "SSLエラー: è¨¼æ˜Žæ›¸ã®æ¤œè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ: %s" -#: fe-secure-openssl.c:1573 +#: fe-secure-openssl.c:1362 #, c-format msgid "This may indicate that the server does not support any SSL protocol version between %s and %s." msgstr "ã“ã®ã“ã¨ã¯ã€ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆãŒSSLプロトコルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³%sã‹ã‚‰%sã®é–“ã®ã„ãšã‚Œã‚‚サãƒãƒ¼ãƒˆã—ã¦ã„ãªã„ã“ã¨ã‚’示唆ã—ã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。" -#: fe-secure-openssl.c:1606 +#: fe-secure-openssl.c:1394 +#, c-format +msgid "direct SSL connection was established without ALPN protocol negotiation extension" +msgstr "直接SSL接続ãŒALPNプロトコルãƒã‚´ã‚·ã‚¨ãƒ¼ã‚·ãƒ§ãƒ³æ‹¡å¼µãªã—ã§ç¢ºç«‹ã•れã¾ã—ãŸ" + +#: fe-secure-openssl.c:1406 +#, c-format +msgid "SSL connection was established with unexpected ALPN protocol" +msgstr "SSLæŽ¥ç¶šãŒæƒ³å®šå¤–ã®ALPNプロトコルã§ç¢ºç«‹ã•れã¾ã—ãŸ" + +#: fe-secure-openssl.c:1423 #, c-format msgid "certificate could not be obtained: %s" msgstr "証明書をå–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure-openssl.c:1711 +#: fe-secure-openssl.c:1502 #, c-format msgid "no SSL error reported" msgstr "SSLエラーã¯ã‚りã¾ã›ã‚“ã§ã—ãŸ" -#: fe-secure-openssl.c:1720 +#: fe-secure-openssl.c:1545 #, c-format msgid "SSL error code %lu" msgstr "SSLエラーコード: %lu" -#: fe-secure-openssl.c:1986 +#: fe-secure-openssl.c:1847 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "警告: sslpasswordãŒåˆ‡ã‚Šè©°ã‚られã¾ã—ãŸ\n" -#: fe-secure.c:263 +#: fe-secure.c:233 #, c-format msgid "could not receive data from server: %s" msgstr "サーãƒãƒ¼ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’å—ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: fe-secure.c:434 +#: fe-secure.c:404 #, c-format msgid "could not send data to server: %s" msgstr "サーãƒãƒ¼ã«ãƒ‡ãƒ¼ã‚¿ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" @@ -1470,3 +1583,9 @@ msgstr "サーãƒãƒ¼ã«ãƒ‡ãƒ¼ã‚¿ã‚’é€ä¿¡ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" #, c-format msgid "unrecognized socket error: 0x%08X/%d" msgstr "䏿˜Žãªã‚½ã‚±ãƒƒãƒˆã‚¨ãƒ©ãƒ¼ 0x%08X/%d" + +#~ msgid "keepalives parameter must be an integer" +#~ msgstr "keepaliveã®ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã¯æ•´æ•°ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" + +#~ msgid "trailing data found: \"%s\"" +#~ msgstr "後続ã®ãƒ‡ãƒ¼ã‚¿ãŒã‚りã¾ã™: \"%s\"" diff --git a/src/interfaces/libpq/po/ka.po b/src/interfaces/libpq/po/ka.po index f2c283153359f..709596251a6df 100644 --- a/src/interfaces/libpq/po/ka.po +++ b/src/interfaces/libpq/po/ka.po @@ -1,14 +1,14 @@ # Georgian message translation file for libpq # Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the libpq (PostgreSQL) package. -# Temuri Doghonadze , 2022. +# Temuri Doghonadze , 2022-2025. # msgid "" msgstr "" -"Project-Id-Version: libpq (PostgreSQL) 16\n" +"Project-Id-Version: libpq (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-04-19 11:10+0000\n" -"PO-Revision-Date: 2023-04-20 08:19+0200\n" +"POT-Creation-Date: 2025-02-17 21:42+0000\n" +"PO-Revision-Date: 2025-02-18 06:29+0100\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,166 +16,167 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.2.2\n" +"X-Generator: Poedit 3.5\n" -#: ../../port/thread.c:50 ../../port/thread.c:86 +#: ../../port/user.c:43 ../../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ID-ის (%d) áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ შეუძლებელიáƒ: %s" -#: ../../port/thread.c:55 ../../port/thread.c:91 +#: ../../port/user.c:48 ../../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელი ID-ით %d áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: fe-auth-scram.c:227 +#: fe-auth-scram.c:223 #, c-format msgid "malformed SCRAM message (empty message)" msgstr "დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული SCRAM-ის შეტყáƒáƒ‘ინებრ(ცáƒáƒ áƒ˜áƒ”ლი შეტყáƒáƒ‘ინებáƒ)" -#: fe-auth-scram.c:232 +#: fe-auth-scram.c:228 #, c-format msgid "malformed SCRAM message (length mismatch)" msgstr "დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული SCRAM-ის შეტყáƒáƒ‘ინებრ(სიგრძე áƒáƒ  ემთხვევáƒ)" -#: fe-auth-scram.c:275 +#: fe-auth-scram.c:272 #, c-format msgid "could not verify server signature: %s" msgstr "სერვერის ხელმáƒáƒ¬áƒ”რის შემáƒáƒ¬áƒ›áƒ”ბრშეუძლებელიáƒ: %s" -#: fe-auth-scram.c:281 +#: fe-auth-scram.c:278 #, c-format msgid "incorrect server signature" msgstr "სერვერის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ხელმáƒáƒ¬áƒ”რáƒ" -#: fe-auth-scram.c:290 +#: fe-auth-scram.c:287 #, c-format msgid "invalid SCRAM exchange state" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ SCRAM-ის გáƒáƒªáƒ•ლის მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒ" -#: fe-auth-scram.c:317 +#: fe-auth-scram.c:311 #, c-format msgid "malformed SCRAM message (attribute \"%c\" expected)" msgstr "დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული SCRAM-ის შეტყáƒáƒ‘ინებრ(áƒáƒ™áƒšáƒ˜áƒ áƒáƒ¢áƒ áƒ˜áƒ‘უტი \"%c\")" -#: fe-auth-scram.c:326 +#: fe-auth-scram.c:320 #, c-format msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")" msgstr "დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული SCRAM-ის შეტყáƒáƒ‘ინებრ(áƒáƒ™áƒšáƒ˜áƒ \"=\" áƒáƒ¢áƒ áƒ˜áƒ‘უტი \"%c\"-სთვის)" -#: fe-auth-scram.c:366 +#: fe-auth-scram.c:360 #, c-format msgid "could not generate nonce" msgstr "ერთჯერáƒáƒ“ი კáƒáƒ“ის გენერáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: fe-auth-scram.c:375 fe-auth-scram.c:448 fe-auth-scram.c:600 -#: fe-auth-scram.c:620 fe-auth-scram.c:644 fe-auth-scram.c:658 -#: fe-auth-scram.c:704 fe-auth-scram.c:740 fe-auth-scram.c:914 fe-auth.c:295 -#: fe-auth.c:368 fe-auth.c:402 fe-auth.c:617 fe-auth.c:728 fe-auth.c:1209 -#: fe-auth.c:1374 fe-connect.c:925 fe-connect.c:1759 fe-connect.c:1921 -#: fe-connect.c:3291 fe-connect.c:4496 fe-connect.c:5161 fe-connect.c:5416 -#: fe-connect.c:5534 fe-connect.c:5781 fe-connect.c:5861 fe-connect.c:5959 -#: fe-connect.c:6210 fe-connect.c:6237 fe-connect.c:6313 fe-connect.c:6336 -#: fe-connect.c:6360 fe-connect.c:6395 fe-connect.c:6481 fe-connect.c:6489 -#: fe-connect.c:6846 fe-connect.c:6996 fe-exec.c:527 fe-exec.c:1321 -#: fe-exec.c:3111 fe-exec.c:4071 fe-exec.c:4235 fe-gssapi-common.c:109 -#: fe-lobj.c:870 fe-protocol3.c:204 fe-protocol3.c:228 fe-protocol3.c:256 -#: fe-protocol3.c:273 fe-protocol3.c:353 fe-protocol3.c:720 fe-protocol3.c:959 -#: fe-protocol3.c:1769 fe-protocol3.c:2169 fe-secure-common.c:110 -#: fe-secure-gssapi.c:500 fe-secure-openssl.c:434 fe-secure-openssl.c:1285 +#: fe-auth-scram.c:369 fe-auth-scram.c:442 fe-auth-scram.c:594 +#: fe-auth-scram.c:614 fe-auth-scram.c:638 fe-auth-scram.c:652 +#: fe-auth-scram.c:698 fe-auth-scram.c:734 fe-auth-scram.c:908 fe-auth.c:296 +#: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:727 fe-auth.c:1200 +#: fe-auth.c:1363 fe-cancel.c:159 fe-connect.c:936 fe-connect.c:976 +#: fe-connect.c:1860 fe-connect.c:2022 fe-connect.c:3430 fe-connect.c:4761 +#: fe-connect.c:5073 fe-connect.c:5328 fe-connect.c:5446 fe-connect.c:5693 +#: fe-connect.c:5773 fe-connect.c:5871 fe-connect.c:6122 fe-connect.c:6149 +#: fe-connect.c:6225 fe-connect.c:6248 fe-connect.c:6272 fe-connect.c:6307 +#: fe-connect.c:6393 fe-connect.c:6401 fe-connect.c:6758 fe-connect.c:6908 +#: fe-exec.c:530 fe-exec.c:1315 fe-exec.c:3254 fe-exec.c:4291 fe-exec.c:4457 +#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:209 fe-protocol3.c:232 +#: fe-protocol3.c:255 fe-protocol3.c:272 fe-protocol3.c:293 fe-protocol3.c:369 +#: fe-protocol3.c:737 fe-protocol3.c:976 fe-protocol3.c:1787 +#: fe-protocol3.c:2187 fe-secure-common.c:110 fe-secure-gssapi.c:496 +#: fe-secure-openssl.c:427 fe-secure-openssl.c:1277 #, c-format msgid "out of memory" msgstr "მეხსიერებáƒáƒ¡ გáƒáƒ áƒ”თ" -#: fe-auth-scram.c:382 +#: fe-auth-scram.c:376 #, c-format msgid "could not encode nonce" msgstr "ერთჯერáƒáƒ“ი კáƒáƒ“ის კáƒáƒ“ირების შეცდáƒáƒ›áƒ" -#: fe-auth-scram.c:570 +#: fe-auth-scram.c:564 #, c-format msgid "could not calculate client proof: %s" msgstr "კლიენტის მტკიცებულების გáƒáƒ›áƒáƒ—ვლის შეცდáƒáƒ›áƒ: %s" -#: fe-auth-scram.c:585 +#: fe-auth-scram.c:579 #, c-format msgid "could not encode client proof" msgstr "კლიენტის მტკიცებულების კáƒáƒ“ირების შეცდáƒáƒ›áƒ" -#: fe-auth-scram.c:637 +#: fe-auth-scram.c:631 #, c-format msgid "invalid SCRAM response (nonce mismatch)" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ SCRAM-ის პáƒáƒ¡áƒ£áƒ®áƒ˜ (ერთჯერáƒáƒ“ი კáƒáƒ“ი áƒáƒ  ემთხვევáƒ)" -#: fe-auth-scram.c:667 +#: fe-auth-scram.c:661 #, c-format msgid "malformed SCRAM message (invalid salt)" msgstr "დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული SCRAM-ის შეტყáƒáƒ‘ინებრ(áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ áƒ˜áƒšáƒ˜)" -#: fe-auth-scram.c:680 +#: fe-auth-scram.c:674 #, c-format msgid "malformed SCRAM message (invalid iteration count)" msgstr "დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული SCRAM-ის შეტყáƒáƒ‘ინებრ(იტერáƒáƒªáƒ˜áƒ”ბის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ რიცხვი)" -#: fe-auth-scram.c:685 +#: fe-auth-scram.c:679 #, c-format msgid "malformed SCRAM message (garbage at end of server-first-message)" msgstr "დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული SCRAM-ის შეტყáƒáƒ‘ინებრ(ნáƒáƒžáƒáƒ•ნირნáƒáƒ’áƒáƒ•ი სერვერისთვის გáƒáƒ¡áƒáƒ’ზáƒáƒ•ნი პირველი შეტყáƒáƒ‘ინების ბáƒáƒšáƒáƒ¨áƒ˜)" -#: fe-auth-scram.c:719 +#: fe-auth-scram.c:713 #, c-format msgid "error received from server in SCRAM exchange: %s" msgstr "მიღებულირსერვერის შეცდáƒáƒ›áƒ SCRAM გგáƒáƒªáƒ•ლáƒáƒ¨áƒ˜: %s" -#: fe-auth-scram.c:734 +#: fe-auth-scram.c:728 #, c-format msgid "malformed SCRAM message (garbage at end of server-final-message)" msgstr "დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული SCRAM შეტყáƒáƒ‘ინებრ(ნáƒáƒ’áƒáƒ•ი სერვერის-სáƒáƒ‘áƒáƒšáƒáƒ-შეტყáƒáƒ‘ინების ბáƒáƒšáƒáƒ¨áƒ˜)" -#: fe-auth-scram.c:751 +#: fe-auth-scram.c:745 #, c-format msgid "malformed SCRAM message (invalid server signature)" msgstr "დáƒáƒ›áƒáƒ®áƒ˜áƒœáƒ¯áƒ”ბული SCRAM-ის შეტყáƒáƒ‘ინებრ(სერვერის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ხელმáƒáƒ¬áƒ”რáƒ)" -#: fe-auth-scram.c:923 +#: fe-auth-scram.c:917 msgid "could not generate random salt" msgstr "შემთხვევითი მáƒáƒ áƒ˜áƒšáƒ˜áƒ¡ გენერáƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: fe-auth.c:76 +#: fe-auth.c:77 #, c-format msgid "out of memory allocating GSSAPI buffer (%d)" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებრGSSAPI-ის ბáƒáƒ¤áƒ”რის გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡ (%d)" -#: fe-auth.c:137 +#: fe-auth.c:138 msgid "GSSAPI continuation error" msgstr "GSSAPI-ის გáƒáƒœáƒ’რძáƒáƒ‘áƒáƒ“áƒáƒ‘ის შეცდáƒáƒ›áƒ" -#: fe-auth.c:167 fe-auth.c:396 fe-gssapi-common.c:97 fe-secure-common.c:99 +#: fe-auth.c:168 fe-auth.c:397 fe-gssapi-common.c:97 fe-secure-common.c:99 #: fe-secure-common.c:173 #, c-format msgid "host name must be specified" msgstr "ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" -#: fe-auth.c:173 +#: fe-auth.c:174 #, c-format msgid "duplicate GSS authentication request" msgstr "დუბლირებული GSS áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•ნáƒ" -#: fe-auth.c:237 +#: fe-auth.c:238 #, c-format msgid "out of memory allocating SSPI buffer (%d)" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებრSSPI-ის ბáƒáƒ¤áƒ”რის გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡ (%d)" -#: fe-auth.c:284 +#: fe-auth.c:285 msgid "SSPI continuation error" msgstr "SSPI-ის გáƒáƒœáƒ’რძáƒáƒ‘áƒáƒ“áƒáƒ‘ის შეცდáƒáƒ›áƒ" -#: fe-auth.c:358 +#: fe-auth.c:359 #, c-format msgid "duplicate SSPI authentication request" msgstr "დუბლირებული SSPI áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•ნáƒ" -#: fe-auth.c:383 +#: fe-auth.c:384 msgid "could not acquire SSPI credentials" msgstr "შეცდáƒáƒ›áƒ SSPI-ის მáƒáƒ›áƒ®áƒ›./პáƒáƒ áƒáƒšáƒ˜áƒ¡ მიღებისáƒáƒ¡" @@ -199,12 +200,12 @@ msgstr "áƒáƒ áƒ®áƒ˜áƒ¡ მიბმრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ, მ msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection" msgstr "სერვერი გვთáƒáƒ•áƒáƒ–áƒáƒ‘ს SCRAM-SHA-256-PLUS áƒáƒ•თენტიკáƒáƒªáƒ˜áƒáƒ¡ მáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ SSL გáƒáƒ›áƒáƒ áƒ—ულიáƒ" -#: fe-auth.c:530 +#: fe-auth.c:531 #, c-format msgid "none of the server's SASL authentication mechanisms are supported" msgstr "სერვერის SASL áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒª ერთი მექáƒáƒœáƒ˜áƒ–მი მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" -#: fe-auth.c:537 +#: fe-auth.c:538 #, c-format msgid "channel binding is required, but server did not offer an authentication method that supports channel binding" msgstr "მáƒáƒ—ხáƒáƒ•ნილირáƒáƒ áƒ®áƒ–ე მიბმáƒ, მáƒáƒ’რáƒáƒ› სერვერმრáƒáƒ  შემáƒáƒ’ვთáƒáƒ•áƒáƒ–რáƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მექáƒáƒœáƒ˜áƒ–მი, რáƒáƒ›áƒ”ლსáƒáƒª áƒáƒ áƒ®áƒ–ე მიბმის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრგáƒáƒáƒ©áƒœáƒ˜áƒ" @@ -214,17 +215,17 @@ msgstr "მáƒáƒ—ხáƒáƒ•ნილირáƒáƒ áƒ®áƒ–ე მიბმáƒ, მ msgid "out of memory allocating SASL buffer (%d)" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებრSASL ბáƒáƒ¤áƒ”რის გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒ¡áƒáƒ¡ (%d)" -#: fe-auth.c:664 +#: fe-auth.c:663 #, c-format msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed" msgstr "სერვერიდáƒáƒœ AuthenticationSASLFinal მიღებულიáƒ, მáƒáƒ’რáƒáƒ› SASL áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ áƒáƒ  დáƒáƒ¡áƒ áƒ£áƒšáƒ”ბულáƒ" -#: fe-auth.c:674 +#: fe-auth.c:673 #, c-format msgid "no client response found after SASL exchange success" msgstr "კლიენტის SASL გáƒáƒªáƒ•ლის წáƒáƒ áƒ›áƒáƒ¢áƒ”ბის შემდეგ პáƒáƒ¡áƒ£áƒ®áƒ˜ áƒáƒ  გáƒáƒ›áƒáƒ£áƒ’ზáƒáƒ•ნიáƒ" -#: fe-auth.c:737 fe-auth.c:744 fe-auth.c:1357 fe-auth.c:1368 +#: fe-auth.c:736 fe-auth.c:743 fe-auth.c:1346 fe-auth.c:1357 #, c-format msgid "could not encrypt password: %s" msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ დáƒáƒ¨áƒ˜áƒ¤áƒ•რის შეცდáƒáƒ›áƒ: %s" @@ -269,8 +270,8 @@ msgstr "სერვერმრáƒáƒ•თენტიკáƒáƒªáƒ˜áƒ áƒáƒ  დ #: fe-auth.c:912 #, c-format -msgid "auth method \"%s\" requirement failed: %s" -msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის (\"%s\") მáƒáƒ—ხáƒáƒ•ნის შეცდáƒáƒ›áƒ %s" +msgid "authentication method requirement \"%s\" failed: %s" +msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ის (\"%s\") მáƒáƒ—ხáƒáƒ•ნის შეცდáƒáƒ›áƒ: %s" #: fe-auth.c:935 #, c-format @@ -312,636 +313,679 @@ msgstr "Crypt áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ მხáƒáƒ áƒ“áƒáƒ­áƒ”რ msgid "authentication method %u not supported" msgstr "áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ: %u" -#: fe-auth.c:1196 +#: fe-auth.c:1187 #, c-format msgid "user name lookup failure: error code %lu" msgstr "მáƒáƒ›áƒ®áƒáƒ áƒ”ბლის სáƒáƒ®áƒ”ლის áƒáƒ›áƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ პრáƒáƒ‘ლემáƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %lu" -#: fe-auth.c:1320 +#: fe-auth.c:1309 #, c-format msgid "unexpected shape of result set returned for SHOW" msgstr "ბრძáƒáƒœáƒ”ბისთვის SHOW დáƒáƒ‘რუნებული შედეგის მáƒáƒ®áƒáƒ–ულáƒáƒ‘რმáƒáƒ£áƒšáƒáƒ“ნელიáƒ" -#: fe-auth.c:1328 +#: fe-auth.c:1317 #, c-format -msgid "password_encryption value too long" -msgstr "password_encryption -ის მნიშვნელáƒáƒ‘რძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" +msgid "\"password_encryption\" value too long" +msgstr "\"password_encryption\"-ის მნიშვნელáƒáƒ‘რძáƒáƒšáƒ˜áƒáƒœ გრძელიáƒ" -#: fe-auth.c:1378 +#: fe-auth.c:1367 #, c-format msgid "unrecognized password encryption algorithm \"%s\"" msgstr "პáƒáƒ áƒáƒšáƒ˜áƒ¡ დáƒáƒ¨áƒ˜áƒ¤áƒ•რის უცნáƒáƒ‘ი áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მი: \"%s\"" -#: fe-connect.c:1132 +#: fe-cancel.c:76 +#, c-format +msgid "connection pointer is NULL" +msgstr "შეერთების მáƒáƒ©áƒ•ენებელი ნულáƒáƒ•áƒáƒœáƒ˜áƒ" + +#: fe-cancel.c:82 fe-misc.c:572 +#, c-format +msgid "connection not open" +msgstr "შეერთებრღირáƒáƒ áƒáƒ" + +#: fe-cancel.c:193 +#, c-format +msgid "cancel request is already being sent on this connection" +msgstr "áƒáƒ› მიერთებით გáƒáƒ£áƒ¥áƒ›áƒ”ბის მáƒáƒ—ხáƒáƒ•ნის გáƒáƒ’ზáƒáƒ•ნრუკვე მიმდინáƒáƒ áƒ”áƒáƒ‘ს" + +#: fe-cancel.c:263 +#, c-format +msgid "unexpected response from server" +msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი პáƒáƒ¡áƒ£áƒ®áƒ˜ სერვერიდáƒáƒœ" + +#: fe-connect.c:1182 #, c-format msgid "could not match %d host names to %d hostaddr values" msgstr "%d ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლები %d ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ების მნიშვნელáƒáƒ‘ებს áƒáƒ  ემთხვევáƒ" -#: fe-connect.c:1212 +#: fe-connect.c:1262 #, c-format msgid "could not match %d port numbers to %d hosts" msgstr "%d პáƒáƒ áƒ¢áƒ˜áƒ¡ ნáƒáƒ›áƒ áƒ”ბი %d ჰáƒáƒ¡áƒ¢áƒ¡ áƒáƒ  ემთხვევáƒ" -#: fe-connect.c:1337 +#: fe-connect.c:1387 #, c-format msgid "negative require_auth method \"%s\" cannot be mixed with non-negative methods" msgstr "უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ—ი require_auth მეთáƒáƒ“ი \"%s\" áƒáƒ  შეიძლებრსხვრáƒáƒ áƒáƒ£áƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ— მეთáƒáƒ“ებს შეურიáƒáƒ—" -#: fe-connect.c:1350 +#: fe-connect.c:1400 #, c-format msgid "require_auth method \"%s\" cannot be mixed with negative methods" msgstr "require_auth-ის მეთáƒáƒ“ს \"%s\" უáƒáƒ áƒ§áƒáƒ¤áƒ˜áƒ— მეთáƒáƒ“ებს ვერ შეურევთ" -#: fe-connect.c:1410 +#: fe-connect.c:1460 fe-connect.c:1511 fe-connect.c:1553 fe-connect.c:1596 +#: fe-connect.c:1699 fe-connect.c:1745 fe-connect.c:1785 fe-connect.c:1806 #, c-format -msgid "invalid require_auth method: \"%s\"" -msgstr "require_auth-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მეთáƒáƒ“ი: \"%s\"" +msgid "invalid %s value: \"%s\"" +msgstr "%s-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: \"%s\"" -#: fe-connect.c:1443 +#: fe-connect.c:1493 #, c-format msgid "require_auth method \"%s\" is specified more than once" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" ერთზე მეტჯერáƒáƒ მითითებული" -#: fe-connect.c:1461 fe-connect.c:1503 fe-connect.c:1559 fe-connect.c:1567 -#: fe-connect.c:1598 fe-connect.c:1644 fe-connect.c:1684 fe-connect.c:1705 +#: fe-connect.c:1534 fe-connect.c:1573 fe-connect.c:1605 fe-connect.c:1707 #, c-format -msgid "invalid %s value: \"%s\"" -msgstr "%s-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: \"%s\"" +msgid "%s value \"%s\" invalid when SSL support is not compiled in" +msgstr "%s-ის მნიშვნელáƒáƒ‘რ\"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ, რáƒáƒªáƒ SSL-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრგáƒáƒ›áƒáƒ áƒ—ული იყრáƒáƒ’ების დრáƒáƒ¡" -#: fe-connect.c:1484 +#: fe-connect.c:1625 #, c-format -msgid "sslrootcert value \"%s\" invalid when SSL support is not compiled in" -msgstr "sslmode-ის მნიშვნელáƒáƒ‘რ\"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ, რáƒáƒªáƒ SSL-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრგáƒáƒ›áƒáƒ áƒ—ული იყრáƒáƒ’ების დრáƒáƒ¡" +msgid "weak sslmode \"%s\" may not be used with sslnegotiation=direct (use \"require\", \"verify-ca\", or \"verify-full\")" +msgstr "სუსტი sslmode \"%s\" áƒáƒ  შეიძლებრგáƒáƒ›áƒáƒ§áƒ”ნებული იქნáƒáƒ¡ sslrootcert=system-თáƒáƒœ ერთáƒáƒ“ (გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \"require\", \"verify-ca\", áƒáƒœ \"verify-full\")" -#: fe-connect.c:1523 fe-connect.c:1606 +#: fe-connect.c:1647 #, c-format -msgid "%s value \"%s\" invalid when SSL support is not compiled in" -msgstr "%s-ის მნიშვნელáƒáƒ‘რ\"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ, რáƒáƒªáƒ SSL-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრგáƒáƒ›áƒáƒ áƒ—ული იყრáƒáƒ’ების დრáƒáƒ¡" +msgid "weak sslmode \"%s\" may not be used with sslrootcert=system (use \"verify-full\")" +msgstr "სუსტი sslmode \"%s\" áƒáƒ  შეიძლებრგáƒáƒ›áƒáƒ§áƒ”ნებული იქნáƒáƒ¡ sslrootcert=system-თáƒáƒœ ერთáƒáƒ“ (გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ \"verify-full\")" -#: fe-connect.c:1546 +#: fe-connect.c:1660 fe-connect.c:1668 #, c-format -msgid "weak sslmode \"%s\" may not be used with sslrootcert=system (use verify-full)" -msgstr "სუსტი sslmode \"%s\" áƒáƒ  შეიძლებრგáƒáƒ›áƒáƒ§áƒ”ნებული იქნáƒáƒ¡ sslrootcert=system-თáƒáƒœ ერთáƒáƒ“ (გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ verify-full)" +msgid "invalid \"%s\" value: \"%s\"" +msgstr "\"%s\"-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: \"%s\"" -#: fe-connect.c:1584 +#: fe-connect.c:1685 #, c-format msgid "invalid SSL protocol version range" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ SSL პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ ვერსიის დიáƒáƒžáƒáƒ–áƒáƒœáƒ˜" -#: fe-connect.c:1621 +#: fe-connect.c:1722 #, c-format msgid "%s value \"%s\" is not supported (check OpenSSL version)" msgstr "%s-ის მნიშვნელáƒáƒ‘რ\"%s\" მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ (შეáƒáƒ›áƒáƒ¬áƒ›áƒ”თ OpenSSL-ის ვერსიáƒ)" -#: fe-connect.c:1651 +#: fe-connect.c:1752 #, c-format msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in" msgstr "gssencmode -ის მნიშვნელáƒáƒ‘რ\"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ. GSSAPI-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრგáƒáƒ›áƒáƒ áƒ—ული იყრáƒáƒ’ების დრáƒáƒ¡" -#: fe-connect.c:1944 +#: fe-connect.c:2045 #, c-format msgid "could not set socket to TCP no delay mode: %s" msgstr "სáƒáƒ™áƒ”ტის TCP no_delay რეჟიმის ჩáƒáƒ áƒ—ვის შეცდáƒáƒ›áƒ: %s" -#: fe-connect.c:2003 +#: fe-connect.c:2104 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "სáƒáƒ™áƒ”ტით (\"%s\")სერვერთáƒáƒœ მიერთების შეცდáƒáƒ›áƒ: " -#: fe-connect.c:2029 +#: fe-connect.c:2130 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "სერვერის (\"%s\" (%s)) %s-ე პáƒáƒ áƒ¢áƒ–ე მიერთების შეცდáƒáƒ›áƒ: " -#: fe-connect.c:2034 +#: fe-connect.c:2135 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "სერვერის (\"%s\" ) %s-ე პáƒáƒ áƒ¢áƒ–ე მიერთების შეცდáƒáƒ›áƒ: " -#: fe-connect.c:2057 +#: fe-connect.c:2158 #, c-format msgid "\tIs the server running locally and accepting connections on that socket?" msgstr "\táƒáƒ áƒ¡ სერვერი ლáƒáƒ™áƒáƒšáƒ£áƒ áƒáƒ“ გáƒáƒ¨áƒ•ებული დრმზáƒáƒ“áƒáƒ სáƒáƒ™áƒ”ტითრდáƒáƒ¡áƒáƒ™áƒáƒ•შირებლáƒáƒ“?" -#: fe-connect.c:2059 +#: fe-connect.c:2160 #, c-format msgid "\tIs the server running on that host and accepting TCP/IP connections?" msgstr "\táƒáƒ áƒ˜áƒ¡ სერვერი გáƒáƒ¨áƒ•ებული áƒáƒ› ჰáƒáƒ¡áƒ¢áƒ–ე დრეთáƒáƒœáƒ®áƒ›áƒ”ბრTCP/IP შეერთებებს?" -#: fe-connect.c:2122 -#, c-format -msgid "invalid integer value \"%s\" for connection option \"%s\"" -msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: \"%s\" (უნდრიყáƒáƒ¡ მთელი რიცხვი) შეერთების პáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\"" - -#: fe-connect.c:2151 fe-connect.c:2185 fe-connect.c:2220 fe-connect.c:2318 -#: fe-connect.c:2973 +#: fe-connect.c:2206 fe-connect.c:2240 fe-connect.c:2275 fe-connect.c:2373 +#: fe-connect.c:3098 #, c-format msgid "%s(%s) failed: %s" msgstr "%s(%s) -ის შეცდáƒáƒ›áƒ: %s" -#: fe-connect.c:2284 +#: fe-connect.c:2339 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s) -ის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %d" -#: fe-connect.c:2597 +#: fe-connect.c:2650 #, c-format msgid "invalid connection state, probably indicative of memory corruption" msgstr "შეერთების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘áƒ. დიდი შáƒáƒœáƒ¡áƒ˜áƒ— ნიშნáƒáƒ•ს მეხსიერების დáƒáƒ–იáƒáƒœáƒ”ბáƒáƒ¡" -#: fe-connect.c:2676 +#: fe-connect.c:2733 #, c-format msgid "invalid port number: \"%s\"" msgstr "პáƒáƒ áƒ¢áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი: \"%s\"" -#: fe-connect.c:2690 +#: fe-connect.c:2747 #, c-format msgid "could not translate host name \"%s\" to address: %s" msgstr "ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლის (%s) მისáƒáƒ›áƒáƒ áƒ—ში თáƒáƒ áƒ’მნის შეცდáƒáƒ›áƒ: %s" -#: fe-connect.c:2702 +#: fe-connect.c:2759 #, c-format msgid "could not parse network address \"%s\": %s" msgstr "ქსელური მისáƒáƒ›áƒáƒ áƒ—ის (\"%s\") დáƒáƒ›áƒ£áƒ¨áƒáƒ•ების პრáƒáƒ‘ლემáƒ: %s" -#: fe-connect.c:2713 +#: fe-connect.c:2770 #, c-format msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" msgstr "Unix-დáƒáƒ›áƒ”ნის სáƒáƒ™áƒ”ტის მისáƒáƒ›áƒáƒ áƒ—ი \"%s\" ძáƒáƒšáƒ˜áƒáƒœ გრძელირ(დáƒáƒ¡áƒáƒ¨áƒ•ებირ%d ბáƒáƒ˜áƒ¢áƒ˜)" -#: fe-connect.c:2727 +#: fe-connect.c:2784 #, c-format msgid "could not translate Unix-domain socket path \"%s\" to address: %s" msgstr "unix-დáƒáƒ›áƒ”ნის სáƒáƒ™áƒ”ტის ბილიკის (\"%s\") მისáƒáƒ›áƒáƒ áƒ—áƒáƒ“ თáƒáƒ áƒ’მნის შეცდáƒáƒ›áƒ: %s" -#: fe-connect.c:2901 +#: fe-connect.c:2950 fe-connect.c:4305 +#, c-format +msgid "GSSAPI encryption required but it is not supported over a local socket" +msgstr "GSSAPI დáƒáƒ¨áƒ˜áƒ¤áƒ•რრმáƒáƒ—ხáƒáƒ•ნილიáƒ, მáƒáƒ’რáƒáƒ› შეუძლებელირლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ სáƒáƒ™áƒ”ტის გáƒáƒ›áƒáƒ§áƒ”ნებით" + +#: fe-connect.c:2958 fe-connect.c:4434 +#, c-format +msgid "GSSAPI encryption required but no credential cache" +msgstr "GSSAPI დáƒáƒ¨áƒ˜áƒ¤áƒ•რრმáƒáƒ—ხáƒáƒ•ნილიáƒ, მáƒáƒ’რáƒáƒ› áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ დეტáƒáƒšáƒ”ბის კეში áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: fe-connect.c:3026 #, c-format msgid "could not create socket: %s" msgstr "სáƒáƒ™áƒ”ტის შექმნის შეცდáƒáƒ›áƒ: %s" -#: fe-connect.c:2932 +#: fe-connect.c:3057 #, c-format msgid "could not set socket to nonblocking mode: %s" msgstr "სáƒáƒ™áƒ”ტის áƒáƒ áƒáƒ‘ლáƒáƒ™áƒ˜áƒ áƒ”ბული რეჟიმის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" -#: fe-connect.c:2943 +#: fe-connect.c:3068 #, c-format msgid "could not set socket to close-on-exec mode: %s" msgstr "სáƒáƒ™áƒ”ტის დáƒáƒ®áƒ£áƒ áƒ•áƒ-შესრულებისáƒáƒ¡ რეჟიმის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" -#: fe-connect.c:2961 -#, c-format -msgid "keepalives parameter must be an integer" -msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი keepalives მთელი რიცხვი უნდრიყáƒáƒ¡" - -#: fe-connect.c:3100 +#: fe-connect.c:3225 #, c-format msgid "could not get socket error status: %s" msgstr "სáƒáƒ™áƒ”ტის შეცდáƒáƒ›áƒ˜áƒ¡ სტáƒáƒ¢áƒ£áƒ¡áƒ˜áƒ¡ მიღების შეცდáƒáƒ›áƒ: %s" -#: fe-connect.c:3127 +#: fe-connect.c:3252 #, c-format msgid "could not get client address from socket: %s" msgstr "კლიენტის მისáƒáƒ›áƒáƒ áƒ—ის სáƒáƒ™áƒ”ტიდáƒáƒœ მიღების შეცდáƒáƒ›áƒ: %s" -#: fe-connect.c:3165 +#: fe-connect.c:3278 #, c-format msgid "requirepeer parameter is not supported on this platform" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი requirepeer áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ" -#: fe-connect.c:3167 +#: fe-connect.c:3280 #, c-format msgid "could not get peer credentials: %s" msgstr "პáƒáƒ áƒ¢áƒœáƒ˜áƒáƒ áƒ˜áƒ¡ áƒáƒ•ტáƒáƒ áƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ დეტáƒáƒšáƒ”ბის მიღების შეცდáƒáƒ›áƒ: %s" -#: fe-connect.c:3180 +#: fe-connect.c:3293 #, c-format msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"" msgstr "requrepeer-ის მნიშვნელáƒáƒ‘áƒáƒ \"%s\", მáƒáƒ’რáƒáƒ› პáƒáƒ áƒ¢áƒœáƒ˜áƒáƒ áƒ˜áƒ¡ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბლის ნáƒáƒ›áƒ“ვილი áƒáƒ¡áƒ®áƒ”ლიáƒ: \"%s\"" -#: fe-connect.c:3221 +#: fe-connect.c:3331 #, c-format msgid "could not send GSSAPI negotiation packet: %s" msgstr "შეცდáƒáƒ›áƒ GSSAPI-ის მიმáƒáƒªáƒ•ლის პáƒáƒ™áƒ”ტის გáƒáƒ’ზáƒáƒ•ნისáƒáƒ¡: %s" -#: fe-connect.c:3233 -#, c-format -msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)" -msgstr "GSSAPI დáƒáƒ¨áƒ˜áƒ¤áƒ•რრმáƒáƒ—ხáƒáƒ•ნილიáƒ, მáƒáƒ’რáƒáƒ› შეუძლებელი (შესáƒáƒ«áƒšáƒ მიზეზებირმáƒáƒ›áƒ®áƒ›/პáƒáƒ áƒáƒšáƒ˜áƒ¡ ქეშის áƒáƒ áƒáƒ áƒ¡áƒ”ბáƒáƒ‘áƒ, სერვერის მხáƒáƒ áƒ”ს მხáƒáƒ áƒ“áƒáƒ­áƒ”რის áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘რáƒáƒœ ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ სáƒáƒ™áƒ”ტის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ)" - -#: fe-connect.c:3274 +#: fe-connect.c:3380 #, c-format msgid "could not send SSL negotiation packet: %s" msgstr "შეცდáƒáƒ›áƒ SSL მიმáƒáƒªáƒ•ლის პáƒáƒ™áƒ”ტის გáƒáƒ’ზáƒáƒ•ნისáƒáƒ¡: %s" -#: fe-connect.c:3303 +#: fe-connect.c:3412 +#, c-format +msgid "could not send cancel packet: %s" +msgstr "გáƒáƒ£áƒ¥áƒ›áƒ”ბის პáƒáƒ™áƒ”ტის გáƒáƒ’ზáƒáƒ•ნრშეუძლებელიáƒ: %s" + +#: fe-connect.c:3442 #, c-format msgid "could not send startup packet: %s" msgstr "გáƒáƒ¨áƒ•ების პáƒáƒ™áƒ”ტის გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ: %s" -#: fe-connect.c:3378 -#, c-format +#: fe-connect.c:3509 msgid "server does not support SSL, but SSL was required" msgstr "სერვერს SSL-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ, მáƒáƒ’რáƒáƒ› SSL-ი áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" -#: fe-connect.c:3404 +#: fe-connect.c:3519 +#, c-format +msgid "server sent an error response during SSL exchange" +msgstr "სერვერმრგáƒáƒ›áƒáƒáƒ’ზáƒáƒ•ნრშეცდáƒáƒ›áƒ˜áƒ¡ შემცველი პáƒáƒ¡áƒ£áƒ®áƒ˜ SSL მიმáƒáƒªáƒ•ლის დრáƒáƒ¡" + +#: fe-connect.c:3524 #, c-format msgid "received invalid response to SSL negotiation: %c" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ¡áƒ£áƒ®áƒ˜ SSL მიმáƒáƒªáƒ•ლისáƒáƒ¡: %c" -#: fe-connect.c:3424 +#: fe-connect.c:3552 #, c-format msgid "received unencrypted data after SSL response" msgstr "'SSL' პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ შემდეგ მიღებული მáƒáƒœáƒáƒªáƒ”მები დáƒáƒ£áƒ¨áƒ˜áƒ¤áƒ áƒáƒ•იáƒ" -#: fe-connect.c:3504 +#: fe-connect.c:3615 #, c-format +msgid "server sent an error response during GSS encryption exchange" +msgstr "სერვერმრგáƒáƒ›áƒáƒáƒ’ზáƒáƒ•ნრშეცდáƒáƒ›áƒ˜áƒ¡ შემცველი პáƒáƒ¡áƒ£áƒ®áƒ˜ GSS დáƒáƒ¨áƒ˜áƒ¤áƒ•რის მიმáƒáƒªáƒ•ლის დრáƒáƒ¡" + +#: fe-connect.c:3629 msgid "server doesn't support GSSAPI encryption, but it was required" msgstr "სერვერს GSSAPI დáƒáƒ¨áƒ˜áƒ¤áƒ•რის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ, მáƒáƒ’რáƒáƒ› ის მáƒáƒ—ხáƒáƒ•ილიáƒ" -#: fe-connect.c:3515 +#: fe-connect.c:3633 #, c-format msgid "received invalid response to GSSAPI negotiation: %c" msgstr "'GSSAPI' მიმáƒáƒªáƒ•ლის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ¡áƒ£áƒ®áƒ˜: %c" -#: fe-connect.c:3533 +#: fe-connect.c:3651 #, c-format msgid "received unencrypted data after GSSAPI encryption response" msgstr "'GSSAPI' პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ შემდეგ მიღებული მáƒáƒœáƒáƒªáƒ”მები დáƒáƒ£áƒ¨áƒ˜áƒ¤áƒ áƒáƒ•იáƒ" -#: fe-connect.c:3598 +#: fe-connect.c:3711 #, c-format msgid "expected authentication request from server, but received %c" msgstr "სერვერიდáƒáƒœ მáƒáƒ¡áƒáƒšáƒáƒ“ნელი იყრáƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•ნáƒ, მáƒáƒ’რáƒáƒ› მიღებულირ%c" -#: fe-connect.c:3625 fe-connect.c:3794 +#: fe-connect.c:3739 fe-connect.c:3862 #, c-format msgid "received invalid authentication request" msgstr "დუბლირებული GSS áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•ნáƒ" -#: fe-connect.c:3630 fe-connect.c:3779 +#: fe-connect.c:3745 fe-connect.c:3847 #, c-format msgid "received invalid protocol negotiation message" msgstr "მიღებულირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ მიმáƒáƒªáƒ•ლის შეტყáƒáƒ‘ინებáƒ" -#: fe-connect.c:3648 fe-connect.c:3702 +#: fe-connect.c:3764 fe-connect.c:3818 #, c-format msgid "received invalid error message" msgstr "მიღებულირáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შეცდáƒáƒ›áƒ˜áƒ¡ შეტყáƒáƒ‘ინებáƒ" -#: fe-connect.c:3865 +#: fe-connect.c:3933 #, c-format msgid "unexpected message from server during startup" msgstr "სერვერის გáƒáƒ¨áƒ•ებისáƒáƒ¡ მიღებულირმáƒáƒ£áƒšáƒáƒ“ნელი შეტყáƒáƒ‘ინებáƒ" -#: fe-connect.c:3956 +#: fe-connect.c:4024 #, c-format msgid "session is read-only" msgstr "სესირმხáƒáƒšáƒáƒ“ კითხვáƒáƒ“იáƒ" -#: fe-connect.c:3958 +#: fe-connect.c:4026 #, c-format msgid "session is not read-only" msgstr "სესირმხáƒáƒšáƒáƒ“ კითხვáƒáƒ“ი áƒáƒ áƒ" -#: fe-connect.c:4011 +#: fe-connect.c:4079 #, c-format msgid "server is in hot standby mode" msgstr "სერვერი მზáƒ-უქმე რეჟიმშიáƒ" -#: fe-connect.c:4013 +#: fe-connect.c:4081 #, c-format msgid "server is not in hot standby mode" msgstr "სერვერი მზáƒ-უქმე რეჟიმში áƒáƒ áƒáƒ" -#: fe-connect.c:4129 fe-connect.c:4179 +#: fe-connect.c:4203 fe-connect.c:4253 #, c-format msgid "\"%s\" failed" msgstr "\"%s\"-ის შეცდáƒáƒ›áƒ" -#: fe-connect.c:4193 +#: fe-connect.c:4267 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption" msgstr "შეერთების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘რ(%d). დიდი შáƒáƒœáƒ¡áƒ˜áƒ— ნიშნáƒáƒ•ს მეხსიერების დáƒáƒ–იáƒáƒœáƒ”ბáƒáƒ¡" -#: fe-connect.c:5174 +#: fe-connect.c:5086 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://" msgstr "'LDAP'-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ URL: \"%s\": სქემრldap:// უნდრიყáƒáƒ¡" -#: fe-connect.c:5189 +#: fe-connect.c:5101 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name" msgstr "'LDAP'-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ URL: \"%s\": áƒáƒ™áƒšáƒ˜áƒ გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ˜áƒšáƒ˜ სáƒáƒ®áƒ”ლი" -#: fe-connect.c:5201 fe-connect.c:5259 +#: fe-connect.c:5113 fe-connect.c:5171 #, c-format msgid "invalid LDAP URL \"%s\": must have exactly one attribute" msgstr "'LDAP'-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ URL \"%s\": ზუსტáƒáƒ“ ერთი áƒáƒ¢áƒ áƒ˜áƒ‘უტი უნდრჰქáƒáƒœáƒ“ეს" -#: fe-connect.c:5213 fe-connect.c:5275 +#: fe-connect.c:5125 fe-connect.c:5187 #, c-format msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" msgstr "'LDAP'-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ URL: \"%s\": სáƒáƒ­áƒ˜áƒ áƒáƒ ძებნის ფáƒáƒ áƒ’ლების ქáƒáƒœáƒ (სáƒáƒ‘áƒáƒ–ისáƒ/ერთი/ქვე)" -#: fe-connect.c:5225 +#: fe-connect.c:5137 #, c-format msgid "invalid LDAP URL \"%s\": no filter" msgstr "'LDAP'-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ URL: \"%s\":ფილტრი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: fe-connect.c:5247 +#: fe-connect.c:5159 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number" msgstr "'LDAP'-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ URL: \"%s\": პáƒáƒ áƒ¢áƒ˜áƒ¡ áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ნáƒáƒ›áƒ”რი" -#: fe-connect.c:5284 +#: fe-connect.c:5196 #, c-format msgid "could not create LDAP structure" msgstr "შეცდáƒáƒ›áƒ LDAP-ის სტრუქტურის შექმნისáƒáƒ¡" -#: fe-connect.c:5359 +#: fe-connect.c:5271 #, c-format msgid "lookup on LDAP server failed: %s" msgstr "'LDAP' სერვერის მáƒáƒ«áƒ”ბნის შეცდáƒáƒ›áƒ: %s" -#: fe-connect.c:5369 +#: fe-connect.c:5281 #, c-format msgid "more than one entry found on LDAP lookup" msgstr "ძებნისáƒáƒ¡ (LDAP) ნáƒáƒžáƒáƒ•ნირერთზე მეტი ჩáƒáƒœáƒáƒ¬áƒ”რი" -#: fe-connect.c:5371 fe-connect.c:5382 +#: fe-connect.c:5283 fe-connect.c:5294 #, c-format msgid "no entry found on LDAP lookup" msgstr "ძებნისáƒáƒ¡ (LDAP) ჩáƒáƒœáƒáƒ¬áƒ”რები ნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" -#: fe-connect.c:5392 fe-connect.c:5404 +#: fe-connect.c:5304 fe-connect.c:5316 #, c-format msgid "attribute has no values on LDAP lookup" msgstr "'LDAP' ძებნის áƒáƒ¢áƒ áƒ˜áƒ‘უტს მნიშვნელáƒáƒ‘რáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" -#: fe-connect.c:5455 fe-connect.c:5474 fe-connect.c:5998 +#: fe-connect.c:5367 fe-connect.c:5386 fe-connect.c:5910 #, c-format msgid "missing \"=\" after \"%s\" in connection info string" msgstr "შეერთების სტრიქáƒáƒœáƒ¨áƒ˜ \"%s\"-ის შემდეგ \"=\" áƒáƒ™áƒšáƒ˜áƒ" -#: fe-connect.c:5545 fe-connect.c:6181 fe-connect.c:6979 +#: fe-connect.c:5457 fe-connect.c:6093 fe-connect.c:6891 #, c-format msgid "invalid connection option \"%s\"" msgstr "შეერთების áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" -#: fe-connect.c:5560 fe-connect.c:6046 +#: fe-connect.c:5472 fe-connect.c:5958 #, c-format msgid "unterminated quoted string in connection info string" msgstr "შეერთების ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ სტრიქáƒáƒœáƒ¨áƒ˜ ბრჭყáƒáƒšáƒ”ბში ჩáƒáƒ¡áƒ›áƒ£áƒšáƒ˜ სტრიქáƒáƒœáƒ˜ დáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელიáƒ" -#: fe-connect.c:5640 +#: fe-connect.c:5552 #, c-format msgid "definition of service \"%s\" not found" msgstr "სერვისის áƒáƒ¦áƒ¬áƒ”რრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" -#: fe-connect.c:5666 +#: fe-connect.c:5578 #, c-format msgid "service file \"%s\" not found" msgstr "სერვისის ფáƒáƒ˜áƒšáƒ˜ áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: \"%s\"" -#: fe-connect.c:5679 +#: fe-connect.c:5591 #, c-format msgid "line %d too long in service file \"%s\"" msgstr "ძáƒáƒšáƒ˜áƒáƒœ გრძელი ხáƒáƒ–ი (%d) სერვისის ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\"" -#: fe-connect.c:5750 fe-connect.c:5793 +#: fe-connect.c:5662 fe-connect.c:5705 #, c-format msgid "syntax error in service file \"%s\", line %d" msgstr "სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ შეცდáƒáƒ›áƒ სერვისის ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ხáƒáƒ–ზე %d" -#: fe-connect.c:5761 +#: fe-connect.c:5673 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d" msgstr "სერვისის ფáƒáƒ˜áƒšáƒ¨áƒ˜ \"%s\" ჩáƒáƒ“გმული სერვისის მითითებრმხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ. ხáƒáƒ–ი %d" -#: fe-connect.c:6500 +#: fe-connect.c:6412 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"" msgstr "დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებს შიდრფუნქციáƒáƒ¨áƒ˜ გáƒáƒ“áƒáƒªáƒ”მული URI áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ: %s" -#: fe-connect.c:6577 +#: fe-connect.c:6489 #, c-format msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"" msgstr "სტრიქáƒáƒœáƒ˜áƒ¡ დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜ \"]\"-ს IPv6 ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ში URI-ში ძებნისáƒáƒ¡: \"%s\"" -#: fe-connect.c:6584 +#: fe-connect.c:6496 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"" msgstr "ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ IPv6 მისáƒáƒ›áƒáƒ áƒ—ი URI-ში ცáƒáƒ áƒ˜áƒ”ლი ვერ იქნებáƒ: \"%s\"" -#: fe-connect.c:6599 +#: fe-connect.c:6511 #, c-format msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"" msgstr "უცნáƒáƒ‘ი სიმბáƒáƒšáƒ (\"%c\") URI-ში პáƒáƒ–იციáƒáƒ–ე %d (მáƒáƒ•ელáƒáƒ“ი \":\"-ს áƒáƒœ \"/\"-ს): \"%s\"" -#: fe-connect.c:6728 +#: fe-connect.c:6640 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "მáƒáƒ—ხáƒáƒ•ნის URI áƒáƒ áƒáƒ›áƒ”ტრში მითითებულირგáƒáƒ¡áƒáƒ¦áƒ”ბი/მნიშვნელáƒáƒ‘ის ზედმეტი \"=\": \"%s\"" -#: fe-connect.c:6748 +#: fe-connect.c:6660 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "მáƒáƒ—ხáƒáƒ•ნის URI პáƒáƒ áƒáƒ›áƒ”ტრში მითითებულირგáƒáƒ¡áƒáƒ¦áƒ”ბი/მნიშვნელáƒáƒ‘ის წყვილს \"=\" áƒáƒ™áƒšáƒ˜áƒ: \"%s\"" -#: fe-connect.c:6800 +#: fe-connect.c:6712 #, c-format msgid "invalid URI query parameter: \"%s\"" msgstr "მáƒáƒ—ხáƒáƒ•ნის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი: \"%s\"" -#: fe-connect.c:6874 +#: fe-connect.c:6786 #, c-format msgid "invalid percent-encoded token: \"%s\"" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ პრáƒáƒªáƒ”ნტულáƒáƒ“-კáƒáƒ“ირებული კáƒáƒ“ი: \"%s\"" -#: fe-connect.c:6884 +#: fe-connect.c:6796 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"" msgstr "პრáƒáƒªáƒ”ნტში კáƒáƒ“ირებული მნიშვნელáƒáƒ‘ის áƒáƒ™áƒ áƒ«áƒáƒšáƒ£áƒšáƒ˜ მნიშვნელáƒáƒ‘რ%%00: \"%s\"" -#: fe-connect.c:7248 +#: fe-connect.c:7160 msgid "connection pointer is NULL\n" msgstr "შეერთების მáƒáƒ©áƒ•ენებელი ნულáƒáƒ•áƒáƒœáƒ˜áƒ\n" -#: fe-connect.c:7256 fe-exec.c:710 fe-exec.c:970 fe-exec.c:3292 -#: fe-protocol3.c:974 fe-protocol3.c:1007 +#: fe-connect.c:7168 fe-exec.c:713 fe-exec.c:975 fe-exec.c:3459 +#: fe-protocol3.c:991 fe-protocol3.c:1024 msgid "out of memory\n" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებáƒ\n" -#: fe-connect.c:7547 +#: fe-connect.c:7459 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ. პáƒáƒ áƒáƒšáƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ \"%s\" უბრáƒáƒšáƒáƒ“ ფáƒáƒ˜áƒšáƒ¡ áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს\n" -#: fe-connect.c:7556 +#: fe-connect.c:7468 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: პáƒáƒ áƒáƒšáƒ”ბის ფáƒáƒ˜áƒšáƒ¡ \"%s\" ჯგუფზე áƒáƒœ დáƒáƒœáƒáƒ áƒ©áƒ”ნ ყველáƒáƒ–ე წვდáƒáƒ›áƒ გáƒáƒáƒ©áƒœáƒ˜áƒ. წვდáƒáƒ›áƒ 0600 áƒáƒœ ნáƒáƒ™áƒšáƒ”ბი უნდრიყáƒáƒ¡\n" -#: fe-connect.c:7663 +#: fe-connect.c:7575 #, c-format msgid "password retrieved from file \"%s\"" msgstr "პáƒáƒ áƒáƒšáƒ˜ მიღებულირფáƒáƒ˜áƒšáƒ˜áƒ“áƒáƒœ \"%s\"" -#: fe-exec.c:466 fe-exec.c:3366 +#: fe-connect.c:7727 +#, c-format +msgid "invalid integer value \"%s\" for connection option \"%s\"" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: \"%s\" (უნდრიყáƒáƒ¡ მთელი რიცხვი) შეერთების პáƒáƒ áƒáƒ›áƒ”ტრისთვის \"%s\"" + +#: fe-exec.c:469 fe-exec.c:3533 #, c-format msgid "row number %d is out of range 0..%d" msgstr "მწკრივების რáƒáƒáƒ“ენáƒáƒ‘რ%d ზღვáƒáƒ áƒ¡ (0..%d) გáƒáƒ áƒ”თáƒáƒ" -#: fe-exec.c:528 fe-protocol3.c:1975 +#: fe-exec.c:531 fe-protocol3.c:1993 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:831 +#: fe-exec.c:834 #, c-format msgid "write to server failed" msgstr "სერვერზე ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ" -#: fe-exec.c:869 +#: fe-exec.c:874 #, c-format msgid "no error text available" msgstr "შეცდáƒáƒ›áƒ˜áƒ¡ ტექსტი ხელმიუწვდáƒáƒ›áƒ”ლიáƒ" -#: fe-exec.c:958 +#: fe-exec.c:963 msgid "NOTICE" msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ" -#: fe-exec.c:1016 +#: fe-exec.c:1021 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult-ს INT_MAX-ზე მეტი სტრუქტურის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" -#: fe-exec.c:1028 +#: fe-exec.c:1033 msgid "size_t overflow" msgstr "size_t -ის გáƒáƒ“áƒáƒ•სებáƒ" -#: fe-exec.c:1444 fe-exec.c:1513 fe-exec.c:1559 +#: fe-exec.c:1438 fe-exec.c:1507 fe-exec.c:1553 #, c-format msgid "command string is a null pointer" msgstr "ბრძáƒáƒœáƒ”ბის სტრიქáƒáƒœáƒ˜ ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებელიáƒ" -#: fe-exec.c:1450 fe-exec.c:2889 +#: fe-exec.c:1444 fe-exec.c:3003 #, c-format msgid "%s not allowed in pipeline mode" msgstr "კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒ®áƒ˜áƒ¡ რეჟიმში %s დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: fe-exec.c:1518 fe-exec.c:1564 fe-exec.c:1658 +#: fe-exec.c:1512 fe-exec.c:1558 fe-exec.c:1652 #, c-format msgid "number of parameters must be between 0 and %d" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრების რáƒáƒáƒ“ენáƒáƒ‘რ0-სრდრ%d-ს შáƒáƒ áƒ˜áƒ¡ შეიძლებრიყáƒáƒ¡" -#: fe-exec.c:1554 fe-exec.c:1653 +#: fe-exec.c:1548 fe-exec.c:1647 #, c-format msgid "statement name is a null pointer" msgstr "გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბის სáƒáƒ®áƒ”ლი ნულáƒáƒ•áƒáƒœáƒ˜ მáƒáƒ©áƒ•ენებელიáƒ" -#: fe-exec.c:1695 fe-exec.c:3220 +#: fe-exec.c:1689 fe-exec.c:3379 #, c-format msgid "no connection to the server" msgstr "სერვერთáƒáƒœ შეერთებრáƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: fe-exec.c:1703 fe-exec.c:3228 +#: fe-exec.c:1697 fe-exec.c:3387 #, c-format msgid "another command is already in progress" msgstr "უკვე გáƒáƒ¨áƒ•ებულირსხვრბრძáƒáƒœáƒ”ბáƒ" -#: fe-exec.c:1733 +#: fe-exec.c:1727 #, c-format msgid "cannot queue commands during COPY" msgstr "რáƒáƒªáƒ გáƒáƒ¨áƒ•ებულირბრძáƒáƒœáƒ”ბრCOPY, სხვრბრძáƒáƒœáƒ”ბებს ვერ გáƒáƒ£áƒ¨áƒ•ებთ" -#: fe-exec.c:1850 +#: fe-exec.c:1846 #, c-format msgid "length must be given for binary parameter" msgstr "ბინáƒáƒ áƒ£áƒšáƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრისთვის სიგრძის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" -#: fe-exec.c:2172 +#: fe-exec.c:2205 #, c-format msgid "unexpected asyncStatus: %d" msgstr "მáƒáƒ£áƒšáƒáƒ“ნელი asyncStatus: %d" -#: fe-exec.c:2328 +#: fe-exec.c:2361 #, c-format msgid "synchronous command execution functions are not allowed in pipeline mode" msgstr "კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒ®áƒ˜áƒ¡ რეჟიმში ბრძáƒáƒœáƒ”ბის სინქრáƒáƒœáƒ£áƒšáƒ˜ შესრულების ფუნქციები მიუწვდáƒáƒ›áƒ”ლიáƒ" -#: fe-exec.c:2345 +#: fe-exec.c:2378 msgid "COPY terminated by new PQexec" msgstr "COPY შეწყვეტილირáƒáƒ®áƒáƒšáƒ˜ PQexec-ის მიერ" -#: fe-exec.c:2361 +#: fe-exec.c:2394 #, c-format msgid "PQexec not allowed during COPY BOTH" msgstr "COPY BOTH-ის დრáƒáƒ¡ PQexec დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: fe-exec.c:2587 fe-exec.c:2642 fe-exec.c:2710 fe-protocol3.c:1906 +#: fe-exec.c:2630 +#, c-format +msgid "unrecognized message type \"%c\"" +msgstr "შეტყáƒáƒ‘ინების უცნáƒáƒ‘ი ტიპი: \"%c\"" + +#: fe-exec.c:2702 fe-exec.c:2756 fe-exec.c:2824 fe-protocol3.c:1924 #, c-format msgid "no COPY in progress" msgstr "ბრძáƒáƒœáƒ”ბრCOPY გáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" -#: fe-exec.c:2896 +#: fe-exec.c:3010 #, c-format msgid "connection in wrong state" msgstr "შეერთების მდგáƒáƒ›áƒáƒ áƒ”áƒáƒ‘რáƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ" -#: fe-exec.c:2939 +#: fe-exec.c:3053 #, c-format msgid "cannot enter pipeline mode, connection not idle" msgstr "კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒ®áƒ˜áƒ¡ რეჟიმზე გáƒáƒ“áƒáƒ áƒ—ვის შეცდáƒáƒ›áƒ. შეერთებრუქმე áƒáƒ áƒáƒ" -#: fe-exec.c:2975 fe-exec.c:2996 +#: fe-exec.c:3089 fe-exec.c:3110 #, c-format msgid "cannot exit pipeline mode with uncollected results" msgstr "მáƒáƒ’რáƒáƒ•ებული შედეგების გáƒáƒ áƒ”შე კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒ®áƒ˜áƒ¡ რეჟიმიდáƒáƒœ ვერ გáƒáƒ®áƒ•áƒáƒšáƒ—" -#: fe-exec.c:2979 +#: fe-exec.c:3093 #, c-format msgid "cannot exit pipeline mode while busy" msgstr "კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒ®áƒ˜áƒ¡ რეჟიმიდáƒáƒœ გáƒáƒ¡áƒ•ლრმáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ ის დáƒáƒ™áƒáƒ•ებულიáƒ, შეუძლებელიáƒ" -#: fe-exec.c:2990 +#: fe-exec.c:3104 #, c-format msgid "cannot exit pipeline mode while in COPY" msgstr "კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒ®áƒ˜áƒ¡ რეჟიმიდáƒáƒœ გáƒáƒ¡áƒ•ლრმáƒáƒ¨áƒ˜áƒœ, რáƒáƒªáƒ ის დáƒáƒ™áƒáƒ•ებულიáƒ, შეუძლებელიáƒ" -#: fe-exec.c:3154 +#: fe-exec.c:3303 #, c-format msgid "cannot send pipeline when not in pipeline mode" msgstr "კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒ®áƒ˜áƒ¡ გáƒáƒ’ზáƒáƒ•ნáƒ, რáƒáƒªáƒ კáƒáƒ›áƒ£áƒœáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ áƒáƒ áƒ®áƒ˜áƒ¡ რეჟიმში áƒáƒ  ხáƒáƒ áƒ—, შეუძლებელიáƒ" -#: fe-exec.c:3255 +#: fe-exec.c:3422 msgid "invalid ExecStatusType code" msgstr "'ExecStatusType'-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ კáƒáƒ“ი" -#: fe-exec.c:3282 +#: fe-exec.c:3449 msgid "PGresult is not an error result\n" msgstr "PGresult შეცდáƒáƒ›áƒ˜áƒ—ი შედეგი áƒáƒ áƒáƒ\n" -#: fe-exec.c:3350 fe-exec.c:3373 +#: fe-exec.c:3517 fe-exec.c:3540 #, c-format msgid "column number %d is out of range 0..%d" msgstr "სვეტების რáƒáƒáƒ“ენáƒáƒ‘რ%d ზღვáƒáƒ áƒ¡ (0..%d) გáƒáƒ áƒ”თáƒáƒ" -#: fe-exec.c:3388 +#: fe-exec.c:3555 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრების რáƒáƒáƒ“ენáƒáƒ‘რ%d ზღვáƒáƒ áƒ¡ (0..%d) გáƒáƒ áƒ”თáƒáƒ" -#: fe-exec.c:3699 +#: fe-exec.c:3866 #, c-format msgid "could not interpret result from server: %s" msgstr "სერვერის პáƒáƒ¡áƒ£áƒ®áƒ˜áƒ¡ გáƒáƒ£áƒ áƒ™áƒ•ეველიáƒ: %s" -#: fe-exec.c:3964 fe-exec.c:4054 +#: fe-exec.c:4140 fe-exec.c:4253 #, c-format msgid "incomplete multibyte character" msgstr "დáƒáƒ£áƒ¡áƒ áƒ£áƒšáƒ”ბელი მრáƒáƒ•áƒáƒšáƒ‘áƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ სიმბáƒáƒšáƒ" +#: fe-exec.c:4142 fe-exec.c:4272 +#, c-format +msgid "invalid multibyte character" +msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მრáƒáƒ•áƒáƒšáƒ‘áƒáƒ˜áƒ¢áƒ˜áƒáƒœáƒ˜ სიმბáƒáƒšáƒ" + #: fe-gssapi-common.c:122 msgid "GSSAPI name import error" msgstr "GSSAPI-ის სáƒáƒ®áƒ”ლის შემáƒáƒ¢áƒáƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" @@ -988,23 +1032,18 @@ msgstr "ფáƒáƒ˜áƒšáƒ¨áƒ˜ (\"%s\") ჩáƒáƒ¬áƒ”რის შეცდáƒáƒ›áƒ: msgid "query to initialize large object functions did not return data" msgstr "დიდი áƒáƒ‘იექტის ფუნქციების ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ მáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ შედეგ áƒáƒ  დáƒáƒ£áƒ‘რუნებიáƒ" -#: fe-misc.c:240 +#: fe-misc.c:239 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "%lu-ის მთელი რიცხვის ზáƒáƒ›áƒ მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირpqGetInt-is მიერ" -#: fe-misc.c:273 +#: fe-misc.c:272 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "%lu-ის მთელი რიცხვის ზáƒáƒ›áƒ მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელირpqPutInt-is მიერ" -#: fe-misc.c:573 -#, c-format -msgid "connection not open" -msgstr "შეერთებრღირáƒáƒ áƒáƒ" - -#: fe-misc.c:751 fe-secure-openssl.c:215 fe-secure-openssl.c:315 -#: fe-secure.c:257 fe-secure.c:419 +#: fe-misc.c:750 fe-secure-openssl.c:203 fe-secure-openssl.c:309 +#: fe-secure.c:237 fe-secure.c:404 #, c-format msgid "" "server closed the connection unexpectedly\n" @@ -1015,165 +1054,172 @@ msgstr "" "\tეს დიდი áƒáƒšáƒ‘áƒáƒ—áƒáƒ‘ით ნიშნáƒáƒ•ს, რáƒáƒ› სერვერის პრáƒáƒªáƒ”სი \n" "\tმáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“, მáƒáƒ—ხáƒáƒ•ნáƒáƒ›áƒ“ე áƒáƒœ მáƒáƒ—ხáƒáƒ•ნის შესრულებსáƒáƒ¡ დáƒáƒ¡áƒ áƒ£áƒšáƒ“áƒ." -#: fe-misc.c:818 +#: fe-misc.c:817 msgid "connection not open\n" msgstr "შეერთებრღირáƒáƒ áƒáƒ\n" -#: fe-misc.c:1003 +#: fe-misc.c:1005 #, c-format msgid "timeout expired" msgstr "მáƒáƒšáƒáƒ“ინის დრრგáƒáƒ•იდáƒ" -#: fe-misc.c:1047 +#: fe-misc.c:1049 #, c-format msgid "invalid socket" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სáƒáƒ™áƒ”ტი" -#: fe-misc.c:1069 +#: fe-misc.c:1071 #, c-format msgid "%s() failed: %s" msgstr "%s()-ის შეცდáƒáƒ›áƒ: %s" -#: fe-protocol3.c:182 +#: fe-protocol3.c:187 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "შეტყáƒáƒ‘ინების ტიპი 0x%02x მáƒáƒ•იდრსერვერიდáƒáƒœ, რáƒáƒªáƒ უქმე ვიყáƒáƒ•ი" -#: fe-protocol3.c:385 +#: fe-protocol3.c:402 #, c-format msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" msgstr "სერვერმრმáƒáƒœáƒáƒªáƒ”მები (\"D\" შეტყáƒáƒ‘ინებáƒ) მწკრივების წინáƒáƒ¡áƒ¬áƒáƒ áƒ˜ áƒáƒ¦áƒ¬áƒ”რის (\"T\" შეტყáƒáƒ‘ინებáƒ) გáƒáƒ áƒ”შე გáƒáƒ›áƒáƒáƒ’ზáƒáƒ•ნáƒ" -#: fe-protocol3.c:427 +#: fe-protocol3.c:444 #, c-format msgid "unexpected response from server; first received character was \"%c\"" msgstr "სერვერის მáƒáƒ£áƒšáƒáƒ“ნელი პáƒáƒ¡áƒ£áƒ®áƒ˜; პირველი მიღებული სიმბáƒáƒšáƒáƒ \"%c\"" -#: fe-protocol3.c:450 +#: fe-protocol3.c:467 #, c-format msgid "message contents do not agree with length in message type \"%c\"" msgstr "შეტყáƒáƒ‘ინების შიგთáƒáƒ•სი შეტყáƒáƒ‘ინების áƒáƒ› ტიპის (%c) სიგრძეს áƒáƒ  ემთხვევáƒ" -#: fe-protocol3.c:468 +#: fe-protocol3.c:485 #, c-format msgid "lost synchronization with server: got message type \"%c\", length %d" msgstr "სერვერთáƒáƒœ სინქრáƒáƒœáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: შეტყáƒáƒ‘ინების ტიპი: \"%c\", სიგრძე %d" -#: fe-protocol3.c:520 fe-protocol3.c:560 +#: fe-protocol3.c:537 fe-protocol3.c:577 msgid "insufficient data in \"T\" message" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მáƒáƒœáƒáƒªáƒ”მები \"T\" შეტყáƒáƒ‘ინებáƒáƒ¨áƒ˜" -#: fe-protocol3.c:631 fe-protocol3.c:837 +#: fe-protocol3.c:648 fe-protocol3.c:854 msgid "out of memory for query result" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მეხსიერებრმáƒáƒ—ხáƒáƒ•ნის შედეგისთვის" -#: fe-protocol3.c:700 +#: fe-protocol3.c:717 msgid "insufficient data in \"t\" message" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მáƒáƒœáƒáƒªáƒ”მები \"t\" შეტყáƒáƒ‘ინებáƒáƒ¨áƒ˜" -#: fe-protocol3.c:759 fe-protocol3.c:791 fe-protocol3.c:809 +#: fe-protocol3.c:776 fe-protocol3.c:808 fe-protocol3.c:826 msgid "insufficient data in \"D\" message" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ მáƒáƒœáƒáƒªáƒ”მები \"D\" შეტყáƒáƒ‘ინებáƒáƒ¨áƒ˜" -#: fe-protocol3.c:765 +#: fe-protocol3.c:782 msgid "unexpected field count in \"D\" message" msgstr "ველების მáƒáƒ£áƒšáƒáƒ“ნელი რáƒáƒáƒ“ენáƒáƒ‘რ\"D\" შეტყáƒáƒ‘ინებáƒáƒ¨áƒ˜" -#: fe-protocol3.c:1020 +#: fe-protocol3.c:1037 msgid "no error message available\n" msgstr "შეცდáƒáƒ›áƒ˜áƒ¡ შეტყáƒáƒ‘ინების გáƒáƒ áƒ”შე\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1068 fe-protocol3.c:1087 +#: fe-protocol3.c:1085 fe-protocol3.c:1104 #, c-format msgid " at character %s" msgstr " სიმბáƒáƒšáƒáƒ¡áƒ—áƒáƒœ %s" -#: fe-protocol3.c:1100 +#: fe-protocol3.c:1117 #, c-format msgid "DETAIL: %s\n" msgstr "დეტáƒáƒšáƒ˜: %s\n" -#: fe-protocol3.c:1103 +#: fe-protocol3.c:1120 #, c-format msgid "HINT: %s\n" msgstr "მინიშნებáƒ: %s\n" -#: fe-protocol3.c:1106 +#: fe-protocol3.c:1123 #, c-format msgid "QUERY: %s\n" msgstr "მáƒáƒ—ხáƒáƒ•ნáƒ: %s\n" -#: fe-protocol3.c:1113 +#: fe-protocol3.c:1130 #, c-format msgid "CONTEXT: %s\n" msgstr "კáƒáƒœáƒ¢áƒ”ქსტი: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1139 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "სქემის სáƒáƒ®áƒ”ლი: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1143 #, c-format msgid "TABLE NAME: %s\n" msgstr "ცხრილის სáƒáƒ®áƒ”ლი: %s\n" -#: fe-protocol3.c:1130 +#: fe-protocol3.c:1147 #, c-format msgid "COLUMN NAME: %s\n" msgstr "სვეტის სáƒáƒ®áƒ”ლი: %s\n" -#: fe-protocol3.c:1134 +#: fe-protocol3.c:1151 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "მáƒáƒœ. ტიპის სáƒáƒ®áƒ”ლი: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1155 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "შეზღუდვის სáƒáƒ®áƒ”ლი: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1167 msgid "LOCATION: " msgstr "მდებáƒáƒ áƒ”áƒáƒ‘áƒ: " -#: fe-protocol3.c:1152 +#: fe-protocol3.c:1169 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1171 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1349 +#: fe-protocol3.c:1366 #, c-format msgid "LINE %d: " msgstr "ხáƒáƒ–ი %d: " -#: fe-protocol3.c:1424 +#: fe-protocol3.c:1440 #, c-format -msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u\n" -msgstr "პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ ვერსირსერვერის მიერ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ: კლიენტი იყენებს %u.%u, სერვერის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი ვერსიის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ˜áƒ %u.%u\n" +msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u" +msgstr "პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ ვერსირსერვერის მიერ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ: კლიენტი იყენებს %u.%u, სერვერის მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი ვერსიის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ›áƒ˜áƒ %u.%u" -#: fe-protocol3.c:1436 +#: fe-protocol3.c:1446 +#, c-format +msgid "protocol extension not supported by server: %s" +msgid_plural "protocol extensions not supported by server: %s" +msgstr[0] "პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბრსერვერის მიერ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ: %s" +msgstr[1] "პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბები სერვერის მიერ მხáƒáƒ áƒ“áƒáƒ­áƒ”რილი áƒáƒ áƒáƒ: %s" + +#: fe-protocol3.c:1454 #, c-format msgid "invalid %s message" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ %s შეტყáƒáƒ‘ინებáƒ" -#: fe-protocol3.c:1801 +#: fe-protocol3.c:1819 #, c-format msgid "PQgetline: not doing text COPY OUT" msgstr "PQgetline: ტექსტის COPY OUT-ს áƒáƒ  გáƒáƒ•áƒáƒ™áƒ”თებ" -#: fe-protocol3.c:2175 +#: fe-protocol3.c:2193 #, c-format msgid "protocol error: no function result" msgstr "პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: ფუნქციის შედეგის გáƒáƒ áƒ”შე" -#: fe-protocol3.c:2186 +#: fe-protocol3.c:2204 #, c-format msgid "protocol error: id=0x%x" msgstr "პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ შეცდáƒáƒ›áƒ: id=0x%x" @@ -1198,6 +1244,13 @@ msgstr "სერტიფიკáƒáƒ¢áƒ˜áƒ¡ IP მისáƒáƒ›áƒáƒ áƒ—ის msgid "host name must be specified for a verified SSL connection" msgstr "შემáƒáƒ¬áƒ›áƒ”ბულ SSL შეერთებáƒáƒ¨áƒ˜ ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლის მითითებრáƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ" +#: fe-secure-common.c:286 +#, c-format +msgid "server certificate for \"%s\" (and %d other name) does not match host name \"%s\"" +msgid_plural "server certificate for \"%s\" (and %d other names) does not match host name \"%s\"" +msgstr[0] "სერვერის სერტიფიკáƒáƒ¢áƒ˜ \"%s\"-თვის (დრკიდევ %d სáƒáƒ®áƒ”ლი) ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლს (\"%s\") áƒáƒ  ემთხვევáƒ" +msgstr[1] "სერვერის სერტიფიკáƒáƒ¢áƒ˜ \"%s\"-თვის (დრკიდევ %d სáƒáƒ®áƒ”ლი) ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლს (\"%s\") áƒáƒ  ემთხვევáƒ" + #: fe-secure-common.c:294 #, c-format msgid "server certificate for \"%s\" does not match host name \"%s\"" @@ -1208,132 +1261,132 @@ msgstr "სერვერის სერტიფიკáƒáƒ¢áƒ˜ \"%s\"-თვ msgid "could not get server's host name from server certificate" msgstr "სერვერის სერტიფიკáƒáƒ¢áƒ˜áƒ“áƒáƒœ ჰáƒáƒ¡áƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლის მიღების შეცდáƒáƒ›áƒ" -#: fe-secure-gssapi.c:201 +#: fe-secure-gssapi.c:194 msgid "GSSAPI wrap error" msgstr "GSSAPI -ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: fe-secure-gssapi.c:208 +#: fe-secure-gssapi.c:201 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "გáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ GSSAPI შეტყáƒáƒ‘ინებრკáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒáƒ‘áƒáƒ¡ ვერ იყენებს" -#: fe-secure-gssapi.c:215 +#: fe-secure-gssapi.c:208 #, c-format msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "კლიენტი ძáƒáƒšáƒ˜áƒáƒœ დიდი GSSAPI პáƒáƒ™áƒ”ტების გáƒáƒ’ზáƒáƒ•ნáƒáƒ¡ ცდილáƒáƒ‘ს (%zu > %zu)" -#: fe-secure-gssapi.c:351 fe-secure-gssapi.c:593 +#: fe-secure-gssapi.c:347 fe-secure-gssapi.c:589 #, c-format msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" msgstr "სერვერის მიერ გáƒáƒ›áƒáƒ’ზáƒáƒ•ნილი GSSAPI-ის პáƒáƒ™áƒ”ტი ძáƒáƒšáƒ˜áƒáƒœ დიდირ(%zu > %zu)" -#: fe-secure-gssapi.c:390 +#: fe-secure-gssapi.c:386 msgid "GSSAPI unwrap error" msgstr "GSSAPI-ის გáƒáƒ“áƒáƒ¢áƒáƒœáƒ˜áƒ¡ მáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ" -#: fe-secure-gssapi.c:399 +#: fe-secure-gssapi.c:395 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "შემáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ GSSAPI შეტყáƒáƒ‘ინებრკáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒáƒ‘áƒáƒ¡ ვერ იყენებს" -#: fe-secure-gssapi.c:656 +#: fe-secure-gssapi.c:652 msgid "could not initiate GSSAPI security context" msgstr "'GSSAPI' უსáƒáƒ¤áƒ áƒ—ხáƒáƒ”ბის კáƒáƒœáƒ¢áƒ”ქსტის დáƒáƒ¬áƒ§áƒ”ბის შეცდáƒáƒ›áƒ" -#: fe-secure-gssapi.c:685 +#: fe-secure-gssapi.c:681 msgid "GSSAPI size check error" msgstr "GSSAPI-ის ზáƒáƒ›áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ" -#: fe-secure-gssapi.c:696 +#: fe-secure-gssapi.c:692 msgid "GSSAPI context establishment error" msgstr "GSSAPI-ის კáƒáƒœáƒ¢áƒ”ქსტის დáƒáƒ›áƒ§áƒáƒ áƒ”ბულáƒáƒ‘ის შეცდáƒáƒ›áƒ" -#: fe-secure-openssl.c:219 fe-secure-openssl.c:319 fe-secure-openssl.c:1531 +#: fe-secure-openssl.c:207 fe-secure-openssl.c:313 fe-secure-openssl.c:1524 #, c-format msgid "SSL SYSCALL error: %s" msgstr "SSL SYSCALL-ის შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:225 fe-secure-openssl.c:325 fe-secure-openssl.c:1534 +#: fe-secure-openssl.c:213 fe-secure-openssl.c:319 fe-secure-openssl.c:1527 #, c-format msgid "SSL SYSCALL error: EOF detected" msgstr "SSL SYSCALL -ის შეცდáƒáƒ›áƒ: ნáƒáƒžáƒáƒ•ნირEOF" -#: fe-secure-openssl.c:235 fe-secure-openssl.c:335 fe-secure-openssl.c:1542 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:329 fe-secure-openssl.c:1535 #, c-format msgid "SSL error: %s" msgstr "SSL-ის შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:249 fe-secure-openssl.c:349 +#: fe-secure-openssl.c:237 fe-secure-openssl.c:343 #, c-format msgid "SSL connection has been closed unexpectedly" msgstr "SSL შეერთებრმáƒáƒ£áƒšáƒáƒ“ნელáƒáƒ“ დáƒáƒ˜áƒ®áƒ£áƒ áƒ" -#: fe-secure-openssl.c:254 fe-secure-openssl.c:354 fe-secure-openssl.c:1589 +#: fe-secure-openssl.c:242 fe-secure-openssl.c:348 fe-secure-openssl.c:1582 #, c-format msgid "unrecognized SSL error code: %d" msgstr "უცნáƒáƒ‘ი SSL-ის შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %d" -#: fe-secure-openssl.c:397 +#: fe-secure-openssl.c:390 #, c-format msgid "could not determine server certificate signature algorithm" msgstr "სერვერის სერტიფიკáƒáƒ¢áƒ˜áƒ¡ ხელმáƒáƒ¬áƒ”რის áƒáƒšáƒ’áƒáƒ áƒ˜áƒ—მის დáƒáƒ“გენრშეუძლებელიáƒ" -#: fe-secure-openssl.c:417 +#: fe-secure-openssl.c:410 #, c-format msgid "could not find digest for NID %s" msgstr "'NID'-ისთვის (%s) დáƒáƒ˜áƒ¯áƒ”სტის პáƒáƒ•ნრშეუძლებელიáƒ" -#: fe-secure-openssl.c:426 +#: fe-secure-openssl.c:419 #, c-format msgid "could not generate peer certificate hash" msgstr "პáƒáƒ áƒ¢áƒœáƒ˜áƒáƒ áƒ˜áƒ¡ სერტიფიკáƒáƒ¢áƒ˜áƒ¡ ჰეშის გენერირების შეცდáƒáƒ›áƒ" -#: fe-secure-openssl.c:509 +#: fe-secure-openssl.c:501 #, c-format msgid "SSL certificate's name entry is missing" msgstr "SSL სერტიფიკáƒáƒ¢áƒ˜áƒ¡ სáƒáƒ®áƒ”ლის ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: fe-secure-openssl.c:543 +#: fe-secure-openssl.c:535 #, c-format msgid "SSL certificate's address entry is missing" msgstr "SSL სერტიფიკáƒáƒ¢áƒ˜áƒ¡ მისáƒáƒ›áƒáƒ áƒ—ის ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: fe-secure-openssl.c:960 +#: fe-secure-openssl.c:935 #, c-format msgid "could not create SSL context: %s" msgstr "შეცდáƒáƒ›áƒ SSL კáƒáƒœáƒ¢áƒ”ქსტის შექმნისáƒáƒ¡: %s" -#: fe-secure-openssl.c:1002 +#: fe-secure-openssl.c:977 #, c-format msgid "invalid value \"%s\" for minimum SSL protocol version" msgstr "'SSL' პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ ვერსიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მინიმáƒáƒšáƒ£áƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: %s" -#: fe-secure-openssl.c:1012 +#: fe-secure-openssl.c:987 #, c-format msgid "could not set minimum SSL protocol version: %s" msgstr "'SSL' პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ ვერსიის მინიმáƒáƒšáƒ£áƒ áƒ˜ მნიშვნელáƒáƒ‘ის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:1028 +#: fe-secure-openssl.c:1003 #, c-format msgid "invalid value \"%s\" for maximum SSL protocol version" msgstr "'SSL' პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ ვერსიის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ მნიშვნელáƒáƒ‘áƒ: %s" -#: fe-secure-openssl.c:1038 +#: fe-secure-openssl.c:1013 #, c-format msgid "could not set maximum SSL protocol version: %s" msgstr "'SSL' პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ ვერსიის მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ áƒ˜ მნიშვნელáƒáƒ‘ის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:1076 +#: fe-secure-openssl.c:1051 #, c-format msgid "could not load system root certificate paths: %s" msgstr "სისტემური root სერტიფიკáƒáƒ¢áƒ”ბის ბილიკების ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:1093 +#: fe-secure-openssl.c:1068 #, c-format msgid "could not read root certificate file \"%s\": %s" msgstr "root სერტიფიკáƒáƒ¢áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:1145 +#: fe-secure-openssl.c:1120 #, c-format msgid "" "could not get home directory to locate root certificate file\n" @@ -1342,7 +1395,7 @@ msgstr "" "root სერტიფიკáƒáƒ¢áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ მáƒáƒ¡áƒáƒ«áƒ”ბნáƒáƒ“ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ სáƒáƒ¥áƒáƒ¦áƒáƒšáƒ“ის მიღებრშეუძლებელიáƒ\n" "áƒáƒ› წáƒáƒ áƒ›áƒáƒáƒ“გინეთ ფáƒáƒ˜áƒšáƒ˜, áƒáƒœ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ სისტემის სáƒáƒœáƒ“რroot-ები პáƒáƒ áƒáƒ›áƒ”ტრით sslrootcert=system, áƒáƒœ sslmode სერვერის სერტიფიკáƒáƒ¢áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბრგáƒáƒ›áƒáƒ áƒ—ეთ." -#: fe-secure-openssl.c:1148 +#: fe-secure-openssl.c:1123 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" @@ -1351,112 +1404,127 @@ msgstr "" "root სერტიფიკáƒáƒ¢áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს\n" "წáƒáƒ áƒ›áƒáƒáƒ“გინეთ ფáƒáƒ˜áƒšáƒ˜ áƒáƒœ გáƒáƒ›áƒáƒ áƒ—ეთ sslmode სერვერის სერტიფიკáƒáƒ¢áƒ˜áƒ¡ შემáƒáƒ¬áƒ›áƒ”ბáƒ." -#: fe-secure-openssl.c:1183 +#: fe-secure-openssl.c:1158 #, c-format msgid "could not open certificate file \"%s\": %s" msgstr "სერტიფიკáƒáƒ¢áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ გáƒáƒ®áƒ¡áƒœáƒ˜áƒ¡ შეცდáƒáƒ›áƒ \"%s\": %s" -#: fe-secure-openssl.c:1201 +#: fe-secure-openssl.c:1176 #, c-format msgid "could not read certificate file \"%s\": %s" msgstr "სერტიფიკáƒáƒ¢áƒ˜áƒ¡ ფáƒáƒ˜áƒšáƒ˜áƒ¡ წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ \"%s\": %s" -#: fe-secure-openssl.c:1225 +#: fe-secure-openssl.c:1200 #, c-format msgid "could not establish SSL connection: %s" msgstr "'SSL' შეერთების დáƒáƒ›áƒ§áƒáƒ áƒ”ბის შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:1257 +#: fe-secure-openssl.c:1232 #, c-format msgid "could not set SSL Server Name Indication (SNI): %s" msgstr "'SSL' სერვერის სáƒáƒ®áƒ”ლის ინდიკáƒáƒªáƒ˜áƒ˜áƒ¡ (SNI) დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:1300 +#: fe-secure-openssl.c:1249 +#, c-format +msgid "could not set SSL ALPN extension: %s" +msgstr "\"SSL ALPN\" გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: %s" + +#: fe-secure-openssl.c:1292 #, c-format msgid "could not load SSL engine \"%s\": %s" msgstr "'SSL' ძრáƒáƒ•ის (\"%s\") ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:1311 +#: fe-secure-openssl.c:1303 #, c-format msgid "could not initialize SSL engine \"%s\": %s" msgstr "'SSL' ძრáƒáƒ•ის (\"%s\") ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:1326 +#: fe-secure-openssl.c:1318 #, c-format msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" msgstr "'SSL'-ის პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის (\"%s\") ძრáƒáƒ•იდáƒáƒœ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:1339 +#: fe-secure-openssl.c:1331 #, c-format msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" msgstr "'SSL'-ის პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის (\"%s\") ძრáƒáƒ•იდáƒáƒœ (\"%s\") წáƒáƒ™áƒ˜áƒ—ხვის შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:1376 +#: fe-secure-openssl.c:1368 #, c-format msgid "certificate present, but not private key file \"%s\"" msgstr "სერტიფიკáƒáƒ¢áƒ˜áƒ¡áƒ’áƒáƒœ გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•ებით, პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: fe-secure-openssl.c:1379 +#: fe-secure-openssl.c:1371 #, c-format msgid "could not stat private key file \"%s\": %m" msgstr "პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს: %m" -#: fe-secure-openssl.c:1387 +#: fe-secure-openssl.c:1379 #, c-format msgid "private key file \"%s\" is not a regular file" msgstr "პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ˜ \"%s\" ჩვეულებრივი ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒáƒ" -#: fe-secure-openssl.c:1420 +#: fe-secure-openssl.c:1412 #, c-format msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root" msgstr "პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ¡ \"%s\" áƒáƒ¥áƒ•ს ჯგუფური áƒáƒœ ყველრსხვáƒáƒ–ე წვდáƒáƒ›áƒ; ფáƒáƒ˜áƒšáƒ¡ უნდრჰქáƒáƒœáƒ“ეს ნებáƒáƒ áƒ—ვები u=rw (0600) áƒáƒœ ნáƒáƒ™áƒšáƒ”ბი, თუ ეკუთვნის áƒáƒ›áƒŸáƒáƒ›áƒ˜áƒœáƒ“ელ მáƒáƒ›áƒ®áƒ›áƒáƒ áƒ”ბელს, áƒáƒœ ნებáƒáƒ áƒ—ვები u=rw,g=r (0640) áƒáƒœ ნáƒáƒ™áƒšáƒ”ბი, თუ ეკუთვნის root-ს" -#: fe-secure-openssl.c:1444 +#: fe-secure-openssl.c:1436 #, c-format msgid "could not load private key file \"%s\": %s" msgstr "პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ˜áƒ¡ \"%s\" ჩáƒáƒ¢áƒ•ირთვის შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:1460 +#: fe-secure-openssl.c:1452 #, c-format msgid "certificate does not match private key file \"%s\": %s" msgstr "სერტიფიკáƒáƒ¢áƒ˜ პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ¡ (\"%s\") áƒáƒ  ემთხვევáƒ: %s" -#: fe-secure-openssl.c:1528 +#: fe-secure-openssl.c:1521 #, c-format msgid "SSL error: certificate verify failed: %s" msgstr "SSL-ის შეცდáƒáƒ›áƒ: სერტიფიკáƒáƒ¢áƒ˜áƒ¡ გáƒáƒ“áƒáƒ›áƒáƒ¬áƒ›áƒ”ბის შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:1573 +#: fe-secure-openssl.c:1566 #, c-format msgid "This may indicate that the server does not support any SSL protocol version between %s and %s." msgstr "ეს შეიძლებრნიშნáƒáƒ•დეს, რáƒáƒ› სერვერს SSL პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ %s-სრდრ%s-ს შáƒáƒ áƒ˜áƒ¡ ვერსიების მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ." -#: fe-secure-openssl.c:1606 +#: fe-secure-openssl.c:1598 +#, c-format +msgid "direct SSL connection was established without ALPN protocol negotiation extension" +msgstr "პირდáƒáƒžáƒ˜áƒ áƒ˜ SSL მიერთებრდáƒáƒ›áƒ§áƒáƒ áƒ“რALPN პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ შეთáƒáƒœáƒ®áƒ›áƒ”ბის გáƒáƒ¤áƒáƒ áƒ—áƒáƒ”ბის გáƒáƒ áƒ”შე" + +#: fe-secure-openssl.c:1610 +#, c-format +msgid "SSL connection was established with unexpected ALPN protocol" +msgstr "SSL შეერთებრდáƒáƒ›áƒ§áƒáƒ áƒ“რმáƒáƒ£áƒšáƒáƒ“ნელი ALPN პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ—" + +#: fe-secure-openssl.c:1627 #, c-format msgid "certificate could not be obtained: %s" msgstr "სერტიფიკáƒáƒ¢áƒ˜áƒ¡ მიღების შეცდáƒáƒ›áƒ: %s" -#: fe-secure-openssl.c:1711 +#: fe-secure-openssl.c:1734 #, c-format msgid "no SSL error reported" msgstr "'SSL'-ის შეცდáƒáƒ›áƒ”ბის გáƒáƒ áƒ”შე" -#: fe-secure-openssl.c:1720 +#: fe-secure-openssl.c:1777 #, c-format msgid "SSL error code %lu" msgstr "SSL-ის შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %lu" -#: fe-secure-openssl.c:1986 +#: fe-secure-openssl.c:2076 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "გáƒáƒ¤áƒ áƒ—ხილებáƒ: sslpasswrord შეკვეცილიáƒ\n" -#: fe-secure.c:263 +#: fe-secure.c:248 #, c-format msgid "could not receive data from server: %s" msgstr "სერვერიდáƒáƒœ მáƒáƒœáƒáƒªáƒ”მების მიღების შეცდáƒáƒ›áƒ: %s" -#: fe-secure.c:434 +#: fe-secure.c:419 #, c-format msgid "could not send data to server: %s" msgstr "სერვერისთვის მáƒáƒœáƒáƒªáƒ”მების გáƒáƒ’ზáƒáƒ•ნის შეცდáƒáƒ›áƒ: %s" @@ -1470,6 +1538,10 @@ msgstr "სáƒáƒ™áƒ”ტის უცნáƒáƒ‘ი შეცდáƒáƒ›áƒ: 0x%08X/% #~ msgid "%s(%s) failed: error code %d\n" #~ msgstr "%s(%s) -ის შეცდáƒáƒ›áƒ: შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი %d\n" +#, c-format +#~ msgid "GSSAPI encryption required but it is not supported over a local socket)" +#~ msgstr "GSSAPI დáƒáƒ¨áƒ˜áƒ¤áƒ•რრმáƒáƒ—ხáƒáƒ•ნილიáƒ, მáƒáƒ’რáƒáƒ› შეუძლებელირლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ სáƒáƒ™áƒ”ტის გáƒáƒ›áƒáƒ§áƒ”ნებით)" + #~ msgid "SCM_CRED authentication method not supported\n" #~ msgstr "SCM_CRED áƒáƒ•თენტიკáƒáƒªáƒ˜áƒ˜áƒ¡ მეთáƒáƒ“ი მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელიáƒ\n" @@ -1496,13 +1568,41 @@ msgstr "სáƒáƒ™áƒ”ტის უცნáƒáƒ‘ი შეცდáƒáƒ›áƒ: 0x%08X/% #~ msgid "incoming GSSAPI message did not use confidentiality\n" #~ msgstr "შემáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ GSSAPI შეტყáƒáƒ‘ინებრკáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒáƒ‘áƒáƒ¡ áƒáƒ  იყენებს\n" +#, c-format +#~ msgid "invalid require_auth method: \"%s\"" +#~ msgstr "require_auth-ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ მეთáƒáƒ“ი: \"%s\"" + +#, c-format +#~ msgid "keepalives parameter must be an integer" +#~ msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი keepalives მთელი რიცხვი უნდრიყáƒáƒ¡" + +#, c-format +#~ msgid "no application protocol" +#~ msgstr "áƒáƒžáƒšáƒ˜áƒ™áƒáƒªáƒ˜áƒ˜áƒ¡ პრáƒáƒ¢áƒáƒ™áƒáƒšáƒ˜áƒ¡ გáƒáƒ áƒ”შე" + #~ msgid "outgoing GSSAPI message would not use confidentiality\n" #~ msgstr "გáƒáƒ›áƒáƒ•áƒáƒšáƒ˜ GSSAPI შეტყáƒáƒ‘ინებრკáƒáƒœáƒ¤áƒ˜áƒ“ენციáƒáƒšáƒáƒ‘áƒáƒ¡ áƒáƒ  იყენებს\n" +#, c-format +#~ msgid "passed connection is not open" +#~ msgstr "გáƒáƒ“áƒáƒªáƒ”მული მიერთებრღირáƒáƒ áƒáƒ" + +#, c-format +#~ msgid "passed connection was NULL" +#~ msgstr "გáƒáƒ“áƒáƒªáƒ”მული მიერთებრნულáƒáƒ•áƒáƒœáƒ˜áƒ" + #, c-format #~ msgid "private key file \"%s\" is not a regular file\n" #~ msgstr "პირáƒáƒ“ი გáƒáƒ¡áƒáƒ¦áƒ”ბის ფáƒáƒ˜áƒšáƒ˜ \"%s\" ჩვეულებრივი ფáƒáƒ˜áƒšáƒ˜ áƒáƒ áƒáƒ\n" +#, c-format +#~ msgid "sslnegotiation value \"%s\" invalid when SSL support is not compiled in" +#~ msgstr "sslnegotiation-ის მნიშვნელáƒáƒ‘რ\"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜áƒ, რáƒáƒªáƒ SSL-ის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრგáƒáƒ›áƒáƒ áƒ—ული იყრáƒáƒ’ების დრáƒáƒ¡" + +#, c-format +#~ msgid "unknown command type provided" +#~ msgstr "მითითებულირუცნáƒáƒ‘ი ბრძáƒáƒœáƒ”ბის ტიპი" + #, c-format #~ msgid "unrecognized SSL error code: %d\n" #~ msgstr "უცნáƒáƒ‘ი SSL-ის შეცდáƒáƒ›áƒ˜áƒ¡ კáƒáƒ“ი: %d\n" diff --git a/src/interfaces/libpq/po/ko.po b/src/interfaces/libpq/po/ko.po index 602069ae8bff8..8660174ba9ad3 100644 --- a/src/interfaces/libpq/po/ko.po +++ b/src/interfaces/libpq/po/ko.po @@ -3,11 +3,11 @@ # msgid "" msgstr "" -"Project-Id-Version: libpq (PostgreSQL) 13\n" +"Project-Id-Version: libpq (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 01:09+0000\n" -"PO-Revision-Date: 2020-10-05 17:53+0900\n" -"Last-Translator: Ioseph Kim \n" +"POT-Creation-Date: 2025-01-17 04:40+0000\n" +"PO-Revision-Date: 2025-01-16 12:49+0900\n" +"Last-Translator: YOUR NAME \n" "Language-Team: Korean \n" "Language: ko\n" "MIME-Version: 1.0\n" @@ -15,646 +15,834 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: fe-auth-scram.c:212 -msgid "malformed SCRAM message (empty message)\n" -msgstr "SCRAM 메시지가 형ì‹ì— ì•ˆë§žìŒ (메시지 비었ìŒ)\n" +#: ../../port/user.c:43 ../../port/user.c:79 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "UID %d 해당하는 로컬 사용ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" -#: fe-auth-scram.c:218 -msgid "malformed SCRAM message (length mismatch)\n" -msgstr "SCRAM 메시지가 형ì‹ì— ì•ˆë§žìŒ (ê¸¸ì´ ë¶ˆì¼ì¹˜)\n" +#: ../../port/user.c:48 ../../port/user.c:84 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "ID %d 로컬 ì‚¬ìš©ìž ì—†ìŒ" -#: fe-auth-scram.c:265 -msgid "incorrect server signature\n" -msgstr "ìž˜ëª»ëœ ì„œë²„ 서명\n" +#: fe-auth-scram.c:223 +#, c-format +msgid "malformed SCRAM message (empty message)" +msgstr "SCRAM 메시지가 형ì‹ì— ì•ˆë§žìŒ (메시지 비었ìŒ)" -#: fe-auth-scram.c:274 -msgid "invalid SCRAM exchange state\n" -msgstr "SCRAM êµí™” ìƒíƒœê°€ 바르지 않ìŒ\n" +#: fe-auth-scram.c:228 +#, c-format +msgid "malformed SCRAM message (length mismatch)" +msgstr "SCRAM 메시지가 형ì‹ì— ì•ˆë§žìŒ (ê¸¸ì´ ë¶ˆì¼ì¹˜)" -#: fe-auth-scram.c:296 +#: fe-auth-scram.c:272 #, c-format -msgid "malformed SCRAM message (attribute \"%c\" expected)\n" -msgstr "SCRAM 메시지가 형ì‹ì— ì•ˆë§žìŒ (\"%c\" ì†ì„±ì´ 예ìƒë¨)\n" +msgid "could not verify server signature: %s" +msgstr "서버 ì„œëª…ì„ ê²€ì‚¬ í•  수 ì—†ìŒ: %s" -#: fe-auth-scram.c:305 +#: fe-auth-scram.c:278 #, c-format -msgid "" -"malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" -msgstr "SCRAM 메시지가 형ì‹ì— ì•ˆë§žìŒ (\"%c\" ì†ì„± 예ìƒê°’ì€ \"=\")\n" - -#: fe-auth-scram.c:346 -msgid "could not generate nonce\n" -msgstr "암호화 토í°(nonce)ì„ ë§Œë“¤ 수 ì—†ìŒ\n" - -#: fe-auth-scram.c:356 fe-auth-scram.c:431 fe-auth-scram.c:579 -#: fe-auth-scram.c:600 fe-auth-scram.c:626 fe-auth-scram.c:641 -#: fe-auth-scram.c:691 fe-auth-scram.c:725 fe-auth.c:289 fe-auth.c:359 -#: fe-auth.c:394 fe-auth.c:611 fe-auth.c:770 fe-auth.c:1129 fe-auth.c:1277 -#: fe-connect.c:892 fe-connect.c:1419 fe-connect.c:1595 fe-connect.c:2200 -#: fe-connect.c:2223 fe-connect.c:2952 fe-connect.c:4598 fe-connect.c:4854 -#: fe-connect.c:4973 fe-connect.c:5226 fe-connect.c:5306 fe-connect.c:5405 -#: fe-connect.c:5661 fe-connect.c:5690 fe-connect.c:5762 fe-connect.c:5786 -#: fe-connect.c:5804 fe-connect.c:5905 fe-connect.c:5914 fe-connect.c:6270 -#: fe-connect.c:6420 fe-exec.c:2747 fe-exec.c:3494 fe-exec.c:3659 -#: fe-gssapi-common.c:111 fe-lobj.c:895 fe-protocol2.c:1207 fe-protocol3.c:995 -#: fe-protocol3.c:1699 fe-secure-common.c:110 fe-secure-gssapi.c:504 -#: fe-secure-openssl.c:440 fe-secure-openssl.c:1091 -msgid "out of memory\n" -msgstr "메모리 부족\n" +msgid "incorrect server signature" +msgstr "ìž˜ëª»ëœ ì„œë²„ 서명" + +#: fe-auth-scram.c:287 +#, c-format +msgid "invalid SCRAM exchange state" +msgstr "SCRAM êµí™˜ ìƒíƒœê°€ 바르지 않ìŒ" + +#: fe-auth-scram.c:311 +#, c-format +msgid "malformed SCRAM message (attribute \"%c\" expected)" +msgstr "SCRAM 메시지가 형ì‹ì— ì•ˆë§žìŒ (\"%c\" ì†ì„±ì´ 예ìƒë¨)" + +#: fe-auth-scram.c:320 +#, c-format +msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")" +msgstr "SCRAM 메시지가 형ì‹ì— ì•ˆë§žìŒ (\"%c\" ì†ì„± 예ìƒê°’ì€ \"=\")" + +#: fe-auth-scram.c:360 +#, c-format +msgid "could not generate nonce" +msgstr "암호화 토í°(nonce)ì„ ë§Œë“¤ 수 ì—†ìŒ" + +#: fe-auth-scram.c:369 fe-auth-scram.c:442 fe-auth-scram.c:594 +#: fe-auth-scram.c:614 fe-auth-scram.c:638 fe-auth-scram.c:652 +#: fe-auth-scram.c:698 fe-auth-scram.c:734 fe-auth-scram.c:908 fe-auth.c:296 +#: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:727 fe-auth.c:1200 +#: fe-auth.c:1363 fe-cancel.c:159 fe-connect.c:936 fe-connect.c:976 +#: fe-connect.c:1860 fe-connect.c:2022 fe-connect.c:3430 fe-connect.c:4761 +#: fe-connect.c:5073 fe-connect.c:5328 fe-connect.c:5446 fe-connect.c:5693 +#: fe-connect.c:5773 fe-connect.c:5871 fe-connect.c:6122 fe-connect.c:6149 +#: fe-connect.c:6225 fe-connect.c:6248 fe-connect.c:6272 fe-connect.c:6307 +#: fe-connect.c:6393 fe-connect.c:6401 fe-connect.c:6758 fe-connect.c:6908 +#: fe-exec.c:530 fe-exec.c:1315 fe-exec.c:3254 fe-exec.c:4234 fe-exec.c:4398 +#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:209 fe-protocol3.c:232 +#: fe-protocol3.c:255 fe-protocol3.c:272 fe-protocol3.c:293 fe-protocol3.c:369 +#: fe-protocol3.c:737 fe-protocol3.c:976 fe-protocol3.c:1787 +#: fe-protocol3.c:2187 fe-secure-common.c:110 fe-secure-gssapi.c:496 +#: fe-secure-openssl.c:427 fe-secure-openssl.c:1277 +#, c-format +msgid "out of memory" +msgstr "메모리 부족" + +#: fe-auth-scram.c:376 +#, c-format +msgid "could not encode nonce" +msgstr "암호화 토í°(nonce)ì„ ì¸ì½”딩할 수 ì—†ìŒ" -#: fe-auth-scram.c:364 -msgid "could not encode nonce\n" -msgstr "암호화 토í°(nonce)ì„ ì¸ì½”딩할 수 ì—†ìŒ\n" +#: fe-auth-scram.c:564 +#, c-format +msgid "could not calculate client proof: %s" +msgstr "í´ë¼ì´ì–¸íЏ 프루프(proof)를 계산할 수 ì—†ìŒ: %s" -#: fe-auth-scram.c:563 -msgid "could not encode client proof\n" -msgstr "í´ë¼ì´ì–¸íЏ 프루프(proof)를 ì¸ì½”딩할 수 ì—†ìŒ\n" +#: fe-auth-scram.c:579 +#, c-format +msgid "could not encode client proof" +msgstr "í´ë¼ì´ì–¸íЏ 프루프(proof)를 ì¸ì½”딩할 수 ì—†ìŒ" -#: fe-auth-scram.c:618 -msgid "invalid SCRAM response (nonce mismatch)\n" -msgstr "ìž˜ëª»ëœ SCRAM ì‘답 (í† í° ë¶ˆì¼ì¹˜)\n" +#: fe-auth-scram.c:631 +#, c-format +msgid "invalid SCRAM response (nonce mismatch)" +msgstr "ìž˜ëª»ëœ SCRAM ì‘답 (í† í° ë¶ˆì¼ì¹˜)" -#: fe-auth-scram.c:651 -msgid "malformed SCRAM message (invalid salt)\n" -msgstr "형ì‹ì— ë§žì§€ ì•Šì€ SCRAM 메시지 (ìž˜ëª»ëœ ì†Œê¸ˆ)\n" +#: fe-auth-scram.c:661 +#, c-format +msgid "malformed SCRAM message (invalid salt)" +msgstr "형ì‹ì— ë§žì§€ ì•Šì€ SCRAM 메시지 (ìž˜ëª»ëœ ì†Œê¸ˆ salt)" -#: fe-auth-scram.c:665 -msgid "malformed SCRAM message (invalid iteration count)\n" -msgstr "형ì‹ì— ë§žì§€ ì•Šì€ SCRAM 메시지 (나열 숫ìžê°€ ì´ìƒí•¨)\n" +#: fe-auth-scram.c:674 +#, c-format +msgid "malformed SCRAM message (invalid iteration count)" +msgstr "형ì‹ì— ë§žì§€ ì•Šì€ SCRAM 메시지 (나열 숫ìžê°€ ì´ìƒí•¨)" -#: fe-auth-scram.c:671 -msgid "malformed SCRAM message (garbage at end of server-first-message)\n" +#: fe-auth-scram.c:679 +#, c-format +msgid "malformed SCRAM message (garbage at end of server-first-message)" msgstr "" -"형ì‹ì— ë§žì§€ ì•Šì€ SCRAM 메시지 (서버 첫 메시지 ëì— ì“¸ëª¨ 없는 ê°’ì´ ìžˆìŒ)\n" +"형ì‹ì— ë§žì§€ ì•Šì€ SCRAM 메시지 (서버 첫 메시지 ëì— ì“¸ëª¨ 없는 ê°’ì´ ìžˆìŒ)" -#: fe-auth-scram.c:702 +#: fe-auth-scram.c:713 #, c-format -msgid "error received from server in SCRAM exchange: %s\n" -msgstr "SCRAM êµí™˜ìž‘ì—…ì—서 서버로부터 ë°ì´í„°ë¥¼ 받지 못했ìŒ: %s\n" +msgid "error received from server in SCRAM exchange: %s" +msgstr "SCRAM êµí™˜ìž‘ì—…ì—서 서버로부터 ë°ì´í„°ë¥¼ 받지 못했ìŒ: %s" -#: fe-auth-scram.c:718 -msgid "malformed SCRAM message (garbage at end of server-final-message)\n" +#: fe-auth-scram.c:728 +#, c-format +msgid "malformed SCRAM message (garbage at end of server-final-message)" msgstr "" -"형ì‹ì— ë§žì§€ ì•Šì€ SCRAM 메시지 (서버 ë 메시지 ë’¤ì— ì“¸ëª¨ 없는 ê°’ì´ ìžˆìŒ)\n" +"형ì‹ì— ë§žì§€ ì•Šì€ SCRAM 메시지 (서버 ë 메시지 ë’¤ì— ì“¸ëª¨ 없는 ê°’ì´ ìžˆìŒ)" -#: fe-auth-scram.c:737 -msgid "malformed SCRAM message (invalid server signature)\n" -msgstr "형ì‹ì— ë§žì§€ ì•Šì€ SCRAM 메시지 (서버 사ì¸ì´ ì´ìƒí•¨)\n" +#: fe-auth-scram.c:745 +#, c-format +msgid "malformed SCRAM message (invalid server signature)" +msgstr "형ì‹ì— ë§žì§€ ì•Šì€ SCRAM 메시지 (서버 ì„œëª…ì´ ì´ìƒí•¨)" + +#: fe-auth-scram.c:917 +msgid "could not generate random salt" +msgstr "무작위 솔트 ìƒì„± 실패" -#: fe-auth.c:76 +#: fe-auth.c:77 #, c-format -msgid "out of memory allocating GSSAPI buffer (%d)\n" -msgstr "GSSAPI 버í¼(%d)ì— í• ë‹¹í•  메모리 부족\n" +msgid "out of memory allocating GSSAPI buffer (%d)" +msgstr "GSSAPI 버í¼(%d)ì— í• ë‹¹í•  메모리 부족" -#: fe-auth.c:131 +#: fe-auth.c:138 msgid "GSSAPI continuation error" msgstr "GSSAPI ì—°ì† ì˜¤ë¥˜" -#: fe-auth.c:158 fe-auth.c:388 fe-gssapi-common.c:98 fe-secure-common.c:98 -msgid "host name must be specified\n" -msgstr "호스트 ì´ë¦„ì„ ì§€ì •í•´ì•¼ 함\n" +#: fe-auth.c:168 fe-auth.c:397 fe-gssapi-common.c:97 fe-secure-common.c:99 +#: fe-secure-common.c:173 +#, c-format +msgid "host name must be specified" +msgstr "호스트 ì´ë¦„ì„ ì§€ì •í•´ì•¼ 함" -#: fe-auth.c:165 -msgid "duplicate GSS authentication request\n" -msgstr "ì¤‘ë³µëœ GSS ì¸ì¦ 요청\n" +#: fe-auth.c:174 +#, c-format +msgid "duplicate GSS authentication request" +msgstr "ì¤‘ë³µëœ GSS ì¸ì¦ 요청" -#: fe-auth.c:230 +#: fe-auth.c:238 #, c-format -msgid "out of memory allocating SSPI buffer (%d)\n" -msgstr "SSPI 버í¼(%d)ì— í• ë‹¹í•  메모리 부족\n" +msgid "out of memory allocating SSPI buffer (%d)" +msgstr "SSPI 버í¼(%d)ì— í• ë‹¹í•  메모리 부족" -#: fe-auth.c:278 +#: fe-auth.c:285 msgid "SSPI continuation error" msgstr "SSPI ì—°ì† ì˜¤ë¥˜" -#: fe-auth.c:349 -msgid "duplicate SSPI authentication request\n" -msgstr "ì¤‘ë³µëœ SSPI ì¸ì¦ 요청\n" +#: fe-auth.c:359 +#, c-format +msgid "duplicate SSPI authentication request" +msgstr "ì¤‘ë³µëœ SSPI ì¸ì¦ 요청" -#: fe-auth.c:374 +#: fe-auth.c:384 msgid "could not acquire SSPI credentials" msgstr "SSPI ìžê²© ì¦ëª…ì„ ê°€ì ¸ì˜¬ 수 ì—†ìŒ" -#: fe-auth.c:429 -msgid "channel binding required, but SSL not in use\n" -msgstr "ì±„ë„ ë°”ì¸ë”©ì´ 필요한ë°, SSL ê¸°ëŠ¥ì´ êº¼ì ¸ìžˆìŒ\n" - #: fe-auth.c:436 -msgid "duplicate SASL authentication request\n" -msgstr "ì¤‘ë³µëœ SASL ì¸ì¦ 요청\n" +#, c-format +msgid "channel binding required, but SSL not in use" +msgstr "ì±„ë„ ë°”ì¸ë”©ì´ 필요한ë°, SSL ê¸°ëŠ¥ì´ êº¼ì ¸ìžˆìŒ" + +#: fe-auth.c:442 +#, c-format +msgid "duplicate SASL authentication request" +msgstr "ì¤‘ë³µëœ SASL ì¸ì¦ 요청" -#: fe-auth.c:492 -msgid "channel binding is required, but client does not support it\n" -msgstr "ì±„ë„ ë°”ì¸ë”©ì´ 필요한ë°, í´ë¼ì´ì–¸íЏì—서 ì§€ì›í•˜ì§€ 않ìŒ\n" +#: fe-auth.c:500 +#, c-format +msgid "channel binding is required, but client does not support it" +msgstr "ì±„ë„ ë°”ì¸ë”©ì´ 필요한ë°, í´ë¼ì´ì–¸íЏì—서 ì§€ì›í•˜ì§€ 않ìŒ" -#: fe-auth.c:509 +#: fe-auth.c:516 +#, c-format msgid "" -"server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" -msgstr "서버는 non-SSL ì ‘ì†ìœ¼ë¡œ SCRAM-SHA-256-PLUS ì¸ì¦ì„ 제공함\n" +"server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection" +msgstr "서버는 non-SSL ì ‘ì†ìœ¼ë¡œ SCRAM-SHA-256-PLUS ì¸ì¦ì„ 제공함" -#: fe-auth.c:521 -msgid "none of the server's SASL authentication mechanisms are supported\n" -msgstr "SASL ì¸ì¦ ë©”ì»¤ë‹ˆì¦˜ì„ ì§€ì›í•˜ëŠ” 서버가 없습니다.\n" +#: fe-auth.c:531 +#, c-format +msgid "none of the server's SASL authentication mechanisms are supported" +msgstr "SASL ì¸ì¦ ë©”ì»¤ë‹ˆì¦˜ì„ ì§€ì›í•˜ëŠ” 서버가 없습니다." -#: fe-auth.c:529 +#: fe-auth.c:538 +#, c-format msgid "" "channel binding is required, but server did not offer an authentication " -"method that supports channel binding\n" +"method that supports channel binding" msgstr "" -"ì±„ë„ ë°”ì¸ë”© ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë„ë¡ ì§€ì •í–ˆì§€ë§Œ, 서버가 ì´ ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않ìŒ\n" +"ì±„ë„ ë°”ì¸ë”© ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë„ë¡ ì§€ì •í–ˆì§€ë§Œ, 서버가 ì´ ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: fe-auth.c:635 +#: fe-auth.c:640 #, c-format -msgid "out of memory allocating SASL buffer (%d)\n" -msgstr "SASL 버í¼(%d)ì— í• ë‹¹í•  메모리 부족\n" +msgid "out of memory allocating SASL buffer (%d)" +msgstr "SASL 버í¼(%d)ì— í• ë‹¹í•  메모리 부족" -#: fe-auth.c:660 +#: fe-auth.c:663 +#, c-format msgid "" "AuthenticationSASLFinal received from server, but SASL authentication was " -"not completed\n" +"not completed" msgstr "" -"서버ì—서 AuthenticationSASLFinal ì‘ë‹µì„ ë°›ì•˜ì§€ë§Œ, SASL ì¸ì¦ì´ ë나지 않았ìŒ\n" +"서버ì—서 AuthenticationSASLFinal ì‘ë‹µì„ ë°›ì•˜ì§€ë§Œ, SASL ì¸ì¦ì´ ë나지 않았ìŒ" + +#: fe-auth.c:673 +#, c-format +msgid "no client response found after SASL exchange success" +msgstr "SASL êµí™˜ 성공 후 í´ë¼ì´ì–¸íЏ ë°˜ì‘ ì—†ìŒ" + +#: fe-auth.c:736 fe-auth.c:743 fe-auth.c:1346 fe-auth.c:1357 +#, c-format +msgid "could not encrypt password: %s" +msgstr "비밀번호를 암호화 í•  수 ì—†ìŒ: %s" + +#: fe-auth.c:772 +msgid "server requested a cleartext password" +msgstr "서버가 í‰ë¬¸ 비밀번호를 요청했ìŒ" + +#: fe-auth.c:774 +msgid "server requested a hashed password" +msgstr "서버가 í•´ì‹œëœ ë¹„ë°€ë²ˆí˜¸ë¥¼ 요청했ìŒ" -#: fe-auth.c:737 -msgid "SCM_CRED authentication method not supported\n" -msgstr "SCM_CRED ì¸ì¦ ë°©ë²•ì´ ì§€ì›ë˜ì§€ 않ìŒ\n" +#: fe-auth.c:777 +msgid "server requested GSSAPI authentication" +msgstr "서버가 GSSAPI ì¸ì¦ì„ 요청했ìŒ" -#: fe-auth.c:836 +#: fe-auth.c:779 +msgid "server requested SSPI authentication" +msgstr "서버가 SSPI ì¸ì¦ì„ 요청했ìŒ" + +#: fe-auth.c:783 +msgid "server requested SASL authentication" +msgstr "서버가 SASL ì¸ì¦ì„ 요청했ìŒ" + +#: fe-auth.c:786 +msgid "server requested an unknown authentication type" +msgstr "서버가 알 수 없는 ì¸ì¦ 형ì‹ì„ 요청했ìŒ" + +#: fe-auth.c:819 +#, c-format +msgid "server did not request an SSL certificate" +msgstr "서버가 SSL ì¸ì¦ì„œë¥¼ 요청하지 않았ìŒ" + +#: fe-auth.c:824 +#, c-format +msgid "server accepted connection without a valid SSL certificate" +msgstr "서버가 SSL ì¸ì¦ì„œ 유효성 검사 ì—†ì´ ì ‘ì†ì„ 허용했ìŒ" + +#: fe-auth.c:878 +msgid "server did not complete authentication" +msgstr "서버가 ì¸ì¦ 절차를 완료하지 못했ìŒ" + +#: fe-auth.c:912 +#, c-format +msgid "authentication method requirement \"%s\" failed: %s" +msgstr "\"%s\" ì¸ì¦ 방법 요구 사항 실패: %s" + +#: fe-auth.c:935 +#, c-format msgid "" "channel binding required, but server authenticated client without channel " -"binding\n" -msgstr "" -"ì±„ë„ ë°”ì¸ë”©ì´ 필요한ë°, 서버가 ì²´ë„ ë°”ì¸ë”© ì—†ì´ í´ë¼ì´ì–¸íŠ¸ë¥¼ ì¸ì¦í•¨\n" +"binding" +msgstr "ì±„ë„ ë°”ì¸ë”©ì´ 필요한ë°, 서버가 ì²´ë„ ë°”ì¸ë”© ì—†ì´ í´ë¼ì´ì–¸íŠ¸ë¥¼ ì¸ì¦í•¨" -#: fe-auth.c:842 +#: fe-auth.c:940 +#, c-format msgid "" -"channel binding required but not supported by server's authentication " -"request\n" -msgstr "" -"ì±„ë„ ë°”ì¸ë”©ì´ 필요한ë°, 서버 ì¸ì¦ 요청ì—서 ì§€ì›í•˜ì§€ 않ìŒ\n" +"channel binding required but not supported by server's authentication request" +msgstr "ì±„ë„ ë°”ì¸ë”©ì´ 필요한ë°, 서버 ì¸ì¦ 요청ì—서 ì§€ì›í•˜ì§€ 않ìŒ" -#: fe-auth.c:875 -msgid "Kerberos 4 authentication not supported\n" -msgstr "Kerberos 4 ì¸ì¦ ë°©ë²•ì´ ì§€ì›ë˜ì§€ 않ìŒ\n" +#: fe-auth.c:974 +#, c-format +msgid "Kerberos 4 authentication not supported" +msgstr "Kerberos 4 ì¸ì¦ ë°©ë²•ì´ ì§€ì›ë˜ì§€ 않ìŒ" -#: fe-auth.c:880 -msgid "Kerberos 5 authentication not supported\n" -msgstr "Kerberos 5 ì¸ì¦ ë°©ë²•ì´ ì§€ì›ë˜ì§€ 않ìŒ\n" +#: fe-auth.c:978 +#, c-format +msgid "Kerberos 5 authentication not supported" +msgstr "Kerberos 5 ì¸ì¦ ë°©ë²•ì´ ì§€ì›ë˜ì§€ 않ìŒ" -#: fe-auth.c:951 -msgid "GSSAPI authentication not supported\n" -msgstr "GSSAPI ì¸ì¦ì€ ì§€ì›ë˜ì§€ 않ìŒ\n" +#: fe-auth.c:1048 +#, c-format +msgid "GSSAPI authentication not supported" +msgstr "GSSAPI ì¸ì¦ì€ ì§€ì›ë˜ì§€ 않ìŒ" -#: fe-auth.c:983 -msgid "SSPI authentication not supported\n" -msgstr "SSPI ì¸ì¦ì€ ì§€ì›ë˜ì§€ 않ìŒ\n" +#: fe-auth.c:1079 +#, c-format +msgid "SSPI authentication not supported" +msgstr "SSPI ì¸ì¦ì€ ì§€ì›ë˜ì§€ 않ìŒ" -#: fe-auth.c:991 -msgid "Crypt authentication not supported\n" -msgstr "암호화 ì¸ì¦ì€ ì§€ì›ë˜ì§€ 않ìŒ\n" +#: fe-auth.c:1086 +#, c-format +msgid "Crypt authentication not supported" +msgstr "crypt ì¸ì¦ì€ ì§€ì›ë˜ì§€ 않ìŒ" -#: fe-auth.c:1057 +#: fe-auth.c:1150 #, c-format -msgid "authentication method %u not supported\n" -msgstr "%u ì¸ì¦ ë°©ë²•ì´ ì§€ì›ë˜ì§€ 않ìŒ\n" +msgid "authentication method %u not supported" +msgstr "%u ì¸ì¦ ë°©ë²•ì´ ì§€ì›ë˜ì§€ 않ìŒ" -#: fe-auth.c:1104 +#: fe-auth.c:1187 #, c-format -msgid "user name lookup failure: error code %lu\n" -msgstr "ì‚¬ìš©ìž ì´ë¦„ 찾기 실패: 오류 코드 %lu\n" +msgid "user name lookup failure: error code %lu" +msgstr "ì‚¬ìš©ìž ì´ë¦„ 찾기 실패: 오류 코드 %lu" -#: fe-auth.c:1114 fe-connect.c:2834 +#: fe-auth.c:1309 #, c-format -msgid "could not look up local user ID %d: %s\n" -msgstr "UID %d 해당하는 사용ìžë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ: %s\n" +msgid "unexpected shape of result set returned for SHOW" +msgstr "SHOW ëª…ë ¹ì˜ ê²°ê³¼ ìžë£Œê°€ 비정ìƒìž„" -#: fe-auth.c:1119 fe-connect.c:2839 +#: fe-auth.c:1317 #, c-format -msgid "local user with ID %d does not exist\n" -msgstr "ID %d 로컬 ì‚¬ìš©ìž ì—†ìŒ\n" +msgid "\"password_encryption\" value too long" +msgstr "\"password_encryption\" ì„¤ì •ê°’ì´ ë„ˆë¬´ 긺" -#: fe-auth.c:1221 -msgid "unexpected shape of result set returned for SHOW\n" -msgstr "SHOW ëª…ë ¹ì˜ ê²°ê³¼ ìžë£Œê°€ 비정ìƒìž„\n" +#: fe-auth.c:1367 +#, c-format +msgid "unrecognized password encryption algorithm \"%s\"" +msgstr "알 수 없는 비밀번호 암호화 알고리즘: \"%s\"" -#: fe-auth.c:1230 -msgid "password_encryption value too long\n" -msgstr "password_encryption 너무 긺\n" +#: fe-cancel.c:76 +#, c-format +msgid "connection pointer is NULL" +msgstr "ì—°ê²° í¬ì¸í„°ê°€ NULL" -#: fe-auth.c:1270 +#: fe-cancel.c:82 fe-misc.c:572 #, c-format -msgid "unrecognized password encryption algorithm \"%s\"\n" -msgstr "알 수 없는 비밀번호 암호화 알고리즘: \"%s\"\n" +msgid "connection not open" +msgstr "ì—°ê²° 열기 실패" -#: fe-connect.c:1075 +#: fe-cancel.c:193 #, c-format -msgid "could not match %d host names to %d hostaddr values\n" -msgstr "호스트 ì´ë¦„ì€ %dê°œì¸ë°, 호스트 주소는 %d개임\n" +msgid "cancel request is already being sent on this connection" +msgstr "취소 ìš”ì²­ì„ ì´ë¯¸ 해당 ì—°ê²°ì— ë³´ëƒˆìŒ" -#: fe-connect.c:1156 +#: fe-cancel.c:263 #, c-format -msgid "could not match %d port numbers to %d hosts\n" -msgstr "í¬íЏ 번호는 %dê°œì¸ë°, 호스트는 %d개입니다.\n" +msgid "unexpected response from server" +msgstr "서버로부터 기대ë˜ì§€ 않는 ì‘답" -#: fe-connect.c:1249 +#: fe-connect.c:1182 #, c-format -msgid "invalid channel_binding value: \"%s\"\n" -msgstr "ìž˜ëª»ëœ channel_binding ê°’: \"%s\"\n" +msgid "could not match %d host names to %d hostaddr values" +msgstr "호스트 ì´ë¦„ì€ %dê°œì¸ë°, 호스트 주소는 %d개임" -#: fe-connect.c:1275 +#: fe-connect.c:1262 #, c-format -msgid "invalid sslmode value: \"%s\"\n" -msgstr "ìž˜ëª»ëœ sslmode ê°’: \"%s\"\n" +msgid "could not match %d port numbers to %d hosts" +msgstr "í¬íЏ 번호는 %dê°œì¸ë°, 호스트는 %d개입니다." -#: fe-connect.c:1296 +#: fe-connect.c:1387 #, c-format -msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" +msgid "" +"negative require_auth method \"%s\" cannot be mixed with non-negative methods" msgstr "" -"SSL ì—°ê²° ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않고 ì»´íŒŒì¼ ëœ ê²½ìš°ëŠ” sslmode 값으로 \"%s\" ê°’ì€ íƒ€" -"당치 않습니다\n" +"\"%s\" negative require_auth ë°©ë²•ì€ non-negative 방법과 함께 쓸 수 ì—†ìŒ" + +#: fe-connect.c:1400 +#, c-format +msgid "require_auth method \"%s\" cannot be mixed with negative methods" +msgstr "\"%s\" require_auth ë°©ë²•ì€ negative 방법과 함께 쓸 수 ì—†ìŒ" -#: fe-connect.c:1317 +#: fe-connect.c:1460 fe-connect.c:1511 fe-connect.c:1553 fe-connect.c:1596 +#: fe-connect.c:1699 fe-connect.c:1745 fe-connect.c:1785 fe-connect.c:1806 #, c-format -msgid "invalid ssl_min_protocol_version value: \"%s\"\n" -msgstr "ìž˜ëª»ëœ ssl_min_protocol_version ê°’: \"%s\"\n" +msgid "invalid %s value: \"%s\"" +msgstr "ìž˜ëª»ëœ %s ê°’: \"%s\"" -#: fe-connect.c:1325 +#: fe-connect.c:1493 #, c-format -msgid "invalid ssl_max_protocol_version value: \"%s\"\n" -msgstr "ìž˜ëª»ëœ ssl_max_protocol_version ê°’: \"%s\"\n" +msgid "require_auth method \"%s\" is specified more than once" +msgstr "\"%s\" require_auth ë°©ë²•ì„ í•œ 번 ì´ìƒ 지정했ìŒ" -#: fe-connect.c:1342 -msgid "invalid SSL protocol version range\n" -msgstr "ìž˜ëª»ëœ SSL 프로토콜 버전 범위\n" +#: fe-connect.c:1534 fe-connect.c:1573 fe-connect.c:1605 fe-connect.c:1707 +#, c-format +msgid "%s value \"%s\" invalid when SSL support is not compiled in" +msgstr "" +"SSL ì—°ê²° ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않고 ì»´íŒŒì¼ ëœ ê²½ìš°ëŠ” %s 값으로 \"%s\" ê°’ì€ íƒ€ë‹¹ì¹˜ " +"않습니다." -#: fe-connect.c:1357 +#: fe-connect.c:1625 #, c-format -msgid "invalid gssencmode value: \"%s\"\n" -msgstr "ìž˜ëª»ëœ gssencmode ê°’: \"%s\"\n" +msgid "" +"weak sslmode \"%s\" may not be used with sslnegotiation=direct (use " +"\"require\", \"verify-ca\", or \"verify-full\")" +msgstr "" +"\"%s\" 엄격하지 ì•Šì€ sslmode ì„¤ì •ì¼ ë•ŒëŠ” sslnegotiation=direct ì„¤ì •ì„ í•  수 " +"ì—†ìŒ (\"require\", \"verify-ca\", ë˜ëŠ” \"verify-full\" ì„¤ì •ì„ ì‚¬ìš©í•˜ì„¸ìš”)" -#: fe-connect.c:1366 +#: fe-connect.c:1647 #, c-format msgid "" -"gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" +"weak sslmode \"%s\" may not be used with sslrootcert=system (use \"verify-" +"full\")" msgstr "" -"GSSAPI ì ‘ì†ì„ ì§€ì›í•˜ì§€ 않는 서버ì—서는 gssencmode ê°’(\"%s\")ì´ ì ë‹¹í•˜ì§€ 않" -"ìŒ\n" +"\"%s\" 엄격하지 ì•Šì€ sslmode ì„¤ì •ì¼ ë•ŒëŠ” sslrootcert=system ì„¤ì •ì„ í•  수 ì—†" +"ìŒ (\"verify-full\" ì„¤ì •ì„ ì‚¬ìš©í•˜ì„¸ìš”)" -#: fe-connect.c:1401 +#: fe-connect.c:1660 fe-connect.c:1668 #, c-format -msgid "invalid target_session_attrs value: \"%s\"\n" -msgstr "ìž˜ëª»ëœ target_session_attrs ê°’: \"%s\"\n" +msgid "invalid \"%s\" value: \"%s\"" +msgstr "ìž˜ëª»ëœ \"%s\" ê°’: \"%s\"" -#: fe-connect.c:1619 +#: fe-connect.c:1685 #, c-format -msgid "could not set socket to TCP no delay mode: %s\n" -msgstr "ì†Œì¼“ì„ TCPì— no delay 모드로 지정할 수 ì—†ìŒ: %s\n" +msgid "invalid SSL protocol version range" +msgstr "ìž˜ëª»ëœ SSL 프로토콜 버전 범위" -#: fe-connect.c:1680 +#: fe-connect.c:1722 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running locally and accepting\n" -"\tconnections on Unix domain socket \"%s\"?\n" +msgid "%s value \"%s\" is not supported (check OpenSSL version)" +msgstr "%s 설정 \"%s\" ê°’ì€ ì§€ì›í•˜ì§€ ì•ŠìŒ (OpenSSL ë²„ì „ì„ í™•ì¸í•˜ì„¸ìš”)" + +#: fe-connect.c:1752 +#, c-format +msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in" msgstr "" -"ì„œë²„ì— ì—°ê²°í•  수 ì—†ìŒ: %s\n" -"\të¡œì»¬í˜¸ìŠ¤íŠ¸ì— ì„œë²„ê°€ ê°€ë™ ì¤‘ì¸ì§€,\n" -"\t\"%s\" 유닉스 ë„ë©”ì¸ ì†Œì¼“ ì ‘ê·¼ì´ ê°€ëŠ¥í•œì§€ 살펴보십시오.\n" +"GSSAPI ì ‘ì†ì„ ì§€ì›í•˜ì§€ 않는 서버ì—서는 gssencmode ê°’(\"%s\")ì´ ì ë‹¹í•˜ì§€ 않ìŒ" + +#: fe-connect.c:2045 +#, c-format +msgid "could not set socket to TCP no delay mode: %s" +msgstr "ì†Œì¼“ì„ TCPì— no delay 모드로 지정할 수 ì—†ìŒ: %s" + +#: fe-connect.c:2104 +#, c-format +msgid "connection to server on socket \"%s\" failed: " +msgstr "\"%s\" 소켓으로 서버 ì ‘ì† í•  수 ì—†ìŒ: " + +#: fe-connect.c:2130 +#, c-format +msgid "connection to server at \"%s\" (%s), port %s failed: " +msgstr "\"%s\" (%s), %s í¬íŠ¸ë¡œ 서버 ì ‘ì† í•  수 ì—†ìŒ: " + +#: fe-connect.c:2135 +#, c-format +msgid "connection to server at \"%s\", port %s failed: " +msgstr "\"%s\" í¬íЏ %s ì„œë²„ì— ì ‘ì† í•  수 ì—†ìŒ: " -#: fe-connect.c:1717 +#: fe-connect.c:2158 #, c-format msgid "" -"could not connect to server: %s\n" -"\tIs the server running on host \"%s\" (%s) and accepting\n" -"\tTCP/IP connections on port %s?\n" +"\tIs the server running locally and accepting connections on that socket?" msgstr "" -"ì„œë²„ì— ì—°ê²°í•  수 ì—†ìŒ: %s\n" -"\t\"%s\" (%s) í˜¸ìŠ¤íŠ¸ì— ì„œë²„ê°€ ê°€ë™ ì¤‘ì¸ì§€,\n" -"\t%s í¬íŠ¸ë¡œ TCP/IP ì—°ê²°ì´ ê°€ëŠ¥í•œì§€ 살펴보십시오.\n" +"\t로컬 ì—°ê²°ì„ ì‹œë„ ì¤‘ì´ê³ , 유닉스 ë„ë©”ì¸ ì†Œì¼“ ì ‘ì†ì„ 허용하는지 확ì¸í•˜ì„¸ìš”." -#: fe-connect.c:1725 +#: fe-connect.c:2160 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running on host \"%s\" and accepting\n" -"\tTCP/IP connections on port %s?\n" +msgid "\tIs the server running on that host and accepting TCP/IP connections?" msgstr "" -"ì„œë²„ì— ì—°ê²°í•  수 ì—†ìŒ: %s\n" -"\t\"%s\" í˜¸ìŠ¤íŠ¸ì— ì„œë²„ê°€ ê°€ë™ ì¤‘ì¸ì§€,\n" -"\t%s í¬íŠ¸ë¡œ TCP/IP ì—°ê²°ì´ ê°€ëŠ¥í•œì§€ 살펴보십시오.\n" +"\t해당 í˜¸ìŠ¤íŠ¸ì— ì„œë²„ê°€ 실행 중ì´ê³ , TCP/IP ì ‘ì†ì„ 허용하는지 확ì¸í•˜ì„¸ìš”." -#: fe-connect.c:1795 +#: fe-connect.c:2206 fe-connect.c:2240 fe-connect.c:2275 fe-connect.c:2373 +#: fe-connect.c:3098 #, c-format -msgid "invalid integer value \"%s\" for connection option \"%s\"\n" -msgstr "ìž˜ëª»ëœ ì •ìˆ˜ê°’: \"%s\", 해당 ì—°ê²° 옵션: \"%s\"\n" +msgid "%s(%s) failed: %s" +msgstr "%s(%s) 실패: %s" -#: fe-connect.c:1825 fe-connect.c:1859 fe-connect.c:1894 fe-connect.c:1981 -#: fe-connect.c:2623 +#: fe-connect.c:2339 #, c-format -msgid "setsockopt(%s) failed: %s\n" -msgstr "setsockopt(%s) 실패: %s\n" +msgid "%s(%s) failed: error code %d" +msgstr "%s(%s) 실패: 오류 코드 %d" -#: fe-connect.c:1947 +#: fe-connect.c:2650 #, c-format -msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" -msgstr "WSAIoctl(SIO_KEEPALIVE_VALS) 실패: %ui\n" +msgid "invalid connection state, probably indicative of memory corruption" +msgstr "ìž˜ëª»ëœ ì—°ê²° ìƒíƒœ, 메모리 ì†ìƒì¼ ê°€ëŠ¥ì„±ì´ í¼" -#: fe-connect.c:2313 -msgid "invalid connection state, probably indicative of memory corruption\n" -msgstr "ìž˜ëª»ëœ ì—°ê²° ìƒíƒœ, 메모리 ì†ìƒì¼ ê°€ëŠ¥ì„±ì´ í¼\n" +#: fe-connect.c:2733 +#, c-format +msgid "invalid port number: \"%s\"" +msgstr "ìž˜ëª»ëœ í¬íЏ 번호: \"%s\"" -#: fe-connect.c:2379 +#: fe-connect.c:2747 #, c-format -msgid "invalid port number: \"%s\"\n" -msgstr "ìž˜ëª»ëœ í¬íЏ 번호: \"%s\"\n" +msgid "could not translate host name \"%s\" to address: %s" +msgstr "\"%s\" 호스트 ì´ë¦„ IP 주소로 바꿀 수 ì—†ìŒ: %s" -#: fe-connect.c:2395 +#: fe-connect.c:2759 #, c-format -msgid "could not translate host name \"%s\" to address: %s\n" -msgstr "\"%s\" 호스트 ì´ë¦„ì„ ì „ì†¡í•  수 없습니다: ëŒ€ìƒ ì£¼ì†Œ: %s\n" +msgid "could not parse network address \"%s\": %s" +msgstr "\"%s\" ë„¤íŠ¸ì›Œí¬ ì£¼ì†Œë¥¼ í•´ì„í•  수 ì—†ìŒ: %s" -#: fe-connect.c:2408 +#: fe-connect.c:2770 #, c-format -msgid "could not parse network address \"%s\": %s\n" -msgstr "\"%s\" ë„¤íŠ¸ì›Œí¬ ì£¼ì†Œë¥¼ í•´ì„í•  수 ì—†ìŒ: %s\n" +msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" +msgstr "\"%s\" 유닉스 ë„ë©”ì¸ ì†Œì¼“ 경로가 너무 ê¹ë‹ˆë‹¤ (최대 %d ë°”ì´íЏ)" -#: fe-connect.c:2421 +#: fe-connect.c:2784 #, c-format -msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" -msgstr "\"%s\" 유닉스 ë„ë©”ì¸ ì†Œì¼“ 경로가 너무 ê¹ë‹ˆë‹¤ (최대 %d ë°”ì´íЏ)\n" +msgid "could not translate Unix-domain socket path \"%s\" to address: %s" +msgstr "\"%s\" 유닉스 ë„ë©”ì¸ ì†Œì¼“ 경로를 주소로 바꿀 수 ì—†ìŒ: %s" -#: fe-connect.c:2436 +#: fe-connect.c:2950 fe-connect.c:4305 #, c-format -msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" -msgstr "\"%s\" 유닉스 ë„ë©”ì¸ ì†Œì¼“ 경로를 전송할 수 없습니다: ëŒ€ìƒ ì£¼ì†Œ: %s\n" +msgid "GSSAPI encryption required but it is not supported over a local socket" +msgstr "GSSAPI 암호화가 필요하지만 로컬 ì†Œì¼“ì„ ì‚¬ìš©í•  때는 ì§€ì›í•˜ì§€ 않ìŒ" -#: fe-connect.c:2560 +#: fe-connect.c:2958 fe-connect.c:4434 #, c-format -msgid "could not create socket: %s\n" -msgstr "ì†Œì¼“ì„ ë§Œë“¤ 수 ì—†ìŒ: %s\n" +msgid "GSSAPI encryption required but no credential cache" +msgstr "GSSAPI 암호화가 í•„ìš”í•œë° ìžê²© ì¦ëª… ìºì‹œê°€ ì—†ìŒ" -#: fe-connect.c:2582 +#: fe-connect.c:3026 #, c-format -msgid "could not set socket to nonblocking mode: %s\n" -msgstr "ì†Œì¼“ì„ nonblocking 모드로 지정할 수 ì—†ìŒ: %s\n" +msgid "could not create socket: %s" +msgstr "ì†Œì¼“ì„ ë§Œë“¤ 수 ì—†ìŒ: %s" -#: fe-connect.c:2592 +#: fe-connect.c:3057 #, c-format -msgid "could not set socket to close-on-exec mode: %s\n" -msgstr "ì†Œì¼“ì„ close-on-exec 모드로 지정할 수 ì—†ìŒ: %s\n" +msgid "could not set socket to nonblocking mode: %s" +msgstr "ì†Œì¼“ì„ nonblocking 모드로 지정할 수 ì—†ìŒ: %s" -#: fe-connect.c:2610 -msgid "keepalives parameter must be an integer\n" -msgstr "keepalives ë§¤ê°œë³€ìˆ˜ê°’ì€ ì •ìˆ˜ì—¬ì•¼ 합니다.\n" +#: fe-connect.c:3068 +#, c-format +msgid "could not set socket to close-on-exec mode: %s" +msgstr "ì†Œì¼“ì„ close-on-exec 모드로 지정할 수 ì—†ìŒ: %s" -#: fe-connect.c:2750 +#: fe-connect.c:3225 #, c-format -msgid "could not get socket error status: %s\n" -msgstr "소켓 오류 ìƒíƒœë¥¼ 구할 수 ì—†ìŒ: %s\n" +msgid "could not get socket error status: %s" +msgstr "소켓 오류 ìƒíƒœë¥¼ 구할 수 ì—†ìŒ: %s" -#: fe-connect.c:2778 +#: fe-connect.c:3252 #, c-format -msgid "could not get client address from socket: %s\n" -msgstr "소켓ì—서 í´ë¼ì´ì–¸íЏ 주소를 구할 수 ì—†ìŒ: %s\n" +msgid "could not get client address from socket: %s" +msgstr "소켓ì—서 í´ë¼ì´ì–¸íЏ 주소를 구할 수 ì—†ìŒ: %s" -#: fe-connect.c:2820 -msgid "requirepeer parameter is not supported on this platform\n" -msgstr "requirepeer 매개변수는 ì´ ìš´ì˜ì²´ì œì—서 ì§€ì›í•˜ì§€ 않ìŒ\n" +#: fe-connect.c:3278 +#, c-format +msgid "requirepeer parameter is not supported on this platform" +msgstr "requirepeer 매개변수는 ì´ ìš´ì˜ì²´ì œì—서 ì§€ì›í•˜ì§€ 않ìŒ" -#: fe-connect.c:2823 +#: fe-connect.c:3280 #, c-format -msgid "could not get peer credentials: %s\n" -msgstr "신뢰성 피어를 ì–»ì„ ìˆ˜ 없습니다: %s\n" +msgid "could not get peer credentials: %s" +msgstr "신뢰성 피어를 ì–»ì„ ìˆ˜ 없습니다: %s" -#: fe-connect.c:2847 +#: fe-connect.c:3293 #, c-format -msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" +msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"" msgstr "" -"\"%s\" ì´ë¦„으로 requirepeer를 지정했지만, 실재 ì‚¬ìš©ìž ì´ë¦„ì€ \"%s\" 입니다\n" +"\"%s\" ì´ë¦„으로 requirepeer를 지정했지만, 실재 ì‚¬ìš©ìž ì´ë¦„ì€ \"%s\" 입니다." -#: fe-connect.c:2887 +#: fe-connect.c:3331 #, c-format -msgid "could not send GSSAPI negotiation packet: %s\n" -msgstr "GSSAPI êµì„­ íŒ¨í‚·ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s\n" +msgid "could not send GSSAPI negotiation packet: %s" +msgstr "GSSAPI êµì„­ íŒ¨í‚·ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s" -#: fe-connect.c:2899 -msgid "" -"GSSAPI encryption required but was impossible (possibly no credential cache, " -"no server support, or using a local socket)\n" -msgstr "" -"GSSAPI 암호화가 필요하지만 사용할 수 ì—†ìŒ (ìžê²© ì¦ëª… ìºì‹œê°€ 없거나, 서버가 ì§€" -"ì›í•˜ì§€ 않거나, 로컬 ì†Œì¼“ì„ ì‚¬ìš©í•˜ê³  있는 듯합니다.)\n" +#: fe-connect.c:3380 +#, c-format +msgid "could not send SSL negotiation packet: %s" +msgstr "SSL êµì„­ íŒ¨í‚·ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s" + +#: fe-connect.c:3412 +#, c-format +msgid "could not send cancel packet: %s" +msgstr "취소 íŒ¨í‚·ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s" -#: fe-connect.c:2926 +#: fe-connect.c:3442 #, c-format -msgid "could not send SSL negotiation packet: %s\n" -msgstr "SSL êµì„­ íŒ¨í‚·ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s\n" +msgid "could not send startup packet: %s" +msgstr "시작 íŒ¨í‚·ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s" -#: fe-connect.c:2965 +#: fe-connect.c:3509 +msgid "server does not support SSL, but SSL was required" +msgstr "서버가 SSL ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않는ë°, SSL ê¸°ëŠ¥ì„ ìš”êµ¬í–ˆìŒ" + +#: fe-connect.c:3519 +#, c-format +msgid "server sent an error response during SSL exchange" +msgstr "SSL êµí™˜ ì¤‘ì— ì„œë²„ê°€ 오류 ì‘ë‹µì„ ë³´ëƒˆìŒ" + +#: fe-connect.c:3524 +#, c-format +msgid "received invalid response to SSL negotiation: %c" +msgstr "SSL êµì„­ì— 대한 ìž˜ëª»ëœ ì‘ë‹µì„ ê°ì§€í–ˆìŒ: %c" + +#: fe-connect.c:3552 +#, c-format +msgid "received unencrypted data after SSL response" +msgstr "SSL ì‘답 í›„ì— ë¹„ì•”í˜¸í™” ë°ì´í„°ë¥¼ 받았ìŒ" + +#: fe-connect.c:3615 +#, c-format +msgid "server sent an error response during GSS encryption exchange" +msgstr "GSS 암호화 êµí™˜ ì¤‘ì— ì„œë²„ê°€ 오류 ì‘ë‹µì„ ë³´ëƒˆìŒ" + +#: fe-connect.c:3629 +msgid "server doesn't support GSSAPI encryption, but it was required" +msgstr "서버가 GSSAPI 암호화 ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않는ë°, ì´ê²ƒì´ 필요함" + +#: fe-connect.c:3633 +#, c-format +msgid "received invalid response to GSSAPI negotiation: %c" +msgstr "GSSAPI êµì„­ì— 대한 ìž˜ëª»ëœ ì‘ë‹µì„ ê°ì§€í–ˆìŒ: %c" + +#: fe-connect.c:3651 #, c-format -msgid "could not send startup packet: %s\n" -msgstr "시작 íŒ¨í‚·ì„ ë³´ë‚¼ 수 ì—†ìŒ: %s\n" +msgid "received unencrypted data after GSSAPI encryption response" +msgstr "GSSAPI 암호화 ì‘답 후 비암호화 ë°ì´í„° 받았ìŒ" -#: fe-connect.c:3035 -msgid "server does not support SSL, but SSL was required\n" -msgstr "서버가 SSL ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않는ë°, SSL ê¸°ëŠ¥ì„ ìš”êµ¬í–ˆìŒ\n" +#: fe-connect.c:3711 +#, c-format +msgid "expected authentication request from server, but received %c" +msgstr "서버가 ì¸ì¦ì„ 요구했지만, %c 받았ìŒ" + +#: fe-connect.c:3739 fe-connect.c:3862 +#, c-format +msgid "received invalid authentication request" +msgstr "ìž˜ëª»ëœ ì¸ì¦ ìš”ì²­ì„ ë°›ì•˜ìŒ" -#: fe-connect.c:3061 +#: fe-connect.c:3745 fe-connect.c:3847 #, c-format -msgid "received invalid response to SSL negotiation: %c\n" -msgstr "SSL êµì„­ì— 대한 ìž˜ëª»ëœ ì‘ë‹µì„ ê°ì§€í–ˆìŒ: %c\n" +msgid "received invalid protocol negotiation message" +msgstr "ìž˜ëª»ëœ í”„ë¡œí† ì½œ êµì„­ 메시지를 받았ìŒ" -#: fe-connect.c:3151 -msgid "server doesn't support GSSAPI encryption, but it was required\n" -msgstr "서버가 GSSAPI 암호화 ê¸°ëŠ¥ì„ ì§€ì›í•˜ì§€ 않는ë°, ì´ê²ƒì´ 필요함\n" +#: fe-connect.c:3764 fe-connect.c:3818 +#, c-format +msgid "received invalid error message" +msgstr "ìž˜ëª»ëœ ì˜¤ë¥˜ 메시지를 받았ìŒ" -#: fe-connect.c:3162 +#: fe-connect.c:3933 #, c-format -msgid "received invalid response to GSSAPI negotiation: %c\n" -msgstr "GSSAPI êµì„­ì— 대한 ìž˜ëª»ëœ ì‘ë‹µì„ ê°ì§€í–ˆìŒ: %c\n" +msgid "unexpected message from server during startup" +msgstr "시작하는 ë™ì•ˆ 서버로부터 기대ë˜ì§€ 않는 메시지" -#: fe-connect.c:3229 fe-connect.c:3260 +#: fe-connect.c:4024 #, c-format -msgid "expected authentication request from server, but received %c\n" -msgstr "서버가 ì¸ì¦ì„ 요구했지만, %c 받았ìŒ\n" +msgid "session is read-only" +msgstr "ì„¸ì…˜ì´ ì½ê¸° 전용임" -#: fe-connect.c:3502 -msgid "unexpected message from server during startup\n" -msgstr "시작하는 ë™ì•ˆ 서버로부터 기대ë˜ì§€ 않는 메시지\n" +#: fe-connect.c:4026 +#, c-format +msgid "session is not read-only" +msgstr "ì„¸ì…˜ì´ ì½ê¸° ì „ìš©ì´ ì•„ë‹˜" -#: fe-connect.c:3707 +#: fe-connect.c:4079 #, c-format -msgid "could not make a writable connection to server \"%s:%s\"\n" -msgstr "\"%s:%s\" ì„œë²„ì— ì“°ê¸° 가능한 ì—°ê²°ì„ ë§ºì„ ìˆ˜ ì—†ìŒ\n" +msgid "server is in hot standby mode" +msgstr "서버가 hot standby 모드 ìƒíƒœìž„" -#: fe-connect.c:3753 +#: fe-connect.c:4081 #, c-format -msgid "test \"SHOW transaction_read_only\" failed on server \"%s:%s\"\n" -msgstr "\"%s:%s\" 서버ì—서 \"SHOW transaction_read_only\" 검사가 실패함\n" +msgid "server is not in hot standby mode" +msgstr "서버가 hot standby 모드 ìƒíƒœê°€ 아님" -#: fe-connect.c:3768 +#: fe-connect.c:4203 fe-connect.c:4253 #, c-format -msgid "invalid connection state %d, probably indicative of memory corruption\n" -msgstr "ìž˜ëª»ëœ ì—°ê²° ìƒíƒœ %d, 메모리 ì†ìƒì¼ ê°€ëŠ¥ì„±ì´ í¼\n" +msgid "\"%s\" failed" +msgstr "\"%s\" 실패" -#: fe-connect.c:4204 fe-connect.c:4264 +#: fe-connect.c:4267 #, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEVT_CONNRESET ì´ë²¤íЏ ë™ì•ˆ PGEventProc \"%s\"ì´(ê°€) 실패함\n" +msgid "invalid connection state %d, probably indicative of memory corruption" +msgstr "ìž˜ëª»ëœ ì—°ê²° ìƒíƒœ %d, 메모리 ì†ìƒì¼ ê°€ëŠ¥ì„±ì´ í¼" -#: fe-connect.c:4611 +#: fe-connect.c:5086 #, c-format -msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" -msgstr "ìž˜ëª»ëœ LDAP URL \"%s\": 스키마는 ldap:// 여야함\n" +msgid "invalid LDAP URL \"%s\": scheme must be ldap://" +msgstr "ìž˜ëª»ëœ LDAP URL \"%s\": 스키마는 ldap:// 여야함" -#: fe-connect.c:4626 +#: fe-connect.c:5101 #, c-format -msgid "invalid LDAP URL \"%s\": missing distinguished name\n" -msgstr "ìž˜ëª»ëœ LDAP URL \"%s\": ì‹ë³„ìž ì´ë¦„ì´ ë¹ ì¡ŒìŒ\n" +msgid "invalid LDAP URL \"%s\": missing distinguished name" +msgstr "ìž˜ëª»ëœ LDAP URL \"%s\": ì‹ë³„ìž ì´ë¦„ì´ ë¹ ì¡ŒìŒ" -#: fe-connect.c:4638 fe-connect.c:4693 +#: fe-connect.c:5113 fe-connect.c:5171 #, c-format -msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" -msgstr "ìž˜ëª»ëœ LDAP URL \"%s\": 단 í•˜ë‚˜ì˜ ì†ì„±ë§Œ 가져야함\n" +msgid "invalid LDAP URL \"%s\": must have exactly one attribute" +msgstr "ìž˜ëª»ëœ LDAP URL \"%s\": 단 í•˜ë‚˜ì˜ ì†ì„±ë§Œ 가져야함" -#: fe-connect.c:4649 fe-connect.c:4708 +#: fe-connect.c:5125 fe-connect.c:5187 #, c-format -msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" -msgstr "ìž˜ëª»ëœ LDAP URL \"%s\": 검색범위(base/one/sub)를 지정해야함\n" +msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" +msgstr "ìž˜ëª»ëœ LDAP URL \"%s\": 검색범위(base/one/sub)를 지정해야함" -#: fe-connect.c:4660 +#: fe-connect.c:5137 #, c-format -msgid "invalid LDAP URL \"%s\": no filter\n" -msgstr "ìž˜ëª»ëœ LDAP URL \"%s\": í•„í„° ì—†ìŒ\n" +msgid "invalid LDAP URL \"%s\": no filter" +msgstr "ìž˜ëª»ëœ LDAP URL \"%s\": í•„í„° ì—†ìŒ" -#: fe-connect.c:4681 +#: fe-connect.c:5159 #, c-format -msgid "invalid LDAP URL \"%s\": invalid port number\n" -msgstr "ìž˜ëª»ëœ LDAP URL \"%s\": í¬íŠ¸ë²ˆí˜¸ê°€ 잘못ë¨\n" +msgid "invalid LDAP URL \"%s\": invalid port number" +msgstr "ìž˜ëª»ëœ LDAP URL \"%s\": í¬íŠ¸ë²ˆí˜¸ê°€ 잘못ë¨" -#: fe-connect.c:4717 -msgid "could not create LDAP structure\n" -msgstr "LDAP 구조를 만들 수 ì—†ìŒ\n" +#: fe-connect.c:5196 +#, c-format +msgid "could not create LDAP structure" +msgstr "LDAP 구조를 만들 수 ì—†ìŒ" -#: fe-connect.c:4793 +#: fe-connect.c:5271 #, c-format -msgid "lookup on LDAP server failed: %s\n" -msgstr "LDAP 서버를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s\n" +msgid "lookup on LDAP server failed: %s" +msgstr "LDAP 서버를 ì°¾ì„ ìˆ˜ ì—†ìŒ: %s" -#: fe-connect.c:4804 -msgid "more than one entry found on LDAP lookup\n" -msgstr "LDAP 검색ì—서 하나 ì´ìƒì˜ 엔트리가 발견ë˜ì—ˆìŒ\n" +#: fe-connect.c:5281 +#, c-format +msgid "more than one entry found on LDAP lookup" +msgstr "LDAP 검색ì—서 하나 ì´ìƒì˜ 엔트리가 발견ë˜ì—ˆìŒ" -#: fe-connect.c:4805 fe-connect.c:4817 -msgid "no entry found on LDAP lookup\n" -msgstr "LDAP 검색ì—서 해당 항목 ì—†ìŒ\n" +#: fe-connect.c:5283 fe-connect.c:5294 +#, c-format +msgid "no entry found on LDAP lookup" +msgstr "LDAP 검색ì—서 해당 항목 ì—†ìŒ" -#: fe-connect.c:4828 fe-connect.c:4841 -msgid "attribute has no values on LDAP lookup\n" -msgstr "LDAP 검색ì—서 ì†ì„±ì˜ ê°’ì´ ì—†ìŒ\n" +#: fe-connect.c:5304 fe-connect.c:5316 +#, c-format +msgid "attribute has no values on LDAP lookup" +msgstr "LDAP 검색ì—서 ì†ì„±ì˜ ê°’ì´ ì—†ìŒ" -#: fe-connect.c:4893 fe-connect.c:4912 fe-connect.c:5444 +#: fe-connect.c:5367 fe-connect.c:5386 fe-connect.c:5910 #, c-format -msgid "missing \"=\" after \"%s\" in connection info string\n" -msgstr "연결문ìžì—´ì—서 \"%s\" 다ìŒì— \"=\" ë¬¸ìž ë¹ ì¡ŒìŒ\n" +msgid "missing \"=\" after \"%s\" in connection info string" +msgstr "연결문ìžì—´ì—서 \"%s\" 다ìŒì— \"=\" ë¬¸ìž ë¹ ì¡ŒìŒ" -#: fe-connect.c:4985 fe-connect.c:5629 fe-connect.c:6403 +#: fe-connect.c:5457 fe-connect.c:6093 fe-connect.c:6891 #, c-format -msgid "invalid connection option \"%s\"\n" -msgstr "ìž˜ëª»ëœ ì—°ê²° 옵션 \"%s\"\n" +msgid "invalid connection option \"%s\"" +msgstr "ìž˜ëª»ëœ ì—°ê²° 옵션 \"%s\"" -#: fe-connect.c:5001 fe-connect.c:5493 -msgid "unterminated quoted string in connection info string\n" -msgstr "연결문ìžì—´ì—서 완성ë˜ì§€ 못한 따옴표문ìžì—´ì´ 있ìŒ\n" +#: fe-connect.c:5472 fe-connect.c:5958 +#, c-format +msgid "unterminated quoted string in connection info string" +msgstr "연결문ìžì—´ì—서 완성ë˜ì§€ 못한 따옴표문ìžì—´ì´ 있ìŒ" -#: fe-connect.c:5084 +#: fe-connect.c:5552 #, c-format -msgid "definition of service \"%s\" not found\n" -msgstr "\"%s\" 서비스 ì •ì˜ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ\n" +msgid "definition of service \"%s\" not found" +msgstr "\"%s\" 서비스 ì •ì˜ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: fe-connect.c:5107 +#: fe-connect.c:5578 #, c-format -msgid "service file \"%s\" not found\n" -msgstr "\"%s\" 서비스 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ\n" +msgid "service file \"%s\" not found" +msgstr "\"%s\" 서비스 파ì¼ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: fe-connect.c:5122 +#: fe-connect.c:5591 #, c-format -msgid "line %d too long in service file \"%s\"\n" -msgstr "%d번째 ì¤„ì´ \"%s\" 서비스 파ì¼ì—서 너무 ê¹ë‹ˆë‹¤\n" +msgid "line %d too long in service file \"%s\"" +msgstr "%d번째 ì¤„ì´ \"%s\" 서비스 파ì¼ì—서 너무 ê¹ë‹ˆë‹¤" -#: fe-connect.c:5194 fe-connect.c:5238 +#: fe-connect.c:5662 fe-connect.c:5705 #, c-format -msgid "syntax error in service file \"%s\", line %d\n" -msgstr "\"%s\" 서비스 파ì¼ì˜ %d번째 ì¤„ì— êµ¬ë¬¸ 오류 있ìŒ\n" +msgid "syntax error in service file \"%s\", line %d" +msgstr "\"%s\" 서비스 파ì¼ì˜ %d번째 ì¤„ì— êµ¬ë¬¸ 오류 있ìŒ" -#: fe-connect.c:5205 +#: fe-connect.c:5673 #, c-format msgid "" -"nested service specifications not supported in service file \"%s\", line %d\n" -msgstr "\"%s\" 서비스 파ì¼ì˜ %d번째 ì¤„ì— ì„¤ì •ì„ ì§€ì›í•˜ì§€ 않ìŒ\n" +"nested service specifications not supported in service file \"%s\", line %d" +msgstr "\"%s\" 서비스 파ì¼ì˜ %d번째 ì¤„ì— ì„¤ì •ì„ ì§€ì›í•˜ì§€ 않ìŒ" -#: fe-connect.c:5925 +#: fe-connect.c:6412 #, c-format -msgid "invalid URI propagated to internal parser routine: \"%s\"\n" -msgstr "URI 구문 ë¶„ì„ì„ í•  수 ì—†ìŒ: \"%s\"\n" +msgid "invalid URI propagated to internal parser routine: \"%s\"" +msgstr "URI 구문 ë¶„ì„ì„ í•  수 ì—†ìŒ: \"%s\"" -#: fe-connect.c:6002 +#: fe-connect.c:6489 #, c-format msgid "" "end of string reached when looking for matching \"]\" in IPv6 host address " -"in URI: \"%s\"\n" +"in URI: \"%s\"" msgstr "" -"URIì˜ IPv6 호스트 주소ì—서 \"]\" 매칭 ê²€ìƒ‰ì„ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤, 해당 URI: \"%s\"\n" +"URIì˜ IPv6 호스트 주소ì—서 \"]\" 매칭 ê²€ìƒ‰ì„ ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤, 해당 URI: \"%s\"" -#: fe-connect.c:6009 +#: fe-connect.c:6496 #, c-format -msgid "IPv6 host address may not be empty in URI: \"%s\"\n" -msgstr "IPv6 호스트 주소가 없습니다, 해당 URI: \"%s\"\n" +msgid "IPv6 host address may not be empty in URI: \"%s\"" +msgstr "IPv6 호스트 주소가 없습니다, 해당 URI: \"%s\"" -#: fe-connect.c:6024 +#: fe-connect.c:6511 #, c-format msgid "" "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): " -"\"%s\"\n" +"\"%s\"" msgstr "" "ìž˜ëª»ëœ \"%c\" 문ìžê°€ URI 문ìžì—´ ê°€ìš´ë° %d 번째 있습니다(\":\" ë˜ëŠ” \"/\" 문ìž" -"ê°€ 있어야 함): \"%s\"\n" +"ê°€ 있어야 함): \"%s\"" -#: fe-connect.c:6153 +#: fe-connect.c:6640 #, c-format -msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "키/밸류 êµ¬ë¶„ìž \"=\" 문ìžê°€ 필요함, 해당 URI 쿼리 매개변수: \"%s\"\n" +msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "" +"키/밸류 êµ¬ë¶„ìž \"=\" 문ìžê°€ í•„ìš” ì´ìƒ ë” ìžˆìŒ, 해당 URI 쿼리 매개변수: \"%s\"" -#: fe-connect.c:6173 +#: fe-connect.c:6660 #, c-format -msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "키/밸류 êµ¬ë¶„ìž \"=\" 문ìžê°€ 필요함, 해당 URI 쿼리 매개변수: \"%s\"\n" +msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "키/밸류 êµ¬ë¶„ìž \"=\" 문ìžê°€ 필요함, 해당 URI 쿼리 매개변수: \"%s\"" -#: fe-connect.c:6224 +#: fe-connect.c:6712 #, c-format -msgid "invalid URI query parameter: \"%s\"\n" -msgstr "ìž˜ëª»ëœ URL 쿼리 매개변수값: \"%s\"\n" +msgid "invalid URI query parameter: \"%s\"" +msgstr "ìž˜ëª»ëœ URL 쿼리 매개변수값: \"%s\"" -#: fe-connect.c:6298 +#: fe-connect.c:6786 #, c-format -msgid "invalid percent-encoded token: \"%s\"\n" -msgstr "ìž˜ëª»ëœ í¼ì„¼íЏ ì¸ì½”드 토í°: \"%s\"\n" +msgid "invalid percent-encoded token: \"%s\"" +msgstr "ìž˜ëª»ëœ í¼ì„¼íЏ ì¸ì½”드 토í°: \"%s\"" -#: fe-connect.c:6308 +#: fe-connect.c:6796 #, c-format -msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" -msgstr "í¼ì„¼íЏ ì¸ì½”드 ê°’ì— %%00 숨김 ê°’ì´ ìžˆìŒ: \"%s\"\n" +msgid "forbidden value %%00 in percent-encoded value: \"%s\"" +msgstr "í¼ì„¼íЏ ì¸ì½”드 ê°’ì— %%00 숨김 ê°’ì´ ìžˆìŒ: \"%s\"" -#: fe-connect.c:6671 +#: fe-connect.c:7160 msgid "connection pointer is NULL\n" msgstr "ì—°ê²° í¬ì¸í„°ê°€ NULL\n" -#: fe-connect.c:6967 +#: fe-connect.c:7168 fe-exec.c:713 fe-exec.c:975 fe-exec.c:3459 +#: fe-protocol3.c:991 fe-protocol3.c:1024 +msgid "out of memory\n" +msgstr "메모리 부족\n" + +#: fe-connect.c:7459 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "경고: \"%s\" 패스워드 파ì¼ì´ plain 파ì¼ì´ 아님\n" -#: fe-connect.c:6976 +#: fe-connect.c:7468 #, c-format msgid "" "WARNING: password file \"%s\" has group or world access; permissions should " @@ -663,279 +851,269 @@ msgstr "" "경고: 패스워드 íŒŒì¼ \"%s\"ì— ê·¸ë£¹ ë˜ëŠ” 범용 액세스 ê¶Œí•œì´ ìžˆìŠµë‹ˆë‹¤. ê¶Œí•œì€ " "u=rw(0600) ì´í•˜ì—¬ì•¼ 합니다.\n" -#: fe-connect.c:7084 +#: fe-connect.c:7575 +#, c-format +msgid "password retrieved from file \"%s\"" +msgstr "\"%s\" 파ì¼ì—서 암호를 ì°¾ì„ ìˆ˜ ì—†ìŒ" + +#: fe-connect.c:7727 #, c-format -msgid "password retrieved from file \"%s\"\n" -msgstr "\"%s\" 파ì¼ì—서 암호를 ì°¾ì„ ìˆ˜ ì—†ìŒ\n" +msgid "invalid integer value \"%s\" for connection option \"%s\"" +msgstr "ìž˜ëª»ëœ ì •ìˆ˜ê°’: \"%s\", 해당 ì—°ê²° 옵션: \"%s\"" -#: fe-exec.c:444 fe-exec.c:2821 +#: fe-exec.c:469 fe-exec.c:3533 #, c-format msgid "row number %d is out of range 0..%d" msgstr "%d 번째 í–‰(row)ì€ 0..%d 범위를 벗어났ìŒ" -#: fe-exec.c:505 fe-protocol2.c:497 fe-protocol2.c:532 fe-protocol2.c:1050 -#: fe-protocol3.c:206 fe-protocol3.c:233 fe-protocol3.c:250 fe-protocol3.c:330 -#: fe-protocol3.c:723 fe-protocol3.c:954 -msgid "out of memory" -msgstr "메모리 부족" - -#: fe-exec.c:506 fe-protocol2.c:1396 fe-protocol3.c:1907 +#: fe-exec.c:531 fe-protocol3.c:1993 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:815 -msgid "write to server failed\n" -msgstr "ì„œë²„ì— ì“°ê¸° 실패\n" +#: fe-exec.c:834 +#, c-format +msgid "write to server failed" +msgstr "ì„œë²„ì— ì“°ê¸° 실패" + +#: fe-exec.c:874 +#, c-format +msgid "no error text available" +msgstr "보여줄 오류 메시지가 ì—†ìŒ" -#: fe-exec.c:896 +#: fe-exec.c:963 msgid "NOTICE" msgstr "알림" -#: fe-exec.c:954 +#: fe-exec.c:1021 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult 함수는 INT_MAX 튜플보다 ë§Žì€ ê²½ìš°ë¥¼ ì§€ì›í•˜ì§€ 않ìŒ" -#: fe-exec.c:966 +#: fe-exec.c:1033 msgid "size_t overflow" msgstr "size_t 초과" -#: fe-exec.c:1243 fe-exec.c:1301 fe-exec.c:1347 -msgid "command string is a null pointer\n" -msgstr "명령 문ìžì—´ì´ null í¬ì¸í„°\n" +#: fe-exec.c:1438 fe-exec.c:1507 fe-exec.c:1553 +#, c-format +msgid "command string is a null pointer" +msgstr "명령 문ìžì—´ì´ null í¬ì¸í„°" + +#: fe-exec.c:1444 fe-exec.c:3003 +#, c-format +msgid "%s not allowed in pipeline mode" +msgstr "파ì´í”„ë¼ì¸ 모드ì—서는 %s 사용할 수 ì—†ìŒ" -#: fe-exec.c:1307 fe-exec.c:1353 fe-exec.c:1448 -msgid "number of parameters must be between 0 and 65535\n" -msgstr "매개변수값으로 숫ìžëŠ” 0ì—서 65535까지만 쓸 수 있ìŒ\n" +#: fe-exec.c:1512 fe-exec.c:1558 fe-exec.c:1652 +#, c-format +msgid "number of parameters must be between 0 and %d" +msgstr "매개변수값으로 숫ìžëŠ” 0ì—서 %d까지만 쓸 수 있ìŒ" -#: fe-exec.c:1341 fe-exec.c:1442 -msgid "statement name is a null pointer\n" -msgstr "실행 구문 ì´ë¦„ì´ null í¬ì¸íЏ(ê°’ì´ ì—†ìŒ)입니다\n" +#: fe-exec.c:1548 fe-exec.c:1647 +#, c-format +msgid "statement name is a null pointer" +msgstr "실행 구문 ì´ë¦„ì´ null í¬ì¸íЏ(ê°’ì´ ì—†ìŒ)입니다" -#: fe-exec.c:1361 fe-exec.c:1524 fe-exec.c:2233 fe-exec.c:2435 -msgid "function requires at least protocol version 3.0\n" -msgstr "함수는 ì ì–´ë„ 버전 3ì˜ í”„ë¡œí† ì½œì„ ìš”êµ¬í•˜ê³  있습니다\n" +#: fe-exec.c:1689 fe-exec.c:3379 +#, c-format +msgid "no connection to the server" +msgstr "ì„œë²„ì— ëŒ€í•œ ì—°ê²°ì´ ì—†ìŒ" -#: fe-exec.c:1479 -msgid "no connection to the server\n" -msgstr "ì„œë²„ì— ëŒ€í•œ ì—°ê²°ì´ ì—†ìŒ\n" +#: fe-exec.c:1697 fe-exec.c:3387 +#, c-format +msgid "another command is already in progress" +msgstr "처리 ì¤‘ì— ì´ë¯¸ 다른 ëª…ë ¹ì´ ì¡´ìž¬í•¨" -#: fe-exec.c:1486 -msgid "another command is already in progress\n" -msgstr "처리 ì¤‘ì— ì´ë¯¸ 다른 ëª…ë ¹ì´ ì¡´ìž¬í•¨\n" +#: fe-exec.c:1727 +#, c-format +msgid "cannot queue commands during COPY" +msgstr "COPY 작업 중 ëª…ë ¹ë“¤ì„ íì— ë‹´ì„ ìˆ˜ ì—†ìŒ" -#: fe-exec.c:1600 -msgid "length must be given for binary parameter\n" -msgstr "ë°”ì´ë„ˆë¦¬ ìžë£Œ 매개 변수를 사용할 때는 ê·¸ 길ì´ë¥¼ 지정해야 함\n" +#: fe-exec.c:1846 +#, c-format +msgid "length must be given for binary parameter" +msgstr "ë°”ì´ë„ˆë¦¬ ìžë£Œ 매개 변수를 사용할 때는 ê·¸ 길ì´ë¥¼ 지정해야 함" -#: fe-exec.c:1863 +#: fe-exec.c:2205 #, c-format -msgid "unexpected asyncStatus: %d\n" -msgstr "기대ë˜ì§€ ì•Šì€ ë™ê¸°í™”ìƒíƒœ: %d\n" +msgid "unexpected asyncStatus: %d" +msgstr "기대ë˜ì§€ ì•Šì€ asyncStatus: %d" -#: fe-exec.c:1883 +#: fe-exec.c:2361 #, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "PGEVT_RESULTCREATE ì´ë²¤íЏ ë™ì•ˆ PGEventProc \"%s\" 실패함\n" +msgid "" +"synchronous command execution functions are not allowed in pipeline mode" +msgstr "파ì´í”„ë¼ì¸ 모드ì—서는 ë™ê¸°ì‹ 명령 실행 함수는 사용할 수 ì—†ìŒ" -#: fe-exec.c:2043 +#: fe-exec.c:2378 msgid "COPY terminated by new PQexec" msgstr "새 PQexec 호출로 COPY ìž‘ì—…ì´ ì¤‘ì§€ ë˜ì—ˆìŠµë‹ˆë‹¤" -#: fe-exec.c:2051 -msgid "COPY IN state must be terminated first\n" -msgstr "COPY IN ìƒíƒœê°€ 먼저 ë나야함\n" +#: fe-exec.c:2394 +#, c-format +msgid "PQexec not allowed during COPY BOTH" +msgstr "COPY BOTH 작업 중ì—는 PQexec 사용할 수 ì—†ìŒ" + +#: fe-exec.c:2630 +#, c-format +msgid "unrecognized message type \"%c\"" +msgstr "알 수 없는 메시지 형 \"%c\"" + +#: fe-exec.c:2702 fe-exec.c:2756 fe-exec.c:2824 fe-protocol3.c:1924 +#, c-format +msgid "no COPY in progress" +msgstr "처리 ê°€ìš´ë° COPYê°€ ì—†ìŒ" + +#: fe-exec.c:3010 +#, c-format +msgid "connection in wrong state" +msgstr "ìž˜ëª»ëœ ìƒíƒœì˜ ì—°ê²°" + +#: fe-exec.c:3053 +#, c-format +msgid "cannot enter pipeline mode, connection not idle" +msgstr "파ì´í”„ë¼ì¸ 모드로 바꿀 수 ì—†ìŒ, ì—°ê²°ì´ idle ìƒíƒœê°€ 아님" -#: fe-exec.c:2071 -msgid "COPY OUT state must be terminated first\n" -msgstr "COPY OUT ìƒíƒœê°€ 먼저 ë나야함\n" +#: fe-exec.c:3089 fe-exec.c:3110 +#, c-format +msgid "cannot exit pipeline mode with uncollected results" +msgstr "수집할 수 없는 결과로 파ì´í”„ë¼ì¸ 모드를 종료할 수 ì—†ìŒ" -#: fe-exec.c:2079 -msgid "PQexec not allowed during COPY BOTH\n" -msgstr "COPY BOTH 작업 중ì—는 PQexec 사용할 수 ì—†ìŒ\n" +#: fe-exec.c:3093 +#, c-format +msgid "cannot exit pipeline mode while busy" +msgstr "바빠서 파ì´í”„ë¼ì¸ 모드를 종료할 수 ì—†ìŒ" -#: fe-exec.c:2325 fe-exec.c:2392 fe-exec.c:2482 fe-protocol2.c:1353 -#: fe-protocol3.c:1838 -msgid "no COPY in progress\n" -msgstr "처리 ê°€ìš´ë° COPYê°€ ì—†ìŒ\n" +#: fe-exec.c:3104 +#, c-format +msgid "cannot exit pipeline mode while in COPY" +msgstr "COPY 하고 있어 파ì´í”„ë¼ì¸ 모드를 종료할 수 ì—†ìŒ" -#: fe-exec.c:2672 -msgid "connection in wrong state\n" -msgstr "ìž˜ëª»ëœ ìƒíƒœì˜ ì—°ê²°\n" +#: fe-exec.c:3303 +#, c-format +msgid "cannot send pipeline when not in pipeline mode" +msgstr "파ì´í”„ë¼ì¸ 모드 ìƒíƒœê°€ ì•„ë‹ ë•ŒëŠ” 파ì´í”„ë¼ì¸ì„ 보낼 수 ì—†ìŒ" -#: fe-exec.c:2703 +#: fe-exec.c:3422 msgid "invalid ExecStatusType code" msgstr "ìž˜ëª»ëœ ExecStatusType 코드" -#: fe-exec.c:2730 +#: fe-exec.c:3449 msgid "PGresult is not an error result\n" msgstr "PGresultê°€ 오류 결과가 아님\n" -#: fe-exec.c:2805 fe-exec.c:2828 +#: fe-exec.c:3517 fe-exec.c:3540 #, c-format msgid "column number %d is out of range 0..%d" msgstr "%d 번째 ì—´ì€ 0..%d 범위를 벗어났ìŒ" -#: fe-exec.c:2843 +#: fe-exec.c:3555 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "%dê°œì˜ ë§¤ê°œ 변수는 0..%d 범위를 벗어났ìŒ" -#: fe-exec.c:3153 +#: fe-exec.c:3866 #, c-format msgid "could not interpret result from server: %s" msgstr "서버로부터 결과처리를 중지 시킬 수 ì—†ìŒ: %s" -#: fe-exec.c:3392 fe-exec.c:3476 -msgid "incomplete multibyte character\n" -msgstr "완성ë˜ì§€ ì•Šì€ ë©€í‹°ë°”ì´íЏ 문ìž\n" +#: fe-exec.c:4127 fe-exec.c:4217 +#, c-format +msgid "incomplete multibyte character" +msgstr "완성ë˜ì§€ ì•Šì€ ë©€í‹°ë°”ì´íЏ 문ìž" -#: fe-gssapi-common.c:124 +#: fe-gssapi-common.c:122 msgid "GSSAPI name import error" msgstr "GSSAPI ì´ë¦„ 가져오기 오류" -#: fe-lobj.c:154 -msgid "cannot determine OID of function lo_truncate\n" -msgstr "lo_truncate í•¨ìˆ˜ì˜ OID를 ê²°ì •í•  수 ì—†ìŒ\n" - -#: fe-lobj.c:170 -msgid "argument of lo_truncate exceeds integer range\n" -msgstr "lo_truncate í•¨ìˆ˜ì˜ ì¸ìžê°’ì´ ì •ìˆ˜ 범위가 아님\n" - -#: fe-lobj.c:221 -msgid "cannot determine OID of function lo_truncate64\n" -msgstr "lo_truncate64 í•¨ìˆ˜ì˜ OID를 알 수 ì—†ìŒ\n" - -#: fe-lobj.c:279 -msgid "argument of lo_read exceeds integer range\n" -msgstr "lo_read í•¨ìˆ˜ì˜ ì¸ìžê°’ì´ ì •ìˆ˜ 범위가 아님\n" - -#: fe-lobj.c:334 -msgid "argument of lo_write exceeds integer range\n" -msgstr "lo_write í•¨ìˆ˜ì˜ ì¸ìžê°’ì´ ì •ìˆ˜ 범위가 아님\n" - -#: fe-lobj.c:425 -msgid "cannot determine OID of function lo_lseek64\n" -msgstr "lo_lseek64 í•¨ìˆ˜ì˜ OID를 알 수 ì—†ìŒ\n" - -#: fe-lobj.c:521 -msgid "cannot determine OID of function lo_create\n" -msgstr "lo_create í•¨ìˆ˜ì˜ OID 조사를 í•  수 ì—†ìŒ\n" - -#: fe-lobj.c:600 -msgid "cannot determine OID of function lo_tell64\n" -msgstr "lo_tell64 í•¨ìˆ˜ì˜ OID를 알 수 ì—†ìŒ\n" - -#: fe-lobj.c:706 fe-lobj.c:815 +#: fe-lobj.c:144 fe-lobj.c:207 fe-lobj.c:397 fe-lobj.c:487 fe-lobj.c:560 +#: fe-lobj.c:956 fe-lobj.c:963 fe-lobj.c:970 fe-lobj.c:977 fe-lobj.c:984 +#: fe-lobj.c:991 fe-lobj.c:998 fe-lobj.c:1005 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s\n" +msgid "cannot determine OID of function %s" +msgstr "%s í•¨ìˆ˜ì˜ OID 조사를 í•  수 ì—†ìŒ" -#: fe-lobj.c:761 +#: fe-lobj.c:160 #, c-format -msgid "could not read from file \"%s\": %s\n" -msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s\n" +msgid "argument of lo_truncate exceeds integer range" +msgstr "lo_truncate í•¨ìˆ˜ì˜ ì¸ìžê°’ì´ ì •ìˆ˜ 범위가 아님" -#: fe-lobj.c:835 fe-lobj.c:859 +#: fe-lobj.c:262 #, c-format -msgid "could not write to file \"%s\": %s\n" -msgstr "\"%s\" 파ì¼ì„ 쓸 수 ì—†ìŒ: %s\n" - -#: fe-lobj.c:946 -msgid "query to initialize large object functions did not return data\n" -msgstr "large object functionì„ ì´ˆê¸°í™” 하는 쿼리가 ë°ì´í„°ë¥¼ 리턴하지 않았ìŒ\n" - -#: fe-lobj.c:995 -msgid "cannot determine OID of function lo_open\n" -msgstr "lo_open í•¨ìˆ˜ì˜ OID 조사를 í•  수 ì—†ìŒ\n" +msgid "argument of lo_read exceeds integer range" +msgstr "lo_read í•¨ìˆ˜ì˜ ì¸ìžê°’ì´ ì •ìˆ˜ 범위가 아님" -#: fe-lobj.c:1002 -msgid "cannot determine OID of function lo_close\n" -msgstr "lo_close í•¨ìˆ˜ì˜ OID 조사를 í•  수 ì—†ìŒ\n" - -#: fe-lobj.c:1009 -msgid "cannot determine OID of function lo_creat\n" -msgstr "lo_create í•¨ìˆ˜ì˜ OID 조사를 í•  수 ì—†ìŒ\n" - -#: fe-lobj.c:1016 -msgid "cannot determine OID of function lo_unlink\n" -msgstr "lo_unlink í•¨ìˆ˜ì˜ OID 조사를 í•  수 ì—†ìŒ\n" +#: fe-lobj.c:313 +#, c-format +msgid "argument of lo_write exceeds integer range" +msgstr "lo_write í•¨ìˆ˜ì˜ ì¸ìžê°’ì´ ì •ìˆ˜ 범위가 아님" -#: fe-lobj.c:1023 -msgid "cannot determine OID of function lo_lseek\n" -msgstr "lo_lseek í•¨ìˆ˜ì˜ OID 조사를 í•  수 ì—†ìŒ\n" +#: fe-lobj.c:669 fe-lobj.c:780 +#, c-format +msgid "could not open file \"%s\": %s" +msgstr "\"%s\" 파ì¼ì„ ì—´ 수 ì—†ìŒ: %s" -#: fe-lobj.c:1030 -msgid "cannot determine OID of function lo_tell\n" -msgstr "lo_tell í•¨ìˆ˜ì˜ OID 조사를 í•  수 ì—†ìŒ\n" +#: fe-lobj.c:725 +#, c-format +msgid "could not read from file \"%s\": %s" +msgstr "\"%s\" 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s" -#: fe-lobj.c:1037 -msgid "cannot determine OID of function loread\n" -msgstr "loread í•¨ìˆ˜ì˜ OID 조사를 í•  수 ì—†ìŒ\n" +#: fe-lobj.c:801 fe-lobj.c:824 +#, c-format +msgid "could not write to file \"%s\": %s" +msgstr "\"%s\" 파ì¼ì„ 쓸 수 ì—†ìŒ: %s" -#: fe-lobj.c:1044 -msgid "cannot determine OID of function lowrite\n" -msgstr "lowrite í•¨ìˆ˜ì˜ OID 조사를 í•  수 ì—†ìŒ\n" +#: fe-lobj.c:908 +#, c-format +msgid "query to initialize large object functions did not return data" +msgstr "large object functionì„ ì´ˆê¸°í™” 하는 쿼리가 ë°ì´í„°ë¥¼ 리턴하지 않았ìŒ" -#: fe-misc.c:289 +#: fe-misc.c:239 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "%lu 정수형 í¬ê¸°ëŠ” pqGetInt 함수ì—서 ì§€ì›í•˜ì§€ 않ìŒ" -#: fe-misc.c:325 +#: fe-misc.c:272 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "%lu 정수형 í¬ê¸°ëŠ” pqPutInt 함수ì—서 ì§€ì›í•˜ì§€ 않ìŒ" -#: fe-misc.c:636 fe-misc.c:869 -msgid "connection not open\n" -msgstr "ì—°ê²° 열기 실패\n" - -#: fe-misc.c:805 fe-secure-openssl.c:209 fe-secure-openssl.c:316 -#: fe-secure.c:267 fe-secure.c:383 +#: fe-misc.c:750 fe-secure-openssl.c:203 fe-secure-openssl.c:309 +#: fe-secure.c:237 fe-secure.c:404 +#, c-format msgid "" "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" -"\tbefore or while processing the request.\n" +"\tbefore or while processing the request." msgstr "" -"서버가 ê°‘ìžê¸° ì—°ê²°ì„ ë‹«ì•˜ìŒ\n" +"서버가 ê°‘ìžê¸° ì—°ê²°ì„ ë‹«ì•˜ìŒ.\n" "\tì´ëŸ° 처리는 í´ë¼ì´ì–¸íŠ¸ì˜ ìš”êµ¬ë¥¼ 처리하는 ë™ì•ˆì´ë‚˜\n" -"\t처리하기 ì „ì— ì„œë²„ê°€ ê°‘ìžê¸° 종료ë˜ì—ˆìŒì„ ì˜ë¯¸í•¨\n" - -#: fe-misc.c:1063 -msgid "timeout expired\n" -msgstr "시간 초과\n" +"\t처리하기 ì „ì— ì„œë²„ê°€ ê°‘ìžê¸° 종료ë˜ì—ˆìŒì„ ì˜ë¯¸í•¨." -#: fe-misc.c:1108 -msgid "invalid socket\n" -msgstr "ìž˜ëª»ëœ ì†Œì¼“\n" +#: fe-misc.c:817 +msgid "connection not open\n" +msgstr "ì—°ê²° 열기 실패\n" -#: fe-misc.c:1131 +#: fe-misc.c:1005 #, c-format -msgid "select() failed: %s\n" -msgstr "select() 실패: %s\n" +msgid "timeout expired" +msgstr "시간 초과" -#: fe-protocol2.c:87 +#: fe-misc.c:1049 #, c-format -msgid "invalid setenv state %c, probably indicative of memory corruption\n" -msgstr "ìž˜ëª»ëœ í™˜ê²½ë³€ìˆ˜ ìƒíƒœ %c, 메모리 ì†ìƒì¼ ê°€ëŠ¥ì„±ì´ í¼\n" +msgid "invalid socket" +msgstr "ìž˜ëª»ëœ ì†Œì¼“" -#: fe-protocol2.c:384 +#: fe-misc.c:1071 #, c-format -msgid "invalid state %c, probably indicative of memory corruption\n" -msgstr "ìž˜ëª»ëœ ìƒíƒœ %c, 메모리 ì†ìƒì¼ ê°€ëŠ¥ì„±ì´ í¼\n" +msgid "%s() failed: %s" +msgstr "%s() 실패: %s" -#: fe-protocol2.c:473 fe-protocol3.c:183 +#: fe-protocol3.c:187 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "휴지(idle)ë™ì•ˆ 서버로 부터 0x%02x 형태 메시지를 받았ìŒ" -#: fe-protocol2.c:523 -#, c-format -msgid "unexpected character %c following empty query response (\"I\" message)" -msgstr "비어있는 쿼리 ì‘답(\"I\" 메시지)ì— ë’¤ì´ì–´ %cì˜ ìž˜ëª»ëœ ë¬¸ìžê°€ 있ìŒ" - -#: fe-protocol2.c:589 +#: fe-protocol3.c:402 #, c-format msgid "" "server sent data (\"D\" message) without prior row description (\"T\" " @@ -943,398 +1121,481 @@ msgid "" msgstr "" "서버ì—서 먼저 í–‰(row) 설명(\"T\" 메시지) ì—†ì´ ìžë£Œ(\"D\" 메시지)를 보냈ìŒ" -#: fe-protocol2.c:607 -#, c-format -msgid "" -"server sent binary data (\"B\" message) without prior row description (\"T\" " -"message)" -msgstr "" -"서버ì—서 먼저 í–‰(row) 설명(\"T\" 메시지) ì—†ì´ ë°”ì´ë„ˆë¦¬ ìžë£Œ(\"B\" 메시지)를 " -"보냈ìŒ" - -#: fe-protocol2.c:626 fe-protocol3.c:408 -#, c-format -msgid "unexpected response from server; first received character was \"%c\"\n" -msgstr "서버로부터 예ìƒì¹˜ 못한 ì‘ë‹µì„ ë°›ì•˜ìŒ; \"%c\" 문ìžë¥¼ 첫문ìžë¡œ 받았ìŒ\n" - -#: fe-protocol2.c:755 fe-protocol2.c:930 fe-protocol3.c:622 fe-protocol3.c:849 -msgid "out of memory for query result" -msgstr "쿼리 ê²°ê³¼ 처리를 위한 메모리 부족" - -#: fe-protocol2.c:1408 -#, c-format -msgid "lost synchronization with server, resetting connection" -msgstr "ì„œë²„ì™€ì˜ ë™ê¸°í™”ê°€ ëŠê¹€, ì—°ê²°ì„ ìž¬ 시ë„함" - -#: fe-protocol2.c:1530 fe-protocol2.c:1562 fe-protocol3.c:2095 +#: fe-protocol3.c:444 #, c-format -msgid "protocol error: id=0x%x\n" -msgstr "프로토콜 오류: id=0x%x\n" +msgid "unexpected response from server; first received character was \"%c\"" +msgstr "서버로부터 예ìƒì¹˜ 못한 ì‘ë‹µì„ ë°›ì•˜ìŒ; \"%c\" 문ìžë¥¼ 첫문ìžë¡œ 받았ìŒ" -#: fe-protocol3.c:365 -msgid "" -"server sent data (\"D\" message) without prior row description (\"T\" " -"message)\n" -msgstr "" -"서버ì—서 먼저 í–‰(row) 설명(\"T\" 메시지) ì—†ì´ ìžë£Œ(\"D\" 메시지)를 보냈ìŒ\n" - -#: fe-protocol3.c:429 +#: fe-protocol3.c:467 #, c-format -msgid "message contents do not agree with length in message type \"%c\"\n" -msgstr "메시지 ë‚´ìš©ì´ \"%c\" 메시지 í˜•íƒœì˜ ê¸¸ì´ë¥¼ í—ˆë½í•˜ì§€ 않ìŒ\n" +msgid "message contents do not agree with length in message type \"%c\"" +msgstr "메시지 ë‚´ìš©ì´ \"%c\" 메시지 í˜•íƒœì˜ ê¸¸ì´ë¥¼ í—ˆë½í•˜ì§€ 않ìŒ" -#: fe-protocol3.c:449 +#: fe-protocol3.c:485 #, c-format -msgid "lost synchronization with server: got message type \"%c\", length %d\n" -msgstr "ì„œë²„ì™€ì˜ ë™ê¸°í™”ê°€ ëŠê¹€: \"%c\" 형태 ê¸¸ì´ %d 메시지 ë°›ìŒ\n" +msgid "lost synchronization with server: got message type \"%c\", length %d" +msgstr "ì„œë²„ì™€ì˜ ë™ê¸°í™”ê°€ ëŠê¹€: \"%c\" 형태 ê¸¸ì´ %d 메시지 ë°›ìŒ" -#: fe-protocol3.c:500 fe-protocol3.c:540 +#: fe-protocol3.c:537 fe-protocol3.c:577 msgid "insufficient data in \"T\" message" msgstr "\"T\" 메시지 ì•ˆì— ë¶€ì¡±ìž ë°ì´í„°" -#: fe-protocol3.c:573 -msgid "extraneous data in \"T\" message" -msgstr "\"T\" 메시지 ì•ˆì— ìž˜ëª»ëœ ë°ì´í„°" +#: fe-protocol3.c:648 fe-protocol3.c:854 +msgid "out of memory for query result" +msgstr "쿼리 ê²°ê³¼ 처리를 위한 메모리 부족" -#: fe-protocol3.c:686 -msgid "extraneous data in \"t\" message" -msgstr "\"t\" 메시지 ì•ˆì— ìž˜ëª»ëœ ë°ì´í„°" +#: fe-protocol3.c:717 +msgid "insufficient data in \"t\" message" +msgstr "\"t\" 메시지 ì•ˆì— ë°ì´í„°ê°€ 충분하지 않ìŒ" -#: fe-protocol3.c:757 fe-protocol3.c:789 fe-protocol3.c:807 +#: fe-protocol3.c:776 fe-protocol3.c:808 fe-protocol3.c:826 msgid "insufficient data in \"D\" message" msgstr "\"D\" 메시지 ì•ˆì— ë¶ˆì¶©ë¶„í•œ ë°ì´í„°" -#: fe-protocol3.c:763 +#: fe-protocol3.c:782 msgid "unexpected field count in \"D\" message" msgstr "\"D\" 메시지 ì•ˆì— ì˜ˆìƒì¹˜ 못한 필드 수" -#: fe-protocol3.c:816 -msgid "extraneous data in \"D\" message" -msgstr "\"D\" 메시지 ì•ˆì— ìž˜ëª»ëœ ë°ì´í„°" - -#: fe-protocol3.c:1008 +#: fe-protocol3.c:1037 msgid "no error message available\n" msgstr "보여줄 오류 메시지가 ì—†ìŒ\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1056 fe-protocol3.c:1075 +#: fe-protocol3.c:1085 fe-protocol3.c:1104 #, c-format msgid " at character %s" msgstr " 위치: %s" -#: fe-protocol3.c:1088 +#: fe-protocol3.c:1117 #, c-format msgid "DETAIL: %s\n" msgstr "ìƒì„¸ì •ë³´: %s\n" -#: fe-protocol3.c:1091 +#: fe-protocol3.c:1120 #, c-format msgid "HINT: %s\n" msgstr "힌트: %s\n" -#: fe-protocol3.c:1094 +#: fe-protocol3.c:1123 #, c-format msgid "QUERY: %s\n" msgstr "쿼리: %s\n" -#: fe-protocol3.c:1101 +#: fe-protocol3.c:1130 #, c-format msgid "CONTEXT: %s\n" msgstr "구문: %s\n" -#: fe-protocol3.c:1110 +#: fe-protocol3.c:1139 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "스키마 ì´ë¦„: %s\n" -#: fe-protocol3.c:1114 +#: fe-protocol3.c:1143 #, c-format msgid "TABLE NAME: %s\n" msgstr "í…Œì´ë¸” ì´ë¦„: %s\n" -#: fe-protocol3.c:1118 +#: fe-protocol3.c:1147 #, c-format msgid "COLUMN NAME: %s\n" msgstr "칼럼 ì´ë¦„: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1151 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "ìžë£Œí˜• ì´ë¦„: %s\n" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1155 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "제약조건 ì´ë¦„: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1167 msgid "LOCATION: " msgstr "위치: " -#: fe-protocol3.c:1140 +#: fe-protocol3.c:1169 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1171 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1337 +#: fe-protocol3.c:1366 #, c-format msgid "LINE %d: " msgstr "줄 %d: " -#: fe-protocol3.c:1732 -msgid "PQgetline: not doing text COPY OUT\n" -msgstr "PQgetline: text COPY OUT ìž‘ì—…ì„ í•  수 ì—†ìŒ\n" +#: fe-protocol3.c:1440 +#, c-format +msgid "" +"protocol version not supported by server: client uses %u.%u, server supports " +"up to %u.%u" +msgstr "" +"서버가 해당 프로토콜 ë²„ì „ì„ ì§€ì›í•˜ì§€ 않ìŒ: í´ë¼ì´ì–¸íЏ=%u.%u, 서버=%u.%u" -#: fe-secure-common.c:124 -msgid "SSL certificate's name contains embedded null\n" -msgstr "SSL ì¸ì¦ì„œì˜ ì´ë¦„ì— null 문ìžê°€ 있ìŒ\n" +#: fe-protocol3.c:1446 +#, c-format +msgid "protocol extension not supported by server: %s" +msgid_plural "protocol extensions not supported by server: %s" +msgstr[0] "서버가 해당 프로토콜 í™•ìž¥ì„ ì§€ì›í•˜ì§€ 않ìŒ: %s" -#: fe-secure-common.c:171 -msgid "host name must be specified for a verified SSL connection\n" -msgstr "ì¸ì¦ëœ SSL ì ‘ì†ì„ 위해서는 호스트 ì´ë¦„ì„ ì§€ì •í•´ì•¼ 함\n" +#: fe-protocol3.c:1454 +#, c-format +msgid "invalid %s message" +msgstr "ìž˜ëª»ëœ %s 메시지" -#: fe-secure-common.c:196 +#: fe-protocol3.c:1819 #, c-format -msgid "server certificate for \"%s\" does not match host name \"%s\"\n" -msgstr "" -"서버 ì¸ì¦ì„œì˜ ì´ë¦„ \"%s\"ì´(ê°€) 호스트 ì´ë¦„ \"%s\"ê³¼(와) ì¼ì¹˜í•˜ì§€ 않ìŒ\n" +msgid "PQgetline: not doing text COPY OUT" +msgstr "PQgetline: text COPY OUT ìž‘ì—…ì„ í•  수 ì—†ìŒ" -#: fe-secure-common.c:202 -msgid "could not get server's host name from server certificate\n" -msgstr "서버 ì¸ì¦ì„œì—서 서버 호스트 ì´ë¦„ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ\n" +#: fe-protocol3.c:2193 +#, c-format +msgid "protocol error: no function result" +msgstr "프로토콜 오류: 함수 ê²°ê³¼ ì—†ìŒ" -#: fe-secure-gssapi.c:201 +#: fe-protocol3.c:2204 +#, c-format +msgid "protocol error: id=0x%x" +msgstr "프로토콜 오류: id=0x%x" + +#: fe-secure-common.c:123 +#, c-format +msgid "SSL certificate's name contains embedded null" +msgstr "SSL ì¸ì¦ì„œì˜ ì´ë¦„ì— null 문ìžê°€ 있ìŒ" + +#: fe-secure-common.c:228 +#, c-format +msgid "certificate contains IP address with invalid length %zu" +msgstr "ì¸ì¦ì„œì— IP 주소용 %zu 길ì´ê°€ 잘못ë¨" + +#: fe-secure-common.c:237 +#, c-format +msgid "could not convert certificate's IP address to string: %s" +msgstr "ì¸ì¦ì„œì˜ IP 주소를 문ìžì—´ë¡œ 바꿀 수 ì—†ìŒ: %s" + +#: fe-secure-common.c:269 +#, c-format +msgid "host name must be specified for a verified SSL connection" +msgstr "ì¸ì¦ëœ SSL ì ‘ì†ì„ 위해서는 호스트 ì´ë¦„ì„ ì§€ì •í•´ì•¼ 함" + +#: fe-secure-common.c:286 +#, c-format +msgid "" +"server certificate for \"%s\" (and %d other name) does not match host name " +"\"%s\"" +msgid_plural "" +"server certificate for \"%s\" (and %d other names) does not match host name " +"\"%s\"" +msgstr[0] "" +"서버 ì¸ì¦ì„œì˜ ì´ë¦„ \"%s\" (%d 기타 ì´ë¦„)ì´ \"%s\" 호스트 ì´ë¦„ê³¼ ì¼ì¹˜í•˜ì§€ 않ìŒ" + +#: fe-secure-common.c:294 +#, c-format +msgid "server certificate for \"%s\" does not match host name \"%s\"" +msgstr "서버 ì¸ì¦ì„œì˜ ì´ë¦„ \"%s\"ì´(ê°€) \"%s\" 호스트 ì´ë¦„ê³¼ ì¼ì¹˜í•˜ì§€ 않ìŒ" + +#: fe-secure-common.c:299 +#, c-format +msgid "could not get server's host name from server certificate" +msgstr "서버 ì¸ì¦ì„œì—서 서버 호스트 ì´ë¦„ì„ ì°¾ì„ ìˆ˜ ì—†ìŒ" + +#: fe-secure-gssapi.c:194 msgid "GSSAPI wrap error" msgstr "GSSAPI ê°ì‹¸ê¸° 오류" -#: fe-secure-gssapi.c:209 -msgid "outgoing GSSAPI message would not use confidentiality\n" -msgstr "GSSAPI 송출 메시지는 ê¸°ë°€ì„±ì„ ì‚¬ìš©í•˜ì§€ ë§ì•„야함\n" +#: fe-secure-gssapi.c:201 +#, c-format +msgid "outgoing GSSAPI message would not use confidentiality" +msgstr "GSSAPI 송출 메시지는 ê¸°ë°€ì„±ì„ ì‚¬ìš©í•˜ì§€ ë§ì•„야함" -#: fe-secure-gssapi.c:217 +#: fe-secure-gssapi.c:208 #, c-format -msgid "client tried to send oversize GSSAPI packet (%zu > %zu)\n" -msgstr "í´ë¼ì´ì–¸íŠ¸ì˜ GSSAPI íŒ¨í‚·ì´ ë„ˆë¬´ í¼ (%zu > %zu)\n" +msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" +msgstr "í´ë¼ì´ì–¸íŠ¸ì˜ GSSAPI íŒ¨í‚·ì´ ë„ˆë¬´ í¼ (%zu > %zu)" -#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:596 +#: fe-secure-gssapi.c:347 fe-secure-gssapi.c:589 #, c-format -msgid "oversize GSSAPI packet sent by the server (%zu > %zu)\n" -msgstr "ì„œë²„ì˜ GSSAPI íŒ¨í‚·ì´ ë„ˆë¬´ í¼ (%zu > %zu)\n" +msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" +msgstr "ì„œë²„ì˜ GSSAPI íŒ¨í‚·ì´ ë„ˆë¬´ í¼ (%zu > %zu)" -#: fe-secure-gssapi.c:393 +#: fe-secure-gssapi.c:386 msgid "GSSAPI unwrap error" msgstr "GSSAPI 벗기기 오류" -#: fe-secure-gssapi.c:403 -msgid "incoming GSSAPI message did not use confidentiality\n" -msgstr "GSSAPI 수신 메시지는 ê¸°ë°€ì„±ì„ ì‚¬ìš©í•˜ì§€ ë§ì•„야 함\n" +#: fe-secure-gssapi.c:395 +#, c-format +msgid "incoming GSSAPI message did not use confidentiality" +msgstr "GSSAPI 수신 메시지는 ê¸°ë°€ì„±ì„ ì‚¬ìš©í•˜ì§€ ë§ì•„야 함" -#: fe-secure-gssapi.c:642 +#: fe-secure-gssapi.c:652 msgid "could not initiate GSSAPI security context" msgstr "GSSAPI 보안 context 초기화 실패" -#: fe-secure-gssapi.c:673 +#: fe-secure-gssapi.c:681 msgid "GSSAPI size check error" msgstr "GSSAPI í¬ê¸° 검사 오류" -#: fe-secure-gssapi.c:684 +#: fe-secure-gssapi.c:692 msgid "GSSAPI context establishment error" msgstr "GSSAPI context 설정 오류" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1291 +#: fe-secure-openssl.c:207 fe-secure-openssl.c:313 fe-secure-openssl.c:1524 +#, c-format +msgid "SSL SYSCALL error: %s" +msgstr "SSL SYSCALL 오류: %s" + +#: fe-secure-openssl.c:213 fe-secure-openssl.c:319 fe-secure-openssl.c:1527 +#, c-format +msgid "SSL SYSCALL error: EOF detected" +msgstr "SSL SYSCALL 오류: EOF ê°ì§€ë¨" + +#: fe-secure-openssl.c:223 fe-secure-openssl.c:329 fe-secure-openssl.c:1535 #, c-format -msgid "SSL SYSCALL error: %s\n" -msgstr "SSL SYSCALL 오류: %s\n" +msgid "SSL error: %s" +msgstr "SSL 오류: %s" -#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1295 -msgid "SSL SYSCALL error: EOF detected\n" -msgstr "SSL SYSCALL 오류: EOF ê°ì§€ë¨\n" +#: fe-secure-openssl.c:237 fe-secure-openssl.c:343 +#, c-format +msgid "SSL connection has been closed unexpectedly" +msgstr "SSL ì—°ê²°ì´ ì˜ˆìƒì¹˜ 못하게 ëŠê¹€" -#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1304 +#: fe-secure-openssl.c:242 fe-secure-openssl.c:348 fe-secure-openssl.c:1582 #, c-format -msgid "SSL error: %s\n" -msgstr "SSL 오류: %s\n" +msgid "unrecognized SSL error code: %d" +msgstr "알 수 없는 SSL 오류 코드: %d" -#: fe-secure-openssl.c:247 fe-secure-openssl.c:354 -msgid "SSL connection has been closed unexpectedly\n" -msgstr "SSL ì—°ê²°ì´ ì˜ˆìƒì¹˜ 못하게 ëŠê¹€\n" +#: fe-secure-openssl.c:390 +#, c-format +msgid "could not determine server certificate signature algorithm" +msgstr "서버 ì¸ì¦ì„œ 서명 ì•Œê³ ë¦¬ì¦˜ì„ ì•Œ 수 ì—†ìŒ" -#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1354 +#: fe-secure-openssl.c:410 #, c-format -msgid "unrecognized SSL error code: %d\n" -msgstr "알 수 없는 SSL 오류 코드: %d\n" +msgid "could not find digest for NID %s" +msgstr "%s NIDìš© 다ì´ì œìŠ¤íŠ¸ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ" -#: fe-secure-openssl.c:400 -msgid "could not determine server certificate signature algorithm\n" -msgstr "서버 ì¸ì¦ì„œ 서명 ì•Œê³ ë¦¬ì¦˜ì„ ì•Œ 수 ì—†ìŒ\n" +#: fe-secure-openssl.c:419 +#, c-format +msgid "could not generate peer certificate hash" +msgstr "피어 ì¸ì¦ 해시 ê°’ì„ ë§Œë“¤ 수 ì—†ìŒ" -#: fe-secure-openssl.c:421 +#: fe-secure-openssl.c:501 #, c-format -msgid "could not find digest for NID %s\n" -msgstr "%s NIDìš© 다ì´ì œìŠ¤íŠ¸ë¥¼ ì°¾ì„ ìˆ˜ ì—†ìŒ\n" +msgid "SSL certificate's name entry is missing" +msgstr "SSL ì¸ì¦ì„œì˜ ì´ë¦„ í•­ëª©ì´ ìž˜ëª»ë¨" -#: fe-secure-openssl.c:431 -msgid "could not generate peer certificate hash\n" -msgstr "피어 ì¸ì¦ 해시 ê°’ì„ ë§Œë“¤ 수 ì—†ìŒ\n" +#: fe-secure-openssl.c:535 +#, c-format +msgid "SSL certificate's address entry is missing" +msgstr "SSL ì¸ì¦ì„œì˜ 주소 í•­ëª©ì´ ë¹ ì¡ŒìŒ" -#: fe-secure-openssl.c:488 -msgid "SSL certificate's name entry is missing\n" -msgstr "SSL ì¸ì¦ì„œì˜ ì´ë¦„ í•­ëª©ì´ ìž˜ëª»ë¨\n" +#: fe-secure-openssl.c:935 +#, c-format +msgid "could not create SSL context: %s" +msgstr "SSL context를 만들 수 ì—†ìŒ: %s" -#: fe-secure-openssl.c:815 +#: fe-secure-openssl.c:977 #, c-format -msgid "could not create SSL context: %s\n" -msgstr "SSL context를 만들 수 ì—†ìŒ: %s\n" +msgid "invalid value \"%s\" for minimum SSL protocol version" +msgstr "ìž˜ëª»ëœ ê°’: \"%s\", 대ìƒ: 최소 SSL 프로토콜 버전" -#: fe-secure-openssl.c:854 +#: fe-secure-openssl.c:987 #, c-format -msgid "invalid value \"%s\" for minimum SSL protocol version\n" -msgstr "ìž˜ëª»ëœ ê°’: \"%s\", 대ìƒ: 최소 SSL 프로토콜 버전\n" +msgid "could not set minimum SSL protocol version: %s" +msgstr "최소 SSL 프로토콜 ë²„ì „ì„ ì§€ì •í•  수 ì—†ìŒ: %s" -#: fe-secure-openssl.c:865 +#: fe-secure-openssl.c:1003 #, c-format -msgid "could not set minimum SSL protocol version: %s\n" -msgstr "최소 SSL 프로토콜 ë²„ì „ì„ ì§€ì •í•  수 ì—†ìŒ: %s\n" +msgid "invalid value \"%s\" for maximum SSL protocol version" +msgstr "ìž˜ëª»ëœ ê°’: \"%s\", 대ìƒ: 최대 SSL 프로토콜 버전" -#: fe-secure-openssl.c:883 +#: fe-secure-openssl.c:1013 #, c-format -msgid "invalid value \"%s\" for maximum SSL protocol version\n" -msgstr "ìž˜ëª»ëœ ê°’: \"%s\", 대ìƒ: 최대 SSL 프로토콜 버전\n" +msgid "could not set maximum SSL protocol version: %s" +msgstr "최대 SSL 프로토콜 ë²„ì „ì„ ì§€ì •í•  수 ì—†ìŒ: %s" -#: fe-secure-openssl.c:894 +#: fe-secure-openssl.c:1051 #, c-format -msgid "could not set maximum SSL protocol version: %s\n" -msgstr "최대 SSL 프로토콜 ë²„ì „ì„ ì§€ì •í•  수 ì—†ìŒ: %s\n" +msgid "could not load system root certificate paths: %s" +msgstr "시스템 루트 ì¸ì¦ì„œ 경로 불러오기 실패: %s" -#: fe-secure-openssl.c:930 +#: fe-secure-openssl.c:1068 #, c-format -msgid "could not read root certificate file \"%s\": %s\n" -msgstr "\"%s\" 루트 ì¸ì¦ì„œ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s\n" +msgid "could not read root certificate file \"%s\": %s" +msgstr "\"%s\" 루트 ì¸ì¦ì„œ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s" -#: fe-secure-openssl.c:974 +#: fe-secure-openssl.c:1120 +#, c-format msgid "" "could not get home directory to locate root certificate file\n" -"Either provide the file or change sslmode to disable server certificate " -"verification.\n" +"Either provide the file, use the system's trusted roots with " +"sslrootcert=system, or change sslmode to disable server certificate " +"verification." msgstr "" "루트 ì¸ì¦ì„œ 파ì¼ì´ 있는 홈 디렉터리를 ì°¾ì„ ìˆ˜ ì—†ìŒ\n" -"해당 파ì¼ì„ 제공하거나 서버 ì¸ì¦ì„œ 확ì¸ì„ 사용하지 않ë„ë¡ sslmode를 변경하십" -"시오.\n" +"해당 파ì¼ì„ 제공하거나, sslrootcert=system 설정으로 신뢰할 수 있는 시스템 루" +"트 ì¸ì¦ì„œë¥¼ 사용하거나, 서버 ì¸ì¦ì„œ 확ì¸ì„ 사용하지 않ë„ë¡ sslmode를 변경하십" +"시오." -#: fe-secure-openssl.c:978 +#: fe-secure-openssl.c:1123 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" -"Either provide the file or change sslmode to disable server certificate " -"verification.\n" +"Either provide the file, use the system's trusted roots with " +"sslrootcert=system, or change sslmode to disable server certificate " +"verification." msgstr "" "루트 ì¸ì¦ì„œ íŒŒì¼ \"%s\"ì´(ê°€) 없습니다.\n" -"해당 파ì¼ì„ 제공하거나 서버 ì¸ì¦ì„œ 확ì¸ì„ 사용하지 않ë„ë¡ sslmode를 변경하십" -"시오.\n" +"해당 파ì¼ì„ 제공하거나, sslrootcert=system 설정으로 신뢰할 수 있는 시스템 루" +"트 ì¸ì¦ì„œë¥¼ 사용하거나, 서버 ì¸ì¦ì„œ 확ì¸ì„ 사용하지 않ë„ë¡ sslmode를 변경하십" +"시오." + +#: fe-secure-openssl.c:1158 +#, c-format +msgid "could not open certificate file \"%s\": %s" +msgstr "\"%s\" ì¸ì¦ì„œ 파ì¼ì„ 열수 ì—†ìŒ: %s" + +#: fe-secure-openssl.c:1176 +#, c-format +msgid "could not read certificate file \"%s\": %s" +msgstr "\"%s\" ì¸ì¦ì„œ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s" + +#: fe-secure-openssl.c:1200 +#, c-format +msgid "could not establish SSL connection: %s" +msgstr "SSL ì—°ê²°ì„ í™•ë¦½í•  수 ì—†ìŒ: %s" + +#: fe-secure-openssl.c:1232 +#, c-format +msgid "could not set SSL Server Name Indication (SNI): %s" +msgstr "서버 ì´ë¦„ 표시(SNI)를 설정할 수 ì—†ìŒ: %s" -#: fe-secure-openssl.c:1009 +#: fe-secure-openssl.c:1249 #, c-format -msgid "could not open certificate file \"%s\": %s\n" -msgstr "\"%s\" ì¸ì¦ì„œ 파ì¼ì„ 열수 ì—†ìŒ: %s\n" +msgid "could not set SSL ALPN extension: %s" +msgstr "SSL ALPN í™•ìž¥ì„ ì§€ì •í•  수 ì—†ìŒ: %s" -#: fe-secure-openssl.c:1028 +#: fe-secure-openssl.c:1292 #, c-format -msgid "could not read certificate file \"%s\": %s\n" -msgstr "\"%s\" ì¸ì¦ì„œ 파ì¼ì„ ì½ì„ 수 ì—†ìŒ: %s\n" +msgid "could not load SSL engine \"%s\": %s" +msgstr "SSL 엔진 \"%s\"ì„(를) 로드할 수 ì—†ìŒ: %s" -#: fe-secure-openssl.c:1053 +#: fe-secure-openssl.c:1303 #, c-format -msgid "could not establish SSL connection: %s\n" -msgstr "SSL ì—°ê²°ì„ í™•ë¦½í•  수 ì—†ìŒ: %s\n" +msgid "could not initialize SSL engine \"%s\": %s" +msgstr "SSL 엔진 \"%s\"ì„(를) 초기화할 수 ì—†ìŒ: %s" -#: fe-secure-openssl.c:1107 +#: fe-secure-openssl.c:1318 #, c-format -msgid "could not load SSL engine \"%s\": %s\n" -msgstr "SSL 엔진 \"%s\"ì„(를) 로드할 수 ì—†ìŒ: %s\n" +msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" +msgstr "ê°œì¸ SSL 키 \"%s\"ì„(를) \"%s\" 엔진ì—서 ì½ì„ 수 ì—†ìŒ: %s" -#: fe-secure-openssl.c:1119 +#: fe-secure-openssl.c:1331 #, c-format -msgid "could not initialize SSL engine \"%s\": %s\n" -msgstr "SSL 엔진 \"%s\"ì„(를) 초기화할 수 ì—†ìŒ: %s\n" +msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" +msgstr "ê°œì¸ SSL 키 \"%s\"ì„(를) \"%s\" 엔진ì—서 ì½ì„ 수 ì—†ìŒ: %s" -#: fe-secure-openssl.c:1135 +#: fe-secure-openssl.c:1368 #, c-format -msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "ê°œì¸ SSL 키 \"%s\"ì„(를) \"%s\" 엔진ì—서 ì½ì„ 수 ì—†ìŒ: %s\n" +msgid "certificate present, but not private key file \"%s\"" +msgstr "ì¸ì¦ì„œê°€ 있지만, \"%s\" ê°œì¸í‚¤ê°€ 아닙니다." -#: fe-secure-openssl.c:1149 +#: fe-secure-openssl.c:1371 #, c-format -msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "ê°œì¸ SSL 키 \"%s\"ì„(를) \"%s\" 엔진ì—서 ì½ì„ 수 ì—†ìŒ: %s\n" +msgid "could not stat private key file \"%s\": %m" +msgstr "\"%s\" ê°œì¸í‚¤ íŒŒì¼ ìƒíƒœë¥¼ 알 수 ì—†ìŒ: %m" -#: fe-secure-openssl.c:1186 +#: fe-secure-openssl.c:1379 #, c-format -msgid "certificate present, but not private key file \"%s\"\n" -msgstr "ì¸ì¦ì„œê°€ 있지만, \"%s\" ê°œì¸í‚¤ê°€ 아닙니다.\n" +msgid "private key file \"%s\" is not a regular file" +msgstr "\"%s\" ê°œì¸í‚¤ 파ì¼ì€ ì¼ë°˜ 파ì¼ì´ 아님" -#: fe-secure-openssl.c:1194 +#: fe-secure-openssl.c:1412 #, c-format msgid "" -"private key file \"%s\" has group or world access; permissions should be " -"u=rw (0600) or less\n" +"private key file \"%s\" has group or world access; file must have " +"permissions u=rw (0600) or less if owned by the current user, or permissions " +"u=rw,g=r (0640) or less if owned by root" msgstr "" -"ê°œì¸ í‚¤ íŒŒì¼ \"%s\"ì— ê·¸ë£¹ ë˜ëŠ” 범용 액세스 ê¶Œí•œì´ ìžˆìŠµë‹ˆë‹¤. ê¶Œí•œì€ " -"u=rw(0600) ì´í•˜ì—¬ì•¼ 합니다.\n" +"\"%s\" ê°œì¸í‚¤ 파ì¼ì˜ ì ‘ê·¼ê¶Œí•œì´ ê·¸ë£¹ ë˜ëŠ” 그외 사용ìžë„ ì ‘ê·¼ 가능함; íŒŒì¼ ì†Œ" +"유주가 현재 사용ìžë¼ë©´, ì ‘ê·¼ê¶Œí•œì„ u=rw (0600) ë˜ëŠ” ë” ìž‘ê²Œ 설정하고, rootê°€ " +"소유주ë¼ë©´ u=rw,g=r (0640) 권한으로 지정하세요." + +#: fe-secure-openssl.c:1436 +#, c-format +msgid "could not load private key file \"%s\": %s" +msgstr "\"%s\" ê°œì¸í‚¤ 파ì¼ì„ ë¶ˆëŸ¬ë“¤ì¼ ìˆ˜ 없습니다: %s" -#: fe-secure-openssl.c:1219 +#: fe-secure-openssl.c:1452 #, c-format -msgid "could not load private key file \"%s\": %s\n" -msgstr "\"%s\" ê°œì¸í‚¤ 파ì¼ì„ ë¶ˆëŸ¬ë“¤ì¼ ìˆ˜ 없습니다: %s\n" +msgid "certificate does not match private key file \"%s\": %s" +msgstr "ì¸ì¦ì„œê°€ \"%s\" ê°œì¸í‚¤ 파ì¼ê³¼ ë§žì§€ 않습니다: %s" -#: fe-secure-openssl.c:1237 +#: fe-secure-openssl.c:1521 #, c-format -msgid "certificate does not match private key file \"%s\": %s\n" -msgstr "ì¸ì¦ì„œê°€ \"%s\" ê°œì¸í‚¤ 파ì¼ê³¼ ë§žì§€ 않습니다: %s\n" +msgid "SSL error: certificate verify failed: %s" +msgstr "SSL 오류: ì¸ì¦ì„œ 유효성 검사 실패: %s" -#: fe-secure-openssl.c:1337 +#: fe-secure-openssl.c:1566 #, c-format msgid "" "This may indicate that the server does not support any SSL protocol version " -"between %s and %s.\n" -msgstr "" -"해당 서버는 SSL 프로토콜 버전 %s - %s 사ì´ë¥¼ ì§€ì›í•˜ì§€ 않습니다.\n" +"between %s and %s." +msgstr "해당 서버는 SSL 프로토콜 버전 %s - %s 사ì´ë¥¼ ì§€ì›í•˜ì§€ 않습니다." + +#: fe-secure-openssl.c:1598 +#, c-format +msgid "" +"direct SSL connection was established without ALPN protocol negotiation " +"extension" +msgstr "ALPN 프로토콜 í˜‘ìƒ í™•ìž¥ ì—†ì´ ì§ì ‘ SSL ì—°ê²°ì´ ìˆ˜ë¦½ë˜ì—ˆìŠµë‹ˆë‹¤." -#: fe-secure-openssl.c:1373 +#: fe-secure-openssl.c:1610 #, c-format -msgid "certificate could not be obtained: %s\n" -msgstr "ì¸ì¦ì„œë¥¼ 구하질 못했습니다: %s\n" +msgid "SSL connection was established with unexpected ALPN protocol" +msgstr "예ìƒì¹˜ 못한 ALPN 프로토콜로 SSL ì—°ê²°ì´ ìˆ˜ë¦½ë˜ì—ˆìŠµë‹ˆë‹¤." -#: fe-secure-openssl.c:1462 +#: fe-secure-openssl.c:1627 +#, c-format +msgid "certificate could not be obtained: %s" +msgstr "ì¸ì¦ì„œë¥¼ 구하질 못했습니다: %s" + +#: fe-secure-openssl.c:1734 #, c-format msgid "no SSL error reported" msgstr "SSL 오류 ì—†ìŒì´ ë³´ê³ ë¨" -#: fe-secure-openssl.c:1471 +#: fe-secure-openssl.c:1777 #, c-format msgid "SSL error code %lu" msgstr "SSL 오류 번호 %lu" -#: fe-secure-openssl.c:1718 +#: fe-secure-openssl.c:2076 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "경고: sslpassword ì‚­ì œë¨\n" -#: fe-secure.c:275 +#: fe-secure.c:248 #, c-format -msgid "could not receive data from server: %s\n" -msgstr "서버로부터 ë°ì´í„°ë¥¼ 받지 못했ìŒ: %s\n" +msgid "could not receive data from server: %s" +msgstr "서버로부터 ë°ì´í„°ë¥¼ 받지 못했ìŒ: %s" -#: fe-secure.c:390 +#: fe-secure.c:419 #, c-format -msgid "could not send data to server: %s\n" -msgstr "ì„œë²„ì— ë°ì´í„°ë¥¼ 보낼 수 ì—†ìŒ: %s\n" +msgid "could not send data to server: %s" +msgstr "ì„œë²„ì— ë°ì´í„°ë¥¼ 보낼 수 ì—†ìŒ: %s" -#: win32.c:314 +#: win32.c:310 #, c-format msgid "unrecognized socket error: 0x%08X/%d" msgstr "알 수 없는 소켓오류: 0x%08X/%d" + +#, c-format +#~ msgid "keepalives parameter must be an integer" +#~ msgstr "keepalives ë§¤ê°œë³€ìˆ˜ê°’ì€ ì •ìˆ˜ì—¬ì•¼ 합니다." diff --git a/src/interfaces/libpq/po/meson.build b/src/interfaces/libpq/po/meson.build index a7a1df87ae3b4..20b5795e89bf4 100644 --- a/src/interfaces/libpq/po/meson.build +++ b/src/interfaces/libpq/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('libpq' + '5' + '-' + pg_version_major.to_string())] diff --git a/src/interfaces/libpq/po/pt_BR.po b/src/interfaces/libpq/po/pt_BR.po index f43dc01db4b23..daef5f656e0f0 100644 --- a/src/interfaces/libpq/po/pt_BR.po +++ b/src/interfaces/libpq/po/pt_BR.po @@ -4,1003 +4,1477 @@ # Cesar Suga , 2002. # Roberto Mello , 2002. # Euler Taveira de Oliveira , 2003-2016. +# Halley Pacheco de Oliveira , 2023-2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.6\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2016-08-09 22:53-0300\n" -"PO-Revision-Date: 2005-10-04 22:45-0300\n" -"Last-Translator: Euler Taveira de Oliveira \n" -"Language-Team: Brazilian Portuguese \n" +"Project-Id-Version: PostgreSQL 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2024-01-02 15:53-0300\n" +"PO-Revision-Date: 2024-01-02 14:35-0300\n" +"Last-Translator: Halley Pacheco de Oliveira \n" +"Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.4.1\n" -#: fe-auth.c:148 +#: ../../port/thread.c:50 ../../port/thread.c:86 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "não foi possível procurar o ID do usuário local %d: %s" + +#: ../../port/thread.c:55 ../../port/thread.c:91 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "o usuário local com ID %d não existe" + +#: fe-auth-scram.c:227 +#, c-format +msgid "malformed SCRAM message (empty message)" +msgstr "mensagem SCRAM malformada (mensagem vazia)" + +#: fe-auth-scram.c:232 +#, c-format +msgid "malformed SCRAM message (length mismatch)" +msgstr "mensagem SCRAM malformada (o comprimento não corresponde)" + +#: fe-auth-scram.c:275 +#, c-format +msgid "could not verify server signature: %s" +msgstr "não foi possível verificar a assinatura do servidor: %s" + +#: fe-auth-scram.c:281 +#, c-format +msgid "incorrect server signature" +msgstr "assinatura do servidor incorreta" + +#: fe-auth-scram.c:290 +#, c-format +msgid "invalid SCRAM exchange state" +msgstr "estado de troca SCRAM inválido" + +#: fe-auth-scram.c:317 +#, c-format +msgid "malformed SCRAM message (attribute \"%c\" expected)" +msgstr "mensagem SCRAM malformada (esperado o atributo \"%c\")" + +#: fe-auth-scram.c:326 +#, c-format +msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")" +msgstr "mensagem SCRAM malformada (esperado o caractere \"=\" para o atributo \"%c\")" + +#: fe-auth-scram.c:366 +#, c-format +msgid "could not generate nonce" +msgstr "não foi possível gerar nonce" + +#: fe-auth-scram.c:375 fe-auth-scram.c:448 fe-auth-scram.c:600 +#: fe-auth-scram.c:620 fe-auth-scram.c:644 fe-auth-scram.c:658 +#: fe-auth-scram.c:704 fe-auth-scram.c:740 fe-auth-scram.c:914 fe-auth.c:296 +#: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:729 fe-auth.c:1210 +#: fe-auth.c:1375 fe-connect.c:925 fe-connect.c:1759 fe-connect.c:1921 +#: fe-connect.c:3291 fe-connect.c:4496 fe-connect.c:5161 fe-connect.c:5416 +#: fe-connect.c:5534 fe-connect.c:5781 fe-connect.c:5861 fe-connect.c:5959 +#: fe-connect.c:6210 fe-connect.c:6237 fe-connect.c:6313 fe-connect.c:6336 +#: fe-connect.c:6360 fe-connect.c:6395 fe-connect.c:6481 fe-connect.c:6489 +#: fe-connect.c:6846 fe-connect.c:6996 fe-exec.c:527 fe-exec.c:1321 +#: fe-exec.c:3130 fe-exec.c:4098 fe-exec.c:4262 fe-gssapi-common.c:109 +#: fe-lobj.c:870 fe-protocol3.c:204 fe-protocol3.c:228 fe-protocol3.c:251 +#: fe-protocol3.c:268 fe-protocol3.c:348 fe-protocol3.c:715 fe-protocol3.c:954 +#: fe-protocol3.c:1765 fe-protocol3.c:2165 fe-secure-common.c:110 +#: fe-secure-gssapi.c:496 fe-secure-openssl.c:440 fe-secure-openssl.c:1291 +#, c-format +msgid "out of memory" +msgstr "sem memória" + +#: fe-auth-scram.c:382 +#, c-format +msgid "could not encode nonce" +msgstr "não foi possível codificar nonce" + +#: fe-auth-scram.c:570 +#, c-format +msgid "could not calculate client proof: %s" +msgstr "não foi possível calcular a prova do cliente: %s" + +#: fe-auth-scram.c:585 +#, c-format +msgid "could not encode client proof" +msgstr "não foi possível codificar a prova do cliente" + +#: fe-auth-scram.c:637 +#, c-format +msgid "invalid SCRAM response (nonce mismatch)" +msgstr "resposta SCRAM inválida (nonce não corresponde)" + +#: fe-auth-scram.c:667 +#, c-format +msgid "malformed SCRAM message (invalid salt)" +msgstr "mensagem SCRAM malformada (sal inválido)" + +#: fe-auth-scram.c:680 +#, c-format +msgid "malformed SCRAM message (invalid iteration count)" +msgstr "mensagem SCRAM malformada (contagem de iteração inválida)" + +#: fe-auth-scram.c:685 +#, c-format +msgid "malformed SCRAM message (garbage at end of server-first-message)" +msgstr "mensagem SCRAM malformada (lixo no final da primeira mensagem do servidor)" + +#: fe-auth-scram.c:719 +#, c-format +msgid "error received from server in SCRAM exchange: %s" +msgstr "erro recebido do servidor na troca SCRAM: %s" + +#: fe-auth-scram.c:734 +#, c-format +msgid "malformed SCRAM message (garbage at end of server-final-message)" +msgstr "mensagem SCRAM malformada (lixo no final da mensagem final do servidor)" + +#: fe-auth-scram.c:751 +#, c-format +msgid "malformed SCRAM message (invalid server signature)" +msgstr "mensagem SCRAM malformada (assinatura do servidor inválida)" + +#: fe-auth-scram.c:923 +msgid "could not generate random salt" +msgstr "não foi possível gerar sal aleatório" + +#: fe-auth.c:77 +#, c-format +msgid "out of memory allocating GSSAPI buffer (%d)" +msgstr "sem memória para alocar buffer para GSSAPI (%d)" + +#: fe-auth.c:138 msgid "GSSAPI continuation error" -msgstr "erro ao continuar autenticação GSSAPI" - -#: fe-auth.c:177 fe-auth.c:412 -msgid "host name must be specified\n" -msgstr "nome da máquina deve ser especificado\n" - -#: fe-auth.c:184 -msgid "duplicate GSS authentication request\n" -msgstr "pedido de autenticação GSS duplicado\n" - -#: fe-auth.c:197 fe-auth.c:309 fe-auth.c:383 fe-auth.c:418 fe-auth.c:514 -#: fe-auth.c:780 fe-connect.c:707 fe-connect.c:904 fe-connect.c:1080 -#: fe-connect.c:2091 fe-connect.c:3484 fe-connect.c:3736 fe-connect.c:3855 -#: fe-connect.c:4095 fe-connect.c:4175 fe-connect.c:4274 fe-connect.c:4530 -#: fe-connect.c:4559 fe-connect.c:4631 fe-connect.c:4649 fe-connect.c:4745 -#: fe-connect.c:5079 fe-connect.c:5229 fe-exec.c:2651 fe-exec.c:3398 -#: fe-exec.c:3563 fe-lobj.c:896 fe-protocol2.c:1206 fe-protocol3.c:992 -#: fe-protocol3.c:1678 fe-secure-openssl.c:552 fe-secure-openssl.c:1094 -msgid "out of memory\n" -msgstr "sem memória\n" +msgstr "erro de continuação do GSSAPI" -#: fe-auth.c:210 -msgid "GSSAPI name import error" -msgstr "erro de importação de nome GSSAPI" +#: fe-auth.c:168 fe-auth.c:397 fe-gssapi-common.c:97 fe-secure-common.c:99 +#: fe-secure-common.c:173 +#, c-format +msgid "host name must be specified" +msgstr "deve ser especificado o nome do hospedeiro" + +#: fe-auth.c:174 +#, c-format +msgid "duplicate GSS authentication request" +msgstr "solicitação de autenticação GSS duplicada" + +#: fe-auth.c:238 +#, c-format +msgid "out of memory allocating SSPI buffer (%d)" +msgstr "sem memória para alocar o buffer SSPI (%d)" -#: fe-auth.c:298 +#: fe-auth.c:285 msgid "SSPI continuation error" -msgstr "erro ao continuar autenticação SSPI" +msgstr "erro de continuação SSPI" + +#: fe-auth.c:359 +#, c-format +msgid "duplicate SSPI authentication request" +msgstr "solicitação de autenticação SSPI duplicada" -#: fe-auth.c:398 +#: fe-auth.c:384 msgid "could not acquire SSPI credentials" -msgstr "não pôde obter credenciais SSPI" +msgstr "não foi possível adquirir credenciais SSPI" + +#: fe-auth.c:437 +#, c-format +msgid "channel binding required, but SSL not in use" +msgstr "vinculação de canal necessária, mas SSL não está em uso" -#: fe-auth.c:489 -msgid "SCM_CRED authentication method not supported\n" -msgstr "método de autenticação SCM_CRED não é suportado\n" +#: fe-auth.c:443 +#, c-format +msgid "duplicate SASL authentication request" +msgstr "solicitação de autenticação SASL duplicada" -#: fe-auth.c:565 -msgid "Kerberos 4 authentication not supported\n" -msgstr "Autenticação Kerberos 4 não é suportada\n" +#: fe-auth.c:501 +#, c-format +msgid "channel binding is required, but client does not support it" +msgstr "a vinculação de canal é necessária, mas o cliente não oferece suporte" -#: fe-auth.c:570 -msgid "Kerberos 5 authentication not supported\n" -msgstr "Autenticação Kerberos 5 não é suportada\n" +#: fe-auth.c:517 +#, c-format +msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection" +msgstr "o servidor ofereceu autenticação SCRAM-SHA-256-PLUS em uma conexão não-SSL" + +#: fe-auth.c:531 +#, c-format +msgid "none of the server's SASL authentication mechanisms are supported" +msgstr "nenhum dos mecanismos de autenticação SASL do servidor tem suporte" + +#: fe-auth.c:538 +#, c-format +msgid "channel binding is required, but server did not offer an authentication method that supports channel binding" +msgstr "a vinculação de canal é necessária, mas o servidor não oferece um método de autenticação que dê suporte a vinculação de canal" #: fe-auth.c:641 -msgid "GSSAPI authentication not supported\n" -msgstr "Autenticação GSSAPI não é suportada\n" +#, c-format +msgid "out of memory allocating SASL buffer (%d)" +msgstr "sem memória para alocar o buffer SASL (%d)" + +#: fe-auth.c:665 +#, c-format +msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed" +msgstr "AuthenticationSASLFinal recebida do servidor, mas a autenticação SASL não foi concluída" + +#: fe-auth.c:675 +#, c-format +msgid "no client response found after SASL exchange success" +msgstr "nenhuma resposta do cliente encontrada após a troca SASL bem-sucedida" + +#: fe-auth.c:738 fe-auth.c:745 fe-auth.c:1358 fe-auth.c:1369 +#, c-format +msgid "could not encrypt password: %s" +msgstr "não foi possível encriptar a senha: %s" -#: fe-auth.c:673 -msgid "SSPI authentication not supported\n" -msgstr "Autenticação SSPI não é suportada\n" +#: fe-auth.c:773 +msgid "server requested a cleartext password" +msgstr "o servidor solicitou uma senha em texto puro" -#: fe-auth.c:681 -msgid "Crypt authentication not supported\n" -msgstr "Autenticação crypt não é suportada\n" +#: fe-auth.c:775 +msgid "server requested a hashed password" +msgstr "o servidor solicitou uma senha com hash" -#: fe-auth.c:708 +#: fe-auth.c:778 +msgid "server requested GSSAPI authentication" +msgstr "o servidor solicitou autenticação GSSAPI" + +#: fe-auth.c:780 +msgid "server requested SSPI authentication" +msgstr "o servidor solicitou autenticação SSPI" + +#: fe-auth.c:784 +msgid "server requested SASL authentication" +msgstr "o servidor solicitou autenticação SASL" + +#: fe-auth.c:787 +msgid "server requested an unknown authentication type" +msgstr "o servidor solicitou um tipo de autenticação desconhecido" + +#: fe-auth.c:820 #, c-format -msgid "authentication method %u not supported\n" -msgstr "método de autenticação %u não é suportado\n" +msgid "server did not request an SSL certificate" +msgstr "o servidor não solicitou um certificado SSL" -#: fe-auth.c:755 +#: fe-auth.c:825 #, c-format -msgid "user name lookup failure: error code %lu\n" -msgstr "falhou ao pesquisar nome de usuário: código de erro %lu\n" +msgid "server accepted connection without a valid SSL certificate" +msgstr "o servidor aceitou uma conexão sem um certificado SSL válido" + +#: fe-auth.c:879 +msgid "server did not complete authentication" +msgstr "o servidor não concluiu a autenticação" -#: fe-auth.c:765 fe-connect.c:2018 +#: fe-auth.c:913 #, c-format -msgid "could not look up local user ID %d: %s\n" -msgstr "não pôde encontrar ID de usuário local %d: %s\n" +msgid "authentication method requirement \"%s\" failed: %s" +msgstr "o requisito do método de autenticação \"%s\" falhou: %s" -#: fe-auth.c:770 fe-connect.c:2023 +#: fe-auth.c:936 #, c-format -msgid "local user with ID %d does not exist\n" -msgstr "usuário local com ID %d não existe\n" +msgid "channel binding required, but server authenticated client without channel binding" +msgstr "vinculação de canal requerida, mas o servidor autenticou o cliente sem vinculação de canal" -#: fe-connect.c:846 +#: fe-auth.c:941 #, c-format -msgid "invalid sslmode value: \"%s\"\n" -msgstr "valor do modo ssl desconhecido: \"%s\"\n" +msgid "channel binding required but not supported by server's authentication request" +msgstr "vinculação de canal requerida, mas não tem suporte pelo pedido de autenticação do servidor" -#: fe-connect.c:867 +#: fe-auth.c:975 #, c-format -msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" -msgstr "valor \"%s\" do modo ssl é inválido quando suporte a SSL não foi compilado\n" +msgid "Kerberos 4 authentication not supported" +msgstr "autenticação Kerberos 4 não tem suporte" -#: fe-connect.c:1104 +#: fe-auth.c:979 #, c-format -msgid "could not set socket to TCP no delay mode: %s\n" -msgstr "não pôde configurar o soquete para modo TCP sem atraso: %s\n" +msgid "Kerberos 5 authentication not supported" +msgstr "autenticação Kerberos 5 não tem suporte" -#: fe-connect.c:1134 +#: fe-auth.c:1049 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running locally and accepting\n" -"\tconnections on Unix domain socket \"%s\"?\n" -msgstr "" -"não pôde conectar ao servidor: %s\n" -"\tO servidor está executando localmente e aceitando\n" -"\tconexões no soquete de domínio Unix \"%s\"?\n" +msgid "GSSAPI authentication not supported" +msgstr "autenticação GSSAPI não tem suporte" -#: fe-connect.c:1189 +#: fe-auth.c:1080 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running on host \"%s\" (%s) and accepting\n" -"\tTCP/IP connections on port %s?\n" -msgstr "" -"não pôde conectar ao servidor: %s\n" -"\tO servidor está executando na máquina \"%s\" (%s) e aceitando\n" -"\tconexões TCP/IP na porta %s?\n" +msgid "SSPI authentication not supported" +msgstr "autenticação SSPI não tem suporte" -#: fe-connect.c:1198 +#: fe-auth.c:1087 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running on host \"%s\" and accepting\n" -"\tTCP/IP connections on port %s?\n" -msgstr "" -"não pôde conectar ao servidor: %s\n" -"\tO servidor está executando na máquina \"%s\" e aceitando\n" -"\tconexões TCP/IP na porta %s?\n" +msgid "Crypt authentication not supported" +msgstr "autenticação Crypt não tem suporte" -#: fe-connect.c:1249 +#: fe-auth.c:1151 #, c-format -msgid "setsockopt(TCP_KEEPIDLE) failed: %s\n" -msgstr "setsockopt(TCP_KEEPIDLE) falhou: %s\n" +msgid "authentication method %u not supported" +msgstr "o método de autenticação %u não tem suporte" -#: fe-connect.c:1262 +#: fe-auth.c:1197 #, c-format -msgid "setsockopt(TCP_KEEPALIVE) failed: %s\n" -msgstr "setsockopt(TCP_KEEPALIVE) falhou: %s\n" +msgid "user name lookup failure: error code %lu" +msgstr "falha na procura do nome de usuário: código de erro %lu" -#: fe-connect.c:1294 +#: fe-auth.c:1321 #, c-format -msgid "setsockopt(TCP_KEEPINTVL) failed: %s\n" -msgstr "setsockopt(TCP_KEEPINTVL) falhou: %s\n" +msgid "unexpected shape of result set returned for SHOW" +msgstr "forma não esperada do conjunto de resultados retornado para SHOW" -#: fe-connect.c:1326 +#: fe-auth.c:1329 #, c-format -msgid "setsockopt(TCP_KEEPCNT) failed: %s\n" -msgstr "setsockopt(TCP_KEEPCNT) falhou: %s\n" +msgid "password_encryption value too long" +msgstr "valor de password_encryption muito longo" -#: fe-connect.c:1374 +#: fe-auth.c:1379 #, c-format -msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" -msgstr "WSAIoctl(SIO_KEEPALIVE_VALS) falhou: %ui\n" +msgid "unrecognized password encryption algorithm \"%s\"" +msgstr "algoritmo de encriptação de senha não reconhecido \"%s\"" -#: fe-connect.c:1426 +#: fe-connect.c:1132 #, c-format -msgid "invalid port number: \"%s\"\n" -msgstr "número de porta inválido: \"%s\"\n" +msgid "could not match %d host names to %d hostaddr values" +msgstr "não é possível corresponder %d nomes de hospedeiro com %d valores de endereço" -#: fe-connect.c:1459 +#: fe-connect.c:1212 #, c-format -msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" -msgstr "caminho do soquete de domínio Unix \"%s\" é muito longo (máximo de %d bytes)\n" +msgid "could not match %d port numbers to %d hosts" +msgstr "não é possível corresponder %d número de portas com %d hospedeiros" -#: fe-connect.c:1478 +#: fe-connect.c:1337 #, c-format -msgid "could not translate host name \"%s\" to address: %s\n" -msgstr "não pôde traduzir nome da máquina \"%s\" para endereço: %s\n" +msgid "negative require_auth method \"%s\" cannot be mixed with non-negative methods" +msgstr "o método require_auth negativo \"%s\" não pode ser misturado com métodos não negativos" -#: fe-connect.c:1482 +#: fe-connect.c:1350 #, c-format -msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" -msgstr "não pôde traduzir caminho do soquete de domínio Unix \"%s\" para endereço: %s\n" +msgid "require_auth method \"%s\" cannot be mixed with negative methods" +msgstr "o método require_auth \"%s\" não pode ser misturado com métodos negativos" -#: fe-connect.c:1687 -msgid "invalid connection state, probably indicative of memory corruption\n" -msgstr "estado de conexão é inválido, provavelmente indicativo de corrupção de memória\n" +#: fe-connect.c:1410 fe-connect.c:1461 fe-connect.c:1503 fe-connect.c:1559 +#: fe-connect.c:1567 fe-connect.c:1598 fe-connect.c:1644 fe-connect.c:1684 +#: fe-connect.c:1705 +#, c-format +msgid "invalid %s value: \"%s\"" +msgstr "valor %s inválido: \"%s\"" -#: fe-connect.c:1727 +#: fe-connect.c:1443 #, c-format -msgid "could not create socket: %s\n" -msgstr "não pôde criar soquete: %s\n" +msgid "require_auth method \"%s\" is specified more than once" +msgstr "o método require_auth \"%s\" foi especificado mais de uma vez" -#: fe-connect.c:1749 +#: fe-connect.c:1484 fe-connect.c:1523 fe-connect.c:1606 #, c-format -msgid "could not set socket to nonblocking mode: %s\n" -msgstr "não pôde configurar o soquete para modo não bloqueado: %s\n" +msgid "%s value \"%s\" invalid when SSL support is not compiled in" +msgstr "o valor «%2$s» de %1$s não é válido quando o suporte a SSL não está compilado" -#: fe-connect.c:1760 +#: fe-connect.c:1546 #, c-format -msgid "could not set socket to close-on-exec mode: %s\n" -msgstr "não pôde configurar o soquete para modo fechar-após-execução: %s\n" +msgid "weak sslmode \"%s\" may not be used with sslrootcert=system (use \"verify-full\")" +msgstr "sslmode fraco \"%s\" não pode ser usado com sslrootcert=system (use \"verify-full\")" -#: fe-connect.c:1779 -msgid "keepalives parameter must be an integer\n" -msgstr "parâmetro keepalives deve ser um inteiro\n" +#: fe-connect.c:1584 +#, c-format +msgid "invalid SSL protocol version range" +msgstr "intervalo de versões do protocolo SSL inválido" -#: fe-connect.c:1792 +#: fe-connect.c:1621 #, c-format -msgid "setsockopt(SO_KEEPALIVE) failed: %s\n" -msgstr "setsockopt(SO_KEEPALIVE) falhou: %s\n" +msgid "%s value \"%s\" is not supported (check OpenSSL version)" +msgstr "o valor %s \"%s\" não tem suporte (verifique a versão do OpenSSL)" -#: fe-connect.c:1929 +#: fe-connect.c:1651 #, c-format -msgid "could not get socket error status: %s\n" -msgstr "não pôde obter status de erro do soquete: %s\n" +msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in" +msgstr "o valor de gssencmode \"%s\" não é válido quando o suporte a GSSAPI não foi compilado" -#: fe-connect.c:1963 +#: fe-connect.c:1944 #, c-format -msgid "could not get client address from socket: %s\n" -msgstr "não pôde obter do soquete o endereço do cliente: %s\n" +msgid "could not set socket to TCP no delay mode: %s" +msgstr "não foi possível definir o soquete no modo TCP sem atraso: %s" -#: fe-connect.c:2005 -msgid "requirepeer parameter is not supported on this platform\n" -msgstr "parâmetro requirepeer não é suportado nessa plataforma\n" +#: fe-connect.c:2003 +#, c-format +msgid "connection to server on socket \"%s\" failed: " +msgstr "a conexão com o servidor no soquete \"%s\" falhou: " -#: fe-connect.c:2008 +#: fe-connect.c:2029 #, c-format -msgid "could not get peer credentials: %s\n" -msgstr "não pôde receber credenciais: %s\n" +msgid "connection to server at \"%s\" (%s), port %s failed: " +msgstr "a conexão com o servidor em \"%s\" (%s), porta %s falhou: " -#: fe-connect.c:2031 +#: fe-connect.c:2034 #, c-format -msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" -msgstr "requirepeer especificou \"%s\", mas nome de usuário atual é \"%s\"\n" +msgid "connection to server at \"%s\", port %s failed: " +msgstr "a conexão com o servidor em \"%s\", porta %s falhou: " -#: fe-connect.c:2065 +#: fe-connect.c:2057 #, c-format -msgid "could not send SSL negotiation packet: %s\n" -msgstr "não pôde mandar pacote de negociação SSL: %s\n" +msgid "\tIs the server running locally and accepting connections on that socket?" +msgstr "\tO servidor está em execução localmente e aceitando conexões nesse soquete?" -#: fe-connect.c:2104 +#: fe-connect.c:2059 #, c-format -msgid "could not send startup packet: %s\n" -msgstr "não pôde enviar pacote de inicialização: %s\n" +msgid "\tIs the server running on that host and accepting TCP/IP connections?" +msgstr "\tO servidor está em execução nesse hospedeiro e aceitando conexões TCP/IP?" -#: fe-connect.c:2174 -msgid "server does not support SSL, but SSL was required\n" -msgstr "servidor não suporta SSL, mas SSL foi requerido\n" +#: fe-connect.c:2122 +#, c-format +msgid "invalid integer value \"%s\" for connection option \"%s\"" +msgstr "valor inteiro inválido \"%s\" para a opção de conexão \"%s\"" -#: fe-connect.c:2200 +#: fe-connect.c:2151 fe-connect.c:2185 fe-connect.c:2220 fe-connect.c:2318 +#: fe-connect.c:2973 #, c-format -msgid "received invalid response to SSL negotiation: %c\n" -msgstr "a negociação SSL recebeu uma resposta inválida: %c\n" +msgid "%s(%s) failed: %s" +msgstr "%s(%s) falhou: %s" -#: fe-connect.c:2275 fe-connect.c:2308 +#: fe-connect.c:2284 #, c-format -msgid "expected authentication request from server, but received %c\n" -msgstr "pedido de autenticação esperado do servidor, mas foi recebido %c\n" +msgid "%s(%s) failed: error code %d" +msgstr "%s(%s) falhou: código de erro %d" -#: fe-connect.c:2475 +#: fe-connect.c:2597 #, c-format -msgid "out of memory allocating GSSAPI buffer (%d)" -msgstr "sem memória para alocar buffer para GSSAPI (%d)" +msgid "invalid connection state, probably indicative of memory corruption" +msgstr "estado da conexão inválido, provável indicação de corrupção de memória" + +#: fe-connect.c:2676 +#, c-format +msgid "invalid port number: \"%s\"" +msgstr "número da porta inválido: \"%s\"" + +#: fe-connect.c:2690 +#, c-format +msgid "could not translate host name \"%s\" to address: %s" +msgstr "não foi possível traduzir o nome de hospedeiro \"%s\" para um endereço: %s" + +#: fe-connect.c:2702 +#, c-format +msgid "could not parse network address \"%s\": %s" +msgstr "não foi possível analisar o endereço de rede \"%s\": %s" + +#: fe-connect.c:2713 +#, c-format +msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" +msgstr "caminho do soquete de domínio Unix \"%s\" é muito longo (máximo de %d bytes)" + +#: fe-connect.c:2727 +#, c-format +msgid "could not translate Unix-domain socket path \"%s\" to address: %s" +msgstr "não foi possível traduzir o caminho do soquete de domínio Unix \"%s\" para um endereço: %s" + +#: fe-connect.c:2901 +#, c-format +msgid "could not create socket: %s" +msgstr "não foi possível criar o soquete: %s" + +#: fe-connect.c:2932 +#, c-format +msgid "could not set socket to nonblocking mode: %s" +msgstr "não foi possível definir o soquete para o modo não bloqueante: %s" + +#: fe-connect.c:2943 +#, c-format +msgid "could not set socket to close-on-exec mode: %s" +msgstr "não foi possível definir o soquete para o modo close-on-exec: %s" + +#: fe-connect.c:2961 +#, c-format +msgid "keepalives parameter must be an integer" +msgstr "o parâmetro keepalives deve ser um número inteiro" + +#: fe-connect.c:3100 +#, c-format +msgid "could not get socket error status: %s" +msgstr "não foi possível obter o status de erro do soquete: %s" + +#: fe-connect.c:3127 +#, c-format +msgid "could not get client address from socket: %s" +msgstr "não foi possível obter o endereço do cliente do soquete: %s" -#: fe-connect.c:2560 -msgid "unexpected message from server during startup\n" -msgstr "mensagem inesperada do servidor durante inicialização\n" +#: fe-connect.c:3165 +#, c-format +msgid "requirepeer parameter is not supported on this platform" +msgstr "o parâmetro requirepeer não tem suporte nessa plataforma" -#: fe-connect.c:2654 +#: fe-connect.c:3167 #, c-format -msgid "invalid connection state %d, probably indicative of memory corruption\n" -msgstr "estado de conexão %d é inválido, provavelmente indicativo de corrupção de memória\n" +msgid "could not get peer credentials: %s" +msgstr "não foi possível obter as credenciais do parceiro: %s" -#: fe-connect.c:3090 fe-connect.c:3150 +#: fe-connect.c:3180 #, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEventProc \"%s\" falhou durante evento PGEVT_CONNRESET\n" +msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"" +msgstr "requirepeer especifica \"%s\", mas o nome real do usuário parceiro é \"%s\"" -#: fe-connect.c:3497 +#: fe-connect.c:3221 #, c-format -msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" -msgstr "URL LDAP \"%s\" é inválida: esquema deve ser ldap://\n" +msgid "could not send GSSAPI negotiation packet: %s" +msgstr "não foi possível enviar o pacote de negociação GSSAPI: %s" -#: fe-connect.c:3512 +#: fe-connect.c:3233 #, c-format -msgid "invalid LDAP URL \"%s\": missing distinguished name\n" -msgstr "URL LDAP \"%s\" é inválida: faltando nome distinto\n" +msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)" +msgstr "A encriptação GSSAPI é requerida, mas não foi possível (possivelmente sem cache de credenciais, sem suporte do servidor, ou usando um soquete local)" -#: fe-connect.c:3523 fe-connect.c:3576 +#: fe-connect.c:3274 #, c-format -msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" -msgstr "URL LDAP \"%s\" é inválida: deve ter exatamente um atributo\n" +msgid "could not send SSL negotiation packet: %s" +msgstr "não foi possível enviar o pacote de negociação SSL: %s" -#: fe-connect.c:3533 fe-connect.c:3590 +#: fe-connect.c:3303 #, c-format -msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" -msgstr "URL LDAP \"%s\" é inválida: deve ter escopo de busca (base/one/sub)\n" +msgid "could not send startup packet: %s" +msgstr "não foi possível enviar o pacote de inicialização: %s" -#: fe-connect.c:3544 +#: fe-connect.c:3378 #, c-format -msgid "invalid LDAP URL \"%s\": no filter\n" -msgstr "URL LDAP \"%s\" é inválida: nenhum filtro\n" +msgid "server does not support SSL, but SSL was required" +msgstr "o servidor não oferece suporte a SSL, mas SSL é requerido" -#: fe-connect.c:3565 +#: fe-connect.c:3404 #, c-format -msgid "invalid LDAP URL \"%s\": invalid port number\n" -msgstr "URL LDAP \"%s\" é inválida: número de porta é inválido\n" +msgid "received invalid response to SSL negotiation: %c" +msgstr "recebida resposta inválida para negociação SSL: %c" -#: fe-connect.c:3599 -msgid "could not create LDAP structure\n" -msgstr "não pôde criar estrutura LDAP\n" +#: fe-connect.c:3424 +#, c-format +msgid "received unencrypted data after SSL response" +msgstr "recebidos dados não encriptados após resposta SSL" -#: fe-connect.c:3675 +#: fe-connect.c:3504 #, c-format -msgid "lookup on LDAP server failed: %s\n" -msgstr "busca em servidor LDAP falhou: %s\n" +msgid "server doesn't support GSSAPI encryption, but it was required" +msgstr "o servidor não oferece suporte a encriptação GSSAPI, mas é requerida" -#: fe-connect.c:3686 -msgid "more than one entry found on LDAP lookup\n" -msgstr "mais de um registro encontrado na busca no LDAP\n" +#: fe-connect.c:3515 +#, c-format +msgid "received invalid response to GSSAPI negotiation: %c" +msgstr "recebida resposta inválida para negociação GSSAPI: %c" -#: fe-connect.c:3687 fe-connect.c:3699 -msgid "no entry found on LDAP lookup\n" -msgstr "nenhum registro encontrado na busca no LDAP\n" +#: fe-connect.c:3533 +#, c-format +msgid "received unencrypted data after GSSAPI encryption response" +msgstr "recebidos dados não encriptados após resposta de encriptação GSSAPI" -#: fe-connect.c:3710 fe-connect.c:3723 -msgid "attribute has no values on LDAP lookup\n" -msgstr "atributo não tem valores na busca no LDAP\n" +#: fe-connect.c:3598 +#, c-format +msgid "expected authentication request from server, but received %c" +msgstr "esperada uma solicitação de autenticação do servidor, mas não foi recebida %c" -#: fe-connect.c:3775 fe-connect.c:3794 fe-connect.c:4313 +#: fe-connect.c:3625 fe-connect.c:3794 #, c-format -msgid "missing \"=\" after \"%s\" in connection info string\n" -msgstr "faltando \"=\" depois de \"%s\" na cadeia de caracteres de conexão\n" +msgid "received invalid authentication request" +msgstr "recebida uma solicitação de autenticação inválida" -#: fe-connect.c:3867 fe-connect.c:4498 fe-connect.c:5212 +#: fe-connect.c:3630 fe-connect.c:3779 #, c-format -msgid "invalid connection option \"%s\"\n" -msgstr "opção de conexão \"%s\" é inválida\n" +msgid "received invalid protocol negotiation message" +msgstr "recebida uma mensagem de negociação de protocolo inválida" -#: fe-connect.c:3883 fe-connect.c:4362 -msgid "unterminated quoted string in connection info string\n" -msgstr "cadeia de caracteres entre aspas não foi terminada na cadeia de caracteres de conexão\n" +#: fe-connect.c:3648 fe-connect.c:3702 +#, c-format +msgid "received invalid error message" +msgstr "recebida uma mensagem de erro inválida" -#: fe-connect.c:3923 -msgid "could not get home directory to locate service definition file" -msgstr "não pôde obter diretório base do usuário para localizar arquivo de definição de serviço" +#: fe-connect.c:3865 +#, c-format +msgid "unexpected message from server during startup" +msgstr "recebida uma mensagem não esperada do servidor durante a inicialização" #: fe-connect.c:3956 #, c-format -msgid "definition of service \"%s\" not found\n" -msgstr "definição de serviço \"%s\" não foi encontrado\n" +msgid "session is read-only" +msgstr "a sessão é de leitura-apenas" -#: fe-connect.c:3979 +#: fe-connect.c:3958 #, c-format -msgid "service file \"%s\" not found\n" -msgstr "arquivo de serviço \"%s\" não foi encontrado\n" +msgid "session is not read-only" +msgstr "a sessão não é de leitura-apenas" -#: fe-connect.c:3992 +#: fe-connect.c:4011 #, c-format -msgid "line %d too long in service file \"%s\"\n" -msgstr "linha %d é muito longa no arquivo de serviço \"%s\"\n" +msgid "server is in hot standby mode" +msgstr "o servidor está no modo hot-standby (ativo, em-espera)" -#: fe-connect.c:4063 fe-connect.c:4107 +#: fe-connect.c:4013 #, c-format -msgid "syntax error in service file \"%s\", line %d\n" -msgstr "erro de sintaxe no arquivo de serviço \"%s\", linha %d\n" +msgid "server is not in hot standby mode" +msgstr "o servidor não está no modo hot-standby (ativo, em-espera)" -#: fe-connect.c:4074 +#: fe-connect.c:4129 fe-connect.c:4179 #, c-format -msgid "nested service specifications not supported in service file \"%s\", line %d\n" -msgstr "especificações de serviço aninhadas não são suportadas no arquivo de serviço \"%s\", linha %d\n" +msgid "\"%s\" failed" +msgstr "\"%s\" falhou" -#: fe-connect.c:4756 +#: fe-connect.c:4193 #, c-format -msgid "invalid URI propagated to internal parser routine: \"%s\"\n" -msgstr "URI inválida propagada para rotina interna do analisador: \"%s\"\n" +msgid "invalid connection state %d, probably indicative of memory corruption" +msgstr "estado da conexão inválido (%d), provavelmente indicativo de corrupção de memória" -#: fe-connect.c:4826 +#: fe-connect.c:5174 #, c-format -msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" -msgstr "fim da cadeia de caracteres atingido quando procurava por \"]\" no endereço IPv6 na URI: \"%s\"\n" +msgid "invalid LDAP URL \"%s\": scheme must be ldap://" +msgstr "URL LDAP \"%s\" inválido: o esquema deve ser ldap://" -#: fe-connect.c:4833 +#: fe-connect.c:5189 #, c-format -msgid "IPv6 host address may not be empty in URI: \"%s\"\n" -msgstr "endereço IPv6 não pode ser vazio na URI: \"%s\"\n" +msgid "invalid LDAP URL \"%s\": missing distinguished name" +msgstr "URL LDAP \"%s\" inválido: nome distinto ausente" -#: fe-connect.c:4848 +#: fe-connect.c:5201 fe-connect.c:5259 #, c-format -msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" -msgstr "caracter \"%c\" inesperado na posição %d na URI (esperado \":\" ou \"/\"): \"%s\"\n" +msgid "invalid LDAP URL \"%s\": must have exactly one attribute" +msgstr "URL LDAP \"%s\" inválido: deve ter exatamente um atributo" -#: fe-connect.c:4962 +#: fe-connect.c:5213 fe-connect.c:5275 #, c-format -msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "separador de chave/valor \"=\" extra no parâmetro da URI: \"%s\"\n" +msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" +msgstr "URL LDAP \"%s\" inválido: deve ter o escopo da procura (base/one/sub)" -#: fe-connect.c:4982 +#: fe-connect.c:5225 #, c-format -msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "faltando separador de chave/valor \"=\" no parâmetro da URI: \"%s\"\n" +msgid "invalid LDAP URL \"%s\": no filter" +msgstr "URL LDAP \"%s\" inválido: sem filtro" -#: fe-connect.c:5033 +#: fe-connect.c:5247 #, c-format -msgid "invalid URI query parameter: \"%s\"\n" -msgstr "parâmetro da URI é inválido: \"%s\"\n" +msgid "invalid LDAP URL \"%s\": invalid port number" +msgstr "URL LDAP \"%s\" inválido: número de porta inválido" -#: fe-connect.c:5107 +#: fe-connect.c:5284 #, c-format -msgid "invalid percent-encoded token: \"%s\"\n" -msgstr "elemento escapado com porcentagem é inválido: \"%s\"\n" +msgid "could not create LDAP structure" +msgstr "não foi possível criar a estrutura LDAP" -#: fe-connect.c:5117 +#: fe-connect.c:5359 #, c-format -msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" -msgstr "valor %%00 proibido em valor escapado com porcentagem: \"%s\"\n" +msgid "lookup on LDAP server failed: %s" +msgstr "falha na procura no servidor LDAP: %s" -#: fe-connect.c:5451 -msgid "connection pointer is NULL\n" -msgstr "ponteiro da conexão é NULO\n" +#: fe-connect.c:5369 +#, c-format +msgid "more than one entry found on LDAP lookup" +msgstr "mais de uma entrada encontrada na procura LDAP" -#: fe-connect.c:5749 +#: fe-connect.c:5371 fe-connect.c:5382 #, c-format -msgid "WARNING: password file \"%s\" is not a plain file\n" -msgstr "AVISO: arquivo de senhas \"%s\" não é um arquivo no formato texto\n" +msgid "no entry found on LDAP lookup" +msgstr "nenhuma entrada encontrada na procura LDAP" -#: fe-connect.c:5758 +#: fe-connect.c:5392 fe-connect.c:5404 #, c-format -msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" -msgstr "AVISO: arquivo de senhas \"%s\" tem acesso de leitura para outros ou grupo; permissões devem ser u=rw (0600) ou menos que isso\n" +msgid "attribute has no values on LDAP lookup" +msgstr "o atributo não tem valores na procura LDAP" -#: fe-connect.c:5864 +#: fe-connect.c:5455 fe-connect.c:5474 fe-connect.c:5998 #, c-format -msgid "password retrieved from file \"%s\"\n" -msgstr "senha obtida do arquivo \"%s\"\n" +msgid "missing \"=\" after \"%s\" in connection info string" +msgstr "faltando \"=\" após \"%s\" na cadeia de caracteres de informações da conexão" -#: fe-exec.c:826 -msgid "NOTICE" -msgstr "NOTA" +#: fe-connect.c:5545 fe-connect.c:6181 fe-connect.c:6979 +#, c-format +msgid "invalid connection option \"%s\"" +msgstr "opção de conexão inválida \"%s\"" -#: fe-exec.c:1140 fe-exec.c:1198 fe-exec.c:1244 -msgid "command string is a null pointer\n" -msgstr "cadeia de caracteres do comando é um ponteiro nulo\n" +#: fe-connect.c:5560 fe-connect.c:6046 +#, c-format +msgid "unterminated quoted string in connection info string" +msgstr "cadeia de caracteres delimitada não terminada na cadeia de caracteres de informações da conexão" -#: fe-exec.c:1204 fe-exec.c:1250 fe-exec.c:1345 -msgid "number of parameters must be between 0 and 65535\n" -msgstr "número de parâmetros deve ser entre 0 e 65535\n" +#: fe-connect.c:5640 +#, c-format +msgid "definition of service \"%s\" not found" +msgstr "definição de serviço \"%s\" não encontrada" -#: fe-exec.c:1238 fe-exec.c:1339 -msgid "statement name is a null pointer\n" -msgstr "nome do comando é um ponteiro nulo\n" +#: fe-connect.c:5666 +#, c-format +msgid "service file \"%s\" not found" +msgstr "arquivo de serviço \"%s\" não encontrado" -#: fe-exec.c:1258 fe-exec.c:1422 fe-exec.c:2140 fe-exec.c:2339 -msgid "function requires at least protocol version 3.0\n" -msgstr "função requer pelo menos a versão 3.0 do protocolo\n" +#: fe-connect.c:5679 +#, c-format +msgid "line %d too long in service file \"%s\"" +msgstr "linha %d muito longa no arquivo de serviço \"%s\"" -#: fe-exec.c:1376 -msgid "no connection to the server\n" -msgstr "sem conexão ao servidor\n" +#: fe-connect.c:5750 fe-connect.c:5793 +#, c-format +msgid "syntax error in service file \"%s\", line %d" +msgstr "erro de sintaxe no arquivo de serviço \"%s\", linha %d" -#: fe-exec.c:1383 -msgid "another command is already in progress\n" -msgstr "outro comando já está em execução\n" +#: fe-connect.c:5761 +#, c-format +msgid "nested service specifications not supported in service file \"%s\", line %d" +msgstr "especificações de serviço aninhadas sem suporte no arquivo de serviço \"%s\", linha %d" -#: fe-exec.c:1498 -msgid "length must be given for binary parameter\n" -msgstr "tamanho deve ser informado para um parâmetro binário\n" +#: fe-connect.c:6500 +#, c-format +msgid "invalid URI propagated to internal parser routine: \"%s\"" +msgstr "URI inválido propagado para a rotina do analisador interno: \"%s\"" -#: fe-exec.c:1770 +#: fe-connect.c:6577 #, c-format -msgid "unexpected asyncStatus: %d\n" -msgstr "asyncStatus inesperado: %d\n" +msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"" +msgstr "alcançado o fim da cadeia de caracteres ao procurar pelo \"]\" correspondente no endereço de hospedeiro IPv6 no URI: \"%s\"" -#: fe-exec.c:1790 +#: fe-connect.c:6584 #, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "PGEventProc \"%s\" falhou durante evento PGEVT_RESULTCREATE\n" +msgid "IPv6 host address may not be empty in URI: \"%s\"" +msgstr "o endereço de hospedeiro IPv6 não pode estar vazio no URI: \"%s\"" -#: fe-exec.c:1950 -msgid "COPY terminated by new PQexec" -msgstr "COPY terminado por novo PQexec" +#: fe-connect.c:6599 +#, c-format +msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"" +msgstr "caractere não esperado \"%c\" na posição %d no URI (esperado \":\" ou \"/\"): \"%s\"" -#: fe-exec.c:1958 -msgid "COPY IN state must be terminated first\n" -msgstr "estado de COPY IN deve ser terminado primeiro\n" +#: fe-connect.c:6728 +#, c-format +msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "separador extra de chave/valor \"=\" no parâmetro de consulta URI: \"%s\"" -#: fe-exec.c:1978 -msgid "COPY OUT state must be terminated first\n" -msgstr "estado de COPY OUT deve ser terminado primeiro\n" +#: fe-connect.c:6748 +#, c-format +msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "falta o separador \"=\" de chave/valor no parâmetro da consulta URI: \"%s\"" -#: fe-exec.c:1986 -msgid "PQexec not allowed during COPY BOTH\n" -msgstr "PQexec não é permitido durante COPY BOTH\n" +#: fe-connect.c:6800 +#, c-format +msgid "invalid URI query parameter: \"%s\"" +msgstr "parâmetro da consulta de URI inválido: \"%s\"" -#: fe-exec.c:2229 fe-exec.c:2296 fe-exec.c:2386 fe-protocol2.c:1352 -#: fe-protocol3.c:1817 -msgid "no COPY in progress\n" -msgstr "nenhum COPY está em execução\n" +#: fe-connect.c:6874 +#, c-format +msgid "invalid percent-encoded token: \"%s\"" +msgstr "elemento codificado por porcentagem inválido: \"%s\"" -#: fe-exec.c:2576 -msgid "connection in wrong state\n" -msgstr "conexão em estado errado\n" +#: fe-connect.c:6884 +#, c-format +msgid "forbidden value %%00 in percent-encoded value: \"%s\"" +msgstr "valor %%00 proibido em valor codificado com porcentagem: \"%s\"" -#: fe-exec.c:2607 -msgid "invalid ExecStatusType code" -msgstr "código de ExecStatusType é inválido" +#: fe-connect.c:7248 +msgid "connection pointer is NULL\n" +msgstr "o ponteiro da conexão é nulo\n" -#: fe-exec.c:2634 -msgid "PGresult is not an error result\n" -msgstr "PGresult não é um resultado de erro\n" +#: fe-connect.c:7256 fe-exec.c:710 fe-exec.c:970 fe-exec.c:3319 +#: fe-protocol3.c:969 fe-protocol3.c:1002 +msgid "out of memory\n" +msgstr "sem memória\n" -#: fe-exec.c:2709 fe-exec.c:2732 +#: fe-connect.c:7547 #, c-format -msgid "column number %d is out of range 0..%d" -msgstr "coluna número %d está fora do intervalo 0..%d" +msgid "WARNING: password file \"%s\" is not a plain file\n" +msgstr "ADVERTÊNCIA: o arquivo de senhas \"%s\" não é um arquivo de texto puro\n" -#: fe-exec.c:2725 +#: fe-connect.c:7556 +#, c-format +msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" +msgstr "ADVERTÊNCIA: o arquivo de senhas \"%s\" possui acesso para grupo ou para todos; as permissões devem ser u=rw (0600) ou menor\n" + +#: fe-connect.c:7663 +#, c-format +msgid "password retrieved from file \"%s\"" +msgstr "senha recuperada do arquivo \"%s\"" + +#: fe-exec.c:466 fe-exec.c:3393 #, c-format msgid "row number %d is out of range 0..%d" -msgstr "linha número %d está fora do intervalo 0..%d" +msgstr "o número da linha %d está fora do intervalo 0..%d" -#: fe-exec.c:2747 +#: fe-exec.c:528 fe-protocol3.c:1971 #, c-format -msgid "parameter number %d is out of range 0..%d" -msgstr "parâmetro número %d está fora do intervalo 0..%d" +msgid "%s" +msgstr "%s" -#: fe-exec.c:3057 +#: fe-exec.c:831 #, c-format -msgid "could not interpret result from server: %s" -msgstr "não pôde interpretar resultado do servidor: %s" +msgid "write to server failed" +msgstr "a escrita no servidor falhou" -#: fe-exec.c:3296 fe-exec.c:3380 -msgid "incomplete multibyte character\n" -msgstr "caracter multibyte incompleto\n" +#: fe-exec.c:869 +#, c-format +msgid "no error text available" +msgstr "nenhum texto de erro disponível" -#: fe-lobj.c:155 -msgid "cannot determine OID of function lo_truncate\n" -msgstr "não pode determinar OID da função lo_truncate\n" +#: fe-exec.c:958 +msgid "NOTICE" +msgstr "AVISO" -#: fe-lobj.c:171 -msgid "argument of lo_truncate exceeds integer range\n" -msgstr "argumento do lo_truncate excede intervalo de inteiros\n" +#: fe-exec.c:1016 +msgid "PGresult cannot support more than INT_MAX tuples" +msgstr "PGresult não dá suporte a mais do que INT_MAX tuplas" -#: fe-lobj.c:222 -msgid "cannot determine OID of function lo_truncate64\n" -msgstr "não pode determinar OID da função lo_truncate64\n" +#: fe-exec.c:1028 +msgid "size_t overflow" +msgstr "size_t acima do permitido" -#: fe-lobj.c:280 -msgid "argument of lo_read exceeds integer range\n" -msgstr "argumento do lo_read excede intervalo de inteiros\n" +#: fe-exec.c:1444 fe-exec.c:1513 fe-exec.c:1559 +#, c-format +msgid "command string is a null pointer" +msgstr "a cadeia de caracteres de comando é um ponteiro nulo" -#: fe-lobj.c:335 -msgid "argument of lo_write exceeds integer range\n" -msgstr "argumento de lo_write excede intervalo de inteiros\n" +#: fe-exec.c:1450 fe-exec.c:2881 +#, c-format +msgid "%s not allowed in pipeline mode" +msgstr "%s não permitido no modo pipeline" -#: fe-lobj.c:426 -msgid "cannot determine OID of function lo_lseek64\n" -msgstr "não pode determinar OID da função lo_lseek64\n" +#: fe-exec.c:1518 fe-exec.c:1564 fe-exec.c:1658 +#, c-format +msgid "number of parameters must be between 0 and %d" +msgstr "o número de parâmetros deve estar entre 0 e %d" -#: fe-lobj.c:522 -msgid "cannot determine OID of function lo_create\n" -msgstr "não pode determinar OID da função lo_create\n" +#: fe-exec.c:1554 fe-exec.c:1653 +#, c-format +msgid "statement name is a null pointer" +msgstr "o nome da instrução é um ponteiro nulo" -#: fe-lobj.c:601 -msgid "cannot determine OID of function lo_tell64\n" -msgstr "não pode determinar OID da função lo_tell64\n" +#: fe-exec.c:1695 fe-exec.c:3239 +#, c-format +msgid "no connection to the server" +msgstr "sem conexão com o servidor" -#: fe-lobj.c:707 fe-lobj.c:816 +#: fe-exec.c:1703 fe-exec.c:3247 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "não pôde abrir arquivo \"%s\": %s\n" +msgid "another command is already in progress" +msgstr "outro comando já está em andamento" -#: fe-lobj.c:762 +#: fe-exec.c:1733 #, c-format -msgid "could not read from file \"%s\": %s\n" -msgstr "não pôde ler do arquivo \"%s\": %s\n" +msgid "cannot queue commands during COPY" +msgstr "não é possível enfileirar comandos durante o COPY" -#: fe-lobj.c:836 fe-lobj.c:860 +#: fe-exec.c:1850 #, c-format -msgid "could not write to file \"%s\": %s\n" -msgstr "não pôde escrever no arquivo \"%s\": %s\n" +msgid "length must be given for binary parameter" +msgstr "deve ser fornecido o comprimento para parâmetro binário" -#: fe-lobj.c:947 -msgid "query to initialize large object functions did not return data\n" -msgstr "consulta para inicializar funções de objeto grande não retornou dados\n" +#: fe-exec.c:2164 +#, c-format +msgid "unexpected asyncStatus: %d" +msgstr "asyncStatus não esperado: %d" -#: fe-lobj.c:996 -msgid "cannot determine OID of function lo_open\n" -msgstr "não pode determinar OID da função lo_open\n" +#: fe-exec.c:2320 +#, c-format +msgid "synchronous command execution functions are not allowed in pipeline mode" +msgstr "as funções de execução de comando síncrono não são permitidas no modo pipeline" -#: fe-lobj.c:1003 -msgid "cannot determine OID of function lo_close\n" -msgstr "não pode determinar OID da função lo_close\n" +#: fe-exec.c:2337 +msgid "COPY terminated by new PQexec" +msgstr "COPY terminado por novo PQexec" -#: fe-lobj.c:1010 -msgid "cannot determine OID of function lo_creat\n" -msgstr "não pode determinar OID da função lo_creat\n" +#: fe-exec.c:2353 +#, c-format +msgid "PQexec not allowed during COPY BOTH" +msgstr "PQexec não é permitido durante COPY BOTH" -#: fe-lobj.c:1017 -msgid "cannot determine OID of function lo_unlink\n" -msgstr "não pode determinar OID da função lo_unlink\n" +#: fe-exec.c:2579 fe-exec.c:2634 fe-exec.c:2702 fe-protocol3.c:1902 +#, c-format +msgid "no COPY in progress" +msgstr "nenhuma COPY em andamento" -#: fe-lobj.c:1024 -msgid "cannot determine OID of function lo_lseek\n" -msgstr "não pode determinar OID da função lo_lseek\n" +#: fe-exec.c:2888 +#, c-format +msgid "connection in wrong state" +msgstr "conexão em estado errado" -#: fe-lobj.c:1031 -msgid "cannot determine OID of function lo_tell\n" -msgstr "não pode determinar OID da função lo_tell\n" +#: fe-exec.c:2931 +#, c-format +msgid "cannot enter pipeline mode, connection not idle" +msgstr "não é possível entrar no modo pipeline, a conexão não está ociosa" -#: fe-lobj.c:1038 -msgid "cannot determine OID of function loread\n" -msgstr "não pode determinar OID da função loread\n" +#: fe-exec.c:2967 fe-exec.c:2988 +#, c-format +msgid "cannot exit pipeline mode with uncollected results" +msgstr "não é possível sair do modo pipeline com resultados não coletados" -#: fe-lobj.c:1045 -msgid "cannot determine OID of function lowrite\n" -msgstr "não pode determinar OID da função lowrite\n" +#: fe-exec.c:2971 +#, c-format +msgid "cannot exit pipeline mode while busy" +msgstr "não é possível sair do modo pipeline enquanto estiver ocupado" -#: fe-misc.c:295 +#: fe-exec.c:2982 #, c-format -msgid "integer of size %lu not supported by pqGetInt" -msgstr "inteiro de tamanho %lu não é suportado por pqGetInt" +msgid "cannot exit pipeline mode while in COPY" +msgstr "não é possível sair do modo pipeline enquanto estiver em COPY" -#: fe-misc.c:331 +#: fe-exec.c:3173 #, c-format -msgid "integer of size %lu not supported by pqPutInt" -msgstr "inteiro de tamanho %lu não é suportado por pqPutInt" +msgid "cannot send pipeline when not in pipeline mode" +msgstr "não é possível enviar pipeline quando não se está no modo pipeline" -#: fe-misc.c:642 fe-misc.c:843 -msgid "connection not open\n" -msgstr "conexão não está aberta\n" +#: fe-exec.c:3282 +msgid "invalid ExecStatusType code" +msgstr "código de ExecStatusType inválido" -#: fe-misc.c:812 fe-secure-openssl.c:271 fe-secure-openssl.c:380 -#: fe-secure.c:253 fe-secure.c:362 -msgid "" -"server closed the connection unexpectedly\n" -"\tThis probably means the server terminated abnormally\n" -"\tbefore or while processing the request.\n" -msgstr "" -"servidor fechou a conexão inesperadamente\n" -"\tIsto provavelmente significa que o servidor terminou de forma anormal\n" -"\tantes ou durante o processamento do pedido.\n" +#: fe-exec.c:3309 +msgid "PGresult is not an error result\n" +msgstr "PGresult não é um resultado de erro\n" + +#: fe-exec.c:3377 fe-exec.c:3400 +#, c-format +msgid "column number %d is out of range 0..%d" +msgstr "a coluna número %d está fora do intervalo 0..%d" -#: fe-misc.c:1016 -msgid "timeout expired\n" -msgstr "tempo de espera expirado\n" +#: fe-exec.c:3415 +#, c-format +msgid "parameter number %d is out of range 0..%d" +msgstr "o parâmetro número %d está fora do intervalo 0..%d" -#: fe-misc.c:1061 -msgid "invalid socket\n" -msgstr "soquete inválido\n" +#: fe-exec.c:3726 +#, c-format +msgid "could not interpret result from server: %s" +msgstr "não foi possível interpretar o resultado do servidor: %s" -#: fe-misc.c:1084 +#: fe-exec.c:3991 fe-exec.c:4081 #, c-format -msgid "select() failed: %s\n" -msgstr "select() falhou: %s\n" +msgid "incomplete multibyte character" +msgstr "caractere multibyte incompleto" + +#: fe-gssapi-common.c:122 +msgid "GSSAPI name import error" +msgstr "erro de importação de nome GSSAPI" -#: fe-protocol2.c:91 +#: fe-lobj.c:144 fe-lobj.c:207 fe-lobj.c:397 fe-lobj.c:487 fe-lobj.c:560 +#: fe-lobj.c:956 fe-lobj.c:963 fe-lobj.c:970 fe-lobj.c:977 fe-lobj.c:984 +#: fe-lobj.c:991 fe-lobj.c:998 fe-lobj.c:1005 #, c-format -msgid "invalid setenv state %c, probably indicative of memory corruption\n" -msgstr "estado de setenv %c é inválido, provavelmente indicativo de corrupção de memória\n" +msgid "cannot determine OID of function %s" +msgstr "não foi possível determinar o OID da função %s" -#: fe-protocol2.c:390 +#: fe-lobj.c:160 #, c-format -msgid "invalid state %c, probably indicative of memory corruption\n" -msgstr "estado %c é inválido, provavelmente indicativo de corrupção de memória\n" +msgid "argument of lo_truncate exceeds integer range" +msgstr "o argumento de lo_truncate excede o intervalo inteiro" -#: fe-protocol2.c:479 fe-protocol3.c:186 +#: fe-lobj.c:262 #, c-format -msgid "message type 0x%02x arrived from server while idle" -msgstr "tipo de mensagem 0x%02x chegou do servidor enquanto estava ocioso" +msgid "argument of lo_read exceeds integer range" +msgstr "o argumento de lo_read excede o intervalo de inteiros" -#: fe-protocol2.c:503 fe-protocol2.c:538 fe-protocol2.c:1049 -#: fe-protocol3.c:209 fe-protocol3.c:236 fe-protocol3.c:253 fe-protocol3.c:333 -#: fe-protocol3.c:728 fe-protocol3.c:951 -msgid "out of memory" -msgstr "sem memória" +#: fe-lobj.c:313 +#, c-format +msgid "argument of lo_write exceeds integer range" +msgstr "o argumento de lo_write excede o intervalo de inteiros" -#: fe-protocol2.c:529 +#: fe-lobj.c:669 fe-lobj.c:780 #, c-format -msgid "unexpected character %c following empty query response (\"I\" message)" -msgstr "caracter inesperado %c seguido de uma resposta de consulta vazia (mensagem \"I\")" +msgid "could not open file \"%s\": %s" +msgstr "não foi possível abrir o arquivo \"%s\": %s" -#: fe-protocol2.c:595 +#: fe-lobj.c:725 #, c-format -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" -msgstr "servidor enviou dados (mensagem \"D\") sem antes enviar descrição de registro (mensagem \"T\")" +msgid "could not read from file \"%s\": %s" +msgstr "não foi possível ler do arquivo \"%s\": %s" -#: fe-protocol2.c:613 +#: fe-lobj.c:801 fe-lobj.c:824 #, c-format -msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" -msgstr "servidor enviou dados binários (mensagem \"B\") sem antes enviar descrição de registro (mensagem \"T\")" +msgid "could not write to file \"%s\": %s" +msgstr "não foi possível escrever no arquivo \"%s\": %s" -#: fe-protocol2.c:633 fe-protocol3.c:412 +#: fe-lobj.c:908 #, c-format -msgid "unexpected response from server; first received character was \"%c\"\n" -msgstr "resposta inesperada do servidor; primeiro caracter recebido foi \"%c\"\n" +msgid "query to initialize large object functions did not return data" +msgstr "a consulta para inicializar funções de objetos grandes não retornou dados" -#: fe-protocol2.c:762 fe-protocol2.c:937 fe-protocol3.c:627 fe-protocol3.c:854 -msgid "out of memory for query result" -msgstr "sem memória para resultado da consulta" +#: fe-misc.c:240 +#, c-format +msgid "integer of size %lu not supported by pqGetInt" +msgstr "número inteiro de tamanho %lu não tem suporte por pqGetInt" -#: fe-protocol2.c:1395 fe-protocol3.c:1886 +#: fe-misc.c:273 #, c-format -msgid "%s" -msgstr "%s" +msgid "integer of size %lu not supported by pqPutInt" +msgstr "número inteiro de tamanho %lu não tem suporte por pqPutInt" -#: fe-protocol2.c:1407 +#: fe-misc.c:573 #, c-format -msgid "lost synchronization with server, resetting connection" -msgstr "perda de sincronismo com o servidor, reiniciando conexão" +msgid "connection not open" +msgstr "a conexão não está aberta" -#: fe-protocol2.c:1541 fe-protocol2.c:1573 fe-protocol3.c:2089 +#: fe-misc.c:751 fe-secure-openssl.c:215 fe-secure-openssl.c:321 +#: fe-secure.c:259 fe-secure.c:426 #, c-format -msgid "protocol error: id=0x%x\n" -msgstr "erro de protocolo: id=0x%x\n" +msgid "" +"server closed the connection unexpectedly\n" +"\tThis probably means the server terminated abnormally\n" +"\tbefore or while processing the request." +msgstr "" +"o servidor fechou a conexão de forma não esperada\n" +"\tIsso provavelmente significa que o servidor\tfoi encerrado de forma não normal antes ou\n" +"\tdurante o processamento da solicitação." + +#: fe-misc.c:818 +msgid "connection not open\n" +msgstr "a conexão não está aberta\n" -#: fe-protocol3.c:368 -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" -msgstr "servidor enviou dados (mensagem \"D\") sem antes enviar descrição de registro (mensagem \"T\")\n" +#: fe-misc.c:1003 +#, c-format +msgid "timeout expired" +msgstr "o tempo limite expirou" -#: fe-protocol3.c:433 +#: fe-misc.c:1047 #, c-format -msgid "message contents do not agree with length in message type \"%c\"\n" -msgstr "conteúdo da mensagem não está de acordo com o tamanho no tipo de mensagem \"%c\"\n" +msgid "invalid socket" +msgstr "soquete inválido" -#: fe-protocol3.c:454 +#: fe-misc.c:1069 #, c-format -msgid "lost synchronization with server: got message type \"%c\", length %d\n" -msgstr "perda de sincronismo com o servidor: recebeu tipo de mensagem \"%c\", tamanho %d\n" +msgid "%s() failed: %s" +msgstr "%s() falhou: %s" -#: fe-protocol3.c:505 fe-protocol3.c:545 +#: fe-protocol3.c:182 +#, c-format +msgid "message type 0x%02x arrived from server while idle" +msgstr "tipo de mensagem 0x%02x chegou do servidor enquanto estava ocioso" + +#: fe-protocol3.c:380 +#, c-format +msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" +msgstr "servidor enviou dados (mensagem \"D\") sem descrição de linha anterior (mensagem \"T\")" + +#: fe-protocol3.c:422 +#, c-format +msgid "unexpected response from server; first received character was \"%c\"" +msgstr "resposta não esperada do servidor; o primeiro caractere recebido foi \"%c\"" + +#: fe-protocol3.c:445 +#, c-format +msgid "message contents do not agree with length in message type \"%c\"" +msgstr "o conteúdo da mensagem não corresponde ao comprimento no tipo de mensagem \"%c\"" + +#: fe-protocol3.c:463 +#, c-format +msgid "lost synchronization with server: got message type \"%c\", length %d" +msgstr "sincronização com o servidor perdida: recebida mensagem do tipo \"%c\", comprimento %d" + +#: fe-protocol3.c:515 fe-protocol3.c:555 msgid "insufficient data in \"T\" message" msgstr "dados insuficientes na mensagem \"T\"" -#: fe-protocol3.c:578 -msgid "extraneous data in \"T\" message" -msgstr "dados estranhos na mensagem \"T\"" +#: fe-protocol3.c:626 fe-protocol3.c:832 +msgid "out of memory for query result" +msgstr "sem memória para os resultado da consulta" -#: fe-protocol3.c:691 -msgid "extraneous data in \"t\" message" -msgstr "dados estranhos na mensagem \"t\"" +#: fe-protocol3.c:695 +msgid "insufficient data in \"t\" message" +msgstr "dados insuficientes na mensagem \"t\"" -#: fe-protocol3.c:762 fe-protocol3.c:794 fe-protocol3.c:812 +#: fe-protocol3.c:754 fe-protocol3.c:786 fe-protocol3.c:804 msgid "insufficient data in \"D\" message" msgstr "dados insuficientes na mensagem \"D\"" -#: fe-protocol3.c:768 +#: fe-protocol3.c:760 msgid "unexpected field count in \"D\" message" -msgstr "contagem de campos inesperada em mensagem \"D\"" - -#: fe-protocol3.c:821 -msgid "extraneous data in \"D\" message" -msgstr "dados estranhos na mensagem \"D\"" +msgstr "contagem de campos não esperada na mensagem \"D\"" -#: fe-protocol3.c:1005 +#: fe-protocol3.c:1015 msgid "no error message available\n" msgstr "nenhuma mensagem de erro disponível\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1035 fe-protocol3.c:1054 +#: fe-protocol3.c:1063 fe-protocol3.c:1082 #, c-format msgid " at character %s" -msgstr " no caracter %s" +msgstr " no caractere %s" -#: fe-protocol3.c:1067 +#: fe-protocol3.c:1095 #, c-format msgid "DETAIL: %s\n" msgstr "DETALHE: %s\n" -#: fe-protocol3.c:1070 +#: fe-protocol3.c:1098 #, c-format msgid "HINT: %s\n" msgstr "DICA: %s\n" -#: fe-protocol3.c:1073 +#: fe-protocol3.c:1101 #, c-format msgid "QUERY: %s\n" msgstr "CONSULTA: %s\n" -#: fe-protocol3.c:1080 +#: fe-protocol3.c:1108 #, c-format msgid "CONTEXT: %s\n" msgstr "CONTEXTO: %s\n" -#: fe-protocol3.c:1089 +#: fe-protocol3.c:1117 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "NOME DO ESQUEMA: %s\n" -#: fe-protocol3.c:1093 +#: fe-protocol3.c:1121 #, c-format msgid "TABLE NAME: %s\n" msgstr "NOME DA TABELA: %s\n" -#: fe-protocol3.c:1097 +#: fe-protocol3.c:1125 #, c-format msgid "COLUMN NAME: %s\n" msgstr "NOME DA COLUNA: %s\n" -#: fe-protocol3.c:1101 +#: fe-protocol3.c:1129 #, c-format msgid "DATATYPE NAME: %s\n" -msgstr "NOME DO TIPO DE DADO: %s\n" +msgstr "NOME DO TIPO DE DADOS: %s\n" -#: fe-protocol3.c:1105 +#: fe-protocol3.c:1133 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "NOME DA RESTRIÇÃO: %s\n" -#: fe-protocol3.c:1117 +#: fe-protocol3.c:1145 msgid "LOCATION: " -msgstr "LOCAL: " +msgstr "LOCALIZAÇÃO: " -#: fe-protocol3.c:1119 +#: fe-protocol3.c:1147 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1121 +#: fe-protocol3.c:1149 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1316 +#: fe-protocol3.c:1344 #, c-format msgid "LINE %d: " msgstr "LINHA %d: " -#: fe-protocol3.c:1711 -msgid "PQgetline: not doing text COPY OUT\n" -msgstr "PQgetline: não está fazendo COPY OUT de texto\n" +#: fe-protocol3.c:1418 +#, c-format +msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u" +msgstr "versão do protocolo sem suporte pelo servidor: o cliente usa %u.%u, o servidor oferece suporte até %u.%u" + +#: fe-protocol3.c:1424 +#, c-format +msgid "protocol extension not supported by server: %s" +msgid_plural "protocol extensions not supported by server: %s" +msgstr[0] "extensão do protocolo sem suporte pelo servidor: %s" +msgstr[1] "extensões do protocolo sem suporte pelo servidor: %s" + +#: fe-protocol3.c:1432 +#, c-format +msgid "invalid %s message" +msgstr "mensagem %s inválida" + +#: fe-protocol3.c:1797 +#, c-format +msgid "PQgetline: not doing text COPY OUT" +msgstr "Qgetline: não está realizando COPY OUT no formato de texto" + +#: fe-protocol3.c:2171 +#, c-format +msgid "protocol error: no function result" +msgstr "erro de protocolo: nenhum resultado de função" + +#: fe-protocol3.c:2182 +#, c-format +msgid "protocol error: id=0x%x" +msgstr "erro de protocolo: id=0x%x" -#: fe-secure-openssl.c:146 fe-secure-openssl.c:1031 fe-secure-openssl.c:1251 +#: fe-secure-common.c:123 #, c-format -msgid "could not acquire mutex: %s\n" -msgstr "não pôde obter mutex: %s\n" +msgid "SSL certificate's name contains embedded null" +msgstr "o nome do certificado SSL contém nulo incorporado" -#: fe-secure-openssl.c:158 +#: fe-secure-common.c:228 #, c-format -msgid "could not establish SSL connection: %s\n" -msgstr "não pôde estabelecer conexão SSL: %s\n" +msgid "certificate contains IP address with invalid length %zu" +msgstr "o certificado contém endereço IP com comprimento inválido %zu" -#: fe-secure-openssl.c:276 fe-secure-openssl.c:385 fe-secure-openssl.c:1377 +#: fe-secure-common.c:237 #, c-format -msgid "SSL SYSCALL error: %s\n" -msgstr "Erro de SYSCALL SSL: %s\n" +msgid "could not convert certificate's IP address to string: %s" +msgstr "não foi possível converter o endereço IP do certificado em cadeia de caracteres: %s" -#: fe-secure-openssl.c:283 fe-secure-openssl.c:392 fe-secure-openssl.c:1381 -msgid "SSL SYSCALL error: EOF detected\n" -msgstr "Erro de SYSCALL SSL: EOF detectado\n" +#: fe-secure-common.c:269 +#, c-format +msgid "host name must be specified for a verified SSL connection" +msgstr "deve ser especificado o nome do hospedeiro para uma conexão SSL verificada" -#: fe-secure-openssl.c:294 fe-secure-openssl.c:403 fe-secure-openssl.c:1390 +#: fe-secure-common.c:286 #, c-format -msgid "SSL error: %s\n" -msgstr "Erro de SSL: %s\n" +msgid "server certificate for \"%s\" (and %d other name) does not match host name \"%s\"" +msgid_plural "server certificate for \"%s\" (and %d other names) does not match host name \"%s\"" +msgstr[0] "o certificado do servidor para \"%s\" (e %d outro nome) não corresponde ao nome do hospedeiro \"%s\"" +msgstr[1] "o certificado do servidor para \"%s\" (e %d outros nomes) não corresponde ao nome do hospedeiro \"%s\"" -#: fe-secure-openssl.c:309 fe-secure-openssl.c:418 -msgid "SSL connection has been closed unexpectedly\n" -msgstr "conexão SSL foi fechada inesperadamente\n" +#: fe-secure-common.c:294 +#, c-format +msgid "server certificate for \"%s\" does not match host name \"%s\"" +msgstr "o certificado do servidor para \"%s\" não corresponde ao nome do hospedeiro \"%s\"" -#: fe-secure-openssl.c:315 fe-secure-openssl.c:424 fe-secure-openssl.c:1399 +#: fe-secure-common.c:299 #, c-format -msgid "unrecognized SSL error code: %d\n" -msgstr "código de erro SSL desconhecido: %d\n" +msgid "could not get server's host name from server certificate" +msgstr "não foi possível obter o nome do hospedeiro do servidor do certificado do servidor" -#: fe-secure-openssl.c:536 -msgid "SSL certificate's name entry is missing\n" -msgstr "entrada do nome do certificado SSL está ausente\n" +#: fe-secure-gssapi.c:194 +msgid "GSSAPI wrap error" +msgstr "erro de empacotamento GSSAPI" -#: fe-secure-openssl.c:566 -msgid "SSL certificate's name contains embedded null\n" -msgstr "nome do certificado SSL contém nulo embutido\n" +#: fe-secure-gssapi.c:201 +#, c-format +msgid "outgoing GSSAPI message would not use confidentiality" +msgstr "a mensagem GSSAPI de saída não usa confidencialidade" -#: fe-secure-openssl.c:617 -msgid "host name must be specified for a verified SSL connection\n" -msgstr "nome da máquina deve ser especificado para uma conexão SSL verificada\n" +#: fe-secure-gssapi.c:208 +#, c-format +msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" +msgstr "o cliente tentou enviar um pacote GSSAPI sobredimensionado (%zu > %zu)" -#: fe-secure-openssl.c:717 +#: fe-secure-gssapi.c:347 fe-secure-gssapi.c:589 #, c-format -msgid "server certificate for \"%s\" does not match host name \"%s\"\n" -msgstr "certificado do servidor para \"%s\" não corresponde ao nome da máquina \"%s\"\n" +msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" +msgstr "pacote GSSAPI sobredimensionado enviado pelo servidor (%zu > %zu)" -#: fe-secure-openssl.c:723 -msgid "could not get server's host name from server certificate\n" -msgstr "não pôde obter nome de máquina do servidor a partir do certificado do servidor\n" +#: fe-secure-gssapi.c:386 +msgid "GSSAPI unwrap error" +msgstr "erro de desempacotamento GSSAPI" -#: fe-secure-openssl.c:870 +#: fe-secure-gssapi.c:395 #, c-format -msgid "could not create SSL context: %s\n" -msgstr "não pôde criar contexto SSL: %s\n" +msgid "incoming GSSAPI message did not use confidentiality" +msgstr "a mensagem GSSAPI recebida não usa confidencialidade" -#: fe-secure-openssl.c:1001 +#: fe-secure-gssapi.c:652 +msgid "could not initiate GSSAPI security context" +msgstr "não foi possível iniciar o contexto de segurança GSSAPI" + +#: fe-secure-gssapi.c:681 +msgid "GSSAPI size check error" +msgstr "erro de verificação de tamanho GSSAPI" + +#: fe-secure-gssapi.c:692 +msgid "GSSAPI context establishment error" +msgstr "erro de estabelecimento de contexto GSSAPI" + +#: fe-secure-openssl.c:219 fe-secure-openssl.c:325 fe-secure-openssl.c:1538 #, c-format -msgid "could not open certificate file \"%s\": %s\n" -msgstr "não pôde abrir certificado \"%s\": %s\n" +msgid "SSL SYSCALL error: %s" +msgstr "erro de SYSCALL SSL: %s" -#: fe-secure-openssl.c:1040 fe-secure-openssl.c:1055 +#: fe-secure-openssl.c:225 fe-secure-openssl.c:331 fe-secure-openssl.c:1541 #, c-format -msgid "could not read certificate file \"%s\": %s\n" -msgstr "não pôde ler certificado \"%s\": %s\n" +msgid "SSL SYSCALL error: EOF detected" +msgstr "erro de SYSCALL SSL: EOF detectado" -#: fe-secure-openssl.c:1110 +#: fe-secure-openssl.c:235 fe-secure-openssl.c:341 fe-secure-openssl.c:1549 #, c-format -msgid "could not load SSL engine \"%s\": %s\n" -msgstr "não pôde carregar mecanismo SSL \"%s\": %s\n" +msgid "SSL error: %s" +msgstr "erro de SSL: %s" -#: fe-secure-openssl.c:1122 +#: fe-secure-openssl.c:249 fe-secure-openssl.c:355 #, c-format -msgid "could not initialize SSL engine \"%s\": %s\n" -msgstr "não pôde inicializar mecanismo SSL \"%s\": %s\n" +msgid "SSL connection has been closed unexpectedly" +msgstr "a conexão SSL foi fechada inesperadamente" -#: fe-secure-openssl.c:1138 +#: fe-secure-openssl.c:254 fe-secure-openssl.c:360 fe-secure-openssl.c:1596 #, c-format -msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "não pôde ler chave privada SSL \"%s\" do mecanismo \"%s\": %s\n" +msgid "unrecognized SSL error code: %d" +msgstr "código de erro SSL não reconhecido: %d" -#: fe-secure-openssl.c:1152 +#: fe-secure-openssl.c:403 #, c-format -msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "não pôde carregar chave privada SSL \"%s\" do mecanismo \"%s\": %s\n" +msgid "could not determine server certificate signature algorithm" +msgstr "não foi possível determinar o algoritmo de assinatura do certificado do servidor" -#: fe-secure-openssl.c:1189 +#: fe-secure-openssl.c:423 +#, c-format +msgid "could not find digest for NID %s" +msgstr "não foi possível encontrar o resumo do NID %s" + +#: fe-secure-openssl.c:432 +#, c-format +msgid "could not generate peer certificate hash" +msgstr "não foi possível gerar o hash de certificado do parceiro" + +#: fe-secure-openssl.c:515 +#, c-format +msgid "SSL certificate's name entry is missing" +msgstr "está faltando a entrada do nome do certificado SSL" + +#: fe-secure-openssl.c:549 +#, c-format +msgid "SSL certificate's address entry is missing" +msgstr "está faltando a entrada do endereço do certificado SSL" + +#: fe-secure-openssl.c:966 +#, c-format +msgid "could not create SSL context: %s" +msgstr "não foi possível criar o contexto SSL: %s" + +#: fe-secure-openssl.c:1008 #, c-format -msgid "certificate present, but not private key file \"%s\"\n" -msgstr "certificado presente, mas não a chave privada \"%s\"\n" +msgid "invalid value \"%s\" for minimum SSL protocol version" +msgstr "valor inválido \"%s\" para a versão mínima do protocolo SSL" -#: fe-secure-openssl.c:1197 +#: fe-secure-openssl.c:1018 #, c-format -msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" -msgstr "chave privada \"%s\" tem acesso de leitura para outros ou grupo; permissões devem ser u=rw (0600) ou menos que isso\n" +msgid "could not set minimum SSL protocol version: %s" +msgstr "não foi possível definir a versão mínima do protocolo SSL: %s" -#: fe-secure-openssl.c:1208 +#: fe-secure-openssl.c:1034 #, c-format -msgid "could not load private key file \"%s\": %s\n" -msgstr "não pôde carregar arquivo contendo chave privada \"%s\": %s\n" +msgid "invalid value \"%s\" for maximum SSL protocol version" +msgstr "valor inválido \"%s\" para a versão máxima do protocolo SSL" -#: fe-secure-openssl.c:1222 +#: fe-secure-openssl.c:1044 #, c-format -msgid "certificate does not match private key file \"%s\": %s\n" -msgstr "certificado não corresponde a chave privada \"%s\": %s\n" +msgid "could not set maximum SSL protocol version: %s" +msgstr "não foi possível definir a versão máxima do protocolo SSL: %s" -#: fe-secure-openssl.c:1260 +#: fe-secure-openssl.c:1082 #, c-format -msgid "could not read root certificate file \"%s\": %s\n" -msgstr "não pôde ler certificado raiz \"%s\": %s\n" +msgid "could not load system root certificate paths: %s" +msgstr "não foi possível carregar os caminhos do certificado raiz do sistema: %s" -#: fe-secure-openssl.c:1290 +#: fe-secure-openssl.c:1099 #, c-format -msgid "SSL library does not support CRL certificates (file \"%s\")\n" -msgstr "biblioteca SSL não suporta certificados CRL (arquivo \"%s\")\n" +msgid "could not read root certificate file \"%s\": %s" +msgstr "não foi possível ler o arquivo de certificado raiz \"%s\": %s" -#: fe-secure-openssl.c:1323 +#: fe-secure-openssl.c:1151 +#, c-format msgid "" "could not get home directory to locate root certificate file\n" -"Either provide the file or change sslmode to disable server certificate verification.\n" +"Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." msgstr "" -"não pôde obter diretório base do usuário para localizar arquivo do certificado\n" -"Forneça um arquivo ou mude o sslmode para desabilitar a verificação de certificado do servidor.\n" +"não foi possível obter o diretório inicial para localizar o arquivo de certificado raiz\n" +"Forneça o arquivo, use as raízes confiáveis do sistema com sslrootcert=system,\n" +"ou altere sslmode para desativar a verificação de certificado do servidor." -#: fe-secure-openssl.c:1327 +#: fe-secure-openssl.c:1154 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" -"Either provide the file or change sslmode to disable server certificate verification.\n" +"Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." msgstr "" -"certificado raiz \"%s\" não existe\n" -"Forneça um arquivo ou mude o sslmode para desabilitar a verificação de certificado do servidor.\n" +"o arquivo de certificado raiz \"%s\" não existe\n" +"Forneça o arquivo, use as raízes confiáveis do sistema com sslrootcert=system,\n" +"ou altere sslmode para desativar a verificação de certificado do servidor." + +#: fe-secure-openssl.c:1189 +#, c-format +msgid "could not open certificate file \"%s\": %s" +msgstr "não foi possível abrir o arquivo de certificado \"%s\": %s" + +#: fe-secure-openssl.c:1207 +#, c-format +msgid "could not read certificate file \"%s\": %s" +msgstr "não foi possível ler o arquivo de certificado \"%s\": %s" + +#: fe-secure-openssl.c:1231 +#, c-format +msgid "could not establish SSL connection: %s" +msgstr "não foi possível estabelecer uma conexão SSL: %s" + +#: fe-secure-openssl.c:1263 +#, c-format +msgid "could not set SSL Server Name Indication (SNI): %s" +msgstr "não foi possível definir a Indicação de Nome de Servidor (SNI) SSL: %s" -#: fe-secure-openssl.c:1420 +#: fe-secure-openssl.c:1306 #, c-format -msgid "certificate could not be obtained: %s\n" -msgstr "certificado não pôde ser obtido: %s\n" +msgid "could not load SSL engine \"%s\": %s" +msgstr "não foi possível carregar o mecanismo SSL \"%s\": %s" -#: fe-secure-openssl.c:1512 +#: fe-secure-openssl.c:1317 +#, c-format +msgid "could not initialize SSL engine \"%s\": %s" +msgstr "não foi possível inicializar o mecanismo SSL \"%s\": %s" + +#: fe-secure-openssl.c:1332 +#, c-format +msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" +msgstr "não foi possível ler a chave SSL privada \"%s\" do mecanismo \"%s\": %s" + +#: fe-secure-openssl.c:1345 +#, c-format +msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" +msgstr "não foi possível carregar a chave SSL privada \"%s\" do mecanismo \"%s\": %s" + +#: fe-secure-openssl.c:1382 +#, c-format +msgid "certificate present, but not private key file \"%s\"" +msgstr "certificado presente, mas não o arquivo de chave privada \"%s\"" + +#: fe-secure-openssl.c:1385 +#, c-format +msgid "could not stat private key file \"%s\": %m" +msgstr "não foi possível conferir o status do arquivo de chave privada \"%s\": %m" + +#: fe-secure-openssl.c:1393 +#, c-format +msgid "private key file \"%s\" is not a regular file" +msgstr "o arquivo de chave privada \"%s\" não é um arquivo regular" + +#: fe-secure-openssl.c:1426 +#, c-format +msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root" +msgstr "" +"o arquivo de chave privada \"%s\" tem acesso para grupo ou para todos;\n" +"o arquivo deve ter permissões u=rw (0600) ou inferior se pertencer ao usuário corrente,\n" +"ou permissões u=rw,g=r (0640) ou inferior se pertencer ao usuário root" + +#: fe-secure-openssl.c:1450 +#, c-format +msgid "could not load private key file \"%s\": %s" +msgstr "não foi possível carregar o arquivo de chave privada \"%s\": %s" + +#: fe-secure-openssl.c:1466 +#, c-format +msgid "certificate does not match private key file \"%s\": %s" +msgstr "o certificado não corresponde ao arquivo de chave privada \"%s\": %s" + +#: fe-secure-openssl.c:1535 +#, c-format +msgid "SSL error: certificate verify failed: %s" +msgstr "Erro de SSL: falha na verificação do certificado: %s" + +#: fe-secure-openssl.c:1580 +#, c-format +msgid "This may indicate that the server does not support any SSL protocol version between %s and %s." +msgstr "Isso pode indicar que o servidor não oferece suporte a nenhuma versão do protocolo SSL entre %s e %s." + +#: fe-secure-openssl.c:1613 +#, c-format +msgid "certificate could not be obtained: %s" +msgstr "não foi possível obter o certificado: %s" + +#: fe-secure-openssl.c:1718 #, c-format msgid "no SSL error reported" -msgstr "nenhum erro SSL relatado" +msgstr "nenhum erro de SSL relatado" -#: fe-secure-openssl.c:1521 +#: fe-secure-openssl.c:1727 #, c-format msgid "SSL error code %lu" msgstr "código de erro SSL %lu" -#: fe-secure.c:261 +#: fe-secure-openssl.c:2017 +#, c-format +msgid "WARNING: sslpassword truncated\n" +msgstr "ADVERTÊNCIA: sslpassword truncada\n" + +#: fe-secure.c:270 #, c-format -msgid "could not receive data from server: %s\n" -msgstr "não pôde receber dados do servidor: %s\n" +msgid "could not receive data from server: %s" +msgstr "não foi possível receber dados do servidor: %s" -#: fe-secure.c:369 +#: fe-secure.c:441 #, c-format -msgid "could not send data to server: %s\n" -msgstr "não pôde enviar dados ao servidor: %s\n" +msgid "could not send data to server: %s" +msgstr "não foi possível enviar dados para o servidor: %s" -#: win32.c:317 +#: win32.c:310 #, c-format msgid "unrecognized socket error: 0x%08X/%d" -msgstr "erro desconhecido de soquete: 0x%08X/%d" +msgstr "erro de soquete não reconhecido: 0x%08X/%d" diff --git a/src/interfaces/libpq/po/ru.po b/src/interfaces/libpq/po/ru.po index 6606738fa1839..65fb7a8ed2c97 100644 --- a/src/interfaces/libpq/po/ru.po +++ b/src/interfaces/libpq/po/ru.po @@ -4,675 +4,864 @@ # Serguei A. Mokhov , 2001-2004. # Oleg Bartunov , 2005. # Andrey Sudnik , 2010. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021. +# SPDX-FileCopyrightText: 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Alexander Lakhin # Maxim Yablokov , 2021. msgid "" msgstr "" "Project-Id-Version: libpq (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-02-07 11:21+0300\n" -"PO-Revision-Date: 2021-11-25 12:45+0300\n" +"POT-Creation-Date: 2025-05-03 16:06+0300\n" +"PO-Revision-Date: 2025-05-03 16:34+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: fe-auth-scram.c:213 -msgid "malformed SCRAM message (empty message)\n" -msgstr "неправильное Ñообщение SCRAM (пуÑтое Ñодержимое)\n" +#: ../../port/user.c:43 ../../port/user.c:79 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "найти локального Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ идентификатору (%d) не удалоÑÑŒ: %s" + +#: ../../port/user.c:48 ../../port/user.c:84 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "локальный пользователь Ñ ID %d не ÑущеÑтвует" -#: fe-auth-scram.c:219 -msgid "malformed SCRAM message (length mismatch)\n" -msgstr "неправильное Ñообщение SCRAM (Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð°)\n" +#: fe-auth-scram.c:223 +#, c-format +msgid "malformed SCRAM message (empty message)" +msgstr "неправильное Ñообщение SCRAM (пуÑтое Ñодержимое)" -#: fe-auth-scram.c:263 -msgid "could not verify server signature\n" -msgstr "не удалоÑÑŒ проверить Ñигнатуру Ñервера\n" +#: fe-auth-scram.c:228 +#, c-format +msgid "malformed SCRAM message (length mismatch)" +msgstr "неправильное Ñообщение SCRAM (Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð°)" -#: fe-auth-scram.c:270 -msgid "incorrect server signature\n" -msgstr "Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ñигнатура Ñервера\n" +#: fe-auth-scram.c:272 +#, c-format +msgid "could not verify server signature: %s" +msgstr "не удалоÑÑŒ проверить Ñигнатуру Ñервера: %s" -#: fe-auth-scram.c:279 -msgid "invalid SCRAM exchange state\n" -msgstr "ошибочное ÑоÑтоÑние обмена SCRAM\n" +#: fe-auth-scram.c:278 +#, c-format +msgid "incorrect server signature" +msgstr "Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ñигнатура Ñервера" -#: fe-auth-scram.c:306 +#: fe-auth-scram.c:287 #, c-format -msgid "malformed SCRAM message (attribute \"%c\" expected)\n" -msgstr "неправильное Ñообщение SCRAM (ожидалÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚ \"%c\")\n" +msgid "invalid SCRAM exchange state" +msgstr "ошибочное ÑоÑтоÑние обмена SCRAM" -#: fe-auth-scram.c:315 +#: fe-auth-scram.c:311 #, c-format -msgid "" -"malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" +msgid "malformed SCRAM message (attribute \"%c\" expected)" +msgstr "неправильное Ñообщение SCRAM (ожидалÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚ \"%c\")" + +#: fe-auth-scram.c:320 +#, c-format +msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")" msgstr "" -"неправильное Ñообщение SCRAM (Ð´Ð»Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð° \"%c\" ожидалÑÑ Ñимвол \"=\")\n" - -#: fe-auth-scram.c:356 -msgid "could not generate nonce\n" -msgstr "не удалоÑÑŒ Ñгенерировать разовый код\n" - -#: fe-auth-scram.c:366 fe-auth-scram.c:441 fe-auth-scram.c:595 -#: fe-auth-scram.c:616 fe-auth-scram.c:642 fe-auth-scram.c:657 -#: fe-auth-scram.c:707 fe-auth-scram.c:746 fe-auth.c:290 fe-auth.c:362 -#: fe-auth.c:398 fe-auth.c:615 fe-auth.c:774 fe-auth.c:1132 fe-auth.c:1282 -#: fe-connect.c:911 fe-connect.c:1455 fe-connect.c:1624 fe-connect.c:2976 -#: fe-connect.c:4706 fe-connect.c:4967 fe-connect.c:5086 fe-connect.c:5338 -#: fe-connect.c:5419 fe-connect.c:5518 fe-connect.c:5774 fe-connect.c:5803 -#: fe-connect.c:5875 fe-connect.c:5899 fe-connect.c:5917 fe-connect.c:6018 -#: fe-connect.c:6027 fe-connect.c:6385 fe-connect.c:6535 fe-connect.c:6801 -#: fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3043 fe-exec.c:3226 -#: fe-exec.c:3999 fe-exec.c:4164 fe-gssapi-common.c:111 fe-lobj.c:881 -#: fe-protocol3.c:975 fe-protocol3.c:990 fe-protocol3.c:1023 -#: fe-protocol3.c:1731 fe-secure-common.c:110 fe-secure-gssapi.c:504 -#: fe-secure-openssl.c:440 fe-secure-openssl.c:1133 -msgid "out of memory\n" -msgstr "нехватка памÑти\n" +"неправильное Ñообщение SCRAM (Ð´Ð»Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð° \"%c\" ожидалÑÑ Ñимвол \"=\")" + +#: fe-auth-scram.c:360 +#, c-format +msgid "could not generate nonce" +msgstr "не удалоÑÑŒ Ñгенерировать разовый код" + +#: fe-auth-scram.c:369 fe-auth-scram.c:442 fe-auth-scram.c:594 +#: fe-auth-scram.c:614 fe-auth-scram.c:638 fe-auth-scram.c:652 +#: fe-auth-scram.c:698 fe-auth-scram.c:734 fe-auth-scram.c:908 fe-auth.c:296 +#: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:727 fe-auth.c:1200 +#: fe-auth.c:1363 fe-cancel.c:159 fe-connect.c:936 fe-connect.c:976 +#: fe-connect.c:1860 fe-connect.c:2022 fe-connect.c:3430 fe-connect.c:4761 +#: fe-connect.c:5073 fe-connect.c:5328 fe-connect.c:5446 fe-connect.c:5693 +#: fe-connect.c:5773 fe-connect.c:5871 fe-connect.c:6122 fe-connect.c:6149 +#: fe-connect.c:6225 fe-connect.c:6248 fe-connect.c:6272 fe-connect.c:6307 +#: fe-connect.c:6393 fe-connect.c:6401 fe-connect.c:6758 fe-connect.c:6908 +#: fe-exec.c:530 fe-exec.c:1315 fe-exec.c:3254 fe-exec.c:4291 fe-exec.c:4457 +#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:209 fe-protocol3.c:232 +#: fe-protocol3.c:255 fe-protocol3.c:272 fe-protocol3.c:293 fe-protocol3.c:369 +#: fe-protocol3.c:737 fe-protocol3.c:976 fe-protocol3.c:1787 +#: fe-protocol3.c:2187 fe-secure-common.c:110 fe-secure-gssapi.c:496 +#: fe-secure-openssl.c:427 fe-secure-openssl.c:1277 +#, c-format +msgid "out of memory" +msgstr "нехватка памÑти" -#: fe-auth-scram.c:374 -msgid "could not encode nonce\n" -msgstr "не удалоÑÑŒ оформить разовый код\n" +#: fe-auth-scram.c:376 +#, c-format +msgid "could not encode nonce" +msgstr "не удалоÑÑŒ оформить разовый код" -#: fe-auth-scram.c:563 -msgid "could not calculate client proof\n" -msgstr "не удалоÑÑŒ вычиÑлить подтверждение клиента\n" +#: fe-auth-scram.c:564 +#, c-format +msgid "could not calculate client proof: %s" +msgstr "не удалоÑÑŒ вычиÑлить подтверждение клиента: %s" #: fe-auth-scram.c:579 -msgid "could not encode client proof\n" -msgstr "не удалоÑÑŒ закодировать подтверждение клиента\n" +#, c-format +msgid "could not encode client proof" +msgstr "не удалоÑÑŒ закодировать подтверждение клиента" -#: fe-auth-scram.c:634 -msgid "invalid SCRAM response (nonce mismatch)\n" -msgstr "неверный ответ SCRAM (неÑовпадение проверочного кода)\n" +#: fe-auth-scram.c:631 +#, c-format +msgid "invalid SCRAM response (nonce mismatch)" +msgstr "неверный ответ SCRAM (неÑовпадение разового кода)" -#: fe-auth-scram.c:667 -msgid "malformed SCRAM message (invalid salt)\n" -msgstr "неправильное Ñообщение SCRAM (Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ñоль)\n" +#: fe-auth-scram.c:661 +#, c-format +msgid "malformed SCRAM message (invalid salt)" +msgstr "неправильное Ñообщение SCRAM (Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ñоль)" -#: fe-auth-scram.c:681 -msgid "malformed SCRAM message (invalid iteration count)\n" -msgstr "неправильное Ñообщение SCRAM (некорректное чиÑло итераций)\n" +#: fe-auth-scram.c:674 +#, c-format +msgid "malformed SCRAM message (invalid iteration count)" +msgstr "неправильное Ñообщение SCRAM (некорректное чиÑло итераций)" -#: fe-auth-scram.c:687 -msgid "malformed SCRAM message (garbage at end of server-first-message)\n" -msgstr "" -"неправильное Ñообщение SCRAM (муÑор в конце первого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñервера)\n" +#: fe-auth-scram.c:679 +#, c-format +msgid "malformed SCRAM message (garbage at end of server-first-message)" +msgstr "неправильное Ñообщение SCRAM (муÑор в конце первого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñервера)" -#: fe-auth-scram.c:723 +#: fe-auth-scram.c:713 #, c-format -msgid "error received from server in SCRAM exchange: %s\n" -msgstr "в ходе обмена SCRAM от Ñервера получена ошибка: %s\n" +msgid "error received from server in SCRAM exchange: %s" +msgstr "в ходе обмена SCRAM от Ñервера получена ошибка: %s" -#: fe-auth-scram.c:739 -msgid "malformed SCRAM message (garbage at end of server-final-message)\n" +#: fe-auth-scram.c:728 +#, c-format +msgid "malformed SCRAM message (garbage at end of server-final-message)" msgstr "" -"неправильное Ñообщение SCRAM (муÑор в конце поÑледнего ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñервера)\n" +"неправильное Ñообщение SCRAM (муÑор в конце поÑледнего ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñервера)" + +#: fe-auth-scram.c:745 +#, c-format +msgid "malformed SCRAM message (invalid server signature)" +msgstr "неправильное Ñообщение SCRAM (Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñигнатура Ñервера)" -#: fe-auth-scram.c:758 -msgid "malformed SCRAM message (invalid server signature)\n" -msgstr "неправильное Ñообщение SCRAM (Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñигнатура Ñервера)\n" +#: fe-auth-scram.c:917 +msgid "could not generate random salt" +msgstr "не удалоÑÑŒ Ñгенерировать Ñлучайную Ñоль" -#: fe-auth.c:76 +#: fe-auth.c:77 #, c-format -msgid "out of memory allocating GSSAPI buffer (%d)\n" -msgstr "недоÑтаточно памÑти Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð° GSSAPI (%d)\n" +msgid "out of memory allocating GSSAPI buffer (%d)" +msgstr "недоÑтаточно памÑти Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð° GSSAPI (%d)" -#: fe-auth.c:131 +#: fe-auth.c:138 msgid "GSSAPI continuation error" msgstr "ошибка Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð² GSSAPI" -#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:98 -msgid "host name must be specified\n" -msgstr "требуетÑÑ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ Ð¸Ð¼Ñ Ñервера\n" +#: fe-auth.c:168 fe-auth.c:397 fe-gssapi-common.c:97 fe-secure-common.c:99 +#: fe-secure-common.c:173 +#, c-format +msgid "host name must be specified" +msgstr "требуетÑÑ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ Ð¸Ð¼Ñ Ñервера" -#: fe-auth.c:165 -msgid "duplicate GSS authentication request\n" -msgstr "повторный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ GSS\n" +#: fe-auth.c:174 +#, c-format +msgid "duplicate GSS authentication request" +msgstr "повторный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ GSS" -#: fe-auth.c:230 +#: fe-auth.c:238 #, c-format -msgid "out of memory allocating SSPI buffer (%d)\n" -msgstr "недоÑтаточно памÑти Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð° SSPI (%d)\n" +msgid "out of memory allocating SSPI buffer (%d)" +msgstr "недоÑтаточно памÑти Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð° SSPI (%d)" -#: fe-auth.c:278 +#: fe-auth.c:285 msgid "SSPI continuation error" msgstr "ошибка Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð² SSPI" -#: fe-auth.c:351 -msgid "duplicate SSPI authentication request\n" -msgstr "повторный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ SSPI\n" +#: fe-auth.c:359 +#, c-format +msgid "duplicate SSPI authentication request" +msgstr "повторный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ SSPI" -#: fe-auth.c:377 +#: fe-auth.c:384 msgid "could not acquire SSPI credentials" msgstr "не удалоÑÑŒ получить удоÑтоверение SSPI" -#: fe-auth.c:433 -msgid "channel binding required, but SSL not in use\n" -msgstr "требуетÑÑ Ð¿Ñ€Ð¸Ð²Ñзка каналов, но SSL не иÑпользуетÑÑ\n" +#: fe-auth.c:436 +#, c-format +msgid "channel binding required, but SSL not in use" +msgstr "требуетÑÑ Ð¿Ñ€Ð¸Ð²Ñзка каналов, но SSL не иÑпользуетÑÑ" -#: fe-auth.c:440 -msgid "duplicate SASL authentication request\n" -msgstr "повторный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ SASL\n" +#: fe-auth.c:442 +#, c-format +msgid "duplicate SASL authentication request" +msgstr "повторный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ SASL" -#: fe-auth.c:496 -msgid "channel binding is required, but client does not support it\n" -msgstr "требуетÑÑ Ð¿Ñ€Ð¸Ð²Ñзка каналов, но клиент её не поддерживает\n" +#: fe-auth.c:500 +#, c-format +msgid "channel binding is required, but client does not support it" +msgstr "требуетÑÑ Ð¿Ñ€Ð¸Ð²Ñзка каналов, но клиент её не поддерживает" -#: fe-auth.c:513 +#: fe-auth.c:516 +#, c-format msgid "" -"server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" +"server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection" msgstr "" "Ñервер предложил аутентификацию SCRAM-SHA-256-PLUS Ð´Ð»Ñ ÑоединениÑ, не " -"защищённого SSL\n" +"защищённого SSL" -#: fe-auth.c:525 -msgid "none of the server's SASL authentication mechanisms are supported\n" -msgstr "" -"ни один из Ñерверных механизмов аутентификации SASL не поддерживаетÑÑ\n" +#: fe-auth.c:531 +#, c-format +msgid "none of the server's SASL authentication mechanisms are supported" +msgstr "ни один из Ñерверных механизмов аутентификации SASL не поддерживаетÑÑ" -#: fe-auth.c:533 +#: fe-auth.c:538 +#, c-format msgid "" "channel binding is required, but server did not offer an authentication " -"method that supports channel binding\n" +"method that supports channel binding" msgstr "" "требуетÑÑ Ð¿Ñ€Ð¸Ð²Ñзка каналов, но Ñервер не предложил поддерживающий её метод " -"аутентификации\n" +"аутентификации" -#: fe-auth.c:639 +#: fe-auth.c:640 #, c-format -msgid "out of memory allocating SASL buffer (%d)\n" -msgstr "недоÑтаточно памÑти Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð° SASL (%d)\n" +msgid "out of memory allocating SASL buffer (%d)" +msgstr "недоÑтаточно памÑти Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð° SASL (%d)" -#: fe-auth.c:664 +#: fe-auth.c:663 +#, c-format msgid "" "AuthenticationSASLFinal received from server, but SASL authentication was " -"not completed\n" +"not completed" msgstr "" "c Ñервера получено Ñообщение AuthenticationSASLFinal, но Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ SASL " -"ещё не завершена\n" +"ещё не завершена" + +#: fe-auth.c:673 +#, c-format +msgid "no client response found after SASL exchange success" +msgstr "поÑле уÑпешного обмена по протоколу SASL не получен ответ клиента" + +#: fe-auth.c:736 fe-auth.c:743 fe-auth.c:1346 fe-auth.c:1357 +#, c-format +msgid "could not encrypt password: %s" +msgstr "не удалоÑÑŒ зашифровать пароль: %s" + +#: fe-auth.c:772 +msgid "server requested a cleartext password" +msgstr "Ñервер запроÑил незашифрованный пароль" + +#: fe-auth.c:774 +msgid "server requested a hashed password" +msgstr "Ñервер запроÑил хешированный пароль" + +#: fe-auth.c:777 +msgid "server requested GSSAPI authentication" +msgstr "Ñервер запроÑил аутентификацию GSSAPI" + +#: fe-auth.c:779 +msgid "server requested SSPI authentication" +msgstr "Ñервер запроÑил аутентификацию SSPI" -#: fe-auth.c:741 -msgid "SCM_CRED authentication method not supported\n" -msgstr "Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ SCM_CRED не поддерживаетÑÑ\n" +#: fe-auth.c:783 +msgid "server requested SASL authentication" +msgstr "Ñервер запроÑил аутентификацию SASL" -#: fe-auth.c:836 +#: fe-auth.c:786 +msgid "server requested an unknown authentication type" +msgstr "Ñервер запроÑил аутентификацию неизвеÑтного типа" + +#: fe-auth.c:819 +#, c-format +msgid "server did not request an SSL certificate" +msgstr "Ñервер не запроÑил Ñертификат SSL" + +#: fe-auth.c:824 +#, c-format +msgid "server accepted connection without a valid SSL certificate" +msgstr "Ñервер принÑл подключение, не проверив Ñертификат SSL" + +#: fe-auth.c:878 +msgid "server did not complete authentication" +msgstr "Ñервер не завершил аутентификацию" + +#: fe-auth.c:912 +#, c-format +msgid "authentication method requirement \"%s\" failed: %s" +msgstr "требование метода аутентификации \"%s\" не выполнено: %s" + +#: fe-auth.c:935 +#, c-format msgid "" "channel binding required, but server authenticated client without channel " -"binding\n" +"binding" msgstr "" -"требуетÑÑ Ð¿Ñ€Ð¸Ð²Ñзка каналов, но Ñервер аутентифицировал клиента без привÑзки\n" +"требуетÑÑ Ð¿Ñ€Ð¸Ð²Ñзка каналов, но Ñервер аутентифицировал клиента без привÑзки" -#: fe-auth.c:842 +#: fe-auth.c:940 +#, c-format msgid "" -"channel binding required but not supported by server's authentication " -"request\n" +"channel binding required but not supported by server's authentication request" msgstr "" "требуетÑÑ Ð¿Ñ€Ð¸Ð²Ñзка каналов, но она не поддерживаетÑÑ Ð¿Ñ€Ð¸ том запроÑе " -"аутентификации, который передал Ñервер\n" +"аутентификации, который передал Ñервер" -#: fe-auth.c:877 -msgid "Kerberos 4 authentication not supported\n" -msgstr "Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Kerberos 4 не поддерживаетÑÑ\n" +#: fe-auth.c:974 +#, c-format +msgid "Kerberos 4 authentication not supported" +msgstr "Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Kerberos 4 не поддерживаетÑÑ" -#: fe-auth.c:882 -msgid "Kerberos 5 authentication not supported\n" -msgstr "Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Kerberos 5 не поддерживаетÑÑ\n" +#: fe-auth.c:978 +#, c-format +msgid "Kerberos 5 authentication not supported" +msgstr "Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Kerberos 5 не поддерживаетÑÑ" -#: fe-auth.c:953 -msgid "GSSAPI authentication not supported\n" -msgstr "Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· GSSAPI не поддерживаетÑÑ\n" +#: fe-auth.c:1048 +#, c-format +msgid "GSSAPI authentication not supported" +msgstr "Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· GSSAPI не поддерживаетÑÑ" -#: fe-auth.c:985 -msgid "SSPI authentication not supported\n" -msgstr "Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· SSPI не поддерживаетÑÑ\n" +#: fe-auth.c:1079 +#, c-format +msgid "SSPI authentication not supported" +msgstr "Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· SSPI не поддерживаетÑÑ" -#: fe-auth.c:993 -msgid "Crypt authentication not supported\n" -msgstr "Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Crypt не поддерживаетÑÑ\n" +#: fe-auth.c:1086 +#, c-format +msgid "Crypt authentication not supported" +msgstr "Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Crypt не поддерживаетÑÑ" + +#: fe-auth.c:1150 +#, c-format +msgid "authentication method %u not supported" +msgstr "метод аутентификации %u не поддерживаетÑÑ" -#: fe-auth.c:1060 +#: fe-auth.c:1187 #, c-format -msgid "authentication method %u not supported\n" -msgstr "метод аутентификации %u не поддерживаетÑÑ\n" +msgid "user name lookup failure: error code %lu" +msgstr "раÑпознать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалоÑÑŒ (код ошибки: %lu)" -#: fe-auth.c:1107 +#: fe-auth.c:1309 #, c-format -msgid "user name lookup failure: error code %lu\n" -msgstr "раÑпознать Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ удалоÑÑŒ (код ошибки: %lu)\n" +msgid "unexpected shape of result set returned for SHOW" +msgstr "Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° набора результатов, возвращённого Ð´Ð»Ñ SHOW" -#: fe-auth.c:1117 fe-connect.c:2851 +#: fe-auth.c:1317 #, c-format -msgid "could not look up local user ID %d: %s\n" -msgstr "найти локального Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ идентификатору (%d) не удалоÑÑŒ: %s\n" +msgid "\"password_encryption\" value too long" +msgstr "Ñлишком длинное значение \"password_encryption\"" -#: fe-auth.c:1122 fe-connect.c:2856 +#: fe-auth.c:1367 #, c-format -msgid "local user with ID %d does not exist\n" -msgstr "локальный пользователь Ñ ID %d не ÑущеÑтвует\n" +msgid "unrecognized password encryption algorithm \"%s\"" +msgstr "нераÑпознанный алгоритм ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ \"%s\"" -#: fe-auth.c:1226 -msgid "unexpected shape of result set returned for SHOW\n" -msgstr "Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° набора результатов, возвращённого Ð´Ð»Ñ SHOW\n" +#: fe-cancel.c:76 +#, c-format +msgid "connection pointer is NULL" +msgstr "нулевой указатель ÑоединениÑ" -#: fe-auth.c:1235 -msgid "password_encryption value too long\n" -msgstr "Ñлишком длинное значение password_encryption\n" +#: fe-cancel.c:82 fe-misc.c:572 +#, c-format +msgid "connection not open" +msgstr "Ñоединение не открыто" -#: fe-auth.c:1275 +#: fe-cancel.c:193 #, c-format -msgid "unrecognized password encryption algorithm \"%s\"\n" -msgstr "нераÑпознанный алгоритм ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ \"%s\"\n" +msgid "cancel request is already being sent on this connection" +msgstr "через Ñто Ñоединение уже передаётÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹" -#: fe-connect.c:1094 +#: fe-cancel.c:263 #, c-format -msgid "could not match %d host names to %d hostaddr values\n" -msgstr "не удалоÑÑŒ ÑопоÑтавить имена узлов (%d) Ñо значениÑми hostaddr (%d)\n" +msgid "unexpected response from server" +msgstr "неожиданный ответ Ñервера" -#: fe-connect.c:1175 +#: fe-connect.c:1182 #, c-format -msgid "could not match %d port numbers to %d hosts\n" -msgstr "не удалоÑÑŒ ÑопоÑтавить номера портов (%d) Ñ ÑƒÐ·Ð»Ð°Ð¼Ð¸ (%d)\n" +msgid "could not match %d host names to %d hostaddr values" +msgstr "не удалоÑÑŒ ÑопоÑтавить имена узлов (%d) Ñо значениÑми hostaddr (%d)" -#: fe-connect.c:1268 fe-connect.c:1294 fe-connect.c:1336 fe-connect.c:1345 -#: fe-connect.c:1378 fe-connect.c:1422 +#: fe-connect.c:1262 #, c-format -msgid "invalid %s value: \"%s\"\n" -msgstr "неверное значение %s: \"%s\"\n" +msgid "could not match %d port numbers to %d hosts" +msgstr "не удалоÑÑŒ ÑопоÑтавить номера портов (%d) Ñ ÑƒÐ·Ð»Ð°Ð¼Ð¸ (%d)" -#: fe-connect.c:1315 +#: fe-connect.c:1387 #, c-format -msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" -msgstr "значение sslmode \"%s\" недопуÑтимо Ð´Ð»Ñ Ñборки без поддержки SSL\n" +msgid "" +"negative require_auth method \"%s\" cannot be mixed with non-negative methods" +msgstr "" +"отрицательный метод require_auth \"%s\" не может ÑовмещатьÑÑ Ñ " +"неотрицательными методами" -#: fe-connect.c:1363 -msgid "invalid SSL protocol version range\n" -msgstr "неверный диапазон верÑий протокола SSL\n" +#: fe-connect.c:1400 +#, c-format +msgid "require_auth method \"%s\" cannot be mixed with negative methods" +msgstr "" +"метод require_auth \"%s\" не может ÑовмещатьÑÑ Ñ Ð¾Ñ‚Ñ€Ð¸Ñ†Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸ методами" + +#: fe-connect.c:1460 fe-connect.c:1511 fe-connect.c:1553 fe-connect.c:1596 +#: fe-connect.c:1699 fe-connect.c:1745 fe-connect.c:1785 fe-connect.c:1806 +#, c-format +msgid "invalid %s value: \"%s\"" +msgstr "неверное значение %s: \"%s\"" + +#: fe-connect.c:1493 +#, c-format +msgid "require_auth method \"%s\" is specified more than once" +msgstr "метод require_auth \"%s\" указан неоднократно" + +#: fe-connect.c:1534 fe-connect.c:1573 fe-connect.c:1605 fe-connect.c:1707 +#, c-format +msgid "%s value \"%s\" invalid when SSL support is not compiled in" +msgstr "значение %s \"%s\" недопуÑтимо Ð´Ð»Ñ Ñборки без поддержки SSL" -#: fe-connect.c:1388 +#: fe-connect.c:1625 #, c-format msgid "" -"gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" +"weak sslmode \"%s\" may not be used with sslnegotiation=direct (use " +"\"require\", \"verify-ca\", or \"verify-full\")" msgstr "" -"значение gssencmode \"%s\" недопуÑтимо Ð´Ð»Ñ Ñборки без поддержки GSSAPI\n" +"Ñлабый режим sslmode \"%s\" не может иÑпользоватьÑÑ Ñ sslnegotiation=direct " +"(иÑпользуйте режим \"require\", \"verify-ca\" или \"verify-full\")" -#: fe-connect.c:1648 +#: fe-connect.c:1647 #, c-format -msgid "could not set socket to TCP no delay mode: %s\n" -msgstr "не удалоÑÑŒ перевеÑти Ñокет в режим TCP-передачи без задержки: %s\n" +msgid "" +"weak sslmode \"%s\" may not be used with sslrootcert=system (use \"verify-" +"full\")" +msgstr "" +"Ñлабый режим sslmode \"%s\" не может иÑпользоватьÑÑ Ñ sslrootcert=system " +"(иÑпользуйте режим \"verify-full\")" + +#: fe-connect.c:1660 fe-connect.c:1668 +#, c-format +msgid "invalid \"%s\" value: \"%s\"" +msgstr "неверное значение \"%s\": \"%s\"" + +#: fe-connect.c:1685 +#, c-format +msgid "invalid SSL protocol version range" +msgstr "неверный диапазон верÑий протокола SSL" + +#: fe-connect.c:1722 +#, c-format +msgid "%s value \"%s\" is not supported (check OpenSSL version)" +msgstr "значение %s \"%s\" не поддерживаетÑÑ (проверьте верÑию OpenSSL)" + +#: fe-connect.c:1752 +#, c-format +msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in" +msgstr "значение gssencmode \"%s\" недопуÑтимо Ð´Ð»Ñ Ñборки без поддержки GSSAPI" -#: fe-connect.c:1710 +#: fe-connect.c:2045 +#, c-format +msgid "could not set socket to TCP no delay mode: %s" +msgstr "не удалоÑÑŒ перевеÑти Ñокет в режим TCP-передачи без задержки: %s" + +#: fe-connect.c:2104 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "подключитьÑÑ Ðº Ñерверу через Ñокет \"%s\" не удалоÑÑŒ: " -#: fe-connect.c:1737 +#: fe-connect.c:2130 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "подключитьÑÑ Ðº Ñерверу \"%s\" (%s), порту %s не удалоÑÑŒ: " -#: fe-connect.c:1742 +#: fe-connect.c:2135 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "подключитьÑÑ Ðº Ñерверу \"%s\", порту %s не удалоÑÑŒ: " -#: fe-connect.c:1767 +#: fe-connect.c:2158 +#, c-format msgid "" -"\tIs the server running locally and accepting connections on that socket?\n" +"\tIs the server running locally and accepting connections on that socket?" msgstr "" "\tСервер дейÑтвительно работает локально и принимает Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· Ñтот " -"Ñокет?\n" +"Ñокет?" -#: fe-connect.c:1771 -msgid "" -"\tIs the server running on that host and accepting TCP/IP connections?\n" +#: fe-connect.c:2160 +#, c-format +msgid "\tIs the server running on that host and accepting TCP/IP connections?" msgstr "" -"\tСервер дейÑтвительно работает по данному адреÑу и принимает TCP-" -"ÑоединениÑ?\n" +"\tСервер дейÑтвительно работает по данному адреÑу и принимает TCP-ÑоединениÑ?" -#: fe-connect.c:1835 +#: fe-connect.c:2206 fe-connect.c:2240 fe-connect.c:2275 fe-connect.c:2373 +#: fe-connect.c:3098 #, c-format -msgid "invalid integer value \"%s\" for connection option \"%s\"\n" -msgstr "" -"неверное целочиÑленное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ \"%s\"\n" +msgid "%s(%s) failed: %s" +msgstr "ошибка в %s(%s): %s" + +#: fe-connect.c:2339 +#, c-format +msgid "%s(%s) failed: error code %d" +msgstr "ошибка в %s(%s): код ошибки %d" -#: fe-connect.c:1865 fe-connect.c:1900 fe-connect.c:1936 fe-connect.c:2025 -#: fe-connect.c:2639 +#: fe-connect.c:2650 #, c-format -msgid "%s(%s) failed: %s\n" -msgstr "ошибка в %s(%s): %s\n" +msgid "invalid connection state, probably indicative of memory corruption" +msgstr "неверное ÑоÑтоÑние ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ - возможно разрушение памÑти" -#: fe-connect.c:1990 +#: fe-connect.c:2733 #, c-format -msgid "%s(%s) failed: error code %d\n" -msgstr "ошибка в %s(%s): код ошибки %d\n" +msgid "invalid port number: \"%s\"" +msgstr "неверный номер порта: \"%s\"" -#: fe-connect.c:2305 -msgid "invalid connection state, probably indicative of memory corruption\n" -msgstr "неверное ÑоÑтоÑние ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ - возможно разрушение памÑти\n" +#: fe-connect.c:2747 +#, c-format +msgid "could not translate host name \"%s\" to address: %s" +msgstr "преобразовать Ð¸Ð¼Ñ \"%s\" в Ð°Ð´Ñ€ÐµÑ Ð½Ðµ удалоÑÑŒ: %s" -#: fe-connect.c:2384 +#: fe-connect.c:2759 #, c-format -msgid "invalid port number: \"%s\"\n" -msgstr "неверный номер порта: \"%s\"\n" +msgid "could not parse network address \"%s\": %s" +msgstr "не удалоÑÑŒ разобрать Ñетевой Ð°Ð´Ñ€ÐµÑ \"%s\": %s" -#: fe-connect.c:2400 +#: fe-connect.c:2770 #, c-format -msgid "could not translate host name \"%s\" to address: %s\n" -msgstr "преобразовать Ð¸Ð¼Ñ \"%s\" в Ð°Ð´Ñ€ÐµÑ Ð½Ðµ удалоÑÑŒ: %s\n" +msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" +msgstr "длина пути Unix-Ñокета \"%s\" превышает предел (%d байт)" -#: fe-connect.c:2413 +#: fe-connect.c:2784 #, c-format -msgid "could not parse network address \"%s\": %s\n" -msgstr "не удалоÑÑŒ разобрать Ñетевой Ð°Ð´Ñ€ÐµÑ \"%s\": %s\n" +msgid "could not translate Unix-domain socket path \"%s\" to address: %s" +msgstr "преобразовать путь Unix-Ñокета \"%s\" в Ð°Ð´Ñ€ÐµÑ Ð½Ðµ удалоÑÑŒ: %s" -#: fe-connect.c:2426 +#: fe-connect.c:2950 fe-connect.c:4305 #, c-format -msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" -msgstr "длина пути Unix-Ñокета \"%s\" превышает предел (%d байт)\n" +msgid "GSSAPI encryption required but it is not supported over a local socket" +msgstr "" +"затребовано шифрование GSSAPI, но оно не поддерживаетÑÑ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ñокета" -#: fe-connect.c:2441 +#: fe-connect.c:2958 fe-connect.c:4434 #, c-format -msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" -msgstr "преобразовать путь Unix-Ñокета \"%s\" в Ð°Ð´Ñ€ÐµÑ Ð½Ðµ удалоÑÑŒ: %s\n" +msgid "GSSAPI encryption required but no credential cache" +msgstr "шифрование GSSAPI затребовано в отÑутÑтвие кеша учётных данных" -#: fe-connect.c:2567 +#: fe-connect.c:3026 #, c-format -msgid "could not create socket: %s\n" -msgstr "не удалоÑÑŒ Ñоздать Ñокет: %s\n" +msgid "could not create socket: %s" +msgstr "не удалоÑÑŒ Ñоздать Ñокет: %s" -#: fe-connect.c:2598 +#: fe-connect.c:3057 #, c-format -msgid "could not set socket to nonblocking mode: %s\n" -msgstr "не удалоÑÑŒ перевеÑти Ñокет в неблокирующий режим: %s\n" +msgid "could not set socket to nonblocking mode: %s" +msgstr "не удалоÑÑŒ перевеÑти Ñокет в неблокирующий режим: %s" -#: fe-connect.c:2608 +#: fe-connect.c:3068 #, c-format -msgid "could not set socket to close-on-exec mode: %s\n" +msgid "could not set socket to close-on-exec mode: %s" msgstr "" "не удалоÑÑŒ перевеÑти Ñокет в режим Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ñ€Ð¸ выполнении (close-on-exec): " -"%s\n" +"%s" -#: fe-connect.c:2626 -msgid "keepalives parameter must be an integer\n" -msgstr "параметр keepalives должен быть целым чиÑлом\n" - -#: fe-connect.c:2767 +#: fe-connect.c:3225 #, c-format -msgid "could not get socket error status: %s\n" -msgstr "не удалоÑÑŒ получить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾ÑˆÐ¸Ð±ÐºÐ¸ Ñокета: %s\n" +msgid "could not get socket error status: %s" +msgstr "не удалоÑÑŒ получить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¾ÑˆÐ¸Ð±ÐºÐ¸ Ñокета: %s" -#: fe-connect.c:2795 +#: fe-connect.c:3252 #, c-format -msgid "could not get client address from socket: %s\n" -msgstr "не удалоÑÑŒ получить Ð°Ð´Ñ€ÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð° из Ñокета: %s\n" +msgid "could not get client address from socket: %s" +msgstr "не удалоÑÑŒ получить Ð°Ð´Ñ€ÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð° из Ñокета: %s" -#: fe-connect.c:2837 -msgid "requirepeer parameter is not supported on this platform\n" -msgstr "параметр requirepeer не поддерживаетÑÑ Ð² Ñтой ОС\n" +#: fe-connect.c:3278 +#, c-format +msgid "requirepeer parameter is not supported on this platform" +msgstr "параметр requirepeer не поддерживаетÑÑ Ð² Ñтой ОС" -#: fe-connect.c:2840 +#: fe-connect.c:3280 #, c-format -msgid "could not get peer credentials: %s\n" -msgstr "не удалоÑÑŒ получить учётные данные Ñервера: %s\n" +msgid "could not get peer credentials: %s" +msgstr "не удалоÑÑŒ получить учётные данные Ñервера: %s" -#: fe-connect.c:2864 +#: fe-connect.c:3293 #, c-format -msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" +msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"" msgstr "" "requirepeer допуÑкает подключение только к \"%s\", но Ñервер работает под " -"именем \"%s\"\n" +"именем \"%s\"" -#: fe-connect.c:2904 +#: fe-connect.c:3331 #, c-format -msgid "could not send GSSAPI negotiation packet: %s\n" -msgstr "не удалоÑÑŒ отправить пакет ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ GSSAPI: %s\n" +msgid "could not send GSSAPI negotiation packet: %s" +msgstr "не удалоÑÑŒ отправить пакет ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ GSSAPI: %s" -#: fe-connect.c:2916 -msgid "" -"GSSAPI encryption required but was impossible (possibly no credential cache, " -"no server support, or using a local socket)\n" -msgstr "" -"затребовано шифрование GSSAPI, но Ñто требование невыполнимо (возможно, " -"отÑутÑтвует кеш учётных данных, нет поддержки на Ñервере или иÑпользуетÑÑ " -"локальный Ñокет)\n" +#: fe-connect.c:3380 +#, c-format +msgid "could not send SSL negotiation packet: %s" +msgstr "не удалоÑÑŒ отправить пакет ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ SSL: %s" -#: fe-connect.c:2958 +#: fe-connect.c:3412 #, c-format -msgid "could not send SSL negotiation packet: %s\n" -msgstr "не удалоÑÑŒ отправить пакет ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ SSL: %s\n" +msgid "could not send cancel packet: %s" +msgstr "не удалоÑÑŒ отправить пакет отмены: %s" -#: fe-connect.c:2989 +#: fe-connect.c:3442 #, c-format -msgid "could not send startup packet: %s\n" -msgstr "не удалоÑÑŒ отправить Ñтартовый пакет: %s\n" +msgid "could not send startup packet: %s" +msgstr "не удалоÑÑŒ отправить Ñтартовый пакет: %s" -#: fe-connect.c:3065 -msgid "server does not support SSL, but SSL was required\n" -msgstr "затребовано подключение через SSL, но Ñервер не поддерживает SSL\n" +#: fe-connect.c:3509 +msgid "server does not support SSL, but SSL was required" +msgstr "затребовано подключение через SSL, но Ñервер не поддерживает SSL" -#: fe-connect.c:3092 +#: fe-connect.c:3519 #, c-format -msgid "received invalid response to SSL negotiation: %c\n" -msgstr "получен неверный ответ при ÑоглаÑовании SSL: %c\n" +msgid "server sent an error response during SSL exchange" +msgstr "Ñервер передал ошибочный ответ во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° ÑообщениÑми SSL" -#: fe-connect.c:3113 -msgid "received unencrypted data after SSL response\n" -msgstr "поÑле ответа SSL получены незашифрованные данные\n" +#: fe-connect.c:3524 +#, c-format +msgid "received invalid response to SSL negotiation: %c" +msgstr "получен неверный ответ при ÑоглаÑовании SSL: %c" -#: fe-connect.c:3194 -msgid "server doesn't support GSSAPI encryption, but it was required\n" -msgstr "затребовано шифрование GSSAPI, но Ñервер его не поддерживает\n" +#: fe-connect.c:3552 +#, c-format +msgid "received unencrypted data after SSL response" +msgstr "поÑле ответа SSL получены незашифрованные данные" -#: fe-connect.c:3206 +#: fe-connect.c:3615 #, c-format -msgid "received invalid response to GSSAPI negotiation: %c\n" -msgstr "получен неверный ответ при ÑоглаÑовании GSSAPI: %c\n" +msgid "server sent an error response during GSS encryption exchange" +msgstr "Ñервер передал ошибочный ответ во Ð²Ñ€ÐµÐ¼Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ GSS" -#: fe-connect.c:3225 -msgid "received unencrypted data after GSSAPI encryption response\n" +#: fe-connect.c:3629 +msgid "server doesn't support GSSAPI encryption, but it was required" +msgstr "затребовано шифрование GSSAPI, но Ñервер его не поддерживает" + +#: fe-connect.c:3633 +#, c-format +msgid "received invalid response to GSSAPI negotiation: %c" +msgstr "получен неверный ответ при ÑоглаÑовании GSSAPI: %c" + +#: fe-connect.c:3651 +#, c-format +msgid "received unencrypted data after GSSAPI encryption response" msgstr "" -"поÑле ответа на Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ GSSAPI получены незашифрованные данные\n" +"поÑле ответа на Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ GSSAPI получены незашифрованные данные" + +#: fe-connect.c:3711 +#, c-format +msgid "expected authentication request from server, but received %c" +msgstr "ожидалÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ от Ñервера, но получено: %c" + +#: fe-connect.c:3739 fe-connect.c:3862 +#, c-format +msgid "received invalid authentication request" +msgstr "получен некорректный Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸" -#: fe-connect.c:3285 fe-connect.c:3310 +#: fe-connect.c:3745 fe-connect.c:3847 #, c-format -msgid "expected authentication request from server, but received %c\n" -msgstr "ожидалÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ от Ñервера, но получено: %c\n" +msgid "received invalid protocol negotiation message" +msgstr "получено некорректное Ñообщение ÑоглаÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð°" -#: fe-connect.c:3517 -msgid "unexpected message from server during startup\n" -msgstr "неожиданное Ñообщение от Ñервера в начале работы\n" +#: fe-connect.c:3764 fe-connect.c:3818 +#, c-format +msgid "received invalid error message" +msgstr "получено некорректное Ñообщение об ошибке" -#: fe-connect.c:3609 -msgid "session is read-only\n" -msgstr "ÑÐµÐ°Ð½Ñ Ð½Ðµ допуÑкает запиÑÑŒ\n" +#: fe-connect.c:3933 +#, c-format +msgid "unexpected message from server during startup" +msgstr "неожиданное Ñообщение от Ñервера в начале работы" -#: fe-connect.c:3612 -msgid "session is not read-only\n" -msgstr "ÑÐµÐ°Ð½Ñ Ð´Ð¾Ð¿ÑƒÑкает запиÑÑŒ\n" +#: fe-connect.c:4024 +#, c-format +msgid "session is read-only" +msgstr "ÑÐµÐ°Ð½Ñ Ð½Ðµ допуÑкает запиÑÑŒ" -#: fe-connect.c:3666 -msgid "server is in hot standby mode\n" -msgstr "Ñервер работает в режиме горÑчего резерва\n" +#: fe-connect.c:4026 +#, c-format +msgid "session is not read-only" +msgstr "ÑÐµÐ°Ð½Ñ Ð´Ð¾Ð¿ÑƒÑкает запиÑÑŒ" -#: fe-connect.c:3669 -msgid "server is not in hot standby mode\n" -msgstr "Ñервер работает не в режиме горÑчего резерва\n" +#: fe-connect.c:4079 +#, c-format +msgid "server is in hot standby mode" +msgstr "Ñервер работает в режиме горÑчего резерва" -#: fe-connect.c:3787 fe-connect.c:3839 +#: fe-connect.c:4081 #, c-format -msgid "\"%s\" failed\n" -msgstr "выполнить \"%s\" не удалоÑÑŒ\n" +msgid "server is not in hot standby mode" +msgstr "Ñервер работает не в режиме горÑчего резерва" -#: fe-connect.c:3853 +#: fe-connect.c:4203 fe-connect.c:4253 #, c-format -msgid "invalid connection state %d, probably indicative of memory corruption\n" -msgstr "неверное ÑоÑтоÑние ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ %d - возможно разрушение памÑти\n" +msgid "\"%s\" failed" +msgstr "выполнить \"%s\" не удалоÑÑŒ" -#: fe-connect.c:4299 fe-connect.c:4359 +#: fe-connect.c:4267 #, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "ошибка в PGEventProc \"%s\" при обработке ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ PGEVT_CONNRESET\n" +msgid "invalid connection state %d, probably indicative of memory corruption" +msgstr "неверное ÑоÑтоÑние ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ %d - возможно разрушение памÑти" -#: fe-connect.c:4719 +#: fe-connect.c:5086 #, c-format -msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" -msgstr "некорректный Ð°Ð´Ñ€ÐµÑ LDAP \"%s\": Ñхема должна быть ldap://\n" +msgid "invalid LDAP URL \"%s\": scheme must be ldap://" +msgstr "некорректный Ð°Ð´Ñ€ÐµÑ LDAP \"%s\": Ñхема должна быть ldap://" -#: fe-connect.c:4734 +#: fe-connect.c:5101 #, c-format -msgid "invalid LDAP URL \"%s\": missing distinguished name\n" -msgstr "некорректный Ð°Ð´Ñ€ÐµÑ LDAP \"%s\": отÑутÑтвует уникальное имÑ\n" +msgid "invalid LDAP URL \"%s\": missing distinguished name" +msgstr "некорректный Ð°Ð´Ñ€ÐµÑ LDAP \"%s\": отÑутÑтвует уникальное имÑ" -#: fe-connect.c:4746 fe-connect.c:4804 +#: fe-connect.c:5113 fe-connect.c:5171 #, c-format -msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" -msgstr "некорректный Ð°Ð´Ñ€ÐµÑ LDAP \"%s\": должен быть только один атрибут\n" +msgid "invalid LDAP URL \"%s\": must have exactly one attribute" +msgstr "некорректный Ð°Ð´Ñ€ÐµÑ LDAP \"%s\": должен быть только один атрибут" -#: fe-connect.c:4758 fe-connect.c:4820 +#: fe-connect.c:5125 fe-connect.c:5187 #, c-format -msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" +msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" msgstr "" -"некорректный Ð°Ð´Ñ€ÐµÑ LDAP \"%s\": не указана облаÑть поиÑка (base/one/sub)\n" +"некорректный Ð°Ð´Ñ€ÐµÑ LDAP \"%s\": не указана облаÑть поиÑка (base/one/sub)" -#: fe-connect.c:4770 +#: fe-connect.c:5137 #, c-format -msgid "invalid LDAP URL \"%s\": no filter\n" -msgstr "некорректный Ð°Ð´Ñ€ÐµÑ LDAP \"%s\": нет фильтра\n" +msgid "invalid LDAP URL \"%s\": no filter" +msgstr "некорректный Ð°Ð´Ñ€ÐµÑ LDAP \"%s\": нет фильтра" -#: fe-connect.c:4792 +#: fe-connect.c:5159 #, c-format -msgid "invalid LDAP URL \"%s\": invalid port number\n" -msgstr "некорректный Ð°Ð´Ñ€ÐµÑ LDAP \"%s\": неверный номер порта\n" +msgid "invalid LDAP URL \"%s\": invalid port number" +msgstr "некорректный Ð°Ð´Ñ€ÐµÑ LDAP \"%s\": неверный номер порта" -#: fe-connect.c:4830 -msgid "could not create LDAP structure\n" -msgstr "не удалоÑÑŒ Ñоздать Ñтруктуру LDAP\n" +#: fe-connect.c:5196 +#, c-format +msgid "could not create LDAP structure" +msgstr "не удалоÑÑŒ Ñоздать Ñтруктуру LDAP" -#: fe-connect.c:4906 +#: fe-connect.c:5271 #, c-format -msgid "lookup on LDAP server failed: %s\n" -msgstr "ошибка поиÑка на Ñервере LDAP: %s\n" +msgid "lookup on LDAP server failed: %s" +msgstr "ошибка поиÑка на Ñервере LDAP: %s" -#: fe-connect.c:4917 -msgid "more than one entry found on LDAP lookup\n" -msgstr "при поиÑке LDAP найдено более одного вхождениÑ\n" +#: fe-connect.c:5281 +#, c-format +msgid "more than one entry found on LDAP lookup" +msgstr "при поиÑке LDAP найдено более одного вхождениÑ" -#: fe-connect.c:4918 fe-connect.c:4930 -msgid "no entry found on LDAP lookup\n" -msgstr "при поиÑке LDAP ничего не найдено\n" +#: fe-connect.c:5283 fe-connect.c:5294 +#, c-format +msgid "no entry found on LDAP lookup" +msgstr "при поиÑке LDAP ничего не найдено" -#: fe-connect.c:4941 fe-connect.c:4954 -msgid "attribute has no values on LDAP lookup\n" -msgstr "атрибут не Ñодержит значений при поиÑке LDAP\n" +#: fe-connect.c:5304 fe-connect.c:5316 +#, c-format +msgid "attribute has no values on LDAP lookup" +msgstr "атрибут не Ñодержит значений при поиÑке LDAP" -#: fe-connect.c:5006 fe-connect.c:5025 fe-connect.c:5557 +#: fe-connect.c:5367 fe-connect.c:5386 fe-connect.c:5910 #, c-format -msgid "missing \"=\" after \"%s\" in connection info string\n" -msgstr "в Ñтроке ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÑ‚ \"=\" поÑле \"%s\"\n" +msgid "missing \"=\" after \"%s\" in connection info string" +msgstr "в Ñтроке ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÑ‚ \"=\" поÑле \"%s\"" -#: fe-connect.c:5098 fe-connect.c:5742 fe-connect.c:6518 +#: fe-connect.c:5457 fe-connect.c:6093 fe-connect.c:6891 #, c-format -msgid "invalid connection option \"%s\"\n" -msgstr "неверный параметр ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ \"%s\"\n" +msgid "invalid connection option \"%s\"" +msgstr "неверный параметр ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ \"%s\"" -#: fe-connect.c:5114 fe-connect.c:5606 -msgid "unterminated quoted string in connection info string\n" -msgstr "в Ñтроке ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ хватает закрывающей кавычки\n" +#: fe-connect.c:5472 fe-connect.c:5958 +#, c-format +msgid "unterminated quoted string in connection info string" +msgstr "в Ñтроке ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ хватает закрывающей кавычки" -#: fe-connect.c:5195 +#: fe-connect.c:5552 #, c-format -msgid "definition of service \"%s\" not found\n" -msgstr "определение Ñлужбы \"%s\" не найдено\n" +msgid "definition of service \"%s\" not found" +msgstr "определение Ñлужбы \"%s\" не найдено" -#: fe-connect.c:5221 +#: fe-connect.c:5578 #, c-format -msgid "service file \"%s\" not found\n" -msgstr "файл определений Ñлужб \"%s\" не найден\n" +msgid "service file \"%s\" not found" +msgstr "файл определений Ñлужб \"%s\" не найден" -#: fe-connect.c:5235 +#: fe-connect.c:5591 #, c-format -msgid "line %d too long in service file \"%s\"\n" -msgstr "Ñлишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ Ñтрока (%d) в файле определений Ñлужб \"%s\"\n" +msgid "line %d too long in service file \"%s\"" +msgstr "Ñлишком Ð´Ð»Ð¸Ð½Ð½Ð°Ñ Ñтрока (%d) в файле определений Ñлужб \"%s\"" -#: fe-connect.c:5306 fe-connect.c:5350 +#: fe-connect.c:5662 fe-connect.c:5705 #, c-format -msgid "syntax error in service file \"%s\", line %d\n" -msgstr "ÑинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в файле Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñлужб \"%s\" (Ñтрока %d)\n" +msgid "syntax error in service file \"%s\", line %d" +msgstr "ÑинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в файле Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñлужб \"%s\" (Ñтрока %d)" -#: fe-connect.c:5317 +#: fe-connect.c:5673 #, c-format msgid "" -"nested service specifications not supported in service file \"%s\", line %d\n" +"nested service specifications not supported in service file \"%s\", line %d" msgstr "" -"рекурÑивные Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñлужб не поддерживаютÑÑ (файл Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñлужб \"%s" -"\", Ñтрока %d)\n" +"рекурÑивные Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñлужб не поддерживаютÑÑ (файл Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñлужб " +"\"%s\", Ñтрока %d)" -#: fe-connect.c:6038 +#: fe-connect.c:6412 #, c-format -msgid "invalid URI propagated to internal parser routine: \"%s\"\n" -msgstr "во внутреннюю процедуру разбора Ñтроки передан ошибочный URI: \"%s\"\n" +msgid "invalid URI propagated to internal parser routine: \"%s\"" +msgstr "во внутреннюю процедуру разбора Ñтроки передан ошибочный URI: \"%s\"" -#: fe-connect.c:6115 +#: fe-connect.c:6489 #, c-format msgid "" "end of string reached when looking for matching \"]\" in IPv6 host address " -"in URI: \"%s\"\n" -msgstr "URI не Ñодержит Ñимвол \"]\" поÑле адреÑа IPv6: \"%s\"\n" +"in URI: \"%s\"" +msgstr "URI не Ñодержит Ñимвол \"]\" поÑле адреÑа IPv6: \"%s\"" -#: fe-connect.c:6122 +#: fe-connect.c:6496 #, c-format -msgid "IPv6 host address may not be empty in URI: \"%s\"\n" -msgstr "IPv6, ÑодержащийÑÑ Ð² URI, не может быть пуÑтым: \"%s\"\n" +msgid "IPv6 host address may not be empty in URI: \"%s\"" +msgstr "IPv6, ÑодержащийÑÑ Ð² URI, не может быть пуÑтым: \"%s\"" -#: fe-connect.c:6137 +#: fe-connect.c:6511 #, c-format msgid "" "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): " -"\"%s\"\n" +"\"%s\"" msgstr "" "неожиданный Ñимвол \"%c\" в позиции %d в URI (ожидалоÑÑŒ \":\" или \"/\"): " -"\"%s\"\n" +"\"%s\"" -#: fe-connect.c:6267 +#: fe-connect.c:6640 #, c-format -msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "лишний разделитель ключа/Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"=\" в параметрах URI: \"%s\"\n" +msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "лишний разделитель ключа/Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"=\" в параметрах URI: \"%s\"" -#: fe-connect.c:6287 +#: fe-connect.c:6660 #, c-format -msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "в параметрах URI не хватает Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ ÐºÐ»ÑŽÑ‡Ð°/Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"=\": \"%s\"\n" +msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "в параметрах URI не хватает Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ ÐºÐ»ÑŽÑ‡Ð°/Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"=\": \"%s\"" -#: fe-connect.c:6339 +#: fe-connect.c:6712 #, c-format -msgid "invalid URI query parameter: \"%s\"\n" -msgstr "неверный параметр в URI: \"%s\"\n" +msgid "invalid URI query parameter: \"%s\"" +msgstr "неверный параметр в URI: \"%s\"" -#: fe-connect.c:6413 +#: fe-connect.c:6786 #, c-format -msgid "invalid percent-encoded token: \"%s\"\n" -msgstr "неверный Ñимвол, закодированный Ñ %%: \"%s\"\n" +msgid "invalid percent-encoded token: \"%s\"" +msgstr "неверный Ñимвол, закодированный Ñ %%: \"%s\"" -#: fe-connect.c:6423 +#: fe-connect.c:6796 #, c-format -msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" -msgstr "недопуÑтимое значение %%00 Ð´Ð»Ñ Ñимвола, закодированного Ñ %%: \"%s\"\n" +msgid "forbidden value %%00 in percent-encoded value: \"%s\"" +msgstr "недопуÑтимое значение %%00 Ð´Ð»Ñ Ñимвола, закодированного Ñ %%: \"%s\"" -#: fe-connect.c:6793 +#: fe-connect.c:7160 msgid "connection pointer is NULL\n" msgstr "нулевой указатель ÑоединениÑ\n" -#: fe-connect.c:7081 +#: fe-connect.c:7168 fe-exec.c:713 fe-exec.c:975 fe-exec.c:3459 +#: fe-protocol3.c:991 fe-protocol3.c:1024 +msgid "out of memory\n" +msgstr "нехватка памÑти\n" + +#: fe-connect.c:7459 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ПРЕДУПРЕЖДЕÐИЕ: файл паролей \"%s\" - не обычный файл\n" -#: fe-connect.c:7090 +#: fe-connect.c:7468 #, c-format msgid "" "WARNING: password file \"%s\" has group or world access; permissions should " @@ -681,618 +870,793 @@ msgstr "" "ПРЕДУПРЕЖДЕÐИЕ: к файлу паролей \"%s\" имеют доÑтуп вÑе или группа; права " "должны быть u=rw (0600) или более ограниченные\n" -#: fe-connect.c:7198 +#: fe-connect.c:7575 #, c-format -msgid "password retrieved from file \"%s\"\n" -msgstr "пароль получен из файла \"%s\"\n" +msgid "password retrieved from file \"%s\"" +msgstr "пароль получен из файла \"%s\"" -#: fe-exec.c:449 fe-exec.c:3300 +#: fe-connect.c:7727 +#, c-format +msgid "invalid integer value \"%s\" for connection option \"%s\"" +msgstr "неверное целочиÑленное значение \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ \"%s\"" + +#: fe-exec.c:469 fe-exec.c:3533 #, c-format msgid "row number %d is out of range 0..%d" msgstr "номер запиÑи %d вне диапазона 0..%d" -#: fe-exec.c:510 fe-protocol3.c:219 fe-protocol3.c:244 fe-protocol3.c:273 -#: fe-protocol3.c:291 fe-protocol3.c:371 fe-protocol3.c:743 -msgid "out of memory" -msgstr "нехватка памÑти" - -#: fe-exec.c:511 fe-protocol3.c:1939 +#: fe-exec.c:531 fe-protocol3.c:1993 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:792 -msgid "write to server failed\n" -msgstr "ошибка при передаче данных Ñерверу\n" +#: fe-exec.c:834 +#, c-format +msgid "write to server failed" +msgstr "ошибка при передаче данных Ñерверу" + +#: fe-exec.c:874 +#, c-format +msgid "no error text available" +msgstr "текÑÑ‚ ошибки отÑутÑтвует" -#: fe-exec.c:864 +#: fe-exec.c:963 msgid "NOTICE" msgstr "ЗÐМЕЧÐÐИЕ" -#: fe-exec.c:922 +#: fe-exec.c:1021 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult не может вмеÑтить больше чем INT_MAX кортежей" -#: fe-exec.c:934 +#: fe-exec.c:1033 msgid "size_t overflow" msgstr "переполнение size_t" -#: fe-exec.c:1349 fe-exec.c:1454 fe-exec.c:1503 -msgid "command string is a null pointer\n" -msgstr "указатель на командную Ñтроку нулевой\n" +#: fe-exec.c:1438 fe-exec.c:1507 fe-exec.c:1553 +#, c-format +msgid "command string is a null pointer" +msgstr "указатель на командную Ñтроку нулевой" -#: fe-exec.c:1460 fe-exec.c:1509 fe-exec.c:1605 +#: fe-exec.c:1444 fe-exec.c:3003 #, c-format -msgid "number of parameters must be between 0 and %d\n" -msgstr "чиÑло параметров должно быть от 0 до %d\n" +msgid "%s not allowed in pipeline mode" +msgstr "%s не допуÑкаетÑÑ Ð² конвейерном режиме" -#: fe-exec.c:1497 fe-exec.c:1599 -msgid "statement name is a null pointer\n" -msgstr "указатель на Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° нулевой\n" +#: fe-exec.c:1512 fe-exec.c:1558 fe-exec.c:1652 +#, c-format +msgid "number of parameters must be between 0 and %d" +msgstr "чиÑло параметров должно быть от 0 до %d" -#: fe-exec.c:1641 fe-exec.c:3153 -msgid "no connection to the server\n" -msgstr "нет ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ñервером\n" +#: fe-exec.c:1548 fe-exec.c:1647 +#, c-format +msgid "statement name is a null pointer" +msgstr "указатель на Ð¸Ð¼Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° нулевой" -#: fe-exec.c:1650 fe-exec.c:3162 -msgid "another command is already in progress\n" -msgstr "уже выполнÑетÑÑ Ð´Ñ€ÑƒÐ³Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°\n" +#: fe-exec.c:1689 fe-exec.c:3379 +#, c-format +msgid "no connection to the server" +msgstr "нет ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ñервером" -#: fe-exec.c:1679 -msgid "cannot queue commands during COPY\n" -msgstr "во Ð²Ñ€ÐµÐ¼Ñ COPY Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñть команды в очередь\n" +#: fe-exec.c:1697 fe-exec.c:3387 +#, c-format +msgid "another command is already in progress" +msgstr "уже выполнÑетÑÑ Ð´Ñ€ÑƒÐ³Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°" -#: fe-exec.c:1797 -msgid "length must be given for binary parameter\n" -msgstr "Ð´Ð»Ñ Ð´Ð²Ð¾Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ параметра должна быть указана длина\n" +#: fe-exec.c:1727 +#, c-format +msgid "cannot queue commands during COPY" +msgstr "во Ð²Ñ€ÐµÐ¼Ñ COPY Ð½ÐµÐ»ÑŒÐ·Ñ Ð´Ð¾Ð±Ð°Ð²Ð»Ñть команды в очередь" -#: fe-exec.c:2117 +#: fe-exec.c:1846 #, c-format -msgid "unexpected asyncStatus: %d\n" -msgstr "неожиданный asyncStatus: %d\n" +msgid "length must be given for binary parameter" +msgstr "Ð´Ð»Ñ Ð´Ð²Ð¾Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ параметра должна быть указана длина" -#: fe-exec.c:2137 +#: fe-exec.c:2205 #, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "ошибка в PGEventProc \"%s\" при обработке ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ PGEVT_RESULTCREATE\n" +msgid "unexpected asyncStatus: %d" +msgstr "неожиданный asyncStatus: %d" -#: fe-exec.c:2285 +#: fe-exec.c:2361 +#, c-format msgid "" -"synchronous command execution functions are not allowed in pipeline mode\n" +"synchronous command execution functions are not allowed in pipeline mode" msgstr "" -"функции Ñинхронного Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ не допуÑкаютÑÑ Ð² конвейерном режиме\n" +"функции Ñинхронного Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ не допуÑкаютÑÑ Ð² конвейерном режиме" -#: fe-exec.c:2307 +#: fe-exec.c:2378 msgid "COPY terminated by new PQexec" msgstr "Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ COPY прервана вызовом PQexec" -#: fe-exec.c:2324 -msgid "PQexec not allowed during COPY BOTH\n" -msgstr "вызов PQexec не допуÑкаетÑÑ Ð² процеÑÑе COPY BOTH\n" +#: fe-exec.c:2394 +#, c-format +msgid "PQexec not allowed during COPY BOTH" +msgstr "вызов PQexec не допуÑкаетÑÑ Ð² процеÑÑе COPY BOTH" -#: fe-exec.c:2552 fe-exec.c:2608 fe-exec.c:2677 fe-protocol3.c:1870 -msgid "no COPY in progress\n" -msgstr "Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ COPY не выполнÑетÑÑ\n" +#: fe-exec.c:2630 +#, c-format +msgid "unrecognized message type \"%c\"" +msgstr "нераÑпознанный тип ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ \"%c\"" -#: fe-exec.c:2854 -msgid "PQfn not allowed in pipeline mode\n" -msgstr "PQfn не допуÑкаетÑÑ Ð² конвейерном режиме\n" +#: fe-exec.c:2702 fe-exec.c:2756 fe-exec.c:2824 fe-protocol3.c:1924 +#, c-format +msgid "no COPY in progress" +msgstr "Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ COPY не выполнÑетÑÑ" -#: fe-exec.c:2862 -msgid "connection in wrong state\n" -msgstr "Ñоединение в неправильном ÑоÑтоÑнии\n" +#: fe-exec.c:3010 +#, c-format +msgid "connection in wrong state" +msgstr "Ñоединение в неправильном ÑоÑтоÑнии" -#: fe-exec.c:2906 -msgid "cannot enter pipeline mode, connection not idle\n" -msgstr "перейти в конвейерный режиме нельзÑ, Ñоединение не проÑтаивает\n" +#: fe-exec.c:3053 +#, c-format +msgid "cannot enter pipeline mode, connection not idle" +msgstr "перейти в конвейерный режиме нельзÑ, Ñоединение не проÑтаивает" + +#: fe-exec.c:3089 fe-exec.c:3110 +#, c-format +msgid "cannot exit pipeline mode with uncollected results" +msgstr "выйти из конвейерного режима нельзÑ, не Ñобрав вÑе результаты" -#: fe-exec.c:2940 fe-exec.c:2957 -msgid "cannot exit pipeline mode with uncollected results\n" -msgstr "выйти из конвейерного режима нельзÑ, не Ñобрав вÑе результаты\n" +#: fe-exec.c:3093 +#, c-format +msgid "cannot exit pipeline mode while busy" +msgstr "выйти из конвейерного режима в занÑтом ÑоÑтоÑнии нельзÑ" -#: fe-exec.c:2945 -msgid "cannot exit pipeline mode while busy\n" -msgstr "выйти из конвейерного режима в занÑтом ÑоÑтоÑнии нельзÑ\n" +#: fe-exec.c:3104 +#, c-format +msgid "cannot exit pipeline mode while in COPY" +msgstr "выйти из конвейерного режима во Ð²Ñ€ÐµÐ¼Ñ COPY нельзÑ" -#: fe-exec.c:3087 -msgid "cannot send pipeline when not in pipeline mode\n" -msgstr "отправить конвейер, не Ð¿ÐµÑ€ÐµÐ¹Ð´Ñ Ð² конвейерный режим, нельзÑ\n" +#: fe-exec.c:3303 +#, c-format +msgid "cannot send pipeline when not in pipeline mode" +msgstr "отправить конвейер, не Ð¿ÐµÑ€ÐµÐ¹Ð´Ñ Ð² конвейерный режим, нельзÑ" -#: fe-exec.c:3189 +#: fe-exec.c:3422 msgid "invalid ExecStatusType code" msgstr "неверный код ExecStatusType" -#: fe-exec.c:3216 +#: fe-exec.c:3449 msgid "PGresult is not an error result\n" msgstr "Ð’ PGresult не передан результат ошибки\n" -#: fe-exec.c:3284 fe-exec.c:3307 +#: fe-exec.c:3517 fe-exec.c:3540 #, c-format msgid "column number %d is out of range 0..%d" msgstr "номер Ñтолбца %d вне диапазона 0..%d" -#: fe-exec.c:3322 +#: fe-exec.c:3555 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "номер параметра %d вне диапазона 0..%d" -#: fe-exec.c:3632 +#: fe-exec.c:3866 #, c-format msgid "could not interpret result from server: %s" msgstr "не удалоÑÑŒ интерпретировать ответ Ñервера: %s" -#: fe-exec.c:3892 fe-exec.c:3981 -msgid "incomplete multibyte character\n" -msgstr "неполный многобайтный Ñимвол\n" +#: fe-exec.c:4140 fe-exec.c:4253 +#, c-format +msgid "incomplete multibyte character" +msgstr "неполный многобайтный Ñимвол" + +#: fe-exec.c:4142 fe-exec.c:4272 +#, c-format +msgid "invalid multibyte character" +msgstr "неверный многобайтный Ñимвол" -#: fe-gssapi-common.c:124 +#: fe-gssapi-common.c:122 msgid "GSSAPI name import error" msgstr "ошибка импорта имени в GSSAPI" -#: fe-lobj.c:145 fe-lobj.c:210 fe-lobj.c:403 fe-lobj.c:494 fe-lobj.c:568 -#: fe-lobj.c:969 fe-lobj.c:977 fe-lobj.c:985 fe-lobj.c:993 fe-lobj.c:1001 -#: fe-lobj.c:1009 fe-lobj.c:1017 fe-lobj.c:1025 +#: fe-lobj.c:144 fe-lobj.c:207 fe-lobj.c:397 fe-lobj.c:487 fe-lobj.c:560 +#: fe-lobj.c:956 fe-lobj.c:963 fe-lobj.c:970 fe-lobj.c:977 fe-lobj.c:984 +#: fe-lobj.c:991 fe-lobj.c:998 fe-lobj.c:1005 #, c-format -msgid "cannot determine OID of function %s\n" -msgstr "определить OID функции %s нельзÑ\n" +msgid "cannot determine OID of function %s" +msgstr "определить OID функции %s нельзÑ" -#: fe-lobj.c:162 -msgid "argument of lo_truncate exceeds integer range\n" -msgstr "аргумент lo_truncate не умещаетÑÑ Ð² обычном целом\n" +#: fe-lobj.c:160 +#, c-format +msgid "argument of lo_truncate exceeds integer range" +msgstr "аргумент lo_truncate не умещаетÑÑ Ð² обычном целом" -#: fe-lobj.c:266 -msgid "argument of lo_read exceeds integer range\n" -msgstr "аргумент lo_read не умещаетÑÑ Ð² обычном целом\n" +#: fe-lobj.c:262 +#, c-format +msgid "argument of lo_read exceeds integer range" +msgstr "аргумент lo_read не умещаетÑÑ Ð² обычном целом" -#: fe-lobj.c:318 -msgid "argument of lo_write exceeds integer range\n" -msgstr "аргумент lo_write не умещаетÑÑ Ð² обычном целом\n" +#: fe-lobj.c:313 +#, c-format +msgid "argument of lo_write exceeds integer range" +msgstr "аргумент lo_write не умещаетÑÑ Ð² обычном целом" -#: fe-lobj.c:678 fe-lobj.c:789 +#: fe-lobj.c:669 fe-lobj.c:780 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "не удалоÑÑŒ открыть файл \"%s\": %s\n" +msgid "could not open file \"%s\": %s" +msgstr "не удалоÑÑŒ открыть файл \"%s\": %s" -#: fe-lobj.c:734 +#: fe-lobj.c:725 #, c-format -msgid "could not read from file \"%s\": %s\n" -msgstr "не удалоÑÑŒ прочитать файл \"%s\": %s\n" +msgid "could not read from file \"%s\": %s" +msgstr "не удалоÑÑŒ прочитать файл \"%s\": %s" -#: fe-lobj.c:810 fe-lobj.c:834 +#: fe-lobj.c:801 fe-lobj.c:824 #, c-format -msgid "could not write to file \"%s\": %s\n" -msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %s\n" +msgid "could not write to file \"%s\": %s" +msgstr "не удалоÑÑŒ запиÑать файл \"%s\": %s" -#: fe-lobj.c:920 -msgid "query to initialize large object functions did not return data\n" -msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ функций Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов не вернул данные\n" +#: fe-lobj.c:908 +#, c-format +msgid "query to initialize large object functions did not return data" +msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ функций Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… объектов не вернул данные" -#: fe-misc.c:242 +#: fe-misc.c:239 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ pqGetInt не поддерживает integer размером %lu байт" -#: fe-misc.c:275 +#: fe-misc.c:272 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ pqPutInt не поддерживает integer размером %lu байт" -#: fe-misc.c:576 fe-misc.c:822 -msgid "connection not open\n" -msgstr "Ñоединение не открыто\n" - -#: fe-misc.c:755 fe-secure-openssl.c:209 fe-secure-openssl.c:316 -#: fe-secure.c:260 fe-secure.c:373 +#: fe-misc.c:750 fe-secure-openssl.c:203 fe-secure-openssl.c:309 +#: fe-secure.c:237 fe-secure.c:404 +#, c-format msgid "" "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" -"\tbefore or while processing the request.\n" +"\tbefore or while processing the request." msgstr "" "Ñервер неожиданно закрыл Ñоединение\n" "\tСкорее вÑего Ñервер прекратил работу из-за ÑбоÑ\n" -"\tдо или в процеÑÑе Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа.\n" +"\tдо или в процеÑÑе Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа." -#: fe-misc.c:1015 -msgid "timeout expired\n" -msgstr "тайм-аут\n" +#: fe-misc.c:817 +msgid "connection not open\n" +msgstr "Ñоединение не открыто\n" + +#: fe-misc.c:1005 +#, c-format +msgid "timeout expired" +msgstr "тайм-аут" -#: fe-misc.c:1060 -msgid "invalid socket\n" -msgstr "неверный Ñокет\n" +#: fe-misc.c:1049 +#, c-format +msgid "invalid socket" +msgstr "неверный Ñокет" -#: fe-misc.c:1083 +#: fe-misc.c:1071 #, c-format -msgid "%s() failed: %s\n" -msgstr "ошибка в %s(): %s\n" +msgid "%s() failed: %s" +msgstr "ошибка в %s(): %s" -#: fe-protocol3.c:196 +#: fe-protocol3.c:187 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "от Ñервера во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾ÑÑ‚Ð¾Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¾ Ñообщение типа 0x%02x" -#: fe-protocol3.c:403 +#: fe-protocol3.c:402 +#, c-format msgid "" "server sent data (\"D\" message) without prior row description (\"T\" " -"message)\n" +"message)" msgstr "" "Ñервер отправил данные (Ñообщение \"D\") без предварительного опиÑÐ°Ð½Ð¸Ñ " -"Ñтроки (Ñообщение \"T\")\n" +"Ñтроки (Ñообщение \"T\")" -#: fe-protocol3.c:446 +#: fe-protocol3.c:444 #, c-format -msgid "unexpected response from server; first received character was \"%c\"\n" -msgstr "неожиданный ответ Ñервера; первый полученный Ñимвол: \"%c\"\n" +msgid "unexpected response from server; first received character was \"%c\"" +msgstr "неожиданный ответ Ñервера; первый полученный Ñимвол: \"%c\"" -#: fe-protocol3.c:471 +#: fe-protocol3.c:467 #, c-format -msgid "message contents do not agree with length in message type \"%c\"\n" -msgstr "Ñодержимое не ÑоответÑтвует длине в Ñообщении типа \"%c\"\n" +msgid "message contents do not agree with length in message type \"%c\"" +msgstr "Ñодержимое не ÑоответÑтвует длине в Ñообщении типа \"%c\"" -#: fe-protocol3.c:491 +#: fe-protocol3.c:485 #, c-format -msgid "lost synchronization with server: got message type \"%c\", length %d\n" +msgid "lost synchronization with server: got message type \"%c\", length %d" msgstr "" -"потерÑна ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ Ñервером: получено Ñообщение типа \"%c\", длина %d\n" +"потерÑна ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ Ñервером: получено Ñообщение типа \"%c\", длина %d" -#: fe-protocol3.c:543 fe-protocol3.c:583 +#: fe-protocol3.c:537 fe-protocol3.c:577 msgid "insufficient data in \"T\" message" msgstr "недоÑтаточно данных в Ñообщении \"T\"" -#: fe-protocol3.c:654 fe-protocol3.c:860 +#: fe-protocol3.c:648 fe-protocol3.c:854 msgid "out of memory for query result" msgstr "недоÑтаточно памÑти Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð° запроÑа" -#: fe-protocol3.c:723 +#: fe-protocol3.c:717 msgid "insufficient data in \"t\" message" msgstr "недоÑтаточно данных в Ñообщении \"t\"" -#: fe-protocol3.c:782 fe-protocol3.c:814 fe-protocol3.c:832 +#: fe-protocol3.c:776 fe-protocol3.c:808 fe-protocol3.c:826 msgid "insufficient data in \"D\" message" msgstr "недоÑтаточно данных в Ñообщении \"D\"" -#: fe-protocol3.c:788 +#: fe-protocol3.c:782 msgid "unexpected field count in \"D\" message" msgstr "неверное чиÑло полей в Ñообщении \"D\"" -#: fe-protocol3.c:1036 +#: fe-protocol3.c:1037 msgid "no error message available\n" msgstr "нет ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибке\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1084 fe-protocol3.c:1103 +#: fe-protocol3.c:1085 fe-protocol3.c:1104 #, c-format msgid " at character %s" msgstr " Ñимвол %s" -#: fe-protocol3.c:1116 +#: fe-protocol3.c:1117 #, c-format msgid "DETAIL: %s\n" msgstr "ПОДРОБÐОСТИ: %s\n" -#: fe-protocol3.c:1119 +#: fe-protocol3.c:1120 #, c-format msgid "HINT: %s\n" msgstr "ПОДСКÐЗКÐ: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1123 #, c-format msgid "QUERY: %s\n" msgstr "ЗÐПРОС: %s\n" -#: fe-protocol3.c:1129 +#: fe-protocol3.c:1130 #, c-format msgid "CONTEXT: %s\n" msgstr "КОÐТЕКСТ: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1139 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "СХЕМÐ: %s\n" -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1143 #, c-format msgid "TABLE NAME: %s\n" msgstr "ТÐБЛИЦÐ: %s\n" -#: fe-protocol3.c:1146 +#: fe-protocol3.c:1147 #, c-format msgid "COLUMN NAME: %s\n" msgstr "СТОЛБЕЦ: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1151 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "ТИП ДÐÐÐЫХ: %s\n" -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1155 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "ОГРÐÐИЧЕÐИЕ: %s\n" -#: fe-protocol3.c:1166 +#: fe-protocol3.c:1167 msgid "LOCATION: " msgstr "ПОЛОЖЕÐИЕ: " -#: fe-protocol3.c:1168 +#: fe-protocol3.c:1169 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1171 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1365 +#: fe-protocol3.c:1366 #, c-format msgid "LINE %d: " msgstr "СТРОКР%d: " -#: fe-protocol3.c:1764 -msgid "PQgetline: not doing text COPY OUT\n" -msgstr "PQgetline можно вызывать только во Ð²Ñ€ÐµÐ¼Ñ COPY OUT Ñ Ñ‚ÐµÐºÑтом\n" +#: fe-protocol3.c:1440 +#, c-format +msgid "" +"protocol version not supported by server: client uses %u.%u, server supports " +"up to %u.%u" +msgstr "" +"Ñервер не поддерживает нужную верÑию протокола: клиент иÑпользует %u.%u, " +"Ñервер поддерживает верÑии до %u.%u" -#: fe-protocol3.c:2130 +#: fe-protocol3.c:1446 #, c-format -msgid "protocol error: id=0x%x\n" -msgstr "ошибка протокола: id=0x%x\n" +msgid "protocol extension not supported by server: %s" +msgid_plural "protocol extensions not supported by server: %s" +msgstr[0] "Ñервер не поддерживает Ñто раÑширение протокола: %s" +msgstr[1] "Ñервер не поддерживает Ñти раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð°: %s" +msgstr[2] "Ñервер не поддерживает Ñти раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ð°: %s" -#: fe-secure-common.c:124 -msgid "SSL certificate's name contains embedded null\n" -msgstr "Ð¸Ð¼Ñ Ð² SSL-Ñертификате включает нулевой байт\n" +#: fe-protocol3.c:1454 +#, c-format +msgid "invalid %s message" +msgstr "неверное Ñообщение %s" -#: fe-secure-common.c:171 -msgid "host name must be specified for a verified SSL connection\n" -msgstr "Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÐ½Ð½Ð¾Ð³Ð¾ SSL-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð°\n" +#: fe-protocol3.c:1819 +#, c-format +msgid "PQgetline: not doing text COPY OUT" +msgstr "PQgetline можно вызывать только во Ð²Ñ€ÐµÐ¼Ñ COPY OUT Ñ Ñ‚ÐµÐºÑтом" -#: fe-secure-common.c:196 +#: fe-protocol3.c:2193 #, c-format -msgid "server certificate for \"%s\" does not match host name \"%s\"\n" -msgstr "" -"Ñерверный Ñертификат Ð´Ð»Ñ \"%s\" не ÑоответÑтвует имени Ñервера \"%s\"\n" +msgid "protocol error: no function result" +msgstr "ошибка протокола: нет результата функции" -#: fe-secure-common.c:202 -msgid "could not get server's host name from server certificate\n" -msgstr "не удалоÑÑŒ получить Ð¸Ð¼Ñ Ñервера из Ñертификата\n" +#: fe-protocol3.c:2204 +#, c-format +msgid "protocol error: id=0x%x" +msgstr "ошибка протокола: id=0x%x" -#: fe-secure-gssapi.c:201 +#: fe-secure-common.c:123 +#, c-format +msgid "SSL certificate's name contains embedded null" +msgstr "Ð¸Ð¼Ñ Ð² SSL-Ñертификате включает нулевой байт" + +#: fe-secure-common.c:228 +#, c-format +msgid "certificate contains IP address with invalid length %zu" +msgstr "Ñертификат Ñодержит IP-Ð°Ð´Ñ€ÐµÑ Ð½ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ длины %zu" + +#: fe-secure-common.c:237 +#, c-format +msgid "could not convert certificate's IP address to string: %s" +msgstr "не удалоÑÑŒ преобразовать в Ñтроку IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ð· Ñертификата: %s" + +#: fe-secure-common.c:269 +#, c-format +msgid "host name must be specified for a verified SSL connection" +msgstr "Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÐ½Ð½Ð¾Ð³Ð¾ SSL-ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ указыватьÑÑ Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð°" + +#: fe-secure-common.c:286 +#, c-format +msgid "" +"server certificate for \"%s\" (and %d other name) does not match host name " +"\"%s\"" +msgid_plural "" +"server certificate for \"%s\" (and %d other names) does not match host name " +"\"%s\"" +msgstr[0] "" +"Ñерверный Ñертификат Ð´Ð»Ñ \"%s\" (и %d другого имени) не ÑоответÑтвует имени " +"Ñервера \"%s\"" +msgstr[1] "" +"Ñерверный Ñертификат Ð´Ð»Ñ \"%s\" (и %d других имён) не ÑоответÑтвует имени " +"Ñервера \"%s\"" +msgstr[2] "" +"Ñерверный Ñертификат Ð´Ð»Ñ \"%s\" (и %d других имён) не ÑоответÑтвует имени " +"Ñервера \"%s\"" + +#: fe-secure-common.c:294 +#, c-format +msgid "server certificate for \"%s\" does not match host name \"%s\"" +msgstr "Ñерверный Ñертификат Ð´Ð»Ñ \"%s\" не ÑоответÑтвует имени Ñервера \"%s\"" + +#: fe-secure-common.c:299 +#, c-format +msgid "could not get server's host name from server certificate" +msgstr "не удалоÑÑŒ получить Ð¸Ð¼Ñ Ñервера из Ñерверного Ñертификата" + +#: fe-secure-gssapi.c:194 msgid "GSSAPI wrap error" msgstr "ошибка Ð¾Ð±Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² GSSAPI" -#: fe-secure-gssapi.c:209 -msgid "outgoing GSSAPI message would not use confidentiality\n" -msgstr "иÑходÑщее Ñообщение GSSAPI не будет защищено\n" +#: fe-secure-gssapi.c:201 +#, c-format +msgid "outgoing GSSAPI message would not use confidentiality" +msgstr "иÑходÑщее Ñообщение GSSAPI не будет защищено" -#: fe-secure-gssapi.c:217 +#: fe-secure-gssapi.c:208 #, c-format -msgid "client tried to send oversize GSSAPI packet (%zu > %zu)\n" -msgstr "клиент попыталÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ чрезмерно большой пакет GSSAPI (%zu > %zu)\n" +msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" +msgstr "клиент попыталÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ чрезмерно большой пакет GSSAPI (%zu > %zu)" -#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:596 +#: fe-secure-gssapi.c:347 fe-secure-gssapi.c:589 #, c-format -msgid "oversize GSSAPI packet sent by the server (%zu > %zu)\n" -msgstr "Ñервер передал чрезмерно большой пакет GSSAPI (%zu > %zu)\n" +msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" +msgstr "Ñервер передал чрезмерно большой пакет GSSAPI (%zu > %zu)" -#: fe-secure-gssapi.c:393 +#: fe-secure-gssapi.c:386 msgid "GSSAPI unwrap error" msgstr "ошибка Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚Ñ‹Ð²Ð°Ð½Ð¸Ñ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² GSSAPI" -#: fe-secure-gssapi.c:403 -msgid "incoming GSSAPI message did not use confidentiality\n" -msgstr "входÑщее Ñообщение GSSAPI не защищено\n" +#: fe-secure-gssapi.c:395 +#, c-format +msgid "incoming GSSAPI message did not use confidentiality" +msgstr "входÑщее Ñообщение GSSAPI не защищено" -#: fe-secure-gssapi.c:642 +#: fe-secure-gssapi.c:652 msgid "could not initiate GSSAPI security context" msgstr "не удалоÑÑŒ инициализировать контекÑÑ‚ безопаÑноÑти GSSAPI" -#: fe-secure-gssapi.c:670 +#: fe-secure-gssapi.c:681 msgid "GSSAPI size check error" msgstr "ошибка проверки размера в GSSAPI" -#: fe-secure-gssapi.c:681 +#: fe-secure-gssapi.c:692 msgid "GSSAPI context establishment error" msgstr "ошибка уÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐºÑта в GSSAPI" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1333 +#: fe-secure-openssl.c:207 fe-secure-openssl.c:313 fe-secure-openssl.c:1524 #, c-format -msgid "SSL SYSCALL error: %s\n" -msgstr "ошибка SSL SYSCALL: %s\n" +msgid "SSL SYSCALL error: %s" +msgstr "ошибка SSL SYSCALL: %s" -#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1337 -msgid "SSL SYSCALL error: EOF detected\n" -msgstr "ошибка SSL SYSCALL: конец файла (EOF)\n" +#: fe-secure-openssl.c:213 fe-secure-openssl.c:319 fe-secure-openssl.c:1527 +#, c-format +msgid "SSL SYSCALL error: EOF detected" +msgstr "ошибка SSL SYSCALL: конец файла (EOF)" -#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1346 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:329 fe-secure-openssl.c:1535 #, c-format -msgid "SSL error: %s\n" -msgstr "ошибка SSL: %s\n" +msgid "SSL error: %s" +msgstr "ошибка SSL: %s" -#: fe-secure-openssl.c:247 fe-secure-openssl.c:354 -msgid "SSL connection has been closed unexpectedly\n" -msgstr "SSL-Ñоединение было неожиданно закрыто\n" +#: fe-secure-openssl.c:237 fe-secure-openssl.c:343 +#, c-format +msgid "SSL connection has been closed unexpectedly" +msgstr "SSL-Ñоединение было неожиданно закрыто" + +#: fe-secure-openssl.c:242 fe-secure-openssl.c:348 fe-secure-openssl.c:1582 +#, c-format +msgid "unrecognized SSL error code: %d" +msgstr "нераÑпознанный код ошибки SSL: %d" -#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1396 +#: fe-secure-openssl.c:390 #, c-format -msgid "unrecognized SSL error code: %d\n" -msgstr "нераÑпознанный код ошибки SSL: %d\n" +msgid "could not determine server certificate signature algorithm" +msgstr "не удалоÑÑŒ определить алгоритм подпиÑи Ñертификата Ñервера" -#: fe-secure-openssl.c:400 -msgid "could not determine server certificate signature algorithm\n" -msgstr "не удалоÑÑŒ определить алгоритм подпиÑи Ñертификата Ñервера\n" +#: fe-secure-openssl.c:410 +#, c-format +msgid "could not find digest for NID %s" +msgstr "не удалоÑÑŒ найти алгоритм Ñ…ÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ NID %s" -#: fe-secure-openssl.c:421 +#: fe-secure-openssl.c:419 #, c-format -msgid "could not find digest for NID %s\n" -msgstr "не удалоÑÑŒ найти алгоритм Ñ…ÐµÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ NID %s\n" +msgid "could not generate peer certificate hash" +msgstr "не удалоÑÑŒ Ñгенерировать хеш Ñертификата Ñервера" -#: fe-secure-openssl.c:431 -msgid "could not generate peer certificate hash\n" -msgstr "не удалоÑÑŒ Ñгенерировать хеш Ñертификата Ñервера\n" +#: fe-secure-openssl.c:501 +#, c-format +msgid "SSL certificate's name entry is missing" +msgstr "в SSL-Ñертификате отÑутÑтвует запиÑÑŒ имени" + +#: fe-secure-openssl.c:535 +#, c-format +msgid "SSL certificate's address entry is missing" +msgstr "в SSL-Ñертификате отÑутÑтвует запиÑÑŒ адреÑа" -#: fe-secure-openssl.c:488 -msgid "SSL certificate's name entry is missing\n" -msgstr "запиÑÑŒ имени в SSL-Ñертификате отÑутÑтвует\n" +#: fe-secure-openssl.c:935 +#, c-format +msgid "could not create SSL context: %s" +msgstr "не удалоÑÑŒ Ñоздать контекÑÑ‚ SSL: %s" -#: fe-secure-openssl.c:822 +#: fe-secure-openssl.c:977 #, c-format -msgid "could not create SSL context: %s\n" -msgstr "не удалоÑÑŒ Ñоздать контекÑÑ‚ SSL: %s\n" +msgid "invalid value \"%s\" for minimum SSL protocol version" +msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð¹ верÑии протокола SSL" -#: fe-secure-openssl.c:861 +#: fe-secure-openssl.c:987 #, c-format -msgid "invalid value \"%s\" for minimum SSL protocol version\n" -msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð¹ верÑии протокола SSL\n" +msgid "could not set minimum SSL protocol version: %s" +msgstr "не удалоÑÑŒ задать минимальную верÑию протокола SSL: %s" -#: fe-secure-openssl.c:872 +#: fe-secure-openssl.c:1003 #, c-format -msgid "could not set minimum SSL protocol version: %s\n" -msgstr "не удалоÑÑŒ задать минимальную верÑию протокола SSL: %s\n" +msgid "invalid value \"%s\" for maximum SSL protocol version" +msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¼Ð°ÐºÑимальной верÑии протокола SSL" -#: fe-secure-openssl.c:890 +#: fe-secure-openssl.c:1013 #, c-format -msgid "invalid value \"%s\" for maximum SSL protocol version\n" -msgstr "неверное значение \"%s\" Ð´Ð»Ñ Ð¼Ð°ÐºÑимальной верÑии протокола SSL\n" +msgid "could not set maximum SSL protocol version: %s" +msgstr "не удалоÑÑŒ задать макÑимальную верÑию протокола SSL: %s" -#: fe-secure-openssl.c:901 +#: fe-secure-openssl.c:1051 #, c-format -msgid "could not set maximum SSL protocol version: %s\n" -msgstr "не удалоÑÑŒ задать макÑимальную верÑию протокола SSL: %s\n" +msgid "could not load system root certificate paths: %s" +msgstr "не удалоÑÑŒ выбрать ÑиÑтемные пути Ð´Ð»Ñ ÐºÐ¾Ñ€Ð½ÐµÐ²Ñ‹Ñ… Ñертификатов: %s" -#: fe-secure-openssl.c:937 +#: fe-secure-openssl.c:1068 #, c-format -msgid "could not read root certificate file \"%s\": %s\n" -msgstr "не удалоÑÑŒ прочитать файл корневых Ñертификатов \"%s\": %s\n" +msgid "could not read root certificate file \"%s\": %s" +msgstr "не удалоÑÑŒ прочитать файл корневых Ñертификатов \"%s\": %s" -#: fe-secure-openssl.c:990 +#: fe-secure-openssl.c:1120 +#, c-format msgid "" "could not get home directory to locate root certificate file\n" -"Either provide the file or change sslmode to disable server certificate " -"verification.\n" +"Either provide the file, use the system's trusted roots with " +"sslrootcert=system, or change sslmode to disable server certificate " +"verification." msgstr "" "не удалоÑÑŒ получить домашний каталог Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка файла корневых Ñертификатов\n" -"Укажите полный путь к файлу или отключите проверку Ñертификата Ñервера, " -"изменив sslmode.\n" +"Укажите полный путь к файлу, иÑпользуйте ÑиÑтемные доверенные Ñертификаты " +"(sslrootcert=system) или отключите проверку Ñертификата Ñервера, изменив " +"sslmode." -#: fe-secure-openssl.c:994 +#: fe-secure-openssl.c:1123 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" -"Either provide the file or change sslmode to disable server certificate " -"verification.\n" +"Either provide the file, use the system's trusted roots with " +"sslrootcert=system, or change sslmode to disable server certificate " +"verification." msgstr "" "файл корневых Ñертификатов \"%s\" не ÑущеÑтвует\n" -"Укажите полный путь к файлу или отключите проверку Ñертификата Ñервера, " -"изменив sslmode.\n" +"Укажите полный путь к файлу, иÑпользуйте ÑиÑтемные доверенные Ñертификаты " +"(sslrootcert=system) или отключите проверку Ñертификата Ñервера, изменив " +"sslmode." -#: fe-secure-openssl.c:1025 +#: fe-secure-openssl.c:1158 #, c-format -msgid "could not open certificate file \"%s\": %s\n" -msgstr "не удалоÑÑŒ открыть файл Ñертификата \"%s\": %s\n" +msgid "could not open certificate file \"%s\": %s" +msgstr "не удалоÑÑŒ открыть файл Ñертификата \"%s\": %s" -#: fe-secure-openssl.c:1044 +#: fe-secure-openssl.c:1176 #, c-format -msgid "could not read certificate file \"%s\": %s\n" -msgstr "не удалоÑÑŒ прочитать файл Ñертификата \"%s\": %s\n" +msgid "could not read certificate file \"%s\": %s" +msgstr "не удалоÑÑŒ прочитать файл Ñертификата \"%s\": %s" -#: fe-secure-openssl.c:1069 +#: fe-secure-openssl.c:1200 #, c-format -msgid "could not establish SSL connection: %s\n" -msgstr "не удалоÑÑŒ уÑтановить SSL-Ñоединение: %s\n" +msgid "could not establish SSL connection: %s" +msgstr "не удалоÑÑŒ уÑтановить SSL-Ñоединение: %s" -#: fe-secure-openssl.c:1103 +#: fe-secure-openssl.c:1232 #, c-format -msgid "could not set SSL Server Name Indication (SNI): %s\n" -msgstr "" -"не удалоÑÑŒ задать SNI (Server Name Indication) Ð´Ð»Ñ SSL-подключениÑ: %s\n" +msgid "could not set SSL Server Name Indication (SNI): %s" +msgstr "не удалоÑÑŒ задать SNI (Server Name Indication) Ð´Ð»Ñ SSL-подключениÑ: %s" + +#: fe-secure-openssl.c:1249 +#, c-format +msgid "could not set SSL ALPN extension: %s" +msgstr "не удалоÑÑŒ уÑтановить раÑширение SSL ALPN: %s" + +#: fe-secure-openssl.c:1292 +#, c-format +msgid "could not load SSL engine \"%s\": %s" +msgstr "не удалоÑÑŒ загрузить модуль SSL ENGINE \"%s\": %s" -#: fe-secure-openssl.c:1149 +#: fe-secure-openssl.c:1303 #, c-format -msgid "could not load SSL engine \"%s\": %s\n" -msgstr "не удалоÑÑŒ загрузить модуль SSL ENGINE \"%s\": %s\n" +msgid "could not initialize SSL engine \"%s\": %s" +msgstr "не удалоÑÑŒ инициализировать модуль SSL ENGINE \"%s\": %s" -#: fe-secure-openssl.c:1161 +#: fe-secure-openssl.c:1318 #, c-format -msgid "could not initialize SSL engine \"%s\": %s\n" -msgstr "не удалоÑÑŒ инициализировать модуль SSL ENGINE \"%s\": %s\n" +msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" +msgstr "не удалоÑÑŒ прочитать закрытый ключ SSL \"%s\" из Ð¼Ð¾Ð´ÑƒÐ»Ñ \"%s\": %s" -#: fe-secure-openssl.c:1177 +#: fe-secure-openssl.c:1331 #, c-format -msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "не удалоÑÑŒ прочитать закрытый ключ SSL \"%s\" из Ð¼Ð¾Ð´ÑƒÐ»Ñ \"%s\": %s\n" +msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" +msgstr "не удалоÑÑŒ загрузить закрытый ключ SSL \"%s\" из Ð¼Ð¾Ð´ÑƒÐ»Ñ \"%s\": %s" -#: fe-secure-openssl.c:1191 +#: fe-secure-openssl.c:1368 #, c-format -msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "не удалоÑÑŒ загрузить закрытый ключ SSL \"%s\" из Ð¼Ð¾Ð´ÑƒÐ»Ñ \"%s\": %s\n" +msgid "certificate present, but not private key file \"%s\"" +msgstr "при наличии Ñертификата отÑутÑтвует файл закрытого ключа \"%s\"" -#: fe-secure-openssl.c:1228 +#: fe-secure-openssl.c:1371 #, c-format -msgid "certificate present, but not private key file \"%s\"\n" -msgstr "Ñертификат приÑутÑтвует, но файла закрытого ключа \"%s\" нет\n" +msgid "could not stat private key file \"%s\": %m" +msgstr "не удалоÑÑŒ получить информацию о файле закрытого ключа \"%s\": %m" -#: fe-secure-openssl.c:1236 +#: fe-secure-openssl.c:1379 +#, c-format +msgid "private key file \"%s\" is not a regular file" +msgstr "файл закрытого ключа \"%s\" - не обычный файл" + +#: fe-secure-openssl.c:1412 #, c-format msgid "" -"private key file \"%s\" has group or world access; permissions should be " -"u=rw (0600) or less\n" +"private key file \"%s\" has group or world access; file must have " +"permissions u=rw (0600) or less if owned by the current user, or permissions " +"u=rw,g=r (0640) or less if owned by root" msgstr "" -"к файлу закрытого ключа \"%s\" имеют доÑтуп вÑе или группа; права должны " -"быть u=rw (0600) или более ограниченные\n" +"к файлу закрытого ключа \"%s\" имеют доÑтуп вÑе или группа; Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ должны " +"быть заданы Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ u=rw (0600) или более Ñтрогие, еÑли он принадлежит " +"текущему пользователю, либо u=rw,g=r (0640) или более Ñтрогие, еÑли он " +"принадлежит root" -#: fe-secure-openssl.c:1261 +#: fe-secure-openssl.c:1436 #, c-format -msgid "could not load private key file \"%s\": %s\n" -msgstr "не удалоÑÑŒ загрузить файл закрытого ключа \"%s\": %s\n" +msgid "could not load private key file \"%s\": %s" +msgstr "не удалоÑÑŒ загрузить файл закрытого ключа \"%s\": %s" -#: fe-secure-openssl.c:1279 +#: fe-secure-openssl.c:1452 #, c-format -msgid "certificate does not match private key file \"%s\": %s\n" -msgstr "Ñертификат не ÑоответÑтвует файлу закрытого ключа \"%s\": %s\n" +msgid "certificate does not match private key file \"%s\": %s" +msgstr "Ñертификат не ÑоответÑтвует файлу закрытого ключа \"%s\": %s" -#: fe-secure-openssl.c:1379 +#: fe-secure-openssl.c:1521 +#, c-format +msgid "SSL error: certificate verify failed: %s" +msgstr "ошибка SSL: не удалоÑÑŒ проверить Ñертификат: %s" + +#: fe-secure-openssl.c:1566 #, c-format msgid "" "This may indicate that the server does not support any SSL protocol version " -"between %s and %s.\n" +"between %s and %s." msgstr "" "Это может указывать на то, что Ñервер не поддерживает ни одну верÑию " -"протокола SSL между %s и %s.\n" +"протокола SSL между %s и %s." -#: fe-secure-openssl.c:1415 +#: fe-secure-openssl.c:1598 #, c-format -msgid "certificate could not be obtained: %s\n" -msgstr "не удалоÑÑŒ получить Ñертификат: %s\n" +msgid "" +"direct SSL connection was established without ALPN protocol negotiation " +"extension" +msgstr "прÑмое SSL-Ñоединение было уÑтановлено без раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ ALPN" -#: fe-secure-openssl.c:1521 +#: fe-secure-openssl.c:1610 +#, c-format +msgid "SSL connection was established with unexpected ALPN protocol" +msgstr "SSL-Ñоединение было уÑтановлено Ñ Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ñ‹Ð¼ протоколом ALPN" + +#: fe-secure-openssl.c:1627 +#, c-format +msgid "certificate could not be obtained: %s" +msgstr "не удалоÑÑŒ получить Ñертификат: %s" + +#: fe-secure-openssl.c:1734 #, c-format msgid "no SSL error reported" msgstr "нет ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибке SSL" -#: fe-secure-openssl.c:1530 +#: fe-secure-openssl.c:1777 #, c-format msgid "SSL error code %lu" msgstr "код ошибки SSL: %lu" -#: fe-secure-openssl.c:1778 +#: fe-secure-openssl.c:2076 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ПРЕДУПРЕЖДЕÐИЕ: значение sslpassword уÑечено\n" -#: fe-secure.c:267 +#: fe-secure.c:248 #, c-format -msgid "could not receive data from server: %s\n" -msgstr "не удалоÑÑŒ получить данные Ñ Ñервера: %s\n" +msgid "could not receive data from server: %s" +msgstr "не удалоÑÑŒ получить данные Ñ Ñервера: %s" -#: fe-secure.c:380 +#: fe-secure.c:419 #, c-format -msgid "could not send data to server: %s\n" -msgstr "не удалоÑÑŒ передать данные Ñерверу: %s\n" +msgid "could not send data to server: %s" +msgstr "не удалоÑÑŒ передать данные Ñерверу: %s" -#: win32.c:314 +#: win32.c:310 #, c-format msgid "unrecognized socket error: 0x%08X/%d" msgstr "нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñокета: 0x%08X/%d" +#, c-format +#~ msgid "keepalives parameter must be an integer" +#~ msgstr "параметр keepalives должен быть целым чиÑлом" + +#~ msgid "SCM_CRED authentication method not supported\n" +#~ msgstr "Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ SCM_CRED не поддерживаетÑÑ\n" + +#~ msgid "" +#~ "server sent data (\"D\" message) without prior row description (\"T\" " +#~ "message)\n" +#~ msgstr "" +#~ "Ñервер отправил данные (Ñообщение \"D\") без предварительного опиÑÐ°Ð½Ð¸Ñ " +#~ "Ñтроки (Ñообщение \"T\")\n" + +#~ msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" +#~ msgstr "ошибка в PGEventProc \"%s\" при обработке ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ PGEVT_CONNRESET\n" + +#~ msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" +#~ msgstr "" +#~ "ошибка в PGEventProc \"%s\" при обработке ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ PGEVT_RESULTCREATE\n" + #~ msgid "invalid channel_binding value: \"%s\"\n" #~ msgstr "неверное значение channel_binding: \"%s\"\n" @@ -1384,15 +1748,8 @@ msgstr "нераÑÐ¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° Ñокета: 0x%08X/%d" #~ msgstr "неожиданный Ñимвол %c вÑлед за пуÑтым ответом (Ñообщение \"I\")" #~ msgid "" -#~ "server sent data (\"D\" message) without prior row description (\"T\" " -#~ "message)" -#~ msgstr "" -#~ "Ñервер отправил данные (Ñообщение \"D\") без предварительного опиÑÐ°Ð½Ð¸Ñ " -#~ "Ñтроки (Ñообщение \"T\")" - -#~ msgid "" -#~ "server sent binary data (\"B\" message) without prior row description (\"T" -#~ "\" message)" +#~ "server sent binary data (\"B\" message) without prior row description " +#~ "(\"T\" message)" #~ msgstr "" #~ "Ñервер отправил двоичные данные (Ñообщение \"B\") без предварительного " #~ "опиÑÐ°Ð½Ð¸Ñ Ñтроки (Ñообщение \"T\")" diff --git a/src/interfaces/libpq/po/sv.po b/src/interfaces/libpq/po/sv.po index 2e4e904fce636..8cdf48ea6a8a7 100644 --- a/src/interfaces/libpq/po/sv.po +++ b/src/interfaces/libpq/po/sv.po @@ -1,15 +1,15 @@ # Swedish message translation file for libpq # Peter Eisentraut , 2001, 2010. -# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022. +# Dennis Björklund , 2002, 2003, 2004, 2005, 2006, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025. # # Use these quotes: "%s" # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-05-12 20:09+0000\n" -"PO-Revision-Date: 2022-04-11 22:47+0200\n" +"POT-Creation-Date: 2025-02-12 13:40+0000\n" +"PO-Revision-Date: 2025-02-12 20:36+0100\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -18,1243 +18,1518 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: ../../port/thread.c:100 ../../port/thread.c:136 +#: ../../port/user.c:43 ../../port/user.c:79 #, c-format msgid "could not look up local user ID %d: %s" msgstr "kunde inte slÃ¥ upp lokalt användar-id %d: %s" -#: ../../port/thread.c:105 ../../port/thread.c:141 +#: ../../port/user.c:48 ../../port/user.c:84 #, c-format msgid "local user with ID %d does not exist" msgstr "lokal användare med ID %d existerar inte" -#: fe-auth-scram.c:231 -msgid "malformed SCRAM message (empty message)\n" -msgstr "felaktigt SCRAM-meddelande (tomt meddelande)\n" - -#: fe-auth-scram.c:237 -msgid "malformed SCRAM message (length mismatch)\n" -msgstr "felaktigt SCRAM-meddelande (längden stämmer inte)\n" +#: fe-auth-scram.c:223 +#, c-format +msgid "malformed SCRAM message (empty message)" +msgstr "felaktigt SCRAM-meddelande (tomt meddelande)" -#: fe-auth-scram.c:281 +#: fe-auth-scram.c:228 #, c-format -msgid "could not verify server signature: %s\n" -msgstr "kunde inte verifiera serversignaturen: %s\n" +msgid "malformed SCRAM message (length mismatch)" +msgstr "felaktigt SCRAM-meddelande (längden stämmer inte)" -#: fe-auth-scram.c:288 -msgid "incorrect server signature\n" -msgstr "felaktig serversignatur\n" +#: fe-auth-scram.c:272 +#, c-format +msgid "could not verify server signature: %s" +msgstr "kunde inte verifiera serversignaturen: %s" -#: fe-auth-scram.c:297 -msgid "invalid SCRAM exchange state\n" -msgstr "ogiltig SCRAM-utbytesstatus\n" +#: fe-auth-scram.c:278 +#, c-format +msgid "incorrect server signature" +msgstr "felaktig serversignatur" -#: fe-auth-scram.c:324 +#: fe-auth-scram.c:287 #, c-format -msgid "malformed SCRAM message (attribute \"%c\" expected)\n" -msgstr "felaktigt SCRAM-meddelande (förväntade attribut %c)\n" +msgid "invalid SCRAM exchange state" +msgstr "ogiltig SCRAM-utbytesstatus" -#: fe-auth-scram.c:333 +#: fe-auth-scram.c:311 #, c-format -msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" -msgstr "felaktigt SCRAM-meddelande (förväntade tecken \"=\" för attribut '%c')\n" +msgid "malformed SCRAM message (attribute \"%c\" expected)" +msgstr "felaktigt SCRAM-meddelande (förväntade attribut \"%c\")" -#: fe-auth-scram.c:374 -msgid "could not generate nonce\n" -msgstr "kunde inte skapa engÃ¥ngsnummer\n" +#: fe-auth-scram.c:320 +#, c-format +msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")" +msgstr "felaktigt SCRAM-meddelande (förväntade tecken \"=\" för attribut \"%c\")" -#: fe-auth-scram.c:384 fe-auth-scram.c:459 fe-auth-scram.c:615 -#: fe-auth-scram.c:636 fe-auth-scram.c:662 fe-auth-scram.c:677 -#: fe-auth-scram.c:727 fe-auth-scram.c:766 fe-auth.c:290 fe-auth.c:362 -#: fe-auth.c:398 fe-auth.c:623 fe-auth.c:799 fe-auth.c:1152 fe-auth.c:1322 -#: fe-connect.c:907 fe-connect.c:1456 fe-connect.c:1625 fe-connect.c:2977 -#: fe-connect.c:4824 fe-connect.c:5085 fe-connect.c:5204 fe-connect.c:5456 -#: fe-connect.c:5537 fe-connect.c:5636 fe-connect.c:5892 fe-connect.c:5921 -#: fe-connect.c:5993 fe-connect.c:6017 fe-connect.c:6035 fe-connect.c:6136 -#: fe-connect.c:6145 fe-connect.c:6503 fe-connect.c:6653 fe-connect.c:6919 -#: fe-exec.c:710 fe-exec.c:976 fe-exec.c:1324 fe-exec.c:3135 fe-exec.c:3318 -#: fe-exec.c:4096 fe-exec.c:4261 fe-gssapi-common.c:111 fe-lobj.c:884 -#: fe-protocol3.c:985 fe-protocol3.c:1000 fe-protocol3.c:1033 -#: fe-protocol3.c:1741 fe-protocol3.c:2144 fe-secure-common.c:112 -#: fe-secure-gssapi.c:504 fe-secure-openssl.c:449 fe-secure-openssl.c:1261 -msgid "out of memory\n" -msgstr "slut pÃ¥ minne\n" +#: fe-auth-scram.c:360 +#, c-format +msgid "could not generate nonce" +msgstr "kunde inte skapa engÃ¥ngsnummer" -#: fe-auth-scram.c:392 -msgid "could not encode nonce\n" -msgstr "kunde inte koda engÃ¥ngsnummer\n" +#: fe-auth-scram.c:369 fe-auth-scram.c:442 fe-auth-scram.c:594 +#: fe-auth-scram.c:614 fe-auth-scram.c:638 fe-auth-scram.c:652 +#: fe-auth-scram.c:698 fe-auth-scram.c:734 fe-auth-scram.c:908 fe-auth.c:296 +#: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:727 fe-auth.c:1200 +#: fe-auth.c:1363 fe-cancel.c:159 fe-connect.c:936 fe-connect.c:976 +#: fe-connect.c:1860 fe-connect.c:2022 fe-connect.c:3430 fe-connect.c:4761 +#: fe-connect.c:5073 fe-connect.c:5328 fe-connect.c:5446 fe-connect.c:5693 +#: fe-connect.c:5773 fe-connect.c:5871 fe-connect.c:6122 fe-connect.c:6149 +#: fe-connect.c:6225 fe-connect.c:6248 fe-connect.c:6272 fe-connect.c:6307 +#: fe-connect.c:6393 fe-connect.c:6401 fe-connect.c:6758 fe-connect.c:6908 +#: fe-exec.c:530 fe-exec.c:1315 fe-exec.c:3254 fe-exec.c:4298 fe-exec.c:4464 +#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:209 fe-protocol3.c:232 +#: fe-protocol3.c:255 fe-protocol3.c:272 fe-protocol3.c:293 fe-protocol3.c:369 +#: fe-protocol3.c:737 fe-protocol3.c:976 fe-protocol3.c:1787 +#: fe-protocol3.c:2187 fe-secure-common.c:110 fe-secure-gssapi.c:496 +#: fe-secure-openssl.c:427 fe-secure-openssl.c:1277 +#, c-format +msgid "out of memory" +msgstr "slut pÃ¥ minne" -#: fe-auth-scram.c:582 +#: fe-auth-scram.c:376 #, c-format -msgid "could not calculate client proof: %s\n" -msgstr "kunde inte räkna ut klientbevis: %s\n" +msgid "could not encode nonce" +msgstr "kunde inte koda engÃ¥ngsnummer" -#: fe-auth-scram.c:599 -msgid "could not encode client proof\n" -msgstr "kunde inte koda klientbevis\n" +#: fe-auth-scram.c:564 +#, c-format +msgid "could not calculate client proof: %s" +msgstr "kunde inte räkna ut klientbevis: %s" -#: fe-auth-scram.c:654 -msgid "invalid SCRAM response (nonce mismatch)\n" -msgstr "ogiltigt SCRAM-svar (engÃ¥ngsnummer matchar inte)\n" +#: fe-auth-scram.c:579 +#, c-format +msgid "could not encode client proof" +msgstr "kunde inte koda klientbevis" -#: fe-auth-scram.c:687 -msgid "malformed SCRAM message (invalid salt)\n" -msgstr "felaktigt SCRAM-meddelande (ogiltigt salt)\n" +#: fe-auth-scram.c:631 +#, c-format +msgid "invalid SCRAM response (nonce mismatch)" +msgstr "ogiltigt SCRAM-svar (engÃ¥ngsnummer matchar inte)" -#: fe-auth-scram.c:701 -msgid "malformed SCRAM message (invalid iteration count)\n" -msgstr "felaktigt SCRAM-meddelande (ogiltig iterationsräknare)\n" +#: fe-auth-scram.c:661 +#, c-format +msgid "malformed SCRAM message (invalid salt)" +msgstr "felaktigt SCRAM-meddelande (ogiltigt salt)" -#: fe-auth-scram.c:707 -msgid "malformed SCRAM message (garbage at end of server-first-message)\n" -msgstr "felaktigt SCRAM-meddelande (skräp i slutet pÃ¥ server-first-message)\n" +#: fe-auth-scram.c:674 +#, c-format +msgid "malformed SCRAM message (invalid iteration count)" +msgstr "felaktigt SCRAM-meddelande (ogiltig iterationsräknare)" -#: fe-auth-scram.c:743 +#: fe-auth-scram.c:679 #, c-format -msgid "error received from server in SCRAM exchange: %s\n" -msgstr "fel mottaget frÃ¥n server i SCRAM-utbyte: %s\n" +msgid "malformed SCRAM message (garbage at end of server-first-message)" +msgstr "felaktigt SCRAM-meddelande (skräp i slutet pÃ¥ server-first-message)" -#: fe-auth-scram.c:759 -msgid "malformed SCRAM message (garbage at end of server-final-message)\n" -msgstr "felaktigt SCRAM-meddelande (skräp i slutet av server-final-message)\n" +#: fe-auth-scram.c:713 +#, c-format +msgid "error received from server in SCRAM exchange: %s" +msgstr "fel mottaget frÃ¥n server i SCRAM-utbyte: %s" -#: fe-auth-scram.c:778 -msgid "malformed SCRAM message (invalid server signature)\n" -msgstr "felaktigt SCRAM-meddelande (ogiltigt serversignatur)\n" +#: fe-auth-scram.c:728 +#, c-format +msgid "malformed SCRAM message (garbage at end of server-final-message)" +msgstr "felaktigt SCRAM-meddelande (skräp i slutet av server-final-message)" -#: fe-auth-scram.c:934 fe-exec.c:527 fe-protocol3.c:219 fe-protocol3.c:244 -#: fe-protocol3.c:273 fe-protocol3.c:291 fe-protocol3.c:372 fe-protocol3.c:745 -msgid "out of memory" -msgstr "slut pÃ¥ minne" +#: fe-auth-scram.c:745 +#, c-format +msgid "malformed SCRAM message (invalid server signature)" +msgstr "felaktigt SCRAM-meddelande (ogiltigt serversignatur)" -#: fe-auth-scram.c:943 -msgid "failed to generate random salt" -msgstr "misslyckades att generera slumpat salt" +#: fe-auth-scram.c:917 +msgid "could not generate random salt" +msgstr "kunde inte generera slumpat salt" -#: fe-auth.c:76 +#: fe-auth.c:77 #, c-format -msgid "out of memory allocating GSSAPI buffer (%d)\n" -msgstr "slut pÃ¥ minne vid allokering av buffer till GSSAPI (%d)\n" +msgid "out of memory allocating GSSAPI buffer (%d)" +msgstr "slut pÃ¥ minne vid allokering av buffer till GSSAPI (%d)" -#: fe-auth.c:131 +#: fe-auth.c:138 msgid "GSSAPI continuation error" msgstr "GSSAPI fortsättningsfel" -#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:100 -#: fe-secure-common.c:177 -msgid "host name must be specified\n" -msgstr "värdnamn mÃ¥ste anges\n" +#: fe-auth.c:168 fe-auth.c:397 fe-gssapi-common.c:97 fe-secure-common.c:99 +#: fe-secure-common.c:173 +#, c-format +msgid "host name must be specified" +msgstr "värdnamn mÃ¥ste anges" -#: fe-auth.c:165 -msgid "duplicate GSS authentication request\n" -msgstr "duplicerad autentiseringsbegäran frÃ¥n GSS\n" +#: fe-auth.c:174 +#, c-format +msgid "duplicate GSS authentication request" +msgstr "duplicerad autentiseringsbegäran frÃ¥n GSS" -#: fe-auth.c:230 +#: fe-auth.c:238 #, c-format -msgid "out of memory allocating SSPI buffer (%d)\n" -msgstr "slut pÃ¥ minne vid allokering av buffer till GSSAPI (%d)\n" +msgid "out of memory allocating SSPI buffer (%d)" +msgstr "slut pÃ¥ minne vid allokering av buffer till SSPI (%d)" -#: fe-auth.c:278 +#: fe-auth.c:285 msgid "SSPI continuation error" msgstr "SSPI fortsättningsfel" -#: fe-auth.c:351 -msgid "duplicate SSPI authentication request\n" -msgstr "duplicerad autentiseringsbegäran frÃ¥n SSPI\n" +#: fe-auth.c:359 +#, c-format +msgid "duplicate SSPI authentication request" +msgstr "duplicerad autentiseringsbegäran frÃ¥n SSPI" -#: fe-auth.c:377 +#: fe-auth.c:384 msgid "could not acquire SSPI credentials" -msgstr "kunde inte hämta SSPI-referenser" +msgstr "kunde inte hämta SSPI-autentiseringsuppgifter" -#: fe-auth.c:433 -msgid "channel binding required, but SSL not in use\n" -msgstr "kräver kanalbindning, men SSL används inte\n" +#: fe-auth.c:436 +#, c-format +msgid "channel binding required, but SSL not in use" +msgstr "kräver kanalbindning, men SSL används inte" -#: fe-auth.c:440 -msgid "duplicate SASL authentication request\n" -msgstr "duplicerad autentiseringsbegäran frÃ¥n SASL\n" +#: fe-auth.c:442 +#, c-format +msgid "duplicate SASL authentication request" +msgstr "duplicerad autentiseringsbegäran frÃ¥n SASL" -#: fe-auth.c:499 -msgid "channel binding is required, but client does not support it\n" -msgstr "kanalbindning krävs men klienten stöder inte det\n" +#: fe-auth.c:500 +#, c-format +msgid "channel binding is required, but client does not support it" +msgstr "kanalbindning krävs men klienten stöder inte det" #: fe-auth.c:516 -msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" -msgstr "servern erbjöd SCRAM-SHA-256-PLUS-autentisering över en icke-SSL-anslutning\n" +#, c-format +msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection" +msgstr "servern erbjöd SCRAM-SHA-256-PLUS-autentisering över en icke-SSL-anslutning" #: fe-auth.c:531 -msgid "none of the server's SASL authentication mechanisms are supported\n" -msgstr "ingen av serverns SASL-autentiseringsmekanismer stöds\n" +#, c-format +msgid "none of the server's SASL authentication mechanisms are supported" +msgstr "ingen av serverns SASL-autentiseringsmekanismer stöds" + +#: fe-auth.c:538 +#, c-format +msgid "channel binding is required, but server did not offer an authentication method that supports channel binding" +msgstr "kräver kanalbindning, men servern erbjöd ingen autentiseringsmetod som stöder kanalbindning" + +#: fe-auth.c:640 +#, c-format +msgid "out of memory allocating SASL buffer (%d)" +msgstr "slut pÃ¥ minne vid allokering av buffer till SASL (%d)" + +#: fe-auth.c:663 +#, c-format +msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed" +msgstr "mottog AuthenticationSASLFinal frÃ¥n server, men SASL-autentisering slutfördes ej" + +#: fe-auth.c:673 +#, c-format +msgid "no client response found after SASL exchange success" +msgstr "hittade inget klientsvar efter lyckat SASL-utbyte" + +#: fe-auth.c:736 fe-auth.c:743 fe-auth.c:1346 fe-auth.c:1357 +#, c-format +msgid "could not encrypt password: %s" +msgstr "kan inte kryptera lösenord: %s" + +#: fe-auth.c:772 +msgid "server requested a cleartext password" +msgstr "servern begärde ett lösenord i klartext" + +#: fe-auth.c:774 +msgid "server requested a hashed password" +msgstr "servern begärde ett hashat lösenord" + +#: fe-auth.c:777 +msgid "server requested GSSAPI authentication" +msgstr "servern begärde GSSAPI-autentisering" + +#: fe-auth.c:779 +msgid "server requested SSPI authentication" +msgstr "servern begärde SSPI-autentisering" + +#: fe-auth.c:783 +msgid "server requested SASL authentication" +msgstr "servern begärde SASL-autentisering" + +#: fe-auth.c:786 +msgid "server requested an unknown authentication type" +msgstr "servern begärde en okänd autentiseringstyp" + +#: fe-auth.c:819 +#, c-format +msgid "server did not request an SSL certificate" +msgstr "servern begärde inte ett SSL-certifikat" + +#: fe-auth.c:824 +#, c-format +msgid "server accepted connection without a valid SSL certificate" +msgstr "serven accepterade en anslutning utan giltigt SSL-certifikat" + +#: fe-auth.c:878 +msgid "server did not complete authentication" +msgstr "servern slutförde inte autenticeringen" + +#: fe-auth.c:912 +#, c-format +msgid "authentication method requirement \"%s\" failed: %s" +msgstr "autentiseringsmetodens krav \"%s\" misslyckades: %s" -#: fe-auth.c:539 -msgid "channel binding is required, but server did not offer an authentication method that supports channel binding\n" -msgstr "kräver kanalbindning, men servern erbjöd ingen autentiseringsmetod som stöder kanalbindning\n" +#: fe-auth.c:935 +#, c-format +msgid "channel binding required, but server authenticated client without channel binding" +msgstr "kräver kanalbindning, men servern autentiserade klienten utan kanalbindning" -#: fe-auth.c:647 +#: fe-auth.c:940 #, c-format -msgid "out of memory allocating SASL buffer (%d)\n" -msgstr "slut pÃ¥ minne vid allokering av buffer till SASL (%d)\n" +msgid "channel binding required but not supported by server's authentication request" +msgstr "kanalbindning krävs men stöds inte av serverns autentiseringsförfrÃ¥gan" -#: fe-auth.c:672 -msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed\n" -msgstr "mottog AuthenticationSASLFinal frÃ¥n server, men SASL-autentisering slutfördes ej\n" +#: fe-auth.c:974 +#, c-format +msgid "Kerberos 4 authentication not supported" +msgstr "Kerberos-4-autentisering stöds ej" -#: fe-auth.c:683 -msgid "no client response found after SASL exchange success\n" -msgstr "hittade inget klientsvar efter lyckat SASL-utbyte\n" +#: fe-auth.c:978 +#, c-format +msgid "Kerberos 5 authentication not supported" +msgstr "Kerberos-5-autentisering stöds ej" -#: fe-auth.c:765 -msgid "SCM_CRED authentication method not supported\n" -msgstr "autentiseringsmetoden SCM_CRED stöds ej\n" +#: fe-auth.c:1048 +#, c-format +msgid "GSSAPI authentication not supported" +msgstr "GSSAPI-autentisering stöds ej" -#: fe-auth.c:809 fe-auth.c:818 fe-auth.c:1301 fe-auth.c:1314 +#: fe-auth.c:1079 #, c-format -msgid "could not encrypt password: %s\n" -msgstr "kan inte kryptera lösenord: %s\n" +msgid "SSPI authentication not supported" +msgstr "SSPI-autentisering stöds ej" -#: fe-auth.c:868 -msgid "channel binding required, but server authenticated client without channel binding\n" -msgstr "kräver kanalbindning, men servern autentiserade klienten utan kanalbindning\n" +#: fe-auth.c:1086 +#, c-format +msgid "Crypt authentication not supported" +msgstr "Crypt-autentisering stöds ej" -#: fe-auth.c:874 -msgid "channel binding required but not supported by server's authentication request\n" -msgstr "kanalbindning krävs men stöds inte av serverns autentiseringsförfrÃ¥gan\n" +#: fe-auth.c:1150 +#, c-format +msgid "authentication method %u not supported" +msgstr "autentiseringsmetod %u stöds ej" -#: fe-auth.c:909 -msgid "Kerberos 4 authentication not supported\n" -msgstr "Kerberos-4-autentisering stöds ej\n" +#: fe-auth.c:1187 +#, c-format +msgid "user name lookup failure: error code %lu" +msgstr "misslyckad sökning efter användarnamn: felkod %lu" + +#: fe-auth.c:1309 +#, c-format +msgid "unexpected shape of result set returned for SHOW" +msgstr "oväntad form pÃ¥ resultatmängden som returnerades för SHOW" + +#: fe-auth.c:1317 +#, c-format +msgid "\"password_encryption\" value too long" +msgstr "\"password_encryption\"-värdet är för lÃ¥ngt" + +#: fe-auth.c:1367 +#, c-format +msgid "unrecognized password encryption algorithm \"%s\"" +msgstr "okänd lösenordskrypteringsalgoritm \"%s\"" + +#: fe-cancel.c:76 +#, c-format +msgid "connection pointer is NULL" +msgstr "anslutningspekare är NULL" + +#: fe-cancel.c:82 fe-misc.c:572 +#, c-format +msgid "connection not open" +msgstr "anslutningen är inte öppen" -#: fe-auth.c:914 -msgid "Kerberos 5 authentication not supported\n" -msgstr "Kerberos-5-autentisering stöds ej\n" +#: fe-cancel.c:193 +#, c-format +msgid "cancel request is already being sent on this connection" +msgstr "förfrÃ¥gan för att avbryta har redan skickats pÃ¥ denna uppkoppling" -#: fe-auth.c:985 -msgid "GSSAPI authentication not supported\n" -msgstr "GSSAPI-autentisering stöds ej\n" +#: fe-cancel.c:263 +#, c-format +msgid "unexpected response from server" +msgstr "oväntad resultat frÃ¥n servern" -#: fe-auth.c:1017 -msgid "SSPI authentication not supported\n" -msgstr "SSPI-autentisering stöds ej\n" +#: fe-connect.c:1182 +#, c-format +msgid "could not match %d host names to %d hostaddr values" +msgstr "kunde inte matcha %d värdnamn till %d värdadresser" -#: fe-auth.c:1025 -msgid "Crypt authentication not supported\n" -msgstr "Crypt-autentisering stöds ej\n" +#: fe-connect.c:1262 +#, c-format +msgid "could not match %d port numbers to %d hosts" +msgstr "kunde inte matcha %d portnummer med %d värdar" -#: fe-auth.c:1092 +#: fe-connect.c:1387 #, c-format -msgid "authentication method %u not supported\n" -msgstr "autentiseringsmetod %u stöds ej\n" +msgid "negative require_auth method \"%s\" cannot be mixed with non-negative methods" +msgstr "negativ require_auth-metod \"%s\" kan inte blandas med icke-negativa metoder" -#: fe-auth.c:1138 +#: fe-connect.c:1400 #, c-format -msgid "user name lookup failure: error code %lu\n" -msgstr "misslyckad sökning efter användarnamn: felkod %lu\n" +msgid "require_auth method \"%s\" cannot be mixed with negative methods" +msgstr "require_auth-metod \"%s\" kan inte blandas med negativa metoder" -#: fe-auth.c:1264 -msgid "unexpected shape of result set returned for SHOW\n" -msgstr "oväntad form pÃ¥ resultatmängden som returnerades för SHOW\n" +#: fe-connect.c:1460 fe-connect.c:1511 fe-connect.c:1553 fe-connect.c:1596 +#: fe-connect.c:1699 fe-connect.c:1745 fe-connect.c:1785 fe-connect.c:1806 +#, c-format +msgid "invalid %s value: \"%s\"" +msgstr "ogiltigt %s-värde: \"%s\"" -#: fe-auth.c:1273 -msgid "password_encryption value too long\n" -msgstr "password_encryption-värdet är för lÃ¥ngt\n" +#: fe-connect.c:1493 +#, c-format +msgid "require_auth method \"%s\" is specified more than once" +msgstr "require_auth-metod \"%s\" angiven mer än en gÃ¥ng" -#: fe-auth.c:1327 +#: fe-connect.c:1534 fe-connect.c:1573 fe-connect.c:1605 fe-connect.c:1707 #, c-format -msgid "unrecognized password encryption algorithm \"%s\"\n" -msgstr "okänd lösenordskrypteringsalgoritm \"%s\"\n" +msgid "%s value \"%s\" invalid when SSL support is not compiled in" +msgstr "%s värde \"%s\", är ogiltigt när SSL-stöd inte kompilerats in" -#: fe-connect.c:1090 +#: fe-connect.c:1625 #, c-format -msgid "could not match %d host names to %d hostaddr values\n" -msgstr "kunde inte matcha %d värdnamn till %d värdadresser\n" +msgid "weak sslmode \"%s\" may not be used with sslnegotiation=direct (use \"require\", \"verify-ca\", or \"verify-full\")" +msgstr "svagt ssl-läge \"%s\" kan inte användas med sslnegotiation=direct (använd \"require\", \"verify-ca\" eller \"verify-full\")" -#: fe-connect.c:1176 +#: fe-connect.c:1647 #, c-format -msgid "could not match %d port numbers to %d hosts\n" -msgstr "kunde inte matcha %d portnummer med %d värdar\n" +msgid "weak sslmode \"%s\" may not be used with sslrootcert=system (use \"verify-full\")" +msgstr "svagt ssl-läge \"%s\" kan inte användas med sslrootcert=system (använd \"verify-full\")" -#: fe-connect.c:1269 fe-connect.c:1295 fe-connect.c:1337 fe-connect.c:1346 -#: fe-connect.c:1379 fe-connect.c:1423 +#: fe-connect.c:1660 fe-connect.c:1668 #, c-format -msgid "invalid %s value: \"%s\"\n" -msgstr "ogiltigt %s-värde: \"%s\"\n" +msgid "invalid \"%s\" value: \"%s\"" +msgstr "ogiltigt \"%s\"-värde: \"%s\"" -#: fe-connect.c:1316 +#: fe-connect.c:1685 #, c-format -msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" -msgstr "värde för ssl-läge, \"%s\", är ogiltigt när SSL-stöd inte kompilerats in\n" +msgid "invalid SSL protocol version range" +msgstr "ogiltigt intervall för SSL-protokollversion" -#: fe-connect.c:1364 -msgid "invalid SSL protocol version range\n" -msgstr "ogiltigt intervall för SSL-protokollversion\n" +#: fe-connect.c:1722 +#, c-format +msgid "%s value \"%s\" is not supported (check OpenSSL version)" +msgstr "%s-värde \"%s\" stöds inte (kontrollera OpenSSL-versionen)" -#: fe-connect.c:1389 +#: fe-connect.c:1752 #, c-format -msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" -msgstr "värde för gssenc-läge, \"%s\", är ogiltigt när GSSAPI-stöd inte kompilerats in\n" +msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in" +msgstr "värde för gssenc-läge, \"%s\", är ogiltigt när GSSAPI-stöd inte kompilerats in" -#: fe-connect.c:1649 +#: fe-connect.c:2045 #, c-format -msgid "could not set socket to TCP no delay mode: %s\n" -msgstr "kunde inte sätta uttag (socket) till läget TCP-ingen-fördröjning: %s\n" +msgid "could not set socket to TCP no delay mode: %s" +msgstr "kunde inte sätta socket till läget TCP-ingen-fördröjning: %s" -#: fe-connect.c:1711 +#: fe-connect.c:2104 #, c-format msgid "connection to server on socket \"%s\" failed: " -msgstr "anslutning till server pÃ¥ uttag \"%s\" misslyckades: " +msgstr "anslutning till server pÃ¥ socket \"%s\" misslyckades: " -#: fe-connect.c:1738 +#: fe-connect.c:2130 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "anslutning til server pÃ¥ \"%s\" (%s), port %s misslyckades: " -#: fe-connect.c:1743 +#: fe-connect.c:2135 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "anslutning till server pÃ¥ \"%s\", port %s misslyckades: " -#: fe-connect.c:1768 -msgid "\tIs the server running locally and accepting connections on that socket?\n" -msgstr "" -"\tKör servern lokalt och accepterar den\n" -"\tanslutningar till detta uttag (socket)?\n" +#: fe-connect.c:2158 +#, c-format +msgid "\tIs the server running locally and accepting connections on that socket?" +msgstr "\tKör servern lokalt och accepterar den anslutningar till denna socket?" -#: fe-connect.c:1772 -msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" -msgstr "\tKör servern pÃ¥ den värden och accepterar den TCP/IP-anslutningar?\n" +#: fe-connect.c:2160 +#, c-format +msgid "\tIs the server running on that host and accepting TCP/IP connections?" +msgstr "\tKör servern pÃ¥ den värden och accepterar den TCP/IP-anslutningar?" -#: fe-connect.c:1836 +#: fe-connect.c:2206 fe-connect.c:2240 fe-connect.c:2275 fe-connect.c:2373 +#: fe-connect.c:3098 #, c-format -msgid "invalid integer value \"%s\" for connection option \"%s\"\n" -msgstr "ogiltigt heltalsvärde \"%s\" för anslutningsflagga \"%s\"\n" +msgid "%s(%s) failed: %s" +msgstr "%s(%s) misslyckades: %s" -#: fe-connect.c:1866 fe-connect.c:1901 fe-connect.c:1937 fe-connect.c:2037 -#: fe-connect.c:2651 +#: fe-connect.c:2339 #, c-format -msgid "%s(%s) failed: %s\n" -msgstr "%s(%s) misslyckades: %s\n" +msgid "%s(%s) failed: error code %d" +msgstr "%s(%s) misslyckades: felkod %d" -#: fe-connect.c:2002 +#: fe-connect.c:2650 #, c-format -msgid "%s(%s) failed: error code %d\n" -msgstr "%s(%s) misslyckades: felkod %d\n" +msgid "invalid connection state, probably indicative of memory corruption" +msgstr "ogiltigt tillstÃ¥nd i anslutning, antagligen korrupt minne" -#: fe-connect.c:2317 -msgid "invalid connection state, probably indicative of memory corruption\n" -msgstr "ogiltigt tillstÃ¥nd i anslutning, antagligen korrupt minne\n" +#: fe-connect.c:2733 +#, c-format +msgid "invalid port number: \"%s\"" +msgstr "ogiltigt portnummer \"%s\"" -#: fe-connect.c:2396 +#: fe-connect.c:2747 #, c-format -msgid "invalid port number: \"%s\"\n" -msgstr "ogiltigt portnummer \"%s\"\n" +msgid "could not translate host name \"%s\" to address: %s" +msgstr "kunde inte översätta värdnamn \"%s\" till adress: %s" -#: fe-connect.c:2412 +#: fe-connect.c:2759 #, c-format -msgid "could not translate host name \"%s\" to address: %s\n" -msgstr "kunde inte översätta värdnamn \"%s\" till adress: %s\n" +msgid "could not parse network address \"%s\": %s" +msgstr "kunde inte parsa nätverksadress \"%s\": %s" -#: fe-connect.c:2425 +#: fe-connect.c:2770 #, c-format -msgid "could not parse network address \"%s\": %s\n" -msgstr "kunde inte parsa nätverksadress \"%s\": %s\n" +msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" +msgstr "Sökväg till unix-socket \"%s\" är för lÃ¥ng (maximalt %d byte)" -#: fe-connect.c:2438 +#: fe-connect.c:2784 #, c-format -msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" -msgstr "Sökväg till unixdomänuttag \"%s\" är för lÃ¥ng (maximalt %d byte)\n" +msgid "could not translate Unix-domain socket path \"%s\" to address: %s" +msgstr "kunde inte översätta sökväg till Unix-socket \"%s\" till adress: %s" -#: fe-connect.c:2453 +#: fe-connect.c:2950 fe-connect.c:4305 #, c-format -msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" -msgstr "kunde inte översätta sökväg till unix-uttag (socket) \"%s\" till adress: %s\n" +msgid "GSSAPI encryption required but it is not supported over a local socket" +msgstr "GSSAPI-kryptering krävdes men stöds inte över en lokal socket" -#: fe-connect.c:2579 +#: fe-connect.c:2958 fe-connect.c:4434 #, c-format -msgid "could not create socket: %s\n" -msgstr "kan inte skapa uttag: %s\n" +msgid "GSSAPI encryption required but no credential cache" +msgstr "GSSAPI-kryptering krävdes men det finns ingen credential-cache" -#: fe-connect.c:2610 +#: fe-connect.c:3026 #, c-format -msgid "could not set socket to nonblocking mode: %s\n" -msgstr "kunde inte sätta uttag (socket) till ickeblockerande läge: %s\n" +msgid "could not create socket: %s" +msgstr "kan inte skapa socket: %s" -#: fe-connect.c:2620 +#: fe-connect.c:3057 #, c-format -msgid "could not set socket to close-on-exec mode: %s\n" -msgstr "kunde inte ställa in uttag (socket) i \"close-on-exec\"-läge: %s\n" +msgid "could not set socket to nonblocking mode: %s" +msgstr "kunde inte sätta socket till ickeblockerande läge: %s" -#: fe-connect.c:2638 -msgid "keepalives parameter must be an integer\n" -msgstr "keepalives-parameter mÃ¥ste vara ett heltal\n" +#: fe-connect.c:3068 +#, c-format +msgid "could not set socket to close-on-exec mode: %s" +msgstr "kunde inte ställa in socket i \"close-on-exec\"-läge: %s" -#: fe-connect.c:2779 +#: fe-connect.c:3225 #, c-format -msgid "could not get socket error status: %s\n" -msgstr "kunde inte hämta felstatus för uttag (socket): %s\n" +msgid "could not get socket error status: %s" +msgstr "kunde inte hämta felstatus för socket: %s" -#: fe-connect.c:2807 +#: fe-connect.c:3252 #, c-format -msgid "could not get client address from socket: %s\n" -msgstr "kunde inte fÃ¥ tag pÃ¥ klientadressen frÃ¥n uttag (socket): %s\n" +msgid "could not get client address from socket: %s" +msgstr "kunde inte fÃ¥ klientadressen frÃ¥n socket: %s" -#: fe-connect.c:2846 -msgid "requirepeer parameter is not supported on this platform\n" -msgstr "requirepeer-parameter stöds inte pÃ¥ denna plattform\n" +#: fe-connect.c:3278 +#, c-format +msgid "requirepeer parameter is not supported on this platform" +msgstr "requirepeer-parameter stöds inte pÃ¥ denna plattform" -#: fe-connect.c:2849 +#: fe-connect.c:3280 #, c-format -msgid "could not get peer credentials: %s\n" -msgstr "kunde inte hämta andra sidans referenser: %s\n" +msgid "could not get peer credentials: %s" +msgstr "kunde inte hämta andra sidans autentiseringsuppgifter: %s" -#: fe-connect.c:2863 +#: fe-connect.c:3293 #, c-format -msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" -msgstr "requirepeer anger \"%s\", men andra sidans användarnamn är \"%s\"\n" +msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"" +msgstr "requirepeer anger \"%s\", men andra sidans användarnamn är \"%s\"" -#: fe-connect.c:2905 +#: fe-connect.c:3331 #, c-format -msgid "could not send GSSAPI negotiation packet: %s\n" -msgstr "kunde inte skicka GSSAPI-paket för uppkopplingsförhandling: %s\n" +msgid "could not send GSSAPI negotiation packet: %s" +msgstr "kunde inte skicka GSSAPI-paket för anslutningsförhandling: %s" -#: fe-connect.c:2917 -msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)\n" -msgstr "GSSAPI-kryptering krävdes men var omöjligt (kanske ingen credential-cache, inget serverstöd eller använder ett lokalt uttag)\n" +#: fe-connect.c:3380 +#, c-format +msgid "could not send SSL negotiation packet: %s" +msgstr "kunde inte skicka SSL-paket för anslutningsförhandling: %s" -#: fe-connect.c:2959 +#: fe-connect.c:3412 #, c-format -msgid "could not send SSL negotiation packet: %s\n" -msgstr "kunde inte skicka SSL-paket för uppkopplingsförhandling: %s\n" +msgid "could not send cancel packet: %s" +msgstr "kunde inte skicka avbrottspaket: %s" -#: fe-connect.c:2990 +#: fe-connect.c:3442 #, c-format -msgid "could not send startup packet: %s\n" -msgstr "kan inte skicka startpaketet: %s\n" +msgid "could not send startup packet: %s" +msgstr "kan inte skicka startpaketet: %s" -#: fe-connect.c:3066 -msgid "server does not support SSL, but SSL was required\n" -msgstr "SSL stöds inte av servern, men SSL krävdes\n" +#: fe-connect.c:3509 +msgid "server does not support SSL, but SSL was required" +msgstr "SSL stöds inte av servern, men SSL krävdes" -#: fe-connect.c:3093 +#: fe-connect.c:3519 #, c-format -msgid "received invalid response to SSL negotiation: %c\n" -msgstr "tog emot ogiltigt svar till SSL-uppkopplingsförhandling: %c\n" +msgid "server sent an error response during SSL exchange" +msgstr "servern skickade ett felmeddelande vid SSL-utbyte" -#: fe-connect.c:3114 -msgid "received unencrypted data after SSL response\n" -msgstr "tog emot okrypterad data efter SSL-svar\n" +#: fe-connect.c:3524 +#, c-format +msgid "received invalid response to SSL negotiation: %c" +msgstr "tog emot ogiltigt svar till SSL-anslutningsförhandling: %c" -#: fe-connect.c:3195 -msgid "server doesn't support GSSAPI encryption, but it was required\n" -msgstr "GSSAPI stöds inte av servern, men det krävdes\n" +#: fe-connect.c:3552 +#, c-format +msgid "received unencrypted data after SSL response" +msgstr "tog emot okrypterad data efter SSL-svar" -#: fe-connect.c:3207 +#: fe-connect.c:3615 #, c-format -msgid "received invalid response to GSSAPI negotiation: %c\n" -msgstr "tog emot ogiltigt svar till GSSAPI-uppkopplingsförhandling: %c\n" +msgid "server sent an error response during GSS encryption exchange" +msgstr "servern skickade ett felmeddelande vid GSS-krypteringsutbyte" -#: fe-connect.c:3226 -msgid "received unencrypted data after GSSAPI encryption response\n" -msgstr "tog emot okrypterad data efter GSSAPI-krypteringssvar\n" +#: fe-connect.c:3629 +msgid "server doesn't support GSSAPI encryption, but it was required" +msgstr "GSSAPI-kryptering stöds inte av servern, men det krävdes" -#: fe-connect.c:3286 fe-connect.c:3311 +#: fe-connect.c:3633 #, c-format -msgid "expected authentication request from server, but received %c\n" -msgstr "förväntade autentiseringsförfrÃ¥gan frÃ¥n servern, men fick %c\n" +msgid "received invalid response to GSSAPI negotiation: %c" +msgstr "tog emot ogiltigt svar till GSSAPI-anslutningsförhandling: %c" -#: fe-connect.c:3518 -msgid "unexpected message from server during startup\n" -msgstr "oväntat meddelande frÃ¥n servern under starten\n" +#: fe-connect.c:3651 +#, c-format +msgid "received unencrypted data after GSSAPI encryption response" +msgstr "tog emot okrypterad data efter GSSAPI-krypteringssvar" -#: fe-connect.c:3610 -msgid "session is read-only\n" -msgstr "sessionen är i readonly-läge\n" +#: fe-connect.c:3711 +#, c-format +msgid "expected authentication request from server, but received %c" +msgstr "förväntade autentiseringsförfrÃ¥gan frÃ¥n servern, men fick %c" -#: fe-connect.c:3613 -msgid "session is not read-only\n" -msgstr "sessionen är inte i readonly-läge\n" +#: fe-connect.c:3739 fe-connect.c:3862 +#, c-format +msgid "received invalid authentication request" +msgstr "tog emot ogiltig autentiseringsförfrÃ¥gan" -#: fe-connect.c:3667 -msgid "server is in hot standby mode\n" -msgstr "servern är i varmt standby-läge\n" +#: fe-connect.c:3745 fe-connect.c:3847 +#, c-format +msgid "received invalid protocol negotiation message" +msgstr "tog emot ogiltigt meddelande för protokollets anslutningsförhandling" -#: fe-connect.c:3670 -msgid "server is not in hot standby mode\n" -msgstr "servern är inte i varmt standby-läge\n" +#: fe-connect.c:3764 fe-connect.c:3818 +#, c-format +msgid "received invalid error message" +msgstr "tog emot ogiltigt felmeddelande" -#: fe-connect.c:3788 fe-connect.c:3840 +#: fe-connect.c:3933 #, c-format -msgid "\"%s\" failed\n" -msgstr "\"%s\" misslyckades\n" +msgid "unexpected message from server during startup" +msgstr "oväntat meddelande frÃ¥n servern under uppstarten" -#: fe-connect.c:3854 +#: fe-connect.c:4024 #, c-format -msgid "invalid connection state %d, probably indicative of memory corruption\n" -msgstr "ogiltigt tillstÃ¥nd %d i anslutning, antagligen korrupt minne\n" +msgid "session is read-only" +msgstr "sessionen är i readonly-läge" -#: fe-connect.c:4837 +#: fe-connect.c:4026 #, c-format -msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" -msgstr "ogiltig LDAP URL \"%s\": schemat mÃ¥ste vara ldap://\n" +msgid "session is not read-only" +msgstr "sessionen är inte i readonly-läge" -#: fe-connect.c:4852 +#: fe-connect.c:4079 #, c-format -msgid "invalid LDAP URL \"%s\": missing distinguished name\n" -msgstr "ogiltig LDAP URL \"%s\": saknar urskiljbart namn\n" +msgid "server is in hot standby mode" +msgstr "servern är i \"hot standby\"-läge" -#: fe-connect.c:4864 fe-connect.c:4922 +#: fe-connect.c:4081 #, c-format -msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" -msgstr "ogiltig LDAP URL \"%s\": mÃ¥ste finnas exakt ett attribut\n" +msgid "server is not in hot standby mode" +msgstr "servern är inte i \"hot standby\"-läge" -#: fe-connect.c:4876 fe-connect.c:4938 +#: fe-connect.c:4203 fe-connect.c:4253 #, c-format -msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" -msgstr "ogiltig LDAP URL \"%s\": mÃ¥ste ha sök-scope (base/one/sub)\n" +msgid "\"%s\" failed" +msgstr "\"%s\" misslyckades" -#: fe-connect.c:4888 +#: fe-connect.c:4267 #, c-format -msgid "invalid LDAP URL \"%s\": no filter\n" -msgstr "ogiltigt LDAP URL \"%s\": inget filter\n" +msgid "invalid connection state %d, probably indicative of memory corruption" +msgstr "ogiltigt tillstÃ¥nd %d i anslutning, antagligen korrupt minne" -#: fe-connect.c:4910 +#: fe-connect.c:5086 #, c-format -msgid "invalid LDAP URL \"%s\": invalid port number\n" -msgstr "ogiltig LDAP URL \"%s\": ogiltigt portnummer\n" +msgid "invalid LDAP URL \"%s\": scheme must be ldap://" +msgstr "ogiltig LDAP URL \"%s\": schemat mÃ¥ste vara ldap://" -#: fe-connect.c:4948 -msgid "could not create LDAP structure\n" -msgstr "kunde inte skapa LDAP-struktur\n" +#: fe-connect.c:5101 +#, c-format +msgid "invalid LDAP URL \"%s\": missing distinguished name" +msgstr "ogiltig LDAP URL \"%s\": saknar \"distinguished name\"" -#: fe-connect.c:5024 +#: fe-connect.c:5113 fe-connect.c:5171 #, c-format -msgid "lookup on LDAP server failed: %s\n" -msgstr "uppslagning av LDAP-server misslyckades: %s\n" +msgid "invalid LDAP URL \"%s\": must have exactly one attribute" +msgstr "ogiltig LDAP URL \"%s\": mÃ¥ste finnas exakt ett attribut" -#: fe-connect.c:5035 -msgid "more than one entry found on LDAP lookup\n" -msgstr "mer än en post hittad i LDAP-uppslagning\n" +#: fe-connect.c:5125 fe-connect.c:5187 +#, c-format +msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" +msgstr "ogiltig LDAP URL \"%s\": mÃ¥ste ha sök-scope (base/one/sub)" -#: fe-connect.c:5036 fe-connect.c:5048 -msgid "no entry found on LDAP lookup\n" -msgstr "ingen post hittad i LDAP-uppslagning\n" +#: fe-connect.c:5137 +#, c-format +msgid "invalid LDAP URL \"%s\": no filter" +msgstr "ogiltigt LDAP URL \"%s\": inget filter" + +#: fe-connect.c:5159 +#, c-format +msgid "invalid LDAP URL \"%s\": invalid port number" +msgstr "ogiltig LDAP URL \"%s\": ogiltigt portnummer" + +#: fe-connect.c:5196 +#, c-format +msgid "could not create LDAP structure" +msgstr "kunde inte skapa LDAP-struktur" + +#: fe-connect.c:5271 +#, c-format +msgid "lookup on LDAP server failed: %s" +msgstr "uppslagning av LDAP-server misslyckades: %s" + +#: fe-connect.c:5281 +#, c-format +msgid "more than one entry found on LDAP lookup" +msgstr "mer än en post hittad i LDAP-uppslagning" -#: fe-connect.c:5059 fe-connect.c:5072 -msgid "attribute has no values on LDAP lookup\n" -msgstr "attributet har inga värden i LDAP-uppslagning\n" +#: fe-connect.c:5283 fe-connect.c:5294 +#, c-format +msgid "no entry found on LDAP lookup" +msgstr "ingen post hittad i LDAP-uppslagning" -#: fe-connect.c:5124 fe-connect.c:5143 fe-connect.c:5675 +#: fe-connect.c:5304 fe-connect.c:5316 #, c-format -msgid "missing \"=\" after \"%s\" in connection info string\n" -msgstr "\"=\" efter \"%s\" saknas i anslutningssträng\n" +msgid "attribute has no values on LDAP lookup" +msgstr "attributet har inga värden i LDAP-uppslagning" -#: fe-connect.c:5216 fe-connect.c:5860 fe-connect.c:6636 +#: fe-connect.c:5367 fe-connect.c:5386 fe-connect.c:5910 #, c-format -msgid "invalid connection option \"%s\"\n" -msgstr "ogiltig anslutningsparameter \"%s\"\n" +msgid "missing \"=\" after \"%s\" in connection info string" +msgstr "\"=\" efter \"%s\" saknas i anslutningssträng" -#: fe-connect.c:5232 fe-connect.c:5724 -msgid "unterminated quoted string in connection info string\n" -msgstr "icke terminerad sträng i uppkopplingsinformationen\n" +#: fe-connect.c:5457 fe-connect.c:6093 fe-connect.c:6891 +#, c-format +msgid "invalid connection option \"%s\"" +msgstr "ogiltig anslutningsparameter \"%s\"" -#: fe-connect.c:5313 +#: fe-connect.c:5472 fe-connect.c:5958 #, c-format -msgid "definition of service \"%s\" not found\n" -msgstr "definition av service \"%s\" hittades inte\n" +msgid "unterminated quoted string in connection info string" +msgstr "icke terminerad sträng i uppkopplingsinformationen" -#: fe-connect.c:5339 +#: fe-connect.c:5552 #, c-format -msgid "service file \"%s\" not found\n" -msgstr "servicefil \"%s\" hittades inte\n" +msgid "definition of service \"%s\" not found" +msgstr "definition av service \"%s\" hittades inte" -#: fe-connect.c:5353 +#: fe-connect.c:5578 #, c-format -msgid "line %d too long in service file \"%s\"\n" -msgstr "rad %d för lÃ¥ng i servicefil \"%s\"\n" +msgid "service file \"%s\" not found" +msgstr "servicefil \"%s\" hittades inte" -#: fe-connect.c:5424 fe-connect.c:5468 +#: fe-connect.c:5591 #, c-format -msgid "syntax error in service file \"%s\", line %d\n" -msgstr "syntaxfel i servicefel \"%s\", rad %d\n" +msgid "line %d too long in service file \"%s\"" +msgstr "rad %d för lÃ¥ng i servicefil \"%s\"" -#: fe-connect.c:5435 +#: fe-connect.c:5662 fe-connect.c:5705 #, c-format -msgid "nested service specifications not supported in service file \"%s\", line %d\n" -msgstr "nästlade servicespecifikationer stöds inte i servicefil \"%s\", rad %d\n" +msgid "syntax error in service file \"%s\", line %d" +msgstr "syntaxfel i servicefel \"%s\", rad %d" -#: fe-connect.c:6156 +#: fe-connect.c:5673 #, c-format -msgid "invalid URI propagated to internal parser routine: \"%s\"\n" -msgstr "ogiltig URI propagerad till intern parsningsrutin: \"%s\"\n" +msgid "nested service specifications not supported in service file \"%s\", line %d" +msgstr "nästlade servicespecifikationer stöds inte i servicefil \"%s\", rad %d" -#: fe-connect.c:6233 +#: fe-connect.c:6412 #, c-format -msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" -msgstr "nÃ¥dde slutet pÃ¥ strängen när vi letade efter matchande \"]\" i IPv6-värdadress i URI: \"%s\"\n" +msgid "invalid URI propagated to internal parser routine: \"%s\"" +msgstr "ogiltig URI propagerad till intern parsningsrutin: \"%s\"" -#: fe-connect.c:6240 +#: fe-connect.c:6489 #, c-format -msgid "IPv6 host address may not be empty in URI: \"%s\"\n" -msgstr "IPv6-värdadress fÃ¥r ej vara tom i URI: \"%s\"\n" +msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"" +msgstr "nÃ¥dde slutet pÃ¥ strängen när vi letade efter matchande \"]\" i IPv6-värdadress i URI: \"%s\"" -#: fe-connect.c:6255 +#: fe-connect.c:6496 #, c-format -msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" -msgstr "oväntat tecken \"%c\" vid position %d i URI (förväntade \":\" eller \"/\"): \"%s\"\n" +msgid "IPv6 host address may not be empty in URI: \"%s\"" +msgstr "IPv6-värdadress fÃ¥r ej vara tom i URI: \"%s\"" -#: fe-connect.c:6385 +#: fe-connect.c:6511 #, c-format -msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "extra nyckel/värde-separator \"=\" i URI-frÃ¥geparameter: \"%s\"\n" +msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"" +msgstr "oväntat tecken \"%c\" vid position %d i URI (förväntade \":\" eller \"/\"): \"%s\"" -#: fe-connect.c:6405 +#: fe-connect.c:6640 #, c-format -msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "saknar nyckel/värde-separator \"=\" i URI-frÃ¥geparameter: \"%s\"\n" +msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "extra nyckel/värde-separator \"=\" i URI-frÃ¥geparameter: \"%s\"" -#: fe-connect.c:6457 +#: fe-connect.c:6660 #, c-format -msgid "invalid URI query parameter: \"%s\"\n" -msgstr "ogiltig URI-frÃ¥geparameter: \"%s\"\n" +msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "saknar nyckel/värde-separator \"=\" i URI-frÃ¥geparameter: \"%s\"" -#: fe-connect.c:6531 +#: fe-connect.c:6712 #, c-format -msgid "invalid percent-encoded token: \"%s\"\n" -msgstr "ogiltigt procent-kodad symbol: \"%s\"\n" +msgid "invalid URI query parameter: \"%s\"" +msgstr "ogiltig URI-frÃ¥geparameter: \"%s\"" -#: fe-connect.c:6541 +#: fe-connect.c:6786 #, c-format -msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" -msgstr "förbjudet värde %%00 i procentkodat värde: \"%s\"\n" +msgid "invalid percent-encoded token: \"%s\"" +msgstr "ogiltigt procent-kodad symbol: \"%s\"" -#: fe-connect.c:6911 +#: fe-connect.c:6796 +#, c-format +msgid "forbidden value %%00 in percent-encoded value: \"%s\"" +msgstr "förbjudet värde %%00 i procentkodat värde: \"%s\"" + +#: fe-connect.c:7160 msgid "connection pointer is NULL\n" msgstr "anslutningspekare är NULL\n" -#: fe-connect.c:7199 +#: fe-connect.c:7168 fe-exec.c:713 fe-exec.c:975 fe-exec.c:3459 +#: fe-protocol3.c:991 fe-protocol3.c:1024 +msgid "out of memory\n" +msgstr "slut pÃ¥ minne\n" + +#: fe-connect.c:7459 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "FEL: lösenordsfil \"%s\" är inte en vanlig fil\n" -#: fe-connect.c:7208 +#: fe-connect.c:7468 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "VARNING: lösenordsfilen \"%s\" har läsrättigheter för gruppen eller världen; rättigheten skall vara u=rw (0600) eller mindre\n" -#: fe-connect.c:7316 +#: fe-connect.c:7575 +#, c-format +msgid "password retrieved from file \"%s\"" +msgstr "lösenord hämtat frÃ¥n fil \"%s\"" + +#: fe-connect.c:7727 #, c-format -msgid "password retrieved from file \"%s\"\n" -msgstr "lösenord hämtat frÃ¥n fil \"%s\"\n" +msgid "invalid integer value \"%s\" for connection option \"%s\"" +msgstr "ogiltigt heltalsvärde \"%s\" för anslutningsflagga \"%s\"" -#: fe-exec.c:466 fe-exec.c:3392 +#: fe-exec.c:469 fe-exec.c:3533 #, c-format msgid "row number %d is out of range 0..%d" msgstr "radnummer %d är utanför giltigt intervall 0..%d" -#: fe-exec.c:528 fe-protocol3.c:1949 +#: fe-exec.c:531 fe-protocol3.c:1993 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:836 -msgid "write to server failed\n" -msgstr "skrivning till servern misslyckades\n" +#: fe-exec.c:834 +#, c-format +msgid "write to server failed" +msgstr "skrivning till servern misslyckades" -#: fe-exec.c:875 -msgid "no error text available\n" -msgstr "inget feltext finns tillgänglig\n" +#: fe-exec.c:874 +#, c-format +msgid "no error text available" +msgstr "inget feltext finns tillgänglig" -#: fe-exec.c:964 +#: fe-exec.c:963 msgid "NOTICE" msgstr "NOTIS" -#: fe-exec.c:1022 +#: fe-exec.c:1021 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult stöder inte mer än INT_MAX tupler" -#: fe-exec.c:1034 +#: fe-exec.c:1033 msgid "size_t overflow" msgstr "size_t-överspill" -#: fe-exec.c:1447 fe-exec.c:1552 fe-exec.c:1601 -msgid "command string is a null pointer\n" -msgstr "kommandosträngen är en null-pekare\n" +#: fe-exec.c:1438 fe-exec.c:1507 fe-exec.c:1553 +#, c-format +msgid "command string is a null pointer" +msgstr "kommandosträngen är en null-pekare" + +#: fe-exec.c:1444 fe-exec.c:3003 +#, c-format +msgid "%s not allowed in pipeline mode" +msgstr "%s tillÃ¥ts inte i pipeline-läge" -#: fe-exec.c:1558 fe-exec.c:1607 fe-exec.c:1703 +#: fe-exec.c:1512 fe-exec.c:1558 fe-exec.c:1652 #, c-format -msgid "number of parameters must be between 0 and %d\n" -msgstr "antal parametrar mÃ¥ste vara mellan 0 och %d\n" +msgid "number of parameters must be between 0 and %d" +msgstr "antal parametrar mÃ¥ste vara mellan 0 och %d" -#: fe-exec.c:1595 fe-exec.c:1697 -msgid "statement name is a null pointer\n" -msgstr "satsens namn är en null-pekare\n" +#: fe-exec.c:1548 fe-exec.c:1647 +#, c-format +msgid "statement name is a null pointer" +msgstr "satsens namn är en null-pekare" -#: fe-exec.c:1741 fe-exec.c:3245 -msgid "no connection to the server\n" -msgstr "inte förbunden till servern\n" +#: fe-exec.c:1689 fe-exec.c:3379 +#, c-format +msgid "no connection to the server" +msgstr "inte ansluten till servern" -#: fe-exec.c:1750 fe-exec.c:3254 -msgid "another command is already in progress\n" -msgstr "ett annat kommando pÃ¥gÃ¥r redan\n" +#: fe-exec.c:1697 fe-exec.c:3387 +#, c-format +msgid "another command is already in progress" +msgstr "ett annat kommando körs redan" -#: fe-exec.c:1779 -msgid "cannot queue commands during COPY\n" -msgstr "kan inte köa kommandon när COPY körs\n" +#: fe-exec.c:1727 +#, c-format +msgid "cannot queue commands during COPY" +msgstr "kan inte köa kommandon när COPY körs" -#: fe-exec.c:1897 -msgid "length must be given for binary parameter\n" -msgstr "längden mÃ¥ste anges för en binär parameter\n" +#: fe-exec.c:1846 +#, c-format +msgid "length must be given for binary parameter" +msgstr "längden mÃ¥ste anges för en binär parameter" -#: fe-exec.c:2215 +#: fe-exec.c:2205 #, c-format -msgid "unexpected asyncStatus: %d\n" -msgstr "oväntad asyncStatus: %d\n" +msgid "unexpected asyncStatus: %d" +msgstr "oväntad asyncStatus: %d" -#: fe-exec.c:2373 -msgid "synchronous command execution functions are not allowed in pipeline mode\n" -msgstr "synkrona kommandoexekveringsfunktioner tillÃ¥ts inte i pipeline-läge\n" +#: fe-exec.c:2361 +#, c-format +msgid "synchronous command execution functions are not allowed in pipeline mode" +msgstr "synkrona kommandoexekveringsfunktioner tillÃ¥ts inte i pipeline-läge" -#: fe-exec.c:2390 +#: fe-exec.c:2378 msgid "COPY terminated by new PQexec" msgstr "COPY terminerad av ny PQexec" -#: fe-exec.c:2407 -msgid "PQexec not allowed during COPY BOTH\n" -msgstr "PQexec tillÃ¥ts inte under COPY BOTH\n" +#: fe-exec.c:2394 +#, c-format +msgid "PQexec not allowed during COPY BOTH" +msgstr "PQexec tillÃ¥ts inte under COPY BOTH" -#: fe-exec.c:2635 fe-exec.c:2691 fe-exec.c:2760 fe-protocol3.c:1880 -msgid "no COPY in progress\n" -msgstr "ingen COPY pÃ¥gÃ¥r\n" +#: fe-exec.c:2630 +#, c-format +msgid "unrecognized message type \"%c\"" +msgstr "okänd meddelandetyp \"%c\"" -#: fe-exec.c:2940 -msgid "PQfn not allowed in pipeline mode\n" -msgstr "PQfn tillÃ¥ts inte i pipeline-läge\n" +#: fe-exec.c:2702 fe-exec.c:2756 fe-exec.c:2824 fe-protocol3.c:1924 +#, c-format +msgid "no COPY in progress" +msgstr "ingen COPY körs" -#: fe-exec.c:2948 -msgid "connection in wrong state\n" -msgstr "anslutning i felaktigt tillstÃ¥nd\n" +#: fe-exec.c:3010 +#, c-format +msgid "connection in wrong state" +msgstr "anslutning i felaktigt tillstÃ¥nd" -#: fe-exec.c:2992 -msgid "cannot enter pipeline mode, connection not idle\n" -msgstr "kan inte byta till pipeline-läge, anslutningen är inte inaktiv\n" +#: fe-exec.c:3053 +#, c-format +msgid "cannot enter pipeline mode, connection not idle" +msgstr "kan inte byta till pipeline-läge, anslutningen är inte inaktiv" -#: fe-exec.c:3026 fe-exec.c:3043 -msgid "cannot exit pipeline mode with uncollected results\n" -msgstr "kan inte anvsluta pipeline-läge när alla svar inte tagits emot\n" +#: fe-exec.c:3089 fe-exec.c:3110 +#, c-format +msgid "cannot exit pipeline mode with uncollected results" +msgstr "kan inte anvsluta pipeline-läge när alla svar inte tagits emot" -#: fe-exec.c:3031 -msgid "cannot exit pipeline mode while busy\n" -msgstr "är upptagen och kan inte avsluta pipeline-läge\n" +#: fe-exec.c:3093 +#, c-format +msgid "cannot exit pipeline mode while busy" +msgstr "är upptagen och kan inte avsluta pipeline-läge" + +#: fe-exec.c:3104 +#, c-format +msgid "cannot exit pipeline mode while in COPY" +msgstr "kan inte avsluta pipeline-läge inne i en COPY" -#: fe-exec.c:3179 -msgid "cannot send pipeline when not in pipeline mode\n" -msgstr "kan inte skicka en pipeline när vi inte är i pipeline-läge\n" +#: fe-exec.c:3303 +#, c-format +msgid "cannot send pipeline when not in pipeline mode" +msgstr "kan inte skicka en pipeline när vi inte är i pipeline-läge" -#: fe-exec.c:3281 +#: fe-exec.c:3422 msgid "invalid ExecStatusType code" msgstr "ogiltig ExecStatusType-kod" -#: fe-exec.c:3308 +#: fe-exec.c:3449 msgid "PGresult is not an error result\n" msgstr "PGresult är inte ett felresultat\n" -#: fe-exec.c:3376 fe-exec.c:3399 +#: fe-exec.c:3517 fe-exec.c:3540 #, c-format msgid "column number %d is out of range 0..%d" msgstr "kolumnnummer %d är utanför giltigt intervall 0..%d" -#: fe-exec.c:3414 +#: fe-exec.c:3555 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "parameter nummer %d är utanför giltigt intervall 0..%d" -#: fe-exec.c:3725 +#: fe-exec.c:3866 #, c-format msgid "could not interpret result from server: %s" msgstr "kunde inte tolka svaret frÃ¥n servern: %s" -#: fe-exec.c:3987 fe-exec.c:4078 -msgid "incomplete multibyte character\n" -msgstr "ofullständigt multibyte-tecken\n" +#: fe-exec.c:4126 fe-exec.c:4260 +#, c-format +msgid "incomplete multibyte character" +msgstr "ofullständigt multibyte-tecken" -#: fe-gssapi-common.c:124 +#: fe-exec.c:4153 fe-exec.c:4279 +#, c-format +msgid "invalid multibyte character" +msgstr "ogiltigt multibyte-tecken" + +#: fe-gssapi-common.c:122 msgid "GSSAPI name import error" msgstr "GSSAPI-fel vid import av namn" -#: fe-lobj.c:145 fe-lobj.c:210 fe-lobj.c:403 fe-lobj.c:494 fe-lobj.c:568 -#: fe-lobj.c:972 fe-lobj.c:980 fe-lobj.c:988 fe-lobj.c:996 fe-lobj.c:1004 -#: fe-lobj.c:1012 fe-lobj.c:1020 fe-lobj.c:1028 +#: fe-lobj.c:144 fe-lobj.c:207 fe-lobj.c:397 fe-lobj.c:487 fe-lobj.c:560 +#: fe-lobj.c:956 fe-lobj.c:963 fe-lobj.c:970 fe-lobj.c:977 fe-lobj.c:984 +#: fe-lobj.c:991 fe-lobj.c:998 fe-lobj.c:1005 #, c-format -msgid "cannot determine OID of function %s\n" -msgstr "kan inte ta reda pÃ¥ OID för funktionen %s\n" +msgid "cannot determine OID of function %s" +msgstr "kan inte härleda OID för funktionen %s" -#: fe-lobj.c:162 -msgid "argument of lo_truncate exceeds integer range\n" -msgstr "argumentet till lo_truncate överskrider heltalsintervallet\n" +#: fe-lobj.c:160 +#, c-format +msgid "argument of lo_truncate exceeds integer range" +msgstr "argumentet till lo_truncate överskrider heltalsintervallet" -#: fe-lobj.c:266 -msgid "argument of lo_read exceeds integer range\n" -msgstr "ett argument till lo_read överskriver heltalsintervallet\n" +#: fe-lobj.c:262 +#, c-format +msgid "argument of lo_read exceeds integer range" +msgstr "ett argument till lo_read överskriver heltalsintervallet" -#: fe-lobj.c:318 -msgid "argument of lo_write exceeds integer range\n" -msgstr "ett argument till lo_write överskriver heltalsintervallet\n" +#: fe-lobj.c:313 +#, c-format +msgid "argument of lo_write exceeds integer range" +msgstr "ett argument till lo_write överskriver heltalsintervallet" -#: fe-lobj.c:678 fe-lobj.c:791 +#: fe-lobj.c:669 fe-lobj.c:780 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "kan inte öppna fil \"%s\": %s\n" +msgid "could not open file \"%s\": %s" +msgstr "kunde inte öppna fil \"%s\": %s" -#: fe-lobj.c:735 +#: fe-lobj.c:725 #, c-format -msgid "could not read from file \"%s\": %s\n" -msgstr "kunde inte läsa frÃ¥n fil \"%s\": %s\n" +msgid "could not read from file \"%s\": %s" +msgstr "kunde inte läsa frÃ¥n fil \"%s\": %s" -#: fe-lobj.c:813 fe-lobj.c:837 +#: fe-lobj.c:801 fe-lobj.c:824 #, c-format -msgid "could not write to file \"%s\": %s\n" -msgstr "kan inte skriva till fil \"%s\": %s\n" +msgid "could not write to file \"%s\": %s" +msgstr "kan inte skriva till fil \"%s\": %s" -#: fe-lobj.c:923 -msgid "query to initialize large object functions did not return data\n" -msgstr "frÃ¥ga för att initiera stort objekt-funktion returnerade ingen data\n" +#: fe-lobj.c:908 +#, c-format +msgid "query to initialize large object functions did not return data" +msgstr "frÃ¥ga för att initiera stort objekt-funktion returnerade ingen data" -#: fe-misc.c:242 +#: fe-misc.c:239 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "heltal med storlek %lu stöds inte av pqGetInt" -#: fe-misc.c:275 +#: fe-misc.c:272 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "heltal med storlek %lu stöds inte av pqPutInt" -#: fe-misc.c:576 fe-misc.c:822 -msgid "connection not open\n" -msgstr "anslutningen är inte öppen\n" - -#: fe-misc.c:755 fe-secure-openssl.c:218 fe-secure-openssl.c:325 -#: fe-secure.c:260 fe-secure.c:423 +#: fe-misc.c:750 fe-secure-openssl.c:203 fe-secure-openssl.c:309 +#: fe-secure.c:237 fe-secure.c:404 #, c-format msgid "" "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" -"\tbefore or while processing the request.\n" +"\tbefore or while processing the request." msgstr "" "servern stängde oväntat ner uppkopplingen\n" "\tTroligen sÃ¥ terminerade servern pga nÃ¥got fel antingen\n" -"\tinnan eller under tiden den bearbetade en förfrÃ¥gan.\n" +"\tinnan eller under tiden den bearbetade en förfrÃ¥gan." + +#: fe-misc.c:817 +msgid "connection not open\n" +msgstr "anslutningen är inte öppen\n" -#: fe-misc.c:1008 -msgid "timeout expired\n" -msgstr "timeout utgÃ¥ngen\n" +#: fe-misc.c:1005 +#, c-format +msgid "timeout expired" +msgstr "timeout utgÃ¥ngen" -#: fe-misc.c:1053 -msgid "invalid socket\n" -msgstr "ogiltigt uttag\n" +#: fe-misc.c:1049 +#, c-format +msgid "invalid socket" +msgstr "ogiltig socket" -#: fe-misc.c:1076 +#: fe-misc.c:1071 #, c-format -msgid "%s() failed: %s\n" -msgstr "%s() misslyckades: %s\n" +msgid "%s() failed: %s" +msgstr "%s() misslyckades: %s" -#: fe-protocol3.c:196 +#: fe-protocol3.c:187 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "meddelandetyp 0x%02x kom frÃ¥n server under viloperiod" -#: fe-protocol3.c:405 -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" -msgstr "servern skickade data (meddelande \"D\") utan att först skicka en radbeskrivning (meddelande \"T\")\n" +#: fe-protocol3.c:402 +#, c-format +msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" +msgstr "servern skickade data (meddelande \"D\") utan att först skicka en radbeskrivning (meddelande \"T\")" -#: fe-protocol3.c:448 +#: fe-protocol3.c:444 #, c-format -msgid "unexpected response from server; first received character was \"%c\"\n" -msgstr "oväntat svar för servern; första mottagna tecknet var \"%c\"\n" +msgid "unexpected response from server; first received character was \"%c\"" +msgstr "oväntat svar för servern; första mottagna tecknet var \"%c\"" -#: fe-protocol3.c:473 +#: fe-protocol3.c:467 #, c-format -msgid "message contents do not agree with length in message type \"%c\"\n" -msgstr "meddelandeinnehÃ¥ll stämmer inte med längden för meddelandetyp \"%c\"\n" +msgid "message contents do not agree with length in message type \"%c\"" +msgstr "meddelandeinnehÃ¥ll stämmer inte med längden för meddelandetyp \"%c\"" -#: fe-protocol3.c:493 +#: fe-protocol3.c:485 #, c-format -msgid "lost synchronization with server: got message type \"%c\", length %d\n" -msgstr "tappade synkronisering med servern: fick meddelandetyp \"%c\", längd %d\n" +msgid "lost synchronization with server: got message type \"%c\", length %d" +msgstr "tappade synkronisering med servern: fick meddelandetyp \"%c\", längd %d" -#: fe-protocol3.c:545 fe-protocol3.c:585 +#: fe-protocol3.c:537 fe-protocol3.c:577 msgid "insufficient data in \"T\" message" msgstr "otillräckligt med data i \"T\"-meddelande" -#: fe-protocol3.c:656 fe-protocol3.c:862 +#: fe-protocol3.c:648 fe-protocol3.c:854 msgid "out of memory for query result" msgstr "slut pÃ¥ minnet för frÃ¥geresultat" -#: fe-protocol3.c:725 +#: fe-protocol3.c:717 msgid "insufficient data in \"t\" message" msgstr "otillräckligt med data i \"t\"-meddelande" -#: fe-protocol3.c:784 fe-protocol3.c:816 fe-protocol3.c:834 +#: fe-protocol3.c:776 fe-protocol3.c:808 fe-protocol3.c:826 msgid "insufficient data in \"D\" message" msgstr "otillräckligt med data i \"D\"-meddelande" -#: fe-protocol3.c:790 +#: fe-protocol3.c:782 msgid "unexpected field count in \"D\" message" msgstr "oväntat fältantal i \"D\"-meddelande" -#: fe-protocol3.c:1046 +#: fe-protocol3.c:1037 msgid "no error message available\n" msgstr "inget felmeddelande finns tillgängligt\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1094 fe-protocol3.c:1113 +#: fe-protocol3.c:1085 fe-protocol3.c:1104 #, c-format msgid " at character %s" msgstr " vid tecken %s" -#: fe-protocol3.c:1126 +#: fe-protocol3.c:1117 #, c-format msgid "DETAIL: %s\n" msgstr "DETALJ: %s\n" -#: fe-protocol3.c:1129 +#: fe-protocol3.c:1120 #, c-format msgid "HINT: %s\n" msgstr "TIPS: %s\n" -#: fe-protocol3.c:1132 +#: fe-protocol3.c:1123 #, c-format msgid "QUERY: %s\n" msgstr "FRÃ…GA: %s\n" -#: fe-protocol3.c:1139 +#: fe-protocol3.c:1130 #, c-format msgid "CONTEXT: %s\n" msgstr "KONTEXT: %s\n" -#: fe-protocol3.c:1148 +#: fe-protocol3.c:1139 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "SCHEMANAMN: %s\n" -#: fe-protocol3.c:1152 +#: fe-protocol3.c:1143 #, c-format msgid "TABLE NAME: %s\n" msgstr "TABELLNAMN: %s\n" -#: fe-protocol3.c:1156 +#: fe-protocol3.c:1147 #, c-format msgid "COLUMN NAME: %s\n" msgstr "KOLUMNNAMN: %s\n" -#: fe-protocol3.c:1160 +#: fe-protocol3.c:1151 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "DATATYPNAMN: %s\n" -#: fe-protocol3.c:1164 +#: fe-protocol3.c:1155 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "VILLKORSNAMN: %s\n" -#: fe-protocol3.c:1176 +#: fe-protocol3.c:1167 msgid "LOCATION: " msgstr "PLATS: " -#: fe-protocol3.c:1178 +#: fe-protocol3.c:1169 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1180 +#: fe-protocol3.c:1171 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1375 +#: fe-protocol3.c:1366 #, c-format msgid "LINE %d: " msgstr "RAD %d: " -#: fe-protocol3.c:1774 -msgid "PQgetline: not doing text COPY OUT\n" -msgstr "PQgetline: utför inte text-COPY OUT\n" +#: fe-protocol3.c:1440 +#, c-format +msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u" +msgstr "protokollversionen stöds inte av servern: klienten använder %u.%u, servern stöder upp till %u.%u" -#: fe-protocol3.c:2151 -msgid "protocol error: no function result\n" -msgstr "protokollfel: inget funktionsresultat\n" +#: fe-protocol3.c:1446 +#, c-format +msgid "protocol extension not supported by server: %s" +msgid_plural "protocol extensions not supported by server: %s" +msgstr[0] "protokollutökning stöds inte av servern: %s" +msgstr[1] "protokollutökningar stöds inte av servern: %s" -#: fe-protocol3.c:2163 +#: fe-protocol3.c:1454 #, c-format -msgid "protocol error: id=0x%x\n" -msgstr "protokollfel: id=0x%x\n" +msgid "invalid %s message" +msgstr "ogiltig %s-meddelande" -#: fe-secure-common.c:126 -msgid "SSL certificate's name contains embedded null\n" -msgstr "SSL-certifikatets namn innehÃ¥ller null-värden\n" +#: fe-protocol3.c:1819 +#, c-format +msgid "PQgetline: not doing text COPY OUT" +msgstr "PQgetline: utför inte text-COPY OUT" -#: fe-secure-common.c:233 +#: fe-protocol3.c:2193 #, c-format -msgid "certificate contains IP address with invalid length %lu\n" -msgstr "certifikater innehÃ¥ller IP-adress med ogiltig längd %lu\n" +msgid "protocol error: no function result" +msgstr "protokollfel: inget funktionsresultat" -#: fe-secure-common.c:243 +#: fe-protocol3.c:2204 #, c-format -msgid "could not convert certificate's IP address to string: %s\n" -msgstr "kunde inte konvertera certifikatets IP-adress till sträng: %s\n" +msgid "protocol error: id=0x%x" +msgstr "protokollfel: id=0x%x" -#: fe-secure-common.c:276 -msgid "host name must be specified for a verified SSL connection\n" -msgstr "värdnamn mÃ¥ste anges för en verifierad SSL-anslutning\n" +#: fe-secure-common.c:123 +#, c-format +msgid "SSL certificate's name contains embedded null" +msgstr "SSL-certifikatets namn innehÃ¥ller null-värden" -#: fe-secure-common.c:301 +#: fe-secure-common.c:228 #, c-format -msgid "server certificate for \"%s\" does not match host name \"%s\"\n" -msgstr "servercertifikat för \"%s\" matchar inte värdnamn \"%s\"\n" +msgid "certificate contains IP address with invalid length %zu" +msgstr "certifikater innehÃ¥ller IP-adress med ogiltig längd %zu" -#: fe-secure-common.c:307 -msgid "could not get server's host name from server certificate\n" -msgstr "kan inte hämta ut serverns värdnamn frÃ¥n servercertifikatet\n" +#: fe-secure-common.c:237 +#, c-format +msgid "could not convert certificate's IP address to string: %s" +msgstr "kunde inte konvertera certifikatets IP-adress till sträng: %s" -#: fe-secure-gssapi.c:201 +#: fe-secure-common.c:269 +#, c-format +msgid "host name must be specified for a verified SSL connection" +msgstr "värdnamn mÃ¥ste anges för en verifierad SSL-anslutning" + +#: fe-secure-common.c:286 +#, c-format +msgid "server certificate for \"%s\" (and %d other name) does not match host name \"%s\"" +msgid_plural "server certificate for \"%s\" (and %d other names) does not match host name \"%s\"" +msgstr[0] "servercertifikat för \"%s\" (och %d annat namn) matchar inte värdnamn \"%s\"" +msgstr[1] "servercertifikat för \"%s\" (och %d andra namn) matchar inte värdnamn \"%s\"" + +#: fe-secure-common.c:294 +#, c-format +msgid "server certificate for \"%s\" does not match host name \"%s\"" +msgstr "servercertifikat för \"%s\" matchar inte värdnamn \"%s\"" + +#: fe-secure-common.c:299 +#, c-format +msgid "could not get server's host name from server certificate" +msgstr "kan inte hämta ut serverns värdnamn frÃ¥n servercertifikatet" + +#: fe-secure-gssapi.c:194 msgid "GSSAPI wrap error" msgstr "GSSAPI-fel vid inpackning" -#: fe-secure-gssapi.c:209 -msgid "outgoing GSSAPI message would not use confidentiality\n" -msgstr "utgÃ¥ende GSSAPI-meddelande skulle inte använda sekretess\n" +#: fe-secure-gssapi.c:201 +#, c-format +msgid "outgoing GSSAPI message would not use confidentiality" +msgstr "utÃ¥ende GSSAPI-meddelande skulle inte använda sekretess" -#: fe-secure-gssapi.c:217 +#: fe-secure-gssapi.c:208 #, c-format -msgid "client tried to send oversize GSSAPI packet (%zu > %zu)\n" -msgstr "klienten försöke skicka för stort GSSAPI-paket (%zu > %zu)\n" +msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" +msgstr "klienten försökte skicka för stort GSSAPI-paket (%zu > %zu)" -#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:596 +#: fe-secure-gssapi.c:347 fe-secure-gssapi.c:589 #, c-format -msgid "oversize GSSAPI packet sent by the server (%zu > %zu)\n" -msgstr "för stort GSSAPI-paket skickat av servern (%zu > %zu)\n" +msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" +msgstr "för stort GSSAPI-paket skickat av servern (%zu > %zu)" -#: fe-secure-gssapi.c:393 +#: fe-secure-gssapi.c:386 msgid "GSSAPI unwrap error" msgstr "GSSAPI-fel vid uppackning" -#: fe-secure-gssapi.c:403 -msgid "incoming GSSAPI message did not use confidentiality\n" -msgstr "inkommande GSSAPI-meddelande använde inte sekretess\n" +#: fe-secure-gssapi.c:395 +#, c-format +msgid "incoming GSSAPI message did not use confidentiality" +msgstr "inkommande GSSAPI-meddelande använde inte sekretess" -#: fe-secure-gssapi.c:642 +#: fe-secure-gssapi.c:652 msgid "could not initiate GSSAPI security context" msgstr "kunde inte initiera GSSAPI-säkerhetskontext" -#: fe-secure-gssapi.c:670 +#: fe-secure-gssapi.c:681 msgid "GSSAPI size check error" msgstr "GSSAPI-fel vid kontroll av storlek" -#: fe-secure-gssapi.c:681 +#: fe-secure-gssapi.c:692 msgid "GSSAPI context establishment error" msgstr "GSSAPI-fel vid skapande av kontext" -#: fe-secure-openssl.c:223 fe-secure-openssl.c:330 fe-secure-openssl.c:1499 +#: fe-secure-openssl.c:207 fe-secure-openssl.c:313 fe-secure-openssl.c:1524 #, c-format -msgid "SSL SYSCALL error: %s\n" -msgstr "SSL SYSCALL fel: %s\n" +msgid "SSL SYSCALL error: %s" +msgstr "SSL SYSCALL fel: %s" -#: fe-secure-openssl.c:230 fe-secure-openssl.c:337 fe-secure-openssl.c:1503 -msgid "SSL SYSCALL error: EOF detected\n" -msgstr "SSL SYSCALL-fel: EOF upptäckt\n" +#: fe-secure-openssl.c:213 fe-secure-openssl.c:319 fe-secure-openssl.c:1527 +#, c-format +msgid "SSL SYSCALL error: EOF detected" +msgstr "SSL SYSCALL-fel: EOF upptäckt" -#: fe-secure-openssl.c:241 fe-secure-openssl.c:348 fe-secure-openssl.c:1512 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:329 fe-secure-openssl.c:1535 #, c-format -msgid "SSL error: %s\n" -msgstr "SSL-fel: %s\n" +msgid "SSL error: %s" +msgstr "SSL-fel: %s" -#: fe-secure-openssl.c:256 fe-secure-openssl.c:363 -msgid "SSL connection has been closed unexpectedly\n" -msgstr "SSL-anslutning har oväntat stängts\n" +#: fe-secure-openssl.c:237 fe-secure-openssl.c:343 +#, c-format +msgid "SSL connection has been closed unexpectedly" +msgstr "SSL-anslutning har oväntat stängts" + +#: fe-secure-openssl.c:242 fe-secure-openssl.c:348 fe-secure-openssl.c:1582 +#, c-format +msgid "unrecognized SSL error code: %d" +msgstr "okänd SSL-felkod: %d" -#: fe-secure-openssl.c:262 fe-secure-openssl.c:369 fe-secure-openssl.c:1562 +#: fe-secure-openssl.c:390 #, c-format -msgid "unrecognized SSL error code: %d\n" -msgstr "okänd SSL-felkod: %d\n" +msgid "could not determine server certificate signature algorithm" +msgstr "kunde inte bestämma serverns algoritm för certifikatsignering" -#: fe-secure-openssl.c:409 -msgid "could not determine server certificate signature algorithm\n" -msgstr "kunde inte lista ut serverns algoritm för certifikatsignering\n" +#: fe-secure-openssl.c:410 +#, c-format +msgid "could not find digest for NID %s" +msgstr "kunde inte hitta kontrollsumma för NID %s" -#: fe-secure-openssl.c:430 +#: fe-secure-openssl.c:419 #, c-format -msgid "could not find digest for NID %s\n" -msgstr "kunde inte hitta kontrollsumma för NID %s\n" +msgid "could not generate peer certificate hash" +msgstr "kunde inte generera peer-certifikathash" -#: fe-secure-openssl.c:440 -msgid "could not generate peer certificate hash\n" -msgstr "kunde inte generera peer-certifikathash\n" +#: fe-secure-openssl.c:501 +#, c-format +msgid "SSL certificate's name entry is missing" +msgstr "SSL-certifikatets namnpost saknas" -#: fe-secure-openssl.c:497 -msgid "SSL certificate's name entry is missing\n" -msgstr "SSL-certifikatets namnpost saknas\n" +#: fe-secure-openssl.c:535 +#, c-format +msgid "SSL certificate's address entry is missing" +msgstr "SSL-certifikatets adresspost saknas" -#: fe-secure-openssl.c:532 -msgid "SSL certificate's address entry is missing\n" -msgstr "SSL-certifikatets adresspost saknas\n" +#: fe-secure-openssl.c:935 +#, c-format +msgid "could not create SSL context: %s" +msgstr "kunde inte skapa SSL-kontext: %s" -#: fe-secure-openssl.c:950 +#: fe-secure-openssl.c:977 #, c-format -msgid "could not create SSL context: %s\n" -msgstr "kan inte skapa SSL-omgivning: %s\n" +msgid "invalid value \"%s\" for minimum SSL protocol version" +msgstr "ogiltigt värde \"%s\" för minimal SSL-protokollversion" -#: fe-secure-openssl.c:989 +#: fe-secure-openssl.c:987 #, c-format -msgid "invalid value \"%s\" for minimum SSL protocol version\n" -msgstr "ogiltigt värde \"%s\" för minimal SSL-protokollversion\n" +msgid "could not set minimum SSL protocol version: %s" +msgstr "kunde inte sätta minimal SSL-protokollversion: %s" -#: fe-secure-openssl.c:1000 +#: fe-secure-openssl.c:1003 #, c-format -msgid "could not set minimum SSL protocol version: %s\n" -msgstr "kunde inte sätta minimal SSL-protokollversion: %s\n" +msgid "invalid value \"%s\" for maximum SSL protocol version" +msgstr "ogiltigt värde \"%s\" för maximal SSL-protokollversion" -#: fe-secure-openssl.c:1018 +#: fe-secure-openssl.c:1013 #, c-format -msgid "invalid value \"%s\" for maximum SSL protocol version\n" -msgstr "ogiltigt värde \"%s\" för maximal SSL-protokollversion\n" +msgid "could not set maximum SSL protocol version: %s" +msgstr "kunde inte sätta maximal SSL-protokollversion: %s" -#: fe-secure-openssl.c:1029 +#: fe-secure-openssl.c:1051 #, c-format -msgid "could not set maximum SSL protocol version: %s\n" -msgstr "kunde inte sätta maximal SSL-protokollversion: %s\n" +msgid "could not load system root certificate paths: %s" +msgstr "kunde inte ladda systemets root-certifikatsökvägar: %s" -#: fe-secure-openssl.c:1065 +#: fe-secure-openssl.c:1068 #, c-format -msgid "could not read root certificate file \"%s\": %s\n" -msgstr "kunde inte läsa root-certifikatfilen \"%s\": %s\n" +msgid "could not read root certificate file \"%s\": %s" +msgstr "kunde inte läsa root-certifikatfilen \"%s\": %s" -#: fe-secure-openssl.c:1118 +#: fe-secure-openssl.c:1120 +#, c-format msgid "" "could not get home directory to locate root certificate file\n" -"Either provide the file or change sslmode to disable server certificate verification.\n" +"Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." msgstr "" "kunde inte hämta hemkatalogen för att lokalisera root-certifikatfilen\n" -"Antingen tillhandahÃ¥ll filen eller ändra sslmode för att stänga av serverns certifikatverifiering.\n" +"Antingen tillhandahÃ¥ll filen, använd systemets betrodda root med sslrootcert=system eller ändra sslmode för att stänga av serverns certifikatverifiering." -#: fe-secure-openssl.c:1122 +#: fe-secure-openssl.c:1123 #, c-format msgid "" "root certificate file \"%s\" does not exist\n" -"Either provide the file or change sslmode to disable server certificate verification.\n" +"Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." msgstr "" "root-certifikatfilen \"%s\" finns inte\n" -"Antingen tillhandahÃ¥ll filen eller ändra sslmode för att stänga av serverns certifikatverifiering.\n" +"Antingen tillhandahÃ¥ll filen, använd systemets betrodda root med sslrootcert=system eller ändra sslmode för att stänga av serverns certifikatverifiering." + +#: fe-secure-openssl.c:1158 +#, c-format +msgid "could not open certificate file \"%s\": %s" +msgstr "kunde inte öppna certifikatfil \"%s\": %s" + +#: fe-secure-openssl.c:1176 +#, c-format +msgid "could not read certificate file \"%s\": %s" +msgstr "kunde inte läsa certifikatfil \"%s\": %s" + +#: fe-secure-openssl.c:1200 +#, c-format +msgid "could not establish SSL connection: %s" +msgstr "kan inte skapa SSL-anslutning: %s" -#: fe-secure-openssl.c:1153 +#: fe-secure-openssl.c:1232 #, c-format -msgid "could not open certificate file \"%s\": %s\n" -msgstr "kunde inte öppna certifikatfil \"%s\": %s\n" +msgid "could not set SSL Server Name Indication (SNI): %s" +msgstr "kunde inte sätta SSL servernamnsindikering (SNI): %s" -#: fe-secure-openssl.c:1172 +#: fe-secure-openssl.c:1249 #, c-format -msgid "could not read certificate file \"%s\": %s\n" -msgstr "kunde inte läsa certifikatfil \"%s\": %s\n" +msgid "could not set SSL ALPN extension: %s" +msgstr "kunde inte sätta utökning för SSL ALPN: %s" -#: fe-secure-openssl.c:1197 +#: fe-secure-openssl.c:1292 #, c-format -msgid "could not establish SSL connection: %s\n" -msgstr "kan inte skapa SSL-anslutning: %s\n" +msgid "could not load SSL engine \"%s\": %s" +msgstr "kunde inte ladda SSL-motor \"%s\": %s" -#: fe-secure-openssl.c:1231 +#: fe-secure-openssl.c:1303 #, c-format -msgid "could not set SSL Server Name Indication (SNI): %s\n" -msgstr "kunde inte sätta SSL servernamnsindikering (SNI): %s\n" +msgid "could not initialize SSL engine \"%s\": %s" +msgstr "kunde inte initiera SSL-motor \"%s\": %s" -#: fe-secure-openssl.c:1277 +#: fe-secure-openssl.c:1318 #, c-format -msgid "could not load SSL engine \"%s\": %s\n" -msgstr "kunde inte ladda SSL-motor \"%s\": %s\n" +msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" +msgstr "kunde inte läsa privat SSL-nyckel \"%s\" frÃ¥n motor \"%s\": %s" -#: fe-secure-openssl.c:1289 +#: fe-secure-openssl.c:1331 #, c-format -msgid "could not initialize SSL engine \"%s\": %s\n" -msgstr "kunde inte initiera SSL-motor \"%s\": %s\n" +msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" +msgstr "kunde inte ladda privat SSL-nyckel \"%s\" frÃ¥n motor \"%s\": %s" -#: fe-secure-openssl.c:1305 +#: fe-secure-openssl.c:1368 #, c-format -msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "kunde inte läsa privat SSL-nyckel \"%s\" frÃ¥n motor \"%s\": %s\n" +msgid "certificate present, but not private key file \"%s\"" +msgstr "certifikat tillgängligt, men inte den privata nyckelfilen \"%s\"" -#: fe-secure-openssl.c:1319 +#: fe-secure-openssl.c:1371 #, c-format -msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "kunde inte ladda privat SSL-nyckel \"%s\" frÃ¥n motor \"%s\": %s\n" +msgid "could not stat private key file \"%s\": %m" +msgstr "kunde inte köra stat() pÃ¥ privata nyckelfilen \"%s\": %m" -#: fe-secure-openssl.c:1357 +#: fe-secure-openssl.c:1379 #, c-format -msgid "certificate present, but not private key file \"%s\"\n" -msgstr "certifikat tillgängligt, men inte den privata nyckelfilen \"%s\"\n" +msgid "private key file \"%s\" is not a regular file" +msgstr "privat nyckelfil \"%s\" är inte en vanlig fil" -#: fe-secure-openssl.c:1361 +#: fe-secure-openssl.c:1412 #, c-format -msgid "could not stat private key file \"%s\": %m\n" -msgstr "kunde inte köra stat() pÃ¥ privata nyckelfilen \"%s\": %m\n" +msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root" +msgstr "privata nyckelfilen \"%s\" har grupp- eller världsrättigheter; filen mÃ¥ste ha rättigheterna u=rw (0600) eller mindre om den ägs av databasanvändaren eller rättigheterna u=rw,g=r (0640) eller mindre om den ägs av root." -#: fe-secure-openssl.c:1370 +#: fe-secure-openssl.c:1436 #, c-format -msgid "private key file \"%s\" is not a regular file\n" -msgstr "privat nyckelfilen \"%s\" är inte en vanlig fil\n" +msgid "could not load private key file \"%s\": %s" +msgstr "kunde inte läsa in privata nyckelfilen \"%s\": %s" -#: fe-secure-openssl.c:1394 +#: fe-secure-openssl.c:1452 #, c-format -msgid "private key file \"%s\" must be owned by the current user or root\n" -msgstr "privat nyckelfilen \"%s\" mÃ¥ste ägas av databasanvändaren eller root\n" +msgid "certificate does not match private key file \"%s\": %s" +msgstr "certifikatet matchar inte den privata nyckelfilen \"%s\": %s" -#: fe-secure-openssl.c:1403 +#: fe-secure-openssl.c:1521 #, c-format -msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root\n" -msgstr "privata nyckelfilen \"%s\" har grupp- eller världsrättigheter; filen mÃ¥ste ha rättigheterna u=rw (0600) eller mindre om den ägs av databasanvändaren eller rättigheterna u=rw,g=r (0640) eller mindre om den ägs av root.\n" +msgid "SSL error: certificate verify failed: %s" +msgstr "SSL-fel: verifiering av certifikat misslyckades: %s" -#: fe-secure-openssl.c:1428 +#: fe-secure-openssl.c:1566 #, c-format -msgid "could not load private key file \"%s\": %s\n" -msgstr "kunde inte ladda privata nyckelfilen \"%s\": %s\n" +msgid "This may indicate that the server does not support any SSL protocol version between %s and %s." +msgstr "Detta kan tyda pÃ¥ att servern inte stöder nÃ¥gon SSL-protokolversion mellan %s oc %s." -#: fe-secure-openssl.c:1445 +#: fe-secure-openssl.c:1598 #, c-format -msgid "certificate does not match private key file \"%s\": %s\n" -msgstr "certifikatet matchar inte den privata nyckelfilen \"%s\": %s\n" +msgid "direct SSL connection was established without ALPN protocol negotiation extension" +msgstr "direkt SSL-anslutning har upprättats utan utökning för ALPN-protokollförhandling" -#: fe-secure-openssl.c:1545 +#: fe-secure-openssl.c:1610 #, c-format -msgid "This may indicate that the server does not support any SSL protocol version between %s and %s.\n" -msgstr "Detta kan tyda pÃ¥ att servern inte stöder nÃ¥gon SSL-protokolversion mellan %s och %s.\n" +msgid "SSL connection was established with unexpected ALPN protocol" +msgstr "SSL-anslutning har upprättats med oväntat ALPN-protokoll" -#: fe-secure-openssl.c:1581 +#: fe-secure-openssl.c:1627 #, c-format -msgid "certificate could not be obtained: %s\n" -msgstr "certifikatet kunde inte hämtas: %s\n" +msgid "certificate could not be obtained: %s" +msgstr "certifikatet kunde inte hämtas: %s" -#: fe-secure-openssl.c:1687 +#: fe-secure-openssl.c:1734 #, c-format msgid "no SSL error reported" msgstr "inget SSL-fel rapporterat" -#: fe-secure-openssl.c:1696 +#: fe-secure-openssl.c:1777 #, c-format msgid "SSL error code %lu" msgstr "SSL-felkod %lu" -#: fe-secure-openssl.c:1944 +#: fe-secure-openssl.c:2076 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "VARNING: sslpassword trunkerat\n" -#: fe-secure.c:267 +#: fe-secure.c:248 #, c-format -msgid "could not receive data from server: %s\n" -msgstr "kan inte ta emot data frÃ¥n servern: %s\n" +msgid "could not receive data from server: %s" +msgstr "kunde inte ta emot data frÃ¥n servern: %s" -#: fe-secure.c:436 +#: fe-secure.c:419 #, c-format -msgid "could not send data to server: %s\n" -msgstr "kan inte skicka data till servern: %s\n" +msgid "could not send data to server: %s" +msgstr "kunde inte skicka data till servern: %s" -#: win32.c:314 +#: win32.c:310 #, c-format msgid "unrecognized socket error: 0x%08X/%d" -msgstr "okänt uttagsfel: 0x%08X/%d" +msgstr "okänt socket-fel: 0x%08X/%d" diff --git a/src/interfaces/libpq/po/uk.po b/src/interfaces/libpq/po/uk.po index de5d8f21c2876..1ea4784ad1efd 100644 --- a/src/interfaces/libpq/po/uk.po +++ b/src/interfaces/libpq/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-08-17 08:39+0000\n" -"PO-Revision-Date: 2021-08-17 11:25\n" +"POT-Creation-Date: 2025-03-29 10:30+0000\n" +"PO-Revision-Date: 2025-04-01 15:40\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,1185 +14,1518 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_14_DEV/libpq.pot\n" -"X-Crowdin-File-ID: 774\n" - -#: fe-auth-scram.c:213 -msgid "malformed SCRAM message (empty message)\n" -msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (пуÑте повідомленнÑ)\n" - -#: fe-auth-scram.c:219 -msgid "malformed SCRAM message (length mismatch)\n" -msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (невідповідніÑть довжини)\n" - -#: fe-auth-scram.c:263 -msgid "could not verify server signature\n" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ñервера\n" - -#: fe-auth-scram.c:270 -msgid "incorrect server signature\n" -msgstr "невірний Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ñервера\n" - -#: fe-auth-scram.c:279 -msgid "invalid SCRAM exchange state\n" -msgstr "неприпуÑтимий Ñтан обміну SCRAM\n" - -#: fe-auth-scram.c:306 -#, c-format -msgid "malformed SCRAM message (attribute \"%c\" expected)\n" -msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (очікувавÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚ \"%c\")\n" - -#: fe-auth-scram.c:315 -#, c-format -msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" -msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (очікувавÑÑ Ñимвол \"=\" Ð´Ð»Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð° \"%c\")\n" - -#: fe-auth-scram.c:356 -msgid "could not generate nonce\n" -msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ одноразовий ідентифікатор\n" - -#: fe-auth-scram.c:366 fe-auth-scram.c:441 fe-auth-scram.c:595 -#: fe-auth-scram.c:616 fe-auth-scram.c:642 fe-auth-scram.c:657 -#: fe-auth-scram.c:707 fe-auth-scram.c:746 fe-auth.c:290 fe-auth.c:362 -#: fe-auth.c:398 fe-auth.c:615 fe-auth.c:774 fe-auth.c:1132 fe-auth.c:1282 -#: fe-connect.c:911 fe-connect.c:1455 fe-connect.c:1624 fe-connect.c:2976 -#: fe-connect.c:4657 fe-connect.c:4918 fe-connect.c:5037 fe-connect.c:5289 -#: fe-connect.c:5370 fe-connect.c:5469 fe-connect.c:5725 fe-connect.c:5754 -#: fe-connect.c:5826 fe-connect.c:5850 fe-connect.c:5868 fe-connect.c:5969 -#: fe-connect.c:5978 fe-connect.c:6336 fe-connect.c:6486 fe-connect.c:6752 -#: fe-exec.c:686 fe-exec.c:876 fe-exec.c:1223 fe-exec.c:3043 fe-exec.c:3226 -#: fe-exec.c:3999 fe-exec.c:4164 fe-gssapi-common.c:111 fe-lobj.c:881 -#: fe-protocol3.c:975 fe-protocol3.c:990 fe-protocol3.c:1023 -#: fe-protocol3.c:1731 fe-secure-common.c:110 fe-secure-gssapi.c:504 -#: fe-secure-openssl.c:440 fe-secure-openssl.c:1133 -msgid "out of memory\n" -msgstr "недоÑтатньо пам'Ñті\n" +"X-Crowdin-File: /REL_17_STABLE/libpq.pot\n" +"X-Crowdin-File-ID: 1026\n" + +#: ../../port/user.c:43 ../../port/user.c:79 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ локального кориÑтувача з ідентифікатором %d: %s" + +#: ../../port/user.c:48 ../../port/user.c:84 +#, c-format +msgid "local user with ID %d does not exist" +msgstr "локального кориÑтувача з ідентифікатором %d не Ñ–Ñнує" + +#: fe-auth-scram.c:223 +#, c-format +msgid "malformed SCRAM message (empty message)" +msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (пуÑте повідомленнÑ)" + +#: fe-auth-scram.c:228 +#, c-format +msgid "malformed SCRAM message (length mismatch)" +msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (невідповідніÑть довжини)" + +#: fe-auth-scram.c:272 +#, c-format +msgid "could not verify server signature: %s" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€Ð¸Ñ‚Ð¸ Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ñервера: %s" + +#: fe-auth-scram.c:278 +#, c-format +msgid "incorrect server signature" +msgstr "невірний Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ñервера" -#: fe-auth-scram.c:374 -msgid "could not encode nonce\n" -msgstr "не вдалоÑÑ Ð·Ð°ÐºÐ¾Ð´ÑƒÐ²Ð°Ñ‚Ð¸ одноразовий ідентифікатор\n" +#: fe-auth-scram.c:287 +#, c-format +msgid "invalid SCRAM exchange state" +msgstr "неприпуÑтимий Ñтан обміну SCRAM" + +#: fe-auth-scram.c:311 +#, c-format +msgid "malformed SCRAM message (attribute \"%c\" expected)" +msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (очікувавÑÑ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚ \"%c\")" + +#: fe-auth-scram.c:320 +#, c-format +msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")" +msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (очікувавÑÑ Ñимвол \"=\" Ð´Ð»Ñ Ð°Ñ‚Ñ€Ð¸Ð±ÑƒÑ‚Ð° \"%c\")" + +#: fe-auth-scram.c:360 +#, c-format +msgid "could not generate nonce" +msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ одноразовий ідентифікатор" + +#: fe-auth-scram.c:369 fe-auth-scram.c:442 fe-auth-scram.c:594 +#: fe-auth-scram.c:614 fe-auth-scram.c:638 fe-auth-scram.c:652 +#: fe-auth-scram.c:698 fe-auth-scram.c:734 fe-auth-scram.c:908 fe-auth.c:296 +#: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:727 fe-auth.c:1200 +#: fe-auth.c:1363 fe-cancel.c:159 fe-connect.c:936 fe-connect.c:976 +#: fe-connect.c:1860 fe-connect.c:2022 fe-connect.c:3430 fe-connect.c:4761 +#: fe-connect.c:5073 fe-connect.c:5328 fe-connect.c:5446 fe-connect.c:5693 +#: fe-connect.c:5773 fe-connect.c:5871 fe-connect.c:6122 fe-connect.c:6149 +#: fe-connect.c:6225 fe-connect.c:6248 fe-connect.c:6272 fe-connect.c:6307 +#: fe-connect.c:6393 fe-connect.c:6401 fe-connect.c:6758 fe-connect.c:6908 +#: fe-exec.c:530 fe-exec.c:1315 fe-exec.c:3254 fe-exec.c:4291 fe-exec.c:4457 +#: fe-gssapi-common.c:109 fe-lobj.c:870 fe-protocol3.c:209 fe-protocol3.c:232 +#: fe-protocol3.c:255 fe-protocol3.c:272 fe-protocol3.c:293 fe-protocol3.c:369 +#: fe-protocol3.c:737 fe-protocol3.c:976 fe-protocol3.c:1787 +#: fe-protocol3.c:2187 fe-secure-common.c:110 fe-secure-gssapi.c:496 +#: fe-secure-openssl.c:427 fe-secure-openssl.c:1277 +#, c-format +msgid "out of memory" +msgstr "недоÑтатньо пам'Ñті" + +#: fe-auth-scram.c:376 +#, c-format +msgid "could not encode nonce" +msgstr "не вдалоÑÑ Ð·Ð°ÐºÐ¾Ð´ÑƒÐ²Ð°Ñ‚Ð¸ одноразовий ідентифікатор" -#: fe-auth-scram.c:563 -msgid "could not calculate client proof\n" -msgstr "не вдалоÑÑ Ð¾Ð±Ñ‡Ð¸Ñлити Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°\n" +#: fe-auth-scram.c:564 +#, c-format +msgid "could not calculate client proof: %s" +msgstr "не вдалоÑÑ Ð¾Ð±Ñ‡Ð¸Ñлити Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°: %s" #: fe-auth-scram.c:579 -msgid "could not encode client proof\n" -msgstr "не вдалоÑÑ Ð·Ð°ÐºÐ¾Ð´ÑƒÐ²Ð°Ñ‚Ð¸ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°\n" +#, c-format +msgid "could not encode client proof" +msgstr "не вдалоÑÑ Ð·Ð°ÐºÐ¾Ð´ÑƒÐ²Ð°Ñ‚Ð¸ Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð°" -#: fe-auth-scram.c:634 -msgid "invalid SCRAM response (nonce mismatch)\n" -msgstr "неприпуÑтима відповідь SCRAM (невідповідніÑть одноразового ідентифікатора)\n" +#: fe-auth-scram.c:631 +#, c-format +msgid "invalid SCRAM response (nonce mismatch)" +msgstr "неприпуÑтима відповідь SCRAM (невідповідніÑть одноразового ідентифікатора)" -#: fe-auth-scram.c:667 -msgid "malformed SCRAM message (invalid salt)\n" -msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (неприпуÑтима Ñіль)\n" +#: fe-auth-scram.c:661 +#, c-format +msgid "malformed SCRAM message (invalid salt)" +msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (неприпуÑтима Ñіль)" -#: fe-auth-scram.c:681 -msgid "malformed SCRAM message (invalid iteration count)\n" -msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (неприпуÑтима кількіÑть ітерацій)\n" +#: fe-auth-scram.c:674 +#, c-format +msgid "malformed SCRAM message (invalid iteration count)" +msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (неприпуÑтима кількіÑть ітерацій)" + +#: fe-auth-scram.c:679 +#, c-format +msgid "malformed SCRAM message (garbage at end of server-first-message)" +msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (ÑÐ¼Ñ–Ñ‚Ñ‚Ñ Ð² кінці першого Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñервера)" -#: fe-auth-scram.c:687 -msgid "malformed SCRAM message (garbage at end of server-first-message)\n" -msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (ÑÐ¼Ñ–Ñ‚Ñ‚Ñ Ð² кінці першого Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñервера)\n" +#: fe-auth-scram.c:713 +#, c-format +msgid "error received from server in SCRAM exchange: %s" +msgstr "отримано помилку від Ñервера під Ñ‡Ð°Ñ Ð¾Ð±Ð¼Ñ–Ð½Ñƒ SCRAM: %s" -#: fe-auth-scram.c:723 +#: fe-auth-scram.c:728 #, c-format -msgid "error received from server in SCRAM exchange: %s\n" -msgstr "отримано помилку від Ñервера під Ñ‡Ð°Ñ Ð¾Ð±Ð¼Ñ–Ð½Ñƒ SCRAM: %s\n" +msgid "malformed SCRAM message (garbage at end of server-final-message)" +msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (ÑÐ¼Ñ–Ñ‚Ñ‚Ñ Ð² кінці оÑтаннього Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñервера)" -#: fe-auth-scram.c:739 -msgid "malformed SCRAM message (garbage at end of server-final-message)\n" -msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (ÑÐ¼Ñ–Ñ‚Ñ‚Ñ Ð² кінці оÑтаннього Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ñервера)\n" +#: fe-auth-scram.c:745 +#, c-format +msgid "malformed SCRAM message (invalid server signature)" +msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (неприпуÑтимий Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ñервера)" -#: fe-auth-scram.c:758 -msgid "malformed SCRAM message (invalid server signature)\n" -msgstr "неправильне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ SCRAM (неприпуÑтимий Ð¿Ñ–Ð´Ð¿Ð¸Ñ Ñервера)\n" +#: fe-auth-scram.c:917 +msgid "could not generate random salt" +msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ випадкову Ñіль" -#: fe-auth.c:76 +#: fe-auth.c:77 #, c-format -msgid "out of memory allocating GSSAPI buffer (%d)\n" -msgstr "недоÑтатньо пам'Ñті Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð° GSSAPI (%d)\n" +msgid "out of memory allocating GSSAPI buffer (%d)" +msgstr "недоÑтатньо пам'Ñті Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð° GSSAPI (%d)" -#: fe-auth.c:131 +#: fe-auth.c:138 msgid "GSSAPI continuation error" msgstr "Помилка Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Ñƒ GSSAPI" -#: fe-auth.c:158 fe-auth.c:391 fe-gssapi-common.c:98 fe-secure-common.c:98 -msgid "host name must be specified\n" -msgstr "потрібно вказати Ñ–Ð¼â€™Ñ Ñ…Ð¾Ñта\n" +#: fe-auth.c:168 fe-auth.c:397 fe-gssapi-common.c:97 fe-secure-common.c:99 +#: fe-secure-common.c:173 +#, c-format +msgid "host name must be specified" +msgstr "необхідно вказати ім'Ñ Ñ…Ð¾Ñту" -#: fe-auth.c:165 -msgid "duplicate GSS authentication request\n" -msgstr "дублікат запиту автентифікації GSS\n" +#: fe-auth.c:174 +#, c-format +msgid "duplicate GSS authentication request" +msgstr "дублікат запиту автентифікації GSS" -#: fe-auth.c:230 +#: fe-auth.c:238 #, c-format -msgid "out of memory allocating SSPI buffer (%d)\n" -msgstr "недоÑтатньо пам'Ñті Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð° SSPI (%d)\n" +msgid "out of memory allocating SSPI buffer (%d)" +msgstr "недоÑтатньо пам'Ñті Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð° SSPI (%d)" -#: fe-auth.c:278 +#: fe-auth.c:285 msgid "SSPI continuation error" msgstr "Помилка Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ SSPI" -#: fe-auth.c:351 -msgid "duplicate SSPI authentication request\n" -msgstr "дублікат запиту автентифікації SSPI\n" +#: fe-auth.c:359 +#, c-format +msgid "duplicate SSPI authentication request" +msgstr "дублікат запиту автентифікації SSPI" -#: fe-auth.c:377 +#: fe-auth.c:384 msgid "could not acquire SSPI credentials" msgstr "не вдалоÑÑŒ отримати облікові дані SSPI" -#: fe-auth.c:433 -msgid "channel binding required, but SSL not in use\n" -msgstr "необхідно зв’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð², але SSL не викориÑтовуєтьÑÑ\n" +#: fe-auth.c:436 +#, c-format +msgid "channel binding required, but SSL not in use" +msgstr "необхідно зв’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð², але SSL не викориÑтовуєтьÑÑ" -#: fe-auth.c:440 -msgid "duplicate SASL authentication request\n" -msgstr "дублікат запиту автентифікації SASL\n" +#: fe-auth.c:442 +#, c-format +msgid "duplicate SASL authentication request" +msgstr "дублікат запиту автентифікації SASL" -#: fe-auth.c:496 -msgid "channel binding is required, but client does not support it\n" -msgstr "потрібно зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð², але клієнт не підтримує його\n" +#: fe-auth.c:500 +#, c-format +msgid "channel binding is required, but client does not support it" +msgstr "потрібно зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð², але клієнт не підтримує його" -#: fe-auth.c:513 -msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection\n" -msgstr "Ñервер запропонував автентифікацію SCRAM-SHA-256-PLUS через Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð±ÐµÐ· SSL\n" +#: fe-auth.c:516 +#, c-format +msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection" +msgstr "Ñервер запропонував автентифікацію SCRAM-SHA-256-PLUS через Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð±ÐµÐ· SSL" -#: fe-auth.c:525 -msgid "none of the server's SASL authentication mechanisms are supported\n" -msgstr "жоден з Ñерверних механізмів автентифікації SASL не підтримуєтьÑÑ\n" +#: fe-auth.c:531 +#, c-format +msgid "none of the server's SASL authentication mechanisms are supported" +msgstr "жоден з Ñерверних механізмів автентифікації SASL не підтримуєтьÑÑ" -#: fe-auth.c:533 -msgid "channel binding is required, but server did not offer an authentication method that supports channel binding\n" -msgstr "потрібно зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð², але Ñервер не запропонував метод аутентифікації, Ñкий підтримує зв’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð²\n" +#: fe-auth.c:538 +#, c-format +msgid "channel binding is required, but server did not offer an authentication method that supports channel binding" +msgstr "потрібно зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð², але Ñервер не запропонував метод аутентифікації, Ñкий підтримує зв’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð²" -#: fe-auth.c:639 +#: fe-auth.c:640 #, c-format -msgid "out of memory allocating SASL buffer (%d)\n" -msgstr "недоÑтатньо пам'Ñті Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð° SASL (%d)\n" +msgid "out of memory allocating SASL buffer (%d)" +msgstr "недоÑтатньо пам'Ñті Ð´Ð»Ñ Ð±ÑƒÑ„ÐµÑ€Ð° SASL (%d)" -#: fe-auth.c:664 -msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed\n" -msgstr "Від Ñервера отримано AuthenticationSASLFinal, але Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ SASL не була завершена\n" +#: fe-auth.c:663 +#, c-format +msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed" +msgstr "Від Ñервера отримано AuthenticationSASLFinal, але Ð°Ð²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ SASL не була завершена" -#: fe-auth.c:741 -msgid "SCM_CRED authentication method not supported\n" -msgstr "СпоÑіб автентифікації SCM_CRED не підтримуєтьÑÑ\n" +#: fe-auth.c:673 +#, c-format +msgid "no client response found after SASL exchange success" +msgstr "піÑÐ»Ñ ÑƒÑпішного обміну SASL немає відповіді клієнта" -#: fe-auth.c:836 -msgid "channel binding required, but server authenticated client without channel binding\n" -msgstr "потрібно зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð², але Ñервер автентифікував клієнта без зв’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð²\n" +#: fe-auth.c:736 fe-auth.c:743 fe-auth.c:1346 fe-auth.c:1357 +#, c-format +msgid "could not encrypt password: %s" +msgstr "не вдалоÑÑ Ð·Ð°ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ñ‚Ð¸ пароль: %s" -#: fe-auth.c:842 -msgid "channel binding required but not supported by server's authentication request\n" -msgstr "потрібно зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð², але не підтримуєтьÑÑ Ð·Ð°Ð¿Ð¸Ñ‚Ð¾Ð¼ на аутентифікацію Ñервера\n" +#: fe-auth.c:772 +msgid "server requested a cleartext password" +msgstr "Ñервер надіÑлав запит на пароль проÑтим текÑтом" -#: fe-auth.c:877 -msgid "Kerberos 4 authentication not supported\n" -msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Kerberos 4 не підтримуєтьÑÑ\n" +#: fe-auth.c:774 +msgid "server requested a hashed password" +msgstr "Ñервер надіÑлав запит на хешований пароль" -#: fe-auth.c:882 -msgid "Kerberos 5 authentication not supported\n" -msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Kerberos 5 не підтримуєтьÑÑ\n" +#: fe-auth.c:777 +msgid "server requested GSSAPI authentication" +msgstr "Ñервер запроÑив автентифікацію GSSAPI" -#: fe-auth.c:953 -msgid "GSSAPI authentication not supported\n" -msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ GSSAPI не підтримуєтьÑÑ\n" +#: fe-auth.c:779 +msgid "server requested SSPI authentication" +msgstr "Ñервер запроÑив автентифікацію SSPI" -#: fe-auth.c:985 -msgid "SSPI authentication not supported\n" -msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ SSPI не підтримуєтьÑÑ\n" +#: fe-auth.c:783 +msgid "server requested SASL authentication" +msgstr "Ñервер запроÑив автентифікацію SASL" -#: fe-auth.c:993 -msgid "Crypt authentication not supported\n" -msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Crypt не підтримуєтьÑÑ\n" +#: fe-auth.c:786 +msgid "server requested an unknown authentication type" +msgstr "Ñервер надіÑлав запит невідомого типу автентифікації" -#: fe-auth.c:1060 +#: fe-auth.c:819 #, c-format -msgid "authentication method %u not supported\n" -msgstr "ÑпоÑіб автентифікації %u не підтримуєтьÑÑ\n" +msgid "server did not request an SSL certificate" +msgstr "Ñервер не запитував SSL-Ñертифікат" -#: fe-auth.c:1107 +#: fe-auth.c:824 #, c-format -msgid "user name lookup failure: error code %lu\n" -msgstr "невдала підÑтановка імені кориÑтувача: код помилки %lu\n" +msgid "server accepted connection without a valid SSL certificate" +msgstr "Ñервер приймає Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð±ÐµÐ· дійÑного SSL-Ñертифікату" -#: fe-auth.c:1117 fe-connect.c:2851 +#: fe-auth.c:878 +msgid "server did not complete authentication" +msgstr "Ñервер не пройшов автентифікацію" + +#: fe-auth.c:912 +#, c-format +msgid "authentication method requirement \"%s\" failed: %s" +msgstr "помилка вимоги \"%s\" методу автентифікації: %s" + +#: fe-auth.c:935 #, c-format -msgid "could not look up local user ID %d: %s\n" -msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ локального кориÑтувача за ідентифікатором: %d: %s\n" +msgid "channel binding required, but server authenticated client without channel binding" +msgstr "потрібно зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð², але Ñервер автентифікував клієнта без зв’ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð²" -#: fe-auth.c:1122 fe-connect.c:2856 +#: fe-auth.c:940 #, c-format -msgid "local user with ID %d does not exist\n" -msgstr "локального кориÑтувача з ідентифікатором %d не Ñ–Ñнує\n" +msgid "channel binding required but not supported by server's authentication request" +msgstr "потрібно зв'ÑÐ·ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð², але не підтримуєтьÑÑ Ð·Ð°Ð¿Ð¸Ñ‚Ð¾Ð¼ на аутентифікацію Ñервера" -#: fe-auth.c:1226 -msgid "unexpected shape of result set returned for SHOW\n" -msgstr "неочікувану форму набору результатів повернуто Ð´Ð»Ñ SHOW\n" +#: fe-auth.c:974 +#, c-format +msgid "Kerberos 4 authentication not supported" +msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Kerberos 4 не підтримуєтьÑÑ" -#: fe-auth.c:1235 -msgid "password_encryption value too long\n" -msgstr "занадто довге Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ password_encryption \n" +#: fe-auth.c:978 +#, c-format +msgid "Kerberos 5 authentication not supported" +msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Kerberos 5 не підтримуєтьÑÑ" -#: fe-auth.c:1275 +#: fe-auth.c:1048 #, c-format -msgid "unrecognized password encryption algorithm \"%s\"\n" -msgstr "нерозпізнаний алгоритм ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ \"%s\"\n" +msgid "GSSAPI authentication not supported" +msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ GSSAPI не підтримуєтьÑÑ" -#: fe-connect.c:1094 +#: fe-auth.c:1079 #, c-format -msgid "could not match %d host names to %d hostaddr values\n" -msgstr "не вдалоÑÑ Ð·Ñ–Ñтавити %d імен хоÑтів зі %d значеннÑми hostaddr\n" +msgid "SSPI authentication not supported" +msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ SSPI не підтримуєтьÑÑ" -#: fe-connect.c:1175 +#: fe-auth.c:1086 #, c-format -msgid "could not match %d port numbers to %d hosts\n" -msgstr "не вдалоÑÑ Ð·Ñ–Ñтавити %d номерів портів з %d хоÑтами\n" +msgid "Crypt authentication not supported" +msgstr "ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Crypt не підтримуєтьÑÑ" -#: fe-connect.c:1268 fe-connect.c:1294 fe-connect.c:1336 fe-connect.c:1345 -#: fe-connect.c:1378 fe-connect.c:1422 +#: fe-auth.c:1150 #, c-format -msgid "invalid %s value: \"%s\"\n" -msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s : \"%s\"\n" +msgid "authentication method %u not supported" +msgstr "ÑпоÑіб автентифікації %u не підтримуєтьÑÑ" -#: fe-connect.c:1315 +#: fe-auth.c:1187 #, c-format -msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ sslmode \"%s\" неприпуÑтиме, Ñкщо підтримку протоколу SSL не Ñкомпільовано\n" +msgid "user name lookup failure: error code %lu" +msgstr "невдала підÑтановка імені кориÑтувача: код помилки %lu" -#: fe-connect.c:1363 -msgid "invalid SSL protocol version range\n" -msgstr "неприпуÑтимий діапазон верÑÑ–Ñ— протоколу SSL\n" +#: fe-auth.c:1309 +#, c-format +msgid "unexpected shape of result set returned for SHOW" +msgstr "неочікувана форма набору результатів повернулаÑÑ Ð´Ð»Ñ SHOW" -#: fe-connect.c:1388 +#: fe-auth.c:1317 #, c-format -msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in\n" -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ gssencmode \"%s\" неприпуÑтиме, Ñкщо підтримку протоколу GSSAPI не Ñкомпільовано\n" +msgid "\"password_encryption\" value too long" +msgstr "занадто довге Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"password_encryption\"" -#: fe-connect.c:1648 +#: fe-auth.c:1367 #, c-format -msgid "could not set socket to TCP no delay mode: %s\n" -msgstr "не вдалоÑÑ Ð²Ñтановити Ñокет у TCP-режим без затримки: %s\n" +msgid "unrecognized password encryption algorithm \"%s\"" +msgstr "нерозпізнаний алгоритм ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ \"%s\"" -#: fe-connect.c:1710 +#: fe-cancel.c:76 +#, c-format +msgid "connection pointer is NULL" +msgstr "нульове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ñ–Ð²Ð½Ð¸ÐºÐ° підключеннÑ" + +#: fe-cancel.c:82 fe-misc.c:572 +#, c-format +msgid "connection not open" +msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð½Ðµ відкрито" + +#: fe-cancel.c:193 +#, c-format +msgid "cancel request is already being sent on this connection" +msgstr "запит на ÑкаÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¶Ðµ надÑилаєтьÑÑ Ð¿Ñ€Ð¸ цьому підключенні" + +#: fe-cancel.c:263 +#, c-format +msgid "unexpected response from server" +msgstr "неочікувана відповідь Ñервера" + +#: fe-connect.c:1182 +#, c-format +msgid "could not match %d host names to %d hostaddr values" +msgstr "не вдалоÑÑ Ð·Ñ–Ñтавити імена хоÑтів %d Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½ÑŒ %d hostaddr" + +#: fe-connect.c:1262 +#, c-format +msgid "could not match %d port numbers to %d hosts" +msgstr "не вдалоÑÑ Ð·Ñ–Ñтавити %d номерів портів з %d хоÑтами" + +#: fe-connect.c:1387 +#, c-format +msgid "negative require_auth method \"%s\" cannot be mixed with non-negative methods" +msgstr "від'ємний метод require_auth \"%s\" не може бути змішаний з позитивними методами" + +#: fe-connect.c:1400 +#, c-format +msgid "require_auth method \"%s\" cannot be mixed with negative methods" +msgstr "метод require_auth \"%s\" не може бути змішаний з негативними методами" + +#: fe-connect.c:1460 fe-connect.c:1511 fe-connect.c:1553 fe-connect.c:1596 +#: fe-connect.c:1699 fe-connect.c:1745 fe-connect.c:1785 fe-connect.c:1806 +#, c-format +msgid "invalid %s value: \"%s\"" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %s: \"%s\"" + +#: fe-connect.c:1493 +#, c-format +msgid "require_auth method \"%s\" is specified more than once" +msgstr "require_auth метод \"%s\" вказаний неодноразово" + +#: fe-connect.c:1534 fe-connect.c:1573 fe-connect.c:1605 fe-connect.c:1707 +#, c-format +msgid "%s value \"%s\" invalid when SSL support is not compiled in" +msgstr "%s Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" неприпуÑтиме, Ñкщо підтримку протоколу SSL не Ñкомпільовано" + +#: fe-connect.c:1625 +#, c-format +msgid "weak sslmode \"%s\" may not be used with sslnegotiation=direct (use \"require\", \"verify-ca\", or \"verify-full\")" +msgstr "Ñлабкий sslmode \"%s\" не може викориÑтовуватиÑÑ Ð· sslnegotiation=direct (викориÑтовуйте \"require\", \"verify-ca\" або \"verify-full\")" + +#: fe-connect.c:1647 +#, c-format +msgid "weak sslmode \"%s\" may not be used with sslrootcert=system (use \"verify-full\")" +msgstr "Ñлабкий sslmode \"%s\" не може викориÑтовуватиÑÑ Ð· sslrootcert=system (викориÑтайте \"verify-full\")" + +#: fe-connect.c:1660 fe-connect.c:1668 +#, c-format +msgid "invalid \"%s\" value: \"%s\"" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\": \"%s\"" + +#: fe-connect.c:1685 +#, c-format +msgid "invalid SSL protocol version range" +msgstr "неприпуÑтимий діапазон верÑÑ–Ñ— протоколу SSL" + +#: fe-connect.c:1722 +#, c-format +msgid "%s value \"%s\" is not supported (check OpenSSL version)" +msgstr "%s Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" не підтримуєтьÑÑ (перевірте верÑÑ–ÑŽ OpenSSL)" + +#: fe-connect.c:1752 +#, c-format +msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ gssencmode \"%s\" неприпуÑтиме, Ñкщо підтримку протоколу GSSAPI не Ñкомпільовано" + +#: fe-connect.c:2045 +#, c-format +msgid "could not set socket to TCP no delay mode: %s" +msgstr "не вдалоÑÑ Ð²Ñтановити Ñокет у TCP-режим без затримки: %s" + +#: fe-connect.c:2104 #, c-format msgid "connection to server on socket \"%s\" failed: " msgstr "помилка при з'єднанні з Ñервером через Ñокет \"%s\": " -#: fe-connect.c:1737 +#: fe-connect.c:2130 #, c-format msgid "connection to server at \"%s\" (%s), port %s failed: " msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Ñерверу \"%s\" (%s), порт %s провалено: " -#: fe-connect.c:1742 +#: fe-connect.c:2135 #, c-format msgid "connection to server at \"%s\", port %s failed: " msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Ñерверу \"%s\", порт %s провалено: " -#: fe-connect.c:1767 -msgid "\tIs the server running locally and accepting connections on that socket?\n" -msgstr "\tЧи працює Ñервер локально Ñ– приймає Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ цього Ñокету?\n" +#: fe-connect.c:2158 +#, c-format +msgid "\tIs the server running locally and accepting connections on that socket?" +msgstr "\tЧи працює Ñервер локально Ñ– приймає Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ цього Ñокету?" -#: fe-connect.c:1771 -msgid "\tIs the server running on that host and accepting TCP/IP connections?\n" -msgstr "\tЧи працює Ñервер на цьому хоÑті Ñ– приймає TCP/IP підключеннÑ?\n" +#: fe-connect.c:2160 +#, c-format +msgid "\tIs the server running on that host and accepting TCP/IP connections?" +msgstr "\tЧи працює Ñервер на цьому хоÑті Ñ– приймає TCP/IP підключеннÑ?" -#: fe-connect.c:1835 +#: fe-connect.c:2206 fe-connect.c:2240 fe-connect.c:2275 fe-connect.c:2373 +#: fe-connect.c:3098 #, c-format -msgid "invalid integer value \"%s\" for connection option \"%s\"\n" -msgstr "неприпуÑтиме ціле Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ \"%s\"\n" +msgid "%s(%s) failed: %s" +msgstr "%s(%s) помилка: %s" -#: fe-connect.c:1865 fe-connect.c:1900 fe-connect.c:1936 fe-connect.c:2025 -#: fe-connect.c:2639 +#: fe-connect.c:2339 #, c-format -msgid "%s(%s) failed: %s\n" -msgstr "%s(%s) помилка: %s\n" +msgid "%s(%s) failed: error code %d" +msgstr "%s(%s) помилка: код помилки %d" -#: fe-connect.c:1990 +#: fe-connect.c:2650 #, c-format -msgid "%s(%s) failed: error code %d\n" -msgstr "%s(%s) помилка: код помилки %d\n" +msgid "invalid connection state, probably indicative of memory corruption" +msgstr "неприпуÑтимий Ñтан підключеннÑ, можливо, пошкоджена пам'Ñть" -#: fe-connect.c:2305 -msgid "invalid connection state, probably indicative of memory corruption\n" -msgstr "неприпуÑтимий Ñтан підключеннÑ, можливо, пошкоджена пам'Ñть\n" +#: fe-connect.c:2733 +#, c-format +msgid "invalid port number: \"%s\"" +msgstr "неприпуÑтимий номер порту: \"%s\"" -#: fe-connect.c:2384 +#: fe-connect.c:2747 #, c-format -msgid "invalid port number: \"%s\"\n" -msgstr "неприпуÑтимий номер порту: \"%s\"\n" +msgid "could not translate host name \"%s\" to address: %s" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐºÐ»Ð°Ñти Ñ–Ð¼â€™Ñ Ñ…Ð¾Ñта \"%s\" в адреÑу: %s" -#: fe-connect.c:2400 +#: fe-connect.c:2759 #, c-format -msgid "could not translate host name \"%s\" to address: %s\n" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐºÐ»Ð°Ñти Ñ–Ð¼â€™Ñ Ñ…Ð¾Ñта \"%s\" в адреÑу: %s\n" +msgid "could not parse network address \"%s\": %s" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ адреÑу мережі \"%s\": %s" -#: fe-connect.c:2413 +#: fe-connect.c:2770 #, c-format -msgid "could not parse network address \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ адреÑу мережі \"%s\": %s\n" +msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" +msgstr "ШлÑÑ… Unix-Ñокету \"%s\" занадто довгий (макÑимум %d байтів)" -#: fe-connect.c:2426 +#: fe-connect.c:2784 #, c-format -msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)\n" -msgstr "ШлÑÑ… Unix-Ñокету \"%s\" занадто довгий (макÑимум %d байтів)\n" +msgid "could not translate Unix-domain socket path \"%s\" to address: %s" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐºÐ»Ð°Ñти шлÑÑ… Unix-Ñокету \"%s\" в адреÑу: %s" -#: fe-connect.c:2441 +#: fe-connect.c:2950 fe-connect.c:4305 #, c-format -msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐºÐ»Ð°Ñти шлÑÑ… Unix-Ñокету \"%s\" в адреÑу: %s\n" +msgid "GSSAPI encryption required but it is not supported over a local socket" +msgstr "Потрібне ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ GSSAPI, але воно не підтримуєтьÑÑ Ð½Ð°Ð´ локальним Ñокетом" -#: fe-connect.c:2567 +#: fe-connect.c:2958 fe-connect.c:4434 #, c-format -msgid "could not create socket: %s\n" -msgstr "не вдалоÑÑ Ñтворити Ñокет: %s\n" +msgid "GSSAPI encryption required but no credential cache" +msgstr "Ð¨Ð¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ GSSAPI необхідне, але немає кешу облікових даних" -#: fe-connect.c:2598 +#: fe-connect.c:3026 #, c-format -msgid "could not set socket to nonblocking mode: %s\n" -msgstr "не вдалоÑÑ Ð²Ñтановити Ñокет у режим без блокуваннÑ: %s\n" +msgid "could not create socket: %s" +msgstr "не вдалоÑÑ Ñтворити Ñокет: %s" -#: fe-connect.c:2608 +#: fe-connect.c:3057 #, c-format -msgid "could not set socket to close-on-exec mode: %s\n" -msgstr "не вдалоÑÑ Ð²Ñтановити Ñокет у режим Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð¿Ð¾ виконанню: %s\n" +msgid "could not set socket to nonblocking mode: %s" +msgstr "не вдалоÑÑ Ð²Ñтановити Ñокет у режим без блокуваннÑ: %s" -#: fe-connect.c:2626 -msgid "keepalives parameter must be an integer\n" -msgstr "параметр keepalives має бути цілим чиÑлом\n" +#: fe-connect.c:3068 +#, c-format +msgid "could not set socket to close-on-exec mode: %s" +msgstr "не вдалоÑÑ Ð²Ñтановити Ñокет у режим Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð¿Ð¾ виконанню: %s" -#: fe-connect.c:2767 +#: fe-connect.c:3225 #, c-format -msgid "could not get socket error status: %s\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ Ñокету: %s\n" +msgid "could not get socket error status: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¸ Ñокету: %s" -#: fe-connect.c:2795 +#: fe-connect.c:3252 #, c-format -msgid "could not get client address from socket: %s\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ адреÑу клієнта з Ñокету: %s\n" +msgid "could not get client address from socket: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ адреÑу клієнта з Ñокету: %s" -#: fe-connect.c:2837 -msgid "requirepeer parameter is not supported on this platform\n" -msgstr "параметр requirepeer не підтримуєтьÑÑ Ð½Ð° цій платформі\n" +#: fe-connect.c:3278 +#, c-format +msgid "requirepeer parameter is not supported on this platform" +msgstr "параметр requirepeer не підтримуєтьÑÑ Ð½Ð° цій платформі" -#: fe-connect.c:2840 +#: fe-connect.c:3280 #, c-format -msgid "could not get peer credentials: %s\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ облікові дані Ñервера: %s\n" +msgid "could not get peer credentials: %s" +msgstr "не вдалоÑÑŒ отримати облікові дані учаÑника: %s" -#: fe-connect.c:2864 +#: fe-connect.c:3293 #, c-format -msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" -msgstr "requirepeer вказує на \"%s\", але фактичне ім'Ñ Ð²ÑƒÐ·Ð»Ð° \"%s\"\n" +msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"" +msgstr "requirepeer вказує на \"%s\", але фактичне ім'Ñ Ð²ÑƒÐ·Ð»Ð° \"%s\"" -#: fe-connect.c:2904 +#: fe-connect.c:3331 #, c-format -msgid "could not send GSSAPI negotiation packet: %s\n" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ пакет ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ GSSAPI: %s\n" +msgid "could not send GSSAPI negotiation packet: %s" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ пакет ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ GSSAPI: %s" -#: fe-connect.c:2916 -msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)\n" -msgstr "вимагалоÑÑ ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ GSSAPI, але не було неможливим (можливо, без кешу облікових даних, підтримки Ñервера, або викориÑÑ‚Ð°Ð½Ð½Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ñокета)\n" +#: fe-connect.c:3380 +#, c-format +msgid "could not send SSL negotiation packet: %s" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ пакет ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ SSL: %s" -#: fe-connect.c:2958 +#: fe-connect.c:3412 #, c-format -msgid "could not send SSL negotiation packet: %s\n" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ пакет ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ SSL: %s\n" +msgid "could not send cancel packet: %s" +msgstr "не вдалоÑÑ Ð½Ð°Ð´Ñ–Ñлати запит на ÑкаÑуваннÑ: %s" -#: fe-connect.c:2989 +#: fe-connect.c:3442 #, c-format -msgid "could not send startup packet: %s\n" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ Ñтартовий пакет: %s\n" +msgid "could not send startup packet: %s" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ Ñтартовий пакет: %s" -#: fe-connect.c:3065 -msgid "server does not support SSL, but SSL was required\n" -msgstr "Ñервер не підтримує протокол SSL, але протокол SSL вимагаєтьÑÑ\n" +#: fe-connect.c:3509 +msgid "server does not support SSL, but SSL was required" +msgstr "Ñервер не підтримує протокол SSL, але протокол SSL вимагаєтьÑÑ" -#: fe-connect.c:3092 +#: fe-connect.c:3519 #, c-format -msgid "received invalid response to SSL negotiation: %c\n" -msgstr "отримано неприпуÑтиму відповідь на ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ SSL: %c\n" +msgid "server sent an error response during SSL exchange" +msgstr "Ñервер відповів помилкою під Ñ‡Ð°Ñ Ð¾Ð±Ð¼Ñ–Ð½Ñƒ SSL" -#: fe-connect.c:3181 -msgid "server doesn't support GSSAPI encryption, but it was required\n" -msgstr "Ñервер не підтримує ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ GSSAPI, але це було необхідно\n" +#: fe-connect.c:3524 +#, c-format +msgid "received invalid response to SSL negotiation: %c" +msgstr "отримано неприпуÑтиму відповідь на ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ SSL: %c" -#: fe-connect.c:3193 +#: fe-connect.c:3552 #, c-format -msgid "received invalid response to GSSAPI negotiation: %c\n" -msgstr "отримано неприпуÑтиму відповідь на ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ GSSAPI: %c\n" +msgid "received unencrypted data after SSL response" +msgstr "отримані незашифровані дані піÑÐ»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ– SSL" -#: fe-connect.c:3259 fe-connect.c:3284 +#: fe-connect.c:3615 #, c-format -msgid "expected authentication request from server, but received %c\n" -msgstr "очікувавÑÑ Ð·Ð°Ð¿Ð¸Ñ‚ автентифікації від Ñервера, але отримано %c\n" +msgid "server sent an error response during GSS encryption exchange" +msgstr "Ñервер відповів помилкою під Ñ‡Ð°Ñ Ð¾Ð±Ð¼Ñ–Ð½Ñƒ шифруваннÑм GSS" -#: fe-connect.c:3491 -msgid "unexpected message from server during startup\n" -msgstr "неочікуване Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ Ñервера під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку\n" +#: fe-connect.c:3629 +msgid "server doesn't support GSSAPI encryption, but it was required" +msgstr "Ñервер не підтримує ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ GSSAPI, але це було необхідно" -#: fe-connect.c:3583 -msgid "session is read-only\n" -msgstr "ÑеÑÑ–Ñ Ð´Ð¾Ñтупна тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\n" +#: fe-connect.c:3633 +#, c-format +msgid "received invalid response to GSSAPI negotiation: %c" +msgstr "отримано неприпуÑтиму відповідь на ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ GSSAPI: %c" -#: fe-connect.c:3586 -msgid "session is not read-only\n" -msgstr "ÑеÑÑ–Ñ Ð´Ð¾Ñтупна не лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ\n" +#: fe-connect.c:3651 +#, c-format +msgid "received unencrypted data after GSSAPI encryption response" +msgstr "отримані незашифровані дані піÑÐ»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ñ– ÑˆÐ¸Ñ„Ñ€ÑƒÐ²Ð°Ð½Ð½Ñ GSSAPI" -#: fe-connect.c:3640 -msgid "server is in hot standby mode\n" -msgstr "Ñервер знаходитьÑÑ Ñƒ режимі hot standby\n" +#: fe-connect.c:3711 +#, c-format +msgid "expected authentication request from server, but received %c" +msgstr "очікувавÑÑ Ð·Ð°Ð¿Ð¸Ñ‚ автентифікації від Ñервера, але отримано %c" -#: fe-connect.c:3643 -msgid "server is not in hot standby mode\n" -msgstr "Ñервер не в режимі hot standby\n" +#: fe-connect.c:3739 fe-connect.c:3862 +#, c-format +msgid "received invalid authentication request" +msgstr "отримано неприпуÑтимий запит на аутентифікацію" -#: fe-connect.c:3754 fe-connect.c:3806 +#: fe-connect.c:3745 fe-connect.c:3847 #, c-format -msgid "\"%s\" failed\n" -msgstr "\"%s\" помилка\n" +msgid "received invalid protocol negotiation message" +msgstr "отримано неприпуÑтиме Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ ÑƒÐ·Ð³Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ" -#: fe-connect.c:3820 +#: fe-connect.c:3764 fe-connect.c:3818 #, c-format -msgid "invalid connection state %d, probably indicative of memory corruption\n" -msgstr "неприпуÑтимий Ñтан Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ %d, можливо, пошкоджена пам'Ñть\n" +msgid "received invalid error message" +msgstr "отримано неприпуÑтиме Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку" -#: fe-connect.c:4266 fe-connect.c:4326 +#: fe-connect.c:3933 #, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "Помилка у PGEventProc \"%s\" під Ñ‡Ð°Ñ Ð¿Ð¾Ð´Ñ–Ñ— PGEVT_CONNRESET\n" +msgid "unexpected message from server during startup" +msgstr "неочікуване Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð²Ñ–Ð´ Ñервера під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку" -#: fe-connect.c:4670 +#: fe-connect.c:4024 #, c-format -msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" -msgstr "неприпуÑтима URL-адреÑа протоколу LDAP \"%s\": Ñхема має бути ldap://\n" +msgid "session is read-only" +msgstr "ÑеÑÑ–Ñ Ð´Ð¾Ñтупна тільки Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ" -#: fe-connect.c:4685 +#: fe-connect.c:4026 #, c-format -msgid "invalid LDAP URL \"%s\": missing distinguished name\n" -msgstr "неприпуÑтима URL-адреÑа протоколу LDAP \"%s\": відÑутнє унікальне ім'Ñ\n" +msgid "session is not read-only" +msgstr "ÑеÑÑ–Ñ Ð´Ð¾Ñтупна не лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ" -#: fe-connect.c:4697 fe-connect.c:4755 +#: fe-connect.c:4079 #, c-format -msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" -msgstr "неприпуÑтима URL-адреÑа протоколу LDAP \"%s\": має бути лише один атрибут\n" +msgid "server is in hot standby mode" +msgstr "Ñервер знаходитьÑÑ Ñƒ режимі hot standby" -#: fe-connect.c:4709 fe-connect.c:4771 +#: fe-connect.c:4081 #, c-format -msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" -msgstr "неприпуÑтима URL-адреÑа протоколу LDAP \"%s\": відÑÑƒÑ‚Ð½Ñ Ð¾Ð±Ð»Ð°Ñть пошуку (base/one/sub)\n" +msgid "server is not in hot standby mode" +msgstr "Ñервер не в режимі hot standby" -#: fe-connect.c:4721 +#: fe-connect.c:4203 fe-connect.c:4253 #, c-format -msgid "invalid LDAP URL \"%s\": no filter\n" -msgstr "неприпуÑтима URL-адреÑа протоколу LDAP \"%s\": відÑутній фільтр\n" +msgid "\"%s\" failed" +msgstr "\"%s\" помилка" -#: fe-connect.c:4743 +#: fe-connect.c:4267 #, c-format -msgid "invalid LDAP URL \"%s\": invalid port number\n" -msgstr "неприпуÑтима URL-адреÑа протоколу LDAP \"%s\": неприпуÑтимий номер порту\n" +msgid "invalid connection state %d, probably indicative of memory corruption" +msgstr "неприпуÑтимий Ñтан Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ %d, можливо, пошкоджена пам'Ñть" -#: fe-connect.c:4781 -msgid "could not create LDAP structure\n" -msgstr "не вдалоÑÑ Ñтворити Ñтруктуру протоколу LDAP\n" +#: fe-connect.c:5086 +#, c-format +msgid "invalid LDAP URL \"%s\": scheme must be ldap://" +msgstr "неприпуÑтима URL-адреÑа протоколу LDAP \"%s\": Ñхема має бути ldap://" -#: fe-connect.c:4857 +#: fe-connect.c:5101 #, c-format -msgid "lookup on LDAP server failed: %s\n" -msgstr "помилка підÑтановки на Ñервері протоколу LDAP: %s\n" +msgid "invalid LDAP URL \"%s\": missing distinguished name" +msgstr "неприпуÑтима URL-адреÑа протоколу LDAP \"%s\": відÑутнє унікальне ім'Ñ" -#: fe-connect.c:4868 -msgid "more than one entry found on LDAP lookup\n" -msgstr "знайдено більше одного Ð²Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ підÑтановці протоколу LDAP\n" +#: fe-connect.c:5113 fe-connect.c:5171 +#, c-format +msgid "invalid LDAP URL \"%s\": must have exactly one attribute" +msgstr "неприпуÑтима URL-адреÑа протоколу LDAP \"%s\": має бути лише один атрибут" -#: fe-connect.c:4869 fe-connect.c:4881 -msgid "no entry found on LDAP lookup\n" -msgstr "не знайдено Ð²Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ підÑтановці протоколу LDAP\n" +#: fe-connect.c:5125 fe-connect.c:5187 +#, c-format +msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" +msgstr "неприпуÑтима URL-адреÑа протоколу LDAP \"%s\": відÑÑƒÑ‚Ð½Ñ Ð¾Ð±Ð»Ð°Ñть пошуку (base/one/sub)" -#: fe-connect.c:4892 fe-connect.c:4905 -msgid "attribute has no values on LDAP lookup\n" -msgstr "атрибут не має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ підÑтановці протоколу LDAP\n" +#: fe-connect.c:5137 +#, c-format +msgid "invalid LDAP URL \"%s\": no filter" +msgstr "неприпуÑтима URL-адреÑа протоколу LDAP \"%s\": відÑутній фільтр" -#: fe-connect.c:4957 fe-connect.c:4976 fe-connect.c:5508 +#: fe-connect.c:5159 #, c-format -msgid "missing \"=\" after \"%s\" in connection info string\n" -msgstr "відÑутній \"=\" піÑÐ»Ñ \"%s\" у Ñ€Ñдку інформації про підключеннÑ\n" +msgid "invalid LDAP URL \"%s\": invalid port number" +msgstr "неприпуÑтима URL-адреÑа протоколу LDAP \"%s\": неприпуÑтимий номер порту" -#: fe-connect.c:5049 fe-connect.c:5693 fe-connect.c:6469 +#: fe-connect.c:5196 #, c-format -msgid "invalid connection option \"%s\"\n" -msgstr "неприпуÑтимий параметр Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ \"%s\"\n" +msgid "could not create LDAP structure" +msgstr "не вдалоÑÑŒ Ñтворити Ñтруктуру LDAP" -#: fe-connect.c:5065 fe-connect.c:5557 -msgid "unterminated quoted string in connection info string\n" -msgstr "відкриті лапки у Ñ€Ñдку інформації про підключеннÑ\n" +#: fe-connect.c:5271 +#, c-format +msgid "lookup on LDAP server failed: %s" +msgstr "помилка підÑтановки на Ñервері протоколу LDAP: %s" -#: fe-connect.c:5146 +#: fe-connect.c:5281 #, c-format -msgid "definition of service \"%s\" not found\n" -msgstr "не знайдено Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñервера \"%s\"\n" +msgid "more than one entry found on LDAP lookup" +msgstr "знайдено більше одного Ð²Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ підÑтановці протоколу LDAP" -#: fe-connect.c:5172 +#: fe-connect.c:5283 fe-connect.c:5294 #, c-format -msgid "service file \"%s\" not found\n" -msgstr "не знайдено ÑервіÑний файл \"%s\"\n" +msgid "no entry found on LDAP lookup" +msgstr "не знайдено Ð²Ñ…Ð¾Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ підÑтановці протоколу LDAP" -#: fe-connect.c:5186 +#: fe-connect.c:5304 fe-connect.c:5316 #, c-format -msgid "line %d too long in service file \"%s\"\n" -msgstr "Ñ€Ñдок %d занадто довгий у ÑервіÑному файлі \"%s\"\n" +msgid "attribute has no values on LDAP lookup" +msgstr "атрибут не має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ підÑтановці протоколу LDAP" -#: fe-connect.c:5257 fe-connect.c:5301 +#: fe-connect.c:5367 fe-connect.c:5386 fe-connect.c:5910 #, c-format -msgid "syntax error in service file \"%s\", line %d\n" -msgstr "ÑинтакÑична помилка у ÑервіÑному файлі \"%s\", Ñ€Ñдок %d\n" +msgid "missing \"=\" after \"%s\" in connection info string" +msgstr "відÑутній \"=\" піÑÐ»Ñ \"%s\" у Ñ€Ñдку інформації про підключеннÑ" -#: fe-connect.c:5268 +#: fe-connect.c:5457 fe-connect.c:6093 fe-connect.c:6891 #, c-format -msgid "nested service specifications not supported in service file \"%s\", line %d\n" -msgstr "вкладені ÑервіÑні Ñпецифікації не підтримуютьÑÑ Ñƒ ÑервіÑному файлі \"%s\", Ñ€Ñдок %d\n" +msgid "invalid connection option \"%s\"" +msgstr "неприпуÑтимий параметр Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ \"%s\"" -#: fe-connect.c:5989 +#: fe-connect.c:5472 fe-connect.c:5958 #, c-format -msgid "invalid URI propagated to internal parser routine: \"%s\"\n" -msgstr "у внутрішню процедуру аналізу Ñ€Ñдка передано помилковий URI: \"%s\"\n" +msgid "unterminated quoted string in connection info string" +msgstr "відкриті лапки у Ñ€Ñдку інформації про підключеннÑ" -#: fe-connect.c:6066 +#: fe-connect.c:5552 #, c-format -msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"\n" -msgstr "доÑÑгнуто ÐºÑ–Ð½Ñ†Ñ Ñ€Ñдка під Ñ‡Ð°Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ відповідного \"]\" в адреÑÑ– IPv6 URI: \"%s\"\n" +msgid "definition of service \"%s\" not found" +msgstr "не знайдено Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñервера \"%s\"" -#: fe-connect.c:6073 +#: fe-connect.c:5578 #, c-format -msgid "IPv6 host address may not be empty in URI: \"%s\"\n" -msgstr "IPv6, що знаходитьÑÑ Ð² URI, не може бути пуÑтим: \"%s\"\n" +msgid "service file \"%s\" not found" +msgstr "не знайдено ÑервіÑний файл \"%s\"" -#: fe-connect.c:6088 +#: fe-connect.c:5591 #, c-format -msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"\n" -msgstr "неочікуваний Ñимвол \"%c\" на позиції %d в URI (очікувалоÑÑ \":\" або \"/\"): \"%s\"\n" +msgid "line %d too long in service file \"%s\"" +msgstr "Ñ€Ñдок %d занадто довгий у ÑервіÑному файлі \"%s\"" -#: fe-connect.c:6218 +#: fe-connect.c:5662 fe-connect.c:5705 #, c-format -msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "зайвий розділювач ключа/Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"=\" в параметрі запиту URI: \"%s\"\n" +msgid "syntax error in service file \"%s\", line %d" +msgstr "ÑинтакÑична помилка у ÑервіÑному файлі \"%s\", Ñ€Ñдок %d" -#: fe-connect.c:6238 +#: fe-connect.c:5673 #, c-format -msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"\n" -msgstr "відÑутній розділювач ключа/Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"=\" у параметрі запиту URI: \"%s\"\n" +msgid "nested service specifications not supported in service file \"%s\", line %d" +msgstr "вкладені ÑервіÑні Ñпецифікації не підтримуютьÑÑ Ñƒ ÑервіÑному файлі \"%s\", Ñ€Ñдок %d" -#: fe-connect.c:6290 +#: fe-connect.c:6412 #, c-format -msgid "invalid URI query parameter: \"%s\"\n" -msgstr "неприпуÑтимий параметр запиту URI: \"%s\"\n" +msgid "invalid URI propagated to internal parser routine: \"%s\"" +msgstr "у внутрішню процедуру аналізу Ñ€Ñдка передано помилковий URI: \"%s\"" -#: fe-connect.c:6364 +#: fe-connect.c:6489 #, c-format -msgid "invalid percent-encoded token: \"%s\"\n" -msgstr "неприпуÑтимий токен, закодований відÑотками: \"%s\"\n" +msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"" +msgstr "доÑÑгнуто ÐºÑ–Ð½Ñ†Ñ Ñ€Ñдка під Ñ‡Ð°Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ відповідного \"]\" в адреÑÑ– IPv6 URI: \"%s\"" -#: fe-connect.c:6374 +#: fe-connect.c:6496 #, c-format -msgid "forbidden value %%00 in percent-encoded value: \"%s\"\n" -msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %%00 Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ, закодованого відÑотками: \"%s\"\n" +msgid "IPv6 host address may not be empty in URI: \"%s\"" +msgstr "IPv6 адреÑа хоÑта не може бути порожньою в URI: \"%s\"" -#: fe-connect.c:6744 +#: fe-connect.c:6511 +#, c-format +msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"" +msgstr "неочікуваний Ñимвол \"%c\" на позиції %d в URI (очікувалоÑÑ \":\" або \"/\"): \"%s\"" + +#: fe-connect.c:6640 +#, c-format +msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "зайвий розділювач ключа/Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"=\" в параметрі запиту URI: \"%s\"" + +#: fe-connect.c:6660 +#, c-format +msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "відÑутній розділювач ключа/Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"=\" у параметрі запиту URI: \"%s\"" + +#: fe-connect.c:6712 +#, c-format +msgid "invalid URI query parameter: \"%s\"" +msgstr "неприпуÑтимий параметр запиту URI: \"%s\"" + +#: fe-connect.c:6786 +#, c-format +msgid "invalid percent-encoded token: \"%s\"" +msgstr "неприпуÑтимий токен, закодований відÑотками: \"%s\"" + +#: fe-connect.c:6796 +#, c-format +msgid "forbidden value %%00 in percent-encoded value: \"%s\"" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ %%00 в відÑотковому значенні: \"%s\"" + +#: fe-connect.c:7160 msgid "connection pointer is NULL\n" msgstr "нульове Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²ÐºÐ°Ð·Ñ–Ð²Ð½Ð¸ÐºÐ° Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ \n" -#: fe-connect.c:7032 +#: fe-connect.c:7168 fe-exec.c:713 fe-exec.c:975 fe-exec.c:3459 +#: fe-protocol3.c:991 fe-protocol3.c:1024 +msgid "out of memory\n" +msgstr "недоÑтатньо пам'Ñті\n" + +#: fe-connect.c:7459 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ПОПЕРЕДЖЕÐÐЯ: файл паролів \"%s\" не Ñ” проÑтим файлом\n" -#: fe-connect.c:7041 +#: fe-connect.c:7468 #, c-format msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" msgstr "ПОПЕРЕДЖЕÐÐЯ: до файлу паролів \"%s\" мають доÑтуп група або вÑÑ–; дозволи мають бути u=rw (0600) або менше\n" -#: fe-connect.c:7149 +#: fe-connect.c:7575 #, c-format -msgid "password retrieved from file \"%s\"\n" -msgstr "пароль отримано з файлу \"%s\"\n" +msgid "password retrieved from file \"%s\"" +msgstr "пароль отримано з файлу \"%s\"" -#: fe-exec.c:449 fe-exec.c:3300 +#: fe-connect.c:7727 +#, c-format +msgid "invalid integer value \"%s\" for connection option \"%s\"" +msgstr "неприпуÑтиме ціле Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ \"%s\"" + +#: fe-exec.c:469 fe-exec.c:3533 #, c-format msgid "row number %d is out of range 0..%d" msgstr "чиÑло Ñ€Ñдків %d поза діапазоном 0..%d" -#: fe-exec.c:510 fe-protocol3.c:219 fe-protocol3.c:244 fe-protocol3.c:273 -#: fe-protocol3.c:291 fe-protocol3.c:371 fe-protocol3.c:743 -msgid "out of memory" -msgstr "недоÑтатньо пам'Ñті" - -#: fe-exec.c:511 fe-protocol3.c:1939 +#: fe-exec.c:531 fe-protocol3.c:1993 #, c-format msgid "%s" msgstr "%s" -#: fe-exec.c:792 -msgid "write to server failed\n" -msgstr "запиÑати на Ñервер не вдалоÑÑ\n" +#: fe-exec.c:834 +#, c-format +msgid "write to server failed" +msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати на Ñервер" -#: fe-exec.c:864 +#: fe-exec.c:874 +#, c-format +msgid "no error text available" +msgstr "немає доÑтупного текÑту помилки" + +#: fe-exec.c:963 msgid "NOTICE" msgstr "ПОВІДОМЛЕÐÐЯ" -#: fe-exec.c:922 +#: fe-exec.c:1021 msgid "PGresult cannot support more than INT_MAX tuples" msgstr "PGresult не може підтримувати більше ніж INT_MAX кортежів" -#: fe-exec.c:934 +#: fe-exec.c:1033 msgid "size_t overflow" msgstr "Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ size_t" -#: fe-exec.c:1349 fe-exec.c:1454 fe-exec.c:1503 -msgid "command string is a null pointer\n" -msgstr "Ñ€Ñдок команди Ñ” нульовим вказівником\n" +#: fe-exec.c:1438 fe-exec.c:1507 fe-exec.c:1553 +#, c-format +msgid "command string is a null pointer" +msgstr "Ñ€Ñдок команди Ñ” нульовим вказівником" -#: fe-exec.c:1460 fe-exec.c:1509 fe-exec.c:1605 +#: fe-exec.c:1444 fe-exec.c:3003 #, c-format -msgid "number of parameters must be between 0 and %d\n" -msgstr "кількіÑть параметрів має бути між 0 Ñ– %d\n" +msgid "%s not allowed in pipeline mode" +msgstr "%s не дозволено в режимі конвеєра" -#: fe-exec.c:1497 fe-exec.c:1599 -msgid "statement name is a null pointer\n" -msgstr "Ñ–Ð¼â€™Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñ” пуÑтим вказівником\n" +#: fe-exec.c:1512 fe-exec.c:1558 fe-exec.c:1652 +#, c-format +msgid "number of parameters must be between 0 and %d" +msgstr "кількіÑть параметрів має бути між 0 Ñ– %d" -#: fe-exec.c:1641 fe-exec.c:3153 -msgid "no connection to the server\n" -msgstr "немає Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ Ñервера\n" +#: fe-exec.c:1548 fe-exec.c:1647 +#, c-format +msgid "statement name is a null pointer" +msgstr "Ñ–Ð¼â€™Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¾Ñ€Ð° Ñ” пуÑтим вказівником" -#: fe-exec.c:1650 fe-exec.c:3162 -msgid "another command is already in progress\n" -msgstr "інша команда уже в прогреÑÑ–\n" +#: fe-exec.c:1689 fe-exec.c:3379 +#, c-format +msgid "no connection to the server" +msgstr "немає з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñервером" -#: fe-exec.c:1679 -msgid "cannot queue commands during COPY\n" -msgstr "не можна поÑтавити в чергу команди під Ñ‡Ð°Ñ COPY\n" +#: fe-exec.c:1697 fe-exec.c:3387 +#, c-format +msgid "another command is already in progress" +msgstr "інша команда вже виконуєтьÑÑ" -#: fe-exec.c:1797 -msgid "length must be given for binary parameter\n" -msgstr "Ð´Ð»Ñ Ð±Ñ–Ð½Ð°Ñ€Ð½Ð¾Ð³Ð¾ параметра має бути надана довжина\n" +#: fe-exec.c:1727 +#, c-format +msgid "cannot queue commands during COPY" +msgstr "не можна поÑтавити в чергу команди під Ñ‡Ð°Ñ COPY" -#: fe-exec.c:2117 +#: fe-exec.c:1846 #, c-format -msgid "unexpected asyncStatus: %d\n" -msgstr "неочікуваний asyncStatus: %d\n" +msgid "length must be given for binary parameter" +msgstr "Ð´Ð»Ñ Ð±Ñ–Ð½Ð°Ñ€Ð½Ð¾Ð³Ð¾ параметра має бути надана довжина" -#: fe-exec.c:2137 +#: fe-exec.c:2205 #, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "Помилка у PGEventProc \"%s\" під Ñ‡Ð°Ñ Ð¿Ð¾Ð´Ñ–Ñ— PGEVT_RESULTCREAT\n" +msgid "unexpected asyncStatus: %d" +msgstr "неочікуваний asyncStatus: %d" -#: fe-exec.c:2285 -msgid "synchronous command execution functions are not allowed in pipeline mode\n" -msgstr "функції Ñинхронного Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ заборонені в режимі конвеєра\n" +#: fe-exec.c:2361 +#, c-format +msgid "synchronous command execution functions are not allowed in pipeline mode" +msgstr "функції Ñинхронного Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ заборонені в режимі конвеєра" -#: fe-exec.c:2307 +#: fe-exec.c:2378 msgid "COPY terminated by new PQexec" msgstr "COPY завершено новим PQexec" -#: fe-exec.c:2324 -msgid "PQexec not allowed during COPY BOTH\n" -msgstr "PQexec не дозволÑєтьÑÑ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ COPY BOTH\n" +#: fe-exec.c:2394 +#, c-format +msgid "PQexec not allowed during COPY BOTH" +msgstr "PQexec не дозволÑєтьÑÑ Ð¿Ñ–Ð´ Ñ‡Ð°Ñ COPY BOTH" -#: fe-exec.c:2552 fe-exec.c:2608 fe-exec.c:2677 fe-protocol3.c:1870 -msgid "no COPY in progress\n" -msgstr "Ðемає COPY у процеÑÑ–\n" +#: fe-exec.c:2630 +#, c-format +msgid "unrecognized message type \"%c\"" +msgstr "нерозпізнаний тип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ \"%c\"" -#: fe-exec.c:2854 -msgid "PQfn not allowed in pipeline mode\n" -msgstr "PQfn заборонено в режимі конвеєра\n" +#: fe-exec.c:2702 fe-exec.c:2756 fe-exec.c:2824 fe-protocol3.c:1924 +#, c-format +msgid "no COPY in progress" +msgstr "немає COPY у процеÑÑ–" -#: fe-exec.c:2862 -msgid "connection in wrong state\n" -msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñƒ неправильному Ñтані\n" +#: fe-exec.c:3010 +#, c-format +msgid "connection in wrong state" +msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ñƒ неправильному Ñтані" -#: fe-exec.c:2906 -msgid "cannot enter pipeline mode, connection not idle\n" -msgstr "не можна увійти в режим конвеєра, Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð½Ðµ в очікуванні\n" +#: fe-exec.c:3053 +#, c-format +msgid "cannot enter pipeline mode, connection not idle" +msgstr "не можна увійти в режим конвеєра, Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð½Ðµ в очікуванні" -#: fe-exec.c:2940 fe-exec.c:2957 -msgid "cannot exit pipeline mode with uncollected results\n" -msgstr "не можна вийти з режиму конвеєра з незібраними результатами\n" +#: fe-exec.c:3089 fe-exec.c:3110 +#, c-format +msgid "cannot exit pipeline mode with uncollected results" +msgstr "не можна вийти з режиму конвеєра з незібраними результатами" + +#: fe-exec.c:3093 +#, c-format +msgid "cannot exit pipeline mode while busy" +msgstr "не можна вийти з режиму конвеєра, коли зайнÑто" -#: fe-exec.c:2945 -msgid "cannot exit pipeline mode while busy\n" -msgstr "не можна вийти з режиму конвеєра, коли зайнÑто\n" +#: fe-exec.c:3104 +#, c-format +msgid "cannot exit pipeline mode while in COPY" +msgstr "не можна вийти з режиму конвеєра під Ñ‡Ð°Ñ COPY" -#: fe-exec.c:3087 -msgid "cannot send pipeline when not in pipeline mode\n" -msgstr "неможливо ÑкориÑтатиÑÑ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð¾Ð¼ не у режимі конвеєра\n" +#: fe-exec.c:3303 +#, c-format +msgid "cannot send pipeline when not in pipeline mode" +msgstr "неможливо ÑкориÑтатиÑÑ ÐºÐ¾Ð½Ð²ÐµÑ”Ñ€Ð¾Ð¼ не у режимі конвеєра" -#: fe-exec.c:3189 +#: fe-exec.c:3422 msgid "invalid ExecStatusType code" msgstr "неприпуÑтимий код ExecStatusType" -#: fe-exec.c:3216 +#: fe-exec.c:3449 msgid "PGresult is not an error result\n" msgstr "PGresult не Ñ” помилковим результатом\n" -#: fe-exec.c:3284 fe-exec.c:3307 +#: fe-exec.c:3517 fe-exec.c:3540 #, c-format msgid "column number %d is out of range 0..%d" msgstr "чиÑло Ñтовпців %d поза діапазоном 0..%d" -#: fe-exec.c:3322 +#: fe-exec.c:3555 #, c-format msgid "parameter number %d is out of range 0..%d" msgstr "чиÑло параметрів %d поза діапазоном 0..%d" -#: fe-exec.c:3632 +#: fe-exec.c:3866 #, c-format msgid "could not interpret result from server: %s" msgstr "не вдалоÑÑ Ñ–Ð½Ñ‚ÐµÑ€Ð¿Ñ€ÐµÑ‚ÑƒÐ²Ð°Ñ‚Ð¸ результат від Ñервера: %s" -#: fe-exec.c:3892 fe-exec.c:3981 -msgid "incomplete multibyte character\n" -msgstr "неповний мультибайтний Ñимвол\n" +#: fe-exec.c:4140 fe-exec.c:4253 +#, c-format +msgid "incomplete multibyte character" +msgstr "неповний мультибайтний Ñимвол" + +#: fe-exec.c:4142 fe-exec.c:4272 +#, c-format +msgid "invalid multibyte character" +msgstr "неприпуÑтимий мультибайтний Ñимвол" -#: fe-gssapi-common.c:124 +#: fe-gssapi-common.c:122 msgid "GSSAPI name import error" msgstr "Помилка імпорту імені у GSSAPI" -#: fe-lobj.c:145 fe-lobj.c:210 fe-lobj.c:403 fe-lobj.c:494 fe-lobj.c:568 -#: fe-lobj.c:969 fe-lobj.c:977 fe-lobj.c:985 fe-lobj.c:993 fe-lobj.c:1001 -#: fe-lobj.c:1009 fe-lobj.c:1017 fe-lobj.c:1025 +#: fe-lobj.c:144 fe-lobj.c:207 fe-lobj.c:397 fe-lobj.c:487 fe-lobj.c:560 +#: fe-lobj.c:956 fe-lobj.c:963 fe-lobj.c:970 fe-lobj.c:977 fe-lobj.c:984 +#: fe-lobj.c:991 fe-lobj.c:998 fe-lobj.c:1005 #, c-format -msgid "cannot determine OID of function %s\n" -msgstr "неможливо визначити ідентифікатор OID функції %s\n" +msgid "cannot determine OID of function %s" +msgstr "неможливо визначити ідентифікатор OID функції %s" -#: fe-lobj.c:162 -msgid "argument of lo_truncate exceeds integer range\n" -msgstr "аргумент lo_truncate перевищує діапазон цілого чиÑла\n" +#: fe-lobj.c:160 +#, c-format +msgid "argument of lo_truncate exceeds integer range" +msgstr "аргумент lo_truncate перевищує цілочиÑельний діапазон" -#: fe-lobj.c:266 -msgid "argument of lo_read exceeds integer range\n" -msgstr "аргумент lo_read перевищує діапазон цілого чиÑла\n" +#: fe-lobj.c:262 +#, c-format +msgid "argument of lo_read exceeds integer range" +msgstr "аргумент lo_read перевищує діапазон цілого чиÑла" -#: fe-lobj.c:318 -msgid "argument of lo_write exceeds integer range\n" -msgstr "аргумент lo_write перевищує діапазон цілого чиÑла\n" +#: fe-lobj.c:313 +#, c-format +msgid "argument of lo_write exceeds integer range" +msgstr "аргумент lo_write перевищує діапазон цілого чиÑла" -#: fe-lobj.c:678 fe-lobj.c:789 +#: fe-lobj.c:669 fe-lobj.c:780 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %s\n" +msgid "could not open file \"%s\": %s" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл \"%s\": %s" -#: fe-lobj.c:734 +#: fe-lobj.c:725 #, c-format -msgid "could not read from file \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу \"%s\": %s\n" +msgid "could not read from file \"%s\": %s" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ з файлу \"%s\": %s" -#: fe-lobj.c:810 fe-lobj.c:834 +#: fe-lobj.c:801 fe-lobj.c:824 #, c-format -msgid "could not write to file \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð·Ð°Ð¿Ð¸Ñати у файл \"%s\": %s\n" +msgid "could not write to file \"%s\": %s" +msgstr "неможливо запиÑати до файлу \"%s\": %s" -#: fe-lobj.c:920 -msgid "query to initialize large object functions did not return data\n" -msgstr "запит на ініціалізацію функцій Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об’єктів не повернув дані\n" +#: fe-lobj.c:908 +#, c-format +msgid "query to initialize large object functions did not return data" +msgstr "запит на ініціалізацію функцій Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… об’єктів не повернув дані" -#: fe-misc.c:242 +#: fe-misc.c:239 #, c-format msgid "integer of size %lu not supported by pqGetInt" msgstr "pqGetInt не підтримує ціле чиÑло розміром %lu" -#: fe-misc.c:275 +#: fe-misc.c:272 #, c-format msgid "integer of size %lu not supported by pqPutInt" msgstr "pqPutInt не підтримує ціле чиÑло розміром %lu" -#: fe-misc.c:576 fe-misc.c:822 -msgid "connection not open\n" -msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð½Ðµ відкрито\n" - -#: fe-misc.c:755 fe-secure-openssl.c:209 fe-secure-openssl.c:316 -#: fe-secure.c:260 fe-secure.c:373 +#: fe-misc.c:750 fe-secure-openssl.c:203 fe-secure-openssl.c:309 +#: fe-secure.c:237 fe-secure.c:404 +#, c-format msgid "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" -"\tbefore or while processing the request.\n" +"\tbefore or while processing the request." msgstr "Ñервер неочікувано закрив підключеннÑ\n" -" Це може означати, що Ñервер завершив роботу ненормально до або під Ñ‡Ð°Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ запиту.\n" +" Це може означати, що Ñервер завершив роботу ненормально до або під Ñ‡Ð°Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ запиту." + +#: fe-misc.c:817 +msgid "connection not open\n" +msgstr "Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð½Ðµ відкрито\n" -#: fe-misc.c:1015 -msgid "timeout expired\n" -msgstr "тайм-аут минув\n" +#: fe-misc.c:1005 +#, c-format +msgid "timeout expired" +msgstr "Ñ‡Ð°Ñ Ð¾Ñ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð¼Ð¸Ð½ÑƒÐ²" -#: fe-misc.c:1060 -msgid "invalid socket\n" -msgstr "неприпуÑтимий Ñокет\n" +#: fe-misc.c:1049 +#, c-format +msgid "invalid socket" +msgstr "неприпуÑтимий Ñокет" -#: fe-misc.c:1083 +#: fe-misc.c:1071 #, c-format -msgid "%s() failed: %s\n" -msgstr "%s() помилка: %s\n" +msgid "%s() failed: %s" +msgstr "%s() помилка: %s" -#: fe-protocol3.c:196 +#: fe-protocol3.c:187 #, c-format msgid "message type 0x%02x arrived from server while idle" msgstr "отримано тип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ 0x%02x від Ñервера під Ñ‡Ð°Ñ Ð±ÐµÐ·Ð´Ñ–ÑльноÑті" -#: fe-protocol3.c:403 -msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" -msgstr "Ñервер передав дані (Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ \"D\") без попереднього опиÑу Ñ€Ñдка (Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ \"T\")\n" +#: fe-protocol3.c:402 +#, c-format +msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" +msgstr "Ñервер передав дані (Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ \"D\") без попереднього опиÑу Ñ€Ñдка (Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ \"T\")" -#: fe-protocol3.c:446 +#: fe-protocol3.c:444 #, c-format -msgid "unexpected response from server; first received character was \"%c\"\n" -msgstr "неочікувана відповідь від Ñервера; перший отриманий Ñимвол був \"%c\"\n" +msgid "unexpected response from server; first received character was \"%c\"" +msgstr "неочікувана відповідь від Ñервера; перший отриманий Ñимвол був \"%c\"" -#: fe-protocol3.c:471 +#: fe-protocol3.c:467 #, c-format -msgid "message contents do not agree with length in message type \"%c\"\n" -msgstr "вміÑÑ‚ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ відповідає довжині у типі Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ \"%c\"\n" +msgid "message contents do not agree with length in message type \"%c\"" +msgstr "вміÑÑ‚ Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð½Ðµ відповідає довжині у типі Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ \"%c\"" -#: fe-protocol3.c:491 +#: fe-protocol3.c:485 #, c-format -msgid "lost synchronization with server: got message type \"%c\", length %d\n" -msgstr "втрачено Ñинхронізацію з Ñервером: отримано тип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ \"%c\", довжина %d\n" +msgid "lost synchronization with server: got message type \"%c\", length %d" +msgstr "втрачено Ñинхронізацію з Ñервером: отримано тип Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ \"%c\", довжина %d" -#: fe-protocol3.c:543 fe-protocol3.c:583 +#: fe-protocol3.c:537 fe-protocol3.c:577 msgid "insufficient data in \"T\" message" msgstr "недоÑтатньо даних у повідомленні \"T\"" -#: fe-protocol3.c:654 fe-protocol3.c:860 +#: fe-protocol3.c:648 fe-protocol3.c:854 msgid "out of memory for query result" msgstr "недоÑтатньо пам'Ñті Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñƒ запиту" -#: fe-protocol3.c:723 +#: fe-protocol3.c:717 msgid "insufficient data in \"t\" message" msgstr "недоÑтатньо даних у повідомленні \"t\"" -#: fe-protocol3.c:782 fe-protocol3.c:814 fe-protocol3.c:832 +#: fe-protocol3.c:776 fe-protocol3.c:808 fe-protocol3.c:826 msgid "insufficient data in \"D\" message" msgstr "зайві дані у повідомленні \"D\"" -#: fe-protocol3.c:788 +#: fe-protocol3.c:782 msgid "unexpected field count in \"D\" message" msgstr "неочікувана кількіÑть полів у повідомленні \"D\"" -#: fe-protocol3.c:1036 +#: fe-protocol3.c:1037 msgid "no error message available\n" msgstr "немає доÑтупного Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку\n" #. translator: %s represents a digit string -#: fe-protocol3.c:1084 fe-protocol3.c:1103 +#: fe-protocol3.c:1085 fe-protocol3.c:1104 #, c-format msgid " at character %s" msgstr " в Ñимволі %s" -#: fe-protocol3.c:1116 +#: fe-protocol3.c:1117 #, c-format msgid "DETAIL: %s\n" msgstr "ДЕТÐЛІ: %s\n" -#: fe-protocol3.c:1119 +#: fe-protocol3.c:1120 #, c-format msgid "HINT: %s\n" msgstr "ПІДКÐЗКÐ: %s\n" -#: fe-protocol3.c:1122 +#: fe-protocol3.c:1123 #, c-format msgid "QUERY: %s\n" msgstr "ЗÐПИТ: %s\n" -#: fe-protocol3.c:1129 +#: fe-protocol3.c:1130 #, c-format msgid "CONTEXT: %s\n" msgstr "КОÐТЕКСТ: %s\n" -#: fe-protocol3.c:1138 +#: fe-protocol3.c:1139 #, c-format msgid "SCHEMA NAME: %s\n" msgstr "ІМ'Я СХЕМИ: %s\n" -#: fe-protocol3.c:1142 +#: fe-protocol3.c:1143 #, c-format msgid "TABLE NAME: %s\n" msgstr "ІМ'Я ТÐБЛИЦІ: %s\n" -#: fe-protocol3.c:1146 +#: fe-protocol3.c:1147 #, c-format msgid "COLUMN NAME: %s\n" msgstr "ІМ'Я СТОВПЦЯ: %s\n" -#: fe-protocol3.c:1150 +#: fe-protocol3.c:1151 #, c-format msgid "DATATYPE NAME: %s\n" msgstr "ІМ'Я ТИПУ ДÐÐИХ: %s\n" -#: fe-protocol3.c:1154 +#: fe-protocol3.c:1155 #, c-format msgid "CONSTRAINT NAME: %s\n" msgstr "ІМ'Я ОБМЕЖЕÐÐЯ: %s\n" -#: fe-protocol3.c:1166 +#: fe-protocol3.c:1167 msgid "LOCATION: " msgstr "РОЗТÐШУВÐÐÐЯ: " -#: fe-protocol3.c:1168 +#: fe-protocol3.c:1169 #, c-format msgid "%s, " msgstr "%s, " -#: fe-protocol3.c:1170 +#: fe-protocol3.c:1171 #, c-format msgid "%s:%s" msgstr "%s:%s" -#: fe-protocol3.c:1365 +#: fe-protocol3.c:1366 #, c-format msgid "LINE %d: " msgstr "РЯДОК %d: " -#: fe-protocol3.c:1764 -msgid "PQgetline: not doing text COPY OUT\n" -msgstr "PQgetline можна викликати лише під Ñ‡Ð°Ñ COPY OUT\n" +#: fe-protocol3.c:1440 +#, c-format +msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u" +msgstr "ВерÑÑ–Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ не підтримуєтьÑÑ Ñервером: клієнт викориÑтовує %u.%u, Ñервер підтримує %u.%u" + +#: fe-protocol3.c:1446 +#, c-format +msgid "protocol extension not supported by server: %s" +msgid_plural "protocol extensions not supported by server: %s" +msgstr[0] "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ не підтримуєтьÑÑ Ñервером: %s" +msgstr[1] "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñ–Ð² не підтримуєтьÑÑ Ñервером: %s" +msgstr[2] "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñ–Ð² не підтримуєтьÑÑ Ñервером: %s" +msgstr[3] "Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñ–Ð² не підтримуєтьÑÑ Ñервером: %s" + +#: fe-protocol3.c:1454 +#, c-format +msgid "invalid %s message" +msgstr "неприпуÑтиме %s повідомленнÑ" -#: fe-protocol3.c:2130 +#: fe-protocol3.c:1819 #, c-format -msgid "protocol error: id=0x%x\n" -msgstr "помилка протоколу: id=0x%x\n" +msgid "PQgetline: not doing text COPY OUT" +msgstr "PQgetline: не викликати Ð´Ð»Ñ Ñ‚ÐµÐºÑтового COPY OUT" -#: fe-secure-common.c:124 -msgid "SSL certificate's name contains embedded null\n" -msgstr "Ім'Ñ Ñертифікату SSL міÑтить вбудоване Null-значеннÑ\n" +#: fe-protocol3.c:2193 +#, c-format +msgid "protocol error: no function result" +msgstr "помилка протоколу: результат функції відÑутній" -#: fe-secure-common.c:171 -msgid "host name must be specified for a verified SSL connection\n" -msgstr "має бути вказано ім'Ñ Ñ…Ð¾Ñту Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐµÐ½Ð¾Ð³Ð¾ SSL підключеннÑ\n" +#: fe-protocol3.c:2204 +#, c-format +msgid "protocol error: id=0x%x" +msgstr "помилка протоколу: id=0x%x" -#: fe-secure-common.c:196 +#: fe-secure-common.c:123 #, c-format -msgid "server certificate for \"%s\" does not match host name \"%s\"\n" -msgstr "Ñерверний Ñертифікат \"%s\" не Ñпівпадає з іменем хоÑту \"%s\"\n" +msgid "SSL certificate's name contains embedded null" +msgstr "Ім'Ñ Ñертифікату SSL міÑтить вбудоване Null-значеннÑ" -#: fe-secure-common.c:202 -msgid "could not get server's host name from server certificate\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ім'Ñ Ñ…Ð¾Ñту від Ñерверного Ñертифікату\n" +#: fe-secure-common.c:228 +#, c-format +msgid "certificate contains IP address with invalid length %zu" +msgstr "Ñертифікат міÑтить IP-адреÑу з недійÑною довжиною %zu" -#: fe-secure-gssapi.c:201 +#: fe-secure-common.c:237 +#, c-format +msgid "could not convert certificate's IP address to string: %s" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ IP-адреÑу Ñертифікату у Ñ€Ñдок: %s" + +#: fe-secure-common.c:269 +#, c-format +msgid "host name must be specified for a verified SSL connection" +msgstr "має бути вказано ім'Ñ Ñ…Ð¾Ñту Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ²Ñ–Ñ€ÐµÐ½Ð¾Ð³Ð¾ SSL підключеннÑ" + +#: fe-secure-common.c:286 +#, c-format +msgid "server certificate for \"%s\" (and %d other name) does not match host name \"%s\"" +msgid_plural "server certificate for \"%s\" (and %d other names) does not match host name \"%s\"" +msgstr[0] "Ñерверний Ñертифікат \"%s\" (та %d інше ім'Ñ) не Ñпівпадає з іменем хоÑту \"%s\"" +msgstr[1] "Ñерверний Ñертифікат \"%s\" (та %d інших імені) не Ñпівпадає з іменем хоÑту \"%s\"" +msgstr[2] "Ñерверний Ñертифікат \"%s\" (та %d інших імен) не Ñпівпадає з іменем хоÑту \"%s\"" +msgstr[3] "Ñерверний Ñертифікат \"%s\" (та %d інших імен) не Ñпівпадає з іменем хоÑту \"%s\"" + +#: fe-secure-common.c:294 +#, c-format +msgid "server certificate for \"%s\" does not match host name \"%s\"" +msgstr "Ñерверний Ñертифікат \"%s\" не Ñпівпадає з іменем хоÑту \"%s\"" + +#: fe-secure-common.c:299 +#, c-format +msgid "could not get server's host name from server certificate" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ ім'Ñ Ñ…Ð¾Ñту від Ñерверного Ñертифікату" + +#: fe-secure-gssapi.c:194 msgid "GSSAPI wrap error" msgstr "помилка при згортанні GSSAPI" -#: fe-secure-gssapi.c:209 -msgid "outgoing GSSAPI message would not use confidentiality\n" -msgstr "вихідне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ GSSAPI не буде викориÑтовувати конфіденційніÑть\n" +#: fe-secure-gssapi.c:201 +#, c-format +msgid "outgoing GSSAPI message would not use confidentiality" +msgstr "вихідне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ GSSAPI не буде викориÑтовувати конфіденційніÑть" -#: fe-secure-gssapi.c:217 +#: fe-secure-gssapi.c:208 #, c-format -msgid "client tried to send oversize GSSAPI packet (%zu > %zu)\n" -msgstr "клієнт намагавÑÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ð¸ переповнений пакет GSSAPI: (%zu > %zu)\n" +msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" +msgstr "клієнт намагавÑÑ Ð²Ñ–Ð´Ð¿Ñ€Ð°Ð²Ð¸Ñ‚Ð¸ переповнений пакет GSSAPI (%zu > %zu)" -#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:596 +#: fe-secure-gssapi.c:347 fe-secure-gssapi.c:589 #, c-format -msgid "oversize GSSAPI packet sent by the server (%zu > %zu)\n" -msgstr "переповнений пакет GSSAPI відправлений Ñервером: (%zu > %zu)\n" +msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" +msgstr "переповнений пакет GSSAPI відправлений Ñервером (%zu > %zu)" -#: fe-secure-gssapi.c:393 +#: fe-secure-gssapi.c:386 msgid "GSSAPI unwrap error" msgstr "помилка при розгортанні GSSAPI" -#: fe-secure-gssapi.c:403 -msgid "incoming GSSAPI message did not use confidentiality\n" -msgstr "вхідне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ GSSAPI не викориÑтовувало конфіденційніÑть\n" +#: fe-secure-gssapi.c:395 +#, c-format +msgid "incoming GSSAPI message did not use confidentiality" +msgstr "вхідне Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ GSSAPI не викориÑтовувало конфіденційніÑть" -#: fe-secure-gssapi.c:642 +#: fe-secure-gssapi.c:652 msgid "could not initiate GSSAPI security context" msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–ÑŽÐ²Ð°Ñ‚Ð¸ контекÑÑ‚ безпеки GSSAPI" -#: fe-secure-gssapi.c:670 +#: fe-secure-gssapi.c:681 msgid "GSSAPI size check error" msgstr "помилка перевірки розміру GSSAPI" -#: fe-secure-gssapi.c:681 +#: fe-secure-gssapi.c:692 msgid "GSSAPI context establishment error" msgstr "помилка вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð½Ñ‚ÐµÐºÑту GSSAPI" -#: fe-secure-openssl.c:214 fe-secure-openssl.c:321 fe-secure-openssl.c:1333 +#: fe-secure-openssl.c:207 fe-secure-openssl.c:313 fe-secure-openssl.c:1524 #, c-format -msgid "SSL SYSCALL error: %s\n" -msgstr "Помилка SSL SYSCALL: %s\n" +msgid "SSL SYSCALL error: %s" +msgstr "Помилка SSL SYSCALL: %s" -#: fe-secure-openssl.c:221 fe-secure-openssl.c:328 fe-secure-openssl.c:1337 -msgid "SSL SYSCALL error: EOF detected\n" -msgstr "Помилка SSL SYSCALL: виÑвлено EOF\n" +#: fe-secure-openssl.c:213 fe-secure-openssl.c:319 fe-secure-openssl.c:1527 +#, c-format +msgid "SSL SYSCALL error: EOF detected" +msgstr "Помилка SSL SYSCALL: виÑвлено EOF" -#: fe-secure-openssl.c:232 fe-secure-openssl.c:339 fe-secure-openssl.c:1346 +#: fe-secure-openssl.c:223 fe-secure-openssl.c:329 fe-secure-openssl.c:1535 #, c-format -msgid "SSL error: %s\n" -msgstr "Помилка SSL: %s\n" +msgid "SSL error: %s" +msgstr "Помилка SSL: %s" -#: fe-secure-openssl.c:247 fe-secure-openssl.c:354 -msgid "SSL connection has been closed unexpectedly\n" -msgstr "SSL Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ неочікувано перервано\n" +#: fe-secure-openssl.c:237 fe-secure-openssl.c:343 +#, c-format +msgid "SSL connection has been closed unexpectedly" +msgstr "SSL-з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð±ÑƒÐ»Ð¾ неÑподівано перервано" -#: fe-secure-openssl.c:253 fe-secure-openssl.c:360 fe-secure-openssl.c:1396 +#: fe-secure-openssl.c:242 fe-secure-openssl.c:348 fe-secure-openssl.c:1582 #, c-format -msgid "unrecognized SSL error code: %d\n" -msgstr "нерозпізнаний код помилки SSL: %d\n" +msgid "unrecognized SSL error code: %d" +msgstr "нерозпізнаний код помилки SSL: %d" -#: fe-secure-openssl.c:400 -msgid "could not determine server certificate signature algorithm\n" -msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ алгоритм підпиÑу Ñерверного Ñертифікату\n" +#: fe-secure-openssl.c:390 +#, c-format +msgid "could not determine server certificate signature algorithm" +msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ алгоритм підпиÑу Ñервера Ñертифіката" -#: fe-secure-openssl.c:421 +#: fe-secure-openssl.c:410 #, c-format -msgid "could not find digest for NID %s\n" -msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ дайджеÑÑ‚ Ð´Ð»Ñ NID %s\n" +msgid "could not find digest for NID %s" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ дайджеÑÑ‚ Ð´Ð»Ñ NID %s" -#: fe-secure-openssl.c:431 -msgid "could not generate peer certificate hash\n" -msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ хеш Ñертифікату вузла\n" +#: fe-secure-openssl.c:419 +#, c-format +msgid "could not generate peer certificate hash" +msgstr "не вдалоÑÑ Ð·Ð³ÐµÐ½ÐµÑ€ÑƒÐ²Ð°Ñ‚Ð¸ хеш Ñертифікату вузла" -#: fe-secure-openssl.c:488 -msgid "SSL certificate's name entry is missing\n" -msgstr "ВідÑÑƒÑ‚Ð½Ñ Ñ–Ð¼'Ñ Ð² Ñертифікаті SSL\n" +#: fe-secure-openssl.c:501 +#, c-format +msgid "SSL certificate's name entry is missing" +msgstr "ВідÑÑƒÑ‚Ð½Ñ Ñ–Ð¼'Ñ Ð² Ñертифікаті SSL" + +#: fe-secure-openssl.c:535 +#, c-format +msgid "SSL certificate's address entry is missing" +msgstr "відÑутній елемент адреÑи SSL-Ñертифікату" -#: fe-secure-openssl.c:822 +#: fe-secure-openssl.c:935 #, c-format -msgid "could not create SSL context: %s\n" -msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ SSL: %s\n" +msgid "could not create SSL context: %s" +msgstr "не вдалоÑÑ Ñтворити контекÑÑ‚ SSL: %s" -#: fe-secure-openssl.c:861 +#: fe-secure-openssl.c:977 #, c-format -msgid "invalid value \"%s\" for minimum SSL protocol version\n" -msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¼Ñ–Ð½Ñ–Ð¼Ð°Ð»ÑŒÐ½Ð¾Ñ— верÑÑ–Ñ— протоколу SSL\n" +msgid "invalid value \"%s\" for minimum SSL protocol version" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¼Ñ–Ð½Ñ–Ð¼Ð°Ð»ÑŒÐ½Ð¾Ñ— верÑÑ–Ñ— протоколу SSL" -#: fe-secure-openssl.c:872 +#: fe-secure-openssl.c:987 #, c-format -msgid "could not set minimum SSL protocol version: %s\n" -msgstr "не вдалоÑÑ Ð²Ñтановити мінімальну верÑÑ–ÑŽ протоколу SSL: %s\n" +msgid "could not set minimum SSL protocol version: %s" +msgstr "не вдалоÑÑ Ð²Ñтановити мінімальну верÑÑ–ÑŽ протоколу SSL: %s" -#: fe-secure-openssl.c:890 +#: fe-secure-openssl.c:1003 #, c-format -msgid "invalid value \"%s\" for maximum SSL protocol version\n" -msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¼Ð°ÐºÑимальної верÑÑ–Ñ— протоколу SSL\n" +msgid "invalid value \"%s\" for maximum SSL protocol version" +msgstr "неприпуÑтиме Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ \"%s\" Ð´Ð»Ñ Ð¼Ð°ÐºÑимальної верÑÑ–Ñ— протоколу SSL" -#: fe-secure-openssl.c:901 +#: fe-secure-openssl.c:1013 #, c-format -msgid "could not set maximum SSL protocol version: %s\n" -msgstr "не вдалоÑÑ Ð²Ñтановити макÑимальну верÑÑ–ÑŽ протоколу SSL: %s\n" +msgid "could not set maximum SSL protocol version: %s" +msgstr "не вдалоÑÑ Ð²Ñтановити макÑимальну верÑÑ–ÑŽ протоколу SSL: %s" -#: fe-secure-openssl.c:937 +#: fe-secure-openssl.c:1051 #, c-format -msgid "could not read root certificate file \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл кореневого Ñертифікату \"%s\": %s\n" +msgid "could not load system root certificate paths: %s" +msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ шлÑхи кореневого Ñертифікату ÑиÑтеми: %s" -#: fe-secure-openssl.c:990 +#: fe-secure-openssl.c:1068 +#, c-format +msgid "could not read root certificate file \"%s\": %s" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл кореневого Ñертифікату \"%s\": %s" + +#: fe-secure-openssl.c:1120 +#, c-format msgid "could not get home directory to locate root certificate file\n" -"Either provide the file or change sslmode to disable server certificate verification.\n" +"Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ домашній каталог, щоб знайти файл кореневого Ñертифікату\n" -"Ðадайте файл або змініть sslmode, щоб вимкнути перевірку Ñерверного Ñертифікату.\n" +"Ðадайте файл, викориÑтайте ÑиÑтемні кореневі за допомогою sslrootcert=system, або змініть sslmode, щоб вимкнути перевірку Ñерверного Ñертифікату." -#: fe-secure-openssl.c:994 +#: fe-secure-openssl.c:1123 #, c-format msgid "root certificate file \"%s\" does not exist\n" -"Either provide the file or change sslmode to disable server certificate verification.\n" -msgstr "файлу кореневого Ñертифікату \"%s\" не Ñ–Ñнує\n" -"Вкажіть повний шлÑÑ… до файлу або вимкніть перевірку Ñертифікату Ñервера, змінивши sslmode.\n" +"Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." +msgstr "файл кореневого Ñертифікату \"%s\" не Ñ–Ñнує\n" +"Ðадайте файл, викориÑтайте ÑиÑтемні кореневі за допомогою sslrootcert=system, або змініть sslmode, щоб вимкнути перевірку Ñерверного Ñертифікату." -#: fe-secure-openssl.c:1025 +#: fe-secure-openssl.c:1158 #, c-format -msgid "could not open certificate file \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл Ñертифікату \"%s\": %s\n" +msgid "could not open certificate file \"%s\": %s" +msgstr "не вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл Ñертифікату \"%s\": %s" -#: fe-secure-openssl.c:1044 +#: fe-secure-openssl.c:1176 #, c-format -msgid "could not read certificate file \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл Ñертифікату \"%s\": %s\n" +msgid "could not read certificate file \"%s\": %s" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ файл Ñертифікату \"%s\": %s" -#: fe-secure-openssl.c:1069 +#: fe-secure-openssl.c:1200 #, c-format -msgid "could not establish SSL connection: %s\n" -msgstr "не вдалоÑÑ Ð²Ñтановити SSL-підключеннÑ: %s\n" +msgid "could not establish SSL connection: %s" +msgstr "не вдалоÑÑ Ð²Ñтановити SSL-підключеннÑ: %s" -#: fe-secure-openssl.c:1103 +#: fe-secure-openssl.c:1232 #, c-format -msgid "could not set SSL Server Name Indication (SNI): %s\n" -msgstr "не вдалоÑÑ Ð²Ñтановити Індикацію Імені Сервера протокол SSL (SNI): %s\n" +msgid "could not set SSL Server Name Indication (SNI): %s" +msgstr "не вдалоÑÑ Ð²Ñтановити позначку назви Ñервера SSL (SNI): %s" -#: fe-secure-openssl.c:1149 +#: fe-secure-openssl.c:1249 #, c-format -msgid "could not load SSL engine \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ модуль SSL \"%s\": %s\n" +msgid "could not set SSL ALPN extension: %s" +msgstr "не вдалоÑÑ Ð²Ñтановити Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ SSL ALPN: %s" -#: fe-secure-openssl.c:1161 +#: fe-secure-openssl.c:1292 #, c-format -msgid "could not initialize SSL engine \"%s\": %s\n" -msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ модуль SSL \"%s\": %s\n" +msgid "could not load SSL engine \"%s\": %s" +msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ модуль SSL \"%s\": %s" -#: fe-secure-openssl.c:1177 +#: fe-secure-openssl.c:1303 #, c-format -msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ закритий ключ SSL \"%s\" з Ð¼Ð¾Ð´ÑƒÐ»Ñ \"%s\": %s\n" +msgid "could not initialize SSL engine \"%s\": %s" +msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ модуль SSL \"%s\": %s" -#: fe-secure-openssl.c:1191 +#: fe-secure-openssl.c:1318 #, c-format -msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ закритий ключ SSL \"%s\" з Ð¼Ð¾Ð´ÑƒÐ»Ñ \"%s\": %s\n" +msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ закритий ключ SSL \"%s\" з Ð¼Ð¾Ð´ÑƒÐ»Ñ \"%s\": %s" -#: fe-secure-openssl.c:1228 +#: fe-secure-openssl.c:1331 #, c-format -msgid "certificate present, but not private key file \"%s\"\n" -msgstr "Ñертифікат приÑутній, але файл закритого ключа \"%s\" ні\n" +msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" +msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ закритий ключ SSL \"%s\" з Ð¼Ð¾Ð´ÑƒÐ»Ñ \"%s\": %s" -#: fe-secure-openssl.c:1236 +#: fe-secure-openssl.c:1368 #, c-format -msgid "private key file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" -msgstr "файл закритого ключа \"%s\" має груповий або вÑеÑвітній доÑтуп; права повинні бути u=rw (0600) або більш обмежені\n" +msgid "certificate present, but not private key file \"%s\"" +msgstr "Ñертифікат приÑутній, але файл закритого ключа \"%s\" ні" -#: fe-secure-openssl.c:1261 +#: fe-secure-openssl.c:1371 #, c-format -msgid "could not load private key file \"%s\": %s\n" -msgstr "не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл закритого ключа \"%s\": %s\n" +msgid "could not stat private key file \"%s\": %m" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ інформацію про файл закритого ключа\"%s\": %m" -#: fe-secure-openssl.c:1279 +#: fe-secure-openssl.c:1379 #, c-format -msgid "certificate does not match private key file \"%s\": %s\n" -msgstr "Ñертифікат не відповідає файлу закритого ключа \"%s\": %s\n" +msgid "private key file \"%s\" is not a regular file" +msgstr "файл закритого ключа \"%s\" не Ñ” звичайним" -#: fe-secure-openssl.c:1379 +#: fe-secure-openssl.c:1412 +#, c-format +msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root" +msgstr "файл закритого ключа \"%s\" має груповий або загальний доÑтуп; файл повинен мати права u=rw (0600) або менше, Ñкщо він належить поточному кориÑтувачу, або права u=rw,g=r (0640) або менше, Ñкщо належить root" + +#: fe-secure-openssl.c:1436 #, c-format -msgid "This may indicate that the server does not support any SSL protocol version between %s and %s.\n" -msgstr "Це може вказувати, що Ñервер не підтримує жодної верÑÑ–Ñ— протоколу SSL між %s Ñ– %s.\n" +msgid "could not load private key file \"%s\": %s" +msgstr "не вдалоÑÑŒ завантажити файл закритого ключа \"%s\": %s" -#: fe-secure-openssl.c:1415 +#: fe-secure-openssl.c:1452 #, c-format -msgid "certificate could not be obtained: %s\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ñертифікат: %s\n" +msgid "certificate does not match private key file \"%s\": %s" +msgstr "Ñертифікат не відповідає файлу закритого ключа \"%s\": %s" #: fe-secure-openssl.c:1521 #, c-format +msgid "SSL error: certificate verify failed: %s" +msgstr "помилка SSL: помилка перевірки Ñертифіката %s" + +#: fe-secure-openssl.c:1566 +#, c-format +msgid "This may indicate that the server does not support any SSL protocol version between %s and %s." +msgstr "Це може вказувати, що Ñервер не підтримує жодної верÑÑ–Ñ— протоколу SSL між %s Ñ– %s." + +#: fe-secure-openssl.c:1598 +#, c-format +msgid "direct SSL connection was established without ALPN protocol negotiation extension" +msgstr "прÑме SSL Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ вÑтановлено без Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ‚Ð¾ÐºÐ¾Ð»Ñƒ ALPN" + +#: fe-secure-openssl.c:1610 +#, c-format +msgid "SSL connection was established with unexpected ALPN protocol" +msgstr "SSL Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð±ÑƒÐ»Ð¾ вÑтановлено з неочікуваним протоколом ALPN" + +#: fe-secure-openssl.c:1627 +#, c-format +msgid "certificate could not be obtained: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ Ñертифікат: %s" + +#: fe-secure-openssl.c:1734 +#, c-format msgid "no SSL error reported" msgstr "немає Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку SSL" -#: fe-secure-openssl.c:1530 +#: fe-secure-openssl.c:1777 #, c-format msgid "SSL error code %lu" msgstr "Код помилки SSL %lu" -#: fe-secure-openssl.c:1777 +#: fe-secure-openssl.c:2076 #, c-format msgid "WARNING: sslpassword truncated\n" msgstr "ПОПЕРЕДЖЕÐÐЯ: sslpassword Ñкорочено\n" -#: fe-secure.c:267 +#: fe-secure.c:248 #, c-format -msgid "could not receive data from server: %s\n" -msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані з Ñерверу: %s\n" +msgid "could not receive data from server: %s" +msgstr "не вдалоÑÑ Ð¾Ñ‚Ñ€Ð¸Ð¼Ð°Ñ‚Ð¸ дані з Ñерверу: %s" -#: fe-secure.c:380 +#: fe-secure.c:419 #, c-format -msgid "could not send data to server: %s\n" -msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ дані Ñерверу: %s\n" +msgid "could not send data to server: %s" +msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚Ð¸ дані Ñерверу: %s" -#: win32.c:314 +#: win32.c:310 #, c-format msgid "unrecognized socket error: 0x%08X/%d" msgstr "нерозпізнана помилка Ñокету: 0x%08X/%d" diff --git a/src/interfaces/libpq/po/zh_TW.po b/src/interfaces/libpq/po/zh_TW.po index 7d90c9e64033d..ae43bad8bcdf9 100644 --- a/src/interfaces/libpq/po/zh_TW.po +++ b/src/interfaces/libpq/po/zh_TW.po @@ -1,1073 +1,1952 @@ # Traditional Chinese message translation file for libpq -# Copyright (C) 2011 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. -# 2004-11-11 Zhenbang Wei +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the libpq (PostgreSQL) package. +# 2004-11-11 Zhenbang Wei # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.1\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2011-05-11 20:43+0000\n" -"PO-Revision-Date: 2013-09-03 23:27-0400\n" +"Project-Id-Version: libpq (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-11 20:40+0000\n" +"PO-Revision-Date: 2023-11-06 08:49+0800\n" "Last-Translator: Zhenbang Wei \n" -"Language-Team: EnterpriseDB translation team \n" +"Language-Team: \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.4.1\n" -# commands/aggregatecmds.c:111 -#: fe-auth.c:212 fe-auth.c:431 fe-auth.c:658 -msgid "host name must be specified\n" -msgstr "必須指定主機å稱\n" +# utils/fmgr/dfmgr.c:145 +#: ../../port/thread.c:50 ../../port/thread.c:86 +#, c-format +msgid "could not look up local user ID %d: %s" +msgstr "無法查詢本地使用者ID %d: %s" -# fe-auth.c:394 -#: fe-auth.c:242 +# libpq/hba.c:1481 libpq/hba.c:1512 libpq/hba.c:1582 +#: ../../port/thread.c:55 ../../port/thread.c:91 #, c-format -msgid "could not set socket to blocking mode: %s\n" -msgstr "無法將 socket 設為阻擋模å¼: %s\n" +msgid "local user with ID %d does not exist" +msgstr "本地使用者ID %d ä¸å­˜åœ¨" -# fe-auth.c:411 -# fe-auth.c:415 -#: fe-auth.c:260 fe-auth.c:264 +#: fe-auth-scram.c:227 #, c-format -msgid "Kerberos 5 authentication rejected: %*s\n" -msgstr "kerberos 5 èªè­‰è¢«æ‹’絕: %*s\n" +msgid "malformed SCRAM message (empty message)" +msgstr "SCRAMè¨Šæ¯æ ¼å¼éŒ¯èª¤(空訊æ¯)" -# fe-auth.c:441 -#: fe-auth.c:290 +#: fe-auth-scram.c:232 #, c-format -msgid "could not restore non-blocking mode on socket: %s\n" -msgstr "無法將 socket 還原為éžé˜»æ“‹æ¨¡å¼: %s\n" +msgid "malformed SCRAM message (length mismatch)" +msgstr "SCRAMè¨Šæ¯æ ¼å¼éŒ¯èª¤(長度ä¸ä¸€è‡´)" -#: fe-auth.c:402 -msgid "GSSAPI continuation error" -msgstr "GSSAPI 接續錯誤" +#: fe-auth-scram.c:275 +#, c-format +msgid "could not verify server signature: %s" +msgstr "無法驗證伺æœå™¨ç°½å: %s" -#: fe-auth.c:438 -msgid "duplicate GSS authentication request\n" -msgstr "é‡è¤‡çš„ GSS é©—è­‰è¦æ±‚\n" +#: fe-auth-scram.c:281 +#, c-format +msgid "incorrect server signature" +msgstr "伺æœå™¨ç°½å錯誤" -#: fe-auth.c:458 -msgid "GSSAPI name import error" -msgstr "GSSAPI å稱匯入錯誤" +# tcop/postgres.c:3105 +#: fe-auth-scram.c:290 +#, c-format +msgid "invalid SCRAM exchange state" +msgstr "SCRAM交æ›ç‹€æ…‹ç„¡æ•ˆ" -#: fe-auth.c:544 -msgid "SSPI continuation error" -msgstr "SSPI 接續錯誤" +#: fe-auth-scram.c:317 +#, c-format +msgid "malformed SCRAM message (attribute \"%c\" expected)" +msgstr "SCRAMè¨Šæ¯æ ¼å¼éŒ¯èª¤(é æœŸå±¬æ€§ \"%c\")" -# fe-connect.c:1414 -# fe-connect.c:2544 -# fe-connect.c:2553 -# fe-connect.c:3132 -# fe-lobj.c:556 -# fe-protocol2.c:1007 -# fe-protocol3.c:958 -#: fe-auth.c:555 fe-auth.c:629 fe-auth.c:664 fe-auth.c:761 fe-connect.c:1989 -#: fe-connect.c:3388 fe-connect.c:3605 fe-connect.c:4021 fe-connect.c:4030 -#: fe-connect.c:4167 fe-connect.c:4213 fe-connect.c:4231 fe-connect.c:4310 -#: fe-connect.c:4380 fe-connect.c:4426 fe-connect.c:4444 fe-exec.c:3140 -#: fe-exec.c:3305 fe-lobj.c:696 fe-protocol2.c:1092 fe-protocol3.c:1433 -msgid "out of memory\n" -msgstr "記憶體用盡\n" +#: fe-auth-scram.c:326 +#, c-format +msgid "malformed SCRAM message (expected character \"=\" for attribute \"%c\")" +msgstr "SCRAMè¨Šæ¯æ ¼å¼éŒ¯èª¤(屬性 \"%c\" çš„é æœŸå­—元是 \"=\" )" -# libpq/be-secure.c:807 -#: fe-auth.c:644 -msgid "could not acquire SSPI credentials" -msgstr "無法å–å¾— SSPI èªè­‰" +# access/transam/xlog.c:4111 +#: fe-auth-scram.c:366 +#, c-format +msgid "could not generate nonce" +msgstr "無法產生nonce" -# fe-auth.c:508 -#: fe-auth.c:737 -msgid "SCM_CRED authentication method not supported\n" -msgstr "䏿”¯æ´ SCM_CRED é©—è­‰\n" +# commands/sequence.c:798 executor/execGrouping.c:328 +# executor/execGrouping.c:388 executor/nodeIndexscan.c:1051 lib/dllist.c:43 +# lib/dllist.c:88 libpq/auth.c:637 postmaster/pgstat.c:1006 +# postmaster/pgstat.c:1023 postmaster/pgstat.c:2452 postmaster/pgstat.c:2527 +# postmaster/pgstat.c:2572 postmaster/pgstat.c:2623 +# postmaster/postmaster.c:755 postmaster/postmaster.c:1625 +# postmaster/postmaster.c:2344 storage/buffer/localbuf.c:139 +# storage/file/fd.c:587 storage/file/fd.c:620 storage/file/fd.c:766 +# storage/ipc/sinval.c:789 storage/lmgr/lock.c:497 storage/smgr/md.c:138 +# storage/smgr/md.c:848 storage/smgr/smgr.c:213 utils/adt/cash.c:297 +# utils/adt/cash.c:312 utils/adt/oracle_compat.c:73 +# utils/adt/oracle_compat.c:124 utils/adt/regexp.c:191 +# utils/adt/ri_triggers.c:3471 utils/cache/relcache.c:164 +# utils/cache/relcache.c:178 utils/cache/relcache.c:1130 +# utils/cache/typcache.c:165 utils/cache/typcache.c:487 +# utils/fmgr/dfmgr.c:127 utils/fmgr/fmgr.c:521 utils/fmgr/fmgr.c:532 +# utils/init/miscinit.c:213 utils/init/miscinit.c:234 +# utils/init/miscinit.c:244 utils/misc/guc.c:1898 utils/misc/guc.c:1911 +# utils/misc/guc.c:1924 utils/mmgr/aset.c:337 utils/mmgr/aset.c:503 +# utils/mmgr/aset.c:700 utils/mmgr/aset.c:893 utils/mmgr/portalmem.c:75 +#: fe-auth-scram.c:375 fe-auth-scram.c:448 fe-auth-scram.c:600 +#: fe-auth-scram.c:620 fe-auth-scram.c:644 fe-auth-scram.c:658 +#: fe-auth-scram.c:704 fe-auth-scram.c:740 fe-auth-scram.c:914 fe-auth.c:296 +#: fe-auth.c:369 fe-auth.c:403 fe-auth.c:618 fe-auth.c:729 fe-auth.c:1210 +#: fe-auth.c:1375 fe-connect.c:925 fe-connect.c:1759 fe-connect.c:1921 +#: fe-connect.c:3291 fe-connect.c:4496 fe-connect.c:5161 fe-connect.c:5416 +#: fe-connect.c:5534 fe-connect.c:5781 fe-connect.c:5861 fe-connect.c:5959 +#: fe-connect.c:6210 fe-connect.c:6237 fe-connect.c:6313 fe-connect.c:6336 +#: fe-connect.c:6360 fe-connect.c:6395 fe-connect.c:6481 fe-connect.c:6489 +#: fe-connect.c:6846 fe-connect.c:6996 fe-exec.c:527 fe-exec.c:1321 +#: fe-exec.c:3111 fe-exec.c:4071 fe-exec.c:4235 fe-gssapi-common.c:109 +#: fe-lobj.c:870 fe-protocol3.c:204 fe-protocol3.c:228 fe-protocol3.c:256 +#: fe-protocol3.c:273 fe-protocol3.c:353 fe-protocol3.c:720 fe-protocol3.c:959 +#: fe-protocol3.c:1770 fe-protocol3.c:2170 fe-secure-common.c:110 +#: fe-secure-gssapi.c:500 fe-secure-openssl.c:434 fe-secure-openssl.c:1285 +#, c-format +msgid "out of memory" +msgstr "記憶體ä¸è¶³" -# fe-auth.c:608 -#: fe-auth.c:811 -msgid "Kerberos 4 authentication not supported\n" -msgstr "䏿”¯æ´ Kerberos 4 é©—è­‰\n" +#: fe-auth-scram.c:382 +#, c-format +msgid "could not encode nonce" +msgstr "無法編碼nonce" -# fe-auth.c:627 -#: fe-auth.c:827 -msgid "Kerberos 5 authentication not supported\n" -msgstr "䏿”¯æ´ Kerberos 5 é©—è­‰\n" +# fe-connect.c:1197 +#: fe-auth-scram.c:570 +#, c-format +msgid "could not calculate client proof: %s" +msgstr "無法計算客戶端證明: %s" -# fe-auth.c:608 -#: fe-auth.c:899 -msgid "GSSAPI authentication not supported\n" -msgstr "䏿”¯æ´ GSSAPI é©—è­‰\n" +# libpq/pqcomm.c:1001 +#: fe-auth-scram.c:585 +#, c-format +msgid "could not encode client proof" +msgstr "無法編碼客戶端證明" -# fe-auth.c:608 -#: fe-auth.c:931 -msgid "SSPI authentication not supported\n" -msgstr "䏿”¯æ´ SSPI é©—è­‰\n" +#: fe-auth-scram.c:637 +#, c-format +msgid "invalid SCRAM response (nonce mismatch)" +msgstr "SCRAM回應無效(nonceä¸ä¸€è‡´)" -# fe-auth.c:608 -#: fe-auth.c:939 -msgid "Crypt authentication not supported\n" -msgstr "䏿”¯æ´åŠ å¯†é©—è­‰\n" +#: fe-auth-scram.c:667 +#, c-format +msgid "malformed SCRAM message (invalid salt)" +msgstr "SCRAMè¨Šæ¯æ ¼å¼éŒ¯èª¤(salt無效)" -# fe-auth.c:655 -#: fe-auth.c:966 +#: fe-auth-scram.c:680 #, c-format -msgid "authentication method %u not supported\n" -msgstr "䏿”¯æ´ %u é©—è­‰\n" +msgid "malformed SCRAM message (invalid iteration count)" +msgstr "SCRAMè¨Šæ¯æ ¼å¼éŒ¯èª¤(迭代次數無效)" -# fe-connect.c:452 -#: fe-connect.c:761 +#: fe-auth-scram.c:685 #, c-format -msgid "invalid sslmode value: \"%s\"\n" -msgstr "無效的 sslmode: \"%s\"\n" +msgid "malformed SCRAM message (garbage at end of server-first-message)" +msgstr "SCRAMè¨Šæ¯æ ¼å¼éŒ¯èª¤(伺æœå™¨é¦–次訊æ¯çµå°¾æœ‰åžƒåœ¾è³‡æ–™)" -# fe-connect.c:472 -#: fe-connect.c:782 +# libpq/auth.c:585 +#: fe-auth-scram.c:719 #, c-format -msgid "sslmode value \"%s\" invalid when SSL support is not compiled in\n" -msgstr "編譯時未加入 SSL 支æ´ï¼Œç„¡æ•ˆçš„ sllmode 值 \"%s\"\n" +msgid "error received from server in SCRAM exchange: %s" +msgstr "SCRAMäº¤æ›æ™‚從伺æœå™¨æ”¶åˆ°éŒ¯èª¤: %s" -# fe-connect.c:810 -#: fe-connect.c:975 +#: fe-auth-scram.c:734 #, c-format -msgid "could not set socket to TCP no delay mode: %s\n" -msgstr "無法將 socket 設定為 TCP ç„¡å»¶é²æ¨¡å¼: %s\n" +msgid "malformed SCRAM message (garbage at end of server-final-message)" +msgstr "SCRAMè¨Šæ¯æ ¼å¼éŒ¯èª¤(伺æœå™¨æœ€çµ‚訊æ¯çµå°¾æœ‰åžƒåœ¾è³‡æ–™)" -# fe-connect.c:841 -#: fe-connect.c:1005 +#: fe-auth-scram.c:751 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running locally and accepting\n" -"\tconnections on Unix domain socket \"%s\"?\n" -msgstr "" -"無法連線到伺æœå™¨: %s\n" -"\t伺æœå™¨æ˜¯å¦åœ¨æœ¬åœ°åŸ·è¡Œä¸¦ä¸”在 Unix domain socket\n" -"\t\"%s\"上準備接å—連線?\n" +msgid "malformed SCRAM message (invalid server signature)" +msgstr "SCRAMè¨Šæ¯æ ¼å¼éŒ¯èª¤(伺æœå™¨ç°½å無效)" -# fe-connect.c:853 -#: fe-connect.c:1055 +# access/transam/xlog.c:4111 +#: fe-auth-scram.c:923 +msgid "could not generate random salt" +msgstr "無法產生隨機salt" + +#: fe-auth.c:77 #, c-format -msgid "" -"could not connect to server: %s\n" -"\tIs the server running on host \"%s\"%s%s%s and accepting\n" -"\tTCP/IP connections on port %s?\n" -msgstr "" -"無法連線到伺æœå™¨: %s\n" -"\t伺æœå™¨æ˜¯å¦åœ¨ä¸»æ©Ÿ \"%s\"%s%s%s 執行並且接å—\n" -"\t連接埠 %s çš„TCP/IP連線?\n" +msgid "out of memory allocating GSSAPI buffer (%d)" +msgstr "é…ç½®GSSAPIç·©è¡å€æ™‚記憶體ä¸è¶³(%d)" -# libpq/pqcomm.c:346 -#: fe-connect.c:1114 +#: fe-auth.c:138 +msgid "GSSAPI continuation error" +msgstr "GSSAPI continuation錯誤" + +# commands/aggregatecmds.c:111 +#: fe-auth.c:168 fe-auth.c:397 fe-gssapi-common.c:97 fe-secure-common.c:99 +#: fe-secure-common.c:173 #, c-format -msgid "setsockopt(TCP_KEEPIDLE) failed: %s\n" -msgstr "setsockopt(TCP_KEEPIDLE) 失敗: %s\n" +msgid "host name must be specified" +msgstr "必須指定主機å稱" -# libpq/pqcomm.c:346 -#: fe-connect.c:1127 +#: fe-auth.c:174 #, c-format -msgid "setsockopt(TCP_KEEPALIVE) failed: %s\n" -msgstr "setsockopt(TCP_KEEPALIVE) 失敗: %s\n" +msgid "duplicate GSS authentication request" +msgstr "é‡è¤‡çš„GSS驗證請求" -# libpq/pqcomm.c:360 -#: fe-connect.c:1159 +#: fe-auth.c:238 #, c-format -msgid "setsockopt(TCP_KEEPINTVL) failed: %s\n" -msgstr "setsockopt(TCP_KEEPINTVL) 失敗: %s\n" +msgid "out of memory allocating SSPI buffer (%d)" +msgstr "é…ç½®SSPIç·©è¡å€æ™‚記憶體ä¸è¶³(%d)" -# libpq/pqcomm.c:360 -#: fe-connect.c:1191 +#: fe-auth.c:285 +msgid "SSPI continuation error" +msgstr "SSPI continuation錯誤" + +#: fe-auth.c:359 #, c-format -msgid "setsockopt(TCP_KEEPCNT) failed: %s\n" -msgstr "setsockopt(TCP_KEEPCNT) 失敗: %s\n" +msgid "duplicate SSPI authentication request" +msgstr "é‡è¤‡çš„SSPI驗證請求" -#: fe-connect.c:1239 +# libpq/be-secure.c:807 +#: fe-auth.c:384 +msgid "could not acquire SSPI credentials" +msgstr "無法å–å¾—SSPI憑證" + +#: fe-auth.c:437 #, c-format -msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" -msgstr "WSAIoctl(SIO_KEEPALIVE_VALS) 失敗: %ui\n" +msgid "channel binding required, but SSL not in use" +msgstr "需è¦é€šé“ç¶å®šï¼Œä½†æœªä½¿ç”¨SSL" -# commands/user.c:240 commands/user.c:371 -#: fe-connect.c:1291 +#: fe-auth.c:443 #, c-format -msgid "invalid port number: \"%s\"\n" -msgstr "無效的連接埠: \"%s\"\n" +msgid "duplicate SASL authentication request" +msgstr "é‡è¤‡çš„SASL驗證請求" -# fe-connect.c:946 -#: fe-connect.c:1334 +#: fe-auth.c:501 #, c-format -msgid "could not translate host name \"%s\" to address: %s\n" -msgstr "無法將主機å稱 \"%s\" è½‰æ›æˆä½å€: %s\n" +msgid "channel binding is required, but client does not support it" +msgstr "需è¦é€šé“ç¶å®šï¼Œä½†å®¢æˆ¶ç«¯ä¸æ”¯æ´" -# fe-connect.c:950 -#: fe-connect.c:1338 +#: fe-auth.c:517 #, c-format -msgid "could not translate Unix-domain socket path \"%s\" to address: %s\n" -msgstr "無法將 Unix-domain socke t路徑 \"%s\" è½‰æ›æˆä½å€: %s\n" +msgid "server offered SCRAM-SHA-256-PLUS authentication over a non-SSL connection" +msgstr "伺æœå™¨åœ¨éžSSL連線æä¾›SCRAM-SHA-256-PLUS身份驗證" -# fe-connect.c:1154 -#: fe-connect.c:1548 -msgid "invalid connection state, probably indicative of memory corruption\n" -msgstr "無效的連線狀態,å¯èƒ½æ˜¯è¨˜æ†¶é«”中的資料被破壞\n" +# fe-auth.c:608 +#: fe-auth.c:531 +#, c-format +msgid "none of the server's SASL authentication mechanisms are supported" +msgstr "沒有支æ´ä¼ºæœå™¨çš„任何SASL身份驗證機制" -# fe-connect.c:1197 -#: fe-connect.c:1589 +#: fe-auth.c:538 #, c-format -msgid "could not create socket: %s\n" -msgstr "無法建立 socket: %s\n" +msgid "channel binding is required, but server did not offer an authentication method that supports channel binding" +msgstr "需è¦é€šé“ç¶å®šï¼Œä½†ä¼ºæœå™¨æœªæä¾›æ”¯æ´é€šé“ç¶å®šçš„身份驗證方法" -# fe-connect.c:783 -#: fe-connect.c:1612 +#: fe-auth.c:641 #, c-format -msgid "could not set socket to non-blocking mode: %s\n" -msgstr "無法將 socket 設定為éžé˜»æ“‹æ¨¡å¼: %s\n" +msgid "out of memory allocating SASL buffer (%d)" +msgstr "é…ç½®SASLç·©è¡å€æ™‚記憶體ä¸è¶³(%d)" -# fe-auth.c:394 -#: fe-connect.c:1624 +# libpq/auth.c:391 +#: fe-auth.c:665 #, c-format -msgid "could not set socket to close-on-exec mode: %s\n" -msgstr "無法將 socket 設為 close-on-exec 模å¼: %s\n" +msgid "AuthenticationSASLFinal received from server, but SASL authentication was not completed" +msgstr "從伺æœå™¨æ”¶åˆ°AuthenticationSASLFinal,但SASL身份驗證未完æˆ" -#: fe-connect.c:1644 -msgid "keepalives parameter must be an integer\n" -msgstr "keepalive åƒæ•¸å¿…須是整數\n" +#: fe-auth.c:675 +#, c-format +msgid "no client response found after SASL exchange success" +msgstr "SASLäº¤æ›æˆåŠŸå¾Œæ‰¾ä¸åˆ°å®¢æˆ¶ç«¯å›žæ‡‰" -# libpq/pqcomm.c:346 -#: fe-connect.c:1657 +#: fe-auth.c:738 fe-auth.c:745 fe-auth.c:1358 fe-auth.c:1369 #, c-format -msgid "setsockopt(SO_KEEPALIVE) failed: %s\n" -msgstr "setsockopt(SO_KEEPALIVE) 失敗: %s\n" +msgid "could not encrypt password: %s" +msgstr "無法加密密碼: %s" -# fe-connect.c:1308 -#: fe-connect.c:1798 +#: fe-auth.c:773 +msgid "server requested a cleartext password" +msgstr "伺æœå™¨è¦æ±‚明文密碼" + +#: fe-auth.c:775 +msgid "server requested a hashed password" +msgstr "伺æœå™¨è¦æ±‚密碼雜湊" + +#: fe-auth.c:778 +msgid "server requested GSSAPI authentication" +msgstr "伺æœå™¨è¦æ±‚GSSAPI身份驗證" + +#: fe-auth.c:780 +msgid "server requested SSPI authentication" +msgstr "伺æœå™¨è¦æ±‚SSPI身份驗證" + +#: fe-auth.c:784 +msgid "server requested SASL authentication" +msgstr "伺æœå™¨è¦æ±‚SASL身份驗證" + +#: fe-auth.c:787 +msgid "server requested an unknown authentication type" +msgstr "伺æœå™¨è¦æ±‚未知的身份驗證類型" + +#: fe-auth.c:820 #, c-format -msgid "could not get socket error status: %s\n" -msgstr "無法å–å¾— socket 的錯誤狀態: %s\n" +msgid "server did not request an SSL certificate" +msgstr "伺æœå™¨æœªè¦æ±‚SSL憑證" -# fe-connect.c:1347 -#: fe-connect.c:1836 +#: fe-auth.c:825 #, c-format -msgid "could not get client address from socket: %s\n" -msgstr "無法從 socket å–得客戶端ä½å€: %s\n" +msgid "server accepted connection without a valid SSL certificate" +msgstr "伺æœå™¨æŽ¥å—一個沒有有效SSL憑證的連線" -# libpq/hba.c:1472 libpq/hba.c:1503 libpq/hba.c:1571 -#: fe-connect.c:1868 fe-connect.c:1882 fe-connect.c:1894 +#: fe-auth.c:879 +msgid "server did not complete authentication" +msgstr "伺æœå™¨æœªå®Œæˆèº«ä»½é©—è­‰" + +# fe-auth.c:655 +#: fe-auth.c:913 #, c-format -msgid "could not get peer credentials: %s\n" -msgstr "無法å–å¾—å°é»žèªè­‰: %s\n" +msgid "authentication method requirement \"%s\" failed: %s" +msgstr "身份驗證方法需求\"%s\"失敗: %s" -# libpq/pqcomm.c:702 -#: fe-connect.c:1902 +#: fe-auth.c:936 #, c-format -msgid "could not get effective UID from peer credentials: %s\n" -msgstr "無法從å°é»žèªè­‰å–得有效 UID: %s\n" +msgid "channel binding required, but server authenticated client without channel binding" +msgstr "需è¦é€šé“ç¶å®šï¼Œä½†ä¼ºæœå™¨åœ¨æœªé€²è¡Œé€šé“ç¶å®šçš„æƒ…æ³ä¸‹å°å®¢æˆ¶ç«¯é€²è¡Œäº†èº«ä»½é©—è­‰" -# libpq/hba.c:1481 libpq/hba.c:1512 libpq/hba.c:1582 -#: fe-connect.c:1917 +#: fe-auth.c:941 #, c-format -msgid "local user with ID %d does not exist\n" -msgstr "本機使用者 ID %d ä¸å­˜åœ¨\n" +msgid "channel binding required but not supported by server's authentication request" +msgstr "需è¦é€šé“ç¶å®šï¼Œä½†ä¼ºæœå™¨çš„èº«ä»½é©—è­‰è«‹æ±‚ä¸æ”¯æ´æ­¤åŠŸèƒ½" -#: fe-connect.c:1925 +# fe-auth.c:608 +#: fe-auth.c:975 #, c-format -msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"\n" -msgstr "requirepeer 指定 \"%s\", 但實際å°é»žä½¿ç”¨è€…å稱是 \"%s\"\n" +msgid "Kerberos 4 authentication not supported" +msgstr "䏿”¯æ´Kerberos 4身份驗證" -# commands/tablespace.c:386 commands/tablespace.c:483 -#: fe-connect.c:1931 -msgid "requirepeer parameter is not supported on this platform\n" -msgstr "é€™å€‹å¹³è‡ºä¸æ”¯æ´ requirepeer åƒæ•¸\n" +# fe-auth.c:627 +#: fe-auth.c:979 +#, c-format +msgid "Kerberos 5 authentication not supported" +msgstr "䏿”¯æ´Kerberos 5身份驗證" -# fe-connect.c:1392 -#: fe-connect.c:1963 +# fe-auth.c:608 +#: fe-auth.c:1049 #, c-format -msgid "could not send SSL negotiation packet: %s\n" -msgstr "ç„¡æ³•å‚³é€ SSL 交談å°åŒ…: %s\n" +msgid "GSSAPI authentication not supported" +msgstr "䏿”¯æ´GSSAPI身份驗證" -# fe-connect.c:1427 -#: fe-connect.c:2002 +# fe-auth.c:608 +#: fe-auth.c:1080 #, c-format -msgid "could not send startup packet: %s\n" -msgstr "無法傳é€å•Ÿå‹•å°åŒ…: %s\n" +msgid "SSPI authentication not supported" +msgstr "䏿”¯æ´SSPI身份驗證" -# fe-connect.c:1486 -# fe-connect.c:1503 -#: fe-connect.c:2069 fe-connect.c:2088 -msgid "server does not support SSL, but SSL was required\n" -msgstr "伺æœå™¨ä¸æ”¯æ´ SSLï¼Œä½†æ˜¯è¢«è¦æ±‚使用 SSL\n" +# fe-auth.c:608 +#: fe-auth.c:1087 +#, c-format +msgid "Crypt authentication not supported" +msgstr "䏿”¯æ´Crypt身份驗證" -# fe-connect.c:1519 -#: fe-connect.c:2104 +# fe-auth.c:655 +#: fe-auth.c:1151 #, c-format -msgid "received invalid response to SSL negotiation: %c\n" -msgstr "收到無效的 SSL 交談回應: %c\n" +msgid "authentication method %u not supported" +msgstr "䏿”¯æ´èº«ä»½é©—證方法 %u" -# fe-connect.c:1576 -# fe-connect.c:1608 -#: fe-connect.c:2180 fe-connect.c:2213 +# port/win32/security.c:39 +#: fe-auth.c:1197 #, c-format -msgid "expected authentication request from server, but received %c\n" -msgstr "期待來自伺æœå™¨çš„èªè­‰è«‹æ±‚,但是收到 %c\n" +msgid "user name lookup failure: error code %lu" +msgstr "使用者å稱查找失敗: 錯誤碼 %lu" -#: fe-connect.c:2386 +#: fe-auth.c:1321 #, c-format -msgid "out of memory allocating GSSAPI buffer (%i)" -msgstr "é…ç½® GSSAPI ç·©è¡å€æ™‚記憶體ä¸è¶³ (%i)" +msgid "unexpected shape of result set returned for SHOW" +msgstr "SHOW å›žå‚³çš„çµæžœé›†æ ¼å¼èˆ‡é æœŸä¸ç¬¦" -# fe-connect.c:1844 -#: fe-connect.c:2471 -msgid "unexpected message from server during startup\n" -msgstr "啟動éŽç¨‹ä¸­æ”¶åˆ°ä¾†è‡ªä¼ºæœå™¨çš„éžé æœŸè¨Šæ¯\n" +#: fe-auth.c:1329 +#, c-format +msgid "password_encryption value too long" +msgstr "password_encryption值éŽé•·" -# fe-connect.c:1914 -#: fe-connect.c:2567 +# access/transam/xlog.c:3720 +#: fe-auth.c:1379 #, c-format -msgid "invalid connection state %d, probably indicative of memory corruption\n" -msgstr "無效的連線狀態 %d,å¯èƒ½æ˜¯è¨˜æ†¶é«”中的資料被破壞\n" +msgid "unrecognized password encryption algorithm \"%s\"" +msgstr "無法識別的密碼加密演算法 \"%s\"" -#: fe-connect.c:2996 fe-connect.c:3056 +# fe-connect.c:946 +#: fe-connect.c:1132 #, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" -msgstr "PGEVT_CONNRESET 事件期間 PGEventProc \"%s\" 失敗\n" +msgid "could not match %d host names to %d hostaddr values" +msgstr "無法將 %d 主機åç¨±å°æ‡‰åˆ° %d hostaddr值" -#: fe-connect.c:3401 +#: fe-connect.c:1212 #, c-format -msgid "invalid LDAP URL \"%s\": scheme must be ldap://\n" -msgstr "LDAP URL \"%s\" 無效: 類型必須是 ldap://\n" +msgid "could not match %d port numbers to %d hosts" +msgstr "無法將 %d é€£æŽ¥åŸ å°æ‡‰åˆ° %d 主機" -#: fe-connect.c:3416 +#: fe-connect.c:1337 #, c-format -msgid "invalid LDAP URL \"%s\": missing distinguished name\n" -msgstr "LDAP URL \"%s\" 無效: éºæ¼è­˜åˆ¥å稱\n" +msgid "negative require_auth method \"%s\" cannot be mixed with non-negative methods" +msgstr "" -#: fe-connect.c:3427 fe-connect.c:3480 +#: fe-connect.c:1350 #, c-format -msgid "invalid LDAP URL \"%s\": must have exactly one attribute\n" -msgstr "LDAP URL \"%s\" 無效: åªèƒ½æœ‰ä¸€å€‹å±¬æ€§\n" +msgid "require_auth method \"%s\" cannot be mixed with negative methods" +msgstr "" -#: fe-connect.c:3437 fe-connect.c:3494 +# utils/adt/network.c:105 +#: fe-connect.c:1410 fe-connect.c:1461 fe-connect.c:1503 fe-connect.c:1559 +#: fe-connect.c:1567 fe-connect.c:1598 fe-connect.c:1644 fe-connect.c:1684 +#: fe-connect.c:1705 #, c-format -msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)\n" -msgstr "LDAP URL \"%s\" 無效: 必須有æœå°‹ç¯„åœ (base/one/sub)\n" +msgid "invalid %s value: \"%s\"" +msgstr "無效的 %s 值: %s" -#: fe-connect.c:3448 +# commands/copy.c:2716 parser/parse_target.c:648 parser/parse_target.c:658 +#: fe-connect.c:1443 #, c-format -msgid "invalid LDAP URL \"%s\": no filter\n" -msgstr "LDAP URL \"%s\" 無效: ç„¡éŽæ¿¾å™¨\n" +msgid "require_auth method \"%s\" is specified more than once" +msgstr "require_authæ–¹å¼\"%s\"被多次指定" -#: fe-connect.c:3469 +# fe-connect.c:472 +#: fe-connect.c:1484 fe-connect.c:1523 fe-connect.c:1606 #, c-format -msgid "invalid LDAP URL \"%s\": invalid port number\n" -msgstr "LDAP URL \"%s\" 無效: 埠號無效\n" +msgid "%s value \"%s\" invalid when SSL support is not compiled in" +msgstr "編譯未加上SSLæ”¯æ´æ™‚,%s 值 \"%s\" 無效" -# fe-secure.c:932 -#: fe-connect.c:3503 -msgid "could not create LDAP structure\n" -msgstr "無法建立 LDAP çµæ§‹\n" +#: fe-connect.c:1546 +#, c-format +msgid "weak sslmode \"%s\" may not be used with sslrootcert=system (use \"verify-full\")" +msgstr "å¼±SSL模å¼\"%s\"ä¸èƒ½èˆ‡sslrootcert=system一起使用(用\"verify-full\")" -#: fe-connect.c:3545 +#: fe-connect.c:1584 #, c-format -msgid "lookup on LDAP server failed: %s\n" -msgstr "查閱 LDAP 伺æœå™¨å¤±æ•—:%s\n" +msgid "invalid SSL protocol version range" +msgstr "SSLå”議版本範åœç„¡æ•ˆ" -#: fe-connect.c:3556 -msgid "more than one entry found on LDAP lookup\n" -msgstr "LDAP 查閱作業找到多個項目\n" +# catalog/aclchk.c:758 commands/comment.c:1001 commands/functioncmds.c:451 +# commands/proclang.c:202 commands/proclang.c:257 utils/adt/acl.c:2079 +#: fe-connect.c:1621 +#, c-format +msgid "%s value \"%s\" is not supported (check OpenSSL version)" +msgstr "䏿”¯æ´%s值\"%s\"(請檢查OpenSSL版本)" -#: fe-connect.c:3557 fe-connect.c:3569 -msgid "no entry found on LDAP lookup\n" -msgstr "LDAP 查閱作業找ä¸åˆ°é …ç›®\n" +# fe-connect.c:472 +#: fe-connect.c:1651 +#, c-format +msgid "gssencmode value \"%s\" invalid when GSSAPI support is not compiled in" +msgstr "編譯未加上GSSAPIæ”¯æ´æ™‚,gssencmode值\"%s\"無效" -#: fe-connect.c:3580 fe-connect.c:3593 -msgid "attribute has no values on LDAP lookup\n" -msgstr "用於 LDAP 查閱作業的屬性沒有值\n" +# fe-connect.c:810 +#: fe-connect.c:1944 +#, c-format +msgid "could not set socket to TCP no delay mode: %s" +msgstr "無法將socket設定為TCPç„¡å»¶é²æ¨¡å¼: %s" -# fe-connect.c:2592 -#: fe-connect.c:3644 fe-connect.c:3662 fe-connect.c:4069 +#: fe-connect.c:2003 #, c-format -msgid "missing \"=\" after \"%s\" in connection info string\n" -msgstr "在連線資訊字串裡的 \"%s\" 後é¢ç¼ºå°‘ \"=\"\n" +msgid "connection to server on socket \"%s\" failed: " +msgstr "é€éŽ socket \"%s\" 連線至資料庫失敗: " -# fe-connect.c:2675 -#: fe-connect.c:3725 fe-connect.c:4151 fe-connect.c:4335 +#: fe-connect.c:2029 #, c-format -msgid "invalid connection option \"%s\"\n" -msgstr "無效的連線é¸é … \"%s\"\n" +msgid "connection to server at \"%s\" (%s), port %s failed: " +msgstr "連線至資料庫 \"%s\"(%s),連接埠 %s 失敗: " -# fe-connect.c:2641 -#: fe-connect.c:3738 fe-connect.c:4118 -msgid "unterminated quoted string in connection info string\n" -msgstr "é€£ç·šè³‡è¨Šå­—ä¸²ä¸­æœ‰æœªçµæŸçš„引號\n" +#: fe-connect.c:2034 +#, c-format +msgid "connection to server at \"%s\", port %s failed: " +msgstr "連線至資料庫 \"%s\",連接埠 %s 失敗: " -# libpq/be-secure.c:714 -#: fe-connect.c:3777 -msgid "could not get home directory to locate service definition file" -msgstr "無法å–得用來尋找æœå‹™å®šç¾©æª”的家目錄" +# fe-connect.c:841 +#: fe-connect.c:2057 +#, c-format +msgid "\tIs the server running locally and accepting connections on that socket?" +msgstr "\t伺æœå™¨æ˜¯å¦åœ¨æœ¬åœ°åŸ·è¡Œä¸¦æŽ¥å—socket連線?" -#: fe-connect.c:3810 +# fe-connect.c:853 +#: fe-connect.c:2059 #, c-format -msgid "definition of service \"%s\" not found\n" -msgstr "找ä¸åˆ°æœå‹™å®šç¾© \"%s\"\n" +msgid "\tIs the server running on that host and accepting TCP/IP connections?" +msgstr "\t伺æœå™¨æ˜¯å¦åœ¨è©²ä¸»æ©Ÿä¸ŠåŸ·è¡Œä¸¦æŽ¥å—TCP/IP連線?" -#: fe-connect.c:3833 +# utils/adt/formatting.c:2044 +#: fe-connect.c:2122 #, c-format -msgid "service file \"%s\" not found\n" -msgstr "找ä¸åˆ°æœå‹™æª” \"%s\"\n" +msgid "invalid integer value \"%s\" for connection option \"%s\"" +msgstr "連接é¸é … \"%s\" 的整數值 \"%s\" 無效" -#: fe-connect.c:3846 +# fe-misc.c:991 +#: fe-connect.c:2151 fe-connect.c:2185 fe-connect.c:2220 fe-connect.c:2318 +#: fe-connect.c:2973 #, c-format -msgid "line %d too long in service file \"%s\"\n" -msgstr "æœå‹™æª” \"%2$s\" 第 %1$d 行太長\n" +msgid "%s(%s) failed: %s" +msgstr "%s(%s) 失敗: %s" -# guc-file.l:267 -#: fe-connect.c:3917 fe-connect.c:3944 +#: fe-connect.c:2284 #, c-format -msgid "syntax error in service file \"%s\", line %d\n" -msgstr "æœå‹™æª”第 %2$d 行語法錯誤 \"%1$s\"\n" +msgid "%s(%s) failed: error code %d" +msgstr "%s(%s) 失敗: 錯誤碼 %d" -# fe-connect.c:2897 -#: fe-connect.c:4611 -msgid "connection pointer is NULL\n" -msgstr "連線指標是 NULL\n" +# fe-connect.c:1154 +#: fe-connect.c:2597 +#, c-format +msgid "invalid connection state, probably indicative of memory corruption" +msgstr "連線狀態無效,å¯èƒ½æ˜¯è¨˜æ†¶é«”æå£ž" -#: fe-connect.c:4888 +# commands/user.c:240 commands/user.c:371 +#: fe-connect.c:2676 #, c-format -msgid "WARNING: password file \"%s\" is not a plain file\n" -msgstr "警告: 密碼檔 \"%s\" 䏿˜¯ç´”文字檔\n" +msgid "invalid port number: \"%s\"" +msgstr "連接埠無效: \"%s\"" -# fe-connect.c:3154 -#: fe-connect.c:4897 +# fe-connect.c:946 +#: fe-connect.c:2690 #, c-format -msgid "" -"WARNING: password file \"%s\" has group or world access; permissions should " -"be u=rw (0600) or less\n" -msgstr "" -"警告: 密碼檔 \"%s\" å¯ä»¥è¢«ç¾¤çµ„或其他使用者存å–,應該將權é™è¨­ç‚º be u=rw " -"(0600) 或更底權é™\n" +msgid "could not translate host name \"%s\" to address: %s" +msgstr "無法將主機å稱 \"%s\" 轉譯æˆä½å€: %s" -# utils/init/miscinit.c:792 utils/misc/guc.c:5074 -#: fe-connect.c:4985 +# libpq/hba.c:1380 +#: fe-connect.c:2702 #, c-format -msgid "password retrieved from file \"%s\"\n" -msgstr "從檔案 \"%s\" å–得密碼\n" +msgid "could not parse network address \"%s\": %s" +msgstr "無法解æžç¶²è·¯ä½å€ \"%s\": %s" -# fe-exec.c:484 -#: fe-exec.c:829 -msgid "NOTICE" -msgstr "注æ„" +#: fe-connect.c:2713 +#, c-format +msgid "Unix-domain socket path \"%s\" is too long (maximum %d bytes)" +msgstr "Unix-domain socket路徑\"%s\"太長(最多 %d 個ä½å…ƒçµ„)" -# fe-exec.c:653 -# fe-exec.c:705 -# fe-exec.c:745 -#: fe-exec.c:1016 fe-exec.c:1073 fe-exec.c:1113 -msgid "command string is a null pointer\n" -msgstr "命令字串是一個空指標\n" +# fe-connect.c:950 +#: fe-connect.c:2727 +#, c-format +msgid "could not translate Unix-domain socket path \"%s\" to address: %s" +msgstr "無法將Unix-domain socket 路徑 \"%s\" 轉譯æˆä½å€: %s" -# fe-exec.c:738 -# fe-exec.c:828 -#: fe-exec.c:1106 fe-exec.c:1201 -msgid "statement name is a null pointer\n" -msgstr "敘述å稱是一個空指標\n" +# fe-connect.c:1197 +#: fe-connect.c:2901 +#, c-format +msgid "could not create socket: %s" +msgstr "無法建立socket: %s" -# fe-exec.c:753 -# fe-exec.c:902 -# fe-exec.c:1577 -#: fe-exec.c:1121 fe-exec.c:1275 fe-exec.c:1944 fe-exec.c:2142 -msgid "function requires at least protocol version 3.0\n" -msgstr "函å¼éœ€è¦ 3.0 版以上的å”定\n" +# fe-connect.c:783 +#: fe-connect.c:2932 +#, c-format +msgid "could not set socket to nonblocking mode: %s" +msgstr "無法將socket設æˆéžé˜»æ“‹æ¨¡å¼: %s" -# fe-exec.c:859 -#: fe-exec.c:1232 -msgid "no connection to the server\n" -msgstr "沒有連線到伺æœå™¨\n" +# fe-auth.c:394 +#: fe-connect.c:2943 +#, c-format +msgid "could not set socket to close-on-exec mode: %s" +msgstr "無法將socket設æˆclose-on-exec模å¼: %s" -# fe-exec.c:866 -#: fe-exec.c:1239 -msgid "another command is already in progress\n" -msgstr "å¦å¤–一æ¢å‘½ä»¤æ­£åœ¨åŸ·è¡Œä¸­\n" +#: fe-connect.c:2961 +#, c-format +msgid "keepalives parameter must be an integer" +msgstr "keepaliveåƒæ•¸å¿…須是整數" -#: fe-exec.c:1351 -msgid "length must be given for binary parameter\n" -msgstr "必須指定二進ä½åƒæ•¸çš„長度\n" +# fe-connect.c:1308 +#: fe-connect.c:3100 +#, c-format +msgid "could not get socket error status: %s" +msgstr "無法å–å¾—spclet錯誤狀態: %s" -# fe-exec.c:1204 -#: fe-exec.c:1604 +# fe-connect.c:1347 +#: fe-connect.c:3127 #, c-format -msgid "unexpected asyncStatus: %d\n" -msgstr "éžé æœŸçš„ asyncStatus: %d\n" +msgid "could not get client address from socket: %s" +msgstr "無法從socketå–得客戶端ä½å€: %s" -#: fe-exec.c:1624 +# commands/tablespace.c:386 commands/tablespace.c:483 +#: fe-connect.c:3165 #, c-format -msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" -msgstr "PGEVT_RESULTCREATE 事件期間 PGEventProc \"%s\" 失敗\n" +msgid "requirepeer parameter is not supported on this platform" +msgstr "æ­¤å¹³è‡ºä¸æ”¯æ´requirepeeråƒæ•¸" -# fe-exec.c:1331 -#: fe-exec.c:1754 -msgid "COPY terminated by new PQexec" -msgstr "COPY 被新的 PQexec 中斷" +# libpq/hba.c:1472 libpq/hba.c:1503 libpq/hba.c:1571 +#: fe-connect.c:3167 +#, c-format +msgid "could not get peer credentials: %s" +msgstr "無法å–å¾—å°ç­‰æ†‘è­‰: %s" -# fe-exec.c:1339 -#: fe-exec.c:1762 -msgid "COPY IN state must be terminated first\n" -msgstr "å¿…é ˆå…ˆçµæŸ COPY IN 狀態\n" +#: fe-connect.c:3180 +#, c-format +msgid "requirepeer specifies \"%s\", but actual peer user name is \"%s\"" +msgstr "requirepeer指定為\"%s\",但實際å°ç­‰ä½¿ç”¨è€…å稱是\"%s\"" -# fe-exec.c:1359 -#: fe-exec.c:1782 -msgid "COPY OUT state must be terminated first\n" -msgstr "å¿…é ˆå…ˆçµæŸ COPY OUT 狀態\n" +# fe-connect.c:1392 +#: fe-connect.c:3221 +#, c-format +msgid "could not send GSSAPI negotiation packet: %s" +msgstr "無法傳é€GSSAPIå”商å°åŒ…: %s" -# fe-protocol3.c:1000 -#: fe-exec.c:1790 -msgid "PQexec not allowed during COPY BOTH\n" -msgstr "COPY BOTH 時ä¸å…許 PQexec\n" +#: fe-connect.c:3233 +#, c-format +msgid "GSSAPI encryption required but was impossible (possibly no credential cache, no server support, or using a local socket)" +msgstr "需è¦GSSAPIåŠ å¯†ä½†ç„¡æ³•é”æˆ(å¯èƒ½æ²’有憑證快å–ã€æ²’有伺æœå™¨æ”¯æ´æˆ–使用本機socket)" -# fe-exec.c:1469 -# fe-exec.c:1534 -# fe-exec.c:1619 -# fe-protocol2.c:1153 -# fe-protocol3.c:1115 -#: fe-exec.c:2033 fe-exec.c:2099 fe-exec.c:2186 fe-protocol2.c:1237 -#: fe-protocol3.c:1569 -msgid "no COPY in progress\n" -msgstr "沒有執行中的 COPY 命令\n" +# fe-connect.c:1392 +#: fe-connect.c:3274 +#, c-format +msgid "could not send SSL negotiation packet: %s" +msgstr "無法傳é€SSLå”商å°åŒ…: %s" -# fe-exec.c:1811 -#: fe-exec.c:2378 -msgid "connection in wrong state\n" -msgstr "連線處於錯誤的狀態\n" +# fe-connect.c:1427 +#: fe-connect.c:3303 +#, c-format +msgid "could not send startup packet: %s" +msgstr "無法傳é€å•Ÿå‹•å°åŒ…: %s" -# fe-exec.c:1842 -#: fe-exec.c:2409 -msgid "invalid ExecStatusType code" -msgstr "無效的 ExecStatusType 代碼" +# fe-connect.c:1486 +# fe-connect.c:1503 +#: fe-connect.c:3378 +#, c-format +msgid "server does not support SSL, but SSL was required" +msgstr "伺æœå™¨ä¸æ”¯æ´ SSL,但 SSL 是必è¦çš„" -# fe-exec.c:1906 -# fe-exec.c:1929 -#: fe-exec.c:2473 fe-exec.c:2496 +# fe-connect.c:1519 +#: fe-connect.c:3404 #, c-format -msgid "column number %d is out of range 0..%d" -msgstr "列號 %d è¶…å‡ºäº†ç¯„åœ 0..%d" +msgid "received invalid response to SSL negotiation: %c" +msgstr "收到無效的SSLå”商回應: %c" -# fe-exec.c:1922 -#: fe-exec.c:2489 +#: fe-connect.c:3424 #, c-format -msgid "row number %d is out of range 0..%d" -msgstr "行號 %d è¶…å‡ºäº†ç¯„åœ 0..%d" +msgid "received unencrypted data after SSL response" +msgstr "在SSL回應後收到未加密的資料" -# fe-exec.c:1922 -#: fe-exec.c:2511 +# fe-connect.c:1486 +# fe-connect.c:1503 +#: fe-connect.c:3504 #, c-format -msgid "parameter number %d is out of range 0..%d" -msgstr "åƒæ•¸ç·¨è™Ÿ %d è¶…å‡ºäº†ç¯„åœ 0..%d" +msgid "server doesn't support GSSAPI encryption, but it was required" +msgstr "伺æœå™¨ä¸æ”¯æ´GSSAPIåŠ å¯†ï¼Œä½†é€™æ˜¯å¿…è¦æ¢ä»¶" -# fe-exec.c:2204 -#: fe-exec.c:2799 +# fe-connect.c:1519 +#: fe-connect.c:3515 #, c-format -msgid "could not interpret result from server: %s" -msgstr "無法解讀來自伺æœå™¨çš„çµæžœ: %s" +msgid "received invalid response to GSSAPI negotiation: %c" +msgstr "收到å°GSSAPIå”商的無效回應: %c" -# postmaster/postmaster.c:1256 postmaster/postmaster.c:1287 -#: fe-exec.c:3038 fe-exec.c:3122 -msgid "incomplete multibyte character\n" -msgstr "多ä½å…ƒçµ„å­—å…ƒä¸å®Œæ•´\n" +#: fe-connect.c:3533 +#, c-format +msgid "received unencrypted data after GSSAPI encryption response" +msgstr "在GSSAPI加密回應後收到未加密的資料" -# fe-lobj.c:653 -#: fe-lobj.c:152 -msgid "cannot determine OID of function lo_truncate\n" -msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lo_truncate çš„ OID\n" +# fe-connect.c:1576 +# fe-connect.c:1608 +#: fe-connect.c:3598 +#, c-format +msgid "expected authentication request from server, but received %c" +msgstr "é æœŸå¾žä¼ºæœå™¨æ”¶åˆ°èº«ä»½é©—證請求,但收到%c" -# fe-lobj.c:653 -#: fe-lobj.c:380 -msgid "cannot determine OID of function lo_create\n" -msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lo_create çš„ OID\n" +#: fe-connect.c:3625 fe-connect.c:3794 +#, c-format +msgid "received invalid authentication request" +msgstr "收到無效的身份驗證請求" -# fe-lobj.c:410 -# fe-lobj.c:495 -#: fe-lobj.c:525 fe-lobj.c:624 +# fe-connect.c:1519 +#: fe-connect.c:3630 fe-connect.c:3779 #, c-format -msgid "could not open file \"%s\": %s\n" -msgstr "無法開啟檔案 \"%s\": %s\n" +msgid "received invalid protocol negotiation message" +msgstr "收到無效的å”定å”商訊æ¯" -# utils/init/miscinit.c:792 utils/misc/guc.c:5074 -#: fe-lobj.c:575 +# libpq/pqformat.c:671 +#: fe-connect.c:3648 fe-connect.c:3702 #, c-format -msgid "could not read from file \"%s\": %s\n" -msgstr "ç„¡æ³•è®€å–æª”案 \"%s\": %s\n" +msgid "received invalid error message" +msgstr "收到無效的錯誤訊æ¯" -# access/transam/xlog.c:1555 access/transam/xlog.c:1679 -# access/transam/xlog.c:2964 access/transam/xlog.c:3002 commands/copy.c:1117 -# commands/tablespace.c:668 commands/tablespace.c:674 -# postmaster/postmaster.c:3430 utils/init/miscinit.c:832 -# utils/init/miscinit.c:841 utils/misc/guc.c:4934 utils/misc/guc.c:4998 -#: fe-lobj.c:639 fe-lobj.c:663 +# fe-connect.c:1844 +#: fe-connect.c:3865 #, c-format -msgid "could not write to file \"%s\": %s\n" -msgstr "無法寫入檔案 \"%s\": %s\n" +msgid "unexpected message from server during startup" +msgstr "啟動éŽç¨‹ä¸­å¾žè‡ªä¼ºæœå™¨æ”¶åˆ°éžé æœŸè¨Šæ¯" -# fe-lobj.c:601 -#: fe-lobj.c:744 -msgid "query to initialize large object functions did not return data\n" -msgstr "åˆå§‹åŒ–大型物件函å¼çš„æŸ¥è©¢æ²’有傳回資料\n" +# commands/copy.c:905 executor/execMain.c:443 tcop/utility.c:323 +#: fe-connect.c:3956 +#, c-format +msgid "session is read-only" +msgstr "工作階段是唯讀模å¼" -# fe-lobj.c:639 -#: fe-lobj.c:785 -msgid "cannot determine OID of function lo_open\n" -msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lo_open çš„ OID\n" +# commands/copy.c:905 executor/execMain.c:443 tcop/utility.c:323 +#: fe-connect.c:3958 +#, c-format +msgid "session is not read-only" +msgstr "å·¥ä½œéšŽæ®µä¸æ˜¯å”¯è®€æ¨¡å¼" -# fe-lobj.c:646 -#: fe-lobj.c:792 -msgid "cannot determine OID of function lo_close\n" -msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lo_close çš„ OID\n" +#: fe-connect.c:4011 +#, c-format +msgid "server is in hot standby mode" +msgstr "伺æœå™¨è™•æ–¼ç†±å‚™æ´æ¨¡å¼" -# fe-lobj.c:653 -#: fe-lobj.c:799 -msgid "cannot determine OID of function lo_creat\n" -msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lo_creat çš„ OID\n" +#: fe-connect.c:4013 +#, c-format +msgid "server is not in hot standby mode" +msgstr "伺æœå™¨æœªè™•æ–¼ç†±å‚™æ´æ¨¡å¼" -# fe-lobj.c:660 -#: fe-lobj.c:806 -msgid "cannot determine OID of function lo_unlink\n" -msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lo_unlink çš„ OID\n" +#: fe-connect.c:4129 fe-connect.c:4179 +#, c-format +msgid "\"%s\" failed" +msgstr "\"%s\"失敗" -# fe-lobj.c:667 -#: fe-lobj.c:813 -msgid "cannot determine OID of function lo_lseek\n" -msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lo_lseek çš„ OID\n" +# fe-connect.c:1914 +#: fe-connect.c:4193 +#, c-format +msgid "invalid connection state %d, probably indicative of memory corruption" +msgstr "無效的連線狀態 %d,å¯èƒ½æŒ‡ç¤ºè¨˜æ†¶é«”æå£ž" -# fe-lobj.c:674 -#: fe-lobj.c:820 -msgid "cannot determine OID of function lo_tell\n" -msgstr "ç„¡æ³•åˆ¤æ–·æ‡½å¼ lo_tell çš„ OID\n" +#: fe-connect.c:5174 +#, c-format +msgid "invalid LDAP URL \"%s\": scheme must be ldap://" +msgstr "無效的LDAP URL \"%s\": scheme必須是 ldap://" -# fe-lobj.c:681 -#: fe-lobj.c:827 -msgid "cannot determine OID of function loread\n" -msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ loread çš„ OID\n" +#: fe-connect.c:5189 +#, c-format +msgid "invalid LDAP URL \"%s\": missing distinguished name" +msgstr "無效的LDAP URL \"%s\": 缺少識別å稱" -# fe-lobj.c:688 -#: fe-lobj.c:834 -msgid "cannot determine OID of function lowrite\n" -msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lowrite çš„ OID\n" +#: fe-connect.c:5201 fe-connect.c:5259 +#, c-format +msgid "invalid LDAP URL \"%s\": must have exactly one attribute" +msgstr "無效的LDAP URL \"%s\": åªèƒ½æœ‰ä¸€å€‹å±¬æ€§" -# fe-misc.c:228 -#: fe-misc.c:270 +#: fe-connect.c:5213 fe-connect.c:5275 #, c-format -msgid "integer of size %lu not supported by pqGetInt" -msgstr "pgGetInt 䏿”¯æ´å¤§å°ç‚º %lu 的整數 " +msgid "invalid LDAP URL \"%s\": must have search scope (base/one/sub)" +msgstr "無效的LDAP URL \"%s\": 必須有æœå°‹ç¯„åœ(base/one/sub)" -# fe-misc.c:264 -#: fe-misc.c:306 +#: fe-connect.c:5225 #, c-format -msgid "integer of size %lu not supported by pqPutInt" -msgstr "pgPutInt 䏿”¯æ´å¤§å°ç‚º %lu 的整數" +msgid "invalid LDAP URL \"%s\": no filter" +msgstr "無效的LDAP URL \"%s\": æ²’æœ‰éŽæ¿¾æ¢ä»¶" -# fe-misc.c:544 -# fe-misc.c:748 -#: fe-misc.c:586 fe-misc.c:788 -msgid "connection not open\n" -msgstr "連線未開啟\n" +#: fe-connect.c:5247 +#, c-format +msgid "invalid LDAP URL \"%s\": invalid port number" +msgstr "無效的LDAP URL \"%s\": 連接埠無效" -# fe-misc.c:610 -# fe-misc.c:701 -#: fe-misc.c:651 fe-misc.c:741 +# fe-secure.c:932 +#: fe-connect.c:5284 #, c-format -msgid "could not receive data from server: %s\n" -msgstr "無法從伺æœå™¨æŽ¥æ”¶è³‡æ–™: %s\n" +msgid "could not create LDAP structure" +msgstr "無法建立LDAPçµæ§‹" + +#: fe-connect.c:5359 +#, c-format +msgid "lookup on LDAP server failed: %s" +msgstr "在LDAP伺æœå™¨ä¸ŠæŸ¥æ‰¾å¤±æ•—: %s" + +#: fe-connect.c:5369 +#, c-format +msgid "more than one entry found on LDAP lookup" +msgstr "LDAP 查找時找到多個項目" + +#: fe-connect.c:5371 fe-connect.c:5382 +#, c-format +msgid "no entry found on LDAP lookup" +msgstr "LDAP 查找時找ä¸åˆ°é …ç›®" + +#: fe-connect.c:5392 fe-connect.c:5404 +#, c-format +msgid "attribute has no values on LDAP lookup" +msgstr "LDAP 查找時屬性沒有值" + +# fe-connect.c:2592 +#: fe-connect.c:5455 fe-connect.c:5474 fe-connect.c:5998 +#, c-format +msgid "missing \"=\" after \"%s\" in connection info string" +msgstr "連線字串裡的 \"%s\" 後é¢ç¼ºå°‘ \"=\"" + +# fe-connect.c:2675 +#: fe-connect.c:5545 fe-connect.c:6181 fe-connect.c:6979 +#, c-format +msgid "invalid connection option \"%s\"" +msgstr "無效的連線é¸é … \"%s\"" + +# fe-connect.c:2641 +#: fe-connect.c:5560 fe-connect.c:6046 +#, c-format +msgid "unterminated quoted string in connection info string" +msgstr "é€£æŽ¥å­—ä¸²ä¸­çš„å¼•è™ŸæœªçµæŸ" + +#: fe-connect.c:5640 +#, c-format +msgid "definition of service \"%s\" not found" +msgstr "找ä¸åˆ°æœå‹™ \"%s\" 的定義" + +#: fe-connect.c:5666 +#, c-format +msgid "service file \"%s\" not found" +msgstr "找ä¸åˆ°æœå‹™æª” \"%s\"" + +#: fe-connect.c:5679 +#, c-format +msgid "line %d too long in service file \"%s\"" +msgstr "æœå‹™æª” \"%2$s\" 第 %1$d 行太長" + +# guc-file.l:267 +#: fe-connect.c:5750 fe-connect.c:5793 +#, c-format +msgid "syntax error in service file \"%s\", line %d" +msgstr "æœå‹™æª” \"%s\" 第 %d 行語法錯誤" + +# guc-file.l:267 +#: fe-connect.c:5761 +#, c-format +msgid "nested service specifications not supported in service file \"%s\", line %d" +msgstr "æœå‹™æª” \"%s\" 第 %d è¡Œä¸æ”¯æ´å·¢ç‹€æœå‹™è¦æ ¼" + +#: fe-connect.c:6500 +#, c-format +msgid "invalid URI propagated to internal parser routine: \"%s\"" +msgstr "無效的 URI 被傳到內部解æžå™¨routine: \"%s\"" + +#: fe-connect.c:6577 +#, c-format +msgid "end of string reached when looking for matching \"]\" in IPv6 host address in URI: \"%s\"" +msgstr "尋找 URI 中 IPv6 主機ä½å€çš„å°æ‡‰ \"]\" 時到é”字串çµå°¾: \"%s\"" + +#: fe-connect.c:6584 +#, c-format +msgid "IPv6 host address may not be empty in URI: \"%s\"" +msgstr "URI 中 IPv6 主機ä½å€ä¸å¾—為空: \"%s\"" + +#: fe-connect.c:6599 +#, c-format +msgid "unexpected character \"%c\" at position %d in URI (expected \":\" or \"/\"): \"%s\"" +msgstr "URI çš„ä½ç½® %2$d 發ç¾éžé æœŸå­—å…ƒ \"%1$c\"(é æœŸç‚º \":\" 或 \"/\"): \"%3$s\"" + +#: fe-connect.c:6728 +#, c-format +msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "URI æŸ¥è©¢åƒæ•¸æœ‰å¤šé¤˜çš„éµ/值分隔符號 \"=\": \"%s\"" + +#: fe-connect.c:6748 +#, c-format +msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" +msgstr "URI æŸ¥è©¢åƒæ•¸ç¼ºå°‘éµ/值分隔符號 \"=\": \"%s\"" + +# utils/misc/guc.c:3792 +#: fe-connect.c:6800 +#, c-format +msgid "invalid URI query parameter: \"%s\"" +msgstr "無效的 URI æŸ¥è©¢åƒæ•¸: \"%s\"" + +# utils/mb/mbutils.c:326 +#: fe-connect.c:6874 +#, c-format +msgid "invalid percent-encoded token: \"%s\"" +msgstr "無效的百分比編碼標記: \"%s\"" + +#: fe-connect.c:6884 +#, c-format +msgid "forbidden value %%00 in percent-encoded value: \"%s\"" +msgstr "ç™¾åˆ†æ¯”ç·¨ç¢¼å€¼ä¸­ç¦æ­¢ä½¿ç”¨ %%00: \"%s\"" + +# fe-connect.c:2897 +#: fe-connect.c:7248 +msgid "connection pointer is NULL\n" +msgstr "連線指標是 NULL\n" + +# fe-connect.c:1414 +# fe-connect.c:2544 +# fe-connect.c:2553 +# fe-connect.c:3132 +# fe-lobj.c:556 +# fe-protocol2.c:1007 +# fe-protocol3.c:958 +#: fe-connect.c:7256 fe-exec.c:710 fe-exec.c:970 fe-exec.c:3292 +#: fe-protocol3.c:974 fe-protocol3.c:1007 +msgid "out of memory\n" +msgstr "記憶體ä¸è¶³\n" + +#: fe-connect.c:7547 +#, c-format +msgid "WARNING: password file \"%s\" is not a plain file\n" +msgstr "警告: 密碼檔 \"%s\" 䏿˜¯ç´”文字檔\n" + +# fe-connect.c:3154 +#: fe-connect.c:7556 +#, c-format +msgid "WARNING: password file \"%s\" has group or world access; permissions should be u=rw (0600) or less\n" +msgstr "警告: 密碼檔 \"%s\" æœ‰ç¾¤çµ„æˆ–å…¨åŸŸå­˜å–æ¬Šé™ï¼Œæ¬Šé™æ‡‰ç‚º u=rw (0600) 或更低的權é™\n" + +# utils/init/miscinit.c:792 utils/misc/guc.c:5074 +#: fe-connect.c:7663 +#, c-format +msgid "password retrieved from file \"%s\"" +msgstr "從檔案 \"%s\" å–得密碼" + +# fe-exec.c:1922 +#: fe-exec.c:466 fe-exec.c:3366 +#, c-format +msgid "row number %d is out of range 0..%d" +msgstr "列號 %d è¶…å‡ºç¯„åœ 0..%d" + +# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770 +# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285 +#: fe-exec.c:528 fe-protocol3.c:1976 +#, c-format +msgid "%s" +msgstr "%s" + +#: fe-exec.c:831 +#, c-format +msgid "write to server failed" +msgstr "寫入伺æœå™¨å¤±æ•—" + +# storage/buffer/localbuf.c:103 +#: fe-exec.c:869 +#, c-format +msgid "no error text available" +msgstr "無錯誤文字å¯ç”¨" + +# fe-exec.c:484 +#: fe-exec.c:958 +msgid "NOTICE" +msgstr "注æ„" + +#: fe-exec.c:1016 +msgid "PGresult cannot support more than INT_MAX tuples" +msgstr "PGresult ä¸èƒ½æ”¯æ´è¶…éŽ INT_MAX 個 tuple" + +#: fe-exec.c:1028 +msgid "size_t overflow" +msgstr "size_t 溢ä½" + +# fe-exec.c:653 +# fe-exec.c:705 +# fe-exec.c:745 +#: fe-exec.c:1444 fe-exec.c:1513 fe-exec.c:1559 +#, c-format +msgid "command string is a null pointer" +msgstr "命令字串是空指標" + +# translator: %s is a SQL statement name +# executor/functions.c:124 executor/spi.c:1396 +#: fe-exec.c:1450 fe-exec.c:2888 +#, c-format +msgid "%s not allowed in pipeline mode" +msgstr "ç®¡é“æ¨¡å¼ä¸å…許 %s" + +# utils/adt/timestamp.c:882 +#: fe-exec.c:1518 fe-exec.c:1564 fe-exec.c:1658 +#, c-format +msgid "number of parameters must be between 0 and %d" +msgstr "åƒæ•¸æ•¸é‡å¿…須在 0 å’Œ %d 之間" + +# fe-exec.c:738 +# fe-exec.c:828 +#: fe-exec.c:1554 fe-exec.c:1653 +#, c-format +msgid "statement name is a null pointer" +msgstr "陳述å¼å稱是空指標" + +# fe-exec.c:859 +#: fe-exec.c:1695 fe-exec.c:3220 +#, c-format +msgid "no connection to the server" +msgstr "未連接到伺æœå™¨" + +# fe-exec.c:866 +#: fe-exec.c:1703 fe-exec.c:3228 +#, c-format +msgid "another command is already in progress" +msgstr "å¦ä¸€å€‹å‘½ä»¤æ­£åœ¨åŸ·è¡Œä¸­" + +#: fe-exec.c:1733 +#, c-format +msgid "cannot queue commands during COPY" +msgstr "COPY éŽç¨‹ä¸­ç„¡æ³•排隊等候命令" + +#: fe-exec.c:1850 +#, c-format +msgid "length must be given for binary parameter" +msgstr "å¿…é ˆæä¾›é•·åº¦çµ¦binaryåƒæ•¸" + +# fe-exec.c:1204 +#: fe-exec.c:2171 +#, c-format +msgid "unexpected asyncStatus: %d" +msgstr "éžé æœŸçš„ asyncStatus: %d" + +#: fe-exec.c:2327 +#, c-format +msgid "synchronous command execution functions are not allowed in pipeline mode" +msgstr "ç®¡é“æ¨¡å¼ä¸­ä¸å…è¨±åŒæ­¥å‘½ä»¤åŸ·è¡Œå‡½æ•¸" + +# fe-exec.c:1331 +#: fe-exec.c:2344 +msgid "COPY terminated by new PQexec" +msgstr "COPY 被新的 PQexec 終止" + +# fe-protocol3.c:1000 +#: fe-exec.c:2360 +#, c-format +msgid "PQexec not allowed during COPY BOTH" +msgstr "COPY BOTH éŽç¨‹ä¸­ä¸å…許 PQexec" + +# fe-exec.c:1469 +# fe-exec.c:1534 +# fe-exec.c:1619 +# fe-protocol2.c:1153 +# fe-protocol3.c:1115 +#: fe-exec.c:2586 fe-exec.c:2641 fe-exec.c:2709 fe-protocol3.c:1907 +#, c-format +msgid "no COPY in progress" +msgstr "沒有進行中的 COPY" + +# fe-exec.c:1811 +#: fe-exec.c:2895 +#, c-format +msgid "connection in wrong state" +msgstr "連線處於錯誤狀態" + +# fe-lobj.c:674 +#: fe-exec.c:2938 +#, c-format +msgid "cannot enter pipeline mode, connection not idle" +msgstr "ç„¡æ³•é€²å…¥ç®¡é“æ¨¡å¼ï¼Œé€£ç·šæœªè™•於閒置狀態" + +#: fe-exec.c:2974 fe-exec.c:2995 +#, c-format +msgid "cannot exit pipeline mode with uncollected results" +msgstr "ç„¡æ³•é€€å‡ºç®¡é“æ¨¡å¼ï¼Œå°šæœ‰æœªæ”¶é›†çš„çµæžœ" + +#: fe-exec.c:2978 +#, c-format +msgid "cannot exit pipeline mode while busy" +msgstr "å¿™ç¢Œæ™‚ç„¡æ³•é€€å‡ºç®¡é“æ¨¡å¼" + +#: fe-exec.c:2989 +#, c-format +msgid "cannot exit pipeline mode while in COPY" +msgstr "進行 COPY æ™‚ç„¡æ³•é€€å‡ºç®¡é“æ¨¡å¼" + +#: fe-exec.c:3154 +#, c-format +msgid "cannot send pipeline when not in pipeline mode" +msgstr "ä¸åœ¨ç®¡é“模å¼ä¸‹ç„¡æ³•傳é€ç®¡é“" + +# fe-exec.c:1842 +#: fe-exec.c:3255 +msgid "invalid ExecStatusType code" +msgstr "無效的 ExecStatusType 碼" + +# utils/adt/float.c:1508 utils/adt/float.c:1538 +#: fe-exec.c:3282 +msgid "PGresult is not an error result\n" +msgstr "PGresult 䏿˜¯éŒ¯èª¤çµæžœ\n" + +# fe-exec.c:1906 +# fe-exec.c:1929 +#: fe-exec.c:3350 fe-exec.c:3373 +#, c-format +msgid "column number %d is out of range 0..%d" +msgstr "欄號 %d è¶…å‡ºç¯„åœ 0..%d" + +# fe-exec.c:1922 +#: fe-exec.c:3388 +#, c-format +msgid "parameter number %d is out of range 0..%d" +msgstr "åƒæ•¸ç·¨è™Ÿ %d è¶…å‡ºç¯„åœ 0..%d" + +# fe-exec.c:2204 +#: fe-exec.c:3699 +#, c-format +msgid "could not interpret result from server: %s" +msgstr "無法解釋來自伺æœå™¨çš„çµæžœ: %s" + +# postmaster/postmaster.c:1256 postmaster/postmaster.c:1287 +#: fe-exec.c:3964 fe-exec.c:4054 +#, c-format +msgid "incomplete multibyte character" +msgstr "ä¸å®Œæ•´çš„多ä½å…ƒçµ„å­—å…ƒ" + +#: fe-gssapi-common.c:122 +msgid "GSSAPI name import error" +msgstr "GSSAPI å稱匯入錯誤" + +# fe-lobj.c:646 +#: fe-lobj.c:144 fe-lobj.c:207 fe-lobj.c:397 fe-lobj.c:487 fe-lobj.c:560 +#: fe-lobj.c:956 fe-lobj.c:963 fe-lobj.c:970 fe-lobj.c:977 fe-lobj.c:984 +#: fe-lobj.c:991 fe-lobj.c:998 fe-lobj.c:1005 +#, c-format +msgid "cannot determine OID of function %s" +msgstr "無法確定函數 %s çš„ OID" + +#: fe-lobj.c:160 +#, c-format +msgid "argument of lo_truncate exceeds integer range" +msgstr "lo_truncate çš„åƒæ•¸è¶…出整數範åœ" + +#: fe-lobj.c:262 +#, c-format +msgid "argument of lo_read exceeds integer range" +msgstr "lo_read çš„åƒæ•¸è¶…出整數範åœ" + +#: fe-lobj.c:313 +#, c-format +msgid "argument of lo_write exceeds integer range" +msgstr "lo_write çš„åƒæ•¸è¶…出整數範åœ" + +# fe-lobj.c:410 +# fe-lobj.c:495 +#: fe-lobj.c:669 fe-lobj.c:780 +#, c-format +msgid "could not open file \"%s\": %s" +msgstr "無法開啟檔案 \"%s\":%s" + +# utils/init/miscinit.c:792 utils/misc/guc.c:5074 +#: fe-lobj.c:725 +#, c-format +msgid "could not read from file \"%s\": %s" +msgstr "無法從檔案 %s 讀å–: %s" + +# access/transam/xlog.c:1555 access/transam/xlog.c:1679 +# access/transam/xlog.c:2964 access/transam/xlog.c:3002 commands/copy.c:1117 +# commands/tablespace.c:668 commands/tablespace.c:674 +# postmaster/postmaster.c:3430 utils/init/miscinit.c:832 +# utils/init/miscinit.c:841 utils/misc/guc.c:4934 utils/misc/guc.c:4998 +#: fe-lobj.c:801 fe-lobj.c:824 +#, c-format +msgid "could not write to file \"%s\": %s" +msgstr "無法寫入檔案 \"%s\": %s" + +# fe-lobj.c:601 +#: fe-lobj.c:908 +#, c-format +msgid "query to initialize large object functions did not return data" +msgstr "åˆå§‹åŒ–大物件函數的查詢沒有回傳資料" + +# fe-misc.c:228 +#: fe-misc.c:240 +#, c-format +msgid "integer of size %lu not supported by pqGetInt" +msgstr "pqGetInt 䏿”¯æ´å¤§å°ç‚º %lu 的整數" + +# fe-misc.c:264 +#: fe-misc.c:273 +#, c-format +msgid "integer of size %lu not supported by pqPutInt" +msgstr "pqPutInt 䏿”¯æ´å¤§å°ç‚º %lu 的整數" + +# fe-misc.c:544 +# fe-misc.c:748 +#: fe-misc.c:573 +#, c-format +msgid "connection not open" +msgstr "連線未開啟" # fe-misc.c:718 # fe-misc.c:786 -#: fe-misc.c:758 fe-misc.c:836 +#: fe-misc.c:751 fe-secure-openssl.c:215 fe-secure-openssl.c:315 +#: fe-secure.c:257 fe-secure.c:419 +#, c-format msgid "" "server closed the connection unexpectedly\n" "\tThis probably means the server terminated abnormally\n" -"\tbefore or while processing the request.\n" +"\tbefore or while processing the request." msgstr "" -"伺æœå™¨æ„外地中斷了連線\n" -"\tå¯èƒ½æ˜¯ä¼ºæœå™¨åœ¨è™•ç†è«‹æ±‚之å‰\n" -"\t或者正在處ç†è«‹æ±‚çš„æ™‚å€™ä¸æ­£å¸¸ä¸­æ­¢\n" +"伺æœå™¨æ„外關閉連線\n" +"\t這å¯èƒ½è¡¨ç¤ºä¼ºæœå™¨åœ¨è™•ç†è«‹æ±‚之剿ˆ–期間異常中止。" + +# fe-misc.c:544 +# fe-misc.c:748 +#: fe-misc.c:818 +msgid "connection not open\n" +msgstr "連線未開啟\n" + +# fe-misc.c:923 +#: fe-misc.c:1003 +#, c-format +msgid "timeout expired" +msgstr "é€¾æ™‚éŽæœŸ" + +# utils/adt/encode.c:307 +#: fe-misc.c:1047 +#, c-format +msgid "invalid socket" +msgstr "無效的 socket" + +# fe-misc.c:991 +#: fe-misc.c:1069 +#, c-format +msgid "%s() failed: %s" +msgstr "%s() 失敗: %s" + +# fe-protocol2.c:423 +# fe-protocol3.c:183 +#: fe-protocol3.c:182 +#, c-format +msgid "message type 0x%02x arrived from server while idle" +msgstr "閒置時收到伺æœå™¨é€ä¾†é¡žåž‹ç‚º 0x%02x 的訊æ¯" + +# fe-protocol2.c:517 +#: fe-protocol3.c:385 +#, c-format +msgid "server sent data (\"D\" message) without prior row description (\"T\" message)" +msgstr "伺æœå™¨åœ¨å…ˆå‰æœªå‚³é€åˆ—æè¿°(\"T\" 訊æ¯)的情æ³ä¸‹å‚³é€è³‡æ–™(\"D\" 訊æ¯)" + +# fe-protocol2.c:548 +# fe-protocol3.c:344 +#: fe-protocol3.c:427 +#, c-format +msgid "unexpected response from server; first received character was \"%c\"" +msgstr "éžé æœŸçš„伺æœå™¨å›žæ‡‰ï¼Œç¬¬ä¸€å€‹æ”¶åˆ°çš„字元是 \"%c\"" + +# fe-protocol3.c:365 +#: fe-protocol3.c:450 +#, c-format +msgid "message contents do not agree with length in message type \"%c\"" +msgstr "訊æ¯å…§å®¹èˆ‡è¨Šæ¯é¡žåž‹ \"%c\" 中的長度ä¸ä¸€è‡´" + +# fe-protocol3.c:386 +#: fe-protocol3.c:468 +#, c-format +msgid "lost synchronization with server: got message type \"%c\", length %d" +msgstr "與伺æœå™¨å¤±åŽ»åŒæ­¥: 收到訊æ¯é¡žåž‹ \"%c\",長度 %d" + +# libpq/pqformat.c:591 libpq/pqformat.c:609 libpq/pqformat.c:630 +# utils/adt/arrayfuncs.c:1277 utils/adt/rowtypes.c:523 +#: fe-protocol3.c:520 fe-protocol3.c:560 +msgid "insufficient data in \"T\" message" +msgstr "\"T\" 訊æ¯ä¸­çš„資料ä¸è¶³" + +# fe-protocol2.c:760 +# fe-protocol3.c:577 +#: fe-protocol3.c:631 fe-protocol3.c:837 +msgid "out of memory for query result" +msgstr "æŸ¥è©¢çµæžœè¨˜æ†¶é«”ä¸è¶³" + +# libpq/pqformat.c:591 libpq/pqformat.c:609 libpq/pqformat.c:630 +# utils/adt/arrayfuncs.c:1277 utils/adt/rowtypes.c:523 +#: fe-protocol3.c:700 +msgid "insufficient data in \"t\" message" +msgstr "\"t\" 訊æ¯ä¸­çš„資料ä¸è¶³" + +# libpq/pqformat.c:591 libpq/pqformat.c:609 libpq/pqformat.c:630 +# utils/adt/arrayfuncs.c:1277 utils/adt/rowtypes.c:523 +#: fe-protocol3.c:759 fe-protocol3.c:791 fe-protocol3.c:809 +msgid "insufficient data in \"D\" message" +msgstr "\"D\" 訊æ¯ä¸­çš„資料ä¸è¶³" + +# fe-protocol3.c:522 +#: fe-protocol3.c:765 +msgid "unexpected field count in \"D\" message" +msgstr "\"D\" 訊æ¯çš„æ¬„使•¸èˆ‡é æœŸä¸åŒ" + +#: fe-protocol3.c:1020 +msgid "no error message available\n" +msgstr "無法æä¾›éŒ¯èª¤è¨Šæ¯\n" + +# translator: %s represents a digit string +# fe-protocol3.c:651 +# fe-protocol3.c:659 +#. translator: %s represents a digit string +#: fe-protocol3.c:1068 fe-protocol3.c:1087 +#, c-format +msgid " at character %s" +msgstr " 於字元 %s" + +# fe-protocol3.c:668 +#: fe-protocol3.c:1100 +#, c-format +msgid "DETAIL: %s\n" +msgstr "詳細資料: %s\n" + +# fe-protocol3.c:671 +#: fe-protocol3.c:1103 +#, c-format +msgid "HINT: %s\n" +msgstr "æç¤º: %s\n" + +# fe-protocol3.c:674 +#: fe-protocol3.c:1106 +#, c-format +msgid "QUERY: %s\n" +msgstr "查詢: %s\n" + +# fe-protocol3.c:677 +#: fe-protocol3.c:1113 +#, c-format +msgid "CONTEXT: %s\n" +msgstr "CONTEXT: %s\n" + +# fe-protocol3.c:677 +#: fe-protocol3.c:1122 +#, c-format +#| msgid "CONTEXT: %s\n" +msgid "SCHEMA NAME: %s\n" +msgstr "SCHEMA å稱: %s\n" + +# utils/error/elog.c:1555 +#: fe-protocol3.c:1126 +#, c-format +#| msgid "STATEMENT: %s" +msgid "TABLE NAME: %s\n" +msgstr "資料表å稱: %s\n" + +# fe-protocol3.c:677 +#: fe-protocol3.c:1130 +#, c-format +msgid "COLUMN NAME: %s\n" +msgstr "欄ä½å稱: %s\n" + +# utils/error/elog.c:1555 +#: fe-protocol3.c:1134 +#, c-format +msgid "DATATYPE NAME: %s\n" +msgstr "資料型別å稱: %s\n" + +# fe-protocol3.c:677 +#: fe-protocol3.c:1138 +#, c-format +msgid "CONSTRAINT NAME: %s\n" +msgstr "ç´„æŸå稱: %s\n" + +# fe-protocol3.c:689 +#: fe-protocol3.c:1150 +msgid "LOCATION: " +msgstr "ä½ç½®: " + +# fe-protocol3.c:691 +#: fe-protocol3.c:1152 +#, c-format +msgid "%s, " +msgstr "%s, " + +# fe-protocol3.c:693 +#: fe-protocol3.c:1154 +#, c-format +msgid "%s:%s" +msgstr "%s:%s" + +#: fe-protocol3.c:1349 +#, c-format +msgid "LINE %d: " +msgstr "行 %d: " + +# postmaster/postmaster.c:1349 +#: fe-protocol3.c:1423 +#, c-format +msgid "protocol version not supported by server: client uses %u.%u, server supports up to %u.%u" +msgstr "伺æœå™¨ä¸æ”¯æ´çš„通訊å”定版本: 客戶端使用 %u.%u,伺æœå™¨æ”¯æ´æœ€é«˜åˆ° %u.%u" + +# catalog/pg_proc.c:487 +#: fe-protocol3.c:1429 +#, c-format +msgid "protocol extension not supported by server: %s" +msgid_plural "protocol extensions not supported by server: %s" +msgstr[0] "伺æœå™¨ä¸æ”¯æ´çš„通訊å”定擴展: %s" + +# libpq/pqformat.c:671 +#: fe-protocol3.c:1437 +#, c-format +msgid "invalid %s message" +msgstr "無效的 %s 訊æ¯" + +# fe-protocol3.c:1000 +#: fe-protocol3.c:1802 +#, c-format +msgid "PQgetline: not doing text COPY OUT" +msgstr "PQgetline: ä¸åŸ·è¡Œæ–‡å­— COPY OUT" + +#: fe-protocol3.c:2176 +#, c-format +msgid "protocol error: no function result" +msgstr "通訊å”定錯誤: ç„¡å‡½æ•¸çµæžœ" + +# fe-protocol2.c:1343 +# fe-protocol2.c:1375 +# fe-protocol3.c:1387 +#: fe-protocol3.c:2187 +#, c-format +msgid "protocol error: id=0x%x" +msgstr "通訊å”定錯誤: ID=0x%x" + +#: fe-secure-common.c:123 +#, c-format +msgid "SSL certificate's name contains embedded null" +msgstr "SSL 憑證的å稱包å«åµŒå…¥çš„空字符" + +#: fe-secure-common.c:228 +#, c-format +msgid "certificate contains IP address with invalid length %zu" +msgstr "憑證包å«å…·æœ‰ç„¡æ•ˆé•·åº¦ %zu çš„IPä½å€" + +# libpq/be-secure.c:659 +#: fe-secure-common.c:237 +#, c-format +msgid "could not convert certificate's IP address to string: %s" +msgstr "無法將憑證的IPä½å€è½‰æˆå­—串: %s" + +# commands/aggregatecmds.c:111 +#: fe-secure-common.c:269 +#, c-format +msgid "host name must be specified for a verified SSL connection" +msgstr "必須為已驗證的SSL連線指定主機å稱" + +# fe-secure.c:580 +#: fe-secure-common.c:286 +#, c-format +msgid "server certificate for \"%s\" (and %d other name) does not match host name \"%s\"" +msgid_plural "server certificate for \"%s\" (and %d other names) does not match host name \"%s\"" +msgstr[0] "伺æœå™¨æ†‘證的å稱 \"%s\"(以åŠå…¶ä»– %d 個å稱)與主機å稱 \"%s\" ä¸ä¸€è‡´" + +# fe-secure.c:580 +#: fe-secure-common.c:294 +#, c-format +msgid "server certificate for \"%s\" does not match host name \"%s\"" +msgstr "伺æœå™¨æ†‘證的å稱 \"%s\" 與主機å稱 \"%s\" ä¸ä¸€è‡´" + +# fe-misc.c:610 +# fe-misc.c:701 +#: fe-secure-common.c:299 +#, c-format +msgid "could not get server's host name from server certificate" +msgstr "無法從伺æœå™¨æ†‘è­‰å–得伺æœå™¨çš„主機å稱" + +#: fe-secure-gssapi.c:201 +msgid "GSSAPI wrap error" +msgstr "GSSAPI å°è£éŒ¯èª¤" + +#: fe-secure-gssapi.c:208 +#, c-format +msgid "outgoing GSSAPI message would not use confidentiality" +msgstr "傳出的 GSSAPI 訊æ¯å°‡ä¸ä½¿ç”¨æ©Ÿå¯†æ€§" + +#: fe-secure-gssapi.c:215 +#, c-format +msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" +msgstr "客戶端嘗試發é€éŽå¤§çš„ GSSAPI å°åŒ…(%zu > %zu)" + +#: fe-secure-gssapi.c:351 fe-secure-gssapi.c:593 +#, c-format +msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" +msgstr "伺æœå™¨ç™¼é€çš„ GSSAPI å°åŒ…éŽå¤§(%zu > %zu)" + +#: fe-secure-gssapi.c:390 +msgid "GSSAPI unwrap error" +msgstr "GSSAPI è§£å°éŒ¯èª¤" + +#: fe-secure-gssapi.c:399 +#, c-format +msgid "incoming GSSAPI message did not use confidentiality" +msgstr "傳入的 GSSAPI è¨Šæ¯æœªä½¿ç”¨æ©Ÿå¯†æ€§" + +# libpq/be-secure.c:649 +#: fe-secure-gssapi.c:656 +msgid "could not initiate GSSAPI security context" +msgstr "無法åˆå§‹åŒ– SSPI 安全性 context" + +#: fe-secure-gssapi.c:685 +msgid "GSSAPI size check error" +msgstr "GSSAPI 大尿ª¢æŸ¥éŒ¯èª¤" + +#: fe-secure-gssapi.c:696 +msgid "GSSAPI context establishment error" +msgstr "GSSAPI 建立 context 錯誤" + +# fe-secure.c:330 +# fe-secure.c:415 +# fe-secure.c:1038 +#: fe-secure-openssl.c:219 fe-secure-openssl.c:319 fe-secure-openssl.c:1531 +#, c-format +msgid "SSL SYSCALL error: %s" +msgstr "SSL SYSCALL 錯誤: %s" + +# libpq/be-secure.c:286 libpq/be-secure.c:379 +#: fe-secure-openssl.c:225 fe-secure-openssl.c:325 fe-secure-openssl.c:1534 +#, c-format +msgid "SSL SYSCALL error: EOF detected" +msgstr "SSL SYSCALL 錯誤: 嵿¸¬åˆ° EOF" + +# libpq/be-secure.c:294 libpq/be-secure.c:387 +#: fe-secure-openssl.c:235 fe-secure-openssl.c:335 fe-secure-openssl.c:1542 +#, c-format +msgid "SSL error: %s" +msgstr "SSL 錯誤: %s" + +#: fe-secure-openssl.c:249 fe-secure-openssl.c:349 +#, c-format +msgid "SSL connection has been closed unexpectedly" +msgstr "SSL 連線æ„外關閉" + +# libpq/be-secure.c:303 libpq/be-secure.c:396 +#: fe-secure-openssl.c:254 fe-secure-openssl.c:354 fe-secure-openssl.c:1589 +#, c-format +msgid "unrecognized SSL error code: %d" +msgstr "無法識別的 SSL 錯誤碼: %d" + +# libpq/be-secure.c:659 +#: fe-secure-openssl.c:397 +#, c-format +msgid "could not determine server certificate signature algorithm" +msgstr "無法確定伺æœå™¨æ†‘è­‰çš„ç°½åæ¼”算法" + +#: fe-secure-openssl.c:417 +#, c-format +msgid "could not find digest for NID %s" +msgstr "找ä¸åˆ° NID %s 的摘è¦" + +# libpq/hba.c:1472 libpq/hba.c:1503 libpq/hba.c:1571 +#: fe-secure-openssl.c:426 +#, c-format +msgid "could not generate peer certificate hash" +msgstr "無法生æˆå°ç­‰æ†‘證的雜湊值" + +#: fe-secure-openssl.c:509 +#, c-format +msgid "SSL certificate's name entry is missing" +msgstr "SSL 憑證缺少å稱項目" + +#: fe-secure-openssl.c:543 +#, c-format +msgid "SSL certificate's address entry is missing" +msgstr "SSL 憑證缺少ä½å€é …ç›®" + +# libpq/be-secure.c:649 +#: fe-secure-openssl.c:960 +#, c-format +msgid "could not create SSL context: %s" +msgstr "無法建立 SSL context: %s" + +# utils/adt/formatting.c:2044 +#: fe-secure-openssl.c:1002 +#, c-format +msgid "invalid value \"%s\" for minimum SSL protocol version" +msgstr "ç„¡æ•ˆçš„æœ€å° SSL 通訊å”定版本值 \"%s\"" -# fe-misc.c:803 -#: fe-misc.c:853 +# port/win32/security.c:39 +#: fe-secure-openssl.c:1012 #, c-format -msgid "could not send data to server: %s\n" -msgstr "無法å‘伺æœå™¨å‚³é€è³‡æ–™: %s\n" +msgid "could not set minimum SSL protocol version: %s" +msgstr "ç„¡æ³•è¨­å®šæœ€å° SSL 通訊å”定版本: %s" -# fe-misc.c:923 -#: fe-misc.c:972 -msgid "timeout expired\n" -msgstr "發生逾時\n" +# utils/adt/formatting.c:2044 +#: fe-secure-openssl.c:1028 +#, c-format +msgid "invalid value \"%s\" for maximum SSL protocol version" +msgstr "無效的最大 SSL 通訊å”定版本值 \"%s\"" -# fe-misc.c:968 -#: fe-misc.c:1017 -msgid "socket not open\n" -msgstr "socket 未開啟\n" +# port/win32/security.c:39 +#: fe-secure-openssl.c:1038 +#, c-format +msgid "could not set maximum SSL protocol version: %s" +msgstr "無法設定最大 SSL 通訊å”定版本: %s" -# fe-misc.c:991 -#: fe-misc.c:1040 +# libpq/be-secure.c:714 +#: fe-secure-openssl.c:1076 #, c-format -msgid "select() failed: %s\n" -msgstr "select()失敗: %s\n" +msgid "could not load system root certificate paths: %s" +msgstr "無法載入系統根憑證路徑: %s" -# fe-protocol2.c:91 -#: fe-protocol2.c:91 +# fe-secure.c:977 +#: fe-secure-openssl.c:1093 #, c-format -msgid "invalid setenv state %c, probably indicative of memory corruption\n" -msgstr "無效的 setenv 狀態 %c,å¯èƒ½æ˜¯è¨˜æ†¶é«”中的資料被破壞\n" +msgid "could not read root certificate file \"%s\": %s" +msgstr "ç„¡æ³•è®€å–æ ¹æ†‘證檔案 \"%s\": %s" -# fe-protocol2.c:333 -#: fe-protocol2.c:390 +#: fe-secure-openssl.c:1145 #, c-format -msgid "invalid state %c, probably indicative of memory corruption\n" -msgstr "無效的狀態 %c,å¯èƒ½æ˜¯è¨˜æ†¶é«”中的資料被破壞\n" +msgid "" +"could not get home directory to locate root certificate file\n" +"Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." +msgstr "" +"無法å–得家目錄以找到根憑證檔\n" +"å¯ä»¥é¸æ“‡æä¾›æª”案ã€ç”¨ sslrootcert=system 使用系統的信任根憑證,或將 sslmode 改為åœç”¨ä¼ºæœå™¨æ†‘證驗證。" -# fe-protocol2.c:423 -# fe-protocol3.c:183 -#: fe-protocol2.c:479 fe-protocol3.c:186 +#: fe-secure-openssl.c:1148 #, c-format -msgid "message type 0x%02x arrived from server while idle" -msgstr "閒置時收到伺æœå™¨é€ä¾†é¡žåž‹ç‚º 0x%02x 的訊æ¯" +msgid "" +"root certificate file \"%s\" does not exist\n" +"Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification." +msgstr "" +"根憑證檔 \"%s\" ä¸å­˜åœ¨\n" +"å¯ä»¥é¸æ“‡æä¾›æª”案ã€ç”¨ sslrootcert=system 使用系統的信任根憑證,或將 sslmode 改為åœç”¨ä¼ºæœå™¨æ†‘證驗證。" -# fe-protocol2.c:462 -#: fe-protocol2.c:522 +# fe-secure.c:775 +#: fe-secure-openssl.c:1183 #, c-format -msgid "unexpected character %c following empty query response (\"I\" message)" -msgstr "空的查詢回應(\"I\" 訊æ¯)後跟隨éžé æœŸå­—å…ƒ %c" +msgid "could not open certificate file \"%s\": %s" +msgstr "無法開啟憑證檔 \"%s\": %s" -# fe-protocol2.c:517 -#: fe-protocol2.c:576 -msgid "" -"server sent data (\"D\" message) without prior row description (\"T\" " -"message)" -msgstr "伺æœå™¨å‚³é€è³‡æ–™(\"D\" 訊æ¯)而未æä¾›è³‡æ–™è¡Œæè¿°(\"T\" 訊æ¯)" +# fe-secure.c:784 +#: fe-secure-openssl.c:1201 +#, c-format +msgid "could not read certificate file \"%s\": %s" +msgstr "ç„¡æ³•è®€å–æ†‘證檔 \"%s\": %s" -# fe-protocol2.c:533 -#: fe-protocol2.c:592 -msgid "" -"server sent binary data (\"B\" message) without prior row description (\"T\" " -"message)" -msgstr "伺æœå™¨å‚³é€äºŒå…ƒè³‡æ–™(\"B\" 訊æ¯)而未æä¾›è³‡æ–™è¡Œæè¿°(\"T\" 訊æ¯)" +# fe-secure.c:264 +#: fe-secure-openssl.c:1225 +#, c-format +msgid "could not establish SSL connection: %s" +msgstr "無法建立 SSL 連線: %s" -# fe-protocol2.c:548 -# fe-protocol3.c:344 -#: fe-protocol2.c:612 fe-protocol3.c:388 +# libpq/be-secure.c:807 +#: fe-secure-openssl.c:1257 #, c-format -msgid "unexpected response from server; first received character was \"%c\"\n" -msgstr "éžé æœŸçš„伺æœå™¨å›žæ‡‰ï¼Œæ”¶åˆ°çš„第一個字元是 \"%c\"\n" +msgid "could not set SSL Server Name Indication (SNI): %s" +msgstr "無法設定 SSL Server Name Indication (SNI): %s" -# fe-protocol2.c:760 -# fe-protocol3.c:577 -#: fe-protocol2.c:833 fe-protocol3.c:707 -msgid "out of memory for query result\n" -msgstr "æŸ¥è©¢çµæžœç”¨ç›¡è¨˜æ†¶é«”\n" +# fe-lobj.c:410 +# fe-lobj.c:495 +#: fe-secure-openssl.c:1300 +#, c-format +msgid "could not load SSL engine \"%s\": %s" +msgstr "無法載入 SSL 引擎 \"%s\": %s" -# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770 -# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285 -#: fe-protocol2.c:1280 fe-protocol3.c:1637 +# libpq/be-secure.c:789 +#: fe-secure-openssl.c:1311 #, c-format -msgid "%s" -msgstr "%s" +msgid "could not initialize SSL engine \"%s\": %s" +msgstr "無法åˆå§‹åŒ– SSL 引擎 \"%s\": %s" -# fe-protocol2.c:1208 -#: fe-protocol2.c:1292 -msgid "lost synchronization with server, resetting connection" -msgstr "無法與伺æœå™¨å”調,é‡ç½®é€£ç·š" +# fe-secure.c:833 +#: fe-secure-openssl.c:1326 +#, c-format +msgid "could not read private SSL key \"%s\" from engine \"%s\": %s" +msgstr "無法從引擎 \"%2$s\" 讀å–ç§æœ‰ SSL 金鑰 \"%1$s\": %3$s" -# fe-protocol2.c:1343 -# fe-protocol2.c:1375 -# fe-protocol3.c:1387 -#: fe-protocol2.c:1426 fe-protocol2.c:1458 fe-protocol3.c:1840 +# fe-secure.c:833 +#: fe-secure-openssl.c:1339 #, c-format -msgid "protocol error: id=0x%x\n" -msgstr "å”定錯誤: id=0x%x\n" +msgid "could not load private SSL key \"%s\" from engine \"%s\": %s" +msgstr "無法從引擎 \"%2$s\" è¼‰å…¥ç§æœ‰ SSL 金鑰 \"%1$s\": %3$s" -# fe-protocol3.c:306 -#: fe-protocol3.c:344 -msgid "" -"server sent data (\"D\" message) without prior row description (\"T\" " -"message)\n" -msgstr "伺æœå™¨å‚³é€è³‡æ–™(\"D\" 訊æ¯)而未æä¾›è³‡æ–™è¡Œæè¿°(\"T\" 訊æ¯)\n" +# fe-secure.c:798 +#: fe-secure-openssl.c:1376 +#, c-format +msgid "certificate present, but not private key file \"%s\"" +msgstr "憑證存在,但沒有ç§é‘°æª” \"%s\"" -# fe-protocol3.c:365 -#: fe-protocol3.c:409 +# libpq/be-secure.c:666 +#: fe-secure-openssl.c:1379 #, c-format -msgid "message contents do not agree with length in message type \"%c\"\n" -msgstr "訊æ¯é¡žåž‹ \"%c\" 的長度與訊æ¯å…§å®¹ä¸ç¬¦\n" +msgid "could not stat private key file \"%s\": %m" +msgstr "無法å–å¾—ç§é‘°æª” \"%s\" 的狀態: %m" -# fe-protocol3.c:386 -#: fe-protocol3.c:430 +#: fe-secure-openssl.c:1387 #, c-format -msgid "lost synchronization with server: got message type \"%c\", length %d\n" -msgstr "無法與伺æœå™¨å”調: 收到訊æ¯é¡žåž‹ \"%c\",長度 %d\n" +msgid "private key file \"%s\" is not a regular file" +msgstr "ç§é‘°æª” \"%s\" 䏿˜¯ä¸€èˆ¬æª”案" -# fe-protocol3.c:522 -#: fe-protocol3.c:652 -msgid "unexpected field count in \"D\" message\n" -msgstr "\"D\" 訊æ¯çš„æ¬„使•¸ä¸ç¬¦é æœŸ\n" +# fe-connect.c:3154 +#: fe-secure-openssl.c:1420 +#, c-format +msgid "private key file \"%s\" has group or world access; file must have permissions u=rw (0600) or less if owned by the current user, or permissions u=rw,g=r (0640) or less if owned by root" +msgstr "ç§é‘°æª” \"%s\" æœ‰ç¾¤çµ„æˆ–å…¨åŸŸå­˜å–æ¬Šé™ï¼Œå¦‚果檔案由目å‰ä½¿ç”¨è€…æ“æœ‰ï¼Œæ¬Šé™æ‡‰ç‚º u=rw (0600) 或更低的權é™ï¼Œå¦‚果由 root æ“æœ‰ï¼Œæ¬Šé™æ‡‰ç‚º u=rw,g=r (0640) 或更低的權é™" -# translator: %s represents a digit string -# fe-protocol3.c:651 -# fe-protocol3.c:659 -#. translator: %s represents a digit string -#: fe-protocol3.c:798 fe-protocol3.c:817 +# libpq/be-secure.c:689 +#: fe-secure-openssl.c:1444 #, c-format -msgid " at character %s" -msgstr "於字元 %s" +msgid "could not load private key file \"%s\": %s" +msgstr "無法載入ç§é‘°æª”\"%s\": %s" -# fe-protocol3.c:668 -#: fe-protocol3.c:830 +# fe-secure.c:848 +#: fe-secure-openssl.c:1460 #, c-format -msgid "DETAIL: %s\n" -msgstr "詳細資料: %s\n" +msgid "certificate does not match private key file \"%s\": %s" +msgstr "憑證與ç§é‘°æª” \"%s\" ä¸ä¸€è‡´: %s" -# fe-protocol3.c:671 -#: fe-protocol3.c:833 +# libpq/be-secure.c:694 +#: fe-secure-openssl.c:1528 #, c-format -msgid "HINT: %s\n" -msgstr "æç¤º: %s\n" +msgid "SSL error: certificate verify failed: %s" +msgstr "SSL 錯誤: 憑證驗證失敗: %s" -# fe-protocol3.c:674 -#: fe-protocol3.c:836 +#: fe-secure-openssl.c:1573 #, c-format -msgid "QUERY: %s\n" -msgstr "查詢: %s\n" +msgid "This may indicate that the server does not support any SSL protocol version between %s and %s." +msgstr "這å¯èƒ½è¡¨ç¤ºä¼ºæœå™¨ä¸æ”¯æ´ä»‹æ–¼ %s å’Œ %s 之間的任何 SSL å”定版本。" -# fe-protocol3.c:677 -#: fe-protocol3.c:839 +# fe-secure.c:1093 +#: fe-secure-openssl.c:1606 #, c-format -msgid "CONTEXT: %s\n" -msgstr "上下文: %s\n" +msgid "certificate could not be obtained: %s" +msgstr "無法å–得憑證: %s" -# fe-protocol3.c:689 -#: fe-protocol3.c:851 -msgid "LOCATION: " -msgstr "ä½ç½®:" +# libpq/be-secure.c:303 libpq/be-secure.c:396 +#: fe-secure-openssl.c:1711 +#, c-format +msgid "no SSL error reported" +msgstr "未回報 SSL 錯誤" -# fe-protocol3.c:691 -#: fe-protocol3.c:853 +# libpq/be-secure.c:294 libpq/be-secure.c:387 +#: fe-secure-openssl.c:1720 #, c-format -msgid "%s, " -msgstr "%s, " +msgid "SSL error code %lu" +msgstr "SSL 錯誤碼 %lu" -# fe-protocol3.c:693 -#: fe-protocol3.c:855 +#: fe-secure-openssl.c:1986 #, c-format -msgid "%s:%s" -msgstr "%s:%s" +msgid "WARNING: sslpassword truncated\n" +msgstr "警告: sslpassword 被截斷\n" -#: fe-protocol3.c:1079 +# fe-misc.c:610 +# fe-misc.c:701 +#: fe-secure.c:263 #, c-format -msgid "LINE %d: " -msgstr "行 %d:" +msgid "could not receive data from server: %s" +msgstr "無法從伺æœå™¨æŽ¥æ”¶è³‡æ–™: %s" -# fe-protocol3.c:1000 -#: fe-protocol3.c:1465 -msgid "PQgetline: not doing text COPY OUT\n" -msgstr "PQgetline: ä¸é€²è¡Œæ–‡å­— COPY OUT\n" +# fe-misc.c:803 +#: fe-secure.c:434 +#, c-format +msgid "could not send data to server: %s" +msgstr "無法傳é€è³‡æ–™è‡³ä¼ºæœå™¨: %s" -# fe-secure.c:264 -#: fe-secure.c:265 +# libpq/be-secure.c:303 libpq/be-secure.c:396 +#: win32.c:310 #, c-format -msgid "could not establish SSL connection: %s\n" -msgstr "無法建立 SSL 連線: %s\n" +msgid "unrecognized socket error: 0x%08X/%d" +msgstr "無法識別的 socket 錯誤: 0x%08X/%d" + +# fe-exec.c:1339 +#~ msgid "COPY IN state must be terminated first\n" +#~ msgstr "å¿…é ˆå…ˆçµæŸ COPY IN 狀態\n" + +# fe-exec.c:1359 +#~ msgid "COPY OUT state must be terminated first\n" +#~ msgstr "å¿…é ˆå…ˆçµæŸ COPY OUT 狀態\n" + +# fe-auth.c:411 +# fe-auth.c:415 +#, c-format +#~ msgid "Kerberos 5 authentication rejected: %*s\n" +#~ msgstr "kerberos 5 èªè­‰è¢«æ‹’絕: %*s\n" -# fe-secure.c:330 -# fe-secure.c:415 -# fe-secure.c:1038 -#: fe-secure.c:349 fe-secure.c:436 fe-secure.c:1180 #, c-format -msgid "SSL SYSCALL error: %s\n" -msgstr "SSL SYSCALL 錯誤: %s\n" +#~ msgid "PGEventProc \"%s\" failed during PGEVT_CONNRESET event\n" +#~ msgstr "PGEVT_CONNRESET 事件期間 PGEventProc \"%s\" 失敗\n" + +#, c-format +#~ msgid "PGEventProc \"%s\" failed during PGEVT_RESULTCREATE event\n" +#~ msgstr "PGEVT_RESULTCREATE 事件期間 PGEventProc \"%s\" 失敗\n" + +# fe-auth.c:508 +#~ msgid "SCM_CRED authentication method not supported\n" +#~ msgstr "䏿”¯æ´ SCM_CRED é©—è­‰\n" # fe-secure.c:335 # fe-secure.c:420 # fe-secure.c:1042 -#: fe-secure.c:355 fe-secure.c:442 fe-secure.c:1184 -msgid "SSL SYSCALL error: EOF detected\n" -msgstr "SSL SYSCALL 錯誤: 發ç¾EOF\n" +#~ msgid "SSL SYSCALL error: EOF detected\n" +#~ msgstr "SSL SYSCALL 錯誤: 發ç¾EOF\n" + +#~ msgid "SSL certificate's common name contains embedded null\n" +#~ msgstr "SSL 憑證的一般å稱包å«å…§åµŒçš„ Null\n" # fe-secure.c:347 # fe-secure.c:431 # fe-secure.c:1051 -#: fe-secure.c:367 fe-secure.c:453 fe-secure.c:1193 #, c-format -msgid "SSL error: %s\n" -msgstr "SSL 錯誤: %s\n" +#~ msgid "SSL error: %s\n" +#~ msgstr "SSL 錯誤: %s\n" -# fe-secure.c:357 -# fe-secure.c:441 -# fe-secure.c:1059 -#: fe-secure.c:377 fe-secure.c:463 fe-secure.c:1202 +# fe-secure.c:775 #, c-format -msgid "unrecognized SSL error code: %d\n" -msgstr "無法識別的 SSL 錯誤碼: %d\n" - -# commands/aggregatecmds.c:111 -#: fe-secure.c:601 -msgid "host name must be specified for a verified SSL connection\n" -msgstr "已驗證 SSL 連線必須指定主機å稱\n" +#~ msgid "SSL library does not support CRL certificates (file \"%s\")\n" +#~ msgstr "SSL 程å¼åº«ä¸æ”¯æ´ CRL 憑證 (檔案 \"%s\")\n" -# fe-secure.c:580 -#: fe-secure.c:620 #, c-format -msgid "server common name \"%s\" does not match host name \"%s\"\n" -msgstr "伺æœå™¨å…¬ç”¨å稱 \"%s\" 與主機å稱 \"%s\" ä¸åŒ\n" +#~ msgid "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui\n" +#~ msgstr "WSAIoctl(SIO_KEEPALIVE_VALS) 失敗: %ui\n" + +# fe-lobj.c:653 +#~ msgid "cannot determine OID of function lo_creat\n" +#~ msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lo_creat çš„ OID\n" + +# fe-lobj.c:653 +#~ msgid "cannot determine OID of function lo_create\n" +#~ msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lo_create çš„ OID\n" + +# fe-lobj.c:667 +#~ msgid "cannot determine OID of function lo_lseek\n" +#~ msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lo_lseek çš„ OID\n" + +# fe-lobj.c:639 +#~ msgid "cannot determine OID of function lo_open\n" +#~ msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lo_open çš„ OID\n" + +# fe-lobj.c:653 +#~ msgid "cannot determine OID of function lo_truncate\n" +#~ msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lo_truncate çš„ OID\n" + +# fe-lobj.c:660 +#~ msgid "cannot determine OID of function lo_unlink\n" +#~ msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lo_unlink çš„ OID\n" + +# fe-lobj.c:681 +#~ msgid "cannot determine OID of function loread\n" +#~ msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ loread çš„ OID\n" + +# fe-lobj.c:688 +#~ msgid "cannot determine OID of function lowrite\n" +#~ msgstr "ç„¡æ³•åˆ¤æ–·å‡½å¼ lowrite çš„ OID\n" # fe-secure.c:932 -#: fe-secure.c:752 #, c-format -msgid "could not create SSL context: %s\n" -msgstr "無法建立 SSL context: %s\n" +#~ msgid "could not create SSL context: %s\n" +#~ msgstr "無法建立 SSL context: %s\n" -# fe-secure.c:775 -#: fe-secure.c:868 +# libpq/pqcomm.c:702 #, c-format -msgid "could not open certificate file \"%s\": %s\n" -msgstr "無法開啟憑證檔 \"%s\": %s\n" +#~ msgid "could not get effective UID from peer credentials: %s\n" +#~ msgstr "無法從å°é»žèªè­‰å–得有效 UID: %s\n" -# fe-secure.c:784 -#: fe-secure.c:893 fe-secure.c:903 +# libpq/be-secure.c:714 +#~ msgid "could not get home directory to locate client certificate files" +#~ msgstr "無法å–得用來找出用戶端憑證檔的主目錄" + +# libpq/be-secure.c:714 +#~ msgid "could not get home directory to locate service definition file" +#~ msgstr "無法å–得用來尋找æœå‹™å®šç¾©æª”的家目錄" + +# libpq/be-secure.c:689 #, c-format -msgid "could not read certificate file \"%s\": %s\n" -msgstr "ç„¡æ³•è®€å–æ†‘證檔 \"%s\": %s\n" +#~ msgid "could not load private key file \"%s\": %s\n" +#~ msgstr "無法載入ç§é‘°æª” \"%s\": %s\n" # fe-lobj.c:410 # fe-lobj.c:495 -#: fe-secure.c:940 #, c-format -msgid "could not load SSL engine \"%s\": %s\n" -msgstr "無法載入 SSL 引擎 \"%s\": %s\n" +#~ msgid "could not open file \"%s\": %s\n" +#~ msgstr "無法開啟檔案 \"%s\": %s\n" -# libpq/be-secure.c:789 -#: fe-secure.c:952 -#, c-format -msgid "could not initialize SSL engine \"%s\": %s\n" -msgstr "無法åˆå§‹åŒ– SSL 引擎 \"%s\": %s\n" +# fe-secure.c:815 +#~ msgid "could not open private key file \"%s\": %s\n" +#~ msgstr "無法開啟ç§é‘°æª”\"%s\":%s\n" # fe-secure.c:833 -#: fe-secure.c:968 -#, c-format -msgid "could not read private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "無法讀å–ç§å¯† SSL 金鑰 \"%s\" (從引擎 \"%s\"): %s\n" +#~ msgid "could not read private key file \"%s\": %s\n" +#~ msgstr "無法讀å–ç§é‘°æª”\"%s\":%s\n" -# fe-secure.c:833 -#: fe-secure.c:982 +# fe-auth.c:441 #, c-format -msgid "could not load private SSL key \"%s\" from engine \"%s\": %s\n" -msgstr "無法從引擎 \"%2$s\" 載入ç§å¯† SSL 金鑰 \"%1$s\": %3$s\n" +#~ msgid "could not restore non-blocking mode on socket: %s\n" +#~ msgstr "無法將 socket 還原為éžé˜»æ“‹æ¨¡å¼: %s\n" -# fe-secure.c:798 -#: fe-secure.c:1019 +# fe-auth.c:394 #, c-format -msgid "certificate present, but not private key file \"%s\"\n" -msgstr "ç™¼ç¾æ†‘證,但是沒有ç§é‘°æª” \"%s\"\n" +#~ msgid "could not set socket to blocking mode: %s\n" +#~ msgstr "無法將 socket 設為阻擋模å¼: %s\n" -# fe-connect.c:3154 -#: fe-secure.c:1027 +# fe-connect.c:946 #, c-format -msgid "" -"private key file \"%s\" has group or world access; permissions should be " -"u=rw (0600) or less\n" -msgstr "" -"ç§é‘°æª” \"%s\" å¯ä»¥è¢«ç¾¤çµ„或其他使用者存å–,應該將權é™è¨­ç‚º u=rw (0600) 或更低的" -"權é™\n" +#~ msgid "could not translate host name \"%s\" to address: %s\n" +#~ msgstr "無法將主機å稱 \"%s\" è½‰æ›æˆä½å€: %s\n" -# libpq/be-secure.c:689 -#: fe-secure.c:1038 +# fe-secure.c:504 +#~ msgid "error querying socket: %s\n" +#~ msgstr "è©¢å•socket發生錯誤:%s\n" + +# fe-lobj.c:447 +#~ msgid "error while reading file \"%s\"\n" +#~ msgstr "è®€å–æª”案 \"%s\" 時發生錯誤\n" + +# fe-auth.c:764 +#~ msgid "fe_getauthname: invalid authentication system: %d\n" +#~ msgstr "fe_getauthname:無效的èªè­‰ç³»çµ±ï¼š%d\n" + +# fe-exec.c:753 +# fe-exec.c:902 +# fe-exec.c:1577 +#~ msgid "function requires at least protocol version 3.0\n" +#~ msgstr "函å¼éœ€è¦ 3.0 版以上的å”定\n" + +# fe-auth.c:692 +#~ msgid "invalid authentication service name \"%s\", ignored\n" +#~ msgstr "å¿½ç•¥éžæ³•çš„èªè­‰æœå‹™å稱\"%s\"\n" + +# fe-protocol2.c:91 #, c-format -msgid "could not load private key file \"%s\": %s\n" -msgstr "無法載入ç§é‘°æª” \"%s\": %s\n" +#~ msgid "invalid setenv state %c, probably indicative of memory corruption\n" +#~ msgstr "無效的 setenv 狀態 %c,å¯èƒ½æ˜¯è¨˜æ†¶é«”中的資料被破壞\n" -# fe-secure.c:848 -#: fe-secure.c:1052 +# fe-connect.c:452 #, c-format -msgid "certificate does not match private key file \"%s\": %s\n" -msgstr "憑證與ç§é‘°æª” \"%s\" ä¸ç¬¦: %s\n" +#~ msgid "invalid sslmode value: \"%s\"\n" +#~ msgstr "無效的 sslmode: \"%s\"\n" -# fe-secure.c:977 -#: fe-secure.c:1080 +# fe-protocol2.c:333 #, c-format -msgid "could not read root certificate file \"%s\": %s\n" -msgstr "ç„¡æ³•è®€å–æ ¹æ†‘證檔 \"%s\": %s\n" +#~ msgid "invalid state %c, probably indicative of memory corruption\n" +#~ msgstr "無效的狀態 %c,å¯èƒ½æ˜¯è¨˜æ†¶é«”中的資料被破壞\n" -# fe-secure.c:775 -#: fe-secure.c:1107 +# libpq/hba.c:1481 libpq/hba.c:1512 libpq/hba.c:1582 #, c-format -msgid "SSL library does not support CRL certificates (file \"%s\")\n" -msgstr "SSL 程å¼åº«ä¸æ”¯æ´ CRL 憑證 (檔案 \"%s\")\n" +#~ msgid "local user with ID %d does not exist\n" +#~ msgstr "本機使用者 ID %d ä¸å­˜åœ¨\n" -#: fe-secure.c:1134 -msgid "" -"could not get home directory to locate root certificate file\n" -"Either provide the file or change sslmode to disable server certificate " -"verification.\n" -msgstr "" -"無法å–得用來尋找根憑證檔 \"%s\" 的家目錄\n" -"è«‹æä¾›æª”案或變更 sslmode 以åœç”¨ä¼ºæœå™¨æ†‘證驗證。\n" +# fe-protocol2.c:1208 +#~ msgid "lost synchronization with server, resetting connection" +#~ msgstr "無法與伺æœå™¨å”調,é‡ç½®é€£ç·š" -#: fe-secure.c:1138 -#, c-format -msgid "" -"root certificate file \"%s\" does not exist\n" -"Either provide the file or change sslmode to disable server certificate " -"verification.\n" -msgstr "" -"根憑證檔 \"%s\" ä¸å­˜åœ¨\n" -"è«‹æä¾›æª”案,或變更 sslmode 以åœç”¨ä¼ºæœå™¨æ†‘證驗證。\n" +# fe-secure.c:824 +#~ msgid "private key file \"%s\" changed during execution\n" +#~ msgstr "ç§é‘°æª”\"%s\"在執行éŽç¨‹ä¸­è¢«æ”¹è®Š\n" -# fe-secure.c:1093 -#: fe-secure.c:1221 +# fe-misc.c:991 #, c-format -msgid "certificate could not be obtained: %s\n" -msgstr "無法å–得憑證: %s\n" +#~ msgid "select() failed: %s\n" +#~ msgstr "select()失敗: %s\n" -#: fe-secure.c:1249 -msgid "SSL certificate's common name contains embedded null\n" -msgstr "SSL 憑證的一般å稱包å«å…§åµŒçš„ Null\n" +# fe-protocol2.c:533 +#~ msgid "server sent binary data (\"B\" message) without prior row description (\"T\" message)" +#~ msgstr "伺æœå™¨å‚³é€äºŒå…ƒè³‡æ–™(\"B\" 訊æ¯)而未æä¾›è³‡æ–™è¡Œæè¿°(\"T\" 訊æ¯)" -# libpq/be-secure.c:303 libpq/be-secure.c:396 -#: fe-secure.c:1325 -msgid "no SSL error reported" -msgstr "沒有 SSL 錯誤被回報" +# fe-protocol3.c:306 +#~ msgid "server sent data (\"D\" message) without prior row description (\"T\" message)\n" +#~ msgstr "伺æœå™¨å‚³é€è³‡æ–™(\"D\" 訊æ¯)而未æä¾›è³‡æ–™è¡Œæè¿°(\"T\" 訊æ¯)\n" -# libpq/be-secure.c:294 libpq/be-secure.c:387 -#: fe-secure.c:1334 +# libpq/pqcomm.c:346 #, c-format -msgid "SSL error code %lu" -msgstr "SSL 錯誤碼 %lu" +#~ msgid "setsockopt(SO_KEEPALIVE) failed: %s\n" +#~ msgstr "setsockopt(SO_KEEPALIVE) 失敗: %s\n" -# libpq/be-secure.c:714 -#~ msgid "could not get home directory to locate client certificate files" -#~ msgstr "無法å–得用來找出用戶端憑證檔的主目錄" - -# fe-secure.c:815 -#~ msgid "could not open private key file \"%s\": %s\n" -#~ msgstr "無法開啟ç§é‘°æª”\"%s\":%s\n" +# libpq/pqcomm.c:346 +#, c-format +#~ msgid "setsockopt(TCP_KEEPALIVE) failed: %s\n" +#~ msgstr "setsockopt(TCP_KEEPALIVE) 失敗: %s\n" -# fe-secure.c:824 -#~ msgid "private key file \"%s\" changed during execution\n" -#~ msgstr "ç§é‘°æª”\"%s\"在執行éŽç¨‹ä¸­è¢«æ”¹è®Š\n" +# libpq/pqcomm.c:360 +#, c-format +#~ msgid "setsockopt(TCP_KEEPCNT) failed: %s\n" +#~ msgstr "setsockopt(TCP_KEEPCNT) 失敗: %s\n" -# fe-secure.c:833 -#~ msgid "could not read private key file \"%s\": %s\n" -#~ msgstr "無法讀å–ç§é‘°æª”\"%s\":%s\n" +# libpq/pqcomm.c:346 +#, c-format +#~ msgid "setsockopt(TCP_KEEPIDLE) failed: %s\n" +#~ msgstr "setsockopt(TCP_KEEPIDLE) 失敗: %s\n" -# fe-auth.c:692 -#~ msgid "invalid authentication service name \"%s\", ignored\n" -#~ msgstr "å¿½ç•¥éžæ³•çš„èªè­‰æœå‹™å稱\"%s\"\n" +# libpq/pqcomm.c:360 +#, c-format +#~ msgid "setsockopt(TCP_KEEPINTVL) failed: %s\n" +#~ msgstr "setsockopt(TCP_KEEPINTVL) 失敗: %s\n" -# fe-auth.c:764 -#~ msgid "fe_getauthname: invalid authentication system: %d\n" -#~ msgstr "fe_getauthname:無效的èªè­‰ç³»çµ±ï¼š%d\n" +# fe-misc.c:968 +#~ msgid "socket not open\n" +#~ msgstr "socket 未開啟\n" -# fe-lobj.c:447 -#~ msgid "error while reading file \"%s\"\n" -#~ msgstr "è®€å–æª”案 \"%s\" 時發生錯誤\n" +# fe-protocol2.c:462 +#, c-format +#~ msgid "unexpected character %c following empty query response (\"I\" message)" +#~ msgstr "空的查詢回應(\"I\" 訊æ¯)後跟隨éžé æœŸå­—å…ƒ %c" -# fe-secure.c:504 -#~ msgid "error querying socket: %s\n" -#~ msgstr "è©¢å•socket發生錯誤:%s\n" +# fe-secure.c:357 +# fe-secure.c:441 +# fe-secure.c:1059 +#, c-format +#~ msgid "unrecognized SSL error code: %d\n" +#~ msgstr "無法識別的 SSL 錯誤碼: %d\n" # fe-secure.c:551 #~ msgid "unsupported protocol\n" #~ msgstr "ä¸è¢«æ”¯æ´çš„å”定\n" -#~ msgid "" -#~ "verified SSL connections are only supported when connecting to a host name" +#~ msgid "verified SSL connections are only supported when connecting to a host name" #~ msgstr "åªæœ‰åœ¨é€£ç·šåˆ°ä¸»æ©Ÿåç¨±æ™‚ï¼Œæ‰æ”¯æ´ç¶“驗證的 SSL 連線" diff --git a/src/interfaces/libpq/pqexpbuffer.c b/src/interfaces/libpq/pqexpbuffer.c index de7e0328dbb1a..037875c523696 100644 --- a/src/interfaces/libpq/pqexpbuffer.c +++ b/src/interfaces/libpq/pqexpbuffer.c @@ -15,7 +15,7 @@ * a usable vsnprintf(), then a copy of our own implementation of it will * be linked into libpq. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/interfaces/libpq/pqexpbuffer.c @@ -38,7 +38,7 @@ static const char oom_buffer[1] = ""; /* Need a char * for unconstify() compatibility */ -static const char *oom_buffer_ptr = oom_buffer; +static const char *const oom_buffer_ptr = oom_buffer; /* diff --git a/src/interfaces/libpq/pqexpbuffer.h b/src/interfaces/libpq/pqexpbuffer.h index 020e94e357151..d05010066b2f9 100644 --- a/src/interfaces/libpq/pqexpbuffer.h +++ b/src/interfaces/libpq/pqexpbuffer.h @@ -15,7 +15,7 @@ * a usable vsnprintf(), then a copy of our own implementation of it will * be linked into libpq. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/interfaces/libpq/pqexpbuffer.h diff --git a/src/interfaces/libpq/pthread-win32.c b/src/interfaces/libpq/pthread-win32.c index 8e656373876bb..b40872898d15e 100644 --- a/src/interfaces/libpq/pthread-win32.c +++ b/src/interfaces/libpq/pthread-win32.c @@ -3,7 +3,7 @@ * pthread-win32.c * partial pthread implementation for win32 * -* Copyright (c) 2004-2023, PostgreSQL Global Development Group +* Copyright (c) 2004-2024, PostgreSQL Global Development Group * IDENTIFICATION * src/interfaces/libpq/pthread-win32.c * @@ -34,27 +34,33 @@ pthread_getspecific(pthread_key_t key) int pthread_mutex_init(pthread_mutex_t *mp, void *attr) { - *mp = (CRITICAL_SECTION *) malloc(sizeof(CRITICAL_SECTION)); - if (!*mp) - return 1; - InitializeCriticalSection(*mp); + mp->initstate = 0; return 0; } int pthread_mutex_lock(pthread_mutex_t *mp) { - if (!*mp) - return 1; - EnterCriticalSection(*mp); + /* Initialize the csection if not already done */ + if (mp->initstate != 1) + { + LONG istate; + + while ((istate = InterlockedExchange(&mp->initstate, 2)) == 2) + Sleep(0); /* wait, another thread is doing this */ + if (istate != 1) + InitializeCriticalSection(&mp->csection); + InterlockedExchange(&mp->initstate, 1); + } + EnterCriticalSection(&mp->csection); return 0; } int pthread_mutex_unlock(pthread_mutex_t *mp) { - if (!*mp) - return 1; - LeaveCriticalSection(*mp); + if (mp->initstate != 1) + return EINVAL; + LeaveCriticalSection(&mp->csection); return 0; } diff --git a/src/interfaces/libpq/t/001_uri.pl b/src/interfaces/libpq/t/001_uri.pl index fd062a95c574a..49ea5377e0315 100644 --- a/src/interfaces/libpq/t/001_uri.pl +++ b/src/interfaces/libpq/t/001_uri.pl @@ -1,6 +1,6 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/interfaces/libpq/t/002_api.pl b/src/interfaces/libpq/t/002_api.pl index 8b43a984fbce8..785f3c9c8f867 100644 --- a/src/interfaces/libpq/t/002_api.pl +++ b/src/interfaces/libpq/t/002_api.pl @@ -1,6 +1,6 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/interfaces/libpq/t/003_load_balance_host_list.pl b/src/interfaces/libpq/t/003_load_balance_host_list.pl index 21c3b8dd3353e..8567c38388346 100644 --- a/src/interfaces/libpq/t/003_load_balance_host_list.pl +++ b/src/interfaces/libpq/t/003_load_balance_host_list.pl @@ -1,6 +1,6 @@ -# Copyright (c) 2023, PostgreSQL Global Development Group +# Copyright (c) 2023-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use Config; use PostgreSQL::Test::Utils; use PostgreSQL::Test::Cluster; @@ -51,20 +51,20 @@ sql => "SELECT 'connect2'"); } -my $node1_occurences = () = +my $node1_occurrences = () = $node1->log_content() =~ /statement: SELECT 'connect2'/g; -my $node2_occurences = () = +my $node2_occurrences = () = $node2->log_content() =~ /statement: SELECT 'connect2'/g; -my $node3_occurences = () = +my $node3_occurrences = () = $node3->log_content() =~ /statement: SELECT 'connect2'/g; -my $total_occurences = - $node1_occurences + $node2_occurences + $node3_occurences; +my $total_occurrences = + $node1_occurrences + $node2_occurrences + $node3_occurrences; -ok($node1_occurences > 1, "received at least one connection on node1"); -ok($node2_occurences > 1, "received at least one connection on node2"); -ok($node3_occurences > 1, "received at least one connection on node3"); -ok($total_occurences == 50, "received 50 connections across all nodes"); +ok($node1_occurrences > 1, "received at least one connection on node1"); +ok($node2_occurrences > 1, "received at least one connection on node2"); +ok($node3_occurrences > 1, "received at least one connection on node3"); +ok($total_occurrences == 50, "received 50 connections across all nodes"); $node1->stop(); $node2->stop(); diff --git a/src/interfaces/libpq/t/004_load_balance_dns.pl b/src/interfaces/libpq/t/004_load_balance_dns.pl index 875070e2120ec..198a11fcf4a34 100644 --- a/src/interfaces/libpq/t/004_load_balance_dns.pl +++ b/src/interfaces/libpq/t/004_load_balance_dns.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2023, PostgreSQL Global Development Group +# Copyright (c) 2023-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use Config; use PostgreSQL::Test::Utils; use PostgreSQL::Test::Cluster; use Test::More; -if ($ENV{PG_TEST_EXTRA} !~ /\bload_balance\b/) +if (!$ENV{PG_TEST_EXTRA} || $ENV{PG_TEST_EXTRA} !~ /\bload_balance\b/) { plan skip_all => 'Potentially unsafe test load_balance not enabled in PG_TEST_EXTRA'; @@ -101,20 +101,20 @@ sql => "SELECT 'connect2'"); } -my $node1_occurences = () = +my $node1_occurrences = () = $node1->log_content() =~ /statement: SELECT 'connect2'/g; -my $node2_occurences = () = +my $node2_occurrences = () = $node2->log_content() =~ /statement: SELECT 'connect2'/g; -my $node3_occurences = () = +my $node3_occurrences = () = $node3->log_content() =~ /statement: SELECT 'connect2'/g; -my $total_occurences = - $node1_occurences + $node2_occurences + $node3_occurences; +my $total_occurrences = + $node1_occurrences + $node2_occurrences + $node3_occurrences; -ok($node1_occurences > 1, "received at least one connection on node1"); -ok($node2_occurences > 1, "received at least one connection on node2"); -ok($node3_occurences > 1, "received at least one connection on node3"); -ok($total_occurences == 50, "received 50 connections across all nodes"); +ok($node1_occurrences > 1, "received at least one connection on node1"); +ok($node2_occurrences > 1, "received at least one connection on node2"); +ok($node3_occurrences > 1, "received at least one connection on node3"); +ok($total_occurrences == 50, "received 50 connections across all nodes"); $node1->stop(); $node2->stop(); diff --git a/src/interfaces/libpq/t/005_negotiate_encryption.pl b/src/interfaces/libpq/t/005_negotiate_encryption.pl new file mode 100644 index 0000000000000..c3f70d31bc8b2 --- /dev/null +++ b/src/interfaces/libpq/t/005_negotiate_encryption.pl @@ -0,0 +1,762 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# OVERVIEW +# -------- +# +# Test negotiation of SSL and GSSAPI encryption +# +# We test all combinations of: +# +# - all the libpq client options that affect the protocol negotiations +# (gssencmode, sslmode, sslnegotiation) +# - server accepting or rejecting the authentication due to +# pg_hba.conf entries +# - SSL and GSS enabled/disabled in the server +# +# That's a lot of combinations, so we use a table-driven approach. +# Each combination is represented by a line in a table. The line lists +# the options specifying the test case, and an expected outcome. The +# expected outcome includes whether the connection succeeds or fails, +# and whether it uses SSL, GSS or no encryption. It also includes a +# condensed trace of what steps were taken during the negotiation. +# That can catch cases like useless retries, or if the encryption +# methods are attempted in wrong order, even when it doesn't affect +# the final outcome. +# +# TEST TABLE FORMAT +# ----------------- +# +# Example of the test table format: +# +# # USER GSSENCMODE SSLMODE EVENTS -> OUTCOME +# testuser disable allow connect, authok -> plain +# . . prefer connect, sslaccept, authok -> ssl +# testuser require * connect, gssreject -> fail +# +# USER, GSSENCMODE and SSLMODE fields are the libpq 'user', +# 'gssencmode' and 'sslmode' options used in the test. As a shorthand, +# a single dot ('.') can be used in the USER, GSSENCMODE, and SSLMODE +# fields, to indicate "same as on previous line". A '*' can be used +# as a wildcard; it is expanded to mean all possible values of that +# field. +# +# The EVENTS field is a condensed trace of expected steps during the +# negotiation: +# +# connect: a TCP connection was established +# reconnect: TCP connection was disconnected, and a new one was established +# sslaccept: client requested SSL encryption and server accepted it +# sslreject: client requested SSL encryption but server rejected it +# gssaccept: client requested GSSAPI encryption and server accepted it +# gssreject: client requested GSSAPI encryption but server rejected it +# authok: client sent startup packet and authentication was performed successfully +# authfail: client sent startup packet but server rejected the authentication +# +# The event trace can be used to verify that the client negotiated the +# connection properly in more detail than just by looking at the +# outcome. For example, if the client opens spurious extra TCP +# connections, that would show up in the EVENTS. +# +# The OUTCOME field indicates the expected result of the test: +# +# plain: an unencrypted connection was established +# ssl: SSL connection was established +# gss: GSSAPI encrypted connection was established +# fail: the connection attempt failed +# +# Empty lines are ignored. '#' can be used to mark the rest of the +# line as a comment. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Utils; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Kerberos; +use File::Basename; +use File::Copy; +use Test::More; + +if (!$ENV{PG_TEST_EXTRA} || $ENV{PG_TEST_EXTRA} !~ /\blibpq_encryption\b/) +{ + plan skip_all => + 'Potentially unsafe test libpq_encryption not enabled in PG_TEST_EXTRA'; +} + +# Only run the GSSAPI tests when compiled with GSSAPI support and +# PG_TEST_EXTRA includes 'kerberos' +my $gss_supported = $ENV{with_gssapi} eq 'yes'; +my $kerberos_enabled = + $ENV{PG_TEST_EXTRA} && $ENV{PG_TEST_EXTRA} =~ /\bkerberos\b/; +my $ssl_supported = $ENV{with_ssl} eq 'openssl'; + +### +### Prepare test server for GSSAPI and SSL authentication, with a few +### different test users and helper functions. We don't actually +### enable SSL and kerberos in the server yet, we will do that later. +### + +my $host = 'enc-test-localhost.postgresql.example.com'; +my $hostaddr = '127.0.0.1'; +my $servercidr = '127.0.0.1/32'; + +my $node = PostgreSQL::Test::Cluster->new('node'); +$node->init; +$node->append_conf( + 'postgresql.conf', qq{ +listen_addresses = '$hostaddr' + +# Capturing the EVENTS that occur during tests requires these settings +log_connections = on +log_disconnections = on +trace_connection_negotiation = on +lc_messages = 'C' +}); +my $pgdata = $node->data_dir; + +my $dbname = 'postgres'; +my $username = 'enctest'; +my $application = '001_negotiate_encryption.pl'; + +my $gssuser_password = 'secret1'; + +my $krb; + +if ($gss_supported != 0 && $kerberos_enabled != 0) +{ + note "setting up Kerberos"; + + my $realm = 'EXAMPLE.COM'; + $krb = PostgreSQL::Test::Kerberos->new($host, $hostaddr, $realm); + $node->append_conf('postgresql.conf', + "krb_server_keyfile = '$krb->{keytab}'\n"); +} + +if ($ssl_supported != 0) +{ + my $certdir = dirname(__FILE__) . "/../../../test/ssl/ssl"; + + copy "$certdir/server-cn-only.crt", "$pgdata/server.crt" + || die "copying server.crt: $!"; + copy "$certdir/server-cn-only.key", "$pgdata/server.key" + || die "copying server.key: $!"; + chmod(0600, "$pgdata/server.key") + or die "failed to change permissions on server keys: $!"; + + # Start with SSL disabled. + $node->append_conf('postgresql.conf', "ssl = off\n"); +} + +$node->start; + +$node->safe_psql('postgres', 'CREATE USER localuser;'); +$node->safe_psql('postgres', 'CREATE USER testuser;'); +$node->safe_psql('postgres', 'CREATE USER ssluser;'); +$node->safe_psql('postgres', 'CREATE USER nossluser;'); +$node->safe_psql('postgres', 'CREATE USER gssuser;'); +$node->safe_psql('postgres', 'CREATE USER nogssuser;'); + +my $unixdir = $node->safe_psql('postgres', 'SHOW unix_socket_directories;'); +chomp($unixdir); + +# Helper function that returns the encryption method in use in the +# connection. +$node->safe_psql( + 'postgres', q{ +CREATE FUNCTION current_enc() RETURNS text LANGUAGE plpgsql AS $$ +DECLARE + ssl_in_use bool; + gss_in_use bool; +BEGIN + ssl_in_use = (SELECT ssl FROM pg_stat_ssl WHERE pid = pg_backend_pid()); + gss_in_use = (SELECT encrypted FROM pg_stat_gssapi WHERE pid = pg_backend_pid()); + + raise log 'ssl % gss %', ssl_in_use, gss_in_use; + + IF ssl_in_use AND gss_in_use THEN + RETURN 'ssl+gss'; -- shouldn't happen + ELSIF ssl_in_use THEN + RETURN 'ssl'; + ELSIF gss_in_use THEN + RETURN 'gss'; + ELSE + RETURN 'plain'; + END IF; +END; +$$; +}); + +# Only accept SSL connections from $servercidr. Our tests don't depend on this +# but seems best to keep it as narrow as possible for security reasons. +open my $hba, '>', "$pgdata/pg_hba.conf" or die $!; +print $hba qq{ +# TYPE DATABASE USER ADDRESS METHOD OPTIONS +local postgres localuser trust +host postgres testuser $servercidr trust +hostnossl postgres nossluser $servercidr trust +hostnogssenc postgres nogssuser $servercidr trust +}; + +print $hba qq{ +hostssl postgres ssluser $servercidr trust +} if ($ssl_supported != 0); + +print $hba qq{ +hostgssenc postgres gssuser $servercidr trust +} if ($gss_supported != 0 && $kerberos_enabled != 0); +close $hba; +$node->reload; + +# Ok, all prepared. Run the tests. + +my @all_test_users = + ('testuser', 'ssluser', 'nossluser', 'gssuser', 'nogssuser'); +my @all_gssencmodes = ('disable', 'prefer', 'require'); +my @all_sslmodes = ('disable', 'allow', 'prefer', 'require'); +my @all_sslnegotiations = ('postgres', 'direct'); + +my $server_config = { + server_ssl => 0, + server_gss => 0, +}; + +### +### Run tests with GSS and SSL disabled in the server +### +my $test_table; +if ($ssl_supported) +{ + $test_table = q{ +# USER GSSENCMODE SSLMODE SSLNEGOTIATION EVENTS -> OUTCOME +testuser disable disable postgres connect, authok -> plain +. . allow postgres connect, authok -> plain +. . prefer postgres connect, sslreject, authok -> plain +. . require postgres connect, sslreject -> fail +. . . direct connect, directsslreject -> fail +. prefer disable postgres connect, authok -> plain +. . allow postgres connect, authok -> plain +. . prefer postgres connect, sslreject, authok -> plain +. . require postgres connect, sslreject -> fail +. . . direct connect, directsslreject -> fail + +# sslnegotiation=direct is not acccepted unless sslmode=require or stronger +* * disable direct - -> fail +* * allow direct - -> fail +* * prefer direct - -> fail +}; +} +else +{ + # Compiled without SSL support + $test_table = q{ +# USER GSSENCMODE SSLMODE SSLNEGOTIATION EVENTS -> OUTCOME +testuser disable disable postgres connect, authok -> plain +. . allow postgres connect, authok -> plain +. . prefer postgres connect, authok -> plain +. prefer disable postgres connect, authok -> plain +. . allow postgres connect, authok -> plain +. . prefer postgres connect, authok -> plain + +# Without SSL support, sslmode=require and sslnegotiation=direct are +# not accepted at all +* * require * - -> fail +* * * direct - -> fail + }; +} + +# All attempts with gssencmode=require fail without connecting because +# no credential cache has been configured in the client. (Or if GSS +# support is not compiled in, they will fail because of that.) +$test_table .= q{ +testuser require * * - -> fail +}; + +note("Running tests with SSL and GSS disabled in the server"); +test_matrix($node, $server_config, + ['testuser'], \@all_gssencmodes, \@all_sslmodes, \@all_sslnegotiations, + parse_table($test_table)); + + +### +### Run tests with GSS disabled and SSL enabled in the server +### +SKIP: +{ + skip "SSL not supported by this build" if $ssl_supported == 0; + + $test_table = q{ +# USER GSSENCMODE SSLMODE SSLNEGOTIATION EVENTS -> OUTCOME +testuser disable disable postgres connect, authok -> plain +. . allow postgres connect, authok -> plain +. . prefer postgres connect, sslaccept, authok -> ssl +. . require postgres connect, sslaccept, authok -> ssl +. . . direct connect, directsslaccept, authok -> ssl +ssluser . disable postgres connect, authfail -> fail +. . allow postgres connect, authfail, reconnect, sslaccept, authok -> ssl +. . prefer postgres connect, sslaccept, authok -> ssl +. . require postgres connect, sslaccept, authok -> ssl +. . . direct connect, directsslaccept, authok -> ssl +nossluser . disable postgres connect, authok -> plain +. . allow postgres connect, authok -> plain +. . prefer postgres connect, sslaccept, authfail, reconnect, authok -> plain +. . require postgres connect, sslaccept, authfail -> fail +. . require direct connect, directsslaccept, authfail -> fail + +# sslnegotiation=direct is not acccepted unless sslmode=require or stronger +* * disable direct - -> fail +* * allow direct - -> fail +* * prefer direct - -> fail +}; + + # Enable SSL in the server + $node->adjust_conf('postgresql.conf', 'ssl', 'on'); + $node->reload; + $server_config->{server_ssl} = 1; + + note("Running tests with SSL enabled in server"); + test_matrix( + $node, $server_config, + [ 'testuser', 'ssluser', 'nossluser' ], ['disable'], + \@all_sslmodes, \@all_sslnegotiations, + parse_table($test_table)); + + # Disable SSL again + $node->adjust_conf('postgresql.conf', 'ssl', 'off'); + $node->reload; + $server_config->{server_ssl} = 0; +} + +### +### Run tests with GSS enabled, SSL disabled in the server +### +SKIP: +{ + skip "GSSAPI/Kerberos not supported by this build" if $gss_supported == 0; + skip "kerberos not enabled in PG_TEST_EXTRA" if $kerberos_enabled == 0; + + $krb->create_principal('gssuser', $gssuser_password); + $krb->create_ticket('gssuser', $gssuser_password); + $server_config->{server_gss} = 1; + + $test_table = q{ +# USER GSSENCMODE SSLMODE SSLNEGOTIATION EVENTS -> OUTCOME +testuser disable disable postgres connect, authok -> plain +. . allow postgres connect, authok -> plain +. . prefer postgres connect, sslreject, authok -> plain +. . require postgres connect, sslreject -> fail +. . . direct connect, directsslreject -> fail +. prefer * postgres connect, gssaccept, authok -> gss +. prefer require direct connect, gssaccept, authok -> gss +. require * postgres connect, gssaccept, authok -> gss +. . require direct connect, gssaccept, authok -> gss + +gssuser disable disable postgres connect, authfail -> fail +. . allow postgres connect, authfail, reconnect, sslreject -> fail +. . prefer postgres connect, sslreject, authfail -> fail +. . require postgres connect, sslreject -> fail +. . . direct connect, directsslreject -> fail +. prefer * postgres connect, gssaccept, authok -> gss +. prefer require direct connect, gssaccept, authok -> gss +. require * postgres connect, gssaccept, authok -> gss +. . require direct connect, gssaccept, authok -> gss + +nogssuser disable disable postgres connect, authok -> plain +. . allow postgres connect, authok -> plain +. . prefer postgres connect, sslreject, authok -> plain +. . require postgres connect, sslreject -> fail +. . . direct connect, directsslreject -> fail +. prefer disable postgres connect, gssaccept, authfail, reconnect, authok -> plain +. . allow postgres connect, gssaccept, authfail, reconnect, authok -> plain +. . prefer postgres connect, gssaccept, authfail, reconnect, sslreject, authok -> plain +. . require postgres connect, gssaccept, authfail, reconnect, sslreject -> fail +. . . direct connect, gssaccept, authfail, reconnect, directsslreject -> fail +. require disable postgres connect, gssaccept, authfail -> fail +. . allow postgres connect, gssaccept, authfail -> fail +. . prefer postgres connect, gssaccept, authfail -> fail +. . require postgres connect, gssaccept, authfail -> fail # If both GSSAPI and sslmode are required, and GSS is not available -> fail +. . . direct connect, gssaccept, authfail -> fail # If both GSSAPI and sslmode are required, and GSS is not available -> fail + +# sslnegotiation=direct is not acccepted unless sslmode=require or stronger +* * disable direct - -> fail +* * allow direct - -> fail +* * prefer direct - -> fail + }; + + # The expected events and outcomes above assume that SSL support + # is enabled. When libpq is compiled without SSL support, all + # attempts to connect with sslmode=require or + # sslnegotiation=direct would fail immediately without even + # connecting to the server. Skip those, because we tested them + # earlier already. + my ($sslmodes, $sslnegotiations); + if ($ssl_supported != 0) + { + ($sslmodes, $sslnegotiations) = + (\@all_sslmodes, \@all_sslnegotiations); + } + else + { + ($sslmodes, $sslnegotiations) = (['disable'], ['postgres']); + } + + note("Running tests with GSS enabled in server"); + test_matrix($node, $server_config, [ 'testuser', 'gssuser', 'nogssuser' ], + \@all_gssencmodes, $sslmodes, $sslnegotiations, + parse_table($test_table)); +} + +### +### Tests with both GSS and SSL enabled in the server +### +SKIP: +{ + skip "SSL not supported by this build" if $ssl_supported == 0; + skip "GSSAPI/Kerberos not supported by this build" if $gss_supported == 0; + skip "kerberos not enabled in PG_TEST_EXTRA" if $kerberos_enabled == 0; + + # Sanity check that GSSAPI is still enabled from previous test. + connect_test( + $node, + 'user=testuser gssencmode=prefer sslmode=prefer', + 'connect, gssaccept, authok -> gss'); + + # Enable SSL + $node->adjust_conf('postgresql.conf', 'ssl', 'on'); + $node->reload; + $server_config->{server_ssl} = 1; + + $test_table = q{ +# USER GSSENCMODE SSLMODE SSLNEGOTIATION EVENTS -> OUTCOME +testuser disable disable postgres connect, authok -> plain +. . allow postgres connect, authok -> plain +. . prefer postgres connect, sslaccept, authok -> ssl +. . require postgres connect, sslaccept, authok -> ssl +. . . direct connect, directsslaccept, authok -> ssl +. prefer disable postgres connect, gssaccept, authok -> gss +. . allow postgres connect, gssaccept, authok -> gss +. . prefer postgres connect, gssaccept, authok -> gss +. . require postgres connect, gssaccept, authok -> gss # If both GSS and SSL is possible, GSS is chosen over SSL, even if sslmode=require +. . . direct connect, gssaccept, authok -> gss +. require disable postgres connect, gssaccept, authok -> gss +. . allow postgres connect, gssaccept, authok -> gss +. . prefer postgres connect, gssaccept, authok -> gss +. . require postgres connect, gssaccept, authok -> gss # If both GSS and SSL is possible, GSS is chosen over SSL, even if sslmode=require +. . . direct connect, gssaccept, authok -> gss + +gssuser disable disable postgres connect, authfail -> fail +. . allow postgres connect, authfail, reconnect, sslaccept, authfail -> fail +. . prefer postgres connect, sslaccept, authfail, reconnect, authfail -> fail +. . require postgres connect, sslaccept, authfail -> fail +. . . direct connect, directsslaccept, authfail -> fail +. prefer disable postgres connect, gssaccept, authok -> gss +. . allow postgres connect, gssaccept, authok -> gss +. . prefer postgres connect, gssaccept, authok -> gss +. . require postgres connect, gssaccept, authok -> gss # GSS is chosen over SSL, even though sslmode=require +. . . direct connect, gssaccept, authok -> gss +. require disable postgres connect, gssaccept, authok -> gss +. . allow postgres connect, gssaccept, authok -> gss +. . prefer postgres connect, gssaccept, authok -> gss +. . require postgres connect, gssaccept, authok -> gss # If both GSS and SSL is possible, GSS is chosen over SSL, even if sslmode=require +. . . direct connect, gssaccept, authok -> gss + +ssluser disable disable postgres connect, authfail -> fail +. . allow postgres connect, authfail, reconnect, sslaccept, authok -> ssl +. . prefer postgres connect, sslaccept, authok -> ssl +. . require postgres connect, sslaccept, authok -> ssl +. . . direct connect, directsslaccept, authok -> ssl +. prefer disable postgres connect, gssaccept, authfail, reconnect, authfail -> fail +. . allow postgres connect, gssaccept, authfail, reconnect, authfail, reconnect, sslaccept, authok -> ssl +. . prefer postgres connect, gssaccept, authfail, reconnect, sslaccept, authok -> ssl +. . require postgres connect, gssaccept, authfail, reconnect, sslaccept, authok -> ssl +. . . direct connect, gssaccept, authfail, reconnect, directsslaccept, authok -> ssl +. require disable postgres connect, gssaccept, authfail -> fail +. . allow postgres connect, gssaccept, authfail -> fail +. . prefer postgres connect, gssaccept, authfail -> fail +. . require postgres connect, gssaccept, authfail -> fail # If both GSS and SSL are required, the sslmode=require is effectively ignored and GSS is required +. . . direct connect, gssaccept, authfail -> fail + +nogssuser disable disable postgres connect, authok -> plain +. . allow postgres connect, authok -> plain +. . prefer postgres connect, sslaccept, authok -> ssl +. . require postgres connect, sslaccept, authok -> ssl +. . . direct connect, directsslaccept, authok -> ssl +. prefer disable postgres connect, gssaccept, authfail, reconnect, authok -> plain +. . allow postgres connect, gssaccept, authfail, reconnect, authok -> plain +. . prefer postgres connect, gssaccept, authfail, reconnect, sslaccept, authok -> ssl +. . require postgres connect, gssaccept, authfail, reconnect, sslaccept, authok -> ssl +. . . direct connect, gssaccept, authfail, reconnect, directsslaccept, authok -> ssl +. require disable postgres connect, gssaccept, authfail -> fail +. . allow postgres connect, gssaccept, authfail -> fail +. . prefer postgres connect, gssaccept, authfail -> fail +. . require postgres connect, gssaccept, authfail -> fail # If both GSS and SSL are required, the sslmode=require is effectively ignored and GSS is required +. . . direct connect, gssaccept, authfail -> fail + +nossluser disable disable postgres connect, authok -> plain +. . allow postgres connect, authok -> plain +. . prefer postgres connect, sslaccept, authfail, reconnect, authok -> plain +. . require postgres connect, sslaccept, authfail -> fail +. . . direct connect, directsslaccept, authfail -> fail +. prefer * postgres connect, gssaccept, authok -> gss +. . require direct connect, gssaccept, authok -> gss +. require * postgres connect, gssaccept, authok -> gss +. . require direct connect, gssaccept, authok -> gss + +# sslnegotiation=direct is not acccepted unless sslmode=require or stronger +* * disable direct - -> fail +* * allow direct - -> fail +* * prefer direct - -> fail + }; + + note("Running tests with both GSS and SSL enabled in server"); + test_matrix( + $node, + $server_config, + [ 'testuser', 'gssuser', 'ssluser', 'nogssuser', 'nossluser' ], + \@all_gssencmodes, + \@all_sslmodes, + \@all_sslnegotiations, + parse_table($test_table)); +} + +### +### Test negotiation over unix domain sockets. +### +SKIP: +{ + skip "Unix domain sockets not supported" unless ($unixdir ne ""); + + # libpq doesn't attempt SSL or GSSAPI over Unix domain + # sockets. The server would reject them too. + connect_test( + $node, + "user=localuser gssencmode=prefer sslmode=prefer host=$unixdir", + 'connect, authok -> plain'); + connect_test($node, + "user=localuser gssencmode=require sslmode=prefer host=$unixdir", + '- -> fail'); +} + +done_testing(); + + +### Helper functions + +# Test the cube of parameters: user, gssencmode, sslmode, and sslnegotiation +sub test_matrix +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my ($pg_node, $node_conf, + $test_users, $gssencmodes, $sslmodes, $sslnegotiations, %expected) + = @_; + + foreach my $test_user (@{$test_users}) + { + foreach my $gssencmode (@{$gssencmodes}) + { + foreach my $client_mode (@{$sslmodes}) + { + # sslnegotiation only makes a difference if SSL is enabled. This saves a few combinations. + my ($key, $expected_events); + foreach my $negotiation (@{$sslnegotiations}) + { + $key = "$test_user $gssencmode $client_mode $negotiation"; + $expected_events = $expected{$key}; + if (!defined($expected_events)) + { + $expected_events = + ""; + } + connect_test( + $pg_node, + "user=$test_user gssencmode=$gssencmode sslmode=$client_mode sslnegotiation=$negotiation", + $expected_events); + } + } + } + } +} + +# Try to establish a connection to the server using libpq. Verify the +# negotiation events and outcome. +sub connect_test +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my ($node, $connstr, $expected_events_and_outcome) = @_; + + my $test_name = " '$connstr' -> $expected_events_and_outcome"; + + my $connstr_full = ""; + $connstr_full .= "dbname=postgres " unless $connstr =~ m/dbname=/; + $connstr_full .= "host=$host hostaddr=$hostaddr " + unless $connstr =~ m/host=/; + $connstr_full .= $connstr; + + # Get the current size of the logfile before running the test. + # After the test, we can then check just the new lines that have + # appeared. (This is the same approach that the $node->log_contains + # function uses). + my $log_location = -s $node->logfile; + + # XXX: Pass command with -c, because I saw intermittent test + # failures like this: + # + # ack Broken pipe: write( 13, 'SELECT current_enc()' ) at /usr/local/lib/perl5/site_perl/IPC/Run/IO.pm line 550. + # + # I think that happens if the connection fails before we write the + # query to its stdin. This test gets a lot of connection failures + # on purpose. + my ($ret, $stdout, $stderr) = $node->psql( + 'postgres', + '', + extra_params => [ '-w', '-c', 'SELECT current_enc()' ], + connstr => "$connstr_full", + on_error_stop => 0); + + my $outcome = $ret == 0 ? $stdout : 'fail'; + + # Parse the EVENTS from the log file. + my $log_contents = + PostgreSQL::Test::Utils::slurp_file($node->logfile, $log_location); + my @events = parse_log_events($log_contents); + + # Check that the events and outcome match the expected events and + # outcome + my $events_and_outcome = join(', ', @events) . " -> $outcome"; + is($events_and_outcome, $expected_events_and_outcome, $test_name) + or diag("$stderr"); +} + +# Parse a test table. See comment at top of the file for the format. +sub parse_table +{ + my ($table) = @_; + my @lines = split /\n/, $table; + + my %expected; + + my ($user, $gssencmode, $sslmode, $sslnegotiation); + foreach my $line (@lines) + { + + # Trim comments + $line =~ s/#.*$//; + + # Trim whitespace at beginning and end + $line =~ s/^\s+//; + $line =~ s/\s+$//; + + # Ignore empty lines (includes comment-only lines) + next if $line eq ''; + + $line =~ m/^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S.*)\s*->\s*(\S+)\s*$/ + or die "could not parse line \"$line\""; + $user = $1 unless $1 eq "."; + $gssencmode = $2 unless $2 eq "."; + $sslmode = $3 unless $3 eq "."; + $sslnegotiation = $4 unless $4 eq "."; + + # Normalize the whitespace in the "EVENTS -> OUTCOME" part + my @events = split /,\s*/, $5; + my $outcome = $6; + my $events_str = join(', ', @events); + $events_str =~ s/\s+$//; # trim whitespace + my $events_and_outcome = "$events_str -> $outcome"; + + my %expanded = + expand_expected_line($user, $gssencmode, $sslmode, $sslnegotiation, + $events_and_outcome); + %expected = (%expected, %expanded); + } + return %expected; +} + +# Expand wildcards on a test table line +sub expand_expected_line +{ + my ($user, $gssencmode, $sslmode, $sslnegotiation, $expected) = @_; + + my %result; + if ($user eq '*') + { + foreach my $x (@all_test_users) + { + %result = ( + %result, + expand_expected_line( + $x, $gssencmode, $sslmode, $sslnegotiation, $expected)); + } + } + elsif ($gssencmode eq '*') + { + foreach my $x (@all_gssencmodes) + { + %result = ( + %result, + expand_expected_line( + $user, $x, $sslmode, $sslnegotiation, $expected)); + } + } + elsif ($sslmode eq '*') + { + foreach my $x (@all_sslmodes) + { + %result = ( + %result, + expand_expected_line( + $user, $gssencmode, $x, $sslnegotiation, $expected)); + } + } + elsif ($sslnegotiation eq '*') + { + foreach my $x (@all_sslnegotiations) + { + %result = ( + %result, + expand_expected_line( + $user, $gssencmode, $sslmode, $x, $expected)); + } + } + else + { + $result{"$user $gssencmode $sslmode $sslnegotiation"} = $expected; + } + return %result; +} + +# Scrape the server log for the negotiation events that match the +# EVENTS field of the test tables. +sub parse_log_events +{ + my ($log_contents) = (@_); + + my @events = (); + + my @lines = split /\n/, $log_contents; + foreach my $line (@lines) + { + push @events, "reconnect" + if $line =~ /connection received/ && scalar(@events) > 0; + push @events, "connect" + if $line =~ /connection received/ && scalar(@events) == 0; + push @events, "sslaccept" if $line =~ /SSLRequest accepted/; + push @events, "sslreject" if $line =~ /SSLRequest rejected/; + push @events, "directsslaccept" + if $line =~ /direct SSL connection accepted/; + push @events, "directsslreject" + if $line =~ /direct SSL connection rejected/; + push @events, "gssaccept" if $line =~ /GSSENCRequest accepted/; + push @events, "gssreject" if $line =~ /GSSENCRequest rejected/; + push @events, "authfail" if $line =~ /no pg_hba.conf entry/; + push @events, "authok" if $line =~ /connection authenticated/; + } + + # No events at all is represented by "-" + if (scalar @events == 0) + { + push @events, "-"; + } + + return @events; +} diff --git a/src/interfaces/libpq/test/Makefile b/src/interfaces/libpq/test/Makefile index 75ac08f943d9a..4e17ec15141e6 100644 --- a/src/interfaces/libpq/test/Makefile +++ b/src/interfaces/libpq/test/Makefile @@ -20,5 +20,5 @@ all: $(PROGS) $(PROGS): $(WIN32RES) -clean distclean maintainer-clean: +clean distclean: rm -f $(PROGS) *.o diff --git a/src/interfaces/libpq/test/libpq_testclient.c b/src/interfaces/libpq/test/libpq_testclient.c index 4ed66799fc8cd..4a286ddb9c3cf 100644 --- a/src/interfaces/libpq/test/libpq_testclient.c +++ b/src/interfaces/libpq/test/libpq_testclient.c @@ -2,7 +2,7 @@ * libpq_testclient.c * A test program for the libpq public API * - * Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/interfaces/libpq/test/libpq_testclient.c diff --git a/src/interfaces/libpq/test/libpq_uri_regress.c b/src/interfaces/libpq/test/libpq_uri_regress.c index 53d4edb226f7b..eaab7bbe8bbf8 100644 --- a/src/interfaces/libpq/test/libpq_uri_regress.c +++ b/src/interfaces/libpq/test/libpq_uri_regress.c @@ -7,7 +7,7 @@ * prints out the values from the parsed PQconninfoOption struct that differ * from the defaults (obtained from PQconndefaults). * - * Portions Copyright (c) 2012-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2012-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/interfaces/libpq/test/libpq_uri_regress.c diff --git a/src/interfaces/libpq/test/meson.build b/src/interfaces/libpq/test/meson.build index d56b63e11867c..16c0c00b6bcfa 100644 --- a/src/interfaces/libpq/test/meson.build +++ b/src/interfaces/libpq/test/meson.build @@ -1,4 +1,6 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group + +libpq_test_deps = [] libpq_uri_regress_sources = files( 'libpq_uri_regress.c', @@ -10,9 +12,9 @@ if host_system == 'windows' '--FILEDESC', 'libpq test program',]) endif -testprep_targets += executable('libpq_uri_regress', +libpq_test_deps += executable('libpq_uri_regress', libpq_uri_regress_sources, - dependencies: [frontend_code, libpq], + dependencies: [frontend_no_fe_utils_code, libpq], kwargs: default_bin_args + { 'install': false, } @@ -29,10 +31,12 @@ if host_system == 'windows' '--FILEDESC', 'libpq test program',]) endif -testprep_targets += executable('libpq_testclient', +libpq_test_deps += executable('libpq_testclient', libpq_testclient_sources, - dependencies: [frontend_code, libpq], + dependencies: [frontend_no_fe_utils_code, libpq], kwargs: default_bin_args + { 'install': false, } ) + +testprep_targets += libpq_test_deps diff --git a/src/interfaces/libpq/win32.c b/src/interfaces/libpq/win32.c index e4d29eefa6fc8..c738dee69119c 100644 --- a/src/interfaces/libpq/win32.c +++ b/src/interfaces/libpq/win32.c @@ -15,7 +15,7 @@ * The error constants are taken from the Frambak Bakfram LGSOCKET * library guys who in turn took them from the Winsock FAQ. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * */ diff --git a/src/interfaces/meson.build b/src/interfaces/meson.build index 75278bf801f53..bf87332888b2d 100644 --- a/src/interfaces/meson.build +++ b/src/interfaces/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # NB: libpq is entered directly from the toplevel meson file subdir('ecpg') diff --git a/src/makefiles/Makefile.aix b/src/makefiles/Makefile.aix deleted file mode 100644 index dd16a7a0378b6..0000000000000 --- a/src/makefiles/Makefile.aix +++ /dev/null @@ -1,39 +0,0 @@ -# MAKE_EXPORTS is required for svr4 loaders that want a file of -# symbol names to tell them what to export/import. -MAKE_EXPORTS= true - -# -blibpath must contain ALL directories where we should look for libraries -libpath := $(shell echo $(subst -L,:,$(filter -L/%,$(LDFLAGS))) | sed -e's/ //g'):/usr/lib:/lib - -# when building with gcc, need to make sure that libgcc can be found -ifeq ($(GCC), yes) -libpath := $(libpath):$(dir $(shell gcc -print-libgcc-file-name)) -endif - -rpath = -Wl,-blibpath:'$(rpathdir)$(libpath)' - -LDFLAGS_SL += -Wl,-bnoentry -Wl,-H512 -Wl,-bM:SRE - -# gcc needs to know it's building a shared lib, otherwise it'll not emit -# correct code / link to the right support libraries -ifeq ($(GCC), yes) -LDFLAGS_SL += -shared -endif - -# env var name to use in place of LD_LIBRARY_PATH -ld_library_path_var = LIBPATH - - -POSTGRES_IMP= postgres.imp - -ifdef PGXS -BE_DLLLIBS= -Wl,-bI:$(pkglibdir)/$(POSTGRES_IMP) -else -BE_DLLLIBS= -Wl,-bI:$(top_builddir)/src/backend/$(POSTGRES_IMP) -endif - -MKLDEXPORT_DIR=src/backend/port/aix -MKLDEXPORT=$(top_srcdir)/$(MKLDEXPORT_DIR)/mkldexport.sh - -%$(DLSUFFIX): %.o - $(CC) $(CFLAGS) $*.o $(LDFLAGS) $(LDFLAGS_SL) -o $@ $(BE_DLLLIBS) diff --git a/src/makefiles/meson.build b/src/makefiles/meson.build index 13045cbd6e494..5618050b30630 100644 --- a/src/makefiles/meson.build +++ b/src/makefiles/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group ### Compute pgxs_data, used in src/meson.build to generate Makefile.global ### etc, that's complete enough for PGXS to work. @@ -52,9 +52,9 @@ pgxs_kv = { 'abs_top_builddir': meson.build_root(), 'abs_top_srcdir': meson.source_root(), - 'enable_thread_safety': 'yes', 'enable_rpath': get_option('rpath') ? 'yes' : 'no', 'enable_nls': libintl.found() ? 'yes' : 'no', + 'enable_injection_points': get_option('injection_points') ? 'yes' : 'no', 'enable_tap_tests': tap_tests_enabled ? 'yes' : 'no', 'enable_debug': get_option('debug') ? 'yes' : 'no', 'enable_coverage': 'no', @@ -100,8 +100,10 @@ pgxs_kv = { ' '.join(cflags_no_decl_after_statement), 'CFLAGS_CRC': ' '.join(cflags_crc), + 'CFLAGS_POPCNT': ' '.join(cflags_popcnt), 'CFLAGS_UNROLL_LOOPS': ' '.join(unroll_loops_cflags), 'CFLAGS_VECTORIZE': ' '.join(vectorize_cflags), + 'CFLAGS_XSAVE': ' '.join(cflags_xsave), 'LDFLAGS': var_ldflags, 'LDFLAGS_EX': var_ldflags_ex, @@ -177,7 +179,7 @@ pgxs_empty = [ 'WANTED_LANGUAGES', # Not needed because we don't build the server / PLs with the generated makefile - 'LIBOBJS', 'PG_CRC32C_OBJS', 'TAS', + 'LIBOBJS', 'PG_CRC32C_OBJS', 'PG_POPCNT_OBJS', 'TAS', 'DTRACEFLAGS', # only server has dtrace probes 'perl_archlibexp', 'perl_embed_ccflags', 'perl_embed_ldflags', 'perl_includespec', 'perl_privlibexp', diff --git a/src/makefiles/pgxs.mk b/src/makefiles/pgxs.mk index 7ba8d5bc9806c..0de3737e789b4 100644 --- a/src/makefiles/pgxs.mk +++ b/src/makefiles/pgxs.mk @@ -391,7 +391,7 @@ ifdef MODULE_big clean: clean-lib endif -distclean maintainer-clean: clean +distclean: clean ifdef REGRESS diff --git a/src/meson.build b/src/meson.build index bceeca70f90d2..65c7d17d08f09 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # libraries that other subsystems might depend upon first, in their respective # dependency order diff --git a/src/nls-global.mk b/src/nls-global.mk index f21bd5ed55519..dfff472cb3f48 100644 --- a/src/nls-global.mk +++ b/src/nls-global.mk @@ -171,7 +171,7 @@ all: all-po install: install-po installdirs: installdirs-po uninstall: uninstall-po -clean distclean maintainer-clean: clean-po +clean distclean: clean-po .PHONY: all-po install-po installdirs-po uninstall-po clean-po \ init-po update-po diff --git a/src/pl/meson.build b/src/pl/meson.build index 3ea0fecf7e123..0d62a758661af 100644 --- a/src/pl/meson.build +++ b/src/pl/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group subdir('plpgsql') diff --git a/src/pl/plperl/GNUmakefile b/src/pl/plperl/GNUmakefile index 51f8890d15d98..558c764aadb2a 100644 --- a/src/pl/plperl/GNUmakefile +++ b/src/pl/plperl/GNUmakefile @@ -60,10 +60,10 @@ ifeq ($(PORTNAME), cygwin) SHLIB_LINK += -Wl,--export-all-symbols endif -REGRESS_OPTS = --dbname=$(PL_TESTDB) +REGRESS_OPTS = --dbname=$(PL_TESTDB) --dlpath=$(top_builddir)/src/test/regress REGRESS = plperl_setup plperl plperl_lc plperl_trigger plperl_shared \ plperl_elog plperl_util plperl_init plperlu plperl_array \ - plperl_call plperl_transaction + plperl_call plperl_transaction plperl_env # if Perl can support two interpreters in one backend, # test plperl-and-plperlu cases ifneq ($(PERL),) @@ -85,7 +85,7 @@ plperl_opmask.h: plperl_opmask.pl perlchunks.h: $(PERLCHUNKS) @if [ x"$(perl_privlibexp)" = x"" ]; then echo "configure switch --with-perl was not specified."; exit 1; fi - $(PERL) $(srcdir)/text2macro.pl --strip='^(\#.*|\s*)$$' $^ > $@ + $(PERL) $(srcdir)/text2macro.pl $^ > $@ all: all-lib @@ -108,11 +108,11 @@ uninstall: uninstall-lib uninstall-data install-data: installdirs $(INSTALL_DATA) $(addprefix $(srcdir)/, $(DATA)) '$(DESTDIR)$(datadir)/extension/' - $(INSTALL_DATA) $(srcdir)/plperl.h $(srcdir)/ppport.h '$(DESTDIR)$(includedir_server)' + $(INSTALL_DATA) $(srcdir)/plperl.h $(srcdir)/plperl_system.h $(srcdir)/ppport.h '$(DESTDIR)$(includedir_server)' uninstall-data: rm -f $(addprefix '$(DESTDIR)$(datadir)/extension'/, $(notdir $(DATA))) - rm -f $(addprefix '$(DESTDIR)$(includedir_server)'/, plperl.h ppport.h) + rm -f $(addprefix '$(DESTDIR)$(includedir_server)'/, plperl.h plperl_system.h ppport.h) .PHONY: install-data uninstall-data @@ -127,7 +127,7 @@ installcheck: submake submake: $(MAKE) -C $(top_builddir)/src/test/regress pg_regress$(X) -clean distclean maintainer-clean: clean-lib +clean distclean: clean-lib rm -f SPI.c Util.c $(OBJS) perlchunks.h plperl_opmask.h rm -rf $(pg_regress_clean_files) ifeq ($(PORTNAME), win32) diff --git a/src/pl/plperl/README b/src/pl/plperl/README index e61dd57f53a47..bdf2dc05b0ed8 100644 --- a/src/pl/plperl/README +++ b/src/pl/plperl/README @@ -6,5 +6,4 @@ To build from this directory use 'make all; make install'. libperl must have been built as a shared library, which is usually not the case in standard installations. -Consult the PostgreSQL User's Guide and the INSTALL file in the -top-level directory of the source distribution for more information. +Consult the PostgreSQL User's Guide for more information. diff --git a/src/pl/plperl/expected/plperl_array.out b/src/pl/plperl/expected/plperl_array.out index bd04a062fb9de..260a55ea7e9b9 100644 --- a/src/pl/plperl/expected/plperl_array.out +++ b/src/pl/plperl/expected/plperl_array.out @@ -61,7 +61,7 @@ select plperl_sum_array('{{{{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}}, {{{{{1,2},{3,4}},{{5,6},{7,8}}},{{{9,10},{11,12}},{{13,14},{15,16}}}}, {{{{17,18},{19,20}},{{21,22},{23,24}}},{{{25,26},{27,28}},{{29,30},{31,32}}}}}}}' ); -ERROR: number of array dimensions (7) exceeds the maximum allowed (6) +ERROR: number of array dimensions exceeds the maximum allowed (6) LINE 1: select plperl_sum_array('{{{{{{{1,2},{3,4}},{{5,6},{7,8}}},{... ^ select plperl_sum_array('{{{1,2,3}, {4,5,6,7}}, {{7,8,9}, {10, 11, 12}}}'); diff --git a/src/pl/plperl/expected/plperl_env.out b/src/pl/plperl/expected/plperl_env.out new file mode 100644 index 0000000000000..f777c072b5690 --- /dev/null +++ b/src/pl/plperl/expected/plperl_env.out @@ -0,0 +1,55 @@ +-- +-- Test the environment setting +-- +-- directory path and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set regresslib :libdir '/regress' :dlsuffix +CREATE FUNCTION get_environ() + RETURNS text[] + AS :'regresslib', 'get_environ' + LANGUAGE C STRICT; +-- fetch the process environment +CREATE FUNCTION process_env () RETURNS text[] +LANGUAGE plpgsql AS +$$ + +declare + res text[]; + tmp text[]; + f record; +begin + for f in select unnest(get_environ()) as t loop + tmp := regexp_split_to_array(f.t, '='); + if array_length(tmp, 1) = 2 then + res := res || tmp; + end if; + end loop; + return res; +end + +$$; +-- plperl should not be able to affect the process environment +DO +$$ + $ENV{TEST_PLPERL_ENV_FOO} = "shouldfail"; + untie %ENV; + $ENV{TEST_PLPERL_ENV_FOO} = "testval"; + my $penv = spi_exec_query("select unnest(process_env()) as pe"); + my %received; + for (my $f = 0; $f < $penv->{processed}; $f += 2) + { + my $k = $penv->{rows}[$f]->{pe}; + my $v = $penv->{rows}[$f+1]->{pe}; + $received{$k} = $v; + } + unless (exists $received{TEST_PLPERL_ENV_FOO}) + { + elog(NOTICE, "environ unaffected") + } + +$$ LANGUAGE plperl; +WARNING: attempted alteration of $ENV{TEST_PLPERL_ENV_FOO} at line 12. +NOTICE: environ unaffected +-- clean up to simplify cross-version upgrade testing +DROP FUNCTION get_environ(); diff --git a/src/pl/plperl/meson.build b/src/pl/plperl/meson.build index 6a28f40a119c9..006f7356e6b22 100644 --- a/src/pl/plperl/meson.build +++ b/src/pl/plperl/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not perl_dep.found() subdir_done() @@ -17,7 +17,7 @@ plperl_sources += custom_target('perlchunks.h', input: files('plc_perlboot.pl', 'plc_trusted.pl'), output: 'perlchunks.h', capture: true, - command: [perl, files('text2macro.pl'), '--strip=^(\#.*|\s*)$', '@INPUT@'] + command: [perl, files('text2macro.pl'), '@INPUT@'] ) plperl_sources += custom_target('plperl_opmask.h', @@ -71,6 +71,7 @@ install_data( install_headers( 'plperl.h', + 'plperl_system.h', 'ppport.h', install_dir: dir_include_server, ) @@ -93,7 +94,9 @@ tests += { 'plperl_array', 'plperl_call', 'plperl_transaction', + 'plperl_env', ], + 'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'], }, } diff --git a/src/pl/plperl/plc_perlboot.pl b/src/pl/plperl/plc_perlboot.pl index 13298013d3961..f6593f032a9fc 100644 --- a/src/pl/plperl/plc_perlboot.pl +++ b/src/pl/plperl/plc_perlboot.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # src/pl/plperl/plc_perlboot.pl use strict; -use warnings; +use warnings FATAL => 'all'; use vars qw(%_SHARED $_TD); @@ -58,7 +58,7 @@ sub ::encode_array_constructor package PostgreSQL::InServer; ## no critic (RequireFilenameMatchesPackage) #>>> use strict; - use warnings; + use warnings FATAL => 'all'; sub plperl_warn { @@ -107,7 +107,7 @@ sub ::encode_array_constructor package PostgreSQL::InServer::ARRAY; use strict; - use warnings; + use warnings FATAL => 'all'; use overload '""' => \&to_str, diff --git a/src/pl/plperl/plc_trusted.pl b/src/pl/plperl/plc_trusted.pl index fd8f3f155f25f..f1bb9922eb862 100644 --- a/src/pl/plperl/plc_trusted.pl +++ b/src/pl/plperl/plc_trusted.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # src/pl/plperl/plc_trusted.pl @@ -30,3 +30,27 @@ package PostgreSQL::InServer::safe; ## no critic (RequireFilenameMatchesPackage) require Carp::Heavy; require warnings; require feature if $] >= 5.010000; + +#<<< protect next line from perltidy so perlcritic annotation works +package PostgreSQL::InServer::WarnEnv; ## no critic (RequireFilenameMatchesPackage) +#>>> + +use strict; +use warnings; +use Tie::Hash; +our @ISA = qw(Tie::StdHash); + +sub STORE { warn "attempted alteration of \$ENV{$_[1]}"; } +sub DELETE { warn "attempted deletion of \$ENV{$_[1]}"; } +sub CLEAR { warn "attempted clearance of ENV hash"; } + +# Remove magic property of %ENV. Changes to this will now not be reflected in +# the process environment. +*main::ENV = {%ENV}; + +# Block %ENV changes from trusted PL/Perl, and warn. We changed %ENV to just a +# normal hash, yet the application may be expecting the usual Perl %ENV +# magic. Blocking and warning avoids silent application breakage. The user can +# untie or otherwise disable this, e.g. if the lost mutation is unimportant +# and modifying the code to stop that mutation would be onerous. +tie %main::ENV, 'PostgreSQL::InServer::WarnEnv', %ENV or die $!; diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 863864253f901..d68ad7be34556 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -1201,8 +1201,8 @@ array_to_datum_internal(AV *av, ArrayBuildState **astatep, if (cur_depth + 1 > MAXDIM) ereport(ERROR, (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg("number of array dimensions (%d) exceeds the maximum allowed (%d)", - cur_depth + 1, MAXDIM))); + errmsg("number of array dimensions exceeds the maximum allowed (%d)", + MAXDIM))); /* OK, add a dimension */ dims[*ndims] = av_len(nav) + 1; (*ndims)++; diff --git a/src/pl/plperl/plperl.h b/src/pl/plperl/plperl.h index 5d8e51089a548..3ee278ff02944 100644 --- a/src/pl/plperl/plperl.h +++ b/src/pl/plperl/plperl.h @@ -6,7 +6,7 @@ * This should be included _AFTER_ postgres.h and system include files, as * well as headers that could in turn include system headers. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1995, Regents of the University of California * * src/pl/plperl/plperl.h @@ -18,200 +18,11 @@ /* defines free() by way of system headers, so must be included before perl.h */ #include "mb/pg_wchar.h" -/* stop perl headers from hijacking stdio and other stuff on Windows */ -#ifdef WIN32 -#define WIN32IO_IS_STDIO -#endif /* WIN32 */ - /* - * Supply a value of PERL_UNUSED_DECL that will satisfy gcc - the one - * perl itself supplies doesn't seem to. + * Pull in Perl headers via a wrapper header, to control the scope of + * the system_header pragma therein. */ -#define PERL_UNUSED_DECL pg_attribute_unused() - -/* - * Sometimes perl carefully scribbles on our *printf macros. - * So we undefine them here and redefine them after it's done its dirty deed. - */ -#undef vsnprintf -#undef snprintf -#undef vsprintf -#undef sprintf -#undef vfprintf -#undef fprintf -#undef vprintf -#undef printf - -/* - * Perl scribbles on the "_" macro too. - */ -#undef _ - -/* - * ActivePerl 5.18 and later are MinGW-built, and their headers use GCC's - * __inline__. Translate to something MSVC recognizes. Also, perl.h sometimes - * defines isnan, so undefine it here and put back the definition later if - * perl.h doesn't. - */ -#ifdef _MSC_VER -#define __inline__ inline -#ifdef isnan -#undef isnan -#endif -/* Work around for using MSVC and Strawberry Perl >= 5.30. */ -#define __builtin_expect(expr, val) (expr) -#endif - -/* - * Regarding bool, both PostgreSQL and Perl might use stdbool.h or not, - * depending on configuration. If both agree, things are relatively harmless. - * If not, things get tricky. If PostgreSQL does but Perl does not, define - * HAS_BOOL here so that Perl does not redefine bool; this avoids compiler - * warnings. If PostgreSQL does not but Perl does, we need to undefine bool - * after we include the Perl headers; see below. - */ -#ifdef PG_USE_STDBOOL -#define HAS_BOOL 1 -#endif - -/* - * Newer versions of the perl headers trigger a lot of warnings with our - * compiler flags (at least -Wdeclaration-after-statement, - * -Wshadow=compatible-local are known to be problematic). The system_header - * pragma hides warnings from within the rest of this file, if supported. - */ -#ifdef HAVE_PRAGMA_GCC_SYSTEM_HEADER -#pragma GCC system_header -#endif - -/* - * Get the basic Perl API. We use PERL_NO_GET_CONTEXT mode so that our code - * can compile against MULTIPLICITY Perl builds without including XSUB.h. - */ -#define PERL_NO_GET_CONTEXT -#include "EXTERN.h" -#include "perl.h" - -/* - * We want to include XSUB.h only within .xs files, because on some platforms - * it undesirably redefines a lot of libc functions. But it must appear - * before ppport.h, so use a #define flag to control inclusion here. - */ -#ifdef PG_NEED_PERL_XSUB_H -/* - * On Windows, win32_port.h defines macros for a lot of these same functions. - * To avoid compiler warnings when XSUB.h redefines them, #undef our versions. - */ -#ifdef WIN32 -#undef accept -#undef bind -#undef connect -#undef fopen -#undef fstat -#undef kill -#undef listen -#undef lstat -#undef mkdir -#undef open -#undef putenv -#undef recv -#undef rename -#undef select -#undef send -#undef socket -#undef stat -#undef unlink -#endif - -#include "XSUB.h" -#endif - -/* put back our *printf macros ... this must match src/include/port.h */ -#ifdef vsnprintf -#undef vsnprintf -#endif -#ifdef snprintf -#undef snprintf -#endif -#ifdef vsprintf -#undef vsprintf -#endif -#ifdef sprintf -#undef sprintf -#endif -#ifdef vfprintf -#undef vfprintf -#endif -#ifdef fprintf -#undef fprintf -#endif -#ifdef vprintf -#undef vprintf -#endif -#ifdef printf -#undef printf -#endif - -#define vsnprintf pg_vsnprintf -#define snprintf pg_snprintf -#define vsprintf pg_vsprintf -#define sprintf pg_sprintf -#define vfprintf pg_vfprintf -#define fprintf pg_fprintf -#define vprintf pg_vprintf -#define printf(...) pg_printf(__VA_ARGS__) - -/* - * Put back "_" too; but rather than making it just gettext() as the core - * code does, make it dgettext() so that the right things will happen in - * loadable modules (if they've set up TEXTDOMAIN correctly). Note that - * we can't just set TEXTDOMAIN here, because this file is used by more - * extensions than just PL/Perl itself. - */ -#undef _ -#define _(x) dgettext(TEXTDOMAIN, x) - -/* put back the definition of isnan if needed */ -#ifdef _MSC_VER -#ifndef isnan -#define isnan(x) _isnan(x) -#endif -#endif - -/* perl version and platform portability */ -#include "ppport.h" - -/* - * perl might have included stdbool.h. If we also did that earlier (see c.h), - * then that's fine. If not, we probably rejected it for some reason. In - * that case, undef bool and proceed with our own bool. (Note that stdbool.h - * makes bool a macro, but our own replacement is a typedef, so the undef - * makes ours visible again). - */ -#ifndef PG_USE_STDBOOL -#ifdef bool -#undef bool -#endif -#endif - -/* supply HeUTF8 if it's missing - ppport.h doesn't supply it, unfortunately */ -#ifndef HeUTF8 -#define HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \ - SvUTF8(HeKEY_sv(he)) : \ - (U32)HeKUTF8(he)) -#endif - -/* supply GvCV_set if it's missing - ppport.h doesn't supply it, unfortunately */ -#ifndef GvCV_set -#define GvCV_set(gv, cv) (GvCV(gv) = cv) -#endif - -/* Perl 5.19.4 changed array indices from I32 to SSize_t */ -#if PERL_BCDVERSION >= 0x5019004 -#define AV_SIZE_MAX SSize_t_MAX -#else -#define AV_SIZE_MAX I32_MAX -#endif +#include "plperl_system.h" /* declare routines from plperl.c for access by .xs files */ HV *plperl_spi_exec(char *, int); diff --git a/src/pl/plperl/plperl_opmask.pl b/src/pl/plperl/plperl_opmask.pl index 26ac717770173..e935aab5f8697 100644 --- a/src/pl/plperl/plperl_opmask.pl +++ b/src/pl/plperl/plperl_opmask.pl @@ -1,9 +1,9 @@ #!perl -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use Opcode qw(opset opset_to_ops opdesc); diff --git a/src/pl/plperl/plperl_system.h b/src/pl/plperl/plperl_system.h new file mode 100644 index 0000000000000..c3b66ee2623a8 --- /dev/null +++ b/src/pl/plperl/plperl_system.h @@ -0,0 +1,216 @@ +/*------------------------------------------------------------------------- + * + * plperl_system.h + * Pull in Perl's system header files. + * + * We break this out as a separate header file to precisely control + * the scope of the "system_header" pragma. No Postgres-specific + * declarations should be put here. However, we do include some stuff + * that is meant to prevent conflicts between our code and Perl. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1995, Regents of the University of California + * + * src/pl/plperl/plperl_system.h + */ + +#ifndef PL_PERL_SYSTEM_H +#define PL_PERL_SYSTEM_H + +/* + * Newer versions of the perl headers trigger a lot of warnings with our + * preferred compiler flags (at least -Wdeclaration-after-statement, + * -Wshadow=compatible-local are known to be problematic). The system_header + * pragma hides warnings from within the rest of this file, if supported. + */ +#ifdef HAVE_PRAGMA_GCC_SYSTEM_HEADER +#pragma GCC system_header +#endif + +/* stop perl headers from hijacking stdio and other stuff on Windows */ +#ifdef WIN32 +#define WIN32IO_IS_STDIO +#endif /* WIN32 */ + +/* + * Supply a value of PERL_UNUSED_DECL that will satisfy gcc - the one + * perl itself supplies doesn't seem to. + */ +#define PERL_UNUSED_DECL pg_attribute_unused() + +/* + * Sometimes perl carefully scribbles on our *printf macros. + * So we undefine them here and redefine them after it's done its dirty deed. + */ +#undef vsnprintf +#undef snprintf +#undef vsprintf +#undef sprintf +#undef vfprintf +#undef fprintf +#undef vprintf +#undef printf + +/* + * Perl scribbles on the "_" macro too. + */ +#undef _ + +/* + * ActivePerl 5.18 and later are MinGW-built, and their headers use GCC's + * __inline__. Translate to something MSVC recognizes. Also, perl.h sometimes + * defines isnan, so undefine it here and put back the definition later if + * perl.h doesn't. + */ +#ifdef _MSC_VER +#define __inline__ inline +#ifdef isnan +#undef isnan +#endif +/* Work around for using MSVC and Strawberry Perl >= 5.30. */ +#define __builtin_expect(expr, val) (expr) +#endif + +/* + * Regarding bool, both PostgreSQL and Perl might use stdbool.h or not, + * depending on configuration. If both agree, things are relatively harmless. + * If not, things get tricky. If PostgreSQL does but Perl does not, define + * HAS_BOOL here so that Perl does not redefine bool; this avoids compiler + * warnings. If PostgreSQL does not but Perl does, we need to undefine bool + * after we include the Perl headers; see below. + */ +#ifdef PG_USE_STDBOOL +#define HAS_BOOL 1 +#endif + +/* + * Get the basic Perl API. We use PERL_NO_GET_CONTEXT mode so that our code + * can compile against MULTIPLICITY Perl builds without including XSUB.h. + */ +#define PERL_NO_GET_CONTEXT +#include "EXTERN.h" +#include "perl.h" + +/* + * We want to include XSUB.h only within .xs files, because on some platforms + * it undesirably redefines a lot of libc functions. But it must appear + * before ppport.h, so use a #define flag to control inclusion here. + */ +#ifdef PG_NEED_PERL_XSUB_H +/* + * On Windows, win32_port.h defines macros for a lot of these same functions. + * To avoid compiler warnings when XSUB.h redefines them, #undef our versions. + */ +#ifdef WIN32 +#undef accept +#undef bind +#undef connect +#undef fopen +#undef fstat +#undef kill +#undef listen +#undef lseek +#undef lstat +#undef mkdir +#undef open +#undef putenv +#undef recv +#undef rename +#undef select +#undef send +#undef socket +#undef stat +#undef unlink +#endif + +#include "XSUB.h" +#endif + +/* put back our *printf macros ... this must match src/include/port.h */ +#ifdef vsnprintf +#undef vsnprintf +#endif +#ifdef snprintf +#undef snprintf +#endif +#ifdef vsprintf +#undef vsprintf +#endif +#ifdef sprintf +#undef sprintf +#endif +#ifdef vfprintf +#undef vfprintf +#endif +#ifdef fprintf +#undef fprintf +#endif +#ifdef vprintf +#undef vprintf +#endif +#ifdef printf +#undef printf +#endif + +#define vsnprintf pg_vsnprintf +#define snprintf pg_snprintf +#define vsprintf pg_vsprintf +#define sprintf pg_sprintf +#define vfprintf pg_vfprintf +#define fprintf pg_fprintf +#define vprintf pg_vprintf +#define printf(...) pg_printf(__VA_ARGS__) + +/* + * Put back "_" too; but rather than making it just gettext() as the core + * code does, make it dgettext() so that the right things will happen in + * loadable modules (if they've set up TEXTDOMAIN correctly). Note that + * we can't just set TEXTDOMAIN here, because this file is used by more + * extensions than just PL/Perl itself. + */ +#undef _ +#define _(x) dgettext(TEXTDOMAIN, x) + +/* put back the definition of isnan if needed */ +#ifdef _MSC_VER +#ifndef isnan +#define isnan(x) _isnan(x) +#endif +#endif + +/* perl version and platform portability */ +#include "ppport.h" + +/* + * perl might have included stdbool.h. If we also did that earlier (see c.h), + * then that's fine. If not, we probably rejected it for some reason. In + * that case, undef bool and proceed with our own bool. (Note that stdbool.h + * makes bool a macro, but our own replacement is a typedef, so the undef + * makes ours visible again). + */ +#ifndef PG_USE_STDBOOL +#ifdef bool +#undef bool +#endif +#endif + +/* supply HeUTF8 if it's missing - ppport.h doesn't supply it, unfortunately */ +#ifndef HeUTF8 +#define HeUTF8(he) ((HeKLEN(he) == HEf_SVKEY) ? \ + SvUTF8(HeKEY_sv(he)) : \ + (U32)HeKUTF8(he)) +#endif + +/* supply GvCV_set if it's missing - ppport.h doesn't supply it, unfortunately */ +#ifndef GvCV_set +#define GvCV_set(gv, cv) (GvCV(gv) = cv) +#endif + +/* Perl 5.19.4 changed array indices from I32 to SSize_t */ +#if PERL_BCDVERSION >= 0x5019004 +#define AV_SIZE_MAX SSize_t_MAX +#else +#define AV_SIZE_MAX I32_MAX +#endif + +#endif /* PL_PERL_SYSTEM_H */ diff --git a/src/pl/plperl/po/de.po b/src/pl/plperl/po/de.po index 91260febaee71..af172bc8a80e9 100644 --- a/src/pl/plperl/po/de.po +++ b/src/pl/plperl/po/de.po @@ -1,16 +1,16 @@ # German message translation file for plperl # Copyright (C) 2022 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Peter Eisentraut , 2009 - 2022. +# Peter Eisentraut , 2009 - 2024. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-08 12:09+0000\n" -"PO-Revision-Date: 2022-04-08 14:39+0200\n" +"POT-Creation-Date: 2024-02-11 19:39+0000\n" +"PO-Revision-Date: 2024-02-11 21:45+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -18,210 +18,210 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: plperl.c:408 +#: plperl.c:405 msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "Wenn wahr, dann wird vertrauenswürdiger und nicht vertrauenswürdiger Perl-Code im »strict«-Modus kompiliert." -#: plperl.c:422 +#: plperl.c:419 msgid "Perl initialization code to execute when a Perl interpreter is initialized." msgstr "Perl-Initialisierungscode, der ausgeführt wird, wenn der Perl-Interpreter initialisiert wird." -#: plperl.c:444 +#: plperl.c:441 msgid "Perl initialization code to execute once when plperl is first used." msgstr "Perl-Initialisierungscode, der ausgeführt wird, wenn plperl zum ersten Mal benutzt wird." -#: plperl.c:452 +#: plperl.c:449 msgid "Perl initialization code to execute once when plperlu is first used." msgstr "Perl-Initialisierungscode, der ausgeführt wird, wenn plperlu zum ersten Mal benutzt wird." -#: plperl.c:646 +#: plperl.c:643 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "auf dieser Plattform können nicht mehrere Perl-Interpreter angelegt werden" -#: plperl.c:669 plperl.c:853 plperl.c:859 plperl.c:976 plperl.c:988 -#: plperl.c:1031 plperl.c:1054 plperl.c:2138 plperl.c:2246 plperl.c:2314 -#: plperl.c:2377 +#: plperl.c:666 plperl.c:850 plperl.c:856 plperl.c:973 plperl.c:985 +#: plperl.c:1028 plperl.c:1051 plperl.c:2151 plperl.c:2259 plperl.c:2327 +#: plperl.c:2390 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:670 +#: plperl.c:667 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "beim Ausführen von PostgreSQL::InServer::SPI::bootstrap" -#: plperl.c:854 +#: plperl.c:851 #, c-format msgid "while parsing Perl initialization" msgstr "beim Parsen der Perl-Initialisierung" -#: plperl.c:860 +#: plperl.c:857 #, c-format msgid "while running Perl initialization" msgstr "beim Ausführen der Perl-Initialisierung" -#: plperl.c:977 +#: plperl.c:974 #, c-format msgid "while executing PLC_TRUSTED" msgstr "beim Ausführen von PLC_TRUSTED" -#: plperl.c:989 +#: plperl.c:986 #, c-format msgid "while executing utf8fix" msgstr "beim Ausführen von utf8fix" -#: plperl.c:1032 +#: plperl.c:1029 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "beim Ausführen von plperl.on_plperl_init" -#: plperl.c:1055 +#: plperl.c:1052 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "beim Ausführen von plperl.on_plperlu_init" -#: plperl.c:1101 plperl.c:1791 +#: plperl.c:1098 plperl.c:1804 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "Perl-Hash enthält nicht existierende Spalte »%s«" -#: plperl.c:1106 plperl.c:1796 +#: plperl.c:1103 plperl.c:1809 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "Systemattribut »%s« kann nicht gesetzt werden" -#: plperl.c:1194 -#, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "Anzahl der Arraydimensionen (%d) überschreitet erlaubtes Maximum (%d)" - -#: plperl.c:1206 plperl.c:1223 +#: plperl.c:1199 plperl.c:1214 plperl.c:1231 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "mehrdimensionale Arrays müssen Arraysausdrücke mit gleicher Anzahl Dimensionen haben" -#: plperl.c:1259 +#: plperl.c:1204 +#, c-format +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "Anzahl der Arraydimensionen überschreitet erlaubtes Maximum (%d)" + +#: plperl.c:1274 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "kann Perl-Array nicht in Nicht-Array-Typ %s umwandeln" -#: plperl.c:1362 +#: plperl.c:1375 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "kann Perl-Hash nicht in nicht zusammengesetzten Typ %s umwandeln" -#: plperl.c:1384 plperl.c:3304 +#: plperl.c:1397 plperl.c:3315 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "Funktion, die einen Record zurückgibt, in einem Zusammenhang aufgerufen, der Typ record nicht verarbeiten kann" -#: plperl.c:1445 +#: plperl.c:1458 #, c-format msgid "lookup failed for type %s" msgstr "Nachschlagen nach Typ %s fehlgeschlagen" -#: plperl.c:1766 +#: plperl.c:1779 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} existiert nicht" -#: plperl.c:1770 +#: plperl.c:1783 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} ist keine Hash-Referenz" -#: plperl.c:1801 +#: plperl.c:1814 #, c-format msgid "cannot set generated column \"%s\"" msgstr "kann generierte Spalte »%s« nicht setzen" -#: plperl.c:2013 plperl.c:2854 +#: plperl.c:2026 plperl.c:2867 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "PL/Perl-Funktionen können keinen Rückgabetyp %s haben" -#: plperl.c:2026 plperl.c:2893 +#: plperl.c:2039 plperl.c:2906 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "PL/Perl-Funktionen können Typ %s nicht annehmen" -#: plperl.c:2143 +#: plperl.c:2156 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "keine CODE-Referenz erhalten beim Kompilieren von Funktion »%s«" -#: plperl.c:2234 +#: plperl.c:2247 #, c-format msgid "didn't get a return item from function" msgstr "keinen Rückgabewert aus Funktion erhalten" -#: plperl.c:2278 plperl.c:2345 +#: plperl.c:2291 plperl.c:2358 #, c-format msgid "couldn't fetch $_TD" msgstr "konnte $_TD nicht auslesen" -#: plperl.c:2302 plperl.c:2365 +#: plperl.c:2315 plperl.c:2378 #, c-format msgid "didn't get a return item from trigger function" msgstr "keinen Rückgabewert aus Triggerfunktion erhalten" -#: plperl.c:2423 +#: plperl.c:2436 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "Funktion mit Mengenergebnis in einem Zusammenhang aufgerufen, der keine Mengenergebnisse verarbeiten kann" -#: plperl.c:2428 +#: plperl.c:2441 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "Materialisierungsmodus wird benötigt, ist aber in diesem Zusammenhang nicht erlaubt" -#: plperl.c:2472 +#: plperl.c:2485 #, c-format msgid "set-returning PL/Perl function must return reference to array or use return_next" msgstr "PL/Perl-Funktionen mit Mengenergebnis müssen eine Referenz auf ein Array zurückgeben oder return_next verwenden" -#: plperl.c:2593 +#: plperl.c:2606 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "geänderte Zeile im DELETE-Trigger wird ignoriert" -#: plperl.c:2601 +#: plperl.c:2614 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "Ergebnis einer PL/Perl-Triggerfunktion muss undef, »SKIP« oder »MODIFY« sein" -#: plperl.c:2849 +#: plperl.c:2862 #, c-format msgid "trigger functions can only be called as triggers" msgstr "Triggerfunktionen können nur als Trigger aufgerufen werden" -#: plperl.c:3209 +#: plperl.c:3220 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "Anfrageergebnis hat zu viele Zeilen, um in ein Perl-Array zu passen" -#: plperl.c:3281 +#: plperl.c:3292 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "return_next kann nur in einer Funktion mit SETOF-Rückgabetyp verwendet werden" -#: plperl.c:3355 +#: plperl.c:3366 #, c-format msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" msgstr "PL/Perl-Funktion, die SETOF eines zusammengesetzten Typs zurückgibt, muss return_next mit einer Referenz auf ein Hash aufrufen" -#: plperl.c:4137 +#: plperl.c:4148 #, c-format msgid "PL/Perl function \"%s\"" msgstr "PL/Perl-Funktion »%s«" -#: plperl.c:4149 +#: plperl.c:4160 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "Kompilierung der PL/Perl-Funktion »%s«" -#: plperl.c:4158 +#: plperl.c:4169 #, c-format msgid "PL/Perl anonymous code block" msgstr "anonymer PL/Perl-Codeblock" diff --git a/src/pl/plperl/po/es.po b/src/pl/plperl/po/es.po index f0ca724b25a58..4846603c139c7 100644 --- a/src/pl/plperl/po/es.po +++ b/src/pl/plperl/po/es.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plperl (PostgreSQL) 15\n" +"Project-Id-Version: plperl (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:09+0000\n" -"PO-Revision-Date: 2022-10-20 09:06+0200\n" +"POT-Creation-Date: 2025-02-16 19:39+0000\n" +"PO-Revision-Date: 2024-11-16 14:24+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -100,8 +100,8 @@ msgstr "los arrays multidimensionales deben tener expresiones de arrays con dime #: plperl.c:1204 #, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "el número de dimensiones del array (%d) excede el máximo permitido (%d)" +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "el número de dimensiones del array excede el máximo permitido (%d)" #: plperl.c:1274 #, c-format diff --git a/src/pl/plperl/po/fr.po b/src/pl/plperl/po/fr.po index fcb6d67fa051a..ab1859f557e30 100644 --- a/src/pl/plperl/po/fr.po +++ b/src/pl/plperl/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-12 05:16+0000\n" -"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"POT-Creation-Date: 2024-08-22 10:09+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,246 +19,226 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: plperl.c:408 +#: plperl.c:405 msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "" "Si true, le code Perl de confiance et sans confiance sera compilé en mode\n" "strict." -#: plperl.c:422 +#: plperl.c:419 msgid "Perl initialization code to execute when a Perl interpreter is initialized." msgstr "" "Code d'initialisation Perl à exécuter lorsque un interpréteur Perl est\n" "initialisé." -#: plperl.c:444 +#: plperl.c:441 msgid "Perl initialization code to execute once when plperl is first used." msgstr "Code d'initialisation Perl à exécuter lorsque plperl est utilisé pour la première fois." -#: plperl.c:452 +#: plperl.c:449 msgid "Perl initialization code to execute once when plperlu is first used." msgstr "Code d'initialisation Perl à exécuter lorsque plperlu est utilisé pour la première fois." -#: plperl.c:646 +#: plperl.c:643 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "ne peut pas allouer plusieurs interpréteurs Perl sur cette plateforme" -#: plperl.c:669 plperl.c:853 plperl.c:859 plperl.c:976 plperl.c:988 -#: plperl.c:1031 plperl.c:1054 plperl.c:2138 plperl.c:2246 plperl.c:2314 -#: plperl.c:2377 +#: plperl.c:666 plperl.c:850 plperl.c:856 plperl.c:973 plperl.c:985 +#: plperl.c:1028 plperl.c:1051 plperl.c:2151 plperl.c:2259 plperl.c:2327 +#: plperl.c:2390 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:670 +#: plperl.c:667 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "lors de l'exécution de PostgreSQL::InServer::SPI::bootstrap" -#: plperl.c:854 +#: plperl.c:851 #, c-format msgid "while parsing Perl initialization" msgstr "lors de l'analyse de l'initialisation de perl" -#: plperl.c:860 +#: plperl.c:857 #, c-format msgid "while running Perl initialization" msgstr "lors de l'exécution de l'initialisation de perl" -#: plperl.c:977 +#: plperl.c:974 #, c-format msgid "while executing PLC_TRUSTED" msgstr "lors de l'exécution de PLC_TRUSTED" -#: plperl.c:989 +#: plperl.c:986 #, c-format msgid "while executing utf8fix" msgstr "lors de l'exécution de utf8fix" -#: plperl.c:1032 +#: plperl.c:1029 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "lors de l'exécution de plperl.on_plperl_init" -#: plperl.c:1055 +#: plperl.c:1052 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "lors de l'exécution de plperl.on_plperlu_init" -#: plperl.c:1101 plperl.c:1791 +#: plperl.c:1098 plperl.c:1804 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "Le hachage Perl contient la colonne « %s » inexistante" -#: plperl.c:1106 plperl.c:1796 +#: plperl.c:1103 plperl.c:1809 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "ne peut pas initialiser l'attribut système « %s »" -#: plperl.c:1194 -#, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "le nombre de dimensions du tableau (%d) dépasse le maximum autorisé (%d)" - -#: plperl.c:1206 plperl.c:1223 +#: plperl.c:1199 plperl.c:1214 plperl.c:1231 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "" "les tableaux multidimensionnels doivent avoir des expressions de tableaux\n" "avec les dimensions correspondantes" -#: plperl.c:1259 +#: plperl.c:1204 +#, c-format +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "le nombre de dimensions du tableau dépasse le maximum autorisé (%d)" + +#: plperl.c:1274 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "ne peut pas convertir le tableau Perl en un type %s qui n'est pas un tableau" -#: plperl.c:1362 +#: plperl.c:1375 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "ne peut pas convertir le hachage Perl en un type %s non composite" -#: plperl.c:1384 plperl.c:3304 +#: plperl.c:1397 plperl.c:3315 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "" "fonction renvoyant le type record appelée dans un contexte qui ne peut pas\n" "accepter le type record" -#: plperl.c:1445 +#: plperl.c:1458 #, c-format msgid "lookup failed for type %s" msgstr "recherche échouée pour le type %s" -#: plperl.c:1766 +#: plperl.c:1779 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} n'existe pas" -#: plperl.c:1770 +#: plperl.c:1783 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} n'est pas une référence de hachage" -#: plperl.c:1801 +#: plperl.c:1814 #, c-format msgid "cannot set generated column \"%s\"" msgstr "ne peut pas initialiser la colonne générée « %s »" -#: plperl.c:2013 plperl.c:2854 +#: plperl.c:2026 plperl.c:2867 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "Les fonctions PL/perl ne peuvent pas renvoyer le type %s" -#: plperl.c:2026 plperl.c:2893 +#: plperl.c:2039 plperl.c:2906 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "Les fonctions PL/perl ne peuvent pas accepter le type %s" -#: plperl.c:2143 +#: plperl.c:2156 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "n'a pas obtenu une référence CODE lors de la compilation de la fonction « %s »" -#: plperl.c:2234 +#: plperl.c:2247 #, c-format msgid "didn't get a return item from function" msgstr "n'a pas obtenu un élément en retour de la fonction" -#: plperl.c:2278 plperl.c:2345 +#: plperl.c:2291 plperl.c:2358 #, c-format msgid "couldn't fetch $_TD" msgstr "n'a pas pu récupérer $_TD" -#: plperl.c:2302 plperl.c:2365 +#: plperl.c:2315 plperl.c:2378 #, c-format msgid "didn't get a return item from trigger function" msgstr "n'a pas obtenu un élément en retour de la fonction trigger" -#: plperl.c:2423 +#: plperl.c:2436 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "la fonction renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas un ensemble" -#: plperl.c:2428 +#: plperl.c:2441 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "mode matérialisé requis mais interdit dans ce contexte" -#: plperl.c:2472 +#: plperl.c:2485 #, c-format msgid "set-returning PL/Perl function must return reference to array or use return_next" msgstr "" "la fonction PL/perl renvoyant des ensembles doit renvoyer la référence à\n" "un tableau ou utiliser return_next" -#: plperl.c:2593 +#: plperl.c:2606 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "ignore la ligne modifiée dans le trigger DELETE" -#: plperl.c:2601 +#: plperl.c:2614 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "" "le résultat de la fonction trigger PL/perl doit être undef, « SKIP » ou\n" "« MODIFY »" -#: plperl.c:2849 +#: plperl.c:2862 #, c-format msgid "trigger functions can only be called as triggers" msgstr "les fonctions trigger peuvent seulement être appelées par des triggers" -#: plperl.c:3209 +#: plperl.c:3220 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "le résultat de la requête contient trop de lignes pour être intégré dans un tableau Perl" -#: plperl.c:3281 +#: plperl.c:3292 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "ne peut pas utiliser return_next dans une fonction non SETOF" -#: plperl.c:3355 +#: plperl.c:3366 #, c-format msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" msgstr "" "une fonction PL/perl renvoyant des lignes composites doit appeler\n" "return_next avec la référence à un hachage" -#: plperl.c:4137 +#: plperl.c:4148 #, c-format msgid "PL/Perl function \"%s\"" msgstr "fonction PL/Perl « %s »" -#: plperl.c:4149 +#: plperl.c:4160 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "compilation de la fonction PL/Perl « %s »" -#: plperl.c:4158 +#: plperl.c:4169 #, c-format msgid "PL/Perl anonymous code block" msgstr "bloc de code PL/Perl anonyme" - -#~ msgid "PL/Perl function must return reference to hash or array" -#~ msgstr "la fonction PL/perl doit renvoyer la référence à un hachage ou à un tableau" - -#~ msgid "composite-returning PL/Perl function must return reference to hash" -#~ msgstr "" -#~ "la fonction PL/perl renvoyant des valeurs composites doit renvoyer la\n" -#~ "référence à un hachage" - -#~ msgid "creation of Perl function \"%s\" failed: %s" -#~ msgstr "échec de la création de la fonction Perl « %s » : %s" - -#~ msgid "error from Perl function \"%s\": %s" -#~ msgstr "échec dans la fonction Perl « %s » : %s" - -#~ msgid "out of memory" -#~ msgstr "mémoire épuisée" - -#~ msgid "while executing PLC_SAFE_OK" -#~ msgstr "lors de l'exécution de PLC_SAFE_OK" diff --git a/src/pl/plperl/po/ja.po b/src/pl/plperl/po/ja.po index 635bacf5dba2b..7a2f171f413c5 100644 --- a/src/pl/plperl/po/ja.po +++ b/src/pl/plperl/po/ja.po @@ -1,11 +1,11 @@ # Japanese message translation file for plperl -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # Honda Shigehiro , 2012 # msgid "" msgstr "" -"Project-Id-Version: plperl (PostgreSQL 16)\n" +"Project-Id-Version: plperl (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" "POT-Creation-Date: 2022-07-14 10:48+0900\n" "PO-Revision-Date: 2019-06-11 12:08+0900\n" diff --git a/src/pl/plperl/po/ka.po b/src/pl/plperl/po/ka.po index 94ae0c44a53af..47c1b542a2307 100644 --- a/src/pl/plperl/po/ka.po +++ b/src/pl/plperl/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plperl (PostgreSQL) 15\n" +"Project-Id-Version: plperl (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-02 04:39+0000\n" -"PO-Revision-Date: 2022-07-07 10:10+0200\n" +"POT-Creation-Date: 2024-02-11 09:39+0000\n" +"PO-Revision-Date: 2024-02-11 16:27+0100\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,239 +16,216 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.1\n" +"X-Generator: Poedit 3.3.2\n" -#: plperl.c:408 -msgid "" -"If true, trusted and untrusted Perl code will be compiled in strict mode." -msgstr "" -"თუ ჩáƒáƒ áƒ—ულიáƒ, Perl-ის სáƒáƒœáƒ“რრდრáƒáƒ áƒáƒ¡áƒáƒœáƒ“რკáƒáƒ“ი მკáƒáƒªáƒ  რეჟიმში დáƒáƒ™áƒáƒ›áƒžáƒ˜áƒšáƒ“ებáƒ." +#: plperl.c:405 +msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." +msgstr "თუ ჩáƒáƒ áƒ—ულიáƒ, Perl-ის სáƒáƒœáƒ“რრდრáƒáƒ áƒáƒ¡áƒáƒœáƒ“რკáƒáƒ“ი მკáƒáƒªáƒ  რეჟიმში დáƒáƒ™áƒáƒ›áƒžáƒ˜áƒšáƒ“ებáƒ." -#: plperl.c:422 -msgid "" -"Perl initialization code to execute when a Perl interpreter is initialized." -msgstr "" -"Perl-ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒ“ი, რáƒáƒ›áƒ”ლიც ინტერპრეტáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡ " -"ეშვებáƒ." +#: plperl.c:419 +msgid "Perl initialization code to execute when a Perl interpreter is initialized." +msgstr "Perl-ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒ“ი, რáƒáƒ›áƒ”ლიც ინტერპრეტáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡ ეშვებáƒ." -#: plperl.c:444 +#: plperl.c:441 msgid "Perl initialization code to execute once when plperl is first used." -msgstr "" -"Perl-ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒ“ი, რáƒáƒ›áƒ”ლიც plperl-ის პირველი გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ ეშვებáƒ." +msgstr "Perl-ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒ“ი, რáƒáƒ›áƒ”ლიც plperl-ის პირველი გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ ეშვებáƒ." -#: plperl.c:452 +#: plperl.c:449 msgid "Perl initialization code to execute once when plperlu is first used." -msgstr "" -"Perl-ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒ“ი, რáƒáƒ›áƒ”ლიც plperlu-ის პირველი გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ " -"ეშვებáƒ." +msgstr "Perl-ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ კáƒáƒ“ი, რáƒáƒ›áƒ”ლიც plperlu-ის პირველი გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ ეშვებáƒ." -#: plperl.c:646 +#: plperl.c:643 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "áƒáƒ› პლáƒáƒ¢áƒ¤áƒáƒ áƒ›áƒáƒ–ე Perl-ის ბევრი ინტერპრეტáƒáƒ¢áƒáƒ áƒ˜áƒ¡ გáƒáƒ›áƒáƒ§áƒáƒ¤áƒ áƒáƒ  შეიძლებáƒ" -#: plperl.c:669 plperl.c:853 plperl.c:859 plperl.c:976 plperl.c:988 -#: plperl.c:1031 plperl.c:1054 plperl.c:2138 plperl.c:2246 plperl.c:2314 -#: plperl.c:2377 +#: plperl.c:666 plperl.c:850 plperl.c:856 plperl.c:973 plperl.c:985 +#: plperl.c:1028 plperl.c:1051 plperl.c:2151 plperl.c:2259 plperl.c:2327 +#: plperl.c:2390 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:670 +#: plperl.c:667 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "\"PostgreSQL::InServer::SPI::bootstrap\"-ის შესრულებისáƒáƒ¡" -#: plperl.c:854 +#: plperl.c:851 #, c-format msgid "while parsing Perl initialization" msgstr "\"Perl\"-ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებისáƒáƒ¡" -#: plperl.c:860 +#: plperl.c:857 #, c-format msgid "while running Perl initialization" msgstr "\"Perl\"-ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡ შესრულებისáƒáƒ¡" -#: plperl.c:977 +#: plperl.c:974 #, c-format msgid "while executing PLC_TRUSTED" msgstr "\"PLC_TRUSTED\"-ის შესრულებისáƒáƒ¡" -#: plperl.c:989 +#: plperl.c:986 #, c-format msgid "while executing utf8fix" msgstr "utf8fix-ის შესრულებისáƒáƒ¡" -#: plperl.c:1032 +#: plperl.c:1029 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "plperl.on_plperl_init-ის შესრულებისáƒáƒ¡" -#: plperl.c:1055 +#: plperl.c:1052 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "plperl.on_plperlu_init-ის შესრულებისáƒáƒ¡" -#: plperl.c:1101 plperl.c:1791 +#: plperl.c:1098 plperl.c:1804 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "Perl-ის ჰეში áƒáƒ áƒáƒ áƒ¡áƒ”ბულ სვეტს შეიცáƒáƒ•ს: %s" -#: plperl.c:1106 plperl.c:1796 +#: plperl.c:1103 plperl.c:1809 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "სისტემური áƒáƒ¢áƒ áƒ˜áƒ‘უტის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: \"%s\"" -#: plperl.c:1194 +#: plperl.c:1199 plperl.c:1214 plperl.c:1231 #, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "მáƒáƒ¡áƒ˜áƒ•ის ზáƒáƒ›áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რ(%d) მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› დáƒáƒ¡áƒáƒ¨áƒ•ებზე (%d) დიდიáƒ" +msgid "multidimensional arrays must have array expressions with matching dimensions" +msgstr "მრáƒáƒ•áƒáƒšáƒ’áƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœ მáƒáƒ¡áƒ˜áƒ•ებს უნდრჰქáƒáƒœáƒ“ეთ მáƒáƒ¡áƒ˜áƒ•ის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბები შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ ზáƒáƒ›áƒ”ბით" -#: plperl.c:1206 plperl.c:1223 +#: plperl.c:1204 #, c-format -msgid "" -"multidimensional arrays must have array expressions with matching dimensions" -msgstr "" -"მრáƒáƒ•áƒáƒšáƒ’áƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœ მáƒáƒ¡áƒ˜áƒ•ებს უნდრჰქáƒáƒœáƒ“ეთ მáƒáƒ¡áƒ˜áƒ•ის გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბები შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ " -"ზáƒáƒ›áƒ”ბით" +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "მáƒáƒ¡áƒ˜áƒ•ის ზáƒáƒ›áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რმáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› დáƒáƒ¡áƒáƒ¨áƒ•ებზე (%d) დიდიáƒ" -#: plperl.c:1259 +#: plperl.c:1274 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "\"Perl\"-ის მáƒáƒ¡áƒ˜áƒ•ის áƒáƒ áƒ-მáƒáƒ¡áƒ˜áƒ•ის ტიპში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ: %s" -#: plperl.c:1362 +#: plperl.c:1375 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "\"Perl\"-ის ჰეშის áƒáƒ áƒáƒ™áƒáƒ›áƒžáƒáƒ–იტურ ტიპში გáƒáƒ“áƒáƒ§áƒ•áƒáƒœáƒ შეუძლებელიáƒ: %s" -#: plperl.c:1384 plperl.c:3304 +#: plperl.c:1397 plperl.c:3315 #, c-format -msgid "" -"function returning record called in context that cannot accept type record" -msgstr "" -"ფუნქციáƒ, რáƒáƒ›áƒ”ლიც ჩáƒáƒœáƒáƒ¬áƒ”რს áƒáƒ‘რუნებს, გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბულირკáƒáƒœáƒ¢áƒ”ქსტში, რáƒáƒ›áƒ”ლსáƒáƒª " -"ჩáƒáƒœáƒáƒ¬áƒ”რის მიღებრáƒáƒ  შეუძლიáƒ" +msgid "function returning record called in context that cannot accept type record" +msgstr "ფუნქციáƒ, რáƒáƒ›áƒ”ლიც ჩáƒáƒœáƒáƒ¬áƒ”რს áƒáƒ‘რუნებს, გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბულირკáƒáƒœáƒ¢áƒ”ქსტში, რáƒáƒ›áƒ”ლსáƒáƒª ჩáƒáƒœáƒáƒ¬áƒ”რის მიღებრáƒáƒ  შეუძლიáƒ" -#: plperl.c:1445 +#: plperl.c:1458 #, c-format msgid "lookup failed for type %s" msgstr "ტიპის მáƒáƒ«áƒ”ბნის შეცდáƒáƒ›áƒ: %s" -#: plperl.c:1766 +#: plperl.c:1779 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: plperl.c:1770 +#: plperl.c:1783 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} ჰეშის ბმáƒáƒ¡ áƒáƒ  წáƒáƒ áƒ›áƒáƒáƒ“გენს" -#: plperl.c:1801 +#: plperl.c:1814 #, c-format msgid "cannot set generated column \"%s\"" msgstr "გენერირებული სვეტის დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ: %s" -#: plperl.c:2013 plperl.c:2854 +#: plperl.c:2026 plperl.c:2867 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "PL/Perl ფუნქციáƒáƒ¡ %s ტიპის დáƒáƒ‘რუნებრáƒáƒ  შეუძლიáƒ" -#: plperl.c:2026 plperl.c:2893 +#: plperl.c:2039 plperl.c:2906 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "PL/Perl ფუნქციáƒáƒ¡ %s ტიპის გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ  შეუძლიáƒ" -#: plperl.c:2143 +#: plperl.c:2156 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "კáƒáƒ›áƒžáƒ˜áƒšáƒ˜áƒ áƒ”ბáƒáƒ“ი ფუნქციის (\"%s\") CODE მიბმრáƒáƒ  მიმიღიáƒ" -#: plperl.c:2234 +#: plperl.c:2247 #, c-format msgid "didn't get a return item from function" msgstr "ფუნქციáƒáƒ¡ áƒáƒ áƒáƒ¤áƒ”რი დáƒáƒ£áƒ‘რუნებიáƒ" -#: plperl.c:2278 plperl.c:2345 +#: plperl.c:2291 plperl.c:2358 #, c-format msgid "couldn't fetch $_TD" msgstr "$_TD -ის გáƒáƒ›áƒáƒ—ხáƒáƒ•ის შეცდáƒáƒ›áƒ" -#: plperl.c:2302 plperl.c:2365 +#: plperl.c:2315 plperl.c:2378 #, c-format msgid "didn't get a return item from trigger function" msgstr "ტრიგერის ფუნქციიდáƒáƒœ ჩáƒáƒœáƒáƒ¬áƒ”რი áƒáƒ  დáƒáƒ‘რუნებულáƒ" -#: plperl.c:2423 +#: plperl.c:2436 #, c-format msgid "set-valued function called in context that cannot accept a set" -msgstr "" -"ფუნქციáƒ, რáƒáƒ›áƒ”ლიც სეტს áƒáƒ‘რუნებს, გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბულირკáƒáƒœáƒ¢áƒ”ქსტში, რáƒáƒ›áƒ”ლიც სეტებს " -"ვერ იღებს" +msgstr "ფუნქციáƒ, რáƒáƒ›áƒ”ლიც სეტს áƒáƒ‘რუნებს, გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბულირკáƒáƒœáƒ¢áƒ”ქსტში, რáƒáƒ›áƒ”ლიც სეტებს ვერ იღებს" -#: plperl.c:2428 +#: plperl.c:2441 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული რეჟიმი, მáƒáƒ’რáƒáƒ› áƒáƒ› კáƒáƒœáƒ¢áƒ”ქსტში ეს დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: plperl.c:2472 +#: plperl.c:2485 #, c-format -msgid "" -"set-returning PL/Perl function must return reference to array or use " -"return_next" -msgstr "" -"სეტების დáƒáƒ›áƒ‘რუნებელი PL/Perl ფუნქციებმრუნდრდáƒáƒáƒ‘რუნáƒáƒœ ბმული მáƒáƒ¡áƒ˜áƒ•ზე, áƒáƒœ " -"return_next უნდრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ" +msgid "set-returning PL/Perl function must return reference to array or use return_next" +msgstr "სეტების დáƒáƒ›áƒ‘რუნებელი PL/Perl ფუნქციებმრუნდრდáƒáƒáƒ‘რუნáƒáƒœ ბმული მáƒáƒ¡áƒ˜áƒ•ზე, áƒáƒœ return_next უნდრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒœ" -#: plperl.c:2593 +#: plperl.c:2606 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "\"DELETE\" ტრიგერში შეცვლილი მწკრივის იგნáƒáƒ áƒ˜" -#: plperl.c:2601 +#: plperl.c:2614 #, c-format -msgid "" -"result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" -msgstr "" -"\"PL/Perl\"-ის ტრიგერის ფუნქციის შედეგი უნდრიყáƒáƒ¡ undef, \"SKIP\" áƒáƒœ " -"\"MODIFY\"" +msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" +msgstr "\"PL/Perl\"-ის ტრიგერის ფუნქციის შედეგი უნდრიყáƒáƒ¡ undef, \"SKIP\" áƒáƒœ \"MODIFY\"" -#: plperl.c:2849 +#: plperl.c:2862 #, c-format msgid "trigger functions can only be called as triggers" msgstr "ტრიგერის ფუნქციების გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბრმხáƒáƒšáƒáƒ“ ტრიგერებáƒáƒ“ შეიძლებáƒ" -#: plperl.c:3209 +#: plperl.c:3220 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "მáƒáƒ—ხáƒáƒ•ნის შედეგში Perl-ის მáƒáƒ¡áƒ˜áƒ•ში ჩáƒáƒ¡áƒáƒ¢áƒ”ვáƒáƒ“ მეტისმეტáƒáƒ“ ბევრი მწკრივიáƒ" -#: plperl.c:3281 +#: plperl.c:3292 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "return_next-ის გáƒáƒ›áƒáƒ§áƒ”ნებრáƒáƒ áƒ-SETOF ტიპის ფუნქციებში შეუძლებელიáƒ" -#: plperl.c:3355 +#: plperl.c:3366 #, c-format -msgid "" -"SETOF-composite-returning PL/Perl function must call return_next with " -"reference to hash" -msgstr "" -"SETOF-კáƒáƒ›áƒžáƒáƒ–იტის-დáƒáƒ›áƒ‘რუნებელი PL/Perl ფუნქციáƒáƒ› ჰეშáƒáƒ›áƒ“ე ბმულის მქáƒáƒœáƒ” " -"return_next-ი უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ¡" +msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" +msgstr "SETOF-კáƒáƒ›áƒžáƒáƒ–იტის-დáƒáƒ›áƒ‘რუნებელი PL/Perl ფუნქციáƒáƒ› ჰეშáƒáƒ›áƒ“ე ბმულის მქáƒáƒœáƒ” return_next-ი უნდრგáƒáƒ›áƒáƒ˜áƒ«áƒáƒ®áƒáƒ¡" -#: plperl.c:4137 +#: plperl.c:4148 #, c-format msgid "PL/Perl function \"%s\"" msgstr "PL/Perl-ის ფუნქცირ\"%s\"" -#: plperl.c:4149 +#: plperl.c:4160 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "\"PL/Perl\" ფუნქციის \"%s\" კáƒáƒ›áƒžáƒ˜áƒšáƒáƒªáƒ˜áƒ" -#: plperl.c:4158 +#: plperl.c:4169 #, c-format msgid "PL/Perl anonymous code block" msgstr "PL/Perl áƒáƒœáƒáƒœáƒ˜áƒ›áƒ£áƒ áƒ˜ კáƒáƒ“ის ბლáƒáƒ™áƒ˜" + +#, c-format +#~ msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +#~ msgstr "მáƒáƒ¡áƒ˜áƒ•ის ზáƒáƒ›áƒ”ბის რáƒáƒáƒ“ენáƒáƒ‘რ(%d) მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒ£áƒ› დáƒáƒ¡áƒáƒ¨áƒ•ებზე (%d) დიდიáƒ" diff --git a/src/pl/plperl/po/ko.po b/src/pl/plperl/po/ko.po index a512cfef74f29..4d4cba5912f91 100644 --- a/src/pl/plperl/po/ko.po +++ b/src/pl/plperl/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plperl (PostgreSQL) 12\n" +"Project-Id-Version: plperl (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-02-09 20:08+0000\n" -"PO-Revision-Date: 2019-11-01 12:51+0900\n" +"POT-Creation-Date: 2025-01-17 04:39+0000\n" +"PO-Revision-Date: 2025-01-16 10:37+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean Team \n" "Language: ko\n" @@ -16,200 +16,205 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: plperl.c:406 +#: plperl.c:405 msgid "" "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "true로 지정하면, Perl 코드가 엄격한 구문 검사로 ì»´íŒŒì¼ ë¨" -#: plperl.c:420 +#: plperl.c:419 msgid "" "Perl initialization code to execute when a Perl interpreter is initialized." msgstr "Perl ì¸í„°í”„리터가 초기화 ë  ë•Œ 실행할 Perl 초기화 코드" -#: plperl.c:442 +#: plperl.c:441 msgid "Perl initialization code to execute once when plperl is first used." msgstr "plperl ëª¨ë“ˆì´ ì²˜ìŒ ì‚¬ìš©ë  ë•Œ 실행할 Perl 초기화 코드" -#: plperl.c:450 +#: plperl.c:449 msgid "Perl initialization code to execute once when plperlu is first used." msgstr "plperlu ëª¨ë“ˆì´ ì²˜ìŒ ì‚¬ìš©ë  ë•Œ 실행할 Perl 초기화 코드" -#: plperl.c:647 +#: plperl.c:643 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "ì´ í”Œëž«í¼ì— 여러 Perl ì¸í„°í”„리터를 사용할 수 ì—†ìŒ" -#: plperl.c:670 plperl.c:854 plperl.c:860 plperl.c:977 plperl.c:989 -#: plperl.c:1032 plperl.c:1055 plperl.c:2154 plperl.c:2264 plperl.c:2332 -#: plperl.c:2395 +#: plperl.c:666 plperl.c:850 plperl.c:856 plperl.c:973 plperl.c:985 +#: plperl.c:1028 plperl.c:1051 plperl.c:2151 plperl.c:2259 plperl.c:2327 +#: plperl.c:2390 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:671 +#: plperl.c:667 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "PostgreSQL::InServer::SPI::bootstrap 실행 중" -#: plperl.c:855 +#: plperl.c:851 #, c-format msgid "while parsing Perl initialization" msgstr "Perl 초기화 구문 ë¶„ì„ ì¤‘" -#: plperl.c:861 +#: plperl.c:857 #, c-format msgid "while running Perl initialization" msgstr "Perl 초기화 실행 중" -#: plperl.c:978 +#: plperl.c:974 #, c-format msgid "while executing PLC_TRUSTED" msgstr "PLC_TRUSTED 실행 중" -#: plperl.c:990 +#: plperl.c:986 #, c-format msgid "while executing utf8fix" msgstr "utf8fix 실행 중" -#: plperl.c:1033 +#: plperl.c:1029 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "plperl.on_plperl_init 실행 중" -#: plperl.c:1056 +#: plperl.c:1052 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "plperl.on_plperlu_init 실행 중" -#: plperl.c:1102 plperl.c:1793 +#: plperl.c:1098 plperl.c:1804 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "Perl í•´ì‹œì— ì¡´ìž¬í•˜ì§€ 않는 \"%s\" ì¹¼ëŸ¼ì´ í¬í•¨ë˜ì—ˆìŠµë‹ˆë‹¤" -#: plperl.c:1107 plperl.c:1798 +#: plperl.c:1103 plperl.c:1809 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "\"%s\" 시스템 ì†ì„±ì„ 지정할 수 ì—†ìŒ" -#: plperl.c:1195 -#, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "지정한 ë°°ì—´ í¬ê¸°(%d)ê°€ 최대치(%d)를 초과했습니다" - -#: plperl.c:1207 plperl.c:1224 +#: plperl.c:1199 plperl.c:1214 plperl.c:1231 #, c-format msgid "" "multidimensional arrays must have array expressions with matching dimensions" msgstr "ë‹¤ì°¨ì› ë°°ì—´ì—는 ì¼ì¹˜í•˜ëŠ” ì°¨ì›ì´ í¬í•¨ëœ ë°°ì—´ ì‹ì´ 있어야 함" -#: plperl.c:1260 +#: plperl.c:1204 +#, c-format +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "ë°°ì—´ì€ %d ì°¨ì› ë°°ì—´ê¹Œì§€ë§Œ 허용함" + +#: plperl.c:1274 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "Perl ë°°ì—´í˜•ì„ ë¹„ë°°ì—´í˜• %s ìžë£Œí˜•으로 변환할 수 ì—†ìŒ" -#: plperl.c:1363 +#: plperl.c:1375 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "Perl 해시 ìžë£Œí˜•ì„ ë¹„ë³µí•© %s ìžë£Œí˜•으로 변환할 수 ì—†ìŒ" -#: plperl.c:1385 plperl.c:3306 +#: plperl.c:1397 plperl.c:3315 #, c-format msgid "" "function returning record called in context that cannot accept type record" msgstr "반환 ìžë£Œí˜•ì´ recordì¸ë° 함수가 ê·¸ ìžë£Œí˜•으로 반환하지 않ìŒ" -#: plperl.c:1444 +#: plperl.c:1458 #, c-format msgid "lookup failed for type %s" msgstr "%s ìžë£Œí˜• 찾기 실패" -#: plperl.c:1768 +#: plperl.c:1779 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} ì—†ìŒ" -#: plperl.c:1772 +#: plperl.c:1783 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} ìžë£Œí˜•ì´ í•´ì‹œ 참조가 아님" -#: plperl.c:1803 +#: plperl.c:1814 #, c-format msgid "cannot set generated column \"%s\"" msgstr "\"%s\" ê³„ì‚°ëœ ì¹¼ëŸ¼ì„ ì§€ì •í•  수 ì—†ìŒ" -#: plperl.c:2029 plperl.c:2871 +#: plperl.c:2026 plperl.c:2867 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "PL/Perl 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•  수 ì—†ìŒ" -#: plperl.c:2042 plperl.c:2912 +#: plperl.c:2039 plperl.c:2906 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "PL/Perl 함수는 %s ìžë£Œí˜•ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: plperl.c:2159 +#: plperl.c:2156 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "\"%s\" 함수를 ì»´íŒŒì¼ í•˜ë©´ì„œ 코드 참조를 구할 수 ì—†ìŒ" -#: plperl.c:2252 +#: plperl.c:2247 #, c-format msgid "didn't get a return item from function" msgstr "함수ì—서 반환할 í•­ëª©ì„ ëª» ì°¾ìŒ" -#: plperl.c:2296 plperl.c:2363 +#: plperl.c:2291 plperl.c:2358 #, c-format msgid "couldn't fetch $_TD" msgstr "$_TD 못 구함" -#: plperl.c:2320 plperl.c:2383 +#: plperl.c:2315 plperl.c:2378 #, c-format msgid "didn't get a return item from trigger function" msgstr "트리거 함수ì—서 반환할 í•­ëª©ì„ ëª» ì°¾ìŒ" -#: plperl.c:2444 +#: plperl.c:2436 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "set-values 함수(í…Œì´ë¸” 리턴 함수)ê°€ set ì •ì˜ ì—†ì´ ì‚¬ìš©ë˜ì—ˆìŠµë‹ˆë‹¤ (í…Œì´ë¸”ê³¼ í•´" "당 ì—´ alias 지정하세요)" -#: plperl.c:2489 +#: plperl.c:2441 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "materialize 모드가 필요합니다만, ì´ êµ¬ë¬¸ì—서는 허용ë˜ì§€ 않습니다" + +#: plperl.c:2485 #, c-format msgid "" "set-returning PL/Perl function must return reference to array or use " "return_next" msgstr "ì§‘í•© 반환 PL/Perl 함수는 ë°°ì—´ ë˜ëŠ” return_next 를 사용해서 반환해야 함" -#: plperl.c:2610 +#: plperl.c:2606 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "DELETE 트리거ì—서는 ë³€ê²½ëœ ë¡œìš°ëŠ” 무시 함" -#: plperl.c:2618 +#: plperl.c:2614 #, c-format msgid "" "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "" "PL/Perl 트리거 í•¨ìˆ˜ì˜ ê²°ê³¼ëŠ” undef, \"SKIP\", \"MODIFY\" 중 하나여야 함" -#: plperl.c:2866 +#: plperl.c:2862 #, c-format msgid "trigger functions can only be called as triggers" msgstr "트리거 함수는 트리거로만 í˜¸ì¶œë  ìˆ˜ 있ìŒ" -#: plperl.c:3213 +#: plperl.c:3220 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "쿼리 결과가 Perl ë°°ì—´ì— ë‹´ê¸°ì—는 너무 많습니다" -#: plperl.c:3283 +#: plperl.c:3292 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "SETOF 함수가 아닌 경우ì—는 return_next êµ¬ë¬¸ì„ ì“¸ 수 ì—†ìŒ" -#: plperl.c:3357 +#: plperl.c:3366 #, c-format msgid "" "SETOF-composite-returning PL/Perl function must call return_next with " @@ -218,20 +223,17 @@ msgstr "" "SETOF-composite-returning PL/Perl 함수는 return_next ì—서 해시 ìžë£Œí˜•ì„ ì°¸ì¡°" "해야 함" -#: plperl.c:4132 +#: plperl.c:4148 #, c-format msgid "PL/Perl function \"%s\"" msgstr "\"%s\" PL/Perl 함수" -#: plperl.c:4144 +#: plperl.c:4160 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "\"%s\" PL/Perl 함수 ì»´í•„ë ˆì´ì…˜" -#: plperl.c:4153 +#: plperl.c:4169 #, c-format msgid "PL/Perl anonymous code block" msgstr "PL/Perl ìµëª… 코드 블럭" - -#~ msgid "PL/Perl function must return reference to hash or array" -#~ msgstr "PL/Perl 함수는 해시나 ë°°ì—´ ìžë£Œí˜•ì„ ì°¸ì¡°í•˜ê²Œ 반환해야 함" diff --git a/src/pl/plperl/po/meson.build b/src/pl/plperl/po/meson.build index f1c8e7d00a1ee..5e7c8523a011c 100644 --- a/src/pl/plperl/po/meson.build +++ b/src/pl/plperl/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('plperl-' + pg_version_major.to_string())] diff --git a/src/pl/plperl/po/ru.po b/src/pl/plperl/po/ru.po index ad89a1412949f..8b47276a62056 100644 --- a/src/pl/plperl/po/ru.po +++ b/src/pl/plperl/po/ru.po @@ -1,111 +1,106 @@ # Russian message translation file for plperl # Copyright (C) 2012-2016 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2012-2017, 2019, 2022. +# Alexander Lakhin , 2012-2017, 2019, 2022, 2024. msgid "" msgstr "" "Project-Id-Version: plperl (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-27 14:52+0300\n" -"PO-Revision-Date: 2022-09-05 13:38+0300\n" +"POT-Creation-Date: 2024-09-02 09:29+0300\n" +"PO-Revision-Date: 2024-09-04 20:00+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: plperl.c:408 +#: plperl.c:405 msgid "" "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "" "ЕÑли Ñтот параметр равен true, доверенный и недоверенный код Perl будет " "компилироватьÑÑ Ð² Ñтрогом режиме." -#: plperl.c:422 +#: plperl.c:419 msgid "" "Perl initialization code to execute when a Perl interpreter is initialized." msgstr "" "Код инициализации Perl, который выполнÑетÑÑ Ð¿Ñ€Ð¸ инициализации интерпретатора " "Perl." -#: plperl.c:444 +#: plperl.c:441 msgid "Perl initialization code to execute once when plperl is first used." msgstr "" "Код инициализации Perl, который выполнÑетÑÑ Ð¾Ð´Ð¸Ð½ раз, при первом " "иÑпользовании plperl." -#: plperl.c:452 +#: plperl.c:449 msgid "Perl initialization code to execute once when plperlu is first used." msgstr "" "Код инициализации Perl, который выполнÑетÑÑ Ð¾Ð´Ð¸Ð½ раз, при первом " "иÑпользовании plperlu." -#: plperl.c:646 +#: plperl.c:643 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "на Ñтой платформе Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð¿ÑƒÑтить множеÑтво интерпретаторов Perl" -#: plperl.c:669 plperl.c:853 plperl.c:859 plperl.c:976 plperl.c:988 -#: plperl.c:1031 plperl.c:1054 plperl.c:2138 plperl.c:2246 plperl.c:2314 -#: plperl.c:2377 +#: plperl.c:666 plperl.c:850 plperl.c:856 plperl.c:973 plperl.c:985 +#: plperl.c:1028 plperl.c:1051 plperl.c:2151 plperl.c:2259 plperl.c:2327 +#: plperl.c:2390 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:670 +#: plperl.c:667 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "при выполнении PostgreSQL::InServer::SPI::bootstrap" -#: plperl.c:854 +#: plperl.c:851 #, c-format msgid "while parsing Perl initialization" msgstr "при разборе параметров инициализации Perl" -#: plperl.c:860 +#: plperl.c:857 #, c-format msgid "while running Perl initialization" msgstr "при выполнении инициализации Perl" -#: plperl.c:977 +#: plperl.c:974 #, c-format msgid "while executing PLC_TRUSTED" msgstr "при выполнении PLC_TRUSTED" -#: plperl.c:989 +#: plperl.c:986 #, c-format msgid "while executing utf8fix" msgstr "при выполнении utf8fix" -#: plperl.c:1032 +#: plperl.c:1029 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "при выполнении plperl.on_plperl_init" -#: plperl.c:1055 +#: plperl.c:1052 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "при выполнении plperl.on_plperlu_init" -#: plperl.c:1101 plperl.c:1791 +#: plperl.c:1098 plperl.c:1804 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "Perl-хеш Ñодержит неÑущеÑтвующий Ñтолбец \"%s\"" -#: plperl.c:1106 plperl.c:1796 +#: plperl.c:1103 plperl.c:1809 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "приÑвоить значение ÑиÑтемному атрибуту \"%s\" нельзÑ" -#: plperl.c:1194 -#, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "чиÑло размерноÑтей маÑÑива (%d) превышает предел (%d)" - -#: plperl.c:1206 plperl.c:1223 +#: plperl.c:1199 plperl.c:1214 plperl.c:1231 #, c-format msgid "" "multidimensional arrays must have array expressions with matching dimensions" @@ -113,85 +108,90 @@ msgstr "" "Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¼ÐµÑ€Ð½Ñ‹Ñ… маÑÑивов должны задаватьÑÑ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ ÑоответÑтвующими " "размерноÑÑ‚Ñми" -#: plperl.c:1259 +#: plperl.c:1204 +#, c-format +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "чиÑло размерноÑтей маÑÑива превышает предел (%d)" + +#: plperl.c:1274 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "Perl-маÑÑив Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ в тип не маÑÑива %s" -#: plperl.c:1362 +#: plperl.c:1375 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "Perl-хеш Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ в не ÑоÑтавной тип %s" -#: plperl.c:1384 plperl.c:3304 +#: plperl.c:1397 plperl.c:3315 #, c-format msgid "" "function returning record called in context that cannot accept type record" msgstr "" "функциÑ, Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, вызвана в контекÑте, не допуÑкающем Ñтот тип" -#: plperl.c:1445 +#: plperl.c:1458 #, c-format msgid "lookup failed for type %s" msgstr "найти тип %s не удалоÑÑŒ" -#: plperl.c:1766 +#: plperl.c:1779 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} не ÑущеÑтвует" -#: plperl.c:1770 +#: plperl.c:1783 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} - не ÑÑылка на хеш" -#: plperl.c:1801 +#: plperl.c:1814 #, c-format msgid "cannot set generated column \"%s\"" msgstr "приÑвоить значение генерируемому Ñтолбцу \"%s\" нельзÑ" -#: plperl.c:2013 plperl.c:2854 +#: plperl.c:2026 plperl.c:2867 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "функции PL/Perl не могут возвращать тип %s" -#: plperl.c:2026 plperl.c:2893 +#: plperl.c:2039 plperl.c:2906 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "функции PL/Perl не могут принимать тип %s" -#: plperl.c:2143 +#: plperl.c:2156 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "не удалоÑÑŒ получить ÑÑылку на код поÑле компилÑции функции \"%s\"" -#: plperl.c:2234 +#: plperl.c:2247 #, c-format msgid "didn't get a return item from function" msgstr "не удалоÑÑŒ получить возвращаемый Ñлемент от функции" -#: plperl.c:2278 plperl.c:2345 +#: plperl.c:2291 plperl.c:2358 #, c-format msgid "couldn't fetch $_TD" msgstr "не удалоÑÑŒ получить $_TD" -#: plperl.c:2302 plperl.c:2365 +#: plperl.c:2315 plperl.c:2378 #, c-format msgid "didn't get a return item from trigger function" msgstr "не удалоÑÑŒ получить возвращаемый Ñлемент от триггерной функции" -#: plperl.c:2423 +#: plperl.c:2436 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "функциÑ, Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтво, вызвана в контекÑте, где ему нет меÑта" -#: plperl.c:2428 +#: plperl.c:2441 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "требуетÑÑ Ñ€ÐµÐ¶Ð¸Ð¼ материализации, но он недопуÑтим в Ñтом контекÑте" -#: plperl.c:2472 +#: plperl.c:2485 #, c-format msgid "" "set-returning PL/Perl function must return reference to array or use " @@ -200,12 +200,12 @@ msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ PL/Perl, Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтво, должна возвращать ÑÑылку на маÑÑив " "или вызывать return_next" -#: plperl.c:2593 +#: plperl.c:2606 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "в триггере DELETE Ð¸Ð·Ð¼ÐµÐ½Ñ‘Ð½Ð½Ð°Ñ Ñтрока игнорируетÑÑ" -#: plperl.c:2601 +#: plperl.c:2614 #, c-format msgid "" "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" @@ -213,24 +213,24 @@ msgstr "" "результатом триггерной функции PL/Perl должен быть undef, \"SKIP\" или " "\"MODIFY\"" -#: plperl.c:2849 +#: plperl.c:2862 #, c-format msgid "trigger functions can only be called as triggers" msgstr "триггерные функции могут вызыватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в триггерах" -#: plperl.c:3209 +#: plperl.c:3220 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "" "результат запроÑа Ñодержит Ñлишком много Ñтрок Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ в маÑÑиве Perl" -#: plperl.c:3281 +#: plperl.c:3292 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "" "return_next можно иÑпользовать только в функциÑÑ…, возвращающих множеÑтва" -#: plperl.c:3355 +#: plperl.c:3366 #, c-format msgid "" "SETOF-composite-returning PL/Perl function must call return_next with " @@ -239,17 +239,17 @@ msgstr "" "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ PL/Perl, Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ ÑоÑтавное множеÑтво, должна вызывать " "return_next Ñо ÑÑылкой на хеш" -#: plperl.c:4137 +#: plperl.c:4148 #, c-format msgid "PL/Perl function \"%s\"" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ PL/Perl \"%s\"" -#: plperl.c:4149 +#: plperl.c:4160 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "компилÑÑ†Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ PL/Perl \"%s\"" -#: plperl.c:4158 +#: plperl.c:4169 #, c-format msgid "PL/Perl anonymous code block" msgstr "анонимный блок кода PL/Perl" diff --git a/src/pl/plperl/po/sv.po b/src/pl/plperl/po/sv.po index 9494466513352..f16de78b9dfc0 100644 --- a/src/pl/plperl/po/sv.po +++ b/src/pl/plperl/po/sv.po @@ -2,14 +2,14 @@ # Copyright (C) 2014 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # Mats Erik Andersson , 2014. -# Dennis Björklund 2017, 2018, 2019, 2020, 2021, 2022, 2023. +# Dennis Björklund 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-11 13:38+0000\n" -"PO-Revision-Date: 2023-03-09 22:40+0100\n" +"POT-Creation-Date: 2024-07-12 17:39+0000\n" +"PO-Revision-Date: 2024-07-12 22:07+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -18,210 +18,210 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: plperl.c:408 +#: plperl.c:405 msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "Om sant, tillförlitlig och otillförlitlig Perl-kod kommer kompileras i strikt läge." -#: plperl.c:422 +#: plperl.c:419 msgid "Perl initialization code to execute when a Perl interpreter is initialized." msgstr "Perl-kod för initialisering, utföres när perl-tolken förbereds." -#: plperl.c:444 +#: plperl.c:441 msgid "Perl initialization code to execute once when plperl is first used." msgstr "Perl-kod för engÃ¥ngs-initialisering dÃ¥ plperl används första gÃ¥ngen." -#: plperl.c:452 +#: plperl.c:449 msgid "Perl initialization code to execute once when plperlu is first used." msgstr "Perl-kod för engÃ¥ngs-initialisering dÃ¥ plperlu används första gÃ¥ngen." -#: plperl.c:646 +#: plperl.c:643 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "kan inte utnyttja flera Perl-interpretorer pÃ¥ denna plattform" -#: plperl.c:669 plperl.c:853 plperl.c:859 plperl.c:976 plperl.c:988 -#: plperl.c:1031 plperl.c:1054 plperl.c:2138 plperl.c:2246 plperl.c:2314 -#: plperl.c:2377 +#: plperl.c:666 plperl.c:850 plperl.c:856 plperl.c:973 plperl.c:985 +#: plperl.c:1028 plperl.c:1051 plperl.c:2151 plperl.c:2259 plperl.c:2327 +#: plperl.c:2390 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:670 +#: plperl.c:667 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "vid utförande av PostgreSQL::InServer::SPI::bootstrap" -#: plperl.c:854 +#: plperl.c:851 #, c-format msgid "while parsing Perl initialization" msgstr "vid tolkning av perls initieringssteg" -#: plperl.c:860 +#: plperl.c:857 #, c-format msgid "while running Perl initialization" msgstr "vid utförande av perls initieringssteg" -#: plperl.c:977 +#: plperl.c:974 #, c-format msgid "while executing PLC_TRUSTED" msgstr "vid utförande av PLC_TRUSTED" -#: plperl.c:989 +#: plperl.c:986 #, c-format msgid "while executing utf8fix" msgstr "vid utförande av utf8fix" -#: plperl.c:1032 +#: plperl.c:1029 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "vid utförande av plperl.on_plperl_init" -#: plperl.c:1055 +#: plperl.c:1052 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "vid utförande av plperl.on_plperlu_init" -#: plperl.c:1101 plperl.c:1791 +#: plperl.c:1098 plperl.c:1804 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "Perlhash innehÃ¥ller en okänd kolumn \"%s\"." -#: plperl.c:1106 plperl.c:1796 +#: plperl.c:1103 plperl.c:1809 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "kan inte sätta systemattribut \"%s\"" -#: plperl.c:1194 -#, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "antalet array-dimensioner (%d) överskrider det maximalt tillÃ¥tna (%d)" - -#: plperl.c:1206 plperl.c:1223 +#: plperl.c:1199 plperl.c:1214 plperl.c:1231 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "flerdimensionella vektorer mÃ¥ste ha array-uttryck av passande dimensioner" -#: plperl.c:1259 +#: plperl.c:1204 +#, c-format +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "antal array-dimensioner överskriver maximalt tillÃ¥tna (%d)" + +#: plperl.c:1274 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "kan inte omvandla perlvektor till icke-array av typ \"%s\"." -#: plperl.c:1362 +#: plperl.c:1375 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "kan inte omvandla en perlhash till icke-composite-typ \"%s\"." -#: plperl.c:1384 plperl.c:3304 +#: plperl.c:1397 plperl.c:3315 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "en funktion med post som värde anropades i sammanhang där poster inte kan godtagas." -#: plperl.c:1445 +#: plperl.c:1458 #, c-format msgid "lookup failed for type %s" msgstr "uppslag misslyckades för typen \"%s\"" -#: plperl.c:1766 +#: plperl.c:1779 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} finns inte." -#: plperl.c:1770 +#: plperl.c:1783 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} är inte en hash-referens." -#: plperl.c:1801 +#: plperl.c:1814 #, c-format msgid "cannot set generated column \"%s\"" msgstr "kan inte sätta genererad kolumn \"%s\"" -#: plperl.c:2013 plperl.c:2854 +#: plperl.c:2026 plperl.c:2867 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "Funktioner i PL/Perl kan inte svara med typ \"%s\"." -#: plperl.c:2026 plperl.c:2893 +#: plperl.c:2039 plperl.c:2906 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "Funktioner i PL/Perl kan inte hantera typ \"%s\"." -#: plperl.c:2143 +#: plperl.c:2156 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "fick inte en CODE-referens vid kompilering av funktionen \"%s\"." -#: plperl.c:2234 +#: plperl.c:2247 #, c-format msgid "didn't get a return item from function" msgstr "fick inget returnvärde frÃ¥n funktion" -#: plperl.c:2278 plperl.c:2345 +#: plperl.c:2291 plperl.c:2358 #, c-format msgid "couldn't fetch $_TD" msgstr "kunde inte hämta $_TD" -#: plperl.c:2302 plperl.c:2365 +#: plperl.c:2315 plperl.c:2378 #, c-format msgid "didn't get a return item from trigger function" msgstr "fick inget returvärde frÃ¥n triggerfunktion" -#: plperl.c:2423 +#: plperl.c:2436 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "en funktion som returnerar en mängd anropades i kontext som inte godtar en mängd" -#: plperl.c:2428 +#: plperl.c:2441 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "materialiserat läge krävs, men stöds inte i detta kontext" -#: plperl.c:2472 +#: plperl.c:2485 #, c-format msgid "set-returning PL/Perl function must return reference to array or use return_next" msgstr "En mängd-returnerande funktion i PL/Perl mÃ¥ste göra det som referens eller med return_next." -#: plperl.c:2593 +#: plperl.c:2606 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "Lämnar ändrad rad orörd i en DELETE-triggning" -#: plperl.c:2601 +#: plperl.c:2614 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "resultat av en triggningsfunktion i PL/Perl mÃ¥ste vara undef, \"SKIP\" eller \"MODIFY\"." -#: plperl.c:2849 +#: plperl.c:2862 #, c-format msgid "trigger functions can only be called as triggers" msgstr "Triggningsfunktioner kan bara anropas vid triggning." -#: plperl.c:3209 +#: plperl.c:3220 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "frÃ¥geresultatet har för mÃ¥nga rader för att fÃ¥ plats i en Perl-array" -#: plperl.c:3281 +#: plperl.c:3292 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "fÃ¥r inte nyttja return_next i funktion som ej är SETOF" -#: plperl.c:3355 +#: plperl.c:3366 #, c-format msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" msgstr "En funktion i PL/Perl med värderetur som SETOF mÃ¥ste anropa return_next med en hashreferens" -#: plperl.c:4137 +#: plperl.c:4148 #, c-format msgid "PL/Perl function \"%s\"" msgstr "PL/Perl-funktion \"%s\"." -#: plperl.c:4149 +#: plperl.c:4160 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "kompilering av PL/Perl-funktion \"%s\"" -#: plperl.c:4158 +#: plperl.c:4169 #, c-format msgid "PL/Perl anonymous code block" msgstr "Anonymt kodblock i PL/Perl." diff --git a/src/pl/plperl/po/uk.po b/src/pl/plperl/po/uk.po index 7951649694e8b..fcb64b7d80a99 100644 --- a/src/pl/plperl/po/uk.po +++ b/src/pl/plperl/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:39+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-02-24 00:09+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,213 +14,213 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/plperl.pot\n" -"X-Crowdin-File-ID: 920\n" +"X-Crowdin-File: /REL_17_STABLE/plperl.pot\n" +"X-Crowdin-File-ID: 1012\n" -#: plperl.c:408 +#: plperl.c:405 msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." msgstr "Якщо увімкнено, надійний Ñ– ненадійний код Perl буде Ñкомпільований в Ñуворому режимі." -#: plperl.c:422 +#: plperl.c:419 msgid "Perl initialization code to execute when a Perl interpreter is initialized." msgstr "Виконати ініціалізаційний код під Ñ‡Ð°Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— інтерпретатора Perl." -#: plperl.c:444 +#: plperl.c:441 msgid "Perl initialization code to execute once when plperl is first used." msgstr "Виконати код ініціалізації один раз під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ викориÑÑ‚Ð°Ð½Ð½Ñ plperl." -#: plperl.c:452 +#: plperl.c:449 msgid "Perl initialization code to execute once when plperlu is first used." msgstr "Виконати код ініціалізації один раз під Ñ‡Ð°Ñ Ð¿ÐµÑ€ÑˆÐ¾Ð³Ð¾ викориÑÑ‚Ð°Ð½Ð½Ñ plperlu." -#: plperl.c:646 +#: plperl.c:643 #, c-format msgid "cannot allocate multiple Perl interpreters on this platform" msgstr "не можна розміÑтити декілька Perl інтерпретаторів на цій платформі" -#: plperl.c:669 plperl.c:853 plperl.c:859 plperl.c:976 plperl.c:988 -#: plperl.c:1031 plperl.c:1054 plperl.c:2138 plperl.c:2246 plperl.c:2314 -#: plperl.c:2377 +#: plperl.c:666 plperl.c:850 plperl.c:856 plperl.c:973 plperl.c:985 +#: plperl.c:1028 plperl.c:1051 plperl.c:2151 plperl.c:2259 plperl.c:2327 +#: plperl.c:2390 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:670 +#: plperl.c:667 #, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" msgstr "під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ PostgreSQL::InServer::SPI::bootstrap" -#: plperl.c:854 +#: plperl.c:851 #, c-format msgid "while parsing Perl initialization" msgstr "під Ñ‡Ð°Ñ Ð¾Ð±Ñ€Ð¾Ð±ÐºÐ¸ ініціалізації Perl" -#: plperl.c:860 +#: plperl.c:857 #, c-format msgid "while running Perl initialization" msgstr "під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку Perl ініціалізації" -#: plperl.c:977 +#: plperl.c:974 #, c-format msgid "while executing PLC_TRUSTED" msgstr "під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ PLC_TRUSTED" -#: plperl.c:989 +#: plperl.c:986 #, c-format msgid "while executing utf8fix" msgstr "під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ utf8fix" -#: plperl.c:1032 +#: plperl.c:1029 #, c-format msgid "while executing plperl.on_plperl_init" msgstr "під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ plperl.on_plperl_init" -#: plperl.c:1055 +#: plperl.c:1052 #, c-format msgid "while executing plperl.on_plperlu_init" msgstr "під Ñ‡Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ plperl.on_plperlu_init" -#: plperl.c:1101 plperl.c:1791 +#: plperl.c:1098 plperl.c:1804 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" msgstr "хеш Perl міÑтить неіÑнуючу колонку \"%s\"" -#: plperl.c:1106 plperl.c:1796 +#: plperl.c:1103 plperl.c:1809 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "не вдалоÑÑ Ð²Ñтановити ÑиÑтемний атрибут \"%s\"" -#: plperl.c:1194 -#, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "чиÑло вимірів маÑива (%d) перевищує ліміт (%d)" - -#: plperl.c:1206 plperl.c:1223 +#: plperl.c:1199 plperl.c:1214 plperl.c:1231 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "Ð´Ð»Ñ Ð±Ð°Ð³Ð°Ñ‚Ð¾Ð²Ð¸Ð¼Ñ–Ñ€Ð½Ð¸Ñ… маÑивів повинні задаватиÑÑŒ вирази з відповідними вимірами" -#: plperl.c:1259 +#: plperl.c:1204 +#, c-format +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "кількіÑть вимірів маÑиву перевищує макÑимально дозволену (%d)" + +#: plperl.c:1274 #, c-format msgid "cannot convert Perl array to non-array type %s" msgstr "неможливо конвертувати маÑив Perl у тип не маÑиву %s" -#: plperl.c:1362 +#: plperl.c:1375 #, c-format msgid "cannot convert Perl hash to non-composite type %s" msgstr "неможливо конвертувати хеш Perl у неÑкладений тип %s" -#: plperl.c:1384 plperl.c:3304 +#: plperl.c:1397 plperl.c:3315 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "функціÑ, що повертає набір, викликана у контекÑті, що не приймає тип запиÑ" -#: plperl.c:1445 +#: plperl.c:1458 #, c-format msgid "lookup failed for type %s" msgstr "неможливо фільтрувати Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ %s" -#: plperl.c:1766 +#: plperl.c:1779 #, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} не Ñ–Ñнує" -#: plperl.c:1770 +#: plperl.c:1783 #, c-format msgid "$_TD->{new} is not a hash reference" msgstr "$_TD->{new} не Ñ” поÑиланнÑм на хеш" -#: plperl.c:1801 +#: plperl.c:1814 #, c-format msgid "cannot set generated column \"%s\"" msgstr "неможливо оновити згенерований Ñтовпець \"%s\"" -#: plperl.c:2013 plperl.c:2854 +#: plperl.c:2026 plperl.c:2867 #, c-format msgid "PL/Perl functions cannot return type %s" msgstr "функції PL/Perl не можуть повертати тип %s" -#: plperl.c:2026 plperl.c:2893 +#: plperl.c:2039 plperl.c:2906 #, c-format msgid "PL/Perl functions cannot accept type %s" msgstr "функції PL/Perl не можуть приймати тип %s" -#: plperl.c:2143 +#: plperl.c:2156 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" msgstr "не отримано поÑÐ¸Ð»Ð°Ð½Ð½Ñ CODE з функції компілÑції \"%s\"" -#: plperl.c:2234 +#: plperl.c:2247 #, c-format msgid "didn't get a return item from function" msgstr "не отримано елемент результату з функції" -#: plperl.c:2278 plperl.c:2345 +#: plperl.c:2291 plperl.c:2358 #, c-format msgid "couldn't fetch $_TD" msgstr "не вдалоÑÑŒ отримати $_TD" -#: plperl.c:2302 plperl.c:2365 +#: plperl.c:2315 plperl.c:2378 #, c-format msgid "didn't get a return item from trigger function" msgstr "не отримано елемент результату з функції-тригеру" -#: plperl.c:2423 +#: plperl.c:2436 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"set-valued\" викликана в контекÑті, де йому немає міÑцÑ" -#: plperl.c:2428 +#: plperl.c:2441 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "необхідний режим матеріалізації (materialize mode), але він неприпуÑтимий у цьому контекÑті" -#: plperl.c:2472 +#: plperl.c:2485 #, c-format msgid "set-returning PL/Perl function must return reference to array or use return_next" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ PL/Perl, що вертає набір значень, повинна поÑилатиÑÑ Ð½Ð° маÑив або викориÑтовувати return_next" -#: plperl.c:2593 +#: plperl.c:2606 #, c-format msgid "ignoring modified row in DELETE trigger" msgstr "ігноруєтьÑÑ Ð·Ð¼Ñ–Ð½ÐµÐ½Ð¸Ð¹ Ñ€Ñдок у тригері DELETE" -#: plperl.c:2601 +#: plperl.c:2614 #, c-format msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" msgstr "результат тригерної функції PL/Perl повинен бути undef, \"SKIP\" або \"MODIFY\"" -#: plperl.c:2849 +#: plperl.c:2862 #, c-format msgid "trigger functions can only be called as triggers" msgstr "тригер-Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¼Ð¾Ð¶Ðµ викликатиÑÑ Ð»Ð¸ÑˆÐµ Ñк тригер" -#: plperl.c:3209 +#: plperl.c:3220 #, c-format msgid "query result has too many rows to fit in a Perl array" msgstr "результат запиту має забагато Ñ€Ñдків Ð´Ð»Ñ Ð²Ñ–Ð´Ð¿Ð¾Ð²Ñ–Ð´Ð½Ð¾Ñті в маÑиві Perl" -#: plperl.c:3281 +#: plperl.c:3292 #, c-format msgid "cannot use return_next in a non-SETOF function" msgstr "не можна викориÑтовувати return_next в функціÑÑ…, що не повертають набори даних" -#: plperl.c:3355 +#: plperl.c:3366 #, c-format msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ PL/Perl, що повертає набір композитних даних, повинна викликати return_next з поÑиланнÑм на хеш" -#: plperl.c:4137 +#: plperl.c:4148 #, c-format msgid "PL/Perl function \"%s\"" msgstr "PL/Perl Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\"" -#: plperl.c:4149 +#: plperl.c:4160 #, c-format msgid "compilation of PL/Perl function \"%s\"" msgstr "компілÑÑ†Ñ–Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— PL/Perl \"%s\"" -#: plperl.c:4158 +#: plperl.c:4169 #, c-format msgid "PL/Perl anonymous code block" msgstr "анонімний блок коду PL/Perl" diff --git a/src/pl/plperl/po/zh_TW.po b/src/pl/plperl/po/zh_TW.po index 9f2d1d53df7a7..5f9ef18c4513e 100644 --- a/src/pl/plperl/po/zh_TW.po +++ b/src/pl/plperl/po/zh_TW.po @@ -1,176 +1,247 @@ -# Traditional Chinese message translation file for plperl -# Copyright (C) 2011 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. +# Traditional message translation file for plperl +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the plperl (PostgreSQL) package. # Zhenbang Wei , 2011. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.1\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2011-05-13 20:38+0000\n" -"PO-Revision-Date: 2013-09-03 23:25-0400\n" +"Project-Id-Version: plperl (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-11 20:39+0000\n" +"PO-Revision-Date: 2023-11-06 08:50+0800\n" "Last-Translator: Zhenbang Wei \n" -"Language-Team: Traditional Chinese\n" +"Language-Team: \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.4.1\n" -#: plperl.c:361 -msgid "" -"If true, trusted and untrusted Perl code will be compiled in strict mode." -msgstr "若為 true,å—ä¿¡èªå’Œä¸å—ä¿¡èª Perl 程å¼ç¢¼æœƒç”¨ strict 模å¼ç·¨è­¯ã€‚" +#: plperl.c:405 +msgid "If true, trusted and untrusted Perl code will be compiled in strict mode." +msgstr "若為 true,å—ä¿¡èªå’Œä¸å—ä¿¡èª Perl 程å¼ç¢¼å°‡ä»¥ strict 模å¼ç·¨è­¯ã€‚" -#: plperl.c:375 -msgid "" -"Perl initialization code to execute when a Perl interpreter is initialized." -msgstr "Perl 直譯器åˆå§‹åŒ–時執行一次 Perl åˆå§‹åŒ–程å¼ã€‚" +#: plperl.c:419 +msgid "Perl initialization code to execute when a Perl interpreter is initialized." +msgstr "Perl 直譯器åˆå§‹åŒ–時執行的 Perl åˆå§‹åŒ–程å¼ç¢¼ã€‚" -#: plperl.c:397 +#: plperl.c:441 msgid "Perl initialization code to execute once when plperl is first used." -msgstr "åˆæ¬¡ä½¿ç”¨ plperl 時執行一次 Perl åˆå§‹åŒ–程å¼ã€‚" +msgstr "åˆæ¬¡ä½¿ç”¨ plperl 時執行的 Perl åˆå§‹åŒ–程å¼ç¢¼ã€‚" -#: plperl.c:405 +#: plperl.c:449 msgid "Perl initialization code to execute once when plperlu is first used." -msgstr "åˆæ¬¡ä½¿ç”¨ plperlu 時執行一次 Perl åˆå§‹åŒ–程å¼ã€‚" +msgstr "åˆæ¬¡ä½¿ç”¨ plperlu 時執行的 Perl åˆå§‹åŒ–程å¼ç¢¼ã€‚" + +# commands/tablespace.c:386 commands/tablespace.c:483 +#: plperl.c:643 +#, c-format +msgid "cannot allocate multiple Perl interpreters on this platform" +msgstr "無法在此平å°é…置多個 Perl 解釋器" # commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770 # nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285 -#: plperl.c:622 plperl.c:784 plperl.c:789 plperl.c:893 plperl.c:904 -#: plperl.c:945 plperl.c:966 plperl.c:1857 plperl.c:1952 plperl.c:2011 +#: plperl.c:666 plperl.c:850 plperl.c:856 plperl.c:973 plperl.c:985 +#: plperl.c:1028 plperl.c:1051 plperl.c:2151 plperl.c:2259 plperl.c:2327 +#: plperl.c:2390 #, c-format msgid "%s" msgstr "%s" -#: plperl.c:623 +#: plperl.c:667 +#, c-format msgid "while executing PostgreSQL::InServer::SPI::bootstrap" -msgstr "執行 PostgreSQL::InServer::SPI::bootstrap 時" +msgstr "在執行 PostgreSQL::InServer::SPI::bootstrap 時" -#: plperl.c:785 +#: plperl.c:851 +#, c-format msgid "while parsing Perl initialization" -msgstr "解讀 Perl åˆå§‹åŒ–時" +msgstr "åœ¨è§£æž Perl åˆå§‹åŒ–時" -#: plperl.c:790 +#: plperl.c:857 +#, c-format msgid "while running Perl initialization" -msgstr "執行 Perl åˆå§‹åŒ–時" +msgstr "在執行 Perl åˆå§‹åŒ–時" -#: plperl.c:894 +#: plperl.c:974 +#, c-format msgid "while executing PLC_TRUSTED" -msgstr "執行 PLC_TRUSTED 時" +msgstr "在執行 PLC_TRUSTED 時" -#: plperl.c:905 +#: plperl.c:986 +#, c-format msgid "while executing utf8fix" -msgstr "執行 utf8fix 時" +msgstr "在執行 utf8fix 時" -#: plperl.c:946 +#: plperl.c:1029 +#, c-format msgid "while executing plperl.on_plperl_init" -msgstr "執行 plperl.on_plperl_init 時" +msgstr "在執行 plperl.on_plperl_init 時" -#: plperl.c:967 +#: plperl.c:1052 +#, c-format msgid "while executing plperl.on_plperlu_init" -msgstr "執行 plperl.on_plperlu_init 時" +msgstr "在執行 plperl.on_plperlu_init 時" -#: plperl.c:1013 plperl.c:1530 +#: plperl.c:1098 plperl.c:1804 #, c-format msgid "Perl hash contains nonexistent column \"%s\"" -msgstr "Perl hash 包å«ä¸å­˜åœ¨æ¬„ä½ \"%s\"" +msgstr "Perl 雜湊包å«ä¸å­˜åœ¨æ¬„ä½ \"%s\"" -#: plperl.c:1095 +# commands/tablecmds.c:5425 +#: plperl.c:1103 plperl.c:1809 #, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "陣列維度 (%d) è¶…éŽä¸Šé™ (%d)" +msgid "cannot set system attribute \"%s\"" +msgstr "無法設定系統屬性 \"%s\"" # executor/execQual.c:2085 utils/adt/arrayfuncs.c:507 -#: plperl.c:1109 -msgid "" -"multidimensional arrays must have array expressions with matching dimensions" +#: plperl.c:1199 plperl.c:1214 plperl.c:1231 +#, c-format +msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "多維陣列和陣列é‹ç®—å¼çš„維度必須相åŒ" -#: plperl.c:1214 -msgid "PL/Perl function must return reference to hash or array" -msgstr "PL/Perl 函å¼å¿…須傳回 hash 或陣列的åƒè€ƒ" +#: plperl.c:1204 +#, c-format +msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +msgstr "陣列維度(%d)è¶…éŽä¸Šé™(%d)" + +# commands/tablecmds.c:3079 commands/tablecmds.c:3172 +# commands/tablecmds.c:3222 commands/tablecmds.c:3318 +# commands/tablecmds.c:3379 commands/tablecmds.c:4573 +#: plperl.c:1274 +#, c-format +msgid "cannot convert Perl array to non-array type %s" +msgstr "無法將 Perl 陣列轉æ›ç‚ºéžé™£åˆ—型別 %s" + +# utils/adt/numeric.c:1761 +#: plperl.c:1375 +#, c-format +msgid "cannot convert Perl hash to non-composite type %s" +msgstr "無法將 Perl 雜湊轉æ›ç‚ºéžè¤‡åˆåž‹åˆ¥ %s" -#: plperl.c:1507 +#: plperl.c:1397 plperl.c:3315 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "åœ¨ä¸æŽ¥å—記錄型別的清æ³ä¸‹å‘¼å«å›žå‚³è¨˜éŒ„的函數" + +# utils/cache/lsyscache.c:1720 +#: plperl.c:1458 +#, c-format +msgid "lookup failed for type %s" +msgstr "尋找型別 %s 失敗" + +#: plperl.c:1779 +#, c-format msgid "$_TD->{new} does not exist" msgstr "$_TD->{new} ä¸å­˜åœ¨" -#: plperl.c:1511 +#: plperl.c:1783 +#, c-format msgid "$_TD->{new} is not a hash reference" -msgstr "$_TD->{new} 䏿˜¯ hash åƒè€ƒ" +msgstr "$_TD->{new} 䏿˜¯é›œæ¹Šåƒè€ƒ" + +# commands/tablecmds.c:4580 +#: plperl.c:1814 +#, c-format +msgid "cannot set generated column \"%s\"" +msgstr "ç„¡æ³•è¨­å®šè¢«ç”¢ç”Ÿçš„æ¬„ä½ \"%s\"" -#: plperl.c:1734 plperl.c:2462 +#: plperl.c:2026 plperl.c:2867 #, c-format msgid "PL/Perl functions cannot return type %s" -msgstr "PL/Perl 函å¼ä¸èƒ½å‚³å›žåž‹åˆ¥ %s" +msgstr "PL/Perl 函數ä¸èƒ½å›žå‚³åž‹åˆ¥ %s" -#: plperl.c:1747 plperl.c:2509 +#: plperl.c:2039 plperl.c:2906 #, c-format msgid "PL/Perl functions cannot accept type %s" -msgstr "PL/Perl 函å¼ä¸èƒ½æŽ¥å—型別 %s" +msgstr "PL/Perl 函數ä¸èƒ½æŽ¥å—型別 %s" -#: plperl.c:1861 +#: plperl.c:2156 #, c-format msgid "didn't get a CODE reference from compiling function \"%s\"" -msgstr "ç„¡æ³•å¾žç·¨è­¯å‡½å¼ \"%s\" å–å¾— CODE åƒè€ƒ" +msgstr "未從編譯函數 \"%s\" å–å¾— CODE åƒè€ƒ" -#: plperl.c:2063 -msgid "set-valued function called in context that cannot accept a set" -msgstr "set-valued 函弿–¼ç„¡æ³•接å—集åˆçš„內容中進行呼å«" +#: plperl.c:2247 +#, c-format +msgid "didn't get a return item from function" +msgstr "未從函數å–得回傳項目" -#: plperl.c:2107 -msgid "" -"set-returning PL/Perl function must return reference to array or use " -"return_next" -msgstr "set-returning PL/Perl 函å¼å¿…須傳回陣列åƒè€ƒæˆ–用 return_next" +#: plperl.c:2291 plperl.c:2358 +#, c-format +msgid "couldn't fetch $_TD" +msgstr "ç„¡æ³•æ“·å– $_TD" -#: plperl.c:2136 -msgid "composite-returning PL/Perl function must return reference to hash" -msgstr "composite-returning PL/Perl 函å¼å¿…須傳回 hash åƒè€ƒ" +#: plperl.c:2315 plperl.c:2378 +#, c-format +msgid "didn't get a return item from trigger function" +msgstr "未從觸發程åºå–得回傳項目" -#: plperl.c:2145 -msgid "" -"function returning record called in context that cannot accept type record" -msgstr "åœ¨ä¸æŽ¥å—型別 record çš„ context 中呼å«å›žå‚³ record 的函å¼" +#: plperl.c:2436 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "åœ¨ä¸æŽ¥å—集åˆçš„æƒ…æ³ä¸‹å‘¼å«å›žå‚³é›†åˆçš„函數" -#: plperl.c:2259 -msgid "ignoring modified row in DELETE trigger" -msgstr "DELETE 觸發忽略被修改的資料行" +#: plperl.c:2441 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "需è¦å¯¦é«”化模å¼ï¼Œä½†åœ¨é€™å€‹æƒ…æ³ä¸‹æ˜¯ä¸å…許的" -#: plperl.c:2267 -msgid "" -"result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" -msgstr "PL/Perl è§¸ç™¼çš„çµæžœå¿…須是 undef, \"SKIP\", or \"MODIFY\"" +#: plperl.c:2485 +#, c-format +msgid "set-returning PL/Perl function must return reference to array or use return_next" +msgstr "回傳集åˆçš„ PL/Perl 函數必須回傳陣列的åƒè€ƒæˆ–用 return_next" -# common.c:123 -#: plperl.c:2393 plperl.c:2399 -msgid "out of memory" -msgstr "記憶體用盡" +#: plperl.c:2606 +#, c-format +msgid "ignoring modified row in DELETE trigger" +msgstr "忽略在 DELETE 觸發程åºä¸­ä¿®æ”¹çš„列" -#: plperl.c:2453 +#: plperl.c:2614 +#, c-format +msgid "result of PL/Perl trigger function must be undef, \"SKIP\", or \"MODIFY\"" +msgstr "PL/Perl è§¸ç™¼å‡½æ•¸çš„çµæžœå¿…須是 undefã€\"SKIP\" 或 \"MODIFY\"" + +#: plperl.c:2862 +#, c-format msgid "trigger functions can only be called as triggers" -msgstr "觸發函å¼åªèƒ½ç•¶åšè§¸ç™¼ç¨‹åºå‘¼å«" +msgstr "觸發函數åªèƒ½è¢«ç•¶ä½œè§¸ç™¼ç¨‹åºä¾†å‘¼å«" -#: plperl.c:2825 +#: plperl.c:3220 +#, c-format +msgid "query result has too many rows to fit in a Perl array" +msgstr "æŸ¥è©¢çµæžœçš„列數éŽå¤šï¼Œç„¡æ³•放入 Perl 陣列中" + +#: plperl.c:3292 +#, c-format msgid "cannot use return_next in a non-SETOF function" -msgstr "éž SETOF 函å¼ä¸èƒ½ç”¨ return_next" +msgstr "åœ¨éž SETOF 函數中無法使用 return_next" -#: plperl.c:2831 -msgid "" -"SETOF-composite-returning PL/Perl function must call return_next with " -"reference to hash" -msgstr "" -"SETOF-composite-returning PL/Perl 函å¼å¿…é ˆå‘¼å« return_next 並傳入 hash åƒè€ƒ" +#: plperl.c:3366 +#, c-format +msgid "SETOF-composite-returning PL/Perl function must call return_next with reference to hash" +msgstr "回傳 SETOF çµæ§‹çš„ PL/Perl 函數必須用åƒè€ƒåˆ°é›œæ¹Šçš„æ–¹å¼å‘¼å« return_next" -#: plperl.c:3597 +#: plperl.c:4148 #, c-format msgid "PL/Perl function \"%s\"" -msgstr "PL/Perl å‡½å¼ \"%s\"" +msgstr "PL/Perl 函數 \"%s\"" -#: plperl.c:3609 +#: plperl.c:4160 #, c-format msgid "compilation of PL/Perl function \"%s\"" -msgstr "編譯 PL/Perl å‡½å¼ \"%s\"" +msgstr "編譯 PL/Perl 函數 \"%s\"" -#: plperl.c:3618 +#: plperl.c:4169 +#, c-format msgid "PL/Perl anonymous code block" -msgstr "PL/Perl 匿å程å¼å€å¡Š" +msgstr "PL/Perl 匿å程å¼ç¢¼å€å¡Š" + +#~ msgid "PL/Perl function must return reference to hash or array" +#~ msgstr "PL/Perl 函å¼å¿…須傳回 hash 或陣列的åƒè€ƒ" + +#~ msgid "composite-returning PL/Perl function must return reference to hash" +#~ msgstr "composite-returning PL/Perl 函å¼å¿…須傳回 hash åƒè€ƒ" + +# common.c:123 +#~ msgid "out of memory" +#~ msgstr "記憶體用盡" diff --git a/src/pl/plperl/sql/plperl_env.sql b/src/pl/plperl/sql/plperl_env.sql new file mode 100644 index 0000000000000..fa5f04146cccb --- /dev/null +++ b/src/pl/plperl/sql/plperl_env.sql @@ -0,0 +1,61 @@ +-- +-- Test the environment setting +-- + +-- directory path and dlsuffix are passed to us in environment variables +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX + +\set regresslib :libdir '/regress' :dlsuffix + +CREATE FUNCTION get_environ() + RETURNS text[] + AS :'regresslib', 'get_environ' + LANGUAGE C STRICT; + +-- fetch the process environment + +CREATE FUNCTION process_env () RETURNS text[] +LANGUAGE plpgsql AS +$$ + +declare + res text[]; + tmp text[]; + f record; +begin + for f in select unnest(get_environ()) as t loop + tmp := regexp_split_to_array(f.t, '='); + if array_length(tmp, 1) = 2 then + res := res || tmp; + end if; + end loop; + return res; +end + +$$; + +-- plperl should not be able to affect the process environment + +DO +$$ + $ENV{TEST_PLPERL_ENV_FOO} = "shouldfail"; + untie %ENV; + $ENV{TEST_PLPERL_ENV_FOO} = "testval"; + my $penv = spi_exec_query("select unnest(process_env()) as pe"); + my %received; + for (my $f = 0; $f < $penv->{processed}; $f += 2) + { + my $k = $penv->{rows}[$f]->{pe}; + my $v = $penv->{rows}[$f+1]->{pe}; + $received{$k} = $v; + } + unless (exists $received{TEST_PLPERL_ENV_FOO}) + { + elog(NOTICE, "environ unaffected") + } + +$$ LANGUAGE plperl; + +-- clean up to simplify cross-version upgrade testing +DROP FUNCTION get_environ(); diff --git a/src/pl/plperl/text2macro.pl b/src/pl/plperl/text2macro.pl index 933632c0df98f..ee65eed363830 100644 --- a/src/pl/plperl/text2macro.pl +++ b/src/pl/plperl/text2macro.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # src/pl/plperl/text2macro.pl @@ -15,28 +15,30 @@ =head1 SYNOPSIS --prefix=S - add prefix S to the names of the macros --name=S - use S as the macro name (assumes only one file) - --strip=S - don't include lines that match perl regex S =head1 DESCRIPTION Reads one or more text files and outputs a corresponding series of C pre-processor macro definitions. Each macro defines a string literal that contains the contents of the corresponding text file. The basename of the text -file as capitalized and used as the name of the macro, along with an optional prefix. +file is capitalized and used as the name of the macro, along with an optional prefix. =cut use strict; -use warnings; +use warnings FATAL => 'all'; use Getopt::Long; GetOptions( 'prefix=s' => \my $opt_prefix, 'name=s' => \my $opt_name, - 'strip=s' => \my $opt_strip, 'selftest!' => sub { exit selftest() },) or exit 1; +# This was once a command-line option, but meson is obstreperous +# about passing backslashes through custom targets. +my $opt_strip = '^(#.*|\s*)$'; + die "No text files specified" unless @ARGV; @@ -88,11 +90,11 @@ sub selftest close $fh; system("perl $0 --name=X $tmp.pl > $tmp.c") == 0 or die; - open $fh, '>>', "$tmp.c"; + open $fh, '>>', "$tmp.c" or die; print $fh "#include \n"; print $fh "int main() { puts(X); return 0; }\n"; close $fh; - system("cat -n $tmp.c"); + system("cat -n $tmp.c") == 0 or die; system("make $tmp") == 0 or die; open $fh, '<', "./$tmp |" or die; diff --git a/src/pl/plpgsql/meson.build b/src/pl/plpgsql/meson.build index 6d0bda0df7e85..2f787d6387896 100644 --- a/src/pl/plpgsql/meson.build +++ b/src/pl/plpgsql/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group subdir('src') diff --git a/src/pl/plpgsql/src/Makefile b/src/pl/plpgsql/src/Makefile index f7eb42d54fc51..63cb96fae3efc 100644 --- a/src/pl/plpgsql/src/Makefile +++ b/src/pl/plpgsql/src/Makefile @@ -32,8 +32,9 @@ DATA = plpgsql.control plpgsql--1.0.sql REGRESS_OPTS = --dbname=$(PL_TESTDB) -REGRESS = plpgsql_array plpgsql_call plpgsql_control plpgsql_copy plpgsql_domain \ - plpgsql_record plpgsql_cache plpgsql_simple plpgsql_transaction \ +REGRESS = plpgsql_array plpgsql_cache plpgsql_call plpgsql_control \ + plpgsql_copy plpgsql_domain plpgsql_misc \ + plpgsql_record plpgsql_simple plpgsql_transaction \ plpgsql_trap plpgsql_trigger plpgsql_varprops # where to find gen_keywordlist.pl and subsidiary files @@ -104,14 +105,7 @@ submake: $(MAKE) -C $(top_builddir)/src/test/regress pg_regress$(X) -distprep: pl_gram.h pl_gram.c plerrcodes.h pl_reserved_kwlist_d.h pl_unreserved_kwlist_d.h - -# pl_gram.c, pl_gram.h, plerrcodes.h, pl_reserved_kwlist_d.h, and -# pl_unreserved_kwlist_d.h are in the distribution tarball, so they -# are not cleaned here. clean distclean: clean-lib rm -f $(OBJS) rm -rf $(pg_regress_clean_files) - -maintainer-clean: distclean rm -f pl_gram.c pl_gram.h plerrcodes.h pl_reserved_kwlist_d.h pl_unreserved_kwlist_d.h diff --git a/src/pl/plpgsql/src/expected/plpgsql_array.out b/src/pl/plpgsql/src/expected/plpgsql_array.out index 9e22e56f0017d..ad60e0e8be37a 100644 --- a/src/pl/plpgsql/src/expected/plpgsql_array.out +++ b/src/pl/plpgsql/src/expected/plpgsql_array.out @@ -93,3 +93,82 @@ LINE 1: a.r[1] := 2 ^ QUERY: a.r[1] := 2 CONTEXT: PL/pgSQL function inline_code_block line 2 at assignment +-- +-- test of %type[] and %rowtype[] syntax +-- +-- check supported syntax +do $$ +declare + v int; + v1 v%type; + v2 v%type[]; + v3 v%type[1]; + v4 v%type[][]; + v5 v%type[1][3]; + v6 v%type array; + v7 v%type array[]; + v8 v%type array[1]; + v9 v%type array[1][1]; + v10 pg_catalog.pg_class%rowtype[]; +begin + raise notice '%', pg_typeof(v1); + raise notice '%', pg_typeof(v2); + raise notice '%', pg_typeof(v3); + raise notice '%', pg_typeof(v4); + raise notice '%', pg_typeof(v5); + raise notice '%', pg_typeof(v6); + raise notice '%', pg_typeof(v7); + raise notice '%', pg_typeof(v8); + raise notice '%', pg_typeof(v9); + raise notice '%', pg_typeof(v10); +end; +$$; +NOTICE: integer +NOTICE: integer[] +NOTICE: integer[] +NOTICE: integer[] +NOTICE: integer[] +NOTICE: integer[] +NOTICE: integer[] +NOTICE: integer[] +NOTICE: integer[] +NOTICE: pg_class[] +-- some types don't support arrays +do $$ +declare + v pg_node_tree; + v1 v%type[]; +begin +end; +$$; +ERROR: could not find array type for data type pg_node_tree +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 4 +-- check functionality +do $$ +declare + v1 int; + v2 varchar; + a1 v1%type[]; + a2 v2%type[]; +begin + v1 := 10; + v2 := 'Hi'; + a1 := array[v1,v1]; + a2 := array[v2,v2]; + raise notice '% %', a1, a2; +end; +$$; +NOTICE: {10,10} {Hi,Hi} +create table array_test_table(a int, b varchar); +insert into array_test_table values(1, 'first'), (2, 'second'); +do $$ +declare tg array_test_table%rowtype[]; +begin + tg := array(select array_test_table from array_test_table); + raise notice '%', tg; + tg := array(select row(a,b) from array_test_table); + raise notice '%', tg; +end; +$$; +NOTICE: {"(1,first)","(2,second)"} +NOTICE: {"(1,first)","(2,second)"} diff --git a/src/pl/plpgsql/src/expected/plpgsql_call.out b/src/pl/plpgsql/src/expected/plpgsql_call.out index 1ec6182a8da8a..ea7107dca0d90 100644 --- a/src/pl/plpgsql/src/expected/plpgsql_call.out +++ b/src/pl/plpgsql/src/expected/plpgsql_call.out @@ -35,6 +35,23 @@ SELECT * FROM test1; 55 (1 row) +-- Check that plan revalidation doesn't prevent setting transaction properties +-- (bug #18059). This test must include the first temp-object creation in +-- this script, or it won't exercise the bug scenario. Hence we put it early. +CREATE PROCEDURE test_proc3a() +LANGUAGE plpgsql +AS $$ +BEGIN + COMMIT; + SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; + RAISE NOTICE 'done'; +END; +$$; +CALL test_proc3a(); +NOTICE: done +CREATE TEMP TABLE tt1(f1 int); +CALL test_proc3a(); +NOTICE: done -- nested CALL TRUNCATE TABLE test1; CREATE PROCEDURE test_proc4(y int) @@ -392,6 +409,40 @@ END $$; NOTICE: a: , b: {30,7} NOTICE: _a: 37, _b: 30, _c: 7 +-- polymorphic OUT arguments +CREATE PROCEDURE test_proc12(a anyelement, OUT b anyelement, OUT c anyarray) +LANGUAGE plpgsql +AS $$ +BEGIN + RAISE NOTICE 'a: %', a; + b := a; + c := array[a]; +END; +$$; +DO $$ +DECLARE _a int; _b int; _c int[]; +BEGIN + _a := 10; + CALL test_proc12(_a, _b, _c); + RAISE NOTICE '_a: %, _b: %, _c: %', _a, _b, _c; +END +$$; +NOTICE: a: 10 +NOTICE: _a: 10, _b: 10, _c: {10} +DO $$ +DECLARE _a int; _b int; _c text[]; +BEGIN + _a := 10; + CALL test_proc12(_a, _b, _c); -- error + RAISE NOTICE '_a: %, _b: %, _c: %', _a, _b, _c; +END +$$; +ERROR: procedure test_proc12(integer, integer, text[]) does not exist +LINE 1: CALL test_proc12(_a, _b, _c) + ^ +HINT: No procedure matches the given name and argument types. You might need to add explicit type casts. +QUERY: CALL test_proc12(_a, _b, _c) +CONTEXT: PL/pgSQL function inline_code_block line 5 at CALL -- transition variable assignment TRUNCATE test1; CREATE FUNCTION triggerfunc1() RETURNS trigger @@ -466,3 +517,120 @@ BEGIN END; $$; NOTICE: +-- check that we detect change of dependencies in CALL +-- atomic and non-atomic call sites used to do this differently, so check both +CREATE PROCEDURE inner_p (f1 int) +AS $$ +BEGIN + RAISE NOTICE 'inner_p(%)', f1; +END +$$ LANGUAGE plpgsql; +CREATE FUNCTION f(int) RETURNS int AS $$ SELECT $1 + 1 $$ LANGUAGE sql; +CREATE PROCEDURE outer_p (f1 int) +AS $$ +BEGIN + RAISE NOTICE 'outer_p(%)', f1; + CALL inner_p(f(f1)); +END +$$ LANGUAGE plpgsql; +CREATE FUNCTION outer_f (f1 int) RETURNS void +AS $$ +BEGIN + RAISE NOTICE 'outer_f(%)', f1; + CALL inner_p(f(f1)); +END +$$ LANGUAGE plpgsql; +CALL outer_p(42); +NOTICE: outer_p(42) +NOTICE: inner_p(43) +SELECT outer_f(42); +NOTICE: outer_f(42) +NOTICE: inner_p(43) + outer_f +--------- + +(1 row) + +DROP FUNCTION f(int); +CREATE FUNCTION f(int) RETURNS int AS $$ SELECT $1 + 2 $$ LANGUAGE sql; +CALL outer_p(42); +NOTICE: outer_p(42) +NOTICE: inner_p(44) +SELECT outer_f(42); +NOTICE: outer_f(42) +NOTICE: inner_p(44) + outer_f +--------- + +(1 row) + +-- Check that stable functions in CALL see the correct snapshot +CREATE TABLE t_test (x int); +INSERT INTO t_test VALUES (0); +CREATE FUNCTION f_get_x () RETURNS int +AS $$ +DECLARE l_result int; +BEGIN + SELECT x INTO l_result FROM t_test; + RETURN l_result; +END +$$ LANGUAGE plpgsql STABLE; +CREATE PROCEDURE f_print_x (x int) +AS $$ +BEGIN + RAISE NOTICE 'f_print_x(%)', x; +END +$$ LANGUAGE plpgsql; +-- test in non-atomic context +DO $$ +BEGIN + UPDATE t_test SET x = x + 1; + RAISE NOTICE 'f_get_x(%)', f_get_x(); + CALL f_print_x(f_get_x()); + UPDATE t_test SET x = x + 1; + RAISE NOTICE 'f_get_x(%)', f_get_x(); + CALL f_print_x(f_get_x()); + ROLLBACK; +END +$$; +NOTICE: f_get_x(1) +NOTICE: f_print_x(1) +NOTICE: f_get_x(2) +NOTICE: f_print_x(2) +-- test in non-atomic context, except exception block is locally atomic +DO $$ +BEGIN + BEGIN + UPDATE t_test SET x = x + 1; + RAISE NOTICE 'f_get_x(%)', f_get_x(); + CALL f_print_x(f_get_x()); + UPDATE t_test SET x = x + 1; + RAISE NOTICE 'f_get_x(%)', f_get_x(); + CALL f_print_x(f_get_x()); + EXCEPTION WHEN division_by_zero THEN + RAISE NOTICE '%', SQLERRM; + END; + ROLLBACK; +END +$$; +NOTICE: f_get_x(1) +NOTICE: f_print_x(1) +NOTICE: f_get_x(2) +NOTICE: f_print_x(2) +-- test in atomic context +BEGIN; +DO $$ +BEGIN + UPDATE t_test SET x = x + 1; + RAISE NOTICE 'f_get_x(%)', f_get_x(); + CALL f_print_x(f_get_x()); + UPDATE t_test SET x = x + 1; + RAISE NOTICE 'f_get_x(%)', f_get_x(); + CALL f_print_x(f_get_x()); +END +$$; +NOTICE: f_get_x(1) +NOTICE: f_print_x(1) +NOTICE: f_get_x(2) +NOTICE: f_print_x(2) +ROLLBACK; diff --git a/src/pl/plpgsql/src/expected/plpgsql_control.out b/src/pl/plpgsql/src/expected/plpgsql_control.out index 328bd4858617d..ccd4f5470425c 100644 --- a/src/pl/plpgsql/src/expected/plpgsql_control.out +++ b/src/pl/plpgsql/src/expected/plpgsql_control.out @@ -681,3 +681,20 @@ select case_test(13); other (1 row) +-- test line comment between WHEN and THEN +create or replace function case_comment(int) returns text as $$ +begin + case $1 + when 1 -- comment before THEN + then return 'one'; + else + return 'other'; + end case; +end; +$$ language plpgsql immutable; +select case_comment(1); + case_comment +-------------- + one +(1 row) + diff --git a/src/pl/plpgsql/src/expected/plpgsql_misc.out b/src/pl/plpgsql/src/expected/plpgsql_misc.out new file mode 100644 index 0000000000000..a6511df08ec9f --- /dev/null +++ b/src/pl/plpgsql/src/expected/plpgsql_misc.out @@ -0,0 +1,67 @@ +-- +-- Miscellaneous topics +-- +-- Verify that we can parse new-style CREATE FUNCTION/PROCEDURE +do +$$ + declare procedure int; -- check we still recognize non-keywords as vars + begin + create function test1() returns int + begin atomic + select 2 + 2; + end; + create or replace procedure test2(x int) + begin atomic + select x + 2; + end; + end +$$; +\sf test1 +CREATE OR REPLACE FUNCTION public.test1() + RETURNS integer + LANGUAGE sql +BEGIN ATOMIC + SELECT (2 + 2); +END +\sf test2 +CREATE OR REPLACE PROCEDURE public.test2(IN x integer) + LANGUAGE sql +BEGIN ATOMIC + SELECT (x + 2); +END +-- Test %TYPE and %ROWTYPE error cases +create table misc_table(f1 int); +do $$ declare x foo%type; begin end $$; +ERROR: variable "foo" does not exist +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 1 +do $$ declare x notice%type; begin end $$; -- covers unreserved-keyword case +ERROR: variable "notice" does not exist +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 1 +do $$ declare x foo.bar%type; begin end $$; +ERROR: relation "foo" does not exist +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 1 +do $$ declare x foo.bar.baz%type; begin end $$; +ERROR: schema "foo" does not exist +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 1 +do $$ declare x public.foo.bar%type; begin end $$; +ERROR: relation "public.foo" does not exist +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 1 +do $$ declare x public.misc_table.zed%type; begin end $$; +ERROR: column "zed" of relation "misc_table" does not exist +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 1 +do $$ declare x foo%rowtype; begin end $$; +ERROR: relation "foo" does not exist +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 1 +do $$ declare x notice%rowtype; begin end $$; -- covers unreserved-keyword case +ERROR: relation "notice" does not exist +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 1 +do $$ declare x foo.bar%rowtype; begin end $$; +ERROR: schema "foo" does not exist +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 1 +do $$ declare x foo.bar.baz%rowtype; begin end $$; +ERROR: cross-database references are not implemented: "foo.bar.baz" +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 1 +do $$ declare x public.foo%rowtype; begin end $$; +ERROR: relation "public.foo" does not exist +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 1 +do $$ declare x public.misc_table%rowtype; begin end $$; diff --git a/src/pl/plpgsql/src/expected/plpgsql_record.out b/src/pl/plpgsql/src/expected/plpgsql_record.out index afb922df29b05..a9b5b778efcc7 100644 --- a/src/pl/plpgsql/src/expected/plpgsql_record.out +++ b/src/pl/plpgsql/src/expected/plpgsql_record.out @@ -306,6 +306,52 @@ NOTICE: r1 = (1,2) ERROR: record "r1" has no field "nosuchfield" CONTEXT: SQL expression "r1.nosuchfield" PL/pgSQL function inline_code_block line 9 at RAISE +-- check %type with block-qualified variable names +do $$ +<> +declare + v int; + r two_int8s; + v1 v%type; + v2 blk.v%type; + r1 r%type; + r2 blk.r%type; +begin + raise notice '%', pg_typeof(v1); + raise notice '%', pg_typeof(v2); + raise notice '%', pg_typeof(r1); + raise notice '%', pg_typeof(r2); +end$$; +NOTICE: integer +NOTICE: integer +NOTICE: two_int8s +NOTICE: two_int8s +-- check that type record can be passed through %type +do $$ +declare r1 record; + r2 r1%type; +begin + r2 := row(1,2); + raise notice 'r2 = %', r2; + r2 := row(3,4,5); + raise notice 'r2 = %', r2; +end$$; +NOTICE: r2 = (1,2) +NOTICE: r2 = (3,4,5) +-- arrays of record are not supported at the moment +do $$ +declare r1 record[]; +begin +end$$; +ERROR: variable "r1" has pseudo-type record[] +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 2 +do $$ +declare r1 record; + r2 r1%type[]; +begin +end$$; +ERROR: variable "r2" has pseudo-type record[] +CONTEXT: compilation of PL/pgSQL function "inline_code_block" near line 3 -- check repeated assignments to composite fields create table some_table (id int, data text); do $$ diff --git a/src/pl/plpgsql/src/expected/plpgsql_simple.out b/src/pl/plpgsql/src/expected/plpgsql_simple.out index e1f5d670fbe5b..da351873e742e 100644 --- a/src/pl/plpgsql/src/expected/plpgsql_simple.out +++ b/src/pl/plpgsql/src/expected/plpgsql_simple.out @@ -89,3 +89,43 @@ select simplecaller(); 4 (1 row) +-- Check case where called function changes from non-SRF to SRF (bug #18497) +create or replace function simplecaller() returns int language plpgsql +as $$ +declare x int; +begin + x := simplesql(); + return x; +end$$; +select simplecaller(); + simplecaller +-------------- + 4 +(1 row) + +drop function simplesql(); +create function simplesql() returns setof int language sql +as $$select 22 + 22$$; +select simplecaller(); + simplecaller +-------------- + 44 +(1 row) + +select simplecaller(); + simplecaller +-------------- + 44 +(1 row) + +-- Check handling of simple expression in a scrollable cursor (bug #18859) +do $$ +declare + p_CurData refcursor; + val int; +begin + open p_CurData scroll for select 42; + fetch p_CurData into val; + raise notice 'val = %', val; +end; $$; +NOTICE: val = 42 diff --git a/src/pl/plpgsql/src/generate-plerrcodes.pl b/src/pl/plpgsql/src/generate-plerrcodes.pl index f4fd376ef95a3..1c662bc967c4d 100644 --- a/src/pl/plpgsql/src/generate-plerrcodes.pl +++ b/src/pl/plpgsql/src/generate-plerrcodes.pl @@ -1,10 +1,10 @@ #!/usr/bin/perl # # Generate the plerrcodes.h header from errcodes.txt -# Copyright (c) 2000-2023, PostgreSQL Global Development Group +# Copyright (c) 2000-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; print "/* autogenerated from src/backend/utils/errcodes.txt, do not edit */\n"; diff --git a/src/pl/plpgsql/src/meson.build b/src/pl/plpgsql/src/meson.build index 85e7293b37444..3dd734b776b1b 100644 --- a/src/pl/plpgsql/src/meson.build +++ b/src/pl/plpgsql/src/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group plpgsql_sources = files( 'pl_comp.c', @@ -76,12 +76,13 @@ tests += { 'regress': { 'sql': [ 'plpgsql_array', + 'plpgsql_cache', 'plpgsql_call', 'plpgsql_control', 'plpgsql_copy', 'plpgsql_domain', + 'plpgsql_misc', 'plpgsql_record', - 'plpgsql_cache', 'plpgsql_simple', 'plpgsql_transaction', 'plpgsql_trap', diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c index a341cde2c1420..f1bce708d62d1 100644 --- a/src/pl/plpgsql/src/pl_comp.c +++ b/src/pl/plpgsql/src/pl_comp.c @@ -3,7 +3,7 @@ * pl_comp.c - Compiler part of the PL/pgSQL * procedural language * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -1596,19 +1596,16 @@ plpgsql_parse_tripword(char *word1, char *word2, char *word3, /* ---------- - * plpgsql_parse_wordtype The scanner found word%TYPE. word can be - * a variable name or a basetype. + * plpgsql_parse_wordtype The scanner found word%TYPE. word should be + * a pre-existing variable name. * - * Returns datatype struct, or NULL if no match found for word. + * Returns datatype struct. Throws error if no match found for word. * ---------- */ PLpgSQL_type * plpgsql_parse_wordtype(char *ident) { - PLpgSQL_type *dtype; PLpgSQL_nsitem *nse; - TypeName *typeName; - HeapTuple typeTup; /* * Do a lookup in the current namespace stack @@ -1623,49 +1620,27 @@ plpgsql_parse_wordtype(char *ident) { case PLPGSQL_NSTYPE_VAR: return ((PLpgSQL_var *) (plpgsql_Datums[nse->itemno]))->datatype; - - /* XXX perhaps allow REC/ROW here? */ - + case PLPGSQL_NSTYPE_REC: + return ((PLpgSQL_rec *) (plpgsql_Datums[nse->itemno]))->datatype; default: - return NULL; - } - } - - /* - * Word wasn't found in the namespace stack. Try to find a data type with - * that name, but ignore shell types and complex types. - */ - typeName = makeTypeName(ident); - typeTup = LookupTypeName(NULL, typeName, NULL, false); - if (typeTup) - { - Form_pg_type typeStruct = (Form_pg_type) GETSTRUCT(typeTup); - - if (!typeStruct->typisdefined || - typeStruct->typrelid != InvalidOid) - { - ReleaseSysCache(typeTup); - return NULL; + break; } - - dtype = build_datatype(typeTup, -1, - plpgsql_curr_compile->fn_input_collation, - typeName); - - ReleaseSysCache(typeTup); - return dtype; } - /* - * Nothing found - up to now it's a word without any special meaning for - * us. - */ - return NULL; + /* No match, complain */ + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("variable \"%s\" does not exist", ident))); + return NULL; /* keep compiler quiet */ } /* ---------- * plpgsql_parse_cwordtype Same lookup for compositeword%TYPE + * + * Here, we allow either a block-qualified variable name, or a reference + * to a column of some table. (If we must throw error, we assume that the + * latter case was intended.) * ---------- */ PLpgSQL_type * @@ -1673,12 +1648,12 @@ plpgsql_parse_cwordtype(List *idents) { PLpgSQL_type *dtype = NULL; PLpgSQL_nsitem *nse; - const char *fldname; + int nnames; + RangeVar *relvar = NULL; + const char *fldname = NULL; Oid classOid; - HeapTuple classtup = NULL; HeapTuple attrtup = NULL; HeapTuple typetup = NULL; - Form_pg_class classStruct; Form_pg_attribute attrStruct; MemoryContext oldCxt; @@ -1688,70 +1663,64 @@ plpgsql_parse_cwordtype(List *idents) if (list_length(idents) == 2) { /* - * Do a lookup in the current namespace stack. We don't need to check - * number of names matched, because we will only consider scalar - * variables. + * Do a lookup in the current namespace stack */ nse = plpgsql_ns_lookup(plpgsql_ns_top(), false, strVal(linitial(idents)), strVal(lsecond(idents)), NULL, - NULL); + &nnames); if (nse != NULL && nse->itemtype == PLPGSQL_NSTYPE_VAR) { + /* Block-qualified reference to scalar variable. */ dtype = ((PLpgSQL_var *) (plpgsql_Datums[nse->itemno]))->datatype; goto done; } + else if (nse != NULL && nse->itemtype == PLPGSQL_NSTYPE_REC && + nnames == 2) + { + /* Block-qualified reference to record variable. */ + dtype = ((PLpgSQL_rec *) (plpgsql_Datums[nse->itemno]))->datatype; + goto done; + } /* * First word could also be a table name */ - classOid = RelnameGetRelid(strVal(linitial(idents))); - if (!OidIsValid(classOid)) - goto done; + relvar = makeRangeVar(NULL, + strVal(linitial(idents)), + -1); fldname = strVal(lsecond(idents)); } - else if (list_length(idents) == 3) + else { - RangeVar *relvar; + /* + * We could check for a block-qualified reference to a field of a + * record variable, but %TYPE is documented as applying to variables, + * not fields of variables. Things would get rather ambiguous if we + * allowed either interpretation. + */ + List *rvnames; - relvar = makeRangeVar(strVal(linitial(idents)), - strVal(lsecond(idents)), - -1); - /* Can't lock relation - we might not have privileges. */ - classOid = RangeVarGetRelid(relvar, NoLock, true); - if (!OidIsValid(classOid)) - goto done; - fldname = strVal(lthird(idents)); + Assert(list_length(idents) > 2); + rvnames = list_delete_last(list_copy(idents)); + relvar = makeRangeVarFromNameList(rvnames); + fldname = strVal(llast(idents)); } - else - goto done; - classtup = SearchSysCache1(RELOID, ObjectIdGetDatum(classOid)); - if (!HeapTupleIsValid(classtup)) - goto done; - classStruct = (Form_pg_class) GETSTRUCT(classtup); - - /* - * It must be a relation, sequence, view, materialized view, composite - * type, or foreign table - */ - if (classStruct->relkind != RELKIND_RELATION && - classStruct->relkind != RELKIND_SEQUENCE && - classStruct->relkind != RELKIND_VIEW && - classStruct->relkind != RELKIND_MATVIEW && - classStruct->relkind != RELKIND_COMPOSITE_TYPE && - classStruct->relkind != RELKIND_FOREIGN_TABLE && - classStruct->relkind != RELKIND_PARTITIONED_TABLE) - goto done; + /* Look up relation name. Can't lock it - we might not have privileges. */ + classOid = RangeVarGetRelid(relvar, NoLock, false); /* * Fetch the named table field and its type */ attrtup = SearchSysCacheAttName(classOid, fldname); if (!HeapTupleIsValid(attrtup)) - goto done; + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_COLUMN), + errmsg("column \"%s\" of relation \"%s\" does not exist", + fldname, relvar->relname))); attrStruct = (Form_pg_attribute) GETSTRUCT(attrtup); typetup = SearchSysCache1(TYPEOID, @@ -1772,8 +1741,6 @@ plpgsql_parse_cwordtype(List *idents) MemoryContextSwitchTo(plpgsql_compile_tmp_cxt); done: - if (HeapTupleIsValid(classtup)) - ReleaseSysCache(classtup); if (HeapTupleIsValid(attrtup)) ReleaseSysCache(attrtup); if (HeapTupleIsValid(typetup)) @@ -1837,16 +1804,12 @@ plpgsql_parse_cwordrowtype(List *idents) * As above, this is a relation lookup but could be a type lookup if we * weren't being backwards-compatible about error wording. */ - if (list_length(idents) != 2) - return NULL; /* Avoid memory leaks in long-term function context */ oldCxt = MemoryContextSwitchTo(plpgsql_compile_tmp_cxt); /* Look up relation name. Can't lock it - we might not have privileges. */ - relvar = makeRangeVar(strVal(linitial(idents)), - strVal(lsecond(idents)), - -1); + relvar = makeRangeVarFromNameList(idents); classOid = RangeVarGetRelid(relvar, NoLock, false); /* Some relkinds lack type OIDs */ @@ -1855,7 +1818,7 @@ plpgsql_parse_cwordrowtype(List *idents) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("relation \"%s\" does not have a composite type", - strVal(lsecond(idents))))); + relvar->relname))); MemoryContextSwitchTo(oldCxt); @@ -2208,6 +2171,33 @@ build_datatype(HeapTuple typeTup, int32 typmod, return typ; } +/* + * Build an array type for the element type specified as argument. + */ +PLpgSQL_type * +plpgsql_build_datatype_arrayof(PLpgSQL_type *dtype) +{ + Oid array_typeid; + + /* + * If it's already an array type, use it as-is: Postgres doesn't do nested + * arrays. + */ + if (dtype->typisarray) + return dtype; + + array_typeid = get_array_type(dtype->typoid); + if (!OidIsValid(array_typeid)) + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("could not find array type for data type %s", + format_type_be(dtype->typoid)))); + + /* Note we inherit typmod and collation, if any, from the element type */ + return plpgsql_build_datatype(array_typeid, dtype->atttypmod, + dtype->collation, NULL); +} + /* * plpgsql_recognize_err_condition * Check condition name and translate it to SQLSTATE. diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 4b76f7699a609..ca3d1e753bc0e 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -3,7 +3,7 @@ * pl_exec.c - Executor for the PL/pgSQL * procedural language * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -339,6 +339,7 @@ static void exec_eval_cleanup(PLpgSQL_execstate *estate); static void exec_prepare_plan(PLpgSQL_execstate *estate, PLpgSQL_expr *expr, int cursorOptions); static void exec_simple_check_plan(PLpgSQL_execstate *estate, PLpgSQL_expr *expr); +static bool exec_is_simple_query(PLpgSQL_expr *expr); static void exec_save_simple_expr(PLpgSQL_expr *expr, CachedPlan *cplan); static void exec_check_rw_parameter(PLpgSQL_expr *expr); static void exec_check_assignable(PLpgSQL_execstate *estate, int dno); @@ -2211,7 +2212,7 @@ exec_stmt_call(PLpgSQL_execstate *estate, PLpgSQL_stmt_call *stmt) paramLI = setup_param_list(estate, expr); - before_lxid = MyProc->lxid; + before_lxid = MyProc->vxid.lxid; /* * If we have a procedure-lifespan resowner, use that to hold the refcount @@ -2232,7 +2233,7 @@ exec_stmt_call(PLpgSQL_execstate *estate, PLpgSQL_stmt_call *stmt) elog(ERROR, "SPI_execute_plan_extended failed executing query \"%s\": %s", expr->query, SPI_result_code_string(rc)); - after_lxid = MyProc->lxid; + after_lxid = MyProc->vxid.lxid; if (before_lxid != after_lxid) { @@ -2275,8 +2276,8 @@ exec_stmt_call(PLpgSQL_execstate *estate, PLpgSQL_stmt_call *stmt) static PLpgSQL_variable * make_callstmt_target(PLpgSQL_execstate *estate, PLpgSQL_expr *expr) { - List *plansources; - CachedPlanSource *plansource; + CachedPlan *cplan; + PlannedStmt *pstmt; CallStmt *stmt; FuncExpr *funcexpr; HeapTuple func_tuple; @@ -2293,16 +2294,15 @@ make_callstmt_target(PLpgSQL_execstate *estate, PLpgSQL_expr *expr) oldcontext = MemoryContextSwitchTo(get_eval_mcontext(estate)); /* - * Get the parsed CallStmt, and look up the called procedure + * Get the parsed CallStmt, and look up the called procedure. We use + * SPI_plan_get_cached_plan to cover the edge case where expr->plan is + * already stale and needs to be updated. */ - plansources = SPI_plan_get_plan_sources(expr->plan); - if (list_length(plansources) != 1) - elog(ERROR, "query for CALL statement is not a CallStmt"); - plansource = (CachedPlanSource *) linitial(plansources); - if (list_length(plansource->query_list) != 1) + cplan = SPI_plan_get_cached_plan(expr->plan); + if (cplan == NULL || list_length(cplan->stmt_list) != 1) elog(ERROR, "query for CALL statement is not a CallStmt"); - stmt = (CallStmt *) linitial_node(Query, - plansource->query_list)->utilityStmt; + pstmt = linitial_node(PlannedStmt, cplan->stmt_list); + stmt = (CallStmt *) pstmt->utilityStmt; if (stmt == NULL || !IsA(stmt, CallStmt)) elog(ERROR, "query for CALL statement is not a CallStmt"); @@ -2382,6 +2382,8 @@ make_callstmt_target(PLpgSQL_execstate *estate, PLpgSQL_expr *expr) row->nfields = nfields; + ReleaseCachedPlan(cplan, CurrentResourceOwner); + MemoryContextSwitchTo(oldcontext); return (PLpgSQL_variable *) row; @@ -4244,8 +4246,9 @@ exec_stmt_execsql(PLpgSQL_execstate *estate, /* * We could look at the raw_parse_tree, but it seems simpler to * check the command tag. Note we should *not* look at the Query - * tree(s), since those are the result of rewriting and could have - * been transmogrified into something else entirely. + * tree(s), since those are the result of rewriting and could be + * stale, or could have been transmogrified into something else + * entirely. */ if (plansource->commandTag == CMDTAG_INSERT || plansource->commandTag == CMDTAG_UPDATE || @@ -4267,9 +4270,9 @@ exec_stmt_execsql(PLpgSQL_execstate *estate, /* * If we have INTO, then we only need one row back ... but if we have INTO * STRICT or extra check too_many_rows, ask for two rows, so that we can - * verify the statement returns only one. INSERT/UPDATE/DELETE are always - * treated strictly. Without INTO, just run the statement to completion - * (tcount = 0). + * verify the statement returns only one. INSERT/UPDATE/DELETE/MERGE are + * always treated strictly. Without INTO, just run the statement to + * completion (tcount = 0). * * We could just ask for two rows always when using INTO, but there are * some cases where demanding the extra row costs significant time, eg by @@ -4307,10 +4310,11 @@ exec_stmt_execsql(PLpgSQL_execstate *estate, case SPI_OK_INSERT: case SPI_OK_UPDATE: case SPI_OK_DELETE: + case SPI_OK_MERGE: case SPI_OK_INSERT_RETURNING: case SPI_OK_UPDATE_RETURNING: case SPI_OK_DELETE_RETURNING: - case SPI_OK_MERGE: + case SPI_OK_MERGE_RETURNING: Assert(stmt->mod_stmt); exec_set_found(estate, (SPI_processed != 0)); break; @@ -4489,10 +4493,11 @@ exec_stmt_dynexecute(PLpgSQL_execstate *estate, case SPI_OK_INSERT: case SPI_OK_UPDATE: case SPI_OK_DELETE: + case SPI_OK_MERGE: case SPI_OK_INSERT_RETURNING: case SPI_OK_UPDATE_RETURNING: case SPI_OK_DELETE_RETURNING: - case SPI_OK_MERGE: + case SPI_OK_MERGE_RETURNING: case SPI_OK_UTILITY: case SPI_OK_REWRITTEN: break; @@ -6037,7 +6042,7 @@ exec_eval_simple_expr(PLpgSQL_execstate *estate, int32 *rettypmod) { ExprContext *econtext = estate->eval_econtext; - LocalTransactionId curlxid = MyProc->lxid; + LocalTransactionId curlxid = MyProc->vxid.lxid; ParamListInfo paramLI; void *save_setup_arg; bool need_snapshot; @@ -6092,12 +6097,18 @@ exec_eval_simple_expr(PLpgSQL_execstate *estate, * release it, so we don't leak plans intra-transaction. */ if (expr->expr_simple_plan_lxid == curlxid) - { ReleaseCachedPlan(expr->expr_simple_plan, estate->simple_eval_resowner); - expr->expr_simple_plan = NULL; - expr->expr_simple_plan_lxid = InvalidLocalTransactionId; - } + + /* + * Reset to "not simple" to leave sane state (with no dangling + * pointers) in case we fail while replanning. expr_simple_plansource + * can be left alone however, as that cannot move. + */ + expr->expr_simple_expr = NULL; + expr->expr_rw_param = NULL; + expr->expr_simple_plan = NULL; + expr->expr_simple_plan_lxid = InvalidLocalTransactionId; /* Do the replanning work in the eval_mcontext */ oldcontext = MemoryContextSwitchTo(get_eval_mcontext(estate)); @@ -6113,11 +6124,15 @@ exec_eval_simple_expr(PLpgSQL_execstate *estate, Assert(cplan != NULL); /* - * This test probably can't fail either, but if it does, cope by - * declaring the plan to be non-simple. On success, we'll acquire a - * refcount on the new plan, stored in simple_eval_resowner. + * Recheck exec_is_simple_query, which could now report false in + * edge-case scenarios such as a non-SRF having been replaced with a + * SRF. Also recheck CachedPlanAllowsSimpleValidityCheck, just to be + * sure. If either test fails, cope by declaring the plan to be + * non-simple. On success, we'll acquire a refcount on the new plan, + * stored in simple_eval_resowner. */ - if (CachedPlanAllowsSimpleValidityCheck(expr->expr_simple_plansource, + if (exec_is_simple_query(expr) && + CachedPlanAllowsSimpleValidityCheck(expr->expr_simple_plansource, cplan, estate->simple_eval_resowner)) { @@ -6129,9 +6144,6 @@ exec_eval_simple_expr(PLpgSQL_execstate *estate, { /* Release SPI_plan_get_cached_plan's refcount */ ReleaseCachedPlan(cplan, CurrentResourceOwner); - /* Mark expression as non-simple, and fail */ - expr->expr_simple_expr = NULL; - expr->expr_rw_param = NULL; return false; } @@ -7943,7 +7955,7 @@ get_cast_hashentry(PLpgSQL_execstate *estate, * functions do; DO blocks have private simple_eval_estates, and private * cast hash tables to go with them.) */ - curlxid = MyProc->lxid; + curlxid = MyProc->vxid.lxid; if (cast_entry->cast_lxid != curlxid || cast_entry->cast_in_use) { oldcontext = MemoryContextSwitchTo(estate->simple_eval_estate->es_query_cxt); @@ -7972,7 +7984,6 @@ exec_simple_check_plan(PLpgSQL_execstate *estate, PLpgSQL_expr *expr) { List *plansources; CachedPlanSource *plansource; - Query *query; CachedPlan *cplan; MemoryContext oldcontext; @@ -7988,31 +7999,88 @@ exec_simple_check_plan(PLpgSQL_execstate *estate, PLpgSQL_expr *expr) * called immediately after creating the CachedPlanSource, we need not * worry about the query being stale. */ + if (!exec_is_simple_query(expr)) + return; + + /* exec_is_simple_query verified that there's just one CachedPlanSource */ + plansources = SPI_plan_get_plan_sources(expr->plan); + plansource = (CachedPlanSource *) linitial(plansources); + + /* + * Get the generic plan for the query. If replanning is needed, do that + * work in the eval_mcontext. (Note that replanning could throw an error, + * in which case the expr is left marked "not simple", which is fine.) + */ + oldcontext = MemoryContextSwitchTo(get_eval_mcontext(estate)); + cplan = SPI_plan_get_cached_plan(expr->plan); + MemoryContextSwitchTo(oldcontext); + + /* Can't fail, because we checked for a single CachedPlanSource above */ + Assert(cplan != NULL); + + /* + * Verify that plancache.c thinks the plan is simple enough to use + * CachedPlanIsSimplyValid. Given the restrictions above, it's unlikely + * that this could fail, but if it does, just treat plan as not simple. On + * success, save a refcount on the plan in the simple-expression resowner. + */ + if (CachedPlanAllowsSimpleValidityCheck(plansource, cplan, + estate->simple_eval_resowner)) + { + /* Remember that we have the refcount */ + expr->expr_simple_plansource = plansource; + expr->expr_simple_plan = cplan; + expr->expr_simple_plan_lxid = MyProc->vxid.lxid; + + /* Share the remaining work with the replan code path */ + exec_save_simple_expr(expr, cplan); + } + + /* + * Release the plan refcount obtained by SPI_plan_get_cached_plan. (This + * refcount is held by the wrong resowner, so we can't just repurpose it.) + */ + ReleaseCachedPlan(cplan, CurrentResourceOwner); +} + +/* + * exec_is_simple_query - precheck a query tree to see if it might be simple + * + * Check the analyzed-and-rewritten form of a query to see if we will be + * able to treat it as a simple expression. It is caller's responsibility + * that the CachedPlanSource be up-to-date. + */ +static bool +exec_is_simple_query(PLpgSQL_expr *expr) +{ + List *plansources; + CachedPlanSource *plansource; + Query *query; /* - * We can only test queries that resulted in exactly one CachedPlanSource + * We can only test queries that resulted in exactly one CachedPlanSource. */ plansources = SPI_plan_get_plan_sources(expr->plan); if (list_length(plansources) != 1) - return; + return false; plansource = (CachedPlanSource *) linitial(plansources); /* * 1. There must be one single querytree. */ if (list_length(plansource->query_list) != 1) - return; + return false; query = (Query *) linitial(plansource->query_list); /* - * 2. It must be a plain SELECT query without any input tables + * 2. It must be a plain SELECT query without any input tables. */ if (!IsA(query, Query)) - return; + return false; if (query->commandType != CMD_SELECT) - return; + return false; if (query->rtable != NIL) - return; + return false; /* * 3. Can't have any subplans, aggregates, qual clauses either. (These @@ -8036,51 +8104,18 @@ exec_simple_check_plan(PLpgSQL_execstate *estate, PLpgSQL_expr *expr) query->limitOffset || query->limitCount || query->setOperations) - return; + return false; /* - * 4. The query must have a single attribute as result + * 4. The query must have a single attribute as result. */ if (list_length(query->targetList) != 1) - return; + return false; /* * OK, we can treat it as a simple plan. - * - * Get the generic plan for the query. If replanning is needed, do that - * work in the eval_mcontext. (Note that replanning could throw an error, - * in which case the expr is left marked "not simple", which is fine.) */ - oldcontext = MemoryContextSwitchTo(get_eval_mcontext(estate)); - cplan = SPI_plan_get_cached_plan(expr->plan); - MemoryContextSwitchTo(oldcontext); - - /* Can't fail, because we checked for a single CachedPlanSource above */ - Assert(cplan != NULL); - - /* - * Verify that plancache.c thinks the plan is simple enough to use - * CachedPlanIsSimplyValid. Given the restrictions above, it's unlikely - * that this could fail, but if it does, just treat plan as not simple. On - * success, save a refcount on the plan in the simple-expression resowner. - */ - if (CachedPlanAllowsSimpleValidityCheck(plansource, cplan, - estate->simple_eval_resowner)) - { - /* Remember that we have the refcount */ - expr->expr_simple_plansource = plansource; - expr->expr_simple_plan = cplan; - expr->expr_simple_plan_lxid = MyProc->lxid; - - /* Share the remaining work with the replan code path */ - exec_save_simple_expr(expr, cplan); - } - - /* - * Release the plan refcount obtained by SPI_plan_get_cached_plan. (This - * refcount is held by the wrong resowner, so we can't just repurpose it.) - */ - ReleaseCachedPlan(cplan, CurrentResourceOwner); + return true; } /* @@ -8106,10 +8141,12 @@ exec_save_simple_expr(PLpgSQL_expr *expr, CachedPlan *cplan) /* * Ordinarily, the plan node should be a simple Result. However, if * debug_parallel_query is on, the planner might've stuck a Gather node - * atop that. The simplest way to deal with this is to look through the - * Gather node. The Gather node's tlist would normally contain a Var - * referencing the child node's output, but it could also be a Param, or - * it could be a Const that setrefs.c copied as-is. + * atop that; and/or if this plan is for a scrollable cursor, the planner + * might've stuck a Material node atop it. The simplest way to deal with + * this is to look through the Gather and/or Material nodes. The upper + * node's tlist would normally contain a Var referencing the child node's + * output, but it could also be a Param, or it could be a Const that + * setrefs.c copied as-is. */ plan = stmt->planTree; for (;;) @@ -8127,7 +8164,7 @@ exec_save_simple_expr(PLpgSQL_expr *expr, CachedPlan *cplan) ((Result *) plan)->resconstantqual == NULL); break; } - else if (IsA(plan, Gather)) + else if (IsA(plan, Gather) || IsA(plan, Material)) { Assert(plan->lefttree != NULL && plan->righttree == NULL && @@ -8470,7 +8507,7 @@ plpgsql_xact_cb(XactEvent event, void *arg) FreeExecutorState(shared_simple_eval_estate); shared_simple_eval_estate = NULL; if (shared_simple_eval_resowner) - ResourceOwnerReleaseAllPlanCacheRefs(shared_simple_eval_resowner); + ReleaseAllPlanCacheRefsInOwner(shared_simple_eval_resowner); shared_simple_eval_resowner = NULL; } else if (event == XACT_EVENT_ABORT || diff --git a/src/pl/plpgsql/src/pl_funcs.c b/src/pl/plpgsql/src/pl_funcs.c index f010515fdf6b1..eeb7c4d7c04af 100644 --- a/src/pl/plpgsql/src/pl_funcs.c +++ b/src/pl/plpgsql/src/pl_funcs.c @@ -3,7 +3,7 @@ * pl_funcs.c - Misc functions for the PL/pgSQL * procedural language * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/pl/plpgsql/src/pl_gram.y b/src/pl/plpgsql/src/pl_gram.y index 6a09bfdd67508..97be9239e3761 100644 --- a/src/pl/plpgsql/src/pl_gram.y +++ b/src/pl/plpgsql/src/pl_gram.y @@ -3,7 +3,7 @@ * * pl_gram.y - Parser for the PL/pgSQL procedural language * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -66,7 +66,6 @@ static PLpgSQL_expr *read_sql_construct(int until, RawParseMode parsemode, bool isexpression, bool valid_sql, - bool trim, int *startloc, int *endtoken); static PLpgSQL_expr *read_sql_expression(int until, @@ -76,7 +75,8 @@ static PLpgSQL_expr *read_sql_expression2(int until, int until2, int *endtoken); static PLpgSQL_expr *read_sql_stmt(void); static PLpgSQL_type *read_datatype(int tok); -static PLpgSQL_stmt *make_execsql_stmt(int firsttoken, int location); +static PLpgSQL_stmt *make_execsql_stmt(int firsttoken, int location, + PLword *word); static PLpgSQL_stmt_fetch *read_fetch_direction(void); static void complete_direction(PLpgSQL_stmt_fetch *fetch, bool *check_FROM); @@ -757,8 +757,9 @@ decl_const : decl_datatype : { /* - * If there's a lookahead token, read_datatype - * should consume it. + * If there's a lookahead token, read_datatype() will + * consume it, and then we must tell bison to forget + * it. */ $$ = read_datatype(yychar); yyclearin; @@ -893,7 +894,7 @@ stmt_perform : K_PERFORM */ new->expr = read_sql_construct(';', 0, 0, ";", RAW_PARSE_DEFAULT, - false, false, true, + false, false, &startloc, NULL); /* overwrite "perform" ... */ memcpy(new->expr->query, " SELECT", 7); @@ -979,7 +980,7 @@ stmt_assign : T_DATUM plpgsql_push_back_token(T_DATUM); new->expr = read_sql_construct(';', 0, 0, ";", pmode, - false, true, true, + false, true, NULL, NULL); $$ = (PLpgSQL_stmt *) new; @@ -1472,7 +1473,6 @@ for_control : for_variable K_IN RAW_PARSE_DEFAULT, true, false, - true, &expr1loc, &tok); @@ -1877,7 +1877,7 @@ stmt_raise : K_RAISE expr = read_sql_construct(',', ';', K_USING, ", or ; or USING", RAW_PARSE_PLPGSQL_EXPR, - true, true, true, + true, true, NULL, &tok); new->params = lappend(new->params, expr); } @@ -1971,15 +1971,15 @@ loop_body : proc_sect K_END K_LOOP opt_label ';' */ stmt_execsql : K_IMPORT { - $$ = make_execsql_stmt(K_IMPORT, @1); + $$ = make_execsql_stmt(K_IMPORT, @1, NULL); } | K_INSERT { - $$ = make_execsql_stmt(K_INSERT, @1); + $$ = make_execsql_stmt(K_INSERT, @1, NULL); } | K_MERGE { - $$ = make_execsql_stmt(K_MERGE, @1); + $$ = make_execsql_stmt(K_MERGE, @1, NULL); } | T_WORD { @@ -1990,7 +1990,7 @@ stmt_execsql : K_IMPORT if (tok == '=' || tok == COLON_EQUALS || tok == '[' || tok == '.') word_is_not_variable(&($1), @1); - $$ = make_execsql_stmt(T_WORD, @1); + $$ = make_execsql_stmt(T_WORD, @1, &($1)); } | T_CWORD { @@ -2001,7 +2001,7 @@ stmt_execsql : K_IMPORT if (tok == '=' || tok == COLON_EQUALS || tok == '[' || tok == '.') cword_is_not_variable(&($1), @1); - $$ = make_execsql_stmt(T_CWORD, @1); + $$ = make_execsql_stmt(T_CWORD, @1, NULL); } ; @@ -2014,7 +2014,7 @@ stmt_dynexecute : K_EXECUTE expr = read_sql_construct(K_INTO, K_USING, ';', "INTO or USING or ;", RAW_PARSE_PLPGSQL_EXPR, - true, true, true, + true, true, NULL, &endtoken); new = palloc(sizeof(PLpgSQL_stmt_dynexecute)); @@ -2053,7 +2053,7 @@ stmt_dynexecute : K_EXECUTE expr = read_sql_construct(',', ';', K_INTO, ", or ; or INTO", RAW_PARSE_PLPGSQL_EXPR, - true, true, true, + true, true, NULL, &endtoken); new->params = lappend(new->params, expr); } while (endtoken == ','); @@ -2638,7 +2638,7 @@ read_sql_expression(int until, const char *expected) { return read_sql_construct(until, 0, 0, expected, RAW_PARSE_PLPGSQL_EXPR, - true, true, true, NULL, NULL); + true, true, NULL, NULL); } /* Convenience routine to read an expression with two possible terminators */ @@ -2648,7 +2648,7 @@ read_sql_expression2(int until, int until2, const char *expected, { return read_sql_construct(until, until2, 0, expected, RAW_PARSE_PLPGSQL_EXPR, - true, true, true, NULL, endtoken); + true, true, NULL, endtoken); } /* Convenience routine to read a SQL statement that must end with ';' */ @@ -2657,7 +2657,7 @@ read_sql_stmt(void) { return read_sql_construct(';', 0, 0, ";", RAW_PARSE_DEFAULT, - false, true, true, NULL, NULL); + false, true, NULL, NULL); } /* @@ -2670,7 +2670,6 @@ read_sql_stmt(void) * parsemode: raw_parser() mode to use * isexpression: whether to say we're reading an "expression" or a "statement" * valid_sql: whether to check the syntax of the expr - * trim: trim trailing whitespace * startloc: if not NULL, location of first token is stored at *startloc * endtoken: if not NULL, ending token is stored at *endtoken * (this is only interesting if until2 or until3 isn't zero) @@ -2683,7 +2682,6 @@ read_sql_construct(int until, RawParseMode parsemode, bool isexpression, bool valid_sql, - bool trim, int *startloc, int *endtoken) { @@ -2691,6 +2689,7 @@ read_sql_construct(int until, StringInfoData ds; IdentifierLookup save_IdentifierLookup; int startlocation = -1; + int endlocation = -1; int parenlevel = 0; PLpgSQL_expr *expr; @@ -2741,6 +2740,8 @@ read_sql_construct(int until, expected), parser_errposition(yylloc))); } + /* Remember end+1 location of last accepted token */ + endlocation = yylloc + plpgsql_token_length(); } plpgsql_IdentifierLookup = save_IdentifierLookup; @@ -2751,7 +2752,7 @@ read_sql_construct(int until, *endtoken = tok; /* give helpful complaint about empty input */ - if (startlocation >= yylloc) + if (startlocation >= endlocation) { if (isexpression) yyerror("missing expression"); @@ -2759,14 +2760,14 @@ read_sql_construct(int until, yyerror("missing SQL statement"); } - plpgsql_append_source_text(&ds, startlocation, yylloc); - - /* trim any trailing whitespace, for neatness */ - if (trim) - { - while (ds.len > 0 && scanner_isspace(ds.data[ds.len - 1])) - ds.data[--ds.len] = '\0'; - } + /* + * We save only the text from startlocation to endlocation-1. This + * suppresses the "until" token as well as any whitespace or comments + * following the last accepted token. (We used to strip such trailing + * whitespace by hand, but that causes problems if there's a "-- comment" + * in front of said whitespace.) + */ + plpgsql_append_source_text(&ds, startlocation, endlocation); expr = palloc0(sizeof(PLpgSQL_expr)); expr->query = pstrdup(ds.data); @@ -2783,13 +2784,17 @@ read_sql_construct(int until, return expr; } +/* + * Read a datatype declaration, consuming the current lookahead token if any. + * Returns a PLpgSQL_type struct. + */ static PLpgSQL_type * read_datatype(int tok) { StringInfoData ds; char *type_name; int startlocation; - PLpgSQL_type *result; + PLpgSQL_type *result = NULL; int parenlevel = 0; /* Should only be called while parsing DECLARE sections */ @@ -2799,11 +2804,12 @@ read_datatype(int tok) if (tok == YYEMPTY) tok = yylex(); + /* The current token is the start of what we'll pass to parse_datatype */ startlocation = yylloc; /* - * If we have a simple or composite identifier, check for %TYPE - * and %ROWTYPE constructs. + * If we have a simple or composite identifier, check for %TYPE and + * %ROWTYPE constructs. */ if (tok == T_WORD) { @@ -2815,18 +2821,10 @@ read_datatype(int tok) tok = yylex(); if (tok_is_keyword(tok, &yylval, K_TYPE, "type")) - { result = plpgsql_parse_wordtype(dtname); - if (result) - return result; - } else if (tok_is_keyword(tok, &yylval, K_ROWTYPE, "rowtype")) - { result = plpgsql_parse_wordrowtype(dtname); - if (result) - return result; - } } } else if (plpgsql_token_is_unreserved_keyword(tok)) @@ -2839,18 +2837,10 @@ read_datatype(int tok) tok = yylex(); if (tok_is_keyword(tok, &yylval, K_TYPE, "type")) - { result = plpgsql_parse_wordtype(dtname); - if (result) - return result; - } else if (tok_is_keyword(tok, &yylval, K_ROWTYPE, "rowtype")) - { result = plpgsql_parse_wordrowtype(dtname); - if (result) - return result; - } } } else if (tok == T_CWORD) @@ -2863,21 +2853,56 @@ read_datatype(int tok) tok = yylex(); if (tok_is_keyword(tok, &yylval, K_TYPE, "type")) - { result = plpgsql_parse_cwordtype(dtnames); - if (result) - return result; - } else if (tok_is_keyword(tok, &yylval, K_ROWTYPE, "rowtype")) - { result = plpgsql_parse_cwordrowtype(dtnames); - if (result) - return result; - } } } + /* + * If we recognized a %TYPE or %ROWTYPE construct, see if it is followed + * by array decoration: [ ARRAY ] [ '[' [ iconst ] ']' [ ... ] ] + * + * Like the core parser, we ignore the specific numbers and sizes of + * dimensions; arrays of different dimensionality are still the same type + * in Postgres. + */ + if (result) + { + bool is_array = false; + + tok = yylex(); + if (tok_is_keyword(tok, &yylval, + K_ARRAY, "array")) + { + is_array = true; + tok = yylex(); + } + while (tok == '[') + { + is_array = true; + tok = yylex(); + if (tok == ICONST) + tok = yylex(); + if (tok != ']') + yyerror("syntax error, expected \"]\""); + tok = yylex(); + } + plpgsql_push_back_token(tok); + + if (is_array) + result = plpgsql_build_datatype_arrayof(result); + + return result; + } + + /* + * Not %TYPE or %ROWTYPE, so scan to the end of the datatype declaration, + * which could include typmod or array decoration. We are not very picky + * here, instead relying on parse_datatype to complain about garbage. But + * we must count parens to handle typmods within cursor_arg correctly. + */ while (tok != ';') { if (tok == 0) @@ -2919,8 +2944,13 @@ read_datatype(int tok) return result; } +/* + * Read a generic SQL statement. We have already read its first token; + * firsttoken is that token's code and location its starting location. + * If firsttoken == T_WORD, pass its yylval value as "word", else pass NULL. + */ static PLpgSQL_stmt * -make_execsql_stmt(int firsttoken, int location) +make_execsql_stmt(int firsttoken, int location, PLword *word) { StringInfoData ds; IdentifierLookup save_IdentifierLookup; @@ -2933,9 +2963,16 @@ make_execsql_stmt(int firsttoken, int location) bool have_strict = false; int into_start_loc = -1; int into_end_loc = -1; + int paren_depth = 0; + int begin_depth = 0; + bool in_routine_definition = false; + int token_count = 0; + char tokens[4]; /* records the first few tokens */ initStringInfo(&ds); + memset(tokens, 0, sizeof(tokens)); + /* special lookup mode for identifiers within the SQL text */ save_IdentifierLookup = plpgsql_IdentifierLookup; plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_EXPR; @@ -2944,6 +2981,12 @@ make_execsql_stmt(int firsttoken, int location) * Scan to the end of the SQL command. Identify any INTO-variables * clause lurking within it, and parse that via read_into_target(). * + * The end of the statement is defined by a semicolon ... except that + * semicolons within parentheses or BEGIN/END blocks don't terminate a + * statement. We follow psql's lead in not recognizing BEGIN/END except + * after CREATE [OR REPLACE] {FUNCTION|PROCEDURE}. END can also appear + * within a CASE construct, so we treat CASE/END like BEGIN/END. + * * Because INTO is sometimes used in the main SQL grammar, we have to be * careful not to take any such usage of INTO as a PL/pgSQL INTO clause. * There are currently three such cases: @@ -2969,13 +3012,50 @@ make_execsql_stmt(int firsttoken, int location) * break this logic again ... beware! */ tok = firsttoken; + if (tok == T_WORD && strcmp(word->ident, "create") == 0) + tokens[token_count] = 'c'; + token_count++; + for (;;) { prev_tok = tok; tok = yylex(); if (have_into && into_end_loc < 0) into_end_loc = yylloc; /* token after the INTO part */ - if (tok == ';') + /* Detect CREATE [OR REPLACE] {FUNCTION|PROCEDURE} */ + if (tokens[0] == 'c' && token_count < sizeof(tokens)) + { + if (tok == K_OR) + tokens[token_count] = 'o'; + else if (tok == T_WORD && + strcmp(yylval.word.ident, "replace") == 0) + tokens[token_count] = 'r'; + else if (tok == T_WORD && + strcmp(yylval.word.ident, "function") == 0) + tokens[token_count] = 'f'; + else if (tok == T_WORD && + strcmp(yylval.word.ident, "procedure") == 0) + tokens[token_count] = 'f'; /* treat same as "function" */ + if (tokens[1] == 'f' || + (tokens[1] == 'o' && tokens[2] == 'r' && tokens[3] == 'f')) + in_routine_definition = true; + token_count++; + } + /* Track paren nesting (needed for CREATE RULE syntax) */ + if (tok == '(') + paren_depth++; + else if (tok == ')' && paren_depth > 0) + paren_depth--; + /* We need track BEGIN/END nesting only in a routine definition */ + if (in_routine_definition && paren_depth == 0) + { + if (tok == K_BEGIN || tok == K_CASE) + begin_depth++; + else if (tok == K_END && begin_depth > 0) + begin_depth--; + } + /* Command-ending semicolon? */ + if (tok == ';' && paren_depth == 0 && begin_depth == 0) break; if (tok == 0) yyerror("unexpected end of function definition"); @@ -3139,11 +3219,11 @@ read_fetch_direction(void) { /* * Assume it's a count expression with no preceding keyword. - * Note: we allow this syntax because core SQL does, but we don't - * document it because of the ambiguity with the omitted-direction - * case. For instance, "MOVE n IN c" will fail if n is a variable. - * Perhaps this can be improved someday, but it's hardly worth a - * lot of work. + * Note: we allow this syntax because core SQL does, but it's + * ambiguous with the case of an omitted direction clause; for + * instance, "MOVE n IN c" will fail if n is a variable, because the + * preceding else-arm will trigger. Perhaps this can be improved + * someday, but it hardly seems worth a lot of work. */ plpgsql_push_back_token(tok); fetch->expr = read_sql_expression2(K_FROM, K_IN, @@ -3852,16 +3932,12 @@ read_cursor_args(PLpgSQL_var *cursor, int until) * Read the value expression. To provide the user with meaningful * parse error positions, we check the syntax immediately, instead of * checking the final expression that may have the arguments - * reordered. Trailing whitespace must not be trimmed, because - * otherwise input of the form (param -- comment\n, param) would be - * translated into a form where the second parameter is commented - * out. + * reordered. */ item = read_sql_construct(',', ')', 0, ",\" or \")", RAW_PARSE_PLPGSQL_EXPR, true, true, - false, /* do not trim */ NULL, &endtoken); argv[argpos] = item->query; diff --git a/src/pl/plpgsql/src/pl_handler.c b/src/pl/plpgsql/src/pl_handler.c index d8994538b76b9..fce459ade0832 100644 --- a/src/pl/plpgsql/src/pl_handler.c +++ b/src/pl/plpgsql/src/pl_handler.c @@ -3,7 +3,7 @@ * pl_handler.c - Handler for the PL/pgSQL * procedural language * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -288,7 +288,7 @@ plpgsql_call_handler(PG_FUNCTION_ARGS) /* Be sure to release the procedure resowner if any */ if (procedure_resowner) { - ResourceOwnerReleaseAllPlanCacheRefs(procedure_resowner); + ReleaseAllPlanCacheRefsInOwner(procedure_resowner); ResourceOwnerDelete(procedure_resowner); } } @@ -393,7 +393,7 @@ plpgsql_inline_handler(PG_FUNCTION_ARGS) /* Clean up the private EState and resowner */ FreeExecutorState(simple_eval_estate); - ResourceOwnerReleaseAllPlanCacheRefs(simple_eval_resowner); + ReleaseAllPlanCacheRefsInOwner(simple_eval_resowner); ResourceOwnerDelete(simple_eval_resowner); /* Function should now have no remaining use-counts ... */ @@ -410,7 +410,7 @@ plpgsql_inline_handler(PG_FUNCTION_ARGS) /* Clean up the private EState and resowner */ FreeExecutorState(simple_eval_estate); - ResourceOwnerReleaseAllPlanCacheRefs(simple_eval_resowner); + ReleaseAllPlanCacheRefsInOwner(simple_eval_resowner); ResourceOwnerDelete(simple_eval_resowner); /* Function should now have no remaining use-counts ... */ diff --git a/src/pl/plpgsql/src/pl_reserved_kwlist.h b/src/pl/plpgsql/src/pl_reserved_kwlist.h index c116abbb7a14d..d338e9f637467 100644 --- a/src/pl/plpgsql/src/pl_reserved_kwlist.h +++ b/src/pl/plpgsql/src/pl_reserved_kwlist.h @@ -7,7 +7,7 @@ * by the PG_KEYWORD macro, which is not defined in this file; it can * be defined by the caller for special purposes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/pl/plpgsql/src/pl_reserved_kwlist.h diff --git a/src/pl/plpgsql/src/pl_scanner.c b/src/pl/plpgsql/src/pl_scanner.c index 4e98af23958da..9407da51efa6b 100644 --- a/src/pl/plpgsql/src/pl_scanner.c +++ b/src/pl/plpgsql/src/pl_scanner.c @@ -4,7 +4,7 @@ * lexical scanning for PL/pgSQL * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -184,6 +184,8 @@ plpgsql_yylex(void) tok1 = T_DATUM; else tok1 = T_CWORD; + /* Adjust token length to include A.B.C */ + aux1.leng = aux5.lloc - aux1.lloc + aux5.leng; } else { @@ -197,6 +199,8 @@ plpgsql_yylex(void) tok1 = T_DATUM; else tok1 = T_CWORD; + /* Adjust token length to include A.B */ + aux1.leng = aux3.lloc - aux1.lloc + aux3.leng; } } else @@ -210,6 +214,8 @@ plpgsql_yylex(void) tok1 = T_DATUM; else tok1 = T_CWORD; + /* Adjust token length to include A.B */ + aux1.leng = aux3.lloc - aux1.lloc + aux3.leng; } } else @@ -298,6 +304,17 @@ plpgsql_yylex(void) return tok1; } +/* + * Return the length of the token last returned by plpgsql_yylex(). + * + * In the case of compound tokens, the length includes all the parts. + */ +int +plpgsql_token_length(void) +{ + return plpgsql_yyleng; +} + /* * Internal yylex function. This wraps the core lexer and adds one feature: * a token pushback stack. We also make a couple of trivial single-token diff --git a/src/pl/plpgsql/src/pl_unreserved_kwlist.h b/src/pl/plpgsql/src/pl_unreserved_kwlist.h index 3e258a6bb95fa..670b4cf0c1e0d 100644 --- a/src/pl/plpgsql/src/pl_unreserved_kwlist.h +++ b/src/pl/plpgsql/src/pl_unreserved_kwlist.h @@ -7,7 +7,7 @@ * by the PG_KEYWORD macro, which is not defined in this file; it can * be defined by the caller for special purposes. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/pl/plpgsql/src/pl_unreserved_kwlist.h diff --git a/src/pl/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h index 2b4bcd1dbee9e..50c3b28472b54 100644 --- a/src/pl/plpgsql/src/plpgsql.h +++ b/src/pl/plpgsql/src/plpgsql.h @@ -3,7 +3,7 @@ * plpgsql.h - Definitions for the PL/pgSQL * procedural language * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -42,7 +42,7 @@ typedef enum PLpgSQL_nsitem_type { PLPGSQL_NSTYPE_LABEL, /* block label */ PLPGSQL_NSTYPE_VAR, /* scalar variable */ - PLPGSQL_NSTYPE_REC /* composite variable */ + PLPGSQL_NSTYPE_REC, /* composite variable */ } PLpgSQL_nsitem_type; /* @@ -52,7 +52,7 @@ typedef enum PLpgSQL_label_type { PLPGSQL_LABEL_BLOCK, /* DECLARE/BEGIN block */ PLPGSQL_LABEL_LOOP, /* looping construct */ - PLPGSQL_LABEL_OTHER /* anything else */ + PLPGSQL_LABEL_OTHER, /* anything else */ } PLpgSQL_label_type; /* @@ -64,7 +64,7 @@ typedef enum PLpgSQL_datum_type PLPGSQL_DTYPE_ROW, PLPGSQL_DTYPE_REC, PLPGSQL_DTYPE_RECFIELD, - PLPGSQL_DTYPE_PROMISE + PLPGSQL_DTYPE_PROMISE, } PLpgSQL_datum_type; /* @@ -83,7 +83,7 @@ typedef enum PLpgSQL_promise_type PLPGSQL_PROMISE_TG_NARGS, PLPGSQL_PROMISE_TG_ARGV, PLPGSQL_PROMISE_TG_EVENT, - PLPGSQL_PROMISE_TG_TAG + PLPGSQL_PROMISE_TG_TAG, } PLpgSQL_promise_type; /* @@ -93,7 +93,7 @@ typedef enum PLpgSQL_type_type { PLPGSQL_TTYPE_SCALAR, /* scalar types and domains */ PLPGSQL_TTYPE_REC, /* composite types, including RECORD */ - PLPGSQL_TTYPE_PSEUDO /* pseudotypes */ + PLPGSQL_TTYPE_PSEUDO, /* pseudotypes */ } PLpgSQL_type_type; /* @@ -127,7 +127,7 @@ typedef enum PLpgSQL_stmt_type PLPGSQL_STMT_PERFORM, PLPGSQL_STMT_CALL, PLPGSQL_STMT_COMMIT, - PLPGSQL_STMT_ROLLBACK + PLPGSQL_STMT_ROLLBACK, } PLpgSQL_stmt_type; /* @@ -138,7 +138,7 @@ enum PLPGSQL_RC_OK, PLPGSQL_RC_EXIT, PLPGSQL_RC_RETURN, - PLPGSQL_RC_CONTINUE + PLPGSQL_RC_CONTINUE, }; /* @@ -158,7 +158,7 @@ typedef enum PLpgSQL_getdiag_kind PLPGSQL_GETDIAG_DATATYPE_NAME, PLPGSQL_GETDIAG_MESSAGE_TEXT, PLPGSQL_GETDIAG_TABLE_NAME, - PLPGSQL_GETDIAG_SCHEMA_NAME + PLPGSQL_GETDIAG_SCHEMA_NAME, } PLpgSQL_getdiag_kind; /* @@ -174,7 +174,7 @@ typedef enum PLpgSQL_raise_option_type PLPGSQL_RAISEOPTION_CONSTRAINT, PLPGSQL_RAISEOPTION_DATATYPE, PLPGSQL_RAISEOPTION_TABLE, - PLPGSQL_RAISEOPTION_SCHEMA + PLPGSQL_RAISEOPTION_SCHEMA, } PLpgSQL_raise_option_type; /* @@ -184,7 +184,7 @@ typedef enum PLpgSQL_resolve_option { PLPGSQL_RESOLVE_ERROR, /* throw error if ambiguous */ PLPGSQL_RESOLVE_VARIABLE, /* prefer plpgsql var to table column */ - PLPGSQL_RESOLVE_COLUMN /* prefer table column to plpgsql var */ + PLPGSQL_RESOLVE_COLUMN, /* prefer table column to plpgsql var */ } PLpgSQL_resolve_option; @@ -957,7 +957,7 @@ typedef enum PLpgSQL_trigtype { PLPGSQL_DML_TRIGGER, PLPGSQL_EVENT_TRIGGER, - PLPGSQL_NOT_TRIGGER + PLPGSQL_NOT_TRIGGER, } PLpgSQL_trigtype; /* @@ -1188,7 +1188,7 @@ typedef enum { IDENTIFIER_LOOKUP_NORMAL, /* normal processing of var names */ IDENTIFIER_LOOKUP_DECLARE, /* In DECLARE --- don't look up names */ - IDENTIFIER_LOOKUP_EXPR /* In SQL expression --- special case */ + IDENTIFIER_LOOKUP_EXPR, /* In SQL expression --- special case */ } IdentifierLookup; extern IdentifierLookup plpgsql_IdentifierLookup; @@ -1249,6 +1249,7 @@ extern PLpgSQL_type *plpgsql_parse_cwordrowtype(List *idents); extern PGDLLEXPORT PLpgSQL_type *plpgsql_build_datatype(Oid typeOid, int32 typmod, Oid collation, TypeName *origtypname); +extern PLpgSQL_type *plpgsql_build_datatype_arrayof(PLpgSQL_type *dtype); extern PLpgSQL_variable *plpgsql_build_variable(const char *refname, int lineno, PLpgSQL_type *dtype, bool add2namespace); @@ -1316,6 +1317,7 @@ extern void plpgsql_dumptree(PLpgSQL_function *func); */ extern int plpgsql_base_yylex(void); extern int plpgsql_yylex(void); +extern int plpgsql_token_length(void); extern void plpgsql_push_back_token(int token); extern bool plpgsql_token_is_unreserved_keyword(int token); extern void plpgsql_append_source_text(StringInfo buf, diff --git a/src/pl/plpgsql/src/po/de.po b/src/pl/plpgsql/src/po/de.po index 16a0cfa6579eb..e301ad3e04b26 100644 --- a/src/pl/plpgsql/src/po/de.po +++ b/src/pl/plpgsql/src/po/de.po @@ -1,15 +1,15 @@ # German message translation file for plpgsql -# Copyright (C) 2009 - 2022 PostgreSQL Global Development Group +# Copyright (C) 2009 - 2024 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-08 12:09+0000\n" -"PO-Revision-Date: 2022-04-08 14:40+0200\n" +"POT-Creation-Date: 2024-03-26 09:39+0000\n" +"PO-Revision-Date: 2024-03-26 11:04+0100\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -18,159 +18,174 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: pl_comp.c:438 pl_handler.c:496 +#: pl_comp.c:434 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "PL/pgSQL-Funktionen können Typ %s nicht annehmen" -#: pl_comp.c:530 +#: pl_comp.c:526 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "konnte den tatsächlichen Rückgabetyp der polymorphischen Funktion »%s« nicht ermitteln" -#: pl_comp.c:560 +#: pl_comp.c:556 #, c-format msgid "trigger functions can only be called as triggers" msgstr "Triggerfunktionen können nur als Trigger aufgerufen werden" -#: pl_comp.c:564 pl_handler.c:480 +#: pl_comp.c:560 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "PL/pgSQL-Funktionen können keinen Rückgabetyp %s haben" -#: pl_comp.c:604 +#: pl_comp.c:600 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "Triggerfunktionen können keine deklarierten Argumente haben" -#: pl_comp.c:605 +#: pl_comp.c:601 #, c-format msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." msgstr "Auf die Argumente des Triggers kann stattdessen über TG_NARGS und TG_ARGV zugegriffen werden." -#: pl_comp.c:738 +#: pl_comp.c:734 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "Ereignistriggerfunktionen können keine deklarierten Argumente haben" -#: pl_comp.c:1002 +#: pl_comp.c:998 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "Kompilierung der PL/pgSQL-Funktion »%s« nahe Zeile %d" -#: pl_comp.c:1025 +#: pl_comp.c:1021 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "Parametername »%s« mehrmals angegeben" -#: pl_comp.c:1139 +#: pl_comp.c:1135 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "Spaltenverweis »%s« ist nicht eindeutig" -#: pl_comp.c:1141 +#: pl_comp.c:1137 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Er könnte sich entweder auf eine PL/pgSQL-Variable oder eine Tabellenspalte beziehen." -#: pl_comp.c:1324 pl_exec.c:5216 pl_exec.c:5389 pl_exec.c:5476 pl_exec.c:5567 -#: pl_exec.c:6588 +#: pl_comp.c:1314 pl_exec.c:5257 pl_exec.c:5430 pl_exec.c:5517 pl_exec.c:5608 +#: pl_exec.c:6626 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "Record »%s« hat kein Feld »%s«" -#: pl_comp.c:1818 +#: pl_comp.c:1633 pl_gram.y:646 pl_gram.y:661 pl_gram.y:687 +#, c-format +msgid "variable \"%s\" does not exist" +msgstr "Variable »%s« existiert nicht" + +#: pl_comp.c:1722 +#, c-format +msgid "column \"%s\" of relation \"%s\" does not exist" +msgstr "Spalte »%s« von Relation »%s« existiert nicht" + +#: pl_comp.c:1775 #, c-format msgid "relation \"%s\" does not exist" msgstr "Relation »%s« existiert nicht" -#: pl_comp.c:1825 pl_comp.c:1867 +#: pl_comp.c:1782 pl_comp.c:1820 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "Relation »%s« hat keinen zusammengesetzten Typ" -#: pl_comp.c:1933 +#: pl_comp.c:1886 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "Variable »%s« hat Pseudotyp %s" -#: pl_comp.c:2122 +#: pl_comp.c:2075 #, c-format msgid "type \"%s\" is only a shell" msgstr "Typ »%s« ist nur eine Hülle" -#: pl_comp.c:2204 pl_exec.c:6889 +#: pl_comp.c:2157 pl_exec.c:6927 #, c-format msgid "type %s is not composite" msgstr "Typ %s ist kein zusammengesetzter Typ" -#: pl_comp.c:2252 pl_comp.c:2305 +#: pl_comp.c:2193 +#, c-format +msgid "could not find array type for data type %s" +msgstr "konnte Arraytyp für Datentyp %s nicht finden" + +#: pl_comp.c:2232 pl_comp.c:2285 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "unbekannte Ausnahmebedingung »%s«" -#: pl_comp.c:2526 +#: pl_comp.c:2514 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "konnte den tatsächlichen Argumenttyp der polymorphischen Funktion »%s« nicht ermitteln" -#: pl_exec.c:500 pl_exec.c:939 pl_exec.c:1174 +#: pl_exec.c:511 pl_exec.c:950 pl_exec.c:1185 msgid "during initialization of execution state" msgstr "bei der Initialisierung des Ausführungszustandes" -#: pl_exec.c:506 +#: pl_exec.c:517 msgid "while storing call arguments into local variables" msgstr "beim Abspeichern der Aufrufargumente in lokale Variablen" -#: pl_exec.c:594 pl_exec.c:1012 +#: pl_exec.c:605 pl_exec.c:1023 msgid "during function entry" msgstr "beim Eintritts in die Funktion" -#: pl_exec.c:617 +#: pl_exec.c:628 #, c-format msgid "control reached end of function without RETURN" msgstr "Kontrollfluss erreichte das Ende der Funktion ohne RETURN" -#: pl_exec.c:623 +#: pl_exec.c:634 msgid "while casting return value to function's return type" msgstr "bei der Umwandlung des Rückgabewerts in den Rückgabetyp der Funktion" -#: pl_exec.c:635 pl_exec.c:3656 +#: pl_exec.c:646 pl_exec.c:3681 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "Funktion mit Mengenergebnis in einem Zusammenhang aufgerufen, der keine Mengenergebnisse verarbeiten kann" -#: pl_exec.c:640 pl_exec.c:3662 +#: pl_exec.c:651 pl_exec.c:3687 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "Materialisierungsmodus wird benötigt, ist aber in diesem Zusammenhang nicht erlaubt" -#: pl_exec.c:767 pl_exec.c:1038 pl_exec.c:1196 +#: pl_exec.c:778 pl_exec.c:1049 pl_exec.c:1207 msgid "during function exit" msgstr "beim Verlassen der Funktion" -#: pl_exec.c:822 pl_exec.c:886 pl_exec.c:3455 +#: pl_exec.c:833 pl_exec.c:897 pl_exec.c:3480 msgid "returned record type does not match expected record type" msgstr "zurückgegebener Record-Typ stimmt nicht mit erwartetem Record-Typ überein" -#: pl_exec.c:1035 pl_exec.c:1193 +#: pl_exec.c:1046 pl_exec.c:1204 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "Kontrollfluss erreichte das Ende der Triggerprozedur ohne RETURN" -#: pl_exec.c:1043 +#: pl_exec.c:1054 #, c-format msgid "trigger procedure cannot return a set" msgstr "Triggerprozedur kann keine Ergebnismenge zurückgeben" -#: pl_exec.c:1082 pl_exec.c:1110 +#: pl_exec.c:1093 pl_exec.c:1121 msgid "returned row structure does not match the structure of the triggering table" msgstr "zurückgegebene Zeilenstruktur stimmt nicht mit der Struktur der Tabelle, die den Trigger ausgelöst hat, überein" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1251 +#: pl_exec.c:1262 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "PL/pgSQL-Funktion %s Zeile %d %s" @@ -178,335 +193,340 @@ msgstr "PL/pgSQL-Funktion %s Zeile %d %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1262 +#: pl_exec.c:1273 #, c-format msgid "PL/pgSQL function %s %s" msgstr "PL/pgSQL-Funktion %s %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1270 +#: pl_exec.c:1281 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "PL/pgSQL-Funktion %s Zeile %d bei %s" -#: pl_exec.c:1276 +#: pl_exec.c:1287 #, c-format msgid "PL/pgSQL function %s" msgstr "PL/pgSQL-Funktion %s" -#: pl_exec.c:1647 +#: pl_exec.c:1658 msgid "during statement block local variable initialization" msgstr "bei der Initialisierung der lokalen Variablen des Anweisungsblocks" -#: pl_exec.c:1752 +#: pl_exec.c:1763 msgid "during statement block entry" msgstr "beim Eintreten in den Anweisungsblock" -#: pl_exec.c:1784 +#: pl_exec.c:1795 msgid "during statement block exit" msgstr "beim Verlassen des Anweisungsblocks" -#: pl_exec.c:1822 +#: pl_exec.c:1833 msgid "during exception cleanup" msgstr "beim Aufräumen der Ausnahme" -#: pl_exec.c:2355 +#: pl_exec.c:2370 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" msgstr "Prozedurparameter »%s« ist ein Ausgabeparameter, aber das entsprechende Argument ist nicht schreibbar" -#: pl_exec.c:2360 +#: pl_exec.c:2375 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "Prozedurparameter %d ist ein Ausgabeparameter, aber das entsprechende Argument ist nicht schreibbar" -#: pl_exec.c:2394 +#: pl_exec.c:2409 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS kann nicht außerhalb einer Ausnahmebehandlung verwendet werden" -#: pl_exec.c:2594 +#: pl_exec.c:2615 #, c-format msgid "case not found" msgstr "Fall nicht gefunden" -#: pl_exec.c:2595 +#: pl_exec.c:2616 #, c-format msgid "CASE statement is missing ELSE part." msgstr "Der CASE-Anweisung fehlt ein ELSE-Teil." -#: pl_exec.c:2688 +#: pl_exec.c:2709 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "Untergrenze einer FOR-Schleife darf nicht NULL sein" -#: pl_exec.c:2704 +#: pl_exec.c:2725 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "Obergrenze einer FOR-Schleife darf nicht NULL sein" -#: pl_exec.c:2722 +#: pl_exec.c:2743 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "BY-Wert einer FOR-Schleife darf nicht NULL sein" -#: pl_exec.c:2728 +#: pl_exec.c:2749 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "BY-Wert einer FOR-Schleife muss größer als null sein" -#: pl_exec.c:2862 pl_exec.c:4658 +#: pl_exec.c:2883 pl_exec.c:4690 #, c-format msgid "cursor \"%s\" already in use" msgstr "Cursor »%s« ist bereits in Verwendung" -#: pl_exec.c:2885 pl_exec.c:4723 +#: pl_exec.c:2906 pl_exec.c:4760 #, c-format msgid "arguments given for cursor without arguments" msgstr "einem Cursor ohne Argumente wurden Argumente übergeben" -#: pl_exec.c:2904 pl_exec.c:4742 +#: pl_exec.c:2925 pl_exec.c:4779 #, c-format msgid "arguments required for cursor" msgstr "Cursor benötigt Argumente" -#: pl_exec.c:2991 +#: pl_exec.c:3016 #, c-format msgid "FOREACH expression must not be null" msgstr "FOREACH-Ausdruck darf nicht NULL sein" -#: pl_exec.c:3006 +#: pl_exec.c:3031 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "FOREACH-Ausdruck muss ein Array ergeben, nicht Typ %s" -#: pl_exec.c:3023 +#: pl_exec.c:3048 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "Slice-Dimension (%d) ist außerhalb des gültigen Bereichs 0..%d" -#: pl_exec.c:3050 +#: pl_exec.c:3075 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "FOREACH ... SLICE Schleifenvariable muss einen Arraytyp haben" -#: pl_exec.c:3054 +#: pl_exec.c:3079 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "FOREACH-Schleifenvariable darf keinen Array-Typ haben" -#: pl_exec.c:3216 pl_exec.c:3273 pl_exec.c:3448 +#: pl_exec.c:3241 pl_exec.c:3298 pl_exec.c:3473 #, c-format msgid "cannot return non-composite value from function returning composite type" msgstr "kann keinen nicht zusammengesetzten Wert aus einer Funktion zurückgeben, die einen zusammengesetzten Typ zurückgibt" -#: pl_exec.c:3312 pl_gram.y:3318 +#: pl_exec.c:3337 pl_gram.y:3376 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "RETURN NEXT kann nur in einer Funktion mit SETOF-Rückgabetyp verwendet werden" -#: pl_exec.c:3353 pl_exec.c:3485 +#: pl_exec.c:3378 pl_exec.c:3510 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "falscher Ergebnistyp angegeben in RETURN NEXT" -#: pl_exec.c:3391 pl_exec.c:3412 +#: pl_exec.c:3416 pl_exec.c:3437 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "falscher Record-Typ angegeben in RETURN NEXT" -#: pl_exec.c:3504 +#: pl_exec.c:3529 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT muss einen Parameter haben" -#: pl_exec.c:3532 pl_gram.y:3382 +#: pl_exec.c:3557 pl_gram.y:3440 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "RETURN QUERY kann nur in einer Funktion mit SETOF-Rückgabetyp verwendet werden" -#: pl_exec.c:3550 +#: pl_exec.c:3575 msgid "structure of query does not match function result type" msgstr "Struktur der Anfrage stimmt nicht mit Rückgabetyp der Funktion überein" -#: pl_exec.c:3605 pl_exec.c:4435 pl_exec.c:8630 +#: pl_exec.c:3630 pl_exec.c:4466 pl_exec.c:8726 #, c-format msgid "query string argument of EXECUTE is null" msgstr "Anfrageargument von EXECUTE ist NULL" -#: pl_exec.c:3690 pl_exec.c:3828 +#: pl_exec.c:3715 pl_exec.c:3853 #, c-format msgid "RAISE option already specified: %s" msgstr "RAISE-Option bereits angegeben: %s" -#: pl_exec.c:3724 +#: pl_exec.c:3749 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE ohne Parameter kann nicht außerhalb einer Ausnahmebehandlung verwendet werden" -#: pl_exec.c:3818 +#: pl_exec.c:3843 #, c-format msgid "RAISE statement option cannot be null" msgstr "Option einer RAISE-Anweisung darf nicht NULL sein" -#: pl_exec.c:3888 +#: pl_exec.c:3913 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3943 +#: pl_exec.c:3968 #, c-format msgid "assertion failed" msgstr "Assertion fehlgeschlagen" -#: pl_exec.c:4308 pl_exec.c:4497 +#: pl_exec.c:4339 pl_exec.c:4529 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "COPY vom/zum Client funktioniert in PL/pgSQL nicht" -#: pl_exec.c:4314 +#: pl_exec.c:4345 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "nicht unterstützter Transaktionsbefehl in PL/pgSQL" -#: pl_exec.c:4337 pl_exec.c:4526 +#: pl_exec.c:4368 pl_exec.c:4558 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO mit einem Befehl verwendet, der keine Daten zurückgeben kann" -#: pl_exec.c:4360 pl_exec.c:4549 +#: pl_exec.c:4391 pl_exec.c:4581 #, c-format msgid "query returned no rows" msgstr "Anfrage gab keine Zeilen zurück" -#: pl_exec.c:4382 pl_exec.c:4568 pl_exec.c:5711 +#: pl_exec.c:4413 pl_exec.c:4600 pl_exec.c:5752 #, c-format msgid "query returned more than one row" msgstr "Anfrage gab mehr als eine Zeile zurück" -#: pl_exec.c:4384 +#: pl_exec.c:4415 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "Stellen Sie sicher, dass die Anfrage eine einzige Zeile zurückgibt, oder verwenden Sie LIMIT 1." -#: pl_exec.c:4400 +#: pl_exec.c:4431 #, c-format msgid "query has no destination for result data" msgstr "Anfrage hat keinen Bestimmungsort für die Ergebnisdaten" -#: pl_exec.c:4401 +#: pl_exec.c:4432 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Wenn Sie die Ergebnisse eines SELECT verwerfen wollen, verwenden Sie stattdessen PERFORM." -#: pl_exec.c:4489 +#: pl_exec.c:4521 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "EXECUTE von SELECT ... INTO ist nicht implementiert" -#: pl_exec.c:4490 +#: pl_exec.c:4522 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "Sie könnten stattdessen EXECUTE ... INTO oder EXECUTE CREATE TABLE ... AS verwenden." -#: pl_exec.c:4503 +#: pl_exec.c:4535 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE von Transaktionsbefehlen ist nicht implementiert" -#: pl_exec.c:4804 pl_exec.c:4892 +#: pl_exec.c:4845 pl_exec.c:4933 #, c-format msgid "cursor variable \"%s\" is null" msgstr "Cursor-Variable »%s« ist NULL" -#: pl_exec.c:4815 pl_exec.c:4903 +#: pl_exec.c:4856 pl_exec.c:4944 #, c-format msgid "cursor \"%s\" does not exist" msgstr "Cursor »%s« existiert nicht" -#: pl_exec.c:4828 +#: pl_exec.c:4869 #, c-format msgid "relative or absolute cursor position is null" msgstr "relative oder absolute Cursorposition ist NULL" -#: pl_exec.c:5066 pl_exec.c:5161 +#: pl_exec.c:5107 pl_exec.c:5202 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "NULL-Wert kann der Variable »%s« nicht zugewiesen werden, weil sie als NOT NULL deklariert ist" -#: pl_exec.c:5142 +#: pl_exec.c:5183 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "nicht zusammengesetzter Wert kann nicht einer Zeilenvariable zugewiesen werden" -#: pl_exec.c:5174 +#: pl_exec.c:5215 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "nicht zusammengesetzter Wert kann nicht einer Record-Variable zugewiesen werden" -#: pl_exec.c:5225 +#: pl_exec.c:5266 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "kann Systemspalte »%s« keinen Wert zuweisen" -#: pl_exec.c:5674 +#: pl_exec.c:5715 #, c-format msgid "query did not return data" msgstr "Anfrage hat keine Daten zurückgegeben" -#: pl_exec.c:5675 pl_exec.c:5687 pl_exec.c:5712 pl_exec.c:5788 pl_exec.c:5793 +#: pl_exec.c:5716 pl_exec.c:5728 pl_exec.c:5753 pl_exec.c:5829 pl_exec.c:5834 #, c-format msgid "query: %s" msgstr "Anfrage: %s" -#: pl_exec.c:5683 +#: pl_exec.c:5724 #, c-format msgid "query returned %d column" msgid_plural "query returned %d columns" msgstr[0] "Anfrage hat %d Spalte zurückgegeben" msgstr[1] "Anfrage hat %d Spalten zurückgegeben" -#: pl_exec.c:5787 +#: pl_exec.c:5828 #, c-format msgid "query is SELECT INTO, but it should be plain SELECT" msgstr "Anfrage ist SELECT INTO, sollte aber ein normales SELECT sein" -#: pl_exec.c:5792 +#: pl_exec.c:5833 #, c-format msgid "query is not a SELECT" msgstr "Anfrage ist kein SELECT" -#: pl_exec.c:6602 pl_exec.c:6642 pl_exec.c:6682 +#: pl_exec.c:6640 pl_exec.c:6680 pl_exec.c:6720 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "Typ von Parameter %d (%s) stimmt nicht mit dem überein, als der Plan vorbereitet worden ist (%s)" -#: pl_exec.c:7093 pl_exec.c:7127 pl_exec.c:7201 pl_exec.c:7227 +#: pl_exec.c:7131 pl_exec.c:7165 pl_exec.c:7239 pl_exec.c:7265 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "Anzahl der Quell- und Zielfelder in der Zuweisung stimmt nicht überein" #. translator: %s represents a name of an extra check -#: pl_exec.c:7095 pl_exec.c:7129 pl_exec.c:7203 pl_exec.c:7229 +#: pl_exec.c:7133 pl_exec.c:7167 pl_exec.c:7241 pl_exec.c:7267 #, c-format msgid "%s check of %s is active." msgstr "Check »%s« aus »%s« ist aktiv." -#: pl_exec.c:7099 pl_exec.c:7133 pl_exec.c:7207 pl_exec.c:7233 +#: pl_exec.c:7137 pl_exec.c:7171 pl_exec.c:7245 pl_exec.c:7271 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "Stellen Sie sicher, dass die Anfrage die genaue Spaltenliste zurückgibt." -#: pl_exec.c:7620 +#: pl_exec.c:7658 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "Record »%s« hat noch keinen Wert" -#: pl_exec.c:7621 +#: pl_exec.c:7659 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "Die Tupelstruktur eines Records ohne Wert ist unbestimmt." +#: pl_exec.c:8324 pl_gram.y:3499 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "Variable »%s« ist als CONSTANT deklariert" + #: pl_funcs.c:237 msgid "statement block" msgstr "Anweisungsblock" @@ -554,265 +574,259 @@ msgstr "Sortierfolgen werden von Typ %s nicht unterstützt" msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "Variable »%s« muss einen Vorgabewert haben, da sie als NOT NULL deklariert ist" -#: pl_gram.y:673 pl_gram.y:688 pl_gram.y:714 -#, c-format -msgid "variable \"%s\" does not exist" -msgstr "Variable »%s« existiert nicht" - -#: pl_gram.y:732 pl_gram.y:760 +#: pl_gram.y:705 pl_gram.y:733 msgid "duplicate declaration" msgstr "doppelte Deklaration" -#: pl_gram.y:743 pl_gram.y:771 +#: pl_gram.y:716 pl_gram.y:744 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "Variable »%s« verdeckt eine zuvor definierte Variable" -#: pl_gram.y:1043 +#: pl_gram.y:1018 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "Diagnostikelement %s ist in GET STACKED DIAGNOSTICS nicht erlaubt" -#: pl_gram.y:1061 +#: pl_gram.y:1036 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "Diagnostikelement %s ist in GET CURRENT DIAGNOSTICS nicht erlaubt" -#: pl_gram.y:1156 +#: pl_gram.y:1134 msgid "unrecognized GET DIAGNOSTICS item" msgstr "unbekanntes Element in GET DIAGNOSTICS" -#: pl_gram.y:1172 pl_gram.y:3557 +#: pl_gram.y:1150 pl_gram.y:3615 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "»%s« ist keine skalare Variable" -#: pl_gram.y:1402 pl_gram.y:1596 +#: pl_gram.y:1380 pl_gram.y:1574 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "Schleifenvariable einer Schleife über Zeilen muss eine Record-Variable oder eine Liste von skalaren Variablen sein" -#: pl_gram.y:1437 +#: pl_gram.y:1415 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "Cursor-FOR-Schleife darf nur eine Zielvariable haben" -#: pl_gram.y:1444 +#: pl_gram.y:1422 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "Cursor-FOR-Schleife muss eine gebundene Cursor-Variable verwenden" -#: pl_gram.y:1535 +#: pl_gram.y:1513 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "ganzzahlige FOR-Schleife darf nur eine Zielvariable haben" -#: pl_gram.y:1569 +#: pl_gram.y:1547 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "REVERSE kann nicht in einer Anfrage-FOR-Schleife verwendet werden" -#: pl_gram.y:1699 +#: pl_gram.y:1677 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "Schleifenvariable von FOREACH muss eine bekannte Variable oder Liste von Variablen sein" -#: pl_gram.y:1741 +#: pl_gram.y:1719 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "diese Anweisung umschließt kein Block und keine Schleife mit Label »%s«" -#: pl_gram.y:1749 +#: pl_gram.y:1727 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "Blocklabel »%s« kann nicht in CONTINUE verwendet werden" -#: pl_gram.y:1764 +#: pl_gram.y:1742 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT kann nicht außerhalb einer Schleife verwendet werden, außer wenn es ein Label hat" -#: pl_gram.y:1765 +#: pl_gram.y:1743 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE kann nicht außerhalb einer Schleife verwendet werden" -#: pl_gram.y:1789 pl_gram.y:1827 pl_gram.y:1875 pl_gram.y:3004 pl_gram.y:3092 -#: pl_gram.y:3203 pl_gram.y:3956 +#: pl_gram.y:1767 pl_gram.y:1805 pl_gram.y:1853 pl_gram.y:3062 pl_gram.y:3150 +#: pl_gram.y:3261 pl_gram.y:4014 msgid "unexpected end of function definition" msgstr "unerwartetes Ende der Funktionsdefinition" -#: pl_gram.y:1895 pl_gram.y:1919 pl_gram.y:1935 pl_gram.y:1941 pl_gram.y:2066 -#: pl_gram.y:2074 pl_gram.y:2088 pl_gram.y:2183 pl_gram.y:2407 pl_gram.y:2497 -#: pl_gram.y:2655 pl_gram.y:3799 pl_gram.y:3860 pl_gram.y:3937 +#: pl_gram.y:1873 pl_gram.y:1897 pl_gram.y:1913 pl_gram.y:1919 pl_gram.y:2044 +#: pl_gram.y:2052 pl_gram.y:2066 pl_gram.y:2161 pl_gram.y:2385 pl_gram.y:2475 +#: pl_gram.y:2634 pl_gram.y:3857 pl_gram.y:3918 pl_gram.y:3995 msgid "syntax error" msgstr "Syntaxfehler" -#: pl_gram.y:1923 pl_gram.y:1925 pl_gram.y:2411 pl_gram.y:2413 +#: pl_gram.y:1901 pl_gram.y:1903 pl_gram.y:2389 pl_gram.y:2391 msgid "invalid SQLSTATE code" msgstr "ungültiger SQLSTATE-Code" -#: pl_gram.y:2131 +#: pl_gram.y:2109 msgid "syntax error, expected \"FOR\"" msgstr "Syntaxfehler, »FOR« erwartet" -#: pl_gram.y:2192 +#: pl_gram.y:2170 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "FETCH-Anweisung kann nicht mehrere Zeilen zurückgeben" -#: pl_gram.y:2289 +#: pl_gram.y:2267 #, c-format msgid "cursor variable must be a simple variable" msgstr "Cursor-Variable muss eine einfache Variable sein" -#: pl_gram.y:2295 +#: pl_gram.y:2273 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "Variable »%s« muss Typ cursor oder refcursor haben" -#: pl_gram.y:2626 pl_gram.y:2637 +#: pl_gram.y:2605 pl_gram.y:2616 #, c-format msgid "\"%s\" is not a known variable" msgstr "»%s« ist keine bekannte Variable" -#: pl_gram.y:2743 pl_gram.y:2753 pl_gram.y:2909 +#: pl_gram.y:2722 pl_gram.y:2732 pl_gram.y:2912 msgid "mismatched parentheses" msgstr "Klammern passen nicht" -#: pl_gram.y:2757 +#: pl_gram.y:2736 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "»%s« fehlt am Ende des SQL-Ausdrucks" -#: pl_gram.y:2763 +#: pl_gram.y:2742 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "»%s« fehlt am Ende der SQL-Anweisung" -#: pl_gram.y:2780 +#: pl_gram.y:2759 msgid "missing expression" msgstr "Ausdruck fehlt" -#: pl_gram.y:2782 +#: pl_gram.y:2761 msgid "missing SQL statement" msgstr "SQL-Anweisung fehlt" -#: pl_gram.y:2911 +#: pl_gram.y:2890 +msgid "syntax error, expected \"]\"" +msgstr "Syntaxfehler, »]« erwartet" + +#: pl_gram.y:2914 msgid "incomplete data type declaration" msgstr "unvollständige Datentypdeklaration" -#: pl_gram.y:2934 +#: pl_gram.y:2937 msgid "missing data type declaration" msgstr "fehlende Datentypdeklaration" -#: pl_gram.y:3014 +#: pl_gram.y:3072 msgid "INTO specified more than once" msgstr "INTO mehr als einmal angegeben" -#: pl_gram.y:3184 +#: pl_gram.y:3242 msgid "expected FROM or IN" msgstr "FROM oder IN erwartet" -#: pl_gram.y:3245 +#: pl_gram.y:3303 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "RETURN kann keinen Parameter haben in einer Funktion mit Mengenergebnis" -#: pl_gram.y:3246 +#: pl_gram.y:3304 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Verwenden Sie RETURN NEXT oder RETURN QUERY." -#: pl_gram.y:3256 +#: pl_gram.y:3314 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "RETURN kann keinen Parameter haben in einer Prozedur" -#: pl_gram.y:3261 +#: pl_gram.y:3319 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURN kann keinen Parameter haben in einer Funktion, die »void« zurückgibt" -#: pl_gram.y:3270 +#: pl_gram.y:3328 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN kann keinen Parameter haben in einer Funktion mit OUT-Parametern" -#: pl_gram.y:3333 +#: pl_gram.y:3391 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "RETURN NEXT kann keinen Parameter haben in einer Funktion mit OUT-Parametern" -#: pl_gram.y:3441 -#, c-format -msgid "variable \"%s\" is declared CONSTANT" -msgstr "Variable »%s« ist als CONSTANT deklariert" - -#: pl_gram.y:3499 +#: pl_gram.y:3557 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "Record-Variable kann nicht Teil einer INTO-Liste mit mehreren Elementen sein" -#: pl_gram.y:3545 +#: pl_gram.y:3603 #, c-format msgid "too many INTO variables specified" msgstr "zu viele INTO-Variablen angegeben" -#: pl_gram.y:3753 +#: pl_gram.y:3811 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "Endlabel »%s« für ungelabelten Block angegeben" -#: pl_gram.y:3760 +#: pl_gram.y:3818 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "Endlabel »%s« unterscheidet sich vom Label des Blocks »%s«" -#: pl_gram.y:3794 +#: pl_gram.y:3852 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "Cursor »%s« hat keine Argumente" -#: pl_gram.y:3808 +#: pl_gram.y:3866 #, c-format msgid "cursor \"%s\" has arguments" msgstr "Cursor »%s« hat Argumente" -#: pl_gram.y:3850 +#: pl_gram.y:3908 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "Cursor »%s« hat kein Argument namens »%s«" -#: pl_gram.y:3870 +#: pl_gram.y:3928 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "Wert für Parameter »%s« von Cursor »%s« mehrmals angegeben" -#: pl_gram.y:3895 +#: pl_gram.y:3953 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "nicht genügend Argumente für Cursor »%s«" -#: pl_gram.y:3902 +#: pl_gram.y:3960 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "zu viele Argumente für Cursor »%s«" -#: pl_gram.y:3988 +#: pl_gram.y:4046 msgid "unrecognized RAISE statement option" msgstr "unbekannte Option für RAISE-Anweisung" -#: pl_gram.y:3992 +#: pl_gram.y:4050 msgid "syntax error, expected \"=\"" msgstr "Syntaxfehler, »=« erwartet" -#: pl_gram.y:4033 +#: pl_gram.y:4091 #, c-format msgid "too many parameters specified for RAISE" msgstr "zu viele Parameter für RAISE angegeben" -#: pl_gram.y:4037 +#: pl_gram.y:4095 #, c-format msgid "too few parameters specified for RAISE" msgstr "zu wenige Parameter für RAISE angegeben" diff --git a/src/pl/plpgsql/src/po/es.po b/src/pl/plpgsql/src/po/es.po index 1c12451409bfd..c045415aa326c 100644 --- a/src/pl/plpgsql/src/po/es.po +++ b/src/pl/plpgsql/src/po/es.po @@ -10,10 +10,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plpgsql (PostgreSQL) 16\n" +"Project-Id-Version: plpgsql (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:09+0000\n" -"PO-Revision-Date: 2023-05-22 12:06+0200\n" +"POT-Creation-Date: 2025-02-16 19:39+0000\n" +"PO-Revision-Date: 2024-11-16 14:24+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -78,104 +78,119 @@ msgstr "la referencia a la columna «%s» es ambigua" msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Podría referirse tanto a una variable PL/pgSQL como a una columna de una tabla." -#: pl_comp.c:1314 pl_exec.c:5255 pl_exec.c:5428 pl_exec.c:5515 pl_exec.c:5606 -#: pl_exec.c:6624 +#: pl_comp.c:1314 pl_exec.c:5260 pl_exec.c:5433 pl_exec.c:5520 pl_exec.c:5611 +#: pl_exec.c:6636 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "el registro «%s» no tiene un campo «%s»" -#: pl_comp.c:1808 +#: pl_comp.c:1633 pl_gram.y:645 pl_gram.y:660 pl_gram.y:686 +#, c-format +msgid "variable \"%s\" does not exist" +msgstr "no existe la variable «%s»" + +#: pl_comp.c:1722 +#, c-format +msgid "column \"%s\" of relation \"%s\" does not exist" +msgstr "no existe la columna «%s» en la relación «%s»" + +#: pl_comp.c:1775 #, c-format msgid "relation \"%s\" does not exist" msgstr "no existe la relación «%s»" -#: pl_comp.c:1815 pl_comp.c:1857 +#: pl_comp.c:1782 pl_comp.c:1820 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "la relación «%s» no contiene un tipo compuesto" -#: pl_comp.c:1923 +#: pl_comp.c:1886 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "la variable «%s» tiene pseudotipo %s" -#: pl_comp.c:2112 +#: pl_comp.c:2075 #, c-format msgid "type \"%s\" is only a shell" msgstr "el tipo «%s» está inconcluso" -#: pl_comp.c:2194 pl_exec.c:6925 +#: pl_comp.c:2157 pl_exec.c:6937 #, c-format msgid "type %s is not composite" msgstr "el tipo %s no es compuesto" -#: pl_comp.c:2242 pl_comp.c:2295 +#: pl_comp.c:2193 +#, c-format +msgid "could not find array type for data type %s" +msgstr "no se pudo encontrar un tipo de array para el tipo de dato %s" + +#: pl_comp.c:2232 pl_comp.c:2285 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "no se reconoce la condición de excepción «%s»" -#: pl_comp.c:2524 +#: pl_comp.c:2514 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "no se pudo determinar el verdadero tipo de argumento para la función polimórfica «%s»" -#: pl_exec.c:511 pl_exec.c:950 pl_exec.c:1185 +#: pl_exec.c:512 pl_exec.c:951 pl_exec.c:1186 msgid "during initialization of execution state" msgstr "durante la inicialización del estado de ejecución" -#: pl_exec.c:517 +#: pl_exec.c:518 msgid "while storing call arguments into local variables" msgstr "mientras se almacenaban los argumentos de invocación en variables locales" -#: pl_exec.c:605 pl_exec.c:1023 +#: pl_exec.c:606 pl_exec.c:1024 msgid "during function entry" msgstr "durante el ingreso a la función" -#: pl_exec.c:628 +#: pl_exec.c:629 #, c-format msgid "control reached end of function without RETURN" msgstr "la ejecución alcanzó el fin de la función sin encontrar RETURN" -#: pl_exec.c:634 +#: pl_exec.c:635 msgid "while casting return value to function's return type" msgstr "mientras se hacía la conversión del valor de retorno al tipo de retorno de la función" -#: pl_exec.c:646 pl_exec.c:3681 +#: pl_exec.c:647 pl_exec.c:3683 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "se llamó una función que retorna un conjunto en un contexto que no puede aceptarlo" -#: pl_exec.c:651 pl_exec.c:3687 +#: pl_exec.c:652 pl_exec.c:3689 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "se requiere un nodo «materialize», pero no está permitido en este contexto" -#: pl_exec.c:778 pl_exec.c:1049 pl_exec.c:1207 +#: pl_exec.c:779 pl_exec.c:1050 pl_exec.c:1208 msgid "during function exit" msgstr "durante la salida de la función" -#: pl_exec.c:833 pl_exec.c:897 pl_exec.c:3480 +#: pl_exec.c:834 pl_exec.c:898 pl_exec.c:3482 msgid "returned record type does not match expected record type" msgstr "el tipo de registro retornado no coincide con el tipo de registro esperado" -#: pl_exec.c:1046 pl_exec.c:1204 +#: pl_exec.c:1047 pl_exec.c:1205 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "la ejecución alcanzó el fin del procedimiento disparador sin encontrar RETURN" -#: pl_exec.c:1054 +#: pl_exec.c:1055 #, c-format msgid "trigger procedure cannot return a set" msgstr "los procedimientos disparadores no pueden retornar conjuntos" -#: pl_exec.c:1093 pl_exec.c:1121 +#: pl_exec.c:1094 pl_exec.c:1122 msgid "returned row structure does not match the structure of the triggering table" msgstr "la estructura de fila retornada no coincide con la estructura de la tabla que generó el evento de disparador" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1262 +#: pl_exec.c:1263 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "función PL/pgSQL %s en la línea %d %s" @@ -183,35 +198,35 @@ msgstr "función PL/pgSQL %s en la línea %d %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1273 +#: pl_exec.c:1274 #, c-format msgid "PL/pgSQL function %s %s" msgstr "función PL/pgSQL %s %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1281 +#: pl_exec.c:1282 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "función PL/pgSQL %s en la línea %d en %s" -#: pl_exec.c:1287 +#: pl_exec.c:1288 #, c-format msgid "PL/pgSQL function %s" msgstr "función PL/pgSQL %s" -#: pl_exec.c:1658 +#: pl_exec.c:1659 msgid "during statement block local variable initialization" msgstr "durante inicialización de variables locales en el bloque de sentencias" -#: pl_exec.c:1763 +#: pl_exec.c:1764 msgid "during statement block entry" msgstr "durante la entrada al bloque de sentencias" -#: pl_exec.c:1795 +#: pl_exec.c:1796 msgid "during statement block exit" msgstr "durante la salida del bloque de sentencias" -#: pl_exec.c:1833 +#: pl_exec.c:1834 msgid "during exception cleanup" msgstr "durante la finalización por excepción" @@ -225,294 +240,294 @@ msgstr "el parámetro de procedimiento «%s» es un parámetro de salida pero el msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "el parámetro de procedimiento %d es un parámetro de salida pero el argumento correspondiente no es escribible" -#: pl_exec.c:2409 +#: pl_exec.c:2411 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS no puede ser usado fuera de un manejador de excepción" -#: pl_exec.c:2615 +#: pl_exec.c:2617 #, c-format msgid "case not found" msgstr "caso no encontrado" -#: pl_exec.c:2616 +#: pl_exec.c:2618 #, c-format msgid "CASE statement is missing ELSE part." msgstr "A la sentencia CASE le falta la parte ELSE." -#: pl_exec.c:2709 +#: pl_exec.c:2711 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "el límite inferior de un ciclo FOR no puede ser null" -#: pl_exec.c:2725 +#: pl_exec.c:2727 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "el límite superior de un ciclo FOR no puede ser null" -#: pl_exec.c:2743 +#: pl_exec.c:2745 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "el valor BY de un ciclo FOR no puede ser null" -#: pl_exec.c:2749 +#: pl_exec.c:2751 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "el valor BY de un ciclo FOR debe ser mayor que cero" -#: pl_exec.c:2883 pl_exec.c:4688 +#: pl_exec.c:2885 pl_exec.c:4693 #, c-format msgid "cursor \"%s\" already in use" msgstr "el cursor «%s» ya está en uso" -#: pl_exec.c:2906 pl_exec.c:4758 +#: pl_exec.c:2908 pl_exec.c:4763 #, c-format msgid "arguments given for cursor without arguments" msgstr "se dieron argumentos a un cursor sin argumentos" -#: pl_exec.c:2925 pl_exec.c:4777 +#: pl_exec.c:2927 pl_exec.c:4782 #, c-format msgid "arguments required for cursor" msgstr "se requieren argumentos para el cursor" -#: pl_exec.c:3016 +#: pl_exec.c:3018 #, c-format msgid "FOREACH expression must not be null" msgstr "la expresión FOREACH no debe ser nula" -#: pl_exec.c:3031 +#: pl_exec.c:3033 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "una expresión FOREACH debe retornar un array, no tipo %s" -#: pl_exec.c:3048 +#: pl_exec.c:3050 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "la dimensión del slice (%d) está fuera de rango 0..%d" -#: pl_exec.c:3075 +#: pl_exec.c:3077 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "las variables de bucles FOREACH ... SLICE deben ser de un tipo array" -#: pl_exec.c:3079 +#: pl_exec.c:3081 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "la variable de bucle FOREACH no debe ser de tipo array" -#: pl_exec.c:3241 pl_exec.c:3298 pl_exec.c:3473 +#: pl_exec.c:3243 pl_exec.c:3300 pl_exec.c:3475 #, c-format msgid "cannot return non-composite value from function returning composite type" msgstr "no se puede retornar un valor no-compuesto desde una función que retorne tipos compuestos" -#: pl_exec.c:3337 pl_gram.y:3295 +#: pl_exec.c:3339 pl_gram.y:3375 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "no se puede usar RETURN NEXT en una función que no es SETOF" -#: pl_exec.c:3378 pl_exec.c:3510 +#: pl_exec.c:3380 pl_exec.c:3512 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "se pasó un tipo incorrecto de resultado a RETURN NEXT" -#: pl_exec.c:3416 pl_exec.c:3437 +#: pl_exec.c:3418 pl_exec.c:3439 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "se pasó un tipo de registro incorrecto a RETURN NEXT" -#: pl_exec.c:3529 +#: pl_exec.c:3531 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT debe tener un parámetro" -#: pl_exec.c:3557 pl_gram.y:3359 +#: pl_exec.c:3559 pl_gram.y:3439 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "no se puede usar RETURN QUERY en una función que no ha sido declarada SETOF" -#: pl_exec.c:3575 +#: pl_exec.c:3577 msgid "structure of query does not match function result type" msgstr "la estructura de la consulta no coincide con el tipo del resultado de la función" -#: pl_exec.c:3630 pl_exec.c:4465 pl_exec.c:8724 +#: pl_exec.c:3632 pl_exec.c:4469 pl_exec.c:8759 #, c-format msgid "query string argument of EXECUTE is null" msgstr "el argumento de consulta a ejecutar en EXECUTE es null" -#: pl_exec.c:3715 pl_exec.c:3853 +#: pl_exec.c:3717 pl_exec.c:3855 #, c-format msgid "RAISE option already specified: %s" msgstr "la opción de RAISE ya se especificó: %s" -#: pl_exec.c:3749 +#: pl_exec.c:3751 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE sin parámetros no puede ser usado fuera de un manejador de excepción" -#: pl_exec.c:3843 +#: pl_exec.c:3845 #, c-format msgid "RAISE statement option cannot be null" msgstr "la opción de sentencia en RAISE no puede ser null" -#: pl_exec.c:3913 +#: pl_exec.c:3915 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3968 +#: pl_exec.c:3970 #, c-format msgid "assertion failed" msgstr "aseveración falló" -#: pl_exec.c:4338 pl_exec.c:4527 +#: pl_exec.c:4342 pl_exec.c:4532 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "no se puede ejecutar COPY desde/a un cliente en PL/pgSQL" -#: pl_exec.c:4344 +#: pl_exec.c:4348 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "orden de transacción no soportada en PL/pgSQL" -#: pl_exec.c:4367 pl_exec.c:4556 +#: pl_exec.c:4371 pl_exec.c:4561 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO es utilizado con una orden que no puede retornar datos" -#: pl_exec.c:4390 pl_exec.c:4579 +#: pl_exec.c:4394 pl_exec.c:4584 #, c-format msgid "query returned no rows" msgstr "la consulta no regresó filas" -#: pl_exec.c:4412 pl_exec.c:4598 pl_exec.c:5750 +#: pl_exec.c:4416 pl_exec.c:4603 pl_exec.c:5755 #, c-format msgid "query returned more than one row" msgstr "la consulta regresó más de una fila" -#: pl_exec.c:4414 +#: pl_exec.c:4418 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "Asegúrese que la consulta retorne una única fila, o use LIMIT 1." -#: pl_exec.c:4430 +#: pl_exec.c:4434 #, c-format msgid "query has no destination for result data" msgstr "la consulta no tiene un destino para los datos de resultado" -#: pl_exec.c:4431 +#: pl_exec.c:4435 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Si quiere descartar los resultados de un SELECT, utilice PERFORM." -#: pl_exec.c:4519 +#: pl_exec.c:4524 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "no está implementado EXECUTE de un SELECT ... INTO" -#: pl_exec.c:4520 +#: pl_exec.c:4525 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "Puede desear usar EXECUTE ... INTO o EXECUTE CREATE TABLE ... AS en su lugar." -#: pl_exec.c:4533 +#: pl_exec.c:4538 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "no está implementado EXECUTE de órdenes de transacción" -#: pl_exec.c:4843 pl_exec.c:4931 +#: pl_exec.c:4848 pl_exec.c:4936 #, c-format msgid "cursor variable \"%s\" is null" msgstr "variable cursor «%s» es null" -#: pl_exec.c:4854 pl_exec.c:4942 +#: pl_exec.c:4859 pl_exec.c:4947 #, c-format msgid "cursor \"%s\" does not exist" msgstr "no existe el cursor «%s»" -#: pl_exec.c:4867 +#: pl_exec.c:4872 #, c-format msgid "relative or absolute cursor position is null" msgstr "la posición relativa o absoluta del cursor es null" -#: pl_exec.c:5105 pl_exec.c:5200 +#: pl_exec.c:5110 pl_exec.c:5205 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "no puede asignarse un valor null a la variable «%s» que fue declarada NOT NULL" -#: pl_exec.c:5181 +#: pl_exec.c:5186 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "no se puede asignar un valor no compuesto a una variable de tipo row" -#: pl_exec.c:5213 +#: pl_exec.c:5218 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "no se puede asignar un valor no compuesto a una variable de tipo record" -#: pl_exec.c:5264 +#: pl_exec.c:5269 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "no se puede asignar a la columna de sistema «%s»" -#: pl_exec.c:5713 +#: pl_exec.c:5718 #, c-format msgid "query did not return data" msgstr "la consulta no retornó datos" -#: pl_exec.c:5714 pl_exec.c:5726 pl_exec.c:5751 pl_exec.c:5827 pl_exec.c:5832 +#: pl_exec.c:5719 pl_exec.c:5731 pl_exec.c:5756 pl_exec.c:5832 pl_exec.c:5837 #, c-format msgid "query: %s" msgstr "consulta: %s" -#: pl_exec.c:5722 +#: pl_exec.c:5727 #, c-format msgid "query returned %d column" msgid_plural "query returned %d columns" msgstr[0] "la consulta retornó %d columna" msgstr[1] "la consulta retornó %d columnas" -#: pl_exec.c:5826 +#: pl_exec.c:5831 #, c-format msgid "query is SELECT INTO, but it should be plain SELECT" msgstr "la consulta es SELECT INTO, pero debería ser un SELECT simple" -#: pl_exec.c:5831 +#: pl_exec.c:5836 #, c-format msgid "query is not a SELECT" msgstr "la consulta no es un SELECT" -#: pl_exec.c:6638 pl_exec.c:6678 pl_exec.c:6718 +#: pl_exec.c:6650 pl_exec.c:6690 pl_exec.c:6730 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "el tipo del parámetro %d (%s) no coincide aquel con que fue preparado el plan (%s)" -#: pl_exec.c:7129 pl_exec.c:7163 pl_exec.c:7237 pl_exec.c:7263 +#: pl_exec.c:7141 pl_exec.c:7175 pl_exec.c:7249 pl_exec.c:7275 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "no coincide el número de campos de origen y destino en la asignación" #. translator: %s represents a name of an extra check -#: pl_exec.c:7131 pl_exec.c:7165 pl_exec.c:7239 pl_exec.c:7265 +#: pl_exec.c:7143 pl_exec.c:7177 pl_exec.c:7251 pl_exec.c:7277 #, c-format msgid "%s check of %s is active." msgstr "El chequeo %s de %s está activo." -#: pl_exec.c:7135 pl_exec.c:7169 pl_exec.c:7243 pl_exec.c:7269 +#: pl_exec.c:7147 pl_exec.c:7181 pl_exec.c:7255 pl_exec.c:7281 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "Asegúrese que la consulta retorna la lista exacta de columnas." -#: pl_exec.c:7656 +#: pl_exec.c:7668 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "el registro «%s» no ha sido asignado aún" -#: pl_exec.c:7657 +#: pl_exec.c:7669 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "La estructura de fila de un registro aún no asignado no está determinado." -#: pl_exec.c:8322 pl_gram.y:3418 +#: pl_exec.c:8357 pl_gram.y:3498 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "la variable «%s» esta declarada como CONSTANT" @@ -564,11 +579,6 @@ msgstr "los ordenamientos (collation) no están soportados por el tipo %s" msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "la variable «%s» debe tener valor por omisión, puesto que está declarado NOT NULL" -#: pl_gram.y:645 pl_gram.y:660 pl_gram.y:686 -#, c-format -msgid "variable \"%s\" does not exist" -msgstr "no existe la variable «%s»" - #: pl_gram.y:704 pl_gram.y:732 msgid "duplicate declaration" msgstr "declaración duplicada" @@ -578,36 +588,36 @@ msgstr "declaración duplicada" msgid "variable \"%s\" shadows a previously defined variable" msgstr "la variable «%s» oculta una variable definida anteriormente" -#: pl_gram.y:1016 +#: pl_gram.y:1017 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "elemento de diagnóstico %s no se permite en GET STACKED DIAGNOSTICS" -#: pl_gram.y:1034 +#: pl_gram.y:1035 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "elemento de diagnóstico %s no se permite en GET STACKED DIAGNOSTICS" -#: pl_gram.y:1132 +#: pl_gram.y:1133 msgid "unrecognized GET DIAGNOSTICS item" msgstr "elemento de GET DIAGNOSTICS no reconocido" -#: pl_gram.y:1148 pl_gram.y:3534 +#: pl_gram.y:1149 pl_gram.y:3614 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "«%s» no es una variable escalar" -#: pl_gram.y:1378 pl_gram.y:1572 +#: pl_gram.y:1379 pl_gram.y:1572 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "la variable de bucle de un bucle sobre filas debe ser una variable de tipo record o una lista de variables escalares" -#: pl_gram.y:1413 +#: pl_gram.y:1414 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "un bucle FOR de un cursor debe tener sólo una variable de destino" -#: pl_gram.y:1420 +#: pl_gram.y:1421 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "un bucle FOR en torno a un cursor debe usar un cursor enlazado (bound)" @@ -647,14 +657,14 @@ msgstr "EXIT no puede usarse fuera de un bucle, a menos que tenga una etiqueta" msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE no puede usarse fuera de un bucle" -#: pl_gram.y:1765 pl_gram.y:1803 pl_gram.y:1851 pl_gram.y:2981 pl_gram.y:3069 -#: pl_gram.y:3180 pl_gram.y:3933 +#: pl_gram.y:1765 pl_gram.y:1803 pl_gram.y:1851 pl_gram.y:3061 pl_gram.y:3149 +#: pl_gram.y:3260 pl_gram.y:4009 msgid "unexpected end of function definition" msgstr "fin inesperado de la definición de la función" #: pl_gram.y:1871 pl_gram.y:1895 pl_gram.y:1911 pl_gram.y:1917 pl_gram.y:2042 #: pl_gram.y:2050 pl_gram.y:2064 pl_gram.y:2159 pl_gram.y:2383 pl_gram.y:2473 -#: pl_gram.y:2632 pl_gram.y:3776 pl_gram.y:3837 pl_gram.y:3914 +#: pl_gram.y:2632 pl_gram.y:3856 pl_gram.y:3917 pl_gram.y:3990 msgid "syntax error" msgstr "error de sintaxis" @@ -686,138 +696,142 @@ msgstr "la variable «%s» debe ser de tipo cursor o refcursor" msgid "\"%s\" is not a known variable" msgstr "«%s» no es una variable conocida" -#: pl_gram.y:2720 pl_gram.y:2730 pl_gram.y:2886 +#: pl_gram.y:2719 pl_gram.y:2729 pl_gram.y:2911 msgid "mismatched parentheses" msgstr "no coinciden los paréntesis" -#: pl_gram.y:2734 +#: pl_gram.y:2733 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "falta «%s» al final de la expresión SQL" -#: pl_gram.y:2740 +#: pl_gram.y:2739 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "falta «%s» al final de la sentencia SQL" -#: pl_gram.y:2757 +#: pl_gram.y:2758 msgid "missing expression" msgstr "expresión faltante" -#: pl_gram.y:2759 +#: pl_gram.y:2760 msgid "missing SQL statement" msgstr "sentencia SQL faltante" -#: pl_gram.y:2888 +#: pl_gram.y:2889 +msgid "syntax error, expected \"]\"" +msgstr "error de sintaxis, se esperaba «]»" + +#: pl_gram.y:2913 msgid "incomplete data type declaration" msgstr "declaración de tipo de dato incompleta" -#: pl_gram.y:2911 +#: pl_gram.y:2936 msgid "missing data type declaration" msgstr "declaración de tipo de dato faltante" -#: pl_gram.y:2991 +#: pl_gram.y:3071 msgid "INTO specified more than once" msgstr "INTO fue especificado más de una vez" -#: pl_gram.y:3161 +#: pl_gram.y:3241 msgid "expected FROM or IN" msgstr "se espera FROM o IN" -#: pl_gram.y:3222 +#: pl_gram.y:3302 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "RETURN no puede tener un parámetro en una función que retorna un conjunto" -#: pl_gram.y:3223 +#: pl_gram.y:3303 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Use RETURN NEXT o RETURN QUERY." -#: pl_gram.y:3233 +#: pl_gram.y:3313 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "RETURN no puede tener un parámetro un procedimiento" -#: pl_gram.y:3238 +#: pl_gram.y:3318 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURN no puede tener parámetro en una función que retorna void" -#: pl_gram.y:3247 +#: pl_gram.y:3327 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN no puede tener parámetros en una función con parámetros OUT" -#: pl_gram.y:3310 +#: pl_gram.y:3390 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "RETURN NEXT no puede tener parámetros en una función con parámetros OUT" -#: pl_gram.y:3476 +#: pl_gram.y:3556 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "una variable de tipo record no puede ser parte de una lista INTO de múltiples elementos" -#: pl_gram.y:3522 +#: pl_gram.y:3602 #, c-format msgid "too many INTO variables specified" msgstr "se especificaron demasiadas variables INTO" -#: pl_gram.y:3730 +#: pl_gram.y:3810 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "etiqueta de término «%s» especificada para un bloque sin etiqueta" -#: pl_gram.y:3737 +#: pl_gram.y:3817 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "etiqueta de término «%s» difiere de la etiqueta de bloque «%s»" -#: pl_gram.y:3771 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "el cursor «%s» no tiene argumentos" -#: pl_gram.y:3785 +#: pl_gram.y:3865 #, c-format msgid "cursor \"%s\" has arguments" msgstr "el cursor «%s» tiene argumentos" -#: pl_gram.y:3827 +#: pl_gram.y:3907 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "el cursor «%s» no tiene un argumento llamado «%s»" -#: pl_gram.y:3847 +#: pl_gram.y:3927 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "el valor para el parámetro «%s» del cursor «%s» fue especificado más de una vez" -#: pl_gram.y:3872 +#: pl_gram.y:3948 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "no hay suficientes argumentos para el cursor «%s»" -#: pl_gram.y:3879 +#: pl_gram.y:3955 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "demasiados argumentos para el cursor «%s»" -#: pl_gram.y:3965 +#: pl_gram.y:4041 msgid "unrecognized RAISE statement option" msgstr "no se reconoce la opción de sentencia RAISE" -#: pl_gram.y:3969 +#: pl_gram.y:4045 msgid "syntax error, expected \"=\"" msgstr "error de sintaxis, se esperaba «=»" -#: pl_gram.y:4010 +#: pl_gram.y:4086 #, c-format msgid "too many parameters specified for RAISE" msgstr "se especificaron demasiados parámetros a RAISE" -#: pl_gram.y:4014 +#: pl_gram.y:4090 #, c-format msgid "too few parameters specified for RAISE" msgstr "se especificaron muy pocos parámetros a RAISE" @@ -843,13 +857,13 @@ msgid "List of programming constructs that should produce an error." msgstr "Listado de estructuras de programación que deben dar un error." #. translator: %s is typically the translation of "syntax error" -#: pl_scanner.c:508 +#: pl_scanner.c:525 #, c-format msgid "%s at end of input" msgstr "%s al final de la entrada" #. translator: first %s is typically the translation of "syntax error" -#: pl_scanner.c:524 +#: pl_scanner.c:541 #, c-format msgid "%s at or near \"%s\"" msgstr "%s en o cerca de «%s»" diff --git a/src/pl/plpgsql/src/po/fr.po b/src/pl/plpgsql/src/po/fr.po index 19676ff681cb8..f2b93ddb884d0 100644 --- a/src/pl/plpgsql/src/po/fr.po +++ b/src/pl/plpgsql/src/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-12 05:16+0000\n" -"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"POT-Creation-Date: 2024-08-22 10:09+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,161 +19,176 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: pl_comp.c:438 pl_handler.c:496 +#: pl_comp.c:434 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "les fonctions PL/pgSQL ne peuvent pas accepter le type %s" -#: pl_comp.c:530 +#: pl_comp.c:526 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "n'a pas pu déterminer le type de retour pour la fonction polymorphique « %s »" -#: pl_comp.c:560 +#: pl_comp.c:556 #, c-format msgid "trigger functions can only be called as triggers" msgstr "les fonctions trigger peuvent seulement être appelées par des triggers" -#: pl_comp.c:564 pl_handler.c:480 +#: pl_comp.c:560 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "les fonctions PL/pgSQL ne peuvent pas renvoyer le type %s" -#: pl_comp.c:604 +#: pl_comp.c:600 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "les fonctions triggers ne peuvent pas avoir d'arguments déclarés" -#: pl_comp.c:605 +#: pl_comp.c:601 #, c-format msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." msgstr "À la place, on peut accéder aux arguments du trigger par TG_NARGS et TG_ARGV." -#: pl_comp.c:738 +#: pl_comp.c:734 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "les fonctions triggers sur événement ne peuvent pas avoir des arguments déclarés" -#: pl_comp.c:1002 +#: pl_comp.c:998 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "compilation de la fonction PL/pgSQL « %s » près de la ligne %d" -#: pl_comp.c:1025 +#: pl_comp.c:1021 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "le nom du paramètre « %s » est utilisé plus d'une fois" -#: pl_comp.c:1139 +#: pl_comp.c:1135 #, c-format msgid "column reference \"%s\" is ambiguous" -msgstr "la référence à la colonne « %s » est ambigüe" +msgstr "la référence à la colonne « %s » est ambiguë" -#: pl_comp.c:1141 +#: pl_comp.c:1137 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Cela pourrait faire référence à une variable PL/pgSQL ou à la colonne d'une table." -#: pl_comp.c:1324 pl_exec.c:5216 pl_exec.c:5389 pl_exec.c:5476 pl_exec.c:5567 -#: pl_exec.c:6588 +#: pl_comp.c:1314 pl_exec.c:5260 pl_exec.c:5433 pl_exec.c:5520 pl_exec.c:5611 +#: pl_exec.c:6636 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "l'enregistrement « %s » n'a pas de champs « %s »" -#: pl_comp.c:1818 +#: pl_comp.c:1633 pl_gram.y:645 pl_gram.y:660 pl_gram.y:686 +#, c-format +msgid "variable \"%s\" does not exist" +msgstr "la variable « %s » n'existe pas" + +#: pl_comp.c:1722 +#, c-format +msgid "column \"%s\" of relation \"%s\" does not exist" +msgstr "la colonne « %s » de la relation « %s » n'existe pas" + +#: pl_comp.c:1775 #, c-format msgid "relation \"%s\" does not exist" msgstr "la relation « %s » n'existe pas" -#: pl_comp.c:1825 pl_comp.c:1867 +#: pl_comp.c:1782 pl_comp.c:1820 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "la relation « %s » n'a pas un type composite" -#: pl_comp.c:1933 +#: pl_comp.c:1886 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "la variable « %s » a le pseudo-type %s" -#: pl_comp.c:2122 +#: pl_comp.c:2075 #, c-format msgid "type \"%s\" is only a shell" msgstr "le type « %s » n'est qu'une coquille" -#: pl_comp.c:2204 pl_exec.c:6889 +#: pl_comp.c:2157 pl_exec.c:6937 #, c-format msgid "type %s is not composite" msgstr "le type %s n'est pas un type composite" -#: pl_comp.c:2252 pl_comp.c:2305 +#: pl_comp.c:2193 +#, c-format +msgid "could not find array type for data type %s" +msgstr "n'a pas pu trouver de type tableau pour le type de données %s" + +#: pl_comp.c:2232 pl_comp.c:2285 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "condition d'exception non reconnue « %s »" -#: pl_comp.c:2526 +#: pl_comp.c:2514 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "n'a pas pu déterminer le type d'argument pour la fonction polymorphique « %s »" -#: pl_exec.c:500 pl_exec.c:939 pl_exec.c:1174 +#: pl_exec.c:512 pl_exec.c:951 pl_exec.c:1186 msgid "during initialization of execution state" msgstr "durant l'initialisation de l'état de la fonction" -#: pl_exec.c:506 +#: pl_exec.c:518 msgid "while storing call arguments into local variables" msgstr "lors du stockage des arguments dans les variables locales" -#: pl_exec.c:594 pl_exec.c:1012 +#: pl_exec.c:606 pl_exec.c:1024 msgid "during function entry" msgstr "durant l'entrée d'une fonction" -#: pl_exec.c:617 +#: pl_exec.c:629 #, c-format msgid "control reached end of function without RETURN" msgstr "le contrôle a atteint la fin de la fonction sans RETURN" -#: pl_exec.c:623 +#: pl_exec.c:635 msgid "while casting return value to function's return type" msgstr "lors de la conversion de la valeur de retour au type de retour de la fonction" -#: pl_exec.c:635 pl_exec.c:3656 +#: pl_exec.c:647 pl_exec.c:3683 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "la fonction renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas un ensemble" -#: pl_exec.c:640 pl_exec.c:3662 +#: pl_exec.c:652 pl_exec.c:3689 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "mode matérialisé requis mais interdit dans ce contexte" -#: pl_exec.c:767 pl_exec.c:1038 pl_exec.c:1196 +#: pl_exec.c:779 pl_exec.c:1050 pl_exec.c:1208 msgid "during function exit" msgstr "lors de la sortie de la fonction" -#: pl_exec.c:822 pl_exec.c:886 pl_exec.c:3455 +#: pl_exec.c:834 pl_exec.c:898 pl_exec.c:3482 msgid "returned record type does not match expected record type" msgstr "le type d'enregistrement renvoyé ne correspond pas au type d'enregistrement attendu" -#: pl_exec.c:1035 pl_exec.c:1193 +#: pl_exec.c:1047 pl_exec.c:1205 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "le contrôle a atteint la fin de la procédure trigger sans RETURN" -#: pl_exec.c:1043 +#: pl_exec.c:1055 #, c-format msgid "trigger procedure cannot return a set" msgstr "une procédure trigger ne peut pas renvoyer un ensemble" -#: pl_exec.c:1082 pl_exec.c:1110 +#: pl_exec.c:1094 pl_exec.c:1122 msgid "returned row structure does not match the structure of the triggering table" msgstr "la structure de ligne renvoyée ne correspond pas à la structure de la table du trigger" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1251 +#: pl_exec.c:1263 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "fonction PL/pgSQL %s, ligne %d, %s" @@ -181,49 +196,49 @@ msgstr "fonction PL/pgSQL %s, ligne %d, %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1262 +#: pl_exec.c:1274 #, c-format msgid "PL/pgSQL function %s %s" msgstr "fonction PL/pgSQL %s, %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1270 +#: pl_exec.c:1282 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "fonction PL/pgSQL %s, ligne %d à %s" -#: pl_exec.c:1276 +#: pl_exec.c:1288 #, c-format msgid "PL/pgSQL function %s" msgstr "fonction PL/pgSQL %s" -#: pl_exec.c:1647 +#: pl_exec.c:1659 msgid "during statement block local variable initialization" msgstr "lors de l'initialisation des variables locales du bloc d'instructions" -#: pl_exec.c:1752 +#: pl_exec.c:1764 msgid "during statement block entry" msgstr "lors de l'entrée dans le bloc d'instructions" -#: pl_exec.c:1784 +#: pl_exec.c:1796 msgid "during statement block exit" msgstr "lors de la sortie du bloc d'instructions" -#: pl_exec.c:1822 +#: pl_exec.c:1834 msgid "during exception cleanup" msgstr "lors du nettoyage de l'exception" -#: pl_exec.c:2355 +#: pl_exec.c:2370 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" msgstr "le paramètre de la procédure « %s » est un argument en sortie mais l'argument correspondant n'est pas modifiable" -#: pl_exec.c:2360 +#: pl_exec.c:2375 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "le paramètre de la procédure %d est un paramètre en sortie mais l'argument correspondant n'est pas modifiable" -#: pl_exec.c:2394 +#: pl_exec.c:2411 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS ne peut pas être utilisé à l'extérieur d'un gestionnaire d'exception" @@ -234,288 +249,293 @@ msgstr "GET STACKED DIAGNOSTICS ne peut pas être utilisé à l'extérieur d'un # (errcode(ERRCODE_CASE_NOT_FOUND), # errmsg("case not found"), # errhint("CASE statement is missing ELSE part."))); -#: pl_exec.c:2594 +#: pl_exec.c:2617 #, c-format msgid "case not found" msgstr "cas introuvable" -#: pl_exec.c:2595 +#: pl_exec.c:2618 #, c-format msgid "CASE statement is missing ELSE part." msgstr "l'instruction CASE n'a pas de partie ELSE." -#: pl_exec.c:2688 +#: pl_exec.c:2711 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "la limite inférieure d'une boucle FOR ne peut pas être NULL" -#: pl_exec.c:2704 +#: pl_exec.c:2727 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "la limite supérieure de la boucle FOR ne peut pas être NULL" -#: pl_exec.c:2722 +#: pl_exec.c:2745 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "la valeur BY d'une boucle FOR ne peut pas être NULL" -#: pl_exec.c:2728 +#: pl_exec.c:2751 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "la valeur BY d'une boucle FOR doit être plus grande que zéro" -#: pl_exec.c:2862 pl_exec.c:4658 +#: pl_exec.c:2885 pl_exec.c:4693 #, c-format msgid "cursor \"%s\" already in use" msgstr "curseur « %s » déjà en cours d'utilisation" -#: pl_exec.c:2885 pl_exec.c:4723 +#: pl_exec.c:2908 pl_exec.c:4763 #, c-format msgid "arguments given for cursor without arguments" msgstr "arguments fournis pour un curseur sans argument" -#: pl_exec.c:2904 pl_exec.c:4742 +#: pl_exec.c:2927 pl_exec.c:4782 #, c-format msgid "arguments required for cursor" msgstr "arguments requis pour le curseur" -#: pl_exec.c:2991 +#: pl_exec.c:3018 #, c-format msgid "FOREACH expression must not be null" msgstr "l'expression FOREACH ne doit pas être NULL" -#: pl_exec.c:3006 +#: pl_exec.c:3033 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "l'expression FOREACH doit renvoyer un tableau, pas un type %s" -#: pl_exec.c:3023 +#: pl_exec.c:3050 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "la dimension de la partie (%d) est en dehors des valeurs valides (0..%d)" -#: pl_exec.c:3050 +#: pl_exec.c:3077 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "la variable d'une boucle FOREACH ... SLICE doit être d'un type tableau" -#: pl_exec.c:3054 +#: pl_exec.c:3081 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "la valeur d'une boucle FOREACH ne doit pas être de type tableau" -#: pl_exec.c:3216 pl_exec.c:3273 pl_exec.c:3448 +#: pl_exec.c:3243 pl_exec.c:3300 pl_exec.c:3475 #, c-format msgid "cannot return non-composite value from function returning composite type" msgstr "ne peut pas renvoyer de valeurs non composites à partir d'une fonction renvoyant un type composite" -#: pl_exec.c:3312 pl_gram.y:3318 +#: pl_exec.c:3339 pl_gram.y:3375 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "ne peut pas utiliser RETURN NEXT dans une fonction non SETOF" -#: pl_exec.c:3353 pl_exec.c:3485 +#: pl_exec.c:3380 pl_exec.c:3512 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "mauvais type de résultat fourni dans RETURN NEXT" -#: pl_exec.c:3391 pl_exec.c:3412 +#: pl_exec.c:3418 pl_exec.c:3439 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "mauvais type d'enregistrement fourni à RETURN NEXT" -#: pl_exec.c:3504 +#: pl_exec.c:3531 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT doit avoir un paramètre" -#: pl_exec.c:3532 pl_gram.y:3382 +#: pl_exec.c:3559 pl_gram.y:3439 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "ne peut pas utiliser RETURN QUERY dans une fonction non SETOF" -#: pl_exec.c:3550 +#: pl_exec.c:3577 msgid "structure of query does not match function result type" msgstr "la structure de la requête ne correspond pas au type de résultat de la fonction" -#: pl_exec.c:3605 pl_exec.c:4435 pl_exec.c:8630 +#: pl_exec.c:3632 pl_exec.c:4469 pl_exec.c:8759 #, c-format msgid "query string argument of EXECUTE is null" msgstr "l'argument de la requête d'EXECUTE est NULL" -#: pl_exec.c:3690 pl_exec.c:3828 +#: pl_exec.c:3717 pl_exec.c:3855 #, c-format msgid "RAISE option already specified: %s" msgstr "option RAISE déjà spécifiée : %s" -#: pl_exec.c:3724 +#: pl_exec.c:3751 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE sans paramètre ne peut pas être utilisé sans un gestionnaire d'exceptions" -#: pl_exec.c:3818 +#: pl_exec.c:3845 #, c-format msgid "RAISE statement option cannot be null" msgstr "l'option de l'instruction RAISE ne peut pas être NULL" -#: pl_exec.c:3888 +#: pl_exec.c:3915 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3943 +#: pl_exec.c:3970 #, c-format msgid "assertion failed" msgstr "échec de l'assertion" -#: pl_exec.c:4308 pl_exec.c:4497 +#: pl_exec.c:4342 pl_exec.c:4532 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "ne peut pas utiliser COPY vers/depuis un client en PL/pgSQL" -#: pl_exec.c:4314 +#: pl_exec.c:4348 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "commande de transaction non supportée dans PL/pgSQL" -#: pl_exec.c:4337 pl_exec.c:4526 +#: pl_exec.c:4371 pl_exec.c:4561 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO utilisé dans une commande qui ne peut pas envoyer de données" -#: pl_exec.c:4360 pl_exec.c:4549 +#: pl_exec.c:4394 pl_exec.c:4584 #, c-format msgid "query returned no rows" msgstr "la requête n'a renvoyé aucune ligne" -#: pl_exec.c:4382 pl_exec.c:4568 pl_exec.c:5711 +#: pl_exec.c:4416 pl_exec.c:4603 pl_exec.c:5755 #, c-format msgid "query returned more than one row" msgstr "la requête a renvoyé plus d'une ligne" -#: pl_exec.c:4384 +#: pl_exec.c:4418 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "Assurez-vous que la requête ne renvoie qu'une seule ligne ou utilisez LIMIT 1." -#: pl_exec.c:4400 +#: pl_exec.c:4434 #, c-format msgid "query has no destination for result data" msgstr "la requête n'a pas de destination pour les données résultantes" -#: pl_exec.c:4401 +#: pl_exec.c:4435 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Si vous voulez ignorer le résultat d'un SELECT, utilisez PERFORM à la place." -#: pl_exec.c:4489 +#: pl_exec.c:4524 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" -msgstr "EXECUTE n'est pas implementé pour SELECT ... INTO" +msgstr "EXECUTE n'est pas implémenté pour SELECT ... INTO" -#: pl_exec.c:4490 +#: pl_exec.c:4525 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "Vous pouvez aussi utiliser EXECUTE ... INTO ou EXECUTE CREATE TABLE ... AS à la place." -#: pl_exec.c:4503 +#: pl_exec.c:4538 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE pour les commandes de transactions n'est pas implémenté" -#: pl_exec.c:4804 pl_exec.c:4892 +#: pl_exec.c:4848 pl_exec.c:4936 #, c-format msgid "cursor variable \"%s\" is null" msgstr "la variable du curseur « %s » est NULL" -#: pl_exec.c:4815 pl_exec.c:4903 +#: pl_exec.c:4859 pl_exec.c:4947 #, c-format msgid "cursor \"%s\" does not exist" msgstr "le curseur « %s » n'existe pas" -#: pl_exec.c:4828 +#: pl_exec.c:4872 #, c-format msgid "relative or absolute cursor position is null" msgstr "la position relative ou absolue du curseur est NULL" -#: pl_exec.c:5066 pl_exec.c:5161 +#: pl_exec.c:5110 pl_exec.c:5205 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "une valeur NULL ne peut pas être affectée à la variable « %s » déclarée non NULL" -#: pl_exec.c:5142 +#: pl_exec.c:5186 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "ne peut pas affecter une valeur non composite à une variable de type ROW" -#: pl_exec.c:5174 +#: pl_exec.c:5218 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "ne peut pas affecter une valeur non composite à une variable RECORD" -#: pl_exec.c:5225 +#: pl_exec.c:5269 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "ne peut pas affecter à une colonne système « %s »" -#: pl_exec.c:5674 +#: pl_exec.c:5718 #, c-format msgid "query did not return data" msgstr "la requête n'a pas renvoyé de données" -#: pl_exec.c:5675 pl_exec.c:5687 pl_exec.c:5712 pl_exec.c:5788 pl_exec.c:5793 +#: pl_exec.c:5719 pl_exec.c:5731 pl_exec.c:5756 pl_exec.c:5832 pl_exec.c:5837 #, c-format msgid "query: %s" msgstr "requête : %s" -#: pl_exec.c:5683 +#: pl_exec.c:5727 #, c-format msgid "query returned %d column" msgid_plural "query returned %d columns" msgstr[0] "la requête a renvoyé %d colonne" msgstr[1] "la requête a renvoyé %d colonnes" -#: pl_exec.c:5787 +#: pl_exec.c:5831 #, c-format msgid "query is SELECT INTO, but it should be plain SELECT" msgstr "la requête est SELECT INTO, alors qu'elle devrait être un simple SELECT" -#: pl_exec.c:5792 +#: pl_exec.c:5836 #, c-format msgid "query is not a SELECT" msgstr "la requête n'est pas un SELECT" -#: pl_exec.c:6602 pl_exec.c:6642 pl_exec.c:6682 +#: pl_exec.c:6650 pl_exec.c:6690 pl_exec.c:6730 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "le type de paramètre %d (%s) ne correspond pas à celui préparé dans le plan (%s)" -#: pl_exec.c:7093 pl_exec.c:7127 pl_exec.c:7201 pl_exec.c:7227 +#: pl_exec.c:7141 pl_exec.c:7175 pl_exec.c:7249 pl_exec.c:7275 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "le nombre de champs source et celui de champs cible dans l'affectation ne correspondent pas" #. translator: %s represents a name of an extra check -#: pl_exec.c:7095 pl_exec.c:7129 pl_exec.c:7203 pl_exec.c:7229 +#: pl_exec.c:7143 pl_exec.c:7177 pl_exec.c:7251 pl_exec.c:7277 #, c-format msgid "%s check of %s is active." msgstr "%s vérification de %s est active." -#: pl_exec.c:7099 pl_exec.c:7133 pl_exec.c:7207 pl_exec.c:7233 +#: pl_exec.c:7147 pl_exec.c:7181 pl_exec.c:7255 pl_exec.c:7281 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "Assurez-vous que la requête renvoie la liste exacte des colonnes." -#: pl_exec.c:7620 +#: pl_exec.c:7668 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "l'enregistrement « %s » n'est pas encore affecté" -#: pl_exec.c:7621 +#: pl_exec.c:7669 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "La structure de ligne d'un enregistrement pas encore affecté est indéterminée." +#: pl_exec.c:8357 pl_gram.y:3498 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "la variable « %s » est déclarée CONSTANT" + #: pl_funcs.c:237 msgid "statement block" msgstr "bloc d'instructions" @@ -548,280 +568,274 @@ msgstr "instruction SQL" msgid "FOR over EXECUTE statement" msgstr "FOR sur une instruction EXECUTE" -#: pl_gram.y:486 +#: pl_gram.y:485 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "le label du bloc doit être placé avant DECLARE, et non pas après" -#: pl_gram.y:506 +#: pl_gram.y:505 #, c-format msgid "collations are not supported by type %s" msgstr "les collationnements ne sont pas supportés par le type %s" -#: pl_gram.y:525 +#: pl_gram.y:524 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "la variable « %s » doit avoir une valeur par défaut car elle est déclarée NOT NULL" -#: pl_gram.y:673 pl_gram.y:688 pl_gram.y:714 -#, c-format -msgid "variable \"%s\" does not exist" -msgstr "la variable « %s » n'existe pas" - -#: pl_gram.y:732 pl_gram.y:760 +#: pl_gram.y:704 pl_gram.y:732 msgid "duplicate declaration" msgstr "déclaration dupliquée" -#: pl_gram.y:743 pl_gram.y:771 +#: pl_gram.y:715 pl_gram.y:743 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "la variable « %s » cache une variable définie précédemment" -#: pl_gram.y:1043 +#: pl_gram.y:1017 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "l'élément %s de diagnostique n'est pas autorisé dans GET STACKED DIAGNOSTICS" -#: pl_gram.y:1061 +#: pl_gram.y:1035 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "l'élément %s de diagnostique n'est pas autorisé dans GET CURRENT DIAGNOSTICS" -#: pl_gram.y:1156 +#: pl_gram.y:1133 msgid "unrecognized GET DIAGNOSTICS item" msgstr "élément GET DIAGNOSTICS non reconnu" -#: pl_gram.y:1172 pl_gram.y:3557 +#: pl_gram.y:1149 pl_gram.y:3614 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "« %s » n'est pas une variable scalaire" -#: pl_gram.y:1402 pl_gram.y:1596 +#: pl_gram.y:1379 pl_gram.y:1572 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "la variable d'une boucle sur des lignes doit être une variable de type record ou une liste de variables scalaires" -#: pl_gram.y:1437 +#: pl_gram.y:1414 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "le curseur de la boucle FOR ne doit avoir qu'une seule variable cible" -#: pl_gram.y:1444 +#: pl_gram.y:1421 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "le curseur de la boucle FOR doit utiliser une variable d'un curseur lié" -#: pl_gram.y:1535 +#: pl_gram.y:1511 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "une boucle FOR de type entier ne doit avoir qu'une seule variable cible" -#: pl_gram.y:1569 +#: pl_gram.y:1545 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "ne peut pas spécifier REVERSE dans la requête d'une boucle FOR" -#: pl_gram.y:1699 +#: pl_gram.y:1675 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "la variable d'une boucle FOREACH doit être une variable connue ou une liste de variables" -#: pl_gram.y:1741 +#: pl_gram.y:1717 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "il n'existe pas de label « %s » attaché à un bloc ou à une boucle englobant cette instruction" -#: pl_gram.y:1749 +#: pl_gram.y:1725 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "le label de bloc « %s » ne peut pas être utilisé avec CONTINUE" -#: pl_gram.y:1764 +#: pl_gram.y:1740 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT ne peut pas être utilisé à l'extérieur d'une boucle, sauf s'il a un label" -#: pl_gram.y:1765 +#: pl_gram.y:1741 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE ne peut pas être utilisé à l'extérieur d'une boucle" -#: pl_gram.y:1789 pl_gram.y:1827 pl_gram.y:1875 pl_gram.y:3004 pl_gram.y:3092 -#: pl_gram.y:3203 pl_gram.y:3956 +#: pl_gram.y:1765 pl_gram.y:1803 pl_gram.y:1851 pl_gram.y:3061 pl_gram.y:3149 +#: pl_gram.y:3260 pl_gram.y:4009 msgid "unexpected end of function definition" msgstr "fin inattendue de la définition de la fonction" -#: pl_gram.y:1895 pl_gram.y:1919 pl_gram.y:1935 pl_gram.y:1941 pl_gram.y:2066 -#: pl_gram.y:2074 pl_gram.y:2088 pl_gram.y:2183 pl_gram.y:2407 pl_gram.y:2497 -#: pl_gram.y:2655 pl_gram.y:3799 pl_gram.y:3860 pl_gram.y:3937 +#: pl_gram.y:1871 pl_gram.y:1895 pl_gram.y:1911 pl_gram.y:1917 pl_gram.y:2042 +#: pl_gram.y:2050 pl_gram.y:2064 pl_gram.y:2159 pl_gram.y:2383 pl_gram.y:2473 +#: pl_gram.y:2632 pl_gram.y:3856 pl_gram.y:3917 pl_gram.y:3990 msgid "syntax error" msgstr "erreur de syntaxe" -#: pl_gram.y:1923 pl_gram.y:1925 pl_gram.y:2411 pl_gram.y:2413 +#: pl_gram.y:1899 pl_gram.y:1901 pl_gram.y:2387 pl_gram.y:2389 msgid "invalid SQLSTATE code" msgstr "code SQLSTATE invalide" -#: pl_gram.y:2131 +#: pl_gram.y:2107 msgid "syntax error, expected \"FOR\"" msgstr "erreur de syntaxe, « FOR » attendu" -#: pl_gram.y:2192 +#: pl_gram.y:2168 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "l'instruction FETCH ne peut pas renvoyer plusieurs lignes" -#: pl_gram.y:2289 +#: pl_gram.y:2265 #, c-format msgid "cursor variable must be a simple variable" msgstr "la variable de curseur doit être une variable simple" -#: pl_gram.y:2295 +#: pl_gram.y:2271 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "la variable « %s » doit être de type cursor ou refcursor" -#: pl_gram.y:2626 pl_gram.y:2637 +#: pl_gram.y:2603 pl_gram.y:2614 #, c-format msgid "\"%s\" is not a known variable" msgstr "« %s » n'est pas une variable connue" -#: pl_gram.y:2743 pl_gram.y:2753 pl_gram.y:2909 +#: pl_gram.y:2719 pl_gram.y:2729 pl_gram.y:2911 msgid "mismatched parentheses" msgstr "parenthèses non correspondantes" -#: pl_gram.y:2757 +#: pl_gram.y:2733 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "« %s » manquant à la fin de l'expression SQL" -#: pl_gram.y:2763 +#: pl_gram.y:2739 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "« %s » manquant à la fin de l'instruction SQL" -#: pl_gram.y:2780 +#: pl_gram.y:2758 msgid "missing expression" msgstr "expression manquante" -#: pl_gram.y:2782 +#: pl_gram.y:2760 msgid "missing SQL statement" msgstr "instruction SQL manquante" -#: pl_gram.y:2911 +#: pl_gram.y:2889 +msgid "syntax error, expected \"]\"" +msgstr "erreur de syntaxe, « ] » attendu" + +#: pl_gram.y:2913 msgid "incomplete data type declaration" msgstr "déclaration incomplète d'un type de données" -#: pl_gram.y:2934 +#: pl_gram.y:2936 msgid "missing data type declaration" msgstr "déclaration manquante d'un type de données" -#: pl_gram.y:3014 +#: pl_gram.y:3071 msgid "INTO specified more than once" msgstr "INTO spécifié plus d'une fois" -#: pl_gram.y:3184 +#: pl_gram.y:3241 msgid "expected FROM or IN" msgstr "attendait FROM ou IN" -#: pl_gram.y:3245 +#: pl_gram.y:3302 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "RETURN ne peut pas avoir de paramètre dans une fonction renvoyant un ensemble" -#: pl_gram.y:3246 +#: pl_gram.y:3303 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Utilisez RETURN NEXT ou RETURN QUERY." -#: pl_gram.y:3256 +#: pl_gram.y:3313 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "RETURN ne peut pas avoir de paramètre dans une procédure" -#: pl_gram.y:3261 +#: pl_gram.y:3318 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURN ne peut pas avoir de paramètre dans une fonction renvoyant void" -#: pl_gram.y:3270 +#: pl_gram.y:3327 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN ne peut pas avoir de paramètre dans une fonction avec des paramètres OUT" -#: pl_gram.y:3333 +#: pl_gram.y:3390 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "RETURN NEXT ne peut pas avoir de paramètre dans une fonction avec des paramètres OUT" -#: pl_gram.y:3441 -#, c-format -msgid "variable \"%s\" is declared CONSTANT" -msgstr "la variable « %s » est déclarée CONSTANT" - -#: pl_gram.y:3499 +#: pl_gram.y:3556 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "la variable de type record ne peut pas faire partie d'une liste INTO à plusieurs éléments" -#: pl_gram.y:3545 +#: pl_gram.y:3602 #, c-format msgid "too many INTO variables specified" msgstr "trop de variables INTO indiquées" -#: pl_gram.y:3753 +#: pl_gram.y:3810 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "label de fin « %s » spécifié pour un bloc sans label" -#: pl_gram.y:3760 +#: pl_gram.y:3817 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "le label de fin « %s » est différent du label « %s » du bloc" -#: pl_gram.y:3794 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "le curseur « %s » n'a pas d'argument" -#: pl_gram.y:3808 +#: pl_gram.y:3865 #, c-format msgid "cursor \"%s\" has arguments" msgstr "le curseur « %s » a des arguments" -#: pl_gram.y:3850 +#: pl_gram.y:3907 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "le curseur « %s » n'a pas d'argument nommé « %s »" -#: pl_gram.y:3870 +#: pl_gram.y:3927 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "la valeur du paramètre « %s » pour le curseur « %s » est spécifiée plus d'une fois" -#: pl_gram.y:3895 +#: pl_gram.y:3948 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "pas assez d'arguments pour le curseur « %s »" -#: pl_gram.y:3902 +#: pl_gram.y:3955 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "trop d'arguments pour le curseur « %s »" -#: pl_gram.y:3988 +#: pl_gram.y:4041 msgid "unrecognized RAISE statement option" msgstr "option de l'instruction RAISE inconnue" -#: pl_gram.y:3992 +#: pl_gram.y:4045 msgid "syntax error, expected \"=\"" msgstr "erreur de syntaxe, « = » attendu" -#: pl_gram.y:4033 +#: pl_gram.y:4086 #, c-format msgid "too many parameters specified for RAISE" msgstr "trop de paramètres spécifiés pour RAISE" -#: pl_gram.y:4037 +#: pl_gram.y:4090 #, c-format msgid "too few parameters specified for RAISE" msgstr "trop peu de paramètres pour RAISE" @@ -847,158 +861,13 @@ msgid "List of programming constructs that should produce an error." msgstr "Liste des constructions de programmation qui devraient produire une erreur." #. translator: %s is typically the translation of "syntax error" -#: pl_scanner.c:508 +#: pl_scanner.c:525 #, c-format msgid "%s at end of input" msgstr "%s à la fin de l'entrée" #. translator: first %s is typically the translation of "syntax error" -#: pl_scanner.c:524 +#: pl_scanner.c:541 #, c-format msgid "%s at or near \"%s\"" msgstr "%s sur ou près de « %s »" - -#~ msgid "EXECUTE statement" -#~ msgstr "instruction EXECUTE" - -#~ msgid "Expected \"FOR\", to open a cursor for an unbound cursor variable." -#~ msgstr "Attendait « FOR » pour ouvrir un curseur pour une variable sans limite." - -#~ msgid "Expected record variable, row variable, or list of scalar variables following INTO." -#~ msgstr "" -#~ "Attendait une variable RECORD, ROW ou une liste de variables scalaires\n" -#~ "suivant INTO." - -#~ msgid "N/A (dropped column)" -#~ msgstr "N/A (colonne supprimée)" - -#~ msgid "Number of returned columns (%d) does not match expected column count (%d)." -#~ msgstr "" -#~ "Le nombre de colonnes renvoyées (%d) ne correspond pas au nombre de colonnes\n" -#~ "attendues (%d)." - -#~ msgid "RETURN NEXT must specify a record or row variable in function returning row" -#~ msgstr "" -#~ "RETURN NEXT doit indiquer une variable RECORD ou ROW dans une fonction\n" -#~ "renvoyant une ligne" - -#~ msgid "RETURN cannot have a parameter in function returning set; use RETURN NEXT or RETURN QUERY" -#~ msgstr "" -#~ "RETURN ne peut pas avoir un paramètre dans une fonction renvoyant des\n" -#~ "lignes ; utilisez RETURN NEXT ou RETURN QUERY" - -#~ msgid "RETURN must specify a record or row variable in function returning row" -#~ msgstr "" -#~ "RETURN ne peut pas indiquer une variable RECORD ou ROW dans une fonction\n" -#~ "renvoyant une ligne" - -#~ msgid "Returned type %s does not match expected type %s in column \"%s\"." -#~ msgstr "Le type %s renvoyé ne correspond pas au type %s attendu dans la colonne « %s »." - -#~ msgid "SQL statement in PL/PgSQL function \"%s\" near line %d" -#~ msgstr "instruction SQL dans la fonction PL/pgsql « %s » près de la ligne %d" - -#~ msgid "Use a BEGIN block with an EXCEPTION clause instead." -#~ msgstr "Utiliser un bloc BEGIN dans une clause EXCEPTION à la place." - -#~ msgid "array subscript in assignment must not be null" -#~ msgstr "un indice de tableau dans une affectation ne peut pas être NULL" - -#~ msgid "cannot assign to tg_argv" -#~ msgstr "ne peut pas affecter à tg_argv" - -#~ msgid "cursor \"%s\" closed unexpectedly" -#~ msgstr "le curseur « %s » a été fermé de façon inattendu" - -#~ msgid "default value for row or record variable is not supported" -#~ msgstr "la valeur par défaut de variable ROW ou RECORD n'est pas supportée" - -#~ msgid "expected \")\"" -#~ msgstr "« ) » attendu" - -#~ msgid "expected \"[\"" -#~ msgstr "« [ » attendu" - -#~ msgid "expected a cursor or refcursor variable" -#~ msgstr "attendait une variable de type cursor ou refcursor" - -#~ msgid "expected an integer variable" -#~ msgstr "attend une variable entière" - -#~ msgid "function has no parameter \"%s\"" -#~ msgstr "la fonction n'a pas de paramètre « %s »" - -#~ msgid "label does not exist" -#~ msgstr "le label n'existe pas" - -#~ msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -#~ msgstr "le nombre de dimensions du tableau (%d) dépasse la maximum autorisé (%d)" - -#~ msgid "only positional parameters can be aliased" -#~ msgstr "seuls les paramètres de position peuvent avoir un alias" - -#~ msgid "qualified identifier cannot be used here: %s" -#~ msgstr "l'identifiant qualifié ne peut pas être utilisé ici : %s" - -#~ msgid "query \"%s\" returned more than one row" -#~ msgstr "la requête « %s » a renvoyé plus d'une ligne" - -#~ msgid "relation \"%s\" is not a table" -#~ msgstr "la relation « %s » n'est pas une table" - -#~ msgid "relation \"%s.%s\" does not exist" -#~ msgstr "la relation « %s.%s » n'existe pas" - -#~ msgid "row \"%s\" has no field \"%s\"" -#~ msgstr "la ligne « %s » n'a aucun champ « %s »" - -#~ msgid "row \"%s.%s\" has no field \"%s\"" -#~ msgstr "la ligne « %s.%s » n'a aucun champ « %s »" - -#~ msgid "row or record variable cannot be CONSTANT" -#~ msgstr "la variable ROW ou RECORD ne peut pas être CONSTANT" - -#~ msgid "row or record variable cannot be NOT NULL" -#~ msgstr "la variable ROW ou RECORD ne peut pas être NOT NULL" - -#~ msgid "string literal in PL/PgSQL function \"%s\" near line %d" -#~ msgstr "chaîne littérale dans la fonction PL/pgsql « %s » près de la ligne %d" - -#~ msgid "subscripted object is not an array" -#~ msgstr "l'objet souscrit n'est pas un tableau" - -#~ msgid "syntax error at \"%s\"" -#~ msgstr "erreur de syntaxe à « %s »" - -#~ msgid "too many variables specified in SQL statement" -#~ msgstr "trop de variables spécifiées dans l'instruction SQL" - -#~ msgid "type of \"%s\" does not match that when preparing the plan" -#~ msgstr "le type de « %s » ne correspond pas à ce qui est préparé dans le plan" - -#~ msgid "type of \"%s.%s\" does not match that when preparing the plan" -#~ msgstr "le type de « %s.%s » ne correspond pas à ce qui est préparé dans le plan" - -#~ msgid "type of tg_argv[%d] does not match that when preparing the plan" -#~ msgstr "le type de tg_argv[%d] ne correspond pas à ce qui est préparé dans le plan" - -#~ msgid "unterminated \" in identifier: %s" -#~ msgstr "\" non terminé dans l'identifiant : %s" - -#~ msgid "unterminated /* comment" -#~ msgstr "commentaire /* non terminé" - -#~ msgid "unterminated dollar-quoted string" -#~ msgstr "chaîne entre dollars non terminée" - -#~ msgid "unterminated quoted identifier" -#~ msgstr "identifiant entre guillemets non terminé" - -#~ msgid "unterminated quoted string" -#~ msgstr "chaîne entre guillemets non terminée" - -#~ msgid "variable \"%s\" declared NOT NULL cannot default to NULL" -#~ msgstr "la variable « %s » déclarée NOT NULL ne peut pas valoir NULL par défaut" - -#~ msgid "variable \"%s\" does not exist in the current block" -#~ msgstr "la variable « %s » n'existe pas dans le bloc actuel" diff --git a/src/pl/plpgsql/src/po/ja.po b/src/pl/plpgsql/src/po/ja.po index f1f3b9b400a77..7d36ec1a17855 100644 --- a/src/pl/plpgsql/src/po/ja.po +++ b/src/pl/plpgsql/src/po/ja.po @@ -1,14 +1,14 @@ # Japanese message translation file for plpgsql -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # HOTTA Michihde , 2013 # msgid "" msgstr "" -"Project-Id-Version: plpgsql (PostgreSQL 16)\n" +"Project-Id-Version: plpgsql (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-14 10:48+0900\n" -"PO-Revision-Date: 2022-05-11 13:52+0900\n" +"POT-Creation-Date: 2024-01-09 10:23+0900\n" +"PO-Revision-Date: 2024-01-09 13:27+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" @@ -18,159 +18,164 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: pl_comp.c:438 pl_handler.c:496 +#: pl_comp.c:434 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "PL/pgSQL 関数ã§ã¯ %s åž‹ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: pl_comp.c:530 +#: pl_comp.c:526 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "多相関数\"%s\"ã®å®Ÿéš›ã®æˆ»ã‚Šå€¤ã®åž‹ã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pl_comp.c:560 +#: pl_comp.c:556 #, c-format msgid "trigger functions can only be called as triggers" msgstr "トリガー関数ã¯ãƒˆãƒªã‚¬ãƒ¼ã¨ã—ã¦ã®ã¿ã‚³ãƒ¼ãƒ«ã§ãã¾ã™" -#: pl_comp.c:564 pl_handler.c:480 +#: pl_comp.c:560 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "PL/pgSQL 関数㯠%s 型を返ã›ã¾ã›ã‚“" -#: pl_comp.c:604 +#: pl_comp.c:600 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "トリガー関数ã«ã¯å¼•数を宣言ã§ãã¾ã›ã‚“" -#: pl_comp.c:605 +#: pl_comp.c:601 #, c-format msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." msgstr "ãã®ä»£ã‚りã€ãƒˆãƒªã‚¬ãƒ¼ã®å¼•æ•°ã«ã¯ TG_NARGS 㨠TG_ARGV を通ã—ã¦ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™" -#: pl_comp.c:738 +#: pl_comp.c:734 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "イベントトリガー関数ã§ã¯å¼•数を宣言ã§ãã¾ã›ã‚“" -#: pl_comp.c:1002 +#: pl_comp.c:998 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "PL/pgSQL 関数 \"%s\" ã® %d 行目付近ã§ã®ã‚³ãƒ³ãƒ‘イル" -#: pl_comp.c:1025 +#: pl_comp.c:1021 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "パラメータ \"%s\" ãŒè¤‡æ•°æŒ‡å®šã•れã¾ã—ãŸ" -#: pl_comp.c:1139 +#: pl_comp.c:1135 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "列å‚ç…§ \"%s\" ãŒä¸€æ„ã«ç‰¹å®šã§ãã¾ã›ã‚“" -#: pl_comp.c:1141 +#: pl_comp.c:1137 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "PL/pgSQL 変数もã—ãã¯ãƒ†ãƒ¼ãƒ–ルã®ã‚«ãƒ©ãƒ åã®ã©ã¡ã‚‰ã‹ã‚’å‚ç…§ã—ã¦ã„ãŸå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" -#: pl_comp.c:1324 pl_exec.c:5234 pl_exec.c:5407 pl_exec.c:5494 pl_exec.c:5585 -#: pl_exec.c:6606 +#: pl_comp.c:1314 pl_exec.c:5255 pl_exec.c:5428 pl_exec.c:5515 pl_exec.c:5606 +#: pl_exec.c:6624 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "レコード \"%s\" ã«ã¯é …ç›® \"%s\" ã¯ã‚りã¾ã›ã‚“" -#: pl_comp.c:1818 +#: pl_comp.c:1795 #, c-format msgid "relation \"%s\" does not exist" msgstr "リレーション \"%s\" ãŒã‚りã¾ã›ã‚“" -#: pl_comp.c:1825 pl_comp.c:1867 +#: pl_comp.c:1802 pl_comp.c:1844 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "リレーション\"%s\"ã¯è¤‡åˆåž‹ã‚’æŒã£ã¦ã„ã¾ã›ã‚“" -#: pl_comp.c:1933 +#: pl_comp.c:1910 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "変数 \"%s\" ã®åž‹ã¯æ“¬ä¼¼ã‚¿ã‚¤ãƒ— %s ã§ã™" -#: pl_comp.c:2122 +#: pl_comp.c:2099 #, c-format msgid "type \"%s\" is only a shell" msgstr "åž‹ \"%s\" ã¯ã‚·ã‚§ãƒ«ã§ã®ã¿ä½¿ãˆã¾ã™" -#: pl_comp.c:2204 pl_exec.c:6907 +#: pl_comp.c:2181 pl_exec.c:6925 #, c-format msgid "type %s is not composite" msgstr "åž‹%sã¯è¤‡åˆåž‹ã§ã¯ã‚りã¾ã›ã‚“" -#: pl_comp.c:2252 pl_comp.c:2305 +#: pl_comp.c:2217 +#, c-format +msgid "could not find array type for data type %s" +msgstr "データ型%sã®é…列型ãŒã‚りã¾ã›ã‚“ã§ã—ãŸ" + +#: pl_comp.c:2256 pl_comp.c:2309 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "例外æ¡ä»¶ \"%s\" ãŒèªè­˜ã§ãã¾ã›ã‚“" -#: pl_comp.c:2526 +#: pl_comp.c:2538 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "多相関数\"%s\"ã®å®Ÿéš›ã®å¼•æ•°ã®åž‹ã‚’特定ã§ãã¾ã›ã‚“ã§ã—ãŸ" -#: pl_exec.c:501 pl_exec.c:940 pl_exec.c:1175 +#: pl_exec.c:511 pl_exec.c:950 pl_exec.c:1185 msgid "during initialization of execution state" msgstr "実行状態ã®åˆæœŸåŒ–ã®éš›" -#: pl_exec.c:507 +#: pl_exec.c:517 msgid "while storing call arguments into local variables" msgstr "å¼•æ•°ã‚’ãƒ­ãƒ¼ã‚«ãƒ«å¤‰æ•°ã«æ ¼ç´ã™ã‚‹éš›" -#: pl_exec.c:595 pl_exec.c:1013 +#: pl_exec.c:605 pl_exec.c:1023 msgid "during function entry" msgstr "関数ã«å…¥ã‚‹éš›" -#: pl_exec.c:618 +#: pl_exec.c:628 #, c-format msgid "control reached end of function without RETURN" msgstr "RETURN ãŒç¾ã‚Œã‚‹å‰ã«ã€åˆ¶å¾¡ãŒé–¢æ•°ã®çµ‚ã‚りã«é”ã—ã¾ã—ãŸ" -#: pl_exec.c:624 +#: pl_exec.c:634 msgid "while casting return value to function's return type" msgstr "æˆ»ã‚Šå€¤ã‚’é–¢æ•°ã®æˆ»ã‚Šå€¤ã®åž‹ã¸ã‚­ãƒ£ã‚¹ãƒˆã™ã‚‹éš›ã«" -#: pl_exec.c:636 pl_exec.c:3665 +#: pl_exec.c:646 pl_exec.c:3681 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "値ã®é›†åˆã‚’å—ã‘付ã‘ãªã„よã†ãªã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã€é›†åˆå€¤ã‚’è¿”ã™é–¢æ•°ãŒå‘¼ã°ã‚Œã¾ã—ãŸ" -#: pl_exec.c:641 pl_exec.c:3671 +#: pl_exec.c:651 pl_exec.c:3687 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "マテリアライズモードãŒå¿…è¦ã§ã™ãŒã€ç¾åœ¨ã®ã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆã§ç¦æ­¢ã•れã¦ã„ã¾ã™" -#: pl_exec.c:768 pl_exec.c:1039 pl_exec.c:1197 +#: pl_exec.c:778 pl_exec.c:1049 pl_exec.c:1207 msgid "during function exit" msgstr "関数を抜ã‘ã‚‹éš›" -#: pl_exec.c:823 pl_exec.c:887 pl_exec.c:3464 +#: pl_exec.c:833 pl_exec.c:897 pl_exec.c:3480 msgid "returned record type does not match expected record type" msgstr "è¿”ã•れãŸãƒ¬ã‚³ãƒ¼ãƒ‰ã®åž‹ãŒæœŸå¾…ã™ã‚‹ãƒ¬ã‚³ãƒ¼ãƒ‰ã®åž‹ã¨ä¸€è‡´ã—ã¾ã›ã‚“" -#: pl_exec.c:1036 pl_exec.c:1194 +#: pl_exec.c:1046 pl_exec.c:1204 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "RETURN ãŒç¾ã‚Œã‚‹å‰ã«ã€åˆ¶å¾¡ãŒãƒˆãƒªã‚¬ãƒ¼ãƒ—ロシージャã®çµ‚ã‚りã«é”ã—ã¾ã—ãŸ" -#: pl_exec.c:1044 +#: pl_exec.c:1054 #, c-format msgid "trigger procedure cannot return a set" msgstr "トリガー手続ãã¯é›†åˆå€¤ã‚’è¿”ã™ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: pl_exec.c:1083 pl_exec.c:1111 +#: pl_exec.c:1093 pl_exec.c:1121 msgid "returned row structure does not match the structure of the triggering table" msgstr "è¿”ã•れãŸè¡Œã®æ§‹é€ ãŒã€ãƒˆãƒªã‚¬ãƒ¼ã—ã¦ã„ã‚‹ãƒ†ãƒ¼ãƒ–ãƒ«ã®æ§‹é€ ã¨ãƒžãƒƒãƒã—ã¾ã›ã‚“" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1252 +#: pl_exec.c:1262 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "PL/pgSQL関数%sã®%d行目 %s" @@ -178,335 +183,335 @@ msgstr "PL/pgSQL関数%sã®%d行目 %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1263 +#: pl_exec.c:1273 #, c-format msgid "PL/pgSQL function %s %s" msgstr "PL/pgSQL関数%s - %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1271 +#: pl_exec.c:1281 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "PL/pgSQL関数%sã®%d行目 - %s" -#: pl_exec.c:1277 +#: pl_exec.c:1287 #, c-format msgid "PL/pgSQL function %s" msgstr "PL/pgSQL関数 %s" -#: pl_exec.c:1648 +#: pl_exec.c:1658 msgid "during statement block local variable initialization" msgstr "ステートメントブロックã§ãƒ­ãƒ¼ã‚«ãƒ«å¤‰æ•°ã‚’åˆæœŸåŒ–中" -#: pl_exec.c:1753 +#: pl_exec.c:1763 msgid "during statement block entry" msgstr "ステートメントブロックã«å…¥ã‚‹éš›ã«" -#: pl_exec.c:1785 +#: pl_exec.c:1795 msgid "during statement block exit" msgstr "ステートメントブロックを抜ã‘ã‚‹éš›ã«" -#: pl_exec.c:1823 +#: pl_exec.c:1833 msgid "during exception cleanup" msgstr "例外をクリーンアップã™ã‚‹éš›ã«" -#: pl_exec.c:2360 +#: pl_exec.c:2370 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" msgstr "プロシージャã®ãƒ‘ラメータ\"%s\"ã¯å‡ºåŠ›ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã§ã™ãŒå¯¾å¿œã™ã‚‹å¼•æ•°ãŒæ›¸ãè¾¼ã¿ä¸å¯ã§ã™" -#: pl_exec.c:2365 +#: pl_exec.c:2375 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "プロシージャã®ãƒ‘ラメータ%dã¯å‡ºåŠ›ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã§ã™ãŒå¯¾å¿œã™ã‚‹å¼•æ•°ãŒæ›¸ãè¾¼ã¿ä¸å¯ã§ã™" -#: pl_exec.c:2399 +#: pl_exec.c:2409 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS ã¯ä¾‹å¤–ãƒãƒ³ãƒ‰ãƒ©ã®å¤–ã§ã¯ä½¿ãˆã¾ã›ã‚“" -#: pl_exec.c:2599 +#: pl_exec.c:2615 #, c-format msgid "case not found" msgstr "case ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“" -#: pl_exec.c:2600 +#: pl_exec.c:2616 #, c-format msgid "CASE statement is missing ELSE part." msgstr "CASE ステートメント㫠ELSE 部分ãŒã‚りã¾ã›ã‚“" -#: pl_exec.c:2693 +#: pl_exec.c:2709 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "FOR ループã®ä¸‹é™ã‚’ NULL ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: pl_exec.c:2709 +#: pl_exec.c:2725 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "FOR ループã®ä¸Šé™ã‚’ NULL ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: pl_exec.c:2727 +#: pl_exec.c:2743 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "FOR ループã«ãŠã‘ã‚‹ BY ã®å€¤ã‚’ NULL ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: pl_exec.c:2733 +#: pl_exec.c:2749 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "FOR ループã«ãŠã‘ã‚‹ BY ã®å€¤ã¯ã‚¼ãƒ­ã‚ˆã‚Šå¤§ãããªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pl_exec.c:2867 pl_exec.c:4667 +#: pl_exec.c:2883 pl_exec.c:4688 #, c-format msgid "cursor \"%s\" already in use" msgstr "カーソル \"%s\" ã¯ã™ã§ã«ä½¿ã‚れã¦ã„ã¾ã™" -#: pl_exec.c:2890 pl_exec.c:4737 +#: pl_exec.c:2906 pl_exec.c:4758 #, c-format msgid "arguments given for cursor without arguments" msgstr "引数ãªã—ã®ã‚«ãƒ¼ã‚½ãƒ«ã«å¼•æ•°ãŒä¸Žãˆã‚‰ã‚Œã¾ã—ãŸ" -#: pl_exec.c:2909 pl_exec.c:4756 +#: pl_exec.c:2925 pl_exec.c:4777 #, c-format msgid "arguments required for cursor" msgstr "カーソルã«ã¯å¼•æ•°ãŒå¿…è¦ã§ã™" -#: pl_exec.c:3000 +#: pl_exec.c:3016 #, c-format msgid "FOREACH expression must not be null" msgstr "FOREACH å¼ã¯ NULL ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: pl_exec.c:3015 +#: pl_exec.c:3031 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "FOREACH å¼ã¯ %s åž‹ã§ã¯ãªãé…列を生æˆã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pl_exec.c:3032 +#: pl_exec.c:3048 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "é…列ã®è¦ç´ æ•° (%d) ãŒæœ‰åŠ¹ç¯„å›²0ã‹ã‚‰%dã¾ã§ã®é–“ã«ã‚りã¾ã›ã‚“" -#: pl_exec.c:3059 +#: pl_exec.c:3075 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "FOREACH ... SLICE ループ変数ã¯é…列型ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pl_exec.c:3063 +#: pl_exec.c:3079 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "FOREACH ループ変数ã¯é…列型ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" -#: pl_exec.c:3225 pl_exec.c:3282 pl_exec.c:3457 +#: pl_exec.c:3241 pl_exec.c:3298 pl_exec.c:3473 #, c-format msgid "cannot return non-composite value from function returning composite type" msgstr "複åˆåž‹ã‚’è¿”ã™é–¢æ•°ã‹ã‚‰è¤‡åˆåž‹ä»¥å¤–ã®å€¤ã‚’è¿”ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“" -#: pl_exec.c:3321 pl_gram.y:3319 +#: pl_exec.c:3337 pl_gram.y:3323 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "SETOF ã§ãªã„関数ã§ã¯ RETURN NEXT ã¯ä½¿ãˆã¾ã›ã‚“" -#: pl_exec.c:3362 pl_exec.c:3494 +#: pl_exec.c:3378 pl_exec.c:3510 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "RETURN NEXT ã§æŒ‡å®šã•れã¦ã„ã‚‹çµæžœã®åž‹ãŒèª¤ã£ã¦ã„ã¾ã™" -#: pl_exec.c:3400 pl_exec.c:3421 +#: pl_exec.c:3416 pl_exec.c:3437 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "RETURN NEXT ã§æŒ‡å®šã•れã¦ã„るレコードã®åž‹ãŒèª¤ã£ã¦ã„ã¾ã™" -#: pl_exec.c:3513 +#: pl_exec.c:3529 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT ã«ã¯ãƒ‘ラメーターãŒå¿…è¦ã§ã™" -#: pl_exec.c:3541 pl_gram.y:3383 +#: pl_exec.c:3557 pl_gram.y:3387 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "SETOF ã§ãªã„関数ã§ã¯ RETURN QUERY ã¯ä½¿ãˆã¾ã›ã‚“" -#: pl_exec.c:3559 +#: pl_exec.c:3575 msgid "structure of query does not match function result type" msgstr "å•ã„åˆã‚ã›ã®æ§‹é€ ãŒé–¢æ•°ã®çµæžœã®åž‹ã¨ä¸€è‡´ã—ã¾ã›ã‚“" -#: pl_exec.c:3614 pl_exec.c:4444 pl_exec.c:8685 +#: pl_exec.c:3630 pl_exec.c:4465 pl_exec.c:8724 #, c-format msgid "query string argument of EXECUTE is null" msgstr "EXECUTE ã®å•ã„åˆã‚ã›æ–‡å­—列ã®å¼•数㌠NULL ã§ã™" -#: pl_exec.c:3699 pl_exec.c:3837 +#: pl_exec.c:3715 pl_exec.c:3853 #, c-format msgid "RAISE option already specified: %s" msgstr "RAISE ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã¯æ—¢ã«æŒ‡å®šã•れã¦ã„ã¾ã™: %s" -#: pl_exec.c:3733 +#: pl_exec.c:3749 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "引数ã®ç„¡ã„ RAISE ã¯ã€ä¾‹å¤–ãƒãƒ³ãƒ‰ãƒ©ã®å¤–ã§ã¯ä½¿ãˆã¾ã›ã‚“" -#: pl_exec.c:3827 +#: pl_exec.c:3843 #, c-format msgid "RAISE statement option cannot be null" msgstr "RAISE ステートメントã®ã‚ªãƒ—ションã«ã¯ NULL ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: pl_exec.c:3897 +#: pl_exec.c:3913 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3952 +#: pl_exec.c:3968 #, c-format msgid "assertion failed" msgstr "アサーションã«å¤±æ•—" -#: pl_exec.c:4317 pl_exec.c:4506 +#: pl_exec.c:4338 pl_exec.c:4527 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "PL/pgSQL 内ã§ã¯ COPY to/from クライアントã¯ä½¿ãˆã¾ã›ã‚“" -#: pl_exec.c:4323 +#: pl_exec.c:4344 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "PL/pgSQL 内ã§ã¯ã‚µãƒãƒ¼ãƒˆã•れãªã„トランザクションコマンド" -#: pl_exec.c:4346 pl_exec.c:4535 +#: pl_exec.c:4367 pl_exec.c:4556 #, c-format msgid "INTO used with a command that cannot return data" msgstr "データを返ã›ãªã„コマンド㧠INTO ãŒä½¿ã‚れã¾ã—ãŸ" -#: pl_exec.c:4369 pl_exec.c:4558 +#: pl_exec.c:4390 pl_exec.c:4579 #, c-format msgid "query returned no rows" msgstr "å•ã„åˆã‚ã›ã¯è¡Œã‚’è¿”ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: pl_exec.c:4391 pl_exec.c:4577 pl_exec.c:5729 +#: pl_exec.c:4412 pl_exec.c:4598 pl_exec.c:5750 #, c-format msgid "query returned more than one row" msgstr "å•ã„åˆã‚ã›ãŒè¤‡æ•°ã®è¡Œã‚’è¿”ã—ã¾ã—ãŸ" -#: pl_exec.c:4393 +#: pl_exec.c:4414 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "å•ã„åˆã‚ã›ã‚’1行返å´ã™ã‚‹ã‚ˆã†ã«ã™ã‚‹ã‹ã€LIMIT 1 ã‚’ã¤ã‘ã¦ãã ã•ã„。" -#: pl_exec.c:4409 +#: pl_exec.c:4430 #, c-format msgid "query has no destination for result data" msgstr "å•ã„åˆã‚ã›ã«çµæžœãƒ‡ãƒ¼ã‚¿ã®è¿”å´å…ˆãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“" -#: pl_exec.c:4410 +#: pl_exec.c:4431 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "SELECT ã®çµæžœã‚’破棄ã—ãŸã„å ´åˆã€ä»£ã‚り㫠PERFORM を使ã£ã¦ãã ã•ã„" -#: pl_exec.c:4498 +#: pl_exec.c:4519 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "SELECT ... INTO ã® EXECUTE ã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: pl_exec.c:4499 +#: pl_exec.c:4520 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "代ã‚り㫠EXECUTE ... INTO ã¾ãŸã¯ EXECUTE CREATE TABLE ... AS ãŒä½¿ãˆã¾ã™ã€‚" -#: pl_exec.c:4512 +#: pl_exec.c:4533 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "トランザクションコマンドã®EXECUTEã¯å®Ÿè£…ã•れã¦ã„ã¾ã›ã‚“" -#: pl_exec.c:4822 pl_exec.c:4910 +#: pl_exec.c:4843 pl_exec.c:4931 #, c-format msgid "cursor variable \"%s\" is null" msgstr "カーソル変数 \"%s\" ㌠NULL ã§ã™" -#: pl_exec.c:4833 pl_exec.c:4921 +#: pl_exec.c:4854 pl_exec.c:4942 #, c-format msgid "cursor \"%s\" does not exist" msgstr "カーソル \"%s\" ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: pl_exec.c:4846 +#: pl_exec.c:4867 #, c-format msgid "relative or absolute cursor position is null" msgstr "相対もã—ãã¯çµ¶å¯¾ã‚«ãƒ¼ã‚½ãƒ«ä½ç½®ãŒ NULL ã§ã™" -#: pl_exec.c:5084 pl_exec.c:5179 +#: pl_exec.c:5105 pl_exec.c:5200 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "NOT NULL ã¨ã—ã¦å®£è¨€ã•れãŸå¤‰æ•° \"%s\" ã«ã¯ NULL を代入ã§ãã¾ã›ã‚“" -#: pl_exec.c:5160 +#: pl_exec.c:5181 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "複åˆåž‹ã§ãªã„値を行変数ã«ä»£å…¥ã§ãã¾ã›ã‚“" -#: pl_exec.c:5192 +#: pl_exec.c:5213 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "複åˆåž‹ã§ãªã„値をレコード変数ã«ä»£å…¥ã§ãã¾ã›ã‚“" -#: pl_exec.c:5243 +#: pl_exec.c:5264 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "システム列\"%s\"ã«ä»£å…¥ã§ãã¾ã›ã‚“" -#: pl_exec.c:5692 +#: pl_exec.c:5713 #, c-format msgid "query did not return data" msgstr "å•ã„åˆã‚ã›ãŒãƒ‡ãƒ¼ã‚¿ã‚’è¿”ã—ã¾ã›ã‚“ã§ã—ãŸ" -#: pl_exec.c:5693 pl_exec.c:5705 pl_exec.c:5730 pl_exec.c:5806 pl_exec.c:5811 +#: pl_exec.c:5714 pl_exec.c:5726 pl_exec.c:5751 pl_exec.c:5827 pl_exec.c:5832 #, c-format msgid "query: %s" msgstr "å•ã„åˆã‚ã›: %s" -#: pl_exec.c:5701 +#: pl_exec.c:5722 #, c-format msgid "query returned %d column" msgid_plural "query returned %d columns" msgstr[0] "å•ã„åˆã‚ã›ãŒ%d個ã®åˆ—ã‚’è¿”ã—ã¾ã—ãŸ" -#: pl_exec.c:5805 +#: pl_exec.c:5826 #, c-format msgid "query is SELECT INTO, but it should be plain SELECT" msgstr "å•ã„åˆã‚ã›ã¯SELECT INTOã§ã™ãŒã€å˜ç´”ãªSELECTã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pl_exec.c:5810 +#: pl_exec.c:5831 #, c-format msgid "query is not a SELECT" msgstr "å•ã„åˆã‚ã›ãŒSELECTã§ã¯ã‚りã¾ã›ã‚“" -#: pl_exec.c:6620 pl_exec.c:6660 pl_exec.c:6700 +#: pl_exec.c:6638 pl_exec.c:6678 pl_exec.c:6718 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "パラメータã®åž‹%d(%s)ãŒå®Ÿè¡Œè¨ˆç”»(%s)を準備ã™ã‚‹æ™‚点ã¨ä¸€è‡´ã—ã¾ã›ã‚“" -#: pl_exec.c:7111 pl_exec.c:7145 pl_exec.c:7219 pl_exec.c:7245 +#: pl_exec.c:7129 pl_exec.c:7163 pl_exec.c:7237 pl_exec.c:7263 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "代入ã®ã‚½ãƒ¼ã‚¹ã¨ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã®ãƒ•ィールド数ãŒä¸€è‡´ã—ã¦ã„ã¾ã›ã‚“" #. translator: %s represents a name of an extra check -#: pl_exec.c:7113 pl_exec.c:7147 pl_exec.c:7221 pl_exec.c:7247 +#: pl_exec.c:7131 pl_exec.c:7165 pl_exec.c:7239 pl_exec.c:7265 #, c-format msgid "%s check of %s is active." msgstr "%2$sã®%1$sãƒã‚§ãƒƒã‚¯ãŒæœ‰åйã§ã™ã€‚" -#: pl_exec.c:7117 pl_exec.c:7151 pl_exec.c:7225 pl_exec.c:7251 +#: pl_exec.c:7135 pl_exec.c:7169 pl_exec.c:7243 pl_exec.c:7269 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "å•ã„åˆã‚ã›ã¯ã‚«ãƒ©ãƒ ã®æ­£ç¢ºãªãƒªã‚¹ãƒˆã‚’è¿”å´ã™ã‚‹ã‚ˆã†ã«ã—ã¦ãã ã•ã„。" -#: pl_exec.c:7638 +#: pl_exec.c:7656 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "レコード \"%s\" ã«ã¯ã¾ã å€¤ãŒä»£å…¥ã•れã¦ã„ã¾ã›ã‚“" -#: pl_exec.c:7639 +#: pl_exec.c:7657 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "ã¾ã ä»£å…¥ã•れã¦ã„ãªã„レコードã®ã‚¿ãƒ—ル構造ã¯ä¸å®šã§ã™" -#: pl_exec.c:8283 pl_gram.y:3442 +#: pl_exec.c:8322 pl_gram.y:3446 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "変数\"%s\" ã¯CONSTANTã¨ã—ã¦å®šç¾©ã•れã¦ã„ã¾ã™" @@ -543,275 +548,279 @@ msgstr "SQL ステートメント" msgid "FOR over EXECUTE statement" msgstr "EXECUTE ステートメントを使ã£ãŸ FOR" -#: pl_gram.y:487 +#: pl_gram.y:485 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "ブロックラベル㯠DECLARE ã®å¾Œã§ã¯ãªãå‰ã«ç½®ã‹ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pl_gram.y:507 +#: pl_gram.y:505 #, c-format msgid "collations are not supported by type %s" msgstr "%s åž‹ã§ã¯ç…§åˆé †åºã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" -#: pl_gram.y:526 +#: pl_gram.y:524 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "NOT NULL宣言ã•れã¦ã„ã‚‹ãŸã‚ã€å¤‰æ•°\"%s\"ã¯ãƒ‡ãƒ•ォルト値をæŒã¤å¿…è¦ãŒã‚りã¾ã™" -#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 +#: pl_gram.y:645 pl_gram.y:660 pl_gram.y:686 #, c-format msgid "variable \"%s\" does not exist" msgstr "変数 \"%s\" ã¯å­˜åœ¨ã—ã¾ã›ã‚“" -#: pl_gram.y:733 pl_gram.y:761 +#: pl_gram.y:704 pl_gram.y:732 msgid "duplicate declaration" msgstr "é‡è¤‡ã—ãŸå®£è¨€ã§ã™ã€‚" -#: pl_gram.y:744 pl_gram.y:772 +#: pl_gram.y:715 pl_gram.y:743 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "変数 \"%s\" ãŒäº‹å‰ã«å®šç¾©ã•れãŸå¤‰æ•°ã‚’ä¸å¯è¦–ã«ã—ã¦ã„ã¾ã™" -#: pl_gram.y:1044 +#: pl_gram.y:1017 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "GET STACKED DIAGNOSTICS ã§ã¯è¨ºæ–­é …ç›® %s ã¯è¨±å¯ã•れã¦ã„ã¾ã›ã‚“" -#: pl_gram.y:1062 +#: pl_gram.y:1035 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "GET CURRENT DIAGNOSTICS ã§ã¯è¨ºæ–­é …ç›® %s ã¯è¨±å¯ã•れã¦ã„ã¾ã›ã‚“" -#: pl_gram.y:1157 +#: pl_gram.y:1133 msgid "unrecognized GET DIAGNOSTICS item" msgstr "GET DIAGNOSTICS é …ç›®ãŒèªè­˜ã§ãã¾ã›ã‚“" -#: pl_gram.y:1173 pl_gram.y:3558 +#: pl_gram.y:1149 pl_gram.y:3562 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" ã¯ã‚¹ã‚«ãƒ©ãƒ¼å¤‰æ•°ã§ã¯ã‚りã¾ã›ã‚“" -#: pl_gram.y:1403 pl_gram.y:1597 +#: pl_gram.y:1379 pl_gram.y:1573 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "行ã«å¯¾ã™ã‚‹ãƒ«ãƒ¼ãƒ—ã§ã®ãƒ«ãƒ¼ãƒ—変数ã¯ã€ãƒ¬ã‚³ãƒ¼ãƒ‰å¤‰æ•°ã¾ãŸã¯ã‚¹ã‚«ãƒ©ãƒ¼å¤‰æ•°ã®ãƒªã‚¹ãƒˆã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pl_gram.y:1438 +#: pl_gram.y:1414 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "カーソルを使ã£ãŸ FOR ループã«ã¯ã€ã‚¿ãƒ¼ã‚²ãƒƒãƒˆå¤‰æ•°ãŒï¼‘個ã ã‘å¿…è¦ã§ã™" -#: pl_gram.y:1445 +#: pl_gram.y:1421 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "カーソルを使ã£ãŸ FOR ループã§ã¯ã€ãれã«é–¢é€£ä»˜ã‘られãŸã‚«ãƒ¼ã‚½ãƒ«å¤‰æ•°ã‚’使用ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pl_gram.y:1536 +#: pl_gram.y:1512 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "整数を使ã£ãŸ FOR ループã«ã¯ã€ã‚¿ãƒ¼ã‚²ãƒƒãƒˆå¤‰æ•°ãŒï¼‘個ã ã‘å¿…è¦ã§ã™" -#: pl_gram.y:1570 +#: pl_gram.y:1546 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "å•ã„åˆã‚ã›ã‚’使ã£ãŸ FOR ループã®ä¸­ã§ã¯ REVERSE ã¯æŒ‡å®šã§ãã¾ã›ã‚“" -#: pl_gram.y:1700 +#: pl_gram.y:1676 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "FOREACH ã®ãƒ«ãƒ¼ãƒ—変数ã¯ã€æ—¢çŸ¥ã®å¤‰æ•°ã¾ãŸã¯å¤‰æ•°ã®ãƒªã‚¹ãƒˆã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pl_gram.y:1742 +#: pl_gram.y:1718 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "ã“ã®ã‚¹ãƒ†ãƒ¼ãƒˆãƒ¡ãƒ³ãƒˆã‚’囲むブロックやループã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸ \"%s\" ã¨ã„ã†ãƒ©ãƒ™ãƒ«ã¯ã‚りã¾ã›ã‚“。" -#: pl_gram.y:1750 +#: pl_gram.y:1726 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "ブロックラベル \"%s\" 㯠CONTINUE ã®ä¸­ã§ã¯ä½¿ãˆã¾ã›ã‚“。" -#: pl_gram.y:1765 +#: pl_gram.y:1741 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "ラベルã®ãªã„ EXIT ã¯ã€ãƒ«ãƒ¼ãƒ—ã®å¤–ã§ã¯ä½¿ãˆã¾ã›ã‚“" -#: pl_gram.y:1766 +#: pl_gram.y:1742 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE ã¯ãƒ«ãƒ¼ãƒ—ã®å¤–ã§ã¯ä½¿ãˆã¾ã›ã‚“" -#: pl_gram.y:1790 pl_gram.y:1828 pl_gram.y:1876 pl_gram.y:3005 pl_gram.y:3093 -#: pl_gram.y:3204 pl_gram.y:3957 +#: pl_gram.y:1766 pl_gram.y:1804 pl_gram.y:1852 pl_gram.y:3009 pl_gram.y:3097 +#: pl_gram.y:3208 pl_gram.y:3961 msgid "unexpected end of function definition" msgstr "予期ã—ãªã„関数定義ã®çµ‚端ã«é”ã—ã¾ã—ãŸ" -#: pl_gram.y:1896 pl_gram.y:1920 pl_gram.y:1936 pl_gram.y:1942 pl_gram.y:2067 -#: pl_gram.y:2075 pl_gram.y:2089 pl_gram.y:2184 pl_gram.y:2408 pl_gram.y:2498 -#: pl_gram.y:2656 pl_gram.y:3800 pl_gram.y:3861 pl_gram.y:3938 +#: pl_gram.y:1872 pl_gram.y:1896 pl_gram.y:1912 pl_gram.y:1918 pl_gram.y:2043 +#: pl_gram.y:2051 pl_gram.y:2065 pl_gram.y:2160 pl_gram.y:2384 pl_gram.y:2474 +#: pl_gram.y:2633 pl_gram.y:3804 pl_gram.y:3865 pl_gram.y:3942 msgid "syntax error" msgstr "構文エラー" -#: pl_gram.y:1924 pl_gram.y:1926 pl_gram.y:2412 pl_gram.y:2414 +#: pl_gram.y:1900 pl_gram.y:1902 pl_gram.y:2388 pl_gram.y:2390 msgid "invalid SQLSTATE code" msgstr "無効㪠SQLSTATE コードã§ã™" -#: pl_gram.y:2132 +#: pl_gram.y:2108 msgid "syntax error, expected \"FOR\"" msgstr "構文エラー。\"FOR\" ãŒç¾ã‚Œã‚‹ã¹ãã§ã—ãŸã€‚" -#: pl_gram.y:2193 +#: pl_gram.y:2169 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "FETCH ステートメントã¯è¤‡æ•°è¡Œã‚’è¿”ã›ã¾ã›ã‚“" -#: pl_gram.y:2290 +#: pl_gram.y:2266 #, c-format msgid "cursor variable must be a simple variable" msgstr "カーソル変数ã¯å˜ç´”変数ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pl_gram.y:2296 +#: pl_gram.y:2272 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "変数 \"%s\" 㯠cursor åž‹ã¾ãŸã¯ refcursor åž‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pl_gram.y:2627 pl_gram.y:2638 +#: pl_gram.y:2604 pl_gram.y:2615 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" ã¯æ—¢çŸ¥ã®å¤‰æ•°ã§ã¯ã‚りã¾ã›ã‚“" -#: pl_gram.y:2744 pl_gram.y:2754 pl_gram.y:2910 +#: pl_gram.y:2721 pl_gram.y:2731 pl_gram.y:2914 msgid "mismatched parentheses" msgstr "括弧ãŒå¯¾å¿œã—ã¦ã„ã¾ã›ã‚“" -#: pl_gram.y:2758 +#: pl_gram.y:2735 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "SQL 表ç¾å¼ã®çµ‚ã‚り㫠\"%s\" ãŒã‚りã¾ã›ã‚“" -#: pl_gram.y:2764 +#: pl_gram.y:2741 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "SQL ステートメントã®çµ‚ã‚り㫠\"%s\" ãŒã‚りã¾ã›ã‚“" -#: pl_gram.y:2781 +#: pl_gram.y:2758 msgid "missing expression" msgstr "表ç¾å¼ãŒã‚りã¾ã›ã‚“" -#: pl_gram.y:2783 +#: pl_gram.y:2760 msgid "missing SQL statement" msgstr "SQL ステートメントãŒã‚りã¾ã›ã‚“" -#: pl_gram.y:2912 +#: pl_gram.y:2892 +msgid "syntax error, expected \"]\"" +msgstr "構文エラー。\"]\" を期待ã—ã¦ã„ã¾ã—ãŸ" + +#: pl_gram.y:2916 msgid "incomplete data type declaration" msgstr "データ型ã®å®šç¾©ãŒä¸å®Œå…¨ã§ã™" -#: pl_gram.y:2935 +#: pl_gram.y:2939 msgid "missing data type declaration" msgstr "データ型ã®å®šç¾©ãŒã‚りã¾ã›ã‚“" -#: pl_gram.y:3015 +#: pl_gram.y:3019 msgid "INTO specified more than once" msgstr "INTO ãŒè¤‡æ•°å›žæŒ‡å®šã•れã¦ã„ã¾ã™" -#: pl_gram.y:3185 +#: pl_gram.y:3189 msgid "expected FROM or IN" msgstr "FROM ã‚‚ã—ã㯠IN ãŒæ¥ã‚‹ã¹ãã§ã—ãŸ" -#: pl_gram.y:3246 +#: pl_gram.y:3250 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "集åˆã‚’è¿”ã™é–¢æ•°ã§ã¯ã€RETURN ã«ãƒ‘ラメータを指定ã§ãã¾ã›ã‚“" -#: pl_gram.y:3247 +#: pl_gram.y:3251 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "RETURN NEXT ã‚‚ã—ã㯠RETURN QUERY を使用ã—ã¦ãã ã•ã„" -#: pl_gram.y:3257 +#: pl_gram.y:3261 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "プロシージャãªã„ã®RETURNã¯ãƒ‘ラメータをå–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" -#: pl_gram.y:3262 +#: pl_gram.y:3266 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "void ã‚’è¿”ã™é–¢æ•°ã§ã¯ã€RETURN ã«ãƒ‘ラメータを指定ã§ãã¾ã›ã‚“" -#: pl_gram.y:3271 +#: pl_gram.y:3275 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "OUT パラメータã®ãªã„関数ã§ã¯ã€RETURN ã«ãƒ‘ラメータを指定ã§ãã¾ã›ã‚“" -#: pl_gram.y:3334 +#: pl_gram.y:3338 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "OUT パラメータ付ãã®é–¢æ•°ã§ã¯ã€RETURN NEXT ã«ãƒ‘ラメータを指定ã§ãã¾ã›ã‚“" -#: pl_gram.y:3500 +#: pl_gram.y:3504 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "レコード変数ã¯ã€è¤‡æ•°é …目をæŒã¤ INTO リストã§ã¯ä½¿ãˆã¾ã›ã‚“" -#: pl_gram.y:3546 +#: pl_gram.y:3550 #, c-format msgid "too many INTO variables specified" msgstr "INTO å¤‰æ•°ã®æŒ‡å®šãŒå¤šã™ãŽã¾ã™" -#: pl_gram.y:3754 +#: pl_gram.y:3758 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "終端ラベル\"%s\"ãŒãƒ©ãƒ™ãƒ«ãªã—ã®ãƒ–ロックã«å¯¾ã—ã¦æŒ‡å®šã•れã¾ã—ãŸ" -#: pl_gram.y:3761 +#: pl_gram.y:3765 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "終端ラベル \"%s\" ãŒãƒ–ロックã®ãƒ©ãƒ™ãƒ« \"%s\" ã¨ç•°ãªã‚Šã¾ã™" -#: pl_gram.y:3795 +#: pl_gram.y:3799 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "カーソル \"%s\" ã«å¼•æ•°ãŒã‚りã¾ã›ã‚“" -#: pl_gram.y:3809 +#: pl_gram.y:3813 #, c-format msgid "cursor \"%s\" has arguments" msgstr "カーソル \"%s\" ã«å¼•æ•°ãŒã¤ã„ã¦ã„ã¾ã™" -#: pl_gram.y:3851 +#: pl_gram.y:3855 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "カーソル \"%s\" ã« \"%s\" ã¨ã„ã†åå‰ã®å¼•æ•°ãŒã‚りã¾ã›ã‚“" -#: pl_gram.y:3871 +#: pl_gram.y:3875 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "カーソル \"%2$s\" ã®ãƒ‘ラメータ \"%1$s\" ã®å€¤ãŒè¤‡æ•°å€‹æŒ‡å®šã•れã¾ã—ãŸ" -#: pl_gram.y:3896 +#: pl_gram.y:3900 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "カーソル \"%s\" ã®å¼•æ•°ãŒä¸è¶³ã—ã¦ã„ã¾ã™" -#: pl_gram.y:3903 +#: pl_gram.y:3907 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "カーソル \"%s\" ã«å¯¾ã™ã‚‹å¼•æ•°ãŒå¤šã™ãŽã¾ã™" -#: pl_gram.y:3989 +#: pl_gram.y:3993 msgid "unrecognized RAISE statement option" msgstr "RAISE ステートメントã®ã‚ªãƒ—ションをèªè­˜ã§ãã¾ã›ã‚“" -#: pl_gram.y:3993 +#: pl_gram.y:3997 msgid "syntax error, expected \"=\"" msgstr "構文エラー。\"=\" を期待ã—ã¦ã„ã¾ã—ãŸ" -#: pl_gram.y:4034 +#: pl_gram.y:4038 #, c-format msgid "too many parameters specified for RAISE" msgstr "RAISE ã«æŒ‡å®šã•れãŸãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ãƒ¼ã®æ•°ãŒå¤šã™ãŽã¾ã™" -#: pl_gram.y:4038 +#: pl_gram.y:4042 #, c-format msgid "too few parameters specified for RAISE" msgstr "RAISE ã«æŒ‡å®šã•れãŸãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ãƒ¼ã®æ•°ãŒè¶³ã‚Šã¾ã›ã‚“" @@ -848,32 +857,32 @@ msgstr "å…¥åŠ›ã®æœ€å¾Œã§ %s" msgid "%s at or near \"%s\"" msgstr "\"%2$s\" ã‚‚ã—ãã¯ãã®è¿‘辺㧠%1$s" -#~ msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -#~ msgstr "é…åˆ—ã®æ¬¡å…ƒæ•°(%d)ãŒåˆ¶é™å€¤(%d)ã‚’è¶…ãˆã¦ã„ã¾ã™" - -#~ msgid "subscripted object is not an array" -#~ msgstr "添字ã¤ãオブジェクトã¯é…列ã§ã¯ã‚りã¾ã›ã‚“" +#~ msgid "Use a BEGIN block with an EXCEPTION clause instead." +#~ msgstr "代ã‚り㫠EXCEPTION å¥ã‚’伴ㆠBEGIN ブロックを使用ã—ã¦ãã ã•ã„" #~ msgid "array subscript in assignment must not be null" #~ msgstr "代入ã«ãŠã‘ã‚‹é…åˆ—ã®æ·»å­—㌠NULL ã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" +#~ msgid "default value for row or record variable is not supported" +#~ msgstr "行ã¾ãŸã¯ãƒ¬ã‚³ãƒ¼ãƒ‰å¤‰æ•°ã®ãƒ‡ãƒ•ォルト値指定ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" + +#~ msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" +#~ msgstr "é…åˆ—ã®æ¬¡å…ƒæ•°(%d)ãŒåˆ¶é™å€¤(%d)ã‚’è¶…ãˆã¦ã„ã¾ã™" + #~ msgid "query \"%s\" returned more than one row" #~ msgstr "å•ã„åˆã‚ã› \"%s\" ãŒè¤‡æ•°ã®è¡Œã‚’è¿”ã—ã¾ã—ãŸ" #~ msgid "relation \"%s\" is not a table" #~ msgstr "リレーション \"%s\" ã¯ãƒ†ãƒ¼ãƒ–ルã§ã¯ã‚りã¾ã›ã‚“" -#~ msgid "variable \"%s\" declared NOT NULL cannot default to NULL" -#~ msgstr "変数 \"%s\" 㯠NOT NULL ã¨ã—ã¦å®£è¨€ã•れã¦ã„ã‚‹ãŸã‚ã€ãƒ‡ãƒ•ォルト値を NULL ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" - -#~ msgid "Use a BEGIN block with an EXCEPTION clause instead." -#~ msgstr "代ã‚り㫠EXCEPTION å¥ã‚’伴ㆠBEGIN ブロックを使用ã—ã¦ãã ã•ã„" - #~ msgid "row or record variable cannot be CONSTANT" #~ msgstr "行ã¾ãŸã¯ãƒ¬ã‚³ãƒ¼ãƒ‰å¤‰æ•°ã¯ CONSTANT ã«ã¯ã§ãã¾ã›ã‚“" #~ msgid "row or record variable cannot be NOT NULL" #~ msgstr "行ã¾ãŸã¯ãƒ¬ã‚³ãƒ¼ãƒ‰å¤‰æ•°ã‚’ NOT NULL ã«ã¯ã§ãã¾ã›ã‚“" -#~ msgid "default value for row or record variable is not supported" -#~ msgstr "行ã¾ãŸã¯ãƒ¬ã‚³ãƒ¼ãƒ‰å¤‰æ•°ã®ãƒ‡ãƒ•ォルト値指定ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" +#~ msgid "subscripted object is not an array" +#~ msgstr "添字ã¤ãオブジェクトã¯é…列ã§ã¯ã‚りã¾ã›ã‚“" + +#~ msgid "variable \"%s\" declared NOT NULL cannot default to NULL" +#~ msgstr "変数 \"%s\" 㯠NOT NULL ã¨ã—ã¦å®£è¨€ã•れã¦ã„ã‚‹ãŸã‚ã€ãƒ‡ãƒ•ォルト値を NULL ã«ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" diff --git a/src/pl/plpgsql/src/po/ka.po b/src/pl/plpgsql/src/po/ka.po index be83a3e01d419..f8f171520c136 100644 --- a/src/pl/plpgsql/src/po/ka.po +++ b/src/pl/plpgsql/src/po/ka.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plpgsql (PostgreSQL) 15\n" +"Project-Id-Version: plpgsql (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-02 04:39+0000\n" -"PO-Revision-Date: 2022-10-15 20:11+0200\n" +"POT-Creation-Date: 2024-03-26 10:39+0000\n" +"PO-Revision-Date: 2024-02-11 16:28+0100\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,170 +16,176 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.1.1\n" +"X-Generator: Poedit 3.3.2\n" -#: pl_comp.c:438 pl_handler.c:496 +#: pl_comp.c:434 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "PL/pgSQL ფუნქციებს áƒáƒ  შეუძლიáƒáƒ— მიიღáƒáƒœ ტიპი %s" -#: pl_comp.c:530 +#: pl_comp.c:526 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "პáƒáƒšáƒ˜áƒ›áƒáƒ áƒ¤áƒ£áƒšáƒ˜ ფუნქციის დáƒáƒ‘რუნების ტიპის გáƒáƒ›áƒáƒªáƒœáƒáƒ‘რშეუძლებელიáƒ: %s" -#: pl_comp.c:560 +#: pl_comp.c:556 #, c-format msgid "trigger functions can only be called as triggers" msgstr "ტრიგერის ფუნქციების გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბრმხáƒáƒšáƒáƒ“ ტრიგერებáƒáƒ“ შეიძლებáƒ" -#: pl_comp.c:564 pl_handler.c:480 +#: pl_comp.c:560 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "PL/pgSQL ფუნქციებს áƒáƒ  შეუძლიáƒáƒ— დáƒáƒáƒ‘რუნáƒáƒœ ტიპი %s" -#: pl_comp.c:604 +#: pl_comp.c:600 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "ტრიგერის ფუნქციებს გáƒáƒ›áƒáƒªáƒ®áƒáƒ“ებულ áƒáƒ áƒ’უმენტები ვერ ექნებáƒ" -#: pl_comp.c:605 +#: pl_comp.c:601 #, c-format -msgid "" -"The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV " -"instead." -msgstr "" -"ტრიგერს áƒáƒ áƒ’უმენტებთáƒáƒœ წვდáƒáƒ›áƒ TG_NARGS დრTG_ARGV instead გáƒáƒ•ლით შეგიძლიáƒáƒ— " -"გქáƒáƒœáƒ“ეთ.." +msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." +msgstr "ტრიგერს áƒáƒ áƒ’უმენტებთáƒáƒœ წვდáƒáƒ›áƒ TG_NARGS დრTG_ARGV instead გáƒáƒ•ლით შეგიძლიáƒáƒ— გქáƒáƒœáƒ“ეთ.." -#: pl_comp.c:738 +#: pl_comp.c:734 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "მáƒáƒ•ლენის ტრიგერის ფუნქციებს გáƒáƒ›áƒáƒªáƒ®áƒáƒ“ებული áƒáƒ áƒ’უმენტები ვერ ექნებáƒ" -#: pl_comp.c:1002 +#: pl_comp.c:998 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "\"PL/pgSQL\" ფუნქციის \"%s\" შედგენრხáƒáƒ–ზე %d" -#: pl_comp.c:1025 +#: pl_comp.c:1021 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის სáƒáƒ®áƒ”ლი \"%s\" ერთზე მეტჯერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" -#: pl_comp.c:1139 +#: pl_comp.c:1135 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "სვეტის მითითებრ\"%s\" áƒáƒ áƒáƒ–რáƒáƒ•áƒáƒœáƒ˜áƒ" -#: pl_comp.c:1141 +#: pl_comp.c:1137 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "შეიძლებრმიბმული იყáƒáƒ¡ PL/pgSQL ცვლáƒáƒ“ზე áƒáƒœ ცხრილის სვეტზე." -#: pl_comp.c:1324 pl_exec.c:5234 pl_exec.c:5407 pl_exec.c:5494 pl_exec.c:5585 -#: pl_exec.c:6606 +#: pl_comp.c:1314 pl_exec.c:5257 pl_exec.c:5430 pl_exec.c:5517 pl_exec.c:5608 +#: pl_exec.c:6626 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რს \"%s\" ველი \"%s\" áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" -#: pl_comp.c:1818 +#: pl_comp.c:1633 pl_gram.y:646 pl_gram.y:661 pl_gram.y:687 +#, c-format +msgid "variable \"%s\" does not exist" +msgstr "ცვლáƒáƒ“ი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: pl_comp.c:1722 +#, c-format +msgid "column \"%s\" of relation \"%s\" does not exist" +msgstr "სვეტი \"%s\" ურთიერთáƒáƒ‘áƒáƒ¨áƒ˜ %s áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" + +#: pl_comp.c:1775 #, c-format msgid "relation \"%s\" does not exist" msgstr "ურთიერთáƒáƒ‘რ\"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pl_comp.c:1825 pl_comp.c:1867 +#: pl_comp.c:1782 pl_comp.c:1820 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "ურთიერთáƒáƒ‘áƒáƒ¡ \"%s\" კáƒáƒ›áƒžáƒáƒ–იტური ტიპი áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" -#: pl_comp.c:1933 +#: pl_comp.c:1886 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "ცვლáƒáƒ“ის \"%s\" ტიპი ფსევდრტიპიáƒ: %s" -#: pl_comp.c:2122 +#: pl_comp.c:2075 #, c-format msgid "type \"%s\" is only a shell" msgstr "ტიპი \"%s\" მხáƒáƒšáƒáƒ“ გáƒáƒ áƒ¡áƒ˜áƒ" -#: pl_comp.c:2204 pl_exec.c:6907 +#: pl_comp.c:2157 pl_exec.c:6927 #, c-format msgid "type %s is not composite" msgstr "ტიპი %s კáƒáƒ›áƒžáƒáƒ–იტური áƒáƒ áƒáƒ" -#: pl_comp.c:2252 pl_comp.c:2305 +#: pl_comp.c:2193 +#, c-format +msgid "could not find array type for data type %s" +msgstr "მáƒáƒœáƒáƒªáƒ”მების ტიპისთვის %s მáƒáƒ¡áƒ˜áƒ•ის ტიპი ვერ ვიპáƒáƒ•ე" + +#: pl_comp.c:2232 pl_comp.c:2285 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "გáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ¡ უცნáƒáƒ‘ი პირáƒáƒ‘რ\"%s\"" -#: pl_comp.c:2526 +#: pl_comp.c:2514 #, c-format -msgid "" -"could not determine actual argument type for polymorphic function \"%s\"" -msgstr "" -"პáƒáƒšáƒ˜áƒ›áƒáƒ áƒ¤áƒ£áƒšáƒ˜ ფუნქციისთვის (%s) მიმდინáƒáƒ áƒ” áƒáƒ áƒ’უმენტის ტიპის დáƒáƒ“გენრშეუძლებელიáƒ" +msgid "could not determine actual argument type for polymorphic function \"%s\"" +msgstr "პáƒáƒšáƒ˜áƒ›áƒáƒ áƒ¤áƒ£áƒšáƒ˜ ფუნქციისთვის (%s) მიმდინáƒáƒ áƒ” áƒáƒ áƒ’უმენტის ტიპის დáƒáƒ“გენრშეუძლებელიáƒ" -#: pl_exec.c:501 pl_exec.c:940 pl_exec.c:1175 +#: pl_exec.c:511 pl_exec.c:950 pl_exec.c:1185 msgid "during initialization of execution state" msgstr "შესრულების ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡" -#: pl_exec.c:507 +#: pl_exec.c:517 msgid "while storing call arguments into local variables" msgstr "გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბის áƒáƒ áƒ’უმენტების ლáƒáƒ™áƒáƒšáƒ£áƒ  ცვლáƒáƒ“ებში დáƒáƒ›áƒáƒ®áƒ¡áƒáƒ•რებისáƒáƒ¡" -#: pl_exec.c:595 pl_exec.c:1013 +#: pl_exec.c:605 pl_exec.c:1023 msgid "during function entry" msgstr "ფუნქციის შესვლისáƒáƒ¡" -#: pl_exec.c:618 +#: pl_exec.c:628 #, c-format msgid "control reached end of function without RETURN" msgstr "კáƒáƒœáƒ¢áƒ áƒáƒšáƒ›áƒ ფუნქციის დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ¡ RETURN-ის გáƒáƒ áƒ”შე მიáƒáƒ¦áƒ¬áƒ˜áƒ" -#: pl_exec.c:624 +#: pl_exec.c:634 msgid "while casting return value to function's return type" msgstr "დáƒáƒ‘რუნებული მნიშვნელáƒáƒ‘ის ფუნქციის დáƒáƒ‘რუნების ტიპში კáƒáƒ¡áƒ¢áƒ˜áƒ¡áƒáƒ¡" -#: pl_exec.c:636 pl_exec.c:3665 +#: pl_exec.c:646 pl_exec.c:3681 #, c-format msgid "set-valued function called in context that cannot accept a set" -msgstr "" -"ფუნქციáƒ, რáƒáƒ›áƒ”ლიც სეტს áƒáƒ‘რუნებს, გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბულირკáƒáƒœáƒ¢áƒ”ქსტში, რáƒáƒ›áƒ”ლიც სეტებს ვერ " -"იღებს" +msgstr "ფუნქციáƒ, რáƒáƒ›áƒ”ლიც სეტს áƒáƒ‘რუნებს, გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბულირკáƒáƒœáƒ¢áƒ”ქსტში, რáƒáƒ›áƒ”ლიც სეტებს ვერ იღებს" -#: pl_exec.c:641 pl_exec.c:3671 +#: pl_exec.c:651 pl_exec.c:3687 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული რეჟიმი, მáƒáƒ’რáƒáƒ› áƒáƒ› კáƒáƒœáƒ¢áƒ”ქსტში ეს დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: pl_exec.c:768 pl_exec.c:1039 pl_exec.c:1197 +#: pl_exec.c:778 pl_exec.c:1049 pl_exec.c:1207 msgid "during function exit" msgstr "ფუნქციიდáƒáƒœ გáƒáƒ›áƒáƒ¡áƒ•ლისáƒáƒ¡" -#: pl_exec.c:823 pl_exec.c:887 pl_exec.c:3464 +#: pl_exec.c:833 pl_exec.c:897 pl_exec.c:3480 msgid "returned record type does not match expected record type" msgstr "დáƒáƒ‘რუნებული ჩáƒáƒœáƒáƒ¬áƒ”რის ტიპი მáƒáƒ¡áƒáƒšáƒáƒ“ნელი ჩáƒáƒœáƒáƒ¬áƒ”რის ტიპს áƒáƒ  ემთხვევáƒ" -#: pl_exec.c:1036 pl_exec.c:1194 +#: pl_exec.c:1046 pl_exec.c:1204 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "კáƒáƒœáƒ¢áƒ áƒáƒšáƒ›áƒ ტრიგერის პრáƒáƒªáƒ”დურის დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ¡ RETURN-ის გáƒáƒ áƒ”შე მიáƒáƒ¦áƒ¬áƒ˜áƒ" -#: pl_exec.c:1044 +#: pl_exec.c:1054 #, c-format msgid "trigger procedure cannot return a set" msgstr "ტრიგერი პრáƒáƒªáƒ”დურრსეტს ვერ დáƒáƒáƒ‘რუნებს" -#: pl_exec.c:1083 pl_exec.c:1111 -msgid "" -"returned row structure does not match the structure of the triggering table" +#: pl_exec.c:1093 pl_exec.c:1121 +msgid "returned row structure does not match the structure of the triggering table" msgstr "დáƒáƒ‘რუნებული მწკრივის სტრუქტურრტრიგერი ცხრილის სტრუქტურáƒáƒ¡ áƒáƒ  ემთხვევáƒ" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1252 +#: pl_exec.c:1262 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "PL/pgSQL ფუნქცირ%s ხáƒáƒ–ზე %d %s" @@ -187,361 +193,336 @@ msgstr "PL/pgSQL ფუნქცირ%s ხáƒáƒ–ზე %d %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1263 +#: pl_exec.c:1273 #, c-format msgid "PL/pgSQL function %s %s" msgstr "PL/pgSQL ფუნქცირ%s %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1271 +#: pl_exec.c:1281 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "PL/pgSQL ფუნქცირ%s ხáƒáƒ–ზე %d %s-სთáƒáƒœ" -#: pl_exec.c:1277 +#: pl_exec.c:1287 #, c-format msgid "PL/pgSQL function %s" msgstr "PL/pgSQL ფუნქცირ%s" -#: pl_exec.c:1648 +#: pl_exec.c:1658 msgid "during statement block local variable initialization" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ბლáƒáƒ™áƒ˜áƒ¡ ლáƒáƒ™áƒáƒšáƒ£áƒ áƒ˜ ცვლáƒáƒ“ის ინიციáƒáƒšáƒ˜áƒ–áƒáƒªáƒ˜áƒ˜áƒ¡áƒáƒ¡" -#: pl_exec.c:1753 +#: pl_exec.c:1763 msgid "during statement block entry" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ბლáƒáƒ™áƒ¨áƒ˜ შესვლისáƒáƒ¡" -#: pl_exec.c:1785 +#: pl_exec.c:1795 msgid "during statement block exit" msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ ბლáƒáƒ™áƒ˜áƒ“áƒáƒœ გáƒáƒ›áƒáƒ¡áƒ•ლისáƒáƒ¡" -#: pl_exec.c:1823 +#: pl_exec.c:1833 msgid "during exception cleanup" msgstr "გáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ¡ მáƒáƒ¡áƒ£áƒ¤áƒ—áƒáƒ•ებისáƒáƒ¡" -#: pl_exec.c:2360 +#: pl_exec.c:2370 #, c-format -msgid "" -"procedure parameter \"%s\" is an output parameter but corresponding argument " -"is not writable" -msgstr "" -"პრáƒáƒªáƒ”დურის პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრიáƒ, მáƒáƒ’რáƒáƒ› შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ " -"áƒáƒ áƒ’უმენტი ჩáƒáƒ¬áƒ”რáƒáƒ“ი áƒáƒ áƒáƒ" +msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" +msgstr "პრáƒáƒªáƒ”დურის პáƒáƒ áƒáƒ›áƒ”ტრი \"%s\" გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრიáƒ, მáƒáƒ’რáƒáƒ› შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ áƒáƒ áƒ’უმენტი ჩáƒáƒ¬áƒ”რáƒáƒ“ი áƒáƒ áƒáƒ" -#: pl_exec.c:2365 +#: pl_exec.c:2375 #, c-format -msgid "" -"procedure parameter %d is an output parameter but corresponding argument is " -"not writable" -msgstr "" -"პრáƒáƒªáƒ”დურის პáƒáƒ áƒáƒ›áƒ”ტრი %d გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრიáƒ, მáƒáƒ’რáƒáƒ› შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ áƒáƒ áƒ’უმენტი " -"ჩáƒáƒ¬áƒ”რáƒáƒ“ი áƒáƒ áƒáƒ" +msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" +msgstr "პრáƒáƒªáƒ”დურის პáƒáƒ áƒáƒ›áƒ”ტრი %d გáƒáƒ›áƒáƒ¢áƒáƒœáƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრიáƒ, მáƒáƒ’რáƒáƒ› შესáƒáƒ‘áƒáƒ›áƒ˜áƒ¡áƒ˜ áƒáƒ áƒ’უმენტი ჩáƒáƒ¬áƒ”რáƒáƒ“ი áƒáƒ áƒáƒ" -#: pl_exec.c:2399 +#: pl_exec.c:2409 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" -msgstr "" -"GET STACKED DIAGNOSTICS -ის გáƒáƒ›áƒáƒ§áƒ”ნებრგáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ¡ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის გáƒáƒ áƒ”თ " -"შეუძლებელიáƒ" +msgstr "GET STACKED DIAGNOSTICS -ის გáƒáƒ›áƒáƒ§áƒ”ნებრგáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ¡ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის გáƒáƒ áƒ”თ შეუძლებელიáƒ" -#: pl_exec.c:2599 +#: pl_exec.c:2615 #, c-format msgid "case not found" msgstr "შემთხვევრნáƒáƒžáƒáƒ•ნი áƒáƒ áƒáƒ" -#: pl_exec.c:2600 +#: pl_exec.c:2616 #, c-format msgid "CASE statement is missing ELSE part." msgstr "CASE áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¡ ELSE ნáƒáƒ¬áƒ˜áƒšáƒ˜ áƒáƒ™áƒšáƒ˜áƒ." -#: pl_exec.c:2693 +#: pl_exec.c:2709 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "\"FOR\" მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ ქვედრზღვáƒáƒ áƒ˜ ნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" -#: pl_exec.c:2709 +#: pl_exec.c:2725 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "\"FOR\" მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ ზედრზღვáƒáƒ áƒ˜ ნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" -#: pl_exec.c:2727 +#: pl_exec.c:2743 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "FOR მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ BY-ის მნიშვნელáƒáƒ‘რნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" -#: pl_exec.c:2733 +#: pl_exec.c:2749 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "FOR მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ BY-ის მნიშვნელáƒáƒ‘რნულზე მეტი უნდრიყáƒáƒ¡" -#: pl_exec.c:2867 pl_exec.c:4667 +#: pl_exec.c:2883 pl_exec.c:4690 #, c-format msgid "cursor \"%s\" already in use" msgstr "კურსáƒáƒ áƒ˜ \"%s\" უკვე გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებáƒ" -#: pl_exec.c:2890 pl_exec.c:4737 +#: pl_exec.c:2906 pl_exec.c:4760 #, c-format msgid "arguments given for cursor without arguments" msgstr "კურსáƒáƒ áƒ˜áƒ¡áƒ—ვის გáƒáƒ“მáƒáƒªáƒ”მული áƒáƒ áƒ’უმენტები áƒáƒ áƒ’უმენტების გáƒáƒ áƒ”შეáƒ" -#: pl_exec.c:2909 pl_exec.c:4756 +#: pl_exec.c:2925 pl_exec.c:4779 #, c-format msgid "arguments required for cursor" msgstr "კურსáƒáƒ áƒ˜áƒ¡áƒ—ვის სáƒáƒ­áƒ˜áƒ áƒ áƒáƒ áƒ’უმენტები" -#: pl_exec.c:3000 +#: pl_exec.c:3016 #, c-format msgid "FOREACH expression must not be null" msgstr "FOREACH გáƒáƒ›áƒáƒ®áƒáƒ¢áƒ£áƒšáƒ”ბრნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" -#: pl_exec.c:3015 +#: pl_exec.c:3031 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "FOREACH გáƒáƒ›áƒáƒ®áƒáƒ¢áƒ£áƒšáƒ”ბის გáƒáƒ›áƒáƒ¢áƒáƒœáƒ მáƒáƒ¡áƒ˜áƒ•ი უნდრიყáƒáƒ¡ დრáƒáƒ áƒ %s ტიპის" -#: pl_exec.c:3032 +#: pl_exec.c:3048 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "ჭრილის გáƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბრ(%d) დáƒáƒ¡áƒáƒ¨áƒ•ებ დიáƒáƒžáƒáƒ–áƒáƒœáƒ¡ (0.. %d) გáƒáƒ áƒ”თáƒáƒ" -#: pl_exec.c:3059 +#: pl_exec.c:3075 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "FOREACH ... SLICE მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ ცვლáƒáƒ“ი მáƒáƒ¡áƒ˜áƒ•ის ტიპის უნდრიყáƒáƒ¡" -#: pl_exec.c:3063 +#: pl_exec.c:3079 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "FOREACH მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ ცვლáƒáƒ“ი მáƒáƒ¡áƒ˜áƒ•ის ტიპის უნდრიყáƒáƒ¡" -#: pl_exec.c:3225 pl_exec.c:3282 pl_exec.c:3457 +#: pl_exec.c:3241 pl_exec.c:3298 pl_exec.c:3473 #, c-format -msgid "" -"cannot return non-composite value from function returning composite type" -msgstr "" -"ფუნქციáƒ, რáƒáƒ›áƒ”ლიც კáƒáƒ›áƒžáƒáƒ–იტურ ტიპს áƒáƒ‘რუნებს, áƒáƒ áƒáƒ™áƒáƒ›áƒžáƒáƒ–იტურ ტიპს ვერ დáƒáƒáƒ‘რუნებს" +msgid "cannot return non-composite value from function returning composite type" +msgstr "ფუნქციáƒ, რáƒáƒ›áƒ”ლიც კáƒáƒ›áƒžáƒáƒ–იტურ ტიპს áƒáƒ‘რუნებს, áƒáƒ áƒáƒ™áƒáƒ›áƒžáƒáƒ–იტურ ტიპს ვერ დáƒáƒáƒ‘რუნებს" -#: pl_exec.c:3321 pl_gram.y:3319 +#: pl_exec.c:3337 pl_gram.y:3376 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "áƒáƒ áƒ-SETOF ფუნქციáƒáƒ¨áƒ˜ RETURN NEXT-ს ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" -#: pl_exec.c:3362 pl_exec.c:3494 +#: pl_exec.c:3378 pl_exec.c:3510 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ შედეგის ტიპი, რáƒáƒ›áƒ”ლიც მიეწáƒáƒ“ებრRETURN NEXT- ში" -#: pl_exec.c:3400 pl_exec.c:3421 +#: pl_exec.c:3416 pl_exec.c:3437 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ ჩáƒáƒœáƒáƒ¬áƒ”რის ტიპი, რáƒáƒ›áƒ”ლიც მიეწáƒáƒ“ებრRETURN NEXT- ში" -#: pl_exec.c:3513 +#: pl_exec.c:3529 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT უნდრჰქáƒáƒœáƒ“ეს პáƒáƒ áƒáƒ›áƒ”ტრი" -#: pl_exec.c:3541 pl_gram.y:3383 +#: pl_exec.c:3557 pl_gram.y:3440 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "áƒáƒ áƒ-SETOF ფუნქციáƒáƒ¨áƒ˜ RETURN QUERY-ს ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" -#: pl_exec.c:3559 +#: pl_exec.c:3575 msgid "structure of query does not match function result type" msgstr "მáƒáƒ—ხáƒáƒ•ნის სტრუქტურრფუნქციის შედეგის ტიპს áƒáƒ  ემთხვევáƒ" -#: pl_exec.c:3614 pl_exec.c:4444 pl_exec.c:8685 +#: pl_exec.c:3630 pl_exec.c:4466 pl_exec.c:8726 #, c-format msgid "query string argument of EXECUTE is null" msgstr "\"EXECUTE\"-ის მáƒáƒ—ხáƒáƒ•ნის სტრიქáƒáƒœáƒ˜áƒ¡ áƒáƒ áƒ’უმენტი ნულáƒáƒ•áƒáƒœáƒ˜áƒ" -#: pl_exec.c:3699 pl_exec.c:3837 +#: pl_exec.c:3715 pl_exec.c:3853 #, c-format msgid "RAISE option already specified: %s" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრი RAISE უკვე მითითებულიáƒ: %s" -#: pl_exec.c:3733 +#: pl_exec.c:3749 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" -msgstr "" -"áƒáƒžáƒ”რáƒáƒ¢áƒáƒ  RAISE -ს გáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ¡ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის გáƒáƒ áƒ”თ პáƒáƒ áƒáƒ›áƒ”ტრების გáƒáƒ áƒ”შე ვერ " -"გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" +msgstr "áƒáƒžáƒ”რáƒáƒ¢áƒáƒ  RAISE -ს გáƒáƒ›áƒáƒœáƒáƒ™áƒšáƒ˜áƒ¡áƒ˜áƒ¡ დáƒáƒ›áƒ›áƒ£áƒ¨áƒáƒ•ებლის გáƒáƒ áƒ”თ პáƒáƒ áƒáƒ›áƒ”ტრების გáƒáƒ áƒ”შე ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" -#: pl_exec.c:3827 +#: pl_exec.c:3843 #, c-format msgid "RAISE statement option cannot be null" msgstr "RAISE áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ პáƒáƒ áƒáƒ›áƒ”ტრი ნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" -#: pl_exec.c:3897 +#: pl_exec.c:3913 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3952 +#: pl_exec.c:3968 #, c-format msgid "assertion failed" msgstr "მტკიცებრვერ მáƒáƒ®áƒ”რხდáƒ" -#: pl_exec.c:4317 pl_exec.c:4506 +#: pl_exec.c:4339 pl_exec.c:4529 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "pl/pgSQL-ში COPY კლიენტიდáƒáƒœ/ში შეუძლებელიáƒ" -#: pl_exec.c:4323 +#: pl_exec.c:4345 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "\"PL/pgSQL\"-ში მხáƒáƒ áƒ“áƒáƒ£áƒ­áƒ”რელი ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ˜áƒ¡ ბრძáƒáƒœáƒ”ბáƒ" -#: pl_exec.c:4346 pl_exec.c:4535 +#: pl_exec.c:4368 pl_exec.c:4558 #, c-format msgid "INTO used with a command that cannot return data" -msgstr "" -"INTO-ს გáƒáƒ›áƒáƒ§áƒ”ნებრბრძáƒáƒœáƒ”ბáƒáƒ¨áƒ˜, რáƒáƒ›áƒ”ლსáƒáƒª მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ‘რუნებრáƒáƒ  შეუძლიáƒ" +msgstr "INTO-ს გáƒáƒ›áƒáƒ§áƒ”ნებრბრძáƒáƒœáƒ”ბáƒáƒ¨áƒ˜, რáƒáƒ›áƒ”ლსáƒáƒª მáƒáƒœáƒáƒªáƒ”მების დáƒáƒ‘რუნებრáƒáƒ  შეუძლიáƒ" -#: pl_exec.c:4369 pl_exec.c:4558 +#: pl_exec.c:4391 pl_exec.c:4581 #, c-format msgid "query returned no rows" msgstr "მáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ მწკრივი áƒáƒ  დáƒáƒ£áƒ›áƒáƒ¢áƒ”ბიáƒ" -#: pl_exec.c:4391 pl_exec.c:4577 pl_exec.c:5729 +#: pl_exec.c:4413 pl_exec.c:4600 pl_exec.c:5752 #, c-format msgid "query returned more than one row" msgstr "მáƒáƒ—ხáƒáƒ•ნáƒáƒ› ერთზე მეტი მწკრივი დáƒáƒáƒ‘რუნáƒ" -#: pl_exec.c:4393 +#: pl_exec.c:4415 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ“ით, რáƒáƒ› მáƒáƒ—ხáƒáƒ•ნრერთ მწკრივს áƒáƒ‘რუნებს, áƒáƒœ LIMIT 1 გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ." -#: pl_exec.c:4409 +#: pl_exec.c:4431 #, c-format msgid "query has no destination for result data" msgstr "მáƒáƒ—ხáƒáƒ•ნáƒáƒ¡ áƒáƒ  áƒáƒ¥áƒ•ს დáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ”ბის áƒáƒ“გილი შედეგის მáƒáƒœáƒáƒªáƒ”მებისთვის" -#: pl_exec.c:4410 +#: pl_exec.c:4432 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." -msgstr "" -"თუ გსურთ SELECT-ის შედეგების მáƒáƒªáƒ˜áƒšáƒ”ბáƒ, შეგიძლიáƒáƒ— მის ნáƒáƒªáƒ•ლáƒáƒ“ PERFORM " -"გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—." +msgstr "თუ გსურთ SELECT-ის შედეგების მáƒáƒªáƒ˜áƒšáƒ”ბáƒ, შეგიძლიáƒáƒ— მის ნáƒáƒªáƒ•ლáƒáƒ“ PERFORM გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ—." -#: pl_exec.c:4498 +#: pl_exec.c:4521 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "ბრძáƒáƒœáƒ”ბრEXECUTE \"SELECT ... INTO\" გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" -#: pl_exec.c:4499 +#: pl_exec.c:4522 #, c-format -msgid "" -"You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS " -"instead." -msgstr "" -"შეიძლებრსáƒáƒ›áƒáƒ’იერáƒáƒ“ áƒáƒ›áƒ¯áƒáƒ‘ინáƒáƒ— EXECUTE … INTO áƒáƒœ EXECUTE CREATE TABLE .. AS -" -"ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ." +msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." +msgstr "შეიძლებრსáƒáƒ›áƒáƒ’იერáƒáƒ“ áƒáƒ›áƒ¯áƒáƒ‘ინáƒáƒ— EXECUTE … INTO áƒáƒœ EXECUTE CREATE TABLE .. AS -ის გáƒáƒ›áƒáƒ§áƒ”ნებáƒ." -#: pl_exec.c:4512 +#: pl_exec.c:4535 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "ტრáƒáƒœáƒ–áƒáƒ¥áƒªáƒ˜áƒ”ბის ბრძáƒáƒœáƒ”ბების EXECUTE გáƒáƒœáƒ®áƒáƒ áƒªáƒ˜áƒ”ლებული áƒáƒ áƒáƒ" -#: pl_exec.c:4822 pl_exec.c:4910 +#: pl_exec.c:4845 pl_exec.c:4933 #, c-format msgid "cursor variable \"%s\" is null" msgstr "კურსáƒáƒ áƒ˜ ცვლáƒáƒ“ი \"%s\" ნულáƒáƒ•áƒáƒœáƒ˜áƒ" -#: pl_exec.c:4833 pl_exec.c:4921 +#: pl_exec.c:4856 pl_exec.c:4944 #, c-format msgid "cursor \"%s\" does not exist" msgstr "კურსáƒáƒ áƒ˜ \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pl_exec.c:4846 +#: pl_exec.c:4869 #, c-format msgid "relative or absolute cursor position is null" msgstr "შედáƒáƒ áƒ”ბითი áƒáƒœ áƒáƒ‘სáƒáƒšáƒ£áƒ¢áƒ£áƒ áƒ˜ კურსáƒáƒ áƒ˜áƒ¡ პáƒáƒ–იცირნულáƒáƒ•áƒáƒœáƒ˜áƒ" -#: pl_exec.c:5084 pl_exec.c:5179 +#: pl_exec.c:5107 pl_exec.c:5202 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "ცვლáƒáƒ“ი \"%s\", áƒáƒ¦áƒ¬áƒ”რილი, რáƒáƒ’áƒáƒ áƒª NOT NULL, ნულáƒáƒ•áƒáƒœáƒ˜ ვერ იქნებáƒ" -#: pl_exec.c:5160 +#: pl_exec.c:5183 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "მწკრივის ცვლáƒáƒ“ისთვის áƒáƒ áƒáƒ™áƒáƒ›áƒžáƒáƒ–იტური მნიშვნელáƒáƒ‘ის მინიჭებრშეუძლებელიáƒ" -#: pl_exec.c:5192 +#: pl_exec.c:5215 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის ცვლáƒáƒ“ისთვის áƒáƒ áƒáƒ™áƒáƒ›áƒžáƒáƒ–იტური მნიშვნელáƒáƒ‘ის მინიჭებრშეუძლებელიáƒ" -#: pl_exec.c:5243 +#: pl_exec.c:5266 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "სისტემური სვეტზე (%s) მინიჭებრშეუძლებელიáƒ" -#: pl_exec.c:5692 +#: pl_exec.c:5715 #, c-format msgid "query did not return data" msgstr "მáƒáƒ—ხáƒáƒ•ნáƒáƒ› მáƒáƒœáƒáƒªáƒ”მები áƒáƒ  დáƒáƒáƒ‘რუნáƒ" -#: pl_exec.c:5693 pl_exec.c:5705 pl_exec.c:5730 pl_exec.c:5806 pl_exec.c:5811 +#: pl_exec.c:5716 pl_exec.c:5728 pl_exec.c:5753 pl_exec.c:5829 pl_exec.c:5834 #, c-format msgid "query: %s" msgstr "მáƒáƒ—ხáƒáƒ•ნáƒ: %s" -#: pl_exec.c:5701 +#: pl_exec.c:5724 #, c-format msgid "query returned %d column" msgid_plural "query returned %d columns" msgstr[0] "მáƒáƒ—ხáƒáƒ•ნáƒáƒ› %d სვეტი დáƒáƒáƒ‘რუნáƒ" msgstr[1] "მáƒáƒ—ხáƒáƒ•ნáƒáƒ› %d სვეტი დáƒáƒáƒ‘რუნáƒ" -#: pl_exec.c:5805 +#: pl_exec.c:5828 #, c-format msgid "query is SELECT INTO, but it should be plain SELECT" msgstr "მáƒáƒ—ხáƒáƒ•ნრSELECT INTO-áƒ, რáƒáƒªáƒ ის უბრáƒáƒšáƒáƒ“ SELECT-ი უნდრიყáƒáƒ¡" -#: pl_exec.c:5810 +#: pl_exec.c:5833 #, c-format msgid "query is not a SELECT" msgstr "მáƒáƒ—ხáƒáƒ•ნრSELECT-ი áƒáƒ áƒáƒ" -#: pl_exec.c:6620 pl_exec.c:6660 pl_exec.c:6700 +#: pl_exec.c:6640 pl_exec.c:6680 pl_exec.c:6720 #, c-format -msgid "" -"type of parameter %d (%s) does not match that when preparing the plan (%s)" -msgstr "" -"პáƒáƒ áƒáƒ›áƒ”ტრის %d (%s) ტიპი áƒáƒ  ემთხვევრიმáƒáƒ¡, რáƒáƒ›áƒšáƒ˜áƒ—áƒáƒª გეგმრმზáƒáƒ“დებáƒáƒ“რ(%s)" +msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" +msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის %d (%s) ტიპი áƒáƒ  ემთხვევრიმáƒáƒ¡, რáƒáƒ›áƒšáƒ˜áƒ—áƒáƒª გეგმრმზáƒáƒ“დებáƒáƒ“რ(%s)" -#: pl_exec.c:7111 pl_exec.c:7145 pl_exec.c:7219 pl_exec.c:7245 +#: pl_exec.c:7131 pl_exec.c:7165 pl_exec.c:7239 pl_exec.c:7265 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "ტáƒáƒšáƒáƒ‘áƒáƒ¨áƒ˜ სáƒáƒ¬áƒ§áƒ˜áƒ¡áƒ˜ დრსáƒáƒ›áƒ˜áƒ–ნე ველების რáƒáƒáƒ“ენáƒáƒ‘რáƒáƒ  ემთხვევáƒ" #. translator: %s represents a name of an extra check -#: pl_exec.c:7113 pl_exec.c:7147 pl_exec.c:7221 pl_exec.c:7247 +#: pl_exec.c:7133 pl_exec.c:7167 pl_exec.c:7241 pl_exec.c:7267 #, c-format msgid "%s check of %s is active." msgstr "áƒáƒ¥áƒ¢áƒ˜áƒ£áƒ áƒ˜áƒ %s შემáƒáƒ¬áƒ›áƒ”ბრ%s -დáƒáƒœ." -#: pl_exec.c:7117 pl_exec.c:7151 pl_exec.c:7225 pl_exec.c:7251 +#: pl_exec.c:7137 pl_exec.c:7171 pl_exec.c:7245 pl_exec.c:7271 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "დáƒáƒ áƒ¬áƒ›áƒ£áƒœáƒ“ით, რáƒáƒ› მáƒáƒ—ხáƒáƒ•ნრსვეტების ზუსტ ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ¡ áƒáƒ‘რუნებს." -#: pl_exec.c:7638 +#: pl_exec.c:7658 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რი %s ჯერ მიუნიჭებელიáƒ" -#: pl_exec.c:7639 +#: pl_exec.c:7659 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." -msgstr "" -"ჩáƒáƒœáƒáƒ¬áƒ”რის , რáƒáƒ›áƒ”ლსáƒáƒª მნიშვნელáƒáƒ‘რჯერ მინიჭებული áƒáƒ  áƒáƒ¥áƒ•ს, კáƒáƒ áƒ¢áƒ”ჟის სტრუქტურრ" -"გáƒáƒ£áƒ áƒ™áƒ•ეველიáƒ." +msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის , რáƒáƒ›áƒ”ლსáƒáƒª მნიშვნელáƒáƒ‘რჯერ მინიჭებული áƒáƒ  áƒáƒ¥áƒ•ს, კáƒáƒ áƒ¢áƒ”ჟის სტრუქტურრგáƒáƒ£áƒ áƒ™áƒ•ეველიáƒ." -#: pl_exec.c:8283 pl_gram.y:3442 +#: pl_exec.c:8324 pl_gram.y:3499 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "ცვლáƒáƒ“ი \"%s\" გáƒáƒ›áƒáƒªáƒ®áƒáƒ“დáƒ, რáƒáƒ’áƒáƒ áƒª CONSTANT" @@ -578,308 +559,285 @@ msgstr "SQL áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜" msgid "FOR over EXECUTE statement" msgstr "FOR-ი EXECUTE áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ–ე" -#: pl_gram.y:487 +#: pl_gram.y:486 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "ბლáƒáƒ™áƒ˜áƒ¡ ჭდე DECLARE-მდე უნდრიყáƒáƒ¡ გáƒáƒœáƒ—áƒáƒ•სებული დრáƒáƒ áƒ შემდეგ" -#: pl_gram.y:507 +#: pl_gram.y:506 #, c-format msgid "collations are not supported by type %s" msgstr "ტიპს \"%s\" კáƒáƒšáƒáƒªáƒ˜áƒ”ბის მხáƒáƒ áƒ“áƒáƒ­áƒ”რრáƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" -#: pl_gram.y:526 +#: pl_gram.y:525 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" -msgstr "" -"ცვლáƒáƒ“ისთვის \"%s\" ნáƒáƒ’ულისხმები მნიშვნელáƒáƒ‘ის ქáƒáƒœáƒ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ, რáƒáƒ“გáƒáƒœ ის " -"áƒáƒ¦áƒ¬áƒ”რილიáƒ, რáƒáƒ’áƒáƒ áƒª NOT NULL" +msgstr "ცვლáƒáƒ“ისთვის \"%s\" ნáƒáƒ’ულისხმები მნიშვნელáƒáƒ‘ის ქáƒáƒœáƒ áƒáƒ£áƒªáƒ˜áƒšáƒ”ბელიáƒ, რáƒáƒ“გáƒáƒœ ის áƒáƒ¦áƒ¬áƒ”რილიáƒ, რáƒáƒ’áƒáƒ áƒª NOT NULL" -#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 -#, c-format -msgid "variable \"%s\" does not exist" -msgstr "ცვლáƒáƒ“ი \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" - -#: pl_gram.y:733 pl_gram.y:761 +#: pl_gram.y:705 pl_gram.y:733 msgid "duplicate declaration" msgstr "დუბლირებული áƒáƒ¦áƒ¬áƒ”რáƒ" -#: pl_gram.y:744 pl_gram.y:772 +#: pl_gram.y:716 pl_gram.y:744 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "ცვლáƒáƒ“ი \"%s\" áƒáƒ“რე გáƒáƒœáƒ¡áƒáƒ–ღვრულ ცვლáƒáƒ“ს ჩრდილáƒáƒ•ს" -#: pl_gram.y:1044 +#: pl_gram.y:1018 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "დიáƒáƒ’ნáƒáƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რი %s GET STACKED DIAGNOSTICS- ში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" -#: pl_gram.y:1062 +#: pl_gram.y:1036 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "დიáƒáƒ’ნáƒáƒ¡áƒ¢áƒ˜áƒ™áƒ˜áƒ¡ ჩáƒáƒœáƒáƒ¬áƒ”რი %s GET CURRENT DIAGNOSTICS- ში დáƒáƒ¨áƒ•ებული áƒáƒ áƒáƒ" -#: pl_gram.y:1157 +#: pl_gram.y:1134 msgid "unrecognized GET DIAGNOSTICS item" msgstr "\"GET DIAGNOSTICS\"-ის უცნáƒáƒ‘ი ჩáƒáƒœáƒáƒ¬áƒ”რი" -#: pl_gram.y:1173 pl_gram.y:3558 +#: pl_gram.y:1150 pl_gram.y:3615 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" სკáƒáƒšáƒáƒ áƒ£áƒšáƒ˜ ცვლáƒáƒ“ი áƒáƒ áƒáƒ" -#: pl_gram.y:1403 pl_gram.y:1597 +#: pl_gram.y:1380 pl_gram.y:1574 #, c-format -msgid "" -"loop variable of loop over rows must be a record variable or list of scalar " -"variables" -msgstr "" -"კáƒáƒ áƒ¢áƒ”ჟის მáƒáƒ áƒ§áƒ£áƒŸáƒ˜ ცვლáƒáƒ“ი ჩáƒáƒœáƒáƒ¬áƒ”რის ცვლáƒáƒ“ის áƒáƒœ სკáƒáƒšáƒáƒ áƒ£áƒšáƒ˜ ცვლáƒáƒ“ების სიის ტიპის " -"უნდრიყáƒáƒ¡" +msgid "loop variable of loop over rows must be a record variable or list of scalar variables" +msgstr "კáƒáƒ áƒ¢áƒ”ჟის მáƒáƒ áƒ§áƒ£áƒŸáƒ˜ ცვლáƒáƒ“ი ჩáƒáƒœáƒáƒ¬áƒ”რის ცვლáƒáƒ“ის áƒáƒœ სკáƒáƒšáƒáƒ áƒ£áƒšáƒ˜ ცვლáƒáƒ“ების სიის ტიპის უნდრიყáƒáƒ¡" -#: pl_gram.y:1438 +#: pl_gram.y:1415 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "cursor FOR მáƒáƒ áƒ§áƒ£áƒŸáƒ¡ მხáƒáƒšáƒáƒ“ ერთი სáƒáƒ›áƒ˜áƒ–ნე ცვლáƒáƒ“ი უნდრჰქáƒáƒœáƒ“ეს" -#: pl_gram.y:1445 +#: pl_gram.y:1422 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "cursor FOR მáƒáƒ áƒ§áƒ£áƒŸáƒ›áƒ მხáƒáƒšáƒáƒ“ bound cursor ცვლáƒáƒ“ები უნდრგáƒáƒ›áƒáƒ˜áƒ§áƒ”ნáƒáƒ¡" -#: pl_gram.y:1536 +#: pl_gram.y:1513 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "integer for loop მხáƒáƒšáƒáƒ“ ერთი სáƒáƒ›áƒ˜áƒ–ნე ცვლáƒáƒ“ი უნდრჰქáƒáƒœáƒ“ეს" -#: pl_gram.y:1570 +#: pl_gram.y:1547 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "მáƒáƒ—ხáƒáƒ•ნის FOR მáƒáƒ áƒ§áƒ£áƒŸáƒ¨áƒ˜ REVERSE-ს ვერ მიუთითებთ" -#: pl_gram.y:1700 +#: pl_gram.y:1677 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" -msgstr "" -"\"FOREACH\"-ის მáƒáƒ áƒ§áƒ£áƒŸáƒ˜ ცვლáƒáƒ“ი ცნáƒáƒ‘ილი ცვლáƒáƒ“ს áƒáƒœ ცვლáƒáƒ“ების სიáƒáƒ¡ უნდრ" -"წáƒáƒ áƒ›áƒáƒáƒ“გენდეს" +msgstr "\"FOREACH\"-ის მáƒáƒ áƒ§áƒ£áƒŸáƒ˜ ცვლáƒáƒ“ი ცნáƒáƒ‘ილი ცვლáƒáƒ“ს áƒáƒœ ცვლáƒáƒ“ების სიáƒáƒ¡ უნდრწáƒáƒ áƒ›áƒáƒáƒ“გენდეს" -#: pl_gram.y:1742 +#: pl_gram.y:1719 #, c-format -msgid "" -"there is no label \"%s\" attached to any block or loop enclosing this " -"statement" -msgstr "" -"ბლáƒáƒ™áƒ¨áƒ˜ áƒáƒœ მáƒáƒ áƒ§áƒ£áƒŸáƒ¨áƒ˜, რáƒáƒ›áƒ”ლიც áƒáƒ› áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¡ შემáƒáƒ¤áƒáƒ áƒ’ლáƒáƒ•ს, ჭდე \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" +msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" +msgstr "ბლáƒáƒ™áƒ¨áƒ˜ áƒáƒœ მáƒáƒ áƒ§áƒ£áƒŸáƒ¨áƒ˜, რáƒáƒ›áƒ”ლიც áƒáƒ› áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¡ შემáƒáƒ¤áƒáƒ áƒ’ლáƒáƒ•ს, ჭდე \"%s\" áƒáƒ  áƒáƒ áƒ¡áƒ”ბáƒáƒ‘ს" -#: pl_gram.y:1750 +#: pl_gram.y:1727 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "ბლáƒáƒ™áƒ˜áƒ¡ ჭდეს \"%s\" CONTINUE-ში ვერ გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნებთ" -#: pl_gram.y:1765 +#: pl_gram.y:1742 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT áƒáƒ  შეიძლებრგáƒáƒ›áƒáƒ§áƒ”ნებულ იქნáƒáƒ¡ მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ გáƒáƒ áƒ”თ, თუ მáƒáƒ¡ áƒáƒ  áƒáƒ¥áƒ•ს ჭდე" -#: pl_gram.y:1766 +#: pl_gram.y:1743 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE-ის მáƒáƒ áƒ§áƒ£áƒŸáƒ˜áƒ¡ გáƒáƒ áƒ”თ გáƒáƒ›áƒáƒ§áƒ”ნებრშეუძლებელიáƒ" -#: pl_gram.y:1790 pl_gram.y:1828 pl_gram.y:1876 pl_gram.y:3005 pl_gram.y:3093 -#: pl_gram.y:3204 pl_gram.y:3957 +#: pl_gram.y:1767 pl_gram.y:1805 pl_gram.y:1853 pl_gram.y:3062 pl_gram.y:3150 +#: pl_gram.y:3261 pl_gram.y:4014 msgid "unexpected end of function definition" msgstr "ფუნქციის áƒáƒ¦áƒ¬áƒ”რის მáƒáƒ£áƒšáƒáƒ“ნელი დáƒáƒ¡áƒáƒ¡áƒ áƒ£áƒšáƒ˜" -#: pl_gram.y:1896 pl_gram.y:1920 pl_gram.y:1936 pl_gram.y:1942 pl_gram.y:2067 -#: pl_gram.y:2075 pl_gram.y:2089 pl_gram.y:2184 pl_gram.y:2408 pl_gram.y:2498 -#: pl_gram.y:2656 pl_gram.y:3800 pl_gram.y:3861 pl_gram.y:3938 +#: pl_gram.y:1873 pl_gram.y:1897 pl_gram.y:1913 pl_gram.y:1919 pl_gram.y:2044 +#: pl_gram.y:2052 pl_gram.y:2066 pl_gram.y:2161 pl_gram.y:2385 pl_gram.y:2475 +#: pl_gram.y:2634 pl_gram.y:3857 pl_gram.y:3918 pl_gram.y:3995 msgid "syntax error" msgstr "სინტáƒáƒ¥áƒ¡áƒ£áƒ áƒ˜ შეცდáƒáƒ›áƒ" -#: pl_gram.y:1924 pl_gram.y:1926 pl_gram.y:2412 pl_gram.y:2414 +#: pl_gram.y:1901 pl_gram.y:1903 pl_gram.y:2389 pl_gram.y:2391 msgid "invalid SQLSTATE code" msgstr "áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ SQLSTATE კáƒáƒ“ი" -#: pl_gram.y:2132 +#: pl_gram.y:2109 msgid "syntax error, expected \"FOR\"" msgstr "სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ შეცდáƒáƒ›áƒ. მáƒáƒ•ელáƒáƒ“ი \"FOR\"-ს" -#: pl_gram.y:2193 +#: pl_gram.y:2170 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "FETCH áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ¡ ბევრი მწკრივის დáƒáƒ‘რუნებრáƒáƒ  შეუძლიáƒ" -#: pl_gram.y:2290 +#: pl_gram.y:2267 #, c-format msgid "cursor variable must be a simple variable" msgstr "cursor ტიპის ცვლáƒáƒ“ი მáƒáƒ áƒ¢áƒ˜áƒ•ი ცვლáƒáƒ“ი უნდრიყáƒáƒ¡" -#: pl_gram.y:2296 +#: pl_gram.y:2273 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "ცვლáƒáƒ“ი %s -ის ტიპი cursor áƒáƒœ refcursor უნდრიყáƒáƒ¡" -#: pl_gram.y:2627 pl_gram.y:2638 +#: pl_gram.y:2605 pl_gram.y:2616 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" უცნáƒáƒ‘ი ცვლáƒáƒ“იáƒ" -#: pl_gram.y:2744 pl_gram.y:2754 pl_gram.y:2910 +#: pl_gram.y:2722 pl_gram.y:2732 pl_gram.y:2912 msgid "mismatched parentheses" msgstr "მშáƒáƒ‘ლáƒáƒ‘რáƒáƒ  ემთხვევáƒ" -#: pl_gram.y:2758 +#: pl_gram.y:2736 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "\"SQL\" გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¡ ბáƒáƒšáƒáƒ¨áƒ˜ \"%s\" áƒáƒ™áƒšáƒ˜áƒ" -#: pl_gram.y:2764 +#: pl_gram.y:2742 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "\"SQL\" გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒáƒ¡ ბáƒáƒšáƒáƒ¨áƒ˜ \"%s\" áƒáƒ™áƒšáƒ˜áƒ" -#: pl_gram.y:2781 +#: pl_gram.y:2759 msgid "missing expression" msgstr "áƒáƒ™áƒšáƒ˜áƒ გáƒáƒ›áƒáƒ¡áƒáƒ®áƒ£áƒšáƒ”ბáƒ" -#: pl_gram.y:2783 +#: pl_gram.y:2761 msgid "missing SQL statement" msgstr "áƒáƒ™áƒšáƒ˜áƒ SQL áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜" -#: pl_gram.y:2912 +#: pl_gram.y:2890 +msgid "syntax error, expected \"]\"" +msgstr "სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ შეცდáƒáƒ›áƒ. მáƒáƒ•ელáƒáƒ“ი სიმბáƒáƒšáƒáƒ¡ \"]\"" + +#: pl_gram.y:2914 msgid "incomplete data type declaration" msgstr "მáƒáƒœáƒáƒªáƒ”მის ტიპის áƒáƒ áƒáƒ¡áƒ áƒ£áƒšáƒ˜ áƒáƒ¦áƒ¬áƒ”რáƒ" -#: pl_gram.y:2935 +#: pl_gram.y:2937 msgid "missing data type declaration" msgstr "მáƒáƒœáƒáƒªáƒ”მის ტიპის" -#: pl_gram.y:3015 +#: pl_gram.y:3072 msgid "INTO specified more than once" msgstr "INTO ერთზე მეტჯერáƒáƒ მითითებული" -#: pl_gram.y:3185 +#: pl_gram.y:3242 msgid "expected FROM or IN" msgstr "მáƒáƒ•ელáƒáƒ“ი FROM -ს áƒáƒœ IN -ს" -#: pl_gram.y:3246 +#: pl_gram.y:3303 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "RETURN-ს სეტის დáƒáƒ›áƒ‘რუნებელ ფუნქციáƒáƒ¨áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი ვერ ექნებáƒ" -#: pl_gram.y:3247 +#: pl_gram.y:3304 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "გáƒáƒ›áƒáƒ˜áƒ§áƒ”ნეთ RETURN NEXT áƒáƒœ RETURN QUERY." -#: pl_gram.y:3257 +#: pl_gram.y:3314 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "RETURN-ს პრáƒáƒªáƒ”დურáƒáƒ¨áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი ვერ ექნებáƒ" -#: pl_gram.y:3262 +#: pl_gram.y:3319 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURN-ს áƒáƒ áƒáƒ¤áƒ áƒ˜áƒ¡-დáƒáƒ›áƒ‘რუნებელ ფუნქციáƒáƒ¨áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრი ვერ ექნებáƒ" -#: pl_gram.y:3271 +#: pl_gram.y:3328 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN-ს OUT პáƒáƒ áƒáƒ›áƒ”ტრების მქáƒáƒœáƒ” ფუნქციáƒáƒ¨áƒ˜ პáƒáƒ áƒáƒ›áƒ”ტრები ვერ ექნებáƒ" -#: pl_gram.y:3334 +#: pl_gram.y:3391 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" -msgstr "" -"RETURN NEXT-ს პáƒáƒ áƒáƒ›áƒ”ტრი ფუნქციáƒáƒ¨áƒ˜, რáƒáƒ›áƒ”ლსáƒáƒª OUT პáƒáƒ áƒáƒ›áƒ”ტრები áƒáƒ¥áƒ•ს, ვერ ექნებáƒ" +msgstr "RETURN NEXT-ს პáƒáƒ áƒáƒ›áƒ”ტრი ფუნქციáƒáƒ¨áƒ˜, რáƒáƒ›áƒ”ლსáƒáƒª OUT პáƒáƒ áƒáƒ›áƒ”ტრები áƒáƒ¥áƒ•ს, ვერ ექნებáƒ" -#: pl_gram.y:3500 +#: pl_gram.y:3557 #, c-format msgid "record variable cannot be part of multiple-item INTO list" -msgstr "" -"ჩáƒáƒœáƒáƒ¬áƒ”რის ცვლáƒáƒ“ი მრáƒáƒ•áƒáƒšáƒ”-ლემენტიáƒáƒœáƒ˜ INTO ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜áƒ¡ ნáƒáƒ¬áƒ˜áƒšáƒ˜ ვერ იქნებáƒ" +msgstr "ჩáƒáƒœáƒáƒ¬áƒ”რის ცვლáƒáƒ“ი მრáƒáƒ•áƒáƒšáƒ”-ლემენტიáƒáƒœáƒ˜ INTO ჩáƒáƒ›áƒáƒœáƒáƒ—ვáƒáƒšáƒ˜áƒ¡ ნáƒáƒ¬áƒ˜áƒšáƒ˜ ვერ იქნებáƒ" -#: pl_gram.y:3546 +#: pl_gram.y:3603 #, c-format msgid "too many INTO variables specified" msgstr "მითითებულირმეტისმეტი INTO ცვლáƒáƒ“ი" -#: pl_gram.y:3754 +#: pl_gram.y:3811 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "უჭდერბლáƒáƒ™áƒ˜áƒ¡áƒ—ვის მითითებულირსáƒáƒ‘áƒáƒšáƒáƒ ჭდე \"%s\"" -#: pl_gram.y:3761 +#: pl_gram.y:3818 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "სáƒáƒ‘áƒáƒšáƒáƒ ჭდე \"%s\" გáƒáƒœáƒ¡áƒ®áƒ•áƒáƒ•დებრბლáƒáƒ™áƒ˜áƒ¡ ჭდისგáƒáƒœ \"%s\"" -#: pl_gram.y:3795 +#: pl_gram.y:3852 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "კურსáƒáƒ áƒ¡ %s áƒáƒ áƒ’უმენტები áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" -#: pl_gram.y:3809 +#: pl_gram.y:3866 #, c-format msgid "cursor \"%s\" has arguments" msgstr "კურსáƒáƒ áƒ¡ %s áƒáƒ¥áƒ•ს áƒáƒ áƒ’უმენტები" -#: pl_gram.y:3851 +#: pl_gram.y:3908 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "კურსáƒáƒ áƒ¡ %s áƒáƒ áƒ’უმენტი სáƒáƒ®áƒ”ლáƒáƒ“ %s áƒáƒ  გáƒáƒáƒ©áƒœáƒ˜áƒ" -#: pl_gram.y:3871 +#: pl_gram.y:3928 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" -msgstr "" -"კურსáƒáƒ áƒ˜áƒ¡ \"%2$s\" პáƒáƒ áƒáƒ›áƒ”ტრის \"%1$s\" მნიშვნელáƒáƒ‘რერთზე მეტჯერáƒáƒ მითითებული" +msgstr "კურსáƒáƒ áƒ˜áƒ¡ \"%2$s\" პáƒáƒ áƒáƒ›áƒ”ტრის \"%1$s\" მნიშვნელáƒáƒ‘რერთზე მეტჯერáƒáƒ მითითებული" -#: pl_gram.y:3896 +#: pl_gram.y:3953 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "áƒáƒ áƒáƒ¡áƒáƒ™áƒ›áƒáƒ áƒ˜áƒ¡áƒ˜ áƒáƒ áƒ’უმენტები კურსáƒáƒ áƒ˜áƒ¡áƒ—ვის \"%s\"" -#: pl_gram.y:3903 +#: pl_gram.y:3960 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "ძáƒáƒšáƒ˜áƒáƒœ ბევრი áƒáƒ áƒ’უმენტი კურსáƒáƒ áƒ˜áƒ¡áƒ—ვის \"%s\"" -#: pl_gram.y:3989 +#: pl_gram.y:4046 msgid "unrecognized RAISE statement option" msgstr "\"RAISE\" áƒáƒžáƒ”რáƒáƒ¢áƒáƒ áƒ˜áƒ¡ უცნáƒáƒ‘ი პáƒáƒ áƒáƒ›áƒ”ტრი" -#: pl_gram.y:3993 +#: pl_gram.y:4050 msgid "syntax error, expected \"=\"" msgstr "სინტáƒáƒ¥áƒ¡áƒ˜áƒ¡ შეცდáƒáƒ›áƒ. მáƒáƒ•ელáƒáƒ“ი \"=\"-ს" -#: pl_gram.y:4034 +#: pl_gram.y:4091 #, c-format msgid "too many parameters specified for RAISE" msgstr "ძáƒáƒšáƒ˜áƒáƒœ ბევრი პáƒáƒ áƒáƒ›áƒ”ტრი მითითებულირRAISE- სთვის" -#: pl_gram.y:4038 +#: pl_gram.y:4095 #, c-format msgid "too few parameters specified for RAISE" msgstr "ძáƒáƒšáƒ˜áƒáƒœ ცáƒáƒ¢áƒ პáƒáƒ áƒáƒ›áƒ”ტრი მითითებულირRAISE- სთვის" #: pl_handler.c:156 -msgid "" -"Sets handling of conflicts between PL/pgSQL variable names and table column " -"names." -msgstr "" -"PL/pgSQL-ის ცვლáƒáƒ“ების სáƒáƒ®áƒ”ლებსრდრცხრილის სვეტის სáƒáƒ®áƒ”ლებს შáƒáƒ áƒ˜áƒ¡ " -"კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ”ბის გáƒáƒ“áƒáƒ¬áƒ§áƒ•ეტის რეჟიმი." +msgid "Sets handling of conflicts between PL/pgSQL variable names and table column names." +msgstr "PL/pgSQL-ის ცვლáƒáƒ“ების სáƒáƒ®áƒ”ლებსრდრცხრილის სვეტის სáƒáƒ®áƒ”ლებს შáƒáƒ áƒ˜áƒ¡ კáƒáƒœáƒ¤áƒšáƒ˜áƒ¥áƒ¢áƒ”ბის გáƒáƒ“áƒáƒ¬áƒ§áƒ•ეტის რეჟიმი." #: pl_handler.c:165 -msgid "" -"Print information about parameters in the DETAIL part of the error messages " -"generated on INTO ... STRICT failures." -msgstr "" -"INTO … STRICT áƒáƒ•áƒáƒ áƒ˜áƒ”ბზე გენერირებული შეცდáƒáƒ›áƒ˜áƒ¡ შეტყáƒáƒ‘ინებებში პáƒáƒ áƒáƒ›áƒ”ტრების " -"შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ DETAIL ნáƒáƒ¬áƒ˜áƒšáƒ¨áƒ˜ დáƒáƒ›áƒáƒ¢áƒ”ბáƒ." +msgid "Print information about parameters in the DETAIL part of the error messages generated on INTO ... STRICT failures." +msgstr "INTO … STRICT áƒáƒ•áƒáƒ áƒ˜áƒ”ბზე გენერირებული შეცდáƒáƒ›áƒ˜áƒ¡ შეტყáƒáƒ‘ინებებში პáƒáƒ áƒáƒ›áƒ”ტრების შესáƒáƒ®áƒ”ბ ინფáƒáƒ áƒ›áƒáƒªáƒ˜áƒ˜áƒ¡ DETAIL ნáƒáƒ¬áƒ˜áƒšáƒ¨áƒ˜ დáƒáƒ›áƒáƒ¢áƒ”ბáƒ." #: pl_handler.c:173 msgid "Perform checks given in ASSERT statements." diff --git a/src/pl/plpgsql/src/po/ko.po b/src/pl/plpgsql/src/po/ko.po index e1397d110280a..596410785157c 100644 --- a/src/pl/plpgsql/src/po/ko.po +++ b/src/pl/plpgsql/src/po/ko.po @@ -4,10 +4,10 @@ # Ioseph Kim , 2010 msgid "" msgstr "" -"Project-Id-Version: plpgsql (PostgreSQL) 13\n" +"Project-Id-Version: plpgsql (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-10-05 20:38+0000\n" -"PO-Revision-Date: 2020-10-06 16:39+0900\n" +"POT-Creation-Date: 2025-01-17 04:39+0000\n" +"PO-Revision-Date: 2025-01-16 10:40+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: pl_comp.c:436 pl_handler.c:471 +#: pl_comp.c:434 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "PL/pgSQL í•¨ìˆ˜ì— %s 형ì‹ì„ 사용할 수 ì—†ìŒ" @@ -31,7 +31,7 @@ msgstr "ë‹¤í˜•ì  í•¨ìˆ˜ \"%s\"ì˜ ì‹¤ì œ 반환 형ì‹ì„ 확ì¸í•  수 ì—†ìŒ" msgid "trigger functions can only be called as triggers" msgstr "트리거 함수는 트리거로만 í˜¸ì¶œë  ìˆ˜ 있ìŒ" -#: pl_comp.c:560 pl_handler.c:455 +#: pl_comp.c:560 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "PL/pgSQL 함수는 %s 형ì‹ì„ 반환할 수 ì—†ìŒ" @@ -53,110 +53,135 @@ msgstr "대신 TG_NARGS ë° TG_ARGV를 통해 íŠ¸ë¦¬ê±°ì˜ ì¸ìˆ˜ì— 액세스 msgid "event trigger functions cannot have declared arguments" msgstr "ì´ë²¤íЏ 트리거 함수는 ì„ ì–¸ëœ ì¸ìž(declare argument)를 사용할 수 ì—†ìŒ" -#: pl_comp.c:997 +#: pl_comp.c:998 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "PL/pgSQL 함수 \"%s\" 컴파ì¼(%d번째 줄 근처)" -#: pl_comp.c:1020 +#: pl_comp.c:1021 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "\"%s\" 매개 변수가 여러 번 사용 ë¨" -#: pl_comp.c:1132 +#: pl_comp.c:1135 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "ì—´ 참조 \"%s\" ê°€ 명확하지 않습니다." -#: pl_comp.c:1134 +#: pl_comp.c:1137 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "PL/pgSQL 변수명ë„, í…Œì´ë¸” 칼럼 ì´ë¦„ë„ ì•„ë‹ˆì—¬ì•¼ 함" -#: pl_comp.c:1317 pl_exec.c:5218 pl_exec.c:5583 pl_exec.c:5670 pl_exec.c:5761 -#: pl_exec.c:6749 +#: pl_comp.c:1314 pl_exec.c:5260 pl_exec.c:5433 pl_exec.c:5520 pl_exec.c:5611 +#: pl_exec.c:6636 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "\"%s\" ë ˆì½”ë“œì— \"%s\" 필드가 ì—†ìŒ" -#: pl_comp.c:1793 +#: pl_comp.c:1633 pl_gram.y:645 pl_gram.y:660 pl_gram.y:686 +#, c-format +msgid "variable \"%s\" does not exist" +msgstr "\"%s\" 변수가 ì—†ìŒ" + +#: pl_comp.c:1722 +#, c-format +msgid "column \"%s\" of relation \"%s\" does not exist" +msgstr "\"%s\" ì¹¼ëŸ¼ì´ \"%s\" 릴레ì´ì…˜ì— ì—†ìŒ" + +#: pl_comp.c:1775 #, c-format msgid "relation \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ë¦´ë ˆì´ì…˜(relation)ì´ ì—†ìŠµë‹ˆë‹¤" -#: pl_comp.c:1891 +#: pl_comp.c:1782 pl_comp.c:1820 +#, c-format +msgid "relation \"%s\" does not have a composite type" +msgstr "\"%s\" 릴레ì´ì…˜ì—는 복합 ìžë£Œí˜•ì´ ì—†ìŠµë‹ˆë‹¤" + +#: pl_comp.c:1886 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "\"%s\" ë³€ìˆ˜ì— ì˜ì‚¬ í˜•ì‹ %sì´(ê°€) 있ìŒ" -#: pl_comp.c:2080 +#: pl_comp.c:2075 #, c-format msgid "type \"%s\" is only a shell" msgstr "ìžë£Œí˜• \"%s\" 는 오로지 shell ì—ë§Œ 있습니다. " -#: pl_comp.c:2162 pl_exec.c:7050 +#: pl_comp.c:2157 pl_exec.c:6937 #, c-format msgid "type %s is not composite" msgstr "%s ìžë£Œí˜•ì€ ë³µí•© ìžë£Œí˜•ì´ ì•„ë‹˜" -#: pl_comp.c:2210 pl_comp.c:2263 +#: pl_comp.c:2193 +#, c-format +msgid "could not find array type for data type %s" +msgstr "%s ìžë£Œí˜•ì„ ì‚¬ìš©í•˜ëŠ” ë°°ì—´ ìžë£Œí˜•ì´ ì—†ìŒ" + +#: pl_comp.c:2232 pl_comp.c:2285 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "ì¸ì‹í•  수 없는 예외 ì¡°ê±´ \"%s\"" -#: pl_comp.c:2484 +#: pl_comp.c:2514 #, c-format msgid "" "could not determine actual argument type for polymorphic function \"%s\"" msgstr "ë‹¤í˜•ì  í•¨ìˆ˜ \"%s\"ì˜ ì‹¤ì œ ì¸ìˆ˜ 형ì‹ì„ 확ì¸í•  수 ì—†ìŒ" -#: pl_exec.c:498 pl_exec.c:935 pl_exec.c:1173 +#: pl_exec.c:512 pl_exec.c:951 pl_exec.c:1186 msgid "during initialization of execution state" msgstr "실행 ìƒíƒœë¥¼ 초기화하는 ë™ì•ˆ" -#: pl_exec.c:504 +#: pl_exec.c:518 msgid "while storing call arguments into local variables" msgstr "호출 ì¸ìˆ˜ë¥¼ 로컬 ë³€ìˆ˜ì— ì €ìž¥í•˜ëŠ” ë™ì•ˆ" -#: pl_exec.c:592 pl_exec.c:1008 +#: pl_exec.c:606 pl_exec.c:1024 msgid "during function entry" msgstr "함수를 시작하는 ë™ì•ˆ" -#: pl_exec.c:617 +#: pl_exec.c:629 #, c-format msgid "control reached end of function without RETURN" msgstr "ì»¨íŠ¸ë¡¤ì´ RETURN ì—†ì´ í•¨ìˆ˜ ëì— ë„달함" -#: pl_exec.c:624 +#: pl_exec.c:635 msgid "while casting return value to function's return type" msgstr "í•¨ìˆ˜ì˜ ë°˜í™˜ 형ì‹ìœ¼ë¡œ 반환 ê°’ì„ í˜•ë³€í™˜í•˜ëŠ” ë™ì•ˆ" -#: pl_exec.c:637 pl_exec.c:3653 +#: pl_exec.c:647 pl_exec.c:3683 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "set-values 함수(í…Œì´ë¸” 리턴 함수)ê°€ set ì •ì˜ ì—†ì´ ì‚¬ìš©ë˜ì—ˆìŠµë‹ˆë‹¤ (í…Œì´ë¸”ê³¼ í•´" "당 ì—´ alias 지정하세요)" -#: pl_exec.c:763 pl_exec.c:1037 pl_exec.c:1198 +#: pl_exec.c:652 pl_exec.c:3689 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "materialize 모드가 필요합니다만, ì´ êµ¬ë¬¸ì—서는 허용ë˜ì§€ 않습니다" + +#: pl_exec.c:779 pl_exec.c:1050 pl_exec.c:1208 msgid "during function exit" msgstr "함수를 종료하는 ë™ì•ˆ" -#: pl_exec.c:818 pl_exec.c:882 pl_exec.c:3498 +#: pl_exec.c:834 pl_exec.c:898 pl_exec.c:3482 msgid "returned record type does not match expected record type" msgstr "ë°˜í™˜ëœ ë ˆì½”ë“œ 형ì‹ì´ 필요한 레코드 형ì‹ê³¼ ì¼ì¹˜í•˜ì§€ 않ìŒ" -#: pl_exec.c:1033 pl_exec.c:1194 +#: pl_exec.c:1047 pl_exec.c:1205 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "ì»¨íŠ¸ë¡¤ì´ RETURN ì—†ì´ íŠ¸ë¦¬ê±° 프로시저 ëì— ë„달함" -#: pl_exec.c:1042 +#: pl_exec.c:1055 #, c-format msgid "trigger procedure cannot return a set" msgstr "트리거 프로시저는 ì§‘í•©ì„ ë°˜í™˜í•  수 ì—†ìŒ" -#: pl_exec.c:1081 pl_exec.c:1109 +#: pl_exec.c:1094 pl_exec.c:1122 msgid "" "returned row structure does not match the structure of the triggering table" msgstr "ë°˜í™˜ëœ í–‰ 구조가 트리거하는 í…Œì´ë¸”ì˜ êµ¬ì¡°ì™€ ì¼ì¹˜í•˜ì§€ 않ìŒ" @@ -164,7 +189,7 @@ msgstr "ë°˜í™˜ëœ í–‰ 구조가 트리거하는 í…Œì´ë¸”ì˜ êµ¬ì¡°ì™€ ì¼ì¹˜í•˜ #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1244 +#: pl_exec.c:1263 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "PL/pgSQL 함수 \"%s\" ì˜ %d번째 줄 %s" @@ -172,354 +197,349 @@ msgstr "PL/pgSQL 함수 \"%s\" ì˜ %d번째 줄 %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1255 +#: pl_exec.c:1274 #, c-format msgid "PL/pgSQL function %s %s" msgstr "PL/pgSQL 함수 %s %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1263 +#: pl_exec.c:1282 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "PL/pgSQL 함수 \"%s\" ì˜ %d번째 %s" -#: pl_exec.c:1269 +#: pl_exec.c:1288 #, c-format msgid "PL/pgSQL function %s" msgstr "PL/pgSQL 함수 %s" -#: pl_exec.c:1607 +#: pl_exec.c:1659 msgid "during statement block local variable initialization" msgstr "문 ë¸”ë¡ ë¡œì»¬ 변수를 초기화하는 ë™ì•ˆ" -#: pl_exec.c:1705 +#: pl_exec.c:1764 msgid "during statement block entry" msgstr "문 블ë¡ì„ 시작하는 ë™ì•ˆ" -#: pl_exec.c:1737 +#: pl_exec.c:1796 msgid "during statement block exit" msgstr "문 블ë¡ì„ 종료하는 ë™ì•ˆ" -#: pl_exec.c:1775 +#: pl_exec.c:1834 msgid "during exception cleanup" msgstr "예외를 정리하는 ë™ì•ˆ" -#: pl_exec.c:2304 +#: pl_exec.c:2370 #, c-format msgid "" "procedure parameter \"%s\" is an output parameter but corresponding argument " "is not writable" msgstr "\"%s\" 프로시져 ì¸ìžëŠ” 출력 ì¸ìžì¸ë°, ê°’ ë³€ê²½ì´ ë¶ˆê°€ëŠ¥ 함" -#: pl_exec.c:2309 +#: pl_exec.c:2375 #, c-format msgid "" "procedure parameter %d is an output parameter but corresponding argument is " "not writable" msgstr "%d 프로시져 ì¸ìžëŠ” 출력 ì¸ìžì¸ë°, ê°’ ë³€ê²½ì´ ë¶ˆê°€ëŠ¥ 함" -#: pl_exec.c:2437 +#: pl_exec.c:2411 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS êµ¬ë¬¸ì€ ì˜ˆì™¸ì²˜ë¦¬ 헨들러 ë°–ì—서 사용할 수 ì—†ìŒ" -#: pl_exec.c:2637 +#: pl_exec.c:2617 #, c-format msgid "case not found" msgstr "사례를 찾지 못함" -#: pl_exec.c:2638 +#: pl_exec.c:2618 #, c-format msgid "CASE statement is missing ELSE part." msgstr "CASE ë¬¸ì— ELSE ë¶€ë¶„ì´ ëˆ„ë½ë˜ì—ˆìŠµë‹ˆë‹¤." -#: pl_exec.c:2731 +#: pl_exec.c:2711 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "FOR ë£¨í”„ì˜ í•˜í•œì€ nullì¼ ìˆ˜ ì—†ìŒ" -#: pl_exec.c:2747 +#: pl_exec.c:2727 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "FOR ë£¨í”„ì˜ ìƒí•œì€ nullì¼ ìˆ˜ ì—†ìŒ" -#: pl_exec.c:2765 +#: pl_exec.c:2745 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "FOR ë£¨í”„ì˜ BY ê°’ì€ nullì¼ ìˆ˜ ì—†ìŒ" -#: pl_exec.c:2771 +#: pl_exec.c:2751 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "FOR ë£¨í”„ì˜ BY ê°’ì€ 0보다 커야 함" -#: pl_exec.c:2905 pl_exec.c:4632 +#: pl_exec.c:2885 pl_exec.c:4693 #, c-format msgid "cursor \"%s\" already in use" msgstr "\"%s\" 커서가 ì´ë¯¸ 사용 중임" -#: pl_exec.c:2928 pl_exec.c:4697 +#: pl_exec.c:2908 pl_exec.c:4763 #, c-format msgid "arguments given for cursor without arguments" msgstr "ì¸ìˆ˜ê°€ 없는 ì»¤ì„œì— ì¸ìˆ˜ê°€ 제공ë¨" -#: pl_exec.c:2947 pl_exec.c:4716 +#: pl_exec.c:2927 pl_exec.c:4782 #, c-format msgid "arguments required for cursor" msgstr "ì»¤ì„œì— ì¸ìˆ˜ í•„ìš”" -#: pl_exec.c:3034 +#: pl_exec.c:3018 #, c-format msgid "FOREACH expression must not be null" msgstr "FOREACH êµ¬ë¬¸ì€ null ì´ ì•„ë‹ˆì—¬ì•¼ 함" -#: pl_exec.c:3049 +#: pl_exec.c:3033 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "FOREACH 구문ì—서는 ë°°ì—´ì´ ì‚¬ìš©ë©ë‹ˆë‹¤. ì‚¬ìš©ëœ ìžë£Œí˜• %s" -#: pl_exec.c:3066 +#: pl_exec.c:3050 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "slice dimension (%d) ê°’ì´ ë²”ìœ„ë¥¼ 벗어남, 0..%d" -#: pl_exec.c:3093 +#: pl_exec.c:3077 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "FOREACH ... SLICE 루프 변수는 ë°°ì—´ ìžë£Œí˜•ì´ì–´ì•¼ 함" -#: pl_exec.c:3097 +#: pl_exec.c:3081 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "FOREACH 반복 변수는 ë°°ì—´í˜•ì´ ì•„ë‹ˆì—¬ì•¼ 함" -#: pl_exec.c:3259 pl_exec.c:3316 pl_exec.c:3491 +#: pl_exec.c:3243 pl_exec.c:3300 pl_exec.c:3475 #, c-format msgid "" "cannot return non-composite value from function returning composite type" msgstr "" "í•¨ìˆ˜ì˜ ë°˜í™˜ê°’ì´ ë³µí•© ìžë£Œí˜•ì¸ë°, 복합 ìžë£Œí˜•아닌 ìžë£Œí˜•ì„ ë°˜í™˜í•˜ë ¤ê³  함" -#: pl_exec.c:3355 pl_gram.y:3309 +#: pl_exec.c:3339 pl_gram.y:3375 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "SETOF 함수가 아닌 함수ì—서 RETURN NEXT를 사용할 수 ì—†ìŒ" -#: pl_exec.c:3396 pl_exec.c:3528 +#: pl_exec.c:3380 pl_exec.c:3512 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "RETURN NEXTì— ìž˜ëª»ëœ ê²°ê³¼ 형ì‹ì´ 제공ë¨" -#: pl_exec.c:3434 pl_exec.c:3455 +#: pl_exec.c:3418 pl_exec.c:3439 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "RETURN NEXTì— ìž˜ëª»ëœ ë ˆì½”ë“œ 형ì‹ì´ 제공ë¨" -#: pl_exec.c:3547 +#: pl_exec.c:3531 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXTì— ë§¤ê°œ 변수 í•„ìš”" -#: pl_exec.c:3573 pl_gram.y:3373 +#: pl_exec.c:3559 pl_gram.y:3439 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "SETOF 함수가 아닌 함수ì—서 RETURN QUERY를 사용할 수 ì—†ìŒ" -#: pl_exec.c:3597 +#: pl_exec.c:3577 msgid "structure of query does not match function result type" msgstr "쿼리 구조가 함수 ê²°ê³¼ 형ì‹ê³¼ ì¼ì¹˜í•˜ì§€ 않ìŒ" -#: pl_exec.c:3681 pl_exec.c:3819 +#: pl_exec.c:3632 pl_exec.c:4469 pl_exec.c:8759 +#, c-format +msgid "query string argument of EXECUTE is null" +msgstr "EXECUTEì˜ ì¿¼ë¦¬ 문ìžì—´ ì¸ìˆ˜ê°€ nullìž„" + +#: pl_exec.c:3717 pl_exec.c:3855 #, c-format msgid "RAISE option already specified: %s" msgstr "RAISE ì˜µì…˜ì´ ì´ë¯¸ 지정ë¨: %s" -#: pl_exec.c:3715 +#: pl_exec.c:3751 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "매개 변수 없는 RAISE를 예외 처리기 ì™¸ë¶€ì— ì‚¬ìš©í•  수 ì—†ìŒ" -#: pl_exec.c:3809 +#: pl_exec.c:3845 #, c-format msgid "RAISE statement option cannot be null" msgstr "RAISE 문 ì˜µì…˜ì´ nullì¼ ìˆ˜ ì—†ìŒ" -#: pl_exec.c:3879 +#: pl_exec.c:3915 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3934 +#: pl_exec.c:3970 #, c-format msgid "assertion failed" msgstr "assertion 실패" -#: pl_exec.c:4281 pl_exec.c:4471 +#: pl_exec.c:4342 pl_exec.c:4532 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "PL/pgSQLì˜ í´ë¼ì´ì–¸íŠ¸ì™€ ìƒí˜¸ 복사할 수 ì—†ìŒ" -#: pl_exec.c:4287 +#: pl_exec.c:4348 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "PL/pgSQL 안ì—서는 ì§€ì›í•˜ì§€ 않는 트랜잭션 명령" -#: pl_exec.c:4310 pl_exec.c:4500 +#: pl_exec.c:4371 pl_exec.c:4561 #, c-format msgid "INTO used with a command that cannot return data" msgstr "ë°ì´í„°ë¥¼ 반환할 수 없는 명령과 함께 INTOê°€ 사용ë¨" -#: pl_exec.c:4333 pl_exec.c:4523 +#: pl_exec.c:4394 pl_exec.c:4584 #, c-format msgid "query returned no rows" msgstr "쿼리ì—서 í–‰ì„ ë°˜í™˜í•˜ì§€ 않ìŒ" -#: pl_exec.c:4355 pl_exec.c:4542 +#: pl_exec.c:4416 pl_exec.c:4603 pl_exec.c:5755 #, c-format msgid "query returned more than one row" msgstr "쿼리ì—서 ë‘ ê°œ ì´ìƒì˜ í–‰ì„ ë°˜í™˜" -#: pl_exec.c:4357 +#: pl_exec.c:4418 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "í•˜ë‚˜ì˜ ë¡œìš°ë§Œ 반환하ë„ë¡ ì¿¼ë¦¬ë¥¼ 바꾸거나 LIMIT 1 ì˜µì…˜ì„ ì¶”ê°€í•˜ì„¸ìš”." -#: pl_exec.c:4373 +#: pl_exec.c:4434 #, c-format msgid "query has no destination for result data" msgstr "ì¿¼ë¦¬ì— ê²°ê³¼ ë°ì´í„°ì˜ 대ìƒì´ ì—†ìŒ" -#: pl_exec.c:4374 +#: pl_exec.c:4435 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "SELECTì˜ ê²°ê³¼ë¥¼ 취소하려면 대신 PERFORMì„ ì‚¬ìš©í•˜ì‹­ì‹œì˜¤." -#: pl_exec.c:4407 pl_exec.c:8729 -#, c-format -msgid "query string argument of EXECUTE is null" -msgstr "EXECUTEì˜ ì¿¼ë¦¬ 문ìžì—´ ì¸ìˆ˜ê°€ nullìž„" - -#: pl_exec.c:4463 +#: pl_exec.c:4524 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "SELECTì˜ EXECUTE... INTOê°€ 구현ë˜ì§€ 않ìŒ" -#: pl_exec.c:4464 +#: pl_exec.c:4525 #, c-format msgid "" "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS " "instead." msgstr "EXECUTE ... INTO ë˜ëŠ” EXECUTE CREATE TABLE ... AS êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: pl_exec.c:4477 +#: pl_exec.c:4538 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "트랜잭션 ëª…ë ¹ë“¤ì˜ EXECUTE ê¸°ëŠ¥ì€ êµ¬í˜„ë˜ì§€ 않았ìŒ" -#: pl_exec.c:4778 pl_exec.c:4866 +#: pl_exec.c:4848 pl_exec.c:4936 #, c-format msgid "cursor variable \"%s\" is null" msgstr "커서 변수 \"%s\"ì´(ê°€) nullìž„" -#: pl_exec.c:4789 pl_exec.c:4877 +#: pl_exec.c:4859 pl_exec.c:4947 #, c-format msgid "cursor \"%s\" does not exist" msgstr "\"%s\" ì´ë¦„ì˜ ì»¤ì„œê°€ ì—†ìŒ" -#: pl_exec.c:4802 +#: pl_exec.c:4872 #, c-format msgid "relative or absolute cursor position is null" msgstr "ìƒëŒ€ ë˜ëŠ” 절대 커서 위치가 nullìž„" -#: pl_exec.c:5068 pl_exec.c:5163 +#: pl_exec.c:5110 pl_exec.c:5205 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "NOT NULLì´ ì„ ì–¸ëœ \"%s\" ë³€ìˆ˜ì— null ê°’ì„ í• ë‹¹í•  수 ì—†ìŒ" -#: pl_exec.c:5144 +#: pl_exec.c:5186 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "í–‰ ë³€ìˆ˜ì— ë¹„ë³µí•© ê°’ì„ í• ë‹¹í•  수 ì—†ìŒ" -#: pl_exec.c:5176 +#: pl_exec.c:5218 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "레코드 ë³€ìˆ˜ì— ë¹„ë³µí•© ê°’ì„ í• ë‹¹í•  수 ì—†ìŒ" -#: pl_exec.c:5227 +#: pl_exec.c:5269 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "시스템 ì—´ \"%s\"ì— í• ë‹¹í•  수 없습니다." -#: pl_exec.c:5291 -#, c-format -msgid "number of array dimensions (%d) exceeds the maximum allowed (%d)" -msgstr "지정한 ë°°ì—´ í¬ê¸°(%d)ê°€ 최대치(%d)를 초과했습니다" - -#: pl_exec.c:5323 -#, c-format -msgid "subscripted object is not an array" -msgstr "하위 스í¬ë¦½íЏ 개체는 ë°°ì—´ì´ ì•„ë‹˜" - -#: pl_exec.c:5361 +#: pl_exec.c:5718 #, c-format -msgid "array subscript in assignment must not be null" -msgstr "ë°°ì—´ 하위 스í¬ë¦½íŠ¸ë¡œ 지정하는 값으로 null ê°’ì„ ì‚¬ìš©í•  수 없습니다" +msgid "query did not return data" +msgstr "쿼리 실행 ê²°ê³¼ ìžë£Œê°€ ì—†ìŒ" -#: pl_exec.c:5868 +#: pl_exec.c:5719 pl_exec.c:5731 pl_exec.c:5756 pl_exec.c:5832 pl_exec.c:5837 #, c-format -msgid "query \"%s\" did not return data" -msgstr "\"%s\" 쿼리ì—서 ë°ì´í„°ë¥¼ 반환하지 않ìŒ" +msgid "query: %s" +msgstr "쿼리: %s" -#: pl_exec.c:5876 +#: pl_exec.c:5727 #, c-format -msgid "query \"%s\" returned %d column" -msgid_plural "query \"%s\" returned %d columns" -msgstr[0] "\"%s\" 쿼리가 %d ê°œì˜ ì¹¼ëŸ¼ì„ ë°˜í™˜í•¨" +msgid "query returned %d column" +msgid_plural "query returned %d columns" +msgstr[0] "쿼리가 %d ê°œì˜ ì¹¼ëŸ¼ì„ ë°˜í™˜í•¨" -#: pl_exec.c:5904 +#: pl_exec.c:5831 #, c-format -msgid "query \"%s\" returned more than one row" -msgstr "\"%s\" 쿼리ì—서 ë‘ ê°œ ì´ìƒì˜ í–‰ì„ ë°˜í™˜í•¨" +msgid "query is SELECT INTO, but it should be plain SELECT" +msgstr "쿼리는 SELECT INTO ì´ì§€ë§Œ, ì¼ë°˜ SELECT 구문ì´ì–´ì•¼ 함" -#: pl_exec.c:5967 +#: pl_exec.c:5836 #, c-format -msgid "query \"%s\" is not a SELECT" -msgstr "\"%s\" 쿼리가 SELECTê°€ 아님" +msgid "query is not a SELECT" +msgstr "SELECT 쿼리가 아님" -#: pl_exec.c:6763 pl_exec.c:6803 pl_exec.c:6843 +#: pl_exec.c:6650 pl_exec.c:6690 pl_exec.c:6730 #, c-format msgid "" "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "" "%d번째 매개 ë³€ìˆ˜ì˜ ìžë£Œí˜•(%s)ì´ ë¯¸ë¦¬ ì¤€ë¹„ëœ ì‹¤í–‰ê³„íšì˜ ìžë£Œí˜•(%s)ê³¼ 다릅니다" -#: pl_exec.c:7254 pl_exec.c:7288 pl_exec.c:7362 pl_exec.c:7388 +#: pl_exec.c:7141 pl_exec.c:7175 pl_exec.c:7249 pl_exec.c:7275 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "ì›ë³¸ê³¼ ëŒ€ìƒ í•„ë“œ 수가 같지 않습니다." #. translator: %s represents a name of an extra check -#: pl_exec.c:7256 pl_exec.c:7290 pl_exec.c:7364 pl_exec.c:7390 +#: pl_exec.c:7143 pl_exec.c:7177 pl_exec.c:7251 pl_exec.c:7277 #, c-format msgid "%s check of %s is active." msgstr "%s 검사(해당 변수ì´ë¦„: %s)ê°€ 활성화 ë˜ì–´ìžˆìŠµë‹ˆë‹¤." -#: pl_exec.c:7260 pl_exec.c:7294 pl_exec.c:7368 pl_exec.c:7394 +#: pl_exec.c:7147 pl_exec.c:7181 pl_exec.c:7255 pl_exec.c:7281 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "쿼리 결과가 정확한 칼럼 목ë¡ì„ 반환하ë„ë¡ ìˆ˜ì •í•˜ì„¸ìš”." -#: pl_exec.c:7781 +#: pl_exec.c:7668 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "\"%s\" 레코드가 ì•„ì§ í• ë‹¹ë˜ì§€ 않ìŒ" -#: pl_exec.c:7782 +#: pl_exec.c:7669 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "ì•„ì§ í• ë‹¹ë˜ì§€ ì•Šì€ ë ˆì½”ë“œì˜ íŠœí”Œ 구조는 미정입니다." +#: pl_exec.c:8357 pl_gram.y:3498 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "\"%s\" 변수는 CONSTANT로 ì„ ì–¸ë¨" + #: pl_funcs.c:237 msgid "statement block" msgstr "문 블ë¡" @@ -552,55 +572,50 @@ msgstr "SQL 문" msgid "FOR over EXECUTE statement" msgstr "EXECUTE ë¬¸ì„ ì œì–´í•˜ëŠ” FOR" -#: pl_gram.y:489 +#: pl_gram.y:485 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "ë¸”ë¡ ë¼ë²¨ì€ DECLARE ì˜ì—­ ì•žì— ìžˆì–´ì•¼ 함" -#: pl_gram.y:509 +#: pl_gram.y:505 #, c-format msgid "collations are not supported by type %s" msgstr "%s ìžë£Œí˜•ì€ collation ì§€ì› ì•ˆí•¨" -#: pl_gram.y:528 +#: pl_gram.y:524 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "\"%s\" 변수는 NOT NULL ì„¤ì •ì´ ìžˆì–´ ê¸°ë³¸ê°’ì„ ê°€ì ¸ì•¼ 합니다" -#: pl_gram.y:675 pl_gram.y:690 pl_gram.y:716 -#, c-format -msgid "variable \"%s\" does not exist" -msgstr "\"%s\" 변수가 ì—†ìŒ" - -#: pl_gram.y:734 pl_gram.y:762 +#: pl_gram.y:704 pl_gram.y:732 msgid "duplicate declaration" msgstr "중복 ì„ ì–¸" -#: pl_gram.y:745 pl_gram.y:773 +#: pl_gram.y:715 pl_gram.y:743 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "variable \"%s\" shadows a previously defined variable" -#: pl_gram.y:993 +#: pl_gram.y:1017 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "GET STACKED DIAGNOSTICS ì—서 %s í•­ëª©ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: pl_gram.y:1011 +#: pl_gram.y:1035 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "GET CURRENT DIAGNOSTICS ì—서 %s í•­ëª©ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: pl_gram.y:1106 +#: pl_gram.y:1133 msgid "unrecognized GET DIAGNOSTICS item" msgstr "알 수 없는 GET DIAGNOSTICS 항목" -#: pl_gram.y:1116 pl_gram.y:3553 +#: pl_gram.y:1149 pl_gram.y:3614 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\"ì€(는) ìŠ¤ì¹¼ë¼ ë³€ìˆ˜ê°€ 아님" -#: pl_gram.y:1370 pl_gram.y:1567 +#: pl_gram.y:1379 pl_gram.y:1572 #, c-format msgid "" "loop variable of loop over rows must be a record variable or list of scalar " @@ -608,229 +623,228 @@ msgid "" msgstr "" "í–‰ì— ìžˆëŠ” ë£¨í”„ì˜ ë£¨í”„ 변수는 레코드 변수ì´ê±°ë‚˜ ìŠ¤ì¹¼ë¼ ë³€ìˆ˜ì˜ ëª©ë¡ì´ì–´ì•¼ 함" -#: pl_gram.y:1405 +#: pl_gram.y:1414 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "커서 FOR ë£¨í”„ì— ëŒ€ìƒ ë³€ìˆ˜ê°€ 한 개만 있어야 함" -#: pl_gram.y:1412 +#: pl_gram.y:1421 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "커서 FOR 루프는 ë°”ì¸ë”©ëœ 커서 변수를 한 개만 사용해야 함" -#: pl_gram.y:1499 +#: pl_gram.y:1511 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "정수 FOR ë£¨í”„ì— ëŒ€ìƒ ë³€ìˆ˜ê°€ 한 개만 있어야 함" -#: pl_gram.y:1537 +#: pl_gram.y:1545 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "쿼리 FOR ë£¨í”„ì— REVERSE를 지정할 수 ì—†ìŒ" -#: pl_gram.y:1670 +#: pl_gram.y:1675 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "FOREACHì˜ ë°˜ë³µ 변수는 알려진 변수ì´ê±°ë‚˜ ë³€ìˆ˜ì˜ ëª©ë¡ì´ì–´ì•¼ 함" -#: pl_gram.y:1712 +#: pl_gram.y:1717 #, c-format msgid "" "there is no label \"%s\" attached to any block or loop enclosing this " "statement" msgstr "ìž„ì˜ ë¸”ë¡ì´ë‚˜ 루프 êµ¬ë¬¸ì— í• ë‹¹ëœ \"%s\" ë¼ë²¨ì´ ì—†ìŒ" -#: pl_gram.y:1720 +#: pl_gram.y:1725 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "CONTINUE 안ì—서 \"%s\" ë¸”ë¡ ë¼ë²¨ì„ 사용할 수 ì—†ìŒ" -#: pl_gram.y:1735 +#: pl_gram.y:1740 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "루프 ì™¸ë¶€ì— ë¼ë²¨ 지정 ì—†ì´ EXIT 사용할 수 ì—†ìŒ" -#: pl_gram.y:1736 +#: pl_gram.y:1741 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE를 루프 ì™¸ë¶€ì— ì‚¬ìš©í•  수 ì—†ìŒ" -#: pl_gram.y:1760 pl_gram.y:1798 pl_gram.y:1846 pl_gram.y:2998 pl_gram.y:3083 -#: pl_gram.y:3194 pl_gram.y:3957 +#: pl_gram.y:1765 pl_gram.y:1803 pl_gram.y:1851 pl_gram.y:3061 pl_gram.y:3149 +#: pl_gram.y:3260 pl_gram.y:4009 msgid "unexpected end of function definition" msgstr "예기치 ì•Šì€ í•¨ìˆ˜ ì •ì˜ì˜ ë" -#: pl_gram.y:1866 pl_gram.y:1890 pl_gram.y:1906 pl_gram.y:1912 pl_gram.y:2031 -#: pl_gram.y:2039 pl_gram.y:2053 pl_gram.y:2148 pl_gram.y:2399 pl_gram.y:2493 -#: pl_gram.y:2652 pl_gram.y:3799 pl_gram.y:3860 pl_gram.y:3938 +#: pl_gram.y:1871 pl_gram.y:1895 pl_gram.y:1911 pl_gram.y:1917 pl_gram.y:2042 +#: pl_gram.y:2050 pl_gram.y:2064 pl_gram.y:2159 pl_gram.y:2383 pl_gram.y:2473 +#: pl_gram.y:2632 pl_gram.y:3856 pl_gram.y:3917 pl_gram.y:3990 msgid "syntax error" msgstr "구문 오류" -#: pl_gram.y:1894 pl_gram.y:1896 pl_gram.y:2403 pl_gram.y:2405 +#: pl_gram.y:1899 pl_gram.y:1901 pl_gram.y:2387 pl_gram.y:2389 msgid "invalid SQLSTATE code" msgstr "ìž˜ëª»ëœ SQLSTATE 코드" -#: pl_gram.y:2096 +#: pl_gram.y:2107 msgid "syntax error, expected \"FOR\"" msgstr "구문 오류, \"FOR\" í•„ìš”" -#: pl_gram.y:2157 +#: pl_gram.y:2168 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "FETCH êµ¬ë¬¸ì€ ë‹¤ì¤‘ 로우를 반환할 수 ì—†ìŒ" -#: pl_gram.y:2281 +#: pl_gram.y:2265 #, c-format msgid "cursor variable must be a simple variable" msgstr "커서 변수는 단순 변수여야 함" -#: pl_gram.y:2287 +#: pl_gram.y:2271 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "\"%s\" 변수는 커서 ë˜ëŠ” ref 커서 형ì‹ì´ì–´ì•¼ 함" -#: pl_gram.y:2623 pl_gram.y:2634 +#: pl_gram.y:2603 pl_gram.y:2614 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" (ì€)는 알려진 변수가 아님" -#: pl_gram.y:2738 pl_gram.y:2748 pl_gram.y:2903 +#: pl_gram.y:2719 pl_gram.y:2729 pl_gram.y:2911 msgid "mismatched parentheses" msgstr "ê´„í˜¸ì˜ ì§ì´ ë§žì§€ 않ìŒ" -#: pl_gram.y:2752 +#: pl_gram.y:2733 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "SQL ì‹ ëì— \"%s\" 누ë½" -#: pl_gram.y:2758 +#: pl_gram.y:2739 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "SQL 문 ëì— \"%s\" 누ë½" -#: pl_gram.y:2775 +#: pl_gram.y:2758 msgid "missing expression" msgstr "í‘œí˜„ì‹ ë¹ ì¡ŒìŒ" -#: pl_gram.y:2777 +#: pl_gram.y:2760 msgid "missing SQL statement" msgstr "SQL ë¬¸ì´ ë¹ ì¡ŒìŒ" -#: pl_gram.y:2905 +#: pl_gram.y:2889 +msgid "syntax error, expected \"]\"" +msgstr "구문 오류, \"]\" í•„ìš”" + +#: pl_gram.y:2913 msgid "incomplete data type declaration" msgstr "불완전한 ë°ì´í„° í˜•ì‹ ì„ ì–¸" -#: pl_gram.y:2928 +#: pl_gram.y:2936 msgid "missing data type declaration" msgstr "ë°ì´í„° í˜•ì‹ ì„ ì–¸ 누ë½" -#: pl_gram.y:3006 +#: pl_gram.y:3071 msgid "INTO specified more than once" msgstr "INTOê°€ 여러 번 지정ë¨" -#: pl_gram.y:3175 +#: pl_gram.y:3241 msgid "expected FROM or IN" msgstr "FROM ë˜ëŠ” IN í•„ìš”" -#: pl_gram.y:3236 +#: pl_gram.y:3302 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "ì§‘í•©ì„ ë°˜í™˜í•˜ëŠ” 함수ì—서 RETURN 구문ì—는 ì¸ìžê°€ ì—†ìŒ" -#: pl_gram.y:3237 +#: pl_gram.y:3303 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "RETURN NEXT 나 RETURN QUERY êµ¬ë¬¸ì„ ì‚¬ìš©í•˜ì„¸ìš”." -#: pl_gram.y:3247 +#: pl_gram.y:3313 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "프로시져ì—서는 RETURN ë¬¸ì˜ ë§¤ê°œ 변수를 사용할 수 ì—†ìŒ" -#: pl_gram.y:3252 +#: pl_gram.y:3318 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURNì€ void를 반환하는 í•¨ìˆ˜ì— ë§¤ê°œ 변수를 í¬í•¨í•  수 ì—†ìŒ" -#: pl_gram.y:3261 +#: pl_gram.y:3327 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURNì€ OUT 매개 변수가 있는 í•¨ìˆ˜ì— ë§¤ê°œ 변수를 í¬í•¨í•  수 ì—†ìŒ" -#: pl_gram.y:3324 +#: pl_gram.y:3390 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "RETURN NEXT는 OUT 매개 변수가 있는 í•¨ìˆ˜ì— ë§¤ê°œ 변수를 í¬í•¨í•  수 ì—†ìŒ" -#: pl_gram.y:3432 -#, c-format -msgid "variable \"%s\" is declared CONSTANT" -msgstr "\"%s\" 변수는 CONSTANT로 ì„ ì–¸ë¨" - -#: pl_gram.y:3495 +#: pl_gram.y:3556 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "다중 ì•„ì´í…œ INTO 목ë¡ì˜ 부분으로 record 변수가 ì‚¬ìš©ë  ìˆ˜ ì—†ìŒ" -#: pl_gram.y:3541 +#: pl_gram.y:3602 #, c-format msgid "too many INTO variables specified" msgstr "너무 ë§Žì€ INTO 변수가 지정ë¨" -#: pl_gram.y:3752 +#: pl_gram.y:3810 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "ë ˆì´ë¸”ì´ ì—†ëŠ” 블ë¡ì— ë ë ˆì´ë¸” \"%s\"ì´(ê°€) 지정ë¨" -#: pl_gram.y:3759 +#: pl_gram.y:3817 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "ë ë ˆì´ë¸” \"%s\"ì´(ê°€) 블ë¡ì˜ \"%s\" ë ˆì´ë¸”ê³¼ 다름" -#: pl_gram.y:3794 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "\"%s\" ì»¤ì„œì— ì¸ìˆ˜ê°€ ì—†ìŒ" -#: pl_gram.y:3808 +#: pl_gram.y:3865 #, c-format msgid "cursor \"%s\" has arguments" msgstr "\"%s\" ì»¤ì„œì— ì¸ìˆ˜ê°€ 있ìŒ" -#: pl_gram.y:3850 +#: pl_gram.y:3907 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "\"%s\" 커서는 \"%s\" ì´ë¦„ì˜ ì¸ìžê°€ ì—†ìŒ" -#: pl_gram.y:3870 +#: pl_gram.y:3927 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "\"%s\" ì´ë¦„ì˜ ì¸ìžê°€ \"%s\" 커서ì—서 중복ë¨" -#: pl_gram.y:3895 +#: pl_gram.y:3948 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "\"%s\" 커서를 위한 충분하지 ì•Šì€ ì¸ìž" -#: pl_gram.y:3902 +#: pl_gram.y:3955 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "\"%s\" 커서를 위한 ì¸ìžê°€ 너무 ë§ŽìŒ" -#: pl_gram.y:3989 +#: pl_gram.y:4041 msgid "unrecognized RAISE statement option" msgstr "ì¸ì‹í•  수 없는 RAISE 문 옵션" -#: pl_gram.y:3993 +#: pl_gram.y:4045 msgid "syntax error, expected \"=\"" msgstr "구문 오류, \"=\" í•„ìš”" -#: pl_gram.y:4034 +#: pl_gram.y:4086 #, c-format msgid "too many parameters specified for RAISE" msgstr "RAISEì— ì§€ì •ëœ ë§¤ê°œ 변수가 너무 ë§ŽìŒ" -#: pl_gram.y:4038 +#: pl_gram.y:4090 #, c-format msgid "too few parameters specified for RAISE" msgstr "RAISEì— ì§€ì •ëœ ë§¤ê°œ 변수가 너무 ì ìŒ" @@ -863,13 +877,13 @@ msgid "List of programming constructs that should produce an error." msgstr "오류로 처리할 í”„ë¡œê·¸ëž˜ë° ì»¨ìŠ¤íŠ¸ëŸ­íŠ¸ 목ë¡" #. translator: %s is typically the translation of "syntax error" -#: pl_scanner.c:508 +#: pl_scanner.c:525 #, c-format msgid "%s at end of input" msgstr "%s, ìž…ë ¥ ë부분" #. translator: first %s is typically the translation of "syntax error" -#: pl_scanner.c:524 +#: pl_scanner.c:541 #, c-format msgid "%s at or near \"%s\"" msgstr "%s, \"%s\" 부근" diff --git a/src/pl/plpgsql/src/po/meson.build b/src/pl/plpgsql/src/po/meson.build index aad875948b638..e9ec37ebc8c4b 100644 --- a/src/pl/plpgsql/src/po/meson.build +++ b/src/pl/plpgsql/src/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('plpgsql-' + pg_version_major.to_string())] diff --git a/src/pl/plpgsql/src/po/ru.po b/src/pl/plpgsql/src/po/ru.po index baaf07c579f7c..189087b1f1cb7 100644 --- a/src/pl/plpgsql/src/po/ru.po +++ b/src/pl/plpgsql/src/po/ru.po @@ -1,50 +1,50 @@ # Russian message translation file for plpgsql # Copyright (C) 2012-2016 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022. +# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2024. msgid "" msgstr "" "Project-Id-Version: plpgsql (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-09-29 10:17+0300\n" -"PO-Revision-Date: 2022-09-05 13:38+0300\n" +"POT-Creation-Date: 2025-05-03 16:06+0300\n" +"PO-Revision-Date: 2024-09-04 20:00+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -#: pl_comp.c:438 pl_handler.c:496 +#: pl_comp.c:434 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "функции PL/pgSQL не могут принимать тип %s" -#: pl_comp.c:530 +#: pl_comp.c:526 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "" -"не удалоÑÑŒ определить фактичеÑкий тип результата Ð´Ð»Ñ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾Ñ€Ñ„Ð½Ð¾Ð¹ функции \"%s" -"\"" +"не удалоÑÑŒ определить фактичеÑкий тип результата Ð´Ð»Ñ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾Ñ€Ñ„Ð½Ð¾Ð¹ функции " +"\"%s\"" -#: pl_comp.c:560 +#: pl_comp.c:556 #, c-format msgid "trigger functions can only be called as triggers" msgstr "триггерные функции могут вызыватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в триггерах" -#: pl_comp.c:564 pl_handler.c:480 +#: pl_comp.c:560 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "функции PL/pgSQL не могут возвращать тип %s" -#: pl_comp.c:604 +#: pl_comp.c:600 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "у триггерных функций не может быть объÑвленных аргументов" -#: pl_comp.c:605 +#: pl_comp.c:601 #, c-format msgid "" "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV " @@ -53,126 +53,141 @@ msgstr "" "При необходимоÑти к аргументам триггера можно обращатьÑÑ Ñ‡ÐµÑ€ÐµÐ· переменные " "TG_NARGS и TG_ARGV." -#: pl_comp.c:738 +#: pl_comp.c:734 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "у функций Ñобытийных триггеров не может быть объÑвленных аргументов" -#: pl_comp.c:1002 +#: pl_comp.c:998 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "компилÑÑ†Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ PL/pgSQL \"%s\" в районе Ñтроки %d" -#: pl_comp.c:1025 +#: pl_comp.c:1021 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\" указано неоднократно" -#: pl_comp.c:1139 +#: pl_comp.c:1135 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "Ð½ÐµÐ¾Ð´Ð½Ð¾Ð·Ð½Ð°Ñ‡Ð½Ð°Ñ ÑÑылка на Ñтолбец \"%s\"" -#: pl_comp.c:1141 +#: pl_comp.c:1137 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "ПодразумеваетÑÑ ÑÑылка на переменную PL/pgSQL или Ñтолбец таблицы." -#: pl_comp.c:1324 pl_exec.c:5234 pl_exec.c:5407 pl_exec.c:5494 pl_exec.c:5585 -#: pl_exec.c:6606 +#: pl_comp.c:1314 pl_exec.c:5260 pl_exec.c:5433 pl_exec.c:5520 pl_exec.c:5611 +#: pl_exec.c:6636 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "в запиÑи \"%s\" нет Ð¿Ð¾Ð»Ñ \"%s\"" -#: pl_comp.c:1818 +#: pl_comp.c:1633 pl_gram.y:645 pl_gram.y:660 pl_gram.y:686 +#, c-format +msgid "variable \"%s\" does not exist" +msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\" не ÑущеÑтвует" + +#: pl_comp.c:1722 +#, c-format +msgid "column \"%s\" of relation \"%s\" does not exist" +msgstr "Ñтолбец \"%s\" в таблице \"%s\" не ÑущеÑтвует" + +#: pl_comp.c:1775 #, c-format msgid "relation \"%s\" does not exist" msgstr "отношение \"%s\" не ÑущеÑтвует" -#: pl_comp.c:1825 pl_comp.c:1867 +#: pl_comp.c:1782 pl_comp.c:1820 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "отношение \"%s\" не имеет ÑоÑтавного типа" -#: pl_comp.c:1933 +#: pl_comp.c:1886 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\" имеет пÑевдотип %s" -#: pl_comp.c:2122 +#: pl_comp.c:2075 #, c-format msgid "type \"%s\" is only a shell" msgstr "тип \"%s\" ÑвлÑетÑÑ Ð¿ÑƒÑтышкой" -#: pl_comp.c:2204 pl_exec.c:6907 +#: pl_comp.c:2157 pl_exec.c:6937 #, c-format msgid "type %s is not composite" msgstr "тип %s не ÑвлÑетÑÑ ÑоÑтавным" -#: pl_comp.c:2252 pl_comp.c:2305 +#: pl_comp.c:2193 +#, c-format +msgid "could not find array type for data type %s" +msgstr "тип маÑÑива Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ð° данных %s не найден" + +#: pl_comp.c:2232 pl_comp.c:2285 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "нераÑпознанное уÑловие иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ \"%s\"" -#: pl_comp.c:2534 +#: pl_comp.c:2514 #, c-format msgid "" "could not determine actual argument type for polymorphic function \"%s\"" msgstr "" -"не удалоÑÑŒ определить фактичеÑкий тип аргумента Ð´Ð»Ñ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾Ñ€Ñ„Ð½Ð¾Ð¹ функции \"%s" -"\"" +"не удалоÑÑŒ определить фактичеÑкий тип аргумента Ð´Ð»Ñ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾Ñ€Ñ„Ð½Ð¾Ð¹ функции " +"\"%s\"" -#: pl_exec.c:501 pl_exec.c:940 pl_exec.c:1175 +#: pl_exec.c:512 pl_exec.c:951 pl_exec.c:1186 msgid "during initialization of execution state" msgstr "в процеÑÑе инициализации ÑоÑтоÑÐ½Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ" -#: pl_exec.c:507 +#: pl_exec.c:518 msgid "while storing call arguments into local variables" msgstr "при Ñохранении аргументов вызова в локальных переменных" -#: pl_exec.c:595 pl_exec.c:1013 +#: pl_exec.c:606 pl_exec.c:1024 msgid "during function entry" msgstr "при входе в функцию" -#: pl_exec.c:618 +#: pl_exec.c:629 #, c-format msgid "control reached end of function without RETURN" msgstr "конец функции доÑтигнут без RETURN" -#: pl_exec.c:624 +#: pl_exec.c:635 msgid "while casting return value to function's return type" msgstr "при приведении возвращаемого Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ðº типу результата функции" -#: pl_exec.c:636 pl_exec.c:3665 +#: pl_exec.c:647 pl_exec.c:3683 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "функциÑ, Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтво, вызвана в контекÑте, где ему нет меÑта" -#: pl_exec.c:641 pl_exec.c:3671 +#: pl_exec.c:652 pl_exec.c:3689 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "требуетÑÑ Ñ€ÐµÐ¶Ð¸Ð¼ материализации, но он недопуÑтим в Ñтом контекÑте" -#: pl_exec.c:768 pl_exec.c:1039 pl_exec.c:1197 +#: pl_exec.c:779 pl_exec.c:1050 pl_exec.c:1208 msgid "during function exit" msgstr "при выходе из функции" -#: pl_exec.c:823 pl_exec.c:887 pl_exec.c:3464 +#: pl_exec.c:834 pl_exec.c:898 pl_exec.c:3482 msgid "returned record type does not match expected record type" msgstr "возвращаемый тип запиÑи не ÑоответÑтвует ожидаемому" -#: pl_exec.c:1036 pl_exec.c:1194 +#: pl_exec.c:1047 pl_exec.c:1205 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "конец триггерной процедуры доÑтигнут без RETURN" -#: pl_exec.c:1044 +#: pl_exec.c:1055 #, c-format msgid "trigger procedure cannot return a set" msgstr "Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð½Ð°Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð° не может возвращать множеÑтво" -#: pl_exec.c:1083 pl_exec.c:1111 +#: pl_exec.c:1094 pl_exec.c:1122 msgid "" "returned row structure does not match the structure of the triggering table" msgstr "" @@ -182,7 +197,7 @@ msgstr "" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1252 +#: pl_exec.c:1263 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ PL/pgSQL %s, Ñтрока %d, %s" @@ -190,39 +205,39 @@ msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ PL/pgSQL %s, Ñтрока %d, %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1263 +#: pl_exec.c:1274 #, c-format msgid "PL/pgSQL function %s %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ PL/pgSQL %s, %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1271 +#: pl_exec.c:1282 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ PL/pgSQL %s, Ñтрока %d, оператор %s" -#: pl_exec.c:1277 +#: pl_exec.c:1288 #, c-format msgid "PL/pgSQL function %s" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ PL/pgSQL %s" -#: pl_exec.c:1648 +#: pl_exec.c:1659 msgid "during statement block local variable initialization" msgstr "при инициализации локальной переменной в блоке операторов" -#: pl_exec.c:1753 +#: pl_exec.c:1764 msgid "during statement block entry" msgstr "при входе в блок операторов" -#: pl_exec.c:1785 +#: pl_exec.c:1796 msgid "during statement block exit" msgstr "при выходе из блока операторов" -#: pl_exec.c:1823 +#: pl_exec.c:1834 msgid "during exception cleanup" msgstr "при очиÑтке поÑле иÑключениÑ" -#: pl_exec.c:2360 +#: pl_exec.c:2370 #, c-format msgid "" "procedure parameter \"%s\" is an output parameter but corresponding argument " @@ -231,7 +246,7 @@ msgstr "" "параметр процедуры \"%s\" ÑвлÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ð¼, но ÑоответÑтвующий аргумент не " "допуÑкает запиÑÑŒ" -#: pl_exec.c:2365 +#: pl_exec.c:2375 #, c-format msgid "" "procedure parameter %d is an output parameter but corresponding argument is " @@ -240,199 +255,199 @@ msgstr "" "параметр процедуры %d ÑвлÑетÑÑ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ð¼, но ÑоответÑтвующий аргумент не " "допуÑкает запиÑÑŒ" -#: pl_exec.c:2399 +#: pl_exec.c:2411 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "" "GET STACKED DIAGNOSTICS Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать вне блока обработчика иÑключениÑ" -#: pl_exec.c:2599 +#: pl_exec.c:2617 #, c-format msgid "case not found" msgstr "неправильный CASE" -#: pl_exec.c:2600 +#: pl_exec.c:2618 #, c-format msgid "CASE statement is missing ELSE part." msgstr "Ð’ операторе CASE не хватает чаÑти ELSE." -#: pl_exec.c:2693 +#: pl_exec.c:2711 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "нижнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° цикла FOR не может быть равна NULL" -#: pl_exec.c:2709 +#: pl_exec.c:2727 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "верхнÑÑ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ð° цикла FOR не может быть равна NULL" -#: pl_exec.c:2727 +#: pl_exec.c:2745 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "значение BY в цикле FOR не может быть равно NULL" -#: pl_exec.c:2733 +#: pl_exec.c:2751 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "значение BY в цикле FOR должно быть больше нулÑ" -#: pl_exec.c:2867 pl_exec.c:4667 +#: pl_exec.c:2885 pl_exec.c:4693 #, c-format msgid "cursor \"%s\" already in use" msgstr "курÑор \"%s\" уже иÑпользуетÑÑ" -#: pl_exec.c:2890 pl_exec.c:4737 +#: pl_exec.c:2908 pl_exec.c:4763 #, c-format msgid "arguments given for cursor without arguments" msgstr "курÑору без аргументов были переданы аргументы" -#: pl_exec.c:2909 pl_exec.c:4756 +#: pl_exec.c:2927 pl_exec.c:4782 #, c-format msgid "arguments required for cursor" msgstr "курÑору требуютÑÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñ‹" -#: pl_exec.c:3000 +#: pl_exec.c:3018 #, c-format msgid "FOREACH expression must not be null" msgstr "выражение FOREACH не может быть равно NULL" -#: pl_exec.c:3015 +#: pl_exec.c:3033 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "выражение в FOREACH должно быть маÑÑивом, но не типом %s" -#: pl_exec.c:3032 +#: pl_exec.c:3050 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "размерноÑть Ñреза (%d) вне допуÑтимого диапазона 0..%d" -#: pl_exec.c:3059 +#: pl_exec.c:3077 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñ†Ð¸ÐºÐ»Ð° FOREACH ... SLICE должна быть маÑÑивом" -#: pl_exec.c:3063 +#: pl_exec.c:3081 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñ†Ð¸ÐºÐ»Ð° FOREACH не должна быть маÑÑивом" -#: pl_exec.c:3225 pl_exec.c:3282 pl_exec.c:3457 +#: pl_exec.c:3243 pl_exec.c:3300 pl_exec.c:3475 #, c-format msgid "" "cannot return non-composite value from function returning composite type" msgstr "" "функциÑ, Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ ÑоÑтавной тип, не может вернуть неÑоÑтавное значение" -#: pl_exec.c:3321 pl_gram.y:3319 +#: pl_exec.c:3339 pl_gram.y:3375 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "" "RETURN NEXT можно иÑпользовать только в функциÑÑ…, возвращающих множеÑтва" -#: pl_exec.c:3362 pl_exec.c:3494 +#: pl_exec.c:3380 pl_exec.c:3512 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "в RETURN NEXT передан неправильный тип результата" -#: pl_exec.c:3400 pl_exec.c:3421 +#: pl_exec.c:3418 pl_exec.c:3439 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "в RETURN NEXT передан неправильный тип запиÑи" -#: pl_exec.c:3513 +#: pl_exec.c:3531 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "у оператора RETURN NEXT должен быть параметр" -#: pl_exec.c:3541 pl_gram.y:3383 +#: pl_exec.c:3559 pl_gram.y:3439 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "" "RETURN QUERY можно иÑпользовать только в функциÑÑ…, возвращающих множеÑтва" -#: pl_exec.c:3559 +#: pl_exec.c:3577 msgid "structure of query does not match function result type" msgstr "Ñтруктура запроÑа не ÑоответÑтвует типу результата функции" -#: pl_exec.c:3614 pl_exec.c:4444 pl_exec.c:8685 +#: pl_exec.c:3632 pl_exec.c:4469 pl_exec.c:8761 #, c-format msgid "query string argument of EXECUTE is null" msgstr "в качеÑтве текÑта запроÑа в EXECUTE передан NULL" -#: pl_exec.c:3699 pl_exec.c:3837 +#: pl_exec.c:3717 pl_exec.c:3855 #, c-format msgid "RAISE option already specified: %s" msgstr "Ñтот параметр RAISE уже указан: %s" -#: pl_exec.c:3733 +#: pl_exec.c:3751 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "" "RAISE без параметров Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать вне блока обработчика иÑключениÑ" -#: pl_exec.c:3827 +#: pl_exec.c:3845 #, c-format msgid "RAISE statement option cannot be null" msgstr "параметром оператора RAISE не может быть NULL" -#: pl_exec.c:3897 +#: pl_exec.c:3915 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3952 +#: pl_exec.c:3970 #, c-format msgid "assertion failed" msgstr "нарушение иÑтинноÑти" -#: pl_exec.c:4317 pl_exec.c:4506 +#: pl_exec.c:4342 pl_exec.c:4532 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "в PL/pgSQL Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ COPY Ñ ÑƒÑ‡Ð°Ñтием клиента" -#: pl_exec.c:4323 +#: pl_exec.c:4348 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° в PL/pgSQL" -#: pl_exec.c:4346 pl_exec.c:4535 +#: pl_exec.c:4371 pl_exec.c:4561 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ не может возвращать данные" -#: pl_exec.c:4369 pl_exec.c:4558 +#: pl_exec.c:4394 pl_exec.c:4584 #, c-format msgid "query returned no rows" msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ вернул Ñтрок" -#: pl_exec.c:4391 pl_exec.c:4577 pl_exec.c:5729 +#: pl_exec.c:4416 pl_exec.c:4603 pl_exec.c:5755 #, c-format msgid "query returned more than one row" msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» неÑколько Ñтрок" -#: pl_exec.c:4393 +#: pl_exec.c:4418 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "" "Измените запроÑ, чтобы он выбирал одну Ñтроку, или иÑпользуйте LIMIT 1." -#: pl_exec.c:4409 +#: pl_exec.c:4434 #, c-format msgid "query has no destination for result data" msgstr "в запроÑе нет Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… результата" -#: pl_exec.c:4410 +#: pl_exec.c:4435 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "ЕÑли вам нужно отброÑить результаты SELECT, иÑпользуйте PERFORM." -#: pl_exec.c:4498 +#: pl_exec.c:4524 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "возможноÑть Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ SELECT ... INTO в EXECUTE не реализована" # skip-rule: space-before-ellipsis -#: pl_exec.c:4499 +#: pl_exec.c:4525 #, c-format msgid "" "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS " @@ -441,57 +456,57 @@ msgstr "" "Ðльтернативой может Ñтать EXECUTE ... INTO или EXECUTE CREATE TABLE ... " "AS ..." -#: pl_exec.c:4512 +#: pl_exec.c:4538 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¾Ð½Ð½Ñ‹Ð¼Ð¸ командами не поддерживаетÑÑ" -#: pl_exec.c:4822 pl_exec.c:4910 +#: pl_exec.c:4848 pl_exec.c:4936 #, c-format msgid "cursor variable \"%s\" is null" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÐºÑƒÑ€Ñора \"%s\" равна NULL" -#: pl_exec.c:4833 pl_exec.c:4921 +#: pl_exec.c:4859 pl_exec.c:4947 #, c-format msgid "cursor \"%s\" does not exist" msgstr "курÑор \"%s\" не ÑущеÑтвует" -#: pl_exec.c:4846 +#: pl_exec.c:4872 #, c-format msgid "relative or absolute cursor position is null" msgstr "отноÑÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð»Ð¸ абÑÐ¾Ð»ÑŽÑ‚Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ ÐºÑƒÑ€Ñора равна NULL" -#: pl_exec.c:5084 pl_exec.c:5179 +#: pl_exec.c:5110 pl_exec.c:5205 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "значение NULL Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€Ð¸Ñвоить переменной \"%s\", объÑвленной NOT NULL" -#: pl_exec.c:5160 +#: pl_exec.c:5186 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "переменной типа кортеж можно приÑвоить только ÑоÑтавное значение" -#: pl_exec.c:5192 +#: pl_exec.c:5218 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "переменной типа запиÑÑŒ можно приÑвоить только ÑоÑтавное значение" -#: pl_exec.c:5243 +#: pl_exec.c:5269 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "приÑвоить значение ÑиÑтемному Ñтолбцу \"%s\" нельзÑ" -#: pl_exec.c:5692 +#: pl_exec.c:5718 #, c-format msgid "query did not return data" msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ вернул данные" -#: pl_exec.c:5693 pl_exec.c:5705 pl_exec.c:5730 pl_exec.c:5806 pl_exec.c:5811 +#: pl_exec.c:5719 pl_exec.c:5731 pl_exec.c:5756 pl_exec.c:5832 pl_exec.c:5837 #, c-format msgid "query: %s" msgstr "запроÑ: %s" -#: pl_exec.c:5701 +#: pl_exec.c:5727 #, c-format msgid "query returned %d column" msgid_plural "query returned %d columns" @@ -499,17 +514,17 @@ msgstr[0] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d Ñтолбец" msgstr[1] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d Ñтолбца" msgstr[2] "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð²ÐµÑ€Ð½ÑƒÐ» %d Ñтолбцов" -#: pl_exec.c:5805 +#: pl_exec.c:5831 #, c-format msgid "query is SELECT INTO, but it should be plain SELECT" msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ - не проÑто SELECT, а SELECT INTO" -#: pl_exec.c:5810 +#: pl_exec.c:5836 #, c-format msgid "query is not a SELECT" msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ - не SELECT" -#: pl_exec.c:6620 pl_exec.c:6660 pl_exec.c:6700 +#: pl_exec.c:6650 pl_exec.c:6690 pl_exec.c:6730 #, c-format msgid "" "type of parameter %d (%s) does not match that when preparing the plan (%s)" @@ -517,35 +532,35 @@ msgstr "" "тип параметра %d (%s) не ÑоответÑтвует тому, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ подготавливалÑÑ Ð¿Ð»Ð°Ð½ " "(%s)" -#: pl_exec.c:7111 pl_exec.c:7145 pl_exec.c:7219 pl_exec.c:7245 +#: pl_exec.c:7141 pl_exec.c:7175 pl_exec.c:7249 pl_exec.c:7275 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "в левой и правой чаÑти приÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ€Ð°Ð·Ð½Ð¾Ðµ количеÑтво полей" #. translator: %s represents a name of an extra check -#: pl_exec.c:7113 pl_exec.c:7147 pl_exec.c:7221 pl_exec.c:7247 +#: pl_exec.c:7143 pl_exec.c:7177 pl_exec.c:7251 pl_exec.c:7277 #, c-format msgid "%s check of %s is active." msgstr "Включена проверка %s (Ñ %s)." -#: pl_exec.c:7117 pl_exec.c:7151 pl_exec.c:7225 pl_exec.c:7251 +#: pl_exec.c:7147 pl_exec.c:7181 pl_exec.c:7255 pl_exec.c:7281 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "" "Измените запроÑ, чтобы он возвращал в точноÑти требуемый ÑпиÑок Ñтолбцов." -#: pl_exec.c:7638 +#: pl_exec.c:7668 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "запиÑи \"%s\" не приÑвоено значение" -#: pl_exec.c:7639 +#: pl_exec.c:7669 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "" "Ð”Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи, которой не приÑвоено значение, Ñтруктура кортежа не определена." -#: pl_exec.c:8283 pl_gram.y:3442 +#: pl_exec.c:8359 pl_gram.y:3498 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\" объÑвлена как CONSTANT" @@ -582,57 +597,52 @@ msgstr "SQL-оператор" msgid "FOR over EXECUTE statement" msgstr "FOR по результатам EXECUTE" -#: pl_gram.y:487 +#: pl_gram.y:485 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "метка блока должна помещатьÑÑ Ð´Ð¾ DECLARE, а не поÑле" -#: pl_gram.y:507 +#: pl_gram.y:505 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не поддерживает Ñортировку (COLLATION)" -#: pl_gram.y:526 +#: pl_gram.y:524 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "" "у переменной \"%s\" должно быть значение по умолчанию, так как она объÑвлена " "как NOT NULL" -#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 -#, c-format -msgid "variable \"%s\" does not exist" -msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\" не ÑущеÑтвует" - -#: pl_gram.y:733 pl_gram.y:761 +#: pl_gram.y:704 pl_gram.y:732 msgid "duplicate declaration" msgstr "повторÑющееÑÑ Ð¾Ð±ÑŠÑвление" -#: pl_gram.y:744 pl_gram.y:772 +#: pl_gram.y:715 pl_gram.y:743 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\" Ñкрывает ранее определённую переменную" -#: pl_gram.y:1044 +#: pl_gram.y:1017 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "команда GET STACKED DIAGNOSTICS не принимает Ñлемент %s" -#: pl_gram.y:1062 +#: pl_gram.y:1035 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "команда GET CURRENT DIAGNOSTICS не принимает Ñлемент %s" -#: pl_gram.y:1157 +#: pl_gram.y:1133 msgid "unrecognized GET DIAGNOSTICS item" msgstr "нераÑпознанный Ñлемент GET DIAGNOSTICS" -#: pl_gram.y:1173 pl_gram.y:3558 +#: pl_gram.y:1149 pl_gram.y:3614 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" - не ÑкалÑÑ€Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ" -#: pl_gram.y:1403 pl_gram.y:1597 +#: pl_gram.y:1379 pl_gram.y:1572 #, c-format msgid "" "loop variable of loop over rows must be a record variable or list of scalar " @@ -641,229 +651,233 @@ msgstr "" "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñ†Ð¸ÐºÐ»Ð° по кортежам должна быть переменной типа запиÑÑŒ или ÑпиÑком " "ÑкалÑрных переменных" -#: pl_gram.y:1438 +#: pl_gram.y:1414 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "в цикле FOR Ñ ÐºÑƒÑ€Ñором должна быть только одна переменнаÑ" -#: pl_gram.y:1445 +#: pl_gram.y:1421 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "" "в цикле FOR Ñ ÐºÑƒÑ€Ñором должен иÑпользоватьÑÑ ÐºÑƒÑ€Ñор, привÑзанный к запроÑу" -#: pl_gram.y:1536 +#: pl_gram.y:1511 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "в целочиÑленном цикле FOR должна быть только одна переменнаÑ" -#: pl_gram.y:1570 +#: pl_gram.y:1545 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "в цикле FOR Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ REVERSE" -#: pl_gram.y:1700 +#: pl_gram.y:1675 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "" "переменной цикла FOREACH должна быть извеÑÑ‚Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¸Ð»Ð¸ ÑпиÑок " "переменных" -#: pl_gram.y:1742 +#: pl_gram.y:1717 #, c-format msgid "" "there is no label \"%s\" attached to any block or loop enclosing this " "statement" msgstr "в блоке или цикле, окружающем Ñтот оператор, нет метки \"%s\"" -#: pl_gram.y:1750 +#: pl_gram.y:1725 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "метку блока \"%s\" Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в CONTINUE" -#: pl_gram.y:1765 +#: pl_gram.y:1740 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT можно иÑпользовать вне цикла только Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ метки" -#: pl_gram.y:1766 +#: pl_gram.y:1741 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать вне цикла" -#: pl_gram.y:1790 pl_gram.y:1828 pl_gram.y:1876 pl_gram.y:3005 pl_gram.y:3093 -#: pl_gram.y:3204 pl_gram.y:3957 +#: pl_gram.y:1765 pl_gram.y:1803 pl_gram.y:1851 pl_gram.y:3061 pl_gram.y:3149 +#: pl_gram.y:3260 pl_gram.y:4009 msgid "unexpected end of function definition" msgstr "неожиданный конец Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸" -#: pl_gram.y:1896 pl_gram.y:1920 pl_gram.y:1936 pl_gram.y:1942 pl_gram.y:2067 -#: pl_gram.y:2075 pl_gram.y:2089 pl_gram.y:2184 pl_gram.y:2408 pl_gram.y:2498 -#: pl_gram.y:2656 pl_gram.y:3800 pl_gram.y:3861 pl_gram.y:3938 +#: pl_gram.y:1871 pl_gram.y:1895 pl_gram.y:1911 pl_gram.y:1917 pl_gram.y:2042 +#: pl_gram.y:2050 pl_gram.y:2064 pl_gram.y:2159 pl_gram.y:2383 pl_gram.y:2473 +#: pl_gram.y:2632 pl_gram.y:3856 pl_gram.y:3917 pl_gram.y:3990 msgid "syntax error" msgstr "ошибка ÑинтакÑиÑа" -#: pl_gram.y:1924 pl_gram.y:1926 pl_gram.y:2412 pl_gram.y:2414 +#: pl_gram.y:1899 pl_gram.y:1901 pl_gram.y:2387 pl_gram.y:2389 msgid "invalid SQLSTATE code" msgstr "неверный код SQLSTATE" -#: pl_gram.y:2132 +#: pl_gram.y:2107 msgid "syntax error, expected \"FOR\"" msgstr "ошибка ÑинтакÑиÑа, ожидалÑÑ \"FOR\"" -#: pl_gram.y:2193 +#: pl_gram.y:2168 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "оператор FETCH не может вернуть неÑколько Ñтрок" -#: pl_gram.y:2290 +#: pl_gram.y:2265 #, c-format msgid "cursor variable must be a simple variable" msgstr "переменнаÑ-курÑор должна быть проÑтой переменной" -#: pl_gram.y:2296 +#: pl_gram.y:2271 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ \"%s\" должна быть типа cursor или refcursor" -#: pl_gram.y:2627 pl_gram.y:2638 +#: pl_gram.y:2603 pl_gram.y:2614 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" - не извеÑÑ‚Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ" -#: pl_gram.y:2744 pl_gram.y:2754 pl_gram.y:2910 +#: pl_gram.y:2719 pl_gram.y:2729 pl_gram.y:2911 msgid "mismatched parentheses" msgstr "непарные Ñкобки" -#: pl_gram.y:2758 +#: pl_gram.y:2733 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "отÑутÑтвует \"%s\" в конце Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ SQL" -#: pl_gram.y:2764 +#: pl_gram.y:2739 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "отÑутÑтвует \"%s\" в конце оператора SQL" -#: pl_gram.y:2781 +#: pl_gram.y:2758 msgid "missing expression" msgstr "отÑутÑтвует выражение" -#: pl_gram.y:2783 +#: pl_gram.y:2760 msgid "missing SQL statement" msgstr "отÑутÑтвует оператор SQL" -#: pl_gram.y:2912 +#: pl_gram.y:2889 +msgid "syntax error, expected \"]\"" +msgstr "ошибка ÑинтакÑиÑа, ожидалаÑÑŒ \"]\"" + +#: pl_gram.y:2913 msgid "incomplete data type declaration" msgstr "неполное определение типа данных" -#: pl_gram.y:2935 +#: pl_gram.y:2936 msgid "missing data type declaration" msgstr "отÑутÑтвует определение типа данных" -#: pl_gram.y:3015 +#: pl_gram.y:3071 msgid "INTO specified more than once" msgstr "INTO указано неоднократно" -#: pl_gram.y:3185 +#: pl_gram.y:3241 msgid "expected FROM or IN" msgstr "ожидалоÑÑŒ FROM или IN" -#: pl_gram.y:3246 +#: pl_gram.y:3302 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "в функции, возвращающей множеÑтво, RETURN должен быть без параметров" -#: pl_gram.y:3247 +#: pl_gram.y:3303 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "ИÑпользуйте RETURN NEXT или RETURN QUERY." -#: pl_gram.y:3257 +#: pl_gram.y:3313 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "в процедуре RETURN должен быть без параметров" -#: pl_gram.y:3262 +#: pl_gram.y:3318 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "в функции, не возвращающей ничего, RETURN не должен иметь параметров" -#: pl_gram.y:3271 +#: pl_gram.y:3327 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN должен быть без параметров в функции Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸ OUT" -#: pl_gram.y:3334 +#: pl_gram.y:3390 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "RETURN NEXT должен быть без параметров в функции Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸ OUT" -#: pl_gram.y:3500 +#: pl_gram.y:3556 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "" "Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñ‚Ð¸Ð¿Ð° запиÑÑŒ не может быть чаÑтью ÑпиÑка INTO Ñ Ð½ÐµÑколькими " "Ñлементами" -#: pl_gram.y:3546 +#: pl_gram.y:3602 #, c-format msgid "too many INTO variables specified" msgstr "указано Ñлишком много переменных INTO" -#: pl_gram.y:3754 +#: pl_gram.y:3810 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° \"%s\" указана Ð´Ð»Ñ Ð½ÐµÐ¿Ð¾Ð¼ÐµÑ‡ÐµÐ½Ð½Ð¾Ð³Ð¾ блока" -#: pl_gram.y:3761 +#: pl_gram.y:3817 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° \"%s\" отличаетÑÑ Ð¾Ñ‚ метки блока \"%s\"" -#: pl_gram.y:3795 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "курÑор \"%s\" не имеет аргументов" -#: pl_gram.y:3809 +#: pl_gram.y:3865 #, c-format msgid "cursor \"%s\" has arguments" msgstr "курÑор \"%s\" имеет аргументы" -#: pl_gram.y:3851 +#: pl_gram.y:3907 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "курÑор \"%s\" не имеет аргумента \"%s\"" -#: pl_gram.y:3871 +#: pl_gram.y:3927 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "значение параметра \"%s\" курÑора \"%s\" указано неоднократно" -#: pl_gram.y:3896 +#: pl_gram.y:3948 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "недоÑтаточно аргументов Ð´Ð»Ñ ÐºÑƒÑ€Ñора \"%s\"" -#: pl_gram.y:3903 +#: pl_gram.y:3955 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "Ñлишком много аргументов Ð´Ð»Ñ ÐºÑƒÑ€Ñора \"%s\"" -#: pl_gram.y:3989 +#: pl_gram.y:4041 msgid "unrecognized RAISE statement option" msgstr "нераÑпознанный параметр оператора RAISE" -#: pl_gram.y:3993 +#: pl_gram.y:4045 msgid "syntax error, expected \"=\"" msgstr "ошибка ÑинтакÑиÑа, ожидалоÑÑŒ \"=\"" -#: pl_gram.y:4034 +#: pl_gram.y:4086 #, c-format msgid "too many parameters specified for RAISE" msgstr "Ñлишком много параметров Ð´Ð»Ñ RAISE" -#: pl_gram.y:4038 +#: pl_gram.y:4090 #, c-format msgid "too few parameters specified for RAISE" msgstr "недоÑтаточно параметров Ð´Ð»Ñ RAISE" @@ -898,13 +912,13 @@ msgid "List of programming constructs that should produce an error." msgstr "СпиÑок программных конÑтрукций, которые должны выдавать ошибку." #. translator: %s is typically the translation of "syntax error" -#: pl_scanner.c:508 +#: pl_scanner.c:525 #, c-format msgid "%s at end of input" msgstr "%s в конце" #. translator: first %s is typically the translation of "syntax error" -#: pl_scanner.c:524 +#: pl_scanner.c:541 #, c-format msgid "%s at or near \"%s\"" msgstr "%s (примерное положение: \"%s\")" diff --git a/src/pl/plpgsql/src/po/sv.po b/src/pl/plpgsql/src/po/sv.po index 4ba613826a826..9f78dd5633e80 100644 --- a/src/pl/plpgsql/src/po/sv.po +++ b/src/pl/plpgsql/src/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for plpgsql # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-11 13:39+0000\n" -"PO-Revision-Date: 2023-03-09 22:40+0100\n" +"POT-Creation-Date: 2024-07-12 17:39+0000\n" +"PO-Revision-Date: 2024-07-12 22:07+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,159 +17,174 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: pl_comp.c:438 pl_handler.c:496 +#: pl_comp.c:434 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "PL/pgSQL-funktioner kan inte acceptera typ %s" -#: pl_comp.c:530 +#: pl_comp.c:526 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "kunde inte bestämma aktuell returtyp för polymorfisk funktion \"%s\"" -#: pl_comp.c:560 +#: pl_comp.c:556 #, c-format msgid "trigger functions can only be called as triggers" msgstr "triggerfunktioner kan bara anropas som triggrar" -#: pl_comp.c:564 pl_handler.c:480 +#: pl_comp.c:560 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "PL/pgSQL-funktioner kan inte returnera typ %s" -#: pl_comp.c:604 +#: pl_comp.c:600 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "triggerfunktioner kan inte ha deklarerade argument" -#: pl_comp.c:605 +#: pl_comp.c:601 #, c-format msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." msgstr "Argumenten till triggern kan accessas via TG_NARGS och TG_ARGV istället." -#: pl_comp.c:738 +#: pl_comp.c:734 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "händelsetriggerfunktioner kan inte ha deklarerade argument" -#: pl_comp.c:1002 +#: pl_comp.c:998 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "kompilering av PL/pgSQL-funktion \"%s\" nära rad %d" -#: pl_comp.c:1025 +#: pl_comp.c:1021 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "parameternamn \"%s\" angivet mer än en gÃ¥ng" -#: pl_comp.c:1139 +#: pl_comp.c:1135 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "kolumnreferens \"%s\" är tvetydig" -#: pl_comp.c:1141 +#: pl_comp.c:1137 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Det kan referera till antingen en PL/pgSQL-variabel eller en tabellkolumn." -#: pl_comp.c:1324 pl_exec.c:5216 pl_exec.c:5389 pl_exec.c:5476 pl_exec.c:5567 -#: pl_exec.c:6588 +#: pl_comp.c:1314 pl_exec.c:5258 pl_exec.c:5431 pl_exec.c:5518 pl_exec.c:5609 +#: pl_exec.c:6634 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "post \"%s\" saknar fält \"%s\"" -#: pl_comp.c:1818 +#: pl_comp.c:1633 pl_gram.y:645 pl_gram.y:660 pl_gram.y:686 +#, c-format +msgid "variable \"%s\" does not exist" +msgstr "variabel \"%s\" finns inte" + +#: pl_comp.c:1722 +#, c-format +msgid "column \"%s\" of relation \"%s\" does not exist" +msgstr "kolumn \"%s\" i relation \"%s\" existerar inte" + +#: pl_comp.c:1775 #, c-format msgid "relation \"%s\" does not exist" msgstr "relationen \"%s\" existerar inte" -#: pl_comp.c:1825 pl_comp.c:1867 +#: pl_comp.c:1782 pl_comp.c:1820 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "relationen \"%s\" har inte en composite-typ" -#: pl_comp.c:1933 +#: pl_comp.c:1886 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "variabel \"%s\" har pseudotyp %s" -#: pl_comp.c:2122 +#: pl_comp.c:2075 #, c-format msgid "type \"%s\" is only a shell" msgstr "typ \"%s\" är bara ett skal" -#: pl_comp.c:2204 pl_exec.c:6889 +#: pl_comp.c:2157 pl_exec.c:6935 #, c-format msgid "type %s is not composite" msgstr "typen %s är inte composite" -#: pl_comp.c:2252 pl_comp.c:2305 +#: pl_comp.c:2193 +#, c-format +msgid "could not find array type for data type %s" +msgstr "kunde inte hitta array-typ för datatyp %s" + +#: pl_comp.c:2232 pl_comp.c:2285 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "okänt avbrottsvillkor \"%s\"" -#: pl_comp.c:2526 +#: pl_comp.c:2514 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "kunde inte bestämma argumenttyp för polymorfisk funktion function \"%s\"" -#: pl_exec.c:500 pl_exec.c:939 pl_exec.c:1174 +#: pl_exec.c:512 pl_exec.c:951 pl_exec.c:1186 msgid "during initialization of execution state" msgstr "unde initiering av körtillstÃ¥nd" -#: pl_exec.c:506 +#: pl_exec.c:518 msgid "while storing call arguments into local variables" msgstr "under sparande av anropsargument till lokala variabler" -#: pl_exec.c:594 pl_exec.c:1012 +#: pl_exec.c:606 pl_exec.c:1024 msgid "during function entry" msgstr "under funktionsingÃ¥ngen" -#: pl_exec.c:617 +#: pl_exec.c:629 #, c-format msgid "control reached end of function without RETURN" msgstr "kontrollen nÃ¥dde slutet av funktionen utan RETURN" -#: pl_exec.c:623 +#: pl_exec.c:635 msgid "while casting return value to function's return type" msgstr "under typomvandling av returvärde till funktionens returtyp" -#: pl_exec.c:635 pl_exec.c:3656 +#: pl_exec.c:647 pl_exec.c:3682 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "en funktion som returnerar en mängd anropades i kontext som inte godtar en mängd" -#: pl_exec.c:640 pl_exec.c:3662 +#: pl_exec.c:652 pl_exec.c:3688 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "materialiserat läge krävs, men stöds inte i detta kontext" -#: pl_exec.c:767 pl_exec.c:1038 pl_exec.c:1196 +#: pl_exec.c:779 pl_exec.c:1050 pl_exec.c:1208 msgid "during function exit" msgstr "under funktionsavslutning" -#: pl_exec.c:822 pl_exec.c:886 pl_exec.c:3455 +#: pl_exec.c:834 pl_exec.c:898 pl_exec.c:3481 msgid "returned record type does not match expected record type" msgstr "returnerad posttyp matchar inte förväntad posttyp" -#: pl_exec.c:1035 pl_exec.c:1193 +#: pl_exec.c:1047 pl_exec.c:1205 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "programflödet nÃ¥dde slutet pÃ¥ triggerprocedur utan RETURN" -#: pl_exec.c:1043 +#: pl_exec.c:1055 #, c-format msgid "trigger procedure cannot return a set" msgstr "triggerprocedur kan inte returnera en mängd" -#: pl_exec.c:1082 pl_exec.c:1110 +#: pl_exec.c:1094 pl_exec.c:1122 msgid "returned row structure does not match the structure of the triggering table" msgstr "returnerad radstruktur matchar inte strukturen pÃ¥ triggad tabell" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1251 +#: pl_exec.c:1263 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "PL/pgSQL-funktion %s rad %d %s" @@ -177,335 +192,340 @@ msgstr "PL/pgSQL-funktion %s rad %d %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1262 +#: pl_exec.c:1274 #, c-format msgid "PL/pgSQL function %s %s" msgstr "PL/pgSQL-funktion %s %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1270 +#: pl_exec.c:1282 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "PL/pgSQL-funktion %s rad %d vid %s" -#: pl_exec.c:1276 +#: pl_exec.c:1288 #, c-format msgid "PL/pgSQL function %s" msgstr "PL/pgSQL-funktion %s" -#: pl_exec.c:1647 +#: pl_exec.c:1659 msgid "during statement block local variable initialization" msgstr "under initiering av lokala variabler i satsblock" -#: pl_exec.c:1752 +#: pl_exec.c:1764 msgid "during statement block entry" msgstr "under ingÃ¥ng till satsblock" -#: pl_exec.c:1784 +#: pl_exec.c:1796 msgid "during statement block exit" msgstr "under satsblockavslutning" -#: pl_exec.c:1822 +#: pl_exec.c:1834 msgid "during exception cleanup" msgstr "under avbrottsuppstädning" -#: pl_exec.c:2355 +#: pl_exec.c:2371 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" msgstr "procedurparameter \"%s\" är en utdataparameter men motsvarande argument är inte skrivbar" -#: pl_exec.c:2360 +#: pl_exec.c:2376 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "procedurparameter %d är en utdataparameter men motsvarande argument är inte skrivbar" -#: pl_exec.c:2394 +#: pl_exec.c:2410 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS kan inte användas utanför en avbrottshanterare" -#: pl_exec.c:2594 +#: pl_exec.c:2616 #, c-format msgid "case not found" msgstr "hittade inte alternativ" -#: pl_exec.c:2595 +#: pl_exec.c:2617 #, c-format msgid "CASE statement is missing ELSE part." msgstr "CASE-sats saknar ELSE-del." -#: pl_exec.c:2688 +#: pl_exec.c:2710 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "lägre gräns i FOR-loop kan inte vara null" -#: pl_exec.c:2704 +#: pl_exec.c:2726 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "övre gräns i FOR-loop kan inte vara null" -#: pl_exec.c:2722 +#: pl_exec.c:2744 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "BY-värde i FOR-loop kan inte vara null" -#: pl_exec.c:2728 +#: pl_exec.c:2750 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "BY-värde i FOR-loop mÃ¥ste vara större än noll" -#: pl_exec.c:2862 pl_exec.c:4658 +#: pl_exec.c:2884 pl_exec.c:4691 #, c-format msgid "cursor \"%s\" already in use" msgstr "markören \"%s\" används redan" -#: pl_exec.c:2885 pl_exec.c:4723 +#: pl_exec.c:2907 pl_exec.c:4761 #, c-format msgid "arguments given for cursor without arguments" msgstr "argument angivna till markör utan argumnet" -#: pl_exec.c:2904 pl_exec.c:4742 +#: pl_exec.c:2926 pl_exec.c:4780 #, c-format msgid "arguments required for cursor" msgstr "argument krävs för markör" -#: pl_exec.c:2991 +#: pl_exec.c:3017 #, c-format msgid "FOREACH expression must not be null" msgstr "FOREACH-uttryck fÃ¥r inte vara null" -#: pl_exec.c:3006 +#: pl_exec.c:3032 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "FOREACH-uttryck mÃ¥ste ge en array, inte typ %s" -#: pl_exec.c:3023 +#: pl_exec.c:3049 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "slice-storlek (%d) är utanför giltigt intervall 0..%d" -#: pl_exec.c:3050 +#: pl_exec.c:3076 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "FOREACH ... SLICE-loop-variabel mÃ¥ste ha typen array" -#: pl_exec.c:3054 +#: pl_exec.c:3080 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "FOREACH-loop-variable fÃ¥r inte ha typen array" -#: pl_exec.c:3216 pl_exec.c:3273 pl_exec.c:3448 +#: pl_exec.c:3242 pl_exec.c:3299 pl_exec.c:3474 #, c-format msgid "cannot return non-composite value from function returning composite type" msgstr "kan inte returnera icke-composit-värde frÃ¥n funktion med returtyp composit" -#: pl_exec.c:3312 pl_gram.y:3318 +#: pl_exec.c:3338 pl_gram.y:3375 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "kan inte använda RETURN NEXT i en icke-SETOF-funktion" -#: pl_exec.c:3353 pl_exec.c:3485 +#: pl_exec.c:3379 pl_exec.c:3511 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "fel resultattyp given i RETURN NEXT" -#: pl_exec.c:3391 pl_exec.c:3412 +#: pl_exec.c:3417 pl_exec.c:3438 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "fel posttyp given i RETURN NEXT" -#: pl_exec.c:3504 +#: pl_exec.c:3530 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT mÃ¥ste ha en parameter" -#: pl_exec.c:3532 pl_gram.y:3382 +#: pl_exec.c:3558 pl_gram.y:3439 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "kan inte använda RETURN QUERY i en icke-SETOF-funktion" -#: pl_exec.c:3550 +#: pl_exec.c:3576 msgid "structure of query does not match function result type" msgstr "strukturen pÃ¥ frÃ¥gan matchar inte funktionens resultattyp" -#: pl_exec.c:3605 pl_exec.c:4435 pl_exec.c:8630 +#: pl_exec.c:3631 pl_exec.c:4467 pl_exec.c:8757 #, c-format msgid "query string argument of EXECUTE is null" msgstr "frÃ¥gesträngargumentet till EXECUTE är null" -#: pl_exec.c:3690 pl_exec.c:3828 +#: pl_exec.c:3716 pl_exec.c:3854 #, c-format msgid "RAISE option already specified: %s" msgstr "RAISE-flagga redan angiven: %s" -#: pl_exec.c:3724 +#: pl_exec.c:3750 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE utan parametrar kan inte användas utanför en avbrottshanterare" -#: pl_exec.c:3818 +#: pl_exec.c:3844 #, c-format msgid "RAISE statement option cannot be null" msgstr "RAISE-satsens flagga fÃ¥r inte vare null" -#: pl_exec.c:3888 +#: pl_exec.c:3914 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3943 +#: pl_exec.c:3969 #, c-format msgid "assertion failed" msgstr "assert misslyckades" -#: pl_exec.c:4308 pl_exec.c:4497 +#: pl_exec.c:4340 pl_exec.c:4530 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "kan inte COPY till/frÃ¥n klient i PL/pgSQL" -#: pl_exec.c:4314 +#: pl_exec.c:4346 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "transaktionskommando saknar stöd i PL/pgSQL" -#: pl_exec.c:4337 pl_exec.c:4526 +#: pl_exec.c:4369 pl_exec.c:4559 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO använd med ett kommando som inte returnerar data" -#: pl_exec.c:4360 pl_exec.c:4549 +#: pl_exec.c:4392 pl_exec.c:4582 #, c-format msgid "query returned no rows" msgstr "frÃ¥gan returnerade inga rader" -#: pl_exec.c:4382 pl_exec.c:4568 pl_exec.c:5711 +#: pl_exec.c:4414 pl_exec.c:4601 pl_exec.c:5753 #, c-format msgid "query returned more than one row" msgstr "frÃ¥gan returnerade mer än en rad" -#: pl_exec.c:4384 +#: pl_exec.c:4416 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "Se till att frÃ¥gan returerar exakt en rad eller använd LIMIT 1." -#: pl_exec.c:4400 +#: pl_exec.c:4432 #, c-format msgid "query has no destination for result data" msgstr "frÃ¥gan har ingen destination för resultatdatan" -#: pl_exec.c:4401 +#: pl_exec.c:4433 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Om du vill slänga resultatet av en SELECT, använd PERFORM istället." -#: pl_exec.c:4489 +#: pl_exec.c:4522 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "EXECUTE för SELECT ... INTO är inte implementerad" -#: pl_exec.c:4490 +#: pl_exec.c:4523 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "Du vill nog använda EXECUTE ... INTO eller EXECUTE CREATE TABLE ... AS istället." -#: pl_exec.c:4503 +#: pl_exec.c:4536 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE pÃ¥ transaktionskommanon är inte implementerat" -#: pl_exec.c:4804 pl_exec.c:4892 +#: pl_exec.c:4846 pl_exec.c:4934 #, c-format msgid "cursor variable \"%s\" is null" msgstr "markörvariabel \"%s\" är null" -#: pl_exec.c:4815 pl_exec.c:4903 +#: pl_exec.c:4857 pl_exec.c:4945 #, c-format msgid "cursor \"%s\" does not exist" msgstr "markör \"%s\" existerar inte" -#: pl_exec.c:4828 +#: pl_exec.c:4870 #, c-format msgid "relative or absolute cursor position is null" msgstr "relativ eller absolut markörposition är null" -#: pl_exec.c:5066 pl_exec.c:5161 +#: pl_exec.c:5108 pl_exec.c:5203 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "null-value kan inte tilldelas till variabel \"%s\" som deklarerats NOT NULL" -#: pl_exec.c:5142 +#: pl_exec.c:5184 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "kan inte tilldela icke-composite-värde till radvariabel" -#: pl_exec.c:5174 +#: pl_exec.c:5216 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "kan inte tilldela icke-composite-värde till en post-variabel" -#: pl_exec.c:5225 +#: pl_exec.c:5267 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "kan inte skriva till systemkolumn \"%s\"" -#: pl_exec.c:5674 +#: pl_exec.c:5716 #, c-format msgid "query did not return data" msgstr "frÃ¥gan returnerade ingen data" -#: pl_exec.c:5675 pl_exec.c:5687 pl_exec.c:5712 pl_exec.c:5788 pl_exec.c:5793 +#: pl_exec.c:5717 pl_exec.c:5729 pl_exec.c:5754 pl_exec.c:5830 pl_exec.c:5835 #, c-format msgid "query: %s" msgstr "frÃ¥ga: %s" -#: pl_exec.c:5683 +#: pl_exec.c:5725 #, c-format msgid "query returned %d column" msgid_plural "query returned %d columns" msgstr[0] "frÃ¥gan returnerade %d kolumn" msgstr[1] "frÃ¥gan returnerade %d kolumner" -#: pl_exec.c:5787 +#: pl_exec.c:5829 #, c-format msgid "query is SELECT INTO, but it should be plain SELECT" msgstr "frÃ¥gan är SELECT INTO men skall vara en vanlig SELECT" -#: pl_exec.c:5792 +#: pl_exec.c:5834 #, c-format msgid "query is not a SELECT" msgstr "frÃ¥gan är inte en SELECT" -#: pl_exec.c:6602 pl_exec.c:6642 pl_exec.c:6682 +#: pl_exec.c:6648 pl_exec.c:6688 pl_exec.c:6728 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "typen av parameter %d (%s) matchar inte det som var vid preparerande av plan (%s)" -#: pl_exec.c:7093 pl_exec.c:7127 pl_exec.c:7201 pl_exec.c:7227 +#: pl_exec.c:7139 pl_exec.c:7173 pl_exec.c:7247 pl_exec.c:7273 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "antal käll- och mÃ¥l-fält i tilldelningen matchar inte" #. translator: %s represents a name of an extra check -#: pl_exec.c:7095 pl_exec.c:7129 pl_exec.c:7203 pl_exec.c:7229 +#: pl_exec.c:7141 pl_exec.c:7175 pl_exec.c:7249 pl_exec.c:7275 #, c-format msgid "%s check of %s is active." msgstr "%s kontroll av %s är aktiv." -#: pl_exec.c:7099 pl_exec.c:7133 pl_exec.c:7207 pl_exec.c:7233 +#: pl_exec.c:7145 pl_exec.c:7179 pl_exec.c:7253 pl_exec.c:7279 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "Se till att frÃ¥gan returerar exakt rätt lista med kolumner." -#: pl_exec.c:7620 +#: pl_exec.c:7666 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "posten \"%s\" är inte tilldelad än" -#: pl_exec.c:7621 +#: pl_exec.c:7667 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "Tuple-strukturen av en ej-ännu-tilldelad post är obestämd." +#: pl_exec.c:8355 pl_gram.y:3498 +#, c-format +msgid "variable \"%s\" is declared CONSTANT" +msgstr "variabel \"%s\" är deklarerad CONSTANT" + #: pl_funcs.c:237 msgid "statement block" msgstr "satsblock" @@ -538,280 +558,274 @@ msgstr "SQL-sats" msgid "FOR over EXECUTE statement" msgstr "FOR över EXECUTE-sats" -#: pl_gram.y:486 +#: pl_gram.y:485 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "blocketikett mÃ¥ste anges före DECLARE, inte efter" -#: pl_gram.y:506 +#: pl_gram.y:505 #, c-format msgid "collations are not supported by type %s" msgstr "jämförelser stöds inte för typ %s" -#: pl_gram.y:525 +#: pl_gram.y:524 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "variabel \"%s\" mÃ¥ste ha ett default-värde dÃ¥ det inte deklarerats som NOT NULL" -#: pl_gram.y:673 pl_gram.y:688 pl_gram.y:714 -#, c-format -msgid "variable \"%s\" does not exist" -msgstr "variabel \"%s\" finns inte" - -#: pl_gram.y:732 pl_gram.y:760 +#: pl_gram.y:704 pl_gram.y:732 msgid "duplicate declaration" msgstr "duplicerad deklaration" -#: pl_gram.y:743 pl_gram.y:771 +#: pl_gram.y:715 pl_gram.y:743 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "variabeln \"%s\" döljer en tidigare definierad variabel" -#: pl_gram.y:1043 +#: pl_gram.y:1017 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "diagnostikdel %s tillÃ¥ts inte i GET STACKED DIAGNOSTICS" -#: pl_gram.y:1061 +#: pl_gram.y:1035 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "diagnostikdel %s tillÃ¥ts inte i GET CURRENT DIAGNOSTICS" -#: pl_gram.y:1156 +#: pl_gram.y:1133 msgid "unrecognized GET DIAGNOSTICS item" msgstr "okänd GET DIAGNOSTICS-del" -#: pl_gram.y:1172 pl_gram.y:3557 +#: pl_gram.y:1149 pl_gram.y:3614 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" är inte ett skalärt värde" -#: pl_gram.y:1402 pl_gram.y:1596 +#: pl_gram.y:1379 pl_gram.y:1572 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "loop-variabeln för loop över rader mÃ¥ste vara en postvariabel eller en lista av skalärvariabler" -#: pl_gram.y:1437 +#: pl_gram.y:1414 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "markör-FOR-loop mÃ¥ste ha exakt en mÃ¥lvariabel" -#: pl_gram.y:1444 +#: pl_gram.y:1421 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "markör-FOR-loop mÃ¥ste använda en bunden markörvariabel" -#: pl_gram.y:1535 +#: pl_gram.y:1511 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "heltals-FOR-loop mÃ¥ste ha exakt en mÃ¥lvariabel" -#: pl_gram.y:1569 +#: pl_gram.y:1545 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "kan inte ange REVERSE i frÃ¥ge-FOR-loop" -#: pl_gram.y:1699 +#: pl_gram.y:1675 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "loop-variabel för FOREACH mÃ¥ste vara en känd variabel eller lista av variabler" -#: pl_gram.y:1741 +#: pl_gram.y:1717 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "det finns ingen etikett \"%s\" kopplad till nÃ¥got block eller loop-omslutning i denna sats" -#: pl_gram.y:1749 +#: pl_gram.y:1725 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "blocketikett \"%s\" kan inte användas i CONTINUE" -#: pl_gram.y:1764 +#: pl_gram.y:1740 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT kan inte användas utanför en loop, om den inte har en etikett" -#: pl_gram.y:1765 +#: pl_gram.y:1741 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE kan inte användas utanför en loop" -#: pl_gram.y:1789 pl_gram.y:1827 pl_gram.y:1875 pl_gram.y:3004 pl_gram.y:3092 -#: pl_gram.y:3203 pl_gram.y:3956 +#: pl_gram.y:1765 pl_gram.y:1803 pl_gram.y:1851 pl_gram.y:3061 pl_gram.y:3149 +#: pl_gram.y:3260 pl_gram.y:4009 msgid "unexpected end of function definition" msgstr "oväntat slut pÃ¥ funktionsdefinitionen" -#: pl_gram.y:1895 pl_gram.y:1919 pl_gram.y:1935 pl_gram.y:1941 pl_gram.y:2066 -#: pl_gram.y:2074 pl_gram.y:2088 pl_gram.y:2183 pl_gram.y:2407 pl_gram.y:2497 -#: pl_gram.y:2655 pl_gram.y:3799 pl_gram.y:3860 pl_gram.y:3937 +#: pl_gram.y:1871 pl_gram.y:1895 pl_gram.y:1911 pl_gram.y:1917 pl_gram.y:2042 +#: pl_gram.y:2050 pl_gram.y:2064 pl_gram.y:2159 pl_gram.y:2383 pl_gram.y:2473 +#: pl_gram.y:2632 pl_gram.y:3856 pl_gram.y:3917 pl_gram.y:3990 msgid "syntax error" msgstr "syntaxfel" -#: pl_gram.y:1923 pl_gram.y:1925 pl_gram.y:2411 pl_gram.y:2413 +#: pl_gram.y:1899 pl_gram.y:1901 pl_gram.y:2387 pl_gram.y:2389 msgid "invalid SQLSTATE code" msgstr "ogiltig SQLSTATE-kod" -#: pl_gram.y:2131 +#: pl_gram.y:2107 msgid "syntax error, expected \"FOR\"" msgstr "syntaxfel, förväntade \"FOR\"" -#: pl_gram.y:2192 +#: pl_gram.y:2168 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "FETCH-sats kan inte returnera multipla rader" -#: pl_gram.y:2289 +#: pl_gram.y:2265 #, c-format msgid "cursor variable must be a simple variable" msgstr "markörvariabel mÃ¥ste vara en enkel variabel" -#: pl_gram.y:2295 +#: pl_gram.y:2271 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "variabel \"%s\" mÃ¥ste ha typen cursor eller refcursor" -#: pl_gram.y:2626 pl_gram.y:2637 +#: pl_gram.y:2603 pl_gram.y:2614 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" är inte en känd variabel" -#: pl_gram.y:2743 pl_gram.y:2753 pl_gram.y:2909 +#: pl_gram.y:2719 pl_gram.y:2729 pl_gram.y:2911 msgid "mismatched parentheses" msgstr "missmatchade parenteser" -#: pl_gram.y:2757 +#: pl_gram.y:2733 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "saknar \"%s\" vid slutet av SQL-uttryck" -#: pl_gram.y:2763 +#: pl_gram.y:2739 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "saknar \"%s\" vid slutet av SQL-sats" -#: pl_gram.y:2780 +#: pl_gram.y:2758 msgid "missing expression" msgstr "saknar uttryck" -#: pl_gram.y:2782 +#: pl_gram.y:2760 msgid "missing SQL statement" msgstr "saknars SQL-sats" -#: pl_gram.y:2911 +#: pl_gram.y:2889 +msgid "syntax error, expected \"]\"" +msgstr "syntaxfel, förväntade \"]\"" + +#: pl_gram.y:2913 msgid "incomplete data type declaration" msgstr "inkomplett datatypdeklaration" -#: pl_gram.y:2934 +#: pl_gram.y:2936 msgid "missing data type declaration" msgstr "saknar datatypdeklaration" -#: pl_gram.y:3014 +#: pl_gram.y:3071 msgid "INTO specified more than once" msgstr "INTO angiven mer än en gÃ¥ng" -#: pl_gram.y:3184 +#: pl_gram.y:3241 msgid "expected FROM or IN" msgstr "förväntade FROM eller IN" -#: pl_gram.y:3245 +#: pl_gram.y:3302 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "RETURN kan inte ha en parameter i funktion som returnerar en mängd" -#: pl_gram.y:3246 +#: pl_gram.y:3303 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "Använd RETURN NEXT eller RETURN QUERY." -#: pl_gram.y:3256 +#: pl_gram.y:3313 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "RETURN kan inte ha en parameter i en procedur" -#: pl_gram.y:3261 +#: pl_gram.y:3318 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "RETURN kan inte ha en parameter i funktion som returnerar void" -#: pl_gram.y:3270 +#: pl_gram.y:3327 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "RETURN kan inte ha en parameter i en funktion med OUT-parameterar" -#: pl_gram.y:3333 +#: pl_gram.y:3390 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "RETURN NEXT kan inte ha en parameter i funktion med OUT-parametrar" -#: pl_gram.y:3441 -#, c-format -msgid "variable \"%s\" is declared CONSTANT" -msgstr "variabel \"%s\" är deklarerad CONSTANT" - -#: pl_gram.y:3499 +#: pl_gram.y:3556 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "postvariabel kan inte vara del av en multipel-INTO-lista" -#: pl_gram.y:3545 +#: pl_gram.y:3602 #, c-format msgid "too many INTO variables specified" msgstr "för mÃ¥nga INTO-variabler angivna" -#: pl_gram.y:3753 +#: pl_gram.y:3810 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "slutetikett \"%s\" angiven för block utan etikett" -#: pl_gram.y:3760 +#: pl_gram.y:3817 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "slutetikett \"%s\" stämmer inte med blockets etikett \"%s\"" -#: pl_gram.y:3794 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "markör \"%s\" har inga argument" -#: pl_gram.y:3808 +#: pl_gram.y:3865 #, c-format msgid "cursor \"%s\" has arguments" msgstr "markör \"%s\" har argument" -#: pl_gram.y:3850 +#: pl_gram.y:3907 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "markör \"%s\" har inga argument med namn \"%s\"" -#: pl_gram.y:3870 +#: pl_gram.y:3927 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "värdet för parameter \"%s\" i markör \"%s\" är angivet mer än en gÃ¥ng" -#: pl_gram.y:3895 +#: pl_gram.y:3948 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "ej tillräckligt med argument för markör \"%s\"" -#: pl_gram.y:3902 +#: pl_gram.y:3955 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "fär mÃ¥nga argument för markör \"%s\"" -#: pl_gram.y:3988 +#: pl_gram.y:4041 msgid "unrecognized RAISE statement option" msgstr "okänd RAISE-sats-flagga" -#: pl_gram.y:3992 +#: pl_gram.y:4045 msgid "syntax error, expected \"=\"" msgstr "syntaxfel, förväntade \"=\"" -#: pl_gram.y:4033 +#: pl_gram.y:4086 #, c-format msgid "too many parameters specified for RAISE" msgstr "för mÃ¥nga parametrar angivna för RAISE" -#: pl_gram.y:4037 +#: pl_gram.y:4090 #, c-format msgid "too few parameters specified for RAISE" msgstr "för fÃ¥ parametrar angivna för RAISE" @@ -837,13 +851,13 @@ msgid "List of programming constructs that should produce an error." msgstr "Lista av programmeringskonstruktioner som skall ge ett fel" #. translator: %s is typically the translation of "syntax error" -#: pl_scanner.c:508 +#: pl_scanner.c:525 #, c-format msgid "%s at end of input" msgstr "%s vid slutet av indatan" #. translator: first %s is typically the translation of "syntax error" -#: pl_scanner.c:524 +#: pl_scanner.c:541 #, c-format msgid "%s at or near \"%s\"" msgstr "%s vid eller nära \"%s\"" diff --git a/src/pl/plpgsql/src/po/uk.po b/src/pl/plpgsql/src/po/uk.po index 77510da01b8ad..044dd5fa4c385 100644 --- a/src/pl/plpgsql/src/po/uk.po +++ b/src/pl/plpgsql/src/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:39+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:09+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,162 +14,177 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/plpgsql.pot\n" -"X-Crowdin-File-ID: 894\n" +"X-Crowdin-File: /REL_17_STABLE/plpgsql.pot\n" +"X-Crowdin-File-ID: 998\n" -#: pl_comp.c:438 pl_handler.c:496 +#: pl_comp.c:434 pl_handler.c:496 #, c-format msgid "PL/pgSQL functions cannot accept type %s" msgstr "Функції PL/pgSQL не можуть приймати тип %s" -#: pl_comp.c:530 +#: pl_comp.c:526 #, c-format msgid "could not determine actual return type for polymorphic function \"%s\"" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ фактичний тип результату поліморфної функції \"%s\"" -#: pl_comp.c:560 +#: pl_comp.c:556 #, c-format msgid "trigger functions can only be called as triggers" msgstr "тригер-Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¼Ð¾Ð¶Ðµ викликатиÑÑ Ð»Ð¸ÑˆÐµ Ñк тригер" -#: pl_comp.c:564 pl_handler.c:480 +#: pl_comp.c:560 pl_handler.c:480 #, c-format msgid "PL/pgSQL functions cannot return type %s" msgstr "Функції PL/pgSQL не можуть повертати тип %s" -#: pl_comp.c:604 +#: pl_comp.c:600 #, c-format msgid "trigger functions cannot have declared arguments" msgstr "тригер-функції не можуть мати задекларованих аргументи" -#: pl_comp.c:605 +#: pl_comp.c:601 #, c-format msgid "The arguments of the trigger can be accessed through TG_NARGS and TG_ARGV instead." msgstr "Ðргументи тригеру доÑтупні через TG_NARGS та TG_ARGV заміÑть цього." -#: pl_comp.c:738 +#: pl_comp.c:734 #, c-format msgid "event trigger functions cannot have declared arguments" msgstr "функції тригерів подій не можуть мати задекларовані аргументи" -#: pl_comp.c:1002 +#: pl_comp.c:998 #, c-format msgid "compilation of PL/pgSQL function \"%s\" near line %d" msgstr "компілÑÑ†Ñ–Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— PL/pgSQL \"%s\" Ð±Ñ–Ð»Ñ Ñ€Ñдка %d" -#: pl_comp.c:1025 +#: pl_comp.c:1021 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "ім'Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñƒ «%s» викориÑтано декілька разів" -#: pl_comp.c:1139 +#: pl_comp.c:1135 #, c-format msgid "column reference \"%s\" is ambiguous" msgstr "поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Ñтовпець \"%s\" Ñ” неоднозначним" -#: pl_comp.c:1141 +#: pl_comp.c:1137 #, c-format msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Це може відноÑитиÑÑ Ð´Ð¾ змінної PL/pgSQL або ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–." -#: pl_comp.c:1324 pl_exec.c:5234 pl_exec.c:5407 pl_exec.c:5494 pl_exec.c:5585 -#: pl_exec.c:6606 +#: pl_comp.c:1314 pl_exec.c:5260 pl_exec.c:5433 pl_exec.c:5520 pl_exec.c:5611 +#: pl_exec.c:6636 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "Ð·Ð°Ð¿Ð¸Ñ \"%s\" не має Ð¿Ð¾Ð»Ñ \"%s\"" -#: pl_comp.c:1818 +#: pl_comp.c:1633 pl_gram.y:645 pl_gram.y:660 pl_gram.y:686 +#, c-format +msgid "variable \"%s\" does not exist" +msgstr "змінної \"%s\" не Ñ–Ñнує" + +#: pl_comp.c:1722 +#, c-format +msgid "column \"%s\" of relation \"%s\" does not exist" +msgstr "Ñтовпець \"%s\" зв'Ñзку \"%s\" не Ñ–Ñнує" + +#: pl_comp.c:1775 #, c-format msgid "relation \"%s\" does not exist" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не Ñ–Ñнує" -#: pl_comp.c:1825 pl_comp.c:1867 +#: pl_comp.c:1782 pl_comp.c:1820 #, c-format msgid "relation \"%s\" does not have a composite type" msgstr "Ð²Ñ–Ð´Ð½Ð¾ÑˆÐµÐ½Ð½Ñ \"%s\" не має Ñкладеного типу" -#: pl_comp.c:1933 +#: pl_comp.c:1886 #, c-format msgid "variable \"%s\" has pseudo-type %s" msgstr "змінна \"%s\" має пÑевдотип %s" -#: pl_comp.c:2122 +#: pl_comp.c:2075 #, c-format msgid "type \"%s\" is only a shell" msgstr "тип \"%s\" Ñ” лише оболонкою" -#: pl_comp.c:2204 pl_exec.c:6907 +#: pl_comp.c:2157 pl_exec.c:6937 #, c-format msgid "type %s is not composite" msgstr "тип %s не Ñ” Ñкладеним" -#: pl_comp.c:2252 pl_comp.c:2305 +#: pl_comp.c:2193 +#, c-format +msgid "could not find array type for data type %s" +msgstr "не вдалоÑÑ Ð·Ð½Ð°Ð¹Ñ‚Ð¸ тип маÑиву Ð´Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ даних %s" + +#: pl_comp.c:2232 pl_comp.c:2285 #, c-format msgid "unrecognized exception condition \"%s\"" msgstr "нерозпізнана умова Ð²Ð¸ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ \"%s\"" -#: pl_comp.c:2526 +#: pl_comp.c:2514 #, c-format msgid "could not determine actual argument type for polymorphic function \"%s\"" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ фактичний тип аргумента поліморфної функції \"%s\"" -#: pl_exec.c:501 pl_exec.c:940 pl_exec.c:1175 +#: pl_exec.c:512 pl_exec.c:951 pl_exec.c:1186 msgid "during initialization of execution state" msgstr "під Ñ‡Ð°Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— Ñтану виконаннÑ" -#: pl_exec.c:507 +#: pl_exec.c:518 msgid "while storing call arguments into local variables" msgstr "під Ñ‡Ð°Ñ Ð·Ð±ÐµÑ€Ñ–Ð³Ð°Ð½Ð½Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² виклику до локальних змінних" -#: pl_exec.c:595 pl_exec.c:1013 +#: pl_exec.c:606 pl_exec.c:1024 msgid "during function entry" msgstr "під Ñ‡Ð°Ñ Ð²Ñ…Ð¾Ð´Ñƒ до функції" -#: pl_exec.c:618 +#: pl_exec.c:629 #, c-format msgid "control reached end of function without RETURN" msgstr "доÑÑгнуто ÐºÑ–Ð½Ñ†Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— без RETURN" -#: pl_exec.c:624 +#: pl_exec.c:635 msgid "while casting return value to function's return type" msgstr "під Ñ‡Ð°Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ, що повертаєтьÑÑ, до типу результата функції" -#: pl_exec.c:636 pl_exec.c:3665 +#: pl_exec.c:647 pl_exec.c:3683 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"set-valued\" викликана в контекÑті, де йому немає міÑцÑ" -#: pl_exec.c:641 pl_exec.c:3671 +#: pl_exec.c:652 pl_exec.c:3689 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "необхідний режим матеріалізації (materialize mode), але він неприпуÑтимий у цьому контекÑті" -#: pl_exec.c:768 pl_exec.c:1039 pl_exec.c:1197 +#: pl_exec.c:779 pl_exec.c:1050 pl_exec.c:1208 msgid "during function exit" msgstr "під Ñ‡Ð°Ñ Ð²Ð¸Ñ…Ð¾Ð´Ñƒ з функції" -#: pl_exec.c:823 pl_exec.c:887 pl_exec.c:3464 +#: pl_exec.c:834 pl_exec.c:898 pl_exec.c:3482 msgid "returned record type does not match expected record type" msgstr "тип запиÑу, що повертаєтьÑÑ, не відповідає очікуваному типу" -#: pl_exec.c:1036 pl_exec.c:1194 +#: pl_exec.c:1047 pl_exec.c:1205 #, c-format msgid "control reached end of trigger procedure without RETURN" msgstr "доÑÑгнуто ÐºÑ–Ð½Ñ†Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ð½Ð¾Ñ— процедури без RETURN" -#: pl_exec.c:1044 +#: pl_exec.c:1055 #, c-format msgid "trigger procedure cannot return a set" msgstr "тригерна процедура не може повернути набір" -#: pl_exec.c:1083 pl_exec.c:1111 +#: pl_exec.c:1094 pl_exec.c:1122 msgid "returned row structure does not match the structure of the triggering table" msgstr "Ñтруктура Ñ€Ñдка, що повертаєтьÑÑ, не відповідає Ñтруктурі таблиці, Ñка викликала тригер" #. translator: last %s is a phrase such as "during statement block #. local variable initialization" #. -#: pl_exec.c:1252 +#: pl_exec.c:1263 #, c-format msgid "PL/pgSQL function %s line %d %s" msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ PL/pgSQL %s Ñ€Ñдок %d %s" @@ -177,288 +192,288 @@ msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ PL/pgSQL %s Ñ€Ñдок %d %s" #. translator: last %s is a phrase such as "while storing call #. arguments into local variables" #. -#: pl_exec.c:1263 +#: pl_exec.c:1274 #, c-format msgid "PL/pgSQL function %s %s" msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ PL/pgSQL %s %s" #. translator: last %s is a plpgsql statement type name -#: pl_exec.c:1271 +#: pl_exec.c:1282 #, c-format msgid "PL/pgSQL function %s line %d at %s" msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ PL/pgSQL %s Ñ€Ñдок %d в %s" -#: pl_exec.c:1277 +#: pl_exec.c:1288 #, c-format msgid "PL/pgSQL function %s" msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ PL/pgSQL %s" -#: pl_exec.c:1648 +#: pl_exec.c:1659 msgid "during statement block local variable initialization" msgstr "під Ñ‡Ð°Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ— локальної змінної в блоці операторів" -#: pl_exec.c:1753 +#: pl_exec.c:1764 msgid "during statement block entry" msgstr "під Ñ‡Ð°Ñ Ð²Ñ…Ð¾Ð´Ñƒ в блок операторів" -#: pl_exec.c:1785 +#: pl_exec.c:1796 msgid "during statement block exit" msgstr "під Ñ‡Ð°Ñ Ð²Ð¸Ñ…Ð¾Ð´Ñƒ з блоку операторів" -#: pl_exec.c:1823 +#: pl_exec.c:1834 msgid "during exception cleanup" msgstr "під Ñ‡Ð°Ñ Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð²Ð¸Ð½Ñтку" -#: pl_exec.c:2360 +#: pl_exec.c:2370 #, c-format msgid "procedure parameter \"%s\" is an output parameter but corresponding argument is not writable" msgstr "параметр процедури \"%s\" Ñ” вихідним, але відповідний аргумент не допуÑкає запиÑ" -#: pl_exec.c:2365 +#: pl_exec.c:2375 #, c-format msgid "procedure parameter %d is an output parameter but corresponding argument is not writable" msgstr "параметр процедури %d Ñ” вихідним, але відповідний аргумент не допуÑкає запиÑ" -#: pl_exec.c:2399 +#: pl_exec.c:2411 #, c-format msgid "GET STACKED DIAGNOSTICS cannot be used outside an exception handler" msgstr "GET STACKED DIAGNOSTICS не може викориÑтовуватиÑÑŒ поза блоком обробника винÑтків" -#: pl_exec.c:2599 +#: pl_exec.c:2617 #, c-format msgid "case not found" msgstr "гілку не знайдено" -#: pl_exec.c:2600 +#: pl_exec.c:2618 #, c-format msgid "CASE statement is missing ELSE part." msgstr "Ð’ операторі CASE пропущено чаÑтину ELSE." -#: pl_exec.c:2693 +#: pl_exec.c:2711 #, c-format msgid "lower bound of FOR loop cannot be null" msgstr "Ð½Ð¸Ð¶Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ñ†Ð¸ÐºÐ»Ñƒ FOR не може бути null" -#: pl_exec.c:2709 +#: pl_exec.c:2727 #, c-format msgid "upper bound of FOR loop cannot be null" msgstr "Ð²ÐµÑ€Ñ…Ð½Ñ Ð³Ñ€Ð°Ð½Ð¸Ñ†Ñ Ñ†Ð¸ÐºÐ»Ñƒ FOR не може бути null" -#: pl_exec.c:2727 +#: pl_exec.c:2745 #, c-format msgid "BY value of FOR loop cannot be null" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ BY циклу FOR не може бути null" -#: pl_exec.c:2733 +#: pl_exec.c:2751 #, c-format msgid "BY value of FOR loop must be greater than zero" msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ BY циклу FOR повинно бути більше нулÑ" -#: pl_exec.c:2867 pl_exec.c:4667 +#: pl_exec.c:2885 pl_exec.c:4693 #, c-format msgid "cursor \"%s\" already in use" msgstr "курÑор \"%s\" вже викориÑтовуєтьÑÑ" -#: pl_exec.c:2890 pl_exec.c:4737 +#: pl_exec.c:2908 pl_exec.c:4763 #, c-format msgid "arguments given for cursor without arguments" msgstr "аргументи, надані курÑору без аргументів" -#: pl_exec.c:2909 pl_exec.c:4756 +#: pl_exec.c:2927 pl_exec.c:4782 #, c-format msgid "arguments required for cursor" msgstr "аргументи, необхідні Ð´Ð»Ñ ÐºÑƒÑ€Ñора" -#: pl_exec.c:3000 +#: pl_exec.c:3018 #, c-format msgid "FOREACH expression must not be null" msgstr "Вираз FOREACH не може бути null" -#: pl_exec.c:3015 +#: pl_exec.c:3033 #, c-format msgid "FOREACH expression must yield an array, not type %s" msgstr "Вираз в FOREACH повинен бути маÑивом, не типом %s" -#: pl_exec.c:3032 +#: pl_exec.c:3050 #, c-format msgid "slice dimension (%d) is out of the valid range 0..%d" msgstr "розмір зрізу (%d) поза припуÑтимим діапазоном 0..%d" -#: pl_exec.c:3059 +#: pl_exec.c:3077 #, c-format msgid "FOREACH ... SLICE loop variable must be of an array type" msgstr "Змінна циклу FOREACH ... SLICE повинна бути маÑивом" -#: pl_exec.c:3063 +#: pl_exec.c:3081 #, c-format msgid "FOREACH loop variable must not be of an array type" msgstr "Змінна циклу FOREACH не повинна бути маÑивом" -#: pl_exec.c:3225 pl_exec.c:3282 pl_exec.c:3457 +#: pl_exec.c:3243 pl_exec.c:3300 pl_exec.c:3475 #, c-format msgid "cannot return non-composite value from function returning composite type" msgstr "функціÑ, що повертає Ñкладений тип, не може повернути не Ñкладене значеннÑ" -#: pl_exec.c:3321 pl_gram.y:3319 +#: pl_exec.c:3339 pl_gram.y:3375 #, c-format msgid "cannot use RETURN NEXT in a non-SETOF function" msgstr "не можна викориÑтовувати RETURN NEXT в функціÑÑ…, що не повертають набори даних" -#: pl_exec.c:3362 pl_exec.c:3494 +#: pl_exec.c:3380 pl_exec.c:3512 #, c-format msgid "wrong result type supplied in RETURN NEXT" msgstr "в RETURN NEXT вказано неправильний тип результату" -#: pl_exec.c:3400 pl_exec.c:3421 +#: pl_exec.c:3418 pl_exec.c:3439 #, c-format msgid "wrong record type supplied in RETURN NEXT" msgstr "в RETURN NEXT вказано неправильний тип запиÑу" -#: pl_exec.c:3513 +#: pl_exec.c:3531 #, c-format msgid "RETURN NEXT must have a parameter" msgstr "RETURN NEXT повинен мати параметр" -#: pl_exec.c:3541 pl_gram.y:3383 +#: pl_exec.c:3559 pl_gram.y:3439 #, c-format msgid "cannot use RETURN QUERY in a non-SETOF function" msgstr "не можна викориÑтовувати RETURN QUERY в функціÑÑ…, що не повертають набір" -#: pl_exec.c:3559 +#: pl_exec.c:3577 msgid "structure of query does not match function result type" msgstr "Ñтруктура запиту не відповідає типу результата функції" -#: pl_exec.c:3614 pl_exec.c:4444 pl_exec.c:8685 +#: pl_exec.c:3632 pl_exec.c:4469 pl_exec.c:8759 #, c-format msgid "query string argument of EXECUTE is null" msgstr "текÑтовий аргумент запиту EXECUTE Ñ” null" -#: pl_exec.c:3699 pl_exec.c:3837 +#: pl_exec.c:3717 pl_exec.c:3855 #, c-format msgid "RAISE option already specified: %s" msgstr "Параметр RAISE вже вказано: %s" -#: pl_exec.c:3733 +#: pl_exec.c:3751 #, c-format msgid "RAISE without parameters cannot be used outside an exception handler" msgstr "RAISE без параметрів не можна викориÑтовувати поза блоком обробника винÑтків" -#: pl_exec.c:3827 +#: pl_exec.c:3845 #, c-format msgid "RAISE statement option cannot be null" msgstr "Параметром оператора RAISE не може бути null" -#: pl_exec.c:3897 +#: pl_exec.c:3915 #, c-format msgid "%s" msgstr "%s" -#: pl_exec.c:3952 +#: pl_exec.c:3970 #, c-format msgid "assertion failed" msgstr "Ð¿Ð¾Ñ€ÑƒÑˆÐµÐ½Ð½Ñ Ñ–ÑтинноÑті" -#: pl_exec.c:4317 pl_exec.c:4506 +#: pl_exec.c:4342 pl_exec.c:4532 #, c-format msgid "cannot COPY to/from client in PL/pgSQL" msgstr "в PL/pgSQL не можна виконати COPY за учаÑтю клієнта" -#: pl_exec.c:4323 +#: pl_exec.c:4348 #, c-format msgid "unsupported transaction command in PL/pgSQL" msgstr "непідтримувана транзакційна команда в PL/pgSQL" -#: pl_exec.c:4346 pl_exec.c:4535 +#: pl_exec.c:4371 pl_exec.c:4561 #, c-format msgid "INTO used with a command that cannot return data" msgstr "INTO викориÑтаний з командою, що не може повертати дані" -#: pl_exec.c:4369 pl_exec.c:4558 +#: pl_exec.c:4394 pl_exec.c:4584 #, c-format msgid "query returned no rows" msgstr "запит не повернув Ñ€Ñдки" -#: pl_exec.c:4391 pl_exec.c:4577 pl_exec.c:5729 +#: pl_exec.c:4416 pl_exec.c:4603 pl_exec.c:5755 #, c-format msgid "query returned more than one row" msgstr "запит повернув декілька Ñ€Ñдків" -#: pl_exec.c:4393 +#: pl_exec.c:4418 #, c-format msgid "Make sure the query returns a single row, or use LIMIT 1." msgstr "ПереконайтеÑÑ, що запит повертає один Ñ€Ñдок, або викориÑтовуйте LIMIT 1." -#: pl_exec.c:4409 +#: pl_exec.c:4434 #, c-format msgid "query has no destination for result data" msgstr "запит не має Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð¸Ñ… результату" -#: pl_exec.c:4410 +#: pl_exec.c:4435 #, c-format msgid "If you want to discard the results of a SELECT, use PERFORM instead." msgstr "Якщо ви хочете відкинути результати SELECT, викориÑтайте PERFORM." -#: pl_exec.c:4498 +#: pl_exec.c:4524 #, c-format msgid "EXECUTE of SELECT ... INTO is not implemented" msgstr "EXECUTE виразу SELECT ... INTO не реалізовано" -#: pl_exec.c:4499 +#: pl_exec.c:4525 #, c-format msgid "You might want to use EXECUTE ... INTO or EXECUTE CREATE TABLE ... AS instead." msgstr "Ðльтернативою може Ñтати EXECUTE ... INTO або EXECUTE CREATE TABLE ... AS." -#: pl_exec.c:4512 +#: pl_exec.c:4538 #, c-format msgid "EXECUTE of transaction commands is not implemented" msgstr "EXECUTE з транзакційними командами не реалізовано" -#: pl_exec.c:4822 pl_exec.c:4910 +#: pl_exec.c:4848 pl_exec.c:4936 #, c-format msgid "cursor variable \"%s\" is null" msgstr "змінна курÑора \"%s\" дорівнює null" -#: pl_exec.c:4833 pl_exec.c:4921 +#: pl_exec.c:4859 pl_exec.c:4947 #, c-format msgid "cursor \"%s\" does not exist" msgstr "курÑор \"%s\" не Ñ–Ñнує" -#: pl_exec.c:4846 +#: pl_exec.c:4872 #, c-format msgid "relative or absolute cursor position is null" msgstr "відноÑна або абÑолютна Ð¿Ð¾Ð·Ð¸Ñ†Ñ–Ñ ÐºÑƒÑ€Ñора дорівнює null" -#: pl_exec.c:5084 pl_exec.c:5179 +#: pl_exec.c:5110 pl_exec.c:5205 #, c-format msgid "null value cannot be assigned to variable \"%s\" declared NOT NULL" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ null не можна призначити змінній \"%s\", оголошеній NOT NULL" -#: pl_exec.c:5160 +#: pl_exec.c:5186 #, c-format msgid "cannot assign non-composite value to a row variable" msgstr "змінній типу кортеж можна призначити лише Ñкладене значеннÑ" -#: pl_exec.c:5192 +#: pl_exec.c:5218 #, c-format msgid "cannot assign non-composite value to a record variable" msgstr "змінній типу Ð·Ð°Ð¿Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð° призначити лише Ñкладене значеннÑ" -#: pl_exec.c:5243 +#: pl_exec.c:5269 #, c-format msgid "cannot assign to system column \"%s\"" msgstr "призначити Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ ÑиÑтемному Ñтовпцю \"%s\" не можна" -#: pl_exec.c:5692 +#: pl_exec.c:5718 #, c-format msgid "query did not return data" msgstr "запит не повернув даних" -#: pl_exec.c:5693 pl_exec.c:5705 pl_exec.c:5730 pl_exec.c:5806 pl_exec.c:5811 +#: pl_exec.c:5719 pl_exec.c:5731 pl_exec.c:5756 pl_exec.c:5832 pl_exec.c:5837 #, c-format msgid "query: %s" msgstr "запит: %s" -#: pl_exec.c:5701 +#: pl_exec.c:5727 #, c-format msgid "query returned %d column" msgid_plural "query returned %d columns" @@ -467,48 +482,48 @@ msgstr[1] "запит повернув %d колонки" msgstr[2] "запит повернув %d колонок" msgstr[3] "запит повернув %d колонок" -#: pl_exec.c:5805 +#: pl_exec.c:5831 #, c-format msgid "query is SELECT INTO, but it should be plain SELECT" msgstr "запит Ñ” SELECT INTO, але має бути звичайним SELECT" -#: pl_exec.c:5810 +#: pl_exec.c:5836 #, c-format msgid "query is not a SELECT" msgstr "запит не Ñ” SELECT" -#: pl_exec.c:6620 pl_exec.c:6660 pl_exec.c:6700 +#: pl_exec.c:6650 pl_exec.c:6690 pl_exec.c:6730 #, c-format msgid "type of parameter %d (%s) does not match that when preparing the plan (%s)" msgstr "тип параметру %d (%s) не відповідає тому, з котрим тривала підготовка плану (%s)" -#: pl_exec.c:7111 pl_exec.c:7145 pl_exec.c:7219 pl_exec.c:7245 +#: pl_exec.c:7141 pl_exec.c:7175 pl_exec.c:7249 pl_exec.c:7275 #, c-format msgid "number of source and target fields in assignment does not match" msgstr "кількіÑть вихідних Ñ– цільових полів у приÑвоюванні не збігаєтьÑÑ" #. translator: %s represents a name of an extra check -#: pl_exec.c:7113 pl_exec.c:7147 pl_exec.c:7221 pl_exec.c:7247 +#: pl_exec.c:7143 pl_exec.c:7177 pl_exec.c:7251 pl_exec.c:7277 #, c-format msgid "%s check of %s is active." msgstr "%s перевірка %s активна." -#: pl_exec.c:7117 pl_exec.c:7151 pl_exec.c:7225 pl_exec.c:7251 +#: pl_exec.c:7147 pl_exec.c:7181 pl_exec.c:7255 pl_exec.c:7281 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "ПереконайтеÑÑ, що запит повертає точний ÑпиÑок Ñтовпців." -#: pl_exec.c:7638 +#: pl_exec.c:7668 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "Ð·Ð°Ð¿Ð¸Ñ \"%s\" ще не призначено" -#: pl_exec.c:7639 +#: pl_exec.c:7669 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "Ð”Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу, котрому не призначене значеннÑ, Ñтруктура кортежа не визначена." -#: pl_exec.c:8283 pl_gram.y:3442 +#: pl_exec.c:8357 pl_gram.y:3498 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "змінна \"%s\" оголошена Ñк CONSTANT" @@ -545,275 +560,274 @@ msgstr "SQL-оператор" msgid "FOR over EXECUTE statement" msgstr "FOR за результатами EXECUTE" -#: pl_gram.y:487 +#: pl_gram.y:485 #, c-format msgid "block label must be placed before DECLARE, not after" msgstr "мітка блоку повинна бути розміщена до DECLARE, а не піÑлÑ" -#: pl_gram.y:507 +#: pl_gram.y:505 #, c-format msgid "collations are not supported by type %s" msgstr "тип %s не підтримує правила ÑортуваннÑ" -#: pl_gram.y:526 +#: pl_gram.y:524 #, c-format msgid "variable \"%s\" must have a default value, since it's declared NOT NULL" msgstr "змінна \"%s\" повинна мати Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð·Ð° замовчуваннÑм піÑÐ»Ñ Ñ‚Ð¾Ð³Ð¾, Ñк вона оголошена Ñк NOT NULL" -#: pl_gram.y:674 pl_gram.y:689 pl_gram.y:715 -#, c-format -msgid "variable \"%s\" does not exist" -msgstr "змінної \"%s\" не Ñ–Ñнує" - -#: pl_gram.y:733 pl_gram.y:761 +#: pl_gram.y:704 pl_gram.y:732 msgid "duplicate declaration" msgstr "дублікат оголошеннÑ" -#: pl_gram.y:744 pl_gram.y:772 +#: pl_gram.y:715 pl_gram.y:743 #, c-format msgid "variable \"%s\" shadows a previously defined variable" msgstr "змінна \"%s\" приховує раніше оголошену змінну" -#: pl_gram.y:1044 +#: pl_gram.y:1017 #, c-format msgid "diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS" msgstr "команда GET STACKED DIAGNOSTICS не дозволÑÑ” елемент діагноÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ %s" -#: pl_gram.y:1062 +#: pl_gram.y:1035 #, c-format msgid "diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS" msgstr "команда GET CURRENT DIAGNOSTICS не дозволÑÑ” елемент діагноÑÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ %s" -#: pl_gram.y:1157 +#: pl_gram.y:1133 msgid "unrecognized GET DIAGNOSTICS item" msgstr "нерозпізнаний елемент GET DIAGNOSTICS" -#: pl_gram.y:1173 pl_gram.y:3558 +#: pl_gram.y:1149 pl_gram.y:3614 #, c-format msgid "\"%s\" is not a scalar variable" msgstr "\"%s\" не Ñ” ÑкалÑрною змінною" -#: pl_gram.y:1403 pl_gram.y:1597 +#: pl_gram.y:1379 pl_gram.y:1572 #, c-format msgid "loop variable of loop over rows must be a record variable or list of scalar variables" msgstr "змінна циклу по кортежах повинна бути змінною типу Ð·Ð°Ð¿Ð¸Ñ Ð°Ð±Ð¾ ÑпиÑком ÑкалÑрних змінних" -#: pl_gram.y:1438 +#: pl_gram.y:1414 #, c-format msgid "cursor FOR loop must have only one target variable" msgstr "курÑор в циклі FOR повинен мати лише одну цільову змінну" -#: pl_gram.y:1445 +#: pl_gram.y:1421 #, c-format msgid "cursor FOR loop must use a bound cursor variable" msgstr "цикл курÑора FOR повинен викориÑтовувати обмежуючу змінну курÑора" -#: pl_gram.y:1536 +#: pl_gram.y:1511 #, c-format msgid "integer FOR loop must have only one target variable" msgstr "цілочиÑельний цикл FOR повинен мати лише одну цільову змінну" -#: pl_gram.y:1570 +#: pl_gram.y:1545 #, c-format msgid "cannot specify REVERSE in query FOR loop" msgstr "в циклі FOR з запитом не можна вказати REVERSE" -#: pl_gram.y:1700 +#: pl_gram.y:1675 #, c-format msgid "loop variable of FOREACH must be a known variable or list of variables" msgstr "змінній циклу FOREACH повинна бути відома змінна або ÑпиÑок змінних" -#: pl_gram.y:1742 +#: pl_gram.y:1717 #, c-format msgid "there is no label \"%s\" attached to any block or loop enclosing this statement" msgstr "в блоку або циклу, розділеному цим оператором, немає мітки \"%s\"" -#: pl_gram.y:1750 +#: pl_gram.y:1725 #, c-format msgid "block label \"%s\" cannot be used in CONTINUE" msgstr "мітку блока \"%s\" не можна викориÑтовувати в CONTINUE" -#: pl_gram.y:1765 +#: pl_gram.y:1740 #, c-format msgid "EXIT cannot be used outside a loop, unless it has a label" msgstr "EXIT можна викориÑтовувати поза циклом, тільки з зазначеннÑм мітки" -#: pl_gram.y:1766 +#: pl_gram.y:1741 #, c-format msgid "CONTINUE cannot be used outside a loop" msgstr "CONTINUE не можна викориÑтовувати поза циклом" -#: pl_gram.y:1790 pl_gram.y:1828 pl_gram.y:1876 pl_gram.y:3005 pl_gram.y:3093 -#: pl_gram.y:3204 pl_gram.y:3957 +#: pl_gram.y:1765 pl_gram.y:1803 pl_gram.y:1851 pl_gram.y:3061 pl_gram.y:3149 +#: pl_gram.y:3260 pl_gram.y:4009 msgid "unexpected end of function definition" msgstr "неочікуваний кінец Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—" -#: pl_gram.y:1896 pl_gram.y:1920 pl_gram.y:1936 pl_gram.y:1942 pl_gram.y:2067 -#: pl_gram.y:2075 pl_gram.y:2089 pl_gram.y:2184 pl_gram.y:2408 pl_gram.y:2498 -#: pl_gram.y:2656 pl_gram.y:3800 pl_gram.y:3861 pl_gram.y:3938 +#: pl_gram.y:1871 pl_gram.y:1895 pl_gram.y:1911 pl_gram.y:1917 pl_gram.y:2042 +#: pl_gram.y:2050 pl_gram.y:2064 pl_gram.y:2159 pl_gram.y:2383 pl_gram.y:2473 +#: pl_gram.y:2632 pl_gram.y:3856 pl_gram.y:3917 pl_gram.y:3990 msgid "syntax error" msgstr "ÑинтакÑична помилка" -#: pl_gram.y:1924 pl_gram.y:1926 pl_gram.y:2412 pl_gram.y:2414 +#: pl_gram.y:1899 pl_gram.y:1901 pl_gram.y:2387 pl_gram.y:2389 msgid "invalid SQLSTATE code" msgstr "неприпуÑтимий код SQLSTATE" -#: pl_gram.y:2132 +#: pl_gram.y:2107 msgid "syntax error, expected \"FOR\"" msgstr "помилка ÑинтакÑиÑу, очікувавÑÑ \"FOR\"" -#: pl_gram.y:2193 +#: pl_gram.y:2168 #, c-format msgid "FETCH statement cannot return multiple rows" msgstr "Оператор FETCH не може повернути декілька Ñ€Ñдків" -#: pl_gram.y:2290 +#: pl_gram.y:2265 #, c-format msgid "cursor variable must be a simple variable" msgstr "змінна-курÑор повинна бути проÑтою змінною" -#: pl_gram.y:2296 +#: pl_gram.y:2271 #, c-format msgid "variable \"%s\" must be of type cursor or refcursor" msgstr "змінна \"%s\" повинна бути типу cursor або refcursor" -#: pl_gram.y:2627 pl_gram.y:2638 +#: pl_gram.y:2603 pl_gram.y:2614 #, c-format msgid "\"%s\" is not a known variable" msgstr "\"%s\" - невідома змінна" -#: pl_gram.y:2744 pl_gram.y:2754 pl_gram.y:2910 +#: pl_gram.y:2719 pl_gram.y:2729 pl_gram.y:2911 msgid "mismatched parentheses" msgstr "неузгоджені дужки" -#: pl_gram.y:2758 +#: pl_gram.y:2733 #, c-format msgid "missing \"%s\" at end of SQL expression" msgstr "пропущено \"%s\" в кінці виразу SQL" -#: pl_gram.y:2764 +#: pl_gram.y:2739 #, c-format msgid "missing \"%s\" at end of SQL statement" msgstr "пропущено \"%s\" в кінці оператора SQL" -#: pl_gram.y:2781 +#: pl_gram.y:2758 msgid "missing expression" msgstr "пропущено вираз" -#: pl_gram.y:2783 +#: pl_gram.y:2760 msgid "missing SQL statement" msgstr "пропущений оператор SQL" -#: pl_gram.y:2912 +#: pl_gram.y:2889 +msgid "syntax error, expected \"]\"" +msgstr "помилка ÑинтакÑиÑу, очікувалоÑÑŒ \"]\"" + +#: pl_gram.y:2913 msgid "incomplete data type declaration" msgstr "неповне Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ даних" -#: pl_gram.y:2935 +#: pl_gram.y:2936 msgid "missing data type declaration" msgstr "пропущено Ð¾Ð³Ð¾Ð»Ð¾ÑˆÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ даних" -#: pl_gram.y:3015 +#: pl_gram.y:3071 msgid "INTO specified more than once" msgstr "INTO вказано неодноразово" -#: pl_gram.y:3185 +#: pl_gram.y:3241 msgid "expected FROM or IN" msgstr "очікувалоÑÑŒ FROM або IN" -#: pl_gram.y:3246 +#: pl_gram.y:3302 #, c-format msgid "RETURN cannot have a parameter in function returning set" msgstr "Ð’ функції, Ñка повертає набір, RETURN не може мати параметр" -#: pl_gram.y:3247 +#: pl_gram.y:3303 #, c-format msgid "Use RETURN NEXT or RETURN QUERY." msgstr "ВикориÑтайте RETURN NEXT або RETURN QUERY." -#: pl_gram.y:3257 +#: pl_gram.y:3313 #, c-format msgid "RETURN cannot have a parameter in a procedure" msgstr "Ð’ процедурі RETURN не може мати параметр" -#: pl_gram.y:3262 +#: pl_gram.y:3318 #, c-format msgid "RETURN cannot have a parameter in function returning void" msgstr "Ð’ функції, Ñка не повертає нічого, RETURN не може мати параметр" -#: pl_gram.y:3271 +#: pl_gram.y:3327 #, c-format msgid "RETURN cannot have a parameter in function with OUT parameters" msgstr "Ð’ функції з параметрами OUT, RETURN не може мати параметр" -#: pl_gram.y:3334 +#: pl_gram.y:3390 #, c-format msgid "RETURN NEXT cannot have a parameter in function with OUT parameters" msgstr "Ð’ функції з параметрами OUT, RETURN NEXT не може мати параметр" -#: pl_gram.y:3500 +#: pl_gram.y:3556 #, c-format msgid "record variable cannot be part of multiple-item INTO list" msgstr "змінна типу Ð·Ð°Ð¿Ð¸Ñ Ð½Ðµ може бути чаÑтиною ÑпиÑка INTO з декількома елементами" -#: pl_gram.y:3546 +#: pl_gram.y:3602 #, c-format msgid "too many INTO variables specified" msgstr "вказано занадто багато змінних INTO" -#: pl_gram.y:3754 +#: pl_gram.y:3810 #, c-format msgid "end label \"%s\" specified for unlabeled block" msgstr "кінцева мітка \"%s\" вказана Ð´Ð»Ñ Ð½ÐµÐ²Ñ–Ð´Ð¼Ñ–Ñ‡ÐµÐ½Ð¾Ð³Ð¾ блоку" -#: pl_gram.y:3761 +#: pl_gram.y:3817 #, c-format msgid "end label \"%s\" differs from block's label \"%s\"" msgstr "кінцева мітка \"%s\" відрізнÑєтьÑÑ Ð²Ñ–Ð´ мітки блоку \"%s\"" -#: pl_gram.y:3795 +#: pl_gram.y:3851 #, c-format msgid "cursor \"%s\" has no arguments" msgstr "курÑор \"%s\" не має аргументів" -#: pl_gram.y:3809 +#: pl_gram.y:3865 #, c-format msgid "cursor \"%s\" has arguments" msgstr "курÑор \"%s\" має аргументи" -#: pl_gram.y:3851 +#: pl_gram.y:3907 #, c-format msgid "cursor \"%s\" has no argument named \"%s\"" msgstr "курÑор \"%s\" не має аргументу \"%s\"" -#: pl_gram.y:3871 +#: pl_gram.y:3927 #, c-format msgid "value for parameter \"%s\" of cursor \"%s\" specified more than once" msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð° \"%s\" курÑора \"%s\" вказано неодноразово" -#: pl_gram.y:3896 +#: pl_gram.y:3948 #, c-format msgid "not enough arguments for cursor \"%s\"" msgstr "недоÑтатньо аргументів Ð´Ð»Ñ ÐºÑƒÑ€Ñора \"%s\"" -#: pl_gram.y:3903 +#: pl_gram.y:3955 #, c-format msgid "too many arguments for cursor \"%s\"" msgstr "занадто багато аргументів Ð´Ð»Ñ ÐºÑƒÑ€Ñора \"%s\"" -#: pl_gram.y:3989 +#: pl_gram.y:4041 msgid "unrecognized RAISE statement option" msgstr "нерозпізнаний параметр оператора RAISE" -#: pl_gram.y:3993 +#: pl_gram.y:4045 msgid "syntax error, expected \"=\"" msgstr "помилка ÑинтакÑиÑу, очікувалоÑÑŒ \"=\"" -#: pl_gram.y:4034 +#: pl_gram.y:4086 #, c-format msgid "too many parameters specified for RAISE" msgstr "занадто багато параметрів вказано Ð´Ð»Ñ RAISE" -#: pl_gram.y:4038 +#: pl_gram.y:4090 #, c-format msgid "too few parameters specified for RAISE" msgstr "занадто мало параметрів вказано Ð´Ð»Ñ RAISE" @@ -839,13 +853,13 @@ msgid "List of programming constructs that should produce an error." msgstr "СпиÑок програмних конÑтрукцій, Ñкі повинні видавати помилку." #. translator: %s is typically the translation of "syntax error" -#: pl_scanner.c:508 +#: pl_scanner.c:525 #, c-format msgid "%s at end of input" msgstr "%s в кінці введеннÑ" #. translator: first %s is typically the translation of "syntax error" -#: pl_scanner.c:524 +#: pl_scanner.c:541 #, c-format msgid "%s at or near \"%s\"" msgstr "%s в або поблизу \"%s\"" diff --git a/src/pl/plpgsql/src/sql/plpgsql_array.sql b/src/pl/plpgsql/src/sql/plpgsql_array.sql index 4c3f26be1011d..4b9ff51594899 100644 --- a/src/pl/plpgsql/src/sql/plpgsql_array.sql +++ b/src/pl/plpgsql/src/sql/plpgsql_array.sql @@ -77,3 +77,74 @@ begin a[1] := 2; raise notice 'a = %', a; end$$; do $$ declare a complex; begin a.r[1] := 2; raise notice 'a = %', a; end$$; + +-- +-- test of %type[] and %rowtype[] syntax +-- + +-- check supported syntax +do $$ +declare + v int; + v1 v%type; + v2 v%type[]; + v3 v%type[1]; + v4 v%type[][]; + v5 v%type[1][3]; + v6 v%type array; + v7 v%type array[]; + v8 v%type array[1]; + v9 v%type array[1][1]; + v10 pg_catalog.pg_class%rowtype[]; +begin + raise notice '%', pg_typeof(v1); + raise notice '%', pg_typeof(v2); + raise notice '%', pg_typeof(v3); + raise notice '%', pg_typeof(v4); + raise notice '%', pg_typeof(v5); + raise notice '%', pg_typeof(v6); + raise notice '%', pg_typeof(v7); + raise notice '%', pg_typeof(v8); + raise notice '%', pg_typeof(v9); + raise notice '%', pg_typeof(v10); +end; +$$; + +-- some types don't support arrays +do $$ +declare + v pg_node_tree; + v1 v%type[]; +begin +end; +$$; + +-- check functionality +do $$ +declare + v1 int; + v2 varchar; + a1 v1%type[]; + a2 v2%type[]; +begin + v1 := 10; + v2 := 'Hi'; + a1 := array[v1,v1]; + a2 := array[v2,v2]; + raise notice '% %', a1, a2; +end; +$$; + +create table array_test_table(a int, b varchar); + +insert into array_test_table values(1, 'first'), (2, 'second'); + +do $$ +declare tg array_test_table%rowtype[]; +begin + tg := array(select array_test_table from array_test_table); + raise notice '%', tg; + tg := array(select row(a,b) from array_test_table); + raise notice '%', tg; +end; +$$; diff --git a/src/pl/plpgsql/src/sql/plpgsql_call.sql b/src/pl/plpgsql/src/sql/plpgsql_call.sql index 5028398348035..08c1659ef1564 100644 --- a/src/pl/plpgsql/src/sql/plpgsql_call.sql +++ b/src/pl/plpgsql/src/sql/plpgsql_call.sql @@ -38,6 +38,24 @@ CALL test_proc3(55); SELECT * FROM test1; +-- Check that plan revalidation doesn't prevent setting transaction properties +-- (bug #18059). This test must include the first temp-object creation in +-- this script, or it won't exercise the bug scenario. Hence we put it early. +CREATE PROCEDURE test_proc3a() +LANGUAGE plpgsql +AS $$ +BEGIN + COMMIT; + SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; + RAISE NOTICE 'done'; +END; +$$; + +CALL test_proc3a(); +CREATE TEMP TABLE tt1(f1 int); +CALL test_proc3a(); + + -- nested CALL TRUNCATE TABLE test1; @@ -357,6 +375,36 @@ BEGIN END $$; +-- polymorphic OUT arguments + +CREATE PROCEDURE test_proc12(a anyelement, OUT b anyelement, OUT c anyarray) +LANGUAGE plpgsql +AS $$ +BEGIN + RAISE NOTICE 'a: %', a; + b := a; + c := array[a]; +END; +$$; + +DO $$ +DECLARE _a int; _b int; _c int[]; +BEGIN + _a := 10; + CALL test_proc12(_a, _b, _c); + RAISE NOTICE '_a: %, _b: %, _c: %', _a, _b, _c; +END +$$; + +DO $$ +DECLARE _a int; _b int; _c text[]; +BEGIN + _a := 10; + CALL test_proc12(_a, _b, _c); -- error + RAISE NOTICE '_a: %, _b: %, _c: %', _a, _b, _c; +END +$$; + -- transition variable assignment @@ -436,3 +484,108 @@ BEGIN RAISE NOTICE '%', v_Text; END; $$; + + +-- check that we detect change of dependencies in CALL +-- atomic and non-atomic call sites used to do this differently, so check both + +CREATE PROCEDURE inner_p (f1 int) +AS $$ +BEGIN + RAISE NOTICE 'inner_p(%)', f1; +END +$$ LANGUAGE plpgsql; + +CREATE FUNCTION f(int) RETURNS int AS $$ SELECT $1 + 1 $$ LANGUAGE sql; + +CREATE PROCEDURE outer_p (f1 int) +AS $$ +BEGIN + RAISE NOTICE 'outer_p(%)', f1; + CALL inner_p(f(f1)); +END +$$ LANGUAGE plpgsql; + +CREATE FUNCTION outer_f (f1 int) RETURNS void +AS $$ +BEGIN + RAISE NOTICE 'outer_f(%)', f1; + CALL inner_p(f(f1)); +END +$$ LANGUAGE plpgsql; + +CALL outer_p(42); +SELECT outer_f(42); + +DROP FUNCTION f(int); +CREATE FUNCTION f(int) RETURNS int AS $$ SELECT $1 + 2 $$ LANGUAGE sql; + +CALL outer_p(42); +SELECT outer_f(42); + +-- Check that stable functions in CALL see the correct snapshot + +CREATE TABLE t_test (x int); +INSERT INTO t_test VALUES (0); + +CREATE FUNCTION f_get_x () RETURNS int +AS $$ +DECLARE l_result int; +BEGIN + SELECT x INTO l_result FROM t_test; + RETURN l_result; +END +$$ LANGUAGE plpgsql STABLE; + +CREATE PROCEDURE f_print_x (x int) +AS $$ +BEGIN + RAISE NOTICE 'f_print_x(%)', x; +END +$$ LANGUAGE plpgsql; + +-- test in non-atomic context +DO $$ +BEGIN + UPDATE t_test SET x = x + 1; + RAISE NOTICE 'f_get_x(%)', f_get_x(); + CALL f_print_x(f_get_x()); + UPDATE t_test SET x = x + 1; + RAISE NOTICE 'f_get_x(%)', f_get_x(); + CALL f_print_x(f_get_x()); + ROLLBACK; +END +$$; + +-- test in non-atomic context, except exception block is locally atomic +DO $$ +BEGIN + BEGIN + UPDATE t_test SET x = x + 1; + RAISE NOTICE 'f_get_x(%)', f_get_x(); + CALL f_print_x(f_get_x()); + UPDATE t_test SET x = x + 1; + RAISE NOTICE 'f_get_x(%)', f_get_x(); + CALL f_print_x(f_get_x()); + EXCEPTION WHEN division_by_zero THEN + RAISE NOTICE '%', SQLERRM; + END; + ROLLBACK; +END +$$; + +-- test in atomic context +BEGIN; + +DO $$ +BEGIN + UPDATE t_test SET x = x + 1; + RAISE NOTICE 'f_get_x(%)', f_get_x(); + CALL f_print_x(f_get_x()); + UPDATE t_test SET x = x + 1; + RAISE NOTICE 'f_get_x(%)', f_get_x(); + CALL f_print_x(f_get_x()); +END +$$; + +ROLLBACK; diff --git a/src/pl/plpgsql/src/sql/plpgsql_control.sql b/src/pl/plpgsql/src/sql/plpgsql_control.sql index ed7231134f4df..8e007c51dcaeb 100644 --- a/src/pl/plpgsql/src/sql/plpgsql_control.sql +++ b/src/pl/plpgsql/src/sql/plpgsql_control.sql @@ -486,3 +486,17 @@ select case_test(1); select case_test(2); select case_test(12); select case_test(13); + +-- test line comment between WHEN and THEN +create or replace function case_comment(int) returns text as $$ +begin + case $1 + when 1 -- comment before THEN + then return 'one'; + else + return 'other'; + end case; +end; +$$ language plpgsql immutable; + +select case_comment(1); diff --git a/src/pl/plpgsql/src/sql/plpgsql_misc.sql b/src/pl/plpgsql/src/sql/plpgsql_misc.sql new file mode 100644 index 0000000000000..d3a7f703a758d --- /dev/null +++ b/src/pl/plpgsql/src/sql/plpgsql_misc.sql @@ -0,0 +1,39 @@ +-- +-- Miscellaneous topics +-- + +-- Verify that we can parse new-style CREATE FUNCTION/PROCEDURE +do +$$ + declare procedure int; -- check we still recognize non-keywords as vars + begin + create function test1() returns int + begin atomic + select 2 + 2; + end; + create or replace procedure test2(x int) + begin atomic + select x + 2; + end; + end +$$; + +\sf test1 +\sf test2 + +-- Test %TYPE and %ROWTYPE error cases +create table misc_table(f1 int); + +do $$ declare x foo%type; begin end $$; +do $$ declare x notice%type; begin end $$; -- covers unreserved-keyword case +do $$ declare x foo.bar%type; begin end $$; +do $$ declare x foo.bar.baz%type; begin end $$; +do $$ declare x public.foo.bar%type; begin end $$; +do $$ declare x public.misc_table.zed%type; begin end $$; + +do $$ declare x foo%rowtype; begin end $$; +do $$ declare x notice%rowtype; begin end $$; -- covers unreserved-keyword case +do $$ declare x foo.bar%rowtype; begin end $$; +do $$ declare x foo.bar.baz%rowtype; begin end $$; +do $$ declare x public.foo%rowtype; begin end $$; +do $$ declare x public.misc_table%rowtype; begin end $$; diff --git a/src/pl/plpgsql/src/sql/plpgsql_record.sql b/src/pl/plpgsql/src/sql/plpgsql_record.sql index db655335b1eed..96dcc414e9205 100644 --- a/src/pl/plpgsql/src/sql/plpgsql_record.sql +++ b/src/pl/plpgsql/src/sql/plpgsql_record.sql @@ -199,6 +199,46 @@ begin raise notice 'r1.nosuchfield = %', r1.nosuchfield; end$$; +-- check %type with block-qualified variable names +do $$ +<> +declare + v int; + r two_int8s; + v1 v%type; + v2 blk.v%type; + r1 r%type; + r2 blk.r%type; +begin + raise notice '%', pg_typeof(v1); + raise notice '%', pg_typeof(v2); + raise notice '%', pg_typeof(r1); + raise notice '%', pg_typeof(r2); +end$$; + +-- check that type record can be passed through %type +do $$ +declare r1 record; + r2 r1%type; +begin + r2 := row(1,2); + raise notice 'r2 = %', r2; + r2 := row(3,4,5); + raise notice 'r2 = %', r2; +end$$; + +-- arrays of record are not supported at the moment +do $$ +declare r1 record[]; +begin +end$$; + +do $$ +declare r1 record; + r2 r1%type[]; +begin +end$$; + -- check repeated assignments to composite fields create table some_table (id int, data text); diff --git a/src/pl/plpgsql/src/sql/plpgsql_simple.sql b/src/pl/plpgsql/src/sql/plpgsql_simple.sql index 57020d22d60a9..72d8afe4500d1 100644 --- a/src/pl/plpgsql/src/sql/plpgsql_simple.sql +++ b/src/pl/plpgsql/src/sql/plpgsql_simple.sql @@ -80,3 +80,37 @@ create or replace function simplesql() returns int language sql as $$select 2 + 2$$; select simplecaller(); + + +-- Check case where called function changes from non-SRF to SRF (bug #18497) + +create or replace function simplecaller() returns int language plpgsql +as $$ +declare x int; +begin + x := simplesql(); + return x; +end$$; + +select simplecaller(); + +drop function simplesql(); + +create function simplesql() returns setof int language sql +as $$select 22 + 22$$; + +select simplecaller(); + +select simplecaller(); + +-- Check handling of simple expression in a scrollable cursor (bug #18859) + +do $$ +declare + p_CurData refcursor; + val int; +begin + open p_CurData scroll for select 42; + fetch p_CurData into val; + raise notice 'val = %', val; +end; $$; diff --git a/src/pl/plpython/Makefile b/src/pl/plpython/Makefile index 6b1865c2402ca..f959083a0bdec 100644 --- a/src/pl/plpython/Makefile +++ b/src/pl/plpython/Makefile @@ -39,6 +39,7 @@ DATA = $(NAME)u.control $(NAME)u--1.0.sql # header files to install - it's not clear which of these might be needed # so install them all. INCS = plpython.h \ + plpython_system.h \ plpy_cursorobject.h \ plpy_elog.h \ plpy_exec.h \ @@ -120,7 +121,7 @@ install-data: installdirs uninstall-data: rm -f $(addprefix '$(DESTDIR)$(datadir)/extension'/, $(notdir $(DATA))) - rm -f $(addprefix '$(DESTDIR)$(includedir_server)'/, plpython.h plpy_util.h) + rm -f $(addprefix '$(DESTDIR)$(includedir_server)'/, $(INCS)) .PHONY: install-data uninstall-data @@ -142,6 +143,7 @@ clean distclean: clean-lib ifeq ($(PORTNAME), win32) rm -f python${pytverstr}.def endif + rm -f spiexceptions.h # Force this dependency to be known even without dependency info built: @@ -149,8 +151,3 @@ plpy_plpymodule.o: spiexceptions.h spiexceptions.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-spiexceptions.pl $(PERL) $(srcdir)/generate-spiexceptions.pl $< > $@ - -distprep: spiexceptions.h - -maintainer-clean: distclean - rm -f spiexceptions.h diff --git a/src/pl/plpython/expected/plpython_composite.out b/src/pl/plpython/expected/plpython_composite.out index bb101e07d539f..674af93ddcfe0 100644 --- a/src/pl/plpython/expected/plpython_composite.out +++ b/src/pl/plpython/expected/plpython_composite.out @@ -569,6 +569,20 @@ SELECT * FROM return_record_2('v3') AS (v1 int, v2 int, v3 int); 1 | 2 | 3 (1 row) +-- recursion with a different inner result type didn't use to work +CREATE FUNCTION return_record_3(t text) RETURNS record AS $$ +if t == "text": + plpy.execute("SELECT * FROM return_record_3('int') AS (a int)"); + return { "a": "x" } +elif t == "int": + return { "a": 1 } +$$ LANGUAGE plpython3u; +SELECT * FROM return_record_3('text') AS (a text); + a +--- + x +(1 row) + -- multi-dimensional array of composite types. CREATE FUNCTION composite_type_as_list() RETURNS type_record[] AS $$ return [[('first', 1), ('second', 1)], [('first', 2), ('second', 2)], [('first', 3), ('second', 3)]]; diff --git a/src/pl/plpython/expected/plpython_error.out b/src/pl/plpython/expected/plpython_error.out index 9af7ea7292df4..68722b00097ed 100644 --- a/src/pl/plpython/expected/plpython_error.out +++ b/src/pl/plpython/expected/plpython_error.out @@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc" 1 (1 row) +/* test error logged with an underlying exception that includes a detail + * string (bug #18070). + */ +CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$ + plan = plpy.prepare("SELECT to_date('xy', 'DD') d") + for row in plpy.cursor(plan): + yield row['d'] +$$ LANGUAGE plpython3u; +SELECT python_error_detail(); +ERROR: error fetching next item from iterator +DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD" +CONTEXT: Traceback (most recent call last): +PL/Python function "python_error_detail" diff --git a/src/pl/plpython/expected/plpython_error_5.out b/src/pl/plpython/expected/plpython_error_5.out index 7fe864a1a576d..fd9cd73be743a 100644 --- a/src/pl/plpython/expected/plpython_error_5.out +++ b/src/pl/plpython/expected/plpython_error_5.out @@ -445,3 +445,16 @@ PL/Python function "notice_outerfunc" 1 (1 row) +/* test error logged with an underlying exception that includes a detail + * string (bug #18070). + */ +CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$ + plan = plpy.prepare("SELECT to_date('xy', 'DD') d") + for row in plpy.cursor(plan): + yield row['d'] +$$ LANGUAGE plpython3u; +SELECT python_error_detail(); +ERROR: error fetching next item from iterator +DETAIL: spiexceptions.InvalidDatetimeFormat: invalid value "xy" for "DD" +CONTEXT: Traceback (most recent call last): +PL/Python function "python_error_detail" diff --git a/src/pl/plpython/expected/plpython_trigger.out b/src/pl/plpython/expected/plpython_trigger.out index dd1ca32fa4953..4cb90cb520493 100644 --- a/src/pl/plpython/expected/plpython_trigger.out +++ b/src/pl/plpython/expected/plpython_trigger.out @@ -618,3 +618,30 @@ SELECT * FROM trigger_test_generated; ---+--- (0 rows) +-- recursive call of a trigger mustn't corrupt TD (bug #18456) +CREATE TABLE recursive_trigger_test (a int, b int); +CREATE FUNCTION recursive_trigger_func() RETURNS trigger +LANGUAGE plpython3u +AS $$ +if TD["event"] == "UPDATE": + plpy.execute("INSERT INTO recursive_trigger_test VALUES (1, 2)") + plpy.notice("TD[event] => " + str(TD["event"]) + ", expecting UPDATE"); +else: + plpy.notice("TD[event] => " + str(TD["event"]) + ", expecting INSERT"); +return None +$$; +CREATE TRIGGER recursive_trigger_trig + AFTER INSERT OR UPDATE ON recursive_trigger_test + FOR EACH ROW EXECUTE PROCEDURE recursive_trigger_func(); +INSERT INTO recursive_trigger_test VALUES (0, 0); +NOTICE: TD[event] => INSERT, expecting INSERT +UPDATE recursive_trigger_test SET a = 11 WHERE b = 0; +NOTICE: TD[event] => INSERT, expecting INSERT +NOTICE: TD[event] => UPDATE, expecting UPDATE +SELECT * FROM recursive_trigger_test; + a | b +----+--- + 11 | 0 + 1 | 2 +(2 rows) + diff --git a/src/pl/plpython/generate-spiexceptions.pl b/src/pl/plpython/generate-spiexceptions.pl index 61b37c3541707..f0c5142be3c60 100644 --- a/src/pl/plpython/generate-spiexceptions.pl +++ b/src/pl/plpython/generate-spiexceptions.pl @@ -1,10 +1,10 @@ #!/usr/bin/perl # # Generate the spiexceptions.h header from errcodes.txt -# Copyright (c) 2000-2023, PostgreSQL Global Development Group +# Copyright (c) 2000-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; print "/* autogenerated from src/backend/utils/errcodes.txt, do not edit */\n"; diff --git a/src/pl/plpython/meson.build b/src/pl/plpython/meson.build index 9f4603a8b5e14..a2787da649bfd 100644 --- a/src/pl/plpython/meson.build +++ b/src/pl/plpython/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not python3_dep.found() subdir_done() @@ -67,6 +67,7 @@ install_headers( 'plpy_typeio.h', 'plpy_util.h', 'plpython.h', + 'plpython_system.h', install_dir: dir_include_server, ) diff --git a/src/pl/plpython/nls.mk b/src/pl/plpython/nls.mk index e7a25ca01367d..f6aafcf249467 100644 --- a/src/pl/plpython/nls.mk +++ b/src/pl/plpython/nls.mk @@ -12,9 +12,12 @@ GETTEXT_FILES = plpy_cursorobject.c \ plpy_subxactobject.c \ plpy_typeio.c \ plpy_util.c -GETTEXT_TRIGGERS = $(BACKEND_COMMON_GETTEXT_TRIGGERS) PLy_elog:2 PLy_exception_set:2 PLy_exception_set_plural:2,3 +GETTEXT_TRIGGERS = $(BACKEND_COMMON_GETTEXT_TRIGGERS) \ + PLy_elog:2 \ + PLy_exception_set:2 \ + PLy_exception_set_plural:2,3 GETTEXT_FLAGS = $(BACKEND_COMMON_GETTEXT_FLAGS) \ - PLy_elog:2:c-format \ - PLy_exception_set:2:c-format \ - PLy_exception_set_plural:2:c-format \ - PLy_exception_set_plural:3:c-format + PLy_elog:2:c-format \ + PLy_exception_set:2:c-format \ + PLy_exception_set_plural:2:c-format \ + PLy_exception_set_plural:3:c-format diff --git a/src/pl/plpython/plpy_cursorobject.c b/src/pl/plpython/plpy_cursorobject.c index 57e8f8ec2170b..551dea75b5ecb 100644 --- a/src/pl/plpython/plpy_cursorobject.c +++ b/src/pl/plpython/plpy_cursorobject.c @@ -142,7 +142,6 @@ PLy_cursor_plan(PyObject *ob, PyObject *args) { PLyCursorObject *cursor; volatile int nargs; - int i; PLyPlanObject *plan; PLyExecutionContext *exec_ctx = PLy_current_execution_context(); volatile MemoryContext oldcontext; @@ -201,13 +200,30 @@ PLy_cursor_plan(PyObject *ob, PyObject *args) PG_TRY(); { Portal portal; + MemoryContext tmpcontext; + Datum *volatile values; char *volatile nulls; volatile int j; + /* + * Converted arguments and associated cruft will be in this context, + * which is local to our subtransaction. + */ + tmpcontext = AllocSetContextCreate(CurTransactionContext, + "PL/Python temporary context", + ALLOCSET_SMALL_SIZES); + MemoryContextSwitchTo(tmpcontext); + if (nargs > 0) - nulls = palloc(nargs * sizeof(char)); + { + values = (Datum *) palloc(nargs * sizeof(Datum)); + nulls = (char *) palloc(nargs * sizeof(char)); + } else + { + values = NULL; nulls = NULL; + } for (j = 0; j < nargs; j++) { @@ -219,7 +235,7 @@ PLy_cursor_plan(PyObject *ob, PyObject *args) { bool isnull; - plan->values[j] = PLy_output_convert(arg, elem, &isnull); + values[j] = PLy_output_convert(arg, elem, &isnull); nulls[j] = isnull ? 'n' : ' '; } PG_FINALLY(2); @@ -229,7 +245,9 @@ PLy_cursor_plan(PyObject *ob, PyObject *args) PG_END_TRY(2); } - portal = SPI_cursor_open(NULL, plan->plan, plan->values, nulls, + MemoryContextSwitchTo(oldcontext); + + portal = SPI_cursor_open(NULL, plan->plan, values, nulls, exec_ctx->curr_proc->fn_readonly); if (portal == NULL) elog(ERROR, "SPI_cursor_open() failed: %s", @@ -239,40 +257,18 @@ PLy_cursor_plan(PyObject *ob, PyObject *args) PinPortal(portal); + MemoryContextDelete(tmpcontext); PLy_spi_subtransaction_commit(oldcontext, oldowner); } PG_CATCH(); { - int k; - - /* cleanup plan->values array */ - for (k = 0; k < nargs; k++) - { - if (!plan->args[k].typbyval && - (plan->values[k] != PointerGetDatum(NULL))) - { - pfree(DatumGetPointer(plan->values[k])); - plan->values[k] = PointerGetDatum(NULL); - } - } - Py_DECREF(cursor); - + /* Subtransaction abort will remove the tmpcontext */ PLy_spi_subtransaction_abort(oldcontext, oldowner); return NULL; } PG_END_TRY(); - for (i = 0; i < nargs; i++) - { - if (!plan->args[i].typbyval && - (plan->values[i] != PointerGetDatum(NULL))) - { - pfree(DatumGetPointer(plan->values[i])); - plan->values[i] = PointerGetDatum(NULL); - } - } - Assert(cursor->portalname != NULL); return (PyObject *) cursor; } diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.c index 7c627eacfbf71..70de5ba13d74b 100644 --- a/src/pl/plpython/plpy_elog.c +++ b/src/pl/plpython/plpy_elog.c @@ -103,9 +103,6 @@ PLy_elog_impl(int elevel, const char *fmt,...) } primary = emsg.data; - /* Since we have a format string, we cannot have a SPI detail. */ - Assert(detail == NULL); - /* If there's an exception message, it goes in the detail. */ if (xmsg) detail = xmsg; diff --git a/src/pl/plpython/plpy_exec.c b/src/pl/plpython/plpy_exec.c index e06fde1dd90f0..157229e96f6a3 100644 --- a/src/pl/plpython/plpy_exec.c +++ b/src/pl/plpython/plpy_exec.c @@ -231,7 +231,23 @@ PLy_exec_function(FunctionCallInfo fcinfo, PLyProcedure *proc) } else { - /* Normal conversion of result */ + /* + * Normal conversion of result. However, if the result is of type + * RECORD, we have to set up for that each time through, since it + * might be different from last time. + */ + if (proc->result.typoid == RECORDOID) + { + TupleDesc desc; + + if (get_call_result_type(fcinfo, NULL, &desc) != TYPEFUNC_COMPOSITE) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("function returning record called in context " + "that cannot accept type record"))); + PLy_output_setup_record(&proc->result, desc, proc); + } + rv = PLy_output_convert(&proc->result, plrv, &fcinfo->isnull); } @@ -335,6 +351,13 @@ PLy_exec_trigger(FunctionCallInfo fcinfo, PLyProcedure *proc) PLy_output_setup_tuple(&proc->result, rel_descr, proc); PLy_input_setup_tuple(&proc->result_in, rel_descr, proc); + /* + * If the trigger is called recursively, we must push outer-level + * arguments into the stack. This must be immediately before the PG_TRY + * to ensure that the corresponding pop happens. + */ + PLy_global_args_push(proc); + PG_TRY(); { int rc PG_USED_FOR_ASSERTS_ONLY; @@ -397,6 +420,7 @@ PLy_exec_trigger(FunctionCallInfo fcinfo, PLyProcedure *proc) } PG_FINALLY(); { + PLy_global_args_pop(proc); Py_XDECREF(plargs); Py_XDECREF(plrv); } @@ -448,21 +472,6 @@ PLy_function_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc) PLy_elog(ERROR, "PyDict_SetItemString() failed, while setting up arguments"); arg = NULL; } - - /* Set up output conversion for functions returning RECORD */ - if (proc->result.typoid == RECORDOID) - { - TupleDesc desc; - - if (get_call_result_type(fcinfo, NULL, &desc) != TYPEFUNC_COMPOSITE) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("function returning record called in context " - "that cannot accept type record"))); - - /* cache the output conversion functions */ - PLy_output_setup_record(&proc->result, desc, proc); - } } PG_CATCH(); { @@ -501,6 +510,13 @@ PLy_function_save_args(PLyProcedure *proc) result->args = PyDict_GetItemString(proc->globals, "args"); Py_XINCREF(result->args); + /* If it's a trigger, also save "TD" */ + if (proc->is_trigger) + { + result->td = PyDict_GetItemString(proc->globals, "TD"); + Py_XINCREF(result->td); + } + /* Fetch all the named arguments */ if (proc->argnames) { @@ -550,6 +566,13 @@ PLy_function_restore_args(PLyProcedure *proc, PLySavedArgs *savedargs) Py_DECREF(savedargs->args); } + /* Restore the "TD" object, too */ + if (savedargs->td) + { + PyDict_SetItemString(proc->globals, "TD", savedargs->td); + Py_DECREF(savedargs->td); + } + /* And free the PLySavedArgs struct */ pfree(savedargs); } @@ -568,8 +591,9 @@ PLy_function_drop_args(PLySavedArgs *savedargs) Py_XDECREF(savedargs->namedargs[i]); } - /* Drop ref to the "args" object, too */ + /* Drop refs to the "args" and "TD" objects, too */ Py_XDECREF(savedargs->args); + Py_XDECREF(savedargs->td); /* And free the PLySavedArgs struct */ pfree(savedargs); @@ -578,9 +602,9 @@ PLy_function_drop_args(PLySavedArgs *savedargs) /* * Save away any existing arguments for the given procedure, so that we can * install new values for a recursive call. This should be invoked before - * doing PLy_function_build_args(). + * doing PLy_function_build_args() or PLy_trigger_build_args(). * - * NB: caller must ensure that PLy_global_args_pop gets invoked once, and + * NB: callers must ensure that PLy_global_args_pop gets invoked once, and * only once, per successful completion of PLy_global_args_push. Otherwise * we'll end up out-of-sync between the actual call stack and the contents * of proc->argstack. @@ -689,7 +713,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r *pltrelid, *plttablename, *plttableschema, - *pltargs = NULL, + *pltargs, *pytnew, *pytold, *pltdata; @@ -713,6 +737,11 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r return NULL; } } + else + { + Py_INCREF(Py_None); + pltargs = Py_None; + } PG_TRY(); { @@ -856,7 +885,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r PyObject *pltarg; /* pltargs should have been allocated before the PG_TRY block. */ - Assert(pltargs); + Assert(pltargs && pltargs != Py_None); for (i = 0; i < tdata->tg_trigger->tgnargs; i++) { @@ -870,8 +899,7 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure *proc, HeapTuple *r } else { - Py_INCREF(Py_None); - pltargs = Py_None; + Assert(pltargs == Py_None); } PyDict_SetItemString(pltdata, "args", pltargs); Py_DECREF(pltargs); diff --git a/src/pl/plpython/plpy_procedure.c b/src/pl/plpython/plpy_procedure.c index 79b6ef6a44878..ba7786d31c31b 100644 --- a/src/pl/plpython/plpy_procedure.c +++ b/src/pl/plpython/plpy_procedure.c @@ -8,9 +8,9 @@ #include "access/htup_details.h" #include "access/transam.h" -#include "funcapi.h" #include "catalog/pg_proc.h" #include "catalog/pg_type.h" +#include "funcapi.h" #include "plpy_elog.h" #include "plpy_main.h" #include "plpy_procedure.h" @@ -183,6 +183,7 @@ PLy_procedure_create(HeapTuple procTup, Oid fn_oid, bool is_trigger) proc->fn_readonly = (procStruct->provolatile != PROVOLATILE_VOLATILE); proc->is_setof = procStruct->proretset; proc->is_procedure = (procStruct->prokind == PROKIND_PROCEDURE); + proc->is_trigger = is_trigger; proc->src = NULL; proc->argnames = NULL; proc->args = NULL; diff --git a/src/pl/plpython/plpy_procedure.h b/src/pl/plpython/plpy_procedure.h index 8968b5c92e5a5..5db854fc8bd2d 100644 --- a/src/pl/plpython/plpy_procedure.h +++ b/src/pl/plpython/plpy_procedure.h @@ -16,6 +16,7 @@ typedef struct PLySavedArgs { struct PLySavedArgs *next; /* linked-list pointer */ PyObject *args; /* "args" element of globals dict */ + PyObject *td; /* "TD" element of globals dict, if trigger */ int nargs; /* length of namedargs array */ PyObject *namedargs[FLEXIBLE_ARRAY_MEMBER]; /* named args */ } PLySavedArgs; @@ -32,6 +33,7 @@ typedef struct PLyProcedure bool fn_readonly; bool is_setof; /* true, if function returns result set */ bool is_procedure; + bool is_trigger; /* called as trigger? */ PLyObToDatum result; /* Function result output conversion info */ PLyDatumToOb result_in; /* For converting input tuples in a trigger */ char *src; /* textual procedure code, after mangling */ diff --git a/src/pl/plpython/plpy_spi.c b/src/pl/plpython/plpy_spi.c index ff87b27de0903..d3ac35d66ae97 100644 --- a/src/pl/plpython/plpy_spi.c +++ b/src/pl/plpython/plpy_spi.c @@ -175,8 +175,7 @@ PyObject * PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit) { volatile int nargs; - int i, - rv; + int rv; PLyPlanObject *plan; volatile MemoryContext oldcontext; volatile ResourceOwner oldowner; @@ -222,13 +221,30 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit) PG_TRY(); { PLyExecutionContext *exec_ctx = PLy_current_execution_context(); + MemoryContext tmpcontext; + Datum *volatile values; char *volatile nulls; volatile int j; + /* + * Converted arguments and associated cruft will be in this context, + * which is local to our subtransaction. + */ + tmpcontext = AllocSetContextCreate(CurTransactionContext, + "PL/Python temporary context", + ALLOCSET_SMALL_SIZES); + MemoryContextSwitchTo(tmpcontext); + if (nargs > 0) - nulls = palloc(nargs * sizeof(char)); + { + values = (Datum *) palloc(nargs * sizeof(Datum)); + nulls = (char *) palloc(nargs * sizeof(char)); + } else + { + values = NULL; nulls = NULL; + } for (j = 0; j < nargs; j++) { @@ -240,7 +256,7 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit) { bool isnull; - plan->values[j] = PLy_output_convert(arg, elem, &isnull); + values[j] = PLy_output_convert(arg, elem, &isnull); nulls[j] = isnull ? 'n' : ' '; } PG_FINALLY(2); @@ -250,47 +266,23 @@ PLy_spi_execute_plan(PyObject *ob, PyObject *list, long limit) PG_END_TRY(2); } - rv = SPI_execute_plan(plan->plan, plan->values, nulls, + MemoryContextSwitchTo(oldcontext); + + rv = SPI_execute_plan(plan->plan, values, nulls, exec_ctx->curr_proc->fn_readonly, limit); ret = PLy_spi_execute_fetch_result(SPI_tuptable, SPI_processed, rv); - if (nargs > 0) - pfree(nulls); - + MemoryContextDelete(tmpcontext); PLy_spi_subtransaction_commit(oldcontext, oldowner); } PG_CATCH(); { - int k; - - /* - * cleanup plan->values array - */ - for (k = 0; k < nargs; k++) - { - if (!plan->args[k].typbyval && - (plan->values[k] != PointerGetDatum(NULL))) - { - pfree(DatumGetPointer(plan->values[k])); - plan->values[k] = PointerGetDatum(NULL); - } - } - + /* Subtransaction abort will remove the tmpcontext */ PLy_spi_subtransaction_abort(oldcontext, oldowner); return NULL; } PG_END_TRY(); - for (i = 0; i < nargs; i++) - { - if (!plan->args[i].typbyval && - (plan->values[i] != PointerGetDatum(NULL))) - { - pfree(DatumGetPointer(plan->values[i])); - plan->values[i] = PointerGetDatum(NULL); - } - } - if (rv < 0) { PLy_exception_set(PLy_exc_spi_error, diff --git a/src/pl/plpython/plpython.h b/src/pl/plpython/plpython.h index 91f6f8d860705..d929afefc33e8 100644 --- a/src/pl/plpython/plpython.h +++ b/src/pl/plpython/plpython.h @@ -2,7 +2,7 @@ * * plpython.h - Python as a procedural language for PostgreSQL * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/pl/plpython/plpython.h @@ -20,27 +20,10 @@ #endif /* - * Python versions <= 3.8 otherwise define a replacement, causing macro - * redefinition warnings. + * Pull in Python headers via a wrapper header, to control the scope of + * the system_header pragma therein. */ -#define HAVE_SNPRINTF 1 - -#if defined(_MSC_VER) && defined(_DEBUG) -/* Python uses #pragma to bring in a non-default libpython on VC++ if - * _DEBUG is defined */ -#undef _DEBUG -/* Also hide away errcode, since we load Python.h before postgres.h */ -#define errcode __msvc_errcode -#include -#undef errcode -#define _DEBUG -#elif defined (_MSC_VER) -#define errcode __msvc_errcode -#include -#undef errcode -#else -#include -#endif +#include "plpython_system.h" /* define our text domain for translations */ #undef TEXTDOMAIN diff --git a/src/pl/plpython/plpython_system.h b/src/pl/plpython/plpython_system.h new file mode 100644 index 0000000000000..036d339bf83d0 --- /dev/null +++ b/src/pl/plpython/plpython_system.h @@ -0,0 +1,53 @@ +/*------------------------------------------------------------------------- + * + * plpython_system.h - pull in Python's system header files + * + * We break this out as a separate header file to precisely control + * the scope of the "system_header" pragma. No Postgres-specific + * declarations should be put here. However, we do include some stuff + * that is meant to prevent conflicts between our code and Python. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * src/pl/plpython/plpython_system.h + * + *------------------------------------------------------------------------- + */ +#ifndef PLPYTHON_SYSTEM_H +#define PLPYTHON_SYSTEM_H + +/* + * Newer versions of the Python headers trigger a lot of warnings with our + * preferred compiler flags (at least -Wdeclaration-after-statement is known + * to be problematic). The system_header pragma hides warnings from within + * the rest of this file, if supported. + */ +#ifdef HAVE_PRAGMA_GCC_SYSTEM_HEADER +#pragma GCC system_header +#endif + +/* + * Python versions <= 3.8 otherwise define a replacement, causing macro + * redefinition warnings. + */ +#define HAVE_SNPRINTF 1 + +#if defined(_MSC_VER) && defined(_DEBUG) +/* Python uses #pragma to bring in a non-default libpython on VC++ if + * _DEBUG is defined */ +#undef _DEBUG +/* Also hide away errcode, since we load Python.h before postgres.h */ +#define errcode __msvc_errcode +#include +#undef errcode +#define _DEBUG +#elif defined (_MSC_VER) +#define errcode __msvc_errcode +#include +#undef errcode +#else +#include +#endif + +#endif /* PLPYTHON_SYSTEM_H */ diff --git a/src/pl/plpython/po/LINGUAS b/src/pl/plpython/po/LINGUAS index 312956920df20..4cc8bed767c42 100644 --- a/src/pl/plpython/po/LINGUAS +++ b/src/pl/plpython/po/LINGUAS @@ -1 +1 @@ -cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN +cs de el es fr it ja ka ko pl pt_BR ru sv tr uk vi zh_CN zh_TW diff --git a/src/pl/plpython/po/el.po b/src/pl/plpython/po/el.po index cfe112353a0b1..a606ad11071bb 100644 --- a/src/pl/plpython/po/el.po +++ b/src/pl/plpython/po/el.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: plpython (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-07-15 06:08+0000\n" -"PO-Revision-Date: 2021-07-15 09:57+0200\n" +"POT-Creation-Date: 2023-08-15 13:38+0000\n" +"PO-Revision-Date: 2023-08-15 16:14+0200\n" "Last-Translator: Georgios Kokolatos \n" "Language-Team: \n" "Language: el\n" @@ -18,7 +18,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Poedit 2.4.3\n" +"X-Generator: Poedit 3.3.2\n" #: plpy_cursorobject.c:72 #, c-format @@ -30,12 +30,12 @@ msgstr "plpy.cursor ανέμενε ένα εÏώτημα ή ένα σχέδιο" msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor λαμβάνει μια ακολουθία ως τη δεÏτεÏη παÏάμετÏο" -#: plpy_cursorobject.c:171 plpy_spi.c:207 +#: plpy_cursorobject.c:171 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "δεν ήταν δυνατή η εκτέλεση του σχεδίου" -#: plpy_cursorobject.c:174 plpy_spi.c:210 +#: plpy_cursorobject.c:174 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" @@ -57,7 +57,7 @@ msgstr "επαναλαμβάνει ένα δÏομέα σε μία ματαιω msgid "fetch from a closed cursor" msgstr "ανάκτηση από κλειστό δÏομέα" -#: plpy_cursorobject.c:430 plpy_spi.c:403 +#: plpy_cursorobject.c:430 plpy_spi.c:401 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "το αποτέλεσμα του εÏωτήματος έχει πάÏα πολλές σειÏές για να χωÏέσει σε μια λίστα Python" @@ -67,7 +67,7 @@ msgstr "το αποτέλεσμα του εÏωτήματος έχει πάÏα msgid "closing a cursor in an aborted subtransaction" msgstr "κλείσιμο ενός δÏομέα σε μία ματαιωμένη υποσυναλλαγή" -#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:548 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" @@ -107,166 +107,166 @@ msgstr "διεÏγασία PL/Python δεν επέστÏεψε None" msgid "PL/Python function with return type \"void\" did not return None" msgstr "συνάÏτηση PL/Python με Ï„Ïπο επιστÏοφής «void» δεν επέστÏεψε None" -#: plpy_exec.c:371 plpy_exec.c:397 +#: plpy_exec.c:369 plpy_exec.c:393 #, c-format msgid "unexpected return value from trigger procedure" msgstr "μη αναμενόμενη τιμή επιστÏοφής από διεÏγασία εναÏσματος" -#: plpy_exec.c:372 +#: plpy_exec.c:370 #, c-format msgid "Expected None or a string." msgstr "Αναμενόταν None ή μία συμβολοσειÏά." -#: plpy_exec.c:387 +#: plpy_exec.c:383 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "συνάÏτηση εναÏσματος PL/Python επέστÏεψε «MODIFY» σε ένα έναυσμα DELETE -- παÏαβλέφθηκε" -#: plpy_exec.c:398 +#: plpy_exec.c:394 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Αναμενόταν None, «OK», «SKIP», ή «MODIFY»." -#: plpy_exec.c:443 +#: plpy_exec.c:444 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "PyList_SetItem() απέτυχε, κατά τη διάÏκεια ετοιμασίας των παÏαμέτÏων" -#: plpy_exec.c:447 +#: plpy_exec.c:448 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "PyDict_SetItemString() απέτυχε, κατά τη διάÏκεια ετοιμασίας των παÏαμέτÏων" -#: plpy_exec.c:459 +#: plpy_exec.c:460 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "συνάÏτηση που επιστÏέφει εγγÏαφή καλείται σε πεÏιεχόμενο που δεν δÏναται να αποδεχτεί Ï„Ïπο εγγÏαφής" -#: plpy_exec.c:676 +#: plpy_exec.c:677 #, c-format msgid "while creating return value" msgstr "κατά τη δημιουÏγία τιμής επιστÏοφής" -#: plpy_exec.c:910 +#: plpy_exec.c:924 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[«new»] διαγÏάφηκε, δεν είναι δυνατή η μετατÏοπή σειÏάς" -#: plpy_exec.c:915 +#: plpy_exec.c:929 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[«new»] δεν είναι ένα λεξικό" -#: plpy_exec.c:942 +#: plpy_exec.c:954 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "TD[«new»] κλειδί Î»ÎµÎ¾Î¹ÎºÎ¿Ï ÏƒÏ„Î· τακτή θέση %d δεν είναι μία συμβολοσειÏά" -#: plpy_exec.c:949 +#: plpy_exec.c:961 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "κλειδί «%s» που βÏίσκεται στο TD[\"New\"] δεν υπάÏχει ως στήλη στη γÏαμμή εναÏσματος" -#: plpy_exec.c:954 +#: plpy_exec.c:966 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "δεν είναι δυνατός ο οÏισμός του χαÏακτηÏÎ¹ÏƒÏ„Î¹ÎºÎ¿Ï ÏƒÏ…ÏƒÏ„Î®Î¼Î±Ï„Î¿Ï‚ «%s»" -#: plpy_exec.c:959 +#: plpy_exec.c:971 #, c-format msgid "cannot set generated column \"%s\"" msgstr "δεν είναι δυνατός ο οÏισμός δημιουÏγημένης στήλης «%s»" -#: plpy_exec.c:1017 +#: plpy_exec.c:1029 #, c-format msgid "while modifying trigger row" msgstr "κατά την Ï„Ïοποποίηση εναÏσματος σειÏάς" -#: plpy_exec.c:1075 +#: plpy_exec.c:1087 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "βίαιη ματαίωση μιας υποσυναλλαγής που δεν έχει εξέλθει" -#: plpy_main.c:121 +#: plpy_main.c:109 #, c-format msgid "multiple Python libraries are present in session" msgstr "υπάÏχουν πολλαπλές βιβλιοθήκες Python στη συνεδÏία" -#: plpy_main.c:122 +#: plpy_main.c:110 #, c-format msgid "Only one Python major version can be used in one session." msgstr "Μόνο μία κÏÏια έκδοση Python μποÏεί να χÏησιμοποιηθεί σε μία συνεδÏία." -#: plpy_main.c:138 +#: plpy_main.c:122 #, c-format msgid "untrapped error in initialization" msgstr "μη παγιδευμένο σφάλμα κατά την Ï€Ïοετοιμασία" -#: plpy_main.c:161 +#: plpy_main.c:145 #, c-format msgid "could not import \"__main__\" module" msgstr "δεν ήταν δυνατή η εισαγωγή του αÏθÏώματος «__main__»" -#: plpy_main.c:170 +#: plpy_main.c:154 #, c-format msgid "could not initialize globals" msgstr "δεν ήταν δυνατή η αÏχικοποίηση καθολικών μεταβλητών" -#: plpy_main.c:393 +#: plpy_main.c:352 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "διεÏγασία PL/Python «%s»" -#: plpy_main.c:396 +#: plpy_main.c:355 #, c-format msgid "PL/Python function \"%s\"" msgstr "συνάÏτηση PL/Python «%s»" -#: plpy_main.c:404 +#: plpy_main.c:363 #, c-format msgid "PL/Python anonymous code block" msgstr "ονώνυμο μπλοκ κώδικα PL/Python" -#: plpy_plpymodule.c:182 plpy_plpymodule.c:185 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" msgstr "δεν ήταν δυνατή η εισαγωγή του αÏθÏώματος «plpy»" -#: plpy_plpymodule.c:200 +#: plpy_plpymodule.c:182 #, c-format msgid "could not create the spiexceptions module" msgstr "δεν ήταν δυνατή η δημιουÏγία του αÏθÏώματος spiexceptions" -#: plpy_plpymodule.c:208 +#: plpy_plpymodule.c:190 #, c-format msgid "could not add the spiexceptions module" msgstr "δεν ήταν δυνατή η Ï€Ïόσθεση του αÏθÏώματος spiexceptions" -#: plpy_plpymodule.c:275 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" msgstr "δεν ήταν δυνατή η του αÏθÏώματος spiexceptions" -#: plpy_plpymodule.c:443 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "δεν ήταν δυνατή η αποσυσκευασία παÏαμέτÏων στο plpy.elog" -#: plpy_plpymodule.c:452 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" msgstr "δεν ήταν δυνατή η ανάλυση μηνυμάτος σφάλματος στο plpy.elog" -#: plpy_plpymodule.c:469 +#: plpy_plpymodule.c:451 #, c-format msgid "argument 'message' given by name and position" msgstr "παÏάμετÏος «μήνυμα» που δόθηκε με όνομα και θέση" -#: plpy_plpymodule.c:496 +#: plpy_plpymodule.c:478 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "‘%s’ είναι μία άκυÏη παÏάμετÏος με λέξη-κλειδί για αυτή τη συνάÏτηση" -#: plpy_plpymodule.c:507 plpy_plpymodule.c:513 +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" msgstr "μη έγκυÏος κωδικός SQLSTATE" @@ -286,12 +286,12 @@ msgstr "οι συναÏτήσεις PL/Python δεν μποÏοÏν να επι msgid "PL/Python functions cannot accept type %s" msgstr "οι συναÏτήσεις PL/Python δεν μποÏοÏν να δεχθοÏν Ï„Ïπο %s" -#: plpy_procedure.c:397 +#: plpy_procedure.c:395 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "δεν ήταν δυνατή η μεταγλώττιση της συνάÏτησης PL/Python «%s»" -#: plpy_procedure.c:400 +#: plpy_procedure.c:398 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "δεν ήταν δυνατή η μεταγλώττιση ανώνυμου μπλοκ κώδικα PL/Python" @@ -306,27 +306,27 @@ msgstr "η εντολή δεν παÏήγαγε ένα σÏνολο αποτελ msgid "second argument of plpy.prepare must be a sequence" msgstr "η δεÏτεÏη παÏάμετÏος του plpy.prepare επιβάλλεται να είναι μία ακολουθία" -#: plpy_spi.c:100 +#: plpy_spi.c:98 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: το όνομα Ï„Ïπου στη τακτή θέση %d δεν είναι συμβολοσειÏά" -#: plpy_spi.c:172 +#: plpy_spi.c:170 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute ανέμενε ένα εÏώτημα ή ένα σχέδιο" -#: plpy_spi.c:191 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute λαμβάνει μια ακολουθία ως δεÏτεÏη παÏάμετÏÏŒ του" -#: plpy_spi.c:299 +#: plpy_spi.c:297 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "SPI_execute_plan απέτυχε: %s" -#: plpy_spi.c:341 +#: plpy_spi.c:339 #, c-format msgid "SPI_execute failed: %s" msgstr "SPI_execute απέτυχε: %s" @@ -351,102 +351,92 @@ msgstr "δεν έχει εισέλθει σε αυτή τη υποσυναλλά msgid "there is no subtransaction to exit from" msgstr "δεν υπάÏχει υποσυναλλαγή από την οποία να εξέλθει" -#: plpy_typeio.c:587 +#: plpy_typeio.c:588 #, c-format msgid "could not import a module for Decimal constructor" msgstr "δεν ήταν δυνατή η εισαγωγή αÏθÏώματος για τον κατασκευαστή Decimal" -#: plpy_typeio.c:591 +#: plpy_typeio.c:592 #, c-format msgid "no Decimal attribute in module" msgstr "καμία ιδιότητα Decimal στο άÏθÏωμα" -#: plpy_typeio.c:597 +#: plpy_typeio.c:598 #, c-format msgid "conversion from numeric to Decimal failed" msgstr "μετατÏοπή από αÏιθμητικό σε Decimal απέτυχε" -#: plpy_typeio.c:911 +#: plpy_typeio.c:912 #, c-format msgid "could not create bytes representation of Python object" msgstr "δεν ήταν δυνατή η δημιουÏγία bytes αναπαÏάστασης του αντικειμένου Python" -#: plpy_typeio.c:1056 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" msgstr "δεν ήταν δυνατή η δημιουÏγία string αναπαÏάστασης του αντικειμένου Python" -#: plpy_typeio.c:1067 +#: plpy_typeio.c:1060 #, c-format msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" msgstr "δεν ήταν δυνατή η μετατÏοπή του αντικειμένου Python σε cstring: Η αναπαÏάσταση συμβολοσειÏάς Python φαίνεται να πεÏιέχει null bytes" -#: plpy_typeio.c:1178 +#: plpy_typeio.c:1157 #, c-format -msgid "number of array dimensions exceeds the maximum allowed (%d)" -msgstr "o αÏιθμός των διαστάσεων συστοιχίας υπεÏβαίνει το μέγιστο επιτÏεπόμενο (%d)" +msgid "return value of function with array return type is not a Python sequence" +msgstr "η τιμή επιστÏοφής της συνάÏτησης με Ï„Ïπο επιστÏοφής συστυχίας δεν είναι μία ακολουθία Python" -#: plpy_typeio.c:1183 +#: plpy_typeio.c:1202 #, c-format msgid "could not determine sequence length for function return value" msgstr "δεν ήταν δυνατός ο Ï€ÏοσδιοÏισμός του μήκους της ακολουθίας για την τιμή επιστÏοφής της συνάÏτησης" -#: plpy_typeio.c:1188 plpy_typeio.c:1194 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 #, c-format -msgid "array size exceeds the maximum allowed" -msgstr "το μέγεθος συστοιχίας υπεÏβαίνει το μέγιστο επιτÏεπόμενο" +msgid "multidimensional arrays must have array expressions with matching dimensions" +msgstr "πολυδιάστατες συστυχίες Ï€Ïέπει να πεÏιέχουν εκφÏάσεις συστυχίας με αντίστοιχο αÏιθμό διαστάσεων" -#: plpy_typeio.c:1222 +#: plpy_typeio.c:1227 #, c-format -msgid "return value of function with array return type is not a Python sequence" -msgstr "η τιμή επιστÏοφής της συνάÏτησης με Ï„Ïπο επιστÏοφής συστυχίας δεν είναι μία ακολουθία Python" - -#: plpy_typeio.c:1269 -#, c-format -msgid "wrong length of inner sequence: has length %d, but %d was expected" -msgstr "λάθος μήκος της εσωτεÏικής ακολουθίας: έχει μήκος %d , αλλά αναμενόταν %d" - -#: plpy_typeio.c:1271 -#, c-format -msgid "To construct a multidimensional array, the inner sequences must all have the same length." -msgstr "Για να κατασκευαστεί μια πολυδιάστατη συστυχία, οι εσωτεÏικές ακολουθίες Ï€Ïέπει να έχουν όλες το ίδιο μήκος." +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "o αÏιθμός των διαστάσεων συστοιχίας υπεÏβαίνει το μέγιστο επιτÏεπόμενο (%d)" -#: plpy_typeio.c:1350 +#: plpy_typeio.c:1329 #, c-format msgid "malformed record literal: \"%s\"" msgstr "κακοσχηματισμένο εγγÏαφή: «%s»" -#: plpy_typeio.c:1351 +#: plpy_typeio.c:1330 #, c-format msgid "Missing left parenthesis." msgstr "Λείπει δεξιά παÏένθεση." -#: plpy_typeio.c:1352 plpy_typeio.c:1553 +#: plpy_typeio.c:1331 plpy_typeio.c:1532 #, c-format msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." msgstr "Για να επιστÏέψετε έναν σÏνθετο Ï„Ïπο σε μία συστυχία, επιστÏέψτε τον σÏνθετο Ï„Ïπο ως πλειάδα Python, Ï€.χ. «[(‘foo’,)»." -#: plpy_typeio.c:1399 +#: plpy_typeio.c:1378 #, c-format msgid "key \"%s\" not found in mapping" msgstr "κλειδί «%s» δεν βÏέθηκε σε αντιστοίχιση" -#: plpy_typeio.c:1400 +#: plpy_typeio.c:1379 #, c-format msgid "To return null in a column, add the value None to the mapping with the key named after the column." msgstr "Για να επιστÏέψετε null σε μια στήλη, Ï€Ïοσθέστε την τιμή None στην αντιστοίχιση με το κλειδί που ονομάστηκε από τη στήλη." -#: plpy_typeio.c:1453 +#: plpy_typeio.c:1432 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "το μήκος της ακολουθίας που επιστÏάφηκε δεν ταίÏιαζε με τον αÏιθμό των στηλών στη γÏαμμή" -#: plpy_typeio.c:1551 +#: plpy_typeio.c:1530 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "η ιδιότητα «%s» δεν υπάÏχει στο αντικείμενο Python" -#: plpy_typeio.c:1554 +#: plpy_typeio.c:1533 #, c-format msgid "To return null in a column, let the returned object have an attribute named after column with value None." msgstr "Για να επιστÏέψετε null σε μια στήλη, αφήστε το αντικείμενο που επιστÏάφηκε να έχει ένα χαÏακτηÏιστικό που ονομάζεται από την στήλη με τιμή None." @@ -460,3 +450,12 @@ msgstr "δεν ήταν δυνατή η μετατÏοπή του αντικει #, c-format msgid "could not extract bytes from encoded string" msgstr "δεν ήταν δυνατή η εξόÏυξη bytes από κωδικοποιημένη συμβολοσειÏά" + +#~ msgid "To construct a multidimensional array, the inner sequences must all have the same length." +#~ msgstr "Για να κατασκευαστεί μια πολυδιάστατη συστυχία, οι εσωτεÏικές ακολουθίες Ï€Ïέπει να έχουν όλες το ίδιο μήκος." + +#~ msgid "array size exceeds the maximum allowed" +#~ msgstr "το μέγεθος συστοιχίας υπεÏβαίνει το μέγιστο επιτÏεπόμενο" + +#~ msgid "wrong length of inner sequence: has length %d, but %d was expected" +#~ msgstr "λάθος μήκος της εσωτεÏικής ακολουθίας: έχει μήκος %d , αλλά αναμενόταν %d" diff --git a/src/pl/plpython/po/es.po b/src/pl/plpython/po/es.po index 8186ef8622b49..bae86f7219b13 100644 --- a/src/pl/plpython/po/es.po +++ b/src/pl/plpython/po/es.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plpython (PostgreSQL) 16\n" +"Project-Id-Version: plpython (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:08+0000\n" -"PO-Revision-Date: 2023-05-22 12:06+0200\n" +"POT-Creation-Date: 2025-02-16 19:39+0000\n" +"PO-Revision-Date: 2024-11-16 14:24+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -26,49 +26,49 @@ msgstr "" msgid "plpy.cursor expected a query or a plan" msgstr "plpy.cursor espera una consulta o un plan" -#: plpy_cursorobject.c:155 +#: plpy_cursorobject.c:154 #, c-format msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor lleva una secuencia como segundo argumento" -#: plpy_cursorobject.c:171 plpy_spi.c:205 +#: plpy_cursorobject.c:170 plpy_spi.c:204 #, c-format msgid "could not execute plan" msgstr "no se pudo ejecutar el plan" -#: plpy_cursorobject.c:174 plpy_spi.c:208 +#: plpy_cursorobject.c:173 plpy_spi.c:207 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" msgstr[0] "Se esperaba una secuencia de %d argumento, se obtuvo %d: %s" msgstr[1] "Se esperaba una secuencia de %d argumentos, se obtuvo %d: %s" -#: plpy_cursorobject.c:321 +#: plpy_cursorobject.c:317 #, c-format msgid "iterating a closed cursor" msgstr "iterando un cursor cerrado" -#: plpy_cursorobject.c:329 plpy_cursorobject.c:395 +#: plpy_cursorobject.c:325 plpy_cursorobject.c:391 #, c-format msgid "iterating a cursor in an aborted subtransaction" msgstr "iterando un cursor en una subtransacción abortada" -#: plpy_cursorobject.c:387 +#: plpy_cursorobject.c:383 #, c-format msgid "fetch from a closed cursor" msgstr "haciendo «fetch» en un cursor cerrado" -#: plpy_cursorobject.c:430 plpy_spi.c:401 +#: plpy_cursorobject.c:426 plpy_spi.c:393 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "el resultado de la consulta tiene demasiados registros y no entran en una lista de Python" -#: plpy_cursorobject.c:482 +#: plpy_cursorobject.c:478 #, c-format msgid "closing a cursor in an aborted subtransaction" msgstr "cerrando un cursor en una subtransacción abortada" -#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 +#: plpy_elog.c:122 plpy_elog.c:123 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" @@ -108,83 +108,83 @@ msgstr "procedimiento PL/Python no returnó None" msgid "PL/Python function with return type \"void\" did not return None" msgstr "función PL/Python con tipo de retorno «void» no retorna None" -#: plpy_exec.c:369 plpy_exec.c:393 +#: plpy_exec.c:246 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "se llamó una función que retorna un registro en un contexto que no puede aceptarlo" + +#: plpy_exec.c:392 plpy_exec.c:416 #, c-format msgid "unexpected return value from trigger procedure" msgstr "valor de retorno no esperado desde el procedimiento disparador" -#: plpy_exec.c:370 +#: plpy_exec.c:393 #, c-format msgid "Expected None or a string." msgstr "Se esperaba None o una cadena." -#: plpy_exec.c:383 +#: plpy_exec.c:406 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "función de disparador de PL/Python retorno «MODIFY» en un disparador de tipo DELETE -- ignorado" -#: plpy_exec.c:394 +#: plpy_exec.c:417 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Se esperaba None, «OK», «SKIP» o «MODIFY»." -#: plpy_exec.c:444 +#: plpy_exec.c:468 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "PyList_SetItem() falló, mientras se inicializaban los argumentos" -#: plpy_exec.c:448 +#: plpy_exec.c:472 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "PyDict_SetItemString() falló, mientras se inicializaban los argumentos" -#: plpy_exec.c:460 -#, c-format -msgid "function returning record called in context that cannot accept type record" -msgstr "se llamó una función que retorna un registro en un contexto que no puede aceptarlo" - -#: plpy_exec.c:677 +#: plpy_exec.c:701 #, c-format msgid "while creating return value" msgstr "mientras se creaba el valor de retorno" -#: plpy_exec.c:924 +#: plpy_exec.c:952 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] borrado, no se puede modicar el registro" -#: plpy_exec.c:929 +#: plpy_exec.c:957 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] no es un diccionario" -#: plpy_exec.c:954 +#: plpy_exec.c:982 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "el nombre del atributo de TD[\"new\"] en la posición %d no es una cadena" -#: plpy_exec.c:961 +#: plpy_exec.c:989 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "la llave «%s» en TD[\"new\"] no existe como columna en la fila disparadora" -#: plpy_exec.c:966 +#: plpy_exec.c:994 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "no se puede definir el atributo de sistema «%s»" -#: plpy_exec.c:971 +#: plpy_exec.c:999 #, c-format msgid "cannot set generated column \"%s\"" msgstr "no se puede definir el atributo generado «%s»" -#: plpy_exec.c:1029 +#: plpy_exec.c:1057 #, c-format msgid "while modifying trigger row" msgstr "mientras se modificaba la fila de disparador" # FIXME not very happy with this -#: plpy_exec.c:1087 +#: plpy_exec.c:1115 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "abortando una subtransacción que no se ha cerrado" @@ -273,27 +273,27 @@ msgstr "«%s» no es un argumento válido para esta función" msgid "invalid SQLSTATE code" msgstr "código SQLSTATE no válido" -#: plpy_procedure.c:225 +#: plpy_procedure.c:226 #, c-format msgid "trigger functions can only be called as triggers" msgstr "las funciones disparadoras sólo pueden ser llamadas como disparadores" -#: plpy_procedure.c:229 +#: plpy_procedure.c:230 #, c-format msgid "PL/Python functions cannot return type %s" msgstr "las funciones PL/Python no pueden retornar el tipo %s" -#: plpy_procedure.c:307 +#: plpy_procedure.c:308 #, c-format msgid "PL/Python functions cannot accept type %s" msgstr "la funciones PL/Python no pueden aceptar el tipo %s" -#: plpy_procedure.c:395 +#: plpy_procedure.c:396 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "no se pudo compilar la función PL/Python «%s»" -#: plpy_procedure.c:398 +#: plpy_procedure.c:399 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "no se pudo compilar el bloque anónimo PL/Python" @@ -318,17 +318,17 @@ msgstr "plpy.prepare: el nombre de tipo en la posición %d no es una cadena" msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute espera una consulta o un plan" -#: plpy_spi.c:189 +#: plpy_spi.c:188 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute lleva una secuencia como segundo argumento" -#: plpy_spi.c:297 +#: plpy_spi.c:289 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "falló SPI_execute_plan: %s" -#: plpy_spi.c:339 +#: plpy_spi.c:331 #, c-format msgid "SPI_execute failed: %s" msgstr "falló SPI_execute: %s" diff --git a/src/pl/plpython/po/fr.po b/src/pl/plpython/po/fr.po index d364d36b13d83..ec9faf0a957b1 100644 --- a/src/pl/plpython/po/fr.po +++ b/src/pl/plpython/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-12 05:16+0000\n" -"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"POT-Creation-Date: 2023-07-30 09:08+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,184 +19,176 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: plpy_cursorobject.c:78 +#: plpy_cursorobject.c:72 #, c-format msgid "plpy.cursor expected a query or a plan" msgstr "plpy.cursor attendait une requête ou un plan" -#: plpy_cursorobject.c:161 +#: plpy_cursorobject.c:155 #, c-format msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor prends une séquence dans son second argument" -#: plpy_cursorobject.c:177 plpy_spi.c:211 +#: plpy_cursorobject.c:171 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "n'a pas pu exécuter le plan" -#: plpy_cursorobject.c:180 plpy_spi.c:214 +#: plpy_cursorobject.c:174 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" msgstr[0] "Séquence attendue de %d argument, %d obtenu : %s" msgstr[1] "Séquence attendue de %d arguments, %d obtenus : %s" -#: plpy_cursorobject.c:329 +#: plpy_cursorobject.c:321 #, c-format msgid "iterating a closed cursor" msgstr "itération d'un curseur fermé" -#: plpy_cursorobject.c:337 plpy_cursorobject.c:403 +#: plpy_cursorobject.c:329 plpy_cursorobject.c:395 #, c-format msgid "iterating a cursor in an aborted subtransaction" msgstr "itération d'un curseur dans une sous-transaction annulée" -#: plpy_cursorobject.c:395 +#: plpy_cursorobject.c:387 #, c-format msgid "fetch from a closed cursor" msgstr "récupérer à partir d'un curseur fermé" -#: plpy_cursorobject.c:438 plpy_spi.c:409 +#: plpy_cursorobject.c:430 plpy_spi.c:401 #, c-format msgid "query result has too many rows to fit in a Python list" -msgstr "" -"le résultat de la requête contient trop de lignes pour être intégré dans une " -"liste Python" +msgstr "le résultat de la requête contient trop de lignes pour être intégré dans une liste Python" -#: plpy_cursorobject.c:490 +#: plpy_cursorobject.c:482 #, c-format msgid "closing a cursor in an aborted subtransaction" msgstr "fermeture d'un curseur dans une sous-transaction annulée" -#: plpy_elog.c:129 plpy_elog.c:130 plpy_plpymodule.c:553 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" -#: plpy_exec.c:143 +#: plpy_exec.c:139 #, c-format msgid "unsupported set function return mode" msgstr "mode de retour non supporté pour la fonction SET" -#: plpy_exec.c:144 +#: plpy_exec.c:140 #, c-format -msgid "" -"PL/Python set-returning functions only support returning one value per call." +msgid "PL/Python set-returning functions only support returning one value per call." msgstr "" "les fonctions PL/python renvoyant des ensembles supportent seulement une\n" "valeur renvoyée par appel." -#: plpy_exec.c:157 +#: plpy_exec.c:153 #, c-format msgid "returned object cannot be iterated" msgstr "l'objet renvoyé ne supporte pas les itérations" -#: plpy_exec.c:158 +#: plpy_exec.c:154 #, c-format msgid "PL/Python set-returning functions must return an iterable object." msgstr "" "les fonctions PL/python renvoyant des ensembles doivent renvoyer un objet\n" "itérable" -#: plpy_exec.c:172 +#: plpy_exec.c:168 #, c-format msgid "error fetching next item from iterator" msgstr "erreur lors de la récupération du prochain élément de l'itérateur" -#: plpy_exec.c:215 +#: plpy_exec.c:211 #, c-format msgid "PL/Python procedure did not return None" msgstr "la procédure PL/python n'a pas renvoyé None" -#: plpy_exec.c:219 +#: plpy_exec.c:215 #, c-format msgid "PL/Python function with return type \"void\" did not return None" -msgstr "" -"la fonction PL/python avec un code de retour « void » ne renvoyait pas None" +msgstr "la fonction PL/python avec un code de retour « void » ne renvoyait pas None" -#: plpy_exec.c:375 plpy_exec.c:401 +#: plpy_exec.c:369 plpy_exec.c:393 #, c-format msgid "unexpected return value from trigger procedure" msgstr "valeur de retour inattendue de la procédure trigger" -#: plpy_exec.c:376 +#: plpy_exec.c:370 #, c-format msgid "Expected None or a string." msgstr "Attendait None ou une chaîne de caractères." -#: plpy_exec.c:391 +#: plpy_exec.c:383 #, c-format -msgid "" -"PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" +msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "" "la fonction trigger PL/python a renvoyé « MODIFY » dans un trigger DELETE\n" "-- ignoré" -#: plpy_exec.c:402 +#: plpy_exec.c:394 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Attendait None, « OK », « SKIP » ou « MODIFY »." -#: plpy_exec.c:452 +#: plpy_exec.c:444 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "échec de PyList_SetItem() lors de l'initialisation des arguments" -#: plpy_exec.c:456 +#: plpy_exec.c:448 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "échec de PyDict_SetItemString() lors de l'initialisation des arguments" -#: plpy_exec.c:468 +#: plpy_exec.c:460 #, c-format -msgid "" -"function returning record called in context that cannot accept type record" +msgid "function returning record called in context that cannot accept type record" msgstr "" "fonction renvoyant le type record appelée dans un contexte qui ne peut pas\n" "accepter le type record" -#: plpy_exec.c:685 +#: plpy_exec.c:677 #, c-format msgid "while creating return value" msgstr "lors de la création de la valeur de retour" -#: plpy_exec.c:919 +#: plpy_exec.c:924 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] supprimé, ne peut pas modifier la ligne" -#: plpy_exec.c:924 +#: plpy_exec.c:929 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] n'est pas un dictionnaire" -#: plpy_exec.c:951 +#: plpy_exec.c:954 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "la clé TD[\"new\"] à la position ordinale %d n'est pas une chaîne" -#: plpy_exec.c:958 +#: plpy_exec.c:961 #, c-format -msgid "" -"key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering " -"row" +msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "" "la clé « %s » trouvée dans TD[\"new\"] n'existe pas comme colonne\n" "de la ligne impactée par le trigger" -#: plpy_exec.c:963 +#: plpy_exec.c:966 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "ne peut pas initialiser l'attribut système « %s »" -#: plpy_exec.c:968 +#: plpy_exec.c:971 #, c-format msgid "cannot set generated column \"%s\"" msgstr "ne peut pas initialiser la colonne générée « %s »" -#: plpy_exec.c:1026 +#: plpy_exec.c:1029 #, c-format msgid "while modifying trigger row" msgstr "lors de la modification de la ligne du trigger" @@ -206,432 +198,274 @@ msgstr "lors de la modification de la ligne du trigger" msgid "forcibly aborting a subtransaction that has not been exited" msgstr "annulation forcée d'une sous-transaction qui n'a jamais été quittée" -#: plpy_main.c:125 +#: plpy_main.c:109 #, c-format msgid "multiple Python libraries are present in session" msgstr "plusieurs bibliothèques Python sont présentes dans la session" -#: plpy_main.c:126 +#: plpy_main.c:110 #, c-format msgid "Only one Python major version can be used in one session." -msgstr "" -"Seule une version majeure de Python peut être utilisée dans une session." +msgstr "Seule une version majeure de Python peut être utilisée dans une session." -#: plpy_main.c:142 +#: plpy_main.c:122 #, c-format msgid "untrapped error in initialization" msgstr "erreur non récupérée dans l'initialisation" -#: plpy_main.c:165 +#: plpy_main.c:145 #, c-format msgid "could not import \"__main__\" module" msgstr "n'a pas pu importer le module « __main__ »" -#: plpy_main.c:174 +#: plpy_main.c:154 #, c-format msgid "could not initialize globals" msgstr "n'a pas pu initialiser les variables globales" -#: plpy_main.c:399 +#: plpy_main.c:352 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "procédure PL/python « %s »" -#: plpy_main.c:402 +#: plpy_main.c:355 #, c-format msgid "PL/Python function \"%s\"" msgstr "fonction PL/python « %s »" -#: plpy_main.c:410 +#: plpy_main.c:363 #, c-format msgid "PL/Python anonymous code block" msgstr "bloc de code PL/Python anonyme" -#: plpy_plpymodule.c:186 plpy_plpymodule.c:189 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" msgstr "n'a pas pu importer le module « plpy »" -#: plpy_plpymodule.c:204 +#: plpy_plpymodule.c:182 #, c-format msgid "could not create the spiexceptions module" msgstr "n'a pas pu créer le module « spiexceptions »" -#: plpy_plpymodule.c:212 +#: plpy_plpymodule.c:190 #, c-format msgid "could not add the spiexceptions module" msgstr "n'a pas pu ajouter le module « spiexceptions »" -#: plpy_plpymodule.c:280 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" msgstr "n'a pas pu générer les exceptions SPI" -#: plpy_plpymodule.c:448 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "n'a pas pu déballer les arguments dans plpy.elog" -#: plpy_plpymodule.c:457 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" msgstr "n'a pas pu analyser le message d'erreur dans plpy.elog" -#: plpy_plpymodule.c:474 +#: plpy_plpymodule.c:451 #, c-format msgid "argument 'message' given by name and position" msgstr "argument 'message' donné par nom et position" -#: plpy_plpymodule.c:501 +#: plpy_plpymodule.c:478 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "'%s' est une argument mot-clé invalide pour cette fonction" -#: plpy_plpymodule.c:512 plpy_plpymodule.c:518 +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" msgstr "code SQLSTATE invalide" -#: plpy_procedure.c:230 +#: plpy_procedure.c:225 #, c-format msgid "trigger functions can only be called as triggers" msgstr "les fonctions trigger peuvent seulement être appelées par des triggers" -#: plpy_procedure.c:234 +#: plpy_procedure.c:229 #, c-format msgid "PL/Python functions cannot return type %s" msgstr "les fonctions PL/python ne peuvent pas renvoyer le type %s" -#: plpy_procedure.c:312 +#: plpy_procedure.c:307 #, c-format msgid "PL/Python functions cannot accept type %s" msgstr "les fonctions PL/python ne peuvent pas accepter le type %s" -#: plpy_procedure.c:402 +#: plpy_procedure.c:395 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "n'a pas pu compiler la fonction PL/python « %s »" -#: plpy_procedure.c:405 +#: plpy_procedure.c:398 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "n'a pas pu compiler le bloc de code anonyme PL/python" -#: plpy_resultobject.c:121 plpy_resultobject.c:147 plpy_resultobject.c:173 +#: plpy_resultobject.c:117 plpy_resultobject.c:143 plpy_resultobject.c:169 #, c-format msgid "command did not produce a result set" msgstr "la commande n'a pas fourni d'ensemble de résultats" -#: plpy_spi.c:60 +#: plpy_spi.c:56 #, c-format msgid "second argument of plpy.prepare must be a sequence" msgstr "le second argument de plpy.prepare doit être une séquence" -#: plpy_spi.c:104 +#: plpy_spi.c:98 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" -msgstr "" -"plpy.prepare : le nom du type sur la position ordinale %d n'est pas une " -"chaîne" +msgstr "plpy.prepare : le nom du type sur la position ordinale %d n'est pas une chaîne" -#: plpy_spi.c:176 +#: plpy_spi.c:170 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.prepare attendait une requête ou un plan" -#: plpy_spi.c:195 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute prends une séquence dans son second argument" -#: plpy_spi.c:305 +#: plpy_spi.c:297 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "échec de SPI_execute_plan : %s" -#: plpy_spi.c:347 +#: plpy_spi.c:339 #, c-format msgid "SPI_execute failed: %s" msgstr "échec de SPI_execute : %s" -#: plpy_subxactobject.c:97 +#: plpy_subxactobject.c:92 #, c-format msgid "this subtransaction has already been entered" msgstr "cette sous-transaction est en cours d'utilisation" -#: plpy_subxactobject.c:103 plpy_subxactobject.c:161 +#: plpy_subxactobject.c:98 plpy_subxactobject.c:156 #, c-format msgid "this subtransaction has already been exited" msgstr "déjà sorti de cette sous-transaction" -#: plpy_subxactobject.c:155 +#: plpy_subxactobject.c:150 #, c-format msgid "this subtransaction has not been entered" msgstr "cette sous-transaction n'a jamais été utilisée" -#: plpy_subxactobject.c:167 +#: plpy_subxactobject.c:162 #, c-format msgid "there is no subtransaction to exit from" msgstr "il n'y a pas de transaction à quitter" -#: plpy_typeio.c:591 +#: plpy_typeio.c:588 #, c-format msgid "could not import a module for Decimal constructor" msgstr "n'a pas pu importer un module pour le constructeur Decimal" -#: plpy_typeio.c:595 +#: plpy_typeio.c:592 #, c-format msgid "no Decimal attribute in module" msgstr "pas d'attribut Decimal dans le module" -#: plpy_typeio.c:601 +#: plpy_typeio.c:598 #, c-format msgid "conversion from numeric to Decimal failed" msgstr "échec de la conversion numeric vers Decimal" -#: plpy_typeio.c:915 +#: plpy_typeio.c:912 #, c-format msgid "could not create bytes representation of Python object" msgstr "n'a pas pu créer une représentation octets de l'objet Python" -#: plpy_typeio.c:1063 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" -msgstr "" -"n'a pas pu créer une représentation chaîne de caractères de l'objet Python" +msgstr "n'a pas pu créer une représentation chaîne de caractères de l'objet Python" -#: plpy_typeio.c:1074 +#: plpy_typeio.c:1060 #, c-format -msgid "" -"could not convert Python object into cstring: Python string representation " -"appears to contain null bytes" -msgstr "" -"n'a pas pu convertir l'objet Python en csting : la représentation de la " -"chaîne Python contient des octets nuls" +msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" +msgstr "n'a pas pu convertir l'objet Python en cstring : la représentation de la chaîne Python contient des octets nuls" -#: plpy_typeio.c:1183 +#: plpy_typeio.c:1157 #, c-format -msgid "number of array dimensions exceeds the maximum allowed (%d)" -msgstr "le nombre de dimensions du tableau dépasse le maximum autorisé (%d)" +msgid "return value of function with array return type is not a Python sequence" +msgstr "la valeur de retour de la fonction de type tableau n'est pas une séquence Python" -#: plpy_typeio.c:1187 +#: plpy_typeio.c:1202 #, c-format msgid "could not determine sequence length for function return value" -msgstr "" -"n'a pas pu déterminer la longueur de la séquence pour la valeur de retour de " -"la fonction" - -#: plpy_typeio.c:1190 plpy_typeio.c:1194 -#, c-format -msgid "array size exceeds the maximum allowed" -msgstr "la taille du tableau dépasse le maximum permis" - -#: plpy_typeio.c:1220 -#, c-format -msgid "" -"return value of function with array return type is not a Python sequence" -msgstr "" -"la valeur de retour de la fonction de type tableau n'est pas une séquence " -"Python" +msgstr "n'a pas pu déterminer la longueur de la séquence pour la valeur de retour de la fonction" -#: plpy_typeio.c:1266 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 #, c-format -msgid "wrong length of inner sequence: has length %d, but %d was expected" +msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "" -"mauvaise longueur de la séquence interne : a une longueur %d, mais %d était " -"attendu" +"les tableaux multidimensionnels doivent avoir des expressions de tableaux\n" +"avec les dimensions correspondantes" -#: plpy_typeio.c:1268 +#: plpy_typeio.c:1227 #, c-format -msgid "" -"To construct a multidimensional array, the inner sequences must all have the " -"same length." -msgstr "" -"Pour construire un tableau multidimensionnel, les séquences internes doivent " -"toutes avoir la même longueur." +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "le nombre de dimensions du tableau dépasse le maximum autorisé (%d)" -#: plpy_typeio.c:1347 +#: plpy_typeio.c:1329 #, c-format msgid "malformed record literal: \"%s\"" -msgstr "enregistrement litéral invalide : « %s »" +msgstr "enregistrement littéral invalide : « %s »" -#: plpy_typeio.c:1348 +#: plpy_typeio.c:1330 #, c-format msgid "Missing left parenthesis." msgstr "Parenthèse gauche manquante." -#: plpy_typeio.c:1349 plpy_typeio.c:1550 +#: plpy_typeio.c:1331 plpy_typeio.c:1532 #, c-format -msgid "" -"To return a composite type in an array, return the composite type as a " -"Python tuple, e.g., \"[('foo',)]\"." -msgstr "" -"Pour renvoyer un type composite dans un tableau, renvoyez le type composite " -"sous la forme d'un tuple Python, c'est-à-dire \"[('foo',)]\"." +msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." +msgstr "Pour renvoyer un type composite dans un tableau, renvoyez le type composite sous la forme d'un tuple Python, c'est-à-dire \"[('foo',)]\"." -#: plpy_typeio.c:1396 +#: plpy_typeio.c:1378 #, c-format msgid "key \"%s\" not found in mapping" msgstr "la clé « %s » introuvable dans la correspondance" -#: plpy_typeio.c:1397 +#: plpy_typeio.c:1379 #, c-format -msgid "" -"To return null in a column, add the value None to the mapping with the key " -"named after the column." +msgid "To return null in a column, add the value None to the mapping with the key named after the column." msgstr "" "Pour renvoyer NULL dans une colonne, ajoutez la valeur None à la\n" "correspondance de la clé nommée d'après la colonne." -#: plpy_typeio.c:1450 +#: plpy_typeio.c:1432 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "" "la longueur de la séquence renvoyée ne correspondait pas au nombre de\n" "colonnes dans la ligne" -#: plpy_typeio.c:1548 +#: plpy_typeio.c:1530 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "l'attribut « %s » n'existe pas dans l'objet Python" -#: plpy_typeio.c:1551 +#: plpy_typeio.c:1533 #, c-format -msgid "" -"To return null in a column, let the returned object have an attribute named " -"after column with value None." +msgid "To return null in a column, let the returned object have an attribute named after column with value None." msgstr "" -"Pour renvoyer NULL dans une colonne, faites en sorte que l'objet renvoyé " -"ait\n" +"Pour renvoyer NULL dans une colonne, faites en sorte que l'objet renvoyé ait\n" "un attribut nommé suivant la colonne de valeur None." -#: plpy_util.c:35 +#: plpy_util.c:31 #, c-format msgid "could not convert Python Unicode object to bytes" msgstr "n'a pas pu convertir l'objet Unicode Python en octets" -#: plpy_util.c:41 +#: plpy_util.c:37 #, c-format msgid "could not extract bytes from encoded string" msgstr "n'a pas pu extraire les octets de la chaîne encodée" - -#~ msgid "could not create new dictionary while building trigger arguments" -#~ msgstr "" -#~ "n'a pas pu créer un nouveau dictionnaire lors de la construction des\n" -#~ "arguments du trigger" - -#~ msgid "could not create globals" -#~ msgstr "n'a pas pu créer les globales" - -#~ msgid "could not create exception \"%s\"" -#~ msgstr "n'a pas pu créer l'exception « %s »" - -#~ msgid "could not create new dictionary" -#~ msgstr "n'a pas pu créer le nouveau dictionnaire" - -#~ msgid "plan.status takes no arguments" -#~ msgstr "plan.status ne prends pas d'arguments" - -#~ msgid "cannot convert multidimensional array to Python list" -#~ msgstr "ne peut pas convertir un tableau multidimensionnel en liste Python" - -#~ msgid "PL/Python only supports one-dimensional arrays." -#~ msgstr "PL/Python supporte seulement les tableaux uni-dimensionnels." - -#~ msgid "could not create new Python list" -#~ msgstr "n'a pas pu créer la nouvelle liste Python" - -#~ msgid "the message is already specified" -#~ msgstr "le message est déjà spécifié" - -#~ msgid "plpy.prepare does not support composite types" -#~ msgstr "plpy.prepare ne supporte pas les types composites" - -#~ msgid "PL/Python does not support conversion to arrays of row types." -#~ msgstr "" -#~ "PL/Python ne supporte pas les conversions vers des tableaux de types row." - -#~ msgid "unrecognized error in PLy_spi_execute_fetch_result" -#~ msgstr "erreur inconnue dans PLy_spi_execute_fetch_result" - -#~ msgid "PyCObject_AsVoidPtr() failed" -#~ msgstr "échec de PyCObject_AsVoidPtr()" - -#~ msgid "PyCObject_FromVoidPtr() failed" -#~ msgstr "échec de PyCObject_FromVoidPtr()" - -#~ msgid "transaction aborted" -#~ msgstr "transaction annulée" - -#~ msgid "invalid arguments for plpy.prepare" -#~ msgstr "arguments invalides pour plpy.prepare" - -#~ msgid "unrecognized error in PLy_spi_prepare" -#~ msgstr "erreur inconnue dans PLy_spi_prepare" - -#~ msgid "unrecognized error in PLy_spi_execute_plan" -#~ msgstr "erreur inconnue dans PLy_spi_execute_plan" - -#~ msgid "unrecognized error in PLy_spi_execute_query" -#~ msgstr "erreur inconnue dans PLy_spi_execute_query" - -#~ msgid "could not create procedure cache" -#~ msgstr "n'a pas pu créer le cache de procédure" - -#~ msgid "PL/Python: %s" -#~ msgstr "PL/python : %s" - -#~ msgid "out of memory" -#~ msgstr "mémoire épuisée" - -#~ msgid "PL/Python function \"%s\" failed" -#~ msgstr "échec de la fonction PL/python « %s »" - -#~ msgid "" -#~ "could not compute string representation of Python object in PL/Python " -#~ "function \"%s\" while modifying trigger row" -#~ msgstr "" -#~ "n'a pas pu traiter la représentation de la chaîne d'un objet Python dans\n" -#~ "la fonction PL/Python « %s » lors de la modification de la ligne du " -#~ "trigger" - -#~ msgid "" -#~ "could not create string representation of Python object in PL/Python " -#~ "function \"%s\" while creating return value" -#~ msgstr "" -#~ "n'a pas pu créer la représentation en chaîne de caractère de l'objet\n" -#~ "Python dans la fonction PL/python « %s » lors de la création de la " -#~ "valeur\n" -#~ "de retour" - -#~ msgid "PL/Python function \"%s\" could not execute plan" -#~ msgstr "la fonction PL/python « %s » n'a pas pu exécuter un plan" - -#~ msgid "Start a new session to use a different Python major version." -#~ msgstr "" -#~ "Lancez une nouvelle session pour utiliser une version majeure différente " -#~ "de\n" -#~ "Python." - -#~ msgid "" -#~ "This session has previously used Python major version %d, and it is now " -#~ "attempting to use Python major version %d." -#~ msgstr "" -#~ "Cette session a auparavant utilisé la version majeure %d de Python et " -#~ "elle\n" -#~ "essaie maintenant d'utiliser la version majeure %d." - -#~ msgid "Python major version mismatch in session" -#~ msgstr "Différence de version majeure de Python dans la session" - -#~ msgid "could not create the base SPI exceptions" -#~ msgstr "n'a pas pu créer les exceptions SPI de base" - -#~ msgid "" -#~ "multidimensional arrays must have array expressions with matching " -#~ "dimensions. PL/Python function return value has sequence length %d while " -#~ "expected %d" -#~ msgstr "" -#~ "les tableaux multidimensionnels doivent avoir des expressions de " -#~ "tableaux\n" -#~ "avec des dimensions correspondantes. La valeur de retour de la fonction\n" -#~ "PL/Python a une longueur de séquence %d alors que %d est attendue" diff --git a/src/pl/plpython/po/ka.po b/src/pl/plpython/po/ka.po index 58dc7c033941b..70a87f68c437a 100644 --- a/src/pl/plpython/po/ka.po +++ b/src/pl/plpython/po/ka.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: plpython (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-06-07 04:08+0000\n" -"PO-Revision-Date: 2023-06-07 09:07+0200\n" +"POT-Creation-Date: 2023-05-17 01:38+0000\n" +"PO-Revision-Date: 2022-09-25 19:18+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -448,3 +448,15 @@ msgstr "\"Python Unicode\" ტიპის áƒáƒ‘იექტის ბáƒáƒ˜áƒ¢ #, c-format msgid "could not extract bytes from encoded string" msgstr "ბáƒáƒ˜áƒ¢áƒ”ბის áƒáƒ›áƒáƒ¦áƒ”ბის შეცდáƒáƒ›áƒ კáƒáƒ“ირებული სტრიქáƒáƒœáƒ˜áƒ“áƒáƒœ" + +#, c-format +#~ msgid "To construct a multidimensional array, the inner sequences must all have the same length." +#~ msgstr "მრáƒáƒ•áƒáƒšáƒ’áƒáƒœáƒ–áƒáƒ›áƒ˜áƒšáƒ”ბიáƒáƒœáƒ˜ მáƒáƒ¡áƒ˜áƒ•ის áƒáƒ¡áƒáƒ¨áƒ”ნებლáƒáƒ“ ყველრშიდრმიმდევრáƒáƒ‘ის სიგრძე ტáƒáƒšáƒ˜ უნდრიყáƒáƒ¡." + +#, c-format +#~ msgid "array size exceeds the maximum allowed" +#~ msgstr "მáƒáƒ¡áƒ˜áƒ•ის ზáƒáƒ›áƒ მáƒáƒ¥áƒ¡áƒ˜áƒ›áƒáƒšáƒ£áƒ  დáƒáƒ¡áƒáƒ¨áƒ•ებს áƒáƒ­áƒáƒ áƒ‘ებს" + +#, c-format +#~ msgid "wrong length of inner sequence: has length %d, but %d was expected" +#~ msgstr "შიდრმიმდევრáƒáƒ‘ის áƒáƒ áƒáƒ¡áƒ¬áƒáƒ áƒ˜ სიგრძე: სიგრძე: %d. უნდრიყáƒáƒ¡: %d" diff --git a/src/pl/plpython/po/ko.po b/src/pl/plpython/po/ko.po index e4d7a58a1b2ac..ef64d5cb1534f 100644 --- a/src/pl/plpython/po/ko.po +++ b/src/pl/plpython/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: plpython (PostgreSQL) 12\n" +"Project-Id-Version: plpython (PostgreSQL) 16\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-02-09 20:08+0000\n" -"PO-Revision-Date: 2019-11-01 12:53+0900\n" +"POT-Creation-Date: 2023-09-07 05:38+0000\n" +"PO-Revision-Date: 2023-05-30 12:40+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean \n" "Language: ko\n" @@ -17,65 +17,65 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: plpy_cursorobject.c:78 +#: plpy_cursorobject.c:72 #, c-format msgid "plpy.cursor expected a query or a plan" msgstr "plpy.cursor ê°ì²´ëŠ” 쿼리나 plpy.prepare ê°ì²´ë¥¼ ì¸ìžë¡œ 사용합니다" -#: plpy_cursorobject.c:161 +#: plpy_cursorobject.c:155 #, c-format msgid "plpy.cursor takes a sequence as its second argument" msgstr "" "plpy.cursor ê°ì²´ì˜ ì¸ìžë¡œ plpy.prepare ê°ì²´ë¥¼ 사용한 경우 ë‘번째 ì¸ìžëŠ” " "prepare ê°ì²´ì˜ 매개변수가 있어야 합니다." -#: plpy_cursorobject.c:177 plpy_spi.c:211 +#: plpy_cursorobject.c:171 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "plpy.prepare ê°ì²´ë¥¼ 실행할 수 ì—†ìŒ" -#: plpy_cursorobject.c:180 plpy_spi.c:214 +#: plpy_cursorobject.c:174 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" msgstr[0] "%d ê°œì˜ ì¸ìžê°€ 필요한ë°, %dê°œì˜ ì¸ìžë¥¼ 지정했ìŒ: %s" -#: plpy_cursorobject.c:329 +#: plpy_cursorobject.c:321 #, c-format msgid "iterating a closed cursor" msgstr "ì´ë¯¸ 닫긴 커서ì—서 ë‹¤ìŒ ìžë£Œë¥¼ 요구하고 있ìŒ" -#: plpy_cursorobject.c:337 plpy_cursorobject.c:403 +#: plpy_cursorobject.c:329 plpy_cursorobject.c:395 #, c-format msgid "iterating a cursor in an aborted subtransaction" msgstr "ì¤‘ì§€ëœ ì„œë¸Œ íŠ¸ëžœìž­ì…˜ì— ìžˆëŠ” 커서ì—서 ë‹¤ìŒ ìžë£Œë¥¼ 요구하고 있ìŒ" -#: plpy_cursorobject.c:395 +#: plpy_cursorobject.c:387 #, c-format msgid "fetch from a closed cursor" msgstr "닫긴 커서ì—서 fetch" -#: plpy_cursorobject.c:438 plpy_spi.c:409 +#: plpy_cursorobject.c:430 plpy_spi.c:401 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "쿼리 결과가 Python 리스트로 담기ì—는 너무 많습니다" -#: plpy_cursorobject.c:490 +#: plpy_cursorobject.c:482 #, c-format msgid "closing a cursor in an aborted subtransaction" msgstr "ì¤‘ì§€ëœ ì„œë¸ŒíŠ¸ëžœìž­ì…˜ì—서 커서를 ë‹«ê³  있ìŒ" -#: plpy_elog.c:129 plpy_elog.c:130 plpy_plpymodule.c:553 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" -#: plpy_exec.c:143 +#: plpy_exec.c:139 #, c-format msgid "unsupported set function return mode" msgstr "ì§€ì›í•˜ì§€ 않는 ì§‘í•© 함수 리턴 모드" -#: plpy_exec.c:144 +#: plpy_exec.c:140 #, c-format msgid "" "PL/Python set-returning functions only support returning one value per call." @@ -83,91 +83,91 @@ msgstr "" "PL/Python ì§‘í•©-반환 함수는 í•œë²ˆì˜ í˜¸ì¶œì— ëŒ€í•´ì„œ í•˜ë‚˜ì˜ ê°’ë§Œ 반환할 수 있습니" "다." -#: plpy_exec.c:157 +#: plpy_exec.c:153 #, c-format msgid "returned object cannot be iterated" msgstr "반환하는 ê°ì²´ê°€ iterable í˜•ì´ ì•„ë‹˜" -#: plpy_exec.c:158 +#: plpy_exec.c:154 #, c-format msgid "PL/Python set-returning functions must return an iterable object." msgstr "PL/Python ì§‘í•©-반환 함수는 iterable ê°ì²´ë¥¼ 반환해야 합니다." -#: plpy_exec.c:172 +#: plpy_exec.c:168 #, c-format msgid "error fetching next item from iterator" msgstr "iteratorì—서 ë‹¤ìŒ ì•„ì´í…œì„ 가져올 수 ì—†ìŒ" -#: plpy_exec.c:215 +#: plpy_exec.c:211 #, c-format msgid "PL/Python procedure did not return None" msgstr "PL/Python 프로시져가 Noneì„ ë°˜í™˜í•˜ì§€ 않았ìŒ" -#: plpy_exec.c:219 +#: plpy_exec.c:215 #, c-format msgid "PL/Python function with return type \"void\" did not return None" msgstr "" "반환 ìžë£Œí˜•ì´ \"void\"ì¸ PL/Python 함수가 return None으로 ë나지 않았ìŒ" -#: plpy_exec.c:375 plpy_exec.c:401 +#: plpy_exec.c:369 plpy_exec.c:393 #, c-format msgid "unexpected return value from trigger procedure" msgstr "트리거 프로시져가 예ìƒì¹˜ 못한 ê°’ì„ ë°˜í™˜í–ˆìŠµë‹ˆë‹¤" -#: plpy_exec.c:376 +#: plpy_exec.c:370 #, c-format msgid "Expected None or a string." msgstr "None ì´ë‚˜ 문ìžì—´ì´ 있어야합니다." -#: plpy_exec.c:391 +#: plpy_exec.c:383 #, c-format msgid "" "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "" "PL/Python 트리거 함수가 DELETE 트리거ì—서 \"MODIFY\"를 ë°˜í™˜í–ˆìŒ -- 무시함" -#: plpy_exec.c:402 +#: plpy_exec.c:394 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "None, \"OK\", \"SKIP\", ë˜ëŠ” \"MODIFY\"를 사용해야 함." -#: plpy_exec.c:452 +#: plpy_exec.c:444 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "PyList_SetItem() 함수가 ì¸ìž 설정하는 중 실패" -#: plpy_exec.c:456 +#: plpy_exec.c:448 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "PyDict_SetItemString() 함수가 ì¸ìž 설정하는 중 실패" -#: plpy_exec.c:468 +#: plpy_exec.c:460 #, c-format msgid "" "function returning record called in context that cannot accept type record" msgstr "반환 ìžë£Œí˜•ì´ recordì¸ë° 함수가 ê·¸ ìžë£Œí˜•으로 반환하지 않ìŒ" -#: plpy_exec.c:685 +#: plpy_exec.c:677 #, c-format msgid "while creating return value" msgstr "ë°˜í™˜ê°’ì„ ë§Œë“¤ê³  ìžˆì€ ì¤‘" -#: plpy_exec.c:919 +#: plpy_exec.c:924 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] 변수가 ì‚­ì œë˜ì—ˆìŒ, 로우를 수정할 수 ì—†ìŒ" -#: plpy_exec.c:924 +#: plpy_exec.c:929 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] 변수가 딕션너리 형태가 아님" -#: plpy_exec.c:951 +#: plpy_exec.c:954 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "%d 번째 TD[\"new\"] 딕션너리 키가 문ìžì—´ì´ 아님" -#: plpy_exec.c:958 +#: plpy_exec.c:961 #, c-format msgid "" "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering " @@ -175,17 +175,17 @@ msgid "" msgstr "" "로우 트리거 작업ì—서 칼럼으로 사용ë˜ëŠ” \"%s\" 키가 TD[\"new\"] ë³€ìˆ˜ì— ì—†ìŒ." -#: plpy_exec.c:963 +#: plpy_exec.c:966 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "\"%s\" 시스템 ì†ì„±ì„ 지정할 수 ì—†ìŒ" -#: plpy_exec.c:968 +#: plpy_exec.c:971 #, c-format msgid "cannot set generated column \"%s\"" msgstr "\"%s\" ê³„ì‚°ëœ ì¹¼ëŸ¼ì„ ì§€ì •í•  수 ì—†ìŒ" -#: plpy_exec.c:1026 +#: plpy_exec.c:1029 #, c-format msgid "while modifying trigger row" msgstr "로우 변경 트리거 작업 ë„중" @@ -195,196 +195,196 @@ msgstr "로우 변경 트리거 작업 ë„중" msgid "forcibly aborting a subtransaction that has not been exited" msgstr "ì„œë¸ŒíŠ¸ëžœìž­ì…˜ì´ ì¤‘ì§€ë¨ìœ¼ë¡œ 강제로 중지ë¨" -#: plpy_main.c:125 +#: plpy_main.c:109 #, c-format msgid "multiple Python libraries are present in session" msgstr "세션ì—서 여러 Python ë¼ì´ë¸ŒëŸ¬ë¦¬ê°€ 사용ë˜ê³  있습니다" -#: plpy_main.c:126 +#: plpy_main.c:110 #, c-format msgid "Only one Python major version can be used in one session." msgstr "í•˜ë‚˜ì˜ ì„¸ì…˜ì—서는 í•˜ë‚˜ì˜ Python ë©”ì´ì ¸ 버전만 사용할 수 있습니다." -#: plpy_main.c:142 +#: plpy_main.c:122 #, c-format msgid "untrapped error in initialization" msgstr "plpy 모듈 초기화 실패" -#: plpy_main.c:165 +#: plpy_main.c:145 #, c-format msgid "could not import \"__main__\" module" msgstr "\"__main__\" ëª¨ë“ˆì€ ìž„í¬íЏ í•  수 ì—†ìŒ" -#: plpy_main.c:174 +#: plpy_main.c:154 #, c-format msgid "could not initialize globals" msgstr "ì „ì—­ë³€ìˆ˜ë“¤ì„ ì´ˆê¸°í™” í•  수 ì—†ìŒ" -#: plpy_main.c:399 +#: plpy_main.c:352 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "\"%s\" PL/Python 프로시져" -#: plpy_main.c:402 +#: plpy_main.c:355 #, c-format msgid "PL/Python function \"%s\"" msgstr "\"%s\" PL/Python 함수" -#: plpy_main.c:410 +#: plpy_main.c:363 #, c-format msgid "PL/Python anonymous code block" msgstr "PL/Python ìµëª… 코드 블럭" -#: plpy_plpymodule.c:186 plpy_plpymodule.c:189 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" msgstr "\"plpy\" ëª¨ë“ˆì„ ìž„í¬íЏ í•  수 ì—†ìŒ" -#: plpy_plpymodule.c:204 +#: plpy_plpymodule.c:182 #, c-format msgid "could not create the spiexceptions module" msgstr "spiexceptions ëª¨ë“ˆì„ ë§Œë“¤ 수 ì—†ìŒ" -#: plpy_plpymodule.c:212 +#: plpy_plpymodule.c:190 #, c-format msgid "could not add the spiexceptions module" msgstr "spiexceptions ëª¨ë“ˆì„ ì¶”ê°€í•  수 ì—†ìŒ" -#: plpy_plpymodule.c:280 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" msgstr "SPI 예외처리를 ìƒì„±í•  수 ì—†ìŒ" -#: plpy_plpymodule.c:448 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "ìž˜ëª»ëœ ì¸ìžë¡œ êµ¬ì„±ëœ plpy.elog" -#: plpy_plpymodule.c:457 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" msgstr "plpy.elog ì—서 오류 메시지를 ë¶„ì„í•  수 ì—†ìŒ" -#: plpy_plpymodule.c:474 +#: plpy_plpymodule.c:451 #, c-format msgid "argument 'message' given by name and position" msgstr "'message' ì¸ìžëŠ” ì´ë¦„ê³¼ 위치가 있어야 함" -#: plpy_plpymodule.c:501 +#: plpy_plpymodule.c:478 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "'%s' ê°’ì€ ì´ í•¨ìˆ˜ì—서 ìž˜ëª»ëœ ì˜ˆì•½ì–´ ì¸ìžìž…니다" -#: plpy_plpymodule.c:512 plpy_plpymodule.c:518 +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" msgstr "ìž˜ëª»ëœ SQLSTATE 코드" -#: plpy_procedure.c:230 +#: plpy_procedure.c:225 #, c-format msgid "trigger functions can only be called as triggers" msgstr "트리거 함수는 트리거로만 í˜¸ì¶œë  ìˆ˜ 있ìŒ" -#: plpy_procedure.c:234 +#: plpy_procedure.c:229 #, c-format msgid "PL/Python functions cannot return type %s" msgstr "PL/Python 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•  수 ì—†ìŒ" -#: plpy_procedure.c:312 +#: plpy_procedure.c:307 #, c-format msgid "PL/Python functions cannot accept type %s" msgstr "PL/Python 함수는 %s ìžë£Œí˜•ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: plpy_procedure.c:402 +#: plpy_procedure.c:395 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "\"%s\" PL/Python 함수를 ì»´íŒŒì¼ í•  수 ì—†ìŒ" -#: plpy_procedure.c:405 +#: plpy_procedure.c:398 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "anonymous PL/Python 코드 블ë¡ì„ ì»´íŒŒì¼ í•  수 ì—†ìŒ" -#: plpy_resultobject.c:121 plpy_resultobject.c:147 plpy_resultobject.c:173 +#: plpy_resultobject.c:117 plpy_resultobject.c:143 plpy_resultobject.c:169 #, c-format msgid "command did not produce a result set" msgstr "ëª…ë ¹ì˜ ê²°ê³¼ê°’ì´ ì—†ìŒ" -#: plpy_spi.c:60 +#: plpy_spi.c:56 #, c-format msgid "second argument of plpy.prepare must be a sequence" msgstr "plpy.prepare í•¨ìˆ˜ì˜ ë‘번째 ì¸ìžëŠ” Python 시퀀스형ì´ì–´ì•¼ 함" -#: plpy_spi.c:104 +#: plpy_spi.c:98 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: %d 번째 ì¸ìžì˜ ìžë£Œí˜•ì´ ë¬¸ìžì—´ì´ 아님" -#: plpy_spi.c:176 +#: plpy_spi.c:170 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute í•¨ìˆ˜ì˜ ì¸ìžëŠ” 쿼리문ì´ë‚˜ plpy.prepare ê°ì²´ì—¬ì•¼ 함" -#: plpy_spi.c:195 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execut í•¨ìˆ˜ì˜ ë‘번째 ì¸ìžëŠ” python ì‹œí€€ìŠ¤í˜•ì´ ì™€ì•¼í•¨" -#: plpy_spi.c:305 +#: plpy_spi.c:297 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "SPI_execute_plan 실패: %s" -#: plpy_spi.c:347 +#: plpy_spi.c:339 #, c-format msgid "SPI_execute failed: %s" msgstr "SPI_execute 실패: %s" -#: plpy_subxactobject.c:97 +#: plpy_subxactobject.c:92 #, c-format msgid "this subtransaction has already been entered" msgstr "ì´ ì„œë¸ŒíŠ¸ëžœìž­ì…˜ì€ ì´ë¯¸ 시작ë˜ì—ˆìŒ" -#: plpy_subxactobject.c:103 plpy_subxactobject.c:161 +#: plpy_subxactobject.c:98 plpy_subxactobject.c:156 #, c-format msgid "this subtransaction has already been exited" msgstr "ì´ ì„œë¸ŒíŠ¸ëžœìž­ì…˜ì€ ì´ë¯¸ ë났ìŒ" -#: plpy_subxactobject.c:155 +#: plpy_subxactobject.c:150 #, c-format msgid "this subtransaction has not been entered" msgstr "ì´ ì„œë¸ŒíŠ¸ëžœìž­ì…˜ì´ ì‹œìž‘ë˜ì§€ 않았ìŒ" -#: plpy_subxactobject.c:167 +#: plpy_subxactobject.c:162 #, c-format msgid "there is no subtransaction to exit from" msgstr "종료할 ì„œë¸ŒíŠ¸ëžœìž­ì…˜ì´ ì—†ìŒ, 위치:" -#: plpy_typeio.c:591 +#: plpy_typeio.c:588 #, c-format msgid "could not import a module for Decimal constructor" msgstr "Decimal ìžë£Œí˜• 처리를 위해 ëª¨ë“ˆì„ ìž„í¬íЏ í•  수 ì—†ìŒ" -#: plpy_typeio.c:595 +#: plpy_typeio.c:592 #, c-format msgid "no Decimal attribute in module" msgstr "ëª¨ë“ˆì•ˆì— Decimal ì†ì„±ì´ ì—†ìŒ" -#: plpy_typeio.c:601 +#: plpy_typeio.c:598 #, c-format msgid "conversion from numeric to Decimal failed" msgstr "numeric í˜•ì„ Decimal 형으로 변환할 수 ì—†ìŒ" -#: plpy_typeio.c:915 +#: plpy_typeio.c:912 #, c-format msgid "could not create bytes representation of Python object" msgstr "Python ê°ì²´ë¥¼ bytea ìžë£Œí˜•으로 변환할 수 ì—†ìŒ" -#: plpy_typeio.c:1063 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" msgstr "Python ê°ì²´ë¥¼ 문ìžì—´ ìžë£Œí˜•으로 변환할 수 ì—†ìŒ" -#: plpy_typeio.c:1074 +#: plpy_typeio.c:1060 #, c-format msgid "" "could not convert Python object into cstring: Python string representation " @@ -393,50 +393,39 @@ msgstr "" "Python ê°ì²´ë¥¼ cstring 형으로 변환할 수 ì—†ìŒ: Python string ë³€ìˆ˜ì— null문ìžì—´" "ì´ í¬í•¨ë˜ì–´ 있ìŒ" -#: plpy_typeio.c:1183 +#: plpy_typeio.c:1157 #, c-format -msgid "number of array dimensions exceeds the maximum allowed (%d)" -msgstr "ë°°ì—´ ì°¨ì›ì´ 최대치 (%d)를 초과 했습니다." +msgid "" +"return value of function with array return type is not a Python sequence" +msgstr "배열형으로 넘길 ìžë£Œí˜•ì´ Python ì‹œí€€ìŠ¤í˜•ì´ ì•„ë‹˜" -#: plpy_typeio.c:1187 +#: plpy_typeio.c:1202 #, c-format msgid "could not determine sequence length for function return value" msgstr "함수 반환 값으로 시퀀스 길ì´ë¥¼ ê²°ì •í•  수 ì—†ìŒ" -#: plpy_typeio.c:1190 plpy_typeio.c:1194 -#, c-format -msgid "array size exceeds the maximum allowed" -msgstr "ë°°ì—´ 최대 í¬ê¸°ë¥¼ 초과함" - -#: plpy_typeio.c:1220 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 #, c-format msgid "" -"return value of function with array return type is not a Python sequence" -msgstr "배열형으로 넘길 ìžë£Œí˜•ì´ Python ì‹œí€€ìŠ¤í˜•ì´ ì•„ë‹˜" - -#: plpy_typeio.c:1266 -#, c-format -msgid "wrong length of inner sequence: has length %d, but %d was expected" -msgstr "ìž˜ëª»ëœ ë‚´ë¶€ 시퀀스 길ì´, ê¸¸ì´ %d, %d 초과했ìŒ" +"multidimensional arrays must have array expressions with matching dimensions" +msgstr "ë‹¤ì°¨ì› ë°°ì—´ì—는 ì¼ì¹˜í•˜ëŠ” ì°¨ì›ì´ í¬í•¨ëœ ë°°ì—´ ì‹ì´ 있어야 함" -#: plpy_typeio.c:1268 +#: plpy_typeio.c:1227 #, c-format -msgid "" -"To construct a multidimensional array, the inner sequences must all have the " -"same length." -msgstr "ë‹¤ì°¨ì› ë°°ì—´ì„ ì‚¬ìš©í•˜ë ¤ë©´, ê·¸ 하위 ë°°ì—´ì˜ ì°¨ì›ì´ ëª¨ë‘ ê°™ì•„ì•¼í•©ë‹ˆë‹¤." +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "ë°°ì—´ ì°¨ì›ì´ 최대치 (%d)를 초과 했습니다." -#: plpy_typeio.c:1347 +#: plpy_typeio.c:1329 #, c-format msgid "malformed record literal: \"%s\"" msgstr "ìž˜ëª»ëœ ë ˆì½”ë“œ 표현: \"%s\"" -#: plpy_typeio.c:1348 +#: plpy_typeio.c:1330 #, c-format msgid "Missing left parenthesis." msgstr "왼쪽 괄호가 ì—†ìŒ." -#: plpy_typeio.c:1349 plpy_typeio.c:1550 +#: plpy_typeio.c:1331 plpy_typeio.c:1532 #, c-format msgid "" "To return a composite type in an array, return the composite type as a " @@ -445,12 +434,12 @@ msgstr "" "ë°°ì—´ì—서 복합 ìžë£Œí˜•ì„ ë°˜í™˜í•˜ë ¤ë©´, Python 튜플 í˜•ì„ ì‚¬ìš©í•˜ì„¸ìš”. 예: " "\"[('foo',)]\"." -#: plpy_typeio.c:1396 +#: plpy_typeio.c:1378 #, c-format msgid "key \"%s\" not found in mapping" msgstr "ë§µ ì•ˆì— \"%s\" 키가 ì—†ìŒ" -#: plpy_typeio.c:1397 +#: plpy_typeio.c:1379 #, c-format msgid "" "To return null in a column, add the value None to the mapping with the key " @@ -459,17 +448,17 @@ msgstr "" "칼럼값으로 nullì„ ë°˜í™˜í•˜ë ¤ë©´, 칼럼 다ìŒì— 해당 키 ì´ë¦„ê³¼ 맵핑 ë˜ëŠ” Noneê°’ì„ " "지정하세요" -#: plpy_typeio.c:1450 +#: plpy_typeio.c:1432 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "반환ë˜ëŠ” 시퀀스형 ë³€ìˆ˜ì˜ ê¸¸ì´ê°€ ë¡œìš°ì˜ ì¹¼ëŸ¼ìˆ˜ì™€ ì¼ì¹˜í•˜ì§€ 않ìŒ" -#: plpy_typeio.c:1548 +#: plpy_typeio.c:1530 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "Python ê°ì²´ ê°€ìš´ë° \"%s\" ì†ì„±ì´ ì—†ìŒ" -#: plpy_typeio.c:1551 +#: plpy_typeio.c:1533 #, c-format msgid "" "To return null in a column, let the returned object have an attribute named " @@ -478,24 +467,12 @@ msgstr "" "칼럼 값으로 null ì„ ë°˜í™˜í•˜ë ¤ë©´, 값으로 None ê°’ì„ ê°€ì§€ëŠ” 칼럼 ë’¤ì—, ì†ì„± ì´ë¦„" "ì´ ìžˆëŠ” ê°ì²´ë¥¼ 반환하세요" -#: plpy_util.c:35 +#: plpy_util.c:31 #, c-format msgid "could not convert Python Unicode object to bytes" msgstr "Python 유니코드 ê°ì²´ë¥¼ UTF-8 문ìžì—´ë¡œ 변환할 수 ì—†ìŒ" -#: plpy_util.c:41 +#: plpy_util.c:37 #, c-format msgid "could not extract bytes from encoded string" msgstr "해당 ì¸ì½”드 문ìžì—´ì„ Pythonì—서 사용할 수 ì—†ìŒ" - -#~ msgid "could not create new dictionary" -#~ msgstr "새 디렉터리를 만들 수 ì—†ìŒ" - -#~ msgid "could not create exception \"%s\"" -#~ msgstr "\"%s\" 예외처리를 ìƒì„±í•  수 ì—†ìŒ" - -#~ msgid "could not create globals" -#~ msgstr "ì „ì—­ë³€ìˆ˜ë“¤ì„ ë§Œë“¤ 수 ì—†ìŒ" - -#~ msgid "could not create new dictionary while building trigger arguments" -#~ msgstr "트리거 ì¸ìžë¥¼ 구성하는 중 새 딕션너리를 만들 수 ì—†ìŒ" diff --git a/src/pl/plpython/po/meson.build b/src/pl/plpython/po/meson.build index ddaa1913b84c9..ce93b43d682de 100644 --- a/src/pl/plpython/po/meson.build +++ b/src/pl/plpython/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('plpython-' + pg_version_major.to_string())] diff --git a/src/pl/plpython/po/ru.po b/src/pl/plpython/po/ru.po index 0b7259a0cc699..0b57951c61093 100644 --- a/src/pl/plpython/po/ru.po +++ b/src/pl/plpython/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: plpython (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-27 14:52+0300\n" +"POT-Creation-Date: 2025-02-08 07:44+0200\n" "PO-Revision-Date: 2019-08-29 15:42+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -14,25 +14,25 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #: plpy_cursorobject.c:72 #, c-format msgid "plpy.cursor expected a query or a plan" msgstr "plpy.cursor ожидает Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð»Ð¸ план" -#: plpy_cursorobject.c:155 +#: plpy_cursorobject.c:154 #, c-format msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor принимает в качеÑтве второго аргумента поÑледовательноÑть" -#: plpy_cursorobject.c:171 plpy_spi.c:205 +#: plpy_cursorobject.c:170 plpy_spi.c:204 #, c-format msgid "could not execute plan" msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ план" -#: plpy_cursorobject.c:174 plpy_spi.c:208 +#: plpy_cursorobject.c:173 plpy_spi.c:207 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" @@ -40,33 +40,33 @@ msgstr[0] "ОжидалаÑÑŒ поÑледовательноÑть из %d ар msgstr[1] "ОжидалаÑÑŒ поÑледовательноÑть из %d аргументов, получено %d: %s" msgstr[2] "ОжидалаÑÑŒ поÑледовательноÑть из %d аргументов, получено %d: %s" -#: plpy_cursorobject.c:321 +#: plpy_cursorobject.c:317 #, c-format msgid "iterating a closed cursor" msgstr "перемещение закрытого курÑора" -#: plpy_cursorobject.c:329 plpy_cursorobject.c:395 +#: plpy_cursorobject.c:325 plpy_cursorobject.c:391 #, c-format msgid "iterating a cursor in an aborted subtransaction" msgstr "перемещение курÑора в прерванной подтранзакции" -#: plpy_cursorobject.c:387 +#: plpy_cursorobject.c:383 #, c-format msgid "fetch from a closed cursor" msgstr "выборка из закрытого курÑора" -#: plpy_cursorobject.c:430 plpy_spi.c:401 +#: plpy_cursorobject.c:426 plpy_spi.c:393 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "" "результат запроÑа Ñодержит Ñлишком много Ñтрок Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ в ÑпиÑке Python" -#: plpy_cursorobject.c:482 +#: plpy_cursorobject.c:478 #, c-format msgid "closing a cursor in an aborted subtransaction" msgstr "закрытие курÑора в прерванной подтранзакции" -#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 +#: plpy_elog.c:122 plpy_elog.c:123 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" @@ -111,17 +111,24 @@ msgstr "процедура PL/Python вернула не None" msgid "PL/Python function with return type \"void\" did not return None" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ PL/Python Ñ Ñ‚Ð¸Ð¿Ð¾Ð¼ результата \"void\" вернула не None" -#: plpy_exec.c:369 plpy_exec.c:395 +#: plpy_exec.c:246 +#, c-format +msgid "" +"function returning record called in context that cannot accept type record" +msgstr "" +"функциÑ, Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, вызвана в контекÑте, не допуÑкающем Ñтот тип" + +#: plpy_exec.c:392 plpy_exec.c:416 #, c-format msgid "unexpected return value from trigger procedure" msgstr "Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð½Ð°Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð° вернула недопуÑтимое значение" -#: plpy_exec.c:370 +#: plpy_exec.c:393 #, c-format msgid "Expected None or a string." msgstr "ОжидалоÑÑŒ None или Ñтрока." -#: plpy_exec.c:385 +#: plpy_exec.c:406 #, c-format msgid "" "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" @@ -129,49 +136,42 @@ msgstr "" "Ñ‚Ñ€Ð¸Ð³Ð³ÐµÑ€Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ PL/Python вернула \"MODIFY\" в триггере DELETE -- " "игнорируетÑÑ" -#: plpy_exec.c:396 +#: plpy_exec.c:417 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "ОжидалоÑÑŒ None, \"OK\", \"SKIP\" или \"MODIFY\"." -#: plpy_exec.c:441 +#: plpy_exec.c:468 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "ошибка в PyList_SetItem() при наÑтройке аргументов" -#: plpy_exec.c:445 +#: plpy_exec.c:472 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "ошибка в PyDict_SetItemString() при наÑтройке аргументов" -#: plpy_exec.c:457 -#, c-format -msgid "" -"function returning record called in context that cannot accept type record" -msgstr "" -"функциÑ, Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, вызвана в контекÑте, не допуÑкающем Ñтот тип" - -#: plpy_exec.c:674 +#: plpy_exec.c:701 #, c-format msgid "while creating return value" msgstr "при Ñоздании возвращаемого значениÑ" -#: plpy_exec.c:908 +#: plpy_exec.c:952 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "Ñлемент TD[\"new\"] удалён -- изменить Ñтроку нельзÑ" -#: plpy_exec.c:913 +#: plpy_exec.c:957 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] - не Ñловарь" -#: plpy_exec.c:938 +#: plpy_exec.c:982 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "ключ ÑÐ»Ð¾Ð²Ð°Ñ€Ñ TD[\"new\"] Ñ Ð¿Ð¾Ñ€Ñдковым номером %d не ÑвлÑетÑÑ Ñтрокой" -#: plpy_exec.c:945 +#: plpy_exec.c:989 #, c-format msgid "" "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering " @@ -180,62 +180,62 @@ msgstr "" "ключу \"%s\", найденному в TD[\"new\"], не ÑоответÑтвует Ñтолбец в Ñтроке, " "обрабатываемой триггером" -#: plpy_exec.c:950 +#: plpy_exec.c:994 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "приÑвоить значение ÑиÑтемному атрибуту \"%s\" нельзÑ" -#: plpy_exec.c:955 +#: plpy_exec.c:999 #, c-format msgid "cannot set generated column \"%s\"" msgstr "приÑвоить значение генерируемому Ñтолбцу \"%s\" нельзÑ" -#: plpy_exec.c:1013 +#: plpy_exec.c:1057 #, c-format msgid "while modifying trigger row" msgstr "при изменении Ñтроки в триггере" -#: plpy_exec.c:1071 +#: plpy_exec.c:1115 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "принудительное прерывание незавершённой подтранзакции" -#: plpy_main.c:111 +#: plpy_main.c:109 #, c-format msgid "multiple Python libraries are present in session" msgstr "в ÑеанÑе предÑтавлено неÑколько библиотек Python" -#: plpy_main.c:112 +#: plpy_main.c:110 #, c-format msgid "Only one Python major version can be used in one session." msgstr "Ð’ одном ÑеанÑе Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Python разных Ñтарших верÑий." -#: plpy_main.c:124 +#: plpy_main.c:122 #, c-format msgid "untrapped error in initialization" msgstr "Ð½ÐµÐ¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° при инициализации" -#: plpy_main.c:147 +#: plpy_main.c:145 #, c-format msgid "could not import \"__main__\" module" msgstr "не удалоÑÑŒ импортировать модуль \"__main__\"" -#: plpy_main.c:156 +#: plpy_main.c:154 #, c-format msgid "could not initialize globals" msgstr "не удалоÑÑŒ инициализировать глобальные данные" -#: plpy_main.c:354 +#: plpy_main.c:352 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "процедура PL/Python \"%s\"" -#: plpy_main.c:357 +#: plpy_main.c:355 #, c-format msgid "PL/Python function \"%s\"" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ PL/Python \"%s\"" -#: plpy_main.c:365 +#: plpy_main.c:363 #, c-format msgid "PL/Python anonymous code block" msgstr "анонимный блок кода PL/Python" @@ -284,27 +284,27 @@ msgstr "'%s' - недопуÑтимое ключевое Ñлово (аргум msgid "invalid SQLSTATE code" msgstr "неверный код SQLSTATE" -#: plpy_procedure.c:225 +#: plpy_procedure.c:226 #, c-format msgid "trigger functions can only be called as triggers" msgstr "триггерные функции могут вызыватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в триггерах" -#: plpy_procedure.c:229 +#: plpy_procedure.c:230 #, c-format msgid "PL/Python functions cannot return type %s" msgstr "функции PL/Python не могут возвращать тип %s" -#: plpy_procedure.c:307 +#: plpy_procedure.c:308 #, c-format msgid "PL/Python functions cannot accept type %s" msgstr "функции PL/Python не могут принимать тип %s" -#: plpy_procedure.c:397 +#: plpy_procedure.c:396 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "не удалоÑÑŒ Ñкомпилировать функцию PL/Python \"%s\"" -#: plpy_procedure.c:400 +#: plpy_procedure.c:399 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "не удалоÑÑŒ Ñкомпилировать анонимный блок кода PL/Python" @@ -329,17 +329,17 @@ msgstr "plpy.prepare: Ð¸Ð¼Ñ Ñ‚Ð¸Ð¿Ð° Ñ Ð¿Ð¾Ñ€Ñдковым номером %d msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute ожидает Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð»Ð¸ план" -#: plpy_spi.c:189 +#: plpy_spi.c:188 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute принимает в качеÑтве второго аргумента поÑледовательноÑть" -#: plpy_spi.c:297 +#: plpy_spi.c:289 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "ошибка в SPI_execute_plan: %s" -#: plpy_spi.c:339 +#: plpy_spi.c:331 #, c-format msgid "SPI_execute failed: %s" msgstr "ошибка в SPI_execute: %s" @@ -364,32 +364,32 @@ msgstr "Ñта Ð¿Ð¾Ð´Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ ÐµÑ‰Ñ‘ не начата" msgid "there is no subtransaction to exit from" msgstr "нет подтранзакции, которую нужно закончить" -#: plpy_typeio.c:587 +#: plpy_typeio.c:588 #, c-format msgid "could not import a module for Decimal constructor" msgstr "не удалоÑÑŒ импортировать модуль Ð´Ð»Ñ ÐºÐ¾Ð½Ñтруктора Decimal" -#: plpy_typeio.c:591 +#: plpy_typeio.c:592 #, c-format msgid "no Decimal attribute in module" msgstr "в модуле нет атрибута Decimal" -#: plpy_typeio.c:597 +#: plpy_typeio.c:598 #, c-format msgid "conversion from numeric to Decimal failed" msgstr "не удалоÑÑŒ преобразовать numeric в Decimal" -#: plpy_typeio.c:911 +#: plpy_typeio.c:912 #, c-format msgid "could not create bytes representation of Python object" msgstr "не удалоÑÑŒ Ñоздать байтовое предÑтавление объекта Python" -#: plpy_typeio.c:1048 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" msgstr "не удалоÑÑŒ Ñоздать Ñтроковое предÑтавление объекта Python" -#: plpy_typeio.c:1059 +#: plpy_typeio.c:1060 #, c-format msgid "" "could not convert Python object into cstring: Python string representation " @@ -398,56 +398,45 @@ msgstr "" "не удалоÑÑŒ преобразовать объект Python в cstring: похоже, предÑтавление " "Ñтроки Python Ñодержит нулевые байты" -#: plpy_typeio.c:1170 +#: plpy_typeio.c:1157 #, c-format -msgid "number of array dimensions exceeds the maximum allowed (%d)" -msgstr "чиÑло размерноÑтей маÑÑива превышает предел (%d)" +msgid "" +"return value of function with array return type is not a Python sequence" +msgstr "" +"возвращаемое значение функции Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð¼-маÑÑивом не ÑвлÑетÑÑ " +"поÑледовательноÑтью" -#: plpy_typeio.c:1175 +#: plpy_typeio.c:1202 #, c-format msgid "could not determine sequence length for function return value" msgstr "" "не удалоÑÑŒ определить длину поÑледовательноÑти в возвращаемом функцией " "значении" -#: plpy_typeio.c:1180 plpy_typeio.c:1186 -#, c-format -msgid "array size exceeds the maximum allowed" -msgstr "размер маÑÑива превышает предел" - -#: plpy_typeio.c:1214 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 #, c-format msgid "" -"return value of function with array return type is not a Python sequence" +"multidimensional arrays must have array expressions with matching dimensions" msgstr "" -"возвращаемое значение функции Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð¼-маÑÑивом не ÑвлÑетÑÑ " -"поÑледовательноÑтью" - -#: plpy_typeio.c:1261 -#, c-format -msgid "wrong length of inner sequence: has length %d, but %d was expected" -msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° внутренней поÑледовательноÑти: %d (ожидалоÑÑŒ: %d)" +"Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¼ÐµÑ€Ð½Ñ‹Ñ… маÑÑивов должны задаватьÑÑ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ ÑоответÑтвующими " +"размерноÑÑ‚Ñми" -#: plpy_typeio.c:1263 +#: plpy_typeio.c:1227 #, c-format -msgid "" -"To construct a multidimensional array, the inner sequences must all have the " -"same length." -msgstr "" -"Ð”Ð»Ñ Ð¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¼ÐµÑ€Ð½Ð¾Ð³Ð¾ маÑÑива внутренние поÑледовательноÑти должны " -"иметь одинаковую длину." +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "чиÑло размерноÑтей маÑÑива превышает предел (%d)" -#: plpy_typeio.c:1342 +#: plpy_typeio.c:1329 #, c-format msgid "malformed record literal: \"%s\"" msgstr "ошибка в литерале запиÑи: \"%s\"" -#: plpy_typeio.c:1343 +#: plpy_typeio.c:1330 #, c-format msgid "Missing left parenthesis." msgstr "ОтÑутÑтвует Ð»ÐµÐ²Ð°Ñ Ñкобка." -#: plpy_typeio.c:1344 plpy_typeio.c:1545 +#: plpy_typeio.c:1331 plpy_typeio.c:1532 #, c-format msgid "" "To return a composite type in an array, return the composite type as a " @@ -456,12 +445,12 @@ msgstr "" "Чтобы возвратить ÑоÑтавной тип в маÑÑиве, нужно возвратить ÑоÑтавное " "значение в виде кортежа Python, например: \"[('foo',)]\"." -#: plpy_typeio.c:1391 +#: plpy_typeio.c:1378 #, c-format msgid "key \"%s\" not found in mapping" msgstr "ключ \"%s\" не найден в ÑопоÑтавлении" -#: plpy_typeio.c:1392 +#: plpy_typeio.c:1379 #, c-format msgid "" "To return null in a column, add the value None to the mapping with the key " @@ -470,17 +459,17 @@ msgstr "" "Чтобы приÑвоить Ñтолбцу NULL, добавьте в ÑопоÑтавление значение None Ñ " "ключом-именем Ñтолбца." -#: plpy_typeio.c:1445 +#: plpy_typeio.c:1432 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "длина возвращённой поÑледовательноÑти не равна чиÑлу Ñтолбцов в Ñтроке" -#: plpy_typeio.c:1543 +#: plpy_typeio.c:1530 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "в объекте Python не ÑущеÑтвует атрибут \"%s\"" -#: plpy_typeio.c:1546 +#: plpy_typeio.c:1533 #, c-format msgid "" "To return null in a column, let the returned object have an attribute named " @@ -499,6 +488,22 @@ msgstr "не удалоÑÑŒ преобразовать объект Python Unico msgid "could not extract bytes from encoded string" msgstr "не удалоÑÑŒ извлечь байты из кодированной Ñтроки" +#, c-format +#~ msgid "array size exceeds the maximum allowed" +#~ msgstr "размер маÑÑива превышает предел" + +#, c-format +#~ msgid "wrong length of inner sequence: has length %d, but %d was expected" +#~ msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° внутренней поÑледовательноÑти: %d (ожидалоÑÑŒ: %d)" + +#, c-format +#~ msgid "" +#~ "To construct a multidimensional array, the inner sequences must all have " +#~ "the same length." +#~ msgstr "" +#~ "Ð”Ð»Ñ Ð¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¼ÐµÑ€Ð½Ð¾Ð³Ð¾ маÑÑива внутренние поÑледовательноÑти должны " +#~ "иметь одинаковую длину." + #~ msgid "could not create new dictionary while building trigger arguments" #~ msgstr "не удалоÑÑŒ Ñоздать Ñловарь Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ аргументов триггера" @@ -511,15 +516,6 @@ msgstr "не удалоÑÑŒ извлечь байты из кодированн #~ msgid "could not create new dictionary" #~ msgstr "не удалоÑÑŒ Ñоздать Ñловарь" -#~ msgid "" -#~ "multidimensional arrays must have array expressions with matching " -#~ "dimensions. PL/Python function return value has sequence length %d while " -#~ "expected %d" -#~ msgstr "" -#~ "Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¼ÐµÑ€Ð½Ñ‹Ñ… маÑÑивов должны задаватьÑÑ Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ ÑоответÑтвующими " -#~ "размерноÑÑ‚Ñми. Ð’ возвращаемом функцией на PL/Python значении " -#~ "поÑледовательноÑть имеет длину %d (а ожидалоÑÑŒ %d)" - #~ msgid "plan.status takes no arguments" #~ msgstr "plan.status не принимает аргументы" diff --git a/src/pl/plpython/po/sv.po b/src/pl/plpython/po/sv.po index 1dcae6ced3841..54f3db92ff479 100644 --- a/src/pl/plpython/po/sv.po +++ b/src/pl/plpython/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for plpython # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 14\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-04-11 01:08+0000\n" -"PO-Revision-Date: 2023-03-09 22:41+0100\n" +"POT-Creation-Date: 2024-07-13 15:38+0000\n" +"PO-Revision-Date: 2024-07-13 18:15+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,54 +17,54 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: plpy_cursorobject.c:74 +#: plpy_cursorobject.c:72 #, c-format msgid "plpy.cursor expected a query or a plan" msgstr "plpy.cursor förväntade sig en frÃ¥ga eller en plan" -#: plpy_cursorobject.c:157 +#: plpy_cursorobject.c:155 #, c-format msgid "plpy.cursor takes a sequence as its second argument" msgstr "plpy.cursor tar en sekvens som sitt andra argument" -#: plpy_cursorobject.c:173 plpy_spi.c:207 +#: plpy_cursorobject.c:171 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "kunde inte exekvera plan" -#: plpy_cursorobject.c:176 plpy_spi.c:210 +#: plpy_cursorobject.c:174 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" msgstr[0] "Förväntade sekvens med %d argument, fick %d: %s" msgstr[1] "Förväntade sekvens med %d argument, fick %d: %s" -#: plpy_cursorobject.c:323 +#: plpy_cursorobject.c:321 #, c-format msgid "iterating a closed cursor" msgstr "itererar med en stängd markör" -#: plpy_cursorobject.c:331 plpy_cursorobject.c:397 +#: plpy_cursorobject.c:329 plpy_cursorobject.c:395 #, c-format msgid "iterating a cursor in an aborted subtransaction" msgstr "itererar med en markör i en avbruten subtransaktion" -#: plpy_cursorobject.c:389 +#: plpy_cursorobject.c:387 #, c-format msgid "fetch from a closed cursor" msgstr "hämta frÃ¥n en stängd markör" -#: plpy_cursorobject.c:432 plpy_spi.c:403 +#: plpy_cursorobject.c:430 plpy_spi.c:401 #, c-format msgid "query result has too many rows to fit in a Python list" msgstr "frÃ¥geresultet har för mÃ¥nga rader för att fÃ¥ plats i en Python-lista" -#: plpy_cursorobject.c:484 +#: plpy_cursorobject.c:482 #, c-format msgid "closing a cursor in an aborted subtransaction" msgstr "stänger en markör i en avbruten subtransaktion" -#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:549 +#: plpy_elog.c:122 plpy_elog.c:123 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" @@ -104,166 +104,166 @@ msgstr "PL/Python-procedur returnerade inte None" msgid "PL/Python function with return type \"void\" did not return None" msgstr "PL/Python-funktion med returtyp \"void\" returnerade inte None" -#: plpy_exec.c:371 plpy_exec.c:397 +#: plpy_exec.c:246 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "en funktion med post som värde anropades i sammanhang där poster inte kan godtagas." + +#: plpy_exec.c:392 plpy_exec.c:416 #, c-format msgid "unexpected return value from trigger procedure" msgstr "oväntat returvärde frÃ¥n triggerprocedur" -#: plpy_exec.c:372 +#: plpy_exec.c:393 #, c-format msgid "Expected None or a string." msgstr "Förväntade None eller en sträng." -#: plpy_exec.c:387 +#: plpy_exec.c:406 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "PL/Python-triggerfunktion returnerade \"MODIFY\" i en DELETE-trigger -- ignorerad" -#: plpy_exec.c:398 +#: plpy_exec.c:417 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "Förväntade None, \"OK\", \"SKIP\" eller \"MODIFY\"." -#: plpy_exec.c:443 +#: plpy_exec.c:468 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "PyList_SetItem() misslyckades vid uppsättning av argument" -#: plpy_exec.c:447 +#: plpy_exec.c:472 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "PyDict_SetItemString() misslyckades vid uppsättning av argument" -#: plpy_exec.c:459 -#, c-format -msgid "function returning record called in context that cannot accept type record" -msgstr "en funktion med post som värde anropades i sammanhang där poster inte kan godtagas." - -#: plpy_exec.c:676 +#: plpy_exec.c:701 #, c-format msgid "while creating return value" msgstr "vid skapande av returvärde" -#: plpy_exec.c:910 +#: plpy_exec.c:952 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] raderad, kan inte modifiera rad" -#: plpy_exec.c:915 +#: plpy_exec.c:957 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] är inte en dictionary" -#: plpy_exec.c:942 +#: plpy_exec.c:982 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "TD[\"new\"] dictionary-nyckel vid numerisk position %d är inte en sträng" -#: plpy_exec.c:949 +#: plpy_exec.c:989 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "nyckel \"%s\" hittad i TD[\"new\"] finns inte som en kolumn i den triggande raden" -#: plpy_exec.c:954 +#: plpy_exec.c:994 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "kan inte sätta systemattribut \"%s\"" -#: plpy_exec.c:959 +#: plpy_exec.c:999 #, c-format msgid "cannot set generated column \"%s\"" msgstr "kan inte sätta genererad kolumn \"%s\"" -#: plpy_exec.c:1017 +#: plpy_exec.c:1057 #, c-format msgid "while modifying trigger row" msgstr "vid modifiering av triggerrad" -#: plpy_exec.c:1075 +#: plpy_exec.c:1115 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "tvingar avbrytande av subtransaktion som inte har avslutats" -#: plpy_main.c:121 +#: plpy_main.c:109 #, c-format msgid "multiple Python libraries are present in session" msgstr "multipla Python-bibliotek är aktiva i sessionen" -#: plpy_main.c:122 +#: plpy_main.c:110 #, c-format msgid "Only one Python major version can be used in one session." msgstr "Bara en major-version av Python kan användas i en session." -#: plpy_main.c:138 +#: plpy_main.c:122 #, c-format msgid "untrapped error in initialization" msgstr "ej fÃ¥ngar fel i initiering" -#: plpy_main.c:161 +#: plpy_main.c:145 #, c-format msgid "could not import \"__main__\" module" msgstr "kunde inte importera \"__main__\"-modul" -#: plpy_main.c:170 +#: plpy_main.c:154 #, c-format msgid "could not initialize globals" msgstr "kunde inte initierar globaler" -#: plpy_main.c:393 +#: plpy_main.c:352 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "PL/Python-procedur \"%s\"" -#: plpy_main.c:396 +#: plpy_main.c:355 #, c-format msgid "PL/Python function \"%s\"" msgstr "PL/Python-funktion \"%s\"" -#: plpy_main.c:404 +#: plpy_main.c:363 #, c-format msgid "PL/Python anonymous code block" msgstr "PL/Python anonymt kodblock" -#: plpy_plpymodule.c:182 plpy_plpymodule.c:185 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" msgstr "kunde inte importera \"plpy\"-modul" -#: plpy_plpymodule.c:200 +#: plpy_plpymodule.c:182 #, c-format msgid "could not create the spiexceptions module" msgstr "kunde inte skapa modulen spiexceptions" -#: plpy_plpymodule.c:208 +#: plpy_plpymodule.c:190 #, c-format msgid "could not add the spiexceptions module" msgstr "kunde inte lägga till modulen spiexceptions" -#: plpy_plpymodule.c:276 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" msgstr "kunde inte skapa SPI-undantag" -#: plpy_plpymodule.c:444 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" msgstr "kunde inte packa upp argument i plpy.elog" -#: plpy_plpymodule.c:453 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" msgstr "kunde inte parsa felmeddelande i plpy.elog" -#: plpy_plpymodule.c:470 +#: plpy_plpymodule.c:451 #, c-format msgid "argument 'message' given by name and position" msgstr "argumentet 'message' angivet med namn och position" -#: plpy_plpymodule.c:497 +#: plpy_plpymodule.c:478 #, c-format msgid "'%s' is an invalid keyword argument for this function" msgstr "'%s' är ett ogiltigt nyckelordsargument för denna funktion" -#: plpy_plpymodule.c:508 plpy_plpymodule.c:514 +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" msgstr "ogiltig SQLSTATE-kod" @@ -283,17 +283,17 @@ msgstr "PL/Python-funktioner kan inte returnera typ %s" msgid "PL/Python functions cannot accept type %s" msgstr "PL/Python-funktioner kan inte ta emot typ %s" -#: plpy_procedure.c:398 +#: plpy_procedure.c:396 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "kunde inte kompilera PL/Python-funktion \"%s\"" -#: plpy_procedure.c:401 +#: plpy_procedure.c:399 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "kunde inte kompilera anonymt PL/Python-kodblock" -#: plpy_resultobject.c:119 plpy_resultobject.c:145 plpy_resultobject.c:171 +#: plpy_resultobject.c:117 plpy_resultobject.c:143 plpy_resultobject.c:169 #, c-format msgid "command did not produce a result set" msgstr "kommandot producerade inte en resultatmängd" @@ -303,147 +303,137 @@ msgstr "kommandot producerade inte en resultatmängd" msgid "second argument of plpy.prepare must be a sequence" msgstr "andra argumentet till plpy.prepare mÃ¥ste vara en sekvens" -#: plpy_spi.c:100 +#: plpy_spi.c:98 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" msgstr "plpy.prepare: typnamn vid numerisk position %d är inte en sträng" -#: plpy_spi.c:172 +#: plpy_spi.c:170 #, c-format msgid "plpy.execute expected a query or a plan" msgstr "plpy.execute förväntade en frÃ¥ga eller en plan" -#: plpy_spi.c:191 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" msgstr "plpy.execute tar en sekvens som sitt andra argument" -#: plpy_spi.c:299 +#: plpy_spi.c:297 #, c-format msgid "SPI_execute_plan failed: %s" msgstr "SPI_execute_plan misslyckades: %s" -#: plpy_spi.c:341 +#: plpy_spi.c:339 #, c-format msgid "SPI_execute failed: %s" msgstr "SPI_execute misslyckades: %s" -#: plpy_subxactobject.c:93 +#: plpy_subxactobject.c:92 #, c-format msgid "this subtransaction has already been entered" msgstr "denna subtransaktion har redan gÃ¥tts in i" -#: plpy_subxactobject.c:99 plpy_subxactobject.c:157 +#: plpy_subxactobject.c:98 plpy_subxactobject.c:156 #, c-format msgid "this subtransaction has already been exited" msgstr "denna subtransaktion har redan avslutat" -#: plpy_subxactobject.c:151 +#: plpy_subxactobject.c:150 #, c-format msgid "this subtransaction has not been entered" msgstr "denna subtransaktion har inte gÃ¥tts in i" -#: plpy_subxactobject.c:163 +#: plpy_subxactobject.c:162 #, c-format msgid "there is no subtransaction to exit from" msgstr "det finns ingen subtransaktion att avsluta frÃ¥n" -#: plpy_typeio.c:587 +#: plpy_typeio.c:588 #, c-format msgid "could not import a module for Decimal constructor" msgstr "kunde inte importera en modul för Decimal-konstruktorn" -#: plpy_typeio.c:591 +#: plpy_typeio.c:592 #, c-format msgid "no Decimal attribute in module" msgstr "inga Decimal-attribut i modulen" -#: plpy_typeio.c:597 +#: plpy_typeio.c:598 #, c-format msgid "conversion from numeric to Decimal failed" msgstr "konvertering frÃ¥n numeric till Decimal misslyckades" -#: plpy_typeio.c:911 +#: plpy_typeio.c:912 #, c-format msgid "could not create bytes representation of Python object" msgstr "kunde inte skapa byte-representation av Python-objekt" -#: plpy_typeio.c:1056 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" msgstr "kunde inte skapa strängrepresentation av Python-objekt" -#: plpy_typeio.c:1067 +#: plpy_typeio.c:1060 #, c-format msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" msgstr "kunde inte konvertera Python-objekt till cstring: Python-strängrepresentationen verkar innehÃ¥lla noll-bytes" -#: plpy_typeio.c:1176 +#: plpy_typeio.c:1157 #, c-format -msgid "number of array dimensions exceeds the maximum allowed (%d)" -msgstr "antal array-dimensioner överskriver maximalt tillÃ¥tna (%d)" +msgid "return value of function with array return type is not a Python sequence" +msgstr "returvärde för funktion med array-returtyp är inte en Python-sekvens" -#: plpy_typeio.c:1180 +#: plpy_typeio.c:1202 #, c-format msgid "could not determine sequence length for function return value" msgstr "kunde inte bestämma sekvenslängd för funktionens returvärde" -#: plpy_typeio.c:1183 plpy_typeio.c:1187 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 #, c-format -msgid "array size exceeds the maximum allowed" -msgstr "array-storlek överskrider maximalt tillÃ¥tna" +msgid "multidimensional arrays must have array expressions with matching dimensions" +msgstr "flerdimensionella vektorer mÃ¥ste ha array-uttryck av passande dimensioner" -#: plpy_typeio.c:1213 +#: plpy_typeio.c:1227 #, c-format -msgid "return value of function with array return type is not a Python sequence" -msgstr "returvärde för funktion med array-returtyp är inte en Python-sekvens" - -#: plpy_typeio.c:1259 -#, c-format -msgid "wrong length of inner sequence: has length %d, but %d was expected" -msgstr "fel längd pÃ¥ inre sekvens: har längd %d, men %d förväntades" - -#: plpy_typeio.c:1261 -#, c-format -msgid "To construct a multidimensional array, the inner sequences must all have the same length." -msgstr "För att skapa en multidimensionell array sÃ¥ skall alla de inre sekvenserna ha samma längd." +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "antal array-dimensioner överskriver maximalt tillÃ¥tna (%d)" -#: plpy_typeio.c:1340 +#: plpy_typeio.c:1329 #, c-format msgid "malformed record literal: \"%s\"" msgstr "felaktig postliteral: \"%s\"" -#: plpy_typeio.c:1341 +#: plpy_typeio.c:1330 #, c-format msgid "Missing left parenthesis." msgstr "Saknar vänster parentes" -#: plpy_typeio.c:1342 plpy_typeio.c:1543 +#: plpy_typeio.c:1331 plpy_typeio.c:1532 #, c-format msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." msgstr "För att returnera en composite-typ i en array, returnera composite-typen som en Python-tupel, t.ex. \"[('foo',)]\"." -#: plpy_typeio.c:1389 +#: plpy_typeio.c:1378 #, c-format msgid "key \"%s\" not found in mapping" msgstr "nyckeln \"%s\" hittades inte i mapping" -#: plpy_typeio.c:1390 +#: plpy_typeio.c:1379 #, c-format msgid "To return null in a column, add the value None to the mapping with the key named after the column." msgstr "För att returnera null i en kolumn sÃ¥ lägg till värdet None till mappningen med nyckelnamn taget frÃ¥n kolumnen." -#: plpy_typeio.c:1443 +#: plpy_typeio.c:1432 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "längden pÃ¥ den returnerade sekvensen matchade inte antal kolumner i raden" -#: plpy_typeio.c:1541 +#: plpy_typeio.c:1530 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "attributet \"%s\" finns inte i Python-objektet" -#: plpy_typeio.c:1544 +#: plpy_typeio.c:1533 #, c-format msgid "To return null in a column, let the returned object have an attribute named after column with value None." msgstr "För att returnera null i en kolumn sÃ¥ lÃ¥t det returnerade objektet ha ett attribut med namn efter kolumnen och med värdet None." diff --git a/src/pl/plpython/po/uk.po b/src/pl/plpython/po/uk.po index a3b308fcaf292..22ef7bc349bf0 100644 --- a/src/pl/plpython/po/uk.po +++ b/src/pl/plpython/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:38+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:09+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,8 +14,8 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/plpython.pot\n" -"X-Crowdin-File-ID: 884\n" +"X-Crowdin-File: /REL_17_STABLE/plpython.pot\n" +"X-Crowdin-File-ID: 1014\n" #: plpy_cursorobject.c:72 #, c-format @@ -66,7 +66,7 @@ msgstr "результат запиту має забагато Ñ€Ñдків д msgid "closing a cursor in an aborted subtransaction" msgstr "Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ ÐºÑƒÑ€Ñора в перерваній транзакції" -#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 +#: plpy_elog.c:122 plpy_elog.c:123 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" @@ -106,122 +106,122 @@ msgstr "процедура PL/Python не повернула None" msgid "PL/Python function with return type \"void\" did not return None" msgstr "PL/Python Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð· типом результату \"void\" не повернули None" -#: plpy_exec.c:369 plpy_exec.c:395 +#: plpy_exec.c:246 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "функціÑ, що повертає набір, викликана у контекÑті, що не приймає тип запиÑ" + +#: plpy_exec.c:392 plpy_exec.c:416 #, c-format msgid "unexpected return value from trigger procedure" msgstr "неочікуване Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð¸ тригера" -#: plpy_exec.c:370 +#: plpy_exec.c:393 #, c-format msgid "Expected None or a string." msgstr "ОчікувалоÑÑŒ None або Ñ€Ñдок." -#: plpy_exec.c:385 +#: plpy_exec.c:406 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" msgstr "Тригерна Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ PL/Python повернула \"MODIFY\" в тригері DELETE -- проігноровано" -#: plpy_exec.c:396 +#: plpy_exec.c:417 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." msgstr "ОчікувалоÑÑŒ None, \"OK\", \"SKIP\" або \"MODIFY\"." -#: plpy_exec.c:441 +#: plpy_exec.c:468 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" msgstr "помилка PyList_SetItem() під Ñ‡Ð°Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð²" -#: plpy_exec.c:445 +#: plpy_exec.c:472 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" msgstr "помилка PyDict_SetItemString() під Ñ‡Ð°Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ–Ð²" -#: plpy_exec.c:457 -#, c-format -msgid "function returning record called in context that cannot accept type record" -msgstr "функціÑ, що повертає набір, викликана у контекÑті, що не приймає тип запиÑ" - -#: plpy_exec.c:674 +#: plpy_exec.c:701 #, c-format msgid "while creating return value" msgstr "під Ñ‡Ð°Ñ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñƒ" -#: plpy_exec.c:908 +#: plpy_exec.c:952 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] видалено, неможливо змінити Ñ€Ñдок" -#: plpy_exec.c:913 +#: plpy_exec.c:957 #, c-format msgid "TD[\"new\"] is not a dictionary" msgstr "TD[\"new\"] не Ñ” Ñловником" -#: plpy_exec.c:938 +#: plpy_exec.c:982 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" msgstr "ключ Ñловника TD[\"new\"] на порÑдковий позиції %d не Ñ” Ñ€Ñдком" -#: plpy_exec.c:945 +#: plpy_exec.c:989 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" msgstr "ключ \"%s\" знайдений у TD[\"new\"] не Ñ–Ñнує Ñк Ñтовпець у Ñ€Ñдку тригера" -#: plpy_exec.c:950 +#: plpy_exec.c:994 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "не вдалоÑÑ Ð²Ñтановити ÑиÑтемний атрибут \"%s\"" -#: plpy_exec.c:955 +#: plpy_exec.c:999 #, c-format msgid "cannot set generated column \"%s\"" msgstr "неможливо оновити згенерований Ñтовпець \"%s\"" -#: plpy_exec.c:1013 +#: plpy_exec.c:1057 #, c-format msgid "while modifying trigger row" msgstr "під Ñ‡Ð°Ñ Ð·Ð¼Ñ–Ð½Ð¸ Ñ€Ñдка тригера" -#: plpy_exec.c:1071 +#: plpy_exec.c:1115 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "примуÑове Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ñубтранзакції, Ñка не вийшла" -#: plpy_main.c:111 +#: plpy_main.c:109 #, c-format msgid "multiple Python libraries are present in session" msgstr "декілька бібліотек Python приÑутні у ÑеÑÑ–Ñ—" -#: plpy_main.c:112 +#: plpy_main.c:110 #, c-format msgid "Only one Python major version can be used in one session." msgstr "За один ÑÐµÐ°Ð½Ñ Ð¼Ð¾Ð¶Ðµ викориÑтовуватиÑÑ Ð»Ð¸ÑˆÐµ одна оÑновна верÑÑ–Ñ Python." -#: plpy_main.c:124 +#: plpy_main.c:122 #, c-format msgid "untrapped error in initialization" msgstr "неопрацьована помилка під Ñ‡Ð°Ñ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·Ð°Ñ†Ñ–Ñ—" -#: plpy_main.c:147 +#: plpy_main.c:145 #, c-format msgid "could not import \"__main__\" module" msgstr "не вдалоÑÑ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸ \"__main__\" модуль" -#: plpy_main.c:156 +#: plpy_main.c:154 #, c-format msgid "could not initialize globals" msgstr "не вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ globals" -#: plpy_main.c:354 +#: plpy_main.c:352 #, c-format msgid "PL/Python procedure \"%s\"" msgstr "PL/Python процедура \"%s\"" -#: plpy_main.c:357 +#: plpy_main.c:355 #, c-format msgid "PL/Python function \"%s\"" msgstr "PL/Python Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\"" -#: plpy_main.c:365 +#: plpy_main.c:363 #, c-format msgid "PL/Python anonymous code block" msgstr "анонімні коди блоку PL/Python" @@ -270,27 +270,27 @@ msgstr "'%s' Ñ” неприпуÑтимим ключовим Ñловом-арг msgid "invalid SQLSTATE code" msgstr "неприпуÑтимий код SQLSTATE" -#: plpy_procedure.c:225 +#: plpy_procedure.c:226 #, c-format msgid "trigger functions can only be called as triggers" msgstr "тригер-Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¼Ð¾Ð¶Ðµ викликатиÑÑ Ð»Ð¸ÑˆÐµ Ñк тригер" -#: plpy_procedure.c:229 +#: plpy_procedure.c:230 #, c-format msgid "PL/Python functions cannot return type %s" msgstr "PL/Python функції не можуть повернути тип %s" -#: plpy_procedure.c:307 +#: plpy_procedure.c:308 #, c-format msgid "PL/Python functions cannot accept type %s" msgstr "PL/Python функції не можуть прийнÑти тип %s" -#: plpy_procedure.c:397 +#: plpy_procedure.c:396 #, c-format msgid "could not compile PL/Python function \"%s\"" msgstr "не вдалоÑÑ Ñкомпілювати функцію PL/Python \"%s\"" -#: plpy_procedure.c:400 +#: plpy_procedure.c:399 #, c-format msgid "could not compile anonymous PL/Python code block" msgstr "не вдалоÑÑ Ñкомпілювати анонімні коди блоку PL/Python" @@ -350,102 +350,92 @@ msgstr "Ñ†Ñ ÑÑƒÐ±Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ñ–Ñ Ñ‰Ðµ не почалаÑÑ" msgid "there is no subtransaction to exit from" msgstr "немає Ñубтранзакції, щоб з неї вийти" -#: plpy_typeio.c:587 +#: plpy_typeio.c:588 #, c-format msgid "could not import a module for Decimal constructor" msgstr "не вдалоÑÑ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ñ‚Ð¸ модуль Ð´Ð»Ñ ÐºÐ¾Ð½Ñтруктора Decimal" -#: plpy_typeio.c:591 +#: plpy_typeio.c:592 #, c-format msgid "no Decimal attribute in module" msgstr "відÑутній атрибут Decimal у модулі" -#: plpy_typeio.c:597 +#: plpy_typeio.c:598 #, c-format msgid "conversion from numeric to Decimal failed" msgstr "не вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð· numeric на Decimal" -#: plpy_typeio.c:911 +#: plpy_typeio.c:912 #, c-format msgid "could not create bytes representation of Python object" msgstr "не вдалоÑÑ Ñтворити байтову репрезентацію об'єкта Python" -#: plpy_typeio.c:1048 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" msgstr "не вдалоÑÑ Ñтворити Ñ€Ñдкову репрезентацію об'єкта Python" -#: plpy_typeio.c:1059 +#: plpy_typeio.c:1060 #, c-format msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" msgstr "не вдалоÑÑ Ð¿ÐµÑ€ÐµÑ‚Ð²Ð¾Ñ€Ð¸Ñ‚Ð¸ об'єкт Python на cstring: Ñ€ÐµÐ¿Ñ€ÐµÐ·ÐµÐ½Ñ‚Ð°Ñ†Ñ–Ñ Ñ€Ñдка Python міÑтить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ null-байти" -#: plpy_typeio.c:1170 +#: plpy_typeio.c:1157 #, c-format -msgid "number of array dimensions exceeds the maximum allowed (%d)" -msgstr "кількіÑть вимірів маÑиву перевищує макÑимально дозволену (%d)" +msgid "return value of function with array return type is not a Python sequence" +msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— з маÑивом в ÑкоÑті результату не Ñ” поÑлідовніÑтю Python" -#: plpy_typeio.c:1175 +#: plpy_typeio.c:1202 #, c-format msgid "could not determine sequence length for function return value" msgstr "не вдалоÑÑ Ð²Ð¸Ð·Ð½Ð°Ñ‡Ð¸Ñ‚Ð¸ довжину поÑлідовноÑті Ð´Ð»Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ" -#: plpy_typeio.c:1180 plpy_typeio.c:1186 -#, c-format -msgid "array size exceeds the maximum allowed" -msgstr "розмір маÑиву перевищує макÑимально дозволений" - -#: plpy_typeio.c:1214 -#, c-format -msgid "return value of function with array return type is not a Python sequence" -msgstr "Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ— з маÑивом в ÑкоÑті результату не Ñ” поÑлідовніÑтю Python" - -#: plpy_typeio.c:1261 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 #, c-format -msgid "wrong length of inner sequence: has length %d, but %d was expected" -msgstr "неправильна довжина внутрішньої поÑлідовноÑті: довжина %d, але очікуєтьÑÑ %d" +msgid "multidimensional arrays must have array expressions with matching dimensions" +msgstr "Ð´Ð»Ñ Ð±Ð°Ð³Ð°Ñ‚Ð¾Ð²Ð¸Ð¼Ñ–Ñ€Ð½Ð¸Ñ… маÑивів повинні задаватиÑÑŒ вирази з відповідними вимірами" -#: plpy_typeio.c:1263 +#: plpy_typeio.c:1227 #, c-format -msgid "To construct a multidimensional array, the inner sequences must all have the same length." -msgstr "Щоб побудувати багатовимірний маÑив, внутрішні поÑлідовноÑті повинні мати однакову довжину." +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "кількіÑть вимірів маÑиву перевищує макÑимально дозволену (%d)" -#: plpy_typeio.c:1342 +#: plpy_typeio.c:1329 #, c-format msgid "malformed record literal: \"%s\"" msgstr "невірно Ñформований літерал запиÑу: \"%s\"" -#: plpy_typeio.c:1343 +#: plpy_typeio.c:1330 #, c-format msgid "Missing left parenthesis." msgstr "ВідÑÑƒÑ‚Ð½Ñ Ð»Ñ–Ð²Ð° дужка." -#: plpy_typeio.c:1344 plpy_typeio.c:1545 +#: plpy_typeio.c:1331 plpy_typeio.c:1532 #, c-format msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." msgstr "Щоб повернути Ñкладений тип в маÑиві, треба повернути композитний тип Ñк кортеж Python, наприклад, \"[('foo',)]\"." -#: plpy_typeio.c:1391 +#: plpy_typeio.c:1378 #, c-format msgid "key \"%s\" not found in mapping" msgstr "ключ \"%s\" не знайдено в зіÑтавленні" -#: plpy_typeio.c:1392 +#: plpy_typeio.c:1379 #, c-format msgid "To return null in a column, add the value None to the mapping with the key named after the column." msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ null в Ñтовпці, додайте Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ None з ключом, що дорівнює імені ÑтовпцÑ." -#: plpy_typeio.c:1445 +#: plpy_typeio.c:1432 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "довжина повернутої поÑлідовноÑті не відповідає кількоÑті Ñтовпців у Ñ€Ñдку" -#: plpy_typeio.c:1543 +#: plpy_typeio.c:1530 #, c-format msgid "attribute \"%s\" does not exist in Python object" msgstr "атрибут \"%s\" не Ñ–Ñнує в об'єкті Python" -#: plpy_typeio.c:1546 +#: plpy_typeio.c:1533 #, c-format msgid "To return null in a column, let the returned object have an attribute named after column with value None." msgstr "Щоб повернути null в Ñтовпці, результуючий об'єкт має мати атрибут з іменем ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ Ð·Ñ– значеннÑм None." diff --git a/src/pl/plpython/po/zh_CN.po b/src/pl/plpython/po/zh_CN.po index 264d4f52f6f4b..50b34ebe847dd 100644 --- a/src/pl/plpython/po/zh_CN.po +++ b/src/pl/plpython/po/zh_CN.po @@ -1,43 +1,43 @@ # LANGUAGE message translation file for plpython # Copyright (C) 2010 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# FIRST AUTHOR , 2010. +# Dianjin Wang , 2024 # msgid "" msgstr "" -"Project-Id-Version: plpython (PostgreSQL) 14\n" +"Project-Id-Version: plpython (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-08-14 05:38+0000\n" -"PO-Revision-Date: 2021-08-16 18:00+0800\n" -"Last-Translator: Jie Zhang \n" +"POT-Creation-Date: 2024-09-13 22:40+0000\n" +"PO-Revision-Date: 2024-09-14 14:12+0800\n" +"Last-Translator: Dianjin Wang \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 1.5.7\n" +"X-Generator: Poedit 3.4.4\n" #: plpy_cursorobject.c:72 #, c-format msgid "plpy.cursor expected a query or a plan" -msgstr "plpy.cursor期望一个查询或一个计划" +msgstr "plpy.cursor 期望一个查询或一个计划" #: plpy_cursorobject.c:155 #, c-format msgid "plpy.cursor takes a sequence as its second argument" -msgstr "plpy.cursor将一个åºåˆ—ä½œä¸ºå®ƒçš„ç¬¬äºŒä¸ªå‚æ•°" +msgstr "plpy.cursor 将一个åºåˆ—ä½œä¸ºå®ƒçš„ç¬¬äºŒä¸ªå‚æ•°" -#: plpy_cursorobject.c:171 plpy_spi.c:207 +#: plpy_cursorobject.c:171 plpy_spi.c:205 #, c-format msgid "could not execute plan" msgstr "无法执行计划" -#: plpy_cursorobject.c:174 plpy_spi.c:210 +#: plpy_cursorobject.c:174 plpy_spi.c:208 #, c-format msgid "Expected sequence of %d argument, got %d: %s" msgid_plural "Expected sequence of %d arguments, got %d: %s" -msgstr[0] "期望%dåºåˆ—傿•°,但是得到%d: %s" +msgstr[0] "期望 %d 傿•°åºåˆ—, 但是得到 %d: %s" #: plpy_cursorobject.c:321 #, c-format @@ -54,17 +54,17 @@ msgstr "在终止的å­äº‹åŠ¡é‡Œé历一个游标" msgid "fetch from a closed cursor" msgstr "从关闭的游标里获å–结果" -#: plpy_cursorobject.c:430 plpy_spi.c:403 +#: plpy_cursorobject.c:430 plpy_spi.c:401 #, c-format msgid "query result has too many rows to fit in a Python list" -msgstr "查询结果中的行太多,无法放在一个Python列表中" +msgstr "查询结果中的行太多,无法放在一个 Python 列表中" #: plpy_cursorobject.c:482 #, c-format msgid "closing a cursor in an aborted subtransaction" msgstr "在终止的å­äº‹åŠ¡é‡Œå…³é—­ä¸€ä¸ªæ¸¸æ ‡" -#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:548 +#: plpy_elog.c:122 plpy_elog.c:123 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" @@ -77,221 +77,221 @@ msgstr "䏿”¯æŒé›†åˆå‡½æ•°è¿”回模å¼" #: plpy_exec.c:140 #, c-format msgid "PL/Python set-returning functions only support returning one value per call." -msgstr "PL/Python集åˆè¿”å›žå‡½æ•°åªæ”¯æŒåœ¨æ¯æ¬¡è°ƒç”¨æ—¶è¿”回一个值。" +msgstr "PL/Python 集åˆè¿”å›žå‡½æ•°åªæ”¯æŒåœ¨æ¯æ¬¡è°ƒç”¨æ—¶è¿”回一个值." #: plpy_exec.c:153 #, c-format msgid "returned object cannot be iterated" -msgstr "所返回的对象无法迭代" +msgstr "所返回的对象无法进行é历" #: plpy_exec.c:154 #, c-format msgid "PL/Python set-returning functions must return an iterable object." -msgstr "PL/Python集åˆè¿”回函数必须返回一个å¯è¿­ä»£çš„对象." +msgstr "PL/Python 集åˆè¿”回函数必须返回一个å¯é历的对象." #: plpy_exec.c:168 #, c-format msgid "error fetching next item from iterator" -msgstr "当从迭代器中å–回下一个æˆå‘˜æ—¶å‡ºçŽ°é”™è¯¯" +msgstr "当从迭代器中获å–下一个æˆå‘˜æ—¶å‡ºçŽ°é”™è¯¯" #: plpy_exec.c:211 #, c-format msgid "PL/Python procedure did not return None" -msgstr "PL/Python过程没有返回None" +msgstr "PL/Python 过程没有返回 None" #: plpy_exec.c:215 #, c-format msgid "PL/Python function with return type \"void\" did not return None" -msgstr "返回类型为\"void\"çš„PL/Python函数ä¸è¿”回None" +msgstr "返回类型为 \"void\" çš„ PL/Python 函数ä¸è¿”回 None" -#: plpy_exec.c:371 plpy_exec.c:397 +#: plpy_exec.c:246 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "è¿”å›žå€¼ç±»åž‹æ˜¯è®°å½•çš„å‡½æ•°åœ¨ä¸æŽ¥å—使用记录类型的环境中调用" + +#: plpy_exec.c:392 plpy_exec.c:416 #, c-format msgid "unexpected return value from trigger procedure" msgstr "在触å‘å™¨å­˜å‚¨è¿‡ç¨‹å‡ºçŽ°éžæœŸæœ›çš„返回值" -#: plpy_exec.c:372 +#: plpy_exec.c:393 #, c-format msgid "Expected None or a string." -msgstr "期望空值或一个字符串" +msgstr "期望 None 或一个字符串." -#: plpy_exec.c:387 +#: plpy_exec.c:406 #, c-format msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" -msgstr "在DELETE触å‘器中的PL/Python 触å‘器函数返回 \"MODIFY\" -- 忽略" +msgstr "在 DELETE 触å‘器中的 PL/Python 触å‘器函数返回 \"MODIFY\" -- 忽略" -#: plpy_exec.c:398 +#: plpy_exec.c:417 #, c-format msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." -msgstr "期望None, \"OK\", \"SKIP\", 或\"MODIFY\"" +msgstr "期望 None, \"OK\", \"SKIP\", 或\"MODIFYâ€." -#: plpy_exec.c:443 +#: plpy_exec.c:468 #, c-format msgid "PyList_SetItem() failed, while setting up arguments" -msgstr "å½“è®¾ç½®å‚æ•°çš„åŒæ—¶, 执行PyList_SetItem()失败" +msgstr "å½“è®¾ç½®å‚æ•°çš„åŒæ—¶, 执行 PyList_SetItem() 失败" -#: plpy_exec.c:447 +#: plpy_exec.c:472 #, c-format msgid "PyDict_SetItemString() failed, while setting up arguments" -msgstr "å½“è®¾ç½®å‚æ•°çš„åŒæ—¶, 执行PyDict_SetItemString()失败" - -#: plpy_exec.c:459 -#, c-format -msgid "function returning record called in context that cannot accept type record" -msgstr "è¿”å›žå€¼ç±»åž‹æ˜¯è®°å½•çš„å‡½æ•°åœ¨ä¸æŽ¥å—使用记录类型的环境中调用" +msgstr "å½“è®¾ç½®å‚æ•°çš„åŒæ—¶, 执行 PyDict_SetItemString() 失败" -#: plpy_exec.c:676 +#: plpy_exec.c:701 #, c-format msgid "while creating return value" msgstr "åŒæ—¶åœ¨åˆ›å»ºè¿”回值" -#: plpy_exec.c:910 +#: plpy_exec.c:952 #, c-format msgid "TD[\"new\"] deleted, cannot modify row" msgstr "TD[\"new\"] 已删除,无法修改记录" -#: plpy_exec.c:915 +#: plpy_exec.c:957 #, c-format msgid "TD[\"new\"] is not a dictionary" -msgstr "TD[\"new\"]䏿˜¯ä¸€ä¸ªå­—å…¸" +msgstr "TD[\"new\"] 䏿˜¯ä¸€ä¸ªå­—å…¸" -#: plpy_exec.c:942 +#: plpy_exec.c:982 #, c-format msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" -msgstr "在顺åºä½ç½®%dçš„TD[\"new\"]字兏键值䏿˜¯å­—符串" +msgstr "在顺åºä½ç½® %d çš„ TD[\"new\"] 字兏键值䏿˜¯å­—符串" -#: plpy_exec.c:949 +#: plpy_exec.c:989 #, c-format msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" -msgstr "在 TD[\"new\"]中找到的键 \"%s\"在正在触å‘çš„è®°å½•ä¸­ä¸æ˜¯ä½œä¸ºåˆ—而存在." +msgstr "在 TD[\"new\"] 中找到的键 \"%s\" 在正在触å‘çš„è®°å½•ä¸­ä¸æ˜¯ä½œä¸ºåˆ—而存在" -#: plpy_exec.c:954 +#: plpy_exec.c:994 #, c-format msgid "cannot set system attribute \"%s\"" -msgstr "ä¸èƒ½è®¾ç½®ç³»ç»Ÿå±žæ€§\"%s\"" +msgstr "无法设置系统属性 \"%s\"" -#: plpy_exec.c:959 +#: plpy_exec.c:999 #, c-format msgid "cannot set generated column \"%s\"" msgstr "无法设置生æˆçš„列 \"%s\"" -#: plpy_exec.c:1017 +#: plpy_exec.c:1057 #, c-format msgid "while modifying trigger row" msgstr "åŒæ—¶æ­£åœ¨ä¿®æ”¹è§¦å‘器记录" -#: plpy_exec.c:1075 +#: plpy_exec.c:1115 #, c-format msgid "forcibly aborting a subtransaction that has not been exited" msgstr "强行终止一个还未退出的å­äº‹åŠ¡" -#: plpy_main.c:121 +#: plpy_main.c:109 #, c-format msgid "multiple Python libraries are present in session" -msgstr "会è¯ä¸­å­˜åœ¨å¤šä¸ªPython库" +msgstr "会è¯ä¸­å­˜åœ¨å¤šä¸ª Python 库" -#: plpy_main.c:122 +#: plpy_main.c:110 #, c-format msgid "Only one Python major version can be used in one session." -msgstr "一个会è¯ä¸­åªèƒ½ä½¿ç”¨ä¸€ä¸ªPython主版本." +msgstr "一个会è¯ä¸­åªèƒ½ä½¿ç”¨ä¸€ä¸ª Python 主版本." -#: plpy_main.c:138 +#: plpy_main.c:122 #, c-format msgid "untrapped error in initialization" msgstr "在åˆå§‹åŒ–过程中出现无法æ•获的错误" -#: plpy_main.c:161 +#: plpy_main.c:145 #, c-format msgid "could not import \"__main__\" module" -msgstr "无法导入模å—\"__main__\" " +msgstr "无法导入 \"__main__\" 模å—" -#: plpy_main.c:170 +#: plpy_main.c:154 #, c-format msgid "could not initialize globals" msgstr "无法åˆå§‹åŒ–全局å˜é‡" -#: plpy_main.c:393 +#: plpy_main.c:352 #, c-format msgid "PL/Python procedure \"%s\"" -msgstr "PL/Python过程\"%s\"" +msgstr "PL/Python 过程 \"%s\"" -#: plpy_main.c:396 +#: plpy_main.c:355 #, c-format msgid "PL/Python function \"%s\"" -msgstr "PL/Python函数\"%s\"" +msgstr "PL/Python 函数\"%s\"" -#: plpy_main.c:404 +#: plpy_main.c:363 #, c-format msgid "PL/Python anonymous code block" -msgstr "PL/Python匿å代ç å—" +msgstr "PL/Python 匿å代ç å—" -#: plpy_plpymodule.c:182 plpy_plpymodule.c:185 +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 #, c-format msgid "could not import \"plpy\" module" -msgstr "无法导入模å—\"plpy\" " +msgstr "无法导入 \"plpy\" 模å—" -#: plpy_plpymodule.c:200 +#: plpy_plpymodule.c:182 #, c-format msgid "could not create the spiexceptions module" -msgstr "无法创建spiexceptions模å—" +msgstr "无法创建 spiexceptions 模å—" -#: plpy_plpymodule.c:208 +#: plpy_plpymodule.c:190 #, c-format msgid "could not add the spiexceptions module" -msgstr "无法添加spiexceptionsæ¨¡å— " +msgstr "无法添加 spiexceptions 模å—" -#: plpy_plpymodule.c:275 +#: plpy_plpymodule.c:257 #, c-format msgid "could not generate SPI exceptions" -msgstr "无法产生SPI异常" +msgstr "无法产生 SPI 异常" -#: plpy_plpymodule.c:443 +#: plpy_plpymodule.c:425 #, c-format msgid "could not unpack arguments in plpy.elog" -msgstr "无法解æžplpy.elogä¸­çš„å‚æ•°" +msgstr "无法解包 plpy.elog ä¸­çš„å‚æ•°" -#: plpy_plpymodule.c:452 +#: plpy_plpymodule.c:434 msgid "could not parse error message in plpy.elog" -msgstr "无法解æžåœ¨plpy.elog中的错误消æ¯" +msgstr "æ— æ³•è§£æž plpy.elog 中的错误消æ¯" -#: plpy_plpymodule.c:469 +#: plpy_plpymodule.c:451 #, c-format msgid "argument 'message' given by name and position" -msgstr "ç”±åç§°å’Œä½ç½®æä¾›çš„傿•°'message'" +msgstr "ç”±åç§°å’Œä½ç½®æä¾›çš„傿•° 'message'" -#: plpy_plpymodule.c:496 +#: plpy_plpymodule.c:478 #, c-format msgid "'%s' is an invalid keyword argument for this function" -msgstr "对于这个函数,'%s'是一个无效的关键è¯å‚æ•°" +msgstr "对于这个函数,'%s' 是一个无效的关键è¯å‚æ•°" -#: plpy_plpymodule.c:507 plpy_plpymodule.c:513 +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 #, c-format msgid "invalid SQLSTATE code" -msgstr "无效的SQLSTATE代ç " +msgstr "无效的 SQLSTATE 代ç " -#: plpy_procedure.c:225 +#: plpy_procedure.c:226 #, c-format msgid "trigger functions can only be called as triggers" -msgstr "触å‘器函数åªèƒ½ä»¥è§¦å‘器的形å¼è°ƒç”¨" +msgstr "触å‘器函数åªèƒ½ä»¥è§¦å‘器的形å¼è¢«è°ƒç”¨" -#: plpy_procedure.c:229 +#: plpy_procedure.c:230 #, c-format msgid "PL/Python functions cannot return type %s" -msgstr "PL/Python函数ä¸èƒ½è¿”回类型%s" +msgstr "PL/Python 函数ä¸èƒ½è¿”回类型 %s" -#: plpy_procedure.c:307 +#: plpy_procedure.c:308 #, c-format msgid "PL/Python functions cannot accept type %s" -msgstr "PL/Python函数ä¸èƒ½æŽ¥å—类型%s" +msgstr "PL/Python 函数ä¸èƒ½æŽ¥å—类型 %s" -#: plpy_procedure.c:397 +#: plpy_procedure.c:396 #, c-format msgid "could not compile PL/Python function \"%s\"" -msgstr "无法编译PL/Python函数\"%s\"" +msgstr "无法编译 PL/Python 函数 \"%s\"" -#: plpy_procedure.c:400 +#: plpy_procedure.c:399 #, c-format msgid "could not compile anonymous PL/Python code block" -msgstr "无法编译PL/Python中的匿å代ç å—" +msgstr "无法编译 PL/Python 中的匿å代ç å—" #: plpy_resultobject.c:117 plpy_resultobject.c:143 plpy_resultobject.c:169 #, c-format @@ -301,32 +301,32 @@ msgstr "命令没有产生结果集" #: plpy_spi.c:56 #, c-format msgid "second argument of plpy.prepare must be a sequence" -msgstr "plpy.prepareçš„ç¬¬äºŒä¸ªå‚æ•°å¿…须是一个åºåˆ—" +msgstr "plpy.prepare çš„ç¬¬äºŒä¸ªå‚æ•°å¿…须是一个åºåˆ—" -#: plpy_spi.c:100 +#: plpy_spi.c:98 #, c-format msgid "plpy.prepare: type name at ordinal position %d is not a string" -msgstr "plpy.prepare: 在顺åºä½ç½®%d的类型åç§°ä¸æ˜¯string" +msgstr "plpy.prepare: 在顺åºä½ç½® %d 的类型åç§°ä¸æ˜¯ä¸€ä¸ªå­—符串" -#: plpy_spi.c:172 +#: plpy_spi.c:170 #, c-format msgid "plpy.execute expected a query or a plan" -msgstr "plpy.execute期望一个查询或一个计划" +msgstr "plpy.execute 期望一个查询或一个计划" -#: plpy_spi.c:191 +#: plpy_spi.c:189 #, c-format msgid "plpy.execute takes a sequence as its second argument" -msgstr "plpy.execute将一个åºåˆ—ä½œä¸ºå®ƒçš„ç¬¬äºŒä¸ªå‚æ•°" +msgstr "plpy.execute 将一个åºåˆ—ä½œä¸ºå®ƒçš„ç¬¬äºŒä¸ªå‚æ•°" -#: plpy_spi.c:299 +#: plpy_spi.c:297 #, c-format msgid "SPI_execute_plan failed: %s" -msgstr "执行SPI_execute_plan失败: %s" +msgstr "SPI_execute_plan 执行失败: %s" -#: plpy_spi.c:341 +#: plpy_spi.c:339 #, c-format msgid "SPI_execute failed: %s" -msgstr "SPI_execute执行失败: %s" +msgstr "SPI_execute 执行失败: %s" #: plpy_subxactobject.c:92 #, c-format @@ -348,112 +348,114 @@ msgstr "该å­äº‹åС仿²¡æœ‰è¿›å…¥" msgid "there is no subtransaction to exit from" msgstr "没有å­äº‹åŠ¡å¯ä»¥é€€å‡º" -#: plpy_typeio.c:587 +#: plpy_typeio.c:588 #, c-format msgid "could not import a module for Decimal constructor" msgstr "无法为å进制构造函数导入模å—" -#: plpy_typeio.c:591 +#: plpy_typeio.c:592 #, c-format msgid "no Decimal attribute in module" msgstr "模å—ä¸­æ²¡æœ‰å°æ•°ä½å±žæ€§" -#: plpy_typeio.c:597 +#: plpy_typeio.c:598 #, c-format msgid "conversion from numeric to Decimal failed" -msgstr "ç”±numeric数值到Decimalå°æ•°è½¬æ¢å¤±è´¥" +msgstr "ç”± numeric 数值到 Decimal å°æ•°è½¬æ¢å¤±è´¥" -#: plpy_typeio.c:911 +#: plpy_typeio.c:912 #, c-format msgid "could not create bytes representation of Python object" -msgstr "无法创建Python对象的字节表达å¼" +msgstr "无法创建 Python 对象的字节表达å¼" -#: plpy_typeio.c:1056 +#: plpy_typeio.c:1049 #, c-format msgid "could not create string representation of Python object" -msgstr "无法创建Python对象的字符串表达å¼" +msgstr "无法创建 Python 对象的字符串表达å¼" -#: plpy_typeio.c:1067 +#: plpy_typeio.c:1060 #, c-format msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" -msgstr "无法将Python对象转æ¢ä¸ºcstring: Python字符串表达å¼å¯èƒ½åŒ…å«ç©ºå­—节" +msgstr "无法将 Python 对象转æ¢ä¸º cstring: Python 字符串表达å¼å¯èƒ½åŒ…å«ç©ºå­—节" -#: plpy_typeio.c:1178 +#: plpy_typeio.c:1157 #, c-format -msgid "number of array dimensions exceeds the maximum allowed (%d)" -msgstr "数组的维数超过最大å…许值(%d)" +msgid "return value of function with array return type is not a Python sequence" +msgstr "å¸¦æœ‰æ•°ç»„è¿”å›žç±»åž‹çš„å‡½æ•°è¿”å›žå€¼ä¸æ˜¯ä¸€ä¸ª Python åºåˆ—" -#: plpy_typeio.c:1183 +#: plpy_typeio.c:1202 #, c-format msgid "could not determine sequence length for function return value" msgstr "无法确定函数返回值的åºåˆ—长度" -#: plpy_typeio.c:1188 plpy_typeio.c:1194 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 #, c-format -msgid "array size exceeds the maximum allowed" -msgstr "数组的大å°è¶…过了最大å…许值" +msgid "multidimensional arrays must have array expressions with matching dimensions" +msgstr "多维数组必须有符åˆç»´åº¦çš„æ•°ç»„表达å¼" -#: plpy_typeio.c:1222 +#: plpy_typeio.c:1227 #, c-format -msgid "return value of function with array return type is not a Python sequence" -msgstr "å¸¦æœ‰æ•°ç»„è¿”å›žç±»åž‹çš„å‡½æ•°è¿”å›žå€¼ä¸æ˜¯ä¸€ä¸ªPythonåºåˆ—" - -#: plpy_typeio.c:1269 -#, c-format -msgid "wrong length of inner sequence: has length %d, but %d was expected" -msgstr "内部åºåˆ—的长度错误:长度为%d,但应为%d" - -#: plpy_typeio.c:1271 -#, c-format -msgid "To construct a multidimensional array, the inner sequences must all have the same length." -msgstr "è¦æž„造多维数组,内部åºåˆ—的长度必须相åŒ." +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "数组的维数超过最大å…许值 (%d)" -#: plpy_typeio.c:1350 +#: plpy_typeio.c:1329 #, c-format msgid "malformed record literal: \"%s\"" msgstr "有缺陷的记录常é‡: \"%s\"" -#: plpy_typeio.c:1351 +#: plpy_typeio.c:1330 #, c-format msgid "Missing left parenthesis." -msgstr "缺少一个左括弧" +msgstr "缺少一个左括弧." -#: plpy_typeio.c:1352 plpy_typeio.c:1553 +#: plpy_typeio.c:1331 plpy_typeio.c:1532 #, c-format msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." -msgstr "è¦è¿”回数组中的å¤åˆç±»åž‹ï¼Œè¯·å°†å¤åˆç±»åž‹ä½œä¸ºPython元组返回,例如 \"[('foo',)]\"." +msgstr "è¦è¿”回数组中的å¤åˆç±»åž‹ï¼Œè¯·å°†å¤åˆç±»åž‹ä½œä¸º Python 元组返回,例如 \"[('foo',)]\"." -#: plpy_typeio.c:1399 +#: plpy_typeio.c:1378 #, c-format msgid "key \"%s\" not found in mapping" -msgstr "在映射中没有找到键\"%s\"" +msgstr "在映射中没有找到键 \"%s\"" -#: plpy_typeio.c:1400 +#: plpy_typeio.c:1379 #, c-format msgid "To return null in a column, add the value None to the mapping with the key named after the column." -msgstr "为了在一列中返回空值, 需è¦åœ¨åˆ—çš„åŽé¢å¯¹å¸¦æœ‰å·²å‘½å键的映射添加值None" +msgstr "为了在一列中返回空值, 需è¦åœ¨åˆ—çš„åŽé¢å¯¹å¸¦æœ‰å·²å‘½å键的映射添加值 None." -#: plpy_typeio.c:1453 +#: plpy_typeio.c:1432 #, c-format msgid "length of returned sequence did not match number of columns in row" msgstr "所返回åºåˆ—的长度与在记录中列的数é‡ä¸åŒ¹é…" -#: plpy_typeio.c:1551 +#: plpy_typeio.c:1530 #, c-format msgid "attribute \"%s\" does not exist in Python object" -msgstr "在Python对象中ä¸å­˜åœ¨å±žæ€§\"%s\"" +msgstr "在 Python 对象中ä¸å­˜åœ¨å±žæ€§ \"%s\"" -#: plpy_typeio.c:1554 +#: plpy_typeio.c:1533 #, c-format msgid "To return null in a column, let the returned object have an attribute named after column with value None." -msgstr "为了在一列中返回空值, 需è¦è®©è¿”回的对象在带有值None的列åŽé¢çš„带有已命å属性" +msgstr "为了在一列中返回空值, 需è¦è®©è¿”回的对象在带有值 None 的列åŽé¢çš„带有已命å属性." #: plpy_util.c:31 #, c-format msgid "could not convert Python Unicode object to bytes" -msgstr "无法将Python中以Unicodeç¼–ç çš„对象转æ¢ä¸ºPostgreSQLæœåŠ¡å™¨å­—èŠ‚ç " +msgstr "无法将 Python 中的 Unicode ç¼–ç å¯¹è±¡è½¬æ¢ä¸º PostgreSQL æœåŠ¡å™¨å­—èŠ‚ç " #: plpy_util.c:37 #, c-format msgid "could not extract bytes from encoded string" -msgstr "无法从已编ç å­—符串里æå–相应字节ç å€¼" +msgstr "无法从已编ç å­—符串里æå–相应字节" + +#, c-format +#~ msgid "To construct a multidimensional array, the inner sequences must all have the same length." +#~ msgstr "è¦æž„造多维数组,内部åºåˆ—的长度必须相åŒ." + +#, c-format +#~ msgid "array size exceeds the maximum allowed" +#~ msgstr "数组的大å°è¶…过了最大å…许值" + +#, c-format +#~ msgid "wrong length of inner sequence: has length %d, but %d was expected" +#~ msgstr "内部åºåˆ—的长度错误:长度为%d,但应为%d" diff --git a/src/pl/plpython/po/zh_TW.po b/src/pl/plpython/po/zh_TW.po new file mode 100644 index 0000000000000..d69888102c694 --- /dev/null +++ b/src/pl/plpython/po/zh_TW.po @@ -0,0 +1,496 @@ +# Traditional Chinese message translation file for plpython +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the plpython (PostgreSQL) package. +# Zhenbang Wei , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: plpython (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-11 20:38+0000\n" +"PO-Revision-Date: 2023-11-06 08:50+0800\n" +"Last-Translator: Zhenbang Wei \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.4.1\n" + +#: plpy_cursorobject.c:72 +#, c-format +msgid "plpy.cursor expected a query or a plan" +msgstr "plpy.cursor é æœŸæŸ¥è©¢æˆ–計劃" + +#: plpy_cursorobject.c:155 +#, c-format +msgid "plpy.cursor takes a sequence as its second argument" +msgstr "plpy.execute 接å—åºåˆ—åšç‚ºç¬¬äºŒå€‹åƒæ•¸" + +#: plpy_cursorobject.c:171 plpy_spi.c:205 +#, c-format +msgid "could not execute plan" +msgstr "無法執行計畫" + +#: plpy_cursorobject.c:174 plpy_spi.c:208 +#, c-format +msgid "Expected sequence of %d argument, got %d: %s" +msgid_plural "Expected sequence of %d arguments, got %d: %s" +msgstr[0] "é æœŸ %d å€‹åƒæ•¸åºåˆ—,收到 %d 個: %s" + +# sql_help.h:345 +#: plpy_cursorobject.c:321 +#, c-format +msgid "iterating a closed cursor" +msgstr "迭代已關閉的游標" + +# postmaster/postmaster.c:1832 +#: plpy_cursorobject.c:329 plpy_cursorobject.c:395 +#, c-format +msgid "iterating a cursor in an aborted subtransaction" +msgstr "在已中止的å­äº¤æ˜“中迭代游標" + +# sql_help.h:109 +#: plpy_cursorobject.c:387 +#, c-format +msgid "fetch from a closed cursor" +msgstr "從已關閉的游標中擷å–資料" + +#: plpy_cursorobject.c:430 plpy_spi.c:401 +#, c-format +msgid "query result has too many rows to fit in a Python list" +msgstr "æŸ¥è©¢çµæžœçš„列數éŽå¤šï¼Œç„¡æ³•放入 Python 串列" + +# postmaster/postmaster.c:1832 +#: plpy_cursorobject.c:482 +#, c-format +msgid "closing a cursor in an aborted subtransaction" +msgstr "在已中止的å­äº¤æ˜“中關閉游標" + +# commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770 +# nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285 +#: plpy_elog.c:125 plpy_elog.c:126 plpy_plpymodule.c:530 +#, c-format +msgid "%s" +msgstr "%s" + +#: plpy_exec.c:139 +#, c-format +msgid "unsupported set function return mode" +msgstr "䏿”¯æ´çš„集åˆå‡½æ•¸å›žå‚³æ¨¡å¼" + +#: plpy_exec.c:140 +#, c-format +msgid "PL/Python set-returning functions only support returning one value per call." +msgstr "PL/Python 的集åˆå›žå‚³å‡½æ•¸åƒ…æ”¯æ´æ¯æ¬¡å‘¼å«å›žå‚³ä¸€å€‹å€¼ã€‚" + +#: plpy_exec.c:153 +#, c-format +msgid "returned object cannot be iterated" +msgstr "無法迭代回傳的物件" + +#: plpy_exec.c:154 +#, c-format +msgid "PL/Python set-returning functions must return an iterable object." +msgstr "PL/Python 的集åˆå›žå‚³å‡½æ•¸å¿…須回傳一個å¯è¿­ä»£çš„物件。" + +#: plpy_exec.c:168 +#, c-format +msgid "error fetching next item from iterator" +msgstr "從迭代器å–得下一個項目時發生錯誤" + +#: plpy_exec.c:211 +#, c-format +msgid "PL/Python procedure did not return None" +msgstr "PL/Python ç¨‹åºæœªå›žå‚³ None" + +#: plpy_exec.c:215 +#, c-format +msgid "PL/Python function with return type \"void\" did not return None" +msgstr "PL/Python 函數的回傳型別為 \"void\" 但未回傳 None" + +#: plpy_exec.c:369 plpy_exec.c:393 +#, c-format +msgid "unexpected return value from trigger procedure" +msgstr "觸發程åºå›žå‚³éžé æœŸçš„值" + +#: plpy_exec.c:370 +#, c-format +msgid "Expected None or a string." +msgstr "é æœŸ None 或字串。" + +#: plpy_exec.c:383 +#, c-format +msgid "PL/Python trigger function returned \"MODIFY\" in a DELETE trigger -- ignored" +msgstr "PL/Python 觸發函數在 DELETE 觸發器中回傳 \"MODIFY\" -- 已忽略" + +#: plpy_exec.c:394 +#, c-format +msgid "Expected None, \"OK\", \"SKIP\", or \"MODIFY\"." +msgstr "é æœŸ None 或 \"OK\" 或 \"SKIP\" 或 \"MODIFY\"。" + +#: plpy_exec.c:444 +#, c-format +msgid "PyList_SetItem() failed, while setting up arguments" +msgstr "設定 PyList_SetItem() çš„åƒæ•¸æ™‚失敗" + +#: plpy_exec.c:448 +#, c-format +msgid "PyDict_SetItemString() failed, while setting up arguments" +msgstr "設定 PyDict_SetItemString() çš„åƒæ•¸æ™‚失敗" + +#: plpy_exec.c:460 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "åœ¨ä¸æŽ¥å—紀錄型別的 context 中呼å«å›žå‚³ç´€éŒ„的函數" + +#: plpy_exec.c:677 +#, c-format +msgid "while creating return value" +msgstr "在建立回傳值時" + +#: plpy_exec.c:924 +#, c-format +msgid "TD[\"new\"] deleted, cannot modify row" +msgstr "TD[\"new\"] 已刪除,無法修改資料列" + +#: plpy_exec.c:929 +#, c-format +msgid "TD[\"new\"] is not a dictionary" +msgstr "TD[\"new\"] 䏿˜¯å­—å…¸" + +#: plpy_exec.c:954 +#, c-format +msgid "TD[\"new\"] dictionary key at ordinal position %d is not a string" +msgstr "使–¼é †åºä½ç½® %d çš„ TD[\"new\"] å­—å…¸éµä¸æ˜¯å­—串" + +#: plpy_exec.c:961 +#, c-format +msgid "key \"%s\" found in TD[\"new\"] does not exist as a column in the triggering row" +msgstr "TD[\"new\"] ä¸­çš„éµ \"%s\" ä¸åœ¨è§¸ç™¼è³‡æ–™åˆ—的欄ä½ä¸­" + +# commands/tablecmds.c:5425 +#: plpy_exec.c:966 +#, c-format +msgid "cannot set system attribute \"%s\"" +msgstr "無法設定系統屬性 \"%s\"" + +# commands/tablecmds.c:4580 +#: plpy_exec.c:971 +#, c-format +msgid "cannot set generated column \"%s\"" +msgstr "ç„¡æ³•è¨­å®šç”¢ç”Ÿçš„æ¬„ä½ \"%s\"" + +#: plpy_exec.c:1029 +#, c-format +msgid "while modifying trigger row" +msgstr "在修改觸發資料列時" + +#: plpy_exec.c:1087 +#, c-format +msgid "forcibly aborting a subtransaction that has not been exited" +msgstr "強制中止尚未退出的å­äº¤æ˜“" + +#: plpy_main.c:109 +#, c-format +msgid "multiple Python libraries are present in session" +msgstr "工作階段中有多個 Python 程å¼åº«" + +#: plpy_main.c:110 +#, c-format +msgid "Only one Python major version can be used in one session." +msgstr "åŒä¸€å€‹å·¥ä½œéšŽæ®µä¸­åªèƒ½ä½¿ç”¨ä¸€å€‹ Python 主è¦ç‰ˆæœ¬ã€‚" + +#: plpy_main.c:122 +#, c-format +msgid "untrapped error in initialization" +msgstr "åˆå§‹åŒ–中未被æ•ç²çš„錯誤" + +#: plpy_main.c:145 +#, c-format +msgid "could not import \"__main__\" module" +msgstr "無法匯入 \"__main__\" 模組" + +#: plpy_main.c:154 +#, c-format +msgid "could not initialize globals" +msgstr "無法åˆå§‹åŒ–全域變數" + +#: plpy_main.c:352 +#, c-format +msgid "PL/Python procedure \"%s\"" +msgstr "PL/Python ç¨‹åº \"%s\"" + +#: plpy_main.c:355 +#, c-format +msgid "PL/Python function \"%s\"" +msgstr "PL/Python 函數 \"%s\"" + +#: plpy_main.c:363 +#, c-format +msgid "PL/Python anonymous code block" +msgstr "PL/Python 匿å程å¼å€å¡Š" + +#: plpy_plpymodule.c:168 plpy_plpymodule.c:171 +#, c-format +msgid "could not import \"plpy\" module" +msgstr "無法匯入 \"plpy\" 模組" + +#: plpy_plpymodule.c:182 +#, c-format +msgid "could not create the spiexceptions module" +msgstr "無法建立 spiexceptions 模組" + +#: plpy_plpymodule.c:190 +#, c-format +msgid "could not add the spiexceptions module" +msgstr "無法新增 spiexceptions 模組" + +# access/transam/xlog.c:4111 +#: plpy_plpymodule.c:257 +#, c-format +msgid "could not generate SPI exceptions" +msgstr "無法產生 SPI 例外" + +#: plpy_plpymodule.c:425 +#, c-format +msgid "could not unpack arguments in plpy.elog" +msgstr "ç„¡æ³•è§£æž plpy.elog ä¸­çš„åƒæ•¸" + +#: plpy_plpymodule.c:434 +msgid "could not parse error message in plpy.elog" +msgstr "ç„¡æ³•è§£æž plpy.elog 中的錯誤訊æ¯" + +#: plpy_plpymodule.c:451 +#, c-format +msgid "argument 'message' given by name and position" +msgstr "åƒæ•¸ 'message' è¢«åŒæ™‚以å稱和ä½ç½®çµ¦å®š" + +# commands/define.c:279 +#: plpy_plpymodule.c:478 +#, c-format +msgid "'%s' is an invalid keyword argument for this function" +msgstr "這個函數的 '%s' 是無效關éµå­—åƒæ•¸" + +#: plpy_plpymodule.c:489 plpy_plpymodule.c:495 +#, c-format +msgid "invalid SQLSTATE code" +msgstr "無效的 SQLSTATE 碼" + +#: plpy_procedure.c:225 +#, c-format +msgid "trigger functions can only be called as triggers" +msgstr "觸發函數åªèƒ½ä½œç‚ºè§¸ç™¼å™¨è¢«å‘¼å«" + +#: plpy_procedure.c:229 +#, c-format +msgid "PL/Python functions cannot return type %s" +msgstr "PL/Python 函數無法回傳型別 %s" + +#: plpy_procedure.c:307 +#, c-format +msgid "PL/Python functions cannot accept type %s" +msgstr "PL/Python 函數ä¸èƒ½æŽ¥å—型別 %s" + +#: plpy_procedure.c:395 +#, c-format +msgid "could not compile PL/Python function \"%s\"" +msgstr "無法編譯 PL/Python 函數 \"%s\"" + +#: plpy_procedure.c:398 +#, c-format +msgid "could not compile anonymous PL/Python code block" +msgstr "無法編譯匿å PL/Python 程å¼å€å¡Š" + +#: plpy_resultobject.c:117 plpy_resultobject.c:143 plpy_resultobject.c:169 +#, c-format +msgid "command did not produce a result set" +msgstr "å‘½ä»¤æœªç”¢ç”Ÿçµæžœé›†" + +#: plpy_spi.c:56 +#, c-format +msgid "second argument of plpy.prepare must be a sequence" +msgstr "plpy.prepare çš„ç¬¬äºŒå€‹åƒæ•¸å¿…須是åºåˆ—" + +#: plpy_spi.c:98 +#, c-format +msgid "plpy.prepare: type name at ordinal position %d is not a string" +msgstr "plpy.prepare: é †åºä½ç½® %d 的型別åç¨±ä¸æ˜¯å­—串" + +#: plpy_spi.c:170 +#, c-format +msgid "plpy.execute expected a query or a plan" +msgstr "plpy.execute é æœŸæŸ¥è©¢æˆ–計畫" + +#: plpy_spi.c:189 +#, c-format +msgid "plpy.execute takes a sequence as its second argument" +msgstr "plpy.execute 接å—åºåˆ—åšç‚ºç¬¬äºŒå€‹åƒæ•¸" + +#: plpy_spi.c:297 +#, c-format +msgid "SPI_execute_plan failed: %s" +msgstr "SPI_execute_plan 失敗: %s" + +#: plpy_spi.c:339 +#, c-format +msgid "SPI_execute failed: %s" +msgstr "SPI_execute 失敗: %s" + +#: plpy_subxactobject.c:92 +#, c-format +msgid "this subtransaction has already been entered" +msgstr "已進入這個å­äº¤æ˜“" + +#: plpy_subxactobject.c:98 plpy_subxactobject.c:156 +#, c-format +msgid "this subtransaction has already been exited" +msgstr "å·²çµæŸé€™å€‹å­äº¤æ˜“" + +#: plpy_subxactobject.c:150 +#, c-format +msgid "this subtransaction has not been entered" +msgstr "尚未進入這個å­äº¤æ˜“" + +#: plpy_subxactobject.c:162 +#, c-format +msgid "there is no subtransaction to exit from" +msgstr "ç„¡éœ€çµæŸä»»ä½•å­äº¤æ˜“" + +#: plpy_typeio.c:588 +#, c-format +msgid "could not import a module for Decimal constructor" +msgstr "無法匯入 Decimal 建構å­çš„æ¨¡çµ„" + +#: plpy_typeio.c:592 +#, c-format +msgid "no Decimal attribute in module" +msgstr "模組中找ä¸åˆ° Decimal 屬性" + +#: plpy_typeio.c:598 +#, c-format +msgid "conversion from numeric to Decimal failed" +msgstr "從數值轉æ›ç‚º Decimal 失敗" + +#: plpy_typeio.c:912 +#, c-format +msgid "could not create bytes representation of Python object" +msgstr "無法建立 Python 物件的ä½å…ƒçµ„表示" + +#: plpy_typeio.c:1049 +#, c-format +msgid "could not create string representation of Python object" +msgstr "無法建立 Python 物件的字串表示" + +#: plpy_typeio.c:1060 +#, c-format +msgid "could not convert Python object into cstring: Python string representation appears to contain null bytes" +msgstr "無法將 Python 物件轉æ›ç‚º cstring: Python å­—ä¸²è¡¨ç¤ºä¸­ä¼¼ä¹ŽåŒ…å« null ä½å…ƒçµ„" + +#: plpy_typeio.c:1157 +#, c-format +msgid "return value of function with array return type is not a Python sequence" +msgstr "å›žå‚³åž‹åˆ¥æ˜¯é™£åˆ—çš„å‡½æ•¸çš„å›žå‚³å€¼ä¸¦éž Python åºåˆ—" + +# access/common/tupdesc.c:679 +#: plpy_typeio.c:1202 +#, c-format +msgid "could not determine sequence length for function return value" +msgstr "無法確定函數回傳值的åºåˆ—長度" + +# executor/execQual.c:2085 utils/adt/arrayfuncs.c:507 +#: plpy_typeio.c:1222 plpy_typeio.c:1237 plpy_typeio.c:1253 +#, c-format +msgid "multidimensional arrays must have array expressions with matching dimensions" +msgstr "多維陣列必須有相åŒç¶­åº¦çš„陣列表é”å¼" + +# executor/execQual.c:257 executor/execQual.c:285 executor/execQual.c:2065 +# utils/adt/array_userfuncs.c:362 utils/adt/arrayfuncs.c:216 +# utils/adt/arrayfuncs.c:472 utils/adt/arrayfuncs.c:1153 +# utils/adt/arrayfuncs.c:2421 +#: plpy_typeio.c:1227 +#, c-format +msgid "number of array dimensions exceeds the maximum allowed (%d)" +msgstr "陣列維度數超éŽå…許的最大值(%d)" + +# utils/adt/rowtypes.c:125 utils/adt/rowtypes.c:152 utils/adt/rowtypes.c:176 +# utils/adt/rowtypes.c:184 utils/adt/rowtypes.c:234 utils/adt/rowtypes.c:242 +#: plpy_typeio.c:1329 +#, c-format +msgid "malformed record literal: \"%s\"" +msgstr "æ ¼å¼éŒ¯èª¤çš„記錄文字: \"%s\"" + +# utils/adt/rowtypes.c:126 +#: plpy_typeio.c:1330 +#, c-format +msgid "Missing left parenthesis." +msgstr "缺少左括號。" + +#: plpy_typeio.c:1331 plpy_typeio.c:1532 +#, c-format +msgid "To return a composite type in an array, return the composite type as a Python tuple, e.g., \"[('foo',)]\"." +msgstr "è‹¥è¦åœ¨é™£åˆ—中回傳複åˆåž‹åˆ¥ï¼Œè«‹å°‡è¤‡åˆåž‹åˆ¥å›žå‚³ç‚º Python çš„ tuple,例如: \"[('foo',)]\"。" + +#: plpy_typeio.c:1378 +#, c-format +msgid "key \"%s\" not found in mapping" +msgstr "å°ç…§è¡¨ä¸­æ‰¾ä¸åˆ°éµ \"%s\"" + +#: plpy_typeio.c:1379 +#, c-format +msgid "To return null in a column, add the value None to the mapping with the key named after the column." +msgstr "è‹¥è¦åœ¨æ¬„ä½å›žå‚³ null,以欄ä½å稱為éµå€¼å°‡ None 加入å°ç…§è¡¨ã€‚" + +#: plpy_typeio.c:1432 +#, c-format +msgid "length of returned sequence did not match number of columns in row" +msgstr "回傳的åºåˆ—é•·åº¦èˆ‡è³‡æ–™åˆ—ä¸­çš„æ¬„ä½æ•¸ä¸ä¸€è‡´" + +#: plpy_typeio.c:1530 +#, c-format +msgid "attribute \"%s\" does not exist in Python object" +msgstr "Python 物件中ä¸å­˜åœ¨å±¬æ€§ \"%s\"" + +#: plpy_typeio.c:1533 +#, c-format +msgid "To return null in a column, let the returned object have an attribute named after column with value None." +msgstr "è‹¥è¦åœ¨æ¬„ä½å›žå‚³ null,以欄ä½å稱為回傳物件的屬性å稱並以 None 為值。" + +#: plpy_util.c:31 +#, c-format +msgid "could not convert Python Unicode object to bytes" +msgstr "無法將 Python çš„ Unicode 物件轉æ›ç‚ºä½å…ƒçµ„" + +#: plpy_util.c:37 +#, c-format +msgid "could not extract bytes from encoded string" +msgstr "無法從編碼字串中æå–ä½å…ƒçµ„" + +#~ msgid "PL/Python only supports one-dimensional arrays." +#~ msgstr "PL/Python åªæ”¯æ´ä¸€ç¶­é™£åˆ—" + +#~ msgid "Start a new session to use a different Python major version." +#~ msgstr "用ä¸åŒ Python 主版號開始新 session" + +#, c-format +#~ msgid "This session has previously used Python major version %d, and it is now attempting to use Python major version %d." +#~ msgstr "session 原來用 Python 主版號 %d,ç¾åœ¨å˜—試用 Python 主版號 %d。" + +#~ msgid "cannot convert multidimensional array to Python list" +#~ msgstr "ç„¡æ³•å°‡å¤šç¶­é™£åˆ—è½‰æˆ Python list" + +#~ msgid "could not create new dictionary" +#~ msgstr "無法建立新字典" + +#~ msgid "could not create new dictionary while building trigger arguments" +#~ msgstr "建立觸發程åºåƒæ•¸æ™‚無法建立新字典" + +#~ msgid "plan.status takes no arguments" +#~ msgstr "plan.status 䏿ޥå—åƒæ•¸" + +#~ msgid "plpy.prepare does not support composite types" +#~ msgstr "plpy.prepare 䏿”¯æ´è¤‡åˆåž‹åˆ¥" + +#~ msgid "unrecognized error in PLy_spi_execute_fetch_result" +#~ msgstr "PLy_spi_execute_fetch_result 有éžé æœŸéŒ¯èª¤" diff --git a/src/pl/plpython/sql/plpython_composite.sql b/src/pl/plpython/sql/plpython_composite.sql index 21757701cc13d..1bb9b83b7191e 100644 --- a/src/pl/plpython/sql/plpython_composite.sql +++ b/src/pl/plpython/sql/plpython_composite.sql @@ -208,6 +208,17 @@ SELECT * FROM return_record_2('v4') AS (v1 int, v3 int, v2 int); SELECT * FROM return_record_2('v3') AS (v1 int, v3 int, v2 int); SELECT * FROM return_record_2('v3') AS (v1 int, v2 int, v3 int); +-- recursion with a different inner result type didn't use to work +CREATE FUNCTION return_record_3(t text) RETURNS record AS $$ +if t == "text": + plpy.execute("SELECT * FROM return_record_3('int') AS (a int)"); + return { "a": "x" } +elif t == "int": + return { "a": 1 } +$$ LANGUAGE plpython3u; + +SELECT * FROM return_record_3('text') AS (a text); + -- multi-dimensional array of composite types. CREATE FUNCTION composite_type_as_list() RETURNS type_record[] AS $$ return [[('first', 1), ('second', 1)], [('first', 2), ('second', 2)], [('first', 3), ('second', 3)]]; diff --git a/src/pl/plpython/sql/plpython_error.sql b/src/pl/plpython/sql/plpython_error.sql index 11f14ec5a7cc6..9bb1c0b085aeb 100644 --- a/src/pl/plpython/sql/plpython_error.sql +++ b/src/pl/plpython/sql/plpython_error.sql @@ -344,3 +344,14 @@ $$ LANGUAGE plpython3u; \set SHOW_CONTEXT always SELECT notice_outerfunc(); + +/* test error logged with an underlying exception that includes a detail + * string (bug #18070). + */ +CREATE FUNCTION python_error_detail() RETURNS SETOF text AS $$ + plan = plpy.prepare("SELECT to_date('xy', 'DD') d") + for row in plpy.cursor(plan): + yield row['d'] +$$ LANGUAGE plpython3u; + +SELECT python_error_detail(); diff --git a/src/pl/plpython/sql/plpython_trigger.sql b/src/pl/plpython/sql/plpython_trigger.sql index e5504b9ab1d2e..f6c2ef8d6a0c4 100644 --- a/src/pl/plpython/sql/plpython_trigger.sql +++ b/src/pl/plpython/sql/plpython_trigger.sql @@ -467,3 +467,27 @@ FOR EACH ROW EXECUTE PROCEDURE generated_test_func1(); TRUNCATE trigger_test_generated; INSERT INTO trigger_test_generated (i) VALUES (1); SELECT * FROM trigger_test_generated; + + +-- recursive call of a trigger mustn't corrupt TD (bug #18456) + +CREATE TABLE recursive_trigger_test (a int, b int); + +CREATE FUNCTION recursive_trigger_func() RETURNS trigger +LANGUAGE plpython3u +AS $$ +if TD["event"] == "UPDATE": + plpy.execute("INSERT INTO recursive_trigger_test VALUES (1, 2)") + plpy.notice("TD[event] => " + str(TD["event"]) + ", expecting UPDATE"); +else: + plpy.notice("TD[event] => " + str(TD["event"]) + ", expecting INSERT"); +return None +$$; + +CREATE TRIGGER recursive_trigger_trig + AFTER INSERT OR UPDATE ON recursive_trigger_test + FOR EACH ROW EXECUTE PROCEDURE recursive_trigger_func(); + +INSERT INTO recursive_trigger_test VALUES (0, 0); +UPDATE recursive_trigger_test SET a = 11 WHERE b = 0; +SELECT * FROM recursive_trigger_test; diff --git a/src/pl/tcl/Makefile b/src/pl/tcl/Makefile index 314f9b2eec904..ea52a2efc229d 100644 --- a/src/pl/tcl/Makefile +++ b/src/pl/tcl/Makefile @@ -63,8 +63,6 @@ pltcl.o: pltclerrcodes.h pltclerrcodes.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-pltclerrcodes.pl $(PERL) $(srcdir)/generate-pltclerrcodes.pl $< > $@ -distprep: pltclerrcodes.h - install: all install-lib install-data installdirs: installdirs-lib @@ -91,13 +89,10 @@ installcheck: submake submake: $(MAKE) -C $(top_builddir)/src/test/regress pg_regress$(X) -# pltclerrcodes.h is in the distribution tarball, so don't clean it here. clean distclean: clean-lib rm -f $(OBJS) rm -rf $(pg_regress_clean_files) ifeq ($(PORTNAME), win32) rm -f $(tclwithver).def endif - -maintainer-clean: distclean rm -f pltclerrcodes.h diff --git a/src/pl/tcl/expected/pltcl_call.out b/src/pl/tcl/expected/pltcl_call.out index e4498375ec1a0..7bb5dffe5d7ed 100644 --- a/src/pl/tcl/expected/pltcl_call.out +++ b/src/pl/tcl/expected/pltcl_call.out @@ -66,6 +66,14 @@ END $$; NOTICE: a: 10 NOTICE: _a: 10, _b: 20 +-- syntax error in result tuple +CREATE PROCEDURE test_proc10(INOUT a text) +LANGUAGE pltcl +AS $$ +return [list a {$a + $a}]) +$$; +CALL test_proc10('abc'); +ERROR: could not parse function return value: list element in braces followed by ")" instead of space DROP PROCEDURE test_proc1; DROP PROCEDURE test_proc2; DROP PROCEDURE test_proc3; diff --git a/src/pl/tcl/expected/pltcl_setup.out b/src/pl/tcl/expected/pltcl_setup.out index ed809f02bfbbe..a8fdcf31256ca 100644 --- a/src/pl/tcl/expected/pltcl_setup.out +++ b/src/pl/tcl/expected/pltcl_setup.out @@ -119,7 +119,7 @@ CREATE OPERATOR CLASS tcl_int4_ops -- for initialization problems. -- create function tcl_date_week(int4,int4,int4) returns text as $$ - return [clock format [clock scan "$2/$3/$1"] -format "%U"] + return [clock format [clock scan "$2/$3/$1" -gmt 1] -format "%U" -gmt 1] $$ language pltcl immutable; select tcl_date_week(2010,1,26); tcl_date_week diff --git a/src/pl/tcl/generate-pltclerrcodes.pl b/src/pl/tcl/generate-pltclerrcodes.pl index 9c2309108c092..fcac4d00a6679 100644 --- a/src/pl/tcl/generate-pltclerrcodes.pl +++ b/src/pl/tcl/generate-pltclerrcodes.pl @@ -1,10 +1,10 @@ #!/usr/bin/perl # # Generate the pltclerrcodes.h header from errcodes.txt -# Copyright (c) 2000-2023, PostgreSQL Global Development Group +# Copyright (c) 2000-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; print "/* autogenerated from src/backend/utils/errcodes.txt, do not edit */\n"; diff --git a/src/pl/tcl/meson.build b/src/pl/tcl/meson.build index 9a7faaaf1e474..2080304b22932 100644 --- a/src/pl/tcl/meson.build +++ b/src/pl/tcl/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not tcl_dep.found() subdir_done() diff --git a/src/pl/tcl/pltcl.c b/src/pl/tcl/pltcl.c index e8f9d7b289c68..ebfc34e4ca911 100644 --- a/src/pl/tcl/pltcl.c +++ b/src/pl/tcl/pltcl.c @@ -56,6 +56,10 @@ PG_MODULE_MAGIC; #define CONST86 #endif +#if !HAVE_TCL_VERSION(8,7) +typedef int Tcl_Size; +#endif + /* define our text domain for translations */ #undef TEXTDOMAIN #define TEXTDOMAIN PG_TEXTDOMAIN("pltcl") @@ -334,7 +338,7 @@ static void pltcl_init_tuple_store(pltcl_call_state *call_state); /* * Hack to override Tcl's builtin Notifier subsystem. This prevents the * backend from becoming multithreaded, which breaks all sorts of things. - * That happens in the default version of Tcl_InitNotifier if the TCL library + * That happens in the default version of Tcl_InitNotifier if the Tcl library * has been compiled with multithreading support (i.e. when TCL_THREADS is * defined under Unix, and in all cases under Windows). * It's okay to disable the notifier because we never enter the Tcl event loop @@ -987,7 +991,7 @@ pltcl_func_handler(PG_FUNCTION_ARGS, pltcl_call_state *call_state, HeapTuple tup; Tcl_Obj *resultObj; Tcl_Obj **resultObjv; - int resultObjc; + Tcl_Size resultObjc; /* * Set up data about result type. XXX it's tempting to consider @@ -1026,7 +1030,10 @@ pltcl_func_handler(PG_FUNCTION_ARGS, pltcl_call_state *call_state, /* Convert function result to tuple */ resultObj = Tcl_GetObjResult(interp); if (Tcl_ListObjGetElements(interp, resultObj, &resultObjc, &resultObjv) == TCL_ERROR) - throw_tcl_error(interp, prodesc->user_proname); + ereport(ERROR, + (errcode(ERRCODE_EXTERNAL_ROUTINE_EXCEPTION), + errmsg("could not parse function return value: %s", + utf_u2e(Tcl_GetStringResult(interp))))); tup = pltcl_build_tuple_result(interp, resultObjv, resultObjc, call_state); @@ -1060,7 +1067,7 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS, pltcl_call_state *call_state, int tcl_rc; int i; const char *result; - int result_Objc; + Tcl_Size result_Objc; Tcl_Obj **result_Objv; int rc PG_USED_FOR_ASSERTS_ONLY; @@ -1292,7 +1299,7 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS, pltcl_call_state *call_state, &result_Objc, &result_Objv) != TCL_OK) ereport(ERROR, (errcode(ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED), - errmsg("could not split return value from trigger: %s", + errmsg("could not parse trigger return value: %s", utf_u2e(Tcl_GetStringResult(interp))))); /* Convert function result to tuple */ @@ -1355,6 +1362,10 @@ pltcl_event_trigger_handler(PG_FUNCTION_ARGS, pltcl_call_state *call_state, /********************************************************************** * throw_tcl_error - ereport an error returned from the Tcl interpreter + * + * Caution: use this only to report errors returned by Tcl_EvalObjEx() or + * other variants of Tcl_Eval(). Other functions may not fill "errorInfo", + * so it could be unset or even contain details from some previous error. **********************************************************************/ static void throw_tcl_error(Tcl_Interp *interp, const char *proname) @@ -2001,7 +2012,7 @@ pltcl_quote(ClientData cdata, Tcl_Interp *interp, char *tmp; const char *cp1; char *cp2; - int length; + Tcl_Size length; /************************************************************ * Check call syntax @@ -2195,7 +2206,7 @@ pltcl_returnnext(ClientData cdata, Tcl_Interp *interp, if (prodesc->fn_retistuple) { Tcl_Obj **rowObjv; - int rowObjc; + Tcl_Size rowObjc; /* result should be a list, so break it down */ if (Tcl_ListObjGetElements(interp, objv[1], &rowObjc, &rowObjv) == TCL_ERROR) @@ -2456,6 +2467,7 @@ pltcl_process_SPI_result(Tcl_Interp *interp, case SPI_OK_INSERT_RETURNING: case SPI_OK_DELETE_RETURNING: case SPI_OK_UPDATE_RETURNING: + case SPI_OK_MERGE_RETURNING: /* * Process the tuples we got @@ -2536,7 +2548,7 @@ pltcl_SPI_prepare(ClientData cdata, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { volatile MemoryContext plan_cxt = NULL; - int nargs; + Tcl_Size nargs; Tcl_Obj **argsObj; pltcl_query_desc *qdesc; int i; @@ -2674,7 +2686,7 @@ pltcl_SPI_execute_plan(ClientData cdata, Tcl_Interp *interp, const char *arrayname = NULL; Tcl_Obj *loop_body = NULL; int count = 0; - int callObjc; + Tcl_Size callObjc; Tcl_Obj **callObjv = NULL; Datum *argvalues; MemoryContext oldcontext = CurrentMemoryContext; diff --git a/src/pl/tcl/po/de.po b/src/pl/tcl/po/de.po index e191a2bb4df4f..aea4172bf763d 100644 --- a/src/pl/tcl/po/de.po +++ b/src/pl/tcl/po/de.po @@ -1,14 +1,14 @@ # German message translation file for PL/Tcl -# Peter Eisentraut , 2009 - 2022. +# Peter Eisentraut , 2009 - 2024. # # Use these quotes: »%s« # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-08 12:09+0000\n" -"PO-Revision-Date: 2022-04-08 14:40+0200\n" +"POT-Creation-Date: 2024-06-18 04:38+0000\n" +"PO-Revision-Date: 2024-06-18 14:44+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -16,56 +16,61 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: pltcl.c:463 +#: pltcl.c:462 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "PL/Tcl-Funktion, die einmal aufgerufen wird, wenn pltcl zum ersten Mal benutzt wird." -#: pltcl.c:470 +#: pltcl.c:469 msgid "PL/TclU function to call once when pltclu is first used." msgstr "PL/Tcl-Funktion, die einmal aufgerufen wird, wenn pltclu zum ersten Mal benutzt wird." -#: pltcl.c:637 +#: pltcl.c:636 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "Funktion »%s« ist in der falschen Sprache" -#: pltcl.c:648 +#: pltcl.c:647 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "Funktion »%s« darf nicht SECURITY DEFINER sein" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:682 +#: pltcl.c:681 #, c-format msgid "processing %s parameter" msgstr "Verarbeiten von Parameter von %s" -#: pltcl.c:835 +#: pltcl.c:834 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "Funktion mit Mengenergebnis in einem Zusammenhang aufgerufen, der keine Mengenergebnisse verarbeiten kann" -#: pltcl.c:840 +#: pltcl.c:839 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "Materialisierungsmodus wird benötigt, ist aber in diesem Zusammenhang nicht erlaubt" -#: pltcl.c:1013 +#: pltcl.c:1012 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "Funktion, die einen Record zurückgibt, in einem Zusammenhang aufgerufen, der Typ record nicht verarbeiten kann" -#: pltcl.c:1297 +#: pltcl.c:1031 #, c-format -msgid "could not split return value from trigger: %s" -msgstr "konnte Rückgabewert des Triggers nicht splitten: %s" +msgid "could not parse function return value: %s" +msgstr "konnte Rückgabewert der Funktion nicht parsen: %s" -#: pltcl.c:1378 pltcl.c:1808 +#: pltcl.c:1298 +#, c-format +msgid "could not parse trigger return value: %s" +msgstr "konnte Rückgabewert des Triggers nicht parsen: %s" + +#: pltcl.c:1383 pltcl.c:1810 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1379 +#: pltcl.c:1384 #, c-format msgid "" "%s\n" @@ -74,42 +79,42 @@ msgstr "" "%s\n" "in PL/Tcl-Funktion »%s«" -#: pltcl.c:1543 +#: pltcl.c:1547 #, c-format msgid "trigger functions can only be called as triggers" msgstr "Triggerfunktionen können nur als Trigger aufgerufen werden" -#: pltcl.c:1547 +#: pltcl.c:1551 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "PL/Tcl-Funktionen können keinen Rückgabetyp %s haben" -#: pltcl.c:1586 +#: pltcl.c:1590 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "PL/Tcl-Funktionen können Typ %s nicht annehmen" -#: pltcl.c:1700 +#: pltcl.c:1702 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "konnte interne Prozedur »%s« nicht erzeugen: %s" -#: pltcl.c:3202 +#: pltcl.c:3207 #, c-format msgid "column name/value list must have even number of elements" msgstr "Liste der Spaltennamen/-werte muss gerade Anzahl Elemente haben" -#: pltcl.c:3220 +#: pltcl.c:3225 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "Liste der Spaltennamen/-werte enthält nicht existierenden Spaltennamen »%s«" -#: pltcl.c:3227 +#: pltcl.c:3232 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "Systemattribut »%s« kann nicht gesetzt werden" -#: pltcl.c:3233 +#: pltcl.c:3238 #, c-format msgid "cannot set generated column \"%s\"" msgstr "kann generierte Spalte »%s« nicht setzen" diff --git a/src/pl/tcl/po/es.po b/src/pl/tcl/po/es.po index ff271b4046100..5020e4ffb189a 100644 --- a/src/pl/tcl/po/es.po +++ b/src/pl/tcl/po/es.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pltcl (PostgreSQL) 16\n" +"Project-Id-Version: pltcl (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2023-05-22 07:08+0000\n" -"PO-Revision-Date: 2023-05-22 12:06+0200\n" +"POT-Creation-Date: 2025-02-16 19:38+0000\n" +"PO-Revision-Date: 2024-11-16 14:24+0100\n" "Last-Translator: Carlos Chapi \n" "Language-Team: PgSQL-es-Ayuda \n" "Language: es\n" @@ -20,56 +20,61 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.2\n" -#: pltcl.c:462 +#: pltcl.c:466 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "función PL/Tcl a ejecutar cuando se use pltcl por primera vez." -#: pltcl.c:469 +#: pltcl.c:473 msgid "PL/TclU function to call once when pltclu is first used." msgstr "función PL/TclU a ejecutar cuando se use pltclu por primera vez." -#: pltcl.c:636 +#: pltcl.c:640 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "la función «%s» está en el lenguaje equivocado" -#: pltcl.c:647 +#: pltcl.c:651 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "la función «%s» no debe ser SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:681 +#: pltcl.c:685 #, c-format msgid "processing %s parameter" msgstr "procesando el parámetro %s" -#: pltcl.c:834 +#: pltcl.c:838 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "se llamó una función que retorna un conjunto en un contexto que no puede aceptarlo" -#: pltcl.c:839 +#: pltcl.c:843 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "se requiere un nodo «materialize», pero no está permitido en este contexto" -#: pltcl.c:1012 +#: pltcl.c:1016 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "se llamó una función que retorna un registro en un contexto que no puede aceptarlo" -#: pltcl.c:1295 +#: pltcl.c:1035 #, c-format -msgid "could not split return value from trigger: %s" -msgstr "no se pudo separar el valor de retorno del disparador: %s" +msgid "could not parse function return value: %s" +msgstr "no se pudo interpretar el valor de retorno de la función: %s" -#: pltcl.c:1376 pltcl.c:1803 +#: pltcl.c:1302 +#, c-format +msgid "could not parse trigger return value: %s" +msgstr "no se pudo interpretar el valor de retorno del trigger: «%s»" + +#: pltcl.c:1387 pltcl.c:1814 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1377 +#: pltcl.c:1388 #, c-format msgid "" "%s\n" @@ -78,42 +83,42 @@ msgstr "" "%s\n" "en función PL/Tcl \"%s\"" -#: pltcl.c:1540 +#: pltcl.c:1551 #, c-format msgid "trigger functions can only be called as triggers" msgstr "las funciones disparadoras sólo pueden ser invocadas como disparadores" -#: pltcl.c:1544 +#: pltcl.c:1555 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "las funciones PL/Tcl no pueden retornar tipo %s" -#: pltcl.c:1583 +#: pltcl.c:1594 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "las funciones PL/Tcl no pueden aceptar el tipog%s" -#: pltcl.c:1695 +#: pltcl.c:1706 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "no se pudo crear procedimiento interno «%s»: %s" -#: pltcl.c:3199 +#: pltcl.c:3211 #, c-format msgid "column name/value list must have even number of elements" msgstr "la lista de nombres de columnas y valores debe tener un número par de elementos" -#: pltcl.c:3217 +#: pltcl.c:3229 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "la lista de nombres de columnas y valores contiene el nombre de columna no existente «%s»" -#: pltcl.c:3224 +#: pltcl.c:3236 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "no se puede definir el atributo de sistema «%s»" -#: pltcl.c:3230 +#: pltcl.c:3242 #, c-format msgid "cannot set generated column \"%s\"" msgstr "no se puede definir el atributo generado «%s»" diff --git a/src/pl/tcl/po/fr.po b/src/pl/tcl/po/fr.po index f0f2489e8af98..e7ab5bc05e70e 100644 --- a/src/pl/tcl/po/fr.po +++ b/src/pl/tcl/po/fr.po @@ -8,10 +8,10 @@ # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-12 05:16+0000\n" -"PO-Revision-Date: 2022-04-12 17:29+0200\n" +"POT-Creation-Date: 2024-08-23 14:08+0000\n" +"PO-Revision-Date: 2024-09-16 16:28+0200\n" "Last-Translator: Guillaume Lelarge \n" "Language-Team: French \n" "Language: fr\n" @@ -19,62 +19,65 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.5\n" -#: pltcl.c:463 +#: pltcl.c:462 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "Fonction PL/Tcl à appeler une fois quand pltcl est utilisé pour la première fois." -#: pltcl.c:470 +#: pltcl.c:469 msgid "PL/TclU function to call once when pltclu is first used." msgstr "Fonction PL/TclU à appeler une fois quand pltcl est utilisé pour la première fois." -#: pltcl.c:637 +#: pltcl.c:636 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "la fonction « %s » est dans le mauvais langage" -#: pltcl.c:648 +#: pltcl.c:647 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "la fonction « %s » doit être définie en SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:682 +#: pltcl.c:681 #, c-format msgid "processing %s parameter" msgstr "traitement du paramètre %s" -#: pltcl.c:835 +#: pltcl.c:834 #, c-format msgid "set-valued function called in context that cannot accept a set" -msgstr "" -"la fonction renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas\n" -"un ensemble" +msgstr "la fonction renvoyant un ensemble a été appelée dans un contexte qui n'accepte pas un ensemble" -#: pltcl.c:840 +#: pltcl.c:839 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "mode matérialisé requis mais interdit dans ce contexte" -#: pltcl.c:1013 +#: pltcl.c:1012 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "" "fonction renvoyant le type record appelée dans un contexte qui ne peut pas\n" "accepter le type record" -#: pltcl.c:1297 +#: pltcl.c:1031 +#, c-format +msgid "could not parse function return value: %s" +msgstr "n'a pas pu analyser la valeur de retour de la fonction : %s" + +#: pltcl.c:1298 #, c-format -msgid "could not split return value from trigger: %s" -msgstr "n'a pas pu séparer la valeur de retour du trigger : %s" +msgid "could not parse trigger return value: %s" +msgstr "n'a pas pu analyser la valeur de retour du trigger : %s" -#: pltcl.c:1378 pltcl.c:1808 +#: pltcl.c:1383 pltcl.c:1810 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1379 +#: pltcl.c:1384 #, c-format msgid "" "%s\n" @@ -83,60 +86,42 @@ msgstr "" "%s\n" "dans la fonction PL/Tcl « %s »" -#: pltcl.c:1543 +#: pltcl.c:1547 #, c-format msgid "trigger functions can only be called as triggers" msgstr "les fonctions trigger peuvent seulement être appelées par des triggers" -#: pltcl.c:1547 +#: pltcl.c:1551 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "les fonctions PL/Tcl ne peuvent pas renvoyer le type %s" -#: pltcl.c:1586 +#: pltcl.c:1590 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "les fonctions PL/Tcl ne peuvent pas accepter le type %s" -#: pltcl.c:1700 +#: pltcl.c:1702 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "n'a pas pu créer la procédure interne « %s » : %s" -#: pltcl.c:3202 +#: pltcl.c:3207 #, c-format msgid "column name/value list must have even number of elements" msgstr "la liste de nom de colonne/valeur doit avoir un nombre pair d'éléments" -#: pltcl.c:3220 +#: pltcl.c:3225 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "la liste de nom de colonne/valeur contient des noms de colonne inexistantes (« %s »)" -#: pltcl.c:3227 +#: pltcl.c:3232 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "ne peut pas initialiser l'attribut système « %s »" -#: pltcl.c:3233 +#: pltcl.c:3238 #, c-format msgid "cannot set generated column \"%s\"" msgstr "ne peut pas initialiser la colonne générée « %s »" - -#~ msgid "PL/Tcl functions cannot return composite types" -#~ msgstr "les fonctions PL/Tcl ne peuvent pas renvoyer des types composites" - -#~ msgid "could not load module \"unknown\": %s" -#~ msgstr "n'a pas pu charger le module « unknown » : %s" - -#~ msgid "module \"unknown\" not found in pltcl_modules" -#~ msgstr "module « unkown » introuvable dans pltcl_modules" - -#~ msgid "out of memory" -#~ msgstr "mémoire épuisée" - -#~ msgid "trigger's return list must have even number of elements" -#~ msgstr "la liste de retour du trigger doit avoir un nombre pair d'éléments" - -#~ msgid "unrecognized attribute \"%s\"" -#~ msgstr "attribut « %s » non reconnu" diff --git a/src/pl/tcl/po/ja.po b/src/pl/tcl/po/ja.po index 15bd6116abe6f..3ac5ac4fdfe21 100644 --- a/src/pl/tcl/po/ja.po +++ b/src/pl/tcl/po/ja.po @@ -1,14 +1,14 @@ # Japanese message translation file for pltcl -# Copyright (C) 2022 PostgreSQL Global Development Group +# Copyright (C) 2022-2024 PostgreSQL Global Development Group # This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package. # KOIZUMI Satoru , 2015. # msgid "" msgstr "" -"Project-Id-Version: pltcl (PostgreSQL 16)\n" +"Project-Id-Version: pltcl (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-14 10:48+0900\n" -"PO-Revision-Date: 2019-06-11 17:26+0900\n" +"POT-Creation-Date: 2025-02-28 10:06+0900\n" +"PO-Revision-Date: 2025-03-03 17:39+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -16,102 +16,107 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 1.5.4\n" +"X-Generator: Poedit 1.8.13\n" -#: pltcl.c:463 +#: pltcl.c:466 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "pltcl ãŒæœ€åˆã«ä½¿ç”¨ã•れる際ã«ä¸€åº¦ã ã‘呼ã³å‡ºã•れる PL/Tcl 関数。" -#: pltcl.c:470 +#: pltcl.c:473 msgid "PL/TclU function to call once when pltclu is first used." msgstr "pltclu ãŒæœ€åˆã«ä½¿ç”¨ã•れる際ã«ä¸€åº¦ã ã‘呼ã³å‡ºã•れる PL/TclU 関数。" -#: pltcl.c:637 +#: pltcl.c:640 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "関数\"%s\"ã¯è¨€èªžãŒç•°ãªã‚Šã¾ã™" -#: pltcl.c:648 +#: pltcl.c:651 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "関数\"%s\"ã¯SECURITY DEFINERã§ã‚ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:682 +#: pltcl.c:685 #, c-format msgid "processing %s parameter" msgstr "%sパラメーターを処ç†ã—ã¦ã„ã¾ã™" -#: pltcl.c:835 +#: pltcl.c:838 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "ã“ã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§ã¯ã€é›†åˆå€¤ã®é–¢æ•°ã¯é›†åˆã‚’å—ã‘付ã‘られã¾ã›ã‚“" -#: pltcl.c:840 +#: pltcl.c:843 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "マテリアライズモードãŒå¿…è¦ã§ã™ãŒã€ç¾åœ¨ã®ã‚³ãƒ³ãƒ†ã‚¯ã‚¹ãƒˆã§ç¦æ­¢ã•れã¦ã„ã¾ã™" -#: pltcl.c:1013 +#: pltcl.c:1016 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "レコード型をå—ã‘付ã‘られãªã„コンテキストã§ãƒ¬ã‚³ãƒ¼ãƒ‰ã‚’è¿”ã™é–¢æ•°ãŒå‘¼ã³å‡ºã•れã¾ã—ãŸ" -#: pltcl.c:1296 +#: pltcl.c:1035 #, c-format -msgid "could not split return value from trigger: %s" -msgstr "トリガーã‹ã‚‰ã®æˆ»ã‚Šå€¤ã‚’分割ã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" +msgid "could not parse function return value: %s" +msgstr "é–¢æ•°ã®æˆ»ã‚Šå€¤ã‚’パースã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pltcl.c:1377 pltcl.c:1807 +#: pltcl.c:1302 +#, c-format +msgid "could not parse trigger return value: %s" +msgstr "ãƒˆãƒªã‚¬ã®æˆ»ã‚Šå€¤ã‚’パースã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" + +#: pltcl.c:1387 pltcl.c:1814 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1378 +#: pltcl.c:1388 #, c-format msgid "" "%s\n" "in PL/Tcl function \"%s\"" msgstr "" "%s\n" -"PL/Tcl 関数 \"%s\"" +"PL/Tcl 関数 \"%s\" 内" -#: pltcl.c:1542 +#: pltcl.c:1551 #, c-format msgid "trigger functions can only be called as triggers" msgstr "トリガー関数ã¯ãƒˆãƒªã‚¬ãƒ¼ã¨ã—ã¦ã®ã¿ã‚³ãƒ¼ãƒ«ã§ãã¾ã™" -#: pltcl.c:1546 +#: pltcl.c:1555 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "PL/Tcl 関数ã¯%såž‹ã®æˆ»ã‚Šå€¤ã‚’è¿”ã›ã¾ã›ã‚“" -#: pltcl.c:1585 +#: pltcl.c:1594 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "PL/Tcl 関数ã¯%s型をå—ã‘付ã‘ã¾ã›ã‚“" -#: pltcl.c:1699 +#: pltcl.c:1706 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "内部プロシージャ\"%s\"を作æˆã§ãã¾ã›ã‚“ã§ã—ãŸ: %s" -#: pltcl.c:3201 +#: pltcl.c:3211 #, c-format msgid "column name/value list must have even number of elements" msgstr "列å/値ã®ãƒªã‚¹ãƒˆã®è¦ç´ ã¯å¶æ•°å€‹ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“" -#: pltcl.c:3219 +#: pltcl.c:3229 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "列å/値ã®ãƒªã‚¹ãƒˆã®ä¸­ã«ã€å­˜åœ¨ã—ãªã„列å\"%s\"ãŒå«ã¾ã‚Œã¦ã„ã¾ã™" -#: pltcl.c:3226 +#: pltcl.c:3236 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "システム属性\"%s\"ã¯è¨­å®šã§ãã¾ã›ã‚“" -#: pltcl.c:3232 +#: pltcl.c:3242 #, c-format msgid "cannot set generated column \"%s\"" msgstr "生æˆåˆ—\"%s\"を変更ã§ãã¾ã›ã‚“" diff --git a/src/pl/tcl/po/ka.po b/src/pl/tcl/po/ka.po index 15540151da48f..6047d595a7ac5 100644 --- a/src/pl/tcl/po/ka.po +++ b/src/pl/tcl/po/ka.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: pltcl (PostgreSQL) 15\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-07-06 23:08+0000\n" -"PO-Revision-Date: 2022-07-07 06:12+0200\n" +"POT-Creation-Date: 2024-06-04 22:08+0000\n" +"PO-Revision-Date: 2024-06-05 01:38+0200\n" "Last-Translator: Temuri Doghonadze \n" "Language-Team: Georgian \n" "Language: ka\n" @@ -16,58 +16,63 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.1\n" +"X-Generator: Poedit 3.3.2\n" -#: pltcl.c:463 +#: pltcl.c:462 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "PL/Tcl ფუნქციáƒ, რáƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბáƒáƒª ერთხელ, pltcl-ის პირველი გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ ხდებáƒ." -#: pltcl.c:470 +#: pltcl.c:469 msgid "PL/TclU function to call once when pltclu is first used." msgstr "PL/TclU ფუნქციáƒ, რáƒáƒšáƒ˜áƒ¡ გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბáƒáƒª ერთხელ, pltclu -ის პირველი გáƒáƒ›áƒáƒ§áƒ”ნებისáƒáƒ¡ ხდებáƒ." -#: pltcl.c:637 +#: pltcl.c:636 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "ფუნქცირ\"%s\" áƒáƒ áƒáƒ¡áƒ¬áƒáƒ  ენáƒáƒ–ეáƒ" -#: pltcl.c:648 +#: pltcl.c:647 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "ფუნქცირ\"%s\" áƒáƒ  უნდრიყáƒáƒ¡ SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:682 +#: pltcl.c:681 #, c-format msgid "processing %s parameter" msgstr "პáƒáƒ áƒáƒ›áƒ”ტრის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებáƒ: %s" -#: pltcl.c:835 +#: pltcl.c:834 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "სეტ-ღირებული ფუნქციáƒ, რáƒáƒ›áƒ”ლსáƒáƒª ეწáƒáƒ“ებრკáƒáƒœáƒ¢áƒ”ქსტში, რáƒáƒ›áƒ”ლსáƒáƒª áƒáƒ  შეუძლირმიიღáƒáƒ¡ ნáƒáƒ™áƒ áƒ”ბი" -#: pltcl.c:840 +#: pltcl.c:839 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "სáƒáƒ­áƒ˜áƒ áƒáƒ მáƒáƒ¢áƒ”რიáƒáƒšáƒ˜áƒ–ებული რეჟიმი, მáƒáƒ’რáƒáƒ› áƒáƒ› კáƒáƒœáƒ¢áƒ”ქსტში ეს დáƒáƒ£áƒ¨áƒ•ებელიáƒ" -#: pltcl.c:1013 +#: pltcl.c:1012 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "ფუნქციáƒ, რáƒáƒ›áƒ”ლიც ჩáƒáƒœáƒáƒ¬áƒ”რს áƒáƒ‘რუნებს, გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბულირკáƒáƒœáƒ¢áƒ”ქსტში, რáƒáƒ›áƒ”ლსáƒáƒª ჩáƒáƒœáƒáƒ¬áƒ”რის მიღებრáƒáƒ  შეუძლიáƒ" -#: pltcl.c:1296 +#: pltcl.c:1031 #, c-format -msgid "could not split return value from trigger: %s" -msgstr "ტრიგერიდáƒáƒœ დáƒáƒ‘რუნებული მნიშვნელáƒáƒ‘ის დáƒáƒ§áƒáƒ¤áƒ შეუძლებელიáƒ: %s" +msgid "could not parse function return value: %s" +msgstr "ფუნქციიდáƒáƒœ დáƒáƒ‘რუნებული მნიშვნელáƒáƒ‘ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებრშეუძლებელიáƒ: %s" -#: pltcl.c:1377 pltcl.c:1807 +#: pltcl.c:1298 +#, c-format +msgid "could not parse trigger return value: %s" +msgstr "ტრიგერიდáƒáƒœ დáƒáƒ‘რუნებული მნიშვნელáƒáƒ‘ის დáƒáƒ›áƒ£áƒ¨áƒáƒ•ებრშეუძლებელიáƒ: %s" + +#: pltcl.c:1383 pltcl.c:1810 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1378 +#: pltcl.c:1384 #, c-format msgid "" "%s\n" @@ -76,42 +81,46 @@ msgstr "" "%s\n" "PL/Tcl-ის ფუნქციáƒáƒ¨áƒ˜\"%s\"" -#: pltcl.c:1542 +#: pltcl.c:1547 #, c-format msgid "trigger functions can only be called as triggers" msgstr "ტრიგერის ფუნქციების გáƒáƒ›áƒáƒ«áƒáƒ®áƒ”ბრმხáƒáƒšáƒáƒ“ ტრიგერებáƒáƒ“ შეიძლებáƒ" -#: pltcl.c:1546 +#: pltcl.c:1551 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "PL/Tcl ფუნქციáƒáƒ¡ %s ტიპის დáƒáƒ‘რუნებრáƒáƒ  შეუძლიáƒ" -#: pltcl.c:1585 +#: pltcl.c:1590 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "PL/Tcl ფუნქციáƒáƒ¡ %s ტიპის მიღებრáƒáƒ  შეუძლიáƒ" -#: pltcl.c:1699 +#: pltcl.c:1702 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "შიდრპრáƒáƒªáƒ”დურის (\"%s\") შექმნის შეცდáƒáƒ›áƒ: %s" -#: pltcl.c:3201 +#: pltcl.c:3207 #, c-format msgid "column name/value list must have even number of elements" msgstr "სვეტის სáƒáƒ®áƒ”ლი/მნიშვნელáƒáƒ‘ების სიáƒáƒ¡ ელემენტების ლუწი რáƒáƒáƒ“ენáƒáƒ‘რუნდრჰქáƒáƒœáƒ“ეს" -#: pltcl.c:3219 +#: pltcl.c:3225 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "სვეტის სáƒáƒ®áƒ”ლი/მნიშვნელáƒáƒ‘ების სირშეიცáƒáƒ•ს სვეტის áƒáƒ áƒáƒ áƒ¡áƒ”ბულ სáƒáƒ®áƒ”ლს „%s“" -#: pltcl.c:3226 +#: pltcl.c:3232 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "სისტემური áƒáƒ¢áƒ áƒ˜áƒ‘უტის დáƒáƒ§áƒ”ნების შეცდáƒáƒ›áƒ: \"%s\"" -#: pltcl.c:3232 +#: pltcl.c:3238 #, c-format msgid "cannot set generated column \"%s\"" msgstr "გენერირებული სვეტის დáƒáƒ§áƒ”ნებრშეუძლებელიáƒ: %s" + +#, c-format +#~ msgid "could not split return value from trigger: %s" +#~ msgstr "ტრიგერიდáƒáƒœ დáƒáƒ‘რუნებული მნიშვნელáƒáƒ‘ის დáƒáƒ§áƒáƒ¤áƒ შეუძლებელიáƒ: %s" diff --git a/src/pl/tcl/po/ko.po b/src/pl/tcl/po/ko.po index 067322345695a..63d744f6c2113 100644 --- a/src/pl/tcl/po/ko.po +++ b/src/pl/tcl/po/ko.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: pltcl (PostgreSQL) 12\n" +"Project-Id-Version: pltcl (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2020-02-09 20:08+0000\n" -"PO-Revision-Date: 2019-11-01 12:52+0900\n" +"POT-Creation-Date: 2025-01-17 04:38+0000\n" +"PO-Revision-Date: 2025-01-16 11:03+0900\n" "Last-Translator: Ioseph Kim \n" "Language-Team: Korean Team \n" "Language: ko\n" @@ -17,53 +17,63 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: pltcl.c:464 +#: pltcl.c:466 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "pltcl 언어가 ì²˜ìŒ ì‚¬ìš©ë  ë•Œ 한번 호출 ë  PL/Tcl 함수" -#: pltcl.c:471 +#: pltcl.c:473 msgid "PL/TclU function to call once when pltclu is first used." msgstr "pltclu 언어가 ì²˜ìŒ ì‚¬ìš©ë  ë•Œ 한번 호출 ë  PL/Tcl 함수" -#: pltcl.c:636 +#: pltcl.c:640 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "\"%s\" í•¨ìˆ˜ì— ìž˜ëª»ëœ ì–¸ì–´ê°€ 있ìŒ" -#: pltcl.c:647 +#: pltcl.c:651 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "\"%s\" 함수는 SECURITY DEFINER ì†ì„±ì´ 없어야 합니다" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:681 +#: pltcl.c:685 #, c-format msgid "processing %s parameter" msgstr "%s 매개 변수 처리 중" -#: pltcl.c:842 +#: pltcl.c:838 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "ì§‘í•©ì´ ê°’ì´ í•¨ìˆ˜ê°€ ì§‘í•©ì„ ì‚¬ìš©í•  수 없는 구문ì—서 호출 ë˜ì—ˆìŒ" -#: pltcl.c:1015 +#: pltcl.c:843 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "materialize 모드가 필요합니다만, ì´ êµ¬ë¬¸ì—서는 허용ë˜ì§€ 않습니다" + +#: pltcl.c:1016 #, c-format msgid "" "function returning record called in context that cannot accept type record" msgstr "" "레코드를 반환하는 함수가 레코드 í˜•ì„ ì‚¬ìš©í•  수 없는 구문ì—서 호출 ë˜ì—ˆìŒ" -#: pltcl.c:1299 +#: pltcl.c:1035 +#, c-format +msgid "could not parse function return value: %s" +msgstr "함수 ë°˜í™˜ê°’ì„ ë¶„ì„í•  수 ì—†ìŒ: %s" + +#: pltcl.c:1302 #, c-format -msgid "could not split return value from trigger: %s" -msgstr "트리거ì—서 ë°˜í™˜ê°’ì„ ë¶„ë¦¬í•  수 ì—†ìŒ: %s" +msgid "could not parse trigger return value: %s" +msgstr "트리거 ë°˜í™˜ê°’ì„ ë¶„ì„í•  수 ì—†ìŒ: %s" -#: pltcl.c:1379 pltcl.c:1809 +#: pltcl.c:1387 pltcl.c:1814 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1380 +#: pltcl.c:1388 #, c-format msgid "" "%s\n" @@ -72,42 +82,46 @@ msgstr "" "%s\n" "해당 PL/Tcl 함수: \"%s\"" -#: pltcl.c:1544 +#: pltcl.c:1551 #, c-format msgid "trigger functions can only be called as triggers" msgstr "트리거 함수는 트리거로만 í˜¸ì¶œë  ìˆ˜ 있ìŒ" -#: pltcl.c:1548 +#: pltcl.c:1555 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "PL/Tcl 함수는 %s ìžë£Œí˜•ì„ ë°˜í™˜í•  수 ì—†ìŒ" -#: pltcl.c:1587 +#: pltcl.c:1594 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "PL/Tcl 함수는 %s ìžë£Œí˜•ì„ ì‚¬ìš©í•  수 ì—†ìŒ" -#: pltcl.c:1701 +#: pltcl.c:1706 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "\"%s\" ë‚´ë¶€ 프로시져를 만들 수 ì—†ìŒ: %s" -#: pltcl.c:3208 +#: pltcl.c:3211 #, c-format msgid "column name/value list must have even number of elements" msgstr "칼럼 ì´ë¦„/ê°’ 목ë¡ì€ ê·¸ ìš”ì†Œì˜ ê°œìˆ˜ê°€ ì§ìˆ˜ì—¬ì•¼ 함" -#: pltcl.c:3226 +#: pltcl.c:3229 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "칼럼 ì´ë¦„/ê°’ 목ë¡ì— \"%s\" ì¹¼ëŸ¼ì— ëŒ€í•œ ê°’ì´ ì—†ìŒ" -#: pltcl.c:3233 +#: pltcl.c:3236 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "\"%s\" 시스템 ì†ì„±ì„ 지정할 수 ì—†ìŒ" -#: pltcl.c:3239 +#: pltcl.c:3242 #, c-format msgid "cannot set generated column \"%s\"" msgstr "\"%s\" ê³„ì‚°ëœ ì¹¼ëŸ¼ì„ ì§€ì •í•  수 ì—†ìŒ" + +#, c-format +#~ msgid "could not split return value from trigger: %s" +#~ msgstr "트리거ì—서 ë°˜í™˜ê°’ì„ ë¶„ë¦¬í•  수 ì—†ìŒ: %s" diff --git a/src/pl/tcl/po/meson.build b/src/pl/tcl/po/meson.build index 9e5c8e95f1500..382af4a880475 100644 --- a/src/pl/tcl/po/meson.build +++ b/src/pl/tcl/po/meson.build @@ -1,3 +1,3 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group nls_targets += [i18n.gettext('pltcl-' + pg_version_major.to_string())] diff --git a/src/pl/tcl/po/ru.po b/src/pl/tcl/po/ru.po index 473df19c29b1a..1f15520c8cba6 100644 --- a/src/pl/tcl/po/ru.po +++ b/src/pl/tcl/po/ru.po @@ -1,75 +1,80 @@ # Russian message translation file for pltcl # Copyright (C) 2012-2016 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Alexander Lakhin , 2012-2017, 2019, 2022. +# Alexander Lakhin , 2012-2017, 2019, 2022, 2024. msgid "" msgstr "" "Project-Id-Version: pltcl (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-27 14:52+0300\n" -"PO-Revision-Date: 2022-09-05 13:38+0300\n" +"POT-Creation-Date: 2025-02-08 07:44+0200\n" +"PO-Revision-Date: 2024-08-01 13:03+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: pltcl.c:463 +#: pltcl.c:466 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° PL/Tcl, Ð²Ñ‹Ð·Ñ‹Ð²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñ€Ð¸ первом иÑпользовании pltcl." -#: pltcl.c:470 +#: pltcl.c:473 msgid "PL/TclU function to call once when pltclu is first used." msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð½Ð° PL/TclU, Ð²Ñ‹Ð·Ñ‹Ð²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñ€Ð¸ первом иÑпользовании pltclu." -#: pltcl.c:637 +#: pltcl.c:640 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" объÑвлена на другом Ñзыке" -#: pltcl.c:648 +#: pltcl.c:651 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" не должна иметь характериÑтику SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:682 +#: pltcl.c:685 #, c-format msgid "processing %s parameter" msgstr "обработка параметра %s" -#: pltcl.c:835 +#: pltcl.c:838 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "" "функциÑ, Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтво, вызвана в контекÑте, где ему нет меÑта" -#: pltcl.c:840 +#: pltcl.c:843 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "требуетÑÑ Ñ€ÐµÐ¶Ð¸Ð¼ материализации, но он недопуÑтим в Ñтом контекÑте" -#: pltcl.c:1013 +#: pltcl.c:1016 #, c-format msgid "" "function returning record called in context that cannot accept type record" msgstr "" "функциÑ, Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÑŽÑ‰Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, вызвана в контекÑте, не допуÑкающем Ñтот тип" -#: pltcl.c:1296 +#: pltcl.c:1035 #, c-format -msgid "could not split return value from trigger: %s" -msgstr "разложить возвращаемое из триггера значение не удалоÑÑŒ: %s" +msgid "could not parse function return value: %s" +msgstr "разобрать возвращаемое функцией значение не удалоÑÑŒ: %s" -#: pltcl.c:1377 pltcl.c:1807 +#: pltcl.c:1302 +#, c-format +msgid "could not parse trigger return value: %s" +msgstr "разобрать возвращаемое триггером значение не удалоÑÑŒ: %s" + +#: pltcl.c:1387 pltcl.c:1814 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1378 +#: pltcl.c:1388 #, c-format msgid "" "%s\n" @@ -78,43 +83,43 @@ msgstr "" "%s\n" "в функции PL/Tcl \"%s\"" -#: pltcl.c:1542 +#: pltcl.c:1551 #, c-format msgid "trigger functions can only be called as triggers" msgstr "триггерные функции могут вызыватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в триггерах" -#: pltcl.c:1546 +#: pltcl.c:1555 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "функции PL/Tcl не могут возвращать тип %s" -#: pltcl.c:1585 +#: pltcl.c:1594 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "функции PL/Tcl не могут принимать тип %s" -#: pltcl.c:1699 +#: pltcl.c:1706 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "не удалоÑÑŒ Ñоздать внутреннюю процедуру \"%s\": %s" -#: pltcl.c:3201 +#: pltcl.c:3211 #, c-format msgid "column name/value list must have even number of elements" msgstr "в ÑпиÑке имён/значений Ñтолбцов должно быть чётное чиÑло Ñлементов" -#: pltcl.c:3219 +#: pltcl.c:3229 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "" "ÑпиÑок имён/значений Ñтолбцов Ñодержит Ð¸Ð¼Ñ Ð½ÐµÑущеÑтвующего Ñтолбца \"%s\"" -#: pltcl.c:3226 +#: pltcl.c:3236 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "приÑвоить значение ÑиÑтемному атрибуту \"%s\" нельзÑ" -#: pltcl.c:3232 +#: pltcl.c:3242 #, c-format msgid "cannot set generated column \"%s\"" msgstr "приÑвоить значение генерируемому Ñтолбцу \"%s\" нельзÑ" diff --git a/src/pl/tcl/po/sv.po b/src/pl/tcl/po/sv.po index 5d140445206d9..d6fce1b82cbcd 100644 --- a/src/pl/tcl/po/sv.po +++ b/src/pl/tcl/po/sv.po @@ -1,14 +1,14 @@ # Swedish message translation file for pltcl # Copyright (C) 2017 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. -# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023. +# Dennis Björklund , 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 15\n" +"Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-04-11 13:38+0000\n" -"PO-Revision-Date: 2023-03-09 22:42+0100\n" +"POT-Creation-Date: 2024-07-12 17:38+0000\n" +"PO-Revision-Date: 2024-07-12 22:05+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,56 +17,61 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -#: pltcl.c:463 +#: pltcl.c:462 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "PL/Tcl-funktion att anropa en gÃ¥ng när pltcl först används." -#: pltcl.c:470 +#: pltcl.c:469 msgid "PL/TclU function to call once when pltclu is first used." msgstr "PL/TclU-funktion att anrop en gÃ¥ng när pltclu först används." -#: pltcl.c:637 +#: pltcl.c:636 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "funktionen \"%s\" är skriven i fel sprÃ¥k" -#: pltcl.c:648 +#: pltcl.c:647 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "funktionen \"%s\" fÃ¥r ej vara SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:682 +#: pltcl.c:681 #, c-format msgid "processing %s parameter" msgstr "processar parameter %s" -#: pltcl.c:835 +#: pltcl.c:834 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "en funktion som returnerar en mängd anropades i kontext som inte godtar en mängd" -#: pltcl.c:840 +#: pltcl.c:839 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "materialiserat läge krävs, men stöds inte i detta kontext" -#: pltcl.c:1013 +#: pltcl.c:1012 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "en funktion med post som värde anropades i sammanhang där poster inte kan godtagas." -#: pltcl.c:1297 +#: pltcl.c:1031 #, c-format -msgid "could not split return value from trigger: %s" -msgstr "kunde inte dela pÃ¥ returvärde frÃ¥n trigger: %s" +msgid "could not parse function return value: %s" +msgstr "kunde inte parsa funktions returvärde: %s" -#: pltcl.c:1378 pltcl.c:1808 +#: pltcl.c:1298 +#, c-format +msgid "could not parse trigger return value: %s" +msgstr "kunde inte parsa triggers returvärde: %s" + +#: pltcl.c:1383 pltcl.c:1810 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1379 +#: pltcl.c:1384 #, c-format msgid "" "%s\n" @@ -75,42 +80,42 @@ msgstr "" "%s\n" "i PL/Tcl-funktion \"%s\"" -#: pltcl.c:1543 +#: pltcl.c:1547 #, c-format msgid "trigger functions can only be called as triggers" msgstr "Triggningsfunktioner kan bara anropas vid triggning." -#: pltcl.c:1547 +#: pltcl.c:1551 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "PL/Tcl-funktioner kan inte returnera typ %s" -#: pltcl.c:1586 +#: pltcl.c:1590 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "PL/Tcl-funktioner kan inte ta emot typ %s" -#: pltcl.c:1700 +#: pltcl.c:1702 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "kunde inte skapa en intern procedur \"%s\": %s" -#: pltcl.c:3202 +#: pltcl.c:3207 #, c-format msgid "column name/value list must have even number of elements" msgstr "kolumn-namn/-värde mÃ¥ste ha ett jämt antal element" -#: pltcl.c:3220 +#: pltcl.c:3225 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "listan med kolumn-namn/-värde innehÃ¥ller det icke existerande kolumnnamnet \"%s\"" -#: pltcl.c:3227 +#: pltcl.c:3232 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "kan inte sätta systemattribut \"%s\"" -#: pltcl.c:3233 +#: pltcl.c:3238 #, c-format msgid "cannot set generated column \"%s\"" msgstr "kan inte sätta genererad kolumn \"%s\"" diff --git a/src/pl/tcl/po/uk.po b/src/pl/tcl/po/uk.po index ceb1e782e6539..6caba5446ef7e 100644 --- a/src/pl/tcl/po/uk.po +++ b/src/pl/tcl/po/uk.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: postgresql\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2022-08-12 10:38+0000\n" -"PO-Revision-Date: 2022-09-13 11:52\n" +"POT-Creation-Date: 2024-08-31 06:08+0000\n" +"PO-Revision-Date: 2024-09-23 19:38\n" "Last-Translator: \n" "Language-Team: Ukrainian\n" "Language: uk_UA\n" @@ -14,101 +14,106 @@ msgstr "" "X-Crowdin-Project: postgresql\n" "X-Crowdin-Project-ID: 324573\n" "X-Crowdin-Language: uk\n" -"X-Crowdin-File: /REL_15_STABLE/pltcl.pot\n" -"X-Crowdin-File-ID: 914\n" +"X-Crowdin-File: /REL_17_STABLE/pltcl.pot\n" +"X-Crowdin-File-ID: 1016\n" -#: pltcl.c:463 +#: pltcl.c:462 msgid "PL/Tcl function to call once when pltcl is first used." msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ PL/Tcl викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ коли pltcl вперше викориÑтаний." -#: pltcl.c:470 +#: pltcl.c:469 msgid "PL/TclU function to call once when pltclu is first used." msgstr "Ð¤ÑƒÐ½ÐºÑ†Ñ–Ñ PL/TclU викориÑтовуєтьÑÑ Ð´Ð»Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑƒ коли pltclu вперше викориÑтаний." -#: pltcl.c:637 +#: pltcl.c:636 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Â«%s» напиÑана неправильною мовою" -#: pltcl.c:648 +#: pltcl.c:647 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"%s\" не має бути SECURITY DEFINER" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:682 +#: pltcl.c:681 #, c-format msgid "processing %s parameter" msgstr "оброблÑєтьÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€ %s" -#: pltcl.c:835 +#: pltcl.c:834 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ \"set-valued\" викликана в контекÑті, де йому немає міÑцÑ" -#: pltcl.c:840 +#: pltcl.c:839 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "необхідний режим матеріалізації (materialize mode), але він неприпуÑтимий у цьому контекÑті" -#: pltcl.c:1013 +#: pltcl.c:1012 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "функціÑ, що повертає набір, викликана у контекÑті, що не приймає тип запиÑ" -#: pltcl.c:1296 +#: pltcl.c:1031 #, c-format -msgid "could not split return value from trigger: %s" -msgstr "не вдалоÑÑ Ñ€Ð¾Ð·Ð´Ñ–Ð»Ð¸Ñ‚Ð¸ повернене Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð· тригера: %s" +msgid "could not parse function return value: %s" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ—: %s" -#: pltcl.c:1377 pltcl.c:1807 +#: pltcl.c:1298 +#, c-format +msgid "could not parse trigger return value: %s" +msgstr "не вдалоÑÑ Ð¿Ñ€Ð¾Ð°Ð½Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ñ€Ð¸Ð³ÐµÑ€Ð°: %s" + +#: pltcl.c:1383 pltcl.c:1810 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1378 +#: pltcl.c:1384 #, c-format msgid "%s\n" "in PL/Tcl function \"%s\"" msgstr "%s\n" "у функції PL/Tcl \"%s\"" -#: pltcl.c:1542 +#: pltcl.c:1547 #, c-format msgid "trigger functions can only be called as triggers" msgstr "тригер-Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ Ð¼Ð¾Ð¶Ðµ викликатиÑÑ Ð»Ð¸ÑˆÐµ Ñк тригер" -#: pltcl.c:1546 +#: pltcl.c:1551 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "Функції PL/Tcl не можуть повертати тип %s" -#: pltcl.c:1585 +#: pltcl.c:1590 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "Функції PL/Tcl не можуть приймати тип %s" -#: pltcl.c:1699 +#: pltcl.c:1702 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "не вдалоÑÑ Ñтворити внутрішню процедуру \"%s\": %s" -#: pltcl.c:3201 +#: pltcl.c:3207 #, c-format msgid "column name/value list must have even number of elements" msgstr "ÑпиÑок імен Ñ– значень Ñтовпців повинен мати парну кількіÑть елементів" -#: pltcl.c:3219 +#: pltcl.c:3225 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "ÑпиÑок імен Ñ– значень Ñтовпців міÑтить неіÑнуєче ім'Ñ ÑÑ‚Ð¾Ð²Ð¿Ñ†Ñ \"%s\"" -#: pltcl.c:3226 +#: pltcl.c:3232 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "не вдалоÑÑ Ð²Ñтановити ÑиÑтемний атрибут \"%s\"" -#: pltcl.c:3232 +#: pltcl.c:3238 #, c-format msgid "cannot set generated column \"%s\"" msgstr "неможливо оновити згенерований Ñтовпець \"%s\"" diff --git a/src/pl/tcl/po/zh_CN.po b/src/pl/tcl/po/zh_CN.po index d9e49a74ce8d6..d7c8cc5cac877 100644 --- a/src/pl/tcl/po/zh_CN.po +++ b/src/pl/tcl/po/zh_CN.po @@ -1,111 +1,125 @@ # LANGUAGE message translation file for pltcl # Copyright (C) 2019 PostgreSQL Global Development Group # This file is distributed under the same license as the pltcl (PostgreSQL) package. -# FIRST AUTHOR , 2019. +# Dianjin Wang , 2024 # msgid "" msgstr "" -"Project-Id-Version: pltcl (PostgreSQL) 14\n" +"Project-Id-Version: pltcl (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2021-08-14 05:38+0000\n" -"PO-Revision-Date: 2021-08-16 18:00+0800\n" -"Last-Translator: Jie Zhang \n" +"POT-Creation-Date: 2024-09-13 22:40+0000\n" +"PO-Revision-Date: 2024-09-14 13:50+0800\n" +"Last-Translator: Dianjin Wang \n" "Language-Team: Chinese (Simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.5.7\n" +"X-Generator: Poedit 3.4.4\n" -#: pltcl.c:463 +#: pltcl.c:462 msgid "PL/Tcl function to call once when pltcl is first used." -msgstr "PL/Tcl函数在首次使用pltcl时调用一次." +msgstr "PL/Tcl 函数在首次使用 pltcl 时调用一次." -#: pltcl.c:470 +#: pltcl.c:469 msgid "PL/TclU function to call once when pltclu is first used." -msgstr "PL/TclU函数在首次使用pltcl时调用一次." +msgstr "PL/TclU 函数在首次使用 pltclu 时调用一次." -#: pltcl.c:634 +#: pltcl.c:636 #, c-format msgid "function \"%s\" is in the wrong language" -msgstr "函数\"%s\"的语言错误" +msgstr "函数 \"%s\" 所用语言错误" -#: pltcl.c:645 +#: pltcl.c:647 #, c-format msgid "function \"%s\" must not be SECURITY DEFINER" -msgstr "函数\"%s\"ä¸èƒ½æ˜¯å®‰å…¨å®šä¹‰è€…" +msgstr "函数 \"%s\" ä¸èƒ½æ˜¯å®‰å…¨å®šä¹‰è€…" #. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" -#: pltcl.c:679 +#: pltcl.c:681 #, c-format msgid "processing %s parameter" -msgstr "正在处ç†%s傿•°" +msgstr "æ­£åœ¨å¤„ç† %s 傿•°" -#: pltcl.c:833 +#: pltcl.c:834 #, c-format msgid "set-valued function called in context that cannot accept a set" -msgstr "在ä¸èƒ½æŽ¥å—使用集åˆçš„环境中调用set-valued函数" +msgstr "在ä¸èƒ½æŽ¥å—使用集åˆçš„环境中调用 set-valued 函数" -#: pltcl.c:1006 +#: pltcl.c:839 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "è¦æ±‚物化模å¼ï¼Œä½†æ˜¯åœ¨è¿™ç§çŽ¯å¢ƒä¸‹ä¸å…许使用" + +#: pltcl.c:1012 #, c-format msgid "function returning record called in context that cannot accept type record" -msgstr "è¿”å›žå€¼ç±»åž‹æ˜¯è®°å½•çš„å‡½æ•°åœ¨ä¸æŽ¥å—使用记录类型的环境中调用" +msgstr "åœ¨ä¸æŽ¥å—记录类型的环境中调用返回记录的函数" + +#: pltcl.c:1031 +#, c-format +msgid "could not parse function return value: %s" +msgstr "无法解æžå‡½æ•°è¿”回值: %s" -#: pltcl.c:1290 +#: pltcl.c:1298 #, c-format -msgid "could not split return value from trigger: %s" -msgstr "无法分离æ¥è‡ªè§¦å‘器的返回值:%s" +msgid "could not parse trigger return value: %s" +msgstr "无法解æžè§¦å‘器返回值: %s" -#: pltcl.c:1371 pltcl.c:1801 +#: pltcl.c:1383 pltcl.c:1810 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1372 +#: pltcl.c:1384 #, c-format msgid "" "%s\n" "in PL/Tcl function \"%s\"" msgstr "" "%s\n" -"在PL/Tcl函数\"%s\"中" +"在 PL/Tcl 函数 \"%s\" 中" -#: pltcl.c:1536 +#: pltcl.c:1547 #, c-format msgid "trigger functions can only be called as triggers" msgstr "触å‘器函数åªèƒ½ä»¥è§¦å‘器的形å¼è°ƒç”¨" -#: pltcl.c:1540 +#: pltcl.c:1551 #, c-format msgid "PL/Tcl functions cannot return type %s" -msgstr "PL/Tcl函数ä¸èƒ½è¿”回类型%s" +msgstr "PL/Tcl 函数无法返回类型 %s" -#: pltcl.c:1579 +#: pltcl.c:1590 #, c-format msgid "PL/Tcl functions cannot accept type %s" -msgstr "PL/Tcl函数ä¸èƒ½ä½¿ç”¨ç±»åž‹ %s" +msgstr "PL/Tcl 函数无法接å—类型 %s" -#: pltcl.c:1693 +#: pltcl.c:1702 #, c-format msgid "could not create internal procedure \"%s\": %s" -msgstr "无法创建内部过程\"%s\":%s" +msgstr "无法创建内部过程 \"%s\":%s" -#: pltcl.c:3197 +#: pltcl.c:3207 #, c-format msgid "column name/value list must have even number of elements" msgstr "列å/å€¼åˆ—è¡¨å¿…é¡»å…·æœ‰å¶æ•°ä¸ªå…ƒç´ " -#: pltcl.c:3215 +#: pltcl.c:3225 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" -msgstr "列å/值列表包å«ä¸å­˜åœ¨çš„列å\"%s\"" +msgstr "列å/值列表包å«ä¸å­˜åœ¨çš„列å \"%s\"" -#: pltcl.c:3222 +#: pltcl.c:3232 #, c-format msgid "cannot set system attribute \"%s\"" -msgstr "ä¸èƒ½è®¾ç½®ç³»ç»Ÿå±žæ€§\"%s\"" +msgstr "ä¸èƒ½è®¾ç½®ç³»ç»Ÿå±žæ€§ \"%s\"" -#: pltcl.c:3228 +#: pltcl.c:3238 #, c-format msgid "cannot set generated column \"%s\"" msgstr "无法设置生æˆçš„列 \"%s\"" + +#, c-format +#~ msgid "could not split return value from trigger: %s" +#~ msgstr "无法分离æ¥è‡ªè§¦å‘器的返回值:%s" diff --git a/src/pl/tcl/po/zh_TW.po b/src/pl/tcl/po/zh_TW.po index 5932f05d2bdba..f484edafc7399 100644 --- a/src/pl/tcl/po/zh_TW.po +++ b/src/pl/tcl/po/zh_TW.po @@ -1,56 +1,135 @@ # Traditional Chinese message translation file for pltcl -# Copyright (C) 2011 PostgreSQL Global Development Group -# This file is distributed under the same license as the PostgreSQL package. +# Copyright (C) 2023 PostgreSQL Global Development Group +# This file is distributed under the same license as the pltcl (PostgreSQL) package. # Zhenbang Wei , 2011. # msgid "" msgstr "" -"Project-Id-Version: PostgreSQL 9.1\n" -"Report-Msgid-Bugs-To: pgsql-bugs@postgresql.org\n" -"POT-Creation-Date: 2011-05-13 20:39+0000\n" -"PO-Revision-Date: 2013-09-03 23:24-0400\n" +"Project-Id-Version: pltcl (PostgreSQL) 16\n" +"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" +"POT-Creation-Date: 2023-09-11 20:38+0000\n" +"PO-Revision-Date: 2023-11-06 08:50+0800\n" "Last-Translator: Zhenbang Wei \n" -"Language-Team: Traditional Chinese\n" +"Language-Team: \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.4.1\n" + +#: pltcl.c:462 +msgid "PL/Tcl function to call once when pltcl is first used." +msgstr "åˆæ¬¡ä½¿ç”¨ pltcl 時執行的 PL/Tcl 函數。" + +#: pltcl.c:469 +msgid "PL/TclU function to call once when pltclu is first used." +msgstr "åˆæ¬¡ä½¿ç”¨ pltclu 時執行的 PL/TclU 函數。" + +# utils/adt/ri_triggers.c:2921 +#: pltcl.c:636 +#, c-format +msgid "function \"%s\" is in the wrong language" +msgstr "函數 \"%s\" 使用錯誤的語言" + +# utils/adt/ri_triggers.c:2938 +#: pltcl.c:647 +#, c-format +msgid "function \"%s\" must not be SECURITY DEFINER" +msgstr "函數 \"%s\" ä¸å¾—設為 SECURITY DEFINER" + +#. translator: %s is "pltcl.start_proc" or "pltclu.start_proc" +#: pltcl.c:681 +#, c-format +msgid "processing %s parameter" +msgstr "è™•ç† %s åƒæ•¸" + +# executor/execQual.c:866 executor/execQual.c:910 executor/execQual.c:1086 +# executor/execQual.c:1211 executor/execQual.c:3445 executor/functions.c:666 +# executor/functions.c:705 utils/fmgr/funcapi.c:39 +#: pltcl.c:834 +#, c-format +msgid "set-valued function called in context that cannot accept a set" +msgstr "在無法接å—集åˆçš„æƒ…æ³ä¸‹å‘¼å«äº†å›žå‚³é›†åˆçš„函數" + +#: pltcl.c:839 +#, c-format +msgid "materialize mode required, but it is not allowed in this context" +msgstr "需è¦å¯¦é«”化模å¼ï¼Œä½†åœ¨é€™å€‹æƒ…æ³ä¸‹æ˜¯ä¸å…許的" + +#: pltcl.c:1012 +#, c-format +msgid "function returning record called in context that cannot accept type record" +msgstr "åœ¨ä¸æŽ¥å—記錄型別的清æ³ä¸‹å‘¼å«å›žå‚³è¨˜éŒ„的函數" + +# fe-exec.c:2204 +#: pltcl.c:1295 +#, c-format +msgid "could not split return value from trigger: %s" +msgstr "無法拆分觸發程åºçš„回傳值: %s" # commands/vacuum.c:2258 commands/vacuumlazy.c:489 commands/vacuumlazy.c:770 # nodes/print.c:86 storage/lmgr/deadlock.c:888 tcop/postgres.c:3285 -#: pltcl.c:1149 +#: pltcl.c:1376 pltcl.c:1803 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1150 +#: pltcl.c:1377 #, c-format msgid "" "%s\n" "in PL/Tcl function \"%s\"" msgstr "" "%s\n" -"æ–¼ PL/Tcl å‡½å¼ \"%s\"" +"æ–¼ PL/Tcl 函數 \"%s\"" -# common.c:123 -#: pltcl.c:1254 pltcl.c:1261 -msgid "out of memory" -msgstr "記憶體用盡" - -#: pltcl.c:1308 +#: pltcl.c:1540 +#, c-format msgid "trigger functions can only be called as triggers" -msgstr "觸發函å¼åªèƒ½ç•¶åšè§¸ç™¼ç¨‹åºå‘¼å«" +msgstr "觸發函數åªèƒ½è¢«ç•¶ä½œè§¸ç™¼ç¨‹åºä¾†å‘¼å«" -#: pltcl.c:1317 +#: pltcl.c:1544 #, c-format msgid "PL/Tcl functions cannot return type %s" -msgstr "PL/Tcl 函å¼ä¸èƒ½å‚³å›žåž‹åˆ¥ %s" +msgstr "PL/Tcl 函數ä¸èƒ½å›žå‚³åž‹åˆ¥ %s" -#: pltcl.c:1329 -msgid "PL/Tcl functions cannot return composite types" -msgstr "PL/Tcl 函å¼ä¸èƒ½å‚³å›žè¤‡åˆåž‹åˆ¥" - -#: pltcl.c:1368 +#: pltcl.c:1583 #, c-format msgid "PL/Tcl functions cannot accept type %s" -msgstr "PL/Tcl 函å¼ä¸èƒ½æŽ¥å—型別 %s" +msgstr "PL/Tcl 函數ä¸èƒ½æŽ¥å—型別 %s" + +# utils/init/miscinit.c:519 +#: pltcl.c:1695 +#, c-format +msgid "could not create internal procedure \"%s\": %s" +msgstr "ç„¡æ³•å»ºç«‹å…§éƒ¨ç¨‹åº \"%s\": %s" + +# parser/analyze.c:2210 +#: pltcl.c:3199 +#, c-format +msgid "column name/value list must have even number of elements" +msgstr "欄ä½å稱/å€¼æ¸…å–®é ˆæœ‰å¶æ•¸å€‹å…ƒç´ " + +#: pltcl.c:3217 +#, c-format +msgid "column name/value list contains nonexistent column name \"%s\"" +msgstr "欄ä½å稱/值清單包å«ä¸å­˜åœ¨çš„æ¬„ä½å稱 \"%s\"" + +# commands/tablecmds.c:5425 +#: pltcl.c:3224 +#, c-format +msgid "cannot set system attribute \"%s\"" +msgstr "無法設定系統屬性 \"%s\"" + +# commands/tablecmds.c:4580 +#: pltcl.c:3230 +#, c-format +msgid "cannot set generated column \"%s\"" +msgstr "ç„¡æ³•è¨­å®šè¢«ç”¢ç”Ÿçš„æ¬„ä½ \"%s\"" + +#~ msgid "PL/Tcl functions cannot return composite types" +#~ msgstr "PL/Tcl 函å¼ä¸èƒ½å‚³å›žè¤‡åˆåž‹åˆ¥" + +# common.c:123 +#~ msgid "out of memory" +#~ msgstr "記憶體用盡" diff --git a/src/pl/tcl/sql/pltcl_call.sql b/src/pl/tcl/sql/pltcl_call.sql index 37efbdefc2315..fe64361c73284 100644 --- a/src/pl/tcl/sql/pltcl_call.sql +++ b/src/pl/tcl/sql/pltcl_call.sql @@ -71,6 +71,17 @@ END $$; +-- syntax error in result tuple + +CREATE PROCEDURE test_proc10(INOUT a text) +LANGUAGE pltcl +AS $$ +return [list a {$a + $a}]) +$$; + +CALL test_proc10('abc'); + + DROP PROCEDURE test_proc1; DROP PROCEDURE test_proc2; DROP PROCEDURE test_proc3; diff --git a/src/pl/tcl/sql/pltcl_setup.sql b/src/pl/tcl/sql/pltcl_setup.sql index e9f59989b5b82..b9892ea4f7607 100644 --- a/src/pl/tcl/sql/pltcl_setup.sql +++ b/src/pl/tcl/sql/pltcl_setup.sql @@ -142,7 +142,7 @@ CREATE OPERATOR CLASS tcl_int4_ops -- for initialization problems. -- create function tcl_date_week(int4,int4,int4) returns text as $$ - return [clock format [clock scan "$2/$3/$1"] -format "%U"] + return [clock format [clock scan "$2/$3/$1" -gmt 1] -format "%U" -gmt 1] $$ language pltcl immutable; select tcl_date_week(2010,1,26); diff --git a/src/port/Makefile b/src/port/Makefile index 711f59e32bd03..db7c02117b02d 100644 --- a/src/port/Makefile +++ b/src/port/Makefile @@ -35,11 +35,10 @@ include $(top_builddir)/src/Makefile.global override CPPFLAGS := -I$(top_builddir)/src/port -DFRONTEND $(CPPFLAGS) LIBS += $(PTHREAD_LIBS) -# If you add objects here, see also src/tools/msvc/Mkvcbuild.pm - OBJS = \ $(LIBOBJS) \ $(PG_CRC32C_OBJS) \ + $(PG_POPCNT_OBJS) \ bsearch_arg.o \ chklocale.o \ inet_net_ntop.o \ @@ -59,7 +58,7 @@ OBJS = \ snprintf.o \ strerror.o \ tar.o \ - thread.o + user.o # libpgport.a, libpgport_shlib.a, and libpgport_srv.a contain the same files # foo.o, foo_shlib.o, and foo_srv.o are all built from foo.c @@ -84,10 +83,6 @@ libpgport.a: $(OBJS) rm -f $@ $(AR) $(AROPT) $@ $^ -# thread.o and thread_shlib.o need PTHREAD_CFLAGS (but thread_srv.o does not) -thread.o: CFLAGS+=$(PTHREAD_CFLAGS) -thread_shlib.o: CFLAGS+=$(PTHREAD_CFLAGS) - # all versions of pg_crc32c_sse42.o need CFLAGS_CRC pg_crc32c_sse42.o: CFLAGS+=$(CFLAGS_CRC) pg_crc32c_sse42_shlib.o: CFLAGS+=$(CFLAGS_CRC) @@ -98,6 +93,16 @@ pg_crc32c_armv8.o: CFLAGS+=$(CFLAGS_CRC) pg_crc32c_armv8_shlib.o: CFLAGS+=$(CFLAGS_CRC) pg_crc32c_armv8_srv.o: CFLAGS+=$(CFLAGS_CRC) +# all versions of pg_popcount_avx512_choose.o need CFLAGS_XSAVE +pg_popcount_avx512_choose.o: CFLAGS+=$(CFLAGS_XSAVE) +pg_popcount_avx512_choose_shlib.o: CFLAGS+=$(CFLAGS_XSAVE) +pg_popcount_avx512_choose_srv.o: CFLAGS+=$(CFLAGS_XSAVE) + +# all versions of pg_popcount_avx512.o need CFLAGS_POPCNT +pg_popcount_avx512.o: CFLAGS+=$(CFLAGS_POPCNT) +pg_popcount_avx512_shlib.o: CFLAGS+=$(CFLAGS_POPCNT) +pg_popcount_avx512_srv.o: CFLAGS+=$(CFLAGS_POPCNT) + # # Shared library versions of object files # @@ -158,6 +163,6 @@ pg_config_paths.h: $(top_builddir)/src/Makefile.global echo "#define HTMLDIR \"$(htmldir)\"" >>$@ echo "#define MANDIR \"$(mandir)\"" >>$@ -clean distclean maintainer-clean: +clean distclean: rm -f libpgport.a libpgport_shlib.a libpgport_srv.a rm -f $(OBJS) $(OBJS_SHLIB) $(OBJS_SRV) pg_config_paths.h diff --git a/src/port/README b/src/port/README index 97f18a623382a..ed5c54a72fac7 100644 --- a/src/port/README +++ b/src/port/README @@ -28,5 +28,5 @@ applications. from libpgport are linked first. This avoids having applications dependent on symbols that are _used_ by libpq, but not intended to be exported by libpq. libpq's libpgport usage changes over time, so such a -dependency is a problem. Windows, Linux, AIX, and macOS use an export +dependency is a problem. Windows, Linux, and macOS use an export list to control the symbols exported by libpq. diff --git a/src/port/bsearch_arg.c b/src/port/bsearch_arg.c index 641b40c353389..e0446a9f07512 100644 --- a/src/port/bsearch_arg.c +++ b/src/port/bsearch_arg.c @@ -1,7 +1,7 @@ /* * bsearch_arg.c: bsearch variant with a user-supplied pointer * - * Copyright (c) 2021-2023, PostgreSQL Global Development Group + * Copyright (c) 2021-2024, PostgreSQL Global Development Group * Copyright (c) 1990 Regents of the University of California. * All rights reserved. * @@ -58,8 +58,8 @@ bsearch_arg(const void *key, const void *base0, void *arg) { const char *base = (const char *) base0; - int lim, - cmp; + size_t lim; + int cmp; const void *p; for (lim = nmemb; lim != 0; lim >>= 1) diff --git a/src/port/chklocale.c b/src/port/chklocale.c index 6fa6810a46a99..8cb81c8640eee 100644 --- a/src/port/chklocale.c +++ b/src/port/chklocale.c @@ -4,7 +4,7 @@ * Functions for handling locale-related info * * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/port/dirent.c b/src/port/dirent.c index 528b4b2a52bbd..1f47ea65756c2 100644 --- a/src/port/dirent.c +++ b/src/port/dirent.c @@ -3,7 +3,7 @@ * dirent.c * opendir/readdir/closedir for win32/msvc * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/port/dirmod.c b/src/port/dirmod.c index 07dd190cbccd4..f98d5a7bf2864 100644 --- a/src/port/dirmod.c +++ b/src/port/dirmod.c @@ -3,7 +3,7 @@ * dirmod.c * directory handling functions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * This includes replacement versions of functions that work on diff --git a/src/port/explicit_bzero.c b/src/port/explicit_bzero.c index f3a5038aa765a..735e21c8b36da 100644 --- a/src/port/explicit_bzero.c +++ b/src/port/explicit_bzero.c @@ -2,7 +2,7 @@ * * explicit_bzero.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/port/getopt_long.c b/src/port/getopt_long.c index c9892769883a3..f83de0dff9789 100644 --- a/src/port/getopt_long.c +++ b/src/port/getopt_long.c @@ -50,8 +50,11 @@ * This implementation does not use optreset. Instead, we guarantee that * it can be restarted on a new argv array after a previous call returned -1, * if the caller resets optind to 1 before the first call of the new series. - * (Internally, this means we must be sure to reset "place" to EMSG before - * returning -1.) + * (Internally, this means we must be sure to reset "place" to EMSG, + * "nonopt_start" to -1, and "force_nonopt" to false before returning -1.) + * + * Note that this routine reorders the pointers in argv (despite the const + * qualifier) so that all non-options will be at the end when -1 is returned. */ int getopt_long(int argc, char *const argv[], @@ -60,38 +63,58 @@ getopt_long(int argc, char *const argv[], { static char *place = EMSG; /* option letter processing */ char *oli; /* option letter list index */ + static int nonopt_start = -1; + static bool force_nonopt = false; if (!*place) { /* update scanning pointer */ - if (optind >= argc) + char **args = (char **) argv; + +retry: + + /* + * If we are out of arguments or only non-options remain, return -1. + */ + if (optind >= argc || optind == nonopt_start) { place = EMSG; + nonopt_start = -1; + force_nonopt = false; return -1; } place = argv[optind]; - if (place[0] != '-') + /* + * An argument is a non-option if it meets any of the following + * criteria: it follows an argument that is equivalent to the string + * "--", it does not start with '-', or it is equivalent to the string + * "-". When we encounter a non-option, we move it to the end of argv + * (after shifting all remaining arguments over to make room), and + * then we try again with the next argument. + */ + if (force_nonopt || place[0] != '-' || place[1] == '\0') { - place = EMSG; - return -1; - } + for (int i = optind; i < argc - 1; i++) + args[i] = args[i + 1]; + args[argc - 1] = place; - place++; + if (nonopt_start == -1) + nonopt_start = argc - 1; + else + nonopt_start--; - if (!*place) - { - /* treat "-" as not being an option */ - place = EMSG; - return -1; + goto retry; } + place++; + if (place[0] == '-' && place[1] == '\0') { /* found "--", treat it as end of options */ ++optind; - place = EMSG; - return -1; + force_nonopt = true; + goto retry; } if (place[0] == '-' && place[1]) diff --git a/src/port/getpeereid.c b/src/port/getpeereid.c index 3b040e076b698..f1fef91631735 100644 --- a/src/port/getpeereid.c +++ b/src/port/getpeereid.c @@ -3,7 +3,7 @@ * getpeereid.c * get peer userid for UNIX-domain socket connection * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/port/kill.c b/src/port/kill.c index 2cf7b9210930d..412c2f19c15d0 100644 --- a/src/port/kill.c +++ b/src/port/kill.c @@ -3,7 +3,7 @@ * kill.c * kill() * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * This is a replacement version of kill for Win32 which sends * signals that the backend can recognize. diff --git a/src/port/meson.build b/src/port/meson.build index 24416b9bfc07c..90f837248defa 100644 --- a/src/port/meson.build +++ b/src/port/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pgport_sources = [ 'bsearch_arg.c', @@ -20,7 +20,7 @@ pgport_sources = [ 'snprintf.c', 'strerror.c', 'tar.c', - 'thread.c', + 'user.c', ] if host_system == 'windows' @@ -35,6 +35,7 @@ if host_system == 'windows' 'win32error.c', 'win32fdatasync.c', 'win32fseek.c', + 'win32gai_strerror.c', 'win32getrusage.c', 'win32link.c', 'win32ntdll.c', @@ -66,8 +67,6 @@ replace_funcs_neg = [ ['getpeereid'], ['inet_aton'], ['mkdtemp'], - ['preadv', 'HAVE_DECL_PREADV'], - ['pwritev', 'HAVE_DECL_PWRITEV'], ['strlcat'], ['strlcpy'], ['strnlen'], @@ -85,6 +84,8 @@ replace_funcs_pos = [ ['pg_crc32c_sse42', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK', 'crc'], ['pg_crc32c_sse42_choose', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'], ['pg_crc32c_sb8', 'USE_SSE42_CRC32C_WITH_RUNTIME_CHECK'], + ['pg_popcount_avx512', 'USE_AVX512_POPCNT_WITH_RUNTIME_CHECK', 'popcnt'], + ['pg_popcount_avx512_choose', 'USE_AVX512_POPCNT_WITH_RUNTIME_CHECK', 'xsave'], # arm / aarch64 ['pg_crc32c_armv8', 'USE_ARMV8_CRC32C'], @@ -92,12 +93,15 @@ replace_funcs_pos = [ ['pg_crc32c_armv8_choose', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'], ['pg_crc32c_sb8', 'USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK'], + # loongarch + ['pg_crc32c_loongarch', 'USE_LOONGARCH_CRC32C'], + # generic fallback ['pg_crc32c_sb8', 'USE_SLICING_BY_8_CRC32C'], ] -pgport_cflags = {'crc': cflags_crc} -pgport_sources_cflags = {'crc': []} +pgport_cflags = {'crc': cflags_crc, 'popcnt': cflags_popcnt, 'xsave': cflags_xsave} +pgport_sources_cflags = {'crc': [], 'popcnt': [], 'xsave': []} foreach f : replace_funcs_neg func = f.get(0) @@ -181,6 +185,7 @@ foreach name, opts : pgport_variants lib = static_library('libpgport@0@'.format(name), pgport_sources, link_with: cflag_libs, + link_whole: cflag_libs, c_pch: pch_c_h, kwargs: opts + { 'dependencies': opts['dependencies'] + [ssl], @@ -192,3 +197,6 @@ endforeach pgport_srv = pgport['_srv'] pgport_static = pgport[''] pgport_shlib = pgport['_shlib'] + +# autoconf generates the file there, ensure we get a conflict +generated_sources_ac += {'src/port': ['pg_config_paths.h']} diff --git a/src/port/mkdtemp.c b/src/port/mkdtemp.c index 4578e8384c743..65ba193758bf7 100644 --- a/src/port/mkdtemp.c +++ b/src/port/mkdtemp.c @@ -3,7 +3,7 @@ * mkdtemp.c * create a mode-0700 temporary directory * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/port/noblock.c b/src/port/noblock.c index d050a03085151..29a04bb000c8b 100644 --- a/src/port/noblock.c +++ b/src/port/noblock.c @@ -3,7 +3,7 @@ * noblock.c * set a file descriptor as blocking or non-blocking * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/port/open.c b/src/port/open.c index 0bd97550063c3..13e49af8d4fba 100644 --- a/src/port/open.c +++ b/src/port/open.c @@ -4,7 +4,7 @@ * Win32 open() replacement * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/port/open.c * diff --git a/src/port/path.c b/src/port/path.c index 65c7943fee1ec..d614f1ce0b655 100644 --- a/src/port/path.c +++ b/src/port/path.c @@ -3,7 +3,7 @@ * path.c * portable path handling routines * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -35,6 +35,7 @@ #include #endif +#include "mb/pg_wchar.h" #include "pg_config_paths.h" @@ -44,6 +45,10 @@ #define IS_PATH_VAR_SEP(ch) ((ch) == ';') #endif +#ifdef WIN32 +static void debackslash_path(char *path, int encoding); +static int pg_sjis_mblen(const unsigned char *s); +#endif static void make_relative_path(char *ret_path, const char *target_path, const char *bin_path, const char *my_exec_path); static char *trim_directory(char *path); @@ -148,10 +153,73 @@ last_dir_separator(const char *filename) } +#ifdef WIN32 + +/* + * Convert '\' to '/' within the given path, assuming the path + * is in the specified encoding. + */ +static void +debackslash_path(char *path, int encoding) +{ + char *p; + + /* + * Of the supported encodings, only Shift-JIS has multibyte characters + * that can include a byte equal to '\' (0x5C). So rather than implement + * a fully encoding-aware conversion, we special-case SJIS. (Invoking the + * general encoding-aware logic in wchar.c is impractical here for + * assorted reasons.) + */ + if (encoding == PG_SJIS) + { + for (p = path; *p; p += pg_sjis_mblen((const unsigned char *) p)) + { + if (*p == '\\') + *p = '/'; + } + } + else + { + for (p = path; *p; p++) + { + if (*p == '\\') + *p = '/'; + } + } +} + /* - * make_native_path - on WIN32, change / to \ in the path + * SJIS character length * - * This effectively undoes canonicalize_path. + * This must match the behavior of + * pg_encoding_mblen_bounded(PG_SJIS, s) + * In particular, unlike the version of pg_sjis_mblen in src/common/wchar.c, + * do not allow caller to accidentally step past end-of-string. + */ +static int +pg_sjis_mblen(const unsigned char *s) +{ + int len; + + if (*s >= 0xa1 && *s <= 0xdf) + len = 1; /* 1 byte kana? */ + else if (IS_HIGHBIT_SET(*s) && s[1] != '\0') + len = 2; /* kanji? */ + else + len = 1; /* should be ASCII */ + return len; +} + +#endif /* WIN32 */ + + +/* + * make_native_path - on WIN32, change '/' to '\' in the path + * + * This reverses the '\'-to-'/' transformation of debackslash_path. + * We need not worry about encodings here, since '/' does not appear + * as a byte of a multibyte character in any supported encoding. * * This is required because WIN32 COPY is an internal CMD.EXE * command and doesn't process forward slashes in the same way @@ -181,13 +249,14 @@ make_native_path(char *filename) * on Windows. We need them to use filenames without spaces, for which a * short filename is the safest equivalent, eg: * C:/Progra~1/ + * + * Presently, this is only used on paths that we can assume are in a + * server-safe encoding, so there's no need for an encoding-aware variant. */ void cleanup_path(char *path) { #ifdef WIN32 - char *ptr; - /* * GetShortPathName() will fail if the path does not exist, or short names * are disabled on this file system. In both cases, we just return the @@ -197,11 +266,8 @@ cleanup_path(char *path) GetShortPathName(path, path, MAXPGPATH - 1); /* Replace '\' with '/' */ - for (ptr = path; *ptr; ptr++) - { - if (*ptr == '\\') - *ptr = '/'; - } + /* All server-safe encodings are alike here, so just use PG_SQL_ASCII */ + debackslash_path(path, PG_SQL_ASCII); #endif } @@ -248,10 +314,12 @@ typedef enum RELATIVE_PATH_INIT, /* At start of a relative path */ RELATIVE_WITH_N_DEPTH, /* We collected 'pathdepth' directories in a * relative path */ - RELATIVE_WITH_PARENT_REF /* Relative path containing only double-dots */ + RELATIVE_WITH_PARENT_REF, /* Relative path containing only double-dots */ } canonicalize_state; /* + * canonicalize_path() + * * Clean up path by: * o make Win32 path use Unix slashes * o remove trailing quote on Win32 @@ -259,9 +327,20 @@ typedef enum * o remove duplicate (adjacent) separators * o remove '.' (unless path reduces to only '.') * o process '..' ourselves, removing it if possible + * Modifies path in-place. + * + * This comes in two variants: encoding-aware and not. The non-aware version + * is only safe to use on strings that are in a server-safe encoding. */ void canonicalize_path(char *path) +{ + /* All server-safe encodings are alike here, so just use PG_SQL_ASCII */ + canonicalize_path_enc(path, PG_SQL_ASCII); +} + +void +canonicalize_path_enc(char *path, int encoding) { char *p, *to_p; @@ -277,17 +356,15 @@ canonicalize_path(char *path) /* * The Windows command processor will accept suitably quoted paths with * forward slashes, but barfs badly with mixed forward and back slashes. + * Hence, start by converting all back slashes to forward slashes. */ - for (p = path; *p; p++) - { - if (*p == '\\') - *p = '/'; - } + debackslash_path(path, encoding); /* * In Win32, if you do: prog.exe "a b" "\c\d\" the system will pass \c\d" * as argv[2], so trim off trailing quote. */ + p = path + strlen(path); if (p > path && *(p - 1) == '"') *(p - 1) = '/'; #endif @@ -772,8 +849,7 @@ make_absolute_path(const char *path) #ifndef FRONTEND elog(ERROR, "could not get current working directory: %m"); #else - fprintf(stderr, _("could not get current working directory: %s\n"), - strerror(errno)); + fprintf(stderr, _("could not get current working directory: %m\n")); return NULL; #endif } diff --git a/src/port/pg_bitutils.c b/src/port/pg_bitutils.c index 1f3dea2d4b685..87f56e82b8010 100644 --- a/src/port/pg_bitutils.c +++ b/src/port/pg_bitutils.c @@ -3,7 +3,7 @@ * pg_bitutils.c * Miscellaneous functions for bit-wise operations. * - * Copyright (c) 2019-2023, PostgreSQL Global Development Group + * Copyright (c) 2019-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/pg_bitutils.c @@ -103,18 +103,26 @@ const uint8 pg_number_of_ones[256] = { 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 }; -static int pg_popcount32_slow(uint32 word); -static int pg_popcount64_slow(uint64 word); +static inline int pg_popcount32_slow(uint32 word); +static inline int pg_popcount64_slow(uint64 word); +static uint64 pg_popcount_slow(const char *buf, int bytes); +static uint64 pg_popcount_masked_slow(const char *buf, int bytes, bits8 mask); #ifdef TRY_POPCNT_FAST static bool pg_popcount_available(void); static int pg_popcount32_choose(uint32 word); static int pg_popcount64_choose(uint64 word); -static int pg_popcount32_fast(uint32 word); -static int pg_popcount64_fast(uint64 word); +static uint64 pg_popcount_choose(const char *buf, int bytes); +static uint64 pg_popcount_masked_choose(const char *buf, int bytes, bits8 mask); +static inline int pg_popcount32_fast(uint32 word); +static inline int pg_popcount64_fast(uint64 word); +static uint64 pg_popcount_fast(const char *buf, int bytes); +static uint64 pg_popcount_masked_fast(const char *buf, int bytes, bits8 mask); int (*pg_popcount32) (uint32 word) = pg_popcount32_choose; int (*pg_popcount64) (uint64 word) = pg_popcount64_choose; +uint64 (*pg_popcount_optimized) (const char *buf, int bytes) = pg_popcount_choose; +uint64 (*pg_popcount_masked_optimized) (const char *buf, int bytes, bits8 mask) = pg_popcount_masked_choose; #endif /* TRY_POPCNT_FAST */ #ifdef TRY_POPCNT_FAST @@ -144,45 +152,66 @@ pg_popcount_available(void) * the function pointers so that subsequent calls are routed directly to * the chosen implementation. */ -static int -pg_popcount32_choose(uint32 word) +static inline void +choose_popcount_functions(void) { if (pg_popcount_available()) { pg_popcount32 = pg_popcount32_fast; pg_popcount64 = pg_popcount64_fast; + pg_popcount_optimized = pg_popcount_fast; + pg_popcount_masked_optimized = pg_popcount_masked_fast; } else { pg_popcount32 = pg_popcount32_slow; pg_popcount64 = pg_popcount64_slow; + pg_popcount_optimized = pg_popcount_slow; + pg_popcount_masked_optimized = pg_popcount_masked_slow; } +#ifdef USE_AVX512_POPCNT_WITH_RUNTIME_CHECK + if (pg_popcount_avx512_available()) + { + pg_popcount_optimized = pg_popcount_avx512; + pg_popcount_masked_optimized = pg_popcount_masked_avx512; + } +#endif +} + +static int +pg_popcount32_choose(uint32 word) +{ + choose_popcount_functions(); return pg_popcount32(word); } static int pg_popcount64_choose(uint64 word) { - if (pg_popcount_available()) - { - pg_popcount32 = pg_popcount32_fast; - pg_popcount64 = pg_popcount64_fast; - } - else - { - pg_popcount32 = pg_popcount32_slow; - pg_popcount64 = pg_popcount64_slow; - } - + choose_popcount_functions(); return pg_popcount64(word); } +static uint64 +pg_popcount_choose(const char *buf, int bytes) +{ + choose_popcount_functions(); + return pg_popcount_optimized(buf, bytes); +} + +static uint64 +pg_popcount_masked_choose(const char *buf, int bytes, bits8 mask) +{ + choose_popcount_functions(); + return pg_popcount_masked(buf, bytes, mask); +} + /* * pg_popcount32_fast * Return the number of 1 bits set in word */ -static int +static inline int pg_popcount32_fast(uint32 word) { #ifdef _MSC_VER @@ -199,7 +228,7 @@ __asm__ __volatile__(" popcntl %1,%0\n":"=q"(res):"rm"(word):"cc"); * pg_popcount64_fast * Return the number of 1 bits set in word */ -static int +static inline int pg_popcount64_fast(uint64 word) { #ifdef _MSC_VER @@ -212,6 +241,102 @@ __asm__ __volatile__(" popcntq %1,%0\n":"=q"(res):"rm"(word):"cc"); #endif } +/* + * pg_popcount_fast + * Returns the number of 1-bits in buf + */ +static uint64 +pg_popcount_fast(const char *buf, int bytes) +{ + uint64 popcnt = 0; + +#if SIZEOF_VOID_P >= 8 + /* Process in 64-bit chunks if the buffer is aligned. */ + if (buf == (const char *) TYPEALIGN(8, buf)) + { + const uint64 *words = (const uint64 *) buf; + + while (bytes >= 8) + { + popcnt += pg_popcount64_fast(*words++); + bytes -= 8; + } + + buf = (const char *) words; + } +#else + /* Process in 32-bit chunks if the buffer is aligned. */ + if (buf == (const char *) TYPEALIGN(4, buf)) + { + const uint32 *words = (const uint32 *) buf; + + while (bytes >= 4) + { + popcnt += pg_popcount32_fast(*words++); + bytes -= 4; + } + + buf = (const char *) words; + } +#endif + + /* Process any remaining bytes */ + while (bytes--) + popcnt += pg_number_of_ones[(unsigned char) *buf++]; + + return popcnt; +} + +/* + * pg_popcount_masked_fast + * Returns the number of 1-bits in buf after applying the mask to each byte + */ +static uint64 +pg_popcount_masked_fast(const char *buf, int bytes, bits8 mask) +{ + uint64 popcnt = 0; + +#if SIZEOF_VOID_P >= 8 + /* Process in 64-bit chunks if the buffer is aligned */ + uint64 maskv = ~UINT64CONST(0) / 0xFF * mask; + + if (buf == (const char *) TYPEALIGN(8, buf)) + { + const uint64 *words = (const uint64 *) buf; + + while (bytes >= 8) + { + popcnt += pg_popcount64_fast(*words++ & maskv); + bytes -= 8; + } + + buf = (const char *) words; + } +#else + /* Process in 32-bit chunks if the buffer is aligned. */ + uint32 maskv = ~((uint32) 0) / 0xFF * mask; + + if (buf == (const char *) TYPEALIGN(4, buf)) + { + const uint32 *words = (const uint32 *) buf; + + while (bytes >= 4) + { + popcnt += pg_popcount32_fast(*words++ & maskv); + bytes -= 4; + } + + buf = (const char *) words; + } +#endif + + /* Process any remaining bytes */ + while (bytes--) + popcnt += pg_number_of_ones[(unsigned char) *buf++ & mask]; + + return popcnt; +} + #endif /* TRY_POPCNT_FAST */ @@ -219,7 +344,7 @@ __asm__ __volatile__(" popcntq %1,%0\n":"=q"(res):"rm"(word):"cc"); * pg_popcount32_slow * Return the number of 1 bits set in word */ -static int +static inline int pg_popcount32_slow(uint32 word) { #ifdef HAVE__BUILTIN_POPCOUNT @@ -241,7 +366,7 @@ pg_popcount32_slow(uint32 word) * pg_popcount64_slow * Return the number of 1 bits set in word */ -static int +static inline int pg_popcount64_slow(uint64 word) { #ifdef HAVE__BUILTIN_POPCOUNT @@ -265,47 +390,72 @@ pg_popcount64_slow(uint64 word) #endif /* HAVE__BUILTIN_POPCOUNT */ } -#ifndef TRY_POPCNT_FAST - /* - * When the POPCNT instruction is not available, there's no point in using - * function pointers to vary the implementation between the fast and slow - * method. We instead just make these actual external functions when - * TRY_POPCNT_FAST is not defined. The compiler should be able to inline - * the slow versions here. + * pg_popcount_slow + * Returns the number of 1-bits in buf */ -int -pg_popcount32(uint32 word) +static uint64 +pg_popcount_slow(const char *buf, int bytes) { - return pg_popcount32_slow(word); -} + uint64 popcnt = 0; -int -pg_popcount64(uint64 word) -{ - return pg_popcount64_slow(word); -} +#if SIZEOF_VOID_P >= 8 + /* Process in 64-bit chunks if the buffer is aligned. */ + if (buf == (const char *) TYPEALIGN(8, buf)) + { + const uint64 *words = (const uint64 *) buf; -#endif /* !TRY_POPCNT_FAST */ + while (bytes >= 8) + { + popcnt += pg_popcount64_slow(*words++); + bytes -= 8; + } + + buf = (const char *) words; + } +#else + /* Process in 32-bit chunks if the buffer is aligned. */ + if (buf == (const char *) TYPEALIGN(4, buf)) + { + const uint32 *words = (const uint32 *) buf; + + while (bytes >= 4) + { + popcnt += pg_popcount32_slow(*words++); + bytes -= 4; + } + + buf = (const char *) words; + } +#endif + + /* Process any remaining bytes */ + while (bytes--) + popcnt += pg_number_of_ones[(unsigned char) *buf++]; + + return popcnt; +} /* - * pg_popcount - * Returns the number of 1-bits in buf + * pg_popcount_masked_slow + * Returns the number of 1-bits in buf after applying the mask to each byte */ -uint64 -pg_popcount(const char *buf, int bytes) +static uint64 +pg_popcount_masked_slow(const char *buf, int bytes, bits8 mask) { uint64 popcnt = 0; #if SIZEOF_VOID_P >= 8 - /* Process in 64-bit chunks if the buffer is aligned. */ + /* Process in 64-bit chunks if the buffer is aligned */ + uint64 maskv = ~UINT64CONST(0) / 0xFF * mask; + if (buf == (const char *) TYPEALIGN(8, buf)) { const uint64 *words = (const uint64 *) buf; while (bytes >= 8) { - popcnt += pg_popcount64(*words++); + popcnt += pg_popcount64_slow(*words++ & maskv); bytes -= 8; } @@ -313,13 +463,15 @@ pg_popcount(const char *buf, int bytes) } #else /* Process in 32-bit chunks if the buffer is aligned. */ + uint32 maskv = ~((uint32) 0) / 0xFF * mask; + if (buf == (const char *) TYPEALIGN(4, buf)) { const uint32 *words = (const uint32 *) buf; while (bytes >= 4) { - popcnt += pg_popcount32(*words++); + popcnt += pg_popcount32_slow(*words++ & maskv); bytes -= 4; } @@ -329,7 +481,50 @@ pg_popcount(const char *buf, int bytes) /* Process any remaining bytes */ while (bytes--) - popcnt += pg_number_of_ones[(unsigned char) *buf++]; + popcnt += pg_number_of_ones[(unsigned char) *buf++ & mask]; return popcnt; } + +#ifndef TRY_POPCNT_FAST + +/* + * When the POPCNT instruction is not available, there's no point in using + * function pointers to vary the implementation between the fast and slow + * method. We instead just make these actual external functions when + * TRY_POPCNT_FAST is not defined. The compiler should be able to inline + * the slow versions here. + */ +int +pg_popcount32(uint32 word) +{ + return pg_popcount32_slow(word); +} + +int +pg_popcount64(uint64 word) +{ + return pg_popcount64_slow(word); +} + +/* + * pg_popcount_optimized + * Returns the number of 1-bits in buf + */ +uint64 +pg_popcount_optimized(const char *buf, int bytes) +{ + return pg_popcount_slow(buf, bytes); +} + +/* + * pg_popcount_masked_optimized + * Returns the number of 1-bits in buf after applying the mask to each byte + */ +uint64 +pg_popcount_masked_optimized(const char *buf, int bytes, bits8 mask) +{ + return pg_popcount_masked_slow(buf, bytes, mask); +} + +#endif /* !TRY_POPCNT_FAST */ diff --git a/src/port/pg_crc32c_armv8.c b/src/port/pg_crc32c_armv8.c index d8fae510cfe7d..d47d838c50b2b 100644 --- a/src/port/pg_crc32c_armv8.c +++ b/src/port/pg_crc32c_armv8.c @@ -3,7 +3,7 @@ * pg_crc32c_armv8.c * Compute CRC-32C checksum using ARMv8 CRC Extension instructions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/port/pg_crc32c_armv8_choose.c b/src/port/pg_crc32c_armv8_choose.c index 0fdddccaf7e47..eaf39cf3e8176 100644 --- a/src/port/pg_crc32c_armv8_choose.c +++ b/src/port/pg_crc32c_armv8_choose.c @@ -8,7 +8,7 @@ * computation. Otherwise, fall back to the pure software implementation * (slicing-by-8). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/port/pg_crc32c_loongarch.c b/src/port/pg_crc32c_loongarch.c new file mode 100644 index 0000000000000..2004b840c8ddf --- /dev/null +++ b/src/port/pg_crc32c_loongarch.c @@ -0,0 +1,73 @@ +/*------------------------------------------------------------------------- + * + * pg_crc32c_loongarch.c + * Compute CRC-32C checksum using LoongArch CRCC instructions + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * src/port/pg_crc32c_loongarch.c + * + *------------------------------------------------------------------------- + */ +#include "c.h" + +#include "port/pg_crc32c.h" + +pg_crc32c +pg_comp_crc32c_loongarch(pg_crc32c crc, const void *data, size_t len) +{ + const unsigned char *p = data; + const unsigned char *pend = p + len; + + /* + * LoongArch doesn't require alignment, but aligned memory access is + * significantly faster. Process leading bytes so that the loop below + * starts with a pointer aligned to eight bytes. + */ + if (!PointerIsAligned(p, uint16) && + p + 1 <= pend) + { + crc = __builtin_loongarch_crcc_w_b_w(*p, crc); + p += 1; + } + if (!PointerIsAligned(p, uint32) && + p + 2 <= pend) + { + crc = __builtin_loongarch_crcc_w_h_w(*(uint16 *) p, crc); + p += 2; + } + if (!PointerIsAligned(p, uint64) && + p + 4 <= pend) + { + crc = __builtin_loongarch_crcc_w_w_w(*(uint32 *) p, crc); + p += 4; + } + + /* Process eight bytes at a time, as far as we can. */ + while (p + 8 <= pend) + { + crc = __builtin_loongarch_crcc_w_d_w(*(uint64 *) p, crc); + p += 8; + } + + /* Process remaining 0-7 bytes. */ + if (p + 4 <= pend) + { + crc = __builtin_loongarch_crcc_w_w_w(*(uint32 *) p, crc); + p += 4; + } + if (p + 2 <= pend) + { + crc = __builtin_loongarch_crcc_w_h_w(*(uint16 *) p, crc); + p += 2; + } + if (p < pend) + { + crc = __builtin_loongarch_crcc_w_b_w(*p, crc); + } + + return crc; +} diff --git a/src/port/pg_crc32c_sb8.c b/src/port/pg_crc32c_sb8.c index cdd3e05123354..eda20fa747fa9 100644 --- a/src/port/pg_crc32c_sb8.c +++ b/src/port/pg_crc32c_sb8.c @@ -8,7 +8,7 @@ * Generation", IEEE Transactions on Computers, vol.57, no. 11, * pp. 1550-1560, November 2008, doi:10.1109/TC.2008.85 * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/port/pg_crc32c_sse42.c b/src/port/pg_crc32c_sse42.c index 0bac452717a7b..7f88c1148009b 100644 --- a/src/port/pg_crc32c_sse42.c +++ b/src/port/pg_crc32c_sse42.c @@ -3,7 +3,7 @@ * pg_crc32c_sse42.c * Compute CRC-32C checksum using Intel SSE 4.2 instructions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/port/pg_crc32c_sse42_choose.c b/src/port/pg_crc32c_sse42_choose.c index 41ff4a35ad326..56d600f3a932b 100644 --- a/src/port/pg_crc32c_sse42_choose.c +++ b/src/port/pg_crc32c_sse42_choose.c @@ -8,7 +8,7 @@ * computation. Otherwise, fall back to the pure software implementation * (slicing-by-8). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/port/pg_popcount_avx512.c b/src/port/pg_popcount_avx512.c new file mode 100644 index 0000000000000..9d3149e2d002b --- /dev/null +++ b/src/port/pg_popcount_avx512.c @@ -0,0 +1,141 @@ +/*------------------------------------------------------------------------- + * + * pg_popcount_avx512.c + * Holds the AVX-512 pg_popcount() implementation. + * + * Copyright (c) 2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/port/pg_popcount_avx512.c + * + *------------------------------------------------------------------------- + */ +#include "c.h" + +#include + +#include "port/pg_bitutils.h" + +/* + * It's probably unlikely that TRY_POPCNT_FAST won't be set if we are able to + * use AVX-512 intrinsics, but we check it anyway to be sure. We piggy-back on + * the function pointers that are only used when TRY_POPCNT_FAST is set. + */ +#ifdef TRY_POPCNT_FAST + +/* + * pg_popcount_avx512 + * Returns the number of 1-bits in buf + */ +uint64 +pg_popcount_avx512(const char *buf, int bytes) +{ + __m512i val, + cnt; + __m512i accum = _mm512_setzero_si512(); + const char *final; + int tail_idx; + __mmask64 mask = ~UINT64CONST(0); + + /* + * Align buffer down to avoid double load overhead from unaligned access. + * Calculate a mask to ignore preceding bytes. Find start offset of final + * iteration and ensure it is not empty. + */ + mask <<= ((uintptr_t) buf) % sizeof(__m512i); + tail_idx = (((uintptr_t) buf + bytes - 1) % sizeof(__m512i)) + 1; + final = (const char *) TYPEALIGN_DOWN(sizeof(__m512i), buf + bytes - 1); + buf = (const char *) TYPEALIGN_DOWN(sizeof(__m512i), buf); + + /* + * Iterate through all but the final iteration. Starting from the second + * iteration, the mask is ignored. + */ + if (buf < final) + { + val = _mm512_maskz_loadu_epi8(mask, (const __m512i *) buf); + cnt = _mm512_popcnt_epi64(val); + accum = _mm512_add_epi64(accum, cnt); + + buf += sizeof(__m512i); + mask = ~UINT64CONST(0); + + for (; buf < final; buf += sizeof(__m512i)) + { + val = _mm512_load_si512((const __m512i *) buf); + cnt = _mm512_popcnt_epi64(val); + accum = _mm512_add_epi64(accum, cnt); + } + } + + /* Final iteration needs to ignore bytes that are not within the length */ + mask &= (~UINT64CONST(0) >> (sizeof(__m512i) - tail_idx)); + + val = _mm512_maskz_loadu_epi8(mask, (const __m512i *) buf); + cnt = _mm512_popcnt_epi64(val); + accum = _mm512_add_epi64(accum, cnt); + + return _mm512_reduce_add_epi64(accum); +} + +/* + * pg_popcount_masked_avx512 + * Returns the number of 1-bits in buf after applying the mask to each byte + */ +uint64 +pg_popcount_masked_avx512(const char *buf, int bytes, bits8 mask) +{ + __m512i val, + vmasked, + cnt; + __m512i accum = _mm512_setzero_si512(); + const char *final; + int tail_idx; + __mmask64 bmask = ~UINT64CONST(0); + const __m512i maskv = _mm512_set1_epi8(mask); + + /* + * Align buffer down to avoid double load overhead from unaligned access. + * Calculate a mask to ignore preceding bytes. Find start offset of final + * iteration and ensure it is not empty. + */ + bmask <<= ((uintptr_t) buf) % sizeof(__m512i); + tail_idx = (((uintptr_t) buf + bytes - 1) % sizeof(__m512i)) + 1; + final = (const char *) TYPEALIGN_DOWN(sizeof(__m512i), buf + bytes - 1); + buf = (const char *) TYPEALIGN_DOWN(sizeof(__m512i), buf); + + /* + * Iterate through all but the final iteration. Starting from the second + * iteration, the mask is ignored. + */ + if (buf < final) + { + val = _mm512_maskz_loadu_epi8(bmask, (const __m512i *) buf); + vmasked = _mm512_and_si512(val, maskv); + cnt = _mm512_popcnt_epi64(vmasked); + accum = _mm512_add_epi64(accum, cnt); + + buf += sizeof(__m512i); + bmask = ~UINT64CONST(0); + + for (; buf < final; buf += sizeof(__m512i)) + { + val = _mm512_load_si512((const __m512i *) buf); + vmasked = _mm512_and_si512(val, maskv); + cnt = _mm512_popcnt_epi64(vmasked); + accum = _mm512_add_epi64(accum, cnt); + } + } + + /* Final iteration needs to ignore bytes that are not within the length */ + bmask &= (~UINT64CONST(0) >> (sizeof(__m512i) - tail_idx)); + + val = _mm512_maskz_loadu_epi8(bmask, (const __m512i *) buf); + vmasked = _mm512_and_si512(val, maskv); + cnt = _mm512_popcnt_epi64(vmasked); + accum = _mm512_add_epi64(accum, cnt); + + return _mm512_reduce_add_epi64(accum); +} + +#endif /* TRY_POPCNT_FAST */ diff --git a/src/port/pg_popcount_avx512_choose.c b/src/port/pg_popcount_avx512_choose.c new file mode 100644 index 0000000000000..b37107803a8c3 --- /dev/null +++ b/src/port/pg_popcount_avx512_choose.c @@ -0,0 +1,102 @@ +/*------------------------------------------------------------------------- + * + * pg_popcount_avx512_choose.c + * Test whether we can use the AVX-512 pg_popcount() implementation. + * + * Copyright (c) 2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/port/pg_popcount_avx512_choose.c + * + *------------------------------------------------------------------------- + */ +#include "c.h" + +#if defined(HAVE__GET_CPUID) || defined(HAVE__GET_CPUID_COUNT) +#include +#endif + +#ifdef HAVE_XSAVE_INTRINSICS +#include +#endif + +#if defined(HAVE__CPUID) || defined(HAVE__CPUIDEX) +#include +#endif + +#include "port/pg_bitutils.h" + +/* + * It's probably unlikely that TRY_POPCNT_FAST won't be set if we are able to + * use AVX-512 intrinsics, but we check it anyway to be sure. We piggy-back on + * the function pointers that are only used when TRY_POPCNT_FAST is set. + */ +#ifdef TRY_POPCNT_FAST + +/* + * Does CPUID say there's support for XSAVE instructions? + */ +static inline bool +xsave_available(void) +{ + unsigned int exx[4] = {0, 0, 0, 0}; + +#if defined(HAVE__GET_CPUID) + __get_cpuid(1, &exx[0], &exx[1], &exx[2], &exx[3]); +#elif defined(HAVE__CPUID) + __cpuid(exx, 1); +#else +#error cpuid instruction not available +#endif + return (exx[2] & (1 << 27)) != 0; /* osxsave */ +} + +/* + * Does XGETBV say the ZMM registers are enabled? + * + * NB: Caller is responsible for verifying that xsave_available() returns true + * before calling this. + */ +static inline bool +zmm_regs_available(void) +{ +#ifdef HAVE_XSAVE_INTRINSICS + return (_xgetbv(0) & 0xe6) == 0xe6; +#else + return false; +#endif +} + +/* + * Does CPUID say there's support for AVX-512 popcount and byte-and-word + * instructions? + */ +static inline bool +avx512_popcnt_available(void) +{ + unsigned int exx[4] = {0, 0, 0, 0}; + +#if defined(HAVE__GET_CPUID_COUNT) + __get_cpuid_count(7, 0, &exx[0], &exx[1], &exx[2], &exx[3]); +#elif defined(HAVE__CPUIDEX) + __cpuidex(exx, 7, 0); +#else +#error cpuid instruction not available +#endif + return (exx[2] & (1 << 14)) != 0 && /* avx512-vpopcntdq */ + (exx[1] & (1 << 30)) != 0; /* avx512-bw */ +} + +/* + * Returns true if the CPU supports the instructions required for the AVX-512 + * pg_popcount() implementation. + */ +bool +pg_popcount_avx512_available(void) +{ + return xsave_available() && + zmm_regs_available() && + avx512_popcnt_available(); +} + +#endif /* TRY_POPCNT_FAST */ diff --git a/src/port/pg_strong_random.c b/src/port/pg_strong_random.c index 862c84aa6f309..5f2b248425282 100644 --- a/src/port/pg_strong_random.c +++ b/src/port/pg_strong_random.c @@ -10,7 +10,7 @@ * therefore, even when built for backend, it cannot rely on backend * infrastructure such as elog() or palloc(). * - * Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/pg_strong_random.c diff --git a/src/port/pgcheckdir.c b/src/port/pgcheckdir.c index 94aa40ca8f171..8fa347b4e0e96 100644 --- a/src/port/pgcheckdir.c +++ b/src/port/pgcheckdir.c @@ -5,7 +5,7 @@ * A simple subroutine to check whether a directory exists and is empty or not. * Useful in both initdb and the backend. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/port/pgsleep.c b/src/port/pgsleep.c index a1bcd78e4b2cf..1284458bfce3a 100644 --- a/src/port/pgsleep.c +++ b/src/port/pgsleep.c @@ -4,7 +4,7 @@ * Portable delay handling. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/port/pgsleep.c * diff --git a/src/port/pgstrcasecmp.c b/src/port/pgstrcasecmp.c index 27c1546f6faa1..60b3137e45a08 100644 --- a/src/port/pgstrcasecmp.c +++ b/src/port/pgstrcasecmp.c @@ -18,7 +18,7 @@ * C library thinks the locale is. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/port/pgstrcasecmp.c * diff --git a/src/port/pgstrsignal.c b/src/port/pgstrsignal.c index 7d76d1cca90c0..bd4add8249f3c 100644 --- a/src/port/pgstrsignal.c +++ b/src/port/pgstrsignal.c @@ -6,10 +6,7 @@ * On platforms compliant with modern POSIX, this just wraps strsignal(3). * Elsewhere, we do the best we can. * - * This file is not currently built in MSVC builds, since it's useless - * on non-Unix platforms. - * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/port/pqsignal.c b/src/port/pqsignal.c index 83d876db6ca03..9dadce8357dca 100644 --- a/src/port/pqsignal.c +++ b/src/port/pqsignal.c @@ -4,23 +4,41 @@ * reliable BSD-style signal(2) routine stolen from RWW who stole it * from Stevens... * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION * src/port/pqsignal.c * - * We now assume that all Unix-oid systems have POSIX sigaction(2) - * with support for restartable signals (SA_RESTART). We used to also - * support BSD-style signal(2), but there really shouldn't be anything - * out there anymore that doesn't have the POSIX API. + * This is the signal() implementation from "Advanced Programming in the UNIX + * Environment", with minor changes. It was originally a replacement needed + * for old SVR4 systems whose signal() behaved as if sa_flags = SA_RESETHAND | + * SA_NODEFER, also known as "unreliable" signals due to races when the + * handler was reset. + * + * By now, all known modern Unix systems have a "reliable" signal() call. + * We still don't want to use it though, because it remains + * implementation-defined by both C99 and POSIX whether the handler is reset + * or signals are blocked when the handler runs, and default restart behavior + * is also unspecified. Therefore we take POSIX's advice and call sigaction() + * so we can provide explicit sa_flags, but wrap it in this more convenient + * traditional interface style. It also provides a place to set any extra + * flags we want everywhere, such as SA_NOCLDSTOP. * * Windows, of course, is resolutely in a class by itself. In the backend, - * we don't use this file at all; src/backend/port/win32/signal.c provides - * pqsignal() for the backend environment. Frontend programs can use - * this version of pqsignal() if they wish, but beware that this does - * not provide restartable signals on Windows. + * this relies on pqsigaction() in src/backend/port/win32/signal.c, which + * provides limited emulation of reliable signals. + * + * Frontend programs can use this version of pqsignal() to forward to the + * native Windows signal() call if they wish, but beware that Windows signals + * behave quite differently. Only the 6 signals required by C are supported. + * SIGINT handlers run in another thread instead of interrupting an existing + * thread, and the others don't interrupt system calls either, so SA_RESTART + * is moot. All except SIGFPE have SA_RESETHAND semantics, meaning the + * handler is reset to SIG_DFL each time it runs. The set of things you are + * allowed to do in a handler is also much more restricted than on Unix, + * according to the documentation. * * ------------------------------------------------------------------------ */ @@ -28,23 +46,112 @@ #include "c.h" #include +#ifndef FRONTEND +#include +#endif #ifndef FRONTEND #include "libpq/pqsignal.h" +#include "miscadmin.h" #endif +#ifdef PG_SIGNAL_COUNT /* Windows */ +#define PG_NSIG (PG_SIGNAL_COUNT) +#elif defined(NSIG) +#define PG_NSIG (NSIG) +#else +#define PG_NSIG (64) /* XXX: wild guess */ +#endif + +/* Check a couple of common signals to make sure PG_NSIG is accurate. */ +StaticAssertDecl(SIGUSR2 < PG_NSIG, "SIGUSR2 >= PG_NSIG"); +StaticAssertDecl(SIGHUP < PG_NSIG, "SIGHUP >= PG_NSIG"); +StaticAssertDecl(SIGTERM < PG_NSIG, "SIGTERM >= PG_NSIG"); +StaticAssertDecl(SIGALRM < PG_NSIG, "SIGALRM >= PG_NSIG"); + +static volatile pqsigfunc pqsignal_handlers[PG_NSIG]; + +/* + * Except when called with SIG_IGN or SIG_DFL, pqsignal() sets up this function + * as the handler for all signals. This wrapper handler function checks that + * it is called within a process that knew to maintain MyProcPid, and not a + * child process forked by system(3), etc. This check ensures that such child + * processes do not modify shared memory, which is often detrimental. If the + * check succeeds, the function originally provided to pqsignal() is called. + * Otherwise, the default signal handler is installed and then called. + * + * This wrapper also handles restoring the value of errno. + */ +static void +wrapper_handler(SIGNAL_ARGS) +{ + int save_errno = errno; + + Assert(postgres_signal_arg > 0); + Assert(postgres_signal_arg < PG_NSIG); + +#ifndef FRONTEND + + /* + * We expect processes to set MyProcPid before calling pqsignal() or + * before accepting signals. + */ + Assert(MyProcPid); + Assert(MyProcPid != PostmasterPid || !IsUnderPostmaster); + + if (unlikely(MyProcPid != (int) getpid())) + { + pqsignal(postgres_signal_arg, SIG_DFL); + raise(postgres_signal_arg); + return; + } +#endif + + (*pqsignal_handlers[postgres_signal_arg]) (postgres_signal_arg); + + errno = save_errno; +} + /* * Set up a signal handler, with SA_RESTART, for signal "signo" * * Returns the previous handler. + * + * NB: If called within a signal handler, race conditions may lead to bogus + * return values. You should either avoid calling this within signal handlers + * or ignore the return value. + * + * XXX: Since no in-tree callers use the return value, and there is little + * reason to do so, it would be nice if we could convert this to a void + * function instead of providing potentially-bogus return values. + * Unfortunately, that requires modifying the pqsignal() in legacy-pqsignal.c, + * which in turn requires an SONAME bump, which is probably not worth it. + * + * Note: the actual name of this function is either pqsignal_fe when + * compiled with -DFRONTEND, or pqsignal when compiled without that. + * This is to avoid a name collision with libpq's legacy-pqsignal.c. */ pqsigfunc pqsignal(int signo, pqsigfunc func) { + pqsigfunc orig_func = pqsignal_handlers[signo]; /* assumed atomic */ #if !(defined(WIN32) && defined(FRONTEND)) struct sigaction act, oact; +#else + pqsigfunc ret; +#endif + Assert(signo > 0); + Assert(signo < PG_NSIG); + + if (func != SIG_IGN && func != SIG_DFL) + { + pqsignal_handlers[signo] = func; /* assumed atomic */ + func = wrapper_handler; + } + +#if !(defined(WIN32) && defined(FRONTEND)) act.sa_handler = func; sigemptyset(&act.sa_mask); act.sa_flags = SA_RESTART; @@ -54,9 +161,15 @@ pqsignal(int signo, pqsigfunc func) #endif if (sigaction(signo, &act, &oact) < 0) return SIG_ERR; - return oact.sa_handler; + else if (oact.sa_handler == wrapper_handler) + return orig_func; + else + return oact.sa_handler; #else /* Forward to Windows native signal system. */ - return signal(signo, func); + if ((ret = signal(signo, func)) == wrapper_handler) + return orig_func; + else + return ret; #endif } diff --git a/src/port/preadv.c b/src/port/preadv.c deleted file mode 100644 index e762283e67604..0000000000000 --- a/src/port/preadv.c +++ /dev/null @@ -1,43 +0,0 @@ -/*------------------------------------------------------------------------- - * - * preadv.c - * Implementation of preadv(2) for platforms that lack one. - * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group - * - * IDENTIFICATION - * src/port/preadv.c - * - *------------------------------------------------------------------------- - */ - - -#include "c.h" - -#include - -#include "port/pg_iovec.h" - -ssize_t -pg_preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset) -{ - ssize_t sum = 0; - ssize_t part; - - for (int i = 0; i < iovcnt; ++i) - { - part = pg_pread(fd, iov[i].iov_base, iov[i].iov_len, offset); - if (part < 0) - { - if (i == 0) - return -1; - else - return sum; - } - sum += part; - offset += part; - if (part < iov[i].iov_len) - return sum; - } - return sum; -} diff --git a/src/port/pthread-win32.h b/src/port/pthread-win32.h index 97ccc17a1263c..5f33269057c5a 100644 --- a/src/port/pthread-win32.h +++ b/src/port/pthread-win32.h @@ -5,7 +5,16 @@ #define __PTHREAD_H typedef ULONG pthread_key_t; -typedef CRITICAL_SECTION *pthread_mutex_t; + +typedef struct pthread_mutex_t +{ + /* initstate = 0: not initialized; 1: init done; 2: init in progress */ + LONG initstate; + CRITICAL_SECTION csection; +} pthread_mutex_t; + +#define PTHREAD_MUTEX_INITIALIZER { 0 } + typedef int pthread_once_t; DWORD pthread_self(void); diff --git a/src/port/pthread_barrier_wait.c b/src/port/pthread_barrier_wait.c index 8d3cdb9de6b7c..835dbf1c7afb5 100644 --- a/src/port/pthread_barrier_wait.c +++ b/src/port/pthread_barrier_wait.c @@ -3,7 +3,7 @@ * pthread_barrier_wait.c * Implementation of pthread_barrier_t support for platforms lacking it. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/pthread_barrier_wait.c diff --git a/src/port/pwritev.c b/src/port/pwritev.c deleted file mode 100644 index 519de450374ab..0000000000000 --- a/src/port/pwritev.c +++ /dev/null @@ -1,43 +0,0 @@ -/*------------------------------------------------------------------------- - * - * pwritev.c - * Implementation of pwritev(2) for platforms that lack one. - * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group - * - * IDENTIFICATION - * src/port/pwritev.c - * - *------------------------------------------------------------------------- - */ - - -#include "c.h" - -#include - -#include "port/pg_iovec.h" - -ssize_t -pg_pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset) -{ - ssize_t sum = 0; - ssize_t part; - - for (int i = 0; i < iovcnt; ++i) - { - part = pg_pwrite(fd, iov[i].iov_base, iov[i].iov_len, offset); - if (part < 0) - { - if (i == 0) - return -1; - else - return sum; - } - sum += part; - offset += part; - if (part < iov[i].iov_len) - return sum; - } - return sum; -} diff --git a/src/port/quotes.c b/src/port/quotes.c index a80e88d69bfd2..e75dfa5924076 100644 --- a/src/port/quotes.c +++ b/src/port/quotes.c @@ -3,7 +3,7 @@ * quotes.c * string quoting and escaping functions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/port/snprintf.c b/src/port/snprintf.c index e3e316e04981e..14fb1783866c5 100644 --- a/src/port/snprintf.c +++ b/src/port/snprintf.c @@ -2,7 +2,7 @@ * Copyright (c) 1983, 1995, 1996 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -338,13 +338,22 @@ static void leading_pad(int zpad, int signvalue, int *padlen, static void trailing_pad(int padlen, PrintfTarget *target); /* - * If strchrnul exists (it's a glibc-ism), it's a good bit faster than the - * equivalent manual loop. If it doesn't exist, provide a replacement. + * If strchrnul exists (it's a glibc-ism, but since adopted by some other + * platforms), it's a good bit faster than the equivalent manual loop. + * Use it if possible, and if it doesn't exist, use this replacement. * * Note: glibc declares this as returning "char *", but that would require * casting away const internally, so we don't follow that detail. + * + * Note: macOS has this too as of Sequoia 15.4, but it's hidden behind + * a deployment-target check that causes compile errors if the deployment + * target isn't high enough. So !HAVE_DECL_STRCHRNUL may mean "yes it's + * declared, but it doesn't compile". To avoid failing in that scenario, + * use a macro to avoid matching 's name. */ -#ifndef HAVE_STRCHRNUL +#if !HAVE_DECL_STRCHRNUL + +#define strchrnul pg_strchrnul static inline const char * strchrnul(const char *s, int c) @@ -354,19 +363,7 @@ strchrnul(const char *s, int c) return s; } -#else - -/* - * glibc's declares strchrnul only if _GNU_SOURCE is defined. - * While we typically use that on glibc platforms, configure will set - * HAVE_STRCHRNUL whether it's used or not. Fill in the missing declaration - * so that this file will compile cleanly with or without _GNU_SOURCE. - */ -#ifndef _GNU_SOURCE -extern char *strchrnul(const char *s, int c); -#endif - -#endif /* HAVE_STRCHRNUL */ +#endif /* !HAVE_DECL_STRCHRNUL */ /* diff --git a/src/port/strerror.c b/src/port/strerror.c index 26827d6db4663..4918ba821c12e 100644 --- a/src/port/strerror.c +++ b/src/port/strerror.c @@ -3,7 +3,7 @@ * strerror.c * Replacements for standard strerror() and strerror_r() functions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -214,10 +214,8 @@ get_errno_symbol(int errnum) return "ENOTCONN"; case ENOTDIR: return "ENOTDIR"; -#if defined(ENOTEMPTY) && (ENOTEMPTY != EEXIST) /* same code on AIX */ case ENOTEMPTY: return "ENOTEMPTY"; -#endif case ENOTSOCK: return "ENOTSOCK"; #ifdef ENOTSUP diff --git a/src/port/strlcpy.c b/src/port/strlcpy.c index 71b794e995e59..268c91de8f20f 100644 --- a/src/port/strlcpy.c +++ b/src/port/strlcpy.c @@ -3,7 +3,7 @@ * strlcpy.c * strncpy done right * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/port/strnlen.c b/src/port/strnlen.c index 92d2575aed045..f635f03e3be61 100644 --- a/src/port/strnlen.c +++ b/src/port/strnlen.c @@ -4,7 +4,7 @@ * Fallback implementation of strnlen(). * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/port/strtof.c b/src/port/strtof.c index fea45a8bdc1c1..43d88f8f802b8 100644 --- a/src/port/strtof.c +++ b/src/port/strtof.c @@ -2,7 +2,7 @@ * * strtof.c * - * Portions Copyright (c) 2019-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2019-2024, PostgreSQL Global Development Group * * * IDENTIFICATION @@ -31,15 +31,18 @@ pg_strtof(const char *nptr, char **endptr) { int caller_errno = errno; float fresult; + char *myendptr; errno = 0; - fresult = (strtof) (nptr, endptr); + fresult = (strtof) (nptr, &myendptr); + if (endptr) + *endptr = myendptr; if (errno) { /* On error, just return the error to the caller. */ return fresult; } - else if ((*endptr == nptr) || isnan(fresult) || + else if ((myendptr == nptr) || isnan(fresult) || ((fresult >= FLT_MIN || fresult <= -FLT_MIN) && !isinf(fresult))) { /* @@ -53,7 +56,8 @@ pg_strtof(const char *nptr, char **endptr) else { /* - * Try again. errno is already 0 here. + * Try again. errno is already 0 here, and we assume that the endptr + * won't be any different. */ double dresult = strtod(nptr, NULL); diff --git a/src/port/system.c b/src/port/system.c index b6d13694fedad..6877c4edd8407 100644 --- a/src/port/system.c +++ b/src/port/system.c @@ -29,7 +29,7 @@ * quote character on the command line, preserving any text after the last * quote character. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/port/system.c * diff --git a/src/port/tar.c b/src/port/tar.c index 4afe9f2533482..592b4fb7b0f4e 100644 --- a/src/port/tar.c +++ b/src/port/tar.c @@ -120,10 +120,10 @@ tarCreateHeader(char *h, const char *filename, const char *linktarget, if (linktarget && strlen(linktarget) > 99) return TAR_SYMLINK_TOO_LONG; - memset(h, 0, 512); /* assume tar header size */ + memset(h, 0, TAR_BLOCK_SIZE); /* Name 100 */ - strlcpy(&h[0], filename, 100); + strlcpy(&h[TAR_OFFSET_NAME], filename, 100); if (linktarget != NULL || S_ISDIR(mode)) { /* @@ -139,68 +139,68 @@ tarCreateHeader(char *h, const char *filename, const char *linktarget, } /* Mode 8 - this doesn't include the file type bits (S_IFMT) */ - print_tar_number(&h[100], 8, (mode & 07777)); + print_tar_number(&h[TAR_OFFSET_MODE], 8, (mode & 07777)); /* User ID 8 */ - print_tar_number(&h[108], 8, uid); + print_tar_number(&h[TAR_OFFSET_UID], 8, uid); /* Group 8 */ - print_tar_number(&h[116], 8, gid); + print_tar_number(&h[TAR_OFFSET_GID], 8, gid); /* File size 12 */ if (linktarget != NULL || S_ISDIR(mode)) /* Symbolic link or directory has size zero */ - print_tar_number(&h[124], 12, 0); + print_tar_number(&h[TAR_OFFSET_SIZE], 12, 0); else - print_tar_number(&h[124], 12, size); + print_tar_number(&h[TAR_OFFSET_SIZE], 12, size); /* Mod Time 12 */ - print_tar_number(&h[136], 12, mtime); + print_tar_number(&h[TAR_OFFSET_MTIME], 12, mtime); /* Checksum 8 cannot be calculated until we've filled all other fields */ if (linktarget != NULL) { /* Type - Symbolic link */ - h[156] = '2'; + h[TAR_OFFSET_TYPEFLAG] = TAR_FILETYPE_SYMLINK; /* Link Name 100 */ - strlcpy(&h[157], linktarget, 100); + strlcpy(&h[TAR_OFFSET_LINKNAME], linktarget, 100); } else if (S_ISDIR(mode)) { /* Type - directory */ - h[156] = '5'; + h[TAR_OFFSET_TYPEFLAG] = TAR_FILETYPE_DIRECTORY; } else { /* Type - regular file */ - h[156] = '0'; + h[TAR_OFFSET_TYPEFLAG] = TAR_FILETYPE_PLAIN; } /* Magic 6 */ - strcpy(&h[257], "ustar"); + strcpy(&h[TAR_OFFSET_MAGIC], "ustar"); /* Version 2 */ - memcpy(&h[263], "00", 2); + memcpy(&h[TAR_OFFSET_VERSION], "00", 2); /* User 32 */ /* XXX: Do we need to care about setting correct username? */ - strlcpy(&h[265], "postgres", 32); + strlcpy(&h[TAR_OFFSET_UNAME], "postgres", 32); /* Group 32 */ /* XXX: Do we need to care about setting correct group name? */ - strlcpy(&h[297], "postgres", 32); + strlcpy(&h[TAR_OFFSET_GNAME], "postgres", 32); /* Major Dev 8 */ - print_tar_number(&h[329], 8, 0); + print_tar_number(&h[TAR_OFFSET_DEVMAJOR], 8, 0); /* Minor Dev 8 */ - print_tar_number(&h[337], 8, 0); + print_tar_number(&h[TAR_OFFSET_DEVMINOR], 8, 0); /* Prefix 155 - not used, leave as nulls */ /* Finally, compute and insert the checksum */ - print_tar_number(&h[148], 8, tarChecksum(h)); + print_tar_number(&h[TAR_OFFSET_CHECKSUM], 8, tarChecksum(h)); return TAR_OK; } diff --git a/src/port/thread.c b/src/port/user.c similarity index 85% rename from src/port/thread.c rename to src/port/user.c index 375c89b2974ed..7444aeb64b287 100644 --- a/src/port/thread.c +++ b/src/port/user.c @@ -1,13 +1,12 @@ /*------------------------------------------------------------------------- * - * thread.c + * user.c * - * Prototypes and macros around system calls, used to help make - * threaded libraries reentrant and safe to use from threaded applications. + * Wrapper functions for user and home directory lookup. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * - * src/port/thread.c + * src/port/user.c * *------------------------------------------------------------------------- */ @@ -16,12 +15,6 @@ #include - -/* - * Historically, the code in this module had to deal with operating systems - * that lacked getpwuid_r(). - */ - #ifndef WIN32 /* diff --git a/src/port/win32common.c b/src/port/win32common.c index 2fd78f7f93664..dc83396236d7d 100644 --- a/src/port/win32common.c +++ b/src/port/win32common.c @@ -3,7 +3,7 @@ * win32common.c * Common routines shared among the win32*.c ports. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -19,8 +19,6 @@ #include "postgres.h" #endif -#ifdef WIN32 - /* * pgwin32_get_file_type * @@ -64,5 +62,3 @@ pgwin32_get_file_type(HANDLE hFile) return fileType; } - -#endif /* WIN32 */ diff --git a/src/port/win32dlopen.c b/src/port/win32dlopen.c index da82c86fc54eb..11823bbae0f26 100644 --- a/src/port/win32dlopen.c +++ b/src/port/win32dlopen.c @@ -3,7 +3,7 @@ * win32dlopen.c * dynamic loader for Windows * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/port/win32env.c b/src/port/win32env.c index fbc6eddef22cc..fdc5537fb4e9c 100644 --- a/src/port/win32env.c +++ b/src/port/win32env.c @@ -6,7 +6,7 @@ * These functions update both the process environment and caches in * (potentially multiple) C run-time library (CRT) versions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/port/win32error.c b/src/port/win32error.c index d7c3048eba6e1..a7cd6fb4e0260 100644 --- a/src/port/win32error.c +++ b/src/port/win32error.c @@ -3,7 +3,7 @@ * win32error.c * Map win32 error codes to errno values * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/win32error.c diff --git a/src/port/win32fdatasync.c b/src/port/win32fdatasync.c index ad038808a0ad0..1cf9c15955153 100644 --- a/src/port/win32fdatasync.c +++ b/src/port/win32fdatasync.c @@ -4,7 +4,7 @@ * Win32 fdatasync() replacement * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * src/port/win32fdatasync.c * diff --git a/src/port/win32fseek.c b/src/port/win32fseek.c index 985313c825fee..9ae3653e812e5 100644 --- a/src/port/win32fseek.c +++ b/src/port/win32fseek.c @@ -3,7 +3,7 @@ * win32fseek.c * Replacements for fseeko() and ftello(). * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/win32fseek.c @@ -17,7 +17,7 @@ #include "postgres.h" #endif -#if defined(WIN32) && defined(_MSC_VER) +#ifdef _MSC_VER /* * _pgfseeko64 @@ -72,4 +72,4 @@ _pgftello64(FILE *stream) return -1; } -#endif /* defined(WIN32) && defined(_MSC_VER) */ +#endif /* _MSC_VER */ diff --git a/src/port/win32gai_strerror.c b/src/port/win32gai_strerror.c new file mode 100644 index 0000000000000..5b47d1722df34 --- /dev/null +++ b/src/port/win32gai_strerror.c @@ -0,0 +1,45 @@ +/*------------------------------------------------------------------------- + * + * win32gai_strerror.c + * Thread-safe gai_strerror() for Windows. + * + * Portions Copyright (c) 2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/port/win32gai_strerror.c + * + *------------------------------------------------------------------------- + */ + +#include + +/* + * Windows has gai_strerrorA(), but it is not thread-safe so we avoid it. + * + * https://learn.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-gai_strerrora + */ +const char * +gai_strerror(int errcode) +{ + switch (errcode) + { + case EAI_AGAIN: + return "Temporary failure in name resolution"; + case EAI_BADFLAGS: + return "Bad value for ai_flags"; + case EAI_FAIL: + return "Non-recoverable failure in name resolution"; + case EAI_FAMILY: + return "ai_family not supported"; + case EAI_MEMORY: + return "Memory allocation failure"; + case EAI_NONAME: + return "Name or service not known"; + case EAI_SERVICE: + return "Servname not supported for ai_socktype"; + case EAI_SOCKTYPE: + return "ai_socktype not supported"; + default: + return "Unknown server error"; + } +} diff --git a/src/port/win32getrusage.c b/src/port/win32getrusage.c index ce28b9ba6fea0..a2cf1828fb9e5 100644 --- a/src/port/win32getrusage.c +++ b/src/port/win32getrusage.c @@ -3,7 +3,7 @@ * win32getrusage.c * get information about resource utilisation * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/port/win32link.c b/src/port/win32link.c index d1442ee03d5fa..b9fe89eb6cd94 100644 --- a/src/port/win32link.c +++ b/src/port/win32link.c @@ -2,7 +2,7 @@ * * win32link.c * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/port/win32ntdll.c b/src/port/win32ntdll.c index 3b38cdb34c91e..bf8bce7f1a130 100644 --- a/src/port/win32ntdll.c +++ b/src/port/win32ntdll.c @@ -3,7 +3,7 @@ * win32ntdll.c * Dynamically loaded Windows NT functions. * - * Portions Copyright (c) 2021-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 2021-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/port/win32pread.c b/src/port/win32pread.c index 905cf9f42b4f2..2d022e6d3784e 100644 --- a/src/port/win32pread.c +++ b/src/port/win32pread.c @@ -3,7 +3,7 @@ * win32pread.c * Implementation of pread(2) for Windows. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/win32pread.c @@ -30,6 +30,9 @@ pg_pread(int fd, void *buf, size_t size, off_t offset) return -1; } + /* Avoid overflowing DWORD. */ + size = Min(size, 1024 * 1024 * 1024); + /* Note that this changes the file position, despite not using it. */ overlapped.Offset = offset; if (!ReadFile(handle, buf, size, &result, &overlapped)) diff --git a/src/port/win32pwrite.c b/src/port/win32pwrite.c index 5dd10821cfbbc..b37bb2f92e0ab 100644 --- a/src/port/win32pwrite.c +++ b/src/port/win32pwrite.c @@ -3,7 +3,7 @@ * win32pwrite.c * Implementation of pwrite(2) for Windows. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/win32pwrite.c @@ -30,6 +30,9 @@ pg_pwrite(int fd, const void *buf, size_t size, off_t offset) return -1; } + /* Avoid overflowing DWORD. */ + size = Min(size, 1024 * 1024 * 1024); + /* Note that this changes the file position, despite not using it. */ overlapped.Offset = offset; if (!WriteFile(handle, buf, size, &result, &overlapped)) diff --git a/src/port/win32security.c b/src/port/win32security.c index 4d9d28c0d7f28..bca62ab2fba8d 100644 --- a/src/port/win32security.c +++ b/src/port/win32security.c @@ -3,7 +3,7 @@ * win32security.c * Microsoft Windows Win32 Security Support Functions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/win32security.c diff --git a/src/port/win32setlocale.c b/src/port/win32setlocale.c index e2c85b0048c0e..9e2ab8cc3ad01 100644 --- a/src/port/win32setlocale.c +++ b/src/port/win32setlocale.c @@ -3,7 +3,7 @@ * win32setlocale.c * Wrapper to work around bugs in Windows setlocale() implementation * - * Copyright (c) 2011-2023, PostgreSQL Global Development Group + * Copyright (c) 2011-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/port/win32setlocale.c diff --git a/src/port/win32stat.c b/src/port/win32stat.c index aa3a0c174e118..7ab35024af3e0 100644 --- a/src/port/win32stat.c +++ b/src/port/win32stat.c @@ -3,7 +3,7 @@ * win32stat.c * Replacements for functions using GetFileInformationByHandle * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -13,8 +13,6 @@ *------------------------------------------------------------------------- */ -#ifdef WIN32 - #include "c.h" #include "port/win32ntdll.h" @@ -302,5 +300,3 @@ _pgfstat64(int fileno, struct stat *buf) buf->st_nlink = 1; return 0; } - -#endif /* WIN32 */ diff --git a/src/port/win32ver.rc b/src/port/win32ver.rc index 05237f19443b0..31f8fc2e5d913 100644 --- a/src/port/win32ver.rc +++ b/src/port/win32ver.rc @@ -20,7 +20,7 @@ BEGIN VALUE "FileDescription", FILEDESC VALUE "FileVersion", PG_VERSION VALUE "InternalName", _INTERNAL_NAME_ - VALUE "LegalCopyright", "Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group. Portions Copyright (c) 1994, Regents of the University of California." + VALUE "LegalCopyright", "Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group. Portions Copyright (c) 1994, Regents of the University of California." VALUE "OriginalFileName", _ORIGINAL_NAME_ VALUE "ProductName", "PostgreSQL" VALUE "ProductVersion", PG_VERSION diff --git a/src/template/aix b/src/template/aix deleted file mode 100644 index 47fa8990a7cd8..0000000000000 --- a/src/template/aix +++ /dev/null @@ -1,25 +0,0 @@ -# src/template/aix - -# Set default options if using xlc. This formerly included -qsrcmsg, but that -# option elicits internal compiler errors from xlc v16.1.0. Note: configure -# will add -qnoansialias if the compiler accepts it, even if user specifies a -# non-default CFLAGS setting. -if test "$GCC" != yes ; then - case $host_os in - *) - CFLAGS="-O2 -qmaxmem=16384" - ;; - esac - - # Due to a compiler bug, see 20171013023536.GA492146@rfd.leadboat.com for details, - # force restrict not to be used when compiling with xlc. - FORCE_DISABLE_RESTRICT=yes -fi - -# Extra CFLAGS for code that will go into a shared library -CFLAGS_SL="" - -# Native memset() is faster, tested on: -# AIX 5.1 and 5.2, XLC 6.0 (IBM's cc) -# AIX 5.3 ML3, gcc 4.0.1 -MEMSET_LOOP_LIMIT=0 diff --git a/src/test/authentication/Makefile b/src/test/authentication/Makefile index 46fa72052d908..da0b71873abf1 100644 --- a/src/test/authentication/Makefile +++ b/src/test/authentication/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/test/authentication # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/test/authentication/Makefile @@ -19,5 +19,5 @@ check: installcheck: $(prove_installcheck) -clean distclean maintainer-clean: +clean distclean: rm -rf tmp_check diff --git a/src/test/authentication/meson.build b/src/test/authentication/meson.build index e50104178586d..8f5688dcc1392 100644 --- a/src/test/authentication/meson.build +++ b/src/test/authentication/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tests += { 'name': 'authentication', @@ -11,6 +11,7 @@ tests += { 't/003_peer.pl', 't/004_file_inclusion.pl', 't/005_sspi.pl', + 't/006_login_trigger.pl', ], }, } diff --git a/src/test/authentication/t/001_password.pl b/src/test/authentication/t/001_password.pl index 12552837a8ed6..87e180af3d37d 100644 --- a/src/test/authentication/t/001_password.pl +++ b/src/test/authentication/t/001_password.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Set of tests for authentication and pg_hba.conf. The following password # methods are checked through this test: @@ -9,7 +9,7 @@ # This test can only run with Unix-domain sockets. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -66,24 +66,33 @@ sub test_conn $node->append_conf('postgresql.conf', "log_connections = on\n"); $node->start; +# could fail in FIPS mode +my $md5_works = ($node->psql('postgres', "select md5('')") == 0); + # Create 3 roles with different password methods for each one. The same # password is used for all of them. -$node->safe_psql('postgres', - "SET password_encryption='scram-sha-256'; CREATE ROLE scram_role LOGIN PASSWORD 'pass';" -); -$node->safe_psql('postgres', - "SET password_encryption='md5'; CREATE ROLE md5_role LOGIN PASSWORD 'pass';" -); +is( $node->psql( + 'postgres', + "SET password_encryption='scram-sha-256'; CREATE ROLE scram_role LOGIN PASSWORD 'pass';" + ), + 0, + 'created user with SCRAM password'); +is( $node->psql( + 'postgres', + "SET password_encryption='md5'; CREATE ROLE md5_role LOGIN PASSWORD 'pass';" + ), + $md5_works ? 0 : 3, + 'created user with md5 password'); # Set up a table for tests of SYSTEM_USER. $node->safe_psql( 'postgres', "CREATE TABLE sysuser_data (n) AS SELECT NULL FROM generate_series(1, 10); - GRANT ALL ON sysuser_data TO md5_role;"); + GRANT ALL ON sysuser_data TO scram_role;"); $ENV{"PGPASSWORD"} = 'pass'; # Create a role that contains a comma to stress the parsing. $node->safe_psql('postgres', - q{SET password_encryption='md5'; CREATE ROLE "md5,role" LOGIN PASSWORD 'pass';} + q{SET password_encryption='scram-sha-256'; CREATE ROLE "scram,role" LOGIN PASSWORD 'pass';} ); # Create a role with a non-default iteration count @@ -136,13 +145,18 @@ sub test_conn # Create a database to test regular expression. $node->safe_psql('postgres', "CREATE database regex_testdb;"); -# For "trust" method, all users should be able to connect. These users are not -# considered to be authenticated. +# For "trust" method, all users should be able to connect. reset_pg_hba($node, 'all', 'all', 'trust'); test_conn($node, 'user=scram_role', 'trust', 0, - log_unlike => [qr/connection authenticated:/]); -test_conn($node, 'user=md5_role', 'trust', 0, - log_unlike => [qr/connection authenticated:/]); + log_like => + [qr/connection authenticated: user="scram_role" method=trust/]); +SKIP: +{ + skip "MD5 not supported" unless $md5_works; + test_conn($node, 'user=md5_role', 'trust', 0, + log_like => + [qr/connection authenticated: user="md5_role" method=trust/]); +} # SYSTEM_USER is null when not authenticated. $res = $node->safe_psql('postgres', "SELECT SYSTEM_USER IS NULL;"); @@ -157,7 +171,7 @@ sub test_conn SET max_parallel_workers_per_gather TO 2; SELECT bool_and(SYSTEM_USER IS NOT DISTINCT FROM n) FROM sysuser_data;), - connstr => "user=md5_role"); + connstr => "user=scram_role"); is($res, 't', "users with trust authentication use SYSTEM_USER = NULL in parallel workers" ); @@ -275,9 +289,14 @@ sub test_conn test_conn($node, 'user=scram_role', 'password', 0, log_like => [qr/connection authenticated: identity="scram_role" method=password/]); -test_conn($node, 'user=md5_role', 'password', 0, - log_like => - [qr/connection authenticated: identity="md5_role" method=password/]); +SKIP: +{ + skip "MD5 not supported" unless $md5_works; + test_conn($node, 'user=md5_role', 'password', 0, + log_like => + [qr/connection authenticated: identity="md5_role" method=password/] + ); +} # require_auth succeeds here with a plaintext password. $node->connect_ok("user=scram_role require_auth=password", @@ -393,59 +412,64 @@ sub test_conn test_conn($node, 'user=scram_role', 'md5', 0, log_like => [qr/connection authenticated: identity="scram_role" method=md5/]); -test_conn($node, 'user=md5_role', 'md5', 0, - log_like => - [qr/connection authenticated: identity="md5_role" method=md5/]); +SKIP: +{ + skip "MD5 not supported" unless $md5_works; + test_conn($node, 'user=md5_role', 'md5', 0, + log_like => + [qr/connection authenticated: identity="md5_role" method=md5/]); +} -# require_auth succeeds with MD5 required. -$node->connect_ok("user=md5_role require_auth=md5", - "MD5 authentication required, works with MD5 auth"); -$node->connect_ok("user=md5_role require_auth=!none", - "any authentication required, works with MD5 auth"); +# require_auth succeeds with SCRAM required. +$node->connect_ok( + "user=scram_role require_auth=scram-sha-256", + "SCRAM authentication required, works with SCRAM auth"); +$node->connect_ok("user=scram_role require_auth=!none", + "any authentication required, works with SCRAM auth"); $node->connect_ok( - "user=md5_role require_auth=md5,scram-sha-256,password", - "multiple authentication types required, works with MD5 auth"); + "user=scram_role require_auth=md5,scram-sha-256,password", + "multiple authentication types required, works with SCRAM auth"); # Authentication fails if other types are required. $node->connect_fails( - "user=md5_role require_auth=password", - "password authentication required, fails with MD5 auth", + "user=scram_role require_auth=password", + "password authentication required, fails with SCRAM auth", expected_stderr => - qr/authentication method requirement "password" failed: server requested a hashed password/ + qr/authentication method requirement "password" failed: server requested SASL authentication/ ); $node->connect_fails( - "user=md5_role require_auth=scram-sha-256", - "SCRAM authentication required, fails with MD5 auth", + "user=scram_role require_auth=md5", + "MD5 authentication required, fails with SCRAM auth", expected_stderr => - qr/authentication method requirement "scram-sha-256" failed: server requested a hashed password/ + qr/authentication method requirement "md5" failed: server requested SASL authentication/ ); $node->connect_fails( - "user=md5_role require_auth=none", - "all authentication types forbidden, fails with MD5 auth", + "user=scram_role require_auth=none", + "all authentication types forbidden, fails with SCRAM auth", expected_stderr => - qr/authentication method requirement "none" failed: server requested a hashed password/ + qr/authentication method requirement "none" failed: server requested SASL authentication/ ); -# Authentication fails if MD5 is forbidden. +# Authentication fails if SCRAM is forbidden. $node->connect_fails( - "user=md5_role require_auth=!md5", - "password authentication forbidden, fails with MD5 auth", + "user=scram_role require_auth=!scram-sha-256", + "password authentication forbidden, fails with SCRAM auth", expected_stderr => - qr/authentication method requirement "!md5" failed: server requested a hashed password/ + qr/authentication method requirement "!scram-sha-256" failed: server requested SASL authentication/ ); $node->connect_fails( - "user=md5_role require_auth=!password,!md5,!scram-sha-256", - "multiple authentication types forbidden, fails with MD5 auth", + "user=scram_role require_auth=!password,!md5,!scram-sha-256", + "multiple authentication types forbidden, fails with SCRAM auth", expected_stderr => - qr/authentication method requirement "!password,!md5,!scram-sha-256" failed: server requested a hashed password/ + qr/authentication method requirement "!password,!md5,!scram-sha-256" failed: server requested SASL authentication/ ); # Test SYSTEM_USER <> NULL with parallel workers. $node->safe_psql( 'postgres', "TRUNCATE sysuser_data; -INSERT INTO sysuser_data SELECT 'md5:md5_role' FROM generate_series(1, 10);", - connstr => "user=md5_role"); +INSERT INTO sysuser_data SELECT 'md5:scram_role' FROM generate_series(1, 10);", + connstr => "user=scram_role"); $res = $node->safe_psql( 'postgres', qq( SET min_parallel_table_scan_size TO 0; @@ -454,7 +478,7 @@ sub test_conn SET max_parallel_workers_per_gather TO 2; SELECT bool_and(SYSTEM_USER IS NOT DISTINCT FROM n) FROM sysuser_data;), - connstr => "user=md5_role"); + connstr => "user=scram_role"); is($res, 't', "users with md5 authentication use SYSTEM_USER = md5:role in parallel workers" ); @@ -490,49 +514,57 @@ sub test_conn append_to_file( $pgpassfile, qq! -*:*:*:md5_role:p\\ass -*:*:*:md5,role:p\\ass +*:*:*:scram_role:p\\ass +*:*:*:scram,role:p\\ass !); -test_conn($node, 'user=md5_role', 'password from pgpass', 0); +test_conn($node, 'user=scram_role', 'password from pgpass', 0); # Testing with regular expression for username. The third regexp matches. -reset_pg_hba($node, 'all', '/^.*nomatch.*$, baduser, /^md.*$', 'password'); -test_conn($node, 'user=md5_role', 'password, matching regexp for username', 0, +reset_pg_hba($node, 'all', '/^.*nomatch.*$, baduser, /^scr.*$', 'password'); +test_conn( + $node, + 'user=scram_role', + 'password, matching regexp for username', + 0, log_like => - [qr/connection authenticated: identity="md5_role" method=password/]); + [qr/connection authenticated: identity="scram_role" method=password/]); # The third regex does not match anymore. -reset_pg_hba($node, 'all', '/^.*nomatch.*$, baduser, /^m_d.*$', 'password'); -test_conn($node, 'user=md5_role', +reset_pg_hba($node, 'all', '/^.*nomatch.*$, baduser, /^sc_r.*$', 'password'); +test_conn($node, 'user=scram_role', 'password, non matching regexp for username', 2, log_unlike => [qr/connection authenticated:/]); # Test with a comma in the regular expression. In this case, the use of # double quotes is mandatory so as this is not considered as two elements # of the user name list when parsing pg_hba.conf. -reset_pg_hba($node, 'all', '"/^.*5,.*e$"', 'password'); -test_conn($node, 'user=md5,role', 'password, matching regexp for username', 0, +reset_pg_hba($node, 'all', '"/^.*m,.*e$"', 'password'); +test_conn( + $node, + 'user=scram,role', + 'password, matching regexp for username', + 0, log_like => - [qr/connection authenticated: identity="md5,role" method=password/]); + [qr/connection authenticated: identity="scram,role" method=password/]); # Testing with regular expression for dbname. The third regex matches. reset_pg_hba($node, '/^.*nomatch.*$, baddb, /^regex_t.*b$', 'all', 'password'); test_conn( $node, - 'user=md5_role dbname=regex_testdb', + 'user=scram_role dbname=regex_testdb', 'password, matching regexp for dbname', 0, log_like => - [qr/connection authenticated: identity="md5_role" method=password/]); + [qr/connection authenticated: identity="scram_role" method=password/]); # The third regexp does not match anymore. reset_pg_hba($node, '/^.*nomatch.*$, baddb, /^regex_t.*ba$', 'all', 'password'); test_conn( $node, - 'user=md5_role dbname=regex_testdb', + 'user=scram_role dbname=regex_testdb', 'password, non matching regexp for dbname', 2, log_unlike => [qr/connection authenticated:/]); diff --git a/src/test/authentication/t/002_saslprep.pl b/src/test/authentication/t/002_saslprep.pl index ef158311668bd..4d8f44534d845 100644 --- a/src/test/authentication/t/002_saslprep.pl +++ b/src/test/authentication/t/002_saslprep.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test password normalization in SCRAM. # # This test can only run with Unix-domain sockets. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/authentication/t/003_peer.pl b/src/test/authentication/t/003_peer.pl index d8e49760726a2..97d6776fa953c 100644 --- a/src/test/authentication/t/003_peer.pl +++ b/src/test/authentication/t/003_peer.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests for peer authentication and user name map. # The test is skipped if the platform does not support peer authentication, # and is only able to run with Unix-domain sockets. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -100,6 +100,12 @@ sub test_role $node->safe_psql('postgres', q(select (string_to_array(SYSTEM_USER, ':'))[2])); +# While on it, check the status of huge pages, that can be either on +# or off, but never unknown. +my $huge_pages_status = + $node->safe_psql('postgres', q(SHOW huge_pages_status;)); +isnt($huge_pages_status, 'unknown', "check huge_pages_status"); + # Tests without the user name map. # Failure as connection is attempted with a database role not mapping # to an authorized system user. diff --git a/src/test/authentication/t/004_file_inclusion.pl b/src/test/authentication/t/004_file_inclusion.pl index 55d28ad58644f..f7a86a2bcf4c5 100644 --- a/src/test/authentication/t/004_file_inclusion.pl +++ b/src/test/authentication/t/004_file_inclusion.pl @@ -1,11 +1,11 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests for include directives in HBA and ident files. This test can # only run with Unix-domain sockets. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use File::Basename qw(basename); diff --git a/src/test/authentication/t/005_sspi.pl b/src/test/authentication/t/005_sspi.pl index 05d81f342293b..c9a99af4e2242 100644 --- a/src/test/authentication/t/005_sspi.pl +++ b/src/test/authentication/t/005_sspi.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests targeting SSPI on Windows. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -21,6 +21,10 @@ $node->append_conf('postgresql.conf', "log_connections = on\n"); $node->start; +my $huge_pages_status = + $node->safe_psql('postgres', q(SHOW huge_pages_status;)); +isnt($huge_pages_status, 'unknown', "check huge_pages_status"); + # SSPI is set up by default. Make sure it interacts correctly with # require_auth. $node->connect_ok("require_auth=sspi", diff --git a/src/test/authentication/t/006_login_trigger.pl b/src/test/authentication/t/006_login_trigger.pl new file mode 100644 index 0000000000000..30d852a96ad6f --- /dev/null +++ b/src/test/authentication/t/006_login_trigger.pl @@ -0,0 +1,183 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# Tests of authentication via login trigger. Mostly for rejection via +# exception, because this scenario cannot be covered with *.sql/*.out regress +# tests. + +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; +if (!$use_unix_sockets) +{ + plan skip_all => + "authentication tests cannot run without Unix-domain sockets"; +} + +# Execute a psql command and compare its output towards given regexps +sub psql_command +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + my ($node, $sql, $expected_ret, $test_name, %params) = @_; + + my $connstr; + if (defined($params{connstr})) + { + $connstr = $params{connstr}; + } + else + { + $connstr = ''; + } + + # Execute command + my ($ret, $stdout, $stderr) = + $node->psql('postgres', $sql, connstr => "$connstr"); + + # Check return code + is($ret, $expected_ret, "$test_name: exit code $expected_ret"); + + # Check stdout + if (defined($params{log_like})) + { + my @log_like = @{ $params{log_like} }; + while (my $regex = shift @log_like) + { + like($stdout, $regex, "$test_name: log matches"); + } + } + if (defined($params{log_unlike})) + { + my @log_unlike = @{ $params{log_unlike} }; + while (my $regex = shift @log_unlike) + { + unlike($stdout, $regex, "$test_name: log unmatches"); + } + } + if (defined($params{log_exact})) + { + is($stdout, $params{log_exact}, "$test_name: log equals"); + } + + # Check stderr + if (defined($params{err_like})) + { + my @err_like = @{ $params{err_like} }; + while (my $regex = shift @err_like) + { + like($stderr, $regex, "$test_name: err matches"); + } + } + if (defined($params{err_unlike})) + { + my @err_unlike = @{ $params{err_unlike} }; + while (my $regex = shift @err_unlike) + { + unlike($stderr, $regex, "$test_name: err unmatches"); + } + } + if (defined($params{err_exact})) + { + is($stderr, $params{err_exact}, "$test_name: err equals"); + } + + return; +} + +# New node +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init(extra => [ '--locale=C', '--encoding=UTF8' ]); +$node->append_conf( + 'postgresql.conf', q{ +wal_level = 'logical' +max_replication_slots = 4 +max_wal_senders = 4 +}); +$node->start; + +# Create temporary roles and log table +psql_command( + $node, 'CREATE ROLE regress_alice WITH LOGIN; +CREATE ROLE regress_mallory WITH LOGIN; +CREATE TABLE user_logins(id serial, who text); +GRANT SELECT ON user_logins TO public; +', 0, 'create tmp objects', + log_exact => '', + err_exact => ''), + ; + +# Create login event function and trigger +psql_command( + $node, + 'CREATE FUNCTION on_login_proc() RETURNS event_trigger AS $$ +BEGIN + INSERT INTO user_logins (who) VALUES (SESSION_USER); + IF SESSION_USER = \'regress_mallory\' THEN + RAISE EXCEPTION \'Hello %! You are NOT welcome here!\', SESSION_USER; + END IF; + RAISE NOTICE \'Hello %! You are welcome!\', SESSION_USER; +END; +$$ LANGUAGE plpgsql SECURITY DEFINER; +', 0, 'create trigger function', + log_exact => '', + err_exact => ''); + +psql_command( + $node, + 'CREATE EVENT TRIGGER on_login_trigger ' + . 'ON login EXECUTE PROCEDURE on_login_proc();', 0, + 'create event trigger', + log_exact => '', + err_exact => ''); +psql_command( + $node, 'ALTER EVENT TRIGGER on_login_trigger ENABLE ALWAYS;', 0, + 'alter event trigger', + log_exact => '', + err_like => [qr/You are welcome/]); + +# Check the two requests were logged via login trigger +psql_command( + $node, 'SELECT COUNT(*) FROM user_logins;', 0, 'select count', + log_exact => '2', + err_like => [qr/You are welcome/]); + +# Try to login as allowed Alice. We don't check the Mallory login, because +# FATAL error could cause a timing-dependant panic of IPC::Run. +psql_command( + $node, 'SELECT 1;', 0, 'try regress_alice', + connstr => 'user=regress_alice', + log_exact => '1', + err_like => [qr/You are welcome/], + err_unlike => [qr/You are NOT welcome/]); + +# Check that Alice's login record is here +psql_command( + $node, 'SELECT * FROM user_logins;', 0, 'select *', + log_like => [qr/3\|regress_alice/], + log_unlike => [qr/regress_mallory/], + err_like => [qr/You are welcome/]); + +# Check total number of successful logins so far +psql_command( + $node, 'SELECT COUNT(*) FROM user_logins;', 0, 'select count', + log_exact => '5', + err_like => [qr/You are welcome/]); + +# Cleanup the temporary stuff +psql_command( + $node, 'DROP EVENT TRIGGER on_login_trigger;', 0, + 'drop event trigger', + log_exact => '', + err_like => [qr/You are welcome/]); +psql_command( + $node, 'DROP TABLE user_logins; +DROP FUNCTION on_login_proc; +DROP ROLE regress_mallory; +DROP ROLE regress_alice; +', 0, 'cleanup', + log_exact => '', + err_exact => ''); + +done_testing(); diff --git a/src/test/examples/Makefile b/src/test/examples/Makefile index a67f456904834..e72d058e0c4b8 100644 --- a/src/test/examples/Makefile +++ b/src/test/examples/Makefile @@ -18,5 +18,5 @@ PROGS = testlibpq testlibpq2 testlibpq3 testlibpq4 testlo testlo64 all: $(PROGS) -clean distclean maintainer-clean: +clean distclean: rm -f $(PROGS) *.o diff --git a/src/test/examples/testlo.c b/src/test/examples/testlo.c index b20659d9158d0..1db41df728479 100644 --- a/src/test/examples/testlo.c +++ b/src/test/examples/testlo.c @@ -3,7 +3,7 @@ * testlo.c * test using large objects with libpq * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/test/examples/testlo64.c b/src/test/examples/testlo64.c index 903d2792fc9de..f0636a47961d7 100644 --- a/src/test/examples/testlo64.c +++ b/src/test/examples/testlo64.c @@ -3,7 +3,7 @@ * testlo64.c * test using large objects with libpq using 64-bit APIs * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/test/icu/Makefile b/src/test/icu/Makefile index 033b0d03ccb51..e32855eda8637 100644 --- a/src/test/icu/Makefile +++ b/src/test/icu/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/test/icu # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/test/icu/Makefile @@ -21,5 +21,5 @@ check: installcheck: $(prove_installcheck) -clean distclean maintainer-clean: +clean distclean: rm -rf tmp_check diff --git a/src/test/icu/meson.build b/src/test/icu/meson.build index 108301af21f50..0a474aa0c0709 100644 --- a/src/test/icu/meson.build +++ b/src/test/icu/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tests += { 'name': 'icu', diff --git a/src/test/icu/t/010_database.pl b/src/test/icu/t/010_database.pl index 3beee2ff969e9..88d91cca39d47 100644 --- a/src/test/icu/t/010_database.pl +++ b/src/test/icu/t/010_database.pl @@ -1,7 +1,7 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -27,6 +27,9 @@ INSERT INTO icu VALUES ('a', 'a', 'a'), ('b', 'b', 'b'), ('A', 'A', 'A'), ('B', 'B', 'B'); }); +is($node1->safe_psql('dbicu', q{SELECT icu_unicode_version() IS NOT NULL}), + qq(t), 'ICU unicode version defined'); + is( $node1->safe_psql('dbicu', q{SELECT def FROM icu ORDER BY def}), qq(A a @@ -64,23 +67,18 @@ is( $node1->psql( 'postgres', q{CREATE DATABASE dbicu2 LOCALE_PROVIDER icu LOCALE '@colStrength=primary' - LC_COLLATE='C' LC_CTYPE='C' TEMPLATE template0 ENCODING UTF8} + LC_COLLATE='C' LC_CTYPE='C' TEMPLATE template0 ENCODING UTF8} ), 0, "LOCALE works for ICU locales if LC_COLLATE and LC_CTYPE are specified"); -# Test that ICU-specific LOCALE without LC_COLLATE and LC_CTYPE must -# be specified with ICU_LOCALE -my ($ret, $stdout, $stderr) = $node1->psql( - 'postgres', - q{CREATE DATABASE dbicu3 LOCALE_PROVIDER icu LOCALE '@colStrength=primary' - TEMPLATE template0 ENCODING UTF8}); -isnt($ret, 0, - "ICU-specific locale must be specified with ICU_LOCALE: exit code not 0"); +my ($ret, $stdout, $stderr) = $node1->psql('postgres', + q{CREATE DATABASE dbicu3 LOCALE_PROVIDER builtin LOCALE 'C' TEMPLATE dbicu} +); +isnt($ret, 0, "locale provider must match template: exit code not 0"); like( $stderr, - qr/ERROR: invalid LC_COLLATE locale name/, - "ICU-specific locale must be specified with ICU_LOCALE: error message"); - + qr/ERROR: new locale provider \(builtin\) does not match locale provider of the template database \(icu\)/, + "locale provider must match template: error message"); done_testing(); diff --git a/src/test/isolation/Makefile b/src/test/isolation/Makefile index b8738b7c1be90..ade2256ed3aa7 100644 --- a/src/test/isolation/Makefile +++ b/src/test/isolation/Makefile @@ -38,13 +38,11 @@ pg_regress.o: | submake-regress rm -f $@ && $(LN_S) $(top_builddir)/src/test/regress/pg_regress.o . pg_isolation_regress$(X): isolation_main.o pg_regress.o $(WIN32RES) - $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@ + $(CC) $(CFLAGS) $^ $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@ isolationtester$(X): $(OBJS) | submake-libpq submake-libpgport $(CC) $(CFLAGS) $^ $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@ -distprep: specparse.c specscanner.c - # See notes in src/backend/parser/Makefile about the following two rules specparse.h: specparse.c touch $@ @@ -54,14 +52,10 @@ specparse.c: BISONFLAGS += -d # Force these dependencies to be known even without dependency info built: specparse.o specscanner.o: specparse.h -# specparse.c and specscanner.c are in the distribution tarball, -# so do not clean them here clean distclean: rm -f isolationtester$(X) pg_isolation_regress$(X) $(OBJS) isolation_main.o rm -f pg_regress.o rm -rf $(pg_regress_clean_files) - -maintainer-clean: distclean rm -f specparse.h specparse.c specscanner.c installcheck: all diff --git a/src/test/isolation/expected/eval-plan-qual.out b/src/test/isolation/expected/eval-plan-qual.out index 73e0aeb50e747..032d4208d51f3 100644 --- a/src/test/isolation/expected/eval-plan-qual.out +++ b/src/test/isolation/expected/eval-plan-qual.out @@ -746,6 +746,36 @@ savings | 600| 1200 (2 rows) +starting permutation: read wx2 wb1 c2 c1 read +step read: SELECT * FROM accounts ORDER BY accountid; +accountid|balance|balance2 +---------+-------+-------- +checking | 600| 1200 +savings | 600| 1200 +(2 rows) + +step wx2: UPDATE accounts SET balance = balance + 450 WHERE accountid = 'checking' RETURNING balance; +balance +------- + 1050 +(1 row) + +step wb1: DELETE FROM accounts WHERE balance = 600 RETURNING *; +step c2: COMMIT; +step wb1: <... completed> +accountid|balance|balance2 +---------+-------+-------- +savings | 600| 1200 +(1 row) + +step c1: COMMIT; +step read: SELECT * FROM accounts ORDER BY accountid; +accountid|balance|balance2 +---------+-------+-------- +checking | 1050| 2100 +(1 row) + + starting permutation: upsert1 upsert2 c1 c2 read step upsert1: WITH upsert AS @@ -1307,3 +1337,29 @@ a|b|c| d 2|2|2|1004 (2 rows) + +starting permutation: sys1 sysupd2 c1 c2 +step sys1: + UPDATE pg_class SET reltuples = 123 WHERE oid = 'accounts'::regclass; + +step sysupd2: + UPDATE pg_class SET reltuples = reltuples * 2 + WHERE oid = 'accounts'::regclass; + +step c1: COMMIT; +step sysupd2: <... completed> +step c2: COMMIT; + +starting permutation: sys1 sysmerge2 c1 c2 +step sys1: + UPDATE pg_class SET reltuples = 123 WHERE oid = 'accounts'::regclass; + +step sysmerge2: + MERGE INTO pg_class + USING (SELECT 'accounts'::regclass AS o) j + ON o = oid + WHEN MATCHED THEN UPDATE SET reltuples = reltuples * 2; + +step c1: COMMIT; +step sysmerge2: <... completed> +step c2: COMMIT; diff --git a/src/test/isolation/expected/fk-snapshot.out b/src/test/isolation/expected/fk-snapshot.out index 5faf80d6ce0e4..bdd26bac6cf30 100644 --- a/src/test/isolation/expected/fk-snapshot.out +++ b/src/test/isolation/expected/fk-snapshot.out @@ -122,3 +122,25 @@ a 1 (1 row) + +starting permutation: s2ip2 s1brr s1ifp2 s2brr s2dp2 s1c s2c +step s2ip2: INSERT INTO pk_noparted VALUES (2); +step s1brr: BEGIN ISOLATION LEVEL REPEATABLE READ; +step s1ifp2: INSERT INTO fk_parted_pk VALUES (2); +step s2brr: BEGIN ISOLATION LEVEL REPEATABLE READ; +step s2dp2: DELETE FROM pk_noparted WHERE a = 2; +step s1c: COMMIT; +step s2dp2: <... completed> +ERROR: could not serialize access due to concurrent update +step s2c: COMMIT; + +starting permutation: s2ip2 s1brr s1ifn2 s2brr s2dp2 s1c s2c +step s2ip2: INSERT INTO pk_noparted VALUES (2); +step s1brr: BEGIN ISOLATION LEVEL REPEATABLE READ; +step s1ifn2: INSERT INTO fk_noparted_sn VALUES (2); +step s2brr: BEGIN ISOLATION LEVEL REPEATABLE READ; +step s2dp2: DELETE FROM pk_noparted WHERE a = 2; +step s1c: COMMIT; +step s2dp2: <... completed> +ERROR: could not serialize access due to concurrent update +step s2c: COMMIT; diff --git a/src/test/isolation/expected/inplace-inval.out b/src/test/isolation/expected/inplace-inval.out new file mode 100644 index 0000000000000..e68eca5de98dd --- /dev/null +++ b/src/test/isolation/expected/inplace-inval.out @@ -0,0 +1,24 @@ +Parsed test spec with 3 sessions + +starting permutation: cachefill3 cir1 cic2 ddl3 +step cachefill3: TABLE newly_indexed; +c +- +(0 rows) + +step cir1: BEGIN; CREATE INDEX i1 ON newly_indexed (c); ROLLBACK; +step cic2: CREATE INDEX i2 ON newly_indexed (c); +step ddl3: ALTER TABLE newly_indexed ADD extra int; + +starting permutation: cir1 cic2 ddl3 read1 +step cir1: BEGIN; CREATE INDEX i1 ON newly_indexed (c); ROLLBACK; +step cic2: CREATE INDEX i2 ON newly_indexed (c); +step ddl3: ALTER TABLE newly_indexed ADD extra int; +step read1: + SELECT relhasindex FROM pg_class WHERE oid = 'newly_indexed'::regclass; + +relhasindex +----------- +t +(1 row) + diff --git a/src/test/isolation/expected/intra-grant-inplace-db.out b/src/test/isolation/expected/intra-grant-inplace-db.out new file mode 100644 index 0000000000000..a91402ccb8f38 --- /dev/null +++ b/src/test/isolation/expected/intra-grant-inplace-db.out @@ -0,0 +1,28 @@ +Parsed test spec with 3 sessions + +starting permutation: snap3 b1 grant1 vac2 snap3 c1 cmp3 +step snap3: + INSERT INTO frozen_witness + SELECT datfrozenxid FROM pg_database WHERE datname = current_catalog; + +step b1: BEGIN; +step grant1: + GRANT TEMP ON DATABASE isolation_regression TO regress_temp_grantee; + +step vac2: VACUUM (FREEZE); +step snap3: + INSERT INTO frozen_witness + SELECT datfrozenxid FROM pg_database WHERE datname = current_catalog; + +step c1: COMMIT; +step vac2: <... completed> +step cmp3: + SELECT 'datfrozenxid retreated' + FROM pg_database + WHERE datname = current_catalog + AND age(datfrozenxid) > (SELECT min(age(x)) FROM frozen_witness); + +?column? +-------- +(0 rows) + diff --git a/src/test/isolation/expected/intra-grant-inplace.out b/src/test/isolation/expected/intra-grant-inplace.out new file mode 100644 index 0000000000000..4e9695a02146c --- /dev/null +++ b/src/test/isolation/expected/intra-grant-inplace.out @@ -0,0 +1,253 @@ +Parsed test spec with 5 sessions + +starting permutation: b1 grant1 read2 addk2 c1 read2 +step b1: BEGIN; +step grant1: + GRANT SELECT ON intra_grant_inplace TO PUBLIC; + +step read2: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass; + +relhasindex +----------- +f +(1 row) + +step addk2: ALTER TABLE intra_grant_inplace ADD PRIMARY KEY (c); +step c1: COMMIT; +step addk2: <... completed> +step read2: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass; + +relhasindex +----------- +t +(1 row) + + +starting permutation: keyshr5 addk2 +step keyshr5: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR KEY SHARE; + +relhasindex +----------- +f +(1 row) + +step addk2: ALTER TABLE intra_grant_inplace ADD PRIMARY KEY (c); + +starting permutation: keyshr5 b3 sfnku3 addk2 r3 +step keyshr5: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR KEY SHARE; + +relhasindex +----------- +f +(1 row) + +step b3: BEGIN ISOLATION LEVEL READ COMMITTED; +step sfnku3: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR NO KEY UPDATE; + +relhasindex +----------- +f +(1 row) + +step addk2: ALTER TABLE intra_grant_inplace ADD PRIMARY KEY (c); +step r3: ROLLBACK; +step addk2: <... completed> + +starting permutation: b3 sfnku3 keyshr5 addk2 r3 +step b3: BEGIN ISOLATION LEVEL READ COMMITTED; +step sfnku3: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR NO KEY UPDATE; + +relhasindex +----------- +f +(1 row) + +step keyshr5: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR KEY SHARE; + +relhasindex +----------- +f +(1 row) + +step addk2: ALTER TABLE intra_grant_inplace ADD PRIMARY KEY (c); +step r3: ROLLBACK; +step addk2: <... completed> + +starting permutation: b2 sfnku2 addk2 c2 +step b2: BEGIN; +step sfnku2: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR NO KEY UPDATE; + +relhasindex +----------- +f +(1 row) + +step addk2: ALTER TABLE intra_grant_inplace ADD PRIMARY KEY (c); +step c2: COMMIT; + +starting permutation: keyshr5 b2 sfnku2 addk2 c2 +step keyshr5: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR KEY SHARE; + +relhasindex +----------- +f +(1 row) + +step b2: BEGIN; +step sfnku2: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR NO KEY UPDATE; + +relhasindex +----------- +f +(1 row) + +step addk2: ALTER TABLE intra_grant_inplace ADD PRIMARY KEY (c); +step c2: COMMIT; + +starting permutation: b3 sfu3 b1 grant1 read2 addk2 r3 c1 read2 +step b3: BEGIN ISOLATION LEVEL READ COMMITTED; +step sfu3: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR UPDATE; + +relhasindex +----------- +f +(1 row) + +step b1: BEGIN; +step grant1: + GRANT SELECT ON intra_grant_inplace TO PUBLIC; + +step read2: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass; + +relhasindex +----------- +f +(1 row) + +step addk2: ALTER TABLE intra_grant_inplace ADD PRIMARY KEY (c); +step r3: ROLLBACK; +step grant1: <... completed> +step c1: COMMIT; +step addk2: <... completed> +step read2: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass; + +relhasindex +----------- +t +(1 row) + + +starting permutation: b2 sfnku2 b1 grant1 addk2 c2 c1 read2 +step b2: BEGIN; +step sfnku2: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR NO KEY UPDATE; + +relhasindex +----------- +f +(1 row) + +step b1: BEGIN; +step grant1: + GRANT SELECT ON intra_grant_inplace TO PUBLIC; + +step addk2: ALTER TABLE intra_grant_inplace ADD PRIMARY KEY (c); +step addk2: <... completed> +ERROR: deadlock detected +step grant1: <... completed> +step c2: COMMIT; +step c1: COMMIT; +step read2: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass; + +relhasindex +----------- +f +(1 row) + + +starting permutation: b1 grant1 b3 sfu3 revoke4 c1 r3 +step b1: BEGIN; +step grant1: + GRANT SELECT ON intra_grant_inplace TO PUBLIC; + +step b3: BEGIN ISOLATION LEVEL READ COMMITTED; +step sfu3: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR UPDATE; + +step revoke4: + DO $$ + BEGIN + REVOKE SELECT ON intra_grant_inplace FROM PUBLIC; + EXCEPTION WHEN others THEN + RAISE WARNING 'got: %', regexp_replace(sqlerrm, '[0-9]+', 'REDACTED'); + END + $$; + +step c1: COMMIT; +step sfu3: <... completed> +relhasindex +----------- +f +(1 row) + +step r3: ROLLBACK; +step revoke4: <... completed> + +starting permutation: b1 drop1 b3 sfu3 revoke4 c1 r3 +step b1: BEGIN; +step drop1: + DROP TABLE intra_grant_inplace; + +step b3: BEGIN ISOLATION LEVEL READ COMMITTED; +step sfu3: + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR UPDATE; + +step revoke4: + DO $$ + BEGIN + REVOKE SELECT ON intra_grant_inplace FROM PUBLIC; + EXCEPTION WHEN others THEN + RAISE WARNING 'got: %', regexp_replace(sqlerrm, '[0-9]+', 'REDACTED'); + END + $$; + +step c1: COMMIT; +step sfu3: <... completed> +relhasindex +----------- +(0 rows) + +s4: WARNING: got: cache lookup failed for relation REDACTED +step revoke4: <... completed> +step r3: ROLLBACK; diff --git a/src/test/isolation/expected/lock-nowait.out b/src/test/isolation/expected/lock-nowait.out new file mode 100644 index 0000000000000..2dc5aad6f07ba --- /dev/null +++ b/src/test/isolation/expected/lock-nowait.out @@ -0,0 +1,9 @@ +Parsed test spec with 2 sessions + +starting permutation: s1a s2a s1b s1c s2c +step s1a: LOCK TABLE a1 IN ACCESS EXCLUSIVE MODE; +step s2a: LOCK TABLE a1 IN EXCLUSIVE MODE; +step s1b: LOCK TABLE a1 IN SHARE ROW EXCLUSIVE MODE NOWAIT; +step s1c: COMMIT; +step s2a: <... completed> +step s2c: COMMIT; diff --git a/src/test/isolation/expected/merge-join.out b/src/test/isolation/expected/merge-join.out new file mode 100644 index 0000000000000..57f048c52e5ba --- /dev/null +++ b/src/test/isolation/expected/merge-join.out @@ -0,0 +1,148 @@ +Parsed test spec with 2 sessions + +starting permutation: b1 m1 s1 c1 b2 m2 s2 c2 +step b1: BEGIN ISOLATION LEVEL READ COMMITTED; +step m1: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step s1: SELECT * FROM tgt; +id|val +--+--- + 1| 10 + 2| 20 + 3| 30 +(3 rows) + +step c1: COMMIT; +step b2: BEGIN ISOLATION LEVEL READ COMMITTED; +step m2: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step s2: SELECT * FROM tgt; +id|val +--+--- + 1| 10 + 2| 20 + 3| 30 +(3 rows) + +step c2: COMMIT; + +starting permutation: b1 b2 m1 hj ex m2 c1 c2 s1 +step b1: BEGIN ISOLATION LEVEL READ COMMITTED; +step b2: BEGIN ISOLATION LEVEL READ COMMITTED; +step m1: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step hj: SET LOCAL enable_mergejoin = off; SET LOCAL enable_nestloop = off; +step ex: EXPLAIN (verbose, costs off) + MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +QUERY PLAN +--------------------------------------------------- +Merge on public.tgt + -> Hash Left Join + Output: tgt.ctid, src.val, src.id, src.ctid + Inner Unique: true + Hash Cond: (src.id = tgt.id) + -> Seq Scan on public.src + Output: src.val, src.id, src.ctid + -> Hash + Output: tgt.ctid, tgt.id + -> Seq Scan on public.tgt + Output: tgt.ctid, tgt.id +(11 rows) + +step m2: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step c1: COMMIT; +step m2: <... completed> +step c2: COMMIT; +step s1: SELECT * FROM tgt; +id|val +--+--- + 1| 10 + 2| 20 + 3| 30 +(3 rows) + + +starting permutation: b1 b2 m1 mj ex m2 c1 c2 s1 +step b1: BEGIN ISOLATION LEVEL READ COMMITTED; +step b2: BEGIN ISOLATION LEVEL READ COMMITTED; +step m1: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step mj: SET LOCAL enable_hashjoin = off; SET LOCAL enable_nestloop = off; +step ex: EXPLAIN (verbose, costs off) + MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +QUERY PLAN +--------------------------------------------------- +Merge on public.tgt + -> Merge Left Join + Output: tgt.ctid, src.val, src.id, src.ctid + Inner Unique: true + Merge Cond: (src.id = tgt.id) + -> Index Scan using src_pkey on public.src + Output: src.val, src.id, src.ctid + -> Index Scan using tgt_pkey on public.tgt + Output: tgt.ctid, tgt.id +(9 rows) + +step m2: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step c1: COMMIT; +step m2: <... completed> +step c2: COMMIT; +step s1: SELECT * FROM tgt; +id|val +--+--- + 1| 10 + 2| 20 + 3| 30 +(3 rows) + + +starting permutation: b1 b2 m1 nl ex m2 c1 c2 s1 +step b1: BEGIN ISOLATION LEVEL READ COMMITTED; +step b2: BEGIN ISOLATION LEVEL READ COMMITTED; +step m1: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step nl: SET LOCAL enable_hashjoin = off; SET LOCAL enable_mergejoin = off; +step ex: EXPLAIN (verbose, costs off) + MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +QUERY PLAN +--------------------------------------------------- +Merge on public.tgt + -> Nested Loop Left Join + Output: tgt.ctid, src.val, src.id, src.ctid + Inner Unique: true + -> Seq Scan on public.src + Output: src.val, src.id, src.ctid + -> Index Scan using tgt_pkey on public.tgt + Output: tgt.ctid, tgt.id + Index Cond: (tgt.id = src.id) +(9 rows) + +step m2: MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); +step c1: COMMIT; +step m2: <... completed> +step c2: COMMIT; +step s1: SELECT * FROM tgt; +id|val +--+--- + 1| 10 + 2| 20 + 3| 30 +(3 rows) + diff --git a/src/test/isolation/expected/merge-update.out b/src/test/isolation/expected/merge-update.out index 55b1f908fddbd..3063c0c6ab1c5 100644 --- a/src/test/isolation/expected/merge-update.out +++ b/src/test/isolation/expected/merge-update.out @@ -37,17 +37,47 @@ step merge2a: WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN - UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val + WHEN NOT MATCHED BY SOURCE THEN + UPDATE set key = t.key + 1, val = t.val || ' source not matched by merge2a' + RETURNING merge_action(), t.*; + +merge_action|key|val +------------+---+------------------------------------------------------ +UPDATE | 3|setup1 updated by merge1 source not matched by merge2a +INSERT | 1|merge2a +(2 rows) step select2: SELECT * FROM target; -key|val ----+------------------------ - 2|setup1 updated by merge1 - 1|merge2a +key|val +---+------------------------------------------------------ + 3|setup1 updated by merge1 source not matched by merge2a + 1|merge2a (2 rows) step c2: COMMIT; +starting permutation: pa_merge1 c1 pa_merge2c_dup a2 +step pa_merge1: + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge1' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set val = t.val || ' updated by ' || s.val; + +step c1: COMMIT; +step pa_merge2c_dup: + MERGE INTO pa_target t + USING (VALUES (1), (1)) v(a) + ON t.key = v.a + WHEN MATCHED THEN + UPDATE set val = t.val || ' updated by pa_merge2c_dup'; -- should fail + +ERROR: MERGE command cannot affect row a second time +step a2: ABORT; + starting permutation: merge1 merge2a c1 select2 c2 step merge1: MERGE INTO target t @@ -65,15 +95,24 @@ step merge2a: WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN - UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val + WHEN NOT MATCHED BY SOURCE THEN + UPDATE set key = t.key + 1, val = t.val || ' source not matched by merge2a' + RETURNING merge_action(), t.*; step c1: COMMIT; step merge2a: <... completed> +merge_action|key|val +------------+---+------------------------------------------------------ +UPDATE | 3|setup1 updated by merge1 source not matched by merge2a +INSERT | 1|merge2a +(2 rows) + step select2: SELECT * FROM target; -key|val ----+------------------------ - 2|setup1 updated by merge1 - 1|merge2a +key|val +---+------------------------------------------------------ + 3|setup1 updated by merge1 source not matched by merge2a + 1|merge2a (2 rows) step c2: COMMIT; @@ -95,10 +134,18 @@ step merge2a: WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN - UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val + WHEN NOT MATCHED BY SOURCE THEN + UPDATE set key = t.key + 1, val = t.val || ' source not matched by merge2a' + RETURNING merge_action(), t.*; step a1: ABORT; step merge2a: <... completed> +merge_action|key|val +------------+---+------------------------- +UPDATE | 2|setup1 updated by merge2a +(1 row) + step select2: SELECT * FROM target; key|val ---+------------------------- @@ -184,15 +231,24 @@ step pa_merge2a: WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN - UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val + WHEN NOT MATCHED BY SOURCE THEN + UPDATE set key = t.key + 1, val = t.val || ' source not matched by pa_merge2a' + RETURNING merge_action(), t.*; step c1: COMMIT; step pa_merge2a: <... completed> +merge_action|key|val +------------+---+-------------------------------------------------- +UPDATE | 2|initial updated by pa_merge1 updated by pa_merge2a +UPDATE | 3|initial source not matched by pa_merge2a +(2 rows) + step pa_select2: SELECT * FROM pa_target; key|val ---+-------------------------------------------------- - 2|initial 2|initial updated by pa_merge1 updated by pa_merge2a + 3|initial source not matched by pa_merge2a (2 rows) step c2: COMMIT; @@ -214,7 +270,10 @@ step pa_merge2a: WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN - UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val + WHEN NOT MATCHED BY SOURCE THEN + UPDATE set key = t.key + 1, val = t.val || ' source not matched by pa_merge2a' + RETURNING merge_action(), t.*; step c1: COMMIT; step pa_merge2a: <... completed> @@ -241,14 +300,24 @@ step pa_merge2a: WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN - UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val + WHEN NOT MATCHED BY SOURCE THEN + UPDATE set key = t.key + 1, val = t.val || ' source not matched by pa_merge2a' + RETURNING merge_action(), t.*; + +merge_action|key|val +------------+---+------------------------------------------------------------- +UPDATE | 3|initial source not matched by pa_merge2a +UPDATE | 3|initial updated by pa_merge2 source not matched by pa_merge2a +INSERT | 1|pa_merge2a +(3 rows) step pa_select2: SELECT * FROM pa_target; -key|val ----+---------------------------- - 1|pa_merge2a - 2|initial - 2|initial updated by pa_merge2 +key|val +---+------------------------------------------------------------- + 1|pa_merge2a + 3|initial source not matched by pa_merge2a + 3|initial updated by pa_merge2 source not matched by pa_merge2a (3 rows) step c2: COMMIT; @@ -312,3 +381,25 @@ key|val (2 rows) step c2: COMMIT; + +starting permutation: pa_merge1 pa_merge2c_dup c1 a2 +step pa_merge1: + MERGE INTO pa_target t + USING (SELECT 1 as key, 'pa_merge1' as val) s + ON s.key = t.key + WHEN NOT MATCHED THEN + INSERT VALUES (s.key, s.val) + WHEN MATCHED THEN + UPDATE set val = t.val || ' updated by ' || s.val; + +step pa_merge2c_dup: + MERGE INTO pa_target t + USING (VALUES (1), (1)) v(a) + ON t.key = v.a + WHEN MATCHED THEN + UPDATE set val = t.val || ' updated by pa_merge2c_dup'; -- should fail + +step c1: COMMIT; +step pa_merge2c_dup: <... completed> +ERROR: MERGE command cannot affect row a second time +step a2: ABORT; diff --git a/src/test/isolation/expected/stats.out b/src/test/isolation/expected/stats.out index 61b5a710ec8d8..8c7fe60217e98 100644 --- a/src/test/isolation/expected/stats.out +++ b/src/test/isolation/expected/stats.out @@ -3039,8 +3039,8 @@ pg_stat_force_next_flush (1 row) step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3093,8 +3093,8 @@ pg_stat_force_next_flush (1 row) step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s2_big_notify: SELECT pg_notify('stats_test_use', @@ -3133,8 +3133,8 @@ pg_stat_force_next_flush (1 row) step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s2_begin: BEGIN; @@ -3176,8 +3176,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3243,8 +3243,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3310,8 +3310,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3377,8 +3377,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3450,8 +3450,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3523,8 +3523,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3596,8 +3596,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3653,8 +3653,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; diff --git a/src/test/isolation/expected/stats_1.out b/src/test/isolation/expected/stats_1.out index 3854320106ad9..6b965bb95534a 100644 --- a/src/test/isolation/expected/stats_1.out +++ b/src/test/isolation/expected/stats_1.out @@ -3063,8 +3063,8 @@ pg_stat_force_next_flush (1 row) step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3117,8 +3117,8 @@ pg_stat_force_next_flush (1 row) step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s2_big_notify: SELECT pg_notify('stats_test_use', @@ -3157,8 +3157,8 @@ pg_stat_force_next_flush (1 row) step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s2_begin: BEGIN; @@ -3200,8 +3200,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3267,8 +3267,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3334,8 +3334,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3401,8 +3401,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_none: SET stats_fetch_consistency = 'none'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3474,8 +3474,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_cache: SET stats_fetch_consistency = 'cache'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3547,8 +3547,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3620,8 +3620,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; @@ -3677,8 +3677,8 @@ pg_stat_force_next_flush step s1_fetch_consistency_snapshot: SET stats_fetch_consistency = 'snapshot'; step s1_slru_save_stats: - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); step s1_listen: LISTEN stats_test_nothing; step s1_begin: BEGIN; diff --git a/src/test/isolation/expected/temp-schema-cleanup.out b/src/test/isolation/expected/temp-schema-cleanup.out index 35b91d9e4506f..d10aee53a8041 100644 --- a/src/test/isolation/expected/temp-schema-cleanup.out +++ b/src/test/isolation/expected/temp-schema-cleanup.out @@ -9,7 +9,7 @@ step s1_create_temp_objects: CREATE OR REPLACE FUNCTION pg_temp.long() RETURNS text LANGUAGE sql AS $body$ SELECT %L; $body$$outer$, (SELECT string_agg(g.i::text||':'||random()::text, '|') FROM generate_series(1, 100) g(i)))); - -- The above bug requirs function removal to happen after a catalog + -- The above bug requires function removal to happen after a catalog -- invalidation. dependency.c sorts objects in descending oid order so -- that newer objects are deleted before older objects, so create a -- table after. @@ -66,7 +66,7 @@ step s1_create_temp_objects: CREATE OR REPLACE FUNCTION pg_temp.long() RETURNS text LANGUAGE sql AS $body$ SELECT %L; $body$$outer$, (SELECT string_agg(g.i::text||':'||random()::text, '|') FROM generate_series(1, 100) g(i)))); - -- The above bug requirs function removal to happen after a catalog + -- The above bug requires function removal to happen after a catalog -- invalidation. dependency.c sorts objects in descending oid order so -- that newer objects are deleted before older objects, so create a -- table after. diff --git a/src/test/isolation/isolation_main.c b/src/test/isolation/isolation_main.c index c4288b553e1f1..2a3e41d2101e7 100644 --- a/src/test/isolation/isolation_main.c +++ b/src/test/isolation/isolation_main.c @@ -2,7 +2,7 @@ * * isolation_main --- pg_regress test launcher for isolation tests * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/test/isolation/isolation_main.c @@ -12,6 +12,7 @@ #include "postgres_fe.h" +#include "lib/stringinfo.h" #include "pg_regress.h" char saved_argv0[MAXPGPATH]; @@ -34,8 +35,7 @@ isolation_start_test(const char *testname, char infile[MAXPGPATH]; char outfile[MAXPGPATH]; char expectfile[MAXPGPATH]; - char psql_cmd[MAXPGPATH * 3]; - size_t offset = 0; + StringInfoData psql_cmd; char *appnameenv; /* need to do the path lookup here, check isolation_init() for details */ @@ -75,34 +75,23 @@ isolation_start_test(const char *testname, add_stringlist_item(resultfiles, outfile); add_stringlist_item(expectfiles, expectfile); + initStringInfo(&psql_cmd); + if (launcher) - { - offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset, - "%s ", launcher); - if (offset >= sizeof(psql_cmd)) - { - fprintf(stderr, _("command too long\n")); - exit(2); - } - } + appendStringInfo(&psql_cmd, "%s ", launcher); - offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset, - "\"%s\" \"dbname=%s\" < \"%s\" > \"%s\" 2>&1", - isolation_exec, - dblist->str, - infile, - outfile); - if (offset >= sizeof(psql_cmd)) - { - fprintf(stderr, _("command too long\n")); - exit(2); - } + appendStringInfo(&psql_cmd, + "\"%s\" \"dbname=%s\" < \"%s\" > \"%s\" 2>&1", + isolation_exec, + dblist->str, + infile, + outfile); appnameenv = psprintf("isolation/%s", testname); setenv("PGAPPNAME", appnameenv, 1); free(appnameenv); - pid = spawn_process(psql_cmd); + pid = spawn_process(psql_cmd.data); if (pid == INVALID_PID) { @@ -113,6 +102,8 @@ isolation_start_test(const char *testname, unsetenv("PGAPPNAME"); + pfree(psql_cmd.data); + return pid; } diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule index 4fc56ae99c934..143109aa4da9e 100644 --- a/src/test/isolation/isolation_schedule +++ b/src/test/isolation/isolation_schedule @@ -37,6 +37,9 @@ test: fk-snapshot test: subxid-overflow test: eval-plan-qual test: eval-plan-qual-trigger +test: inplace-inval +test: intra-grant-inplace +test: intra-grant-inplace-db test: lock-update-delete test: lock-update-traversal test: inherit-temp @@ -51,6 +54,7 @@ test: merge-insert-update test: merge-delete test: merge-update test: merge-match-recheck +test: merge-join test: delete-abort-savept test: delete-abort-savept-2 test: aborted-keyrevoke @@ -110,3 +114,4 @@ test: serializable-parallel test: serializable-parallel-2 test: serializable-parallel-3 test: matview-write-skew +test: lock-nowait diff --git a/src/test/isolation/isolationtester.c b/src/test/isolation/isolationtester.c index 0a66235153aab..0b342b5c2bbba 100644 --- a/src/test/isolation/isolationtester.c +++ b/src/test/isolation/isolationtester.c @@ -871,7 +871,7 @@ try_complete_step(TestSpec *testspec, PermutationStep *pstep, int flags) { if (errno == EINTR) continue; - fprintf(stderr, "select failed: %s\n", strerror(errno)); + fprintf(stderr, "select failed: %m\n"); exit(1); } else if (ret == 0) /* select() timeout: check for lock wait */ @@ -946,26 +946,21 @@ try_complete_step(TestSpec *testspec, PermutationStep *pstep, int flags) */ if (td > max_step_wait && !canceled) { - PGcancel *cancel = PQgetCancel(conn); + PGcancelConn *cancel_conn = PQcancelCreate(conn); - if (cancel != NULL) + if (PQcancelBlocking(cancel_conn)) { - char buf[256]; - - if (PQcancel(cancel, buf, sizeof(buf))) - { - /* - * print to stdout not stderr, as this should appear - * in the test case's results - */ - printf("isolationtester: canceling step %s after %d seconds\n", - step->name, (int) (td / USECS_PER_SEC)); - canceled = true; - } - else - fprintf(stderr, "PQcancel failed: %s\n", buf); - PQfreeCancel(cancel); + /* + * print to stdout not stderr, as this should appear in + * the test case's results + */ + printf("isolationtester: canceling step %s after %d seconds\n", + step->name, (int) (td / USECS_PER_SEC)); + canceled = true; } + else + fprintf(stderr, "PQcancel failed: %s\n", PQcancelErrorMessage(cancel_conn)); + PQcancelFinish(cancel_conn); } /* diff --git a/src/test/isolation/isolationtester.h b/src/test/isolation/isolationtester.h index bb5c9ebece6f4..fca67106153e2 100644 --- a/src/test/isolation/isolationtester.h +++ b/src/test/isolation/isolationtester.h @@ -3,7 +3,7 @@ * isolationtester.h * include file for isolation tests * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -43,7 +43,7 @@ typedef enum { PSB_ONCE, /* force step to wait once */ PSB_OTHER_STEP, /* wait for another step to complete first */ - PSB_NUM_NOTICES /* wait for N notices from another session */ + PSB_NUM_NOTICES, /* wait for N notices from another session */ } PermutationStepBlockerType; typedef struct diff --git a/src/test/isolation/meson.build b/src/test/isolation/meson.build index a4439e8ad07af..1082887a44afe 100644 --- a/src/test/isolation/meson.build +++ b/src/test/isolation/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # pg_regress_c helpfully provided by regress/meson.build @@ -35,7 +35,7 @@ pg_isolation_regress = executable('pg_isolation_regress', isolation_sources, c_args: pg_regress_cflags, include_directories: pg_regress_inc, - dependencies: frontend_code, + dependencies: [frontend_code, libpq], kwargs: default_bin_args + { 'install_dir': dir_pgxs / 'src/test/isolation', }, diff --git a/src/test/isolation/specparse.y b/src/test/isolation/specparse.y index c65e5c0edc6da..0e8b166a53ecc 100644 --- a/src/test/isolation/specparse.y +++ b/src/test/isolation/specparse.y @@ -4,7 +4,7 @@ * specparse.y * bison grammar for the isolation test file format * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * *------------------------------------------------------------------------- diff --git a/src/test/isolation/specs/detach-partition-concurrently-4.spec b/src/test/isolation/specs/detach-partition-concurrently-4.spec index 2c02cae4f1a24..829c82248f139 100644 --- a/src/test/isolation/specs/detach-partition-concurrently-4.spec +++ b/src/test/isolation/specs/detach-partition-concurrently-4.spec @@ -1,6 +1,6 @@ # This test exercises behavior of foreign keys in the face of concurrent # detach of partitions in the referenced table. -# (The cases where the detaching transaction is cancelled is interesting +# (The cases where the detaching transaction is canceled is interesting # because the locking situation is completely different. I didn't verify # that keeping both variants adds any extra coverage.) # diff --git a/src/test/isolation/specs/eval-plan-qual.spec b/src/test/isolation/specs/eval-plan-qual.spec index 735c671734e49..07307e623e473 100644 --- a/src/test/isolation/specs/eval-plan-qual.spec +++ b/src/test/isolation/specs/eval-plan-qual.spec @@ -76,6 +76,8 @@ setup { BEGIN ISOLATION LEVEL READ COMMITTED; } step wx1 { UPDATE accounts SET balance = balance - 200 WHERE accountid = 'checking' RETURNING balance; } # wy1 then wy2 checks the case where quals pass then fail step wy1 { UPDATE accounts SET balance = balance + 500 WHERE accountid = 'checking' RETURNING balance; } +# wx2 then wb1 checks the case of re-fetching up-to-date values for DELETE ... RETURNING ... +step wb1 { DELETE FROM accounts WHERE balance = 600 RETURNING *; } step wxext1 { UPDATE accounts_ext SET balance = balance - 200 WHERE accountid = 'checking' RETURNING balance; } step tocds1 { UPDATE accounts SET accountid = 'cds' WHERE accountid = 'checking'; } @@ -192,6 +194,12 @@ step simplepartupdate_noroute { update parttbl set b = 2 where c = 1 returning *; } +# test system class LockTuple() + +step sys1 { + UPDATE pg_class SET reltuples = 123 WHERE oid = 'accounts'::regclass; +} + session s2 setup { BEGIN ISOLATION LEVEL READ COMMITTED; } @@ -280,6 +288,18 @@ step wnested2 { ); } +step sysupd2 { + UPDATE pg_class SET reltuples = reltuples * 2 + WHERE oid = 'accounts'::regclass; +} + +step sysmerge2 { + MERGE INTO pg_class + USING (SELECT 'accounts'::regclass AS o) j + ON o = oid + WHEN MATCHED THEN UPDATE SET reltuples = reltuples * 2; +} + step c2 { COMMIT; } step r2 { ROLLBACK; } @@ -353,6 +373,8 @@ permutation wx1 delwcte c1 c2 read # test that a delete to a self-modified row throws error when # previously updated by a different cid permutation wx1 delwctefail c1 c2 read +# test that a delete re-fetches up-to-date values for returning clause +permutation read wx2 wb1 c2 c1 read permutation upsert1 upsert2 c1 c2 read permutation readp1 writep1 readp2 c1 c2 @@ -376,3 +398,6 @@ permutation simplepartupdate complexpartupdate c1 c2 read_part permutation simplepartupdate_route1to2 complexpartupdate_route_err1 c1 c2 read_part permutation simplepartupdate_noroute complexpartupdate_route c1 c2 read_part permutation simplepartupdate_noroute complexpartupdate_doesnt_route c1 c2 read_part + +permutation sys1 sysupd2 c1 c2 +permutation sys1 sysmerge2 c1 c2 diff --git a/src/test/isolation/specs/fk-snapshot.spec b/src/test/isolation/specs/fk-snapshot.spec index 378507fbc3822..9fad57e7689ad 100644 --- a/src/test/isolation/specs/fk-snapshot.spec +++ b/src/test/isolation/specs/fk-snapshot.spec @@ -13,6 +13,11 @@ setup CREATE TABLE fk_noparted ( a int REFERENCES fk_parted_pk ON DELETE NO ACTION INITIALLY DEFERRED ); + + CREATE TABLE fk_noparted_sn ( + a int REFERENCES pk_noparted ON DELETE SET NULL + ); + INSERT INTO pk_noparted VALUES (1); INSERT INTO fk_parted_pk VALUES (1); INSERT INTO fk_noparted VALUES (1); @@ -20,7 +25,7 @@ setup teardown { - DROP TABLE pk_noparted, fk_parted_pk, fk_noparted; + DROP TABLE pk_noparted, fk_parted_pk, fk_noparted, fk_noparted_sn; } session s1 @@ -28,6 +33,7 @@ step s1brr { BEGIN ISOLATION LEVEL REPEATABLE READ; } step s1brc { BEGIN ISOLATION LEVEL READ COMMITTED; } step s1ifp2 { INSERT INTO fk_parted_pk VALUES (2); } step s1ifp1 { INSERT INTO fk_parted_pk VALUES (1); } +step s1ifn2 { INSERT INTO fk_noparted_sn VALUES (2); } step s1dfp { DELETE FROM fk_parted_pk WHERE a = 1; } step s1c { COMMIT; } step s1sfp { SELECT * FROM fk_parted_pk; } @@ -38,6 +44,7 @@ session s2 step s2brr { BEGIN ISOLATION LEVEL REPEATABLE READ; } step s2brc { BEGIN ISOLATION LEVEL READ COMMITTED; } step s2ip2 { INSERT INTO pk_noparted VALUES (2); } +step s2dp2 { DELETE FROM pk_noparted WHERE a = 2; } step s2ifn2 { INSERT INTO fk_noparted VALUES (2); } step s2c { COMMIT; } step s2sfp { SELECT * FROM fk_parted_pk; } @@ -59,3 +66,11 @@ permutation s1brc s2brc s2ip2 s1sp s2c s1sp s1ifp2 s2brc s2sfp s1c s1sfp s2ifn2 # the same no matter the snapshot mode permutation s1brr s1dfp s1ifp1 s1c s1sfn permutation s1brc s1dfp s1ifp1 s1c s1sfn + +# trying to delete a row through DELETE CASCADE, whilst that row is deleted +# in a concurrent transaction +permutation s2ip2 s1brr s1ifp2 s2brr s2dp2 s1c s2c + +# trying to update a row through DELETE SET NULL, whilst that row is deleted +# in a concurrent transaction +permutation s2ip2 s1brr s1ifn2 s2brr s2dp2 s1c s2c diff --git a/src/test/isolation/specs/inplace-inval.spec b/src/test/isolation/specs/inplace-inval.spec new file mode 100644 index 0000000000000..96954fd86c439 --- /dev/null +++ b/src/test/isolation/specs/inplace-inval.spec @@ -0,0 +1,40 @@ +# If a heap_update() caller retrieves its oldtup from a cache, it's possible +# for that cache entry to predate an inplace update, causing loss of that +# inplace update. This arises because the transaction may abort before +# sending the inplace invalidation message to the shared queue. + +setup +{ + CREATE TABLE newly_indexed (c int); +} + +teardown +{ + DROP TABLE newly_indexed; +} + +session s1 +step cir1 { BEGIN; CREATE INDEX i1 ON newly_indexed (c); ROLLBACK; } +step read1 { + SELECT relhasindex FROM pg_class WHERE oid = 'newly_indexed'::regclass; +} + +session s2 +step cic2 { CREATE INDEX i2 ON newly_indexed (c); } + +session s3 +step cachefill3 { TABLE newly_indexed; } +step ddl3 { ALTER TABLE newly_indexed ADD extra int; } + + +# XXX shows an extant bug. Adding step read1 at the end would usually print +# relhasindex=f (not wanted). This does not reach the unwanted behavior under +# -DCATCACHE_FORCE_RELEASE and friends. +permutation + cachefill3 # populates the pg_class row in the catcache + cir1 # sets relhasindex=true; rollback discards cache inval + cic2 # sees relhasindex=true, skips changing it (so no inval) + ddl3 # cached row as the oldtup of an update, losing relhasindex + +# without cachefill3, no bug +permutation cir1 cic2 ddl3 read1 diff --git a/src/test/isolation/specs/insert-conflict-specconflict.spec b/src/test/isolation/specs/insert-conflict-specconflict.spec index 0d55a015b6e5b..6674820867289 100644 --- a/src/test/isolation/specs/insert-conflict-specconflict.spec +++ b/src/test/isolation/specs/insert-conflict-specconflict.spec @@ -31,7 +31,7 @@ setup RETURN $1; END;$$; - CREATE OR REPLACE FUNCTION ctoast_large_val() RETURNS TEXT LANGUAGE SQL AS 'select array_agg(md5(g::text))::text from generate_series(1, 256) g'; + CREATE OR REPLACE FUNCTION ctoast_large_val() RETURNS text LANGUAGE SQL AS $$ select string_agg(encode(sha256(g::text::bytea),'hex'), '')::text from generate_series(1, 133) g $$; CREATE TABLE upserttest(key text, data text); diff --git a/src/test/isolation/specs/intra-grant-inplace-db.spec b/src/test/isolation/specs/intra-grant-inplace-db.spec new file mode 100644 index 0000000000000..9de40ec5c949b --- /dev/null +++ b/src/test/isolation/specs/intra-grant-inplace-db.spec @@ -0,0 +1,45 @@ +# GRANT's lock is the catalog tuple xmax. GRANT doesn't acquire a heavyweight +# lock on the object undergoing an ACL change. In-place updates, namely +# datfrozenxid, need special code to cope. + +setup +{ + CREATE ROLE regress_temp_grantee; +} + +teardown +{ + REVOKE ALL ON DATABASE isolation_regression FROM regress_temp_grantee; + DROP ROLE regress_temp_grantee; +} + +# heap_update(pg_database) +session s1 +step b1 { BEGIN; } +step grant1 { + GRANT TEMP ON DATABASE isolation_regression TO regress_temp_grantee; +} +step c1 { COMMIT; } + +# inplace update +session s2 +step vac2 { VACUUM (FREEZE); } + +# observe datfrozenxid +session s3 +setup { + CREATE TEMP TABLE frozen_witness (x xid); +} +step snap3 { + INSERT INTO frozen_witness + SELECT datfrozenxid FROM pg_database WHERE datname = current_catalog; +} +step cmp3 { + SELECT 'datfrozenxid retreated' + FROM pg_database + WHERE datname = current_catalog + AND age(datfrozenxid) > (SELECT min(age(x)) FROM frozen_witness); +} + + +permutation snap3 b1 grant1 vac2(c1) snap3 c1 cmp3 diff --git a/src/test/isolation/specs/intra-grant-inplace.spec b/src/test/isolation/specs/intra-grant-inplace.spec new file mode 100644 index 0000000000000..9936d389359e5 --- /dev/null +++ b/src/test/isolation/specs/intra-grant-inplace.spec @@ -0,0 +1,161 @@ +# GRANT's lock is the catalog tuple xmax. GRANT doesn't acquire a heavyweight +# lock on the object undergoing an ACL change. Inplace updates, such as +# relhasindex=true, need special code to cope. + +setup +{ + CREATE TABLE intra_grant_inplace (c int); +} + +teardown +{ + DROP TABLE IF EXISTS intra_grant_inplace; +} + +# heap_update() +session s1 +setup { SET deadlock_timeout = '100s'; } +step b1 { BEGIN; } +step grant1 { + GRANT SELECT ON intra_grant_inplace TO PUBLIC; +} +step drop1 { + DROP TABLE intra_grant_inplace; +} +step c1 { COMMIT; } + +# inplace update +session s2 +setup { SET deadlock_timeout = '10ms'; } +step read2 { + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass; +} +step b2 { BEGIN; } +step addk2 { ALTER TABLE intra_grant_inplace ADD PRIMARY KEY (c); } +step sfnku2 { + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR NO KEY UPDATE; +} +step c2 { COMMIT; } + +# rowmarks +session s3 +step b3 { BEGIN ISOLATION LEVEL READ COMMITTED; } +step sfnku3 { + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR NO KEY UPDATE; +} +step sfu3 { + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR UPDATE; +} +step r3 { ROLLBACK; } + +# Additional heap_update() +session s4 +# swallow error message to keep any OID value out of expected output +step revoke4 { + DO $$ + BEGIN + REVOKE SELECT ON intra_grant_inplace FROM PUBLIC; + EXCEPTION WHEN others THEN + RAISE WARNING 'got: %', regexp_replace(sqlerrm, '[0-9]+', 'REDACTED'); + END + $$; +} + +# Additional rowmarks +session s5 +setup { BEGIN; } +step keyshr5 { + SELECT relhasindex FROM pg_class + WHERE oid = 'intra_grant_inplace'::regclass FOR KEY SHARE; +} +teardown { ROLLBACK; } + + +permutation + b1 + grant1 + read2 + addk2(c1) # inplace waits + c1 + read2 + +# inplace thru KEY SHARE +permutation + keyshr5 + addk2 + +# inplace wait NO KEY UPDATE w/ KEY SHARE +permutation + keyshr5 + b3 + sfnku3 + addk2(r3) + r3 + +# reproduce bug in DoesMultiXactIdConflict() call +permutation + b3 + sfnku3 + keyshr5 + addk2(r3) + r3 + +# same-xact rowmark +permutation + b2 + sfnku2 + addk2 + c2 + +# same-xact rowmark in multixact +permutation + keyshr5 + b2 + sfnku2 + addk2 + c2 + +permutation + b3 + sfu3 + b1 + grant1(r3) # acquire LockTuple(), await sfu3 xmax + read2 + addk2(c1) # block in LockTuple() behind grant1 + r3 # unblock grant1; addk2 now awaits grant1 xmax + c1 + read2 + +permutation + b2 + sfnku2 + b1 + grant1(addk2) # acquire LockTuple(), await sfnku2 xmax + addk2(*) # block in LockTuple() behind grant1 = deadlock + c2 + c1 + read2 + +# SearchSysCacheLocked1() calling LockRelease() +permutation + b1 + grant1 + b3 + sfu3(c1) # acquire LockTuple(), await grant1 xmax + revoke4(r3) # block in LockTuple() behind sfu3 + c1 + r3 # revoke4 unlocks old tuple and finds new + +# SearchSysCacheLocked1() finding a tuple, then no tuple +permutation + b1 + drop1 + b3 + sfu3(c1) # acquire LockTuple(), await drop1 xmax + revoke4(sfu3) # block in LockTuple() behind sfu3 + c1 # sfu3 locks none; revoke4 unlocks old and finds none + r3 diff --git a/src/test/isolation/specs/lock-nowait.spec b/src/test/isolation/specs/lock-nowait.spec new file mode 100644 index 0000000000000..bb46d12a79640 --- /dev/null +++ b/src/test/isolation/specs/lock-nowait.spec @@ -0,0 +1,28 @@ +# While requesting nowait lock, if the lock requested should +# be inserted in front of some waiter, check to see if the lock +# conflicts with already-held locks or the requests before +# the waiter. If not, then just grant myself the requested +# lock immediately. Test this scenario. + +setup +{ + CREATE TABLE a1 (); +} + +teardown +{ + DROP TABLE a1; +} + +session s1 +setup { BEGIN; } +step s1a { LOCK TABLE a1 IN ACCESS EXCLUSIVE MODE; } +step s1b { LOCK TABLE a1 IN SHARE ROW EXCLUSIVE MODE NOWAIT; } +step s1c { COMMIT; } + +session s2 +setup { BEGIN; } +step s2a { LOCK TABLE a1 IN EXCLUSIVE MODE; } +step s2c { COMMIT; } + +permutation s1a s2a s1b s1c s2c diff --git a/src/test/isolation/specs/merge-join.spec b/src/test/isolation/specs/merge-join.spec new file mode 100644 index 0000000000000..e33a02ccabcd2 --- /dev/null +++ b/src/test/isolation/specs/merge-join.spec @@ -0,0 +1,45 @@ +# MERGE JOIN +# +# This test checks the EPQ recheck mechanism during MERGE when joining to a +# source table using different join methods, per bug #18103 + +setup +{ + CREATE TABLE src (id int PRIMARY KEY, val int); + CREATE TABLE tgt (id int PRIMARY KEY, val int); + INSERT INTO src SELECT x, x*10 FROM generate_series(1,3) g(x); + INSERT INTO tgt SELECT x, x FROM generate_series(1,3) g(x); +} + +teardown +{ + DROP TABLE src, tgt; +} + +session s1 +step b1 { BEGIN ISOLATION LEVEL READ COMMITTED; } +step m1 { MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); } +step s1 { SELECT * FROM tgt; } +step c1 { COMMIT; } + +session s2 +step b2 { BEGIN ISOLATION LEVEL READ COMMITTED; } +step hj { SET LOCAL enable_mergejoin = off; SET LOCAL enable_nestloop = off; } +step mj { SET LOCAL enable_hashjoin = off; SET LOCAL enable_nestloop = off; } +step nl { SET LOCAL enable_hashjoin = off; SET LOCAL enable_mergejoin = off; } +step ex { EXPLAIN (verbose, costs off) + MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); } +step m2 { MERGE INTO tgt USING src ON tgt.id = src.id + WHEN MATCHED THEN UPDATE SET val = src.val + WHEN NOT MATCHED THEN INSERT VALUES (src.id, src.val); } +step s2 { SELECT * FROM tgt; } +step c2 { COMMIT; } + +permutation b1 m1 s1 c1 b2 m2 s2 c2 +permutation b1 b2 m1 hj ex m2 c1 c2 s1 +permutation b1 b2 m1 mj ex m2 c1 c2 s1 +permutation b1 b2 m1 nl ex m2 c1 c2 s1 diff --git a/src/test/isolation/specs/merge-update.spec b/src/test/isolation/specs/merge-update.spec index e8d01666fe214..a33dcdba53711 100644 --- a/src/test/isolation/specs/merge-update.spec +++ b/src/test/isolation/specs/merge-update.spec @@ -4,6 +4,7 @@ # 1. UPDATEs of PKs that change the join in the ON clause # 2. UPDATEs with WHEN conditions that would fail after concurrent update # 3. UPDATEs with extra ON conditions that would fail after concurrent update +# 4. UPDATEs with duplicate source rows setup { @@ -91,7 +92,10 @@ step "merge2a" WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN - UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val + WHEN NOT MATCHED BY SOURCE THEN + UPDATE set key = t.key + 1, val = t.val || ' source not matched by merge2a' + RETURNING merge_action(), t.*; } step "merge2b" { @@ -121,7 +125,10 @@ step "pa_merge2a" WHEN NOT MATCHED THEN INSERT VALUES (s.key, s.val) WHEN MATCHED THEN - UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; + UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val + WHEN NOT MATCHED BY SOURCE THEN + UPDATE set key = t.key + 1, val = t.val || ' source not matched by pa_merge2a' + RETURNING merge_action(), t.*; } # MERGE proceeds only if 'val' unchanged step "pa_merge2b_when" @@ -134,15 +141,26 @@ step "pa_merge2b_when" WHEN MATCHED AND t.val like 'initial%' THEN UPDATE set key = t.key + 1, val = t.val || ' updated by ' || s.val; } +# Duplicate source row should fail +step "pa_merge2c_dup" +{ + MERGE INTO pa_target t + USING (VALUES (1), (1)) v(a) + ON t.key = v.a + WHEN MATCHED THEN + UPDATE set val = t.val || ' updated by pa_merge2c_dup'; -- should fail +} step "select2" { SELECT * FROM target; } step "pa_select2" { SELECT * FROM pa_target; } step "c2" { COMMIT; } +step "a2" { ABORT; } # Basic effects permutation "merge1" "c1" "select2" "c2" # One after the other, no concurrency permutation "merge1" "c1" "merge2a" "select2" "c2" +permutation "pa_merge1" "c1" "pa_merge2c_dup" "a2" # Now with concurrency permutation "merge1" "merge2a" "c1" "select2" "c2" @@ -154,3 +172,4 @@ permutation "pa_merge2" "pa_merge2a" "c1" "pa_select2" "c2" # fails permutation "pa_merge2" "c1" "pa_merge2a" "pa_select2" "c2" # succeeds permutation "pa_merge3" "pa_merge2b_when" "c1" "pa_select2" "c2" # WHEN not satisfied by updated tuple permutation "pa_merge1" "pa_merge2b_when" "c1" "pa_select2" "c2" # WHEN satisfied by updated tuple +permutation "pa_merge1" "pa_merge2c_dup" "c1" "a2" diff --git a/src/test/isolation/specs/stats.spec b/src/test/isolation/specs/stats.spec index 5b922d788cc0b..1d98ac785b816 100644 --- a/src/test/isolation/specs/stats.spec +++ b/src/test/isolation/specs/stats.spec @@ -107,8 +107,8 @@ step s1_table_stats { # SLRU stats steps step s1_slru_save_stats { - INSERT INTO test_slru_stats VALUES('Notify', 'blks_zeroed', - (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'Notify')); + INSERT INTO test_slru_stats VALUES('notify', 'blks_zeroed', + (SELECT blks_zeroed FROM pg_stat_slru WHERE name = 'notify')); } step s1_listen { LISTEN stats_test_nothing; } step s1_big_notify { SELECT pg_notify('stats_test_use', @@ -543,10 +543,10 @@ permutation s1_table_insert s1_begin s1_table_update_k1 # should *not* be counted, different rel - s1_table_update_k1 # dito + s1_table_update_k1 # ditto s1_table_truncate s1_table_insert_k1 # should be counted - s1_table_update_k1 # dito + s1_table_update_k1 # ditto s1_prepare_a s1_commit_prepared_a s1_ff @@ -557,10 +557,10 @@ permutation s1_table_insert s1_begin s1_table_update_k1 # should *not* be counted, different rel - s1_table_update_k1 # dito + s1_table_update_k1 # ditto s1_table_truncate s1_table_insert_k1 # should be counted - s1_table_update_k1 # dito + s1_table_update_k1 # ditto s1_prepare_a s1_ff # flush out non-transactional stats, might happen anyway s2_commit_prepared_a @@ -572,10 +572,10 @@ permutation s1_table_insert s1_begin s1_table_update_k1 # should be counted - s1_table_update_k1 # dito + s1_table_update_k1 # ditto s1_table_truncate s1_table_insert_k1 # should *not* be counted, different rel - s1_table_update_k1 # dito + s1_table_update_k1 # ditto s1_prepare_a s1_rollback_prepared_a s1_ff @@ -586,10 +586,10 @@ permutation s1_table_insert s1_begin s1_table_update_k1 # should be counted - s1_table_update_k1 # dito + s1_table_update_k1 # ditto s1_table_truncate s1_table_insert_k1 # should *not* be counted, different rel - s1_table_update_k1 # dito + s1_table_update_k1 # ditto s1_prepare_a s2_rollback_prepared_a s1_ff s2_ff diff --git a/src/test/isolation/specs/temp-schema-cleanup.spec b/src/test/isolation/specs/temp-schema-cleanup.spec index a9417b7e905b0..72decba6cbf47 100644 --- a/src/test/isolation/specs/temp-schema-cleanup.spec +++ b/src/test/isolation/specs/temp-schema-cleanup.spec @@ -30,7 +30,7 @@ step s1_create_temp_objects { CREATE OR REPLACE FUNCTION pg_temp.long() RETURNS text LANGUAGE sql AS $body$ SELECT %L; $body$$outer$, (SELECT string_agg(g.i::text||':'||random()::text, '|') FROM generate_series(1, 100) g(i)))); - -- The above bug requirs function removal to happen after a catalog + -- The above bug requires function removal to happen after a catalog -- invalidation. dependency.c sorts objects in descending oid order so -- that newer objects are deleted before older objects, so create a -- table after. diff --git a/src/test/isolation/specscanner.l b/src/test/isolation/specscanner.l index b1c23fa6ad204..a643002804a2c 100644 --- a/src/test/isolation/specscanner.l +++ b/src/test/isolation/specscanner.l @@ -4,7 +4,7 @@ * specscanner.l * a lexical scanner for an isolation test specification * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * *------------------------------------------------------------------------- diff --git a/src/test/kerberos/Makefile b/src/test/kerberos/Makefile index f460d2c0e70b3..3bb85b95431c5 100644 --- a/src/test/kerberos/Makefile +++ b/src/test/kerberos/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/test/kerberos # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/test/kerberos/Makefile @@ -24,5 +24,5 @@ check: installcheck: $(prove_installcheck) -clean distclean maintainer-clean: +clean distclean: rm -rf tmp_check diff --git a/src/test/kerberos/meson.build b/src/test/kerberos/meson.build index bc6d36f360cd4..b5a18c8df2d08 100644 --- a/src/test/kerberos/meson.build +++ b/src/test/kerberos/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tests += { 'name': 'kerberos', diff --git a/src/test/kerberos/t/001_auth.pl b/src/test/kerberos/t/001_auth.pl index 0deb9bffc8de9..d4f1ec5809215 100644 --- a/src/test/kerberos/t/001_auth.pl +++ b/src/test/kerberos/t/001_auth.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Sets up a KDC and then runs a variety of tests to make sure that the # GSSAPI/Kerberos authentication and encryption are working properly, @@ -18,9 +18,10 @@ # See the README for additional information. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Kerberos; use Test::More; use Time::HiRes qw(usleep); @@ -28,183 +29,33 @@ { plan skip_all => 'GSSAPI/Kerberos not supported by this build'; } -elsif ($ENV{PG_TEST_EXTRA} !~ /\bkerberos\b/) +elsif (!$ENV{PG_TEST_EXTRA} || $ENV{PG_TEST_EXTRA} !~ /\bkerberos\b/) { plan skip_all => 'Potentially unsafe test GSSAPI/Kerberos not enabled in PG_TEST_EXTRA'; } -my ($krb5_bin_dir, $krb5_sbin_dir); - -if ($^O eq 'darwin' && -d "/opt/homebrew") -{ - # typical paths for Homebrew on ARM - $krb5_bin_dir = '/opt/homebrew/opt/krb5/bin'; - $krb5_sbin_dir = '/opt/homebrew/opt/krb5/sbin'; -} -elsif ($^O eq 'darwin') -{ - # typical paths for Homebrew on Intel - $krb5_bin_dir = '/usr/local/opt/krb5/bin'; - $krb5_sbin_dir = '/usr/local/opt/krb5/sbin'; -} -elsif ($^O eq 'freebsd') -{ - $krb5_bin_dir = '/usr/local/bin'; - $krb5_sbin_dir = '/usr/local/sbin'; -} -elsif ($^O eq 'linux') -{ - $krb5_sbin_dir = '/usr/sbin'; -} - -my $krb5_config = 'krb5-config'; -my $kinit = 'kinit'; -my $klist = 'klist'; -my $kdb5_util = 'kdb5_util'; -my $kadmin_local = 'kadmin.local'; -my $krb5kdc = 'krb5kdc'; - -if ($krb5_bin_dir && -d $krb5_bin_dir) -{ - $krb5_config = $krb5_bin_dir . '/' . $krb5_config; - $kinit = $krb5_bin_dir . '/' . $kinit; - $klist = $krb5_bin_dir . '/' . $klist; -} -if ($krb5_sbin_dir && -d $krb5_sbin_dir) -{ - $kdb5_util = $krb5_sbin_dir . '/' . $kdb5_util; - $kadmin_local = $krb5_sbin_dir . '/' . $kadmin_local; - $krb5kdc = $krb5_sbin_dir . '/' . $krb5kdc; -} - -my $host = 'auth-test-localhost.postgresql.example.com'; -my $hostaddr = '127.0.0.1'; -my $realm = 'EXAMPLE.COM'; - -my $krb5_conf = "${PostgreSQL::Test::Utils::tmp_check}/krb5.conf"; -my $kdc_conf = "${PostgreSQL::Test::Utils::tmp_check}/kdc.conf"; -my $krb5_cache = "${PostgreSQL::Test::Utils::tmp_check}/krb5cc"; -my $krb5_log = "${PostgreSQL::Test::Utils::log_path}/krb5libs.log"; -my $kdc_log = "${PostgreSQL::Test::Utils::log_path}/krb5kdc.log"; -my $kdc_port = PostgreSQL::Test::Cluster::get_free_port(); -my $kdc_datadir = "${PostgreSQL::Test::Utils::tmp_check}/krb5kdc"; -my $kdc_pidfile = "${PostgreSQL::Test::Utils::tmp_check}/krb5kdc.pid"; -my $keytab = "${PostgreSQL::Test::Utils::tmp_check}/krb5.keytab"; - my $pgpass = "${PostgreSQL::Test::Utils::tmp_check}/.pgpass"; my $dbname = 'postgres'; my $username = 'test1'; my $application = '001_auth.pl'; -note "setting up Kerberos"; - -my ($stdout, $krb5_version); -run_log [ $krb5_config, '--version' ], '>', \$stdout - or BAIL_OUT("could not execute krb5-config"); -BAIL_OUT("Heimdal is not supported") if $stdout =~ m/heimdal/; -$stdout =~ m/Kerberos 5 release ([0-9]+\.[0-9]+)/ - or BAIL_OUT("could not get Kerberos version"); -$krb5_version = $1; - # Construct a pgpass file to make sure we don't use it append_to_file($pgpass, '*:*:*:*:abc123'); -chmod 0600, $pgpass; - -# Build the krb5.conf to use. -# -# Explicitly specify the default (test) realm and the KDC for -# that realm to avoid the Kerberos library trying to look up -# that information in DNS, and also because we're using a -# non-standard KDC port. -# -# Also explicitly disable DNS lookups since this isn't really -# our domain and we shouldn't be causing random DNS requests -# to be sent out (not to mention that broken DNS environments -# can cause the tests to take an extra long time and timeout). -# -# Reverse DNS is explicitly disabled to avoid any issue with a -# captive portal or other cases where the reverse DNS succeeds -# and the Kerberos library uses that as the canonical name of -# the host and then tries to acquire a cross-realm ticket. -append_to_file( - $krb5_conf, - qq![logging] -default = FILE:$krb5_log -kdc = FILE:$kdc_log - -[libdefaults] -dns_lookup_realm = false -dns_lookup_kdc = false -default_realm = $realm -forwardable = false -rdns = false - -[realms] -$realm = { - kdc = $hostaddr:$kdc_port -} -!); - -append_to_file( - $kdc_conf, - qq![kdcdefaults] -!); - -# For new-enough versions of krb5, use the _listen settings rather -# than the _ports settings so that we can bind to localhost only. -if ($krb5_version >= 1.15) -{ - append_to_file( - $kdc_conf, - qq!kdc_listen = $hostaddr:$kdc_port -kdc_tcp_listen = $hostaddr:$kdc_port -!); -} -else -{ - append_to_file( - $kdc_conf, - qq!kdc_ports = $kdc_port -kdc_tcp_ports = $kdc_port -!); -} -append_to_file( - $kdc_conf, - qq! -[realms] -$realm = { - database_name = $kdc_datadir/principal - admin_keytab = FILE:$kdc_datadir/kadm5.keytab - acl_file = $kdc_datadir/kadm5.acl - key_stash_file = $kdc_datadir/_k5.$realm -}!); +chmod 0600, $pgpass or die $!; -mkdir $kdc_datadir or die; - -# Ensure that we use test's config and cache files, not global ones. -$ENV{'KRB5_CONFIG'} = $krb5_conf; -$ENV{'KRB5_KDC_PROFILE'} = $kdc_conf; -$ENV{'KRB5CCNAME'} = $krb5_cache; +note "setting up Kerberos"; -my $service_principal = "$ENV{with_krb_srvnam}/$host"; +my $host = 'auth-test-localhost.postgresql.example.com'; +my $hostaddr = '127.0.0.1'; +my $realm = 'EXAMPLE.COM'; -system_or_bail $kdb5_util, 'create', '-s', '-P', 'secret0'; +my $krb = PostgreSQL::Test::Kerberos->new($host, $hostaddr, $realm); my $test1_password = 'secret1'; -system_or_bail $kadmin_local, '-q', "addprinc -pw $test1_password test1"; - -system_or_bail $kadmin_local, '-q', "addprinc -randkey $service_principal"; -system_or_bail $kadmin_local, '-q', "ktadd -k $keytab $service_principal"; - -system_or_bail $krb5kdc, '-P', $kdc_pidfile; - -END -{ - kill 'INT', `cat $kdc_pidfile` if -f $kdc_pidfile; -} +$krb->create_principal('test1', $test1_password); note "setting up PostgreSQL instance"; @@ -213,7 +64,7 @@ END $node->append_conf( 'postgresql.conf', qq{ listen_addresses = '$hostaddr' -krb_server_keyfile = '$keytab' +krb_server_keyfile = '$krb->{keytab}' log_connections = on lc_messages = 'C' }); @@ -327,8 +178,7 @@ sub test_query test_access($node, 'test1', 'SELECT true', 2, '', 'fails without ticket'); -run_log [ $kinit, 'test1' ], \$test1_password or BAIL_OUT($?); -run_log [ $klist, '-f' ] or BAIL_OUT($?); +$krb->create_ticket('test1', $test1_password); test_access( $node, @@ -470,10 +320,8 @@ sub test_query hostgssenc all all $hostaddr/32 gss map=mymap }); -string_replace_file($krb5_conf, "forwardable = false", "forwardable = true"); - -run_log [ $kinit, 'test1' ], \$test1_password or BAIL_OUT($?); -run_log [ $klist, '-f' ] or BAIL_OUT($?); +# Re-create the ticket, with the forwardable flag set +$krb->create_ticket('test1', $test1_password, forwardable => 1); test_access( $node, diff --git a/src/test/ldap/LdapServer.pm b/src/test/ldap/LdapServer.pm index a4c1a1843c8b8..3866a56e0a6b4 100644 --- a/src/test/ldap/LdapServer.pm +++ b/src/test/ldap/LdapServer.pm @@ -5,7 +5,7 @@ # # Module to set up an LDAP server for testing pg_hba.conf ldap authentication # -# Copyright (c) 2023, PostgreSQL Global Development Group +# Copyright (c) 2023-2024, PostgreSQL Global Development Group # ############################################################################ @@ -46,7 +46,7 @@ LdapServer - class for an LDAP server for testing pg_hba.conf authentication package LdapServer; use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; @@ -57,55 +57,97 @@ use File::Basename; # private variables my ($slapd, $ldap_schema_dir, @servers); -# visible variable -our ($setup); +# visible variables +our ($setup, $setup_error); INIT { + # Find the OpenLDAP server binary and directory containing schema + # definition files. On success, $setup is set to 1. On failure, + # it's set to 0, and an error message is set in $setup_error. $setup = 1; - if ($^O eq 'darwin' && -d '/opt/homebrew/opt/openldap') + if ($^O eq 'darwin') { - # typical paths for Homebrew on ARM - $slapd = '/opt/homebrew/opt/openldap/libexec/slapd'; - $ldap_schema_dir = '/opt/homebrew/etc/openldap/schema'; - } - elsif ($^O eq 'darwin' && -d '/usr/local/opt/openldap') - { - # typical paths for Homebrew on Intel - $slapd = '/usr/local/opt/openldap/libexec/slapd'; - $ldap_schema_dir = '/usr/local/etc/openldap/schema'; - } - elsif ($^O eq 'darwin' && -d '/opt/local/etc/openldap') - { - # typical paths for MacPorts - $slapd = '/opt/local/libexec/slapd'; - $ldap_schema_dir = '/opt/local/etc/openldap/schema'; + if (-d '/opt/homebrew/opt/openldap') + { + # typical paths for Homebrew on ARM + $slapd = '/opt/homebrew/opt/openldap/libexec/slapd'; + $ldap_schema_dir = '/opt/homebrew/etc/openldap/schema'; + } + elsif (-d '/usr/local/opt/openldap') + { + # typical paths for Homebrew on Intel + $slapd = '/usr/local/opt/openldap/libexec/slapd'; + $ldap_schema_dir = '/usr/local/etc/openldap/schema'; + } + elsif (-d '/opt/local/etc/openldap') + { + # typical paths for MacPorts + $slapd = '/opt/local/libexec/slapd'; + $ldap_schema_dir = '/opt/local/etc/openldap/schema'; + } + else + { + $setup_error = "OpenLDAP server installation not found"; + $setup = 0; + } } elsif ($^O eq 'linux') { - $slapd = '/usr/sbin/slapd'; - $ldap_schema_dir = '/etc/ldap/schema' if -d '/etc/ldap/schema'; - $ldap_schema_dir = '/etc/openldap/schema' - if -d '/etc/openldap/schema'; + if (-d '/etc/ldap/schema') + { + $slapd = '/usr/sbin/slapd'; + $ldap_schema_dir = '/etc/ldap/schema'; + } + elsif (-d '/etc/openldap/schema') + { + $slapd = '/usr/sbin/slapd'; + $ldap_schema_dir = '/etc/openldap/schema'; + } + else + { + $setup_error = "OpenLDAP server installation not found"; + $setup = 0; + } } elsif ($^O eq 'freebsd') { - $slapd = '/usr/local/libexec/slapd'; - $ldap_schema_dir = '/usr/local/etc/openldap/schema'; + if (-d '/usr/local/etc/openldap/schema') + { + $slapd = '/usr/local/libexec/slapd'; + $ldap_schema_dir = '/usr/local/etc/openldap/schema'; + } + else + { + $setup_error = "OpenLDAP server installation not found"; + $setup = 0; + } } elsif ($^O eq 'openbsd') { - $slapd = '/usr/local/libexec/slapd'; - $ldap_schema_dir = '/usr/local/share/examples/openldap/schema'; + if (-d '/usr/local/share/examples/openldap/schema') + { + $slapd = '/usr/local/libexec/slapd'; + $ldap_schema_dir = '/usr/local/share/examples/openldap/schema'; + } + else + { + $setup_error = "OpenLDAP server installation not found"; + $setup = 0; + } } else { + $setup_error = "ldap tests not supported on $^O"; $setup = 0; } } END { + # take care not to change the script's exit value + my $exit_code = $?; + foreach my $server (@servers) { next unless -f $server->{pidfile}; @@ -113,6 +155,8 @@ END chomp $pid; kill 'INT', $pid; } + + $? = $exit_code; } =pod diff --git a/src/test/ldap/Makefile b/src/test/ldap/Makefile index 73bc878ea8ef1..72953cc3f627f 100644 --- a/src/test/ldap/Makefile +++ b/src/test/ldap/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/test/ldap # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/test/ldap/Makefile @@ -21,5 +21,5 @@ check: installcheck: $(prove_installcheck) -clean distclean maintainer-clean: +clean distclean: rm -rf tmp_check diff --git a/src/test/ldap/meson.build b/src/test/ldap/meson.build index 7bf397a545711..b8602e752f1cf 100644 --- a/src/test/ldap/meson.build +++ b/src/test/ldap/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tests += { 'name': 'ldap', diff --git a/src/test/ldap/t/001_auth.pl b/src/test/ldap/t/001_auth.pl index 3e113fd6ebb53..850db34503f11 100644 --- a/src/test/ldap/t/001_auth.pl +++ b/src/test/ldap/t/001_auth.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use FindBin; use lib "$FindBin::RealBin/.."; @@ -18,15 +18,14 @@ { plan skip_all => 'LDAP not supported by this build'; } -elsif ($ENV{PG_TEST_EXTRA} !~ /\bldap\b/) +elsif (!$ENV{PG_TEST_EXTRA} || $ENV{PG_TEST_EXTRA} !~ /\bldap\b/) { plan skip_all => 'Potentially unsafe test LDAP not enabled in PG_TEST_EXTRA'; } elsif (!$LdapServer::setup) { - plan skip_all => - "ldap tests not supported on $^O or dependencies not installed"; + plan skip_all => $LdapServer::setup_error; } note "setting up LDAP server"; diff --git a/src/test/ldap/t/002_bindpasswd.pl b/src/test/ldap/t/002_bindpasswd.pl index bcd4aa2b742fe..a89e363546f6f 100644 --- a/src/test/ldap/t/002_bindpasswd.pl +++ b/src/test/ldap/t/002_bindpasswd.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2023, PostgreSQL Global Development Group +# Copyright (c) 2023-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use FindBin; use lib "$FindBin::RealBin/.."; @@ -18,15 +18,14 @@ { plan skip_all => 'LDAP not supported by this build'; } -elsif ($ENV{PG_TEST_EXTRA} !~ /\bldap\b/) +elsif (!$ENV{PG_TEST_EXTRA} || $ENV{PG_TEST_EXTRA} !~ /\bldap\b/) { plan skip_all => 'Potentially unsafe test LDAP not enabled in PG_TEST_EXTRA'; } elsif (!$LdapServer::setup) { - plan skip_all => - "ldap tests not supported on $^O or dependencies not installed"; + plan skip_all => $LdapServer::setup_error; } note "setting up LDAP server"; diff --git a/src/test/locale/Makefile b/src/test/locale/Makefile index 7ba096b542710..a40c67af07f7e 100644 --- a/src/test/locale/Makefile +++ b/src/test/locale/Makefile @@ -10,7 +10,7 @@ DIRS = de_DE.ISO8859-1 gr_GR.ISO8859-7 koi8-r koi8-to-win1251 all: $(PROGS) -clean distclean maintainer-clean: +clean distclean: rm -f $(PROGS) *.o rm -rf tmp_check for d in $(DIRS); do \ diff --git a/src/test/locale/sort-test.pl b/src/test/locale/sort-test.pl index 8bed29b3ad946..78b58b1cdcc66 100755 --- a/src/test/locale/sort-test.pl +++ b/src/test/locale/sort-test.pl @@ -1,9 +1,9 @@ #! /usr/bin/perl -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use locale; open(my $in_fh, '<', $ARGV[0]) || die; diff --git a/src/test/meson.build b/src/test/meson.build index 5f3c9c2ba2282..c3d0dfedf1c5f 100644 --- a/src/test/meson.build +++ b/src/test/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group subdir('regress') subdir('isolation') diff --git a/src/test/modules/Makefile b/src/test/modules/Makefile index 6331c976dcb60..9651f9e5e1841 100644 --- a/src/test/modules/Makefile +++ b/src/test/modules/Makefile @@ -12,28 +12,42 @@ SUBDIRS = \ dummy_seclabel \ libpq_pipeline \ plsample \ - snapshot_too_old \ spgist_name_ops \ test_bloomfilter \ test_copy_callbacks \ test_custom_rmgrs \ test_ddl_deparse \ + test_dsa \ + test_dsm_registry \ + test_escape \ test_extensions \ test_ginpostinglist \ test_integerset \ + test_json_parser \ test_lfind \ test_misc \ test_oat_hooks \ test_parser \ test_pg_dump \ test_predtest \ + test_radixtree \ test_rbtree \ test_regex \ + test_resowner \ test_rls_hooks \ test_shm_mq \ test_slru \ + test_tidstore \ unsafe_tests \ - worker_spi + worker_spi \ + xid_wraparound + + +ifeq ($(enable_injection_points),yes) +SUBDIRS += injection_points gin +else +ALWAYS_SUBDIRS += injection_points gin +endif ifeq ($(with_ssl),openssl) SUBDIRS += ssl_passphrase_callback diff --git a/src/test/modules/brin/meson.build b/src/test/modules/brin/meson.build index d20633a7dc69a..7703ce4236bed 100644 --- a/src/test/modules/brin/meson.build +++ b/src/test/modules/brin/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tests += { 'name': 'brin', diff --git a/src/test/modules/brin/t/01_workitems.pl b/src/test/modules/brin/t/01_workitems.pl index 5f710742314af..b56e40d2d416c 100644 --- a/src/test/modules/brin/t/01_workitems.pl +++ b/src/test/modules/brin/t/01_workitems.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Verify that work items work correctly use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/modules/brin/t/02_wal_consistency.pl b/src/test/modules/brin/t/02_wal_consistency.pl index 8b2b244feb918..8325400bffa02 100644 --- a/src/test/modules/brin/t/02_wal_consistency.pl +++ b/src/test/modules/brin/t/02_wal_consistency.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Verify WAL consistency use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/modules/commit_ts/meson.build b/src/test/modules/commit_ts/meson.build index f8143a7bc5c4f..b99401bb0987d 100644 --- a/src/test/modules/commit_ts/meson.build +++ b/src/test/modules/commit_ts/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tests += { 'name': 'commit_ts', diff --git a/src/test/modules/commit_ts/t/001_base.pl b/src/test/modules/commit_ts/t/001_base.pl index ae3fc5f52d20b..e608ec67704af 100644 --- a/src/test/modules/commit_ts/t/001_base.pl +++ b/src/test/modules/commit_ts/t/001_base.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Single-node test: value can be set, and is still present after recovery use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/modules/commit_ts/t/002_standby.pl b/src/test/modules/commit_ts/t/002_standby.pl index 59cc2b1244bca..bc4f1b05c64bc 100644 --- a/src/test/modules/commit_ts/t/002_standby.pl +++ b/src/test/modules/commit_ts/t/002_standby.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test simple scenario involving a standby use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/modules/commit_ts/t/003_standby_2.pl b/src/test/modules/commit_ts/t/003_standby_2.pl index 5af511e369c26..2bf606732ba2e 100644 --- a/src/test/modules/commit_ts/t/003_standby_2.pl +++ b/src/test/modules/commit_ts/t/003_standby_2.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test primary/standby scenario where the track_commit_timestamp GUC is # repeatedly toggled on and off. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/modules/commit_ts/t/004_restart.pl b/src/test/modules/commit_ts/t/004_restart.pl index 8fe4bedb140d4..7383bd6e9a501 100644 --- a/src/test/modules/commit_ts/t/004_restart.pl +++ b/src/test/modules/commit_ts/t/004_restart.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Testing of commit timestamps preservation across restarts use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/modules/delay_execution/delay_execution.c b/src/test/modules/delay_execution/delay_execution.c index 7cd76eb34b8cc..155c8a8d556b4 100644 --- a/src/test/modules/delay_execution/delay_execution.c +++ b/src/test/modules/delay_execution/delay_execution.c @@ -10,7 +10,7 @@ * test behaviors where some specified action happens in another backend * between parsing and execution of any desired query. * - * Copyright (c) 2020-2023, PostgreSQL Global Development Group + * Copyright (c) 2020-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/delay_execution/delay_execution.c diff --git a/src/test/modules/delay_execution/meson.build b/src/test/modules/delay_execution/meson.build index 9f33b19cb7bef..41f3ac0b8949e 100644 --- a/src/test/modules/delay_execution/meson.build +++ b/src/test/modules/delay_execution/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group delay_execution_sources = files( 'delay_execution.c', diff --git a/src/test/modules/dummy_index_am/dummy_index_am.c b/src/test/modules/dummy_index_am/dummy_index_am.c index c14e0abe0c6c4..18185d020672d 100644 --- a/src/test/modules/dummy_index_am/dummy_index_am.c +++ b/src/test/modules/dummy_index_am/dummy_index_am.c @@ -3,7 +3,7 @@ * dummy_index_am.c * Index AM template main file. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -32,7 +32,7 @@ relopt_kind di_relopt_kind; typedef enum DummyAmEnum { DUMMY_AM_ENUM_ONE, - DUMMY_AM_ENUM_TWO + DUMMY_AM_ENUM_TWO, } DummyAmEnum; /* Dummy index options */ @@ -294,6 +294,7 @@ dihandler(PG_FUNCTION_ARGS) amroutine->amclusterable = false; amroutine->ampredlocks = false; amroutine->amcanparallel = false; + amroutine->amcanbuildparallel = false; amroutine->amcaninclude = false; amroutine->amusemaintenanceworkmem = false; amroutine->amsummarizing = false; diff --git a/src/test/modules/dummy_index_am/meson.build b/src/test/modules/dummy_index_am/meson.build index 86bbc641bc50f..f23787c732f1f 100644 --- a/src/test/modules/dummy_index_am/meson.build +++ b/src/test/modules/dummy_index_am/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group dummy_index_am_sources = files( 'dummy_index_am.c', diff --git a/src/test/modules/dummy_seclabel/dummy_seclabel.c b/src/test/modules/dummy_seclabel/dummy_seclabel.c index fea8d67969087..aded20e1bede7 100644 --- a/src/test/modules/dummy_seclabel/dummy_seclabel.c +++ b/src/test/modules/dummy_seclabel/dummy_seclabel.c @@ -7,7 +7,7 @@ * perspective, but allows regression testing independent of platform-specific * features like SELinux. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California */ #include "postgres.h" diff --git a/src/test/modules/dummy_seclabel/meson.build b/src/test/modules/dummy_seclabel/meson.build index a804caf56975b..2e0e8741b99de 100644 --- a/src/test/modules/dummy_seclabel/meson.build +++ b/src/test/modules/dummy_seclabel/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group dummy_seclabel_sources = files( 'dummy_seclabel.c', diff --git a/contrib/adminpack/.gitignore b/src/test/modules/gin/.gitignore similarity index 100% rename from contrib/adminpack/.gitignore rename to src/test/modules/gin/.gitignore diff --git a/src/test/modules/gin/Makefile b/src/test/modules/gin/Makefile new file mode 100644 index 0000000000000..e007e38ac27c6 --- /dev/null +++ b/src/test/modules/gin/Makefile @@ -0,0 +1,28 @@ +# src/test/modules/gin/Makefile + +EXTRA_INSTALL = src/test/modules/injection_points + +REGRESS = gin_incomplete_splits + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/gin +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global + +# XXX: This test is conditional on enable_injection_points in the +# parent Makefile, so we should never get here in the first place if +# injection points are not enabled. But the buildfarm 'misc-check' +# step doesn't pay attention to the if-condition in the parent +# Makefile. To work around that, disable running the test here too. +ifeq ($(enable_injection_points),yes) +include $(top_srcdir)/contrib/contrib-global.mk +else +check: + @echo "injection points are disabled in this build" +endif + +endif diff --git a/src/test/modules/gin/expected/gin_incomplete_splits.out b/src/test/modules/gin/expected/gin_incomplete_splits.out new file mode 100644 index 0000000000000..15574e547ac9a --- /dev/null +++ b/src/test/modules/gin/expected/gin_incomplete_splits.out @@ -0,0 +1,194 @@ +-- +-- The test uses a GIN index over int[]. The table contains arrays +-- with integers from 1 to :next_i. Each integer occurs exactly once, +-- no gaps or duplicates, although the index does contain some +-- duplicate elements because some of the inserting transactions are +-- rolled back during the test. The exact contents of the table depend +-- on the physical layout of the index, which in turn depends at least +-- on the block size, so instead of check for the exact contents, we +-- check those invariants. :next_i psql variable is maintained at all +-- times to hold the last inserted integer + 1. +-- +-- This uses injection points to cause errors that leave some page +-- splits in "incomplete" state +create extension injection_points; +-- Make all injection points local to this process, for concurrency. +SELECT injection_points_set_local(); + injection_points_set_local +---------------------------- + +(1 row) + +-- Use the index for all the queries +set enable_seqscan=off; +-- Print a NOTICE whenever an incomplete split gets fixed +SELECT injection_points_attach('gin-finish-incomplete-split', 'notice'); + injection_points_attach +------------------------- + +(1 row) + +-- +-- First create the test table and some helper functions +-- +create table gin_incomplete_splits(i int4[]) with (autovacuum_enabled = off); +create index on gin_incomplete_splits using gin (i) with (fastupdate = off); +-- Creates an array with all integers from $1 (inclusive) $2 (exclusive) +create function range_array(int, int) returns int[] language sql immutable as $$ + select array_agg(g) from generate_series($1, $2 - 1) g +$$; +-- Inserts an array with 'n' rows to the test table. Pass :next_i as +-- the first argument, returns the new value for :next_i. +create function insert_n(first_i int, n int) returns int language plpgsql as $$ +begin + insert into gin_incomplete_splits values (range_array(first_i, first_i+n)); + return first_i + n; +end; +$$; +-- Inserts to the table until an insert fails. Like insert_n(), returns the +-- new value for :next_i. +create function insert_until_fail(next_i int, step int default 1) returns int language plpgsql as $$ +declare + i integer; +begin + -- Insert arrays with 'step' elements each, until an error occurs. + i := 0; + loop + begin + select insert_n(next_i, step) into next_i; + exception when others then + raise notice 'failed with: %', sqlerrm; + exit; + end; + + -- The caller is expected to set an injection point that eventually + -- causes an error. But bail out if still no error after 10000 + -- attempts, so that we don't get stuck in an infinite loop. + i := i + 1; + if i = 10000 then + raise 'no error on inserts after % iterations', i; + end if; + end loop; + + return next_i; +end; +$$; +-- Check the invariants. +create function verify(next_i int) returns bool language plpgsql as $$ +declare + a integer[]; + elem integer; + c integer; +begin + -- Perform a scan over the trailing part of the index, where the + -- possible incomplete splits are. (We don't check the whole table, + -- because that'd be pretty slow.) + c := 0; + -- Find all arrays that overlap with the last 200 inserted integers. Or + -- the next 100, which shouldn't exist. + for a in select i from gin_incomplete_splits where i && range_array(next_i - 200, next_i + 100) + loop + -- count all elements in those arrays in the window. + foreach elem in ARRAY a loop + if elem >= next_i then + raise 'unexpected value % in array', elem; + end if; + if elem >= next_i - 200 then + c := c + 1; + end if; + end loop; + end loop; + if c <> 200 then + raise 'unexpected count % ', c; + end if; + + return true; +end; +$$; +-- Insert one array to get started. +select insert_n(1, 1000) as next_i +\gset +select verify(:next_i); + verify +-------- + t +(1 row) + +-- +-- Test incomplete leaf split +-- +SELECT injection_points_attach('gin-leave-leaf-split-incomplete', 'error'); + injection_points_attach +------------------------- + +(1 row) + +select insert_until_fail(:next_i) as next_i +\gset +NOTICE: failed with: error triggered for injection point gin-leave-leaf-split-incomplete +SELECT injection_points_detach('gin-leave-leaf-split-incomplete'); + injection_points_detach +------------------------- + +(1 row) + +-- Verify that a scan works even though there's an incomplete split +select verify(:next_i); + verify +-------- + t +(1 row) + +-- Insert some more rows, finishing the split +select insert_n(:next_i, 10) as next_i +\gset +NOTICE: notice triggered for injection point gin-finish-incomplete-split +-- Verify that a scan still works +select verify(:next_i); + verify +-------- + t +(1 row) + +-- +-- Test incomplete internal page split +-- +SELECT injection_points_attach('gin-leave-internal-split-incomplete', 'error'); + injection_points_attach +------------------------- + +(1 row) + +select insert_until_fail(:next_i, 100) as next_i +\gset +NOTICE: failed with: error triggered for injection point gin-leave-internal-split-incomplete +SELECT injection_points_detach('gin-leave-internal-split-incomplete'); + injection_points_detach +------------------------- + +(1 row) + + -- Verify that a scan works even though there's an incomplete split +select verify(:next_i); + verify +-------- + t +(1 row) + +-- Insert some more rows, finishing the split +select insert_n(:next_i, 10) as next_i +\gset +NOTICE: notice triggered for injection point gin-finish-incomplete-split +-- Verify that a scan still works +select verify(:next_i); + verify +-------- + t +(1 row) + +SELECT injection_points_detach('gin-finish-incomplete-split'); + injection_points_detach +------------------------- + +(1 row) + diff --git a/src/test/modules/gin/meson.build b/src/test/modules/gin/meson.build new file mode 100644 index 0000000000000..9734b51de2d4b --- /dev/null +++ b/src/test/modules/gin/meson.build @@ -0,0 +1,16 @@ +# Copyright (c) 2022-2024, PostgreSQL Global Development Group + +if not get_option('injection_points') + subdir_done() +endif + +tests += { + 'name': 'gin', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'regress': { + 'sql': [ + 'gin_incomplete_splits', + ], + }, +} diff --git a/src/test/modules/gin/sql/gin_incomplete_splits.sql b/src/test/modules/gin/sql/gin_incomplete_splits.sql new file mode 100644 index 0000000000000..ebf0f620f0c1a --- /dev/null +++ b/src/test/modules/gin/sql/gin_incomplete_splits.sql @@ -0,0 +1,150 @@ +-- +-- The test uses a GIN index over int[]. The table contains arrays +-- with integers from 1 to :next_i. Each integer occurs exactly once, +-- no gaps or duplicates, although the index does contain some +-- duplicate elements because some of the inserting transactions are +-- rolled back during the test. The exact contents of the table depend +-- on the physical layout of the index, which in turn depends at least +-- on the block size, so instead of check for the exact contents, we +-- check those invariants. :next_i psql variable is maintained at all +-- times to hold the last inserted integer + 1. +-- + +-- This uses injection points to cause errors that leave some page +-- splits in "incomplete" state +create extension injection_points; + +-- Make all injection points local to this process, for concurrency. +SELECT injection_points_set_local(); + +-- Use the index for all the queries +set enable_seqscan=off; + +-- Print a NOTICE whenever an incomplete split gets fixed +SELECT injection_points_attach('gin-finish-incomplete-split', 'notice'); + +-- +-- First create the test table and some helper functions +-- +create table gin_incomplete_splits(i int4[]) with (autovacuum_enabled = off); + +create index on gin_incomplete_splits using gin (i) with (fastupdate = off); + +-- Creates an array with all integers from $1 (inclusive) $2 (exclusive) +create function range_array(int, int) returns int[] language sql immutable as $$ + select array_agg(g) from generate_series($1, $2 - 1) g +$$; + +-- Inserts an array with 'n' rows to the test table. Pass :next_i as +-- the first argument, returns the new value for :next_i. +create function insert_n(first_i int, n int) returns int language plpgsql as $$ +begin + insert into gin_incomplete_splits values (range_array(first_i, first_i+n)); + return first_i + n; +end; +$$; + +-- Inserts to the table until an insert fails. Like insert_n(), returns the +-- new value for :next_i. +create function insert_until_fail(next_i int, step int default 1) returns int language plpgsql as $$ +declare + i integer; +begin + -- Insert arrays with 'step' elements each, until an error occurs. + i := 0; + loop + begin + select insert_n(next_i, step) into next_i; + exception when others then + raise notice 'failed with: %', sqlerrm; + exit; + end; + + -- The caller is expected to set an injection point that eventually + -- causes an error. But bail out if still no error after 10000 + -- attempts, so that we don't get stuck in an infinite loop. + i := i + 1; + if i = 10000 then + raise 'no error on inserts after % iterations', i; + end if; + end loop; + + return next_i; +end; +$$; + +-- Check the invariants. +create function verify(next_i int) returns bool language plpgsql as $$ +declare + a integer[]; + elem integer; + c integer; +begin + -- Perform a scan over the trailing part of the index, where the + -- possible incomplete splits are. (We don't check the whole table, + -- because that'd be pretty slow.) + c := 0; + -- Find all arrays that overlap with the last 200 inserted integers. Or + -- the next 100, which shouldn't exist. + for a in select i from gin_incomplete_splits where i && range_array(next_i - 200, next_i + 100) + loop + -- count all elements in those arrays in the window. + foreach elem in ARRAY a loop + if elem >= next_i then + raise 'unexpected value % in array', elem; + end if; + if elem >= next_i - 200 then + c := c + 1; + end if; + end loop; + end loop; + if c <> 200 then + raise 'unexpected count % ', c; + end if; + + return true; +end; +$$; + +-- Insert one array to get started. +select insert_n(1, 1000) as next_i +\gset +select verify(:next_i); + + +-- +-- Test incomplete leaf split +-- +SELECT injection_points_attach('gin-leave-leaf-split-incomplete', 'error'); +select insert_until_fail(:next_i) as next_i +\gset +SELECT injection_points_detach('gin-leave-leaf-split-incomplete'); + +-- Verify that a scan works even though there's an incomplete split +select verify(:next_i); + +-- Insert some more rows, finishing the split +select insert_n(:next_i, 10) as next_i +\gset +-- Verify that a scan still works +select verify(:next_i); + + +-- +-- Test incomplete internal page split +-- +SELECT injection_points_attach('gin-leave-internal-split-incomplete', 'error'); +select insert_until_fail(:next_i, 100) as next_i +\gset +SELECT injection_points_detach('gin-leave-internal-split-incomplete'); + + -- Verify that a scan works even though there's an incomplete split +select verify(:next_i); + +-- Insert some more rows, finishing the split +select insert_n(:next_i, 10) as next_i +\gset +-- Verify that a scan still works +select verify(:next_i); + +SELECT injection_points_detach('gin-finish-incomplete-split'); diff --git a/src/test/modules/snapshot_too_old/.gitignore b/src/test/modules/injection_points/.gitignore similarity index 66% rename from src/test/modules/snapshot_too_old/.gitignore rename to src/test/modules/injection_points/.gitignore index ba2160b66ceb5..0de307e70a6c6 100644 --- a/src/test/modules/snapshot_too_old/.gitignore +++ b/src/test/modules/injection_points/.gitignore @@ -1,3 +1,6 @@ # Generated subdirectories +/log/ /output_iso/ +/results/ +/tmp_check/ /tmp_check_iso/ diff --git a/src/test/modules/injection_points/Makefile b/src/test/modules/injection_points/Makefile new file mode 100644 index 0000000000000..f19c9643ba968 --- /dev/null +++ b/src/test/modules/injection_points/Makefile @@ -0,0 +1,41 @@ +# src/test/modules/injection_points/Makefile + +MODULE_big = injection_points +OBJS = \ + $(WIN32RES) \ + injection_points.o \ + regress_injection.o +EXTENSION = injection_points +DATA = injection_points--1.0.sql +PGFILEDESC = "injection_points - facility for injection points" + +REGRESS = injection_points reindex_conc +REGRESS_OPTS = --dlpath=$(top_builddir)/src/test/regress + +ISOLATION = inplace syscache-update-pruned + +# The injection points are cluster-wide, so disable installcheck +NO_INSTALLCHECK = 1 + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/injection_points +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global + +# XXX: This test is conditional on enable_injection_points in the +# parent Makefile, so we should never get here in the first place if +# injection points are not enabled. But the buildfarm 'misc-check' +# step doesn't pay attention to the if-condition in the parent +# Makefile. To work around that, disable running the test here too. +ifeq ($(enable_injection_points),yes) +include $(top_srcdir)/contrib/contrib-global.mk +else +check: + @echo "injection points are disabled in this build" +endif + +endif diff --git a/src/test/modules/injection_points/expected/injection_points.out b/src/test/modules/injection_points/expected/injection_points.out new file mode 100644 index 0000000000000..dd9db06e10bdf --- /dev/null +++ b/src/test/modules/injection_points/expected/injection_points.out @@ -0,0 +1,212 @@ +CREATE EXTENSION injection_points; +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set regresslib :libdir '/regress' :dlsuffix +CREATE FUNCTION wait_pid(int) + RETURNS void + AS :'regresslib' + LANGUAGE C STRICT; +SELECT injection_points_attach('TestInjectionBooh', 'booh'); +ERROR: incorrect action "booh" for injection point creation +SELECT injection_points_attach('TestInjectionError', 'error'); + injection_points_attach +------------------------- + +(1 row) + +SELECT injection_points_attach('TestInjectionLog', 'notice'); + injection_points_attach +------------------------- + +(1 row) + +SELECT injection_points_attach('TestInjectionLog2', 'notice'); + injection_points_attach +------------------------- + +(1 row) + +SELECT injection_points_run('TestInjectionBooh'); -- nothing + injection_points_run +---------------------- + +(1 row) + +SELECT injection_points_run('TestInjectionLog2'); -- notice +NOTICE: notice triggered for injection point TestInjectionLog2 + injection_points_run +---------------------- + +(1 row) + +SELECT injection_points_run('TestInjectionLog'); -- notice +NOTICE: notice triggered for injection point TestInjectionLog + injection_points_run +---------------------- + +(1 row) + +SELECT injection_points_run('TestInjectionError'); -- error +ERROR: error triggered for injection point TestInjectionError +-- Re-load cache and run again. +\c +SELECT injection_points_run('TestInjectionLog2'); -- notice +NOTICE: notice triggered for injection point TestInjectionLog2 + injection_points_run +---------------------- + +(1 row) + +SELECT injection_points_run('TestInjectionLog'); -- notice +NOTICE: notice triggered for injection point TestInjectionLog + injection_points_run +---------------------- + +(1 row) + +SELECT injection_points_run('TestInjectionError'); -- error +ERROR: error triggered for injection point TestInjectionError +-- Remove one entry and check the remaining entries. +SELECT injection_points_detach('TestInjectionError'); -- ok + injection_points_detach +------------------------- + +(1 row) + +SELECT injection_points_run('TestInjectionLog'); -- notice +NOTICE: notice triggered for injection point TestInjectionLog + injection_points_run +---------------------- + +(1 row) + +SELECT injection_points_run('TestInjectionError'); -- nothing + injection_points_run +---------------------- + +(1 row) + +-- More entries removed, letting TestInjectionLog2 to check the same +-- callback used in more than one point. +SELECT injection_points_detach('TestInjectionLog'); -- ok + injection_points_detach +------------------------- + +(1 row) + +SELECT injection_points_run('TestInjectionLog'); -- nothing + injection_points_run +---------------------- + +(1 row) + +SELECT injection_points_run('TestInjectionError'); -- nothing + injection_points_run +---------------------- + +(1 row) + +SELECT injection_points_run('TestInjectionLog2'); -- notice +NOTICE: notice triggered for injection point TestInjectionLog2 + injection_points_run +---------------------- + +(1 row) + +SELECT injection_points_detach('TestInjectionLog'); -- fails +ERROR: could not detach injection point "TestInjectionLog" +SELECT injection_points_run('TestInjectionLog2'); -- notice +NOTICE: notice triggered for injection point TestInjectionLog2 + injection_points_run +---------------------- + +(1 row) + +SELECT injection_points_detach('TestInjectionLog2'); + injection_points_detach +------------------------- + +(1 row) + +-- Runtime conditions +SELECT injection_points_attach('TestConditionError', 'error'); + injection_points_attach +------------------------- + +(1 row) + +-- Any follow-up injection point attached will be local to this process. +SELECT injection_points_set_local(); + injection_points_set_local +---------------------------- + +(1 row) + +SELECT injection_points_attach('TestConditionLocal1', 'error'); + injection_points_attach +------------------------- + +(1 row) + +SELECT injection_points_attach('TestConditionLocal2', 'notice'); + injection_points_attach +------------------------- + +(1 row) + +SELECT injection_points_run('TestConditionLocal1'); -- error +ERROR: error triggered for injection point TestConditionLocal1 +SELECT injection_points_run('TestConditionLocal2'); -- notice +NOTICE: notice triggered for injection point TestConditionLocal2 + injection_points_run +---------------------- + +(1 row) + +SELECT pg_backend_pid() AS oldpid \gset +-- reload, local injection points should be gone. +\c +-- Wait for the previous backend process to exit, ensuring that its local +-- injection points are cleaned up. +SELECT wait_pid(:'oldpid'); + wait_pid +---------- + +(1 row) + +SELECT injection_points_run('TestConditionLocal1'); -- nothing + injection_points_run +---------------------- + +(1 row) + +SELECT injection_points_run('TestConditionLocal2'); -- nothing + injection_points_run +---------------------- + +(1 row) + +SELECT injection_points_run('TestConditionError'); -- error +ERROR: error triggered for injection point TestConditionError +SELECT injection_points_detach('TestConditionError'); + injection_points_detach +------------------------- + +(1 row) + +-- Attaching injection points that use the same name as one defined locally +-- previously should work. +SELECT injection_points_attach('TestConditionLocal1', 'error'); + injection_points_attach +------------------------- + +(1 row) + +SELECT injection_points_detach('TestConditionLocal1'); + injection_points_detach +------------------------- + +(1 row) + +DROP EXTENSION injection_points; +DROP FUNCTION wait_pid; diff --git a/src/test/modules/injection_points/expected/inplace.out b/src/test/modules/injection_points/expected/inplace.out new file mode 100644 index 0000000000000..db7dab66c92b9 --- /dev/null +++ b/src/test/modules/injection_points/expected/inplace.out @@ -0,0 +1,340 @@ +Parsed test spec with 3 sessions + +starting permutation: vac1 grant2 vac3 mkrels3 read1 +mkrels +------ + +(1 row) + +injection_points_attach +----------------------- + +(1 row) + +step vac1: VACUUM vactest.orig50; -- wait during inplace update +step grant2: GRANT SELECT ON TABLE vactest.orig50 TO PUBLIC; +step vac3: VACUUM pg_class; +step mkrels3: + SELECT vactest.mkrels('intruder', 1, 100); -- repopulate LP_UNUSED + SELECT injection_points_detach('inplace-before-pin'); + SELECT injection_points_wakeup('inplace-before-pin'); + +mkrels +------ + +(1 row) + +injection_points_detach +----------------------- + +(1 row) + +injection_points_wakeup +----------------------- + +(1 row) + +step vac1: <... completed> +step read1: + REINDEX TABLE pg_class; -- look for duplicates + SELECT reltuples = -1 AS reltuples_unknown + FROM pg_class WHERE oid = 'vactest.orig50'::regclass; + +reltuples_unknown +----------------- +f +(1 row) + + +starting permutation: begin2 grant2 vac1 c2 vac3 mkrels3 read1 +mkrels +------ + +(1 row) + +injection_points_attach +----------------------- + +(1 row) + +step begin2: BEGIN; +step grant2: GRANT SELECT ON TABLE vactest.orig50 TO PUBLIC; +step vac1: VACUUM vactest.orig50; -- wait during inplace update +step c2: COMMIT; +step vac3: VACUUM pg_class; +step mkrels3: + SELECT vactest.mkrels('intruder', 1, 100); -- repopulate LP_UNUSED + SELECT injection_points_detach('inplace-before-pin'); + SELECT injection_points_wakeup('inplace-before-pin'); + +mkrels +------ + +(1 row) + +injection_points_detach +----------------------- + +(1 row) + +injection_points_wakeup +----------------------- + +(1 row) + +step vac1: <... completed> +step read1: + REINDEX TABLE pg_class; -- look for duplicates + SELECT reltuples = -1 AS reltuples_unknown + FROM pg_class WHERE oid = 'vactest.orig50'::regclass; + +reltuples_unknown +----------------- +f +(1 row) + + +starting permutation: begin2 grant2 vac1 r2 vac3 mkrels3 read1 +mkrels +------ + +(1 row) + +injection_points_attach +----------------------- + +(1 row) + +step begin2: BEGIN; +step grant2: GRANT SELECT ON TABLE vactest.orig50 TO PUBLIC; +step vac1: VACUUM vactest.orig50; -- wait during inplace update +step r2: ROLLBACK; +step vac3: VACUUM pg_class; +step mkrels3: + SELECT vactest.mkrels('intruder', 1, 100); -- repopulate LP_UNUSED + SELECT injection_points_detach('inplace-before-pin'); + SELECT injection_points_wakeup('inplace-before-pin'); + +mkrels +------ + +(1 row) + +injection_points_detach +----------------------- + +(1 row) + +injection_points_wakeup +----------------------- + +(1 row) + +step vac1: <... completed> +step read1: + REINDEX TABLE pg_class; -- look for duplicates + SELECT reltuples = -1 AS reltuples_unknown + FROM pg_class WHERE oid = 'vactest.orig50'::regclass; + +reltuples_unknown +----------------- +f +(1 row) + + +starting permutation: begin2 grant2 vac1 c2 revoke2 grant2 vac3 mkrels3 read1 +mkrels +------ + +(1 row) + +injection_points_attach +----------------------- + +(1 row) + +step begin2: BEGIN; +step grant2: GRANT SELECT ON TABLE vactest.orig50 TO PUBLIC; +step vac1: VACUUM vactest.orig50; -- wait during inplace update +step c2: COMMIT; +step revoke2: REVOKE SELECT ON TABLE vactest.orig50 FROM PUBLIC; +step grant2: GRANT SELECT ON TABLE vactest.orig50 TO PUBLIC; +step vac3: VACUUM pg_class; +step mkrels3: + SELECT vactest.mkrels('intruder', 1, 100); -- repopulate LP_UNUSED + SELECT injection_points_detach('inplace-before-pin'); + SELECT injection_points_wakeup('inplace-before-pin'); + +mkrels +------ + +(1 row) + +injection_points_detach +----------------------- + +(1 row) + +injection_points_wakeup +----------------------- + +(1 row) + +step vac1: <... completed> +step read1: + REINDEX TABLE pg_class; -- look for duplicates + SELECT reltuples = -1 AS reltuples_unknown + FROM pg_class WHERE oid = 'vactest.orig50'::regclass; + +reltuples_unknown +----------------- +f +(1 row) + + +starting permutation: vac1 begin2 grant2 revoke2 mkrels3 c2 read1 +mkrels +------ + +(1 row) + +injection_points_attach +----------------------- + +(1 row) + +step vac1: VACUUM vactest.orig50; -- wait during inplace update +step begin2: BEGIN; +step grant2: GRANT SELECT ON TABLE vactest.orig50 TO PUBLIC; +step revoke2: REVOKE SELECT ON TABLE vactest.orig50 FROM PUBLIC; +step mkrels3: + SELECT vactest.mkrels('intruder', 1, 100); -- repopulate LP_UNUSED + SELECT injection_points_detach('inplace-before-pin'); + SELECT injection_points_wakeup('inplace-before-pin'); + +mkrels +------ + +(1 row) + +injection_points_detach +----------------------- + +(1 row) + +injection_points_wakeup +----------------------- + +(1 row) + +step c2: COMMIT; +step vac1: <... completed> +step read1: + REINDEX TABLE pg_class; -- look for duplicates + SELECT reltuples = -1 AS reltuples_unknown + FROM pg_class WHERE oid = 'vactest.orig50'::regclass; + +reltuples_unknown +----------------- +f +(1 row) + + +starting permutation: begin2 grant2 vac1 r2 grant2 revoke2 vac3 mkrels3 read1 +mkrels +------ + +(1 row) + +injection_points_attach +----------------------- + +(1 row) + +step begin2: BEGIN; +step grant2: GRANT SELECT ON TABLE vactest.orig50 TO PUBLIC; +step vac1: VACUUM vactest.orig50; -- wait during inplace update +step r2: ROLLBACK; +step grant2: GRANT SELECT ON TABLE vactest.orig50 TO PUBLIC; +step revoke2: REVOKE SELECT ON TABLE vactest.orig50 FROM PUBLIC; +step vac3: VACUUM pg_class; +step mkrels3: + SELECT vactest.mkrels('intruder', 1, 100); -- repopulate LP_UNUSED + SELECT injection_points_detach('inplace-before-pin'); + SELECT injection_points_wakeup('inplace-before-pin'); + +mkrels +------ + +(1 row) + +injection_points_detach +----------------------- + +(1 row) + +injection_points_wakeup +----------------------- + +(1 row) + +step vac1: <... completed> +step read1: + REINDEX TABLE pg_class; -- look for duplicates + SELECT reltuples = -1 AS reltuples_unknown + FROM pg_class WHERE oid = 'vactest.orig50'::regclass; + +reltuples_unknown +----------------- +f +(1 row) + + +starting permutation: begin2 grant2 vac1 c2 revoke2 vac3 mkrels3 read1 +mkrels +------ + +(1 row) + +injection_points_attach +----------------------- + +(1 row) + +step begin2: BEGIN; +step grant2: GRANT SELECT ON TABLE vactest.orig50 TO PUBLIC; +step vac1: VACUUM vactest.orig50; -- wait during inplace update +step c2: COMMIT; +step revoke2: REVOKE SELECT ON TABLE vactest.orig50 FROM PUBLIC; +step vac3: VACUUM pg_class; +step mkrels3: + SELECT vactest.mkrels('intruder', 1, 100); -- repopulate LP_UNUSED + SELECT injection_points_detach('inplace-before-pin'); + SELECT injection_points_wakeup('inplace-before-pin'); + +mkrels +------ + +(1 row) + +injection_points_detach +----------------------- + +(1 row) + +injection_points_wakeup +----------------------- + +(1 row) + +step vac1: <... completed> +step read1: + REINDEX TABLE pg_class; -- look for duplicates + SELECT reltuples = -1 AS reltuples_unknown + FROM pg_class WHERE oid = 'vactest.orig50'::regclass; + +reltuples_unknown +----------------- +f +(1 row) + diff --git a/src/test/modules/injection_points/expected/reindex_conc.out b/src/test/modules/injection_points/expected/reindex_conc.out new file mode 100644 index 0000000000000..db8de4bbe85c1 --- /dev/null +++ b/src/test/modules/injection_points/expected/reindex_conc.out @@ -0,0 +1,51 @@ +-- Tests for REINDEX CONCURRENTLY +CREATE EXTENSION injection_points; +-- Check safety of indexes with predicates and expressions. +SELECT injection_points_set_local(); + injection_points_set_local +---------------------------- + +(1 row) + +SELECT injection_points_attach('reindex-conc-index-safe', 'notice'); + injection_points_attach +------------------------- + +(1 row) + +SELECT injection_points_attach('reindex-conc-index-not-safe', 'notice'); + injection_points_attach +------------------------- + +(1 row) + +CREATE SCHEMA reindex_inj; +CREATE TABLE reindex_inj.tbl(i int primary key, updated_at timestamp); +CREATE UNIQUE INDEX ind_simple ON reindex_inj.tbl(i); +CREATE UNIQUE INDEX ind_expr ON reindex_inj.tbl(ABS(i)); +CREATE UNIQUE INDEX ind_pred ON reindex_inj.tbl(i) WHERE mod(i, 2) = 0; +CREATE UNIQUE INDEX ind_expr_pred ON reindex_inj.tbl(abs(i)) WHERE mod(i, 2) = 0; +REINDEX INDEX CONCURRENTLY reindex_inj.ind_simple; +NOTICE: notice triggered for injection point reindex-conc-index-safe +REINDEX INDEX CONCURRENTLY reindex_inj.ind_expr; +NOTICE: notice triggered for injection point reindex-conc-index-not-safe +REINDEX INDEX CONCURRENTLY reindex_inj.ind_pred; +NOTICE: notice triggered for injection point reindex-conc-index-not-safe +REINDEX INDEX CONCURRENTLY reindex_inj.ind_expr_pred; +NOTICE: notice triggered for injection point reindex-conc-index-not-safe +-- Cleanup +SELECT injection_points_detach('reindex-conc-index-safe'); + injection_points_detach +------------------------- + +(1 row) + +SELECT injection_points_detach('reindex-conc-index-not-safe'); + injection_points_detach +------------------------- + +(1 row) + +DROP TABLE reindex_inj.tbl; +DROP SCHEMA reindex_inj; +DROP EXTENSION injection_points; diff --git a/src/test/modules/injection_points/expected/syscache-update-pruned.out b/src/test/modules/injection_points/expected/syscache-update-pruned.out new file mode 100644 index 0000000000000..a6a4e8db996b1 --- /dev/null +++ b/src/test/modules/injection_points/expected/syscache-update-pruned.out @@ -0,0 +1,87 @@ +Parsed test spec with 4 sessions + +starting permutation: cachefill1 at2 waitprunable4 vac4 grant1 wakeinval4 wakegrant4 +step cachefill1: SELECT FROM vactest.reloid_catcache_set('vactest.orig50'); +step at2: + CREATE TRIGGER to_set_relhastriggers BEFORE UPDATE ON vactest.orig50 + FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); + +step waitprunable4: CALL vactest.wait_prunable(); +step vac4: VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) pg_class; +step grant1: GRANT SELECT ON vactest.orig50 TO PUBLIC; +step wakeinval4: + SELECT FROM injection_points_detach('transaction-end-process-inval'); + SELECT FROM injection_points_wakeup('transaction-end-process-inval'); + +step at2: <... completed> +step wakeinval4: <... completed> +step wakegrant4: + SELECT FROM injection_points_detach('heap_update-before-pin'); + SELECT FROM injection_points_wakeup('heap_update-before-pin'); + +step grant1: <... completed> +ERROR: tuple concurrently deleted +step wakegrant4: <... completed> + +starting permutation: cachefill1 at2 waitprunable4 vac4 grant1 wakeinval4 mkrels4 wakegrant4 +step cachefill1: SELECT FROM vactest.reloid_catcache_set('vactest.orig50'); +step at2: + CREATE TRIGGER to_set_relhastriggers BEFORE UPDATE ON vactest.orig50 + FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); + +step waitprunable4: CALL vactest.wait_prunable(); +step vac4: VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) pg_class; +step grant1: GRANT SELECT ON vactest.orig50 TO PUBLIC; +step wakeinval4: + SELECT FROM injection_points_detach('transaction-end-process-inval'); + SELECT FROM injection_points_wakeup('transaction-end-process-inval'); + +step at2: <... completed> +step wakeinval4: <... completed> +step mkrels4: + SELECT FROM vactest.mkrels('intruder', 1, 100); -- repopulate LP_UNUSED + +step wakegrant4: + SELECT FROM injection_points_detach('heap_update-before-pin'); + SELECT FROM injection_points_wakeup('heap_update-before-pin'); + +step grant1: <... completed> +ERROR: duplicate key value violates unique constraint "pg_class_oid_index" +step wakegrant4: <... completed> + +starting permutation: snap3 cachefill1 at2 mkrels4 r3 waitprunable4 vac4 grant1 wakeinval4 at4 wakegrant4 inspect4 +step snap3: BEGIN ISOLATION LEVEL REPEATABLE READ; SELECT; +step cachefill1: SELECT FROM vactest.reloid_catcache_set('vactest.orig50'); +step at2: + CREATE TRIGGER to_set_relhastriggers BEFORE UPDATE ON vactest.orig50 + FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); + +step mkrels4: + SELECT FROM vactest.mkrels('intruder', 1, 100); -- repopulate LP_UNUSED + +step r3: ROLLBACK; +step waitprunable4: CALL vactest.wait_prunable(); +step vac4: VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) pg_class; +step grant1: GRANT SELECT ON vactest.orig50 TO PUBLIC; +step wakeinval4: + SELECT FROM injection_points_detach('transaction-end-process-inval'); + SELECT FROM injection_points_wakeup('transaction-end-process-inval'); + +step at2: <... completed> +step wakeinval4: <... completed> +step at4: ALTER TABLE vactest.child50 INHERIT vactest.orig50; +step wakegrant4: + SELECT FROM injection_points_detach('heap_update-before-pin'); + SELECT FROM injection_points_wakeup('heap_update-before-pin'); + +step grant1: <... completed> +step wakegrant4: <... completed> +step inspect4: + SELECT relhastriggers, relhassubclass FROM pg_class + WHERE oid = 'vactest.orig50'::regclass; + +relhastriggers|relhassubclass +--------------+-------------- +f |f +(1 row) + diff --git a/src/test/modules/injection_points/expected/syscache-update-pruned_1.out b/src/test/modules/injection_points/expected/syscache-update-pruned_1.out new file mode 100644 index 0000000000000..4dca2b86bc888 --- /dev/null +++ b/src/test/modules/injection_points/expected/syscache-update-pruned_1.out @@ -0,0 +1,86 @@ +Parsed test spec with 4 sessions + +starting permutation: cachefill1 at2 waitprunable4 vac4 grant1 wakeinval4 wakegrant4 +step cachefill1: SELECT FROM vactest.reloid_catcache_set('vactest.orig50'); +step at2: + CREATE TRIGGER to_set_relhastriggers BEFORE UPDATE ON vactest.orig50 + FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); + +step waitprunable4: CALL vactest.wait_prunable(); +step vac4: VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) pg_class; +step grant1: GRANT SELECT ON vactest.orig50 TO PUBLIC; +step wakeinval4: + SELECT FROM injection_points_detach('transaction-end-process-inval'); + SELECT FROM injection_points_wakeup('transaction-end-process-inval'); + +step at2: <... completed> +step wakeinval4: <... completed> +step wakegrant4: + SELECT FROM injection_points_detach('heap_update-before-pin'); + SELECT FROM injection_points_wakeup('heap_update-before-pin'); + +step grant1: <... completed> +step wakegrant4: <... completed> + +starting permutation: cachefill1 at2 waitprunable4 vac4 grant1 wakeinval4 mkrels4 wakegrant4 +step cachefill1: SELECT FROM vactest.reloid_catcache_set('vactest.orig50'); +step at2: + CREATE TRIGGER to_set_relhastriggers BEFORE UPDATE ON vactest.orig50 + FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); + +step waitprunable4: CALL vactest.wait_prunable(); +step vac4: VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) pg_class; +step grant1: GRANT SELECT ON vactest.orig50 TO PUBLIC; +step wakeinval4: + SELECT FROM injection_points_detach('transaction-end-process-inval'); + SELECT FROM injection_points_wakeup('transaction-end-process-inval'); + +step at2: <... completed> +step wakeinval4: <... completed> +step mkrels4: + SELECT FROM vactest.mkrels('intruder', 1, 100); -- repopulate LP_UNUSED + +step wakegrant4: + SELECT FROM injection_points_detach('heap_update-before-pin'); + SELECT FROM injection_points_wakeup('heap_update-before-pin'); + +step grant1: <... completed> +step wakegrant4: <... completed> + +starting permutation: snap3 cachefill1 at2 mkrels4 r3 waitprunable4 vac4 grant1 wakeinval4 at4 wakegrant4 inspect4 +step snap3: BEGIN ISOLATION LEVEL REPEATABLE READ; SELECT; +step cachefill1: SELECT FROM vactest.reloid_catcache_set('vactest.orig50'); +step at2: + CREATE TRIGGER to_set_relhastriggers BEFORE UPDATE ON vactest.orig50 + FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); + +step mkrels4: + SELECT FROM vactest.mkrels('intruder', 1, 100); -- repopulate LP_UNUSED + +step r3: ROLLBACK; +step waitprunable4: CALL vactest.wait_prunable(); +step vac4: VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) pg_class; +step grant1: GRANT SELECT ON vactest.orig50 TO PUBLIC; +step wakeinval4: + SELECT FROM injection_points_detach('transaction-end-process-inval'); + SELECT FROM injection_points_wakeup('transaction-end-process-inval'); + +step at2: <... completed> +step wakeinval4: <... completed> +step at4: ALTER TABLE vactest.child50 INHERIT vactest.orig50; +step wakegrant4: + SELECT FROM injection_points_detach('heap_update-before-pin'); + SELECT FROM injection_points_wakeup('heap_update-before-pin'); + +step grant1: <... completed> +ERROR: tuple concurrently updated +step wakegrant4: <... completed> +step inspect4: + SELECT relhastriggers, relhassubclass FROM pg_class + WHERE oid = 'vactest.orig50'::regclass; + +relhastriggers|relhassubclass +--------------+-------------- +t |t +(1 row) + diff --git a/src/test/modules/injection_points/injection_points--1.0.sql b/src/test/modules/injection_points/injection_points--1.0.sql new file mode 100644 index 0000000000000..519641e6d0415 --- /dev/null +++ b/src/test/modules/injection_points/injection_points--1.0.sql @@ -0,0 +1,64 @@ +/* src/test/modules/injection_points/injection_points--1.0.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION injection_points" to load this file. \quit + +-- +-- injection_points_attach() +-- +-- Attaches the action to the given injection point. +-- +CREATE FUNCTION injection_points_attach(IN point_name TEXT, + IN action text) +RETURNS void +AS 'MODULE_PATHNAME', 'injection_points_attach' +LANGUAGE C STRICT PARALLEL UNSAFE; + +-- +-- injection_points_run() +-- +-- Executes the action attached to the injection point. +-- +CREATE FUNCTION injection_points_run(IN point_name TEXT) +RETURNS void +AS 'MODULE_PATHNAME', 'injection_points_run' +LANGUAGE C STRICT PARALLEL UNSAFE; + +-- +-- injection_points_wakeup() +-- +-- Wakes up a waiting injection point. +-- +CREATE FUNCTION injection_points_wakeup(IN point_name TEXT) +RETURNS void +AS 'MODULE_PATHNAME', 'injection_points_wakeup' +LANGUAGE C STRICT PARALLEL UNSAFE; + +-- +-- injection_points_set_local() +-- +-- Trigger switch to link any future injection points attached to the +-- current process, useful to make SQL tests concurrently-safe. +-- +CREATE FUNCTION injection_points_set_local() +RETURNS void +AS 'MODULE_PATHNAME', 'injection_points_set_local' +LANGUAGE C STRICT PARALLEL UNSAFE; + +-- +-- injection_points_detach() +-- +-- Detaches the current action, if any, from the given injection point. +-- +CREATE FUNCTION injection_points_detach(IN point_name TEXT) +RETURNS void +AS 'MODULE_PATHNAME', 'injection_points_detach' +LANGUAGE C STRICT PARALLEL UNSAFE; + +-- +-- regress_injection.c functions +-- +CREATE FUNCTION removable_cutoff(rel regclass) +RETURNS xid8 +AS 'MODULE_PATHNAME' +LANGUAGE C CALLED ON NULL INPUT; diff --git a/src/test/modules/injection_points/injection_points.c b/src/test/modules/injection_points/injection_points.c new file mode 100644 index 0000000000000..1b695a1820321 --- /dev/null +++ b/src/test/modules/injection_points/injection_points.c @@ -0,0 +1,404 @@ +/*-------------------------------------------------------------------------- + * + * injection_points.c + * Code for testing injection points. + * + * Injection points are able to trigger user-defined callbacks in pre-defined + * code paths. + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/test/modules/injection_points/injection_points.c + * + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "fmgr.h" +#include "miscadmin.h" +#include "nodes/pg_list.h" +#include "nodes/value.h" +#include "storage/condition_variable.h" +#include "storage/dsm_registry.h" +#include "storage/ipc.h" +#include "storage/lwlock.h" +#include "storage/shmem.h" +#include "utils/builtins.h" +#include "utils/injection_point.h" +#include "utils/memutils.h" +#include "utils/wait_event.h" + +PG_MODULE_MAGIC; + +/* Maximum number of waits usable in injection points at once */ +#define INJ_MAX_WAIT 8 +#define INJ_NAME_MAXLEN 64 + +/* + * Conditions related to injection points. This tracks in shared memory the + * runtime conditions under which an injection point is allowed to run, + * stored as private_data when an injection point is attached, and passed as + * argument to the callback. + * + * If more types of runtime conditions need to be tracked, this structure + * should be expanded. + */ +typedef enum InjectionPointConditionType +{ + INJ_CONDITION_ALWAYS = 0, /* always run */ + INJ_CONDITION_PID, /* PID restriction */ +} InjectionPointConditionType; + +typedef struct InjectionPointCondition +{ + /* Type of the condition */ + InjectionPointConditionType type; + + /* ID of the process where the injection point is allowed to run */ + int pid; +} InjectionPointCondition; + +/* + * List of injection points stored in TopMemoryContext attached + * locally to this process. + */ +static List *inj_list_local = NIL; + +/* Shared state information for injection points. */ +typedef struct InjectionPointSharedState +{ + /* Protects access to other fields */ + slock_t lock; + + /* Counters advancing when injection_points_wakeup() is called */ + uint32 wait_counts[INJ_MAX_WAIT]; + + /* Names of injection points attached to wait counters */ + char name[INJ_MAX_WAIT][INJ_NAME_MAXLEN]; + + /* Condition variable used for waits and wakeups */ + ConditionVariable wait_point; +} InjectionPointSharedState; + +/* Pointer to shared-memory state. */ +static InjectionPointSharedState *inj_state = NULL; + +extern PGDLLEXPORT void injection_error(const char *name, + const void *private_data); +extern PGDLLEXPORT void injection_notice(const char *name, + const void *private_data); +extern PGDLLEXPORT void injection_wait(const char *name, + const void *private_data); + +/* track if injection points attached in this process are linked to it */ +static bool injection_point_local = false; + +/* + * Callback for shared memory area initialization. + */ +static void +injection_point_init_state(void *ptr) +{ + InjectionPointSharedState *state = (InjectionPointSharedState *) ptr; + + SpinLockInit(&state->lock); + memset(state->wait_counts, 0, sizeof(state->wait_counts)); + memset(state->name, 0, sizeof(state->name)); + ConditionVariableInit(&state->wait_point); +} + +/* + * Initialize shared memory area for this module. + */ +static void +injection_init_shmem(void) +{ + bool found; + + if (inj_state != NULL) + return; + + inj_state = GetNamedDSMSegment("injection_points", + sizeof(InjectionPointSharedState), + injection_point_init_state, + &found); +} + +/* + * Check runtime conditions associated to an injection point. + * + * Returns true if the named injection point is allowed to run, and false + * otherwise. + */ +static bool +injection_point_allowed(InjectionPointCondition *condition) +{ + bool result = true; + + switch (condition->type) + { + case INJ_CONDITION_PID: + if (MyProcPid != condition->pid) + result = false; + break; + case INJ_CONDITION_ALWAYS: + break; + } + + return result; +} + +/* + * before_shmem_exit callback to remove injection points linked to a + * specific process. + */ +static void +injection_points_cleanup(int code, Datum arg) +{ + ListCell *lc; + + /* Leave if nothing is tracked locally */ + if (!injection_point_local) + return; + + /* Detach all the local points */ + foreach(lc, inj_list_local) + { + char *name = strVal(lfirst(lc)); + + (void) InjectionPointDetach(name); + } +} + +/* Set of callbacks available to be attached to an injection point. */ +void +injection_error(const char *name, const void *private_data) +{ + InjectionPointCondition *condition = (InjectionPointCondition *) private_data; + + if (!injection_point_allowed(condition)) + return; + + elog(ERROR, "error triggered for injection point %s", name); +} + +void +injection_notice(const char *name, const void *private_data) +{ + InjectionPointCondition *condition = (InjectionPointCondition *) private_data; + + if (!injection_point_allowed(condition)) + return; + + elog(NOTICE, "notice triggered for injection point %s", name); +} + +/* Wait on a condition variable, awaken by injection_points_wakeup() */ +void +injection_wait(const char *name, const void *private_data) +{ + uint32 old_wait_counts = 0; + int index = -1; + uint32 injection_wait_event = 0; + InjectionPointCondition *condition = (InjectionPointCondition *) private_data; + + if (inj_state == NULL) + injection_init_shmem(); + + if (!injection_point_allowed(condition)) + return; + + /* + * Use the injection point name for this custom wait event. Note that + * this custom wait event name is not released, but we don't care much for + * testing as this should be short-lived. + */ + injection_wait_event = WaitEventInjectionPointNew(name); + + /* + * Find a free slot to wait for, and register this injection point's name. + */ + SpinLockAcquire(&inj_state->lock); + for (int i = 0; i < INJ_MAX_WAIT; i++) + { + if (inj_state->name[i][0] == '\0') + { + index = i; + strlcpy(inj_state->name[i], name, INJ_NAME_MAXLEN); + old_wait_counts = inj_state->wait_counts[i]; + break; + } + } + SpinLockRelease(&inj_state->lock); + + if (index < 0) + elog(ERROR, "could not find free slot for wait of injection point %s ", + name); + + /* And sleep.. */ + ConditionVariablePrepareToSleep(&inj_state->wait_point); + for (;;) + { + uint32 new_wait_counts; + + SpinLockAcquire(&inj_state->lock); + new_wait_counts = inj_state->wait_counts[index]; + SpinLockRelease(&inj_state->lock); + + if (old_wait_counts != new_wait_counts) + break; + ConditionVariableSleep(&inj_state->wait_point, injection_wait_event); + } + ConditionVariableCancelSleep(); + + /* Remove this injection point from the waiters. */ + SpinLockAcquire(&inj_state->lock); + inj_state->name[index][0] = '\0'; + SpinLockRelease(&inj_state->lock); +} + +/* + * SQL function for creating an injection point. + */ +PG_FUNCTION_INFO_V1(injection_points_attach); +Datum +injection_points_attach(PG_FUNCTION_ARGS) +{ + char *name = text_to_cstring(PG_GETARG_TEXT_PP(0)); + char *action = text_to_cstring(PG_GETARG_TEXT_PP(1)); + char *function; + InjectionPointCondition condition = {0}; + + if (strcmp(action, "error") == 0) + function = "injection_error"; + else if (strcmp(action, "notice") == 0) + function = "injection_notice"; + else if (strcmp(action, "wait") == 0) + function = "injection_wait"; + else + elog(ERROR, "incorrect action \"%s\" for injection point creation", action); + + if (injection_point_local) + { + condition.type = INJ_CONDITION_PID; + condition.pid = MyProcPid; + } + + InjectionPointAttach(name, "injection_points", function, &condition, + sizeof(InjectionPointCondition)); + + if (injection_point_local) + { + MemoryContext oldctx; + + /* Local injection point, so track it for automated cleanup */ + oldctx = MemoryContextSwitchTo(TopMemoryContext); + inj_list_local = lappend(inj_list_local, makeString(pstrdup(name))); + MemoryContextSwitchTo(oldctx); + } + PG_RETURN_VOID(); +} + +/* + * SQL function for triggering an injection point. + */ +PG_FUNCTION_INFO_V1(injection_points_run); +Datum +injection_points_run(PG_FUNCTION_ARGS) +{ + char *name = text_to_cstring(PG_GETARG_TEXT_PP(0)); + + INJECTION_POINT(name); + + PG_RETURN_VOID(); +} + +/* + * SQL function for waking up an injection point waiting in injection_wait(). + */ +PG_FUNCTION_INFO_V1(injection_points_wakeup); +Datum +injection_points_wakeup(PG_FUNCTION_ARGS) +{ + char *name = text_to_cstring(PG_GETARG_TEXT_PP(0)); + int index = -1; + + if (inj_state == NULL) + injection_init_shmem(); + + /* First bump the wait counter for the injection point to wake up */ + SpinLockAcquire(&inj_state->lock); + for (int i = 0; i < INJ_MAX_WAIT; i++) + { + if (strcmp(name, inj_state->name[i]) == 0) + { + index = i; + break; + } + } + if (index < 0) + { + SpinLockRelease(&inj_state->lock); + elog(ERROR, "could not find injection point %s to wake up", name); + } + inj_state->wait_counts[index]++; + SpinLockRelease(&inj_state->lock); + + /* And broadcast the change to the waiters */ + ConditionVariableBroadcast(&inj_state->wait_point); + PG_RETURN_VOID(); +} + +/* + * injection_points_set_local + * + * Track if any injection point created in this process ought to run only + * in this process. Such injection points are detached automatically when + * this process exits. This is useful to make test suites concurrent-safe. + */ +PG_FUNCTION_INFO_V1(injection_points_set_local); +Datum +injection_points_set_local(PG_FUNCTION_ARGS) +{ + /* Enable flag to add a runtime condition based on this process ID */ + injection_point_local = true; + + if (inj_state == NULL) + injection_init_shmem(); + + /* + * Register a before_shmem_exit callback to remove any injection points + * linked to this process. + */ + before_shmem_exit(injection_points_cleanup, (Datum) 0); + + PG_RETURN_VOID(); +} + +/* + * SQL function for dropping an injection point. + */ +PG_FUNCTION_INFO_V1(injection_points_detach); +Datum +injection_points_detach(PG_FUNCTION_ARGS) +{ + char *name = text_to_cstring(PG_GETARG_TEXT_PP(0)); + + if (!InjectionPointDetach(name)) + elog(ERROR, "could not detach injection point \"%s\"", name); + + /* Remove point from local list, if required */ + if (inj_list_local != NIL) + { + MemoryContext oldctx; + + oldctx = MemoryContextSwitchTo(TopMemoryContext); + inj_list_local = list_delete(inj_list_local, makeString(name)); + MemoryContextSwitchTo(oldctx); + } + + PG_RETURN_VOID(); +} diff --git a/src/test/modules/injection_points/injection_points.control b/src/test/modules/injection_points/injection_points.control new file mode 100644 index 0000000000000..b4214f3bdc422 --- /dev/null +++ b/src/test/modules/injection_points/injection_points.control @@ -0,0 +1,4 @@ +comment = 'Test code for injection points' +default_version = '1.0' +module_pathname = '$libdir/injection_points' +relocatable = true diff --git a/src/test/modules/injection_points/meson.build b/src/test/modules/injection_points/meson.build new file mode 100644 index 0000000000000..169c415f9c478 --- /dev/null +++ b/src/test/modules/injection_points/meson.build @@ -0,0 +1,49 @@ +# Copyright (c) 2022-2024, PostgreSQL Global Development Group + +if not get_option('injection_points') + subdir_done() +endif + +injection_points_sources = files( + 'injection_points.c', + 'regress_injection.c', +) + +if host_system == 'windows' + injection_points_sources += rc_lib_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'injection_points', + '--FILEDESC', 'injection_points - facility for injection points',]) +endif + +injection_points = shared_module('injection_points', + injection_points_sources, + kwargs: pg_test_mod_args, +) +test_install_libs += injection_points + +test_install_data += files( + 'injection_points.control', + 'injection_points--1.0.sql', +) + +tests += { + 'name': 'injection_points', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'regress': { + 'sql': [ + 'injection_points', + 'reindex_conc', + ], + 'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'], + # The injection points are cluster-wide, so disable installcheck + 'runningcheck': false, + }, + 'isolation': { + 'specs': [ + 'inplace', + 'syscache-update-pruned', + ], + 'runningcheck': false, # see syscache-update-pruned + }, +} diff --git a/src/test/modules/injection_points/regress_injection.c b/src/test/modules/injection_points/regress_injection.c new file mode 100644 index 0000000000000..7bba1c97d0f26 --- /dev/null +++ b/src/test/modules/injection_points/regress_injection.c @@ -0,0 +1,78 @@ +/*-------------------------------------------------------------------------- + * + * regress_injection.c + * Functions supporting test-specific subject matter. + * + * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/test/modules/injection_points/regress_injection.c + * + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "access/table.h" +#include "fmgr.h" +#include "miscadmin.h" +#include "postmaster/autovacuum.h" +#include "storage/procarray.h" +#include "utils/rel.h" +#include "utils/xid8.h" + +/* + * removable_cutoff - for syscache-update-pruned.spec + * + * Wrapper around GetOldestNonRemovableTransactionId(). In general, this can + * move backward. runningcheck=false isolation tests can reasonably prevent + * that. For the causes of backward movement, see + * postgr.es/m/CAEze2Wj%2BV0kTx86xB_YbyaqTr5hnE_igdWAwuhSyjXBYscf5-Q%40mail.gmail.com + * and the header comment for ComputeXidHorizons(). One can assume this + * doesn't move backward if one (a) passes a shared catalog as the argument + * and (b) arranges for concurrent activity not to reach AbortTransaction(). + * Non-runningcheck tests can control most concurrent activity, except + * autovacuum and the isolationtester control connection. AbortTransaction() + * in those would justify test failure. Seeing autoanalyze can allocate an + * XID in any database, (a) ensures we'll consistently not ignore those XIDs. + */ +PG_FUNCTION_INFO_V1(removable_cutoff); +Datum +removable_cutoff(PG_FUNCTION_ARGS) +{ + Relation rel = NULL; + TransactionId xid; + FullTransactionId next_fxid_before, + next_fxid; + + /* could take other relkinds callee takes, but we've not yet needed it */ + if (!PG_ARGISNULL(0)) + rel = table_open(PG_GETARG_OID(0), AccessShareLock); + + if (!rel->rd_rel->relisshared && autovacuum_start_daemon) + elog(WARNING, + "removable_cutoff(non-shared-rel) can move backward under autovacuum=on"); + + /* + * No lock or snapshot necessarily prevents oldestXid from advancing past + * "xid" while this function runs. That concerns us only in that we must + * not ascribe "xid" to the wrong epoch. (That may never arise in + * isolation testing, but let's set a good example.) As a crude solution, + * retry until nextXid doesn't change. + */ + next_fxid = ReadNextFullTransactionId(); + do + { + CHECK_FOR_INTERRUPTS(); + next_fxid_before = next_fxid; + xid = GetOldestNonRemovableTransactionId(rel); + next_fxid = ReadNextFullTransactionId(); + } while (!FullTransactionIdEquals(next_fxid, next_fxid_before)); + + if (rel) + table_close(rel, AccessShareLock); + + PG_RETURN_FULLTRANSACTIONID(FullTransactionIdFromAllowableAt(next_fxid, + xid)); +} diff --git a/src/test/modules/injection_points/specs/inplace.spec b/src/test/modules/injection_points/specs/inplace.spec new file mode 100644 index 0000000000000..86539a5bd2f11 --- /dev/null +++ b/src/test/modules/injection_points/specs/inplace.spec @@ -0,0 +1,141 @@ +# Test race conditions involving: +# - s1: VACUUM inplace-updating a pg_class row +# - s2: GRANT/REVOKE making pg_class rows dead +# - s3: "VACUUM pg_class" making dead rows LP_UNUSED; DDL reusing them + +# Need GRANT to make a non-HOT update. Otherwise, "VACUUM pg_class" would +# leave an LP_REDIRECT that persists. To get non-HOT, make rels so the +# pg_class row for vactest.orig50 is on a filled page (assuming BLCKSZ=8192). +# Just to save on filesystem syscalls, use relkind=c for every other rel. +setup +{ + CREATE EXTENSION injection_points; + CREATE SCHEMA vactest; + CREATE FUNCTION vactest.mkrels(text, int, int) RETURNS void + LANGUAGE plpgsql SET search_path = vactest AS $$ + DECLARE + tname text; + BEGIN + FOR i in $2 .. $3 LOOP + tname := $1 || i; + EXECUTE FORMAT('CREATE TYPE ' || tname || ' AS ()'); + RAISE DEBUG '% at %', tname, ctid + FROM pg_class WHERE oid = tname::regclass; + END LOOP; + END + $$; +} +setup { VACUUM FULL pg_class; -- reduce free space } +setup +{ + SELECT vactest.mkrels('orig', 1, 49); + CREATE TABLE vactest.orig50 (); + SELECT vactest.mkrels('orig', 51, 100); +} +teardown +{ + DROP SCHEMA vactest CASCADE; + DROP EXTENSION injection_points; +} + +# Wait during inplace update, in a VACUUM of vactest.orig50. +session s1 +setup { + SELECT injection_points_set_local(); + SELECT injection_points_attach('inplace-before-pin', 'wait'); +} +step vac1 { VACUUM vactest.orig50; -- wait during inplace update } +# One bug scenario leaves two live pg_class tuples for vactest.orig50 and zero +# live tuples for one of the "intruder" rels. REINDEX observes the duplicate. +step read1 { + REINDEX TABLE pg_class; -- look for duplicates + SELECT reltuples = -1 AS reltuples_unknown + FROM pg_class WHERE oid = 'vactest.orig50'::regclass; +} + +# Transactional updates of the tuple vac1 is waiting to inplace-update. +session s2 +step grant2 { GRANT SELECT ON TABLE vactest.orig50 TO PUBLIC; } +step revoke2 { REVOKE SELECT ON TABLE vactest.orig50 FROM PUBLIC; } +step begin2 { BEGIN; } +step c2 { COMMIT; } +step r2 { ROLLBACK; } + +# Non-blocking actions. +session s3 +step vac3 { VACUUM pg_class; } +# Reuse the lp that vac1 is waiting to change. I've observed reuse at the 1st +# or 18th CREATE, so create excess. +step mkrels3 { + SELECT vactest.mkrels('intruder', 1, 100); -- repopulate LP_UNUSED + SELECT injection_points_detach('inplace-before-pin'); + SELECT injection_points_wakeup('inplace-before-pin'); +} + + +# target gains a successor at the last moment +permutation + vac1(mkrels3) # reads pg_class tuple T0 for vactest.orig50, xmax invalid + grant2 # T0 becomes eligible for pruning, T1 is successor + vac3 # T0 becomes LP_UNUSED + mkrels3 # vac1 wakes, scans to T1 + read1 + +# target already has a successor, which commits +permutation + begin2 + grant2 # T0.t_ctid = T1 + vac1(mkrels3) # reads T0 for vactest.orig50 + c2 # T0 becomes eligible for pruning + vac3 # T0 becomes LP_UNUSED + mkrels3 # vac1 wakes, scans to T1 + read1 + +# target already has a successor, which becomes LP_UNUSED at the last moment +permutation + begin2 + grant2 # T0.t_ctid = T1 + vac1(mkrels3) # reads T0 for vactest.orig50 + r2 # T1 becomes eligible for pruning + vac3 # T1 becomes LP_UNUSED + mkrels3 # reuse T1; vac1 scans to T0 + read1 + +# target already has a successor, which becomes LP_REDIRECT at the last moment +permutation + begin2 + grant2 # T0.t_ctid = T1, non-HOT due to filled page + vac1(mkrels3) # reads T0 + c2 + revoke2 # HOT update to T2 + grant2 # HOT update to T3 + vac3 # T1 becomes LP_REDIRECT + mkrels3 # reuse T2; vac1 scans to T3 + read1 + +# waiting for updater to end +permutation + vac1(c2) # reads pg_class tuple T0 for vactest.orig50, xmax invalid + begin2 + grant2 # T0.t_ctid = T1, non-HOT due to filled page + revoke2 # HOT update to T2 + mkrels3 # vac1 awakes briefly, then waits for s2 + c2 + read1 + +# Another LP_UNUSED. This time, do change the live tuple. Final live tuple +# body is identical to original, at a different TID. +permutation + begin2 + grant2 # T0.t_ctid = T1, non-HOT due to filled page + vac1(mkrels3) # reads T0 + r2 # T1 becomes eligible for pruning + grant2 # T0.t_ctid = T2; T0 becomes eligible for pruning + revoke2 # T2.t_ctid = T3; T2 becomes eligible for pruning + vac3 # T0, T1 & T2 become LP_UNUSED + mkrels3 # reuse T0, T1 & T2; vac1 scans to T3 + read1 + +# Another LP_REDIRECT. Compared to the earlier test, omit the last grant2. +# Hence, final live tuple body is identical to original, at a different TID. +permutation begin2 grant2 vac1(mkrels3) c2 revoke2 vac3 mkrels3 read1 diff --git a/src/test/modules/injection_points/specs/syscache-update-pruned.spec b/src/test/modules/injection_points/specs/syscache-update-pruned.spec new file mode 100644 index 0000000000000..e3a4295bd12e8 --- /dev/null +++ b/src/test/modules/injection_points/specs/syscache-update-pruned.spec @@ -0,0 +1,197 @@ +# Test race conditions involving: +# - s1: heap_update($FROM_SYSCACHE), without a snapshot or pin +# - s2: ALTER TABLE making $FROM_SYSCACHE a dead tuple +# - s3: "VACUUM pg_class" making $FROM_SYSCACHE become LP_UNUSED + +# This is a derivative work of inplace.spec, which exercises the corresponding +# race condition for inplace updates. + +# Despite local injection points, this is incompatible with runningcheck. +# First, removable_cutoff() could move backward, per its header comment. +# Second, other activity could trigger sinval queue overflow, negating our +# efforts to delay inval. Third, this deadlock emerges: +# +# - step at2 waits at an injection point, with interrupts held +# - an unrelated backend waits for at2 to do PROCSIGNAL_BARRIER_SMGRRELEASE +# - step waitprunable4 waits for the unrelated backend to release its xmin + +# The alternative expected output is for -DCATCACHE_FORCE_RELEASE, a setting +# that thwarts testing the race conditions this spec seeks. + + +# Need s2 to make a non-HOT update. Otherwise, "VACUUM pg_class" would leave +# an LP_REDIRECT that persists. To get non-HOT, make rels so the pg_class row +# for vactest.orig50 is on a filled page (assuming BLCKSZ=8192). Just to save +# on filesystem syscalls, use relkind=c for every other rel. +setup +{ + CREATE EXTENSION injection_points; + CREATE SCHEMA vactest; + -- Ensure a leader RELOID catcache entry. PARALLEL RESTRICTED since a + -- parallel worker running pg_relation_filenode() would lack that effect. + CREATE FUNCTION vactest.reloid_catcache_set(regclass) RETURNS int + LANGUAGE sql PARALLEL RESTRICTED + AS 'SELECT 0 FROM pg_relation_filenode($1)'; + CREATE FUNCTION vactest.mkrels(text, int, int) RETURNS void + LANGUAGE plpgsql SET search_path = vactest AS $$ + DECLARE + tname text; + BEGIN + FOR i in $2 .. $3 LOOP + tname := $1 || i; + EXECUTE FORMAT('CREATE TYPE ' || tname || ' AS ()'); + RAISE DEBUG '% at %', tname, ctid + FROM pg_class WHERE oid = tname::regclass; + END LOOP; + END + $$; + CREATE PROCEDURE vactest.wait_prunable() LANGUAGE plpgsql AS $$ + DECLARE + barrier xid8; + cutoff xid8; + BEGIN + barrier := pg_current_xact_id(); + -- autovacuum worker RelationCacheInitializePhase3() or the + -- isolationtester control connection might hold a snapshot that + -- limits pruning. Sleep until that clears. See comments at + -- removable_cutoff() for why we pass a shared catalog rather than + -- pg_class, the table we'll prune. + LOOP + ROLLBACK; -- release MyProc->xmin, which could be the oldest + cutoff := removable_cutoff('pg_database'); + EXIT WHEN cutoff >= barrier; + RAISE LOG 'removable cutoff %; waiting for %', cutoff, barrier; + PERFORM pg_sleep(.1); + END LOOP; + END + $$; +} +# Eliminate HEAPTUPLE_DEAD and HEAPTUPLE_RECENTLY_DEAD from pg_class. +# Minimize free space. +# +# If we kept HEAPTUPLE_RECENTLY_DEAD, step vac4 could prune what we missed, +# breaking some permutation assumptions. Specifically, the next pg_class +# tuple could end up in free space we failed to liberate here, instead of +# going in the specific free space vac4 intended to liberate for it. +setup { CALL vactest.wait_prunable(); -- maximize VACUUM FULL } +setup { VACUUM FULL pg_class; -- reduce free space } +# Remove the one tuple that VACUUM FULL makes dead, a tuple pertaining to +# pg_class itself. Populate the FSM for pg_class. +# +# wait_prunable waits for snapshots that would thwart pruning, while FREEZE +# waits for buffer pins that would thwart pruning. DISABLE_PAGE_SKIPPING +# isn't actually needed, but other pruning-dependent tests use it. If those +# tests remove it, remove it here. +setup { CALL vactest.wait_prunable(); -- maximize lazy VACUUM } +setup { VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) pg_class; -- fill fsm etc. } +setup +{ + SELECT FROM vactest.mkrels('orig', 1, 49); + CREATE TABLE vactest.orig50 (c int) WITH (autovacuum_enabled = off); + CREATE TABLE vactest.child50 (c int) WITH (autovacuum_enabled = off); + SELECT FROM vactest.mkrels('orig', 51, 100); +} +teardown +{ + DROP SCHEMA vactest CASCADE; + DROP EXTENSION injection_points; +} + +# Wait during GRANT. Disable debug_discard_caches, since we're here to +# exercise an outcome that happens under permissible cache staleness. +session s1 +setup { + SET debug_discard_caches = 0; + SELECT FROM injection_points_set_local(); + SELECT FROM injection_points_attach('heap_update-before-pin', 'wait'); +} +step cachefill1 { SELECT FROM vactest.reloid_catcache_set('vactest.orig50'); } +step grant1 { GRANT SELECT ON vactest.orig50 TO PUBLIC; } + +# Update of the tuple that grant1 will update. Wait before sending invals, so +# s1 will not get a cache miss. Choose the commands for making such updates +# from among those whose heavyweight locking does not conflict with GRANT's +# heavyweight locking. (GRANT will see our XID as committed, so observing +# that XID in the tuple xmax also won't block GRANT.) +session s2 +setup { + SELECT FROM injection_points_set_local(); + SELECT FROM + injection_points_attach('transaction-end-process-inval', 'wait'); +} +step at2 { + CREATE TRIGGER to_set_relhastriggers BEFORE UPDATE ON vactest.orig50 + FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); +} + +# Hold snapshot to block pruning. +session s3 +step snap3 { BEGIN ISOLATION LEVEL REPEATABLE READ; SELECT; } +step r3 { ROLLBACK; } + +# Non-blocking actions. +session s4 +step waitprunable4 { CALL vactest.wait_prunable(); } +# Eliminate HEAPTUPLE_DEAD. See above discussion of FREEZE. +step vac4 { VACUUM (FREEZE, DISABLE_PAGE_SKIPPING) pg_class; } +# Reuse the lp that s1 is waiting to change. I've observed reuse at the 1st +# or 18th CREATE, so create excess. +step mkrels4 { + SELECT FROM vactest.mkrels('intruder', 1, 100); -- repopulate LP_UNUSED +} +step wakegrant4 { + SELECT FROM injection_points_detach('heap_update-before-pin'); + SELECT FROM injection_points_wakeup('heap_update-before-pin'); +} +step at4 { ALTER TABLE vactest.child50 INHERIT vactest.orig50; } +step wakeinval4 { + SELECT FROM injection_points_detach('transaction-end-process-inval'); + SELECT FROM injection_points_wakeup('transaction-end-process-inval'); +} +# Witness effects of steps at2 and/or at4. +step inspect4 { + SELECT relhastriggers, relhassubclass FROM pg_class + WHERE oid = 'vactest.orig50'::regclass; +} + +# TID from syscache becomes LP_UNUSED. Before the bug fix, this permutation +# made s1 fail with "attempted to update invisible tuple" or an assert. +# However, suppose a pd_lsn value such that (pd_lsn.xlogid, pd_lsn.xrecoff) +# passed for (xmin, xmax) with xmin known-committed and xmax known-aborted. +# Persistent page header corruption ensued. For example, s1 overwrote +# pd_lower, pd_upper, and pd_special as though they were t_ctid. +permutation + cachefill1 # reads pg_class tuple T0, xmax invalid + at2 # T0 dead, T1 live + waitprunable4 # T0 prunable + vac4 # T0 becomes LP_UNUSED + grant1 # pauses at heap_update(T0) + wakeinval4(at2) # at2 sends inval message + wakegrant4(grant1) # s1 wakes: "tuple concurrently deleted" + +# add mkrels4: LP_UNUSED becomes a different rel's row +permutation + cachefill1 # reads pg_class tuple T0, xmax invalid + at2 # T0 dead, T1 live + waitprunable4 # T0 prunable + vac4 # T0 becomes LP_UNUSED + grant1 # pauses at heap_update(T0) + wakeinval4(at2) # at2 sends inval message + mkrels4 # T0 becomes a new rel + wakegrant4(grant1) # s1 wakes: "duplicate key value violates unique" + +# TID from syscache becomes LP_UNUSED, then becomes a newer version of the +# original rel's row. +permutation + snap3 # sets MyProc->xmin + cachefill1 # reads pg_class tuple T0, xmax invalid + at2 # T0 dead, T1 live + mkrels4 # T1's page becomes full + r3 # clears MyProc->xmin + waitprunable4 # T0 prunable + vac4 # T0 becomes LP_UNUSED + grant1 # pauses at heap_update(T0) + wakeinval4(at2) # at2 sends inval message + at4 # T1 dead, T0 live + wakegrant4(grant1) # s1 wakes: T0 dead, T2 live + inspect4 # observe loss of at2+at4 changes XXX is an extant bug diff --git a/src/test/modules/injection_points/sql/injection_points.sql b/src/test/modules/injection_points/sql/injection_points.sql new file mode 100644 index 0000000000000..71e2972a7e498 --- /dev/null +++ b/src/test/modules/injection_points/sql/injection_points.sql @@ -0,0 +1,70 @@ +CREATE EXTENSION injection_points; + +\getenv libdir PG_LIBDIR +\getenv dlsuffix PG_DLSUFFIX +\set regresslib :libdir '/regress' :dlsuffix + +CREATE FUNCTION wait_pid(int) + RETURNS void + AS :'regresslib' + LANGUAGE C STRICT; + +SELECT injection_points_attach('TestInjectionBooh', 'booh'); +SELECT injection_points_attach('TestInjectionError', 'error'); +SELECT injection_points_attach('TestInjectionLog', 'notice'); +SELECT injection_points_attach('TestInjectionLog2', 'notice'); + +SELECT injection_points_run('TestInjectionBooh'); -- nothing +SELECT injection_points_run('TestInjectionLog2'); -- notice +SELECT injection_points_run('TestInjectionLog'); -- notice +SELECT injection_points_run('TestInjectionError'); -- error + +-- Re-load cache and run again. +\c +SELECT injection_points_run('TestInjectionLog2'); -- notice +SELECT injection_points_run('TestInjectionLog'); -- notice +SELECT injection_points_run('TestInjectionError'); -- error + +-- Remove one entry and check the remaining entries. +SELECT injection_points_detach('TestInjectionError'); -- ok +SELECT injection_points_run('TestInjectionLog'); -- notice +SELECT injection_points_run('TestInjectionError'); -- nothing +-- More entries removed, letting TestInjectionLog2 to check the same +-- callback used in more than one point. +SELECT injection_points_detach('TestInjectionLog'); -- ok +SELECT injection_points_run('TestInjectionLog'); -- nothing +SELECT injection_points_run('TestInjectionError'); -- nothing +SELECT injection_points_run('TestInjectionLog2'); -- notice + +SELECT injection_points_detach('TestInjectionLog'); -- fails + +SELECT injection_points_run('TestInjectionLog2'); -- notice +SELECT injection_points_detach('TestInjectionLog2'); + +-- Runtime conditions +SELECT injection_points_attach('TestConditionError', 'error'); +-- Any follow-up injection point attached will be local to this process. +SELECT injection_points_set_local(); +SELECT injection_points_attach('TestConditionLocal1', 'error'); +SELECT injection_points_attach('TestConditionLocal2', 'notice'); +SELECT injection_points_run('TestConditionLocal1'); -- error +SELECT injection_points_run('TestConditionLocal2'); -- notice + +SELECT pg_backend_pid() AS oldpid \gset + +-- reload, local injection points should be gone. +\c +-- Wait for the previous backend process to exit, ensuring that its local +-- injection points are cleaned up. +SELECT wait_pid(:'oldpid'); +SELECT injection_points_run('TestConditionLocal1'); -- nothing +SELECT injection_points_run('TestConditionLocal2'); -- nothing +SELECT injection_points_run('TestConditionError'); -- error +SELECT injection_points_detach('TestConditionError'); +-- Attaching injection points that use the same name as one defined locally +-- previously should work. +SELECT injection_points_attach('TestConditionLocal1', 'error'); +SELECT injection_points_detach('TestConditionLocal1'); + +DROP EXTENSION injection_points; +DROP FUNCTION wait_pid; diff --git a/src/test/modules/injection_points/sql/reindex_conc.sql b/src/test/modules/injection_points/sql/reindex_conc.sql new file mode 100644 index 0000000000000..6cf211e6d5dd0 --- /dev/null +++ b/src/test/modules/injection_points/sql/reindex_conc.sql @@ -0,0 +1,28 @@ +-- Tests for REINDEX CONCURRENTLY +CREATE EXTENSION injection_points; + +-- Check safety of indexes with predicates and expressions. +SELECT injection_points_set_local(); +SELECT injection_points_attach('reindex-conc-index-safe', 'notice'); +SELECT injection_points_attach('reindex-conc-index-not-safe', 'notice'); + +CREATE SCHEMA reindex_inj; +CREATE TABLE reindex_inj.tbl(i int primary key, updated_at timestamp); + +CREATE UNIQUE INDEX ind_simple ON reindex_inj.tbl(i); +CREATE UNIQUE INDEX ind_expr ON reindex_inj.tbl(ABS(i)); +CREATE UNIQUE INDEX ind_pred ON reindex_inj.tbl(i) WHERE mod(i, 2) = 0; +CREATE UNIQUE INDEX ind_expr_pred ON reindex_inj.tbl(abs(i)) WHERE mod(i, 2) = 0; + +REINDEX INDEX CONCURRENTLY reindex_inj.ind_simple; +REINDEX INDEX CONCURRENTLY reindex_inj.ind_expr; +REINDEX INDEX CONCURRENTLY reindex_inj.ind_pred; +REINDEX INDEX CONCURRENTLY reindex_inj.ind_expr_pred; + +-- Cleanup +SELECT injection_points_detach('reindex-conc-index-safe'); +SELECT injection_points_detach('reindex-conc-index-not-safe'); +DROP TABLE reindex_inj.tbl; +DROP SCHEMA reindex_inj; + +DROP EXTENSION injection_points; diff --git a/src/test/modules/ldap_password_func/Makefile b/src/test/modules/ldap_password_func/Makefile index de60ee3dbb63e..5bd50f0b4864a 100644 --- a/src/test/modules/ldap_password_func/Makefile +++ b/src/test/modules/ldap_password_func/Makefile @@ -1,4 +1,4 @@ -# Copyright (c) 2022, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # ldap_password_func Makefile diff --git a/src/test/modules/ldap_password_func/ldap_password_func.c b/src/test/modules/ldap_password_func/ldap_password_func.c index 4d980d28b1ef3..99c18a8f1c89a 100644 --- a/src/test/modules/ldap_password_func/ldap_password_func.c +++ b/src/test/modules/ldap_password_func/ldap_password_func.c @@ -1,6 +1,6 @@ /*------------------------------------------------------------------------- * - * Copyright (c) 2022, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * ldap_password_func.c * @@ -15,9 +15,9 @@ #include #include +#include "libpq/auth.h" #include "libpq/libpq.h" #include "libpq/libpq-be.h" -#include "libpq/auth.h" #include "utils/guc.h" PG_MODULE_MAGIC; diff --git a/src/test/modules/ldap_password_func/meson.build b/src/test/modules/ldap_password_func/meson.build index 63dc852bf3c01..209b66833734f 100644 --- a/src/test/modules/ldap_password_func/meson.build +++ b/src/test/modules/ldap_password_func/meson.build @@ -14,7 +14,7 @@ endif ldap_password_func = shared_module('ldap_password_func', ldap_password_func_sources, - kwargs: pg_mod_args + { + kwargs: pg_test_mod_args + { 'dependencies': [ldap, pg_mod_args['dependencies']], }, ) diff --git a/src/test/modules/ldap_password_func/t/001_mutated_bindpasswd.pl b/src/test/modules/ldap_password_func/t/001_mutated_bindpasswd.pl index c96c8d7a4de10..b990e7d101ea2 100644 --- a/src/test/modules/ldap_password_func/t/001_mutated_bindpasswd.pl +++ b/src/test/modules/ldap_password_func/t/001_mutated_bindpasswd.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2022, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use File::Copy; use FindBin; use PostgreSQL::Test::Utils; @@ -20,7 +20,7 @@ { plan skip_all => 'LDAP not supported by this build'; } -elsif ($ENV{PG_TEST_EXTRA} !~ /\bldap\b/) +elsif (!$ENV{PG_TEST_EXTRA} || $ENV{PG_TEST_EXTRA} !~ /\bldap\b/) { plan skip_all => 'Potentially unsafe test LDAP not enabled in PG_TEST_EXTRA'; diff --git a/src/test/modules/libpq_pipeline/libpq_pipeline.c b/src/test/modules/libpq_pipeline/libpq_pipeline.c index 1933b078ebfe7..ac4d26302cc87 100644 --- a/src/test/modules/libpq_pipeline/libpq_pipeline.c +++ b/src/test/modules/libpq_pipeline/libpq_pipeline.c @@ -3,7 +3,7 @@ * libpq_pipeline.c * Verify libpq pipeline execution functionality * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * @@ -64,6 +64,11 @@ exit_nicely(PGconn *conn) exit(1); } +/* + * The following few functions are wrapped in macros to make the reported line + * number in an error match the line number of the invocation. + */ + /* * Print an error to stderr and terminate the program. */ @@ -74,7 +79,6 @@ pg_fatal_impl(int line, const char *fmt,...) { va_list args; - fflush(stdout); fprintf(stderr, "\n%s:%d: ", progname, line); @@ -86,6 +90,321 @@ pg_fatal_impl(int line, const char *fmt,...) exit(1); } +/* + * Check that the query on the given connection got canceled. + */ +#define confirm_query_canceled(conn) confirm_query_canceled_impl(__LINE__, conn) +static void +confirm_query_canceled_impl(int line, PGconn *conn) +{ + PGresult *res = NULL; + + res = PQgetResult(conn); + if (res == NULL) + pg_fatal_impl(line, "PQgetResult returned null: %s", + PQerrorMessage(conn)); + if (PQresultStatus(res) != PGRES_FATAL_ERROR) + pg_fatal_impl(line, "query did not fail when it was expected"); + if (strcmp(PQresultErrorField(res, PG_DIAG_SQLSTATE), "57014") != 0) + pg_fatal_impl(line, "query failed with a different error than cancellation: %s", + PQerrorMessage(conn)); + PQclear(res); + + while (PQisBusy(conn)) + PQconsumeInput(conn); +} + +/* + * Using monitorConn, query pg_stat_activity to see that the connection with + * the given PID is either in the given state, or waiting on the given event + * (only one of them can be given). + */ +static void +wait_for_connection_state(int line, PGconn *monitorConn, int procpid, + char *state, char *event) +{ + const Oid paramTypes[] = {INT4OID, TEXTOID}; + const char *paramValues[2]; + char *pidstr = psprintf("%d", procpid); + + Assert((state == NULL) ^ (event == NULL)); + + paramValues[0] = pidstr; + paramValues[1] = state ? state : event; + + while (true) + { + PGresult *res; + char *value; + + if (state != NULL) + res = PQexecParams(monitorConn, + "SELECT count(*) FROM pg_stat_activity WHERE " + "pid = $1 AND state = $2", + 2, paramTypes, paramValues, NULL, NULL, 0); + else + res = PQexecParams(monitorConn, + "SELECT count(*) FROM pg_stat_activity WHERE " + "pid = $1 AND wait_event = $2", + 2, paramTypes, paramValues, NULL, NULL, 0); + + if (PQresultStatus(res) != PGRES_TUPLES_OK) + pg_fatal_impl(line, "could not query pg_stat_activity: %s", PQerrorMessage(monitorConn)); + if (PQntuples(res) != 1) + pg_fatal_impl(line, "unexpected number of rows received: %d", PQntuples(res)); + if (PQnfields(res) != 1) + pg_fatal_impl(line, "unexpected number of columns received: %d", PQnfields(res)); + value = PQgetvalue(res, 0, 0); + if (strcmp(value, "0") != 0) + { + PQclear(res); + break; + } + PQclear(res); + + /* wait 10ms before polling again */ + pg_usleep(10000); + } + + pfree(pidstr); +} + +#define send_cancellable_query(conn, monitorConn) \ + send_cancellable_query_impl(__LINE__, conn, monitorConn) +static void +send_cancellable_query_impl(int line, PGconn *conn, PGconn *monitorConn) +{ + const char *env_wait; + const Oid paramTypes[1] = {INT4OID}; + + /* + * Wait for the connection to be idle, so that our check for an active + * connection below is reliable, instead of possibly seeing an outdated + * state. + */ + wait_for_connection_state(line, monitorConn, PQbackendPID(conn), "idle", NULL); + + env_wait = getenv("PG_TEST_TIMEOUT_DEFAULT"); + if (env_wait == NULL) + env_wait = "180"; + + if (PQsendQueryParams(conn, "SELECT pg_sleep($1)", 1, paramTypes, + &env_wait, NULL, NULL, 0) != 1) + pg_fatal_impl(line, "failed to send query: %s", PQerrorMessage(conn)); + + /* + * Wait for the sleep to be active, because if the query is not running + * yet, the cancel request that we send won't have any effect. + */ + wait_for_connection_state(line, monitorConn, PQbackendPID(conn), NULL, "PgSleep"); +} + +/* + * Create a new connection with the same conninfo as the given one. + */ +static PGconn * +copy_connection(PGconn *conn) +{ + PGconn *copyConn; + PQconninfoOption *opts = PQconninfo(conn); + const char **keywords; + const char **vals; + int nopts = 1; + int i = 0; + + for (PQconninfoOption *opt = opts; opt->keyword != NULL; ++opt) + nopts++; + + keywords = pg_malloc(sizeof(char *) * nopts); + vals = pg_malloc(sizeof(char *) * nopts); + + for (PQconninfoOption *opt = opts; opt->keyword != NULL; ++opt) + { + if (opt->val) + { + keywords[i] = opt->keyword; + vals[i] = opt->val; + i++; + } + } + keywords[i] = vals[i] = NULL; + + copyConn = PQconnectdbParams(keywords, vals, false); + + if (PQstatus(copyConn) != CONNECTION_OK) + pg_fatal("Connection to database failed: %s", + PQerrorMessage(copyConn)); + + return copyConn; +} + +/* + * Test query cancellation routines + */ +static void +test_cancel(PGconn *conn) +{ + PGcancel *cancel; + PGcancelConn *cancelConn; + PGconn *monitorConn; + char errorbuf[256]; + + fprintf(stderr, "test cancellations... "); + + if (PQsetnonblocking(conn, 1) != 0) + pg_fatal("failed to set nonblocking mode: %s", PQerrorMessage(conn)); + + /* + * Make a separate connection to the database to monitor the query on the + * main connection. + */ + monitorConn = copy_connection(conn); + Assert(PQstatus(monitorConn) == CONNECTION_OK); + + /* test PQcancel */ + send_cancellable_query(conn, monitorConn); + cancel = PQgetCancel(conn); + if (!PQcancel(cancel, errorbuf, sizeof(errorbuf))) + pg_fatal("failed to run PQcancel: %s", errorbuf); + confirm_query_canceled(conn); + + /* PGcancel object can be reused for the next query */ + send_cancellable_query(conn, monitorConn); + if (!PQcancel(cancel, errorbuf, sizeof(errorbuf))) + pg_fatal("failed to run PQcancel: %s", errorbuf); + confirm_query_canceled(conn); + + PQfreeCancel(cancel); + + /* test PQrequestCancel */ + send_cancellable_query(conn, monitorConn); + if (!PQrequestCancel(conn)) + pg_fatal("failed to run PQrequestCancel: %s", PQerrorMessage(conn)); + confirm_query_canceled(conn); + + /* test PQcancelBlocking */ + send_cancellable_query(conn, monitorConn); + cancelConn = PQcancelCreate(conn); + if (!PQcancelBlocking(cancelConn)) + pg_fatal("failed to run PQcancelBlocking: %s", PQcancelErrorMessage(cancelConn)); + confirm_query_canceled(conn); + PQcancelFinish(cancelConn); + + /* test PQcancelCreate and then polling with PQcancelPoll */ + send_cancellable_query(conn, monitorConn); + cancelConn = PQcancelCreate(conn); + if (!PQcancelStart(cancelConn)) + pg_fatal("bad cancel connection: %s", PQcancelErrorMessage(cancelConn)); + while (true) + { + struct timeval tv; + fd_set input_mask; + fd_set output_mask; + PostgresPollingStatusType pollres = PQcancelPoll(cancelConn); + int sock = PQcancelSocket(cancelConn); + + if (pollres == PGRES_POLLING_OK) + break; + + FD_ZERO(&input_mask); + FD_ZERO(&output_mask); + switch (pollres) + { + case PGRES_POLLING_READING: + pg_debug("polling for reads\n"); + FD_SET(sock, &input_mask); + break; + case PGRES_POLLING_WRITING: + pg_debug("polling for writes\n"); + FD_SET(sock, &output_mask); + break; + default: + pg_fatal("bad cancel connection: %s", PQcancelErrorMessage(cancelConn)); + } + + if (sock < 0) + pg_fatal("sock did not exist: %s", PQcancelErrorMessage(cancelConn)); + + tv.tv_sec = 3; + tv.tv_usec = 0; + + while (true) + { + if (select(sock + 1, &input_mask, &output_mask, NULL, &tv) < 0) + { + if (errno == EINTR) + continue; + pg_fatal("select() failed: %m"); + } + break; + } + } + if (PQcancelStatus(cancelConn) != CONNECTION_OK) + pg_fatal("unexpected cancel connection status: %s", PQcancelErrorMessage(cancelConn)); + confirm_query_canceled(conn); + + /* + * test PQcancelReset works on the cancel connection and it can be reused + * afterwards + */ + PQcancelReset(cancelConn); + + send_cancellable_query(conn, monitorConn); + if (!PQcancelStart(cancelConn)) + pg_fatal("bad cancel connection: %s", PQcancelErrorMessage(cancelConn)); + while (true) + { + struct timeval tv; + fd_set input_mask; + fd_set output_mask; + PostgresPollingStatusType pollres = PQcancelPoll(cancelConn); + int sock = PQcancelSocket(cancelConn); + + if (pollres == PGRES_POLLING_OK) + break; + + FD_ZERO(&input_mask); + FD_ZERO(&output_mask); + switch (pollres) + { + case PGRES_POLLING_READING: + pg_debug("polling for reads\n"); + FD_SET(sock, &input_mask); + break; + case PGRES_POLLING_WRITING: + pg_debug("polling for writes\n"); + FD_SET(sock, &output_mask); + break; + default: + pg_fatal("bad cancel connection: %s", PQcancelErrorMessage(cancelConn)); + } + + if (sock < 0) + pg_fatal("sock did not exist: %s", PQcancelErrorMessage(cancelConn)); + + tv.tv_sec = 3; + tv.tv_usec = 0; + + while (true) + { + if (select(sock + 1, &input_mask, &output_mask, NULL, &tv) < 0) + { + if (errno == EINTR) + continue; + pg_fatal("select() failed: %m"); + } + break; + } + } + if (PQcancelStatus(cancelConn) != CONNECTION_OK) + pg_fatal("unexpected cancel connection status: %s", PQcancelErrorMessage(cancelConn)); + confirm_query_canceled(conn); + + PQcancelFinish(cancelConn); + + fprintf(stderr, "ok\n"); +} + static void test_disallowed_in_pipeline(PGconn *conn) { @@ -162,6 +481,7 @@ test_multi_pipelines(PGconn *conn) if (PQenterPipelineMode(conn) != 1) pg_fatal("failed to enter pipeline mode: %s", PQerrorMessage(conn)); + /* first pipeline */ if (PQsendQueryParams(conn, "SELECT $1", 1, dummy_param_oids, dummy_params, NULL, NULL, 0) != 1) pg_fatal("dispatching first SELECT failed: %s", PQerrorMessage(conn)); @@ -169,14 +489,27 @@ test_multi_pipelines(PGconn *conn) if (PQpipelineSync(conn) != 1) pg_fatal("Pipeline sync failed: %s", PQerrorMessage(conn)); + /* second pipeline */ if (PQsendQueryParams(conn, "SELECT $1", 1, dummy_param_oids, dummy_params, NULL, NULL, 0) != 1) pg_fatal("dispatching second SELECT failed: %s", PQerrorMessage(conn)); + /* Skip flushing once. */ + if (PQsendPipelineSync(conn) != 1) + pg_fatal("Pipeline sync failed: %s", PQerrorMessage(conn)); + + /* third pipeline */ + if (PQsendQueryParams(conn, "SELECT $1", 1, dummy_param_oids, + dummy_params, NULL, NULL, 0) != 1) + pg_fatal("dispatching third SELECT failed: %s", PQerrorMessage(conn)); + if (PQpipelineSync(conn) != 1) pg_fatal("pipeline sync failed: %s", PQerrorMessage(conn)); /* OK, start processing the results */ + + /* first pipeline */ + res = PQgetResult(conn); if (res == NULL) pg_fatal("PQgetResult returned null when there's a pipeline item: %s", @@ -214,6 +547,35 @@ test_multi_pipelines(PGconn *conn) if (PQresultStatus(res) != PGRES_TUPLES_OK) pg_fatal("Unexpected result code %s from second pipeline item", PQresStatus(PQresultStatus(res))); + PQclear(res); + res = NULL; + + if (PQgetResult(conn) != NULL) + pg_fatal("PQgetResult returned something extra after first result"); + + if (PQexitPipelineMode(conn) != 0) + pg_fatal("exiting pipeline mode after query but before sync succeeded incorrectly"); + + res = PQgetResult(conn); + if (res == NULL) + pg_fatal("PQgetResult returned null when sync result expected: %s", + PQerrorMessage(conn)); + + if (PQresultStatus(res) != PGRES_PIPELINE_SYNC) + pg_fatal("Unexpected result code %s instead of sync result, error: %s", + PQresStatus(PQresultStatus(res)), PQerrorMessage(conn)); + PQclear(res); + + /* third pipeline */ + + res = PQgetResult(conn); + if (res == NULL) + pg_fatal("PQgetResult returned null when there's a pipeline item: %s", + PQerrorMessage(conn)); + + if (PQresultStatus(res) != PGRES_TUPLES_OK) + pg_fatal("Unexpected result code %s from third pipeline item", + PQresStatus(PQresultStatus(res))); res = PQgetResult(conn); if (res != NULL) @@ -281,7 +643,7 @@ test_nosync(PGconn *conn) tv.tv_usec = 0; if (select(sock + 1, &input_mask, NULL, NULL, &tv) < 0) { - fprintf(stderr, "select() failed: %s\n", strerror(errno)); + fprintf(stderr, "select() failed: %m\n"); exit_nicely(conn); } if (FD_ISSET(sock, &input_mask) && PQconsumeInput(conn) != 1) @@ -639,7 +1001,7 @@ enum PipelineInsertStep BI_INSERT_ROWS, BI_COMMIT_TX, BI_SYNC, - BI_DONE + BI_DONE, }; static void @@ -732,7 +1094,7 @@ test_pipelined_insert(PGconn *conn, int n_rows) if (select(sock + 1, &input_mask, &output_mask, NULL, NULL) < 0) { - fprintf(stderr, "select() failed: %s\n", strerror(errno)); + fprintf(stderr, "select() failed: %m\n"); exit_nicely(conn); } @@ -929,7 +1291,7 @@ test_prepared(PGconn *conn) if (PQresultStatus(res) != PGRES_COMMAND_OK) pg_fatal("expected COMMAND_OK, got %s", PQresStatus(PQresultStatus(res))); if (PQnfields(res) != lengthof(expected_oids)) - pg_fatal("expected %zd columns, got %d", + pg_fatal("expected %zu columns, got %d", lengthof(expected_oids), PQnfields(res)); for (int i = 0; i < PQnfields(res); i++) { @@ -947,9 +1309,42 @@ test_prepared(PGconn *conn) if (PQresultStatus(res) != PGRES_PIPELINE_SYNC) pg_fatal("expected PGRES_PIPELINE_SYNC, got %s", PQresStatus(PQresultStatus(res))); + fprintf(stderr, "closing statement.."); + if (PQsendClosePrepared(conn, "select_one") != 1) + pg_fatal("PQsendClosePrepared failed: %s", PQerrorMessage(conn)); + if (PQpipelineSync(conn) != 1) + pg_fatal("pipeline sync failed: %s", PQerrorMessage(conn)); + + res = PQgetResult(conn); + if (res == NULL) + pg_fatal("expected non-NULL result"); + if (PQresultStatus(res) != PGRES_COMMAND_OK) + pg_fatal("expected COMMAND_OK, got %s", PQresStatus(PQresultStatus(res))); + PQclear(res); + res = PQgetResult(conn); + if (res != NULL) + pg_fatal("expected NULL result"); + res = PQgetResult(conn); + if (PQresultStatus(res) != PGRES_PIPELINE_SYNC) + pg_fatal("expected PGRES_PIPELINE_SYNC, got %s", PQresStatus(PQresultStatus(res))); + if (PQexitPipelineMode(conn) != 1) pg_fatal("could not exit pipeline mode: %s", PQerrorMessage(conn)); + /* Now that it's closed we should get an error when describing */ + res = PQdescribePrepared(conn, "select_one"); + if (PQresultStatus(res) != PGRES_FATAL_ERROR) + pg_fatal("expected FATAL_ERROR, got %s", PQresStatus(PQresultStatus(res))); + + /* + * Also test the blocking close, this should not fail since closing a + * non-existent prepared statement is a no-op + */ + res = PQclosePrepared(conn, "select_one"); + if (PQresultStatus(res) != PGRES_COMMAND_OK) + pg_fatal("expected COMMAND_OK, got %s", PQresStatus(PQresultStatus(res))); + + fprintf(stderr, "creating portal... "); PQexec(conn, "BEGIN"); PQexec(conn, "DECLARE cursor_one CURSOR FOR SELECT 1"); PQenterPipelineMode(conn); @@ -975,9 +1370,41 @@ test_prepared(PGconn *conn) if (PQresultStatus(res) != PGRES_PIPELINE_SYNC) pg_fatal("expected PGRES_PIPELINE_SYNC, got %s", PQresStatus(PQresultStatus(res))); + fprintf(stderr, "closing portal... "); + if (PQsendClosePortal(conn, "cursor_one") != 1) + pg_fatal("PQsendClosePortal failed: %s", PQerrorMessage(conn)); + if (PQpipelineSync(conn) != 1) + pg_fatal("pipeline sync failed: %s", PQerrorMessage(conn)); + + res = PQgetResult(conn); + if (res == NULL) + pg_fatal("expected non-NULL result"); + if (PQresultStatus(res) != PGRES_COMMAND_OK) + pg_fatal("expected COMMAND_OK, got %s", PQresStatus(PQresultStatus(res))); + PQclear(res); + res = PQgetResult(conn); + if (res != NULL) + pg_fatal("expected NULL result"); + res = PQgetResult(conn); + if (PQresultStatus(res) != PGRES_PIPELINE_SYNC) + pg_fatal("expected PGRES_PIPELINE_SYNC, got %s", PQresStatus(PQresultStatus(res))); + if (PQexitPipelineMode(conn) != 1) pg_fatal("could not exit pipeline mode: %s", PQerrorMessage(conn)); + /* Now that it's closed we should get an error when describing */ + res = PQdescribePortal(conn, "cursor_one"); + if (PQresultStatus(res) != PGRES_FATAL_ERROR) + pg_fatal("expected FATAL_ERROR, got %s", PQresStatus(PQresultStatus(res))); + + /* + * Also test the blocking close, this should not fail since closing a + * non-existent portal is a no-op + */ + res = PQclosePortal(conn, "cursor_one"); + if (PQresultStatus(res) != PGRES_COMMAND_OK) + pg_fatal("expected COMMAND_OK, got %s", PQresStatus(PQresultStatus(res))); + fprintf(stderr, "ok\n"); } @@ -1292,6 +1719,46 @@ test_singlerowmode(PGconn *conn) if (PQgetResult(conn) != NULL) pg_fatal("expected NULL result"); + /* + * Try chunked mode as well; make sure that it correctly delivers a + * partial final chunk. + */ + if (PQsendQueryParams(conn, "SELECT generate_series(1, 5)", + 0, NULL, NULL, NULL, NULL, 0) != 1) + pg_fatal("failed to send query: %s", + PQerrorMessage(conn)); + if (PQsendFlushRequest(conn) != 1) + pg_fatal("failed to send flush request"); + if (PQsetChunkedRowsMode(conn, 3) != 1) + pg_fatal("PQsetChunkedRowsMode() failed"); + res = PQgetResult(conn); + if (res == NULL) + pg_fatal("unexpected NULL"); + if (PQresultStatus(res) != PGRES_TUPLES_CHUNK) + pg_fatal("Expected PGRES_TUPLES_CHUNK, got %s: %s", + PQresStatus(PQresultStatus(res)), + PQerrorMessage(conn)); + if (PQntuples(res) != 3) + pg_fatal("Expected 3 rows, got %d", PQntuples(res)); + res = PQgetResult(conn); + if (res == NULL) + pg_fatal("unexpected NULL"); + if (PQresultStatus(res) != PGRES_TUPLES_CHUNK) + pg_fatal("Expected PGRES_TUPLES_CHUNK, got %s", + PQresStatus(PQresultStatus(res))); + if (PQntuples(res) != 2) + pg_fatal("Expected 2 rows, got %d", PQntuples(res)); + res = PQgetResult(conn); + if (res == NULL) + pg_fatal("unexpected NULL"); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + pg_fatal("Expected PGRES_TUPLES_OK, got %s", + PQresStatus(PQresultStatus(res))); + if (PQntuples(res) != 0) + pg_fatal("Expected 0 rows, got %d", PQntuples(res)); + if (PQgetResult(conn) != NULL) + pg_fatal("expected NULL result"); + if (PQexitPipelineMode(conn) != 1) pg_fatal("failed to end pipeline mode: %s", PQerrorMessage(conn)); @@ -1681,6 +2148,7 @@ usage(const char *progname) static void print_test_list(void) { + printf("cancel\n"); printf("disallowed_in_pipeline\n"); printf("multi_pipelines\n"); printf("nosync\n"); @@ -1759,10 +2227,10 @@ main(int argc, char **argv) res = PQexec(conn, "SET lc_messages TO \"C\""); if (PQresultStatus(res) != PGRES_COMMAND_OK) - pg_fatal("failed to set lc_messages: %s", PQerrorMessage(conn)); + pg_fatal("failed to set \"lc_messages\": %s", PQerrorMessage(conn)); res = PQexec(conn, "SET debug_parallel_query = off"); if (PQresultStatus(res) != PGRES_COMMAND_OK) - pg_fatal("failed to set debug_parallel_query: %s", PQerrorMessage(conn)); + pg_fatal("failed to set \"debug_parallel_query\": %s", PQerrorMessage(conn)); /* Set the trace file, if requested */ if (tracefile != NULL) @@ -1782,7 +2250,9 @@ main(int argc, char **argv) PQTRACE_SUPPRESS_TIMESTAMPS | PQTRACE_REGRESS_MODE); } - if (strcmp(testname, "disallowed_in_pipeline") == 0) + if (strcmp(testname, "cancel") == 0) + test_cancel(conn); + else if (strcmp(testname, "disallowed_in_pipeline") == 0) test_disallowed_in_pipeline(conn); else if (strcmp(testname, "multi_pipelines") == 0) test_multi_pipelines(conn); diff --git a/src/test/modules/libpq_pipeline/meson.build b/src/test/modules/libpq_pipeline/meson.build index 91fd96ba524cb..43beda411ce5d 100644 --- a/src/test/modules/libpq_pipeline/meson.build +++ b/src/test/modules/libpq_pipeline/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group libpq_pipeline_sources = files( 'libpq_pipeline.c', @@ -27,5 +27,6 @@ tests += { 'tests': [ 't/001_libpq_pipeline.pl', ], + 'deps': [libpq_pipeline], }, } diff --git a/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl b/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl index 056fa5c6d2b97..f9e6d07fc0b94 100644 --- a/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl +++ b/src/test/modules/libpq_pipeline/t/001_libpq_pipeline.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/test/modules/libpq_pipeline/traces/multi_pipelines.trace b/src/test/modules/libpq_pipeline/traces/multi_pipelines.trace index 4b9ab07ca42f8..1ee21f61dce13 100644 --- a/src/test/modules/libpq_pipeline/traces/multi_pipelines.trace +++ b/src/test/modules/libpq_pipeline/traces/multi_pipelines.trace @@ -8,6 +8,17 @@ F 19 Bind "" "" 0 1 1 '1' 1 0 F 6 Describe P "" F 9 Execute "" 0 F 4 Sync +F 21 Parse "" "SELECT $1" 1 NNNN +F 19 Bind "" "" 0 1 1 '1' 1 0 +F 6 Describe P "" +F 9 Execute "" 0 +F 4 Sync +B 4 ParseComplete +B 4 BindComplete +B 33 RowDescription 1 "?column?" NNNN 0 NNNN 4 -1 0 +B 11 DataRow 1 1 '1' +B 13 CommandComplete "SELECT 1" +B 5 ReadyForQuery I B 4 ParseComplete B 4 BindComplete B 33 RowDescription 1 "?column?" NNNN 0 NNNN 4 -1 0 diff --git a/src/test/modules/libpq_pipeline/traces/prepared.trace b/src/test/modules/libpq_pipeline/traces/prepared.trace index 1a7de5c3e65e3..aeb5de109e021 100644 --- a/src/test/modules/libpq_pipeline/traces/prepared.trace +++ b/src/test/modules/libpq_pipeline/traces/prepared.trace @@ -5,6 +5,18 @@ B 4 ParseComplete B 10 ParameterDescription 1 NNNN B 113 RowDescription 4 "?column?" NNNN 0 NNNN 4 -1 0 "?column?" NNNN 0 NNNN 65535 -1 0 "numeric" NNNN 0 NNNN 65535 -1 0 "interval" NNNN 0 NNNN 16 -1 0 B 5 ReadyForQuery I +F 16 Close S "select_one" +F 4 Sync +B 4 CloseComplete +B 5 ReadyForQuery I +F 16 Describe S "select_one" +F 4 Sync +B NN ErrorResponse S "ERROR" V "ERROR" C "26000" M "prepared statement "select_one" does not exist" F "SSSS" L "SSSS" R "SSSS" \x00 +B 5 ReadyForQuery I +F 16 Close S "select_one" +F 4 Sync +B 4 CloseComplete +B 5 ReadyForQuery I F 10 Query "BEGIN" B 10 CommandComplete "BEGIN" B 5 ReadyForQuery T @@ -15,4 +27,16 @@ F 16 Describe P "cursor_one" F 4 Sync B 33 RowDescription 1 "?column?" NNNN 0 NNNN 4 -1 0 B 5 ReadyForQuery T +F 16 Close P "cursor_one" +F 4 Sync +B 4 CloseComplete +B 5 ReadyForQuery T +F 16 Describe P "cursor_one" +F 4 Sync +B NN ErrorResponse S "ERROR" V "ERROR" C "34000" M "portal "cursor_one" does not exist" F "SSSS" L "SSSS" R "SSSS" \x00 +B 5 ReadyForQuery E +F 16 Close P "cursor_one" +F 4 Sync +B 4 CloseComplete +B 5 ReadyForQuery E F 4 Terminate diff --git a/src/test/modules/libpq_pipeline/traces/singlerow.trace b/src/test/modules/libpq_pipeline/traces/singlerow.trace index 83043e1407e85..029cd66581d79 100644 --- a/src/test/modules/libpq_pipeline/traces/singlerow.trace +++ b/src/test/modules/libpq_pipeline/traces/singlerow.trace @@ -56,4 +56,18 @@ B 4 BindComplete B 33 RowDescription 1 "?column?" NNNN 0 NNNN 4 -1 0 B 11 DataRow 1 1 '1' B 13 CommandComplete "SELECT 1" +F 36 Parse "" "SELECT generate_series(1, 5)" 0 +F 14 Bind "" "" 0 0 1 0 +F 6 Describe P "" +F 9 Execute "" 0 +F 4 Flush +B 4 ParseComplete +B 4 BindComplete +B 40 RowDescription 1 "generate_series" NNNN 0 NNNN 4 -1 0 +B 11 DataRow 1 1 '1' +B 11 DataRow 1 1 '2' +B 11 DataRow 1 1 '3' +B 11 DataRow 1 1 '4' +B 11 DataRow 1 1 '5' +B 13 CommandComplete "SELECT 5" F 4 Terminate diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build index 17d369e3789d1..1730d1ac1c4f4 100644 --- a/src/test/modules/meson.build +++ b/src/test/modules/meson.build @@ -1,33 +1,42 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group subdir('brin') subdir('commit_ts') subdir('delay_execution') subdir('dummy_index_am') subdir('dummy_seclabel') +subdir('gin') +subdir('injection_points') subdir('ldap_password_func') subdir('libpq_pipeline') subdir('plsample') -subdir('snapshot_too_old') subdir('spgist_name_ops') subdir('ssl_passphrase_callback') subdir('test_bloomfilter') subdir('test_copy_callbacks') subdir('test_custom_rmgrs') subdir('test_ddl_deparse') +subdir('test_dsa') +subdir('test_dsm_registry') +subdir('test_escape') subdir('test_extensions') subdir('test_ginpostinglist') subdir('test_integerset') +subdir('test_json_parser') subdir('test_lfind') subdir('test_misc') subdir('test_oat_hooks') subdir('test_parser') subdir('test_pg_dump') subdir('test_predtest') +subdir('test_radixtree') subdir('test_rbtree') subdir('test_regex') +subdir('test_resowner') subdir('test_rls_hooks') subdir('test_shm_mq') subdir('test_slru') +subdir('test_tidstore') subdir('unsafe_tests') subdir('worker_spi') +subdir('xid_wraparound') diff --git a/src/test/modules/plsample/meson.build b/src/test/modules/plsample/meson.build index 44fa107595f71..9a1f16a20f2d5 100644 --- a/src/test/modules/plsample/meson.build +++ b/src/test/modules/plsample/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group plsample_sources = files( 'plsample.c', diff --git a/src/test/modules/plsample/plsample.c b/src/test/modules/plsample/plsample.c index a80d966e2ad08..40c462e84e03a 100644 --- a/src/test/modules/plsample/plsample.c +++ b/src/test/modules/plsample/plsample.c @@ -3,7 +3,7 @@ * plsample.c * Handler for the PL/Sample procedural language * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * diff --git a/src/test/modules/snapshot_too_old/Makefile b/src/test/modules/snapshot_too_old/Makefile deleted file mode 100644 index dfb4537f63c77..0000000000000 --- a/src/test/modules/snapshot_too_old/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -# src/test/modules/snapshot_too_old/Makefile - -# Note: because we don't tell the Makefile there are any regression tests, -# we have to clean those result files explicitly -EXTRA_CLEAN = $(pg_regress_clean_files) - -ISOLATION = sto_using_cursor sto_using_select sto_using_hash_index -ISOLATION_OPTS = --temp-config $(top_srcdir)/src/test/modules/snapshot_too_old/sto.conf - -# Disabled because these tests require "old_snapshot_threshold" >= 0, which -# typical installcheck users do not have (e.g. buildfarm clients). -NO_INSTALLCHECK = 1 - -ifdef USE_PGXS -PG_CONFIG = pg_config -PGXS := $(shell $(PG_CONFIG) --pgxs) -include $(PGXS) -else -subdir = src/test/modules/snapshot_too_old -top_builddir = ../../../.. -include $(top_builddir)/src/Makefile.global -include $(top_srcdir)/contrib/contrib-global.mk -endif - -# But it can nonetheless be very helpful to run tests on preexisting -# installation, allow to do so, but only if requested explicitly. -installcheck-force: - $(pg_isolation_regress_installcheck) $(ISOLATION) diff --git a/src/test/modules/snapshot_too_old/expected/sto_using_cursor.out b/src/test/modules/snapshot_too_old/expected/sto_using_cursor.out deleted file mode 100644 index 06fe4d0669093..0000000000000 --- a/src/test/modules/snapshot_too_old/expected/sto_using_cursor.out +++ /dev/null @@ -1,19 +0,0 @@ -Parsed test spec with 2 sessions - -starting permutation: s1decl s1f1 s1sleep s2u s1f2 -step s1decl: DECLARE cursor1 CURSOR FOR SELECT c FROM sto1; -step s1f1: FETCH FIRST FROM cursor1; -c -- -1 -(1 row) - -step s1sleep: SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; -setting|pg_sleep --------+-------- - 0| -(1 row) - -step s2u: UPDATE sto1 SET c = 1001 WHERE c = 1; -step s1f2: FETCH FIRST FROM cursor1; -ERROR: snapshot too old diff --git a/src/test/modules/snapshot_too_old/expected/sto_using_hash_index.out b/src/test/modules/snapshot_too_old/expected/sto_using_hash_index.out deleted file mode 100644 index 11f827fbfedc2..0000000000000 --- a/src/test/modules/snapshot_too_old/expected/sto_using_hash_index.out +++ /dev/null @@ -1,19 +0,0 @@ -Parsed test spec with 2 sessions - -starting permutation: noseq s1f1 s2sleep s2u s1f2 -step noseq: SET enable_seqscan = false; -step s1f1: SELECT c FROM sto1 where c = 1000; - c ----- -1000 -(1 row) - -step s2sleep: SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; -setting|pg_sleep --------+-------- - 0| -(1 row) - -step s2u: UPDATE sto1 SET c = 1001 WHERE c = 1000; -step s1f2: SELECT c FROM sto1 where c = 1001; -ERROR: snapshot too old diff --git a/src/test/modules/snapshot_too_old/expected/sto_using_select.out b/src/test/modules/snapshot_too_old/expected/sto_using_select.out deleted file mode 100644 index e910e5c71e1bd..0000000000000 --- a/src/test/modules/snapshot_too_old/expected/sto_using_select.out +++ /dev/null @@ -1,18 +0,0 @@ -Parsed test spec with 2 sessions - -starting permutation: s1f1 s1sleep s2u s1f2 -step s1f1: SELECT c FROM sto1 ORDER BY c LIMIT 1; -c -- -1 -(1 row) - -step s1sleep: SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; -setting|pg_sleep --------+-------- - 0| -(1 row) - -step s2u: UPDATE sto1 SET c = 1001 WHERE c = 1; -step s1f2: SELECT c FROM sto1 ORDER BY c LIMIT 1; -ERROR: snapshot too old diff --git a/src/test/modules/snapshot_too_old/meson.build b/src/test/modules/snapshot_too_old/meson.build deleted file mode 100644 index 6a2f4a0b72e19..0000000000000 --- a/src/test/modules/snapshot_too_old/meson.build +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group - -tests += { - 'name': 'snapshot_too_old', - 'sd': meson.current_source_dir(), - 'bd': meson.current_build_dir(), - 'isolation': { - 'test_kwargs': {'priority': 40}, # sto tests are slow, start early - 'specs': [ - 'sto_using_cursor', - 'sto_using_select', - 'sto_using_hash_index', - ], - 'regress_args': ['--temp-config', files('sto.conf')], - # Disabled because these tests require "old_snapshot_threshold" >= 0, which - # typical runningcheck users do not have (e.g. buildfarm clients). - 'runningcheck': false, - }, -} diff --git a/src/test/modules/snapshot_too_old/specs/sto_using_cursor.spec b/src/test/modules/snapshot_too_old/specs/sto_using_cursor.spec deleted file mode 100644 index f3677a8fa94bc..0000000000000 --- a/src/test/modules/snapshot_too_old/specs/sto_using_cursor.spec +++ /dev/null @@ -1,38 +0,0 @@ -# This test provokes a "snapshot too old" error using a cursor. -# -# The sleep is needed because with a threshold of zero a statement could error -# on changes it made. With more normal settings no external delay is needed, -# but we don't want these tests to run long enough to see that, since -# granularity is in minutes. -# -# Since results depend on the value of old_snapshot_threshold, sneak that into -# the line generated by the sleep, so that a surprising value isn't so hard -# to identify. - -setup -{ - CREATE TABLE sto1 (c int NOT NULL); - INSERT INTO sto1 SELECT generate_series(1, 1000); -} -setup -{ - VACUUM ANALYZE sto1; -} - -teardown -{ - DROP TABLE sto1; -} - -session "s1" -setup { BEGIN ISOLATION LEVEL REPEATABLE READ; } -step "s1decl" { DECLARE cursor1 CURSOR FOR SELECT c FROM sto1; } -step "s1f1" { FETCH FIRST FROM cursor1; } -step "s1sleep" { SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; } -step "s1f2" { FETCH FIRST FROM cursor1; } -teardown { COMMIT; } - -session "s2" -step "s2u" { UPDATE sto1 SET c = 1001 WHERE c = 1; } - -permutation "s1decl" "s1f1" "s1sleep" "s2u" "s1f2" diff --git a/src/test/modules/snapshot_too_old/specs/sto_using_hash_index.spec b/src/test/modules/snapshot_too_old/specs/sto_using_hash_index.spec deleted file mode 100644 index 33d91ff852362..0000000000000 --- a/src/test/modules/snapshot_too_old/specs/sto_using_hash_index.spec +++ /dev/null @@ -1,31 +0,0 @@ -# This test is like sto_using_select, except that we test access via a -# hash index. - -setup -{ - CREATE TABLE sto1 (c int NOT NULL); - INSERT INTO sto1 SELECT generate_series(1, 1000); - CREATE INDEX idx_sto1 ON sto1 USING HASH (c); -} -setup -{ - VACUUM ANALYZE sto1; -} - -teardown -{ - DROP TABLE sto1; -} - -session "s1" -setup { BEGIN ISOLATION LEVEL REPEATABLE READ; } -step "noseq" { SET enable_seqscan = false; } -step "s1f1" { SELECT c FROM sto1 where c = 1000; } -step "s1f2" { SELECT c FROM sto1 where c = 1001; } -teardown { ROLLBACK; } - -session "s2" -step "s2sleep" { SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; } -step "s2u" { UPDATE sto1 SET c = 1001 WHERE c = 1000; } - -permutation "noseq" "s1f1" "s2sleep" "s2u" "s1f2" diff --git a/src/test/modules/snapshot_too_old/specs/sto_using_select.spec b/src/test/modules/snapshot_too_old/specs/sto_using_select.spec deleted file mode 100644 index 80a31763ad4e2..0000000000000 --- a/src/test/modules/snapshot_too_old/specs/sto_using_select.spec +++ /dev/null @@ -1,37 +0,0 @@ -# This test provokes a "snapshot too old" error using SELECT statements. -# -# The sleep is needed because with a threshold of zero a statement could error -# on changes it made. With more normal settings no external delay is needed, -# but we don't want these tests to run long enough to see that, since -# granularity is in minutes. -# -# Since results depend on the value of old_snapshot_threshold, sneak that into -# the line generated by the sleep, so that a surprising value isn't so hard -# to identify. - -setup -{ - CREATE TABLE sto1 (c int NOT NULL); - INSERT INTO sto1 SELECT generate_series(1, 1000); -} -setup -{ - VACUUM ANALYZE sto1; -} - -teardown -{ - DROP TABLE sto1; -} - -session "s1" -setup { BEGIN ISOLATION LEVEL REPEATABLE READ; } -step "s1f1" { SELECT c FROM sto1 ORDER BY c LIMIT 1; } -step "s1sleep" { SELECT setting, pg_sleep(6) FROM pg_settings WHERE name = 'old_snapshot_threshold'; } -step "s1f2" { SELECT c FROM sto1 ORDER BY c LIMIT 1; } -teardown { COMMIT; } - -session "s2" -step "s2u" { UPDATE sto1 SET c = 1001 WHERE c = 1; } - -permutation "s1f1" "s1sleep" "s2u" "s1f2" diff --git a/src/test/modules/snapshot_too_old/sto.conf b/src/test/modules/snapshot_too_old/sto.conf deleted file mode 100644 index 7eeaeeb0dc3da..0000000000000 --- a/src/test/modules/snapshot_too_old/sto.conf +++ /dev/null @@ -1,2 +0,0 @@ -autovacuum = off -old_snapshot_threshold = 0 diff --git a/src/test/modules/spgist_name_ops/meson.build b/src/test/modules/spgist_name_ops/meson.build index c8b7a6efb4a79..81c0de0a1a24a 100644 --- a/src/test/modules/spgist_name_ops/meson.build +++ b/src/test/modules/spgist_name_ops/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group spgist_name_ops_sources = files( 'spgist_name_ops.c', diff --git a/src/test/modules/spgist_name_ops/spgist_name_ops.c b/src/test/modules/spgist_name_ops/spgist_name_ops.c index 99f9267df973f..322881ba78e24 100644 --- a/src/test/modules/spgist_name_ops/spgist_name_ops.c +++ b/src/test/modules/spgist_name_ops/spgist_name_ops.c @@ -11,7 +11,7 @@ * Unlike spgtextproc.c, we don't bother with collation-aware logic. * * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/test/modules/ssl_passphrase_callback/Makefile b/src/test/modules/ssl_passphrase_callback/Makefile index 922f0ee078649..40ed38dc7073c 100644 --- a/src/test/modules/ssl_passphrase_callback/Makefile +++ b/src/test/modules/ssl_passphrase_callback/Makefile @@ -33,7 +33,7 @@ PASS = FooBaR1 ssl-files: $(OPENSSL) req -new -x509 -days 10000 -nodes -out server.crt \ -keyout server.ckey -subj "/CN=localhost" - $(OPENSSL) rsa -aes256 -in server.ckey -out server.key -passout pass:$(PASS) + $(OPENSSL) pkey -aes256 -in server.ckey -out server.key -passout pass:$(PASS) rm server.ckey ssl-files-clean: diff --git a/src/test/modules/ssl_passphrase_callback/meson.build b/src/test/modules/ssl_passphrase_callback/meson.build index c2a022b4f10c7..fd322d925c6ce 100644 --- a/src/test/modules/ssl_passphrase_callback/meson.build +++ b/src/test/modules/ssl_passphrase_callback/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group if not ssl.found() subdir_done() @@ -40,7 +40,7 @@ if openssl.found() custom_target('server.key', input: [cert[1]], output: ['server.key'], - command: [openssl, 'rsa', '-aes256', '-in', '@INPUT0@', '-out', '@OUTPUT0@', '-passout', 'pass:@0@'.format(pass)] + command: [openssl, 'pkey', '-aes256', '-in', '@INPUT0@', '-out', '@OUTPUT0@', '-passout', 'pass:@0@'.format(pass)] ) endif diff --git a/src/test/modules/ssl_passphrase_callback/server.key b/src/test/modules/ssl_passphrase_callback/server.key index 1475007c73f80..9b41008934027 100644 --- a/src/test/modules/ssl_passphrase_callback/server.key +++ b/src/test/modules/ssl_passphrase_callback/server.key @@ -1,30 +1,30 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: AES-256-CBC,DB0E7068D4DCE79FFE63C95B8D8F7CEA - -Y4uvnlWX/kyulqsmt8aWI55vKFdfJL4wEZItL8ZKlQFuZuxC9w0OworyjTdqO38R -v9hwnetZBDgK8kEv6U7wR58mTfwHHCGuxYgSiPZtiW7btS4zu16ePdh8oBEzCxjW -ALrCFt7uvRu5h2AWy/4BgV4gLNVPNB+lJFABtUoiSnUDr7+bcx7UjZ4An6HriGxC -Kg/N1pKjT/xiKOy+yHtrp1Jih5HYDE4i99jPtMuTROf8Uyz7ibyrdd/E7QNvANQN -Cmw4I4Xk4hZ68F0iGU0C0wLND3pWbeYPKorpo3PkI4Du+Aqlg15ae5u8CtU3fXGJ -mq4/qLGAi1sr/45f5P5a3Q8BQpKkCmGopXMaFYOOiaf3YYgD1eVOxLhsCWqUB+O8 -ygcTNRCoKhzY+ULComXp880J3fFk5b92g4Hm1PAO42uDKzhWSnrmCBJ7ynXvnEc+ -JqhiE8Obrp6FBIHvfN26JtHcXTd/bgUMXSh7AXjsotfvPPV0URve9JJG+RnwckeT -K3AYDOQK/lbqDGliNqHg1WiMSA2oHSqDhUMB0Sm0jh6+jxCQlsmSDvPvJfWRo5wY -zbZZZARQnFUaHa9CZVdFxbaPGhYU6vAwxDqi42osSJEdf68Gy2KVXcelqpU/2dKk -aHfTgAWOsajbgt9p+0369TeZb39+zLODdDJnvZYiu1pTASHP5VrJ2xHhu5zOdjXm -GafYiPwYBM280wkIVQ0HsTX7BViU2R/7W3FqflXgQvBiraVQVwHyaX4bOU1a3rzg -emHNLTCpRamT0i/D0tkEPgS42bWSVi9ko5Mn9yb+qToBjAOLVUOAOs9Bv3qxawhI -XFbBDZ7DS59l2yV6eQkrG7DUCLDf4dv4WZeBnhrPe/Jg8HKcsKcJYV3cejZh8sgu -XHeCU50+jpJDfTZVPW3TjZWmrTqStGwF1UFpj+tTsTcX+OHAY/shFs3bBZulAsMy -5UWZWzyWHMWr/wbxW7dbhTb1gNmOgpQQz9dunSgcZ8umzSGLa0ZGmnQj9P/kZkQA -RenuswH5O7CK/MDmf3J6svwyLt/jULmH26MZTcNu7igT6dj3VMSwkoQQaaQdtmzb -glzN3uqf8qM+CEjV8dxlt8fv6KJV7gvoYfPAz+1pp5DVJBmRo/+b4e/d4QTV9iWS -ScBYdonc9WXcrjmExX9+Wf/K/IKfLnKLIi2MZ3pwr1n7yY+dMeF6iREYSjFVIpZd -MH3G9/SxTrqR7X/eHjwdv1UupYYyaDag8wpVn1RMCb0xYqh2/QP1k0pQycckL0WQ -lieXibEuQhV/heXcqt83G6pGqLImc6YPYU46jdGpPIMyOK+ZSqJTHUWHfRMQTIMz -varR2M3uhHvwUFzmvjLh/o6I3r0a0Rl1MztpYfjBV6MS4BKYfraWZ0kxCyV+e6tz -O7vD0P5W2qm6b89Md3nqjUcbOM8AojcfBl3xpQrpSdgJ25YJBoJ9L2I2pIMNCK/x -yDNEJl7yP87fdHfXZm2VoUXclDUYHyNys9Rtv9NSr+VNkIMcqrCHEgpAxwQQ5NsO -/vOZe3wjhXXLyRO7Nh5W8jojw3xcb9c9avFUWUvM2BaS4vEYcItUoF4QuHohrCwk ------END RSA PRIVATE KEY----- +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIzt8o0JBXEZgCAggA +MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBDf6wFurd23+1qjDeGbGjYoBIIE +0MSl5dFRkS9D9Pva9X8TjHTiYlhu2dbvrbiV5yeIAnIa8RWawH1vP4ZhxqnygcnU +IaL/NzK0ylpD7Zwyi8NSgaAmAdP0vc+oVIHkdQ12+feR+/cE2PXxGKa7JOlEFMHG +JS3Z0c1KXys9ZKpb3+VvGm6tGvdakoaAmgbWgew2ppHlU6xNGUJwL8+VfZVt81wg +Y4iPVQmQU+wRz/AoJLgV2z3eVwkef66Vsud7ofmXmmkMhUtez0x2n4ScMtD03rFA +uRf2m7xcDgVxxnO0n0K2BGGXh/eYXEA8XLY2rr8vL/aj5t6+6mfgX01OVgziQwgj +cMmPMqNuNUJX0k1v6fr3Bwd17BYjatjFpCZgawSS/pWSDnCoT7hUwLw6UvGQ+uaf +KtihGrTvGrO1sB9pO+u8z16eYmb5pICX+hh/Qfcs6045Jr3oeFeFh35FLXQH7Bil +vyezHJHXOrRvA9AmH8XYGAM0sXOszyCdWFFQD/4fouOl6mfLQY1xxVl9AQCYyNV2 +dlhYDCTkiHHNqxSI+xFfrIApJaEKhL1bJkFk//PfHWUDeMpG3t3T4WGdwpax3doN +iwfnr1cae5CU+1R2Zo1aaLY6L7lccuUBN1lk5/7rcA2yhJl4M3ijRtLyi4YR149Z +HPvsNlfDpgALB/nuFx/Xx3PV5lpa4lzVSAJ/KxN2/YYGoxJ2qf94wBCZrBpZMWCX +EjGn/DD6Tx29dq6VJnDUFPokeQDQcQaFK3UAcm/6t/wixZZTiz6rWO+doU9j3GVO +nqdPMvPsGfnOC4U8CChY3eOKiBy2EosFvigZ4n064bG+XK1Cr9leyrAMOgOt9F+i +l98QXAtLjQfzBSbxoGYt9nTm+4IsOoSJuDcAFu0Hj88aJhh/ax/jZNzC6mbN95q4 +QArvxA1SKJbPcnj5ZESpvGhOUa5tr34DcOh+IIZbQITxuR6V7EhvAd5tYOIr5gaW +SvV9ew31dP7p0VOXV7qMr0C/Kgxpq020SBYKivpooRGOwnf4Y6yD1pvHL6IhS7tH +fWHmM5Q9qStNQGwZwjcJCnuq6Vz2zaHJCfq546mcs0Xlw2pL/BAvwQtF3EKt9PWV +Vj7MXEfIc4kYNLkU2pTDu+qbGliJHqCt9UgdmR6kwCN8LssYYkKdtzMrcl6opiPA +k51DHhxXKQ0iDLia5DR32lswHFFqesGhXPA5Frb1wQUTWLe8VdRmVQaKb6mlQPWQ +z4IA1k6+KWoQJic/MJZVTLC+dA6P85q1W1WOkAY5SMcZzLVsZsq8kTw2n1OT7d4n +FY5yVffsKvokMfude4PG1lhwfxgzOckK+PQjuOrdg9nr0YkE/sy0wJhmzfeXMuXj +YFg/fF9qhWcFOY3DoT4k8okd/bgFRHsU7qWTUzYjnkiqXmolBpjSRRRVGM1c3uMx +InnWmzDMG+8JY1G7SafTQV+2HuhK1qH9uIQ6UpqmLafJCFAgFzCQa7cFUfXuVsJ9 +XoXfc2xSzmwx7A4VwnoK7pO6zLzu47xOWEHykIfAMfQa0MKh/SrdzkLvu9Vw41GU +p7i4tVWNdRjMnC7roSjW9uSJPN61NB+wk2PAkoW5XvBnZB2d0iFaRf1qMFZiEngw +kvhRpuPu/oVkcLVyi4ByKu3nNw/fPplkXejgE1cwxQPd +-----END ENCRYPTED PRIVATE KEY----- diff --git a/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c b/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c index 948706af85221..d5992149821d7 100644 --- a/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c +++ b/src/test/modules/ssl_passphrase_callback/ssl_passphrase_func.c @@ -58,7 +58,7 @@ set_rot13(SSL_CTX *context, bool isServerStart) /* warn if the user has set ssl_passphrase_command */ if (ssl_passphrase_command[0]) ereport(WARNING, - (errmsg("ssl_passphrase_command setting ignored by ssl_passphrase_func module"))); + (errmsg("\"ssl_passphrase_command\" setting ignored by ssl_passphrase_func module"))); SSL_CTX_set_default_passwd_cb(context, rot13_passphrase); } diff --git a/src/test/modules/ssl_passphrase_callback/t/001_testfunc.pl b/src/test/modules/ssl_passphrase_callback/t/001_testfunc.pl index 2b2c144ee288f..7a63539f39c48 100644 --- a/src/test/modules/ssl_passphrase_callback/t/001_testfunc.pl +++ b/src/test/modules/ssl_passphrase_callback/t/001_testfunc.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use File::Copy; @@ -33,7 +33,7 @@ # install certificate and protected key copy("server.crt", $ddir); copy("server.key", $ddir); -chmod 0600, "$ddir/server.key"; +chmod 0600, "$ddir/server.key" or die $!; $node->start; @@ -56,7 +56,7 @@ like( $log_contents, - qr/WARNING.*ssl_passphrase_command setting ignored by ssl_passphrase_func module/, + qr/WARNING.*"ssl_passphrase_command" setting ignored by ssl_passphrase_func module/, "ssl_passphrase_command set warning"); # set the wrong passphrase diff --git a/src/test/modules/test_bloomfilter/meson.build b/src/test/modules/test_bloomfilter/meson.build index 5353958eeb5f8..5136aea96257a 100644 --- a/src/test/modules/test_bloomfilter/meson.build +++ b/src/test/modules/test_bloomfilter/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_bloomfilter_sources = files( 'test_bloomfilter.c', diff --git a/src/test/modules/test_bloomfilter/test_bloomfilter.c b/src/test/modules/test_bloomfilter/test_bloomfilter.c index 26e96a558134e..b0633a8fa73c9 100644 --- a/src/test/modules/test_bloomfilter/test_bloomfilter.c +++ b/src/test/modules/test_bloomfilter/test_bloomfilter.c @@ -3,7 +3,7 @@ * test_bloomfilter.c * Test false positive rate of Bloom filter. * - * Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Copyright (c) 2018-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_bloomfilter/test_bloomfilter.c diff --git a/src/test/modules/test_copy_callbacks/meson.build b/src/test/modules/test_copy_callbacks/meson.build index 849b58e7c4a63..7620b8bde36f1 100644 --- a/src/test/modules/test_copy_callbacks/meson.build +++ b/src/test/modules/test_copy_callbacks/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_copy_callbacks_sources = files( 'test_copy_callbacks.c', diff --git a/src/test/modules/test_copy_callbacks/test_copy_callbacks.c b/src/test/modules/test_copy_callbacks/test_copy_callbacks.c index e65771067ea7f..0bbd2aa6bb9d2 100644 --- a/src/test/modules/test_copy_callbacks/test_copy_callbacks.c +++ b/src/test/modules/test_copy_callbacks/test_copy_callbacks.c @@ -3,7 +3,7 @@ * test_copy_callbacks.c * Code for testing COPY callbacks. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/test/modules/test_custom_rmgrs/meson.build b/src/test/modules/test_custom_rmgrs/meson.build index a826efe1af736..6e707d6f5458a 100644 --- a/src/test/modules/test_custom_rmgrs/meson.build +++ b/src/test/modules/test_custom_rmgrs/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_custom_rmgrs_sources = files( 'test_custom_rmgrs.c', diff --git a/src/test/modules/test_custom_rmgrs/t/001_basic.pl b/src/test/modules/test_custom_rmgrs/t/001_basic.pl index 50655d3788a4f..686431fba8d50 100644 --- a/src/test/modules/test_custom_rmgrs/t/001_basic.pl +++ b/src/test/modules/test_custom_rmgrs/t/001_basic.pl @@ -1,7 +1,7 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/test/modules/test_custom_rmgrs/test_custom_rmgrs.c b/src/test/modules/test_custom_rmgrs/test_custom_rmgrs.c index a304ba54bb92d..85038f549db49 100644 --- a/src/test/modules/test_custom_rmgrs/test_custom_rmgrs.c +++ b/src/test/modules/test_custom_rmgrs/test_custom_rmgrs.c @@ -3,7 +3,7 @@ * test_custom_rmgrs.c * Code for testing custom WAL resource managers. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/test/modules/test_ddl_deparse/expected/alter_table.out b/src/test/modules/test_ddl_deparse/expected/alter_table.out index 87a1ab7aabce0..6daa186a8420e 100644 --- a/src/test/modules/test_ddl_deparse/expected/alter_table.out +++ b/src/test/modules/test_ddl_deparse/expected/alter_table.out @@ -79,14 +79,14 @@ ALTER TABLE parent ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; NOTICE: DDL test: type simple, tag CREATE SEQUENCE NOTICE: DDL test: type simple, tag ALTER SEQUENCE NOTICE: DDL test: type alter table, tag ALTER TABLE -NOTICE: subcommand: type ADD IDENTITY desc column a of table parent +NOTICE: subcommand: type ADD IDENTITY (and recurse) desc column a of table parent ALTER TABLE parent ALTER COLUMN a SET GENERATED BY DEFAULT; NOTICE: DDL test: type simple, tag ALTER SEQUENCE NOTICE: DDL test: type alter table, tag ALTER TABLE -NOTICE: subcommand: type SET IDENTITY desc column a of table parent +NOTICE: subcommand: type SET IDENTITY (and recurse) desc column a of table parent ALTER TABLE parent ALTER COLUMN a DROP IDENTITY; NOTICE: DDL test: type alter table, tag ALTER TABLE -NOTICE: subcommand: type DROP IDENTITY desc column a of table parent +NOTICE: subcommand: type DROP IDENTITY (and recurse) desc column a of table parent ALTER TABLE parent ALTER COLUMN a SET STATISTICS 100; NOTICE: DDL test: type alter table, tag ALTER TABLE NOTICE: subcommand: type SET STATS desc column a of table parent diff --git a/src/test/modules/test_ddl_deparse/meson.build b/src/test/modules/test_ddl_deparse/meson.build index dfd31df12435d..640c022641354 100644 --- a/src/test/modules/test_ddl_deparse/meson.build +++ b/src/test/modules/test_ddl_deparse/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_ddl_deparse_sources = files( 'test_ddl_deparse.c', diff --git a/src/test/modules/test_ddl_deparse/test_ddl_deparse.c b/src/test/modules/test_ddl_deparse/test_ddl_deparse.c index 82f937fca4f37..2758ae82d7b4b 100644 --- a/src/test/modules/test_ddl_deparse/test_ddl_deparse.c +++ b/src/test/modules/test_ddl_deparse/test_ddl_deparse.c @@ -2,7 +2,7 @@ * test_ddl_deparse.c * Support functions for the test_ddl_deparse module * - * Copyright (c) 2014-2023, PostgreSQL Global Development Group + * Copyright (c) 2014-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_ddl_deparse/test_ddl_deparse.c @@ -129,6 +129,9 @@ get_altertable_subcmdinfo(PG_FUNCTION_ARGS) case AT_SetNotNull: strtype = "SET NOT NULL"; break; + case AT_SetExpression: + strtype = "SET EXPRESSION"; + break; case AT_DropExpression: strtype = "DROP EXPRESSION"; break; diff --git a/src/test/modules/test_dsa/.gitignore b/src/test/modules/test_dsa/.gitignore new file mode 100644 index 0000000000000..5dcb3ff972350 --- /dev/null +++ b/src/test/modules/test_dsa/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ diff --git a/src/test/modules/test_dsa/Makefile b/src/test/modules/test_dsa/Makefile new file mode 100644 index 0000000000000..77583464dcae7 --- /dev/null +++ b/src/test/modules/test_dsa/Makefile @@ -0,0 +1,23 @@ +# src/test/modules/test_dsa/Makefile + +MODULE_big = test_dsa +OBJS = \ + $(WIN32RES) \ + test_dsa.o +PGFILEDESC = "test_dsa - test code for dynamic shared memory areas" + +EXTENSION = test_dsa +DATA = test_dsa--1.0.sql + +REGRESS = test_dsa + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/test_dsa +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/src/test/modules/test_dsa/expected/test_dsa.out b/src/test/modules/test_dsa/expected/test_dsa.out new file mode 100644 index 0000000000000..266010e77fe9e --- /dev/null +++ b/src/test/modules/test_dsa/expected/test_dsa.out @@ -0,0 +1,13 @@ +CREATE EXTENSION test_dsa; +SELECT test_dsa_basic(); + test_dsa_basic +---------------- + +(1 row) + +SELECT test_dsa_resowners(); + test_dsa_resowners +-------------------- + +(1 row) + diff --git a/src/test/modules/test_dsa/meson.build b/src/test/modules/test_dsa/meson.build new file mode 100644 index 0000000000000..854dc18232d83 --- /dev/null +++ b/src/test/modules/test_dsa/meson.build @@ -0,0 +1,33 @@ +# Copyright (c) 2022-2024, PostgreSQL Global Development Group + +test_dsa_sources = files( + 'test_dsa.c', +) + +if host_system == 'windows' + test_dsa_sources += rc_lib_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'test_dsa', + '--FILEDESC', 'test_dsa - test code for dynamic shared memory areas',]) +endif + +test_dsa = shared_module('test_dsa', + test_dsa_sources, + kwargs: pg_test_mod_args, +) +test_install_libs += test_dsa + +test_install_data += files( + 'test_dsa.control', + 'test_dsa--1.0.sql', +) + +tests += { + 'name': 'test_dsa', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'regress': { + 'sql': [ + 'test_dsa', + ], + }, +} diff --git a/src/test/modules/test_dsa/sql/test_dsa.sql b/src/test/modules/test_dsa/sql/test_dsa.sql new file mode 100644 index 0000000000000..c3d8db9437206 --- /dev/null +++ b/src/test/modules/test_dsa/sql/test_dsa.sql @@ -0,0 +1,4 @@ +CREATE EXTENSION test_dsa; + +SELECT test_dsa_basic(); +SELECT test_dsa_resowners(); diff --git a/src/test/modules/test_dsa/test_dsa--1.0.sql b/src/test/modules/test_dsa/test_dsa--1.0.sql new file mode 100644 index 0000000000000..2904cb23525e3 --- /dev/null +++ b/src/test/modules/test_dsa/test_dsa--1.0.sql @@ -0,0 +1,12 @@ +/* src/test/modules/test_dsa/test_dsa--1.0.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION test_dsa" to load this file. \quit + +CREATE FUNCTION test_dsa_basic() + RETURNS pg_catalog.void + AS 'MODULE_PATHNAME' LANGUAGE C; + +CREATE FUNCTION test_dsa_resowners() + RETURNS pg_catalog.void + AS 'MODULE_PATHNAME' LANGUAGE C; diff --git a/src/test/modules/test_dsa/test_dsa.c b/src/test/modules/test_dsa/test_dsa.c new file mode 100644 index 0000000000000..c78af68f61b99 --- /dev/null +++ b/src/test/modules/test_dsa/test_dsa.c @@ -0,0 +1,113 @@ +/*-------------------------------------------------------------------------- + * + * test_dsa.c + * Test dynamic shared memory areas (DSAs) + * + * Copyright (c) 2022-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/test/modules/test_dsa/test_dsa.c + * + * ------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "fmgr.h" +#include "storage/lwlock.h" +#include "utils/dsa.h" +#include "utils/resowner.h" + +PG_MODULE_MAGIC; + +/* Test basic DSA functionality */ +PG_FUNCTION_INFO_V1(test_dsa_basic); +Datum +test_dsa_basic(PG_FUNCTION_ARGS) +{ + int tranche_id; + dsa_area *a; + dsa_pointer p[100]; + + /* XXX: this tranche is leaked */ + tranche_id = LWLockNewTrancheId(); + LWLockRegisterTranche(tranche_id, "test_dsa"); + + a = dsa_create(tranche_id); + for (int i = 0; i < 100; i++) + { + p[i] = dsa_allocate(a, 1000); + snprintf(dsa_get_address(a, p[i]), 1000, "foobar%d", i); + } + + for (int i = 0; i < 100; i++) + { + char buf[100]; + + snprintf(buf, 100, "foobar%d", i); + if (strcmp(dsa_get_address(a, p[i]), buf) != 0) + elog(ERROR, "no match"); + } + + for (int i = 0; i < 100; i++) + { + dsa_free(a, p[i]); + } + + dsa_detach(a); + + PG_RETURN_VOID(); +} + +/* Test using DSA across different resource owners */ +PG_FUNCTION_INFO_V1(test_dsa_resowners); +Datum +test_dsa_resowners(PG_FUNCTION_ARGS) +{ + int tranche_id; + dsa_area *a; + dsa_pointer p[10000]; + ResourceOwner oldowner; + ResourceOwner childowner; + + /* XXX: this tranche is leaked */ + tranche_id = LWLockNewTrancheId(); + LWLockRegisterTranche(tranche_id, "test_dsa"); + + /* Create DSA in parent resource owner */ + a = dsa_create(tranche_id); + + /* + * Switch to child resource owner, and do a bunch of allocations in the + * DSA + */ + oldowner = CurrentResourceOwner; + childowner = ResourceOwnerCreate(oldowner, "test_dsa temp owner"); + CurrentResourceOwner = childowner; + + for (int i = 0; i < 10000; i++) + { + p[i] = dsa_allocate(a, 1000); + snprintf(dsa_get_address(a, p[i]), 1000, "foobar%d", i); + } + + /* Also test freeing, by freeing some of the allocations. */ + for (int i = 0; i < 500; i++) + dsa_free(a, p[i]); + + /* Release the child resource owner */ + CurrentResourceOwner = oldowner; + ResourceOwnerRelease(childowner, + RESOURCE_RELEASE_BEFORE_LOCKS, + true, false); + ResourceOwnerRelease(childowner, + RESOURCE_RELEASE_LOCKS, + true, false); + ResourceOwnerRelease(childowner, + RESOURCE_RELEASE_AFTER_LOCKS, + true, false); + ResourceOwnerDelete(childowner); + + dsa_detach(a); + + PG_RETURN_VOID(); +} diff --git a/src/test/modules/test_dsa/test_dsa.control b/src/test/modules/test_dsa/test_dsa.control new file mode 100644 index 0000000000000..ac9674b2193d6 --- /dev/null +++ b/src/test/modules/test_dsa/test_dsa.control @@ -0,0 +1,4 @@ +comment = 'Test code for dynamic shared memory areas' +default_version = '1.0' +module_pathname = '$libdir/test_dsa' +relocatable = true diff --git a/src/test/modules/test_dsm_registry/.gitignore b/src/test/modules/test_dsm_registry/.gitignore new file mode 100644 index 0000000000000..5dcb3ff972350 --- /dev/null +++ b/src/test/modules/test_dsm_registry/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ diff --git a/src/test/modules/test_dsm_registry/Makefile b/src/test/modules/test_dsm_registry/Makefile new file mode 100644 index 0000000000000..b13e99a354f07 --- /dev/null +++ b/src/test/modules/test_dsm_registry/Makefile @@ -0,0 +1,23 @@ +# src/test/modules/test_dsm_registry/Makefile + +MODULE_big = test_dsm_registry +OBJS = \ + $(WIN32RES) \ + test_dsm_registry.o +PGFILEDESC = "test_dsm_registry - test code for the DSM registry" + +EXTENSION = test_dsm_registry +DATA = test_dsm_registry--1.0.sql + +REGRESS = test_dsm_registry + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/test_dsm_registry +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/src/test/modules/test_dsm_registry/expected/test_dsm_registry.out b/src/test/modules/test_dsm_registry/expected/test_dsm_registry.out new file mode 100644 index 0000000000000..8ffbd343a05af --- /dev/null +++ b/src/test/modules/test_dsm_registry/expected/test_dsm_registry.out @@ -0,0 +1,14 @@ +CREATE EXTENSION test_dsm_registry; +SELECT set_val_in_shmem(1236); + set_val_in_shmem +------------------ + +(1 row) + +\c +SELECT get_val_in_shmem(); + get_val_in_shmem +------------------ + 1236 +(1 row) + diff --git a/src/test/modules/test_dsm_registry/meson.build b/src/test/modules/test_dsm_registry/meson.build new file mode 100644 index 0000000000000..a4045fea37e8f --- /dev/null +++ b/src/test/modules/test_dsm_registry/meson.build @@ -0,0 +1,33 @@ +# Copyright (c) 2024, PostgreSQL Global Development Group + +test_dsm_registry_sources = files( + 'test_dsm_registry.c', +) + +if host_system == 'windows' + test_dsm_registry_sources += rc_lib_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'test_dsm_registry', + '--FILEDESC', 'test_dsm_registry - test code for the DSM registry',]) +endif + +test_dsm_registry = shared_module('test_dsm_registry', + test_dsm_registry_sources, + kwargs: pg_test_mod_args, +) +test_install_libs += test_dsm_registry + +test_install_data += files( + 'test_dsm_registry.control', + 'test_dsm_registry--1.0.sql', +) + +tests += { + 'name': 'test_dsm_registry', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'regress': { + 'sql': [ + 'test_dsm_registry', + ], + }, +} diff --git a/src/test/modules/test_dsm_registry/sql/test_dsm_registry.sql b/src/test/modules/test_dsm_registry/sql/test_dsm_registry.sql new file mode 100644 index 0000000000000..b3351be0a16bc --- /dev/null +++ b/src/test/modules/test_dsm_registry/sql/test_dsm_registry.sql @@ -0,0 +1,4 @@ +CREATE EXTENSION test_dsm_registry; +SELECT set_val_in_shmem(1236); +\c +SELECT get_val_in_shmem(); diff --git a/src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql b/src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql new file mode 100644 index 0000000000000..8c55b0919b11f --- /dev/null +++ b/src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql @@ -0,0 +1,10 @@ +/* src/test/modules/test_dsm_registry/test_dsm_registry--1.0.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION test_dsm_registry" to load this file. \quit + +CREATE FUNCTION set_val_in_shmem(val INT) RETURNS VOID + AS 'MODULE_PATHNAME' LANGUAGE C; + +CREATE FUNCTION get_val_in_shmem() RETURNS INT + AS 'MODULE_PATHNAME' LANGUAGE C; diff --git a/src/test/modules/test_dsm_registry/test_dsm_registry.c b/src/test/modules/test_dsm_registry/test_dsm_registry.c new file mode 100644 index 0000000000000..96eaa850bfa92 --- /dev/null +++ b/src/test/modules/test_dsm_registry/test_dsm_registry.c @@ -0,0 +1,76 @@ +/*-------------------------------------------------------------------------- + * + * test_dsm_registry.c + * Test the dynamic shared memory registry. + * + * Copyright (c) 2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/test/modules/test_dsm_registry/test_dsm_registry.c + * + * ------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "fmgr.h" +#include "storage/dsm_registry.h" +#include "storage/lwlock.h" + +PG_MODULE_MAGIC; + +typedef struct TestDSMRegistryStruct +{ + int val; + LWLock lck; +} TestDSMRegistryStruct; + +static TestDSMRegistryStruct *tdr_state; + +static void +tdr_init_shmem(void *ptr) +{ + TestDSMRegistryStruct *state = (TestDSMRegistryStruct *) ptr; + + LWLockInitialize(&state->lck, LWLockNewTrancheId()); + state->val = 0; +} + +static void +tdr_attach_shmem(void) +{ + bool found; + + tdr_state = GetNamedDSMSegment("test_dsm_registry", + sizeof(TestDSMRegistryStruct), + tdr_init_shmem, + &found); + LWLockRegisterTranche(tdr_state->lck.tranche, "test_dsm_registry"); +} + +PG_FUNCTION_INFO_V1(set_val_in_shmem); +Datum +set_val_in_shmem(PG_FUNCTION_ARGS) +{ + tdr_attach_shmem(); + + LWLockAcquire(&tdr_state->lck, LW_EXCLUSIVE); + tdr_state->val = PG_GETARG_UINT32(0); + LWLockRelease(&tdr_state->lck); + + PG_RETURN_VOID(); +} + +PG_FUNCTION_INFO_V1(get_val_in_shmem); +Datum +get_val_in_shmem(PG_FUNCTION_ARGS) +{ + int ret; + + tdr_attach_shmem(); + + LWLockAcquire(&tdr_state->lck, LW_SHARED); + ret = tdr_state->val; + LWLockRelease(&tdr_state->lck); + + PG_RETURN_UINT32(ret); +} diff --git a/src/test/modules/test_dsm_registry/test_dsm_registry.control b/src/test/modules/test_dsm_registry/test_dsm_registry.control new file mode 100644 index 0000000000000..813f099889b63 --- /dev/null +++ b/src/test/modules/test_dsm_registry/test_dsm_registry.control @@ -0,0 +1,4 @@ +comment = 'Test code for the DSM registry' +default_version = '1.0' +module_pathname = '$libdir/test_dsm_registry' +relocatable = true diff --git a/src/test/modules/test_escape/.gitignore b/src/test/modules/test_escape/.gitignore new file mode 100644 index 0000000000000..e498d6b7efa2a --- /dev/null +++ b/src/test/modules/test_escape/.gitignore @@ -0,0 +1,2 @@ +/tmp_check/ +/test_escape diff --git a/src/test/modules/test_escape/Makefile b/src/test/modules/test_escape/Makefile new file mode 100644 index 0000000000000..786db4cbae452 --- /dev/null +++ b/src/test/modules/test_escape/Makefile @@ -0,0 +1,27 @@ +# src/test/modules/test_escape/Makefile + +PGFILEDESC = "test escape program" +PGAPPICON = win32 + +PROGRAM = test_escape +OBJS = $(WIN32RES) test_escape.o + +PG_CPPFLAGS = -I$(libpq_srcdir) +PG_LIBS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) + +NO_INSTALL = 1 +TAP_TESTS = 1 + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/test_escape +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif + +test_escape$(X): | submake-libpgfeutils +check: test_escape$(X) diff --git a/src/test/modules/test_escape/meson.build b/src/test/modules/test_escape/meson.build new file mode 100644 index 0000000000000..a21341d5067cb --- /dev/null +++ b/src/test/modules/test_escape/meson.build @@ -0,0 +1,31 @@ +test_escape_sources = files( + 'test_escape.c', +) + +if host_system == 'windows' + test_escape_sources += rc_bin_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'test_escape', + '--FILEDESC', 'test escape program',]) +endif + +test_escape = executable('test_escape', + test_escape_sources, + dependencies: [frontend_code, libpq], + kwargs: default_bin_args + { + 'install': false, + } +) +testprep_targets += test_escape + + +tests += { + 'name': 'test_escape', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tap': { + 'tests': [ + 't/001_test_escape.pl', + ], + 'deps': [test_escape], + }, +} diff --git a/src/test/modules/test_escape/t/001_test_escape.pl b/src/test/modules/test_escape/t/001_test_escape.pl new file mode 100644 index 0000000000000..0d5aec3ed748f --- /dev/null +++ b/src/test/modules/test_escape/t/001_test_escape.pl @@ -0,0 +1,53 @@ +# Copyright (c) 2023-2025, PostgreSQL Global Development Group +use strict; +use warnings FATAL => 'all'; +use Config; +use PostgreSQL::Test::Utils; +use PostgreSQL::Test::Cluster; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('node'); + +$node->init(); +$node->start(); + +$node->safe_psql('postgres', + q(CREATE DATABASE db_sql_ascii ENCODING "sql_ascii" TEMPLATE template0;)); + +my $cmd = + [ 'test_escape', '--conninfo', $node->connstr . " dbname=db_sql_ascii" ]; + +# There currently is no good other way to transport test results from a C +# program that requires just the node being set-up... +my ($stderr, $stdout); +my $result = IPC::Run::run $cmd, '>', \$stdout, '2>', \$stderr; + +is($result, 1, "test_escape returns 0"); +is($stderr, '', "test_escape stderr is empty"); + +foreach my $line (split('\n', $stdout)) +{ + if ($line =~ m/^ok \d+ ?(.*)/) + { + ok(1, $1); + } + + elsif ($line =~ m/^not ok \d+ ?(.*)/) + { + ok(0, $1); + } + + elsif ($line =~ m/^# ?(.*)/) + { + note $1; + } + elsif ($line =~ m/^\d+..\d+$/) + { + } + else + { + BAIL_OUT("no unmapped lines, got $line"); + } +} + +done_testing(); diff --git a/src/test/modules/test_escape/test_escape.c b/src/test/modules/test_escape/test_escape.c new file mode 100644 index 0000000000000..7208c12187f4b --- /dev/null +++ b/src/test/modules/test_escape/test_escape.c @@ -0,0 +1,973 @@ +/* + * test_escape.c Test escape functions + * + * Copyright (c) 2022-2025, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/test/modules/test_escape/test_escape.c + */ + +#include "postgres_fe.h" + +#include +#include + +#include "common/jsonapi.h" +#include "fe_utils/psqlscan.h" +#include "fe_utils/string_utils.h" +#include "getopt_long.h" +#include "libpq-fe.h" +#include "mb/pg_wchar.h" +#include "utils/memdebug.h" + + +typedef struct pe_test_config +{ + int verbosity; + bool force_unsupported; + const char *conninfo; + PGconn *conn; + + int test_count; + int failure_count; +} pe_test_config; + +#define NEVER_ACCESS_STR "\xff never-to-be-touched" + + +/* + * An escape function to be tested by this test. + */ +typedef struct pe_test_escape_func +{ + const char *name; + + /* + * Can the escape method report errors? If so, we validate that it does in + * case of various invalid inputs. + */ + bool reports_errors; + + /* + * Is the escape method known to not handle invalidly encoded input? If + * so, we don't run the test unless --force-unsupported is used. + */ + bool supports_only_valid; + + /* + * Is the escape method known to only handle encodings where no byte in a + * multi-byte characters are valid ascii. + */ + bool supports_only_ascii_overlap; + + /* + * Does the escape function have a length input? + */ + bool supports_input_length; + + bool (*escape) (PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err); +} pe_test_escape_func; + +/* + * A single test input for this test. + */ +typedef struct pe_test_vector +{ + const char *client_encoding; + size_t escape_len; + const char *escape; +} pe_test_vector; + + +/* + * Callback functions from flex lexer. Not currently used by the test. + */ +static const PsqlScanCallbacks test_scan_callbacks = { + NULL +}; + + +/* + * Print the string into buf, making characters outside of plain ascii + * somewhat easier to recognize. + * + * The output format could stand to be improved significantly, it's not at all + * unambiguous. + */ +static void +escapify(PQExpBuffer buf, const char *str, size_t len) +{ + for (size_t i = 0; i < len; i++) + { + char c = *str; + + if (c == '\n') + appendPQExpBufferStr(buf, "\\n"); + else if (c == '\0') + appendPQExpBufferStr(buf, "\\0"); + else if (c < ' ' || c > '~') + appendPQExpBuffer(buf, "\\x%2x", (uint8_t) c); + else + appendPQExpBufferChar(buf, c); + str++; + } +} + +static void +report_result(pe_test_config *tc, + bool success, + const char *testname, + const char *details, + const char *subname, + const char *resultdesc) +{ + int test_id = ++tc->test_count; + bool print_details = true; + bool print_result = true; + + if (success) + { + if (tc->verbosity <= 0) + print_details = false; + if (tc->verbosity < 0) + print_result = false; + } + else + tc->failure_count++; + + if (print_details) + printf("%s", details); + + if (print_result) + printf("%s %d - %s: %s: %s\n", + success ? "ok" : "not ok", + test_id, testname, + subname, + resultdesc); +} + +/* + * Return true for encodings in which bytes in a multi-byte character look + * like valid ascii characters. + */ +static bool +encoding_conflicts_ascii(int encoding) +{ + /* + * We don't store this property directly anywhere, but whether an encoding + * is a client-only encoding is a good proxy. + */ + if (encoding > PG_ENCODING_BE_LAST) + return true; + return false; +} + + +/* + * Confirm escaping doesn't read past the end of an allocation. Consider the + * result of malloc(4096), in the absence of freelist entries satisfying the + * allocation. On OpenBSD, reading one byte past the end of that object + * yields SIGSEGV. + * + * Run this test before the program's other tests, so freelists are minimal. + * len=4096 didn't SIGSEGV, likely due to free() calls in libpq. len=8192 + * did. Use 128 KiB, to somewhat insulate the outcome from distant new free() + * calls and libc changes. + */ +static void +test_gb18030_page_multiple(pe_test_config *tc) +{ + PQExpBuffer testname; + size_t input_len = 0x20000; + char *input; + + /* prepare input */ + input = pg_malloc(input_len); + memset(input, '-', input_len - 1); + input[input_len - 1] = 0xfe; + + /* name to describe the test */ + testname = createPQExpBuffer(); + appendPQExpBuffer(testname, ">repeat(%c, %zu)", input[0], input_len - 1); + escapify(testname, input + input_len - 1, 1); + appendPQExpBuffer(testname, "< - GB18030 - PQescapeLiteral"); + + /* test itself */ + PQsetClientEncoding(tc->conn, "GB18030"); + report_result(tc, PQescapeLiteral(tc->conn, input, input_len) == NULL, + testname->data, "", + "input validity vs escape success", "ok"); + + destroyPQExpBuffer(testname); + pg_free(input); +} + +/* + * Confirm json parsing doesn't read past the end of an allocation. This + * exercises wchar.c infrastructure like the true "escape" tests do, but this + * isn't an "escape" test. + */ +static void +test_gb18030_json(pe_test_config *tc) +{ + PQExpBuffer raw_buf; + PQExpBuffer testname; + const char input[] = "{\"\\u\xFE"; + size_t input_len = sizeof(input) - 1; + JsonLexContext *lex; + JsonSemAction sem = {0}; /* no callbacks */ + JsonParseErrorType json_error; + + /* prepare input like test_one_vector_escape() does */ + raw_buf = createPQExpBuffer(); + appendBinaryPQExpBuffer(raw_buf, input, input_len); + appendPQExpBufferStr(raw_buf, NEVER_ACCESS_STR); + VALGRIND_MAKE_MEM_NOACCESS(&raw_buf->data[input_len], + raw_buf->len - input_len); + + /* name to describe the test */ + testname = createPQExpBuffer(); + appendPQExpBuffer(testname, ">"); + escapify(testname, input, input_len); + appendPQExpBuffer(testname, "< - GB18030 - pg_parse_json"); + + /* test itself */ + lex = makeJsonLexContextCstringLen(NULL, raw_buf->data, input_len, + PG_GB18030, false); + json_error = pg_parse_json(lex, &sem); + report_result(tc, json_error == JSON_UNICODE_ESCAPE_FORMAT, + testname->data, "", + "diagnosed", json_errdetail(json_error, lex)); + + freeJsonLexContext(lex); + destroyPQExpBuffer(testname); + destroyPQExpBuffer(raw_buf); +} + + +static bool +escape_literal(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + char *escaped; + + escaped = PQescapeLiteral(conn, unescaped, unescaped_len); + if (!escaped) + { + appendPQExpBuffer(escape_err, "%s", + PQerrorMessage(conn)); + escape_err->data[escape_err->len - 1] = 0; + escape_err->len--; + return false; + } + else + { + appendPQExpBufferStr(target, escaped); + PQfreemem(escaped); + return true; + } +} + +static bool +escape_identifier(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + char *escaped; + + escaped = PQescapeIdentifier(conn, unescaped, unescaped_len); + if (!escaped) + { + appendPQExpBuffer(escape_err, "%s", + PQerrorMessage(conn)); + escape_err->data[escape_err->len - 1] = 0; + escape_err->len--; + return false; + } + else + { + appendPQExpBufferStr(target, escaped); + PQfreemem(escaped); + return true; + } +} + +static bool +escape_string_conn(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + int error; + size_t sz; + + appendPQExpBufferChar(target, '\''); + enlargePQExpBuffer(target, unescaped_len * 2 + 1); + sz = PQescapeStringConn(conn, target->data + target->len, + unescaped, unescaped_len, + &error); + + target->len += sz; + appendPQExpBufferChar(target, '\''); + + if (error) + { + appendPQExpBuffer(escape_err, "%s", + PQerrorMessage(conn)); + escape_err->data[escape_err->len - 1] = 0; + escape_err->len--; + return false; + } + else + { + return true; + } +} + +static bool +escape_string(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + size_t sz; + + appendPQExpBufferChar(target, '\''); + enlargePQExpBuffer(target, unescaped_len * 2 + 1); + sz = PQescapeString(target->data + target->len, + unescaped, unescaped_len); + target->len += sz; + appendPQExpBufferChar(target, '\''); + + + return true; +} + +/* + * Escape via s/'/''/. Non-core drivers invariably wrap libpq or use this + * method. It suffices iff the input passes encoding validation, so it's + * marked as supports_only_valid. + */ +static bool +escape_replace(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + const char *s = unescaped; + + appendPQExpBufferChar(target, '\''); + + for (int i = 0; i < unescaped_len; i++) + { + char c = *s; + + if (c == '\'') + { + appendPQExpBufferStr(target, "''"); + } + else + appendPQExpBufferChar(target, c); + s++; + } + appendPQExpBufferChar(target, '\''); + + return true; +} + +static bool +escape_append_literal(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + appendStringLiteral(target, unescaped, PQclientEncoding(conn), 1); + + return true; +} + +static bool +escape_fmt_id(PGconn *conn, PQExpBuffer target, + const char *unescaped, size_t unescaped_len, + PQExpBuffer escape_err) +{ + setFmtEncoding(PQclientEncoding(conn)); + appendPQExpBufferStr(target, fmtId(unescaped)); + + return true; +} + +static pe_test_escape_func pe_test_escape_funcs[] = +{ + { + .name = "PQescapeLiteral", + .reports_errors = true, + .supports_input_length = true, + .escape = escape_literal, + }, + { + .name = "PQescapeIdentifier", + .reports_errors = true, + .supports_input_length = true, + .escape = escape_identifier + }, + { + .name = "PQescapeStringConn", + .reports_errors = true, + .supports_input_length = true, + .escape = escape_string_conn + }, + { + .name = "PQescapeString", + .reports_errors = false, + .supports_input_length = true, + .escape = escape_string + }, + { + .name = "replace", + .reports_errors = false, + .supports_only_valid = true, + .supports_only_ascii_overlap = true, + .supports_input_length = true, + .escape = escape_replace + }, + { + .name = "appendStringLiteral", + .reports_errors = false, + .escape = escape_append_literal + }, + { + .name = "fmtId", + .reports_errors = false, + .escape = escape_fmt_id + }, +}; + + +#define TV(enc, string) {.client_encoding = (enc), .escape=string, .escape_len=sizeof(string) - 1, } +#define TV_LEN(enc, string, len) {.client_encoding = (enc), .escape=string, .escape_len=len, } +static pe_test_vector pe_test_vectors[] = +{ + /* expected to work sanity checks */ + TV("UTF-8", "1"), + TV("UTF-8", "'"), + TV("UTF-8", "\""), + + TV("UTF-8", "\'"), + TV("UTF-8", "\""), + + TV("UTF-8", "\\"), + + TV("UTF-8", "\\'"), + TV("UTF-8", "\\\""), + + /* trailing multi-byte character, paddable in available space */ + TV("UTF-8", "1\xC0"), + TV("UTF-8", "1\xE0 "), + TV("UTF-8", "1\xF0 "), + TV("UTF-8", "1\xF0 "), + TV("UTF-8", "1\xF0 "), + + /* trailing multi-byte character, not enough space to pad */ + TV("UTF-8", "1\xE0"), + TV("UTF-8", "1\xF0"), + TV("UTF-8", "\xF0"), + + /* try to smuggle in something in invalid characters */ + TV("UTF-8", "1\xE0'"), + TV("UTF-8", "1\xE0\""), + TV("UTF-8", "1\xF0'"), + TV("UTF-8", "1\xF0\""), + TV("UTF-8", "1\xF0'; "), + TV("UTF-8", "1\xF0\"; "), + TV("UTF-8", "1\xF0';;;;"), + TV("UTF-8", "1\xF0 ';;;;"), + TV("UTF-8", "1\xF0 \";;;;"), + TV("UTF-8", "1\xE0'; \\l ; "), + TV("UTF-8", "1\xE0\"; \\l ; "), + + /* null byte handling */ + TV("UTF-8", "some\0thing"), + TV("UTF-8", "some\0"), + TV("UTF-8", "some\xF0'\0"), + TV("UTF-8", "some\xF0'\0'"), + TV("UTF-8", "some\xF0" "ab\0'"), + + /* GB18030's 4 byte encoding requires a 2nd byte limited values */ + TV("GB18030", "\x90\x31"), + TV("GB18030", "\\\x81\x5c'"), + TV("GB18030", "\\\x81\x5c\""), + TV("GB18030", "\\\x81\x5c\0'"), + + /* + * \x81 indicates a 2 byte char. ' and " are not a valid second byte, but + * that requires encoding verification to know. E.g. replace_string() + * doesn't cope. + */ + TV("GB18030", "\\\x81';"), + TV("GB18030", "\\\x81\";"), + + /* + * \x81 indicates a 2 byte char. \ is a valid second character. + */ + TV("GB18030", "\\\x81\\';"), + TV("GB18030", "\\\x81\\\";"), + TV("GB18030", "\\\x81\0;"), + TV("GB18030", "\\\x81\0'"), + TV("GB18030", "\\\x81'\0"), + + TV("SJIS", "\xF0\x40;"), + + TV("SJIS", "\xF0';"), + TV("SJIS", "\xF0\";"), + TV("SJIS", "\xF0\0'"), + TV("SJIS", "\\\xF0\\';"), + TV("SJIS", "\\\xF0\\\";"), + + TV("gbk", "\x80';"), + TV("gbk", "\x80"), + TV("gbk", "\x80'"), + TV("gbk", "\x80\""), + TV("gbk", "\x80\\"), + + TV("mule_internal", "\\\x9c';\0;"), + + TV("sql_ascii", "1\xC0'"), + + /* + * Testcases that are not null terminated for the specified input length. + * That's interesting to verify that escape functions don't read beyond + * the intended input length. + * + * One interesting special case is GB18030, which has the odd behaviour + * needing to read beyond the first byte to determine the length of a + * multi-byte character. + */ + TV_LEN("gbk", "\x80", 1), + TV_LEN("GB18030", "\x80", 1), + TV_LEN("GB18030", "\x80\0", 2), + TV_LEN("GB18030", "\x80\x30", 2), + TV_LEN("GB18030", "\x80\x30\0", 3), + TV_LEN("GB18030", "\x80\x30\x30", 3), + TV_LEN("GB18030", "\x80\x30\x30\0", 4), + TV_LEN("UTF-8", "\xC3\xb6 ", 1), + TV_LEN("UTF-8", "\xC3\xb6 ", 2), +}; + + +static const char * +scan_res_s(PsqlScanResult res) +{ +#define TOSTR_CASE(sym) case sym: return #sym + + switch (res) + { + TOSTR_CASE(PSCAN_SEMICOLON); + TOSTR_CASE(PSCAN_BACKSLASH); + TOSTR_CASE(PSCAN_INCOMPLETE); + TOSTR_CASE(PSCAN_EOL); + } + + pg_unreachable(); + return ""; /* silence compiler */ +} + +/* + * Verify that psql parses the input as a single statement. If this property + * is violated, the escape function does not effectively protect against + * smuggling in a second statement. + */ +static void +test_psql_parse(pe_test_config *tc, PQExpBuffer testname, + PQExpBuffer input_buf, PQExpBuffer details) +{ + PsqlScanState scan_state; + PsqlScanResult scan_result; + PQExpBuffer query_buf; + promptStatus_t prompt_status = PROMPT_READY; + int matches = 0; + bool test_fails; + const char *resdesc; + + query_buf = createPQExpBuffer(); + + scan_state = psql_scan_create(&test_scan_callbacks); + + /* + * TODO: This hardcodes standard conforming strings, it would be useful to + * test without as well. + */ + psql_scan_setup(scan_state, input_buf->data, input_buf->len, + PQclientEncoding(tc->conn), 1); + + do + { + resetPQExpBuffer(query_buf); + + scan_result = psql_scan(scan_state, query_buf, + &prompt_status); + + appendPQExpBuffer(details, + "#\t\t %d: scan_result: %s prompt: %u, query_buf: ", + matches, scan_res_s(scan_result), prompt_status); + escapify(details, query_buf->data, query_buf->len); + appendPQExpBuffer(details, "\n"); + + matches++; + } + while (scan_result != PSCAN_INCOMPLETE && scan_result != PSCAN_EOL); + + psql_scan_destroy(scan_state); + destroyPQExpBuffer(query_buf); + + test_fails = matches > 1 || scan_result != PSCAN_EOL; + + if (matches > 1) + resdesc = "more than one match"; + else if (scan_result != PSCAN_EOL) + resdesc = "unexpected end state"; + else + resdesc = "ok"; + + report_result(tc, !test_fails, testname->data, details->data, + "psql parse", + resdesc); +} + +static void +test_one_vector_escape(pe_test_config *tc, const pe_test_vector *tv, const pe_test_escape_func *ef) +{ + PQExpBuffer testname; + PQExpBuffer details; + PQExpBuffer raw_buf; + PQExpBuffer escape_buf; + PQExpBuffer escape_err; + size_t input_encoding_validlen; + bool input_encoding_valid; + size_t input_encoding0_validlen; + bool input_encoding0_valid; + bool escape_success; + size_t escape_encoding_length; + bool escape_encoding_valid; + + escape_err = createPQExpBuffer(); + testname = createPQExpBuffer(); + details = createPQExpBuffer(); + raw_buf = createPQExpBuffer(); + escape_buf = createPQExpBuffer(); + + if (ef->supports_only_ascii_overlap && + encoding_conflicts_ascii(PQclientEncoding(tc->conn))) + { + goto out; + } + + /* name to describe the test */ + appendPQExpBuffer(testname, ">"); + escapify(testname, tv->escape, tv->escape_len); + appendPQExpBuffer(testname, "< - %s - %s", + tv->client_encoding, ef->name); + + /* details to describe the test, to allow for debugging */ + appendPQExpBuffer(details, "#\t input: %zd bytes: ", + tv->escape_len); + escapify(details, tv->escape, tv->escape_len); + appendPQExpBufferStr(details, "\n"); + appendPQExpBuffer(details, "#\t encoding: %s\n", + tv->client_encoding); + + + /* check encoding of input, to compare with after the test */ + input_encoding_validlen = pg_encoding_verifymbstr(PQclientEncoding(tc->conn), + tv->escape, + tv->escape_len); + input_encoding_valid = input_encoding_validlen == tv->escape_len; + appendPQExpBuffer(details, "#\t input encoding valid: %d\n", + input_encoding_valid); + + input_encoding0_validlen = pg_encoding_verifymbstr(PQclientEncoding(tc->conn), + tv->escape, + strnlen(tv->escape, tv->escape_len)); + input_encoding0_valid = input_encoding0_validlen == strnlen(tv->escape, tv->escape_len); + appendPQExpBuffer(details, "#\t input encoding valid till 0: %d\n", + input_encoding0_valid); + + appendPQExpBuffer(details, "#\t escape func: %s\n", + ef->name); + + if (!input_encoding_valid && ef->supports_only_valid + && !tc->force_unsupported) + goto out; + + + /* + * Put the to-be-escaped data into a buffer, so that we + * + * a) can mark memory beyond end of the string as inaccessible when using + * valgrind + * + * b) can append extra data beyond the length passed to the escape + * function, to verify that that data is not processed. + * + * TODO: Should we instead/additionally escape twice, once with unmodified + * and once with appended input? That way we could compare the two. + */ + appendBinaryPQExpBuffer(raw_buf, tv->escape, tv->escape_len); + + if (ef->supports_input_length) + { + /* + * Append likely invalid string that does *not* contain a null byte + * (which'd prevent some invalid accesses to later memory). + */ + appendPQExpBufferStr(raw_buf, NEVER_ACCESS_STR); + + VALGRIND_MAKE_MEM_NOACCESS(&raw_buf->data[tv->escape_len], + raw_buf->len - tv->escape_len); + } + else + { + /* append invalid string, after \0 */ + appendPQExpBufferChar(raw_buf, 0); + appendPQExpBufferStr(raw_buf, NEVER_ACCESS_STR); + + VALGRIND_MAKE_MEM_NOACCESS(&raw_buf->data[tv->escape_len + 1], + raw_buf->len - tv->escape_len - 1); + } + + /* call the to-be-tested escape function */ + escape_success = ef->escape(tc->conn, escape_buf, + raw_buf->data, tv->escape_len, + escape_err); + if (!escape_success) + { + appendPQExpBuffer(details, "#\t escape error: %s\n", + escape_err->data); + } + + if (escape_buf->len > 0) + { + bool contains_never; + + appendPQExpBuffer(details, "#\t escaped string: %zd bytes: ", escape_buf->len); + escapify(details, escape_buf->data, escape_buf->len); + appendPQExpBufferChar(details, '\n'); + + escape_encoding_length = pg_encoding_verifymbstr(PQclientEncoding(tc->conn), + escape_buf->data, + escape_buf->len); + escape_encoding_valid = escape_encoding_length == escape_buf->len; + + appendPQExpBuffer(details, "#\t escape encoding valid: %d\n", + escape_encoding_valid); + + /* + * Verify that no data beyond the end of the input is included in the + * escaped string. It'd be better to use something like memmem() + * here, but that's not available everywhere. + */ + contains_never = strstr(escape_buf->data, NEVER_ACCESS_STR) == NULL; + report_result(tc, contains_never, testname->data, details->data, + "escaped data beyond end of input", + contains_never ? "no" : "all secrets revealed"); + } + else + { + escape_encoding_length = 0; + escape_encoding_valid = 1; + } + + /* + * If the test reports errors, and the input was invalidly encoded, + * escaping should fail. One edge-case that we accept for now is that the + * input could have an embedded null byte, which the escape functions will + * just treat as a shorter string. If the encoding error is after the zero + * byte, the output thus won't contain it. + */ + if (ef->reports_errors) + { + bool ok = true; + const char *resdesc = "ok"; + + if (escape_success) + { + if (!input_encoding0_valid) + { + ok = false; + resdesc = "invalid input escaped successfully"; + } + else if (!input_encoding_valid) + resdesc = "invalid input escaped successfully, due to zero byte"; + } + else + { + if (input_encoding0_valid) + { + ok = false; + resdesc = "valid input failed to escape"; + } + else if (input_encoding_valid) + resdesc = "valid input failed to escape, due to zero byte"; + } + + report_result(tc, ok, testname->data, details->data, + "input validity vs escape success", + resdesc); + } + + /* + * If the input is invalidly encoded, the output should also be invalidly + * encoded. We accept the same zero-byte edge case as above. + */ + { + bool ok = true; + const char *resdesc = "ok"; + + if (input_encoding0_valid && !input_encoding_valid && escape_encoding_valid) + { + resdesc = "invalid input produced valid output, due to zero byte"; + } + else if (input_encoding0_valid && !escape_encoding_valid) + { + ok = false; + resdesc = "valid input produced invalid output"; + } + else if (!input_encoding0_valid && + (!ef->reports_errors || escape_success) && + escape_encoding_valid) + { + ok = false; + resdesc = "invalid input produced valid output"; + } + + report_result(tc, ok, testname->data, details->data, + "input and escaped encoding validity", + resdesc); + } + + /* + * Test psql parsing whenever we get any string back, even if the escape + * function returned a failure. + */ + if (escape_buf->len > 0) + { + test_psql_parse(tc, testname, + escape_buf, details); + } + +out: + destroyPQExpBuffer(escape_err); + destroyPQExpBuffer(details); + destroyPQExpBuffer(testname); + destroyPQExpBuffer(escape_buf); + destroyPQExpBuffer(raw_buf); +} + +static void +test_one_vector(pe_test_config *tc, const pe_test_vector *tv) +{ + if (PQsetClientEncoding(tc->conn, tv->client_encoding)) + { + fprintf(stderr, "failed to set encoding to %s:\n%s\n", + tv->client_encoding, PQerrorMessage(tc->conn)); + exit(1); + } + + for (int escoff = 0; escoff < lengthof(pe_test_escape_funcs); escoff++) + { + const pe_test_escape_func *ef = &pe_test_escape_funcs[escoff]; + + test_one_vector_escape(tc, tv, ef); + } +} + +static void +usage(const char *hint) +{ + if (hint) + fprintf(stderr, "Error: %s\n\n", hint); + + printf("PostgreSQL escape function test\n" + "\n" + "Usage:\n" + " test_escape --conninfo=CONNINFO [OPTIONS]\n" + "\n" + "Options:\n" + " -h, --help show this help\n" + " -c, --conninfo=CONNINFO connection information to use\n" + " -v, --verbose show test details even for successes\n" + " -q, --quiet only show failures\n" + " -f, --force-unsupported test invalid input even if unsupported\n" + ); + + if (hint) + exit(1); +} + +int +main(int argc, char *argv[]) +{ + pe_test_config tc = {0}; + int c; + int option_index; + + static const struct option long_options[] = { + {"help", no_argument, NULL, 'h'}, + {"conninfo", required_argument, NULL, 'c'}, + {"verbose", no_argument, NULL, 'v'}, + {"quiet", no_argument, NULL, 'q'}, + {"force-unsupported", no_argument, NULL, 'f'}, + {NULL, 0, NULL, 0}, + }; + + while ((c = getopt_long(argc, argv, "c:fhqv", long_options, &option_index)) != -1) + { + switch (c) + { + case 'h': + usage(NULL); + exit(0); + break; + case 'c': + tc.conninfo = optarg; + break; + case 'v': + tc.verbosity++; + break; + case 'q': + tc.verbosity--; + break; + case 'f': + tc.force_unsupported = true; + break; + } + } + + if (argc - optind >= 1) + usage("unused option(s) specified"); + + if (tc.conninfo == NULL) + usage("--conninfo needs to be specified"); + + tc.conn = PQconnectdb(tc.conninfo); + + if (!tc.conn || PQstatus(tc.conn) != CONNECTION_OK) + { + fprintf(stderr, "could not connect: %s\n", + PQerrorMessage(tc.conn)); + exit(1); + } + + test_gb18030_page_multiple(&tc); + test_gb18030_json(&tc); + + for (int i = 0; i < lengthof(pe_test_vectors); i++) + { + test_one_vector(&tc, &pe_test_vectors[i]); + } + + PQfinish(tc.conn); + + printf("# %d failures\n", tc.failure_count); + printf("1..%d\n", tc.test_count); + return tc.failure_count > 0; +} diff --git a/src/test/modules/test_extensions/Makefile b/src/test/modules/test_extensions/Makefile index 70fc0c8e66ced..05272e6a40b93 100644 --- a/src/test/modules/test_extensions/Makefile +++ b/src/test/modules/test_extensions/Makefile @@ -4,18 +4,23 @@ MODULE = test_extensions PGFILEDESC = "test_extensions - regression testing for EXTENSION support" EXTENSION = test_ext1 test_ext2 test_ext3 test_ext4 test_ext5 test_ext6 \ - test_ext7 test_ext8 test_ext_cine test_ext_cor \ + test_ext7 test_ext8 test_ext9 test_ext_cine test_ext_cor \ test_ext_cyclic1 test_ext_cyclic2 \ + test_ext_extschema \ test_ext_evttrig \ + test_ext_set_schema \ test_ext_req_schema1 test_ext_req_schema2 test_ext_req_schema3 DATA = test_ext1--1.0.sql test_ext2--1.0.sql test_ext3--1.0.sql \ test_ext4--1.0.sql test_ext5--1.0.sql test_ext6--1.0.sql \ test_ext7--1.0.sql test_ext7--1.0--2.0.sql test_ext8--1.0.sql \ + test_ext9--1.0.sql \ test_ext_cine--1.0.sql test_ext_cine--1.0--1.1.sql \ test_ext_cor--1.0.sql \ test_ext_cyclic1--1.0.sql test_ext_cyclic2--1.0.sql \ + test_ext_extschema--1.0.sql \ test_ext_evttrig--1.0.sql test_ext_evttrig--1.0--2.0.sql \ + test_ext_set_schema--1.0.sql \ test_ext_req_schema1--1.0.sql \ test_ext_req_schema2--1.0.sql \ test_ext_req_schema3--1.0.sql diff --git a/src/test/modules/test_extensions/expected/test_extensions.out b/src/test/modules/test_extensions/expected/test_extensions.out index a31775a260948..f357cc21aaab4 100644 --- a/src/test/modules/test_extensions/expected/test_extensions.out +++ b/src/test/modules/test_extensions/expected/test_extensions.out @@ -1,3 +1,4 @@ +CREATE SCHEMA has$dollar; -- test some errors CREATE EXTENSION test_ext1; ERROR: required extension "test_ext2" is not installed @@ -6,35 +7,35 @@ CREATE EXTENSION test_ext1 SCHEMA test_ext1; ERROR: schema "test_ext1" does not exist CREATE EXTENSION test_ext1 SCHEMA test_ext; ERROR: schema "test_ext" does not exist -CREATE SCHEMA test_ext; -CREATE EXTENSION test_ext1 SCHEMA test_ext; +CREATE EXTENSION test_ext1 SCHEMA has$dollar; ERROR: extension "test_ext1" must be installed in schema "test_ext1" -- finally success -CREATE EXTENSION test_ext1 SCHEMA test_ext CASCADE; +CREATE EXTENSION test_ext1 SCHEMA has$dollar CASCADE; NOTICE: installing required extension "test_ext2" NOTICE: installing required extension "test_ext3" NOTICE: installing required extension "test_ext5" NOTICE: installing required extension "test_ext4" SELECT extname, nspname, extversion, extrelocatable FROM pg_extension e, pg_namespace n WHERE extname LIKE 'test_ext%' AND e.extnamespace = n.oid ORDER BY 1; - extname | nspname | extversion | extrelocatable ------------+-----------+------------+---------------- - test_ext1 | test_ext1 | 1.0 | f - test_ext2 | test_ext | 1.0 | t - test_ext3 | test_ext | 1.0 | t - test_ext4 | test_ext | 1.0 | t - test_ext5 | test_ext | 1.0 | t + extname | nspname | extversion | extrelocatable +-----------+------------+------------+---------------- + test_ext1 | test_ext1 | 1.0 | f + test_ext2 | has$dollar | 1.0 | t + test_ext3 | has$dollar | 1.0 | t + test_ext4 | has$dollar | 1.0 | t + test_ext5 | has$dollar | 1.0 | t (5 rows) CREATE EXTENSION test_ext_cyclic1 CASCADE; NOTICE: installing required extension "test_ext_cyclic2" ERROR: cyclic dependency detected between extensions "test_ext_cyclic1" and "test_ext_cyclic2" -DROP SCHEMA test_ext CASCADE; +DROP SCHEMA has$dollar CASCADE; NOTICE: drop cascades to 5 other objects DETAIL: drop cascades to extension test_ext3 drop cascades to extension test_ext5 drop cascades to extension test_ext2 drop cascades to extension test_ext4 drop cascades to extension test_ext1 +CREATE SCHEMA has$dollar; CREATE EXTENSION test_ext6; DROP EXTENSION test_ext6; CREATE EXTENSION test_ext6; @@ -52,7 +53,13 @@ Objects in extension "test_ext7" table ext7_table1 table ext7_table2 table old_table1 -(6 rows) + type ext7_table1 + type ext7_table1[] + type ext7_table2 + type ext7_table2[] + type old_table1 + type old_table1[] +(12 rows) alter extension test_ext7 update to '2.0'; \dx+ test_ext7 @@ -61,7 +68,9 @@ Objects in extension "test_ext7" ------------------------------- sequence ext7_table2_col2_seq table ext7_table2 -(2 rows) + type ext7_table2 + type ext7_table2[] +(4 rows) -- test handling of temp objects created by extensions create extension test_ext8; @@ -78,8 +87,13 @@ order by 1; function pg_temp.ext8_temp_even(posint) table ext8_table1 table ext8_temp_table1 + type ext8_table1 + type ext8_table1[] + type ext8_temp_table1 + type ext8_temp_table1[] type posint -(5 rows) + type posint[] +(10 rows) -- Should be possible to drop and recreate this extension drop extension test_ext8; @@ -96,8 +110,13 @@ order by 1; function pg_temp.ext8_temp_even(posint) table ext8_table1 table ext8_temp_table1 + type ext8_table1 + type ext8_table1[] + type ext8_temp_table1 + type ext8_temp_table1[] type posint -(5 rows) + type posint[] +(10 rows) -- here we want to start a new session and wait till old one is gone select pg_backend_pid() as oldpid \gset @@ -116,11 +135,119 @@ Objects in extension "test_ext8" ---------------------------- function ext8_even(posint) table ext8_table1 + type ext8_table1 + type ext8_table1[] type posint -(3 rows) + type posint[] +(6 rows) -- dropping it should still work drop extension test_ext8; +-- check handling of types as extension members +create extension test_ext9; +\dx+ test_ext9 + Objects in extension "test_ext9" + Object description +---------------------------------------------------- + cast from varbitrange to varbitmultirange + function varbitmultirange() + function varbitmultirange(varbitrange) + function varbitmultirange(varbitrange[]) + function varbitrange(bit varying,bit varying) + function varbitrange(bit varying,bit varying,text) + table sometable + type somecomposite + type somecomposite[] + type sometable + type sometable[] + type varbitmultirange + type varbitmultirange[] + type varbitrange + type varbitrange[] +(15 rows) + +alter extension test_ext9 drop type varbitrange; +\dx+ test_ext9 + Objects in extension "test_ext9" + Object description +---------------------------------------------------- + cast from varbitrange to varbitmultirange + function varbitmultirange() + function varbitmultirange(varbitrange) + function varbitmultirange(varbitrange[]) + function varbitrange(bit varying,bit varying) + function varbitrange(bit varying,bit varying,text) + table sometable + type somecomposite + type somecomposite[] + type sometable + type sometable[] +(11 rows) + +alter extension test_ext9 add type varbitrange; +\dx+ test_ext9 + Objects in extension "test_ext9" + Object description +---------------------------------------------------- + cast from varbitrange to varbitmultirange + function varbitmultirange() + function varbitmultirange(varbitrange) + function varbitmultirange(varbitrange[]) + function varbitrange(bit varying,bit varying) + function varbitrange(bit varying,bit varying,text) + table sometable + type somecomposite + type somecomposite[] + type sometable + type sometable[] + type varbitmultirange + type varbitmultirange[] + type varbitrange + type varbitrange[] +(15 rows) + +alter extension test_ext9 drop table sometable; +\dx+ test_ext9 + Objects in extension "test_ext9" + Object description +---------------------------------------------------- + cast from varbitrange to varbitmultirange + function varbitmultirange() + function varbitmultirange(varbitrange) + function varbitmultirange(varbitrange[]) + function varbitrange(bit varying,bit varying) + function varbitrange(bit varying,bit varying,text) + type somecomposite + type somecomposite[] + type varbitmultirange + type varbitmultirange[] + type varbitrange + type varbitrange[] +(12 rows) + +alter extension test_ext9 add table sometable; +\dx+ test_ext9 + Objects in extension "test_ext9" + Object description +---------------------------------------------------- + cast from varbitrange to varbitmultirange + function varbitmultirange() + function varbitmultirange(varbitrange) + function varbitmultirange(varbitrange[]) + function varbitrange(bit varying,bit varying) + function varbitrange(bit varying,bit varying,text) + table sometable + type somecomposite + type somecomposite[] + type sometable + type sometable[] + type varbitmultirange + type varbitmultirange[] + type varbitrange + type varbitrange[] +(15 rows) + +drop extension test_ext9; -- Test creation of extension in temporary schema with two-phase commit, -- which should not work. This function wrapper is useful for portability. -- Avoid noise caused by CONTEXT and NOTICE messages including the temporary @@ -236,9 +363,12 @@ Objects in extension "test_ext_cor" ------------------------------ function ext_cor_func() operator <<@@(point,polygon) + type ext_cor_view + type ext_cor_view[] type test_ext_type + type test_ext_type[] view ext_cor_view -(4 rows) +(7 rows) -- -- CREATE IF NOT EXISTS is an entirely unsound thing for an extension @@ -294,7 +424,13 @@ Objects in extension "test_ext_cine" server ext_cine_srv table ext_cine_tab1 table ext_cine_tab2 -(8 rows) + type ext_cine_mv + type ext_cine_mv[] + type ext_cine_tab1 + type ext_cine_tab1[] + type ext_cine_tab2 + type ext_cine_tab2[] +(14 rows) ALTER EXTENSION test_ext_cine UPDATE TO '1.1'; \dx+ test_ext_cine @@ -310,11 +446,112 @@ Objects in extension "test_ext_cine" table ext_cine_tab1 table ext_cine_tab2 table ext_cine_tab3 -(9 rows) + type ext_cine_mv + type ext_cine_mv[] + type ext_cine_tab1 + type ext_cine_tab1[] + type ext_cine_tab2 + type ext_cine_tab2[] + type ext_cine_tab3 + type ext_cine_tab3[] +(17 rows) + +-- +-- Test @extschema@ syntax. +-- +CREATE SCHEMA "has space"; +CREATE EXTENSION test_ext_extschema SCHEMA has$dollar; +ERROR: invalid character in extension "test_ext_extschema" schema: must not contain any of ""$'\" +CREATE EXTENSION test_ext_extschema SCHEMA "has space"; +-- +-- Test basic SET SCHEMA handling. +-- +CREATE SCHEMA s1; +CREATE SCHEMA s2; +CREATE EXTENSION test_ext_set_schema SCHEMA s1; +ALTER EXTENSION test_ext_set_schema SET SCHEMA s2; +\dx+ test_ext_set_schema + Objects in extension "test_ext_set_schema" + Object description +------------------------------------------------------- + cast from s2.ess_range_type to s2.ess_multirange_type + function s2.ess_func(integer) + function s2.ess_multirange_type() + function s2.ess_multirange_type(s2.ess_range_type) + function s2.ess_multirange_type(s2.ess_range_type[]) + function s2.ess_range_type(text,text) + function s2.ess_range_type(text,text,text) + table s2.ess_table + type s2.ess_composite_type + type s2.ess_composite_type[] + type s2.ess_multirange_type + type s2.ess_multirange_type[] + type s2.ess_range_type + type s2.ess_range_type[] + type s2.ess_table + type s2.ess_table[] +(16 rows) +\sf s2.ess_func(int) +CREATE OR REPLACE FUNCTION s2.ess_func(integer) + RETURNS text + LANGUAGE sql +BEGIN ATOMIC + SELECT ess_table.f3 + FROM s2.ess_table + WHERE (ess_table.f1 = $1); +END +-- +-- Test extension with objects outside the extension's schema. +-- +CREATE SCHEMA test_func_dep1; +CREATE SCHEMA test_func_dep2; +CREATE SCHEMA test_func_dep3; +CREATE EXTENSION test_ext_req_schema1 SCHEMA test_func_dep1; +ALTER FUNCTION test_func_dep1.dep_req1() SET SCHEMA test_func_dep2; +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as objref, + deptype + FROM pg_depend + WHERE classid = 'pg_extension'::regclass AND + objid = (SELECT oid FROM pg_extension WHERE extname = 'test_ext_req_schema1') + ORDER BY 1, 2; + obj | objref | deptype +--------------------------------+-----------------------+--------- + extension test_ext_req_schema1 | schema test_func_dep1 | n +(1 row) + +-- fails, as function dep_req1 is not in the same schema as the extension. +ALTER EXTENSION test_ext_req_schema1 SET SCHEMA test_func_dep3; +ERROR: extension "test_ext_req_schema1" does not support SET SCHEMA +DETAIL: function test_func_dep2.dep_req1() is not in the extension's schema "test_func_dep1" +-- Move back the function, and the extension can be moved. +ALTER FUNCTION test_func_dep2.dep_req1() SET SCHEMA test_func_dep1; +ALTER EXTENSION test_ext_req_schema1 SET SCHEMA test_func_dep3; +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as objref, + deptype + FROM pg_depend + WHERE classid = 'pg_extension'::regclass AND + objid = (SELECT oid FROM pg_extension WHERE extname = 'test_ext_req_schema1') + ORDER BY 1, 2; + obj | objref | deptype +--------------------------------+-----------------------+--------- + extension test_ext_req_schema1 | schema test_func_dep3 | n +(1 row) + +DROP EXTENSION test_ext_req_schema1 CASCADE; +DROP SCHEMA test_func_dep1; +DROP SCHEMA test_func_dep2; +DROP SCHEMA test_func_dep3; -- -- Test @extschema:extname@ syntax and no_relocate option -- +CREATE EXTENSION test_ext_req_schema1 SCHEMA has$dollar; +CREATE EXTENSION test_ext_req_schema3 CASCADE; +NOTICE: installing required extension "test_ext_req_schema2" +ERROR: invalid character in extension "test_ext_req_schema1" schema: must not contain any of ""$'\" +DROP EXTENSION test_ext_req_schema1; CREATE SCHEMA test_s_dep; CREATE EXTENSION test_ext_req_schema1 SCHEMA test_s_dep; CREATE EXTENSION test_ext_req_schema3 CASCADE; diff --git a/src/test/modules/test_extensions/meson.build b/src/test/modules/test_extensions/meson.build index 698775b28d843..c5f3424da5159 100644 --- a/src/test/modules/test_extensions/meson.build +++ b/src/test/modules/test_extensions/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_install_data += files( 'test_ext1--1.0.sql', @@ -18,6 +18,8 @@ test_install_data += files( 'test_ext7.control', 'test_ext8--1.0.sql', 'test_ext8.control', + 'test_ext9--1.0.sql', + 'test_ext9.control', 'test_ext_cine--1.0.sql', 'test_ext_cine--1.0--1.1.sql', 'test_ext_cine.control', @@ -27,6 +29,8 @@ test_install_data += files( 'test_ext_cyclic1.control', 'test_ext_cyclic2--1.0.sql', 'test_ext_cyclic2.control', + 'test_ext_extschema--1.0.sql', + 'test_ext_extschema.control', 'test_ext_evttrig--1.0--2.0.sql', 'test_ext_evttrig--1.0.sql', 'test_ext_evttrig.control', @@ -36,6 +40,8 @@ test_install_data += files( 'test_ext_req_schema2.control', 'test_ext_req_schema3--1.0.sql', 'test_ext_req_schema3.control', + 'test_ext_set_schema--1.0.sql', + 'test_ext_set_schema.control', ) tests += { @@ -47,6 +53,6 @@ tests += { 'test_extensions', 'test_extdepend', ], - 'regress_args': ['--no-locale', '--encoding=UTF8'], + 'regress_args': ['--no-locale'], }, } diff --git a/src/test/modules/test_extensions/sql/test_extensions.sql b/src/test/modules/test_extensions/sql/test_extensions.sql index f4947e7da6f0e..642c82ff5d381 100644 --- a/src/test/modules/test_extensions/sql/test_extensions.sql +++ b/src/test/modules/test_extensions/sql/test_extensions.sql @@ -1,18 +1,20 @@ +CREATE SCHEMA has$dollar; + -- test some errors CREATE EXTENSION test_ext1; CREATE EXTENSION test_ext1 SCHEMA test_ext1; CREATE EXTENSION test_ext1 SCHEMA test_ext; -CREATE SCHEMA test_ext; -CREATE EXTENSION test_ext1 SCHEMA test_ext; +CREATE EXTENSION test_ext1 SCHEMA has$dollar; -- finally success -CREATE EXTENSION test_ext1 SCHEMA test_ext CASCADE; +CREATE EXTENSION test_ext1 SCHEMA has$dollar CASCADE; SELECT extname, nspname, extversion, extrelocatable FROM pg_extension e, pg_namespace n WHERE extname LIKE 'test_ext%' AND e.extnamespace = n.oid ORDER BY 1; CREATE EXTENSION test_ext_cyclic1 CASCADE; -DROP SCHEMA test_ext CASCADE; +DROP SCHEMA has$dollar CASCADE; +CREATE SCHEMA has$dollar; CREATE EXTENSION test_ext6; DROP EXTENSION test_ext6; @@ -65,6 +67,19 @@ end'; -- dropping it should still work drop extension test_ext8; +-- check handling of types as extension members +create extension test_ext9; +\dx+ test_ext9 +alter extension test_ext9 drop type varbitrange; +\dx+ test_ext9 +alter extension test_ext9 add type varbitrange; +\dx+ test_ext9 +alter extension test_ext9 drop table sometable; +\dx+ test_ext9 +alter extension test_ext9 add table sometable; +\dx+ test_ext9 +drop extension test_ext9; + -- Test creation of extension in temporary schema with two-phase commit, -- which should not work. This function wrapper is useful for portability. @@ -210,9 +225,61 @@ ALTER EXTENSION test_ext_cine UPDATE TO '1.1'; \dx+ test_ext_cine +-- +-- Test @extschema@ syntax. +-- +CREATE SCHEMA "has space"; +CREATE EXTENSION test_ext_extschema SCHEMA has$dollar; +CREATE EXTENSION test_ext_extschema SCHEMA "has space"; + +-- +-- Test basic SET SCHEMA handling. +-- +CREATE SCHEMA s1; +CREATE SCHEMA s2; +CREATE EXTENSION test_ext_set_schema SCHEMA s1; +ALTER EXTENSION test_ext_set_schema SET SCHEMA s2; +\dx+ test_ext_set_schema +\sf s2.ess_func(int) + +-- +-- Test extension with objects outside the extension's schema. +-- +CREATE SCHEMA test_func_dep1; +CREATE SCHEMA test_func_dep2; +CREATE SCHEMA test_func_dep3; +CREATE EXTENSION test_ext_req_schema1 SCHEMA test_func_dep1; +ALTER FUNCTION test_func_dep1.dep_req1() SET SCHEMA test_func_dep2; +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as objref, + deptype + FROM pg_depend + WHERE classid = 'pg_extension'::regclass AND + objid = (SELECT oid FROM pg_extension WHERE extname = 'test_ext_req_schema1') + ORDER BY 1, 2; +-- fails, as function dep_req1 is not in the same schema as the extension. +ALTER EXTENSION test_ext_req_schema1 SET SCHEMA test_func_dep3; +-- Move back the function, and the extension can be moved. +ALTER FUNCTION test_func_dep2.dep_req1() SET SCHEMA test_func_dep1; +ALTER EXTENSION test_ext_req_schema1 SET SCHEMA test_func_dep3; +SELECT pg_describe_object(classid, objid, objsubid) as obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as objref, + deptype + FROM pg_depend + WHERE classid = 'pg_extension'::regclass AND + objid = (SELECT oid FROM pg_extension WHERE extname = 'test_ext_req_schema1') + ORDER BY 1, 2; +DROP EXTENSION test_ext_req_schema1 CASCADE; +DROP SCHEMA test_func_dep1; +DROP SCHEMA test_func_dep2; +DROP SCHEMA test_func_dep3; + -- -- Test @extschema:extname@ syntax and no_relocate option -- +CREATE EXTENSION test_ext_req_schema1 SCHEMA has$dollar; +CREATE EXTENSION test_ext_req_schema3 CASCADE; +DROP EXTENSION test_ext_req_schema1; CREATE SCHEMA test_s_dep; CREATE EXTENSION test_ext_req_schema1 SCHEMA test_s_dep; CREATE EXTENSION test_ext_req_schema3 CASCADE; diff --git a/src/test/modules/test_extensions/test_ext9--1.0.sql b/src/test/modules/test_extensions/test_ext9--1.0.sql new file mode 100644 index 0000000000000..427070bece342 --- /dev/null +++ b/src/test/modules/test_extensions/test_ext9--1.0.sql @@ -0,0 +1,8 @@ +/* src/test/modules/test_extensions/test_ext9--1.0.sql */ +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION test_ext9" to load this file. \quit + +-- check handling of types as extension members +create type varbitrange as range (subtype = varbit); +create table sometable (f1 real, f2 real); +create type somecomposite as (f1 float8, f2 float8); diff --git a/src/test/modules/test_extensions/test_ext9.control b/src/test/modules/test_extensions/test_ext9.control new file mode 100644 index 0000000000000..c36eddb1789f6 --- /dev/null +++ b/src/test/modules/test_extensions/test_ext9.control @@ -0,0 +1,3 @@ +comment = 'test_ext9' +default_version = '1.0' +relocatable = true diff --git a/src/test/modules/test_extensions/test_ext_extschema--1.0.sql b/src/test/modules/test_extensions/test_ext_extschema--1.0.sql new file mode 100644 index 0000000000000..aed53830aae92 --- /dev/null +++ b/src/test/modules/test_extensions/test_ext_extschema--1.0.sql @@ -0,0 +1,5 @@ +/* src/test/modules/test_extensions/test_ext_extschema--1.0.sql */ +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION test_ext_extschema" to load this file. \quit + +SELECT 1 AS @extschema@; diff --git a/src/test/modules/test_extensions/test_ext_extschema.control b/src/test/modules/test_extensions/test_ext_extschema.control new file mode 100644 index 0000000000000..b124d492c0da8 --- /dev/null +++ b/src/test/modules/test_extensions/test_ext_extschema.control @@ -0,0 +1,3 @@ +comment = 'test @extschema@' +default_version = '1.0' +relocatable = false diff --git a/src/test/modules/test_extensions/test_ext_set_schema--1.0.sql b/src/test/modules/test_extensions/test_ext_set_schema--1.0.sql new file mode 100644 index 0000000000000..66df583ca95b5 --- /dev/null +++ b/src/test/modules/test_extensions/test_ext_set_schema--1.0.sql @@ -0,0 +1,17 @@ +/* src/test/modules/test_extensions/test_ext_set_schema--1.0.sql */ +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION test_ext_set_schema" to load this file. \quit + +-- Create various object types that need extra handling by SET SCHEMA. + +CREATE TABLE ess_table (f1 int primary key, f2 int, f3 text, + constraint ess_c check (f1 != f2)); + +CREATE FUNCTION ess_func(int) RETURNS text +BEGIN ATOMIC + SELECT f3 FROM ess_table WHERE f1 = $1; +END; + +CREATE TYPE ess_range_type AS RANGE (subtype = text); + +CREATE TYPE ess_composite_type AS (f1 int, f2 ess_range_type); diff --git a/src/test/modules/test_extensions/test_ext_set_schema.control b/src/test/modules/test_extensions/test_ext_set_schema.control new file mode 100644 index 0000000000000..a9a236763e536 --- /dev/null +++ b/src/test/modules/test_extensions/test_ext_set_schema.control @@ -0,0 +1,3 @@ +comment = 'Test ALTER EXTENSION SET SCHEMA' +default_version = '1.0' +relocatable = true diff --git a/src/test/modules/test_ginpostinglist/expected/test_ginpostinglist.out b/src/test/modules/test_ginpostinglist/expected/test_ginpostinglist.out index 4d0beaecea9a3..c3f40ab71d9b5 100644 --- a/src/test/modules/test_ginpostinglist/expected/test_ginpostinglist.out +++ b/src/test/modules/test_ginpostinglist/expected/test_ginpostinglist.out @@ -1,7 +1,7 @@ CREATE EXTENSION test_ginpostinglist; -- -- All the logic is in the test_ginpostinglist() function. It will throw --- a error if something fails. +-- an error if something fails. -- SELECT test_ginpostinglist(); NOTICE: testing with (0, 1), (0, 2), max 14 bytes diff --git a/src/test/modules/test_ginpostinglist/meson.build b/src/test/modules/test_ginpostinglist/meson.build index 338296267ca9d..e120071e86cc8 100644 --- a/src/test/modules/test_ginpostinglist/meson.build +++ b/src/test/modules/test_ginpostinglist/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_ginpostinglist_sources = files( 'test_ginpostinglist.c', diff --git a/src/test/modules/test_ginpostinglist/sql/test_ginpostinglist.sql b/src/test/modules/test_ginpostinglist/sql/test_ginpostinglist.sql index b8cab7accecf4..107baf8f275c3 100644 --- a/src/test/modules/test_ginpostinglist/sql/test_ginpostinglist.sql +++ b/src/test/modules/test_ginpostinglist/sql/test_ginpostinglist.sql @@ -2,6 +2,6 @@ CREATE EXTENSION test_ginpostinglist; -- -- All the logic is in the test_ginpostinglist() function. It will throw --- a error if something fails. +-- an error if something fails. -- SELECT test_ginpostinglist(); diff --git a/src/test/modules/test_ginpostinglist/test_ginpostinglist.c b/src/test/modules/test_ginpostinglist/test_ginpostinglist.c index 80cee656841f5..04215cadd998c 100644 --- a/src/test/modules/test_ginpostinglist/test_ginpostinglist.c +++ b/src/test/modules/test_ginpostinglist/test_ginpostinglist.c @@ -3,7 +3,7 @@ * test_ginpostinglist.c * Test varbyte-encoding in ginpostinglist.c * - * Copyright (c) 2019-2023, PostgreSQL Global Development Group + * Copyright (c) 2019-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_ginpostinglist/test_ginpostinglist.c diff --git a/src/test/modules/test_integerset/meson.build b/src/test/modules/test_integerset/meson.build index 7aa7bf800196b..afb1db09cd391 100644 --- a/src/test/modules/test_integerset/meson.build +++ b/src/test/modules/test_integerset/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_integerset_sources = files( 'test_integerset.c', diff --git a/src/test/modules/test_integerset/test_integerset.c b/src/test/modules/test_integerset/test_integerset.c index fbcb0f7cb1bb5..61f8d0b663a9a 100644 --- a/src/test/modules/test_integerset/test_integerset.c +++ b/src/test/modules/test_integerset/test_integerset.c @@ -3,7 +3,7 @@ * test_integerset.c * Test integer set data structure. * - * Copyright (c) 2019-2023, PostgreSQL Global Development Group + * Copyright (c) 2019-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_integerset/test_integerset.c diff --git a/src/test/modules/test_json_parser/.gitignore b/src/test/modules/test_json_parser/.gitignore new file mode 100644 index 0000000000000..2c176672db770 --- /dev/null +++ b/src/test/modules/test_json_parser/.gitignore @@ -0,0 +1,3 @@ +tmp_check +test_json_parser_perf +test_json_parser_incremental diff --git a/src/test/modules/test_json_parser/Makefile b/src/test/modules/test_json_parser/Makefile new file mode 100644 index 0000000000000..2dc7175b7c8fe --- /dev/null +++ b/src/test/modules/test_json_parser/Makefile @@ -0,0 +1,36 @@ + +PGFILEDESC = "standalone json parser tester" +PGAPPICON = win32 + +TAP_TESTS = 1 + +OBJS = test_json_parser_incremental.o test_json_parser_perf.o $(WIN32RES) + +EXTRA_CLEAN = test_json_parser_incremental$(X) test_json_parser_perf$(X) + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/test_json_parser +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif + +all: test_json_parser_incremental$(X) test_json_parser_perf$(X) + +%.o: $(top_srcdir)/$(subdir)/%.c + +test_json_parser_incremental$(X): test_json_parser_incremental.o $(WIN32RES) + $(CC) $(CFLAGS) $^ $(PG_LIBS_INTERNAL) $(LDFLAGS) $(LDFLAGS_EX) $(PG_LIBS) $(LIBS) -o $@ + +test_json_parser_perf$(X): test_json_parser_perf.o $(WIN32RES) + $(CC) $(CFLAGS) $^ $(PG_LIBS_INTERNAL) $(LDFLAGS) $(LDFLAGS_EX) $(PG_LIBS) $(LIBS) -o $@ + +speed-check: test_json_parser_perf$(X) + @echo Standard parser: + time ./test_json_parser_perf 10000 $(top_srcdir)/$(subdir)/tiny.json + @echo Incremental parser: + time ./test_json_parser_perf -i 10000 $(top_srcdir)/$(subdir)/tiny.json diff --git a/src/test/modules/test_json_parser/README b/src/test/modules/test_json_parser/README new file mode 100644 index 0000000000000..ceccd499f4358 --- /dev/null +++ b/src/test/modules/test_json_parser/README @@ -0,0 +1,24 @@ +Module `test_json_parser` +========================= + +This module contains two programs for testing the json parsers. + +- `test_json_parser_incremental` is for testing the incremental parser, It + reads in a file and passes it in very small chunks (default is 60 bytes at a + time) to the incremental parser. It's not meant to be a speed test but to + test the accuracy of the incremental parser. There are two option arguments, + "-c nn" specifies an alternative chunk size, and "-s" specifies using + semantic routines. The semantic routines re-output the json, although not in + a very pretty form. The required non-option argument is the input file name. +- `test_json_parser_perf` is for speed testing both the standard + recursive descent parser and the non-recursive incremental + parser. If given the `-i` flag it uses the non-recursive parser, + otherwise the standard parser. The remaining flags are the number of + parsing iterations and the file containing the input. Even when + using the non-recursive parser, the input is passed to the parser in a + single chunk. The results are thus comparable to those of the + standard parser. + +The sample input file is a small, sanitized extract from a list of `delicious` +bookmarks taken some years ago, all wrapped in a single json +array. diff --git a/src/test/modules/test_json_parser/meson.build b/src/test/modules/test_json_parser/meson.build new file mode 100644 index 0000000000000..edff0d268547e --- /dev/null +++ b/src/test/modules/test_json_parser/meson.build @@ -0,0 +1,57 @@ +# Copyright (c) 2024, PostgreSQL Global Development Group + +test_json_parser_incremental_sources = files( + 'test_json_parser_incremental.c', +) + +if host_system == 'windows' + test_json_parser_incremental_sources += rc_bin_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'test_json_parser_incremental', + '--FILEDESC', 'standalone json parser tester', + ]) +endif + +test_json_parser_incremental = executable('test_json_parser_incremental', + test_json_parser_incremental_sources, + dependencies: [frontend_code], + kwargs: default_bin_args + { + 'install': false, + }, +) + +test_json_parser_perf_sources = files( + 'test_json_parser_perf.c', +) + +if host_system == 'windows' + test_json_parser_perf_sources += rc_bin_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'test_json_parser_perf', + '--FILEDESC', 'standalone json parser tester', + ]) +endif + +test_json_parser_perf = executable('test_json_parser_perf', + test_json_parser_perf_sources, + dependencies: [frontend_code], + kwargs: default_bin_args + { + 'install': false, + }, +) + +tests += { + 'name': 'test_json_parser', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tap': { + 'tests': [ + 't/001_test_json_parser_incremental.pl', + 't/002_inline.pl', + 't/003_test_semantic.pl', + 't/004_test_parser_perf.pl' + ], + 'deps': [ + test_json_parser_incremental, + test_json_parser_perf, + ], + }, +} diff --git a/src/test/modules/test_json_parser/t/001_test_json_parser_incremental.pl b/src/test/modules/test_json_parser/t/001_test_json_parser_incremental.pl new file mode 100644 index 0000000000000..abf0d7a2375d1 --- /dev/null +++ b/src/test/modules/test_json_parser/t/001_test_json_parser_incremental.pl @@ -0,0 +1,32 @@ + +# Copyright (c) 2024, PostgreSQL Global Development Group + +# Test the incremental (table-driven) json parser. + + +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Utils; +use Test::More; +use FindBin; + +my $test_file = "$FindBin::RealBin/../tiny.json"; + +my $exe = "test_json_parser_incremental"; + +# Test the usage error +my ($stdout, $stderr) = run_command([ $exe, "-c", 10 ]); +like($stderr, qr/Usage:/, 'error message if not enough arguments'); + +# Test that we get success for small chunk sizes from 64 down to 1. + +for (my $size = 64; $size > 0; $size--) +{ + ($stdout, $stderr) = run_command([ $exe, "-c", $size, $test_file ]); + + like($stdout, qr/SUCCESS/, "chunk size $size: test succeeds"); + is($stderr, "", "chunk size $size: no error output"); +} + +done_testing(); diff --git a/src/test/modules/test_json_parser/t/002_inline.pl b/src/test/modules/test_json_parser/t/002_inline.pl new file mode 100644 index 0000000000000..8d62eb44c8cfa --- /dev/null +++ b/src/test/modules/test_json_parser/t/002_inline.pl @@ -0,0 +1,138 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# Test success or failure of the incremental (table-driven) JSON parser +# for a variety of small inputs. + +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Utils; +use Test::More; + +use File::Temp qw(tempfile); + +my $dir = PostgreSQL::Test::Utils::tempdir; + +sub test +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my ($name, $json, %params) = @_; + my $exe = "test_json_parser_incremental"; + my $chunk = length($json); + + # Test the input with chunk sizes from max(input_size, 64) down to 1 + + if ($chunk > 64) + { + $chunk = 64; + } + + my ($fh, $fname) = tempfile(DIR => $dir); + print $fh "$json"; + close($fh); + + foreach my $size (reverse(1 .. $chunk)) + { + my ($stdout, $stderr) = run_command([ $exe, "-c", $size, $fname ]); + + if (defined($params{error})) + { + unlike($stdout, qr/SUCCESS/, + "$name, chunk size $size: test fails"); + like($stderr, $params{error}, + "$name, chunk size $size: correct error output"); + } + else + { + like($stdout, qr/SUCCESS/, + "$name, chunk size $size: test succeeds"); + is($stderr, "", "$name, chunk size $size: no error output"); + } + } +} + +test("number", "12345"); +test("string", '"hello"'); +test("false", "false"); +test("true", "true"); +test("null", "null"); +test("empty object", "{}"); +test("empty array", "[]"); +test("array with number", "[12345]"); +test("array with numbers", "[12345,67890]"); +test("array with null", "[null]"); +test("array with string", '["hello"]'); +test("array with boolean", '[false]'); +test("single pair", '{"key": "value"}'); +test("heavily nested array", "[" x 3200 . "]" x 3200); +test("serial escapes", '"\\\\\\\\\\\\\\\\"'); +test("interrupted escapes", '"\\\\\\"\\\\\\\\\\"\\\\"'); +test("whitespace", ' "" '); + +test("unclosed empty object", + "{", error => qr/input string ended unexpectedly/); +test("bad key", "{{", error => qr/Expected string or "}", but found "\{"/); +test("bad key", "{{}", error => qr/Expected string or "}", but found "\{"/); +test("numeric key", "{1234: 2}", + error => qr/Expected string or "}", but found "1234"/); +test( + "second numeric key", + '{"a": "a", 1234: 2}', + error => qr/Expected string, but found "1234"/); +test( + "unclosed object with pair", + '{"key": "value"', + error => qr/input string ended unexpectedly/); +test("missing key value", + '{"key": }', error => qr/Expected JSON value, but found "}"/); +test( + "missing colon", + '{"key" 12345}', + error => qr/Expected ":", but found "12345"/); +test( + "missing comma", + '{"key": 12345 12345}', + error => qr/Expected "," or "}", but found "12345"/); +test("overnested array", + "[" x 6401, error => qr/maximum permitted depth is 6400/); +test("overclosed array", + "[]]", error => qr/Expected end of input, but found "]"/); +test("unexpected token in array", + "[ }}} ]", error => qr/Expected array element or "]", but found "}"/); +test("junk punctuation", "[ ||| ]", error => qr/Token "|" is invalid/); +test("missing comma in array", + "[123 123]", error => qr/Expected "," or "]", but found "123"/); +test("misspelled boolean", "tru", error => qr/Token "tru" is invalid/); +test( + "misspelled boolean in array", + "[tru]", + error => qr/Token "tru" is invalid/); +test("smashed top-level scalar", "12zz", + error => qr/Token "12zz" is invalid/); +test( + "smashed scalar in array", + "[12zz]", + error => qr/Token "12zz" is invalid/); +test( + "unknown escape sequence", + '"hello\vworld"', + error => qr/Escape sequence "\\v" is invalid/); +test("unescaped control", + "\"hello\tworld\"", + error => qr/Character with value 0x09 must be escaped/); +test( + "incorrect escape count", + '"\\\\\\\\\\\\\\"', + error => qr/Token ""\\\\\\\\\\\\\\"" is invalid/); + +# Case with three bytes: double-quote, backslash and . +# Both invalid-token and invalid-escape are possible errors, because for +# smaller chunk sizes the incremental parser skips the string parsing when +# it cannot find an ending quote. +test("incomplete UTF-8 sequence", + "\"\\\x{F5}", + error => qr/(Token|Escape sequence) ""?\\\x{F5}" is invalid/); + +done_testing(); diff --git a/src/test/modules/test_json_parser/t/003_test_semantic.pl b/src/test/modules/test_json_parser/t/003_test_semantic.pl new file mode 100644 index 0000000000000..b6553bbcddf05 --- /dev/null +++ b/src/test/modules/test_json_parser/t/003_test_semantic.pl @@ -0,0 +1,39 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# Test the incremental JSON parser with semantic routines, and compare the +# output with the expected output. + +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Utils; +use Test::More; +use FindBin; + +use File::Temp qw(tempfile); + +my $test_file = "$FindBin::RealBin/../tiny.json"; +my $test_out = "$FindBin::RealBin/../tiny.out"; + +my $exe = "test_json_parser_incremental"; + +my ($stdout, $stderr) = run_command([ $exe, "-s", $test_file ]); + +is($stderr, "", "no error output"); + +my $dir = PostgreSQL::Test::Utils::tempdir; +my ($fh, $fname) = tempfile(DIR => $dir); + +print $fh $stdout, "\n"; + +close($fh); + +my @diffopts = ("-u"); +push(@diffopts, "--strip-trailing-cr") if $windows_os; +($stdout, $stderr) = run_command([ "diff", @diffopts, $fname, $test_out ]); + +is($stdout, "", "no output diff"); +is($stderr, "", "no diff error"); + +done_testing(); diff --git a/src/test/modules/test_json_parser/t/004_test_parser_perf.pl b/src/test/modules/test_json_parser/t/004_test_parser_perf.pl new file mode 100644 index 0000000000000..81b8c8ae42849 --- /dev/null +++ b/src/test/modules/test_json_parser/t/004_test_parser_perf.pl @@ -0,0 +1,43 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# Test the JSON parser performance tester. Here we are just checking that +# the performance tester can run, both with the standard parser and the +# incremental parser. An actual performance test will run with thousands +# of iterations instead of just one. + +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Utils; +use Test::More; +use FindBin; + +use File::Temp qw(tempfile); + +my $test_file = "$FindBin::RealBin/../tiny.json"; + +my $exe = "test_json_parser_perf"; + +my $contents = slurp_file($test_file); + +my $dir = PostgreSQL::Test::Utils::tempdir; +my ($fh, $fname) = tempfile(DIR => $dir); + +# repeat the input json file 50 times in an array + +print $fh, '[', $contents, ",$contents" x 49, ']'; + +close($fh); + +# but only do one iteration + +my ($result) = run_log([ $exe, "1", $fname ]); + +ok($result == 0, "perf test runs with recursive descent parser"); + +$result = run_log([ $exe, "-i", "1", $fname ]); + +ok($result == 0, "perf test runs with table driven parser"); + +done_testing(); diff --git a/src/test/modules/test_json_parser/test_json_parser_incremental.c b/src/test/modules/test_json_parser/test_json_parser_incremental.c new file mode 100644 index 0000000000000..175e130284468 --- /dev/null +++ b/src/test/modules/test_json_parser/test_json_parser_incremental.c @@ -0,0 +1,349 @@ +/*------------------------------------------------------------------------- + * + * test_json_parser_incremental.c + * Test program for incremental JSON parser + * + * Copyright (c) 2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/test/modules/test_json_parser/test_json_parser_incremental.c + * + * This program tests incremental parsing of json. The input is fed into + * the parser in very small chunks. In practice you would normally use + * much larger chunks, but doing this makes it more likely that the + * full range of increment handling, especially in the lexer, is exercised. + * If the "-c SIZE" option is provided, that chunk size is used instead + * of the default of 60. + * + * If the -s flag is given, the program does semantic processing. This should + * just mirror back the json, albeit with white space changes. + * + * The argument specifies the file containing the JSON input. + * + *------------------------------------------------------------------------- + */ + +#include "postgres_fe.h" + +#include +#include +#include +#include + +#include "common/jsonapi.h" +#include "common/logging.h" +#include "lib/stringinfo.h" +#include "mb/pg_wchar.h" +#include "pg_getopt.h" + +#define BUFSIZE 6000 +#define DEFAULT_CHUNK_SIZE 60 + +typedef struct DoState +{ + JsonLexContext *lex; + bool elem_is_first; + StringInfo buf; +} DoState; + +static void usage(const char *progname); +static void escape_json(StringInfo buf, const char *str); + +/* semantic action functions for parser */ +static JsonParseErrorType do_object_start(void *state); +static JsonParseErrorType do_object_end(void *state); +static JsonParseErrorType do_object_field_start(void *state, char *fname, bool isnull); +static JsonParseErrorType do_object_field_end(void *state, char *fname, bool isnull); +static JsonParseErrorType do_array_start(void *state); +static JsonParseErrorType do_array_end(void *state); +static JsonParseErrorType do_array_element_start(void *state, bool isnull); +static JsonParseErrorType do_array_element_end(void *state, bool isnull); +static JsonParseErrorType do_scalar(void *state, char *token, JsonTokenType tokentype); + +JsonSemAction sem = { + .object_start = do_object_start, + .object_end = do_object_end, + .object_field_start = do_object_field_start, + .object_field_end = do_object_field_end, + .array_start = do_array_start, + .array_end = do_array_end, + .array_element_start = do_array_element_start, + .array_element_end = do_array_element_end, + .scalar = do_scalar +}; + +int +main(int argc, char **argv) +{ + char buff[BUFSIZE]; + FILE *json_file; + JsonParseErrorType result; + JsonLexContext lex; + StringInfoData json; + int n_read; + size_t chunk_size = DEFAULT_CHUNK_SIZE; + struct stat statbuf; + off_t bytes_left; + JsonSemAction *testsem = &nullSemAction; + char *testfile; + int c; + bool need_strings = false; + + pg_logging_init(argv[0]); + + while ((c = getopt(argc, argv, "c:s")) != -1) + { + switch (c) + { + case 'c': /* chunksize */ + chunk_size = strtou64(optarg, NULL, 10); + if (chunk_size > BUFSIZE) + pg_fatal("chunk size cannot exceed %d", BUFSIZE); + break; + case 's': /* do semantic processing */ + testsem = &sem; + sem.semstate = palloc(sizeof(struct DoState)); + ((struct DoState *) sem.semstate)->lex = &lex; + ((struct DoState *) sem.semstate)->buf = makeStringInfo(); + need_strings = true; + break; + } + } + + if (optind < argc) + { + testfile = pg_strdup(argv[optind]); + optind++; + } + else + { + usage(argv[0]); + exit(1); + } + + makeJsonLexContextIncremental(&lex, PG_UTF8, need_strings); + initStringInfo(&json); + + if ((json_file = fopen(testfile, PG_BINARY_R)) == NULL) + pg_fatal("error opening input: %m"); + + if (fstat(fileno(json_file), &statbuf) != 0) + pg_fatal("error statting input: %m"); + + bytes_left = statbuf.st_size; + + for (;;) + { + /* We will break when there's nothing left to read */ + + if (bytes_left < chunk_size) + chunk_size = bytes_left; + + n_read = fread(buff, 1, chunk_size, json_file); + if (n_read < chunk_size) + pg_fatal("error reading input file: %d", ferror(json_file)); + + appendBinaryStringInfo(&json, buff, n_read); + + /* + * Append some trailing junk to the buffer passed to the parser. This + * helps us ensure that the parser does the right thing even if the + * chunk isn't terminated with a '\0'. + */ + appendStringInfoString(&json, "1+23 trailing junk"); + bytes_left -= n_read; + if (bytes_left > 0) + { + result = pg_parse_json_incremental(&lex, testsem, + json.data, n_read, + false); + if (result != JSON_INCOMPLETE) + { + fprintf(stderr, "%s\n", json_errdetail(result, &lex)); + exit(1); + } + resetStringInfo(&json); + } + else + { + result = pg_parse_json_incremental(&lex, testsem, + json.data, n_read, + true); + if (result != JSON_SUCCESS) + { + fprintf(stderr, "%s\n", json_errdetail(result, &lex)); + exit(1); + } + if (!need_strings) + printf("SUCCESS!\n"); + break; + } + } + fclose(json_file); + exit(0); +} + +/* + * The semantic routines here essentially just output the same json, except + * for white space. We could pretty print it but there's no need for our + * purposes. The result should be able to be fed to any JSON processor + * such as jq for validation. + */ + +static JsonParseErrorType +do_object_start(void *state) +{ + DoState *_state = (DoState *) state; + + printf("{\n"); + _state->elem_is_first = true; + + return JSON_SUCCESS; +} + +static JsonParseErrorType +do_object_end(void *state) +{ + DoState *_state = (DoState *) state; + + printf("\n}\n"); + _state->elem_is_first = false; + + return JSON_SUCCESS; +} + +static JsonParseErrorType +do_object_field_start(void *state, char *fname, bool isnull) +{ + DoState *_state = (DoState *) state; + + if (!_state->elem_is_first) + printf(",\n"); + resetStringInfo(_state->buf); + escape_json(_state->buf, fname); + printf("%s: ", _state->buf->data); + _state->elem_is_first = false; + + return JSON_SUCCESS; +} + +static JsonParseErrorType +do_object_field_end(void *state, char *fname, bool isnull) +{ + /* nothing to do really */ + + return JSON_SUCCESS; +} + +static JsonParseErrorType +do_array_start(void *state) +{ + DoState *_state = (DoState *) state; + + printf("[\n"); + _state->elem_is_first = true; + + return JSON_SUCCESS; +} + +static JsonParseErrorType +do_array_end(void *state) +{ + DoState *_state = (DoState *) state; + + printf("\n]\n"); + _state->elem_is_first = false; + + return JSON_SUCCESS; +} + +static JsonParseErrorType +do_array_element_start(void *state, bool isnull) +{ + DoState *_state = (DoState *) state; + + if (!_state->elem_is_first) + printf(",\n"); + _state->elem_is_first = false; + + return JSON_SUCCESS; +} + +static JsonParseErrorType +do_array_element_end(void *state, bool isnull) +{ + /* nothing to do */ + + return JSON_SUCCESS; +} + +static JsonParseErrorType +do_scalar(void *state, char *token, JsonTokenType tokentype) +{ + DoState *_state = (DoState *) state; + + if (tokentype == JSON_TOKEN_STRING) + { + resetStringInfo(_state->buf); + escape_json(_state->buf, token); + printf("%s", _state->buf->data); + } + else + printf("%s", token); + + return JSON_SUCCESS; +} + + +/* copied from backend code */ +static void +escape_json(StringInfo buf, const char *str) +{ + const char *p; + + appendStringInfoCharMacro(buf, '"'); + for (p = str; *p; p++) + { + switch (*p) + { + case '\b': + appendStringInfoString(buf, "\\b"); + break; + case '\f': + appendStringInfoString(buf, "\\f"); + break; + case '\n': + appendStringInfoString(buf, "\\n"); + break; + case '\r': + appendStringInfoString(buf, "\\r"); + break; + case '\t': + appendStringInfoString(buf, "\\t"); + break; + case '"': + appendStringInfoString(buf, "\\\""); + break; + case '\\': + appendStringInfoString(buf, "\\\\"); + break; + default: + if ((unsigned char) *p < ' ') + appendStringInfo(buf, "\\u%04x", (int) *p); + else + appendStringInfoCharMacro(buf, *p); + break; + } + } + appendStringInfoCharMacro(buf, '"'); +} + +static void +usage(const char *progname) +{ + fprintf(stderr, "Usage: %s [OPTION ...] testfile\n", progname); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -c chunksize size of piece fed to parser (default 64)n"); + fprintf(stderr, " -s do semantic processing\n"); + +} diff --git a/src/test/modules/test_json_parser/test_json_parser_perf.c b/src/test/modules/test_json_parser/test_json_parser_perf.c new file mode 100644 index 0000000000000..74cc5f3f54875 --- /dev/null +++ b/src/test/modules/test_json_parser/test_json_parser_perf.c @@ -0,0 +1,88 @@ +/*------------------------------------------------------------------------- + * + * test_json_parser_perf.c + * Performance test program for both flavors of the JSON parser + * + * Copyright (c) 2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/test/modules/test_json_parser/test_json_parser_perf.c + * + * This program tests either the standard (recursive descent) JSON parser + * or the incremental (table driven) parser, but without breaking the input + * into chunks in the latter case. Thus it can be used to compare the pure + * parsing speed of the two parsers. If the "-i" option is used, then the + * table driven parser is used. Otherwise, the recursive descent parser is + * used. + * + * The remaining arguments are the number of parsing iterations to be done + * and the file containing the JSON input. + * + *------------------------------------------------------------------------- + */ + +#include "postgres_fe.h" +#include "common/jsonapi.h" +#include "common/logging.h" +#include "lib/stringinfo.h" +#include "mb/pg_wchar.h" +#include +#include + +#define BUFSIZE 6000 + +int +main(int argc, char **argv) +{ + char buff[BUFSIZE]; + FILE *json_file; + JsonParseErrorType result; + JsonLexContext *lex; + StringInfoData json; + int n_read; + int iter; + int use_inc = 0; + + pg_logging_init(argv[0]); + + initStringInfo(&json); + + if (strcmp(argv[1], "-i") == 0) + { + use_inc = 1; + argv++; + } + + sscanf(argv[1], "%d", &iter); + + if ((json_file = fopen(argv[2], PG_BINARY_R)) == NULL) + pg_fatal("Could not open input file '%s': %m", argv[2]); + + while ((n_read = fread(buff, 1, 6000, json_file)) > 0) + { + appendBinaryStringInfo(&json, buff, n_read); + } + fclose(json_file); + for (int i = 0; i < iter; i++) + { + if (use_inc) + { + lex = makeJsonLexContextIncremental(NULL, PG_UTF8, false); + result = pg_parse_json_incremental(lex, &nullSemAction, + json.data, json.len, + true); + freeJsonLexContext(lex); + } + else + { + lex = makeJsonLexContextCstringLen(NULL, json.data, json.len, + PG_UTF8, false); + result = pg_parse_json(lex, &nullSemAction); + freeJsonLexContext(lex); + } + if (result != JSON_SUCCESS) + pg_fatal("unexpected result %d (expecting %d) on parse", + result, JSON_SUCCESS); + } + exit(0); +} diff --git a/src/test/modules/test_json_parser/tiny.json b/src/test/modules/test_json_parser/tiny.json new file mode 100644 index 0000000000000..361f692236e2a --- /dev/null +++ b/src/test/modules/test_json_parser/tiny.json @@ -0,0 +1,144 @@ +[{ +"teststring": "\u0001\b\f\n\r\t\\blurfl", +"updated": "Tue, 08 Sep 2009 23:28:55 +0000", +"links": [{"href" +: "http://example.com/broadway/", +"type": "text/html", "rel": "alternate"}], "title": "TheaterMania" +, + "author": "mcasas1", + "comments": "http://example.com/url/b5b3cbf9a9176fe43c27d7b4af94a422", + "guidislink": false, + "title_detail": { + "base": "http://example.com/v2/rss/recent?min=1&count=100", + "type": "text/plain", + "language": null, + "value": "TheaterMania" + }, + "link": "http://example.com/broadway/", + "source": {}, + "wfw_commentrss": "http://example.com/v2/rss/url/b5b3cbf9a9176fe43c27d7b4af94a422", + "id": "http://example.com/url/b5b3cbf9a9176fe43c27d7b4af94a422#mcasas1", + "tags": [{"term": "NYC", "scheme": "http://example.com/mcasas1/", "label": null}] + }, + { + "updated": "Fri, 11 Sep 2009 15:07:02 +0000", + "links": [ + { + "href": "http://example.com/", + "type": "text/html", + "rel": "alternate" + } + ], + "title": "Jobs & Employment | Full & Part Time Job Search | Example.com", + "author": "Irvinn", + "comments": "http://example.com/url/90c6b38a375cf62280f9ebc89823f570", + "guidislink": false, + "title_detail": { + "base": "http://example.com/v2/rss/recent?min=1&count=100", + "type": "text/plain", + "language": null, + "value": "Jobs & Employment | Full & Part Time Job Search | Example.com" + }, + "link": "http://example.com/", + "source": {}, + "wfw_commentrss": "http://example.com/v2/rss/url/90c6b38a375cf62280f9ebc89823f570", + "id": "http://example.com/url/90c6b38a375cf62280f9ebc89823f570#Irvinn", + "tags": [{"term": "Jobs", "scheme": "http://example.com/Irvinn/", "label": null}] + }, + { + "updated": "Thu, 10 Sep 2009 08:27:38 +0000", + "links": [ + { + "href": "http://example.com/2009/09/ikea-haar-slimme-toepassing-van-mbti-principes/", + "type": "text/html", + "rel": "alternate" + } + ], + "title": "Usabilityweb \u00bb Blog Archive \u00bb IKEA haar slimme toepassing van MBTI principes", + "author": "NicoDruif", + "comments": "http://example.com/url/5b3bc7d41a07f732dae9f3bac8859c50", + "guidislink": false, + "title_detail": { + "base": "http://example.com/v2/rss/recent?min=1&count=100", + "type": "text/plain", + "language": null, + "value": "Usabilityweb \u00bb Blog Archive \u00bb IKEA haar slimme toepassing van MBTI principes" + }, + "link": "http://example.com/2009/09/ikea-haar-slimme-toepassing-van-mbti-principes/", + "source": {}, + "wfw_commentrss": "http://example.com/v2/rss/url/5b3bc7d41a07f732dae9f3bac8859c50", + "id": "http://example.com/url/5b3bc7d41a07f732dae9f3bac8859c50#NicoDruif", + "tags": [ + {"term": "design", "scheme": "http://example.com/NicoDruif/", "label": null}, + {"term": "usability", "scheme": "http://example.com/NicoDruif/", "label": null}, + {"term": "inspiration", "scheme": "http://example.com/NicoDruif/", "label": null}, + {"term": "interactiondesign", "scheme": "http://example.com/NicoDruif/", "label": null} + ] + }, + { + "updated": "Sun, 13 Sep 2009 08:11:20 +0000", + "links": [ + { + "href": "http://example.com/wiki/index.php/Main_Page", + "type": "text/html", + "rel": "alternate" + } + ], + "title": "CEGUIWiki", + "author": "renato.cron", + "comments": "http://example.com/url/fa4eb9b9833c073a50c1a9db4bebc007", + "guidislink": false, + "title_detail": { + "base": "http://example.com/v2/rss/recent?min=1&count=100", + "type": "text/plain", + "language": null, + "value": "CEGUIWiki" + }, + "link": "http://example.com/wiki/index.php/Main_Page", + "source": {}, + "wfw_commentrss": "http://example.com/v2/rss/url/fa4eb9b9833c073a50c1a9db4bebc007", + "id": "http://example.com/url/fa4eb9b9833c073a50c1a9db4bebc007#renato.cron", + "tags": [ + {"term": "gui", "scheme": "http://example.com/renato.cron/", "label": null}, + {"term": "programming", "scheme": "http://example.com/renato.cron/", "label": null}, + {"term": "opensource", "scheme": "http://example.com/renato.cron/", "label": null}, + {"term": "c++", "scheme": "http://example.com/renato.cron/", "label": null}, + {"term": "gamedev", "scheme": "http://example.com/renato.cron/", "label": null}, + {"term": "library", "scheme": "http://example.com/renato.cron/", "label": null}, + {"term": "3d", "scheme": "http://example.com/renato.cron/", "label": null}, + {"term": "graphics", "scheme": "http://example.com/renato.cron/", "label": null}, + {"term": "openGl", "scheme": "http://example.com/renato.cron/", "label": null}, + {"term": "games", "scheme": "http://example.com/renato.cron/", "label": null} + ] + }, + { + "updated": "Tue, 08 Sep 2009 08:45:00 +0000", + "links": [ + { + "href": "http://example.com/", + "type": "text/html", + "rel": "alternate" + } + ], + "title": "Home - Manchester City FC", + "author": "cainarachi", + "comments": "http://example.com/url/b7cdad040b7e1d0aec0c93b1b8c4bb41", + "guidislink": false, + "title_detail": { + "base": "http://example.com/v2/rss/recent?min=1&count=100", + "type": "text/plain", + "language": null, + "value": "Home - Manchester City FC" + }, + "link": "http://example.com/", + "source": {}, + "wfw_commentrss": "http://example.com/v2/rss/url/b7cdad040b7e1d0aec0c93b1b8c4bb41", + "id": "http://example.com/url/b7cdad040b7e1d0aec0c93b1b8c4bb41#cainarachi", + "tags": [ + {"term": "bonssites", "scheme": "http://example.com/cainarachi/", "label": null}, + {"term": "html", "scheme": "http://example.com/cainarachi/", "label": null}, + {"term": "webdesign", "scheme": "http://example.com/cainarachi/", "label": null}, + {"term": "css", "scheme": "http://example.com/cainarachi/", "label": null} + ] + } +] diff --git a/src/test/modules/test_json_parser/tiny.out b/src/test/modules/test_json_parser/tiny.out new file mode 100644 index 0000000000000..4608ec44cd5f6 --- /dev/null +++ b/src/test/modules/test_json_parser/tiny.out @@ -0,0 +1,293 @@ +[ +{ +"teststring": "\u0001\b\f\n\r\t\\blurfl", +"updated": "Tue, 08 Sep 2009 23:28:55 +0000", +"links": [ +{ +"href": "http://example.com/broadway/", +"type": "text/html", +"rel": "alternate" +} + +] +, +"title": "TheaterMania", +"author": "mcasas1", +"comments": "http://example.com/url/b5b3cbf9a9176fe43c27d7b4af94a422", +"guidislink": false, +"title_detail": { +"base": "http://example.com/v2/rss/recent?min=1&count=100", +"type": "text/plain", +"language": null, +"value": "TheaterMania" +} +, +"link": "http://example.com/broadway/", +"source": { + +} +, +"wfw_commentrss": "http://example.com/v2/rss/url/b5b3cbf9a9176fe43c27d7b4af94a422", +"id": "http://example.com/url/b5b3cbf9a9176fe43c27d7b4af94a422#mcasas1", +"tags": [ +{ +"term": "NYC", +"scheme": "http://example.com/mcasas1/", +"label": null +} + +] + +} +, +{ +"updated": "Fri, 11 Sep 2009 15:07:02 +0000", +"links": [ +{ +"href": "http://example.com/", +"type": "text/html", +"rel": "alternate" +} + +] +, +"title": "Jobs & Employment | Full & Part Time Job Search | Example.com", +"author": "Irvinn", +"comments": "http://example.com/url/90c6b38a375cf62280f9ebc89823f570", +"guidislink": false, +"title_detail": { +"base": "http://example.com/v2/rss/recent?min=1&count=100", +"type": "text/plain", +"language": null, +"value": "Jobs & Employment | Full & Part Time Job Search | Example.com" +} +, +"link": "http://example.com/", +"source": { + +} +, +"wfw_commentrss": "http://example.com/v2/rss/url/90c6b38a375cf62280f9ebc89823f570", +"id": "http://example.com/url/90c6b38a375cf62280f9ebc89823f570#Irvinn", +"tags": [ +{ +"term": "Jobs", +"scheme": "http://example.com/Irvinn/", +"label": null +} + +] + +} +, +{ +"updated": "Thu, 10 Sep 2009 08:27:38 +0000", +"links": [ +{ +"href": "http://example.com/2009/09/ikea-haar-slimme-toepassing-van-mbti-principes/", +"type": "text/html", +"rel": "alternate" +} + +] +, +"title": "Usabilityweb » Blog Archive » IKEA haar slimme toepassing van MBTI principes", +"author": "NicoDruif", +"comments": "http://example.com/url/5b3bc7d41a07f732dae9f3bac8859c50", +"guidislink": false, +"title_detail": { +"base": "http://example.com/v2/rss/recent?min=1&count=100", +"type": "text/plain", +"language": null, +"value": "Usabilityweb » Blog Archive » IKEA haar slimme toepassing van MBTI principes" +} +, +"link": "http://example.com/2009/09/ikea-haar-slimme-toepassing-van-mbti-principes/", +"source": { + +} +, +"wfw_commentrss": "http://example.com/v2/rss/url/5b3bc7d41a07f732dae9f3bac8859c50", +"id": "http://example.com/url/5b3bc7d41a07f732dae9f3bac8859c50#NicoDruif", +"tags": [ +{ +"term": "design", +"scheme": "http://example.com/NicoDruif/", +"label": null +} +, +{ +"term": "usability", +"scheme": "http://example.com/NicoDruif/", +"label": null +} +, +{ +"term": "inspiration", +"scheme": "http://example.com/NicoDruif/", +"label": null +} +, +{ +"term": "interactiondesign", +"scheme": "http://example.com/NicoDruif/", +"label": null +} + +] + +} +, +{ +"updated": "Sun, 13 Sep 2009 08:11:20 +0000", +"links": [ +{ +"href": "http://example.com/wiki/index.php/Main_Page", +"type": "text/html", +"rel": "alternate" +} + +] +, +"title": "CEGUIWiki", +"author": "renato.cron", +"comments": "http://example.com/url/fa4eb9b9833c073a50c1a9db4bebc007", +"guidislink": false, +"title_detail": { +"base": "http://example.com/v2/rss/recent?min=1&count=100", +"type": "text/plain", +"language": null, +"value": "CEGUIWiki" +} +, +"link": "http://example.com/wiki/index.php/Main_Page", +"source": { + +} +, +"wfw_commentrss": "http://example.com/v2/rss/url/fa4eb9b9833c073a50c1a9db4bebc007", +"id": "http://example.com/url/fa4eb9b9833c073a50c1a9db4bebc007#renato.cron", +"tags": [ +{ +"term": "gui", +"scheme": "http://example.com/renato.cron/", +"label": null +} +, +{ +"term": "programming", +"scheme": "http://example.com/renato.cron/", +"label": null +} +, +{ +"term": "opensource", +"scheme": "http://example.com/renato.cron/", +"label": null +} +, +{ +"term": "c++", +"scheme": "http://example.com/renato.cron/", +"label": null +} +, +{ +"term": "gamedev", +"scheme": "http://example.com/renato.cron/", +"label": null +} +, +{ +"term": "library", +"scheme": "http://example.com/renato.cron/", +"label": null +} +, +{ +"term": "3d", +"scheme": "http://example.com/renato.cron/", +"label": null +} +, +{ +"term": "graphics", +"scheme": "http://example.com/renato.cron/", +"label": null +} +, +{ +"term": "openGl", +"scheme": "http://example.com/renato.cron/", +"label": null +} +, +{ +"term": "games", +"scheme": "http://example.com/renato.cron/", +"label": null +} + +] + +} +, +{ +"updated": "Tue, 08 Sep 2009 08:45:00 +0000", +"links": [ +{ +"href": "http://example.com/", +"type": "text/html", +"rel": "alternate" +} + +] +, +"title": "Home - Manchester City FC", +"author": "cainarachi", +"comments": "http://example.com/url/b7cdad040b7e1d0aec0c93b1b8c4bb41", +"guidislink": false, +"title_detail": { +"base": "http://example.com/v2/rss/recent?min=1&count=100", +"type": "text/plain", +"language": null, +"value": "Home - Manchester City FC" +} +, +"link": "http://example.com/", +"source": { + +} +, +"wfw_commentrss": "http://example.com/v2/rss/url/b7cdad040b7e1d0aec0c93b1b8c4bb41", +"id": "http://example.com/url/b7cdad040b7e1d0aec0c93b1b8c4bb41#cainarachi", +"tags": [ +{ +"term": "bonssites", +"scheme": "http://example.com/cainarachi/", +"label": null +} +, +{ +"term": "html", +"scheme": "http://example.com/cainarachi/", +"label": null +} +, +{ +"term": "webdesign", +"scheme": "http://example.com/cainarachi/", +"label": null +} +, +{ +"term": "css", +"scheme": "http://example.com/cainarachi/", +"label": null +} + +] + +} + +] diff --git a/src/test/modules/test_lfind/meson.build b/src/test/modules/test_lfind/meson.build index 646ab4ab002bb..fe6bc9ecb7fa1 100644 --- a/src/test/modules/test_lfind/meson.build +++ b/src/test/modules/test_lfind/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_lfind_sources = files( 'test_lfind.c', diff --git a/src/test/modules/test_lfind/test_lfind.c b/src/test/modules/test_lfind/test_lfind.c index e2e8b7389f210..c04bc2f6b420e 100644 --- a/src/test/modules/test_lfind/test_lfind.c +++ b/src/test/modules/test_lfind/test_lfind.c @@ -3,7 +3,7 @@ * test_lfind.c * Test correctness of optimized linear search functions. * - * Copyright (c) 2022-2023, PostgreSQL Global Development Group + * Copyright (c) 2022-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_lfind/test_lfind.c diff --git a/src/test/modules/test_misc/Makefile b/src/test/modules/test_misc/Makefile index 39c6c2014a02a..919a25fc67fd3 100644 --- a/src/test/modules/test_misc/Makefile +++ b/src/test/modules/test_misc/Makefile @@ -2,6 +2,10 @@ TAP_TESTS = 1 +EXTRA_INSTALL=src/test/modules/injection_points + +export enable_injection_points + ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) diff --git a/src/test/modules/test_misc/meson.build b/src/test/modules/test_misc/meson.build index 911084ac0fe93..5911ad976bb49 100644 --- a/src/test/modules/test_misc/meson.build +++ b/src/test/modules/test_misc/meson.build @@ -1,15 +1,20 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tests += { 'name': 'test_misc', 'sd': meson.current_source_dir(), 'bd': meson.current_build_dir(), 'tap': { + 'env': { + 'enable_injection_points': get_option('injection_points') ? 'yes' : 'no', + }, 'tests': [ 't/001_constraint_validation.pl', 't/002_tablespace.pl', 't/003_check_guc.pl', 't/004_io_direct.pl', + 't/005_timeouts.pl', + 't/007_catcache_inval.pl', ], }, } diff --git a/src/test/modules/test_misc/t/001_constraint_validation.pl b/src/test/modules/test_misc/t/001_constraint_validation.pl index 5a07a5d36df3a..9e5ff3a5f5695 100644 --- a/src/test/modules/test_misc/t/001_constraint_validation.pl +++ b/src/test/modules/test_misc/t/001_constraint_validation.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Verify that ALTER TABLE optimizes certain operations as expected use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/modules/test_misc/t/002_tablespace.pl b/src/test/modules/test_misc/t/002_tablespace.pl index f774a021a8ad1..3f258fd69a2b5 100644 --- a/src/test/modules/test_misc/t/002_tablespace.pl +++ b/src/test/modules/test_misc/t/002_tablespace.pl @@ -1,9 +1,12 @@ + +# Copyright (c) 2024, PostgreSQL Global Development Group + # Simple tablespace tests that can't be replicated on the same host # due to the use of absolute paths, so we keep them out of the regular # regression tests. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; 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 4fd6d03b9e678..3ae4bb1cd9ddd 100644 --- a/src/test/modules/test_misc/t/003_check_guc.pl +++ b/src/test/modules/test_misc/t/003_check_guc.pl @@ -1,8 +1,11 @@ + +# Copyright (c) 2024, PostgreSQL Global Development Group + # Tests to cross-check the consistency of GUC parameters with # postgresql.conf.sample. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -14,12 +17,13 @@ # Grab the names of all the parameters that can be listed in the # configuration sample file. config_file is an exception, it is not # in postgresql.conf.sample but is part of the lists from guc_tables.c. +# Custom GUCs loaded by extensions are excluded. my $all_params = $node->safe_psql( 'postgres', "SELECT name FROM pg_settings WHERE NOT 'NOT_IN_SAMPLE' = ANY (pg_settings_get_flags(name)) AND - name <> 'config_file' + name <> 'config_file' AND category <> 'Customized Options' ORDER BY 1"); # Note the lower-case conversion, for consistency. my @all_params_array = split("\n", lc($all_params)); diff --git a/src/test/modules/test_misc/t/004_io_direct.pl b/src/test/modules/test_misc/t/004_io_direct.pl index dddcfb1aa9659..b79ceba000c02 100644 --- a/src/test/modules/test_misc/t/004_io_direct.pl +++ b/src/test/modules/test_misc/t/004_io_direct.pl @@ -1,7 +1,10 @@ + +# Copyright (c) 2024, PostgreSQL Global Development Group + # Very simple exercise of direct I/O GUC. use strict; -use warnings; +use warnings FATAL => 'all'; use Fcntl; use IO::File; use PostgreSQL::Test::Cluster; diff --git a/src/test/modules/test_misc/t/005_timeouts.pl b/src/test/modules/test_misc/t/005_timeouts.pl new file mode 100644 index 0000000000000..53e44016e3ae8 --- /dev/null +++ b/src/test/modules/test_misc/t/005_timeouts.pl @@ -0,0 +1,145 @@ + +# Copyright (c) 2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use locale; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Time::HiRes qw(usleep); +use Test::More; + +# Test timeouts that will cause FATAL errors. This test relies on injection +# points to await a timeout occurrence. Relying on sleep proved to be unstable +# on buildfarm. It's difficult to rely on the NOTICE injection point because +# the backend under FATAL error can behave differently. + +if ($ENV{enable_injection_points} ne 'yes') +{ + plan skip_all => 'Injection points not supported by this build'; +} + +# Node initialization +my $node = PostgreSQL::Test::Cluster->new('master'); +$node->init(); +$node->start; + +# Check if the extension injection_points is available, as it may be +# possible that this script is run with installcheck, where the module +# would not be installed by default. +my $result = $node->safe_psql('postgres', + "SELECT count(*) > 0 FROM pg_available_extensions WHERE name = 'injection_points';" +); +if ($result eq 'f') +{ + plan skip_all => 'Extension injection_points not installed'; +} + +$node->safe_psql('postgres', 'CREATE EXTENSION injection_points;'); + +# +# 1. Test of the transaction timeout +# + +$node->safe_psql('postgres', + "SELECT injection_points_attach('transaction-timeout', 'wait');"); + +my $psql_session = $node->background_psql('postgres'); + +# The following query will generate a stream of SELECT 1 queries. This is done +# so to exercise transaction timeout in the presence of short queries. +# Note: the interval value is parsed with locale-aware strtod() +$psql_session->query_until( + qr/starting_bg_psql/, + sprintf( + q(\echo starting_bg_psql + SET transaction_timeout to '10ms'; + BEGIN; + SELECT 1 \watch %g + \q +), 0.001)); + +# Wait until the backend enters the timeout injection point. Will get an error +# here if anything goes wrong. +$node->wait_for_event('client backend', 'transaction-timeout'); + +my $log_offset = -s $node->logfile; + +# Remove the injection point. +$node->safe_psql('postgres', + "SELECT injection_points_wakeup('transaction-timeout');"); + +# Check that the timeout was logged. +$node->wait_for_log('terminating connection due to transaction timeout', + $log_offset); + +# If we send \q with $psql_session->quit the command can be sent to the session +# already closed. So \q is in initial script, here we only finish IPC::Run. +$psql_session->{run}->finish; + + +# +# 2. Test of the idle in transaction timeout +# + +$node->safe_psql('postgres', + "SELECT injection_points_attach('idle-in-transaction-session-timeout', 'wait');" +); + +# We begin a transaction and the hand on the line +$psql_session = $node->background_psql('postgres'); +$psql_session->query_until( + qr/starting_bg_psql/, q( + \echo starting_bg_psql + SET idle_in_transaction_session_timeout to '10ms'; + BEGIN; +)); + +# Wait until the backend enters the timeout injection point. +$node->wait_for_event('client backend', + 'idle-in-transaction-session-timeout'); + +$log_offset = -s $node->logfile; + +# Remove the injection point. +$node->safe_psql('postgres', + "SELECT injection_points_wakeup('idle-in-transaction-session-timeout');"); + +# Check that the timeout was logged. +$node->wait_for_log( + 'terminating connection due to idle-in-transaction timeout', $log_offset); + +ok($psql_session->quit); + + +# +# 3. Test of the idle session timeout +# +$node->safe_psql('postgres', + "SELECT injection_points_attach('idle-session-timeout', 'wait');"); + +# We just initialize the GUC and wait. No transaction is required. +$psql_session = $node->background_psql('postgres'); +$psql_session->query_until( + qr/starting_bg_psql/, q( + \echo starting_bg_psql + SET idle_session_timeout to '10ms'; +)); + +# Wait until the backend enters the timeout injection point. +$node->wait_for_event('client backend', 'idle-session-timeout'); + +$log_offset = -s $node->logfile; + +# Remove the injection point. +$node->safe_psql('postgres', + "SELECT injection_points_wakeup('idle-session-timeout');"); + +# Check that the timeout was logged. +$node->wait_for_log('terminating connection due to idle-session timeout', + $log_offset); + +ok($psql_session->quit); + +done_testing(); diff --git a/src/test/modules/test_misc/t/007_catcache_inval.pl b/src/test/modules/test_misc/t/007_catcache_inval.pl new file mode 100644 index 0000000000000..4b0ad239ca8fc --- /dev/null +++ b/src/test/modules/test_misc/t/007_catcache_inval.pl @@ -0,0 +1,101 @@ + +# Copyright (c) 2025, PostgreSQL Global Development Group + +# Test recursive catalog cache invalidation, i.e. invalidation while a +# catalog cache entry is being built. + +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +if ($ENV{enable_injection_points} ne 'yes') +{ + plan skip_all => 'Injection points not supported by this build'; +} + +# Node initialization +my $node = PostgreSQL::Test::Cluster->new('node'); +$node->init(); +$node->start; + +# Check if the extension injection_points is available, as it may be +# possible that this script is run with installcheck, where the module +# would not be installed by default. +my $result = $node->safe_psql('postgres', + "SELECT count(*) > 0 FROM pg_available_extensions WHERE name = 'injection_points';" +); +if ($result eq 'f') +{ + plan skip_all => 'Extension injection_points not installed'; +} + +$node->safe_psql('postgres', 'CREATE EXTENSION injection_points;'); + + +sub randStr +{ + my $len = shift; + my @chars = ("A" .. "Z", "a" .. "z", "0" .. "9"); + return join '', map { @chars[ rand @chars ] } 1 .. $len; +} + +# Create a function with a large body, so that it is toasted. +my $longtext = randStr(10000); +$node->safe_psql( + 'postgres', qq[ + CREATE FUNCTION foofunc(dummy integer) RETURNS integer AS \$\$ SELECT 1; /* $longtext */ \$\$ LANGUAGE SQL +]); + +my $psql_session = $node->background_psql('postgres'); +my $psql_session2 = $node->background_psql('postgres'); + +# Set injection point in the session, to pause while populating the +# catcache list +$psql_session->query_safe( + qq[ + SELECT injection_points_set_local(); + SELECT injection_points_attach('catcache-list-miss-systable-scan-started', 'wait'); +]); + +# This pauses on the injection point while populating catcache list +# for functions with name "foofunc" +$psql_session->query_until( + qr/starting_bg_psql/, q( + \echo starting_bg_psql + SELECT foofunc(1); +)); + +# While the first session is building the catcache list, create a new +# function that overloads the same name. This sends a catcache +# invalidation. +$node->safe_psql( + 'postgres', qq[ + CREATE FUNCTION foofunc() RETURNS integer AS \$\$ SELECT 123 \$\$ LANGUAGE SQL +]); + +# Continue the paused session. It will continue to construct the +# catcache list, and will accept invalidations while doing that. +# +# (The fact that the first function has a large body is crucial, +# because the cache invalidation is accepted during detoasting. If +# the body is not toasted, the invalidation is processed after +# building the catcache list, which avoids the recursion that we are +# trying to exercise here.) +# +# The "SELECT foofunc(1)" query will now finish. +$psql_session2->query_safe( + qq[ + SELECT injection_points_wakeup('catcache-list-miss-systable-scan-started'); + SELECT injection_points_detach('catcache-list-miss-systable-scan-started'); +]); + +# Test that the new function is visible to the session. +$psql_session->query_safe("SELECT foofunc();"); + +ok($psql_session->quit); +ok($psql_session2->quit); + +done_testing(); diff --git a/src/test/modules/test_oat_hooks/Makefile b/src/test/modules/test_oat_hooks/Makefile index 2b5d2687f8d2c..dcaf3a7727960 100644 --- a/src/test/modules/test_oat_hooks/Makefile +++ b/src/test/modules/test_oat_hooks/Makefile @@ -6,7 +6,7 @@ OBJS = \ test_oat_hooks.o PGFILEDESC = "test_oat_hooks - example use of object access hooks" -REGRESS = test_oat_hooks +REGRESS = test_oat_hooks alter_table # disable installcheck for now NO_INSTALLCHECK = 1 diff --git a/src/test/modules/test_oat_hooks/expected/alter_table.out b/src/test/modules/test_oat_hooks/expected/alter_table.out new file mode 100644 index 0000000000000..8cbacca2c9bde --- /dev/null +++ b/src/test/modules/test_oat_hooks/expected/alter_table.out @@ -0,0 +1,165 @@ +-- +-- OAT checks for ALTER TABLE +-- +-- This test script fails if debug_discard_caches is enabled, because cache +-- flushes cause extra calls of the OAT hook in recomputeNamespacePath, +-- resulting in more NOTICE messages than are in the expected output. +SET debug_discard_caches = 0; +LOAD 'test_oat_hooks'; +SET test_oat_hooks.audit = true; +NOTICE: in object_access_hook_str: superuser attempting alter (subId=0x1000, set) [test_oat_hooks.audit] +NOTICE: in object_access_hook_str: superuser finished alter (subId=0x1000, set) [test_oat_hooks.audit] +NOTICE: in process utility: superuser finished SET +CREATE SCHEMA test_oat_schema; +NOTICE: in process utility: superuser attempting CREATE SCHEMA +NOTICE: in object access: superuser attempting create (subId=0x0) [explicit] +NOTICE: in object access: superuser finished create (subId=0x0) [explicit] +NOTICE: in process utility: superuser finished CREATE SCHEMA +CREATE TABLE test_oat_schema.test_oat_tab (c1 int, c2 text); +NOTICE: in process utility: superuser attempting CREATE TABLE +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +LINE 1: CREATE TABLE test_oat_schema.test_oat_tab (c1 int, c2 text); + ^ +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +LINE 1: CREATE TABLE test_oat_schema.test_oat_tab (c1 int, c2 text); + ^ +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [no report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [no report on violation, allowed] +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting create (subId=0x0) [explicit] +NOTICE: in object access: superuser finished create (subId=0x0) [explicit] +NOTICE: in object access: superuser attempting create (subId=0x0) [explicit] +NOTICE: in object access: superuser finished create (subId=0x0) [explicit] +NOTICE: in object access: superuser attempting create (subId=0x0) [explicit] +NOTICE: in object access: superuser finished create (subId=0x0) [explicit] +NOTICE: in object access: superuser attempting create (subId=0x0) [internal] +NOTICE: in object access: superuser finished create (subId=0x0) [internal] +NOTICE: in object access: superuser attempting create (subId=0x0) [internal] +NOTICE: in object access: superuser finished create (subId=0x0) [internal] +NOTICE: in process utility: superuser finished CREATE TABLE +CREATE RULE test_oat_notify AS + ON UPDATE TO test_oat_schema.test_oat_tab + DO ALSO NOTIFY test_oat_tab; +NOTICE: in process utility: superuser attempting CREATE RULE +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting create (subId=0x0) [explicit] +NOTICE: in object access: superuser finished create (subId=0x0) [explicit] +NOTICE: in process utility: superuser finished CREATE RULE +CREATE FUNCTION test_oat_schema.test_trigger() +RETURNS trigger +LANGUAGE plpgsql +AS $$ +BEGIN + IF TG_OP = 'DELETE' + THEN + RETURN OLD; + ELSE + RETURN NEW; + END IF; +END; $$; +NOTICE: in process utility: superuser attempting CREATE FUNCTION +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [no report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [no report on violation, allowed] +NOTICE: in object access: superuser attempting create (subId=0x0) [explicit] +NOTICE: in object access: superuser finished create (subId=0x0) [explicit] +NOTICE: in process utility: superuser finished CREATE FUNCTION +CREATE TRIGGER test_oat_trigger BEFORE INSERT ON test_oat_schema.test_oat_tab + FOR EACH STATEMENT EXECUTE FUNCTION test_oat_schema.test_trigger(); +NOTICE: in process utility: superuser attempting CREATE TRIGGER +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting create (subId=0x0) [explicit] +NOTICE: in object access: superuser finished create (subId=0x0) [explicit] +NOTICE: in process utility: superuser finished CREATE TRIGGER +-- RLS +ALTER TABLE test_oat_schema.test_oat_tab ENABLE ROW LEVEL SECURITY; +NOTICE: in process utility: superuser attempting ALTER TABLE +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser finished alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in process utility: superuser finished ALTER TABLE +ALTER TABLE test_oat_schema.test_oat_tab DISABLE ROW LEVEL SECURITY; +NOTICE: in process utility: superuser attempting ALTER TABLE +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser finished alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in process utility: superuser finished ALTER TABLE +ALTER TABLE test_oat_schema.test_oat_tab FORCE ROW LEVEL SECURITY; +NOTICE: in process utility: superuser attempting ALTER TABLE +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser finished alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in process utility: superuser finished ALTER TABLE +ALTER TABLE test_oat_schema.test_oat_tab NO FORCE ROW LEVEL SECURITY; +NOTICE: in process utility: superuser attempting ALTER TABLE +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser finished alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in process utility: superuser finished ALTER TABLE +-- Rules +ALTER TABLE test_oat_schema.test_oat_tab DISABLE RULE test_oat_notify; +NOTICE: in process utility: superuser attempting ALTER TABLE +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser finished alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser attempting alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser finished alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in process utility: superuser finished ALTER TABLE +ALTER TABLE test_oat_schema.test_oat_tab ENABLE RULE test_oat_notify; +NOTICE: in process utility: superuser attempting ALTER TABLE +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser finished alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser attempting alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser finished alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in process utility: superuser finished ALTER TABLE +-- Triggers +ALTER TABLE test_oat_schema.test_oat_tab DISABLE TRIGGER test_oat_trigger; +NOTICE: in process utility: superuser attempting ALTER TABLE +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser finished alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser attempting alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser finished alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in process utility: superuser finished ALTER TABLE +ALTER TABLE test_oat_schema.test_oat_tab ENABLE TRIGGER test_oat_trigger; +NOTICE: in process utility: superuser attempting ALTER TABLE +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser finished alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser attempting alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in object access: superuser finished alter (subId=0x0) [explicit without auxiliary object] +NOTICE: in process utility: superuser finished ALTER TABLE +DROP TABLE test_oat_schema.test_oat_tab; +NOTICE: in process utility: superuser attempting DROP TABLE +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [report on violation, allowed] +NOTICE: in object access: superuser attempting drop (subId=0x0) [] +NOTICE: in object access: superuser finished drop (subId=0x0) [] +NOTICE: in object access: superuser attempting drop (subId=0x0) [] +NOTICE: in object access: superuser finished drop (subId=0x0) [] +NOTICE: in object access: superuser attempting drop (subId=0x0) [] +NOTICE: in object access: superuser finished drop (subId=0x0) [] +NOTICE: in object access: superuser attempting drop (subId=0x0) [] +NOTICE: in object access: superuser finished drop (subId=0x0) [] +NOTICE: in object access: superuser attempting drop (subId=0x0) [] +NOTICE: in object access: superuser finished drop (subId=0x0) [] +NOTICE: in object access: superuser attempting drop (subId=0x0) [] +NOTICE: in object access: superuser finished drop (subId=0x0) [] +NOTICE: in object access: superuser attempting drop (subId=0x0) [] +NOTICE: in object access: superuser finished drop (subId=0x0) [] +NOTICE: in process utility: superuser finished DROP TABLE diff --git a/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out b/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out index f80373aecc033..effdc4914583a 100644 --- a/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out +++ b/src/test/modules/test_oat_hooks/expected/test_oat_hooks.out @@ -89,11 +89,15 @@ NOTICE: in object access: superuser finished create (subId=0x0) [internal] NOTICE: in process utility: superuser finished CREATE TABLE CREATE INDEX regress_test_table_t_idx ON regress_test_table (t); NOTICE: in process utility: superuser attempting CREATE INDEX +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [no report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [no report on violation, allowed] NOTICE: in object access: superuser attempting create (subId=0x0) [explicit] NOTICE: in object access: superuser finished create (subId=0x0) [explicit] NOTICE: in process utility: superuser finished CREATE INDEX GRANT SELECT ON Table regress_test_table TO public; NOTICE: in process utility: superuser attempting GRANT +NOTICE: in object access: superuser attempting namespace search (subId=0x0) [no report on violation, allowed] +NOTICE: in object access: superuser finished namespace search (subId=0x0) [no report on violation, allowed] NOTICE: in process utility: superuser finished GRANT CREATE FUNCTION regress_test_func (t text) RETURNS text AS $$ SELECT $1; diff --git a/src/test/modules/test_oat_hooks/meson.build b/src/test/modules/test_oat_hooks/meson.build index 9c69a1eaf9ee6..02c9c790ecd9c 100644 --- a/src/test/modules/test_oat_hooks/meson.build +++ b/src/test/modules/test_oat_hooks/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_oat_hooks_sources = files( 'test_oat_hooks.c', @@ -23,6 +23,7 @@ tests += { 'regress': { 'sql': [ 'test_oat_hooks', + 'alter_table', ], 'regress_args': ['--no-locale', '--encoding=UTF8'], 'runningcheck': false, diff --git a/src/test/modules/test_oat_hooks/sql/alter_table.sql b/src/test/modules/test_oat_hooks/sql/alter_table.sql new file mode 100644 index 0000000000000..3d308a47c1127 --- /dev/null +++ b/src/test/modules/test_oat_hooks/sql/alter_table.sql @@ -0,0 +1,48 @@ +-- +-- OAT checks for ALTER TABLE +-- + +-- This test script fails if debug_discard_caches is enabled, because cache +-- flushes cause extra calls of the OAT hook in recomputeNamespacePath, +-- resulting in more NOTICE messages than are in the expected output. +SET debug_discard_caches = 0; + +LOAD 'test_oat_hooks'; +SET test_oat_hooks.audit = true; + +CREATE SCHEMA test_oat_schema; +CREATE TABLE test_oat_schema.test_oat_tab (c1 int, c2 text); +CREATE RULE test_oat_notify AS + ON UPDATE TO test_oat_schema.test_oat_tab + DO ALSO NOTIFY test_oat_tab; + +CREATE FUNCTION test_oat_schema.test_trigger() +RETURNS trigger +LANGUAGE plpgsql +AS $$ +BEGIN + IF TG_OP = 'DELETE' + THEN + RETURN OLD; + ELSE + RETURN NEW; + END IF; +END; $$; +CREATE TRIGGER test_oat_trigger BEFORE INSERT ON test_oat_schema.test_oat_tab + FOR EACH STATEMENT EXECUTE FUNCTION test_oat_schema.test_trigger(); + +-- RLS +ALTER TABLE test_oat_schema.test_oat_tab ENABLE ROW LEVEL SECURITY; +ALTER TABLE test_oat_schema.test_oat_tab DISABLE ROW LEVEL SECURITY; +ALTER TABLE test_oat_schema.test_oat_tab FORCE ROW LEVEL SECURITY; +ALTER TABLE test_oat_schema.test_oat_tab NO FORCE ROW LEVEL SECURITY; + +-- Rules +ALTER TABLE test_oat_schema.test_oat_tab DISABLE RULE test_oat_notify; +ALTER TABLE test_oat_schema.test_oat_tab ENABLE RULE test_oat_notify; + +-- Triggers +ALTER TABLE test_oat_schema.test_oat_tab DISABLE TRIGGER test_oat_trigger; +ALTER TABLE test_oat_schema.test_oat_tab ENABLE TRIGGER test_oat_trigger; + +DROP TABLE test_oat_schema.test_oat_tab; diff --git a/src/test/modules/test_oat_hooks/test_oat_hooks.c b/src/test/modules/test_oat_hooks/test_oat_hooks.c index b03f90bd55f74..05c33712254c7 100644 --- a/src/test/modules/test_oat_hooks/test_oat_hooks.c +++ b/src/test/modules/test_oat_hooks/test_oat_hooks.c @@ -3,7 +3,7 @@ * test_oat_hooks.c * Code for testing mandatory access control (MAC) using object access hooks. * - * Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Copyright (c) 2015-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_oat_hooks/test_oat_hooks.c diff --git a/src/test/modules/test_parser/meson.build b/src/test/modules/test_parser/meson.build index 0dcbd788c1cde..d66c23334f8af 100644 --- a/src/test/modules/test_parser/meson.build +++ b/src/test/modules/test_parser/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_parser_sources = files( 'test_parser.c', diff --git a/src/test/modules/test_parser/test_parser.c b/src/test/modules/test_parser/test_parser.c index 74c560851f37c..f3de7d8abf721 100644 --- a/src/test/modules/test_parser/test_parser.c +++ b/src/test/modules/test_parser/test_parser.c @@ -3,7 +3,7 @@ * test_parser.c * Simple example of a text search parser * - * Copyright (c) 2007-2023, PostgreSQL Global Development Group + * Copyright (c) 2007-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_parser/test_parser.c diff --git a/src/test/modules/test_pg_dump/expected/test_pg_dump.out b/src/test/modules/test_pg_dump/expected/test_pg_dump.out index f14f3a6664614..3536d636d8ea2 100644 --- a/src/test/modules/test_pg_dump/expected/test_pg_dump.out +++ b/src/test/modules/test_pg_dump/expected/test_pg_dump.out @@ -62,6 +62,113 @@ GRANT SELECT ON ft1 TO regress_dump_test_role; GRANT UPDATE ON test_pg_dump_mv1 TO regress_dump_test_role; GRANT USAGE ON SCHEMA test_pg_dump_s1 TO regress_dump_test_role; GRANT USAGE ON TYPE test_pg_dump_e1 TO regress_dump_test_role; +-- Substitute for current user's name to keep test output consistent +SELECT s.obj, + CASE WHEN a.grantor::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantor::regrole::name END, + CASE WHEN a.grantee::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantee::regrole::name END, + a.privilege_type, a.is_grantable +FROM + (SELECT pg_describe_object(classoid,objoid,objsubid) COLLATE "C" AS obj, initprivs + FROM pg_init_privs WHERE privtype = 'e' ORDER BY 1) s, + aclexplode(s.initprivs) a; + obj | grantor | grantee | privilege_type | is_grantable +----------------------------------------------------+----------+------------------------+----------------+-------------- + column col1 of table regress_pg_dump_table | postgres | - | SELECT | f + function regress_pg_dump_schema.test_agg(smallint) | postgres | - | EXECUTE | f + function regress_pg_dump_schema.test_agg(smallint) | postgres | postgres | EXECUTE | f + function regress_pg_dump_schema.test_agg(smallint) | postgres | regress_dump_test_role | EXECUTE | f + function regress_pg_dump_schema.test_func() | postgres | - | EXECUTE | f + function regress_pg_dump_schema.test_func() | postgres | postgres | EXECUTE | f + function regress_pg_dump_schema.test_func() | postgres | regress_dump_test_role | EXECUTE | f + function wgo_then_no_access() | postgres | - | EXECUTE | f + function wgo_then_no_access() | postgres | postgres | EXECUTE | f + function wgo_then_no_access() | postgres | pg_signal_backend | EXECUTE | t + sequence regress_pg_dump_schema.test_seq | postgres | postgres | SELECT | f + sequence regress_pg_dump_schema.test_seq | postgres | postgres | UPDATE | f + sequence regress_pg_dump_schema.test_seq | postgres | postgres | USAGE | f + sequence regress_pg_dump_schema.test_seq | postgres | regress_dump_test_role | USAGE | f + sequence regress_pg_dump_seq | postgres | postgres | SELECT | f + sequence regress_pg_dump_seq | postgres | postgres | UPDATE | f + sequence regress_pg_dump_seq | postgres | postgres | USAGE | f + sequence regress_pg_dump_seq | postgres | regress_dump_test_role | USAGE | f + sequence regress_seq_dumpable | postgres | postgres | SELECT | f + sequence regress_seq_dumpable | postgres | postgres | UPDATE | f + sequence regress_seq_dumpable | postgres | postgres | USAGE | f + sequence regress_seq_dumpable | postgres | - | SELECT | f + sequence wgo_then_regular | postgres | postgres | SELECT | f + sequence wgo_then_regular | postgres | postgres | UPDATE | f + sequence wgo_then_regular | postgres | postgres | USAGE | f + sequence wgo_then_regular | postgres | pg_signal_backend | SELECT | f + sequence wgo_then_regular | postgres | pg_signal_backend | UPDATE | t + sequence wgo_then_regular | postgres | pg_signal_backend | USAGE | t + table regress_pg_dump_schema.test_table | postgres | postgres | INSERT | f + table regress_pg_dump_schema.test_table | postgres | postgres | SELECT | f + table regress_pg_dump_schema.test_table | postgres | postgres | UPDATE | f + table regress_pg_dump_schema.test_table | postgres | postgres | DELETE | f + table regress_pg_dump_schema.test_table | postgres | postgres | TRUNCATE | f + table regress_pg_dump_schema.test_table | postgres | postgres | REFERENCES | f + table regress_pg_dump_schema.test_table | postgres | postgres | TRIGGER | f + table regress_pg_dump_schema.test_table | postgres | postgres | MAINTAIN | f + table regress_pg_dump_schema.test_table | postgres | regress_dump_test_role | SELECT | f + table regress_pg_dump_table | postgres | postgres | INSERT | f + table regress_pg_dump_table | postgres | postgres | SELECT | f + table regress_pg_dump_table | postgres | postgres | UPDATE | f + table regress_pg_dump_table | postgres | postgres | DELETE | f + table regress_pg_dump_table | postgres | postgres | TRUNCATE | f + table regress_pg_dump_table | postgres | postgres | REFERENCES | f + table regress_pg_dump_table | postgres | postgres | TRIGGER | f + table regress_pg_dump_table | postgres | postgres | MAINTAIN | f + table regress_pg_dump_table | postgres | regress_dump_test_role | SELECT | f + table regress_table_dumpable | postgres | postgres | INSERT | f + table regress_table_dumpable | postgres | postgres | SELECT | f + table regress_table_dumpable | postgres | postgres | UPDATE | f + table regress_table_dumpable | postgres | postgres | DELETE | f + table regress_table_dumpable | postgres | postgres | TRUNCATE | f + table regress_table_dumpable | postgres | postgres | REFERENCES | f + table regress_table_dumpable | postgres | postgres | TRIGGER | f + table regress_table_dumpable | postgres | postgres | MAINTAIN | f + table regress_table_dumpable | postgres | - | SELECT | f + type regress_pg_dump_schema.test_type | postgres | - | USAGE | f + type regress_pg_dump_schema.test_type | postgres | postgres | USAGE | f + type regress_pg_dump_schema.test_type | postgres | regress_dump_test_role | USAGE | f +(58 rows) + +SELECT pg_describe_object(classid,objid,objsubid) COLLATE "C" AS obj, + pg_describe_object(refclassid,refobjid,0) AS refobj, + deptype + FROM pg_shdepend JOIN pg_database d ON dbid = d.oid + WHERE d.datname = current_database() + ORDER BY 1, 3; + obj | refobj | deptype +----------------------------------------------------+-----------------------------+--------- + column c1 of foreign table ft1 | role regress_dump_test_role | a + column c1 of table test_pg_dump_t1 | role regress_dump_test_role | a + foreign table ft1 | role regress_dump_test_role | a + foreign-data wrapper dummy | role regress_dump_test_role | a + function regress_pg_dump_schema.test_agg(smallint) | role regress_dump_test_role | a + function regress_pg_dump_schema.test_agg(smallint) | role regress_dump_test_role | i + function regress_pg_dump_schema.test_func() | role regress_dump_test_role | a + function regress_pg_dump_schema.test_func() | role regress_dump_test_role | i + function test_pg_dump(integer) | role regress_dump_test_role | a + materialized view test_pg_dump_mv1 | role regress_dump_test_role | a + schema test_pg_dump_s1 | role regress_dump_test_role | a + sequence regress_pg_dump_schema.test_seq | role regress_dump_test_role | a + sequence regress_pg_dump_schema.test_seq | role regress_dump_test_role | i + sequence regress_pg_dump_seq | role regress_dump_test_role | a + sequence regress_pg_dump_seq | role regress_dump_test_role | i + server s0 | role regress_dump_test_role | a + table regress_pg_dump_schema.test_table | role regress_dump_test_role | a + table regress_pg_dump_schema.test_table | role regress_dump_test_role | i + table regress_pg_dump_table | role regress_dump_test_role | a + table regress_pg_dump_table | role regress_dump_test_role | i + type regress_pg_dump_schema.test_type | role regress_dump_test_role | a + type regress_pg_dump_schema.test_type | role regress_dump_test_role | i + type test_pg_dump_e1 | role regress_dump_test_role | a + view test_pg_dump_v1 | role regress_dump_test_role | a +(24 rows) + ALTER EXTENSION test_pg_dump ADD ACCESS METHOD gist2; ALTER EXTENSION test_pg_dump ADD AGGREGATE newavg(int4); ALTER EXTENSION test_pg_dump ADD CAST (text AS casttesttype); @@ -91,3 +198,393 @@ ALTER EXTENSION test_pg_dump DROP SERVER s0; ALTER EXTENSION test_pg_dump DROP TABLE test_pg_dump_t1; ALTER EXTENSION test_pg_dump DROP TYPE test_pg_dump_e1; ALTER EXTENSION test_pg_dump DROP VIEW test_pg_dump_v1; +DROP OWNED BY regress_dump_test_role RESTRICT; +-- Substitute for current user's name to keep test output consistent +SELECT s.obj, + CASE WHEN a.grantor::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantor::regrole::name END, + CASE WHEN a.grantee::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantee::regrole::name END, + a.privilege_type, a.is_grantable +FROM + (SELECT pg_describe_object(classoid,objoid,objsubid) COLLATE "C" AS obj, initprivs + FROM pg_init_privs WHERE privtype = 'e' ORDER BY 1) s, + aclexplode(s.initprivs) a; + obj | grantor | grantee | privilege_type | is_grantable +----------------------------------------------------+----------+-------------------+----------------+-------------- + column col1 of table regress_pg_dump_table | postgres | - | SELECT | f + function regress_pg_dump_schema.test_agg(smallint) | postgres | - | EXECUTE | f + function regress_pg_dump_schema.test_agg(smallint) | postgres | postgres | EXECUTE | f + function regress_pg_dump_schema.test_func() | postgres | - | EXECUTE | f + function regress_pg_dump_schema.test_func() | postgres | postgres | EXECUTE | f + function wgo_then_no_access() | postgres | - | EXECUTE | f + function wgo_then_no_access() | postgres | postgres | EXECUTE | f + function wgo_then_no_access() | postgres | pg_signal_backend | EXECUTE | t + sequence regress_pg_dump_schema.test_seq | postgres | postgres | SELECT | f + sequence regress_pg_dump_schema.test_seq | postgres | postgres | UPDATE | f + sequence regress_pg_dump_schema.test_seq | postgres | postgres | USAGE | f + sequence regress_pg_dump_seq | postgres | postgres | SELECT | f + sequence regress_pg_dump_seq | postgres | postgres | UPDATE | f + sequence regress_pg_dump_seq | postgres | postgres | USAGE | f + sequence regress_seq_dumpable | postgres | postgres | SELECT | f + sequence regress_seq_dumpable | postgres | postgres | UPDATE | f + sequence regress_seq_dumpable | postgres | postgres | USAGE | f + sequence regress_seq_dumpable | postgres | - | SELECT | f + sequence wgo_then_regular | postgres | postgres | SELECT | f + sequence wgo_then_regular | postgres | postgres | UPDATE | f + sequence wgo_then_regular | postgres | postgres | USAGE | f + sequence wgo_then_regular | postgres | pg_signal_backend | SELECT | f + sequence wgo_then_regular | postgres | pg_signal_backend | UPDATE | t + sequence wgo_then_regular | postgres | pg_signal_backend | USAGE | t + table regress_pg_dump_schema.test_table | postgres | postgres | INSERT | f + table regress_pg_dump_schema.test_table | postgres | postgres | SELECT | f + table regress_pg_dump_schema.test_table | postgres | postgres | UPDATE | f + table regress_pg_dump_schema.test_table | postgres | postgres | DELETE | f + table regress_pg_dump_schema.test_table | postgres | postgres | TRUNCATE | f + table regress_pg_dump_schema.test_table | postgres | postgres | REFERENCES | f + table regress_pg_dump_schema.test_table | postgres | postgres | TRIGGER | f + table regress_pg_dump_schema.test_table | postgres | postgres | MAINTAIN | f + table regress_pg_dump_table | postgres | postgres | INSERT | f + table regress_pg_dump_table | postgres | postgres | SELECT | f + table regress_pg_dump_table | postgres | postgres | UPDATE | f + table regress_pg_dump_table | postgres | postgres | DELETE | f + table regress_pg_dump_table | postgres | postgres | TRUNCATE | f + table regress_pg_dump_table | postgres | postgres | REFERENCES | f + table regress_pg_dump_table | postgres | postgres | TRIGGER | f + table regress_pg_dump_table | postgres | postgres | MAINTAIN | f + table regress_table_dumpable | postgres | postgres | INSERT | f + table regress_table_dumpable | postgres | postgres | SELECT | f + table regress_table_dumpable | postgres | postgres | UPDATE | f + table regress_table_dumpable | postgres | postgres | DELETE | f + table regress_table_dumpable | postgres | postgres | TRUNCATE | f + table regress_table_dumpable | postgres | postgres | REFERENCES | f + table regress_table_dumpable | postgres | postgres | TRIGGER | f + table regress_table_dumpable | postgres | postgres | MAINTAIN | f + table regress_table_dumpable | postgres | - | SELECT | f + type regress_pg_dump_schema.test_type | postgres | - | USAGE | f + type regress_pg_dump_schema.test_type | postgres | postgres | USAGE | f +(51 rows) + +SELECT pg_describe_object(classid,objid,objsubid) COLLATE "C" AS obj, + pg_describe_object(refclassid,refobjid,0) AS refobj, + deptype + FROM pg_shdepend JOIN pg_database d ON dbid = d.oid + WHERE d.datname = current_database() + ORDER BY 1, 3; + obj | refobj | deptype +-----+--------+--------- +(0 rows) + +DROP ROLE regress_dump_test_role; +DROP EXTENSION test_pg_dump; +-- shouldn't be anything left in pg_init_privs +SELECT * FROM pg_init_privs WHERE privtype = 'e'; + objoid | classoid | objsubid | privtype | initprivs +--------+----------+----------+----------+----------- +(0 rows) + +CREATE ROLE regress_dump_test_role; +CREATE ROLE regress_dump_test_super SUPERUSER; +SET ROLE regress_dump_test_super; +CREATE EXTENSION test_pg_dump; +RESET ROLE; +-- Substitute for current user's name to keep test output consistent +SELECT s.obj, + CASE WHEN a.grantor::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantor::regrole::name END, + CASE WHEN a.grantee::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantee::regrole::name END, + a.privilege_type, a.is_grantable +FROM + (SELECT pg_describe_object(classoid,objoid,objsubid) COLLATE "C" AS obj, initprivs + FROM pg_init_privs WHERE privtype = 'e' ORDER BY 1) s, + aclexplode(s.initprivs) a; + obj | grantor | grantee | privilege_type | is_grantable +----------------------------------------------------+-------------------------+-------------------------+----------------+-------------- + column col1 of table regress_pg_dump_table | regress_dump_test_super | - | SELECT | f + function regress_pg_dump_schema.test_agg(smallint) | regress_dump_test_super | - | EXECUTE | f + function regress_pg_dump_schema.test_agg(smallint) | regress_dump_test_super | regress_dump_test_super | EXECUTE | f + function regress_pg_dump_schema.test_agg(smallint) | regress_dump_test_super | regress_dump_test_role | EXECUTE | f + function regress_pg_dump_schema.test_func() | regress_dump_test_super | - | EXECUTE | f + function regress_pg_dump_schema.test_func() | regress_dump_test_super | regress_dump_test_super | EXECUTE | f + function regress_pg_dump_schema.test_func() | regress_dump_test_super | regress_dump_test_role | EXECUTE | f + function wgo_then_no_access() | regress_dump_test_super | - | EXECUTE | f + function wgo_then_no_access() | regress_dump_test_super | regress_dump_test_super | EXECUTE | f + function wgo_then_no_access() | regress_dump_test_super | pg_signal_backend | EXECUTE | t + sequence regress_pg_dump_schema.test_seq | regress_dump_test_super | regress_dump_test_super | SELECT | f + sequence regress_pg_dump_schema.test_seq | regress_dump_test_super | regress_dump_test_super | UPDATE | f + sequence regress_pg_dump_schema.test_seq | regress_dump_test_super | regress_dump_test_super | USAGE | f + sequence regress_pg_dump_schema.test_seq | regress_dump_test_super | regress_dump_test_role | USAGE | f + sequence regress_pg_dump_seq | regress_dump_test_super | regress_dump_test_super | SELECT | f + sequence regress_pg_dump_seq | regress_dump_test_super | regress_dump_test_super | UPDATE | f + sequence regress_pg_dump_seq | regress_dump_test_super | regress_dump_test_super | USAGE | f + sequence regress_pg_dump_seq | regress_dump_test_super | regress_dump_test_role | USAGE | f + sequence regress_seq_dumpable | regress_dump_test_super | regress_dump_test_super | SELECT | f + sequence regress_seq_dumpable | regress_dump_test_super | regress_dump_test_super | UPDATE | f + sequence regress_seq_dumpable | regress_dump_test_super | regress_dump_test_super | USAGE | f + sequence regress_seq_dumpable | regress_dump_test_super | - | SELECT | f + sequence wgo_then_regular | regress_dump_test_super | regress_dump_test_super | SELECT | f + sequence wgo_then_regular | regress_dump_test_super | regress_dump_test_super | UPDATE | f + sequence wgo_then_regular | regress_dump_test_super | regress_dump_test_super | USAGE | f + sequence wgo_then_regular | regress_dump_test_super | pg_signal_backend | SELECT | f + sequence wgo_then_regular | regress_dump_test_super | pg_signal_backend | UPDATE | t + sequence wgo_then_regular | regress_dump_test_super | pg_signal_backend | USAGE | t + table regress_pg_dump_schema.test_table | regress_dump_test_super | regress_dump_test_super | INSERT | f + table regress_pg_dump_schema.test_table | regress_dump_test_super | regress_dump_test_super | SELECT | f + table regress_pg_dump_schema.test_table | regress_dump_test_super | regress_dump_test_super | UPDATE | f + table regress_pg_dump_schema.test_table | regress_dump_test_super | regress_dump_test_super | DELETE | f + table regress_pg_dump_schema.test_table | regress_dump_test_super | regress_dump_test_super | TRUNCATE | f + table regress_pg_dump_schema.test_table | regress_dump_test_super | regress_dump_test_super | REFERENCES | f + table regress_pg_dump_schema.test_table | regress_dump_test_super | regress_dump_test_super | TRIGGER | f + table regress_pg_dump_schema.test_table | regress_dump_test_super | regress_dump_test_super | MAINTAIN | f + table regress_pg_dump_schema.test_table | regress_dump_test_super | regress_dump_test_role | SELECT | f + table regress_pg_dump_table | regress_dump_test_super | regress_dump_test_super | INSERT | f + table regress_pg_dump_table | regress_dump_test_super | regress_dump_test_super | SELECT | f + table regress_pg_dump_table | regress_dump_test_super | regress_dump_test_super | UPDATE | f + table regress_pg_dump_table | regress_dump_test_super | regress_dump_test_super | DELETE | f + table regress_pg_dump_table | regress_dump_test_super | regress_dump_test_super | TRUNCATE | f + table regress_pg_dump_table | regress_dump_test_super | regress_dump_test_super | REFERENCES | f + table regress_pg_dump_table | regress_dump_test_super | regress_dump_test_super | TRIGGER | f + table regress_pg_dump_table | regress_dump_test_super | regress_dump_test_super | MAINTAIN | f + table regress_pg_dump_table | regress_dump_test_super | regress_dump_test_role | SELECT | f + table regress_table_dumpable | regress_dump_test_super | regress_dump_test_super | INSERT | f + table regress_table_dumpable | regress_dump_test_super | regress_dump_test_super | SELECT | f + table regress_table_dumpable | regress_dump_test_super | regress_dump_test_super | UPDATE | f + table regress_table_dumpable | regress_dump_test_super | regress_dump_test_super | DELETE | f + table regress_table_dumpable | regress_dump_test_super | regress_dump_test_super | TRUNCATE | f + table regress_table_dumpable | regress_dump_test_super | regress_dump_test_super | REFERENCES | f + table regress_table_dumpable | regress_dump_test_super | regress_dump_test_super | TRIGGER | f + table regress_table_dumpable | regress_dump_test_super | regress_dump_test_super | MAINTAIN | f + table regress_table_dumpable | regress_dump_test_super | - | SELECT | f + type regress_pg_dump_schema.test_type | regress_dump_test_super | - | USAGE | f + type regress_pg_dump_schema.test_type | regress_dump_test_super | regress_dump_test_super | USAGE | f + type regress_pg_dump_schema.test_type | regress_dump_test_super | regress_dump_test_role | USAGE | f +(58 rows) + +SELECT pg_describe_object(classid,objid,objsubid) COLLATE "C" AS obj, + pg_describe_object(refclassid,refobjid,0) AS refobj, + deptype + FROM pg_shdepend JOIN pg_database d ON dbid = d.oid + WHERE d.datname = current_database() + ORDER BY 1, 2, 3; + obj | refobj | deptype +----------------------------------------------------+------------------------------+--------- + column col1 of table regress_pg_dump_table | role regress_dump_test_super | i + extension test_pg_dump | role regress_dump_test_super | o + function regress_pg_dump_schema.test_agg(smallint) | role regress_dump_test_role | a + function regress_pg_dump_schema.test_agg(smallint) | role regress_dump_test_role | i + function regress_pg_dump_schema.test_agg(smallint) | role regress_dump_test_super | i + function regress_pg_dump_schema.test_agg(smallint) | role regress_dump_test_super | o + function regress_pg_dump_schema.test_func() | role regress_dump_test_role | a + function regress_pg_dump_schema.test_func() | role regress_dump_test_role | i + function regress_pg_dump_schema.test_func() | role regress_dump_test_super | i + function regress_pg_dump_schema.test_func() | role regress_dump_test_super | o + function wgo_then_no_access() | role regress_dump_test_super | i + function wgo_then_no_access() | role regress_dump_test_super | o + schema regress_pg_dump_schema | role regress_dump_test_super | o + sequence regress_pg_dump_schema.test_seq | role regress_dump_test_role | a + sequence regress_pg_dump_schema.test_seq | role regress_dump_test_role | i + sequence regress_pg_dump_schema.test_seq | role regress_dump_test_super | i + sequence regress_pg_dump_schema.test_seq | role regress_dump_test_super | o + sequence regress_pg_dump_seq | role regress_dump_test_role | a + sequence regress_pg_dump_seq | role regress_dump_test_role | i + sequence regress_pg_dump_seq | role regress_dump_test_super | i + sequence regress_pg_dump_seq | role regress_dump_test_super | o + sequence regress_pg_dump_table_col1_seq | role regress_dump_test_super | o + sequence regress_seq_dumpable | role regress_dump_test_super | i + sequence regress_seq_dumpable | role regress_dump_test_super | o + sequence wgo_then_regular | role regress_dump_test_super | i + sequence wgo_then_regular | role regress_dump_test_super | o + table regress_pg_dump_schema.test_table | role regress_dump_test_role | a + table regress_pg_dump_schema.test_table | role regress_dump_test_role | i + table regress_pg_dump_schema.test_table | role regress_dump_test_super | i + table regress_pg_dump_schema.test_table | role regress_dump_test_super | o + table regress_pg_dump_table | role regress_dump_test_role | a + table regress_pg_dump_table | role regress_dump_test_role | i + table regress_pg_dump_table | role regress_dump_test_super | i + table regress_pg_dump_table | role regress_dump_test_super | o + table regress_table_dumpable | role regress_dump_test_super | i + table regress_table_dumpable | role regress_dump_test_super | o + type regress_pg_dump_schema.test_type | role regress_dump_test_role | a + type regress_pg_dump_schema.test_type | role regress_dump_test_role | i + type regress_pg_dump_schema.test_type | role regress_dump_test_super | i + type regress_pg_dump_schema.test_type | role regress_dump_test_super | o +(40 rows) + +REASSIGN OWNED BY regress_dump_test_super TO CURRENT_ROLE; +-- Substitute for current user's name to keep test output consistent +SELECT s.obj, + CASE WHEN a.grantor::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantor::regrole::name END, + CASE WHEN a.grantee::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantee::regrole::name END, + a.privilege_type, a.is_grantable +FROM + (SELECT pg_describe_object(classoid,objoid,objsubid) COLLATE "C" AS obj, initprivs + FROM pg_init_privs WHERE privtype = 'e' ORDER BY 1) s, + aclexplode(s.initprivs) a; + obj | grantor | grantee | privilege_type | is_grantable +----------------------------------------------------+----------+------------------------+----------------+-------------- + column col1 of table regress_pg_dump_table | postgres | - | SELECT | f + function regress_pg_dump_schema.test_agg(smallint) | postgres | - | EXECUTE | f + function regress_pg_dump_schema.test_agg(smallint) | postgres | postgres | EXECUTE | f + function regress_pg_dump_schema.test_agg(smallint) | postgres | regress_dump_test_role | EXECUTE | f + function regress_pg_dump_schema.test_func() | postgres | - | EXECUTE | f + function regress_pg_dump_schema.test_func() | postgres | postgres | EXECUTE | f + function regress_pg_dump_schema.test_func() | postgres | regress_dump_test_role | EXECUTE | f + function wgo_then_no_access() | postgres | - | EXECUTE | f + function wgo_then_no_access() | postgres | postgres | EXECUTE | f + function wgo_then_no_access() | postgres | pg_signal_backend | EXECUTE | t + sequence regress_pg_dump_schema.test_seq | postgres | postgres | SELECT | f + sequence regress_pg_dump_schema.test_seq | postgres | postgres | UPDATE | f + sequence regress_pg_dump_schema.test_seq | postgres | postgres | USAGE | f + sequence regress_pg_dump_schema.test_seq | postgres | regress_dump_test_role | USAGE | f + sequence regress_pg_dump_seq | postgres | postgres | SELECT | f + sequence regress_pg_dump_seq | postgres | postgres | UPDATE | f + sequence regress_pg_dump_seq | postgres | postgres | USAGE | f + sequence regress_pg_dump_seq | postgres | regress_dump_test_role | USAGE | f + sequence regress_seq_dumpable | postgres | postgres | SELECT | f + sequence regress_seq_dumpable | postgres | postgres | UPDATE | f + sequence regress_seq_dumpable | postgres | postgres | USAGE | f + sequence regress_seq_dumpable | postgres | - | SELECT | f + sequence wgo_then_regular | postgres | postgres | SELECT | f + sequence wgo_then_regular | postgres | postgres | UPDATE | f + sequence wgo_then_regular | postgres | postgres | USAGE | f + sequence wgo_then_regular | postgres | pg_signal_backend | SELECT | f + sequence wgo_then_regular | postgres | pg_signal_backend | UPDATE | t + sequence wgo_then_regular | postgres | pg_signal_backend | USAGE | t + table regress_pg_dump_schema.test_table | postgres | postgres | INSERT | f + table regress_pg_dump_schema.test_table | postgres | postgres | SELECT | f + table regress_pg_dump_schema.test_table | postgres | postgres | UPDATE | f + table regress_pg_dump_schema.test_table | postgres | postgres | DELETE | f + table regress_pg_dump_schema.test_table | postgres | postgres | TRUNCATE | f + table regress_pg_dump_schema.test_table | postgres | postgres | REFERENCES | f + table regress_pg_dump_schema.test_table | postgres | postgres | TRIGGER | f + table regress_pg_dump_schema.test_table | postgres | postgres | MAINTAIN | f + table regress_pg_dump_schema.test_table | postgres | regress_dump_test_role | SELECT | f + table regress_pg_dump_table | postgres | postgres | INSERT | f + table regress_pg_dump_table | postgres | postgres | SELECT | f + table regress_pg_dump_table | postgres | postgres | UPDATE | f + table regress_pg_dump_table | postgres | postgres | DELETE | f + table regress_pg_dump_table | postgres | postgres | TRUNCATE | f + table regress_pg_dump_table | postgres | postgres | REFERENCES | f + table regress_pg_dump_table | postgres | postgres | TRIGGER | f + table regress_pg_dump_table | postgres | postgres | MAINTAIN | f + table regress_pg_dump_table | postgres | regress_dump_test_role | SELECT | f + table regress_table_dumpable | postgres | postgres | INSERT | f + table regress_table_dumpable | postgres | postgres | SELECT | f + table regress_table_dumpable | postgres | postgres | UPDATE | f + table regress_table_dumpable | postgres | postgres | DELETE | f + table regress_table_dumpable | postgres | postgres | TRUNCATE | f + table regress_table_dumpable | postgres | postgres | REFERENCES | f + table regress_table_dumpable | postgres | postgres | TRIGGER | f + table regress_table_dumpable | postgres | postgres | MAINTAIN | f + table regress_table_dumpable | postgres | - | SELECT | f + type regress_pg_dump_schema.test_type | postgres | - | USAGE | f + type regress_pg_dump_schema.test_type | postgres | postgres | USAGE | f + type regress_pg_dump_schema.test_type | postgres | regress_dump_test_role | USAGE | f +(58 rows) + +SELECT pg_describe_object(classid,objid,objsubid) COLLATE "C" AS obj, + pg_describe_object(refclassid,refobjid,0) AS refobj, + deptype + FROM pg_shdepend JOIN pg_database d ON dbid = d.oid + WHERE d.datname = current_database() + ORDER BY 1, 2, 3; + obj | refobj | deptype +----------------------------------------------------+-----------------------------+--------- + function regress_pg_dump_schema.test_agg(smallint) | role regress_dump_test_role | a + function regress_pg_dump_schema.test_agg(smallint) | role regress_dump_test_role | i + function regress_pg_dump_schema.test_func() | role regress_dump_test_role | a + function regress_pg_dump_schema.test_func() | role regress_dump_test_role | i + sequence regress_pg_dump_schema.test_seq | role regress_dump_test_role | a + sequence regress_pg_dump_schema.test_seq | role regress_dump_test_role | i + sequence regress_pg_dump_seq | role regress_dump_test_role | a + sequence regress_pg_dump_seq | role regress_dump_test_role | i + table regress_pg_dump_schema.test_table | role regress_dump_test_role | a + table regress_pg_dump_schema.test_table | role regress_dump_test_role | i + table regress_pg_dump_table | role regress_dump_test_role | a + table regress_pg_dump_table | role regress_dump_test_role | i + type regress_pg_dump_schema.test_type | role regress_dump_test_role | a + type regress_pg_dump_schema.test_type | role regress_dump_test_role | i +(14 rows) + +DROP OWNED BY regress_dump_test_role RESTRICT; +-- Substitute for current user's name to keep test output consistent +SELECT s.obj, + CASE WHEN a.grantor::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantor::regrole::name END, + CASE WHEN a.grantee::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantee::regrole::name END, + a.privilege_type, a.is_grantable +FROM + (SELECT pg_describe_object(classoid,objoid,objsubid) COLLATE "C" AS obj, initprivs + FROM pg_init_privs WHERE privtype = 'e' ORDER BY 1) s, + aclexplode(s.initprivs) a; + obj | grantor | grantee | privilege_type | is_grantable +----------------------------------------------------+----------+-------------------+----------------+-------------- + column col1 of table regress_pg_dump_table | postgres | - | SELECT | f + function regress_pg_dump_schema.test_agg(smallint) | postgres | - | EXECUTE | f + function regress_pg_dump_schema.test_agg(smallint) | postgres | postgres | EXECUTE | f + function regress_pg_dump_schema.test_func() | postgres | - | EXECUTE | f + function regress_pg_dump_schema.test_func() | postgres | postgres | EXECUTE | f + function wgo_then_no_access() | postgres | - | EXECUTE | f + function wgo_then_no_access() | postgres | postgres | EXECUTE | f + function wgo_then_no_access() | postgres | pg_signal_backend | EXECUTE | t + sequence regress_pg_dump_schema.test_seq | postgres | postgres | SELECT | f + sequence regress_pg_dump_schema.test_seq | postgres | postgres | UPDATE | f + sequence regress_pg_dump_schema.test_seq | postgres | postgres | USAGE | f + sequence regress_pg_dump_seq | postgres | postgres | SELECT | f + sequence regress_pg_dump_seq | postgres | postgres | UPDATE | f + sequence regress_pg_dump_seq | postgres | postgres | USAGE | f + sequence regress_seq_dumpable | postgres | postgres | SELECT | f + sequence regress_seq_dumpable | postgres | postgres | UPDATE | f + sequence regress_seq_dumpable | postgres | postgres | USAGE | f + sequence regress_seq_dumpable | postgres | - | SELECT | f + sequence wgo_then_regular | postgres | postgres | SELECT | f + sequence wgo_then_regular | postgres | postgres | UPDATE | f + sequence wgo_then_regular | postgres | postgres | USAGE | f + sequence wgo_then_regular | postgres | pg_signal_backend | SELECT | f + sequence wgo_then_regular | postgres | pg_signal_backend | UPDATE | t + sequence wgo_then_regular | postgres | pg_signal_backend | USAGE | t + table regress_pg_dump_schema.test_table | postgres | postgres | INSERT | f + table regress_pg_dump_schema.test_table | postgres | postgres | SELECT | f + table regress_pg_dump_schema.test_table | postgres | postgres | UPDATE | f + table regress_pg_dump_schema.test_table | postgres | postgres | DELETE | f + table regress_pg_dump_schema.test_table | postgres | postgres | TRUNCATE | f + table regress_pg_dump_schema.test_table | postgres | postgres | REFERENCES | f + table regress_pg_dump_schema.test_table | postgres | postgres | TRIGGER | f + table regress_pg_dump_schema.test_table | postgres | postgres | MAINTAIN | f + table regress_pg_dump_table | postgres | postgres | INSERT | f + table regress_pg_dump_table | postgres | postgres | SELECT | f + table regress_pg_dump_table | postgres | postgres | UPDATE | f + table regress_pg_dump_table | postgres | postgres | DELETE | f + table regress_pg_dump_table | postgres | postgres | TRUNCATE | f + table regress_pg_dump_table | postgres | postgres | REFERENCES | f + table regress_pg_dump_table | postgres | postgres | TRIGGER | f + table regress_pg_dump_table | postgres | postgres | MAINTAIN | f + table regress_table_dumpable | postgres | postgres | INSERT | f + table regress_table_dumpable | postgres | postgres | SELECT | f + table regress_table_dumpable | postgres | postgres | UPDATE | f + table regress_table_dumpable | postgres | postgres | DELETE | f + table regress_table_dumpable | postgres | postgres | TRUNCATE | f + table regress_table_dumpable | postgres | postgres | REFERENCES | f + table regress_table_dumpable | postgres | postgres | TRIGGER | f + table regress_table_dumpable | postgres | postgres | MAINTAIN | f + table regress_table_dumpable | postgres | - | SELECT | f + type regress_pg_dump_schema.test_type | postgres | - | USAGE | f + type regress_pg_dump_schema.test_type | postgres | postgres | USAGE | f +(51 rows) + +SELECT pg_describe_object(classid,objid,objsubid) COLLATE "C" AS obj, + pg_describe_object(refclassid,refobjid,0) AS refobj, + deptype + FROM pg_shdepend JOIN pg_database d ON dbid = d.oid + WHERE d.datname = current_database() + ORDER BY 1, 2, 3; + obj | refobj | deptype +-----+--------+--------- +(0 rows) + +DROP ROLE regress_dump_test_super; +DROP ROLE regress_dump_test_role; diff --git a/src/test/modules/test_pg_dump/meson.build b/src/test/modules/test_pg_dump/meson.build index 8f61050c29801..9b29ec20b6627 100644 --- a/src/test/modules/test_pg_dump/meson.build +++ b/src/test/modules/test_pg_dump/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_install_data += files( 'test_pg_dump.control', @@ -13,8 +13,6 @@ tests += { 'sql': [ 'test_pg_dump', ], - # doesn't delete its user - 'runningcheck': false, }, 'tap': { 'tests': [ diff --git a/src/test/modules/test_pg_dump/sql/test_pg_dump.sql b/src/test/modules/test_pg_dump/sql/test_pg_dump.sql index a61a7c8c4ce95..87e66cae6e3c1 100644 --- a/src/test/modules/test_pg_dump/sql/test_pg_dump.sql +++ b/src/test/modules/test_pg_dump/sql/test_pg_dump.sql @@ -75,6 +75,24 @@ GRANT UPDATE ON test_pg_dump_mv1 TO regress_dump_test_role; GRANT USAGE ON SCHEMA test_pg_dump_s1 TO regress_dump_test_role; GRANT USAGE ON TYPE test_pg_dump_e1 TO regress_dump_test_role; +-- Substitute for current user's name to keep test output consistent +SELECT s.obj, + CASE WHEN a.grantor::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantor::regrole::name END, + CASE WHEN a.grantee::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantee::regrole::name END, + a.privilege_type, a.is_grantable +FROM + (SELECT pg_describe_object(classoid,objoid,objsubid) COLLATE "C" AS obj, initprivs + FROM pg_init_privs WHERE privtype = 'e' ORDER BY 1) s, + aclexplode(s.initprivs) a; +SELECT pg_describe_object(classid,objid,objsubid) COLLATE "C" AS obj, + pg_describe_object(refclassid,refobjid,0) AS refobj, + deptype + FROM pg_shdepend JOIN pg_database d ON dbid = d.oid + WHERE d.datname = current_database() + ORDER BY 1, 3; + ALTER EXTENSION test_pg_dump ADD ACCESS METHOD gist2; ALTER EXTENSION test_pg_dump ADD AGGREGATE newavg(int4); ALTER EXTENSION test_pg_dump ADD CAST (text AS casttesttype); @@ -106,3 +124,101 @@ ALTER EXTENSION test_pg_dump DROP SERVER s0; ALTER EXTENSION test_pg_dump DROP TABLE test_pg_dump_t1; ALTER EXTENSION test_pg_dump DROP TYPE test_pg_dump_e1; ALTER EXTENSION test_pg_dump DROP VIEW test_pg_dump_v1; + +DROP OWNED BY regress_dump_test_role RESTRICT; + +-- Substitute for current user's name to keep test output consistent +SELECT s.obj, + CASE WHEN a.grantor::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantor::regrole::name END, + CASE WHEN a.grantee::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantee::regrole::name END, + a.privilege_type, a.is_grantable +FROM + (SELECT pg_describe_object(classoid,objoid,objsubid) COLLATE "C" AS obj, initprivs + FROM pg_init_privs WHERE privtype = 'e' ORDER BY 1) s, + aclexplode(s.initprivs) a; +SELECT pg_describe_object(classid,objid,objsubid) COLLATE "C" AS obj, + pg_describe_object(refclassid,refobjid,0) AS refobj, + deptype + FROM pg_shdepend JOIN pg_database d ON dbid = d.oid + WHERE d.datname = current_database() + ORDER BY 1, 3; + +DROP ROLE regress_dump_test_role; + +DROP EXTENSION test_pg_dump; + +-- shouldn't be anything left in pg_init_privs +SELECT * FROM pg_init_privs WHERE privtype = 'e'; + +CREATE ROLE regress_dump_test_role; +CREATE ROLE regress_dump_test_super SUPERUSER; + +SET ROLE regress_dump_test_super; + +CREATE EXTENSION test_pg_dump; + +RESET ROLE; + +-- Substitute for current user's name to keep test output consistent +SELECT s.obj, + CASE WHEN a.grantor::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantor::regrole::name END, + CASE WHEN a.grantee::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantee::regrole::name END, + a.privilege_type, a.is_grantable +FROM + (SELECT pg_describe_object(classoid,objoid,objsubid) COLLATE "C" AS obj, initprivs + FROM pg_init_privs WHERE privtype = 'e' ORDER BY 1) s, + aclexplode(s.initprivs) a; +SELECT pg_describe_object(classid,objid,objsubid) COLLATE "C" AS obj, + pg_describe_object(refclassid,refobjid,0) AS refobj, + deptype + FROM pg_shdepend JOIN pg_database d ON dbid = d.oid + WHERE d.datname = current_database() + ORDER BY 1, 2, 3; + +REASSIGN OWNED BY regress_dump_test_super TO CURRENT_ROLE; + +-- Substitute for current user's name to keep test output consistent +SELECT s.obj, + CASE WHEN a.grantor::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantor::regrole::name END, + CASE WHEN a.grantee::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantee::regrole::name END, + a.privilege_type, a.is_grantable +FROM + (SELECT pg_describe_object(classoid,objoid,objsubid) COLLATE "C" AS obj, initprivs + FROM pg_init_privs WHERE privtype = 'e' ORDER BY 1) s, + aclexplode(s.initprivs) a; +SELECT pg_describe_object(classid,objid,objsubid) COLLATE "C" AS obj, + pg_describe_object(refclassid,refobjid,0) AS refobj, + deptype + FROM pg_shdepend JOIN pg_database d ON dbid = d.oid + WHERE d.datname = current_database() + ORDER BY 1, 2, 3; + +DROP OWNED BY regress_dump_test_role RESTRICT; + +-- Substitute for current user's name to keep test output consistent +SELECT s.obj, + CASE WHEN a.grantor::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantor::regrole::name END, + CASE WHEN a.grantee::regrole::name = quote_ident(current_user) THEN 'postgres' + ELSE a.grantee::regrole::name END, + a.privilege_type, a.is_grantable +FROM + (SELECT pg_describe_object(classoid,objoid,objsubid) COLLATE "C" AS obj, initprivs + FROM pg_init_privs WHERE privtype = 'e' ORDER BY 1) s, + aclexplode(s.initprivs) a; +SELECT pg_describe_object(classid,objid,objsubid) COLLATE "C" AS obj, + pg_describe_object(refclassid,refobjid,0) AS refobj, + deptype + FROM pg_shdepend JOIN pg_database d ON dbid = d.oid + WHERE d.datname = current_database() + ORDER BY 1, 2, 3; + +DROP ROLE regress_dump_test_super; + +DROP ROLE regress_dump_test_role; diff --git a/src/test/modules/test_pg_dump/t/001_base.pl b/src/test/modules/test_pg_dump/t/001_base.pl index d00c3544e9172..e2579e29cd866 100644 --- a/src/test/modules/test_pg_dump/t/001_base.pl +++ b/src/test/modules/test_pg_dump/t/001_base.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -175,6 +175,20 @@ 'postgres', ], }, + + # regress_dump_login_role shouldn't need SELECT rights on internal + # (undumped) extension tables + privileged_internals => { + dump_cmd => [ + 'pg_dump', '--no-sync', + "--file=$tempdir/privileged_internals.sql", + # these two tables are irrelevant to the test case + '--exclude-table=regress_pg_dump_schema.external_tab', + '--exclude-table=regress_pg_dump_schema.extdependtab', + '--username=regress_dump_login_role', 'postgres', + ], + }, + schema_only => { dump_cmd => [ 'pg_dump', '--no-sync', "--file=$tempdir/schema_only.sql", @@ -207,6 +221,22 @@ '--extension=test_pg_dump', 'postgres', ], }, + exclude_extension => { + dump_cmd => [ + 'pg_dump', '--no-sync', + "--file=$tempdir/exclude_extension.sql", + '--exclude-extension=test_pg_dump', 'postgres', + ], + }, + exclude_extension_filter => { + dump_cmd => [ + 'pg_dump', + '--no-sync', + "--file=$tempdir/exclude_extension_filter.sql", + "--filter=$tempdir/exclude_extension_filter.txt", + 'postgres', + ], + }, # plpgsql in the list blocks the dump of extension test_pg_dump without_extension => { @@ -284,7 +314,10 @@ exclude_table => 1, no_privs => 1, no_owner => 1, + privileged_internals => 1, with_extension => 1, + exclude_extension => 1, + exclude_extension_filter => 1, without_extension => 1); my %tests = ( @@ -311,7 +344,12 @@ schema_only => 1, section_pre_data => 1, }, - unlike => { binary_upgrade => 1, without_extension => 1 }, + unlike => { + binary_upgrade => 1, + exclude_extension => 1, + exclude_extension_filter => 1, + without_extension => 1 + }, }, 'CREATE ROLE regress_dump_test_role' => { @@ -321,6 +359,16 @@ like => { pg_dumpall_globals => 1, }, }, + 'CREATE ROLE regress_dump_login_role' => { + create_order => 1, + create_sql => 'CREATE ROLE regress_dump_login_role LOGIN;', + regexp => qr/^ + \QCREATE ROLE regress_dump_login_role;\E + \n\QALTER ROLE regress_dump_login_role WITH \E.*\Q LOGIN \E.*; + \n/xm, + like => { pg_dumpall_globals => 1, }, + }, + 'GRANT ALTER SYSTEM ON PARAMETER full_page_writes TO regress_dump_test_role' => { create_order => 2, @@ -363,14 +411,14 @@ 'CREATE SEQUENCE regress_pg_dump_table_col1_seq' => { regexp => qr/^ - \QCREATE SEQUENCE public.regress_pg_dump_table_col1_seq\E - \n\s+\QAS integer\E - \n\s+\QSTART WITH 1\E - \n\s+\QINCREMENT BY 1\E - \n\s+\QNO MINVALUE\E - \n\s+\QNO MAXVALUE\E - \n\s+\QCACHE 1;\E - \n/xm, + \QCREATE SEQUENCE public.regress_pg_dump_table_col1_seq\E + \n\s+\QAS integer\E + \n\s+\QSTART WITH 1\E + \n\s+\QINCREMENT BY 1\E + \n\s+\QNO MINVALUE\E + \n\s+\QNO MAXVALUE\E + \n\s+\QCACHE 1;\E + \n/xm, like => { binary_upgrade => 1, }, }, @@ -388,13 +436,13 @@ 'CREATE SEQUENCE regress_pg_dump_seq' => { regexp => qr/^ - \QCREATE SEQUENCE public.regress_pg_dump_seq\E - \n\s+\QSTART WITH 1\E - \n\s+\QINCREMENT BY 1\E - \n\s+\QNO MINVALUE\E - \n\s+\QNO MAXVALUE\E - \n\s+\QCACHE 1;\E - \n/xm, + \QCREATE SEQUENCE public.regress_pg_dump_seq\E + \n\s+\QSTART WITH 1\E + \n\s+\QINCREMENT BY 1\E + \n\s+\QNO MINVALUE\E + \n\s+\QNO MAXVALUE\E + \n\s+\QCACHE 1;\E + \n/xm, like => { binary_upgrade => 1, }, }, @@ -410,7 +458,11 @@ section_data => 1, extension_schema => 1, }, - unlike => { without_extension => 1, }, + unlike => { + exclude_extension => 1, + exclude_extension_filter => 1, + without_extension => 1, + }, }, 'CREATE TABLE regress_pg_dump_table' => { @@ -436,6 +488,8 @@ unlike => { binary_upgrade => 1, exclude_table => 1, + exclude_extension => 1, + exclude_extension_filter => 1, without_extension => 1, }, }, @@ -459,7 +513,12 @@ schema_only => 1, section_pre_data => 1, }, - unlike => { no_privs => 1, without_extension => 1, }, + unlike => { + no_privs => 1, + exclude_extension => 1, + exclude_extension_filter => 1, + without_extension => 1, + }, }, 'REVOKE GRANT OPTION FOR UPDATE ON SEQUENCE wgo_then_regular' => { @@ -476,7 +535,12 @@ schema_only => 1, section_pre_data => 1, }, - unlike => { no_privs => 1, without_extension => 1, }, + unlike => { + no_privs => 1, + exclude_extension => 1, + exclude_extension_filter => 1, + without_extension => 1, + }, }, 'CREATE ACCESS METHOD regress_test_am' => { @@ -496,7 +560,11 @@ schema_only => 1, section_pre_data => 1, }, - unlike => { without_extension => 1, }, + unlike => { + exclude_extension => 1, + exclude_extension_filter => 1, + without_extension => 1, + }, }, 'GRANT SELECT regress_pg_dump_table_added pre-ALTER EXTENSION' => { @@ -521,7 +589,12 @@ schema_only => 1, section_pre_data => 1, }, - unlike => { no_privs => 1, without_extension => 1, }, + unlike => { + no_privs => 1, + exclude_extension => 1, + exclude_extension_filter => 1, + without_extension => 1, + }, }, 'GRANT SELECT ON TABLE regress_pg_dump_table' => { @@ -555,7 +628,12 @@ schema_only => 1, section_pre_data => 1, }, - unlike => { no_privs => 1, without_extension => 1 }, + unlike => { + no_privs => 1, + exclude_extension => 1, + exclude_extension_filter => 1, + without_extension => 1 + }, }, 'GRANT USAGE ON regress_pg_dump_table_col1_seq TO regress_dump_test_role' @@ -571,7 +649,12 @@ schema_only => 1, section_pre_data => 1, }, - unlike => { no_privs => 1, without_extension => 1, }, + unlike => { + no_privs => 1, + exclude_extension => 1, + exclude_extension_filter => 1, + without_extension => 1, + }, }, 'GRANT USAGE ON regress_pg_dump_seq TO regress_dump_test_role' => { @@ -593,7 +676,12 @@ schema_only => 1, section_pre_data => 1, }, - unlike => { no_privs => 1, without_extension => 1, }, + unlike => { + no_privs => 1, + exclude_extension => 1, + exclude_extension_filter => 1, + without_extension => 1, + }, }, # Objects included in extension part of a schema created by this extension */ @@ -618,13 +706,13 @@ 'CREATE SEQUENCE regress_pg_dump_schema.test_seq' => { regexp => qr/^ - \QCREATE SEQUENCE regress_pg_dump_schema.test_seq\E - \n\s+\QSTART WITH 1\E - \n\s+\QINCREMENT BY 1\E - \n\s+\QNO MINVALUE\E - \n\s+\QNO MAXVALUE\E - \n\s+\QCACHE 1;\E - \n/xm, + \QCREATE SEQUENCE regress_pg_dump_schema.test_seq\E + \n\s+\QSTART WITH 1\E + \n\s+\QINCREMENT BY 1\E + \n\s+\QNO MINVALUE\E + \n\s+\QNO MAXVALUE\E + \n\s+\QCACHE 1;\E + \n/xm, like => { binary_upgrade => 1, }, }, @@ -639,9 +727,9 @@ 'CREATE TYPE regress_pg_dump_schema.test_type' => { regexp => qr/^ - \QCREATE TYPE regress_pg_dump_schema.test_type AS (\E - \n\s+\Qcol1 integer\E - \n\);\n/xm, + \QCREATE TYPE regress_pg_dump_schema.test_type AS (\E + \n\s+\Qcol1 integer\E + \n\);\n/xm, like => { binary_upgrade => 1, }, }, @@ -656,9 +744,9 @@ 'CREATE FUNCTION regress_pg_dump_schema.test_func' => { regexp => qr/^ - \QCREATE FUNCTION regress_pg_dump_schema.test_func() RETURNS integer\E - \n\s+\QLANGUAGE sql\E - \n/xm, + \QCREATE FUNCTION regress_pg_dump_schema.test_func() RETURNS integer\E + \n\s+\QLANGUAGE sql\E + \n/xm, like => { binary_upgrade => 1, }, }, @@ -673,10 +761,10 @@ 'CREATE AGGREGATE regress_pg_dump_schema.test_agg' => { regexp => qr/^ - \QCREATE AGGREGATE regress_pg_dump_schema.test_agg(smallint) (\E - \n\s+\QSFUNC = int2_sum,\E - \n\s+\QSTYPE = bigint\E - \n\);\n/xm, + \QCREATE AGGREGATE regress_pg_dump_schema.test_agg(smallint) (\E + \n\s+\QSFUNC = int2_sum,\E + \n\s+\QSTYPE = bigint\E + \n\);\n/xm, like => { binary_upgrade => 1, }, }, @@ -704,6 +792,7 @@ data_only => 1, extension_schema => 1, pg_dumpall_globals => 1, + privileged_internals => 1, section_data => 1, section_pre_data => 1, # Excludes this schema as extension is not listed. @@ -720,6 +809,7 @@ data_only => 1, extension_schema => 1, pg_dumpall_globals => 1, + privileged_internals => 1, section_data => 1, section_pre_data => 1, # Excludes this schema as extension is not listed. @@ -743,13 +833,14 @@ # Excludes the extension and keeps the schema's data. without_extension_internal_schema => 1, }, + unlike => { privileged_internals => 1 }, },); ######################################### # Create a PG instance to test actually dumping from my $node = PostgreSQL::Test::Cluster->new('main'); -$node->init; +$node->init('auth_extra' => [ '--create-role', 'regress_dump_login_role' ]); $node->start; my $port = $node->port; @@ -791,6 +882,16 @@ # Send the combined set of commands to psql $node->safe_psql('postgres', $create_sql); +######################################### +# Create filter file for exclude_extension_filter test + +my $filterfile; + +open $filterfile, '>', "$tempdir/exclude_extension_filter.txt" + or die "unable to open filter file for writing"; +print $filterfile "exclude extension test_pg_dump\n"; +close $filterfile; + ######################################### # Run all runs @@ -830,6 +931,22 @@ foreach my $test (sort keys %tests) { + # Check for proper test definitions + # + # There should be a "like" list, even if it is empty. (This + # makes the test more self-documenting.) + if (!defined($tests{$test}->{like})) + { + die "missing \"like\" in test \"$test\""; + } + # Check for useless entries in "unlike" list. Runs that are + # not listed in "like" don't need to be excluded in "unlike". + if ($tests{$test}->{unlike}->{$test_key} + && !defined($tests{$test}->{like}->{$test_key})) + { + die "useless \"unlike\" entry \"$test_key\" in test \"$test\""; + } + # Run the test listed as a like, unless it is specifically noted # as an unlike (generally due to an explicit exclusion or similar). if ($tests{$test}->{like}->{$test_key} diff --git a/src/test/modules/test_pg_dump/test_pg_dump--1.0.sql b/src/test/modules/test_pg_dump/test_pg_dump--1.0.sql index 110f7eef66c56..1c68e146d9136 100644 --- a/src/test/modules/test_pg_dump/test_pg_dump--1.0.sql +++ b/src/test/modules/test_pg_dump/test_pg_dump--1.0.sql @@ -12,11 +12,13 @@ CREATE SEQUENCE regress_pg_dump_seq; CREATE SEQUENCE regress_seq_dumpable; SELECT pg_catalog.pg_extension_config_dump('regress_seq_dumpable', ''); +GRANT SELECT ON SEQUENCE regress_seq_dumpable TO public; CREATE TABLE regress_table_dumpable ( col1 int check (col1 > 0) ); SELECT pg_catalog.pg_extension_config_dump('regress_table_dumpable', ''); +GRANT SELECT ON regress_table_dumpable TO public; CREATE SCHEMA regress_pg_dump_schema; diff --git a/src/test/modules/test_predtest/meson.build b/src/test/modules/test_predtest/meson.build index 5ec87269b2086..05c71b5b79fd6 100644 --- a/src/test/modules/test_predtest/meson.build +++ b/src/test/modules/test_predtest/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_predtest_sources = files( 'test_predtest.c', diff --git a/src/test/modules/test_predtest/test_predtest.c b/src/test/modules/test_predtest/test_predtest.c index d44e66d6f6462..27ac136ca5d46 100644 --- a/src/test/modules/test_predtest/test_predtest.c +++ b/src/test/modules/test_predtest/test_predtest.c @@ -3,7 +3,7 @@ * test_predtest.c * Test correctness of optimizer's predicate proof logic. * - * Copyright (c) 2018-2023, PostgreSQL Global Development Group + * Copyright (c) 2018-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_predtest/test_predtest.c @@ -74,7 +74,7 @@ test_predtest(PG_FUNCTION_ARGS) if (tupdesc->natts != 2 || TupleDescAttr(tupdesc, 0)->atttypid != BOOLOID || TupleDescAttr(tupdesc, 1)->atttypid != BOOLOID) - elog(ERROR, "query must yield two boolean columns"); + elog(ERROR, "test_predtest query must yield two boolean columns"); s_i_holds = w_i_holds = s_r_holds = w_r_holds = true; for (i = 0; i < SPI_processed; i++) @@ -118,17 +118,33 @@ test_predtest(PG_FUNCTION_ARGS) w_r_holds = false; } + /* + * Strong refutation implies weak refutation, so we should never observe + * s_r_holds = true with w_r_holds = false. + * + * We can't make a comparable assertion for implication since moving from + * strong to weak implication expands the allowed values of "A" from true + * to either true or NULL. + * + * If this fails it constitutes a bug not with the proofs but with either + * this test module or a more core part of expression evaluation since we + * are validating the logical correctness of the observed result rather + * than the proof. + */ + if (s_r_holds && !w_r_holds) + elog(WARNING, "s_r_holds was true; w_r_holds must not be false"); + /* * Now, dig the clause querytrees out of the plan, and see what predtest.c * does with them. */ cplan = SPI_plan_get_cached_plan(spiplan); - if (list_length(cplan->stmt_list) != 1) - elog(ERROR, "failed to decipher query plan"); + if (cplan == NULL || list_length(cplan->stmt_list) != 1) + elog(ERROR, "test_predtest query string must contain exactly one query"); stmt = linitial_node(PlannedStmt, cplan->stmt_list); if (stmt->commandType != CMD_SELECT) - elog(ERROR, "failed to decipher query plan"); + elog(ERROR, "test_predtest query must be a SELECT"); plan = stmt->planTree; Assert(list_length(plan->targetlist) >= 2); clause1 = linitial_node(TargetEntry, plan->targetlist)->expr; @@ -179,6 +195,19 @@ test_predtest(PG_FUNCTION_ARGS) if (weak_refuted_by && !w_r_holds) elog(WARNING, "weak_refuted_by result is incorrect"); + /* + * As with our earlier check of the logical consistency of whether strong + * and weak refutation hold, we ought never prove strong refutation + * without also proving weak refutation. + * + * Also as earlier we cannot make the same guarantee about implication + * proofs. + * + * A warning here suggests a bug in the proof code. + */ + if (strong_refuted_by && !weak_refuted_by) + elog(WARNING, "strong_refuted_by was proven; weak_refuted_by should also be proven"); + /* * Clean up and return a record of the results. */ diff --git a/src/test/modules/test_radixtree/.gitignore b/src/test/modules/test_radixtree/.gitignore new file mode 100644 index 0000000000000..5dcb3ff972350 --- /dev/null +++ b/src/test/modules/test_radixtree/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ diff --git a/src/test/modules/test_radixtree/Makefile b/src/test/modules/test_radixtree/Makefile new file mode 100644 index 0000000000000..cbe7087c85d9a --- /dev/null +++ b/src/test/modules/test_radixtree/Makefile @@ -0,0 +1,23 @@ +# src/test/modules/test_radixtree/Makefile + +MODULE_big = test_radixtree +OBJS = \ + $(WIN32RES) \ + test_radixtree.o +PGFILEDESC = "test_radixtree - test code for src/include/lib/radixtree.h" + +EXTENSION = test_radixtree +DATA = test_radixtree--1.0.sql + +REGRESS = test_radixtree + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/test_radixtree +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/src/test/modules/test_radixtree/expected/test_radixtree.out b/src/test/modules/test_radixtree/expected/test_radixtree.out new file mode 100644 index 0000000000000..14aceecfedea5 --- /dev/null +++ b/src/test/modules/test_radixtree/expected/test_radixtree.out @@ -0,0 +1,41 @@ +CREATE EXTENSION test_radixtree; +-- +-- All the logic is in the test_radixtree() function. It will throw +-- an error if something fails. +-- +SELECT test_radixtree(); +NOTICE: testing node node-4 with shift 0 and ascending keys +NOTICE: testing node node-4 with shift 0 and descending keys +NOTICE: testing node node-4 with shift 8 and ascending keys +NOTICE: testing node node-4 with shift 8 and descending keys +NOTICE: testing node node-4 with shift 56 and ascending keys +NOTICE: testing node node-4 with shift 56 and descending keys +NOTICE: testing node node-16-lo with shift 0 and ascending keys +NOTICE: testing node node-16-lo with shift 0 and descending keys +NOTICE: testing node node-16-lo with shift 8 and ascending keys +NOTICE: testing node node-16-lo with shift 8 and descending keys +NOTICE: testing node node-16-lo with shift 56 and ascending keys +NOTICE: testing node node-16-lo with shift 56 and descending keys +NOTICE: testing node node-16-hi with shift 0 and ascending keys +NOTICE: testing node node-16-hi with shift 0 and descending keys +NOTICE: testing node node-16-hi with shift 8 and ascending keys +NOTICE: testing node node-16-hi with shift 8 and descending keys +NOTICE: testing node node-16-hi with shift 56 and ascending keys +NOTICE: testing node node-16-hi with shift 56 and descending keys +NOTICE: testing node node-48 with shift 0 and ascending keys +NOTICE: testing node node-48 with shift 0 and descending keys +NOTICE: testing node node-48 with shift 8 and ascending keys +NOTICE: testing node node-48 with shift 8 and descending keys +NOTICE: testing node node-48 with shift 56 and ascending keys +NOTICE: testing node node-48 with shift 56 and descending keys +NOTICE: testing node node-256 with shift 0 and ascending keys +NOTICE: testing node node-256 with shift 0 and descending keys +NOTICE: testing node node-256 with shift 8 and ascending keys +NOTICE: testing node node-256 with shift 8 and descending keys +NOTICE: testing node node-256 with shift 56 and ascending keys +NOTICE: testing node node-256 with shift 56 and descending keys + test_radixtree +---------------- + +(1 row) + diff --git a/src/test/modules/test_radixtree/meson.build b/src/test/modules/test_radixtree/meson.build new file mode 100644 index 0000000000000..4a541a78ca48b --- /dev/null +++ b/src/test/modules/test_radixtree/meson.build @@ -0,0 +1,33 @@ +# Copyright (c) 2024, PostgreSQL Global Development Group + +test_radixtree_sources = files( + 'test_radixtree.c', +) + +if host_system == 'windows' + test_radixtree_sources += rc_lib_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'test_radixtree', + '--FILEDESC', 'test_radixtree - test code for src/include/lib/radixtree.h',]) +endif + +test_radixtree = shared_module('test_radixtree', + test_radixtree_sources, + kwargs: pg_test_mod_args, +) +test_install_libs += test_radixtree + +test_install_data += files( + 'test_radixtree.control', + 'test_radixtree--1.0.sql', +) + +tests += { + 'name': 'test_radixtree', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'regress': { + 'sql': [ + 'test_radixtree', + ], + }, +} diff --git a/src/test/modules/test_radixtree/sql/test_radixtree.sql b/src/test/modules/test_radixtree/sql/test_radixtree.sql new file mode 100644 index 0000000000000..41ece5e9f570a --- /dev/null +++ b/src/test/modules/test_radixtree/sql/test_radixtree.sql @@ -0,0 +1,7 @@ +CREATE EXTENSION test_radixtree; + +-- +-- All the logic is in the test_radixtree() function. It will throw +-- an error if something fails. +-- +SELECT test_radixtree(); diff --git a/src/test/modules/test_radixtree/test_radixtree--1.0.sql b/src/test/modules/test_radixtree/test_radixtree--1.0.sql new file mode 100644 index 0000000000000..074a5a7ea7ae2 --- /dev/null +++ b/src/test/modules/test_radixtree/test_radixtree--1.0.sql @@ -0,0 +1,8 @@ +/* src/test/modules/test_radixtree/test_radixtree--1.0.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION test_radixtree" to load this file. \quit + +CREATE FUNCTION test_radixtree() +RETURNS pg_catalog.void STRICT +AS 'MODULE_PATHNAME' LANGUAGE C; diff --git a/src/test/modules/test_radixtree/test_radixtree.c b/src/test/modules/test_radixtree/test_radixtree.c new file mode 100644 index 0000000000000..1d9165a3a234c --- /dev/null +++ b/src/test/modules/test_radixtree/test_radixtree.c @@ -0,0 +1,473 @@ +/*-------------------------------------------------------------------------- + * + * test_radixtree.c + * Test module for adaptive radix tree. + * + * Copyright (c) 2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/test/modules/test_radixtree/test_radixtree.c + * + * ------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "common/int.h" +#include "common/pg_prng.h" +#include "fmgr.h" +#include "miscadmin.h" +#include "storage/lwlock.h" +#include "utils/memutils.h" +#include "utils/timestamp.h" + +/* uncomment to use shared memory for the tree */ +/* #define TEST_SHARED_RT */ + +#define UINT64_HEX_FORMAT "%" INT64_MODIFIER "X" + +/* Convenient macros to test results */ +#define EXPECT_TRUE(expr) \ + do { \ + if (!(expr)) \ + elog(ERROR, \ + "%s was unexpectedly false in file \"%s\" line %u", \ + #expr, __FILE__, __LINE__); \ + } while (0) + +#define EXPECT_FALSE(expr) \ + do { \ + if (expr) \ + elog(ERROR, \ + "%s was unexpectedly true in file \"%s\" line %u", \ + #expr, __FILE__, __LINE__); \ + } while (0) + +#define EXPECT_EQ_U64(result_expr, expected_expr) \ + do { \ + uint64 _result = (result_expr); \ + uint64 _expected = (expected_expr); \ + if (_result != _expected) \ + elog(ERROR, \ + "%s yielded " UINT64_HEX_FORMAT ", expected " UINT64_HEX_FORMAT " (%s) in file \"%s\" line %u", \ + #result_expr, _result, _expected, #expected_expr, __FILE__, __LINE__); \ + } while (0) + +/* + * With uint64, 64-bit platforms store the value in the last-level child + * pointer, and 32-bit platforms store this in a single-value leaf. + * This gives us buildfarm coverage for both paths in this module. + */ +typedef uint64 TestValueType; + +/* + * The node class name and the number of keys big enough to grow nodes + * into each size class. + */ +typedef struct rt_node_class_test_elem +{ + char *class_name; + int nkeys; +} rt_node_class_test_elem; + +static rt_node_class_test_elem rt_node_class_tests[] = +{ + { + .class_name = "node-4", /* RT_CLASS_4 */ + .nkeys = 2, + }, + { + .class_name = "node-16-lo", /* RT_CLASS_16_LO */ + .nkeys = 15, + }, + { + .class_name = "node-16-hi", /* RT_CLASS_16_HI */ + .nkeys = 30, + }, + { + .class_name = "node-48", /* RT_CLASS_48 */ + .nkeys = 60, + }, + { + .class_name = "node-256", /* RT_CLASS_256 */ + .nkeys = 256, + }, +}; + + +/* define the radix tree implementation to test */ +#define RT_PREFIX rt +#define RT_SCOPE +#define RT_DECLARE +#define RT_DEFINE +#define RT_USE_DELETE +#define RT_VALUE_TYPE TestValueType +#ifdef TEST_SHARED_RT +#define RT_SHMEM +#endif +#define RT_DEBUG +#include "lib/radixtree.h" + + +/* + * Return the number of keys in the radix tree. + */ +static uint64 +rt_num_entries(rt_radix_tree *tree) +{ + return tree->ctl->num_keys; +} + +PG_MODULE_MAGIC; + +PG_FUNCTION_INFO_V1(test_radixtree); + +static void +test_empty(void) +{ + MemoryContext radixtree_ctx; + rt_radix_tree *radixtree; + rt_iter *iter; + uint64 key; +#ifdef TEST_SHARED_RT + int tranche_id = LWLockNewTrancheId(); + dsa_area *dsa; +#endif + + radixtree_ctx = AllocSetContextCreate(CurrentMemoryContext, + "test_radix_tree", + ALLOCSET_SMALL_SIZES); + +#ifdef TEST_SHARED_RT + LWLockRegisterTranche(tranche_id, "test_radix_tree"); + dsa = dsa_create(tranche_id); + + radixtree = rt_create(radixtree_ctx, dsa, tranche_id); +#else + radixtree = rt_create(radixtree_ctx); +#endif + + /* Should not find anything in an empty tree */ + EXPECT_TRUE(rt_find(radixtree, 0) == NULL); + EXPECT_TRUE(rt_find(radixtree, 1) == NULL); + EXPECT_TRUE(rt_find(radixtree, PG_UINT64_MAX) == NULL); + EXPECT_FALSE(rt_delete(radixtree, 0)); + EXPECT_TRUE(rt_num_entries(radixtree) == 0); + + /* Iterating on an empty tree should not return anything */ + iter = rt_begin_iterate(radixtree); + EXPECT_TRUE(rt_iterate_next(iter, &key) == NULL); + rt_end_iterate(iter); + + rt_free(radixtree); + +#ifdef TEST_SHARED_RT + dsa_detach(dsa); +#endif +} + +/* Basic set, find, and delete tests */ +static void +test_basic(rt_node_class_test_elem *test_info, int shift, bool asc) +{ + MemoryContext radixtree_ctx; + rt_radix_tree *radixtree; + rt_iter *iter; + uint64 *keys; + int children = test_info->nkeys; +#ifdef TEST_SHARED_RT + int tranche_id = LWLockNewTrancheId(); + dsa_area *dsa; +#endif + + radixtree_ctx = AllocSetContextCreate(CurrentMemoryContext, + "test_radix_tree", + ALLOCSET_SMALL_SIZES); + +#ifdef TEST_SHARED_RT + LWLockRegisterTranche(tranche_id, "test_radix_tree"); + dsa = dsa_create(tranche_id); + + radixtree = rt_create(radixtree_ctx, dsa, tranche_id); +#else + radixtree = rt_create(radixtree_ctx); +#endif + + elog(NOTICE, "testing node %s with shift %d and %s keys", + test_info->class_name, shift, asc ? "ascending" : "descending"); + + keys = palloc(sizeof(uint64) * children); + for (int i = 0; i < children; i++) + { + if (asc) + keys[i] = (uint64) i << shift; + else + keys[i] = (uint64) (children - 1 - i) << shift; + } + + /* + * Insert keys. Since the tree was just created, rt_set should return + * false. + */ + for (int i = 0; i < children; i++) + EXPECT_FALSE(rt_set(radixtree, keys[i], (TestValueType *) &keys[i])); + + rt_stats(radixtree); + + /* look up keys */ + for (int i = 0; i < children; i++) + { + TestValueType *value; + + value = rt_find(radixtree, keys[i]); + + /* Test rt_find returns the expected value */ + EXPECT_TRUE(value != NULL); + EXPECT_EQ_U64(*value, (TestValueType) keys[i]); + } + + /* update keys */ + for (int i = 0; i < children; i++) + { + TestValueType update = keys[i] + 1; + + /* rt_set should report the key found */ + EXPECT_TRUE(rt_set(radixtree, keys[i], (TestValueType *) &update)); + } + + /* delete and re-insert keys */ + for (int i = 0; i < children; i++) + { + EXPECT_TRUE(rt_delete(radixtree, keys[i])); + EXPECT_FALSE(rt_set(radixtree, keys[i], (TestValueType *) &keys[i])); + } + + /* look up keys after deleting and re-inserting */ + for (int i = 0; i < children; i++) + { + TestValueType *value; + + value = rt_find(radixtree, keys[i]); + + /* Test that rt_find returns the expected value */ + EXPECT_TRUE(value != NULL); + EXPECT_EQ_U64(*value, (TestValueType) keys[i]); + } + + /* test that iteration returns the expected keys and values */ + iter = rt_begin_iterate(radixtree); + + for (int i = 0; i < children; i++) + { + uint64 expected; + uint64 iterkey; + TestValueType *iterval; + + /* iteration is ordered by key, so adjust expected value accordingly */ + if (asc) + expected = keys[i]; + else + expected = keys[children - 1 - i]; + + iterval = rt_iterate_next(iter, &iterkey); + + EXPECT_TRUE(iterval != NULL); + EXPECT_EQ_U64(iterkey, expected); + EXPECT_EQ_U64(*iterval, expected); + } + + rt_end_iterate(iter); + + /* delete all keys again */ + for (int i = 0; i < children; i++) + EXPECT_TRUE(rt_delete(radixtree, keys[i])); + + /* test that all keys were deleted */ + for (int i = 0; i < children; i++) + EXPECT_TRUE(rt_find(radixtree, keys[i]) == NULL); + + rt_stats(radixtree); + + pfree(keys); + rt_free(radixtree); + +#ifdef TEST_SHARED_RT + dsa_detach(dsa); +#endif +} + +static int +key_cmp(const void *a, const void *b) +{ + return pg_cmp_u64(*(const uint64 *) a, *(const uint64 *) b); +} + +static void +test_random(void) +{ + MemoryContext radixtree_ctx; + rt_radix_tree *radixtree; + rt_iter *iter; + pg_prng_state state; + + /* limit memory usage by limiting the key space */ + uint64 filter = ((uint64) (0x07 << 24) | (0xFF << 16) | 0xFF); + uint64 seed = GetCurrentTimestamp(); + int num_keys = 100000; + uint64 *keys; +#ifdef TEST_SHARED_RT + int tranche_id = LWLockNewTrancheId(); + dsa_area *dsa; +#endif + + radixtree_ctx = AllocSetContextCreate(CurrentMemoryContext, + "test_radix_tree", + ALLOCSET_SMALL_SIZES); + +#ifdef TEST_SHARED_RT + LWLockRegisterTranche(tranche_id, "test_radix_tree"); + dsa = dsa_create(tranche_id); + + radixtree = rt_create(radixtree_ctx, dsa, tranche_id); +#else + radixtree = rt_create(radixtree_ctx); +#endif + + /* add some random values */ + pg_prng_seed(&state, seed); + keys = (TestValueType *) palloc(sizeof(uint64) * num_keys); + for (uint64 i = 0; i < num_keys; i++) + { + uint64 key = pg_prng_uint64(&state) & filter; + TestValueType val = (TestValueType) key; + + /* save in an array */ + keys[i] = key; + + rt_set(radixtree, key, &val); + } + + rt_stats(radixtree); + + for (uint64 i = 0; i < num_keys; i++) + { + TestValueType *value; + + value = rt_find(radixtree, keys[i]); + + /* Test rt_find for values just inserted */ + EXPECT_TRUE(value != NULL); + EXPECT_EQ_U64(*value, keys[i]); + } + + /* sort keys for iteration and absence tests */ + qsort(keys, num_keys, sizeof(uint64), key_cmp); + + /* should not find numbers in between the keys */ + for (uint64 i = 0; i < num_keys - 1; i++) + { + TestValueType *value; + + /* skip duplicate and adjacent keys */ + if (keys[i + 1] == keys[i] || keys[i + 1] == keys[i] + 1) + continue; + + /* should not find the number right after key */ + value = rt_find(radixtree, keys[i] + 1); + EXPECT_TRUE(value == NULL); + } + + /* should not find numbers lower than lowest key */ + for (uint64 key = 0; key < keys[0]; key++) + { + TestValueType *value; + + /* arbitrary stopping point */ + if (key > 10000) + break; + + value = rt_find(radixtree, key); + EXPECT_TRUE(value == NULL); + } + + /* should not find numbers higher than highest key */ + for (uint64 i = 1; i < 10000; i++) + { + TestValueType *value; + + value = rt_find(radixtree, keys[num_keys - 1] + i); + EXPECT_TRUE(value == NULL); + } + + /* test that iteration returns the expected keys and values */ + iter = rt_begin_iterate(radixtree); + + for (int i = 0; i < num_keys; i++) + { + uint64 expected; + uint64 iterkey; + TestValueType *iterval; + + /* skip duplicate keys */ + if (i < num_keys - 1 && keys[i + 1] == keys[i]) + continue; + + expected = keys[i]; + iterval = rt_iterate_next(iter, &iterkey); + + EXPECT_TRUE(iterval != NULL); + EXPECT_EQ_U64(iterkey, expected); + EXPECT_EQ_U64(*iterval, expected); + } + + rt_end_iterate(iter); + + /* reset random number generator for deletion */ + pg_prng_seed(&state, seed); + + /* delete in original random order */ + for (uint64 i = 0; i < num_keys; i++) + { + uint64 key = pg_prng_uint64(&state) & filter; + + rt_delete(radixtree, key); + } + + EXPECT_TRUE(rt_num_entries(radixtree) == 0); + + pfree(keys); + rt_free(radixtree); + +#ifdef TEST_SHARED_RT + dsa_detach(dsa); +#endif +} + +Datum +test_radixtree(PG_FUNCTION_ARGS) +{ + /* borrowed from RT_MAX_SHIFT */ + const int max_shift = (sizeof(uint64) - 1) * BITS_PER_BYTE; + + test_empty(); + + for (int i = 0; i < lengthof(rt_node_class_tests); i++) + { + rt_node_class_test_elem *test_info = &(rt_node_class_tests[i]); + + /* a tree with one level, i.e. a single node under the root node */ + test_basic(test_info, 0, true); + test_basic(test_info, 0, false); + + /* a tree with two levels */ + test_basic(test_info, 8, true); + test_basic(test_info, 8, false); + + /* a tree with the maximum number of levels */ + test_basic(test_info, max_shift, true); + test_basic(test_info, max_shift, false); + } + + test_random(); + + PG_RETURN_VOID(); +} diff --git a/src/test/modules/test_radixtree/test_radixtree.control b/src/test/modules/test_radixtree/test_radixtree.control new file mode 100644 index 0000000000000..e53f2a3e0cbcf --- /dev/null +++ b/src/test/modules/test_radixtree/test_radixtree.control @@ -0,0 +1,4 @@ +comment = 'Test code for radix tree' +default_version = '1.0' +module_pathname = '$libdir/test_radixtree' +relocatable = true diff --git a/src/test/modules/test_rbtree/meson.build b/src/test/modules/test_rbtree/meson.build index 47a921da90c2c..baa7665349685 100644 --- a/src/test/modules/test_rbtree/meson.build +++ b/src/test/modules/test_rbtree/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_rbtree_sources = files( 'test_rbtree.c', diff --git a/src/test/modules/test_rbtree/test_rbtree.c b/src/test/modules/test_rbtree/test_rbtree.c index e4eb154378ad8..3e76d27bf101e 100644 --- a/src/test/modules/test_rbtree/test_rbtree.c +++ b/src/test/modules/test_rbtree/test_rbtree.c @@ -3,7 +3,7 @@ * test_rbtree.c * Test correctness of red-black tree operations. * - * Copyright (c) 2009-2023, PostgreSQL Global Development Group + * Copyright (c) 2009-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_rbtree/test_rbtree.c diff --git a/src/test/modules/test_regex/expected/test_regex.out b/src/test/modules/test_regex/expected/test_regex.out index 731ba506d3545..c44c717edf4cf 100644 --- a/src/test/modules/test_regex/expected/test_regex.out +++ b/src/test/modules/test_regex/expected/test_regex.out @@ -2071,6 +2071,20 @@ select * from test_regex('[\s\S]*', '012 3456789abc_*', 'LNPE'); {"012 3456789abc_*"} (2 rows) +-- bug #18708: +select * from test_regex('(?:[^\d\D]){0}', '0123456789abc*', 'LNPQE'); + test_regex +-------------------------------------------------------------------- + {0,REG_UBOUNDS,REG_UBBS,REG_UNONPOSIX,REG_ULOCALE,REG_UEMPTYMATCH} + {""} +(2 rows) + +select * from test_regex('[^\d\D]', '0123456789abc*', 'ILPE'); + test_regex +-------------------------------------------------------- + {0,REG_UBBS,REG_UNONPOSIX,REG_ULOCALE,REG_UIMPOSSIBLE} +(1 row) + -- check char classes' handling of newlines select * from test_regex('\s+', E'abc \n def', 'LP'); test_regex diff --git a/src/test/modules/test_regex/meson.build b/src/test/modules/test_regex/meson.build index bb0557078b574..254d29834ff3b 100644 --- a/src/test/modules/test_regex/meson.build +++ b/src/test/modules/test_regex/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_regex_sources = files( 'test_regex.c', diff --git a/src/test/modules/test_regex/sql/test_regex.sql b/src/test/modules/test_regex/sql/test_regex.sql index 478fa2c547528..b2a847577e805 100644 --- a/src/test/modules/test_regex/sql/test_regex.sql +++ b/src/test/modules/test_regex/sql/test_regex.sql @@ -619,6 +619,9 @@ select * from test_regex('[^1\D0]', 'abc0123456789*', 'LPE'); select * from test_regex('\W', '0123456789abc_*', 'LP'); select * from test_regex('[\W]', '0123456789abc_*', 'LPE'); select * from test_regex('[\s\S]*', '012 3456789abc_*', 'LNPE'); +-- bug #18708: +select * from test_regex('(?:[^\d\D]){0}', '0123456789abc*', 'LNPQE'); +select * from test_regex('[^\d\D]', '0123456789abc*', 'ILPE'); -- check char classes' handling of newlines select * from test_regex('\s+', E'abc \n def', 'LP'); diff --git a/src/test/modules/test_regex/test_regex.c b/src/test/modules/test_regex/test_regex.c index d1dd48a993bf3..c4ef15d7425bf 100644 --- a/src/test/modules/test_regex/test_regex.c +++ b/src/test/modules/test_regex/test_regex.c @@ -3,7 +3,7 @@ * test_regex.c * Test harness for the regular expression package. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION diff --git a/src/test/modules/test_resowner/.gitignore b/src/test/modules/test_resowner/.gitignore new file mode 100644 index 0000000000000..5dcb3ff972350 --- /dev/null +++ b/src/test/modules/test_resowner/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ diff --git a/src/test/modules/test_resowner/Makefile b/src/test/modules/test_resowner/Makefile new file mode 100644 index 0000000000000..d28da3c2869ac --- /dev/null +++ b/src/test/modules/test_resowner/Makefile @@ -0,0 +1,24 @@ +# src/test/modules/test_resowner/Makefile + +MODULE_big = test_resowner +OBJS = \ + $(WIN32RES) \ + test_resowner_basic.o \ + test_resowner_many.o +PGFILEDESC = "test_resowner - test code for ResourceOwners" + +EXTENSION = test_resowner +DATA = test_resowner--1.0.sql + +REGRESS = test_resowner + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/test_resowner +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/src/test/modules/test_resowner/expected/test_resowner.out b/src/test/modules/test_resowner/expected/test_resowner.out new file mode 100644 index 0000000000000..527b678fc1280 --- /dev/null +++ b/src/test/modules/test_resowner/expected/test_resowner.out @@ -0,0 +1,197 @@ +CREATE EXTENSION test_resowner; +-- This is small enough that everything fits in the small array +SELECT test_resowner_priorities(2, 3); +NOTICE: releasing resources before locks +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing locks +NOTICE: releasing resources after locks +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 2 + test_resowner_priorities +-------------------------- + +(1 row) + +-- Same test with more resources, to exercise the hash table +SELECT test_resowner_priorities(2, 32); +NOTICE: releasing resources before locks +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 1 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: child before locks priority 2 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 1 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing string: parent before locks priority 2 +NOTICE: releasing locks +NOTICE: releasing resources after locks +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 1 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: child after locks priority 2 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 1 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 +NOTICE: releasing string: parent after locks priority 2 + test_resowner_priorities +-------------------------- + +(1 row) + +-- Basic test with lots more resources, to test extending the hash table +SELECT test_resowner_many( + 3, -- # of different resource kinds + 100000, -- before-locks resources to remember + 500, -- before-locks resources to forget + 100000, -- after-locks resources to remember + 500 -- after-locks resources to forget +); +NOTICE: remembering 100000 before-locks resources +NOTICE: remembering 100000 after-locks resources +NOTICE: forgetting 500 before-locks resources +NOTICE: forgetting 500 after-locks resources +NOTICE: releasing resources before locks +NOTICE: releasing locks +NOTICE: releasing resources after locks + test_resowner_many +-------------------- + +(1 row) + +-- Test resource leak warning +SELECT test_resowner_leak(); +WARNING: resource was not closed: test string "my string" +NOTICE: releasing string: my string + test_resowner_leak +-------------------- + +(1 row) + +-- Negative tests, using a resource owner after release-phase has started. +set client_min_messages='warning'; -- order between ERROR and NOTICE varies +SELECT test_resowner_remember_between_phases(); +ERROR: ResourceOwnerEnlarge called after release started +SELECT test_resowner_forget_between_phases(); +ERROR: ResourceOwnerForget called for test resource after release started +reset client_min_messages; diff --git a/src/test/modules/test_resowner/meson.build b/src/test/modules/test_resowner/meson.build new file mode 100644 index 0000000000000..6ab2eec0b2f8e --- /dev/null +++ b/src/test/modules/test_resowner/meson.build @@ -0,0 +1,34 @@ +# Copyright (c) 2022-2024, PostgreSQL Global Development Group + +test_resowner_sources = files( + 'test_resowner_basic.c', + 'test_resowner_many.c', +) + +if host_system == 'windows' + test_resowner_sources += rc_lib_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'test_resowner', + '--FILEDESC', 'test_resowner - test code for ResourceOwners',]) +endif + +test_resowner = shared_module('test_resowner', + test_resowner_sources, + kwargs: pg_test_mod_args, +) +test_install_libs += test_resowner + +test_install_data += files( + 'test_resowner.control', + 'test_resowner--1.0.sql', +) + +tests += { + 'name': 'test_resowner', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'regress': { + 'sql': [ + 'test_resowner', + ], + }, +} diff --git a/src/test/modules/test_resowner/sql/test_resowner.sql b/src/test/modules/test_resowner/sql/test_resowner.sql new file mode 100644 index 0000000000000..23284b7c8b91c --- /dev/null +++ b/src/test/modules/test_resowner/sql/test_resowner.sql @@ -0,0 +1,25 @@ +CREATE EXTENSION test_resowner; + +-- This is small enough that everything fits in the small array +SELECT test_resowner_priorities(2, 3); + +-- Same test with more resources, to exercise the hash table +SELECT test_resowner_priorities(2, 32); + +-- Basic test with lots more resources, to test extending the hash table +SELECT test_resowner_many( + 3, -- # of different resource kinds + 100000, -- before-locks resources to remember + 500, -- before-locks resources to forget + 100000, -- after-locks resources to remember + 500 -- after-locks resources to forget +); + +-- Test resource leak warning +SELECT test_resowner_leak(); + +-- Negative tests, using a resource owner after release-phase has started. +set client_min_messages='warning'; -- order between ERROR and NOTICE varies +SELECT test_resowner_remember_between_phases(); +SELECT test_resowner_forget_between_phases(); +reset client_min_messages; diff --git a/src/test/modules/test_resowner/test_resowner--1.0.sql b/src/test/modules/test_resowner/test_resowner--1.0.sql new file mode 100644 index 0000000000000..26fed7a010ca8 --- /dev/null +++ b/src/test/modules/test_resowner/test_resowner--1.0.sql @@ -0,0 +1,30 @@ +/* src/test/modules/test_resowner/test_resowner--1.0.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION test_resowner" to load this file. \quit + +CREATE FUNCTION test_resowner_priorities(nkinds pg_catalog.int4, nresources pg_catalog.int4) + RETURNS pg_catalog.void + AS 'MODULE_PATHNAME' LANGUAGE C; + +CREATE FUNCTION test_resowner_leak() + RETURNS pg_catalog.void + AS 'MODULE_PATHNAME' LANGUAGE C; + +CREATE FUNCTION test_resowner_remember_between_phases() + RETURNS pg_catalog.void + AS 'MODULE_PATHNAME' LANGUAGE C; + +CREATE FUNCTION test_resowner_forget_between_phases() + RETURNS pg_catalog.void + AS 'MODULE_PATHNAME' LANGUAGE C; + +CREATE FUNCTION test_resowner_many( + nkinds pg_catalog.int4, + nremember_bl pg_catalog.int4, + nforget_bl pg_catalog.int4, + nremember_al pg_catalog.int4, + nforget_al pg_catalog.int4 +) + RETURNS pg_catalog.void + AS 'MODULE_PATHNAME' LANGUAGE C; diff --git a/src/test/modules/test_resowner/test_resowner.control b/src/test/modules/test_resowner/test_resowner.control new file mode 100644 index 0000000000000..b56c4ee92bd4e --- /dev/null +++ b/src/test/modules/test_resowner/test_resowner.control @@ -0,0 +1,4 @@ +comment = 'Test code for ResourceOwners' +default_version = '1.0' +module_pathname = '$libdir/test_resowner' +relocatable = true diff --git a/src/test/modules/test_resowner/test_resowner_basic.c b/src/test/modules/test_resowner/test_resowner_basic.c new file mode 100644 index 0000000000000..558cf1de56ebd --- /dev/null +++ b/src/test/modules/test_resowner/test_resowner_basic.c @@ -0,0 +1,211 @@ +/*-------------------------------------------------------------------------- + * + * test_resowner_basic.c + * Test basic ResourceOwner functionality + * + * Copyright (c) 2022-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/test/modules/test_resowner/test_resowner_basic.c + * + * ------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "fmgr.h" +#include "lib/ilist.h" +#include "utils/memutils.h" +#include "utils/resowner.h" + +PG_MODULE_MAGIC; + +static void ReleaseString(Datum res); +static char *PrintString(Datum res); + +/* + * A resource that tracks strings and prints the string when it's released. + * This makes the order that the resources are released visible. + */ +static const ResourceOwnerDesc string_desc = { + .name = "test resource", + .release_phase = RESOURCE_RELEASE_AFTER_LOCKS, + .release_priority = RELEASE_PRIO_FIRST, + .ReleaseResource = ReleaseString, + .DebugPrint = PrintString +}; + +static void +ReleaseString(Datum res) +{ + elog(NOTICE, "releasing string: %s", DatumGetPointer(res)); +} + +static char * +PrintString(Datum res) +{ + return psprintf("test string \"%s\"", DatumGetPointer(res)); +} + +/* demonstrates phases and priorities between a parent and child context */ +PG_FUNCTION_INFO_V1(test_resowner_priorities); +Datum +test_resowner_priorities(PG_FUNCTION_ARGS) +{ + int32 nkinds = PG_GETARG_INT32(0); + int32 nresources = PG_GETARG_INT32(1); + ResourceOwner parent, + child; + ResourceOwnerDesc *before_desc; + ResourceOwnerDesc *after_desc; + + if (nkinds <= 0) + elog(ERROR, "nkinds must be greater than zero"); + if (nresources <= 0) + elog(ERROR, "nresources must be greater than zero"); + + parent = ResourceOwnerCreate(CurrentResourceOwner, "test parent"); + child = ResourceOwnerCreate(parent, "test child"); + + before_desc = palloc(nkinds * sizeof(ResourceOwnerDesc)); + for (int i = 0; i < nkinds; i++) + { + before_desc[i].name = psprintf("test resource before locks %d", i); + before_desc[i].release_phase = RESOURCE_RELEASE_BEFORE_LOCKS; + before_desc[i].release_priority = RELEASE_PRIO_FIRST + i; + before_desc[i].ReleaseResource = ReleaseString; + before_desc[i].DebugPrint = PrintString; + } + after_desc = palloc(nkinds * sizeof(ResourceOwnerDesc)); + for (int i = 0; i < nkinds; i++) + { + after_desc[i].name = psprintf("test resource after locks %d", i); + after_desc[i].release_phase = RESOURCE_RELEASE_AFTER_LOCKS; + after_desc[i].release_priority = RELEASE_PRIO_FIRST + i; + after_desc[i].ReleaseResource = ReleaseString; + after_desc[i].DebugPrint = PrintString; + } + + /* Add a bunch of resources to child, with different priorities */ + for (int i = 0; i < nresources; i++) + { + ResourceOwnerDesc *kind = &before_desc[i % nkinds]; + + ResourceOwnerEnlarge(child); + ResourceOwnerRemember(child, + CStringGetDatum(psprintf("child before locks priority %d", kind->release_priority)), + kind); + } + for (int i = 0; i < nresources; i++) + { + ResourceOwnerDesc *kind = &after_desc[i % nkinds]; + + ResourceOwnerEnlarge(child); + ResourceOwnerRemember(child, + CStringGetDatum(psprintf("child after locks priority %d", kind->release_priority)), + kind); + } + + /* And also to the parent */ + for (int i = 0; i < nresources; i++) + { + ResourceOwnerDesc *kind = &after_desc[i % nkinds]; + + ResourceOwnerEnlarge(parent); + ResourceOwnerRemember(parent, + CStringGetDatum(psprintf("parent after locks priority %d", kind->release_priority)), + kind); + } + for (int i = 0; i < nresources; i++) + { + ResourceOwnerDesc *kind = &before_desc[i % nkinds]; + + ResourceOwnerEnlarge(parent); + ResourceOwnerRemember(parent, + CStringGetDatum(psprintf("parent before locks priority %d", kind->release_priority)), + kind); + } + + elog(NOTICE, "releasing resources before locks"); + ResourceOwnerRelease(parent, RESOURCE_RELEASE_BEFORE_LOCKS, false, false); + elog(NOTICE, "releasing locks"); + ResourceOwnerRelease(parent, RESOURCE_RELEASE_LOCKS, false, false); + elog(NOTICE, "releasing resources after locks"); + ResourceOwnerRelease(parent, RESOURCE_RELEASE_AFTER_LOCKS, false, false); + + ResourceOwnerDelete(parent); + + PG_RETURN_VOID(); +} + +PG_FUNCTION_INFO_V1(test_resowner_leak); +Datum +test_resowner_leak(PG_FUNCTION_ARGS) +{ + ResourceOwner resowner; + + resowner = ResourceOwnerCreate(CurrentResourceOwner, "TestOwner"); + + ResourceOwnerEnlarge(resowner); + + ResourceOwnerRemember(resowner, CStringGetDatum("my string"), &string_desc); + + /* don't call ResourceOwnerForget, so that it is leaked */ + + ResourceOwnerRelease(resowner, RESOURCE_RELEASE_BEFORE_LOCKS, true, false); + ResourceOwnerRelease(resowner, RESOURCE_RELEASE_LOCKS, true, false); + ResourceOwnerRelease(resowner, RESOURCE_RELEASE_AFTER_LOCKS, true, false); + + ResourceOwnerDelete(resowner); + + PG_RETURN_VOID(); +} + +PG_FUNCTION_INFO_V1(test_resowner_remember_between_phases); +Datum +test_resowner_remember_between_phases(PG_FUNCTION_ARGS) +{ + ResourceOwner resowner; + + resowner = ResourceOwnerCreate(CurrentResourceOwner, "TestOwner"); + + ResourceOwnerRelease(resowner, RESOURCE_RELEASE_BEFORE_LOCKS, true, false); + + /* + * Try to remember a new resource. Fails because we already called + * ResourceOwnerRelease. + */ + ResourceOwnerEnlarge(resowner); + ResourceOwnerRemember(resowner, CStringGetDatum("my string"), &string_desc); + + /* unreachable */ + elog(ERROR, "ResourceOwnerEnlarge should have errored out"); + + PG_RETURN_VOID(); +} + +PG_FUNCTION_INFO_V1(test_resowner_forget_between_phases); +Datum +test_resowner_forget_between_phases(PG_FUNCTION_ARGS) +{ + ResourceOwner resowner; + Datum str_resource; + + resowner = ResourceOwnerCreate(CurrentResourceOwner, "TestOwner"); + + ResourceOwnerEnlarge(resowner); + str_resource = CStringGetDatum("my string"); + ResourceOwnerRemember(resowner, str_resource, &string_desc); + + ResourceOwnerRelease(resowner, RESOURCE_RELEASE_BEFORE_LOCKS, true, false); + + /* + * Try to forget the resource that was remembered earlier. Fails because + * we already called ResourceOwnerRelease. + */ + ResourceOwnerForget(resowner, str_resource, &string_desc); + + /* unreachable */ + elog(ERROR, "ResourceOwnerForget should have errored out"); + + PG_RETURN_VOID(); +} diff --git a/src/test/modules/test_resowner/test_resowner_many.c b/src/test/modules/test_resowner/test_resowner_many.c new file mode 100644 index 0000000000000..7808c9e5df336 --- /dev/null +++ b/src/test/modules/test_resowner/test_resowner_many.c @@ -0,0 +1,296 @@ +/*-------------------------------------------------------------------------- + * + * test_resowner_many.c + * Test ResourceOwner functionality with lots of resources + * + * Copyright (c) 2022-2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/test/modules/test_resowner/test_resowner_many.c + * + * ------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "fmgr.h" +#include "lib/ilist.h" +#include "utils/memutils.h" +#include "utils/resowner.h" + +/* + * Define a custom resource type to use in the test. The resource being + * tracked is a palloc'd ManyTestResource struct. + * + * To cross-check that the ResourceOwner calls the callback functions + * correctly, we keep track of the remembered resources ourselves in a linked + * list, and also keep counters of how many times the callback functions have + * been called. + */ +typedef struct +{ + ResourceOwnerDesc desc; + int nremembered; + int nforgotten; + int nreleased; + int nleaked; + + dlist_head current_resources; +} ManyTestResourceKind; + +typedef struct +{ + ManyTestResourceKind *kind; + dlist_node node; +} ManyTestResource; + +/* + * Current release phase, and priority of last call to the release callback. + * This is used to check that the resources are released in correct order. + */ +static ResourceReleasePhase current_release_phase; +static uint32 last_release_priority = 0; + +/* prototypes for local functions */ +static void ReleaseManyTestResource(Datum res); +static char *PrintManyTest(Datum res); +static void InitManyTestResourceKind(ManyTestResourceKind *kind, char *name, + ResourceReleasePhase phase, uint32 priority); +static void RememberManyTestResources(ResourceOwner owner, + ManyTestResourceKind *kinds, int nkinds, + int nresources); +static void ForgetManyTestResources(ResourceOwner owner, + ManyTestResourceKind *kinds, int nkinds, + int nresources); +static int GetTotalResourceCount(ManyTestResourceKind *kinds, int nkinds); + +/* ResourceOwner callback */ +static void +ReleaseManyTestResource(Datum res) +{ + ManyTestResource *mres = (ManyTestResource *) DatumGetPointer(res); + + elog(DEBUG1, "releasing resource %p from %s", mres, mres->kind->desc.name); + Assert(last_release_priority <= mres->kind->desc.release_priority); + + dlist_delete(&mres->node); + mres->kind->nreleased++; + last_release_priority = mres->kind->desc.release_priority; + pfree(mres); +} + +/* ResourceOwner callback */ +static char * +PrintManyTest(Datum res) +{ + ManyTestResource *mres = (ManyTestResource *) DatumGetPointer(res); + + /* + * XXX: we assume that the DebugPrint function is called once for each + * leaked resource, and that there are no other callers. + */ + mres->kind->nleaked++; + + return psprintf("many-test resource from %s", mres->kind->desc.name); +} + +static void +InitManyTestResourceKind(ManyTestResourceKind *kind, char *name, + ResourceReleasePhase phase, uint32 priority) +{ + kind->desc.name = name; + kind->desc.release_phase = phase; + kind->desc.release_priority = priority; + kind->desc.ReleaseResource = ReleaseManyTestResource; + kind->desc.DebugPrint = PrintManyTest; + kind->nremembered = 0; + kind->nforgotten = 0; + kind->nreleased = 0; + kind->nleaked = 0; + dlist_init(&kind->current_resources); +} + +/* + * Remember 'nresources' resources. The resources are remembered in round + * robin fashion with the kinds from 'kinds' array. + */ +static void +RememberManyTestResources(ResourceOwner owner, + ManyTestResourceKind *kinds, int nkinds, + int nresources) +{ + int kind_idx = 0; + + for (int i = 0; i < nresources; i++) + { + ManyTestResource *mres = palloc(sizeof(ManyTestResource)); + + mres->kind = &kinds[kind_idx]; + dlist_node_init(&mres->node); + + ResourceOwnerEnlarge(owner); + ResourceOwnerRemember(owner, PointerGetDatum(mres), &kinds[kind_idx].desc); + kinds[kind_idx].nremembered++; + dlist_push_tail(&kinds[kind_idx].current_resources, &mres->node); + + elog(DEBUG1, "remembered resource %p from %s", mres, mres->kind->desc.name); + + kind_idx = (kind_idx + 1) % nkinds; + } +} + +/* + * Forget 'nresources' resources, in round robin fashion from 'kinds'. + */ +static void +ForgetManyTestResources(ResourceOwner owner, + ManyTestResourceKind *kinds, int nkinds, + int nresources) +{ + int kind_idx = 0; + int ntotal; + + ntotal = GetTotalResourceCount(kinds, nkinds); + if (ntotal < nresources) + elog(PANIC, "cannot free %d resources, only %d remembered", nresources, ntotal); + + for (int i = 0; i < nresources; i++) + { + bool found = false; + + for (int j = 0; j < nkinds; j++) + { + kind_idx = (kind_idx + 1) % nkinds; + if (!dlist_is_empty(&kinds[kind_idx].current_resources)) + { + ManyTestResource *mres = dlist_head_element(ManyTestResource, node, &kinds[kind_idx].current_resources); + + ResourceOwnerForget(owner, PointerGetDatum(mres), &kinds[kind_idx].desc); + kinds[kind_idx].nforgotten++; + dlist_delete(&mres->node); + pfree(mres); + + found = true; + break; + } + } + if (!found) + elog(ERROR, "could not find a test resource to forget"); + } +} + +/* + * Get total number of currently active resources among 'kinds'. + */ +static int +GetTotalResourceCount(ManyTestResourceKind *kinds, int nkinds) +{ + int ntotal = 0; + + for (int i = 0; i < nkinds; i++) + ntotal += kinds[i].nremembered - kinds[i].nforgotten - kinds[i].nreleased; + + return ntotal; +} + +/* + * Remember lots of resources, belonging to 'nkinds' different resource types + * with different priorities. Then forget some of them, and finally, release + * the resource owner. We use a custom resource type that performs various + * sanity checks to verify that all the resources are released, and in the + * correct order. + */ +PG_FUNCTION_INFO_V1(test_resowner_many); +Datum +test_resowner_many(PG_FUNCTION_ARGS) +{ + int32 nkinds = PG_GETARG_INT32(0); + int32 nremember_bl = PG_GETARG_INT32(1); + int32 nforget_bl = PG_GETARG_INT32(2); + int32 nremember_al = PG_GETARG_INT32(3); + int32 nforget_al = PG_GETARG_INT32(4); + + ResourceOwner resowner; + + ManyTestResourceKind *before_kinds; + ManyTestResourceKind *after_kinds; + + /* Sanity check the arguments */ + if (nkinds < 0) + elog(ERROR, "nkinds must be >= 0"); + if (nremember_bl < 0) + elog(ERROR, "nremember_bl must be >= 0"); + if (nforget_bl < 0 || nforget_bl > nremember_bl) + elog(ERROR, "nforget_bl must between 0 and 'nremember_bl'"); + if (nremember_al < 0) + elog(ERROR, "nremember_al must be greater than zero"); + if (nforget_al < 0 || nforget_al > nremember_al) + elog(ERROR, "nforget_al must between 0 and 'nremember_al'"); + + /* Initialize all the different resource kinds to use */ + before_kinds = palloc(nkinds * sizeof(ManyTestResourceKind)); + for (int i = 0; i < nkinds; i++) + { + InitManyTestResourceKind(&before_kinds[i], + psprintf("resource before locks %d", i), + RESOURCE_RELEASE_BEFORE_LOCKS, + RELEASE_PRIO_FIRST + i); + } + after_kinds = palloc(nkinds * sizeof(ManyTestResourceKind)); + for (int i = 0; i < nkinds; i++) + { + InitManyTestResourceKind(&after_kinds[i], + psprintf("resource after locks %d", i), + RESOURCE_RELEASE_AFTER_LOCKS, + RELEASE_PRIO_FIRST + i); + } + + resowner = ResourceOwnerCreate(CurrentResourceOwner, "TestOwner"); + + /* Remember a bunch of resources */ + if (nremember_bl > 0) + { + elog(NOTICE, "remembering %d before-locks resources", nremember_bl); + RememberManyTestResources(resowner, before_kinds, nkinds, nremember_bl); + } + if (nremember_al > 0) + { + elog(NOTICE, "remembering %d after-locks resources", nremember_al); + RememberManyTestResources(resowner, after_kinds, nkinds, nremember_al); + } + + /* Forget what was remembered */ + if (nforget_bl > 0) + { + elog(NOTICE, "forgetting %d before-locks resources", nforget_bl); + ForgetManyTestResources(resowner, before_kinds, nkinds, nforget_bl); + } + + if (nforget_al > 0) + { + elog(NOTICE, "forgetting %d after-locks resources", nforget_al); + ForgetManyTestResources(resowner, after_kinds, nkinds, nforget_al); + } + + /* Start releasing */ + elog(NOTICE, "releasing resources before locks"); + current_release_phase = RESOURCE_RELEASE_BEFORE_LOCKS; + last_release_priority = 0; + ResourceOwnerRelease(resowner, RESOURCE_RELEASE_BEFORE_LOCKS, false, false); + Assert(GetTotalResourceCount(before_kinds, nkinds) == 0); + + elog(NOTICE, "releasing locks"); + current_release_phase = RESOURCE_RELEASE_LOCKS; + last_release_priority = 0; + ResourceOwnerRelease(resowner, RESOURCE_RELEASE_LOCKS, false, false); + + elog(NOTICE, "releasing resources after locks"); + current_release_phase = RESOURCE_RELEASE_AFTER_LOCKS; + last_release_priority = 0; + ResourceOwnerRelease(resowner, RESOURCE_RELEASE_AFTER_LOCKS, false, false); + Assert(GetTotalResourceCount(before_kinds, nkinds) == 0); + Assert(GetTotalResourceCount(after_kinds, nkinds) == 0); + + ResourceOwnerDelete(resowner); + + PG_RETURN_VOID(); +} diff --git a/src/test/modules/test_rls_hooks/meson.build b/src/test/modules/test_rls_hooks/meson.build index 382e9933e6efd..2ea478024de45 100644 --- a/src/test/modules/test_rls_hooks/meson.build +++ b/src/test/modules/test_rls_hooks/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_rls_hooks_sources = files( 'test_rls_hooks.c', diff --git a/src/test/modules/test_rls_hooks/test_rls_hooks.c b/src/test/modules/test_rls_hooks/test_rls_hooks.c index b2674c3714b46..358e28edb4590 100644 --- a/src/test/modules/test_rls_hooks/test_rls_hooks.c +++ b/src/test/modules/test_rls_hooks/test_rls_hooks.c @@ -3,7 +3,7 @@ * test_rls_hooks.c * Code for testing RLS hooks. * - * Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Copyright (c) 2015-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_rls_hooks/test_rls_hooks.c diff --git a/src/test/modules/test_rls_hooks/test_rls_hooks.h b/src/test/modules/test_rls_hooks/test_rls_hooks.h index 9dc92df2561b7..306a0adeba342 100644 --- a/src/test/modules/test_rls_hooks/test_rls_hooks.h +++ b/src/test/modules/test_rls_hooks/test_rls_hooks.h @@ -3,7 +3,7 @@ * test_rls_hooks.h * Definitions for RLS hooks * - * Copyright (c) 2015-2023, PostgreSQL Global Development Group + * Copyright (c) 2015-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_rls_hooks/test_rls_hooks.h diff --git a/src/test/modules/test_shm_mq/meson.build b/src/test/modules/test_shm_mq/meson.build index f24a2ba7f7a5e..1dd2db125d780 100644 --- a/src/test/modules/test_shm_mq/meson.build +++ b/src/test/modules/test_shm_mq/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_shm_mq_sources = files( 'setup.c', diff --git a/src/test/modules/test_shm_mq/setup.c b/src/test/modules/test_shm_mq/setup.c index bec5732e8738d..b3dac44d97a80 100644 --- a/src/test/modules/test_shm_mq/setup.c +++ b/src/test/modules/test_shm_mq/setup.c @@ -5,7 +5,7 @@ * number of background workers for shared memory message queue * testing. * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_shm_mq/setup.c @@ -40,6 +40,9 @@ static void wait_for_workers_to_become_ready(worker_state *wstate, volatile test_shm_mq_header *hdr); static bool check_worker_status(worker_state *wstate); +/* value cached, fetched from shared memory */ +static uint32 we_bgworker_startup = 0; + /* * Set up a dynamic shared memory segment and zero or more background workers * for a test run. @@ -230,7 +233,7 @@ setup_background_workers(int nworkers, dsm_segment *seg) ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_RESOURCES), errmsg("could not register background process"), - errhint("You may need to increase max_worker_processes."))); + errhint("You may need to increase \"max_worker_processes\"."))); ++wstate->nworkers; } @@ -278,9 +281,13 @@ wait_for_workers_to_become_ready(worker_state *wstate, break; } + /* first time, allocate or get the custom wait event */ + if (we_bgworker_startup == 0) + we_bgworker_startup = WaitEventExtensionNew("TestShmMqBgWorkerStartup"); + /* Wait to be signaled. */ (void) WaitLatch(MyLatch, WL_LATCH_SET | WL_EXIT_ON_PM_DEATH, 0, - PG_WAIT_EXTENSION); + we_bgworker_startup); /* Reset the latch so we don't spin. */ ResetLatch(MyLatch); diff --git a/src/test/modules/test_shm_mq/test.c b/src/test/modules/test_shm_mq/test.c index 906e943e2d95d..3d235568b81d4 100644 --- a/src/test/modules/test_shm_mq/test.c +++ b/src/test/modules/test_shm_mq/test.c @@ -3,7 +3,7 @@ * test.c * Test harness code for shared memory message queues. * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_shm_mq/test.c @@ -28,6 +28,9 @@ PG_FUNCTION_INFO_V1(test_shm_mq_pipelined); static void verify_message(Size origlen, char *origdata, Size newlen, char *newdata); +/* value cached, fetched from shared memory */ +static uint32 we_message_queue = 0; + /* * Simple test of the shared memory message queue infrastructure. * @@ -225,6 +228,10 @@ test_shm_mq_pipelined(PG_FUNCTION_ARGS) if (wait) { + /* first time, allocate or get the custom wait event */ + if (we_message_queue == 0) + we_message_queue = WaitEventExtensionNew("TestShmMqMessageQueue"); + /* * If we made no progress, wait for one of the other processes to * which we are connected to set our latch, indicating that they @@ -232,7 +239,7 @@ test_shm_mq_pipelined(PG_FUNCTION_ARGS) * for us to do. */ (void) WaitLatch(MyLatch, WL_LATCH_SET | WL_EXIT_ON_PM_DEATH, 0, - PG_WAIT_EXTENSION); + we_message_queue); ResetLatch(MyLatch); CHECK_FOR_INTERRUPTS(); } diff --git a/src/test/modules/test_shm_mq/test_shm_mq.h b/src/test/modules/test_shm_mq/test_shm_mq.h index 21a2b54bccbf0..0ae7bd64cd0b3 100644 --- a/src/test/modules/test_shm_mq/test_shm_mq.h +++ b/src/test/modules/test_shm_mq/test_shm_mq.h @@ -3,7 +3,7 @@ * test_shm_mq.h * Definitions for shared memory message queues * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_shm_mq/test_shm_mq.h diff --git a/src/test/modules/test_shm_mq/worker.c b/src/test/modules/test_shm_mq/worker.c index 8807727337074..6c4fbc7827471 100644 --- a/src/test/modules/test_shm_mq/worker.c +++ b/src/test/modules/test_shm_mq/worker.c @@ -9,7 +9,7 @@ * but it should be possible to use much of the control logic just * as presented here. * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/test_shm_mq/worker.c diff --git a/src/test/modules/test_slru/expected/test_slru.out b/src/test/modules/test_slru/expected/test_slru.out index 0e66fdc205fc4..185c56e5d628b 100644 --- a/src/test/modules/test_slru/expected/test_slru.out +++ b/src/test/modules/test_slru/expected/test_slru.out @@ -61,7 +61,7 @@ SELECT test_slru_page_writeall(); -- Flush the last page written out. SELECT test_slru_page_sync(12393); -NOTICE: Called SlruSyncFileTag() for segment 387 on path pg_test_slru/0183 +NOTICE: Called SlruSyncFileTag() for segment 387 on path pg_test_slru/000000000000183 test_slru_page_sync --------------------- @@ -132,4 +132,139 @@ SELECT test_slru_page_exists(12393); f (1 row) +-- +-- Test 64-bit pages +-- +SELECT test_slru_page_exists(0x1234500000000); + test_slru_page_exists +----------------------- + f +(1 row) + +SELECT test_slru_page_write(0x1234500000000, 'Test SLRU 64-bit'); + test_slru_page_write +---------------------- + +(1 row) + +SELECT test_slru_page_read(0x1234500000000); + test_slru_page_read +--------------------- + Test SLRU 64-bit +(1 row) + +SELECT test_slru_page_exists(0x1234500000000); + test_slru_page_exists +----------------------- + t +(1 row) + +-- 48 extra pages +SELECT count(test_slru_page_write(a, 'Test SLRU 64-bit')) + FROM generate_series(0x1234500000001, 0x1234500000030, 1) as a; + count +------- + 48 +(1 row) + +-- Reading page in buffer for read and write +SELECT test_slru_page_read(0x1234500000020, true); + test_slru_page_read +--------------------- + Test SLRU 64-bit +(1 row) + +-- Reading page in buffer for read-only +SELECT test_slru_page_readonly(0x1234500000020); + test_slru_page_readonly +------------------------- + Test SLRU 64-bit +(1 row) + +-- Reading page not in buffer with read-only +SELECT test_slru_page_readonly(0x1234500000001); + test_slru_page_readonly +------------------------- + Test SLRU 64-bit +(1 row) + +-- Write all the pages in buffers +SELECT test_slru_page_writeall(); + test_slru_page_writeall +------------------------- + +(1 row) + +-- Flush the last page written out. +SELECT test_slru_page_sync(0x1234500000030); +NOTICE: Called SlruSyncFileTag() for segment 10007944888321 on path pg_test_slru/000091A28000001 + test_slru_page_sync +--------------------- + +(1 row) + +SELECT test_slru_page_exists(0x1234500000030); + test_slru_page_exists +----------------------- + t +(1 row) + +-- Segment deletion +SELECT test_slru_page_delete(0x1234500000030); +NOTICE: Called SlruDeleteSegment() for segment 10007944888321 + test_slru_page_delete +----------------------- + +(1 row) + +SELECT test_slru_page_exists(0x1234500000030); + test_slru_page_exists +----------------------- + f +(1 row) + +-- Page truncation +SELECT test_slru_page_exists(0x1234500000020); + test_slru_page_exists +----------------------- + f +(1 row) + +SELECT test_slru_page_truncate(0x1234500000020); + test_slru_page_truncate +------------------------- + +(1 row) + +SELECT test_slru_page_exists(0x1234500000020); + test_slru_page_exists +----------------------- + f +(1 row) + +-- Full deletion +SELECT test_slru_delete_all(); + test_slru_delete_all +---------------------- + +(1 row) + +SELECT test_slru_page_exists(0x1234500000000); + test_slru_page_exists +----------------------- + f +(1 row) + +SELECT test_slru_page_exists(0x1234500000020); + test_slru_page_exists +----------------------- + f +(1 row) + +SELECT test_slru_page_exists(0x1234500000030); + test_slru_page_exists +----------------------- + f +(1 row) + DROP EXTENSION test_slru; diff --git a/src/test/modules/test_slru/meson.build b/src/test/modules/test_slru/meson.build index ecf64ed4a94aa..ce91e606313f6 100644 --- a/src/test/modules/test_slru/meson.build +++ b/src/test/modules/test_slru/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_slru_sources = files( 'test_slru.c', diff --git a/src/test/modules/test_slru/sql/test_slru.sql b/src/test/modules/test_slru/sql/test_slru.sql index fe0d1342a9453..b1b376581ab74 100644 --- a/src/test/modules/test_slru/sql/test_slru.sql +++ b/src/test/modules/test_slru/sql/test_slru.sql @@ -35,4 +35,42 @@ SELECT test_slru_page_exists(12345); SELECT test_slru_page_exists(12377); SELECT test_slru_page_exists(12393); +-- +-- Test 64-bit pages +-- +SELECT test_slru_page_exists(0x1234500000000); +SELECT test_slru_page_write(0x1234500000000, 'Test SLRU 64-bit'); +SELECT test_slru_page_read(0x1234500000000); +SELECT test_slru_page_exists(0x1234500000000); + +-- 48 extra pages +SELECT count(test_slru_page_write(a, 'Test SLRU 64-bit')) + FROM generate_series(0x1234500000001, 0x1234500000030, 1) as a; + +-- Reading page in buffer for read and write +SELECT test_slru_page_read(0x1234500000020, true); +-- Reading page in buffer for read-only +SELECT test_slru_page_readonly(0x1234500000020); +-- Reading page not in buffer with read-only +SELECT test_slru_page_readonly(0x1234500000001); + +-- Write all the pages in buffers +SELECT test_slru_page_writeall(); +-- Flush the last page written out. +SELECT test_slru_page_sync(0x1234500000030); +SELECT test_slru_page_exists(0x1234500000030); +-- Segment deletion +SELECT test_slru_page_delete(0x1234500000030); +SELECT test_slru_page_exists(0x1234500000030); +-- Page truncation +SELECT test_slru_page_exists(0x1234500000020); +SELECT test_slru_page_truncate(0x1234500000020); +SELECT test_slru_page_exists(0x1234500000020); + +-- Full deletion +SELECT test_slru_delete_all(); +SELECT test_slru_page_exists(0x1234500000000); +SELECT test_slru_page_exists(0x1234500000020); +SELECT test_slru_page_exists(0x1234500000030); + DROP EXTENSION test_slru; diff --git a/src/test/modules/test_slru/test_slru--1.0.sql b/src/test/modules/test_slru/test_slru--1.0.sql index 8635e7df01574..202e8da3fdeeb 100644 --- a/src/test/modules/test_slru/test_slru--1.0.sql +++ b/src/test/modules/test_slru/test_slru--1.0.sql @@ -1,21 +1,21 @@ -- complain if script is sourced in psql, rather than via CREATE EXTENSION \echo Use "CREATE EXTENSION test_slru" to load this file. \quit -CREATE OR REPLACE FUNCTION test_slru_page_write(int, text) RETURNS VOID +CREATE OR REPLACE FUNCTION test_slru_page_write(bigint, text) RETURNS VOID AS 'MODULE_PATHNAME', 'test_slru_page_write' LANGUAGE C; CREATE OR REPLACE FUNCTION test_slru_page_writeall() RETURNS VOID AS 'MODULE_PATHNAME', 'test_slru_page_writeall' LANGUAGE C; -CREATE OR REPLACE FUNCTION test_slru_page_sync(int) RETURNS VOID +CREATE OR REPLACE FUNCTION test_slru_page_sync(bigint) RETURNS VOID AS 'MODULE_PATHNAME', 'test_slru_page_sync' LANGUAGE C; -CREATE OR REPLACE FUNCTION test_slru_page_read(int, bool DEFAULT true) RETURNS text +CREATE OR REPLACE FUNCTION test_slru_page_read(bigint, bool DEFAULT true) RETURNS text AS 'MODULE_PATHNAME', 'test_slru_page_read' LANGUAGE C; -CREATE OR REPLACE FUNCTION test_slru_page_readonly(int) RETURNS text +CREATE OR REPLACE FUNCTION test_slru_page_readonly(bigint) RETURNS text AS 'MODULE_PATHNAME', 'test_slru_page_readonly' LANGUAGE C; -CREATE OR REPLACE FUNCTION test_slru_page_exists(int) RETURNS bool +CREATE OR REPLACE FUNCTION test_slru_page_exists(bigint) RETURNS bool AS 'MODULE_PATHNAME', 'test_slru_page_exists' LANGUAGE C; -CREATE OR REPLACE FUNCTION test_slru_page_delete(int) RETURNS VOID +CREATE OR REPLACE FUNCTION test_slru_page_delete(bigint) RETURNS VOID AS 'MODULE_PATHNAME', 'test_slru_page_delete' LANGUAGE C; -CREATE OR REPLACE FUNCTION test_slru_page_truncate(int) RETURNS VOID +CREATE OR REPLACE FUNCTION test_slru_page_truncate(bigint) RETURNS VOID AS 'MODULE_PATHNAME', 'test_slru_page_truncate' LANGUAGE C; CREATE OR REPLACE FUNCTION test_slru_delete_all() RETURNS VOID AS 'MODULE_PATHNAME', 'test_slru_delete_all' LANGUAGE C; diff --git a/src/test/modules/test_slru/test_slru.c b/src/test/modules/test_slru/test_slru.c index ae21444c47637..d227b0670342a 100644 --- a/src/test/modules/test_slru/test_slru.c +++ b/src/test/modules/test_slru/test_slru.c @@ -3,7 +3,7 @@ * test_slru.c * Test correctness of SLRU functions. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION @@ -40,10 +40,6 @@ PG_FUNCTION_INFO_V1(test_slru_delete_all); /* Number of SLRU page slots */ #define NUM_TEST_BUFFERS 16 -/* SLRU control lock */ -LWLock TestSLRULock; -#define TestSLRULock (&TestSLRULock) - static SlruCtlData TestSlruCtlData; #define TestSlruCtl (&TestSlruCtlData) @@ -51,7 +47,7 @@ static shmem_request_hook_type prev_shmem_request_hook = NULL; static shmem_startup_hook_type prev_shmem_startup_hook = NULL; static bool -test_slru_scan_cb(SlruCtl ctl, char *filename, int segpage, void *data) +test_slru_scan_cb(SlruCtl ctl, char *filename, int64 segpage, void *data) { elog(NOTICE, "Calling test_slru_scan_cb()"); return SlruScanDirCbDeleteAll(ctl, filename, segpage, data); @@ -60,12 +56,12 @@ test_slru_scan_cb(SlruCtl ctl, char *filename, int segpage, void *data) Datum test_slru_page_write(PG_FUNCTION_ARGS) { - int pageno = PG_GETARG_INT32(0); + int64 pageno = PG_GETARG_INT64(0); char *data = text_to_cstring(PG_GETARG_TEXT_PP(1)); int slotno; + LWLock *lock = SimpleLruGetBankLock(TestSlruCtl, pageno); - LWLockAcquire(TestSLRULock, LW_EXCLUSIVE); - + LWLockAcquire(lock, LW_EXCLUSIVE); slotno = SimpleLruZeroPage(TestSlruCtl, pageno); /* these should match */ @@ -80,7 +76,7 @@ test_slru_page_write(PG_FUNCTION_ARGS) BLCKSZ - 1); SimpleLruWritePage(TestSlruCtl, slotno); - LWLockRelease(TestSLRULock); + LWLockRelease(lock); PG_RETURN_VOID(); } @@ -95,17 +91,18 @@ test_slru_page_writeall(PG_FUNCTION_ARGS) Datum test_slru_page_read(PG_FUNCTION_ARGS) { - int pageno = PG_GETARG_INT32(0); + int64 pageno = PG_GETARG_INT64(0); bool write_ok = PG_GETARG_BOOL(1); char *data = NULL; int slotno; + LWLock *lock = SimpleLruGetBankLock(TestSlruCtl, pageno); /* find page in buffers, reading it if necessary */ - LWLockAcquire(TestSLRULock, LW_EXCLUSIVE); + LWLockAcquire(lock, LW_EXCLUSIVE); slotno = SimpleLruReadPage(TestSlruCtl, pageno, write_ok, InvalidTransactionId); data = (char *) TestSlruCtl->shared->page_buffer[slotno]; - LWLockRelease(TestSLRULock); + LWLockRelease(lock); PG_RETURN_TEXT_P(cstring_to_text(data)); } @@ -113,17 +110,18 @@ test_slru_page_read(PG_FUNCTION_ARGS) Datum test_slru_page_readonly(PG_FUNCTION_ARGS) { - int pageno = PG_GETARG_INT32(0); + int64 pageno = PG_GETARG_INT64(0); char *data = NULL; int slotno; + LWLock *lock = SimpleLruGetBankLock(TestSlruCtl, pageno); /* find page in buffers, reading it if necessary */ slotno = SimpleLruReadPage_ReadOnly(TestSlruCtl, pageno, InvalidTransactionId); - Assert(LWLockHeldByMe(TestSLRULock)); + Assert(LWLockHeldByMe(lock)); data = (char *) TestSlruCtl->shared->page_buffer[slotno]; - LWLockRelease(TestSLRULock); + LWLockRelease(lock); PG_RETURN_TEXT_P(cstring_to_text(data)); } @@ -131,12 +129,13 @@ test_slru_page_readonly(PG_FUNCTION_ARGS) Datum test_slru_page_exists(PG_FUNCTION_ARGS) { - int pageno = PG_GETARG_INT32(0); + int64 pageno = PG_GETARG_INT64(0); bool found; + LWLock *lock = SimpleLruGetBankLock(TestSlruCtl, pageno); - LWLockAcquire(TestSLRULock, LW_EXCLUSIVE); + LWLockAcquire(lock, LW_EXCLUSIVE); found = SimpleLruDoesPhysicalPageExist(TestSlruCtl, pageno); - LWLockRelease(TestSLRULock); + LWLockRelease(lock); PG_RETURN_BOOL(found); } @@ -144,7 +143,7 @@ test_slru_page_exists(PG_FUNCTION_ARGS) Datum test_slru_page_sync(PG_FUNCTION_ARGS) { - int pageno = PG_GETARG_INT32(0); + int64 pageno = PG_GETARG_INT64(0); FileTag ftag; char path[MAXPGPATH]; @@ -152,8 +151,8 @@ test_slru_page_sync(PG_FUNCTION_ARGS) ftag.segno = pageno / SLRU_PAGES_PER_SEGMENT; SlruSyncFileTag(TestSlruCtl, &ftag, path); - elog(NOTICE, "Called SlruSyncFileTag() for segment %u on path %s", - ftag.segno, path); + elog(NOTICE, "Called SlruSyncFileTag() for segment %lld on path %s", + (long long) ftag.segno, path); PG_RETURN_VOID(); } @@ -161,13 +160,14 @@ test_slru_page_sync(PG_FUNCTION_ARGS) Datum test_slru_page_delete(PG_FUNCTION_ARGS) { - int pageno = PG_GETARG_INT32(0); + int64 pageno = PG_GETARG_INT64(0); FileTag ftag; ftag.segno = pageno / SLRU_PAGES_PER_SEGMENT; SlruDeleteSegment(TestSlruCtl, ftag.segno); - elog(NOTICE, "Called SlruDeleteSegment() for segment %u", ftag.segno); + elog(NOTICE, "Called SlruDeleteSegment() for segment %lld", + (long long) ftag.segno); PG_RETURN_VOID(); } @@ -175,7 +175,7 @@ test_slru_page_delete(PG_FUNCTION_ARGS) Datum test_slru_page_truncate(PG_FUNCTION_ARGS) { - int pageno = PG_GETARG_INT32(0); + int64 pageno = PG_GETARG_INT64(0); SimpleLruTruncate(TestSlruCtl, pageno); PG_RETURN_VOID(); @@ -205,7 +205,7 @@ test_slru_shmem_request(void) } static bool -test_slru_page_precedes_logically(int page1, int page2) +test_slru_page_precedes_logically(int64 page1, int64 page2) { return page1 < page2; } @@ -213,8 +213,14 @@ test_slru_page_precedes_logically(int page1, int page2) static void test_slru_shmem_startup(void) { + /* + * Short segments names are well tested elsewhere so in this test we are + * focusing on long names. + */ + const bool long_segment_names = true; const char slru_dir_name[] = "pg_test_slru"; int test_tranche_id; + int test_buffer_tranche_id; if (prev_shmem_startup_hook) prev_shmem_startup_hook(); @@ -228,12 +234,15 @@ test_slru_shmem_startup(void) /* initialize the SLRU facility */ test_tranche_id = LWLockNewTrancheId(); LWLockRegisterTranche(test_tranche_id, "test_slru_tranche"); - LWLockInitialize(TestSLRULock, test_tranche_id); + + test_buffer_tranche_id = LWLockNewTrancheId(); + LWLockRegisterTranche(test_tranche_id, "test_buffer_tranche"); TestSlruCtl->PagePrecedes = test_slru_page_precedes_logically; SimpleLruInit(TestSlruCtl, "TestSLRU", - NUM_TEST_BUFFERS, 0, TestSLRULock, slru_dir_name, - test_tranche_id, SYNC_HANDLER_NONE); + NUM_TEST_BUFFERS, 0, slru_dir_name, + test_buffer_tranche_id, test_tranche_id, SYNC_HANDLER_NONE, + long_segment_names); } void @@ -242,7 +251,7 @@ _PG_init(void) if (!process_shared_preload_libraries_in_progress) ereport(ERROR, (errmsg("cannot load \"%s\" after startup", "test_slru"), - errdetail("\"%s\" must be loaded with shared_preload_libraries.", + errdetail("\"%s\" must be loaded with \"shared_preload_libraries\".", "test_slru"))); prev_shmem_request_hook = shmem_request_hook; diff --git a/src/test/modules/test_tidstore/.gitignore b/src/test/modules/test_tidstore/.gitignore new file mode 100644 index 0000000000000..5dcb3ff972350 --- /dev/null +++ b/src/test/modules/test_tidstore/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ diff --git a/src/test/modules/test_tidstore/Makefile b/src/test/modules/test_tidstore/Makefile new file mode 100644 index 0000000000000..dab107d70c348 --- /dev/null +++ b/src/test/modules/test_tidstore/Makefile @@ -0,0 +1,23 @@ +# src/test/modules/test_tidstore/Makefile + +MODULE_big = test_tidstore +OBJS = \ + $(WIN32RES) \ + test_tidstore.o +PGFILEDESC = "test_tidstore - test code for src/backend/access/common/tidstore.c" + +EXTENSION = test_tidstore +DATA = test_tidstore--1.0.sql + +REGRESS = test_tidstore + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/test_tidstore +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/src/test/modules/test_tidstore/expected/test_tidstore.out b/src/test/modules/test_tidstore/expected/test_tidstore.out new file mode 100644 index 0000000000000..cbcacfd26e178 --- /dev/null +++ b/src/test/modules/test_tidstore/expected/test_tidstore.out @@ -0,0 +1,233 @@ +CREATE EXTENSION test_tidstore; +-- To hide the output of do_set_block_offsets() +CREATE TEMP TABLE hideblocks(blockno bigint); +-- Constant values used in the tests. +\set maxblkno 4294967295 +-- The maximum number of heap tuples (MaxHeapTuplesPerPage) in 8kB block is 291. +-- We use a higher number to test tidstore. +\set maxoffset 512 +SELECT test_create(false); + test_create +------------- + +(1 row) + +-- Test on empty tidstore. +SELECT test_is_full(); + test_is_full +-------------- + f +(1 row) + +SELECT check_set_block_offsets(); + check_set_block_offsets +------------------------- + +(1 row) + +-- Add TIDs. +INSERT INTO hideblocks (blockno) +SELECT do_set_block_offsets(blk, array_agg(off)::int2[]) + FROM + (VALUES (0), (1), (:maxblkno / 2), (:maxblkno - 1), (:maxblkno)) AS blocks(blk), + (VALUES (1), (2), (:maxoffset / 2), (:maxoffset - 1), (:maxoffset)) AS offsets(off) + GROUP BY blk; +-- Test offsets embedded in the bitmap header. +SELECT do_set_block_offsets(501, array[greatest((random() * :maxoffset)::int, 1)]::int2[]); + do_set_block_offsets +---------------------- + 501 +(1 row) + +SELECT do_set_block_offsets(502, array_agg(DISTINCT greatest((random() * :maxoffset)::int, 1))::int2[]) + FROM generate_series(1, 3); + do_set_block_offsets +---------------------- + 502 +(1 row) + +-- Add enough TIDs to cause the store to appear "full", compared +-- to the allocated memory it started out with. This is easier +-- with memory contexts in local memory. +INSERT INTO hideblocks (blockno) +SELECT do_set_block_offsets(blk, ARRAY[1,31,32,63,64,200]::int2[]) + FROM generate_series(1000, 2000, 1) blk; +-- Zero offset not allowed +SELECT do_set_block_offsets(1, ARRAY[0]::int2[]); +ERROR: tuple offset out of range: 0 +-- Check TIDs we've added to the store. +SELECT check_set_block_offsets(); + check_set_block_offsets +------------------------- + +(1 row) + +SELECT test_is_full(); + test_is_full +-------------- + t +(1 row) + +-- Re-create the TID store for randommized tests. +SELECT test_destroy(); + test_destroy +-------------- + +(1 row) + +-- Test replacements crossing RT_CHILDPTR_IS_VALUE in both directions +SELECT test_create(false); + test_create +------------- + +(1 row) + +SELECT do_set_block_offsets(1, array[1]::int2[]); SELECT check_set_block_offsets(); + do_set_block_offsets +---------------------- + 1 +(1 row) + + check_set_block_offsets +------------------------- + +(1 row) + +SELECT do_set_block_offsets(1, array[1,2]::int2[]); SELECT check_set_block_offsets(); + do_set_block_offsets +---------------------- + 1 +(1 row) + + check_set_block_offsets +------------------------- + +(1 row) + +SELECT do_set_block_offsets(1, array[1,2,3]::int2[]); SELECT check_set_block_offsets(); + do_set_block_offsets +---------------------- + 1 +(1 row) + + check_set_block_offsets +------------------------- + +(1 row) + +SELECT do_set_block_offsets(1, array[1,2,3,4]::int2[]); SELECT check_set_block_offsets(); + do_set_block_offsets +---------------------- + 1 +(1 row) + + check_set_block_offsets +------------------------- + +(1 row) + +SELECT do_set_block_offsets(1, array[1,2,3,4,100]::int2[]); SELECT check_set_block_offsets(); + do_set_block_offsets +---------------------- + 1 +(1 row) + + check_set_block_offsets +------------------------- + +(1 row) + +SELECT do_set_block_offsets(1, array[1,2,3,4]::int2[]); SELECT check_set_block_offsets(); + do_set_block_offsets +---------------------- + 1 +(1 row) + + check_set_block_offsets +------------------------- + +(1 row) + +SELECT do_set_block_offsets(1, array[1,2,3]::int2[]); SELECT check_set_block_offsets(); + do_set_block_offsets +---------------------- + 1 +(1 row) + + check_set_block_offsets +------------------------- + +(1 row) + +SELECT do_set_block_offsets(1, array[1,2]::int2[]); SELECT check_set_block_offsets(); + do_set_block_offsets +---------------------- + 1 +(1 row) + + check_set_block_offsets +------------------------- + +(1 row) + +SELECT do_set_block_offsets(1, array[1]::int2[]); SELECT check_set_block_offsets(); + do_set_block_offsets +---------------------- + 1 +(1 row) + + check_set_block_offsets +------------------------- + +(1 row) + +SELECT test_destroy(); + test_destroy +-------------- + +(1 row) + +-- Use shared memory this time. We can't do that in test_radixtree.sql, +-- because unused static functions would raise warnings there. +SELECT test_create(true); + test_create +------------- + +(1 row) + +-- Test offsets embedded in the bitmap header. +SELECT do_set_block_offsets(501, array[greatest((random() * :maxoffset)::int, 1)]::int2[]); + do_set_block_offsets +---------------------- + 501 +(1 row) + +SELECT do_set_block_offsets(502, array_agg(DISTINCT greatest((random() * :maxoffset)::int, 1))::int2[]) + FROM generate_series(1, 3); + do_set_block_offsets +---------------------- + 502 +(1 row) + +-- Random TIDs test. The offset numbers are randomized and must be +-- unique and ordered. +INSERT INTO hideblocks (blockno) +SELECT do_set_block_offsets(blkno, array_agg(DISTINCT greatest((random() * :maxoffset)::int, 1))::int2[]) + FROM generate_series(1, 100) num_offsets, + generate_series(1000, 1100, 1) blkno +GROUP BY blkno; +-- Check TIDs we've added to the store. +SELECT check_set_block_offsets(); + check_set_block_offsets +------------------------- + +(1 row) + +-- cleanup +SELECT test_destroy(); + test_destroy +-------------- + +(1 row) + +DROP TABLE hideblocks; diff --git a/src/test/modules/test_tidstore/meson.build b/src/test/modules/test_tidstore/meson.build new file mode 100644 index 0000000000000..0ed3ea2ef33aa --- /dev/null +++ b/src/test/modules/test_tidstore/meson.build @@ -0,0 +1,33 @@ +# Copyright (c) 2024, PostgreSQL Global Development Group + +test_tidstore_sources = files( + 'test_tidstore.c', +) + +if host_system == 'windows' + test_tidstore_sources += rc_lib_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'test_tidstore', + '--FILEDESC', 'test_tidstore - test code for src/backend/access/common/tidstore.c',]) +endif + +test_tidstore = shared_module('test_tidstore', + test_tidstore_sources, + kwargs: pg_test_mod_args, +) +test_install_libs += test_tidstore + +test_install_data += files( + 'test_tidstore.control', + 'test_tidstore--1.0.sql', +) + +tests += { + 'name': 'test_tidstore', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'regress': { + 'sql': [ + 'test_tidstore', + ], + }, +} diff --git a/src/test/modules/test_tidstore/sql/test_tidstore.sql b/src/test/modules/test_tidstore/sql/test_tidstore.sql new file mode 100644 index 0000000000000..a29e4ec1c55aa --- /dev/null +++ b/src/test/modules/test_tidstore/sql/test_tidstore.sql @@ -0,0 +1,86 @@ +CREATE EXTENSION test_tidstore; + +-- To hide the output of do_set_block_offsets() +CREATE TEMP TABLE hideblocks(blockno bigint); + +-- Constant values used in the tests. +\set maxblkno 4294967295 +-- The maximum number of heap tuples (MaxHeapTuplesPerPage) in 8kB block is 291. +-- We use a higher number to test tidstore. +\set maxoffset 512 + +SELECT test_create(false); + +-- Test on empty tidstore. +SELECT test_is_full(); +SELECT check_set_block_offsets(); + +-- Add TIDs. +INSERT INTO hideblocks (blockno) +SELECT do_set_block_offsets(blk, array_agg(off)::int2[]) + FROM + (VALUES (0), (1), (:maxblkno / 2), (:maxblkno - 1), (:maxblkno)) AS blocks(blk), + (VALUES (1), (2), (:maxoffset / 2), (:maxoffset - 1), (:maxoffset)) AS offsets(off) + GROUP BY blk; + +-- Test offsets embedded in the bitmap header. +SELECT do_set_block_offsets(501, array[greatest((random() * :maxoffset)::int, 1)]::int2[]); +SELECT do_set_block_offsets(502, array_agg(DISTINCT greatest((random() * :maxoffset)::int, 1))::int2[]) + FROM generate_series(1, 3); + +-- Add enough TIDs to cause the store to appear "full", compared +-- to the allocated memory it started out with. This is easier +-- with memory contexts in local memory. +INSERT INTO hideblocks (blockno) +SELECT do_set_block_offsets(blk, ARRAY[1,31,32,63,64,200]::int2[]) + FROM generate_series(1000, 2000, 1) blk; + +-- Zero offset not allowed +SELECT do_set_block_offsets(1, ARRAY[0]::int2[]); + +-- Check TIDs we've added to the store. +SELECT check_set_block_offsets(); + +SELECT test_is_full(); + +-- Re-create the TID store for randommized tests. +SELECT test_destroy(); + + +-- Test replacements crossing RT_CHILDPTR_IS_VALUE in both directions +SELECT test_create(false); +SELECT do_set_block_offsets(1, array[1]::int2[]); SELECT check_set_block_offsets(); +SELECT do_set_block_offsets(1, array[1,2]::int2[]); SELECT check_set_block_offsets(); +SELECT do_set_block_offsets(1, array[1,2,3]::int2[]); SELECT check_set_block_offsets(); +SELECT do_set_block_offsets(1, array[1,2,3,4]::int2[]); SELECT check_set_block_offsets(); +SELECT do_set_block_offsets(1, array[1,2,3,4,100]::int2[]); SELECT check_set_block_offsets(); +SELECT do_set_block_offsets(1, array[1,2,3,4]::int2[]); SELECT check_set_block_offsets(); +SELECT do_set_block_offsets(1, array[1,2,3]::int2[]); SELECT check_set_block_offsets(); +SELECT do_set_block_offsets(1, array[1,2]::int2[]); SELECT check_set_block_offsets(); +SELECT do_set_block_offsets(1, array[1]::int2[]); SELECT check_set_block_offsets(); +SELECT test_destroy(); + + +-- Use shared memory this time. We can't do that in test_radixtree.sql, +-- because unused static functions would raise warnings there. +SELECT test_create(true); + +-- Test offsets embedded in the bitmap header. +SELECT do_set_block_offsets(501, array[greatest((random() * :maxoffset)::int, 1)]::int2[]); +SELECT do_set_block_offsets(502, array_agg(DISTINCT greatest((random() * :maxoffset)::int, 1))::int2[]) + FROM generate_series(1, 3); + +-- Random TIDs test. The offset numbers are randomized and must be +-- unique and ordered. +INSERT INTO hideblocks (blockno) +SELECT do_set_block_offsets(blkno, array_agg(DISTINCT greatest((random() * :maxoffset)::int, 1))::int2[]) + FROM generate_series(1, 100) num_offsets, + generate_series(1000, 1100, 1) blkno +GROUP BY blkno; + +-- Check TIDs we've added to the store. +SELECT check_set_block_offsets(); + +-- cleanup +SELECT test_destroy(); +DROP TABLE hideblocks; diff --git a/src/test/modules/test_tidstore/test_tidstore--1.0.sql b/src/test/modules/test_tidstore/test_tidstore--1.0.sql new file mode 100644 index 0000000000000..7e6c60c7bb3e4 --- /dev/null +++ b/src/test/modules/test_tidstore/test_tidstore--1.0.sql @@ -0,0 +1,27 @@ +/* src/test/modules/test_tidstore/test_tidstore--1.0.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION test_tidstore" to load this file. \quit + +CREATE FUNCTION test_create( +shared bool) +RETURNS void STRICT PARALLEL UNSAFE +AS 'MODULE_PATHNAME' LANGUAGE C; + +CREATE FUNCTION do_set_block_offsets( +blkno bigint, +offsets int2[]) +RETURNS bigint STRICT PARALLEL UNSAFE +AS 'MODULE_PATHNAME' LANGUAGE C; + +CREATE FUNCTION check_set_block_offsets() +RETURNS void STRICT PARALLEL UNSAFE +AS 'MODULE_PATHNAME' LANGUAGE C; + +CREATE FUNCTION test_is_full() +RETURNS bool STRICT PARALLEL UNSAFE +AS 'MODULE_PATHNAME' LANGUAGE C; + +CREATE FUNCTION test_destroy() +RETURNS void STRICT PARALLEL UNSAFE +AS 'MODULE_PATHNAME' LANGUAGE C; diff --git a/src/test/modules/test_tidstore/test_tidstore.c b/src/test/modules/test_tidstore/test_tidstore.c new file mode 100644 index 0000000000000..3f6a11bf21c38 --- /dev/null +++ b/src/test/modules/test_tidstore/test_tidstore.c @@ -0,0 +1,339 @@ +/*-------------------------------------------------------------------------- + * + * test_tidstore.c + * Test TidStore data structure. + * + * Note: all locking in this test module is useless since there is only + * a single process to use the TidStore. It is meant to be an example of + * usage. + * + * Copyright (c) 2024, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/test/modules/test_tidstore/test_tidstore.c + * + * ------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/tidstore.h" +#include "fmgr.h" +#include "funcapi.h" +#include "storage/block.h" +#include "storage/itemptr.h" +#include "storage/lwlock.h" +#include "utils/array.h" +#include "utils/memutils.h" + +PG_MODULE_MAGIC; + +PG_FUNCTION_INFO_V1(test_create); +PG_FUNCTION_INFO_V1(do_set_block_offsets); +PG_FUNCTION_INFO_V1(check_set_block_offsets); +PG_FUNCTION_INFO_V1(test_is_full); +PG_FUNCTION_INFO_V1(test_destroy); + +static TidStore *tidstore = NULL; +static size_t tidstore_empty_size; + +/* array for verification of some tests */ +typedef struct ItemArray +{ + ItemPointerData *insert_tids; + ItemPointerData *lookup_tids; + ItemPointerData *iter_tids; + int max_tids; + int num_tids; +} ItemArray; + +static ItemArray items; + +/* comparator routine for ItemPointer */ +static int +itemptr_cmp(const void *left, const void *right) +{ + BlockNumber lblk, + rblk; + OffsetNumber loff, + roff; + + lblk = ItemPointerGetBlockNumber((ItemPointer) left); + rblk = ItemPointerGetBlockNumber((ItemPointer) right); + + if (lblk < rblk) + return -1; + if (lblk > rblk) + return 1; + + loff = ItemPointerGetOffsetNumber((ItemPointer) left); + roff = ItemPointerGetOffsetNumber((ItemPointer) right); + + if (loff < roff) + return -1; + if (loff > roff) + return 1; + + return 0; +} + +/* + * Create a TidStore. If shared is false, the tidstore is created + * on TopMemoryContext, otherwise on DSA. Although the tidstore + * is created on DSA, only the same process can subsequently use + * the tidstore. The tidstore handle is not shared anywhere. +*/ +Datum +test_create(PG_FUNCTION_ARGS) +{ + bool shared = PG_GETARG_BOOL(0); + MemoryContext old_ctx; + + /* doesn't really matter, since it's just a hint */ + size_t tidstore_max_size = 2 * 1024 * 1024; + size_t array_init_size = 1024; + + Assert(tidstore == NULL); + + /* + * Create the TidStore on TopMemoryContext so that the same process use it + * for subsequent tests. + */ + old_ctx = MemoryContextSwitchTo(TopMemoryContext); + + if (shared) + { + int tranche_id; + + tranche_id = LWLockNewTrancheId(); + LWLockRegisterTranche(tranche_id, "test_tidstore"); + + tidstore = TidStoreCreateShared(tidstore_max_size, tranche_id); + + /* + * Remain attached until end of backend or explicitly detached so that + * the same process use the tidstore for subsequent tests. + */ + dsa_pin_mapping(TidStoreGetDSA(tidstore)); + } + else + /* VACUUM uses insert only, so we test the other option. */ + tidstore = TidStoreCreateLocal(tidstore_max_size, false); + + tidstore_empty_size = TidStoreMemoryUsage(tidstore); + + items.num_tids = 0; + items.max_tids = array_init_size / sizeof(ItemPointerData); + items.insert_tids = (ItemPointerData *) palloc0(array_init_size); + items.lookup_tids = (ItemPointerData *) palloc0(array_init_size); + items.iter_tids = (ItemPointerData *) palloc0(array_init_size); + + MemoryContextSwitchTo(old_ctx); + + PG_RETURN_VOID(); +} + +static void +sanity_check_array(ArrayType *ta) +{ + if (ARR_HASNULL(ta) && array_contains_nulls(ta)) + ereport(ERROR, + (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), + errmsg("array must not contain nulls"))); + + if (ARR_NDIM(ta) > 1) + ereport(ERROR, + (errcode(ERRCODE_DATA_EXCEPTION), + errmsg("argument must be empty or one-dimensional array"))); +} + +static void +check_tidstore_available(void) +{ + if (tidstore == NULL) + elog(ERROR, "tidstore is not created"); +} + +static void +purge_from_verification_array(BlockNumber blkno) +{ + int dst = 0; + + for (int src = 0; src < items.num_tids; src++) + if (ItemPointerGetBlockNumber(&items.insert_tids[src]) != blkno) + items.insert_tids[dst++] = items.insert_tids[src]; + items.num_tids = dst; +} + + +/* Set the given block and offsets pairs */ +Datum +do_set_block_offsets(PG_FUNCTION_ARGS) +{ + BlockNumber blkno = PG_GETARG_INT64(0); + ArrayType *ta = PG_GETARG_ARRAYTYPE_P_COPY(1); + OffsetNumber *offs; + int noffs; + + check_tidstore_available(); + sanity_check_array(ta); + + noffs = ArrayGetNItems(ARR_NDIM(ta), ARR_DIMS(ta)); + offs = ((OffsetNumber *) ARR_DATA_PTR(ta)); + + /* Set TIDs in the store */ + TidStoreLockExclusive(tidstore); + TidStoreSetBlockOffsets(tidstore, blkno, offs, noffs); + TidStoreUnlock(tidstore); + + /* Remove the existing items of blkno from the verification array */ + purge_from_verification_array(blkno); + + /* Set TIDs in verification array */ + for (int i = 0; i < noffs; i++) + { + ItemPointer tid; + int idx = items.num_tids + i; + + /* Enlarge the TID arrays if necessary */ + if (idx >= items.max_tids) + { + items.max_tids *= 2; + items.insert_tids = repalloc(items.insert_tids, sizeof(ItemPointerData) * items.max_tids); + items.lookup_tids = repalloc(items.lookup_tids, sizeof(ItemPointerData) * items.max_tids); + items.iter_tids = repalloc(items.iter_tids, sizeof(ItemPointerData) * items.max_tids); + } + + tid = &(items.insert_tids[idx]); + ItemPointerSet(tid, blkno, offs[i]); + } + + /* Update statistics */ + items.num_tids += noffs; + + PG_RETURN_INT64(blkno); +} + +/* + * Verify TIDs in store against the array. + */ +Datum +check_set_block_offsets(PG_FUNCTION_ARGS) +{ + TidStoreIter *iter; + TidStoreIterResult *iter_result; + int num_iter_tids = 0; + int num_lookup_tids = 0; + BlockNumber prevblkno = 0; + + check_tidstore_available(); + + /* lookup each member in the verification array */ + for (int i = 0; i < items.num_tids; i++) + if (!TidStoreIsMember(tidstore, &items.insert_tids[i])) + elog(ERROR, "missing TID with block %u, offset %u", + ItemPointerGetBlockNumber(&items.insert_tids[i]), + ItemPointerGetOffsetNumber(&items.insert_tids[i])); + + /* + * Lookup all possible TIDs for each distinct block in the verification + * array and save successful lookups in the lookup array. + */ + + for (int i = 0; i < items.num_tids; i++) + { + BlockNumber blkno = ItemPointerGetBlockNumber(&items.insert_tids[i]); + + if (i > 0 && blkno == prevblkno) + continue; + + for (OffsetNumber offset = FirstOffsetNumber; offset < MaxOffsetNumber; offset++) + { + ItemPointerData tid; + + ItemPointerSet(&tid, blkno, offset); + + TidStoreLockShare(tidstore); + if (TidStoreIsMember(tidstore, &tid)) + ItemPointerSet(&items.lookup_tids[num_lookup_tids++], blkno, offset); + TidStoreUnlock(tidstore); + } + + prevblkno = blkno; + } + + /* Collect TIDs stored in the tidstore, in order */ + + TidStoreLockShare(tidstore); + iter = TidStoreBeginIterate(tidstore); + while ((iter_result = TidStoreIterateNext(iter)) != NULL) + { + for (int i = 0; i < iter_result->num_offsets; i++) + ItemPointerSet(&(items.iter_tids[num_iter_tids++]), iter_result->blkno, + iter_result->offsets[i]); + } + TidStoreEndIterate(iter); + TidStoreUnlock(tidstore); + + /* + * Sort verification and lookup arrays and test that all arrays are the + * same. + */ + + if (num_lookup_tids != items.num_tids) + elog(ERROR, "should have %d TIDs, have %d", items.num_tids, num_lookup_tids); + if (num_iter_tids != items.num_tids) + elog(ERROR, "should have %d TIDs, have %d", items.num_tids, num_iter_tids); + + qsort(items.insert_tids, items.num_tids, sizeof(ItemPointerData), itemptr_cmp); + qsort(items.lookup_tids, items.num_tids, sizeof(ItemPointerData), itemptr_cmp); + for (int i = 0; i < items.num_tids; i++) + { + if (itemptr_cmp((const void *) &items.insert_tids[i], (const void *) &items.iter_tids[i]) != 0) + elog(ERROR, "TID iter array doesn't match verification array, got (%u,%u) expected (%u,%u)", + ItemPointerGetBlockNumber(&items.iter_tids[i]), + ItemPointerGetOffsetNumber(&items.iter_tids[i]), + ItemPointerGetBlockNumber(&items.insert_tids[i]), + ItemPointerGetOffsetNumber(&items.insert_tids[i])); + if (itemptr_cmp((const void *) &items.insert_tids[i], (const void *) &items.lookup_tids[i]) != 0) + elog(ERROR, "TID lookup array doesn't match verification array, got (%u,%u) expected (%u,%u)", + ItemPointerGetBlockNumber(&items.lookup_tids[i]), + ItemPointerGetOffsetNumber(&items.lookup_tids[i]), + ItemPointerGetBlockNumber(&items.insert_tids[i]), + ItemPointerGetOffsetNumber(&items.insert_tids[i])); + } + + PG_RETURN_VOID(); +} + +/* + * In real world use, we care if the memory usage is greater than + * some configured limit. Here we just want to verify that + * TidStoreMemoryUsage is not broken. + */ +Datum +test_is_full(PG_FUNCTION_ARGS) +{ + bool is_full; + + check_tidstore_available(); + + is_full = (TidStoreMemoryUsage(tidstore) > tidstore_empty_size); + + PG_RETURN_BOOL(is_full); +} + +/* Free the tidstore */ +Datum +test_destroy(PG_FUNCTION_ARGS) +{ + check_tidstore_available(); + + TidStoreDestroy(tidstore); + tidstore = NULL; + items.num_tids = 0; + pfree(items.insert_tids); + pfree(items.lookup_tids); + pfree(items.iter_tids); + + PG_RETURN_VOID(); +} diff --git a/src/test/modules/test_tidstore/test_tidstore.control b/src/test/modules/test_tidstore/test_tidstore.control new file mode 100644 index 0000000000000..9b6bd4638f950 --- /dev/null +++ b/src/test/modules/test_tidstore/test_tidstore.control @@ -0,0 +1,4 @@ +comment = 'Test code for tidstore' +default_version = '1.0' +module_pathname = '$libdir/test_tidstore' +relocatable = true diff --git a/src/test/modules/unsafe_tests/Makefile b/src/test/modules/unsafe_tests/Makefile index 90d19791871c7..d4ff227ef0797 100644 --- a/src/test/modules/unsafe_tests/Makefile +++ b/src/test/modules/unsafe_tests/Makefile @@ -1,6 +1,9 @@ # src/test/modules/unsafe_tests/Makefile -REGRESS = rolenames alter_system_table guc_privs +REGRESS = rolenames setconfig alter_system_table guc_privs +REGRESS_OPTS = \ + --create-role=regress_authenticated_user_sr \ + --create-role=regress_authenticated_user_ssa # the whole point of these tests is to not run installcheck NO_INSTALLCHECK = 1 diff --git a/src/test/modules/unsafe_tests/expected/guc_privs.out b/src/test/modules/unsafe_tests/expected/guc_privs.out index f43a1da214e0f..6c0ad898341ff 100644 --- a/src/test/modules/unsafe_tests/expected/guc_privs.out +++ b/src/test/modules/unsafe_tests/expected/guc_privs.out @@ -220,9 +220,31 @@ SELECT 1 FROM pg_parameter_acl WHERE parname = 'none.such'; ---------- (0 rows) +-- Superuser should be able to ALTER SYSTEM SET a non-existent custom GUC. +ALTER SYSTEM SET none.such = 'whiz bang'; +-- None of the above should have created a placeholder GUC for none.such. +SHOW none.such; -- error +ERROR: unrecognized configuration parameter "none.such" +-- However, if we reload ... +SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +-- and start a new session to avoid race condition ... +\c - +SET SESSION AUTHORIZATION regress_admin; +-- then it should be there. +SHOW none.such; + none.such +----------- + whiz bang +(1 row) + -- Can't grant on a non-existent core GUC. GRANT ALL ON PARAMETER no_such_guc TO regress_host_resource_admin; -- fail -ERROR: invalid parameter name "no_such_guc" +ERROR: unrecognized configuration parameter "no_such_guc" -- Initially there are no privileges and no catalog entry for this GUC. SELECT has_parameter_privilege('regress_host_resource_admin', 'enable_material', 'SET'); has_parameter_privilege @@ -459,6 +481,8 @@ SELECT set_config ('temp_buffers', '8192', false); -- ok ALTER SYSTEM RESET autovacuum_work_mem; -- ok, privileges have been granted ALTER SYSTEM RESET ALL; -- fail, insufficient privileges ERROR: permission denied to perform ALTER SYSTEM RESET ALL +ALTER SYSTEM SET none.such2 = 'whiz bang'; -- fail, not superuser +ERROR: permission denied to set parameter "none.such2" ALTER ROLE regress_host_resource_admin SET lc_messages = 'POSIX'; -- fail ERROR: permission denied to set parameter "lc_messages" ALTER ROLE regress_host_resource_admin SET max_stack_depth = '1MB'; -- ok diff --git a/src/test/modules/unsafe_tests/expected/setconfig.out b/src/test/modules/unsafe_tests/expected/setconfig.out new file mode 100644 index 0000000000000..6a021d9ad0308 --- /dev/null +++ b/src/test/modules/unsafe_tests/expected/setconfig.out @@ -0,0 +1,31 @@ +-- This is borderline unsafe in that an additional login-capable user exists +-- during the test run. Under installcheck, a too-permissive pg_hba.conf +-- might allow unwanted logins as regress_authenticated_user_ssa. +ALTER USER regress_authenticated_user_ssa superuser; +CREATE ROLE regress_session_user; +CREATE ROLE regress_current_user; +GRANT regress_current_user TO regress_authenticated_user_sr; +GRANT regress_session_user TO regress_authenticated_user_ssa; +ALTER ROLE regress_authenticated_user_ssa + SET session_authorization = regress_session_user; +ALTER ROLE regress_authenticated_user_sr SET ROLE = regress_current_user; +\c - regress_authenticated_user_sr +SELECT current_user, session_user; + current_user | session_user +----------------------+------------------------------- + regress_current_user | regress_authenticated_user_sr +(1 row) + +-- The longstanding historical behavior is that session_authorization in +-- setconfig has no effect. Hence, session_user remains +-- regress_authenticated_user_ssa. See comment in InitializeSessionUserId(). +\c - regress_authenticated_user_ssa +SELECT current_user, session_user; + current_user | session_user +--------------------------------+-------------------------------- + regress_authenticated_user_ssa | regress_authenticated_user_ssa +(1 row) + +RESET SESSION AUTHORIZATION; +DROP USER regress_session_user; +DROP USER regress_current_user; diff --git a/src/test/modules/unsafe_tests/meson.build b/src/test/modules/unsafe_tests/meson.build index b6806e4a0170c..3e174c7425af1 100644 --- a/src/test/modules/unsafe_tests/meson.build +++ b/src/test/modules/unsafe_tests/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tests += { 'name': 'unsafe_tests', @@ -7,9 +7,12 @@ tests += { 'regress': { 'sql': [ 'rolenames', + 'setconfig', 'alter_system_table', 'guc_privs', ], + 'regress_args': ['--create-role=regress_authenticated_user_sr', + '--create-role=regress_authenticated_user_ssa'], 'runningcheck': false, }, } diff --git a/src/test/modules/unsafe_tests/sql/guc_privs.sql b/src/test/modules/unsafe_tests/sql/guc_privs.sql index 7a4fb24b9d1bd..9bcbbfa9040cf 100644 --- a/src/test/modules/unsafe_tests/sql/guc_privs.sql +++ b/src/test/modules/unsafe_tests/sql/guc_privs.sql @@ -98,6 +98,19 @@ GRANT ALL ON PARAMETER none.such TO regress_host_resource_admin; SELECT 1 FROM pg_parameter_acl WHERE parname = 'none.such'; REVOKE ALL ON PARAMETER "None.Such" FROM regress_host_resource_admin; SELECT 1 FROM pg_parameter_acl WHERE parname = 'none.such'; + +-- Superuser should be able to ALTER SYSTEM SET a non-existent custom GUC. +ALTER SYSTEM SET none.such = 'whiz bang'; +-- None of the above should have created a placeholder GUC for none.such. +SHOW none.such; -- error +-- However, if we reload ... +SELECT pg_reload_conf(); +-- and start a new session to avoid race condition ... +\c - +SET SESSION AUTHORIZATION regress_admin; +-- then it should be there. +SHOW none.such; + -- Can't grant on a non-existent core GUC. GRANT ALL ON PARAMETER no_such_guc TO regress_host_resource_admin; -- fail @@ -190,6 +203,7 @@ ALTER SYSTEM RESET lc_messages; -- fail, insufficient privileges SELECT set_config ('temp_buffers', '8192', false); -- ok ALTER SYSTEM RESET autovacuum_work_mem; -- ok, privileges have been granted ALTER SYSTEM RESET ALL; -- fail, insufficient privileges +ALTER SYSTEM SET none.such2 = 'whiz bang'; -- fail, not superuser ALTER ROLE regress_host_resource_admin SET lc_messages = 'POSIX'; -- fail ALTER ROLE regress_host_resource_admin SET max_stack_depth = '1MB'; -- ok SELECT setconfig FROM pg_db_role_setting diff --git a/src/test/modules/unsafe_tests/sql/setconfig.sql b/src/test/modules/unsafe_tests/sql/setconfig.sql new file mode 100644 index 0000000000000..8817a7c763665 --- /dev/null +++ b/src/test/modules/unsafe_tests/sql/setconfig.sql @@ -0,0 +1,24 @@ +-- This is borderline unsafe in that an additional login-capable user exists +-- during the test run. Under installcheck, a too-permissive pg_hba.conf +-- might allow unwanted logins as regress_authenticated_user_ssa. + +ALTER USER regress_authenticated_user_ssa superuser; +CREATE ROLE regress_session_user; +CREATE ROLE regress_current_user; +GRANT regress_current_user TO regress_authenticated_user_sr; +GRANT regress_session_user TO regress_authenticated_user_ssa; +ALTER ROLE regress_authenticated_user_ssa + SET session_authorization = regress_session_user; +ALTER ROLE regress_authenticated_user_sr SET ROLE = regress_current_user; + +\c - regress_authenticated_user_sr +SELECT current_user, session_user; + +-- The longstanding historical behavior is that session_authorization in +-- setconfig has no effect. Hence, session_user remains +-- regress_authenticated_user_ssa. See comment in InitializeSessionUserId(). +\c - regress_authenticated_user_ssa +SELECT current_user, session_user; +RESET SESSION AUTHORIZATION; +DROP USER regress_session_user; +DROP USER regress_current_user; diff --git a/src/test/modules/worker_spi/.gitignore b/src/test/modules/worker_spi/.gitignore index 5dcb3ff972350..716e17f5a2ad4 100644 --- a/src/test/modules/worker_spi/.gitignore +++ b/src/test/modules/worker_spi/.gitignore @@ -1,4 +1,2 @@ # Generated subdirectories -/log/ -/results/ /tmp_check/ diff --git a/src/test/modules/worker_spi/Makefile b/src/test/modules/worker_spi/Makefile index cbf9b2e37fd6d..024b34cdbb356 100644 --- a/src/test/modules/worker_spi/Makefile +++ b/src/test/modules/worker_spi/Makefile @@ -6,13 +6,7 @@ EXTENSION = worker_spi DATA = worker_spi--1.0.sql PGFILEDESC = "worker_spi - background worker example" -REGRESS = worker_spi - -# enable our module in shared_preload_libraries for dynamic bgworkers -REGRESS_OPTS = --temp-config $(top_srcdir)/src/test/modules/worker_spi/dynamic.conf - -# Disable installcheck to ensure we cover dynamic bgworkers. -NO_INSTALLCHECK = 1 +TAP_TESTS = 1 ifdef USE_PGXS PG_CONFIG = pg_config diff --git a/src/test/modules/worker_spi/dynamic.conf b/src/test/modules/worker_spi/dynamic.conf deleted file mode 100644 index bfe015f6644e5..0000000000000 --- a/src/test/modules/worker_spi/dynamic.conf +++ /dev/null @@ -1,2 +0,0 @@ -shared_preload_libraries = worker_spi -worker_spi.database = contrib_regression diff --git a/src/test/modules/worker_spi/expected/worker_spi.out b/src/test/modules/worker_spi/expected/worker_spi.out deleted file mode 100644 index dc0a79bf75983..0000000000000 --- a/src/test/modules/worker_spi/expected/worker_spi.out +++ /dev/null @@ -1,50 +0,0 @@ -CREATE EXTENSION worker_spi; -SELECT worker_spi_launch(4) IS NOT NULL; - ?column? ----------- - t -(1 row) - --- wait until the worker completes its initialization -DO $$ -DECLARE - visible bool; - loops int := 0; -BEGIN - LOOP - visible := table_name IS NOT NULL - FROM information_schema.tables - WHERE table_schema = 'schema4' AND table_name = 'counted'; - IF visible OR loops > 120 * 10 THEN EXIT; END IF; - PERFORM pg_sleep(0.1); - loops := loops + 1; - END LOOP; -END -$$; -INSERT INTO schema4.counted VALUES ('total', 0), ('delta', 1); -SELECT pg_reload_conf(); - pg_reload_conf ----------------- - t -(1 row) - --- wait until the worker has processed the tuple we just inserted -DO $$ -DECLARE - count int; - loops int := 0; -BEGIN - LOOP - count := count(*) FROM schema4.counted WHERE type = 'delta'; - IF count = 0 OR loops > 120 * 10 THEN EXIT; END IF; - PERFORM pg_sleep(0.1); - loops := loops + 1; - END LOOP; -END -$$; -SELECT * FROM schema4.counted; - type | value --------+------- - total | 1 -(1 row) - diff --git a/src/test/modules/worker_spi/meson.build b/src/test/modules/worker_spi/meson.build index a8cdfdeb36b8b..34e4ee0b12e1d 100644 --- a/src/test/modules/worker_spi/meson.build +++ b/src/test/modules/worker_spi/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group test_worker_spi_sources = files( 'worker_spi.c', @@ -25,12 +25,9 @@ tests += { 'name': 'worker_spi', 'sd': meson.current_source_dir(), 'bd': meson.current_build_dir(), - 'regress': { - 'sql': [ - 'worker_spi', + 'tap': { + 'tests': [ + 't/001_worker_spi.pl', ], - 'dbname': 'contrib_regression', - 'regress_args': ['--temp-config', files('dynamic.conf')], - 'runningcheck': false, }, } diff --git a/src/test/modules/worker_spi/sql/worker_spi.sql b/src/test/modules/worker_spi/sql/worker_spi.sql deleted file mode 100644 index 4683523b29de3..0000000000000 --- a/src/test/modules/worker_spi/sql/worker_spi.sql +++ /dev/null @@ -1,35 +0,0 @@ -CREATE EXTENSION worker_spi; -SELECT worker_spi_launch(4) IS NOT NULL; --- wait until the worker completes its initialization -DO $$ -DECLARE - visible bool; - loops int := 0; -BEGIN - LOOP - visible := table_name IS NOT NULL - FROM information_schema.tables - WHERE table_schema = 'schema4' AND table_name = 'counted'; - IF visible OR loops > 120 * 10 THEN EXIT; END IF; - PERFORM pg_sleep(0.1); - loops := loops + 1; - END LOOP; -END -$$; -INSERT INTO schema4.counted VALUES ('total', 0), ('delta', 1); -SELECT pg_reload_conf(); --- wait until the worker has processed the tuple we just inserted -DO $$ -DECLARE - count int; - loops int := 0; -BEGIN - LOOP - count := count(*) FROM schema4.counted WHERE type = 'delta'; - IF count = 0 OR loops > 120 * 10 THEN EXIT; END IF; - PERFORM pg_sleep(0.1); - loops := loops + 1; - END LOOP; -END -$$; -SELECT * FROM schema4.counted; diff --git a/src/test/modules/worker_spi/t/001_worker_spi.pl b/src/test/modules/worker_spi/t/001_worker_spi.pl new file mode 100644 index 0000000000000..fcd76b43e8e48 --- /dev/null +++ b/src/test/modules/worker_spi/t/001_worker_spi.pl @@ -0,0 +1,167 @@ +# Copyright (c) 2023-2024, PostgreSQL Global Development Group + +# Test worker_spi module. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('mynode'); +$node->init; +$node->start; + +note "testing dynamic bgworkers"; + +$node->safe_psql('postgres', 'CREATE EXTENSION worker_spi;'); + +# Launch one dynamic worker, then wait for its initialization to complete. +# This consists in making sure that a table name "counted" is created +# on a new schema whose name includes the index defined in input argument +# of worker_spi_launch(). +# By default, dynamic bgworkers connect to the "postgres" database with +# an undefined role, falling back to the GUC defaults (or InvalidOid for +# worker_spi_launch). +my $result = + $node->safe_psql('postgres', 'SELECT worker_spi_launch(4) IS NOT NULL;'); +is($result, 't', "dynamic bgworker launched"); +$node->poll_query_until( + 'postgres', + qq[SELECT count(*) > 0 FROM information_schema.tables + WHERE table_schema = 'schema4' AND table_name = 'counted';]); +$node->safe_psql('postgres', + "INSERT INTO schema4.counted VALUES ('total', 0), ('delta', 1);"); +# Issue a SIGHUP on the node to force the worker to loop once, accelerating +# this test. +$node->reload; +# Wait until the worker has processed the tuple that has just been inserted. +$node->poll_query_until('postgres', + qq[SELECT count(*) FROM schema4.counted WHERE type = 'delta';], '0'); +$result = $node->safe_psql('postgres', 'SELECT * FROM schema4.counted;'); +is($result, qq(total|1), 'dynamic bgworker correctly consumed tuple data'); + +# Check the wait event used by the dynamic bgworker. +$result = $node->poll_query_until( + 'postgres', + qq[SELECT wait_event FROM pg_stat_activity WHERE backend_type ~ 'worker_spi';], + qq[WorkerSpiMain]); +is($result, 1, 'dynamic bgworker has reported "WorkerSpiMain" as wait event'); + +# Check the wait event used by the dynamic bgworker appears in pg_wait_events +$result = $node->safe_psql('postgres', + q[SELECT count(*) > 0 from pg_wait_events where type = 'Extension' and name = 'WorkerSpiMain';] +); +is($result, 't', '"WorkerSpiMain" is reported in pg_wait_events'); + +note "testing bgworkers loaded with shared_preload_libraries"; + +# Create the database first so as the workers can connect to it when +# the library is loaded. +$node->safe_psql('postgres', q(CREATE DATABASE mydb;)); +$node->safe_psql('postgres', q(CREATE ROLE myrole SUPERUSER LOGIN;)); +$node->safe_psql('mydb', 'CREATE EXTENSION worker_spi;'); + +# Now load the module as a shared library. +# Update max_worker_processes to make room for enough bgworkers, including +# parallel workers these may spawn. +$node->append_conf( + 'postgresql.conf', q{ +shared_preload_libraries = 'worker_spi' +worker_spi.database = 'mydb' +worker_spi.total_workers = 3 +max_worker_processes = 32 +}); +$node->restart; + +# Check that bgworkers have been registered and launched. +ok( $node->poll_query_until( + 'mydb', + qq[SELECT datname, count(datname), wait_event FROM pg_stat_activity + WHERE backend_type = 'worker_spi' GROUP BY datname, wait_event;], + 'mydb|3|WorkerSpiMain'), + 'bgworkers all launched' +) or die "Timed out while waiting for bgworkers to be launched"; + +# Ask worker_spi to launch dynamic bgworkers with the library loaded, then +# check their existence. Use IDs that do not overlap with the schemas created +# by the previous workers. These ones use a new role, on different databases. +my $myrole_id = $node->safe_psql('mydb', + "SELECT oid FROM pg_roles where rolname = 'myrole';"); +my $mydb_id = $node->safe_psql('mydb', + "SELECT oid FROM pg_database where datname = 'mydb';"); +my $postgresdb_id = $node->safe_psql('mydb', + "SELECT oid FROM pg_database where datname = 'postgres';"); +my $worker1_pid = $node->safe_psql('mydb', + "SELECT worker_spi_launch(10, $mydb_id, $myrole_id);"); +my $worker2_pid = $node->safe_psql('mydb', + "SELECT worker_spi_launch(11, $postgresdb_id, $myrole_id);"); + +ok( $node->poll_query_until( + 'mydb', + qq[SELECT datname, usename, wait_event FROM pg_stat_activity + WHERE backend_type = 'worker_spi dynamic' AND + pid IN ($worker1_pid, $worker2_pid) ORDER BY datname;], + qq[mydb|myrole|WorkerSpiMain +postgres|myrole|WorkerSpiMain]), + 'dynamic bgworkers all launched' +) or die "Timed out while waiting for dynamic bgworkers to be launched"; + +# Check BGWORKER_BYPASS_ALLOWCONN. +$node->safe_psql('postgres', + q(CREATE DATABASE noconndb ALLOW_CONNECTIONS false;)); +my $noconndb_id = $node->safe_psql('mydb', + "SELECT oid FROM pg_database where datname = 'noconndb';"); +my $log_offset = -s $node->logfile; + +# worker_spi_launch() may be able to detect that the worker has been +# stopped, so do not rely on safe_psql(). +$node->psql('postgres', + qq[SELECT worker_spi_launch(12, $noconndb_id, $myrole_id);]); +$node->wait_for_log( + qr/database "noconndb" is not currently accepting connections/, + $log_offset); + +# bgworker bypasses the connection check, and can be launched. +my $worker4_pid = $node->safe_psql('postgres', + qq[SELECT worker_spi_launch(12, $noconndb_id, $myrole_id, '{"ALLOWCONN"}');] +); +ok( $node->poll_query_until( + 'postgres', + qq[SELECT datname, usename, wait_event FROM pg_stat_activity + WHERE backend_type = 'worker_spi dynamic' AND + pid IN ($worker4_pid) ORDER BY datname;], + qq[noconndb|myrole|WorkerSpiMain]), + 'dynamic bgworker with BYPASS_ALLOWCONN started'); + +# Check BGWORKER_BYPASS_ROLELOGINCHECK. +# First create a role without login access. +$node->safe_psql( + 'postgres', qq[ + CREATE ROLE nologrole WITH NOLOGIN; + GRANT CREATE ON DATABASE mydb TO nologrole; +]); +my $nologrole_id = $node->safe_psql('mydb', + "SELECT oid FROM pg_roles where rolname = 'nologrole';"); +$log_offset = -s $node->logfile; + +# bgworker cannot be launched with login restriction. +$node->psql('postgres', + qq[SELECT worker_spi_launch(13, $mydb_id, $nologrole_id);]); +$node->wait_for_log(qr/role "nologrole" is not permitted to log in/, + $log_offset); + +# bgworker bypasses the login restriction, and can be launched. +$log_offset = -s $node->logfile; +my $worker5_pid = $node->safe_psql('mydb', + qq[SELECT worker_spi_launch(13, $mydb_id, $nologrole_id, '{"ROLELOGINCHECK"}');] +); +ok( $node->poll_query_until( + 'mydb', + qq[SELECT datname, usename, wait_event FROM pg_stat_activity + WHERE backend_type = 'worker_spi dynamic' AND + pid = $worker5_pid;], + 'mydb|nologrole|WorkerSpiMain'), + 'dynamic bgworker with BYPASS_ROLELOGINCHECK launched'); + +done_testing(); diff --git a/src/test/modules/worker_spi/worker_spi--1.0.sql b/src/test/modules/worker_spi/worker_spi--1.0.sql index e9d5b07373a8b..84deb6199f635 100644 --- a/src/test/modules/worker_spi/worker_spi--1.0.sql +++ b/src/test/modules/worker_spi/worker_spi--1.0.sql @@ -3,7 +3,11 @@ -- complain if script is sourced in psql, rather than via CREATE EXTENSION \echo Use "CREATE EXTENSION worker_spi" to load this file. \quit -CREATE FUNCTION worker_spi_launch(pg_catalog.int4) +-- In the default case, dboid and roleoid fall back to their respective GUCs. +CREATE FUNCTION worker_spi_launch(index int4, + dboid oid DEFAULT 0, + roleoid oid DEFAULT 0, + flags text[] DEFAULT '{}') RETURNS pg_catalog.int4 STRICT AS 'MODULE_PATHNAME' LANGUAGE C; diff --git a/src/test/modules/worker_spi/worker_spi.c b/src/test/modules/worker_spi/worker_spi.c index ad491d7722945..fc345de0fb238 100644 --- a/src/test/modules/worker_spi/worker_spi.c +++ b/src/test/modules/worker_spi/worker_spi.c @@ -13,7 +13,7 @@ * "delta" type. Delta rows will be deleted by this worker and their values * aggregated into the total. * - * Copyright (c) 2013-2023, PostgreSQL Global Development Group + * Copyright (c) 2013-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/test/modules/worker_spi/worker_spi.c @@ -34,13 +34,15 @@ /* these headers are used by this particular worker's code */ #include "access/xact.h" +#include "commands/dbcommands.h" #include "executor/spi.h" #include "fmgr.h" #include "lib/stringinfo.h" #include "pgstat.h" +#include "tcop/utility.h" +#include "utils/acl.h" #include "utils/builtins.h" #include "utils/snapmgr.h" -#include "tcop/utility.h" PG_MODULE_MAGIC; @@ -52,7 +54,10 @@ PGDLLEXPORT void worker_spi_main(Datum main_arg) pg_attribute_noreturn(); static int worker_spi_naptime = 10; static int worker_spi_total_workers = 2; static char *worker_spi_database = NULL; +static char *worker_spi_role = NULL; +/* value cached, fetched from shared memory */ +static uint32 worker_spi_wait_event_main = 0; typedef struct worktable { @@ -136,12 +141,24 @@ worker_spi_main(Datum main_arg) worktable *table; StringInfoData buf; char name[20]; + Oid dboid; + Oid roleoid; + char *p; + bits32 flags = 0; table = palloc(sizeof(worktable)); sprintf(name, "schema%d", index); table->schema = pstrdup(name); table->name = pstrdup("counted"); + /* fetch database and role OIDs, these are set for a dynamic worker */ + p = MyBgworkerEntry->bgw_extra; + memcpy(&dboid, p, sizeof(Oid)); + p += sizeof(Oid); + memcpy(&roleoid, p, sizeof(Oid)); + p += sizeof(Oid); + memcpy(&flags, p, sizeof(bits32)); + /* Establish signal handlers before unblocking signals. */ pqsignal(SIGHUP, SignalHandlerForConfigReload); pqsignal(SIGTERM, die); @@ -150,7 +167,11 @@ worker_spi_main(Datum main_arg) BackgroundWorkerUnblockSignals(); /* Connect to our database */ - BackgroundWorkerInitializeConnection(worker_spi_database, NULL, 0); + if (OidIsValid(dboid)) + BackgroundWorkerInitializeConnectionByOid(dboid, roleoid, flags); + else + BackgroundWorkerInitializeConnection(worker_spi_database, + worker_spi_role, flags); elog(LOG, "%s initialized with %s.%s", MyBgworkerEntry->bgw_name, table->schema, table->name); @@ -190,6 +211,10 @@ worker_spi_main(Datum main_arg) { int ret; + /* First time, allocate or get the custom wait event */ + if (worker_spi_wait_event_main == 0) + worker_spi_wait_event_main = WaitEventExtensionNew("WorkerSpiMain"); + /* * Background workers mustn't call usleep() or any direct equivalent: * instead, they may wait on their process latch, which sleeps as @@ -199,7 +224,7 @@ worker_spi_main(Datum main_arg) (void) WaitLatch(MyLatch, WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH, worker_spi_naptime * 1000L, - PG_WAIT_EXTENSION); + worker_spi_wait_event_main); ResetLatch(MyLatch); CHECK_FOR_INTERRUPTS(); @@ -283,6 +308,11 @@ _PG_init(void) BackgroundWorker worker; /* get the configuration */ + + /* + * These GUCs are defined even if this library is not loaded with + * shared_preload_libraries, for worker_spi_launch(). + */ DefineCustomIntVariable("worker_spi.naptime", "Duration between each check (in seconds).", NULL, @@ -296,6 +326,24 @@ _PG_init(void) NULL, NULL); + DefineCustomStringVariable("worker_spi.database", + "Database to connect to.", + NULL, + &worker_spi_database, + "postgres", + PGC_SIGHUP, + 0, + NULL, NULL, NULL); + + DefineCustomStringVariable("worker_spi.role", + "Role to connect with.", + NULL, + &worker_spi_role, + NULL, + PGC_SIGHUP, + 0, + NULL, NULL, NULL); + if (!process_shared_preload_libraries_in_progress) return; @@ -312,15 +360,6 @@ _PG_init(void) NULL, NULL); - DefineCustomStringVariable("worker_spi.database", - "Database to connect to.", - NULL, - &worker_spi_database, - "postgres", - PGC_POSTMASTER, - 0, - NULL, NULL, NULL); - MarkGUCPrefixReserved("worker_spi"); /* set up common data for all our workers */ @@ -335,6 +374,10 @@ _PG_init(void) /* * Now fill in worker-specific data, and do the actual registrations. + * + * bgw_extra can optionally include a database OID, a role OID and a set + * of flags. This is left empty here to fallback to the related GUCs at + * startup (0 for the bgworker flags). */ for (int i = 1; i <= worker_spi_total_workers; i++) { @@ -353,10 +396,18 @@ Datum worker_spi_launch(PG_FUNCTION_ARGS) { int32 i = PG_GETARG_INT32(0); + Oid dboid = PG_GETARG_OID(1); + Oid roleoid = PG_GETARG_OID(2); BackgroundWorker worker; BackgroundWorkerHandle *handle; BgwHandleStatus status; pid_t pid; + char *p; + bits32 flags = 0; + ArrayType *arr = PG_GETARG_ARRAYTYPE_P(3); + Size ndim; + int nelems; + Datum *datum_flags; memset(&worker, 0, sizeof(worker)); worker.bgw_flags = BGWORKER_SHMEM_ACCESS | @@ -365,12 +416,62 @@ worker_spi_launch(PG_FUNCTION_ARGS) worker.bgw_restart_time = BGW_NEVER_RESTART; sprintf(worker.bgw_library_name, "worker_spi"); sprintf(worker.bgw_function_name, "worker_spi_main"); - snprintf(worker.bgw_name, BGW_MAXLEN, "worker_spi worker %d", i); - snprintf(worker.bgw_type, BGW_MAXLEN, "worker_spi"); + snprintf(worker.bgw_name, BGW_MAXLEN, "worker_spi dynamic worker %d", i); + snprintf(worker.bgw_type, BGW_MAXLEN, "worker_spi dynamic"); worker.bgw_main_arg = Int32GetDatum(i); /* set bgw_notify_pid so that we can use WaitForBackgroundWorkerStartup */ worker.bgw_notify_pid = MyProcPid; + /* extract flags, if any */ + ndim = ARR_NDIM(arr); + if (ndim > 1) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("flags array must be one-dimensional"))); + + if (array_contains_nulls(arr)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("flags array must not contain nulls"))); + + Assert(ARR_ELEMTYPE(arr) == TEXTOID); + deconstruct_array_builtin(arr, TEXTOID, &datum_flags, NULL, &nelems); + + for (i = 0; i < nelems; i++) + { + char *optname = TextDatumGetCString(datum_flags[i]); + + if (strcmp(optname, "ALLOWCONN") == 0) + flags |= BGWORKER_BYPASS_ALLOWCONN; + else if (strcmp(optname, "ROLELOGINCHECK") == 0) + flags |= BGWORKER_BYPASS_ROLELOGINCHECK; + else + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("incorrect flag value found in array"))); + } + + /* + * Register database and role to use for the worker started in bgw_extra. + * If none have been provided, this will fall back to the GUCs at startup. + */ + if (!OidIsValid(dboid)) + dboid = get_database_oid(worker_spi_database, false); + + /* + * worker_spi_role is NULL by default, so this gives to worker_spi_main() + * an invalid OID in this case. + */ + if (!OidIsValid(roleoid) && worker_spi_role) + roleoid = get_role_oid(worker_spi_role, false); + + p = worker.bgw_extra; + memcpy(p, &dboid, sizeof(Oid)); + p += sizeof(Oid); + memcpy(p, &roleoid, sizeof(Oid)); + p += sizeof(Oid); + memcpy(p, &flags, sizeof(bits32)); + if (!RegisterDynamicBackgroundWorker(&worker, &handle)) PG_RETURN_NULL(); diff --git a/src/test/modules/xid_wraparound/.gitignore b/src/test/modules/xid_wraparound/.gitignore new file mode 100644 index 0000000000000..5dcb3ff972350 --- /dev/null +++ b/src/test/modules/xid_wraparound/.gitignore @@ -0,0 +1,4 @@ +# Generated subdirectories +/log/ +/results/ +/tmp_check/ diff --git a/src/test/modules/xid_wraparound/Makefile b/src/test/modules/xid_wraparound/Makefile new file mode 100644 index 0000000000000..7a6e0f6676294 --- /dev/null +++ b/src/test/modules/xid_wraparound/Makefile @@ -0,0 +1,23 @@ +# src/test/modules/xid_wraparound/Makefile + +MODULE_big = xid_wraparound +OBJS = \ + $(WIN32RES) \ + xid_wraparound.o +PGFILEDESC = "xid_wraparound - tests for XID wraparound" + +EXTENSION = xid_wraparound +DATA = xid_wraparound--1.0.sql + +TAP_TESTS = 1 + +ifdef USE_PGXS +PG_CONFIG = pg_config +PGXS := $(shell $(PG_CONFIG) --pgxs) +include $(PGXS) +else +subdir = src/test/modules/xid_wraparound +top_builddir = ../../../.. +include $(top_builddir)/src/Makefile.global +include $(top_srcdir)/contrib/contrib-global.mk +endif diff --git a/src/test/modules/xid_wraparound/README b/src/test/modules/xid_wraparound/README new file mode 100644 index 0000000000000..3aab464dec776 --- /dev/null +++ b/src/test/modules/xid_wraparound/README @@ -0,0 +1,3 @@ +This module contains tests for XID wraparound. The tests use two +helper functions to quickly consume lots of XIDs, to reach XID +wraparound faster. diff --git a/src/test/modules/xid_wraparound/meson.build b/src/test/modules/xid_wraparound/meson.build new file mode 100644 index 0000000000000..2e5248131b5e1 --- /dev/null +++ b/src/test/modules/xid_wraparound/meson.build @@ -0,0 +1,35 @@ +# Copyright (c) 2023-2024, PostgreSQL Global Development Group + +xid_wraparound_sources = files( + 'xid_wraparound.c', +) + +if host_system == 'windows' + xid_wraparound_sources += rc_lib_gen.process(win32ver_rc, extra_args: [ + '--NAME', 'xid_wraparound', + '--FILEDESC', 'xid_wraparound - tests for XID wraparound',]) +endif + +xid_wraparound = shared_module('xid_wraparound', + xid_wraparound_sources, + kwargs: pg_test_mod_args, +) +test_install_libs += xid_wraparound + +test_install_data += files( + 'xid_wraparound.control', + 'xid_wraparound--1.0.sql', +) + +tests += { + 'name': 'xid_wraparound', + 'sd': meson.current_source_dir(), + 'bd': meson.current_build_dir(), + 'tap': { + 'tests': [ + 't/001_emergency_vacuum.pl', + 't/002_limits.pl', + 't/003_wraparounds.pl', + ], + }, +} diff --git a/src/test/modules/xid_wraparound/t/001_emergency_vacuum.pl b/src/test/modules/xid_wraparound/t/001_emergency_vacuum.pl new file mode 100644 index 0000000000000..2692b35f346f0 --- /dev/null +++ b/src/test/modules/xid_wraparound/t/001_emergency_vacuum.pl @@ -0,0 +1,130 @@ +# Copyright (c) 2023-2024, PostgreSQL Global Development Group + +# Test wraparound emergency autovacuum. +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +if (!$ENV{PG_TEST_EXTRA} || $ENV{PG_TEST_EXTRA} !~ /\bxid_wraparound\b/) +{ + plan skip_all => "test xid_wraparound not enabled in PG_TEST_EXTRA"; +} + +# Initialize node +my $node = PostgreSQL::Test::Cluster->new('main'); + +$node->init; +$node->append_conf( + 'postgresql.conf', qq[ +autovacuum_naptime = 1s +# so it's easier to verify the order of operations +autovacuum_max_workers = 1 +log_autovacuum_min_duration = 0 +]); +$node->start; +$node->safe_psql('postgres', 'CREATE EXTENSION xid_wraparound'); + +# Create tables for a few different test scenarios. We disable autovacuum +# on these tables to run it only to prevent wraparound. +$node->safe_psql( + 'postgres', qq[ +CREATE TABLE large(id serial primary key, data text, filler text default repeat(random()::text, 10)) + WITH (autovacuum_enabled = off); +INSERT INTO large(data) SELECT generate_series(1,30000); + +CREATE TABLE large_trunc(id serial primary key, data text, filler text default repeat(random()::text, 10)) + WITH (autovacuum_enabled = off); +INSERT INTO large_trunc(data) SELECT generate_series(1,30000); + +CREATE TABLE small(id serial primary key, data text, filler text default repeat(random()::text, 10)) + WITH (autovacuum_enabled = off); +INSERT INTO small(data) SELECT generate_series(1,15000); + +CREATE TABLE small_trunc(id serial primary key, data text, filler text default repeat(random()::text, 10)) + WITH (autovacuum_enabled = off); +INSERT INTO small_trunc(data) SELECT generate_series(1,15000); +]); + +# Bump the query timeout to avoid false negatives on slow test systems. +my $psql_timeout_secs = 4 * $PostgreSQL::Test::Utils::timeout_default; + +# Start a background session, which holds a transaction open, preventing +# autovacuum from advancing relfrozenxid and datfrozenxid. +my $background_psql = $node->background_psql( + 'postgres', + on_error_stop => 0, + timeout => $psql_timeout_secs); +$background_psql->set_query_timer_restart(); +$background_psql->query_safe( + qq[ + BEGIN; + DELETE FROM large WHERE id % 2 = 0; + DELETE FROM large_trunc WHERE id > 10000; + DELETE FROM small WHERE id % 2 = 0; + DELETE FROM small_trunc WHERE id > 1000; +]); + +# Consume 2 billion XIDs, to get us very close to wraparound +$node->safe_psql('postgres', + qq[SELECT consume_xids_until('2000000000'::xid8)]); + +# Make sure the latest completed XID is advanced +$node->safe_psql('postgres', qq[INSERT INTO small(data) SELECT 1]); + +# Check that all databases became old enough to trigger failsafe. +my $ret = $node->safe_psql( + 'postgres', + qq[ +SELECT datname, + age(datfrozenxid) > current_setting('vacuum_failsafe_age')::int as old +FROM pg_database ORDER BY 1 +]); +is( $ret, "postgres|t +template0|t +template1|t", "all tables became old"); + +my $log_offset = -s $node->logfile; + +# Finish the old transaction, to allow vacuum freezing to advance +# relfrozenxid and datfrozenxid again. +$background_psql->query_safe(qq[COMMIT]); +$background_psql->quit; + +# Wait until autovacuum processed all tables and advanced the +# system-wide oldest-XID. +$node->poll_query_until( + 'postgres', qq[ +SELECT NOT EXISTS ( + SELECT * + FROM pg_database + WHERE age(datfrozenxid) > current_setting('autovacuum_freeze_max_age')::int) +]) or die "timeout waiting for all databases to be vacuumed"; + +# Check if these tables are vacuumed. +$ret = $node->safe_psql( + 'postgres', qq[ +SELECT relname, age(relfrozenxid) > current_setting('autovacuum_freeze_max_age')::int +FROM pg_class +WHERE relname IN ('large', 'large_trunc', 'small', 'small_trunc') +ORDER BY 1 +]); + +is( $ret, "large|f +large_trunc|f +small|f +small_trunc|f", "all tables are vacuumed"); + +# Check if vacuum failsafe was triggered for each table. +my $log_contents = slurp_file($node->logfile, $log_offset); +foreach my $tablename ('large', 'large_trunc', 'small', 'small_trunc') +{ + like( + $log_contents, + qr/bypassing nonessential maintenance of table "postgres.public.$tablename" as a failsafe after \d+ index scans/, + "failsafe vacuum triggered for $tablename"); +} + +$node->stop; +done_testing(); diff --git a/src/test/modules/xid_wraparound/t/002_limits.pl b/src/test/modules/xid_wraparound/t/002_limits.pl new file mode 100644 index 0000000000000..889689d3bde06 --- /dev/null +++ b/src/test/modules/xid_wraparound/t/002_limits.pl @@ -0,0 +1,138 @@ +# Copyright (c) 2023-2024, PostgreSQL Global Development Group +# +# Test XID wraparound limits. +# +# When you get close to XID wraparound, you start to get warnings, and +# when you get even closer, the system refuses to assign any more XIDs +# until the oldest databases have been vacuumed and datfrozenxid has +# been advanced. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; +use Time::HiRes qw(usleep); + +if (!$ENV{PG_TEST_EXTRA} || $ENV{PG_TEST_EXTRA} !~ /\bxid_wraparound\b/) +{ + plan skip_all => "test xid_wraparound not enabled in PG_TEST_EXTRA"; +} + +my $ret; + +# Initialize node +my $node = PostgreSQL::Test::Cluster->new('wraparound'); + +$node->init; +$node->append_conf( + 'postgresql.conf', qq[ +autovacuum_naptime = 1s +log_autovacuum_min_duration = 0 +]); +$node->start; +$node->safe_psql('postgres', 'CREATE EXTENSION xid_wraparound'); + +# Create a test table. We disable autovacuum on the table to run it only +# to prevent wraparound. +$node->safe_psql( + 'postgres', qq[ +CREATE TABLE wraparoundtest(t text) WITH (autovacuum_enabled = off); +INSERT INTO wraparoundtest VALUES ('start'); +]); + +# Bump the query timeout to avoid false negatives on slow test systems. +my $psql_timeout_secs = 4 * $PostgreSQL::Test::Utils::timeout_default; + +# Start a background session, which holds a transaction open, preventing +# autovacuum from advancing relfrozenxid and datfrozenxid. +my $background_psql = $node->background_psql( + 'postgres', + on_error_stop => 0, + timeout => $psql_timeout_secs); +$background_psql->query_safe( + qq[ + BEGIN; + INSERT INTO wraparoundtest VALUES ('oldxact'); +]); + +# Consume 2 billion transactions, to get close to wraparound +$node->safe_psql('postgres', qq[SELECT consume_xids(1000000000)]); +$node->safe_psql('postgres', + qq[INSERT INTO wraparoundtest VALUES ('after 1 billion')]); + +$node->safe_psql('postgres', qq[SELECT consume_xids(1000000000)]); +$node->safe_psql('postgres', + qq[INSERT INTO wraparoundtest VALUES ('after 2 billion')]); + +# We are now just under 150 million XIDs away from wraparound. +# Continue consuming XIDs, in batches of 10 million, until we get +# the warning: +# +# WARNING: database "postgres" must be vacuumed within 3000024 transactions +# HINT: To avoid a database shutdown, execute a database-wide VACUUM in that database. +# You might also need to commit or roll back old prepared transactions, or drop stale replication slots. +my $stderr; +my $warn_limit = 0; +for my $i (1 .. 15) +{ + $node->psql( + 'postgres', qq[SELECT consume_xids(10000000)], + stderr => \$stderr, + on_error_die => 1); + + if ($stderr =~ + /WARNING: database "postgres" must be vacuumed within [0-9]+ transactions/ + ) + { + # Reached the warn-limit + $warn_limit = 1; + last; + } +} +ok($warn_limit == 1, "warn-limit reached"); + +# We can still INSERT, despite the warnings. +$node->safe_psql('postgres', + qq[INSERT INTO wraparoundtest VALUES ('reached warn-limit')]); + +# Keep going. We'll hit the hard "stop" limit. +$ret = $node->psql( + 'postgres', + qq[SELECT consume_xids(100000000)], + stderr => \$stderr); +like( + $stderr, + qr/ERROR: database is not accepting commands that assign new transaction IDs to avoid wraparound data loss in database "postgres"/, + "stop-limit"); + +# Finish the old transaction, to allow vacuum freezing to advance +# relfrozenxid and datfrozenxid again. +$background_psql->query_safe(qq[COMMIT]); +$background_psql->quit; + +# VACUUM, to freeze the tables and advance datfrozenxid. +# +# Autovacuum does this for the other databases, and would do it for +# 'postgres' too, but let's test manual VACUUM. +# +$node->safe_psql('postgres', 'VACUUM'); + +# Wait until autovacuum has processed the other databases and advanced +# the system-wide oldest-XID. +$ret = + $node->poll_query_until('postgres', + qq[INSERT INTO wraparoundtest VALUES ('after VACUUM')], + 'INSERT 0 1'); + +# Check the table contents +$ret = $node->safe_psql('postgres', qq[SELECT * from wraparoundtest]); +is( $ret, "start +oldxact +after 1 billion +after 2 billion +reached warn-limit +after VACUUM"); + +$node->stop; +done_testing(); diff --git a/src/test/modules/xid_wraparound/t/003_wraparounds.pl b/src/test/modules/xid_wraparound/t/003_wraparounds.pl new file mode 100644 index 0000000000000..3eaa46a94d077 --- /dev/null +++ b/src/test/modules/xid_wraparound/t/003_wraparounds.pl @@ -0,0 +1,60 @@ +# Copyright (c) 2023-2024, PostgreSQL Global Development Group +# +# Consume a lot of XIDs, wrapping around a few times. +# + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; +use Time::HiRes qw(usleep); + +if (!$ENV{PG_TEST_EXTRA} || $ENV{PG_TEST_EXTRA} !~ /\bxid_wraparound\b/) +{ + plan skip_all => "test xid_wraparound not enabled in PG_TEST_EXTRA"; +} + +# Initialize node +my $node = PostgreSQL::Test::Cluster->new('wraparound'); + +$node->init; +$node->append_conf( + 'postgresql.conf', qq[ +autovacuum_naptime = 1s +# so it's easier to verify the order of operations +autovacuum_max_workers = 1 +log_autovacuum_min_duration = 0 +]); +$node->start; +$node->safe_psql('postgres', 'CREATE EXTENSION xid_wraparound'); + +# Create a test table. We disable autovacuum on the table to run +# it only to prevent wraparound. +$node->safe_psql( + 'postgres', qq[ +CREATE TABLE wraparoundtest(t text) WITH (autovacuum_enabled = off); +INSERT INTO wraparoundtest VALUES ('beginning'); +]); + +# Bump the query timeout to avoid false negatives on slow test systems. +my $psql_timeout_secs = 4 * $PostgreSQL::Test::Utils::timeout_default; + +# Burn through 10 billion transactions in total, in batches of 100 million. +my $ret; +for my $i (1 .. 100) +{ + $ret = $node->safe_psql( + 'postgres', + qq[SELECT consume_xids(100000000)], + timeout => $psql_timeout_secs); + $ret = $node->safe_psql('postgres', + qq[INSERT INTO wraparoundtest VALUES ('after $i batches')]); +} + +$ret = $node->safe_psql('postgres', qq[SELECT COUNT(*) FROM wraparoundtest]); +is($ret, "101"); + +$node->stop; + +done_testing(); diff --git a/src/test/modules/xid_wraparound/xid_wraparound--1.0.sql b/src/test/modules/xid_wraparound/xid_wraparound--1.0.sql new file mode 100644 index 0000000000000..51d25fc4c6343 --- /dev/null +++ b/src/test/modules/xid_wraparound/xid_wraparound--1.0.sql @@ -0,0 +1,12 @@ +/* src/test/modules/xid_wraparound/xid_wraparound--1.0.sql */ + +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION xid_wraparound" to load this file. \quit + +CREATE FUNCTION consume_xids(nxids bigint) +RETURNS xid8 IMMUTABLE PARALLEL SAFE STRICT +AS 'MODULE_PATHNAME' LANGUAGE C; + +CREATE FUNCTION consume_xids_until(targetxid xid8) +RETURNS xid8 IMMUTABLE PARALLEL SAFE STRICT +AS 'MODULE_PATHNAME' LANGUAGE C; diff --git a/src/test/modules/xid_wraparound/xid_wraparound.c b/src/test/modules/xid_wraparound/xid_wraparound.c new file mode 100644 index 0000000000000..dce81c0c6d69e --- /dev/null +++ b/src/test/modules/xid_wraparound/xid_wraparound.c @@ -0,0 +1,219 @@ +/*-------------------------------------------------------------------------- + * + * xid_wraparound.c + * Utilities for testing XID wraparound + * + * + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/test/modules/xid_wraparound/xid_wraparound.c + * + * ------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "access/xact.h" +#include "miscadmin.h" +#include "storage/proc.h" +#include "utils/xid8.h" + +PG_MODULE_MAGIC; + +static int64 consume_xids_shortcut(void); +static FullTransactionId consume_xids_common(FullTransactionId untilxid, uint64 nxids); + +/* + * Consume the specified number of XIDs. + */ +PG_FUNCTION_INFO_V1(consume_xids); +Datum +consume_xids(PG_FUNCTION_ARGS) +{ + int64 nxids = PG_GETARG_INT64(0); + FullTransactionId lastxid; + + if (nxids < 0) + elog(ERROR, "invalid nxids argument: %lld", (long long) nxids); + + if (nxids == 0) + lastxid = ReadNextFullTransactionId(); + else + lastxid = consume_xids_common(InvalidFullTransactionId, (uint64) nxids); + + PG_RETURN_FULLTRANSACTIONID(lastxid); +} + +/* + * Consume XIDs, up to the given XID. + */ +PG_FUNCTION_INFO_V1(consume_xids_until); +Datum +consume_xids_until(PG_FUNCTION_ARGS) +{ + FullTransactionId targetxid = PG_GETARG_FULLTRANSACTIONID(0); + FullTransactionId lastxid; + + if (!FullTransactionIdIsNormal(targetxid)) + elog(ERROR, "targetxid %llu is not normal", + (unsigned long long) U64FromFullTransactionId(targetxid)); + + lastxid = consume_xids_common(targetxid, 0); + + PG_RETURN_FULLTRANSACTIONID(lastxid); +} + +/* + * Common functionality between the two public functions. + */ +static FullTransactionId +consume_xids_common(FullTransactionId untilxid, uint64 nxids) +{ + FullTransactionId lastxid; + uint64 last_reported_at = 0; + uint64 consumed = 0; + + /* Print a NOTICE every REPORT_INTERVAL xids */ +#define REPORT_INTERVAL (10 * 1000000) + + /* initialize 'lastxid' with the system's current next XID */ + lastxid = ReadNextFullTransactionId(); + + /* + * We consume XIDs by calling GetNewTransactionId(true), which marks the + * consumed XIDs as subtransactions of the current top-level transaction. + * For that to work, this transaction must have a top-level XID. + * + * GetNewTransactionId registers them in the subxid cache in PGPROC, until + * the cache overflows, but beyond that, we don't keep track of the + * consumed XIDs. + */ + (void) GetTopTransactionId(); + + for (;;) + { + uint64 xids_left; + + CHECK_FOR_INTERRUPTS(); + + /* How many XIDs do we have left to consume? */ + if (nxids > 0) + { + if (consumed >= nxids) + break; + xids_left = nxids - consumed; + } + else + { + if (FullTransactionIdFollowsOrEquals(lastxid, untilxid)) + break; + xids_left = U64FromFullTransactionId(untilxid) - U64FromFullTransactionId(lastxid); + } + + /* + * If we still have plenty of XIDs to consume, try to take a shortcut + * and bump up the nextXid counter directly. + */ + if (xids_left > 2000 && + consumed - last_reported_at < REPORT_INTERVAL && + MyProc->subxidStatus.overflowed) + { + int64 consumed_by_shortcut = consume_xids_shortcut(); + + if (consumed_by_shortcut > 0) + { + consumed += consumed_by_shortcut; + continue; + } + } + + /* Slow path: Call GetNewTransactionId to allocate a new XID. */ + lastxid = GetNewTransactionId(true); + consumed++; + + /* Report progress */ + if (consumed - last_reported_at >= REPORT_INTERVAL) + { + if (nxids > 0) + elog(NOTICE, "consumed %llu / %llu XIDs, latest %u:%u", + (unsigned long long) consumed, (unsigned long long) nxids, + EpochFromFullTransactionId(lastxid), + XidFromFullTransactionId(lastxid)); + else + elog(NOTICE, "consumed up to %u:%u / %u:%u", + EpochFromFullTransactionId(lastxid), + XidFromFullTransactionId(lastxid), + EpochFromFullTransactionId(untilxid), + XidFromFullTransactionId(untilxid)); + last_reported_at = consumed; + } + } + + return lastxid; +} + +/* + * These constants copied from .c files, because they're private. + */ +#define COMMIT_TS_XACTS_PER_PAGE (BLCKSZ / 10) +#define SUBTRANS_XACTS_PER_PAGE (BLCKSZ / sizeof(TransactionId)) +#define CLOG_XACTS_PER_BYTE 4 +#define CLOG_XACTS_PER_PAGE (BLCKSZ * CLOG_XACTS_PER_BYTE) + +/* + * All the interesting action in GetNewTransactionId happens when we extend + * the SLRUs, or at the uint32 wraparound. If the nextXid counter is not close + * to any of those interesting values, take a shortcut and bump nextXID + * directly, close to the next "interesting" value. + */ +static inline uint32 +XidSkip(FullTransactionId fullxid) +{ + uint32 low = XidFromFullTransactionId(fullxid); + uint32 rem; + uint32 distance; + + if (low < 5 || low >= UINT32_MAX - 5) + return 0; + distance = UINT32_MAX - 5 - low; + + rem = low % COMMIT_TS_XACTS_PER_PAGE; + if (rem == 0) + return 0; + distance = Min(distance, COMMIT_TS_XACTS_PER_PAGE - rem); + + rem = low % SUBTRANS_XACTS_PER_PAGE; + if (rem == 0) + return 0; + distance = Min(distance, SUBTRANS_XACTS_PER_PAGE - rem); + + rem = low % CLOG_XACTS_PER_PAGE; + if (rem == 0) + return 0; + distance = Min(distance, CLOG_XACTS_PER_PAGE - rem); + + return distance; +} + +static int64 +consume_xids_shortcut(void) +{ + FullTransactionId nextXid; + uint32 consumed; + + LWLockAcquire(XidGenLock, LW_EXCLUSIVE); + nextXid = TransamVariables->nextXid; + + /* + * Go slow near the "interesting values". The interesting zones include 5 + * transactions before and after SLRU page switches. + */ + consumed = XidSkip(nextXid); + if (consumed > 0) + TransamVariables->nextXid.value += (uint64) consumed; + + LWLockRelease(XidGenLock); + + return consumed; +} diff --git a/src/test/modules/xid_wraparound/xid_wraparound.control b/src/test/modules/xid_wraparound/xid_wraparound.control new file mode 100644 index 0000000000000..6c6964ed3d3f4 --- /dev/null +++ b/src/test/modules/xid_wraparound/xid_wraparound.control @@ -0,0 +1,4 @@ +comment = 'Tests for XID wraparound' +default_version = '1.0' +module_pathname = '$libdir/xid_wraparound' +relocatable = true diff --git a/src/test/perl/Makefile b/src/test/perl/Makefile index 435b45a6cc568..82ea63b08e2dd 100644 --- a/src/test/perl/Makefile +++ b/src/test/perl/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/test/perl # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/test/perl/Makefile diff --git a/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm b/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm index 843f65b448be3..db833ba251717 100644 --- a/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm +++ b/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2023, PostgreSQL Global Development Group +# Copyright (c) 2023-2024, PostgreSQL Global Development Group =pod @@ -30,7 +30,7 @@ compare the results of cross-version upgrade tests. package PostgreSQL::Test::AdjustUpgrade; use strict; -use warnings; +use warnings FATAL => 'all'; use Exporter 'import'; use PostgreSQL::Version; @@ -76,9 +76,17 @@ sub adjust_database_contents my ($old_version, %dbnames) = @_; my $result = {}; + die "wrong type for \$old_version\n" + unless $old_version->isa("PostgreSQL::Version"); + + # The version tests can be sensitive if fixups have been applied in a + # recent version and pg_upgrade is run with a beta version, or such. + # Therefore, use a modified version object that only contains the major. + $old_version = PostgreSQL::Version->new($old_version->major); + # remove dbs of modules known to cause pg_upgrade to fail # anything not builtin and incompatible should clean up its own db - foreach my $bad_module ('test_ddl_deparse', 'tsearch2') + foreach my $bad_module ('adminpack', 'test_ddl_deparse', 'tsearch2') { if ($dbnames{"contrib_regression_$bad_module"}) { @@ -86,6 +94,12 @@ sub adjust_database_contents "drop database contrib_regression_$bad_module"); delete($dbnames{"contrib_regression_$bad_module"}); } + if ($dbnames{"regression_$bad_module"}) + { + _add_st($result, 'postgres', + "drop database regression_$bad_module"); + delete($dbnames{"regression_$bad_module"}); + } } # avoid no-path-to-downgrade-extension-version issues @@ -98,6 +112,13 @@ sub adjust_database_contents 'drop extension if exists test_ext7'); } + # we removed this test-support function in v17 + if ($old_version >= 15 && $old_version < 17) + { + _add_st($result, 'regression', + 'drop function get_columns_length(oid[])'); + } + # stuff not supported from release 16 if ($old_version >= 12 && $old_version < 16) { @@ -262,6 +283,11 @@ sub adjust_old_dumpfile { my ($old_version, $dump) = @_; + die "wrong type for \$old_version\n" + unless $old_version->isa("PostgreSQL::Version"); + # See adjust_database_contents about this + $old_version = PostgreSQL::Version->new($old_version->major); + # use Unix newlines $dump =~ s/\r\n/\n/g; @@ -274,7 +300,7 @@ sub adjust_old_dumpfile $dump = _mash_view_qualifiers($dump); } - if ($old_version >= 14 && $old_version < 16) + if ($old_version >= 14 && $old_version < 17) { # Fix up some privilege-set discrepancies. $dump =~ @@ -590,12 +616,23 @@ sub adjust_new_dumpfile { my ($old_version, $dump) = @_; + die "wrong type for \$old_version\n" + unless $old_version->isa("PostgreSQL::Version"); + # See adjust_database_contents about this + $old_version = PostgreSQL::Version->new($old_version->major); + # use Unix newlines $dump =~ s/\r\n/\n/g; # Version comments will certainly not match. $dump =~ s/^-- Dumped from database version.*\n//mg; + # pre-v16 dumps do not know about XMLSERIALIZE(NO INDENT). + if ($old_version < 16) + { + $dump =~ s/XMLSERIALIZE\((.*)? NO INDENT\)/XMLSERIALIZE\($1\)/mg; + } + if ($old_version < 14) { # Suppress noise-word uses of IN in CREATE/ALTER PROCEDURE. diff --git a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm index 924b57ab21862..a552132484ec9 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group =pod @@ -54,7 +54,7 @@ initiated by PostgreSQL::Test::Cluster. package PostgreSQL::Test::BackgroundPsql; use strict; -use warnings; +use warnings FATAL => 'all'; use Carp; use Config; @@ -68,7 +68,7 @@ use Test::More; =over -=item PostgreSQL::Test::BackgroundPsql->new(interactive, @params) +=item PostgreSQL::Test::BackgroundPsql->new(interactive, @psql_params, timeout, wait) Builds a new object of class C for either an interactive or background session and starts it. If C is @@ -76,17 +76,21 @@ true then a PTY will be attached. C should contain the full command to run psql with all desired parameters and a complete connection string. For C sessions, IO::Pty is required. +This routine will not return until psql has started up and is ready to +consume input. Set B to 0 to return immediately instead. + =cut sub new { my $class = shift; - my ($interactive, $psql_params) = @_; + my ($interactive, $psql_params, $timeout, $wait) = @_; my $psql = { 'stdin' => '', 'stdout' => '', 'stderr' => '', - 'query_timer_restart' => undef + 'query_timer_restart' => undef, + 'query_cnt' => 1, }; my $run; @@ -96,8 +100,10 @@ sub new "Forbidden caller of constructor: package: $package, file: $file:$line" unless $package->isa('PostgreSQL::Test::Cluster'); - $psql->{timeout} = - IPC::Run::timeout($PostgreSQL::Test::Utils::timeout_default); + $psql->{timeout} = IPC::Run::timeout( + defined($timeout) + ? $timeout + : $PostgreSQL::Test::Utils::timeout_default); if ($interactive) { @@ -117,14 +123,25 @@ sub new my $self = bless $psql, $class; - $self->_wait_connect(); + $wait = 1 unless defined($wait); + if ($wait) + { + $self->wait_connect(); + } return $self; } -# Internal routine for awaiting psql starting up and being ready to consume -# input. -sub _wait_connect +=pod + +=item $session->wait_connect + +Returns once psql has started up and is ready to consume input. This is called +automatically for clients unless requested otherwise in the constructor. + +=cut + +sub wait_connect { my ($self) = @_; @@ -132,11 +149,25 @@ sub _wait_connect # connection failures are caught here, relieving callers of the need to # handle those. (Right now, we have no particularly good handling for # errors anyway, but that might be added later.) + # + # See query() for details about why/how the banner is used. my $banner = "background_psql: ready"; - $self->{stdin} .= "\\echo $banner\n"; + my $banner_match = qr/(^|\n)$banner\r?\n/; + $self->{stdin} .= "\\echo $banner\n\\warn $banner\n"; $self->{run}->pump() - until $self->{stdout} =~ /$banner/ || $self->{timeout}->is_expired; - $self->{stdout} = ''; # clear out banner + until ($self->{stdout} =~ /$banner_match/ + && $self->{stderr} =~ /$banner\r?\n/) + || $self->{timeout}->is_expired; + + note "connect output:\n", + explain { + stdout => $self->{stdout}, + stderr => $self->{stderr}, + }; + + # clear out banners + $self->{stdout} = ''; + $self->{stderr} = ''; die "psql startup timed out" if $self->{timeout}->is_expired; } @@ -185,7 +216,7 @@ sub reconnect_and_clear $self->{stdin} = ''; $self->{stdout} = ''; - $self->_wait_connect(); + $self->wait_connect(); } =pod @@ -203,25 +234,57 @@ sub query my ($self, $query) = @_; my $ret; my $output; + my $query_cnt = $self->{query_cnt}++; + local $Test::Builder::Level = $Test::Builder::Level + 1; - note "issuing query via background psql: $query"; + note "issuing query $query_cnt via background psql: $query"; $self->{timeout}->start() if (defined($self->{query_timer_restart})); # Feed the query to psql's stdin, followed by \n (so psql processes the # line), by a ; (so that psql issues the query, if it doesn't include a ; - # itself), and a separator echoed with \echo, that we can wait on. - my $banner = "background_psql: QUERY_SEPARATOR"; - $self->{stdin} .= "$query\n;\n\\echo $banner\n"; - - pump_until($self->{run}, $self->{timeout}, \$self->{stdout}, qr/$banner/); + # itself), and a separator echoed both with \echo and \warn, that we can + # wait on. + # + # To avoid somehow confusing the separator from separately issued queries, + # and to make it easier to debug, we include a per-psql query counter in + # the separator. + # + # We need both \echo (printing to stdout) and \warn (printing to stderr), + # because on windows we can get data on stdout before seeing data on + # stderr (or vice versa), even if psql printed them in the opposite + # order. We therefore wait on both. + # + # We need to match for the newline, because we try to remove it below, and + # it's possible to consume just the input *without* the newline. In + # interactive psql we emit \r\n, so we need to allow for that. Also need + # to be careful that we don't e.g. match the echoed \echo command, rather + # than its output. + my $banner = "background_psql: QUERY_SEPARATOR $query_cnt:"; + my $banner_match = qr/(^|\n)$banner\r?\n/; + $self->{stdin} .= "$query\n;\n\\echo $banner\n\\warn $banner\n"; + pump_until( + $self->{run}, $self->{timeout}, + \$self->{stdout}, qr/$banner_match/); + pump_until( + $self->{run}, $self->{timeout}, + \$self->{stderr}, qr/$banner_match/); die "psql query timed out" if $self->{timeout}->is_expired; - $output = $self->{stdout}; - # remove banner again, our caller doesn't care - $output =~ s/\n$banner$//s; + note "results query $query_cnt:\n", + explain { + stdout => $self->{stdout}, + stderr => $self->{stderr}, + }; + + # Remove banner from stdout and stderr, our caller doesn't care. The + # first newline is optional, as there would not be one if consuming an + # empty query result. + $output = $self->{stdout}; + $output =~ s/$banner_match//; + $self->{stderr} =~ s/$banner_match//; # clear out output for the next query $self->{stdout} = ''; @@ -301,7 +364,7 @@ sub set_query_timer_restart { my $self = shift; - $self->{query_timer_restart} = shift if @_; + $self->{query_timer_restart} = 1; return $self->{query_timer_restart}; } diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index 5e161dbee6075..f2d9afd398fbb 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group =pod @@ -62,9 +62,6 @@ PostgreSQL::Test::Cluster - class representing PostgreSQL server instance # Do an online pg_basebackup my $ret = $node->backup('testbackup1'); - # Take a backup of a running server - my $ret = $node->backup_fs_hot('testbackup2'); - # Take a backup of a stopped server $node->stop; my $ret = $node->backup_fs_cold('testbackup3') @@ -97,7 +94,7 @@ The IPC::Run module is required. package PostgreSQL::Test::Cluster; use strict; -use warnings; +use warnings FATAL => 'all'; use Carp; use Config; @@ -114,6 +111,7 @@ use Socket; use Test::More; use PostgreSQL::Test::Utils (); use PostgreSQL::Test::BackgroundPsql (); +use Text::ParseWords qw(shellwords); use Time::HiRes qw(usleep); use Scalar::Util qw(blessed); @@ -127,6 +125,14 @@ our $min_compat = 12; # list of file reservations made by get_free_port my @port_reservation_files; +# We want to choose a server port above the range that servers typically use +# on Unix systems and below the range those systems typically use for ephemeral +# client ports. +# That way we minimize the risk of getting a port collision. These two values +# are chosen to reflect that. We will always choose a port in this range. +my $port_lower_bound = 10200; +my $port_upper_bound = 32767; + INIT { @@ -151,7 +157,8 @@ INIT $ENV{PGDATABASE} = 'postgres'; # Tracking of last port value assigned to accelerate free port lookup. - $last_port_assigned = int(rand() * 16384) + 49152; + my $num_ports = $port_upper_bound - $port_lower_bound; + $last_port_assigned = int(rand() * $num_ports) + $port_lower_bound; # Set the port lock directory @@ -160,9 +167,7 @@ INIT $portdir = $ENV{PG_TEST_PORT_DIR}; # Otherwise, try to use a directory at the top of the build tree # or as a last resort use the tmp_check directory - my $build_dir = - $ENV{MESON_BUILD_ROOT} - || $ENV{top_builddir} + my $build_dir = $ENV{top_builddir} || $PostgreSQL::Test::Utils::tmp_check; $portdir ||= "$build_dir/portlock"; $portdir =~ s!\\!/!g; @@ -469,7 +474,7 @@ sub set_replication_conf $self->host eq $test_pghost or croak "set_replication_conf only works with the default host"; - open my $hba, '>>', "$pgdata/pg_hba.conf"; + open my $hba, '>>', "$pgdata/pg_hba.conf" or die $!; print $hba "\n# Allow replication (set up by PostgreSQL::Test::Cluster.pm)\n"; if ($PostgreSQL::Test::Utils::windows_os @@ -502,6 +507,9 @@ parameter allows_streaming => 'logical' or 'physical' (passing 1 will also suffice for physical replication) depending on type of replication that should be enabled. This is disabled by default. +force_initdb => 1 will force the initialization of the cluster with a new +initdb rather than copying the data folder from a template. + The new node is set up in a fast but unsafe configuration where fsync is disabled. @@ -517,17 +525,69 @@ sub init local %ENV = $self->_get_env(); $params{allows_streaming} = 0 unless defined $params{allows_streaming}; + $params{force_initdb} = 0 unless defined $params{force_initdb}; $params{has_archiving} = 0 unless defined $params{has_archiving}; + my $initdb_extra_opts_env = $ENV{PG_TEST_INITDB_EXTRA_OPTS}; + if (defined $initdb_extra_opts_env) + { + push @{ $params{extra} }, shellwords($initdb_extra_opts_env); + } + mkdir $self->backup_dir; mkdir $self->archive_dir; - PostgreSQL::Test::Utils::system_or_bail('initdb', '-D', $pgdata, '-A', - 'trust', '-N', @{ $params{extra} }); + # If available, if there aren't any parameters and if force_initdb is + # disabled, use a previously initdb'd cluster as a template by copying it. + # For a lot of tests, that's substantially cheaper. It does not seem + # worth figuring out whether extra parameters affect compatibility, so + # initdb is forced if any are defined. + # + # There's very similar code in pg_regress.c, but we can't easily + # deduplicate it until we require perl at build time. + if ( $params{force_initdb} + or defined $params{extra} + or !defined $ENV{INITDB_TEMPLATE}) + { + note("initializing database system by running initdb"); + PostgreSQL::Test::Utils::system_or_bail('initdb', '-D', $pgdata, '-A', + 'trust', '-N', @{ $params{extra} }); + } + else + { + my @copycmd; + my $expected_exitcode; + + note("initializing database system by copying initdb template"); + + if ($PostgreSQL::Test::Utils::windows_os) + { + @copycmd = qw(robocopy /E /NJS /NJH /NFL /NDL /NP); + $expected_exitcode = 1; # 1 denotes files were copied + } + else + { + @copycmd = qw(cp -RPp); + $expected_exitcode = 0; + } + + @copycmd = (@copycmd, $ENV{INITDB_TEMPLATE}, $pgdata); + + my $ret = PostgreSQL::Test::Utils::system_log(@copycmd); + + # See http://perldoc.perl.org/perlvar.html#%24CHILD_ERROR + if ($ret & 127 or $ret >> 8 != $expected_exitcode) + { + BAIL_OUT( + sprintf("failed to execute command \"%s\": $ret", + join(" ", @copycmd))); + } + } + PostgreSQL::Test::Utils::system_or_bail($ENV{PG_REGRESS}, '--config-auth', $pgdata, @{ $params{auth_extra} }); - open my $conf, '>>', "$pgdata/postgresql.conf"; + open my $conf, '>>', "$pgdata/postgresql.conf" or die $!; print $conf "\n# Added by PostgreSQL::Test::Cluster.pm\n"; print $conf "fsync = off\n"; print $conf "restart_after_crash = off\n"; @@ -703,7 +763,7 @@ Create a backup with a filesystem level copy in subdirectory B of B<< $node->backup_dir >>, including WAL. The server must be stopped as no attempt to handle concurrent writes is made. -Use B or B if you want to back up a running server. +Use B if you want to back up a running server. =cut @@ -724,7 +784,7 @@ sub backup_fs_cold =pod -=item $node->init_from_backup(root_node, backup_name) +=item $node->init_from_backup(root_node, backup_name, %params) Initialize a node from a backup, which may come from this node or a different node. root_node must be a PostgreSQL::Test::Cluster reference, backup_name the string name @@ -734,8 +794,17 @@ Does not start the node after initializing it. By default, the backup is assumed to be plain format. To restore from a tar-format backup, pass the name of the tar program to use in the -keyword parameter tar_program. Note that tablespace tar files aren't -handled here. +keyword parameter tar_program. + +If there are tablespace present in the backup, include tablespace_map as +a keyword parameter whose values is a hash. When combine_with_prior is used, +the hash keys are the tablespace pathnames used in the backup; otherwise, +they are tablespace OIDs. In either case, the values are the tablespace +pathnames that should be used for the target cluster. + +To restore from an incremental backup, pass the parameter combine_with_prior +as a reference to an array of prior backup names with which this backup +is to be combined using pg_combinebackup. Streaming replication can be enabled on this node by passing the keyword parameter has_streaming => 1. This is disabled by default. @@ -774,9 +843,37 @@ sub init_from_backup mkdir $self->archive_dir; my $data_path = $self->data_dir; - if (defined $params{tar_program}) + if (defined $params{combine_with_prior}) { - mkdir($data_path); + my @prior_backups = @{ $params{combine_with_prior} }; + my @prior_backup_path; + + for my $prior_backup_name (@prior_backups) + { + push @prior_backup_path, + $root_node->backup_dir . '/' . $prior_backup_name; + } + + local %ENV = $self->_get_env(); + my @combineargs = ('pg_combinebackup', '-d'); + if (exists $params{tablespace_map}) + { + while (my ($olddir, $newdir) = each %{ $params{tablespace_map} }) + { + push @combineargs, "-T$olddir=$newdir"; + } + } + # use the combine mode (clone/copy-file-range) if specified + if (defined $params{combine_mode}) + { + push @combineargs, $params{combine_mode}; + } + push @combineargs, @prior_backup_path, $backup_path, '-o', $data_path; + PostgreSQL::Test::Utils::system_or_bail(@combineargs); + } + elsif (defined $params{tar_program}) + { + mkdir($data_path) || die "mkdir $data_path: $!"; PostgreSQL::Test::Utils::system_or_bail($params{tar_program}, 'xf', $backup_path . '/base.tar', '-C', $data_path); @@ -784,13 +881,85 @@ sub init_from_backup $params{tar_program}, 'xf', $backup_path . '/pg_wal.tar', '-C', $data_path . '/pg_wal'); + + # We need to generate a tablespace_map file. + open(my $tsmap, ">", "$data_path/tablespace_map") + || die "$data_path/tablespace_map: $!"; + + # Extract tarfiles and add tablespace_map entries + my @tstars = grep { /^\d+.tar/ } + PostgreSQL::Test::Utils::slurp_dir($backup_path); + for my $tstar (@tstars) + { + my $tsoid = $tstar; + $tsoid =~ s/\.tar$//; + + die "no tablespace mapping for $tstar" + if !exists $params{tablespace_map} + || !exists $params{tablespace_map}{$tsoid}; + my $newdir = $params{tablespace_map}{$tsoid}; + + mkdir($newdir) || die "mkdir $newdir: $!"; + PostgreSQL::Test::Utils::system_or_bail($params{tar_program}, + 'xf', $backup_path . '/' . $tstar, + '-C', $newdir); + + my $escaped_newdir = $newdir; + $escaped_newdir =~ s/\\/\\\\/g; + print $tsmap "$tsoid $escaped_newdir\n"; + } + + # Close tablespace_map. + close($tsmap); } else { + my @tsoids; rmdir($data_path); - PostgreSQL::Test::RecursiveCopy::copypath($backup_path, $data_path); + + # Copy the main backup. If we see a tablespace directory for which we + # have a tablespace mapping, skip it, but remember that we saw it. + PostgreSQL::Test::RecursiveCopy::copypath( + $backup_path, + $data_path, + 'filterfn' => sub { + my ($path) = @_; + if ($path =~ /^pg_tblspc\/(\d+)$/ + && exists $params{tablespace_map}{$1}) + { + push @tsoids, $1; + return 0; + } + return 1; + }); + + if (@tsoids > 0) + { + # We need to generate a tablespace_map file. + open(my $tsmap, ">", "$data_path/tablespace_map") + || die "$data_path/tablespace_map: $!"; + + # Now use the list of tablespace links to copy each tablespace. + for my $tsoid (@tsoids) + { + die "no tablespace mapping for $tsoid" + if !exists $params{tablespace_map} + || !exists $params{tablespace_map}{$tsoid}; + + my $olddir = $backup_path . '/pg_tblspc/' . $tsoid; + my $newdir = $params{tablespace_map}{$tsoid}; + PostgreSQL::Test::RecursiveCopy::copypath($olddir, $newdir); + + my $escaped_newdir = $newdir; + $escaped_newdir =~ s/\\/\\\\/g; + print $tsmap "$tsoid $escaped_newdir\n"; + } + + # Close tablespace_map. + close($tsmap); + } } - chmod(0700, $data_path); + chmod(0700, $data_path) or die $!; # Base configuration for this node $self->append_conf( @@ -879,8 +1048,8 @@ sub start if ($ret != 0) { - print "# pg_ctl start failed; logfile:\n"; - print PostgreSQL::Test::Utils::slurp_file($self->logfile); + print "# pg_ctl start failed; see logfile for details: " + . $self->logfile . "\n"; # pg_ctl could have timed out, so check to see if there's a pid file; # otherwise our END block will fail to shut down the new postmaster. @@ -993,17 +1162,18 @@ sub reload =item $node->restart() -Wrapper for pg_ctl restart +Wrapper for pg_ctl restart. + +With optional extra param fail_ok => 1, returns 0 for failure +instead of bailing out. =cut sub restart { - my ($self) = @_; - my $port = $self->port; - my $pgdata = $self->data_dir; - my $logfile = $self->logfile; + my ($self, %params) = @_; my $name = $self->name; + my $ret; local %ENV = $self->_get_env(PGAPPNAME => undef); @@ -1011,11 +1181,24 @@ sub restart # -w is now the default but having it here does no harm and helps # compatibility with older versions. - PostgreSQL::Test::Utils::system_or_bail('pg_ctl', '-w', '-D', $pgdata, - '-l', $logfile, 'restart'); + $ret = PostgreSQL::Test::Utils::system_log('pg_ctl', '-w', '-D', + $self->data_dir, '-l', $self->logfile, 'restart'); + + if ($ret != 0) + { + print "# pg_ctl restart failed; see logfile for details: " + . $self->logfile . "\n"; + + # pg_ctl could have timed out, so check to see if there's a pid file; + # otherwise our END block will fail to shut down the new postmaster. + $self->_update_pid(-1); + + BAIL_OUT("pg_ctl restart failed") unless $params{fail_ok}; + return 0; + } $self->_update_pid(1); - return; + return 1; } =pod @@ -1516,7 +1699,7 @@ sub get_free_port { # advance $port, wrapping correctly around range end - $port = 49152 if ++$port >= 65536; + $port = $port_lower_bound if ++$port > $port_upper_bound; print "# Checking port $port\n"; # Check first that candidate port number is not included in @@ -1570,9 +1753,8 @@ sub can_bind my ($host, $port) = @_; my $iaddr = inet_aton($host); my $paddr = sockaddr_in($port, $iaddr); - my $proto = getprotobyname("tcp"); - socket(SOCK, PF_INET, SOCK_STREAM, $proto) + socket(SOCK, PF_INET, SOCK_STREAM, 0) or die "socket failed: $!"; # As in postmaster, don't use SO_REUSEADDR on Windows @@ -1602,16 +1784,16 @@ sub _reserve_port if (kill 0, $pid) { # process exists and is owned by us, so we can't reserve this port - flock($portfile, LOCK_UN); + flock($portfile, LOCK_UN) || die $!; close($portfile); return 0; } } # All good, go ahead and reserve the port - seek($portfile, 0, SEEK_SET); + seek($portfile, 0, SEEK_SET) || die $!; # print the pid with a fixed width so we don't leave any trailing junk print $portfile sprintf("%10d\n", $$); - flock($portfile, LOCK_UN); + flock($portfile, LOCK_UN) || die $!; close($portfile); push(@port_reservation_files, $filename); return 1; @@ -1937,12 +2119,15 @@ sub psql # We don't use IPC::Run::Simple to limit dependencies. # # We always die on signal. - my $core = $ret & 128 ? " (core dumped)" : ""; - die "psql exited with signal " - . ($ret & 127) - . "$core: '$$stderr' while running '@psql_params'" - if $ret & 127; - $ret = $ret >> 8; + if (defined $ret) + { + my $core = $ret & 128 ? " (core dumped)" : ""; + die "psql exited with signal " + . ($ret & 127) + . "$core: '$$stderr' while running '@psql_params'" + if $ret & 127; + $ret = $ret >> 8; + } if ($ret && $params{on_error_die}) { @@ -1972,9 +2157,6 @@ sub psql Invoke B on B<$dbname> and return a BackgroundPsql object. -A default timeout of $PostgreSQL::Test::Utils::timeout_default is set up, -which can be modified later. - psql is invoked in tuples-only unaligned mode with reading of B<.psqlrc> disabled. That may be overridden by passing extra psql parameters. @@ -1992,6 +2174,11 @@ By default, the B method invokes the B program with ON_ERROR_STOP=1 set, so SQL execution is stopped at the first error and exit code 3 is returned. Set B to 0 to ignore errors instead. +=item timeout => 'interval' + +Set a timeout for a background psql session. By default, timeout of +$PostgreSQL::Test::Utils::timeout_default is set up. + =item replication => B If set, add B to the conninfo string. @@ -2002,6 +2189,12 @@ connection. If given, it must be an array reference containing additional parameters to B. +=item wait => 1 + +By default, this method will not return until connection has completed (or +failed). Set B to 0 to return immediately instead. (Clients can call the +session's C method manually when needed.) + =back =cut @@ -2013,6 +2206,7 @@ sub background_psql local %ENV = $self->_get_env(); my $replication = $params{replication}; + my $timeout = undef; my @psql_params = ( $self->installed_command('psql'), @@ -2024,12 +2218,15 @@ sub background_psql '-'); $params{on_error_stop} = 1 unless defined $params{on_error_stop}; + $params{wait} = 1 unless defined $params{wait}; + $timeout = $params{timeout} if defined $params{timeout}; push @psql_params, '-v', 'ON_ERROR_STOP=1' if $params{on_error_stop}; push @psql_params, @{ $params{extra_params} } if defined $params{extra_params}; - return PostgreSQL::Test::BackgroundPsql->new(0, \@psql_params); + return PostgreSQL::Test::BackgroundPsql->new(0, \@psql_params, $timeout, + $params{wait}); } =pod @@ -2039,8 +2236,7 @@ sub background_psql Invoke B on B<$dbname> and return a BackgroundPsql object, which the caller may use to send interactive input to B. -A default timeout of $PostgreSQL::Test::Utils::timeout_default is set up, -which can be modified later. +A timeout of $PostgreSQL::Test::Utils::timeout_default is set up. psql is invoked in tuples-only unaligned mode with reading of B<.psqlrc> disabled. That may be overridden by passing extra psql parameters. @@ -2050,14 +2246,17 @@ Errors occurring later are the caller's problem. Be sure to "quit" the returned object when done with it. -The only extra parameter currently accepted is - =over =item extra_params => ['--single-transaction'] If given, it must be an array reference containing additional parameters to B. +=item history_file => B + +Cause the interactive B session to write its command history to B. +If not given, the history is sent to B. + =back This requires IO::Pty in addition to IPC::Run. @@ -2070,6 +2269,27 @@ sub interactive_psql local %ENV = $self->_get_env(); + # Since the invoked psql will believe it's interactive, it will use + # readline/libedit if available. We need to adjust some environment + # settings to prevent unwanted side-effects. + + # Developers would not appreciate tests adding a bunch of junk to + # their ~/.psql_history, so redirect readline history somewhere else. + # If the calling script doesn't specify anything, just bit-bucket it. + $ENV{PSQL_HISTORY} = $params{history_file} || '/dev/null'; + + # Another pitfall for developers is that they might have a ~/.inputrc + # file that changes readline's behavior enough to affect the test. + # So ignore any such file. + $ENV{INPUTRC} = '/dev/null'; + + # Unset TERM so that readline/libedit won't use any terminal-dependent + # escape sequences; that leads to way too many cross-version variations + # in the output. + delete $ENV{TERM}; + # Some versions of readline inspect LS_COLORS, so for luck unset that too. + delete $ENV{LS_COLORS}; + my @psql_params = ( $self->installed_command('psql'), '-XAt', '-d', $self->connstr($dbname)); @@ -2099,7 +2319,6 @@ sub _pgbench_make_files # cleanup file weight $filename =~ s/\@\d+$//; - #push @filenames, $filename; # filenames are expected to be unique on a test if (-e $filename) { @@ -2624,6 +2843,177 @@ sub lsn =pod +=item $node->write_wal($tli, $lsn, $segment_size, $data) + +Write some arbitrary data in WAL for the given segment at $lsn (in bytes). +This should be called while the cluster is not running. + +Returns the path of the WAL segment written to. + +=cut + +sub write_wal +{ + my ($self, $tli, $lsn, $segment_size, $data) = @_; + + # Calculate segment number and offset position in segment based on the + # input LSN. + my $segment = $lsn / $segment_size; + my $offset = $lsn % $segment_size; + my $path = + sprintf("%s/pg_wal/%08X%08X%08X", $self->data_dir, $tli, 0, $segment); + + open my $fh, "+<:raw", $path or die "could not open WAL segment $path"; + seek($fh, $offset, SEEK_SET) or die "could not seek WAL segment $path"; + print $fh $data; + close $fh; + + return $path; +} + +=pod + +=item $node->emit_wal($size) + +Emit a WAL record of arbitrary size, using pg_logical_emit_message(). + +Returns the end LSN of the record inserted, in bytes. + +=cut + +sub emit_wal +{ + my ($self, $size) = @_; + + return int( + $self->safe_psql( + 'postgres', + "SELECT pg_logical_emit_message(true, '', repeat('a', $size)) - '0/0'" + )); +} + + +# Private routine returning the current insert LSN of a node, in bytes. +# Used by the routines below in charge of advancing WAL to arbitrary +# positions. The insert LSN is returned in bytes. +sub _get_insert_lsn +{ + my ($self) = @_; + return int( + $self->safe_psql( + 'postgres', "SELECT pg_current_wal_insert_lsn() - '0/0'")); +} + +=pod + +=item $node->advance_wal_out_of_record_splitting_zone($wal_block_size) + +Advance WAL at the end of a page, making sure that we are far away enough +from the end of a page that we could insert a couple of small records. + +This inserts a few records of a fixed size, until the threshold gets close +enough to the end of the WAL page inserting records to. + +Returns the end LSN up to which WAL has advanced, in bytes. + +=cut + +sub advance_wal_out_of_record_splitting_zone +{ + my ($self, $wal_block_size) = @_; + + my $page_threshold = $wal_block_size / 4; + my $end_lsn = $self->_get_insert_lsn(); + my $page_offset = $end_lsn % $wal_block_size; + while ($page_offset >= $wal_block_size - $page_threshold) + { + $self->emit_wal($page_threshold); + $end_lsn = $self->_get_insert_lsn(); + $page_offset = $end_lsn % $wal_block_size; + } + return $end_lsn; +} + +=pod + +=item $node->advance_wal_to_record_splitting_zone($wal_block_size) + +Advance WAL so close to the end of a page that an XLogRecordHeader would not +fit on it. + +Returns the end LSN up to which WAL has advanced, in bytes. + +=cut + +sub advance_wal_to_record_splitting_zone +{ + my ($self, $wal_block_size) = @_; + + # Size of record header. + my $RECORD_HEADER_SIZE = 24; + + my $end_lsn = $self->_get_insert_lsn(); + my $page_offset = $end_lsn % $wal_block_size; + + # Get fairly close to the end of a page in big steps + while ($page_offset <= $wal_block_size - 512) + { + $self->emit_wal($wal_block_size - $page_offset - 256); + $end_lsn = $self->_get_insert_lsn(); + $page_offset = $end_lsn % $wal_block_size; + } + + # Calibrate our message size so that we can get closer 8 bytes at + # a time. + my $message_size = $wal_block_size - 80; + while ($page_offset <= $wal_block_size - $RECORD_HEADER_SIZE) + { + $self->emit_wal($message_size); + $end_lsn = $self->_get_insert_lsn(); + + my $old_offset = $page_offset; + $page_offset = $end_lsn % $wal_block_size; + + # Adjust the message size until it causes 8 bytes changes in + # offset, enough to be able to split a record header. + my $delta = $page_offset - $old_offset; + if ($delta > 8) + { + $message_size -= 8; + } + elsif ($delta <= 0) + { + $message_size += 8; + } + } + return $end_lsn; +} + +=pod + +=item $node->wait_for_event(backend_type, wait_event_name) + +Poll pg_stat_activity until backend_type reaches wait_event_name. + +=cut + +sub wait_for_event +{ + my ($self, $backend_type, $wait_event_name) = @_; + + $self->poll_query_until( + 'postgres', qq[ + SELECT count(*) > 0 FROM pg_stat_activity + WHERE backend_type = '$backend_type' AND wait_event = '$wait_event_name' + ]) + or die + qq(timed out when waiting for $backend_type to reach wait event '$wait_event_name'); + + return; +} + +=pod + =item $node->wait_for_catchup(standby_name, mode, target_lsn) Wait for the replication connection with application_name standby_name until @@ -2712,6 +3102,11 @@ sub wait_for_catchup } else { + # Fetch additional detail for debugging purposes + $query = qq[SELECT * FROM pg_catalog.pg_stat_replication]; + my $details = $self->safe_psql('postgres', $query); + diag qq(Last pg_stat_replication contents: +${details}); croak "timed out waiting for catchup"; } } @@ -2779,8 +3174,15 @@ sub wait_for_slot_catchup . $self->name . "\n"; my $query = qq[SELECT '$target_lsn' <= ${mode}_lsn FROM pg_catalog.pg_replication_slots WHERE slot_name = '$slot_name';]; - $self->poll_query_until('postgres', $query) - or croak "timed out waiting for catchup"; + if (!$self->poll_query_until('postgres', $query)) + { + # Fetch additional detail for debugging purposes + $query = qq[SELECT * FROM pg_catalog.pg_replication_slots]; + my $details = $self->safe_psql('postgres', $query); + diag qq(Last pg_replication_slots contents: +${details}); + croak "timed out waiting for catchup"; + } print "done\n"; return; } @@ -2815,8 +3217,15 @@ sub wait_for_subscription_sync print "Waiting for all subscriptions in \"$name\" to synchronize data\n"; my $query = qq[SELECT count(1) = 0 FROM pg_subscription_rel WHERE srsubstate NOT IN ('r', 's');]; - $self->poll_query_until($dbname, $query) - or croak "timed out waiting for subscriber to synchronize data"; + if (!$self->poll_query_until($dbname, $query)) + { + # Fetch additional detail for debugging purposes + $query = qq[SELECT * FROM pg_subscription_rel]; + my $details = $self->safe_psql($dbname, $query); + diag qq(Last pg_subscription_rel contents: +${details}); + croak "timed out waiting for subscriber to synchronize data"; + } # Then, wait for the replication to catchup if required. if (defined($publisher)) @@ -3070,6 +3479,36 @@ $SIG{TERM} = $SIG{INT} = sub { =pod +=item $node->log_standby_snapshot(self, standby, slot_name) + +Log a standby snapshot on primary once the slot restart_lsn is determined on +the standby. + +=cut + +sub log_standby_snapshot +{ + my ($self, $standby, $slot_name) = @_; + + # Once the slot's restart_lsn is determined, the standby looks for + # xl_running_xacts WAL record from the restart_lsn onwards. First wait + # until the slot restart_lsn is determined. + + $standby->poll_query_until( + 'postgres', qq[ + SELECT restart_lsn IS NOT NULL + FROM pg_catalog.pg_replication_slots WHERE slot_name = '$slot_name' + ]) + or die + "timed out waiting for logical slot to calculate its restart_lsn"; + + # Then arrange for the xl_running_xacts record for which the standby is + # waiting. + $self->safe_psql('postgres', 'SELECT pg_log_standby_snapshot()'); +} + +=pod + =item $node->create_logical_slot_on_standby(self, primary, slot_name, dbname) Create logical replication slot on given standby @@ -3095,21 +3534,9 @@ sub create_logical_slot_on_standby '2>', \$stderr); - # Once the slot's restart_lsn is determined, the standby looks for - # xl_running_xacts WAL record from the restart_lsn onwards. First wait - # until the slot restart_lsn is determined. - - $self->poll_query_until( - 'postgres', qq[ - SELECT restart_lsn IS NOT NULL - FROM pg_catalog.pg_replication_slots WHERE slot_name = '$slot_name' - ]) - or die - "timed out waiting for logical slot to calculate its restart_lsn"; - - # Then arrange for the xl_running_xacts record for which pg_recvlogical is + # Arrange for the xl_running_xacts record for which pg_recvlogical is # waiting. - $primary->safe_psql('postgres', 'SELECT pg_log_standby_snapshot()'); + $primary->log_standby_snapshot($self, $slot_name); $handle->finish(); @@ -3120,6 +3547,64 @@ sub create_logical_slot_on_standby =pod +=item $node->validate_slot_inactive_since(self, slot_name, reference_time) + +Validate inactive_since value of a given replication slot against the reference +time and return it. + +=cut + +sub validate_slot_inactive_since +{ + my ($self, $slot_name, $reference_time) = @_; + my $name = $self->name; + + my $inactive_since = $self->safe_psql( + 'postgres', + qq(SELECT inactive_since FROM pg_replication_slots + WHERE slot_name = '$slot_name' AND inactive_since IS NOT NULL;) + ); + + # Check that the inactive_since is sane + is( $self->safe_psql( + 'postgres', + qq[SELECT '$inactive_since'::timestamptz > to_timestamp(0) AND + '$inactive_since'::timestamptz > '$reference_time'::timestamptz;] + ), + 't', + "last inactive time for slot $slot_name is valid on node $name") + or die "could not validate captured inactive_since for slot $slot_name"; + + return $inactive_since; +} + +=pod + +=item $node->advance_wal(num) + +Advance WAL of node by given number of segments. + +=cut + +sub advance_wal +{ + my ($self, $num) = @_; + + # Advance by $n segments (= (wal_segment_size * $num) bytes). + # pg_switch_wal() forces a WAL flush, making pg_logical_emit_message() + # safe to use in non-transactional mode. + for (my $i = 0; $i < $num; $i++) + { + $self->safe_psql( + 'postgres', qq{ + SELECT pg_logical_emit_message(false, '', 'foo'); + SELECT pg_switch_wal(); + }); + } +} + +=pod + =back =cut diff --git a/src/test/perl/PostgreSQL/Test/Kerberos.pm b/src/test/perl/PostgreSQL/Test/Kerberos.pm new file mode 100644 index 0000000000000..f76d765368e27 --- /dev/null +++ b/src/test/perl/PostgreSQL/Test/Kerberos.pm @@ -0,0 +1,239 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# Sets up a stand-alone KDC for testing PostgreSQL GSSAPI / Kerberos +# functionality. + +package PostgreSQL::Test::Kerberos; + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Utils; + +our ( + $krb5_bin_dir, $krb5_sbin_dir, $krb5_config, $kinit, + $klist, $kdb5_util, $kadmin_local, $krb5kdc, + $krb5_conf, $kdc_conf, $krb5_cache, $krb5_log, + $kdc_log, $kdc_port, $kdc_datadir, $kdc_pidfile, + $keytab); + +INIT +{ + if ($^O eq 'darwin' && -d "/opt/homebrew") + { + # typical paths for Homebrew on ARM + $krb5_bin_dir = '/opt/homebrew/opt/krb5/bin'; + $krb5_sbin_dir = '/opt/homebrew/opt/krb5/sbin'; + } + elsif ($^O eq 'darwin') + { + # typical paths for Homebrew on Intel + $krb5_bin_dir = '/usr/local/opt/krb5/bin'; + $krb5_sbin_dir = '/usr/local/opt/krb5/sbin'; + } + elsif ($^O eq 'freebsd') + { + $krb5_bin_dir = '/usr/local/bin'; + $krb5_sbin_dir = '/usr/local/sbin'; + } + elsif ($^O eq 'linux') + { + $krb5_sbin_dir = '/usr/sbin'; + } + + $krb5_config = 'krb5-config'; + $kinit = 'kinit'; + $klist = 'klist'; + $kdb5_util = 'kdb5_util'; + $kadmin_local = 'kadmin.local'; + $krb5kdc = 'krb5kdc'; + + if ($krb5_bin_dir && -d $krb5_bin_dir) + { + $krb5_config = $krb5_bin_dir . '/' . $krb5_config; + $kinit = $krb5_bin_dir . '/' . $kinit; + $klist = $krb5_bin_dir . '/' . $klist; + } + if ($krb5_sbin_dir && -d $krb5_sbin_dir) + { + $kdb5_util = $krb5_sbin_dir . '/' . $kdb5_util; + $kadmin_local = $krb5_sbin_dir . '/' . $kadmin_local; + $krb5kdc = $krb5_sbin_dir . '/' . $krb5kdc; + } + + $krb5_conf = "${PostgreSQL::Test::Utils::tmp_check}/krb5.conf"; + $kdc_conf = "${PostgreSQL::Test::Utils::tmp_check}/kdc.conf"; + $krb5_cache = "${PostgreSQL::Test::Utils::tmp_check}/krb5cc"; + $krb5_log = "${PostgreSQL::Test::Utils::log_path}/krb5libs.log"; + $kdc_log = "${PostgreSQL::Test::Utils::log_path}/krb5kdc.log"; + $kdc_port = PostgreSQL::Test::Cluster::get_free_port(); + $kdc_datadir = "${PostgreSQL::Test::Utils::tmp_check}/krb5kdc"; + $kdc_pidfile = "${PostgreSQL::Test::Utils::tmp_check}/krb5kdc.pid"; + $keytab = "${PostgreSQL::Test::Utils::tmp_check}/krb5.keytab"; +} + +=pod + +=item PostgreSQL::Test::Kerberos->new(host, hostaddr, realm, %params) + +Sets up a new Kerberos realm and KDC. This function assigns a free +port for the KDC. The KDC will be shut down automatically when the +test script exits. + +=over + +=item host => 'auth-test-localhost.postgresql.example.com' + +Hostname to use in the service principal. + +=item hostaddr => '127.0.0.1' + +Network interface the KDC will listen on. + +=item realm => 'EXAMPLE.COM' + +Name of the Kerberos realm. + +=back + +=cut + +sub new +{ + my $class = shift; + my ($host, $hostaddr, $realm) = @_; + + my ($stdout, $krb5_version); + run_log [ $krb5_config, '--version' ], '>', \$stdout + or BAIL_OUT("could not execute krb5-config"); + BAIL_OUT("Heimdal is not supported") if $stdout =~ m/heimdal/; + $stdout =~ m/Kerberos 5 release ([0-9]+\.[0-9]+)/ + or BAIL_OUT("could not get Kerberos version"); + $krb5_version = $1; + + # Build the krb5.conf to use. + # + # Explicitly specify the default (test) realm and the KDC for + # that realm to avoid the Kerberos library trying to look up + # that information in DNS, and also because we're using a + # non-standard KDC port. + # + # Also explicitly disable DNS lookups since this isn't really + # our domain and we shouldn't be causing random DNS requests + # to be sent out (not to mention that broken DNS environments + # can cause the tests to take an extra long time and timeout). + # + # Reverse DNS is explicitly disabled to avoid any issue with a + # captive portal or other cases where the reverse DNS succeeds + # and the Kerberos library uses that as the canonical name of + # the host and then tries to acquire a cross-realm ticket. + append_to_file( + $krb5_conf, + qq![logging] +default = FILE:$krb5_log +kdc = FILE:$kdc_log + +[libdefaults] +dns_lookup_realm = false +dns_lookup_kdc = false +default_realm = $realm +forwardable = false +rdns = false + +[realms] +$realm = { + kdc = $hostaddr:$kdc_port +} +!); + + append_to_file( + $kdc_conf, + qq![kdcdefaults] +!); + + # For new-enough versions of krb5, use the _listen settings rather + # than the _ports settings so that we can bind to localhost only. + if ($krb5_version >= 1.15) + { + append_to_file( + $kdc_conf, + qq!kdc_listen = $hostaddr:$kdc_port +kdc_tcp_listen = $hostaddr:$kdc_port +!); + } + else + { + append_to_file( + $kdc_conf, + qq!kdc_ports = $kdc_port +kdc_tcp_ports = $kdc_port +!); + } + append_to_file( + $kdc_conf, + qq! +[realms] +$realm = { + database_name = $kdc_datadir/principal + admin_keytab = FILE:$kdc_datadir/kadm5.keytab + acl_file = $kdc_datadir/kadm5.acl + key_stash_file = $kdc_datadir/_k5.$realm +}!); + + mkdir $kdc_datadir + or BAIL_OUT("could not create directory \"$kdc_datadir\""); + + # Ensure that we use test's config and cache files, not global ones. + $ENV{'KRB5_CONFIG'} = $krb5_conf; + $ENV{'KRB5_KDC_PROFILE'} = $kdc_conf; + $ENV{'KRB5CCNAME'} = $krb5_cache; + + my $service_principal = "$ENV{with_krb_srvnam}/$host"; + + system_or_bail $kdb5_util, 'create', '-s', '-P', 'secret0'; + + system_or_bail $kadmin_local, '-q', + "addprinc -randkey $service_principal"; + system_or_bail $kadmin_local, '-q', "ktadd -k $keytab $service_principal"; + + system_or_bail $krb5kdc, '-P', $kdc_pidfile; + + my $self = {}; + $self->{keytab} = $keytab; + + bless $self, $class; + + return $self; +} + +sub create_principal +{ + my ($self, $principal, $password) = @_; + + system_or_bail $kadmin_local, '-q', "addprinc -pw $password $principal"; +} + +sub create_ticket +{ + my ($self, $principal, $password, %params) = @_; + + my @cmd = ($kinit, $principal); + + push @cmd, '-f' if ($params{forwardable}); + + run_log [@cmd], \$password or BAIL_OUT($?); + run_log [ $klist, '-f' ] or BAIL_OUT($?); +} + +END +{ + # take care not to change the script's exit value + my $exit_code = $?; + + kill 'INT', `cat $kdc_pidfile` + if defined($kdc_pidfile) && -f $kdc_pidfile; + + $? = $exit_code; +} + +1; diff --git a/src/test/perl/PostgreSQL/Test/RecursiveCopy.pm b/src/test/perl/PostgreSQL/Test/RecursiveCopy.pm index 15964e62173fd..8b9701ed987a2 100644 --- a/src/test/perl/PostgreSQL/Test/RecursiveCopy.pm +++ b/src/test/perl/PostgreSQL/Test/RecursiveCopy.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group =pod @@ -19,7 +19,7 @@ PostgreSQL::Test::RecursiveCopy::copypath($from, $to); package PostgreSQL::Test::RecursiveCopy; use strict; -use warnings; +use warnings FATAL => 'all'; use Carp; use File::Basename; diff --git a/src/test/perl/PostgreSQL/Test/SimpleTee.pm b/src/test/perl/PostgreSQL/Test/SimpleTee.pm index 82099bf50369f..65e8ee054e3a5 100644 --- a/src/test/perl/PostgreSQL/Test/SimpleTee.pm +++ b/src/test/perl/PostgreSQL/Test/SimpleTee.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # A simple 'tee' implementation, using perl tie. # @@ -17,7 +17,7 @@ package PostgreSQL::Test::SimpleTee; use strict; -use warnings; +use warnings FATAL => 'all'; use Time::HiRes qw(time); diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm index a27fac83d2616..022b44ba22bc9 100644 --- a/src/test/perl/PostgreSQL/Test/Utils.pm +++ b/src/test/perl/PostgreSQL/Test/Utils.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group =pod @@ -42,7 +42,7 @@ aimed at controlling command execution, logging and test functions. package PostgreSQL::Test::Utils; use strict; -use warnings; +use warnings FATAL => 'all'; use Carp; use Config; @@ -71,6 +71,7 @@ our @EXPORT = qw( chmod_recursive check_pg_config dir_symlink + scan_server_header system_or_bail system_log run_log @@ -188,6 +189,11 @@ Set to true when running under MSYS2. INIT { + # See https://github.com/cpan-authors/IPC-Run/commit/fc9288c for how this + # reduces idle time. Remove this when IPC::Run 20231003.0 is too old to + # matter (when all versions that matter provide the optimization). + $SIG{CHLD} = sub { } + unless defined $SIG{CHLD}; # Return EPIPE instead of killing the process with SIGPIPE. An affected # test may still fail, but it's more likely to report useful facts. @@ -210,10 +216,10 @@ INIT or die "could not open STDOUT to logfile \"$test_logfile\": $!"; # Hijack STDOUT and STDERR to the log file - open(my $orig_stdout, '>&', \*STDOUT); - open(my $orig_stderr, '>&', \*STDERR); - open(STDOUT, '>&', $testlog); - open(STDERR, '>&', $testlog); + open(my $orig_stdout, '>&', \*STDOUT) or die $!; + open(my $orig_stderr, '>&', \*STDERR) or die $!; + open(STDOUT, '>&', $testlog) or die $!; + open(STDERR, '>&', $testlog) or die $!; # The test output (ok ...) needs to be printed to the original STDOUT so # that the 'prove' program can parse it, and display it to the user in @@ -272,7 +278,7 @@ sub all_tests_passing Securely create a temporary directory inside C<$tmp_check>, like C, and return its name. The directory will be removed automatically at the -end of the tests. +end of the tests, unless the environment variable PG_TEST_NOCLEAN is provided. If C is given, the new directory is templated as C<${prefix}_XXXX>. Otherwise the template is C. @@ -286,7 +292,7 @@ sub tempdir return File::Temp::tempdir( $prefix . '_XXXX', DIR => $tmp_check, - CLEANUP => 1); + CLEANUP => not defined $ENV{'PG_TEST_NOCLEAN'}); } =pod @@ -301,7 +307,8 @@ name, to avoid path length issues. sub tempdir_short { - return File::Temp::tempdir(CLEANUP => 1); + return File::Temp::tempdir( + CLEANUP => not defined $ENV{'PG_TEST_NOCLEAN'}); } =pod @@ -562,15 +569,15 @@ Find and replace string of a given file. sub string_replace_file { my ($filename, $find, $replace) = @_; - open(my $in, '<', $filename); - my $content; + open(my $in, '<', $filename) or croak $!; + my $content = ''; while (<$in>) { $_ =~ s/$find/$replace/; $content = $content . $_; } close $in; - open(my $out, '>', $filename); + open(my $out, '>', $filename) or croak $!; print $out $content; close($out); @@ -701,6 +708,46 @@ sub chmod_recursive =pod +=item scan_server_header(header_path, regexp) + +Returns an array that stores all the matches of the given regular expression +within the PostgreSQL installation's C. This can be used to +retrieve specific value patterns from the installation's header files. + +=cut + +sub scan_server_header +{ + my ($header_path, $regexp) = @_; + + my ($stdout, $stderr); + my $result = IPC::Run::run [ 'pg_config', '--includedir-server' ], '>', + \$stdout, '2>', \$stderr + or die "could not execute pg_config"; + chomp($stdout); + $stdout =~ s/\r$//; + + open my $header_h, '<', "$stdout/$header_path" or die "$!"; + + my @match = undef; + while (<$header_h>) + { + my $line = $_; + + if (@match = $line =~ /^$regexp/) + { + last; + } + } + + close $header_h; + die "could not find match in header $header_path\n" + unless @match; + return @match; +} + +=pod + =item check_pg_config(regexp) Return the number of matches of the given regular expression @@ -747,11 +794,11 @@ sub dir_symlink # need some indirection on msys $cmd = qq{echo '$cmd' | \$COMSPEC /Q}; } - system($cmd); + system($cmd) == 0 or die; } else { - symlink $oldname, $newname; + symlink $oldname, $newname or die $!; } die "No $newname" unless -e $newname; } @@ -842,6 +889,15 @@ sub program_help_ok ok($result, "$cmd --help exit code 0"); isnt($stdout, '', "$cmd --help goes to stdout"); is($stderr, '', "$cmd --help nothing to stderr"); + + # This value isn't set in stone, it reflects the current + # convention in use. Most output actually tries to aim for 80. + my $max_line_length = 95; + my @long_lines = grep { length > $max_line_length } split /\n/, $stdout; + is(scalar @long_lines, 0, "$cmd --help maximum line length") + or diag("These lines are too long (>$max_line_length):\n", + join("\n", @long_lines)); + return; } diff --git a/src/test/perl/PostgreSQL/Version.pm b/src/test/perl/PostgreSQL/Version.pm index 3705c1bdafc1b..b8c0f642ca5e9 100644 --- a/src/test/perl/PostgreSQL/Version.pm +++ b/src/test/perl/PostgreSQL/Version.pm @@ -4,7 +4,7 @@ # # Module encapsulating Postgres Version numbers # -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # ############################################################################ @@ -45,7 +45,7 @@ of common version formats and comparison operations. package PostgreSQL::Version; use strict; -use warnings; +use warnings FATAL => 'all'; use Scalar::Util qw(blessed); diff --git a/src/test/perl/README b/src/test/perl/README index 6ddee42a1053c..af037a8091cc0 100644 --- a/src/test/perl/README +++ b/src/test/perl/README @@ -31,8 +31,9 @@ some lesser number of seconds. Data directories will also be left behind for analysis when a test fails; they are named according to the test filename. But if the environment -variable PG_TEST_NOCLEAN is set, data directories will be retained -regardless of test status. +variable PG_TEST_NOCLEAN is set, the data directories will be retained +regardless of test status. This environment variable also prevents the +test's temporary directories from being removed. Writing tests @@ -57,7 +58,7 @@ order. Each test script should begin with: use strict; - use warnings; + use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/perl/meson.build b/src/test/perl/meson.build index 101e8a2b8f815..4f0d928a6f3f0 100644 --- a/src/test/perl/meson.build +++ b/src/test/perl/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # could use install_data's preserve_path option in >=0.64.0 diff --git a/src/test/recovery/Makefile b/src/test/recovery/Makefile index c60314d195573..d40c05a566d43 100644 --- a/src/test/recovery/Makefile +++ b/src/test/recovery/Makefile @@ -2,19 +2,24 @@ # # Makefile for src/test/recovery # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/test/recovery/Makefile # #------------------------------------------------------------------------- -EXTRA_INSTALL=contrib/pg_prewarm contrib/pg_stat_statements contrib/test_decoding +EXTRA_INSTALL=contrib/pg_prewarm \ + contrib/pg_stat_statements \ + contrib/test_decoding \ + src/test/modules/injection_points subdir = src/test/recovery top_builddir = ../../.. include $(top_builddir)/src/Makefile.global +export enable_injection_points + # required for 017_shm.pl and 027_stream_regress.pl REGRESS_SHLIB=$(abs_top_builddir)/src/test/regress/regress$(DLSUFFIX) export REGRESS_SHLIB @@ -25,5 +30,5 @@ check: installcheck: $(prove_installcheck) -clean distclean maintainer-clean: +clean distclean: rm -rf tmp_check diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build index 2008958010076..25dd6e5014cf3 100644 --- a/src/test/recovery/meson.build +++ b/src/test/recovery/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tests += { 'name': 'recovery', @@ -6,6 +6,9 @@ tests += { 'bd': meson.current_build_dir(), 'tap': { 'test_kwargs': {'priority': 40}, # recovery tests are slow, start early + 'env': { + 'enable_injection_points': get_option('injection_points') ? 'yes' : 'no', + }, 'tests': [ 't/001_stream_rep.pl', 't/002_archiving.pl', @@ -42,6 +45,14 @@ tests += { 't/034_create_database.pl', 't/035_standby_logical_decoding.pl', 't/036_truncated_dropped.pl', + 't/037_invalid_database.pl', + 't/038_save_logical_slots_shutdown.pl', + 't/039_end_of_wal.pl', + 't/040_standby_failover_slots_sync.pl', + 't/041_checkpoint_at_promote.pl', + 't/042_low_level_backup.pl', + 't/043_no_contrecord_switch.pl', + 't/045_archive_restartpoint.pl', ], }, } diff --git a/src/test/recovery/t/001_stream_rep.pl b/src/test/recovery/t/001_stream_rep.pl index 0c72ba094415c..f3ea45ac4a289 100644 --- a/src/test/recovery/t/001_stream_rep.pl +++ b/src/test/recovery/t/001_stream_rep.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Minimal test testing streaming replication use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -46,6 +46,25 @@ $node_primary->safe_psql('postgres', "CREATE TABLE tab_int AS SELECT generate_series(1,1002) AS a"); +$node_primary->safe_psql( + 'postgres', q{ +CREATE TABLE user_logins(id serial, who text); + +CREATE FUNCTION on_login_proc() RETURNS EVENT_TRIGGER AS $$ +BEGIN + IF NOT pg_is_in_recovery() THEN + INSERT INTO user_logins (who) VALUES (session_user); + END IF; + IF session_user = 'regress_hacker' THEN + RAISE EXCEPTION 'You are not welcome!'; + END IF; +END; +$$ LANGUAGE plpgsql SECURITY DEFINER; + +CREATE EVENT TRIGGER on_login_trigger ON login EXECUTE FUNCTION on_login_proc(); +ALTER EVENT TRIGGER on_login_trigger ENABLE ALWAYS; +}); + # Wait for standbys to catch up $node_primary->wait_for_replay_catchup($node_standby_1); $node_standby_1->wait_for_replay_catchup($node_standby_2, $node_primary); @@ -76,6 +95,16 @@ print "standby 2: $result\n"; is($result, qq(33|0|t), 'check streamed sequence content on standby 2'); +# Check pg_sequence_last_value() returns NULL for unlogged sequence on standby +$node_primary->safe_psql('postgres', + "CREATE UNLOGGED SEQUENCE ulseq; SELECT nextval('ulseq')"); +$node_primary->wait_for_replay_catchup($node_standby_1); +is( $node_standby_1->safe_psql( + 'postgres', + "SELECT pg_sequence_last_value('ulseq'::regclass) IS NULL"), + 't', + 'pg_sequence_last_value() on unlogged sequence on standby 1'); + # Check that only READ-only queries can run on standbys is($node_standby_1->psql('postgres', 'INSERT INTO tab_int VALUES (1)'), 3, 'read-only queries on standby 1'); @@ -384,6 +413,13 @@ sub replay_check replay_check(); +my $evttrig = $node_standby_1->safe_psql('postgres', + "SELECT evtname FROM pg_event_trigger WHERE evtevent = 'login'"); +is($evttrig, 'on_login_trigger', 'Name of login trigger'); +$evttrig = $node_standby_2->safe_psql('postgres', + "SELECT evtname FROM pg_event_trigger WHERE evtevent = 'login'"); +is($evttrig, 'on_login_trigger', 'Name of login trigger'); + note "enabling hot_standby_feedback"; # Enable hs_feedback. The slot should gain an xmin. We set the status interval @@ -496,11 +532,7 @@ sub replay_check my $segment_removed = $node_primary->safe_psql('postgres', 'SELECT pg_walfile_name(pg_current_wal_lsn())'); chomp($segment_removed); -$node_primary->psql( - 'postgres', " - CREATE TABLE tab_phys_slot (a int); - INSERT INTO tab_phys_slot VALUES (generate_series(1,10)); - SELECT pg_switch_wal();"); +$node_primary->advance_wal(1); my $current_lsn = $node_primary->safe_psql('postgres', "SELECT pg_current_wal_lsn();"); chomp($current_lsn); @@ -579,7 +611,7 @@ sub replay_check ok( pump_until( $sigchld_bb, $sigchld_bb_timeout, \$sigchld_bb_stderr, qr/backup is not in progress/), - 'base backup cleanly cancelled'); + 'base backup cleanly canceled'); $sigchld_bb->finish(); done_testing(); diff --git a/src/test/recovery/t/002_archiving.pl b/src/test/recovery/t/002_archiving.pl index 48e00f9e29637..bc447330e155a 100644 --- a/src/test/recovery/t/002_archiving.pl +++ b/src/test/recovery/t/002_archiving.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # test for archiving with hot standby use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -96,7 +96,7 @@ # creating a RECOVERYHISTORY. my $primary_archive = $node_primary->archive_dir; $caughtup_query = - "SELECT size IS NOT NULL FROM pg_stat_file('$primary_archive/00000002.history')"; + "SELECT size IS NOT NULL FROM pg_stat_file('$primary_archive/00000002.history', true)"; $node_primary->poll_query_until('postgres', $caughtup_query) or die "Timed out while waiting for archiving of 00000002.history"; diff --git a/src/test/recovery/t/003_recovery_targets.pl b/src/test/recovery/t/003_recovery_targets.pl index e882ce2077357..58241a68f0afd 100644 --- a/src/test/recovery/t/003_recovery_targets.pl +++ b/src/test/recovery/t/003_recovery_targets.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test for recovery targets: name, timestamp, XID use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/recovery/t/004_timeline_switch.pl b/src/test/recovery/t/004_timeline_switch.pl index edaef918454b4..684838cbab7ce 100644 --- a/src/test/recovery/t/004_timeline_switch.pl +++ b/src/test/recovery/t/004_timeline_switch.pl @@ -1,15 +1,13 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test for timeline switch use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; -$ENV{PGDATABASE} = 'postgres'; - # Ensure that a cascading standby is able to follow a newly-promoted standby # on a new timeline. diff --git a/src/test/recovery/t/005_replay_delay.pl b/src/test/recovery/t/005_replay_delay.pl index 8fadca4204597..fc0e165d850cb 100644 --- a/src/test/recovery/t/005_replay_delay.pl +++ b/src/test/recovery/t/005_replay_delay.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Checks for recovery_min_apply_delay and recovery pause use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/test/recovery/t/006_logical_decoding.pl b/src/test/recovery/t/006_logical_decoding.pl index 5025d65b1b4c9..75fd8261ce15f 100644 --- a/src/test/recovery/t/006_logical_decoding.pl +++ b/src/test/recovery/t/006_logical_decoding.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Testing of logical decoding using SQL interface and/or pg_recvlogical # @@ -7,7 +7,7 @@ # is for work that doesn't fit well there, like where server restarts # are required. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -70,7 +70,7 @@ # If we immediately crash the server we might lose the progress we just made # and replay the same changes again. But a clean shutdown should never repeat # the same changes when we use the SQL decoding interface. -$node_primary->restart('fast'); +$node_primary->restart; # There are no new writes, so the result should be empty. $result = $node_primary->safe_psql('postgres', @@ -158,8 +158,8 @@ is($node_primary->psql('postgres', 'DROP DATABASE otherdb'), 3, 'dropping a DB with active logical slots fails'); $pg_recvlogical->kill_kill; - is($node_primary->slot('otherdb_slot')->{'slot_name'}, - undef, 'logical slot still exists'); + is($node_primary->slot('otherdb_slot')->{'plugin'}, + 'test_decoding', 'logical slot still exists'); } $node_primary->poll_query_until('otherdb', @@ -168,13 +168,14 @@ is($node_primary->psql('postgres', 'DROP DATABASE otherdb'), 0, 'dropping a DB with inactive logical slots succeeds'); -is($node_primary->slot('otherdb_slot')->{'slot_name'}, - undef, 'logical slot was actually dropped with DB'); +is($node_primary->slot('otherdb_slot')->{'plugin'}, + '', 'logical slot was actually dropped with DB'); # Test logical slot advancing and its durability. +# Passing failover=true (last arg) should not have any impact on advancing. my $logical_slot = 'logical_slot'; $node_primary->safe_psql('postgres', - "SELECT pg_create_logical_replication_slot('$logical_slot', 'test_decoding', false);" + "SELECT pg_create_logical_replication_slot('$logical_slot', 'test_decoding', false, false, true);" ); $node_primary->psql( 'postgres', " diff --git a/src/test/recovery/t/007_sync_rep.pl b/src/test/recovery/t/007_sync_rep.pl index 2026af07021aa..4bc96a3ac9ff3 100644 --- a/src/test/recovery/t/007_sync_rep.pl +++ b/src/test/recovery/t/007_sync_rep.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Minimal test testing synchronous replication sync_state transition use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/recovery/t/008_fsm_truncation.pl b/src/test/recovery/t/008_fsm_truncation.pl index acac0a0a55d87..4412fe2896299 100644 --- a/src/test/recovery/t/008_fsm_truncation.pl +++ b/src/test/recovery/t/008_fsm_truncation.pl @@ -1,12 +1,11 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group -# Test WAL replay of FSM changes. -# -# FSM changes don't normally need to be WAL-logged, except for truncation. +# Test FSM-driven INSERT just after truncation clears FSM slots indicating +# free space in removed blocks. # The FSM mustn't return a page that doesn't exist (anymore). use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/test/recovery/t/009_twophase.pl b/src/test/recovery/t/009_twophase.pl index e1273fd0f1204..4b3e0f77dc0de 100644 --- a/src/test/recovery/t/009_twophase.pl +++ b/src/test/recovery/t/009_twophase.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests dedicated to two-phase commit in recovery use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -45,6 +45,10 @@ sub configure_and_reload my $node_paris = PostgreSQL::Test::Cluster->new('paris'); $node_paris->init_from_backup($node_london, 'london_backup', has_streaming => 1); +$node_paris->append_conf( + 'postgresql.conf', qq( + subtransaction_buffers = 32 +)); $node_paris->start; # Switch to synchronous replication in both directions @@ -308,6 +312,55 @@ sub configure_and_reload $cur_primary->psql('postgres', "COMMIT PREPARED 'xact_009_12'"); +############################################################################### +# Check visibility of prepared transactions in standby after a restart while +# primary is down. +############################################################################### + +$cur_primary->psql( + 'postgres', " + SET synchronous_commit='remote_apply'; -- To ensure the standby is caught up + CREATE TABLE t_009_tbl_standby_mvcc (id int, msg text); + BEGIN; + INSERT INTO t_009_tbl_standby_mvcc VALUES (1, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl_standby_mvcc VALUES (2, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_standby_mvcc'; + "); +$cur_primary->stop; +$cur_standby->restart; + +# Acquire a snapshot in standby, before we commit the prepared transaction +my $standby_session = + $cur_standby->background_psql('postgres', on_error_die => 1); +$standby_session->query_safe("BEGIN ISOLATION LEVEL REPEATABLE READ"); +$psql_out = + $standby_session->query_safe("SELECT count(*) FROM t_009_tbl_standby_mvcc"); +is($psql_out, '0', + "Prepared transaction not visible in standby before commit"); + +# Commit the transaction in primary +$cur_primary->start; +$cur_primary->psql( + 'postgres', " +SET synchronous_commit='remote_apply'; -- To ensure the standby is caught up +COMMIT PREPARED 'xact_009_standby_mvcc'; +"); + +# Still not visible to the old snapshot +$psql_out = + $standby_session->query_safe("SELECT count(*) FROM t_009_tbl_standby_mvcc"); +is($psql_out, '0', + "Committed prepared transaction not visible to old snapshot in standby"); + +# Is visible to a new snapshot +$standby_session->query_safe("COMMIT"); +$psql_out = + $standby_session->query_safe("SELECT count(*) FROM t_009_tbl_standby_mvcc"); +is($psql_out, '2', + "Committed prepared transaction is visible to new snapshot in standby"); +$standby_session->quit; + ############################################################################### # Check for a lock conflict between prepared transaction with DDL inside and # replay of XLOG_STANDBY_LOCK wal record. @@ -481,4 +534,42 @@ sub configure_and_reload qq{27|issued to paris}, "Check expected t_009_tbl2 data on standby"); + +# Exercise the 2PC recovery code in StartupSUBTRANS, which is concerned with +# ensuring that enough pg_subtrans pages exist on disk to cover the range of +# prepared transactions at server start time. There's not much we can verify +# directly, but let's at least get the code to run. +$cur_standby->stop(); +configure_and_reload($cur_primary, "synchronous_standby_names = ''"); + +$cur_primary->safe_psql('postgres', "CHECKPOINT"); + +my $start_lsn = + $cur_primary->safe_psql('postgres', 'select pg_current_wal_insert_lsn()'); +$cur_primary->safe_psql('postgres', + "CREATE TABLE test(); BEGIN; CREATE TABLE test1(); PREPARE TRANSACTION 'foo';" +); +my $osubtrans = $cur_primary->safe_psql('postgres', + "select 'pg_subtrans/'||f, s.size from pg_ls_dir('pg_subtrans') f, pg_stat_file('pg_subtrans/'||f) s" +); +$cur_primary->pgbench( + '--no-vacuum --client=5 --transactions=1000', + 0, + [], + [], + 'pgbench run to cause pg_subtrans traffic', + { + '009_twophase.pgb' => 'insert into test default values' + }); +# StartupSUBTRANS is exercised with a wide range of visible XIDs in this +# stop/start sequence, because we left a prepared transaction open above. +# Also, setting subtransaction_buffers to 32 above causes to switch SLRU +# bank, for additional code coverage. +$cur_primary->stop; +$cur_primary->start; +my $nsubtrans = $cur_primary->safe_psql('postgres', + "select 'pg_subtrans/'||f, s.size from pg_ls_dir('pg_subtrans') f, pg_stat_file('pg_subtrans/'||f) s" +); +isnt($osubtrans, $nsubtrans, "contents of pg_subtrans/ have changed"); + done_testing(); diff --git a/src/test/recovery/t/010_logical_decoding_timelines.pl b/src/test/recovery/t/010_logical_decoding_timelines.pl index 6fbbeedde3b06..40f4fb0d91821 100644 --- a/src/test/recovery/t/010_logical_decoding_timelines.pl +++ b/src/test/recovery/t/010_logical_decoding_timelines.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Demonstrate that logical can follow timeline switches. # @@ -22,7 +22,7 @@ # on logical slots). # use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -94,8 +94,8 @@ 'postgres', q[SELECT 1 FROM pg_database WHERE datname = 'dropme']), '', 'dropped DB dropme on standby'); -is($node_primary->slot('dropme_slot')->{'slot_name'}, - undef, 'logical slot was actually dropped on standby'); +is($node_replica->slot('dropme_slot')->{'plugin'}, + '', 'logical slot was actually dropped on standby'); # Back to testing failover... $node_primary->safe_psql('postgres', diff --git a/src/test/recovery/t/012_subtransactions.pl b/src/test/recovery/t/012_subtransactions.pl index 91ae79dd5144c..2f74bfc9a5af5 100644 --- a/src/test/recovery/t/012_subtransactions.pl +++ b/src/test/recovery/t/012_subtransactions.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests dedicated to subtransactions in recovery use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/test/recovery/t/013_crash_restart.pl b/src/test/recovery/t/013_crash_restart.pl index ce57792f3128c..d5d24e31d90ef 100644 --- a/src/test/recovery/t/013_crash_restart.pl +++ b/src/test/recovery/t/013_crash_restart.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # # Tests restarts of postgres due to crashes of a subprocess. @@ -12,7 +12,7 @@ # backend died), or because it's already restarted. # use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/recovery/t/014_unlogged_reinit.pl b/src/test/recovery/t/014_unlogged_reinit.pl index 3591b3309e691..a37fc9249b5dd 100644 --- a/src/test/recovery/t/014_unlogged_reinit.pl +++ b/src/test/recovery/t/014_unlogged_reinit.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests that unlogged tables are properly reinitialized after a crash. # @@ -7,7 +7,7 @@ # that is not tested here. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/recovery/t/015_promotion_pages.pl b/src/test/recovery/t/015_promotion_pages.pl index 271c93aa8b40b..7972fc7b77b00 100644 --- a/src/test/recovery/t/015_promotion_pages.pl +++ b/src/test/recovery/t/015_promotion_pages.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test for promotion handling with WAL records generated post-promotion # before the first checkpoint is generated. This test case checks for # invalid page references at replay based on the minimum consistent # recovery point defined. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -54,9 +54,10 @@ # Now just use a dummy table and run some operations to move minRecoveryPoint # beyond the previous vacuum. -$alpha->safe_psql('postgres', 'create table test2 (a int, b text)'); +$alpha->safe_psql('postgres', 'create table test2 (a int, b bytea)'); $alpha->safe_psql('postgres', - 'insert into test2 select generate_series(1,10000), md5(random()::text)'); + q{insert into test2 select generate_series(1,10000), sha256(random()::text::bytea)} +); $alpha->safe_psql('postgres', 'truncate test2'); # Wait again for all records to be replayed. diff --git a/src/test/recovery/t/016_min_consistency.pl b/src/test/recovery/t/016_min_consistency.pl index 81f7a43c079e8..23d161aebc771 100644 --- a/src/test/recovery/t/016_min_consistency.pl +++ b/src/test/recovery/t/016_min_consistency.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test for checking consistency of on-disk pages for a cluster with # the minimum recovery LSN, ensuring that the updates happen across @@ -8,7 +8,7 @@ # both checked. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/recovery/t/017_shm.pl b/src/test/recovery/t/017_shm.pl index 74359e0e3882f..50ee5cdee21ae 100644 --- a/src/test/recovery/t/017_shm.pl +++ b/src/test/recovery/t/017_shm.pl @@ -1,11 +1,11 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # # Tests of pg_shmem.h functions # use strict; -use warnings; +use warnings FATAL => 'all'; use File::stat qw(stat); use IPC::Run 'run'; use PostgreSQL::Test::Cluster; diff --git a/src/test/recovery/t/018_wal_optimize.pl b/src/test/recovery/t/018_wal_optimize.pl index 1d613eaede4db..3fb31e643b69d 100644 --- a/src/test/recovery/t/018_wal_optimize.pl +++ b/src/test/recovery/t/018_wal_optimize.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test WAL replay when some operation has skipped WAL. # @@ -10,7 +10,7 @@ # For many years, individual commands made the decision to skip WAL, hence the # frequent appearance of COPY in these tests. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/test/recovery/t/019_replslot_limit.pl b/src/test/recovery/t/019_replslot_limit.pl index 33e50ad933be2..efb4ba3af1e6c 100644 --- a/src/test/recovery/t/019_replslot_limit.pl +++ b/src/test/recovery/t/019_replslot_limit.pl @@ -1,19 +1,17 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test for replication slot limit # Ensure that max_slot_wal_keep_size limits the number of WAL files to # be kept by replication slots. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Utils; use PostgreSQL::Test::Cluster; use Test::More; use Time::HiRes qw(usleep); -$ENV{PGDATABASE} = 'postgres'; - # Initialize primary node, setting wal-segsize to 1MB my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(allows_streaming => 1, extra => ['--wal-segsize=1']); @@ -59,7 +57,7 @@ is($result, "reserved|t", 'check the catching-up state'); # Advance WAL by five segments (= 5MB) on primary -advance_wal($node_primary, 1); +$node_primary->advance_wal(1); $node_primary->safe_psql('postgres', "CHECKPOINT;"); # The slot is always "safe" when fitting max_wal_size @@ -69,7 +67,7 @@ is($result, "reserved|t", 'check that it is safe if WAL fits in max_wal_size'); -advance_wal($node_primary, 4); +$node_primary->advance_wal(4); $node_primary->safe_psql('postgres', "CHECKPOINT;"); # The slot is always "safe" when max_slot_wal_keep_size is not set @@ -100,7 +98,7 @@ is($result, "reserved", 'check that max_slot_wal_keep_size is working'); # Advance WAL again then checkpoint, reducing remain by 2 MB. -advance_wal($node_primary, 2); +$node_primary->advance_wal(2); $node_primary->safe_psql('postgres', "CHECKPOINT;"); # The slot is still working @@ -118,7 +116,7 @@ $result = $node_primary->safe_psql('postgres', "ALTER SYSTEM SET wal_keep_size to '8MB'; SELECT pg_reload_conf();"); # Advance WAL again then checkpoint, reducing remain by 6 MB. -advance_wal($node_primary, 6); +$node_primary->advance_wal(6); $result = $node_primary->safe_psql('postgres', "SELECT wal_status as remain FROM pg_replication_slots WHERE slot_name = 'rep1'" ); @@ -134,7 +132,7 @@ $node_standby->stop; # Advance WAL again without checkpoint, reducing remain by 6 MB. -advance_wal($node_primary, 6); +$node_primary->advance_wal(6); # Slot gets into 'reserved' state $result = $node_primary->safe_psql('postgres', @@ -145,7 +143,7 @@ $node_primary->safe_psql('postgres', "CHECKPOINT;"); # Advance WAL again without checkpoint; remain goes to 0. -advance_wal($node_primary, 1); +$node_primary->advance_wal(1); # Slot gets into 'unreserved' state and safe_wal_size is negative $result = $node_primary->safe_psql('postgres', @@ -173,8 +171,8 @@ "ALTER SYSTEM SET max_wal_size='40MB'; SELECT pg_reload_conf()"); # Advance WAL again. The slot loses the oldest segment by the next checkpoint -my $logstart = get_log_size($node_primary); -advance_wal($node_primary, 7); +my $logstart = -s $node_primary->logfile; +$node_primary->advance_wal(7); # Now create another checkpoint and wait until the WARNING is issued $node_primary->safe_psql('postgres', @@ -229,7 +227,7 @@ is($oldestseg, $redoseg, "check that segments have been removed"); # The standby no longer can connect to the primary -$logstart = get_log_size($node_standby); +$logstart = -s $node_standby->logfile; $node_standby->start; my $failed = 0; @@ -275,18 +273,12 @@ has_streaming => 1); $node_standby->append_conf('postgresql.conf', "primary_slot_name = 'rep1'"); $node_standby->start; -my @result = - split( - '\n', - $node_primary2->safe_psql( - 'postgres', - "CREATE TABLE tt(); - DROP TABLE tt; - SELECT pg_switch_wal(); - CHECKPOINT; - SELECT 'finished';", - timeout => $PostgreSQL::Test::Utils::timeout_default)); -is($result[1], 'finished', 'check if checkpoint command is not blocked'); +$node_primary2->advance_wal(1); +$result = $node_primary2->safe_psql( + 'postgres', + "CHECKPOINT; SELECT 'finished';", + timeout => $PostgreSQL::Test::Utils::timeout_default); +is($result, 'finished', 'check if checkpoint command is not blocked'); $node_primary2->stop; $node_standby->stop; @@ -368,11 +360,11 @@ "SELECT pid FROM pg_stat_activity WHERE backend_type = 'walreceiver'"); like($receiverpid, qr/^[0-9]+$/, "have walreceiver pid $receiverpid"); -$logstart = get_log_size($node_primary3); +$logstart = -s $node_primary3->logfile; # freeze walsender and walreceiver. Slot will still be active, but walreceiver # won't get anything anymore. kill 'STOP', $senderpid, $receiverpid; -advance_wal($node_primary3, 2); +$node_primary3->advance_wal(2); my $msg_logged = 0; my $max_attempts = $PostgreSQL::Test::Utils::timeout_default; @@ -418,27 +410,134 @@ $node_primary3->stop; $node_standby3->stop; -##################################### -# Advance WAL of $node by $n segments -sub advance_wal -{ - my ($node, $n) = @_; +# ============================================================================= +# Testcase start: Check inactive_since property of the streaming standby's slot +# - # Advance by $n segments (= (wal_segment_size * $n) bytes) on primary. - for (my $i = 0; $i < $n; $i++) - { - $node->safe_psql('postgres', - "CREATE TABLE t (); DROP TABLE t; SELECT pg_switch_wal();"); - } - return; -} +# Initialize primary node +my $primary4 = PostgreSQL::Test::Cluster->new('primary4'); +$primary4->init(allows_streaming => 'logical'); +$primary4->start; -# return the size of logfile of $node in bytes -sub get_log_size -{ - my ($node) = @_; +# Take backup +$backup_name = 'my_backup4'; +$primary4->backup($backup_name); - return (stat $node->logfile)[7]; -} +# Create a standby linking to the primary using the replication slot +my $standby4 = PostgreSQL::Test::Cluster->new('standby4'); +$standby4->init_from_backup($primary4, $backup_name, has_streaming => 1); + +my $sb4_slot = 'sb4_slot'; +$standby4->append_conf('postgresql.conf', "primary_slot_name = '$sb4_slot'"); + +my $slot_creation_time = $primary4->safe_psql( + 'postgres', qq[ + SELECT current_timestamp; +]); + +$primary4->safe_psql( + 'postgres', qq[ + SELECT pg_create_physical_replication_slot(slot_name := '$sb4_slot'); +]); + +# Get inactive_since value after the slot's creation. Note that the slot is +# still inactive till it's used by the standby below. +my $inactive_since = + $primary4->validate_slot_inactive_since($sb4_slot, $slot_creation_time); + +$standby4->start; + +# Wait until standby has replayed enough data +$primary4->wait_for_catchup($standby4); + +# Now the slot is active so inactive_since value must be NULL +is( $primary4->safe_psql( + 'postgres', + qq[SELECT inactive_since IS NULL FROM pg_replication_slots WHERE slot_name = '$sb4_slot';] + ), + 't', + 'last inactive time for an active physical slot is NULL'); + +# Stop the standby to check its inactive_since value is updated +$standby4->stop; + +# Let's restart the primary so that the inactive_since is set upon loading the +# slot from the disk. +$primary4->restart; + +is( $primary4->safe_psql( + 'postgres', + qq[SELECT inactive_since > '$inactive_since'::timestamptz FROM pg_replication_slots WHERE slot_name = '$sb4_slot' AND inactive_since IS NOT NULL;] + ), + 't', + 'last inactive time for an inactive physical slot is updated correctly'); + +$standby4->stop; + +# Testcase end: Check inactive_since property of the streaming standby's slot +# ============================================================================= + +# ============================================================================= +# Testcase start: Check inactive_since property of the logical subscriber's slot +my $publisher4 = $primary4; + +# Create subscriber node +my $subscriber4 = PostgreSQL::Test::Cluster->new('subscriber4'); +$subscriber4->init; + +# Setup logical replication +my $publisher4_connstr = $publisher4->connstr . ' dbname=postgres'; +$publisher4->safe_psql('postgres', "CREATE PUBLICATION pub FOR ALL TABLES"); + +$slot_creation_time = $publisher4->safe_psql( + 'postgres', qq[ + SELECT current_timestamp; +]); + +my $lsub4_slot = 'lsub4_slot'; +$publisher4->safe_psql('postgres', + "SELECT pg_create_logical_replication_slot(slot_name := '$lsub4_slot', plugin := 'pgoutput');" +); + +# Get inactive_since value after the slot's creation. Note that the slot is +# still inactive till it's used by the subscriber below. +$inactive_since = + $publisher4->validate_slot_inactive_since($lsub4_slot, $slot_creation_time); + +$subscriber4->start; +$subscriber4->safe_psql('postgres', + "CREATE SUBSCRIPTION sub CONNECTION '$publisher4_connstr' PUBLICATION pub WITH (slot_name = '$lsub4_slot', create_slot = false)" +); + +# Wait until subscriber has caught up +$subscriber4->wait_for_subscription_sync($publisher4, 'sub'); + +# Now the slot is active so inactive_since value must be NULL +is( $publisher4->safe_psql( + 'postgres', + qq[SELECT inactive_since IS NULL FROM pg_replication_slots WHERE slot_name = '$lsub4_slot';] + ), + 't', + 'last inactive time for an active logical slot is NULL'); + +# Stop the subscriber to check its inactive_since value is updated +$subscriber4->stop; + +# Let's restart the publisher so that the inactive_since is set upon +# loading the slot from the disk. +$publisher4->restart; + +is( $publisher4->safe_psql( + 'postgres', + qq[SELECT inactive_since > '$inactive_since'::timestamptz FROM pg_replication_slots WHERE slot_name = '$lsub4_slot' AND inactive_since IS NOT NULL;] + ), + 't', + 'last inactive time for an inactive logical slot is updated correctly'); + +# Testcase end: Check inactive_since property of the logical subscriber's slot +# ============================================================================= + +$publisher4->stop; +$subscriber4->stop; done_testing(); diff --git a/src/test/recovery/t/020_archive_status.pl b/src/test/recovery/t/020_archive_status.pl index fa24153d4b98b..9cb178950f82f 100644 --- a/src/test/recovery/t/020_archive_status.pl +++ b/src/test/recovery/t/020_archive_status.pl @@ -1,11 +1,11 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # # Tests related to WAL archiving and recovery. # use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/recovery/t/021_row_visibility.pl b/src/test/recovery/t/021_row_visibility.pl index 52a6a3509c216..255caffb19dbc 100644 --- a/src/test/recovery/t/021_row_visibility.pl +++ b/src/test/recovery/t/021_row_visibility.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Checks that snapshots on standbys behave in a minimally reasonable # way. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/test/recovery/t/022_crash_temp_files.pl b/src/test/recovery/t/022_crash_temp_files.pl index 14fd8bfc7fcb1..769b6a6627d06 100644 --- a/src/test/recovery/t/022_crash_temp_files.pl +++ b/src/test/recovery/t/022_crash_temp_files.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test remove of temporary files after a crash. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/recovery/t/023_pitr_prepared_xact.pl b/src/test/recovery/t/023_pitr_prepared_xact.pl index a8cdf4efdd486..da6804f9a4940 100644 --- a/src/test/recovery/t/023_pitr_prepared_xact.pl +++ b/src/test/recovery/t/023_pitr_prepared_xact.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test for point-in-time recovery (PITR) with prepared transactions use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/recovery/t/024_archive_recovery.pl b/src/test/recovery/t/024_archive_recovery.pl index d594332b18d19..c6480bbdcd61b 100644 --- a/src/test/recovery/t/024_archive_recovery.pl +++ b/src/test/recovery/t/024_archive_recovery.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test for archive recovery of WAL generated with wal_level=minimal use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -91,8 +91,8 @@ sub test_recovery_wal_level_minimal # Confirm that the archive recovery fails with an expected error my $logfile = slurp_file($recovery_node->logfile()); ok( $logfile =~ - qr/FATAL: .* WAL was generated with wal_level=minimal, cannot continue recovering/, - "$node_text ends with an error because it finds WAL generated with wal_level=minimal" + qr/FATAL: .* WAL was generated with "wal_level=minimal", cannot continue recovering/, + "$node_text ends with an error because it finds WAL generated with \"wal_level=minimal\"" ); } diff --git a/src/test/recovery/t/025_stuck_on_old_timeline.pl b/src/test/recovery/t/025_stuck_on_old_timeline.pl index 91309030df9b4..67085c4bac39f 100644 --- a/src/test/recovery/t/025_stuck_on_old_timeline.pl +++ b/src/test/recovery/t/025_stuck_on_old_timeline.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Testing streaming replication where standby is promoted and a new cascading # standby (without WAL) is connected to the promoted standby. Both archiving @@ -7,7 +7,7 @@ # archive, so the WAL files all have to be streamed. Test that the cascading # standby can follow the new primary (promoted standby). use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/test/recovery/t/026_overwrite_contrecord.pl b/src/test/recovery/t/026_overwrite_contrecord.pl index fad1811ca8d78..f3e27c19af53f 100644 --- a/src/test/recovery/t/026_overwrite_contrecord.pl +++ b/src/test/recovery/t/026_overwrite_contrecord.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests for already-propagated WAL segments ending in incomplete WAL records. use strict; -use warnings; +use warnings FATAL => 'all'; use FindBin; use PostgreSQL::Test::Cluster; @@ -39,7 +39,7 @@ BEGIN LOOP INSERT into filler - select g, repeat(md5(g::text), (random() * 60 + 1)::int) + select g, repeat(encode(sha256(g::text::bytea), 'hex'), (random() * 15 + 1)::int) from generate_series(1, 10) g; remain := wal_segsize - (pg_current_wal_insert_lsn() - '0/0') % wal_segsize; diff --git a/src/test/recovery/t/027_stream_regress.pl b/src/test/recovery/t/027_stream_regress.pl index f2f4e77626fd3..d1ae32d97d603 100644 --- a/src/test/recovery/t/027_stream_regress.pl +++ b/src/test/recovery/t/027_stream_regress.pl @@ -1,6 +1,9 @@ + +# Copyright (c) 2024, PostgreSQL Global Development Group + # Run the standard regression tests with streaming replication use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -117,6 +120,40 @@ [ 'diff', $outputdir . '/primary.dump', $outputdir . '/standby.dump' ], 'compare primary and standby dumps'); +# Likewise for the catalogs of the regression database, after disabling +# autovacuum to make fields like relpages stop changing. +$node_primary->append_conf('postgresql.conf', 'autovacuum = off'); +$node_primary->restart; +$node_primary->wait_for_replay_catchup($node_standby_1); +command_ok( + [ + 'pg_dump', + ('--schema', 'pg_catalog'), + ('-f', $outputdir . '/catalogs_primary.dump'), + '--no-sync', + ('-p', $node_primary->port), + '--no-unlogged-table-data', + 'regression' + ], + 'dump catalogs of primary server'); +command_ok( + [ + 'pg_dump', + ('--schema', 'pg_catalog'), + ('-f', $outputdir . '/catalogs_standby.dump'), + '--no-sync', + ('-p', $node_standby_1->port), + 'regression' + ], + 'dump catalogs of standby server'); +command_ok( + [ + 'diff', + $outputdir . '/catalogs_primary.dump', + $outputdir . '/catalogs_standby.dump' + ], + 'compare primary and standby catalog dumps'); + # Check some data from pg_stat_statements. $node_primary->safe_psql('postgres', 'CREATE EXTENSION pg_stat_statements'); # This gathers data based on the first characters for some common query types, diff --git a/src/test/recovery/t/028_pitr_timelines.pl b/src/test/recovery/t/028_pitr_timelines.pl index bb29a2d378c58..4b7d825b71386 100644 --- a/src/test/recovery/t/028_pitr_timelines.pl +++ b/src/test/recovery/t/028_pitr_timelines.pl @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # Test recovering to a point-in-time using WAL archive, such that the # target point is physically in a WAL segment with a higher TLI than @@ -27,7 +27,7 @@ # The actual checks are not sensitive to that. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/recovery/t/029_stats_restart.pl b/src/test/recovery/t/029_stats_restart.pl index 742bd57e2898d..93a7209f69aac 100644 --- a/src/test/recovery/t/029_stats_restart.pl +++ b/src/test/recovery/t/029_stats_restart.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests statistics handling around restarts, including handling of crashes and -# invalid stats files, as well as restorting stats after "normal" restarts. +# invalid stats files, as well as restoring stats after "normal" restarts. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -173,7 +173,7 @@ ## Check that checkpoint stats are reset, WAL stats aren't affected -$node->safe_psql($connect_db, "SELECT pg_stat_reset_shared('bgwriter')"); +$node->safe_psql($connect_db, "SELECT pg_stat_reset_shared('checkpointer')"); $sect = "post ckpt reset"; my $ckpt_reset = checkpoint_stats(); @@ -323,9 +323,9 @@ sub checkpoint_stats my %results; $results{count} = $node->safe_psql($connect_db, - "SELECT checkpoints_timed + checkpoints_req FROM pg_stat_bgwriter"); + "SELECT num_timed + num_requested FROM pg_stat_checkpointer"); $results{reset} = $node->safe_psql($connect_db, - "SELECT stats_reset FROM pg_stat_bgwriter"); + "SELECT stats_reset FROM pg_stat_checkpointer"); return \%results; } diff --git a/src/test/recovery/t/030_stats_cleanup_replica.pl b/src/test/recovery/t/030_stats_cleanup_replica.pl index 51495aebcd74c..74b516cc7cce6 100644 --- a/src/test/recovery/t/030_stats_cleanup_replica.pl +++ b/src/test/recovery/t/030_stats_cleanup_replica.pl @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests that standbys: # - drop stats for objects when the those records are replayed @@ -6,7 +6,7 @@ # - discard stats after immediate / crash restarts use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/recovery/t/031_recovery_conflict.pl b/src/test/recovery/t/031_recovery_conflict.pl index 05e83fa854f17..d87efa823fd9e 100644 --- a/src/test/recovery/t/031_recovery_conflict.pl +++ b/src/test/recovery/t/031_recovery_conflict.pl @@ -1,11 +1,11 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test that connections to a hot standby are correctly canceled when a # recovery conflict is detected Also, test that statistics in # pg_stat_database_conflicts are populated correctly use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -109,8 +109,8 @@ # to check the log starting now for recovery conflict messages my $log_location = -s $node_standby->logfile; -# VACUUM on the primary -$node_primary->safe_psql($test_db, qq[VACUUM $table1;]); +# VACUUM FREEZE on the primary +$node_primary->safe_psql($test_db, qq[VACUUM FREEZE $table1;]); # Wait for catchup. Existing connection will be terminated before replay is # finished, so waiting for catchup ensures that there is no race between @@ -144,8 +144,8 @@ $node_primary->safe_psql($test_db, qq[UPDATE $table1 SET a = a + 1 WHERE a > 2;]); -# VACUUM, pruning those dead tuples -$node_primary->safe_psql($test_db, qq[VACUUM $table1;]); +# VACUUM FREEZE, pruning those dead tuples +$node_primary->safe_psql($test_db, qq[VACUUM FREEZE $table1;]); # Wait for attempted replay of PRUNE records $node_primary->wait_for_replay_catchup($node_standby); @@ -264,9 +264,9 @@ ], 'waiting'), "$sect: lock acquisition is waiting"); -# VACUUM will prune away rows, causing a buffer pin conflict, while standby -# psql is waiting on lock -$node_primary->safe_psql($test_db, qq[VACUUM $table1;]); +# VACUUM FREEZE will prune away rows, causing a buffer pin conflict, while +# standby psql is waiting on lock +$node_primary->safe_psql($test_db, qq[VACUUM FREEZE $table1;]); $node_primary->wait_for_replay_catchup($node_standby); check_conflict_log("User transaction caused buffer deadlock with recovery."); diff --git a/src/test/recovery/t/032_relfilenode_reuse.pl b/src/test/recovery/t/032_relfilenode_reuse.pl index 3bc2db1a4f3d2..96a8104b80267 100644 --- a/src/test/recovery/t/032_relfilenode_reuse.pl +++ b/src/test/recovery/t/032_relfilenode_reuse.pl @@ -1,5 +1,8 @@ + +# Copyright (c) 2024, PostgreSQL Global Development Group + use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/recovery/t/033_replay_tsp_drops.pl b/src/test/recovery/t/033_replay_tsp_drops.pl index af97ed9f70ad4..d17551dcf2d5f 100644 --- a/src/test/recovery/t/033_replay_tsp_drops.pl +++ b/src/test/recovery/t/033_replay_tsp_drops.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test replay of tablespace/database creation/drop use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; diff --git a/src/test/recovery/t/034_create_database.pl b/src/test/recovery/t/034_create_database.pl index ed562bba25152..e1a24ad06cf0b 100644 --- a/src/test/recovery/t/034_create_database.pl +++ b/src/test/recovery/t/034_create_database.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2023, PostgreSQL Global Development Group +# Copyright (c) 2023-2024, PostgreSQL Global Development Group # Test WAL replay for CREATE DATABASE .. STRATEGY WAL_LOG. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; diff --git a/src/test/recovery/t/035_standby_logical_decoding.pl b/src/test/recovery/t/035_standby_logical_decoding.pl index 480e6d6caa5e8..58c4402e80e6c 100644 --- a/src/test/recovery/t/035_standby_logical_decoding.pl +++ b/src/test/recovery/t/035_standby_logical_decoding.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2023, PostgreSQL Global Development Group +# Copyright (c) 2023-2024, PostgreSQL Global Development Group # logical decoding on standby : test logical decoding, # recovery conflict and standby promotion. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -21,7 +21,6 @@ PostgreSQL::Test::Cluster->new('cascading_standby'); my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); my $default_timeout = $PostgreSQL::Test::Utils::timeout_default; -my $psql_timeout = IPC::Run::timer($default_timeout); my $res; # Name for the physical slot on primary @@ -90,7 +89,8 @@ sub make_slot_active '>', $to_stdout, '2>', - $to_stderr); + $to_stderr, + IPC::Run::timeout($default_timeout)); if ($wait) { @@ -168,27 +168,27 @@ sub change_hot_standby_feedback_and_wait_for_xmins } } -# Check conflicting status in pg_replication_slots. -sub check_slots_conflicting_status +# Check reason for conflict in pg_replication_slots. +sub check_slots_conflict_reason { - my ($conflicting) = @_; + my ($slot_prefix, $reason) = @_; - if ($conflicting) - { - $res = $node_standby->safe_psql( - 'postgres', qq( - select bool_and(conflicting) from pg_replication_slots;)); + my $active_slot = $slot_prefix . 'activeslot'; + my $inactive_slot = $slot_prefix . 'inactiveslot'; - is($res, 't', "Logical slots are reported as conflicting"); - } - else - { - $res = $node_standby->safe_psql( - 'postgres', qq( - select bool_or(conflicting) from pg_replication_slots;)); + $res = $node_standby->safe_psql( + 'postgres', qq( + select invalidation_reason from pg_replication_slots where slot_name = '$active_slot' and conflicting;) + ); - is($res, 'f', "Logical slots are reported as non conflicting"); - } + is($res, "$reason", "$active_slot reason for conflict is $reason"); + + $res = $node_standby->safe_psql( + 'postgres', qq( + select invalidation_reason from pg_replication_slots where slot_name = '$inactive_slot' and conflicting;) + ); + + is($res, "$reason", "$inactive_slot reason for conflict is $reason"); } # Drop the slots, re-create them, change hot_standby_feedback, @@ -205,9 +205,6 @@ sub reactive_slots_change_hfs_and_wait_for_xmins change_hot_standby_feedback_and_wait_for_xmins($hsf, $invalidated); - $handle = - make_slot_active($node_standby, $slot_prefix, 1, \$stdout, \$stderr); - # reset stat: easier to check for confl_active_logicalslot in pg_stat_database_conflicts $node_standby->psql('testdb', q[select pg_stat_reset();]); } @@ -215,7 +212,7 @@ sub reactive_slots_change_hfs_and_wait_for_xmins # Check invalidation in the logfile and in pg_stat_database_conflicts sub check_for_invalidation { - my ($slot_prefix, $log_start, $test_name) = @_; + my ($slot_prefix, $log_start, $test_name, $checks_active_slot) = @_; my $active_slot = $slot_prefix . 'activeslot'; my $inactive_slot = $slot_prefix . 'inactiveslot'; @@ -231,13 +228,55 @@ sub check_for_invalidation $log_start), "activeslot slot invalidation is logged $test_name"); - # Verify that pg_stat_database_conflicts.confl_active_logicalslot has been updated - ok( $node_standby->poll_query_until( - 'postgres', - "select (confl_active_logicalslot = 1) from pg_stat_database_conflicts where datname = 'testdb'", - 't'), - 'confl_active_logicalslot updated' - ) or die "Timed out waiting confl_active_logicalslot to be updated"; + if ($checks_active_slot) + { + # Verify that pg_stat_database_conflicts.confl_active_logicalslot has + # been updated + ok( $node_standby->poll_query_until( + 'postgres', + "select (confl_active_logicalslot = 1) from pg_stat_database_conflicts where datname = 'testdb'", + 't'), + 'confl_active_logicalslot updated' + ) or die "Timed out waiting confl_active_logicalslot to be updated"; + } +} + +# Launch $sql query, wait for a new snapshot that has a newer horizon and +# launch a VACUUM. $vac_option is the set of options to be passed to the +# VACUUM command, $sql the sql to launch before triggering the vacuum and +# $to_vac the relation to vacuum. +# +# Note that pg_current_snapshot() is used to get the horizon. It does +# not generate a Transaction/COMMIT WAL record, decreasing the risk of +# seeing a xl_running_xacts that would advance an active replication slot's +# catalog_xmin. Advancing the active replication slot's catalog_xmin +# would break some tests that expect the active slot to conflict with +# the catalog xmin horizon. Even with the above precaution, there is a risk +# of xl_running_xacts record being logged and replayed before the VACUUM +# command, leading to the test failure. So, we ensured that replication slots +# are not activated for tests that can invalidate slots due to 'rows_removed' +# conflict reason. +sub wait_until_vacuum_can_remove +{ + my ($vac_option, $sql, $to_vac) = @_; + + # Get the current xid horizon, + my $xid_horizon = $node_primary->safe_psql('testdb', + qq[select pg_snapshot_xmin(pg_current_snapshot());]); + + # Launch our sql. + $node_primary->safe_psql('testdb', qq[$sql]); + + # Wait until we get a newer horizon. + $node_primary->poll_query_until('testdb', + "SELECT (select pg_snapshot_xmin(pg_current_snapshot())::text::int - $xid_horizon) > 0" + ) or die "new snapshot does not have a newer horizon"; + + # Launch the vacuum command and insert into flush_wal (see CREATE + # TABLE flush_wal for the reason). + $node_primary->safe_psql( + 'testdb', qq[VACUUM $vac_option verbose $to_vac; + INSERT INTO flush_wal DEFAULT VALUES;]); } ######################## @@ -250,6 +289,7 @@ sub check_for_invalidation wal_level = 'logical' max_replication_slots = 4 max_wal_senders = 4 +autovacuum = off }); $node_primary->dump_info; $node_primary->start; @@ -293,7 +333,7 @@ sub check_for_invalidation ####################### # Initialize subscriber node ####################### -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; my %psql_subscriber = ( @@ -308,7 +348,45 @@ sub check_for_invalidation \$psql_subscriber{subscriber_stdout}, '2>', \$psql_subscriber{subscriber_stderr}, - $psql_timeout); + IPC::Run::timeout($default_timeout)); + +################################################## +# Test that the standby requires hot_standby to be +# enabled for pre-existing logical slots. +################################################## + +# create the logical slots +$node_standby->create_logical_slot_on_standby($node_primary, 'restart_test'); +$node_standby->stop; +$node_standby->append_conf('postgresql.conf', qq[hot_standby = off]); + +# Use run_log instead of $node_standby->start because this test expects +# that the server ends with an error during startup. +run_log( + [ + 'pg_ctl', + '--pgdata' => $node_standby->data_dir, + '--log' => $node_standby->logfile, + 'start', + ]); + +# wait for postgres to terminate +foreach my $i (0 .. 10 * $PostgreSQL::Test::Utils::timeout_default) +{ + last if !-f $node_standby->data_dir . '/postmaster.pid'; + usleep(100_000); +} + +# Confirm that the server startup fails with an expected error +my $logfile = slurp_file($node_standby->logfile()); +ok( $logfile =~ + qr/FATAL: .* logical replication slot ".*" exists on the standby, but "hot_standby" = "off"/, + "the standby ends with an error during startup because hot_standby was disabled" +); +$node_standby->adjust_conf('postgresql.conf', 'hot_standby', 'on'); +$node_standby->start; +$node_standby->safe_psql('postgres', + qq[SELECT pg_drop_replication_slot('restart_test')]); ################################################## # Test that logical decoding on the standby @@ -432,8 +510,8 @@ sub check_for_invalidation $psql_subscriber{run}->pump_nb(); -# Speed up the subscription creation -$node_primary->safe_psql('postgres', "SELECT pg_log_standby_snapshot()"); +# Log the standby snapshot to speed up the subscription creation +$node_primary->log_standby_snapshot($node_standby, 'tap_sub'); # Explicitly shut down psql instance gracefully - to avoid hangs # or worse on windows @@ -459,7 +537,7 @@ sub check_for_invalidation $node_subscriber->stop; ################################################## -# Recovery conflict: Invalidate conflicting slots, including in-use slots +# Recovery conflict: Invalidate conflicting slots # Scenario 1: hot_standby_feedback off and vacuum FULL ################################################## @@ -469,22 +547,23 @@ sub check_for_invalidation reactive_slots_change_hfs_and_wait_for_xmins('behaves_ok_', 'vacuum_full_', 0, 1); +# Ensure that replication slot stats are not empty before triggering the +# conflict. +$node_primary->safe_psql('testdb', + qq[INSERT INTO decoding_test(x,y) SELECT 100,'100';]); + # This should trigger the conflict -$node_primary->safe_psql( - 'testdb', qq[ - CREATE TABLE conflict_test(x integer, y text); - DROP TABLE conflict_test; - VACUUM full pg_class; - INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal -]); +wait_until_vacuum_can_remove( + 'full', 'CREATE TABLE conflict_test(x integer, y text); + DROP TABLE conflict_test;', 'pg_class'); $node_primary->wait_for_replay_catchup($node_standby); # Check invalidation in the logfile and in pg_stat_database_conflicts -check_for_invalidation('vacuum_full_', 1, 'with vacuum FULL on pg_class'); +check_for_invalidation('vacuum_full_', 1, 'with vacuum FULL on pg_class', 0); -# Verify slots are reported as conflicting in pg_replication_slots -check_slots_conflicting_status(1); +# Verify reason for conflict is 'rows_removed' in pg_replication_slots +check_slots_conflict_reason('vacuum_full_', 'rows_removed'); $handle = make_slot_active($node_standby, 'vacuum_full_', 0, \$stdout, \$stderr); @@ -494,6 +573,15 @@ sub check_for_invalidation "can no longer get changes from replication slot \"vacuum_full_activeslot\"" ); +# Attempt to copy an invalidated logical replication slot +($result, $stdout, $stderr) = $node_standby->psql( + 'postgres', + qq[select pg_copy_logical_replication_slot('vacuum_full_inactiveslot', 'vacuum_full_inactiveslot_copy');], + replication => 'database'); +ok( $stderr =~ + /ERROR: cannot copy invalidated replication slot "vacuum_full_inactiveslot"/, + "invalidated slot cannot be copied"); + # Turn hot_standby_feedback back on change_hot_standby_feedback_and_wait_for_xmins(1, 1); @@ -502,16 +590,18 @@ sub check_for_invalidation ################################################## $node_standby->restart; -# Verify slots are reported as conflicting in pg_replication_slots -check_slots_conflicting_status(1); +# Verify reason for conflict is retained across a restart. +check_slots_conflict_reason('vacuum_full_', 'rows_removed'); ################################################## # Verify that invalidated logical slots do not lead to retaining WAL. ################################################## # Get the restart_lsn from an invalidated slot -my $restart_lsn = $node_standby->safe_psql('postgres', - "SELECT restart_lsn from pg_replication_slots WHERE slot_name = 'vacuum_full_activeslot' and conflicting is true;" +my $restart_lsn = $node_standby->safe_psql( + 'postgres', + "SELECT restart_lsn FROM pg_replication_slots + WHERE slot_name = 'vacuum_full_activeslot' AND conflicting;" ); chomp($restart_lsn); @@ -524,11 +614,8 @@ sub check_for_invalidation chomp($walfile_name); # Generate some activity and switch WAL file on the primary -$node_primary->safe_psql( - 'postgres', "create table retain_test(a int); - select pg_switch_wal(); - insert into retain_test values(1); - checkpoint;"); +$node_primary->advance_wal(1); +$node_primary->safe_psql('postgres', "checkpoint;"); # Wait for the standby to catch up $node_primary->wait_for_replay_catchup($node_standby); @@ -542,7 +629,7 @@ sub check_for_invalidation "invalidated logical slots do not lead to retaining WAL"); ################################################## -# Recovery conflict: Invalidate conflicting slots, including in-use slots +# Recovery conflict: Invalidate conflicting slots # Scenario 2: conflict due to row removal with hot_standby_feedback off. ################################################## @@ -550,26 +637,23 @@ sub check_for_invalidation my $logstart = -s $node_standby->logfile; # One way to produce recovery conflict is to create/drop a relation and -# launch a vacuum on pg_class with hot_standby_feedback turned off on the standby. +# launch a vacuum on pg_class with hot_standby_feedback turned off on the +# standby. reactive_slots_change_hfs_and_wait_for_xmins('vacuum_full_', 'row_removal_', 0, 1); # This should trigger the conflict -$node_primary->safe_psql( - 'testdb', qq[ - CREATE TABLE conflict_test(x integer, y text); - DROP TABLE conflict_test; - VACUUM pg_class; - INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal -]); +wait_until_vacuum_can_remove( + '', 'CREATE TABLE conflict_test(x integer, y text); + DROP TABLE conflict_test;', 'pg_class'); $node_primary->wait_for_replay_catchup($node_standby); # Check invalidation in the logfile and in pg_stat_database_conflicts -check_for_invalidation('row_removal_', $logstart, 'with vacuum on pg_class'); +check_for_invalidation('row_removal_', $logstart, 'with vacuum on pg_class', 0); -# Verify slots are reported as conflicting in pg_replication_slots -check_slots_conflicting_status(1); +# Verify reason for conflict is 'rows_removed' in pg_replication_slots +check_slots_conflict_reason('row_removal_', 'rows_removed'); $handle = make_slot_active($node_standby, 'row_removal_', 0, \$stdout, \$stderr); @@ -587,28 +671,25 @@ sub check_for_invalidation # get the position to search from in the standby logfile $logstart = -s $node_standby->logfile; -# One way to produce recovery conflict is to create/drop a relation and -# launch a vacuum on pg_class with hot_standby_feedback turned off on the standby. +# One way to produce recovery conflict on a shared catalog table is to +# create/drop a role and launch a vacuum on pg_authid with +# hot_standby_feedback turned off on the standby. reactive_slots_change_hfs_and_wait_for_xmins('row_removal_', 'shared_row_removal_', 0, 1); # Trigger the conflict -$node_primary->safe_psql( - 'testdb', qq[ - CREATE ROLE create_trash; - DROP ROLE create_trash; - VACUUM pg_authid; - INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal -]); +wait_until_vacuum_can_remove( + '', 'CREATE ROLE create_trash; + DROP ROLE create_trash;', 'pg_authid'); $node_primary->wait_for_replay_catchup($node_standby); # Check invalidation in the logfile and in pg_stat_database_conflicts check_for_invalidation('shared_row_removal_', $logstart, - 'with vacuum on pg_authid'); + 'with vacuum on pg_authid', 0); -# Verify slots are reported as conflicting in pg_replication_slots -check_slots_conflicting_status(1); +# Verify reason for conflict is 'rows_removed' in pg_replication_slots +check_slots_conflict_reason('shared_row_removal_', 'rows_removed'); $handle = make_slot_active($node_standby, 'shared_row_removal_', 0, \$stdout, \$stderr); @@ -629,15 +710,16 @@ sub check_for_invalidation reactive_slots_change_hfs_and_wait_for_xmins('shared_row_removal_', 'no_conflict_', 0, 1); +# As this scenario is not expected to produce any conflict, so activate the slot. +# See comments atop wait_until_vacuum_can_remove(). +make_slot_active($node_standby, 'no_conflict_', 1, \$stdout, \$stderr); + # This should not trigger a conflict -$node_primary->safe_psql( - 'testdb', qq[ - CREATE TABLE conflict_test(x integer, y text); - INSERT INTO conflict_test(x,y) SELECT s, s::text FROM generate_series(1,4) s; - UPDATE conflict_test set x=1, y=1; - VACUUM conflict_test; - INSERT INTO flush_wal DEFAULT VALUES; -- see create table flush_wal -]); +wait_until_vacuum_can_remove( + '', 'CREATE TABLE conflict_test(x integer, y text); + INSERT INTO conflict_test(x,y) SELECT s, s::text FROM generate_series(1,4) s; + UPDATE conflict_test set x=1, y=1;', 'conflict_test'); + $node_primary->wait_for_replay_catchup($node_standby); # message should not be issued @@ -660,7 +742,13 @@ sub check_for_invalidation ) or die "Timed out waiting confl_active_logicalslot to be updated"; # Verify slots are reported as non conflicting in pg_replication_slots -check_slots_conflicting_status(0); +is( $node_standby->safe_psql( + 'postgres', + q[select bool_or(conflicting) from + (select conflicting from pg_replication_slots + where slot_type = 'logical')]), + 'f', + 'Logical slots are reported as non conflicting'); # Turn hot_standby_feedback back on change_hot_standby_feedback_and_wait_for_xmins(1, 0); @@ -669,8 +757,8 @@ sub check_for_invalidation $node_standby->restart; ################################################## -# Recovery conflict: Invalidate conflicting slots, including in-use slots -# Scenario 4: conflict due to on-access pruning. +# Recovery conflict: Invalidate conflicting slots +# Scenario 5: conflict due to on-access pruning. ################################################## # get the position to search from in the standby logfile @@ -694,10 +782,10 @@ sub check_for_invalidation $node_primary->wait_for_replay_catchup($node_standby); # Check invalidation in the logfile and in pg_stat_database_conflicts -check_for_invalidation('pruning_', $logstart, 'with on-access pruning'); +check_for_invalidation('pruning_', $logstart, 'with on-access pruning', 0); -# Verify slots are reported as conflicting in pg_replication_slots -check_slots_conflicting_status(1); +# Verify reason for conflict is 'rows_removed' in pg_replication_slots +check_slots_conflict_reason('pruning_', 'rows_removed'); $handle = make_slot_active($node_standby, 'pruning_', 0, \$stdout, \$stderr); @@ -710,7 +798,7 @@ sub check_for_invalidation ################################################## # Recovery conflict: Invalidate conflicting slots, including in-use slots -# Scenario 5: incorrect wal_level on primary. +# Scenario 6: incorrect wal_level on primary. ################################################## # get the position to search from in the standby logfile @@ -738,16 +826,16 @@ sub check_for_invalidation $node_primary->wait_for_replay_catchup($node_standby); # Check invalidation in the logfile and in pg_stat_database_conflicts -check_for_invalidation('wal_level_', $logstart, 'due to wal_level'); +check_for_invalidation('wal_level_', $logstart, 'due to wal_level', 1); -# Verify slots are reported as conflicting in pg_replication_slots -check_slots_conflicting_status(1); +# Verify reason for conflict is 'wal_level_insufficient' in pg_replication_slots +check_slots_conflict_reason('wal_level_', 'wal_level_insufficient'); $handle = make_slot_active($node_standby, 'wal_level_', 0, \$stdout, \$stderr); # We are not able to read from the slot as it requires wal_level >= logical on the primary server check_pg_recvlogical_stderr($handle, - "logical decoding on standby requires wal_level >= logical on the primary" + "logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary" ); # Restore primary wal_level diff --git a/src/test/recovery/t/036_truncated_dropped.pl b/src/test/recovery/t/036_truncated_dropped.pl index 2d5339d9d8d99..e205d8b9fba2b 100644 --- a/src/test/recovery/t/036_truncated_dropped.pl +++ b/src/test/recovery/t/036_truncated_dropped.pl @@ -1,11 +1,11 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests recovery scenarios where the files are shorter than in the common # cases, e.g. due to replaying WAL records of a relation that was subsequently # truncated or dropped. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use Test::More; diff --git a/src/test/recovery/t/037_invalid_database.pl b/src/test/recovery/t/037_invalid_database.pl new file mode 100644 index 0000000000000..3735086aee4c0 --- /dev/null +++ b/src/test/recovery/t/037_invalid_database.pl @@ -0,0 +1,142 @@ +# Copyright (c) 2023-2024, PostgreSQL Global Development Group +# +# Test we handle interrupted DROP DATABASE correctly. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $node = PostgreSQL::Test::Cluster->new('node'); +$node->init; +$node->append_conf( + "postgresql.conf", qq( +autovacuum = off +max_prepared_transactions=5 +log_min_duration_statement=0 +log_connections=on +log_disconnections=on +)); + +$node->start; + + +# First verify that we can't connect to or ALTER an invalid database. Just +# mark the database as invalid ourselves, that's more reliable than hitting the +# required race conditions (see testing further down)... + +$node->safe_psql( + "postgres", qq( +CREATE DATABASE regression_invalid; +UPDATE pg_database SET datconnlimit = -2 WHERE datname = 'regression_invalid'; +)); + +my $psql_stdout = ''; +my $psql_stderr = ''; + +is($node->psql('regression_invalid', '', stderr => \$psql_stderr), + 2, "can't connect to invalid database - error code"); +like( + $psql_stderr, + qr/FATAL:\s+cannot connect to invalid database "regression_invalid"/, + "can't connect to invalid database - error message"); + +is( $node->psql( + 'postgres', 'ALTER DATABASE regression_invalid CONNECTION LIMIT 10'), + 2, + "can't ALTER invalid database"); + +# check invalid database can't be used as a template +is( $node->psql( + 'postgres', + 'CREATE DATABASE copy_invalid TEMPLATE regression_invalid'), + 3, + "can't use invalid database as template"); + + +# Verify that VACUUM ignores an invalid database when computing how much of +# the clog is needed (vac_truncate_clog()). For that we modify the pg_database +# row of the invalid database to have an outdated datfrozenxid. +$psql_stderr = ''; +$node->psql( + 'postgres', + qq( +UPDATE pg_database SET datfrozenxid = '123456' WHERE datname = 'regression_invalid'; +DROP TABLE IF EXISTS foo_tbl; CREATE TABLE foo_tbl(); +VACUUM FREEZE;), + stderr => \$psql_stderr); +unlike( + $psql_stderr, + qr/some databases have not been vacuumed in over 2 billion transactions/, + "invalid databases are ignored by vac_truncate_clog"); + + +# But we need to be able to drop an invalid database. +is( $node->psql( + 'postgres', 'DROP DATABASE regression_invalid', + stdout => \$psql_stdout, + stderr => \$psql_stderr), + 0, + "can DROP invalid database"); + +# Ensure database is gone +is($node->psql('postgres', 'DROP DATABASE regression_invalid'), + 3, "can't drop already dropped database"); + + +# Test that interruption of DROP DATABASE is handled properly. To ensure the +# interruption happens at the appropriate moment, we lock pg_tablespace. DROP +# DATABASE scans pg_tablespace once it has reached the "irreversible" part of +# dropping the database, making it a suitable point to wait. Since relcache +# init reads pg_tablespace, establish each connection before locking. This +# avoids a connection-time hang with debug_discard_caches. +my $cancel = $node->background_psql('postgres', on_error_stop => 1); +my $bgpsql = $node->background_psql('postgres', on_error_stop => 0); +my $pid = $bgpsql->query('SELECT pg_backend_pid()'); + +# create the database, prevent drop database via lock held by a 2PC transaction +$bgpsql->query_safe( + qq( + CREATE DATABASE regression_invalid_interrupt; + BEGIN; + LOCK pg_tablespace; + PREPARE TRANSACTION 'lock_tblspc';)); + +# Try to drop. This will wait due to the still held lock. +$bgpsql->query_until(qr//, "DROP DATABASE regression_invalid_interrupt;\n"); + + +# Once the DROP DATABASE is waiting for the lock, interrupt it. +ok( $cancel->query_safe( + qq( + DO \$\$ + BEGIN + WHILE NOT EXISTS(SELECT * FROM pg_locks WHERE NOT granted AND relation = 'pg_tablespace'::regclass AND mode = 'AccessShareLock') LOOP + PERFORM pg_sleep(.1); + END LOOP; + END\$\$; + SELECT pg_cancel_backend($pid);)), + "canceling DROP DATABASE"); +$cancel->quit(); + +# wait for cancellation to be processed +ok( pump_until( + $bgpsql->{run}, $bgpsql->{timeout}, + \$bgpsql->{stderr}, qr/canceling statement due to user request/), + "cancel processed"); +$bgpsql->{stderr} = ''; + +# Verify that connections to the database aren't allowed. The backend checks +# this before relcache init, so the lock won't interfere. +is($node->psql('regression_invalid_interrupt', ''), + 2, "can't connect to invalid_interrupt database"); + +# To properly drop the database, we need to release the lock previously preventing +# doing so. +$bgpsql->query_safe(qq(ROLLBACK PREPARED 'lock_tblspc')); +$bgpsql->query_safe(qq(DROP DATABASE regression_invalid_interrupt)); + +$bgpsql->quit(); + +done_testing(); diff --git a/src/test/recovery/t/038_save_logical_slots_shutdown.pl b/src/test/recovery/t/038_save_logical_slots_shutdown.pl new file mode 100644 index 0000000000000..2a3bf1f8da9f8 --- /dev/null +++ b/src/test/recovery/t/038_save_logical_slots_shutdown.pl @@ -0,0 +1,112 @@ + +# Copyright (c) 2023-2024, PostgreSQL Global Development Group + +# Test logical replication slots are always flushed to disk during a shutdown +# checkpoint. + +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +sub compare_confirmed_flush +{ + my ($node, $confirmed_flush_from_log) = @_; + + # Fetch Latest checkpoint location from the control file + my ($stdout, $stderr) = + run_command([ 'pg_controldata', $node->data_dir ]); + my @control_data = split("\n", $stdout); + my $latest_checkpoint = undef; + foreach (@control_data) + { + if ($_ =~ /^Latest checkpoint location:\s*(.*)$/mg) + { + $latest_checkpoint = $1; + last; + } + } + die "Latest checkpoint location not found in control file\n" + unless defined($latest_checkpoint); + + # Is it same as the value read from log? + ok( $latest_checkpoint eq $confirmed_flush_from_log, + "Check that the slot's confirmed_flush LSN is the same as the latest_checkpoint location" + ); + + return; +} + +# Initialize publisher node +my $node_publisher = PostgreSQL::Test::Cluster->new('pub'); +$node_publisher->init(allows_streaming => 'logical'); +# Avoid checkpoint during the test, otherwise, the latest checkpoint location +# will change. +$node_publisher->append_conf( + 'postgresql.conf', q{ +checkpoint_timeout = 1h +autovacuum = off +}); +$node_publisher->start; + +# Create subscriber node +my $node_subscriber = PostgreSQL::Test::Cluster->new('sub'); +$node_subscriber->init; +$node_subscriber->start; + +# Create tables +$node_publisher->safe_psql('postgres', "CREATE TABLE test_tbl (id int)"); +$node_subscriber->safe_psql('postgres', "CREATE TABLE test_tbl (id int)"); + +# To avoid a shutdown checkpoint WAL record (that gets generated as part of +# the publisher restart below) falling into a new page, advance the WAL +# segment. Otherwise, the confirmed_flush_lsn and shutdown_checkpoint +# location won't match. +$node_publisher->advance_wal(1); + +# Insert some data +$node_publisher->safe_psql('postgres', + "INSERT INTO test_tbl VALUES (generate_series(1, 5));"); + +# Setup logical replication +my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION pub FOR ALL TABLES"); +$node_subscriber->safe_psql('postgres', + "CREATE SUBSCRIPTION sub CONNECTION '$publisher_connstr' PUBLICATION pub" +); + +$node_subscriber->wait_for_subscription_sync($node_publisher, 'sub'); + +my $result = + $node_subscriber->safe_psql('postgres', "SELECT count(*) FROM test_tbl"); + +is($result, qq(5), "check initial copy was done"); + +my $offset = -s $node_publisher->logfile; + +# Note: Don't insert any data on the publisher that may cause the shutdown +# checkpoint to fall into a new WAL file. See the comments atop advance_wal() +# above. + +# Restart the publisher to ensure that the slot will be flushed if required +$node_publisher->restart(); + +# Wait until the walsender creates decoding context +$node_publisher->wait_for_log( + qr/Streaming transactions committing after ([A-F0-9]+\/[A-F0-9]+), reading WAL from ([A-F0-9]+\/[A-F0-9]+)./, + $offset); + +# Extract confirmed_flush from the logfile +my $log_contents = slurp_file($node_publisher->logfile, $offset); +$log_contents =~ + qr/Streaming transactions committing after ([A-F0-9]+\/[A-F0-9]+), reading WAL from ([A-F0-9]+\/[A-F0-9]+)./ + or die "could not get confirmed_flush_lsn"; + +# Ensure that the slot's confirmed_flush LSN is the same as the +# latest_checkpoint location. +compare_confirmed_flush($node_publisher, $1); + +done_testing(); diff --git a/src/test/recovery/t/039_end_of_wal.pl b/src/test/recovery/t/039_end_of_wal.pl new file mode 100644 index 0000000000000..eb1e051d43dab --- /dev/null +++ b/src/test/recovery/t/039_end_of_wal.pl @@ -0,0 +1,366 @@ +# Copyright (c) 2023-2024, PostgreSQL Global Development Group +# +# Test detecting end-of-WAL conditions. This test suite generates +# fake defective page and record headers to trigger various failure +# scenarios. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; +use Fcntl qw(SEEK_SET); + +use integer; # causes / operator to use integer math + +# Is this a big-endian system ("network" byte order)? We can't use 'Q' in +# pack() calls because it's not available in some perl builds, so we need to +# break 64 bit LSN values into two 'I' values. Fortunately we don't need to +# deal with high values, so we can just write 0 for the high order 32 bits, but +# we need to know the endianness to do that. +my $BIG_ENDIAN = pack("L", 0x12345678) eq pack("N", 0x12345678); + +# Fields retrieved from code headers. +my @scan_result = scan_server_header('access/xlog_internal.h', + '#define\s+XLOG_PAGE_MAGIC\s+(\w+)'); +my $XLP_PAGE_MAGIC = hex($scan_result[0]); +@scan_result = scan_server_header('access/xlog_internal.h', + '#define\s+XLP_FIRST_IS_CONTRECORD\s+(\w+)'); +my $XLP_FIRST_IS_CONTRECORD = hex($scan_result[0]); + +# Values queried from the server +my $WAL_SEGMENT_SIZE; +my $WAL_BLOCK_SIZE; +my $TLI; + +# Get GUC value, converted to an int. +sub get_int_setting +{ + my $node = shift; + my $name = shift; + return int( + $node->safe_psql( + 'postgres', + "SELECT setting FROM pg_settings WHERE name = '$name'")); +} + +sub start_of_page +{ + my $lsn = shift; + return $lsn & ~($WAL_BLOCK_SIZE - 1); +} + +sub start_of_next_page +{ + my $lsn = shift; + return start_of_page($lsn) + $WAL_BLOCK_SIZE; +} + +# Build a fake WAL record header based on the data given by the caller. +# This needs to follow the format of the C structure XLogRecord. To +# be inserted with write_wal(). +sub build_record_header +{ + my $xl_tot_len = shift; + my $xl_xid = shift || 0; + my $xl_prev = shift || 0; + my $xl_info = shift || 0; + my $xl_rmid = shift || 0; + my $xl_crc = shift || 0; + + # This needs to follow the structure XLogRecord: + # I for xl_tot_len + # I for xl_xid + # II for xl_prev + # C for xl_info + # C for xl_rmid + # BB for two bytes of padding + # I for xl_crc + return pack("IIIICCBBI", + $xl_tot_len, $xl_xid, + $BIG_ENDIAN ? 0 : $xl_prev, + $BIG_ENDIAN ? $xl_prev : 0, + $xl_info, $xl_rmid, 0, 0, $xl_crc); +} + +# Build a fake WAL page header, based on the data given by the caller +# This needs to follow the format of the C structure XLogPageHeaderData. +# To be inserted with write_wal(). +sub build_page_header +{ + my $xlp_magic = shift; + my $xlp_info = shift || 0; + my $xlp_tli = shift || 0; + my $xlp_pageaddr = shift || 0; + my $xlp_rem_len = shift || 0; + + # This needs to follow the structure XLogPageHeaderData: + # S for xlp_magic + # S for xlp_info + # I for xlp_tli + # II for xlp_pageaddr + # I for xlp_rem_len + return pack("SSIIII", + $xlp_magic, $xlp_info, $xlp_tli, + $BIG_ENDIAN ? 0 : $xlp_pageaddr, + $BIG_ENDIAN ? $xlp_pageaddr : 0, $xlp_rem_len); +} + +# Setup a new node. The configuration chosen here minimizes the number +# of arbitrary records that could get generated in a cluster. Enlarging +# checkpoint_timeout avoids noise with checkpoint activity. wal_level +# set to "minimal" avoids random standby snapshot records. Autovacuum +# could also trigger randomly, generating random WAL activity of its own. +my $node = PostgreSQL::Test::Cluster->new("node"); +$node->init; +$node->append_conf( + 'postgresql.conf', + q[wal_level = minimal + autovacuum = off + checkpoint_timeout = '30min' +]); +$node->start; +$node->safe_psql('postgres', "CREATE TABLE t AS SELECT 42"); + +$WAL_SEGMENT_SIZE = get_int_setting($node, 'wal_segment_size'); +$WAL_BLOCK_SIZE = get_int_setting($node, 'wal_block_size'); +$TLI = $node->safe_psql('postgres', + "SELECT timeline_id FROM pg_control_checkpoint();"); + +# Initial LSN may vary across systems due to different catalog contents set up +# by initdb. Switch to a new WAL file so all systems start out in the same +# place. The first test depends on trailing zeroes on a page with a valid +# header. +$node->safe_psql('postgres', "SELECT pg_switch_wal();"); + +my $end_lsn; +my $prev_lsn; + +########################################################################### +note "Single-page end-of-WAL detection"; +########################################################################### + +# xl_tot_len is 0 (a common case, we hit trailing zeroes). +$node->emit_wal(0); +$end_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$node->stop('immediate'); +my $log_size = -s $node->logfile; +$node->start; +ok( $node->log_contains( + "invalid record length at .*: expected at least 24, got 0", $log_size + ), + "xl_tot_len zero"); + +# xl_tot_len is < 24 (presumably recycled garbage). +$node->emit_wal(0); +$end_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$node->stop('immediate'); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(23)); +$log_size = -s $node->logfile; +$node->start; +ok( $node->log_contains( + "invalid record length at .*: expected at least 24, got 23", + $log_size), + "xl_tot_len short"); + +# xl_tot_len in final position, not big enough to span into a new page but +# also not eligible for regular record header validation +$node->emit_wal(0); +$end_lsn = $node->advance_wal_to_record_splitting_zone($WAL_BLOCK_SIZE); +$node->stop('immediate'); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, build_record_header(1)); +$log_size = -s $node->logfile; +$node->start; +ok( $node->log_contains( + "invalid record length at .*: expected at least 24, got 1", $log_size + ), + "xl_tot_len short at end-of-page"); + +# Need more pages, but xl_prev check fails first. +$node->emit_wal(0); +$end_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$node->stop('immediate'); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, + build_record_header(2 * 1024 * 1024 * 1024, 0, 0xdeadbeef)); +$log_size = -s $node->logfile; +$node->start; +ok( $node->log_contains( + "record with incorrect prev-link 0/DEADBEEF at .*", $log_size), + "xl_prev bad"); + +# xl_crc check fails. +$node->emit_wal(0); +$node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(10); +$node->stop('immediate'); +# Corrupt a byte in that record, breaking its CRC. +$node->write_wal($TLI, $end_lsn - 8, $WAL_SEGMENT_SIZE, '!'); +$log_size = -s $node->logfile; +$node->start; +ok( $node->log_contains( + "incorrect resource manager data checksum in record at .*", $log_size + ), + "xl_crc bad"); + + +########################################################################### +note "Multi-page end-of-WAL detection, header is not split"; +########################################################################### + +# This series of tests requires a valid xl_prev set in the record header +# written to WAL. + +# Good xl_prev, we hit zero page next (zero magic). +$node->emit_wal(0); +$prev_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(0); +$node->stop('immediate'); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, + build_record_header(2 * 1024 * 1024 * 1024, 0, $prev_lsn)); +$log_size = -s $node->logfile; +$node->start; +ok($node->log_contains("invalid magic number 0000 .* LSN .*", $log_size), + "xlp_magic zero"); + +# Good xl_prev, we hit garbage page next (bad magic). +$node->emit_wal(0); +$prev_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(0); +$node->stop('immediate'); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, + build_record_header(2 * 1024 * 1024 * 1024, 0, $prev_lsn)); +$node->write_wal($TLI, start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, build_page_header(0xcafe, 0, 1, 0)); +$log_size = -s $node->logfile; +$node->start; +ok($node->log_contains("invalid magic number CAFE .* LSN .*", $log_size), + "xlp_magic bad"); + +# Good xl_prev, we hit typical recycled page (good xlp_magic, bad +# xlp_pageaddr). +$node->emit_wal(0); +$prev_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(0); +$node->stop('immediate'); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, + build_record_header(2 * 1024 * 1024 * 1024, 0, $prev_lsn)); +$node->write_wal($TLI, start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, build_page_header($XLP_PAGE_MAGIC, 0, 1, 0xbaaaaaad)); +$log_size = -s $node->logfile; +$node->start; +ok( $node->log_contains( + "unexpected pageaddr 0/BAAAAAAD in .*, LSN .*,", $log_size), + "xlp_pageaddr bad"); + +# Good xl_prev, xlp_magic, xlp_pageaddr, but bogus xlp_info. +$node->emit_wal(0); +$prev_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(0); +$node->stop('immediate'); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, + build_record_header(2 * 1024 * 1024 * 1024, 42, $prev_lsn)); +$node->write_wal( + $TLI, + start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, + build_page_header( + $XLP_PAGE_MAGIC, 0x1234, 1, start_of_next_page($end_lsn))); +$log_size = -s $node->logfile; +$node->start; +ok($node->log_contains("invalid info bits 1234 in .*, LSN .*,", $log_size), + "xlp_info bad"); + +# Good xl_prev, xlp_magic, xlp_pageaddr, but xlp_info doesn't mention +# continuation record. +$node->emit_wal(0); +$prev_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(0); +$node->stop('immediate'); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, + build_record_header(2 * 1024 * 1024 * 1024, 42, $prev_lsn)); +$node->write_wal($TLI, start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, + build_page_header($XLP_PAGE_MAGIC, 0, 1, start_of_next_page($end_lsn))); +$log_size = -s $node->logfile; +$node->start; +ok($node->log_contains("there is no contrecord flag at .*", $log_size), + "xlp_info lacks XLP_FIRST_IS_CONTRECORD"); + +# Good xl_prev, xlp_magic, xlp_pageaddr, xlp_info but xlp_rem_len doesn't add +# up. +$node->emit_wal(0); +$prev_lsn = $node->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); +$end_lsn = $node->emit_wal(0); +$node->stop('immediate'); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, + build_record_header(2 * 1024 * 1024 * 1024, 42, $prev_lsn)); +$node->write_wal( + $TLI, + start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, + build_page_header( + $XLP_PAGE_MAGIC, $XLP_FIRST_IS_CONTRECORD, + 1, start_of_next_page($end_lsn), + 123456)); +$log_size = -s $node->logfile; +$node->start; +ok( $node->log_contains( + "invalid contrecord length 123456 .* at .*", $log_size), + "xlp_rem_len bad"); + + +########################################################################### +note "Multi-page, but header is split, so page checks are done first"; +########################################################################### + +# xl_prev is bad and xl_tot_len is too big, but we'll check xlp_magic first. +$node->emit_wal(0); +$end_lsn = $node->advance_wal_to_record_splitting_zone($WAL_BLOCK_SIZE); +$node->stop('immediate'); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, + build_record_header(2 * 1024 * 1024 * 1024, 0, 0xdeadbeef)); +$log_size = -s $node->logfile; +$node->start; +ok($node->log_contains("invalid magic number 0000 .* LSN .*", $log_size), + "xlp_magic zero (split record header)"); + +# And we'll also check xlp_pageaddr before any header checks. +$node->emit_wal(0); +$end_lsn = $node->advance_wal_to_record_splitting_zone($WAL_BLOCK_SIZE); +$node->stop('immediate'); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, + build_record_header(2 * 1024 * 1024 * 1024, 0, 0xdeadbeef)); +$node->write_wal( + $TLI, + start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, + build_page_header( + $XLP_PAGE_MAGIC, $XLP_FIRST_IS_CONTRECORD, 1, 0xbaaaaaad)); +$log_size = -s $node->logfile; +$node->start; +ok( $node->log_contains( + "unexpected pageaddr 0/BAAAAAAD in .*, LSN .*,", $log_size), + "xlp_pageaddr bad (split record header)"); + +# We'll also discover that xlp_rem_len doesn't add up before any +# header checks, +$node->emit_wal(0); +$end_lsn = $node->advance_wal_to_record_splitting_zone($WAL_BLOCK_SIZE); +$node->stop('immediate'); +$node->write_wal($TLI, $end_lsn, $WAL_SEGMENT_SIZE, + build_record_header(2 * 1024 * 1024 * 1024, 0, 0xdeadbeef)); +$node->write_wal( + $TLI, + start_of_next_page($end_lsn), + $WAL_SEGMENT_SIZE, + build_page_header( + $XLP_PAGE_MAGIC, $XLP_FIRST_IS_CONTRECORD, + 1, start_of_next_page($end_lsn), + 123456)); +$log_size = -s $node->logfile; +$node->start; +ok( $node->log_contains( + "invalid contrecord length 123456 .* at .*", $log_size), + "xlp_rem_len bad (split record header)"); + +done_testing(); diff --git a/src/test/recovery/t/040_standby_failover_slots_sync.pl b/src/test/recovery/t/040_standby_failover_slots_sync.pl new file mode 100644 index 0000000000000..823857bb3295b --- /dev/null +++ b/src/test/recovery/t/040_standby_failover_slots_sync.pl @@ -0,0 +1,895 @@ + +# Copyright (c) 2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +################################################## +# Test that when a subscription with failover enabled is created, it will alter +# the failover property of the corresponding slot on the publisher. +################################################## + +# Create publisher +my $publisher = PostgreSQL::Test::Cluster->new('publisher'); +# Make sure pg_hba.conf is set up to allow connections from repl_role. +# This is only needed on Windows machines that don't use UNIX sockets. +$publisher->init( + allows_streaming => 'logical', + auth_extra => [ '--create-role', 'repl_role' ]); +# Disable autovacuum to avoid generating xid during stats update as otherwise +# the new XID could then be replicated to standby at some random point making +# slots at primary lag behind standby during slot sync. +$publisher->append_conf('postgresql.conf', 'autovacuum = off'); +$publisher->start; + +$publisher->safe_psql('postgres', + "CREATE PUBLICATION regress_mypub FOR ALL TABLES;"); + +my $publisher_connstr = $publisher->connstr . ' dbname=postgres'; + +# Create a subscriber node, wait for sync to complete +my $subscriber1 = PostgreSQL::Test::Cluster->new('subscriber1'); +$subscriber1->init; +$subscriber1->start; + +# Capture the time before the logical failover slot is created on the +# primary. We later call this publisher as primary anyway. +my $slot_creation_time_on_primary = $publisher->safe_psql( + 'postgres', qq[ + SELECT current_timestamp; +]); + +# Create a subscription that enables failover. +$subscriber1->safe_psql('postgres', + "CREATE SUBSCRIPTION regress_mysub1 CONNECTION '$publisher_connstr' PUBLICATION regress_mypub WITH (slot_name = lsub1_slot, copy_data = false, failover = true, enabled = false);" +); + +# Confirm that the failover flag on the slot is turned on +is( $publisher->safe_psql( + 'postgres', + q{SELECT failover from pg_replication_slots WHERE slot_name = 'lsub1_slot';} + ), + "t", + 'logical slot has failover true on the publisher'); + +################################################## +# Test that changing the failover property of a subscription updates the +# corresponding failover property of the slot. +################################################## + +# Disable failover +$subscriber1->safe_psql('postgres', + "ALTER SUBSCRIPTION regress_mysub1 SET (failover = false)"); + +# Confirm that the failover flag on the slot has now been turned off +is( $publisher->safe_psql( + 'postgres', + q{SELECT failover from pg_replication_slots WHERE slot_name = 'lsub1_slot';} + ), + "f", + 'logical slot has failover false on the publisher'); + +# Enable failover +$subscriber1->safe_psql('postgres', + "ALTER SUBSCRIPTION regress_mysub1 SET (failover = true)"); + +# Confirm that the failover flag on the slot has now been turned on +is( $publisher->safe_psql( + 'postgres', + q{SELECT failover from pg_replication_slots WHERE slot_name = 'lsub1_slot';} + ), + "t", + 'logical slot has failover true on the publisher'); + +################################################## +# Test that the failover option cannot be changed for enabled subscriptions. +################################################## + +# Enable subscription +$subscriber1->safe_psql('postgres', + "ALTER SUBSCRIPTION regress_mysub1 ENABLE"); + +# Disable failover for enabled subscription +my ($result, $stdout, $stderr) = $subscriber1->psql('postgres', + "ALTER SUBSCRIPTION regress_mysub1 SET (failover = false)"); +ok( $stderr =~ /ERROR: cannot set failover for enabled subscription/, + "altering failover is not allowed for enabled subscription"); + +################################################## +# Test that pg_sync_replication_slots() cannot be executed on a non-standby server. +################################################## + +($result, $stdout, $stderr) = + $publisher->psql('postgres', "SELECT pg_sync_replication_slots();"); +ok( $stderr =~ + /ERROR: replication slots can only be synchronized to a standby server/, + "cannot sync slots on a non-standby server"); + +################################################## +# Test logical failover slots corresponding to different plugins can be +# synced to the standby. +# +# Configure standby1 to replicate and synchronize logical slots configured +# for failover on the primary +# +# failover slot lsub1_slot | output_plugin: pgoutput +# failover slot lsub2_slot | output_plugin: test_decoding +# primary ---> | +# physical slot sb1_slot --->| ----> standby1 (connected via streaming replication) +# | lsub1_slot, lsub2_slot (synced_slot) +################################################## + +my $primary = $publisher; +my $backup_name = 'backup'; +$primary->backup($backup_name); + +# Create a standby +my $standby1 = PostgreSQL::Test::Cluster->new('standby1'); +$standby1->init_from_backup( + $primary, $backup_name, + has_streaming => 1, + has_restoring => 1); + +# Increase the log_min_messages setting to DEBUG2 on both the standby and +# primary to debug test failures, if any. +my $connstr_1 = $primary->connstr; +$standby1->append_conf( + 'postgresql.conf', qq( +hot_standby_feedback = on +primary_slot_name = 'sb1_slot' +primary_conninfo = '$connstr_1 dbname=postgres' +log_min_messages = 'debug2' +)); + +$primary->append_conf('postgresql.conf', "log_min_messages = 'debug2'"); +$primary->reload; + +# Drop the subscription to prevent further advancement of the restart_lsn for +# the lsub1_slot. +$subscriber1->safe_psql('postgres', "DROP SUBSCRIPTION regress_mysub1;"); + +# To ensure that restart_lsn has moved to a recent WAL position, we re-create +# the lsub1_slot. +$primary->psql('postgres', + q{SELECT pg_create_logical_replication_slot('lsub1_slot', 'pgoutput', false, false, true);} +); + +$primary->psql('postgres', + q{SELECT pg_create_logical_replication_slot('lsub2_slot', 'test_decoding', false, false, true);} +); + +$primary->psql('postgres', + q{SELECT pg_create_physical_replication_slot('sb1_slot');}); + +# Start the standby so that slot syncing can begin +$standby1->start; + +# Capture the inactive_since of the slot from the primary. Note that the slot +# will be inactive since the corresponding subscription was dropped. +my $inactive_since_on_primary = + $primary->validate_slot_inactive_since('lsub1_slot', + $slot_creation_time_on_primary); + +# Wait for the standby to catch up so that the standby is not lagging behind +# the failover slots. +$primary->wait_for_replay_catchup($standby1); + +# Synchronize the primary server slots to the standby. +$standby1->safe_psql('postgres', "SELECT pg_sync_replication_slots();"); + +# Confirm that the logical failover slots are created on the standby and are +# flagged as 'synced' +is( $standby1->safe_psql( + 'postgres', + q{SELECT count(*) = 2 FROM pg_replication_slots WHERE slot_name IN ('lsub1_slot', 'lsub2_slot') AND synced AND NOT temporary;} + ), + "t", + 'logical slots have synced as true on standby'); + +# Capture the inactive_since of the synced slot on the standby +my $inactive_since_on_standby = + $standby1->validate_slot_inactive_since('lsub1_slot', + $slot_creation_time_on_primary); + +# Synced slot on the standby must get its own inactive_since +is( $standby1->safe_psql( + 'postgres', + "SELECT '$inactive_since_on_primary'::timestamptz < '$inactive_since_on_standby'::timestamptz;" + ), + "t", + 'synchronized slot has got its own inactive_since'); + +################################################## +# Test that the synchronized slot will be dropped if the corresponding remote +# slot on the primary server has been dropped. +################################################## + +$primary->psql('postgres', "SELECT pg_drop_replication_slot('lsub2_slot');"); + +$standby1->safe_psql('postgres', "SELECT pg_sync_replication_slots();"); + +is( $standby1->safe_psql( + 'postgres', + q{SELECT count(*) = 0 FROM pg_replication_slots WHERE slot_name = 'lsub2_slot';} + ), + "t", + 'synchronized slot has been dropped'); + +################################################## +# Test that if the synchronized slot is invalidated while the remote slot is +# still valid, the slot will be dropped and re-created on the standby by +# executing pg_sync_replication_slots() again. +################################################## + +# Configure the max_slot_wal_keep_size so that the synced slot can be +# invalidated due to wal removal. +$standby1->append_conf('postgresql.conf', 'max_slot_wal_keep_size = 64kB'); +$standby1->reload; + +# Generate some activity and switch WAL file on the primary +$primary->advance_wal(1); +$primary->psql('postgres', "CHECKPOINT"); +$primary->wait_for_replay_catchup($standby1); + +# Request a checkpoint on the standby to trigger the WAL file(s) removal +$standby1->safe_psql('postgres', "CHECKPOINT"); + +# Check if the synced slot is invalidated +is( $standby1->safe_psql( + 'postgres', + q{SELECT invalidation_reason = 'wal_removed' FROM pg_replication_slots WHERE slot_name = 'lsub1_slot';} + ), + "t", + 'synchronized slot has been invalidated'); + +# Reset max_slot_wal_keep_size to avoid further wal removal +$standby1->append_conf('postgresql.conf', 'max_slot_wal_keep_size = -1'); +$standby1->reload; + +# Capture the time before the logical failover slot is created on the primary. +$slot_creation_time_on_primary = $publisher->safe_psql( + 'postgres', qq[ + SELECT current_timestamp; +]); + +# To ensure that restart_lsn has moved to a recent WAL position, we re-create +# the lsub1_slot. +$primary->safe_psql( + 'postgres', qq[ + SELECT pg_drop_replication_slot('lsub1_slot'); + SELECT pg_create_logical_replication_slot('lsub1_slot', 'pgoutput', false, false, true); +]); + +# Capture the inactive_since of the slot from the primary. Note that the slot +# will be inactive since the corresponding subscription was dropped. +$inactive_since_on_primary = + $primary->validate_slot_inactive_since('lsub1_slot', + $slot_creation_time_on_primary); + +# Wait for the standby to catch up so that the standby is not lagging behind +# the failover slots. +$primary->wait_for_replay_catchup($standby1); + +my $log_offset = -s $standby1->logfile; + +# Synchronize the primary server slots to the standby. +$standby1->safe_psql('postgres', "SELECT pg_sync_replication_slots();"); + +# Confirm that the invalidated slot has been dropped. +$standby1->wait_for_log( + qr/dropped replication slot "lsub1_slot" of database with OID [0-9]+/, $log_offset); + +# Confirm that the logical slot has been re-created on the standby and is +# flagged as 'synced' +is( $standby1->safe_psql( + 'postgres', + q{SELECT invalidation_reason IS NULL AND synced AND NOT temporary FROM pg_replication_slots WHERE slot_name = 'lsub1_slot';} + ), + "t", + 'logical slot is re-synced'); + +# Reset the log_min_messages to the default value. +$primary->append_conf('postgresql.conf', "log_min_messages = 'warning'"); +$primary->reload; + +$standby1->append_conf('postgresql.conf', "log_min_messages = 'warning'"); +$standby1->reload; + +################################################## +# Test that a synchronized slot can not be decoded, altered or dropped by the +# user +################################################## + +# Attempting to perform logical decoding on a synced slot should result in an error +($result, $stdout, $stderr) = $standby1->psql('postgres', + "select * from pg_logical_slot_get_changes('lsub1_slot', NULL, NULL);"); +ok( $stderr =~ + /ERROR: cannot use replication slot "lsub1_slot" for logical decoding/, + "logical decoding is not allowed on synced slot"); + +# Attempting to alter a synced slot should result in an error +($result, $stdout, $stderr) = $standby1->psql( + 'postgres', + qq[ALTER_REPLICATION_SLOT lsub1_slot (failover);], + replication => 'database'); +ok($stderr =~ /ERROR: cannot alter replication slot "lsub1_slot"/, + "synced slot on standby cannot be altered"); + +# Attempting to drop a synced slot should result in an error +($result, $stdout, $stderr) = $standby1->psql('postgres', + "SELECT pg_drop_replication_slot('lsub1_slot');"); +ok($stderr =~ /ERROR: cannot drop replication slot "lsub1_slot"/, + "synced slot on standby cannot be dropped"); + +################################################## +# Test that we cannot synchronize slots if dbname is not specified in the +# primary_conninfo. +################################################## + +$standby1->append_conf('postgresql.conf', "primary_conninfo = '$connstr_1'"); +$standby1->reload; + +($result, $stdout, $stderr) = + $standby1->psql('postgres', "SELECT pg_sync_replication_slots();"); +ok( $stderr =~ + /ERROR: replication slot synchronization requires "dbname" to be specified in "primary_conninfo"/, + "cannot sync slots if dbname is not specified in primary_conninfo"); + +# Add the dbname back to the primary_conninfo for further tests +$standby1->append_conf('postgresql.conf', + "primary_conninfo = '$connstr_1 dbname=postgres'"); +$standby1->reload; + +################################################## +# Test that we cannot synchronize slots to a cascading standby server. +################################################## + +# Create a cascading standby +$backup_name = 'backup2'; +$standby1->backup($backup_name); + +my $cascading_standby = PostgreSQL::Test::Cluster->new('cascading_standby'); +$cascading_standby->init_from_backup( + $standby1, $backup_name, + has_streaming => 1, + has_restoring => 1); + +my $cascading_connstr = $standby1->connstr; +$cascading_standby->append_conf( + 'postgresql.conf', qq( +hot_standby_feedback = on +primary_slot_name = 'cascading_sb_slot' +primary_conninfo = '$cascading_connstr dbname=postgres' +)); + +$standby1->psql('postgres', + q{SELECT pg_create_physical_replication_slot('cascading_sb_slot');}); + +$cascading_standby->start; + +($result, $stdout, $stderr) = + $cascading_standby->psql('postgres', "SELECT pg_sync_replication_slots();"); +ok( $stderr =~ + /ERROR: cannot synchronize replication slots from a standby server/, + "cannot sync slots to a cascading standby server"); + +$cascading_standby->stop; + +################################################## +# Create a failover slot and advance the restart_lsn to a position where a +# running transaction exists. This setup is for testing that the synced slots +# can achieve the consistent snapshot state starting from the restart_lsn +# after promotion without losing any data that otherwise would have been +# received from the primary. +################################################## + +$primary->safe_psql('postgres', + "SELECT pg_create_logical_replication_slot('snap_test_slot', 'test_decoding', false, false, true);" +); + +# Wait for the standby to catch up so that the standby is not lagging behind +# the failover slots. +$primary->wait_for_replay_catchup($standby1); + +$standby1->safe_psql('postgres', "SELECT pg_sync_replication_slots();"); + +# Two xl_running_xacts logs are generated here. When decoding the first log, it +# only serializes the snapshot, without advancing the restart_lsn to the latest +# position. This is because if a transaction is running, the restart_lsn can +# only move to a position before that transaction. Hence, the second +# xl_running_xacts log is needed, the decoding for which allows the restart_lsn +# to advance to the last serialized snapshot's position (the first log). +$primary->safe_psql( + 'postgres', qq( + BEGIN; + SELECT txid_current(); + SELECT pg_log_standby_snapshot(); + COMMIT; + BEGIN; + SELECT txid_current(); + SELECT pg_log_standby_snapshot(); + COMMIT; +)); + +# Advance the restart_lsn to the position of the first xl_running_xacts log +# generated above. Note that there might be concurrent xl_running_xacts logs +# written by the bgwriter, which could cause the position to be advanced to an +# unexpected point, but that would be a rare scenario and doesn't affect the +# test results. +$primary->safe_psql('postgres', + "SELECT pg_replication_slot_advance('snap_test_slot', pg_current_wal_lsn());" +); + +# Wait for the standby to catch up so that the standby is not lagging behind +# the failover slots. +$primary->wait_for_replay_catchup($standby1); + +# Log a message that will be consumed on the standby after promotion using the +# synced slot. See the test where we promote standby (Promote the standby1 to +# primary.) +$primary->safe_psql('postgres', + "SELECT pg_logical_emit_message(false, 'test', 'test');"); + +# Get the confirmed_flush_lsn for the logical slot snap_test_slot on the primary +my $confirmed_flush_lsn = $primary->safe_psql('postgres', + "SELECT confirmed_flush_lsn from pg_replication_slots WHERE slot_name = 'snap_test_slot';" +); + +$standby1->safe_psql('postgres', "SELECT pg_sync_replication_slots();"); + +# Verify that confirmed_flush_lsn of snap_test_slot slot is synced to the standby +ok( $standby1->poll_query_until( + 'postgres', + "SELECT '$confirmed_flush_lsn' = confirmed_flush_lsn from pg_replication_slots WHERE slot_name = 'snap_test_slot' AND synced AND NOT temporary;" + ), + 'confirmed_flush_lsn of slot snap_test_slot synced to standby'); + +################################################## +# Test to confirm that the slot synchronization is protected from malicious +# users. +################################################## + +$primary->psql('postgres', "CREATE DATABASE slotsync_test_db"); +$primary->wait_for_replay_catchup($standby1); + +$standby1->stop; + +# On the primary server, create '=' operator in another schema mapped to +# inequality function and redirect the queries to use new operator by setting +# search_path. The new '=' operator is created with leftarg as 'bigint' and +# right arg as 'int' to redirect 'count(*) = 1' in slot sync's query to use +# new '=' operator. +$primary->safe_psql( + 'slotsync_test_db', q{ + +CREATE ROLE repl_role REPLICATION LOGIN; +CREATE SCHEMA myschema; + +CREATE FUNCTION myschema.myintne(bigint, int) RETURNS bool as $$ + BEGIN + RETURN $1 <> $2; + END; + $$ LANGUAGE plpgsql immutable; + +CREATE OPERATOR myschema.= ( + leftarg = bigint, + rightarg = int, + procedure = myschema.myintne); + +ALTER DATABASE slotsync_test_db SET SEARCH_PATH TO myschema,pg_catalog; +GRANT USAGE on SCHEMA myschema TO repl_role; +}); + +# Start the standby with changed primary_conninfo. +$standby1->append_conf('postgresql.conf', + "primary_conninfo = '$connstr_1 dbname=slotsync_test_db user=repl_role'"); +$standby1->start; + +# Run the synchronization function. If the sync flow was not prepared +# to handle such attacks, it would have failed during the validation +# of the primary_slot_name itself resulting in +# ERROR: slot synchronization requires valid primary_slot_name +$standby1->safe_psql('slotsync_test_db', + "SELECT pg_sync_replication_slots();"); + +# Reset the dbname and user in primary_conninfo to the earlier values. +$standby1->append_conf('postgresql.conf', + "primary_conninfo = '$connstr_1 dbname=postgres'"); +$standby1->reload; + +# Drop the newly created database. +$primary->psql('postgres', q{DROP DATABASE slotsync_test_db;}); + +################################################## +# Test to confirm that the slot sync worker exits on invalid GUC(s) and +# get started again on valid GUC(s). +################################################## + +$log_offset = -s $standby1->logfile; + +# Enable slot sync worker. +$standby1->append_conf('postgresql.conf', qq(sync_replication_slots = on)); +$standby1->reload; + +# Confirm that the slot sync worker is able to start. +$standby1->wait_for_log(qr/slot sync worker started/, $log_offset); + +$log_offset = -s $standby1->logfile; + +# Disable another GUC required for slot sync. +$standby1->append_conf('postgresql.conf', qq(hot_standby_feedback = off)); +$standby1->reload; + +# Confirm that slot sync worker acknowledge the GUC change and logs the msg +# about wrong configuration. +$standby1->wait_for_log( + qr/slot synchronization worker will restart because of a parameter change/, + $log_offset); +$standby1->wait_for_log( + qr/slot synchronization requires "hot_standby_feedback" to be enabled/, + $log_offset); + +$log_offset = -s $standby1->logfile; + +# Re-enable the required GUC +$standby1->append_conf('postgresql.conf', "hot_standby_feedback = on"); +$standby1->reload; + +# Confirm that the slot sync worker is able to start now. +$standby1->wait_for_log(qr/slot sync worker started/, $log_offset); + +################################################## +# Test to confirm that confirmed_flush_lsn of the logical slot on the primary +# is synced to the standby via the slot sync worker. +################################################## + +# Insert data on the primary +$primary->safe_psql( + 'postgres', qq[ + CREATE TABLE tab_int (a int PRIMARY KEY); + INSERT INTO tab_int SELECT generate_series(1, 10); +]); + +# Subscribe to the new table data and wait for it to arrive +$subscriber1->safe_psql( + 'postgres', qq[ + CREATE TABLE tab_int (a int PRIMARY KEY); + CREATE SUBSCRIPTION regress_mysub1 CONNECTION '$publisher_connstr' PUBLICATION regress_mypub WITH (slot_name = lsub1_slot, failover = true, create_slot = false); +]); + +$subscriber1->wait_for_subscription_sync; + +# Do not allow any further advancement of the confirmed_flush_lsn for the +# lsub1_slot. +$subscriber1->safe_psql('postgres', + "ALTER SUBSCRIPTION regress_mysub1 DISABLE"); + +# Wait for the replication slot to become inactive on the publisher +$primary->poll_query_until( + 'postgres', + "SELECT COUNT(*) FROM pg_catalog.pg_replication_slots WHERE slot_name = 'lsub1_slot' AND active='f'", + 1); + +# Get the confirmed_flush_lsn for the logical slot lsub1_slot on the primary +my $primary_flush_lsn = $primary->safe_psql('postgres', + "SELECT confirmed_flush_lsn from pg_replication_slots WHERE slot_name = 'lsub1_slot';" +); + +# Confirm that confirmed_flush_lsn of lsub1_slot slot is synced to the standby +ok( $standby1->poll_query_until( + 'postgres', + "SELECT '$primary_flush_lsn' = confirmed_flush_lsn from pg_replication_slots WHERE slot_name = 'lsub1_slot' AND synced AND NOT temporary;" + ), + 'confirmed_flush_lsn of slot lsub1_slot synced to standby'); + +################################################## +# Test that logical failover replication slots wait for the specified +# physical replication slots to receive the changes first. It uses the +# following set up: +# +# (physical standbys) +# | ----> standby1 (primary_slot_name = sb1_slot) +# | ----> standby2 (primary_slot_name = sb2_slot) +# primary ----- | +# (logical replication) +# | ----> subscriber1 (failover = true, slot_name = lsub1_slot) +# | ----> subscriber2 (failover = false, slot_name = lsub2_slot) +# +# synchronized_standby_slots = 'sb1_slot' +# +# The setup is configured in such a way that the logical slot of subscriber1 is +# enabled for failover, and thus the subscriber1 will wait for the physical +# slot of standby1(sb1_slot) to catch up before receiving the decoded changes. +################################################## + +$backup_name = 'backup3'; + +$primary->psql('postgres', + q{SELECT pg_create_physical_replication_slot('sb2_slot');}); + +$primary->backup($backup_name); + +# Create another standby +my $standby2 = PostgreSQL::Test::Cluster->new('standby2'); +$standby2->init_from_backup( + $primary, $backup_name, + has_streaming => 1, + has_restoring => 1); +$standby2->append_conf( + 'postgresql.conf', qq( +primary_slot_name = 'sb2_slot' +)); +$standby2->start; +$primary->wait_for_replay_catchup($standby2); + +# Configure primary to disallow any logical slots that have enabled failover +# from getting ahead of the specified physical replication slot (sb1_slot). +$primary->append_conf( + 'postgresql.conf', qq( +synchronized_standby_slots = 'sb1_slot' +)); +$primary->reload; + +# Create another subscriber node without enabling failover, wait for sync to +# complete +my $subscriber2 = PostgreSQL::Test::Cluster->new('subscriber2'); +$subscriber2->init; +$subscriber2->start; +$subscriber2->safe_psql( + 'postgres', qq[ + CREATE TABLE tab_int (a int PRIMARY KEY); + CREATE SUBSCRIPTION regress_mysub2 CONNECTION '$publisher_connstr' PUBLICATION regress_mypub WITH (slot_name = lsub2_slot); +]); + +$subscriber2->wait_for_subscription_sync; + +$subscriber1->safe_psql('postgres', + "ALTER SUBSCRIPTION regress_mysub1 ENABLE"); + +my $offset = -s $primary->logfile; + +# Stop the standby associated with the specified physical replication slot +# (sb1_slot) so that the logical replication slot (lsub1_slot) won't receive +# changes until the standby comes up. +$standby1->stop; + +# Create some data on the primary +my $primary_row_count = 20; +$primary->safe_psql('postgres', + "INSERT INTO tab_int SELECT generate_series(11, $primary_row_count);"); + +# Wait until the standby2 that's still running gets the data from the primary +$primary->wait_for_replay_catchup($standby2); +$result = $standby2->safe_psql('postgres', + "SELECT count(*) = $primary_row_count FROM tab_int;"); +is($result, 't', "standby2 gets data from primary"); + +# Wait for regress_mysub2 to get the data from the primary. This subscription +# was not enabled for failover so it gets the data without waiting for any +# standbys. +$primary->wait_for_catchup('regress_mysub2'); +$result = $subscriber2->safe_psql('postgres', + "SELECT count(*) = $primary_row_count FROM tab_int;"); +is($result, 't', "subscriber2 gets data from primary"); + +# Wait until the primary server logs a warning indicating that it is waiting +# for the sb1_slot to catch up. +$primary->wait_for_log( + qr/replication slot \"sb1_slot\" specified in parameter "synchronized_standby_slots" does not have active_pid/, + $offset); + +# The regress_mysub1 was enabled for failover so it doesn't get the data from +# primary and keeps waiting for the standby specified in synchronized_standby_slots +# (sb1_slot aka standby1). +$result = + $subscriber1->safe_psql('postgres', + "SELECT count(*) <> $primary_row_count FROM tab_int;"); +is($result, 't', + "subscriber1 doesn't get data from primary until standby1 acknowledges changes" +); + +# Start the standby specified in synchronized_standby_slots (sb1_slot aka standby1) and +# wait for it to catch up with the primary. +$standby1->start; +$primary->wait_for_replay_catchup($standby1); +$result = $standby1->safe_psql('postgres', + "SELECT count(*) = $primary_row_count FROM tab_int;"); +is($result, 't', "standby1 gets data from primary"); + +# Now that the standby specified in synchronized_standby_slots is up and running, the +# primary can send the decoded changes to the subscription enabled for failover +# (i.e. regress_mysub1). While the standby was down, regress_mysub1 didn't +# receive any data from the primary. i.e. the primary didn't allow it to go +# ahead of standby. +$primary->wait_for_catchup('regress_mysub1'); +$result = $subscriber1->safe_psql('postgres', + "SELECT count(*) = $primary_row_count FROM tab_int;"); +is($result, 't', + "subscriber1 gets data from primary after standby1 acknowledges changes"); + +################################################## +# Verify that when using pg_logical_slot_get_changes to consume changes from a +# logical failover slot, it will also wait for the slots specified in +# synchronized_standby_slots to catch up. +################################################## + +# Stop the standby associated with the specified physical replication slot so +# that the logical replication slot won't receive changes until the standby +# slot's restart_lsn is advanced or the slot is removed from the +# synchronized_standby_slots list. +$primary->safe_psql('postgres', "TRUNCATE tab_int;"); +$primary->wait_for_catchup('regress_mysub1'); +$standby1->stop; + +# Disable the regress_mysub1 to prevent the logical walsender from generating +# more warnings. +$subscriber1->safe_psql('postgres', + "ALTER SUBSCRIPTION regress_mysub1 DISABLE"); + +# Wait for the replication slot to become inactive on the publisher +$primary->poll_query_until( + 'postgres', + "SELECT COUNT(*) FROM pg_catalog.pg_replication_slots WHERE slot_name = 'lsub1_slot' AND active = 'f'", + 1); + +# Create a logical 'test_decoding' replication slot with failover enabled +$primary->safe_psql('postgres', + "SELECT pg_create_logical_replication_slot('test_slot', 'test_decoding', false, false, true);" +); + +my $back_q = $primary->background_psql( + 'postgres', + on_error_stop => 0, + timeout => $PostgreSQL::Test::Utils::timeout_default); + +# pg_logical_slot_get_changes will be blocked until the standby catches up, +# hence it needs to be executed in a background session. +$offset = -s $primary->logfile; +$back_q->query_until( + qr/logical_slot_get_changes/, q( + \echo logical_slot_get_changes + SELECT pg_logical_slot_get_changes('test_slot', NULL, NULL); +)); + +# Wait until the primary server logs a warning indicating that it is waiting +# for the sb1_slot to catch up. +$primary->wait_for_log( + qr/replication slot \"sb1_slot\" specified in parameter "synchronized_standby_slots" does not have active_pid/, + $offset); + +# Remove the standby from the synchronized_standby_slots list and reload the +# configuration. +$primary->adjust_conf('postgresql.conf', 'synchronized_standby_slots', "''"); +$primary->reload; + +# Since there are no slots in synchronized_standby_slots, the function +# pg_logical_slot_get_changes should now return, and the session can be +# stopped. +$back_q->quit; + +$primary->safe_psql('postgres', + "SELECT pg_drop_replication_slot('test_slot');"); + +# Add the physical slot (sb1_slot) back to the synchronized_standby_slots for further +# tests. +$primary->adjust_conf('postgresql.conf', 'synchronized_standby_slots', + "'sb1_slot'"); +$primary->reload; + +# Enable the regress_mysub1 for further tests +$subscriber1->safe_psql('postgres', + "ALTER SUBSCRIPTION regress_mysub1 ENABLE"); + +################################################## +# Test that logical replication will wait for the user-created inactive +# physical slot to catch up until we remove the slot from synchronized_standby_slots. +################################################## + +$offset = -s $primary->logfile; + +# Create some data on the primary +$primary_row_count = 10; +$primary->safe_psql('postgres', + "INSERT INTO tab_int SELECT generate_series(1, $primary_row_count);"); + +# Wait until the primary server logs a warning indicating that it is waiting +# for the sb1_slot to catch up. +$primary->wait_for_log( + qr/replication slot \"sb1_slot\" specified in parameter "synchronized_standby_slots" does not have active_pid/, + $offset); + +# The regress_mysub1 doesn't get the data from primary because the specified +# standby slot (sb1_slot) in synchronized_standby_slots is inactive. +$result = + $subscriber1->safe_psql('postgres', "SELECT count(*) = 0 FROM tab_int;"); +is($result, 't', + "subscriber1 doesn't get data as the sb1_slot doesn't catch up"); + +# Remove the standby from the synchronized_standby_slots list and reload the +# configuration. +$primary->adjust_conf('postgresql.conf', 'synchronized_standby_slots', "''"); +$primary->reload; + +# Since there are no slots in synchronized_standby_slots, the primary server should now +# send the decoded changes to the subscription. +$primary->wait_for_catchup('regress_mysub1'); +$result = $subscriber1->safe_psql('postgres', + "SELECT count(*) = $primary_row_count FROM tab_int;"); +is($result, 't', + "subscriber1 gets data from primary after standby1 is removed from the synchronized_standby_slots list" +); + +# Add the physical slot (sb1_slot) back to the synchronized_standby_slots for further +# tests. +$primary->adjust_conf('postgresql.conf', 'synchronized_standby_slots', + "'sb1_slot'"); +$primary->reload; + +################################################## +# Promote the standby1 to primary. Confirm that: +# a) the slot 'lsub1_slot' and 'snap_test_slot' are retained on the new primary +# b) logical replication for regress_mysub1 is resumed successfully after failover +# c) changes can be consumed from the synced slot 'snap_test_slot' +################################################## +$standby1->start; +$primary->wait_for_replay_catchup($standby1); + +# Capture the time before the standby is promoted +my $promotion_time_on_primary = $standby1->safe_psql( + 'postgres', qq[ + SELECT current_timestamp; +]); + +$standby1->promote; + +# Capture the inactive_since of the synced slot after the promotion. +# The expectation here is that the slot gets its inactive_since as part of the +# promotion. We do this check before the slot is enabled on the new primary +# below, otherwise, the slot gets active setting inactive_since to NULL. +my $inactive_since_on_new_primary = + $standby1->validate_slot_inactive_since('lsub1_slot', + $promotion_time_on_primary); + +is( $standby1->safe_psql( + 'postgres', + "SELECT '$inactive_since_on_new_primary'::timestamptz > '$inactive_since_on_primary'::timestamptz" + ), + "t", + 'synchronized slot has got its own inactive_since on the new primary after promotion' +); + +# Update subscription with the new primary's connection info +my $standby1_conninfo = $standby1->connstr . ' dbname=postgres'; +$subscriber1->safe_psql('postgres', + "ALTER SUBSCRIPTION regress_mysub1 CONNECTION '$standby1_conninfo';"); + +# Confirm the synced slot 'lsub1_slot' is retained on the new primary +is( $standby1->safe_psql( + 'postgres', + q{SELECT count(*) = 2 FROM pg_replication_slots WHERE slot_name IN ('lsub1_slot', 'snap_test_slot') AND synced AND NOT temporary;} + ), + 't', + 'synced slot retained on the new primary'); + +# Insert data on the new primary +$standby1->safe_psql('postgres', + "INSERT INTO tab_int SELECT generate_series(11, 20);"); +$standby1->wait_for_catchup('regress_mysub1'); + +# Confirm that data in tab_int replicated on the subscriber +is($subscriber1->safe_psql('postgres', q{SELECT count(*) FROM tab_int;}), + "20", 'data replicated from the new primary'); + +# Consume the data from the snap_test_slot. The synced slot should reach a +# consistent point by restoring the snapshot at the restart_lsn serialized +# during slot synchronization. +$result = $standby1->safe_psql('postgres', + "SELECT count(*) FROM pg_logical_slot_get_changes('snap_test_slot', NULL, NULL) WHERE data ~ 'message*';" +); + +is($result, '1', "data can be consumed using snap_test_slot"); + +done_testing(); diff --git a/src/test/recovery/t/041_checkpoint_at_promote.pl b/src/test/recovery/t/041_checkpoint_at_promote.pl new file mode 100644 index 0000000000000..e90311ad6cb7f --- /dev/null +++ b/src/test/recovery/t/041_checkpoint_at_promote.pl @@ -0,0 +1,175 @@ + +# Copyright (c) 2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Time::HiRes qw(usleep); +use Test::More; + +################################################## +# Test race condition when a restart point is running during a promotion, +# checking that WAL segments are correctly removed in the restart point +# while the promotion finishes. +# +# This test relies on an injection point that causes the checkpointer to +# wait in the middle of a restart point on a standby. The checkpointer +# is awaken to finish its restart point only once the promotion of the +# standby is completed, and the node should be able to restart properly. +################################################## + +if ($ENV{enable_injection_points} ne 'yes') +{ + plan skip_all => 'Injection points not supported by this build'; +} + +# Initialize primary node. log_checkpoints is required as the checkpoint +# activity is monitored based on the contents of the logs. +my $node_primary = PostgreSQL::Test::Cluster->new('master'); +$node_primary->init(allows_streaming => 1); +$node_primary->append_conf( + 'postgresql.conf', q[ +log_checkpoints = on +restart_after_crash = on +]); +$node_primary->start; + +# Check if the extension injection_points is available, as it may be +# possible that this script is run with installcheck, where the module +# would not be installed by default. +my $result = $node_primary->safe_psql('postgres', + "SELECT count(*) > 0 FROM pg_available_extensions WHERE name = 'injection_points';" +); +if ($result eq 'f') +{ + plan skip_all => 'Extension injection_points not installed'; +} + +my $backup_name = 'my_backup'; +$node_primary->backup($backup_name); + +# Setup a standby. +my $node_standby = PostgreSQL::Test::Cluster->new('standby1'); +$node_standby->init_from_backup($node_primary, $backup_name, + has_streaming => 1); +$node_standby->start; + +# Dummy table for the upcoming tests. +$node_primary->safe_psql('postgres', 'checkpoint'); +$node_primary->safe_psql('postgres', 'CREATE TABLE prim_tab (a int);'); + +# Register an injection point on the standby so as the follow-up +# restart point will wait on it. +$node_primary->safe_psql('postgres', 'CREATE EXTENSION injection_points;'); +# Wait until the extension has been created on the standby +$node_primary->wait_for_replay_catchup($node_standby); + +# Note that from this point the checkpointer will wait in the middle of +# a restart point on the standby. +$node_standby->safe_psql('postgres', + "SELECT injection_points_attach('create-restart-point', 'wait');"); + +# Execute a restart point on the standby, that we will now be waiting on. +# This needs to be in the background. +my $logstart = -s $node_standby->logfile; +my $psql_session = + $node_standby->background_psql('postgres', on_error_stop => 0); +$psql_session->query_until( + qr/starting_checkpoint/, q( + \echo starting_checkpoint + CHECKPOINT; +)); + +# Switch one WAL segment to make the previous restart point remove the +# segment once the restart point completes. +$node_primary->safe_psql('postgres', 'INSERT INTO prim_tab VALUES (1);'); +$node_primary->safe_psql('postgres', 'SELECT pg_switch_wal();'); +$node_primary->wait_for_replay_catchup($node_standby); + +# Wait until the checkpointer is in the middle of the restart point +# processing. +$node_standby->wait_for_event('checkpointer', 'create-restart-point'); + +# Check the logs that the restart point has started on standby. This is +# optional, but let's be sure. +ok( $node_standby->log_contains( + "restartpoint starting: immediate wait", $logstart), + "restartpoint has started"); + +# Trigger promotion during the restart point. +$node_primary->stop; +$node_standby->promote; + +# Update the start position before waking up the checkpointer! +$logstart = -s $node_standby->logfile; + +# Now wake up the checkpointer. +$node_standby->safe_psql('postgres', + "SELECT injection_points_wakeup('create-restart-point');"); + +# Wait until the previous restart point completes on the newly-promoted +# standby, checking the logs for that. +my $checkpoint_complete = 0; +foreach my $i (0 .. 10 * $PostgreSQL::Test::Utils::timeout_default) +{ + if ($node_standby->log_contains("restartpoint complete", $logstart)) + { + $checkpoint_complete = 1; + last; + } + usleep(100_000); +} +is($checkpoint_complete, 1, 'restart point has completed'); + +# Kill with SIGKILL, forcing all the backends to restart. +my $psql_timeout = IPC::Run::timer(3600); +my ($killme_stdin, $killme_stdout, $killme_stderr) = ('', '', ''); +my $killme = IPC::Run::start( + [ + 'psql', '-XAtq', '-v', 'ON_ERROR_STOP=1', '-f', '-', '-d', + $node_standby->connstr('postgres') + ], + '<', + \$killme_stdin, + '>', + \$killme_stdout, + '2>', + \$killme_stderr, + $psql_timeout); +$killme_stdin .= q[ +SELECT pg_backend_pid(); +]; +$killme->pump until $killme_stdout =~ /[[:digit:]]+[\r\n]$/; +my $pid = $killme_stdout; +chomp($pid); +$killme_stdout = ''; +$killme_stderr = ''; + +my $ret = PostgreSQL::Test::Utils::system_log('pg_ctl', 'kill', 'KILL', $pid); +is($ret, 0, 'killed process with KILL'); + +# Wait until the server restarts, finish consuming output. +$killme_stdin .= q[ +SELECT 1; +]; +ok( pump_until( + $killme, + $psql_timeout, + \$killme_stderr, + qr/server closed the connection unexpectedly|connection to server was lost|could not send data to server/m + ), + "psql query died successfully after SIGKILL"); +$killme->finish; + +# Wait till server finishes restarting. +$node_standby->poll_query_until('postgres', undef, ''); + +# After recovery, the server should be able to start. +my $stdout; +my $stderr; +($ret, $stdout, $stderr) = $node_standby->psql('postgres', 'select 1'); +is($ret, 0, "psql connect success"); +is($stdout, 1, "psql select 1"); + +done_testing(); diff --git a/src/test/recovery/t/042_low_level_backup.pl b/src/test/recovery/t/042_low_level_backup.pl new file mode 100644 index 0000000000000..61d23187e0f90 --- /dev/null +++ b/src/test/recovery/t/042_low_level_backup.pl @@ -0,0 +1,144 @@ + +# Copyright (c) 2024, PostgreSQL Global Development Group + +# Test low-level backup method by using pg_backup_start() and pg_backup_stop() +# to create backups. + +use strict; +use warnings FATAL => 'all'; + +use File::Copy qw(copy); +use File::Path qw(rmtree); +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +# Start primary node with archiving. +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); +$node_primary->init(has_archiving => 1, allows_streaming => 1); +$node_primary->start; + +# Start backup. +my $backup_name = 'backup1'; +my $psql = $node_primary->background_psql('postgres'); + +$psql->query_safe("SET client_min_messages TO WARNING"); +$psql->set_query_timer_restart; +$psql->query_safe("select pg_backup_start('test label')"); + +# Copy files. +my $backup_dir = $node_primary->backup_dir . '/' . $backup_name; + +PostgreSQL::Test::RecursiveCopy::copypath($node_primary->data_dir, + $backup_dir); + +# Cleanup some files/paths that should not be in the backup. There is no +# attempt to handle all the exclusions done by pg_basebackup here, in part +# because these are not required, but also to keep the test simple. +# +# Also remove pg_control because it needs to be copied later. +unlink("$backup_dir/postmaster.pid") + or BAIL_OUT("unable to unlink $backup_dir/postmaster.pid"); +unlink("$backup_dir/postmaster.opts") + or BAIL_OUT("unable to unlink $backup_dir/postmaster.opts"); +unlink("$backup_dir/global/pg_control") + or BAIL_OUT("unable to unlink $backup_dir/global/pg_control"); + +rmtree("$backup_dir/pg_wal") + or BAIL_OUT("unable to unlink contents of $backup_dir/pg_wal"); +mkdir("$backup_dir/pg_wal"); + +# Create a table that will be used to verify that recovery started at the +# correct location, rather than a location recorded in the control file. +$node_primary->safe_psql('postgres', "create table canary (id int)"); + +# Advance the checkpoint location in pg_control past the location where the +# backup started. Switch WAL to make it really clear that the location is +# different and to put the checkpoint in a new WAL segment. +my $segment_name = $node_primary->safe_psql('postgres', + "select pg_walfile_name(pg_switch_wal())"); + +# Ensure that the segment just switched from is archived. The follow-up +# tests depend on its presence to begin recovery. +$node_primary->poll_query_until('postgres', + q{SELECT last_archived_wal FROM pg_stat_archiver}, + $segment_name) + or die + "Timed out while waiting for archiving of switched segment to finish"; + +$node_primary->safe_psql('postgres', "checkpoint"); + +# Copy pg_control last so it contains the new checkpoint. +copy($node_primary->data_dir . '/global/pg_control', + "$backup_dir/global/pg_control") + or BAIL_OUT("unable to copy global/pg_control"); + +# Save the name segment that will be archived by pg_backup_stop(). +# This is copied to the pg_wal directory of the node whose recovery +# is done without a backup_label. +my $stop_segment_name = $node_primary->safe_psql('postgres', + 'SELECT pg_walfile_name(pg_current_wal_lsn())'); + +# Stop backup and get backup_label, the last segment is archived. +my $backup_label = + $psql->query_safe("select labelfile from pg_backup_stop()"); + +$psql->quit; + +# Rather than writing out backup_label, try to recover the backup without +# backup_label to demonstrate that recovery will not work correctly without it, +# i.e. the canary table will be missing and the cluster will be corrupted. +# Provide only the WAL segment that recovery will think it needs. +# +# The point of this test is to explicitly demonstrate that backup_label is +# being used in a later test to get the correct recovery info. +my $node_replica = PostgreSQL::Test::Cluster->new('replica_fail'); +$node_replica->init_from_backup($node_primary, $backup_name); +$node_replica->append_conf('postgresql.conf', "archive_mode = off"); + +my $canary_query = "select count(*) from pg_class where relname = 'canary'"; + +copy( + $node_primary->archive_dir . "/$stop_segment_name", + $node_replica->data_dir . "/pg_wal/$stop_segment_name" +) or BAIL_OUT("unable to copy $stop_segment_name"); + +$node_replica->start; + +ok($node_replica->safe_psql('postgres', $canary_query) == 0, + 'canary is missing'); + +# Check log to ensure that crash recovery was used as there is no +# backup_label. +ok( $node_replica->log_contains( + 'database system was not properly shut down; automatic recovery in progress' + ), + 'verify backup recovery performed with crash recovery'); + +$node_replica->teardown_node; +$node_replica->clean_node; + +# Save backup_label into the backup directory and recover using the primary's +# archive. This time recovery will succeed and the canary table will be +# present. +open my $fh, ">>", "$backup_dir/backup_label" + or die "could not open backup_label"; +# Binary mode is required for Windows, as the backup_label parsing is not +# able to cope with CRLFs. +binmode $fh; +print $fh $backup_label; +close $fh; + +$node_replica = PostgreSQL::Test::Cluster->new('replica_success'); +$node_replica->init_from_backup($node_primary, $backup_name, + has_restoring => 1); +$node_replica->start; + +ok($node_replica->safe_psql('postgres', $canary_query) == 1, + 'canary is present'); + +# Check log to ensure that backup_label was used for recovery. +ok($node_replica->log_contains('starting backup recovery with redo LSN'), + 'verify backup recovery performed with backup_label'); + +done_testing(); diff --git a/src/test/recovery/t/043_no_contrecord_switch.pl b/src/test/recovery/t/043_no_contrecord_switch.pl new file mode 100644 index 0000000000000..a473d3e7d3e63 --- /dev/null +++ b/src/test/recovery/t/043_no_contrecord_switch.pl @@ -0,0 +1,153 @@ +# Copyright (c) 2021-2025, PostgreSQL Global Development Group + +# Tests for already-propagated WAL segments ending in incomplete WAL records. + +use strict; +use warnings; + +use File::Copy; +use PostgreSQL::Test::Cluster; +use Test::More; +use Fcntl qw(SEEK_SET); + +use integer; # causes / operator to use integer math + +# Values queried from the server +my $WAL_SEGMENT_SIZE; +my $WAL_BLOCK_SIZE; +my $TLI; + +# Build name of a WAL segment, used when filtering the contents of the server +# logs. +sub wal_segment_name +{ + my $tli = shift; + my $segment = shift; + return sprintf("%08X%08X%08X", $tli, 0, $segment); +} + +# Calculate from a LSN (in bytes) its segment number and its offset, used +# when filtering the contents of the server logs. +sub lsn_to_segment_and_offset +{ + my $lsn = shift; + return ($lsn / $WAL_SEGMENT_SIZE, $lsn % $WAL_SEGMENT_SIZE); +} + +# Get GUC value, converted to an int. +sub get_int_setting +{ + my $node = shift; + my $name = shift; + return int( + $node->safe_psql( + 'postgres', + "SELECT setting FROM pg_settings WHERE name = '$name'")); +} + +sub start_of_page +{ + my $lsn = shift; + return $lsn & ~($WAL_BLOCK_SIZE - 1); +} + +my $primary = PostgreSQL::Test::Cluster->new('primary'); +$primary->init(allows_streaming => 1, has_archiving => 1); + +# The configuration is chosen here to minimize the friction with +# concurrent WAL activity. checkpoint_timeout avoids noise with +# checkpoint activity, and autovacuum is disabled to avoid any +# WAL activity generated by it. +$primary->append_conf( + 'postgresql.conf', qq( +autovacuum = off +checkpoint_timeout = '30min' +wal_keep_size = 1GB +)); + +$primary->start; +$primary->backup('backup'); + +$primary->safe_psql('postgres', "CREATE TABLE t AS SELECT 0"); + +$WAL_SEGMENT_SIZE = get_int_setting($primary, 'wal_segment_size'); +$WAL_BLOCK_SIZE = get_int_setting($primary, 'wal_block_size'); +$TLI = $primary->safe_psql('postgres', + "SELECT timeline_id FROM pg_control_checkpoint()"); + +# Get close to the end of the current WAL page, enough to fit the +# beginning of a record that spans on two pages, generating a +# continuation record. +$primary->emit_wal(0); +my $end_lsn = + $primary->advance_wal_out_of_record_splitting_zone($WAL_BLOCK_SIZE); + +# Do some math to find the record size that will overflow the page, and +# write it. +my $overflow_size = $WAL_BLOCK_SIZE - ($end_lsn % $WAL_BLOCK_SIZE); +$end_lsn = $primary->emit_wal($overflow_size); +$primary->stop('immediate'); + +# Find the beginning of the page with the continuation record and fill +# the entire page with zero bytes to simulate broken replication. +my $start_page = start_of_page($end_lsn); +my $wal_file = $primary->write_wal($TLI, $start_page, $WAL_SEGMENT_SIZE, + "\x00" x $WAL_BLOCK_SIZE); + +# Copy the file we just "hacked" to the archives. +copy($wal_file, $primary->archive_dir); + +# Start standby nodes and make sure they replay the file "hacked" from +# the archives. +my $standby1 = PostgreSQL::Test::Cluster->new('standby1'); +$standby1->init_from_backup( + $primary, 'backup', + standby => 1, + has_restoring => 1); + +my $standby2 = PostgreSQL::Test::Cluster->new('standby2'); +$standby2->init_from_backup( + $primary, 'backup', + standby => 1, + has_restoring => 1); + +my $log_size1 = -s $standby1->logfile; +my $log_size2 = -s $standby2->logfile; + +$standby1->start; +$standby2->start; + +my ($segment, $offset) = lsn_to_segment_and_offset($start_page); +my $segment_name = wal_segment_name($TLI, $segment); +my $pattern = + qq(invalid magic number 0000 .* segment $segment_name.* offset $offset); + +# We expect both standby nodes to complain about empty page when trying to +# assemble the record that spans over two pages, so wait for these in their +# logs. +$standby1->wait_for_log($pattern, $log_size1); +$standby2->wait_for_log($pattern, $log_size2); + +# Now check the case of a promotion with a timeline jump handled at +# page boundary with a continuation record. +$standby1->promote; + +# This command forces standby2 to read a continuation record from the page +# that is filled with zero bytes. +$standby1->safe_psql('postgres', 'SELECT pg_switch_wal()'); + +# Make sure WAL moves forward. +$standby1->safe_psql('postgres', + 'INSERT INTO t SELECT * FROM generate_series(1, 1000)'); + +# Configure standby2 to stream from just promoted standby1 (it also pulls WAL +# files from the archive). It should be able to catch up. +$standby2->enable_streaming($standby1); +$standby2->reload; +$standby1->wait_for_replay_catchup($standby2); + +my $result = $standby2->safe_psql('postgres', "SELECT count(*) FROM t"); +print "standby2: $result\n"; +is($result, qq(1001), 'check streamed content on standby2'); + +done_testing(); diff --git a/src/test/recovery/t/045_archive_restartpoint.pl b/src/test/recovery/t/045_archive_restartpoint.pl new file mode 100644 index 0000000000000..b143bc4e1d4e7 --- /dev/null +++ b/src/test/recovery/t/045_archive_restartpoint.pl @@ -0,0 +1,57 @@ + +# Copyright (c) 2024-2025, PostgreSQL Global Development Group + +# Test restartpoints during archive recovery. +use strict; +use warnings; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $archive_max_mb = 320; +my $wal_segsize = 1; + +# Initialize primary node +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); +$node_primary->init( + has_archiving => 1, + allows_streaming => 1, + extra => [ '--wal-segsize' => $wal_segsize ]); +$node_primary->start; +my $backup_name = 'my_backup'; +$node_primary->backup($backup_name); + +$node_primary->safe_psql('postgres', + ('DO $$BEGIN FOR i IN 1..' . $archive_max_mb / $wal_segsize) + . ' LOOP CHECKPOINT; PERFORM pg_switch_wal(); END LOOP; END$$;'); + +# Force archiving of WAL file containing recovery target +my $until_lsn = $node_primary->lsn('write'); +$node_primary->safe_psql('postgres', "SELECT pg_switch_wal()"); +$node_primary->stop; + +# Archive recovery +my $node_restore = PostgreSQL::Test::Cluster->new('restore'); +$node_restore->init_from_backup($node_primary, $backup_name, + has_restoring => 1); +$node_restore->append_conf('postgresql.conf', + "recovery_target_lsn = '$until_lsn'"); +$node_restore->append_conf('postgresql.conf', + 'recovery_target_action = pause'); +$node_restore->append_conf('postgresql.conf', + 'max_wal_size = ' . 2 * $wal_segsize); +$node_restore->append_conf('postgresql.conf', 'log_checkpoints = on'); + +$node_restore->start; + +# Wait until restore has replayed enough data +my $caughtup_query = + "SELECT '$until_lsn'::pg_lsn <= pg_last_wal_replay_lsn()"; +$node_restore->poll_query_until('postgres', $caughtup_query) + or die "Timed out while waiting for restore to catch up"; + +$node_restore->stop; +ok(1, 'restore caught up'); + +done_testing(); diff --git a/src/test/recovery/t/cp_history_files b/src/test/recovery/t/cp_history_files index cfeea41e5b918..5832b98ef42a1 100644 --- a/src/test/recovery/t/cp_history_files +++ b/src/test/recovery/t/cp_history_files @@ -2,7 +2,7 @@ use File::Copy; use strict; -use warnings; +use warnings FATAL => 'all'; die "wrong number of arguments" if @ARGV != 2; my ($source, $target) = @ARGV; diff --git a/src/test/regress/GNUmakefile b/src/test/regress/GNUmakefile index 38c3a1f85b7e5..090e49ea55b6e 100644 --- a/src/test/regress/GNUmakefile +++ b/src/test/regress/GNUmakefile @@ -3,7 +3,7 @@ # GNUmakefile-- # Makefile for src/test/regress (the regression tests) # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/test/regress/GNUmakefile @@ -36,11 +36,11 @@ EXTRADEFS = '-DHOST_TUPLE="$(host_tuple)"' \ all: pg_regress$(X) pg_regress$(X): pg_regress.o pg_regress_main.o $(WIN32RES) | submake-libpgport - $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@ + $(CC) $(CFLAGS) $^ $(libpq_pgport) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@ # dependencies ensure that path changes propagate pg_regress.o: pg_regress.c $(top_builddir)/src/port/pg_config_paths.h -pg_regress.o: override CPPFLAGS += -I$(top_builddir)/src/port $(EXTRADEFS) +pg_regress.o: override CPPFLAGS := -I$(top_builddir)/src/port -I$(libpq_srcdir) $(EXTRADEFS) $(CPPFLAGS) # note: because of the submake dependency, this rule's action is really a no-op $(top_builddir)/src/port/pg_config_paths.h: | submake-libpgport @@ -146,7 +146,7 @@ bigcheck: all | temp-install ## Clean up ## -clean distclean maintainer-clean: clean-lib +clean distclean: clean-lib # things built by `all' target rm -f $(OBJS) refint$(DLSUFFIX) autoinc$(DLSUFFIX) rm -f pg_regress_main.o pg_regress.o pg_regress$(X) diff --git a/src/test/regress/Makefile b/src/test/regress/Makefile index 7c665ff892d3c..6409a485e8441 100644 --- a/src/test/regress/Makefile +++ b/src/test/regress/Makefile @@ -7,11 +7,6 @@ # GNU make uses a make file named "GNUmakefile" in preference to "Makefile" # if it exists. Postgres is shipped with a "GNUmakefile". - -# AIX make defaults to building *every* target of the first rule. Start with -# a single-target, empty rule to make the other targets non-default. -all: - all install clean check installcheck: @echo "You must use GNU make to use Postgres. It may be installed" @echo "on your system with the name 'gmake'." diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out index d8271da4d1fb0..9b97fcf40b54a 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -738,7 +738,7 @@ select array(select sum(x+y) s QUERY PLAN ------------------------------------------------------------------- Function Scan on pg_catalog.generate_series x - Output: (SubPlan 1) + Output: ARRAY(SubPlan 1) Function Call: generate_series(1, 3) SubPlan 1 -> Sort @@ -915,7 +915,7 @@ explain (costs off) QUERY PLAN ------------------------------------------------------------ Result - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Index Only Scan using tenk1_unique1 on tenk1 Index Cond: (unique1 IS NOT NULL) @@ -932,7 +932,7 @@ explain (costs off) QUERY PLAN --------------------------------------------------------------------- Result - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Index Only Scan Backward using tenk1_unique1 on tenk1 Index Cond: (unique1 IS NOT NULL) @@ -949,7 +949,7 @@ explain (costs off) QUERY PLAN ------------------------------------------------------------------------ Result - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Index Only Scan Backward using tenk1_unique1 on tenk1 Index Cond: ((unique1 IS NOT NULL) AND (unique1 < 42)) @@ -966,7 +966,7 @@ explain (costs off) QUERY PLAN ------------------------------------------------------------------------ Result - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Index Only Scan Backward using tenk1_unique1 on tenk1 Index Cond: ((unique1 IS NOT NULL) AND (unique1 > 42)) @@ -989,7 +989,7 @@ explain (costs off) QUERY PLAN --------------------------------------------------------------------------- Result - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Index Only Scan Backward using tenk1_unique1 on tenk1 Index Cond: ((unique1 IS NOT NULL) AND (unique1 > 42000)) @@ -1008,7 +1008,7 @@ explain (costs off) QUERY PLAN ---------------------------------------------------------------------------- Result - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Index Only Scan Backward using tenk1_thous_tenthous on tenk1 Index Cond: ((thousand = 33) AND (tenthous IS NOT NULL)) @@ -1025,7 +1025,7 @@ explain (costs off) QUERY PLAN -------------------------------------------------------------------------- Result - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Index Only Scan using tenk1_thous_tenthous on tenk1 Index Cond: ((thousand = 33) AND (tenthous IS NOT NULL)) @@ -1046,7 +1046,7 @@ explain (costs off) Seq Scan on int4_tbl SubPlan 2 -> Result - InitPlan 1 (returns $1) + InitPlan 1 -> Limit -> Index Only Scan using tenk1_unique1 on tenk1 Index Cond: ((unique1 IS NOT NULL) AND (unique1 > int4_tbl.f1)) @@ -1069,8 +1069,8 @@ explain (costs off) QUERY PLAN --------------------------------------------------------------------- HashAggregate - Group Key: $0 - InitPlan 1 (returns $0) + Group Key: (InitPlan 1).col1 + InitPlan 1 -> Limit -> Index Only Scan Backward using tenk1_unique2 on tenk1 Index Cond: (unique2 IS NOT NULL) @@ -1088,8 +1088,8 @@ explain (costs off) QUERY PLAN --------------------------------------------------------------------- Sort - Sort Key: ($0) - InitPlan 1 (returns $0) + Sort Key: ((InitPlan 1).col1) + InitPlan 1 -> Limit -> Index Only Scan Backward using tenk1_unique2 on tenk1 Index Cond: (unique2 IS NOT NULL) @@ -1107,8 +1107,8 @@ explain (costs off) QUERY PLAN --------------------------------------------------------------------- Sort - Sort Key: ($0) - InitPlan 1 (returns $0) + Sort Key: ((InitPlan 1).col1) + InitPlan 1 -> Limit -> Index Only Scan Backward using tenk1_unique2 on tenk1 Index Cond: (unique2 IS NOT NULL) @@ -1126,8 +1126,8 @@ explain (costs off) QUERY PLAN --------------------------------------------------------------------- Sort - Sort Key: (($0 + 1)) - InitPlan 1 (returns $0) + Sort Key: (((InitPlan 1).col1 + 1)) + InitPlan 1 -> Limit -> Index Only Scan Backward using tenk1_unique2 on tenk1 Index Cond: (unique2 IS NOT NULL) @@ -1146,7 +1146,7 @@ explain (costs off) --------------------------------------------------------------------- Sort Sort Key: (generate_series(1, 3)) DESC - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Index Only Scan Backward using tenk1_unique2 on tenk1 Index Cond: (unique2 IS NOT NULL) @@ -1168,7 +1168,7 @@ explain (costs off) QUERY PLAN ---------------------------------------------------- Result - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Result One-Time Filter: (100 IS NOT NULL) @@ -1199,7 +1199,7 @@ explain (costs off) QUERY PLAN --------------------------------------------------------------------------------------------- Result - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Merge Append Sort Key: minmaxtest.f1 @@ -1210,7 +1210,7 @@ explain (costs off) -> Index Only Scan Backward using minmaxtest2i on minmaxtest2 minmaxtest_3 Index Cond: (f1 IS NOT NULL) -> Index Only Scan using minmaxtest3i on minmaxtest3 minmaxtest_4 - InitPlan 2 (returns $1) + InitPlan 2 -> Limit -> Merge Append Sort Key: minmaxtest_5.f1 DESC @@ -1235,7 +1235,7 @@ explain (costs off) QUERY PLAN --------------------------------------------------------------------------------------------- Unique - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Merge Append Sort Key: minmaxtest.f1 @@ -1246,7 +1246,7 @@ explain (costs off) -> Index Only Scan Backward using minmaxtest2i on minmaxtest2 minmaxtest_3 Index Cond: (f1 IS NOT NULL) -> Index Only Scan using minmaxtest3i on minmaxtest3 minmaxtest_4 - InitPlan 2 (returns $1) + InitPlan 2 -> Limit -> Merge Append Sort Key: minmaxtest_5.f1 DESC @@ -1258,7 +1258,7 @@ explain (costs off) Index Cond: (f1 IS NOT NULL) -> Index Only Scan Backward using minmaxtest3i on minmaxtest3 minmaxtest_9 -> Sort - Sort Key: ($0), ($1) + Sort Key: ((InitPlan 1).col1), ((InitPlan 2).col1) -> Result (26 rows) @@ -1273,6 +1273,37 @@ NOTICE: drop cascades to 3 other objects DETAIL: drop cascades to table minmaxtest1 drop cascades to table minmaxtest2 drop cascades to table minmaxtest3 +-- DISTINCT can also trigger wrong answers with hash aggregation (bug #18465) +begin; +set local enable_sort = off; +explain (costs off) + select f1, (select distinct min(t1.f1) from int4_tbl t1 where t1.f1 = t0.f1) + from int4_tbl t0; + QUERY PLAN +--------------------------------------------------------------------- + Seq Scan on int4_tbl t0 + SubPlan 2 + -> HashAggregate + Group Key: (InitPlan 1).col1 + InitPlan 1 + -> Limit + -> Seq Scan on int4_tbl t1 + Filter: ((f1 IS NOT NULL) AND (f1 = t0.f1)) + -> Result +(9 rows) + +select f1, (select distinct min(t1.f1) from int4_tbl t1 where t1.f1 = t0.f1) +from int4_tbl t0; + f1 | min +-------------+------------- + 0 | 0 + 123456 | 123456 + -123456 | -123456 + 2147483647 | 2147483647 + -2147483647 | -2147483647 +(5 rows) + +rollback; -- check for correct detection of nested-aggregate errors select max(min(unique1)) from tenk1; ERROR: aggregate function calls cannot be nested @@ -1555,6 +1586,43 @@ select sum(two order by two) from tenk1; (2 rows) reset enable_presorted_aggregate; +-- +-- Test cases with FILTER clause +-- +-- Ensure we presort when the aggregate contains plain Vars +explain (costs off) +select sum(two order by two) filter (where two > 1) from tenk1; + QUERY PLAN +------------------------------- + Aggregate + -> Sort + Sort Key: two + -> Seq Scan on tenk1 +(4 rows) + +-- Ensure we presort for RelabelType'd Vars +explain (costs off) +select string_agg(distinct f1, ',') filter (where length(f1) > 1) +from varchar_tbl; + QUERY PLAN +------------------------------------- + Aggregate + -> Sort + Sort Key: f1 + -> Seq Scan on varchar_tbl +(4 rows) + +-- Ensure we don't presort when the aggregate's argument contains an +-- explicit cast. +explain (costs off) +select string_agg(distinct f1::varchar(2), ',') filter (where length(f1) > 1) +from varchar_tbl; + QUERY PLAN +------------------------------- + Aggregate + -> Seq Scan on varchar_tbl +(2 rows) + -- -- Test combinations of DISTINCT and/or ORDER BY -- @@ -1694,6 +1762,19 @@ select aggfns(distinct a,b,c order by a,c using ~<~,b) {"(0,,)","(1,3,foo)","(2,2,bar)","(3,1,baz)"} (1 row) +-- test a more complex permutation that has previous caused issues +select + string_agg(distinct 'a', ','), + sum(( + select sum(1) + from (values(1)) b(id) + where a.id = b.id +)) from unnest(array[1]) a(id); + string_agg | sum +------------+----- + a | 1 +(1 row) + -- check node I/O via view creation and usage, also deparsing logic create view agg_view1 as select aggfns(a,b,c) @@ -1917,7 +1998,7 @@ select string_agg(v, decode('ee', 'hex')) from bytea_test_table; drop table bytea_test_table; -- Test parallel string_agg and array_agg -create table pagg_test (x int, y int); +create table pagg_test (x int, y int) with (autovacuum_enabled = off); insert into pagg_test select (case x % 4 when 1 then null else x end), x % 10 from generate_series(1,5000) x; @@ -1989,8 +2070,8 @@ explain (costs off) select * from v_pagg_test order by y; -> Parallel Seq Scan on pagg_test (13 rows) -set max_parallel_workers_per_gather = 0; -- Ensure results are the same without parallel aggregation. +set max_parallel_workers_per_gather = 0; select * from v_pagg_test order by y; y | tmin | tmax | tndistinct | bmin | bmax | bndistinct | amin | amax | andistinct | aamin | aamax | aandistinct ---+------+------+------------+------+------+------------+------+------+------------+-------+-------+------------- @@ -2006,6 +2087,24 @@ select * from v_pagg_test order by y; 9 | 19 | 4999 | 250 | 1019 | 999 | 250 | 19 | 4999 | 250 | 19 | 4999 | 250 (10 rows) +-- Check that we don't fail on anonymous record types. +set max_parallel_workers_per_gather = 2; +explain (costs off) +select array_dims(array_agg(s)) from (select * from pagg_test) s; + QUERY PLAN +-------------------------------------------- + Aggregate + -> Gather + Workers Planned: 2 + -> Parallel Seq Scan on pagg_test +(4 rows) + +select array_dims(array_agg(s)) from (select * from pagg_test) s; + array_dims +------------ + [1:5000] +(1 row) + -- Clean up reset max_parallel_workers_per_gather; reset bytea_output; @@ -2715,6 +2814,239 @@ SELECT balk(hundred) FROM tenk1; (1 row) ROLLBACK; +-- GROUP BY optimization by reordering GROUP BY clauses +CREATE TABLE btg AS SELECT + i % 10 AS x, + i % 10 AS y, + 'abc' || i % 10 AS z, + i AS w +FROM generate_series(1, 100) AS i; +CREATE INDEX btg_x_y_idx ON btg(x, y); +ANALYZE btg; +SET enable_hashagg = off; +SET enable_seqscan = off; +-- Utilize the ordering of index scan to avoid a Sort operation +EXPLAIN (COSTS OFF) +SELECT count(*) FROM btg GROUP BY y, x; + QUERY PLAN +------------------------------------------------ + GroupAggregate + Group Key: x, y + -> Index Only Scan using btg_x_y_idx on btg +(3 rows) + +-- Engage incremental sort +EXPLAIN (COSTS OFF) +SELECT count(*) FROM btg GROUP BY z, y, w, x; + QUERY PLAN +------------------------------------------------- + GroupAggregate + Group Key: x, y, z, w + -> Incremental Sort + Sort Key: x, y, z, w + Presorted Key: x, y + -> Index Scan using btg_x_y_idx on btg +(6 rows) + +-- Utilize the ordering of subquery scan to avoid a Sort operation +EXPLAIN (COSTS OFF) SELECT count(*) +FROM (SELECT * FROM btg ORDER BY x, y, w, z) AS q1 +GROUP BY w, x, z, y; + QUERY PLAN +------------------------------------------------- + GroupAggregate + Group Key: btg.x, btg.y, btg.w, btg.z + -> Incremental Sort + Sort Key: btg.x, btg.y, btg.w, btg.z + Presorted Key: btg.x, btg.y + -> Index Scan using btg_x_y_idx on btg +(6 rows) + +-- Utilize the ordering of merge join to avoid a full Sort operation +SET enable_hashjoin = off; +SET enable_nestloop = off; +EXPLAIN (COSTS OFF) +SELECT count(*) + FROM btg t1 JOIN btg t2 ON t1.z = t2.z AND t1.w = t2.w AND t1.x = t2.x + GROUP BY t1.x, t1.y, t1.z, t1.w; + QUERY PLAN +------------------------------------------------------------------------------- + GroupAggregate + Group Key: t1.z, t1.w, t1.x, t1.y + -> Incremental Sort + Sort Key: t1.z, t1.w, t1.x, t1.y + Presorted Key: t1.z, t1.w, t1.x + -> Merge Join + Merge Cond: ((t1.z = t2.z) AND (t1.w = t2.w) AND (t1.x = t2.x)) + -> Sort + Sort Key: t1.z, t1.w, t1.x + -> Index Scan using btg_x_y_idx on btg t1 + -> Sort + Sort Key: t2.z, t2.w, t2.x + -> Index Scan using btg_x_y_idx on btg t2 +(13 rows) + +RESET enable_nestloop; +RESET enable_hashjoin; +-- Should work with and without GROUP-BY optimization +EXPLAIN (COSTS OFF) +SELECT count(*) FROM btg GROUP BY w, x, z, y ORDER BY y, x, z, w; + QUERY PLAN +------------------------------------------------- + GroupAggregate + Group Key: y, x, z, w + -> Sort + Sort Key: y, x, z, w + -> Index Scan using btg_x_y_idx on btg +(5 rows) + +-- Utilize incremental sort to make the ORDER BY rule a bit cheaper +EXPLAIN (COSTS OFF) +SELECT count(*) FROM btg GROUP BY w, x, y, z ORDER BY x*x, z; + QUERY PLAN +------------------------------------------------------- + Sort + Sort Key: ((x * x)), z + -> GroupAggregate + Group Key: x, y, w, z + -> Incremental Sort + Sort Key: x, y, w, z + Presorted Key: x, y + -> Index Scan using btg_x_y_idx on btg +(8 rows) + +-- Test the case where the number of incoming subtree path keys is more than +-- the number of grouping keys. +CREATE INDEX btg_y_x_w_idx ON btg(y, x, w); +EXPLAIN (VERBOSE, COSTS OFF) +SELECT y, x, array_agg(distinct w) + FROM btg WHERE y < 0 GROUP BY x, y; + QUERY PLAN +--------------------------------------------------------- + GroupAggregate + Output: y, x, array_agg(DISTINCT w) + Group Key: btg.y, btg.x + -> Index Only Scan using btg_y_x_w_idx on public.btg + Output: y, x, w + Index Cond: (btg.y < 0) +(6 rows) + +-- Ensure that we do not select the aggregate pathkeys instead of the grouping +-- pathkeys +CREATE TABLE group_agg_pk AS SELECT + i % 10 AS x, + i % 2 AS y, + i % 2 AS z, + 2 AS w, + i % 10 AS f +FROM generate_series(1,100) AS i; +ANALYZE group_agg_pk; +SET enable_nestloop = off; +SET enable_hashjoin = off; +EXPLAIN (COSTS OFF) +SELECT avg(c1.f ORDER BY c1.x, c1.y) +FROM group_agg_pk c1 JOIN group_agg_pk c2 ON c1.x = c2.x +GROUP BY c1.w, c1.z; + QUERY PLAN +----------------------------------------------------- + GroupAggregate + Group Key: c1.w, c1.z + -> Sort + Sort Key: c1.w, c1.z, c1.x, c1.y + -> Merge Join + Merge Cond: (c1.x = c2.x) + -> Sort + Sort Key: c1.x + -> Seq Scan on group_agg_pk c1 + -> Sort + Sort Key: c2.x + -> Seq Scan on group_agg_pk c2 +(12 rows) + +SELECT avg(c1.f ORDER BY c1.x, c1.y) +FROM group_agg_pk c1 JOIN group_agg_pk c2 ON c1.x = c2.x +GROUP BY c1.w, c1.z; + avg +-------------------- + 4.0000000000000000 + 5.0000000000000000 +(2 rows) + +-- Pathkeys, built in a subtree, can be used to optimize GROUP-BY clause +-- ordering. Also, here we check that it doesn't depend on the initial clause +-- order in the GROUP-BY list. +EXPLAIN (COSTS OFF) +SELECT c1.y,c1.x FROM group_agg_pk c1 + JOIN group_agg_pk c2 + ON c1.x = c2.x +GROUP BY c1.y,c1.x,c2.x; + QUERY PLAN +----------------------------------------------------- + Group + Group Key: c1.x, c1.y + -> Incremental Sort + Sort Key: c1.x, c1.y + Presorted Key: c1.x + -> Merge Join + Merge Cond: (c1.x = c2.x) + -> Sort + Sort Key: c1.x + -> Seq Scan on group_agg_pk c1 + -> Sort + Sort Key: c2.x + -> Seq Scan on group_agg_pk c2 +(13 rows) + +EXPLAIN (COSTS OFF) +SELECT c1.y,c1.x FROM group_agg_pk c1 + JOIN group_agg_pk c2 + ON c1.x = c2.x +GROUP BY c1.y,c2.x,c1.x; + QUERY PLAN +----------------------------------------------------- + Group + Group Key: c2.x, c1.y + -> Incremental Sort + Sort Key: c2.x, c1.y + Presorted Key: c2.x + -> Merge Join + Merge Cond: (c1.x = c2.x) + -> Sort + Sort Key: c1.x + -> Seq Scan on group_agg_pk c1 + -> Sort + Sort Key: c2.x + -> Seq Scan on group_agg_pk c2 +(13 rows) + +RESET enable_nestloop; +RESET enable_hashjoin; +DROP TABLE group_agg_pk; +-- Test the case where the ordering of the scan matches the ordering within the +-- aggregate but cannot be found in the group-by list +CREATE TABLE agg_sort_order (c1 int PRIMARY KEY, c2 int); +CREATE UNIQUE INDEX agg_sort_order_c2_idx ON agg_sort_order(c2); +INSERT INTO agg_sort_order SELECT i, i FROM generate_series(1,100)i; +ANALYZE agg_sort_order; +EXPLAIN (COSTS OFF) +SELECT array_agg(c1 ORDER BY c2),c2 +FROM agg_sort_order WHERE c2 < 100 GROUP BY c1 ORDER BY 2; + QUERY PLAN +---------------------------------------------------------------------------- + Sort + Sort Key: c2 + -> GroupAggregate + Group Key: c1 + -> Sort + Sort Key: c1, c2 + -> Index Scan using agg_sort_order_c2_idx on agg_sort_order + Index Cond: (c2 < 100) +(8 rows) + +DROP TABLE agg_sort_order CASCADE; +DROP TABLE btg; +RESET enable_hashagg; +RESET enable_seqscan; -- Secondly test the case of a parallel aggregate combiner function -- returning NULL. For that use normal transition function, but a -- combiner function returning NULL. diff --git a/src/test/regress/expected/alter_operator.out b/src/test/regress/expected/alter_operator.out index 71bd4842821fc..4217ba15de2e3 100644 --- a/src/test/regress/expected/alter_operator.out +++ b/src/test/regress/expected/alter_operator.out @@ -25,7 +25,7 @@ ORDER BY 1; (3 rows) -- --- Reset and set params +-- Test resetting and setting restrict and join attributes. -- ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = NONE); ALTER OPERATOR === (boolean, boolean) SET (JOIN = NONE); @@ -109,18 +109,10 @@ ORDER BY 1; -- -- Test invalid options. -- -ALTER OPERATOR === (boolean, boolean) SET (COMMUTATOR = ====); -ERROR: operator attribute "commutator" cannot be changed -ALTER OPERATOR === (boolean, boolean) SET (NEGATOR = ====); -ERROR: operator attribute "negator" cannot be changed ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = non_existent_func); ERROR: function non_existent_func(internal, oid, internal, integer) does not exist ALTER OPERATOR === (boolean, boolean) SET (JOIN = non_existent_func); ERROR: function non_existent_func(internal, oid, internal, smallint, internal) does not exist -ALTER OPERATOR === (boolean, boolean) SET (COMMUTATOR = !==); -ERROR: operator attribute "commutator" cannot be changed -ALTER OPERATOR === (boolean, boolean) SET (NEGATOR = !==); -ERROR: operator attribute "negator" cannot be changed -- invalid: non-lowercase quoted identifiers ALTER OPERATOR & (bit, bit) SET ("Restrict" = _int_contsel, "Join" = _int_contjoinsel); ERROR: operator attribute "Restrict" not recognized @@ -131,9 +123,145 @@ CREATE USER regress_alter_op_user; SET SESSION AUTHORIZATION regress_alter_op_user; ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = NONE); ERROR: must be owner of operator === --- Clean up RESET SESSION AUTHORIZATION; +-- +-- Test setting commutator, negator, merges, and hashes attributes, +-- which can only be set if not already set +-- +CREATE FUNCTION alter_op_test_fn_bool_real(boolean, real) +RETURNS boolean AS $$ SELECT NULL::BOOLEAN; $$ LANGUAGE sql IMMUTABLE; +CREATE FUNCTION alter_op_test_fn_real_bool(real, boolean) +RETURNS boolean AS $$ SELECT NULL::BOOLEAN; $$ LANGUAGE sql IMMUTABLE; +-- operator +CREATE OPERATOR === ( + LEFTARG = boolean, + RIGHTARG = real, + PROCEDURE = alter_op_test_fn_bool_real +); +-- commutator +CREATE OPERATOR ==== ( + LEFTARG = real, + RIGHTARG = boolean, + PROCEDURE = alter_op_test_fn_real_bool +); +-- negator +CREATE OPERATOR !==== ( + LEFTARG = boolean, + RIGHTARG = real, + PROCEDURE = alter_op_test_fn_bool_real +); +-- No-op setting already false hashes and merges to false works +ALTER OPERATOR === (boolean, real) SET (MERGES = false); +ALTER OPERATOR === (boolean, real) SET (HASHES = false); +-- Test setting merges and hashes +ALTER OPERATOR === (boolean, real) SET (MERGES); +ALTER OPERATOR === (boolean, real) SET (HASHES); +SELECT oprcanmerge, oprcanhash +FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'real'::regtype; + oprcanmerge | oprcanhash +-------------+------------ + t | t +(1 row) + +-- Test setting commutator +ALTER OPERATOR === (boolean, real) SET (COMMUTATOR = ====); +-- Check that oprcom has been set on both the operator and commutator, +-- that they reference each other, and that the operator used is the existing +-- one we created and not a new shell operator. +SELECT op.oprname AS operator_name, com.oprname AS commutator_name, + com.oprcode AS commutator_func + FROM pg_operator op + INNER JOIN pg_operator com ON (op.oid = com.oprcom AND op.oprcom = com.oid) + WHERE op.oprname = '===' + AND op.oprleft = 'boolean'::regtype AND op.oprright = 'real'::regtype; + operator_name | commutator_name | commutator_func +---------------+-----------------+---------------------------- + === | ==== | alter_op_test_fn_real_bool +(1 row) + +-- Cannot set self as negator +ALTER OPERATOR === (boolean, real) SET (NEGATOR = ===); +ERROR: operator cannot be its own negator +-- Test setting negator +ALTER OPERATOR === (boolean, real) SET (NEGATOR = !====); +-- Check that oprnegate has been set on both the operator and negator, +-- that they reference each other, and that the operator used is the existing +-- one we created and not a new shell operator. +SELECT op.oprname AS operator_name, neg.oprname AS negator_name, + neg.oprcode AS negator_func + FROM pg_operator op + INNER JOIN pg_operator neg ON (op.oid = neg.oprnegate AND op.oprnegate = neg.oid) + WHERE op.oprname = '===' + AND op.oprleft = 'boolean'::regtype AND op.oprright = 'real'::regtype; + operator_name | negator_name | negator_func +---------------+--------------+---------------------------- + === | !==== | alter_op_test_fn_bool_real +(1 row) + +-- Test that no-op set succeeds +ALTER OPERATOR === (boolean, real) SET (NEGATOR = !====); +ALTER OPERATOR === (boolean, real) SET (COMMUTATOR = ====); +ALTER OPERATOR === (boolean, real) SET (MERGES); +ALTER OPERATOR === (boolean, real) SET (HASHES); +-- Check that the final state of the operator is as we expect +SELECT oprcanmerge, oprcanhash, + pg_describe_object('pg_operator'::regclass, oprcom, 0) AS commutator, + pg_describe_object('pg_operator'::regclass, oprnegate, 0) AS negator + FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'real'::regtype; + oprcanmerge | oprcanhash | commutator | negator +-------------+------------+-----------------------------+------------------------------ + t | t | operator ====(real,boolean) | operator !====(boolean,real) +(1 row) + +-- Cannot change commutator, negator, merges, and hashes when already set +CREATE OPERATOR @= ( + LEFTARG = real, + RIGHTARG = boolean, + PROCEDURE = alter_op_test_fn_real_bool +); +CREATE OPERATOR @!= ( + LEFTARG = boolean, + RIGHTARG = real, + PROCEDURE = alter_op_test_fn_bool_real +); +ALTER OPERATOR === (boolean, real) SET (COMMUTATOR = @=); +ERROR: operator attribute "commutator" cannot be changed if it has already been set +ALTER OPERATOR === (boolean, real) SET (NEGATOR = @!=); +ERROR: operator attribute "negator" cannot be changed if it has already been set +ALTER OPERATOR === (boolean, real) SET (MERGES = false); +ERROR: operator attribute "merges" cannot be changed if it has already been set +ALTER OPERATOR === (boolean, real) SET (HASHES = false); +ERROR: operator attribute "hashes" cannot be changed if it has already been set +-- Cannot set an operator that already has a commutator as the commutator +ALTER OPERATOR @=(real, boolean) SET (COMMUTATOR = ===); +ERROR: commutator operator === is already the commutator of operator ==== +-- Cannot set an operator that already has a negator as the negator +ALTER OPERATOR @!=(boolean, real) SET (NEGATOR = ===); +ERROR: negator operator === is already the negator of operator !==== +-- Check no changes made +SELECT oprcanmerge, oprcanhash, + pg_describe_object('pg_operator'::regclass, oprcom, 0) AS commutator, + pg_describe_object('pg_operator'::regclass, oprnegate, 0) AS negator + FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'real'::regtype; + oprcanmerge | oprcanhash | commutator | negator +-------------+------------+-----------------------------+------------------------------ + t | t | operator ====(real,boolean) | operator !====(boolean,real) +(1 row) + +-- +-- Clean up +-- DROP USER regress_alter_op_user; DROP OPERATOR === (boolean, boolean); +DROP OPERATOR === (boolean, real); +DROP OPERATOR ==== (real, boolean); +DROP OPERATOR !==== (boolean, real); +DROP OPERATOR @= (real, boolean); +DROP OPERATOR @!= (boolean, real); DROP FUNCTION customcontsel(internal, oid, internal, integer); DROP FUNCTION alter_op_test_fn(boolean, boolean); +DROP FUNCTION alter_op_test_fn_bool_real(boolean, real); +DROP FUNCTION alter_op_test_fn_real_bool(real, boolean); diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 3b708c7976bf5..6de74a26a95f2 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -1118,10 +1118,32 @@ ERROR: relation "non_existent" does not exist -- test checking for null values and primary key create table atacc1 (test int not null); alter table atacc1 add constraint "atacc1_pkey" primary key (test); +\d atacc1 + Table "public.atacc1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + test | integer | | not null | +Indexes: + "atacc1_pkey" PRIMARY KEY, btree (test) + alter table atacc1 alter column test drop not null; ERROR: column "test" is in a primary key +\d atacc1 + Table "public.atacc1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + test | integer | | not null | +Indexes: + "atacc1_pkey" PRIMARY KEY, btree (test) + alter table atacc1 drop constraint "atacc1_pkey"; alter table atacc1 alter column test drop not null; +\d atacc1 + Table "public.atacc1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + test | integer | | | + insert into atacc1 values (null); alter table atacc1 alter test set not null; ERROR: column "test" of relation "atacc1" contains null values @@ -2193,7 +2215,6 @@ select conname, obj_description(oid, 'pg_constraint') as desc (3 rows) alter table at_partitioned alter column name type varchar(127); --- Note: these tests currently show the wrong behavior for comments :-( select relname, c.oid = oldoid as orig_oid, case relfilenode @@ -2210,9 +2231,9 @@ select relname, ------------------------------+----------+---------+-------------- at_partitioned | t | none | at_partitioned_0 | t | own | - at_partitioned_0_id_name_key | f | own | parent index + at_partitioned_0_id_name_key | f | own | at_partitioned_1 | t | own | - at_partitioned_1_id_name_key | f | own | parent index + at_partitioned_1_id_name_key | f | own | at_partitioned_id_name_key | f | none | parent index (6 rows) @@ -3834,16 +3855,27 @@ Referenced by: TABLE "ataddindex" CONSTRAINT "ataddindex_ref_id_fkey" FOREIGN KEY (ref_id) REFERENCES ataddindex(id) DROP TABLE ataddindex; --- unsupported constraint types for partitioned tables +CREATE TABLE atnotnull1 (); +ALTER TABLE atnotnull1 + ADD COLUMN a INT, + ALTER a SET NOT NULL; +ALTER TABLE atnotnull1 + ADD COLUMN c INT, + ADD PRIMARY KEY (c); +\d+ atnotnull1 + Table "public.atnotnull1" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + a | integer | | not null | | plain | | + c | integer | | not null | | plain | | +Indexes: + "atnotnull1_pkey" PRIMARY KEY, btree (c) + +-- cannot drop column that is part of the partition key CREATE TABLE partitioned ( a int, b int ) PARTITION BY RANGE (a, (a+b+1)); -ALTER TABLE partitioned ADD EXCLUDE USING gist (a WITH &&); -ERROR: exclusion constraints are not supported on partitioned tables -LINE 1: ALTER TABLE partitioned ADD EXCLUDE USING gist (a WITH &&); - ^ --- cannot drop column that is part of the partition key ALTER TABLE partitioned DROP COLUMN a; ERROR: cannot drop column "a" because it is part of the partition key of relation "partitioned" ALTER TABLE partitioned ALTER COLUMN a TYPE char(5); @@ -3855,7 +3887,7 @@ ERROR: cannot alter column "b" because it is part of the partition key of relat -- specifying storage parameters for partitioned tables is not supported ALTER TABLE partitioned SET (fillfactor=100); ERROR: cannot specify storage parameters for a partitioned table -HINT: Specify storage parameters for its leaf partitions, instead. +HINT: Specify storage parameters for its leaf partitions instead. -- partitioned table cannot participate in regular inheritance CREATE TABLE nonpartitioned ( a int, @@ -3917,8 +3949,16 @@ ALTER TABLE list_parted ATTACH PARTITION child FOR VALUES IN (1); ERROR: cannot attach inheritance child as partition ALTER TABLE list_parted ATTACH PARTITION parent FOR VALUES IN (1); ERROR: cannot attach inheritance parent as partition +DROP TABLE child; +-- now it should work, with a little tweak +ALTER TABLE parent ADD CONSTRAINT check_a CHECK (a > 0); +ALTER TABLE list_parted ATTACH PARTITION parent FOR VALUES IN (1); +-- test insert/update, per bug #18550 +INSERT INTO parent VALUES (1); +UPDATE parent SET a = 2 WHERE a = 1; +ERROR: new row for relation "parent" violates partition constraint +DETAIL: Failing row contains (2, null). DROP TABLE parent CASCADE; -NOTICE: drop cascades to table child -- check any TEMP-ness CREATE TEMP TABLE temp_parted (a int) PARTITION BY LIST (a); CREATE TABLE perm_part (a int); @@ -4185,7 +4225,7 @@ CREATE TABLE quuux2 PARTITION OF quuux FOR VALUES IN (2); DROP TABLE quuux; -- check validation when attaching hash partitions -- Use hand-rolled hash functions and operator class to get predictable result --- on different machines. part_test_int4_ops is defined in insert.sql. +-- on different machines. part_test_int4_ops is defined in test_setup.sql. -- check that the new partition won't overlap with an existing partition CREATE TABLE hash_parted ( a int, diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out index 7064391468840..44fa7b214c71a 100644 --- a/src/test/regress/expected/arrays.out +++ b/src/test/regress/expected/arrays.out @@ -1418,6 +1418,27 @@ insert into arr_pk_tbl(pk, f1[1:2]) values (1, '{6,7,8}') on conflict (pk) -- then you didn't get an indexscan plan, and something is busted. reset enable_seqscan; reset enable_bitmapscan; +-- test subscript overflow detection +-- The normal error message includes a platform-dependent limit, +-- so suppress it to avoid needing multiple expected-files. +\set VERBOSITY sqlstate +insert into arr_pk_tbl values(10, '[-2147483648:-2147483647]={1,2}'); +update arr_pk_tbl set f1[2147483647] = 42 where pk = 10; +ERROR: 54000 +update arr_pk_tbl set f1[2147483646:2147483647] = array[4,2] where pk = 10; +ERROR: 54000 +insert into arr_pk_tbl(pk, f1[0:2147483647]) values (2, '{}'); +ERROR: 54000 +insert into arr_pk_tbl(pk, f1[-2147483648:2147483647]) values (2, '{}'); +ERROR: 54000 +-- also exercise the expanded-array case +do $$ declare a int[]; +begin + a := '[-2147483648:-2147483647]={1,2}'::int[]; + a[2147483647] := 42; +end $$; +ERROR: 54000 +\set VERBOSITY default -- test [not] (like|ilike) (any|all) (...) select 'foo' like any (array['%a', '%o']); -- t ?column? @@ -1475,21 +1496,36 @@ select '{{1,{2}},{2,3}}'::text[]; ERROR: malformed array literal: "{{1,{2}},{2,3}}" LINE 1: select '{{1,{2}},{2,3}}'::text[]; ^ -DETAIL: Unexpected "{" character. -select '{{},{}}'::text[]; -ERROR: malformed array literal: "{{},{}}" -LINE 1: select '{{},{}}'::text[]; - ^ -DETAIL: Unexpected "}" character. +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. select E'{{1,2},\\{2,3}}'::text[]; ERROR: malformed array literal: "{{1,2},\{2,3}}" LINE 1: select E'{{1,2},\\{2,3}}'::text[]; ^ -DETAIL: Unexpected "\" character. +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +select '{"a"b}'::text[]; +ERROR: malformed array literal: "{"a"b}" +LINE 1: select '{"a"b}'::text[]; + ^ +DETAIL: Incorrectly quoted array element. +select '{a"b"}'::text[]; +ERROR: malformed array literal: "{a"b"}" +LINE 1: select '{a"b"}'::text[]; + ^ +DETAIL: Incorrectly quoted array element. +select '{"a""b"}'::text[]; +ERROR: malformed array literal: "{"a""b"}" +LINE 1: select '{"a""b"}'::text[]; + ^ +DETAIL: Incorrectly quoted array element. select '{{"1 2" x},{3}}'::text[]; ERROR: malformed array literal: "{{"1 2" x},{3}}" LINE 1: select '{{"1 2" x},{3}}'::text[]; ^ +DETAIL: Incorrectly quoted array element. +select '{{"1 2"} x,{3}}'::text[]; +ERROR: malformed array literal: "{{"1 2"} x,{3}}" +LINE 1: select '{{"1 2"} x,{3}}'::text[]; + ^ DETAIL: Unexpected array element. select '{}}'::text[]; ERROR: malformed array literal: "{}}" @@ -1501,11 +1537,116 @@ ERROR: malformed array literal: "{ }}" LINE 1: select '{ }}'::text[]; ^ DETAIL: Junk after closing right brace. +select '}{'::text[]; +ERROR: malformed array literal: "}{" +LINE 1: select '}{'::text[]; + ^ +DETAIL: Array value must start with "{" or dimension information. +select '{foo{}}'::text[]; +ERROR: malformed array literal: "{foo{}}" +LINE 1: select '{foo{}}'::text[]; + ^ +DETAIL: Unexpected "{" character. +select '{"foo"{}}'::text[]; +ERROR: malformed array literal: "{"foo"{}}" +LINE 1: select '{"foo"{}}'::text[]; + ^ +DETAIL: Unexpected "{" character. +select '{foo,,bar}'::text[]; +ERROR: malformed array literal: "{foo,,bar}" +LINE 1: select '{foo,,bar}'::text[]; + ^ +DETAIL: Unexpected "," character. +select '{{1},{{2}}}'::text[]; +ERROR: malformed array literal: "{{1},{{2}}}" +LINE 1: select '{{1},{{2}}}'::text[]; + ^ +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +select '{{{1}},{2}}'::text[]; +ERROR: malformed array literal: "{{{1}},{2}}" +LINE 1: select '{{{1}},{2}}'::text[]; + ^ +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +select '{{},{{}}}'::text[]; +ERROR: malformed array literal: "{{},{{}}}" +LINE 1: select '{{},{{}}}'::text[]; + ^ +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +select '{{{}},{}}'::text[]; +ERROR: malformed array literal: "{{{}},{}}" +LINE 1: select '{{{}},{}}'::text[]; + ^ +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +select '{{1},{}}'::text[]; +ERROR: malformed array literal: "{{1},{}}" +LINE 1: select '{{1},{}}'::text[]; + ^ +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +select '{{},{1}}'::text[]; +ERROR: malformed array literal: "{{},{1}}" +LINE 1: select '{{},{1}}'::text[]; + ^ +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +select '[1:0]={}'::int[]; +ERROR: upper bound cannot be less than lower bound +LINE 1: select '[1:0]={}'::int[]; + ^ +select '[2147483646:2147483647]={1,2}'::int[]; +ERROR: array upper bound is too large: 2147483647 +LINE 1: select '[2147483646:2147483647]={1,2}'::int[]; + ^ +select '[1:-1]={}'::int[]; +ERROR: upper bound cannot be less than lower bound +LINE 1: select '[1:-1]={}'::int[]; + ^ +select '[2]={1}'::int[]; +ERROR: malformed array literal: "[2]={1}" +LINE 1: select '[2]={1}'::int[]; + ^ +DETAIL: Specified array dimensions do not match array contents. +select '[1:]={1}'::int[]; +ERROR: malformed array literal: "[1:]={1}" +LINE 1: select '[1:]={1}'::int[]; + ^ +DETAIL: Missing array dimension value. +select '[:1]={1}'::int[]; +ERROR: malformed array literal: "[:1]={1}" +LINE 1: select '[:1]={1}'::int[]; + ^ +DETAIL: "[" must introduce explicitly-specified array dimensions. select array[]; ERROR: cannot determine type of empty array LINE 1: select array[]; ^ HINT: Explicitly cast to the desired type, for example ARRAY[]::integer[]. +select '{{1,},{1},}'::text[]; +ERROR: malformed array literal: "{{1,},{1},}" +LINE 1: select '{{1,},{1},}'::text[]; + ^ +DETAIL: Unexpected "}" character. +select '{{1,},{1}}'::text[]; +ERROR: malformed array literal: "{{1,},{1}}" +LINE 1: select '{{1,},{1}}'::text[]; + ^ +DETAIL: Unexpected "}" character. +select '{{1,}}'::text[]; +ERROR: malformed array literal: "{{1,}}" +LINE 1: select '{{1,}}'::text[]; + ^ +DETAIL: Unexpected "}" character. +select '{1,}'::text[]; +ERROR: malformed array literal: "{1,}" +LINE 1: select '{1,}'::text[]; + ^ +DETAIL: Unexpected "}" character. +select '[21474836488:21474836489]={1,2}'::int[]; +ERROR: array bound is out of integer range +LINE 1: select '[21474836488:21474836489]={1,2}'::int[]; + ^ +select '[-2147483649:-2147483648]={1,2}'::int[]; +ERROR: array bound is out of integer range +LINE 1: select '[-2147483649:-2147483648]={1,2}'::int[]; + ^ -- none of the above should be accepted -- all of the following should be accepted select '{}'::text[]; @@ -1514,12 +1655,30 @@ select '{}'::text[]; {} (1 row) +select '{{},{}}'::text[]; + text +------ + {} +(1 row) + select '{{{1,2,3,4},{2,3,4,5}},{{3,4,5,6},{4,5,6,7}}}'::text[]; text ----------------------------------------------- {{{1,2,3,4},{2,3,4,5}},{{3,4,5,6},{4,5,6,7}}} (1 row) +select '{null,n\ull,"null"}'::text[]; + text +---------------------- + {NULL,"null","null"} +(1 row) + +select '{ ab\c , "ab\"c" }'::text[]; + text +--------------- + {abc,"ab\"c"} +(1 row) + select '{0 second ,0 second}'::interval[]; interval --------------- @@ -1553,12 +1712,30 @@ select array[]::text[]; {} (1 row) +select '[2]={1,7}'::int[]; + int4 +------- + {1,7} +(1 row) + select '[0:1]={1.1,2.2}'::float8[]; float8 ----------------- [0:1]={1.1,2.2} (1 row) +select '[2147483646:2147483646]={1}'::int[]; + int4 +----------------------------- + [2147483646:2147483646]={1} +(1 row) + +select '[-2147483648:-2147483647]={1,2}'::int[]; + int4 +--------------------------------- + [-2147483648:-2147483647]={1,2} +(1 row) + -- all of the above should be accepted -- tests for array aggregates CREATE TEMP TABLE arraggtest ( f1 INT[], f2 TEXT[][], f3 FLOAT[]); @@ -2280,6 +2457,132 @@ select array(select array['Hello', i::text] from generate_series(9,11) i); {{Hello,9},{Hello,10},{Hello,11}} (1 row) +-- int2vector and oidvector should be treated as scalar types for this purpose +select pg_typeof(array(select '11 22 33'::int2vector from generate_series(1,5))); + pg_typeof +-------------- + int2vector[] +(1 row) + +select array(select '11 22 33'::int2vector from generate_series(1,5)); + array +---------------------------------------------------------- + {"11 22 33","11 22 33","11 22 33","11 22 33","11 22 33"} +(1 row) + +select unnest(array(select '11 22 33'::int2vector from generate_series(1,5))); + unnest +---------- + 11 22 33 + 11 22 33 + 11 22 33 + 11 22 33 + 11 22 33 +(5 rows) + +select pg_typeof(array(select '11 22 33'::oidvector from generate_series(1,5))); + pg_typeof +------------- + oidvector[] +(1 row) + +select array(select '11 22 33'::oidvector from generate_series(1,5)); + array +---------------------------------------------------------- + {"11 22 33","11 22 33","11 22 33","11 22 33","11 22 33"} +(1 row) + +select unnest(array(select '11 22 33'::oidvector from generate_series(1,5))); + unnest +---------- + 11 22 33 + 11 22 33 + 11 22 33 + 11 22 33 + 11 22 33 +(5 rows) + +-- array[] should do the same +select pg_typeof(array['11 22 33'::int2vector]); + pg_typeof +-------------- + int2vector[] +(1 row) + +select array['11 22 33'::int2vector]; + array +-------------- + {"11 22 33"} +(1 row) + +select pg_typeof(unnest(array['11 22 33'::int2vector])); + pg_typeof +------------ + int2vector +(1 row) + +select unnest(array['11 22 33'::int2vector]); + unnest +---------- + 11 22 33 +(1 row) + +select pg_typeof(unnest('11 22 33'::int2vector)); + pg_typeof +----------- + smallint + smallint + smallint +(3 rows) + +select unnest('11 22 33'::int2vector); + unnest +-------- + 11 + 22 + 33 +(3 rows) + +select pg_typeof(array['11 22 33'::oidvector]); + pg_typeof +------------- + oidvector[] +(1 row) + +select array['11 22 33'::oidvector]; + array +-------------- + {"11 22 33"} +(1 row) + +select pg_typeof(unnest(array['11 22 33'::oidvector])); + pg_typeof +----------- + oidvector +(1 row) + +select unnest(array['11 22 33'::oidvector]); + unnest +---------- + 11 22 33 +(1 row) + +select pg_typeof(unnest('11 22 33'::oidvector)); + pg_typeof +----------- + oid + oid + oid +(3 rows) + +select unnest('11 22 33'::oidvector); + unnest +-------- + 11 + 22 + 33 +(3 rows) + -- Insert/update on a column that is array of composite create temp table t1 (f1 int8_tbl[]); insert into t1 (f1[5].q1) values(42); diff --git a/src/test/regress/expected/bit.out b/src/test/regress/expected/bit.out index 98c2655039658..6a436288bb15f 100644 --- a/src/test/regress/expected/bit.out +++ b/src/test/regress/expected/bit.out @@ -40,6 +40,23 @@ SELECT * FROM VARBIT_TABLE; 01010101010 (4 rows) +-- Literals with syntax errors +SELECT b' 0'; +ERROR: " " is not a valid binary digit +LINE 1: SELECT b' 0'; + ^ +SELECT b'0 '; +ERROR: " " is not a valid binary digit +LINE 1: SELECT b'0 '; + ^ +SELECT x' 0'; +ERROR: " " is not a valid hexadecimal digit +LINE 1: SELECT x' 0'; + ^ +SELECT x'0 '; +ERROR: " " is not a valid hexadecimal digit +LINE 1: SELECT x'0 '; + ^ -- Concatenation SELECT v, b, (v || b) AS concat FROM BIT_TABLE, VARBIT_TABLE @@ -723,6 +740,30 @@ SELECT bit_count(B'1111111111'::bit(10)); 10 (1 row) +SELECT bit_count(repeat('0', 100)::bit(100)); + bit_count +----------- + 0 +(1 row) + +SELECT bit_count(repeat('1', 100)::bit(100)); + bit_count +----------- + 100 +(1 row) + +SELECT bit_count(repeat('01', 500)::bit(1000)); + bit_count +----------- + 500 +(1 row) + +SELECT bit_count(repeat('10101', 200)::bit(1000)); + bit_count +----------- + 600 +(1 row) + -- This table is intentionally left around to exercise pg_dump/pg_upgrade CREATE TABLE bit_defaults( b1 bit(4) DEFAULT '1001', diff --git a/src/test/regress/expected/boolean.out b/src/test/regress/expected/boolean.out index ee9c244bf8e2f..0e99eb7ffc001 100644 --- a/src/test/regress/expected/boolean.out +++ b/src/test/regress/expected/boolean.out @@ -486,7 +486,7 @@ FROM booltbl3 ORDER BY o; -- Test to make sure short-circuiting and NULL handling is -- correct. Use a table as source to prevent constant simplification --- to interfer. +-- from interfering. CREATE TABLE booltbl4(isfalse bool, istrue bool, isnul bool); INSERT INTO booltbl4 VALUES (false, true, null); \pset null '(null)' @@ -566,6 +566,25 @@ SELECT isnul OR istrue OR isfalse FROM booltbl4; t (1 row) +-- Casts +SELECT 0::boolean; + bool +------ + f +(1 row) + +SELECT 1::boolean; + bool +------ + t +(1 row) + +SELECT 2::boolean; + bool +------ + t +(1 row) + -- -- Clean up -- Many tables are retained by the regression test, but these do not seem diff --git a/src/test/regress/expected/brin.out b/src/test/regress/expected/brin.out index f0b7de5bf76ba..d6779d8c7d21a 100644 --- a/src/test/regress/expected/brin.out +++ b/src/test/regress/expected/brin.out @@ -572,3 +572,10 @@ CREATE UNLOGGED TABLE brintest_unlogged (n numrange); CREATE INDEX brinidx_unlogged ON brintest_unlogged USING brin (n); INSERT INTO brintest_unlogged VALUES (numrange(0, 2^1000::numeric)); DROP TABLE brintest_unlogged; +-- test that the insert optimization works if no rows end up inserted +CREATE TABLE brin_insert_optimization (a int); +INSERT INTO brin_insert_optimization VALUES (1); +CREATE INDEX brin_insert_optimization_idx ON brin_insert_optimization USING brin (a); +UPDATE brin_insert_optimization SET a = a; +REINDEX INDEX CONCURRENTLY brin_insert_optimization_idx; +DROP TABLE brin_insert_optimization; diff --git a/src/test/regress/expected/brin_multi.out b/src/test/regress/expected/brin_multi.out index 861a06ef8ca6d..ae9ce9d8ecfe2 100644 --- a/src/test/regress/expected/brin_multi.out +++ b/src/test/regress/expected/brin_multi.out @@ -466,3 +466,509 @@ EXPLAIN (COSTS OFF) SELECT * FROM brin_test_multi WHERE b = 1; Filter: (b = 1) (2 rows) +-- do some inequality tests +CREATE TABLE brin_test_multi_1 (a INT, b BIGINT) WITH (fillfactor=10); +INSERT INTO brin_test_multi_1 +SELECT i/5 + mod(911 * i + 483, 25), + i/10 + mod(751 * i + 221, 41) + FROM generate_series(1,1000) s(i); +CREATE INDEX brin_test_multi_1_idx_1 ON brin_test_multi_1 USING brin (a int4_minmax_multi_ops) WITH (pages_per_range=5); +CREATE INDEX brin_test_multi_1_idx_2 ON brin_test_multi_1 USING brin (b int8_minmax_multi_ops) WITH (pages_per_range=5); +SET enable_seqscan=off; +-- int: less than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a < 37; + count +------- + 124 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a < 113; + count +------- + 504 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a <= 177; + count +------- + 829 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a <= 25; + count +------- + 69 +(1 row) + +-- int: greater than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a > 120; + count +------- + 456 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a >= 180; + count +------- + 161 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a > 71; + count +------- + 701 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a >= 63; + count +------- + 746 +(1 row) + +-- int: equals +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a = 207; + count +------- + 3 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a = 177; + count +------- + 5 +(1 row) + +-- bigint: less than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b < 73; + count +------- + 529 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b <= 47; + count +------- + 279 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b < 199; + count +------- + 1000 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b <= 150; + count +------- + 1000 +(1 row) + +-- bigint: greater than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 93; + count +------- + 261 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 37; + count +------- + 821 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b >= 215; + count +------- + 0 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 201; + count +------- + 0 +(1 row) + +-- bigint: equals +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b = 88; + count +------- + 10 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b = 103; + count +------- + 9 +(1 row) + +-- now do the same, but insert the rows with the indexes already created +-- so that we don't use the "build callback" and instead use the regular +-- approach of adding rows into existing ranges +TRUNCATE brin_test_multi_1; +INSERT INTO brin_test_multi_1 +SELECT i/5 + mod(911 * i + 483, 25), + i/10 + mod(751 * i + 221, 41) + FROM generate_series(1,1000) s(i); +-- int: less than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a < 37; + count +------- + 124 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a < 113; + count +------- + 504 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a <= 177; + count +------- + 829 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a <= 25; + count +------- + 69 +(1 row) + +-- int: greater than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a > 120; + count +------- + 456 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a >= 180; + count +------- + 161 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a > 71; + count +------- + 701 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a >= 63; + count +------- + 746 +(1 row) + +-- int: equals +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a = 207; + count +------- + 3 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a = 177; + count +------- + 5 +(1 row) + +-- bigint: less than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b < 73; + count +------- + 529 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b <= 47; + count +------- + 279 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b < 199; + count +------- + 1000 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b <= 150; + count +------- + 1000 +(1 row) + +-- bigint: greater than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 93; + count +------- + 261 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 37; + count +------- + 821 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b >= 215; + count +------- + 0 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 201; + count +------- + 0 +(1 row) + +-- bigint: equals +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b = 88; + count +------- + 10 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b = 103; + count +------- + 9 +(1 row) + +DROP TABLE brin_test_multi_1; +RESET enable_seqscan; +-- do some inequality tests for varlena data types +CREATE TABLE brin_test_multi_2 (a UUID) WITH (fillfactor=10); +INSERT INTO brin_test_multi_2 +SELECT v::uuid FROM (SELECT row_number() OVER (ORDER BY v) c, v FROM (SELECT fipshash((i/13)::text) AS v FROM generate_series(1,1000) s(i)) foo) bar ORDER BY c + 25 * random(); +CREATE INDEX brin_test_multi_2_idx ON brin_test_multi_2 USING brin (a uuid_minmax_multi_ops) WITH (pages_per_range=5); +SET enable_seqscan=off; +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a < '3d914f93-48c9-cc0f-f8a7-9716700b9fcd'; + count +------- + 195 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a > '3d914f93-48c9-cc0f-f8a7-9716700b9fcd'; + count +------- + 792 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a <= 'f369cb89-fc62-7e66-8987-007d121ed1ea'; + count +------- + 961 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a >= 'aea92132-c4cb-eb26-3e6a-c2bf6c183b5d'; + count +------- + 273 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = '5feceb66-ffc8-6f38-d952-786c6d696c79'; + count +------- + 12 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = '86e50149-6586-6131-2a9e-0b35558d84f6'; + count +------- + 13 +(1 row) + +-- now do the same, but insert the rows with the indexes already created +-- so that we don't use the "build callback" and instead use the regular +-- approach of adding rows into existing ranges +TRUNCATE brin_test_multi_2; +INSERT INTO brin_test_multi_2 +SELECT v::uuid FROM (SELECT row_number() OVER (ORDER BY v) c, v FROM (SELECT fipshash((i/13)::text) AS v FROM generate_series(1,1000) s(i)) foo) bar ORDER BY c + 25 * random(); +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a < '3d914f93-48c9-cc0f-f8a7-9716700b9fcd'; + count +------- + 195 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a > '3d914f93-48c9-cc0f-f8a7-9716700b9fcd'; + count +------- + 792 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a <= 'f369cb89-fc62-7e66-8987-007d121ed1ea'; + count +------- + 961 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a >= 'aea92132-c4cb-eb26-3e6a-c2bf6c183b5d'; + count +------- + 273 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = '5feceb66-ffc8-6f38-d952-786c6d696c79'; + count +------- + 12 +(1 row) + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = '86e50149-6586-6131-2a9e-0b35558d84f6'; + count +------- + 13 +(1 row) + +DROP TABLE brin_test_multi_2; +RESET enable_seqscan; +-- test overflows during CREATE INDEX with extreme timestamp values +CREATE TABLE brin_timestamp_test(a TIMESTAMPTZ); +SET datestyle TO iso; +-- values close to timestamp minimum +INSERT INTO brin_timestamp_test +SELECT '4713-01-01 00:00:01 BC'::timestamptz + (i || ' seconds')::interval + FROM generate_series(1,30) s(i); +-- values close to timestamp maximum +INSERT INTO brin_timestamp_test +SELECT '294276-12-01 00:00:01'::timestamptz + (i || ' seconds')::interval + FROM generate_series(1,30) s(i); +CREATE INDEX ON brin_timestamp_test USING brin (a timestamptz_minmax_multi_ops) WITH (pages_per_range=1); +DROP TABLE brin_timestamp_test; +-- test overflows during CREATE INDEX with extreme date values +CREATE TABLE brin_date_test(a DATE); +-- insert values close to date minimum +INSERT INTO brin_date_test SELECT '4713-01-01 BC'::date + i FROM generate_series(1, 30) s(i); +-- insert values close to date minimum +INSERT INTO brin_date_test SELECT '5874897-12-01'::date + i FROM generate_series(1, 30) s(i); +CREATE INDEX ON brin_date_test USING brin (a date_minmax_multi_ops) WITH (pages_per_range=1); +SET enable_seqscan = off; +-- make sure the ranges were built correctly and 2023-01-01 eliminates all +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_date_test WHERE a = '2023-01-01'::date; + QUERY PLAN +------------------------------------------------------------------------- + Bitmap Heap Scan on brin_date_test (actual rows=0 loops=1) + Recheck Cond: (a = '2023-01-01'::date) + -> Bitmap Index Scan on brin_date_test_a_idx (actual rows=0 loops=1) + Index Cond: (a = '2023-01-01'::date) +(4 rows) + +DROP TABLE brin_date_test; +RESET enable_seqscan; +-- test handling of infinite timestamp values +CREATE TABLE brin_timestamp_test(a TIMESTAMP); +INSERT INTO brin_timestamp_test VALUES ('-infinity'), ('infinity'); +INSERT INTO brin_timestamp_test +SELECT i FROM generate_series('2000-01-01'::timestamp, '2000-02-09'::timestamp, '1 day'::interval) s(i); +CREATE INDEX ON brin_timestamp_test USING brin (a timestamp_minmax_multi_ops) WITH (pages_per_range=1); +SET enable_seqscan = off; +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_timestamp_test WHERE a = '2023-01-01'::timestamp; + QUERY PLAN +------------------------------------------------------------------------------ + Bitmap Heap Scan on brin_timestamp_test (actual rows=0 loops=1) + Recheck Cond: (a = '2023-01-01 00:00:00'::timestamp without time zone) + -> Bitmap Index Scan on brin_timestamp_test_a_idx (actual rows=0 loops=1) + Index Cond: (a = '2023-01-01 00:00:00'::timestamp without time zone) +(4 rows) + +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_timestamp_test WHERE a = '1900-01-01'::timestamp; + QUERY PLAN +------------------------------------------------------------------------------ + Bitmap Heap Scan on brin_timestamp_test (actual rows=0 loops=1) + Recheck Cond: (a = '1900-01-01 00:00:00'::timestamp without time zone) + -> Bitmap Index Scan on brin_timestamp_test_a_idx (actual rows=0 loops=1) + Index Cond: (a = '1900-01-01 00:00:00'::timestamp without time zone) +(4 rows) + +DROP TABLE brin_timestamp_test; +RESET enable_seqscan; +-- test handling of infinite date values +CREATE TABLE brin_date_test(a DATE); +INSERT INTO brin_date_test VALUES ('-infinity'), ('infinity'); +INSERT INTO brin_date_test SELECT '2000-01-01'::date + i FROM generate_series(1, 40) s(i); +CREATE INDEX ON brin_date_test USING brin (a date_minmax_multi_ops) WITH (pages_per_range=1); +SET enable_seqscan = off; +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_date_test WHERE a = '2023-01-01'::date; + QUERY PLAN +------------------------------------------------------------------------- + Bitmap Heap Scan on brin_date_test (actual rows=0 loops=1) + Recheck Cond: (a = '2023-01-01'::date) + -> Bitmap Index Scan on brin_date_test_a_idx (actual rows=0 loops=1) + Index Cond: (a = '2023-01-01'::date) +(4 rows) + +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_date_test WHERE a = '1900-01-01'::date; + QUERY PLAN +------------------------------------------------------------------------- + Bitmap Heap Scan on brin_date_test (actual rows=0 loops=1) + Recheck Cond: (a = '1900-01-01'::date) + -> Bitmap Index Scan on brin_date_test_a_idx (actual rows=0 loops=1) + Index Cond: (a = '1900-01-01'::date) +(4 rows) + +DROP TABLE brin_date_test; +RESET enable_seqscan; +RESET datestyle; +-- test handling of overflow for interval values +CREATE TABLE brin_interval_test(a INTERVAL); +INSERT INTO brin_interval_test SELECT (i || ' years')::interval FROM generate_series(-178000000, -177999980) s(i); +INSERT INTO brin_interval_test SELECT (i || ' years')::interval FROM generate_series( 177999980, 178000000) s(i); +CREATE INDEX ON brin_interval_test USING brin (a interval_minmax_multi_ops) WITH (pages_per_range=1); +SET enable_seqscan = off; +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_interval_test WHERE a = '-30 years'::interval; + QUERY PLAN +----------------------------------------------------------------------------- + Bitmap Heap Scan on brin_interval_test (actual rows=0 loops=1) + Recheck Cond: (a = '@ 30 years ago'::interval) + -> Bitmap Index Scan on brin_interval_test_a_idx (actual rows=0 loops=1) + Index Cond: (a = '@ 30 years ago'::interval) +(4 rows) + +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_interval_test WHERE a = '30 years'::interval; + QUERY PLAN +----------------------------------------------------------------------------- + Bitmap Heap Scan on brin_interval_test (actual rows=0 loops=1) + Recheck Cond: (a = '@ 30 years'::interval) + -> Bitmap Index Scan on brin_interval_test_a_idx (actual rows=0 loops=1) + Index Cond: (a = '@ 30 years'::interval) +(4 rows) + +DROP TABLE brin_interval_test; +RESET enable_seqscan; +-- test handling of infinite interval values +CREATE TABLE brin_interval_test(a INTERVAL); +INSERT INTO brin_interval_test VALUES ('-infinity'), ('infinity'); +INSERT INTO brin_interval_test SELECT (i || ' days')::interval FROM generate_series(100, 140) s(i); +CREATE INDEX ON brin_interval_test USING brin (a interval_minmax_multi_ops) WITH (pages_per_range=1); +SET enable_seqscan = off; +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_interval_test WHERE a = '-30 years'::interval; + QUERY PLAN +----------------------------------------------------------------------------- + Bitmap Heap Scan on brin_interval_test (actual rows=0 loops=1) + Recheck Cond: (a = '@ 30 years ago'::interval) + -> Bitmap Index Scan on brin_interval_test_a_idx (actual rows=0 loops=1) + Index Cond: (a = '@ 30 years ago'::interval) +(4 rows) + +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_interval_test WHERE a = '30 years'::interval; + QUERY PLAN +----------------------------------------------------------------------------- + Bitmap Heap Scan on brin_interval_test (actual rows=0 loops=1) + Recheck Cond: (a = '@ 30 years'::interval) + -> Bitmap Index Scan on brin_interval_test_a_idx (actual rows=0 loops=1) + Index Cond: (a = '@ 30 years'::interval) +(4 rows) + +DROP TABLE brin_interval_test; +RESET enable_seqscan; +RESET datestyle; diff --git a/src/test/regress/expected/btree_index.out b/src/test/regress/expected/btree_index.out index 93ed5e8cc00ea..510646cbce71b 100644 --- a/src/test/regress/expected/btree_index.out +++ b/src/test/regress/expected/btree_index.out @@ -142,6 +142,105 @@ SELECT b.* 4500 | 2080851358 (1 row) +-- +-- Add coverage for optimization of backwards scan index descents +-- +-- Here we expect _bt_search to descend straight to a leaf page containing a +-- non-pivot tuple with the value '47', which comes last (after 11 similar +-- non-pivot tuples). Query execution should only need to visit a single +-- leaf page here. +-- +-- Test case relies on tenk1_hundred index having a leaf page whose high key +-- is '(48, -inf)'. We use a low cardinality index to make our test case less +-- sensitive to implementation details that may change in the future. +set enable_seqscan to false; +set enable_indexscan to true; +set enable_bitmapscan to false; +explain (costs off) +select hundred, twenty from tenk1 where hundred < 48 order by hundred desc limit 1; + QUERY PLAN +-------------------------------------------------------- + Limit + -> Index Scan Backward using tenk1_hundred on tenk1 + Index Cond: (hundred < 48) +(3 rows) + +select hundred, twenty from tenk1 where hundred < 48 order by hundred desc limit 1; + hundred | twenty +---------+-------- + 47 | 7 +(1 row) + +-- This variant of the query need only return a single tuple located to the immediate +-- right of the '(48, -inf)' high key. It also only needs to scan one single +-- leaf page (the right sibling of the page scanned by the last test case): +explain (costs off) +select hundred, twenty from tenk1 where hundred <= 48 order by hundred desc limit 1; + QUERY PLAN +-------------------------------------------------------- + Limit + -> Index Scan Backward using tenk1_hundred on tenk1 + Index Cond: (hundred <= 48) +(3 rows) + +select hundred, twenty from tenk1 where hundred <= 48 order by hundred desc limit 1; + hundred | twenty +---------+-------- + 48 | 8 +(1 row) + +-- +-- Add coverage for ScalarArrayOp btree quals with pivot tuple constants +-- +explain (costs off) +select distinct hundred from tenk1 where hundred in (47, 48, 72, 82); + QUERY PLAN +------------------------------------------------------------------ + Unique + -> Index Only Scan using tenk1_hundred on tenk1 + Index Cond: (hundred = ANY ('{47,48,72,82}'::integer[])) +(3 rows) + +select distinct hundred from tenk1 where hundred in (47, 48, 72, 82); + hundred +--------- + 47 + 48 + 72 + 82 +(4 rows) + +explain (costs off) +select distinct hundred from tenk1 where hundred in (47, 48, 72, 82) order by hundred desc; + QUERY PLAN +------------------------------------------------------------------ + Unique + -> Index Only Scan Backward using tenk1_hundred on tenk1 + Index Cond: (hundred = ANY ('{47,48,72,82}'::integer[])) +(3 rows) + +select distinct hundred from tenk1 where hundred in (47, 48, 72, 82) order by hundred desc; + hundred +--------- + 82 + 72 + 48 + 47 +(4 rows) + +explain (costs off) +select thousand from tenk1 where thousand in (364, 366,380) and tenthous = 200000; + QUERY PLAN +--------------------------------------------------------------------------------------- + Index Only Scan using tenk1_thous_tenthous on tenk1 + Index Cond: ((thousand = ANY ('{364,366,380}'::integer[])) AND (tenthous = 200000)) +(2 rows) + +select thousand from tenk1 where thousand in (364, 366,380) and tenthous = 200000; + thousand +---------- +(0 rows) + -- -- Check correct optimization of LIKE (special index operator support) -- for both indexscan and bitmapscan cases diff --git a/src/test/regress/expected/case.out b/src/test/regress/expected/case.out index f5136c17abbf0..efee7fc43173b 100644 --- a/src/test/regress/expected/case.out +++ b/src/test/regress/expected/case.out @@ -397,6 +397,14 @@ SELECT CASE make_ad(1,2) right (1 row) +-- While we're here, also test handling of a NULLIF arg that is a read/write +-- object (bug #18722) +SELECT NULLIF(make_ad(1,2), array[2,3]::arrdomain); + nullif +-------- + {1,2} +(1 row) + ROLLBACK; -- Test interaction of CASE with ArrayCoerceExpr (bug #15471) BEGIN; diff --git a/src/test/regress/expected/collate.icu.utf8.out b/src/test/regress/expected/collate.icu.utf8.out index 78a9cb38fa35d..7a425afe1f5c7 100644 --- a/src/test/regress/expected/collate.icu.utf8.out +++ b/src/test/regress/expected/collate.icu.utf8.out @@ -1024,7 +1024,7 @@ SET icu_validation_level = disabled; do $$ BEGIN EXECUTE 'CREATE COLLATION test0 (provider = icu, locale = ' || - quote_literal((SELECT CASE WHEN datlocprovider='i' THEN daticulocale ELSE datcollate END FROM pg_database WHERE datname = current_database())) || ');'; + quote_literal((SELECT CASE WHEN datlocprovider='i' THEN datlocale ELSE datcollate END FROM pg_database WHERE datname = current_database())) || ');'; END $$; CREATE COLLATION test0 FROM "C"; -- fail, duplicate name @@ -1032,7 +1032,7 @@ ERROR: collation "test0" already exists do $$ BEGIN EXECUTE 'CREATE COLLATION test1 (provider = icu, locale = ' || - quote_literal((SELECT CASE WHEN datlocprovider='i' THEN daticulocale ELSE datcollate END FROM pg_database WHERE datname = current_database())) || ');'; + quote_literal((SELECT CASE WHEN datlocprovider='i' THEN datlocale ELSE datcollate END FROM pg_database WHERE datname = current_database())) || ');'; END $$; RESET icu_validation_level; @@ -1042,7 +1042,7 @@ ERROR: parameter "locale" must be specified SET icu_validation_level = ERROR; CREATE COLLATION testx (provider = icu, locale = 'nonsense-nowhere'); -- fails ERROR: ICU locale "nonsense-nowhere" has unknown language "nonsense" -HINT: To disable ICU locale validation, set parameter icu_validation_level to DISABLED. +HINT: To disable ICU locale validation, set the parameter "icu_validation_level" to "disabled". CREATE COLLATION testx (provider = icu, locale = '@colStrength=primary;nonsense=yes'); -- fails ERROR: could not convert locale name "@colStrength=primary;nonsense=yes" to language tag: U_ILLEGAL_ARGUMENT_ERROR RESET icu_validation_level; @@ -1050,7 +1050,7 @@ CREATE COLLATION testx (provider = icu, locale = '@colStrength=primary;nonsense= WARNING: could not convert locale name "@colStrength=primary;nonsense=yes" to language tag: U_ILLEGAL_ARGUMENT_ERROR CREATE COLLATION testx (provider = icu, locale = 'nonsense-nowhere'); DROP COLLATION testx; WARNING: ICU locale "nonsense-nowhere" has unknown language "nonsense" -HINT: To disable ICU locale validation, set parameter icu_validation_level to DISABLED. +HINT: To disable ICU locale validation, set the parameter "icu_validation_level" to "disabled". CREATE COLLATION test4 FROM nonsense; ERROR: collation "nonsense" for encoding "UTF8" does not exist CREATE COLLATION test5 FROM test0; @@ -1396,6 +1396,7 @@ SELECT x FROM test3cs WHERE x ~ 'a'; abc (1 row) +SET enable_hashagg TO off; SELECT x FROM test1cs UNION SELECT x FROM test2cs ORDER BY x; x ----- @@ -1448,6 +1449,7 @@ SELECT DISTINCT x FROM test3cs ORDER BY x; ghi (4 rows) +RESET enable_hashagg; SELECT count(DISTINCT x) FROM test3cs; count ------- @@ -2050,6 +2052,214 @@ SELECT (SELECT count(*) FROM test33_0) <> (SELECT count(*) FROM test33_1); t (1 row) +-- +-- Bug #18568 +-- +-- Partitionwise aggregate (full or partial) should not be used when a +-- partition key's collation doesn't match that of the GROUP BY column it is +-- matched with. +SET max_parallel_workers_per_gather TO 0; +SET enable_incremental_sort TO off; +CREATE TABLE pagg_tab3 (a text, c text collate case_insensitive) PARTITION BY LIST(c collate "C"); +CREATE TABLE pagg_tab3_p1 PARTITION OF pagg_tab3 FOR VALUES IN ('a', 'b'); +CREATE TABLE pagg_tab3_p2 PARTITION OF pagg_tab3 FOR VALUES IN ('B', 'A'); +INSERT INTO pagg_tab3 SELECT i % 4 + 1, substr('abAB', (i % 4) + 1 , 1) FROM generate_series(0, 19) i; +ANALYZE pagg_tab3; +SET enable_partitionwise_aggregate TO false; +EXPLAIN (COSTS OFF) +SELECT upper(c collate case_insensitive), count(c) FROM pagg_tab3 GROUP BY c collate case_insensitive ORDER BY 1; + QUERY PLAN +----------------------------------------------------------- + Sort + Sort Key: (upper(pagg_tab3.c)) COLLATE case_insensitive + -> HashAggregate + Group Key: pagg_tab3.c + -> Append + -> Seq Scan on pagg_tab3_p2 pagg_tab3_1 + -> Seq Scan on pagg_tab3_p1 pagg_tab3_2 +(7 rows) + +SELECT upper(c collate case_insensitive), count(c) FROM pagg_tab3 GROUP BY c collate case_insensitive ORDER BY 1; + upper | count +-------+------- + A | 10 + B | 10 +(2 rows) + +-- No "full" partitionwise aggregation allowed, though "partial" is allowed. +SET enable_partitionwise_aggregate TO true; +EXPLAIN (COSTS OFF) +SELECT upper(c collate case_insensitive), count(c) FROM pagg_tab3 GROUP BY c collate case_insensitive ORDER BY 1; + QUERY PLAN +-------------------------------------------------------------- + Sort + Sort Key: (upper(pagg_tab3.c)) COLLATE case_insensitive + -> Finalize HashAggregate + Group Key: pagg_tab3.c + -> Append + -> Partial HashAggregate + Group Key: pagg_tab3.c + -> Seq Scan on pagg_tab3_p2 pagg_tab3 + -> Partial HashAggregate + Group Key: pagg_tab3_1.c + -> Seq Scan on pagg_tab3_p1 pagg_tab3_1 +(11 rows) + +SELECT upper(c collate case_insensitive), count(c) FROM pagg_tab3 GROUP BY c collate case_insensitive ORDER BY 1; + upper | count +-------+------- + A | 10 + B | 10 +(2 rows) + +-- OK to use full partitionwise aggregate after changing the GROUP BY column's +-- collation to be the same as that of the partition key. +EXPLAIN (COSTS OFF) +SELECT c collate "C", count(c) FROM pagg_tab3 GROUP BY c collate "C" ORDER BY 1; + QUERY PLAN +-------------------------------------------------------- + Sort + Sort Key: ((pagg_tab3.c)::text) COLLATE "C" + -> Append + -> HashAggregate + Group Key: (pagg_tab3.c)::text + -> Seq Scan on pagg_tab3_p2 pagg_tab3 + -> HashAggregate + Group Key: (pagg_tab3_1.c)::text + -> Seq Scan on pagg_tab3_p1 pagg_tab3_1 +(9 rows) + +SELECT c collate "C", count(c) FROM pagg_tab3 GROUP BY c collate "C" ORDER BY 1; + c | count +---+------- + A | 5 + B | 5 + a | 5 + b | 5 +(4 rows) + +-- Partitionwise join should not be allowed too when the collation used by the +-- join keys doesn't match the partition key collation. +SET enable_partitionwise_join TO false; +EXPLAIN (COSTS OFF) +SELECT t1.c, count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c GROUP BY 1 ORDER BY t1.c COLLATE "C"; + QUERY PLAN +------------------------------------------------------------- + Sort + Sort Key: t1.c COLLATE "C" + -> HashAggregate + Group Key: t1.c + -> Hash Join + Hash Cond: (t1.c = t2.c) + -> Append + -> Seq Scan on pagg_tab3_p2 t1_1 + -> Seq Scan on pagg_tab3_p1 t1_2 + -> Hash + -> Append + -> Seq Scan on pagg_tab3_p2 t2_1 + -> Seq Scan on pagg_tab3_p1 t2_2 +(13 rows) + +SELECT t1.c, count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c GROUP BY 1 ORDER BY t1.c COLLATE "C"; + c | count +---+------- + A | 100 + B | 100 +(2 rows) + +SET enable_partitionwise_join TO true; +EXPLAIN (COSTS OFF) +SELECT t1.c, count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c GROUP BY 1 ORDER BY t1.c COLLATE "C"; + QUERY PLAN +------------------------------------------------------------- + Sort + Sort Key: t1.c COLLATE "C" + -> HashAggregate + Group Key: t1.c + -> Hash Join + Hash Cond: (t1.c = t2.c) + -> Append + -> Seq Scan on pagg_tab3_p2 t1_1 + -> Seq Scan on pagg_tab3_p1 t1_2 + -> Hash + -> Append + -> Seq Scan on pagg_tab3_p2 t2_1 + -> Seq Scan on pagg_tab3_p1 t2_2 +(13 rows) + +SELECT t1.c, count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c GROUP BY 1 ORDER BY t1.c COLLATE "C"; + c | count +---+------- + A | 100 + B | 100 +(2 rows) + +-- OK when the join clause uses the same collation as the partition key. +EXPLAIN (COSTS OFF) +SELECT t1.c COLLATE "C", count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c COLLATE "C" GROUP BY t1.c COLLATE "C" ORDER BY t1.c COLLATE "C"; + QUERY PLAN +------------------------------------------------------------------ + Sort + Sort Key: ((t1.c)::text) COLLATE "C" + -> Append + -> HashAggregate + Group Key: (t1.c)::text + -> Hash Join + Hash Cond: ((t1.c)::text = (t2.c)::text) + -> Seq Scan on pagg_tab3_p2 t1 + -> Hash + -> Seq Scan on pagg_tab3_p2 t2 + -> HashAggregate + Group Key: (t1_1.c)::text + -> Hash Join + Hash Cond: ((t1_1.c)::text = (t2_1.c)::text) + -> Seq Scan on pagg_tab3_p1 t1_1 + -> Hash + -> Seq Scan on pagg_tab3_p1 t2_1 +(17 rows) + +SELECT t1.c COLLATE "C", count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c COLLATE "C" GROUP BY t1.c COLLATE "C" ORDER BY t1.c COLLATE "C"; + c | count +---+------- + A | 25 + B | 25 + a | 25 + b | 25 +(4 rows) + +SET enable_partitionwise_join TO false; +EXPLAIN (COSTS OFF) +SELECT t1.c COLLATE "C", count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c COLLATE "C" GROUP BY t1.c COLLATE "C" ORDER BY t1.c COLLATE "C"; + QUERY PLAN +------------------------------------------------------------- + Sort + Sort Key: ((t1.c)::text) COLLATE "C" + -> HashAggregate + Group Key: (t1.c)::text + -> Hash Join + Hash Cond: ((t1.c)::text = (t2.c)::text) + -> Append + -> Seq Scan on pagg_tab3_p2 t1_1 + -> Seq Scan on pagg_tab3_p1 t1_2 + -> Hash + -> Append + -> Seq Scan on pagg_tab3_p2 t2_1 + -> Seq Scan on pagg_tab3_p1 t2_2 +(13 rows) + +SELECT t1.c COLLATE "C", count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c COLLATE "C" GROUP BY t1.c COLLATE "C" ORDER BY t1.c COLLATE "C"; + c | count +---+------- + A | 25 + B | 25 + a | 25 + b | 25 +(4 rows) + +DROP TABLE pagg_tab3; +RESET enable_partitionwise_aggregate; +RESET max_parallel_workers_per_gather; +RESET enable_incremental_sort; -- cleanup RESET search_path; SET client_min_messages TO warning; diff --git a/src/test/regress/expected/collate.out b/src/test/regress/expected/collate.out index 06495644852e1..593a622637666 100644 --- a/src/test/regress/expected/collate.out +++ b/src/test/regress/expected/collate.out @@ -650,6 +650,22 @@ EXPLAIN (COSTS OFF) (3 rows) -- CREATE/DROP COLLATION +CREATE COLLATION builtin_c ( PROVIDER = builtin, LOCALE = "C" ); +SELECT b FROM collate_test1 ORDER BY b COLLATE builtin_c; + b +----- + ABD + Abc + abc + bbc +(4 rows) + +CREATE COLLATION builtin2 ( PROVIDER = builtin ); -- fails +ERROR: parameter "locale" must be specified +CREATE COLLATION builtin2 ( PROVIDER = builtin, LOCALE = "en_US" ); -- fails +ERROR: invalid locale name "en_US" for builtin provider +CREATE COLLATION builtin2 ( PROVIDER = builtin, LC_CTYPE = "C", LC_COLLATE = "C" ); -- fails +ERROR: parameter "locale" must be specified CREATE COLLATION mycoll1 FROM "C"; CREATE COLLATION mycoll2 ( LC_COLLATE = "POSIX", LC_CTYPE = "POSIX" ); CREATE COLLATION mycoll3 FROM "default"; -- intentionally unsupported @@ -754,7 +770,7 @@ DETAIL: FROM cannot be specified together with any other options. -- must get rid of them. -- DROP SCHEMA collate_tests CASCADE; -NOTICE: drop cascades to 19 other objects +NOTICE: drop cascades to 20 other objects DETAIL: drop cascades to table collate_test1 drop cascades to table collate_test_like drop cascades to table collate_test2 @@ -771,6 +787,7 @@ drop cascades to function dup(anyelement) drop cascades to table collate_test20 drop cascades to table collate_test21 drop cascades to table collate_test22 +drop cascades to collation builtin_c drop cascades to collation mycoll2 drop cascades to table collate_test23 drop cascades to view collate_on_int diff --git a/src/test/regress/expected/collate.utf8.out b/src/test/regress/expected/collate.utf8.out new file mode 100644 index 0000000000000..eff0ef21ac5b1 --- /dev/null +++ b/src/test/regress/expected/collate.utf8.out @@ -0,0 +1,136 @@ +/* + * This test is for collations and character operations when using the + * builtin provider with the C.UTF-8 locale. + */ +/* skip test if not UTF8 server encoding */ +SELECT getdatabaseencoding() <> 'UTF8' AS skip_test \gset +\if :skip_test +\quit +\endif +SET client_encoding TO UTF8; +-- +-- Test PG_C_UTF8 +-- +CREATE COLLATION regress_pg_c_utf8 ( + provider = builtin, locale = 'C_UTF8'); -- fails +ERROR: invalid locale name "C_UTF8" for builtin provider +CREATE COLLATION regress_pg_c_utf8 ( + provider = builtin, locale = 'C.UTF8'); +DROP COLLATION regress_pg_c_utf8; +CREATE COLLATION regress_pg_c_utf8 ( + provider = builtin, locale = 'C.UTF-8'); +CREATE TABLE test_pg_c_utf8 ( + t TEXT COLLATE PG_C_UTF8 +); +INSERT INTO test_pg_c_utf8 VALUES + ('abc DEF 123abc'), + ('ábc sßs ßss DÉF'), + ('Ç„xxÇ„ džxxÇ… Ç…xxdž'), + ('ȺȺȺ'), + ('ⱥⱥⱥ'), + ('ⱥȺ'); +SELECT + t, lower(t), initcap(t), upper(t), + length(convert_to(t, 'UTF8')) AS t_bytes, + length(convert_to(lower(t), 'UTF8')) AS lower_t_bytes, + length(convert_to(initcap(t), 'UTF8')) AS initcap_t_bytes, + length(convert_to(upper(t), 'UTF8')) AS upper_t_bytes + FROM test_pg_c_utf8; + t | lower | initcap | upper | t_bytes | lower_t_bytes | initcap_t_bytes | upper_t_bytes +-----------------+-----------------+-----------------+-----------------+---------+---------------+-----------------+--------------- + abc DEF 123abc | abc def 123abc | Abc Def 123abc | ABC DEF 123ABC | 14 | 14 | 14 | 14 + ábc sßs ßss DÉF | ábc sßs ßss déf | Ãbc Sßs ßss Déf | ÃBC SßS ßSS DÉF | 19 | 19 | 19 | 19 + Ç„xxÇ„ džxxÇ… Ç…xxdž | džxxdž džxxdž džxxdž | Ç„xxdž Ç„xxdž Ç„xxdž | Ç„XXÇ„ Ç„XXÇ„ Ç„XXÇ„ | 20 | 20 | 20 | 20 + ȺȺȺ | ⱥⱥⱥ | Ⱥⱥⱥ | ȺȺȺ | 6 | 9 | 8 | 6 + ⱥⱥⱥ | ⱥⱥⱥ | Ⱥⱥⱥ | ȺȺȺ | 9 | 9 | 8 | 6 + ⱥȺ | ⱥⱥ | Ⱥⱥ | ȺȺ | 5 | 6 | 5 | 4 +(6 rows) + +DROP TABLE test_pg_c_utf8; +-- negative test: Final_Sigma not used for builtin locale C.UTF-8 +SELECT lower('ΑΣ' COLLATE PG_C_UTF8); + lower +------- + ασ +(1 row) + +SELECT lower('ΑͺΣͺ' COLLATE PG_C_UTF8); + lower +------- + αͺσͺ +(1 row) + +SELECT lower('Α΄Σ΄' COLLATE PG_C_UTF8); + lower +------- + α΄σ΄ +(1 row) + +-- properties +SELECT 'xyz' ~ '[[:alnum:]]' COLLATE PG_C_UTF8; + ?column? +---------- + t +(1 row) + +SELECT 'xyz' !~ '[[:upper:]]' COLLATE PG_C_UTF8; + ?column? +---------- + t +(1 row) + +SELECT '@' !~ '[[:alnum:]]' COLLATE PG_C_UTF8; + ?column? +---------- + t +(1 row) + +SELECT '=' ~ '[[:punct:]]' COLLATE PG_C_UTF8; -- symbols are punctuation in posix + ?column? +---------- + t +(1 row) + +SELECT 'a8a' ~ '[[:digit:]]' COLLATE PG_C_UTF8; + ?column? +---------- + t +(1 row) + +SELECT '൧' !~ '\d' COLLATE PG_C_UTF8; -- only 0-9 considered digits in posix + ?column? +---------- + t +(1 row) + +-- case mapping +SELECT 'xYz' ~* 'XyZ' COLLATE PG_C_UTF8; + ?column? +---------- + t +(1 row) + +SELECT 'xAb' ~* '[W-Y]' COLLATE PG_C_UTF8; + ?column? +---------- + t +(1 row) + +SELECT 'xAb' !~* '[c-d]' COLLATE PG_C_UTF8; + ?column? +---------- + t +(1 row) + +SELECT 'Δ' ~* '[γ-λ]' COLLATE PG_C_UTF8; + ?column? +---------- + t +(1 row) + +SELECT 'δ' ~* '[Γ-Λ]' COLLATE PG_C_UTF8; -- same as above with cases reversed + ?column? +---------- + t +(1 row) + diff --git a/src/test/regress/expected/collate.utf8_1.out b/src/test/regress/expected/collate.utf8_1.out new file mode 100644 index 0000000000000..e73fdf50c30f1 --- /dev/null +++ b/src/test/regress/expected/collate.utf8_1.out @@ -0,0 +1,8 @@ +/* + * This test is for collations and character operations when using the + * builtin provider with the C.UTF-8 locale. + */ +/* skip test if not UTF8 server encoding */ +SELECT getdatabaseencoding() <> 'UTF8' AS skip_test \gset +\if :skip_test +\quit diff --git a/src/test/regress/expected/collate.windows.win1252.out b/src/test/regress/expected/collate.windows.win1252.out index b7b93959de995..31f794988b3c0 100644 --- a/src/test/regress/expected/collate.windows.win1252.out +++ b/src/test/regress/expected/collate.windows.win1252.out @@ -21,10 +21,10 @@ CREATE TABLE collate_test1 ( ); \d collate_test1 Table "collate_tests.collate_test1" - Column | Type | Collation | Nullable | Default + Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- - a | integer | | | - b | text | en_US | not null | + a | integer | | | + b | text | en_US | not null | CREATE TABLE collate_test_fail ( a int, @@ -52,10 +52,10 @@ CREATE TABLE collate_test_like ( ); \d collate_test_like Table "collate_tests.collate_test_like" - Column | Type | Collation | Nullable | Default + Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- - a | integer | | | - b | text | en_US | not null | + a | integer | | | + b | text | en_US | not null | CREATE TABLE collate_test2 ( a int, @@ -69,27 +69,27 @@ INSERT INTO collate_test1 VALUES (1, 'abc'), (2, ' INSERT INTO collate_test2 SELECT * FROM collate_test1; INSERT INTO collate_test3 SELECT * FROM collate_test1; SELECT * FROM collate_test1 WHERE b >= 'bbc'; - a | b + a | b ---+----- 3 | bbc (1 row) SELECT * FROM collate_test2 WHERE b >= 'bbc'; - a | b + a | b ---+----- 2 | äbc 3 | bbc (2 rows) SELECT * FROM collate_test3 WHERE b >= 'bbc'; - a | b + a | b ---+----- 2 | äbc 3 | bbc (2 rows) SELECT * FROM collate_test3 WHERE b >= 'BBC'; - a | b + a | b ---+----- 1 | abc 2 | äbc @@ -97,21 +97,21 @@ SELECT * FROM collate_test3 WHERE b >= 'BBC'; (3 rows) SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc'; - a | b + a | b ---+----- 2 | äbc 3 | bbc (2 rows) SELECT * FROM collate_test1 WHERE b >= 'bbc' COLLATE "C"; - a | b + a | b ---+----- 2 | äbc 3 | bbc (2 rows) SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc' COLLATE "C"; - a | b + a | b ---+----- 2 | äbc 3 | bbc @@ -130,7 +130,7 @@ CREATE TABLE collate_test4 ( ); INSERT INTO collate_test4 SELECT * FROM collate_test1; SELECT a, b FROM collate_test4 ORDER BY b; - a | b + a | b ---+----- 1 | abc 4 | ABC @@ -144,7 +144,7 @@ CREATE TABLE collate_test5 ( ); INSERT INTO collate_test5 SELECT * FROM collate_test1; SELECT a, b FROM collate_test5 ORDER BY b; - a | b + a | b ---+----- 1 | abc 4 | ABC @@ -153,7 +153,7 @@ SELECT a, b FROM collate_test5 ORDER BY b; (4 rows) SELECT a, b FROM collate_test1 ORDER BY b; - a | b + a | b ---+----- 1 | abc 4 | ABC @@ -162,7 +162,7 @@ SELECT a, b FROM collate_test1 ORDER BY b; (4 rows) SELECT a, b FROM collate_test2 ORDER BY b; - a | b + a | b ---+----- 1 | abc 4 | ABC @@ -171,7 +171,7 @@ SELECT a, b FROM collate_test2 ORDER BY b; (4 rows) SELECT a, b FROM collate_test3 ORDER BY b; - a | b + a | b ---+----- 4 | ABC 1 | abc @@ -180,7 +180,7 @@ SELECT a, b FROM collate_test3 ORDER BY b; (4 rows) SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; - a | b + a | b ---+----- 4 | ABC 1 | abc @@ -190,7 +190,7 @@ SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; -- star expansion SELECT * FROM collate_test1 ORDER BY b; - a | b + a | b ---+----- 1 | abc 4 | ABC @@ -199,7 +199,7 @@ SELECT * FROM collate_test1 ORDER BY b; (4 rows) SELECT * FROM collate_test2 ORDER BY b; - a | b + a | b ---+----- 1 | abc 4 | ABC @@ -208,7 +208,7 @@ SELECT * FROM collate_test2 ORDER BY b; (4 rows) SELECT * FROM collate_test3 ORDER BY b; - a | b + a | b ---+----- 4 | ABC 1 | abc @@ -218,32 +218,32 @@ SELECT * FROM collate_test3 ORDER BY b; -- constant expression folding SELECT 'bbc' COLLATE "en_US" > 'äbc' COLLATE "en_US" AS "true"; - true + true ------ t (1 row) SELECT 'bbc' COLLATE "sv_SE" > 'äbc' COLLATE "sv_SE" AS "false"; - false + false ------- f (1 row) -- LIKE/ILIKE SELECT * FROM collate_test1 WHERE b LIKE 'abc'; - a | b + a | b ---+----- 1 | abc (1 row) SELECT * FROM collate_test1 WHERE b LIKE 'abc%'; - a | b + a | b ---+----- 1 | abc (1 row) SELECT * FROM collate_test1 WHERE b LIKE '%bc%'; - a | b + a | b ---+----- 1 | abc 2 | äbc @@ -251,21 +251,21 @@ SELECT * FROM collate_test1 WHERE b LIKE '%bc%'; (3 rows) SELECT * FROM collate_test1 WHERE b ILIKE 'abc'; - a | b + a | b ---+----- 1 | abc 4 | ABC (2 rows) SELECT * FROM collate_test1 WHERE b ILIKE 'abc%'; - a | b + a | b ---+----- 1 | abc 4 | ABC (2 rows) SELECT * FROM collate_test1 WHERE b ILIKE '%bc%'; - a | b + a | b ---+----- 1 | abc 2 | äbc @@ -275,25 +275,25 @@ SELECT * FROM collate_test1 WHERE b ILIKE '%bc%'; -- The following actually exercises the selectivity estimation for ILIKE. SELECT relname FROM pg_class WHERE relname ILIKE 'abc%'; - relname + relname --------- (0 rows) -- regular expressions SELECT * FROM collate_test1 WHERE b ~ '^abc$'; - a | b + a | b ---+----- 1 | abc (1 row) SELECT * FROM collate_test1 WHERE b ~ '^abc'; - a | b + a | b ---+----- 1 | abc (1 row) SELECT * FROM collate_test1 WHERE b ~ 'bc'; - a | b + a | b ---+----- 1 | abc 2 | äbc @@ -301,21 +301,21 @@ SELECT * FROM collate_test1 WHERE b ~ 'bc'; (3 rows) SELECT * FROM collate_test1 WHERE b ~* '^abc$'; - a | b + a | b ---+----- 1 | abc 4 | ABC (2 rows) SELECT * FROM collate_test1 WHERE b ~* '^abc'; - a | b + a | b ---+----- 1 | abc 4 | ABC (2 rows) SELECT * FROM collate_test1 WHERE b ~* 'bc'; - a | b + a | b ---+----- 1 | abc 2 | äbc @@ -341,7 +341,7 @@ SELECT b, b ~ '^[[:punct:]]+$' AS is_punct, b ~ '^[[:space:]]+$' AS is_space FROM collate_test6; - b | is_alpha | is_upper | is_lower | is_digit | is_alnum | is_graph | is_print | is_punct | is_space + b | is_alpha | is_upper | is_lower | is_digit | is_alnum | is_graph | is_print | is_punct | is_space -----+----------+----------+----------+----------+----------+----------+----------+----------+---------- abc | t | f | t | f | t | t | t | f | f ABC | t | t | f | f | t | t | t | f | f @@ -357,7 +357,7 @@ FROM collate_test6; -- The following actually exercises the selectivity estimation for ~*. SELECT relname FROM pg_class WHERE relname ~* '^abc'; - relname + relname --------- (0 rows) @@ -366,7 +366,7 @@ CREATE VIEW collview1 AS SELECT * FROM collate_test1 WHERE b COLLATE "C" >= 'bbc CREATE VIEW collview2 AS SELECT a, b FROM collate_test1 ORDER BY b COLLATE "C"; SELECT table_name, view_definition FROM information_schema.views WHERE table_name LIKE 'collview%' ORDER BY 1; - table_name | view_definition + table_name | view_definition ------------+------------------------------------------- collview1 | SELECT a, + | b + @@ -380,7 +380,7 @@ SELECT table_name, view_definition FROM information_schema.views -- collation propagation in various expression types SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDER BY 2; - a | coalesce + a | coalesce ---+---------- 1 | abc 4 | ABC @@ -389,7 +389,7 @@ SELECT a, coalesce(b, 'foo') FROM collate_test1 ORDER BY 2; (4 rows) SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDER BY 2; - a | coalesce + a | coalesce ---+---------- 1 | abc 4 | ABC @@ -398,7 +398,7 @@ SELECT a, coalesce(b, 'foo') FROM collate_test2 ORDER BY 2; (4 rows) SELECT a, coalesce(b, 'foo') FROM collate_test3 ORDER BY 2; - a | coalesce + a | coalesce ---+---------- 4 | ABC 1 | abc @@ -407,7 +407,7 @@ SELECT a, coalesce(b, 'foo') FROM collate_test3 ORDER BY 2; (4 rows) SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDER BY 3; - a | b | greatest + a | b | greatest ---+-----+---------- 1 | abc | CCC 2 | äbc | CCC @@ -416,7 +416,7 @@ SELECT a, b, greatest(b, 'CCC') FROM collate_test1 ORDER BY 3; (4 rows) SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDER BY 3; - a | b | greatest + a | b | greatest ---+-----+---------- 1 | abc | CCC 3 | bbc | CCC @@ -425,7 +425,7 @@ SELECT a, b, greatest(b, 'CCC') FROM collate_test2 ORDER BY 3; (4 rows) SELECT a, b, greatest(b, 'CCC') FROM collate_test3 ORDER BY 3; - a | b | greatest + a | b | greatest ---+-----+---------- 4 | ABC | CCC 1 | abc | abc @@ -434,34 +434,34 @@ SELECT a, b, greatest(b, 'CCC') FROM collate_test3 ORDER BY 3; (4 rows) SELECT a, nullif(b, 'abc') FROM collate_test1 ORDER BY 2; - a | nullif + a | nullif ---+-------- 4 | ABC 2 | äbc 3 | bbc - 1 | + 1 | (4 rows) SELECT a, nullif(b, 'abc') FROM collate_test2 ORDER BY 2; - a | nullif + a | nullif ---+-------- 4 | ABC 3 | bbc 2 | äbc - 1 | + 1 | (4 rows) SELECT a, nullif(b, 'abc') FROM collate_test3 ORDER BY 2; - a | nullif + a | nullif ---+-------- 4 | ABC 3 | bbc 2 | äbc - 1 | + 1 | (4 rows) SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test1 ORDER BY 2; - a | b + a | b ---+------ 4 | ABC 2 | äbc @@ -470,7 +470,7 @@ SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test1 ORDER BY 2 (4 rows) SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test2 ORDER BY 2; - a | b + a | b ---+------ 4 | ABC 1 | abcd @@ -479,7 +479,7 @@ SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test2 ORDER BY 2 (4 rows) SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test3 ORDER BY 2; - a | b + a | b ---+------ 4 | ABC 1 | abcd @@ -489,7 +489,7 @@ SELECT a, CASE b WHEN 'abc' THEN 'abcd' ELSE b END FROM collate_test3 ORDER BY 2 CREATE DOMAIN testdomain AS text; SELECT a, b::testdomain FROM collate_test1 ORDER BY 2; - a | b + a | b ---+----- 1 | abc 4 | ABC @@ -498,7 +498,7 @@ SELECT a, b::testdomain FROM collate_test1 ORDER BY 2; (4 rows) SELECT a, b::testdomain FROM collate_test2 ORDER BY 2; - a | b + a | b ---+----- 1 | abc 4 | ABC @@ -507,7 +507,7 @@ SELECT a, b::testdomain FROM collate_test2 ORDER BY 2; (4 rows) SELECT a, b::testdomain FROM collate_test3 ORDER BY 2; - a | b + a | b ---+----- 4 | ABC 1 | abc @@ -516,7 +516,7 @@ SELECT a, b::testdomain FROM collate_test3 ORDER BY 2; (4 rows) SELECT a, b::testdomain_sv FROM collate_test3 ORDER BY 2; - a | b + a | b ---+----- 1 | abc 4 | ABC @@ -525,43 +525,43 @@ SELECT a, b::testdomain_sv FROM collate_test3 ORDER BY 2; (4 rows) SELECT min(b), max(b) FROM collate_test1; - min | max + min | max -----+----- abc | bbc (1 row) SELECT min(b), max(b) FROM collate_test2; - min | max + min | max -----+----- abc | äbc (1 row) SELECT min(b), max(b) FROM collate_test3; - min | max + min | max -----+----- ABC | äbc (1 row) SELECT array_agg(b ORDER BY b) FROM collate_test1; - array_agg + array_agg ------------------- {abc,ABC,äbc,bbc} (1 row) SELECT array_agg(b ORDER BY b) FROM collate_test2; - array_agg + array_agg ------------------- {abc,ABC,bbc,äbc} (1 row) SELECT array_agg(b ORDER BY b) FROM collate_test3; - array_agg + array_agg ------------------- {ABC,abc,bbc,äbc} (1 row) SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test1 ORDER BY 2; - a | b + a | b ---+----- 1 | abc 1 | abc @@ -574,7 +574,7 @@ SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test1 ORDER BY (8 rows) SELECT a, b FROM collate_test2 UNION SELECT a, b FROM collate_test2 ORDER BY 2; - a | b + a | b ---+----- 1 | abc 4 | ABC @@ -583,14 +583,14 @@ SELECT a, b FROM collate_test2 UNION SELECT a, b FROM collate_test2 ORDER BY 2; (4 rows) SELECT a, b FROM collate_test3 WHERE a < 4 INTERSECT SELECT a, b FROM collate_test3 WHERE a > 1 ORDER BY 2; - a | b + a | b ---+----- 3 | bbc 2 | äbc (2 rows) SELECT a, b FROM collate_test3 EXCEPT SELECT a, b FROM collate_test3 WHERE a < 2 ORDER BY 2; - a | b + a | b ---+----- 4 | ABC 3 | bbc @@ -601,7 +601,7 @@ SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3 ORDER BY ERROR: could not determine which collation to use for string comparison HINT: Use the COLLATE clause to set the collation explicitly. SELECT a, b FROM collate_test1 UNION ALL SELECT a, b FROM collate_test3; -- ok - a | b + a | b ---+----- 1 | abc 2 | äbc @@ -619,7 +619,7 @@ LINE 1: SELECT a, b FROM collate_test1 UNION SELECT a, b FROM collat... ^ HINT: You can choose the collation by applying the COLLATE clause to one or both expressions. SELECT a, b COLLATE "C" FROM collate_test1 UNION SELECT a, b FROM collate_test3 ORDER BY 2; -- ok - a | b + a | b ---+----- 4 | ABC 1 | abc @@ -656,7 +656,7 @@ ERROR: syntax error at or near "COLLATE" LINE 1: SELECT CAST('42' AS text COLLATE "C"); ^ SELECT a, CAST(b AS varchar) FROM collate_test1 ORDER BY 2; - a | b + a | b ---+----- 1 | abc 4 | ABC @@ -665,7 +665,7 @@ SELECT a, CAST(b AS varchar) FROM collate_test1 ORDER BY 2; (4 rows) SELECT a, CAST(b AS varchar) FROM collate_test2 ORDER BY 2; - a | b + a | b ---+----- 1 | abc 4 | ABC @@ -674,7 +674,7 @@ SELECT a, CAST(b AS varchar) FROM collate_test2 ORDER BY 2; (4 rows) SELECT a, CAST(b AS varchar) FROM collate_test3 ORDER BY 2; - a | b + a | b ---+----- 4 | ABC 1 | abc @@ -694,7 +694,7 @@ SELECT a.b AS a, b.b AS b, a.b < b.b AS lt, mylt(a.b, b.b), mylt_noninline(a.b, b.b), mylt_plpgsql(a.b, b.b) FROM collate_test1 a, collate_test1 b ORDER BY a.b, b.b; - a | b | lt | mylt | mylt_noninline | mylt_plpgsql + a | b | lt | mylt | mylt_noninline | mylt_plpgsql -----+-----+----+------+----------------+-------------- abc | abc | f | f | f | f abc | ABC | t | t | t | t @@ -719,7 +719,7 @@ SELECT a.b AS a, b.b AS b, a.b < b.b COLLATE "C" AS lt, mylt_plpgsql(a.b, b.b COLLATE "C") FROM collate_test1 a, collate_test1 b ORDER BY a.b, b.b; - a | b | lt | mylt | mylt_noninline | mylt_plpgsql + a | b | lt | mylt | mylt_noninline | mylt_plpgsql -----+-----+----+------+----------------+-------------- abc | abc | f | f | f | f abc | ABC | f | f | f | f @@ -749,7 +749,7 @@ begin end $$; SELECT mylt2('a', 'B' collate "en_US") as t, mylt2('a', 'B' collate "C") as f; - t | f + t | f ---+--- t | f (1 row) @@ -764,7 +764,7 @@ begin end $$; SELECT mylt2('a', 'B') as f; - f + f --- f (1 row) @@ -774,14 +774,14 @@ ERROR: could not determine which collation to use for string comparison HINT: Use the COLLATE clause to set the collation explicitly. CONTEXT: PL/pgSQL function mylt2(text,text) line 6 at RETURN SELECT mylt2('a', 'B' collate "POSIX") as f; - f + f --- f (1 row) -- polymorphism SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test1)) ORDER BY 1; - unnest + unnest -------- abc ABC @@ -790,7 +790,7 @@ SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test1)) ORDER (4 rows) SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test2)) ORDER BY 1; - unnest + unnest -------- abc ABC @@ -799,7 +799,7 @@ SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test2)) ORDER (4 rows) SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test3)) ORDER BY 1; - unnest + unnest -------- ABC abc @@ -810,7 +810,7 @@ SELECT * FROM unnest((SELECT array_agg(b ORDER BY b) FROM collate_test3)) ORDER CREATE FUNCTION dup (anyelement) RETURNS anyelement AS 'select $1' LANGUAGE sql; SELECT a, dup(b) FROM collate_test1 ORDER BY 2; - a | dup + a | dup ---+----- 1 | abc 4 | ABC @@ -819,7 +819,7 @@ SELECT a, dup(b) FROM collate_test1 ORDER BY 2; (4 rows) SELECT a, dup(b) FROM collate_test2 ORDER BY 2; - a | dup + a | dup ---+----- 1 | abc 4 | ABC @@ -828,7 +828,7 @@ SELECT a, dup(b) FROM collate_test2 ORDER BY 2; (4 rows) SELECT a, dup(b) FROM collate_test3 ORDER BY 2; - a | dup + a | dup ---+----- 4 | ABC 1 | abc @@ -848,7 +848,7 @@ ERROR: collations are not supported by type integer LINE 1: ...ATE INDEX collate_test1_idx6 ON collate_test1 ((a COLLATE "C... ^ SELECT relname, pg_get_indexdef(oid) FROM pg_class WHERE relname LIKE 'collate_test%_idx%' ORDER BY 1; - relname | pg_get_indexdef + relname | pg_get_indexdef --------------------+------------------------------------------------------------------------------------------------------------------- collate_test1_idx1 | CREATE INDEX collate_test1_idx1 ON collate_tests.collate_test1 USING btree (b) collate_test1_idx2 | CREATE INDEX collate_test1_idx2 ON collate_tests.collate_test1 USING btree (b COLLATE "C") @@ -889,7 +889,7 @@ CREATE COLLATION test4 FROM nonsense; ERROR: collation "nonsense" for encoding "WIN1252" does not exist CREATE COLLATION test5 FROM test0; SELECT collname FROM pg_collation WHERE collname LIKE 'test%' ORDER BY 1; - collname + collname ---------- test0 test1 @@ -910,11 +910,11 @@ SELECT collname, nspname, obj_description(pg_collation.oid, 'pg_collation') FROM pg_collation JOIN pg_namespace ON (collnamespace = pg_namespace.oid) WHERE collname LIKE 'test%' ORDER BY 1; - collname | nspname | obj_description + collname | nspname | obj_description ----------+---------------+----------------- test0 | collate_tests | US English - test11 | test_schema | - test5 | collate_tests | + test11 | test_schema | + test5 | collate_tests | (3 rows) DROP COLLATION test0, test_schema.test11, test5; @@ -923,7 +923,7 @@ ERROR: collation "test0" for encoding "WIN1252" does not exist DROP COLLATION IF EXISTS test0; NOTICE: collation "test0" does not exist, skipping SELECT collname FROM pg_collation WHERE collname LIKE 'test%'; - collname + collname ---------- (0 rows) @@ -961,15 +961,15 @@ drop cascades to view collate_dep_test3 drop cascades to index collate_dep_test4i \d collate_dep_test1 Table "collate_tests.collate_dep_test1" - Column | Type | Collation | Nullable | Default + Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- - a | integer | | | + a | integer | | | \d collate_dep_test2 Composite type "collate_tests.collate_dep_test2" - Column | Type | Collation | Nullable | Default + Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+--------- - x | integer | | | + x | integer | | | DROP TABLE collate_dep_test1, collate_dep_test4t; DROP TYPE collate_dep_test2; @@ -977,13 +977,13 @@ DROP TYPE collate_dep_test2; create type textrange_c as range(subtype=text, collation="C"); create type textrange_en_us as range(subtype=text, collation="en_US"); select textrange_c('A','Z') @> 'b'::text; - ?column? + ?column? ---------- f (1 row) select textrange_en_us('A','Z') @> 'b'::text; - ?column? + ?column? ---------- t (1 row) @@ -992,7 +992,13 @@ drop type textrange_c; drop type textrange_en_us; -- nondeterministic collations -- (not supported with libc provider) -CREATE COLLATION ctest_det (locale = 'en_US', deterministic = true); +do $$ +BEGIN + EXECUTE 'CREATE COLLATION ctest_det (locale = ' || + quote_literal((SELECT collcollate FROM pg_collation WHERE + collname = 'en_US')) || ', deterministic = true);'; + END +$$; CREATE COLLATION ctest_nondet (locale = 'en_US', deterministic = false); ERROR: nondeterministic collations not supported with this provider -- cleanup diff --git a/src/test/regress/expected/compression.out b/src/test/regress/expected/compression.out index 834b7555cbc80..4dd9ee7200d18 100644 --- a/src/test/regress/expected/compression.out +++ b/src/test/regress/expected/compression.out @@ -223,15 +223,18 @@ SELECT pg_column_compression(f1) FROM cmpart2; pglz (1 row) --- test compression with inheritance, error -CREATE TABLE cminh() INHERITS(cmdata, cmdata1); +-- test compression with inheritance +CREATE TABLE cminh() INHERITS(cmdata, cmdata1); -- error NOTICE: merging multiple inherited definitions of column "f1" ERROR: column "f1" has a compression method conflict DETAIL: pglz versus lz4 -CREATE TABLE cminh(f1 TEXT COMPRESSION lz4) INHERITS(cmdata); +CREATE TABLE cminh(f1 TEXT COMPRESSION lz4) INHERITS(cmdata); -- error NOTICE: merging column "f1" with inherited definition ERROR: column "f1" has a compression method conflict DETAIL: pglz versus lz4 +CREATE TABLE cmdata3(f1 text); +CREATE TABLE cminh() INHERITS (cmdata, cmdata3); +NOTICE: merging multiple inherited definitions of column "f1" -- test default_toast_compression GUC SET default_toast_compression = ''; ERROR: invalid value for parameter "default_toast_compression": "" @@ -251,6 +254,7 @@ INSERT INTO cmdata VALUES (repeat('123456789', 4004)); f1 | text | | | | extended | lz4 | | Indexes: "idx" btree (f1) +Child tables: cminh SELECT pg_column_compression(f1) FROM cmdata; pg_column_compression diff --git a/src/test/regress/expected/compression_1.out b/src/test/regress/expected/compression_1.out index ddcd137c495bd..7bd7642b4b94f 100644 --- a/src/test/regress/expected/compression_1.out +++ b/src/test/regress/expected/compression_1.out @@ -216,13 +216,16 @@ SELECT pg_column_compression(f1) FROM cmpart2; ----------------------- (0 rows) --- test compression with inheritance, error -CREATE TABLE cminh() INHERITS(cmdata, cmdata1); +-- test compression with inheritance +CREATE TABLE cminh() INHERITS(cmdata, cmdata1); -- error ERROR: relation "cmdata1" does not exist -CREATE TABLE cminh(f1 TEXT COMPRESSION lz4) INHERITS(cmdata); +CREATE TABLE cminh(f1 TEXT COMPRESSION lz4) INHERITS(cmdata); -- error NOTICE: merging column "f1" with inherited definition ERROR: column "f1" has a compression method conflict DETAIL: pglz versus lz4 +CREATE TABLE cmdata3(f1 text); +CREATE TABLE cminh() INHERITS (cmdata, cmdata3); +NOTICE: merging multiple inherited definitions of column "f1" -- test default_toast_compression GUC SET default_toast_compression = ''; ERROR: invalid value for parameter "default_toast_compression": "" @@ -246,6 +249,7 @@ INSERT INTO cmdata VALUES (repeat('123456789', 4004)); f1 | text | | | | extended | pglz | | Indexes: "idx" btree (f1) +Child tables: cminh SELECT pg_column_compression(f1) FROM cmdata; pg_column_compression diff --git a/src/test/regress/expected/constraints.out b/src/test/regress/expected/constraints.out index e6f6602d95321..cf0b80d616965 100644 --- a/src/test/regress/expected/constraints.out +++ b/src/test/regress/expected/constraints.out @@ -626,6 +626,49 @@ SELECT conname FROM pg_constraint WHERE conrelid = 'parted_fk_naming_1'::regclas (1 row) DROP TABLE parted_fk_naming; +-- +-- Test various ways to create primary keys on partitions, linked to unique +-- indexes (without constraints) on the partitioned table. Ideally these should +-- fail, but we don't dare change released behavior, so instead cope with it at +-- DETACH time. +CREATE TEMP TABLE t (a integer, b integer) PARTITION BY HASH (a, b); +CREATE TEMP TABLE tp (a integer, b integer, PRIMARY KEY (a, b), UNIQUE (b, a)); +ALTER TABLE t ATTACH PARTITION tp FOR VALUES WITH (MODULUS 1, REMAINDER 0); +CREATE UNIQUE INDEX t_a_idx ON t (a, b); +CREATE UNIQUE INDEX t_b_idx ON t (b, a); +ALTER INDEX t_a_idx ATTACH PARTITION tp_pkey; +ALTER INDEX t_b_idx ATTACH PARTITION tp_b_a_key; +SELECT conname, conparentid, conislocal, coninhcount + FROM pg_constraint WHERE conname IN ('tp_pkey', 'tp_b_a_key') + ORDER BY conname DESC; + conname | conparentid | conislocal | coninhcount +------------+-------------+------------+------------- + tp_pkey | 0 | t | 0 + tp_b_a_key | 0 | t | 0 +(2 rows) + +ALTER TABLE t DETACH PARTITION tp; +DROP TABLE t, tp; +CREATE TEMP TABLE t (a integer) PARTITION BY LIST (a); +CREATE TEMP TABLE tp (a integer PRIMARY KEY); +CREATE UNIQUE INDEX t_a_idx ON t (a); +ALTER TABLE t ATTACH PARTITION tp FOR VALUES IN (1); +ALTER TABLE t DETACH PARTITION tp; +DROP TABLE t, tp; +CREATE TEMP TABLE t (a integer) PARTITION BY LIST (a); +CREATE TEMP TABLE tp (a integer PRIMARY KEY); +CREATE UNIQUE INDEX t_a_idx ON ONLY t (a); +ALTER TABLE t ATTACH PARTITION tp FOR VALUES IN (1); +ALTER TABLE t DETACH PARTITION tp; +DROP TABLE t, tp; +CREATE TABLE regress_constr_partitioned (a integer) PARTITION BY LIST (a); +CREATE TABLE regress_constr_partition1 PARTITION OF regress_constr_partitioned FOR VALUES IN (1); +ALTER TABLE regress_constr_partition1 ADD PRIMARY KEY (a); +CREATE UNIQUE INDEX ON regress_constr_partitioned (a); +BEGIN; +ALTER TABLE regress_constr_partitioned DETACH PARTITION regress_constr_partition1; +ROLLBACK; +-- Leave this one in funny state for pg_upgrade testing -- test a HOT update that invalidates the conflicting tuple. -- the trigger should still fire and catch the violation BEGIN; diff --git a/src/test/regress/expected/conversion.out b/src/test/regress/expected/conversion.out index 442e7aff2b2c1..7dd1ef6161f06 100644 --- a/src/test/regress/expected/conversion.out +++ b/src/test/regress/expected/conversion.out @@ -5,6 +5,13 @@ \getenv libdir PG_LIBDIR \getenv dlsuffix PG_DLSUFFIX \set regresslib :libdir '/regress' :dlsuffix +CREATE FUNCTION test_enc_setup() RETURNS void + AS :'regresslib', 'test_enc_setup' + LANGUAGE C STRICT; +SELECT FROM test_enc_setup(); +-- +(1 row) + CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea) AS :'regresslib', 'test_enc_conversion' LANGUAGE C STRICT; @@ -501,10 +508,13 @@ insert into gb18030_inputs values ('\x666f6f84309c38', 'valid, translates to UTF-8 by mapping function'), ('\x666f6f84309c', 'incomplete char '), ('\x666f6f84309c0a', 'incomplete char, followed by newline '), + ('\x666f6f84', 'incomplete char at end'), ('\x666f6f84309c3800', 'invalid, NUL byte'), ('\x666f6f84309c0038', 'invalid, NUL byte'); --- Test GB18030 verification -select description, inbytes, (test_conv(inbytes, 'gb18030', 'gb18030')).* from gb18030_inputs; +-- Test GB18030 verification. Round-trip through text so the backing of the +-- bytea values is palloc, not shared_buffers. This lets Valgrind detect +-- reads past the end. +select description, inbytes, (test_conv(inbytes::text::bytea, 'gb18030', 'gb18030')).* from gb18030_inputs; description | inbytes | result | errorat | error ------------------------------------------------+--------------------+------------------+--------------+------------------------------------------------------------------- valid, pure ASCII | \x666f6f | \x666f6f | | @@ -513,9 +523,10 @@ select description, inbytes, (test_conv(inbytes, 'gb18030', 'gb18030')).* from g valid, translates to UTF-8 by mapping function | \x666f6f84309c38 | \x666f6f84309c38 | | incomplete char | \x666f6f84309c | \x666f6f | \x84309c | invalid byte sequence for encoding "GB18030": 0x84 0x30 0x9c incomplete char, followed by newline | \x666f6f84309c0a | \x666f6f | \x84309c0a | invalid byte sequence for encoding "GB18030": 0x84 0x30 0x9c 0x0a + incomplete char at end | \x666f6f84 | \x666f6f | \x84 | invalid byte sequence for encoding "GB18030": 0x84 invalid, NUL byte | \x666f6f84309c3800 | \x666f6f84309c38 | \x00 | invalid byte sequence for encoding "GB18030": 0x00 invalid, NUL byte | \x666f6f84309c0038 | \x666f6f | \x84309c0038 | invalid byte sequence for encoding "GB18030": 0x84 0x30 0x9c 0x00 -(8 rows) +(9 rows) -- Test conversions from GB18030 select description, inbytes, (test_conv(inbytes, 'gb18030', 'utf8')).* from gb18030_inputs; @@ -527,9 +538,10 @@ select description, inbytes, (test_conv(inbytes, 'gb18030', 'utf8')).* from gb18 valid, translates to UTF-8 by mapping function | \x666f6f84309c38 | \x666f6fefa8aa | | incomplete char | \x666f6f84309c | \x666f6f | \x84309c | invalid byte sequence for encoding "GB18030": 0x84 0x30 0x9c incomplete char, followed by newline | \x666f6f84309c0a | \x666f6f | \x84309c0a | invalid byte sequence for encoding "GB18030": 0x84 0x30 0x9c 0x0a + incomplete char at end | \x666f6f84 | \x666f6f | \x84 | invalid byte sequence for encoding "GB18030": 0x84 invalid, NUL byte | \x666f6f84309c3800 | \x666f6fefa8aa | \x00 | invalid byte sequence for encoding "GB18030": 0x00 invalid, NUL byte | \x666f6f84309c0038 | \x666f6f | \x84309c0038 | invalid byte sequence for encoding "GB18030": 0x84 0x30 0x9c 0x00 -(8 rows) +(9 rows) -- -- ISO-8859-5 diff --git a/src/test/regress/expected/copy.out b/src/test/regress/expected/copy.out index 8a8bf43fdea0f..44114089a6dce 100644 --- a/src/test/regress/expected/copy.out +++ b/src/test/regress/expected/copy.out @@ -240,3 +240,57 @@ SELECT * FROM header_copytest ORDER BY a; (5 rows) drop table header_copytest; +-- test COPY with overlong column defaults +create temp table oversized_column_default ( + col1 varchar(5) DEFAULT 'more than 5 chars', + col2 varchar(5)); +-- normal COPY should work +copy oversized_column_default from stdin; +-- error if the column is excluded +copy oversized_column_default (col2) from stdin; +ERROR: value too long for type character varying(5) +\. +invalid command \. +-- error if the DEFAULT option is given +copy oversized_column_default from stdin (default ''); +ERROR: value too long for type character varying(5) +\. +invalid command \. +drop table oversized_column_default; +-- +-- Create partitioned table that does not allow bulk insertions, to test bugs +-- related to the reuse of BulkInsertState across partitions (only done when +-- not using bulk insert). Switching between partitions often makes it more +-- likely to encounter these bugs, so we just switch on roughly every insert +-- by having an even/odd number partition and inserting evenly distributed +-- data. +-- +CREATE TABLE parted_si ( + id int not null, + data text not null, + -- prevent use of bulk insert by having a volatile function + rand float8 not null default random() +) +PARTITION BY LIST((id % 2)); +CREATE TABLE parted_si_p_even PARTITION OF parted_si FOR VALUES IN (0); +CREATE TABLE parted_si_p_odd PARTITION OF parted_si FOR VALUES IN (1); +-- Test that bulk relation extension handles reusing a single BulkInsertState +-- across partitions. Without the fix applied, this reliably reproduces +-- #18130 unless shared_buffers is extremely small (preventing any use of bulk +-- relation extension). See +-- https://postgr.es/m/18130-7a86a7356a75209d%40postgresql.org +-- https://postgr.es/m/257696.1695670946%40sss.pgh.pa.us +\set filename :abs_srcdir '/data/desc.data' +COPY parted_si(id, data) FROM :'filename'; +-- An earlier bug (see commit b1ecb9b3fcf) could end up using a buffer from +-- the wrong partition. This test is *not* guaranteed to trigger that bug, but +-- does so when shared_buffers is small enough. To test if we encountered the +-- bug, check that the partition condition isn't violated. +SELECT tableoid::regclass, id % 2 = 0 is_even, count(*) from parted_si GROUP BY 1, 2 ORDER BY 1; + tableoid | is_even | count +------------------+---------+------- + parted_si_p_even | t | 5000 + parted_si_p_odd | f | 5000 +(2 rows) + +DROP TABLE parted_si; diff --git a/src/test/regress/expected/copy2.out b/src/test/regress/expected/copy2.out index 8e33eee719480..695b1b2d635a4 100644 --- a/src/test/regress/expected/copy2.out +++ b/src/test/regress/expected/copy2.out @@ -77,23 +77,57 @@ COPY x from stdin (encoding 'sql_ascii', encoding 'sql_ascii'); ERROR: conflicting or redundant options LINE 1: COPY x from stdin (encoding 'sql_ascii', encoding 'sql_ascii... ^ +COPY x from stdin (on_error ignore, on_error ignore); +ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (on_error ignore, on_error ignore); + ^ +COPY x from stdin (log_verbosity default, log_verbosity verbose); +ERROR: conflicting or redundant options +LINE 1: COPY x from stdin (log_verbosity default, log_verbosity verb... + ^ -- incorrect options -COPY x to stdin (format BINARY, delimiter ','); +COPY x from stdin (format BINARY, delimiter ','); ERROR: cannot specify DELIMITER in BINARY mode -COPY x to stdin (format BINARY, null 'x'); +COPY x from stdin (format BINARY, null 'x'); ERROR: cannot specify NULL in BINARY mode -COPY x to stdin (format TEXT, force_quote(a)); -ERROR: COPY force quote available only in CSV mode +COPY x from stdin (format BINARY, on_error ignore); +ERROR: only ON_ERROR STOP is allowed in BINARY mode +COPY x from stdin (on_error unsupported); +ERROR: COPY ON_ERROR "unsupported" not recognized +LINE 1: COPY x from stdin (on_error unsupported); + ^ +COPY x from stdin (format TEXT, force_quote(a)); +ERROR: COPY FORCE_QUOTE requires CSV mode +COPY x from stdin (format TEXT, force_quote *); +ERROR: COPY FORCE_QUOTE requires CSV mode COPY x from stdin (format CSV, force_quote(a)); -ERROR: COPY force quote only available using COPY TO -COPY x to stdout (format TEXT, force_not_null(a)); -ERROR: COPY force not null available only in CSV mode -COPY x to stdin (format CSV, force_not_null(a)); -ERROR: COPY force not null only available using COPY FROM -COPY x to stdout (format TEXT, force_null(a)); -ERROR: COPY force null available only in CSV mode -COPY x to stdin (format CSV, force_null(a)); -ERROR: COPY force null only available using COPY FROM +ERROR: COPY FORCE_QUOTE cannot be used with COPY FROM +COPY x from stdin (format CSV, force_quote *); +ERROR: COPY FORCE_QUOTE cannot be used with COPY FROM +COPY x from stdin (format TEXT, force_not_null(a)); +ERROR: COPY FORCE_NOT_NULL requires CSV mode +COPY x from stdin (format TEXT, force_not_null *); +ERROR: COPY FORCE_NOT_NULL requires CSV mode +COPY x to stdout (format CSV, force_not_null(a)); +ERROR: COPY FORCE_NOT_NULL cannot be used with COPY TO +COPY x to stdout (format CSV, force_not_null *); +ERROR: COPY FORCE_NOT_NULL cannot be used with COPY TO +COPY x from stdin (format TEXT, force_null(a)); +ERROR: COPY FORCE_NULL requires CSV mode +COPY x from stdin (format TEXT, force_null *); +ERROR: COPY FORCE_NULL requires CSV mode +COPY x to stdout (format CSV, force_null(a)); +ERROR: COPY FORCE_NULL cannot be used with COPY TO +COPY x to stdout (format CSV, force_null *); +ERROR: COPY FORCE_NULL cannot be used with COPY TO +COPY x to stdout (format BINARY, on_error unsupported); +ERROR: COPY ON_ERROR cannot be used with COPY TO +LINE 1: COPY x to stdout (format BINARY, on_error unsupported); + ^ +COPY x from stdin (log_verbosity unsupported); +ERROR: COPY LOG_VERBOSITY "unsupported" not recognized +LINE 1: COPY x from stdin (log_verbosity unsupported); + ^ -- too many columns in column list: should fail COPY x (a, b, c, d, e, d, c) from stdin; ERROR: column "d" specified more than once @@ -520,6 +554,50 @@ BEGIN; COPY forcetest (d, e) FROM STDIN WITH (FORMAT csv, FORCE_NULL(b)); ERROR: FORCE_NULL column "b" not referenced by COPY ROLLBACK; +-- should succeed with no effect ("b" remains an empty string, "c" remains NULL) +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL *, FORCE_NULL *); +COMMIT; +SELECT b, c FROM forcetest WHERE a = 4; + b | c +---+------ + | NULL +(1 row) + +-- should succeed with effect ("b" remains an empty string) +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL *); +COMMIT; +SELECT b, c FROM forcetest WHERE a = 5; + b | c +---+--- + | +(1 row) + +-- should succeed with effect ("c" remains NULL) +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NULL *); +COMMIT; +SELECT b, c FROM forcetest WHERE a = 6; + b | c +---+------ + b | NULL +(1 row) + +-- should fail with "conflicting or redundant options" error +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL *, FORCE_NOT_NULL(b)); +ERROR: conflicting or redundant options +LINE 1: ...c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL *, FORCE_NOT_... + ^ +ROLLBACK; +-- should fail with "conflicting or redundant options" error +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NULL *, FORCE_NULL(b)); +ERROR: conflicting or redundant options +LINE 1: ... b, c) FROM STDIN WITH (FORMAT csv, FORCE_NULL *, FORCE_NULL... + ^ +ROLLBACK; \pset null '' -- test case with whole-row Var in a check constraint create table check_con_tbl (f1 int); @@ -666,6 +744,63 @@ SELECT * FROM instead_of_insert_tbl; (2 rows) COMMIT; +-- tests for on_error option +CREATE TABLE check_ign_err (n int, m int[], k int); +COPY check_ign_err FROM STDIN WITH (on_error stop); +ERROR: invalid input syntax for type integer: "a" +CONTEXT: COPY check_ign_err, line 2, column n: "a" +-- want context for notices +\set SHOW_CONTEXT always +COPY check_ign_err FROM STDIN WITH (on_error ignore, log_verbosity verbose); +NOTICE: skipping row due to data type incompatibility at line 2 for column "n": "a" +CONTEXT: COPY check_ign_err +NOTICE: skipping row due to data type incompatibility at line 3 for column "k": "3333333333" +CONTEXT: COPY check_ign_err +NOTICE: skipping row due to data type incompatibility at line 4 for column "m": "{a, 4}" +CONTEXT: COPY check_ign_err +NOTICE: skipping row due to data type incompatibility at line 5 for column "n": "" +CONTEXT: COPY check_ign_err +NOTICE: skipping row due to data type incompatibility at line 7 for column "m": "a" +CONTEXT: COPY check_ign_err +NOTICE: skipping row due to data type incompatibility at line 8 for column "k": "a" +CONTEXT: COPY check_ign_err +NOTICE: 6 rows were skipped due to data type incompatibility +-- tests for on_error option with log_verbosity and null constraint via domain +CREATE DOMAIN dcheck_ign_err2 varchar(15) NOT NULL; +CREATE TABLE check_ign_err2 (n int, m int[], k int, l dcheck_ign_err2); +COPY check_ign_err2 FROM STDIN WITH (on_error ignore, log_verbosity verbose); +NOTICE: skipping row due to data type incompatibility at line 2 for column "l": null input +CONTEXT: COPY check_ign_err2 +NOTICE: 1 row was skipped due to data type incompatibility +-- reset context choice +\set SHOW_CONTEXT errors +SELECT * FROM check_ign_err; + n | m | k +---+-----+--- + 1 | {1} | 1 + 5 | {5} | 5 + 8 | {8} | 8 +(3 rows) + +SELECT * FROM check_ign_err2; + n | m | k | l +---+-----+---+------- + 1 | {1} | 1 | 'foo' +(1 row) + +-- test datatype error that can't be handled as soft: should fail +CREATE TABLE hard_err(foo widget); +COPY hard_err FROM STDIN WITH (on_error ignore); +ERROR: invalid input syntax for type widget: "1" +CONTEXT: COPY hard_err, line 1, column foo: "1" +-- test missing data: should fail +COPY check_ign_err FROM STDIN WITH (on_error ignore); +ERROR: missing data for column "k" +CONTEXT: COPY check_ign_err, line 1: "1 {1}" +-- test extra data: should fail +COPY check_ign_err FROM STDIN WITH (on_error ignore); +ERROR: extra data after last expected column +CONTEXT: COPY check_ign_err, line 1: "1 {1} 3 abc" -- clean up DROP TABLE forcetest; DROP TABLE vistest; @@ -680,6 +815,10 @@ DROP TABLE instead_of_insert_tbl; DROP VIEW instead_of_insert_tbl_view; DROP VIEW instead_of_insert_tbl_view_2; DROP FUNCTION fun_instead_of_insert_tbl(); +DROP TABLE check_ign_err; +DROP TABLE check_ign_err2; +DROP DOMAIN dcheck_ign_err2; +DROP TABLE hard_err; -- -- COPY FROM ... DEFAULT -- @@ -717,7 +856,7 @@ copy copy_default from stdin with (default E'\r'); ERROR: COPY default representation cannot use newline or carriage return -- DELIMITER cannot appear in DEFAULT spec copy copy_default from stdin with (delimiter ';', default 'test;test'); -ERROR: COPY delimiter must not appear in the DEFAULT specification +ERROR: COPY delimiter character must not appear in the DEFAULT specification -- CSV quote cannot appear in DEFAULT spec copy copy_default from stdin with (format csv, quote '"', default 'test"test'); ERROR: CSV quote character must not appear in the DEFAULT specification @@ -726,12 +865,12 @@ copy copy_default from stdin with (default '\N'); ERROR: NULL specification and DEFAULT specification cannot be the same -- cannot use DEFAULT marker in column that has no DEFAULT value copy copy_default from stdin with (default '\D'); -ERROR: unexpected DEFAULT in COPY data -DETAIL: Column "id" has no DEFAULT value. +ERROR: unexpected default marker in COPY data +DETAIL: Column "id" has no default value. CONTEXT: COPY copy_default, line 1: "\D value '2022-07-04'" copy copy_default from stdin with (format csv, default '\D'); -ERROR: unexpected DEFAULT in COPY data -DETAIL: Column "id" has no DEFAULT value. +ERROR: unexpected default marker in COPY data +DETAIL: Column "id" has no default value. CONTEXT: COPY copy_default, line 1: "\D,value,2022-07-04" -- The DEFAULT marker must be unquoted and unescaped or it's not recognized copy copy_default from stdin with (default '\D'); @@ -777,4 +916,4 @@ select id, text_value, ts_value from copy_default; truncate copy_default; -- DEFAULT cannot be used in COPY TO copy (select 1 as test) TO stdout with (default '\D'); -ERROR: COPY DEFAULT only available using COPY FROM +ERROR: COPY DEFAULT cannot be used with COPY TO diff --git a/src/test/regress/expected/copydml.out b/src/test/regress/expected/copydml.out index b5a225628f46e..e91e83260aa05 100644 --- a/src/test/regress/expected/copydml.out +++ b/src/test/regress/expected/copydml.out @@ -38,7 +38,7 @@ ERROR: DO INSTEAD NOTHING rules are not supported for COPY drop rule qqq on copydml_test; create rule qqq as on insert to copydml_test do also delete from copydml_test; copy (insert into copydml_test default values) to stdout; -ERROR: DO ALSO rules are not supported for the COPY +ERROR: DO ALSO rules are not supported for COPY drop rule qqq on copydml_test; create rule qqq as on insert to copydml_test do instead (delete from copydml_test; delete from copydml_test); copy (insert into copydml_test default values) to stdout; @@ -54,7 +54,7 @@ ERROR: DO INSTEAD NOTHING rules are not supported for COPY drop rule qqq on copydml_test; create rule qqq as on update to copydml_test do also delete from copydml_test; copy (update copydml_test set t = 'f') to stdout; -ERROR: DO ALSO rules are not supported for the COPY +ERROR: DO ALSO rules are not supported for COPY drop rule qqq on copydml_test; create rule qqq as on update to copydml_test do instead (delete from copydml_test; delete from copydml_test); copy (update copydml_test set t = 'f') to stdout; @@ -70,7 +70,7 @@ ERROR: DO INSTEAD NOTHING rules are not supported for COPY drop rule qqq on copydml_test; create rule qqq as on delete to copydml_test do also insert into copydml_test default values; copy (delete from copydml_test) to stdout; -ERROR: DO ALSO rules are not supported for the COPY +ERROR: DO ALSO rules are not supported for COPY drop rule qqq on copydml_test; create rule qqq as on delete to copydml_test do instead (insert into copydml_test default values; insert into copydml_test default values); copy (delete from copydml_test) to stdout; @@ -80,6 +80,10 @@ create rule qqq as on delete to copydml_test where old.t <> 'f' do instead inser copy (delete from copydml_test) to stdout; ERROR: conditional DO INSTEAD rules are not supported for COPY drop rule qqq on copydml_test; +create rule qqq as on insert to copydml_test do instead notify copydml_test; +copy (insert into copydml_test default values) to stdout; +ERROR: COPY query must not be a utility command +drop rule qqq on copydml_test; -- triggers create function qqq_trig() returns trigger as $$ begin diff --git a/src/test/regress/expected/create_am.out b/src/test/regress/expected/create_am.out index b50293d514f8d..c1a951572512c 100644 --- a/src/test/regress/expected/create_am.out +++ b/src/test/regress/expected/create_am.out @@ -113,7 +113,7 @@ COMMIT; -- prevent empty values SET default_table_access_method = ''; ERROR: invalid value for parameter "default_table_access_method": "" -DETAIL: default_table_access_method cannot be empty. +DETAIL: "default_table_access_method" cannot be empty. -- prevent nonexistent values SET default_table_access_method = 'I do not exist AM'; ERROR: invalid value for parameter "default_table_access_method": "I do not exist AM" @@ -176,9 +176,16 @@ SELECT f1 FROM tableam_tblmv_heap2 ORDER BY f1; 1 (1 row) --- CREATE TABLE .. PARTITION BY doesn't not support USING +-- CREATE TABLE .. PARTITION BY supports USING. CREATE TABLE tableam_parted_heap2 (a text, b int) PARTITION BY list (a) USING heap2; -ERROR: specifying a table access method is not supported on a partitioned table +SELECT a.amname FROM pg_class c, pg_am a + WHERE c.relname = 'tableam_parted_heap2' AND a.oid = c.relam; + amname +-------- + heap2 +(1 row) + +DROP TABLE tableam_parted_heap2; CREATE TABLE tableam_parted_heap2 (a text, b int) PARTITION BY list (a); -- new partitions will inherit from the current default, rather the partition root SET default_table_access_method = 'heap'; @@ -283,6 +290,27 @@ SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heaptable; 9 | 1 (1 row) +-- DEFAULT access method +BEGIN; +SET LOCAL default_table_access_method TO heap2; +ALTER TABLE heaptable SET ACCESS METHOD DEFAULT; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; + amname +-------- + heap2 +(1 row) + +SET LOCAL default_table_access_method TO heap; +ALTER TABLE heaptable SET ACCESS METHOD DEFAULT; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; + amname +-------- + heap +(1 row) + +ROLLBACK; -- ALTER MATERIALIZED VIEW SET ACCESS METHOD CREATE MATERIALIZED VIEW heapmv USING heap AS SELECT * FROM heaptable; SELECT amname FROM pg_class c, pg_am am @@ -309,16 +337,171 @@ SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heapmv; -- No support for multiple subcommands ALTER TABLE heaptable SET ACCESS METHOD heap, SET ACCESS METHOD heap2; ERROR: cannot have multiple SET ACCESS METHOD subcommands +ALTER TABLE heaptable SET ACCESS METHOD DEFAULT, SET ACCESS METHOD heap2; +ERROR: cannot have multiple SET ACCESS METHOD subcommands ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap, SET ACCESS METHOD heap2; ERROR: cannot have multiple SET ACCESS METHOD subcommands DROP MATERIALIZED VIEW heapmv; DROP TABLE heaptable; --- No support for partitioned tables. -CREATE TABLE am_partitioned(x INT, y INT) - PARTITION BY hash (x); +-- Partitioned table with USING +CREATE TABLE am_partitioned(x INT, y INT) PARTITION BY hash (x) USING heap2; +SELECT pg_describe_object(classid, objid, objsubid) AS obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as refobj + FROM pg_depend, pg_am + WHERE pg_depend.refclassid = 'pg_am'::regclass + AND pg_am.oid = pg_depend.refobjid + AND pg_depend.objid = 'am_partitioned'::regclass; + obj | refobj +----------------------+--------------------- + table am_partitioned | access method heap2 +(1 row) + +DROP TABLE am_partitioned; +-- Partition hierarchies with access methods +BEGIN; +SET LOCAL default_table_access_method = 'heap'; +CREATE TABLE am_partitioned(x INT, y INT) PARTITION BY hash (x); +-- pg_class.relam is 0, no dependency recorded between the AM and the +-- partitioned table. +SELECT relam FROM pg_class WHERE relname = 'am_partitioned'; + relam +------- + 0 +(1 row) + +SELECT pg_describe_object(classid, objid, objsubid) AS obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as refobj + FROM pg_depend, pg_am + WHERE pg_depend.refclassid = 'pg_am'::regclass + AND pg_am.oid = pg_depend.refobjid + AND pg_depend.objid = 'am_partitioned'::regclass; + obj | refobj +-----+-------- +(0 rows) + +-- New default is set, with dependency added. ALTER TABLE am_partitioned SET ACCESS METHOD heap2; -ERROR: cannot change access method of a partitioned table +SELECT a.amname FROM pg_class c, pg_am a + WHERE c.relname = 'am_partitioned' AND a.oid = c.relam; + amname +-------- + heap2 +(1 row) + +SELECT pg_describe_object(classid, objid, objsubid) AS obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as refobj + FROM pg_depend, pg_am + WHERE pg_depend.refclassid = 'pg_am'::regclass + AND pg_am.oid = pg_depend.refobjid + AND pg_depend.objid = 'am_partitioned'::regclass; + obj | refobj +----------------------+--------------------- + table am_partitioned | access method heap2 +(1 row) + +-- Default is set, with dependency updated. +SET LOCAL default_table_access_method = 'heap2'; +ALTER TABLE am_partitioned SET ACCESS METHOD heap; +SELECT a.amname FROM pg_class c, pg_am a + WHERE c.relname = 'am_partitioned' AND a.oid = c.relam; + amname +-------- + heap +(1 row) + +-- Dependency pinned, hence removed. +SELECT pg_describe_object(classid, objid, objsubid) AS obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as refobj + FROM pg_depend, pg_am + WHERE pg_depend.refclassid = 'pg_am'::regclass + AND pg_am.oid = pg_depend.refobjid + AND pg_depend.objid = 'am_partitioned'::regclass; + obj | refobj +-----+-------- +(0 rows) + +-- Default and AM set in the clause are the same, relam should be set. +SET LOCAL default_table_access_method = 'heap2'; +ALTER TABLE am_partitioned SET ACCESS METHOD heap2; +SELECT a.amname FROM pg_class c, pg_am a + WHERE c.relname = 'am_partitioned' AND a.oid = c.relam; + amname +-------- + heap2 +(1 row) + +-- Reset to default +ALTER TABLE am_partitioned SET ACCESS METHOD DEFAULT; +SELECT relam FROM pg_class WHERE relname = 'am_partitioned'; + relam +------- + 0 +(1 row) + +-- Upon ALTER TABLE SET ACCESS METHOD on a partitioned table, new partitions +-- will inherit the AM set. Existing partitioned are unchanged. +SELECT relam FROM pg_class WHERE relname = 'am_partitioned'; + relam +------- + 0 +(1 row) + +SET LOCAL default_table_access_method = 'heap'; +CREATE TABLE am_partitioned_0 PARTITION OF am_partitioned + FOR VALUES WITH (MODULUS 10, REMAINDER 0); +SET LOCAL default_table_access_method = 'heap2'; +CREATE TABLE am_partitioned_1 PARTITION OF am_partitioned + FOR VALUES WITH (MODULUS 10, REMAINDER 1); +SET LOCAL default_table_access_method = 'heap'; +ALTER TABLE am_partitioned SET ACCESS METHOD heap2; +CREATE TABLE am_partitioned_2 PARTITION OF am_partitioned + FOR VALUES WITH (MODULUS 10, REMAINDER 2); +ALTER TABLE am_partitioned SET ACCESS METHOD DEFAULT; +SELECT relam FROM pg_class WHERE relname = 'am_partitioned'; + relam +------- + 0 +(1 row) + +CREATE TABLE am_partitioned_3 PARTITION OF am_partitioned + FOR VALUES WITH (MODULUS 10, REMAINDER 3); +-- Partitioned table with relam at 0 +ALTER TABLE am_partitioned SET ACCESS METHOD DEFAULT; +CREATE TABLE am_partitioned_5p PARTITION OF am_partitioned + FOR VALUES WITH (MODULUS 10, REMAINDER 5) PARTITION BY hash(y); +-- Partitions of this partitioned table inherit default AM at creation +-- time. +CREATE TABLE am_partitioned_5p1 PARTITION OF am_partitioned_5p + FOR VALUES WITH (MODULUS 10, REMAINDER 1); +-- Partitioned table with relam set. +ALTER TABLE am_partitioned SET ACCESS METHOD heap2; +CREATE TABLE am_partitioned_6p PARTITION OF am_partitioned + FOR VALUES WITH (MODULUS 10, REMAINDER 6) PARTITION BY hash(y); +-- Partitions of this partitioned table inherit its AM. +CREATE TABLE am_partitioned_6p1 PARTITION OF am_partitioned_6p + FOR VALUES WITH (MODULUS 10, REMAINDER 1); +SELECT c.relname, a.amname FROM pg_class c, pg_am a + WHERE c.relam = a.oid AND + c.relname LIKE 'am_partitioned%' +UNION ALL +SELECT c.relname, 'default' FROM pg_class c + WHERE c.relam = 0 + AND c.relname LIKE 'am_partitioned%' ORDER BY 1; + relname | amname +--------------------+--------- + am_partitioned | heap2 + am_partitioned_0 | heap + am_partitioned_1 | heap2 + am_partitioned_2 | heap2 + am_partitioned_3 | heap + am_partitioned_5p | default + am_partitioned_5p1 | heap + am_partitioned_6p | heap2 + am_partitioned_6p1 | heap2 +(9 rows) + DROP TABLE am_partitioned; +COMMIT; -- Second, create objects in the new AM by changing the default AM BEGIN; SET LOCAL default_table_access_method = 'heap2'; @@ -378,6 +561,9 @@ CREATE TABLE i_am_a_failure() USING "I do not exist AM"; ERROR: access method "I do not exist AM" does not exist CREATE TABLE i_am_a_failure() USING "btree"; ERROR: access method "btree" is not of type TABLE +-- Other weird invalid cases that cause problems +CREATE FOREIGN TABLE fp PARTITION OF tableam_parted_a_heap2 DEFAULT SERVER x; +ERROR: "tableam_parted_a_heap2" is not partitioned -- Drop table access method, which fails as objects depends on it DROP ACCESS METHOD heap2; ERROR: cannot drop access method heap2 because other objects depend on it diff --git a/src/test/regress/expected/create_index.out b/src/test/regress/expected/create_index.out index 1473bc3175fa7..cf6eac57349a0 100644 --- a/src/test/regress/expected/create_index.out +++ b/src/test/regress/expected/create_index.out @@ -1698,6 +1698,12 @@ SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; 0 (1 row) +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IN (-1, 0, 1); + count +------- + 1 +(1 row) + DROP INDEX onek_nulltest; CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2 desc nulls last,unique1); SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; @@ -1910,7 +1916,7 @@ SELECT count(*) FROM dupindexcols (1 row) -- --- Check ordering of =ANY indexqual results (bug in 9.2.0) +-- Check that index scans with =ANY indexquals return rows in index order -- explain (costs off) SELECT unique1 FROM tenk1 @@ -1932,16 +1938,16 @@ ORDER BY unique1; 42 (3 rows) +-- Non-required array scan key on "tenthous": explain (costs off) SELECT thousand, tenthous FROM tenk1 WHERE thousand < 2 AND tenthous IN (1001,3000) ORDER BY thousand; - QUERY PLAN -------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------------------------- Index Only Scan using tenk1_thous_tenthous on tenk1 - Index Cond: (thousand < 2) - Filter: (tenthous = ANY ('{1001,3000}'::integer[])) -(3 rows) + Index Cond: ((thousand < 2) AND (tenthous = ANY ('{1001,3000}'::integer[]))) +(2 rows) SELECT thousand, tenthous FROM tenk1 WHERE thousand < 2 AND tenthous IN (1001,3000) @@ -1952,29 +1958,166 @@ ORDER BY thousand; 1 | 1001 (2 rows) -SET enable_indexonlyscan = OFF; +-- Non-required array scan key on "tenthous", backward scan: explain (costs off) SELECT thousand, tenthous FROM tenk1 WHERE thousand < 2 AND tenthous IN (1001,3000) -ORDER BY thousand; - QUERY PLAN --------------------------------------------------------------------------------------- - Sort - Sort Key: thousand - -> Index Scan using tenk1_thous_tenthous on tenk1 - Index Cond: ((thousand < 2) AND (tenthous = ANY ('{1001,3000}'::integer[]))) -(4 rows) +ORDER BY thousand DESC, tenthous DESC; + QUERY PLAN +-------------------------------------------------------------------------------- + Index Only Scan Backward using tenk1_thous_tenthous on tenk1 + Index Cond: ((thousand < 2) AND (tenthous = ANY ('{1001,3000}'::integer[]))) +(2 rows) SELECT thousand, tenthous FROM tenk1 WHERE thousand < 2 AND tenthous IN (1001,3000) -ORDER BY thousand; +ORDER BY thousand DESC, tenthous DESC; thousand | tenthous ----------+---------- - 0 | 3000 1 | 1001 + 0 | 3000 +(2 rows) + +-- +-- Check elimination of redundant and contradictory index quals +-- +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 = ANY('{7, 8, 9}'); + QUERY PLAN +---------------------------------------------------------------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: ((unique1 = ANY ('{1,42,7}'::integer[])) AND (unique1 = ANY ('{7,8,9}'::integer[]))) +(2 rows) + +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 = ANY('{7, 8, 9}'); + unique1 +--------- + 7 +(1 row) + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 = ANY('{7, 14, 22}') and unique1 = ANY('{33, 44}'::bigint[]); + QUERY PLAN +---------------------------------------------------------------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: ((unique1 = ANY ('{7,14,22}'::integer[])) AND (unique1 = ANY ('{33,44}'::bigint[]))) +(2 rows) + +SELECT unique1 FROM tenk1 WHERE unique1 = ANY('{7, 14, 22}') and unique1 = ANY('{33, 44}'::bigint[]); + unique1 +--------- +(0 rows) + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 = 1; + QUERY PLAN +--------------------------------------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: ((unique1 = ANY ('{1,42,7}'::integer[])) AND (unique1 = 1)) +(2 rows) + +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 = 1; + unique1 +--------- + 1 +(1 row) + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 = 12345; + QUERY PLAN +------------------------------------------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: ((unique1 = ANY ('{1,42,7}'::integer[])) AND (unique1 = 12345)) +(2 rows) + +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 = 12345; + unique1 +--------- +(0 rows) + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 >= 42; + QUERY PLAN +----------------------------------------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: ((unique1 = ANY ('{1,42,7}'::integer[])) AND (unique1 >= 42)) +(2 rows) + +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 >= 42; + unique1 +--------- + 42 +(1 row) + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 > 42; + QUERY PLAN +---------------------------------------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: ((unique1 = ANY ('{1,42,7}'::integer[])) AND (unique1 > 42)) +(2 rows) + +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 > 42; + unique1 +--------- +(0 rows) + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 > 9996 and unique1 >= 9999; + QUERY PLAN +-------------------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: ((unique1 > 9996) AND (unique1 >= 9999)) +(2 rows) + +SELECT unique1 FROM tenk1 WHERE unique1 > 9996 and unique1 >= 9999; + unique1 +--------- + 9999 +(1 row) + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 < 3 and unique1 <= 3; + QUERY PLAN +-------------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: ((unique1 < 3) AND (unique1 <= 3)) +(2 rows) + +SELECT unique1 FROM tenk1 WHERE unique1 < 3 and unique1 <= 3; + unique1 +--------- + 0 + 1 + 2 +(3 rows) + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 < 3 and unique1 < (-1)::bigint; + QUERY PLAN +------------------------------------------------------------ + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: ((unique1 < 3) AND (unique1 < '-1'::bigint)) (2 rows) -RESET enable_indexonlyscan; +SELECT unique1 FROM tenk1 WHERE unique1 < 3 and unique1 < (-1)::bigint; + unique1 +--------- +(0 rows) + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 < (-1)::bigint; + QUERY PLAN +-------------------------------------------------------------------------------------- + Index Only Scan using tenk1_unique1 on tenk1 + Index Cond: ((unique1 = ANY ('{1,42,7}'::integer[])) AND (unique1 < '-1'::bigint)) +(2 rows) + +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 < (-1)::bigint; + unique1 +--------- +(0 rows) + -- -- Check elimination of constant-NULL subexpressions -- @@ -2581,7 +2724,8 @@ DROP INDEX concur_reindex_ind5_ccnew; DELETE FROM concur_reindex_tab4 WHERE c1 = 1; -- The invalid index is not processed when running REINDEX TABLE. REINDEX TABLE CONCURRENTLY concur_reindex_tab4; -WARNING: cannot reindex invalid index "public.concur_reindex_ind5" concurrently, skipping +WARNING: skipping reindex of invalid index "public.concur_reindex_ind5" +HINT: Use DROP INDEX or REINDEX INDEX. NOTICE: table "concur_reindex_tab4" has no indexes that can be reindexed concurrently \d concur_reindex_tab4 Table "public.concur_reindex_tab4" @@ -2706,8 +2850,8 @@ SELECT attrelid::regclass, attnum, attstattarget attrelid | attnum | attstattarget ---------------------------+--------+--------------- concur_exprs_index_expr | 1 | 100 - concur_exprs_index_pred | 1 | -1 - concur_exprs_index_pred_2 | 1 | -1 + concur_exprs_index_pred | 1 | + concur_exprs_index_pred_2 | 1 | (3 rows) DROP TABLE concur_exprs_tab; diff --git a/src/test/regress/expected/create_operator.out b/src/test/regress/expected/create_operator.out index f71b601f2d2d4..d776d9c18c3a7 100644 --- a/src/test/regress/expected/create_operator.out +++ b/src/test/regress/expected/create_operator.out @@ -260,6 +260,50 @@ CREATE OPERATOR #*# ( ); ERROR: permission denied for type type_op6 ROLLBACK; +-- Should fail. An operator cannot be its own negator. +BEGIN TRANSACTION; +CREATE OPERATOR === ( + leftarg = integer, + rightarg = integer, + procedure = int4eq, + negator = === +); +ERROR: operator cannot be its own negator +ROLLBACK; +-- Should fail. An operator cannot be its own negator. Here we check that +-- this error is detected when replacing a shell operator. +BEGIN TRANSACTION; +-- create a shell operator for ===!!! by referencing it as a commutator +CREATE OPERATOR === ( + leftarg = integer, + rightarg = integer, + procedure = int4eq, + commutator = ===!!! +); +CREATE OPERATOR ===!!! ( + leftarg = integer, + rightarg = integer, + procedure = int4ne, + negator = ===!!! +); +ERROR: operator cannot be its own negator +ROLLBACK; +-- test that we can't use part of an existing commutator or negator pair +-- as a commutator or negator +CREATE OPERATOR === ( + leftarg = integer, + rightarg = integer, + procedure = int4eq, + commutator = = +); +ERROR: commutator operator = is already the commutator of operator = +CREATE OPERATOR === ( + leftarg = integer, + rightarg = integer, + procedure = int4eq, + negator = <> +); +ERROR: negator operator <> is already the negator of operator = -- invalid: non-lowercase quoted identifiers CREATE OPERATOR === ( diff --git a/src/test/regress/expected/create_procedure.out b/src/test/regress/expected/create_procedure.out index f2a677fa552a8..2177ba3509007 100644 --- a/src/test/regress/expected/create_procedure.out +++ b/src/test/regress/expected/create_procedure.out @@ -148,7 +148,19 @@ CALL ptest4a(a, b); -- error, not supported $$; ERROR: calling procedures with output arguments is not supported in SQL functions CONTEXT: SQL function "ptest4b" -DROP PROCEDURE ptest4a; +-- we used to get confused by a single output argument that is composite +CREATE PROCEDURE ptest4c(INOUT comp int8_tbl) +LANGUAGE SQL +AS $$ +SELECT ROW(1, 2); +$$; +CALL ptest4c(NULL); + comp +------- + (1,2) +(1 row) + +DROP PROCEDURE ptest4a, ptest4c; -- named and default parameters CREATE OR REPLACE PROCEDURE ptest5(a int, b text, c int default 100) LANGUAGE SQL @@ -181,6 +193,57 @@ AS $$ SELECT NULL::int; $$; CALL ptest6(1, 2); +CREATE PROCEDURE ptest6a(inout a anyelement, out b anyelement) +LANGUAGE SQL +AS $$ +SELECT $1, $1; +$$; +CALL ptest6a(1, null); + a | b +---+--- + 1 | 1 +(1 row) + +CALL ptest6a(1.1, null); + a | b +-----+----- + 1.1 | 1.1 +(1 row) + +CREATE PROCEDURE ptest6b(a anyelement, out b anyelement, out c anyarray) +LANGUAGE SQL +AS $$ +SELECT $1, array[$1]; +$$; +CALL ptest6b(1, null, null); + b | c +---+----- + 1 | {1} +(1 row) + +CALL ptest6b(1.1, null, null); + b | c +-----+------- + 1.1 | {1.1} +(1 row) + +CREATE PROCEDURE ptest6c(inout a anyelement, inout b anyelement) +LANGUAGE SQL +AS $$ +SELECT $1, 1; +$$; +CALL ptest6c(1, null); + a | b +---+--- + 1 | 1 +(1 row) + +CALL ptest6c(1.1, null); -- fails before v13 + a | b +-----+--- + 1.1 | 1 +(1 row) + -- collation assignment CREATE PROCEDURE ptest7(a text, b text) LANGUAGE SQL diff --git a/src/test/regress/expected/create_role.out b/src/test/regress/expected/create_role.out index 7117e943c2096..46d4f9efe997e 100644 --- a/src/test/regress/expected/create_role.out +++ b/src/test/regress/expected/create_role.out @@ -251,7 +251,8 @@ DROP INDEX tenant_idx; DROP TABLE tenant_table; DROP VIEW tenant_view; DROP SCHEMA regress_tenant2_schema; -DROP ROLE regress_tenant; +-- check for duplicated drop +DROP ROLE regress_tenant, regress_tenant; DROP ROLE regress_tenant2; DROP ROLE regress_rolecreator; DROP ROLE regress_role_admin; diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out index 5eace915a7971..284a7fb85c8f9 100644 --- a/src/test/regress/expected/create_table.out +++ b/src/test/regress/expected/create_table.out @@ -153,14 +153,6 @@ CREATE TABLE partitioned ( a2 int ) PARTITION BY LIST (a1, a2); -- fail ERROR: cannot use "list" partition strategy with more than one column --- unsupported constraint type for partitioned tables -CREATE TABLE partitioned ( - a int, - EXCLUDE USING gist (a WITH &&) -) PARTITION BY RANGE (a); -ERROR: exclusion constraints are not supported on partitioned tables -LINE 3: EXCLUDE USING gist (a WITH &&) - ^ -- prevent using prohibited expressions in the key CREATE FUNCTION retset (a int) RETURNS SETOF int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE; CREATE TABLE partitioned ( @@ -766,21 +758,21 @@ CREATE TABLE part_b PARTITION OF parted ( ) FOR VALUES IN ('b'); NOTICE: merging constraint "check_a" with inherited definition -- conislocal should be false for any merged constraints, true otherwise -SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass ORDER BY conislocal, coninhcount; - conislocal | coninhcount -------------+------------- - f | 1 - t | 0 +SELECT conname, conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass ORDER BY coninhcount DESC, conname; + conname | conislocal | coninhcount +---------+------------+------------- + check_a | f | 1 + check_b | t | 0 (2 rows) -- Once check_b is added to the parent, it should be made non-local for part_b ALTER TABLE parted ADD CONSTRAINT check_b CHECK (b >= 0); NOTICE: merging constraint "check_b" with inherited definition -SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass; - conislocal | coninhcount -------------+------------- - f | 1 - f | 1 +SELECT conname, conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass ORDER BY coninhcount DESC, conname; + conname | conislocal | coninhcount +---------+------------+------------- + check_a | f | 1 + check_b | f | 1 (2 rows) -- Neither check_a nor check_b are droppable from part_b @@ -792,9 +784,9 @@ ERROR: cannot drop inherited constraint "check_b" of relation "part_b" -- traditional inheritance where they will be left behind, because they would -- be local constraints. ALTER TABLE parted DROP CONSTRAINT check_a, DROP CONSTRAINT check_b; -SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass; - conislocal | coninhcount -------------+------------- +SELECT conname, conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass ORDER BY coninhcount DESC, conname; + conname | conislocal | coninhcount +---------+------------+------------- (0 rows) -- specify PARTITION BY for a partition @@ -990,7 +982,7 @@ DROP TABLE parted_col_comment; -- specifying storage parameters for partitioned tables is not supported CREATE TABLE parted_col_comment (a int, b text) PARTITION BY LIST (a) WITH (fillfactor=100); ERROR: cannot specify storage parameters for a partitioned table -HINT: Specify storage parameters for its leaf partitions, instead. +HINT: Specify storage parameters for its leaf partitions instead. -- list partitioning on array type column CREATE TABLE arrlp (a int[]) PARTITION BY LIST (a); CREATE TABLE arrlp12 PARTITION OF arrlp FOR VALUES IN ('{1}', '{2}'); diff --git a/src/test/regress/expected/create_table_like.out b/src/test/regress/expected/create_table_like.out index 0ed94f1d2fbd5..6bfc6d040ff8e 100644 --- a/src/test/regress/expected/create_table_like.out +++ b/src/test/regress/expected/create_table_like.out @@ -261,8 +261,23 @@ Check constraints: Inherits: test_like_5, test_like_5x +-- Test updating of column numbers in statistics expressions (bug #18468) +CREATE TABLE test_like_6 (a int, c text, b text); +CREATE STATISTICS ext_stat ON (a || b) FROM test_like_6; +ALTER TABLE test_like_6 DROP COLUMN c; +CREATE TABLE test_like_6c (LIKE test_like_6 INCLUDING ALL); +\d+ test_like_6c + Table "public.test_like_6c" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+----------+--------------+------------- + a | integer | | | | plain | | + b | text | | | | extended | | +Statistics objects: + "public.test_like_6c_expr_stat" ON (a || b) FROM test_like_6c + DROP TABLE test_like_4, test_like_4a, test_like_4b, test_like_4c, test_like_4d; DROP TABLE test_like_5, test_like_5x, test_like_5c; +DROP TABLE test_like_6, test_like_6c; CREATE TABLE inhg (x text, LIKE inhx INCLUDING INDEXES, y text); /* copies indexes */ INSERT INTO inhg VALUES (5, 10); INSERT INTO inhg VALUES (20, 10); -- should fail diff --git a/src/test/regress/expected/create_view.out b/src/test/regress/expected/create_view.out index 61825ef7d4ee1..f551624afb3a3 100644 --- a/src/test/regress/expected/create_view.out +++ b/src/test/regress/expected/create_view.out @@ -824,6 +824,54 @@ View definition: FROM temp_view_test.tx1 tx1_1 WHERE tx1.y1 = tx1_1.f1)); +-- Test correct deparsing of ORDER BY when there is an output name conflict +create view aliased_order_by as +select x1 as x2, x2 as x1, x3 from tt1 + order by x2; -- this is interpreted per SQL92, so really ordering by x1 +\d+ aliased_order_by + View "testviewschm2.aliased_order_by" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + x2 | integer | | | | plain | + x1 | integer | | | | plain | + x3 | text | | | | extended | +View definition: + SELECT x1 AS x2, + x2 AS x1, + x3 + FROM tt1 + ORDER BY tt1.x1; + +alter view aliased_order_by rename column x1 to x0; +\d+ aliased_order_by + View "testviewschm2.aliased_order_by" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + x2 | integer | | | | plain | + x0 | integer | | | | plain | + x3 | text | | | | extended | +View definition: + SELECT x1 AS x2, + x2 AS x0, + x3 + FROM tt1 + ORDER BY x1; + +alter view aliased_order_by rename column x3 to x1; +\d+ aliased_order_by + View "testviewschm2.aliased_order_by" + Column | Type | Collation | Nullable | Default | Storage | Description +--------+---------+-----------+----------+---------+----------+------------- + x2 | integer | | | | plain | + x0 | integer | | | | plain | + x1 | text | | | | extended | +View definition: + SELECT x1 AS x2, + x2 AS x0, + x3 AS x1 + FROM tt1 + ORDER BY tt1.x1; + -- Test aliasing of joins create view view_of_joins as select * from @@ -2202,6 +2250,21 @@ select pg_get_viewdef('tt26v', true); FROM ( VALUES (1,2,3)) v(x, y, z); (1 row) +-- test restriction on non-system view expansion. +create table tt27v_tbl (a int); +create view tt27v as select a from tt27v_tbl; +set restrict_nonsystem_relation_kind to 'view'; +select a from tt27v where a > 0; -- Error +ERROR: access to non-system view "tt27v" is restricted +insert into tt27v values (1); -- Error +ERROR: access to non-system view "tt27v" is restricted +select viewname from pg_views where viewname = 'tt27v'; -- Ok to access a system view. + viewname +---------- + tt27v +(1 row) + +reset restrict_nonsystem_relation_kind; -- clean up all the random objects we made above DROP SCHEMA temp_view_test CASCADE; NOTICE: drop cascades to 27 other objects @@ -2233,7 +2296,7 @@ drop cascades to view aliased_view_2 drop cascades to view aliased_view_3 drop cascades to view aliased_view_4 DROP SCHEMA testviewschm2 CASCADE; -NOTICE: drop cascades to 77 other objects +NOTICE: drop cascades to 80 other objects DETAIL: drop cascades to table t1 drop cascades to view temporal1 drop cascades to view temporal2 @@ -2260,6 +2323,7 @@ drop cascades to view mysecview9 drop cascades to view unspecified_types drop cascades to table tt1 drop cascades to table tx1 +drop cascades to view aliased_order_by drop cascades to view view_of_joins drop cascades to table tbl1a drop cascades to view view_of_joins_2a @@ -2311,3 +2375,5 @@ drop cascades to view tt23v drop cascades to view tt24v drop cascades to view tt25v drop cascades to view tt26v +drop cascades to table tt27v_tbl +drop cascades to view tt27v diff --git a/src/test/regress/expected/database.out b/src/test/regress/expected/database.out new file mode 100644 index 0000000000000..4cbdbdf84d0c5 --- /dev/null +++ b/src/test/regress/expected/database.out @@ -0,0 +1,21 @@ +CREATE DATABASE regression_tbd + ENCODING utf8 LC_COLLATE "C" LC_CTYPE "C" TEMPLATE template0; +ALTER DATABASE regression_tbd RENAME TO regression_utf8; +ALTER DATABASE regression_utf8 SET TABLESPACE regress_tblspace; +ALTER DATABASE regression_utf8 RESET TABLESPACE; +ALTER DATABASE regression_utf8 CONNECTION_LIMIT 123; +-- Test PgDatabaseToastTable. Doing this with GRANT would be slow. +BEGIN; +UPDATE pg_database +SET datacl = array_fill(makeaclitem(10, 10, 'USAGE', false), ARRAY[5e5::int]) +WHERE datname = 'regression_utf8'; +-- load catcache entry, if nothing else does +ALTER DATABASE regression_utf8 RESET TABLESPACE; +ROLLBACK; +CREATE ROLE regress_datdba_before; +CREATE ROLE regress_datdba_after; +ALTER DATABASE regression_utf8 OWNER TO regress_datdba_before; +REASSIGN OWNED BY regress_datdba_before TO regress_datdba_after; +DROP DATABASE regression_utf8; +DROP ROLE regress_datdba_before; +DROP ROLE regress_datdba_after; diff --git a/src/test/regress/expected/date.out b/src/test/regress/expected/date.out index f5949f3d174dd..20374c5230a7c 100644 --- a/src/test/regress/expected/date.out +++ b/src/test/regress/expected/date.out @@ -1295,7 +1295,7 @@ SELECT DATE_TRUNC('MILLENNIUM', TIMESTAMP '1970-03-20 04:30:00.00000'); -- 1001 SELECT DATE_TRUNC('MILLENNIUM', DATE '1970-03-20'); -- 1001-01-01 date_trunc ------------------------------ - Thu Jan 01 00:00:00 1001 PST + Thu Jan 01 00:00:00 1001 LMT (1 row) SELECT DATE_TRUNC('CENTURY', TIMESTAMP '1970-03-20 04:30:00.00000'); -- 1901 @@ -1319,13 +1319,13 @@ SELECT DATE_TRUNC('CENTURY', DATE '2004-08-10'); -- 2001-01-01 SELECT DATE_TRUNC('CENTURY', DATE '0002-02-04'); -- 0001-01-01 date_trunc ------------------------------ - Mon Jan 01 00:00:00 0001 PST + Mon Jan 01 00:00:00 0001 LMT (1 row) SELECT DATE_TRUNC('CENTURY', DATE '0055-08-10 BC'); -- 0100-01-01 BC date_trunc --------------------------------- - Tue Jan 01 00:00:00 0100 PST BC + Tue Jan 01 00:00:00 0100 LMT BC (1 row) SELECT DATE_TRUNC('DECADE', DATE '1993-12-25'); -- 1990-01-01 @@ -1337,13 +1337,13 @@ SELECT DATE_TRUNC('DECADE', DATE '1993-12-25'); -- 1990-01-01 SELECT DATE_TRUNC('DECADE', DATE '0004-12-25'); -- 0001-01-01 BC date_trunc --------------------------------- - Sat Jan 01 00:00:00 0001 PST BC + Sat Jan 01 00:00:00 0001 LMT BC (1 row) SELECT DATE_TRUNC('DECADE', DATE '0002-12-31 BC'); -- 0011-01-01 BC date_trunc --------------------------------- - Mon Jan 01 00:00:00 0011 PST BC + Mon Jan 01 00:00:00 0011 LMT BC (1 row) -- diff --git a/src/test/regress/expected/dbsize.out b/src/test/regress/expected/dbsize.out index f1121a87aa340..97c3bf54be554 100644 --- a/src/test/regress/expected/dbsize.out +++ b/src/test/regress/expected/dbsize.out @@ -79,6 +79,14 @@ SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM 11528652096115048448 | 10240 PB | -10240 PB (12 rows) +-- Ensure we get the expected results when passing the extremities of bigint +SELECT pg_size_pretty('-9223372036854775808'::bigint), + pg_size_pretty('9223372036854775807'::bigint); + pg_size_pretty | pg_size_pretty +----------------+---------------- + -8192 PB | 8192 PB +(1 row) + -- pg_size_bytes() tests SELECT size, pg_size_bytes(size) FROM (VALUES ('1'), ('123bytes'), ('256 B'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '), diff --git a/src/test/regress/expected/dependency.out b/src/test/regress/expected/dependency.out index 2b96720e29af1..74d9ff2998d7a 100644 --- a/src/test/regress/expected/dependency.out +++ b/src/test/regress/expected/dependency.out @@ -144,7 +144,6 @@ owner of sequence deptest_a_seq owner of table deptest owner of function deptest_func() owner of type deptest_enum -owner of type deptest_multirange owner of type deptest_range owner of table deptest2 owner of sequence ss1 diff --git a/src/test/regress/expected/domain.out b/src/test/regress/expected/domain.out index 6d94e84414a66..42b6559f9c897 100644 --- a/src/test/regress/expected/domain.out +++ b/src/test/regress/expected/domain.out @@ -743,6 +743,20 @@ update domnotnull set col1 = null; -- fails ERROR: domain dnotnulltest does not allow null values alter domain dnotnulltest drop not null; update domnotnull set col1 = null; +update domnotnull set col1 = 5; +-- these constraints can also be added and removed by name +alter domain dnotnulltest add constraint dnotnulltest_notnull not null; +update domnotnull set col1 = null; -- fails +ERROR: domain dnotnulltest does not allow null values +select conname, pg_get_constraintdef(oid) from pg_constraint + where contypid = 'dnotnulltest'::regtype; + conname | pg_get_constraintdef +----------------------+---------------------- + dnotnulltest_notnull | NOT NULL +(1 row) + +alter domain dnotnulltest drop constraint dnotnulltest_notnull; +update domnotnull set col1 = null; drop domain dnotnulltest cascade; NOTICE: drop cascades to 2 other objects DETAIL: drop cascades to column col2 of table domnotnull @@ -785,6 +799,13 @@ alter domain con add constraint t check (VALUE < 1); -- fails ERROR: column "col1" of table "domcontest" contains values that violate the new constraint alter domain con add constraint t check (VALUE < 34); alter domain con add check (VALUE > 0); +\dD con + List of domains + Schema | Name | Type | Collation | Nullable | Default | Check +--------+------+---------+-----------+----------+---------+-------------------------------------- + public | con | integer | | | | CHECK (VALUE > 0) CHECK (VALUE < 34) +(1 row) + insert into domcontest values (-5); -- fails ERROR: value for domain con violates check constraint "con_check" insert into domcontest values (42); -- fails @@ -798,6 +819,49 @@ alter domain con drop constraint nonexistent; ERROR: constraint "nonexistent" of domain "con" does not exist alter domain con drop constraint if exists nonexistent; NOTICE: constraint "nonexistent" of domain "con" does not exist, skipping +-- not-null constraints +create domain connotnull integer; +create table domconnotnulltest +( col1 connotnull +, col2 connotnull +); +insert into domconnotnulltest default values; +alter domain connotnull add not null; -- fails +ERROR: column "col1" of table "domconnotnulltest" contains null values +update domconnotnulltest set col1 = 5; +alter domain connotnull add not null; -- fails +ERROR: column "col2" of table "domconnotnulltest" contains null values +update domconnotnulltest set col2 = 6; +alter domain connotnull add constraint constr1 not null; +select count(*) from pg_constraint where contypid = 'connotnull'::regtype and contype = 'n'; + count +------- + 1 +(1 row) + +alter domain connotnull add constraint constr1bis not null; -- redundant +select count(*) from pg_constraint where contypid = 'connotnull'::regtype and contype = 'n'; + count +------- + 1 +(1 row) + +\dD connotnull + List of domains + Schema | Name | Type | Collation | Nullable | Default | Check +--------+------------+---------+-----------+----------+---------+------- + public | connotnull | integer | | not null | | +(1 row) + +update domconnotnulltest set col1 = null; -- fails +ERROR: domain connotnull does not allow null values +alter domain connotnull drop constraint constr1; +update domconnotnulltest set col1 = null; +drop domain connotnull cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to column col2 of table domconnotnulltest +drop cascades to column col1 of table domconnotnulltest +drop table domconnotnulltest; -- Test ALTER DOMAIN .. CONSTRAINT .. NOT VALID create domain things AS INT; CREATE TABLE thethings (stuff things); @@ -1207,3 +1271,77 @@ create domain testdomain1 as int constraint unsigned check (value > 0); alter domain testdomain1 rename constraint unsigned to unsigned_foo; alter domain testdomain1 drop constraint unsigned_foo; drop domain testdomain1; +-- +-- Get the base type of a domain +-- +create domain mytext as text; +create domain mytext_child_1 as mytext; +select pg_basetype('mytext'::regtype); + pg_basetype +------------- + text +(1 row) + +select pg_basetype('mytext_child_1'::regtype); + pg_basetype +------------- + text +(1 row) + +select pg_basetype(1); -- expect NULL not error + pg_basetype +------------- + +(1 row) + +drop domain mytext cascade; +NOTICE: drop cascades to type mytext_child_1 +-- +-- Information schema +-- +SELECT * FROM information_schema.column_domain_usage + WHERE domain_name IN ('con', 'dom', 'pos_int', 'things') + ORDER BY domain_name; + domain_catalog | domain_schema | domain_name | table_catalog | table_schema | table_name | column_name +----------------+---------------+-------------+---------------+--------------+------------+------------- + regression | public | con | regression | public | domcontest | col1 + regression | public | dom | regression | public | domview | col1 + regression | public | things | regression | public | thethings | stuff +(3 rows) + +SELECT * FROM information_schema.domain_constraints + WHERE domain_name IN ('con', 'dom', 'pos_int', 'things') + ORDER BY constraint_name; + constraint_catalog | constraint_schema | constraint_name | domain_catalog | domain_schema | domain_name | is_deferrable | initially_deferred +--------------------+-------------------+------------------+----------------+---------------+-------------+---------------+-------------------- + regression | public | con_check | regression | public | con | NO | NO + regression | public | meow | regression | public | things | NO | NO + regression | public | pos_int_check | regression | public | pos_int | NO | NO + regression | public | pos_int_not_null | regression | public | pos_int | NO | NO +(4 rows) + +SELECT * FROM information_schema.domains + WHERE domain_name IN ('con', 'dom', 'pos_int', 'things') + ORDER BY domain_name; + domain_catalog | domain_schema | domain_name | data_type | character_maximum_length | character_octet_length | character_set_catalog | character_set_schema | character_set_name | collation_catalog | collation_schema | collation_name | numeric_precision | numeric_precision_radix | numeric_scale | datetime_precision | interval_type | interval_precision | domain_default | udt_catalog | udt_schema | udt_name | scope_catalog | scope_schema | scope_name | maximum_cardinality | dtd_identifier +----------------+---------------+-------------+-----------+--------------------------+------------------------+-----------------------+----------------------+--------------------+-------------------+------------------+----------------+-------------------+-------------------------+---------------+--------------------+---------------+--------------------+----------------+-------------+------------+----------+---------------+--------------+------------+---------------------+---------------- + regression | public | con | integer | | | | | | | | | 32 | 2 | 0 | | | | | regression | pg_catalog | int4 | | | | | 1 + regression | public | dom | integer | | | | | | | | | 32 | 2 | 0 | | | | | regression | pg_catalog | int4 | | | | | 1 + regression | public | pos_int | integer | | | | | | | | | 32 | 2 | 0 | | | | | regression | pg_catalog | int4 | | | | | 1 + regression | public | things | integer | | | | | | | | | 32 | 2 | 0 | | | | | regression | pg_catalog | int4 | | | | | 1 +(4 rows) + +SELECT * FROM information_schema.check_constraints + WHERE (constraint_schema, constraint_name) + IN (SELECT constraint_schema, constraint_name + FROM information_schema.domain_constraints + WHERE domain_name IN ('con', 'dom', 'pos_int', 'things')) + ORDER BY constraint_name; + constraint_catalog | constraint_schema | constraint_name | check_clause +--------------------+-------------------+------------------+------------------- + regression | public | con_check | (VALUE > 0) + regression | public | meow | (VALUE < 11) + regression | public | pos_int_check | (VALUE > 0) + regression | public | pos_int_not_null | VALUE IS NOT NULL +(4 rows) + diff --git a/src/test/regress/expected/enum.out b/src/test/regress/expected/enum.out index 01159688e57ca..1d09c208bc903 100644 --- a/src/test/regress/expected/enum.out +++ b/src/test/regress/expected/enum.out @@ -684,16 +684,18 @@ select enum_range(null::bogon); (1 row) ROLLBACK; --- ideally, we'd allow this usage; but it requires keeping track of whether --- the enum type was created in the current transaction, which is expensive +-- we must allow this usage to support pg_dump in binary upgrade mode BEGIN; CREATE TYPE bogus AS ENUM('good'); ALTER TYPE bogus RENAME TO bogon; ALTER TYPE bogon ADD VALUE 'bad'; ALTER TYPE bogon ADD VALUE 'ugly'; -select enum_range(null::bogon); -- fails -ERROR: unsafe use of new value "bad" of enum type bogon -HINT: New enum values must be committed before they can be used. +select enum_range(null::bogon); + enum_range +----------------- + {good,bad,ugly} +(1 row) + ROLLBACK; -- -- Cleanup diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.out index 5a10958df529b..7b2198eac6f20 100644 --- a/src/test/regress/expected/event_trigger.out +++ b/src/test/regress/expected/event_trigger.out @@ -554,6 +554,110 @@ ERROR: cannot alter type "rewritetype" because column "rewritemetoo3.a" uses it drop table rewriteme; drop event trigger no_rewrite_allowed; drop function test_evtrig_no_rewrite(); +-- Tests for REINDEX +CREATE OR REPLACE FUNCTION reindex_start_command() +RETURNS event_trigger AS $$ +BEGIN + RAISE NOTICE 'REINDEX START: % %', tg_event, tg_tag; +END; +$$ LANGUAGE plpgsql; +CREATE EVENT TRIGGER regress_reindex_start ON ddl_command_start + WHEN TAG IN ('REINDEX') + EXECUTE PROCEDURE reindex_start_command(); +CREATE FUNCTION reindex_end_command() +RETURNS event_trigger AS $$ +DECLARE + obj record; +BEGIN + FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() + LOOP + RAISE NOTICE 'REINDEX END: command_tag=% type=% identity=%', + obj.command_tag, obj.object_type, obj.object_identity; + END LOOP; +END; +$$ LANGUAGE plpgsql; +CREATE EVENT TRIGGER regress_reindex_end ON ddl_command_end + WHEN TAG IN ('REINDEX') + EXECUTE PROCEDURE reindex_end_command(); +-- Extra event to force the use of a snapshot. +CREATE FUNCTION reindex_end_command_snap() RETURNS EVENT_TRIGGER + AS $$ BEGIN PERFORM 1; END $$ LANGUAGE plpgsql; +CREATE EVENT TRIGGER regress_reindex_end_snap ON ddl_command_end + EXECUTE FUNCTION reindex_end_command_snap(); +-- With simple relation +CREATE TABLE concur_reindex_tab (c1 int); +CREATE INDEX concur_reindex_ind ON concur_reindex_tab (c1); +-- Both start and end triggers enabled. +REINDEX INDEX concur_reindex_ind; +NOTICE: REINDEX START: ddl_command_start REINDEX +NOTICE: REINDEX END: command_tag=REINDEX type=index identity=public.concur_reindex_ind +REINDEX TABLE concur_reindex_tab; +NOTICE: REINDEX START: ddl_command_start REINDEX +NOTICE: REINDEX END: command_tag=REINDEX type=index identity=public.concur_reindex_ind +REINDEX INDEX CONCURRENTLY concur_reindex_ind; +NOTICE: REINDEX START: ddl_command_start REINDEX +NOTICE: REINDEX END: command_tag=REINDEX type=index identity=public.concur_reindex_ind +REINDEX TABLE CONCURRENTLY concur_reindex_tab; +NOTICE: REINDEX START: ddl_command_start REINDEX +NOTICE: REINDEX END: command_tag=REINDEX type=index identity=public.concur_reindex_ind +-- with start trigger disabled. +ALTER EVENT TRIGGER regress_reindex_start DISABLE; +REINDEX INDEX concur_reindex_ind; +NOTICE: REINDEX END: command_tag=REINDEX type=index identity=public.concur_reindex_ind +REINDEX INDEX CONCURRENTLY concur_reindex_ind; +NOTICE: REINDEX END: command_tag=REINDEX type=index identity=public.concur_reindex_ind +-- without an index +DROP INDEX concur_reindex_ind; +REINDEX TABLE concur_reindex_tab; +NOTICE: table "concur_reindex_tab" has no indexes to reindex +REINDEX TABLE CONCURRENTLY concur_reindex_tab; +NOTICE: table "concur_reindex_tab" has no indexes that can be reindexed concurrently +-- With a Schema +CREATE SCHEMA concur_reindex_schema; +-- No indexes +REINDEX SCHEMA concur_reindex_schema; +REINDEX SCHEMA CONCURRENTLY concur_reindex_schema; +CREATE TABLE concur_reindex_schema.tab (a int); +CREATE INDEX ind ON concur_reindex_schema.tab (a); +-- One index reported +REINDEX SCHEMA concur_reindex_schema; +NOTICE: REINDEX END: command_tag=REINDEX type=index identity=concur_reindex_schema.ind +REINDEX SCHEMA CONCURRENTLY concur_reindex_schema; +NOTICE: REINDEX END: command_tag=REINDEX type=index identity=concur_reindex_schema.ind +-- One table on schema but no indexes +DROP INDEX concur_reindex_schema.ind; +REINDEX SCHEMA concur_reindex_schema; +REINDEX SCHEMA CONCURRENTLY concur_reindex_schema; +DROP SCHEMA concur_reindex_schema CASCADE; +NOTICE: drop cascades to table concur_reindex_schema.tab +-- With a partitioned table, and nothing else. +CREATE TABLE concur_reindex_part (id int) PARTITION BY RANGE (id); +REINDEX TABLE concur_reindex_part; +REINDEX TABLE CONCURRENTLY concur_reindex_part; +-- Partition that would be reindexed, still nothing. +CREATE TABLE concur_reindex_child PARTITION OF concur_reindex_part + FOR VALUES FROM (0) TO (10); +REINDEX TABLE concur_reindex_part; +REINDEX TABLE CONCURRENTLY concur_reindex_part; +-- Now add some indexes. +CREATE INDEX concur_reindex_partidx ON concur_reindex_part (id); +REINDEX INDEX concur_reindex_partidx; +NOTICE: REINDEX END: command_tag=REINDEX type=index identity=public.concur_reindex_child_id_idx +REINDEX INDEX CONCURRENTLY concur_reindex_partidx; +NOTICE: REINDEX END: command_tag=REINDEX type=index identity=public.concur_reindex_child_id_idx +REINDEX TABLE concur_reindex_part; +NOTICE: REINDEX END: command_tag=REINDEX type=index identity=public.concur_reindex_child_id_idx +REINDEX TABLE CONCURRENTLY concur_reindex_part; +NOTICE: REINDEX END: command_tag=REINDEX type=index identity=public.concur_reindex_child_id_idx +DROP TABLE concur_reindex_part; +-- Clean up +DROP EVENT TRIGGER regress_reindex_start; +DROP EVENT TRIGGER regress_reindex_end; +DROP EVENT TRIGGER regress_reindex_end_snap; +DROP FUNCTION reindex_end_command(); +DROP FUNCTION reindex_end_command_snap(); +DROP FUNCTION reindex_start_command(); +DROP TABLE concur_reindex_tab; -- test Row Security Event Trigger RESET SESSION AUTHORIZATION; CREATE TABLE event_trigger_test (a integer, b text); @@ -614,3 +718,25 @@ SELECT DROP EVENT TRIGGER start_rls_command; DROP EVENT TRIGGER end_rls_command; DROP EVENT TRIGGER sql_drop_command; +-- Check the GUC for disabling event triggers +CREATE FUNCTION test_event_trigger_guc() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +DECLARE + obj record; +BEGIN + FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects() + LOOP + RAISE NOTICE '% dropped %', tg_tag, obj.object_type; + END LOOP; +END; +$$; +CREATE EVENT TRIGGER test_event_trigger_guc + ON sql_drop + WHEN TAG IN ('DROP POLICY') EXECUTE FUNCTION test_event_trigger_guc(); +SET event_triggers = 'on'; +CREATE POLICY pguc ON event_trigger_test USING (FALSE); +DROP POLICY pguc ON event_trigger_test; +NOTICE: DROP POLICY dropped policy +CREATE POLICY pguc ON event_trigger_test USING (FALSE); +SET event_triggers = 'off'; +DROP POLICY pguc ON event_trigger_test; diff --git a/src/test/regress/expected/event_trigger_login.out b/src/test/regress/expected/event_trigger_login.out new file mode 100644 index 0000000000000..4f43c2352f6a8 --- /dev/null +++ b/src/test/regress/expected/event_trigger_login.out @@ -0,0 +1,39 @@ +-- Login event triggers +CREATE TABLE user_logins(id serial, who text); +GRANT SELECT ON user_logins TO public; +CREATE FUNCTION on_login_proc() RETURNS event_trigger AS $$ +BEGIN + INSERT INTO user_logins (who) VALUES (SESSION_USER); + RAISE NOTICE 'You are welcome!'; +END; +$$ LANGUAGE plpgsql; +CREATE EVENT TRIGGER on_login_trigger ON login EXECUTE PROCEDURE on_login_proc(); +ALTER EVENT TRIGGER on_login_trigger ENABLE ALWAYS; +\c +NOTICE: You are welcome! +SELECT COUNT(*) FROM user_logins; + count +------- + 1 +(1 row) + +\c +NOTICE: You are welcome! +SELECT COUNT(*) FROM user_logins; + count +------- + 2 +(1 row) + +-- Check dathasloginevt in system catalog +SELECT dathasloginevt FROM pg_database WHERE datname= :'DBNAME'; + dathasloginevt +---------------- + t +(1 row) + +-- Cleanup +DROP TABLE user_logins; +DROP EVENT TRIGGER on_login_trigger; +DROP FUNCTION on_login_proc(); +\c diff --git a/src/test/regress/expected/explain.out b/src/test/regress/expected/explain.out index 1aca77491b98d..6585c6a69efe4 100644 --- a/src/test/regress/expected/explain.out +++ b/src/test/regress/expected/explain.out @@ -135,7 +135,7 @@ select explain_filter('explain (analyze, buffers, format xml) select * from int8 (1 row) -select explain_filter('explain (analyze, buffers, format yaml) select * from int8_tbl i8'); +select explain_filter('explain (analyze, serialize, buffers, format yaml) select * from int8_tbl i8'); explain_filter ------------------------------- - Plan: + @@ -175,6 +175,20 @@ select explain_filter('explain (analyze, buffers, format yaml) select * from int Temp Written Blocks: N + Planning Time: N.N + Triggers: + + Serialization: + + Time: N.N + + Output Volume: N + + Format: "text" + + Shared Hit Blocks: N + + Shared Read Blocks: N + + Shared Dirtied Blocks: N + + Shared Written Blocks: N + + Local Hit Blocks: N + + Local Read Blocks: N + + Local Dirtied Blocks: N + + Local Written Blocks: N + + Temp Read Blocks: N + + Temp Written Blocks: N + Execution Time: N.N (1 row) @@ -230,60 +244,64 @@ select explain_filter('explain (buffers, format json) select * from int8_tbl i8' -- but always set in JSON format, so check them only in this case. set track_io_timing = on; select explain_filter('explain (analyze, buffers, format json) select * from int8_tbl i8'); - explain_filter ------------------------------------- - [ + - { + - "Plan": { + - "Node Type": "Seq Scan", + - "Parallel Aware": false, + - "Async Capable": false, + - "Relation Name": "int8_tbl",+ - "Alias": "i8", + - "Startup Cost": N.N, + - "Total Cost": N.N, + - "Plan Rows": N, + - "Plan Width": N, + - "Actual Startup Time": N.N, + - "Actual Total Time": N.N, + - "Actual Rows": N, + - "Actual Loops": N, + - "Shared Hit Blocks": N, + - "Shared Read Blocks": N, + - "Shared Dirtied Blocks": N, + - "Shared Written Blocks": N, + - "Local Hit Blocks": N, + - "Local Read Blocks": N, + - "Local Dirtied Blocks": N, + - "Local Written Blocks": N, + - "Temp Read Blocks": N, + - "Temp Written Blocks": N, + - "I/O Read Time": N.N, + - "I/O Write Time": N.N, + - "Temp I/O Read Time": N.N, + - "Temp I/O Write Time": N.N + - }, + - "Planning": { + - "Shared Hit Blocks": N, + - "Shared Read Blocks": N, + - "Shared Dirtied Blocks": N, + - "Shared Written Blocks": N, + - "Local Hit Blocks": N, + - "Local Read Blocks": N, + - "Local Dirtied Blocks": N, + - "Local Written Blocks": N, + - "Temp Read Blocks": N, + - "Temp Written Blocks": N, + - "I/O Read Time": N.N, + - "I/O Write Time": N.N, + - "Temp I/O Read Time": N.N, + - "Temp I/O Write Time": N.N + - }, + - "Planning Time": N.N, + - "Triggers": [ + - ], + - "Execution Time": N.N + - } + + explain_filter +------------------------------------- + [ + + { + + "Plan": { + + "Node Type": "Seq Scan", + + "Parallel Aware": false, + + "Async Capable": false, + + "Relation Name": "int8_tbl", + + "Alias": "i8", + + "Startup Cost": N.N, + + "Total Cost": N.N, + + "Plan Rows": N, + + "Plan Width": N, + + "Actual Startup Time": N.N, + + "Actual Total Time": N.N, + + "Actual Rows": N, + + "Actual Loops": N, + + "Shared Hit Blocks": N, + + "Shared Read Blocks": N, + + "Shared Dirtied Blocks": N, + + "Shared Written Blocks": N, + + "Local Hit Blocks": N, + + "Local Read Blocks": N, + + "Local Dirtied Blocks": N, + + "Local Written Blocks": N, + + "Temp Read Blocks": N, + + "Temp Written Blocks": N, + + "Shared I/O Read Time": N.N, + + "Shared I/O Write Time": N.N,+ + "Local I/O Read Time": N.N, + + "Local I/O Write Time": N.N, + + "Temp I/O Read Time": N.N, + + "Temp I/O Write Time": N.N + + }, + + "Planning": { + + "Shared Hit Blocks": N, + + "Shared Read Blocks": N, + + "Shared Dirtied Blocks": N, + + "Shared Written Blocks": N, + + "Local Hit Blocks": N, + + "Local Read Blocks": N, + + "Local Dirtied Blocks": N, + + "Local Written Blocks": N, + + "Temp Read Blocks": N, + + "Temp Written Blocks": N, + + "Shared I/O Read Time": N.N, + + "Shared I/O Write Time": N.N,+ + "Local I/O Read Time": N.N, + + "Local I/O Write Time": N.N, + + "Temp I/O Read Time": N.N, + + "Temp I/O Write Time": N.N + + }, + + "Planning Time": N.N, + + "Triggers": [ + + ], + + "Execution Time": N.N + + } + ] (1 row) @@ -322,6 +340,82 @@ select explain_filter('explain (generic_plan) select unique1 from tenk1 where th select explain_filter('explain (analyze, generic_plan) select unique1 from tenk1 where thousand = $1'); ERROR: EXPLAIN options ANALYZE and GENERIC_PLAN cannot be used together CONTEXT: PL/pgSQL function explain_filter(text) line 5 at FOR over EXECUTE statement +-- MEMORY option +select explain_filter('explain (memory) select * from int8_tbl i8'); + explain_filter +--------------------------------------------------------- + Seq Scan on int8_tbl i8 (cost=N.N..N.N rows=N width=N) + Memory: used=NkB allocated=NkB +(2 rows) + +select explain_filter('explain (memory, analyze) select * from int8_tbl i8'); + explain_filter +----------------------------------------------------------------------------------------------- + Seq Scan on int8_tbl i8 (cost=N.N..N.N rows=N width=N) (actual time=N.N..N.N rows=N loops=N) + Memory: used=NkB allocated=NkB + Planning Time: N.N ms + Execution Time: N.N ms +(4 rows) + +select explain_filter('explain (memory, summary, format yaml) select * from int8_tbl i8'); + explain_filter +------------------------------- + - Plan: + + Node Type: "Seq Scan" + + Parallel Aware: false + + Async Capable: false + + Relation Name: "int8_tbl"+ + Alias: "i8" + + Startup Cost: N.N + + Total Cost: N.N + + Plan Rows: N + + Plan Width: N + + Planning: + + Memory Used: N + + Memory Allocated: N + + Planning Time: N.N +(1 row) + +select explain_filter('explain (memory, analyze, format json) select * from int8_tbl i8'); + explain_filter +------------------------------------ + [ + + { + + "Plan": { + + "Node Type": "Seq Scan", + + "Parallel Aware": false, + + "Async Capable": false, + + "Relation Name": "int8_tbl",+ + "Alias": "i8", + + "Startup Cost": N.N, + + "Total Cost": N.N, + + "Plan Rows": N, + + "Plan Width": N, + + "Actual Startup Time": N.N, + + "Actual Total Time": N.N, + + "Actual Rows": N, + + "Actual Loops": N + + }, + + "Planning": { + + "Memory Used": N, + + "Memory Allocated": N + + }, + + "Planning Time": N.N, + + "Triggers": [ + + ], + + "Execution Time": N.N + + } + + ] +(1 row) + +prepare int8_query as select * from int8_tbl i8; +select explain_filter('explain (memory) execute int8_query'); + explain_filter +--------------------------------------------------------- + Seq Scan on int8_tbl i8 (cost=N.N..N.N rows=N width=N) + Memory: used=NkB allocated=NkB +(2 rows) + -- Test EXPLAIN (GENERIC_PLAN) with partition pruning -- partitions should be pruned at plan time, based on constants, -- but there should be no pruning based on parameter placeholders @@ -559,3 +653,41 @@ select explain_filter('explain (verbose) select * from int8_tbl i8'); Query Identifier: N (3 rows) +-- Test SERIALIZE option +select explain_filter('explain (analyze,serialize) select * from int8_tbl i8'); + explain_filter +----------------------------------------------------------------------------------------------- + Seq Scan on int8_tbl i8 (cost=N.N..N.N rows=N width=N) (actual time=N.N..N.N rows=N loops=N) + Planning Time: N.N ms + Serialization: time=N.N ms output=NkB format=text + Execution Time: N.N ms +(4 rows) + +select explain_filter('explain (analyze,serialize text,buffers,timing off) select * from int8_tbl i8'); + explain_filter +--------------------------------------------------------------------------------- + Seq Scan on int8_tbl i8 (cost=N.N..N.N rows=N width=N) (actual rows=N loops=N) + Planning Time: N.N ms + Serialization: output=NkB format=text + Execution Time: N.N ms +(4 rows) + +select explain_filter('explain (analyze,serialize binary,buffers,timing) select * from int8_tbl i8'); + explain_filter +----------------------------------------------------------------------------------------------- + Seq Scan on int8_tbl i8 (cost=N.N..N.N rows=N width=N) (actual time=N.N..N.N rows=N loops=N) + Planning Time: N.N ms + Serialization: time=N.N ms output=NkB format=binary + Execution Time: N.N ms +(4 rows) + +-- this tests an edge case where we have no data to return +select explain_filter('explain (analyze,serialize) create temp table explain_temp as select * from int8_tbl i8'); + explain_filter +----------------------------------------------------------------------------------------------- + Seq Scan on int8_tbl i8 (cost=N.N..N.N rows=N width=N) (actual time=N.N..N.N rows=N loops=N) + Planning Time: N.N ms + Serialization: time=N.N ms output=NkB format=text + Execution Time: N.N ms +(4 rows) + diff --git a/src/test/regress/expected/fast_default.out b/src/test/regress/expected/fast_default.out index 91f25717b5a5b..3944812c298c2 100644 --- a/src/test/regress/expected/fast_default.out +++ b/src/test/regress/expected/fast_default.out @@ -245,6 +245,71 @@ SELECT comp(); (1 row) DROP TABLE T; +-- Test domains with default value for table rewrite. +CREATE DOMAIN domain1 AS int DEFAULT 11; -- constant +CREATE DOMAIN domain2 AS int DEFAULT random(min=>10, max=>100); -- volatile +CREATE DOMAIN domain3 AS text DEFAULT foo(4); -- stable +CREATE DOMAIN domain4 AS text[] + DEFAULT ('{"This", "is", "' || foo(4) || '","the", "real", "world"}')::TEXT[]; +CREATE TABLE t2 (a domain1); +INSERT INTO t2 VALUES (1),(2); +-- no table rewrite +ALTER TABLE t2 ADD COLUMN b domain1 default 3; +SELECT attnum, attname, atthasmissing, atthasdef, attmissingval +FROM pg_attribute +WHERE attnum > 0 AND attrelid = 't2'::regclass +ORDER BY attnum; + attnum | attname | atthasmissing | atthasdef | attmissingval +--------+---------+---------------+-----------+--------------- + 1 | a | f | f | + 2 | b | t | t | {3} +(2 rows) + +-- table rewrite should happen +ALTER TABLE t2 ADD COLUMN c domain3 default left(random()::text,3); +NOTICE: rewriting table t2 for reason 2 +-- no table rewrite +ALTER TABLE t2 ADD COLUMN d domain4; +SELECT attnum, attname, atthasmissing, atthasdef, attmissingval +FROM pg_attribute +WHERE attnum > 0 AND attrelid = 't2'::regclass +ORDER BY attnum; + attnum | attname | atthasmissing | atthasdef | attmissingval +--------+---------+---------------+-----------+----------------------------------- + 1 | a | f | f | + 2 | b | f | t | + 3 | c | f | t | + 4 | d | t | f | {"{This,is,abcd,the,real,world}"} +(4 rows) + +-- table rewrite should happen +ALTER TABLE t2 ADD COLUMN e domain2; +NOTICE: rewriting table t2 for reason 2 +SELECT attnum, attname, atthasmissing, atthasdef, attmissingval +FROM pg_attribute +WHERE attnum > 0 AND attrelid = 't2'::regclass +ORDER BY attnum; + attnum | attname | atthasmissing | atthasdef | attmissingval +--------+---------+---------------+-----------+--------------- + 1 | a | f | f | + 2 | b | f | t | + 3 | c | f | t | + 4 | d | f | f | + 5 | e | f | f | +(5 rows) + +SELECT a, b, length(c) = 3 as c_ok, d, e >= 10 as e_ok FROM t2; + a | b | c_ok | d | e_ok +---+---+------+-------------------------------+------ + 1 | 3 | t | {This,is,abcd,the,real,world} | t + 2 | 3 | t | {This,is,abcd,the,real,world} | t +(2 rows) + +DROP TABLE t2; +DROP DOMAIN domain1; +DROP DOMAIN domain2; +DROP DOMAIN domain3; +DROP DOMAIN domain4; DROP FUNCTION foo(INT); -- Fall back to full rewrite for volatile expressions CREATE TABLE T(pk INT NOT NULL PRIMARY KEY); @@ -272,7 +337,25 @@ SELECT comp(); Rewritten (1 row) +-- check that we notice insertion of a volatile default argument +CREATE FUNCTION foolme(timestamptz DEFAULT clock_timestamp()) + RETURNS timestamptz + IMMUTABLE AS 'select $1' LANGUAGE sql; +ALTER TABLE T ADD COLUMN c3 timestamptz DEFAULT foolme(); +NOTICE: rewriting table t for reason 2 +SELECT attname, atthasmissing, attmissingval FROM pg_attribute + WHERE attrelid = 't'::regclass AND attnum > 0 + ORDER BY attnum; + attname | atthasmissing | attmissingval +---------+---------------+--------------- + pk | f | + c1 | f | + c2 | f | + c3 | f | +(4 rows) + DROP TABLE T; +DROP FUNCTION foolme(timestamptz); -- Simple querie CREATE TABLE T (pk INT NOT NULL PRIMARY KEY); SELECT set('t'); diff --git a/src/test/regress/expected/foreign_data.out b/src/test/regress/expected/foreign_data.out index 5b30ee49f3ea6..6ed50fdcfa0bf 100644 --- a/src/test/regress/expected/foreign_data.out +++ b/src/test/regress/expected/foreign_data.out @@ -892,24 +892,29 @@ ERROR: column "no_column" of relation "ft1" does not exist ALTER FOREIGN TABLE ft1 DROP COLUMN IF EXISTS no_column; NOTICE: column "no_column" of relation "ft1" does not exist, skipping ALTER FOREIGN TABLE ft1 DROP COLUMN c9; +ALTER FOREIGN TABLE ft1 ADD COLUMN c11 serial; ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema; ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR ERROR: relation "ft1" does not exist +ALTER SEQUENCE foreign_schema.ft1_c11_seq SET SCHEMA public; -- ERROR +ERROR: cannot move an owned sequence into another schema +DETAIL: Sequence "ft1_c11_seq" is linked to table "ft1". ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1; ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1; \d foreign_schema.foreign_table_1 - Foreign table "foreign_schema.foreign_table_1" - Column | Type | Collation | Nullable | Default | FDW options -------------------+---------+-----------+----------+---------+-------------------------------- - foreign_column_1 | integer | | not null | | ("param 1" 'val1') - c2 | text | | | | (param2 'val2', param3 'val3') - c3 | date | | | | - c4 | integer | | | 0 | - c5 | integer | | | | - c6 | integer | | not null | | - c7 | integer | | | | (p1 'v1', p2 'v2') - c8 | text | | | | (p2 'V2') - c10 | integer | | | | (p1 'v1') + Foreign table "foreign_schema.foreign_table_1" + Column | Type | Collation | Nullable | Default | FDW options +------------------+---------+-----------+----------+-------------------------------------------------+-------------------------------- + foreign_column_1 | integer | | not null | | ("param 1" 'val1') + c2 | text | | | | (param2 'val2', param3 'val3') + c3 | date | | | | + c4 | integer | | | 0 | + c5 | integer | | | | + c6 | integer | | not null | | + c7 | integer | | | | (p1 'v1', p2 'v2') + c8 | text | | | | (p2 'V2') + c10 | integer | | | | (p1 'v1') + c11 | integer | | not null | nextval('foreign_schema.ft1_c11_seq'::regclass) | Check constraints: "ft1_c2_check" CHECK (c2 <> ''::text) "ft1_c3_check" CHECK (c3 >= '01-01-1994'::date AND c3 <= '01-31-1994'::date) diff --git a/src/test/regress/expected/foreign_key.out b/src/test/regress/expected/foreign_key.out index 55f7158c1aaab..8cbad245217ad 100644 --- a/src/test/regress/expected/foreign_key.out +++ b/src/test/regress/expected/foreign_key.out @@ -772,7 +772,8 @@ CREATE TABLE FKTABLE ( fk_id_del_set_null int, fk_id_del_set_default int DEFAULT 0, FOREIGN KEY (tid, fk_id_del_set_null) REFERENCES PKTABLE ON DELETE SET NULL (fk_id_del_set_null), - FOREIGN KEY (tid, fk_id_del_set_default) REFERENCES PKTABLE ON DELETE SET DEFAULT (fk_id_del_set_default) + -- this tests handling of duplicate entries in SET DEFAULT column list + FOREIGN KEY (tid, fk_id_del_set_default) REFERENCES PKTABLE ON DELETE SET DEFAULT (fk_id_del_set_default, fk_id_del_set_default) ); SELECT pg_get_constraintdef(oid) FROM pg_constraint WHERE conrelid = 'fktable'::regclass::oid ORDER BY oid; pg_get_constraintdef @@ -1278,11 +1279,15 @@ DETAIL: Key (fk)=(20) is not present in table "pktable". COMMIT; -- try additional syntax ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE; --- illegal option +-- illegal options ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE INITIALLY DEFERRED; ERROR: constraint declared INITIALLY DEFERRED must be DEFERRABLE LINE 1: ...e ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE INITIALLY ... ^ +ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NO INHERIT; +ERROR: FOREIGN KEY constraints cannot be marked NO INHERIT +ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT VALID; +ERROR: FOREIGN KEY constraints cannot be marked NOT VALID -- test order of firing of FK triggers when several RI-induced changes need to -- be made to the same row. This was broken by subtransaction-related -- changes in 8.0. @@ -1967,6 +1972,23 @@ INSERT INTO fk_notpartitioned_pk VALUES (1600, 601), (1600, 1601); ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_2 FOR VALUES IN (1600); -- leave these tables around intentionally +-- Verify that attaching a table that's referenced by an existing FK +-- in the parent throws an error +CREATE TABLE fk_partitioned_pk_6 (a int PRIMARY KEY); +CREATE TABLE fk_partitioned_fk_6 (a int REFERENCES fk_partitioned_pk_6) PARTITION BY LIST (a); +ALTER TABLE fk_partitioned_fk_6 ATTACH PARTITION fk_partitioned_pk_6 FOR VALUES IN (1); +ERROR: cannot attach table "fk_partitioned_pk_6" as a partition because it is referenced by foreign key "fk_partitioned_fk_6_a_fkey" +DROP TABLE fk_partitioned_pk_6, fk_partitioned_fk_6; +-- This case is similar to above, but the referenced relation is one level +-- lower in the hierarchy. This one fails in a different way as the above, +-- because we don't bother to protect against this case explicitly. If the +-- current error stops happening, we'll need to add a better protection. +CREATE TABLE fk_partitioned_pk_6 (a int PRIMARY KEY) PARTITION BY list (a); +CREATE TABLE fk_partitioned_pk_61 PARTITION OF fk_partitioned_pk_6 FOR VALUES IN (1); +CREATE TABLE fk_partitioned_fk_6 (a int REFERENCES fk_partitioned_pk_61) PARTITION BY LIST (a); +ALTER TABLE fk_partitioned_fk_6 ATTACH PARTITION fk_partitioned_pk_6 FOR VALUES IN (1); +ERROR: cannot ALTER TABLE "fk_partitioned_pk_61" because it is being used by active queries in this session +DROP TABLE fk_partitioned_pk_6, fk_partitioned_fk_6; -- test the case when the referenced table is owned by a different user create role regress_other_partitioned_fk_owner; grant references on fk_notpartitioned_pk to regress_other_partitioned_fk_owner; @@ -2020,58 +2042,90 @@ CREATE TABLE part33_self_fk ( id_abc bigint ); ALTER TABLE part3_self_fk ATTACH PARTITION part33_self_fk FOR VALUES FROM (30) TO (40); -SELECT cr.relname, co.conname, co.contype, co.convalidated, +-- verify that this constraint works +INSERT INTO parted_self_fk VALUES (1, NULL), (2, NULL), (3, NULL); +INSERT INTO parted_self_fk VALUES (10, 1), (11, 2), (12, 3) RETURNING tableoid::regclass; + tableoid +--------------- + part2_self_fk + part2_self_fk + part2_self_fk +(3 rows) + +INSERT INTO parted_self_fk VALUES (4, 5); -- error: referenced doesn't exist +ERROR: insert or update on table "part1_self_fk" violates foreign key constraint "parted_self_fk_id_abc_fkey" +DETAIL: Key (id_abc)=(5) is not present in table "parted_self_fk". +DELETE FROM parted_self_fk WHERE id = 1 RETURNING *; -- error: reference remains +ERROR: update or delete on table "part1_self_fk" violates foreign key constraint "parted_self_fk_id_abc_fkey1" on table "parted_self_fk" +DETAIL: Key (id)=(1) is still referenced from table "parted_self_fk". +SELECT cr.relname, co.conname, co.convalidated, p.conname AS conparent, p.convalidated, cf.relname AS foreignrel FROM pg_constraint co JOIN pg_class cr ON cr.oid = co.conrelid LEFT JOIN pg_class cf ON cf.oid = co.confrelid LEFT JOIN pg_constraint p ON p.oid = co.conparentid -WHERE cr.oid IN (SELECT relid FROM pg_partition_tree('parted_self_fk')) -ORDER BY co.contype, cr.relname, co.conname, p.conname; - relname | conname | contype | convalidated | conparent | convalidated | foreignrel -----------------+----------------------------+---------+--------------+----------------------------+--------------+---------------- - part1_self_fk | parted_self_fk_id_abc_fkey | f | t | parted_self_fk_id_abc_fkey | t | parted_self_fk - part2_self_fk | parted_self_fk_id_abc_fkey | f | t | parted_self_fk_id_abc_fkey | t | parted_self_fk - part32_self_fk | parted_self_fk_id_abc_fkey | f | t | parted_self_fk_id_abc_fkey | t | parted_self_fk - part33_self_fk | parted_self_fk_id_abc_fkey | f | t | parted_self_fk_id_abc_fkey | t | parted_self_fk - part3_self_fk | parted_self_fk_id_abc_fkey | f | t | parted_self_fk_id_abc_fkey | t | parted_self_fk - parted_self_fk | parted_self_fk_id_abc_fkey | f | t | | | parted_self_fk - part1_self_fk | part1_self_fk_pkey | p | t | parted_self_fk_pkey | t | - part2_self_fk | part2_self_fk_pkey | p | t | parted_self_fk_pkey | t | - part32_self_fk | part32_self_fk_pkey | p | t | part3_self_fk_pkey | t | - part33_self_fk | part33_self_fk_pkey | p | t | part3_self_fk_pkey | t | - part3_self_fk | part3_self_fk_pkey | p | t | parted_self_fk_pkey | t | - parted_self_fk | parted_self_fk_pkey | p | t | | | -(12 rows) +WHERE co.contype = 'f' AND + cr.oid IN (SELECT relid FROM pg_partition_tree('parted_self_fk')) +ORDER BY cr.relname, co.conname, p.conname; + relname | conname | convalidated | conparent | convalidated | foreignrel +----------------+-----------------------------+--------------+-----------------------------+--------------+---------------- + part1_self_fk | parted_self_fk_id_abc_fkey | t | parted_self_fk_id_abc_fkey | t | parted_self_fk + part2_self_fk | parted_self_fk_id_abc_fkey | t | parted_self_fk_id_abc_fkey | t | parted_self_fk + part32_self_fk | parted_self_fk_id_abc_fkey | t | parted_self_fk_id_abc_fkey | t | parted_self_fk + part33_self_fk | parted_self_fk_id_abc_fkey | t | parted_self_fk_id_abc_fkey | t | parted_self_fk + part3_self_fk | parted_self_fk_id_abc_fkey | t | parted_self_fk_id_abc_fkey | t | parted_self_fk + parted_self_fk | parted_self_fk_id_abc_fkey | t | | | parted_self_fk + parted_self_fk | parted_self_fk_id_abc_fkey1 | t | parted_self_fk_id_abc_fkey | t | part1_self_fk + parted_self_fk | parted_self_fk_id_abc_fkey2 | t | parted_self_fk_id_abc_fkey | t | part2_self_fk + parted_self_fk | parted_self_fk_id_abc_fkey3 | t | parted_self_fk_id_abc_fkey | t | part3_self_fk + parted_self_fk | parted_self_fk_id_abc_fkey4 | t | parted_self_fk_id_abc_fkey3 | t | part32_self_fk + parted_self_fk | parted_self_fk_id_abc_fkey5 | t | parted_self_fk_id_abc_fkey3 | t | part33_self_fk +(11 rows) -- detach and re-attach multiple times just to ensure everything is kosher ALTER TABLE parted_self_fk DETACH PARTITION part2_self_fk; +INSERT INTO part2_self_fk VALUES (16, 9); -- error: referenced doesn't exist +ERROR: insert or update on table "part2_self_fk" violates foreign key constraint "parted_self_fk_id_abc_fkey" +DETAIL: Key (id_abc)=(9) is not present in table "parted_self_fk". +DELETE FROM parted_self_fk WHERE id = 2 RETURNING *; -- error: reference remains +ERROR: update or delete on table "part1_self_fk" violates foreign key constraint "part2_self_fk_id_abc_fkey" on table "part2_self_fk" +DETAIL: Key (id)=(2) is still referenced from table "part2_self_fk". ALTER TABLE parted_self_fk ATTACH PARTITION part2_self_fk FOR VALUES FROM (10) TO (20); +INSERT INTO parted_self_fk VALUES (16, 9); -- error: referenced doesn't exist +ERROR: insert or update on table "part2_self_fk" violates foreign key constraint "parted_self_fk_id_abc_fkey" +DETAIL: Key (id_abc)=(9) is not present in table "parted_self_fk". +DELETE FROM parted_self_fk WHERE id = 3 RETURNING *; -- error: reference remains +ERROR: update or delete on table "part1_self_fk" violates foreign key constraint "parted_self_fk_id_abc_fkey1" on table "parted_self_fk" +DETAIL: Key (id)=(3) is still referenced from table "parted_self_fk". ALTER TABLE parted_self_fk DETACH PARTITION part2_self_fk; ALTER TABLE parted_self_fk ATTACH PARTITION part2_self_fk FOR VALUES FROM (10) TO (20); -SELECT cr.relname, co.conname, co.contype, co.convalidated, +ALTER TABLE parted_self_fk DETACH PARTITION part3_self_fk; +ALTER TABLE parted_self_fk ATTACH PARTITION part3_self_fk FOR VALUES FROM (30) TO (40); +ALTER TABLE part3_self_fk DETACH PARTITION part33_self_fk; +ALTER TABLE part3_self_fk ATTACH PARTITION part33_self_fk FOR VALUES FROM (30) TO (40); +SELECT cr.relname, co.conname, co.convalidated, p.conname AS conparent, p.convalidated, cf.relname AS foreignrel FROM pg_constraint co JOIN pg_class cr ON cr.oid = co.conrelid LEFT JOIN pg_class cf ON cf.oid = co.confrelid LEFT JOIN pg_constraint p ON p.oid = co.conparentid -WHERE cr.oid IN (SELECT relid FROM pg_partition_tree('parted_self_fk')) -ORDER BY co.contype, cr.relname, co.conname, p.conname; - relname | conname | contype | convalidated | conparent | convalidated | foreignrel -----------------+----------------------------+---------+--------------+----------------------------+--------------+---------------- - part1_self_fk | parted_self_fk_id_abc_fkey | f | t | parted_self_fk_id_abc_fkey | t | parted_self_fk - part2_self_fk | parted_self_fk_id_abc_fkey | f | t | parted_self_fk_id_abc_fkey | t | parted_self_fk - part32_self_fk | parted_self_fk_id_abc_fkey | f | t | parted_self_fk_id_abc_fkey | t | parted_self_fk - part33_self_fk | parted_self_fk_id_abc_fkey | f | t | parted_self_fk_id_abc_fkey | t | parted_self_fk - part3_self_fk | parted_self_fk_id_abc_fkey | f | t | parted_self_fk_id_abc_fkey | t | parted_self_fk - parted_self_fk | parted_self_fk_id_abc_fkey | f | t | | | parted_self_fk - part1_self_fk | part1_self_fk_pkey | p | t | parted_self_fk_pkey | t | - part2_self_fk | part2_self_fk_pkey | p | t | parted_self_fk_pkey | t | - part32_self_fk | part32_self_fk_pkey | p | t | part3_self_fk_pkey | t | - part33_self_fk | part33_self_fk_pkey | p | t | part3_self_fk_pkey | t | - part3_self_fk | part3_self_fk_pkey | p | t | parted_self_fk_pkey | t | - parted_self_fk | parted_self_fk_pkey | p | t | | | -(12 rows) +WHERE co.contype = 'f' AND + cr.oid IN (SELECT relid FROM pg_partition_tree('parted_self_fk')) +ORDER BY cr.relname, co.conname, p.conname; + relname | conname | convalidated | conparent | convalidated | foreignrel +----------------+-----------------------------+--------------+-----------------------------+--------------+---------------- + part1_self_fk | parted_self_fk_id_abc_fkey | t | parted_self_fk_id_abc_fkey | t | parted_self_fk + part2_self_fk | parted_self_fk_id_abc_fkey | t | parted_self_fk_id_abc_fkey | t | parted_self_fk + part32_self_fk | parted_self_fk_id_abc_fkey | t | parted_self_fk_id_abc_fkey | t | parted_self_fk + part33_self_fk | parted_self_fk_id_abc_fkey | t | parted_self_fk_id_abc_fkey | t | parted_self_fk + part3_self_fk | parted_self_fk_id_abc_fkey | t | parted_self_fk_id_abc_fkey | t | parted_self_fk + parted_self_fk | parted_self_fk_id_abc_fkey | t | | | parted_self_fk + parted_self_fk | parted_self_fk_id_abc_fkey1 | t | parted_self_fk_id_abc_fkey | t | part1_self_fk + parted_self_fk | parted_self_fk_id_abc_fkey2 | t | parted_self_fk_id_abc_fkey | t | part2_self_fk + parted_self_fk | parted_self_fk_id_abc_fkey3 | t | parted_self_fk_id_abc_fkey | t | part3_self_fk + parted_self_fk | parted_self_fk_id_abc_fkey4 | t | parted_self_fk_id_abc_fkey3 | t | part32_self_fk + parted_self_fk | parted_self_fk_id_abc_fkey5 | t | parted_self_fk_id_abc_fkey3 | t | part33_self_fk +(11 rows) -- Leave this table around, for pg_upgrade/pg_dump tests -- Test creating a constraint at the parent that already exists in partitions. @@ -2322,6 +2376,13 @@ UPDATE pk SET a = 4002 WHERE a = 4000; DELETE FROM pk WHERE a = 4002; UPDATE pk SET a = 4502 WHERE a = 4500; DELETE FROM pk WHERE a = 4502; +-- Also, detaching a partition that has the FK itself should work +-- https://postgr.es/m/CAAJ_b97GuPh6wQPbxQS-Zpy16Oh+0aMv-w64QcGrLhCOZZ6p+g@mail.gmail.com +CREATE TABLE ffk (a int, b int REFERENCES pk) PARTITION BY list (a); +CREATE TABLE ffk1 PARTITION OF ffk FOR VALUES IN (1); +ALTER TABLE ffk1 ADD FOREIGN KEY (a) REFERENCES pk; +ALTER TABLE ffk DETACH PARTITION ffk1; +DROP TABLE ffk, ffk1; CREATE SCHEMA fkpart4; SET search_path TO fkpart4; -- dropping/detaching PARTITIONs is prevented if that would break @@ -2498,7 +2559,7 @@ ALTER TABLE ref22 ALTER CONSTRAINT ref_f1_f2_fkey DEFERRABLE INITIALLY IMMEDIATE; -- fails ERROR: cannot alter constraint "ref_f1_f2_fkey" on relation "ref22" DETAIL: Constraint "ref_f1_f2_fkey" is derived from constraint "ref_f1_f2_fkey" of relation "ref". -HINT: You may alter the constraint it derives from, instead. +HINT: You may alter the constraint it derives from instead. ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey DEFERRABLE INITIALLY DEFERRED; BEGIN; @@ -2534,7 +2595,7 @@ ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey1 DEFERRABLE INITIALLY DEFERRED; -- fails ERROR: cannot alter constraint "ref_f1_f2_fkey1" on relation "ref" DETAIL: Constraint "ref_f1_f2_fkey1" is derived from constraint "ref_f1_f2_fkey" of relation "ref". -HINT: You may alter the constraint it derives from, instead. +HINT: You may alter the constraint it derives from instead. ALTER TABLE ref ALTER CONSTRAINT ref_f1_f2_fkey DEFERRABLE INITIALLY DEFERRED; INSERT INTO pt VALUES(1,2,3); @@ -2722,7 +2783,7 @@ UPDATE fkpart10.tbl1 SET f1 = 2 WHERE f1 = 1; INSERT INTO fkpart10.tbl1 VALUES (0), (1); COMMIT; -- test that cross-partition updates correctly enforces the foreign key --- restriction (specifically testing INITIAILLY DEFERRED) +-- restriction (specifically testing INITIALLY DEFERRED) BEGIN; UPDATE fkpart10.tbl1 SET f1 = 3 WHERE f1 = 0; UPDATE fkpart10.tbl3 SET f1 = f1 * -1; @@ -2917,3 +2978,102 @@ DETAIL: drop cascades to table fkpart11.pk drop cascades to table fkpart11.fk_parted drop cascades to table fkpart11.fk_another drop cascades to function fkpart11.print_row() +-- When a table is attached as partition to a partitioned table that has +-- a foreign key to another partitioned table, it acquires a clone of the +-- FK. Upon detach, this clone is not removed, but instead becomes an +-- independent FK. If it then attaches to the partitioned table again, +-- the FK from the parent "takes over" ownership of the independent FK rather +-- than creating a separate one. +CREATE SCHEMA fkpart12 + CREATE TABLE fk_p ( id int, jd int, PRIMARY KEY(id, jd)) PARTITION BY list (id) + CREATE TABLE fk_p_1 PARTITION OF fk_p FOR VALUES IN (1) PARTITION BY list (jd) + CREATE TABLE fk_p_1_1 PARTITION OF fk_p_1 FOR VALUES IN (1) + CREATE TABLE fk_p_1_2 (x int, y int, jd int NOT NULL, id int NOT NULL) + CREATE TABLE fk_p_2 PARTITION OF fk_p FOR VALUES IN (2) PARTITION BY list (jd) + CREATE TABLE fk_p_2_1 PARTITION OF fk_p_2 FOR VALUES IN (1) + CREATE TABLE fk_p_2_2 PARTITION OF fk_p_2 FOR VALUES IN (2) + CREATE TABLE fk_r_1 ( p_jd int NOT NULL, x int, id int PRIMARY KEY, p_id int NOT NULL) + CREATE TABLE fk_r_2 ( id int PRIMARY KEY, p_id int NOT NULL, p_jd int NOT NULL) PARTITION BY list (id) + CREATE TABLE fk_r_2_1 PARTITION OF fk_r_2 FOR VALUES IN (2, 1) + CREATE TABLE fk_r ( id int PRIMARY KEY, p_id int NOT NULL, p_jd int NOT NULL, + FOREIGN KEY (p_id, p_jd) REFERENCES fk_p (id, jd) + ) PARTITION BY list (id); +SET search_path TO fkpart12; +ALTER TABLE fk_p_1_2 DROP COLUMN x, DROP COLUMN y; +ALTER TABLE fk_p_1 ATTACH PARTITION fk_p_1_2 FOR VALUES IN (2); +ALTER TABLE fk_r_1 DROP COLUMN x; +INSERT INTO fk_p VALUES (1, 1); +ALTER TABLE fk_r ATTACH PARTITION fk_r_1 FOR VALUES IN (1); +ALTER TABLE fk_r ATTACH PARTITION fk_r_2 FOR VALUES IN (2); +\d fk_r_2 + Partitioned table "fkpart12.fk_r_2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | not null | + p_id | integer | | not null | + p_jd | integer | | not null | +Partition of: fk_r FOR VALUES IN (2) +Partition key: LIST (id) +Indexes: + "fk_r_2_pkey" PRIMARY KEY, btree (id) +Foreign-key constraints: + TABLE "fk_r" CONSTRAINT "fk_r_p_id_p_jd_fkey" FOREIGN KEY (p_id, p_jd) REFERENCES fk_p(id, jd) +Number of partitions: 1 (Use \d+ to list them.) + +INSERT INTO fk_r VALUES (1, 1, 1); +INSERT INTO fk_r VALUES (2, 2, 1); +ERROR: insert or update on table "fk_r_2_1" violates foreign key constraint "fk_r_p_id_p_jd_fkey" +DETAIL: Key (p_id, p_jd)=(2, 1) is not present in table "fk_p". +ALTER TABLE fk_r DETACH PARTITION fk_r_1; +ALTER TABLE fk_r DETACH PARTITION fk_r_2; +\d fk_r_2 + Partitioned table "fkpart12.fk_r_2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | not null | + p_id | integer | | not null | + p_jd | integer | | not null | +Partition key: LIST (id) +Indexes: + "fk_r_2_pkey" PRIMARY KEY, btree (id) +Foreign-key constraints: + "fk_r_p_id_p_jd_fkey" FOREIGN KEY (p_id, p_jd) REFERENCES fk_p(id, jd) +Number of partitions: 1 (Use \d+ to list them.) + +INSERT INTO fk_r_1 (id, p_id, p_jd) VALUES (2, 1, 2); -- should fail +ERROR: insert or update on table "fk_r_1" violates foreign key constraint "fk_r_p_id_p_jd_fkey" +DETAIL: Key (p_id, p_jd)=(1, 2) is not present in table "fk_p". +DELETE FROM fk_p; -- should fail +ERROR: update or delete on table "fk_p_1_1" violates foreign key constraint "fk_r_1_p_id_p_jd_fkey1" on table "fk_r_1" +DETAIL: Key (id, jd)=(1, 1) is still referenced from table "fk_r_1". +ALTER TABLE fk_r ATTACH PARTITION fk_r_1 FOR VALUES IN (1); +ALTER TABLE fk_r ATTACH PARTITION fk_r_2 FOR VALUES IN (2); +\d fk_r_2 + Partitioned table "fkpart12.fk_r_2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + id | integer | | not null | + p_id | integer | | not null | + p_jd | integer | | not null | +Partition of: fk_r FOR VALUES IN (2) +Partition key: LIST (id) +Indexes: + "fk_r_2_pkey" PRIMARY KEY, btree (id) +Foreign-key constraints: + TABLE "fk_r" CONSTRAINT "fk_r_p_id_p_jd_fkey" FOREIGN KEY (p_id, p_jd) REFERENCES fk_p(id, jd) +Number of partitions: 1 (Use \d+ to list them.) + +DELETE FROM fk_p; -- should fail +ERROR: update or delete on table "fk_p_1_1" violates foreign key constraint "fk_r_p_id_p_jd_fkey2" on table "fk_r" +DETAIL: Key (id, jd)=(1, 1) is still referenced from table "fk_r". +-- these should all fail +ALTER TABLE fk_r_1 DROP CONSTRAINT fk_r_p_id_p_jd_fkey; +ERROR: cannot drop inherited constraint "fk_r_p_id_p_jd_fkey" of relation "fk_r_1" +ALTER TABLE fk_r DROP CONSTRAINT fk_r_p_id_p_jd_fkey1; +ERROR: cannot drop inherited constraint "fk_r_p_id_p_jd_fkey1" of relation "fk_r" +ALTER TABLE fk_r_2 DROP CONSTRAINT fk_r_p_id_p_jd_fkey; +ERROR: cannot drop inherited constraint "fk_r_p_id_p_jd_fkey" of relation "fk_r_2" +SET client_min_messages TO warning; +DROP SCHEMA fkpart12 CASCADE; +RESET client_min_messages; +RESET search_path; diff --git a/src/test/regress/expected/generated.out b/src/test/regress/expected/generated.out index f5d802b9d14b1..a1f67abb688cf 100644 --- a/src/test/regress/expected/generated.out +++ b/src/test/regress/expected/generated.out @@ -61,6 +61,9 @@ LINE 1: ..._3 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (c * 2) STO... -- generation expression must be immutable CREATE TABLE gtest_err_4 (a int PRIMARY KEY, b double precision GENERATED ALWAYS AS (random()) STORED); ERROR: generation expression is not immutable +-- ... but be sure that the immutability test is accurate +CREATE TABLE gtest2 (a int, b text GENERATED ALWAYS AS (a || ' sec') STORED); +DROP TABLE gtest2; -- cannot have default/identity and generated CREATE TABLE gtest_err_5a (a int PRIMARY KEY, b int DEFAULT 5 GENERATED ALWAYS AS (a * 2) STORED); ERROR: both default and generation expression specified for column "b" of table "gtest_err_5a" @@ -573,6 +576,9 @@ INSERT INTO gtest20 (a) VALUES (10); -- ok INSERT INTO gtest20 (a) VALUES (30); -- violates constraint ERROR: new row for relation "gtest20" violates check constraint "gtest20_b_check" DETAIL: Failing row contains (30, 60). +ALTER TABLE gtest20 ALTER COLUMN b SET EXPRESSION AS (a * 100); -- violates constraint +ERROR: check constraint "gtest20_b_check" of relation "gtest20" is violated by some row +ALTER TABLE gtest20 ALTER COLUMN b SET EXPRESSION AS (a * 3); -- ok CREATE TABLE gtest20a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED); INSERT INTO gtest20a (a) VALUES (10); INSERT INTO gtest20a (a) VALUES (30); @@ -668,6 +674,47 @@ SELECT * FROM gtest22c WHERE a = 1 AND b > 0; 1 | 2 (1 row) +ALTER TABLE gtest22c ALTER COLUMN b SET EXPRESSION AS (a * 4); +ANALYZE gtest22c; +EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE b = 8; + QUERY PLAN +--------------------------------------------- + Index Scan using gtest22c_b_idx on gtest22c + Index Cond: (b = 8) +(2 rows) + +SELECT * FROM gtest22c WHERE b = 8; + a | b +---+--- + 2 | 8 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE b * 3 = 12; + QUERY PLAN +------------------------------------------------ + Index Scan using gtest22c_expr_idx on gtest22c + Index Cond: ((b * 3) = 12) +(2 rows) + +SELECT * FROM gtest22c WHERE b * 3 = 12; + a | b +---+--- + 1 | 4 +(1 row) + +EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE a = 1 AND b > 0; + QUERY PLAN +------------------------------------------------ + Index Scan using gtest22c_pred_idx on gtest22c + Index Cond: (a = 1) +(2 rows) + +SELECT * FROM gtest22c WHERE a = 1 AND b > 0; + a | b +---+--- + 1 | 4 +(1 row) + RESET enable_seqscan; RESET enable_bitmapscan; -- foreign keys @@ -693,6 +740,10 @@ INSERT INTO gtest23b VALUES (1); -- ok INSERT INTO gtest23b VALUES (5); -- error ERROR: insert or update on table "gtest23b" violates foreign key constraint "gtest23b_b_fkey" DETAIL: Key (b)=(10) is not present in table "gtest23a". +ALTER TABLE gtest23b ALTER COLUMN b SET EXPRESSION AS (a * 5); -- error +ERROR: insert or update on table "gtest23b" violates foreign key constraint "gtest23b_b_fkey" +DETAIL: Key (b)=(5) is not present in table "gtest23a". +ALTER TABLE gtest23b ALTER COLUMN b SET EXPRESSION AS (a * 1); -- ok DROP TABLE gtest23b; DROP TABLE gtest23a; CREATE TABLE gtest23p (x int, y int GENERATED ALWAYS AS (x * 2) STORED, PRIMARY KEY (y)); @@ -708,6 +759,11 @@ CREATE TABLE gtest24 (a int PRIMARY KEY, b gtestdomain1 GENERATED ALWAYS AS (a * INSERT INTO gtest24 (a) VALUES (4); -- ok INSERT INTO gtest24 (a) VALUES (6); -- error ERROR: value for domain gtestdomain1 violates check constraint "gtestdomain1_check" +CREATE DOMAIN gtestdomainnn AS int CHECK (VALUE IS NOT NULL); +CREATE TABLE gtest24nn (a int, b gtestdomainnn GENERATED ALWAYS AS (a * 2) STORED); +INSERT INTO gtest24nn (a) VALUES (4); -- ok +INSERT INTO gtest24nn (a) VALUES (NULL); -- error +ERROR: value for domain gtestdomainnn violates check constraint "gtestdomainnn_check" -- typed tables (currently not supported) CREATE TYPE gtest_type AS (f1 integer, f2 text, f3 bigint); CREATE TABLE gtest28 OF gtest_type (f1 WITH OPTIONS GENERATED ALWAYS AS (f2 *2) STORED); @@ -748,7 +804,8 @@ ERROR: column "f3" in child table must be a generated column DROP TABLE gtest_child3; CREATE TABLE gtest_child3 (f1 date NOT NULL, f2 bigint, f3 bigint GENERATED ALWAYS AS IDENTITY); ALTER TABLE gtest_parent ATTACH PARTITION gtest_child3 FOR VALUES FROM ('2016-09-01') TO ('2016-10-01'); -- error -ERROR: column "f3" in child table must be a generated column +ERROR: table "gtest_child3" being attached contains an identity column "f3" +DETAIL: The new partition may not contain an identity column. DROP TABLE gtest_child3; CREATE TABLE gtest_child3 (f1 date NOT NULL, f2 bigint, f3 bigint GENERATED ALWAYS AS (f2 * 33) STORED); ALTER TABLE gtest_parent ATTACH PARTITION gtest_child3 FOR VALUES FROM ('2016-09-01') TO ('2016-10-01'); @@ -780,30 +837,119 @@ Partition of: gtest_parent FOR VALUES FROM ('08-01-2016') TO ('09-01-2016') Partition of: gtest_parent FOR VALUES FROM ('09-01-2016') TO ('10-01-2016') INSERT INTO gtest_parent (f1, f2) VALUES ('2016-07-15', 1); -SELECT * FROM gtest_parent; - f1 | f2 | f3 -------------+----+---- - 07-15-2016 | 1 | 2 -(1 row) +INSERT INTO gtest_parent (f1, f2) VALUES ('2016-07-15', 2); +INSERT INTO gtest_parent (f1, f2) VALUES ('2016-08-15', 3); +SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3; + tableoid | f1 | f2 | f3 +--------------+------------+----+---- + gtest_child | 07-15-2016 | 1 | 2 + gtest_child | 07-15-2016 | 2 | 4 + gtest_child2 | 08-15-2016 | 3 | 66 +(3 rows) -SELECT * FROM gtest_child; - f1 | f2 | f3 -------------+----+---- - 07-15-2016 | 1 | 2 -(1 row) +UPDATE gtest_parent SET f1 = f1 + 60 WHERE f2 = 1; +SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3; + tableoid | f1 | f2 | f3 +--------------+------------+----+---- + gtest_child | 07-15-2016 | 2 | 4 + gtest_child2 | 08-15-2016 | 3 | 66 + gtest_child3 | 09-13-2016 | 1 | 33 +(3 rows) -UPDATE gtest_parent SET f1 = f1 + 60; -SELECT * FROM gtest_parent; - f1 | f2 | f3 -------------+----+---- - 09-13-2016 | 1 | 33 -(1 row) +-- alter only parent's and one child's generation expression +ALTER TABLE ONLY gtest_parent ALTER COLUMN f3 SET EXPRESSION AS (f2 * 4); +ALTER TABLE gtest_child ALTER COLUMN f3 SET EXPRESSION AS (f2 * 10); +\d gtest_parent + Partitioned table "public.gtest_parent" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+------------------------------------- + f1 | date | | not null | + f2 | bigint | | | + f3 | bigint | | | generated always as (f2 * 4) stored +Partition key: RANGE (f1) +Number of partitions: 3 (Use \d+ to list them.) -SELECT * FROM gtest_child3; - f1 | f2 | f3 -------------+----+---- - 09-13-2016 | 1 | 33 -(1 row) +\d gtest_child + Table "public.gtest_child" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+-------------------------------------- + f1 | date | | not null | + f2 | bigint | | | + f3 | bigint | | | generated always as (f2 * 10) stored +Partition of: gtest_parent FOR VALUES FROM ('07-01-2016') TO ('08-01-2016') + +\d gtest_child2 + Table "public.gtest_child2" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+-------------------------------------- + f1 | date | | not null | + f2 | bigint | | | + f3 | bigint | | | generated always as (f2 * 22) stored +Partition of: gtest_parent FOR VALUES FROM ('08-01-2016') TO ('09-01-2016') + +\d gtest_child3 + Table "public.gtest_child3" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+-------------------------------------- + f1 | date | | not null | + f2 | bigint | | | + f3 | bigint | | | generated always as (f2 * 33) stored +Partition of: gtest_parent FOR VALUES FROM ('09-01-2016') TO ('10-01-2016') + +SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3; + tableoid | f1 | f2 | f3 +--------------+------------+----+---- + gtest_child | 07-15-2016 | 2 | 20 + gtest_child2 | 08-15-2016 | 3 | 66 + gtest_child3 | 09-13-2016 | 1 | 33 +(3 rows) + +-- alter generation expression of parent and all its children altogether +ALTER TABLE gtest_parent ALTER COLUMN f3 SET EXPRESSION AS (f2 * 2); +\d gtest_parent + Partitioned table "public.gtest_parent" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+------------------------------------- + f1 | date | | not null | + f2 | bigint | | | + f3 | bigint | | | generated always as (f2 * 2) stored +Partition key: RANGE (f1) +Number of partitions: 3 (Use \d+ to list them.) + +\d gtest_child + Table "public.gtest_child" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+------------------------------------- + f1 | date | | not null | + f2 | bigint | | | + f3 | bigint | | | generated always as (f2 * 2) stored +Partition of: gtest_parent FOR VALUES FROM ('07-01-2016') TO ('08-01-2016') + +\d gtest_child2 + Table "public.gtest_child2" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+------------------------------------- + f1 | date | | not null | + f2 | bigint | | | + f3 | bigint | | | generated always as (f2 * 2) stored +Partition of: gtest_parent FOR VALUES FROM ('08-01-2016') TO ('09-01-2016') + +\d gtest_child3 + Table "public.gtest_child3" + Column | Type | Collation | Nullable | Default +--------+--------+-----------+----------+------------------------------------- + f1 | date | | not null | + f2 | bigint | | | + f3 | bigint | | | generated always as (f2 * 2) stored +Partition of: gtest_parent FOR VALUES FROM ('09-01-2016') TO ('10-01-2016') + +SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3; + tableoid | f1 | f2 | f3 +--------------+------------+----+---- + gtest_child | 07-15-2016 | 2 | 4 + gtest_child2 | 08-15-2016 | 3 | 6 + gtest_child3 | 09-13-2016 | 1 | 2 +(3 rows) -- we leave these tables around for purposes of testing dump/reload/upgrade -- generated columns in partition key (not allowed) @@ -820,7 +966,7 @@ DETAIL: Column "f3" is a generated column. -- ALTER TABLE ... ADD COLUMN CREATE TABLE gtest25 (a int PRIMARY KEY); INSERT INTO gtest25 VALUES (3), (4); -ALTER TABLE gtest25 ADD COLUMN b int GENERATED ALWAYS AS (a * 3) STORED; +ALTER TABLE gtest25 ADD COLUMN b int GENERATED ALWAYS AS (a * 2) STORED, ALTER COLUMN b SET EXPRESSION AS (a * 3); SELECT * FROM gtest25 ORDER BY a; a | b ---+---- @@ -885,7 +1031,8 @@ SELECT * FROM gtest27; (2 rows) ALTER TABLE gtest27 ALTER COLUMN x TYPE boolean USING x <> 0; -- error -ERROR: generation expression for column "x" cannot be cast automatically to type boolean +ERROR: cannot specify USING when altering type of generated column +DETAIL: Column "x" is a generated column. ALTER TABLE gtest27 ALTER COLUMN x DROP DEFAULT; -- error ERROR: column "x" of relation "gtest27" is a generated column HINT: Use ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION instead. @@ -930,18 +1077,50 @@ CREATE TABLE gtest29 ( b int GENERATED ALWAYS AS (a * 2) STORED ); INSERT INTO gtest29 (a) VALUES (3), (4); +SELECT * FROM gtest29; + a | b +---+--- + 3 | 6 + 4 | 8 +(2 rows) + +\d gtest29 + Table "public.gtest29" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + a | integer | | | + b | integer | | | generated always as (a * 2) stored + +ALTER TABLE gtest29 ALTER COLUMN a SET EXPRESSION AS (a * 3); -- error +ERROR: column "a" of relation "gtest29" is not a generated column ALTER TABLE gtest29 ALTER COLUMN a DROP EXPRESSION; -- error ERROR: column "a" of relation "gtest29" is not a stored generated column ALTER TABLE gtest29 ALTER COLUMN a DROP EXPRESSION IF EXISTS; -- notice NOTICE: column "a" of relation "gtest29" is not a stored generated column, skipping +-- Change the expression +ALTER TABLE gtest29 ALTER COLUMN b SET EXPRESSION AS (a * 3); +SELECT * FROM gtest29; + a | b +---+---- + 3 | 9 + 4 | 12 +(2 rows) + +\d gtest29 + Table "public.gtest29" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------------ + a | integer | | | + b | integer | | | generated always as (a * 3) stored + ALTER TABLE gtest29 ALTER COLUMN b DROP EXPRESSION; INSERT INTO gtest29 (a) VALUES (5); INSERT INTO gtest29 (a, b) VALUES (6, 66); SELECT * FROM gtest29; a | b ---+---- - 3 | 6 - 4 | 8 + 3 | 9 + 4 | 12 5 | 6 | 66 (4 rows) diff --git a/src/test/regress/expected/groupingsets.out b/src/test/regress/expected/groupingsets.out index a3b9aaca84cf4..e1f06608104e9 100644 --- a/src/test/regress/expected/groupingsets.out +++ b/src/test/regress/expected/groupingsets.out @@ -559,7 +559,7 @@ explain (costs off) QUERY PLAN ------------------------------------------------------------ Result - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Index Only Scan using tenk1_unique1 on tenk1 Index Cond: (unique1 IS NOT NULL) @@ -2109,14 +2109,14 @@ order by a, b, c; -- test handling of outer GroupingFunc within subqueries explain (costs off) select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1); - QUERY PLAN ---------------------------- + QUERY PLAN +------------------------------- MixedAggregate - Hash Key: $2 + Hash Key: (InitPlan 3).col1 Group Key: () - InitPlan 1 (returns $1) + InitPlan 1 -> Result - InitPlan 3 (returns $2) + InitPlan 3 -> Result -> Result SubPlan 2 @@ -2132,12 +2132,12 @@ select (select grouping(v1)) from (values ((select 1))) v(v1) group by cube(v1); explain (costs off) select (select grouping(v1)) from (values ((select 1))) v(v1) group by v1; - QUERY PLAN ---------------------------- + QUERY PLAN +---------------- GroupAggregate - InitPlan 1 (returns $1) + InitPlan 1 -> Result - InitPlan 3 (returns $2) + InitPlan 3 -> Result -> Result SubPlan 2 diff --git a/src/test/regress/expected/guc.out b/src/test/regress/expected/guc.out index 127c9532976c9..455b6d6c0ce54 100644 --- a/src/test/regress/expected/guc.out +++ b/src/test/regress/expected/guc.out @@ -510,7 +510,7 @@ SELECT '2006-08-13 12:34:56'::timestamptz; SET seq_page_cost TO 'NaN'; ERROR: invalid value for parameter "seq_page_cost": "NaN" SET vacuum_cost_delay TO '10s'; -ERROR: 10000 ms is outside the valid range for parameter "vacuum_cost_delay" (0 .. 100) +ERROR: 10000 ms is outside the valid range for parameter "vacuum_cost_delay" (0 ms .. 100 ms) SET no_such_variable TO 42; ERROR: unrecognized configuration parameter "no_such_variable" -- Test "custom" GUCs created on the fly (which aren't really an diff --git a/src/test/regress/expected/hash_func.out b/src/test/regress/expected/hash_func.out index 8e23dc3978369..2d625a247bb91 100644 --- a/src/test/regress/expected/hash_func.out +++ b/src/test/regress/expected/hash_func.out @@ -179,11 +179,11 @@ WHERE hash_array(v)::bit(32) != hash_array_extended(v, 0)::bit(32) -- array hashing with non-hashable element type SELECT v as value, hash_array(v)::bit(32) as standard -FROM (VALUES ('{0}'::money[])) x(v); -ERROR: could not identify a hash function for type money +FROM (VALUES ('{101}'::varbit[])) x(v); +ERROR: could not identify a hash function for type bit varying SELECT v as value, hash_array_extended(v, 0)::bit(32) as extended0 -FROM (VALUES ('{0}'::money[])) x(v); -ERROR: could not identify an extended hash function for type money +FROM (VALUES ('{101}'::varbit[])) x(v); +ERROR: could not identify an extended hash function for type bit varying SELECT v as value, hashbpchar(v)::bit(32) as standard, hashbpcharextended(v, 0)::bit(32) as extended0, hashbpcharextended(v, 1)::bit(32) as extended1 @@ -331,13 +331,13 @@ WHERE hash_record(v)::bit(32) != hash_record_extended(v, 0)::bit(32) DROP TYPE hash_test_t1; -- record hashing with non-hashable field type -CREATE TYPE hash_test_t2 AS (a money, b text); +CREATE TYPE hash_test_t2 AS (a varbit, b text); SELECT v as value, hash_record(v)::bit(32) as standard -FROM (VALUES (row(1, 'aaa')::hash_test_t2)) x(v); -ERROR: could not identify a hash function for type money +FROM (VALUES (row('10'::varbit, 'aaa')::hash_test_t2)) x(v); +ERROR: could not identify a hash function for type bit varying SELECT v as value, hash_record_extended(v, 0)::bit(32) as extended0 -FROM (VALUES (row(1, 'aaa')::hash_test_t2)) x(v); -ERROR: could not identify an extended hash function for type money +FROM (VALUES (row('11'::varbit, 'aaa')::hash_test_t2)) x(v); +ERROR: could not identify an extended hash function for type bit varying DROP TYPE hash_test_t2; -- -- Check special cases for specific data types diff --git a/src/test/regress/expected/hash_index.out b/src/test/regress/expected/hash_index.out index a2036a159721a..0d4bdb2adefae 100644 --- a/src/test/regress/expected/hash_index.out +++ b/src/test/regress/expected/hash_index.out @@ -271,6 +271,49 @@ ALTER INDEX hash_split_index SET (fillfactor = 10); REINDEX INDEX hash_split_index; -- Clean up. DROP TABLE hash_split_heap; +-- Testcases for removing overflow pages. +CREATE TABLE hash_cleanup_heap(keycol INT); +CREATE INDEX hash_cleanup_index on hash_cleanup_heap USING HASH (keycol); +-- Insert tuples to both the primary bucket page and overflow pages. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 500) as i; +-- Fill overflow pages by "dead" tuples. +BEGIN; +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 1000) as i; +ROLLBACK; +-- Checkpoint will ensure that all hash buffers are cleaned before we try +-- to remove overflow pages. +CHECKPOINT; +-- This will squeeze the bucket and remove overflow pages. +VACUUM hash_cleanup_heap; +TRUNCATE hash_cleanup_heap; +-- Insert a few tuples so that the primary bucket page doesn't get full and +-- tuples can be moved to it. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 50) as i; +-- Fill overflow pages by "dead" tuples. +BEGIN; +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 1500) as i; +ROLLBACK; +-- And insert some tuples again. During squeeze operation, these will be moved +-- to the primary bucket allowing to test freeing intermediate overflow pages. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 500) as i; +CHECKPOINT; +VACUUM hash_cleanup_heap; +TRUNCATE hash_cleanup_heap; +-- Insert tuples to both the primary bucket page and overflow pages. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 500) as i; +-- Fill overflow pages by "dead" tuples. +BEGIN; +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 1500) as i; +ROLLBACK; +-- And insert some tuples again. During squeeze operation, these will be moved +-- to other overflow pages and also allow overflow pages filled by dead tuples +-- to be freed. Note the main purpose of this test is to test the case where +-- we don't need to move any tuple from the overflow page being freed. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 50) as i; +CHECKPOINT; +VACUUM hash_cleanup_heap; +-- Clean up. +DROP TABLE hash_cleanup_heap; -- Index on temp table. CREATE TEMP TABLE hash_temp_heap (x int, y int); INSERT INTO hash_temp_heap VALUES (1,1); diff --git a/src/test/regress/expected/hash_part.out b/src/test/regress/expected/hash_part.out index ac3aabee0286a..cb39161f86722 100644 --- a/src/test/regress/expected/hash_part.out +++ b/src/test/regress/expected/hash_part.out @@ -3,7 +3,7 @@ -- -- Use hand-rolled hash functions and operator classes to get predictable -- result on different machines. See the definitions of --- part_part_test_int4_ops and part_test_text_ops in insert.sql. +-- part_test_int4_ops and part_test_text_ops in test_setup.sql. CREATE TABLE mchash (a int, b text, c jsonb) PARTITION BY HASH (a part_test_int4_ops, b part_test_text_ops); CREATE TABLE mchash1 diff --git a/src/test/regress/expected/horology.out b/src/test/regress/expected/horology.out index e63e5b30fee8e..12eefb09d4d69 100644 --- a/src/test/regress/expected/horology.out +++ b/src/test/regress/expected/horology.out @@ -1,11 +1,16 @@ -- -- HOROLOGY -- -SET DateStyle = 'Postgres, MDY'; -SHOW TimeZone; -- Many of these tests depend on the prevailing setting - TimeZone ----------- - PST8PDT +SHOW TimeZone; -- Many of these tests depend on the prevailing settings + TimeZone +--------------------- + America/Los_Angeles +(1 row) + +SHOW DateStyle; + DateStyle +--------------- + Postgres, MDY (1 row) -- @@ -274,6 +279,161 @@ SELECT time with time zone 'J2452271 T040506.789 America/Los_Angeles'; 04:05:06.789-08 (1 row) +-- Check time formats required by ISO 8601 +SELECT time without time zone '040506.07'; + time +------------- + 04:05:06.07 +(1 row) + +SELECT time without time zone '04:05:06.07'; + time +------------- + 04:05:06.07 +(1 row) + +SELECT time without time zone '040506'; + time +---------- + 04:05:06 +(1 row) + +SELECT time without time zone '04:05:06'; + time +---------- + 04:05:06 +(1 row) + +SELECT time without time zone '0405'; + time +---------- + 04:05:00 +(1 row) + +SELECT time without time zone '04:05'; + time +---------- + 04:05:00 +(1 row) + +SELECT time without time zone 'T040506.07'; + time +------------- + 04:05:06.07 +(1 row) + +SELECT time without time zone 'T04:05:06.07'; + time +------------- + 04:05:06.07 +(1 row) + +SELECT time without time zone 'T040506'; + time +---------- + 04:05:06 +(1 row) + +SELECT time without time zone 'T04:05:06'; + time +---------- + 04:05:06 +(1 row) + +SELECT time without time zone 'T0405'; + time +---------- + 04:05:00 +(1 row) + +SELECT time without time zone 'T04:05'; + time +---------- + 04:05:00 +(1 row) + +-- 8601 says "Thh" is allowed, but we intentionally reject it as too vague +SELECT time without time zone 'T04'; +ERROR: invalid input syntax for type time: "T04" +LINE 1: SELECT time without time zone 'T04'; + ^ +SELECT time with time zone '040506.07+08'; + timetz +---------------- + 04:05:06.07+08 +(1 row) + +SELECT time with time zone '04:05:06.07+08'; + timetz +---------------- + 04:05:06.07+08 +(1 row) + +SELECT time with time zone '040506+08'; + timetz +------------- + 04:05:06+08 +(1 row) + +SELECT time with time zone '04:05:06+08'; + timetz +------------- + 04:05:06+08 +(1 row) + +SELECT time with time zone '0405+08'; + timetz +------------- + 04:05:00+08 +(1 row) + +SELECT time with time zone '04:05+08'; + timetz +------------- + 04:05:00+08 +(1 row) + +SELECT time with time zone 'T040506.07+08'; + timetz +---------------- + 04:05:06.07+08 +(1 row) + +SELECT time with time zone 'T04:05:06.07+08'; + timetz +---------------- + 04:05:06.07+08 +(1 row) + +SELECT time with time zone 'T040506+08'; + timetz +------------- + 04:05:06+08 +(1 row) + +SELECT time with time zone 'T04:05:06+08'; + timetz +------------- + 04:05:06+08 +(1 row) + +SELECT time with time zone 'T0405+08'; + timetz +------------- + 04:05:00+08 +(1 row) + +SELECT time with time zone 'T04:05+08'; + timetz +------------- + 04:05:00+08 +(1 row) + +-- 8601 says "Thh" is allowed, but we intentionally reject it as too vague +SELECT time with time zone 'T04+08'; +ERROR: invalid input syntax for type time with time zone: "T04+08" +LINE 1: SELECT time with time zone 'T04+08'; + ^ SET DateStyle = 'Postgres, MDY'; -- Check Julian dates BC SELECT date 'J1520447' AS "Confucius' Birthday"; @@ -482,6 +642,10 @@ SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '109203489 days' Sun Dec 31 00:00:00 294276 (1 row) +SELECT timestamp without time zone '2000-01-01' - interval '2483590 days' AS "out of range"; +ERROR: timestamp out of range +SELECT timestamp without time zone '294276-12-31 23:59:59' + interval '9223372036854775807 microseconds' AS "out of range"; +ERROR: timestamp out of range SELECT timestamp without time zone '12/31/294276' - timestamp without time zone '12/23/1999' AS "106751991 Days"; 106751991 Days ------------------ @@ -742,6 +906,10 @@ SELECT timestamp with time zone '1999-12-01' + interval '1 month - 1 second' AS Fri Dec 31 23:59:59 1999 PST (1 row) +SELECT timestamp with time zone '2000-01-01' - interval '2483590 days' AS "out of range"; +ERROR: timestamp out of range +SELECT timestamp with time zone '294276-12-31 23:59:59 UTC' + interval '9223372036854775807 microseconds' AS "out of range"; +ERROR: timestamp out of range SELECT (timestamp with time zone 'today' = (timestamp with time zone 'yesterday' + interval '1 day')) as "True"; True ------ @@ -870,12 +1038,12 @@ SELECT d1 + interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; Sat Feb 14 17:32:01 1998 PST Sun Feb 15 17:32:01 1998 PST Mon Feb 16 17:32:01 1998 PST - Thu Feb 16 17:32:01 0096 PST BC - Sun Feb 16 17:32:01 0098 PST - Fri Feb 16 17:32:01 0598 PST - Wed Feb 16 17:32:01 1098 PST - Sun Feb 16 17:32:01 1698 PST - Fri Feb 16 17:32:01 1798 PST + Thu Feb 16 17:32:01 0096 LMT BC + Sun Feb 16 17:32:01 0098 LMT + Fri Feb 16 17:32:01 0598 LMT + Wed Feb 16 17:32:01 1098 LMT + Sun Feb 16 17:32:01 1698 LMT + Fri Feb 16 17:32:01 1798 LMT Wed Feb 16 17:32:01 1898 PST Mon Feb 16 17:32:01 1998 PST Sun Feb 16 17:32:01 2098 PST @@ -941,12 +1109,12 @@ SELECT d1 - interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; Wed Feb 14 17:32:01 1996 PST Thu Feb 15 17:32:01 1996 PST Fri Feb 16 17:32:01 1996 PST - Mon Feb 16 17:32:01 0098 PST BC - Thu Feb 16 17:32:01 0096 PST - Tue Feb 16 17:32:01 0596 PST - Sun Feb 16 17:32:01 1096 PST - Thu Feb 16 17:32:01 1696 PST - Tue Feb 16 17:32:01 1796 PST + Mon Feb 16 17:32:01 0098 LMT BC + Thu Feb 16 17:32:01 0096 LMT + Tue Feb 16 17:32:01 0596 LMT + Sun Feb 16 17:32:01 1096 LMT + Thu Feb 16 17:32:01 1696 LMT + Tue Feb 16 17:32:01 1796 LMT Sun Feb 16 17:32:01 1896 PST Fri Feb 16 17:32:01 1996 PST Thu Feb 16 17:32:01 2096 PST @@ -981,6 +1149,18 @@ SELECT CAST(interval '02:03' AS time) AS "02:03:00"; 02:03:00 (1 row) +SELECT CAST(interval '-02:03' AS time) AS "21:57:00"; + 21:57:00 +---------- + 21:57:00 +(1 row) + +SELECT CAST(interval '-9223372022400000000 us' AS time) AS "00:00:00"; + 00:00:00 +---------- + 00:00:00 +(1 row) + SELECT time '01:30' + interval '02:01' AS "03:31:00"; 03:31:00 ---------- @@ -1159,6 +1339,7 @@ SELECT t.d1 AS t, i.f1 AS i, t.d1 + i.f1 AS "add", t.d1 - i.f1 AS "subtract" SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract" FROM TIME_TBL t, INTERVAL_TBL i + WHERE isfinite(i.f1) ORDER BY 1,2; t | i | add | subtract -------------+-------------------------------+-------------+------------- @@ -1266,6 +1447,7 @@ SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract" SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract" FROM TIMETZ_TBL t, INTERVAL_TBL i + WHERE isfinite(i.f1) ORDER BY 1,2; t | i | add | subtract ----------------+-------------------------------+----------------+---------------- @@ -1544,6 +1726,22 @@ SELECT d.f1 AS "timestamp", t.f1 AS "interval", d.f1 + t.f1 AS plus ORDER BY plus, "timestamp", "interval"; timestamp | interval | plus ------------------------------+-------------------------------+------------------------------ + Thu Jan 01 00:00:00 1970 PST | -infinity | -infinity + Wed Feb 28 17:32:01 1996 PST | -infinity | -infinity + Thu Feb 29 17:32:01 1996 PST | -infinity | -infinity + Fri Mar 01 17:32:01 1996 PST | -infinity | -infinity + Mon Dec 30 17:32:01 1996 PST | -infinity | -infinity + Tue Dec 31 17:32:01 1996 PST | -infinity | -infinity + Fri Dec 31 17:32:01 1999 PST | -infinity | -infinity + Sat Jan 01 17:32:01 2000 PST | -infinity | -infinity + Wed Mar 15 02:14:05 2000 PST | -infinity | -infinity + Wed Mar 15 03:14:04 2000 PST | -infinity | -infinity + Wed Mar 15 08:14:01 2000 PST | -infinity | -infinity + Wed Mar 15 12:14:03 2000 PST | -infinity | -infinity + Wed Mar 15 13:14:02 2000 PST | -infinity | -infinity + Sun Dec 31 17:32:01 2000 PST | -infinity | -infinity + Mon Jan 01 17:32:01 2001 PST | -infinity | -infinity + Sat Sep 22 18:19:20 2001 PDT | -infinity | -infinity Thu Jan 01 00:00:00 1970 PST | @ 14 secs ago | Wed Dec 31 23:59:46 1969 PST Thu Jan 01 00:00:00 1970 PST | @ 1 min | Thu Jan 01 00:01:00 1970 PST Thu Jan 01 00:00:00 1970 PST | @ 5 hours | Thu Jan 01 05:00:00 1970 PST @@ -1704,14 +1902,45 @@ SELECT d.f1 AS "timestamp", t.f1 AS "interval", d.f1 + t.f1 AS plus Sun Dec 31 17:32:01 2000 PST | @ 34 years | Sun Dec 31 17:32:01 2034 PST Mon Jan 01 17:32:01 2001 PST | @ 34 years | Mon Jan 01 17:32:01 2035 PST Sat Sep 22 18:19:20 2001 PDT | @ 34 years | Sat Sep 22 18:19:20 2035 PDT -(160 rows) + Thu Jan 01 00:00:00 1970 PST | infinity | infinity + Wed Feb 28 17:32:01 1996 PST | infinity | infinity + Thu Feb 29 17:32:01 1996 PST | infinity | infinity + Fri Mar 01 17:32:01 1996 PST | infinity | infinity + Mon Dec 30 17:32:01 1996 PST | infinity | infinity + Tue Dec 31 17:32:01 1996 PST | infinity | infinity + Fri Dec 31 17:32:01 1999 PST | infinity | infinity + Sat Jan 01 17:32:01 2000 PST | infinity | infinity + Wed Mar 15 02:14:05 2000 PST | infinity | infinity + Wed Mar 15 03:14:04 2000 PST | infinity | infinity + Wed Mar 15 08:14:01 2000 PST | infinity | infinity + Wed Mar 15 12:14:03 2000 PST | infinity | infinity + Wed Mar 15 13:14:02 2000 PST | infinity | infinity + Sun Dec 31 17:32:01 2000 PST | infinity | infinity + Mon Jan 01 17:32:01 2001 PST | infinity | infinity + Sat Sep 22 18:19:20 2001 PDT | infinity | infinity +(192 rows) SELECT d.f1 AS "timestamp", t.f1 AS "interval", d.f1 - t.f1 AS minus FROM TEMP_TIMESTAMP d, INTERVAL_TBL t - WHERE isfinite(d.f1) ORDER BY minus, "timestamp", "interval"; timestamp | interval | minus ------------------------------+-------------------------------+------------------------------ + Thu Jan 01 00:00:00 1970 PST | infinity | -infinity + Wed Feb 28 17:32:01 1996 PST | infinity | -infinity + Thu Feb 29 17:32:01 1996 PST | infinity | -infinity + Fri Mar 01 17:32:01 1996 PST | infinity | -infinity + Mon Dec 30 17:32:01 1996 PST | infinity | -infinity + Tue Dec 31 17:32:01 1996 PST | infinity | -infinity + Fri Dec 31 17:32:01 1999 PST | infinity | -infinity + Sat Jan 01 17:32:01 2000 PST | infinity | -infinity + Wed Mar 15 02:14:05 2000 PST | infinity | -infinity + Wed Mar 15 03:14:04 2000 PST | infinity | -infinity + Wed Mar 15 08:14:01 2000 PST | infinity | -infinity + Wed Mar 15 12:14:03 2000 PST | infinity | -infinity + Wed Mar 15 13:14:02 2000 PST | infinity | -infinity + Sun Dec 31 17:32:01 2000 PST | infinity | -infinity + Mon Jan 01 17:32:01 2001 PST | infinity | -infinity + Sat Sep 22 18:19:20 2001 PDT | infinity | -infinity Thu Jan 01 00:00:00 1970 PST | @ 34 years | Wed Jan 01 00:00:00 1936 PST Wed Feb 28 17:32:01 1996 PST | @ 34 years | Wed Feb 28 17:32:01 1962 PST Thu Feb 29 17:32:01 1996 PST | @ 34 years | Wed Feb 28 17:32:01 1962 PST @@ -1872,7 +2101,23 @@ SELECT d.f1 AS "timestamp", t.f1 AS "interval", d.f1 - t.f1 AS minus Sat Sep 22 18:19:20 2001 PDT | @ 5 hours | Sat Sep 22 13:19:20 2001 PDT Sat Sep 22 18:19:20 2001 PDT | @ 1 min | Sat Sep 22 18:18:20 2001 PDT Sat Sep 22 18:19:20 2001 PDT | @ 14 secs ago | Sat Sep 22 18:19:34 2001 PDT -(160 rows) + Thu Jan 01 00:00:00 1970 PST | -infinity | infinity + Wed Feb 28 17:32:01 1996 PST | -infinity | infinity + Thu Feb 29 17:32:01 1996 PST | -infinity | infinity + Fri Mar 01 17:32:01 1996 PST | -infinity | infinity + Mon Dec 30 17:32:01 1996 PST | -infinity | infinity + Tue Dec 31 17:32:01 1996 PST | -infinity | infinity + Fri Dec 31 17:32:01 1999 PST | -infinity | infinity + Sat Jan 01 17:32:01 2000 PST | -infinity | infinity + Wed Mar 15 02:14:05 2000 PST | -infinity | infinity + Wed Mar 15 03:14:04 2000 PST | -infinity | infinity + Wed Mar 15 08:14:01 2000 PST | -infinity | infinity + Wed Mar 15 12:14:03 2000 PST | -infinity | infinity + Wed Mar 15 13:14:02 2000 PST | -infinity | infinity + Sun Dec 31 17:32:01 2000 PST | -infinity | infinity + Mon Jan 01 17:32:01 2001 PST | -infinity | infinity + Sat Sep 22 18:19:20 2001 PDT | -infinity | infinity +(192 rows) SELECT d.f1 AS "timestamp", timestamp with time zone '1980-01-06 00:00 GMT' AS gpstime_zero, @@ -2225,7 +2470,7 @@ SELECT '2020-10-05'::timestamptz > '2202020-10-05'::date as f; SELECT '4714-11-24 BC'::date::timestamptz; timestamptz --------------------------------- - Mon Nov 24 00:00:00 4714 PST BC + Mon Nov 24 00:00:00 4714 LMT BC (1 row) SET TimeZone = 'UTC-2'; @@ -2803,13 +3048,13 @@ RESET DateStyle; SELECT to_timestamp('0097/Feb/16 --> 08:14:30', 'YYYY/Mon/DD --> HH:MI:SS'); to_timestamp ------------------------------ - Sat Feb 16 08:14:30 0097 PST + Sat Feb 16 08:14:30 0097 LMT (1 row) SELECT to_timestamp('97/2/16 8:14:30', 'FMYYYY/FMMM/FMDD FMHH:FMMI:FMSS'); to_timestamp ------------------------------ - Sat Feb 16 08:14:30 0097 PST + Sat Feb 16 08:14:30 0097 LMT (1 row) SELECT to_timestamp('2011$03!18 23_38_15', 'YYYY-MM-DD HH24:MI:SS'); @@ -2846,7 +3091,7 @@ SELECT to_timestamp('My birthday-> Year: 1976, Month: May, Day: 16', SELECT to_timestamp('1,582nd VIII 21', 'Y,YYYth FMRM DD'); to_timestamp ------------------------------ - Sat Aug 21 00:00:00 1582 PST + Sat Aug 21 00:00:00 1582 LMT (1 row) SELECT to_timestamp('15 "text between quote marks" 98 54 45', @@ -2910,7 +3155,7 @@ SELECT to_timestamp('1997 AD 11 16', 'YYYY BC MM DD'); SELECT to_timestamp('1997 BC 11 16', 'YYYY BC MM DD'); to_timestamp --------------------------------- - Tue Nov 16 00:00:00 1997 PST BC + Tue Nov 16 00:00:00 1997 LMT BC (1 row) SELECT to_timestamp('1997 A.D. 11 16', 'YYYY B.C. MM DD'); @@ -2922,7 +3167,7 @@ SELECT to_timestamp('1997 A.D. 11 16', 'YYYY B.C. MM DD'); SELECT to_timestamp('1997 B.C. 11 16', 'YYYY B.C. MM DD'); to_timestamp --------------------------------- - Tue Nov 16 00:00:00 1997 PST BC + Tue Nov 16 00:00:00 1997 LMT BC (1 row) SELECT to_timestamp('9-1116', 'Y-MMDD'); @@ -3063,8 +3308,66 @@ SELECT to_timestamp('2011-12-18 11:38 20', 'YYYY-MM-DD HH12:MI TZM'); Sun Dec 18 03:18:00 2011 PST (1 row) -SELECT to_timestamp('2011-12-18 11:38 PST', 'YYYY-MM-DD HH12:MI TZ'); -- NYI -ERROR: formatting field "TZ" is only supported in to_char +SELECT to_timestamp('2011-12-18 11:38 EST', 'YYYY-MM-DD HH12:MI TZ'); + to_timestamp +------------------------------ + Sun Dec 18 08:38:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 -05', 'YYYY-MM-DD HH12:MI TZ'); + to_timestamp +------------------------------ + Sun Dec 18 08:38:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 +01:30', 'YYYY-MM-DD HH12:MI TZ'); + to_timestamp +------------------------------ + Sun Dec 18 02:08:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 MSK', 'YYYY-MM-DD HH12:MI TZ'); -- dyntz + to_timestamp +------------------------------ + Sat Dec 17 23:38:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38ESTFOO24', 'YYYY-MM-DD HH12:MITZFOOSS'); + to_timestamp +------------------------------ + Sun Dec 18 08:38:24 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38-05FOO24', 'YYYY-MM-DD HH12:MITZFOOSS'); + to_timestamp +------------------------------ + Sun Dec 18 08:38:24 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 JUNK', 'YYYY-MM-DD HH12:MI TZ'); -- error +ERROR: invalid value "JUNK" for "TZ" +DETAIL: Time zone abbreviation is not recognized. +SELECT to_timestamp('2011-12-18 11:38 ...', 'YYYY-MM-DD HH12:MI TZ'); -- error +ERROR: invalid value ".." for "TZ" +DETAIL: Value must be an integer. +SELECT to_timestamp('2011-12-18 11:38 -05', 'YYYY-MM-DD HH12:MI OF'); + to_timestamp +------------------------------ + Sun Dec 18 08:38:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 +01:30', 'YYYY-MM-DD HH12:MI OF'); + to_timestamp +------------------------------ + Sun Dec 18 02:08:00 2011 PST +(1 row) + +SELECT to_timestamp('2011-12-18 11:38 +xyz', 'YYYY-MM-DD HH12:MI OF'); -- error +ERROR: invalid value "xy" for "OF" +DETAIL: Value must be an integer. +SELECT to_timestamp('2011-12-18 11:38 +01:xyz', 'YYYY-MM-DD HH12:MI OF'); -- error +ERROR: invalid value "xy" for "OF" +DETAIL: Value must be an integer. SELECT to_timestamp('2018-11-02 12:34:56.025', 'YYYY-MM-DD HH24:MI:SS.MS'); to_timestamp ---------------------------------- @@ -3150,6 +3453,17 @@ SELECT i, to_timestamp('2018-11-02 12:34:56.123456', 'YYYY-MM-DD HH24:MI:SS.FF' SELECT i, to_timestamp('2018-11-02 12:34:56.123456789', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; ERROR: date/time field value out of range: "2018-11-02 12:34:56.123456789" +SELECT i, to_timestamp('20181102123456123456', 'YYYYMMDDHH24MISSFF' || i) FROM generate_series(1, 6) i; + i | to_timestamp +---+------------------------------------- + 1 | Fri Nov 02 12:34:56.1 2018 PDT + 2 | Fri Nov 02 12:34:56.12 2018 PDT + 3 | Fri Nov 02 12:34:56.123 2018 PDT + 4 | Fri Nov 02 12:34:56.1235 2018 PDT + 5 | Fri Nov 02 12:34:56.12346 2018 PDT + 6 | Fri Nov 02 12:34:56.123456 2018 PDT +(6 rows) + SELECT to_date('1 4 1902', 'Q MM YYYY'); -- Q is ignored to_date ------------ @@ -3192,19 +3506,19 @@ SELECT to_date('-44-02-01 BC','YYYY-MM-DD BC'); SELECT to_timestamp('44-02-01 11:12:13 BC','YYYY-MM-DD HH24:MI:SS BC'); to_timestamp --------------------------------- - Fri Feb 01 11:12:13 0044 PST BC + Fri Feb 01 11:12:13 0044 LMT BC (1 row) SELECT to_timestamp('-44-02-01 11:12:13','YYYY-MM-DD HH24:MI:SS'); to_timestamp --------------------------------- - Fri Feb 01 11:12:13 0044 PST BC + Fri Feb 01 11:12:13 0044 LMT BC (1 row) SELECT to_timestamp('-44-02-01 11:12:13 BC','YYYY-MM-DD HH24:MI:SS BC'); to_timestamp ------------------------------ - Mon Feb 01 11:12:13 0044 PST + Mon Feb 01 11:12:13 0044 LMT (1 row) -- @@ -3480,6 +3794,19 @@ SELECT to_date('0000-02-01','YYYY-MM-DD'); -- allowed, though it shouldn't be 02-01-0001 BC (1 row) +-- to_char's TZ format code produces zone abbrev if known +SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS TZ'); + to_char +------------------------- + 2012-12-12 12:00:00 PST +(1 row) + +SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS tz'); + to_char +------------------------- + 2012-12-12 12:00:00 pst +(1 row) + -- -- Check behavior with SQL-style fixed-GMT-offset time zone (cf bug #8572) -- @@ -3521,4 +3848,11 @@ SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD SSSSS'); 2012-12-12 43200 (1 row) +SET TIME ZONE '+2'; +SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS TZ'); + to_char +------------------------- + 2012-12-12 12:00:00 +02 +(1 row) + RESET TIME ZONE; diff --git a/src/test/regress/expected/identity.out b/src/test/regress/expected/identity.out index 5f03d8e14fb4b..f14bfccfb1d1d 100644 --- a/src/test/regress/expected/identity.out +++ b/src/test/regress/expected/identity.out @@ -365,6 +365,78 @@ SELECT seqtypid::regtype FROM pg_sequence WHERE seqrelid = 'itest3_a_seq'::regcl ALTER TABLE itest3 ALTER COLUMN a TYPE text; -- error ERROR: identity column type must be smallint, integer, or bigint +-- check that unlogged propagates to sequence +CREATE UNLOGGED TABLE itest17 (a int NOT NULL, b text); +ALTER TABLE itest17 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; +ALTER TABLE itest17 ADD COLUMN c int GENERATED ALWAYS AS IDENTITY; +\d itest17 + Unlogged table "public.itest17" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------ + a | integer | | not null | generated always as identity + b | text | | | + c | integer | | not null | generated always as identity + +\d itest17_a_seq + Unlogged sequence "public.itest17_a_seq" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +---------+-------+---------+------------+-----------+---------+------- + integer | 1 | 1 | 2147483647 | 1 | no | 1 +Sequence for identity column: public.itest17.a + +\d itest17_c_seq + Unlogged sequence "public.itest17_c_seq" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +---------+-------+---------+------------+-----------+---------+------- + integer | 1 | 1 | 2147483647 | 1 | no | 1 +Sequence for identity column: public.itest17.c + +CREATE TABLE itest18 (a int NOT NULL, b text); +ALTER TABLE itest18 SET UNLOGGED, ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; +\d itest18 + Unlogged table "public.itest18" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------ + a | integer | | not null | generated always as identity + b | text | | | + +\d itest18_a_seq + Unlogged sequence "public.itest18_a_seq" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +---------+-------+---------+------------+-----------+---------+------- + integer | 1 | 1 | 2147483647 | 1 | no | 1 +Sequence for identity column: public.itest18.a + +ALTER TABLE itest18 SET LOGGED; +\d itest18 + Table "public.itest18" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------ + a | integer | | not null | generated always as identity + b | text | | | + +\d itest18_a_seq + Sequence "public.itest18_a_seq" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +---------+-------+---------+------------+-----------+---------+------- + integer | 1 | 1 | 2147483647 | 1 | no | 1 +Sequence for identity column: public.itest18.a + +ALTER TABLE itest18 SET UNLOGGED; +\d itest18 + Unlogged table "public.itest18" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+------------------------------ + a | integer | | not null | generated always as identity + b | text | | | + +\d itest18_a_seq + Unlogged sequence "public.itest18_a_seq" + Type | Start | Minimum | Maximum | Increment | Cycles? | Cache +---------+-------+---------+------------+-----------+---------+------- + integer | 1 | 1 | 2147483647 | 1 | no | 1 +Sequence for identity column: public.itest18.a + -- kinda silly to change property in the same command, but it should work ALTER TABLE itest3 ADD COLUMN c int GENERATED BY DEFAULT AS IDENTITY, @@ -535,13 +607,232 @@ CREATE TYPE itest_type AS (f1 integer, f2 text, f3 bigint); CREATE TABLE itest12 OF itest_type (f1 WITH OPTIONS GENERATED ALWAYS AS IDENTITY); -- error ERROR: identity columns are not supported on typed tables DROP TYPE itest_type CASCADE; --- table partitions (currently not supported) -CREATE TABLE itest_parent (f1 date NOT NULL, f2 text, f3 bigint) PARTITION BY RANGE (f1); -CREATE TABLE itest_child PARTITION OF itest_parent ( +-- table partitions +-- partitions inherit identity column and share sequence +CREATE TABLE pitest1 (f1 date NOT NULL, f2 text, f3 bigint generated always as identity) PARTITION BY RANGE (f1); +-- new partition +CREATE TABLE pitest1_p1 PARTITION OF pitest1 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); +INSERT into pitest1(f1, f2) VALUES ('2016-07-2', 'from pitest1'); +INSERT into pitest1_p1 (f1, f2) VALUES ('2016-07-3', 'from pitest1_p1'); +-- attached partition +CREATE TABLE pitest1_p2 (f3 bigint, f2 text, f1 date NOT NULL); +INSERT INTO pitest1_p2 (f1, f2, f3) VALUES ('2016-08-2', 'before attaching', 100); +ALTER TABLE pitest1 ATTACH PARTITION pitest1_p2 FOR VALUES FROM ('2016-08-01') TO ('2016-09-01'); -- requires NOT NULL constraint +ERROR: column "f3" in child table must be marked NOT NULL +ALTER TABLE pitest1_p2 ALTER COLUMN f3 SET NOT NULL; +ALTER TABLE pitest1 ATTACH PARTITION pitest1_p2 FOR VALUES FROM ('2016-08-01') TO ('2016-09-01'); +INSERT INTO pitest1_p2 (f1, f2) VALUES ('2016-08-3', 'from pitest1_p2'); +INSERT INTO pitest1 (f1, f2) VALUES ('2016-08-4', 'from pitest1'); +-- LIKE INCLUDING on partition +CREATE TABLE pitest1_p1_like (LIKE pitest1_p1 INCLUDING IDENTITY); +INSERT into pitest1_p1_like(f1, f2) VALUES ('2016-07-2', 'from pitest1_p1_like'); +SELECT tableoid::regclass, f1, f2, f3 FROM pitest1; + tableoid | f1 | f2 | f3 +------------+------------+------------------+----- + pitest1_p1 | 07-02-2016 | from pitest1 | 1 + pitest1_p1 | 07-03-2016 | from pitest1_p1 | 2 + pitest1_p2 | 08-02-2016 | before attaching | 100 + pitest1_p2 | 08-03-2016 | from pitest1_p2 | 3 + pitest1_p2 | 08-04-2016 | from pitest1 | 4 +(5 rows) + +SELECT tableoid::regclass, f1, f2, f3 FROM pitest1_p1_like; + tableoid | f1 | f2 | f3 +-----------------+------------+----------------------+---- + pitest1_p1_like | 07-02-2016 | from pitest1_p1_like | 1 +(1 row) + +ALTER TABLE pitest1 ALTER COLUMN f3 SET DATA TYPE bigint; +SELECT tableoid::regclass, f1, f2, f3, pg_typeof(f3) FROM pitest1; + tableoid | f1 | f2 | f3 | pg_typeof +------------+------------+------------------+-----+----------- + pitest1_p1 | 07-02-2016 | from pitest1 | 1 | bigint + pitest1_p1 | 07-03-2016 | from pitest1_p1 | 2 | bigint + pitest1_p2 | 08-02-2016 | before attaching | 100 | bigint + pitest1_p2 | 08-03-2016 | from pitest1_p2 | 3 | bigint + pitest1_p2 | 08-04-2016 | from pitest1 | 4 | bigint +(5 rows) + +SELECT tableoid::regclass, f1, f2, f3, pg_typeof(f3) FROM pitest1_p2; + tableoid | f1 | f2 | f3 | pg_typeof +------------+------------+------------------+-----+----------- + pitest1_p2 | 08-02-2016 | before attaching | 100 | bigint + pitest1_p2 | 08-03-2016 | from pitest1_p2 | 3 | bigint + pitest1_p2 | 08-04-2016 | from pitest1 | 4 | bigint +(3 rows) + +-- add identity column +CREATE TABLE pitest2 (f1 date NOT NULL, f2 text) PARTITION BY RANGE (f1); +CREATE TABLE pitest2_p1 PARTITION OF pitest2 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); +CREATE TABLE pitest2_p2 PARTITION OF pitest2 FOR VALUES FROM ('2016-08-01') TO ('2016-09-01'); +INSERT into pitest2(f1, f2) VALUES ('2016-07-2', 'from pitest2'); +INSERT INTO pitest2 (f1, f2) VALUES ('2016-08-2', 'from pitest2'); +ALTER TABLE pitest2 ADD COLUMN f3 int GENERATED ALWAYS AS IDENTITY; +INSERT into pitest2_p1 (f1, f2) VALUES ('2016-07-3', 'from pitest2_p1'); +INSERT INTO pitest2_p2 (f1, f2) VALUES ('2016-08-3', 'from pitest2_p2'); +INSERT into pitest2(f1, f2) VALUES ('2016-07-4', 'from pitest2'); +INSERT INTO pitest2 (f1, f2) VALUES ('2016-08-4', 'from pitest2'); +SELECT tableoid::regclass, f1, f2, f3 FROM pitest2; + tableoid | f1 | f2 | f3 +------------+------------+-----------------+---- + pitest2_p1 | 07-02-2016 | from pitest2 | 1 + pitest2_p1 | 07-03-2016 | from pitest2_p1 | 3 + pitest2_p1 | 07-04-2016 | from pitest2 | 5 + pitest2_p2 | 08-02-2016 | from pitest2 | 2 + pitest2_p2 | 08-03-2016 | from pitest2_p2 | 4 + pitest2_p2 | 08-04-2016 | from pitest2 | 6 +(6 rows) + +-- SET identity column +ALTER TABLE pitest2_p1 ALTER COLUMN f3 SET GENERATED BY DEFAULT; -- fails +ERROR: cannot change identity column of a partition +ALTER TABLE pitest2_p1 ALTER COLUMN f3 SET INCREMENT BY 2; -- fails +ERROR: cannot change identity column of a partition +ALTER TABLE ONLY pitest2 ALTER COLUMN f3 SET GENERATED BY DEFAULT SET INCREMENT BY 2 SET START WITH 1000 RESTART; -- fails +ERROR: cannot change identity column of only the partitioned table +HINT: Do not specify the ONLY keyword. +ALTER TABLE pitest2 ALTER COLUMN f3 SET GENERATED BY DEFAULT SET INCREMENT BY 2 SET START WITH 1000 RESTART; +INSERT into pitest2(f1, f2, f3) VALUES ('2016-07-5', 'from pitest2', 200); +INSERT INTO pitest2(f1, f2) VALUES ('2016-08-5', 'from pitest2'); +INSERT into pitest2_p1 (f1, f2) VALUES ('2016-07-6', 'from pitest2_p1'); +INSERT INTO pitest2_p2 (f1, f2, f3) VALUES ('2016-08-6', 'from pitest2_p2', 300); +SELECT tableoid::regclass, f1, f2, f3 FROM pitest2; + tableoid | f1 | f2 | f3 +------------+------------+-----------------+------ + pitest2_p1 | 07-02-2016 | from pitest2 | 1 + pitest2_p1 | 07-03-2016 | from pitest2_p1 | 3 + pitest2_p1 | 07-04-2016 | from pitest2 | 5 + pitest2_p1 | 07-05-2016 | from pitest2 | 200 + pitest2_p1 | 07-06-2016 | from pitest2_p1 | 1002 + pitest2_p2 | 08-02-2016 | from pitest2 | 2 + pitest2_p2 | 08-03-2016 | from pitest2_p2 | 4 + pitest2_p2 | 08-04-2016 | from pitest2 | 6 + pitest2_p2 | 08-05-2016 | from pitest2 | 1000 + pitest2_p2 | 08-06-2016 | from pitest2_p2 | 300 +(10 rows) + +-- detaching a partition removes identity property +ALTER TABLE pitest2 DETACH PARTITION pitest2_p1; +INSERT into pitest2(f1, f2) VALUES ('2016-08-7', 'from pitest2'); +INSERT into pitest2_p1 (f1, f2) VALUES ('2016-07-7', 'from pitest2_p1'); -- error +ERROR: null value in column "f3" of relation "pitest2_p1" violates not-null constraint +DETAIL: Failing row contains (07-07-2016, from pitest2_p1, null). +INSERT into pitest2_p1 (f1, f2, f3) VALUES ('2016-07-7', 'from pitest2_p1', 2000); +SELECT tableoid::regclass, f1, f2, f3 FROM pitest2; + tableoid | f1 | f2 | f3 +------------+------------+-----------------+------ + pitest2_p2 | 08-02-2016 | from pitest2 | 2 + pitest2_p2 | 08-03-2016 | from pitest2_p2 | 4 + pitest2_p2 | 08-04-2016 | from pitest2 | 6 + pitest2_p2 | 08-05-2016 | from pitest2 | 1000 + pitest2_p2 | 08-06-2016 | from pitest2_p2 | 300 + pitest2_p2 | 08-07-2016 | from pitest2 | 1004 +(6 rows) + +SELECT tableoid::regclass, f1, f2, f3 FROM pitest2_p1; + tableoid | f1 | f2 | f3 +------------+------------+-----------------+------ + pitest2_p1 | 07-02-2016 | from pitest2 | 1 + pitest2_p1 | 07-03-2016 | from pitest2_p1 | 3 + pitest2_p1 | 07-04-2016 | from pitest2 | 5 + pitest2_p1 | 07-05-2016 | from pitest2 | 200 + pitest2_p1 | 07-06-2016 | from pitest2_p1 | 1002 + pitest2_p1 | 07-07-2016 | from pitest2_p1 | 2000 +(6 rows) + +DROP TABLE pitest2_p1; +-- changing a regular column to identity column in a partitioned table +CREATE TABLE pitest3 (f1 date NOT NULL, f2 text, f3 int) PARTITION BY RANGE (f1); +CREATE TABLE pitest3_p1 PARTITION OF pitest3 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); +INSERT into pitest3 VALUES ('2016-07-2', 'from pitest3', 1); +INSERT into pitest3_p1 VALUES ('2016-07-3', 'from pitest3_p1', 2); +-- fails, changing only a partition not allowed +ALTER TABLE pitest3_p1 + ALTER COLUMN f3 SET NOT NULL, + ALTER COLUMN f3 ADD GENERATED ALWAYS AS IDENTITY (START WITH 3); +ERROR: cannot add identity to a column of a partition +-- fails, changing only the partitioned table not allowed +BEGIN; +ALTER TABLE pitest3_p1 ALTER COLUMN f3 SET NOT NULL; +ALTER TABLE ONLY pitest3 + ALTER COLUMN f3 ADD GENERATED ALWAYS AS IDENTITY (START WITH 3); +ERROR: cannot add identity to a column of only the partitioned table +HINT: Do not specify the ONLY keyword. +ROLLBACK; +ALTER TABLE pitest3 + ALTER COLUMN f3 SET NOT NULL, + ALTER COLUMN f3 ADD GENERATED ALWAYS AS IDENTITY (START WITH 3); +INSERT into pitest3(f1, f2) VALUES ('2016-07-4', 'from pitest3'); +INSERT into pitest3_p1 (f1, f2) VALUES ('2016-07-5', 'from pitest3_p1'); +SELECT tableoid::regclass, f1, f2, f3 FROM pitest3; + tableoid | f1 | f2 | f3 +------------+------------+-----------------+---- + pitest3_p1 | 07-02-2016 | from pitest3 | 1 + pitest3_p1 | 07-03-2016 | from pitest3_p1 | 2 + pitest3_p1 | 07-04-2016 | from pitest3 | 3 + pitest3_p1 | 07-05-2016 | from pitest3_p1 | 4 +(4 rows) + +-- changing an identity column to a non-identity column in a partitioned table +ALTER TABLE pitest3_p1 ALTER COLUMN f3 DROP IDENTITY; -- fails +ERROR: cannot drop identity from a column of a partition +ALTER TABLE ONLY pitest3 ALTER COLUMN f3 DROP IDENTITY; -- fails +ERROR: cannot drop identity from a column of only the partitioned table +HINT: Do not specify the ONLY keyword. +ALTER TABLE pitest3 ALTER COLUMN f3 DROP IDENTITY; +INSERT into pitest3(f1, f2) VALUES ('2016-07-4', 'from pitest3'); -- fails +ERROR: null value in column "f3" of relation "pitest3_p1" violates not-null constraint +DETAIL: Failing row contains (07-04-2016, from pitest3, null). +INSERT into pitest3_p1 (f1, f2) VALUES ('2016-07-5', 'from pitest3_p1'); -- fails +ERROR: null value in column "f3" of relation "pitest3_p1" violates not-null constraint +DETAIL: Failing row contains (07-05-2016, from pitest3_p1, null). +INSERT into pitest3(f1, f2, f3) VALUES ('2016-07-6', 'from pitest3', 5); +INSERT into pitest3_p1 (f1, f2, f3) VALUES ('2016-07-7', 'from pitest3_p1', 6); +SELECT tableoid::regclass, f1, f2, f3 FROM pitest3; + tableoid | f1 | f2 | f3 +------------+------------+-----------------+---- + pitest3_p1 | 07-02-2016 | from pitest3 | 1 + pitest3_p1 | 07-03-2016 | from pitest3_p1 | 2 + pitest3_p1 | 07-04-2016 | from pitest3 | 3 + pitest3_p1 | 07-05-2016 | from pitest3_p1 | 4 + pitest3_p1 | 07-06-2016 | from pitest3 | 5 + pitest3_p1 | 07-07-2016 | from pitest3_p1 | 6 +(6 rows) + +-- Changing NOT NULL constraint of identity columns is not allowed +ALTER TABLE pitest1_p1 ALTER COLUMN f3 DROP NOT NULL; +ERROR: column "f3" of relation "pitest1_p1" is an identity column +ALTER TABLE pitest1 ALTER COLUMN f3 DROP NOT NULL; +ERROR: column "f3" of relation "pitest1" is an identity column +-- Identity columns have their own default +ALTER TABLE pitest1_p2 ALTER COLUMN f3 SET DEFAULT 10000; +ERROR: column "f3" of relation "pitest1_p2" is an identity column +ALTER TABLE pitest1 ALTER COLUMN f3 SET DEFAULT 10000; +ERROR: column "f3" of relation "pitest1" is an identity column +-- Adding identity to an identity column is not allowed +ALTER TABLE pitest1_p2 ALTER COLUMN f3 ADD GENERATED BY DEFAULT AS IDENTITY; +ERROR: cannot add identity to a column of a partition +ALTER TABLE pitest1 ALTER COLUMN f3 ADD GENERATED BY DEFAULT AS IDENTITY; +ERROR: column "f3" of relation "pitest1" is already an identity column +-- partitions with their own identity columns are not allowed, even if the +-- partitioned table does not have an identity column. +CREATE TABLE pitest1_pfail PARTITION OF pitest1 ( + f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY +) FOR VALUES FROM ('2016-11-01') TO ('2016-12-01'); +ERROR: identity columns are not supported on partitions +CREATE TABLE pitest_pfail PARTITION OF pitest3 ( f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY -) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); -- error +) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); ERROR: identity columns are not supported on partitions -DROP TABLE itest_parent; +CREATE TABLE pitest1_pfail (f1 date NOT NULL, f2 text, f3 bigint GENERATED ALWAYS AS IDENTITY); +ALTER TABLE pitest1 ATTACH PARTITION pitest1_pfail FOR VALUES FROM ('2016-11-01') TO ('2016-12-01'); +ERROR: table "pitest1_pfail" being attached contains an identity column "f3" +DETAIL: The new partition may not contain an identity column. +ALTER TABLE pitest3 ATTACH PARTITION pitest1_pfail FOR VALUES FROM ('2016-11-01') TO ('2016-12-01'); +ERROR: table "pitest1_pfail" being attached contains an identity column "f3" +DETAIL: The new partition may not contain an identity column. +DROP TABLE pitest1_pfail; +DROP TABLE pitest3; -- test that sequence of half-dropped serial column is properly ignored CREATE TABLE itest14 (id serial); ALTER TABLE itest14 ALTER id DROP DEFAULT; @@ -614,3 +905,19 @@ SELECT * FROM itest16; DROP TABLE itest15; DROP TABLE itest16; +-- For testing of pg_dump and pg_upgrade, leave behind some identity +-- sequences whose logged-ness doesn't match their owning table's. +CREATE TABLE identity_dump_logged (a INT GENERATED ALWAYS AS IDENTITY); +ALTER SEQUENCE identity_dump_logged_a_seq SET UNLOGGED; +CREATE UNLOGGED TABLE identity_dump_unlogged (a INT GENERATED ALWAYS AS IDENTITY); +ALTER SEQUENCE identity_dump_unlogged_a_seq SET LOGGED; +SELECT relname, relpersistence FROM pg_class + WHERE relname ~ '^identity_dump_' ORDER BY 1; + relname | relpersistence +------------------------------+---------------- + identity_dump_logged | p + identity_dump_logged_a_seq | u + identity_dump_unlogged | u + identity_dump_unlogged_a_seq | p +(4 rows) + diff --git a/src/test/regress/expected/incremental_sort.out b/src/test/regress/expected/incremental_sort.out index 0c3433f8e58e7..5fd54a10b1aaf 100644 --- a/src/test/regress/expected/incremental_sort.out +++ b/src/test/regress/expected/incremental_sort.out @@ -1472,14 +1472,19 @@ explain (costs off) select * from t union select * from t order by 1,3; Sort Key: t.a, t.c Presorted Key: t.a -> Unique - -> Sort + -> Merge Append Sort Key: t.a, t.b, t.c - -> Gather + -> Gather Merge Workers Planned: 2 - -> Parallel Append + -> Sort + Sort Key: t.a, t.b, t.c -> Parallel Seq Scan on t + -> Gather Merge + Workers Planned: 2 + -> Sort + Sort Key: t_1.a, t_1.b, t_1.c -> Parallel Seq Scan on t t_1 -(11 rows) +(16 rows) -- Full sort, not just incremental sort can be pushed below a gather merge path -- by generate_useful_gather_paths. @@ -1660,3 +1665,36 @@ order by 1, 2; -> Function Scan on generate_series (7 rows) +reset enable_hashagg; +reset enable_seqscan; +reset enable_incremental_sort; +reset parallel_tuple_cost; +reset parallel_setup_cost; +reset min_parallel_table_scan_size; +reset min_parallel_index_scan_size; +-- Ensure incremental sorts work for amcanorderbyop type indexes +create table point_table (a point, b int); +create index point_table_a_idx on point_table using gist(a); +-- Ensure we get an incremental sort plan for both of the following queries +explain (costs off) select a, b, a <-> point(5, 5) dist from point_table order by dist, b limit 1; + QUERY PLAN +--------------------------------------------------------------- + Limit + -> Incremental Sort + Sort Key: ((a <-> '(5,5)'::point)), b + Presorted Key: ((a <-> '(5,5)'::point)) + -> Index Scan using point_table_a_idx on point_table + Order By: (a <-> '(5,5)'::point) +(6 rows) + +explain (costs off) select a, b, a <-> point(5, 5) dist from point_table order by dist, b desc limit 1; + QUERY PLAN +--------------------------------------------------------------- + Limit + -> Incremental Sort + Sort Key: ((a <-> '(5,5)'::point)), b DESC + Presorted Key: ((a <-> '(5,5)'::point)) + -> Index Scan using point_table_a_idx on point_table + Order By: (a <-> '(5,5)'::point) +(6 rows) + diff --git a/src/test/regress/expected/index_including.out b/src/test/regress/expected/index_including.out index 86510687c743f..ea8b2454bf8cd 100644 --- a/src/test/regress/expected/index_including.out +++ b/src/test/regress/expected/index_including.out @@ -398,3 +398,28 @@ Indexes: "tbl_c1_c2_c3_c4_key" UNIQUE CONSTRAINT, btree (c1, c2) INCLUDE (c3, c4) DROP TABLE tbl; +/* + * 10. Test coverage for names stored as cstrings in indexes + */ +CREATE TABLE nametbl (c1 int, c2 name, c3 float); +CREATE INDEX nametbl_c1_c2_idx ON nametbl (c2, c1) INCLUDE (c3); +INSERT INTO nametbl VALUES(1, 'two', 3.0); +VACUUM nametbl; +SET enable_seqscan = 0; +-- Ensure we get an index only scan plan +EXPLAIN (COSTS OFF) SELECT c2, c1, c3 FROM nametbl WHERE c2 = 'two' AND c1 = 1; + QUERY PLAN +---------------------------------------------------- + Index Only Scan using nametbl_c1_c2_idx on nametbl + Index Cond: ((c2 = 'two'::name) AND (c1 = 1)) +(2 rows) + +-- Validate the results look sane +SELECT c2, c1, c3 FROM nametbl WHERE c2 = 'two' AND c1 = 1; + c2 | c1 | c3 +-----+----+---- + two | 1 | 3 +(1 row) + +RESET enable_seqscan; +DROP TABLE nametbl; diff --git a/src/test/regress/expected/indexing.out b/src/test/regress/expected/indexing.out index 64edc16a61ac1..f25723da92bdd 100644 --- a/src/test/regress/expected/indexing.out +++ b/src/test/regress/expected/indexing.out @@ -986,11 +986,32 @@ DETAIL: PRIMARY KEY constraint on table "idxpart" lacks column "a" which is par -- OK if you use them in some other order create table idxpart (a int, b int, c text, primary key (a, b, c)) partition by range (b, c, a); drop table idxpart; --- not other types of index-based constraints -create table idxpart (a int, exclude (a with = )) partition by range (a); -ERROR: exclusion constraints are not supported on partitioned tables -LINE 1: create table idxpart (a int, exclude (a with = )) partition ... - ^ +-- OK to add an exclusion constraint if partitioning by its equal column +create table idxpart (a int4range, exclude USING GIST (a with = )) partition by range (a); +drop table idxpart; +-- OK more than one equal column +create table idxpart (a int4range, b int4range, exclude USING GIST (a with =, b with =)) partition by range (a, b); +drop table idxpart; +-- OK with more than one equal column: constraint is a proper superset of partition key +create table idxpart (a int4range, b int4range, exclude USING GIST (a with =, b with =)) partition by range (a); +drop table idxpart; +-- Not OK more than one equal column: partition keys are a proper superset of constraint +create table idxpart (a int4range, b int4range, exclude USING GIST (a with = )) partition by range (a, b); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: EXCLUDE constraint on table "idxpart" lacks column "b" which is part of the partition key. +-- Not OK with just -|- +create table idxpart (a int4range, exclude USING GIST (a with -|- )) partition by range (a); +ERROR: cannot match partition key to index on column "a" using non-equal operator "-|-" +-- OK with equals and &&, and equals is the partition key +create table idxpart (a int4range, b int4range, exclude USING GIST (a with =, b with &&)) partition by range (a); +drop table idxpart; +-- Not OK with equals and &&, and equals is not the partition key +create table idxpart (a int4range, b int4range, c int4range, exclude USING GIST (b with =, c with &&)) partition by range (a); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: EXCLUDE constraint on table "idxpart" lacks column "a" which is part of the partition key. +-- OK more than one equal column and a && column +create table idxpart (a int4range, b int4range, c int4range, exclude USING GIST (a with =, b with =, c with &&)) partition by range (a, b); +drop table idxpart; -- no expressions in partition key for PK/UNIQUE create table idxpart (a int primary key, b int) partition by range ((b + a)); ERROR: unsupported PRIMARY KEY constraint with partition key definition @@ -1047,12 +1068,42 @@ Indexes: Number of partitions: 0 drop table idxpart; --- Exclusion constraints cannot be added -create table idxpart (a int, b int) partition by range (a); -alter table idxpart add exclude (a with =); -ERROR: exclusion constraints are not supported on partitioned tables -LINE 1: alter table idxpart add exclude (a with =); - ^ +-- Exclusion constraints can be added if partitioning by their equal column +create table idxpart (a int4range, b int4range) partition by range (a); +alter table idxpart add exclude USING GIST (a with =); +drop table idxpart; +-- OK more than one equal column +create table idxpart (a int4range, b int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with =, b with =); +drop table idxpart; +-- OK with more than one equal column: constraint is a proper superset of partition key +create table idxpart (a int4range, b int4range) partition by range (a); +alter table idxpart add exclude USING GIST (a with =, b with =); +drop table idxpart; +-- Not OK more than one equal column: partition keys are a proper superset of constraint +create table idxpart (a int4range, b int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with =); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: EXCLUDE constraint on table "idxpart" lacks column "b" which is part of the partition key. +drop table idxpart; +-- Not OK with just -|- +create table idxpart (a int4range, b int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with -|-); +ERROR: cannot match partition key to index on column "a" using non-equal operator "-|-" +drop table idxpart; +-- OK with equals and &&, and equals is the partition key +create table idxpart (a int4range, b int4range) partition by range (a); +alter table idxpart add exclude USING GIST (a with =, b with &&); +drop table idxpart; +-- Not OK with equals and &&, and equals is not the partition key +create table idxpart (a int4range, b int4range, c int4range) partition by range (a); +alter table idxpart add exclude USING GIST (b with =, c with &&); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: EXCLUDE constraint on table "idxpart" lacks column "a" which is part of the partition key. +drop table idxpart; +-- OK more than one equal column and a && column +create table idxpart (a int4range, b int4range, c int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with =, b with =, c with &&); drop table idxpart; -- When (sub)partitions are created, they also contain the constraint create table idxpart (a int, b int, primary key (a, b)) partition by range (a, b); @@ -1065,15 +1116,15 @@ create table idxpart3 (b int not null, a int not null); alter table idxpart attach partition idxpart3 for values from (20, 20) to (30, 30); select conname, contype, conrelid::regclass, conindid::regclass, conkey from pg_constraint where conrelid::regclass::text like 'idxpart%' - order by conname; + order by conrelid::regclass::text, conname; conname | contype | conrelid | conindid | conkey ----------------+---------+-----------+----------------+-------- + idxpart_pkey | p | idxpart | idxpart_pkey | {1,2} idxpart1_pkey | p | idxpart1 | idxpart1_pkey | {1,2} + idxpart2_pkey | p | idxpart2 | idxpart2_pkey | {1,2} idxpart21_pkey | p | idxpart21 | idxpart21_pkey | {1,2} idxpart22_pkey | p | idxpart22 | idxpart22_pkey | {1,2} - idxpart2_pkey | p | idxpart2 | idxpart2_pkey | {1,2} idxpart3_pkey | p | idxpart3 | idxpart3_pkey | {2,1} - idxpart_pkey | p | idxpart | idxpart_pkey | {1,2} (6 rows) drop table idxpart; @@ -1207,12 +1258,13 @@ create table idxpart (a int) partition by range (a); create table idxpart0 (like idxpart); alter table idxpart0 add unique (a); alter table idxpart attach partition idxpart0 default; -alter table only idxpart add primary key (a); -- fail, no NOT NULL constraint +alter table only idxpart add primary key (a); -- fail, no not-null constraint ERROR: constraint must be added to child tables too DETAIL: Column "a" of relation "idxpart0" is not already NOT NULL. HINT: Do not specify the ONLY keyword. alter table idxpart0 alter column a set not null; alter table only idxpart add primary key (a); -- now it works +alter index idxpart_pkey attach partition idxpart0_a_key; alter table idxpart0 alter column a drop not null; -- fail, pkey needs it ERROR: column "a" is marked NOT NULL in parent table drop table idxpart; @@ -1281,6 +1333,45 @@ select tableoid::regclass, * from idxpart order by a; idxpart2 | 857142 | six (8 rows) +drop table idxpart; +-- Test some other non-btree index types +create table idxpart (a int, b text, c int[]) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (100000); +set enable_seqscan to off; +create index idxpart_brin on idxpart using brin(b); +explain (costs off) select * from idxpart where b = 'abcd'; + QUERY PLAN +------------------------------------------- + Bitmap Heap Scan on idxpart1 idxpart + Recheck Cond: (b = 'abcd'::text) + -> Bitmap Index Scan on idxpart1_b_idx + Index Cond: (b = 'abcd'::text) +(4 rows) + +drop index idxpart_brin; +create index idxpart_spgist on idxpart using spgist(b); +explain (costs off) select * from idxpart where b = 'abcd'; + QUERY PLAN +------------------------------------------- + Bitmap Heap Scan on idxpart1 idxpart + Recheck Cond: (b = 'abcd'::text) + -> Bitmap Index Scan on idxpart1_b_idx + Index Cond: (b = 'abcd'::text) +(4 rows) + +drop index idxpart_spgist; +create index idxpart_gin on idxpart using gin(c); +explain (costs off) select * from idxpart where c @> array[42]; + QUERY PLAN +---------------------------------------------- + Bitmap Heap Scan on idxpart1 idxpart + Recheck Cond: (c @> '{42}'::integer[]) + -> Bitmap Index Scan on idxpart1_c_idx + Index Cond: (c @> '{42}'::integer[]) +(4 rows) + +drop index idxpart_gin; +reset enable_seqscan; drop table idxpart; -- intentionally leave some objects around create table idxpart (a int) partition by range (a); @@ -1451,3 +1542,101 @@ select indexrelid::regclass, indisvalid, (5 rows) drop table parted_inval_tab; +-- Check setup of indisvalid across a complex partition tree on index +-- creation. If one index in a partition index is invalid, so should its +-- partitioned index. +create table parted_isvalid_tab (a int, b int) partition by range (a); +create table parted_isvalid_tab_1 partition of parted_isvalid_tab + for values from (1) to (10) partition by range (a); +create table parted_isvalid_tab_2 partition of parted_isvalid_tab + for values from (10) to (20) partition by range (a); +create table parted_isvalid_tab_11 partition of parted_isvalid_tab_1 + for values from (1) to (5); +create table parted_isvalid_tab_12 partition of parted_isvalid_tab_1 + for values from (5) to (10); +-- create an invalid index on one of the partitions. +insert into parted_isvalid_tab_11 values (1, 0); +create index concurrently parted_isvalid_idx_11 on parted_isvalid_tab_11 ((a/b)); +ERROR: division by zero +-- The previous invalid index is selected, invalidating all the indexes up to +-- the top-most parent. +create index parted_isvalid_idx on parted_isvalid_tab ((a/b)); +select indexrelid::regclass, indisvalid, + indrelid::regclass, inhparent::regclass + from pg_index idx left join + pg_inherits inh on (idx.indexrelid = inh.inhrelid) + where indexrelid::regclass::text like 'parted_isvalid%' + order by indexrelid::regclass::text collate "C"; + indexrelid | indisvalid | indrelid | inhparent +--------------------------------+------------+-----------------------+------------------------------- + parted_isvalid_idx | f | parted_isvalid_tab | + parted_isvalid_idx_11 | f | parted_isvalid_tab_11 | parted_isvalid_tab_1_expr_idx + parted_isvalid_tab_12_expr_idx | t | parted_isvalid_tab_12 | parted_isvalid_tab_1_expr_idx + parted_isvalid_tab_1_expr_idx | f | parted_isvalid_tab_1 | parted_isvalid_idx + parted_isvalid_tab_2_expr_idx | t | parted_isvalid_tab_2 | parted_isvalid_idx +(5 rows) + +drop table parted_isvalid_tab; +-- Check state of replica indexes when attaching a partition. +begin; +create table parted_replica_tab (id int not null) partition by range (id); +create table parted_replica_tab_1 partition of parted_replica_tab + for values from (1) to (10) partition by range (id); +create table parted_replica_tab_11 partition of parted_replica_tab_1 + for values from (1) to (5); +create unique index parted_replica_idx + on only parted_replica_tab using btree (id); +create unique index parted_replica_idx_1 + on only parted_replica_tab_1 using btree (id); +-- This triggers an update of pg_index.indisreplident for parted_replica_idx. +alter table only parted_replica_tab_1 replica identity + using index parted_replica_idx_1; +create unique index parted_replica_idx_11 on parted_replica_tab_11 USING btree (id); +select indexrelid::regclass, indisvalid, indisreplident, + indrelid::regclass, inhparent::regclass + from pg_index idx left join + pg_inherits inh on (idx.indexrelid = inh.inhrelid) + where indexrelid::regclass::text like 'parted_replica%' + order by indexrelid::regclass::text collate "C"; + indexrelid | indisvalid | indisreplident | indrelid | inhparent +-----------------------+------------+----------------+-----------------------+----------- + parted_replica_idx | f | f | parted_replica_tab | + parted_replica_idx_1 | f | t | parted_replica_tab_1 | + parted_replica_idx_11 | t | f | parted_replica_tab_11 | +(3 rows) + +-- parted_replica_idx is not valid yet here, because parted_replica_idx_1 +-- is not valid. +alter index parted_replica_idx ATTACH PARTITION parted_replica_idx_1; +select indexrelid::regclass, indisvalid, indisreplident, + indrelid::regclass, inhparent::regclass + from pg_index idx left join + pg_inherits inh on (idx.indexrelid = inh.inhrelid) + where indexrelid::regclass::text like 'parted_replica%' + order by indexrelid::regclass::text collate "C"; + indexrelid | indisvalid | indisreplident | indrelid | inhparent +-----------------------+------------+----------------+-----------------------+-------------------- + parted_replica_idx | f | f | parted_replica_tab | + parted_replica_idx_1 | f | t | parted_replica_tab_1 | parted_replica_idx + parted_replica_idx_11 | t | f | parted_replica_tab_11 | +(3 rows) + +-- parted_replica_idx becomes valid here. +alter index parted_replica_idx_1 ATTACH PARTITION parted_replica_idx_11; +alter table only parted_replica_tab_1 replica identity + using index parted_replica_idx_1; +commit; +select indexrelid::regclass, indisvalid, indisreplident, + indrelid::regclass, inhparent::regclass + from pg_index idx left join + pg_inherits inh on (idx.indexrelid = inh.inhrelid) + where indexrelid::regclass::text like 'parted_replica%' + order by indexrelid::regclass::text collate "C"; + indexrelid | indisvalid | indisreplident | indrelid | inhparent +-----------------------+------------+----------------+-----------------------+---------------------- + parted_replica_idx | t | f | parted_replica_tab | + parted_replica_idx_1 | t | t | parted_replica_tab_1 | parted_replica_idx + parted_replica_idx_11 | t | f | parted_replica_tab_11 | parted_replica_idx_1 +(3 rows) + +drop table parted_replica_tab; diff --git a/src/test/regress/expected/inherit.out b/src/test/regress/expected/inherit.out index a7fbeed9eb9d9..689f4242a1ff6 100644 --- a/src/test/regress/expected/inherit.out +++ b/src/test/regress/expected/inherit.out @@ -539,6 +539,33 @@ CREATE TEMP TABLE z (b TEXT, PRIMARY KEY(aa, b)) inherits (a); INSERT INTO z VALUES (NULL, 'text'); -- should fail ERROR: null value in column "aa" of relation "z" violates not-null constraint DETAIL: Failing row contains (null, text). +-- Check inherited UPDATE with first child excluded +create table some_tab (f1 int, f2 int, f3 int, check (f1 < 10) no inherit); +create table some_tab_child () inherits(some_tab); +insert into some_tab_child select i, i+1, 0 from generate_series(1,1000) i; +create index on some_tab_child(f1, f2); +-- while at it, also check that statement-level triggers fire +create function some_tab_stmt_trig_func() returns trigger as +$$begin raise notice 'updating some_tab'; return NULL; end;$$ +language plpgsql; +create trigger some_tab_stmt_trig + before update on some_tab execute function some_tab_stmt_trig_func(); +explain (costs off) +update some_tab set f3 = 11 where f1 = 12 and f2 = 13; + QUERY PLAN +------------------------------------------------------------------------------------ + Update on some_tab + Update on some_tab_child some_tab_1 + -> Result + -> Index Scan using some_tab_child_f1_f2_idx on some_tab_child some_tab_1 + Index Cond: ((f1 = 12) AND (f2 = 13)) +(5 rows) + +update some_tab set f3 = 11 where f1 = 12 and f2 = 13; +NOTICE: updating some_tab +drop table some_tab cascade; +NOTICE: drop cascades to table some_tab_child +drop function some_tab_stmt_trig_func(); -- Check inherited UPDATE with all children excluded create table some_tab (a int, b int); create table some_tab_child () inherits (some_tab); @@ -1061,6 +1088,36 @@ Inherits: inht1, inhs1 DROP TABLE inhts; +-- Test for adding a column to a parent table with complex inheritance +CREATE TABLE inhta (); +CREATE TABLE inhtb () INHERITS (inhta); +CREATE TABLE inhtc () INHERITS (inhtb); +CREATE TABLE inhtd () INHERITS (inhta, inhtb, inhtc); +ALTER TABLE inhta ADD COLUMN i int, ADD COLUMN j bigint DEFAULT 1; +NOTICE: merging definition of column "i" for child "inhtd" +NOTICE: merging definition of column "i" for child "inhtd" +NOTICE: merging definition of column "j" for child "inhtd" +NOTICE: merging definition of column "j" for child "inhtd" +\d+ inhta + Table "public.inhta" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | + j | bigint | | | 1 | plain | | +Child tables: inhtb, + inhtd + +\d+ inhtd + Table "public.inhtd" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+---------+-----------+----------+---------+---------+--------------+------------- + i | integer | | | | plain | | + j | bigint | | | 1 | plain | | +Inherits: inhta, + inhtb, + inhtc + +DROP TABLE inhta, inhtb, inhtc, inhtd; -- Test for renaming in diamond inheritance CREATE TABLE inht2 (x int) INHERITS (inht1); CREATE TABLE inht3 (y int) INHERITS (inht1); @@ -1283,6 +1340,115 @@ order by 1, 2; drop table p1 cascade; NOTICE: drop cascades to table p1_c1 +-- +-- Test DROP behavior of multiply-defined CHECK constraints +-- +create table p1(f1 int constraint f1_pos CHECK (f1 > 0)); +create table p1_c1 (f1 int constraint f1_pos CHECK (f1 > 0)) inherits (p1); +NOTICE: merging column "f1" with inherited definition +NOTICE: merging constraint "f1_pos" with inherited definition +alter table p1_c1 drop constraint f1_pos; +ERROR: cannot drop inherited constraint "f1_pos" of relation "p1_c1" +alter table p1 drop constraint f1_pos; +\d p1_c1 + Table "public.p1_c1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + f1 | integer | | | +Check constraints: + "f1_pos" CHECK (f1 > 0) +Inherits: p1 + +drop table p1 cascade; +NOTICE: drop cascades to table p1_c1 +create table p1(f1 int constraint f1_pos CHECK (f1 > 0)); +create table p2(f1 int constraint f1_pos CHECK (f1 > 0)); +create table p1p2_c1 (f1 int) inherits (p1, p2); +NOTICE: merging multiple inherited definitions of column "f1" +NOTICE: merging column "f1" with inherited definition +create table p1p2_c2 (f1 int constraint f1_pos CHECK (f1 > 0)) inherits (p1, p2); +NOTICE: merging multiple inherited definitions of column "f1" +NOTICE: merging column "f1" with inherited definition +NOTICE: merging constraint "f1_pos" with inherited definition +alter table p2 drop constraint f1_pos; +alter table p1 drop constraint f1_pos; +\d p1p2_c* + Table "public.p1p2_c1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + f1 | integer | | | +Inherits: p1, + p2 + + Table "public.p1p2_c2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + f1 | integer | | | +Check constraints: + "f1_pos" CHECK (f1 > 0) +Inherits: p1, + p2 + +drop table p1, p2 cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table p1p2_c1 +drop cascades to table p1p2_c2 +create table p1(f1 int constraint f1_pos CHECK (f1 > 0)); +create table p1_c1() inherits (p1); +create table p1_c2() inherits (p1); +create table p1_c1c2() inherits (p1_c1, p1_c2); +NOTICE: merging multiple inherited definitions of column "f1" +\d p1_c1c2 + Table "public.p1_c1c2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + f1 | integer | | | +Check constraints: + "f1_pos" CHECK (f1 > 0) +Inherits: p1_c1, + p1_c2 + +alter table p1 drop constraint f1_pos; +\d p1_c1c2 + Table "public.p1_c1c2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + f1 | integer | | | +Inherits: p1_c1, + p1_c2 + +drop table p1 cascade; +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to table p1_c1 +drop cascades to table p1_c2 +drop cascades to table p1_c1c2 +create table p1(f1 int constraint f1_pos CHECK (f1 > 0)); +create table p1_c1() inherits (p1); +create table p1_c2(constraint f1_pos CHECK (f1 > 0)) inherits (p1); +NOTICE: merging constraint "f1_pos" with inherited definition +create table p1_c1c2() inherits (p1_c1, p1_c2, p1); +NOTICE: merging multiple inherited definitions of column "f1" +NOTICE: merging multiple inherited definitions of column "f1" +alter table p1_c2 drop constraint f1_pos; +ERROR: cannot drop inherited constraint "f1_pos" of relation "p1_c2" +alter table p1 drop constraint f1_pos; +alter table p1_c1c2 drop constraint f1_pos; +ERROR: cannot drop inherited constraint "f1_pos" of relation "p1_c1c2" +alter table p1_c2 drop constraint f1_pos; +\d p1_c1c2 + Table "public.p1_c1c2" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + f1 | integer | | | +Inherits: p1_c1, + p1_c2, + p1 + +drop table p1 cascade; +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to table p1_c1 +drop cascades to table p1_c2 +drop cascades to table p1_c1c2 -- Test that a valid child can have not-valid parent, but not vice versa create table invalid_check_con(f1 int); create table invalid_check_con_child() inherits(invalid_check_con); @@ -1490,8 +1656,8 @@ explain (verbose, costs off) select min(1-id) from matest0; QUERY PLAN --------------------------------------------------------------------------------- Result - Output: $0 - InitPlan 1 (returns $0) + Output: (InitPlan 1).col1 + InitPlan 1 -> Limit Output: ((1 - matest0.id)) -> Result @@ -1524,6 +1690,36 @@ select min(1-id) from matest0; reset enable_seqscan; reset enable_parallel_append; +explain (verbose, costs off) -- bug #18652 +select 1 - id as c from +(select id from matest3 t1 union all select id * 2 from matest3 t2) ss +order by c; + QUERY PLAN +------------------------------------------------------------ + Result + Output: ((1 - t1.id)) + -> Merge Append + Sort Key: ((1 - t1.id)) + -> Index Scan using matest3i on public.matest3 t1 + Output: t1.id, (1 - t1.id) + -> Sort + Output: ((t2.id * 2)), ((1 - (t2.id * 2))) + Sort Key: ((1 - (t2.id * 2))) + -> Seq Scan on public.matest3 t2 + Output: (t2.id * 2), (1 - (t2.id * 2)) +(11 rows) + +select 1 - id as c from +(select id from matest3 t1 union all select id * 2 from matest3 t2) ss +order by c; + c +----- + -11 + -9 + -5 + -4 +(4 rows) + drop table matest0 cascade; NOTICE: drop cascades to 3 other objects DETAIL: drop cascades to table matest1 @@ -1561,6 +1757,29 @@ order by t1.b limit 10; (14 rows) reset enable_nestloop; +drop table matest0 cascade; +NOTICE: drop cascades to table matest1 +-- Test a MergeAppend plan where one child requires a sort +create table matest0(a int primary key); +create table matest1() inherits (matest0); +insert into matest0 select generate_series(1, 400); +insert into matest1 select generate_series(1, 200); +analyze matest0; +analyze matest1; +explain (costs off) +select * from matest0 where a < 100 order by a; + QUERY PLAN +--------------------------------------------------------------- + Merge Append + Sort Key: matest0.a + -> Index Only Scan using matest0_pkey on matest0 matest0_1 + Index Cond: (a < 100) + -> Sort + Sort Key: matest0_2.a + -> Seq Scan on matest1 matest0_2 + Filter: (a < 100) +(8 rows) + drop table matest0 cascade; NOTICE: drop cascades to table matest1 -- @@ -1624,7 +1843,7 @@ SELECT min(x) FROM QUERY PLAN -------------------------------------------------------------------- Result - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Merge Append Sort Key: a.unique1 @@ -1642,7 +1861,7 @@ SELECT min(y) FROM QUERY PLAN -------------------------------------------------------------------- Result - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Merge Append Sort Key: a.unique1 @@ -1722,19 +1941,19 @@ insert into inhpar select x, x::text from generate_series(1,5) x; insert into inhcld select x::text, x from generate_series(6,10) x; explain (verbose, costs off) update inhpar i set (f1, f2) = (select i.f1, i.f2 || '-' from int4_tbl limit 1); - QUERY PLAN -------------------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------------------------------------- Update on public.inhpar i Update on public.inhpar i_1 Update on public.inhcld i_2 -> Result - Output: $2, $3, (SubPlan 1 (returns $2,$3)), i.tableoid, i.ctid + Output: (SubPlan 1).col1, (SubPlan 1).col2, (rescan SubPlan 1), i.tableoid, i.ctid -> Append -> Seq Scan on public.inhpar i_1 Output: i_1.f1, i_1.f2, i_1.tableoid, i_1.ctid -> Seq Scan on public.inhcld i_2 Output: i_2.f1, i_2.f2, i_2.tableoid, i_2.ctid - SubPlan 1 (returns $2,$3) + SubPlan 1 -> Limit Output: (i.f1), (((i.f2)::text || '-'::text)) -> Seq Scan on public.int4_tbl @@ -1770,21 +1989,21 @@ alter table inhpar attach partition inhcld2 for values from (5) to (100); insert into inhpar select x, x::text from generate_series(1,10) x; explain (verbose, costs off) update inhpar i set (f1, f2) = (select i.f1, i.f2 || '-' from int4_tbl limit 1); - QUERY PLAN ------------------------------------------------------------------------------------ + QUERY PLAN +------------------------------------------------------------------------------------------------------ Update on public.inhpar i Update on public.inhcld1 i_1 Update on public.inhcld2 i_2 -> Append -> Seq Scan on public.inhcld1 i_1 - Output: $2, $3, (SubPlan 1 (returns $2,$3)), i_1.tableoid, i_1.ctid - SubPlan 1 (returns $2,$3) + Output: (SubPlan 1).col1, (SubPlan 1).col2, (rescan SubPlan 1), i_1.tableoid, i_1.ctid + SubPlan 1 -> Limit Output: (i_1.f1), (((i_1.f2)::text || '-'::text)) -> Seq Scan on public.int4_tbl Output: i_1.f1, ((i_1.f2)::text || '-'::text) -> Seq Scan on public.inhcld2 i_2 - Output: $2, $3, (SubPlan 1 (returns $2,$3)), i_2.tableoid, i_2.ctid + Output: (SubPlan 1).col1, (SubPlan 1).col2, (rescan SubPlan 1), i_2.tableoid, i_2.ctid (13 rows) update inhpar i set (f1, f2) = (select i.f1, i.f2 || '-' from int4_tbl limit 1); @@ -1847,6 +2066,27 @@ select * from cnullparent where f1 = 2; drop table cnullparent cascade; NOTICE: drop cascades to table cnullchild -- +-- Mixed ownership inheritance tree +-- +create role regress_alice; +create role regress_bob; +grant all on schema public to regress_alice, regress_bob; +grant regress_alice to regress_bob; +set session authorization regress_alice; +create table inh_parent (a int not null); +set session authorization regress_bob; +create table inh_child () inherits (inh_parent); +set session authorization regress_alice; +-- alice can't do this: she doesn't own inh_child +alter table inh_parent alter a drop not null; +ERROR: must be owner of table inh_child +set session authorization regress_bob; +alter table inh_parent alter a drop not null; +reset session authorization; +drop table inh_parent, inh_child; +revoke all on schema public from regress_alice, regress_bob; +drop role regress_alice, regress_bob; +-- -- Check use of temporary tables with inheritance trees -- create table inh_perm_parent (a1 int); @@ -2174,11 +2414,11 @@ explain (costs off) select min(a), max(a) from parted_minmax where b = '12345'; QUERY PLAN ------------------------------------------------------------------------------------------------ Result - InitPlan 1 (returns $0) + InitPlan 1 -> Limit -> Index Only Scan using parted_minmax1i on parted_minmax1 parted_minmax Index Cond: ((a IS NOT NULL) AND (b = '12345'::text)) - InitPlan 2 (returns $1) + InitPlan 2 -> Limit -> Index Only Scan Backward using parted_minmax1i on parted_minmax1 parted_minmax_1 Index Cond: ((a IS NOT NULL) AND (b = '12345'::text)) diff --git a/src/test/regress/expected/insert.out b/src/test/regress/expected/insert.out index dd4354fc7d831..cf4b5221a8da1 100644 --- a/src/test/regress/expected/insert.out +++ b/src/test/regress/expected/insert.out @@ -180,7 +180,121 @@ Rules: drop table inserttest2; drop table inserttest; -drop type insert_test_type; +-- Make the same tests with domains over the array and composite fields +create domain insert_pos_ints as int[] check (value[1] > 0); +create domain insert_test_domain as insert_test_type + check ((value).if2[1] is not null); +create table inserttesta (f1 int, f2 insert_pos_ints); +create table inserttestb (f3 insert_test_domain, f4 insert_test_domain[]); +insert into inserttesta (f2[1], f2[2]) values (1,2); +insert into inserttesta (f2[1], f2[2]) values (3,4), (5,6); +insert into inserttesta (f2[1], f2[2]) select 7,8; +insert into inserttesta (f2[1], f2[2]) values (1,default); -- not supported +ERROR: cannot set an array element to DEFAULT +LINE 1: insert into inserttesta (f2[1], f2[2]) values (1,default); + ^ +insert into inserttesta (f2[1], f2[2]) values (0,2); +ERROR: value for domain insert_pos_ints violates check constraint "insert_pos_ints_check" +insert into inserttesta (f2[1], f2[2]) values (3,4), (0,6); +ERROR: value for domain insert_pos_ints violates check constraint "insert_pos_ints_check" +insert into inserttesta (f2[1], f2[2]) select 0,8; +ERROR: value for domain insert_pos_ints violates check constraint "insert_pos_ints_check" +insert into inserttestb (f3.if1, f3.if2) values (1,array['foo']); +insert into inserttestb (f3.if1, f3.if2) values (1,'{foo}'), (2,'{bar}'); +insert into inserttestb (f3.if1, f3.if2) select 3, '{baz,quux}'; +insert into inserttestb (f3.if1, f3.if2) values (1,default); -- not supported +ERROR: cannot set a subfield to DEFAULT +LINE 1: insert into inserttestb (f3.if1, f3.if2) values (1,default); + ^ +insert into inserttestb (f3.if1, f3.if2) values (1,array[null]); +ERROR: value for domain insert_test_domain violates check constraint "insert_test_domain_check" +insert into inserttestb (f3.if1, f3.if2) values (1,'{null}'), (2,'{bar}'); +ERROR: value for domain insert_test_domain violates check constraint "insert_test_domain_check" +insert into inserttestb (f3.if1, f3.if2) select 3, '{null,quux}'; +ERROR: value for domain insert_test_domain violates check constraint "insert_test_domain_check" +insert into inserttestb (f3.if2[1], f3.if2[2]) values ('foo', 'bar'); +insert into inserttestb (f3.if2[1], f3.if2[2]) values ('foo', 'bar'), ('baz', 'quux'); +insert into inserttestb (f3.if2[1], f3.if2[2]) select 'bear', 'beer'; +insert into inserttestb (f3, f4[1].if2[1], f4[1].if2[2]) values (row(1,'{x}'), 'foo', 'bar'); +insert into inserttestb (f3, f4[1].if2[1], f4[1].if2[2]) values (row(1,'{x}'), 'foo', 'bar'), (row(2,'{y}'), 'baz', 'quux'); +insert into inserttestb (f3, f4[1].if2[1], f4[1].if2[2]) select row(1,'{x}')::insert_test_domain, 'bear', 'beer'; +select * from inserttesta; + f1 | f2 +----+------- + | {1,2} + | {3,4} + | {5,6} + | {7,8} +(4 rows) + +select * from inserttestb; + f3 | f4 +------------------+------------------------ + (1,{foo}) | + (1,{foo}) | + (2,{bar}) | + (3,"{baz,quux}") | + (,"{foo,bar}") | + (,"{foo,bar}") | + (,"{baz,quux}") | + (,"{bear,beer}") | + (1,{x}) | {"(,\"{foo,bar}\")"} + (1,{x}) | {"(,\"{foo,bar}\")"} + (2,{y}) | {"(,\"{baz,quux}\")"} + (1,{x}) | {"(,\"{bear,beer}\")"} +(12 rows) + +-- also check reverse-listing +create table inserttest2 (f1 bigint, f2 text); +create rule irule1 as on insert to inserttest2 do also + insert into inserttestb (f3.if2[1], f3.if2[2]) + values (new.f1,new.f2); +create rule irule2 as on insert to inserttest2 do also + insert into inserttestb (f4[1].if1, f4[1].if2[2]) + values (1,'fool'),(new.f1,new.f2); +create rule irule3 as on insert to inserttest2 do also + insert into inserttestb (f4[1].if1, f4[1].if2[2]) + select new.f1, new.f2; +\d+ inserttest2 + Table "public.inserttest2" + Column | Type | Collation | Nullable | Default | Storage | Stats target | Description +--------+--------+-----------+----------+---------+----------+--------------+------------- + f1 | bigint | | | | plain | | + f2 | text | | | | extended | | +Rules: + irule1 AS + ON INSERT TO inserttest2 DO INSERT INTO inserttestb (f3.if2[1], f3.if2[2]) + VALUES (new.f1, new.f2) + irule2 AS + ON INSERT TO inserttest2 DO INSERT INTO inserttestb (f4[1].if1, f4[1].if2[2]) VALUES (1,'fool'::text), (new.f1,new.f2) + irule3 AS + ON INSERT TO inserttest2 DO INSERT INTO inserttestb (f4[1].if1, f4[1].if2[2]) SELECT new.f1, + new.f2 + +drop table inserttest2; +drop table inserttesta; +drop table inserttestb; +drop domain insert_pos_ints; +drop domain insert_test_domain; +-- Verify that multiple inserts to subfields of a domain-over-container +-- check the domain constraints only on the finished value +create domain insert_nnarray as int[] + check (value[1] is not null and value[2] is not null); +create domain insert_test_domain as insert_test_type + check ((value).if1 is not null and (value).if2 is not null); +create table inserttesta (f1 insert_nnarray); +insert into inserttesta (f1[1]) values (1); -- fail +ERROR: value for domain insert_nnarray violates check constraint "insert_nnarray_check" +insert into inserttesta (f1[1], f1[2]) values (1, 2); +create table inserttestb (f1 insert_test_domain); +insert into inserttestb (f1.if1) values (1); -- fail +ERROR: value for domain insert_test_domain violates check constraint "insert_test_domain_check" +insert into inserttestb (f1.if1, f1.if2) values (1, '{foo}'); +drop table inserttesta; +drop table inserttestb; +drop domain insert_nnarray; +drop type insert_test_type cascade; +NOTICE: drop cascades to type insert_test_domain -- direct partition inserts should check partition bound constraint create table range_parted ( a text, diff --git a/src/test/regress/expected/insert_conflict.out b/src/test/regress/expected/insert_conflict.out index 9e9e3bd00cd13..5cb9cde0305aa 100644 --- a/src/test/regress/expected/insert_conflict.out +++ b/src/test/regress/expected/insert_conflict.out @@ -2,6 +2,8 @@ -- insert...on conflict do unique index inference -- create table insertconflicttest(key int4, fruit text); +-- These things should work through a view, as well +create view insertconflictview as select * from insertconflicttest; -- -- Test unique index inference with operator class specifications and -- named collations @@ -43,6 +45,15 @@ explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on con -> Result (4 rows) +explain (costs off) insert into insertconflictview values(0, 'Crowberry') on conflict (lower(fruit), key, lower(fruit), key) do nothing; + QUERY PLAN +------------------------------------------------- + Insert on insertconflicttest + Conflict Resolution: NOTHING + Conflict Arbiter Indexes: both_index_expr_key + -> Result +(4 rows) + explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key, fruit) do update set fruit = excluded.fruit where exists (select 1 from insertconflicttest ii where ii.key = excluded.key); QUERY PLAN @@ -50,7 +61,7 @@ explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on con Insert on insertconflicttest Conflict Resolution: UPDATE Conflict Arbiter Indexes: op_index_key, collation_index_key, both_index_key - Conflict Filter: (SubPlan 1) + Conflict Filter: EXISTS(SubPlan 1) -> Result SubPlan 1 -> Index Only Scan using both_index_expr_key on insertconflicttest ii @@ -272,6 +283,12 @@ ERROR: invalid reference to FROM-clause entry for table "insertconflicttest" LINE 1: ...onfruit') on conflict (key) do update set fruit = insertconf... ^ HINT: Perhaps you meant to reference the table alias "ict". +-- Check helpful hint when qualifying set column with target table +insert into insertconflicttest values (3, 'Kiwi') on conflict (key, fruit) do update set insertconflicttest.fruit = 'Mango'; +ERROR: column "insertconflicttest" of relation "insertconflicttest" does not exist +LINE 1: ...3, 'Kiwi') on conflict (key, fruit) do update set insertconf... + ^ +HINT: SET target columns cannot be qualified with the relation name. drop index key_index; -- -- Composite key tests @@ -374,6 +391,7 @@ create unique index partial_key_index on insertconflicttest(key) where fruit lik -- Succeeds insert into insertconflicttest values (23, 'Blackberry') on conflict (key) where fruit like '%berry' do update set fruit = excluded.fruit; insert into insertconflicttest as t values (23, 'Blackberry') on conflict (key) where fruit like '%berry' and t.fruit = 'inconsequential' do nothing; +insert into insertconflictview as t values (23, 'Blackberry') on conflict (key) where fruit like '%berry' and t.fruit = 'inconsequential' do nothing; -- fails insert into insertconflicttest values (23, 'Blackberry') on conflict (key) do update set fruit = excluded.fruit; ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification @@ -439,6 +457,7 @@ explain (costs off) insert into insertconflicttest as i values (23, 'Avocado') o drop index plain; -- Cleanup +drop view insertconflictview; drop table insertconflicttest; -- -- Verify that EXCLUDED does not allow system column references. These diff --git a/src/test/regress/expected/int8.out b/src/test/regress/expected/int8.out index 9542d622bab88..fddc09f6305a8 100644 --- a/src/test/regress/expected/int8.out +++ b/src/test/regress/expected/int8.out @@ -679,6 +679,8 @@ select -('-9223372036854775807'::int8); select -('-9223372036854775808'::int8); ERROR: bigint out of range +select 0::int8 - '-9223372036854775808'::int8; +ERROR: bigint out of range select '9223372036854775800'::int8 + '9223372036854775800'::int8; ERROR: bigint out of range select '-9223372036854775800'::int8 + '-9223372036854775800'::int8; diff --git a/src/test/regress/expected/interval.out b/src/test/regress/expected/interval.out index 28b71d9681784..51ae010c7baba 100644 --- a/src/test/regress/expected/interval.out +++ b/src/test/regress/expected/interval.out @@ -52,6 +52,18 @@ SELECT INTERVAL '10 years -11 month -12 days +13:14' AS "9 years..."; 9 years 1 mon -12 days +13:14:00 (1 row) +SELECT INTERVAL 'infinity' AS "eternity"; + eternity +---------- + infinity +(1 row) + +SELECT INTERVAL '-infinity' AS "beginning of time"; + beginning of time +------------------- + -infinity +(1 row) + CREATE TABLE INTERVAL_TBL (f1 interval); INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 1 minute'); INSERT INTO INTERVAL_TBL (f1) VALUES ('@ 5 hour'); @@ -63,6 +75,8 @@ INSERT INTO INTERVAL_TBL (f1) VALUES ('1 day 2 hours 3 minutes 4 seconds'); INSERT INTO INTERVAL_TBL (f1) VALUES ('6 years'); INSERT INTO INTERVAL_TBL (f1) VALUES ('5 months'); INSERT INTO INTERVAL_TBL (f1) VALUES ('5 months 12 hours'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('infinity'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('-infinity'); -- badly formatted interval INSERT INTO INTERVAL_TBL (f1) VALUES ('badly formatted interval'); ERROR: invalid input syntax for type interval: "badly formatted interval" @@ -117,7 +131,9 @@ SELECT * FROM INTERVAL_TBL; 6 years 5 mons 5 mons 12:00:00 -(10 rows) + infinity + -infinity +(12 rows) SELECT * FROM INTERVAL_TBL WHERE INTERVAL_TBL.f1 <> interval '@ 10 days'; @@ -132,7 +148,9 @@ SELECT * FROM INTERVAL_TBL 6 years 5 mons 5 mons 12:00:00 -(9 rows) + infinity + -infinity +(11 rows) SELECT * FROM INTERVAL_TBL WHERE INTERVAL_TBL.f1 <= interval '@ 5 hours'; @@ -141,7 +159,8 @@ SELECT * FROM INTERVAL_TBL 00:01:00 05:00:00 -00:00:14 -(3 rows) + -infinity +(4 rows) SELECT * FROM INTERVAL_TBL WHERE INTERVAL_TBL.f1 < interval '@ 1 day'; @@ -150,7 +169,8 @@ SELECT * FROM INTERVAL_TBL 00:01:00 05:00:00 -00:00:14 -(3 rows) + -infinity +(4 rows) SELECT * FROM INTERVAL_TBL WHERE INTERVAL_TBL.f1 = interval '@ 34 years'; @@ -168,7 +188,8 @@ SELECT * FROM INTERVAL_TBL 6 years 5 mons 5 mons 12:00:00 -(5 rows) + infinity +(6 rows) SELECT * FROM INTERVAL_TBL WHERE INTERVAL_TBL.f1 > interval '@ 3 seconds ago'; @@ -183,7 +204,8 @@ SELECT * FROM INTERVAL_TBL 6 years 5 mons 5 mons 12:00:00 -(9 rows) + infinity +(10 rows) SELECT r1.*, r2.* FROM INTERVAL_TBL r1, INTERVAL_TBL r2 @@ -191,27 +213,35 @@ SELECT r1.*, r2.* ORDER BY r1.f1, r2.f1; f1 | f1 -----------------+----------------- + -00:00:14 | -infinity + 00:01:00 | -infinity 00:01:00 | -00:00:14 + 05:00:00 | -infinity 05:00:00 | -00:00:14 05:00:00 | 00:01:00 + 1 day 02:03:04 | -infinity 1 day 02:03:04 | -00:00:14 1 day 02:03:04 | 00:01:00 1 day 02:03:04 | 05:00:00 + 10 days | -infinity 10 days | -00:00:14 10 days | 00:01:00 10 days | 05:00:00 10 days | 1 day 02:03:04 + 3 mons | -infinity 3 mons | -00:00:14 3 mons | 00:01:00 3 mons | 05:00:00 3 mons | 1 day 02:03:04 3 mons | 10 days + 5 mons | -infinity 5 mons | -00:00:14 5 mons | 00:01:00 5 mons | 05:00:00 5 mons | 1 day 02:03:04 5 mons | 10 days 5 mons | 3 mons + 5 mons 12:00:00 | -infinity 5 mons 12:00:00 | -00:00:14 5 mons 12:00:00 | 00:01:00 5 mons 12:00:00 | 05:00:00 @@ -219,6 +249,7 @@ SELECT r1.*, r2.* 5 mons 12:00:00 | 10 days 5 mons 12:00:00 | 3 mons 5 mons 12:00:00 | 5 mons + 6 years | -infinity 6 years | -00:00:14 6 years | 00:01:00 6 years | 05:00:00 @@ -227,6 +258,7 @@ SELECT r1.*, r2.* 6 years | 3 mons 6 years | 5 mons 6 years | 5 mons 12:00:00 + 34 years | -infinity 34 years | -00:00:14 34 years | 00:01:00 34 years | 05:00:00 @@ -236,8 +268,63 @@ SELECT r1.*, r2.* 34 years | 5 mons 34 years | 5 mons 12:00:00 34 years | 6 years -(45 rows) + infinity | -infinity + infinity | -00:00:14 + infinity | 00:01:00 + infinity | 05:00:00 + infinity | 1 day 02:03:04 + infinity | 10 days + infinity | 3 mons + infinity | 5 mons + infinity | 5 mons 12:00:00 + infinity | 6 years + infinity | 34 years +(66 rows) + +-- test unary minus +SELECT f1, -f1 FROM INTERVAL_TBL; + f1 | ?column? +-----------------+------------------- + 00:01:00 | -00:01:00 + 05:00:00 | -05:00:00 + 10 days | -10 days + 34 years | -34 years + 3 mons | -3 mons + -00:00:14 | 00:00:14 + 1 day 02:03:04 | -1 days -02:03:04 + 6 years | -6 years + 5 mons | -5 mons + 5 mons 12:00:00 | -5 mons -12:00:00 + infinity | -infinity + -infinity | infinity +(12 rows) + +SELECT -('-2147483648 months'::interval); -- should fail +ERROR: interval out of range +SELECT -('-2147483647 months'::interval); -- ok + ?column? +------------------------ + 178956970 years 7 mons +(1 row) + +SELECT -('-2147483648 days'::interval); -- should fail +ERROR: interval out of range +SELECT -('-2147483647 days'::interval); -- ok + ?column? +----------------- + 2147483647 days +(1 row) +SELECT -('-9223372036854775808 us'::interval); -- should fail +ERROR: interval out of range +SELECT -('-9223372036854775807 us'::interval); -- ok + ?column? +------------------------- + 2562047788:00:54.775807 +(1 row) + +SELECT -('-2147483647 months -2147483647 days -9223372036854775807 us'::interval); -- should fail +ERROR: interval out of range -- Test intervals that are large enough to overflow 64 bits in comparisons CREATE TEMP TABLE INTERVAL_TBL_OF (f1 interval); INSERT INTO INTERVAL_TBL_OF (f1) VALUES @@ -304,6 +391,17 @@ SELECT f1 FROM INTERVAL_TBL_OF r1 ORDER BY f1; (5 rows) RESET enable_seqscan; +-- subtracting about-to-overflow values should result in 0 +SELECT f1 - f1 FROM INTERVAL_TBL_OF; + ?column? +---------- + 00:00:00 + 00:00:00 + 00:00:00 + 00:00:00 + 00:00:00 +(5 rows) + DROP TABLE INTERVAL_TBL_OF; -- Test multiplication and division with intervals. -- Floating point arithmetic rounding errors can lead to unexpected results, @@ -386,12 +484,27 @@ SELECT * FROM INTERVAL_TBL; @ 6 years @ 5 mons @ 5 mons 12 hours -(10 rows) + infinity + -infinity +(12 rows) +-- multiplication and division overflow test cases +SELECT '3000000 months'::interval * 1000; +ERROR: interval out of range +SELECT '3000000 months'::interval / 0.001; +ERROR: interval out of range +SELECT '3000000 days'::interval * 1000; +ERROR: interval out of range +SELECT '3000000 days'::interval / 0.001; +ERROR: interval out of range +SELECT '1 month 2146410 days'::interval * 1000.5002; +ERROR: interval out of range +SELECT '4611686018427387904 usec'::interval / 0.1; +ERROR: interval out of range -- test avg(interval), which is somewhat fragile since people have been -- known to change the allowed input syntax for type interval without -- updating pg_aggregate.agginitval -select avg(f1) from interval_tbl; +select avg(f1) from interval_tbl where isfinite(f1); avg ------------------------------------------------- @ 4 years 1 mon 10 days 4 hours 18 mins 23 secs @@ -816,12 +929,20 @@ SELECT interval '1 2:03:04.5678' minute to second(2); 1 day 02:03:04.57 (1 row) +SELECT interval '2562047788:00:54.775807' second(2); -- out of range +ERROR: interval out of range +LINE 1: SELECT interval '2562047788:00:54.775807' second(2); + ^ +SELECT interval '-2562047788:00:54.775807' second(2); -- out of range +ERROR: interval out of range +LINE 1: SELECT interval '-2562047788:00:54.775807' second(2); + ^ -- test casting to restricted precision (bug #14479) SELECT f1, f1::INTERVAL DAY TO MINUTE AS "minutes", (f1 + INTERVAL '1 month')::INTERVAL MONTH::INTERVAL YEAR AS "years" FROM interval_tbl; - f1 | minutes | years ------------------+-----------------+---------- + f1 | minutes | years +-----------------+-----------------+----------- 00:01:00 | 00:01:00 | 00:00:00 05:00:00 | 05:00:00 | 00:00:00 10 days | 10 days | 00:00:00 @@ -832,7 +953,9 @@ SELECT f1, f1::INTERVAL DAY TO MINUTE AS "minutes", 6 years | 6 years | 6 years 5 mons | 5 mons | 00:00:00 5 mons 12:00:00 | 5 mons 12:00:00 | 00:00:00 -(10 rows) + infinity | infinity | infinity + -infinity | -infinity | -infinity +(12 rows) -- test inputting and outputting SQL standard interval literals SET IntervalStyle TO sql_standard; @@ -1587,33 +1710,60 @@ select interval '-2147483648 months -2147483648 days -9223372036854775808 micros ERROR: interval field value out of range: "-2147483648 months -2147483648 days -9223372036854775808 microseconds ago" LINE 1: select interval '-2147483648 months -2147483648 days -922337... ^ +-- overflowing using make_interval +select make_interval(years := 178956971); +ERROR: interval out of range +select make_interval(years := -178956971); +ERROR: interval out of range +select make_interval(years := 1, months := 2147483647); +ERROR: interval out of range +select make_interval(years := -1, months := -2147483648); +ERROR: interval out of range +select make_interval(weeks := 306783379); +ERROR: interval out of range +select make_interval(weeks := -306783379); +ERROR: interval out of range +select make_interval(weeks := 1, days := 2147483647); +ERROR: interval out of range +select make_interval(weeks := -1, days := -2147483648); +ERROR: interval out of range +select make_interval(secs := 1e308); +ERROR: value out of range: overflow +select make_interval(secs := 1e18); +ERROR: interval out of range +select make_interval(secs := -1e18); +ERROR: interval out of range +select make_interval(mins := 1, secs := 9223372036800.0); +ERROR: interval out of range +select make_interval(mins := -1, secs := -9223372036800.0); +ERROR: interval out of range -- test that INT_MIN number is formatted properly SET IntervalStyle to postgres; -select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; +select interval '-2147483647 months -2147483648 days -9223372036854775808 us'; interval -------------------------------------------------------------------- - -178956970 years -8 mons -2147483648 days -2562047788:00:54.775808 + -178956970 years -7 mons -2147483648 days -2562047788:00:54.775808 (1 row) SET IntervalStyle to sql_standard; -select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; +select interval '-2147483647 months -2147483648 days -9223372036854775808 us'; interval --------------------------------------------------- - -178956970-8 -2147483648 -2562047788:00:54.775808 + -178956970-7 -2147483648 -2562047788:00:54.775808 (1 row) SET IntervalStyle to iso_8601; -select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; +select interval '-2147483647 months -2147483648 days -9223372036854775808 us'; interval ----------------------------------------------------- - P-178956970Y-8M-2147483648DT-2562047788H-54.775808S + P-178956970Y-7M-2147483648DT-2562047788H-54.775808S (1 row) SET IntervalStyle to postgres_verbose; -select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; +select interval '-2147483647 months -2147483648 days -9223372036854775808 us'; interval ------------------------------------------------------------------------------ - @ 178956970 years 8 mons 2147483648 days 2562047788 hours 54.775808 secs ago + @ 178956970 years 7 mons 2147483648 days 2562047788 hours 54.775808 secs ago (1 row) -- check that '30 days' equals '1 month' according to the hash function @@ -1692,19 +1842,21 @@ SELECT f1, EXTRACT(MILLENNIUM FROM f1) AS MILLENNIUM, EXTRACT(EPOCH FROM f1) AS EPOCH FROM INTERVAL_TBL; - f1 | microsecond | millisecond | second | minute | hour | day | month | quarter | year | decade | century | millennium | epoch --------------------------------+-------------+-------------+------------+--------+------+-----+-------+---------+------+--------+---------+------------+------------------- - @ 1 min | 0 | 0.000 | 0.000000 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 60.000000 - @ 5 hours | 0 | 0.000 | 0.000000 | 0 | 5 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 18000.000000 - @ 10 days | 0 | 0.000 | 0.000000 | 0 | 0 | 10 | 0 | 1 | 0 | 0 | 0 | 0 | 864000.000000 - @ 34 years | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 0 | 1 | 34 | 3 | 0 | 0 | 1072958400.000000 - @ 3 mons | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 3 | 2 | 0 | 0 | 0 | 0 | 7776000.000000 - @ 14 secs ago | -14000000 | -14000.000 | -14.000000 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | -14.000000 - @ 1 day 2 hours 3 mins 4 secs | 4000000 | 4000.000 | 4.000000 | 3 | 2 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 93784.000000 - @ 6 years | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 0 | 1 | 6 | 0 | 0 | 0 | 189345600.000000 - @ 5 mons | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 5 | 2 | 0 | 0 | 0 | 0 | 12960000.000000 - @ 5 mons 12 hours | 0 | 0.000 | 0.000000 | 0 | 12 | 0 | 5 | 2 | 0 | 0 | 0 | 0 | 13003200.000000 -(10 rows) + f1 | microsecond | millisecond | second | minute | hour | day | month | quarter | year | decade | century | millennium | epoch +-------------------------------+-------------+-------------+------------+--------+-----------+-----------+-------+---------+-----------+-----------+-----------+------------+------------------- + @ 1 min | 0 | 0.000 | 0.000000 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 60.000000 + @ 5 hours | 0 | 0.000 | 0.000000 | 0 | 5 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 18000.000000 + @ 10 days | 0 | 0.000 | 0.000000 | 0 | 0 | 10 | 0 | 1 | 0 | 0 | 0 | 0 | 864000.000000 + @ 34 years | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 0 | 1 | 34 | 3 | 0 | 0 | 1072958400.000000 + @ 3 mons | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 3 | 2 | 0 | 0 | 0 | 0 | 7776000.000000 + @ 14 secs ago | -14000000 | -14000.000 | -14.000000 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | -14.000000 + @ 1 day 2 hours 3 mins 4 secs | 4000000 | 4000.000 | 4.000000 | 3 | 2 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 93784.000000 + @ 6 years | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 0 | 1 | 6 | 0 | 0 | 0 | 189345600.000000 + @ 5 mons | 0 | 0.000 | 0.000000 | 0 | 0 | 0 | 5 | 2 | 0 | 0 | 0 | 0 | 12960000.000000 + @ 5 mons 12 hours | 0 | 0.000 | 0.000000 | 0 | 12 | 0 | 5 | 2 | 0 | 0 | 0 | 0 | 13003200.000000 + infinity | | | | | Infinity | Infinity | | | Infinity | Infinity | Infinity | Infinity | Infinity + -infinity | | | | | -Infinity | -Infinity | | | -Infinity | -Infinity | -Infinity | -Infinity | -Infinity +(12 rows) SELECT EXTRACT(FORTNIGHT FROM INTERVAL '2 days'); -- error ERROR: unit "fortnight" not recognized for type interval @@ -1778,7 +1930,9 @@ SELECT f1, @ 6 years | 0 | 0 | 0 | 189345600 @ 5 mons | 0 | 0 | 0 | 12960000 @ 5 mons 12 hours | 0 | 0 | 0 | 13003200 -(10 rows) + infinity | | | | Infinity + -infinity | | | | -Infinity +(12 rows) -- internal overflow test case SELECT extract(epoch from interval '1000000000 days'); @@ -1787,3 +1941,346 @@ SELECT extract(epoch from interval '1000000000 days'); 86400000000000.000000 (1 row) +-- +-- test infinite intervals +-- +-- largest finite intervals +SELECT interval '-2147483648 months -2147483648 days -9223372036854775807 us'; + interval +------------------------------------------------------------------------------ + @ 178956970 years 8 mons 2147483648 days 2562047788 hours 54.775807 secs ago +(1 row) + +SELECT interval '2147483647 months 2147483647 days 9223372036854775806 us'; + interval +-------------------------------------------------------------------------- + @ 178956970 years 7 mons 2147483647 days 2562047788 hours 54.775806 secs +(1 row) + +-- infinite intervals +SELECT interval '-2147483648 months -2147483648 days -9223372036854775808 us'; + interval +----------- + -infinity +(1 row) + +SELECT interval '2147483647 months 2147483647 days 9223372036854775807 us'; + interval +---------- + infinity +(1 row) + +CREATE TABLE INFINITE_INTERVAL_TBL (i interval); +INSERT INTO INFINITE_INTERVAL_TBL VALUES ('infinity'), ('-infinity'), ('1 year 2 days 3 hours'); +SELECT i, isfinite(i) FROM INFINITE_INTERVAL_TBL; + i | isfinite +-------------------------+---------- + infinity | f + -infinity | f + @ 1 year 2 days 3 hours | t +(3 rows) + +-- test basic arithmetic +CREATE FUNCTION eval(expr text) +RETURNS text AS +$$ +DECLARE + result text; +BEGIN + EXECUTE 'select '||expr INTO result; + RETURN result; +EXCEPTION WHEN OTHERS THEN + RETURN SQLERRM; +END +$$ +LANGUAGE plpgsql; +SELECT d AS date, i AS interval, + eval(format('date %L + interval %L', d, i)) AS plus, + eval(format('date %L - interval %L', d, i)) AS minus +FROM (VALUES (date '-infinity'), + (date '1995-08-06'), + (date 'infinity')) AS t1(d), + (VALUES (interval '-infinity'), + (interval 'infinity')) AS t2(i); + date | interval | plus | minus +------------+-----------+------------------------+------------------------ + -infinity | -infinity | -infinity | timestamp out of range + -infinity | infinity | timestamp out of range | -infinity + 1995-08-06 | -infinity | -infinity | infinity + 1995-08-06 | infinity | infinity | -infinity + infinity | -infinity | timestamp out of range | infinity + infinity | infinity | infinity | timestamp out of range +(6 rows) + +SELECT i1 AS interval1, i2 AS interval2, + eval(format('interval %L + interval %L', i1, i2)) AS plus, + eval(format('interval %L - interval %L', i1, i2)) AS minus +FROM (VALUES (interval '-infinity'), + (interval '2 months'), + (interval 'infinity')) AS t1(i1), + (VALUES (interval '-infinity'), + (interval '10 days'), + (interval 'infinity')) AS t2(i2); + interval1 | interval2 | plus | minus +-----------+-----------+-----------------------+----------------------- + -infinity | -infinity | -infinity | interval out of range + -infinity | @ 10 days | -infinity | -infinity + -infinity | infinity | interval out of range | -infinity + @ 2 mons | -infinity | -infinity | infinity + @ 2 mons | @ 10 days | @ 2 mons 10 days | @ 2 mons -10 days + @ 2 mons | infinity | infinity | -infinity + infinity | -infinity | interval out of range | infinity + infinity | @ 10 days | infinity | infinity + infinity | infinity | infinity | interval out of range +(9 rows) + +SELECT interval '2147483646 months 2147483646 days 9223372036854775806 us' + interval '1 month 1 day 1 us'; +ERROR: interval out of range +SELECT interval '-2147483647 months -2147483647 days -9223372036854775807 us' + interval '-1 month -1 day -1 us'; +ERROR: interval out of range +SELECT interval '2147483646 months 2147483646 days 9223372036854775806 us' - interval '-1 month -1 day -1 us'; +ERROR: interval out of range +SELECT interval '-2147483647 months -2147483647 days -9223372036854775807 us' - interval '1 month 1 day 1 us'; +ERROR: interval out of range +SELECT t AS timestamp, i AS interval, + eval(format('timestamp %L + interval %L', t, i)) AS plus, + eval(format('timestamp %L - interval %L', t, i)) AS minus +FROM (VALUES (timestamp '-infinity'), + (timestamp '1995-08-06 12:30:15'), + (timestamp 'infinity')) AS t1(t), + (VALUES (interval '-infinity'), + (interval 'infinity')) AS t2(i); + timestamp | interval | plus | minus +---------------------+-----------+------------------------+------------------------ + -infinity | -infinity | -infinity | timestamp out of range + -infinity | infinity | timestamp out of range | -infinity + 1995-08-06 12:30:15 | -infinity | -infinity | infinity + 1995-08-06 12:30:15 | infinity | infinity | -infinity + infinity | -infinity | timestamp out of range | infinity + infinity | infinity | infinity | timestamp out of range +(6 rows) + +SELECT t AT TIME ZONE 'GMT' AS timestamptz, i AS interval, + eval(format('timestamptz %L + interval %L', t, i)) AS plus, + eval(format('timestamptz %L - interval %L', t, i)) AS minus +FROM (VALUES (timestamptz '-infinity'), + (timestamptz '1995-08-06 12:30:15 GMT'), + (timestamptz 'infinity')) AS t1(t), + (VALUES (interval '-infinity'), + (interval 'infinity')) AS t2(i); + timestamptz | interval | plus | minus +---------------------+-----------+------------------------+------------------------ + -infinity | -infinity | -infinity | timestamp out of range + -infinity | infinity | timestamp out of range | -infinity + 1995-08-06 12:30:15 | -infinity | -infinity | infinity + 1995-08-06 12:30:15 | infinity | infinity | -infinity + infinity | -infinity | timestamp out of range | infinity + infinity | infinity | infinity | timestamp out of range +(6 rows) + +-- time +/- infinite interval not supported +SELECT time '11:27:42' + interval 'infinity'; +ERROR: cannot add infinite interval to time +SELECT time '11:27:42' + interval '-infinity'; +ERROR: cannot add infinite interval to time +SELECT time '11:27:42' - interval 'infinity'; +ERROR: cannot subtract infinite interval from time +SELECT time '11:27:42' - interval '-infinity'; +ERROR: cannot subtract infinite interval from time +SELECT timetz '11:27:42' + interval 'infinity'; +ERROR: cannot add infinite interval to time +SELECT timetz '11:27:42' + interval '-infinity'; +ERROR: cannot add infinite interval to time +SELECT timetz '11:27:42' - interval 'infinity'; +ERROR: cannot subtract infinite interval from time +SELECT timetz '11:27:42' - interval '-infinity'; +ERROR: cannot subtract infinite interval from time +SELECT lhst.i lhs, + rhst.i rhs, + lhst.i < rhst.i AS lt, + lhst.i <= rhst.i AS le, + lhst.i = rhst.i AS eq, + lhst.i > rhst.i AS gt, + lhst.i >= rhst.i AS ge, + lhst.i <> rhst.i AS ne + FROM INFINITE_INTERVAL_TBL lhst CROSS JOIN INFINITE_INTERVAL_TBL rhst + WHERE NOT isfinite(lhst.i); + lhs | rhs | lt | le | eq | gt | ge | ne +-----------+-------------------------+----+----+----+----+----+---- + infinity | infinity | f | t | t | f | t | f + -infinity | infinity | t | t | f | f | f | t + infinity | -infinity | f | f | f | t | t | t + -infinity | -infinity | f | t | t | f | t | f + infinity | @ 1 year 2 days 3 hours | f | f | f | t | t | t + -infinity | @ 1 year 2 days 3 hours | t | t | f | f | f | t +(6 rows) + +SELECT i AS interval, + -i AS um, + i * 2.0 AS mul, + i * -2.0 AS mul_neg, + i * 'infinity' AS mul_inf, + i * '-infinity' AS mul_inf_neg, + i / 3.0 AS div, + i / -3.0 AS div_neg + FROM INFINITE_INTERVAL_TBL + WHERE NOT isfinite(i); + interval | um | mul | mul_neg | mul_inf | mul_inf_neg | div | div_neg +-----------+-----------+-----------+-----------+-----------+-------------+-----------+----------- + infinity | -infinity | infinity | -infinity | infinity | -infinity | infinity | -infinity + -infinity | infinity | -infinity | infinity | -infinity | infinity | -infinity | infinity +(2 rows) + +SELECT -interval '-2147483647 months -2147483647 days -9223372036854775807 us'; +ERROR: interval out of range +SELECT interval 'infinity' * 'nan'; +ERROR: interval out of range +SELECT interval '-infinity' * 'nan'; +ERROR: interval out of range +SELECT interval '-1073741824 months -1073741824 days -4611686018427387904 us' * 2; +ERROR: interval out of range +SELECT interval 'infinity' * 0; +ERROR: interval out of range +SELECT interval '-infinity' * 0; +ERROR: interval out of range +SELECT interval '0 days' * 'infinity'::float; +ERROR: interval out of range +SELECT interval '0 days' * '-infinity'::float; +ERROR: interval out of range +SELECT interval '5 days' * 'infinity'::float; + ?column? +---------- + infinity +(1 row) + +SELECT interval '5 days' * '-infinity'::float; + ?column? +----------- + -infinity +(1 row) + +SELECT interval 'infinity' / 'infinity'; +ERROR: interval out of range +SELECT interval 'infinity' / '-infinity'; +ERROR: interval out of range +SELECT interval 'infinity' / 'nan'; +ERROR: interval out of range +SELECT interval '-infinity' / 'infinity'; +ERROR: interval out of range +SELECT interval '-infinity' / '-infinity'; +ERROR: interval out of range +SELECT interval '-infinity' / 'nan'; +ERROR: interval out of range +SELECT interval '-1073741824 months -1073741824 days -4611686018427387904 us' / 0.5; +ERROR: interval out of range +SELECT date_bin('infinity', timestamp '2001-02-16 20:38:40', timestamp '2001-02-16 20:05:00'); +ERROR: timestamps cannot be binned into infinite intervals +SELECT date_bin('-infinity', timestamp '2001-02-16 20:38:40', timestamp '2001-02-16 20:05:00'); +ERROR: timestamps cannot be binned into infinite intervals +SELECT i AS interval, date_trunc('hour', i) + FROM INFINITE_INTERVAL_TBL + WHERE NOT isfinite(i); + interval | date_trunc +-----------+------------ + infinity | infinity + -infinity | -infinity +(2 rows) + +SELECT i AS interval, justify_days(i), justify_hours(i), justify_interval(i) + FROM INFINITE_INTERVAL_TBL + WHERE NOT isfinite(i); + interval | justify_days | justify_hours | justify_interval +-----------+--------------+---------------+------------------ + infinity | infinity | infinity | infinity + -infinity | -infinity | -infinity | -infinity +(2 rows) + +SELECT timezone('infinity'::interval, '1995-08-06 12:12:12'::timestamp); +ERROR: interval time zone "infinity" must be finite +SELECT timezone('-infinity'::interval, '1995-08-06 12:12:12'::timestamp); +ERROR: interval time zone "-infinity" must be finite +SELECT timezone('infinity'::interval, '1995-08-06 12:12:12'::timestamptz); +ERROR: interval time zone "infinity" must be finite +SELECT timezone('-infinity'::interval, '1995-08-06 12:12:12'::timestamptz); +ERROR: interval time zone "-infinity" must be finite +SELECT timezone('infinity'::interval, '12:12:12'::time); +ERROR: interval time zone "infinity" must be finite +SELECT timezone('-infinity'::interval, '12:12:12'::time); +ERROR: interval time zone "-infinity" must be finite +SELECT timezone('infinity'::interval, '12:12:12'::timetz); +ERROR: interval time zone "infinity" must be finite +SELECT timezone('-infinity'::interval, '12:12:12'::timetz); +ERROR: interval time zone "-infinity" must be finite +SELECT 'infinity'::interval::time; +ERROR: cannot convert infinite interval to time +SELECT '-infinity'::interval::time; +ERROR: cannot convert infinite interval to time +SELECT to_char('infinity'::interval, 'YYYY'); + to_char +--------- + +(1 row) + +SELECT to_char('-infinity'::interval, 'YYYY'); + to_char +--------- + +(1 row) + +-- "ago" can only appear once at the end of an interval. +SELECT INTERVAL '42 days 2 seconds ago ago'; +ERROR: invalid input syntax for type interval: "42 days 2 seconds ago ago" +LINE 1: SELECT INTERVAL '42 days 2 seconds ago ago'; + ^ +SELECT INTERVAL '2 minutes ago 5 days'; +ERROR: invalid input syntax for type interval: "2 minutes ago 5 days" +LINE 1: SELECT INTERVAL '2 minutes ago 5 days'; + ^ +-- consecutive and dangling units are not allowed. +SELECT INTERVAL 'hour 5 months'; +ERROR: invalid input syntax for type interval: "hour 5 months" +LINE 1: SELECT INTERVAL 'hour 5 months'; + ^ +SELECT INTERVAL '1 year months days 5 hours'; +ERROR: invalid input syntax for type interval: "1 year months days 5 hours" +LINE 1: SELECT INTERVAL '1 year months days 5 hours'; + ^ +-- unacceptable reserved words in interval. Only "infinity", "+infinity" and +-- "-infinity" are allowed. +SELECT INTERVAL 'now'; +ERROR: invalid input syntax for type interval: "now" +LINE 1: SELECT INTERVAL 'now'; + ^ +SELECT INTERVAL 'today'; +ERROR: invalid input syntax for type interval: "today" +LINE 1: SELECT INTERVAL 'today'; + ^ +SELECT INTERVAL 'tomorrow'; +ERROR: invalid input syntax for type interval: "tomorrow" +LINE 1: SELECT INTERVAL 'tomorrow'; + ^ +SELECT INTERVAL 'allballs'; +ERROR: invalid input syntax for type interval: "allballs" +LINE 1: SELECT INTERVAL 'allballs'; + ^ +SELECT INTERVAL 'epoch'; +ERROR: invalid input syntax for type interval: "epoch" +LINE 1: SELECT INTERVAL 'epoch'; + ^ +SELECT INTERVAL 'yesterday'; +ERROR: invalid input syntax for type interval: "yesterday" +LINE 1: SELECT INTERVAL 'yesterday'; + ^ +-- infinity specification should be the only thing +SELECT INTERVAL 'infinity years'; +ERROR: invalid input syntax for type interval: "infinity years" +LINE 1: SELECT INTERVAL 'infinity years'; + ^ +SELECT INTERVAL 'infinity ago'; +ERROR: invalid input syntax for type interval: "infinity ago" +LINE 1: SELECT INTERVAL 'infinity ago'; + ^ +SELECT INTERVAL '+infinity -infinity'; +ERROR: invalid input syntax for type interval: "+infinity -infinity" +LINE 1: SELECT INTERVAL '+infinity -infinity'; + ^ diff --git a/src/test/regress/expected/join.out b/src/test/regress/expected/join.out index 9b8638f286ab2..2eaadceed0db1 100644 --- a/src/test/regress/expected/join.out +++ b/src/test/regress/expected/join.out @@ -2517,10 +2517,11 @@ where t1.f1 = coalesce(t2.f1, 1); -> Materialize -> Seq Scan on int4_tbl t2 Filter: (f1 > 1) - -> Seq Scan on int4_tbl t3 + -> Materialize + -> Seq Scan on int4_tbl t3 -> Materialize -> Seq Scan on int4_tbl t4 -(13 rows) +(14 rows) explain (costs off) select * from int4_tbl t1 @@ -2923,6 +2924,60 @@ select tt1.*, tt2.* from tt2 right join tt1 on tt1.joincol = tt2.joincol; 2 | | | (3 rows) +reset enable_hashjoin; +reset enable_nestloop; +-- +-- regression test for bug #18522 (merge-right-anti-join in inner_unique cases) +-- +create temp table tbl_ra(a int unique, b int); +insert into tbl_ra select i, i%100 from generate_series(1,1000)i; +create index on tbl_ra (b); +analyze tbl_ra; +set enable_hashjoin to off; +set enable_nestloop to off; +-- ensure we get a merge right anti join +explain (costs off) +select * from tbl_ra t1 +where not exists (select 1 from tbl_ra t2 where t2.b = t1.a) and t1.b < 2; + QUERY PLAN +------------------------------------------------------- + Merge Right Anti Join + Merge Cond: (t2.b = t1.a) + -> Index Only Scan using tbl_ra_b_idx on tbl_ra t2 + -> Sort + Sort Key: t1.a + -> Bitmap Heap Scan on tbl_ra t1 + Recheck Cond: (b < 2) + -> Bitmap Index Scan on tbl_ra_b_idx + Index Cond: (b < 2) +(9 rows) + +-- and check we get the expected results +select * from tbl_ra t1 +where not exists (select 1 from tbl_ra t2 where t2.b = t1.a) and t1.b < 2; + a | b +------+--- + 100 | 0 + 101 | 1 + 200 | 0 + 201 | 1 + 300 | 0 + 301 | 1 + 400 | 0 + 401 | 1 + 500 | 0 + 501 | 1 + 600 | 0 + 601 | 1 + 700 | 0 + 701 | 1 + 800 | 0 + 801 | 1 + 900 | 0 + 901 | 1 + 1000 | 0 +(19 rows) + reset enable_hashjoin; reset enable_nestloop; -- @@ -3028,10 +3083,10 @@ where unique1 in (select unique2 from tenk1 b); explain (costs off) select a.* from tenk1 a where unique1 not in (select unique2 from tenk1 b); - QUERY PLAN --------------------------------------------------------- + QUERY PLAN +----------------------------------------------------------- Seq Scan on tenk1 a - Filter: (NOT (hashed SubPlan 1)) + Filter: (NOT (ANY (unique1 = (hashed SubPlan 1).col1))) SubPlan 1 -> Index Only Scan using tenk1_unique2 on tenk1 b (4 rows) @@ -4133,6 +4188,32 @@ select * from mki4(42); drop function mki8(bigint, bigint); drop function mki4(int); +-- test const-folding of a whole-row Var into a per-field Var +-- (need to inline a function to reach this case, else parser does it) +create function f_field_select(t onek) returns int4 as +$$ select t.unique2; $$ language sql immutable; +explain (verbose, costs off) +select (t2.*).unique1, f_field_select(t2) from tenk1 t1 + left join onek t2 on t1.unique1 = t2.unique1 + left join int8_tbl t3 on true; + QUERY PLAN +-------------------------------------------------------------------- + Nested Loop Left Join + Output: t2.unique1, t2.unique2 + -> Hash Left Join + Output: t2.unique1, t2.unique2 + Hash Cond: (t1.unique1 = t2.unique1) + -> Index Only Scan using tenk1_unique1 on public.tenk1 t1 + Output: t1.unique1 + -> Hash + Output: t2.unique1, t2.unique2 + -> Seq Scan on public.onek t2 + Output: t2.unique1, t2.unique2 + -> Materialize + -> Seq Scan on public.int8_tbl t3 +(13 rows) + +drop function f_field_select(t onek); -- -- test extraction of restriction OR clauses from join OR clause -- (we used to only do this for indexable clauses) @@ -5251,13 +5332,13 @@ reset enable_nestloop; explain (costs off) select a.unique1, b.unique2 from onek a left join onek b on a.unique1 = b.unique2 - where b.unique2 = any (select q1 from int8_tbl c where c.q1 < b.unique1); - QUERY PLAN ----------------------------------------------------------- + where (b.unique2, random() > 0) = any (select q1, random() > 0 from int8_tbl c where c.q1 < b.unique1); + QUERY PLAN +------------------------------------------------------------------------------------------------------------------ Hash Join Hash Cond: (b.unique2 = a.unique1) -> Seq Scan on onek b - Filter: (SubPlan 1) + Filter: (ANY ((unique2 = (SubPlan 1).col1) AND ((random() > '0'::double precision) = (SubPlan 1).col2))) SubPlan 1 -> Seq Scan on int8_tbl c Filter: (q1 < b.unique1) @@ -5267,7 +5348,7 @@ select a.unique1, b.unique2 select a.unique1, b.unique2 from onek a left join onek b on a.unique1 = b.unique2 - where b.unique2 = any (select q1 from int8_tbl c where c.q1 < b.unique1); + where (b.unique2, random() > 0) = any (select q1, random() > 0 from int8_tbl c where c.q1 < b.unique1); unique1 | unique2 ---------+--------- 123 | 123 @@ -5788,13 +5869,11 @@ explain (costs off) select p.* from parent p left join child c on (p.k = c.k) where p.k = 1 and p.k = 2; - QUERY PLAN ------------------------------------------------- + QUERY PLAN +-------------------------- Result One-Time Filter: false - -> Index Scan using parent_pkey on parent p - Index Cond: (k = 1) -(4 rows) +(2 rows) select p.* from (parent p left join child c on (p.k = c.k)) join parent x on p.k = x.k @@ -6987,6 +7066,33 @@ select * from Output: (COALESCE((COALESCE(b.q2, '42'::bigint)), d.q2)) (24 rows) +-- another case requiring nested PlaceHolderVars +explain (verbose, costs off) +select * from + (select 0 as val0) as ss0 + left join (select 1 as val) as ss1 on true + left join lateral (select ss1.val as val_filtered where false) as ss2 on true; + QUERY PLAN +-------------------------------- + Nested Loop Left Join + Output: 0, (1), ((1)) + Join Filter: false + -> Result + Output: 1 + -> Result + Output: (1) + One-Time Filter: false +(8 rows) + +select * from + (select 0 as val0) as ss0 + left join (select 1 as val) as ss1 on true + left join lateral (select ss1.val as val_filtered where false) as ss2 on true; + val0 | val | val_filtered +------+-----+-------------- + 0 | 1 | +(1 row) + -- case that breaks the old ph_may_need optimization explain (verbose, costs off) select c.*,a.*,ss1.q1,ss2.q1,ss3.* from @@ -7175,12 +7281,12 @@ select * from (values (0), (1)) v(id), lateral (select * from int8_tbl t1, lateral (select * from (select * from int8_tbl t2 - where q1 = any (select q2 from int8_tbl t3 + where (q1, random() > 0) = any (select q2, random() > 0 from int8_tbl t3 where q2 = (select greatest(t1.q1,t2.q2)) and (select v.id=0)) offset 0) ss2) ss where t1.q1 = ss.q2) ss0; - QUERY PLAN ----------------------------------------------------------------------- + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------- Nested Loop Output: "*VALUES*".column1, t1.q1, t1.q2, ss2.q1, ss2.q2 -> Seq Scan on public.int8_tbl t1 @@ -7194,27 +7300,27 @@ lateral (select * from int8_tbl t1, Filter: (t1.q1 = ss2.q2) -> Seq Scan on public.int8_tbl t2 Output: t2.q1, t2.q2 - Filter: (SubPlan 3) + Filter: (ANY ((t2.q1 = (SubPlan 3).col1) AND ((random() > '0'::double precision) = (SubPlan 3).col2))) SubPlan 3 -> Result - Output: t3.q2 - One-Time Filter: $4 - InitPlan 1 (returns $2) + Output: t3.q2, (random() > '0'::double precision) + One-Time Filter: (InitPlan 2).col1 + InitPlan 1 -> Result Output: GREATEST(t1.q1, t2.q2) - InitPlan 2 (returns $4) + InitPlan 2 -> Result Output: ("*VALUES*".column1 = 0) -> Seq Scan on public.int8_tbl t3 Output: t3.q1, t3.q2 - Filter: (t3.q2 = $2) + Filter: (t3.q2 = (InitPlan 1).col1) (27 rows) select * from (values (0), (1)) v(id), lateral (select * from int8_tbl t1, lateral (select * from (select * from int8_tbl t2 - where q1 = any (select q2 from int8_tbl t3 + where (q1, random() > 0) = any (select q2, random() > 0 from int8_tbl t3 where q2 = (select greatest(t1.q1,t2.q2)) and (select v.id=0)) offset 0) ss2) ss where t1.q1 = ss.q2) ss0; @@ -7797,10 +7903,9 @@ where j1.id1 % 1000 = 1 and j2.id1 % 1000 = 1 and j2.id1 >= any (array[1,5]); Merge Cond: (j1.id1 = j2.id1) Join Filter: (j2.id2 = j1.id2) -> Index Scan using j1_id1_idx on j1 - -> Index Only Scan using j2_pkey on j2 + -> Index Scan using j2_id1_idx on j2 Index Cond: (id1 >= ANY ('{1,5}'::integer[])) - Filter: ((id1 % 1000) = 1) -(7 rows) +(6 rows) select * from j1 inner join j2 on j1.id1 = j2.id1 and j1.id2 = j2.id2 @@ -7874,3 +7979,60 @@ where exists (select 1 from j3 (13 rows) drop table j3; +-- Exercise the "skip fetch" Bitmap Heap Scan optimization when candidate +-- tuples are discarded. This may occur when: +-- 1. A join doesn't require all inner tuples to be scanned for each outer +-- tuple, and +-- 2. The inner side is scanned using a bitmap heap scan, and +-- 3. The bitmap heap scan is eligible for the "skip fetch" optimization. +-- This optimization is usable when no data from the underlying table is +-- needed. Use a temp table so it is only visible to this backend and +-- vacuum may reliably mark all blocks in the table all visible in the +-- visibility map. +CREATE TEMP TABLE skip_fetch (a INT, b INT) WITH (fillfactor=10); +INSERT INTO skip_fetch SELECT i % 3, i FROM generate_series(0,30) i; +CREATE INDEX ON skip_fetch(a); +VACUUM (ANALYZE) skip_fetch; +SET enable_indexonlyscan = off; +SET enable_seqscan = off; +EXPLAIN (COSTS OFF) +SELECT t1.a FROM skip_fetch t1 LEFT JOIN skip_fetch t2 ON t2.a = 1 WHERE t2.a IS NULL; + QUERY PLAN +--------------------------------------------------------- + Nested Loop Anti Join + -> Seq Scan on skip_fetch t1 + -> Materialize + -> Bitmap Heap Scan on skip_fetch t2 + Recheck Cond: (a = 1) + -> Bitmap Index Scan on skip_fetch_a_idx + Index Cond: (a = 1) +(7 rows) + +SELECT t1.a FROM skip_fetch t1 LEFT JOIN skip_fetch t2 ON t2.a = 1 WHERE t2.a IS NULL; + a +--- +(0 rows) + +RESET enable_indexonlyscan; +RESET enable_seqscan; +-- Test that we do not account for nullingrels when looking up statistics +CREATE TABLE group_tbl (a INT, b INT); +INSERT INTO group_tbl SELECT 1, 1; +CREATE STATISTICS group_tbl_stat (ndistinct) ON a, b FROM group_tbl; +ANALYZE group_tbl; +EXPLAIN (COSTS OFF) +SELECT 1 FROM group_tbl t1 + LEFT JOIN (SELECT a c1, COALESCE(a) c2 FROM group_tbl t2) s ON TRUE +GROUP BY s.c1, s.c2; + QUERY PLAN +-------------------------------------------- + Group + Group Key: t2.a, (COALESCE(t2.a)) + -> Sort + Sort Key: t2.a, (COALESCE(t2.a)) + -> Nested Loop Left Join + -> Seq Scan on group_tbl t1 + -> Seq Scan on group_tbl t2 +(7 rows) + +DROP TABLE group_tbl; diff --git a/src/test/regress/expected/json.out b/src/test/regress/expected/json.out index aa29bc597bde2..d16c067b22f8a 100644 --- a/src/test/regress/expected/json.out +++ b/src/test/regress/expected/json.out @@ -2282,6 +2282,9 @@ select json_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); {"a" : "1", "b" : "2", "" : "3", "d e f" : "a b c"} (1 row) +-- json_object_agg_unique requires unique keys +select json_object_agg_unique(mod(i,100), i) from generate_series(0, 199) i; +ERROR: duplicate JSON object key value: "0" -- json_to_record and json_to_recordset select * from json_to_record('{"a":1,"b":"foo","c":"bar"}') as x(a int, b text, d text); diff --git a/src/test/regress/expected/jsonb.out b/src/test/regress/expected/jsonb.out index 4a16d0dbafb1d..e66d7601899c8 100644 --- a/src/test/regress/expected/jsonb.out +++ b/src/test/regress/expected/jsonb.out @@ -1590,6 +1590,13 @@ SELECT jsonb_object_agg(name, type) FROM foo; INSERT INTO foo VALUES (999999, NULL, 'bar'); SELECT jsonb_object_agg(name, type) FROM foo; ERROR: field name must not be null +-- edge case for parser +SELECT jsonb_object_agg(DISTINCT 'a', 'abc'); + jsonb_object_agg +------------------ + {"a": "abc"} +(1 row) + -- jsonb_object -- empty object, one dimension SELECT jsonb_object('{}'); @@ -2498,6 +2505,121 @@ SELECT rec FROM jsonb_populate_record( (abc,3,"Thu Jan 02 00:00:00 2003") (1 row) +-- Tests to check soft-error support for populate_record_field() +-- populate_scalar() +create type jsb_char2 as (a char(2)); +select jsonb_populate_record_valid(NULL::jsb_char2, '{"a": "aaa"}'); + jsonb_populate_record_valid +----------------------------- + f +(1 row) + +select * from jsonb_populate_record(NULL::jsb_char2, '{"a": "aaa"}') q; +ERROR: value too long for type character(2) +select jsonb_populate_record_valid(NULL::jsb_char2, '{"a": "aa"}'); + jsonb_populate_record_valid +----------------------------- + t +(1 row) + +select * from jsonb_populate_record(NULL::jsb_char2, '{"a": "aa"}') q; + a +---- + aa +(1 row) + +-- populate_array() +create type jsb_ia as (a int[]); +create type jsb_ia2 as (a int[][]); +select jsonb_populate_record_valid(NULL::jsb_ia, '{"a": 43.2}'); + jsonb_populate_record_valid +----------------------------- + f +(1 row) + +select * from jsonb_populate_record(NULL::jsb_ia, '{"a": 43.2}') q; +ERROR: expected JSON array +HINT: See the value of key "a". +select jsonb_populate_record_valid(NULL::jsb_ia, '{"a": [1, 2]}'); + jsonb_populate_record_valid +----------------------------- + t +(1 row) + +select * from jsonb_populate_record(NULL::jsb_ia, '{"a": [1, 2]}') q; + a +------- + {1,2} +(1 row) + +select jsonb_populate_record_valid(NULL::jsb_ia2, '{"a": [[1], [2, 3]]}'); + jsonb_populate_record_valid +----------------------------- + f +(1 row) + +select * from jsonb_populate_record(NULL::jsb_ia2, '{"a": [[1], [2, 3]]}') q; +ERROR: malformed JSON array +DETAIL: Multidimensional arrays must have sub-arrays with matching dimensions. +select jsonb_populate_record_valid(NULL::jsb_ia2, '{"a": [[1, 0], [2, 3]]}'); + jsonb_populate_record_valid +----------------------------- + t +(1 row) + +select * from jsonb_populate_record(NULL::jsb_ia2, '{"a": [[1, 0], [2, 3]]}') q; + a +--------------- + {{1,0},{2,3}} +(1 row) + +-- populate_domain() +create domain jsb_i_not_null as int not null; +create domain jsb_i_gt_1 as int check (value > 1); +create type jsb_i_not_null_rec as (a jsb_i_not_null); +create type jsb_i_gt_1_rec as (a jsb_i_gt_1); +select jsonb_populate_record_valid(NULL::jsb_i_not_null_rec, '{"a": null}'); + jsonb_populate_record_valid +----------------------------- + f +(1 row) + +select * from jsonb_populate_record(NULL::jsb_i_not_null_rec, '{"a": null}') q; +ERROR: domain jsb_i_not_null does not allow null values +select jsonb_populate_record_valid(NULL::jsb_i_not_null_rec, '{"a": 1}'); + jsonb_populate_record_valid +----------------------------- + t +(1 row) + +select * from jsonb_populate_record(NULL::jsb_i_not_null_rec, '{"a": 1}') q; + a +--- + 1 +(1 row) + +select jsonb_populate_record_valid(NULL::jsb_i_gt_1_rec, '{"a": 1}'); + jsonb_populate_record_valid +----------------------------- + f +(1 row) + +select * from jsonb_populate_record(NULL::jsb_i_gt_1_rec, '{"a": 1}') q; +ERROR: value for domain jsb_i_gt_1 violates check constraint "jsb_i_gt_1_check" +select jsonb_populate_record_valid(NULL::jsb_i_gt_1_rec, '{"a": 2}'); + jsonb_populate_record_valid +----------------------------- + t +(1 row) + +select * from jsonb_populate_record(NULL::jsb_i_gt_1_rec, '{"a": 2}') q; + a +--- + 2 +(1 row) + +drop type jsb_ia, jsb_ia2, jsb_char2, jsb_i_not_null_rec, jsb_i_gt_1_rec; +drop domain jsb_i_not_null, jsb_i_gt_1; -- anonymous record type SELECT jsonb_populate_record(null::record, '{"x": 0, "y": 1}'); ERROR: could not determine row type for result of jsonb_populate_record diff --git a/src/test/regress/expected/jsonb_jsonpath.out b/src/test/regress/expected/jsonb_jsonpath.out index 6659bc9091ac0..8cf6ecfc7f8a1 100644 --- a/src/test/regress/expected/jsonb_jsonpath.out +++ b/src/test/regress/expected/jsonb_jsonpath.out @@ -1496,17 +1496,17 @@ select jsonb_path_query('"1.23"', '$.double()'); (1 row) select jsonb_path_query('"1.23aaa"', '$.double()'); -ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number +ERROR: argument "1.23aaa" of jsonpath item method .double() is invalid for type double precision select jsonb_path_query('1e1000', '$.double()'); -ERROR: numeric argument of jsonpath item method .double() is out of range for type double precision +ERROR: argument "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" of jsonpath item method .double() is invalid for type double precision select jsonb_path_query('"nan"', '$.double()'); -ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number +ERROR: NaN or Infinity is not allowed for jsonpath item method .double() select jsonb_path_query('"NaN"', '$.double()'); -ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number +ERROR: NaN or Infinity is not allowed for jsonpath item method .double() select jsonb_path_query('"inf"', '$.double()'); -ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number +ERROR: NaN or Infinity is not allowed for jsonpath item method .double() select jsonb_path_query('"-inf"', '$.double()'); -ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number +ERROR: NaN or Infinity is not allowed for jsonpath item method .double() select jsonb_path_query('"inf"', '$.double()', silent => true); jsonb_path_query ------------------ @@ -1732,7 +1732,1346 @@ select jsonb_path_query('"10-03-2017t12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH2 ERROR: unmatched format character "T" select jsonb_path_query('"10-03-2017 12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); ERROR: unmatched format character "T" +-- Test .bigint() +select jsonb_path_query('null', '$.bigint()'); +ERROR: jsonpath item method .bigint() can only be applied to a string or numeric value +select jsonb_path_query('true', '$.bigint()'); +ERROR: jsonpath item method .bigint() can only be applied to a string or numeric value +select jsonb_path_query('null', '$.bigint()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('true', '$.bigint()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', '$.bigint()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.bigint()'); +ERROR: jsonpath item method .bigint() can only be applied to a string or numeric value +select jsonb_path_query('{}', '$.bigint()'); +ERROR: jsonpath item method .bigint() can only be applied to a string or numeric value +select jsonb_path_query('[]', 'strict $.bigint()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{}', '$.bigint()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('"1.23"', '$.bigint()'); +ERROR: argument "1.23" of jsonpath item method .bigint() is invalid for type bigint +select jsonb_path_query('"1.23aaa"', '$.bigint()'); +ERROR: argument "1.23aaa" of jsonpath item method .bigint() is invalid for type bigint +select jsonb_path_query('1e1000', '$.bigint()'); +ERROR: argument "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" of jsonpath item method .bigint() is invalid for type bigint +select jsonb_path_query('"nan"', '$.bigint()'); +ERROR: argument "nan" of jsonpath item method .bigint() is invalid for type bigint +select jsonb_path_query('"NaN"', '$.bigint()'); +ERROR: argument "NaN" of jsonpath item method .bigint() is invalid for type bigint +select jsonb_path_query('"inf"', '$.bigint()'); +ERROR: argument "inf" of jsonpath item method .bigint() is invalid for type bigint +select jsonb_path_query('"-inf"', '$.bigint()'); +ERROR: argument "-inf" of jsonpath item method .bigint() is invalid for type bigint +select jsonb_path_query('"inf"', '$.bigint()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('"-inf"', '$.bigint()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('123', '$.bigint()'); + jsonb_path_query +------------------ + 123 +(1 row) + +select jsonb_path_query('"123"', '$.bigint()'); + jsonb_path_query +------------------ + 123 +(1 row) + +select jsonb_path_query('1.23', '$.bigint()'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('1.83', '$.bigint()'); + jsonb_path_query +------------------ + 2 +(1 row) + +select jsonb_path_query('1234567890123', '$.bigint()'); + jsonb_path_query +------------------ + 1234567890123 +(1 row) + +select jsonb_path_query('"1234567890123"', '$.bigint()'); + jsonb_path_query +------------------ + 1234567890123 +(1 row) + +select jsonb_path_query('12345678901234567890', '$.bigint()'); +ERROR: argument "12345678901234567890" of jsonpath item method .bigint() is invalid for type bigint +select jsonb_path_query('"12345678901234567890"', '$.bigint()'); +ERROR: argument "12345678901234567890" of jsonpath item method .bigint() is invalid for type bigint +select jsonb_path_query('"+123"', '$.bigint()'); + jsonb_path_query +------------------ + 123 +(1 row) + +select jsonb_path_query('-123', '$.bigint()'); + jsonb_path_query +------------------ + -123 +(1 row) + +select jsonb_path_query('"-123"', '$.bigint()'); + jsonb_path_query +------------------ + -123 +(1 row) + +select jsonb_path_query('123', '$.bigint() * 2'); + jsonb_path_query +------------------ + 246 +(1 row) + +-- Test .boolean() +select jsonb_path_query('null', '$.boolean()'); +ERROR: jsonpath item method .boolean() can only be applied to a boolean, string, or numeric value +select jsonb_path_query('null', '$.boolean()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', '$.boolean()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.boolean()'); +ERROR: jsonpath item method .boolean() can only be applied to a boolean, string, or numeric value +select jsonb_path_query('{}', '$.boolean()'); +ERROR: jsonpath item method .boolean() can only be applied to a boolean, string, or numeric value +select jsonb_path_query('[]', 'strict $.boolean()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{}', '$.boolean()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('1.23', '$.boolean()'); +ERROR: argument "1.23" of jsonpath item method .boolean() is invalid for type boolean +select jsonb_path_query('"1.23"', '$.boolean()'); +ERROR: argument "1.23" of jsonpath item method .boolean() is invalid for type boolean +select jsonb_path_query('"1.23aaa"', '$.boolean()'); +ERROR: argument "1.23aaa" of jsonpath item method .boolean() is invalid for type boolean +select jsonb_path_query('1e1000', '$.boolean()'); +ERROR: argument "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" of jsonpath item method .boolean() is invalid for type boolean +select jsonb_path_query('"nan"', '$.boolean()'); +ERROR: argument "nan" of jsonpath item method .boolean() is invalid for type boolean +select jsonb_path_query('"NaN"', '$.boolean()'); +ERROR: argument "NaN" of jsonpath item method .boolean() is invalid for type boolean +select jsonb_path_query('"inf"', '$.boolean()'); +ERROR: argument "inf" of jsonpath item method .boolean() is invalid for type boolean +select jsonb_path_query('"-inf"', '$.boolean()'); +ERROR: argument "-inf" of jsonpath item method .boolean() is invalid for type boolean +select jsonb_path_query('"inf"', '$.boolean()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('"-inf"', '$.boolean()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('"100"', '$.boolean()'); +ERROR: argument "100" of jsonpath item method .boolean() is invalid for type boolean +select jsonb_path_query('true', '$.boolean()'); + jsonb_path_query +------------------ + true +(1 row) + +select jsonb_path_query('false', '$.boolean()'); + jsonb_path_query +------------------ + false +(1 row) + +select jsonb_path_query('1', '$.boolean()'); + jsonb_path_query +------------------ + true +(1 row) + +select jsonb_path_query('0', '$.boolean()'); + jsonb_path_query +------------------ + false +(1 row) + +select jsonb_path_query('-1', '$.boolean()'); + jsonb_path_query +------------------ + true +(1 row) + +select jsonb_path_query('100', '$.boolean()'); + jsonb_path_query +------------------ + true +(1 row) + +select jsonb_path_query('"1"', '$.boolean()'); + jsonb_path_query +------------------ + true +(1 row) + +select jsonb_path_query('"0"', '$.boolean()'); + jsonb_path_query +------------------ + false +(1 row) + +select jsonb_path_query('"true"', '$.boolean()'); + jsonb_path_query +------------------ + true +(1 row) + +select jsonb_path_query('"false"', '$.boolean()'); + jsonb_path_query +------------------ + false +(1 row) + +select jsonb_path_query('"TRUE"', '$.boolean()'); + jsonb_path_query +------------------ + true +(1 row) + +select jsonb_path_query('"FALSE"', '$.boolean()'); + jsonb_path_query +------------------ + false +(1 row) + +select jsonb_path_query('"yes"', '$.boolean()'); + jsonb_path_query +------------------ + true +(1 row) + +select jsonb_path_query('"NO"', '$.boolean()'); + jsonb_path_query +------------------ + false +(1 row) + +select jsonb_path_query('"T"', '$.boolean()'); + jsonb_path_query +------------------ + true +(1 row) + +select jsonb_path_query('"f"', '$.boolean()'); + jsonb_path_query +------------------ + false +(1 row) + +select jsonb_path_query('"y"', '$.boolean()'); + jsonb_path_query +------------------ + true +(1 row) + +select jsonb_path_query('"N"', '$.boolean()'); + jsonb_path_query +------------------ + false +(1 row) + +select jsonb_path_query('true', '$.boolean().type()'); + jsonb_path_query +------------------ + "boolean" +(1 row) + +select jsonb_path_query('123', '$.boolean().type()'); + jsonb_path_query +------------------ + "boolean" +(1 row) + +select jsonb_path_query('"Yes"', '$.boolean().type()'); + jsonb_path_query +------------------ + "boolean" +(1 row) + +select jsonb_path_query_array('[1, "yes", false]', '$[*].boolean()'); + jsonb_path_query_array +------------------------ + [true, true, false] +(1 row) + +-- Test .date() +select jsonb_path_query('null', '$.date()'); +ERROR: jsonpath item method .date() can only be applied to a string +select jsonb_path_query('true', '$.date()'); +ERROR: jsonpath item method .date() can only be applied to a string +select jsonb_path_query('1', '$.date()'); +ERROR: jsonpath item method .date() can only be applied to a string +select jsonb_path_query('[]', '$.date()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.date()'); +ERROR: jsonpath item method .date() can only be applied to a string +select jsonb_path_query('{}', '$.date()'); +ERROR: jsonpath item method .date() can only be applied to a string +select jsonb_path_query('"bogus"', '$.date()'); +ERROR: date format is not recognized: "bogus" +select jsonb '"2023-08-15"' @? '$.date()'; + ?column? +---------- + t +(1 row) + +select jsonb_path_query('"2023-08-15"', '$.date()'); + jsonb_path_query +------------------ + "2023-08-15" +(1 row) + +select jsonb_path_query('"2023-08-15"', '$.date().type()'); + jsonb_path_query +------------------ + "date" +(1 row) + +select jsonb_path_query('"12:34:56"', '$.date()'); +ERROR: date format is not recognized: "12:34:56" +select jsonb_path_query('"12:34:56 +05:30"', '$.date()'); +ERROR: date format is not recognized: "12:34:56 +05:30" +select jsonb_path_query('"2023-08-15 12:34:56"', '$.date()'); + jsonb_path_query +------------------ + "2023-08-15" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.date()'); +ERROR: cannot convert value from timestamptz to date without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.date()'); -- should work + jsonb_path_query_tz +--------------------- + "2023-08-15" +(1 row) + +select jsonb_path_query('"2023-08-15"', '$.date(2)'); +ERROR: syntax error at or near "2" of jsonpath input +LINE 1: select jsonb_path_query('"2023-08-15"', '$.date(2)'); + ^ +-- Test .decimal() +select jsonb_path_query('null', '$.decimal()'); +ERROR: jsonpath item method .decimal() can only be applied to a string or numeric value +select jsonb_path_query('true', '$.decimal()'); +ERROR: jsonpath item method .decimal() can only be applied to a string or numeric value +select jsonb_path_query('null', '$.decimal()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('true', '$.decimal()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', '$.decimal()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.decimal()'); +ERROR: jsonpath item method .decimal() can only be applied to a string or numeric value +select jsonb_path_query('{}', '$.decimal()'); +ERROR: jsonpath item method .decimal() can only be applied to a string or numeric value +select jsonb_path_query('[]', 'strict $.decimal()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{}', '$.decimal()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('1.23', '$.decimal()'); + jsonb_path_query +------------------ + 1.23 +(1 row) + +select jsonb_path_query('"1.23"', '$.decimal()'); + jsonb_path_query +------------------ + 1.23 +(1 row) + +select jsonb_path_query('"1.23aaa"', '$.decimal()'); +ERROR: argument "1.23aaa" of jsonpath item method .decimal() is invalid for type numeric +select jsonb_path_query('1e1000', '$.decimal()'); + jsonb_path_query +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +(1 row) + +select jsonb_path_query('"nan"', '$.decimal()'); +ERROR: NaN or Infinity is not allowed for jsonpath item method .decimal() +select jsonb_path_query('"NaN"', '$.decimal()'); +ERROR: NaN or Infinity is not allowed for jsonpath item method .decimal() +select jsonb_path_query('"inf"', '$.decimal()'); +ERROR: NaN or Infinity is not allowed for jsonpath item method .decimal() +select jsonb_path_query('"-inf"', '$.decimal()'); +ERROR: NaN or Infinity is not allowed for jsonpath item method .decimal() +select jsonb_path_query('"inf"', '$.decimal()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('"-inf"', '$.decimal()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('123', '$.decimal()'); + jsonb_path_query +------------------ + 123 +(1 row) + +select jsonb_path_query('"123"', '$.decimal()'); + jsonb_path_query +------------------ + 123 +(1 row) + +select jsonb_path_query('12345678901234567890', '$.decimal()'); + jsonb_path_query +---------------------- + 12345678901234567890 +(1 row) + +select jsonb_path_query('"12345678901234567890"', '$.decimal()'); + jsonb_path_query +---------------------- + 12345678901234567890 +(1 row) + +select jsonb_path_query('"+12.3"', '$.decimal()'); + jsonb_path_query +------------------ + 12.3 +(1 row) + +select jsonb_path_query('-12.3', '$.decimal()'); + jsonb_path_query +------------------ + -12.3 +(1 row) + +select jsonb_path_query('"-12.3"', '$.decimal()'); + jsonb_path_query +------------------ + -12.3 +(1 row) + +select jsonb_path_query('12.3', '$.decimal() * 2'); + jsonb_path_query +------------------ + 24.6 +(1 row) + +select jsonb_path_query('12345.678', '$.decimal(6, 1)'); + jsonb_path_query +------------------ + 12345.7 +(1 row) + +select jsonb_path_query('12345.678', '$.decimal(6, 2)'); +ERROR: argument "12345.678" of jsonpath item method .decimal() is invalid for type numeric +select jsonb_path_query('1234.5678', '$.decimal(6, 2)'); + jsonb_path_query +------------------ + 1234.57 +(1 row) + +select jsonb_path_query('12345.678', '$.decimal(4, 6)'); +ERROR: argument "12345.678" of jsonpath item method .decimal() is invalid for type numeric +select jsonb_path_query('12345.678', '$.decimal(0, 6)'); +ERROR: NUMERIC precision 0 must be between 1 and 1000 +select jsonb_path_query('12345.678', '$.decimal(1001, 6)'); +ERROR: NUMERIC precision 1001 must be between 1 and 1000 +select jsonb_path_query('1234.5678', '$.decimal(+6, +2)'); + jsonb_path_query +------------------ + 1234.57 +(1 row) + +select jsonb_path_query('1234.5678', '$.decimal(+6, -2)'); + jsonb_path_query +------------------ + 1200 +(1 row) + +select jsonb_path_query('1234.5678', '$.decimal(-6, +2)'); +ERROR: NUMERIC precision -6 must be between 1 and 1000 +select jsonb_path_query('1234.5678', '$.decimal(6, -1001)'); +ERROR: NUMERIC scale -1001 must be between -1000 and 1000 +select jsonb_path_query('1234.5678', '$.decimal(6, 1001)'); +ERROR: NUMERIC scale 1001 must be between -1000 and 1000 +select jsonb_path_query('-1234.5678', '$.decimal(+6, -2)'); + jsonb_path_query +------------------ + -1200 +(1 row) + +select jsonb_path_query('0.0123456', '$.decimal(1,2)'); + jsonb_path_query +------------------ + 0.01 +(1 row) + +select jsonb_path_query('0.0012345', '$.decimal(2,4)'); + jsonb_path_query +------------------ + 0.0012 +(1 row) + +select jsonb_path_query('-0.00123456', '$.decimal(2,-4)'); + jsonb_path_query +------------------ + 0 +(1 row) + +select jsonb_path_query('12.3', '$.decimal(12345678901,1)'); +ERROR: precision of jsonpath item method .decimal() is out of range for type integer +select jsonb_path_query('12.3', '$.decimal(1,12345678901)'); +ERROR: scale of jsonpath item method .decimal() is out of range for type integer +-- Test .integer() +select jsonb_path_query('null', '$.integer()'); +ERROR: jsonpath item method .integer() can only be applied to a string or numeric value +select jsonb_path_query('true', '$.integer()'); +ERROR: jsonpath item method .integer() can only be applied to a string or numeric value +select jsonb_path_query('null', '$.integer()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('true', '$.integer()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', '$.integer()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.integer()'); +ERROR: jsonpath item method .integer() can only be applied to a string or numeric value +select jsonb_path_query('{}', '$.integer()'); +ERROR: jsonpath item method .integer() can only be applied to a string or numeric value +select jsonb_path_query('[]', 'strict $.integer()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{}', '$.integer()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('"1.23"', '$.integer()'); +ERROR: argument "1.23" of jsonpath item method .integer() is invalid for type integer +select jsonb_path_query('"1.23aaa"', '$.integer()'); +ERROR: argument "1.23aaa" of jsonpath item method .integer() is invalid for type integer +select jsonb_path_query('1e1000', '$.integer()'); +ERROR: argument "10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" of jsonpath item method .integer() is invalid for type integer +select jsonb_path_query('"nan"', '$.integer()'); +ERROR: argument "nan" of jsonpath item method .integer() is invalid for type integer +select jsonb_path_query('"NaN"', '$.integer()'); +ERROR: argument "NaN" of jsonpath item method .integer() is invalid for type integer +select jsonb_path_query('"inf"', '$.integer()'); +ERROR: argument "inf" of jsonpath item method .integer() is invalid for type integer +select jsonb_path_query('"-inf"', '$.integer()'); +ERROR: argument "-inf" of jsonpath item method .integer() is invalid for type integer +select jsonb_path_query('"inf"', '$.integer()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('"-inf"', '$.integer()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('123', '$.integer()'); + jsonb_path_query +------------------ + 123 +(1 row) + +select jsonb_path_query('"123"', '$.integer()'); + jsonb_path_query +------------------ + 123 +(1 row) + +select jsonb_path_query('1.23', '$.integer()'); + jsonb_path_query +------------------ + 1 +(1 row) + +select jsonb_path_query('1.83', '$.integer()'); + jsonb_path_query +------------------ + 2 +(1 row) + +select jsonb_path_query('12345678901', '$.integer()'); +ERROR: argument "12345678901" of jsonpath item method .integer() is invalid for type integer +select jsonb_path_query('"12345678901"', '$.integer()'); +ERROR: argument "12345678901" of jsonpath item method .integer() is invalid for type integer +select jsonb_path_query('"+123"', '$.integer()'); + jsonb_path_query +------------------ + 123 +(1 row) + +select jsonb_path_query('-123', '$.integer()'); + jsonb_path_query +------------------ + -123 +(1 row) + +select jsonb_path_query('"-123"', '$.integer()'); + jsonb_path_query +------------------ + -123 +(1 row) + +select jsonb_path_query('123', '$.integer() * 2'); + jsonb_path_query +------------------ + 246 +(1 row) + +-- Test .number() +select jsonb_path_query('null', '$.number()'); +ERROR: jsonpath item method .number() can only be applied to a string or numeric value +select jsonb_path_query('true', '$.number()'); +ERROR: jsonpath item method .number() can only be applied to a string or numeric value +select jsonb_path_query('null', '$.number()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('true', '$.number()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', '$.number()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.number()'); +ERROR: jsonpath item method .number() can only be applied to a string or numeric value +select jsonb_path_query('{}', '$.number()'); +ERROR: jsonpath item method .number() can only be applied to a string or numeric value +select jsonb_path_query('[]', 'strict $.number()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{}', '$.number()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('1.23', '$.number()'); + jsonb_path_query +------------------ + 1.23 +(1 row) + +select jsonb_path_query('"1.23"', '$.number()'); + jsonb_path_query +------------------ + 1.23 +(1 row) + +select jsonb_path_query('"1.23aaa"', '$.number()'); +ERROR: argument "1.23aaa" of jsonpath item method .number() is invalid for type numeric +select jsonb_path_query('1e1000', '$.number()'); + jsonb_path_query +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +(1 row) + +select jsonb_path_query('"nan"', '$.number()'); +ERROR: NaN or Infinity is not allowed for jsonpath item method .number() +select jsonb_path_query('"NaN"', '$.number()'); +ERROR: NaN or Infinity is not allowed for jsonpath item method .number() +select jsonb_path_query('"inf"', '$.number()'); +ERROR: NaN or Infinity is not allowed for jsonpath item method .number() +select jsonb_path_query('"-inf"', '$.number()'); +ERROR: NaN or Infinity is not allowed for jsonpath item method .number() +select jsonb_path_query('"inf"', '$.number()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('"-inf"', '$.number()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('123', '$.number()'); + jsonb_path_query +------------------ + 123 +(1 row) + +select jsonb_path_query('"123"', '$.number()'); + jsonb_path_query +------------------ + 123 +(1 row) + +select jsonb_path_query('12345678901234567890', '$.number()'); + jsonb_path_query +---------------------- + 12345678901234567890 +(1 row) + +select jsonb_path_query('"12345678901234567890"', '$.number()'); + jsonb_path_query +---------------------- + 12345678901234567890 +(1 row) + +select jsonb_path_query('"+12.3"', '$.number()'); + jsonb_path_query +------------------ + 12.3 +(1 row) + +select jsonb_path_query('-12.3', '$.number()'); + jsonb_path_query +------------------ + -12.3 +(1 row) + +select jsonb_path_query('"-12.3"', '$.number()'); + jsonb_path_query +------------------ + -12.3 +(1 row) + +select jsonb_path_query('12.3', '$.number() * 2'); + jsonb_path_query +------------------ + 24.6 +(1 row) + +-- Test .string() +select jsonb_path_query('null', '$.string()'); +ERROR: jsonpath item method .string() can only be applied to a boolean, string, numeric, or datetime value +select jsonb_path_query('null', '$.string()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', '$.string()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.string()'); +ERROR: jsonpath item method .string() can only be applied to a boolean, string, numeric, or datetime value +select jsonb_path_query('{}', '$.string()'); +ERROR: jsonpath item method .string() can only be applied to a boolean, string, numeric, or datetime value +select jsonb_path_query('[]', 'strict $.string()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('{}', '$.string()', silent => true); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('1.23', '$.string()'); + jsonb_path_query +------------------ + "1.23" +(1 row) + +select jsonb_path_query('"1.23"', '$.string()'); + jsonb_path_query +------------------ + "1.23" +(1 row) + +select jsonb_path_query('"1.23aaa"', '$.string()'); + jsonb_path_query +------------------ + "1.23aaa" +(1 row) + +select jsonb_path_query('1234', '$.string()'); + jsonb_path_query +------------------ + "1234" +(1 row) + +select jsonb_path_query('true', '$.string()'); + jsonb_path_query +------------------ + "true" +(1 row) + +select jsonb_path_query('1234', '$.string().type()'); + jsonb_path_query +------------------ + "string" +(1 row) + +select jsonb_path_query('[2, true]', '$.string()'); + jsonb_path_query +------------------ + "2" + "true" +(2 rows) + +select jsonb_path_query_array('[1.23, "yes", false]', '$[*].string()'); + jsonb_path_query_array +-------------------------- + ["1.23", "yes", "false"] +(1 row) + +select jsonb_path_query_array('[1.23, "yes", false]', '$[*].string().type()'); + jsonb_path_query_array +-------------------------------- + ["string", "string", "string"] +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56 +5:30"', '$.timestamp().string()'); +ERROR: cannot convert value from timestamptz to timestamp without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"2023-08-15 12:34:56 +5:30"', '$.timestamp().string()'); -- should work + jsonb_path_query_tz +----------------------- + "2023-08-15T00:04:56" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp_tz().string()'); +ERROR: cannot convert value from timestamp to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"2023-08-15 12:34:56"', '$.timestamp_tz().string()'); -- should work + jsonb_path_query_tz +----------------------------- + "2023-08-15T12:34:56-07:00" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56 +5:30"', '$.timestamp_tz().string()'); + jsonb_path_query +----------------------------- + "2023-08-15T12:34:56+05:30" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp().string()'); + jsonb_path_query +----------------------- + "2023-08-15T12:34:56" +(1 row) + +select jsonb_path_query('"12:34:56 +5:30"', '$.time_tz().string()'); + jsonb_path_query +------------------ + "12:34:56+05:30" +(1 row) + +-- this timetz usage will absorb the UTC offset of the current timezone setting +begin; +set local timezone = 'UTC-10'; +select jsonb_path_query_tz('"12:34:56"', '$.time_tz().string()'); + jsonb_path_query_tz +--------------------- + "12:34:56+10:00" +(1 row) + +rollback; +select jsonb_path_query('"12:34:56"', '$.time().string()'); + jsonb_path_query +------------------ + "12:34:56" +(1 row) + +select jsonb_path_query('"2023-08-15"', '$.date().string()'); + jsonb_path_query +------------------ + "2023-08-15" +(1 row) + +-- .string() does not react to timezone or datestyle +begin; +set local timezone = 'UTC'; +set local datestyle = 'German'; +select jsonb_path_query('"2023-08-15 12:34:56 +5:30"', '$.timestamp_tz().string()'); + jsonb_path_query +----------------------------- + "2023-08-15T12:34:56+05:30" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp().string()'); + jsonb_path_query +----------------------- + "2023-08-15T12:34:56" +(1 row) + +rollback; +-- Test .time() +select jsonb_path_query('null', '$.time()'); +ERROR: jsonpath item method .time() can only be applied to a string +select jsonb_path_query('true', '$.time()'); +ERROR: jsonpath item method .time() can only be applied to a string +select jsonb_path_query('1', '$.time()'); +ERROR: jsonpath item method .time() can only be applied to a string +select jsonb_path_query('[]', '$.time()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.time()'); +ERROR: jsonpath item method .time() can only be applied to a string +select jsonb_path_query('{}', '$.time()'); +ERROR: jsonpath item method .time() can only be applied to a string +select jsonb_path_query('"bogus"', '$.time()'); +ERROR: time format is not recognized: "bogus" +select jsonb '"12:34:56"' @? '$.time()'; + ?column? +---------- + t +(1 row) + +select jsonb_path_query('"12:34:56"', '$.time()'); + jsonb_path_query +------------------ + "12:34:56" +(1 row) + +select jsonb_path_query('"12:34:56"', '$.time().type()'); + jsonb_path_query +-------------------------- + "time without time zone" +(1 row) + +select jsonb_path_query('"2023-08-15"', '$.time()'); +ERROR: time format is not recognized: "2023-08-15" +select jsonb_path_query('"12:34:56 +05:30"', '$.time()'); +ERROR: cannot convert value from timetz to time without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"12:34:56 +05:30"', '$.time()'); -- should work + jsonb_path_query_tz +--------------------- + "12:34:56" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56"', '$.time()'); + jsonb_path_query +------------------ + "12:34:56" +(1 row) + +select jsonb_path_query('"12:34:56.789"', '$.time(-1)'); +ERROR: syntax error at or near "-" of jsonpath input +LINE 1: select jsonb_path_query('"12:34:56.789"', '$.time(-1)'); + ^ +select jsonb_path_query('"12:34:56.789"', '$.time(2.0)'); +ERROR: syntax error at or near "2.0" of jsonpath input +LINE 1: select jsonb_path_query('"12:34:56.789"', '$.time(2.0)'); + ^ +select jsonb_path_query('"12:34:56.789"', '$.time(12345678901)'); +ERROR: time precision of jsonpath item method .time() is out of range for type integer +select jsonb_path_query('"12:34:56.789"', '$.time(0)'); + jsonb_path_query +------------------ + "12:34:57" +(1 row) + +select jsonb_path_query('"12:34:56.789"', '$.time(2)'); + jsonb_path_query +------------------ + "12:34:56.79" +(1 row) + +select jsonb_path_query('"12:34:56.789"', '$.time(5)'); + jsonb_path_query +------------------ + "12:34:56.789" +(1 row) + +select jsonb_path_query('"12:34:56.789"', '$.time(10)'); +WARNING: TIME(10) precision reduced to maximum allowed, 6 + jsonb_path_query +------------------ + "12:34:56.789" +(1 row) + +select jsonb_path_query('"12:34:56.789012"', '$.time(8)'); +WARNING: TIME(8) precision reduced to maximum allowed, 6 + jsonb_path_query +------------------- + "12:34:56.789012" +(1 row) + +-- Test .time_tz() +select jsonb_path_query('null', '$.time_tz()'); +ERROR: jsonpath item method .time_tz() can only be applied to a string +select jsonb_path_query('true', '$.time_tz()'); +ERROR: jsonpath item method .time_tz() can only be applied to a string +select jsonb_path_query('1', '$.time_tz()'); +ERROR: jsonpath item method .time_tz() can only be applied to a string +select jsonb_path_query('[]', '$.time_tz()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.time_tz()'); +ERROR: jsonpath item method .time_tz() can only be applied to a string +select jsonb_path_query('{}', '$.time_tz()'); +ERROR: jsonpath item method .time_tz() can only be applied to a string +select jsonb_path_query('"bogus"', '$.time_tz()'); +ERROR: time_tz format is not recognized: "bogus" +select jsonb '"12:34:56 +05:30"' @? '$.time_tz()'; + ?column? +---------- + t +(1 row) + +select jsonb_path_query('"12:34:56 +05:30"', '$.time_tz()'); + jsonb_path_query +------------------ + "12:34:56+05:30" +(1 row) + +select jsonb_path_query('"12:34:56 +05:30"', '$.time_tz().type()'); + jsonb_path_query +----------------------- + "time with time zone" +(1 row) + +select jsonb_path_query('"2023-08-15"', '$.time_tz()'); +ERROR: time_tz format is not recognized: "2023-08-15" +select jsonb_path_query('"2023-08-15 12:34:56"', '$.time_tz()'); +ERROR: time_tz format is not recognized: "2023-08-15 12:34:56" +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(-1)'); +ERROR: syntax error at or near "-" of jsonpath input +LINE 1: select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(... + ^ +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(2.0)'); +ERROR: syntax error at or near "2.0" of jsonpath input +LINE 1: select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(... + ^ +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(12345678901)'); +ERROR: time precision of jsonpath item method .time_tz() is out of range for type integer +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(0)'); + jsonb_path_query +------------------ + "12:34:57+05:30" +(1 row) + +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(2)'); + jsonb_path_query +--------------------- + "12:34:56.79+05:30" +(1 row) + +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(5)'); + jsonb_path_query +---------------------- + "12:34:56.789+05:30" +(1 row) + +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(10)'); +WARNING: TIME(10) WITH TIME ZONE precision reduced to maximum allowed, 6 + jsonb_path_query +---------------------- + "12:34:56.789+05:30" +(1 row) + +select jsonb_path_query('"12:34:56.789012 +05:30"', '$.time_tz(8)'); +WARNING: TIME(8) WITH TIME ZONE precision reduced to maximum allowed, 6 + jsonb_path_query +------------------------- + "12:34:56.789012+05:30" +(1 row) + +-- Test .timestamp() +select jsonb_path_query('null', '$.timestamp()'); +ERROR: jsonpath item method .timestamp() can only be applied to a string +select jsonb_path_query('true', '$.timestamp()'); +ERROR: jsonpath item method .timestamp() can only be applied to a string +select jsonb_path_query('1', '$.timestamp()'); +ERROR: jsonpath item method .timestamp() can only be applied to a string +select jsonb_path_query('[]', '$.timestamp()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.timestamp()'); +ERROR: jsonpath item method .timestamp() can only be applied to a string +select jsonb_path_query('{}', '$.timestamp()'); +ERROR: jsonpath item method .timestamp() can only be applied to a string +select jsonb_path_query('"bogus"', '$.timestamp()'); +ERROR: timestamp format is not recognized: "bogus" +select jsonb '"2023-08-15 12:34:56"' @? '$.timestamp()'; + ?column? +---------- + t +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp()'); + jsonb_path_query +----------------------- + "2023-08-15T12:34:56" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp().type()'); + jsonb_path_query +------------------------------- + "timestamp without time zone" +(1 row) + +select jsonb_path_query('"2023-08-15"', '$.timestamp()'); + jsonb_path_query +----------------------- + "2023-08-15T00:00:00" +(1 row) + +select jsonb_path_query('"12:34:56"', '$.timestamp()'); +ERROR: timestamp format is not recognized: "12:34:56" +select jsonb_path_query('"12:34:56 +05:30"', '$.timestamp()'); +ERROR: timestamp format is not recognized: "12:34:56 +05:30" +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(-1)'); +ERROR: syntax error at or near "-" of jsonpath input +LINE 1: ...ect jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timesta... + ^ +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(2.0)'); +ERROR: syntax error at or near "2.0" of jsonpath input +LINE 1: ...ect jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timesta... + ^ +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(12345678901)'); +ERROR: time precision of jsonpath item method .timestamp() is out of range for type integer +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(0)'); + jsonb_path_query +----------------------- + "2023-08-15T12:34:57" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(2)'); + jsonb_path_query +-------------------------- + "2023-08-15T12:34:56.79" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(5)'); + jsonb_path_query +--------------------------- + "2023-08-15T12:34:56.789" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(10)'); +WARNING: TIMESTAMP(10) precision reduced to maximum allowed, 6 + jsonb_path_query +--------------------------- + "2023-08-15T12:34:56.789" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56.789012"', '$.timestamp(8)'); +WARNING: TIMESTAMP(8) precision reduced to maximum allowed, 6 + jsonb_path_query +------------------------------ + "2023-08-15T12:34:56.789012" +(1 row) + +-- Test .timestamp_tz() +select jsonb_path_query('null', '$.timestamp_tz()'); +ERROR: jsonpath item method .timestamp_tz() can only be applied to a string +select jsonb_path_query('true', '$.timestamp_tz()'); +ERROR: jsonpath item method .timestamp_tz() can only be applied to a string +select jsonb_path_query('1', '$.timestamp_tz()'); +ERROR: jsonpath item method .timestamp_tz() can only be applied to a string +select jsonb_path_query('[]', '$.timestamp_tz()'); + jsonb_path_query +------------------ +(0 rows) + +select jsonb_path_query('[]', 'strict $.timestamp_tz()'); +ERROR: jsonpath item method .timestamp_tz() can only be applied to a string +select jsonb_path_query('{}', '$.timestamp_tz()'); +ERROR: jsonpath item method .timestamp_tz() can only be applied to a string +select jsonb_path_query('"bogus"', '$.timestamp_tz()'); +ERROR: timestamp_tz format is not recognized: "bogus" +select jsonb '"2023-08-15 12:34:56 +05:30"' @? '$.timestamp_tz()'; + ?column? +---------- + t +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp_tz()'); + jsonb_path_query +----------------------------- + "2023-08-15T12:34:56+05:30" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp_tz().type()'); + jsonb_path_query +---------------------------- + "timestamp with time zone" +(1 row) + +select jsonb_path_query('"2023-08-15"', '$.timestamp_tz()'); +ERROR: cannot convert value from date to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"2023-08-15"', '$.timestamp_tz()'); -- should work + jsonb_path_query_tz +----------------------------- + "2023-08-15T00:00:00-07:00" +(1 row) + +select jsonb_path_query('"12:34:56"', '$.timestamp_tz()'); +ERROR: timestamp_tz format is not recognized: "12:34:56" +select jsonb_path_query('"12:34:56 +05:30"', '$.timestamp_tz()'); +ERROR: timestamp_tz format is not recognized: "12:34:56 +05:30" +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(-1)'); +ERROR: syntax error at or near "-" of jsonpath input +LINE 1: ...nb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timesta... + ^ +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(2.0)'); +ERROR: syntax error at or near "2.0" of jsonpath input +LINE 1: ...nb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timesta... + ^ +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(12345678901)'); +ERROR: time precision of jsonpath item method .timestamp_tz() is out of range for type integer +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(0)'); + jsonb_path_query +----------------------------- + "2023-08-15T12:34:57+05:30" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(2)'); + jsonb_path_query +-------------------------------- + "2023-08-15T12:34:56.79+05:30" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(5)'); + jsonb_path_query +--------------------------------- + "2023-08-15T12:34:56.789+05:30" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(10)'); +WARNING: TIMESTAMP(10) WITH TIME ZONE precision reduced to maximum allowed, 6 + jsonb_path_query +--------------------------------- + "2023-08-15T12:34:56.789+05:30" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56.789012 +05:30"', '$.timestamp_tz(8)'); +WARNING: TIMESTAMP(8) WITH TIME ZONE precision reduced to maximum allowed, 6 + jsonb_path_query +------------------------------------ + "2023-08-15T12:34:56.789012+05:30" +(1 row) + set time zone '+00'; +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.time()'); +ERROR: cannot convert value from timestamptz to time without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.time()'); -- should work + jsonb_path_query_tz +--------------------- + "07:04:56" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.time_tz()'); + jsonb_path_query +------------------ + "07:04:56+00:00" +(1 row) + +select jsonb_path_query('"12:34:56"', '$.time_tz()'); +ERROR: cannot convert value from time to timetz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"12:34:56"', '$.time_tz()'); -- should work + jsonb_path_query_tz +--------------------- + "12:34:56+00:00" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp()'); +ERROR: cannot convert value from timestamptz to timestamp without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.timestamp()'); -- should work + jsonb_path_query_tz +----------------------- + "2023-08-15T07:04:56" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp_tz()'); +ERROR: cannot convert value from timestamp to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"2023-08-15 12:34:56"', '$.timestamp_tz()'); -- should work + jsonb_path_query_tz +----------------------------- + "2023-08-15T12:34:56+00:00" +(1 row) + select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")'); jsonb_path_query ----------------------- @@ -1798,6 +3137,45 @@ select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")'); (1 row) set time zone '+10'; +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.time()'); +ERROR: cannot convert value from timestamptz to time without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.time()'); -- should work + jsonb_path_query_tz +--------------------- + "17:04:56" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.time_tz()'); + jsonb_path_query +------------------ + "17:04:56+10:00" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp()'); +ERROR: cannot convert value from timestamptz to timestamp without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.timestamp()'); -- should work + jsonb_path_query_tz +----------------------- + "2023-08-15T17:04:56" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp_tz()'); +ERROR: cannot convert value from timestamp to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"2023-08-15 12:34:56"', '$.timestamp_tz()'); -- should work + jsonb_path_query_tz +----------------------------- + "2023-08-15T12:34:56+10:00" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp_tz()'); + jsonb_path_query +----------------------------- + "2023-08-15T12:34:56+05:30" +(1 row) + select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")'); jsonb_path_query ----------------------- @@ -1863,6 +3241,36 @@ select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")'); (1 row) set time zone default; +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.time()'); +ERROR: cannot convert value from timestamptz to time without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.time()'); -- should work + jsonb_path_query_tz +--------------------- + "00:04:56" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.time_tz()'); + jsonb_path_query +------------------ + "00:04:56-07:00" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp()'); +ERROR: cannot convert value from timestamptz to timestamp without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.timestamp()'); -- should work + jsonb_path_query_tz +----------------------- + "2023-08-15T00:04:56" +(1 row) + +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp_tz()'); + jsonb_path_query +----------------------------- + "2023-08-15T12:34:56+05:30" +(1 row) + select jsonb_path_query('"2017-03-10"', '$.datetime().type()'); jsonb_path_query ------------------ @@ -1935,6 +3343,18 @@ select jsonb_path_query('"2017-03-10T12:34:56.789+3:10"', '$.datetime()'); select jsonb_path_query('"2017-03-10t12:34:56.789+3:10"', '$.datetime()'); ERROR: datetime format is not recognized: "2017-03-10t12:34:56.789+3:10" HINT: Use a datetime template argument to specify the input data format. +select jsonb_path_query('"2017-03-10T12:34:56.789EST"', '$.datetime()'); + jsonb_path_query +--------------------------------- + "2017-03-10T12:34:56.789-05:00" +(1 row) + +select jsonb_path_query('"2017-03-10T12:34:56.789Z"', '$.datetime()'); + jsonb_path_query +--------------------------------- + "2017-03-10T12:34:56.789+00:00" +(1 row) + select jsonb_path_query('"12:34:56"', '$.datetime().type()'); jsonb_path_query -------------------------- @@ -2011,12 +3431,90 @@ select jsonb_path_query_tz( (5 rows) select jsonb_path_query_tz( - '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', - '$[*].datetime() ? (@ < "10.03.2017".datetime("dd.mm.yyyy"))'); - jsonb_path_query_tz ------------------------------ + '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ < "10.03.2017".datetime("dd.mm.yyyy"))'); + jsonb_path_query_tz +----------------------------- + "2017-03-09" + "2017-03-10T01:02:03+04:00" +(2 rows) + +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ == "2017-03-10".date())'); + jsonb_path_query_tz +----------------------------- + "2017-03-10" + "2017-03-10T00:00:00" + "2017-03-10T03:00:00+03:00" +(3 rows) + +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ >= "2017-03-10".date())'); + jsonb_path_query_tz +----------------------------- + "2017-03-10" + "2017-03-11" + "2017-03-10T00:00:00" + "2017-03-10T12:34:56" + "2017-03-10T03:00:00+03:00" +(5 rows) + +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ < "2017-03-10".date())'); + jsonb_path_query_tz +----------------------------- + "2017-03-09" + "2017-03-10T01:02:03+04:00" +(2 rows) + +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].date() ? (@ == "2017-03-10".date())'); +ERROR: cannot convert value from timestamptz to date without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].date() ? (@ >= "2017-03-10".date())'); +ERROR: cannot convert value from timestamptz to date without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].date() ? (@ < "2017-03-10".date())'); +ERROR: cannot convert value from timestamptz to date without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].date() ? (@ == "2017-03-10".date())'); + jsonb_path_query_tz +--------------------- + "2017-03-10" + "2017-03-10" + "2017-03-10" + "2017-03-10" +(4 rows) + +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].date() ? (@ >= "2017-03-10".date())'); + jsonb_path_query_tz +--------------------- + "2017-03-10" + "2017-03-11" + "2017-03-10" + "2017-03-10" + "2017-03-10" +(5 rows) + +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].date() ? (@ < "2017-03-10".date())'); + jsonb_path_query_tz +--------------------- + "2017-03-09" "2017-03-09" - "2017-03-10T01:02:03+04:00" (2 rows) -- time comparison @@ -2064,6 +3562,99 @@ select jsonb_path_query_tz( "13:35:00+01:00" (3 rows) +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ == "12:35:00".time())'); + jsonb_path_query_tz +--------------------- + "12:35:00" + "12:35:00+00:00" +(2 rows) + +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ >= "12:35:00".time())'); + jsonb_path_query_tz +--------------------- + "12:35:00" + "12:36:00" + "12:35:00+00:00" +(3 rows) + +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ < "12:35:00".time())'); + jsonb_path_query_tz +--------------------- + "12:34:00" + "12:35:00+01:00" + "13:35:00+01:00" +(3 rows) + +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].time() ? (@ == "12:35:00".time())'); +ERROR: cannot convert value from timetz to time without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].time() ? (@ >= "12:35:00".time())'); +ERROR: cannot convert value from timetz to time without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].time() ? (@ < "12:35:00".time())'); +ERROR: cannot convert value from timetz to time without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["12:34:00.123", "12:35:00.123", "12:36:00.1123", "12:35:00.1123+00", "12:35:00.123+01", "13:35:00.123+01", "2017-03-10 12:35:00.1", "2017-03-10 12:35:00.123+01"]', + '$[*].time(2) ? (@ >= "12:35:00.123".time(2))'); +ERROR: cannot convert value from timetz to time without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].time() ? (@ == "12:35:00".time())'); + jsonb_path_query_tz +--------------------- + "12:35:00" + "12:35:00" + "12:35:00" + "12:35:00" +(4 rows) + +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].time() ? (@ >= "12:35:00".time())'); + jsonb_path_query_tz +--------------------- + "12:35:00" + "12:36:00" + "12:35:00" + "12:35:00" + "13:35:00" + "12:35:00" +(6 rows) + +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].time() ? (@ < "12:35:00".time())'); + jsonb_path_query_tz +--------------------- + "12:34:00" + "11:35:00" +(2 rows) + +select jsonb_path_query_tz( + '["12:34:00.123", "12:35:00.123", "12:36:00.1123", "12:35:00.1123+00", "12:35:00.123+01", "13:35:00.123+01", "2017-03-10 12:35:00.1", "2017-03-10 12:35:00.123+01"]', + '$[*].time(2) ? (@ >= "12:35:00.123".time(2))'); + jsonb_path_query_tz +--------------------- + "12:35:00.12" + "12:36:00.11" + "12:35:00.12" + "13:35:00.12" +(4 rows) + -- timetz comparison select jsonb_path_query( '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', @@ -2110,6 +3701,99 @@ select jsonb_path_query_tz( "10:35:00" (3 rows) +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ == "12:35:00 +1".time_tz())'); + jsonb_path_query_tz +--------------------- + "12:35:00+01:00" +(1 row) + +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ >= "12:35:00 +1".time_tz())'); + jsonb_path_query_tz +--------------------- + "12:35:00+01:00" + "12:36:00+01:00" + "12:35:00-02:00" + "11:35:00" + "12:35:00" +(5 rows) + +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ < "12:35:00 +1".time_tz())'); + jsonb_path_query_tz +--------------------- + "12:34:00+01:00" + "12:35:00+02:00" + "10:35:00" +(3 rows) + +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].time_tz() ? (@ == "12:35:00 +1".time_tz())'); +ERROR: cannot convert value from time to timetz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].time_tz() ? (@ >= "12:35:00 +1".time_tz())'); +ERROR: cannot convert value from time to timetz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].time_tz() ? (@ < "12:35:00 +1".time_tz())'); +ERROR: cannot convert value from time to timetz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["12:34:00.123+01", "12:35:00.123+01", "12:36:00.1123+01", "12:35:00.1123+02", "12:35:00.123-02", "10:35:00.123", "11:35:00.1", "12:35:00.123", "2017-03-10 12:35:00.123 +1"]', + '$[*].time_tz(2) ? (@ >= "12:35:00.123 +1".time_tz(2))'); +ERROR: cannot convert value from time to timetz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].time_tz() ? (@ == "12:35:00 +1".time_tz())'); + jsonb_path_query_tz +--------------------- + "12:35:00+01:00" +(1 row) + +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].time_tz() ? (@ >= "12:35:00 +1".time_tz())'); + jsonb_path_query_tz +--------------------- + "12:35:00+01:00" + "12:36:00+01:00" + "12:35:00-02:00" + "11:35:00+00:00" + "12:35:00+00:00" + "11:35:00+00:00" +(6 rows) + +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].time_tz() ? (@ < "12:35:00 +1".time_tz())'); + jsonb_path_query_tz +--------------------- + "12:34:00+01:00" + "12:35:00+02:00" + "10:35:00+00:00" +(3 rows) + +select jsonb_path_query_tz( + '["12:34:00.123+01", "12:35:00.123+01", "12:36:00.1123+01", "12:35:00.1123+02", "12:35:00.123-02", "10:35:00.123", "11:35:00.1", "12:35:00.123", "2017-03-10 12:35:00.123 +1"]', + '$[*].time_tz(2) ? (@ >= "12:35:00.123 +1".time_tz(2))'); + jsonb_path_query_tz +--------------------- + "12:35:00.12+01:00" + "12:36:00.11+01:00" + "12:35:00.12-02:00" + "12:35:00.12+00:00" + "11:35:00.12+00:00" +(5 rows) + -- timestamp comparison select jsonb_path_query( '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', @@ -2157,6 +3841,100 @@ select jsonb_path_query_tz( "2017-03-10" (3 rows) +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].datetime() ? (@ == "2017-03-10 12:35:00".timestamp())'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:35:00" + "2017-03-10T13:35:00+01:00" +(2 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].datetime() ? (@ >= "2017-03-10 12:35:00".timestamp())'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:35:00" + "2017-03-10T12:36:00" + "2017-03-10T13:35:00+01:00" + "2017-03-10T12:35:00-01:00" + "2017-03-11" +(5 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].datetime() ? (@ < "2017-03-10 12:35:00".timestamp())'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:34:00" + "2017-03-10T12:35:00+01:00" + "2017-03-10" +(3 rows) + +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp() ? (@ == "2017-03-10 12:35:00".timestamp())'); +ERROR: cannot convert value from timestamptz to timestamp without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp() ? (@ >= "2017-03-10 12:35:00".timestamp())'); +ERROR: cannot convert value from timestamptz to timestamp without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp() ? (@ < "2017-03-10 12:35:00".timestamp())'); +ERROR: cannot convert value from timestamptz to timestamp without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10 12:34:00.123", "2017-03-10 12:35:00.123", "2017-03-10 12:36:00.1123", "2017-03-10 12:35:00.1123+01", "2017-03-10 13:35:00.123+01", "2017-03-10 12:35:00.1-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp(2) ? (@ >= "2017-03-10 12:35:00.123".timestamp(2))'); +ERROR: cannot convert value from timestamptz to timestamp without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp() ? (@ == "2017-03-10 12:35:00".timestamp())'); + jsonb_path_query_tz +----------------------- + "2017-03-10T12:35:00" + "2017-03-10T12:35:00" +(2 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp() ? (@ >= "2017-03-10 12:35:00".timestamp())'); + jsonb_path_query_tz +----------------------- + "2017-03-10T12:35:00" + "2017-03-10T12:36:00" + "2017-03-10T12:35:00" + "2017-03-10T13:35:00" + "2017-03-11T00:00:00" +(5 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp() ? (@ < "2017-03-10 12:35:00".timestamp())'); + jsonb_path_query_tz +----------------------- + "2017-03-10T12:34:00" + "2017-03-10T11:35:00" + "2017-03-10T00:00:00" +(3 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00.123", "2017-03-10 12:35:00.123", "2017-03-10 12:36:00.1123", "2017-03-10 12:35:00.1123+01", "2017-03-10 13:35:00.123+01", "2017-03-10 12:35:00.1-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp(2) ? (@ >= "2017-03-10 12:35:00.123".timestamp(2))'); + jsonb_path_query_tz +-------------------------- + "2017-03-10T12:35:00.12" + "2017-03-10T12:36:00.11" + "2017-03-10T12:35:00.12" + "2017-03-10T13:35:00.1" + "2017-03-11T00:00:00" +(5 rows) + -- timestamptz comparison select jsonb_path_query( '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', @@ -2206,6 +3984,104 @@ select jsonb_path_query_tz( "2017-03-10" (4 rows) +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].datetime() ? (@ == "2017-03-10 12:35:00 +1".timestamp_tz())'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:35:00+01:00" + "2017-03-10T11:35:00" +(2 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].datetime() ? (@ >= "2017-03-10 12:35:00 +1".timestamp_tz())'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:35:00+01:00" + "2017-03-10T12:36:00+01:00" + "2017-03-10T12:35:00-02:00" + "2017-03-10T11:35:00" + "2017-03-10T12:35:00" + "2017-03-11" +(6 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].datetime() ? (@ < "2017-03-10 12:35:00 +1".timestamp_tz())'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:34:00+01:00" + "2017-03-10T12:35:00+02:00" + "2017-03-10T10:35:00" + "2017-03-10" +(4 rows) + +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz() ? (@ == "2017-03-10 12:35:00 +1".timestamp_tz())'); +ERROR: cannot convert value from timestamp to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz() ? (@ >= "2017-03-10 12:35:00 +1".timestamp_tz())'); +ERROR: cannot convert value from timestamp to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz() ? (@ < "2017-03-10 12:35:00 +1".timestamp_tz())'); +ERROR: cannot convert value from timestamp to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query( + '["2017-03-10 12:34:00.123+01", "2017-03-10 12:35:00.123+01", "2017-03-10 12:36:00.1123+01", "2017-03-10 12:35:00.1123+02", "2017-03-10 12:35:00.123-02", "2017-03-10 10:35:00.123", "2017-03-10 11:35:00.1", "2017-03-10 12:35:00.123", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz(2) ? (@ >= "2017-03-10 12:35:00.123 +1".timestamp_tz(2))'); +ERROR: cannot convert value from timestamp to timestamptz without time zone usage +HINT: Use *_tz() function for time zone support. +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz() ? (@ == "2017-03-10 12:35:00 +1".timestamp_tz())'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:35:00+01:00" + "2017-03-10T11:35:00+00:00" +(2 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz() ? (@ >= "2017-03-10 12:35:00 +1".timestamp_tz())'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:35:00+01:00" + "2017-03-10T12:36:00+01:00" + "2017-03-10T12:35:00-02:00" + "2017-03-10T11:35:00+00:00" + "2017-03-10T12:35:00+00:00" + "2017-03-11T00:00:00+00:00" +(6 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz() ? (@ < "2017-03-10 12:35:00 +1".timestamp_tz())'); + jsonb_path_query_tz +----------------------------- + "2017-03-10T12:34:00+01:00" + "2017-03-10T12:35:00+02:00" + "2017-03-10T10:35:00+00:00" + "2017-03-10T00:00:00+00:00" +(4 rows) + +select jsonb_path_query_tz( + '["2017-03-10 12:34:00.123+01", "2017-03-10 12:35:00.123+01", "2017-03-10 12:36:00.1123+01", "2017-03-10 12:35:00.1123+02", "2017-03-10 12:35:00.123-02", "2017-03-10 10:35:00.123", "2017-03-10 11:35:00.1", "2017-03-10 12:35:00.123", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz(2) ? (@ >= "2017-03-10 12:35:00.123 +1".timestamp_tz(2))'); + jsonb_path_query_tz +-------------------------------- + "2017-03-10T12:35:00.12+01:00" + "2017-03-10T12:36:00.11+01:00" + "2017-03-10T12:35:00.12-02:00" + "2017-03-10T12:35:00.12+00:00" + "2017-03-11T00:00:00+00:00" +(5 rows) + -- overflow during comparison select jsonb_path_query('"1000000-01-01"', '$.datetime() > "2020-01-01 12:00:00".datetime()'::jsonpath); jsonb_path_query diff --git a/src/test/regress/expected/jsonpath.out b/src/test/regress/expected/jsonpath.out index eeffb38c1b690..fd9bd755f520f 100644 --- a/src/test/regress/expected/jsonpath.out +++ b/src/test/regress/expected/jsonpath.out @@ -405,6 +405,84 @@ select '$.datetime("datetime template")'::jsonpath; $.datetime("datetime template") (1 row) +select '$.bigint().integer().number().decimal()'::jsonpath; + jsonpath +----------------------------------------- + $.bigint().integer().number().decimal() +(1 row) + +select '$.boolean()'::jsonpath; + jsonpath +------------- + $.boolean() +(1 row) + +select '$.date()'::jsonpath; + jsonpath +---------- + $.date() +(1 row) + +select '$.decimal(4,2)'::jsonpath; + jsonpath +---------------- + $.decimal(4,2) +(1 row) + +select '$.string()'::jsonpath; + jsonpath +------------ + $.string() +(1 row) + +select '$.time()'::jsonpath; + jsonpath +---------- + $.time() +(1 row) + +select '$.time(6)'::jsonpath; + jsonpath +----------- + $.time(6) +(1 row) + +select '$.time_tz()'::jsonpath; + jsonpath +------------- + $.time_tz() +(1 row) + +select '$.time_tz(4)'::jsonpath; + jsonpath +-------------- + $.time_tz(4) +(1 row) + +select '$.timestamp()'::jsonpath; + jsonpath +--------------- + $.timestamp() +(1 row) + +select '$.timestamp(2)'::jsonpath; + jsonpath +---------------- + $.timestamp(2) +(1 row) + +select '$.timestamp_tz()'::jsonpath; + jsonpath +------------------ + $.timestamp_tz() +(1 row) + +select '$.timestamp_tz(0)'::jsonpath; + jsonpath +------------------- + $.timestamp_tz(0) +(1 row) + select '$ ? (@ starts with "abc")'::jsonpath; jsonpath ------------------------- diff --git a/src/test/regress/expected/jsonpath_encoding.out b/src/test/regress/expected/jsonpath_encoding.out index 7cbfb6abcf37d..d53affe364f22 100644 --- a/src/test/regress/expected/jsonpath_encoding.out +++ b/src/test/regress/expected/jsonpath_encoding.out @@ -17,15 +17,15 @@ SELECT getdatabaseencoding(); -- just to label the results files -- checks for double-quoted values -- basic unicode input SELECT '"\u"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u" of jsonpath input LINE 1: SELECT '"\u"'::jsonpath; ^ SELECT '"\u00"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u00" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u00" of jsonpath input LINE 1: SELECT '"\u00"'::jsonpath; ^ SELECT '"\u000g"'::jsonpath; -- ERROR, g is not a hex digit -ERROR: invalid unicode sequence at or near "\u000" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u000" of jsonpath input LINE 1: SELECT '"\u000g"'::jsonpath; ^ SELECT '"\u0000"'::jsonpath; -- OK, legal escape @@ -99,15 +99,15 @@ select '"null \\u0000 escape"'::jsonpath as not_an_escape; -- checks for quoted key names -- basic unicode input SELECT '$."\u"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u" of jsonpath input LINE 1: SELECT '$."\u"'::jsonpath; ^ SELECT '$."\u00"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u00" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u00" of jsonpath input LINE 1: SELECT '$."\u00"'::jsonpath; ^ SELECT '$."\u000g"'::jsonpath; -- ERROR, g is not a hex digit -ERROR: invalid unicode sequence at or near "\u000" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u000" of jsonpath input LINE 1: SELECT '$."\u000g"'::jsonpath; ^ SELECT '$."\u0000"'::jsonpath; -- OK, legal escape diff --git a/src/test/regress/expected/jsonpath_encoding_1.out b/src/test/regress/expected/jsonpath_encoding_1.out index 005136c9657a8..287324f01574f 100644 --- a/src/test/regress/expected/jsonpath_encoding_1.out +++ b/src/test/regress/expected/jsonpath_encoding_1.out @@ -17,15 +17,15 @@ SELECT getdatabaseencoding(); -- just to label the results files -- checks for double-quoted values -- basic unicode input SELECT '"\u"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u" of jsonpath input LINE 1: SELECT '"\u"'::jsonpath; ^ SELECT '"\u00"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u00" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u00" of jsonpath input LINE 1: SELECT '"\u00"'::jsonpath; ^ SELECT '"\u000g"'::jsonpath; -- ERROR, g is not a hex digit -ERROR: invalid unicode sequence at or near "\u000" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u000" of jsonpath input LINE 1: SELECT '"\u000g"'::jsonpath; ^ SELECT '"\u0000"'::jsonpath; -- OK, legal escape @@ -93,15 +93,15 @@ select '"null \\u0000 escape"'::jsonpath as not_an_escape; -- checks for quoted key names -- basic unicode input SELECT '$."\u"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u" of jsonpath input LINE 1: SELECT '$."\u"'::jsonpath; ^ SELECT '$."\u00"'::jsonpath; -- ERROR, incomplete escape -ERROR: invalid unicode sequence at or near "\u00" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u00" of jsonpath input LINE 1: SELECT '$."\u00"'::jsonpath; ^ SELECT '$."\u000g"'::jsonpath; -- ERROR, g is not a hex digit -ERROR: invalid unicode sequence at or near "\u000" of jsonpath input +ERROR: invalid Unicode escape sequence at or near "\u000" of jsonpath input LINE 1: SELECT '$."\u000g"'::jsonpath; ^ SELECT '$."\u0000"'::jsonpath; -- OK, legal escape diff --git a/src/test/regress/expected/largeobject.out b/src/test/regress/expected/largeobject.out index bdcede6728e8a..4921dd79aeec1 100644 --- a/src/test/regress/expected/largeobject.out +++ b/src/test/regress/expected/largeobject.out @@ -6,7 +6,7 @@ \getenv abs_builddir PG_ABS_BUILDDIR -- ensure consistent test output regardless of the default bytea format SET bytea_output TO escape; --- Test ALTER LARGE OBJECT OWNER, GRANT, COMMENT +-- Test ALTER LARGE OBJECT OWNER CREATE ROLE regress_lo_user; SELECT lo_create(42); lo_create @@ -15,8 +15,11 @@ SELECT lo_create(42); (1 row) ALTER LARGE OBJECT 42 OWNER TO regress_lo_user; +-- Test GRANT, COMMENT as non-superuser +SET SESSION AUTHORIZATION regress_lo_user; GRANT SELECT ON LARGE OBJECT 42 TO public; COMMENT ON LARGE OBJECT 42 IS 'the ultimate answer'; +RESET SESSION AUTHORIZATION; -- Test psql's \lo_list et al (we assume no other LOs exist yet) \lo_list Large objects diff --git a/src/test/regress/expected/largeobject_1.out b/src/test/regress/expected/largeobject_1.out index d700910c35962..7172ddb39bb29 100644 --- a/src/test/regress/expected/largeobject_1.out +++ b/src/test/regress/expected/largeobject_1.out @@ -6,7 +6,7 @@ \getenv abs_builddir PG_ABS_BUILDDIR -- ensure consistent test output regardless of the default bytea format SET bytea_output TO escape; --- Test ALTER LARGE OBJECT OWNER, GRANT, COMMENT +-- Test ALTER LARGE OBJECT OWNER CREATE ROLE regress_lo_user; SELECT lo_create(42); lo_create @@ -15,8 +15,11 @@ SELECT lo_create(42); (1 row) ALTER LARGE OBJECT 42 OWNER TO regress_lo_user; +-- Test GRANT, COMMENT as non-superuser +SET SESSION AUTHORIZATION regress_lo_user; GRANT SELECT ON LARGE OBJECT 42 TO public; COMMENT ON LARGE OBJECT 42 IS 'the ultimate answer'; +RESET SESSION AUTHORIZATION; -- Test psql's \lo_list et al (we assume no other LOs exist yet) \lo_list Large objects diff --git a/src/test/regress/expected/maintain_every.out b/src/test/regress/expected/maintain_every.out new file mode 100644 index 0000000000000..dea1089c2499b --- /dev/null +++ b/src/test/regress/expected/maintain_every.out @@ -0,0 +1,33 @@ +-- Test maintenance commands that visit every eligible relation. Run as a +-- non-superuser, to skip other users' tables. +CREATE ROLE regress_maintain; +SET ROLE regress_maintain; +-- Test database-wide ANALYZE ("use_own_xacts" mode) setting relhassubclass=f +-- for non-partitioning inheritance, w/ ON COMMIT DELETE ROWS building an +-- empty index. +CREATE TEMP TABLE past_inh_db_other (); -- need 2 tables for "use_own_xacts" +CREATE TEMP TABLE past_inh_db_parent () ON COMMIT DELETE ROWS; +CREATE TEMP TABLE past_inh_db_child () INHERITS (past_inh_db_parent); +CREATE INDEX ON past_inh_db_parent ((1)); +ANALYZE past_inh_db_parent; +SELECT reltuples, relhassubclass + FROM pg_class WHERE oid = 'past_inh_db_parent'::regclass; + reltuples | relhassubclass +-----------+---------------- + 0 | t +(1 row) + +DROP TABLE past_inh_db_child; +SET client_min_messages = error; -- hide WARNINGs for other users' tables +ANALYZE; +RESET client_min_messages; +SELECT reltuples, relhassubclass + FROM pg_class WHERE oid = 'past_inh_db_parent'::regclass; + reltuples | relhassubclass +-----------+---------------- + 0 | f +(1 row) + +DROP TABLE past_inh_db_parent, past_inh_db_other; +RESET ROLE; +DROP ROLE regress_maintain; diff --git a/src/test/regress/expected/matview.out b/src/test/regress/expected/matview.out index 7cb05827cae3f..038ab735176ea 100644 --- a/src/test/regress/expected/matview.out +++ b/src/test/regress/expected/matview.out @@ -572,6 +572,24 @@ REFRESH MATERIALIZED VIEW mvtest_mv_foo; REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_foo; DROP OWNED BY regress_user_mvtest CASCADE; DROP ROLE regress_user_mvtest; +-- Concurrent refresh requires a unique index on the materialized +-- view. Test what happens if it's dropped during the refresh. +SET search_path = mvtest_mvschema, public; +CREATE OR REPLACE FUNCTION mvtest_drop_the_index() + RETURNS bool AS $$ +BEGIN + EXECUTE 'DROP INDEX IF EXISTS mvtest_mvschema.mvtest_drop_idx'; + RETURN true; +END; +$$ LANGUAGE plpgsql; +CREATE MATERIALIZED VIEW drop_idx_matview AS + SELECT 1 as i WHERE mvtest_drop_the_index(); +NOTICE: index "mvtest_drop_idx" does not exist, skipping +CREATE UNIQUE INDEX mvtest_drop_idx ON drop_idx_matview (i); +REFRESH MATERIALIZED VIEW CONCURRENTLY drop_idx_matview; +ERROR: could not find suitable unique index on materialized view +DROP MATERIALIZED VIEW drop_idx_matview; -- clean up +RESET search_path; -- make sure that create WITH NO DATA works via SPI BEGIN; CREATE FUNCTION mvtest_func() diff --git a/src/test/regress/expected/md5_1.out b/src/test/regress/expected/md5_1.out new file mode 100644 index 0000000000000..174b70bafb2fc --- /dev/null +++ b/src/test/regress/expected/md5_1.out @@ -0,0 +1,35 @@ +-- +-- MD5 test suite - from IETF RFC 1321 +-- (see: https://www.rfc-editor.org/rfc/rfc1321) +-- +-- (The md5() function will error in OpenSSL FIPS mode. By keeping +-- this test in a separate file, it is easier to manage variant +-- results.) +select md5('') = 'd41d8cd98f00b204e9800998ecf8427e' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported +select md5('a') = '0cc175b9c0f1b6a831c399e269772661' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported +select md5('abc') = '900150983cd24fb0d6963f7d28e17f72' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported +select md5('message digest') = 'f96b697d7cb7938d525a2f31aaf161d0' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported +select md5('abcdefghijklmnopqrstuvwxyz') = 'c3fcd3d76192e4007dfb496cca67e13b' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported +select md5('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') = 'd174ab98d277d9f5a5611c2c9f419d9f' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported +select md5('12345678901234567890123456789012345678901234567890123456789012345678901234567890') = '57edf4a22be3c955ac49da2e2107b67a' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported +select md5(''::bytea) = 'd41d8cd98f00b204e9800998ecf8427e' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported +select md5('a'::bytea) = '0cc175b9c0f1b6a831c399e269772661' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported +select md5('abc'::bytea) = '900150983cd24fb0d6963f7d28e17f72' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported +select md5('message digest'::bytea) = 'f96b697d7cb7938d525a2f31aaf161d0' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported +select md5('abcdefghijklmnopqrstuvwxyz'::bytea) = 'c3fcd3d76192e4007dfb496cca67e13b' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported +select md5('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'::bytea) = 'd174ab98d277d9f5a5611c2c9f419d9f' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported +select md5('12345678901234567890123456789012345678901234567890123456789012345678901234567890'::bytea) = '57edf4a22be3c955ac49da2e2107b67a' AS "TRUE"; +ERROR: could not compute MD5 hash: unsupported diff --git a/src/test/regress/expected/memoize.out b/src/test/regress/expected/memoize.out index f5202430f807b..0fd103c06bb8b 100644 --- a/src/test/regress/expected/memoize.out +++ b/src/test/regress/expected/memoize.out @@ -92,10 +92,76 @@ WHERE t1.unique1 < 1000; 1000 | 9.5000000000000000 (1 row) +-- Try with LATERAL joins +SELECT explain_memoize(' +SELECT COUNT(*),AVG(t2.t1two) FROM tenk1 t1 LEFT JOIN +LATERAL ( + SELECT t1.two as t1two, * FROM tenk1 t2 WHERE t2.unique1 < 4 OFFSET 0 +) t2 +ON t1.two = t2.two +WHERE t1.unique1 < 10;', false); + explain_memoize +---------------------------------------------------------------------------------------------- + Aggregate (actual rows=1 loops=N) + -> Nested Loop Left Join (actual rows=20 loops=N) + -> Index Scan using tenk1_unique1 on tenk1 t1 (actual rows=10 loops=N) + Index Cond: (unique1 < 10) + -> Memoize (actual rows=2 loops=N) + Cache Key: t1.two + Cache Mode: binary + Hits: 8 Misses: 2 Evictions: Zero Overflows: 0 Memory Usage: NkB + -> Subquery Scan on t2 (actual rows=2 loops=N) + Filter: (t1.two = t2.two) + Rows Removed by Filter: 2 + -> Index Scan using tenk1_unique1 on tenk1 t2_1 (actual rows=4 loops=N) + Index Cond: (unique1 < 4) +(13 rows) + +-- And check we get the expected results. +SELECT COUNT(*),AVG(t2.t1two) FROM tenk1 t1 LEFT JOIN +LATERAL ( + SELECT t1.two as t1two, * FROM tenk1 t2 WHERE t2.unique1 < 4 OFFSET 0 +) t2 +ON t1.two = t2.two +WHERE t1.unique1 < 10; + count | avg +-------+------------------------ + 20 | 0.50000000000000000000 +(1 row) + +SET enable_mergejoin TO off; +-- Test for varlena datatype with expr evaluation +CREATE TABLE expr_key (x numeric, t text); +INSERT INTO expr_key (x, t) +SELECT d1::numeric, d1::text FROM ( + SELECT round((d / pi())::numeric, 7) AS d1 FROM generate_series(1, 20) AS d +) t; +-- duplicate rows so we get some cache hits +INSERT INTO expr_key SELECT * FROM expr_key; +CREATE INDEX expr_key_idx_x_t ON expr_key (x, t); +VACUUM ANALYZE expr_key; +-- Ensure we get we get a cache miss and hit for each of the 20 distinct values +SELECT explain_memoize(' +SELECT * FROM expr_key t1 INNER JOIN expr_key t2 +ON t1.x = t2.t::numeric AND t1.t::numeric = t2.x;', false); + explain_memoize +------------------------------------------------------------------------------------------- + Nested Loop (actual rows=80 loops=N) + -> Seq Scan on expr_key t1 (actual rows=40 loops=N) + -> Memoize (actual rows=2 loops=N) + Cache Key: t1.x, (t1.t)::numeric + Cache Mode: logical + Hits: 20 Misses: 20 Evictions: Zero Overflows: 0 Memory Usage: NkB + -> Index Only Scan using expr_key_idx_x_t on expr_key t2 (actual rows=2 loops=N) + Index Cond: (x = (t1.t)::numeric) + Filter: (t1.x = (t)::numeric) + Heap Fetches: N +(10 rows) + +DROP TABLE expr_key; -- Reduce work_mem and hash_mem_multiplier so that we see some cache evictions SET work_mem TO '64kB'; SET hash_mem_multiplier TO 1.0; -SET enable_mergejoin TO off; -- Ensure we get some evictions. We're unable to validate the hits and misses -- here as the number of entries that fit in the cache at once will vary -- between different machines. @@ -276,7 +342,7 @@ WHERE unique1 < 3 ---------------------------------------------------------------- Index Scan using tenk1_unique1 on tenk1 t0 Index Cond: (unique1 < 3) - Filter: (SubPlan 1) + Filter: EXISTS(SubPlan 1) SubPlan 1 -> Nested Loop -> Index Scan using tenk1_hundred on tenk1 t2 diff --git a/src/test/regress/expected/merge.out b/src/test/regress/expected/merge.out index 133d42117c089..e9c9b15d3c80d 100644 --- a/src/test/regress/expected/merge.out +++ b/src/test/regress/expected/merge.out @@ -3,6 +3,7 @@ -- CREATE USER regress_merge_privs; CREATE USER regress_merge_no_privs; +CREATE USER regress_merge_none; DROP TABLE IF EXISTS target; NOTICE: table "target" does not exist, skipping DROP TABLE IF EXISTS source; @@ -69,6 +70,15 @@ ON t.tid = s.sid WHEN MATCHED THEN INSERT DEFAULT VALUES; ERROR: syntax error at or near "INSERT" +LINE 5: INSERT DEFAULT VALUES; + ^ +-- NOT MATCHED BY SOURCE/INSERT error +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED BY SOURCE THEN + INSERT DEFAULT VALUES; +ERROR: syntax error at or near "INSERT" LINE 5: INSERT DEFAULT VALUES; ^ -- incorrectly specifying INTO target @@ -105,6 +115,15 @@ ON t.tid = s.sid WHEN NOT MATCHED THEN UPDATE SET balance = 0; ERROR: syntax error at or near "UPDATE" +LINE 5: UPDATE SET balance = 0; + ^ +-- NOT MATCHED BY TARGET/UPDATE +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED BY TARGET THEN + UPDATE SET balance = 0; +ERROR: syntax error at or near "UPDATE" LINE 5: UPDATE SET balance = 0; ^ -- UPDATE tablename @@ -123,31 +142,21 @@ ON tid = tid WHEN MATCHED THEN DO NOTHING; ERROR: name "target" specified more than once DETAIL: The name is used both as MERGE target table and data source. --- used in a CTE +-- used in a CTE without RETURNING WITH foo AS ( MERGE INTO target USING source ON (true) WHEN MATCHED THEN DELETE ) SELECT * FROM foo; -ERROR: MERGE not supported in WITH query -LINE 1: WITH foo AS ( - ^ --- used in COPY +ERROR: WITH query "foo" does not have a RETURNING clause +LINE 4: ) SELECT * FROM foo; + ^ +-- used in COPY without RETURNING COPY ( MERGE INTO target USING source ON (true) WHEN MATCHED THEN DELETE ) TO stdout; -ERROR: MERGE not supported in COPY +ERROR: COPY query must have a RETURNING clause -- unsupported relation types --- view -CREATE VIEW tv AS SELECT * FROM target; -MERGE INTO tv t -USING source s -ON t.tid = s.sid -WHEN NOT MATCHED THEN - INSERT DEFAULT VALUES; -ERROR: cannot execute MERGE on relation "tv" -DETAIL: This operation is not supported for views. -DROP VIEW tv; -- materialized view CREATE MATERIALIZED VIEW mv AS SELECT * FROM target; MERGE INTO mv t @@ -159,6 +168,14 @@ ERROR: cannot execute MERGE on relation "mv" DETAIL: This operation is not supported for materialized views. DROP MATERIALIZED VIEW mv; -- permissions +SET SESSION AUTHORIZATION regress_merge_none; +MERGE INTO target +USING (SELECT 1) +ON true +WHEN MATCHED THEN + DO NOTHING; +ERROR: permission denied for table target +SET SESSION AUTHORIZATION regress_merge_privs; MERGE INTO target USING source2 ON target.tid = source2.sid @@ -270,6 +287,31 @@ SELECT * FROM target ORDER BY tid; | (4 rows) +ROLLBACK; +-- DELETE/INSERT not matched by source/target +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED BY SOURCE THEN + DELETE +WHEN NOT MATCHED BY TARGET THEN + INSERT VALUES (s.sid, s.delta) +RETURNING merge_action(), t.*; + merge_action | tid | balance +--------------+-----+--------- + DELETE | 1 | 10 + DELETE | 2 | 20 + DELETE | 3 | 30 + INSERT | 4 | 40 +(4 rows) + +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 4 | 40 +(1 row) + ROLLBACK; -- index plans INSERT INTO target SELECT generate_series(1000,2500), 0; @@ -738,6 +780,19 @@ SELECT * FROM wq_target; 1 | -1 (1 row) +-- conditions in NOT MATCHED BY SOURCE clause can only refer to target columns +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED BY SOURCE AND s.balance = 100 THEN + DELETE; +ERROR: invalid reference to FROM-clause entry for table "s" +LINE 3: WHEN NOT MATCHED BY SOURCE AND s.balance = 100 THEN + ^ +DETAIL: There is an entry for table "s", but it cannot be referenced from this part of the query. +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED BY SOURCE AND t.balance = 100 THEN + DELETE; -- conditions in MATCHED clause can refer to both source and target SELECT * FROM wq_source; balance | sid @@ -922,6 +977,54 @@ SELECT * FROM target ORDER BY tid; 4 | 40 (3 rows) +ROLLBACK; +-- UPSERT with UPDATE/DELETE when not matched by source +BEGIN; +DELETE FROM SOURCE WHERE sid = 2; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED AND t.balance > s.delta THEN + UPDATE SET balance = t.balance - s.delta +WHEN MATCHED THEN + UPDATE SET balance = 0 +WHEN NOT MATCHED THEN + INSERT VALUES (s.sid, s.delta) +WHEN NOT MATCHED BY SOURCE AND tid = 1 THEN + UPDATE SET balance = 0 +WHEN NOT MATCHED BY SOURCE THEN + DELETE +RETURNING merge_action(), t.*; +NOTICE: BEFORE INSERT STATEMENT trigger +NOTICE: BEFORE UPDATE STATEMENT trigger +NOTICE: BEFORE DELETE STATEMENT trigger +NOTICE: BEFORE UPDATE ROW trigger row: (3,30) -> (3,10) +NOTICE: BEFORE INSERT ROW trigger row: (4,40) +NOTICE: BEFORE DELETE ROW trigger row: (2,20) +NOTICE: BEFORE UPDATE ROW trigger row: (1,10) -> (1,0) +NOTICE: AFTER UPDATE ROW trigger row: (3,30) -> (3,10) +NOTICE: AFTER INSERT ROW trigger row: (4,40) +NOTICE: AFTER DELETE ROW trigger row: (2,20) +NOTICE: AFTER UPDATE ROW trigger row: (1,10) -> (1,0) +NOTICE: AFTER DELETE STATEMENT trigger +NOTICE: AFTER UPDATE STATEMENT trigger +NOTICE: AFTER INSERT STATEMENT trigger + merge_action | tid | balance +--------------+-----+--------- + UPDATE | 3 | 10 + INSERT | 4 | 40 + DELETE | 2 | 20 + UPDATE | 1 | 0 +(4 rows) + +SELECT * FROM target ORDER BY tid; + tid | balance +-----+--------- + 1 | 0 + 3 | 10 + 4 | 40 +(3 rows) + ROLLBACK; -- Test behavior of triggers that turn UPDATE/DELETE into no-ops create or replace function skip_merge_op() returns trigger @@ -1256,7 +1359,7 @@ BEGIN; MERGE INTO sq_target USING v ON tid = sid -WHEN MATCHED AND tid > 2 THEN +WHEN MATCHED AND tid >= 2 THEN UPDATE SET balance = balance + delta WHEN NOT MATCHED THEN INSERT (balance, tid) VALUES (balance + delta, sid) @@ -1271,7 +1374,7 @@ INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10); MERGE INTO sq_target t USING v ON tid = sid -WHEN MATCHED AND tid > 2 THEN +WHEN MATCHED AND tid >= 2 THEN UPDATE SET balance = t.balance + delta WHEN NOT MATCHED THEN INSERT (balance, tid) VALUES (balance + delta, sid) @@ -1295,7 +1398,7 @@ WITH targq AS ( MERGE INTO sq_target t USING v ON tid = sid -WHEN MATCHED AND tid > 2 THEN +WHEN MATCHED AND tid >= 2 THEN UPDATE SET balance = t.balance + delta WHEN NOT MATCHED THEN INSERT (balance, tid) VALUES (balance + delta, sid) @@ -1303,21 +1406,207 @@ WHEN MATCHED AND tid < 2 THEN DELETE; ROLLBACK; -- RETURNING +SELECT * FROM sq_source ORDER BY sid; + delta | sid | balance +-------+-----+--------- + 10 | 1 | 0 + 20 | 2 | 0 + 40 | 4 | 0 +(3 rows) + +SELECT * FROM sq_target ORDER BY tid; + tid | balance +-----+--------- + 1 | 100 + 2 | 200 + 3 | 300 +(3 rows) + BEGIN; -INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10); +CREATE TABLE merge_actions(action text, abbrev text); +INSERT INTO merge_actions VALUES ('INSERT', 'ins'), ('UPDATE', 'upd'), ('DELETE', 'del'); MERGE INTO sq_target t -USING v +USING sq_source s ON tid = sid -WHEN MATCHED AND tid > 2 THEN +WHEN MATCHED AND tid >= 2 THEN UPDATE SET balance = t.balance + delta WHEN NOT MATCHED THEN - INSERT (balance, tid) VALUES (balance + delta, sid) + INSERT (balance, tid) VALUES (balance + delta, sid) WHEN MATCHED AND tid < 2 THEN - DELETE -RETURNING *; -ERROR: syntax error at or near "RETURNING" -LINE 10: RETURNING *; - ^ + DELETE +RETURNING (SELECT abbrev FROM merge_actions + WHERE action = merge_action()) AS action, + t.*, + CASE merge_action() + WHEN 'INSERT' THEN 'Inserted '||t + WHEN 'UPDATE' THEN 'Added '||delta||' to balance' + WHEN 'DELETE' THEN 'Removed '||t + END AS description; + action | tid | balance | description +--------+-----+---------+--------------------- + del | 1 | 100 | Removed (1,100) + upd | 2 | 220 | Added 20 to balance + ins | 4 | 40 | Inserted (4,40) +(3 rows) + +ROLLBACK; +-- error when using merge_action() outside MERGE +SELECT merge_action() FROM sq_target; +ERROR: MERGE_ACTION() can only be used in the RETURNING list of a MERGE command +LINE 1: SELECT merge_action() FROM sq_target; + ^ +UPDATE sq_target SET balance = balance + 1 RETURNING merge_action(); +ERROR: MERGE_ACTION() can only be used in the RETURNING list of a MERGE command +LINE 1: ...ATE sq_target SET balance = balance + 1 RETURNING merge_acti... + ^ +-- RETURNING in CTEs +CREATE TABLE sq_target_merge_log (tid integer NOT NULL, last_change text); +INSERT INTO sq_target_merge_log VALUES (1, 'Original value'); +BEGIN; +WITH m AS ( + MERGE INTO sq_target t + USING sq_source s + ON tid = sid + WHEN MATCHED AND tid >= 2 THEN + UPDATE SET balance = t.balance + delta + WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) + WHEN MATCHED AND tid < 2 THEN + DELETE + RETURNING merge_action() AS action, t.*, + CASE merge_action() + WHEN 'INSERT' THEN 'Inserted '||t + WHEN 'UPDATE' THEN 'Added '||delta||' to balance' + WHEN 'DELETE' THEN 'Removed '||t + END AS description +), m2 AS ( + MERGE INTO sq_target_merge_log l + USING m + ON l.tid = m.tid + WHEN MATCHED THEN + UPDATE SET last_change = description + WHEN NOT MATCHED THEN + INSERT VALUES (m.tid, description) + RETURNING action, merge_action() AS log_action, l.* +) +SELECT * FROM m2; + action | log_action | tid | last_change +--------+------------+-----+--------------------- + DELETE | UPDATE | 1 | Removed (1,100) + UPDATE | INSERT | 2 | Added 20 to balance + INSERT | INSERT | 4 | Inserted (4,40) +(3 rows) + +SELECT * FROM sq_target_merge_log ORDER BY tid; + tid | last_change +-----+--------------------- + 1 | Removed (1,100) + 2 | Added 20 to balance + 4 | Inserted (4,40) +(3 rows) + +ROLLBACK; +-- COPY (MERGE ... RETURNING) TO ... +BEGIN; +COPY ( + MERGE INTO sq_target t + USING sq_source s + ON tid = sid + WHEN MATCHED AND tid >= 2 THEN + UPDATE SET balance = t.balance + delta + WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) + WHEN MATCHED AND tid < 2 THEN + DELETE + RETURNING merge_action(), t.* +) TO stdout; +DELETE 1 100 +UPDATE 2 220 +INSERT 4 40 +ROLLBACK; +-- SQL function with MERGE ... RETURNING +BEGIN; +CREATE FUNCTION merge_into_sq_target(sid int, balance int, delta int, + OUT action text, OUT tid int, OUT new_balance int) +LANGUAGE sql AS +$$ + MERGE INTO sq_target t + USING (VALUES ($1, $2, $3)) AS v(sid, balance, delta) + ON tid = v.sid + WHEN MATCHED AND tid >= 2 THEN + UPDATE SET balance = t.balance + v.delta + WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (v.balance + v.delta, v.sid) + WHEN MATCHED AND tid < 2 THEN + DELETE + RETURNING merge_action(), t.*; +$$; +SELECT m.* +FROM (VALUES (1, 0, 0), (3, 0, 20), (4, 100, 10)) AS v(sid, balance, delta), +LATERAL (SELECT action, tid, new_balance FROM merge_into_sq_target(sid, balance, delta)) m; + action | tid | new_balance +--------+-----+------------- + DELETE | 1 | 100 + UPDATE | 3 | 320 + INSERT | 4 | 110 +(3 rows) + +ROLLBACK; +-- SQL SRF with MERGE ... RETURNING +BEGIN; +CREATE FUNCTION merge_sq_source_into_sq_target() +RETURNS TABLE (action text, tid int, balance int) +LANGUAGE sql AS +$$ + MERGE INTO sq_target t + USING sq_source s + ON tid = sid + WHEN MATCHED AND tid >= 2 THEN + UPDATE SET balance = t.balance + delta + WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) + WHEN MATCHED AND tid < 2 THEN + DELETE + RETURNING merge_action(), t.*; +$$; +SELECT * FROM merge_sq_source_into_sq_target(); + action | tid | balance +--------+-----+--------- + DELETE | 1 | 100 + UPDATE | 2 | 220 + INSERT | 4 | 40 +(3 rows) + +ROLLBACK; +-- PL/pgSQL function with MERGE ... RETURNING ... INTO +BEGIN; +CREATE FUNCTION merge_into_sq_target(sid int, balance int, delta int, + OUT r_action text, OUT r_tid int, OUT r_balance int) +LANGUAGE plpgsql AS +$$ +BEGIN + MERGE INTO sq_target t + USING (VALUES ($1, $2, $3)) AS v(sid, balance, delta) + ON tid = v.sid + WHEN MATCHED AND tid >= 2 THEN + UPDATE SET balance = t.balance + v.delta + WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (v.balance + v.delta, v.sid) + WHEN MATCHED AND tid < 2 THEN + DELETE + RETURNING merge_action(), t.* INTO r_action, r_tid, r_balance; +END; +$$; +SELECT m.* +FROM (VALUES (1, 0, 0), (3, 0, 20), (4, 100, 10)) AS v(sid, balance, delta), +LATERAL (SELECT r_action, r_tid, r_balance FROM merge_into_sq_target(sid, balance, delta)) m; + r_action | r_tid | r_balance +----------+-------+----------- + DELETE | 1 | 100 + UPDATE | 3 | 320 + INSERT | 4 | 110 +(3 rows) + ROLLBACK; -- EXPLAIN CREATE TABLE ex_mtarget (a int, b int) @@ -1451,6 +1740,50 @@ WHEN NOT MATCHED AND s.a < 20 THEN -> Seq Scan on ex_mtarget t (actual rows=49 loops=1) (12 rows) +-- not matched by source +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN NOT MATCHED BY SOURCE and t.a < 10 THEN + DELETE'); + explain_merge +---------------------------------------------------------------------- + Merge on ex_mtarget t (actual rows=0 loops=1) + Tuples: skipped=54 + -> Merge Left Join (actual rows=54 loops=1) + Merge Cond: (t.a = s.a) + -> Sort (actual rows=54 loops=1) + Sort Key: t.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_mtarget t (actual rows=54 loops=1) + -> Sort (actual rows=100 loops=1) + Sort Key: s.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_msource s (actual rows=100 loops=1) +(12 rows) + +-- not matched by source and target +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN NOT MATCHED BY SOURCE AND t.a < 10 THEN + DELETE +WHEN NOT MATCHED BY TARGET AND s.a < 20 THEN + INSERT VALUES (a, b)'); + explain_merge +---------------------------------------------------------------------- + Merge on ex_mtarget t (actual rows=0 loops=1) + Tuples: skipped=100 + -> Merge Full Join (actual rows=100 loops=1) + Merge Cond: (t.a = s.a) + -> Sort (actual rows=54 loops=1) + Sort Key: t.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_mtarget t (actual rows=54 loops=1) + -> Sort (actual rows=100 loops=1) + Sort Key: s.a + Sort Method: quicksort Memory: xxx + -> Seq Scan on ex_msource s (actual rows=100 loops=1) +(12 rows) + -- nothing SELECT explain_merge(' MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a AND t.a < -1000 @@ -1474,6 +1807,56 @@ WHEN MATCHED AND t.a < 10 THEN DROP TABLE ex_msource, ex_mtarget; DROP FUNCTION explain_merge(text); +-- EXPLAIN SubPlans and InitPlans +CREATE TABLE src (a int, b int, c int, d int); +CREATE TABLE tgt (a int, b int, c int, d int); +CREATE TABLE ref (ab int, cd int); +EXPLAIN (verbose, costs off) +MERGE INTO tgt t +USING (SELECT *, (SELECT count(*) FROM ref r + WHERE r.ab = s.a + s.b + AND r.cd = s.c - s.d) cnt + FROM src s) s +ON t.a = s.a AND t.b < s.cnt +WHEN MATCHED AND t.c > s.cnt THEN + UPDATE SET (b, c) = (SELECT s.b, s.cnt); + QUERY PLAN +------------------------------------------------------------------------------------- + Merge on public.tgt t + -> Hash Join + Output: t.ctid, s.a, s.b, s.c, s.d, s.ctid + Hash Cond: (t.a = s.a) + Join Filter: (t.b < (SubPlan 1)) + -> Seq Scan on public.tgt t + Output: t.ctid, t.a, t.b + -> Hash + Output: s.a, s.b, s.c, s.d, s.ctid + -> Seq Scan on public.src s + Output: s.a, s.b, s.c, s.d, s.ctid + SubPlan 1 + -> Aggregate + Output: count(*) + -> Seq Scan on public.ref r + Output: r.ab, r.cd + Filter: ((r.ab = (s.a + s.b)) AND (r.cd = (s.c - s.d))) + SubPlan 4 + -> Aggregate + Output: count(*) + -> Seq Scan on public.ref r_2 + Output: r_2.ab, r_2.cd + Filter: ((r_2.ab = (s.a + s.b)) AND (r_2.cd = (s.c - s.d))) + SubPlan 3 + -> Result + Output: s.b, (InitPlan 2).col1 + InitPlan 2 + -> Aggregate + Output: count(*) + -> Seq Scan on public.ref r_1 + Output: r_1.ab, r_1.cd + Filter: ((r_1.ab = (s.a + s.b)) AND (r_1.cd = (s.c - s.d))) +(32 rows) + +DROP TABLE src, tgt, ref; -- Subqueries BEGIN; MERGE INTO sq_target t @@ -1514,7 +1897,7 @@ SELECT * FROM sq_target WHERE tid = 1; (1 row) ROLLBACK; -DROP TABLE sq_target, sq_source CASCADE; +DROP TABLE sq_target, sq_target_merge_log, sq_source CASCADE; NOTICE: drop cascades to view v CREATE TABLE pa_target (tid integer, balance float, val text) PARTITION BY LIST (tid); @@ -1530,7 +1913,7 @@ CREATE TABLE pa_source (sid integer, delta float); -- insert many rows to the source table INSERT INTO pa_source SELECT id, id * 10 FROM generate_series(1,14) AS id; -- insert a few rows in the target table (odd numbered tid) -INSERT INTO pa_target SELECT id, id * 100, 'initial' FROM generate_series(1,14,2) AS id; +INSERT INTO pa_target SELECT id, id * 100, 'initial' FROM generate_series(1,15,2) AS id; -- try simple MERGE BEGIN; MERGE INTO pa_target t @@ -1539,10 +1922,12 @@ MERGE INTO pa_target t WHEN MATCHED THEN UPDATE SET balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (sid, delta, 'inserted by merge'); -SELECT * FROM pa_target ORDER BY tid; - tid | balance | val ------+---------+-------------------------- + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET val = val || ' not matched by source'; +SELECT * FROM pa_target ORDER BY tid, val; + tid | balance | val +-----+---------+------------------------------- 1 | 110 | initial updated by merge 2 | 20 | inserted by merge 3 | 330 | initial updated by merge @@ -1557,7 +1942,8 @@ SELECT * FROM pa_target ORDER BY tid; 12 | 120 | inserted by merge 13 | 1430 | initial updated by merge 14 | 140 | inserted by merge -(14 rows) + 15 | 1500 | initial not matched by source +(15 rows) ROLLBACK; -- same with a constant qual @@ -1568,31 +1954,34 @@ MERGE INTO pa_target t WHEN MATCHED THEN UPDATE SET balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (sid, delta, 'inserted by merge'); -SELECT * FROM pa_target ORDER BY tid; - tid | balance | val ------+---------+-------------------------- + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET val = val || ' not matched by source'; +SELECT * FROM pa_target ORDER BY tid, val; + tid | balance | val +-----+---------+------------------------------- 1 | 110 | initial updated by merge 2 | 20 | inserted by merge + 3 | 300 | initial not matched by source 3 | 30 | inserted by merge - 3 | 300 | initial 4 | 40 | inserted by merge - 5 | 500 | initial + 5 | 500 | initial not matched by source 5 | 50 | inserted by merge 6 | 60 | inserted by merge - 7 | 700 | initial + 7 | 700 | initial not matched by source 7 | 70 | inserted by merge 8 | 80 | inserted by merge + 9 | 900 | initial not matched by source 9 | 90 | inserted by merge - 9 | 900 | initial 10 | 100 | inserted by merge - 11 | 1100 | initial + 11 | 1100 | initial not matched by source 11 | 110 | inserted by merge 12 | 120 | inserted by merge - 13 | 1300 | initial + 13 | 1300 | initial not matched by source 13 | 130 | inserted by merge 14 | 140 | inserted by merge -(20 rows) + 15 | 1500 | initial not matched by source +(21 rows) ROLLBACK; -- try updating the partition key column @@ -1607,7 +1996,9 @@ MERGE INTO pa_target t WHEN MATCHED THEN UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (sid, delta, 'inserted by merge'); + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET tid = 1, val = val || ' not matched by source'; IF FOUND THEN GET DIAGNOSTICS result := ROW_COUNT; END IF; @@ -1617,27 +2008,72 @@ $$; SELECT merge_func(); merge_func ------------ - 14 + 15 (1 row) -SELECT * FROM pa_target ORDER BY tid; - tid | balance | val ------+---------+-------------------------- +SELECT * FROM pa_target ORDER BY tid, val; + tid | balance | val +-----+---------+------------------------------- + 1 | 1500 | initial not matched by source 2 | 110 | initial updated by merge 2 | 20 | inserted by merge - 4 | 40 | inserted by merge 4 | 330 | initial updated by merge + 4 | 40 | inserted by merge 6 | 550 | initial updated by merge 6 | 60 | inserted by merge - 8 | 80 | inserted by merge 8 | 770 | initial updated by merge + 8 | 80 | inserted by merge 10 | 990 | initial updated by merge 10 | 100 | inserted by merge 12 | 1210 | initial updated by merge 12 | 120 | inserted by merge 14 | 1430 | initial updated by merge 14 | 140 | inserted by merge -(14 rows) +(15 rows) + +ROLLBACK; +-- update partition key to partition not initially scanned +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid AND t.tid = 1 + WHEN MATCHED THEN + UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' + RETURNING merge_action(), t.*; + merge_action | tid | balance | val +--------------+-----+---------+-------------------------- + UPDATE | 2 | 110 | initial updated by merge +(1 row) + +SELECT * FROM pa_target ORDER BY tid; + tid | balance | val +-----+---------+-------------------------- + 2 | 110 | initial updated by merge + 3 | 300 | initial + 5 | 500 | initial + 7 | 700 | initial + 9 | 900 | initial + 11 | 1100 | initial + 13 | 1300 | initial + 15 | 1500 | initial +(8 rows) + +ROLLBACK; +-- bug #18871: ExecInitPartitionInfo()'s handling of DO NOTHING actions +BEGIN; +TRUNCATE pa_target; +MERGE INTO pa_target t + USING (VALUES (10, 100)) AS s(sid, delta) + ON t.tid = s.sid + WHEN NOT MATCHED THEN + INSERT VALUES (1, 10, 'inserted by merge') + WHEN MATCHED THEN + DO NOTHING; +SELECT * FROM pa_target ORDER BY tid, val; + tid | balance | val +-----+---------+------------------- + 1 | 10 | inserted by merge +(1 row) ROLLBACK; DROP TABLE pa_target CASCADE; @@ -1659,19 +2095,30 @@ ALTER TABLE pa_target ATTACH PARTITION part2 FOR VALUES IN (2,5,6); ALTER TABLE pa_target ATTACH PARTITION part3 FOR VALUES IN (3,8,9); ALTER TABLE pa_target ATTACH PARTITION part4 DEFAULT; -- insert a few rows in the target table (odd numbered tid) -INSERT INTO pa_target SELECT id, id * 100, 'initial' FROM generate_series(1,14,2) AS id; +INSERT INTO pa_target SELECT id, id * 100, 'initial' FROM generate_series(1,15,2) AS id; -- try simple MERGE BEGIN; +DO $$ +DECLARE + result integer; +BEGIN MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid WHEN MATCHED THEN UPDATE SET balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (sid, delta, 'inserted by merge'); -SELECT * FROM pa_target ORDER BY tid; - tid | balance | val ------+---------+-------------------------- + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET val = val || ' not matched by source'; +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +NOTICE: ROW_COUNT = 15 +SELECT * FROM pa_target ORDER BY tid, val; + tid | balance | val +-----+---------+------------------------------- 1 | 110 | initial updated by merge 2 | 20 | inserted by merge 3 | 330 | initial updated by merge @@ -1686,7 +2133,8 @@ SELECT * FROM pa_target ORDER BY tid; 12 | 120 | inserted by merge 13 | 1430 | initial updated by merge 14 | 140 | inserted by merge -(14 rows) + 15 | 1500 | initial not matched by source +(15 rows) ROLLBACK; -- same with a constant qual @@ -1698,58 +2146,152 @@ MERGE INTO pa_target t WHEN MATCHED THEN UPDATE SET balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (sid, delta, 'inserted by merge'); -SELECT * FROM pa_target ORDER BY tid; - tid | balance | val ------+---------+-------------------------- + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET val = val || ' not matched by source'; +SELECT * FROM pa_target ORDER BY tid, val; + tid | balance | val +-----+---------+------------------------------- 1 | 110 | initial updated by merge 2 | 20 | inserted by merge + 3 | 300 | initial not matched by source 3 | 30 | inserted by merge - 3 | 300 | initial 4 | 40 | inserted by merge 6 | 60 | inserted by merge - 7 | 700 | initial + 7 | 700 | initial not matched by source 7 | 70 | inserted by merge 8 | 80 | inserted by merge - 9 | 900 | initial + 9 | 900 | initial not matched by source 9 | 90 | inserted by merge 10 | 100 | inserted by merge + 11 | 1100 | initial not matched by source 11 | 110 | inserted by merge - 11 | 1100 | initial 12 | 120 | inserted by merge - 13 | 1300 | initial + 13 | 1300 | initial not matched by source 13 | 130 | inserted by merge 14 | 140 | inserted by merge -(18 rows) + 15 | 1500 | initial not matched by source +(19 rows) ROLLBACK; -- try updating the partition key column BEGIN; +DO $$ +DECLARE + result integer; +BEGIN MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid WHEN MATCHED THEN UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (sid, delta, 'inserted by merge'); -SELECT * FROM pa_target ORDER BY tid; - tid | balance | val ------+---------+-------------------------- + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET tid = 1, val = val || ' not matched by source'; +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +NOTICE: ROW_COUNT = 15 +SELECT * FROM pa_target ORDER BY tid, val; + tid | balance | val +-----+---------+------------------------------- + 1 | 1500 | initial not matched by source 2 | 110 | initial updated by merge 2 | 20 | inserted by merge - 4 | 40 | inserted by merge 4 | 330 | initial updated by merge + 4 | 40 | inserted by merge 6 | 550 | initial updated by merge 6 | 60 | inserted by merge - 8 | 80 | inserted by merge 8 | 770 | initial updated by merge + 8 | 80 | inserted by merge 10 | 990 | initial updated by merge 10 | 100 | inserted by merge 12 | 1210 | initial updated by merge 12 | 120 | inserted by merge 14 | 1430 | initial updated by merge 14 | 140 | inserted by merge -(14 rows) +(15 rows) + +ROLLBACK; +-- as above, but blocked by BEFORE DELETE ROW trigger +BEGIN; +CREATE FUNCTION trig_fn() RETURNS trigger LANGUAGE plpgsql AS + $$ BEGIN RETURN NULL; END; $$; +CREATE TRIGGER del_trig BEFORE DELETE ON pa_target + FOR EACH ROW EXECUTE PROCEDURE trig_fn(); +DO $$ +DECLARE + result integer; +BEGIN +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET val = val || ' not matched by source'; +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +NOTICE: ROW_COUNT = 11 +SELECT * FROM pa_target ORDER BY tid, val; + tid | balance | val +-----+---------+------------------------------- + 1 | 100 | initial + 2 | 20 | inserted by merge + 3 | 300 | initial + 4 | 40 | inserted by merge + 6 | 550 | initial updated by merge + 6 | 60 | inserted by merge + 7 | 700 | initial + 8 | 80 | inserted by merge + 9 | 900 | initial + 10 | 100 | inserted by merge + 12 | 1210 | initial updated by merge + 12 | 120 | inserted by merge + 14 | 1430 | initial updated by merge + 14 | 140 | inserted by merge + 15 | 1500 | initial not matched by source +(15 rows) + +ROLLBACK; +-- as above, but blocked by BEFORE INSERT ROW trigger +BEGIN; +CREATE FUNCTION trig_fn() RETURNS trigger LANGUAGE plpgsql AS + $$ BEGIN RETURN NULL; END; $$; +CREATE TRIGGER ins_trig BEFORE INSERT ON pa_target + FOR EACH ROW EXECUTE PROCEDURE trig_fn(); +DO $$ +DECLARE + result integer; +BEGIN +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET val = val || ' not matched by source'; +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +NOTICE: ROW_COUNT = 4 +SELECT * FROM pa_target ORDER BY tid, val; + tid | balance | val +-----+---------+------------------------------- + 6 | 550 | initial updated by merge + 12 | 1210 | initial updated by merge + 14 | 1430 | initial updated by merge + 15 | 1500 | initial not matched by source +(4 rows) ROLLBACK; -- test RLS enforcement @@ -1798,7 +2340,21 @@ MERGE INTO pa_target t WHEN MATCHED THEN UPDATE SET balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (slogts::timestamp, sid, delta, 'inserted by merge'); + INSERT VALUES (slogts::timestamp, sid, delta, 'inserted by merge') + RETURNING merge_action(), t.*; + merge_action | logts | tid | balance | val +--------------+--------------------------+-----+---------+-------------------------- + UPDATE | Tue Jan 31 00:00:00 2017 | 1 | 110 | initial updated by merge + UPDATE | Tue Feb 28 00:00:00 2017 | 2 | 220 | initial updated by merge + INSERT | Sun Jan 15 00:00:00 2017 | 3 | 30 | inserted by merge + UPDATE | Tue Jan 31 00:00:00 2017 | 4 | 440 | initial updated by merge + UPDATE | Tue Feb 28 00:00:00 2017 | 5 | 550 | initial updated by merge + INSERT | Sun Jan 15 00:00:00 2017 | 6 | 60 | inserted by merge + UPDATE | Tue Jan 31 00:00:00 2017 | 7 | 770 | initial updated by merge + UPDATE | Tue Feb 28 00:00:00 2017 | 8 | 880 | initial updated by merge + INSERT | Sun Jan 15 00:00:00 2017 | 9 | 90 | inserted by merge +(9 rows) + SELECT * FROM pa_target ORDER BY tid; logts | tid | balance | val --------------------------+-----+---------+-------------------------- @@ -1829,11 +2385,11 @@ MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid Merge on public.pa_target t Merge on public.pa_targetp t_1 -> Hash Left Join - Output: s.sid, t_1.tableoid, t_1.ctid + Output: s.sid, s.ctid, t_1.tableoid, t_1.ctid Inner Unique: true Hash Cond: (s.sid = t_1.tid) -> Seq Scan on public.pa_source s - Output: s.sid + Output: s.sid, s.ctid -> Hash Output: t_1.tid, t_1.tableoid, t_1.ctid -> Seq Scan on public.pa_targetp t_1 @@ -1859,11 +2415,11 @@ MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid -------------------------------------------- Merge on public.pa_target t -> Hash Left Join - Output: s.sid, t.ctid + Output: s.sid, s.ctid, t.ctid Inner Unique: true Hash Cond: (s.sid = t.tid) -> Seq Scan on public.pa_source s - Output: s.sid + Output: s.sid, s.ctid -> Hash Output: t.tid, t.ctid -> Result @@ -2150,10 +2706,85 @@ DETAIL: drop cascades to table measurement_y2006m02 drop cascades to table measurement_y2006m03 drop cascades to table measurement_y2007m01 DROP FUNCTION measurement_insert_trigger(); +-- +-- test non-strict join clause +-- +CREATE TABLE src (a int, b text); +INSERT INTO src VALUES (1, 'src row'); +CREATE TABLE tgt (a int, b text); +INSERT INTO tgt VALUES (NULL, 'tgt row'); +MERGE INTO tgt USING src ON tgt.a IS NOT DISTINCT FROM src.a + WHEN MATCHED THEN UPDATE SET a = src.a, b = src.b + WHEN NOT MATCHED BY SOURCE THEN DELETE + RETURNING merge_action(), src.*, tgt.*; + merge_action | a | b | a | b +--------------+---+---+---+--------- + DELETE | | | | tgt row +(1 row) + +SELECT * FROM tgt; + a | b +---+--- +(0 rows) + +DROP TABLE src, tgt; +-- +-- test for bug #18634 (wrong varnullingrels error) +-- +CREATE TABLE bug18634t (a int, b int, c text); +INSERT INTO bug18634t VALUES(1, 10, 'tgt1'), (2, 20, 'tgt2'); +CREATE VIEW bug18634v AS + SELECT * FROM bug18634t WHERE EXISTS (SELECT 1 FROM bug18634t); +CREATE TABLE bug18634s (a int, b int, c text); +INSERT INTO bug18634s VALUES (1, 2, 'src1'); +MERGE INTO bug18634v t USING bug18634s s ON s.a = t.a + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED BY SOURCE THEN DELETE + RETURNING merge_action(), s.c, t.*; + merge_action | c | a | b | c +--------------+------+---+----+------ + UPDATE | src1 | 1 | 2 | tgt1 + DELETE | | 2 | 20 | tgt2 +(2 rows) + +SELECT * FROM bug18634t; + a | b | c +---+---+------ + 1 | 2 | tgt1 +(1 row) + +DROP TABLE bug18634t CASCADE; +NOTICE: drop cascades to view bug18634v +DROP TABLE bug18634s; -- prepare RESET SESSION AUTHORIZATION; +-- try a system catalog +MERGE INTO pg_class c +USING (SELECT 'pg_depend'::regclass AS oid) AS j +ON j.oid = c.oid +WHEN MATCHED THEN + UPDATE SET reltuples = reltuples + 1 +RETURNING j.oid; + oid +----------- + pg_depend +(1 row) + +CREATE VIEW classv AS SELECT * FROM pg_class; +MERGE INTO classv c +USING pg_namespace n +ON n.oid = c.relnamespace +WHEN MATCHED AND c.oid = 'pg_depend'::regclass THEN + UPDATE SET reltuples = reltuples - 1 +RETURNING c.oid; + oid +------ + 2608 +(1 row) + DROP TABLE target, target2; DROP TABLE source, source2; DROP FUNCTION merge_trigfunc(); DROP USER regress_merge_privs; DROP USER regress_merge_no_privs; +DROP USER regress_merge_none; diff --git a/src/test/regress/expected/misc_functions.out b/src/test/regress/expected/misc_functions.out index c669948370871..d94056862ae69 100644 --- a/src/test/regress/expected/misc_functions.out +++ b/src/test/regress/expected/misc_functions.out @@ -619,7 +619,7 @@ SELECT count(*) > 0 AS ok FROM pg_control_system(); t (1 row) --- pg_split_walfile_name +-- pg_split_walfile_name, pg_walfile_name & pg_walfile_name_offset SELECT * FROM pg_split_walfile_name(NULL); segment_number | timeline_id ----------------+------------- @@ -642,3 +642,67 @@ SELECT segment_number > 0 AS ok_segment_number, timeline_id t | 4294967295 (1 row) +SELECT setting::int8 AS segment_size +FROM pg_settings +WHERE name = 'wal_segment_size' +\gset +SELECT segment_number, file_offset +FROM pg_walfile_name_offset('0/0'::pg_lsn + :segment_size), + pg_split_walfile_name(file_name); + segment_number | file_offset +----------------+------------- + 1 | 0 +(1 row) + +SELECT segment_number, file_offset +FROM pg_walfile_name_offset('0/0'::pg_lsn + :segment_size + 1), + pg_split_walfile_name(file_name); + segment_number | file_offset +----------------+------------- + 1 | 1 +(1 row) + +SELECT segment_number, file_offset = :segment_size - 1 +FROM pg_walfile_name_offset('0/0'::pg_lsn + :segment_size - 1), + pg_split_walfile_name(file_name); + segment_number | ?column? +----------------+---------- + 0 | t +(1 row) + +-- pg_current_logfile +CREATE ROLE regress_current_logfile; +-- not available by default +SELECT has_function_privilege('regress_current_logfile', + 'pg_current_logfile()', 'EXECUTE'); + has_function_privilege +------------------------ + f +(1 row) + +GRANT pg_monitor TO regress_current_logfile; +-- role has privileges of pg_monitor and can execute the function +SELECT has_function_privilege('regress_current_logfile', + 'pg_current_logfile()', 'EXECUTE'); + has_function_privilege +------------------------ + t +(1 row) + +DROP ROLE regress_current_logfile; +-- pg_column_toast_chunk_id +CREATE TABLE test_chunk_id (a TEXT, b TEXT STORAGE EXTERNAL); +INSERT INTO test_chunk_id VALUES ('x', repeat('x', 8192)); +SELECT t.relname AS toastrel FROM pg_class c + LEFT JOIN pg_class t ON c.reltoastrelid = t.oid + WHERE c.relname = 'test_chunk_id' +\gset +SELECT pg_column_toast_chunk_id(a) IS NULL, + pg_column_toast_chunk_id(b) IN (SELECT chunk_id FROM pg_toast.:toastrel) + FROM test_chunk_id; + ?column? | ?column? +----------+---------- + t | t +(1 row) + +DROP TABLE test_chunk_id; diff --git a/src/test/regress/expected/misc_sanity.out b/src/test/regress/expected/misc_sanity.out index a57fd142a94de..ad88cbd5c4c07 100644 --- a/src/test/regress/expected/misc_sanity.out +++ b/src/test/regress/expected/misc_sanity.out @@ -26,7 +26,7 @@ SELECT * FROM pg_shdepend as d1 WHERE refclassid = 0 OR refobjid = 0 OR classid = 0 OR objid = 0 OR - deptype NOT IN ('a', 'o', 'r', 't'); + deptype NOT IN ('a', 'i', 'o', 'r', 't'); dbid | classid | objid | objsubid | refclassid | refobjid | deptype ------+---------+-------+----------+------------+----------+--------- (0 rows) diff --git a/src/test/regress/expected/money.out b/src/test/regress/expected/money.out index 7fd4e3180436b..cc2ff4d96e80f 100644 --- a/src/test/regress/expected/money.out +++ b/src/test/regress/expected/money.out @@ -528,3 +528,22 @@ SELECT '-92233720368547758.08'::money::numeric; -92233720368547758.08 (1 row) +-- overflow checks +SELECT '92233720368547758.07'::money + '0.01'::money; +ERROR: money out of range +SELECT '-92233720368547758.08'::money - '0.01'::money; +ERROR: money out of range +SELECT '92233720368547758.07'::money * 2::float8; +ERROR: money out of range +SELECT '-1'::money / 1.175494e-38::float4; +ERROR: money out of range +SELECT '92233720368547758.07'::money * 2::int4; +ERROR: money out of range +SELECT '1'::money / 0::int2; +ERROR: division by zero +SELECT '42'::money * 'inf'::float8; +ERROR: money out of range +SELECT '42'::money * '-inf'::float8; +ERROR: money out of range +SELECT '42'::money * 'nan'::float4; +ERROR: money out of range diff --git a/src/test/regress/expected/multirangetypes.out b/src/test/regress/expected/multirangetypes.out index a0cb875492838..c6363ebeb24ca 100644 --- a/src/test/regress/expected/multirangetypes.out +++ b/src/test/regress/expected/multirangetypes.out @@ -3115,6 +3115,36 @@ select _textrange1(textrange2('a','z')) @> 'b'::text; drop type textrange1; drop type textrange2; -- +-- Multiranges don't have their own ownership or permissions. +-- +create type textrange1 as range(subtype=text, multirange_type_name=multitextrange1, collation="C"); +create role regress_multirange_owner; +alter type multitextrange1 owner to regress_multirange_owner; -- fail +ERROR: cannot alter multirange type multitextrange1 +HINT: You can alter type textrange1, which will alter the multirange type as well. +alter type textrange1 owner to regress_multirange_owner; +set role regress_multirange_owner; +revoke usage on type multitextrange1 from public; -- fail +ERROR: cannot set privileges of multirange types +HINT: Set the privileges of the range type instead. +revoke usage on type textrange1 from public; +\dT+ *textrange1* + List of data types + Schema | Name | Internal name | Size | Elements | Owner | Access privileges | Description +--------+-----------------+-----------------+------+----------+--------------------------+-----------------------------------------------------+------------- + public | multitextrange1 | multitextrange1 | var | | regress_multirange_owner | | + public | textrange1 | textrange1 | var | | regress_multirange_owner | regress_multirange_owner=U/regress_multirange_owner | +(2 rows) + +create temp table test1(f1 multitextrange1[]); +revoke usage on type textrange1 from regress_multirange_owner; +create temp table test2(f1 multitextrange1[]); -- fail +ERROR: permission denied for type multitextrange1 +drop table test1; +drop type textrange1; +reset role; +drop role regress_multirange_owner; +-- -- Test polymorphic type system -- create function anyarray_anymultirange_func(a anyarray, r anymultirange) @@ -3273,10 +3303,10 @@ NOTICE: drop cascades to type two_ints_range -- Check behavior when subtype lacks a hash function -- set enable_sort = off; -- try to make it pick a hash setop implementation -select '{(2,5)}'::cashmultirange except select '{(5,6)}'::cashmultirange; - cashmultirange ------------------ - {($2.00,$5.00)} +select '{(01,10)}'::varbitmultirange except select '{(10,11)}'::varbitmultirange; + varbitmultirange +------------------ + {(01,10)} (1 row) reset enable_sort; diff --git a/src/test/regress/expected/namespace.out b/src/test/regress/expected/namespace.out index a62fd8ded015e..dbbda72d3951a 100644 --- a/src/test/regress/expected/namespace.out +++ b/src/test/regress/expected/namespace.out @@ -114,3 +114,47 @@ SELECT COUNT(*) FROM pg_class WHERE relnamespace = 0 (1 row) +-- +-- Verify that search_path is set to a safe value during maintenance +-- commands. +-- +CREATE SCHEMA test_maint_search_path; +SET search_path = test_maint_search_path; +CREATE FUNCTION fn(INT) RETURNS INT IMMUTABLE LANGUAGE plpgsql AS $$ + BEGIN + RAISE NOTICE 'current search_path: %', current_setting('search_path'); + RETURN $1; + END; +$$; +CREATE TABLE test_maint(i INT); +INSERT INTO test_maint VALUES (1), (2); +CREATE MATERIALIZED VIEW test_maint_mv AS SELECT fn(i) FROM test_maint; +NOTICE: current search_path: pg_catalog, pg_temp +NOTICE: current search_path: pg_catalog, pg_temp +-- the following commands should see search_path as pg_catalog, pg_temp +CREATE INDEX test_maint_idx ON test_maint_search_path.test_maint (fn(i)); +NOTICE: current search_path: pg_catalog, pg_temp +NOTICE: current search_path: pg_catalog, pg_temp +REINDEX TABLE test_maint_search_path.test_maint; +NOTICE: current search_path: pg_catalog, pg_temp +NOTICE: current search_path: pg_catalog, pg_temp +ANALYZE test_maint_search_path.test_maint; +NOTICE: current search_path: pg_catalog, pg_temp +NOTICE: current search_path: pg_catalog, pg_temp +VACUUM FULL test_maint_search_path.test_maint; +NOTICE: current search_path: pg_catalog, pg_temp +NOTICE: current search_path: pg_catalog, pg_temp +CLUSTER test_maint_search_path.test_maint USING test_maint_idx; +NOTICE: current search_path: pg_catalog, pg_temp +NOTICE: current search_path: pg_catalog, pg_temp +NOTICE: current search_path: pg_catalog, pg_temp +NOTICE: current search_path: pg_catalog, pg_temp +REFRESH MATERIALIZED VIEW test_maint_search_path.test_maint_mv; +NOTICE: current search_path: pg_catalog, pg_temp +NOTICE: current search_path: pg_catalog, pg_temp +RESET search_path; +DROP SCHEMA test_maint_search_path CASCADE; +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to function test_maint_search_path.fn(integer) +drop cascades to table test_maint_search_path.test_maint +drop cascades to materialized view test_maint_search_path.test_maint_mv diff --git a/src/test/regress/expected/numeric.out b/src/test/regress/expected/numeric.out index 72f03c8a38a49..f30ac236f528d 100644 --- a/src/test/regress/expected/numeric.out +++ b/src/test/regress/expected/numeric.out @@ -1346,6 +1346,108 @@ FROM generate_series(-5,5) AS t(i); 5 | -300000 | -200000 | -100000 | 100000 | 200000 | 300000 (11 rows) +-- Check limits of rounding before the decimal point +SELECT round(4.4e131071, -131071) = 4e131071; + ?column? +---------- + t +(1 row) + +SELECT round(4.5e131071, -131071) = 5e131071; + ?column? +---------- + t +(1 row) + +SELECT round(4.5e131071, -131072); -- loses all digits + round +------- + 0 +(1 row) + +SELECT round(5.5e131071, -131072); -- rounds up and overflows +ERROR: value overflows numeric format +SELECT round(5.5e131071, -131073); -- loses all digits + round +------- + 0 +(1 row) + +SELECT round(5.5e131071, -1000000); -- loses all digits + round +------- + 0 +(1 row) + +-- Check limits of rounding after the decimal point +SELECT round(5e-16383, 1000000) = 5e-16383; + ?column? +---------- + t +(1 row) + +SELECT round(5e-16383, 16383) = 5e-16383; + ?column? +---------- + t +(1 row) + +SELECT round(5e-16383, 16382) = 1e-16382; + ?column? +---------- + t +(1 row) + +SELECT round(5e-16383, 16381) = 0; + ?column? +---------- + t +(1 row) + +-- Check limits of trunc() before the decimal point +SELECT trunc(9.9e131071, -131071) = 9e131071; + ?column? +---------- + t +(1 row) + +SELECT trunc(9.9e131071, -131072); -- loses all digits + trunc +------- + 0 +(1 row) + +SELECT trunc(9.9e131071, -131073); -- loses all digits + trunc +------- + 0 +(1 row) + +SELECT trunc(9.9e131071, -1000000); -- loses all digits + trunc +------- + 0 +(1 row) + +-- Check limits of trunc() after the decimal point +SELECT trunc(5e-16383, 1000000) = 5e-16383; + ?column? +---------- + t +(1 row) + +SELECT trunc(5e-16383, 16383) = 5e-16383; + ?column? +---------- + t +(1 row) + +SELECT trunc(5e-16383, 16382) = 0; + ?column? +---------- + t +(1 row) + -- Testing for width_bucket(). For convenience, we test both the -- numeric and float8 versions of the function in this file. -- errors diff --git a/src/test/regress/expected/numerology.out b/src/test/regress/expected/numerology.out index f662a5050ac00..3512a1d04ce5e 100644 --- a/src/test/regress/expected/numerology.out +++ b/src/test/regress/expected/numerology.out @@ -171,7 +171,7 @@ SELECT -0x8000000000000001; -- error cases SELECT 123abc; -ERROR: trailing junk after numeric literal at or near "123a" +ERROR: trailing junk after numeric literal at or near "123abc" LINE 1: SELECT 123abc; ^ SELECT 0x0o; @@ -297,6 +297,17 @@ SELECT 1_000.5e0_1; 10005 (1 row) +DO $$ +DECLARE + i int; +BEGIN + FOR i IN 1_001..1_003 LOOP + RAISE NOTICE 'i = %', i; + END LOOP; +END $$; +NOTICE: i = 1001 +NOTICE: i = 1002 +NOTICE: i = 1003 -- error cases SELECT _100; ERROR: column "_100" does not exist @@ -307,7 +318,7 @@ ERROR: trailing junk after numeric literal at or near "100_" LINE 1: SELECT 100_; ^ SELECT 100__000; -ERROR: trailing junk after numeric literal at or near "100_" +ERROR: trailing junk after numeric literal at or near "100__000" LINE 1: SELECT 100__000; ^ SELECT _1_000.5; @@ -319,7 +330,7 @@ ERROR: trailing junk after numeric literal at or near "1_000_" LINE 1: SELECT 1_000_.5; ^ SELECT 1_000._5; -ERROR: trailing junk after numeric literal at or near "1_000._" +ERROR: trailing junk after numeric literal at or near "1_000._5" LINE 1: SELECT 1_000._5; ^ SELECT 1_000.5_; @@ -327,9 +338,13 @@ ERROR: trailing junk after numeric literal at or near "1_000.5_" LINE 1: SELECT 1_000.5_; ^ SELECT 1_000.5e_1; -ERROR: trailing junk after numeric literal at or near "1_000.5e" +ERROR: trailing junk after numeric literal at or near "1_000.5e_1" LINE 1: SELECT 1_000.5e_1; ^ +PREPARE p1 AS SELECT $0_1; +ERROR: trailing junk after parameter at or near "$0_1" +LINE 1: PREPARE p1 AS SELECT $0_1; + ^ -- -- Test implicit type conversions -- This fails for Postgres v6.1 (and earlier?) diff --git a/src/test/regress/expected/opr_sanity.out b/src/test/regress/expected/opr_sanity.out index a1bdf2c0b5f81..9d047b21b88ee 100644 --- a/src/test/regress/expected/opr_sanity.out +++ b/src/test/regress/expected/opr_sanity.out @@ -872,6 +872,8 @@ xid8ge(xid8,xid8) xid8eq(xid8,xid8) xid8ne(xid8,xid8) xid8cmp(xid8,xid8) +uuid_extract_timestamp(uuid) +uuid_extract_version(uuid) -- restore normal output mode \a\t -- List of functions used by libpq's fe-lobj.c @@ -1920,7 +1922,7 @@ WHERE p1.oid = a1.amhandler AND a1.amtype = 'i' AND -- Check for table amhandler functions with the wrong signature SELECT a1.oid, a1.amname, p1.oid, p1.proname FROM pg_am AS a1, pg_proc AS p1 -WHERE p1.oid = a1.amhandler AND a1.amtype = 's' AND +WHERE p1.oid = a1.amhandler AND a1.amtype = 't' AND (p1.prorettype != 'table_am_handler'::regtype OR p1.proretset OR p1.pronargs != 1 @@ -2208,6 +2210,7 @@ ORDER BY 1, 2, 3; | array_ops | array_ops | anyarray | float_ops | float4_ops | real | float_ops | float8_ops | double precision + | interval_ops | interval_ops | interval | jsonb_ops | jsonb_ops | jsonb | multirange_ops | multirange_ops | anymultirange | numeric_ops | numeric_ops | numeric @@ -2216,7 +2219,7 @@ ORDER BY 1, 2, 3; | record_ops | record_ops | record | tsquery_ops | tsquery_ops | tsquery | tsvector_ops | tsvector_ops | tsvector -(15 rows) +(16 rows) -- **************** pg_index **************** -- Look for illegal values in pg_index fields. diff --git a/src/test/regress/expected/partition_aggregate.out b/src/test/regress/expected/partition_aggregate.out index 1b900fddf8ea5..5f2c0cf5786e3 100644 --- a/src/test/regress/expected/partition_aggregate.out +++ b/src/test/regress/expected/partition_aggregate.out @@ -901,15 +901,15 @@ SELECT a, c, sum(b), avg(c), count(*) FROM pagg_tab_m GROUP BY (a+b)/2, 2, 1 HAV Sort Key: pagg_tab_m.a, pagg_tab_m.c, (sum(pagg_tab_m.b)) -> Append -> HashAggregate - Group Key: ((pagg_tab_m.a + pagg_tab_m.b) / 2), pagg_tab_m.c, pagg_tab_m.a + Group Key: pagg_tab_m.a, pagg_tab_m.c, ((pagg_tab_m.a + pagg_tab_m.b) / 2) Filter: ((sum(pagg_tab_m.b) = 50) AND (avg(pagg_tab_m.c) > '25'::numeric)) -> Seq Scan on pagg_tab_m_p1 pagg_tab_m -> HashAggregate - Group Key: ((pagg_tab_m_1.a + pagg_tab_m_1.b) / 2), pagg_tab_m_1.c, pagg_tab_m_1.a + Group Key: pagg_tab_m_1.a, pagg_tab_m_1.c, ((pagg_tab_m_1.a + pagg_tab_m_1.b) / 2) Filter: ((sum(pagg_tab_m_1.b) = 50) AND (avg(pagg_tab_m_1.c) > '25'::numeric)) -> Seq Scan on pagg_tab_m_p2 pagg_tab_m_1 -> HashAggregate - Group Key: ((pagg_tab_m_2.a + pagg_tab_m_2.b) / 2), pagg_tab_m_2.c, pagg_tab_m_2.a + Group Key: pagg_tab_m_2.a, pagg_tab_m_2.c, ((pagg_tab_m_2.a + pagg_tab_m_2.b) / 2) Filter: ((sum(pagg_tab_m_2.b) = 50) AND (avg(pagg_tab_m_2.c) > '25'::numeric)) -> Seq Scan on pagg_tab_m_p3 pagg_tab_m_2 (15 rows) diff --git a/src/test/regress/expected/partition_join.out b/src/test/regress/expected/partition_join.out index 762cc8e53b013..b9b41340663e1 100644 --- a/src/test/regress/expected/partition_join.out +++ b/src/test/regress/expected/partition_join.out @@ -62,6 +62,52 @@ SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.b = 450 | 0450 | 450 | 0450 (4 rows) +-- left outer join, 3-way +EXPLAIN (COSTS OFF) +SELECT COUNT(*) FROM prt1 t1 + LEFT JOIN prt1 t2 ON t1.a = t2.a + LEFT JOIN prt1 t3 ON t2.a = t3.a; + QUERY PLAN +-------------------------------------------------------- + Aggregate + -> Append + -> Hash Left Join + Hash Cond: (t2_1.a = t3_1.a) + -> Hash Left Join + Hash Cond: (t1_1.a = t2_1.a) + -> Seq Scan on prt1_p1 t1_1 + -> Hash + -> Seq Scan on prt1_p1 t2_1 + -> Hash + -> Seq Scan on prt1_p1 t3_1 + -> Hash Left Join + Hash Cond: (t2_2.a = t3_2.a) + -> Hash Left Join + Hash Cond: (t1_2.a = t2_2.a) + -> Seq Scan on prt1_p2 t1_2 + -> Hash + -> Seq Scan on prt1_p2 t2_2 + -> Hash + -> Seq Scan on prt1_p2 t3_2 + -> Hash Left Join + Hash Cond: (t2_3.a = t3_3.a) + -> Hash Left Join + Hash Cond: (t1_3.a = t2_3.a) + -> Seq Scan on prt1_p3 t1_3 + -> Hash + -> Seq Scan on prt1_p3 t2_3 + -> Hash + -> Seq Scan on prt1_p3 t3_3 +(29 rows) + +SELECT COUNT(*) FROM prt1 t1 + LEFT JOIN prt1 t2 ON t1.a = t2.a + LEFT JOIN prt1 t3 ON t2.a = t3.a; + count +------- + 300 +(1 row) + -- left outer join, with whole-row reference; partitionwise join does not apply EXPLAIN (COSTS OFF) SELECT t1, t2 FROM prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; @@ -459,6 +505,98 @@ SELECT t1.a, ss.t2a, ss.t2c FROM prt1 t1 LEFT JOIN LATERAL 550 | | (12 rows) +-- lateral reference in sample scan +EXPLAIN (COSTS OFF) +SELECT * FROM prt1 t1 JOIN LATERAL + (SELECT * FROM prt1 t2 TABLESAMPLE SYSTEM (t1.a) REPEATABLE(t1.b)) s + ON t1.a = s.a; + QUERY PLAN +------------------------------------------------------------- + Append + -> Nested Loop + -> Seq Scan on prt1_p1 t1_1 + -> Sample Scan on prt1_p1 t2_1 + Sampling: system (t1_1.a) REPEATABLE (t1_1.b) + Filter: (t1_1.a = a) + -> Nested Loop + -> Seq Scan on prt1_p2 t1_2 + -> Sample Scan on prt1_p2 t2_2 + Sampling: system (t1_2.a) REPEATABLE (t1_2.b) + Filter: (t1_2.a = a) + -> Nested Loop + -> Seq Scan on prt1_p3 t1_3 + -> Sample Scan on prt1_p3 t2_3 + Sampling: system (t1_3.a) REPEATABLE (t1_3.b) + Filter: (t1_3.a = a) +(16 rows) + +-- lateral reference in scan's restriction clauses +EXPLAIN (COSTS OFF) +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.a; + QUERY PLAN +--------------------------------------------------------------- + Aggregate + -> Append + -> Nested Loop + -> Seq Scan on prt1_p1 t1_1 + -> Index Scan using iprt2_p1_b on prt2_p1 t2_1 + Index Cond: (b = t1_1.a) + Filter: (t1_1.b = a) + -> Nested Loop + -> Seq Scan on prt1_p2 t1_2 + -> Index Scan using iprt2_p2_b on prt2_p2 t2_2 + Index Cond: (b = t1_2.a) + Filter: (t1_2.b = a) + -> Nested Loop + -> Seq Scan on prt1_p3 t1_3 + -> Index Scan using iprt2_p3_b on prt2_p3 t2_3 + Index Cond: (b = t1_3.a) + Filter: (t1_3.b = a) +(17 rows) + +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.a; + count +------- + 100 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.b; + QUERY PLAN +-------------------------------------------------------------------- + Aggregate + -> Append + -> Nested Loop + -> Seq Scan on prt1_p1 t1_1 + -> Index Only Scan using iprt2_p1_b on prt2_p1 t2_1 + Index Cond: (b = t1_1.a) + Filter: (b = t1_1.b) + -> Nested Loop + -> Seq Scan on prt1_p2 t1_2 + -> Index Only Scan using iprt2_p2_b on prt2_p2 t2_2 + Index Cond: (b = t1_2.a) + Filter: (b = t1_2.b) + -> Nested Loop + -> Seq Scan on prt1_p3 t1_3 + -> Index Only Scan using iprt2_p3_b on prt2_p3 t2_3 + Index Cond: (b = t1_3.a) + Filter: (b = t1_3.b) +(17 rows) + +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.b; + count +------- + 5 +(1 row) + -- bug with inadequate sort key representation SET enable_partitionwise_aggregate TO true; SET enable_hashjoin TO false; @@ -536,6 +674,41 @@ SELECT a, b FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) RESET enable_partitionwise_aggregate; RESET enable_hashjoin; +-- bug in freeing the SpecialJoinInfo of a child-join +EXPLAIN (COSTS OFF) +SELECT * FROM prt1 t1 JOIN prt1 t2 ON t1.a = t2.a WHERE t1.a IN (SELECT a FROM prt1 t3); + QUERY PLAN +-------------------------------------------------- + Append + -> Hash Semi Join + Hash Cond: (t1_1.a = t3_1.a) + -> Hash Join + Hash Cond: (t1_1.a = t2_1.a) + -> Seq Scan on prt1_p1 t1_1 + -> Hash + -> Seq Scan on prt1_p1 t2_1 + -> Hash + -> Seq Scan on prt1_p1 t3_1 + -> Hash Semi Join + Hash Cond: (t1_2.a = t3_2.a) + -> Hash Join + Hash Cond: (t1_2.a = t2_2.a) + -> Seq Scan on prt1_p2 t1_2 + -> Hash + -> Seq Scan on prt1_p2 t2_2 + -> Hash + -> Seq Scan on prt1_p2 t3_2 + -> Hash Semi Join + Hash Cond: (t1_3.a = t3_3.a) + -> Hash Join + Hash Cond: (t1_3.a = t2_3.a) + -> Seq Scan on prt1_p3 t1_3 + -> Hash + -> Seq Scan on prt1_p3 t2_3 + -> Hash + -> Seq Scan on prt1_p3 t3_3 +(28 rows) + -- -- partitioned by expression -- @@ -1898,6 +2071,82 @@ SELECT * FROM prt1_l t1 LEFT JOIN LATERAL 550 | 0 | 0002 | | | | | (12 rows) +-- partitionwise join with lateral reference in sample scan +EXPLAIN (COSTS OFF) +SELECT * FROM prt1_l t1 JOIN LATERAL + (SELECT * FROM prt1_l t2 TABLESAMPLE SYSTEM (t1.a) REPEATABLE(t1.b)) s + ON t1.a = s.a AND t1.b = s.b AND t1.c = s.c; + QUERY PLAN +---------------------------------------------------------------------------------------- + Append + -> Nested Loop + -> Seq Scan on prt1_l_p1 t1_1 + -> Sample Scan on prt1_l_p1 t2_1 + Sampling: system (t1_1.a) REPEATABLE (t1_1.b) + Filter: ((t1_1.a = a) AND (t1_1.b = b) AND ((t1_1.c)::text = (c)::text)) + -> Nested Loop + -> Seq Scan on prt1_l_p2_p1 t1_2 + -> Sample Scan on prt1_l_p2_p1 t2_2 + Sampling: system (t1_2.a) REPEATABLE (t1_2.b) + Filter: ((t1_2.a = a) AND (t1_2.b = b) AND ((t1_2.c)::text = (c)::text)) + -> Nested Loop + -> Seq Scan on prt1_l_p2_p2 t1_3 + -> Sample Scan on prt1_l_p2_p2 t2_3 + Sampling: system (t1_3.a) REPEATABLE (t1_3.b) + Filter: ((t1_3.a = a) AND (t1_3.b = b) AND ((t1_3.c)::text = (c)::text)) + -> Nested Loop + -> Seq Scan on prt1_l_p3_p1 t1_4 + -> Sample Scan on prt1_l_p3_p1 t2_4 + Sampling: system (t1_4.a) REPEATABLE (t1_4.b) + Filter: ((t1_4.a = a) AND (t1_4.b = b) AND ((t1_4.c)::text = (c)::text)) + -> Nested Loop + -> Seq Scan on prt1_l_p3_p2 t1_5 + -> Sample Scan on prt1_l_p3_p2 t2_5 + Sampling: system (t1_5.a) REPEATABLE (t1_5.b) + Filter: ((t1_5.a = a) AND (t1_5.b = b) AND ((t1_5.c)::text = (c)::text)) +(26 rows) + +-- partitionwise join with lateral reference in scan's restriction clauses +EXPLAIN (COSTS OFF) +SELECT COUNT(*) FROM prt1_l t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2_l t2) s + ON t1.a = s.b AND t1.b = s.a AND t1.c = s.c + WHERE s.t1b = s.a; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------- + Aggregate + -> Append + -> Nested Loop + -> Seq Scan on prt1_l_p1 t1_1 + -> Seq Scan on prt2_l_p1 t2_1 + Filter: ((a = t1_1.b) AND (t1_1.a = b) AND (t1_1.b = a) AND ((t1_1.c)::text = (c)::text)) + -> Nested Loop + -> Seq Scan on prt1_l_p2_p1 t1_2 + -> Seq Scan on prt2_l_p2_p1 t2_2 + Filter: ((a = t1_2.b) AND (t1_2.a = b) AND (t1_2.b = a) AND ((t1_2.c)::text = (c)::text)) + -> Nested Loop + -> Seq Scan on prt1_l_p2_p2 t1_3 + -> Seq Scan on prt2_l_p2_p2 t2_3 + Filter: ((a = t1_3.b) AND (t1_3.a = b) AND (t1_3.b = a) AND ((t1_3.c)::text = (c)::text)) + -> Nested Loop + -> Seq Scan on prt1_l_p3_p1 t1_4 + -> Seq Scan on prt2_l_p3_p1 t2_4 + Filter: ((a = t1_4.b) AND (t1_4.a = b) AND (t1_4.b = a) AND ((t1_4.c)::text = (c)::text)) + -> Nested Loop + -> Seq Scan on prt1_l_p3_p2 t1_5 + -> Seq Scan on prt2_l_p3_p2 t2_5 + Filter: ((a = t1_5.b) AND (t1_5.a = b) AND (t1_5.b = a) AND ((t1_5.c)::text = (c)::text)) +(22 rows) + +SELECT COUNT(*) FROM prt1_l t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2_l t2) s + ON t1.a = s.b AND t1.b = s.a AND t1.c = s.c + WHERE s.t1b = s.a; + count +------- + 100 +(1 row) + -- join with one side empty EXPLAIN (COSTS OFF) SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_l WHERE a = 1 AND a = 2) t1 RIGHT JOIN prt2_l t2 ON t1.a = t2.b AND t1.b = t2.a AND t1.c = t2.c; diff --git a/src/test/regress/expected/partition_prune.out b/src/test/regress/expected/partition_prune.out index 2abf759385860..e202898fbcc69 100644 --- a/src/test/regress/expected/partition_prune.out +++ b/src/test/regress/expected/partition_prune.out @@ -1093,16 +1093,11 @@ explain (costs off) select * from boolpart where a is not true and a is not fals (2 rows) explain (costs off) select * from boolpart where a is unknown; - QUERY PLAN ------------------------------------------------ - Append - -> Seq Scan on boolpart_f boolpart_1 - Filter: (a IS UNKNOWN) - -> Seq Scan on boolpart_t boolpart_2 - Filter: (a IS UNKNOWN) - -> Seq Scan on boolpart_default boolpart_3 - Filter: (a IS UNKNOWN) -(7 rows) + QUERY PLAN +--------------------------------------- + Seq Scan on boolpart_default boolpart + Filter: (a IS UNKNOWN) +(2 rows) explain (costs off) select * from boolpart where a is not unknown; QUERY PLAN @@ -1169,6 +1164,98 @@ select * from boolpart where a is not unknown; t (2 rows) +-- try some other permutations with a NULL partition instead of a DEFAULT +delete from boolpart where a is null; +create table boolpart_null partition of boolpart for values in (null); +insert into boolpart values(null); +explain (costs off) select * from boolpart where a is not true; + QUERY PLAN +-------------------------------------------- + Append + -> Seq Scan on boolpart_f boolpart_1 + Filter: (a IS NOT TRUE) + -> Seq Scan on boolpart_null boolpart_2 + Filter: (a IS NOT TRUE) +(5 rows) + +explain (costs off) select * from boolpart where a is not true and a is not false; + QUERY PLAN +-------------------------------------------------- + Seq Scan on boolpart_null boolpart + Filter: ((a IS NOT TRUE) AND (a IS NOT FALSE)) +(2 rows) + +explain (costs off) select * from boolpart where a is not false; + QUERY PLAN +-------------------------------------------- + Append + -> Seq Scan on boolpart_t boolpart_1 + Filter: (a IS NOT FALSE) + -> Seq Scan on boolpart_null boolpart_2 + Filter: (a IS NOT FALSE) +(5 rows) + +explain (costs off) select * from boolpart where a is not unknown; + QUERY PLAN +----------------------------------------------- + Append + -> Seq Scan on boolpart_f boolpart_1 + Filter: (a IS NOT UNKNOWN) + -> Seq Scan on boolpart_t boolpart_2 + Filter: (a IS NOT UNKNOWN) + -> Seq Scan on boolpart_default boolpart_3 + Filter: (a IS NOT UNKNOWN) +(7 rows) + +select * from boolpart where a is not true; + a +--- + f + +(2 rows) + +select * from boolpart where a is not true and a is not false; + a +--- + +(1 row) + +select * from boolpart where a is not false; + a +--- + t + +(2 rows) + +select * from boolpart where a is not unknown; + a +--- + f + t +(2 rows) + +-- check that all partitions are pruned when faced with conflicting clauses +explain (costs off) select * from boolpart where a is not unknown and a is unknown; + QUERY PLAN +-------------------------- + Result + One-Time Filter: false +(2 rows) + +explain (costs off) select * from boolpart where a is false and a is unknown; + QUERY PLAN +-------------------------- + Result + One-Time Filter: false +(2 rows) + +explain (costs off) select * from boolpart where a is true and a is unknown; + QUERY PLAN +-------------------------- + Result + One-Time Filter: false +(2 rows) + -- inverse boolean partitioning - a seemingly unlikely design, but we've got -- code for it, so we'd better test it. create table iboolpart (a bool) partition by list ((not a)); @@ -1315,11 +1402,37 @@ select * from iboolpart where a is not unknown; f (2 rows) +-- Try some other permutations with a NULL partition instead of a DEFAULT +delete from iboolpart where a is null; +create table iboolpart_null partition of iboolpart for values in (null); +insert into iboolpart values(null); +-- Pruning shouldn't take place for these. Just check the result is correct +select * from iboolpart where a is not true; + a +--- + f + +(2 rows) + +select * from iboolpart where a is not true and a is not false; + a +--- + +(1 row) + +select * from iboolpart where a is not false; + a +--- + t + +(2 rows) + create table boolrangep (a bool, b bool, c int) partition by range (a,b,c); create table boolrangep_tf partition of boolrangep for values from ('true', 'false', 0) to ('true', 'false', 100); create table boolrangep_ft partition of boolrangep for values from ('false', 'true', 0) to ('false', 'true', 100); create table boolrangep_ff1 partition of boolrangep for values from ('false', 'false', 0) to ('false', 'false', 50); create table boolrangep_ff2 partition of boolrangep for values from ('false', 'false', 50) to ('false', 'false', 100); +create table boolrangep_null partition of boolrangep default; -- try a more complex case that's been known to trip up pruning in the past explain (costs off) select * from boolrangep where not a and not b and c = 25; QUERY PLAN @@ -1328,6 +1441,32 @@ explain (costs off) select * from boolrangep where not a and not b and c = 25; Filter: ((NOT a) AND (NOT b) AND (c = 25)) (2 rows) +-- ensure we prune boolrangep_tf +explain (costs off) select * from boolrangep where a is not true and not b and c = 25; + QUERY PLAN +------------------------------------------------------------ + Append + -> Seq Scan on boolrangep_ff1 boolrangep_1 + Filter: ((a IS NOT TRUE) AND (NOT b) AND (c = 25)) + -> Seq Scan on boolrangep_ff2 boolrangep_2 + Filter: ((a IS NOT TRUE) AND (NOT b) AND (c = 25)) + -> Seq Scan on boolrangep_ft boolrangep_3 + Filter: ((a IS NOT TRUE) AND (NOT b) AND (c = 25)) + -> Seq Scan on boolrangep_null boolrangep_4 + Filter: ((a IS NOT TRUE) AND (NOT b) AND (c = 25)) +(9 rows) + +-- ensure we prune everything apart from boolrangep_tf and boolrangep_null +explain (costs off) select * from boolrangep where a is not false and not b and c = 25; + QUERY PLAN +------------------------------------------------------------- + Append + -> Seq Scan on boolrangep_tf boolrangep_1 + Filter: ((a IS NOT FALSE) AND (NOT b) AND (c = 25)) + -> Seq Scan on boolrangep_null boolrangep_2 + Filter: ((a IS NOT FALSE) AND (NOT b) AND (c = 25)) +(5 rows) + -- test scalar-to-array operators create table coercepart (a varchar) partition by list (a); create table coercepart_ab partition of coercepart for values in ('ab'); @@ -1736,12 +1875,41 @@ explain (costs off) select * from rparted_by_int2 where a > 100_000_000_000_000; (2 rows) drop table lp, coll_pruning, rlp, mc3p, mc2p, boolpart, iboolpart, boolrangep, rp, coll_pruning_multi, like_op_noprune, lparted_by_int2, rparted_by_int2; +-- check that AlternativeSubPlan within a pruning expression gets cleaned up +create table asptab (id int primary key) partition by range (id); +create table asptab0 partition of asptab for values from (0) to (1); +create table asptab1 partition of asptab for values from (1) to (2); +explain (costs off) +select * from + (select exists (select 1 from int4_tbl tinner where f1 = touter.f1) as b + from int4_tbl touter) ss, + asptab +where asptab.id > ss.b::int; + QUERY PLAN +-------------------------------------------------------------------- + Nested Loop + -> Seq Scan on int4_tbl touter + -> Append + -> Index Only Scan using asptab0_pkey on asptab0 asptab_1 + Index Cond: (id > (EXISTS(SubPlan 3))::integer) + SubPlan 4 + -> Seq Scan on int4_tbl tinner_2 + -> Index Only Scan using asptab1_pkey on asptab1 asptab_2 + Index Cond: (id > (EXISTS(SubPlan 3))::integer) + SubPlan 3 + -> Seq Scan on int4_tbl tinner_1 + Filter: (f1 = touter.f1) + SubPlan 2 + -> Seq Scan on int4_tbl tinner +(14 rows) + +drop table asptab; -- -- Test Partition pruning for HASH partitioning -- -- Use hand-rolled hash functions and operator classes to get predictable -- result on different machines. See the definitions of --- part_part_test_int4_ops and part_test_text_ops in insert.sql. +-- part_test_int4_ops and part_test_text_ops in test_setup.sql. -- create table hp (a int, b text, c int) partition by hash (a part_test_int4_ops, b part_test_text_ops); @@ -1948,7 +2116,6 @@ explain (costs off) select * from hp where a = 1 and b = 'abcde' and One-Time Filter: false (2 rows) -drop table hp; -- -- Test runtime partition pruning -- @@ -2038,38 +2205,59 @@ explain (analyze, costs off, summary off, timing off) execute ab_q1 (2, 4); prepare ab_q2 (int, int) as select a from ab where a between $1 and $2 and b < (select 3); explain (analyze, costs off, summary off, timing off) execute ab_q2 (2, 2); - QUERY PLAN ---------------------------------------------------------- + QUERY PLAN +----------------------------------------------------------------------- Append (actual rows=0 loops=1) Subplans Removed: 6 - InitPlan 1 (returns $0) + InitPlan 1 -> Result (actual rows=1 loops=1) -> Seq Scan on ab_a2_b1 ab_1 (actual rows=0 loops=1) - Filter: ((a >= $1) AND (a <= $2) AND (b < $0)) + Filter: ((a >= $1) AND (a <= $2) AND (b < (InitPlan 1).col1)) -> Seq Scan on ab_a2_b2 ab_2 (actual rows=0 loops=1) - Filter: ((a >= $1) AND (a <= $2) AND (b < $0)) + Filter: ((a >= $1) AND (a <= $2) AND (b < (InitPlan 1).col1)) -> Seq Scan on ab_a2_b3 ab_3 (never executed) - Filter: ((a >= $1) AND (a <= $2) AND (b < $0)) + Filter: ((a >= $1) AND (a <= $2) AND (b < (InitPlan 1).col1)) (10 rows) -- As above, but swap the PARAM_EXEC Param to the first partition level prepare ab_q3 (int, int) as select a from ab where b between $1 and $2 and a < (select 3); explain (analyze, costs off, summary off, timing off) execute ab_q3 (2, 2); - QUERY PLAN ---------------------------------------------------------- + QUERY PLAN +----------------------------------------------------------------------- Append (actual rows=0 loops=1) Subplans Removed: 6 - InitPlan 1 (returns $0) + InitPlan 1 -> Result (actual rows=1 loops=1) -> Seq Scan on ab_a1_b2 ab_1 (actual rows=0 loops=1) - Filter: ((b >= $1) AND (b <= $2) AND (a < $0)) + Filter: ((b >= $1) AND (b <= $2) AND (a < (InitPlan 1).col1)) -> Seq Scan on ab_a2_b2 ab_2 (actual rows=0 loops=1) - Filter: ((b >= $1) AND (b <= $2) AND (a < $0)) + Filter: ((b >= $1) AND (b <= $2) AND (a < (InitPlan 1).col1)) -> Seq Scan on ab_a3_b2 ab_3 (never executed) - Filter: ((b >= $1) AND (b <= $2) AND (a < $0)) + Filter: ((b >= $1) AND (b <= $2) AND (a < (InitPlan 1).col1)) (10 rows) +-- +-- Test runtime pruning with hash partitioned tables +-- +-- recreate partitions dropped above +create table hp1 partition of hp for values with (modulus 4, remainder 1); +create table hp2 partition of hp for values with (modulus 4, remainder 2); +create table hp3 partition of hp for values with (modulus 4, remainder 3); +-- Ensure we correctly prune unneeded partitions when there is an IS NULL qual +prepare hp_q1 (text) as +select * from hp where a is null and b = $1; +explain (costs off) execute hp_q1('xxx'); + QUERY PLAN +-------------------------------------------- + Append + Subplans Removed: 3 + -> Seq Scan on hp2 hp_1 + Filter: ((a IS NULL) AND (b = $1)) +(4 rows) + +deallocate hp_q1; +drop table hp; -- Test a backwards Append scan create table list_part (a int) partition by list (a); create table list_part1 partition of list_part for values in (1); @@ -2252,25 +2440,24 @@ select explain_parallel_append('execute ab_q5 (33, 44, 55)'); -- Test Parallel Append with PARAM_EXEC Params select explain_parallel_append('select count(*) from ab where (a = (select 1) or a = (select 3)) and b = 2'); - explain_parallel_append ------------------------------------------------------------------------------- + explain_parallel_append +------------------------------------------------------------------------------------------------ Aggregate (actual rows=N loops=N) - InitPlan 1 (returns $0) + InitPlan 1 -> Result (actual rows=N loops=N) - InitPlan 2 (returns $1) + InitPlan 2 -> Result (actual rows=N loops=N) -> Gather (actual rows=N loops=N) Workers Planned: 2 - Params Evaluated: $0, $1 Workers Launched: N -> Parallel Append (actual rows=N loops=N) -> Parallel Seq Scan on ab_a1_b2 ab_1 (actual rows=N loops=N) - Filter: ((b = 2) AND ((a = $0) OR (a = $1))) + Filter: ((b = 2) AND ((a = (InitPlan 1).col1) OR (a = (InitPlan 2).col1))) -> Parallel Seq Scan on ab_a2_b2 ab_2 (never executed) - Filter: ((b = 2) AND ((a = $0) OR (a = $1))) + Filter: ((b = 2) AND ((a = (InitPlan 1).col1) OR (a = (InitPlan 2).col1))) -> Parallel Seq Scan on ab_a3_b2 ab_3 (actual rows=N loops=N) - Filter: ((b = 2) AND ((a = $0) OR (a = $1))) -(16 rows) + Filter: ((b = 2) AND ((a = (InitPlan 1).col1) OR (a = (InitPlan 2).col1))) +(15 rows) -- Test pruning during parallel nested loop query create table lprt_a (a int not null); @@ -2470,57 +2657,57 @@ select * from ab where a = (select max(a) from lprt_a) and b = (select max(a)-1 QUERY PLAN ------------------------------------------------------------------------- Append (actual rows=0 loops=1) - InitPlan 1 (returns $0) + InitPlan 1 -> Aggregate (actual rows=1 loops=1) -> Seq Scan on lprt_a (actual rows=102 loops=1) - InitPlan 2 (returns $1) + InitPlan 2 -> Aggregate (actual rows=1 loops=1) -> Seq Scan on lprt_a lprt_a_1 (actual rows=102 loops=1) -> Bitmap Heap Scan on ab_a1_b1 ab_1 (never executed) - Recheck Cond: (a = $0) - Filter: (b = $1) + Recheck Cond: (a = (InitPlan 1).col1) + Filter: (b = (InitPlan 2).col1) -> Bitmap Index Scan on ab_a1_b1_a_idx (never executed) - Index Cond: (a = $0) + Index Cond: (a = (InitPlan 1).col1) -> Bitmap Heap Scan on ab_a1_b2 ab_2 (never executed) - Recheck Cond: (a = $0) - Filter: (b = $1) + Recheck Cond: (a = (InitPlan 1).col1) + Filter: (b = (InitPlan 2).col1) -> Bitmap Index Scan on ab_a1_b2_a_idx (never executed) - Index Cond: (a = $0) + Index Cond: (a = (InitPlan 1).col1) -> Bitmap Heap Scan on ab_a1_b3 ab_3 (never executed) - Recheck Cond: (a = $0) - Filter: (b = $1) + Recheck Cond: (a = (InitPlan 1).col1) + Filter: (b = (InitPlan 2).col1) -> Bitmap Index Scan on ab_a1_b3_a_idx (never executed) - Index Cond: (a = $0) + Index Cond: (a = (InitPlan 1).col1) -> Bitmap Heap Scan on ab_a2_b1 ab_4 (never executed) - Recheck Cond: (a = $0) - Filter: (b = $1) + Recheck Cond: (a = (InitPlan 1).col1) + Filter: (b = (InitPlan 2).col1) -> Bitmap Index Scan on ab_a2_b1_a_idx (never executed) - Index Cond: (a = $0) + Index Cond: (a = (InitPlan 1).col1) -> Bitmap Heap Scan on ab_a2_b2 ab_5 (never executed) - Recheck Cond: (a = $0) - Filter: (b = $1) + Recheck Cond: (a = (InitPlan 1).col1) + Filter: (b = (InitPlan 2).col1) -> Bitmap Index Scan on ab_a2_b2_a_idx (never executed) - Index Cond: (a = $0) + Index Cond: (a = (InitPlan 1).col1) -> Bitmap Heap Scan on ab_a2_b3 ab_6 (never executed) - Recheck Cond: (a = $0) - Filter: (b = $1) + Recheck Cond: (a = (InitPlan 1).col1) + Filter: (b = (InitPlan 2).col1) -> Bitmap Index Scan on ab_a2_b3_a_idx (never executed) - Index Cond: (a = $0) + Index Cond: (a = (InitPlan 1).col1) -> Bitmap Heap Scan on ab_a3_b1 ab_7 (never executed) - Recheck Cond: (a = $0) - Filter: (b = $1) + Recheck Cond: (a = (InitPlan 1).col1) + Filter: (b = (InitPlan 2).col1) -> Bitmap Index Scan on ab_a3_b1_a_idx (never executed) - Index Cond: (a = $0) + Index Cond: (a = (InitPlan 1).col1) -> Bitmap Heap Scan on ab_a3_b2 ab_8 (actual rows=0 loops=1) - Recheck Cond: (a = $0) - Filter: (b = $1) + Recheck Cond: (a = (InitPlan 1).col1) + Filter: (b = (InitPlan 2).col1) -> Bitmap Index Scan on ab_a3_b2_a_idx (actual rows=0 loops=1) - Index Cond: (a = $0) + Index Cond: (a = (InitPlan 1).col1) -> Bitmap Heap Scan on ab_a3_b3 ab_9 (never executed) - Recheck Cond: (a = $0) - Filter: (b = $1) + Recheck Cond: (a = (InitPlan 1).col1) + Filter: (b = (InitPlan 2).col1) -> Bitmap Index Scan on ab_a3_b3_a_idx (never executed) - Index Cond: (a = $0) + Index Cond: (a = (InitPlan 1).col1) (52 rows) -- Test run-time partition pruning with UNION ALL parents @@ -2529,42 +2716,42 @@ select * from (select * from ab where a = 1 union all select * from ab) ab where QUERY PLAN ------------------------------------------------------------------------------- Append (actual rows=0 loops=1) - InitPlan 1 (returns $0) + InitPlan 1 -> Result (actual rows=1 loops=1) -> Append (actual rows=0 loops=1) -> Bitmap Heap Scan on ab_a1_b1 ab_11 (actual rows=0 loops=1) Recheck Cond: (a = 1) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=0 loops=1) Index Cond: (a = 1) -> Bitmap Heap Scan on ab_a1_b2 ab_12 (never executed) Recheck Cond: (a = 1) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Bitmap Index Scan on ab_a1_b2_a_idx (never executed) Index Cond: (a = 1) -> Bitmap Heap Scan on ab_a1_b3 ab_13 (never executed) Recheck Cond: (a = 1) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Bitmap Index Scan on ab_a1_b3_a_idx (never executed) Index Cond: (a = 1) -> Seq Scan on ab_a1_b1 ab_1 (actual rows=0 loops=1) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a1_b2 ab_2 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a1_b3 ab_3 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a2_b1 ab_4 (actual rows=0 loops=1) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a2_b2 ab_5 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a2_b3 ab_6 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a3_b1 ab_7 (actual rows=0 loops=1) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a3_b2 ab_8 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a3_b3 ab_9 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) (37 rows) -- A case containing a UNION ALL with a non-partitioned child. @@ -2573,44 +2760,44 @@ select * from (select * from ab where a = 1 union all (values(10,5)) union all s QUERY PLAN ------------------------------------------------------------------------------- Append (actual rows=0 loops=1) - InitPlan 1 (returns $0) + InitPlan 1 -> Result (actual rows=1 loops=1) -> Append (actual rows=0 loops=1) -> Bitmap Heap Scan on ab_a1_b1 ab_11 (actual rows=0 loops=1) Recheck Cond: (a = 1) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Bitmap Index Scan on ab_a1_b1_a_idx (actual rows=0 loops=1) Index Cond: (a = 1) -> Bitmap Heap Scan on ab_a1_b2 ab_12 (never executed) Recheck Cond: (a = 1) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Bitmap Index Scan on ab_a1_b2_a_idx (never executed) Index Cond: (a = 1) -> Bitmap Heap Scan on ab_a1_b3 ab_13 (never executed) Recheck Cond: (a = 1) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Bitmap Index Scan on ab_a1_b3_a_idx (never executed) Index Cond: (a = 1) -> Result (actual rows=0 loops=1) - One-Time Filter: (5 = $0) + One-Time Filter: (5 = (InitPlan 1).col1) -> Seq Scan on ab_a1_b1 ab_1 (actual rows=0 loops=1) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a1_b2 ab_2 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a1_b3 ab_3 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a2_b1 ab_4 (actual rows=0 loops=1) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a2_b2 ab_5 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a2_b3 ab_6 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a3_b1 ab_7 (actual rows=0 loops=1) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a3_b2 ab_8 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a3_b3 ab_9 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) (39 rows) -- Another UNION ALL test, but containing a mix of exec init and exec run-time pruning. @@ -2628,27 +2815,27 @@ union all ) ab where a = $1 and b = (select -10); -- Ensure the xy_1 subplan is not pruned. explain (analyze, costs off, summary off, timing off) execute ab_q6(1); - QUERY PLAN --------------------------------------------------- + QUERY PLAN +-------------------------------------------------------- Append (actual rows=0 loops=1) Subplans Removed: 12 - InitPlan 1 (returns $0) + InitPlan 1 -> Result (actual rows=1 loops=1) -> Seq Scan on ab_a1_b1 ab_1 (never executed) - Filter: ((a = $1) AND (b = $0)) + Filter: ((a = $1) AND (b = (InitPlan 1).col1)) -> Seq Scan on ab_a1_b2 ab_2 (never executed) - Filter: ((a = $1) AND (b = $0)) + Filter: ((a = $1) AND (b = (InitPlan 1).col1)) -> Seq Scan on ab_a1_b3 ab_3 (never executed) - Filter: ((a = $1) AND (b = $0)) + Filter: ((a = $1) AND (b = (InitPlan 1).col1)) -> Seq Scan on xy_1 (actual rows=0 loops=1) - Filter: ((x = $1) AND (y = $0)) + Filter: ((x = $1) AND (y = (InitPlan 1).col1)) Rows Removed by Filter: 1 -> Seq Scan on ab_a1_b1 ab_4 (never executed) - Filter: ((a = $1) AND (b = $0)) + Filter: ((a = $1) AND (b = (InitPlan 1).col1)) -> Seq Scan on ab_a1_b2 ab_5 (never executed) - Filter: ((a = $1) AND (b = $0)) + Filter: ((a = $1) AND (b = (InitPlan 1).col1)) -> Seq Scan on ab_a1_b3 ab_6 (never executed) - Filter: ((a = $1) AND (b = $0)) + Filter: ((a = $1) AND (b = (InitPlan 1).col1)) (19 rows) -- Ensure we see just the xy_1 row. @@ -2689,6 +2876,7 @@ update ab_a1 set b = 3 from ab where ab.a = 1 and ab.a = ab_a1.a; Index Cond: (a = 1) -> Bitmap Heap Scan on ab_a1_b3 ab_a1_3 (actual rows=0 loops=1) Recheck Cond: (a = 1) + Heap Blocks: exact=1 -> Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=1 loops=1) Index Cond: (a = 1) -> Materialize (actual rows=1 loops=1) @@ -2704,9 +2892,10 @@ update ab_a1 set b = 3 from ab where ab.a = 1 and ab.a = ab_a1.a; Index Cond: (a = 1) -> Bitmap Heap Scan on ab_a1_b3 ab_3 (actual rows=0 loops=1) Recheck Cond: (a = 1) + Heap Blocks: exact=1 -> Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=1 loops=1) Index Cond: (a = 1) -(34 rows) +(36 rows) table ab; a | b @@ -2725,7 +2914,7 @@ update ab_a1 set b = 3 from ab_a2 where ab_a2.b = (select 1); Update on ab_a1_b1 ab_a1_1 Update on ab_a1_b2 ab_a1_2 Update on ab_a1_b3 ab_a1_3 - InitPlan 1 (returns $0) + InitPlan 1 -> Result (actual rows=1 loops=1) -> Nested Loop (actual rows=3 loops=1) -> Append (actual rows=3 loops=1) @@ -2735,11 +2924,11 @@ update ab_a1 set b = 3 from ab_a2 where ab_a2.b = (select 1); -> Materialize (actual rows=1 loops=3) -> Append (actual rows=1 loops=1) -> Seq Scan on ab_a2_b1 ab_a2_1 (actual rows=1 loops=1) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a2_b2 ab_a2_2 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) -> Seq Scan on ab_a2_b3 ab_a2_3 (never executed) - Filter: (b = $0) + Filter: (b = (InitPlan 1).col1) (19 rows) select tableoid::regclass, * from ab; @@ -3073,12 +3262,12 @@ select * from listp where a = (select null::int); QUERY PLAN ------------------------------------------------------ Append (actual rows=0 loops=1) - InitPlan 1 (returns $0) + InitPlan 1 -> Result (actual rows=1 loops=1) -> Seq Scan on listp_1_1 listp_1 (never executed) - Filter: (a = $0) + Filter: (a = (InitPlan 1).col1) -> Seq Scan on listp_2_1 listp_2 (never executed) - Filter: (a = $0) + Filter: (a = (InitPlan 1).col1) (7 rows) drop table listp; @@ -3216,14 +3405,14 @@ prepare ps1 as select * from mc3p where a = $1 and abs(b) < (select 3); explain (analyze, costs off, summary off, timing off) execute ps1(1); - QUERY PLAN --------------------------------------------------------- + QUERY PLAN +------------------------------------------------------------- Append (actual rows=1 loops=1) Subplans Removed: 2 - InitPlan 1 (returns $0) + InitPlan 1 -> Result (actual rows=1 loops=1) -> Seq Scan on mc3p1 mc3p_1 (actual rows=1 loops=1) - Filter: ((a = $1) AND (abs(b) < $0)) + Filter: ((a = $1) AND (abs(b) < (InitPlan 1).col1)) (6 rows) deallocate ps1; @@ -3231,16 +3420,16 @@ prepare ps2 as select * from mc3p where a <= $1 and abs(b) < (select 3); explain (analyze, costs off, summary off, timing off) execute ps2(1); - QUERY PLAN --------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------- Append (actual rows=2 loops=1) Subplans Removed: 1 - InitPlan 1 (returns $0) + InitPlan 1 -> Result (actual rows=1 loops=1) -> Seq Scan on mc3p0 mc3p_1 (actual rows=1 loops=1) - Filter: ((a <= $1) AND (abs(b) < $0)) + Filter: ((a <= $1) AND (abs(b) < (InitPlan 1).col1)) -> Seq Scan on mc3p1 mc3p_2 (actual rows=1 loops=1) - Filter: ((a <= $1) AND (abs(b) < $0)) + Filter: ((a <= $1) AND (abs(b) < (InitPlan 1).col1)) (8 rows) deallocate ps2; @@ -3256,14 +3445,14 @@ select * from boolp where a = (select value from boolvalues where value); QUERY PLAN ----------------------------------------------------------- Append (actual rows=0 loops=1) - InitPlan 1 (returns $0) + InitPlan 1 -> Seq Scan on boolvalues (actual rows=1 loops=1) Filter: value Rows Removed by Filter: 1 -> Seq Scan on boolp_f boolp_1 (never executed) - Filter: (a = $0) + Filter: (a = (InitPlan 1).col1) -> Seq Scan on boolp_t boolp_2 (actual rows=0 loops=1) - Filter: (a = $0) + Filter: (a = (InitPlan 1).col1) (9 rows) explain (analyze, costs off, summary off, timing off) @@ -3271,14 +3460,14 @@ select * from boolp where a = (select value from boolvalues where not value); QUERY PLAN ----------------------------------------------------------- Append (actual rows=0 loops=1) - InitPlan 1 (returns $0) + InitPlan 1 -> Seq Scan on boolvalues (actual rows=1 loops=1) Filter: (NOT value) Rows Removed by Filter: 1 -> Seq Scan on boolp_f boolp_1 (actual rows=0 loops=1) - Filter: (a = $0) + Filter: (a = (InitPlan 1).col1) -> Seq Scan on boolp_t boolp_2 (never executed) - Filter: (a = $0) + Filter: (a = (InitPlan 1).col1) (9 rows) drop table boolp; @@ -3367,18 +3556,18 @@ explain (analyze, costs off, summary off, timing off) select * from ma_test wher ----------------------------------------------------------------------------------------------- Merge Append (actual rows=20 loops=1) Sort Key: ma_test.b - InitPlan 2 (returns $1) + InitPlan 2 -> Result (actual rows=1 loops=1) - InitPlan 1 (returns $0) + InitPlan 1 -> Limit (actual rows=1 loops=1) -> Index Scan using ma_test_p2_b_idx on ma_test_p2 (actual rows=1 loops=1) Index Cond: (b IS NOT NULL) -> Index Scan using ma_test_p1_b_idx on ma_test_p1 ma_test_1 (never executed) - Filter: (a >= $1) + Filter: (a >= (InitPlan 2).col1) -> Index Scan using ma_test_p2_b_idx on ma_test_p2 ma_test_2 (actual rows=10 loops=1) - Filter: (a >= $1) + Filter: (a >= (InitPlan 2).col1) -> Index Scan using ma_test_p3_b_idx on ma_test_p3 ma_test_3 (actual rows=10 loops=1) - Filter: (a >= $1) + Filter: (a >= (InitPlan 2).col1) (14 rows) reset enable_seqscan; @@ -3747,17 +3936,17 @@ from ( select 1, 1, 1 ) s(a, b, c) where s.a = 1 and s.b = 1 and s.c = (select 1); - QUERY PLAN ----------------------------------------------------- + QUERY PLAN +------------------------------------------------------------------- Append - InitPlan 1 (returns $0) + InitPlan 1 -> Result -> Seq Scan on p1 p - Filter: ((a = 1) AND (b = 1) AND (c = $0)) + Filter: ((a = 1) AND (b = 1) AND (c = (InitPlan 1).col1)) -> Seq Scan on q111 q1 - Filter: ((a = 1) AND (b = 1) AND (c = $0)) + Filter: ((a = 1) AND (b = 1) AND (c = (InitPlan 1).col1)) -> Result - One-Time Filter: (1 = $0) + One-Time Filter: (1 = (InitPlan 1).col1) (9 rows) select * @@ -3785,18 +3974,18 @@ from ( ) s(a, b, c) where s.a = $1 and s.b = $2 and s.c = (select 1); explain (costs off) execute q (1, 1); - QUERY PLAN ---------------------------------------------------------------- + QUERY PLAN +------------------------------------------------------------------------------ Append Subplans Removed: 1 - InitPlan 1 (returns $0) + InitPlan 1 -> Result -> Seq Scan on p1 p - Filter: ((a = $1) AND (b = $2) AND (c = $0)) + Filter: ((a = $1) AND (b = $2) AND (c = (InitPlan 1).col1)) -> Seq Scan on q111 q1 - Filter: ((a = $1) AND (b = $2) AND (c = $0)) + Filter: ((a = $1) AND (b = $2) AND (c = (InitPlan 1).col1)) -> Result - One-Time Filter: ((1 = $1) AND (1 = $2) AND (1 = $0)) + One-Time Filter: ((1 = $1) AND (1 = $2) AND (1 = (InitPlan 1).col1)) (10 rows) execute q (1, 1); @@ -3814,11 +4003,11 @@ create table listp2 partition of listp for values in(2) partition by list(b); create table listp2_10 partition of listp2 for values in (10); explain (analyze, costs off, summary off, timing off) select * from listp where a = (select 2) and b <> 10; - QUERY PLAN --------------------------------------------------- + QUERY PLAN +--------------------------------------------------- Seq Scan on listp1 listp (actual rows=0 loops=1) - Filter: ((b <> 10) AND (a = $0)) - InitPlan 1 (returns $0) + Filter: ((b <> 10) AND (a = (InitPlan 1).col1)) + InitPlan 1 -> Result (never executed) (4 rows) @@ -3883,16 +4072,15 @@ select explain_parallel_append('select * from listp where a = (select 1);'); ---------------------------------------------------------------------- Gather (actual rows=N loops=N) Workers Planned: 2 - Params Evaluated: $0 Workers Launched: N - InitPlan 1 (returns $0) + InitPlan 1 -> Result (actual rows=N loops=N) -> Parallel Append (actual rows=N loops=N) -> Seq Scan on listp_12_1 listp_1 (actual rows=N loops=N) - Filter: (a = $0) + Filter: (a = (InitPlan 1).col1) -> Parallel Seq Scan on listp_12_2 listp_2 (never executed) - Filter: (a = $0) -(11 rows) + Filter: (a = (InitPlan 1).col1) +(10 rows) -- Like the above but throw some more complexity at the planner by adding -- a UNION ALL. We expect both sides of the union not to scan the @@ -3903,30 +4091,25 @@ select explain_parallel_append( select * from listp where a = (select 2);'); explain_parallel_append ----------------------------------------------------------------------------------- - Append (actual rows=N loops=N) - -> Gather (actual rows=N loops=N) - Workers Planned: 2 - Params Evaluated: $0 - Workers Launched: N - InitPlan 1 (returns $0) - -> Result (actual rows=N loops=N) + Gather (actual rows=N loops=N) + Workers Planned: 2 + Workers Launched: N + -> Parallel Append (actual rows=N loops=N) -> Parallel Append (actual rows=N loops=N) - -> Seq Scan on listp_12_1 listp_1 (actual rows=N loops=N) - Filter: (a = $0) - -> Parallel Seq Scan on listp_12_2 listp_2 (never executed) - Filter: (a = $0) - -> Gather (actual rows=N loops=N) - Workers Planned: 2 - Params Evaluated: $1 - Workers Launched: N - InitPlan 2 (returns $1) - -> Result (actual rows=N loops=N) + InitPlan 2 + -> Result (actual rows=N loops=N) + -> Seq Scan on listp_12_1 listp_1 (never executed) + Filter: (a = (InitPlan 2).col1) + -> Parallel Seq Scan on listp_12_2 listp_2 (actual rows=N loops=N) + Filter: (a = (InitPlan 2).col1) -> Parallel Append (actual rows=N loops=N) - -> Seq Scan on listp_12_1 listp_4 (never executed) - Filter: (a = $1) - -> Parallel Seq Scan on listp_12_2 listp_5 (actual rows=N loops=N) - Filter: (a = $1) -(23 rows) + InitPlan 1 + -> Result (actual rows=N loops=N) + -> Seq Scan on listp_12_1 listp_4 (actual rows=N loops=N) + Filter: (a = (InitPlan 1).col1) + -> Parallel Seq Scan on listp_12_2 listp_5 (never executed) + Filter: (a = (InitPlan 1).col1) +(18 rows) drop table listp; reset parallel_tuple_cost; @@ -3948,20 +4131,20 @@ select * from rangep where b IN((select 1),(select 2)) order by a; QUERY PLAN ------------------------------------------------------------------------------------------------------------ Append (actual rows=0 loops=1) - InitPlan 1 (returns $0) + InitPlan 1 -> Result (actual rows=1 loops=1) - InitPlan 2 (returns $1) + InitPlan 2 -> Result (actual rows=1 loops=1) -> Merge Append (actual rows=0 loops=1) Sort Key: rangep_2.a -> Index Scan using rangep_0_to_100_1_a_idx on rangep_0_to_100_1 rangep_2 (actual rows=0 loops=1) - Filter: (b = ANY (ARRAY[$0, $1])) + Filter: (b = ANY (ARRAY[(InitPlan 1).col1, (InitPlan 2).col1])) -> Index Scan using rangep_0_to_100_2_a_idx on rangep_0_to_100_2 rangep_3 (actual rows=0 loops=1) - Filter: (b = ANY (ARRAY[$0, $1])) + Filter: (b = ANY (ARRAY[(InitPlan 1).col1, (InitPlan 2).col1])) -> Index Scan using rangep_0_to_100_3_a_idx on rangep_0_to_100_3 rangep_4 (never executed) - Filter: (b = ANY (ARRAY[$0, $1])) + Filter: (b = ANY (ARRAY[(InitPlan 1).col1, (InitPlan 2).col1])) -> Index Scan using rangep_100_to_200_a_idx on rangep_100_to_200 rangep_5 (actual rows=0 loops=1) - Filter: (b = ANY (ARRAY[$0, $1])) + Filter: (b = ANY (ARRAY[(InitPlan 1).col1, (InitPlan 2).col1])) (15 rows) reset enable_sort; @@ -4016,20 +4199,217 @@ explain (costs off) select * from rp_prefix_test3 where a >= 1 and b >= 1 and b Filter: ((a >= 1) AND (b >= 1) AND (d >= 0) AND (b = 2) AND (c = 2)) (2 rows) -create table hp_prefix_test (a int, b int, c int, d int) partition by hash (a part_test_int4_ops, b part_test_int4_ops, c part_test_int4_ops, d part_test_int4_ops); -create table hp_prefix_test_p1 partition of hp_prefix_test for values with (modulus 2, remainder 0); -create table hp_prefix_test_p2 partition of hp_prefix_test for values with (modulus 2, remainder 1); --- Test that get_steps_using_prefix() handles non-NULL step_nullkeys -explain (costs off) select * from hp_prefix_test where a = 1 and b is null and c = 1 and d = 1; - QUERY PLAN -------------------------------------------------------------- - Seq Scan on hp_prefix_test_p1 hp_prefix_test - Filter: ((b IS NULL) AND (a = 1) AND (c = 1) AND (d = 1)) -(2 rows) - drop table rp_prefix_test1; drop table rp_prefix_test2; drop table rp_prefix_test3; +-- +-- Test that get_steps_using_prefix() handles IS NULL clauses correctly +-- +create table hp_prefix_test (a int, b int, c int, d int) + partition by hash (a part_test_int4_ops, b part_test_int4_ops, c part_test_int4_ops, d part_test_int4_ops); +-- create 8 partitions +select 'create table hp_prefix_test_p' || x::text || ' partition of hp_prefix_test for values with (modulus 8, remainder ' || x::text || ');' +from generate_Series(0,7) x; + ?column? +------------------------------------------------------------------------------------------------------ + create table hp_prefix_test_p0 partition of hp_prefix_test for values with (modulus 8, remainder 0); + create table hp_prefix_test_p1 partition of hp_prefix_test for values with (modulus 8, remainder 1); + create table hp_prefix_test_p2 partition of hp_prefix_test for values with (modulus 8, remainder 2); + create table hp_prefix_test_p3 partition of hp_prefix_test for values with (modulus 8, remainder 3); + create table hp_prefix_test_p4 partition of hp_prefix_test for values with (modulus 8, remainder 4); + create table hp_prefix_test_p5 partition of hp_prefix_test for values with (modulus 8, remainder 5); + create table hp_prefix_test_p6 partition of hp_prefix_test for values with (modulus 8, remainder 6); + create table hp_prefix_test_p7 partition of hp_prefix_test for values with (modulus 8, remainder 7); +(8 rows) + +\gexec +create table hp_prefix_test_p0 partition of hp_prefix_test for values with (modulus 8, remainder 0); +create table hp_prefix_test_p1 partition of hp_prefix_test for values with (modulus 8, remainder 1); +create table hp_prefix_test_p2 partition of hp_prefix_test for values with (modulus 8, remainder 2); +create table hp_prefix_test_p3 partition of hp_prefix_test for values with (modulus 8, remainder 3); +create table hp_prefix_test_p4 partition of hp_prefix_test for values with (modulus 8, remainder 4); +create table hp_prefix_test_p5 partition of hp_prefix_test for values with (modulus 8, remainder 5); +create table hp_prefix_test_p6 partition of hp_prefix_test for values with (modulus 8, remainder 6); +create table hp_prefix_test_p7 partition of hp_prefix_test for values with (modulus 8, remainder 7); +-- insert 16 rows, one row for each test to perform. +insert into hp_prefix_test +select + case a when 0 then null else 1 end, + case b when 0 then null else 2 end, + case c when 0 then null else 3 end, + case d when 0 then null else 4 end +from + generate_series(0,1) a, + generate_series(0,1) b, + generate_Series(0,1) c, + generate_Series(0,1) d; +-- Ensure partition pruning works correctly for each combination of IS NULL +-- and equality quals. This may seem a little excessive, but there have been +-- a number of bugs in this area over the years. We make use of row only +-- output to reduce the size of the expected results. +\t on +select + 'explain (costs off) select tableoid::regclass,* from hp_prefix_test where ' || + string_agg(c.colname || case when g.s & (1 << c.colpos) = 0 then ' is null' else ' = ' || (colpos+1)::text end, ' and ' order by c.colpos) +from (values('a',0),('b',1),('c',2),('d',3)) c(colname, colpos), generate_Series(0,15) g(s) +group by g.s +order by g.s; + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c is null and d is null + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c is null and d is null + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c is null and d is null + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c is null and d is null + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c = 3 and d is null + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c = 3 and d is null + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c = 3 and d is null + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c = 3 and d is null + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c is null and d = 4 + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c is null and d = 4 + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c is null and d = 4 + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c is null and d = 4 + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c = 3 and d = 4 + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c = 3 and d = 4 + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c = 3 and d = 4 + explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c = 3 and d = 4 + +\gexec +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c is null and d is null + Seq Scan on hp_prefix_test_p0 hp_prefix_test + Filter: ((a IS NULL) AND (b IS NULL) AND (c IS NULL) AND (d IS NULL)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c is null and d is null + Seq Scan on hp_prefix_test_p1 hp_prefix_test + Filter: ((b IS NULL) AND (c IS NULL) AND (d IS NULL) AND (a = 1)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c is null and d is null + Seq Scan on hp_prefix_test_p2 hp_prefix_test + Filter: ((a IS NULL) AND (c IS NULL) AND (d IS NULL) AND (b = 2)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c is null and d is null + Seq Scan on hp_prefix_test_p4 hp_prefix_test + Filter: ((c IS NULL) AND (d IS NULL) AND (a = 1) AND (b = 2)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c = 3 and d is null + Seq Scan on hp_prefix_test_p3 hp_prefix_test + Filter: ((a IS NULL) AND (b IS NULL) AND (d IS NULL) AND (c = 3)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c = 3 and d is null + Seq Scan on hp_prefix_test_p7 hp_prefix_test + Filter: ((b IS NULL) AND (d IS NULL) AND (a = 1) AND (c = 3)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c = 3 and d is null + Seq Scan on hp_prefix_test_p4 hp_prefix_test + Filter: ((a IS NULL) AND (d IS NULL) AND (b = 2) AND (c = 3)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c = 3 and d is null + Seq Scan on hp_prefix_test_p5 hp_prefix_test + Filter: ((d IS NULL) AND (a = 1) AND (b = 2) AND (c = 3)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c is null and d = 4 + Seq Scan on hp_prefix_test_p4 hp_prefix_test + Filter: ((a IS NULL) AND (b IS NULL) AND (c IS NULL) AND (d = 4)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c is null and d = 4 + Seq Scan on hp_prefix_test_p6 hp_prefix_test + Filter: ((b IS NULL) AND (c IS NULL) AND (a = 1) AND (d = 4)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c is null and d = 4 + Seq Scan on hp_prefix_test_p5 hp_prefix_test + Filter: ((a IS NULL) AND (c IS NULL) AND (b = 2) AND (d = 4)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c is null and d = 4 + Seq Scan on hp_prefix_test_p6 hp_prefix_test + Filter: ((c IS NULL) AND (a = 1) AND (b = 2) AND (d = 4)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c = 3 and d = 4 + Seq Scan on hp_prefix_test_p4 hp_prefix_test + Filter: ((a IS NULL) AND (b IS NULL) AND (c = 3) AND (d = 4)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c = 3 and d = 4 + Seq Scan on hp_prefix_test_p5 hp_prefix_test + Filter: ((b IS NULL) AND (a = 1) AND (c = 3) AND (d = 4)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c = 3 and d = 4 + Seq Scan on hp_prefix_test_p6 hp_prefix_test + Filter: ((a IS NULL) AND (b = 2) AND (c = 3) AND (d = 4)) + +explain (costs off) select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c = 3 and d = 4 + Seq Scan on hp_prefix_test_p4 hp_prefix_test + Filter: ((a = 1) AND (b = 2) AND (c = 3) AND (d = 4)) + +-- And ensure we get exactly 1 row from each. Again, all 16 possible combinations. +select + 'select tableoid::regclass,* from hp_prefix_test where ' || + string_agg(c.colname || case when g.s & (1 << c.colpos) = 0 then ' is null' else ' = ' || (colpos+1)::text end, ' and ' order by c.colpos) +from (values('a',0),('b',1),('c',2),('d',3)) c(colname, colpos), generate_Series(0,15) g(s) +group by g.s +order by g.s; + select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c is null and d is null + select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c is null and d is null + select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c is null and d is null + select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c is null and d is null + select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c = 3 and d is null + select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c = 3 and d is null + select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c = 3 and d is null + select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c = 3 and d is null + select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c is null and d = 4 + select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c is null and d = 4 + select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c is null and d = 4 + select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c is null and d = 4 + select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c = 3 and d = 4 + select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c = 3 and d = 4 + select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c = 3 and d = 4 + select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c = 3 and d = 4 + +\gexec +select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c is null and d is null + hp_prefix_test_p0 | | | | + +select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c is null and d is null + hp_prefix_test_p1 | 1 | | | + +select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c is null and d is null + hp_prefix_test_p2 | | 2 | | + +select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c is null and d is null + hp_prefix_test_p4 | 1 | 2 | | + +select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c = 3 and d is null + hp_prefix_test_p3 | | | 3 | + +select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c = 3 and d is null + hp_prefix_test_p7 | 1 | | 3 | + +select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c = 3 and d is null + hp_prefix_test_p4 | | 2 | 3 | + +select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c = 3 and d is null + hp_prefix_test_p5 | 1 | 2 | 3 | + +select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c is null and d = 4 + hp_prefix_test_p4 | | | | 4 + +select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c is null and d = 4 + hp_prefix_test_p6 | 1 | | | 4 + +select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c is null and d = 4 + hp_prefix_test_p5 | | 2 | | 4 + +select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c is null and d = 4 + hp_prefix_test_p6 | 1 | 2 | | 4 + +select tableoid::regclass,* from hp_prefix_test where a is null and b is null and c = 3 and d = 4 + hp_prefix_test_p4 | | | 3 | 4 + +select tableoid::regclass,* from hp_prefix_test where a = 1 and b is null and c = 3 and d = 4 + hp_prefix_test_p5 | 1 | | 3 | 4 + +select tableoid::regclass,* from hp_prefix_test where a is null and b = 2 and c = 3 and d = 4 + hp_prefix_test_p6 | | 2 | 3 | 4 + +select tableoid::regclass,* from hp_prefix_test where a = 1 and b = 2 and c = 3 and d = 4 + hp_prefix_test_p4 | 1 | 2 | 3 | 4 + +\t off drop table hp_prefix_test; -- -- Check that gen_partprune_steps() detects self-contradiction from clauses diff --git a/src/test/regress/expected/password.out b/src/test/regress/expected/password.out index 8475231735675..924d6e001d457 100644 --- a/src/test/regress/expected/password.out +++ b/src/test/regress/expected/password.out @@ -12,8 +12,10 @@ SET password_encryption = 'md5'; -- ok SET password_encryption = 'scram-sha-256'; -- ok -- consistency of password entries SET password_encryption = 'md5'; -CREATE ROLE regress_passwd1 PASSWORD 'role_pwd1'; -CREATE ROLE regress_passwd2 PASSWORD 'role_pwd2'; +CREATE ROLE regress_passwd1; +ALTER ROLE regress_passwd1 PASSWORD 'role_pwd1'; +CREATE ROLE regress_passwd2; +ALTER ROLE regress_passwd2 PASSWORD 'role_pwd2'; SET password_encryption = 'scram-sha-256'; CREATE ROLE regress_passwd3 PASSWORD 'role_pwd3'; CREATE ROLE regress_passwd4 PASSWORD NULL; diff --git a/src/test/regress/expected/password_1.out b/src/test/regress/expected/password_1.out new file mode 100644 index 0000000000000..9d2cc94f3712a --- /dev/null +++ b/src/test/regress/expected/password_1.out @@ -0,0 +1,152 @@ +-- +-- Tests for password types +-- +-- Tests for GUC password_encryption +SET password_encryption = 'novalue'; -- error +ERROR: invalid value for parameter "password_encryption": "novalue" +HINT: Available values: md5, scram-sha-256. +SET password_encryption = true; -- error +ERROR: invalid value for parameter "password_encryption": "true" +HINT: Available values: md5, scram-sha-256. +SET password_encryption = 'md5'; -- ok +SET password_encryption = 'scram-sha-256'; -- ok +-- consistency of password entries +SET password_encryption = 'md5'; +CREATE ROLE regress_passwd1; +ALTER ROLE regress_passwd1 PASSWORD 'role_pwd1'; +ERROR: password encryption failed: unsupported +CREATE ROLE regress_passwd2; +ALTER ROLE regress_passwd2 PASSWORD 'role_pwd2'; +ERROR: password encryption failed: unsupported +SET password_encryption = 'scram-sha-256'; +CREATE ROLE regress_passwd3 PASSWORD 'role_pwd3'; +CREATE ROLE regress_passwd4 PASSWORD NULL; +-- check list of created entries +-- +-- The scram secret will look something like: +-- SCRAM-SHA-256$4096:E4HxLGtnRzsYwg==$6YtlR4t69SguDiwFvbVgVZtuz6gpJQQqUMZ7IQJK5yI=:ps75jrHeYU4lXCcXI4O8oIdJ3eO8o2jirjruw9phBTo= +-- +-- Since the salt is random, the exact value stored will be different on every test +-- run. Use a regular expression to mask the changing parts. +SELECT rolname, regexp_replace(rolpassword, '(SCRAM-SHA-256)\$(\d+):([a-zA-Z0-9+/=]+)\$([a-zA-Z0-9+=/]+):([a-zA-Z0-9+/=]+)', '\1$\2:$:') as rolpassword_masked + FROM pg_authid + WHERE rolname LIKE 'regress_passwd%' + ORDER BY rolname, rolpassword; + rolname | rolpassword_masked +-----------------+--------------------------------------------------- + regress_passwd1 | + regress_passwd2 | + regress_passwd3 | SCRAM-SHA-256$4096:$: + regress_passwd4 | +(4 rows) + +-- Rename a role +ALTER ROLE regress_passwd2 RENAME TO regress_passwd2_new; +-- md5 entry should have been removed +SELECT rolname, rolpassword + FROM pg_authid + WHERE rolname LIKE 'regress_passwd2_new' + ORDER BY rolname, rolpassword; + rolname | rolpassword +---------------------+------------- + regress_passwd2_new | +(1 row) + +ALTER ROLE regress_passwd2_new RENAME TO regress_passwd2; +-- Change passwords with ALTER USER. With plaintext or already-encrypted +-- passwords. +SET password_encryption = 'md5'; +-- encrypt with MD5 +ALTER ROLE regress_passwd2 PASSWORD 'foo'; +ERROR: password encryption failed: unsupported +-- already encrypted, use as they are +ALTER ROLE regress_passwd1 PASSWORD 'md5cd3578025fe2c3d7ed1b9a9b26238b70'; +ALTER ROLE regress_passwd3 PASSWORD 'SCRAM-SHA-256$4096:VLK4RMaQLCvNtQ==$6YtlR4t69SguDiwFvbVgVZtuz6gpJQQqUMZ7IQJK5yI=:ps75jrHeYU4lXCcXI4O8oIdJ3eO8o2jirjruw9phBTo='; +SET password_encryption = 'scram-sha-256'; +-- create SCRAM secret +ALTER ROLE regress_passwd4 PASSWORD 'foo'; +-- already encrypted with MD5, use as it is +CREATE ROLE regress_passwd5 PASSWORD 'md5e73a4b11df52a6068f8b39f90be36023'; +-- This looks like a valid SCRAM-SHA-256 secret, but it is not +-- so it should be hashed with SCRAM-SHA-256. +CREATE ROLE regress_passwd6 PASSWORD 'SCRAM-SHA-256$1234'; +-- These may look like valid MD5 secrets, but they are not, so they +-- should be hashed with SCRAM-SHA-256. +-- trailing garbage at the end +CREATE ROLE regress_passwd7 PASSWORD 'md5012345678901234567890123456789zz'; +-- invalid length +CREATE ROLE regress_passwd8 PASSWORD 'md501234567890123456789012345678901zz'; +-- Changing the SCRAM iteration count +SET scram_iterations = 1024; +CREATE ROLE regress_passwd9 PASSWORD 'alterediterationcount'; +SELECT rolname, regexp_replace(rolpassword, '(SCRAM-SHA-256)\$(\d+):([a-zA-Z0-9+/=]+)\$([a-zA-Z0-9+=/]+):([a-zA-Z0-9+/=]+)', '\1$\2:$:') as rolpassword_masked + FROM pg_authid + WHERE rolname LIKE 'regress_passwd%' + ORDER BY rolname, rolpassword; + rolname | rolpassword_masked +-----------------+--------------------------------------------------- + regress_passwd1 | md5cd3578025fe2c3d7ed1b9a9b26238b70 + regress_passwd2 | + regress_passwd3 | SCRAM-SHA-256$4096:$: + regress_passwd4 | SCRAM-SHA-256$4096:$: + regress_passwd5 | md5e73a4b11df52a6068f8b39f90be36023 + regress_passwd6 | SCRAM-SHA-256$4096:$: + regress_passwd7 | SCRAM-SHA-256$4096:$: + regress_passwd8 | SCRAM-SHA-256$4096:$: + regress_passwd9 | SCRAM-SHA-256$1024:$: +(9 rows) + +-- An empty password is not allowed, in any form +CREATE ROLE regress_passwd_empty PASSWORD ''; +NOTICE: empty string is not a valid password, clearing password +ALTER ROLE regress_passwd_empty PASSWORD 'md585939a5ce845f1a1b620742e3c659e0a'; +ALTER ROLE regress_passwd_empty PASSWORD 'SCRAM-SHA-256$4096:hpFyHTUsSWcR7O9P$LgZFIt6Oqdo27ZFKbZ2nV+vtnYM995pDh9ca6WSi120=:qVV5NeluNfUPkwm7Vqat25RjSPLkGeoZBQs6wVv+um4='; +NOTICE: empty string is not a valid password, clearing password +SELECT rolpassword FROM pg_authid WHERE rolname='regress_passwd_empty'; + rolpassword +------------- + +(1 row) + +-- Test with invalid stored and server keys. +-- +-- The first is valid, to act as a control. The others have too long +-- stored/server keys. They will be re-hashed. +CREATE ROLE regress_passwd_sha_len0 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96Rqw=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZI='; +CREATE ROLE regress_passwd_sha_len1 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96RqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZI='; +CREATE ROLE regress_passwd_sha_len2 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96Rqw=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA='; +-- Check that the invalid secrets were re-hashed. A re-hashed secret +-- should not contain the original salt. +SELECT rolname, rolpassword not like '%A6xHKoH/494E941doaPOYg==%' as is_rolpassword_rehashed + FROM pg_authid + WHERE rolname LIKE 'regress_passwd_sha_len%' + ORDER BY rolname; + rolname | is_rolpassword_rehashed +-------------------------+------------------------- + regress_passwd_sha_len0 | f + regress_passwd_sha_len1 | t + regress_passwd_sha_len2 | t +(3 rows) + +DROP ROLE regress_passwd1; +DROP ROLE regress_passwd2; +DROP ROLE regress_passwd3; +DROP ROLE regress_passwd4; +DROP ROLE regress_passwd5; +DROP ROLE regress_passwd6; +DROP ROLE regress_passwd7; +DROP ROLE regress_passwd8; +DROP ROLE regress_passwd9; +DROP ROLE regress_passwd_empty; +DROP ROLE regress_passwd_sha_len0; +DROP ROLE regress_passwd_sha_len1; +DROP ROLE regress_passwd_sha_len2; +-- all entries should have been removed +SELECT rolname, rolpassword + FROM pg_authid + WHERE rolname LIKE 'regress_passwd%' + ORDER BY rolname, rolpassword; + rolname | rolpassword +---------+------------- +(0 rows) + diff --git a/src/test/regress/expected/plpgsql.out b/src/test/regress/expected/plpgsql.out index 272f5d2111b7f..074af8f33a8e4 100644 --- a/src/test/regress/expected/plpgsql.out +++ b/src/test/regress/expected/plpgsql.out @@ -2390,11 +2390,9 @@ select namedparmcursor_test7(); ERROR: division by zero CONTEXT: SQL expression "42/0 AS p1, 77 AS p2" PL/pgSQL function namedparmcursor_test7() line 6 at OPEN --- check that line comments work correctly within the argument list (there --- is some special handling of this case in the code: the newline after the --- comment must be preserved when the argument-evaluating query is --- constructed, otherwise the comment effectively comments out the next --- argument, too) +-- check that line comments work correctly within the argument list +-- (this used to require a special hack in the code; it no longer does, +-- but let's keep the test anyway) create function namedparmcursor_test8() returns int4 as $$ declare c1 cursor (p1 int, p2 int) for @@ -4032,7 +4030,7 @@ declare v int := 0; begin return 10 / v; end; -$$ language plpgsql; +$$ language plpgsql parallel safe; create or replace function raise_test() returns void as $$ begin raise exception 'custom exception' @@ -4099,8 +4097,37 @@ $$ language plpgsql; select stacked_diagnostics_test(); ERROR: GET STACKED DIAGNOSTICS cannot be used outside an exception handler CONTEXT: PL/pgSQL function stacked_diagnostics_test() line 6 at GET STACKED DIAGNOSTICS -drop function zero_divide(); drop function stacked_diagnostics_test(); +-- Test that an error recovery subtransaction is parallel safe +create function error_trap_test() returns text as $$ +begin + perform zero_divide(); + return 'no error detected!'; +exception when division_by_zero then + return 'division_by_zero detected'; +end; +$$ language plpgsql parallel safe; +set debug_parallel_query to on; +explain (verbose, costs off) select error_trap_test(); + QUERY PLAN +----------------------------------- + Gather + Output: (error_trap_test()) + Workers Planned: 1 + Single Copy: true + -> Result + Output: error_trap_test() +(6 rows) + +select error_trap_test(); + error_trap_test +--------------------------- + division_by_zero detected +(1 row) + +reset debug_parallel_query; +drop function error_trap_test(); +drop function zero_divide(); -- check cases where implicit SQLSTATE variable could be confused with -- SQLSTATE as a keyword, cf bug #5524 create or replace function raise_test() returns void as $$ @@ -5795,18 +5822,18 @@ SELECT * FROM get_from_partitioned_table(1) AS t; (1 row) CREATE OR REPLACE FUNCTION list_partitioned_table() -RETURNS SETOF partitioned_table.a%TYPE AS $$ +RETURNS SETOF public.partitioned_table.a%TYPE AS $$ DECLARE - row partitioned_table%ROWTYPE; - a_val partitioned_table.a%TYPE; + row public.partitioned_table%ROWTYPE; + a_val public.partitioned_table.a%TYPE; BEGIN - FOR row IN SELECT * FROM partitioned_table ORDER BY a LOOP + FOR row IN SELECT * FROM public.partitioned_table ORDER BY a LOOP a_val := row.a; RETURN NEXT a_val; END LOOP; RETURN; END; $$ LANGUAGE plpgsql; -NOTICE: type reference partitioned_table.a%TYPE converted to integer +NOTICE: type reference public.partitioned_table.a%TYPE converted to integer SELECT * FROM list_partitioned_table() AS t; t --- diff --git a/src/test/regress/expected/portals.out b/src/test/regress/expected/portals.out index f71e0b3d41de2..06726ed4ab7ae 100644 --- a/src/test/regress/expected/portals.out +++ b/src/test/regress/expected/portals.out @@ -1472,18 +1472,18 @@ rollback; -- Check handling of non-backwards-scan-capable plans with scroll cursors begin; explain (costs off) declare c1 cursor for select (select 42) as x; - QUERY PLAN ---------------------------- + QUERY PLAN +---------------- Result - InitPlan 1 (returns $0) + InitPlan 1 -> Result (3 rows) explain (costs off) declare c1 scroll cursor for select (select 42) as x; - QUERY PLAN ---------------------------- + QUERY PLAN +---------------- Materialize - InitPlan 1 (returns $0) + InitPlan 1 -> Result -> Result (4 rows) diff --git a/src/test/regress/expected/predicate.out b/src/test/regress/expected/predicate.out new file mode 100644 index 0000000000000..b79037748b7e6 --- /dev/null +++ b/src/test/regress/expected/predicate.out @@ -0,0 +1,363 @@ +-- +-- Tests for predicate handling +-- +-- +-- Test that restrictions that are always true are ignored, and that are always +-- false are replaced with constant-FALSE +-- +-- Currently we only check for NullTest quals and OR clauses that include +-- NullTest quals. We may extend it in the future. +-- +CREATE TABLE pred_tab (a int NOT NULL, b int, c int NOT NULL); +-- +-- Test restriction clauses +-- +-- Ensure the IS_NOT_NULL qual is ignored when the column is non-nullable +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.a IS NOT NULL; + QUERY PLAN +------------------------ + Seq Scan on pred_tab t +(1 row) + +-- Ensure the IS_NOT_NULL qual is not ignored on a nullable column +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.b IS NOT NULL; + QUERY PLAN +--------------------------- + Seq Scan on pred_tab t + Filter: (b IS NOT NULL) +(2 rows) + +-- Ensure the IS_NULL qual is reduced to constant-FALSE for non-nullable +-- columns +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.a IS NULL; + QUERY PLAN +-------------------------- + Result + One-Time Filter: false +(2 rows) + +-- Ensure the IS_NULL qual is not reduced to constant-FALSE on nullable +-- columns +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.b IS NULL; + QUERY PLAN +------------------------ + Seq Scan on pred_tab t + Filter: (b IS NULL) +(2 rows) + +-- +-- Tests for OR clauses in restriction clauses +-- +-- Ensure the OR clause is ignored when an OR branch is always true +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.a IS NOT NULL OR t.b = 1; + QUERY PLAN +------------------------ + Seq Scan on pred_tab t +(1 row) + +-- Ensure the OR clause is not ignored for NullTests that can't be proven +-- always true +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.b IS NOT NULL OR t.a = 1; + QUERY PLAN +---------------------------------------- + Seq Scan on pred_tab t + Filter: ((b IS NOT NULL) OR (a = 1)) +(2 rows) + +-- Ensure the OR clause is reduced to constant-FALSE when all branches are +-- provably false +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.a IS NULL OR t.c IS NULL; + QUERY PLAN +-------------------------- + Result + One-Time Filter: false +(2 rows) + +-- Ensure the OR clause is not reduced to constant-FALSE when not all branches +-- are provably false +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.b IS NULL OR t.c IS NULL; + QUERY PLAN +---------------------------------------- + Seq Scan on pred_tab t + Filter: ((b IS NULL) OR (c IS NULL)) +(2 rows) + +-- +-- Test join clauses +-- +-- Ensure the IS_NOT_NULL qual is ignored, since a) it's on a NOT NULL column, +-- and b) its Var is not nullable by any outer joins +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON t1.a IS NOT NULL; + QUERY PLAN +------------------------------------- + Nested Loop Left Join + -> Seq Scan on pred_tab t1 + -> Materialize + -> Seq Scan on pred_tab t2 +(4 rows) + +-- Ensure the IS_NOT_NULL qual is not ignored when columns are made nullable +-- by an outer join +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + FULL JOIN pred_tab t2 ON t1.a = t2.a + LEFT JOIN pred_tab t3 ON t2.a IS NOT NULL; + QUERY PLAN +------------------------------------------- + Nested Loop Left Join + Join Filter: (t2.a IS NOT NULL) + -> Merge Full Join + Merge Cond: (t1.a = t2.a) + -> Sort + Sort Key: t1.a + -> Seq Scan on pred_tab t1 + -> Sort + Sort Key: t2.a + -> Seq Scan on pred_tab t2 + -> Materialize + -> Seq Scan on pred_tab t3 +(12 rows) + +-- Ensure the IS_NULL qual is reduced to constant-FALSE, since a) it's on a NOT +-- NULL column, and b) its Var is not nullable by any outer joins +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON t1.a IS NULL; + QUERY PLAN +-------------------------------- + Nested Loop Left Join + Join Filter: false + -> Seq Scan on pred_tab t1 + -> Result + One-Time Filter: false +(5 rows) + +-- Ensure the IS_NULL qual is not reduced to constant-FALSE when the column is +-- nullable by an outer join +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON t1.a = 1 + LEFT JOIN pred_tab t3 ON t2.a IS NULL; + QUERY PLAN +------------------------------------------- + Nested Loop Left Join + Join Filter: (t2.a IS NULL) + -> Nested Loop Left Join + Join Filter: (t1.a = 1) + -> Seq Scan on pred_tab t1 + -> Materialize + -> Seq Scan on pred_tab t2 + -> Materialize + -> Seq Scan on pred_tab t3 +(9 rows) + +-- +-- Tests for OR clauses in join clauses +-- +-- Ensure the OR clause is ignored when an OR branch is provably always true +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON t1.a IS NOT NULL OR t2.b = 1; + QUERY PLAN +------------------------------------- + Nested Loop Left Join + -> Seq Scan on pred_tab t1 + -> Materialize + -> Seq Scan on pred_tab t2 +(4 rows) + +-- Ensure the NullTest is not ignored when the column is nullable by an outer +-- join +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + FULL JOIN pred_tab t2 ON t1.a = t2.a + LEFT JOIN pred_tab t3 ON t2.a IS NOT NULL OR t2.b = 1; + QUERY PLAN +--------------------------------------------------- + Nested Loop Left Join + Join Filter: ((t2.a IS NOT NULL) OR (t2.b = 1)) + -> Merge Full Join + Merge Cond: (t1.a = t2.a) + -> Sort + Sort Key: t1.a + -> Seq Scan on pred_tab t1 + -> Sort + Sort Key: t2.a + -> Seq Scan on pred_tab t2 + -> Materialize + -> Seq Scan on pred_tab t3 +(12 rows) + +-- Ensure the OR clause is reduced to constant-FALSE when all OR branches are +-- provably false +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON (t1.a IS NULL OR t1.c IS NULL); + QUERY PLAN +-------------------------------- + Nested Loop Left Join + Join Filter: false + -> Seq Scan on pred_tab t1 + -> Result + One-Time Filter: false +(5 rows) + +-- Ensure the OR clause is not reduced to constant-FALSE when a column is +-- made nullable from an outer join +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON t1.a = 1 + LEFT JOIN pred_tab t3 ON t2.a IS NULL OR t2.c IS NULL; + QUERY PLAN +--------------------------------------------------- + Nested Loop Left Join + Join Filter: ((t2.a IS NULL) OR (t2.c IS NULL)) + -> Nested Loop Left Join + Join Filter: (t1.a = 1) + -> Seq Scan on pred_tab t1 + -> Materialize + -> Seq Scan on pred_tab t2 + -> Materialize + -> Seq Scan on pred_tab t3 +(9 rows) + +DROP TABLE pred_tab; +-- Validate we handle IS NULL and IS NOT NULL quals correctly with inheritance +-- parents. +CREATE TABLE pred_parent (a int); +CREATE TABLE pred_child () INHERITS (pred_parent); +ALTER TABLE ONLY pred_parent ALTER a SET NOT NULL; +-- Ensure that the scan on pred_child contains the IS NOT NULL qual. +EXPLAIN (COSTS OFF) +SELECT * FROM pred_parent WHERE a IS NOT NULL; + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on pred_parent pred_parent_1 + -> Seq Scan on pred_child pred_parent_2 + Filter: (a IS NOT NULL) +(4 rows) + +-- Ensure we only scan pred_child and not pred_parent +EXPLAIN (COSTS OFF) +SELECT * FROM pred_parent WHERE a IS NULL; + QUERY PLAN +------------------------------------ + Seq Scan on pred_child pred_parent + Filter: (a IS NULL) +(2 rows) + +ALTER TABLE pred_parent ALTER a DROP NOT NULL; +ALTER TABLE pred_child ALTER a SET NOT NULL; +-- Ensure the IS NOT NULL qual is removed from the pred_child scan. +EXPLAIN (COSTS OFF) +SELECT * FROM pred_parent WHERE a IS NOT NULL; + QUERY PLAN +--------------------------------------------- + Append + -> Seq Scan on pred_parent pred_parent_1 + Filter: (a IS NOT NULL) + -> Seq Scan on pred_child pred_parent_2 +(4 rows) + +-- Ensure we only scan pred_parent and not pred_child +EXPLAIN (COSTS OFF) +SELECT * FROM pred_parent WHERE a IS NULL; + QUERY PLAN +------------------------- + Seq Scan on pred_parent + Filter: (a IS NULL) +(2 rows) + +DROP TABLE pred_parent, pred_child; +-- Validate we do not reduce a clone clause to a constant true or false +CREATE TABLE pred_tab (a int, b int); +CREATE TABLE pred_tab_notnull (a int, b int NOT NULL); +INSERT INTO pred_tab VALUES (1, 1); +INSERT INTO pred_tab VALUES (2, 2); +INSERT INTO pred_tab_notnull VALUES (2, 2); +INSERT INTO pred_tab_notnull VALUES (3, 3); +ANALYZE pred_tab; +ANALYZE pred_tab_notnull; +-- Ensure the IS_NOT_NULL qual is not reduced to constant true and removed +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON TRUE + LEFT JOIN pred_tab_notnull t3 ON t2.a = t3.a + LEFT JOIN pred_tab t4 ON t3.b IS NOT NULL; + QUERY PLAN +--------------------------------------------------------------- + Nested Loop Left Join + -> Seq Scan on pred_tab t1 + -> Materialize + -> Nested Loop Left Join + Join Filter: (t3.b IS NOT NULL) + -> Nested Loop Left Join + Join Filter: (t2.a = t3.a) + -> Seq Scan on pred_tab t2 + -> Materialize + -> Seq Scan on pred_tab_notnull t3 + -> Materialize + -> Seq Scan on pred_tab t4 +(12 rows) + +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON TRUE + LEFT JOIN pred_tab_notnull t3 ON t2.a = t3.a + LEFT JOIN pred_tab t4 ON t3.b IS NOT NULL; + a | b | a | b | a | b | a | b +---+---+---+---+---+---+---+--- + 1 | 1 | 1 | 1 | | | | + 1 | 1 | 2 | 2 | 2 | 2 | 1 | 1 + 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 + 2 | 2 | 1 | 1 | | | | + 2 | 2 | 2 | 2 | 2 | 2 | 1 | 1 + 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 +(6 rows) + +-- Ensure the IS_NULL qual is not reduced to constant false +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON TRUE + LEFT JOIN pred_tab_notnull t3 ON t2.a = t3.a + LEFT JOIN pred_tab t4 ON t3.b IS NULL AND t3.a IS NOT NULL; + QUERY PLAN +-------------------------------------------------------------------- + Nested Loop Left Join + -> Seq Scan on pred_tab t1 + -> Materialize + -> Nested Loop Left Join + Join Filter: ((t3.b IS NULL) AND (t3.a IS NOT NULL)) + -> Nested Loop Left Join + Join Filter: (t2.a = t3.a) + -> Seq Scan on pred_tab t2 + -> Materialize + -> Seq Scan on pred_tab_notnull t3 + -> Materialize + -> Seq Scan on pred_tab t4 +(12 rows) + +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON TRUE + LEFT JOIN pred_tab_notnull t3 ON t2.a = t3.a + LEFT JOIN pred_tab t4 ON t3.b IS NULL AND t3.a IS NOT NULL; + a | b | a | b | a | b | a | b +---+---+---+---+---+---+---+--- + 1 | 1 | 1 | 1 | | | | + 1 | 1 | 2 | 2 | 2 | 2 | | + 2 | 2 | 1 | 1 | | | | + 2 | 2 | 2 | 2 | 2 | 2 | | +(4 rows) + +DROP TABLE pred_tab; +DROP TABLE pred_tab_notnull; diff --git a/src/test/regress/expected/prepared_xacts.out b/src/test/regress/expected/prepared_xacts.out index ba8e3ccc6c9bf..515a2ada9d1ab 100644 --- a/src/test/regress/expected/prepared_xacts.out +++ b/src/test/regress/expected/prepared_xacts.out @@ -17,7 +17,7 @@ SELECT * FROM pxtest1; bbb (1 row) -PREPARE TRANSACTION 'foo1'; +PREPARE TRANSACTION 'regress_foo1'; SELECT * FROM pxtest1; foobar -------- @@ -25,21 +25,21 @@ SELECT * FROM pxtest1; (1 row) -- Test pg_prepared_xacts system view -SELECT gid FROM pg_prepared_xacts; - gid ------- - foo1 +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; + gid +-------------- + regress_foo1 (1 row) -- Test ROLLBACK PREPARED -ROLLBACK PREPARED 'foo1'; +ROLLBACK PREPARED 'regress_foo1'; SELECT * FROM pxtest1; foobar -------- aaa (1 row) -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; gid ----- (0 rows) @@ -54,14 +54,14 @@ SELECT * FROM pxtest1; ddd (2 rows) -PREPARE TRANSACTION 'foo2'; +PREPARE TRANSACTION 'regress_foo2'; SELECT * FROM pxtest1; foobar -------- aaa (1 row) -COMMIT PREPARED 'foo2'; +COMMIT PREPARED 'regress_foo2'; SELECT * FROM pxtest1; foobar -------- @@ -79,18 +79,18 @@ SELECT * FROM pxtest1; eee (2 rows) -PREPARE TRANSACTION 'foo3'; -SELECT gid FROM pg_prepared_xacts; - gid ------- - foo3 +PREPARE TRANSACTION 'regress_foo3'; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; + gid +-------------- + regress_foo3 (1 row) BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; INSERT INTO pxtest1 VALUES ('fff'); -- This should fail, because the gid foo3 is already in use -PREPARE TRANSACTION 'foo3'; -ERROR: transaction identifier "foo3" is already in use +PREPARE TRANSACTION 'regress_foo3'; +ERROR: transaction identifier "regress_foo3" is already in use SELECT * FROM pxtest1; foobar -------- @@ -98,7 +98,7 @@ SELECT * FROM pxtest1; ddd (2 rows) -ROLLBACK PREPARED 'foo3'; +ROLLBACK PREPARED 'regress_foo3'; SELECT * FROM pxtest1; foobar -------- @@ -116,11 +116,11 @@ SELECT * FROM pxtest1; eee (2 rows) -PREPARE TRANSACTION 'foo4'; -SELECT gid FROM pg_prepared_xacts; - gid ------- - foo4 +PREPARE TRANSACTION 'regress_foo4'; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; + gid +-------------- + regress_foo4 (1 row) BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; @@ -136,15 +136,15 @@ INSERT INTO pxtest1 VALUES ('fff'); ERROR: could not serialize access due to read/write dependencies among transactions DETAIL: Reason code: Canceled on identification as a pivot, during write. HINT: The transaction might succeed if retried. -PREPARE TRANSACTION 'foo5'; -SELECT gid FROM pg_prepared_xacts; - gid ------- - foo4 +PREPARE TRANSACTION 'regress_foo5'; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; + gid +-------------- + regress_foo4 (1 row) -ROLLBACK PREPARED 'foo4'; -SELECT gid FROM pg_prepared_xacts; +ROLLBACK PREPARED 'regress_foo4'; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; gid ----- (0 rows) @@ -165,7 +165,7 @@ SELECT pg_advisory_xact_lock_shared(1); (1 row) -PREPARE TRANSACTION 'foo6'; -- fails +PREPARE TRANSACTION 'regress_foo6'; -- fails ERROR: cannot PREPARE while holding both session-level and transaction-level locks on the same object -- Test subtransactions BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; @@ -176,7 +176,7 @@ BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; ROLLBACK TO a; SAVEPOINT b; INSERT INTO pxtest2 VALUES (3); -PREPARE TRANSACTION 'regress-one'; +PREPARE TRANSACTION 'regress_sub1'; CREATE TABLE pxtest3(fff int); -- Test shared invalidation BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; @@ -192,7 +192,7 @@ BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; 1 (1 row) -PREPARE TRANSACTION 'regress-two'; +PREPARE TRANSACTION 'regress_sub2'; -- No such cursor FETCH 1 FROM foo; ERROR: cursor "foo" does not exist @@ -202,11 +202,11 @@ ERROR: relation "pxtest2" does not exist LINE 1: SELECT * FROM pxtest2; ^ -- There should be two prepared transactions -SELECT gid FROM pg_prepared_xacts; - gid -------------- - regress-one - regress-two +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; + gid +-------------- + regress_sub1 + regress_sub2 (2 rows) -- pxtest3 should be locked because of the pending DROP @@ -217,11 +217,11 @@ rollback; -- Disconnect, we will continue testing in a different backend \c - -- There should still be two prepared transactions -SELECT gid FROM pg_prepared_xacts; - gid -------------- - regress-one - regress-two +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; + gid +-------------- + regress_sub1 + regress_sub2 (2 rows) -- pxtest3 should still be locked because of the pending DROP @@ -230,7 +230,7 @@ lock table pxtest3 in access share mode nowait; ERROR: could not obtain lock on relation "pxtest3" rollback; -- Commit table creation -COMMIT PREPARED 'regress-one'; +COMMIT PREPARED 'regress_sub1'; \d pxtest2 Table "public.pxtest2" Column | Type | Collation | Nullable | Default @@ -245,20 +245,20 @@ SELECT * FROM pxtest2; (2 rows) -- There should be one prepared transaction -SELECT gid FROM pg_prepared_xacts; - gid -------------- - regress-two +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; + gid +-------------- + regress_sub2 (1 row) -- Commit table drop -COMMIT PREPARED 'regress-two'; +COMMIT PREPARED 'regress_sub2'; SELECT * FROM pxtest3; ERROR: relation "pxtest3" does not exist LINE 1: SELECT * FROM pxtest3; ^ -- There should be no prepared transactions -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; gid ----- (0 rows) diff --git a/src/test/regress/expected/prepared_xacts_1.out b/src/test/regress/expected/prepared_xacts_1.out index 2cd50ad947003..6ad3d11898a71 100644 --- a/src/test/regress/expected/prepared_xacts_1.out +++ b/src/test/regress/expected/prepared_xacts_1.out @@ -17,9 +17,9 @@ SELECT * FROM pxtest1; bbb (1 row) -PREPARE TRANSACTION 'foo1'; +PREPARE TRANSACTION 'regress_foo1'; ERROR: prepared transactions are disabled -HINT: Set max_prepared_transactions to a nonzero value. +HINT: Set "max_prepared_transactions" to a nonzero value. SELECT * FROM pxtest1; foobar -------- @@ -27,21 +27,21 @@ SELECT * FROM pxtest1; (1 row) -- Test pg_prepared_xacts system view -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; gid ----- (0 rows) -- Test ROLLBACK PREPARED -ROLLBACK PREPARED 'foo1'; -ERROR: prepared transaction with identifier "foo1" does not exist +ROLLBACK PREPARED 'regress_foo1'; +ERROR: prepared transaction with identifier "regress_foo1" does not exist SELECT * FROM pxtest1; foobar -------- aaa (1 row) -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; gid ----- (0 rows) @@ -56,17 +56,17 @@ SELECT * FROM pxtest1; ddd (2 rows) -PREPARE TRANSACTION 'foo2'; +PREPARE TRANSACTION 'regress_foo2'; ERROR: prepared transactions are disabled -HINT: Set max_prepared_transactions to a nonzero value. +HINT: Set "max_prepared_transactions" to a nonzero value. SELECT * FROM pxtest1; foobar -------- aaa (1 row) -COMMIT PREPARED 'foo2'; -ERROR: prepared transaction with identifier "foo2" does not exist +COMMIT PREPARED 'regress_foo2'; +ERROR: prepared transaction with identifier "regress_foo2" does not exist SELECT * FROM pxtest1; foobar -------- @@ -82,10 +82,10 @@ SELECT * FROM pxtest1; aaa (1 row) -PREPARE TRANSACTION 'foo3'; +PREPARE TRANSACTION 'regress_foo3'; ERROR: prepared transactions are disabled -HINT: Set max_prepared_transactions to a nonzero value. -SELECT gid FROM pg_prepared_xacts; +HINT: Set "max_prepared_transactions" to a nonzero value. +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; gid ----- (0 rows) @@ -93,17 +93,17 @@ SELECT gid FROM pg_prepared_xacts; BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; INSERT INTO pxtest1 VALUES ('fff'); -- This should fail, because the gid foo3 is already in use -PREPARE TRANSACTION 'foo3'; +PREPARE TRANSACTION 'regress_foo3'; ERROR: prepared transactions are disabled -HINT: Set max_prepared_transactions to a nonzero value. +HINT: Set "max_prepared_transactions" to a nonzero value. SELECT * FROM pxtest1; foobar -------- aaa (1 row) -ROLLBACK PREPARED 'foo3'; -ERROR: prepared transaction with identifier "foo3" does not exist +ROLLBACK PREPARED 'regress_foo3'; +ERROR: prepared transaction with identifier "regress_foo3" does not exist SELECT * FROM pxtest1; foobar -------- @@ -119,10 +119,10 @@ SELECT * FROM pxtest1; aaa (1 row) -PREPARE TRANSACTION 'foo4'; +PREPARE TRANSACTION 'regress_foo4'; ERROR: prepared transactions are disabled -HINT: Set max_prepared_transactions to a nonzero value. -SELECT gid FROM pg_prepared_xacts; +HINT: Set "max_prepared_transactions" to a nonzero value. +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; gid ----- (0 rows) @@ -136,17 +136,17 @@ SELECT * FROM pxtest1; -- This should fail, because the two transactions have a write-skew anomaly INSERT INTO pxtest1 VALUES ('fff'); -PREPARE TRANSACTION 'foo5'; +PREPARE TRANSACTION 'regress_foo5'; ERROR: prepared transactions are disabled -HINT: Set max_prepared_transactions to a nonzero value. -SELECT gid FROM pg_prepared_xacts; +HINT: Set "max_prepared_transactions" to a nonzero value. +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; gid ----- (0 rows) -ROLLBACK PREPARED 'foo4'; -ERROR: prepared transaction with identifier "foo4" does not exist -SELECT gid FROM pg_prepared_xacts; +ROLLBACK PREPARED 'regress_foo4'; +ERROR: prepared transaction with identifier "regress_foo4" does not exist +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; gid ----- (0 rows) @@ -167,9 +167,9 @@ SELECT pg_advisory_xact_lock_shared(1); (1 row) -PREPARE TRANSACTION 'foo6'; -- fails +PREPARE TRANSACTION 'regress_foo6'; -- fails ERROR: prepared transactions are disabled -HINT: Set max_prepared_transactions to a nonzero value. +HINT: Set "max_prepared_transactions" to a nonzero value. -- Test subtransactions BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; CREATE TABLE pxtest2 (a int); @@ -179,9 +179,9 @@ BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; ROLLBACK TO a; SAVEPOINT b; INSERT INTO pxtest2 VALUES (3); -PREPARE TRANSACTION 'regress-one'; +PREPARE TRANSACTION 'regress_sub1'; ERROR: prepared transactions are disabled -HINT: Set max_prepared_transactions to a nonzero value. +HINT: Set "max_prepared_transactions" to a nonzero value. CREATE TABLE pxtest3(fff int); -- Test shared invalidation BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; @@ -197,9 +197,9 @@ BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; 1 (1 row) -PREPARE TRANSACTION 'regress-two'; +PREPARE TRANSACTION 'regress_sub2'; ERROR: prepared transactions are disabled -HINT: Set max_prepared_transactions to a nonzero value. +HINT: Set "max_prepared_transactions" to a nonzero value. -- No such cursor FETCH 1 FROM foo; ERROR: cursor "foo" does not exist @@ -209,7 +209,7 @@ ERROR: relation "pxtest2" does not exist LINE 1: SELECT * FROM pxtest2; ^ -- There should be two prepared transactions -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; gid ----- (0 rows) @@ -221,7 +221,7 @@ rollback; -- Disconnect, we will continue testing in a different backend \c - -- There should still be two prepared transactions -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; gid ----- (0 rows) @@ -231,29 +231,29 @@ begin; lock table pxtest3 in access share mode nowait; rollback; -- Commit table creation -COMMIT PREPARED 'regress-one'; -ERROR: prepared transaction with identifier "regress-one" does not exist +COMMIT PREPARED 'regress_sub1'; +ERROR: prepared transaction with identifier "regress_sub1" does not exist \d pxtest2 SELECT * FROM pxtest2; ERROR: relation "pxtest2" does not exist LINE 1: SELECT * FROM pxtest2; ^ -- There should be one prepared transaction -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; gid ----- (0 rows) -- Commit table drop -COMMIT PREPARED 'regress-two'; -ERROR: prepared transaction with identifier "regress-two" does not exist +COMMIT PREPARED 'regress_sub2'; +ERROR: prepared transaction with identifier "regress_sub2" does not exist SELECT * FROM pxtest3; fff ----- (0 rows) -- There should be no prepared transactions -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; gid ----- (0 rows) diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out index 3e4dfcc2ec2ec..e8c668e0a11f7 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -141,6 +141,73 @@ SET ROLE pg_read_all_stats; -- fail, granted without SET option ERROR: permission denied to set role "pg_read_all_stats" RESET ROLE; RESET SESSION AUTHORIZATION; +-- test interaction of SET SESSION AUTHORIZATION and SET ROLE, +-- as well as propagation of these settings to parallel workers +GRANT regress_priv_user9 TO regress_priv_user8; +SET SESSION AUTHORIZATION regress_priv_user8; +SET ROLE regress_priv_user9; +SET debug_parallel_query = 0; +SELECT session_user, current_role, current_user, current_setting('role') as role; + session_user | current_role | current_user | role +--------------------+--------------------+--------------------+-------------------- + regress_priv_user8 | regress_priv_user9 | regress_priv_user9 | regress_priv_user9 +(1 row) + +SET debug_parallel_query = 1; +SELECT session_user, current_role, current_user, current_setting('role') as role; + session_user | current_role | current_user | role +--------------------+--------------------+--------------------+-------------------- + regress_priv_user8 | regress_priv_user9 | regress_priv_user9 | regress_priv_user9 +(1 row) + +BEGIN; +SET SESSION AUTHORIZATION regress_priv_user10; +SET debug_parallel_query = 0; +SELECT session_user, current_role, current_user, current_setting('role') as role; + session_user | current_role | current_user | role +---------------------+---------------------+---------------------+------ + regress_priv_user10 | regress_priv_user10 | regress_priv_user10 | none +(1 row) + +SET debug_parallel_query = 1; +SELECT session_user, current_role, current_user, current_setting('role') as role; + session_user | current_role | current_user | role +---------------------+---------------------+---------------------+------ + regress_priv_user10 | regress_priv_user10 | regress_priv_user10 | none +(1 row) + +ROLLBACK; +SET debug_parallel_query = 0; +SELECT session_user, current_role, current_user, current_setting('role') as role; + session_user | current_role | current_user | role +--------------------+--------------------+--------------------+-------------------- + regress_priv_user8 | regress_priv_user9 | regress_priv_user9 | regress_priv_user9 +(1 row) + +SET debug_parallel_query = 1; +SELECT session_user, current_role, current_user, current_setting('role') as role; + session_user | current_role | current_user | role +--------------------+--------------------+--------------------+-------------------- + regress_priv_user8 | regress_priv_user9 | regress_priv_user9 | regress_priv_user9 +(1 row) + +RESET SESSION AUTHORIZATION; +-- session_user at this point is installation-dependent +SET debug_parallel_query = 0; +SELECT session_user = current_role as c_r_ok, session_user = current_user as c_u_ok, current_setting('role') as role; + c_r_ok | c_u_ok | role +--------+--------+------ + t | t | none +(1 row) + +SET debug_parallel_query = 1; +SELECT session_user = current_role as c_r_ok, session_user = current_user as c_u_ok, current_setting('role') as role; + c_r_ok | c_u_ok | role +--------+--------+------ + t | t | none +(1 row) + +RESET debug_parallel_query; REVOKE pg_read_all_settings FROM regress_priv_user8; DROP USER regress_priv_user10; DROP USER regress_priv_user9; @@ -149,6 +216,13 @@ CREATE GROUP regress_priv_group1; CREATE GROUP regress_priv_group2 WITH ADMIN regress_priv_user1 USER regress_priv_user2; ALTER GROUP regress_priv_group1 ADD USER regress_priv_user4; GRANT regress_priv_group2 TO regress_priv_user2 GRANTED BY regress_priv_user1; +SET SESSION AUTHORIZATION regress_priv_user3; +ALTER GROUP regress_priv_group2 ADD USER regress_priv_user2; -- fail +ERROR: permission denied to alter role +DETAIL: Only roles with the ADMIN option on role "regress_priv_group2" may add or drop members. +ALTER GROUP regress_priv_group2 DROP USER regress_priv_user2; -- fail +ERROR: permission denied to alter role +DETAIL: Only roles with the ADMIN option on role "regress_priv_group2" may add or drop members. SET SESSION AUTHORIZATION regress_priv_user1; ALTER GROUP regress_priv_group2 ADD USER regress_priv_user2; NOTICE: role "regress_priv_user2" has already been granted membership in role "regress_priv_group2" by role "regress_priv_user1" @@ -1769,7 +1843,7 @@ SET SESSION AUTHORIZATION regress_sro_user; CREATE FUNCTION unwanted_grant() RETURNS void LANGUAGE sql AS 'GRANT regress_priv_group2 TO regress_sro_user'; CREATE FUNCTION mv_action() RETURNS bool LANGUAGE sql AS - 'DECLARE c CURSOR WITH HOLD FOR SELECT unwanted_grant(); SELECT true'; + 'DECLARE c CURSOR WITH HOLD FOR SELECT public.unwanted_grant(); SELECT true'; -- REFRESH of this MV will queue a GRANT at end of transaction CREATE MATERIALIZED VIEW sro_mv AS SELECT mv_action() WITH NO DATA; REFRESH MATERIALIZED VIEW sro_mv; @@ -1783,12 +1857,12 @@ SET SESSION AUTHORIZATION regress_sro_user; -- INSERT to this table will queue a GRANT at end of transaction CREATE TABLE sro_trojan_table (); CREATE FUNCTION sro_trojan() RETURNS trigger LANGUAGE plpgsql AS - 'BEGIN PERFORM unwanted_grant(); RETURN NULL; END'; + 'BEGIN PERFORM public.unwanted_grant(); RETURN NULL; END'; CREATE CONSTRAINT TRIGGER t AFTER INSERT ON sro_trojan_table INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE sro_trojan(); -- Now, REFRESH will issue such an INSERT, queueing the GRANT CREATE OR REPLACE FUNCTION mv_action() RETURNS bool LANGUAGE sql AS - 'INSERT INTO sro_trojan_table DEFAULT VALUES; SELECT true'; + 'INSERT INTO public.sro_trojan_table DEFAULT VALUES; SELECT true'; REFRESH MATERIALIZED VIEW sro_mv; ERROR: cannot fire deferred trigger within security-restricted operation CONTEXT: SQL function "mv_action" statement 1 @@ -1800,15 +1874,15 @@ BEGIN; SET CONSTRAINTS ALL IMMEDIATE; REFRESH MATERIALIZED VIEW sro_mv; COMMIT; ERROR: permission denied to grant role "regress_priv_group2" DETAIL: Only roles with the ADMIN option on role "regress_priv_group2" may grant this role. CONTEXT: SQL function "unwanted_grant" statement 1 -SQL statement "SELECT unwanted_grant()" -PL/pgSQL function sro_trojan() line 1 at PERFORM +SQL statement "SELECT public.unwanted_grant()" +PL/pgSQL function public.sro_trojan() line 1 at PERFORM SQL function "mv_action" statement 1 -- REFRESH MATERIALIZED VIEW CONCURRENTLY use of eval_const_expressions() SET SESSION AUTHORIZATION regress_sro_user; CREATE FUNCTION unwanted_grant_nofail(int) RETURNS int IMMUTABLE LANGUAGE plpgsql AS $$ BEGIN - PERFORM unwanted_grant(); + PERFORM public.unwanted_grant(); RAISE WARNING 'owned'; RETURN 1; EXCEPTION WHEN OTHERS THEN @@ -2083,6 +2157,24 @@ SELECT * FROM pg_largeobject LIMIT 0; SET SESSION AUTHORIZATION regress_priv_user1; SELECT * FROM pg_largeobject LIMIT 0; -- to be denied ERROR: permission denied for table pg_largeobject +-- pg_signal_backend can't signal superusers +RESET SESSION AUTHORIZATION; +BEGIN; +CREATE OR REPLACE FUNCTION terminate_nothrow(pid int) RETURNS bool + LANGUAGE plpgsql SECURITY DEFINER SET client_min_messages = error AS $$ +BEGIN + RETURN pg_terminate_backend($1); +EXCEPTION WHEN OTHERS THEN + RETURN false; +END$$; +ALTER FUNCTION terminate_nothrow OWNER TO pg_signal_backend; +SELECT backend_type FROM pg_stat_activity +WHERE CASE WHEN COALESCE(usesysid, 10) = 10 THEN terminate_nothrow(pid) END; + backend_type +-------------- +(0 rows) + +ROLLBACK; -- test pg_database_owner RESET SESSION AUTHORIZATION; GRANT pg_database_owner TO regress_priv_user1; @@ -2930,7 +3022,7 @@ WARNING: permission denied to vacuum "maintain_test", skipping it CLUSTER maintain_test USING maintain_test_a_idx; ERROR: permission denied for table maintain_test REFRESH MATERIALIZED VIEW refresh_test; -ERROR: permission denied for table refresh_test +ERROR: permission denied for materialized view refresh_test REINDEX TABLE maintain_test; ERROR: permission denied for table maintain_test REINDEX INDEX maintain_test_a_idx; diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out index c062c3dc7b5b6..3bbe4c5f974d6 100644 --- a/src/test/regress/expected/psql.out +++ b/src/test/regress/expected/psql.out @@ -171,6 +171,11 @@ select 10 as test01, 20 as test02 from generate_series(1,3) \gset more than one row returned for \gset select 10 as test01, 20 as test02 from generate_series(1,0) \gset no rows returned for \gset +-- \gset returns no tuples +select a from generate_series(1, 10) as a where a = 11 \gset +no rows returned for \gset +\echo :ROW_COUNT +0 -- \gset should work in FETCH_COUNT mode too \set FETCH_COUNT 1 select 1 as x, 2 as y \gset pref01_ \\ \echo :pref01_x @@ -4501,6 +4506,7 @@ bar 'bar' "bar" \echo `nosuchcommand` :foo :'foo' :"foo" \pset fieldsep | `nosuchcommand` :foo :'foo' :"foo" \a + SELECT $1 \bind 1 \g \C arg1 \c arg1 arg2 arg3 arg4 \cd arg1 @@ -4749,7 +4755,7 @@ number of rows: 0 last error message: syntax error at end of input \echo 'last error code:' :LAST_ERROR_SQLSTATE last error code: 42601 --- check row count for a cursor-fetched query +-- check row count for a query with chunked results \set FETCH_COUNT 10 select unique2 from tenk1 order by unique2 limit 19; unique2 @@ -4781,7 +4787,9 @@ error: false error code: 00000 \echo 'number of rows:' :ROW_COUNT number of rows: 19 --- cursor-fetched query with an error after the first group +-- chunked results with an error after the first chunk +-- (we must disable parallel query here, else the behavior is timing-dependent) +set debug_parallel_query = off; select 1/(15-unique2) from tenk1 order by unique2 limit 19; ?column? ---------- @@ -4806,6 +4814,7 @@ number of rows: 0 last error message: division by zero \echo 'last error code:' :LAST_ERROR_SQLSTATE last error code: 22012 +reset debug_parallel_query; \unset FETCH_COUNT create schema testpart; create role regress_partitioning_role; @@ -5288,33 +5297,37 @@ comment on function psql_df_plpgsql () is 'some comment'; rollback; drop role regress_psql_user; -- check \sf -\sf information_schema._pg_expandarray -CREATE OR REPLACE FUNCTION information_schema._pg_expandarray(anyarray, OUT x anyelement, OUT n integer) - RETURNS SETOF record +\sf information_schema._pg_index_position +CREATE OR REPLACE FUNCTION information_schema._pg_index_position(oid, smallint) + RETURNS integer LANGUAGE sql - IMMUTABLE PARALLEL SAFE STRICT -AS $function$select $1[s], - s operator(pg_catalog.-) pg_catalog.array_lower($1,1) operator(pg_catalog.+) 1 - from pg_catalog.generate_series(pg_catalog.array_lower($1,1), - pg_catalog.array_upper($1,1), - 1) as g(s)$function$ -\sf+ information_schema._pg_expandarray - CREATE OR REPLACE FUNCTION information_schema._pg_expandarray(anyarray, OUT x anyelement, OUT n integer) - RETURNS SETOF record + STABLE STRICT +BEGIN ATOMIC + SELECT (ss.a).n AS n + FROM ( SELECT information_schema._pg_expandarray(pg_index.indkey) AS a + FROM pg_index + WHERE (pg_index.indexrelid = $1)) ss + WHERE ((ss.a).x = $2); +END +\sf+ information_schema._pg_index_position + CREATE OR REPLACE FUNCTION information_schema._pg_index_position(oid, smallint) + RETURNS integer LANGUAGE sql - IMMUTABLE PARALLEL SAFE STRICT -1 AS $function$select $1[s], -2 s operator(pg_catalog.-) pg_catalog.array_lower($1,1) operator(pg_catalog.+) 1 -3 from pg_catalog.generate_series(pg_catalog.array_lower($1,1), -4 pg_catalog.array_upper($1,1), -5 1) as g(s)$function$ + STABLE STRICT +1 BEGIN ATOMIC +2 SELECT (ss.a).n AS n +3 FROM ( SELECT information_schema._pg_expandarray(pg_index.indkey) AS a +4 FROM pg_index +5 WHERE (pg_index.indexrelid = $1)) ss +6 WHERE ((ss.a).x = $2); +7 END \sf+ interval_pl_time CREATE OR REPLACE FUNCTION pg_catalog.interval_pl_time(interval, time without time zone) RETURNS time without time zone LANGUAGE sql IMMUTABLE PARALLEL SAFE STRICT COST 1 1 RETURN ($2 + $1) -\sf ts_debug(text) +\sf ts_debug(text); CREATE OR REPLACE FUNCTION pg_catalog.ts_debug(document text, OUT alias text, OUT description text, OUT token text, OUT dictionaries regdictionary[], OUT dictionary regdictionary, OUT lexemes text[]) RETURNS SETOF record LANGUAGE sql @@ -5807,6 +5820,7 @@ SELECT * FROM bla ORDER BY 1; Susie (5 rows) +COMMIT; -- reset all \set AUTOCOMMIT on \set ON_ERROR_ROLLBACK off @@ -6187,9 +6201,9 @@ List of text search templates (0 rows) \dg "no.such.role" - List of roles - Role name | Attributes | Member of ------------+------------+----------- + List of roles + Role name | Attributes +-----------+------------ \dL "no.such.language" List of languages @@ -6210,9 +6224,9 @@ List of schemas (0 rows) \dO "no.such.collation" - List of collations - Schema | Name | Provider | Collate | Ctype | ICU Locale | ICU Rules | Deterministic? ---------+------+----------+---------+-------+------------+-----------+---------------- + List of collations + Schema | Name | Provider | Collate | Ctype | Locale | ICU Rules | Deterministic? +--------+------+----------+---------+-------+--------+-----------+---------------- (0 rows) \dp "no.such.access.privilege" @@ -6399,9 +6413,9 @@ cross-database references are not implemented: "no.such.schema"."no.such.languag (0 rows) \dO "no.such.schema"."no.such.collation" - List of collations - Schema | Name | Provider | Collate | Ctype | ICU Locale | ICU Rules | Deterministic? ---------+------+----------+---------+-------+------------+-----------+---------------- + List of collations + Schema | Name | Provider | Collate | Ctype | Locale | ICU Rules | Deterministic? +--------+------+----------+---------+-------+--------+-----------+---------------- (0 rows) \dp "no.such.schema"."no.such.access.privilege" @@ -6542,9 +6556,9 @@ List of text search templates (0 rows) \dO regression."no.such.schema"."no.such.collation" - List of collations - Schema | Name | Provider | Collate | Ctype | ICU Locale | ICU Rules | Deterministic? ---------+------+----------+---------+-------+------------+-----------+---------------- + List of collations + Schema | Name | Provider | Collate | Ctype | Locale | ICU Rules | Deterministic? +--------+------+----------+---------+-------+--------+-----------+---------------- (0 rows) \dp regression."no.such.schema"."no.such.access.privilege" @@ -6618,3 +6632,97 @@ cross-database references are not implemented: "no.such.database"."no.such.schem cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.data.type" \dX "no.such.database"."no.such.schema"."no.such.extended.statistics" cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.extended.statistics" +-- check \drg and \du +CREATE ROLE regress_du_role0; +CREATE ROLE regress_du_role1; +CREATE ROLE regress_du_role2; +CREATE ROLE regress_du_admin; +GRANT regress_du_role0 TO regress_du_admin WITH ADMIN TRUE; +GRANT regress_du_role1 TO regress_du_admin WITH ADMIN TRUE; +GRANT regress_du_role2 TO regress_du_admin WITH ADMIN TRUE; +GRANT regress_du_role0 TO regress_du_role1 WITH ADMIN TRUE, INHERIT TRUE, SET TRUE GRANTED BY regress_du_admin; +GRANT regress_du_role0 TO regress_du_role2 WITH ADMIN TRUE, INHERIT FALSE, SET FALSE GRANTED BY regress_du_admin; +GRANT regress_du_role1 TO regress_du_role2 WITH ADMIN TRUE , INHERIT FALSE, SET TRUE GRANTED BY regress_du_admin; +GRANT regress_du_role0 TO regress_du_role1 WITH ADMIN FALSE, INHERIT TRUE, SET FALSE GRANTED BY regress_du_role1; +GRANT regress_du_role0 TO regress_du_role2 WITH ADMIN FALSE, INHERIT TRUE , SET TRUE GRANTED BY regress_du_role1; +GRANT regress_du_role0 TO regress_du_role1 WITH ADMIN FALSE, INHERIT FALSE, SET TRUE GRANTED BY regress_du_role2; +GRANT regress_du_role0 TO regress_du_role2 WITH ADMIN FALSE, INHERIT FALSE, SET FALSE GRANTED BY regress_du_role2; +\drg regress_du_role* + List of role grants + Role name | Member of | Options | Grantor +------------------+------------------+---------------------+------------------ + regress_du_role1 | regress_du_role0 | ADMIN, INHERIT, SET | regress_du_admin + regress_du_role1 | regress_du_role0 | INHERIT | regress_du_role1 + regress_du_role1 | regress_du_role0 | SET | regress_du_role2 + regress_du_role2 | regress_du_role0 | ADMIN | regress_du_admin + regress_du_role2 | regress_du_role0 | INHERIT, SET | regress_du_role1 + regress_du_role2 | regress_du_role0 | | regress_du_role2 + regress_du_role2 | regress_du_role1 | ADMIN, SET | regress_du_admin +(7 rows) + +\du regress_du_role* + List of roles + Role name | Attributes +------------------+-------------- + regress_du_role0 | Cannot login + regress_du_role1 | Cannot login + regress_du_role2 | Cannot login + +DROP ROLE regress_du_role0; +DROP ROLE regress_du_role1; +DROP ROLE regress_du_role2; +DROP ROLE regress_du_admin; +-- Test display of empty privileges. +BEGIN; +-- Create an owner for tested objects because output contains owner name. +CREATE ROLE regress_zeropriv_owner; +SET LOCAL ROLE regress_zeropriv_owner; +CREATE DOMAIN regress_zeropriv_domain AS int; +REVOKE ALL ON DOMAIN regress_zeropriv_domain FROM CURRENT_USER, PUBLIC; +\dD+ regress_zeropriv_domain + List of domains + Schema | Name | Type | Collation | Nullable | Default | Check | Access privileges | Description +--------+-------------------------+---------+-----------+----------+---------+-------+-------------------+------------- + public | regress_zeropriv_domain | integer | | | | | (none) | +(1 row) + +CREATE PROCEDURE regress_zeropriv_proc() LANGUAGE sql AS ''; +REVOKE ALL ON PROCEDURE regress_zeropriv_proc() FROM CURRENT_USER, PUBLIC; +\df+ regress_zeropriv_proc + List of functions + Schema | Name | Result data type | Argument data types | Type | Volatility | Parallel | Owner | Security | Access privileges | Language | Internal name | Description +--------+-----------------------+------------------+---------------------+------+------------+----------+------------------------+----------+-------------------+----------+---------------+------------- + public | regress_zeropriv_proc | | | proc | volatile | unsafe | regress_zeropriv_owner | invoker | (none) | sql | | +(1 row) + +CREATE TABLE regress_zeropriv_tbl (a int); +REVOKE ALL ON TABLE regress_zeropriv_tbl FROM CURRENT_USER; +\dp regress_zeropriv_tbl + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+----------------------+-------+-------------------+-------------------+---------- + public | regress_zeropriv_tbl | table | (none) | | +(1 row) + +CREATE TYPE regress_zeropriv_type AS (a int); +REVOKE ALL ON TYPE regress_zeropriv_type FROM CURRENT_USER, PUBLIC; +\dT+ regress_zeropriv_type + List of data types + Schema | Name | Internal name | Size | Elements | Owner | Access privileges | Description +--------+-----------------------+-----------------------+-------+----------+------------------------+-------------------+------------- + public | regress_zeropriv_type | regress_zeropriv_type | tuple | | regress_zeropriv_owner | (none) | +(1 row) + +ROLLBACK; +-- Test display of default privileges with \pset null. +CREATE TABLE defprivs (a int); +\pset null '(default)' +\z defprivs + Access privileges + Schema | Name | Type | Access privileges | Column privileges | Policies +--------+----------+-------+-------------------+-------------------+---------- + public | defprivs | table | (default) | | +(1 row) + +\pset null '' +DROP TABLE defprivs; diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index 69dc6cfd8593d..30b637113404f 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -730,6 +730,16 @@ ALTER PUBLICATION testpub_table_ins ADD TABLE testpub_tbl5 (a); -- ok Tables: "public.testpub_tbl5" (a) +-- error: cannot work with deferrable primary keys +CREATE TABLE testpub_tbl5d (a int PRIMARY KEY DEFERRABLE); +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5d; +UPDATE testpub_tbl5d SET a = 1; +ERROR: cannot update table "testpub_tbl5d" because it does not have a replica identity and publishes updates +HINT: To enable updating the table, set REPLICA IDENTITY using ALTER TABLE. +/* but works fine with FULL replica identity */ +ALTER TABLE testpub_tbl5d REPLICA IDENTITY FULL; +UPDATE testpub_tbl5d SET a = 1; +DROP TABLE testpub_tbl5d; -- tests with REPLICA IDENTITY FULL CREATE TABLE testpub_tbl6 (a int, b text, c text); ALTER TABLE testpub_tbl6 REPLICA IDENTITY FULL; @@ -933,10 +943,10 @@ ALTER TABLE rf_tbl_abcd_part_pk ATTACH PARTITION rf_tbl_abcd_part_pk_1 FOR VALUE SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub6 FOR TABLE rf_tbl_abcd_pk (a, b); RESET client_min_messages; --- ok - (a,b) coverts all PK cols +-- ok - (a,b) covers all PK cols UPDATE rf_tbl_abcd_pk SET a = 1; ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a, b, c); --- ok - (a,b,c) coverts all PK cols +-- ok - (a,b,c) covers all PK cols UPDATE rf_tbl_abcd_pk SET a = 1; ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a); -- fail - "b" is missing from the column list diff --git a/src/test/regress/expected/random.out b/src/test/regress/expected/random.out index 223590720cc95..43cf88a36341b 100644 --- a/src/test/regress/expected/random.out +++ b/src/test/regress/expected/random.out @@ -120,6 +120,229 @@ SELECT ks_test_normal_random() OR t (1 row) +-- Test random(min, max) +-- invalid range bounds +SELECT random(1, 0); +ERROR: lower bound must be less than or equal to upper bound +SELECT random(1000000000001, 1000000000000); +ERROR: lower bound must be less than or equal to upper bound +SELECT random(-2.0, -3.0); +ERROR: lower bound must be less than or equal to upper bound +SELECT random('NaN'::numeric, 10); +ERROR: lower bound cannot be NaN +SELECT random('-Inf'::numeric, 0); +ERROR: lower bound cannot be infinity +SELECT random(0, 'NaN'::numeric); +ERROR: upper bound cannot be NaN +SELECT random(0, 'Inf'::numeric); +ERROR: upper bound cannot be infinity +-- empty range is OK +SELECT random(101, 101); + random +-------- + 101 +(1 row) + +SELECT random(1000000000001, 1000000000001); + random +--------------- + 1000000000001 +(1 row) + +SELECT random(3.14, 3.14); + random +-------- + 3.14 +(1 row) + +-- There should be no triple duplicates in 1000 full-range 32-bit random() +-- values. (Each of the C(1000, 3) choices of triplets from the 1000 values +-- has a probability of 1/(2^32)^2 of being a triple duplicate, so the +-- average number of triple duplicates is 1000 * 999 * 998 / 6 / 2^64, which +-- is roughly 9e-12.) +SELECT r, count(*) +FROM (SELECT random(-2147483648, 2147483647) r + FROM generate_series(1, 1000)) ss +GROUP BY r HAVING count(*) > 2; + r | count +---+------- +(0 rows) + +-- There should be no duplicates in 1000 full-range 64-bit random() values. +SELECT r, count(*) +FROM (SELECT random_normal(-9223372036854775808, 9223372036854775807) r + FROM generate_series(1, 1000)) ss +GROUP BY r HAVING count(*) > 1; + r | count +---+------- +(0 rows) + +-- There should be no duplicates in 1000 15-digit random() numeric values. +SELECT r, count(*) +FROM (SELECT random_normal(0, 1 - 1e-15) r + FROM generate_series(1, 1000)) ss +GROUP BY r HAVING count(*) > 1; + r | count +---+------- +(0 rows) + +-- Expect at least one out of 2000 random values to be in the lowest and +-- highest 1% of the range. +SELECT (count(*) FILTER (WHERE r < -2104533975)) > 0 AS has_small, + (count(*) FILTER (WHERE r > 2104533974)) > 0 AS has_large +FROM (SELECT random(-2147483648, 2147483647) r FROM generate_series(1, 2000)) ss; + has_small | has_large +-----------+----------- + t | t +(1 row) + +SELECT count(*) FILTER (WHERE r < -1500000000 OR r > 1500000000) AS out_of_range, + (count(*) FILTER (WHERE r < -1470000000)) > 0 AS has_small, + (count(*) FILTER (WHERE r > 1470000000)) > 0 AS has_large +FROM (SELECT random(-1500000000, 1500000000) r FROM generate_series(1, 2000)) ss; + out_of_range | has_small | has_large +--------------+-----------+----------- + 0 | t | t +(1 row) + +SELECT (count(*) FILTER (WHERE r < -9038904596117680292)) > 0 AS has_small, + (count(*) FILTER (WHERE r > 9038904596117680291)) > 0 AS has_large +FROM (SELECT random(-9223372036854775808, 9223372036854775807) r + FROM generate_series(1, 2000)) ss; + has_small | has_large +-----------+----------- + t | t +(1 row) + +SELECT count(*) FILTER (WHERE r < -1500000000000000 OR r > 1500000000000000) AS out_of_range, + (count(*) FILTER (WHERE r < -1470000000000000)) > 0 AS has_small, + (count(*) FILTER (WHERE r > 1470000000000000)) > 0 AS has_large +FROM (SELECT random(-1500000000000000, 1500000000000000) r + FROM generate_series(1, 2000)) ss; + out_of_range | has_small | has_large +--------------+-----------+----------- + 0 | t | t +(1 row) + +SELECT count(*) FILTER (WHERE r < -1.5 OR r > 1.5) AS out_of_range, + (count(*) FILTER (WHERE r < -1.47)) > 0 AS has_small, + (count(*) FILTER (WHERE r > 1.47)) > 0 AS has_large +FROM (SELECT random(-1.500000000000000, 1.500000000000000) r + FROM generate_series(1, 2000)) ss; + out_of_range | has_small | has_large +--------------+-----------+----------- + 0 | t | t +(1 row) + +-- Every possible value should occur at least once in 2500 random() values +-- chosen from a range with 100 distinct values. +SELECT min(r), max(r), count(r) FROM ( + SELECT DISTINCT random(-50, 49) r FROM generate_series(1, 2500)); + min | max | count +-----+-----+------- + -50 | 49 | 100 +(1 row) + +SELECT min(r), max(r), count(r) FROM ( + SELECT DISTINCT random(123000000000, 123000000099) r + FROM generate_series(1, 2500)); + min | max | count +--------------+--------------+------- + 123000000000 | 123000000099 | 100 +(1 row) + +SELECT min(r), max(r), count(r) FROM ( + SELECT DISTINCT random(-0.5, 0.49) r FROM generate_series(1, 2500)); + min | max | count +-------+------+------- + -0.50 | 0.49 | 100 +(1 row) + +-- Check for uniform distribution using the Kolmogorov-Smirnov test. +CREATE FUNCTION ks_test_uniform_random_int_in_range() +RETURNS boolean AS +$$ +DECLARE + n int := 1000; -- Number of samples + c float8 := 1.94947; -- Critical value for 99.9% confidence + ok boolean; +BEGIN + ok := ( + WITH samples AS ( + SELECT random(0, 999999) / 1000000.0 r FROM generate_series(1, n) ORDER BY 1 + ), indexed_samples AS ( + SELECT (row_number() OVER())-1.0 i, r FROM samples + ) + SELECT max(abs(i/n-r)) < c / sqrt(n) FROM indexed_samples + ); + RETURN ok; +END +$$ +LANGUAGE plpgsql; +SELECT ks_test_uniform_random_int_in_range() OR + ks_test_uniform_random_int_in_range() OR + ks_test_uniform_random_int_in_range() AS uniform_int; + uniform_int +------------- + t +(1 row) + +CREATE FUNCTION ks_test_uniform_random_bigint_in_range() +RETURNS boolean AS +$$ +DECLARE + n int := 1000; -- Number of samples + c float8 := 1.94947; -- Critical value for 99.9% confidence + ok boolean; +BEGIN + ok := ( + WITH samples AS ( + SELECT random(0, 999999999999) / 1000000000000.0 r FROM generate_series(1, n) ORDER BY 1 + ), indexed_samples AS ( + SELECT (row_number() OVER())-1.0 i, r FROM samples + ) + SELECT max(abs(i/n-r)) < c / sqrt(n) FROM indexed_samples + ); + RETURN ok; +END +$$ +LANGUAGE plpgsql; +SELECT ks_test_uniform_random_bigint_in_range() OR + ks_test_uniform_random_bigint_in_range() OR + ks_test_uniform_random_bigint_in_range() AS uniform_bigint; + uniform_bigint +---------------- + t +(1 row) + +CREATE FUNCTION ks_test_uniform_random_numeric_in_range() +RETURNS boolean AS +$$ +DECLARE + n int := 1000; -- Number of samples + c float8 := 1.94947; -- Critical value for 99.9% confidence + ok boolean; +BEGIN + ok := ( + WITH samples AS ( + SELECT random(0, 0.999999) r FROM generate_series(1, n) ORDER BY 1 + ), indexed_samples AS ( + SELECT (row_number() OVER())-1.0 i, r FROM samples + ) + SELECT max(abs(i/n-r)) < c / sqrt(n) FROM indexed_samples + ); + RETURN ok; +END +$$ +LANGUAGE plpgsql; +SELECT ks_test_uniform_random_numeric_in_range() OR + ks_test_uniform_random_numeric_in_range() OR + ks_test_uniform_random_numeric_in_range() AS uniform_numeric; + uniform_numeric +----------------- + t +(1 row) + -- setseed() should produce a reproducible series of random() values. SELECT setseed(0.5); setseed @@ -176,3 +399,140 @@ SELECT random_normal(mean => 1, stddev => 0.1) r FROM generate_series(1, 10); 0.96403105557543 (10 rows) +-- Reproducible random(min, max) values. +SELECT random(1, 6) FROM generate_series(1, 10); + random +-------- + 5 + 4 + 5 + 1 + 6 + 1 + 1 + 3 + 6 + 5 +(10 rows) + +SELECT random(-2147483648, 2147483647) FROM generate_series(1, 10); + random +------------- + -84380014 + 1287883594 + -1927252904 + 13516867 + -1902961616 + -1824286201 + -871264469 + -1225880415 + 229836730 + -116039023 +(10 rows) + +SELECT random(-9223372036854775808, 9223372036854775807) FROM generate_series(1, 10); + random +---------------------- + -6205280962992680052 + -3583519428011353337 + 511801786318122700 + 4672737727839409655 + -6674868801536280768 + -7816052100626646489 + -4340613370136007199 + -5873174504107419786 + -2249910101649817824 + -4493828993910792325 +(10 rows) + +SELECT random(-1e30, 1e30) FROM generate_series(1, 10); + random +--------------------------------- + -732116469803315942112255539315 + 794641423514877972798449289857 + -576932746026123093304638334719 + 420625067723533225139761854757 + -339227806779403187811001078919 + -77667951539418104959241732636 + 239810941795708162629328071599 + 820784371155896967052141946697 + -377084684544126871150439048352 + -979773225250716295007225086726 +(10 rows) + +SELECT random(-0.4, 0.4) FROM generate_series(1, 10); + random +-------- + 0.1 + 0.0 + 0.4 + -0.2 + 0.1 + 0.2 + 0.3 + 0.0 + -0.2 + 0.2 +(10 rows) + +SELECT random(0, 1 - 1e-30) FROM generate_series(1, 10); + random +---------------------------------- + 0.676442053784930109917469287265 + 0.221310454098356723569995592911 + 0.060101338174419259555193956224 + 0.509960354695248239243002172364 + 0.248680813394555793693952296993 + 0.353262552880008646603494668901 + 0.760692600450339509843044233719 + 0.554987655310094483449494782510 + 0.330890988458592995280347745733 + 0.665435298280470361228607881507 +(10 rows) + +SELECT n, random(0, trim_scale(abs(1 - 10.0^(-n)))) FROM generate_series(-20, 20) n; + n | random +-----+------------------------ + -20 | 94174615760837282445 + -19 | 6692559888531296894 + -18 | 801114552709125931 + -17 | 44091460959939971 + -16 | 2956109297383113 + -15 | 783332278684523 + -14 | 81534303241440 + -13 | 2892623140500 + -12 | 269397605141 + -11 | 13027512296 + -10 | 9178377775 + -9 | 323534150 + -8 | 91897803 + -7 | 6091383 + -6 | 13174 + -5 | 92714 + -4 | 8079 + -3 | 429 + -2 | 30 + -1 | 3 + 0 | 0 + 1 | 0.1 + 2 | 0.69 + 3 | 0.492 + 4 | 0.7380 + 5 | 0.77078 + 6 | 0.738142 + 7 | 0.1808815 + 8 | 0.14908933 + 9 | 0.222654042 + 10 | 0.2281295170 + 11 | 0.73655782966 + 12 | 0.056357256884 + 13 | 0.8998407524375 + 14 | 0.28198400530206 + 15 | 0.713478222805230 + 16 | 0.0415046850936909 + 17 | 0.45946350291315119 + 18 | 0.310966980367873753 + 19 | 0.4967623661709676512 + 20 | 0.60795101234744211935 +(41 rows) + diff --git a/src/test/regress/expected/rangefuncs.out b/src/test/regress/expected/rangefuncs.out index fbb840e848d77..397a8b35d6d5c 100644 --- a/src/test/regress/expected/rangefuncs.out +++ b/src/test/regress/expected/rangefuncs.out @@ -2485,3 +2485,19 @@ select * from [{"id": "1"}] | 1 (1 row) +-- check detection of mismatching record types with a const-folded expression +with a(b) as (values (row(1,2,3))) +select * from a, coalesce(b) as c(d int, e int); -- fail +ERROR: function return row and query-specified return row do not match +DETAIL: Returned row contains 3 attributes, but query expects 2. +with a(b) as (values (row(1,2,3))) +select * from a, coalesce(b) as c(d int, e int, f int, g int); -- fail +ERROR: function return row and query-specified return row do not match +DETAIL: Returned row contains 3 attributes, but query expects 4. +with a(b) as (values (row(1,2,3))) +select * from a, coalesce(b) as c(d int, e int, f float); -- fail +ERROR: function return row and query-specified return row do not match +DETAIL: Returned type integer at ordinal position 3, but query expects double precision. +select * from int8_tbl, coalesce(row(1)) as (a int, b int); -- fail +ERROR: function return row and query-specified return row do not match +DETAIL: Returned row contains 1 attribute, but query expects 2. diff --git a/src/test/regress/expected/rangetypes.out b/src/test/regress/expected/rangetypes.out index ee02ff016315a..a7cc220bf0d64 100644 --- a/src/test/regress/expected/rangetypes.out +++ b/src/test/regress/expected/rangetypes.out @@ -1761,12 +1761,12 @@ NOTICE: drop cascades to type two_ints_range -- -- Check behavior when subtype lacks a hash function -- -create type cashrange as range (subtype = money); +create type varbitrange as range (subtype = varbit); set enable_sort = off; -- try to make it pick a hash setop implementation -select '(2,5)'::cashrange except select '(5,6)'::cashrange; - cashrange ---------------- - ($2.00,$5.00) +select '(01,10)'::varbitrange except select '(10,11)'::varbitrange; + varbitrange +------------- + (01,10) (1 row) reset enable_sort; @@ -1834,3 +1834,145 @@ create function table_fail(i anyelement) returns table(i anyelement, r anyrange) as $$ select $1, '[1,10]' $$ language sql; ERROR: cannot determine result data type DETAIL: A result of type anyrange requires at least one input of type anyrange or anymultirange. +-- +-- Test support functions +-- +-- empty range +explain (verbose, costs off) +select current_date <@ daterange 'empty'; + QUERY PLAN +----------------- + Result + Output: false +(2 rows) + +-- unbounded range +explain (verbose, costs off) +select current_date <@ daterange(NULL, NULL); + QUERY PLAN +---------------- + Result + Output: true +(2 rows) + +-- only lower bound present +explain (verbose, costs off) +select current_date <@ daterange('2000-01-01', NULL, '[)'); + QUERY PLAN +------------------------------------------------ + Result + Output: (CURRENT_DATE >= '01-01-2000'::date) +(2 rows) + +-- only upper bound present +explain (verbose, costs off) +select current_date <@ daterange(NULL, '2000-01-01', '(]'); + QUERY PLAN +----------------------------------------------- + Result + Output: (CURRENT_DATE < '01-02-2000'::date) +(2 rows) + +-- lower range "-Infinity" excluded +explain (verbose, costs off) +select current_date <@ daterange('-Infinity', '1997-04-10'::date, '()'); + QUERY PLAN +---------------------------------------------------------------------------------------- + Result + Output: ((CURRENT_DATE > '-infinity'::date) AND (CURRENT_DATE < '04-10-1997'::date)) +(2 rows) + +-- lower range "-Infinity" included +explain (verbose, costs off) +select current_date <@ daterange('-Infinity', '1997-04-10'::date, '[)'); + QUERY PLAN +----------------------------------------------------------------------------------------- + Result + Output: ((CURRENT_DATE >= '-infinity'::date) AND (CURRENT_DATE < '04-10-1997'::date)) +(2 rows) + +-- upper range "Infinity" excluded +explain (verbose, costs off) +select current_date <@ daterange('2002-09-25'::date, 'Infinity', '[)'); + QUERY PLAN +---------------------------------------------------------------------------------------- + Result + Output: ((CURRENT_DATE >= '09-25-2002'::date) AND (CURRENT_DATE < 'infinity'::date)) +(2 rows) + +-- upper range "Infinity" included +explain (verbose, costs off) +select current_date <@ daterange('2002-09-25'::date, 'Infinity', '[]'); + QUERY PLAN +----------------------------------------------------------------------------------------- + Result + Output: ((CURRENT_DATE >= '09-25-2002'::date) AND (CURRENT_DATE <= 'infinity'::date)) +(2 rows) + +-- should also work if we use "@>" +explain (verbose, costs off) +select daterange('-Infinity', '1997-04-10'::date, '()') @> current_date; + QUERY PLAN +---------------------------------------------------------------------------------------- + Result + Output: ((CURRENT_DATE > '-infinity'::date) AND (CURRENT_DATE < '04-10-1997'::date)) +(2 rows) + +explain (verbose, costs off) +select daterange('2002-09-25'::date, 'Infinity', '[]') @> current_date; + QUERY PLAN +----------------------------------------------------------------------------------------- + Result + Output: ((CURRENT_DATE >= '09-25-2002'::date) AND (CURRENT_DATE <= 'infinity'::date)) +(2 rows) + +-- Check that volatile cases are not optimized +explain (verbose, costs off) +select now() <@ tstzrange('2024-01-20 00:00', '2024-01-21 00:00'); + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------- + Result + Output: ((now() >= 'Sat Jan 20 00:00:00 2024 PST'::timestamp with time zone) AND (now() < 'Sun Jan 21 00:00:00 2024 PST'::timestamp with time zone)) +(2 rows) + +explain (verbose, costs off) -- unsafe! +select clock_timestamp() <@ tstzrange('2024-01-20 00:00', '2024-01-21 00:00'); + QUERY PLAN +--------------------------------------------------------------------------------------------------------------- + Result + Output: (clock_timestamp() <@ '["Sat Jan 20 00:00:00 2024 PST","Sun Jan 21 00:00:00 2024 PST")'::tstzrange) +(2 rows) + +explain (verbose, costs off) +select clock_timestamp() <@ tstzrange('2024-01-20 00:00', NULL); + QUERY PLAN +------------------------------------------------------------------------------------------- + Result + Output: (clock_timestamp() >= 'Sat Jan 20 00:00:00 2024 PST'::timestamp with time zone) +(2 rows) + +-- test a custom range type with a non-default operator class +create type textrange_supp as range ( + subtype = text, + subtype_opclass = text_pattern_ops +); +create temp table text_support_test (t text collate "C"); +insert into text_support_test values ('a'), ('c'), ('d'), ('ch'); +explain (costs off) +select * from text_support_test where t <@ textrange_supp('a', 'd'); + QUERY PLAN +------------------------------------------------------ + Seq Scan on text_support_test + Filter: ((t ~>=~ 'a'::text) AND (t ~<~ 'd'::text)) +(2 rows) + +select * from text_support_test where t <@ textrange_supp('a', 'd'); + t +---- + a + c + ch +(3 rows) + +drop table text_support_test; +drop type textrange_supp; diff --git a/src/test/regress/expected/regproc.out b/src/test/regress/expected/regproc.out index a9420850b87ec..97b917502cabb 100644 --- a/src/test/regress/expected/regproc.out +++ b/src/test/regress/expected/regproc.out @@ -447,6 +447,43 @@ SELECT to_regnamespace('foo.bar'); (1 row) +-- Test to_regtypemod +SELECT to_regtypemod('text'); + to_regtypemod +--------------- + -1 +(1 row) + +SELECT to_regtypemod('timestamp(4)'); + to_regtypemod +--------------- + 4 +(1 row) + +SELECT to_regtypemod('no_such_type(4)'); + to_regtypemod +--------------- + +(1 row) + +SELECT format_type(to_regtype('varchar(32)'), to_regtypemod('varchar(32)')); + format_type +----------------------- + character varying(32) +(1 row) + +SELECT format_type(to_regtype('bit'), to_regtypemod('bit')); + format_type +------------- + bit(1) +(1 row) + +SELECT format_type(to_regtype('"bit"'), to_regtypemod('"bit"')); + format_type +------------- + "bit" +(1 row) + -- Test soft-error API SELECT * FROM pg_input_error_info('ng_catalog.pg_class', 'regclass'); message | detail | hint | sql_error_code diff --git a/src/test/regress/expected/reloptions.out b/src/test/regress/expected/reloptions.out index b6aef6f654cc9..9de19b4e3f13d 100644 --- a/src/test/regress/expected/reloptions.out +++ b/src/test/regress/expected/reloptions.out @@ -87,6 +87,17 @@ SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass AND -- RESET fails if a value is specified ALTER TABLE reloptions_test RESET (fillfactor=12); ERROR: RESET must not include values for parameters +-- We can RESET an invalid option which for some reason is already set +UPDATE pg_class + SET reloptions = '{fillfactor=13,autovacuum_enabled=false,illegal_option=4}' + WHERE oid = 'reloptions_test'::regclass; +ALTER TABLE reloptions_test RESET (illegal_option); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + reloptions +------------------------------------------ + {fillfactor=13,autovacuum_enabled=false} +(1 row) + -- Test vacuum_truncate option DROP TABLE reloptions_test; CREATE TEMP TABLE reloptions_test(i INT NOT NULL, j text) diff --git a/src/test/regress/expected/replica_identity.out b/src/test/regress/expected/replica_identity.out index 7d798ef2a5b3f..e9d7315a9c17d 100644 --- a/src/test/regress/expected/replica_identity.out +++ b/src/test/regress/expected/replica_identity.out @@ -7,6 +7,7 @@ CREATE TABLE test_replica_identity ( CONSTRAINT test_replica_identity_unique_nondefer UNIQUE (keya, keyb) ) ; CREATE TABLE test_replica_identity_othertable (id serial primary key); +CREATE TABLE test_replica_identity_t3 (id serial constraint pk primary key deferrable); CREATE INDEX test_replica_identity_keyab ON test_replica_identity (keya, keyb); CREATE UNIQUE INDEX test_replica_identity_keyab_key ON test_replica_identity (keya, keyb); CREATE UNIQUE INDEX test_replica_identity_nonkey ON test_replica_identity (keya, nonkey); @@ -57,6 +58,9 @@ ERROR: "test_replica_identity_othertable_pkey" is not an index for table "test_ -- fail, deferrable ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_unique_defer; ERROR: cannot use non-immediate index "test_replica_identity_unique_defer" as replica identity +-- fail, deferrable +ALTER TABLE test_replica_identity_t3 REPLICA IDENTITY USING INDEX pk; +ERROR: cannot use non-immediate index "pk" as replica identity SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; relreplident -------------- @@ -268,3 +272,4 @@ DROP TABLE test_replica_identity2; DROP TABLE test_replica_identity3; DROP TABLE test_replica_identity4; DROP TABLE test_replica_identity_othertable; +DROP TABLE test_replica_identity_t3; diff --git a/src/test/regress/expected/returning.out b/src/test/regress/expected/returning.out index cb51bb86876db..a5ebc8acc0fed 100644 --- a/src/test/regress/expected/returning.out +++ b/src/test/regress/expected/returning.out @@ -286,6 +286,63 @@ SELECT * FROM voo; 16 | zoo2 (2 rows) +-- Check use of a whole-row variable for an un-flattenable view +CREATE TEMP VIEW foo_v AS SELECT * FROM foo OFFSET 0; +UPDATE foo SET f2 = foo_v.f2 FROM foo_v WHERE foo_v.f1 = foo.f1 + RETURNING foo_v; + foo_v +----------------- + (2,more,42,141) + (16,zoo2,57,99) +(2 rows) + +SELECT * FROM foo; + f1 | f2 | f3 | f4 +----+------+----+----- + 2 | more | 42 | 141 + 16 | zoo2 | 57 | 99 +(2 rows) + +-- Check use of a whole-row variable for an inlined set-returning function +CREATE FUNCTION foo_f() RETURNS SETOF foo AS + $$ SELECT * FROM foo OFFSET 0 $$ LANGUAGE sql STABLE; +UPDATE foo SET f2 = foo_f.f2 FROM foo_f() WHERE foo_f.f1 = foo.f1 + RETURNING foo_f; + foo_f +----------------- + (2,more,42,141) + (16,zoo2,57,99) +(2 rows) + +SELECT * FROM foo; + f1 | f2 | f3 | f4 +----+------+----+----- + 2 | more | 42 | 141 + 16 | zoo2 | 57 | 99 +(2 rows) + +DROP FUNCTION foo_f(); +-- As above, but SRF is defined to return a composite type +CREATE TYPE foo_t AS (f1 int, f2 text, f3 int, f4 int8); +CREATE FUNCTION foo_f() RETURNS SETOF foo_t AS + $$ SELECT * FROM foo OFFSET 0 $$ LANGUAGE sql STABLE; +UPDATE foo SET f2 = foo_f.f2 FROM foo_f() WHERE foo_f.f1 = foo.f1 + RETURNING foo_f; + foo_f +----------------- + (2,more,42,141) + (16,zoo2,57,99) +(2 rows) + +SELECT * FROM foo; + f1 | f2 | f3 | f4 +----+------+----+----- + 2 | more | 42 | 141 + 16 | zoo2 | 57 | 99 +(2 rows) + +DROP FUNCTION foo_f(); +DROP TYPE foo_t; -- Try a join case CREATE TEMP TABLE joinme (f2j text, other int); INSERT INTO joinme VALUES('more', 12345); diff --git a/src/test/regress/expected/rowsecurity.out b/src/test/regress/expected/rowsecurity.out index e27834642082a..51bba175ec027 100644 --- a/src/test/regress/expected/rowsecurity.out +++ b/src/test/regress/expected/rowsecurity.out @@ -265,27 +265,27 @@ NOTICE: f_leak => awesome science fiction (5 rows) EXPLAIN (COSTS OFF) SELECT * FROM document WHERE f_leak(dtitle); - QUERY PLAN ----------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------- Seq Scan on document - Filter: ((dlevel <= $0) AND f_leak(dtitle)) - InitPlan 1 (returns $0) + Filter: ((dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) + InitPlan 1 -> Index Scan using uaccount_pkey on uaccount Index Cond: (pguser = CURRENT_USER) (5 rows) EXPLAIN (COSTS OFF) SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle); - QUERY PLAN ------------------------------------------------------------ + QUERY PLAN +-------------------------------------------------------------------------- Hash Join Hash Cond: (category.cid = document.cid) - InitPlan 1 (returns $0) + InitPlan 1 -> Index Scan using uaccount_pkey on uaccount Index Cond: (pguser = CURRENT_USER) -> Seq Scan on category -> Hash -> Seq Scan on document - Filter: ((dlevel <= $0) AND f_leak(dtitle)) + Filter: ((dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) (9 rows) -- viewpoint from regress_rls_dave @@ -329,27 +329,27 @@ NOTICE: f_leak => awesome technology book (7 rows) EXPLAIN (COSTS OFF) SELECT * FROM document WHERE f_leak(dtitle); - QUERY PLAN ----------------------------------------------------------------------------------------------- + QUERY PLAN +------------------------------------------------------------------------------------------------------------- Seq Scan on document - Filter: ((cid <> 44) AND (cid <> 44) AND (cid < 50) AND (dlevel <= $0) AND f_leak(dtitle)) - InitPlan 1 (returns $0) + Filter: ((cid <> 44) AND (cid <> 44) AND (cid < 50) AND (dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) + InitPlan 1 -> Index Scan using uaccount_pkey on uaccount Index Cond: (pguser = CURRENT_USER) (5 rows) EXPLAIN (COSTS OFF) SELECT * FROM document NATURAL JOIN category WHERE f_leak(dtitle); - QUERY PLAN ----------------------------------------------------------------------------------------------------------- + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------- Hash Join Hash Cond: (category.cid = document.cid) - InitPlan 1 (returns $0) + InitPlan 1 -> Index Scan using uaccount_pkey on uaccount Index Cond: (pguser = CURRENT_USER) -> Seq Scan on category -> Hash -> Seq Scan on document - Filter: ((cid <> 44) AND (cid <> 44) AND (cid < 50) AND (dlevel <= $0) AND f_leak(dtitle)) + Filter: ((cid <> 44) AND (cid <> 44) AND (cid < 50) AND (dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) (9 rows) -- 44 would technically fail for both p2r and p1r, but we should get an error @@ -985,18 +985,18 @@ NOTICE: f_leak => my first satire (4 rows) EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); - QUERY PLAN ------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------------- Append - InitPlan 1 (returns $0) + InitPlan 1 -> Index Scan using uaccount_pkey on uaccount Index Cond: (pguser = CURRENT_USER) -> Seq Scan on part_document_fiction part_document_1 - Filter: ((dlevel <= $0) AND f_leak(dtitle)) + Filter: ((dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) -> Seq Scan on part_document_satire part_document_2 - Filter: ((dlevel <= $0) AND f_leak(dtitle)) + Filter: ((dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) -> Seq Scan on part_document_nonfiction part_document_3 - Filter: ((dlevel <= $0) AND f_leak(dtitle)) + Filter: ((dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) (10 rows) -- viewpoint from regress_rls_carol @@ -1027,18 +1027,18 @@ NOTICE: f_leak => awesome technology book (10 rows) EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); - QUERY PLAN ------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------------- Append - InitPlan 1 (returns $0) + InitPlan 1 -> Index Scan using uaccount_pkey on uaccount Index Cond: (pguser = CURRENT_USER) -> Seq Scan on part_document_fiction part_document_1 - Filter: ((dlevel <= $0) AND f_leak(dtitle)) + Filter: ((dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) -> Seq Scan on part_document_satire part_document_2 - Filter: ((dlevel <= $0) AND f_leak(dtitle)) + Filter: ((dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) -> Seq Scan on part_document_nonfiction part_document_3 - Filter: ((dlevel <= $0) AND f_leak(dtitle)) + Filter: ((dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) (10 rows) -- viewpoint from regress_rls_dave @@ -1057,11 +1057,11 @@ NOTICE: f_leak => awesome science fiction (4 rows) EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); - QUERY PLAN --------------------------------------------------------------- + QUERY PLAN +----------------------------------------------------------------------------- Seq Scan on part_document_fiction part_document - Filter: ((cid < 55) AND (dlevel <= $0) AND f_leak(dtitle)) - InitPlan 1 (returns $0) + Filter: ((cid < 55) AND (dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) + InitPlan 1 -> Index Scan using uaccount_pkey on uaccount Index Cond: (pguser = CURRENT_USER) (5 rows) @@ -1135,11 +1135,11 @@ NOTICE: f_leak => awesome science fiction (4 rows) EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); - QUERY PLAN --------------------------------------------------------------- + QUERY PLAN +----------------------------------------------------------------------------- Seq Scan on part_document_fiction part_document - Filter: ((cid < 55) AND (dlevel <= $0) AND f_leak(dtitle)) - InitPlan 1 (returns $0) + Filter: ((cid < 55) AND (dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) + InitPlan 1 -> Index Scan using uaccount_pkey on uaccount Index Cond: (pguser = CURRENT_USER) (5 rows) @@ -1174,18 +1174,18 @@ NOTICE: f_leak => awesome technology book (11 rows) EXPLAIN (COSTS OFF) SELECT * FROM part_document WHERE f_leak(dtitle); - QUERY PLAN ------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------------- Append - InitPlan 1 (returns $0) + InitPlan 1 -> Index Scan using uaccount_pkey on uaccount Index Cond: (pguser = CURRENT_USER) -> Seq Scan on part_document_fiction part_document_1 - Filter: ((dlevel <= $0) AND f_leak(dtitle)) + Filter: ((dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) -> Seq Scan on part_document_satire part_document_2 - Filter: ((dlevel <= $0) AND f_leak(dtitle)) + Filter: ((dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) -> Seq Scan on part_document_nonfiction part_document_3 - Filter: ((dlevel <= $0) AND f_leak(dtitle)) + Filter: ((dlevel <= (InitPlan 1).col1) AND f_leak(dtitle)) (10 rows) -- only owner can change policies @@ -1435,10 +1435,10 @@ NOTICE: f_leak => 03b26944890929ff751653acb2f2af79 (1 row) EXPLAIN (COSTS OFF) SELECT * FROM only s1 WHERE f_leak(b); - QUERY PLAN ------------------------------------------------------------ + QUERY PLAN +--------------------------------------------------------------- Seq Scan on s1 - Filter: ((hashed SubPlan 1) AND f_leak(b)) + Filter: ((ANY (a = (hashed SubPlan 1).col1)) AND f_leak(b)) SubPlan 1 -> Seq Scan on s2 Filter: (((x % 2) = 0) AND (y ~~ '%2f%'::text)) @@ -1455,10 +1455,10 @@ NOTICE: f_leak => 03b26944890929ff751653acb2f2af79 (1 row) EXPLAIN (COSTS OFF) SELECT * FROM s1 WHERE f_leak(b); - QUERY PLAN ------------------------------------------------------------ + QUERY PLAN +--------------------------------------------------------------- Seq Scan on s1 - Filter: ((hashed SubPlan 1) AND f_leak(b)) + Filter: ((ANY (a = (hashed SubPlan 1).col1)) AND f_leak(b)) SubPlan 1 -> Seq Scan on s2 Filter: (((x % 2) = 0) AND (y ~~ '%af%'::text)) @@ -1478,7 +1478,7 @@ EXPLAIN (COSTS OFF) SELECT (SELECT x FROM s1 LIMIT 1) xx, * FROM s2 WHERE y like SubPlan 2 -> Limit -> Seq Scan on s1 - Filter: (hashed SubPlan 1) + Filter: (ANY (a = (hashed SubPlan 1).col1)) SubPlan 1 -> Seq Scan on s2 s2_1 Filter: (((x % 2) = 0) AND (y ~~ '%af%'::text)) @@ -2121,10 +2121,10 @@ ALTER TABLE document ADD COLUMN dnotes text DEFAULT ''; CREATE POLICY p1 ON document FOR SELECT USING (true); -- one may insert documents only authored by them CREATE POLICY p2 ON document FOR INSERT WITH CHECK (dauthor = current_user); --- one may only update documents in 'novel' category +-- one may only update documents in 'novel' category and new dlevel must be > 0 CREATE POLICY p3 ON document FOR UPDATE USING (cid = (SELECT cid from category WHERE cname = 'novel')) - WITH CHECK (dauthor = current_user); + WITH CHECK (dlevel > 0); -- one may only delete documents in 'manga' category CREATE POLICY p4 ON document FOR DELETE USING (cid = (SELECT cid from category WHERE cname = 'manga')); @@ -2148,12 +2148,12 @@ SELECT * FROM document; (14 rows) SET SESSION AUTHORIZATION regress_rls_bob; --- Fails, since update violates WITH CHECK qual on dauthor +-- Fails, since update violates WITH CHECK qual on dlevel MERGE INTO document d USING (SELECT 1 as sdid) s ON did = s.sdid WHEN MATCHED THEN - UPDATE SET dnotes = dnotes || ' notes added by merge1 ', dauthor = 'regress_rls_alice'; + UPDATE SET dnotes = dnotes || ' notes added by merge1 ', dlevel = 0; ERROR: new row violates row-level security policy for table "document" -- Should be OK since USING and WITH CHECK quals pass MERGE INTO document d @@ -2161,12 +2161,12 @@ USING (SELECT 1 as sdid) s ON did = s.sdid WHEN MATCHED THEN UPDATE SET dnotes = dnotes || ' notes added by merge2 '; --- Even when dauthor is updated explicitly, but to the existing value +-- Even when dlevel is updated explicitly, but to the existing value MERGE INTO document d USING (SELECT 1 as sdid) s ON did = s.sdid WHEN MATCHED THEN - UPDATE SET dnotes = dnotes || ' notes added by merge3 ', dauthor = 'regress_rls_bob'; + UPDATE SET dnotes = dnotes || ' notes added by merge3 ', dlevel = 1; -- There is a MATCH for did = 3, but UPDATE's USING qual does not allow -- updating an item in category 'science fiction' MERGE INTO document d @@ -2205,6 +2205,14 @@ WHEN MATCHED AND dnotes <> '' THEN WHEN MATCHED THEN DELETE; ERROR: target row violates row-level security policy (USING expression) for table "document" +-- OK if DELETE is replaced with DO NOTHING +MERGE INTO document d +USING (SELECT 4 as sdid) s +ON did = s.sdid +WHEN MATCHED AND dnotes <> '' THEN + UPDATE SET dnotes = dnotes || ' notes added by merge ' +WHEN MATCHED THEN + DO NOTHING; SELECT * FROM document WHERE did = 4; did | cid | dlevel | dauthor | dtitle | dnotes -----+-----+--------+-----------------+----------------+-------- @@ -2253,30 +2261,82 @@ WHEN MATCHED THEN WHEN NOT MATCHED THEN INSERT VALUES (12, 11, 1, 'regress_rls_bob', 'another novel'); -- drop and create a new SELECT policy which prevents us from reading --- any document except with category 'magna' +-- any document except with category 'novel' RESET SESSION AUTHORIZATION; DROP POLICY p1 ON document; CREATE POLICY p1 ON document FOR SELECT - USING (cid = (SELECT cid from category WHERE cname = 'manga')); + USING (cid = (SELECT cid from category WHERE cname = 'novel')); SET SESSION AUTHORIZATION regress_rls_bob; -- MERGE can no longer see the matching row and hence attempts the -- NOT MATCHED action, which results in unique key violation MERGE INTO document d -USING (SELECT 1 as sdid) s +USING (SELECT 7 as sdid) s ON did = s.sdid WHEN MATCHED THEN UPDATE SET dnotes = dnotes || ' notes added by merge5 ' WHEN NOT MATCHED THEN INSERT VALUES (12, 11, 1, 'regress_rls_bob', 'another novel'); ERROR: duplicate key value violates unique constraint "document_pkey" +-- UPDATE action fails if new row is not visible +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge6 ', + cid = (SELECT cid from category WHERE cname = 'technology'); +ERROR: new row violates row-level security policy for table "document" +-- but OK if new row is visible +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge7 ', + cid = (SELECT cid from category WHERE cname = 'novel'); +-- OK to insert a new row that is not visible +MERGE INTO document d +USING (SELECT 13 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge8 ' +WHEN NOT MATCHED THEN + INSERT VALUES (13, 44, 1, 'regress_rls_bob', 'new manga'); +SELECT * FROM document WHERE did = 13; + did | cid | dlevel | dauthor | dtitle | dnotes +-----+-----+--------+---------+--------+-------- +(0 rows) + +-- but not OK if RETURNING is used +MERGE INTO document d +USING (SELECT 14 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge9 ' +WHEN NOT MATCHED THEN + INSERT VALUES (14, 44, 1, 'regress_rls_bob', 'new manga') +RETURNING *; +ERROR: new row violates row-level security policy for table "document" +-- but OK if new row is visible +MERGE INTO document d +USING (SELECT 14 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge10 ' +WHEN NOT MATCHED THEN + INSERT VALUES (14, 11, 1, 'regress_rls_bob', 'new novel') +RETURNING *; + sdid | did | cid | dlevel | dauthor | dtitle | dnotes +------+-----+-----+--------+-----------------+-----------+-------- + 14 | 14 | 11 | 1 | regress_rls_bob | new novel | +(1 row) + RESET SESSION AUTHORIZATION; -- drop the restrictive SELECT policy so that we can look at the -- final state of the table DROP POLICY p1 ON document; -- Just check everything went per plan SELECT * FROM document; - did | cid | dlevel | dauthor | dtitle | dnotes ------+-----+--------+-------------------+----------------------------------+----------------------------------------------------------------------- + did | cid | dlevel | dauthor | dtitle | dnotes +-----+-----+--------+-------------------+----------------------------------+---------------------------------------------------------------------------------------------- 3 | 22 | 2 | regress_rls_bob | my science fiction | 5 | 44 | 2 | regress_rls_bob | my second manga | 6 | 22 | 1 | regress_rls_carol | great science fiction | @@ -2290,8 +2350,10 @@ SELECT * FROM document; 78 | 33 | 1 | regress_rls_bob | some technology novel | 79 | 33 | 1 | regress_rls_bob | technology book, can only insert | 12 | 11 | 1 | regress_rls_bob | another novel | - 1 | 11 | 1 | regress_rls_bob | my first novel | notes added by merge2 notes added by merge3 notes added by merge4 -(14 rows) + 1 | 11 | 1 | regress_rls_bob | my first novel | notes added by merge2 notes added by merge3 notes added by merge4 notes added by merge7 + 13 | 44 | 1 | regress_rls_bob | new manga | + 14 | 11 | 1 | regress_rls_bob | new novel | +(16 rows) -- -- ROLE/GROUP @@ -2653,10 +2715,10 @@ NOTICE: f_leak => bbb (1 row) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; - QUERY PLAN ----------------------------------------------------------------------- + QUERY PLAN +--------------------------------------------------------------------------------------- Seq Scan on z1 - Filter: ((NOT (hashed SubPlan 1)) AND ((a % 2) = 0) AND f_leak(b)) + Filter: ((NOT (ANY (a = (hashed SubPlan 1).col1))) AND ((a % 2) = 0) AND f_leak(b)) SubPlan 1 -> Seq Scan on z1_blacklist (4 rows) @@ -2671,10 +2733,10 @@ NOTICE: f_leak => bbb (1 row) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; - QUERY PLAN ----------------------------------------------------------------------- + QUERY PLAN +--------------------------------------------------------------------------------------- Seq Scan on z1 - Filter: ((NOT (hashed SubPlan 1)) AND ((a % 2) = 0) AND f_leak(b)) + Filter: ((NOT (ANY (a = (hashed SubPlan 1).col1))) AND ((a % 2) = 0) AND f_leak(b)) SubPlan 1 -> Seq Scan on z1_blacklist (4 rows) @@ -2843,10 +2905,10 @@ NOTICE: f_leak => bbb (1 row) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; - QUERY PLAN ----------------------------------------------------------------------- + QUERY PLAN +--------------------------------------------------------------------------------------- Seq Scan on z1 - Filter: ((NOT (hashed SubPlan 1)) AND ((a % 2) = 0) AND f_leak(b)) + Filter: ((NOT (ANY (a = (hashed SubPlan 1).col1))) AND ((a % 2) = 0) AND f_leak(b)) SubPlan 1 -> Seq Scan on z1_blacklist (4 rows) @@ -2869,10 +2931,10 @@ NOTICE: f_leak => aba (1 row) EXPLAIN (COSTS OFF) SELECT * FROM rls_view; - QUERY PLAN ----------------------------------------------------------------------- + QUERY PLAN +--------------------------------------------------------------------------------------- Seq Scan on z1 - Filter: ((NOT (hashed SubPlan 1)) AND ((a % 2) = 1) AND f_leak(b)) + Filter: ((NOT (ANY (a = (hashed SubPlan 1).col1))) AND ((a % 2) = 1) AND f_leak(b)) SubPlan 1 -> Seq Scan on z1_blacklist (4 rows) @@ -3857,6 +3919,47 @@ SELECT * FROM current_check; (1 row) COMMIT; +-- Check that RLS filters that are tidquals don't override WHERE CURRENT OF +BEGIN; +CREATE TABLE current_check_2 (a int, b text); +INSERT INTO current_check_2 VALUES (1, 'Apple'); +ALTER TABLE current_check_2 ENABLE ROW LEVEL SECURITY; +ALTER TABLE current_check_2 FORCE ROW LEVEL SECURITY; +-- policy must accept ctid = (InvalidBlockNumber,0) since updates check it +-- before assigning a ctid to the new row +CREATE POLICY p1 ON current_check_2 AS PERMISSIVE + USING (ctid IN ('(0,1)', '(0,2)', '(4294967295,0)')); +SELECT ctid, * FROM current_check_2; + ctid | a | b +-------+---+------- + (0,1) | 1 | Apple +(1 row) + +DECLARE current_check_cursor CURSOR FOR SELECT * FROM current_check_2; +FETCH FROM current_check_cursor; + a | b +---+------- + 1 | Apple +(1 row) + +EXPLAIN (COSTS OFF) +UPDATE current_check_2 SET b = 'Manzana' WHERE CURRENT OF current_check_cursor; + QUERY PLAN +---------------------------------------------------------------------------- + Update on current_check_2 + -> Tid Scan on current_check_2 + TID Cond: CURRENT OF current_check_cursor + Filter: (ctid = ANY ('{"(0,1)","(0,2)","(4294967295,0)"}'::tid[])) +(4 rows) + +UPDATE current_check_2 SET b = 'Manzana' WHERE CURRENT OF current_check_cursor; +SELECT ctid, * FROM current_check_2; + ctid | a | b +-------+---+--------- + (0,2) | 1 | Manzana +(1 row) + +ROLLBACK; -- -- check pg_stats view filtering -- @@ -4451,8 +4554,108 @@ execute q; --------------+--- (0 rows) +-- make sure RLS dependencies in CTEs are handled +reset role; +create or replace function rls_f() returns setof rls_t + stable language sql + as $$ with cte as (select * from rls_t) select * from cte $$; +prepare r as select current_user, * from rls_f(); +set role regress_rls_alice; +execute r; + current_user | c +-------------------+------------------ + regress_rls_alice | invisible to bob +(1 row) + +set role regress_rls_bob; +execute r; + current_user | c +--------------+--- +(0 rows) + +-- make sure RLS dependencies in subqueries are handled +reset role; +create or replace function rls_f() returns setof rls_t + stable language sql + as $$ select * from (select * from rls_t) _ $$; +prepare s as select current_user, * from rls_f(); +set role regress_rls_alice; +execute s; + current_user | c +-------------------+------------------ + regress_rls_alice | invisible to bob +(1 row) + +set role regress_rls_bob; +execute s; + current_user | c +--------------+--- +(0 rows) + +-- make sure RLS dependencies in sublinks are handled +reset role; +create or replace function rls_f() returns setof rls_t + stable language sql + as $$ select exists(select * from rls_t)::text $$; +prepare t as select current_user, * from rls_f(); +set role regress_rls_alice; +execute t; + current_user | c +-------------------+------ + regress_rls_alice | true +(1 row) + +set role regress_rls_bob; +execute t; + current_user | c +-----------------+------- + regress_rls_bob | false +(1 row) + +-- make sure RLS dependencies are handled when coercion projections are inserted +reset role; +create or replace function rls_f() returns setof rls_t + stable language sql + as $$ select * from (select array_agg(c) as cs from rls_t) _ group by cs $$; +prepare u as select current_user, * from rls_f(); +set role regress_rls_alice; +execute u; + current_user | c +-------------------+---------------------- + regress_rls_alice | {"invisible to bob"} +(1 row) + +set role regress_rls_bob; +execute u; + current_user | c +-----------------+--- + regress_rls_bob | +(1 row) + +-- make sure RLS dependencies in security invoker views are handled +reset role; +create view rls_v with (security_invoker) as select * from rls_t; +grant select on rls_v to regress_rls_alice, regress_rls_bob; +create or replace function rls_f() returns setof rls_t + stable language sql + as $$ select * from rls_v $$; +prepare v as select current_user, * from rls_f(); +set role regress_rls_alice; +execute v; + current_user | c +-------------------+------------------ + regress_rls_alice | invisible to bob +(1 row) + +set role regress_rls_bob; +execute v; + current_user | c +--------------+--- +(0 rows) + RESET ROLE; DROP FUNCTION rls_f(); +DROP VIEW rls_v; DROP TABLE rls_t; -- -- Clean up objects diff --git a/src/test/regress/expected/rowtypes.out b/src/test/regress/expected/rowtypes.out index 981ee0811a7a0..9168979a6206e 100644 --- a/src/test/regress/expected/rowtypes.out +++ b/src/test/regress/expected/rowtypes.out @@ -1240,6 +1240,120 @@ select r, r is null as isnull, r is not null as isnotnull from r; (,) | t | f (6 rows) +-- +-- Check parsing of indirect references to composite values (bug #18077) +-- +explain (verbose, costs off) +with cte(c) as materialized (select row(1, 2)), + cte2(c) as (select * from cte) +select * from cte2 as t +where (select * from (select c as c1) s + where (select (c1).f1 > 0)) is not null; + QUERY PLAN +---------------------------------------------- + CTE Scan on cte + Output: cte.c + Filter: ((SubPlan 3) IS NOT NULL) + CTE cte + -> Result + Output: '(1,2)'::record + SubPlan 3 + -> Result + Output: cte.c + One-Time Filter: (InitPlan 2).col1 + InitPlan 2 + -> Result + Output: ((cte.c).f1 > 0) +(13 rows) + +with cte(c) as materialized (select row(1, 2)), + cte2(c) as (select * from cte) +select * from cte2 as t +where (select * from (select c as c1) s + where (select (c1).f1 > 0)) is not null; + c +------- + (1,2) +(1 row) + +-- Also check deparsing of such cases +create view composite_v as +with cte(c) as materialized (select row(1, 2)), + cte2(c) as (select * from cte) +select 1 as one from cte2 as t +where (select * from (select c as c1) s + where (select (c1).f1 > 0)) is not null; +select pg_get_viewdef('composite_v', true); + pg_get_viewdef +-------------------------------------------------------- + WITH cte(c) AS MATERIALIZED ( + + SELECT ROW(1, 2) AS "row" + + ), cte2(c) AS ( + + SELECT cte.c + + FROM cte + + ) + + SELECT 1 AS one + + FROM cte2 t + + WHERE (( SELECT s.c1 + + FROM ( SELECT t.c AS c1) s + + WHERE ( SELECT (s.c1).f1 > 0))) IS NOT NULL; +(1 row) + +drop view composite_v; +-- +-- Check cases where the composite comes from a proven-dummy rel (bug #18576) +-- +explain (verbose, costs off) +select (ss.a).x, (ss.a).n from + (select information_schema._pg_expandarray(array[1,2]) AS a) ss; + QUERY PLAN +------------------------------------------------------------------------ + Subquery Scan on ss + Output: (ss.a).x, (ss.a).n + -> ProjectSet + Output: information_schema._pg_expandarray('{1,2}'::integer[]) + -> Result +(5 rows) + +explain (verbose, costs off) +select (ss.a).x, (ss.a).n from + (select information_schema._pg_expandarray(array[1,2]) AS a) ss +where false; + QUERY PLAN +-------------------------- + Result + Output: (a).f1, (a).f2 + One-Time Filter: false +(3 rows) + +explain (verbose, costs off) +with cte(c) as materialized (select row(1, 2)), + cte2(c) as (select * from cte) +select (c).f1 from cte2 as t; + QUERY PLAN +----------------------------------- + CTE Scan on cte + Output: (cte.c).f1 + CTE cte + -> Result + Output: '(1,2)'::record +(5 rows) + +explain (verbose, costs off) +with cte(c) as materialized (select row(1, 2)), + cte2(c) as (select * from cte) +select (c).f1 from cte2 as t +where false; + QUERY PLAN +----------------------------------- + Result + Output: (cte.c).f1 + One-Time Filter: false + CTE cte + -> Result + Output: '(1,2)'::record +(6 rows) + -- -- Tests for component access / FieldSelect -- diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 7fd81e6a7d007..13178e2b3df28 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -51,9 +51,9 @@ create rule rtest_pers_del as on delete to rtest_person do also -- -- Tables and rules for the logging test -- -create table rtest_emp (ename char(20), salary money); -create table rtest_emplog (ename char(20), who name, action char(10), newsal money, oldsal money); -create table rtest_empmass (ename char(20), salary money); +create table rtest_emp (ename char(20), salary numeric); +create table rtest_emplog (ename char(20), who name, action char(10), newsal numeric, oldsal numeric); +create table rtest_empmass (ename char(20), salary numeric); create rule rtest_emp_ins as on insert to rtest_emp do insert into rtest_emplog values (new.ename, current_user, 'hired', new.salary, '0.00'); @@ -410,13 +410,13 @@ update rtest_emp set ename = 'wieck', salary = '6000.00' where ename = 'wiecx'; update rtest_emp set salary = '7000.00' where ename = 'wieck'; delete from rtest_emp where ename = 'gates'; select ename, who = current_user as "matches user", action, newsal, oldsal from rtest_emplog order by ename, action, newsal; - ename | matches user | action | newsal | oldsal -----------------------+--------------+------------+------------+------------ - gates | t | fired | $0.00 | $80,000.00 - gates | t | hired | $80,000.00 | $0.00 - wiecc | t | hired | $5,000.00 | $0.00 - wieck | t | honored | $6,000.00 | $5,000.00 - wieck | t | honored | $7,000.00 | $6,000.00 + ename | matches user | action | newsal | oldsal +----------------------+--------------+------------+----------+---------- + gates | t | fired | 0.00 | 80000.00 + gates | t | hired | 80000.00 | 0.00 + wiecc | t | hired | 5000.00 | 0.00 + wieck | t | honored | 6000.00 | 5000.00 + wieck | t | honored | 7000.00 | 6000.00 (5 rows) insert into rtest_empmass values ('meyer', '4000.00'); @@ -424,54 +424,54 @@ insert into rtest_empmass values ('maier', '5000.00'); insert into rtest_empmass values ('mayr', '6000.00'); insert into rtest_emp select * from rtest_empmass; select ename, who = current_user as "matches user", action, newsal, oldsal from rtest_emplog order by ename, action, newsal; - ename | matches user | action | newsal | oldsal -----------------------+--------------+------------+------------+------------ - gates | t | fired | $0.00 | $80,000.00 - gates | t | hired | $80,000.00 | $0.00 - maier | t | hired | $5,000.00 | $0.00 - mayr | t | hired | $6,000.00 | $0.00 - meyer | t | hired | $4,000.00 | $0.00 - wiecc | t | hired | $5,000.00 | $0.00 - wieck | t | honored | $6,000.00 | $5,000.00 - wieck | t | honored | $7,000.00 | $6,000.00 + ename | matches user | action | newsal | oldsal +----------------------+--------------+------------+----------+---------- + gates | t | fired | 0.00 | 80000.00 + gates | t | hired | 80000.00 | 0.00 + maier | t | hired | 5000.00 | 0.00 + mayr | t | hired | 6000.00 | 0.00 + meyer | t | hired | 4000.00 | 0.00 + wiecc | t | hired | 5000.00 | 0.00 + wieck | t | honored | 6000.00 | 5000.00 + wieck | t | honored | 7000.00 | 6000.00 (8 rows) update rtest_empmass set salary = salary + '1000.00'; update rtest_emp set salary = rtest_empmass.salary from rtest_empmass where rtest_emp.ename = rtest_empmass.ename; select ename, who = current_user as "matches user", action, newsal, oldsal from rtest_emplog order by ename, action, newsal; - ename | matches user | action | newsal | oldsal -----------------------+--------------+------------+------------+------------ - gates | t | fired | $0.00 | $80,000.00 - gates | t | hired | $80,000.00 | $0.00 - maier | t | hired | $5,000.00 | $0.00 - maier | t | honored | $6,000.00 | $5,000.00 - mayr | t | hired | $6,000.00 | $0.00 - mayr | t | honored | $7,000.00 | $6,000.00 - meyer | t | hired | $4,000.00 | $0.00 - meyer | t | honored | $5,000.00 | $4,000.00 - wiecc | t | hired | $5,000.00 | $0.00 - wieck | t | honored | $6,000.00 | $5,000.00 - wieck | t | honored | $7,000.00 | $6,000.00 + ename | matches user | action | newsal | oldsal +----------------------+--------------+------------+----------+---------- + gates | t | fired | 0.00 | 80000.00 + gates | t | hired | 80000.00 | 0.00 + maier | t | hired | 5000.00 | 0.00 + maier | t | honored | 6000.00 | 5000.00 + mayr | t | hired | 6000.00 | 0.00 + mayr | t | honored | 7000.00 | 6000.00 + meyer | t | hired | 4000.00 | 0.00 + meyer | t | honored | 5000.00 | 4000.00 + wiecc | t | hired | 5000.00 | 0.00 + wieck | t | honored | 6000.00 | 5000.00 + wieck | t | honored | 7000.00 | 6000.00 (11 rows) delete from rtest_emp using rtest_empmass where rtest_emp.ename = rtest_empmass.ename; select ename, who = current_user as "matches user", action, newsal, oldsal from rtest_emplog order by ename, action, newsal; - ename | matches user | action | newsal | oldsal -----------------------+--------------+------------+------------+------------ - gates | t | fired | $0.00 | $80,000.00 - gates | t | hired | $80,000.00 | $0.00 - maier | t | fired | $0.00 | $6,000.00 - maier | t | hired | $5,000.00 | $0.00 - maier | t | honored | $6,000.00 | $5,000.00 - mayr | t | fired | $0.00 | $7,000.00 - mayr | t | hired | $6,000.00 | $0.00 - mayr | t | honored | $7,000.00 | $6,000.00 - meyer | t | fired | $0.00 | $5,000.00 - meyer | t | hired | $4,000.00 | $0.00 - meyer | t | honored | $5,000.00 | $4,000.00 - wiecc | t | hired | $5,000.00 | $0.00 - wieck | t | honored | $6,000.00 | $5,000.00 - wieck | t | honored | $7,000.00 | $6,000.00 + ename | matches user | action | newsal | oldsal +----------------------+--------------+------------+----------+---------- + gates | t | fired | 0.00 | 80000.00 + gates | t | hired | 80000.00 | 0.00 + maier | t | fired | 0.00 | 6000.00 + maier | t | hired | 5000.00 | 0.00 + maier | t | honored | 6000.00 | 5000.00 + mayr | t | fired | 0.00 | 7000.00 + mayr | t | hired | 6000.00 | 0.00 + mayr | t | honored | 7000.00 | 6000.00 + meyer | t | fired | 0.00 | 5000.00 + meyer | t | hired | 4000.00 | 0.00 + meyer | t | honored | 5000.00 | 4000.00 + wiecc | t | hired | 5000.00 | 0.00 + wieck | t | honored | 6000.00 | 5000.00 + wieck | t | honored | 7000.00 | 6000.00 (14 rows) -- @@ -1473,8 +1473,12 @@ pg_replication_slots| SELECT l.slot_name, l.wal_status, l.safe_wal_size, l.two_phase, - l.conflicting - FROM (pg_get_replication_slots() l(slot_name, plugin, slot_type, datoid, temporary, active, active_pid, xmin, catalog_xmin, restart_lsn, confirmed_flush_lsn, wal_status, safe_wal_size, two_phase, conflicting) + l.inactive_since, + l.conflicting, + l.invalidation_reason, + l.failover, + l.synced + FROM (pg_get_replication_slots() l(slot_name, plugin, slot_type, datoid, temporary, active, active_pid, xmin, catalog_xmin, restart_lsn, confirmed_flush_lsn, wal_status, safe_wal_size, two_phase, inactive_since, conflicting, invalidation_reason, failover, synced) LEFT JOIN pg_database d ON ((l.datoid = d.oid))); pg_roles| SELECT pg_authid.rolname, pg_authid.rolsuper, @@ -1816,17 +1820,19 @@ pg_stat_archiver| SELECT archived_count, last_failed_time, stats_reset FROM pg_stat_get_archiver() s(archived_count, last_archived_wal, last_archived_time, failed_count, last_failed_wal, last_failed_time, stats_reset); -pg_stat_bgwriter| SELECT pg_stat_get_bgwriter_timed_checkpoints() AS checkpoints_timed, - pg_stat_get_bgwriter_requested_checkpoints() AS checkpoints_req, - pg_stat_get_checkpoint_write_time() AS checkpoint_write_time, - pg_stat_get_checkpoint_sync_time() AS checkpoint_sync_time, - pg_stat_get_bgwriter_buf_written_checkpoints() AS buffers_checkpoint, - pg_stat_get_bgwriter_buf_written_clean() AS buffers_clean, +pg_stat_bgwriter| SELECT pg_stat_get_bgwriter_buf_written_clean() AS buffers_clean, pg_stat_get_bgwriter_maxwritten_clean() AS maxwritten_clean, - pg_stat_get_buf_written_backend() AS buffers_backend, - pg_stat_get_buf_fsync_backend() AS buffers_backend_fsync, pg_stat_get_buf_alloc() AS buffers_alloc, pg_stat_get_bgwriter_stat_reset_time() AS stats_reset; +pg_stat_checkpointer| SELECT pg_stat_get_checkpointer_num_timed() AS num_timed, + pg_stat_get_checkpointer_num_requested() AS num_requested, + pg_stat_get_checkpointer_restartpoints_timed() AS restartpoints_timed, + pg_stat_get_checkpointer_restartpoints_requested() AS restartpoints_req, + pg_stat_get_checkpointer_restartpoints_performed() AS restartpoints_done, + pg_stat_get_checkpointer_write_time() AS write_time, + pg_stat_get_checkpointer_sync_time() AS sync_time, + pg_stat_get_checkpointer_buffers_written() AS buffers_written, + pg_stat_get_checkpointer_stat_reset_time() AS stats_reset; pg_stat_database| SELECT oid AS datid, datname, CASE @@ -1986,7 +1992,8 @@ pg_stat_progress_copy| SELECT s.pid, s.param1 AS bytes_processed, s.param2 AS bytes_total, s.param3 AS tuples_processed, - s.param4 AS tuples_excluded + s.param4 AS tuples_excluded, + s.param7 AS tuples_skipped FROM (pg_stat_get_progress_info('COPY'::text) s(pid, datid, relid, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) LEFT JOIN pg_database d ON ((s.datid = d.oid))); pg_stat_progress_create_index| SELECT s.pid, @@ -2043,8 +2050,11 @@ pg_stat_progress_vacuum| SELECT s.pid, s.param3 AS heap_blks_scanned, s.param4 AS heap_blks_vacuumed, s.param5 AS index_vacuum_count, - s.param6 AS max_dead_tuples, - s.param7 AS num_dead_tuples + s.param6 AS max_dead_tuple_bytes, + s.param7 AS dead_tuple_bytes, + s.param8 AS num_dead_item_ids, + s.param9 AS indexes_total, + s.param10 AS indexes_processed FROM (pg_stat_get_progress_info('VACUUM'::text) s(pid, datid, relid, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16, param17, param18, param19, param20) LEFT JOIN pg_database d ON ((s.datid = d.oid))); pg_stat_recovery_prefetch| SELECT stats_reset, @@ -2116,6 +2126,7 @@ pg_stat_ssl| SELECT pid, WHERE (client_port IS NOT NULL); pg_stat_subscription| SELECT su.oid AS subid, su.subname, + st.worker_type, st.pid, st.leader_pid, st.relid, @@ -2125,7 +2136,7 @@ pg_stat_subscription| SELECT su.oid AS subid, st.latest_end_lsn, st.latest_end_time FROM (pg_subscription su - LEFT JOIN pg_stat_get_subscription(NULL::oid) st(subid, relid, pid, leader_pid, received_lsn, last_msg_send_time, last_msg_receipt_time, latest_end_lsn, latest_end_time) ON ((st.subid = su.oid))); + LEFT JOIN pg_stat_get_subscription(NULL::oid) st(subid, relid, pid, leader_pid, received_lsn, last_msg_send_time, last_msg_receipt_time, latest_end_lsn, latest_end_time, worker_type) ON ((st.subid = su.oid))); pg_stat_subscription_stats| SELECT ss.subid, s.subname, ss.apply_error_count, @@ -2464,7 +2475,31 @@ pg_stats| SELECT n.nspname AS schemaname, WHEN (s.stakind4 = 5) THEN s.stanumbers4 WHEN (s.stakind5 = 5) THEN s.stanumbers5 ELSE NULL::real[] - END AS elem_count_histogram + END AS elem_count_histogram, + CASE + WHEN (s.stakind1 = 6) THEN s.stavalues1 + WHEN (s.stakind2 = 6) THEN s.stavalues2 + WHEN (s.stakind3 = 6) THEN s.stavalues3 + WHEN (s.stakind4 = 6) THEN s.stavalues4 + WHEN (s.stakind5 = 6) THEN s.stavalues5 + ELSE NULL::anyarray + END AS range_length_histogram, + CASE + WHEN (s.stakind1 = 6) THEN s.stanumbers1[1] + WHEN (s.stakind2 = 6) THEN s.stanumbers2[1] + WHEN (s.stakind3 = 6) THEN s.stanumbers3[1] + WHEN (s.stakind4 = 6) THEN s.stanumbers4[1] + WHEN (s.stakind5 = 6) THEN s.stanumbers5[1] + ELSE NULL::real + END AS range_empty_frac, + CASE + WHEN (s.stakind1 = 7) THEN s.stavalues1 + WHEN (s.stakind2 = 7) THEN s.stavalues2 + WHEN (s.stakind3 = 7) THEN s.stavalues3 + WHEN (s.stakind4 = 7) THEN s.stavalues4 + WHEN (s.stakind5 = 7) THEN s.stavalues5 + ELSE NULL::anyarray + END AS range_bounds_histogram FROM (((pg_statistic s JOIN pg_class c ON ((c.oid = s.starelid))) JOIN pg_attribute a ON (((c.oid = a.attrelid) AND (a.attnum = s.staattnum)))) @@ -2497,10 +2532,7 @@ pg_stats_ext| SELECT cn.nspname AS schemaname, array_agg(pg_mcv_list_items.frequency) AS most_common_freqs, array_agg(pg_mcv_list_items.base_frequency) AS most_common_base_freqs FROM pg_mcv_list_items(sd.stxdmcv) pg_mcv_list_items(index, "values", nulls, frequency, base_frequency)) m ON ((sd.stxdmcv IS NOT NULL))) - WHERE ((NOT (EXISTS ( SELECT 1 - FROM (unnest(s.stxkeys) k(k) - JOIN pg_attribute a ON (((a.attrelid = s.stxrelid) AND (a.attnum = k.k)))) - WHERE (NOT has_column_privilege(c.oid, a.attnum, 'select'::text))))) AND ((c.relrowsecurity = false) OR (NOT row_security_active(c.oid)))); + WHERE (pg_has_role(c.relowner, 'USAGE'::text) AND ((c.relrowsecurity = false) OR (NOT row_security_active(c.oid)))); pg_stats_ext_exprs| SELECT cn.nspname AS schemaname, c.relname AS tablename, sn.nspname AS statistics_schemaname, @@ -2573,7 +2605,8 @@ pg_stats_ext_exprs| SELECT cn.nspname AS schemaname, LEFT JOIN pg_namespace cn ON ((cn.oid = c.relnamespace))) LEFT JOIN pg_namespace sn ON ((sn.oid = s.stxnamespace))) JOIN LATERAL ( SELECT unnest(pg_get_statisticsobjdef_expressions(s.oid)) AS expr, - unnest(sd.stxdexpr) AS a) stat ON ((stat.expr IS NOT NULL))); + unnest(sd.stxdexpr) AS a) stat ON ((stat.expr IS NOT NULL))) + WHERE (pg_has_role(c.relowner, 'USAGE'::text) AND ((c.relrowsecurity = false) OR (NOT row_security_active(c.oid)))); pg_tables| SELECT n.nspname AS schemaname, c.relname AS tablename, pg_get_userbyid(c.relowner) AS tableowner, @@ -2629,6 +2662,10 @@ pg_views| SELECT n.nspname AS schemaname, FROM (pg_class c LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = 'v'::"char"); +pg_wait_events| SELECT type, + name, + description + FROM pg_get_wait_events() pg_get_wait_events(type, name, description); SELECT tablename, rulename, definition FROM pg_rules WHERE schemaname = 'pg_catalog' ORDER BY tablename, rulename; @@ -3587,10 +3624,22 @@ MERGE INTO rule_merge2 t USING (SELECT 1 AS a) s DELETE WHEN NOT MATCHED THEN INSERT VALUES (s.a, ''); +-- also ok if the rules are disabled +ALTER TABLE rule_merge1 DISABLE RULE rule1; +ALTER TABLE rule_merge1 DISABLE RULE rule2; +ALTER TABLE rule_merge1 DISABLE RULE rule3; +MERGE INTO rule_merge1 t USING (SELECT 1 AS a) s + ON t.a = s.a + WHEN MATCHED AND t.a < 2 THEN + UPDATE SET b = b || ' updated by merge' + WHEN MATCHED AND t.a > 2 THEN + DELETE + WHEN NOT MATCHED THEN + INSERT VALUES (s.a, ''); -- test deparsing CREATE TABLE sf_target(id int, data text, filling int[]); CREATE FUNCTION merge_sf_test() - RETURNS void + RETURNS TABLE(action text, a int, b text, id int, data text, filling int[]) LANGUAGE sql BEGIN ATOMIC MERGE INTO sf_target t @@ -3627,11 +3676,13 @@ WHEN NOT MATCHED VALUES (s.a, s.b, DEFAULT) WHEN NOT MATCHED THEN INSERT (filling[1], id) - VALUES (s.a, s.a); + VALUES (s.a, s.a) +RETURNING + merge_action() AS action, *; END; \sf merge_sf_test CREATE OR REPLACE FUNCTION public.merge_sf_test() - RETURNS void + RETURNS TABLE(action text, a integer, b text, id integer, data text, filling integer[]) LANGUAGE sql BEGIN ATOMIC MERGE INTO sf_target t @@ -3668,9 +3719,47 @@ BEGIN ATOMIC VALUES (s.a, s.b, DEFAULT) WHEN NOT MATCHED THEN INSERT (filling[1], id) - VALUES (s.a, s.a); + VALUES (s.a, s.a) + RETURNING MERGE_ACTION() AS action, + s.a, + s.b, + t.id, + t.data, + t.filling; +END +CREATE FUNCTION merge_sf_test2() + RETURNS void + LANGUAGE sql +BEGIN ATOMIC + MERGE INTO sf_target t + USING rule_merge1 s + ON (s.a = t.id) +WHEN NOT MATCHED + THEN INSERT (data, id) + VALUES (s.a, s.a) +WHEN MATCHED + THEN UPDATE SET data = s.b +WHEN NOT MATCHED BY SOURCE + THEN DELETE; +END; +\sf merge_sf_test2 +CREATE OR REPLACE FUNCTION public.merge_sf_test2() + RETURNS void + LANGUAGE sql +BEGIN ATOMIC + MERGE INTO sf_target t + USING rule_merge1 s + ON (s.a = t.id) + WHEN NOT MATCHED BY TARGET + THEN INSERT (data, id) + VALUES (s.a, s.a) + WHEN MATCHED + THEN UPDATE SET data = s.b + WHEN NOT MATCHED BY SOURCE + THEN DELETE; END DROP FUNCTION merge_sf_test; +DROP FUNCTION merge_sf_test2; DROP TABLE sf_target; -- -- Test enabling/disabling diff --git a/src/test/regress/expected/sanity_check.out b/src/test/regress/expected/sanity_check.out index c5c675b75089a..8370c1561cca9 100644 --- a/src/test/regress/expected/sanity_check.out +++ b/src/test/regress/expected/sanity_check.out @@ -25,32 +25,3 @@ SELECT relname, relkind ---------+--------- (0 rows) --- --- When ALIGNOF_DOUBLE==4 (e.g. AIX), the C ABI may impose 8-byte alignment on --- some of the C types that correspond to TYPALIGN_DOUBLE SQL types. To ensure --- catalog C struct layout matches catalog tuple layout, arrange for the tuple --- offset of each fixed-width, attalign='d' catalog column to be divisible by 8 --- unconditionally. Keep such columns before the first NameData column of the --- catalog, since packagers can override NAMEDATALEN to an odd number. --- -WITH check_columns AS ( - SELECT relname, attname, - array( - SELECT t.oid - FROM pg_type t JOIN pg_attribute pa ON t.oid = pa.atttypid - WHERE pa.attrelid = a.attrelid AND - pa.attnum > 0 AND pa.attnum < a.attnum - ORDER BY pa.attnum) AS coltypes - FROM pg_attribute a JOIN pg_class c ON c.oid = attrelid - JOIN pg_namespace n ON c.relnamespace = n.oid - WHERE attalign = 'd' AND relkind = 'r' AND - attnotnull AND attlen <> -1 AND n.nspname = 'pg_catalog' -) -SELECT relname, attname, coltypes, get_columns_length(coltypes) - FROM check_columns - WHERE get_columns_length(coltypes) % 8 != 0 OR - 'name'::regtype::oid = ANY(coltypes); - relname | attname | coltypes | get_columns_length ----------+---------+----------+-------------------- -(0 rows) - diff --git a/src/test/regress/expected/select_distinct.out b/src/test/regress/expected/select_distinct.out index 9d44ea8056d19..82b8e54f5f170 100644 --- a/src/test/regress/expected/select_distinct.out +++ b/src/test/regress/expected/select_distinct.out @@ -235,10 +235,10 @@ SELECT DISTINCT four FROM tenk1; QUERY PLAN ---------------------------------------------------- Unique - -> Sort - Sort Key: four - -> Gather - Workers Planned: 2 + -> Gather Merge + Workers Planned: 2 + -> Sort + Sort Key: four -> HashAggregate Group Key: four -> Parallel Seq Scan on tenk1 @@ -348,6 +348,26 @@ SELECT DISTINCT four,1,2,3 FROM tenk1 WHERE four = 0; 0 | 1 | 2 | 3 (1 row) +SET parallel_setup_cost=0; +SET min_parallel_table_scan_size=0; +SET max_parallel_workers_per_gather=2; +-- Ensure we get a plan with a Limit 1 in both partial distinct and final +-- distinct +EXPLAIN (COSTS OFF) +SELECT DISTINCT four FROM tenk1 WHERE four = 10; + QUERY PLAN +---------------------------------------------- + Limit + -> Gather + Workers Planned: 2 + -> Limit + -> Parallel Seq Scan on tenk1 + Filter: (four = 10) +(6 rows) + +RESET max_parallel_workers_per_gather; +RESET min_parallel_table_scan_size; +RESET parallel_setup_cost; -- -- Also, some tests of IS DISTINCT FROM, which doesn't quite deserve its -- very own regression file. diff --git a/src/test/regress/expected/select_parallel.out b/src/test/regress/expected/select_parallel.out index d88353d496c82..496ddb128937b 100644 --- a/src/test/regress/expected/select_parallel.out +++ b/src/test/regress/expected/select_parallel.out @@ -291,14 +291,14 @@ alter table tenk2 set (parallel_workers = 0); explain (costs off) select count(*) from tenk1 where (two, four) not in (select hundred, thousand from tenk2 where thousand > 100); - QUERY PLAN ------------------------------------------------------- + QUERY PLAN +---------------------------------------------------------------------------------------------------------------- Finalize Aggregate -> Gather Workers Planned: 4 -> Partial Aggregate -> Parallel Seq Scan on tenk1 - Filter: (NOT (hashed SubPlan 1)) + Filter: (NOT (ANY ((two = (hashed SubPlan 1).col1) AND (four = (hashed SubPlan 1).col2)))) SubPlan 1 -> Seq Scan on tenk2 Filter: (thousand > 100) @@ -315,10 +315,10 @@ select count(*) from tenk1 where (two, four) not in explain (costs off) select * from tenk1 where (unique1 + random())::integer not in (select ten from tenk2); - QUERY PLAN ------------------------------------- + QUERY PLAN +------------------------------------------------------------------------------------------------------- Seq Scan on tenk1 - Filter: (NOT (hashed SubPlan 1)) + Filter: (NOT (ANY ((((unique1)::double precision + random()))::integer = (hashed SubPlan 1).col1))) SubPlan 1 -> Seq Scan on tenk2 (4 rows) @@ -335,7 +335,7 @@ explain (costs off) QUERY PLAN ------------------------------------------------------ Aggregate - InitPlan 1 (returns $2) + InitPlan 1 -> Finalize Aggregate -> Gather Workers Planned: 2 @@ -343,10 +343,9 @@ explain (costs off) -> Parallel Seq Scan on tenk2 -> Gather Workers Planned: 4 - Params Evaluated: $2 -> Parallel Seq Scan on tenk1 - Filter: (unique1 = $2) -(12 rows) + Filter: (unique1 = (InitPlan 1).col1) +(11 rows) select count(*) from tenk1 where tenk1.unique1 = (Select max(tenk2.unique1) from tenk2); @@ -362,6 +361,7 @@ alter table tenk2 reset (parallel_workers); -- test parallel index scans. set enable_seqscan to off; set enable_bitmapscan to off; +set random_page_cost = 2; explain (costs off) select count((unique1)) from tenk1 where hundred > 1; QUERY PLAN @@ -380,6 +380,30 @@ select count((unique1)) from tenk1 where hundred > 1; 9800 (1 row) +-- Parallel ScalarArrayOp index scan +explain (costs off) + select count((unique1)) from tenk1 + where hundred = any ((select array_agg(i) from generate_series(1, 100, 15) i)::int[]); + QUERY PLAN +--------------------------------------------------------------------- + Finalize Aggregate + InitPlan 1 + -> Aggregate + -> Function Scan on generate_series i + -> Gather + Workers Planned: 4 + -> Partial Aggregate + -> Parallel Index Scan using tenk1_hundred on tenk1 + Index Cond: (hundred = ANY ((InitPlan 1).col1)) +(9 rows) + +select count((unique1)) from tenk1 +where hundred = any ((select array_agg(i) from generate_series(1, 100, 15) i)::int[]); + count +------- + 700 +(1 row) + -- test parallel index-only scans. explain (costs off) select count(*) from tenk1 where thousand > 95; @@ -937,6 +961,59 @@ select string4 from tenk1 order by string4 limit 5; reset parallel_leader_participation; reset max_parallel_workers; +create function parallel_safe_volatile(a int) returns int as + $$ begin return a; end; $$ parallel safe volatile language plpgsql; +-- Test gather merge atop of a sort of a partial path +explain (costs off) +select * from tenk1 where four = 2 +order by four, hundred, parallel_safe_volatile(thousand); + QUERY PLAN +--------------------------------------------------------------- + Gather Merge + Workers Planned: 4 + -> Sort + Sort Key: hundred, (parallel_safe_volatile(thousand)) + -> Parallel Seq Scan on tenk1 + Filter: (four = 2) +(6 rows) + +-- Test gather merge atop of an incremental sort a of partial path +set min_parallel_index_scan_size = 0; +set enable_seqscan = off; +explain (costs off) +select * from tenk1 where four = 2 +order by four, hundred, parallel_safe_volatile(thousand); + QUERY PLAN +--------------------------------------------------------------- + Gather Merge + Workers Planned: 4 + -> Incremental Sort + Sort Key: hundred, (parallel_safe_volatile(thousand)) + Presorted Key: hundred + -> Parallel Index Scan using tenk1_hundred on tenk1 + Filter: (four = 2) +(7 rows) + +reset min_parallel_index_scan_size; +reset enable_seqscan; +-- Test GROUP BY with a gather merge path atop of a sort of a partial path +explain (costs off) +select count(*) from tenk1 +group by twenty, parallel_safe_volatile(two); + QUERY PLAN +-------------------------------------------------------------------- + Finalize GroupAggregate + Group Key: twenty, (parallel_safe_volatile(two)) + -> Gather Merge + Workers Planned: 4 + -> Sort + Sort Key: twenty, (parallel_safe_volatile(two)) + -> Partial HashAggregate + Group Key: twenty, parallel_safe_volatile(two) + -> Parallel Seq Scan on tenk1 +(9 rows) + +drop function parallel_safe_volatile(int); SAVEPOINT settings; SET LOCAL debug_parallel_query = 1; explain (costs off) @@ -1097,27 +1174,25 @@ ORDER BY 1; -> Append -> Gather Workers Planned: 4 - Params Evaluated: $1 - InitPlan 1 (returns $1) + InitPlan 1 -> Limit -> Gather Workers Planned: 4 -> Parallel Seq Scan on tenk1 tenk1_2 Filter: (fivethous = 1) -> Parallel Seq Scan on tenk1 - Filter: (fivethous = $1) + Filter: (fivethous = (InitPlan 1).col1) -> Gather Workers Planned: 4 - Params Evaluated: $3 - InitPlan 2 (returns $3) + InitPlan 2 -> Limit -> Gather Workers Planned: 4 -> Parallel Seq Scan on tenk1 tenk1_3 Filter: (fivethous = 1) -> Parallel Seq Scan on tenk1 tenk1_1 - Filter: (fivethous = $3) -(25 rows) + Filter: (fivethous = (InitPlan 2).col1) +(23 rows) -- test interaction with SRFs SELECT * FROM information_schema.foreign_data_wrapper_options @@ -1129,10 +1204,10 @@ ORDER BY 1, 2, 3; EXPLAIN (VERBOSE, COSTS OFF) SELECT generate_series(1, two), array(select generate_series(1, two)) FROM tenk1 ORDER BY tenthous; - QUERY PLAN ----------------------------------------------------------------------- + QUERY PLAN +--------------------------------------------------------------------------- ProjectSet - Output: generate_series(1, tenk1.two), (SubPlan 1), tenk1.tenthous + Output: generate_series(1, tenk1.two), ARRAY(SubPlan 1), tenk1.tenthous -> Gather Merge Output: tenk1.two, tenk1.tenthous Workers Planned: 4 @@ -1219,3 +1294,60 @@ SELECT 1 FROM tenk1_vw_sec (9 rows) rollback; +-- test that function option SET ROLE works in parallel workers. +create role regress_parallel_worker; +create function set_and_report_role() returns text as + $$ select current_setting('role') $$ language sql parallel safe + set role = regress_parallel_worker; +create function set_role_and_error(int) returns int as + $$ select 1 / $1 $$ language sql parallel safe + set role = regress_parallel_worker; +set debug_parallel_query = 0; +select set_and_report_role(); + set_and_report_role +------------------------- + regress_parallel_worker +(1 row) + +select set_role_and_error(0); +ERROR: division by zero +CONTEXT: SQL function "set_role_and_error" statement 1 +set debug_parallel_query = 1; +select set_and_report_role(); + set_and_report_role +------------------------- + regress_parallel_worker +(1 row) + +select set_role_and_error(0); +ERROR: division by zero +CONTEXT: SQL function "set_role_and_error" statement 1 +parallel worker +reset debug_parallel_query; +drop function set_and_report_role(); +drop function set_role_and_error(int); +drop role regress_parallel_worker; +-- don't freeze in ParallelFinish while holding an LWLock +BEGIN; +CREATE FUNCTION my_cmp (int4, int4) +RETURNS int LANGUAGE sql AS +$$ + SELECT + CASE WHEN $1 < $2 THEN -1 + WHEN $1 > $2 THEN 1 + ELSE 0 + END; +$$; +CREATE TABLE parallel_hang (i int4); +INSERT INTO parallel_hang + (SELECT * FROM generate_series(1, 400) gs); +CREATE OPERATOR CLASS int4_custom_ops FOR TYPE int4 USING btree AS + OPERATOR 1 < (int4, int4), OPERATOR 2 <= (int4, int4), + OPERATOR 3 = (int4, int4), OPERATOR 4 >= (int4, int4), + OPERATOR 5 > (int4, int4), FUNCTION 1 my_cmp(int4, int4); +CREATE UNIQUE INDEX parallel_hang_idx + ON parallel_hang + USING btree (i int4_custom_ops); +SET debug_parallel_query = on; +DELETE FROM parallel_hang WHERE 380 <= i AND i <= 420; +ROLLBACK; diff --git a/src/test/regress/expected/sequence.out b/src/test/regress/expected/sequence.out index 7cb2f7cc02b8a..2b47b7796b108 100644 --- a/src/test/regress/expected/sequence.out +++ b/src/test/regress/expected/sequence.out @@ -313,7 +313,8 @@ ALTER SEQUENCE IF EXISTS sequence_test2 RESTART WITH 24 INCREMENT BY 4 MAXVALUE 36 MINVALUE 5 CYCLE; NOTICE: relation "sequence_test2" does not exist, skipping ALTER SEQUENCE serialTest1 CYCLE; -- error, not a sequence -ERROR: "serialtest1" is not a sequence +ERROR: cannot open relation "serialtest1" +DETAIL: This operation is not supported for tables. CREATE SEQUENCE sequence_test2 START WITH 32; CREATE SEQUENCE sequence_test4 INCREMENT BY -1; SELECT nextval('sequence_test2'); diff --git a/src/test/regress/expected/sqljson.out b/src/test/regress/expected/sqljson.out index d73c7e2c6cc51..9e52914a18263 100644 --- a/src/test/regress/expected/sqljson.out +++ b/src/test/regress/expected/sqljson.out @@ -1,3 +1,293 @@ +-- JSON() +SELECT JSON(); +ERROR: syntax error at or near ")" +LINE 1: SELECT JSON(); + ^ +SELECT JSON(NULL); + json +------ + +(1 row) + +SELECT JSON('{ "a" : 1 } '); + json +-------------- + { "a" : 1 } +(1 row) + +SELECT JSON('{ "a" : 1 } ' FORMAT JSON); + json +-------------- + { "a" : 1 } +(1 row) + +SELECT JSON('{ "a" : 1 } ' FORMAT JSON ENCODING UTF8); +ERROR: JSON ENCODING clause is only allowed for bytea input type +LINE 1: SELECT JSON('{ "a" : 1 } ' FORMAT JSON ENCODING UTF8); + ^ +SELECT JSON('{ "a" : 1 } '::bytea FORMAT JSON ENCODING UTF8); + json +-------------- + { "a" : 1 } +(1 row) + +SELECT pg_typeof(JSON('{ "a" : 1 } ')); + pg_typeof +----------- + json +(1 row) + +SELECT JSON(' 1 '::json); + json +--------- + 1 +(1 row) + +SELECT JSON(' 1 '::jsonb); + json +------ + 1 +(1 row) + +SELECT JSON(' 1 '::json WITH UNIQUE KEYS); +ERROR: cannot use non-string types with WITH UNIQUE KEYS clause +LINE 1: SELECT JSON(' 1 '::json WITH UNIQUE KEYS); + ^ +SELECT JSON(123); +ERROR: cannot cast type integer to json +LINE 1: SELECT JSON(123); + ^ +SELECT JSON('{"a": 1, "a": 2}'); + json +------------------ + {"a": 1, "a": 2} +(1 row) + +SELECT JSON('{"a": 1, "a": 2}' WITH UNIQUE KEYS); +ERROR: duplicate JSON object key value +SELECT JSON('{"a": 1, "a": 2}' WITHOUT UNIQUE KEYS); + json +------------------ + {"a": 1, "a": 2} +(1 row) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'); + QUERY PLAN +----------------------------- + Result + Output: JSON('123'::json) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' FORMAT JSON); + QUERY PLAN +----------------------------- + Result + Output: JSON('123'::json) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'::bytea FORMAT JSON); + QUERY PLAN +----------------------------------------------- + Result + Output: JSON('\x313233'::bytea FORMAT JSON) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'::bytea FORMAT JSON ENCODING UTF8); + QUERY PLAN +------------------------------------------------------------- + Result + Output: JSON('\x313233'::bytea FORMAT JSON ENCODING UTF8) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' WITH UNIQUE KEYS); + QUERY PLAN +---------------------------------------------- + Result + Output: JSON('123'::text WITH UNIQUE KEYS) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' WITHOUT UNIQUE KEYS); + QUERY PLAN +----------------------------- + Result + Output: JSON('123'::json) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'); + QUERY PLAN +----------------------------- + Result + Output: JSON('123'::json) +(2 rows) + +SELECT pg_typeof(JSON('123')); + pg_typeof +----------- + json +(1 row) + +-- JSON_SCALAR() +SELECT JSON_SCALAR(); +ERROR: syntax error at or near ")" +LINE 1: SELECT JSON_SCALAR(); + ^ +SELECT JSON_SCALAR(NULL); + json_scalar +------------- + +(1 row) + +SELECT JSON_SCALAR(NULL::int); + json_scalar +------------- + +(1 row) + +SELECT JSON_SCALAR(123); + json_scalar +------------- + 123 +(1 row) + +SELECT JSON_SCALAR(123.45); + json_scalar +------------- + 123.45 +(1 row) + +SELECT JSON_SCALAR(123.45::numeric); + json_scalar +------------- + 123.45 +(1 row) + +SELECT JSON_SCALAR(true); + json_scalar +------------- + true +(1 row) + +SELECT JSON_SCALAR(false); + json_scalar +------------- + false +(1 row) + +SELECT JSON_SCALAR(' 123.45'); + json_scalar +------------- + " 123.45" +(1 row) + +SELECT JSON_SCALAR('2020-06-07'::date); + json_scalar +-------------- + "2020-06-07" +(1 row) + +SELECT JSON_SCALAR('2020-06-07 01:02:03'::timestamp); + json_scalar +----------------------- + "2020-06-07T01:02:03" +(1 row) + +SELECT JSON_SCALAR('{}'::json); + json_scalar +------------- + {} +(1 row) + +SELECT JSON_SCALAR('{}'::jsonb); + json_scalar +------------- + {} +(1 row) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR(123); + QUERY PLAN +---------------------------- + Result + Output: JSON_SCALAR(123) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR('123'); + QUERY PLAN +------------------------------------ + Result + Output: JSON_SCALAR('123'::text) +(2 rows) + +-- JSON_SERIALIZE() +SELECT JSON_SERIALIZE(); +ERROR: syntax error at or near ")" +LINE 1: SELECT JSON_SERIALIZE(); + ^ +SELECT JSON_SERIALIZE(NULL); + json_serialize +---------------- + +(1 row) + +SELECT JSON_SERIALIZE(JSON('{ "a" : 1 } ')); + json_serialize +---------------- + { "a" : 1 } +(1 row) + +SELECT JSON_SERIALIZE('{ "a" : 1 } '); + json_serialize +---------------- + { "a" : 1 } +(1 row) + +SELECT JSON_SERIALIZE('1'); + json_serialize +---------------- + 1 +(1 row) + +SELECT JSON_SERIALIZE('1' FORMAT JSON); + json_serialize +---------------- + 1 +(1 row) + +SELECT JSON_SERIALIZE('{ "a" : 1 } ' RETURNING bytea); + json_serialize +---------------------------- + \x7b20226122203a2031207d20 +(1 row) + +SELECT JSON_SERIALIZE('{ "a" : 1 } ' RETURNING varchar); + json_serialize +---------------- + { "a" : 1 } +(1 row) + +SELECT pg_typeof(JSON_SERIALIZE(NULL)); + pg_typeof +----------- + text +(1 row) + +-- only string types or bytea allowed +SELECT JSON_SERIALIZE('{ "a" : 1 } ' RETURNING jsonb); +ERROR: cannot use type jsonb in RETURNING clause of JSON_SERIALIZE() +HINT: Try returning a string type or bytea. +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SERIALIZE('{}'); + QUERY PLAN +----------------------------------------------------- + Result + Output: JSON_SERIALIZE('{}'::json RETURNING text) +(2 rows) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SERIALIZE('{}' RETURNING bytea); + QUERY PLAN +------------------------------------------------------ + Result + Output: JSON_SERIALIZE('{}'::json RETURNING bytea) +(2 rows) + -- JSON_OBJECT() SELECT JSON_OBJECT(); json_object @@ -84,9 +374,6 @@ ERROR: JSON ENCODING clause is only allowed for bytea input type LINE 1: SELECT JSON_OBJECT('foo': NULL::int FORMAT JSON ENCODING UTF... ^ SELECT JSON_OBJECT('foo': NULL::json FORMAT JSON); -WARNING: FORMAT JSON has no effect for json and jsonb types -LINE 1: SELECT JSON_OBJECT('foo': NULL::json FORMAT JSON); - ^ json_object ---------------- {"foo" : null} @@ -97,9 +384,6 @@ ERROR: JSON ENCODING clause is only allowed for bytea input type LINE 1: SELECT JSON_OBJECT('foo': NULL::json FORMAT JSON ENCODING UT... ^ SELECT JSON_OBJECT('foo': NULL::jsonb FORMAT JSON); -WARNING: FORMAT JSON has no effect for json and jsonb types -LINE 1: SELECT JSON_OBJECT('foo': NULL::jsonb FORMAT JSON); - ^ json_object --------------- {"foo": null} @@ -253,18 +537,20 @@ SELECT JSON_OBJECT('a': '1', 'b': NULL, 'c': 2 ABSENT ON NULL); {"a" : "1", "c" : 2} (1 row) +SELECT JSON_OBJECT(1: 1, '2': NULL, '3': 1, repeat('x', 1000): 1, 2: repeat('a', 100) WITH UNIQUE); +ERROR: duplicate JSON object key value: "2" SELECT JSON_OBJECT(1: 1, '1': NULL WITH UNIQUE); -ERROR: duplicate JSON key "1" +ERROR: duplicate JSON object key value: "1" SELECT JSON_OBJECT(1: 1, '1': NULL ABSENT ON NULL WITH UNIQUE); -ERROR: duplicate JSON key "1" +ERROR: duplicate JSON object key value: "1" SELECT JSON_OBJECT(1: 1, '1': NULL NULL ON NULL WITH UNIQUE RETURNING jsonb); -ERROR: duplicate JSON object key +ERROR: duplicate JSON object key value SELECT JSON_OBJECT(1: 1, '1': NULL ABSENT ON NULL WITH UNIQUE RETURNING jsonb); -ERROR: duplicate JSON object key +ERROR: duplicate JSON object key value SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 NULL ON NULL WITH UNIQUE); -ERROR: duplicate JSON key "1" +ERROR: duplicate JSON object key value: "1" SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITH UNIQUE); -ERROR: duplicate JSON key "1" +ERROR: duplicate JSON object key value: "1" SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITHOUT UNIQUE); json_object -------------------- @@ -272,7 +558,7 @@ SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITHOUT UNIQUE); (1 row) SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITH UNIQUE RETURNING jsonb); -ERROR: duplicate JSON object key +ERROR: duplicate JSON object key value SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITHOUT UNIQUE RETURNING jsonb); json_object ------------- @@ -285,6 +571,18 @@ SELECT JSON_OBJECT(1: 1, '2': NULL, '3': 1, 4: NULL, '5': 'a' ABSENT ON NULL WIT {"1": 1, "3": 1, "5": "a"} (1 row) +-- BUG: https://postgr.es/m/CADXhmgTJtJZK9A3Na_ry%2BXrq-ghjcejBRhcRMzWZvbd__QdgJA%40mail.gmail.com +-- datum_to_jsonb_internal() didn't catch keys that are casts instead of a simple scalar +CREATE TYPE mood AS ENUM ('happy', 'sad', 'neutral'); +CREATE FUNCTION mood_to_json(mood) RETURNS json AS $$ + SELECT to_json($1::text); +$$ LANGUAGE sql IMMUTABLE; +CREATE CAST (mood AS json) WITH FUNCTION mood_to_json(mood) AS IMPLICIT; +SELECT JSON_OBJECT('happy'::mood: '123'::jsonb); +ERROR: key value must be scalar, not array, composite, or json +DROP CAST (mood AS json); +DROP FUNCTION mood_to_json; +DROP TYPE mood; -- JSON_ARRAY() SELECT JSON_ARRAY(); json_array @@ -449,6 +747,12 @@ SELECT JSON_ARRAY(SELECT i FROM (VALUES (3), (1), (NULL), (2)) foo(i) ORDER BY i [1, 2, 3] (1 row) +SELECT JSON_ARRAY(WITH x AS (SELECT 1) VALUES (TRUE)); + json_array +------------ + [true] +(1 row) + -- Should fail SELECT JSON_ARRAY(SELECT FROM (VALUES (1)) foo(i)); ERROR: subquery must return only one column @@ -531,22 +835,22 @@ SELECT FROM (VALUES (NULL), (3), (1), (NULL), (NULL), (5), (2), (4), (NULL)) foo(bar); -[ RECORD 1 ]--------------------+------------------------------------------------------------------------------------------------------------------------- -no_options | [1, 2, 3, 4, 5] -returning_jsonb | [1, 2, 3, 4, 5] -absent_on_null | [1, 2, 3, 4, 5] -absentonnull_returning_jsonb | [1, 2, 3, 4, 5] -null_on_null | [1, 2, 3, 4, 5, null, null, null, null] -nullonnull_returning_jsonb | [1, 2, 3, 4, 5, null, null, null, null] -row_no_options | [{"bar":1}, + - | {"bar":2}, + +no_options | [3, 1, 5, 2, 4] +returning_jsonb | [3, 1, 5, 2, 4] +absent_on_null | [3, 1, 5, 2, 4] +absentonnull_returning_jsonb | [3, 1, 5, 2, 4] +null_on_null | [null, 3, 1, null, null, 5, 2, 4, null] +nullonnull_returning_jsonb | [null, 3, 1, null, null, 5, 2, 4, null] +row_no_options | [{"bar":null}, + | {"bar":3}, + - | {"bar":4}, + - | {"bar":5}, + - | {"bar":null}, + + | {"bar":1}, + | {"bar":null}, + | {"bar":null}, + + | {"bar":5}, + + | {"bar":2}, + + | {"bar":4}, + | {"bar":null}] -row_returning_jsonb | [{"bar": 1}, {"bar": 2}, {"bar": 3}, {"bar": 4}, {"bar": 5}, {"bar": null}, {"bar": null}, {"bar": null}, {"bar": null}] +row_returning_jsonb | [{"bar": null}, {"bar": 3}, {"bar": 1}, {"bar": null}, {"bar": null}, {"bar": 5}, {"bar": 2}, {"bar": 4}, {"bar": null}] row_filtered_agg | [{"bar":3}, + | {"bar":4}, + | {"bar":5}] @@ -613,10 +917,10 @@ FROM SELECT JSON_OBJECTAGG(k: v WITH UNIQUE KEYS) FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); -ERROR: duplicate JSON key "1" +ERROR: duplicate JSON object key value: "1" SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS) FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); -ERROR: duplicate JSON key "1" +ERROR: duplicate JSON object key value: "1" SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS) FROM (VALUES (1, 1), (0, NULL), (3, NULL), (2, 2), (4, NULL)) foo(k, v); json_objectagg @@ -626,10 +930,20 @@ FROM (VALUES (1, 1), (0, NULL), (3, NULL), (2, 2), (4, NULL)) foo(k, v); SELECT JSON_OBJECTAGG(k: v WITH UNIQUE KEYS RETURNING jsonb) FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); -ERROR: duplicate JSON object key +ERROR: duplicate JSON object key value SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb) FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); -ERROR: duplicate JSON object key +ERROR: duplicate JSON object key value +SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb) +FROM (VALUES (1, 1), (0, NULL),(4, null), (5, null),(6, null),(2, 2)) foo(k, v); + json_objectagg +------------------ + {"1": 1, "2": 2} +(1 row) + +SELECT JSON_OBJECTAGG(mod(i,100): (i)::text FORMAT JSON WITH UNIQUE) +FROM generate_series(0, 199) i; +ERROR: duplicate JSON object key value: "0" -- Test JSON_OBJECT deparsing EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json); @@ -645,6 +959,41 @@ SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json); CREATE OR REPLACE VIEW public.json_object_view AS SELECT JSON_OBJECT('foo' : '1'::text FORMAT JSON, 'bar' : 'baz'::text RETURNING json) AS "json_object" DROP VIEW json_object_view; +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v WITH UNIQUE KEYS) OVER (ORDER BY k) +FROM (VALUES (1,1), (2,2)) a(k,v); + a | json_objectagg +---------------+---------------------- + {"k":1,"v":1} | { "1" : 1 } + {"k":2,"v":2} | { "1" : 1, "2" : 2 } +(2 rows) + +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v WITH UNIQUE KEYS) OVER (ORDER BY k) +FROM (VALUES (1,1), (1,2), (2,2)) a(k,v); +ERROR: duplicate JSON object key value: "1" +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v ABSENT ON NULL WITH UNIQUE KEYS) + OVER (ORDER BY k) +FROM (VALUES (1,1), (1,null), (2,2)) a(k,v); +ERROR: duplicate JSON object key value: "1" +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v ABSENT ON NULL) +OVER (ORDER BY k) +FROM (VALUES (1,1), (1,null), (2,2)) a(k,v); + a | json_objectagg +------------------+---------------------- + {"k":1,"v":1} | { "1" : 1 } + {"k":1,"v":null} | { "1" : 1 } + {"k":2,"v":2} | { "1" : 1, "2" : 2 } +(3 rows) + +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v ABSENT ON NULL) +OVER (ORDER BY k RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) +FROM (VALUES (1,1), (1,null), (2,2)) a(k,v); + a | json_objectagg +------------------+---------------------- + {"k":1,"v":1} | { "1" : 1, "2" : 2 } + {"k":1,"v":null} | { "1" : 1, "2" : 2 } + {"k":2,"v":2} | { "1" : 1, "2" : 2 } +(3 rows) + -- Test JSON_ARRAY deparsing EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_ARRAY('1' FORMAT JSON, 2 RETURNING json); @@ -738,8 +1087,8 @@ SELECT JSON_ARRAY(SELECT i FROM (VALUES (1), (2), (NULL), (4)) foo(i) RETURNING QUERY PLAN --------------------------------------------------------------------- Result - Output: $0 - InitPlan 1 (returns $0) + Output: (InitPlan 1).col1 + InitPlan 1 -> Aggregate Output: JSON_ARRAYAGG("*VALUES*".column1 RETURNING jsonb) -> Values Scan on "*VALUES*" @@ -952,3 +1301,69 @@ CREATE OR REPLACE VIEW public.is_json_view AS '{}'::text IS JSON OBJECT WITH UNIQUE KEYS AS object FROM generate_series(1, 3) i(i) DROP VIEW is_json_view; +-- Test implicit coercion to a fixed-length type specified in RETURNING +SELECT JSON_SERIALIZE('{ "a" : 1 } ' RETURNING varchar(2)); +ERROR: value too long for type character varying(2) +SELECT JSON_OBJECT('a': JSON_OBJECT('b': 1 RETURNING varchar(2))); +ERROR: value too long for type character varying(2) +SELECT JSON_ARRAY(JSON_ARRAY('{ "a" : 123 }' RETURNING varchar(2))); +ERROR: value too long for type character varying(2) +SELECT JSON_ARRAYAGG(('111' || i)::bytea FORMAT JSON NULL ON NULL RETURNING varchar(2)) FROM generate_series(1,1) i; +ERROR: value too long for type character varying(2) +SELECT JSON_OBJECTAGG(i: ('111' || i)::bytea FORMAT JSON WITH UNIQUE RETURNING varchar(2)) FROM generate_series(1, 1) i; +ERROR: value too long for type character varying(2) +-- Now try domain over fixed-length type +CREATE DOMAIN sqljson_char2 AS char(2) CHECK (VALUE NOT IN ('12')); +SELECT JSON_SERIALIZE('123' RETURNING sqljson_char2); +ERROR: value too long for type character(2) +SELECT JSON_SERIALIZE('12' RETURNING sqljson_char2); +ERROR: value for domain sqljson_char2 violates check constraint "sqljson_char2_check" +-- Bug #18657: JsonValueExpr.raw_expr was not initialized in ExecInitExprRec() +-- causing the Aggrefs contained in it to also not be initialized, which led +-- to a crash in ExecBuildAggTrans() as mentioned in the bug report: +-- https://postgr.es/m/18657-1b90ccce2b16bdb8@postgresql.org +CREATE FUNCTION volatile_one() RETURNS int AS $$ BEGIN RETURN 1; END; $$ LANGUAGE plpgsql VOLATILE; +CREATE FUNCTION stable_one() RETURNS int AS $$ BEGIN RETURN 1; END; $$ LANGUAGE plpgsql STABLE; +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': volatile_one() RETURNING text) FORMAT JSON); + QUERY PLAN +------------------------------------------------------------------------------------------------------------- + Aggregate + Output: JSON_OBJECT('a' : JSON_OBJECTAGG('b' : volatile_one() RETURNING text) FORMAT JSON RETURNING json) + -> Result +(3 rows) + +SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': volatile_one() RETURNING text) FORMAT JSON); + json_object +--------------------- + {"a" : { "b" : 1 }} +(1 row) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': stable_one() RETURNING text) FORMAT JSON); + QUERY PLAN +----------------------------------------------------------------------------------------------------------- + Aggregate + Output: JSON_OBJECT('a' : JSON_OBJECTAGG('b' : stable_one() RETURNING text) FORMAT JSON RETURNING json) + -> Result +(3 rows) + +SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': stable_one() RETURNING text) FORMAT JSON); + json_object +--------------------- + {"a" : { "b" : 1 }} +(1 row) + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': 1 RETURNING text) FORMAT JSON); + QUERY PLAN +------------------------------------------------------------------------------------------------ + Aggregate + Output: JSON_OBJECT('a' : JSON_OBJECTAGG('b' : 1 RETURNING text) FORMAT JSON RETURNING json) + -> Result +(3 rows) + +SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': 1 RETURNING text) FORMAT JSON); + json_object +--------------------- + {"a" : { "b" : 1 }} +(1 row) + +DROP FUNCTION volatile_one, stable_one; diff --git a/src/test/regress/expected/sqljson_jsontable.out b/src/test/regress/expected/sqljson_jsontable.out new file mode 100644 index 0000000000000..8ab061f9f7b97 --- /dev/null +++ b/src/test/regress/expected/sqljson_jsontable.out @@ -0,0 +1,1179 @@ +-- JSON_TABLE +-- Should fail (JSON_TABLE can be used only in FROM clause) +SELECT JSON_TABLE('[]', '$'); +ERROR: syntax error at or near "(" +LINE 1: SELECT JSON_TABLE('[]', '$'); + ^ +-- Only allow EMPTY and ERROR for ON ERROR +SELECT * FROM JSON_TABLE('[]', 'strict $.a' COLUMNS (js2 int PATH '$') DEFAULT 1 ON ERROR); +ERROR: invalid ON ERROR behavior +LINE 1: ...BLE('[]', 'strict $.a' COLUMNS (js2 int PATH '$') DEFAULT 1 ... + ^ +DETAIL: Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause. +SELECT * FROM JSON_TABLE('[]', 'strict $.a' COLUMNS (js2 int PATH '$') NULL ON ERROR); +ERROR: invalid ON ERROR behavior +LINE 1: ...BLE('[]', 'strict $.a' COLUMNS (js2 int PATH '$') NULL ON ER... + ^ +DETAIL: Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause. +SELECT * FROM JSON_TABLE('[]', 'strict $.a' COLUMNS (js2 int PATH '$') EMPTY ON ERROR); + js2 +----- +(0 rows) + +SELECT * FROM JSON_TABLE('[]', 'strict $.a' COLUMNS (js2 int PATH '$') ERROR ON ERROR); +ERROR: jsonpath member accessor can only be applied to an object +-- Column and path names must be distinct +SELECT * FROM JSON_TABLE(jsonb'"1.23"', '$.a' as js2 COLUMNS (js2 int path '$')); +ERROR: duplicate JSON_TABLE column or path name: js2 +LINE 1: ...M JSON_TABLE(jsonb'"1.23"', '$.a' as js2 COLUMNS (js2 int pa... + ^ +-- Should fail (no columns) +SELECT * FROM JSON_TABLE(NULL, '$' COLUMNS ()); +ERROR: syntax error at or near ")" +LINE 1: SELECT * FROM JSON_TABLE(NULL, '$' COLUMNS ()); + ^ +SELECT * FROM JSON_TABLE (NULL::jsonb, '$' COLUMNS (v1 timestamp)) AS f (v1, v2); +ERROR: JSON_TABLE function has 1 columns available but 2 columns specified +--duplicated column name +SELECT * FROM JSON_TABLE(jsonb'"1.23"', '$.a' COLUMNS (js2 int path '$', js2 int path '$')); +ERROR: duplicate JSON_TABLE column or path name: js2 +LINE 1: ...E(jsonb'"1.23"', '$.a' COLUMNS (js2 int path '$', js2 int pa... + ^ +--return composite data type. +create type comp as (a int, b int); +SELECT * FROM JSON_TABLE(jsonb '{"rec": "(1,2)"}', '$' COLUMNS (id FOR ORDINALITY, comp comp path '$.rec' omit quotes)) jt; + id | comp +----+------- + 1 | (1,2) +(1 row) + +drop type comp; +-- NULL => empty table +SELECT * FROM JSON_TABLE(NULL::jsonb, '$' COLUMNS (foo int)) bar; + foo +----- +(0 rows) + +SELECT * FROM JSON_TABLE(jsonb'"1.23"', 'strict $.a' COLUMNS (js2 int PATH '$')); + js2 +----- +(0 rows) + +-- +SELECT * FROM JSON_TABLE(jsonb '123', '$' + COLUMNS (item int PATH '$', foo int)) bar; + item | foo +------+----- + 123 | +(1 row) + +-- JSON_TABLE: basic functionality +CREATE DOMAIN jsonb_test_domain AS text CHECK (value <> 'foo'); +CREATE TEMP TABLE json_table_test (js) AS + (VALUES + ('1'), + ('[]'), + ('{}'), + ('[1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""]') + ); +-- Regular "unformatted" columns +SELECT * +FROM json_table_test vals + LEFT OUTER JOIN + JSON_TABLE( + vals.js::jsonb, 'lax $[*]' + COLUMNS ( + id FOR ORDINALITY, + "int" int PATH '$', + "text" text PATH '$', + "char(4)" char(4) PATH '$', + "bool" bool PATH '$', + "numeric" numeric PATH '$', + "domain" jsonb_test_domain PATH '$', + js json PATH '$', + jb jsonb PATH '$' + ) + ) jt + ON true; + js | id | int | text | char(4) | bool | numeric | domain | js | jb +---------------------------------------------------------------------------------------+----+-----+---------+---------+------+---------+---------+--------------+-------------- + 1 | 1 | 1 | 1 | 1 | t | 1 | 1 | 1 | 1 + [] | | | | | | | | | + {} | 1 | | | | | | | {} | {} + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 1 | 1 | 1 | 1 | t | 1 | 1 | 1 | 1 + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 2 | | 1.23 | 1.23 | | 1.23 | 1.23 | 1.23 | 1.23 + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 3 | 2 | 2 | 2 | | 2 | 2 | "2" | "2" + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 4 | | aaaaaaa | | | | aaaaaaa | "aaaaaaa" | "aaaaaaa" + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 5 | | foo | foo | | | | "foo" | "foo" + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 6 | | | | | | | null | null + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 7 | | f | f | f | | false | false | false + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 8 | | t | t | t | | true | true | true + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 9 | | | | | | | {"aaa": 123} | {"aaa": 123} + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 10 | | [1,2] | | | | [1,2] | "[1,2]" | "[1,2]" + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 11 | | "str" | | | | "str" | "\"str\"" | "\"str\"" +(14 rows) + +-- "formatted" columns +SELECT * +FROM json_table_test vals + LEFT OUTER JOIN + JSON_TABLE( + vals.js::jsonb, 'lax $[*]' + COLUMNS ( + id FOR ORDINALITY, + jst text FORMAT JSON PATH '$', + jsc char(4) FORMAT JSON PATH '$', + jsv varchar(4) FORMAT JSON PATH '$', + jsb jsonb FORMAT JSON PATH '$', + jsbq jsonb FORMAT JSON PATH '$' OMIT QUOTES + ) + ) jt + ON true; + js | id | jst | jsc | jsv | jsb | jsbq +---------------------------------------------------------------------------------------+----+--------------+------+------+--------------+-------------- + 1 | 1 | 1 | 1 | 1 | 1 | 1 + [] | | | | | | + {} | 1 | {} | {} | {} | {} | {} + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 1 | 1 | 1 | 1 | 1 | 1 + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 2 | 1.23 | 1.23 | 1.23 | 1.23 | 1.23 + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 3 | "2" | "2" | "2" | "2" | 2 + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 4 | "aaaaaaa" | | | "aaaaaaa" | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 5 | "foo" | | | "foo" | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 6 | null | null | null | null | null + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 7 | false | | | false | false + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 8 | true | true | true | true | true + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 9 | {"aaa": 123} | | | {"aaa": 123} | {"aaa": 123} + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 10 | "[1,2]" | | | "[1,2]" | [1, 2] + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 11 | "\"str\"" | | | "\"str\"" | "str" +(14 rows) + +-- EXISTS columns +SELECT * +FROM json_table_test vals + LEFT OUTER JOIN + JSON_TABLE( + vals.js::jsonb, 'lax $[*]' + COLUMNS ( + id FOR ORDINALITY, + exists1 bool EXISTS PATH '$.aaa', + exists2 int EXISTS PATH '$.aaa', + exists3 int EXISTS PATH 'strict $.aaa' UNKNOWN ON ERROR, + exists4 text EXISTS PATH 'strict $.aaa' FALSE ON ERROR + ) + ) jt + ON true; + js | id | exists1 | exists2 | exists3 | exists4 +---------------------------------------------------------------------------------------+----+---------+---------+---------+--------- + 1 | 1 | f | 0 | | false + [] | | | | | + {} | 1 | f | 0 | | false + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 1 | f | 0 | | false + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 2 | f | 0 | | false + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 3 | f | 0 | | false + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 4 | f | 0 | | false + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 5 | f | 0 | | false + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 6 | f | 0 | | false + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 7 | f | 0 | | false + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 8 | f | 0 | | false + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 9 | t | 1 | 1 | true + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 10 | f | 0 | | false + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 11 | f | 0 | | false +(14 rows) + +-- Other miscellaneous checks +SELECT * +FROM json_table_test vals + LEFT OUTER JOIN + JSON_TABLE( + vals.js::jsonb, 'lax $[*]' + COLUMNS ( + id FOR ORDINALITY, + aaa int, -- "aaa" has implicit path '$."aaa"' + aaa1 int PATH '$.aaa', + js2 json PATH '$', + jsb2w jsonb PATH '$' WITH WRAPPER, + jsb2q jsonb PATH '$' OMIT QUOTES, + ia int[] PATH '$', + ta text[] PATH '$', + jba jsonb[] PATH '$' + ) + ) jt + ON true; + js | id | aaa | aaa1 | js2 | jsb2w | jsb2q | ia | ta | jba +---------------------------------------------------------------------------------------+----+-----+------+--------------+----------------+--------------+----+----+----- + 1 | 1 | | | 1 | [1] | 1 | | | + [] | | | | | | | | | + {} | 1 | | | {} | [{}] | {} | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 1 | | | 1 | [1] | 1 | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 2 | | | 1.23 | [1.23] | 1.23 | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 3 | | | "2" | ["2"] | 2 | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 4 | | | "aaaaaaa" | ["aaaaaaa"] | | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 5 | | | "foo" | ["foo"] | | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 6 | | | null | [null] | null | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 7 | | | false | [false] | false | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 8 | | | true | [true] | true | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 9 | 123 | 123 | {"aaa": 123} | [{"aaa": 123}] | {"aaa": 123} | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 10 | | | "[1,2]" | ["[1,2]"] | [1, 2] | | | + [1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""] | 11 | | | "\"str\"" | ["\"str\""] | "str" | | | +(14 rows) + +-- Test using casts in DEFAULT .. ON ERROR expression +SELECT * FROM JSON_TABLE(jsonb '{"d1": "H"}', '$' + COLUMNS (js1 jsonb_test_domain PATH '$.a2' DEFAULT '"foo1"'::jsonb::text ON EMPTY)); + js1 +-------- + "foo1" +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '{"d1": "H"}', '$' + COLUMNS (js1 jsonb_test_domain PATH '$.a2' DEFAULT 'foo'::jsonb_test_domain ON EMPTY)); +ERROR: could not coerce ON EMPTY expression (DEFAULT) to the RETURNING type +DETAIL: value for domain jsonb_test_domain violates check constraint "jsonb_test_domain_check" +SELECT * FROM JSON_TABLE(jsonb '{"d1": "H"}', '$' + COLUMNS (js1 jsonb_test_domain PATH '$.a2' DEFAULT 'foo1'::jsonb_test_domain ON EMPTY)); + js1 +------ + foo1 +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '{"d1": "foo"}', '$' + COLUMNS (js1 jsonb_test_domain PATH '$.d1' DEFAULT 'foo2'::jsonb_test_domain ON ERROR)); + js1 +------ + foo2 +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '{"d1": "foo"}', '$' + COLUMNS (js1 oid[] PATH '$.d2' DEFAULT '{1}'::int[]::oid[] ON EMPTY)); + js1 +----- + {1} +(1 row) + +-- JSON_TABLE: Test backward parsing +CREATE VIEW jsonb_table_view2 AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + "int" int PATH '$', + "text" text PATH '$', + "char(4)" char(4) PATH '$', + "bool" bool PATH '$', + "numeric" numeric PATH '$', + "domain" jsonb_test_domain PATH '$')); +CREATE VIEW jsonb_table_view3 AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + js json PATH '$', + jb jsonb PATH '$', + jst text FORMAT JSON PATH '$', + jsc char(4) FORMAT JSON PATH '$', + jsv varchar(4) FORMAT JSON PATH '$')); +CREATE VIEW jsonb_table_view4 AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + jsb jsonb FORMAT JSON PATH '$', + jsbq jsonb FORMAT JSON PATH '$' OMIT QUOTES, + aaa int, -- implicit path '$."aaa"', + aaa1 int PATH '$.aaa')); +CREATE VIEW jsonb_table_view5 AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + exists1 bool EXISTS PATH '$.aaa', + exists2 int EXISTS PATH '$.aaa' TRUE ON ERROR, + exists3 text EXISTS PATH 'strict $.aaa' UNKNOWN ON ERROR)); +CREATE VIEW jsonb_table_view6 AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + js2 json PATH '$', + jsb2w jsonb PATH '$' WITH WRAPPER, + jsb2q jsonb PATH '$' OMIT QUOTES, + ia int[] PATH '$', + ta text[] PATH '$', + jba jsonb[] PATH '$')); +\sv jsonb_table_view2 +CREATE OR REPLACE VIEW public.jsonb_table_view2 AS + SELECT "int", + text, + "char(4)", + bool, + "numeric", + domain + FROM JSON_TABLE( + 'null'::jsonb, '$[*]' AS json_table_path_0 + PASSING + 1 + 2 AS a, + '"foo"'::json AS "b c" + COLUMNS ( + "int" integer PATH '$', + text text PATH '$', + "char(4)" character(4) PATH '$', + bool boolean PATH '$', + "numeric" numeric PATH '$', + domain jsonb_test_domain PATH '$' + ) + ) +\sv jsonb_table_view3 +CREATE OR REPLACE VIEW public.jsonb_table_view3 AS + SELECT js, + jb, + jst, + jsc, + jsv + FROM JSON_TABLE( + 'null'::jsonb, '$[*]' AS json_table_path_0 + PASSING + 1 + 2 AS a, + '"foo"'::json AS "b c" + COLUMNS ( + js json PATH '$' WITHOUT WRAPPER KEEP QUOTES, + jb jsonb PATH '$' WITHOUT WRAPPER KEEP QUOTES, + jst text FORMAT JSON PATH '$' WITHOUT WRAPPER KEEP QUOTES, + jsc character(4) FORMAT JSON PATH '$' WITHOUT WRAPPER KEEP QUOTES, + jsv character varying(4) FORMAT JSON PATH '$' WITHOUT WRAPPER KEEP QUOTES + ) + ) +\sv jsonb_table_view4 +CREATE OR REPLACE VIEW public.jsonb_table_view4 AS + SELECT jsb, + jsbq, + aaa, + aaa1 + FROM JSON_TABLE( + 'null'::jsonb, '$[*]' AS json_table_path_0 + PASSING + 1 + 2 AS a, + '"foo"'::json AS "b c" + COLUMNS ( + jsb jsonb PATH '$' WITHOUT WRAPPER KEEP QUOTES, + jsbq jsonb PATH '$' WITHOUT WRAPPER OMIT QUOTES, + aaa integer PATH '$."aaa"', + aaa1 integer PATH '$."aaa"' + ) + ) +\sv jsonb_table_view5 +CREATE OR REPLACE VIEW public.jsonb_table_view5 AS + SELECT exists1, + exists2, + exists3 + FROM JSON_TABLE( + 'null'::jsonb, '$[*]' AS json_table_path_0 + PASSING + 1 + 2 AS a, + '"foo"'::json AS "b c" + COLUMNS ( + exists1 boolean EXISTS PATH '$."aaa"', + exists2 integer EXISTS PATH '$."aaa"' TRUE ON ERROR, + exists3 text EXISTS PATH 'strict $."aaa"' UNKNOWN ON ERROR + ) + ) +\sv jsonb_table_view6 +CREATE OR REPLACE VIEW public.jsonb_table_view6 AS + SELECT js2, + jsb2w, + jsb2q, + ia, + ta, + jba + FROM JSON_TABLE( + 'null'::jsonb, '$[*]' AS json_table_path_0 + PASSING + 1 + 2 AS a, + '"foo"'::json AS "b c" + COLUMNS ( + js2 json PATH '$' WITHOUT WRAPPER KEEP QUOTES, + jsb2w jsonb PATH '$' WITH UNCONDITIONAL WRAPPER KEEP QUOTES, + jsb2q jsonb PATH '$' WITHOUT WRAPPER OMIT QUOTES, + ia integer[] PATH '$' WITHOUT WRAPPER KEEP QUOTES, + ta text[] PATH '$' WITHOUT WRAPPER KEEP QUOTES, + jba jsonb[] PATH '$' WITHOUT WRAPPER KEEP QUOTES + ) + ) +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM jsonb_table_view2; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Table Function Scan on "json_table" + Output: "json_table"."int", "json_table".text, "json_table"."char(4)", "json_table".bool, "json_table"."numeric", "json_table".domain + Table Function Call: JSON_TABLE('null'::jsonb, '$[*]' AS json_table_path_0 PASSING 3 AS a, '"foo"'::jsonb AS "b c" COLUMNS ("int" integer PATH '$', text text PATH '$', "char(4)" character(4) PATH '$', bool boolean PATH '$', "numeric" numeric PATH '$', domain jsonb_test_domain PATH '$')) +(3 rows) + +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM jsonb_table_view3; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Table Function Scan on "json_table" + Output: "json_table".js, "json_table".jb, "json_table".jst, "json_table".jsc, "json_table".jsv + Table Function Call: JSON_TABLE('null'::jsonb, '$[*]' AS json_table_path_0 PASSING 3 AS a, '"foo"'::jsonb AS "b c" COLUMNS (js json PATH '$' WITHOUT WRAPPER KEEP QUOTES, jb jsonb PATH '$' WITHOUT WRAPPER KEEP QUOTES, jst text FORMAT JSON PATH '$' WITHOUT WRAPPER KEEP QUOTES, jsc character(4) FORMAT JSON PATH '$' WITHOUT WRAPPER KEEP QUOTES, jsv character varying(4) FORMAT JSON PATH '$' WITHOUT WRAPPER KEEP QUOTES)) +(3 rows) + +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM jsonb_table_view4; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + Table Function Scan on "json_table" + Output: "json_table".jsb, "json_table".jsbq, "json_table".aaa, "json_table".aaa1 + Table Function Call: JSON_TABLE('null'::jsonb, '$[*]' AS json_table_path_0 PASSING 3 AS a, '"foo"'::jsonb AS "b c" COLUMNS (jsb jsonb PATH '$' WITHOUT WRAPPER KEEP QUOTES, jsbq jsonb PATH '$' WITHOUT WRAPPER OMIT QUOTES, aaa integer PATH '$."aaa"', aaa1 integer PATH '$."aaa"')) +(3 rows) + +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM jsonb_table_view5; + QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Table Function Scan on "json_table" + Output: "json_table".exists1, "json_table".exists2, "json_table".exists3 + Table Function Call: JSON_TABLE('null'::jsonb, '$[*]' AS json_table_path_0 PASSING 3 AS a, '"foo"'::jsonb AS "b c" COLUMNS (exists1 boolean EXISTS PATH '$."aaa"', exists2 integer EXISTS PATH '$."aaa"' TRUE ON ERROR, exists3 text EXISTS PATH 'strict $."aaa"' UNKNOWN ON ERROR)) +(3 rows) + +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM jsonb_table_view6; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Table Function Scan on "json_table" + Output: "json_table".js2, "json_table".jsb2w, "json_table".jsb2q, "json_table".ia, "json_table".ta, "json_table".jba + Table Function Call: JSON_TABLE('null'::jsonb, '$[*]' AS json_table_path_0 PASSING 3 AS a, '"foo"'::jsonb AS "b c" COLUMNS (js2 json PATH '$' WITHOUT WRAPPER KEEP QUOTES, jsb2w jsonb PATH '$' WITH UNCONDITIONAL WRAPPER KEEP QUOTES, jsb2q jsonb PATH '$' WITHOUT WRAPPER OMIT QUOTES, ia integer[] PATH '$' WITHOUT WRAPPER KEEP QUOTES, ta text[] PATH '$' WITHOUT WRAPPER KEEP QUOTES, jba jsonb[] PATH '$' WITHOUT WRAPPER KEEP QUOTES)) +(3 rows) + +-- JSON_TABLE() with alias +EXPLAIN (COSTS OFF, VERBOSE) +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + id FOR ORDINALITY, + "int" int PATH '$', + "text" text PATH '$' + )) json_table_func; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Table Function Scan on "json_table" json_table_func + Output: id, "int", text + Table Function Call: JSON_TABLE('null'::jsonb, '$[*]' AS json_table_path_0 PASSING 3 AS a, '"foo"'::jsonb AS "b c" COLUMNS (id FOR ORDINALITY, "int" integer PATH '$', text text PATH '$')) +(3 rows) + +EXPLAIN (COSTS OFF, FORMAT JSON, VERBOSE) +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + id FOR ORDINALITY, + "int" int PATH '$', + "text" text PATH '$' + )) json_table_func; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + [ + + { + + "Plan": { + + "Node Type": "Table Function Scan", + + "Parallel Aware": false, + + "Async Capable": false, + + "Table Function Name": "json_table", + + "Alias": "json_table_func", + + "Output": ["id", "\"int\"", "text"], + + "Table Function Call": "JSON_TABLE('null'::jsonb, '$[*]' AS json_table_path_0 PASSING 3 AS a, '\"foo\"'::jsonb AS \"b c\" COLUMNS (id FOR ORDINALITY, \"int\" integer PATH '$', text text PATH '$'))"+ + } + + } + + ] +(1 row) + +DROP VIEW jsonb_table_view2; +DROP VIEW jsonb_table_view3; +DROP VIEW jsonb_table_view4; +DROP VIEW jsonb_table_view5; +DROP VIEW jsonb_table_view6; +DROP DOMAIN jsonb_test_domain; +-- JSON_TABLE: only one FOR ORDINALITY columns allowed +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (id FOR ORDINALITY, id2 FOR ORDINALITY, a int PATH '$.a' ERROR ON EMPTY)) jt; +ERROR: only one FOR ORDINALITY column is allowed +LINE 1: ..._TABLE(jsonb '1', '$' COLUMNS (id FOR ORDINALITY, id2 FOR OR... + ^ +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (id FOR ORDINALITY, a int PATH '$' ERROR ON EMPTY)) jt; + id | a +----+--- + 1 | 1 +(1 row) + +-- JSON_TABLE: ON EMPTY/ON ERROR behavior +SELECT * +FROM + (VALUES ('1'), ('"err"')) vals(js), + JSON_TABLE(vals.js::jsonb, '$' COLUMNS (a int PATH '$')) jt; + js | a +-------+--- + 1 | 1 + "err" | +(2 rows) + +SELECT * +FROM + (VALUES ('1'), ('"err"')) vals(js) + LEFT OUTER JOIN + JSON_TABLE(vals.js::jsonb, '$' COLUMNS (a int PATH '$' ERROR ON ERROR)) jt + ON true; +ERROR: invalid input syntax for type integer: "err" +-- TABLE-level ERROR ON ERROR is not propagated to columns +SELECT * +FROM + (VALUES ('1'), ('"err"')) vals(js) + LEFT OUTER JOIN + JSON_TABLE(vals.js::jsonb, '$' COLUMNS (a int PATH '$' ERROR ON ERROR)) jt + ON true; +ERROR: invalid input syntax for type integer: "err" +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int PATH '$.a' ERROR ON EMPTY)) jt; +ERROR: no SQL/JSON item found for specified path of column "a" +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int PATH 'strict $.a' ERROR ON ERROR) ERROR ON ERROR) jt; +ERROR: jsonpath member accessor can only be applied to an object +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int PATH 'lax $.a' ERROR ON EMPTY) ERROR ON ERROR) jt; +ERROR: no SQL/JSON item found for specified path of column "a" +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int PATH '$' DEFAULT 1 ON EMPTY DEFAULT 2 ON ERROR)) jt; + a +--- + 2 +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int PATH 'strict $.a' DEFAULT 1 ON EMPTY DEFAULT 2 ON ERROR)) jt; + a +--- + 2 +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int PATH 'lax $.a' DEFAULT 1 ON EMPTY DEFAULT 2 ON ERROR)) jt; + a +--- + 1 +(1 row) + +-- JSON_TABLE: EXISTS PATH types +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int4 EXISTS PATH '$.a' ERROR ON ERROR)); -- ok; can cast to int4 + a +--- + 0 +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int4 EXISTS PATH '$' ERROR ON ERROR)); -- ok; can cast to int4 + a +--- + 1 +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int2 EXISTS PATH '$.a')); +ERROR: could not coerce ON ERROR expression (FALSE) to the RETURNING type +DETAIL: invalid input syntax for type smallint: "false" +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int8 EXISTS PATH '$.a')); +ERROR: could not coerce ON ERROR expression (FALSE) to the RETURNING type +DETAIL: invalid input syntax for type bigint: "false" +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a float4 EXISTS PATH '$.a')); +ERROR: could not coerce ON ERROR expression (FALSE) to the RETURNING type +DETAIL: invalid input syntax for type real: "false" +-- Default FALSE (ON ERROR) doesn't fit char(3) +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a char(3) EXISTS PATH '$.a')); +ERROR: could not coerce ON ERROR expression (FALSE) to the RETURNING type +DETAIL: value too long for type character(3) +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a char(3) EXISTS PATH '$.a' ERROR ON ERROR)); +ERROR: value too long for type character(3) +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a char(5) EXISTS PATH '$.a' ERROR ON ERROR)); + a +------- + false +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a json EXISTS PATH '$.a')); + a +------- + false +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a jsonb EXISTS PATH '$.a')); + a +------- + false +(1 row) + +-- EXISTS PATH domain over int +CREATE DOMAIN dint4 AS int; +CREATE DOMAIN dint4_0 AS int CHECK (VALUE <> 0 ); +SELECT a, a::bool FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a dint4 EXISTS PATH '$.a' )); + a | a +---+--- + 0 | f +(1 row) + +SELECT a, a::bool FROM JSON_TABLE(jsonb '{"a":1}', '$' COLUMNS (a dint4_0 EXISTS PATH '$.b')); +ERROR: could not coerce ON ERROR expression (FALSE) to the RETURNING type +DETAIL: value for domain dint4_0 violates check constraint "dint4_0_check" +SELECT a, a::bool FROM JSON_TABLE(jsonb '{"a":1}', '$' COLUMNS (a dint4_0 EXISTS PATH '$.b' ERROR ON ERROR)); +ERROR: value for domain dint4_0 violates check constraint "dint4_0_check" +SELECT a, a::bool FROM JSON_TABLE(jsonb '{"a":1}', '$' COLUMNS (a dint4_0 EXISTS PATH '$.b' FALSE ON ERROR)); +ERROR: could not coerce ON ERROR expression (FALSE) to the RETURNING type +DETAIL: value for domain dint4_0 violates check constraint "dint4_0_check" +SELECT a, a::bool FROM JSON_TABLE(jsonb '{"a":1}', '$' COLUMNS (a dint4_0 EXISTS PATH '$.b' TRUE ON ERROR)); + a | a +---+--- + 1 | t +(1 row) + +DROP DOMAIN dint4, dint4_0; +-- JSON_TABLE: WRAPPER/QUOTES clauses on scalar columns +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text PATH '$' KEEP QUOTES ON SCALAR STRING)); + item +--------- + "world" +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text PATH '$' OMIT QUOTES ON SCALAR STRING)); + item +------- + world +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' KEEP QUOTES)); + item +--------- + "world" +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' OMIT QUOTES)); + item +------- + world +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' WITHOUT WRAPPER KEEP QUOTES)); + item +--------- + "world" +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text PATH '$' WITHOUT WRAPPER OMIT QUOTES)); + item +------- + world +(1 row) + +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' WITH WRAPPER)); + item +----------- + ["world"] +(1 row) + +-- Error: OMIT QUOTES should not be specified when WITH WRAPPER is present +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text PATH '$' WITH WRAPPER OMIT QUOTES)); +ERROR: SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used +LINE 1: ...T * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text ... + ^ +-- But KEEP QUOTES (the default) is fine +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' WITH WRAPPER KEEP QUOTES)); + item +----------- + ["world"] +(1 row) + +-- Test PASSING args +SELECT * +FROM JSON_TABLE( + jsonb '[1,2,3]', + '$[*] ? (@ < $x)' + PASSING 3 AS x + COLUMNS (y text FORMAT JSON PATH '$') + ) jt; + y +--- + 1 + 2 +(2 rows) + +-- PASSING arguments are also passed to column paths +SELECT * +FROM JSON_TABLE( + jsonb '[1,2,3]', + '$[*] ? (@ < $x)' + PASSING 10 AS x, 3 AS y + COLUMNS (a text FORMAT JSON PATH '$ ? (@ < $y)') + ) jt; + a +--- + 1 + 2 + +(3 rows) + +-- Should fail (not supported) +SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || 'a' COLUMNS (foo int)); +ERROR: only string constants are supported in JSON_TABLE path specification +LINE 1: SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || '... + ^ +-- JsonPathQuery() error message mentioning column name +SELECT * FROM JSON_TABLE('{"a": [{"b": "1"}, {"b": "2"}]}', '$' COLUMNS (b json path '$.a[*].b' ERROR ON ERROR)); +ERROR: JSON path expression for column "b" must return single item when no wrapper is requested +HINT: Use the WITH WRAPPER clause to wrap SQL/JSON items into an array. +-- JSON_TABLE: nested paths +-- Duplicate path names +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' AS a + COLUMNS ( + b int, + NESTED PATH '$' AS a + COLUMNS ( + c int + ) + ) +) jt; +ERROR: duplicate JSON_TABLE column or path name: a +LINE 5: NESTED PATH '$' AS a + ^ +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' AS a + COLUMNS ( + b int, + NESTED PATH '$' AS n_a + COLUMNS ( + c int + ) + ) +) jt; + b | c +---+--- + | +(1 row) + +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' + COLUMNS ( + b int, + NESTED PATH '$' AS b + COLUMNS ( + c int + ) + ) +) jt; +ERROR: duplicate JSON_TABLE column or path name: b +LINE 5: NESTED PATH '$' AS b + ^ +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' + COLUMNS ( + NESTED PATH '$' AS a + COLUMNS ( + b int + ), + NESTED PATH '$' + COLUMNS ( + NESTED PATH '$' AS a + COLUMNS ( + c int + ) + ) + ) +) jt; +ERROR: duplicate JSON_TABLE column or path name: a +LINE 10: NESTED PATH '$' AS a + ^ +-- JSON_TABLE: plan execution +CREATE TEMP TABLE jsonb_table_test (js jsonb); +INSERT INTO jsonb_table_test +VALUES ( + '[ + {"a": 1, "b": [], "c": []}, + {"a": 2, "b": [1, 2, 3], "c": [10, null, 20]}, + {"a": 3, "b": [1, 2], "c": []}, + {"x": "4", "b": [1, 2], "c": 123} + ]' +); +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns (b_id for ordinality, b int path '$' ), + nested path 'strict $.c[*]' as pc columns (c_id for ordinality, c int path '$' ) + ) + ) jt; + n | a | b_id | b | c_id | c +---+----+------+---+------+---- + 1 | 1 | | | | + 2 | 2 | 1 | 1 | | + 2 | 2 | 2 | 2 | | + 2 | 2 | 3 | 3 | | + 2 | 2 | | | 1 | 10 + 2 | 2 | | | 2 | + 2 | 2 | | | 3 | 20 + 3 | 3 | 1 | 1 | | + 3 | 3 | 2 | 2 | | + 4 | -1 | 1 | 1 | | + 4 | -1 | 2 | 2 | | +(11 rows) + +-- PASSING arguments are passed to nested paths and their columns' paths +SELECT * +FROM + generate_series(1, 3) x, + generate_series(1, 3) y, + JSON_TABLE(jsonb + '[[1,2,3],[2,3,4,5],[3,4,5,6]]', + 'strict $[*] ? (@[*] <= $x)' + PASSING x AS x, y AS y + COLUMNS ( + y text FORMAT JSON PATH '$', + NESTED PATH 'strict $[*] ? (@ == $y)' + COLUMNS ( + z int PATH '$' + ) + ) + ) jt; + x | y | y | z +---+---+--------------+--- + 1 | 1 | [1, 2, 3] | 1 + 2 | 1 | [1, 2, 3] | 1 + 2 | 1 | [2, 3, 4, 5] | + 3 | 1 | [1, 2, 3] | 1 + 3 | 1 | [2, 3, 4, 5] | + 3 | 1 | [3, 4, 5, 6] | + 1 | 2 | [1, 2, 3] | 2 + 2 | 2 | [1, 2, 3] | 2 + 2 | 2 | [2, 3, 4, 5] | 2 + 3 | 2 | [1, 2, 3] | 2 + 3 | 2 | [2, 3, 4, 5] | 2 + 3 | 2 | [3, 4, 5, 6] | + 1 | 3 | [1, 2, 3] | 3 + 2 | 3 | [1, 2, 3] | 3 + 2 | 3 | [2, 3, 4, 5] | 3 + 3 | 3 | [1, 2, 3] | 3 + 3 | 3 | [2, 3, 4, 5] | 3 + 3 | 3 | [3, 4, 5, 6] | 3 +(18 rows) + +-- JSON_TABLE: Test backward parsing with nested paths +CREATE VIEW jsonb_table_view_nested AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + id FOR ORDINALITY, + NESTED PATH '$[1]' AS p1 COLUMNS ( + a1 int, + NESTED PATH '$[*]' AS "p1 1" COLUMNS ( + a11 text + ), + b1 text + ), + NESTED PATH '$[2]' AS p2 COLUMNS ( + NESTED PATH '$[*]' AS "p2:1" COLUMNS ( + a21 text + ), + NESTED PATH '$[*]' AS p22 COLUMNS ( + a22 text + ) + ) + ) + ); +\sv jsonb_table_view_nested +CREATE OR REPLACE VIEW public.jsonb_table_view_nested AS + SELECT id, + a1, + b1, + a11, + a21, + a22 + FROM JSON_TABLE( + 'null'::jsonb, '$[*]' AS json_table_path_0 + PASSING + 1 + 2 AS a, + '"foo"'::json AS "b c" + COLUMNS ( + id FOR ORDINALITY, + NESTED PATH '$[1]' AS p1 + COLUMNS ( + a1 integer PATH '$."a1"', + b1 text PATH '$."b1"', + NESTED PATH '$[*]' AS "p1 1" + COLUMNS ( + a11 text PATH '$."a11"' + ) + ), + NESTED PATH '$[2]' AS p2 + COLUMNS ( + NESTED PATH '$[*]' AS "p2:1" + COLUMNS ( + a21 text PATH '$."a21"' + ), + NESTED PATH '$[*]' AS p22 + COLUMNS ( + a22 text PATH '$."a22"' + ) + ) + ) + ) +DROP VIEW jsonb_table_view_nested; +CREATE TABLE s (js jsonb); +INSERT INTO s VALUES + ('{"a":{"za":[{"z1": [11,2222]},{"z21": [22, 234,2345]},{"z22": [32, 204,145]}]},"c": 3}'), + ('{"a":{"za":[{"z1": [21,4222]},{"z21": [32, 134,1345]}]},"c": 10}'); +-- error +SELECT sub.* FROM s, + JSON_TABLE(js, '$' PASSING 32 AS x, 13 AS y COLUMNS ( + xx int path '$.c', + NESTED PATH '$.a.za[1]' columns (NESTED PATH '$.z21[*]' COLUMNS (z21 int path '$?(@ >= $"x")' ERROR ON ERROR)) + )) sub; + xx | z21 +----+------ + 3 | + 3 | 234 + 3 | 2345 + 10 | 32 + 10 | 134 + 10 | 1345 +(6 rows) + +-- Parent columns xx1, xx appear before NESTED ones +SELECT sub.* FROM s, + (VALUES (23)) x(x), generate_series(13, 13) y, + JSON_TABLE(js, '$' AS c1 PASSING x AS x, y AS y COLUMNS ( + NESTED PATH '$.a.za[2]' COLUMNS ( + NESTED PATH '$.z22[*]' as z22 COLUMNS (c int PATH '$')), + NESTED PATH '$.a.za[1]' columns (d int[] PATH '$.z21'), + NESTED PATH '$.a.za[0]' columns (NESTED PATH '$.z1[*]' as z1 COLUMNS (a int PATH '$')), + xx1 int PATH '$.c', + NESTED PATH '$.a.za[1]' columns (NESTED PATH '$.z21[*]' as z21 COLUMNS (b int PATH '$')), + xx int PATH '$.c' + )) sub; + xx1 | xx | c | d | a | b +-----+----+-----+---------------+------+------ + 3 | 3 | 32 | | | + 3 | 3 | 204 | | | + 3 | 3 | 145 | | | + 3 | 3 | | {22,234,2345} | | + 3 | 3 | | | 11 | + 3 | 3 | | | 2222 | + 3 | 3 | | | | 22 + 3 | 3 | | | | 234 + 3 | 3 | | | | 2345 + 10 | 10 | | {32,134,1345} | | + 10 | 10 | | | 21 | + 10 | 10 | | | 4222 | + 10 | 10 | | | | 32 + 10 | 10 | | | | 134 + 10 | 10 | | | | 1345 +(15 rows) + +-- Test applying PASSING variables at different nesting levels +SELECT sub.* FROM s, + (VALUES (23)) x(x), generate_series(13, 13) y, + JSON_TABLE(js, '$' AS c1 PASSING x AS x, y AS y COLUMNS ( + xx1 int PATH '$.c', + NESTED PATH '$.a.za[0].z1[*]' COLUMNS (NESTED PATH '$ ?(@ >= ($"x" -2))' COLUMNS (a int PATH '$')), + NESTED PATH '$.a.za[0]' COLUMNS (NESTED PATH '$.z1[*] ? (@ >= ($"x" -2))' COLUMNS (b int PATH '$')) + )) sub; + xx1 | a | b +-----+------+------ + 3 | | + 3 | 2222 | + 3 | | 2222 + 10 | 21 | + 10 | 4222 | + 10 | | 21 + 10 | | 4222 +(7 rows) + +-- Test applying PASSING variable to paths all the levels +SELECT sub.* FROM s, + (VALUES (23)) x(x), + generate_series(13, 13) y, + JSON_TABLE(js, '$' AS c1 PASSING x AS x, y AS y + COLUMNS ( + xx1 int PATH '$.c', + NESTED PATH '$.a.za[1]' + COLUMNS (NESTED PATH '$.z21[*]' COLUMNS (b int PATH '$')), + NESTED PATH '$.a.za[1] ? (@.z21[*] >= ($"x"-1))' COLUMNS + (NESTED PATH '$.z21[*] ? (@ >= ($"y" + 3))' as z22 COLUMNS (a int PATH '$ ? (@ >= ($"y" + 12))')), + NESTED PATH '$.a.za[1]' COLUMNS + (NESTED PATH '$.z21[*] ? (@ >= ($"y" +121))' as z21 COLUMNS (c int PATH '$ ? (@ > ($"x" +111))')) + )) sub; + xx1 | b | a | c +-----+------+------+------ + 3 | 22 | | + 3 | 234 | | + 3 | 2345 | | + 3 | | | + 3 | | 234 | + 3 | | 2345 | + 3 | | | 234 + 3 | | | 2345 + 10 | 32 | | + 10 | 134 | | + 10 | 1345 | | + 10 | | 32 | + 10 | | 134 | + 10 | | 1345 | + 10 | | | + 10 | | | 1345 +(16 rows) + +----- test on empty behavior +SELECT sub.* FROM s, + (values(23)) x(x), + generate_series(13, 13) y, + JSON_TABLE(js, '$' AS c1 PASSING x AS x, y AS y + COLUMNS ( + xx1 int PATH '$.c', + NESTED PATH '$.a.za[2]' COLUMNS (NESTED PATH '$.z22[*]' as z22 COLUMNS (c int PATH '$')), + NESTED PATH '$.a.za[1]' COLUMNS (d json PATH '$ ? (@.z21[*] == ($"x" -1))'), + NESTED PATH '$.a.za[0]' COLUMNS (NESTED PATH '$.z1[*] ? (@ >= ($"x" -2))' as z1 COLUMNS (a int PATH '$')), + NESTED PATH '$.a.za[1]' COLUMNS + (NESTED PATH '$.z21[*] ? (@ >= ($"y" +121))' as z21 COLUMNS (b int PATH '$ ? (@ > ($"x" +111))' DEFAULT 0 ON EMPTY)) + )) sub; + xx1 | c | d | a | b +-----+-----+--------------------------+------+------ + 3 | 32 | | | + 3 | 204 | | | + 3 | 145 | | | + 3 | | {"z21": [22, 234, 2345]} | | + 3 | | | 2222 | + 3 | | | | 234 + 3 | | | | 2345 + 10 | | | | + 10 | | | 21 | + 10 | | | 4222 | + 10 | | | | 0 + 10 | | | | 1345 +(12 rows) + +CREATE OR REPLACE VIEW jsonb_table_view7 AS +SELECT sub.* FROM s, + (values(23)) x(x), + generate_series(13, 13) y, + JSON_TABLE(js, '$' AS c1 PASSING x AS x, y AS y + COLUMNS ( + xx1 int PATH '$.c', + NESTED PATH '$.a.za[2]' COLUMNS (NESTED PATH '$.z22[*]' as z22 COLUMNS (c int PATH '$' WITHOUT WRAPPER OMIT QUOTES)), + NESTED PATH '$.a.za[1]' COLUMNS (d json PATH '$ ? (@.z21[*] == ($"x" -1))' WITH WRAPPER), + NESTED PATH '$.a.za[0]' COLUMNS (NESTED PATH '$.z1[*] ? (@ >= ($"x" -2))' as z1 COLUMNS (a int PATH '$' KEEP QUOTES)), + NESTED PATH '$.a.za[1]' COLUMNS + (NESTED PATH '$.z21[*] ? (@ >= ($"y" +121))' as z21 COLUMNS (b int PATH '$ ? (@ > ($"x" +111))' DEFAULT 0 ON EMPTY)) + )) sub; +\sv jsonb_table_view7 +CREATE OR REPLACE VIEW public.jsonb_table_view7 AS + SELECT sub.xx1, + sub.c, + sub.d, + sub.a, + sub.b + FROM s, + ( VALUES (23)) x(x), + generate_series(13, 13) y(y), + LATERAL JSON_TABLE( + s.js, '$' AS c1 + PASSING + x.x AS x, + y.y AS y + COLUMNS ( + xx1 integer PATH '$."c"', + NESTED PATH '$."a"."za"[2]' AS json_table_path_0 + COLUMNS ( + NESTED PATH '$."z22"[*]' AS z22 + COLUMNS ( + c integer PATH '$' WITHOUT WRAPPER OMIT QUOTES + ) + ), + NESTED PATH '$."a"."za"[1]' AS json_table_path_1 + COLUMNS ( + d json PATH '$?(@."z21"[*] == $"x" - 1)' WITH UNCONDITIONAL WRAPPER KEEP QUOTES + ), + NESTED PATH '$."a"."za"[0]' AS json_table_path_2 + COLUMNS ( + NESTED PATH '$."z1"[*]?(@ >= $"x" - 2)' AS z1 + COLUMNS ( + a integer PATH '$' WITHOUT WRAPPER KEEP QUOTES + ) + ), + NESTED PATH '$."a"."za"[1]' AS json_table_path_3 + COLUMNS ( + NESTED PATH '$."z21"[*]?(@ >= $"y" + 121)' AS z21 + COLUMNS ( + b integer PATH '$?(@ > $"x" + 111)' DEFAULT 0 ON EMPTY + ) + ) + ) + ) sub +DROP VIEW jsonb_table_view7; +DROP TABLE s; +-- Prevent ON EMPTY specification on EXISTS columns +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty object on empty)); +ERROR: syntax error at or near "empty" +LINE 1: ...sonb '1', '$' COLUMNS (a int exists empty object on empty)); + ^ +-- Test ON ERROR / EMPTY value validity for the function and column types; +-- all fail +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int) NULL ON ERROR); +ERROR: invalid ON ERROR behavior +LINE 1: ... * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int) NULL ON ER... + ^ +DETAIL: Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause. +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int true on empty)); +ERROR: invalid ON EMPTY behavior for column "a" +LINE 1: ...T * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int true on em... + ^ +DETAIL: Only ERROR, NULL, or DEFAULT expression is allowed in ON EMPTY for scalar columns. +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int omit quotes true on error)); +ERROR: invalid ON ERROR behavior for column "a" +LINE 1: ...N_TABLE(jsonb '1', '$' COLUMNS (a int omit quotes true on er... + ^ +DETAIL: Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in ON ERROR for formatted columns. +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty object on error)); +ERROR: invalid ON ERROR behavior for column "a" +LINE 1: ...M JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty obje... + ^ +DETAIL: Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in ON ERROR for EXISTS columns. +-- Test JSON_TABLE() column deparsing -- don't emit default ON ERROR / EMPTY +-- behavior +CREATE VIEW json_table_view8 AS SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$')); +\sv json_table_view8; +CREATE OR REPLACE VIEW public.json_table_view8 AS + SELECT a + FROM JSON_TABLE( + '"a"'::text, '$' AS json_table_path_0 + COLUMNS ( + a text PATH '$' + ) + ) +CREATE VIEW json_table_view9 AS SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$') ERROR ON ERROR); +\sv json_table_view9; +CREATE OR REPLACE VIEW public.json_table_view9 AS + SELECT a + FROM JSON_TABLE( + '"a"'::text, '$' AS json_table_path_0 + COLUMNS ( + a text PATH '$' + ) ERROR ON ERROR + ) +DROP VIEW json_table_view8, json_table_view9; +-- Test JSON_TABLE() deparsing -- don't emit default ON ERROR behavior +CREATE VIEW json_table_view8 AS SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$') EMPTY ON ERROR); +\sv json_table_view8; +CREATE OR REPLACE VIEW public.json_table_view8 AS + SELECT a + FROM JSON_TABLE( + '"a"'::text, '$' AS json_table_path_0 + COLUMNS ( + a text PATH '$' + ) + ) +CREATE VIEW json_table_view9 AS SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$') EMPTY ARRAY ON ERROR); +\sv json_table_view9; +CREATE OR REPLACE VIEW public.json_table_view9 AS + SELECT a + FROM JSON_TABLE( + '"a"'::text, '$' AS json_table_path_0 + COLUMNS ( + a text PATH '$' + ) + ) +DROP VIEW json_table_view8, json_table_view9; diff --git a/src/test/regress/expected/sqljson_queryfuncs.out b/src/test/regress/expected/sqljson_queryfuncs.out new file mode 100644 index 0000000000000..5a35aeb7bba3a --- /dev/null +++ b/src/test/regress/expected/sqljson_queryfuncs.out @@ -0,0 +1,1466 @@ +-- JSON_EXISTS +SELECT JSON_EXISTS(NULL::jsonb, '$'); + json_exists +------------- + +(1 row) + +SELECT JSON_EXISTS(jsonb '[]', '$'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(JSON_OBJECT(RETURNING jsonb), '$'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb 'null', '$'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '[]', '$'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$.a'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '1', 'strict $.a'); -- FALSE on error + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '1', 'strict $.a' ERROR ON ERROR); +ERROR: jsonpath member accessor can only be applied to an object +SELECT JSON_EXISTS(jsonb 'null', '$.a'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '[]', '$.a'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '[1, "aaa", {"a": 1}]', 'strict $.a'); -- FALSE on error + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '[1, "aaa", {"a": 1}]', 'lax $.a'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '{}', '$.a'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '{"b": 1, "a": 2}', '$.a'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$.a.b'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '{"a": {"b": 1}}', '$.a.b'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.a.b'); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x)' PASSING 1 AS x); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x)' PASSING '1' AS x); + json_exists +------------- + f +(1 row) + +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x && @ < $y)' PASSING 0 AS x, 2 AS y); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x && @ < $y)' PASSING 0 AS x, 1 AS y); + json_exists +------------- + f +(1 row) + +-- extension: boolean expressions +SELECT JSON_EXISTS(jsonb '1', '$ > 2'); + json_exists +------------- + t +(1 row) + +SELECT JSON_EXISTS(jsonb '1', '$.a > 2' ERROR ON ERROR); + json_exists +------------- + t +(1 row) + +-- JSON_VALUE +SELECT JSON_VALUE(NULL::jsonb, '$'); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$'); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$' RETURNING int); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb 'true', '$'); + json_value +------------ + t +(1 row) + +SELECT JSON_VALUE(jsonb 'true', '$' RETURNING bool); + json_value +------------ + t +(1 row) + +SELECT JSON_VALUE(jsonb '123', '$'); + json_value +------------ + 123 +(1 row) + +SELECT JSON_VALUE(jsonb '123', '$' RETURNING int) + 234; + ?column? +---------- + 357 +(1 row) + +SELECT JSON_VALUE(jsonb '123', '$' RETURNING text); + json_value +------------ + 123 +(1 row) + +/* jsonb bytea ??? */ +SELECT JSON_VALUE(jsonb '123', '$' RETURNING bytea ERROR ON ERROR); + json_value +------------ + \x313233 +(1 row) + +SELECT JSON_VALUE(jsonb '1.23', '$'); + json_value +------------ + 1.23 +(1 row) + +SELECT JSON_VALUE(jsonb '1.23', '$' RETURNING int); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '"1.23"', '$' RETURNING numeric); + json_value +------------ + 1.23 +(1 row) + +SELECT JSON_VALUE(jsonb '"1.23"', '$' RETURNING int ERROR ON ERROR); +ERROR: invalid input syntax for type integer: "1.23" +SELECT JSON_VALUE(jsonb '"aaa"', '$'); + json_value +------------ + aaa +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING text); + json_value +------------ + aaa +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char(5)); + json_value +------------ + aaa +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char(2) ERROR ON ERROR); +ERROR: value too long for type character(2) +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char(2)); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char(3) ERROR ON ERROR); + json_value +------------ + aaa +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING json); + json_value +------------ + "aaa" +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING jsonb); + json_value +------------ + "aaa" +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING json ERROR ON ERROR); + json_value +------------ + "aaa" +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING jsonb ERROR ON ERROR); + json_value +------------ + "aaa" +(1 row) + +SELECT JSON_VALUE(jsonb '"\"aaa\""', '$' RETURNING json); + json_value +------------ + "\"aaa\"" +(1 row) + +SELECT JSON_VALUE(jsonb '"\"aaa\""', '$' RETURNING jsonb); + json_value +------------ + "\"aaa\"" +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING int); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING int ERROR ON ERROR); +ERROR: invalid input syntax for type integer: "aaa" +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING int DEFAULT 111 ON ERROR); + json_value +------------ + 111 +(1 row) + +SELECT JSON_VALUE(jsonb '"123"', '$' RETURNING int) + 234; + ?column? +---------- + 357 +(1 row) + +SELECT JSON_VALUE(jsonb '"2017-02-20"', '$' RETURNING date) + 9; + ?column? +------------ + 03-01-2017 +(1 row) + +-- Test NULL checks execution in domain types +CREATE DOMAIN sqljsonb_int_not_null AS int NOT NULL; +SELECT JSON_VALUE(jsonb 'null', '$' RETURNING sqljsonb_int_not_null); +ERROR: could not coerce ON ERROR expression (NULL) to the RETURNING type +DETAIL: domain sqljsonb_int_not_null does not allow null values +SELECT JSON_VALUE(jsonb 'null', '$' RETURNING sqljsonb_int_not_null ERROR ON ERROR); +ERROR: domain sqljsonb_int_not_null does not allow null values +SELECT JSON_VALUE(jsonb 'null', '$' RETURNING sqljsonb_int_not_null DEFAULT 2 ON EMPTY ERROR ON ERROR); +ERROR: domain sqljsonb_int_not_null does not allow null values +SELECT JSON_VALUE(jsonb '1', '$.a' RETURNING sqljsonb_int_not_null DEFAULT 2 ON EMPTY ERROR ON ERROR); + json_value +------------ + 2 +(1 row) + +SELECT JSON_VALUE(jsonb '1', '$.a' RETURNING sqljsonb_int_not_null DEFAULT NULL ON EMPTY ERROR ON ERROR); +ERROR: domain sqljsonb_int_not_null does not allow null values +CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple'); +CREATE DOMAIN rgb AS rainbow CHECK (VALUE IN ('red', 'green', 'blue')); +SELECT JSON_VALUE('"purple"'::jsonb, 'lax $[*]' RETURNING rgb); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE('"purple"'::jsonb, 'lax $[*]' RETURNING rgb ERROR ON ERROR); +ERROR: value for domain rgb violates check constraint "rgb_check" +SELECT JSON_VALUE(jsonb '[]', '$'); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '[]', '$' ERROR ON ERROR); +ERROR: JSON path expression in JSON_VALUE must return single scalar item +SELECT JSON_VALUE(jsonb '{}', '$'); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '{}', '$' ERROR ON ERROR); +ERROR: JSON path expression in JSON_VALUE must return single scalar item +SELECT JSON_VALUE(jsonb '1', '$.a'); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'strict $.a' ERROR ON ERROR); +ERROR: jsonpath member accessor can only be applied to an object +SELECT JSON_VALUE(jsonb '1', 'strict $.a' DEFAULT 'error' ON ERROR); + json_value +------------ + error +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' ERROR ON ERROR); -- NULL ON EMPTY + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' ERROR ON EMPTY ERROR ON ERROR); +ERROR: no SQL/JSON item found for specified path +SELECT JSON_VALUE(jsonb '1', 'strict $.*' DEFAULT 2 ON ERROR); + json_value +------------ + 2 +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' DEFAULT 2 ON ERROR); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' DEFAULT '2' ON EMPTY); + json_value +------------ + 2 +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' NULL ON EMPTY DEFAULT '2' ON ERROR); + json_value +------------ + +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' DEFAULT '2' ON EMPTY DEFAULT '3' ON ERROR); + json_value +------------ + 2 +(1 row) + +SELECT JSON_VALUE(jsonb '1', 'lax $.a' ERROR ON EMPTY DEFAULT '3' ON ERROR); +ERROR: no SQL/JSON item found for specified path +SELECT JSON_VALUE(jsonb '[1,2]', '$[*]' ERROR ON ERROR); +ERROR: JSON path expression in JSON_VALUE must return single scalar item +SELECT JSON_VALUE(jsonb '[1,2]', '$[*]' DEFAULT '0' ON ERROR); + json_value +------------ + 0 +(1 row) + +SELECT JSON_VALUE(jsonb '[" "]', '$[*]' RETURNING int ERROR ON ERROR); +ERROR: invalid input syntax for type integer: " " +SELECT JSON_VALUE(jsonb '[" "]', '$[*]' RETURNING int DEFAULT 2 + 3 ON ERROR); + json_value +------------ + 5 +(1 row) + +SELECT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING int DEFAULT 2 + 3 ON ERROR); + json_value +------------ + 1 +(1 row) + +SELECT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING int FORMAT JSON); -- RETURNING FORMAT not allowed +ERROR: cannot specify FORMAT JSON in RETURNING clause of JSON_VALUE() +LINE 1: ...CT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING int FORMAT JSO... + ^ +-- RETUGNING pseudo-types not allowed +SELECT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING record); +ERROR: returning pseudo-types is not supported in SQL/JSON functions +SELECT + x, + JSON_VALUE( + jsonb '{"a": 1, "b": 2}', + '$.* ? (@ > $x)' PASSING x AS x + RETURNING int + DEFAULT -1 ON EMPTY + DEFAULT -2 ON ERROR + ) y +FROM + generate_series(0, 2) x; + x | y +---+---- + 0 | -2 + 1 | 2 + 2 | -1 +(3 rows) + +SELECT JSON_VALUE(jsonb 'null', '$a' PASSING point ' (1, 2 )' AS a); + json_value +------------ + (1,2) +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$a' PASSING point ' (1, 2 )' AS a RETURNING point); + json_value +------------ + (1,2) +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$a' PASSING point ' (1, 2 )' AS a RETURNING point ERROR ON ERROR); + json_value +------------ + (1,2) +(1 row) + +-- Test PASSING and RETURNING date/time types +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts); + json_value +------------------------------ + Tue Feb 20 18:34:56 2018 PST +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING timestamptz); + json_value +------------------------------ + Tue Feb 20 18:34:56 2018 PST +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING timestamp); + json_value +-------------------------- + Tue Feb 20 18:34:56 2018 +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING date '2018-02-21 12:34:56 +10' AS ts RETURNING date); + json_value +------------ + 02-21-2018 +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING time '2018-02-21 12:34:56 +10' AS ts RETURNING time); + json_value +------------ + 12:34:56 +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timetz '2018-02-21 12:34:56 +10' AS ts RETURNING timetz); + json_value +------------- + 12:34:56+10 +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamp '2018-02-21 12:34:56 +10' AS ts RETURNING timestamp); + json_value +-------------------------- + Wed Feb 21 12:34:56 2018 +(1 row) + +-- Also test RETURNING json[b] +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING json); + json_value +----------------------------- + "2018-02-21T02:34:56+00:00" +(1 row) + +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING jsonb); + json_value +----------------------------- + "2018-02-21T02:34:56+00:00" +(1 row) + +-- Test that numeric JSON values are coerced uniformly +select json_value('{"a": 1.234}', '$.a' returning int error on error); +ERROR: invalid input syntax for type integer: "1.234" +select json_value('{"a": "1.234"}', '$.a' returning int error on error); +ERROR: invalid input syntax for type integer: "1.234" +-- JSON_QUERY +SELECT JSON_VALUE(NULL::jsonb, '$'); + json_value +------------ + +(1 row) + +SELECT + JSON_QUERY(js, '$') AS "unspec", + JSON_QUERY(js, '$' WITHOUT WRAPPER) AS "without", + JSON_QUERY(js, '$' WITH CONDITIONAL WRAPPER) AS "with cond", + JSON_QUERY(js, '$' WITH UNCONDITIONAL ARRAY WRAPPER) AS "with uncond", + JSON_QUERY(js, '$' WITH ARRAY WRAPPER) AS "with" +FROM + (VALUES + (jsonb 'null'), + ('12.3'), + ('true'), + ('"aaa"'), + ('[1, null, "2"]'), + ('{"a": 1, "b": [2]}') + ) foo(js); + unspec | without | with cond | with uncond | with +--------------------+--------------------+--------------------+----------------------+---------------------- + null | null | null | [null] | [null] + 12.3 | 12.3 | 12.3 | [12.3] | [12.3] + true | true | true | [true] | [true] + "aaa" | "aaa" | "aaa" | ["aaa"] | ["aaa"] + [1, null, "2"] | [1, null, "2"] | [1, null, "2"] | [[1, null, "2"]] | [[1, null, "2"]] + {"a": 1, "b": [2]} | {"a": 1, "b": [2]} | {"a": 1, "b": [2]} | [{"a": 1, "b": [2]}] | [{"a": 1, "b": [2]}] +(6 rows) + +SELECT + JSON_QUERY(js, 'strict $[*]') AS "unspec", + JSON_QUERY(js, 'strict $[*]' WITHOUT WRAPPER) AS "without", + JSON_QUERY(js, 'strict $[*]' WITH CONDITIONAL WRAPPER) AS "with cond", + JSON_QUERY(js, 'strict $[*]' WITH UNCONDITIONAL ARRAY WRAPPER) AS "with uncond", + JSON_QUERY(js, 'strict $[*]' WITH ARRAY WRAPPER) AS "with" +FROM + (VALUES + (jsonb '1'), + ('[]'), + ('[null]'), + ('[12.3]'), + ('[true]'), + ('["aaa"]'), + ('[[1, 2, 3]]'), + ('[{"a": 1, "b": [2]}]'), + ('[1, "2", null, [3]]') + ) foo(js); + unspec | without | with cond | with uncond | with +--------------------+--------------------+---------------------+----------------------+---------------------- + | | | | + | | | | + null | null | null | [null] | [null] + 12.3 | 12.3 | 12.3 | [12.3] | [12.3] + true | true | true | [true] | [true] + "aaa" | "aaa" | "aaa" | ["aaa"] | ["aaa"] + [1, 2, 3] | [1, 2, 3] | [1, 2, 3] | [[1, 2, 3]] | [[1, 2, 3]] + {"a": 1, "b": [2]} | {"a": 1, "b": [2]} | {"a": 1, "b": [2]} | [{"a": 1, "b": [2]}] | [{"a": 1, "b": [2]}] + | | [1, "2", null, [3]] | [1, "2", null, [3]] | [1, "2", null, [3]] +(9 rows) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text); + json_query +------------ + "aaa" +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text KEEP QUOTES); + json_query +------------ + "aaa" +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text KEEP QUOTES ON SCALAR STRING); + json_query +------------ + "aaa" +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text OMIT QUOTES); + json_query +------------ + aaa +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text OMIT QUOTES ON SCALAR STRING); + json_query +------------ + aaa +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' OMIT QUOTES ERROR ON ERROR); +ERROR: invalid input syntax for type json +DETAIL: Token "aaa" is invalid. +CONTEXT: JSON data, line 1: aaa +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING json OMIT QUOTES ERROR ON ERROR); +ERROR: invalid input syntax for type json +DETAIL: Token "aaa" is invalid. +CONTEXT: JSON data, line 1: aaa +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING bytea FORMAT JSON OMIT QUOTES ERROR ON ERROR); + json_query +------------ + \x616161 +(1 row) + +-- Behavior when a RETURNING type has typmod != -1 +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING char(3) ERROR ON ERROR); +ERROR: value too long for type character(3) +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING char(3)); + json_query +------------ + +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING char(3) OMIT QUOTES ERROR ON ERROR); + json_query +------------ + aaa +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$.a' RETURNING char(2) OMIT QUOTES DEFAULT 'bb' ON EMPTY); + json_query +------------ + bb +(1 row) + +SELECT JSON_QUERY(jsonb '"aaa"', '$.a' RETURNING char(2) OMIT QUOTES DEFAULT '"bb"'::jsonb ON EMPTY); + json_query +------------ + bb +(1 row) + +-- OMIT QUOTES behavior should not be specified when WITH WRAPPER used: +-- Should fail +SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER OMIT QUOTES); +ERROR: SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used +LINE 1: SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER OMIT QUOTES)... + ^ +SELECT JSON_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER OMIT QUOTES); +ERROR: SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used +LINE 1: SELECT JSON_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER ... + ^ +-- Should succeed +SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITH CONDITIONAL WRAPPER KEEP QUOTES); + json_query +------------ + "1" +(1 row) + +SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITH UNCONDITIONAL WRAPPER KEEP QUOTES); + json_query +------------ + ["1"] +(1 row) + +SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITH WRAPPER KEEP QUOTES); + json_query +------------ + ["1"] +(1 row) + +SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITHOUT WRAPPER OMIT QUOTES); + json_query +------------ + 1 +(1 row) + +SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITHOUT WRAPPER KEEP QUOTES); + json_query +------------ + "1" +(1 row) + +-- test QUOTES behavior. +SELECT JSON_QUERY(jsonb'{"rec": "{1,2,3}"}', '$.rec' returning int[] omit quotes); + json_query +------------ + {1,2,3} +(1 row) + +SELECT JSON_QUERY(jsonb'{"rec": "{1,2,3}"}', '$.rec' returning int[] keep quotes); + json_query +------------ + +(1 row) + +SELECT JSON_QUERY(jsonb'{"rec": "{1,2,3}"}', '$.rec' returning int[] keep quotes error on error); +ERROR: expected JSON array +SELECT JSON_QUERY(jsonb'{"rec": "[1,2]"}', '$.rec' returning int4range omit quotes); + json_query +------------ + [1,3) +(1 row) + +SELECT JSON_QUERY(jsonb'{"rec": "[1,2]"}', '$.rec' returning int4range keep quotes); + json_query +------------ + +(1 row) + +SELECT JSON_QUERY(jsonb'{"rec": "[1,2]"}', '$.rec' returning int4range keep quotes error on error); +ERROR: malformed range literal: ""[1,2]"" +DETAIL: Missing left parenthesis or bracket. +CREATE DOMAIN qf_char_domain AS char(1); +CREATE DOMAIN qf_jsonb_domain AS jsonb; +SELECT JSON_QUERY(jsonb '"1"', '$' RETURNING qf_char_domain OMIT QUOTES ERROR ON ERROR); + json_query +------------ + 1 +(1 row) + +SELECT JSON_QUERY(jsonb '"1"', '$' RETURNING qf_jsonb_domain OMIT QUOTES ERROR ON ERROR); + json_query +------------ + 1 +(1 row) + +DROP DOMAIN qf_char_domain, qf_jsonb_domain; +SELECT JSON_QUERY(jsonb '[]', '$[*]'); + json_query +------------ + +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' NULL ON EMPTY); + json_query +------------ + +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' EMPTY ON EMPTY); + json_query +------------ + [] +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' EMPTY ARRAY ON EMPTY); + json_query +------------ + [] +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' EMPTY OBJECT ON EMPTY); + json_query +------------ + {} +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY); +ERROR: no SQL/JSON item found for specified path +SELECT JSON_QUERY(jsonb '[]', '$[*]' DEFAULT '"empty"' ON EMPTY); + json_query +------------ + "empty" +(1 row) + +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY NULL ON ERROR); +ERROR: no SQL/JSON item found for specified path +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY EMPTY ARRAY ON ERROR); +ERROR: no SQL/JSON item found for specified path +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY EMPTY OBJECT ON ERROR); +ERROR: no SQL/JSON item found for specified path +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY ERROR ON ERROR); +ERROR: no SQL/JSON item found for specified path +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON ERROR); -- NULL ON EMPTY + json_query +------------ + +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' ERROR ON ERROR); +ERROR: JSON path expression in JSON_QUERY must return single item when no wrapper is requested +HINT: Use the WITH WRAPPER clause to wrap SQL/JSON items into an array. +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' DEFAULT '"empty"' ON ERROR); + json_query +------------ + "empty" +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING json); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING json FORMAT JSON); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING jsonb); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING jsonb FORMAT JSON); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING text); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING char(10)); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING text FORMAT JSON); + json_query +------------ + [1, 2] +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING bytea); + json_query +---------------- + \x5b312c20325d +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING bytea FORMAT JSON); + json_query +---------------- + \x5b312c20325d +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING bytea EMPTY OBJECT ON ERROR); + json_query +------------ + \x7b7d +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING bytea FORMAT JSON EMPTY OBJECT ON ERROR); + json_query +------------ + \x7b7d +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING json EMPTY OBJECT ON ERROR); + json_query +------------ + {} +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING jsonb EMPTY OBJECT ON ERROR); + json_query +------------ + {} +(1 row) + +SELECT JSON_QUERY(jsonb '[3,4]', '$[*]' RETURNING bigint[] EMPTY OBJECT ON ERROR); +ERROR: could not coerce ON ERROR expression (EMPTY OBJECT) to the RETURNING type +DETAIL: expected JSON array +SELECT JSON_QUERY(jsonb '"[3,4]"', '$[*]' RETURNING bigint[] EMPTY OBJECT ON ERROR); +ERROR: could not coerce ON ERROR expression (EMPTY OBJECT) to the RETURNING type +DETAIL: expected JSON array +-- Coercion fails with quotes on +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING int2 error on error); +ERROR: invalid input syntax for type smallint: ""123.1"" +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING int4 error on error); +ERROR: invalid input syntax for type integer: ""123.1"" +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING int8 error on error); +ERROR: invalid input syntax for type bigint: ""123.1"" +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING bool error on error); +ERROR: invalid input syntax for type boolean: ""123.1"" +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING numeric error on error); +ERROR: invalid input syntax for type numeric: ""123.1"" +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING real error on error); +ERROR: invalid input syntax for type real: ""123.1"" +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING float8 error on error); +ERROR: invalid input syntax for type double precision: ""123.1"" +-- Fine with OMIT QUOTES +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING int2 omit quotes error on error); +ERROR: invalid input syntax for type smallint: "123.1" +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING float8 omit quotes error on error); + json_query +------------ + 123.1 +(1 row) + +-- RETUGNING pseudo-types not allowed +SELECT JSON_QUERY(jsonb '[3,4]', '$[*]' RETURNING anyarray EMPTY OBJECT ON ERROR); +ERROR: returning pseudo-types is not supported in SQL/JSON functions +SELECT + x, y, + JSON_QUERY( + jsonb '[1,2,3,4,5,null]', + '$[*] ? (@ >= $x && @ <= $y)' + PASSING x AS x, y AS y + WITH CONDITIONAL WRAPPER + EMPTY ARRAY ON EMPTY + ) list +FROM + generate_series(0, 4) x, + generate_series(0, 4) y; + x | y | list +---+---+-------------- + 0 | 0 | [] + 0 | 1 | 1 + 0 | 2 | [1, 2] + 0 | 3 | [1, 2, 3] + 0 | 4 | [1, 2, 3, 4] + 1 | 0 | [] + 1 | 1 | 1 + 1 | 2 | [1, 2] + 1 | 3 | [1, 2, 3] + 1 | 4 | [1, 2, 3, 4] + 2 | 0 | [] + 2 | 1 | [] + 2 | 2 | 2 + 2 | 3 | [2, 3] + 2 | 4 | [2, 3, 4] + 3 | 0 | [] + 3 | 1 | [] + 3 | 2 | [] + 3 | 3 | 3 + 3 | 4 | [3, 4] + 4 | 0 | [] + 4 | 1 | [] + 4 | 2 | [] + 4 | 3 | [] + 4 | 4 | 4 +(25 rows) + +-- record type returning with quotes behavior. +CREATE TYPE comp_abc AS (a text, b int, c timestamp); +SELECT JSON_QUERY(jsonb'{"rec": "(abc,42,01.02.2003)"}', '$.rec' returning comp_abc omit quotes); + json_query +------------------------------------- + (abc,42,"Thu Jan 02 00:00:00 2003") +(1 row) + +SELECT JSON_QUERY(jsonb'{"rec": "(abc,42,01.02.2003)"}', '$.rec' returning comp_abc keep quotes); + json_query +------------ + +(1 row) + +SELECT JSON_QUERY(jsonb'{"rec": "(abc,42,01.02.2003)"}', '$.rec' returning comp_abc keep quotes error on error); +ERROR: cannot call populate_composite on a scalar +DROP TYPE comp_abc; +-- Extension: record types returning +CREATE TYPE sqljsonb_rec AS (a int, t text, js json, jb jsonb, jsa json[]); +CREATE TYPE sqljsonb_reca AS (reca sqljsonb_rec[]); +SELECT JSON_QUERY(jsonb '[{"a": 1, "b": "foo", "t": "aaa", "js": [1, "2", {}], "jb": {"x": [1, "2", {}]}}, {"a": 2}]', '$[0]' RETURNING sqljsonb_rec); + json_query +----------------------------------------------------- + (1,aaa,"[1, ""2"", {}]","{""x"": [1, ""2"", {}]}",) +(1 row) + +SELECT JSON_QUERY(jsonb '[{"a": "a", "b": "foo", "t": "aaa", "js": [1, "2", {}], "jb": {"x": [1, "2", {}]}}, {"a": 2}]', '$[0]' RETURNING sqljsonb_rec ERROR ON ERROR); +ERROR: invalid input syntax for type integer: "a" +SELECT JSON_QUERY(jsonb '[{"a": "a", "b": "foo", "t": "aaa", "js": [1, "2", {}], "jb": {"x": [1, "2", {}]}}, {"a": 2}]', '$[0]' RETURNING sqljsonb_rec); + json_query +------------ + +(1 row) + +SELECT * FROM unnest((JSON_QUERY(jsonb '{"jsa": [{"a": 1, "b": ["foo"]}, {"a": 2, "c": {}}, 123]}', '$' RETURNING sqljsonb_rec)).jsa); + unnest +------------------------ + {"a": 1, "b": ["foo"]} + {"a": 2, "c": {}} + 123 +(3 rows) + +SELECT * FROM unnest((JSON_QUERY(jsonb '{"reca": [{"a": 1, "t": ["foo", []]}, {"a": 2, "jb": [{}, true]}]}', '$' RETURNING sqljsonb_reca)).reca); + a | t | js | jb | jsa +---+-------------+----+------------+----- + 1 | ["foo", []] | | | + 2 | | | [{}, true] | +(2 rows) + +SELECT JSON_QUERY(jsonb '[{"a": 1, "b": "foo", "t": "aaa", "js": [1, "2", {}], "jb": {"x": [1, "2", {}]}}, {"a": 2}]', '$[0]' RETURNING jsonpath); + json_query +------------ + +(1 row) + +SELECT JSON_QUERY(jsonb '[{"a": 1, "b": "foo", "t": "aaa", "js": [1, "2", {}], "jb": {"x": [1, "2", {}]}}, {"a": 2}]', '$[0]' RETURNING jsonpath ERROR ON ERROR); +ERROR: syntax error at or near "{" of jsonpath input +-- Extension: array types returning +SELECT JSON_QUERY(jsonb '[1,2,null,"3"]', '$[*]' RETURNING int[] WITH WRAPPER); + json_query +-------------- + {1,2,NULL,3} +(1 row) + +SELECT JSON_QUERY(jsonb '[1,2,null,"a"]', '$[*]' RETURNING int[] WITH WRAPPER ERROR ON ERROR); +ERROR: invalid input syntax for type integer: "a" +SELECT JSON_QUERY(jsonb '[1,2,null,"a"]', '$[*]' RETURNING int[] WITH WRAPPER); + json_query +------------ + +(1 row) + +SELECT * FROM unnest(JSON_QUERY(jsonb '[{"a": 1, "t": ["foo", []]}, {"a": 2, "jb": [{}, true]}]', '$' RETURNING sqljsonb_rec[])); + a | t | js | jb | jsa +---+-------------+----+------------+----- + 1 | ["foo", []] | | | + 2 | | | [{}, true] | +(2 rows) + +-- Extension: domain types returning +SELECT JSON_QUERY(jsonb '{"a": 1}', '$.a' RETURNING sqljsonb_int_not_null); + json_query +------------ + 1 +(1 row) + +SELECT JSON_QUERY(jsonb '{"a": 1}', '$.b' RETURNING sqljsonb_int_not_null); +ERROR: could not coerce ON EMPTY expression (NULL) to the RETURNING type +DETAIL: domain sqljsonb_int_not_null does not allow null values +SELECT JSON_QUERY(jsonb '{"a": 1}', '$.b' RETURNING sqljsonb_int_not_null ERROR ON EMPTY ERROR ON ERROR); +ERROR: no SQL/JSON item found for specified path +-- Test timestamptz passing and output +SELECT JSON_QUERY(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts); + json_query +----------------------------- + "2018-02-21T02:34:56+00:00" +(1 row) + +SELECT JSON_QUERY(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING json); + json_query +----------------------------- + "2018-02-21T02:34:56+00:00" +(1 row) + +SELECT JSON_QUERY(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING jsonb); + json_query +----------------------------- + "2018-02-21T02:34:56+00:00" +(1 row) + +-- Test constraints +CREATE TABLE test_jsonb_constraints ( + js text, + i int, + x jsonb DEFAULT JSON_QUERY(jsonb '[1,2]', '$[*]' WITH WRAPPER) + CONSTRAINT test_jsonb_constraint1 + CHECK (js IS JSON) + CONSTRAINT test_jsonb_constraint2 + CHECK (JSON_EXISTS(js::jsonb, '$.a' PASSING i + 5 AS int, i::text AS "TXT", array[1,2,3] as arr)) + CONSTRAINT test_jsonb_constraint3 + CHECK (JSON_VALUE(js::jsonb, '$.a' RETURNING int DEFAULT '12' ON EMPTY ERROR ON ERROR) > i) + CONSTRAINT test_jsonb_constraint4 + CHECK (JSON_QUERY(js::jsonb, '$.a' WITH CONDITIONAL WRAPPER EMPTY OBJECT ON ERROR) = jsonb '[10]') + CONSTRAINT test_jsonb_constraint5 + CHECK (JSON_QUERY(js::jsonb, '$.a' RETURNING char(5) OMIT QUOTES EMPTY ARRAY ON EMPTY) > 'a' COLLATE "C") +); +\d test_jsonb_constraints + Table "public.test_jsonb_constraints" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+-------------------------------------------------------------------------------------------- + js | text | | | + i | integer | | | + x | jsonb | | | JSON_QUERY('[1, 2]'::jsonb, '$[*]' RETURNING jsonb WITH UNCONDITIONAL WRAPPER KEEP QUOTES) +Check constraints: + "test_jsonb_constraint1" CHECK (js IS JSON) + "test_jsonb_constraint2" CHECK (JSON_EXISTS(js::jsonb, '$."a"' PASSING i + 5 AS "int", i::text AS "TXT", ARRAY[1, 2, 3] AS arr)) + "test_jsonb_constraint3" CHECK (JSON_VALUE(js::jsonb, '$."a"' RETURNING integer DEFAULT 12 ON EMPTY ERROR ON ERROR) > i) + "test_jsonb_constraint4" CHECK (JSON_QUERY(js::jsonb, '$."a"' RETURNING jsonb WITH CONDITIONAL WRAPPER KEEP QUOTES EMPTY OBJECT ON ERROR) = '[10]'::jsonb) + "test_jsonb_constraint5" CHECK (JSON_QUERY(js::jsonb, '$."a"' RETURNING character(5) WITHOUT WRAPPER OMIT QUOTES EMPTY ARRAY ON EMPTY) > ('a'::bpchar COLLATE "C")) + +SELECT check_clause +FROM information_schema.check_constraints +WHERE constraint_name LIKE 'test_jsonb_constraint%' +ORDER BY 1; + check_clause +---------------------------------------------------------------------------------------------------------------------------------------- + (JSON_QUERY((js)::jsonb, '$."a"' RETURNING character(5) WITHOUT WRAPPER OMIT QUOTES EMPTY ARRAY ON EMPTY) > ('a'::bpchar COLLATE "C")) + (JSON_QUERY((js)::jsonb, '$."a"' RETURNING jsonb WITH CONDITIONAL WRAPPER KEEP QUOTES EMPTY OBJECT ON ERROR) = '[10]'::jsonb) + (JSON_VALUE((js)::jsonb, '$."a"' RETURNING integer DEFAULT 12 ON EMPTY ERROR ON ERROR) > i) + (js IS JSON) + JSON_EXISTS((js)::jsonb, '$."a"' PASSING (i + 5) AS "int", (i)::text AS "TXT", ARRAY[1, 2, 3] AS arr) +(5 rows) + +SELECT pg_get_expr(adbin, adrelid) +FROM pg_attrdef +WHERE adrelid = 'test_jsonb_constraints'::regclass +ORDER BY 1; + pg_get_expr +-------------------------------------------------------------------------------------------- + JSON_QUERY('[1, 2]'::jsonb, '$[*]' RETURNING jsonb WITH UNCONDITIONAL WRAPPER KEEP QUOTES) +(1 row) + +INSERT INTO test_jsonb_constraints VALUES ('', 1); +ERROR: new row for relation "test_jsonb_constraints" violates check constraint "test_jsonb_constraint1" +DETAIL: Failing row contains (, 1, [1, 2]). +INSERT INTO test_jsonb_constraints VALUES ('1', 1); +ERROR: new row for relation "test_jsonb_constraints" violates check constraint "test_jsonb_constraint2" +DETAIL: Failing row contains (1, 1, [1, 2]). +INSERT INTO test_jsonb_constraints VALUES ('[]'); +ERROR: new row for relation "test_jsonb_constraints" violates check constraint "test_jsonb_constraint2" +DETAIL: Failing row contains ([], null, [1, 2]). +INSERT INTO test_jsonb_constraints VALUES ('{"b": 1}', 1); +ERROR: new row for relation "test_jsonb_constraints" violates check constraint "test_jsonb_constraint2" +DETAIL: Failing row contains ({"b": 1}, 1, [1, 2]). +INSERT INTO test_jsonb_constraints VALUES ('{"a": 1}', 1); +ERROR: new row for relation "test_jsonb_constraints" violates check constraint "test_jsonb_constraint3" +DETAIL: Failing row contains ({"a": 1}, 1, [1, 2]). +INSERT INTO test_jsonb_constraints VALUES ('{"a": 10}', 1); +ERROR: new row for relation "test_jsonb_constraints" violates check constraint "test_jsonb_constraint4" +DETAIL: Failing row contains ({"a": 10}, 1, [1, 2]). +DROP TABLE test_jsonb_constraints; +-- Test mutabilily of query functions +CREATE TABLE test_jsonb_mutability(js jsonb, b int); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a[0]')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.time()')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.date()')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.time_tz()')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.timestamp()')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.timestamp_tz()')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.date() < $.time_tz())')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.date() < $.time())')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.time() < $.time())')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.time() < $.time_tz())')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp() < $.timestamp_tz())')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp_tz() < $.timestamp_tz())')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.time() < $.datetime("HH:MI TZH"))')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.date() < $.datetime("HH:MI TZH"))')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp() < $.datetime("HH:MI TZH"))')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp() < $.datetime("HH:MI"))')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp_tz() < $.datetime("HH:MI TZH"))')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp_tz() < $.datetime("HH:MI"))')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.date() < $x' PASSING '12:34'::timetz AS x)); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.date() < $x' PASSING '1234'::int AS x)); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp(2) < $.timestamp(3))')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime()')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@ < $.datetime())')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime() < $.datetime())')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime() < $.datetime("HH:MI TZH"))')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime("HH:MI TZH") < $.datetime("HH:MI TZH"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime("HH:MI") < $.datetime("YY-MM-DD HH:MI"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime("HH:MI TZH") < $.datetime("YY-MM-DD HH:MI"))')); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime("HH:MI TZH") < $x' PASSING '12:34'::timetz AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime("HH:MI TZH") < $y' PASSING '12:34'::timetz AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime() < $x' PASSING '12:34'::timetz AS x)); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime() < $x' PASSING '1234'::int AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime() ? (@ == $x)' PASSING '12:34'::time AS x)); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime("YY-MM-DD") ? (@ == $x)' PASSING '2020-07-14'::date AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, $.a ? (@.datetime() == $x)]' PASSING '12:34'::time AS x)); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, 0 to $.a ? (@.datetime() == $x)]' PASSING '12:34'::time AS x)); +ERROR: functions in index expression must be marked IMMUTABLE +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, $.a ? (@.datetime("HH:MI") == $x)]' PASSING '12:34'::time AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_VALUE(js, '$' DEFAULT random()::int ON ERROR)); +ERROR: functions in index expression must be marked IMMUTABLE +-- DEFAULT expression +CREATE OR REPLACE FUNCTION ret_setint() RETURNS SETOF integer AS +$$ +BEGIN + RETURN QUERY EXECUTE 'select 1 union all select 1'; +END; +$$ +LANGUAGE plpgsql IMMUTABLE; +SELECT JSON_QUERY(js, '$' RETURNING int DEFAULT ret_setint() ON ERROR) FROM test_jsonb_mutability; +ERROR: DEFAULT expression must not return a set +LINE 1: SELECT JSON_QUERY(js, '$' RETURNING int DEFAULT ret_setint(... + ^ +SELECT JSON_QUERY(js, '$' RETURNING int DEFAULT b + 1 ON ERROR) FROM test_jsonb_mutability; +ERROR: DEFAULT expression must not contain column references +LINE 1: SELECT JSON_QUERY(js, '$' RETURNING int DEFAULT b + 1 ON ER... + ^ +SELECT JSON_QUERY(js, '$' RETURNING int DEFAULT sum(1) over() ON ERROR) FROM test_jsonb_mutability; +ERROR: can only specify a constant, non-aggregate function, or operator expression for DEFAULT +LINE 1: SELECT JSON_QUERY(js, '$' RETURNING int DEFAULT sum(1) over... + ^ +SELECT JSON_QUERY(js, '$' RETURNING int DEFAULT (SELECT 1) ON ERROR) FROM test_jsonb_mutability; +ERROR: can only specify a constant, non-aggregate function, or operator expression for DEFAULT +LINE 1: SELECT JSON_QUERY(js, '$' RETURNING int DEFAULT (SELECT 1) ... + ^ +DROP TABLE test_jsonb_mutability; +DROP FUNCTION ret_setint; +CREATE DOMAIN queryfuncs_test_domain AS text CHECK (value <> 'foo'); +SELECT JSON_VALUE(jsonb '{"d1": "H"}', '$.a2' RETURNING queryfuncs_test_domain DEFAULT 'foo'::queryfuncs_test_domain ON EMPTY); +ERROR: could not coerce ON EMPTY expression (DEFAULT) to the RETURNING type +DETAIL: value for domain queryfuncs_test_domain violates check constraint "queryfuncs_test_domain_check" +SELECT JSON_VALUE(jsonb '{"d1": "H"}', '$.a2' RETURNING queryfuncs_test_domain DEFAULT 'foo1'::queryfuncs_test_domain ON EMPTY); + json_value +------------ + foo1 +(1 row) + +SELECT JSON_VALUE(jsonb '{"d1": "H"}', '$.a2' RETURNING queryfuncs_test_domain DEFAULT '"foo1"'::jsonb::text ON EMPTY); + json_value +------------ + "foo1" +(1 row) + +SELECT JSON_VALUE(jsonb '{"d1": "foo"}', '$.a2' RETURNING queryfuncs_test_domain DEFAULT 'foo1'::queryfuncs_test_domain ON EMPTY); + json_value +------------ + foo1 +(1 row) + +-- Check the cases where a coercion-related expression is masking an +-- unsupported expressions +-- CoerceViaIO +SELECT JSON_QUERY('"a"', '$.a' RETURNING int DEFAULT (SELECT '"1"')::jsonb ON ERROR); +ERROR: can only specify a constant, non-aggregate function, or operator expression for DEFAULT +LINE 1: ...CT JSON_QUERY('"a"', '$.a' RETURNING int DEFAULT (SELECT '"... + ^ +-- CoerceToDomain +SELECT JSON_QUERY('"a"', '$.a' RETURNING queryfuncs_test_domain DEFAULT (select '"1"')::queryfuncs_test_domain ON ERROR); +ERROR: can only specify a constant, non-aggregate function, or operator expression for DEFAULT +LINE 1: ...', '$.a' RETURNING queryfuncs_test_domain DEFAULT (select '"... + ^ +-- RelabelType +SELECT JSON_QUERY('"a"', '$.a' RETURNING int DEFAULT (SELECT 1)::oid::int ON ERROR); +ERROR: can only specify a constant, non-aggregate function, or operator expression for DEFAULT +LINE 1: ...CT JSON_QUERY('"a"', '$.a' RETURNING int DEFAULT (SELECT 1)... + ^ +-- ArrayCoerceExpr +SELECT JSON_QUERY('"a"', '$.a' RETURNING int[] DEFAULT (SELECT '{1}')::oid[]::int[] ON ERROR); +ERROR: can only specify a constant, non-aggregate function, or operator expression for DEFAULT +LINE 1: ... JSON_QUERY('"a"', '$.a' RETURNING int[] DEFAULT (SELECT '{... + ^ +-- CollateExpr +SELECT JSON_QUERY('"a"', '$.a' RETURNING int[] DEFAULT (SELECT '{1}')::text COLLATE "C" ON ERROR); +ERROR: can only specify a constant, non-aggregate function, or operator expression for DEFAULT +LINE 1: ... JSON_QUERY('"a"', '$.a' RETURNING int[] DEFAULT (SELECT '{... + ^ +-- ConvertRowtypeExpr +CREATE TABLE someparent (a int); +CREATE TABLE somechild () INHERITS (someparent); +SELECT JSON_QUERY('"a"', '$.a' RETURNING someparent DEFAULT (SELECT '(1)')::somechild::someparent ON ERROR); +ERROR: can only specify a constant, non-aggregate function, or operator expression for DEFAULT +LINE 1: ..._QUERY('"a"', '$.a' RETURNING someparent DEFAULT (SELECT '(... + ^ +DROP DOMAIN queryfuncs_test_domain; +DROP TABLE someparent, somechild; +-- Extension: non-constant JSON path +SELECT JSON_EXISTS(jsonb '{"a": 123}', '$' || '.' || 'a'); + json_exists +------------- + t +(1 row) + +SELECT JSON_VALUE(jsonb '{"a": 123}', '$' || '.' || 'a'); + json_value +------------ + 123 +(1 row) + +SELECT JSON_VALUE(jsonb '{"a": 123}', '$' || '.' || 'b' DEFAULT 'foo' ON EMPTY); + json_value +------------ + foo +(1 row) + +SELECT JSON_QUERY(jsonb '{"a": 123}', '$' || '.' || 'a'); + json_query +------------ + 123 +(1 row) + +SELECT JSON_QUERY(jsonb '{"a": 123}', '$' || '.' || 'a' WITH WRAPPER); + json_query +------------ + [123] +(1 row) + +-- Should fail (invalid path) +SELECT JSON_QUERY(jsonb '{"a": 123}', 'error' || ' ' || 'error'); +ERROR: syntax error at or near " " of jsonpath input +-- Non-jsonb inputs automatically coerced to jsonb +SELECT JSON_EXISTS(json '{"a": 123}', '$' || '.' || 'a'); + json_exists +------------- + t +(1 row) + +SELECT JSON_QUERY(NULL FORMAT JSON, '$'); + json_query +------------ + +(1 row) + +-- Test non-const jsonpath +CREATE TEMP TABLE jsonpaths (path) AS SELECT '$'; +SELECT json_value('"aaa"', path RETURNING json) FROM jsonpaths; + json_value +------------ + "aaa" +(1 row) + +-- Test PASSING argument parsing +SELECT JSON_QUERY(jsonb 'null', '$xyz' PASSING 1 AS xy); +ERROR: could not find jsonpath variable "xyz" +SELECT JSON_QUERY(jsonb 'null', '$xy' PASSING 1 AS xyz); +ERROR: could not find jsonpath variable "xy" +SELECT JSON_QUERY(jsonb 'null', '$xyz' PASSING 1 AS xyz); + json_query +------------ + 1 +(1 row) + +SELECT JSON_QUERY(jsonb 'null', '$Xyz' PASSING 1 AS Xyz); +ERROR: could not find jsonpath variable "Xyz" +SELECT JSON_QUERY(jsonb 'null', '$Xyz' PASSING 1 AS "Xyz"); + json_query +------------ + 1 +(1 row) + +SELECT JSON_QUERY(jsonb 'null', '$"Xyz"' PASSING 1 AS "Xyz"); + json_query +------------ + 1 +(1 row) + +-- Test ON ERROR / EMPTY value validity for the function; all fail. +SELECT JSON_EXISTS(jsonb '1', '$' DEFAULT 1 ON ERROR); +ERROR: invalid ON ERROR behavior +LINE 1: SELECT JSON_EXISTS(jsonb '1', '$' DEFAULT 1 ON ERROR); + ^ +DETAIL: Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in ON ERROR for JSON_EXISTS(). +SELECT JSON_VALUE(jsonb '1', '$' EMPTY ON ERROR); +ERROR: invalid ON ERROR behavior +LINE 1: SELECT JSON_VALUE(jsonb '1', '$' EMPTY ON ERROR); + ^ +DETAIL: Only ERROR, NULL, or DEFAULT expression is allowed in ON ERROR for JSON_VALUE(). +SELECT JSON_QUERY(jsonb '1', '$' TRUE ON ERROR); +ERROR: invalid ON ERROR behavior +LINE 1: SELECT JSON_QUERY(jsonb '1', '$' TRUE ON ERROR); + ^ +DETAIL: Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in ON ERROR for JSON_QUERY(). +-- Test implicit coercion to a domain over fixed-length type specified in +-- RETURNING +CREATE DOMAIN queryfuncs_char2 AS char(2); +CREATE DOMAIN queryfuncs_char2_chk AS char(2) CHECK (VALUE NOT IN ('12')); +SELECT JSON_QUERY(jsonb '123', '$' RETURNING queryfuncs_char2 ERROR ON ERROR); +ERROR: value too long for type character(2) +SELECT JSON_QUERY(jsonb '123', '$' RETURNING queryfuncs_char2 DEFAULT '1' ON ERROR); + json_query +------------ + 1 +(1 row) + +SELECT JSON_QUERY(jsonb '123', '$' RETURNING queryfuncs_char2_chk ERROR ON ERROR); +ERROR: value too long for type character(2) +SELECT JSON_QUERY(jsonb '123', '$' RETURNING queryfuncs_char2_chk DEFAULT '1' ON ERROR); + json_query +------------ + 1 +(1 row) + +SELECT JSON_VALUE(jsonb '123', '$' RETURNING queryfuncs_char2 ERROR ON ERROR); +ERROR: value too long for type character(2) +SELECT JSON_VALUE(jsonb '123', '$' RETURNING queryfuncs_char2 DEFAULT 1 ON ERROR); + json_value +------------ + 1 +(1 row) + +SELECT JSON_VALUE(jsonb '123', '$' RETURNING queryfuncs_char2_chk ERROR ON ERROR); +ERROR: value too long for type character(2) +SELECT JSON_VALUE(jsonb '123', '$' RETURNING queryfuncs_char2_chk DEFAULT 1 ON ERROR); + json_value +------------ + 1 +(1 row) + +DROP DOMAIN queryfuncs_char2, queryfuncs_char2_chk; +-- Test coercion to domain over another fixed-length type of the ON ERROR / +-- EMPTY expressions. Ask user to cast the DEFAULT expression explicitly if +-- automatic casting cannot be done, for example, from int to bit(2). +CREATE DOMAIN queryfuncs_d_varbit3 AS varbit(3) CHECK (VALUE <> '01'); +SELECT JSON_VALUE(jsonb '1234', '$' RETURNING queryfuncs_d_varbit3 DEFAULT '111111' ON ERROR); +ERROR: bit string too long for type bit varying(3) +SELECT JSON_VALUE(jsonb '1234', '$' RETURNING queryfuncs_d_varbit3 DEFAULT '010' ON ERROR); + json_value +------------ + 010 +(1 row) + +SELECT JSON_VALUE(jsonb '1234', '$' RETURNING queryfuncs_d_varbit3 DEFAULT '01' ON ERROR); +ERROR: could not coerce ON ERROR expression (DEFAULT) to the RETURNING type +DETAIL: value for domain queryfuncs_d_varbit3 violates check constraint "queryfuncs_d_varbit3_check" +SELECT JSON_VALUE(jsonb '"111"', '$' RETURNING bit(2) ERROR ON ERROR); +ERROR: bit string length 3 does not match type bit(2) +SELECT JSON_VALUE(jsonb '1234', '$' RETURNING bit(3) DEFAULT 1 ON ERROR); +ERROR: cannot cast behavior expression of type integer to bit +LINE 1: ...VALUE(jsonb '1234', '$' RETURNING bit(3) DEFAULT 1 ON ERROR... + ^ +HINT: You will need to explicitly cast the expression to type bit. +SELECT JSON_VALUE(jsonb '1234', '$' RETURNING bit(3) DEFAULT 1::bit(3) ON ERROR); + json_value +------------ + 001 +(1 row) + +SELECT JSON_VALUE(jsonb '"111"', '$.a' RETURNING bit(3) DEFAULT '1111' ON EMPTY); +ERROR: bit string length 4 does not match type bit(3) +DROP DOMAIN queryfuncs_d_varbit3; diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index 8e6334078291b..43b7873c62b18 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -764,6 +764,52 @@ FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass; 2 | t | 3 | t (1 row) +----- +-- Test reset of some stats for shared table +----- +-- This updates the comment of the database currently in use in +-- pg_shdescription with a fake value, then sets it back to its +-- original value. +SELECT shobj_description(d.oid, 'pg_database') as description_before + FROM pg_database d WHERE datname = current_database() \gset +-- force some stats in pg_shdescription. +BEGIN; +SELECT current_database() as datname \gset +COMMENT ON DATABASE :"datname" IS 'This is a test comment'; +SELECT pg_stat_force_next_flush(); + pg_stat_force_next_flush +-------------------------- + +(1 row) + +COMMIT; +-- check that the stats are reset. +SELECT (n_tup_ins + n_tup_upd) > 0 AS has_data FROM pg_stat_all_tables + WHERE relid = 'pg_shdescription'::regclass; + has_data +---------- + t +(1 row) + +SELECT pg_stat_reset_single_table_counters('pg_shdescription'::regclass); + pg_stat_reset_single_table_counters +------------------------------------- + +(1 row) + +SELECT (n_tup_ins + n_tup_upd) > 0 AS has_data FROM pg_stat_all_tables + WHERE relid = 'pg_shdescription'::regclass; + has_data +---------- + f +(1 row) + +-- set back comment +\if :{?description_before} + COMMENT ON DATABASE :"datname" IS :'description_before'; +\else + COMMENT ON DATABASE :"datname" IS NULL; +\endif ----- -- Test that various stats views are being properly populated ----- @@ -782,8 +828,8 @@ SELECT sessions > :db_stat_sessions FROM pg_stat_database WHERE datname = (SELEC t (1 row) --- Test pg_stat_bgwriter checkpointer-related stats, together with pg_stat_wal -SELECT checkpoints_req AS rqst_ckpts_before FROM pg_stat_bgwriter \gset +-- Test pg_stat_checkpointer checkpointer-related stats, together with pg_stat_wal +SELECT num_requested AS rqst_ckpts_before FROM pg_stat_checkpointer \gset -- Test pg_stat_wal (and make a temp table so our temp schema exists) SELECT wal_bytes AS wal_bytes_before FROM pg_stat_wal \gset CREATE TEMP TABLE test_stats_temp AS SELECT 17; @@ -793,7 +839,7 @@ DROP TABLE test_stats_temp; -- results of the first. CHECKPOINT; CHECKPOINT; -SELECT checkpoints_req > :rqst_ckpts_before FROM pg_stat_bgwriter; +SELECT num_requested > :rqst_ckpts_before FROM pg_stat_checkpointer; ?column? ---------- t @@ -820,35 +866,35 @@ WHERE pg_stat_get_backend_pid(beid) = pg_backend_pid(); -- Test that resetting stats works for reset timestamp ----- -- Test that reset_slru with a specified SLRU works. -SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'CommitTs' \gset -SELECT stats_reset AS slru_notify_reset_ts FROM pg_stat_slru WHERE name = 'Notify' \gset -SELECT pg_stat_reset_slru('CommitTs'); +SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'commit_timestamp' \gset +SELECT stats_reset AS slru_notify_reset_ts FROM pg_stat_slru WHERE name = 'notify' \gset +SELECT pg_stat_reset_slru('commit_timestamp'); pg_stat_reset_slru -------------------- (1 row) -SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'CommitTs'; +SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'commit_timestamp'; ?column? ---------- t (1 row) -SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'CommitTs' \gset +SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'commit_timestamp' \gset -- Test that multiple SLRUs are reset when no specific SLRU provided to reset function -SELECT pg_stat_reset_slru(NULL); +SELECT pg_stat_reset_slru(); pg_stat_reset_slru -------------------- (1 row) -SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'CommitTs'; +SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'commit_timestamp'; ?column? ---------- t (1 row) -SELECT stats_reset > :'slru_notify_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'Notify'; +SELECT stats_reset > :'slru_notify_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'notify'; ?column? ---------- t @@ -868,7 +914,6 @@ SELECT stats_reset > :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver; t (1 row) -SELECT stats_reset AS archiver_reset_ts FROM pg_stat_archiver \gset -- Test that reset_shared with bgwriter specified as the stats type works SELECT stats_reset AS bgwriter_reset_ts FROM pg_stat_bgwriter \gset SELECT pg_stat_reset_shared('bgwriter'); @@ -883,47 +928,66 @@ SELECT stats_reset > :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter; t (1 row) -SELECT stats_reset AS bgwriter_reset_ts FROM pg_stat_bgwriter \gset --- Test that reset_shared with wal specified as the stats type works -SELECT stats_reset AS wal_reset_ts FROM pg_stat_wal \gset -SELECT pg_stat_reset_shared('wal'); +-- Test that reset_shared with checkpointer specified as the stats type works +SELECT stats_reset AS checkpointer_reset_ts FROM pg_stat_checkpointer \gset +SELECT pg_stat_reset_shared('checkpointer'); pg_stat_reset_shared ---------------------- (1 row) -SELECT stats_reset > :'wal_reset_ts'::timestamptz FROM pg_stat_wal; +SELECT stats_reset > :'checkpointer_reset_ts'::timestamptz FROM pg_stat_checkpointer; ?column? ---------- t (1 row) -SELECT stats_reset AS wal_reset_ts FROM pg_stat_wal \gset --- Test that reset_shared with no specified stats type doesn't reset anything -SELECT pg_stat_reset_shared(NULL); +-- Test that reset_shared with recovery_prefetch specified as the stats type works +SELECT stats_reset AS recovery_prefetch_reset_ts FROM pg_stat_recovery_prefetch \gset +SELECT pg_stat_reset_shared('recovery_prefetch'); pg_stat_reset_shared ---------------------- (1 row) -SELECT stats_reset = :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver; +SELECT stats_reset > :'recovery_prefetch_reset_ts'::timestamptz FROM pg_stat_recovery_prefetch; ?column? ---------- t (1 row) -SELECT stats_reset = :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter; +-- Test that reset_shared with slru specified as the stats type works +SELECT max(stats_reset) AS slru_reset_ts FROM pg_stat_slru \gset +SELECT pg_stat_reset_shared('slru'); + pg_stat_reset_shared +---------------------- + +(1 row) + +SELECT max(stats_reset) > :'slru_reset_ts'::timestamptz FROM pg_stat_slru; ?column? ---------- t (1 row) -SELECT stats_reset = :'wal_reset_ts'::timestamptz FROM pg_stat_wal; +-- Test that reset_shared with wal specified as the stats type works +SELECT stats_reset AS wal_reset_ts FROM pg_stat_wal \gset +SELECT pg_stat_reset_shared('wal'); + pg_stat_reset_shared +---------------------- + +(1 row) + +SELECT stats_reset > :'wal_reset_ts'::timestamptz FROM pg_stat_wal; ?column? ---------- t (1 row) +-- Test error case for reset_shared with unknown stats type +SELECT pg_stat_reset_shared('unknown'); +ERROR: unrecognized reset target: "unknown" +HINT: Target must be "archiver", "bgwriter", "checkpointer", "io", "recovery_prefetch", "slru", or "wal". -- Test that reset works for pg_stat_database -- Since pg_stat_database stats_reset starts out as NULL, reset it once first so we have something to compare it to SELECT pg_stat_reset(); @@ -1385,7 +1449,11 @@ SELECT :io_sum_local_new_tblspc_writes > :io_sum_local_after_writes; RESET temp_buffers; -- Test that reuse of strategy buffers and reads of blocks into these reused --- buffers while VACUUMing are tracked in pg_stat_io. +-- buffers while VACUUMing are tracked in pg_stat_io. If there is sufficient +-- demand for shared buffers from concurrent queries, some buffers may be +-- pinned by other backends before they can be reused. In such cases, the +-- backend will evict a buffer from outside the ring and add it to the +-- ring. This is considered an eviction and not a reuse. -- Set wal_skip_threshold smaller than the expected size of -- test_io_vac_strategy so that, even if wal_level is minimal, VACUUM FULL will -- fsync the newly rewritten test_io_vac_strategy instead of writing it to WAL. @@ -1393,15 +1461,15 @@ RESET temp_buffers; -- shared buffers -- preventing us from testing BAS_VACUUM BufferAccessStrategy -- reads. SET wal_skip_threshold = '1 kB'; -SELECT sum(reuses) AS reuses, sum(reads) AS reads +SELECT sum(reuses) AS reuses, sum(reads) AS reads, sum(evictions) AS evictions FROM pg_stat_io WHERE context = 'vacuum' \gset io_sum_vac_strategy_before_ CREATE TABLE test_io_vac_strategy(a int, b int) WITH (autovacuum_enabled = 'false'); INSERT INTO test_io_vac_strategy SELECT i, i from generate_series(1, 4500)i; -- Ensure that the next VACUUM will need to perform IO by rewriting the table -- first with VACUUM (FULL). VACUUM (FULL) test_io_vac_strategy; --- Use the minimum BUFFER_USAGE_LIMIT to cause reuses with the smallest table --- possible. +-- Use the minimum BUFFER_USAGE_LIMIT to cause reuses or evictions with the +-- smallest table possible. VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128) test_io_vac_strategy; SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush @@ -1409,13 +1477,19 @@ SELECT pg_stat_force_next_flush(); (1 row) -SELECT sum(reuses) AS reuses, sum(reads) AS reads +SELECT sum(reuses) AS reuses, sum(reads) AS reads, sum(evictions) AS evictions FROM pg_stat_io WHERE context = 'vacuum' \gset io_sum_vac_strategy_after_ -SELECT :io_sum_vac_strategy_after_reads > :io_sum_vac_strategy_before_reads, - :io_sum_vac_strategy_after_reuses > :io_sum_vac_strategy_before_reuses; - ?column? | ?column? -----------+---------- - t | t +SELECT :io_sum_vac_strategy_after_reads > :io_sum_vac_strategy_before_reads; + ?column? +---------- + t +(1 row) + +SELECT (:io_sum_vac_strategy_after_reuses + :io_sum_vac_strategy_after_evictions) > + (:io_sum_vac_strategy_before_reuses + :io_sum_vac_strategy_before_evictions); + ?column? +---------- + t (1 row) RESET wal_skip_threshold; @@ -1572,4 +1646,21 @@ SELECT COUNT(*) FROM brin_hot_3 WHERE a = 2; DROP TABLE brin_hot_3; SET enable_seqscan = on; +-- Test that estimation of relation size works with tuples wider than the +-- relation fillfactor. We create a table with wide inline attributes and +-- low fillfactor, insert rows and then see how many rows EXPLAIN shows +-- before running analyze. We disable autovacuum so that it does not +-- interfere with the test. +CREATE TABLE table_fillfactor ( + n char(1000) +) with (fillfactor=10, autovacuum_enabled=off); +INSERT INTO table_fillfactor +SELECT 'x' FROM generate_series(1,1000); +SELECT * FROM check_estimated_rows('SELECT * FROM table_fillfactor'); + estimated | actual +-----------+-------- + 1000 | 1000 +(1 row) + +DROP TABLE table_fillfactor; -- End of Stats Test diff --git a/src/test/regress/expected/stats_ext.out b/src/test/regress/expected/stats_ext.out index a430153b225d8..8c4da95508408 100644 --- a/src/test/regress/expected/stats_ext.out +++ b/src/test/regress/expected/stats_ext.out @@ -359,7 +359,7 @@ CREATE TABLE ndistinct ( WITH (autovacuum_enabled = off); -- over-estimates when using only per-column statistics INSERT INTO ndistinct (a, b, c, filler1) - SELECT i/100, i/100, i/100, cash_words((i/100)::money) + SELECT i/100, i/100, i/100, (i/100) || ' dollars and zero cents' FROM generate_series(1,1000) s(i); ANALYZE ndistinct; -- Group Aggregate, due to over-estimate of the number of groups @@ -499,7 +499,7 @@ TRUNCATE TABLE ndistinct; -- under-estimates when using only per-column statistics INSERT INTO ndistinct (a, b, c, filler1) SELECT mod(i,13), mod(i,17), mod(i,19), - cash_words(mod(i,23)::int::money) + mod(i,23) || ' dollars and zero cents' FROM generate_series(1,1000) s(i); ANALYZE ndistinct; SELECT s.stxkind, d.stxdndistinct @@ -3281,10 +3281,53 @@ SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not le (0 rows) DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak +-- privilege checks for pg_stats_ext and pg_stats_ext_exprs +RESET SESSION AUTHORIZATION; +CREATE TABLE stats_ext_tbl (id INT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, col TEXT); +INSERT INTO stats_ext_tbl (col) VALUES ('secret'), ('secret'), ('very secret'); +CREATE STATISTICS s_col ON id, col FROM stats_ext_tbl; +CREATE STATISTICS s_expr ON mod(id, 2), lower(col) FROM stats_ext_tbl; +ANALYZE stats_ext_tbl; +-- unprivileged role should not have access +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT statistics_name, most_common_vals FROM pg_stats_ext x + WHERE tablename = 'stats_ext_tbl' ORDER BY ROW(x.*); + statistics_name | most_common_vals +-----------------+------------------ +(0 rows) + +SELECT statistics_name, most_common_vals FROM pg_stats_ext_exprs x + WHERE tablename = 'stats_ext_tbl' ORDER BY ROW(x.*); + statistics_name | most_common_vals +-----------------+------------------ +(0 rows) + +-- give unprivileged role ownership of table +RESET SESSION AUTHORIZATION; +ALTER TABLE stats_ext_tbl OWNER TO regress_stats_user1; +-- unprivileged role should now have access +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT statistics_name, most_common_vals FROM pg_stats_ext x + WHERE tablename = 'stats_ext_tbl' ORDER BY ROW(x.*); + statistics_name | most_common_vals +-----------------+------------------------------------------- + s_col | {{1,secret},{2,secret},{3,"very secret"}} + s_expr | {{0,secret},{1,secret},{1,"very secret"}} +(2 rows) + +SELECT statistics_name, most_common_vals FROM pg_stats_ext_exprs x + WHERE tablename = 'stats_ext_tbl' ORDER BY ROW(x.*); + statistics_name | most_common_vals +-----------------+------------------ + s_expr | {secret} + s_expr | {1} +(2 rows) + -- Tidy up DROP OPERATOR <<< (int, int); DROP FUNCTION op_leak(int, int); RESET SESSION AUTHORIZATION; +DROP TABLE stats_ext_tbl; DROP SCHEMA tststats CASCADE; NOTICE: drop cascades to 2 other objects DETAIL: drop cascades to table tststats.priv_test_tbl diff --git a/src/test/regress/expected/strings.out b/src/test/regress/expected/strings.out index 62698569e1a8f..52b69a107fb7a 100644 --- a/src/test/regress/expected/strings.out +++ b/src/test/regress/expected/strings.out @@ -147,17 +147,17 @@ SELECT U&'d\0061t\+000061' AS U&"d\0061t\+000061"; ERROR: unsafe use of string constant with Unicode escapes LINE 1: SELECT U&'d\0061t\+000061' AS U&"d\0061t\+000061"; ^ -DETAIL: String constants with Unicode escapes cannot be used when standard_conforming_strings is off. +DETAIL: String constants with Unicode escapes cannot be used when "standard_conforming_strings" is off. SELECT U&'d!0061t\+000061' UESCAPE '!' AS U&"d*0061t\+000061" UESCAPE '*'; ERROR: unsafe use of string constant with Unicode escapes LINE 1: SELECT U&'d!0061t\+000061' UESCAPE '!' AS U&"d*0061t\+000061... ^ -DETAIL: String constants with Unicode escapes cannot be used when standard_conforming_strings is off. +DETAIL: String constants with Unicode escapes cannot be used when "standard_conforming_strings" is off. SELECT U&' \' UESCAPE '!' AS "tricky"; ERROR: unsafe use of string constant with Unicode escapes LINE 1: SELECT U&' \' UESCAPE '!' AS "tricky"; ^ -DETAIL: String constants with Unicode escapes cannot be used when standard_conforming_strings is off. +DETAIL: String constants with Unicode escapes cannot be used when "standard_conforming_strings" is off. SELECT 'tricky' AS U&"\" UESCAPE '!'; \ -------- @@ -168,17 +168,17 @@ SELECT U&'wrong: \061'; ERROR: unsafe use of string constant with Unicode escapes LINE 1: SELECT U&'wrong: \061'; ^ -DETAIL: String constants with Unicode escapes cannot be used when standard_conforming_strings is off. +DETAIL: String constants with Unicode escapes cannot be used when "standard_conforming_strings" is off. SELECT U&'wrong: \+0061'; ERROR: unsafe use of string constant with Unicode escapes LINE 1: SELECT U&'wrong: \+0061'; ^ -DETAIL: String constants with Unicode escapes cannot be used when standard_conforming_strings is off. +DETAIL: String constants with Unicode escapes cannot be used when "standard_conforming_strings" is off. SELECT U&'wrong: +0061' UESCAPE '+'; ERROR: unsafe use of string constant with Unicode escapes LINE 1: SELECT U&'wrong: +0061' UESCAPE '+'; ^ -DETAIL: String constants with Unicode escapes cannot be used when standard_conforming_strings is off. +DETAIL: String constants with Unicode escapes cannot be used when "standard_conforming_strings" is off. RESET standard_conforming_strings; -- bytea SET bytea_output TO hex; @@ -2129,8 +2129,68 @@ select split_part('@joeuser@mydatabase@','@',-2) AS "mydatabase"; (1 row) -- --- test to_hex +-- test to_bin, to_oct, and to_hex -- +select to_bin(-1234) AS "11111111111111111111101100101110"; + 11111111111111111111101100101110 +---------------------------------- + 11111111111111111111101100101110 +(1 row) + +select to_bin(-1234::bigint); + to_bin +------------------------------------------------------------------ + 1111111111111111111111111111111111111111111111111111101100101110 +(1 row) + +select to_bin(256*256*256 - 1) AS "111111111111111111111111"; + 111111111111111111111111 +-------------------------- + 111111111111111111111111 +(1 row) + +select to_bin(256::bigint*256::bigint*256::bigint*256::bigint - 1) AS "11111111111111111111111111111111"; + 11111111111111111111111111111111 +---------------------------------- + 11111111111111111111111111111111 +(1 row) + +select to_oct(-1234) AS "37777775456"; + 37777775456 +------------- + 37777775456 +(1 row) + +select to_oct(-1234::bigint) AS "1777777777777777775456"; + 1777777777777777775456 +------------------------ + 1777777777777777775456 +(1 row) + +select to_oct(256*256*256 - 1) AS "77777777"; + 77777777 +---------- + 77777777 +(1 row) + +select to_oct(256::bigint*256::bigint*256::bigint*256::bigint - 1) AS "37777777777"; + 37777777777 +------------- + 37777777777 +(1 row) + +select to_hex(-1234) AS "fffffb2e"; + fffffb2e +---------- + fffffb2e +(1 row) + +select to_hex(-1234::bigint) AS "fffffffffffffb2e"; + fffffffffffffb2e +------------------ + fffffffffffffb2e +(1 row) + select to_hex(256*256*256 - 1) AS "ffffff"; ffffff -------- diff --git a/src/test/regress/expected/subscription.out b/src/test/regress/expected/subscription.out index 3c1a0869eca3a..0f2a25cdc1950 100644 --- a/src/test/regress/expected/subscription.out +++ b/src/test/regress/expected/subscription.out @@ -116,18 +116,18 @@ CREATE SUBSCRIPTION regress_testsub4 CONNECTION 'dbname=regress_doesnotexist' PU WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription. \dRs+ regress_testsub4 - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN -------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub4 | regress_subscription_user | f | {testpub} | f | off | d | f | none | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub4 | regress_subscription_user | f | {testpub} | f | off | d | f | none | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub4 SET (origin = any); \dRs+ regress_testsub4 - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN -------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub4 | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub4 | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) DROP SUBSCRIPTION regress_testsub3; @@ -145,24 +145,26 @@ ALTER SUBSCRIPTION regress_testsub CONNECTION 'foobar'; ERROR: invalid connection string syntax: missing "=" after "foobar" in connection info string \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET PUBLICATION testpub2, testpub3 WITH (refresh = false); ALTER SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist2'; ALTER SUBSCRIPTION regress_testsub SET (slot_name = 'newname'); ALTER SUBSCRIPTION regress_testsub SET (password_required = false); +ALTER SUBSCRIPTION regress_testsub SET (run_as_owner = true); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+------------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | off | d | f | any | f | f | off | dbname=regress_doesnotexist2 | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+------------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | off | d | f | any | f | t | f | off | dbname=regress_doesnotexist2 | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (password_required = true); +ALTER SUBSCRIPTION regress_testsub SET (run_as_owner = false); -- fail ALTER SUBSCRIPTION regress_testsub SET (slot_name = ''); ERROR: replication slot name "" is too short @@ -174,10 +176,10 @@ ERROR: unrecognized subscription parameter: "create_slot" -- ok ALTER SUBSCRIPTION regress_testsub SKIP (lsn = '0/12345'); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+------------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | off | d | f | any | t | f | off | dbname=regress_doesnotexist2 | 0/12345 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+------------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | off | d | f | any | t | f | f | off | dbname=regress_doesnotexist2 | 0/12345 (1 row) -- ok - with lsn = NONE @@ -186,10 +188,10 @@ ALTER SUBSCRIPTION regress_testsub SKIP (lsn = NONE); ALTER SUBSCRIPTION regress_testsub SKIP (lsn = '0/0'); ERROR: invalid WAL location (LSN): 0/0 \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+------------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | off | d | f | any | t | f | off | dbname=regress_doesnotexist2 | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+------------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | off | d | f | any | t | f | f | off | dbname=regress_doesnotexist2 | 0/0 (1 row) BEGIN; @@ -221,10 +223,10 @@ ALTER SUBSCRIPTION regress_testsub_foo SET (synchronous_commit = foobar); ERROR: invalid value for parameter "synchronous_commit": "foobar" HINT: Available values: local, remote_write, remote_apply, on, off. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ----------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+------------------------------+---------- - regress_testsub_foo | regress_subscription_user | f | {testpub2,testpub3} | f | off | d | f | any | t | f | local | dbname=regress_doesnotexist2 | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +---------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+------------------------------+---------- + regress_testsub_foo | regress_subscription_user | f | {testpub2,testpub3} | f | off | d | f | any | t | f | f | local | dbname=regress_doesnotexist2 | 0/0 (1 row) -- rename back to keep the rest simple @@ -253,19 +255,19 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub} | t | off | d | f | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | t | off | d | f | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (binary = false); ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) DROP SUBSCRIPTION regress_testsub; @@ -277,27 +279,27 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub} | f | on | d | f | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | on | d | f | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (streaming = parallel); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (streaming = false); ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) -- fail - publication already exists @@ -312,10 +314,10 @@ ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refr ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refresh = false); ERROR: publication "testpub1" is already in subscription "regress_testsub" \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+-----------------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub,testpub1,testpub2} | f | off | d | f | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-----------------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub,testpub1,testpub2} | f | off | d | f | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) -- fail - publication used more than once @@ -330,10 +332,10 @@ ERROR: publication "testpub3" is not in subscription "regress_testsub" -- ok - delete publications ALTER SUBSCRIPTION regress_testsub DROP PUBLICATION testpub1, testpub2 WITH (refresh = false); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) DROP SUBSCRIPTION regress_testsub; @@ -369,10 +371,10 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub} | f | off | p | f | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | off | p | f | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) --fail - alter of two_phase option not supported. @@ -381,10 +383,10 @@ ERROR: unrecognized subscription parameter: "two_phase" -- but can alter streaming when two_phase enabled ALTER SUBSCRIPTION regress_testsub SET (streaming = true); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub} | f | on | p | f | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | on | p | f | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); @@ -394,10 +396,10 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub} | f | on | p | f | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | on | p | f | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); @@ -410,18 +412,18 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and refresh the subscription. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (disable_on_error = true); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Synchronous commit | Conninfo | Skip LSN ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+--------------------+-----------------------------+---------- - regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | t | any | t | f | off | dbname=regress_doesnotexist | 0/0 + List of subscriptions + Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Synchronous commit | Conninfo | Skip LSN +-----------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------------------+-----------------------------+---------- + regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | t | any | t | f | f | off | dbname=regress_doesnotexist | 0/0 (1 row) ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); @@ -468,6 +470,11 @@ REVOKE CREATE ON DATABASE REGRESSION FROM regress_subscription_user3; SET SESSION AUTHORIZATION regress_subscription_user3; ALTER SUBSCRIPTION regress_testsub RENAME TO regress_testsub2; ERROR: permission denied for database regression +-- fail - cannot do ALTER SUBSCRIPTION SET (failover) inside transaction block +BEGIN; +ALTER SUBSCRIPTION regress_testsub SET (failover); +ERROR: ALTER SUBSCRIPTION ... SET (failover) cannot run inside a transaction block +COMMIT; -- ok, owning it is enough for this stuff ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); DROP SUBSCRIPTION regress_testsub; diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out index 22af8fafa173b..6c1fb2bfdbbbe 100644 --- a/src/test/regress/expected/subselect.out +++ b/src/test/regress/expected/subselect.out @@ -202,6 +202,57 @@ SELECT f1 AS "Correlated Field" 3 (5 rows) +-- Check ROWCOMPARE cases, both correlated and not +EXPLAIN (VERBOSE, COSTS OFF) +SELECT ROW(1, 2) = (SELECT f1, f2) AS eq FROM SUBSELECT_TBL; + QUERY PLAN +----------------------------------------------------------------- + Seq Scan on public.subselect_tbl + Output: (((1 = (SubPlan 1).col1) AND (2 = (SubPlan 1).col2))) + SubPlan 1 + -> Result + Output: subselect_tbl.f1, subselect_tbl.f2 +(5 rows) + +SELECT ROW(1, 2) = (SELECT f1, f2) AS eq FROM SUBSELECT_TBL; + eq +---- + t + f + f + f + f + f + f + f +(8 rows) + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT ROW(1, 2) = (SELECT 3, 4) AS eq FROM SUBSELECT_TBL; + QUERY PLAN +----------------------------------------------------------------- + Seq Scan on public.subselect_tbl + Output: ((1 = (InitPlan 1).col1) AND (2 = (InitPlan 1).col2)) + InitPlan 1 + -> Result + Output: 3, 4 +(5 rows) + +SELECT ROW(1, 2) = (SELECT 3, 4) AS eq FROM SUBSELECT_TBL; + eq +---- + f + f + f + f + f + f + f + f +(8 rows) + +SELECT ROW(1, 2) = (SELECT f1, f2 FROM SUBSELECT_TBL); -- error +ERROR: more than one row returned by a subquery used as an expression -- Subselects without aliases SELECT count FROM (SELECT COUNT(DISTINCT name) FROM road); count @@ -324,18 +375,18 @@ explain (verbose, costs off) select '42' union all select 43; -- check materialization of an initplan reference (bug #14524) explain (verbose, costs off) select 1 = all (select (select 1)); - QUERY PLAN ------------------------------------ + QUERY PLAN +------------------------------------------- Result - Output: (SubPlan 2) + Output: (ALL (1 = (SubPlan 2).col1)) SubPlan 2 -> Materialize - Output: ($0) - InitPlan 1 (returns $0) + Output: ((InitPlan 1).col1) + InitPlan 1 -> Result Output: 1 -> Result - Output: $0 + Output: (InitPlan 1).col1 (10 rows) select 1 = all (select (select 1)); @@ -377,7 +428,7 @@ select * from int4_tbl o where exists QUERY PLAN -------------------------------------- Seq Scan on int4_tbl o - Filter: (SubPlan 1) + Filter: EXISTS(SubPlan 1) SubPlan 1 -> Limit -> Seq Scan on int4_tbl i @@ -840,10 +891,10 @@ select * from outer_text where (f1, f2) not in (select * from inner_text); -- explain (verbose, costs off) select 'foo'::text in (select 'bar'::name union all select 'bar'::name); - QUERY PLAN -------------------------------------- + QUERY PLAN +--------------------------------------------------------- Result - Output: (hashed SubPlan 1) + Output: (ANY ('foo'::text = (hashed SubPlan 1).col1)) SubPlan 1 -> Append -> Result @@ -864,10 +915,10 @@ select 'foo'::text in (select 'bar'::name union all select 'bar'::name); -- explain (verbose, costs off) select row(row(row(1))) = any (select row(row(1))); - QUERY PLAN -------------------------------------------- + QUERY PLAN +-------------------------------------------------------- Result - Output: (SubPlan 1) + Output: (ANY ('("(1)")'::record = (SubPlan 1).col1)) SubPlan 1 -> Materialize Output: '("(1)")'::record @@ -907,10 +958,10 @@ language sql as 'select $1::text = $2'; create operator = (procedure=bogus_int8_text_eq, leftarg=int8, rightarg=text); explain (costs off) select * from int8_tbl where q1 in (select c1 from inner_text); - QUERY PLAN --------------------------------- + QUERY PLAN +-------------------------------------------------------- Seq Scan on int8_tbl - Filter: (hashed SubPlan 1) + Filter: (ANY ((q1)::text = (hashed SubPlan 1).col1)) SubPlan 1 -> Seq Scan on inner_text (4 rows) @@ -928,10 +979,10 @@ create or replace function bogus_int8_text_eq(int8, text) returns boolean language sql as 'select $1::text = $2 and $1::text = $2'; explain (costs off) select * from int8_tbl where q1 in (select c1 from inner_text); - QUERY PLAN --------------------------------- + QUERY PLAN +----------------------------------------------------------------------------------------------------- Seq Scan on int8_tbl - Filter: (hashed SubPlan 1) + Filter: (ANY (((q1)::text = (hashed SubPlan 1).col1) AND ((q1)::text = (hashed SubPlan 1).col1))) SubPlan 1 -> Seq Scan on inner_text (4 rows) @@ -949,10 +1000,10 @@ create or replace function bogus_int8_text_eq(int8, text) returns boolean language sql as 'select $2 = $1::text'; explain (costs off) select * from int8_tbl where q1 in (select c1 from inner_text); - QUERY PLAN --------------------------------------- + QUERY PLAN +------------------------------------------------- Seq Scan on int8_tbl - Filter: (SubPlan 1) + Filter: (ANY ((SubPlan 1).col1 = (q1)::text)) SubPlan 1 -> Materialize -> Seq Scan on inner_text @@ -972,11 +1023,11 @@ rollback; -- to get rid of the bogus operator explain (costs off) select count(*) from tenk1 t where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0); - QUERY PLAN --------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------------------- Aggregate -> Seq Scan on tenk1 t - Filter: ((hashed SubPlan 2) OR (ten < 0)) + Filter: ((ANY (unique2 = (hashed SubPlan 2).col1)) OR (ten < 0)) SubPlan 2 -> Index Only Scan using tenk1_unique1 on tenk1 k (5 rows) @@ -997,7 +1048,7 @@ where (exists(select 1 from tenk1 k where k.unique1 = t.unique2) or ten < 0) Aggregate -> Bitmap Heap Scan on tenk1 t Recheck Cond: (thousand = 1) - Filter: ((SubPlan 1) OR (ten < 0)) + Filter: (EXISTS(SubPlan 1) OR (ten < 0)) -> Bitmap Index Scan on tenk1_thous_tenthous Index Cond: (thousand = 1) SubPlan 1 @@ -1022,11 +1073,11 @@ analyze exists_tbl; explain (costs off) select * from exists_tbl t1 where (exists(select 1 from exists_tbl t2 where t1.c1 = t2.c2) or c3 < 0); - QUERY PLAN ------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------------- Append -> Seq Scan on exists_tbl_null t1_1 - Filter: ((SubPlan 1) OR (c3 < 0)) + Filter: (EXISTS(SubPlan 1) OR (c3 < 0)) SubPlan 1 -> Append -> Seq Scan on exists_tbl_null t2_1 @@ -1034,7 +1085,7 @@ select * from exists_tbl t1 -> Seq Scan on exists_tbl_def t2_2 Filter: (t1_1.c1 = c2) -> Seq Scan on exists_tbl_def t1_2 - Filter: ((hashed SubPlan 2) OR (c3 < 0)) + Filter: ((ANY (c1 = (hashed SubPlan 2).col1)) OR (c3 < 0)) SubPlan 2 -> Append -> Seq Scan on exists_tbl_null t2_4 @@ -1071,14 +1122,14 @@ where a.thousand = b.thousand explain (verbose, costs off) select x, x from (select (select now()) as x from (values(1),(2)) v(y)) ss; - QUERY PLAN ---------------------------- + QUERY PLAN +------------------------------------------------ Values Scan on "*VALUES*" - Output: $0, $1 - InitPlan 1 (returns $0) + Output: (InitPlan 1).col1, (InitPlan 2).col1 + InitPlan 1 -> Result Output: now() - InitPlan 2 (returns $1) + InitPlan 2 -> Result Output: now() (8 rows) @@ -1086,13 +1137,13 @@ explain (verbose, costs off) explain (verbose, costs off) select x, x from (select (select random()) as x from (values(1),(2)) v(y)) ss; - QUERY PLAN ----------------------------------- + QUERY PLAN +----------------------------------- Subquery Scan on ss Output: ss.x, ss.x -> Values Scan on "*VALUES*" - Output: $0 - InitPlan 1 (returns $0) + Output: (InitPlan 1).col1 + InitPlan 1 -> Result Output: random() (7 rows) @@ -1143,14 +1194,14 @@ where o.ten = 0; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Aggregate - Output: sum((((hashed SubPlan 1)))::integer) + Output: sum((((ANY (i.ten = (hashed SubPlan 1).col1))))::integer) -> Nested Loop - Output: ((hashed SubPlan 1)) + Output: ((ANY (i.ten = (hashed SubPlan 1).col1))) -> Seq Scan on public.onek o Output: o.unique1, o.unique2, o.two, o.four, o.ten, o.twenty, o.hundred, o.thousand, o.twothousand, o.fivethous, o.tenthous, o.odd, o.even, o.stringu1, o.stringu2, o.string4 Filter: (o.ten = 0) -> Index Scan using onek_unique1 on public.onek i - Output: (hashed SubPlan 1), random() + Output: (ANY (i.ten = (hashed SubPlan 1).col1)), random() Index Cond: (i.unique1 = o.unique1) SubPlan 1 -> Seq Scan on public.int4_tbl @@ -1346,7 +1397,7 @@ select * from int4_tbl where --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Nested Loop Semi Join Output: int4_tbl.f1 - Join Filter: (CASE WHEN (hashed SubPlan 1) THEN int4_tbl.f1 ELSE NULL::integer END = b.ten) + Join Filter: (CASE WHEN (ANY (int4_tbl.f1 = (hashed SubPlan 1).col1)) THEN int4_tbl.f1 ELSE NULL::integer END = b.ten) -> Seq Scan on public.int4_tbl Output: int4_tbl.f1 -> Seq Scan on public.tenk1 b @@ -1670,6 +1721,133 @@ fetch backward all in c1; (2 rows) commit; +-- +-- Verify that we correctly flatten cases involving a subquery output +-- expression that doesn't need to be wrapped in a PlaceHolderVar +-- +explain (costs off) +select tname, attname from ( +select relname::information_schema.sql_identifier as tname, * from + (select * from pg_class c) ss1) ss2 + right join pg_attribute a on a.attrelid = ss2.oid +where tname = 'tenk1' and attnum = 1; + QUERY PLAN +-------------------------------------------------------------------------- + Nested Loop + -> Index Scan using pg_class_relname_nsp_index on pg_class c + Index Cond: (relname = 'tenk1'::name) + -> Index Scan using pg_attribute_relid_attnum_index on pg_attribute a + Index Cond: ((attrelid = c.oid) AND (attnum = 1)) +(5 rows) + +select tname, attname from ( +select relname::information_schema.sql_identifier as tname, * from + (select * from pg_class c) ss1) ss2 + right join pg_attribute a on a.attrelid = ss2.oid +where tname = 'tenk1' and attnum = 1; + tname | attname +-------+--------- + tenk1 | unique1 +(1 row) + +-- Check behavior when there's a lateral reference in the output expression +explain (verbose, costs off) +select t1.ten, sum(x) from + tenk1 t1 left join lateral ( + select t1.ten + t2.ten as x, t2.fivethous from tenk1 t2 + ) ss on t1.unique1 = ss.fivethous +group by t1.ten +order by t1.ten; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Sort + Output: t1.ten, (sum((t1.ten + t2.ten))) + Sort Key: t1.ten + -> HashAggregate + Output: t1.ten, sum((t1.ten + t2.ten)) + Group Key: t1.ten + -> Hash Right Join + Output: t1.ten, t2.ten + Hash Cond: (t2.fivethous = t1.unique1) + -> Seq Scan on public.tenk1 t2 + Output: t2.unique1, t2.unique2, t2.two, t2.four, t2.ten, t2.twenty, t2.hundred, t2.thousand, t2.twothousand, t2.fivethous, t2.tenthous, t2.odd, t2.even, t2.stringu1, t2.stringu2, t2.string4 + -> Hash + Output: t1.ten, t1.unique1 + -> Seq Scan on public.tenk1 t1 + Output: t1.ten, t1.unique1 +(15 rows) + +select t1.ten, sum(x) from + tenk1 t1 left join lateral ( + select t1.ten + t2.ten as x, t2.fivethous from tenk1 t2 + ) ss on t1.unique1 = ss.fivethous +group by t1.ten +order by t1.ten; + ten | sum +-----+------- + 0 | 0 + 1 | 2000 + 2 | 4000 + 3 | 6000 + 4 | 8000 + 5 | 10000 + 6 | 12000 + 7 | 14000 + 8 | 16000 + 9 | 18000 +(10 rows) + +explain (verbose, costs off) +select t1.q1, x from + int8_tbl t1 left join + (int8_tbl t2 left join + lateral (select t2.q1+t3.q1 as x, * from int8_tbl t3) t3 on t2.q2 = t3.q2) + on t1.q2 = t2.q2 +order by 1, 2; + QUERY PLAN +-------------------------------------------------------- + Sort + Output: t1.q1, ((t2.q1 + t3.q1)) + Sort Key: t1.q1, ((t2.q1 + t3.q1)) + -> Hash Left Join + Output: t1.q1, (t2.q1 + t3.q1) + Hash Cond: (t2.q2 = t3.q2) + -> Hash Left Join + Output: t1.q1, t2.q1, t2.q2 + Hash Cond: (t1.q2 = t2.q2) + -> Seq Scan on public.int8_tbl t1 + Output: t1.q1, t1.q2 + -> Hash + Output: t2.q1, t2.q2 + -> Seq Scan on public.int8_tbl t2 + Output: t2.q1, t2.q2 + -> Hash + Output: t3.q1, t3.q2 + -> Seq Scan on public.int8_tbl t3 + Output: t3.q1, t3.q2 +(19 rows) + +select t1.q1, x from + int8_tbl t1 left join + (int8_tbl t2 left join + lateral (select t2.q1+t3.q1 as x, * from int8_tbl t3) t3 on t2.q2 = t3.q2) + on t1.q2 = t2.q2 +order by 1, 2; + q1 | x +------------------+------------------ + 123 | 246 + 123 | 246 + 123 | 4567890123456912 + 123 | 4567890123456912 + 123 | 9135780246913578 + 4567890123456789 | 246 + 4567890123456789 | 4567890123456912 + 4567890123456789 | 4567890123456912 + 4567890123456789 | 9135780246913578 + 4567890123456789 | 9135780246913578 + 4567890123456789 | 9135780246913578 +(11 rows) + -- -- Tests for CTE inlining behavior -- @@ -1905,7 +2083,7 @@ select * from (with y as (select * from x) select * from y) ss; Output: int4_tbl.f1 (5 rows) --- Ensure that we inline the currect CTE when there are +-- Ensure that we inline the correct CTE when there are -- multiple CTEs with the same name explain (verbose, costs off) with x as (select 1 as y) @@ -1926,3 +2104,131 @@ select * from x for update; Output: subselect_tbl.f1, subselect_tbl.f2, subselect_tbl.f3 (2 rows) +-- Pull up direct-correlated ANY_SUBLINKs +explain (costs off) +select * from tenk1 A where hundred in (select hundred from tenk2 B where B.odd = A.odd); + QUERY PLAN +------------------------------------------------------------ + Hash Join + Hash Cond: ((a.odd = b.odd) AND (a.hundred = b.hundred)) + -> Seq Scan on tenk1 a + -> Hash + -> HashAggregate + Group Key: b.odd, b.hundred + -> Seq Scan on tenk2 b +(7 rows) + +explain (costs off) +select * from tenk1 A where exists +(select 1 from tenk2 B +where A.hundred in (select C.hundred FROM tenk2 C +WHERE c.odd = b.odd)); + QUERY PLAN +----------------------------------------------------- + Nested Loop Semi Join + Join Filter: (ANY (a.hundred = (SubPlan 1).col1)) + -> Seq Scan on tenk1 a + -> Materialize + -> Seq Scan on tenk2 b + SubPlan 1 + -> Seq Scan on tenk2 c + Filter: (odd = b.odd) +(8 rows) + +-- we should only try to pull up the sublink into RHS of a left join +-- but a.hundred is not available. +explain (costs off) +SELECT * FROM tenk1 A LEFT JOIN tenk2 B +ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd); + QUERY PLAN +----------------------------------------------------- + Nested Loop Left Join + Join Filter: (ANY (a.hundred = (SubPlan 1).col1)) + -> Seq Scan on tenk1 a + -> Materialize + -> Seq Scan on tenk2 b + SubPlan 1 + -> Seq Scan on tenk2 c + Filter: (odd = b.odd) +(8 rows) + +-- we should only try to pull up the sublink into RHS of a left join +-- but a.odd is not available for this. +explain (costs off) +SELECT * FROM tenk1 A LEFT JOIN tenk2 B +ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = a.odd); + QUERY PLAN +----------------------------------------------------- + Nested Loop Left Join + Join Filter: (ANY (b.hundred = (SubPlan 1).col1)) + -> Seq Scan on tenk1 a + -> Materialize + -> Seq Scan on tenk2 b + SubPlan 1 + -> Seq Scan on tenk2 c + Filter: (odd = a.odd) +(8 rows) + +-- should be able to pull up since all the references are available. +explain (costs off) +SELECT * FROM tenk1 A LEFT JOIN tenk2 B +ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd); + QUERY PLAN +------------------------------------------------------------------------ + Nested Loop Left Join + -> Seq Scan on tenk1 a + -> Materialize + -> Hash Join + Hash Cond: ((b.odd = c.odd) AND (b.hundred = c.hundred)) + -> Seq Scan on tenk2 b + -> Hash + -> HashAggregate + Group Key: c.odd, c.hundred + -> Seq Scan on tenk2 c +(10 rows) + +-- we can pull up the sublink into the inner JoinExpr. +explain (costs off) +SELECT * FROM tenk1 A INNER JOIN tenk2 B +ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd) +WHERE a.thousand < 750; + QUERY PLAN +------------------------------------------------- + Hash Join + Hash Cond: (c.odd = b.odd) + -> Hash Join + Hash Cond: (a.hundred = c.hundred) + -> Seq Scan on tenk1 a + Filter: (thousand < 750) + -> Hash + -> HashAggregate + Group Key: c.odd, c.hundred + -> Seq Scan on tenk2 c + -> Hash + -> Seq Scan on tenk2 b +(12 rows) + +-- we can pull up the aggregate sublink into RHS of a left join. +explain (costs off) +SELECT * FROM tenk1 A LEFT JOIN tenk2 B +ON B.hundred in (SELECT min(c.hundred) FROM tenk2 C WHERE c.odd = b.odd); + QUERY PLAN +--------------------------------------------------------------------------------------- + Nested Loop Left Join + -> Seq Scan on tenk1 a + -> Materialize + -> Nested Loop + -> Seq Scan on tenk2 b + -> Memoize + Cache Key: b.hundred, b.odd + Cache Mode: binary + -> Subquery Scan on "ANY_subquery" + Filter: (b.hundred = "ANY_subquery".min) + -> Result + InitPlan 1 + -> Limit + -> Index Scan using tenk2_hundred on tenk2 c + Index Cond: (hundred IS NOT NULL) + Filter: (odd = b.odd) +(16 rows) + diff --git a/src/test/regress/expected/sysviews.out b/src/test/regress/expected/sysviews.out index 001c6e7eb9dee..2176a54bca1ae 100644 --- a/src/test/regress/expected/sysviews.out +++ b/src/test/regress/expected/sysviews.out @@ -28,6 +28,29 @@ select name, ident, parent, level, total_bytes >= free_bytes TopMemoryContext | | | 0 | t (1 row) +-- We can exercise some MemoryContext type stats functions. Most of the +-- column values are too platform-dependant to display. +-- Ensure stats from the bump allocator look sane. Bump isn't a commonly +-- used context, but it is used in tuplesort.c, so open a cursor to keep +-- the tuplesort alive long enough for us to query the context stats. +begin; +declare cur cursor for select left(a,10), b + from (values(repeat('a', 512 * 1024),1),(repeat('b', 512),2)) v(a,b) + order by v.a desc; +fetch 1 from cur; + left | b +------------+--- + bbbbbbbbbb | 2 +(1 row) + +select name, parent, total_bytes > 0, total_nblocks, free_bytes > 0, free_chunks +from pg_backend_memory_contexts where name = 'Caller tuples'; + name | parent | ?column? | total_nblocks | ?column? | free_chunks +---------------+----------------+----------+---------------+----------+------------- + Caller tuples | TupleSort sort | t | 2 | t | 0 +(1 row) + +rollback; -- At introduction, pg_config had 23 entries; it may grow select count(*) > 20 as ok from pg_config; ok @@ -114,6 +137,7 @@ select name, setting from pg_settings where name like 'enable%'; enable_async_append | on enable_bitmapscan | on enable_gathermerge | on + enable_group_by_reordering | on enable_hashagg | on enable_hashjoin | on enable_incremental_sort | on @@ -132,7 +156,24 @@ select name, setting from pg_settings where name like 'enable%'; enable_seqscan | on enable_sort | on enable_tidscan | on -(21 rows) +(22 rows) + +-- There are always wait event descriptions for various types. InjectionPoint +-- may be present or absent, depending on history since last postmaster start. +select type, count(*) > 0 as ok FROM pg_wait_events + where type <> 'InjectionPoint' group by type order by type COLLATE "C"; + type | ok +-----------+---- + Activity | t + BufferPin | t + Client | t + Extension | t + IO | t + IPC | t + LWLock | t + Lock | t + Timeout | t +(9 rows) -- Test that the pg_timezone_names and pg_timezone_abbrevs views are -- more-or-less working. We can't test their contents in any great detail diff --git a/src/test/regress/expected/tablespace.out b/src/test/regress/expected/tablespace.out index 9aabb85349741..9c561395970db 100644 --- a/src/test/regress/expected/tablespace.out +++ b/src/test/regress/expected/tablespace.out @@ -927,6 +927,11 @@ ALTER INDEX testschema.part_a_idx SET TABLESPACE pg_default; -- Fail, not empty DROP TABLESPACE regress_tblspace; ERROR: tablespace "regress_tblspace" is not empty +-- Adequate cache initialization before GRANT +\c - +BEGIN; +GRANT ALL ON TABLESPACE regress_tblspace TO PUBLIC; +ROLLBACK; CREATE ROLE regress_tablespace_user1 login; CREATE ROLE regress_tablespace_user2 login; GRANT USAGE ON SCHEMA testschema TO regress_tablespace_user2; diff --git a/src/test/regress/expected/temp.out b/src/test/regress/expected/temp.out index a5b3ed34a367a..2a246a7e1231a 100644 --- a/src/test/regress/expected/temp.out +++ b/src/test/regress/expected/temp.out @@ -108,6 +108,26 @@ SELECT * FROM temptest; 1 (1 row) +COMMIT; +SELECT * FROM temptest; +ERROR: relation "temptest" does not exist +LINE 1: SELECT * FROM temptest; + ^ +-- Test it with a CHECK condition that produces a toasted pg_constraint entry +BEGIN; +do $$ +begin + execute format($cmd$ + CREATE TEMP TABLE temptest (col text CHECK (col < %L)) ON COMMIT DROP + $cmd$, + (SELECT string_agg(g.i::text || ':' || random()::text, '|') + FROM generate_series(1, 100) g(i))); +end$$; +SELECT * FROM temptest; + col +----- +(0 rows) + COMMIT; SELECT * FROM temptest; ERROR: relation "temptest" does not exist diff --git a/src/test/regress/expected/test_setup.out b/src/test/regress/expected/test_setup.out index 5d9e6bf12bc35..3d0eeec996038 100644 --- a/src/test/regress/expected/test_setup.out +++ b/src/test/regress/expected/test_setup.out @@ -209,10 +209,6 @@ CREATE FUNCTION ttdummy () RETURNS trigger AS :'regresslib' LANGUAGE C; -CREATE FUNCTION get_columns_length(oid[]) - RETURNS int - AS :'regresslib' - LANGUAGE C STRICT STABLE PARALLEL SAFE; -- Use hand-rolled hash functions and operator classes to get predictable -- result on different machines. The hash function for int4 simply returns -- the sum of the values passed to it and the one for text returns the length diff --git a/src/test/regress/expected/timestamp.out b/src/test/regress/expected/timestamp.out index c64bcb7c127fc..cf337da517ef2 100644 --- a/src/test/regress/expected/timestamp.out +++ b/src/test/regress/expected/timestamp.out @@ -736,6 +736,13 @@ SELECT date_bin('5 min'::interval, timestamp '2020-02-01 01:01:01', timestamp '2 Sat Feb 01 00:57:30 2020 (1 row) +-- test roundoff edge case when source < origin +SELECT date_bin('30 minutes'::interval, timestamp '2024-02-01 15:00:00', timestamp '2024-02-01 17:00:00'); + date_bin +-------------------------- + Thu Feb 01 15:00:00 2024 +(1 row) + -- disallow intervals with months or years SELECT date_bin('5 months'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); ERROR: timestamps cannot be binned into intervals containing months or years @@ -747,6 +754,13 @@ ERROR: stride must be greater than zero -- disallow negative intervals SELECT date_bin('-2 days'::interval, timestamp '1970-01-01 01:00:00' , timestamp '1970-01-01 00:00:00'); ERROR: stride must be greater than zero +-- test overflow cases +select date_bin('15 minutes'::interval, timestamp '294276-12-30', timestamp '4000-12-20 BC'); +ERROR: interval out of range +select date_bin('200000000 days'::interval, '2024-02-01'::timestamp, '2024-01-01'::timestamp); +ERROR: interval out of range +select date_bin('365000 days'::interval, '4400-01-01 BC'::timestamp, '4000-01-01 BC'::timestamp); +ERROR: timestamp out of range -- Test casting within a BETWEEN qualifier SELECT d1 - timestamp without time zone '1997-01-02' AS diff FROM TIMESTAMP_TBL @@ -2125,3 +2139,65 @@ select * from generate_series('2020-01-01 00:00'::timestamp, '2020-01-02 03:00'::timestamp, '0 hour'::interval); ERROR: step size cannot equal zero +select generate_series(timestamp '1995-08-06 12:12:12', timestamp '1996-08-06 12:12:12', interval 'infinity'); +ERROR: step size cannot be infinite +select generate_series(timestamp '1995-08-06 12:12:12', timestamp '1996-08-06 12:12:12', interval '-infinity'); +ERROR: step size cannot be infinite +-- test arithmetic with infinite timestamps +select timestamp 'infinity' - timestamp 'infinity'; +ERROR: interval out of range +select timestamp 'infinity' - timestamp '-infinity'; + ?column? +---------- + infinity +(1 row) + +select timestamp '-infinity' - timestamp 'infinity'; + ?column? +----------- + -infinity +(1 row) + +select timestamp '-infinity' - timestamp '-infinity'; +ERROR: interval out of range +select timestamp 'infinity' - timestamp '1995-08-06 12:12:12'; + ?column? +---------- + infinity +(1 row) + +select timestamp '-infinity' - timestamp '1995-08-06 12:12:12'; + ?column? +----------- + -infinity +(1 row) + +-- test age() with infinite timestamps +select age(timestamp 'infinity'); + age +----------- + -infinity +(1 row) + +select age(timestamp '-infinity'); + age +---------- + infinity +(1 row) + +select age(timestamp 'infinity', timestamp 'infinity'); +ERROR: interval out of range +select age(timestamp 'infinity', timestamp '-infinity'); + age +---------- + infinity +(1 row) + +select age(timestamp '-infinity', timestamp 'infinity'); + age +----------- + -infinity +(1 row) + +select age(timestamp '-infinity', timestamp '-infinity'); +ERROR: interval out of range diff --git a/src/test/regress/expected/timestamptz.out b/src/test/regress/expected/timestamptz.out index 0dd2fe2c82dc6..bad9e55cf1e65 100644 --- a/src/test/regress/expected/timestamptz.out +++ b/src/test/regress/expected/timestamptz.out @@ -330,12 +330,12 @@ SELECT d1 FROM TIMESTAMPTZ_TBL; Fri Feb 14 17:32:01 1997 PST Sat Feb 15 17:32:01 1997 PST Sun Feb 16 17:32:01 1997 PST - Tue Feb 16 17:32:01 0097 PST BC - Sat Feb 16 17:32:01 0097 PST - Thu Feb 16 17:32:01 0597 PST - Tue Feb 16 17:32:01 1097 PST - Sat Feb 16 17:32:01 1697 PST - Thu Feb 16 17:32:01 1797 PST + Tue Feb 16 17:32:01 0097 LMT BC + Sat Feb 16 17:32:01 0097 LMT + Thu Feb 16 17:32:01 0597 LMT + Tue Feb 16 17:32:01 1097 LMT + Sat Feb 16 17:32:01 1697 LMT + Thu Feb 16 17:32:01 1797 LMT Tue Feb 16 17:32:01 1897 PST Sun Feb 16 17:32:01 1997 PST Sat Feb 16 17:32:01 2097 PST @@ -359,19 +359,19 @@ SELECT d1 FROM TIMESTAMPTZ_TBL; SELECT '4714-11-24 00:00:00+00 BC'::timestamptz; timestamptz --------------------------------- - Sun Nov 23 16:00:00 4714 PST BC + Sun Nov 23 16:07:02 4714 LMT BC (1 row) SELECT '4714-11-23 16:00:00-08 BC'::timestamptz; timestamptz --------------------------------- - Sun Nov 23 16:00:00 4714 PST BC + Sun Nov 23 16:07:02 4714 LMT BC (1 row) SELECT 'Sun Nov 23 16:00:00 4714 PST BC'::timestamptz; timestamptz --------------------------------- - Sun Nov 23 16:00:00 4714 PST BC + Sun Nov 23 16:07:02 4714 LMT BC (1 row) SELECT '4714-11-23 23:59:59+00 BC'::timestamptz; -- out of range @@ -461,12 +461,12 @@ SELECT d1 FROM TIMESTAMPTZ_TBL --------------------------------- -infinity Wed Dec 31 16:00:00 1969 PST - Tue Feb 16 17:32:01 0097 PST BC - Sat Feb 16 17:32:01 0097 PST - Thu Feb 16 17:32:01 0597 PST - Tue Feb 16 17:32:01 1097 PST - Sat Feb 16 17:32:01 1697 PST - Thu Feb 16 17:32:01 1797 PST + Tue Feb 16 17:32:01 0097 LMT BC + Sat Feb 16 17:32:01 0097 LMT + Thu Feb 16 17:32:01 0597 LMT + Tue Feb 16 17:32:01 1097 LMT + Sat Feb 16 17:32:01 1697 LMT + Thu Feb 16 17:32:01 1797 LMT Tue Feb 16 17:32:01 1897 PST Wed Feb 28 17:32:01 1996 PST Thu Feb 29 17:32:01 1996 PST @@ -529,12 +529,12 @@ SELECT d1 FROM TIMESTAMPTZ_TBL Fri Feb 14 17:32:01 1997 PST Sat Feb 15 17:32:01 1997 PST Sun Feb 16 17:32:01 1997 PST - Tue Feb 16 17:32:01 0097 PST BC - Sat Feb 16 17:32:01 0097 PST - Thu Feb 16 17:32:01 0597 PST - Tue Feb 16 17:32:01 1097 PST - Sat Feb 16 17:32:01 1697 PST - Thu Feb 16 17:32:01 1797 PST + Tue Feb 16 17:32:01 0097 LMT BC + Sat Feb 16 17:32:01 0097 LMT + Thu Feb 16 17:32:01 0597 LMT + Tue Feb 16 17:32:01 1097 LMT + Sat Feb 16 17:32:01 1697 LMT + Thu Feb 16 17:32:01 1797 LMT Tue Feb 16 17:32:01 1897 PST Sun Feb 16 17:32:01 1997 PST Sat Feb 16 17:32:01 2097 PST @@ -561,12 +561,12 @@ SELECT d1 FROM TIMESTAMPTZ_TBL -infinity Wed Dec 31 16:00:00 1969 PST Thu Jan 02 00:00:00 1997 PST - Tue Feb 16 17:32:01 0097 PST BC - Sat Feb 16 17:32:01 0097 PST - Thu Feb 16 17:32:01 0597 PST - Tue Feb 16 17:32:01 1097 PST - Sat Feb 16 17:32:01 1697 PST - Thu Feb 16 17:32:01 1797 PST + Tue Feb 16 17:32:01 0097 LMT BC + Sat Feb 16 17:32:01 0097 LMT + Thu Feb 16 17:32:01 0597 LMT + Tue Feb 16 17:32:01 1097 LMT + Sat Feb 16 17:32:01 1697 LMT + Thu Feb 16 17:32:01 1797 LMT Tue Feb 16 17:32:01 1897 PST Wed Feb 28 17:32:01 1996 PST Thu Feb 29 17:32:01 1996 PST @@ -780,6 +780,13 @@ SELECT date_bin('5 min'::interval, timestamptz '2020-02-01 01:01:01+00', timesta Fri Jan 31 16:57:30 2020 PST (1 row) +-- test roundoff edge case when source < origin +SELECT date_bin('30 minutes'::interval, timestamptz '2024-02-01 15:00:00', timestamptz '2024-02-01 17:00:00'); + date_bin +------------------------------ + Thu Feb 01 15:00:00 2024 PST +(1 row) + -- disallow intervals with months or years SELECT date_bin('5 months'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); ERROR: timestamps cannot be binned into intervals containing months or years @@ -791,6 +798,13 @@ ERROR: stride must be greater than zero -- disallow negative intervals SELECT date_bin('-2 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00'); ERROR: stride must be greater than zero +-- test overflow cases +select date_bin('15 minutes'::interval, timestamptz '294276-12-30', timestamptz '4000-12-20 BC'); +ERROR: interval out of range +select date_bin('200000000 days'::interval, '2024-02-01'::timestamptz, '2024-01-01'::timestamptz); +ERROR: interval out of range +select date_bin('365000 days'::interval, '4400-01-01 BC'::timestamptz, '4000-01-01 BC'::timestamptz); +ERROR: timestamp out of range -- Test casting within a BETWEEN qualifier SELECT d1 - timestamp with time zone '1997-01-02' AS diff FROM TIMESTAMPTZ_TBL @@ -906,12 +920,12 @@ SELECT d1 as timestamptz, Fri Feb 14 17:32:01 1997 PST | 1997 | 2 | 14 | 17 | 32 | 1 Sat Feb 15 17:32:01 1997 PST | 1997 | 2 | 15 | 17 | 32 | 1 Sun Feb 16 17:32:01 1997 PST | 1997 | 2 | 16 | 17 | 32 | 1 - Tue Feb 16 17:32:01 0097 PST BC | -97 | 2 | 16 | 17 | 32 | 1 - Sat Feb 16 17:32:01 0097 PST | 97 | 2 | 16 | 17 | 32 | 1 - Thu Feb 16 17:32:01 0597 PST | 597 | 2 | 16 | 17 | 32 | 1 - Tue Feb 16 17:32:01 1097 PST | 1097 | 2 | 16 | 17 | 32 | 1 - Sat Feb 16 17:32:01 1697 PST | 1697 | 2 | 16 | 17 | 32 | 1 - Thu Feb 16 17:32:01 1797 PST | 1797 | 2 | 16 | 17 | 32 | 1 + Tue Feb 16 17:32:01 0097 LMT BC | -97 | 2 | 16 | 17 | 32 | 1 + Sat Feb 16 17:32:01 0097 LMT | 97 | 2 | 16 | 17 | 32 | 1 + Thu Feb 16 17:32:01 0597 LMT | 597 | 2 | 16 | 17 | 32 | 1 + Tue Feb 16 17:32:01 1097 LMT | 1097 | 2 | 16 | 17 | 32 | 1 + Sat Feb 16 17:32:01 1697 LMT | 1697 | 2 | 16 | 17 | 32 | 1 + Thu Feb 16 17:32:01 1797 LMT | 1797 | 2 | 16 | 17 | 32 | 1 Tue Feb 16 17:32:01 1897 PST | 1897 | 2 | 16 | 17 | 32 | 1 Sun Feb 16 17:32:01 1997 PST | 1997 | 2 | 16 | 17 | 32 | 1 Sat Feb 16 17:32:01 2097 PST | 2097 | 2 | 16 | 17 | 32 | 1 @@ -980,12 +994,12 @@ SELECT d1 as timestamptz, Fri Feb 14 17:32:01 1997 PST | 1 | 1000 | 1000000 Sat Feb 15 17:32:01 1997 PST | 1 | 1000 | 1000000 Sun Feb 16 17:32:01 1997 PST | 1 | 1000 | 1000000 - Tue Feb 16 17:32:01 0097 PST BC | 1 | 1000 | 1000000 - Sat Feb 16 17:32:01 0097 PST | 1 | 1000 | 1000000 - Thu Feb 16 17:32:01 0597 PST | 1 | 1000 | 1000000 - Tue Feb 16 17:32:01 1097 PST | 1 | 1000 | 1000000 - Sat Feb 16 17:32:01 1697 PST | 1 | 1000 | 1000000 - Thu Feb 16 17:32:01 1797 PST | 1 | 1000 | 1000000 + Tue Feb 16 17:32:01 0097 LMT BC | 1 | 1000 | 1000000 + Sat Feb 16 17:32:01 0097 LMT | 1 | 1000 | 1000000 + Thu Feb 16 17:32:01 0597 LMT | 1 | 1000 | 1000000 + Tue Feb 16 17:32:01 1097 LMT | 1 | 1000 | 1000000 + Sat Feb 16 17:32:01 1697 LMT | 1 | 1000 | 1000000 + Thu Feb 16 17:32:01 1797 LMT | 1 | 1000 | 1000000 Tue Feb 16 17:32:01 1897 PST | 1 | 1000 | 1000000 Sun Feb 16 17:32:01 1997 PST | 1 | 1000 | 1000000 Sat Feb 16 17:32:01 2097 PST | 1 | 1000 | 1000000 @@ -1055,12 +1069,12 @@ SELECT d1 as timestamptz, Fri Feb 14 17:32:01 1997 PST | 1997 | 7 | 5 | 5 | 45 Sat Feb 15 17:32:01 1997 PST | 1997 | 7 | 6 | 6 | 46 Sun Feb 16 17:32:01 1997 PST | 1997 | 7 | 7 | 0 | 47 - Tue Feb 16 17:32:01 0097 PST BC | -97 | 7 | 2 | 2 | 47 - Sat Feb 16 17:32:01 0097 PST | 97 | 7 | 6 | 6 | 47 - Thu Feb 16 17:32:01 0597 PST | 597 | 7 | 4 | 4 | 47 - Tue Feb 16 17:32:01 1097 PST | 1097 | 7 | 2 | 2 | 47 - Sat Feb 16 17:32:01 1697 PST | 1697 | 7 | 6 | 6 | 47 - Thu Feb 16 17:32:01 1797 PST | 1797 | 7 | 4 | 4 | 47 + Tue Feb 16 17:32:01 0097 LMT BC | -97 | 7 | 2 | 2 | 47 + Sat Feb 16 17:32:01 0097 LMT | 97 | 7 | 6 | 6 | 47 + Thu Feb 16 17:32:01 0597 LMT | 597 | 7 | 4 | 4 | 47 + Tue Feb 16 17:32:01 1097 LMT | 1097 | 7 | 2 | 2 | 47 + Sat Feb 16 17:32:01 1697 LMT | 1697 | 7 | 6 | 6 | 47 + Thu Feb 16 17:32:01 1797 LMT | 1797 | 7 | 4 | 4 | 47 Tue Feb 16 17:32:01 1897 PST | 1897 | 7 | 2 | 2 | 47 Sun Feb 16 17:32:01 1997 PST | 1997 | 7 | 7 | 0 | 47 Sat Feb 16 17:32:01 2097 PST | 2097 | 7 | 6 | 6 | 47 @@ -1132,12 +1146,12 @@ SELECT d1 as timestamptz, Fri Feb 14 17:32:01 1997 PST | 199 | 20 | 2 | 2450495 | 855970321 Sat Feb 15 17:32:01 1997 PST | 199 | 20 | 2 | 2450496 | 856056721 Sun Feb 16 17:32:01 1997 PST | 199 | 20 | 2 | 2450497 | 856143121 - Tue Feb 16 17:32:01 0097 PST BC | -10 | -1 | -1 | 1686043 | -65192682479 - Sat Feb 16 17:32:01 0097 PST | 9 | 1 | 1 | 1756537 | -59102000879 - Thu Feb 16 17:32:01 0597 PST | 59 | 6 | 1 | 1939158 | -43323546479 - Tue Feb 16 17:32:01 1097 PST | 109 | 11 | 2 | 2121779 | -27545092079 - Sat Feb 16 17:32:01 1697 PST | 169 | 17 | 2 | 2340925 | -8610877679 - Thu Feb 16 17:32:01 1797 PST | 179 | 18 | 2 | 2377449 | -5455204079 + Tue Feb 16 17:32:01 0097 LMT BC | -10 | -1 | -1 | 1686043 | -65192682901 + Sat Feb 16 17:32:01 0097 LMT | 9 | 1 | 1 | 1756537 | -59102001301 + Thu Feb 16 17:32:01 0597 LMT | 59 | 6 | 1 | 1939158 | -43323546901 + Tue Feb 16 17:32:01 1097 LMT | 109 | 11 | 2 | 2121779 | -27545092501 + Sat Feb 16 17:32:01 1697 LMT | 169 | 17 | 2 | 2340925 | -8610878101 + Thu Feb 16 17:32:01 1797 LMT | 179 | 18 | 2 | 2377449 | -5455204501 Tue Feb 16 17:32:01 1897 PST | 189 | 19 | 2 | 2413973 | -2299530479 Sun Feb 16 17:32:01 1997 PST | 199 | 20 | 2 | 2450497 | 856143121 Sat Feb 16 17:32:01 2097 PST | 209 | 21 | 3 | 2487022 | 4011903121 @@ -1207,12 +1221,12 @@ SELECT d1 as timestamptz, Fri Feb 14 17:32:01 1997 PST | -28800 | -8 | 0 Sat Feb 15 17:32:01 1997 PST | -28800 | -8 | 0 Sun Feb 16 17:32:01 1997 PST | -28800 | -8 | 0 - Tue Feb 16 17:32:01 0097 PST BC | -28800 | -8 | 0 - Sat Feb 16 17:32:01 0097 PST | -28800 | -8 | 0 - Thu Feb 16 17:32:01 0597 PST | -28800 | -8 | 0 - Tue Feb 16 17:32:01 1097 PST | -28800 | -8 | 0 - Sat Feb 16 17:32:01 1697 PST | -28800 | -8 | 0 - Thu Feb 16 17:32:01 1797 PST | -28800 | -8 | 0 + Tue Feb 16 17:32:01 0097 LMT BC | -28378 | -7 | -52 + Sat Feb 16 17:32:01 0097 LMT | -28378 | -7 | -52 + Thu Feb 16 17:32:01 0597 LMT | -28378 | -7 | -52 + Tue Feb 16 17:32:01 1097 LMT | -28378 | -7 | -52 + Sat Feb 16 17:32:01 1697 LMT | -28378 | -7 | -52 + Thu Feb 16 17:32:01 1797 LMT | -28378 | -7 | -52 Tue Feb 16 17:32:01 1897 PST | -28800 | -8 | 0 Sun Feb 16 17:32:01 1997 PST | -28800 | -8 | 0 Sat Feb 16 17:32:01 2097 PST | -28800 | -8 | 0 @@ -1286,12 +1300,12 @@ SELECT d1 as "timestamp", Fri Feb 14 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450495 | 855970321.000000 Sat Feb 15 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450496 | 856056721.000000 Sun Feb 16 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450497 | 856143121.000000 - Tue Feb 16 17:32:01 0097 PST BC | 1000000 | 1000.000 | 1.000000 | 1686043 | -65192682479.000000 - Sat Feb 16 17:32:01 0097 PST | 1000000 | 1000.000 | 1.000000 | 1756537 | -59102000879.000000 - Thu Feb 16 17:32:01 0597 PST | 1000000 | 1000.000 | 1.000000 | 1939158 | -43323546479.000000 - Tue Feb 16 17:32:01 1097 PST | 1000000 | 1000.000 | 1.000000 | 2121779 | -27545092079.000000 - Sat Feb 16 17:32:01 1697 PST | 1000000 | 1000.000 | 1.000000 | 2340925 | -8610877679.000000 - Thu Feb 16 17:32:01 1797 PST | 1000000 | 1000.000 | 1.000000 | 2377449 | -5455204079.000000 + Tue Feb 16 17:32:01 0097 LMT BC | 1000000 | 1000.000 | 1.000000 | 1686043 | -65192682901.000000 + Sat Feb 16 17:32:01 0097 LMT | 1000000 | 1000.000 | 1.000000 | 1756537 | -59102001301.000000 + Thu Feb 16 17:32:01 0597 LMT | 1000000 | 1000.000 | 1.000000 | 1939158 | -43323546901.000000 + Tue Feb 16 17:32:01 1097 LMT | 1000000 | 1000.000 | 1.000000 | 2121779 | -27545092501.000000 + Sat Feb 16 17:32:01 1697 LMT | 1000000 | 1000.000 | 1.000000 | 2340925 | -8610878101.000000 + Thu Feb 16 17:32:01 1797 LMT | 1000000 | 1000.000 | 1.000000 | 2377449 | -5455204501.000000 Tue Feb 16 17:32:01 1897 PST | 1000000 | 1000.000 | 1.000000 | 2413973 | -2299530479.000000 Sun Feb 16 17:32:01 1997 PST | 1000000 | 1000.000 | 1.000000 | 2450497 | 856143121.000000 Sat Feb 16 17:32:01 2097 PST | 1000000 | 1000.000 | 1.000000 | 2487022 | 4011903121.000000 @@ -2290,7 +2304,7 @@ INSERT INTO TIMESTAMPTZ_TST VALUES(4, '1000000312 23:58:48 IST'); SELECT * FROM TIMESTAMPTZ_TST ORDER BY a; a | b ---+-------------------------------- - 1 | Wed Mar 12 13:58:48 1000 PST + 1 | Wed Mar 12 14:05:50 1000 LMT 2 | Sun Mar 12 14:58:48 10000 PDT 3 | Sun Mar 12 14:58:48 100000 PDT 3 | Sun Mar 12 14:58:48 10000 PDT @@ -2374,10 +2388,16 @@ SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') AT TIME ZONE 'UT Tue Dec 09 23:00:00 2014 (1 row) -SELECT make_timestamptz(1846, 12, 10, 0, 0, 0, 'Asia/Manila') AT TIME ZONE 'UTC'; +SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Asia/Singapore') AT TIME ZONE 'UTC'; timezone -------------------------- - Wed Dec 09 15:56:00 1846 + Fri Dec 09 17:04:35 1881 +(1 row) + +SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Pacific/Honolulu') AT TIME ZONE 'UTC'; + timezone +-------------------------- + Sat Dec 10 10:31:26 1881 (1 row) SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Europe/Paris') AT TIME ZONE 'UTC'; @@ -2401,7 +2421,14 @@ SELECT make_timestamptz(2008, 12, 10, 10, 10, 10, 'EDT'); Wed Dec 10 09:10:10 2008 EST (1 row) -SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, 'PST8PDT'); +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, 'FOO8BAR'); + make_timestamptz +------------------------------ + Wed Dec 10 13:10:10 2014 EST +(1 row) + +-- POSIX +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, 'PST8PDT,M3.2.0,M11.1.0'); make_timestamptz ------------------------------ Wed Dec 10 13:10:10 2014 EST @@ -2468,6 +2495,10 @@ select * from generate_series('2020-01-01 00:00'::timestamptz, '2020-01-02 03:00'::timestamptz, '0 hour'::interval); ERROR: step size cannot equal zero +select generate_series(timestamptz '1995-08-06 12:12:12', timestamptz '1996-08-06 12:12:12', interval 'infinity'); +ERROR: step size cannot be infinite +select generate_series(timestamptz '1995-08-06 12:12:12', timestamptz '1996-08-06 12:12:12', interval '-infinity'); +ERROR: step size cannot be infinite -- Interval crossing time shift for Europe/Warsaw timezone (with DST) SET TimeZone to 'UTC'; SELECT date_add('2022-10-30 00:00:00+01'::timestamptz, @@ -3135,6 +3166,62 @@ SELECT '2014-10-25 23:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; Sun Oct 26 02:00:00 2014 (1 row) +-- +-- Test LOCAL time zone +-- +BEGIN; +SET LOCAL TIME ZONE 'Europe/Paris'; +VALUES (CAST('1978-07-07 19:38 America/New_York' AS TIMESTAMP WITH TIME ZONE) AT LOCAL); + column1 +-------------------------- + Sat Jul 08 01:38:00 1978 +(1 row) + +VALUES (TIMESTAMP '1978-07-07 19:38' AT LOCAL); + column1 +------------------------------- + Fri Jul 07 19:38:00 1978 CEST +(1 row) + +SET LOCAL TIME ZONE 'Australia/Sydney'; +VALUES (CAST('1978-07-07 19:38 America/New_York' AS TIMESTAMP WITH TIME ZONE) AT LOCAL); + column1 +-------------------------- + Sat Jul 08 09:38:00 1978 +(1 row) + +VALUES (TIMESTAMP '1978-07-07 19:38' AT LOCAL); + column1 +------------------------------- + Fri Jul 07 19:38:00 1978 AEST +(1 row) + +SET LOCAL TimeZone TO 'UTC'; +CREATE VIEW timestamp_local_view AS + SELECT CAST('1978-07-07 19:38 America/New_York' AS TIMESTAMP WITH TIME ZONE) AT LOCAL AS ttz_at_local, + timezone(CAST('1978-07-07 19:38 America/New_York' AS TIMESTAMP WITH TIME ZONE)) AS ttz_func, + TIMESTAMP '1978-07-07 19:38' AT LOCAL AS t_at_local, + timezone(TIMESTAMP '1978-07-07 19:38') AS t_func; +SELECT pg_get_viewdef('timestamp_local_view', true); + pg_get_viewdef +---------------------------------------------------------------------------------------------- + SELECT ('Fri Jul 07 23:38:00 1978 UTC'::timestamp with time zone AT LOCAL) AS ttz_at_local,+ + timezone('Fri Jul 07 23:38:00 1978 UTC'::timestamp with time zone) AS ttz_func, + + ('Fri Jul 07 19:38:00 1978'::timestamp without time zone AT LOCAL) AS t_at_local, + + timezone('Fri Jul 07 19:38:00 1978'::timestamp without time zone) AS t_func; +(1 row) + +\x +TABLE timestamp_local_view; +-[ RECORD 1 ]+----------------------------- +ttz_at_local | Fri Jul 07 23:38:00 1978 +ttz_func | Fri Jul 07 23:38:00 1978 +t_at_local | Fri Jul 07 19:38:00 1978 UTC +t_func | Fri Jul 07 19:38:00 1978 UTC + +\x +DROP VIEW timestamp_local_view; +COMMIT; -- -- Test that AT TIME ZONE isn't misoptimized when using an index (bug #14504) -- @@ -3154,3 +3241,61 @@ select * from tmptz where f1 at time zone 'utc' = '2017-01-18 00:00'; Tue Jan 17 16:00:00 2017 PST (1 row) +-- test arithmetic with infinite timestamps +SELECT timestamptz 'infinity' - timestamptz 'infinity'; +ERROR: interval out of range +SELECT timestamptz 'infinity' - timestamptz '-infinity'; + ?column? +---------- + infinity +(1 row) + +SELECT timestamptz '-infinity' - timestamptz 'infinity'; + ?column? +----------- + -infinity +(1 row) + +SELECT timestamptz '-infinity' - timestamptz '-infinity'; +ERROR: interval out of range +SELECT timestamptz 'infinity' - timestamptz '1995-08-06 12:12:12'; + ?column? +---------- + infinity +(1 row) + +SELECT timestamptz '-infinity' - timestamptz '1995-08-06 12:12:12'; + ?column? +----------- + -infinity +(1 row) + +-- test age() with infinite timestamps +SELECT age(timestamptz 'infinity'); + age +----------- + -infinity +(1 row) + +SELECT age(timestamptz '-infinity'); + age +---------- + infinity +(1 row) + +SELECT age(timestamptz 'infinity', timestamptz 'infinity'); +ERROR: interval out of range +SELECT age(timestamptz 'infinity', timestamptz '-infinity'); + age +---------- + infinity +(1 row) + +SELECT age(timestamptz '-infinity', timestamptz 'infinity'); + age +----------- + -infinity +(1 row) + +SELECT age(timestamptz '-infinity', timestamptz '-infinity'); +ERROR: interval out of range diff --git a/src/test/regress/expected/timetz.out b/src/test/regress/expected/timetz.out index be49588b6d328..cbab6cfe5d7f1 100644 --- a/src/test/regress/expected/timetz.out +++ b/src/test/regress/expected/timetz.out @@ -262,3 +262,67 @@ SELECT date_part('epoch', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401- 63025.575401 (1 row) +-- +-- Test timetz_zone, timetz_izone, AT LOCAL +-- +BEGIN; +SET LOCAL TimeZone TO 'UTC'; +CREATE VIEW timetz_local_view AS + SELECT f1 AS dat, + timezone(f1) AS dat_func, + f1 AT LOCAL AS dat_at_local, + f1 AT TIME ZONE current_setting('TimeZone') AS dat_at_tz, + f1 AT TIME ZONE INTERVAL '00:00' AS dat_at_int + FROM TIMETZ_TBL + ORDER BY f1; +SELECT pg_get_viewdef('timetz_local_view', true); + pg_get_viewdef +----------------------------------------------------------------------- + SELECT f1 AS dat, + + timezone(f1) AS dat_func, + + (f1 AT LOCAL) AS dat_at_local, + + (f1 AT TIME ZONE current_setting('TimeZone'::text)) AS dat_at_tz,+ + (f1 AT TIME ZONE '@ 0'::interval) AS dat_at_int + + FROM timetz_tbl + + ORDER BY f1; +(1 row) + +TABLE timetz_local_view; + dat | dat_func | dat_at_local | dat_at_tz | dat_at_int +----------------+----------------+----------------+----------------+---------------- + 00:01:00-07 | 07:01:00+00 | 07:01:00+00 | 07:01:00+00 | 07:01:00+00 + 01:00:00-07 | 08:00:00+00 | 08:00:00+00 | 08:00:00+00 | 08:00:00+00 + 02:03:00-07 | 09:03:00+00 | 09:03:00+00 | 09:03:00+00 | 09:03:00+00 + 08:08:00-04 | 12:08:00+00 | 12:08:00+00 | 12:08:00+00 | 12:08:00+00 + 07:07:00-08 | 15:07:00+00 | 15:07:00+00 | 15:07:00+00 | 15:07:00+00 + 11:59:00-07 | 18:59:00+00 | 18:59:00+00 | 18:59:00+00 | 18:59:00+00 + 12:00:00-07 | 19:00:00+00 | 19:00:00+00 | 19:00:00+00 | 19:00:00+00 + 12:01:00-07 | 19:01:00+00 | 19:01:00+00 | 19:01:00+00 | 19:01:00+00 + 15:36:39-04 | 19:36:39+00 | 19:36:39+00 | 19:36:39+00 | 19:36:39+00 + 15:36:39-05 | 20:36:39+00 | 20:36:39+00 | 20:36:39+00 | 20:36:39+00 + 23:59:00-07 | 06:59:00+00 | 06:59:00+00 | 06:59:00+00 | 06:59:00+00 + 23:59:59.99-07 | 06:59:59.99+00 | 06:59:59.99+00 | 06:59:59.99+00 | 06:59:59.99+00 +(12 rows) + +SELECT f1 AS dat, + f1 AT TIME ZONE 'UTC+10' AS dat_at_tz, + f1 AT TIME ZONE INTERVAL '-10:00' AS dat_at_int + FROM TIMETZ_TBL + ORDER BY f1; + dat | dat_at_tz | dat_at_int +----------------+----------------+---------------- + 00:01:00-07 | 21:01:00-10 | 21:01:00-10 + 01:00:00-07 | 22:00:00-10 | 22:00:00-10 + 02:03:00-07 | 23:03:00-10 | 23:03:00-10 + 08:08:00-04 | 02:08:00-10 | 02:08:00-10 + 07:07:00-08 | 05:07:00-10 | 05:07:00-10 + 11:59:00-07 | 08:59:00-10 | 08:59:00-10 + 12:00:00-07 | 09:00:00-10 | 09:00:00-10 + 12:01:00-07 | 09:01:00-10 | 09:01:00-10 + 15:36:39-04 | 09:36:39-10 | 09:36:39-10 + 15:36:39-05 | 10:36:39-10 | 10:36:39-10 + 23:59:00-07 | 20:59:00-10 | 20:59:00-10 + 23:59:59.99-07 | 20:59:59.99-10 | 20:59:59.99-10 +(12 rows) + +ROLLBACK; diff --git a/src/test/regress/expected/transactions.out b/src/test/regress/expected/transactions.out index 428c9edcc6f05..7f5757e89c42f 100644 --- a/src/test/regress/expected/transactions.out +++ b/src/test/regress/expected/transactions.out @@ -852,6 +852,46 @@ SHOW transaction_deferrable; on (1 row) +COMMIT; +START TRANSACTION ISOLATION LEVEL READ COMMITTED, READ WRITE, DEFERRABLE; +SHOW transaction_isolation; + transaction_isolation +----------------------- + read committed +(1 row) + +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +SHOW transaction_deferrable; + transaction_deferrable +------------------------ + on +(1 row) + +SAVEPOINT x; +COMMIT AND CHAIN; -- TBLOCK_SUBCOMMIT +SHOW transaction_isolation; + transaction_isolation +----------------------- + read committed +(1 row) + +SHOW transaction_read_only; + transaction_read_only +----------------------- + off +(1 row) + +SHOW transaction_deferrable; + transaction_deferrable +------------------------ + on +(1 row) + COMMIT; -- different mix of options just for fun START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE, NOT DEFERRABLE; @@ -1148,6 +1188,17 @@ SELECT * FROM trans_abc ORDER BY 1; (3 rows) DROP TABLE trans_abc; +-- TRANSACTION SNAPSHOT +-- Incorrect identifier. +BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; +SET TRANSACTION SNAPSHOT 'Incorrect Identifier'; +ERROR: invalid snapshot identifier: "Incorrect Identifier" +ROLLBACK; +-- Correct identifier, missing file. +BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; +SET TRANSACTION SNAPSHOT 'FFF-FFF-F'; +ERROR: snapshot "FFF-FFF-F" does not exist +ROLLBACK; -- Test for successful cleanup of an aborted transaction at session exit. -- THIS MUST BE THE LAST TEST IN THIS FILE. begin; diff --git a/src/test/regress/expected/triggers.out b/src/test/regress/expected/triggers.out index e8de916dfe225..b7f0c3027e016 100644 --- a/src/test/regress/expected/triggers.out +++ b/src/test/regress/expected/triggers.out @@ -1745,6 +1745,10 @@ select * from parent; select * from child; update parent set val1 = 'b' where aid = 1; -- should fail ERROR: tuple to be updated was already modified by an operation triggered by the current command HINT: Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows. +merge into parent p using (values (1)) as v(id) on p.aid = v.id + when matched then update set val1 = 'b'; -- should fail +ERROR: tuple to be updated or deleted was already modified by an operation triggered by the current command +HINT: Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows. select * from parent; select * from child; aid | val1 | val2 | val3 | val4 | bcnt -----+------+------+------+------+------ @@ -1759,6 +1763,10 @@ select * from parent; select * from child; delete from parent where aid = 1; -- should fail ERROR: tuple to be deleted was already modified by an operation triggered by the current command HINT: Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows. +merge into parent p using (values (1)) as v(id) on p.aid = v.id + when matched then delete; -- should fail +ERROR: tuple to be updated or deleted was already modified by an operation triggered by the current command +HINT: Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows. select * from parent; select * from child; aid | val1 | val2 | val3 | val4 | bcnt -----+------+------+------+------+------ @@ -2309,6 +2317,51 @@ NOTICE: trigger zzz on parted_trig_1_1 AFTER INSERT for ROW NOTICE: trigger bbb on parted_trig_2 AFTER INSERT for ROW NOTICE: trigger zzz on parted_trig_2 AFTER INSERT for ROW drop table parted_trig; +-- Verify that the correct triggers fire for cross-partition updates +create table parted_trig (a int) partition by list (a); +create table parted_trig1 partition of parted_trig for values in (1); +create table parted_trig2 partition of parted_trig for values in (2); +insert into parted_trig values (1); +create or replace function trigger_notice() returns trigger as $$ + begin + raise notice 'trigger % on % % % for %', TG_NAME, TG_TABLE_NAME, TG_WHEN, TG_OP, TG_LEVEL; + if TG_LEVEL = 'ROW' then + if TG_OP = 'DELETE' then + return OLD; + else + return NEW; + end if; + end if; + return null; + end; + $$ language plpgsql; +create trigger parted_trig_before_stmt before insert or update or delete on parted_trig + for each statement execute procedure trigger_notice(); +create trigger parted_trig_before_row before insert or update or delete on parted_trig + for each row execute procedure trigger_notice(); +create trigger parted_trig_after_row after insert or update or delete on parted_trig + for each row execute procedure trigger_notice(); +create trigger parted_trig_after_stmt after insert or update or delete on parted_trig + for each statement execute procedure trigger_notice(); +update parted_trig set a = 2 where a = 1; +NOTICE: trigger parted_trig_before_stmt on parted_trig BEFORE UPDATE for STATEMENT +NOTICE: trigger parted_trig_before_row on parted_trig1 BEFORE UPDATE for ROW +NOTICE: trigger parted_trig_before_row on parted_trig1 BEFORE DELETE for ROW +NOTICE: trigger parted_trig_before_row on parted_trig2 BEFORE INSERT for ROW +NOTICE: trigger parted_trig_after_row on parted_trig1 AFTER DELETE for ROW +NOTICE: trigger parted_trig_after_row on parted_trig2 AFTER INSERT for ROW +NOTICE: trigger parted_trig_after_stmt on parted_trig AFTER UPDATE for STATEMENT +-- update action in merge should behave the same +merge into parted_trig using (select 1) as ss on true + when matched and a = 2 then update set a = 1; +NOTICE: trigger parted_trig_before_stmt on parted_trig BEFORE UPDATE for STATEMENT +NOTICE: trigger parted_trig_before_row on parted_trig2 BEFORE UPDATE for ROW +NOTICE: trigger parted_trig_before_row on parted_trig2 BEFORE DELETE for ROW +NOTICE: trigger parted_trig_before_row on parted_trig1 BEFORE INSERT for ROW +NOTICE: trigger parted_trig_after_row on parted_trig2 AFTER DELETE for ROW +NOTICE: trigger parted_trig_after_row on parted_trig1 AFTER INSERT for ROW +NOTICE: trigger parted_trig_after_stmt on parted_trig AFTER UPDATE for STATEMENT +drop table parted_trig; -- Verify propagation of trigger arguments to partitions create table parted_trig (a int) partition by list (a); create table parted_trig1 partition of parted_trig for values in (1); @@ -2743,11 +2796,13 @@ select tgrelid::regclass, rtrim(tgname, '0123456789') as tgname, ---------+-------------------------+------------------------+----------- child1 | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins" | O child1 | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd" | O + child1 | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_del" | O + child1 | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_upd" | O parent | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins" | O parent | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd" | O parent | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_del" | O parent | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_upd" | O -(6 rows) +(8 rows) alter table parent disable trigger all; select tgrelid::regclass, rtrim(tgname, '0123456789') as tgname, @@ -2758,11 +2813,13 @@ select tgrelid::regclass, rtrim(tgname, '0123456789') as tgname, ---------+-------------------------+------------------------+----------- child1 | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins" | D child1 | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd" | D + child1 | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_del" | D + child1 | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_upd" | D parent | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins" | D parent | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd" | D parent | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_del" | D parent | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_upd" | D -(6 rows) +(8 rows) drop table parent, child1; -- Verify that firing state propagates correctly on creation, too @@ -3021,6 +3078,55 @@ drop trigger child_row_trig on child; alter table parent attach partition child for values in ('AAA'); drop table child, parent; -- +-- Verify access of transition tables with UPDATE triggers and tuples +-- moved across partitions. +-- +create or replace function dump_update_new() returns trigger language plpgsql as +$$ + begin + raise notice 'trigger = %, new table = %', TG_NAME, + (select string_agg(new_table::text, ', ' order by a) from new_table); + return null; + end; +$$; +create or replace function dump_update_old() returns trigger language plpgsql as +$$ + begin + raise notice 'trigger = %, old table = %', TG_NAME, + (select string_agg(old_table::text, ', ' order by a) from old_table); + return null; + end; +$$; +create table trans_tab_parent (a text) partition by list (a); +create table trans_tab_child1 partition of trans_tab_parent for values in ('AAA1', 'AAA2'); +create table trans_tab_child2 partition of trans_tab_parent for values in ('BBB1', 'BBB2'); +create trigger trans_tab_parent_update_trig + after update on trans_tab_parent referencing old table as old_table + for each statement execute procedure dump_update_old(); +create trigger trans_tab_parent_insert_trig + after insert on trans_tab_parent referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger trans_tab_parent_delete_trig + after delete on trans_tab_parent referencing old table as old_table + for each statement execute procedure dump_delete(); +insert into trans_tab_parent values ('AAA1'), ('BBB1'); +NOTICE: trigger = trans_tab_parent_insert_trig, new table = (AAA1), (BBB1) +-- should not trigger access to new table when moving across partitions. +update trans_tab_parent set a = 'BBB2' where a = 'AAA1'; +NOTICE: trigger = trans_tab_parent_update_trig, old table = (AAA1) +drop trigger trans_tab_parent_update_trig on trans_tab_parent; +create trigger trans_tab_parent_update_trig + after update on trans_tab_parent referencing new table as new_table + for each statement execute procedure dump_update_new(); +-- should not trigger access to old table when moving across partitions. +update trans_tab_parent set a = 'AAA2' where a = 'BBB1'; +NOTICE: trigger = trans_tab_parent_update_trig, new table = (AAA2) +delete from trans_tab_parent; +NOTICE: trigger = trans_tab_parent_delete_trig, old table = (AAA2), (BBB2) +-- clean up +drop table trans_tab_parent, trans_tab_child1, trans_tab_child2; +drop function dump_update_new, dump_update_old; +-- -- Verify behavior of statement triggers on (non-partition) -- inheritance hierarchy with transition tables; similar to the -- partition case, except there is no rerouting on insertion and child @@ -3319,6 +3425,17 @@ select * from trig_table; drop table refd_table, trig_table; -- +-- Test that we can drop a not-yet-fired deferred trigger +-- +create table refd_table (id int primary key); +create table trig_table (fk int references refd_table initially deferred); +begin; +insert into trig_table values (1); +drop table refd_table cascade; +NOTICE: drop cascades to constraint trig_table_fk_fkey on table trig_table +commit; +drop table trig_table; +-- -- self-referential FKs are even more fun -- create table self_ref (a int primary key, diff --git a/src/test/regress/expected/tsdicts.out b/src/test/regress/expected/tsdicts.out index c80429314299f..0bbf2ff4ca2ce 100644 --- a/src/test/regress/expected/tsdicts.out +++ b/src/test/regress/expected/tsdicts.out @@ -687,3 +687,37 @@ CREATE TEXT SEARCH DICTIONARY tsdict_case "AffFile" = ispell_sample ); ERROR: unrecognized Ispell parameter: "DictFile" +-- Test grammar for configurations +CREATE TEXT SEARCH CONFIGURATION dummy_tst (COPY=english); +-- Overridden mapping change with duplicated tokens. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + ALTER MAPPING FOR word, word WITH ispell; +-- Not a token supported by the configuration's parser, fails. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING FOR not_a_token, not_a_token; +ERROR: token type "not_a_token" does not exist +-- Not a token supported by the configuration's parser, fails even +-- with IF EXISTS. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING IF EXISTS FOR not_a_token, not_a_token; +ERROR: token type "not_a_token" does not exist +-- Token supported by the configuration's parser, succeeds. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING FOR word, word; +-- No mapping for token supported by the configuration's parser, fails. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING FOR word; +ERROR: mapping for token type "word" does not exist +-- Token supported by the configuration's parser, cannot be found, +-- succeeds with IF EXISTS. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING IF EXISTS FOR word, word; +NOTICE: mapping for token type "word" does not exist, skipping +-- Re-add mapping, with duplicated tokens supported by the parser. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + ADD MAPPING FOR word, word WITH ispell; +-- Not a token supported by the configuration's parser, fails. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + ADD MAPPING FOR not_a_token WITH ispell; +ERROR: token type "not_a_token" does not exist +DROP TEXT SEARCH CONFIGURATION dummy_tst; diff --git a/src/test/regress/expected/tsearch.out b/src/test/regress/expected/tsearch.out index cfa391ac5127c..9fad6c8b04b1e 100644 --- a/src/test/regress/expected/tsearch.out +++ b/src/test/regress/expected/tsearch.out @@ -2676,12 +2676,19 @@ select websearch_to_tsquery('simple', 'abc <-> def'); 'abc' & 'def' (1 row) +-- parens are ignored, too select websearch_to_tsquery('simple', 'abc (pg or class)'); websearch_to_tsquery ------------------------ 'abc' & 'pg' | 'class' (1 row) +select websearch_to_tsquery('simple', '(foo bar) or (ding dong)'); + websearch_to_tsquery +--------------------------------- + 'foo' & 'bar' | 'ding' & 'dong' +(1 row) + -- NOT is ignored in quotes select websearch_to_tsquery('english', 'My brand new smartphone'); websearch_to_tsquery diff --git a/src/test/regress/expected/tuplesort.out b/src/test/regress/expected/tuplesort.out index a2efa179fc191..6dd97e7427ae1 100644 --- a/src/test/regress/expected/tuplesort.out +++ b/src/test/regress/expected/tuplesort.out @@ -343,6 +343,19 @@ ORDER BY ctid DESC LIMIT 5; (5 rows) ROLLBACK; +---- +-- test sorting of large datums VALUES +---- +-- Ensure the order is correct and values look intact +SELECT LEFT(a,10),b FROM + (VALUES(REPEAT('a', 512 * 1024),1),(REPEAT('b', 512 * 1024),2)) v(a,b) +ORDER BY v.a DESC; + left | b +------------+--- + bbbbbbbbbb | 2 + aaaaaaaaaa | 1 +(2 rows) + ---- -- test forward and backward scans for in-memory and disk based tuplesort ---- @@ -401,7 +414,7 @@ FETCH NEXT FROM c; 00000000-0000-0000-0000-000000000000 (1 row) --- scroll beyond end end +-- scroll beyond end FETCH LAST FROM c; noabort_decreasing -------------------- @@ -498,7 +511,7 @@ FETCH NEXT FROM c; 00000000-0000-0000-0000-000000000000 (1 row) --- scroll beyond end end +-- scroll beyond end FETCH LAST FROM c; noabort_decreasing -------------------- diff --git a/src/test/regress/expected/type_sanity.out b/src/test/regress/expected/type_sanity.out index a640cfc47694b..88d8f6c32d665 100644 --- a/src/test/regress/expected/type_sanity.out +++ b/src/test/regress/expected/type_sanity.out @@ -500,35 +500,37 @@ ORDER BY 1; -- Look for illegal values in pg_class fields SELECT c1.oid, c1.relname FROM pg_class as c1 -WHERE relkind NOT IN ('r', 'i', 'S', 't', 'v', 'm', 'c', 'f', 'p') OR +WHERE relkind NOT IN ('r', 'i', 'S', 't', 'v', 'm', 'c', 'f', 'p', 'I') OR relpersistence NOT IN ('p', 'u', 't') OR relreplident NOT IN ('d', 'n', 'f', 'i'); oid | relname -----+--------- (0 rows) --- All tables and indexes should have an access method. +-- All tables, indexes, partitioned indexes and matviews should have an +-- access method. SELECT c1.oid, c1.relname FROM pg_class as c1 -WHERE c1.relkind NOT IN ('S', 'v', 'f', 'c') and +WHERE c1.relkind NOT IN ('S', 'v', 'f', 'c', 'p') and c1.relam = 0; oid | relname -----+--------- (0 rows) --- Conversely, sequences, views, types shouldn't have them +-- Conversely, sequences, views, foreign tables, types and partitioned +-- tables shouldn't have them. SELECT c1.oid, c1.relname FROM pg_class as c1 -WHERE c1.relkind IN ('S', 'v', 'f', 'c') and +WHERE c1.relkind IN ('S', 'v', 'f', 'c', 'p') and c1.relam != 0; oid | relname -----+--------- (0 rows) --- Indexes should have AMs of type 'i' +-- Indexes and partitioned indexes should have AMs of type 'i'. SELECT pc.oid, pc.relname, pa.amname, pa.amtype FROM pg_class as pc JOIN pg_am AS pa ON (pc.relam = pa.oid) -WHERE pc.relkind IN ('i') and +WHERE pc.relkind IN ('i', 'I') and pa.amtype != 'i'; oid | relname | amname | amtype -----+---------+--------+-------- diff --git a/src/test/regress/expected/unicode.out b/src/test/regress/expected/unicode.out index f2713a232688b..1e06de2264912 100644 --- a/src/test/regress/expected/unicode.out +++ b/src/test/regress/expected/unicode.out @@ -8,6 +8,24 @@ SELECT U&'\0061\0308bc' <> U&'\00E4bc' COLLATE "C" AS sanity_check; t (1 row) +SELECT unicode_version() IS NOT NULL; + ?column? +---------- + t +(1 row) + +SELECT unicode_assigned(U&'abc'); + unicode_assigned +------------------ + t +(1 row) + +SELECT unicode_assigned(U&'abc\+10FFFF'); + unicode_assigned +------------------ + f +(1 row) + SELECT normalize(''); normalize ----------- diff --git a/src/test/regress/expected/union.out b/src/test/regress/expected/union.out index e2613d6777e38..0fd0e1c38b3d7 100644 --- a/src/test/regress/expected/union.out +++ b/src/test/regress/expected/union.out @@ -412,16 +412,17 @@ set enable_hashagg to off; explain (costs off) select count(*) from ( select unique1 from tenk1 union select fivethous from tenk1 ) ss; - QUERY PLAN ----------------------------------------------------------------------- + QUERY PLAN +---------------------------------------------------------------- Aggregate -> Unique - -> Sort + -> Merge Append Sort Key: tenk1.unique1 - -> Append - -> Index Only Scan using tenk1_unique1 on tenk1 + -> Index Only Scan using tenk1_unique1 on tenk1 + -> Sort + Sort Key: tenk1_1.fivethous -> Seq Scan on tenk1 tenk1_1 -(7 rows) +(8 rows) select count(*) from ( select unique1 from tenk1 union select fivethous from tenk1 ) ss; @@ -479,7 +480,7 @@ reset enable_hashagg; -- non-hashable type set enable_hashagg to on; explain (costs off) -select x from (values (100::money), (200::money)) _(x) union select x from (values (100::money), (300::money)) _(x); +select x from (values ('11'::varbit), ('10'::varbit)) _(x) union select x from (values ('11'::varbit), ('10'::varbit)) _(x); QUERY PLAN ----------------------------------------------- Unique @@ -492,7 +493,7 @@ select x from (values (100::money), (200::money)) _(x) union select x from (valu set enable_hashagg to off; explain (costs off) -select x from (values (100::money), (200::money)) _(x) union select x from (values (100::money), (300::money)) _(x); +select x from (values ('11'::varbit), ('10'::varbit)) _(x) union select x from (values ('11'::varbit), ('10'::varbit)) _(x); QUERY PLAN ----------------------------------------------- Unique @@ -563,7 +564,7 @@ select x from (values (array[1, 2]), (array[1, 3])) _(x) except select x from (v -- non-hashable type explain (costs off) -select x from (values (array[100::money]), (array[200::money])) _(x) union select x from (values (array[100::money]), (array[300::money])) _(x); +select x from (values (array['10'::varbit]), (array['11'::varbit])) _(x) union select x from (values (array['10'::varbit]), (array['01'::varbit])) _(x); QUERY PLAN ----------------------------------------------- Unique @@ -574,12 +575,12 @@ select x from (values (array[100::money]), (array[200::money])) _(x) union selec -> Values Scan on "*VALUES*_1" (6 rows) -select x from (values (array[100::money]), (array[200::money])) _(x) union select x from (values (array[100::money]), (array[300::money])) _(x); - x ------------ - {$100.00} - {$200.00} - {$300.00} +select x from (values (array['10'::varbit]), (array['11'::varbit])) _(x) union select x from (values (array['10'::varbit]), (array['01'::varbit])) _(x); + x +------ + {01} + {10} + {11} (3 rows) set enable_hashagg to off; @@ -710,7 +711,7 @@ select x from (values (row(1, 2)), (row(1, 3))) _(x) except select x from (value -- With an anonymous row type, the typcache does not report that the -- type is hashable. (Otherwise, this would fail at execution time.) explain (costs off) -select x from (values (row(100::money)), (row(200::money))) _(x) union select x from (values (row(100::money)), (row(300::money))) _(x); +select x from (values (row('10'::varbit)), (row('11'::varbit))) _(x) union select x from (values (row('10'::varbit)), (row('01'::varbit))) _(x); QUERY PLAN ----------------------------------------------- Unique @@ -721,19 +722,19 @@ select x from (values (row(100::money)), (row(200::money))) _(x) union select x -> Values Scan on "*VALUES*_1" (6 rows) -select x from (values (row(100::money)), (row(200::money))) _(x) union select x from (values (row(100::money)), (row(300::money))) _(x); - x ------------ - ($100.00) - ($200.00) - ($300.00) +select x from (values (row('10'::varbit)), (row('11'::varbit))) _(x) union select x from (values (row('10'::varbit)), (row('01'::varbit))) _(x); + x +------ + (01) + (10) + (11) (3 rows) -- With a defined row type, the typcache can inspect the type's fields -- for hashability. -create type ct1 as (f1 money); +create type ct1 as (f1 varbit); explain (costs off) -select x from (values (row(100::money)::ct1), (row(200::money)::ct1)) _(x) union select x from (values (row(100::money)::ct1), (row(300::money)::ct1)) _(x); +select x from (values (row('10'::varbit)::ct1), (row('11'::varbit)::ct1)) _(x) union select x from (values (row('10'::varbit)::ct1), (row('01'::varbit)::ct1)) _(x); QUERY PLAN ----------------------------------------------- Unique @@ -744,12 +745,12 @@ select x from (values (row(100::money)::ct1), (row(200::money)::ct1)) _(x) union -> Values Scan on "*VALUES*_1" (6 rows) -select x from (values (row(100::money)::ct1), (row(200::money)::ct1)) _(x) union select x from (values (row(100::money)::ct1), (row(300::money)::ct1)) _(x); - x ------------ - ($100.00) - ($200.00) - ($300.00) +select x from (values (row('10'::varbit)::ct1), (row('11'::varbit)::ct1)) _(x) union select x from (values (row('10'::varbit)::ct1), (row('01'::varbit)::ct1)) _(x); + x +------ + (01) + (10) + (11) (3 rows) drop type ct1; @@ -814,6 +815,19 @@ select x from (values (row(1, 2)), (row(1, 3))) _(x) except select x from (value (1,3) (1 row) +-- non-sortable type +-- Ensure we get a HashAggregate plan. Keep enable_hashagg=off to ensure +-- there's no chance of a sort. +explain (costs off) select '123'::xid union select '123'::xid; + QUERY PLAN +--------------------------- + HashAggregate + Group Key: ('123'::xid) + -> Append + -> Result + -> Result +(5 rows) + reset enable_hashagg; -- -- Mixed types @@ -950,16 +964,9 @@ select except select; -- check hashed implementation set enable_hashagg = true; set enable_sort = false; -explain (costs off) -select from generate_series(1,5) union select from generate_series(1,3); - QUERY PLAN ----------------------------------------------------------------- - HashAggregate - -> Append - -> Function Scan on generate_series - -> Function Scan on generate_series generate_series_1 -(4 rows) - +-- We've no way to check hashed UNION as the empty pathkeys in the Append are +-- fine to make use of Unique, which is cheaper than HashAggregate and we've +-- no means to disable Unique. explain (costs off) select from generate_series(1,5) intersect select from generate_series(1,3); QUERY PLAN @@ -972,10 +979,6 @@ select from generate_series(1,5) intersect select from generate_series(1,3); -> Function Scan on generate_series generate_series_1 (6 rows) -select from generate_series(1,5) union select from generate_series(1,3); --- -(1 row) - select from generate_series(1,5) union all select from generate_series(1,3); -- (8 rows) @@ -1045,6 +1048,20 @@ select from generate_series(1,5) except all select from generate_series(1,3); -- (2 rows) +-- Try a variation of the above but with a CTE which contains a column, again +-- with an empty final select list. +-- Ensure we get the expected 1 row with 0 columns +with cte as materialized (select s from generate_series(1,5) s) +select from cte union select from cte; +-- +(1 row) + +-- Ensure we get the same result as the above. +with cte as not materialized (select s from generate_series(1,5) s) +select from cte union select from cte; +-- +(1 row) + reset enable_hashagg; reset enable_sort; -- @@ -1081,6 +1098,7 @@ INSERT INTO t2 VALUES ('ab'), ('xy'); set enable_seqscan = off; set enable_indexscan = on; set enable_bitmapscan = off; +set enable_sort = off; explain (costs off) SELECT * FROM (SELECT a || b AS ab FROM t1 @@ -1162,6 +1180,7 @@ explain (costs off) reset enable_seqscan; reset enable_indexscan; reset enable_bitmapscan; +reset enable_sort; -- This simpler variant of the above test has been observed to fail differently create table events (event_id int primary key); create table other_events (event_id int primary key); @@ -1432,3 +1451,41 @@ where (x = 0) or (q1 >= q2 and q1 <= q2); 4567890123456789 | 4567890123456789 | 1 (6 rows) +-- +-- Test the planner's ability to produce cheap startup plans with Append nodes +-- +-- Ensure we get a Nested Loop join between tenk1 and tenk2 +explain (costs off) +select t1.unique1 from tenk1 t1 +inner join tenk2 t2 on t1.tenthous = t2.tenthous and t2.thousand = 0 + union all +(values(1)) limit 1; + QUERY PLAN +-------------------------------------------------------- + Limit + -> Append + -> Nested Loop + Join Filter: (t1.tenthous = t2.tenthous) + -> Seq Scan on tenk1 t1 + -> Materialize + -> Seq Scan on tenk2 t2 + Filter: (thousand = 0) + -> Result +(9 rows) + +-- Ensure there is no problem if cheapest_startup_path is NULL +explain (costs off) +select * from tenk1 t1 +left join lateral + (select t1.tenthous from tenk2 t2 union all (values(1))) +on true limit 1; + QUERY PLAN +------------------------------------------------------------------- + Limit + -> Nested Loop Left Join + -> Seq Scan on tenk1 t1 + -> Append + -> Index Only Scan using tenk2_hundred on tenk2 t2 + -> Result +(6 rows) + diff --git a/src/test/regress/expected/updatable_views.out b/src/test/regress/expected/updatable_views.out index 1950e6f281f5f..442b55120c8a9 100644 --- a/src/test/regress/expected/updatable_views.out +++ b/src/test/regress/expected/updatable_views.out @@ -184,6 +184,27 @@ INSERT INTO ro_view13 VALUES (3, 'Row 3'); ERROR: cannot insert into view "ro_view13" DETAIL: Views that do not select from a single table or view are not automatically updatable. HINT: To enable inserting into the view, provide an INSTEAD OF INSERT trigger or an unconditional ON INSERT DO INSTEAD rule. +MERGE INTO ro_view13 AS t USING (VALUES (1, 'Row 1')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN DELETE; +ERROR: cannot delete from view "ro_view13" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE trigger. +MERGE INTO ro_view13 AS t USING (VALUES (2, 'Row 2')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = v.b; +ERROR: cannot update view "ro_view13" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable updating the view using MERGE, provide an INSTEAD OF UPDATE trigger. +MERGE INTO ro_view13 AS t USING (VALUES (3, 'Row 3')) AS v(a,b) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a, v.b); +ERROR: cannot insert into view "ro_view13" +DETAIL: Views that do not select from a single table or view are not automatically updatable. +HINT: To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT trigger. +MERGE INTO ro_view13 AS t USING (VALUES (2, 'Row 2')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN DO NOTHING + WHEN NOT MATCHED THEN DO NOTHING; -- should be OK to do nothing +MERGE INTO ro_view13 AS t USING (VALUES (3, 'Row 3')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN DO NOTHING + WHEN NOT MATCHED THEN DO NOTHING; -- should be OK to do nothing -- Partially updatable view INSERT INTO rw_view14 VALUES (null, 3, 'Row 3'); -- should fail ERROR: cannot insert into column "ctid" of view "rw_view14" @@ -205,6 +226,41 @@ SELECT * FROM base_tbl; (6 rows) DELETE FROM rw_view14 WHERE a=3; -- should be OK +MERGE INTO rw_view14 AS t + USING (VALUES (2, 'Merged row 2'), (3, 'Merged row 3')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = v.b -- should be OK, except... + WHEN NOT MATCHED THEN INSERT VALUES (null, v.a, v.b); -- should fail +ERROR: cannot merge into column "ctid" of view "rw_view14" +DETAIL: View columns that refer to system columns are not updatable. +MERGE INTO rw_view14 AS t + USING (VALUES (2, 'Merged row 2'), (3, 'Merged row 3')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = v.b -- should be OK + WHEN NOT MATCHED THEN INSERT (a,b) VALUES (v.a, v.b); -- should be OK +SELECT * FROM base_tbl ORDER BY a; + a | b +----+-------------- + -2 | Row -2 + -1 | Row -1 + 0 | Row 0 + 1 | Row 1 + 2 | Merged row 2 + 3 | Merged row 3 +(6 rows) + +MERGE INTO rw_view14 AS t + USING (VALUES (2, 'Row 2'), (3, 'Row 3')) AS v(a,b) ON t.a = v.a + WHEN MATCHED AND t.a = 2 THEN UPDATE SET b = v.b -- should be OK + WHEN MATCHED AND t.a = 3 THEN DELETE; -- should be OK +SELECT * FROM base_tbl ORDER BY a; + a | b +----+-------- + -2 | Row -2 + -1 | Row -1 + 0 | Row 0 + 1 | Row 1 + 2 | Row 2 +(5 rows) + -- Partially updatable view INSERT INTO rw_view15 VALUES (3, 'ROW 3'); -- should fail ERROR: cannot insert into column "upper" of view "rw_view15" @@ -322,6 +378,8 @@ DELETE FROM ro_view18; ERROR: cannot delete from view "ro_view18" DETAIL: Views that do not select from a single table or view are not automatically updatable. HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +MERGE INTO ro_view18 AS t USING (VALUES (1, 'Row 1')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN DO NOTHING; -- should be OK to do nothing UPDATE ro_view19 SET last_value=1000; ERROR: cannot update view "ro_view19" DETAIL: Views that do not select from a single table or view are not automatically updatable. @@ -351,6 +409,10 @@ DELETE FROM rw_view16 WHERE a=2; -- should fail ERROR: cannot delete from view "rw_view16" DETAIL: Views with conditional DO INSTEAD rules are not automatically updatable. HINT: To enable deleting from the view, provide an INSTEAD OF DELETE trigger or an unconditional ON DELETE DO INSTEAD rule. +MERGE INTO rw_view16 AS t USING (VALUES (3, 'Row 3')) AS v(a,b) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a, v.b); -- should fail +ERROR: cannot execute MERGE on relation "rw_view16" +DETAIL: MERGE is not supported for relations with rules. DROP TABLE base_tbl CASCADE; NOTICE: drop cascades to 16 other objects DETAIL: drop cascades to view ro_view1 @@ -417,6 +479,57 @@ SELECT * FROM base_tbl; 5 | Unspecified (6 rows) +MERGE INTO rw_view1 t + USING (VALUES (0, 'ROW 0'), (1, 'ROW 1'), + (2, 'ROW 2'), (3, 'ROW 3')) AS v(a,b) ON t.a = v.a + WHEN MATCHED AND t.a <= 1 THEN UPDATE SET b = v.b + WHEN MATCHED THEN DELETE + WHEN NOT MATCHED AND a > 0 THEN INSERT (a) VALUES (v.a) + RETURNING merge_action(), v.*, t.*; + merge_action | a | b | a | b +--------------+---+-------+---+------------- + UPDATE | 1 | ROW 1 | 1 | ROW 1 + DELETE | 3 | ROW 3 | 3 | Row 3 + INSERT | 2 | ROW 2 | 2 | Unspecified +(3 rows) + +SELECT * FROM base_tbl ORDER BY a; + a | b +----+------------- + -2 | Row -2 + -1 | Row -1 + 0 | Row 0 + 1 | ROW 1 + 2 | Unspecified + 5 | Unspecified +(6 rows) + +MERGE INTO rw_view1 t + USING (VALUES (0, 'R0'), (1, 'R1'), + (2, 'R2'), (3, 'R3')) AS v(a,b) ON t.a = v.a + WHEN MATCHED AND t.a <= 1 THEN UPDATE SET b = v.b + WHEN MATCHED THEN DELETE + WHEN NOT MATCHED BY SOURCE THEN DELETE + WHEN NOT MATCHED AND a > 0 THEN INSERT (a) VALUES (v.a) + RETURNING merge_action(), v.*, t.*; + merge_action | a | b | a | b +--------------+---+----+---+------------- + UPDATE | 1 | R1 | 1 | R1 + DELETE | | | 5 | Unspecified + DELETE | 2 | R2 | 2 | Unspecified + INSERT | 3 | R3 | 3 | Unspecified +(4 rows) + +SELECT * FROM base_tbl ORDER BY a; + a | b +----+------------- + -2 | Row -2 + -1 | Row -1 + 0 | Row 0 + 1 | R1 + 3 | Unspecified +(5 rows) + EXPLAIN (costs off) UPDATE rw_view1 SET a=6 WHERE a=5; QUERY PLAN -------------------------------------------------- @@ -433,6 +546,67 @@ EXPLAIN (costs off) DELETE FROM rw_view1 WHERE a=5; Index Cond: ((a > 0) AND (a = 5)) (3 rows) +EXPLAIN (costs off) +MERGE INTO rw_view1 t USING (VALUES (5, 'X')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN DELETE; + QUERY PLAN +-------------------------------------------------- + Merge on base_tbl + -> Index Scan using base_tbl_pkey on base_tbl + Index Cond: ((a > 0) AND (a = 5)) +(3 rows) + +EXPLAIN (costs off) +MERGE INTO rw_view1 t + USING (SELECT * FROM generate_series(1,5)) AS s(a) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = 'Updated'; + QUERY PLAN +------------------------------------------------------------------- + Merge on base_tbl + -> Hash Join + Hash Cond: (base_tbl.a = generate_series.generate_series) + -> Bitmap Heap Scan on base_tbl + Recheck Cond: (a > 0) + -> Bitmap Index Scan on base_tbl_pkey + Index Cond: (a > 0) + -> Hash + -> Function Scan on generate_series +(9 rows) + +EXPLAIN (costs off) +MERGE INTO rw_view1 t + USING (SELECT * FROM generate_series(1,5)) AS s(a) ON t.a = s.a + WHEN NOT MATCHED BY SOURCE THEN DELETE; + QUERY PLAN +------------------------------------------------------------------- + Merge on base_tbl + -> Hash Left Join + Hash Cond: (base_tbl.a = generate_series.generate_series) + -> Bitmap Heap Scan on base_tbl + Recheck Cond: (a > 0) + -> Bitmap Index Scan on base_tbl_pkey + Index Cond: (a > 0) + -> Hash + -> Function Scan on generate_series +(9 rows) + +EXPLAIN (costs off) +MERGE INTO rw_view1 t + USING (SELECT * FROM generate_series(1,5)) AS s(a) ON t.a = s.a + WHEN NOT MATCHED THEN INSERT (a) VALUES (s.a); + QUERY PLAN +------------------------------------------------------------------- + Merge on base_tbl + -> Hash Right Join + Hash Cond: (base_tbl.a = generate_series.generate_series) + -> Bitmap Heap Scan on base_tbl + Recheck Cond: (a > 0) + -> Bitmap Index Scan on base_tbl_pkey + Index Cond: (a > 0) + -> Hash + -> Function Scan on generate_series +(9 rows) + -- it's still updatable if we add a DO ALSO rule CREATE TABLE base_tbl_hist(ts timestamptz default now(), a int, b text); CREATE RULE base_tbl_log AS ON INSERT TO rw_view1 DO ALSO @@ -509,6 +683,50 @@ SELECT * FROM rw_view2; 4 | Row 4 (3 rows) +MERGE INTO rw_view2 t + USING (VALUES (3, 'R3'), (4, 'R4'), (5, 'R5')) AS v(a,b) ON aaa = v.a + WHEN MATCHED AND aaa = 3 THEN DELETE + WHEN MATCHED THEN UPDATE SET bbb = v.b + WHEN NOT MATCHED THEN INSERT (aaa) VALUES (v.a) + RETURNING merge_action(), v.*, t.*; + merge_action | a | b | aaa | bbb +--------------+---+----+-----+------------- + DELETE | 3 | R3 | 3 | Row 3 + UPDATE | 4 | R4 | 4 | R4 + INSERT | 5 | R5 | 5 | Unspecified +(3 rows) + +SELECT * FROM rw_view2 ORDER BY aaa; + aaa | bbb +-----+------------- + 1 | Row 1 + 4 | R4 + 5 | Unspecified +(3 rows) + +MERGE INTO rw_view2 t + USING (VALUES (4, 'r4'), (5, 'r5'), (6, 'r6')) AS v(a,b) ON aaa = v.a + WHEN MATCHED AND aaa = 4 THEN DELETE + WHEN MATCHED THEN UPDATE SET bbb = v.b + WHEN NOT MATCHED THEN INSERT (aaa) VALUES (v.a) + WHEN NOT MATCHED BY SOURCE THEN UPDATE SET bbb = 'Not matched by source' + RETURNING merge_action(), v.*, t.*; + merge_action | a | b | aaa | bbb +--------------+---+----+-----+----------------------- + UPDATE | | | 1 | Not matched by source + DELETE | 4 | r4 | 4 | R4 + UPDATE | 5 | r5 | 5 | r5 + INSERT | 6 | r6 | 6 | Unspecified +(4 rows) + +SELECT * FROM rw_view2 ORDER BY aaa; + aaa | bbb +-----+----------------------- + 1 | Not matched by source + 5 | r5 + 6 | Unspecified +(3 rows) + EXPLAIN (costs off) UPDATE rw_view2 SET aaa=5 WHERE aaa=4; QUERY PLAN -------------------------------------------------------- @@ -701,6 +919,10 @@ SELECT * FROM rw_view2; 2 | Row 2 (2 rows) +MERGE INTO rw_view2 t USING (VALUES (3, 'Row 3')) AS v(a,b) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a, v.b); -- should fail +ERROR: cannot execute MERGE on relation "rw_view1" +DETAIL: MERGE is not supported for relations with rules. EXPLAIN (costs off) UPDATE rw_view2 SET a=3 WHERE a=2; QUERY PLAN ---------------------------------------------------------------- @@ -932,6 +1154,53 @@ SELECT * FROM rw_view2; 2 | Row 2 (2 rows) +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED AND t.a <= 1 THEN DELETE + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b) + RETURNING merge_action(), s.*, t.*; + merge_action | a | b | a | b +--------------+---+----+---+------- + DELETE | 1 | R1 | 1 | Row 1 + UPDATE | 2 | R2 | 2 | R2 + INSERT | 3 | R3 | 3 | R3 +(3 rows) + +SELECT * FROM base_tbl ORDER BY a; + a | b +----+-------- + -2 | Row -2 + -1 | Row -1 + 0 | Row 0 + 2 | R2 + 3 | R3 +(5 rows) + +MERGE INTO rw_view2 t + USING (SELECT x, 'r'||x FROM generate_series(0,2) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b) + WHEN NOT MATCHED BY SOURCE THEN UPDATE SET b = 'Not matched by source' + RETURNING merge_action(), s.*, t.*; + merge_action | a | b | a | b +--------------+---+----+---+----------------------- + UPDATE | 2 | r2 | 2 | r2 + UPDATE | | | 3 | Not matched by source + INSERT | 1 | r1 | 1 | r1 +(3 rows) + +SELECT * FROM base_tbl ORDER BY a; + a | b +----+----------------------- + -2 | Row -2 + -1 | Row -1 + 0 | Row 0 + 1 | r1 + 2 | r2 + 3 | Not matched by source +(6 rows) + EXPLAIN (costs off) UPDATE rw_view2 SET a=3 WHERE a=2; QUERY PLAN ---------------------------------------------------------- @@ -956,6 +1225,76 @@ EXPLAIN (costs off) DELETE FROM rw_view2 WHERE a=2; Index Cond: (a > 0) (7 rows) +EXPLAIN (costs off) +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED AND t.a <= 1 THEN DELETE + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b); + QUERY PLAN +------------------------------------------------------------ + Merge on rw_view1 rw_view1_1 + -> Hash Right Join + Hash Cond: (rw_view1.a = x.x) + -> Subquery Scan on rw_view1 + Filter: (rw_view1.a < 10) + -> Bitmap Heap Scan on base_tbl + Recheck Cond: (a > 0) + -> Bitmap Index Scan on base_tbl_pkey + Index Cond: (a > 0) + -> Hash + -> Function Scan on generate_series x +(11 rows) + +-- MERGE with incomplete set of INSTEAD OF triggers +DROP TRIGGER rw_view1_del_trig ON rw_view1; +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED AND t.a <= 1 THEN DELETE + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b); -- should fail +ERROR: cannot delete from view "rw_view1" +DETAIL: Views containing LIMIT or OFFSET are not automatically updatable. +HINT: To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE trigger. +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b); -- ok +DROP TRIGGER rw_view1_ins_trig ON rw_view1; +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b); -- should fail +ERROR: cannot insert into view "rw_view1" +DETAIL: Views containing LIMIT or OFFSET are not automatically updatable. +HINT: To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT trigger. +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = s.b; -- ok +-- MERGE with INSTEAD OF triggers on auto-updatable view +CREATE TRIGGER rw_view2_upd_trig INSTEAD OF UPDATE ON rw_view2 + FOR EACH ROW EXECUTE PROCEDURE rw_view1_trig_fn(); +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b); -- should fail +ERROR: cannot merge into view "rw_view2" +DETAIL: MERGE is not supported for views with INSTEAD OF triggers for some actions but not all. +HINT: To enable merging into the view, either provide a full set of INSTEAD OF triggers or drop the existing INSTEAD OF triggers. +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = s.b; -- ok +SELECT * FROM base_tbl ORDER BY a; + a | b +----+-------- + -2 | Row -2 + -1 | Row -1 + 0 | Row 0 + 1 | R1 + 2 | R2 + 3 | R3 +(6 rows) + DROP TABLE base_tbl CASCADE; NOTICE: drop cascades to 2 other objects DETAIL: drop cascades to view rw_view1 @@ -1041,6 +1380,14 @@ INSERT INTO rw_view1 VALUES ('Row 3', 3.0, 3); -- not allowed ERROR: permission denied for view rw_view1 INSERT INTO rw_view2 VALUES ('Row 3', 3.0, 3); -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view1 t + USING (VALUES ('Row 3', 3.0, 3)) AS v(b,c,a) ON t.aa = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.b, v.c, v.a); -- not allowed +ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t + USING (VALUES ('Row 3', 3.0, 3)) AS v(b,c,a) ON t.aa = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.b, v.c, v.a); -- not allowed +ERROR: permission denied for table base_tbl UPDATE base_tbl SET a=a, c=c; -- ok UPDATE base_tbl SET b=b; -- not allowed ERROR: permission denied for table base_tbl @@ -1050,6 +1397,16 @@ ERROR: permission denied for view rw_view1 UPDATE rw_view2 SET aa=aa, cc=cc; -- ok UPDATE rw_view2 SET bb=bb; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET bb = bb, cc = cc; -- ok +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET aa = aa; -- not allowed +ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET aa = aa, cc = cc; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET bb = bb; -- not allowed +ERROR: permission denied for table base_tbl DELETE FROM base_tbl; -- not allowed ERROR: permission denied for table base_tbl DELETE FROM rw_view1; -- not allowed @@ -1069,6 +1426,11 @@ DELETE FROM base_tbl WHERE a=1; -- ok DELETE FROM rw_view1 WHERE aa=2; -- not allowed ERROR: permission denied for view rw_view1 DELETE FROM rw_view2 WHERE aa=2; -- ok +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED AND bb = 'xxx' THEN DELETE; -- not allowed +ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED AND bb = 'xxx' THEN DELETE; -- ok SELECT * FROM base_tbl; a | b | c ---+-------+--- @@ -1092,6 +1454,11 @@ ERROR: permission denied for table base_tbl DELETE FROM rw_view1 WHERE aa=3; -- ok DELETE FROM rw_view2 WHERE aa=4; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED AND bb = 'xxx' THEN DELETE; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED AND bb = 'xxx' THEN DELETE; -- not allowed +ERROR: permission denied for table base_tbl SELECT * FROM base_tbl; a | b | c ---+-------+--- @@ -1115,6 +1482,9 @@ SELECT * FROM rw_view1 FOR UPDATE; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view1 SET b = 'foo' WHERE a = 1; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed +ERROR: permission denied for table base_tbl SET SESSION AUTHORIZATION regress_view_user2; CREATE VIEW rw_view2 AS SELECT * FROM rw_view1; SELECT * FROM rw_view2; -- not allowed @@ -1123,6 +1493,9 @@ SELECT * FROM rw_view2 FOR UPDATE; -- not allowed ERROR: permission denied for view rw_view1 UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed +ERROR: permission denied for view rw_view1 RESET SESSION AUTHORIZATION; GRANT SELECT ON base_tbl TO regress_view_user1; SET SESSION AUTHORIZATION regress_view_user1; @@ -1136,6 +1509,9 @@ SELECT * FROM rw_view1 FOR UPDATE; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view1 SET b = 'foo' WHERE a = 1; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed +ERROR: permission denied for table base_tbl SET SESSION AUTHORIZATION regress_view_user2; SELECT * FROM rw_view2; -- not allowed ERROR: permission denied for view rw_view1 @@ -1143,6 +1519,9 @@ SELECT * FROM rw_view2 FOR UPDATE; -- not allowed ERROR: permission denied for view rw_view1 UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed +ERROR: permission denied for view rw_view1 SET SESSION AUTHORIZATION regress_view_user1; GRANT SELECT ON rw_view1 TO regress_view_user2; SET SESSION AUTHORIZATION regress_view_user2; @@ -1156,6 +1535,9 @@ SELECT * FROM rw_view2 FOR UPDATE; -- not allowed ERROR: permission denied for view rw_view1 UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed +ERROR: permission denied for view rw_view1 RESET SESSION AUTHORIZATION; GRANT UPDATE ON base_tbl TO regress_view_user1; SET SESSION AUTHORIZATION regress_view_user1; @@ -1172,6 +1554,8 @@ SELECT * FROM rw_view1 FOR UPDATE; (1 row) UPDATE rw_view1 SET b = 'foo' WHERE a = 1; +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; SET SESSION AUTHORIZATION regress_view_user2; SELECT * FROM rw_view2; a | b | c @@ -1183,6 +1567,9 @@ SELECT * FROM rw_view2 FOR UPDATE; -- not allowed ERROR: permission denied for view rw_view1 UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'bar'; -- not allowed +ERROR: permission denied for view rw_view1 SET SESSION AUTHORIZATION regress_view_user1; GRANT UPDATE ON rw_view1 TO regress_view_user2; SET SESSION AUTHORIZATION regress_view_user2; @@ -1199,30 +1586,38 @@ SELECT * FROM rw_view2 FOR UPDATE; (1 row) UPDATE rw_view2 SET b = 'bar' WHERE a = 1; +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'fud'; RESET SESSION AUTHORIZATION; REVOKE UPDATE ON base_tbl FROM regress_view_user1; SET SESSION AUTHORIZATION regress_view_user1; SELECT * FROM rw_view1; a | b | c ---+-----+--- - 1 | bar | 1 + 1 | fud | 1 (1 row) SELECT * FROM rw_view1 FOR UPDATE; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view1 SET b = 'foo' WHERE a = 1; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed +ERROR: permission denied for table base_tbl SET SESSION AUTHORIZATION regress_view_user2; SELECT * FROM rw_view2; a | b | c ---+-----+--- - 1 | bar | 1 + 1 | fud | 1 (1 row) SELECT * FROM rw_view2 FOR UPDATE; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed +ERROR: permission denied for table base_tbl RESET SESSION AUTHORIZATION; DROP TABLE base_tbl CASCADE; NOTICE: drop cascades to 2 other objects @@ -1250,10 +1645,16 @@ UPDATE base_tbl SET a=a; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view1 SET bb=bb, cc=cc; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET bb = bb; -- not allowed +ERROR: permission denied for table base_tbl DELETE FROM base_tbl; -- not allowed ERROR: permission denied for table base_tbl DELETE FROM rw_view1; -- not allowed ERROR: permission denied for view rw_view1 +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN DELETE; -- not allowed +ERROR: permission denied for view rw_view1 SET SESSION AUTHORIZATION regress_view_user1; GRANT SELECT ON base_tbl TO regress_view_user2; GRANT UPDATE (a,c) ON base_tbl TO regress_view_user2; @@ -1276,10 +1677,18 @@ UPDATE base_tbl SET a=a, c=c; -- ok UPDATE base_tbl SET b=b; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view1 SET cc=cc; -- ok +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET cc = cc; -- ok UPDATE rw_view1 SET aa=aa; -- not allowed ERROR: permission denied for view rw_view1 UPDATE rw_view1 SET bb=bb; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET aa = aa; -- not allowed +ERROR: permission denied for view rw_view1 +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET bb = bb; -- not allowed +ERROR: permission denied for table base_tbl SET SESSION AUTHORIZATION regress_view_user1; GRANT INSERT, DELETE ON base_tbl TO regress_view_user2; SET SESSION AUTHORIZATION regress_view_user2; @@ -1289,6 +1698,9 @@ ERROR: permission denied for view rw_view1 DELETE FROM base_tbl WHERE a=1; -- ok DELETE FROM rw_view1 WHERE aa=2; -- not allowed ERROR: permission denied for view rw_view1 +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN DELETE; -- not allowed +ERROR: permission denied for view rw_view1 SET SESSION AUTHORIZATION regress_view_user1; REVOKE INSERT, DELETE ON base_tbl FROM regress_view_user2; GRANT INSERT, DELETE ON rw_view1 TO regress_view_user2; @@ -1297,17 +1709,21 @@ INSERT INTO rw_view1 VALUES ('Row 4', 4.0, 4); -- not allowed ERROR: permission denied for table base_tbl DELETE FROM rw_view1 WHERE aa=2; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN DELETE; -- not allowed +ERROR: permission denied for table base_tbl SET SESSION AUTHORIZATION regress_view_user1; GRANT INSERT, DELETE ON base_tbl TO regress_view_user2; SET SESSION AUTHORIZATION regress_view_user2; INSERT INTO rw_view1 VALUES ('Row 4', 4.0, 4); -- ok DELETE FROM rw_view1 WHERE aa=2; -- ok +MERGE INTO rw_view1 t USING (VALUES (3)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN DELETE; -- ok SELECT * FROM base_tbl; -- ok a | b | c ---+-------+--- - 3 | Row 3 | 3 4 | Row 4 | 4 -(2 rows) +(1 row) RESET SESSION AUTHORIZATION; DROP TABLE base_tbl CASCADE; @@ -1322,6 +1738,9 @@ SELECT * FROM rw_view1; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view1 SET aa=aa; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view1 t USING (VALUES (2, 'Row 2', 2.0)) AS v(a,b,c) ON t.aa = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.b, v.c, v.a); -- not allowed +ERROR: permission denied for table base_tbl SET SESSION AUTHORIZATION regress_view_user2; CREATE VIEW rw_view2 AS SELECT cc AS ccc, aa AS aaa, bb AS bbb FROM rw_view1; GRANT SELECT, UPDATE ON rw_view2 TO regress_view_user3; @@ -1329,6 +1748,9 @@ SELECT * FROM rw_view2; -- not allowed ERROR: permission denied for view rw_view1 UPDATE rw_view2 SET aaa=aaa; -- not allowed ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (2, 'Row 2', 2.0)) AS v(a,b,c) ON t.aaa = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.c, v.a, v.b); -- not allowed +ERROR: permission denied for view rw_view1 RESET SESSION AUTHORIZATION; GRANT SELECT ON base_tbl TO regress_view_user1; GRANT UPDATE (a, b) ON base_tbl TO regress_view_user1; @@ -1342,16 +1764,27 @@ SELECT * FROM rw_view1; -- ok UPDATE rw_view1 SET aa=aa, bb=bb; -- ok UPDATE rw_view1 SET cc=cc; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET aa = aa, bb = bb; -- ok +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET cc = cc; -- not allowed +ERROR: permission denied for table base_tbl SET SESSION AUTHORIZATION regress_view_user2; SELECT * FROM rw_view2; -- not allowed ERROR: permission denied for view rw_view1 UPDATE rw_view2 SET aaa=aaa; -- not allowed ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +ERROR: permission denied for view rw_view1 SET SESSION AUTHORIZATION regress_view_user3; SELECT * FROM rw_view2; -- not allowed ERROR: permission denied for view rw_view1 UPDATE rw_view2 SET aaa=aaa; -- not allowed ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +ERROR: permission denied for view rw_view1 SET SESSION AUTHORIZATION regress_view_user1; GRANT SELECT ON rw_view1 TO regress_view_user2; GRANT UPDATE (bb, cc) ON rw_view1 TO regress_view_user2; @@ -1360,11 +1793,17 @@ SELECT * FROM rw_view2; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view2 SET bbb=bbb; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +ERROR: permission denied for table base_tbl SET SESSION AUTHORIZATION regress_view_user3; SELECT * FROM rw_view2; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view2 SET bbb=bbb; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +ERROR: permission denied for table base_tbl RESET SESSION AUTHORIZATION; GRANT SELECT ON base_tbl TO regress_view_user2; GRANT UPDATE (a, c) ON base_tbl TO regress_view_user2; @@ -1380,6 +1819,14 @@ ERROR: permission denied for view rw_view1 UPDATE rw_view2 SET bbb=bbb; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view2 SET ccc=ccc; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +ERROR: permission denied for table base_tbl +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- ok SET SESSION AUTHORIZATION regress_view_user3; SELECT * FROM rw_view2; -- not allowed ERROR: permission denied for table base_tbl @@ -1389,6 +1836,15 @@ UPDATE rw_view2 SET bbb=bbb; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view2 SET ccc=ccc; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +ERROR: permission denied for table base_tbl +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- not allowed +ERROR: permission denied for table base_tbl RESET SESSION AUTHORIZATION; GRANT SELECT ON base_tbl TO regress_view_user3; GRANT UPDATE (a, c) ON base_tbl TO regress_view_user3; @@ -1404,6 +1860,14 @@ ERROR: permission denied for view rw_view1 UPDATE rw_view2 SET bbb=bbb; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view2 SET ccc=ccc; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +ERROR: permission denied for table base_tbl +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- ok RESET SESSION AUTHORIZATION; REVOKE SELECT, UPDATE ON base_tbl FROM regress_view_user1; SET SESSION AUTHORIZATION regress_view_user1; @@ -1411,6 +1875,9 @@ SELECT * FROM rw_view1; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view1 SET aa=aa; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET aa = aa; -- not allowed +ERROR: permission denied for table base_tbl SET SESSION AUTHORIZATION regress_view_user2; SELECT * FROM rw_view2; -- ok ccc | aaa | bbb @@ -1423,6 +1890,14 @@ ERROR: permission denied for view rw_view1 UPDATE rw_view2 SET bbb=bbb; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view2 SET ccc=ccc; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +ERROR: permission denied for table base_tbl +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- ok SET SESSION AUTHORIZATION regress_view_user3; SELECT * FROM rw_view2; -- ok ccc | aaa | bbb @@ -1435,6 +1910,14 @@ ERROR: permission denied for view rw_view1 UPDATE rw_view2 SET bbb=bbb; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view2 SET ccc=ccc; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +ERROR: permission denied for table base_tbl +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- ok RESET SESSION AUTHORIZATION; REVOKE SELECT, UPDATE ON base_tbl FROM regress_view_user2; SET SESSION AUTHORIZATION regress_view_user2; @@ -1446,6 +1929,15 @@ UPDATE rw_view2 SET bbb=bbb; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view2 SET ccc=ccc; -- not allowed ERROR: permission denied for table base_tbl +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +ERROR: permission denied for table base_tbl +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- not allowed +ERROR: permission denied for table base_tbl SET SESSION AUTHORIZATION regress_view_user3; SELECT * FROM rw_view2; -- ok ccc | aaa | bbb @@ -1458,6 +1950,14 @@ ERROR: permission denied for view rw_view1 UPDATE rw_view2 SET bbb=bbb; -- not allowed ERROR: permission denied for table base_tbl UPDATE rw_view2 SET ccc=ccc; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +ERROR: permission denied for view rw_view1 +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +ERROR: permission denied for table base_tbl +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- ok RESET SESSION AUTHORIZATION; DROP TABLE base_tbl CASCADE; NOTICE: drop cascades to 2 other objects @@ -1475,6 +1975,8 @@ CREATE VIEW rw_view1 AS SELECT a AS aa, b AS bb FROM base_tbl; ALTER VIEW rw_view1 ALTER COLUMN bb SET DEFAULT 'View default'; INSERT INTO rw_view1 VALUES (4, 'Row 4'); INSERT INTO rw_view1 (aa) VALUES (5); +MERGE INTO rw_view1 t USING (VALUES (6)) AS v(a) ON t.aa = v.a + WHEN NOT MATCHED THEN INSERT (aa) VALUES (v.a); SELECT * FROM base_tbl; a | b | c ---+--------------+--- @@ -1483,7 +1985,8 @@ SELECT * FROM base_tbl; 3 | Unspecified | 3 4 | Row 4 | 4 5 | View default | 5 -(5 rows) + 6 | View default | 6 +(6 rows) DROP TABLE base_tbl CASCADE; NOTICE: drop cascades to view rw_view1 @@ -1598,6 +2101,9 @@ DETAIL: View columns that refer to system columns are not updatable. INSERT INTO rw_view1 (s, c, a) VALUES (null, null, 1.1); -- should fail ERROR: cannot insert into column "s" of view "rw_view1" DETAIL: View columns that are not columns of their base relation are not updatable. +INSERT INTO rw_view1 (s, c, a) VALUES (default, default, 1.1); -- should fail +ERROR: cannot insert into column "s" of view "rw_view1" +DETAIL: View columns that are not columns of their base relation are not updatable. INSERT INTO rw_view1 (a) VALUES (1.1) RETURNING a, s, c; -- OK a | s | c -----+-------------------+------------------- @@ -1857,6 +2363,38 @@ SELECT * FROM base_tbl_child ORDER BY a; 20 (6 rows) +MERGE INTO rw_view1 t USING (VALUES (-200), (10)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a+1; -- Should produce -199 and 11 +MERGE INTO ONLY rw_view1 t USING (VALUES (-100), (20)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a+1; -- Should produce -99 and 21 +MERGE INTO rw_view2 t USING (VALUES (-40), (3)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a+1; -- Should produce -39 only +MERGE INTO ONLY rw_view2 t USING (VALUES (-30), (4)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a+1; -- Should produce -29 only +SELECT * FROM ONLY base_tbl_parent ORDER BY a; + a +------ + -199 + -99 + -39 + -29 + -20 + -10 + 100 + 200 +(8 rows) + +SELECT * FROM base_tbl_child ORDER BY a; + a +---- + 3 + 4 + 7 + 8 + 11 + 21 +(6 rows) + CREATE TABLE other_tbl_parent (id int); CREATE TABLE other_tbl_child () INHERITS (other_tbl_parent); INSERT INTO other_tbl_parent VALUES (7),(200); @@ -1886,10 +2424,10 @@ UPDATE rw_view1 SET a = a + 1000 FROM other_tbl_parent WHERE a = id; SELECT * FROM ONLY base_tbl_parent ORDER BY a; a ------ - -200 - -100 - -40 - -30 + -199 + -99 + -39 + -29 -20 -10 1100 @@ -1901,8 +2439,8 @@ SELECT * FROM base_tbl_child ORDER BY a; ------ 3 4 - 10 - 20 + 11 + 21 1007 1008 (6 rows) @@ -1955,16 +2493,39 @@ INSERT INTO rw_view1(a) VALUES (9); -- ok INSERT INTO rw_view1(a) VALUES (10); -- should fail ERROR: new row violates check option for view "rw_view1" DETAIL: Failing row contains (10, 10). -SELECT * FROM base_tbl; +SELECT * FROM base_tbl ORDER BY a, b; a | b ---+---- + 1 | -1 1 | 2 2 | 3 - 1 | -1 3 | 5 9 | 10 (5 rows) +MERGE INTO rw_view1 t USING (VALUES (10)) AS v(a) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a, v.a + 1); -- ok +MERGE INTO rw_view1 t USING (VALUES (11)) AS v(a) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a, v.a - 1); -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (11, 10). +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a - 1; -- ok +MERGE INTO rw_view1 t USING (VALUES (2)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a + 1; -- should fail +ERROR: new row violates check option for view "rw_view1" +DETAIL: Failing row contains (3, 3). +SELECT * FROM base_tbl ORDER BY a, b; + a | b +----+---- + 0 | 2 + 1 | -1 + 2 | 3 + 3 | 5 + 9 | 10 + 10 | 11 +(6 rows) + DROP TABLE base_tbl CASCADE; NOTICE: drop cascades to view rw_view1 -- WITH LOCAL/CASCADED CHECK OPTION @@ -2228,17 +2789,31 @@ CREATE VIEW rw_view2 AS INSERT INTO rw_view2 VALUES (-5); -- should fail ERROR: new row violates check option for view "rw_view2" DETAIL: Failing row contains (-5). +MERGE INTO rw_view2 t USING (VALUES (-5)) AS v(a) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a); -- should fail +ERROR: new row violates check option for view "rw_view2" +DETAIL: Failing row contains (-5). INSERT INTO rw_view2 VALUES (5); -- ok +MERGE INTO rw_view2 t USING (VALUES (6)) AS v(a) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a); -- ok INSERT INTO rw_view2 VALUES (50); -- ok, but not in view +MERGE INTO rw_view2 t USING (VALUES (60)) AS v(a) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a); -- ok, but not in view UPDATE rw_view2 SET a = a - 10; -- should fail ERROR: new row violates check option for view "rw_view2" DETAIL: Failing row contains (-5). +MERGE INTO rw_view2 t USING (VALUES (6)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a - 10; -- should fail +ERROR: new row violates check option for view "rw_view2" +DETAIL: Failing row contains (-4). SELECT * FROM base_tbl; a | b ----+---- 5 | 10 + 6 | 10 50 | 10 -(2 rows) + 60 | 10 +(4 rows) -- Check option won't cascade down to base view with INSTEAD OF triggers ALTER VIEW rw_view2 SET (check_option=cascaded); @@ -2247,10 +2822,12 @@ UPDATE rw_view2 SET a = 200 WHERE a = 5; -- ok, but not in view (doesn't fail rw SELECT * FROM base_tbl; a | b -----+---- + 6 | 10 50 | 10 + 60 | 10 100 | 10 200 | 10 -(3 rows) +(5 rows) -- Neither local nor cascaded check options work with INSTEAD rules DROP TRIGGER rw_view1_trig ON rw_view1; @@ -2267,14 +2844,16 @@ UPDATE rw_view2 SET a = -5 WHERE a = 5; -- ok, but not in view (doesn't fail rw_ SELECT * FROM base_tbl; a | b -----+---- + 6 | 10 50 | 10 + 60 | 10 100 | 10 200 | 10 -10 | 10 20 | 10 30 | 10 -5 | 10 -(7 rows) +(9 rows) DROP TABLE base_tbl CASCADE; NOTICE: drop cascades to 2 other objects @@ -2375,6 +2954,11 @@ NOTICE: snooped value: Harry DELETE FROM rw_view1 WHERE NOT snoop(person); NOTICE: snooped value: Tom NOTICE: snooped value: Harry +MERGE INTO rw_view1 t + USING (VALUES ('Tom'), ('Dick'), ('Harry')) AS v(person) ON t.person = v.person + WHEN MATCHED AND snoop(t.person) THEN UPDATE SET person = v.person; +NOTICE: snooped value: Tom +NOTICE: snooped value: Harry EXPLAIN (costs off) SELECT * FROM rw_view1 WHERE snoop(person); QUERY PLAN ----------------------------------------------- @@ -2400,6 +2984,21 @@ EXPLAIN (costs off) DELETE FROM rw_view1 WHERE NOT snoop(person); Filter: ((visibility = 'public'::text) AND (NOT snoop(person))) (3 rows) +EXPLAIN (costs off) +MERGE INTO rw_view1 t + USING (VALUES ('Tom'), ('Dick'), ('Harry')) AS v(person) ON t.person = v.person + WHEN MATCHED AND snoop(t.person) THEN UPDATE SET person = v.person; + QUERY PLAN +------------------------------------------------------------- + Merge on base_tbl + -> Nested Loop + Join Filter: (base_tbl.person = "*VALUES*".column1) + -> Seq Scan on base_tbl + Filter: (visibility = 'public'::text) + -> Materialize + -> Values Scan on "*VALUES*" +(7 rows) + -- security barrier view on top of security barrier view CREATE VIEW rw_view2 WITH (security_barrier = true) AS SELECT * FROM rw_view1 WHERE snoop(person); @@ -2449,6 +3048,13 @@ NOTICE: snooped value: Tom NOTICE: snooped value: Tom NOTICE: snooped value: Harry NOTICE: snooped value: Harry +MERGE INTO rw_view2 t + USING (VALUES ('Tom'), ('Dick'), ('Harry')) AS v(person) ON t.person = v.person + WHEN MATCHED AND snoop(t.person) THEN UPDATE SET person = v.person; +NOTICE: snooped value: Tom +NOTICE: snooped value: Tom +NOTICE: snooped value: Harry +NOTICE: snooped value: Harry EXPLAIN (costs off) SELECT * FROM rw_view2 WHERE snoop(person); QUERY PLAN ----------------------------------------------------- @@ -2476,6 +3082,20 @@ EXPLAIN (costs off) DELETE FROM rw_view2 WHERE NOT snoop(person); Filter: ((visibility = 'public'::text) AND snoop(person) AND (NOT snoop(person))) (3 rows) +EXPLAIN (costs off) +MERGE INTO rw_view2 t + USING (VALUES ('Tom'), ('Dick'), ('Harry')) AS v(person) ON t.person = v.person + WHEN MATCHED AND snoop(t.person) THEN UPDATE SET person = v.person; + QUERY PLAN +------------------------------------------------------------------------- + Merge on base_tbl + -> Nested Loop + Join Filter: (base_tbl.person = "*VALUES*".column1) + -> Seq Scan on base_tbl + Filter: ((visibility = 'public'::text) AND snoop(person)) + -> Values Scan on "*VALUES*" +(6 rows) + DROP TABLE base_tbl CASCADE; NOTICE: drop cascades to 2 other objects DETAIL: drop cascades to view rw_view1 @@ -2516,18 +3136,18 @@ EXPLAIN (costs off) INSERT INTO rw_view1 VALUES (2, 'New row 2'); QUERY PLAN ----------------------------------------------------------- Insert on base_tbl - InitPlan 1 (returns $0) + InitPlan 1 -> Index Only Scan using base_tbl_pkey on base_tbl t Index Cond: (id = 2) -> Result - One-Time Filter: ($0 IS NOT TRUE) + One-Time Filter: ((InitPlan 1).col1 IS NOT TRUE) Update on base_tbl - InitPlan 1 (returns $0) + InitPlan 1 -> Index Only Scan using base_tbl_pkey on base_tbl t Index Cond: (id = 2) -> Result - One-Time Filter: $0 + One-Time Filter: (InitPlan 1).col1 -> Index Scan using base_tbl_pkey on base_tbl Index Cond: (id = 2) (15 rows) @@ -2586,8 +3206,8 @@ SELECT * FROM v1 WHERE a=8; EXPLAIN (VERBOSE, COSTS OFF) UPDATE v1 SET a=100 WHERE snoop(a) AND leakproof(a) AND a < 7 AND a != 6; - QUERY PLAN ------------------------------------------------------------------------------------------------------ + QUERY PLAN +----------------------------------------------------------------------------------------------------------- Update on public.t1 Update on public.t1 t1_1 Update on public.t11 t1_2 @@ -2599,7 +3219,7 @@ UPDATE v1 SET a=100 WHERE snoop(a) AND leakproof(a) AND a < 7 AND a != 6; -> Index Scan using t1_a_idx on public.t1 t1_1 Output: t1_1.tableoid, t1_1.ctid Index Cond: ((t1_1.a > 5) AND (t1_1.a < 7)) - Filter: ((t1_1.a <> 6) AND (SubPlan 1) AND snoop(t1_1.a) AND leakproof(t1_1.a)) + Filter: ((t1_1.a <> 6) AND EXISTS(SubPlan 1) AND snoop(t1_1.a) AND leakproof(t1_1.a)) SubPlan 1 -> Append -> Seq Scan on public.t12 t12_1 @@ -2609,15 +3229,15 @@ UPDATE v1 SET a=100 WHERE snoop(a) AND leakproof(a) AND a < 7 AND a != 6; -> Index Scan using t11_a_idx on public.t11 t1_2 Output: t1_2.tableoid, t1_2.ctid Index Cond: ((t1_2.a > 5) AND (t1_2.a < 7)) - Filter: ((t1_2.a <> 6) AND (SubPlan 1) AND snoop(t1_2.a) AND leakproof(t1_2.a)) + Filter: ((t1_2.a <> 6) AND EXISTS(SubPlan 1) AND snoop(t1_2.a) AND leakproof(t1_2.a)) -> Index Scan using t12_a_idx on public.t12 t1_3 Output: t1_3.tableoid, t1_3.ctid Index Cond: ((t1_3.a > 5) AND (t1_3.a < 7)) - Filter: ((t1_3.a <> 6) AND (SubPlan 1) AND snoop(t1_3.a) AND leakproof(t1_3.a)) + Filter: ((t1_3.a <> 6) AND EXISTS(SubPlan 1) AND snoop(t1_3.a) AND leakproof(t1_3.a)) -> Index Scan using t111_a_idx on public.t111 t1_4 Output: t1_4.tableoid, t1_4.ctid Index Cond: ((t1_4.a > 5) AND (t1_4.a < 7)) - Filter: ((t1_4.a <> 6) AND (SubPlan 1) AND snoop(t1_4.a) AND leakproof(t1_4.a)) + Filter: ((t1_4.a <> 6) AND EXISTS(SubPlan 1) AND snoop(t1_4.a) AND leakproof(t1_4.a)) (30 rows) UPDATE v1 SET a=100 WHERE snoop(a) AND leakproof(a) AND a < 7 AND a != 6; @@ -2633,8 +3253,8 @@ SELECT * FROM t1 WHERE a=100; -- Nothing should have been changed to 100 EXPLAIN (VERBOSE, COSTS OFF) UPDATE v1 SET a=a+1 WHERE snoop(a) AND leakproof(a) AND a = 8; - QUERY PLAN ------------------------------------------------------------------------------------ + QUERY PLAN +----------------------------------------------------------------------------------------- Update on public.t1 Update on public.t1 t1_1 Update on public.t11 t1_2 @@ -2646,7 +3266,7 @@ UPDATE v1 SET a=a+1 WHERE snoop(a) AND leakproof(a) AND a = 8; -> Index Scan using t1_a_idx on public.t1 t1_1 Output: t1_1.a, t1_1.tableoid, t1_1.ctid Index Cond: ((t1_1.a > 5) AND (t1_1.a = 8)) - Filter: ((SubPlan 1) AND snoop(t1_1.a) AND leakproof(t1_1.a)) + Filter: (EXISTS(SubPlan 1) AND snoop(t1_1.a) AND leakproof(t1_1.a)) SubPlan 1 -> Append -> Seq Scan on public.t12 t12_1 @@ -2656,15 +3276,15 @@ UPDATE v1 SET a=a+1 WHERE snoop(a) AND leakproof(a) AND a = 8; -> Index Scan using t11_a_idx on public.t11 t1_2 Output: t1_2.a, t1_2.tableoid, t1_2.ctid Index Cond: ((t1_2.a > 5) AND (t1_2.a = 8)) - Filter: ((SubPlan 1) AND snoop(t1_2.a) AND leakproof(t1_2.a)) + Filter: (EXISTS(SubPlan 1) AND snoop(t1_2.a) AND leakproof(t1_2.a)) -> Index Scan using t12_a_idx on public.t12 t1_3 Output: t1_3.a, t1_3.tableoid, t1_3.ctid Index Cond: ((t1_3.a > 5) AND (t1_3.a = 8)) - Filter: ((SubPlan 1) AND snoop(t1_3.a) AND leakproof(t1_3.a)) + Filter: (EXISTS(SubPlan 1) AND snoop(t1_3.a) AND leakproof(t1_3.a)) -> Index Scan using t111_a_idx on public.t111 t1_4 Output: t1_4.a, t1_4.tableoid, t1_4.ctid Index Cond: ((t1_4.a > 5) AND (t1_4.a = 8)) - Filter: ((SubPlan 1) AND snoop(t1_4.a) AND leakproof(t1_4.a)) + Filter: (EXISTS(SubPlan 1) AND snoop(t1_4.a) AND leakproof(t1_4.a)) (30 rows) UPDATE v1 SET a=a+1 WHERE snoop(a) AND leakproof(a) AND a = 8; @@ -2848,10 +3468,10 @@ CREATE RULE v1_upd_rule AS ON UPDATE TO v1 DO INSTEAD CREATE VIEW v2 WITH (security_barrier = true) AS SELECT * FROM v1 WHERE EXISTS (SELECT 1); EXPLAIN (COSTS OFF) UPDATE v2 SET a = 1; - QUERY PLAN ---------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------- Update on t1 - InitPlan 1 (returns $0) + InitPlan 1 -> Result -> Merge Join Merge Cond: (t1.a = v1.a) @@ -2862,7 +3482,7 @@ EXPLAIN (COSTS OFF) UPDATE v2 SET a = 1; Sort Key: v1.a -> Subquery Scan on v1 -> Result - One-Time Filter: $0 + One-Time Filter: (InitPlan 1).col1 -> Seq Scan on t1 t1_1 (14 rows) @@ -2941,6 +3561,29 @@ create view uv_ptv_wco as select * from uv_pt where a = 0 with check option; insert into uv_ptv_wco values (1, 2); ERROR: new row violates check option for view "uv_ptv_wco" DETAIL: Failing row contains (1, 2, null). +merge into uv_ptv t + using (values (1,2), (1,4)) as v(a,b) on t.a = v.a -- fail: matches 2 src rows + when matched then update set b = t.b + 1 + when not matched then insert values (v.a, v.b + 1); +ERROR: MERGE command cannot affect row a second time +HINT: Ensure that not more than one source row matches any one target row. +merge into uv_ptv t + using (values (1,2), (1,4)) as v(a,b) on t.a = v.a and t.b = v.b + when matched then update set b = t.b + 1 + when not matched then insert values (v.a, v.b + 1); -- fail: no partition for b=5 +ERROR: no partition of relation "uv_pt1" found for row +DETAIL: Partition key of the failing row contains (b) = (5). +merge into uv_ptv t + using (values (1,2), (1,3)) as v(a,b) on t.a = v.a and t.b = v.b + when matched then update set b = t.b + 1 + when not matched then insert values (v.a, v.b + 1); -- ok +select tableoid::regclass, * from uv_pt order by a, b; + tableoid | a | b | v +----------+---+---+--- + uv_pt11 | 1 | 3 | + uv_pt11 | 1 | 4 | +(2 rows) + drop view uv_ptv, uv_ptv_wco; drop table uv_pt, uv_pt1, uv_pt11; -- check that wholerow vars appearing in WITH CHECK OPTION constraint expressions diff --git a/src/test/regress/expected/update.out b/src/test/regress/expected/update.out index c809f88f5461f..1b27d132d7ba1 100644 --- a/src/test/regress/expected/update.out +++ b/src/test/regress/expected/update.out @@ -44,6 +44,12 @@ SELECT * FROM update_test; 10 | 20 | (2 rows) +-- error, you're not supposed to qualify the target column +UPDATE update_test t SET t.b = t.b + 10 WHERE t.a = 10; +ERROR: column "t" of relation "update_test" does not exist +LINE 1: UPDATE update_test t SET t.b = t.b + 10 WHERE t.a = 10; + ^ +HINT: SET target columns cannot be qualified with the relation name. -- -- Test VALUES in FROM -- @@ -172,15 +178,15 @@ EXPLAIN (VERBOSE, COSTS OFF) UPDATE update_test t SET (a, b) = (SELECT b, a FROM update_test s WHERE s.a = t.a) WHERE CURRENT_USER = SESSION_USER; - QUERY PLAN -------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------------------------- Update on public.update_test t -> Result - Output: $1, $2, (SubPlan 1 (returns $1,$2)), t.ctid + Output: (SubPlan 1).col1, (SubPlan 1).col2, (rescan SubPlan 1), t.ctid One-Time Filter: (CURRENT_USER = SESSION_USER) -> Seq Scan on public.update_test t Output: t.a, t.ctid - SubPlan 1 (returns $1,$2) + SubPlan 1 -> Seq Scan on public.update_test s Output: s.b, s.a Filter: (s.a = t.a) diff --git a/src/test/regress/expected/uuid.out b/src/test/regress/expected/uuid.out index 8e7f21910d686..6026e15ed3197 100644 --- a/src/test/regress/expected/uuid.out +++ b/src/test/regress/expected/uuid.out @@ -168,5 +168,44 @@ SELECT count(DISTINCT guid_field) FROM guid1; 2 (1 row) +-- extract functions +-- version +SELECT uuid_extract_version('11111111-1111-5111-8111-111111111111'); -- 5 + uuid_extract_version +---------------------- + 5 +(1 row) + +SELECT uuid_extract_version(gen_random_uuid()); -- 4 + uuid_extract_version +---------------------- + 4 +(1 row) + +SELECT uuid_extract_version('11111111-1111-1111-1111-111111111111'); -- null + uuid_extract_version +---------------------- + +(1 row) + +-- timestamp +SELECT uuid_extract_timestamp('C232AB00-9414-11EC-B3C8-9F6BDECED846') = 'Tuesday, February 22, 2022 2:22:22.00 PM GMT+05:00'; -- RFC 4122bis test vector + ?column? +---------- + t +(1 row) + +SELECT uuid_extract_timestamp(gen_random_uuid()); -- null + uuid_extract_timestamp +------------------------ + +(1 row) + +SELECT uuid_extract_timestamp('11111111-1111-1111-1111-111111111111'); -- null + uuid_extract_timestamp +------------------------ + +(1 row) + -- clean up DROP TABLE guid1, guid2 CASCADE; diff --git a/src/test/regress/expected/vacuum.out b/src/test/regress/expected/vacuum.out index 4def90b805750..7518806e61f42 100644 --- a/src/test/regress/expected/vacuum.out +++ b/src/test/regress/expected/vacuum.out @@ -64,7 +64,7 @@ CLUSTER vaccluster; CREATE FUNCTION do_analyze() RETURNS VOID VOLATILE LANGUAGE SQL AS 'ANALYZE pg_am'; CREATE FUNCTION wrap_do_analyze(c INT) RETURNS INT IMMUTABLE LANGUAGE SQL - AS 'SELECT $1 FROM do_analyze()'; + AS 'SELECT $1 FROM public.do_analyze()'; CREATE INDEX ON vaccluster(wrap_do_analyze(i)); INSERT INTO vaccluster VALUES (1), (2); ANALYZE vaccluster; @@ -82,6 +82,53 @@ BEGIN; INSERT INTO vactst SELECT generate_series(301, 400); DELETE FROM vactst WHERE i % 5 <> 0; -- delete a few rows inside ANALYZE vactst; +COMMIT; +-- Test ANALYZE setting relhassubclass=f for non-partitioning inheritance +BEGIN; +CREATE TABLE past_inh_parent (); +CREATE TABLE past_inh_child () INHERITS (past_inh_parent); +INSERT INTO past_inh_child DEFAULT VALUES; +INSERT INTO past_inh_child DEFAULT VALUES; +ANALYZE past_inh_parent; +SELECT reltuples, relhassubclass + FROM pg_class WHERE oid = 'past_inh_parent'::regclass; + reltuples | relhassubclass +-----------+---------------- + 0 | t +(1 row) + +DROP TABLE past_inh_child; +ANALYZE past_inh_parent; +SELECT reltuples, relhassubclass + FROM pg_class WHERE oid = 'past_inh_parent'::regclass; + reltuples | relhassubclass +-----------+---------------- + 0 | f +(1 row) + +COMMIT; +-- Test ANALYZE setting relhassubclass=f for partitioning +BEGIN; +CREATE TABLE past_parted (i int) PARTITION BY LIST(i); +CREATE TABLE past_part PARTITION OF past_parted FOR VALUES IN (1); +INSERT INTO past_parted VALUES (1),(1); +ANALYZE past_parted; +DROP TABLE past_part; +SELECT reltuples, relhassubclass + FROM pg_class WHERE oid = 'past_parted'::regclass; + reltuples | relhassubclass +-----------+---------------- + 2 | t +(1 row) + +ANALYZE past_parted; +SELECT reltuples, relhassubclass + FROM pg_class WHERE oid = 'past_parted'::regclass; + reltuples | relhassubclass +-----------+---------------- + 0 | f +(1 row) + COMMIT; VACUUM FULL pg_am; VACUUM FULL pg_class; @@ -101,6 +148,10 @@ CREATE INDEX brin_pvactst ON pvactst USING brin (i); CREATE INDEX gin_pvactst ON pvactst USING gin (a); CREATE INDEX gist_pvactst ON pvactst USING gist (p); CREATE INDEX spgist_pvactst ON pvactst USING spgist (p); +CREATE TABLE pvactst2 (i INT) WITH (autovacuum_enabled = off); +INSERT INTO pvactst2 SELECT generate_series(1, 1000); +CREATE INDEX ON pvactst2 (i); +CREATE INDEX ON pvactst2 (i); -- VACUUM invokes parallel index cleanup SET min_parallel_index_scan_size to 0; VACUUM (PARALLEL 2) pvactst; @@ -120,6 +171,13 @@ VACUUM (PARALLEL) pvactst; -- error, cannot use PARALLEL option without parallel ERROR: parallel option requires a value between 0 and 1024 LINE 1: VACUUM (PARALLEL) pvactst; ^ +-- Test parallel vacuum using the minimum maintenance_work_mem with and without +-- dead tuples. +SET maintenance_work_mem TO 64; +VACUUM (PARALLEL 2) pvactst2; +DELETE FROM pvactst2 WHERE i < 1000; +VACUUM (PARALLEL 2) pvactst2; +RESET maintenance_work_mem; -- Test different combinations of parallel and full options for temporary tables CREATE TEMPORARY TABLE tmp (a int PRIMARY KEY); CREATE INDEX tmp_idx1 ON tmp (a); @@ -128,6 +186,7 @@ WARNING: disabling parallel option of vacuum on "tmp" --- cannot vacuum tempora VACUUM (PARALLEL 0, FULL TRUE) tmp; -- can specify parallel disabled (even though that's implied by FULL) RESET min_parallel_index_scan_size; DROP TABLE pvactst; +DROP TABLE pvactst2; -- INDEX_CLEANUP option CREATE TABLE no_index_cleanup (i INT PRIMARY KEY, t TEXT); -- Use uncompressed data stored in toast. diff --git a/src/test/regress/expected/window.out b/src/test/regress/expected/window.out index 1d4b78b9b27ed..23d1463df22ba 100644 --- a/src/test/regress/expected/window.out +++ b/src/test/regress/expected/window.out @@ -2372,6 +2372,7 @@ create temp table datetimes( f_timestamp timestamp ); insert into datetimes values +(0, '10:00', '10:00 BST', '-infinity', '-infinity', '-infinity'), (1, '11:00', '11:00 BST', '1 year', '2000-10-19 10:23:54+01', '2000-10-19 10:23:54'), (2, '12:00', '12:00 BST', '2 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), (3, '13:00', '13:00 BST', '3 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), @@ -2381,14 +2382,16 @@ insert into datetimes values (7, '17:00', '17:00 BST', '7 years', '2005-10-19 10:23:54+01', '2005-10-19 10:23:54'), (8, '18:00', '18:00 BST', '8 years', '2006-10-19 10:23:54+01', '2006-10-19 10:23:54'), (9, '19:00', '19:00 BST', '9 years', '2007-10-19 10:23:54+01', '2007-10-19 10:23:54'), -(10, '20:00', '20:00 BST', '10 years', '2008-10-19 10:23:54+01', '2008-10-19 10:23:54'); +(10, '20:00', '20:00 BST', '10 years', '2008-10-19 10:23:54+01', '2008-10-19 10:23:54'), +(11, '21:00', '21:00 BST', 'infinity', 'infinity', 'infinity'); select id, f_time, first_value(id) over w, last_value(id) over w from datetimes window w as (order by f_time range between '70 min'::interval preceding and '2 hours'::interval following); id | f_time | first_value | last_value ----+----------+-------------+------------ - 1 | 11:00:00 | 1 | 3 + 0 | 10:00:00 | 0 | 2 + 1 | 11:00:00 | 0 | 3 2 | 12:00:00 | 1 | 4 3 | 13:00:00 | 2 | 6 4 | 14:00:00 | 3 | 6 @@ -2396,9 +2399,10 @@ window w as (order by f_time range between 6 | 15:00:00 | 4 | 7 7 | 17:00:00 | 7 | 9 8 | 18:00:00 | 7 | 10 - 9 | 19:00:00 | 8 | 10 - 10 | 20:00:00 | 9 | 10 -(10 rows) + 9 | 19:00:00 | 8 | 11 + 10 | 20:00:00 | 9 | 11 + 11 | 21:00:00 | 10 | 11 +(12 rows) select id, f_time, first_value(id) over w, last_value(id) over w from datetimes @@ -2406,7 +2410,8 @@ window w as (order by f_time desc range between '70 min' preceding and '2 hours' following); id | f_time | first_value | last_value ----+----------+-------------+------------ - 10 | 20:00:00 | 10 | 8 + 11 | 21:00:00 | 11 | 9 + 10 | 20:00:00 | 11 | 8 9 | 19:00:00 | 10 | 7 8 | 18:00:00 | 9 | 7 7 | 17:00:00 | 8 | 5 @@ -2414,17 +2419,90 @@ window w as (order by f_time desc range between 5 | 15:00:00 | 6 | 3 4 | 14:00:00 | 6 | 2 3 | 13:00:00 | 4 | 1 - 2 | 12:00:00 | 3 | 1 - 1 | 11:00:00 | 2 | 1 -(10 rows) + 2 | 12:00:00 | 3 | 0 + 1 | 11:00:00 | 2 | 0 + 0 | 10:00:00 | 1 | 0 +(12 rows) + +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time desc range between + '-70 min' preceding and '2 hours' following); -- error, negative offset disallowed +ERROR: invalid preceding or following size in window function +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time range between + 'infinity'::interval preceding and 'infinity'::interval following); + id | f_time | first_value | last_value +----+----------+-------------+------------ + 0 | 10:00:00 | 0 | 11 + 1 | 11:00:00 | 0 | 11 + 2 | 12:00:00 | 0 | 11 + 3 | 13:00:00 | 0 | 11 + 4 | 14:00:00 | 0 | 11 + 5 | 15:00:00 | 0 | 11 + 6 | 15:00:00 | 0 | 11 + 7 | 17:00:00 | 0 | 11 + 8 | 18:00:00 | 0 | 11 + 9 | 19:00:00 | 0 | 11 + 10 | 20:00:00 | 0 | 11 + 11 | 21:00:00 | 0 | 11 +(12 rows) + +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time range between + 'infinity'::interval preceding and 'infinity'::interval preceding); + id | f_time | first_value | last_value +----+----------+-------------+------------ + 0 | 10:00:00 | | + 1 | 11:00:00 | | + 2 | 12:00:00 | | + 3 | 13:00:00 | | + 4 | 14:00:00 | | + 5 | 15:00:00 | | + 6 | 15:00:00 | | + 7 | 17:00:00 | | + 8 | 18:00:00 | | + 9 | 19:00:00 | | + 10 | 20:00:00 | | + 11 | 21:00:00 | | +(12 rows) + +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time range between + 'infinity'::interval following and 'infinity'::interval following); + id | f_time | first_value | last_value +----+----------+-------------+------------ + 0 | 10:00:00 | | + 1 | 11:00:00 | | + 2 | 12:00:00 | | + 3 | 13:00:00 | | + 4 | 14:00:00 | | + 5 | 15:00:00 | | + 6 | 15:00:00 | | + 7 | 17:00:00 | | + 8 | 18:00:00 | | + 9 | 19:00:00 | | + 10 | 20:00:00 | | + 11 | 21:00:00 | | +(12 rows) +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time range between + '-infinity'::interval following and + 'infinity'::interval following); -- error, negative offset disallowed +ERROR: invalid preceding or following size in window function select id, f_timetz, first_value(id) over w, last_value(id) over w from datetimes window w as (order by f_timetz range between '70 min'::interval preceding and '2 hours'::interval following); id | f_timetz | first_value | last_value ----+-------------+-------------+------------ - 1 | 11:00:00+01 | 1 | 3 + 0 | 10:00:00+01 | 0 | 2 + 1 | 11:00:00+01 | 0 | 3 2 | 12:00:00+01 | 1 | 4 3 | 13:00:00+01 | 2 | 6 4 | 14:00:00+01 | 3 | 6 @@ -2432,9 +2510,10 @@ window w as (order by f_timetz range between 6 | 15:00:00+01 | 4 | 7 7 | 17:00:00+01 | 7 | 9 8 | 18:00:00+01 | 7 | 10 - 9 | 19:00:00+01 | 8 | 10 - 10 | 20:00:00+01 | 9 | 10 -(10 rows) + 9 | 19:00:00+01 | 8 | 11 + 10 | 20:00:00+01 | 9 | 11 + 11 | 21:00:00+01 | 10 | 11 +(12 rows) select id, f_timetz, first_value(id) over w, last_value(id) over w from datetimes @@ -2442,7 +2521,8 @@ window w as (order by f_timetz desc range between '70 min' preceding and '2 hours' following); id | f_timetz | first_value | last_value ----+-------------+-------------+------------ - 10 | 20:00:00+01 | 10 | 8 + 11 | 21:00:00+01 | 11 | 9 + 10 | 20:00:00+01 | 11 | 8 9 | 19:00:00+01 | 10 | 7 8 | 18:00:00+01 | 9 | 7 7 | 17:00:00+01 | 8 | 5 @@ -2450,16 +2530,89 @@ window w as (order by f_timetz desc range between 5 | 15:00:00+01 | 6 | 3 4 | 14:00:00+01 | 6 | 2 3 | 13:00:00+01 | 4 | 1 - 2 | 12:00:00+01 | 3 | 1 - 1 | 11:00:00+01 | 2 | 1 -(10 rows) + 2 | 12:00:00+01 | 3 | 0 + 1 | 11:00:00+01 | 2 | 0 + 0 | 10:00:00+01 | 1 | 0 +(12 rows) + +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz desc range between + '70 min' preceding and '-2 hours' following); -- error, negative offset disallowed +ERROR: invalid preceding or following size in window function +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz range between + 'infinity'::interval preceding and 'infinity'::interval following); + id | f_timetz | first_value | last_value +----+-------------+-------------+------------ + 0 | 10:00:00+01 | 0 | 11 + 1 | 11:00:00+01 | 0 | 11 + 2 | 12:00:00+01 | 0 | 11 + 3 | 13:00:00+01 | 0 | 11 + 4 | 14:00:00+01 | 0 | 11 + 5 | 15:00:00+01 | 0 | 11 + 6 | 15:00:00+01 | 0 | 11 + 7 | 17:00:00+01 | 0 | 11 + 8 | 18:00:00+01 | 0 | 11 + 9 | 19:00:00+01 | 0 | 11 + 10 | 20:00:00+01 | 0 | 11 + 11 | 21:00:00+01 | 0 | 11 +(12 rows) +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz range between + 'infinity'::interval preceding and 'infinity'::interval preceding); + id | f_timetz | first_value | last_value +----+-------------+-------------+------------ + 0 | 10:00:00+01 | | + 1 | 11:00:00+01 | | + 2 | 12:00:00+01 | | + 3 | 13:00:00+01 | | + 4 | 14:00:00+01 | | + 5 | 15:00:00+01 | | + 6 | 15:00:00+01 | | + 7 | 17:00:00+01 | | + 8 | 18:00:00+01 | | + 9 | 19:00:00+01 | | + 10 | 20:00:00+01 | | + 11 | 21:00:00+01 | | +(12 rows) + +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz range between + 'infinity'::interval following and 'infinity'::interval following); + id | f_timetz | first_value | last_value +----+-------------+-------------+------------ + 0 | 10:00:00+01 | | + 1 | 11:00:00+01 | | + 2 | 12:00:00+01 | | + 3 | 13:00:00+01 | | + 4 | 14:00:00+01 | | + 5 | 15:00:00+01 | | + 6 | 15:00:00+01 | | + 7 | 17:00:00+01 | | + 8 | 18:00:00+01 | | + 9 | 19:00:00+01 | | + 10 | 20:00:00+01 | | + 11 | 21:00:00+01 | | +(12 rows) + +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz range between + 'infinity'::interval following and + '-infinity'::interval following); -- error, negative offset disallowed +ERROR: invalid preceding or following size in window function select id, f_interval, first_value(id) over w, last_value(id) over w from datetimes window w as (order by f_interval range between '1 year'::interval preceding and '1 year'::interval following); id | f_interval | first_value | last_value ----+------------+-------------+------------ + 0 | -infinity | 0 | 0 1 | @ 1 year | 1 | 2 2 | @ 2 years | 1 | 3 3 | @ 3 years | 2 | 4 @@ -2470,7 +2623,8 @@ window w as (order by f_interval range between 8 | @ 8 years | 7 | 9 9 | @ 9 years | 8 | 10 10 | @ 10 years | 9 | 10 -(10 rows) + 11 | infinity | 11 | 11 +(12 rows) select id, f_interval, first_value(id) over w, last_value(id) over w from datetimes @@ -2478,6 +2632,7 @@ window w as (order by f_interval desc range between '1 year' preceding and '1 year' following); id | f_interval | first_value | last_value ----+------------+-------------+------------ + 11 | infinity | 11 | 11 10 | @ 10 years | 10 | 9 9 | @ 9 years | 10 | 8 8 | @ 8 years | 9 | 7 @@ -2488,14 +2643,87 @@ window w as (order by f_interval desc range between 3 | @ 3 years | 4 | 2 2 | @ 2 years | 3 | 1 1 | @ 1 year | 2 | 1 -(10 rows) + 0 | -infinity | 0 | 0 +(12 rows) +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval desc range between + '-1 year' preceding and '1 year' following); -- error, negative offset disallowed +ERROR: invalid preceding or following size in window function +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval range between + 'infinity'::interval preceding and 'infinity'::interval following); + id | f_interval | first_value | last_value +----+------------+-------------+------------ + 0 | -infinity | 0 | 11 + 1 | @ 1 year | 0 | 11 + 2 | @ 2 years | 0 | 11 + 3 | @ 3 years | 0 | 11 + 4 | @ 4 years | 0 | 11 + 5 | @ 5 years | 0 | 11 + 6 | @ 5 years | 0 | 11 + 7 | @ 7 years | 0 | 11 + 8 | @ 8 years | 0 | 11 + 9 | @ 9 years | 0 | 11 + 10 | @ 10 years | 0 | 11 + 11 | infinity | 0 | 11 +(12 rows) + +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval range between + 'infinity'::interval preceding and 'infinity'::interval preceding); + id | f_interval | first_value | last_value +----+------------+-------------+------------ + 0 | -infinity | 0 | 0 + 1 | @ 1 year | 0 | 0 + 2 | @ 2 years | 0 | 0 + 3 | @ 3 years | 0 | 0 + 4 | @ 4 years | 0 | 0 + 5 | @ 5 years | 0 | 0 + 6 | @ 5 years | 0 | 0 + 7 | @ 7 years | 0 | 0 + 8 | @ 8 years | 0 | 0 + 9 | @ 9 years | 0 | 0 + 10 | @ 10 years | 0 | 0 + 11 | infinity | 0 | 11 +(12 rows) + +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval range between + 'infinity'::interval following and 'infinity'::interval following); + id | f_interval | first_value | last_value +----+------------+-------------+------------ + 0 | -infinity | 0 | 11 + 1 | @ 1 year | 11 | 11 + 2 | @ 2 years | 11 | 11 + 3 | @ 3 years | 11 | 11 + 4 | @ 4 years | 11 | 11 + 5 | @ 5 years | 11 | 11 + 6 | @ 5 years | 11 | 11 + 7 | @ 7 years | 11 | 11 + 8 | @ 8 years | 11 | 11 + 9 | @ 9 years | 11 | 11 + 10 | @ 10 years | 11 | 11 + 11 | infinity | 11 | 11 +(12 rows) + +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval range between + '-infinity'::interval following and + 'infinity'::interval following); -- error, negative offset disallowed +ERROR: invalid preceding or following size in window function select id, f_timestamptz, first_value(id) over w, last_value(id) over w from datetimes window w as (order by f_timestamptz range between '1 year'::interval preceding and '1 year'::interval following); id | f_timestamptz | first_value | last_value ----+------------------------------+-------------+------------ + 0 | -infinity | 0 | 0 1 | Thu Oct 19 02:23:54 2000 PDT | 1 | 3 2 | Fri Oct 19 02:23:54 2001 PDT | 1 | 4 3 | Fri Oct 19 02:23:54 2001 PDT | 1 | 4 @@ -2506,7 +2734,8 @@ window w as (order by f_timestamptz range between 8 | Thu Oct 19 02:23:54 2006 PDT | 7 | 9 9 | Fri Oct 19 02:23:54 2007 PDT | 8 | 10 10 | Sun Oct 19 02:23:54 2008 PDT | 9 | 10 -(10 rows) + 11 | infinity | 11 | 11 +(12 rows) select id, f_timestamptz, first_value(id) over w, last_value(id) over w from datetimes @@ -2514,6 +2743,7 @@ window w as (order by f_timestamptz desc range between '1 year' preceding and '1 year' following); id | f_timestamptz | first_value | last_value ----+------------------------------+-------------+------------ + 11 | infinity | 11 | 11 10 | Sun Oct 19 02:23:54 2008 PDT | 10 | 9 9 | Fri Oct 19 02:23:54 2007 PDT | 10 | 8 8 | Thu Oct 19 02:23:54 2006 PDT | 9 | 7 @@ -2524,14 +2754,87 @@ window w as (order by f_timestamptz desc range between 3 | Fri Oct 19 02:23:54 2001 PDT | 4 | 1 2 | Fri Oct 19 02:23:54 2001 PDT | 4 | 1 1 | Thu Oct 19 02:23:54 2000 PDT | 3 | 1 -(10 rows) + 0 | -infinity | 0 | 0 +(12 rows) +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz desc range between + '1 year' preceding and '-1 year' following); -- error, negative offset disallowed +ERROR: invalid preceding or following size in window function +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz range between + 'infinity'::interval preceding and 'infinity'::interval following); + id | f_timestamptz | first_value | last_value +----+------------------------------+-------------+------------ + 0 | -infinity | 0 | 11 + 1 | Thu Oct 19 02:23:54 2000 PDT | 0 | 11 + 2 | Fri Oct 19 02:23:54 2001 PDT | 0 | 11 + 3 | Fri Oct 19 02:23:54 2001 PDT | 0 | 11 + 4 | Sat Oct 19 02:23:54 2002 PDT | 0 | 11 + 5 | Sun Oct 19 02:23:54 2003 PDT | 0 | 11 + 6 | Tue Oct 19 02:23:54 2004 PDT | 0 | 11 + 7 | Wed Oct 19 02:23:54 2005 PDT | 0 | 11 + 8 | Thu Oct 19 02:23:54 2006 PDT | 0 | 11 + 9 | Fri Oct 19 02:23:54 2007 PDT | 0 | 11 + 10 | Sun Oct 19 02:23:54 2008 PDT | 0 | 11 + 11 | infinity | 0 | 11 +(12 rows) + +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz range between + 'infinity'::interval preceding and 'infinity'::interval preceding); + id | f_timestamptz | first_value | last_value +----+------------------------------+-------------+------------ + 0 | -infinity | 0 | 0 + 1 | Thu Oct 19 02:23:54 2000 PDT | 0 | 0 + 2 | Fri Oct 19 02:23:54 2001 PDT | 0 | 0 + 3 | Fri Oct 19 02:23:54 2001 PDT | 0 | 0 + 4 | Sat Oct 19 02:23:54 2002 PDT | 0 | 0 + 5 | Sun Oct 19 02:23:54 2003 PDT | 0 | 0 + 6 | Tue Oct 19 02:23:54 2004 PDT | 0 | 0 + 7 | Wed Oct 19 02:23:54 2005 PDT | 0 | 0 + 8 | Thu Oct 19 02:23:54 2006 PDT | 0 | 0 + 9 | Fri Oct 19 02:23:54 2007 PDT | 0 | 0 + 10 | Sun Oct 19 02:23:54 2008 PDT | 0 | 0 + 11 | infinity | 0 | 11 +(12 rows) + +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz range between + 'infinity'::interval following and 'infinity'::interval following); + id | f_timestamptz | first_value | last_value +----+------------------------------+-------------+------------ + 0 | -infinity | 0 | 11 + 1 | Thu Oct 19 02:23:54 2000 PDT | 11 | 11 + 2 | Fri Oct 19 02:23:54 2001 PDT | 11 | 11 + 3 | Fri Oct 19 02:23:54 2001 PDT | 11 | 11 + 4 | Sat Oct 19 02:23:54 2002 PDT | 11 | 11 + 5 | Sun Oct 19 02:23:54 2003 PDT | 11 | 11 + 6 | Tue Oct 19 02:23:54 2004 PDT | 11 | 11 + 7 | Wed Oct 19 02:23:54 2005 PDT | 11 | 11 + 8 | Thu Oct 19 02:23:54 2006 PDT | 11 | 11 + 9 | Fri Oct 19 02:23:54 2007 PDT | 11 | 11 + 10 | Sun Oct 19 02:23:54 2008 PDT | 11 | 11 + 11 | infinity | 11 | 11 +(12 rows) + +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz range between + '-infinity'::interval following and + 'infinity'::interval following); -- error, negative offset disallowed +ERROR: invalid preceding or following size in window function select id, f_timestamp, first_value(id) over w, last_value(id) over w from datetimes window w as (order by f_timestamp range between '1 year'::interval preceding and '1 year'::interval following); id | f_timestamp | first_value | last_value ----+--------------------------+-------------+------------ + 0 | -infinity | 0 | 0 1 | Thu Oct 19 10:23:54 2000 | 1 | 3 2 | Fri Oct 19 10:23:54 2001 | 1 | 4 3 | Fri Oct 19 10:23:54 2001 | 1 | 4 @@ -2542,7 +2845,8 @@ window w as (order by f_timestamp range between 8 | Thu Oct 19 10:23:54 2006 | 7 | 9 9 | Fri Oct 19 10:23:54 2007 | 8 | 10 10 | Sun Oct 19 10:23:54 2008 | 9 | 10 -(10 rows) + 11 | infinity | 11 | 11 +(12 rows) select id, f_timestamp, first_value(id) over w, last_value(id) over w from datetimes @@ -2550,6 +2854,7 @@ window w as (order by f_timestamp desc range between '1 year' preceding and '1 year' following); id | f_timestamp | first_value | last_value ----+--------------------------+-------------+------------ + 11 | infinity | 11 | 11 10 | Sun Oct 19 10:23:54 2008 | 10 | 9 9 | Fri Oct 19 10:23:54 2007 | 10 | 8 8 | Thu Oct 19 10:23:54 2006 | 9 | 7 @@ -2560,8 +2865,80 @@ window w as (order by f_timestamp desc range between 3 | Fri Oct 19 10:23:54 2001 | 4 | 1 2 | Fri Oct 19 10:23:54 2001 | 4 | 1 1 | Thu Oct 19 10:23:54 2000 | 3 | 1 -(10 rows) + 0 | -infinity | 0 | 0 +(12 rows) + +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp desc range between + '-1 year' preceding and '1 year' following); -- error, negative offset disallowed +ERROR: invalid preceding or following size in window function +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp range between + 'infinity'::interval preceding and 'infinity'::interval following); + id | f_timestamp | first_value | last_value +----+--------------------------+-------------+------------ + 0 | -infinity | 0 | 11 + 1 | Thu Oct 19 10:23:54 2000 | 0 | 11 + 2 | Fri Oct 19 10:23:54 2001 | 0 | 11 + 3 | Fri Oct 19 10:23:54 2001 | 0 | 11 + 4 | Sat Oct 19 10:23:54 2002 | 0 | 11 + 5 | Sun Oct 19 10:23:54 2003 | 0 | 11 + 6 | Tue Oct 19 10:23:54 2004 | 0 | 11 + 7 | Wed Oct 19 10:23:54 2005 | 0 | 11 + 8 | Thu Oct 19 10:23:54 2006 | 0 | 11 + 9 | Fri Oct 19 10:23:54 2007 | 0 | 11 + 10 | Sun Oct 19 10:23:54 2008 | 0 | 11 + 11 | infinity | 0 | 11 +(12 rows) + +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp range between + 'infinity'::interval preceding and 'infinity'::interval preceding); + id | f_timestamp | first_value | last_value +----+--------------------------+-------------+------------ + 0 | -infinity | 0 | 0 + 1 | Thu Oct 19 10:23:54 2000 | 0 | 0 + 2 | Fri Oct 19 10:23:54 2001 | 0 | 0 + 3 | Fri Oct 19 10:23:54 2001 | 0 | 0 + 4 | Sat Oct 19 10:23:54 2002 | 0 | 0 + 5 | Sun Oct 19 10:23:54 2003 | 0 | 0 + 6 | Tue Oct 19 10:23:54 2004 | 0 | 0 + 7 | Wed Oct 19 10:23:54 2005 | 0 | 0 + 8 | Thu Oct 19 10:23:54 2006 | 0 | 0 + 9 | Fri Oct 19 10:23:54 2007 | 0 | 0 + 10 | Sun Oct 19 10:23:54 2008 | 0 | 0 + 11 | infinity | 0 | 11 +(12 rows) +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp range between + 'infinity'::interval following and 'infinity'::interval following); + id | f_timestamp | first_value | last_value +----+--------------------------+-------------+------------ + 0 | -infinity | 0 | 11 + 1 | Thu Oct 19 10:23:54 2000 | 11 | 11 + 2 | Fri Oct 19 10:23:54 2001 | 11 | 11 + 3 | Fri Oct 19 10:23:54 2001 | 11 | 11 + 4 | Sat Oct 19 10:23:54 2002 | 11 | 11 + 5 | Sun Oct 19 10:23:54 2003 | 11 | 11 + 6 | Tue Oct 19 10:23:54 2004 | 11 | 11 + 7 | Wed Oct 19 10:23:54 2005 | 11 | 11 + 8 | Thu Oct 19 10:23:54 2006 | 11 | 11 + 9 | Fri Oct 19 10:23:54 2007 | 11 | 11 + 10 | Sun Oct 19 10:23:54 2008 | 11 | 11 + 11 | infinity | 11 | 11 +(12 rows) + +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp range between + '-infinity'::interval following and + 'infinity'::interval following); -- error, negative offset disallowed +ERROR: invalid preceding or following size in window function -- RANGE offset PRECEDING/FOLLOWING error cases select sum(salary) over (order by enroll_date, salary range between '1 year'::interval preceding and '2 years'::interval following exclude ties), salary, enroll_date from empsalary; @@ -3759,6 +4136,16 @@ WHERE c = 1; -> Seq Scan on empsalary (3 rows) +-- Try another case with a WindowFunc with a byref return type +SELECT * FROM + (SELECT row_number() OVER (PARTITION BY salary) AS rn, + lead(depname) OVER (PARTITION BY salary) || ' Department' AS n_dep + FROM empsalary) emp +WHERE rn < 1; + rn | n_dep +----+------- +(0 rows) + -- Some more complex cases with multiple window clauses EXPLAIN (COSTS OFF) SELECT * FROM @@ -3804,6 +4191,50 @@ SELECT * FROM sales | 3 | 4800 | 08-01-2007 | 3 | 1 | 3 | 3 | 1 (2 rows) +-- Ensure we remove references to reduced outer joins as nulling rels in run +-- conditions +EXPLAIN (COSTS OFF) +SELECT 1 FROM + (SELECT ntile(e2.salary) OVER (PARTITION BY e1.depname) AS c + FROM empsalary e1 LEFT JOIN empsalary e2 ON TRUE + WHERE e1.empno = e2.empno) s +WHERE s.c = 1; + QUERY PLAN +--------------------------------------------------------- + Subquery Scan on s + Filter: (s.c = 1) + -> WindowAgg + Run Condition: (ntile(e2.salary) OVER (?) <= 1) + -> Sort + Sort Key: e1.depname + -> Merge Join + Merge Cond: (e1.empno = e2.empno) + -> Sort + Sort Key: e1.empno + -> Seq Scan on empsalary e1 + -> Sort + Sort Key: e2.empno + -> Seq Scan on empsalary e2 +(14 rows) + +-- Ensure the run condition optimization is used in cases where the WindowFunc +-- has a Var from another query level +EXPLAIN (COSTS OFF) +SELECT 1 FROM + (SELECT ntile(s1.x) OVER () AS c + FROM (SELECT (SELECT 1) AS x) AS s1) s +WHERE s.c = 1; + QUERY PLAN +----------------------------------------------------------------- + Subquery Scan on s + Filter: (s.c = 1) + -> WindowAgg + Run Condition: (ntile((InitPlan 1).col1) OVER (?) <= 1) + InitPlan 1 + -> Result + -> Result +(7 rows) + -- Tests to ensure we don't push down the run condition when it's not valid to -- do so. -- Ensure we don't push down when the frame options show that the window @@ -3876,7 +4307,7 @@ WHERE c = 1; Subquery Scan on emp Filter: (emp.c = 1) -> WindowAgg - InitPlan 1 (returns $0) + InitPlan 1 -> Result -> Sort Sort Key: empsalary.empno DESC @@ -4375,6 +4806,52 @@ SELECT i,AVG(v::interval) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDE 4 | (4 rows) +-- moving aggregates over infinite intervals +SELECT x + ,avg(x) OVER(ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING ) as curr_next_avg + ,avg(x) OVER(ROWS BETWEEN 1 PRECEDING AND CURRENT ROW ) as prev_curr_avg + ,sum(x) OVER(ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING ) as curr_next_sum + ,sum(x) OVER(ROWS BETWEEN 1 PRECEDING AND CURRENT ROW ) as prev_curr_sum +FROM (VALUES (NULL::interval), + ('infinity'::interval), + ('-2147483648 days -2147483648 months -9223372036854775807 usecs'), -- extreme interval value + ('-infinity'::interval), + ('2147483647 days 2147483647 months 9223372036854775806 usecs'), -- extreme interval value + ('infinity'::interval), + ('6 days'::interval), + ('7 days'::interval), + (NULL::interval), + ('-infinity'::interval)) v(x); + x | curr_next_avg | prev_curr_avg | curr_next_sum | prev_curr_sum +------------------------------------------------------------------------------+-------------------+-------------------+---------------+--------------- + | infinity | | infinity | + infinity | infinity | infinity | infinity | infinity + @ 178956970 years 8 mons 2147483648 days 2562047788 hours 54.775807 secs ago | -infinity | infinity | -infinity | infinity + -infinity | -infinity | -infinity | -infinity | -infinity + @ 178956970 years 7 mons 2147483647 days 2562047788 hours 54.775806 secs | infinity | -infinity | infinity | -infinity + infinity | infinity | infinity | infinity | infinity + @ 6 days | @ 6 days 12 hours | infinity | @ 13 days | infinity + @ 7 days | @ 7 days | @ 6 days 12 hours | @ 7 days | @ 13 days + | -infinity | @ 7 days | -infinity | @ 7 days + -infinity | -infinity | -infinity | -infinity | -infinity +(10 rows) + +--should fail. +SELECT x, avg(x) OVER(ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) +FROM (VALUES (NULL::interval), + ('3 days'::interval), + ('infinity'::timestamptz - now()), + ('6 days'::interval), + ('-infinity'::interval)) v(x); +ERROR: interval out of range +--should fail. +SELECT x, sum(x) OVER(ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) +FROM (VALUES (NULL::interval), + ('3 days'::interval), + ('infinity'::timestamptz - now()), + ('6 days'::interval), + ('-infinity'::interval)) v(x); +ERROR: interval out of range SELECT i,SUM(v::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); i | sum @@ -4808,6 +5285,82 @@ SELECT i, b, bool_and(b) OVER w, bool_or(b) OVER w 5 | t | t | t (5 rows) +-- +-- Test WindowAgg costing takes into account the number of rows that need to +-- be fetched before the first row can be output. +-- +-- Ensure we get a cheap start up plan as the WindowAgg can output the first +-- row after reading 1 row from the join. +EXPLAIN (COSTS OFF) +SELECT COUNT(*) OVER (ORDER BY t1.unique1) +FROM tenk1 t1 INNER JOIN tenk1 t2 ON t1.unique1 = t2.tenthous +LIMIT 1; + QUERY PLAN +-------------------------------------------------------------------------- + Limit + -> WindowAgg + -> Nested Loop + -> Index Only Scan using tenk1_unique1 on tenk1 t1 + -> Index Only Scan using tenk1_thous_tenthous on tenk1 t2 + Index Cond: (tenthous = t1.unique1) +(6 rows) + +-- Ensure we get a cheap total plan. Lack of ORDER BY in the WindowClause +-- means that all rows must be read from the join, so a cheap startup plan +-- isn't a good choice. +EXPLAIN (COSTS OFF) +SELECT COUNT(*) OVER () +FROM tenk1 t1 INNER JOIN tenk1 t2 ON t1.unique1 = t2.tenthous +WHERE t2.two = 1 +LIMIT 1; + QUERY PLAN +------------------------------------------------------------------- + Limit + -> WindowAgg + -> Hash Join + Hash Cond: (t1.unique1 = t2.tenthous) + -> Index Only Scan using tenk1_unique1 on tenk1 t1 + -> Hash + -> Seq Scan on tenk1 t2 + Filter: (two = 1) +(8 rows) + +-- Ensure we get a cheap total plan. This time use UNBOUNDED FOLLOWING, which +-- needs to read all join rows to output the first WindowAgg row. +EXPLAIN (COSTS OFF) +SELECT COUNT(*) OVER (ORDER BY t1.unique1 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) +FROM tenk1 t1 INNER JOIN tenk1 t2 ON t1.unique1 = t2.tenthous +LIMIT 1; + QUERY PLAN +-------------------------------------------------------------------------------- + Limit + -> WindowAgg + -> Merge Join + Merge Cond: (t1.unique1 = t2.tenthous) + -> Index Only Scan using tenk1_unique1 on tenk1 t1 + -> Sort + Sort Key: t2.tenthous + -> Index Only Scan using tenk1_thous_tenthous on tenk1 t2 +(8 rows) + +-- Ensure we get a cheap total plan. This time use 10000 FOLLOWING so we need +-- to read all join rows. +EXPLAIN (COSTS OFF) +SELECT COUNT(*) OVER (ORDER BY t1.unique1 ROWS BETWEEN UNBOUNDED PRECEDING AND 10000 FOLLOWING) +FROM tenk1 t1 INNER JOIN tenk1 t2 ON t1.unique1 = t2.tenthous +LIMIT 1; + QUERY PLAN +-------------------------------------------------------------------------------- + Limit + -> WindowAgg + -> Merge Join + Merge Cond: (t1.unique1 = t2.tenthous) + -> Index Only Scan using tenk1_unique1 on tenk1 t1 + -> Sort + Sort Key: t2.tenthous + -> Index Only Scan using tenk1_thous_tenthous on tenk1 t2 +(8 rows) + -- Tests for problems with failure to walk or mutate expressions -- within window frame clauses. -- test walker (fails with collation error if expressions are not walked) diff --git a/src/test/regress/expected/with.out b/src/test/regress/expected/with.out index 88e57a2c8774f..0a8b48d5e93b0 100644 --- a/src/test/regress/expected/with.out +++ b/src/test/regress/expected/with.out @@ -51,11 +51,11 @@ SELECT * FROM t; -- UNION DISTINCT requires hashable type WITH RECURSIVE t(n) AS ( - VALUES (1::money) + VALUES ('01'::varbit) UNION - SELECT n+1::money FROM t WHERE n < 100::money + SELECT n || '10'::varbit FROM t WHERE n < '100'::varbit ) -SELECT sum(n) FROM t; +SELECT n FROM t; ERROR: could not implement recursive UNION DETAIL: All column datatypes must be hashable. -- recursive view @@ -636,6 +636,74 @@ SELECT t1.id, t2.path, t2 FROM t AS t1 JOIN t AS t2 ON 16 | {3,7,11,16} | (16,"{3,7,11,16}") (16 rows) +CREATE TEMP TABLE duplicates (a INT NOT NULL); +INSERT INTO duplicates VALUES(1), (1); +-- Try out a recursive UNION case where the non-recursive part's table slot +-- uses TTSOpsBufferHeapTuple and contains duplicate rows. +WITH RECURSIVE cte (a) as ( + SELECT a FROM duplicates + UNION + SELECT a FROM cte +) +SELECT a FROM cte; + a +--- + 1 +(1 row) + +-- test that column statistics from a materialized CTE are available +-- to upper planner (otherwise, we'd get a stupider plan) +explain (costs off) +with x as materialized (select unique1 from tenk1 b) +select count(*) from tenk1 a + where unique1 in (select * from x); + QUERY PLAN +------------------------------------------------------------ + Aggregate + CTE x + -> Index Only Scan using tenk1_unique1 on tenk1 b + -> Hash Semi Join + Hash Cond: (a.unique1 = x.unique1) + -> Index Only Scan using tenk1_unique1 on tenk1 a + -> Hash + -> CTE Scan on x +(8 rows) + +explain (costs off) +with x as materialized (insert into tenk1 default values returning unique1) +select count(*) from tenk1 a + where unique1 in (select * from x); + QUERY PLAN +------------------------------------------------------------ + Aggregate + CTE x + -> Insert on tenk1 + -> Result + -> Nested Loop + -> HashAggregate + Group Key: x.unique1 + -> CTE Scan on x + -> Index Only Scan using tenk1_unique1 on tenk1 a + Index Cond: (unique1 = x.unique1) +(10 rows) + +-- test that pathkeys from a materialized CTE are propagated up to the +-- outer query +explain (costs off) +with x as materialized (select unique1 from tenk1 b order by unique1) +select count(*) from tenk1 a + where unique1 in (select * from x); + QUERY PLAN +------------------------------------------------------------ + Aggregate + CTE x + -> Index Only Scan using tenk1_unique1 on tenk1 b + -> Merge Semi Join + Merge Cond: (a.unique1 = x.unique1) + -> Index Only Scan using tenk1_unique1 on tenk1 a + -> CTE Scan on x +(7 rows) + -- SEARCH clause create temp table graph0( f int, t int, label text ); insert into graph0 values @@ -1976,6 +2044,54 @@ WITH RECURSIVE x(n) AS (SELECT n FROM x UNION ALL SELECT 1) ERROR: recursive reference to query "x" must not appear within its non-recursive term LINE 1: WITH RECURSIVE x(n) AS (SELECT n FROM x UNION ALL SELECT 1) ^ +-- allow this, because we historically have +WITH RECURSIVE x(n) AS ( + WITH x1 AS (SELECT 1 AS n) + SELECT 0 + UNION + SELECT * FROM x1) + SELECT * FROM x; + n +--- + 0 + 1 +(2 rows) + +-- but this should be rejected +WITH RECURSIVE x(n) AS ( + WITH x1 AS (SELECT 1 FROM x) + SELECT 0 + UNION + SELECT * FROM x1) + SELECT * FROM x; +ERROR: recursive reference to query "x" must not appear within a subquery +LINE 2: WITH x1 AS (SELECT 1 FROM x) + ^ +-- and this too +WITH RECURSIVE x(n) AS ( + (WITH x1 AS (SELECT 1 FROM x) SELECT * FROM x1) + UNION + SELECT 0) + SELECT * FROM x; +ERROR: recursive reference to query "x" must not appear within its non-recursive term +LINE 2: (WITH x1 AS (SELECT 1 FROM x) SELECT * FROM x1) + ^ +-- and this +WITH RECURSIVE x(n) AS ( + SELECT 0 UNION SELECT 1 + ORDER BY (SELECT n FROM x)) + SELECT * FROM x; +ERROR: ORDER BY in a recursive query is not implemented +LINE 3: ORDER BY (SELECT n FROM x)) + ^ +-- and this +WITH RECURSIVE x(n) AS ( + WITH sub_cte AS (SELECT * FROM x) + DELETE FROM graph RETURNING f) + SELECT * FROM x; +ERROR: recursive query "x" must not contain data-modifying statements +LINE 1: WITH RECURSIVE x(n) AS ( + ^ CREATE TEMPORARY TABLE y (a INTEGER); INSERT INTO y SELECT generate_series(1, 10); -- LEFT JOIN @@ -3015,28 +3131,30 @@ WITH cte_basic AS MATERIALIZED (SELECT 1 a, 'cte_basic val' b) MERGE INTO m USING (select 0 k, 'merge source SubPlan' v offset 0) o ON m.k=o.k WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_basic WHERE cte_basic.a = m.k LIMIT 1) WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v); - QUERY PLAN ----------------------------------------------------------------- + QUERY PLAN +------------------------------------------------------------------- Merge on public.m CTE cte_basic -> Result Output: 1, 'cte_basic val'::text -> Hash Right Join - Output: m.ctid, (0), ('merge source SubPlan'::text) - Hash Cond: (m.k = (0)) + Output: m.ctid, o.k, o.v, o.* + Hash Cond: (m.k = o.k) -> Seq Scan on public.m Output: m.ctid, m.k -> Hash - Output: (0), ('merge source SubPlan'::text) - -> Result - Output: 0, 'merge source SubPlan'::text + Output: o.k, o.v, o.* + -> Subquery Scan on o + Output: o.k, o.v, o.* + -> Result + Output: 0, 'merge source SubPlan'::text SubPlan 2 -> Limit Output: ((cte_basic.b || ' merge update'::text)) -> CTE Scan on cte_basic Output: (cte_basic.b || ' merge update'::text) Filter: (cte_basic.a = m.k) -(19 rows) +(21 rows) -- InitPlan WITH cte_init AS MATERIALIZED (SELECT 1 a, 'cte_init val' b) @@ -3056,28 +3174,30 @@ WITH cte_init AS MATERIALIZED (SELECT 1 a, 'cte_init val' b) MERGE INTO m USING (select 1 k, 'merge source InitPlan' v offset 0) o ON m.k=o.k WHEN MATCHED THEN UPDATE SET v = (SELECT b || ' merge update' FROM cte_init WHERE a = 1 LIMIT 1) WHEN NOT MATCHED THEN INSERT VALUES(o.k, o.v); - QUERY PLAN ---------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------------- Merge on public.m CTE cte_init -> Result Output: 1, 'cte_init val'::text - InitPlan 2 (returns $1) + InitPlan 2 -> Limit Output: ((cte_init.b || ' merge update'::text)) -> CTE Scan on cte_init Output: (cte_init.b || ' merge update'::text) Filter: (cte_init.a = 1) -> Hash Right Join - Output: m.ctid, (1), ('merge source InitPlan'::text) - Hash Cond: (m.k = (1)) + Output: m.ctid, o.k, o.v, o.* + Hash Cond: (m.k = o.k) -> Seq Scan on public.m Output: m.ctid, m.k -> Hash - Output: (1), ('merge source InitPlan'::text) - -> Result - Output: 1, 'merge source InitPlan'::text -(19 rows) + Output: o.k, o.v, o.* + -> Subquery Scan on o + Output: o.k, o.v, o.* + -> Result + Output: 1, 'merge source InitPlan'::text +(21 rows) -- MERGE source comes from CTE: WITH merge_source_cte AS MATERIALIZED (SELECT 15 a, 'merge_source_cte val' b) @@ -3103,22 +3223,22 @@ WHEN NOT MATCHED THEN INSERT VALUES(o.a, o.b || (SELECT merge_source_cte.*::text CTE merge_source_cte -> Result Output: 15, 'merge_source_cte val'::text - InitPlan 2 (returns $1) + InitPlan 2 -> CTE Scan on merge_source_cte merge_source_cte_1 Output: ((merge_source_cte_1.b || (merge_source_cte_1.*)::text) || ' merge update'::text) Filter: (merge_source_cte_1.a = 15) - InitPlan 3 (returns $2) + InitPlan 3 -> CTE Scan on merge_source_cte merge_source_cte_2 Output: ((merge_source_cte_2.*)::text || ' merge insert'::text) -> Hash Right Join - Output: m.ctid, merge_source_cte.a, merge_source_cte.b + Output: m.ctid, merge_source_cte.a, merge_source_cte.b, merge_source_cte.* Hash Cond: (m.k = merge_source_cte.a) -> Seq Scan on public.m Output: m.ctid, m.k -> Hash - Output: merge_source_cte.a, merge_source_cte.b + Output: merge_source_cte.a, merge_source_cte.b, merge_source_cte.* -> CTE Scan on merge_source_cte - Output: merge_source_cte.a, merge_source_cte.b + Output: merge_source_cte.a, merge_source_cte.b, merge_source_cte.* (20 rows) DROP TABLE m; @@ -3453,6 +3573,16 @@ SELECT * FROM t; ERROR: WITH query "t" does not have a RETURNING clause LINE 4: SELECT * FROM t; ^ +-- RETURNING tries to return its own output +WITH RECURSIVE t(action, a) AS ( + MERGE INTO y USING (VALUES (11)) v(a) ON y.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a) + RETURNING merge_action(), (SELECT a FROM t) +) +SELECT * FROM t; +ERROR: recursive query "t" must not contain data-modifying statements +LINE 1: WITH RECURSIVE t(action, a) AS ( + ^ -- data-modifying WITH allowed only at the top level SELECT * FROM ( WITH t AS (UPDATE y SET a=a+1 RETURNING *) diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out index 398345ca67fe6..868479997d8ac 100644 --- a/src/test/regress/expected/xml.out +++ b/src/test/regress/expected/xml.out @@ -254,17 +254,11 @@ ERROR: invalid XML content DETAIL: line 1: xmlParseEntityRef: no name & ^ -line 1: chunk is not well balanced -& - ^ SELECT xmlparse(content '&idontexist;'); ERROR: invalid XML content DETAIL: line 1: Entity 'idontexist' not defined &idontexist; ^ -line 1: chunk is not well balanced -&idontexist; - ^ SELECT xmlparse(content ''); xmlparse --------------------------- @@ -283,9 +277,6 @@ DETAIL: line 1: Entity 'idontexist' not defined &idontexist; ^ line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced -&idontexist; - ^ -line 1: chunk is not well balanced &idontexist; ^ SELECT xmlparse(content ''); @@ -494,8 +485,7 @@ SELECT xmlserialize(DOCUMENT '42' AS text + 42+ + - + - + (1 row) SELECT xmlserialize(CONTENT '42' AS text INDENT); @@ -555,8 +545,7 @@ SELECT xmlserialize(DOCUMENT '42text node< 42 + text node73+ + - + - + (1 row) SELECT xmlserialize(CONTENT '42text node73' AS text INDENT); @@ -610,8 +599,7 @@ SELECT xmlserialize(DOCUMENT ' + 73 + + - + - + (1 row) SELECT xmlserialize(CONTENT '73' AS text INDENT); @@ -629,8 +617,7 @@ SELECT xmlserialize(DOCUMENT '' AS text INDENT); xmlserialize -------------- + - + - + (1 row) SELECT xmlserialize(CONTENT '' AS text INDENT); @@ -647,8 +634,7 @@ SELECT xmlserialize(DOCUMENT '' AS text INDENT); -------------- + + - + - + (1 row) SELECT xmlserialize(CONTENT '' AS text INDENT); @@ -672,6 +658,24 @@ SELECT xmlserialize(CONTENT '42' AS text t (1 row) +-- indent xml strings containing blank nodes +SELECT xmlserialize(DOCUMENT ' ' AS text INDENT); + xmlserialize +-------------- + + + + + +(1 row) + +SELECT xmlserialize(CONTENT 'text node ' AS text INDENT); + xmlserialize +-------------- + text node + + + + + + +(1 row) + SELECT xml 'bar' IS DOCUMENT; ?column? ---------- @@ -818,21 +822,25 @@ CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); CREATE VIEW xmlview7 AS SELECT xmlroot(xml '', version no value, standalone yes); CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); +CREATE VIEW xmlview10 AS SELECT xmlserialize(document '42' AS text indent); +CREATE VIEW xmlview11 AS SELECT xmlserialize(document '42' AS character varying no indent); SELECT table_name, view_definition FROM information_schema.views WHERE table_name LIKE 'xmlview%' ORDER BY 1; - table_name | view_definition -------------+------------------------------------------------------------------------------------------------------------ + table_name | view_definition +------------+--------------------------------------------------------------------------------------------------------------------------------------- xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment; + xmlview10 | SELECT XMLSERIALIZE(DOCUMENT '42'::xml AS text INDENT) AS "xmlserialize"; + xmlview11 | SELECT (XMLSERIALIZE(DOCUMENT '42'::xml AS character varying NO INDENT))::character varying AS "xmlserialize"; xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat"; xmlview3 | SELECT XMLELEMENT(NAME element, XMLATTRIBUTES(1 AS ":one:", 'deuce' AS two), 'content&') AS "xmlelement"; - xmlview4 | SELECT XMLELEMENT(NAME employee, XMLFOREST(name AS name, age AS age, salary AS pay)) AS "xmlelement" + + xmlview4 | SELECT XMLELEMENT(NAME employee, XMLFOREST(name AS name, age AS age, salary AS pay)) AS "xmlelement" + | FROM emp; xmlview5 | SELECT XMLPARSE(CONTENT 'x'::text STRIP WHITESPACE) AS "xmlparse"; xmlview6 | SELECT XMLPI(NAME foo, 'bar'::text) AS "xmlpi"; xmlview7 | SELECT XMLROOT(''::xml, VERSION NO VALUE, STANDALONE YES) AS "xmlroot"; - xmlview8 | SELECT (XMLSERIALIZE(CONTENT 'good'::xml AS character(10)))::character(10) AS "xmlserialize"; - xmlview9 | SELECT XMLSERIALIZE(CONTENT 'good'::xml AS text) AS "xmlserialize"; -(9 rows) + xmlview8 | SELECT (XMLSERIALIZE(CONTENT 'good'::xml AS character(10) NO INDENT))::character(10) AS "xmlserialize"; + xmlview9 | SELECT XMLSERIALIZE(CONTENT 'good'::xml AS text NO INDENT) AS "xmlserialize"; +(11 rows) -- Text XPath expressions evaluation SELECT xpath('/value', data) FROM xmltest; @@ -1375,16 +1383,20 @@ SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), 10 (1 row) -CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), - '/zz:rows/zz:row' +CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS "Zz"), + '/Zz:rows/Zz:row' PASSING '10' - COLUMNS a int PATH 'zz:a'); + COLUMNS a int PATH 'Zz:a'); SELECT * FROM xmltableview2; a ---- 10 (1 row) +\sv xmltableview2 +CREATE OR REPLACE VIEW public.xmltableview2 AS + SELECT a + FROM XMLTABLE(XMLNAMESPACES ('http://x.y'::text AS "Zz"), ('/Zz:rows/Zz:row'::text) PASSING ('10'::xml) COLUMNS a integer PATH ('Zz:a'::text)) SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'), '/rows/row' PASSING '10' @@ -1549,19 +1561,60 @@ SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" (1 row) EXPLAIN (VERBOSE, COSTS OFF) -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; +SELECT f.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) AS f WHERE "COUNTRY_NAME" = 'Japan'; QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Nested Loop - Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + Output: f."COUNTRY_NAME", f."REGION_ID" -> Seq Scan on public.xmldata Output: xmldata.data - -> Table Function Scan on "xmltable" - Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + -> Table Function Scan on "xmltable" f + Output: f."COUNTRY_NAME", f."REGION_ID" Table Function Call: XMLTABLE(('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]'::text) PASSING (xmldata.data) COLUMNS "COUNTRY_NAME" text, "REGION_ID" integer) - Filter: ("xmltable"."COUNTRY_NAME" = 'Japan'::text) + Filter: (f."COUNTRY_NAME" = 'Japan'::text) (8 rows) +EXPLAIN (VERBOSE, FORMAT JSON, COSTS OFF) +SELECT f.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) AS f WHERE "COUNTRY_NAME" = 'Japan'; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + [ + + { + + "Plan": { + + "Node Type": "Nested Loop", + + "Parallel Aware": false, + + "Async Capable": false, + + "Join Type": "Inner", + + "Output": ["f.\"COUNTRY_NAME\"", "f.\"REGION_ID\""], + + "Inner Unique": false, + + "Plans": [ + + { + + "Node Type": "Seq Scan", + + "Parent Relationship": "Outer", + + "Parallel Aware": false, + + "Async Capable": false, + + "Relation Name": "xmldata", + + "Schema": "public", + + "Alias": "xmldata", + + "Output": ["xmldata.data"] + + }, + + { + + "Node Type": "Table Function Scan", + + "Parent Relationship": "Inner", + + "Parallel Aware": false, + + "Async Capable": false, + + "Table Function Name": "xmltable", + + "Alias": "f", + + "Output": ["f.\"COUNTRY_NAME\"", "f.\"REGION_ID\""], + + "Table Function Call": "XMLTABLE(('/ROWS/ROW[COUNTRY_NAME=\"Japan\" or COUNTRY_NAME=\"India\"]'::text) PASSING (xmldata.data) COLUMNS \"COUNTRY_NAME\" text, \"REGION_ID\" integer)",+ + "Filter": "(f.\"COUNTRY_NAME\" = 'Japan'::text)" + + } + + ] + + } + + } + + ] +(1 row) + -- should to work with more data INSERT INTO xmldata VALUES(' @@ -1785,3 +1838,39 @@ SELECT * FROM XMLTABLE('.' PASSING XMLELEMENT(NAME a) columns a varchar(20) PATH | <foo/> (1 row) +SELECT xmltext(NULL); + xmltext +--------- + +(1 row) + +SELECT xmltext(''); + xmltext +--------- + +(1 row) + +SELECT xmltext(' '); + xmltext +--------- + +(1 row) + +SELECT xmltext('foo `$_-+?=*^%!|/\()[]{}'); + xmltext +-------------------------- + foo `$_-+?=*^%!|/\()[]{} +(1 row) + +SELECT xmltext('foo & <"bar">'); + xmltext +----------------------------------- + foo & <"bar"> +(1 row) + +SELECT xmltext('x'|| '

73

'::xml || .42 || true || 'j'::char); + xmltext +--------------------------------- + x<P>73</P>0.42truej +(1 row) + diff --git a/src/test/regress/expected/xml_1.out b/src/test/regress/expected/xml_1.out index 63b779470ff6d..4e8f65de0416b 100644 --- a/src/test/regress/expected/xml_1.out +++ b/src/test/regress/expected/xml_1.out @@ -443,6 +443,17 @@ ERROR: unsupported XML feature LINE 1: SELECT xmlserialize(CONTENT '42<... ^ DETAIL: This functionality requires the server to be built with libxml support. +-- indent xml strings containing blank nodes +SELECT xmlserialize(DOCUMENT ' ' AS text INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(DOCUMENT ' '... + ^ +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmlserialize(CONTENT 'text node ' AS text INDENT); +ERROR: unsupported XML feature +LINE 1: SELECT xmlserialize(CONTENT 'text node ... + ^ +DETAIL: This functionality requires the server to be built with libxml support. SELECT xml 'bar' IS DOCUMENT; ERROR: unsupported XML feature LINE 1: SELECT xml 'bar' IS DOCUMENT; @@ -572,6 +583,16 @@ ERROR: unsupported XML feature LINE 1: ...EATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as ... ^ DETAIL: This functionality requires the server to be built with libxml support. +CREATE VIEW xmlview10 AS SELECT xmlserialize(document '42' AS text indent); +ERROR: unsupported XML feature +LINE 1: ...TE VIEW xmlview10 AS SELECT xmlserialize(document '42' AS character varying no indent); +ERROR: unsupported XML feature +LINE 1: ...TE VIEW xmlview11 AS SELECT xmlserialize(document '10
' - COLUMNS a int PATH 'zz:a'); + COLUMNS a int PATH 'Zz:a'); ERROR: unsupported XML feature LINE 3: PASSING '10' @@ -1174,19 +1197,60 @@ SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" (0 rows) EXPLAIN (VERBOSE, COSTS OFF) -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; +SELECT f.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) AS f WHERE "COUNTRY_NAME" = 'Japan'; QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Nested Loop - Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + Output: f."COUNTRY_NAME", f."REGION_ID" -> Seq Scan on public.xmldata Output: xmldata.data - -> Table Function Scan on "xmltable" - Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + -> Table Function Scan on "xmltable" f + Output: f."COUNTRY_NAME", f."REGION_ID" Table Function Call: XMLTABLE(('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]'::text) PASSING (xmldata.data) COLUMNS "COUNTRY_NAME" text, "REGION_ID" integer) - Filter: ("xmltable"."COUNTRY_NAME" = 'Japan'::text) + Filter: (f."COUNTRY_NAME" = 'Japan'::text) (8 rows) +EXPLAIN (VERBOSE, FORMAT JSON, COSTS OFF) +SELECT f.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) AS f WHERE "COUNTRY_NAME" = 'Japan'; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + [ + + { + + "Plan": { + + "Node Type": "Nested Loop", + + "Parallel Aware": false, + + "Async Capable": false, + + "Join Type": "Inner", + + "Output": ["f.\"COUNTRY_NAME\"", "f.\"REGION_ID\""], + + "Inner Unique": false, + + "Plans": [ + + { + + "Node Type": "Seq Scan", + + "Parent Relationship": "Outer", + + "Parallel Aware": false, + + "Async Capable": false, + + "Relation Name": "xmldata", + + "Schema": "public", + + "Alias": "xmldata", + + "Output": ["xmldata.data"] + + }, + + { + + "Node Type": "Table Function Scan", + + "Parent Relationship": "Inner", + + "Parallel Aware": false, + + "Async Capable": false, + + "Table Function Name": "xmltable", + + "Alias": "f", + + "Output": ["f.\"COUNTRY_NAME\"", "f.\"REGION_ID\""], + + "Table Function Call": "XMLTABLE(('/ROWS/ROW[COUNTRY_NAME=\"Japan\" or COUNTRY_NAME=\"India\"]'::text) PASSING (xmldata.data) COLUMNS \"COUNTRY_NAME\" text, \"REGION_ID\" integer)",+ + "Filter": "(f.\"COUNTRY_NAME\" = 'Japan'::text)" + + } + + ] + + } + + } + + ] +(1 row) + -- should to work with more data INSERT INTO xmldata VALUES(' @@ -1402,3 +1466,26 @@ DETAIL: This functionality requires the server to be built with libxml support. SELECT * FROM XMLTABLE('.' PASSING XMLELEMENT(NAME a) columns a varchar(20) PATH '""', b xml PATH '""'); ERROR: unsupported XML feature DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmltext(NULL); + xmltext +--------- + +(1 row) + +SELECT xmltext(''); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmltext(' '); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmltext('foo `$_-+?=*^%!|/\()[]{}'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmltext('foo & <"bar">'); +ERROR: unsupported XML feature +DETAIL: This functionality requires the server to be built with libxml support. +SELECT xmltext('x'|| '

73

'::xml || .42 || true || 'j'::char); +ERROR: unsupported XML feature +LINE 1: SELECT xmltext('x'|| '

73

'::xml || .42 || true || 'j':... + ^ +DETAIL: This functionality requires the server to be built with libxml support. diff --git a/src/test/regress/expected/xml_2.out b/src/test/regress/expected/xml_2.out index 43c2558352a3a..4e71cd4f26638 100644 --- a/src/test/regress/expected/xml_2.out +++ b/src/test/regress/expected/xml_2.out @@ -250,13 +250,11 @@ ERROR: invalid XML content DETAIL: line 1: xmlParseEntityRef: no name & ^ -line 1: chunk is not well balanced SELECT xmlparse(content '&idontexist;'); ERROR: invalid XML content DETAIL: line 1: Entity 'idontexist' not defined &idontexist; ^ -line 1: chunk is not well balanced SELECT xmlparse(content ''); xmlparse --------------------------- @@ -275,7 +273,6 @@ DETAIL: line 1: Entity 'idontexist' not defined &idontexist; ^ line 1: Opening and ending tag mismatch: twoerrors line 1 and unbalanced -line 1: chunk is not well balanced SELECT xmlparse(content ''); xmlparse --------------------- @@ -474,8 +471,7 @@ SELECT xmlserialize(DOCUMENT '42' AS text + 42+ + -
+ - +
(1 row) SELECT xmlserialize(CONTENT '42' AS text INDENT); @@ -535,8 +531,7 @@ SELECT xmlserialize(DOCUMENT '42text node< 42 + text node73+ + - + - + (1 row) SELECT xmlserialize(CONTENT '42text node73' AS text INDENT); @@ -590,8 +585,7 @@ SELECT xmlserialize(DOCUMENT ' + 73 + + - + - + (1 row) SELECT xmlserialize(CONTENT '73' AS text INDENT); @@ -609,8 +603,7 @@ SELECT xmlserialize(DOCUMENT '' AS text INDENT); xmlserialize -------------- + - + - + (1 row) SELECT xmlserialize(CONTENT '' AS text INDENT); @@ -627,8 +620,7 @@ SELECT xmlserialize(DOCUMENT '' AS text INDENT); -------------- + + - + - + (1 row) SELECT xmlserialize(CONTENT '' AS text INDENT); @@ -652,6 +644,24 @@ SELECT xmlserialize(CONTENT '42' AS text t (1 row) +-- indent xml strings containing blank nodes +SELECT xmlserialize(DOCUMENT ' ' AS text INDENT); + xmlserialize +-------------- + + + + + +(1 row) + +SELECT xmlserialize(CONTENT 'text node ' AS text INDENT); + xmlserialize +-------------- + text node + + + + + + +(1 row) + SELECT xml 'bar' IS DOCUMENT; ?column? ---------- @@ -798,21 +808,25 @@ CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); CREATE VIEW xmlview7 AS SELECT xmlroot(xml '', version no value, standalone yes); CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); +CREATE VIEW xmlview10 AS SELECT xmlserialize(document '42' AS text indent); +CREATE VIEW xmlview11 AS SELECT xmlserialize(document '42' AS character varying no indent); SELECT table_name, view_definition FROM information_schema.views WHERE table_name LIKE 'xmlview%' ORDER BY 1; - table_name | view_definition -------------+------------------------------------------------------------------------------------------------------------ + table_name | view_definition +------------+--------------------------------------------------------------------------------------------------------------------------------------- xmlview1 | SELECT xmlcomment('test'::text) AS xmlcomment; + xmlview10 | SELECT XMLSERIALIZE(DOCUMENT '42'::xml AS text INDENT) AS "xmlserialize"; + xmlview11 | SELECT (XMLSERIALIZE(DOCUMENT '42'::xml AS character varying NO INDENT))::character varying AS "xmlserialize"; xmlview2 | SELECT XMLCONCAT('hello'::xml, 'you'::xml) AS "xmlconcat"; xmlview3 | SELECT XMLELEMENT(NAME element, XMLATTRIBUTES(1 AS ":one:", 'deuce' AS two), 'content&') AS "xmlelement"; - xmlview4 | SELECT XMLELEMENT(NAME employee, XMLFOREST(name AS name, age AS age, salary AS pay)) AS "xmlelement" + + xmlview4 | SELECT XMLELEMENT(NAME employee, XMLFOREST(name AS name, age AS age, salary AS pay)) AS "xmlelement" + | FROM emp; xmlview5 | SELECT XMLPARSE(CONTENT 'x'::text STRIP WHITESPACE) AS "xmlparse"; xmlview6 | SELECT XMLPI(NAME foo, 'bar'::text) AS "xmlpi"; xmlview7 | SELECT XMLROOT(''::xml, VERSION NO VALUE, STANDALONE YES) AS "xmlroot"; - xmlview8 | SELECT (XMLSERIALIZE(CONTENT 'good'::xml AS character(10)))::character(10) AS "xmlserialize"; - xmlview9 | SELECT XMLSERIALIZE(CONTENT 'good'::xml AS text) AS "xmlserialize"; -(9 rows) + xmlview8 | SELECT (XMLSERIALIZE(CONTENT 'good'::xml AS character(10) NO INDENT))::character(10) AS "xmlserialize"; + xmlview9 | SELECT XMLSERIALIZE(CONTENT 'good'::xml AS text NO INDENT) AS "xmlserialize"; +(11 rows) -- Text XPath expressions evaluation SELECT xpath('/value', data) FROM xmltest; @@ -1355,16 +1369,20 @@ SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), 10 (1 row) -CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), - '/zz:rows/zz:row' +CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS "Zz"), + '/Zz:rows/Zz:row' PASSING '10
' - COLUMNS a int PATH 'zz:a'); + COLUMNS a int PATH 'Zz:a'); SELECT * FROM xmltableview2; a ---- 10 (1 row) +\sv xmltableview2 +CREATE OR REPLACE VIEW public.xmltableview2 AS + SELECT a + FROM XMLTABLE(XMLNAMESPACES ('http://x.y'::text AS "Zz"), ('/Zz:rows/Zz:row'::text) PASSING ('10'::xml) COLUMNS a integer PATH ('Zz:a'::text)) SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'), '/rows/row' PASSING '10' @@ -1529,19 +1547,60 @@ SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" (1 row) EXPLAIN (VERBOSE, COSTS OFF) -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; +SELECT f.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) AS f WHERE "COUNTRY_NAME" = 'Japan'; QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Nested Loop - Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + Output: f."COUNTRY_NAME", f."REGION_ID" -> Seq Scan on public.xmldata Output: xmldata.data - -> Table Function Scan on "xmltable" - Output: "xmltable"."COUNTRY_NAME", "xmltable"."REGION_ID" + -> Table Function Scan on "xmltable" f + Output: f."COUNTRY_NAME", f."REGION_ID" Table Function Call: XMLTABLE(('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]'::text) PASSING (xmldata.data) COLUMNS "COUNTRY_NAME" text, "REGION_ID" integer) - Filter: ("xmltable"."COUNTRY_NAME" = 'Japan'::text) + Filter: (f."COUNTRY_NAME" = 'Japan'::text) (8 rows) +EXPLAIN (VERBOSE, FORMAT JSON, COSTS OFF) +SELECT f.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) AS f WHERE "COUNTRY_NAME" = 'Japan'; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- + [ + + { + + "Plan": { + + "Node Type": "Nested Loop", + + "Parallel Aware": false, + + "Async Capable": false, + + "Join Type": "Inner", + + "Output": ["f.\"COUNTRY_NAME\"", "f.\"REGION_ID\""], + + "Inner Unique": false, + + "Plans": [ + + { + + "Node Type": "Seq Scan", + + "Parent Relationship": "Outer", + + "Parallel Aware": false, + + "Async Capable": false, + + "Relation Name": "xmldata", + + "Schema": "public", + + "Alias": "xmldata", + + "Output": ["xmldata.data"] + + }, + + { + + "Node Type": "Table Function Scan", + + "Parent Relationship": "Inner", + + "Parallel Aware": false, + + "Async Capable": false, + + "Table Function Name": "xmltable", + + "Alias": "f", + + "Output": ["f.\"COUNTRY_NAME\"", "f.\"REGION_ID\""], + + "Table Function Call": "XMLTABLE(('/ROWS/ROW[COUNTRY_NAME=\"Japan\" or COUNTRY_NAME=\"India\"]'::text) PASSING (xmldata.data) COLUMNS \"COUNTRY_NAME\" text, \"REGION_ID\" integer)",+ + "Filter": "(f.\"COUNTRY_NAME\" = 'Japan'::text)" + + } + + ] + + } + + } + + ] +(1 row) + -- should to work with more data INSERT INTO xmldata VALUES(' @@ -1765,3 +1824,39 @@ SELECT * FROM XMLTABLE('.' PASSING XMLELEMENT(NAME a) columns a varchar(20) PATH | <foo/> (1 row) +SELECT xmltext(NULL); + xmltext +--------- + +(1 row) + +SELECT xmltext(''); + xmltext +--------- + +(1 row) + +SELECT xmltext(' '); + xmltext +--------- + +(1 row) + +SELECT xmltext('foo `$_-+?=*^%!|/\()[]{}'); + xmltext +-------------------------- + foo `$_-+?=*^%!|/\()[]{} +(1 row) + +SELECT xmltext('foo & <"bar">'); + xmltext +----------------------------------- + foo & <"bar"> +(1 row) + +SELECT xmltext('x'|| '

73

'::xml || .42 || true || 'j'::char); + xmltext +--------------------------------- + x<P>73</P>0.42truej +(1 row) + diff --git a/src/test/regress/meson.build b/src/test/regress/meson.build index a045c00c1f652..5a9be73531e9c 100644 --- a/src/test/regress/meson.build +++ b/src/test/regress/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # also used by isolationtester and ecpg tests pg_regress_c = files('pg_regress.c') @@ -30,7 +30,7 @@ endif pg_regress = executable('pg_regress', regress_sources, c_args: pg_regress_cflags, - dependencies: [frontend_code], + dependencies: [frontend_code, libpq], kwargs: default_bin_args + { 'install_dir': dir_pgxs / 'src/test/regress', }, diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index cf46fa3359325..36aeea6bd3d56 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -28,7 +28,7 @@ test: strings md5 numerology point lseg line box path polygon circle date time t # geometry depends on point, lseg, line, box, path, polygon, circle # horology depends on date, time, timetz, timestamp, timestamptz, interval # ---------- -test: geometry horology tstypes regex type_sanity opr_sanity misc_sanity comments expressions unicode xid mvcc +test: geometry horology tstypes regex type_sanity opr_sanity misc_sanity comments expressions unicode xid mvcc database # ---------- # Load huge amounts of data @@ -78,9 +78,9 @@ test: brin_bloom brin_multi # psql depends on create_am # amutils depends on geometry, create_index_spgist, hash_index, brin # ---------- -test: create_table_like alter_generic alter_operator misc async dbsize merge misc_functions sysviews tsrf tid tidscan tidrangescan collate.icu.utf8 incremental_sort create_role +test: create_table_like alter_generic alter_operator misc async dbsize merge misc_functions sysviews tsrf tid tidscan tidrangescan collate.utf8 collate.icu.utf8 incremental_sort create_role -# collate.*.utf8 tests cannot be run in parallel with each other +# collate.linux.utf8 and collate.icu.utf8 tests cannot be run in parallel with each other test: rules psql psql_crosstab amutils stats_ext collate.linux.utf8 collate.windows.win1252 # ---------- @@ -91,6 +91,10 @@ test: select_parallel test: write_parallel test: vacuum_parallel +# Run this alone, because concurrent DROP TABLE would make non-superuser +# "ANALYZE;" fail with "relation with OID $n does not exist". +test: maintain_every + # no relation related tests can be put in this group test: publication subscription @@ -103,7 +107,7 @@ test: select_views portals_p2 foreign_key cluster dependency guc bitmapops combo # ---------- # Another group of parallel tests (JSON related) # ---------- -test: json jsonb json_encoding jsonpath jsonpath_encoding jsonb_jsonpath sqljson +test: json jsonb json_encoding jsonpath jsonpath_encoding jsonb_jsonpath sqljson sqljson_queryfuncs sqljson_jsontable # ---------- # Another group of parallel tests @@ -119,11 +123,16 @@ test: plancache limit plpgsql copy2 temp domain rangefuncs prepare conversion tr # The stats test resets stats, so nothing else needing stats access can be in # this group. # ---------- -test: partition_join partition_prune reloptions hash_part indexing partition_aggregate partition_info tuplesort explain compression memoize stats +test: partition_join partition_prune reloptions hash_part indexing partition_aggregate partition_info tuplesort explain compression memoize stats predicate -# event_trigger cannot run concurrently with any test that runs DDL +# event_trigger depends on create_am and cannot run concurrently with +# any test that runs DDL # oidjoins is read-only, though, and should run late for best coverage -test: event_trigger oidjoins +test: oidjoins event_trigger + +# event_trigger_login cannot run concurrently with any other tests because +# on-login event handling could catch connection of a concurrent test. +test: event_trigger_login # this test also uses event triggers, so likewise run it by itself test: fast_default diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c index 60d34a40b20d8..53435c474200b 100644 --- a/src/test/regress/pg_regress.c +++ b/src/test/regress/pg_regress.c @@ -8,7 +8,7 @@ * * This code is released under the terms of the PostgreSQL License. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/test/regress/pg_regress.c @@ -32,6 +32,7 @@ #include "common/username.h" #include "getopt_long.h" #include "lib/stringinfo.h" +#include "libpq-fe.h" #include "libpq/pqcomm.h" /* needed for UNIXSOCK_PATH() */ #include "pg_config_paths.h" #include "pg_regress.h" @@ -64,8 +65,8 @@ static char *shellprog = SHELLPROG; const char *basic_diff_opts = ""; const char *pretty_diff_opts = "-U3"; #else -const char *basic_diff_opts = "-w"; -const char *pretty_diff_opts = "-w -U3"; +const char *basic_diff_opts = "--strip-trailing-cr"; +const char *pretty_diff_opts = "--strip-trailing-cr -U3"; #endif /* @@ -75,6 +76,12 @@ const char *pretty_diff_opts = "-w -U3"; */ #define TESTNAME_WIDTH 36 +/* + * The number times per second that pg_regress checks to see if the test + * instance server has started and is available for connection. + */ +#define WAIT_TICKS_PER_SECOND 20 + typedef enum TAPtype { DIAG = 0, @@ -84,7 +91,7 @@ typedef enum TAPtype NOTE_END, TEST_STATUS, PLAN, - NONE + NONE, } TAPtype; /* options settable from command line */ @@ -107,6 +114,7 @@ static bool nolocale = false; static bool use_existing = false; static char *hostname = NULL; static int port = -1; +static char portstr[16]; static bool port_specified_by_user = false; static char *dlpath = PKGLIBDIR; static char *user = NULL; @@ -333,6 +341,14 @@ emit_tap_output_v(TAPtype type, const char *fmt, va_list argp) { va_list argp_logfile; FILE *fp; + int save_errno; + + /* + * The fprintf() calls used to output TAP-protocol elements might clobber + * errno, so save it here and restore it before vfprintf()-ing the user's + * format string, in case it contains %m placeholders. + */ + save_errno = errno; /* * Diagnostic output will be hidden by prove unless printed to stderr. The @@ -371,9 +387,13 @@ emit_tap_output_v(TAPtype type, const char *fmt, va_list argp) if (logfile) fprintf(logfile, "# "); } + errno = save_errno; vfprintf(fp, fmt, argp); if (logfile) + { + errno = save_errno; vfprintf(logfile, fmt, argp_logfile); + } /* * If we are entering into a note with more details to follow, register @@ -484,10 +504,7 @@ make_temp_sockdir(void) temp_sockdir = mkdtemp(template); if (temp_sockdir == NULL) - { - bail("could not create directory \"%s\": %s", - template, strerror(errno)); - } + bail("could not create directory \"%s\": %m", template); /* Stage file names for remove_temp(). Unsafe in a signal handler. */ UNIXSOCK_PATH(sockself, port, temp_sockdir); @@ -608,8 +625,7 @@ load_resultmap(void) /* OK if it doesn't exist, else complain */ if (errno == ENOENT) return; - bail("could not open file \"%s\" for reading: %s", - buf, strerror(errno)); + bail("could not open file \"%s\" for reading: %m", buf); } while (fgets(buf, sizeof(buf), f)) @@ -761,7 +777,7 @@ initialize_environment(void) /* * Set timezone and datestyle for datetime-related tests */ - setenv("PGTZ", "PST8PDT", 1); + setenv("PGTZ", "America/Los_Angeles", 1); setenv("PGDATESTYLE", "Postgres, MDY", 1); /* @@ -837,7 +853,7 @@ initialize_environment(void) { char s[16]; - sprintf(s, "%d", port); + snprintf(s, sizeof(s), "%d", port); setenv("PGPORT", s, 1); } } @@ -859,7 +875,7 @@ initialize_environment(void) { char s[16]; - sprintf(s, "%d", port); + snprintf(s, sizeof(s), "%d", port); setenv("PGPORT", s, 1); } if (user != NULL) @@ -1038,10 +1054,7 @@ config_sspi_auth(const char *pgdata, const char *superuser_name) #define CW(cond) \ do { \ if (!(cond)) \ - { \ - bail("could not write to file \"%s\": %s", \ - fname, strerror(errno)); \ - } \ + bail("could not write to file \"%s\": %m", fname); \ } while (0) res = snprintf(fname, sizeof(fname), "%s/pg_hba.conf", pgdata); @@ -1056,8 +1069,7 @@ config_sspi_auth(const char *pgdata, const char *superuser_name) hba = fopen(fname, "w"); if (hba == NULL) { - bail("could not open file \"%s\" for writing: %s", - fname, strerror(errno)); + bail("could not open file \"%s\" for writing: %m", fname); } CW(fputs("# Configuration written by config_sspi_auth()\n", hba) >= 0); CW(fputs("host all all 127.0.0.1/32 sspi include_realm=1 map=regress\n", @@ -1071,8 +1083,7 @@ config_sspi_auth(const char *pgdata, const char *superuser_name) ident = fopen(fname, "w"); if (ident == NULL) { - bail("could not open file \"%s\" for writing: %s", - fname, strerror(errno)); + bail("could not open file \"%s\" for writing: %m", fname); } CW(fputs("# Configuration written by config_sspi_auth()\n", ident) >= 0); @@ -1166,8 +1177,7 @@ psql_end_command(StringInfo buf, const char *database) } /* Clean up */ - pfree(buf->data); - pfree(buf); + destroyStringInfo(buf); } /* @@ -1203,7 +1213,7 @@ spawn_process(const char *cmdline) pid = fork(); if (pid == -1) { - bail("could not fork: %s", strerror(errno)); + bail("could not fork: %m"); } if (pid == 0) { @@ -1219,14 +1229,13 @@ spawn_process(const char *cmdline) cmdline2 = psprintf("exec %s", cmdline); execl(shellprog, shellprog, "-c", cmdline2, (char *) NULL); /* Not using the normal bail() here as we want _exit */ - bail_noatexit("could not exec \"%s\": %s", shellprog, strerror(errno)); + bail_noatexit("could not exec \"%s\": %m", shellprog); } /* in parent */ return pid; #else PROCESS_INFORMATION pi; char *cmdline2; - HANDLE restrictedToken; const char *comspec; /* Find CMD.EXE location using COMSPEC, if it's set */ @@ -1237,8 +1246,7 @@ spawn_process(const char *cmdline) memset(&pi, 0, sizeof(pi)); cmdline2 = psprintf("\"%s\" /c \"%s\"", comspec, cmdline); - if ((restrictedToken = - CreateRestrictedProcess(cmdline2, &pi)) == 0) + if (!CreateRestrictedProcess(cmdline2, &pi)) exit(2); CloseHandle(pi.hThread); @@ -1257,8 +1265,7 @@ file_size(const char *file) if (!f) { - diag("could not open file \"%s\" for reading: %s", - file, strerror(errno)); + diag("could not open file \"%s\" for reading: %m", file); return -1; } fseek(f, 0, SEEK_END); @@ -1279,8 +1286,7 @@ file_line_count(const char *file) if (!f) { - diag("could not open file \"%s\" for reading: %s", - file, strerror(errno)); + diag("could not open file \"%s\" for reading: %m", file); return -1; } while ((c = fgetc(f)) != EOF) @@ -1320,9 +1326,7 @@ static void make_directory(const char *dir) { if (mkdir(dir, S_IRWXU | S_IRWXG | S_IRWXO) < 0) - { - bail("could not create directory \"%s\": %s", dir, strerror(errno)); - } + bail("could not create directory \"%s\": %m", dir); } /* @@ -1451,10 +1455,7 @@ results_differ(const char *testname, const char *resultsfile, const char *defaul alt_expectfile = get_alternative_expectfile(expectfile, i); if (!alt_expectfile) - { - bail("Unable to check secondary comparison files: %s", - strerror(errno)); - } + bail("Unable to check secondary comparison files: %m"); if (!file_exists(alt_expectfile)) { @@ -1567,9 +1568,7 @@ wait_for_tests(PID_TYPE * pids, int *statuses, instr_time *stoptimes, p = wait(&exit_status); if (p == INVALID_PID) - { - bail("failed to wait for subprocesses: %s", strerror(errno)); - } + bail("failed to wait for subprocesses: %m"); #else DWORD exit_status; int r; @@ -1659,10 +1658,7 @@ run_schedule(const char *schedule, test_start_function startfunc, scf = fopen(schedule, "r"); if (!scf) - { - bail("could not open file \"%s\" for reading: %s", - schedule, strerror(errno)); - } + bail("could not open file \"%s\" for reading: %m", schedule); while (fgets(scbuf, sizeof(scbuf), scf)) { @@ -1926,20 +1922,15 @@ open_result_files(void) logfilename = pg_strdup(file); logfile = fopen(logfilename, "w"); if (!logfile) - { - bail("could not open file \"%s\" for writing: %s", - logfilename, strerror(errno)); - } + bail("could not open file \"%s\" for writing: %m", logfilename); /* create the diffs file as empty */ snprintf(file, sizeof(file), "%s/regression.diffs", outputdir); difffilename = pg_strdup(file); difffile = fopen(difffilename, "w"); if (!difffile) - { - bail("could not open file \"%s\" for writing: %s", - difffilename, strerror(errno)); - } + bail("could not open file \"%s\" for writing: %m", difffilename); + /* we don't keep the diffs file open continuously */ fclose(difffile); @@ -2109,7 +2100,6 @@ regression_main(int argc, char *argv[], int i; int option_index; char buf[MAXPGPATH * 4]; - char buf2[MAXPGPATH * 4]; pg_logging_init(argv[0]); progname = get_progname(argv[0]); @@ -2293,9 +2283,15 @@ regression_main(int argc, char *argv[], if (temp_instance) { + StringInfoData cmd; FILE *pg_conf; const char *env_wait; int wait_seconds; + const char *initdb_template_dir; + const char *keywords[4]; + const char *values[4]; + PGPing rv; + const char *initdb_extra_opts_env; /* * Prepare the temp instance @@ -2317,23 +2313,73 @@ regression_main(int argc, char *argv[], if (!directory_exists(buf)) make_directory(buf); - /* initdb */ - snprintf(buf, sizeof(buf), - "\"%s%sinitdb\" -D \"%s/data\" --no-clean --no-sync%s%s > \"%s/log/initdb.log\" 2>&1", - bindir ? bindir : "", - bindir ? "/" : "", - temp_instance, - debug ? " --debug" : "", - nolocale ? " --no-locale" : "", - outputdir); - fflush(NULL); - if (system(buf)) + initdb_extra_opts_env = getenv("PG_TEST_INITDB_EXTRA_OPTS"); + + initStringInfo(&cmd); + + /* + * Create data directory. + * + * If available, use a previously initdb'd cluster as a template by + * copying it. For a lot of tests, that's substantially cheaper. + * + * There's very similar code in Cluster.pm, but we can't easily de + * duplicate it until we require perl at build time. + */ + initdb_template_dir = getenv("INITDB_TEMPLATE"); + if (initdb_template_dir == NULL || nolocale || debug || initdb_extra_opts_env) { - bail("initdb failed\n" - "# Examine \"%s/log/initdb.log\" for the reason.\n" - "# Command was: %s", - outputdir, buf); + note("initializing database system by running initdb"); + + appendStringInfo(&cmd, + "\"%s%sinitdb\" -D \"%s/data\" --no-clean --no-sync", + bindir ? bindir : "", + bindir ? "/" : "", + temp_instance); + if (debug) + appendStringInfoString(&cmd, " --debug"); + if (nolocale) + appendStringInfoString(&cmd, " --no-locale"); + if (initdb_extra_opts_env) + appendStringInfo(&cmd, " %s", initdb_extra_opts_env); + appendStringInfo(&cmd, " > \"%s/log/initdb.log\" 2>&1", outputdir); + fflush(NULL); + if (system(cmd.data)) + { + bail("initdb failed\n" + "# Examine \"%s/log/initdb.log\" for the reason.\n" + "# Command was: %s", + outputdir, cmd.data); + } } + else + { +#ifndef WIN32 + const char *copycmd = "cp -RPp \"%s\" \"%s/data\""; + int expected_exitcode = 0; +#else + const char *copycmd = "robocopy /E /NJS /NJH /NFL /NDL /NP \"%s\" \"%s/data\""; + int expected_exitcode = 1; /* 1 denotes files were copied */ +#endif + + note("initializing database system by copying initdb template"); + + appendStringInfo(&cmd, + copycmd, + initdb_template_dir, + temp_instance); + appendStringInfo(&cmd, " > \"%s/log/initdb.log\" 2>&1", outputdir); + fflush(NULL); + if (system(cmd.data) != expected_exitcode) + { + bail("copying of initdb template failed\n" + "# Examine \"%s/log/initdb.log\" for the reason.\n" + "# Command was: %s", + outputdir, cmd.data); + } + } + + pfree(cmd.data); /* * Adjust the default postgresql.conf for regression testing. The user @@ -2346,10 +2392,8 @@ regression_main(int argc, char *argv[], snprintf(buf, sizeof(buf), "%s/data/postgresql.conf", temp_instance); pg_conf = fopen(buf, "a"); if (pg_conf == NULL) - { - bail("could not open \"%s\" for adding extra config: %s", - buf, strerror(errno)); - } + bail("could not open \"%s\" for adding extra config: %m", buf); + fputs("\n# Configuration added by pg_regress\n\n", pg_conf); fputs("log_autovacuum_min_duration = 0\n", pg_conf); fputs("log_checkpoints = on\n", pg_conf); @@ -2367,8 +2411,8 @@ regression_main(int argc, char *argv[], extra_conf = fopen(temp_config, "r"); if (extra_conf == NULL) { - bail("could not open \"%s\" to read extra config: %s", - temp_config, strerror(errno)); + bail("could not open \"%s\" to read extra config: %m", + temp_config); } while (fgets(line_buf, sizeof(line_buf), extra_conf) != NULL) fputs(line_buf, pg_conf); @@ -2390,21 +2434,28 @@ regression_main(int argc, char *argv[], #endif /* - * Check if there is a postmaster running already. + * Prepare the connection params for checking the state of the server + * before starting the tests. */ - snprintf(buf2, sizeof(buf2), - "\"%s%spsql\" -X postgres <%s 2>%s", - bindir ? bindir : "", - bindir ? "/" : "", - DEVNULL, DEVNULL); + sprintf(portstr, "%d", port); + keywords[0] = "dbname"; + values[0] = "postgres"; + keywords[1] = "port"; + values[1] = portstr; + keywords[2] = "host"; + values[2] = hostname ? hostname : sockdir; + keywords[3] = NULL; + values[3] = NULL; + /* + * Check if there is a postmaster running already. + */ for (i = 0; i < 16; i++) { - fflush(NULL); - if (system(buf2) == 0) - { - char s[16]; + rv = PQpingParams(keywords, values, 1); + if (rv == PQPING_OK) + { if (port_specified_by_user || i == 15) { note("port %d apparently in use", port); @@ -2415,8 +2466,8 @@ regression_main(int argc, char *argv[], note("port %d apparently in use, trying %d", port, port + 1); port++; - sprintf(s, "%d", port); - setenv("PGPORT", s, 1); + sprintf(portstr, "%d", port); + setenv("PGPORT", portstr, 1); } else break; @@ -2436,14 +2487,14 @@ regression_main(int argc, char *argv[], outputdir); postmaster_pid = spawn_process(buf); if (postmaster_pid == INVALID_PID) - bail("could not spawn postmaster: %s", strerror(errno)); + bail("could not spawn postmaster: %m"); /* - * Wait till postmaster is able to accept connections; normally this - * is only a second or so, but Cygwin is reportedly *much* slower, and - * test builds using Valgrind or similar tools might be too. Hence, - * allow the default timeout of 60 seconds to be overridden from the - * PGCTLTIMEOUT environment variable. + * Wait till postmaster is able to accept connections; normally takes + * only a fraction of a second or so, but Cygwin is reportedly *much* + * slower, and test builds using Valgrind or similar tools might be + * too. Hence, allow the default timeout of 60 seconds to be + * overridden from the PGCTLTIMEOUT environment variable. */ env_wait = getenv("PGCTLTIMEOUT"); if (env_wait != NULL) @@ -2455,13 +2506,24 @@ regression_main(int argc, char *argv[], else wait_seconds = 60; - for (i = 0; i < wait_seconds; i++) + for (i = 0; i < wait_seconds * WAIT_TICKS_PER_SECOND; i++) { - /* Done if psql succeeds */ - fflush(NULL); - if (system(buf2) == 0) + /* + * It's fairly unlikely that the server is responding immediately + * so we start with sleeping before checking instead of the other + * way around. + */ + pg_usleep(1000000L / WAIT_TICKS_PER_SECOND); + + rv = PQpingParams(keywords, values, 1); + + /* Done if the server is running and accepts connections */ + if (rv == PQPING_OK) break; + if (rv == PQPING_NO_ATTEMPT) + bail("attempting to connect to postmaster failed"); + /* * Fail immediately if postmaster has exited */ @@ -2474,10 +2536,8 @@ regression_main(int argc, char *argv[], bail("postmaster failed, examine \"%s/log/postmaster.log\" for the reason", outputdir); } - - pg_usleep(1000000L); } - if (i >= wait_seconds) + if (i >= wait_seconds * WAIT_TICKS_PER_SECOND) { diag("postmaster did not respond within %d seconds, examine \"%s/log/postmaster.log\" for the reason", wait_seconds, outputdir); @@ -2490,7 +2550,7 @@ regression_main(int argc, char *argv[], */ #ifndef WIN32 if (kill(postmaster_pid, SIGKILL) != 0 && errno != ESRCH) - bail("could not kill failed postmaster: %s", strerror(errno)); + bail("could not kill failed postmaster: %m"); #else if (TerminateProcess(postmaster_pid, 255) == 0) bail("could not kill failed postmaster: error code %lu", diff --git a/src/test/regress/pg_regress.h b/src/test/regress/pg_regress.h index a1c4cd4c62ed2..5b636ca300926 100644 --- a/src/test/regress/pg_regress.h +++ b/src/test/regress/pg_regress.h @@ -1,7 +1,7 @@ /*------------------------------------------------------------------------- * pg_regress.h --- regression test driver * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/test/regress/pg_regress.h diff --git a/src/test/regress/pg_regress_main.c b/src/test/regress/pg_regress_main.c index 427429975eab6..8aeed97be1a75 100644 --- a/src/test/regress/pg_regress_main.c +++ b/src/test/regress/pg_regress_main.c @@ -8,7 +8,7 @@ * * This code is released under the terms of the PostgreSQL License. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/test/regress/pg_regress_main.c @@ -18,6 +18,7 @@ #include "postgres_fe.h" +#include "lib/stringinfo.h" #include "pg_regress.h" /* @@ -34,8 +35,7 @@ psql_start_test(const char *testname, char infile[MAXPGPATH]; char outfile[MAXPGPATH]; char expectfile[MAXPGPATH]; - char psql_cmd[MAXPGPATH * 3]; - size_t offset = 0; + StringInfoData psql_cmd; char *appnameenv; /* @@ -54,7 +54,7 @@ psql_start_test(const char *testname, outputdir, testname); snprintf(expectfile, sizeof(expectfile), "%s/expected/%s.out", - outputdir, testname); + expecteddir, testname); if (!file_exists(expectfile)) snprintf(expectfile, sizeof(expectfile), "%s/expected/%s.out", inputdir, testname); @@ -62,40 +62,29 @@ psql_start_test(const char *testname, add_stringlist_item(resultfiles, outfile); add_stringlist_item(expectfiles, expectfile); + initStringInfo(&psql_cmd); + if (launcher) - { - offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset, - "%s ", launcher); - if (offset >= sizeof(psql_cmd)) - { - fprintf(stderr, _("command too long\n")); - exit(2); - } - } + appendStringInfo(&psql_cmd, "%s ", launcher); /* * Use HIDE_TABLEAM to hide different AMs to allow to use regression tests * against different AMs without unnecessary differences. */ - offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset, - "\"%s%spsql\" -X -a -q -d \"%s\" %s < \"%s\" > \"%s\" 2>&1", - bindir ? bindir : "", - bindir ? "/" : "", - dblist->str, - "-v HIDE_TABLEAM=on -v HIDE_TOAST_COMPRESSION=on", - infile, - outfile); - if (offset >= sizeof(psql_cmd)) - { - fprintf(stderr, _("command too long\n")); - exit(2); - } + appendStringInfo(&psql_cmd, + "\"%s%spsql\" -X -a -q -d \"%s\" %s < \"%s\" > \"%s\" 2>&1", + bindir ? bindir : "", + bindir ? "/" : "", + dblist->str, + "-v HIDE_TABLEAM=on -v HIDE_TOAST_COMPRESSION=on", + infile, + outfile); appnameenv = psprintf("pg_regress/%s", testname); setenv("PGAPPNAME", appnameenv, 1); free(appnameenv); - pid = spawn_process(psql_cmd); + pid = spawn_process(psql_cmd.data); if (pid == INVALID_PID) { @@ -106,6 +95,8 @@ psql_start_test(const char *testname, unsetenv("PGAPPNAME"); + pfree(psql_cmd.data); + return pid; } diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c index bcbc6d910f18c..423add6650252 100644 --- a/src/test/regress/regress.c +++ b/src/test/regress/regress.c @@ -6,7 +6,7 @@ * * This code is released under the terms of the PostgreSQL License. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * src/test/regress/regress.c @@ -42,7 +42,6 @@ #include "utils/array.h" #include "utils/builtins.h" #include "utils/geo_decls.h" -#include "utils/lsyscache.h" #include "utils/memutils.h" #include "utils/rel.h" #include "utils/typcache.h" @@ -596,7 +595,8 @@ make_tuple_indirect(PG_FUNCTION_ARGS) /* only work on existing, not-null varlenas */ if (TupleDescAttr(tupdesc, i)->attisdropped || nulls[i] || - TupleDescAttr(tupdesc, i)->attlen != -1) + TupleDescAttr(tupdesc, i)->attlen != -1 || + TupleDescAttr(tupdesc, i)->attstorage == TYPSTORAGE_PLAIN) continue; attr = (struct varlena *) DatumGetPointer(values[i]); @@ -645,6 +645,29 @@ make_tuple_indirect(PG_FUNCTION_ARGS) PG_RETURN_POINTER(newtup->t_data); } +PG_FUNCTION_INFO_V1(get_environ); + +Datum +get_environ(PG_FUNCTION_ARGS) +{ + extern char **environ; + int nvals = 0; + ArrayType *result; + Datum *env; + + for (char **s = environ; *s; s++) + nvals++; + + env = palloc(nvals * sizeof(Datum)); + + for (int i = 0; i < nvals; i++) + env[i] = CStringGetTextDatum(environ[i]); + + result = construct_array_builtin(env, nvals, TEXTOID); + + PG_RETURN_POINTER(result); +} + PG_FUNCTION_INFO_V1(regress_setenv); Datum @@ -1082,6 +1105,56 @@ test_opclass_options_func(PG_FUNCTION_ARGS) PG_RETURN_NULL(); } +/* one-time tests for encoding infrastructure */ +PG_FUNCTION_INFO_V1(test_enc_setup); +Datum +test_enc_setup(PG_FUNCTION_ARGS) +{ + /* Test pg_encoding_set_invalid() */ + for (int i = 0; i < _PG_LAST_ENCODING_; i++) + { + char buf[2], + bigbuf[16]; + int len, + mblen, + valid; + + if (pg_encoding_max_length(i) == 1) + continue; + pg_encoding_set_invalid(i, buf); + len = strnlen(buf, 2); + if (len != 2) + elog(WARNING, + "official invalid string for encoding \"%s\" has length %d", + pg_enc2name_tbl[i].name, len); + mblen = pg_encoding_mblen(i, buf); + if (mblen != 2) + elog(WARNING, + "official invalid string for encoding \"%s\" has mblen %d", + pg_enc2name_tbl[i].name, mblen); + valid = pg_encoding_verifymbstr(i, buf, len); + if (valid != 0) + elog(WARNING, + "official invalid string for encoding \"%s\" has valid prefix of length %d", + pg_enc2name_tbl[i].name, valid); + valid = pg_encoding_verifymbstr(i, buf, 1); + if (valid != 0) + elog(WARNING, + "first byte of official invalid string for encoding \"%s\" has valid prefix of length %d", + pg_enc2name_tbl[i].name, valid); + memset(bigbuf, ' ', sizeof(bigbuf)); + bigbuf[0] = buf[0]; + bigbuf[1] = buf[1]; + valid = pg_encoding_verifymbstr(i, bigbuf, sizeof(bigbuf)); + if (valid != 0) + elog(WARNING, + "trailing data changed official invalid string for encoding \"%s\" to have valid prefix of length %d", + pg_enc2name_tbl[i].name, valid); + } + + PG_RETURN_VOID(); +} + /* * Call an encoding conversion or verification function. * @@ -1222,43 +1295,3 @@ binary_coercible(PG_FUNCTION_ARGS) PG_RETURN_BOOL(IsBinaryCoercible(srctype, targettype)); } - -/* - * Return the length of the portion of a tuple consisting of the given array - * of data types. The input data types must be fixed-length data types. - */ -PG_FUNCTION_INFO_V1(get_columns_length); -Datum -get_columns_length(PG_FUNCTION_ARGS) -{ - ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0); - Oid *type_oids; - int ntypes; - int column_offset = 0; - - if (ARR_HASNULL(ta) && array_contains_nulls(ta)) - elog(ERROR, "argument must not contain nulls"); - - if (ARR_NDIM(ta) > 1) - elog(ERROR, "argument must be empty or one-dimensional array"); - - type_oids = (Oid *) ARR_DATA_PTR(ta); - ntypes = ArrayGetNItems(ARR_NDIM(ta), ARR_DIMS(ta)); - for (int i = 0; i < ntypes; i++) - { - Oid typeoid = type_oids[i]; - int16 typlen; - bool typbyval; - char typalign; - - get_typlenbyvalalign(typeoid, &typlen, &typbyval, &typalign); - - /* the data type must be fixed-length */ - if (typlen < 0) - elog(ERROR, "type %u is not fixed-length data type", typeoid); - - column_offset = att_align_nominal(column_offset + typlen, typalign); - } - - PG_RETURN_INT32(column_offset); -} diff --git a/src/test/regress/sql/aggregates.sql b/src/test/regress/sql/aggregates.sql index 75c78be640b29..fe4d89aec6abe 100644 --- a/src/test/regress/sql/aggregates.sql +++ b/src/test/regress/sql/aggregates.sql @@ -436,6 +436,16 @@ select distinct min(f1), max(f1) from minmaxtest; drop table minmaxtest cascade; +-- DISTINCT can also trigger wrong answers with hash aggregation (bug #18465) +begin; +set local enable_sort = off; +explain (costs off) + select f1, (select distinct min(t1.f1) from int4_tbl t1 where t1.f1 = t0.f1) + from int4_tbl t0; +select f1, (select distinct min(t1.f1) from int4_tbl t1 where t1.f1 = t0.f1) +from int4_tbl t0; +rollback; + -- check for correct detection of nested-aggregate errors select max(min(unique1)) from tenk1; select (select max(min(unique1)) from int8_tbl) from tenk1; @@ -585,6 +595,25 @@ explain (costs off) select sum(two order by two) from tenk1; reset enable_presorted_aggregate; +-- +-- Test cases with FILTER clause +-- + +-- Ensure we presort when the aggregate contains plain Vars +explain (costs off) +select sum(two order by two) filter (where two > 1) from tenk1; + +-- Ensure we presort for RelabelType'd Vars +explain (costs off) +select string_agg(distinct f1, ',') filter (where length(f1) > 1) +from varchar_tbl; + +-- Ensure we don't presort when the aggregate's argument contains an +-- explicit cast. +explain (costs off) +select string_agg(distinct f1::varchar(2), ',') filter (where length(f1) > 1) +from varchar_tbl; + -- -- Test combinations of DISTINCT and/or ORDER BY -- @@ -643,6 +672,15 @@ select aggfns(distinct a,b,c order by a,c using ~<~,b) from (values (1,3,'foo'),(0,null,null),(2,2,'bar'),(3,1,'baz')) v(a,b,c), generate_series(1,2) i; +-- test a more complex permutation that has previous caused issues +select + string_agg(distinct 'a', ','), + sum(( + select sum(1) + from (values(1)) b(id) + where a.id = b.id +)) from unnest(array[1]) a(id); + -- check node I/O via view creation and usage, also deparsing logic create view agg_view1 as @@ -740,7 +778,7 @@ select string_agg(v, decode('ee', 'hex')) from bytea_test_table; drop table bytea_test_table; -- Test parallel string_agg and array_agg -create table pagg_test (x int, y int); +create table pagg_test (x int, y int) with (autovacuum_enabled = off); insert into pagg_test select (case x % 4 when 1 then null else x end), x % 10 from generate_series(1,5000) x; @@ -786,11 +824,16 @@ select * from v_pagg_test order by y; -- Ensure parallel aggregation is actually being used. explain (costs off) select * from v_pagg_test order by y; -set max_parallel_workers_per_gather = 0; - -- Ensure results are the same without parallel aggregation. +set max_parallel_workers_per_gather = 0; select * from v_pagg_test order by y; +-- Check that we don't fail on anonymous record types. +set max_parallel_workers_per_gather = 2; +explain (costs off) +select array_dims(array_agg(s)) from (select * from pagg_test) s; +select array_dims(array_agg(s)) from (select * from pagg_test) s; + -- Clean up reset max_parallel_workers_per_gather; reset bytea_output; @@ -1172,6 +1215,114 @@ SELECT balk(hundred) FROM tenk1; ROLLBACK; +-- GROUP BY optimization by reordering GROUP BY clauses +CREATE TABLE btg AS SELECT + i % 10 AS x, + i % 10 AS y, + 'abc' || i % 10 AS z, + i AS w +FROM generate_series(1, 100) AS i; +CREATE INDEX btg_x_y_idx ON btg(x, y); +ANALYZE btg; + +SET enable_hashagg = off; +SET enable_seqscan = off; + +-- Utilize the ordering of index scan to avoid a Sort operation +EXPLAIN (COSTS OFF) +SELECT count(*) FROM btg GROUP BY y, x; + +-- Engage incremental sort +EXPLAIN (COSTS OFF) +SELECT count(*) FROM btg GROUP BY z, y, w, x; + +-- Utilize the ordering of subquery scan to avoid a Sort operation +EXPLAIN (COSTS OFF) SELECT count(*) +FROM (SELECT * FROM btg ORDER BY x, y, w, z) AS q1 +GROUP BY w, x, z, y; + +-- Utilize the ordering of merge join to avoid a full Sort operation +SET enable_hashjoin = off; +SET enable_nestloop = off; +EXPLAIN (COSTS OFF) +SELECT count(*) + FROM btg t1 JOIN btg t2 ON t1.z = t2.z AND t1.w = t2.w AND t1.x = t2.x + GROUP BY t1.x, t1.y, t1.z, t1.w; +RESET enable_nestloop; +RESET enable_hashjoin; + +-- Should work with and without GROUP-BY optimization +EXPLAIN (COSTS OFF) +SELECT count(*) FROM btg GROUP BY w, x, z, y ORDER BY y, x, z, w; + +-- Utilize incremental sort to make the ORDER BY rule a bit cheaper +EXPLAIN (COSTS OFF) +SELECT count(*) FROM btg GROUP BY w, x, y, z ORDER BY x*x, z; + +-- Test the case where the number of incoming subtree path keys is more than +-- the number of grouping keys. +CREATE INDEX btg_y_x_w_idx ON btg(y, x, w); +EXPLAIN (VERBOSE, COSTS OFF) +SELECT y, x, array_agg(distinct w) + FROM btg WHERE y < 0 GROUP BY x, y; + +-- Ensure that we do not select the aggregate pathkeys instead of the grouping +-- pathkeys +CREATE TABLE group_agg_pk AS SELECT + i % 10 AS x, + i % 2 AS y, + i % 2 AS z, + 2 AS w, + i % 10 AS f +FROM generate_series(1,100) AS i; +ANALYZE group_agg_pk; +SET enable_nestloop = off; +SET enable_hashjoin = off; + +EXPLAIN (COSTS OFF) +SELECT avg(c1.f ORDER BY c1.x, c1.y) +FROM group_agg_pk c1 JOIN group_agg_pk c2 ON c1.x = c2.x +GROUP BY c1.w, c1.z; +SELECT avg(c1.f ORDER BY c1.x, c1.y) +FROM group_agg_pk c1 JOIN group_agg_pk c2 ON c1.x = c2.x +GROUP BY c1.w, c1.z; + +-- Pathkeys, built in a subtree, can be used to optimize GROUP-BY clause +-- ordering. Also, here we check that it doesn't depend on the initial clause +-- order in the GROUP-BY list. +EXPLAIN (COSTS OFF) +SELECT c1.y,c1.x FROM group_agg_pk c1 + JOIN group_agg_pk c2 + ON c1.x = c2.x +GROUP BY c1.y,c1.x,c2.x; +EXPLAIN (COSTS OFF) +SELECT c1.y,c1.x FROM group_agg_pk c1 + JOIN group_agg_pk c2 + ON c1.x = c2.x +GROUP BY c1.y,c2.x,c1.x; + +RESET enable_nestloop; +RESET enable_hashjoin; +DROP TABLE group_agg_pk; + +-- Test the case where the ordering of the scan matches the ordering within the +-- aggregate but cannot be found in the group-by list +CREATE TABLE agg_sort_order (c1 int PRIMARY KEY, c2 int); +CREATE UNIQUE INDEX agg_sort_order_c2_idx ON agg_sort_order(c2); +INSERT INTO agg_sort_order SELECT i, i FROM generate_series(1,100)i; +ANALYZE agg_sort_order; + +EXPLAIN (COSTS OFF) +SELECT array_agg(c1 ORDER BY c2),c2 +FROM agg_sort_order WHERE c2 < 100 GROUP BY c1 ORDER BY 2; + +DROP TABLE agg_sort_order CASCADE; + +DROP TABLE btg; + +RESET enable_hashagg; +RESET enable_seqscan; + -- Secondly test the case of a parallel aggregate combiner function -- returning NULL. For that use normal transition function, but a -- combiner function returning NULL. diff --git a/src/test/regress/sql/alter_operator.sql b/src/test/regress/sql/alter_operator.sql index fd4037016572e..8faecf78301e6 100644 --- a/src/test/regress/sql/alter_operator.sql +++ b/src/test/regress/sql/alter_operator.sql @@ -22,7 +22,7 @@ WHERE classid = 'pg_operator'::regclass AND ORDER BY 1; -- --- Reset and set params +-- Test resetting and setting restrict and join attributes. -- ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = NONE); @@ -74,12 +74,8 @@ ORDER BY 1; -- -- Test invalid options. -- -ALTER OPERATOR === (boolean, boolean) SET (COMMUTATOR = ====); -ALTER OPERATOR === (boolean, boolean) SET (NEGATOR = ====); ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = non_existent_func); ALTER OPERATOR === (boolean, boolean) SET (JOIN = non_existent_func); -ALTER OPERATOR === (boolean, boolean) SET (COMMUTATOR = !==); -ALTER OPERATOR === (boolean, boolean) SET (NEGATOR = !==); -- invalid: non-lowercase quoted identifiers ALTER OPERATOR & (bit, bit) SET ("Restrict" = _int_contsel, "Join" = _int_contjoinsel); @@ -92,9 +88,138 @@ SET SESSION AUTHORIZATION regress_alter_op_user; ALTER OPERATOR === (boolean, boolean) SET (RESTRICT = NONE); --- Clean up RESET SESSION AUTHORIZATION; + +-- +-- Test setting commutator, negator, merges, and hashes attributes, +-- which can only be set if not already set +-- + +CREATE FUNCTION alter_op_test_fn_bool_real(boolean, real) +RETURNS boolean AS $$ SELECT NULL::BOOLEAN; $$ LANGUAGE sql IMMUTABLE; + +CREATE FUNCTION alter_op_test_fn_real_bool(real, boolean) +RETURNS boolean AS $$ SELECT NULL::BOOLEAN; $$ LANGUAGE sql IMMUTABLE; + +-- operator +CREATE OPERATOR === ( + LEFTARG = boolean, + RIGHTARG = real, + PROCEDURE = alter_op_test_fn_bool_real +); + +-- commutator +CREATE OPERATOR ==== ( + LEFTARG = real, + RIGHTARG = boolean, + PROCEDURE = alter_op_test_fn_real_bool +); + +-- negator +CREATE OPERATOR !==== ( + LEFTARG = boolean, + RIGHTARG = real, + PROCEDURE = alter_op_test_fn_bool_real +); + +-- No-op setting already false hashes and merges to false works +ALTER OPERATOR === (boolean, real) SET (MERGES = false); +ALTER OPERATOR === (boolean, real) SET (HASHES = false); + +-- Test setting merges and hashes +ALTER OPERATOR === (boolean, real) SET (MERGES); +ALTER OPERATOR === (boolean, real) SET (HASHES); +SELECT oprcanmerge, oprcanhash +FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'real'::regtype; + +-- Test setting commutator +ALTER OPERATOR === (boolean, real) SET (COMMUTATOR = ====); + +-- Check that oprcom has been set on both the operator and commutator, +-- that they reference each other, and that the operator used is the existing +-- one we created and not a new shell operator. +SELECT op.oprname AS operator_name, com.oprname AS commutator_name, + com.oprcode AS commutator_func + FROM pg_operator op + INNER JOIN pg_operator com ON (op.oid = com.oprcom AND op.oprcom = com.oid) + WHERE op.oprname = '===' + AND op.oprleft = 'boolean'::regtype AND op.oprright = 'real'::regtype; + +-- Cannot set self as negator +ALTER OPERATOR === (boolean, real) SET (NEGATOR = ===); + +-- Test setting negator +ALTER OPERATOR === (boolean, real) SET (NEGATOR = !====); + +-- Check that oprnegate has been set on both the operator and negator, +-- that they reference each other, and that the operator used is the existing +-- one we created and not a new shell operator. +SELECT op.oprname AS operator_name, neg.oprname AS negator_name, + neg.oprcode AS negator_func + FROM pg_operator op + INNER JOIN pg_operator neg ON (op.oid = neg.oprnegate AND op.oprnegate = neg.oid) + WHERE op.oprname = '===' + AND op.oprleft = 'boolean'::regtype AND op.oprright = 'real'::regtype; + +-- Test that no-op set succeeds +ALTER OPERATOR === (boolean, real) SET (NEGATOR = !====); +ALTER OPERATOR === (boolean, real) SET (COMMUTATOR = ====); +ALTER OPERATOR === (boolean, real) SET (MERGES); +ALTER OPERATOR === (boolean, real) SET (HASHES); + +-- Check that the final state of the operator is as we expect +SELECT oprcanmerge, oprcanhash, + pg_describe_object('pg_operator'::regclass, oprcom, 0) AS commutator, + pg_describe_object('pg_operator'::regclass, oprnegate, 0) AS negator + FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'real'::regtype; + +-- Cannot change commutator, negator, merges, and hashes when already set + +CREATE OPERATOR @= ( + LEFTARG = real, + RIGHTARG = boolean, + PROCEDURE = alter_op_test_fn_real_bool +); +CREATE OPERATOR @!= ( + LEFTARG = boolean, + RIGHTARG = real, + PROCEDURE = alter_op_test_fn_bool_real +); + +ALTER OPERATOR === (boolean, real) SET (COMMUTATOR = @=); +ALTER OPERATOR === (boolean, real) SET (NEGATOR = @!=); +ALTER OPERATOR === (boolean, real) SET (MERGES = false); +ALTER OPERATOR === (boolean, real) SET (HASHES = false); + +-- Cannot set an operator that already has a commutator as the commutator +ALTER OPERATOR @=(real, boolean) SET (COMMUTATOR = ===); + +-- Cannot set an operator that already has a negator as the negator +ALTER OPERATOR @!=(boolean, real) SET (NEGATOR = ===); + +-- Check no changes made +SELECT oprcanmerge, oprcanhash, + pg_describe_object('pg_operator'::regclass, oprcom, 0) AS commutator, + pg_describe_object('pg_operator'::regclass, oprnegate, 0) AS negator + FROM pg_operator WHERE oprname = '===' + AND oprleft = 'boolean'::regtype AND oprright = 'real'::regtype; + +-- +-- Clean up +-- + DROP USER regress_alter_op_user; + DROP OPERATOR === (boolean, boolean); +DROP OPERATOR === (boolean, real); +DROP OPERATOR ==== (real, boolean); +DROP OPERATOR !==== (boolean, real); +DROP OPERATOR @= (real, boolean); +DROP OPERATOR @!= (boolean, real); + DROP FUNCTION customcontsel(internal, oid, internal, integer); DROP FUNCTION alter_op_test_fn(boolean, boolean); +DROP FUNCTION alter_op_test_fn_bool_real(boolean, real); +DROP FUNCTION alter_op_test_fn_real_bool(real, boolean); diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 58ea20ac3dcb4..da1272447304f 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -850,9 +850,12 @@ alter table non_existent alter column bar drop not null; -- test checking for null values and primary key create table atacc1 (test int not null); alter table atacc1 add constraint "atacc1_pkey" primary key (test); +\d atacc1 alter table atacc1 alter column test drop not null; +\d atacc1 alter table atacc1 drop constraint "atacc1_pkey"; alter table atacc1 alter column test drop not null; +\d atacc1 insert into atacc1 values (null); alter table atacc1 alter test set not null; delete from atacc1; @@ -1493,8 +1496,6 @@ select conname, obj_description(oid, 'pg_constraint') as desc alter table at_partitioned alter column name type varchar(127); --- Note: these tests currently show the wrong behavior for comments :-( - select relname, c.oid = oldoid as orig_oid, case relfilenode @@ -2342,14 +2343,20 @@ ALTER TABLE ataddindex \d ataddindex DROP TABLE ataddindex; --- unsupported constraint types for partitioned tables +CREATE TABLE atnotnull1 (); +ALTER TABLE atnotnull1 + ADD COLUMN a INT, + ALTER a SET NOT NULL; +ALTER TABLE atnotnull1 + ADD COLUMN c INT, + ADD PRIMARY KEY (c); +\d+ atnotnull1 + +-- cannot drop column that is part of the partition key CREATE TABLE partitioned ( a int, b int ) PARTITION BY RANGE (a, (a+b+1)); -ALTER TABLE partitioned ADD EXCLUDE USING gist (a WITH &&); - --- cannot drop column that is part of the partition key ALTER TABLE partitioned DROP COLUMN a; ALTER TABLE partitioned ALTER COLUMN a TYPE char(5); ALTER TABLE partitioned DROP COLUMN b; @@ -2416,6 +2423,13 @@ CREATE TABLE parent (LIKE list_parted); CREATE TABLE child () INHERITS (parent); ALTER TABLE list_parted ATTACH PARTITION child FOR VALUES IN (1); ALTER TABLE list_parted ATTACH PARTITION parent FOR VALUES IN (1); +DROP TABLE child; +-- now it should work, with a little tweak +ALTER TABLE parent ADD CONSTRAINT check_a CHECK (a > 0); +ALTER TABLE list_parted ATTACH PARTITION parent FOR VALUES IN (1); +-- test insert/update, per bug #18550 +INSERT INTO parent VALUES (1); +UPDATE parent SET a = 2 WHERE a = 1; DROP TABLE parent CASCADE; -- check any TEMP-ness @@ -2673,7 +2687,7 @@ DROP TABLE quuux; -- check validation when attaching hash partitions -- Use hand-rolled hash functions and operator class to get predictable result --- on different machines. part_test_int4_ops is defined in insert.sql. +-- on different machines. part_test_int4_ops is defined in test_setup.sql. -- check that the new partition won't overlap with an existing partition CREATE TABLE hash_parted ( diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql index f1375621e0ca1..305371debae3b 100644 --- a/src/test/regress/sql/arrays.sql +++ b/src/test/regress/sql/arrays.sql @@ -438,6 +438,27 @@ insert into arr_pk_tbl(pk, f1[1:2]) values (1, '{6,7,8}') on conflict (pk) reset enable_seqscan; reset enable_bitmapscan; +-- test subscript overflow detection + +-- The normal error message includes a platform-dependent limit, +-- so suppress it to avoid needing multiple expected-files. +\set VERBOSITY sqlstate + +insert into arr_pk_tbl values(10, '[-2147483648:-2147483647]={1,2}'); +update arr_pk_tbl set f1[2147483647] = 42 where pk = 10; +update arr_pk_tbl set f1[2147483646:2147483647] = array[4,2] where pk = 10; +insert into arr_pk_tbl(pk, f1[0:2147483647]) values (2, '{}'); +insert into arr_pk_tbl(pk, f1[-2147483648:2147483647]) values (2, '{}'); + +-- also exercise the expanded-array case +do $$ declare a int[]; +begin + a := '[-2147483648:-2147483647]={1,2}'::int[]; + a[2147483647] := 42; +end $$; + +\set VERBOSITY default + -- test [not] (like|ilike) (any|all) (...) select 'foo' like any (array['%a', '%o']); -- t select 'foo' like any (array['%a', '%b']); -- f @@ -454,17 +475,45 @@ select 'foo' ilike all (array['F%', '%O']); -- t -- none of the following should be accepted select '{{1,{2}},{2,3}}'::text[]; -select '{{},{}}'::text[]; select E'{{1,2},\\{2,3}}'::text[]; +select '{"a"b}'::text[]; +select '{a"b"}'::text[]; +select '{"a""b"}'::text[]; select '{{"1 2" x},{3}}'::text[]; +select '{{"1 2"} x,{3}}'::text[]; select '{}}'::text[]; select '{ }}'::text[]; +select '}{'::text[]; +select '{foo{}}'::text[]; +select '{"foo"{}}'::text[]; +select '{foo,,bar}'::text[]; +select '{{1},{{2}}}'::text[]; +select '{{{1}},{2}}'::text[]; +select '{{},{{}}}'::text[]; +select '{{{}},{}}'::text[]; +select '{{1},{}}'::text[]; +select '{{},{1}}'::text[]; +select '[1:0]={}'::int[]; +select '[2147483646:2147483647]={1,2}'::int[]; +select '[1:-1]={}'::int[]; +select '[2]={1}'::int[]; +select '[1:]={1}'::int[]; +select '[:1]={1}'::int[]; select array[]; +select '{{1,},{1},}'::text[]; +select '{{1,},{1}}'::text[]; +select '{{1,}}'::text[]; +select '{1,}'::text[]; +select '[21474836488:21474836489]={1,2}'::int[]; +select '[-2147483649:-2147483648]={1,2}'::int[]; -- none of the above should be accepted -- all of the following should be accepted select '{}'::text[]; +select '{{},{}}'::text[]; select '{{{1,2,3,4},{2,3,4,5}},{{3,4,5,6},{4,5,6,7}}}'::text[]; +select '{null,n\ull,"null"}'::text[]; +select '{ ab\c , "ab\"c" }'::text[]; select '{0 second ,0 second}'::interval[]; select '{ { "," } , { 3 } }'::text[]; select ' { { " 0 second " , 0 second } }'::text[]; @@ -473,7 +522,10 @@ select '{ @ 1 hour @ 42 minutes @ 20 seconds }'::interval[]; select array[]::text[]; +select '[2]={1,7}'::int[]; select '[0:1]={1.1,2.2}'::float8[]; +select '[2147483646:2147483646]={1}'::int[]; +select '[-2147483648:-2147483647]={1,2}'::int[]; -- all of the above should be accepted -- tests for array aggregates @@ -661,6 +713,28 @@ select array_replace(array['AB',NULL,'CDE'],NULL,'12'); select array(select array[i,i/2] from generate_series(1,5) i); select array(select array['Hello', i::text] from generate_series(9,11) i); +-- int2vector and oidvector should be treated as scalar types for this purpose +select pg_typeof(array(select '11 22 33'::int2vector from generate_series(1,5))); +select array(select '11 22 33'::int2vector from generate_series(1,5)); +select unnest(array(select '11 22 33'::int2vector from generate_series(1,5))); +select pg_typeof(array(select '11 22 33'::oidvector from generate_series(1,5))); +select array(select '11 22 33'::oidvector from generate_series(1,5)); +select unnest(array(select '11 22 33'::oidvector from generate_series(1,5))); + +-- array[] should do the same +select pg_typeof(array['11 22 33'::int2vector]); +select array['11 22 33'::int2vector]; +select pg_typeof(unnest(array['11 22 33'::int2vector])); +select unnest(array['11 22 33'::int2vector]); +select pg_typeof(unnest('11 22 33'::int2vector)); +select unnest('11 22 33'::int2vector); +select pg_typeof(array['11 22 33'::oidvector]); +select array['11 22 33'::oidvector]; +select pg_typeof(unnest(array['11 22 33'::oidvector])); +select unnest(array['11 22 33'::oidvector]); +select pg_typeof(unnest('11 22 33'::oidvector)); +select unnest('11 22 33'::oidvector); + -- Insert/update on a column that is array of composite create temp table t1 (f1 int8_tbl[]); diff --git a/src/test/regress/sql/bit.sql b/src/test/regress/sql/bit.sql index 2cd550d27eb52..8ba6facd032f7 100644 --- a/src/test/regress/sql/bit.sql +++ b/src/test/regress/sql/bit.sql @@ -29,6 +29,11 @@ INSERT INTO VARBIT_TABLE VALUES (B'101011111010'); -- too long --INSERT INTO VARBIT_TABLE VALUES ('X555'); SELECT * FROM VARBIT_TABLE; +-- Literals with syntax errors +SELECT b' 0'; +SELECT b'0 '; +SELECT x' 0'; +SELECT x'0 '; -- Concatenation SELECT v, b, (v || b) AS concat @@ -218,6 +223,10 @@ SELECT overlay(B'0101011100' placing '001' from 20); -- bit_count SELECT bit_count(B'0101011100'::bit(10)); SELECT bit_count(B'1111111111'::bit(10)); +SELECT bit_count(repeat('0', 100)::bit(100)); +SELECT bit_count(repeat('1', 100)::bit(100)); +SELECT bit_count(repeat('01', 500)::bit(1000)); +SELECT bit_count(repeat('10101', 200)::bit(1000)); -- This table is intentionally left around to exercise pg_dump/pg_upgrade CREATE TABLE bit_defaults( diff --git a/src/test/regress/sql/boolean.sql b/src/test/regress/sql/boolean.sql index bc9937d6920af..85c6b01988236 100644 --- a/src/test/regress/sql/boolean.sql +++ b/src/test/regress/sql/boolean.sql @@ -227,7 +227,7 @@ FROM booltbl3 ORDER BY o; -- Test to make sure short-circuiting and NULL handling is -- correct. Use a table as source to prevent constant simplification --- to interfer. +-- from interfering. CREATE TABLE booltbl4(isfalse bool, istrue bool, isnul bool); INSERT INTO booltbl4 VALUES (false, true, null); \pset null '(null)' @@ -250,6 +250,11 @@ SELECT isfalse OR isnul OR istrue FROM booltbl4; SELECT istrue OR isfalse OR isnul FROM booltbl4; SELECT isnul OR istrue OR isfalse FROM booltbl4; +-- Casts +SELECT 0::boolean; +SELECT 1::boolean; +SELECT 2::boolean; + -- -- Clean up diff --git a/src/test/regress/sql/brin.sql b/src/test/regress/sql/brin.sql index 929a087a25d44..695cfad4bea3a 100644 --- a/src/test/regress/sql/brin.sql +++ b/src/test/regress/sql/brin.sql @@ -515,3 +515,11 @@ CREATE UNLOGGED TABLE brintest_unlogged (n numrange); CREATE INDEX brinidx_unlogged ON brintest_unlogged USING brin (n); INSERT INTO brintest_unlogged VALUES (numrange(0, 2^1000::numeric)); DROP TABLE brintest_unlogged; + +-- test that the insert optimization works if no rows end up inserted +CREATE TABLE brin_insert_optimization (a int); +INSERT INTO brin_insert_optimization VALUES (1); +CREATE INDEX brin_insert_optimization_idx ON brin_insert_optimization USING brin (a); +UPDATE brin_insert_optimization SET a = a; +REINDEX INDEX CONCURRENTLY brin_insert_optimization_idx; +DROP TABLE brin_insert_optimization; diff --git a/src/test/regress/sql/brin_multi.sql b/src/test/regress/sql/brin_multi.sql index 070455257c0e8..55349b4e1fd12 100644 --- a/src/test/regress/sql/brin_multi.sql +++ b/src/test/regress/sql/brin_multi.sql @@ -421,3 +421,286 @@ VACUUM ANALYZE brin_test_multi; EXPLAIN (COSTS OFF) SELECT * FROM brin_test_multi WHERE a = 1; -- Ensure brin index is not used when values are not correlated EXPLAIN (COSTS OFF) SELECT * FROM brin_test_multi WHERE b = 1; + + +-- do some inequality tests +CREATE TABLE brin_test_multi_1 (a INT, b BIGINT) WITH (fillfactor=10); +INSERT INTO brin_test_multi_1 +SELECT i/5 + mod(911 * i + 483, 25), + i/10 + mod(751 * i + 221, 41) + FROM generate_series(1,1000) s(i); + +CREATE INDEX brin_test_multi_1_idx_1 ON brin_test_multi_1 USING brin (a int4_minmax_multi_ops) WITH (pages_per_range=5); +CREATE INDEX brin_test_multi_1_idx_2 ON brin_test_multi_1 USING brin (b int8_minmax_multi_ops) WITH (pages_per_range=5); + +SET enable_seqscan=off; + +-- int: less than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a < 37; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a < 113; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a <= 177; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a <= 25; + +-- int: greater than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a > 120; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a >= 180; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a > 71; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a >= 63; + +-- int: equals +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a = 207; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a = 177; + +-- bigint: less than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b < 73; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b <= 47; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b < 199; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b <= 150; + +-- bigint: greater than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 93; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 37; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b >= 215; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 201; + +-- bigint: equals +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b = 88; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b = 103; + +-- now do the same, but insert the rows with the indexes already created +-- so that we don't use the "build callback" and instead use the regular +-- approach of adding rows into existing ranges +TRUNCATE brin_test_multi_1; + +INSERT INTO brin_test_multi_1 +SELECT i/5 + mod(911 * i + 483, 25), + i/10 + mod(751 * i + 221, 41) + FROM generate_series(1,1000) s(i); + +-- int: less than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a < 37; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a < 113; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a <= 177; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a <= 25; + +-- int: greater than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a > 120; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a >= 180; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a > 71; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a >= 63; + +-- int: equals +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a = 207; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE a = 177; + +-- bigint: less than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b < 73; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b <= 47; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b < 199; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b <= 150; + +-- bigint: greater than +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 93; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 37; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b >= 215; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b > 201; + +-- bigint: equals +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b = 88; + +SELECT COUNT(*) FROM brin_test_multi_1 WHERE b = 103; + + +DROP TABLE brin_test_multi_1; +RESET enable_seqscan; + + +-- do some inequality tests for varlena data types +CREATE TABLE brin_test_multi_2 (a UUID) WITH (fillfactor=10); +INSERT INTO brin_test_multi_2 +SELECT v::uuid FROM (SELECT row_number() OVER (ORDER BY v) c, v FROM (SELECT fipshash((i/13)::text) AS v FROM generate_series(1,1000) s(i)) foo) bar ORDER BY c + 25 * random(); + +CREATE INDEX brin_test_multi_2_idx ON brin_test_multi_2 USING brin (a uuid_minmax_multi_ops) WITH (pages_per_range=5); + +SET enable_seqscan=off; + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a < '3d914f93-48c9-cc0f-f8a7-9716700b9fcd'; + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a > '3d914f93-48c9-cc0f-f8a7-9716700b9fcd'; + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a <= 'f369cb89-fc62-7e66-8987-007d121ed1ea'; + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a >= 'aea92132-c4cb-eb26-3e6a-c2bf6c183b5d'; + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = '5feceb66-ffc8-6f38-d952-786c6d696c79'; + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = '86e50149-6586-6131-2a9e-0b35558d84f6'; + + +-- now do the same, but insert the rows with the indexes already created +-- so that we don't use the "build callback" and instead use the regular +-- approach of adding rows into existing ranges + +TRUNCATE brin_test_multi_2; +INSERT INTO brin_test_multi_2 +SELECT v::uuid FROM (SELECT row_number() OVER (ORDER BY v) c, v FROM (SELECT fipshash((i/13)::text) AS v FROM generate_series(1,1000) s(i)) foo) bar ORDER BY c + 25 * random(); + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a < '3d914f93-48c9-cc0f-f8a7-9716700b9fcd'; + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a > '3d914f93-48c9-cc0f-f8a7-9716700b9fcd'; + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a <= 'f369cb89-fc62-7e66-8987-007d121ed1ea'; + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a >= 'aea92132-c4cb-eb26-3e6a-c2bf6c183b5d'; + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = '5feceb66-ffc8-6f38-d952-786c6d696c79'; + +SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = '86e50149-6586-6131-2a9e-0b35558d84f6'; + +DROP TABLE brin_test_multi_2; +RESET enable_seqscan; + +-- test overflows during CREATE INDEX with extreme timestamp values +CREATE TABLE brin_timestamp_test(a TIMESTAMPTZ); + +SET datestyle TO iso; + +-- values close to timestamp minimum +INSERT INTO brin_timestamp_test +SELECT '4713-01-01 00:00:01 BC'::timestamptz + (i || ' seconds')::interval + FROM generate_series(1,30) s(i); + +-- values close to timestamp maximum +INSERT INTO brin_timestamp_test +SELECT '294276-12-01 00:00:01'::timestamptz + (i || ' seconds')::interval + FROM generate_series(1,30) s(i); + +CREATE INDEX ON brin_timestamp_test USING brin (a timestamptz_minmax_multi_ops) WITH (pages_per_range=1); +DROP TABLE brin_timestamp_test; + +-- test overflows during CREATE INDEX with extreme date values +CREATE TABLE brin_date_test(a DATE); + +-- insert values close to date minimum +INSERT INTO brin_date_test SELECT '4713-01-01 BC'::date + i FROM generate_series(1, 30) s(i); + +-- insert values close to date minimum +INSERT INTO brin_date_test SELECT '5874897-12-01'::date + i FROM generate_series(1, 30) s(i); + +CREATE INDEX ON brin_date_test USING brin (a date_minmax_multi_ops) WITH (pages_per_range=1); + +SET enable_seqscan = off; + +-- make sure the ranges were built correctly and 2023-01-01 eliminates all +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_date_test WHERE a = '2023-01-01'::date; + +DROP TABLE brin_date_test; +RESET enable_seqscan; + +-- test handling of infinite timestamp values +CREATE TABLE brin_timestamp_test(a TIMESTAMP); + +INSERT INTO brin_timestamp_test VALUES ('-infinity'), ('infinity'); +INSERT INTO brin_timestamp_test +SELECT i FROM generate_series('2000-01-01'::timestamp, '2000-02-09'::timestamp, '1 day'::interval) s(i); + +CREATE INDEX ON brin_timestamp_test USING brin (a timestamp_minmax_multi_ops) WITH (pages_per_range=1); + +SET enable_seqscan = off; + +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_timestamp_test WHERE a = '2023-01-01'::timestamp; + +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_timestamp_test WHERE a = '1900-01-01'::timestamp; + +DROP TABLE brin_timestamp_test; +RESET enable_seqscan; + +-- test handling of infinite date values +CREATE TABLE brin_date_test(a DATE); + +INSERT INTO brin_date_test VALUES ('-infinity'), ('infinity'); +INSERT INTO brin_date_test SELECT '2000-01-01'::date + i FROM generate_series(1, 40) s(i); + +CREATE INDEX ON brin_date_test USING brin (a date_minmax_multi_ops) WITH (pages_per_range=1); + +SET enable_seqscan = off; + +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_date_test WHERE a = '2023-01-01'::date; + +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_date_test WHERE a = '1900-01-01'::date; + +DROP TABLE brin_date_test; +RESET enable_seqscan; +RESET datestyle; + +-- test handling of overflow for interval values +CREATE TABLE brin_interval_test(a INTERVAL); + +INSERT INTO brin_interval_test SELECT (i || ' years')::interval FROM generate_series(-178000000, -177999980) s(i); + +INSERT INTO brin_interval_test SELECT (i || ' years')::interval FROM generate_series( 177999980, 178000000) s(i); + +CREATE INDEX ON brin_interval_test USING brin (a interval_minmax_multi_ops) WITH (pages_per_range=1); + +SET enable_seqscan = off; + +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_interval_test WHERE a = '-30 years'::interval; + +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_interval_test WHERE a = '30 years'::interval; + +DROP TABLE brin_interval_test; +RESET enable_seqscan; + +-- test handling of infinite interval values +CREATE TABLE brin_interval_test(a INTERVAL); + +INSERT INTO brin_interval_test VALUES ('-infinity'), ('infinity'); +INSERT INTO brin_interval_test SELECT (i || ' days')::interval FROM generate_series(100, 140) s(i); + +CREATE INDEX ON brin_interval_test USING brin (a interval_minmax_multi_ops) WITH (pages_per_range=1); + +SET enable_seqscan = off; + +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_interval_test WHERE a = '-30 years'::interval; + +EXPLAIN (ANALYZE, TIMING OFF, COSTS OFF, SUMMARY OFF) +SELECT * FROM brin_interval_test WHERE a = '30 years'::interval; + +DROP TABLE brin_interval_test; +RESET enable_seqscan; +RESET datestyle; diff --git a/src/test/regress/sql/btree_index.sql b/src/test/regress/sql/btree_index.sql index 239f4a4755f04..0d2a33f37053c 100644 --- a/src/test/regress/sql/btree_index.sql +++ b/src/test/regress/sql/btree_index.sql @@ -110,6 +110,46 @@ SELECT b.* FROM bt_f8_heap b WHERE b.seqno = '4500'::float8; +-- +-- Add coverage for optimization of backwards scan index descents +-- +-- Here we expect _bt_search to descend straight to a leaf page containing a +-- non-pivot tuple with the value '47', which comes last (after 11 similar +-- non-pivot tuples). Query execution should only need to visit a single +-- leaf page here. +-- +-- Test case relies on tenk1_hundred index having a leaf page whose high key +-- is '(48, -inf)'. We use a low cardinality index to make our test case less +-- sensitive to implementation details that may change in the future. +set enable_seqscan to false; +set enable_indexscan to true; +set enable_bitmapscan to false; +explain (costs off) +select hundred, twenty from tenk1 where hundred < 48 order by hundred desc limit 1; +select hundred, twenty from tenk1 where hundred < 48 order by hundred desc limit 1; + +-- This variant of the query need only return a single tuple located to the immediate +-- right of the '(48, -inf)' high key. It also only needs to scan one single +-- leaf page (the right sibling of the page scanned by the last test case): +explain (costs off) +select hundred, twenty from tenk1 where hundred <= 48 order by hundred desc limit 1; +select hundred, twenty from tenk1 where hundred <= 48 order by hundred desc limit 1; + +-- +-- Add coverage for ScalarArrayOp btree quals with pivot tuple constants +-- +explain (costs off) +select distinct hundred from tenk1 where hundred in (47, 48, 72, 82); +select distinct hundred from tenk1 where hundred in (47, 48, 72, 82); + +explain (costs off) +select distinct hundred from tenk1 where hundred in (47, 48, 72, 82) order by hundred desc; +select distinct hundred from tenk1 where hundred in (47, 48, 72, 82) order by hundred desc; + +explain (costs off) +select thousand from tenk1 where thousand in (364, 366,380) and tenthous = 200000; +select thousand from tenk1 where thousand in (364, 366,380) and tenthous = 200000; + -- -- Check correct optimization of LIKE (special index operator support) -- for both indexscan and bitmapscan cases diff --git a/src/test/regress/sql/case.sql b/src/test/regress/sql/case.sql index 83fe43be6b84f..388d4c6f52835 100644 --- a/src/test/regress/sql/case.sql +++ b/src/test/regress/sql/case.sql @@ -242,6 +242,11 @@ SELECT CASE make_ad(1,2) WHEN array[1,2]::arrdomain THEN 'right' END; +-- While we're here, also test handling of a NULLIF arg that is a read/write +-- object (bug #18722) + +SELECT NULLIF(make_ad(1,2), array[2,3]::arrdomain); + ROLLBACK; -- Test interaction of CASE with ArrayCoerceExpr (bug #15471) diff --git a/src/test/regress/sql/collate.icu.utf8.sql b/src/test/regress/sql/collate.icu.utf8.sql index 3db9e2591380c..4eb1adf0287da 100644 --- a/src/test/regress/sql/collate.icu.utf8.sql +++ b/src/test/regress/sql/collate.icu.utf8.sql @@ -363,14 +363,14 @@ SET icu_validation_level = disabled; do $$ BEGIN EXECUTE 'CREATE COLLATION test0 (provider = icu, locale = ' || - quote_literal((SELECT CASE WHEN datlocprovider='i' THEN daticulocale ELSE datcollate END FROM pg_database WHERE datname = current_database())) || ');'; + quote_literal((SELECT CASE WHEN datlocprovider='i' THEN datlocale ELSE datcollate END FROM pg_database WHERE datname = current_database())) || ');'; END $$; CREATE COLLATION test0 FROM "C"; -- fail, duplicate name do $$ BEGIN EXECUTE 'CREATE COLLATION test1 (provider = icu, locale = ' || - quote_literal((SELECT CASE WHEN datlocprovider='i' THEN daticulocale ELSE datcollate END FROM pg_database WHERE datname = current_database())) || ');'; + quote_literal((SELECT CASE WHEN datlocprovider='i' THEN datlocale ELSE datcollate END FROM pg_database WHERE datname = current_database())) || ');'; END $$; @@ -555,6 +555,7 @@ SELECT x FROM test3cs WHERE x LIKE 'a%'; SELECT x FROM test3cs WHERE x ILIKE 'a%'; SELECT x FROM test3cs WHERE x SIMILAR TO 'a%'; SELECT x FROM test3cs WHERE x ~ 'a'; +SET enable_hashagg TO off; SELECT x FROM test1cs UNION SELECT x FROM test2cs ORDER BY x; SELECT x FROM test2cs UNION SELECT x FROM test1cs ORDER BY x; SELECT x FROM test1cs INTERSECT SELECT x FROM test2cs; @@ -562,6 +563,7 @@ SELECT x FROM test2cs INTERSECT SELECT x FROM test1cs; SELECT x FROM test1cs EXCEPT SELECT x FROM test2cs; SELECT x FROM test2cs EXCEPT SELECT x FROM test1cs; SELECT DISTINCT x FROM test3cs ORDER BY x; +RESET enable_hashagg; SELECT count(DISTINCT x) FROM test3cs; SELECT x, count(*) FROM test3cs GROUP BY x ORDER BY x; SELECT x, row_number() OVER (ORDER BY x), rank() OVER (ORDER BY x) FROM test3cs ORDER BY x; @@ -794,6 +796,65 @@ INSERT INTO test33 VALUES (2, 'DEF'); -- they end up in the same partition (but it's platform-dependent which one) SELECT (SELECT count(*) FROM test33_0) <> (SELECT count(*) FROM test33_1); +-- +-- Bug #18568 +-- +-- Partitionwise aggregate (full or partial) should not be used when a +-- partition key's collation doesn't match that of the GROUP BY column it is +-- matched with. +SET max_parallel_workers_per_gather TO 0; +SET enable_incremental_sort TO off; + +CREATE TABLE pagg_tab3 (a text, c text collate case_insensitive) PARTITION BY LIST(c collate "C"); +CREATE TABLE pagg_tab3_p1 PARTITION OF pagg_tab3 FOR VALUES IN ('a', 'b'); +CREATE TABLE pagg_tab3_p2 PARTITION OF pagg_tab3 FOR VALUES IN ('B', 'A'); +INSERT INTO pagg_tab3 SELECT i % 4 + 1, substr('abAB', (i % 4) + 1 , 1) FROM generate_series(0, 19) i; +ANALYZE pagg_tab3; + +SET enable_partitionwise_aggregate TO false; +EXPLAIN (COSTS OFF) +SELECT upper(c collate case_insensitive), count(c) FROM pagg_tab3 GROUP BY c collate case_insensitive ORDER BY 1; +SELECT upper(c collate case_insensitive), count(c) FROM pagg_tab3 GROUP BY c collate case_insensitive ORDER BY 1; + +-- No "full" partitionwise aggregation allowed, though "partial" is allowed. +SET enable_partitionwise_aggregate TO true; +EXPLAIN (COSTS OFF) +SELECT upper(c collate case_insensitive), count(c) FROM pagg_tab3 GROUP BY c collate case_insensitive ORDER BY 1; +SELECT upper(c collate case_insensitive), count(c) FROM pagg_tab3 GROUP BY c collate case_insensitive ORDER BY 1; + +-- OK to use full partitionwise aggregate after changing the GROUP BY column's +-- collation to be the same as that of the partition key. +EXPLAIN (COSTS OFF) +SELECT c collate "C", count(c) FROM pagg_tab3 GROUP BY c collate "C" ORDER BY 1; +SELECT c collate "C", count(c) FROM pagg_tab3 GROUP BY c collate "C" ORDER BY 1; + +-- Partitionwise join should not be allowed too when the collation used by the +-- join keys doesn't match the partition key collation. +SET enable_partitionwise_join TO false; +EXPLAIN (COSTS OFF) +SELECT t1.c, count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c GROUP BY 1 ORDER BY t1.c COLLATE "C"; +SELECT t1.c, count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c GROUP BY 1 ORDER BY t1.c COLLATE "C"; + +SET enable_partitionwise_join TO true; +EXPLAIN (COSTS OFF) +SELECT t1.c, count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c GROUP BY 1 ORDER BY t1.c COLLATE "C"; +SELECT t1.c, count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c GROUP BY 1 ORDER BY t1.c COLLATE "C"; + +-- OK when the join clause uses the same collation as the partition key. +EXPLAIN (COSTS OFF) +SELECT t1.c COLLATE "C", count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c COLLATE "C" GROUP BY t1.c COLLATE "C" ORDER BY t1.c COLLATE "C"; +SELECT t1.c COLLATE "C", count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c COLLATE "C" GROUP BY t1.c COLLATE "C" ORDER BY t1.c COLLATE "C"; + +SET enable_partitionwise_join TO false; +EXPLAIN (COSTS OFF) +SELECT t1.c COLLATE "C", count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c COLLATE "C" GROUP BY t1.c COLLATE "C" ORDER BY t1.c COLLATE "C"; +SELECT t1.c COLLATE "C", count(t2.c) FROM pagg_tab3 t1 JOIN pagg_tab3 t2 ON t1.c = t2.c COLLATE "C" GROUP BY t1.c COLLATE "C" ORDER BY t1.c COLLATE "C"; + +DROP TABLE pagg_tab3; + +RESET enable_partitionwise_aggregate; +RESET max_parallel_workers_per_gather; +RESET enable_incremental_sort; -- cleanup RESET search_path; diff --git a/src/test/regress/sql/collate.sql b/src/test/regress/sql/collate.sql index c3d40fc1959c0..4b0e4472c3f6b 100644 --- a/src/test/regress/sql/collate.sql +++ b/src/test/regress/sql/collate.sql @@ -244,6 +244,14 @@ EXPLAIN (COSTS OFF) -- CREATE/DROP COLLATION +CREATE COLLATION builtin_c ( PROVIDER = builtin, LOCALE = "C" ); + +SELECT b FROM collate_test1 ORDER BY b COLLATE builtin_c; + +CREATE COLLATION builtin2 ( PROVIDER = builtin ); -- fails +CREATE COLLATION builtin2 ( PROVIDER = builtin, LOCALE = "en_US" ); -- fails +CREATE COLLATION builtin2 ( PROVIDER = builtin, LC_CTYPE = "C", LC_COLLATE = "C" ); -- fails + CREATE COLLATION mycoll1 FROM "C"; CREATE COLLATION mycoll2 ( LC_COLLATE = "POSIX", LC_CTYPE = "POSIX" ); CREATE COLLATION mycoll3 FROM "default"; -- intentionally unsupported diff --git a/src/test/regress/sql/collate.utf8.sql b/src/test/regress/sql/collate.utf8.sql new file mode 100644 index 0000000000000..1f5f9ef491d03 --- /dev/null +++ b/src/test/regress/sql/collate.utf8.sql @@ -0,0 +1,67 @@ +/* + * This test is for collations and character operations when using the + * builtin provider with the C.UTF-8 locale. + */ + +/* skip test if not UTF8 server encoding */ +SELECT getdatabaseencoding() <> 'UTF8' AS skip_test \gset +\if :skip_test +\quit +\endif + +SET client_encoding TO UTF8; + +-- +-- Test PG_C_UTF8 +-- + +CREATE COLLATION regress_pg_c_utf8 ( + provider = builtin, locale = 'C_UTF8'); -- fails +CREATE COLLATION regress_pg_c_utf8 ( + provider = builtin, locale = 'C.UTF8'); +DROP COLLATION regress_pg_c_utf8; +CREATE COLLATION regress_pg_c_utf8 ( + provider = builtin, locale = 'C.UTF-8'); + +CREATE TABLE test_pg_c_utf8 ( + t TEXT COLLATE PG_C_UTF8 +); +INSERT INTO test_pg_c_utf8 VALUES + ('abc DEF 123abc'), + ('ábc sßs ßss DÉF'), + ('DŽxxDŽ džxxDž Džxxdž'), + ('ȺȺȺ'), + ('ⱥⱥⱥ'), + ('ⱥȺ'); + +SELECT + t, lower(t), initcap(t), upper(t), + length(convert_to(t, 'UTF8')) AS t_bytes, + length(convert_to(lower(t), 'UTF8')) AS lower_t_bytes, + length(convert_to(initcap(t), 'UTF8')) AS initcap_t_bytes, + length(convert_to(upper(t), 'UTF8')) AS upper_t_bytes + FROM test_pg_c_utf8; + +DROP TABLE test_pg_c_utf8; + +-- negative test: Final_Sigma not used for builtin locale C.UTF-8 +SELECT lower('ΑΣ' COLLATE PG_C_UTF8); +SELECT lower('ΑͺΣͺ' COLLATE PG_C_UTF8); +SELECT lower('Α΄Σ΄' COLLATE PG_C_UTF8); + +-- properties + +SELECT 'xyz' ~ '[[:alnum:]]' COLLATE PG_C_UTF8; +SELECT 'xyz' !~ '[[:upper:]]' COLLATE PG_C_UTF8; +SELECT '@' !~ '[[:alnum:]]' COLLATE PG_C_UTF8; +SELECT '=' ~ '[[:punct:]]' COLLATE PG_C_UTF8; -- symbols are punctuation in posix +SELECT 'a8a' ~ '[[:digit:]]' COLLATE PG_C_UTF8; +SELECT '൧' !~ '\d' COLLATE PG_C_UTF8; -- only 0-9 considered digits in posix + +-- case mapping + +SELECT 'xYz' ~* 'XyZ' COLLATE PG_C_UTF8; +SELECT 'xAb' ~* '[W-Y]' COLLATE PG_C_UTF8; +SELECT 'xAb' !~* '[c-d]' COLLATE PG_C_UTF8; +SELECT 'Δ' ~* '[γ-λ]' COLLATE PG_C_UTF8; +SELECT 'δ' ~* '[Γ-Λ]' COLLATE PG_C_UTF8; -- same as above with cases reversed diff --git a/src/test/regress/sql/collate.windows.win1252.sql b/src/test/regress/sql/collate.windows.win1252.sql index 353d769a5bdbd..c7d6c97db1622 100644 --- a/src/test/regress/sql/collate.windows.win1252.sql +++ b/src/test/regress/sql/collate.windows.win1252.sql @@ -400,8 +400,13 @@ drop type textrange_en_us; -- nondeterministic collations -- (not supported with libc provider) - -CREATE COLLATION ctest_det (locale = 'en_US', deterministic = true); +do $$ +BEGIN + EXECUTE 'CREATE COLLATION ctest_det (locale = ' || + quote_literal((SELECT collcollate FROM pg_collation WHERE + collname = 'en_US')) || ', deterministic = true);'; + END +$$; CREATE COLLATION ctest_nondet (locale = 'en_US', deterministic = false); diff --git a/src/test/regress/sql/compression.sql b/src/test/regress/sql/compression.sql index 7179a5002ec5d..490595fcfb263 100644 --- a/src/test/regress/sql/compression.sql +++ b/src/test/regress/sql/compression.sql @@ -93,9 +93,11 @@ INSERT INTO cmpart VALUES (repeat('123456789', 4004)); SELECT pg_column_compression(f1) FROM cmpart1; SELECT pg_column_compression(f1) FROM cmpart2; --- test compression with inheritance, error -CREATE TABLE cminh() INHERITS(cmdata, cmdata1); -CREATE TABLE cminh(f1 TEXT COMPRESSION lz4) INHERITS(cmdata); +-- test compression with inheritance +CREATE TABLE cminh() INHERITS(cmdata, cmdata1); -- error +CREATE TABLE cminh(f1 TEXT COMPRESSION lz4) INHERITS(cmdata); -- error +CREATE TABLE cmdata3(f1 text); +CREATE TABLE cminh() INHERITS (cmdata, cmdata3); -- test default_toast_compression GUC SET default_toast_compression = ''; diff --git a/src/test/regress/sql/constraints.sql b/src/test/regress/sql/constraints.sql index 5ffcd4ffc7be6..e3e3bea70911b 100644 --- a/src/test/regress/sql/constraints.sql +++ b/src/test/regress/sql/constraints.sql @@ -449,6 +449,47 @@ ALTER TABLE parted_fk_naming ATTACH PARTITION parted_fk_naming_1 FOR VALUES IN ( SELECT conname FROM pg_constraint WHERE conrelid = 'parted_fk_naming_1'::regclass AND contype = 'f'; DROP TABLE parted_fk_naming; +-- +-- Test various ways to create primary keys on partitions, linked to unique +-- indexes (without constraints) on the partitioned table. Ideally these should +-- fail, but we don't dare change released behavior, so instead cope with it at +-- DETACH time. +CREATE TEMP TABLE t (a integer, b integer) PARTITION BY HASH (a, b); +CREATE TEMP TABLE tp (a integer, b integer, PRIMARY KEY (a, b), UNIQUE (b, a)); +ALTER TABLE t ATTACH PARTITION tp FOR VALUES WITH (MODULUS 1, REMAINDER 0); +CREATE UNIQUE INDEX t_a_idx ON t (a, b); +CREATE UNIQUE INDEX t_b_idx ON t (b, a); +ALTER INDEX t_a_idx ATTACH PARTITION tp_pkey; +ALTER INDEX t_b_idx ATTACH PARTITION tp_b_a_key; +SELECT conname, conparentid, conislocal, coninhcount + FROM pg_constraint WHERE conname IN ('tp_pkey', 'tp_b_a_key') + ORDER BY conname DESC; +ALTER TABLE t DETACH PARTITION tp; +DROP TABLE t, tp; + +CREATE TEMP TABLE t (a integer) PARTITION BY LIST (a); +CREATE TEMP TABLE tp (a integer PRIMARY KEY); +CREATE UNIQUE INDEX t_a_idx ON t (a); +ALTER TABLE t ATTACH PARTITION tp FOR VALUES IN (1); +ALTER TABLE t DETACH PARTITION tp; +DROP TABLE t, tp; + +CREATE TEMP TABLE t (a integer) PARTITION BY LIST (a); +CREATE TEMP TABLE tp (a integer PRIMARY KEY); +CREATE UNIQUE INDEX t_a_idx ON ONLY t (a); +ALTER TABLE t ATTACH PARTITION tp FOR VALUES IN (1); +ALTER TABLE t DETACH PARTITION tp; +DROP TABLE t, tp; + +CREATE TABLE regress_constr_partitioned (a integer) PARTITION BY LIST (a); +CREATE TABLE regress_constr_partition1 PARTITION OF regress_constr_partitioned FOR VALUES IN (1); +ALTER TABLE regress_constr_partition1 ADD PRIMARY KEY (a); +CREATE UNIQUE INDEX ON regress_constr_partitioned (a); +BEGIN; +ALTER TABLE regress_constr_partitioned DETACH PARTITION regress_constr_partition1; +ROLLBACK; +-- Leave this one in funny state for pg_upgrade testing + -- test a HOT update that invalidates the conflicting tuple. -- the trigger should still fire and catch the violation diff --git a/src/test/regress/sql/conversion.sql b/src/test/regress/sql/conversion.sql index 9a65fca91fbd5..a80d62367a20a 100644 --- a/src/test/regress/sql/conversion.sql +++ b/src/test/regress/sql/conversion.sql @@ -8,6 +8,11 @@ \set regresslib :libdir '/regress' :dlsuffix +CREATE FUNCTION test_enc_setup() RETURNS void + AS :'regresslib', 'test_enc_setup' + LANGUAGE C STRICT; +SELECT FROM test_enc_setup(); + CREATE FUNCTION test_enc_conversion(bytea, name, name, bool, validlen OUT int, result OUT bytea) AS :'regresslib', 'test_enc_conversion' LANGUAGE C STRICT; @@ -295,11 +300,14 @@ insert into gb18030_inputs values ('\x666f6f84309c38', 'valid, translates to UTF-8 by mapping function'), ('\x666f6f84309c', 'incomplete char '), ('\x666f6f84309c0a', 'incomplete char, followed by newline '), + ('\x666f6f84', 'incomplete char at end'), ('\x666f6f84309c3800', 'invalid, NUL byte'), ('\x666f6f84309c0038', 'invalid, NUL byte'); --- Test GB18030 verification -select description, inbytes, (test_conv(inbytes, 'gb18030', 'gb18030')).* from gb18030_inputs; +-- Test GB18030 verification. Round-trip through text so the backing of the +-- bytea values is palloc, not shared_buffers. This lets Valgrind detect +-- reads past the end. +select description, inbytes, (test_conv(inbytes::text::bytea, 'gb18030', 'gb18030')).* from gb18030_inputs; -- Test conversions from GB18030 select description, inbytes, (test_conv(inbytes, 'gb18030', 'utf8')).* from gb18030_inputs; diff --git a/src/test/regress/sql/copy.sql b/src/test/regress/sql/copy.sql index f9da7b1508f38..e2dd24cb3519b 100644 --- a/src/test/regress/sql/copy.sql +++ b/src/test/regress/sql/copy.sql @@ -268,3 +268,55 @@ a c b SELECT * FROM header_copytest ORDER BY a; drop table header_copytest; + +-- test COPY with overlong column defaults +create temp table oversized_column_default ( + col1 varchar(5) DEFAULT 'more than 5 chars', + col2 varchar(5)); +-- normal COPY should work +copy oversized_column_default from stdin; +\. +-- error if the column is excluded +copy oversized_column_default (col2) from stdin; +\. +-- error if the DEFAULT option is given +copy oversized_column_default from stdin (default ''); +\. +drop table oversized_column_default; + + +-- +-- Create partitioned table that does not allow bulk insertions, to test bugs +-- related to the reuse of BulkInsertState across partitions (only done when +-- not using bulk insert). Switching between partitions often makes it more +-- likely to encounter these bugs, so we just switch on roughly every insert +-- by having an even/odd number partition and inserting evenly distributed +-- data. +-- +CREATE TABLE parted_si ( + id int not null, + data text not null, + -- prevent use of bulk insert by having a volatile function + rand float8 not null default random() +) +PARTITION BY LIST((id % 2)); + +CREATE TABLE parted_si_p_even PARTITION OF parted_si FOR VALUES IN (0); +CREATE TABLE parted_si_p_odd PARTITION OF parted_si FOR VALUES IN (1); + +-- Test that bulk relation extension handles reusing a single BulkInsertState +-- across partitions. Without the fix applied, this reliably reproduces +-- #18130 unless shared_buffers is extremely small (preventing any use of bulk +-- relation extension). See +-- https://postgr.es/m/18130-7a86a7356a75209d%40postgresql.org +-- https://postgr.es/m/257696.1695670946%40sss.pgh.pa.us +\set filename :abs_srcdir '/data/desc.data' +COPY parted_si(id, data) FROM :'filename'; + +-- An earlier bug (see commit b1ecb9b3fcf) could end up using a buffer from +-- the wrong partition. This test is *not* guaranteed to trigger that bug, but +-- does so when shared_buffers is small enough. To test if we encountered the +-- bug, check that the partition condition isn't violated. +SELECT tableoid::regclass, id % 2 = 0 is_even, count(*) from parted_si GROUP BY 1, 2 ORDER BY 1; + +DROP TABLE parted_si; diff --git a/src/test/regress/sql/copy2.sql b/src/test/regress/sql/copy2.sql index d759635068c1c..6b75b6c7ea8fd 100644 --- a/src/test/regress/sql/copy2.sql +++ b/src/test/regress/sql/copy2.sql @@ -66,16 +66,28 @@ COPY x from stdin (force_not_null (a), force_not_null (b)); COPY x from stdin (force_null (a), force_null (b)); COPY x from stdin (convert_selectively (a), convert_selectively (b)); COPY x from stdin (encoding 'sql_ascii', encoding 'sql_ascii'); +COPY x from stdin (on_error ignore, on_error ignore); +COPY x from stdin (log_verbosity default, log_verbosity verbose); -- incorrect options -COPY x to stdin (format BINARY, delimiter ','); -COPY x to stdin (format BINARY, null 'x'); -COPY x to stdin (format TEXT, force_quote(a)); +COPY x from stdin (format BINARY, delimiter ','); +COPY x from stdin (format BINARY, null 'x'); +COPY x from stdin (format BINARY, on_error ignore); +COPY x from stdin (on_error unsupported); +COPY x from stdin (format TEXT, force_quote(a)); +COPY x from stdin (format TEXT, force_quote *); COPY x from stdin (format CSV, force_quote(a)); -COPY x to stdout (format TEXT, force_not_null(a)); -COPY x to stdin (format CSV, force_not_null(a)); -COPY x to stdout (format TEXT, force_null(a)); -COPY x to stdin (format CSV, force_null(a)); +COPY x from stdin (format CSV, force_quote *); +COPY x from stdin (format TEXT, force_not_null(a)); +COPY x from stdin (format TEXT, force_not_null *); +COPY x to stdout (format CSV, force_not_null(a)); +COPY x to stdout (format CSV, force_not_null *); +COPY x from stdin (format TEXT, force_null(a)); +COPY x from stdin (format TEXT, force_null *); +COPY x to stdout (format CSV, force_null(a)); +COPY x to stdout (format CSV, force_null *); +COPY x to stdout (format BINARY, on_error unsupported); +COPY x from stdin (log_verbosity unsupported); -- too many columns in column list: should fail COPY x (a, b, c, d, e, d, c) from stdin; @@ -344,6 +356,36 @@ ROLLBACK; BEGIN; COPY forcetest (d, e) FROM STDIN WITH (FORMAT csv, FORCE_NULL(b)); ROLLBACK; +-- should succeed with no effect ("b" remains an empty string, "c" remains NULL) +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL *, FORCE_NULL *); +4,,"" +\. +COMMIT; +SELECT b, c FROM forcetest WHERE a = 4; +-- should succeed with effect ("b" remains an empty string) +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL *); +5,,"" +\. +COMMIT; +SELECT b, c FROM forcetest WHERE a = 5; +-- should succeed with effect ("c" remains NULL) +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NULL *); +6,"b","" +\. +COMMIT; +SELECT b, c FROM forcetest WHERE a = 6; +-- should fail with "conflicting or redundant options" error +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL *, FORCE_NOT_NULL(b)); +ROLLBACK; +-- should fail with "conflicting or redundant options" error +BEGIN; +COPY forcetest (a, b, c) FROM STDIN WITH (FORMAT csv, FORCE_NULL *, FORCE_NULL(b)); +ROLLBACK; + \pset null '' -- test case with whole-row Var in a check constraint @@ -464,6 +506,63 @@ test1 SELECT * FROM instead_of_insert_tbl; COMMIT; +-- tests for on_error option +CREATE TABLE check_ign_err (n int, m int[], k int); +COPY check_ign_err FROM STDIN WITH (on_error stop); +1 {1} 1 +a {2} 2 +3 {3} 3333333333 +4 {a, 4} 4 + +5 {5} 5 +\. + +-- want context for notices +\set SHOW_CONTEXT always + +COPY check_ign_err FROM STDIN WITH (on_error ignore, log_verbosity verbose); +1 {1} 1 +a {2} 2 +3 {3} 3333333333 +4 {a, 4} 4 + +5 {5} 5 +6 a +7 {7} a +8 {8} 8 +\. + +-- tests for on_error option with log_verbosity and null constraint via domain +CREATE DOMAIN dcheck_ign_err2 varchar(15) NOT NULL; +CREATE TABLE check_ign_err2 (n int, m int[], k int, l dcheck_ign_err2); +COPY check_ign_err2 FROM STDIN WITH (on_error ignore, log_verbosity verbose); +1 {1} 1 'foo' +2 {2} 2 \N +\. + +-- reset context choice +\set SHOW_CONTEXT errors + +SELECT * FROM check_ign_err; + +SELECT * FROM check_ign_err2; + +-- test datatype error that can't be handled as soft: should fail +CREATE TABLE hard_err(foo widget); +COPY hard_err FROM STDIN WITH (on_error ignore); +1 +\. + +-- test missing data: should fail +COPY check_ign_err FROM STDIN WITH (on_error ignore); +1 {1} +\. + +-- test extra data: should fail +COPY check_ign_err FROM STDIN WITH (on_error ignore); +1 {1} 3 abc +\. + -- clean up DROP TABLE forcetest; DROP TABLE vistest; @@ -478,6 +577,10 @@ DROP TABLE instead_of_insert_tbl; DROP VIEW instead_of_insert_tbl_view; DROP VIEW instead_of_insert_tbl_view_2; DROP FUNCTION fun_instead_of_insert_tbl(); +DROP TABLE check_ign_err; +DROP TABLE check_ign_err2; +DROP DOMAIN dcheck_ign_err2; +DROP TABLE hard_err; -- -- COPY FROM ... DEFAULT diff --git a/src/test/regress/sql/copydml.sql b/src/test/regress/sql/copydml.sql index 4578342253b62..b7eeb0eed8150 100644 --- a/src/test/regress/sql/copydml.sql +++ b/src/test/regress/sql/copydml.sql @@ -66,6 +66,10 @@ create rule qqq as on delete to copydml_test where old.t <> 'f' do instead inser copy (delete from copydml_test) to stdout; drop rule qqq on copydml_test; +create rule qqq as on insert to copydml_test do instead notify copydml_test; +copy (insert into copydml_test default values) to stdout; +drop rule qqq on copydml_test; + -- triggers create function qqq_trig() returns trigger as $$ begin diff --git a/src/test/regress/sql/create_am.sql b/src/test/regress/sql/create_am.sql index 2785ffd8bbb36..754fe0c694bc5 100644 --- a/src/test/regress/sql/create_am.sql +++ b/src/test/regress/sql/create_am.sql @@ -124,8 +124,11 @@ CREATE SEQUENCE tableam_seq_heap2 USING heap2; CREATE MATERIALIZED VIEW tableam_tblmv_heap2 USING heap2 AS SELECT * FROM tableam_tbl_heap2; SELECT f1 FROM tableam_tblmv_heap2 ORDER BY f1; --- CREATE TABLE .. PARTITION BY doesn't not support USING +-- CREATE TABLE .. PARTITION BY supports USING. CREATE TABLE tableam_parted_heap2 (a text, b int) PARTITION BY list (a) USING heap2; +SELECT a.amname FROM pg_class c, pg_am a + WHERE c.relname = 'tableam_parted_heap2' AND a.oid = c.relam; +DROP TABLE tableam_parted_heap2; CREATE TABLE tableam_parted_heap2 (a text, b int) PARTITION BY list (a); -- new partitions will inherit from the current default, rather the partition root @@ -188,6 +191,17 @@ ALTER TABLE heaptable SET ACCESS METHOD heap2; SELECT amname FROM pg_class c, pg_am am WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heaptable; +-- DEFAULT access method +BEGIN; +SET LOCAL default_table_access_method TO heap2; +ALTER TABLE heaptable SET ACCESS METHOD DEFAULT; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; +SET LOCAL default_table_access_method TO heap; +ALTER TABLE heaptable SET ACCESS METHOD DEFAULT; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; +ROLLBACK; -- ALTER MATERIALIZED VIEW SET ACCESS METHOD CREATE MATERIALIZED VIEW heapmv USING heap AS SELECT * FROM heaptable; SELECT amname FROM pg_class c, pg_am am @@ -198,14 +212,105 @@ SELECT amname FROM pg_class c, pg_am am SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heapmv; -- No support for multiple subcommands ALTER TABLE heaptable SET ACCESS METHOD heap, SET ACCESS METHOD heap2; +ALTER TABLE heaptable SET ACCESS METHOD DEFAULT, SET ACCESS METHOD heap2; ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap, SET ACCESS METHOD heap2; DROP MATERIALIZED VIEW heapmv; DROP TABLE heaptable; --- No support for partitioned tables. -CREATE TABLE am_partitioned(x INT, y INT) - PARTITION BY hash (x); + +-- Partitioned table with USING +CREATE TABLE am_partitioned(x INT, y INT) PARTITION BY hash (x) USING heap2; +SELECT pg_describe_object(classid, objid, objsubid) AS obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as refobj + FROM pg_depend, pg_am + WHERE pg_depend.refclassid = 'pg_am'::regclass + AND pg_am.oid = pg_depend.refobjid + AND pg_depend.objid = 'am_partitioned'::regclass; +DROP TABLE am_partitioned; + +-- Partition hierarchies with access methods +BEGIN; +SET LOCAL default_table_access_method = 'heap'; +CREATE TABLE am_partitioned(x INT, y INT) PARTITION BY hash (x); +-- pg_class.relam is 0, no dependency recorded between the AM and the +-- partitioned table. +SELECT relam FROM pg_class WHERE relname = 'am_partitioned'; +SELECT pg_describe_object(classid, objid, objsubid) AS obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as refobj + FROM pg_depend, pg_am + WHERE pg_depend.refclassid = 'pg_am'::regclass + AND pg_am.oid = pg_depend.refobjid + AND pg_depend.objid = 'am_partitioned'::regclass; +-- New default is set, with dependency added. +ALTER TABLE am_partitioned SET ACCESS METHOD heap2; +SELECT a.amname FROM pg_class c, pg_am a + WHERE c.relname = 'am_partitioned' AND a.oid = c.relam; +SELECT pg_describe_object(classid, objid, objsubid) AS obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as refobj + FROM pg_depend, pg_am + WHERE pg_depend.refclassid = 'pg_am'::regclass + AND pg_am.oid = pg_depend.refobjid + AND pg_depend.objid = 'am_partitioned'::regclass; +-- Default is set, with dependency updated. +SET LOCAL default_table_access_method = 'heap2'; +ALTER TABLE am_partitioned SET ACCESS METHOD heap; +SELECT a.amname FROM pg_class c, pg_am a + WHERE c.relname = 'am_partitioned' AND a.oid = c.relam; +-- Dependency pinned, hence removed. +SELECT pg_describe_object(classid, objid, objsubid) AS obj, + pg_describe_object(refclassid, refobjid, refobjsubid) as refobj + FROM pg_depend, pg_am + WHERE pg_depend.refclassid = 'pg_am'::regclass + AND pg_am.oid = pg_depend.refobjid + AND pg_depend.objid = 'am_partitioned'::regclass; +-- Default and AM set in the clause are the same, relam should be set. +SET LOCAL default_table_access_method = 'heap2'; ALTER TABLE am_partitioned SET ACCESS METHOD heap2; +SELECT a.amname FROM pg_class c, pg_am a + WHERE c.relname = 'am_partitioned' AND a.oid = c.relam; +-- Reset to default +ALTER TABLE am_partitioned SET ACCESS METHOD DEFAULT; +SELECT relam FROM pg_class WHERE relname = 'am_partitioned'; +-- Upon ALTER TABLE SET ACCESS METHOD on a partitioned table, new partitions +-- will inherit the AM set. Existing partitioned are unchanged. +SELECT relam FROM pg_class WHERE relname = 'am_partitioned'; +SET LOCAL default_table_access_method = 'heap'; +CREATE TABLE am_partitioned_0 PARTITION OF am_partitioned + FOR VALUES WITH (MODULUS 10, REMAINDER 0); +SET LOCAL default_table_access_method = 'heap2'; +CREATE TABLE am_partitioned_1 PARTITION OF am_partitioned + FOR VALUES WITH (MODULUS 10, REMAINDER 1); +SET LOCAL default_table_access_method = 'heap'; +ALTER TABLE am_partitioned SET ACCESS METHOD heap2; +CREATE TABLE am_partitioned_2 PARTITION OF am_partitioned + FOR VALUES WITH (MODULUS 10, REMAINDER 2); +ALTER TABLE am_partitioned SET ACCESS METHOD DEFAULT; +SELECT relam FROM pg_class WHERE relname = 'am_partitioned'; +CREATE TABLE am_partitioned_3 PARTITION OF am_partitioned + FOR VALUES WITH (MODULUS 10, REMAINDER 3); +-- Partitioned table with relam at 0 +ALTER TABLE am_partitioned SET ACCESS METHOD DEFAULT; +CREATE TABLE am_partitioned_5p PARTITION OF am_partitioned + FOR VALUES WITH (MODULUS 10, REMAINDER 5) PARTITION BY hash(y); +-- Partitions of this partitioned table inherit default AM at creation +-- time. +CREATE TABLE am_partitioned_5p1 PARTITION OF am_partitioned_5p + FOR VALUES WITH (MODULUS 10, REMAINDER 1); +-- Partitioned table with relam set. +ALTER TABLE am_partitioned SET ACCESS METHOD heap2; +CREATE TABLE am_partitioned_6p PARTITION OF am_partitioned + FOR VALUES WITH (MODULUS 10, REMAINDER 6) PARTITION BY hash(y); +-- Partitions of this partitioned table inherit its AM. +CREATE TABLE am_partitioned_6p1 PARTITION OF am_partitioned_6p + FOR VALUES WITH (MODULUS 10, REMAINDER 1); +SELECT c.relname, a.amname FROM pg_class c, pg_am a + WHERE c.relam = a.oid AND + c.relname LIKE 'am_partitioned%' +UNION ALL +SELECT c.relname, 'default' FROM pg_class c + WHERE c.relam = 0 + AND c.relname LIKE 'am_partitioned%' ORDER BY 1; DROP TABLE am_partitioned; +COMMIT; -- Second, create objects in the new AM by changing the default AM BEGIN; @@ -253,6 +358,9 @@ CREATE TABLE i_am_a_failure() USING i_do_not_exist_am; CREATE TABLE i_am_a_failure() USING "I do not exist AM"; CREATE TABLE i_am_a_failure() USING "btree"; +-- Other weird invalid cases that cause problems +CREATE FOREIGN TABLE fp PARTITION OF tableam_parted_a_heap2 DEFAULT SERVER x; + -- Drop table access method, which fails as objects depends on it DROP ACCESS METHOD heap2; diff --git a/src/test/regress/sql/create_index.sql b/src/test/regress/sql/create_index.sql index d49ce9f3007a8..e296891cab806 100644 --- a/src/test/regress/sql/create_index.sql +++ b/src/test/regress/sql/create_index.sql @@ -668,6 +668,7 @@ SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; +SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IN (-1, 0, 1); DROP INDEX onek_nulltest; @@ -753,7 +754,7 @@ SELECT count(*) FROM dupindexcols WHERE f1 BETWEEN 'WA' AND 'ZZZ' and id < 1000 and f1 ~<~ 'YX'; -- --- Check ordering of =ANY indexqual results (bug in 9.2.0) +-- Check that index scans with =ANY indexquals return rows in index order -- explain (costs off) @@ -765,6 +766,7 @@ SELECT unique1 FROM tenk1 WHERE unique1 IN (1,42,7) ORDER BY unique1; +-- Non-required array scan key on "tenthous": explain (costs off) SELECT thousand, tenthous FROM tenk1 WHERE thousand < 2 AND tenthous IN (1001,3000) @@ -774,18 +776,68 @@ SELECT thousand, tenthous FROM tenk1 WHERE thousand < 2 AND tenthous IN (1001,3000) ORDER BY thousand; -SET enable_indexonlyscan = OFF; - +-- Non-required array scan key on "tenthous", backward scan: explain (costs off) SELECT thousand, tenthous FROM tenk1 WHERE thousand < 2 AND tenthous IN (1001,3000) -ORDER BY thousand; +ORDER BY thousand DESC, tenthous DESC; SELECT thousand, tenthous FROM tenk1 WHERE thousand < 2 AND tenthous IN (1001,3000) -ORDER BY thousand; +ORDER BY thousand DESC, tenthous DESC; + +-- +-- Check elimination of redundant and contradictory index quals +-- +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 = ANY('{7, 8, 9}'); + +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 = ANY('{7, 8, 9}'); + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 = ANY('{7, 14, 22}') and unique1 = ANY('{33, 44}'::bigint[]); + +SELECT unique1 FROM tenk1 WHERE unique1 = ANY('{7, 14, 22}') and unique1 = ANY('{33, 44}'::bigint[]); + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 = 1; + +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 = 1; + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 = 12345; + +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 = 12345; + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 >= 42; + +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 >= 42; + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 > 42; + +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 > 42; + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 > 9996 and unique1 >= 9999; + +SELECT unique1 FROM tenk1 WHERE unique1 > 9996 and unique1 >= 9999; + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 < 3 and unique1 <= 3; + +SELECT unique1 FROM tenk1 WHERE unique1 < 3 and unique1 <= 3; + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 < 3 and unique1 < (-1)::bigint; + +SELECT unique1 FROM tenk1 WHERE unique1 < 3 and unique1 < (-1)::bigint; + +explain (costs off) +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 < (-1)::bigint; -RESET enable_indexonlyscan; +SELECT unique1 FROM tenk1 WHERE unique1 IN (1, 42, 7) and unique1 < (-1)::bigint; -- -- Check elimination of constant-NULL subexpressions diff --git a/src/test/regress/sql/create_operator.sql b/src/test/regress/sql/create_operator.sql index f53e24db3c408..a3096f17df0e2 100644 --- a/src/test/regress/sql/create_operator.sql +++ b/src/test/regress/sql/create_operator.sql @@ -210,6 +210,49 @@ CREATE OPERATOR #*# ( ); ROLLBACK; +-- Should fail. An operator cannot be its own negator. +BEGIN TRANSACTION; +CREATE OPERATOR === ( + leftarg = integer, + rightarg = integer, + procedure = int4eq, + negator = === +); +ROLLBACK; + +-- Should fail. An operator cannot be its own negator. Here we check that +-- this error is detected when replacing a shell operator. +BEGIN TRANSACTION; +-- create a shell operator for ===!!! by referencing it as a commutator +CREATE OPERATOR === ( + leftarg = integer, + rightarg = integer, + procedure = int4eq, + commutator = ===!!! +); +CREATE OPERATOR ===!!! ( + leftarg = integer, + rightarg = integer, + procedure = int4ne, + negator = ===!!! +); +ROLLBACK; + +-- test that we can't use part of an existing commutator or negator pair +-- as a commutator or negator +CREATE OPERATOR === ( + leftarg = integer, + rightarg = integer, + procedure = int4eq, + commutator = = +); +CREATE OPERATOR === ( + leftarg = integer, + rightarg = integer, + procedure = int4eq, + negator = <> +); + -- invalid: non-lowercase quoted identifiers CREATE OPERATOR === ( diff --git a/src/test/regress/sql/create_procedure.sql b/src/test/regress/sql/create_procedure.sql index 35b872779efc1..069a3727cedb7 100644 --- a/src/test/regress/sql/create_procedure.sql +++ b/src/test/regress/sql/create_procedure.sql @@ -90,7 +90,16 @@ AS $$ CALL ptest4a(a, b); -- error, not supported $$; -DROP PROCEDURE ptest4a; +-- we used to get confused by a single output argument that is composite +CREATE PROCEDURE ptest4c(INOUT comp int8_tbl) +LANGUAGE SQL +AS $$ +SELECT ROW(1, 2); +$$; + +CALL ptest4c(NULL); + +DROP PROCEDURE ptest4a, ptest4c; -- named and default parameters @@ -122,6 +131,33 @@ $$; CALL ptest6(1, 2); +CREATE PROCEDURE ptest6a(inout a anyelement, out b anyelement) +LANGUAGE SQL +AS $$ +SELECT $1, $1; +$$; + +CALL ptest6a(1, null); +CALL ptest6a(1.1, null); + +CREATE PROCEDURE ptest6b(a anyelement, out b anyelement, out c anyarray) +LANGUAGE SQL +AS $$ +SELECT $1, array[$1]; +$$; + +CALL ptest6b(1, null, null); +CALL ptest6b(1.1, null, null); + +CREATE PROCEDURE ptest6c(inout a anyelement, inout b anyelement) +LANGUAGE SQL +AS $$ +SELECT $1, 1; +$$; + +CALL ptest6c(1, null); +CALL ptest6c(1.1, null); -- fails before v13 + -- collation assignment diff --git a/src/test/regress/sql/create_role.sql b/src/test/regress/sql/create_role.sql index 12582a3cc29df..4491a28a8ae99 100644 --- a/src/test/regress/sql/create_role.sql +++ b/src/test/regress/sql/create_role.sql @@ -206,7 +206,8 @@ DROP INDEX tenant_idx; DROP TABLE tenant_table; DROP VIEW tenant_view; DROP SCHEMA regress_tenant2_schema; -DROP ROLE regress_tenant; +-- check for duplicated drop +DROP ROLE regress_tenant, regress_tenant; DROP ROLE regress_tenant2; DROP ROLE regress_rolecreator; DROP ROLE regress_role_admin; diff --git a/src/test/regress/sql/create_table.sql b/src/test/regress/sql/create_table.sql index 93ccf77d4a143..1fd4cbfa7ef0d 100644 --- a/src/test/regress/sql/create_table.sql +++ b/src/test/regress/sql/create_table.sql @@ -106,12 +106,6 @@ CREATE TABLE partitioned ( a2 int ) PARTITION BY LIST (a1, a2); -- fail --- unsupported constraint type for partitioned tables -CREATE TABLE partitioned ( - a int, - EXCLUDE USING gist (a WITH &&) -) PARTITION BY RANGE (a); - -- prevent using prohibited expressions in the key CREATE FUNCTION retset (a int) RETURNS SETOF int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE; CREATE TABLE partitioned ( @@ -532,11 +526,11 @@ CREATE TABLE part_b PARTITION OF parted ( CONSTRAINT check_b CHECK (b >= 0) ) FOR VALUES IN ('b'); -- conislocal should be false for any merged constraints, true otherwise -SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass ORDER BY conislocal, coninhcount; +SELECT conname, conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass ORDER BY coninhcount DESC, conname; -- Once check_b is added to the parent, it should be made non-local for part_b ALTER TABLE parted ADD CONSTRAINT check_b CHECK (b >= 0); -SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass; +SELECT conname, conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass ORDER BY coninhcount DESC, conname; -- Neither check_a nor check_b are droppable from part_b ALTER TABLE part_b DROP CONSTRAINT check_a; @@ -546,7 +540,7 @@ ALTER TABLE part_b DROP CONSTRAINT check_b; -- traditional inheritance where they will be left behind, because they would -- be local constraints. ALTER TABLE parted DROP CONSTRAINT check_a, DROP CONSTRAINT check_b; -SELECT conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass; +SELECT conname, conislocal, coninhcount FROM pg_constraint WHERE conrelid = 'part_b'::regclass ORDER BY coninhcount DESC, conname; -- specify PARTITION BY for a partition CREATE TABLE fail_part_col_not_found PARTITION OF parted FOR VALUES IN ('c') PARTITION BY RANGE (c); diff --git a/src/test/regress/sql/create_table_like.sql b/src/test/regress/sql/create_table_like.sql index 4929d373a2f11..04008a027b8d9 100644 --- a/src/test/regress/sql/create_table_like.sql +++ b/src/test/regress/sql/create_table_like.sql @@ -95,8 +95,16 @@ CREATE TABLE test_like_5c (LIKE test_like_4 INCLUDING ALL) INHERITS (test_like_5, test_like_5x); \d test_like_5c +-- Test updating of column numbers in statistics expressions (bug #18468) +CREATE TABLE test_like_6 (a int, c text, b text); +CREATE STATISTICS ext_stat ON (a || b) FROM test_like_6; +ALTER TABLE test_like_6 DROP COLUMN c; +CREATE TABLE test_like_6c (LIKE test_like_6 INCLUDING ALL); +\d+ test_like_6c + DROP TABLE test_like_4, test_like_4a, test_like_4b, test_like_4c, test_like_4d; DROP TABLE test_like_5, test_like_5x, test_like_5c; +DROP TABLE test_like_6, test_like_6c; CREATE TABLE inhg (x text, LIKE inhx INCLUDING INDEXES, y text); /* copies indexes */ INSERT INTO inhg VALUES (5, 10); diff --git a/src/test/regress/sql/create_view.sql b/src/test/regress/sql/create_view.sql index 8838a40f7abbe..ae6841308b9b6 100644 --- a/src/test/regress/sql/create_view.sql +++ b/src/test/regress/sql/create_view.sql @@ -373,6 +373,22 @@ ALTER TABLE tmp1 RENAME TO tx1; \d+ aliased_view_3 \d+ aliased_view_4 +-- Test correct deparsing of ORDER BY when there is an output name conflict + +create view aliased_order_by as +select x1 as x2, x2 as x1, x3 from tt1 + order by x2; -- this is interpreted per SQL92, so really ordering by x1 + +\d+ aliased_order_by + +alter view aliased_order_by rename column x1 to x0; + +\d+ aliased_order_by + +alter view aliased_order_by rename column x3 to x1; + +\d+ aliased_order_by + -- Test aliasing of joins create view view_of_joins as @@ -813,6 +829,15 @@ select x + y + z as c1, from (values(1,2,3)) v(x,y,z); select pg_get_viewdef('tt26v', true); +-- test restriction on non-system view expansion. +create table tt27v_tbl (a int); +create view tt27v as select a from tt27v_tbl; +set restrict_nonsystem_relation_kind to 'view'; +select a from tt27v where a > 0; -- Error +insert into tt27v values (1); -- Error +select viewname from pg_views where viewname = 'tt27v'; -- Ok to access a system view. +reset restrict_nonsystem_relation_kind; + -- clean up all the random objects we made above DROP SCHEMA temp_view_test CASCADE; DROP SCHEMA testviewschm2 CASCADE; diff --git a/src/test/regress/sql/database.sql b/src/test/regress/sql/database.sql new file mode 100644 index 0000000000000..46ad2634781ea --- /dev/null +++ b/src/test/regress/sql/database.sql @@ -0,0 +1,24 @@ +CREATE DATABASE regression_tbd + ENCODING utf8 LC_COLLATE "C" LC_CTYPE "C" TEMPLATE template0; +ALTER DATABASE regression_tbd RENAME TO regression_utf8; +ALTER DATABASE regression_utf8 SET TABLESPACE regress_tblspace; +ALTER DATABASE regression_utf8 RESET TABLESPACE; +ALTER DATABASE regression_utf8 CONNECTION_LIMIT 123; + +-- Test PgDatabaseToastTable. Doing this with GRANT would be slow. +BEGIN; +UPDATE pg_database +SET datacl = array_fill(makeaclitem(10, 10, 'USAGE', false), ARRAY[5e5::int]) +WHERE datname = 'regression_utf8'; +-- load catcache entry, if nothing else does +ALTER DATABASE regression_utf8 RESET TABLESPACE; +ROLLBACK; + +CREATE ROLE regress_datdba_before; +CREATE ROLE regress_datdba_after; +ALTER DATABASE regression_utf8 OWNER TO regress_datdba_before; +REASSIGN OWNED BY regress_datdba_before TO regress_datdba_after; + +DROP DATABASE regression_utf8; +DROP ROLE regress_datdba_before; +DROP ROLE regress_datdba_after; diff --git a/src/test/regress/sql/dbsize.sql b/src/test/regress/sql/dbsize.sql index b34cf33385ebd..38b9444400768 100644 --- a/src/test/regress/sql/dbsize.sql +++ b/src/test/regress/sql/dbsize.sql @@ -27,6 +27,10 @@ SELECT size, pg_size_pretty(size), pg_size_pretty(-1 * size) FROM (11258449312612351::numeric), (11258449312612352::numeric), (11528652096115048447::numeric), (11528652096115048448::numeric)) x(size); +-- Ensure we get the expected results when passing the extremities of bigint +SELECT pg_size_pretty('-9223372036854775808'::bigint), + pg_size_pretty('9223372036854775807'::bigint); + -- pg_size_bytes() tests SELECT size, pg_size_bytes(size) FROM (VALUES ('1'), ('123bytes'), ('256 B'), ('1kB'), ('1MB'), (' 1 GB'), ('1.5 GB '), diff --git a/src/test/regress/sql/domain.sql b/src/test/regress/sql/domain.sql index 745f5d5fd2b10..ee07b03174e33 100644 --- a/src/test/regress/sql/domain.sql +++ b/src/test/regress/sql/domain.sql @@ -429,6 +429,17 @@ alter domain dnotnulltest drop not null; update domnotnull set col1 = null; +update domnotnull set col1 = 5; + +-- these constraints can also be added and removed by name +alter domain dnotnulltest add constraint dnotnulltest_notnull not null; +update domnotnull set col1 = null; -- fails +select conname, pg_get_constraintdef(oid) from pg_constraint + where contypid = 'dnotnulltest'::regtype; + +alter domain dnotnulltest drop constraint dnotnulltest_notnull; +update domnotnull set col1 = null; + drop domain dnotnulltest cascade; -- Test ALTER DOMAIN .. DEFAULT .. @@ -458,6 +469,8 @@ alter domain con add constraint t check (VALUE < 1); -- fails alter domain con add constraint t check (VALUE < 34); alter domain con add check (VALUE > 0); +\dD con + insert into domcontest values (-5); -- fails insert into domcontest values (42); -- fails insert into domcontest values (5); @@ -469,6 +482,37 @@ insert into domcontest values (42); alter domain con drop constraint nonexistent; alter domain con drop constraint if exists nonexistent; +-- not-null constraints +create domain connotnull integer; +create table domconnotnulltest +( col1 connotnull +, col2 connotnull +); + +insert into domconnotnulltest default values; +alter domain connotnull add not null; -- fails + +update domconnotnulltest set col1 = 5; +alter domain connotnull add not null; -- fails + +update domconnotnulltest set col2 = 6; + +alter domain connotnull add constraint constr1 not null; +select count(*) from pg_constraint where contypid = 'connotnull'::regtype and contype = 'n'; +alter domain connotnull add constraint constr1bis not null; -- redundant +select count(*) from pg_constraint where contypid = 'connotnull'::regtype and contype = 'n'; + +\dD connotnull + +update domconnotnulltest set col1 = null; -- fails + +alter domain connotnull drop constraint constr1; + +update domconnotnulltest set col1 = null; + +drop domain connotnull cascade; +drop table domconnotnulltest; + -- Test ALTER DOMAIN .. CONSTRAINT .. NOT VALID create domain things AS INT; CREATE TABLE thethings (stuff things); @@ -809,3 +853,39 @@ create domain testdomain1 as int constraint unsigned check (value > 0); alter domain testdomain1 rename constraint unsigned to unsigned_foo; alter domain testdomain1 drop constraint unsigned_foo; drop domain testdomain1; + +-- +-- Get the base type of a domain +-- +create domain mytext as text; +create domain mytext_child_1 as mytext; + +select pg_basetype('mytext'::regtype); +select pg_basetype('mytext_child_1'::regtype); +select pg_basetype(1); -- expect NULL not error + +drop domain mytext cascade; + + +-- +-- Information schema +-- + +SELECT * FROM information_schema.column_domain_usage + WHERE domain_name IN ('con', 'dom', 'pos_int', 'things') + ORDER BY domain_name; + +SELECT * FROM information_schema.domain_constraints + WHERE domain_name IN ('con', 'dom', 'pos_int', 'things') + ORDER BY constraint_name; + +SELECT * FROM information_schema.domains + WHERE domain_name IN ('con', 'dom', 'pos_int', 'things') + ORDER BY domain_name; + +SELECT * FROM information_schema.check_constraints + WHERE (constraint_schema, constraint_name) + IN (SELECT constraint_schema, constraint_name + FROM information_schema.domain_constraints + WHERE domain_name IN ('con', 'dom', 'pos_int', 'things')) + ORDER BY constraint_name; diff --git a/src/test/regress/sql/enum.sql b/src/test/regress/sql/enum.sql index 93171379f25fc..ecc4878a6782a 100644 --- a/src/test/regress/sql/enum.sql +++ b/src/test/regress/sql/enum.sql @@ -323,14 +323,13 @@ ALTER TYPE bogus RENAME TO bogon; select enum_range(null::bogon); ROLLBACK; --- ideally, we'd allow this usage; but it requires keeping track of whether --- the enum type was created in the current transaction, which is expensive +-- we must allow this usage to support pg_dump in binary upgrade mode BEGIN; CREATE TYPE bogus AS ENUM('good'); ALTER TYPE bogus RENAME TO bogon; ALTER TYPE bogon ADD VALUE 'bad'; ALTER TYPE bogon ADD VALUE 'ugly'; -select enum_range(null::bogon); -- fails +select enum_range(null::bogon); ROLLBACK; -- diff --git a/src/test/regress/sql/event_trigger.sql b/src/test/regress/sql/event_trigger.sql index 1aeaddbe7154b..013546b83057b 100644 --- a/src/test/regress/sql/event_trigger.sql +++ b/src/test/regress/sql/event_trigger.sql @@ -418,6 +418,96 @@ drop table rewriteme; drop event trigger no_rewrite_allowed; drop function test_evtrig_no_rewrite(); +-- Tests for REINDEX +CREATE OR REPLACE FUNCTION reindex_start_command() +RETURNS event_trigger AS $$ +BEGIN + RAISE NOTICE 'REINDEX START: % %', tg_event, tg_tag; +END; +$$ LANGUAGE plpgsql; +CREATE EVENT TRIGGER regress_reindex_start ON ddl_command_start + WHEN TAG IN ('REINDEX') + EXECUTE PROCEDURE reindex_start_command(); +CREATE FUNCTION reindex_end_command() +RETURNS event_trigger AS $$ +DECLARE + obj record; +BEGIN + FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands() + LOOP + RAISE NOTICE 'REINDEX END: command_tag=% type=% identity=%', + obj.command_tag, obj.object_type, obj.object_identity; + END LOOP; +END; +$$ LANGUAGE plpgsql; +CREATE EVENT TRIGGER regress_reindex_end ON ddl_command_end + WHEN TAG IN ('REINDEX') + EXECUTE PROCEDURE reindex_end_command(); +-- Extra event to force the use of a snapshot. +CREATE FUNCTION reindex_end_command_snap() RETURNS EVENT_TRIGGER + AS $$ BEGIN PERFORM 1; END $$ LANGUAGE plpgsql; +CREATE EVENT TRIGGER regress_reindex_end_snap ON ddl_command_end + EXECUTE FUNCTION reindex_end_command_snap(); + +-- With simple relation +CREATE TABLE concur_reindex_tab (c1 int); +CREATE INDEX concur_reindex_ind ON concur_reindex_tab (c1); +-- Both start and end triggers enabled. +REINDEX INDEX concur_reindex_ind; +REINDEX TABLE concur_reindex_tab; +REINDEX INDEX CONCURRENTLY concur_reindex_ind; +REINDEX TABLE CONCURRENTLY concur_reindex_tab; +-- with start trigger disabled. +ALTER EVENT TRIGGER regress_reindex_start DISABLE; +REINDEX INDEX concur_reindex_ind; +REINDEX INDEX CONCURRENTLY concur_reindex_ind; +-- without an index +DROP INDEX concur_reindex_ind; +REINDEX TABLE concur_reindex_tab; +REINDEX TABLE CONCURRENTLY concur_reindex_tab; + +-- With a Schema +CREATE SCHEMA concur_reindex_schema; +-- No indexes +REINDEX SCHEMA concur_reindex_schema; +REINDEX SCHEMA CONCURRENTLY concur_reindex_schema; +CREATE TABLE concur_reindex_schema.tab (a int); +CREATE INDEX ind ON concur_reindex_schema.tab (a); +-- One index reported +REINDEX SCHEMA concur_reindex_schema; +REINDEX SCHEMA CONCURRENTLY concur_reindex_schema; +-- One table on schema but no indexes +DROP INDEX concur_reindex_schema.ind; +REINDEX SCHEMA concur_reindex_schema; +REINDEX SCHEMA CONCURRENTLY concur_reindex_schema; +DROP SCHEMA concur_reindex_schema CASCADE; + +-- With a partitioned table, and nothing else. +CREATE TABLE concur_reindex_part (id int) PARTITION BY RANGE (id); +REINDEX TABLE concur_reindex_part; +REINDEX TABLE CONCURRENTLY concur_reindex_part; +-- Partition that would be reindexed, still nothing. +CREATE TABLE concur_reindex_child PARTITION OF concur_reindex_part + FOR VALUES FROM (0) TO (10); +REINDEX TABLE concur_reindex_part; +REINDEX TABLE CONCURRENTLY concur_reindex_part; +-- Now add some indexes. +CREATE INDEX concur_reindex_partidx ON concur_reindex_part (id); +REINDEX INDEX concur_reindex_partidx; +REINDEX INDEX CONCURRENTLY concur_reindex_partidx; +REINDEX TABLE concur_reindex_part; +REINDEX TABLE CONCURRENTLY concur_reindex_part; +DROP TABLE concur_reindex_part; + +-- Clean up +DROP EVENT TRIGGER regress_reindex_start; +DROP EVENT TRIGGER regress_reindex_end; +DROP EVENT TRIGGER regress_reindex_end_snap; +DROP FUNCTION reindex_end_command(); +DROP FUNCTION reindex_end_command_snap(); +DROP FUNCTION reindex_start_command(); +DROP TABLE concur_reindex_tab; + -- test Row Security Event Trigger RESET SESSION AUTHORIZATION; CREATE TABLE event_trigger_test (a integer, b text); @@ -471,3 +561,27 @@ SELECT DROP EVENT TRIGGER start_rls_command; DROP EVENT TRIGGER end_rls_command; DROP EVENT TRIGGER sql_drop_command; + +-- Check the GUC for disabling event triggers +CREATE FUNCTION test_event_trigger_guc() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +DECLARE + obj record; +BEGIN + FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects() + LOOP + RAISE NOTICE '% dropped %', tg_tag, obj.object_type; + END LOOP; +END; +$$; +CREATE EVENT TRIGGER test_event_trigger_guc + ON sql_drop + WHEN TAG IN ('DROP POLICY') EXECUTE FUNCTION test_event_trigger_guc(); + +SET event_triggers = 'on'; +CREATE POLICY pguc ON event_trigger_test USING (FALSE); +DROP POLICY pguc ON event_trigger_test; + +CREATE POLICY pguc ON event_trigger_test USING (FALSE); +SET event_triggers = 'off'; +DROP POLICY pguc ON event_trigger_test; diff --git a/src/test/regress/sql/event_trigger_login.sql b/src/test/regress/sql/event_trigger_login.sql new file mode 100644 index 0000000000000..060c105e60963 --- /dev/null +++ b/src/test/regress/sql/event_trigger_login.sql @@ -0,0 +1,24 @@ +-- Login event triggers +CREATE TABLE user_logins(id serial, who text); +GRANT SELECT ON user_logins TO public; +CREATE FUNCTION on_login_proc() RETURNS event_trigger AS $$ +BEGIN + INSERT INTO user_logins (who) VALUES (SESSION_USER); + RAISE NOTICE 'You are welcome!'; +END; +$$ LANGUAGE plpgsql; +CREATE EVENT TRIGGER on_login_trigger ON login EXECUTE PROCEDURE on_login_proc(); +ALTER EVENT TRIGGER on_login_trigger ENABLE ALWAYS; +\c +SELECT COUNT(*) FROM user_logins; +\c +SELECT COUNT(*) FROM user_logins; + +-- Check dathasloginevt in system catalog +SELECT dathasloginevt FROM pg_database WHERE datname= :'DBNAME'; + +-- Cleanup +DROP TABLE user_logins; +DROP EVENT TRIGGER on_login_trigger; +DROP FUNCTION on_login_proc(); +\c diff --git a/src/test/regress/sql/explain.sql b/src/test/regress/sql/explain.sql index b6b7beab27ad8..c7055f850c557 100644 --- a/src/test/regress/sql/explain.sql +++ b/src/test/regress/sql/explain.sql @@ -66,7 +66,7 @@ select explain_filter('explain (analyze) select * from int8_tbl i8'); select explain_filter('explain (analyze, verbose) select * from int8_tbl i8'); select explain_filter('explain (analyze, buffers, format text) select * from int8_tbl i8'); select explain_filter('explain (analyze, buffers, format xml) select * from int8_tbl i8'); -select explain_filter('explain (analyze, buffers, format yaml) select * from int8_tbl i8'); +select explain_filter('explain (analyze, serialize, buffers, format yaml) select * from int8_tbl i8'); select explain_filter('explain (buffers, format text) select * from int8_tbl i8'); select explain_filter('explain (buffers, format json) select * from int8_tbl i8'); @@ -94,6 +94,14 @@ select explain_filter('explain (generic_plan) select unique1 from tenk1 where th -- should fail select explain_filter('explain (analyze, generic_plan) select unique1 from tenk1 where thousand = $1'); +-- MEMORY option +select explain_filter('explain (memory) select * from int8_tbl i8'); +select explain_filter('explain (memory, analyze) select * from int8_tbl i8'); +select explain_filter('explain (memory, summary, format yaml) select * from int8_tbl i8'); +select explain_filter('explain (memory, analyze, format json) select * from int8_tbl i8'); +prepare int8_query as select * from int8_tbl i8; +select explain_filter('explain (memory) execute int8_query'); + -- Test EXPLAIN (GENERIC_PLAN) with partition pruning -- partitions should be pruned at plan time, based on constants, -- but there should be no pruning based on parameter placeholders @@ -154,3 +162,10 @@ select explain_filter('explain (verbose) select * from t1 where pg_temp.mysin(f1 -- Test compute_query_id set compute_query_id = on; select explain_filter('explain (verbose) select * from int8_tbl i8'); + +-- Test SERIALIZE option +select explain_filter('explain (analyze,serialize) select * from int8_tbl i8'); +select explain_filter('explain (analyze,serialize text,buffers,timing off) select * from int8_tbl i8'); +select explain_filter('explain (analyze,serialize binary,buffers,timing) select * from int8_tbl i8'); +-- this tests an edge case where we have no data to return +select explain_filter('explain (analyze,serialize) create temp table explain_temp as select * from int8_tbl i8'); diff --git a/src/test/regress/sql/fast_default.sql b/src/test/regress/sql/fast_default.sql index 16a3b7ca51d1a..a21b406e65936 100644 --- a/src/test/regress/sql/fast_default.sql +++ b/src/test/regress/sql/fast_default.sql @@ -237,6 +237,50 @@ SELECT comp(); DROP TABLE T; +-- Test domains with default value for table rewrite. +CREATE DOMAIN domain1 AS int DEFAULT 11; -- constant +CREATE DOMAIN domain2 AS int DEFAULT random(min=>10, max=>100); -- volatile +CREATE DOMAIN domain3 AS text DEFAULT foo(4); -- stable +CREATE DOMAIN domain4 AS text[] + DEFAULT ('{"This", "is", "' || foo(4) || '","the", "real", "world"}')::TEXT[]; + +CREATE TABLE t2 (a domain1); +INSERT INTO t2 VALUES (1),(2); + +-- no table rewrite +ALTER TABLE t2 ADD COLUMN b domain1 default 3; + +SELECT attnum, attname, atthasmissing, atthasdef, attmissingval +FROM pg_attribute +WHERE attnum > 0 AND attrelid = 't2'::regclass +ORDER BY attnum; + +-- table rewrite should happen +ALTER TABLE t2 ADD COLUMN c domain3 default left(random()::text,3); + +-- no table rewrite +ALTER TABLE t2 ADD COLUMN d domain4; + +SELECT attnum, attname, atthasmissing, atthasdef, attmissingval +FROM pg_attribute +WHERE attnum > 0 AND attrelid = 't2'::regclass +ORDER BY attnum; + +-- table rewrite should happen +ALTER TABLE t2 ADD COLUMN e domain2; + +SELECT attnum, attname, atthasmissing, atthasdef, attmissingval +FROM pg_attribute +WHERE attnum > 0 AND attrelid = 't2'::regclass +ORDER BY attnum; + +SELECT a, b, length(c) = 3 as c_ok, d, e >= 10 as e_ok FROM t2; + +DROP TABLE t2; +DROP DOMAIN domain1; +DROP DOMAIN domain2; +DROP DOMAIN domain3; +DROP DOMAIN domain4; DROP FUNCTION foo(INT); -- Fall back to full rewrite for volatile expressions @@ -256,7 +300,18 @@ ALTER TABLE T ADD COLUMN c2 TIMESTAMP DEFAULT clock_timestamp(); SELECT comp(); +-- check that we notice insertion of a volatile default argument +CREATE FUNCTION foolme(timestamptz DEFAULT clock_timestamp()) + RETURNS timestamptz + IMMUTABLE AS 'select $1' LANGUAGE sql; +ALTER TABLE T ADD COLUMN c3 timestamptz DEFAULT foolme(); + +SELECT attname, atthasmissing, attmissingval FROM pg_attribute + WHERE attrelid = 't'::regclass AND attnum > 0 + ORDER BY attnum; + DROP TABLE T; +DROP FUNCTION foolme(timestamptz); -- Simple querie CREATE TABLE T (pk INT NOT NULL PRIMARY KEY); diff --git a/src/test/regress/sql/foreign_data.sql b/src/test/regress/sql/foreign_data.sql index eefb860adc37d..aa147b14a90a0 100644 --- a/src/test/regress/sql/foreign_data.sql +++ b/src/test/regress/sql/foreign_data.sql @@ -419,8 +419,10 @@ ALTER FOREIGN TABLE ft1 OPTIONS (DROP delimiter, SET quote '~', ADD escape '@'); ALTER FOREIGN TABLE ft1 DROP COLUMN no_column; -- ERROR ALTER FOREIGN TABLE ft1 DROP COLUMN IF EXISTS no_column; ALTER FOREIGN TABLE ft1 DROP COLUMN c9; +ALTER FOREIGN TABLE ft1 ADD COLUMN c11 serial; ALTER FOREIGN TABLE ft1 SET SCHEMA foreign_schema; ALTER FOREIGN TABLE ft1 SET TABLESPACE ts; -- ERROR +ALTER SEQUENCE foreign_schema.ft1_c11_seq SET SCHEMA public; -- ERROR ALTER FOREIGN TABLE foreign_schema.ft1 RENAME c1 TO foreign_column_1; ALTER FOREIGN TABLE foreign_schema.ft1 RENAME TO foreign_table_1; \d foreign_schema.foreign_table_1 diff --git a/src/test/regress/sql/foreign_key.sql b/src/test/regress/sql/foreign_key.sql index 22e177f89b3cd..ea08fd5a6f6a7 100644 --- a/src/test/regress/sql/foreign_key.sql +++ b/src/test/regress/sql/foreign_key.sql @@ -473,7 +473,8 @@ CREATE TABLE FKTABLE ( fk_id_del_set_null int, fk_id_del_set_default int DEFAULT 0, FOREIGN KEY (tid, fk_id_del_set_null) REFERENCES PKTABLE ON DELETE SET NULL (fk_id_del_set_null), - FOREIGN KEY (tid, fk_id_del_set_default) REFERENCES PKTABLE ON DELETE SET DEFAULT (fk_id_del_set_default) + -- this tests handling of duplicate entries in SET DEFAULT column list + FOREIGN KEY (tid, fk_id_del_set_default) REFERENCES PKTABLE ON DELETE SET DEFAULT (fk_id_del_set_default, fk_id_del_set_default) ); SELECT pg_get_constraintdef(oid) FROM pg_constraint WHERE conrelid = 'fktable'::regclass::oid ORDER BY oid; @@ -970,8 +971,10 @@ COMMIT; -- try additional syntax ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE; --- illegal option +-- illegal options ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT DEFERRABLE INITIALLY DEFERRED; +ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NO INHERIT; +ALTER TABLE fktable ALTER CONSTRAINT fktable_fk_fkey NOT VALID; -- test order of firing of FK triggers when several RI-induced changes need to -- be made to the same row. This was broken by subtransaction-related @@ -1417,6 +1420,23 @@ ALTER TABLE fk_partitioned_fk ATTACH PARTITION fk_partitioned_fk_2 -- leave these tables around intentionally +-- Verify that attaching a table that's referenced by an existing FK +-- in the parent throws an error +CREATE TABLE fk_partitioned_pk_6 (a int PRIMARY KEY); +CREATE TABLE fk_partitioned_fk_6 (a int REFERENCES fk_partitioned_pk_6) PARTITION BY LIST (a); +ALTER TABLE fk_partitioned_fk_6 ATTACH PARTITION fk_partitioned_pk_6 FOR VALUES IN (1); +DROP TABLE fk_partitioned_pk_6, fk_partitioned_fk_6; + +-- This case is similar to above, but the referenced relation is one level +-- lower in the hierarchy. This one fails in a different way as the above, +-- because we don't bother to protect against this case explicitly. If the +-- current error stops happening, we'll need to add a better protection. +CREATE TABLE fk_partitioned_pk_6 (a int PRIMARY KEY) PARTITION BY list (a); +CREATE TABLE fk_partitioned_pk_61 PARTITION OF fk_partitioned_pk_6 FOR VALUES IN (1); +CREATE TABLE fk_partitioned_fk_6 (a int REFERENCES fk_partitioned_pk_61) PARTITION BY LIST (a); +ALTER TABLE fk_partitioned_fk_6 ATTACH PARTITION fk_partitioned_pk_6 FOR VALUES IN (1); +DROP TABLE fk_partitioned_pk_6, fk_partitioned_fk_6; + -- test the case when the referenced table is owned by a different user create role regress_other_partitioned_fk_owner; grant references on fk_notpartitioned_pk to regress_other_partitioned_fk_owner; @@ -1470,29 +1490,52 @@ CREATE TABLE part33_self_fk ( ); ALTER TABLE part3_self_fk ATTACH PARTITION part33_self_fk FOR VALUES FROM (30) TO (40); -SELECT cr.relname, co.conname, co.contype, co.convalidated, +-- verify that this constraint works +INSERT INTO parted_self_fk VALUES (1, NULL), (2, NULL), (3, NULL); +INSERT INTO parted_self_fk VALUES (10, 1), (11, 2), (12, 3) RETURNING tableoid::regclass; + +INSERT INTO parted_self_fk VALUES (4, 5); -- error: referenced doesn't exist +DELETE FROM parted_self_fk WHERE id = 1 RETURNING *; -- error: reference remains + +SELECT cr.relname, co.conname, co.convalidated, p.conname AS conparent, p.convalidated, cf.relname AS foreignrel FROM pg_constraint co JOIN pg_class cr ON cr.oid = co.conrelid LEFT JOIN pg_class cf ON cf.oid = co.confrelid LEFT JOIN pg_constraint p ON p.oid = co.conparentid -WHERE cr.oid IN (SELECT relid FROM pg_partition_tree('parted_self_fk')) -ORDER BY co.contype, cr.relname, co.conname, p.conname; +WHERE co.contype = 'f' AND + cr.oid IN (SELECT relid FROM pg_partition_tree('parted_self_fk')) +ORDER BY cr.relname, co.conname, p.conname; -- detach and re-attach multiple times just to ensure everything is kosher ALTER TABLE parted_self_fk DETACH PARTITION part2_self_fk; + +INSERT INTO part2_self_fk VALUES (16, 9); -- error: referenced doesn't exist +DELETE FROM parted_self_fk WHERE id = 2 RETURNING *; -- error: reference remains + ALTER TABLE parted_self_fk ATTACH PARTITION part2_self_fk FOR VALUES FROM (10) TO (20); + +INSERT INTO parted_self_fk VALUES (16, 9); -- error: referenced doesn't exist +DELETE FROM parted_self_fk WHERE id = 3 RETURNING *; -- error: reference remains + ALTER TABLE parted_self_fk DETACH PARTITION part2_self_fk; ALTER TABLE parted_self_fk ATTACH PARTITION part2_self_fk FOR VALUES FROM (10) TO (20); -SELECT cr.relname, co.conname, co.contype, co.convalidated, +ALTER TABLE parted_self_fk DETACH PARTITION part3_self_fk; +ALTER TABLE parted_self_fk ATTACH PARTITION part3_self_fk FOR VALUES FROM (30) TO (40); + +ALTER TABLE part3_self_fk DETACH PARTITION part33_self_fk; +ALTER TABLE part3_self_fk ATTACH PARTITION part33_self_fk FOR VALUES FROM (30) TO (40); + +SELECT cr.relname, co.conname, co.convalidated, p.conname AS conparent, p.convalidated, cf.relname AS foreignrel FROM pg_constraint co JOIN pg_class cr ON cr.oid = co.conrelid LEFT JOIN pg_class cf ON cf.oid = co.confrelid LEFT JOIN pg_constraint p ON p.oid = co.conparentid -WHERE cr.oid IN (SELECT relid FROM pg_partition_tree('parted_self_fk')) -ORDER BY co.contype, cr.relname, co.conname, p.conname; +WHERE co.contype = 'f' AND + cr.oid IN (SELECT relid FROM pg_partition_tree('parted_self_fk')) +ORDER BY cr.relname, co.conname, p.conname; -- Leave this table around, for pg_upgrade/pg_dump tests @@ -1655,6 +1698,14 @@ DELETE FROM pk WHERE a = 4002; UPDATE pk SET a = 4502 WHERE a = 4500; DELETE FROM pk WHERE a = 4502; +-- Also, detaching a partition that has the FK itself should work +-- https://postgr.es/m/CAAJ_b97GuPh6wQPbxQS-Zpy16Oh+0aMv-w64QcGrLhCOZZ6p+g@mail.gmail.com +CREATE TABLE ffk (a int, b int REFERENCES pk) PARTITION BY list (a); +CREATE TABLE ffk1 PARTITION OF ffk FOR VALUES IN (1); +ALTER TABLE ffk1 ADD FOREIGN KEY (a) REFERENCES pk; +ALTER TABLE ffk DETACH PARTITION ffk1; +DROP TABLE ffk, ffk1; + CREATE SCHEMA fkpart4; SET search_path TO fkpart4; -- dropping/detaching PARTITIONs is prevented if that would break @@ -1943,7 +1994,7 @@ INSERT INTO fkpart10.tbl1 VALUES (0), (1); COMMIT; -- test that cross-partition updates correctly enforces the foreign key --- restriction (specifically testing INITIAILLY DEFERRED) +-- restriction (specifically testing INITIALLY DEFERRED) BEGIN; UPDATE fkpart10.tbl1 SET f1 = 3 WHERE f1 = 0; UPDATE fkpart10.tbl3 SET f1 = f1 * -1; @@ -2069,3 +2120,64 @@ UPDATE fkpart11.pk SET a = 3 WHERE a = 4; UPDATE fkpart11.pk SET a = 1 WHERE a = 2; DROP SCHEMA fkpart11 CASCADE; + +-- When a table is attached as partition to a partitioned table that has +-- a foreign key to another partitioned table, it acquires a clone of the +-- FK. Upon detach, this clone is not removed, but instead becomes an +-- independent FK. If it then attaches to the partitioned table again, +-- the FK from the parent "takes over" ownership of the independent FK rather +-- than creating a separate one. +CREATE SCHEMA fkpart12 + CREATE TABLE fk_p ( id int, jd int, PRIMARY KEY(id, jd)) PARTITION BY list (id) + CREATE TABLE fk_p_1 PARTITION OF fk_p FOR VALUES IN (1) PARTITION BY list (jd) + CREATE TABLE fk_p_1_1 PARTITION OF fk_p_1 FOR VALUES IN (1) + CREATE TABLE fk_p_1_2 (x int, y int, jd int NOT NULL, id int NOT NULL) + CREATE TABLE fk_p_2 PARTITION OF fk_p FOR VALUES IN (2) PARTITION BY list (jd) + CREATE TABLE fk_p_2_1 PARTITION OF fk_p_2 FOR VALUES IN (1) + CREATE TABLE fk_p_2_2 PARTITION OF fk_p_2 FOR VALUES IN (2) + CREATE TABLE fk_r_1 ( p_jd int NOT NULL, x int, id int PRIMARY KEY, p_id int NOT NULL) + CREATE TABLE fk_r_2 ( id int PRIMARY KEY, p_id int NOT NULL, p_jd int NOT NULL) PARTITION BY list (id) + CREATE TABLE fk_r_2_1 PARTITION OF fk_r_2 FOR VALUES IN (2, 1) + CREATE TABLE fk_r ( id int PRIMARY KEY, p_id int NOT NULL, p_jd int NOT NULL, + FOREIGN KEY (p_id, p_jd) REFERENCES fk_p (id, jd) + ) PARTITION BY list (id); +SET search_path TO fkpart12; + +ALTER TABLE fk_p_1_2 DROP COLUMN x, DROP COLUMN y; +ALTER TABLE fk_p_1 ATTACH PARTITION fk_p_1_2 FOR VALUES IN (2); +ALTER TABLE fk_r_1 DROP COLUMN x; + +INSERT INTO fk_p VALUES (1, 1); + +ALTER TABLE fk_r ATTACH PARTITION fk_r_1 FOR VALUES IN (1); +ALTER TABLE fk_r ATTACH PARTITION fk_r_2 FOR VALUES IN (2); + +\d fk_r_2 + +INSERT INTO fk_r VALUES (1, 1, 1); +INSERT INTO fk_r VALUES (2, 2, 1); + +ALTER TABLE fk_r DETACH PARTITION fk_r_1; +ALTER TABLE fk_r DETACH PARTITION fk_r_2; + +\d fk_r_2 + +INSERT INTO fk_r_1 (id, p_id, p_jd) VALUES (2, 1, 2); -- should fail +DELETE FROM fk_p; -- should fail + +ALTER TABLE fk_r ATTACH PARTITION fk_r_1 FOR VALUES IN (1); +ALTER TABLE fk_r ATTACH PARTITION fk_r_2 FOR VALUES IN (2); + +\d fk_r_2 + +DELETE FROM fk_p; -- should fail + +-- these should all fail +ALTER TABLE fk_r_1 DROP CONSTRAINT fk_r_p_id_p_jd_fkey; +ALTER TABLE fk_r DROP CONSTRAINT fk_r_p_id_p_jd_fkey1; +ALTER TABLE fk_r_2 DROP CONSTRAINT fk_r_p_id_p_jd_fkey; + +SET client_min_messages TO warning; +DROP SCHEMA fkpart12 CASCADE; +RESET client_min_messages; +RESET search_path; diff --git a/src/test/regress/sql/generated.sql b/src/test/regress/sql/generated.sql index 8ddecf0cc38dd..ba59325da87ee 100644 --- a/src/test/regress/sql/generated.sql +++ b/src/test/regress/sql/generated.sql @@ -26,6 +26,9 @@ CREATE TABLE gtest_err_3 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (c * 2) S -- generation expression must be immutable CREATE TABLE gtest_err_4 (a int PRIMARY KEY, b double precision GENERATED ALWAYS AS (random()) STORED); +-- ... but be sure that the immutability test is accurate +CREATE TABLE gtest2 (a int, b text GENERATED ALWAYS AS (a || ' sec') STORED); +DROP TABLE gtest2; -- cannot have default/identity and generated CREATE TABLE gtest_err_5a (a int PRIMARY KEY, b int DEFAULT 5 GENERATED ALWAYS AS (a * 2) STORED); @@ -290,6 +293,9 @@ CREATE TABLE gtest20 (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORE INSERT INTO gtest20 (a) VALUES (10); -- ok INSERT INTO gtest20 (a) VALUES (30); -- violates constraint +ALTER TABLE gtest20 ALTER COLUMN b SET EXPRESSION AS (a * 100); -- violates constraint +ALTER TABLE gtest20 ALTER COLUMN b SET EXPRESSION AS (a * 3); -- ok + CREATE TABLE gtest20a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STORED); INSERT INTO gtest20a (a) VALUES (10); INSERT INTO gtest20a (a) VALUES (30); @@ -338,6 +344,15 @@ EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE b * 3 = 6; SELECT * FROM gtest22c WHERE b * 3 = 6; EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE a = 1 AND b > 0; SELECT * FROM gtest22c WHERE a = 1 AND b > 0; + +ALTER TABLE gtest22c ALTER COLUMN b SET EXPRESSION AS (a * 4); +ANALYZE gtest22c; +EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE b = 8; +SELECT * FROM gtest22c WHERE b = 8; +EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE b * 3 = 12; +SELECT * FROM gtest22c WHERE b * 3 = 12; +EXPLAIN (COSTS OFF) SELECT * FROM gtest22c WHERE a = 1 AND b > 0; +SELECT * FROM gtest22c WHERE a = 1 AND b > 0; RESET enable_seqscan; RESET enable_bitmapscan; @@ -353,6 +368,8 @@ CREATE TABLE gtest23b (a int PRIMARY KEY, b int GENERATED ALWAYS AS (a * 2) STOR INSERT INTO gtest23b VALUES (1); -- ok INSERT INTO gtest23b VALUES (5); -- error +ALTER TABLE gtest23b ALTER COLUMN b SET EXPRESSION AS (a * 5); -- error +ALTER TABLE gtest23b ALTER COLUMN b SET EXPRESSION AS (a * 1); -- ok DROP TABLE gtest23b; DROP TABLE gtest23a; @@ -370,6 +387,11 @@ CREATE TABLE gtest24 (a int PRIMARY KEY, b gtestdomain1 GENERATED ALWAYS AS (a * INSERT INTO gtest24 (a) VALUES (4); -- ok INSERT INTO gtest24 (a) VALUES (6); -- error +CREATE DOMAIN gtestdomainnn AS int CHECK (VALUE IS NOT NULL); +CREATE TABLE gtest24nn (a int, b gtestdomainnn GENERATED ALWAYS AS (a * 2) STORED); +INSERT INTO gtest24nn (a) VALUES (4); -- ok +INSERT INTO gtest24nn (a) VALUES (NULL); -- error + -- typed tables (currently not supported) CREATE TYPE gtest_type AS (f1 integer, f2 text, f3 bigint); CREATE TABLE gtest28 OF gtest_type (f1 WITH OPTIONS GENERATED ALWAYS AS (f2 *2) STORED); @@ -411,11 +433,28 @@ ALTER TABLE gtest_parent ATTACH PARTITION gtest_child3 FOR VALUES FROM ('2016-09 \d gtest_child2 \d gtest_child3 INSERT INTO gtest_parent (f1, f2) VALUES ('2016-07-15', 1); -SELECT * FROM gtest_parent; -SELECT * FROM gtest_child; -UPDATE gtest_parent SET f1 = f1 + 60; -SELECT * FROM gtest_parent; -SELECT * FROM gtest_child3; +INSERT INTO gtest_parent (f1, f2) VALUES ('2016-07-15', 2); +INSERT INTO gtest_parent (f1, f2) VALUES ('2016-08-15', 3); +SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3; +UPDATE gtest_parent SET f1 = f1 + 60 WHERE f2 = 1; +SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3; + +-- alter only parent's and one child's generation expression +ALTER TABLE ONLY gtest_parent ALTER COLUMN f3 SET EXPRESSION AS (f2 * 4); +ALTER TABLE gtest_child ALTER COLUMN f3 SET EXPRESSION AS (f2 * 10); +\d gtest_parent +\d gtest_child +\d gtest_child2 +\d gtest_child3 +SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3; + +-- alter generation expression of parent and all its children altogether +ALTER TABLE gtest_parent ALTER COLUMN f3 SET EXPRESSION AS (f2 * 2); +\d gtest_parent +\d gtest_child +\d gtest_child2 +\d gtest_child3 +SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3; -- we leave these tables around for purposes of testing dump/reload/upgrade -- generated columns in partition key (not allowed) @@ -425,7 +464,7 @@ CREATE TABLE gtest_part_key (f1 date NOT NULL, f2 bigint, f3 bigint GENERATED AL -- ALTER TABLE ... ADD COLUMN CREATE TABLE gtest25 (a int PRIMARY KEY); INSERT INTO gtest25 VALUES (3), (4); -ALTER TABLE gtest25 ADD COLUMN b int GENERATED ALWAYS AS (a * 3) STORED; +ALTER TABLE gtest25 ADD COLUMN b int GENERATED ALWAYS AS (a * 2) STORED, ALTER COLUMN b SET EXPRESSION AS (a * 3); SELECT * FROM gtest25 ORDER BY a; ALTER TABLE gtest25 ADD COLUMN x int GENERATED ALWAYS AS (b * 4) STORED; -- error ALTER TABLE gtest25 ADD COLUMN x int GENERATED ALWAYS AS (z * 4) STORED; -- error @@ -470,8 +509,17 @@ CREATE TABLE gtest29 ( b int GENERATED ALWAYS AS (a * 2) STORED ); INSERT INTO gtest29 (a) VALUES (3), (4); +SELECT * FROM gtest29; +\d gtest29 +ALTER TABLE gtest29 ALTER COLUMN a SET EXPRESSION AS (a * 3); -- error ALTER TABLE gtest29 ALTER COLUMN a DROP EXPRESSION; -- error ALTER TABLE gtest29 ALTER COLUMN a DROP EXPRESSION IF EXISTS; -- notice + +-- Change the expression +ALTER TABLE gtest29 ALTER COLUMN b SET EXPRESSION AS (a * 3); +SELECT * FROM gtest29; +\d gtest29 + ALTER TABLE gtest29 ALTER COLUMN b DROP EXPRESSION; INSERT INTO gtest29 (a) VALUES (5); INSERT INTO gtest29 (a, b) VALUES (6, 66); diff --git a/src/test/regress/sql/hash_func.sql b/src/test/regress/sql/hash_func.sql index 5ad33c1f9d4bb..33756bd288ff3 100644 --- a/src/test/regress/sql/hash_func.sql +++ b/src/test/regress/sql/hash_func.sql @@ -132,9 +132,9 @@ WHERE hash_array(v)::bit(32) != hash_array_extended(v, 0)::bit(32) -- array hashing with non-hashable element type SELECT v as value, hash_array(v)::bit(32) as standard -FROM (VALUES ('{0}'::money[])) x(v); +FROM (VALUES ('{101}'::varbit[])) x(v); SELECT v as value, hash_array_extended(v, 0)::bit(32) as extended0 -FROM (VALUES ('{0}'::money[])) x(v); +FROM (VALUES ('{101}'::varbit[])) x(v); SELECT v as value, hashbpchar(v)::bit(32) as standard, hashbpcharextended(v, 0)::bit(32) as extended0, @@ -247,11 +247,11 @@ WHERE hash_record(v)::bit(32) != hash_record_extended(v, 0)::bit(32) DROP TYPE hash_test_t1; -- record hashing with non-hashable field type -CREATE TYPE hash_test_t2 AS (a money, b text); +CREATE TYPE hash_test_t2 AS (a varbit, b text); SELECT v as value, hash_record(v)::bit(32) as standard -FROM (VALUES (row(1, 'aaa')::hash_test_t2)) x(v); +FROM (VALUES (row('10'::varbit, 'aaa')::hash_test_t2)) x(v); SELECT v as value, hash_record_extended(v, 0)::bit(32) as extended0 -FROM (VALUES (row(1, 'aaa')::hash_test_t2)) x(v); +FROM (VALUES (row('11'::varbit, 'aaa')::hash_test_t2)) x(v); DROP TYPE hash_test_t2; -- diff --git a/src/test/regress/sql/hash_index.sql b/src/test/regress/sql/hash_index.sql index 527024f710926..219da829816d5 100644 --- a/src/test/regress/sql/hash_index.sql +++ b/src/test/regress/sql/hash_index.sql @@ -247,6 +247,63 @@ REINDEX INDEX hash_split_index; -- Clean up. DROP TABLE hash_split_heap; +-- Testcases for removing overflow pages. +CREATE TABLE hash_cleanup_heap(keycol INT); +CREATE INDEX hash_cleanup_index on hash_cleanup_heap USING HASH (keycol); + +-- Insert tuples to both the primary bucket page and overflow pages. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 500) as i; + +-- Fill overflow pages by "dead" tuples. +BEGIN; +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 1000) as i; +ROLLBACK; + +-- Checkpoint will ensure that all hash buffers are cleaned before we try +-- to remove overflow pages. +CHECKPOINT; + +-- This will squeeze the bucket and remove overflow pages. +VACUUM hash_cleanup_heap; + +TRUNCATE hash_cleanup_heap; + +-- Insert a few tuples so that the primary bucket page doesn't get full and +-- tuples can be moved to it. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 50) as i; + +-- Fill overflow pages by "dead" tuples. +BEGIN; +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 1500) as i; +ROLLBACK; + +-- And insert some tuples again. During squeeze operation, these will be moved +-- to the primary bucket allowing to test freeing intermediate overflow pages. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 500) as i; + +CHECKPOINT; +VACUUM hash_cleanup_heap; + +TRUNCATE hash_cleanup_heap; + +-- Insert tuples to both the primary bucket page and overflow pages. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 500) as i; +-- Fill overflow pages by "dead" tuples. +BEGIN; +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 1500) as i; +ROLLBACK; +-- And insert some tuples again. During squeeze operation, these will be moved +-- to other overflow pages and also allow overflow pages filled by dead tuples +-- to be freed. Note the main purpose of this test is to test the case where +-- we don't need to move any tuple from the overflow page being freed. +INSERT INTO hash_cleanup_heap SELECT 1 FROM generate_series(1, 50) as i; + +CHECKPOINT; +VACUUM hash_cleanup_heap; + +-- Clean up. +DROP TABLE hash_cleanup_heap; + -- Index on temp table. CREATE TEMP TABLE hash_temp_heap (x int, y int); INSERT INTO hash_temp_heap VALUES (1,1); diff --git a/src/test/regress/sql/hash_part.sql b/src/test/regress/sql/hash_part.sql index e7eb36542cc33..6e2c1f21bfc5a 100644 --- a/src/test/regress/sql/hash_part.sql +++ b/src/test/regress/sql/hash_part.sql @@ -4,7 +4,7 @@ -- Use hand-rolled hash functions and operator classes to get predictable -- result on different machines. See the definitions of --- part_part_test_int4_ops and part_test_text_ops in insert.sql. +-- part_test_int4_ops and part_test_text_ops in test_setup.sql. CREATE TABLE mchash (a int, b text, c jsonb) PARTITION BY HASH (a part_test_int4_ops, b part_test_text_ops); diff --git a/src/test/regress/sql/horology.sql b/src/test/regress/sql/horology.sql index f7f8c8d2dd9eb..8648163722363 100644 --- a/src/test/regress/sql/horology.sql +++ b/src/test/regress/sql/horology.sql @@ -1,9 +1,9 @@ -- -- HOROLOGY -- -SET DateStyle = 'Postgres, MDY'; -SHOW TimeZone; -- Many of these tests depend on the prevailing setting +SHOW TimeZone; -- Many of these tests depend on the prevailing settings +SHOW DateStyle; -- -- Test various input formats @@ -59,6 +59,35 @@ SELECT time with time zone 'T040506.789 -08'; SELECT time with time zone 'T040506.789 America/Los_Angeles'; SELECT time with time zone '2001-12-27 T040506.789 America/Los_Angeles'; SELECT time with time zone 'J2452271 T040506.789 America/Los_Angeles'; +-- Check time formats required by ISO 8601 +SELECT time without time zone '040506.07'; +SELECT time without time zone '04:05:06.07'; +SELECT time without time zone '040506'; +SELECT time without time zone '04:05:06'; +SELECT time without time zone '0405'; +SELECT time without time zone '04:05'; +SELECT time without time zone 'T040506.07'; +SELECT time without time zone 'T04:05:06.07'; +SELECT time without time zone 'T040506'; +SELECT time without time zone 'T04:05:06'; +SELECT time without time zone 'T0405'; +SELECT time without time zone 'T04:05'; +-- 8601 says "Thh" is allowed, but we intentionally reject it as too vague +SELECT time without time zone 'T04'; +SELECT time with time zone '040506.07+08'; +SELECT time with time zone '04:05:06.07+08'; +SELECT time with time zone '040506+08'; +SELECT time with time zone '04:05:06+08'; +SELECT time with time zone '0405+08'; +SELECT time with time zone '04:05+08'; +SELECT time with time zone 'T040506.07+08'; +SELECT time with time zone 'T04:05:06.07+08'; +SELECT time with time zone 'T040506+08'; +SELECT time with time zone 'T04:05:06+08'; +SELECT time with time zone 'T0405+08'; +SELECT time with time zone 'T04:05+08'; +-- 8601 says "Thh" is allowed, but we intentionally reject it as too vague +SELECT time with time zone 'T04+08'; SET DateStyle = 'Postgres, MDY'; -- Check Julian dates BC SELECT date 'J1520447' AS "Confucius' Birthday"; @@ -120,6 +149,8 @@ SELECT timestamp without time zone '1999-12-01' + interval '1 month - 1 second' SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '106000000 days' AS "Feb 23, 285506"; SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '107000000 days' AS "Jan 20, 288244"; SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '109203489 days' AS "Dec 31, 294276"; +SELECT timestamp without time zone '2000-01-01' - interval '2483590 days' AS "out of range"; +SELECT timestamp without time zone '294276-12-31 23:59:59' + interval '9223372036854775807 microseconds' AS "out of range"; SELECT timestamp without time zone '12/31/294276' - timestamp without time zone '12/23/1999' AS "106751991 Days"; -- Shorthand values @@ -151,6 +182,8 @@ SELECT timestamp with time zone '1996-03-01' - interval '1 second' AS "Feb 29"; SELECT timestamp with time zone '1999-03-01' - interval '1 second' AS "Feb 28"; SELECT timestamp with time zone '2000-03-01' - interval '1 second' AS "Feb 29"; SELECT timestamp with time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31"; +SELECT timestamp with time zone '2000-01-01' - interval '2483590 days' AS "out of range"; +SELECT timestamp with time zone '294276-12-31 23:59:59 UTC' + interval '9223372036854775807 microseconds' AS "out of range"; SELECT (timestamp with time zone 'today' = (timestamp with time zone 'yesterday' + interval '1 day')) as "True"; SELECT (timestamp with time zone 'today' = (timestamp with time zone 'tomorrow' - interval '1 day')) as "True"; @@ -182,6 +215,8 @@ SELECT d1 - interval '1 year' AS one_year FROM TIMESTAMPTZ_TBL; SELECT CAST(time '01:02' AS interval) AS "+01:02"; SELECT CAST(interval '02:03' AS time) AS "02:03:00"; +SELECT CAST(interval '-02:03' AS time) AS "21:57:00"; +SELECT CAST(interval '-9223372022400000000 us' AS time) AS "00:00:00"; SELECT time '01:30' + interval '02:01' AS "03:31:00"; SELECT time '01:30' - interval '02:01' AS "23:29:00"; SELECT time '02:30' + interval '36:01' AS "14:31:00"; @@ -211,10 +246,12 @@ SELECT t.d1 AS t, i.f1 AS i, t.d1 + i.f1 AS "add", t.d1 - i.f1 AS "subtract" SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract" FROM TIME_TBL t, INTERVAL_TBL i + WHERE isfinite(i.f1) ORDER BY 1,2; SELECT t.f1 AS t, i.f1 AS i, t.f1 + i.f1 AS "add", t.f1 - i.f1 AS "subtract" FROM TIMETZ_TBL t, INTERVAL_TBL i + WHERE isfinite(i.f1) ORDER BY 1,2; -- SQL9x OVERLAPS operator @@ -291,7 +328,6 @@ SELECT d.f1 AS "timestamp", t.f1 AS "interval", d.f1 + t.f1 AS plus SELECT d.f1 AS "timestamp", t.f1 AS "interval", d.f1 - t.f1 AS minus FROM TEMP_TIMESTAMP d, INTERVAL_TBL t - WHERE isfinite(d.f1) ORDER BY minus, "timestamp", "interval"; SELECT d.f1 AS "timestamp", @@ -498,7 +534,19 @@ SELECT to_timestamp('2011-12-18 11:38 +05:20', 'YYYY-MM-DD HH12:MI TZH:TZM'); SELECT to_timestamp('2011-12-18 11:38 -05:20', 'YYYY-MM-DD HH12:MI TZH:TZM'); SELECT to_timestamp('2011-12-18 11:38 20', 'YYYY-MM-DD HH12:MI TZM'); -SELECT to_timestamp('2011-12-18 11:38 PST', 'YYYY-MM-DD HH12:MI TZ'); -- NYI +SELECT to_timestamp('2011-12-18 11:38 EST', 'YYYY-MM-DD HH12:MI TZ'); +SELECT to_timestamp('2011-12-18 11:38 -05', 'YYYY-MM-DD HH12:MI TZ'); +SELECT to_timestamp('2011-12-18 11:38 +01:30', 'YYYY-MM-DD HH12:MI TZ'); +SELECT to_timestamp('2011-12-18 11:38 MSK', 'YYYY-MM-DD HH12:MI TZ'); -- dyntz +SELECT to_timestamp('2011-12-18 11:38ESTFOO24', 'YYYY-MM-DD HH12:MITZFOOSS'); +SELECT to_timestamp('2011-12-18 11:38-05FOO24', 'YYYY-MM-DD HH12:MITZFOOSS'); +SELECT to_timestamp('2011-12-18 11:38 JUNK', 'YYYY-MM-DD HH12:MI TZ'); -- error +SELECT to_timestamp('2011-12-18 11:38 ...', 'YYYY-MM-DD HH12:MI TZ'); -- error + +SELECT to_timestamp('2011-12-18 11:38 -05', 'YYYY-MM-DD HH12:MI OF'); +SELECT to_timestamp('2011-12-18 11:38 +01:30', 'YYYY-MM-DD HH12:MI OF'); +SELECT to_timestamp('2011-12-18 11:38 +xyz', 'YYYY-MM-DD HH12:MI OF'); -- error +SELECT to_timestamp('2011-12-18 11:38 +01:xyz', 'YYYY-MM-DD HH12:MI OF'); -- error SELECT to_timestamp('2018-11-02 12:34:56.025', 'YYYY-MM-DD HH24:MI:SS.MS'); @@ -510,6 +558,7 @@ SELECT i, to_timestamp('2018-11-02 12:34:56.1234', 'YYYY-MM-DD HH24:MI:SS.FF' || SELECT i, to_timestamp('2018-11-02 12:34:56.12345', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; SELECT i, to_timestamp('2018-11-02 12:34:56.123456', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; SELECT i, to_timestamp('2018-11-02 12:34:56.123456789', 'YYYY-MM-DD HH24:MI:SS.FF' || i) FROM generate_series(1, 6) i; +SELECT i, to_timestamp('20181102123456123456', 'YYYYMMDDHH24MISSFF' || i) FROM generate_series(1, 6) i; SELECT to_date('1 4 1902', 'Q MM YYYY'); -- Q is ignored SELECT to_date('3 4 21 01', 'W MM CC YY'); @@ -613,6 +662,10 @@ SELECT to_date('2016 366', 'YYYY DDD'); -- ok SELECT to_date('2016 367', 'YYYY DDD'); SELECT to_date('0000-02-01','YYYY-MM-DD'); -- allowed, though it shouldn't be +-- to_char's TZ format code produces zone abbrev if known +SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS TZ'); +SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS tz'); + -- -- Check behavior with SQL-style fixed-GMT-offset time zone (cf bug #8572) -- @@ -629,4 +682,8 @@ SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS TZ'); SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD SSSS'); SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD SSSSS'); +SET TIME ZONE '+2'; + +SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS TZ'); + RESET TIME ZONE; diff --git a/src/test/regress/sql/identity.sql b/src/test/regress/sql/identity.sql index 9b8db2e4a30ba..cb0e05a2f117d 100644 --- a/src/test/regress/sql/identity.sql +++ b/src/test/regress/sql/identity.sql @@ -214,6 +214,24 @@ SELECT seqtypid::regtype FROM pg_sequence WHERE seqrelid = 'itest3_a_seq'::regcl ALTER TABLE itest3 ALTER COLUMN a TYPE text; -- error +-- check that unlogged propagates to sequence +CREATE UNLOGGED TABLE itest17 (a int NOT NULL, b text); +ALTER TABLE itest17 ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; +ALTER TABLE itest17 ADD COLUMN c int GENERATED ALWAYS AS IDENTITY; +\d itest17 +\d itest17_a_seq +\d itest17_c_seq +CREATE TABLE itest18 (a int NOT NULL, b text); +ALTER TABLE itest18 SET UNLOGGED, ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY; +\d itest18 +\d itest18_a_seq +ALTER TABLE itest18 SET LOGGED; +\d itest18 +\d itest18_a_seq +ALTER TABLE itest18 SET UNLOGGED; +\d itest18 +\d itest18_a_seq + -- kinda silly to change property in the same command, but it should work ALTER TABLE itest3 ADD COLUMN c int GENERATED BY DEFAULT AS IDENTITY, @@ -331,14 +349,123 @@ CREATE TABLE itest12 OF itest_type (f1 WITH OPTIONS GENERATED ALWAYS AS IDENTITY DROP TYPE itest_type CASCADE; --- table partitions (currently not supported) +-- table partitions + +-- partitions inherit identity column and share sequence +CREATE TABLE pitest1 (f1 date NOT NULL, f2 text, f3 bigint generated always as identity) PARTITION BY RANGE (f1); +-- new partition +CREATE TABLE pitest1_p1 PARTITION OF pitest1 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); +INSERT into pitest1(f1, f2) VALUES ('2016-07-2', 'from pitest1'); +INSERT into pitest1_p1 (f1, f2) VALUES ('2016-07-3', 'from pitest1_p1'); +-- attached partition +CREATE TABLE pitest1_p2 (f3 bigint, f2 text, f1 date NOT NULL); +INSERT INTO pitest1_p2 (f1, f2, f3) VALUES ('2016-08-2', 'before attaching', 100); +ALTER TABLE pitest1 ATTACH PARTITION pitest1_p2 FOR VALUES FROM ('2016-08-01') TO ('2016-09-01'); -- requires NOT NULL constraint +ALTER TABLE pitest1_p2 ALTER COLUMN f3 SET NOT NULL; +ALTER TABLE pitest1 ATTACH PARTITION pitest1_p2 FOR VALUES FROM ('2016-08-01') TO ('2016-09-01'); +INSERT INTO pitest1_p2 (f1, f2) VALUES ('2016-08-3', 'from pitest1_p2'); +INSERT INTO pitest1 (f1, f2) VALUES ('2016-08-4', 'from pitest1'); +-- LIKE INCLUDING on partition +CREATE TABLE pitest1_p1_like (LIKE pitest1_p1 INCLUDING IDENTITY); +INSERT into pitest1_p1_like(f1, f2) VALUES ('2016-07-2', 'from pitest1_p1_like'); +SELECT tableoid::regclass, f1, f2, f3 FROM pitest1; +SELECT tableoid::regclass, f1, f2, f3 FROM pitest1_p1_like; +ALTER TABLE pitest1 ALTER COLUMN f3 SET DATA TYPE bigint; +SELECT tableoid::regclass, f1, f2, f3, pg_typeof(f3) FROM pitest1; +SELECT tableoid::regclass, f1, f2, f3, pg_typeof(f3) FROM pitest1_p2; + +-- add identity column +CREATE TABLE pitest2 (f1 date NOT NULL, f2 text) PARTITION BY RANGE (f1); +CREATE TABLE pitest2_p1 PARTITION OF pitest2 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); +CREATE TABLE pitest2_p2 PARTITION OF pitest2 FOR VALUES FROM ('2016-08-01') TO ('2016-09-01'); +INSERT into pitest2(f1, f2) VALUES ('2016-07-2', 'from pitest2'); +INSERT INTO pitest2 (f1, f2) VALUES ('2016-08-2', 'from pitest2'); +ALTER TABLE pitest2 ADD COLUMN f3 int GENERATED ALWAYS AS IDENTITY; +INSERT into pitest2_p1 (f1, f2) VALUES ('2016-07-3', 'from pitest2_p1'); +INSERT INTO pitest2_p2 (f1, f2) VALUES ('2016-08-3', 'from pitest2_p2'); +INSERT into pitest2(f1, f2) VALUES ('2016-07-4', 'from pitest2'); +INSERT INTO pitest2 (f1, f2) VALUES ('2016-08-4', 'from pitest2'); +SELECT tableoid::regclass, f1, f2, f3 FROM pitest2; + +-- SET identity column +ALTER TABLE pitest2_p1 ALTER COLUMN f3 SET GENERATED BY DEFAULT; -- fails +ALTER TABLE pitest2_p1 ALTER COLUMN f3 SET INCREMENT BY 2; -- fails +ALTER TABLE ONLY pitest2 ALTER COLUMN f3 SET GENERATED BY DEFAULT SET INCREMENT BY 2 SET START WITH 1000 RESTART; -- fails +ALTER TABLE pitest2 ALTER COLUMN f3 SET GENERATED BY DEFAULT SET INCREMENT BY 2 SET START WITH 1000 RESTART; +INSERT into pitest2(f1, f2, f3) VALUES ('2016-07-5', 'from pitest2', 200); +INSERT INTO pitest2(f1, f2) VALUES ('2016-08-5', 'from pitest2'); +INSERT into pitest2_p1 (f1, f2) VALUES ('2016-07-6', 'from pitest2_p1'); +INSERT INTO pitest2_p2 (f1, f2, f3) VALUES ('2016-08-6', 'from pitest2_p2', 300); +SELECT tableoid::regclass, f1, f2, f3 FROM pitest2; + +-- detaching a partition removes identity property +ALTER TABLE pitest2 DETACH PARTITION pitest2_p1; +INSERT into pitest2(f1, f2) VALUES ('2016-08-7', 'from pitest2'); +INSERT into pitest2_p1 (f1, f2) VALUES ('2016-07-7', 'from pitest2_p1'); -- error +INSERT into pitest2_p1 (f1, f2, f3) VALUES ('2016-07-7', 'from pitest2_p1', 2000); +SELECT tableoid::regclass, f1, f2, f3 FROM pitest2; +SELECT tableoid::regclass, f1, f2, f3 FROM pitest2_p1; + +DROP TABLE pitest2_p1; + +-- changing a regular column to identity column in a partitioned table +CREATE TABLE pitest3 (f1 date NOT NULL, f2 text, f3 int) PARTITION BY RANGE (f1); +CREATE TABLE pitest3_p1 PARTITION OF pitest3 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); +INSERT into pitest3 VALUES ('2016-07-2', 'from pitest3', 1); +INSERT into pitest3_p1 VALUES ('2016-07-3', 'from pitest3_p1', 2); +-- fails, changing only a partition not allowed +ALTER TABLE pitest3_p1 + ALTER COLUMN f3 SET NOT NULL, + ALTER COLUMN f3 ADD GENERATED ALWAYS AS IDENTITY (START WITH 3); +-- fails, changing only the partitioned table not allowed +BEGIN; +ALTER TABLE pitest3_p1 ALTER COLUMN f3 SET NOT NULL; +ALTER TABLE ONLY pitest3 + ALTER COLUMN f3 ADD GENERATED ALWAYS AS IDENTITY (START WITH 3); +ROLLBACK; +ALTER TABLE pitest3 + ALTER COLUMN f3 SET NOT NULL, + ALTER COLUMN f3 ADD GENERATED ALWAYS AS IDENTITY (START WITH 3); +INSERT into pitest3(f1, f2) VALUES ('2016-07-4', 'from pitest3'); +INSERT into pitest3_p1 (f1, f2) VALUES ('2016-07-5', 'from pitest3_p1'); +SELECT tableoid::regclass, f1, f2, f3 FROM pitest3; + +-- changing an identity column to a non-identity column in a partitioned table +ALTER TABLE pitest3_p1 ALTER COLUMN f3 DROP IDENTITY; -- fails +ALTER TABLE ONLY pitest3 ALTER COLUMN f3 DROP IDENTITY; -- fails +ALTER TABLE pitest3 ALTER COLUMN f3 DROP IDENTITY; +INSERT into pitest3(f1, f2) VALUES ('2016-07-4', 'from pitest3'); -- fails +INSERT into pitest3_p1 (f1, f2) VALUES ('2016-07-5', 'from pitest3_p1'); -- fails +INSERT into pitest3(f1, f2, f3) VALUES ('2016-07-6', 'from pitest3', 5); +INSERT into pitest3_p1 (f1, f2, f3) VALUES ('2016-07-7', 'from pitest3_p1', 6); +SELECT tableoid::regclass, f1, f2, f3 FROM pitest3; + +-- Changing NOT NULL constraint of identity columns is not allowed +ALTER TABLE pitest1_p1 ALTER COLUMN f3 DROP NOT NULL; +ALTER TABLE pitest1 ALTER COLUMN f3 DROP NOT NULL; +-- Identity columns have their own default +ALTER TABLE pitest1_p2 ALTER COLUMN f3 SET DEFAULT 10000; +ALTER TABLE pitest1 ALTER COLUMN f3 SET DEFAULT 10000; +-- Adding identity to an identity column is not allowed +ALTER TABLE pitest1_p2 ALTER COLUMN f3 ADD GENERATED BY DEFAULT AS IDENTITY; +ALTER TABLE pitest1 ALTER COLUMN f3 ADD GENERATED BY DEFAULT AS IDENTITY; + +-- partitions with their own identity columns are not allowed, even if the +-- partitioned table does not have an identity column. +CREATE TABLE pitest1_pfail PARTITION OF pitest1 ( + f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY +) FOR VALUES FROM ('2016-11-01') TO ('2016-12-01'); -CREATE TABLE itest_parent (f1 date NOT NULL, f2 text, f3 bigint) PARTITION BY RANGE (f1); -CREATE TABLE itest_child PARTITION OF itest_parent ( +CREATE TABLE pitest_pfail PARTITION OF pitest3 ( f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY -) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); -- error -DROP TABLE itest_parent; +) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01'); +CREATE TABLE pitest1_pfail (f1 date NOT NULL, f2 text, f3 bigint GENERATED ALWAYS AS IDENTITY); +ALTER TABLE pitest1 ATTACH PARTITION pitest1_pfail FOR VALUES FROM ('2016-11-01') TO ('2016-12-01'); +ALTER TABLE pitest3 ATTACH PARTITION pitest1_pfail FOR VALUES FROM ('2016-11-01') TO ('2016-12-01'); + +DROP TABLE pitest1_pfail; +DROP TABLE pitest3; -- test that sequence of half-dropped serial column is properly ignored @@ -401,3 +528,12 @@ SELECT * FROM itest15; SELECT * FROM itest16; DROP TABLE itest15; DROP TABLE itest16; + +-- For testing of pg_dump and pg_upgrade, leave behind some identity +-- sequences whose logged-ness doesn't match their owning table's. +CREATE TABLE identity_dump_logged (a INT GENERATED ALWAYS AS IDENTITY); +ALTER SEQUENCE identity_dump_logged_a_seq SET UNLOGGED; +CREATE UNLOGGED TABLE identity_dump_unlogged (a INT GENERATED ALWAYS AS IDENTITY); +ALTER SEQUENCE identity_dump_unlogged_a_seq SET LOGGED; +SELECT relname, relpersistence FROM pg_class + WHERE relname ~ '^identity_dump_' ORDER BY 1; diff --git a/src/test/regress/sql/incremental_sort.sql b/src/test/regress/sql/incremental_sort.sql index 071f8a5268e98..ab471bdfffc12 100644 --- a/src/test/regress/sql/incremental_sort.sql +++ b/src/test/regress/sql/incremental_sort.sql @@ -276,3 +276,19 @@ from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub; explain (costs off) select sub.unique1, stringu1 || random()::text from tenk1, lateral (select tenk1.unique1 from generate_series(1, 1000)) as sub order by 1, 2; + +reset enable_hashagg; +reset enable_seqscan; +reset enable_incremental_sort; +reset parallel_tuple_cost; +reset parallel_setup_cost; +reset min_parallel_table_scan_size; +reset min_parallel_index_scan_size; + +-- Ensure incremental sorts work for amcanorderbyop type indexes +create table point_table (a point, b int); +create index point_table_a_idx on point_table using gist(a); + +-- Ensure we get an incremental sort plan for both of the following queries +explain (costs off) select a, b, a <-> point(5, 5) dist from point_table order by dist, b limit 1; +explain (costs off) select a, b, a <-> point(5, 5) dist from point_table order by dist, b desc limit 1; diff --git a/src/test/regress/sql/index_including.sql b/src/test/regress/sql/index_including.sql index 44b340053b75b..11c95974ec97c 100644 --- a/src/test/regress/sql/index_including.sql +++ b/src/test/regress/sql/index_including.sql @@ -217,3 +217,22 @@ ALTER TABLE tbl ALTER c1 TYPE bigint; ALTER TABLE tbl ALTER c3 TYPE bigint; \d tbl DROP TABLE tbl; + +/* + * 10. Test coverage for names stored as cstrings in indexes + */ +CREATE TABLE nametbl (c1 int, c2 name, c3 float); +CREATE INDEX nametbl_c1_c2_idx ON nametbl (c2, c1) INCLUDE (c3); +INSERT INTO nametbl VALUES(1, 'two', 3.0); +VACUUM nametbl; +SET enable_seqscan = 0; + +-- Ensure we get an index only scan plan +EXPLAIN (COSTS OFF) SELECT c2, c1, c3 FROM nametbl WHERE c2 = 'two' AND c1 = 1; + +-- Validate the results look sane +SELECT c2, c1, c3 FROM nametbl WHERE c2 = 'two' AND c1 = 1; + +RESET enable_seqscan; + +DROP TABLE nametbl; diff --git a/src/test/regress/sql/indexing.sql b/src/test/regress/sql/indexing.sql index e0b4e13037914..5f1f4b80c95cf 100644 --- a/src/test/regress/sql/indexing.sql +++ b/src/test/regress/sql/indexing.sql @@ -483,8 +483,27 @@ create table idxpart (a int, b int primary key) partition by range (b, a); create table idxpart (a int, b int, c text, primary key (a, b, c)) partition by range (b, c, a); drop table idxpart; --- not other types of index-based constraints -create table idxpart (a int, exclude (a with = )) partition by range (a); +-- OK to add an exclusion constraint if partitioning by its equal column +create table idxpart (a int4range, exclude USING GIST (a with = )) partition by range (a); +drop table idxpart; +-- OK more than one equal column +create table idxpart (a int4range, b int4range, exclude USING GIST (a with =, b with =)) partition by range (a, b); +drop table idxpart; +-- OK with more than one equal column: constraint is a proper superset of partition key +create table idxpart (a int4range, b int4range, exclude USING GIST (a with =, b with =)) partition by range (a); +drop table idxpart; +-- Not OK more than one equal column: partition keys are a proper superset of constraint +create table idxpart (a int4range, b int4range, exclude USING GIST (a with = )) partition by range (a, b); +-- Not OK with just -|- +create table idxpart (a int4range, exclude USING GIST (a with -|- )) partition by range (a); +-- OK with equals and &&, and equals is the partition key +create table idxpart (a int4range, b int4range, exclude USING GIST (a with =, b with &&)) partition by range (a); +drop table idxpart; +-- Not OK with equals and &&, and equals is not the partition key +create table idxpart (a int4range, b int4range, c int4range, exclude USING GIST (b with =, c with &&)) partition by range (a); +-- OK more than one equal column and a && column +create table idxpart (a int4range, b int4range, c int4range, exclude USING GIST (a with =, b with =, c with &&)) partition by range (a, b); +drop table idxpart; -- no expressions in partition key for PK/UNIQUE create table idxpart (a int primary key, b int) partition by range ((b + a)); @@ -506,9 +525,37 @@ alter table idxpart add unique (b, a); -- this works \d idxpart drop table idxpart; --- Exclusion constraints cannot be added -create table idxpart (a int, b int) partition by range (a); -alter table idxpart add exclude (a with =); +-- Exclusion constraints can be added if partitioning by their equal column +create table idxpart (a int4range, b int4range) partition by range (a); +alter table idxpart add exclude USING GIST (a with =); +drop table idxpart; +-- OK more than one equal column +create table idxpart (a int4range, b int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with =, b with =); +drop table idxpart; +-- OK with more than one equal column: constraint is a proper superset of partition key +create table idxpart (a int4range, b int4range) partition by range (a); +alter table idxpart add exclude USING GIST (a with =, b with =); +drop table idxpart; +-- Not OK more than one equal column: partition keys are a proper superset of constraint +create table idxpart (a int4range, b int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with =); +drop table idxpart; +-- Not OK with just -|- +create table idxpart (a int4range, b int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with -|-); +drop table idxpart; +-- OK with equals and &&, and equals is the partition key +create table idxpart (a int4range, b int4range) partition by range (a); +alter table idxpart add exclude USING GIST (a with =, b with &&); +drop table idxpart; +-- Not OK with equals and &&, and equals is not the partition key +create table idxpart (a int4range, b int4range, c int4range) partition by range (a); +alter table idxpart add exclude USING GIST (b with =, c with &&); +drop table idxpart; +-- OK more than one equal column and a && column +create table idxpart (a int4range, b int4range, c int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with =, b with =, c with &&); drop table idxpart; -- When (sub)partitions are created, they also contain the constraint @@ -522,7 +569,7 @@ create table idxpart3 (b int not null, a int not null); alter table idxpart attach partition idxpart3 for values from (20, 20) to (30, 30); select conname, contype, conrelid::regclass, conindid::regclass, conkey from pg_constraint where conrelid::regclass::text like 'idxpart%' - order by conname; + order by conrelid::regclass::text, conname; drop table idxpart; -- Verify that multi-layer partitioning honors the requirement that all @@ -620,9 +667,10 @@ create table idxpart (a int) partition by range (a); create table idxpart0 (like idxpart); alter table idxpart0 add unique (a); alter table idxpart attach partition idxpart0 default; -alter table only idxpart add primary key (a); -- fail, no NOT NULL constraint +alter table only idxpart add primary key (a); -- fail, no not-null constraint alter table idxpart0 alter column a set not null; alter table only idxpart add primary key (a); -- now it works +alter index idxpart_pkey attach partition idxpart0_a_key; alter table idxpart0 alter column a drop not null; -- fail, pkey needs it drop table idxpart; @@ -668,6 +716,26 @@ insert into idxpart values (857142, 'six'); select tableoid::regclass, * from idxpart order by a; drop table idxpart; +-- Test some other non-btree index types +create table idxpart (a int, b text, c int[]) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (100000); +set enable_seqscan to off; + +create index idxpart_brin on idxpart using brin(b); +explain (costs off) select * from idxpart where b = 'abcd'; +drop index idxpart_brin; + +create index idxpart_spgist on idxpart using spgist(b); +explain (costs off) select * from idxpart where b = 'abcd'; +drop index idxpart_spgist; + +create index idxpart_gin on idxpart using gin(c); +explain (costs off) select * from idxpart where c @> array[42]; +drop index idxpart_gin; + +reset enable_seqscan; +drop table idxpart; + -- intentionally leave some objects around create table idxpart (a int) partition by range (a); create table idxpart1 partition of idxpart for values from (0) to (100); @@ -782,3 +850,72 @@ select indexrelid::regclass, indisvalid, where indexrelid::regclass::text like 'parted_inval%' order by indexrelid::regclass::text collate "C"; drop table parted_inval_tab; + +-- Check setup of indisvalid across a complex partition tree on index +-- creation. If one index in a partition index is invalid, so should its +-- partitioned index. +create table parted_isvalid_tab (a int, b int) partition by range (a); +create table parted_isvalid_tab_1 partition of parted_isvalid_tab + for values from (1) to (10) partition by range (a); +create table parted_isvalid_tab_2 partition of parted_isvalid_tab + for values from (10) to (20) partition by range (a); +create table parted_isvalid_tab_11 partition of parted_isvalid_tab_1 + for values from (1) to (5); +create table parted_isvalid_tab_12 partition of parted_isvalid_tab_1 + for values from (5) to (10); +-- create an invalid index on one of the partitions. +insert into parted_isvalid_tab_11 values (1, 0); +create index concurrently parted_isvalid_idx_11 on parted_isvalid_tab_11 ((a/b)); +-- The previous invalid index is selected, invalidating all the indexes up to +-- the top-most parent. +create index parted_isvalid_idx on parted_isvalid_tab ((a/b)); +select indexrelid::regclass, indisvalid, + indrelid::regclass, inhparent::regclass + from pg_index idx left join + pg_inherits inh on (idx.indexrelid = inh.inhrelid) + where indexrelid::regclass::text like 'parted_isvalid%' + order by indexrelid::regclass::text collate "C"; +drop table parted_isvalid_tab; + +-- Check state of replica indexes when attaching a partition. +begin; +create table parted_replica_tab (id int not null) partition by range (id); +create table parted_replica_tab_1 partition of parted_replica_tab + for values from (1) to (10) partition by range (id); +create table parted_replica_tab_11 partition of parted_replica_tab_1 + for values from (1) to (5); +create unique index parted_replica_idx + on only parted_replica_tab using btree (id); +create unique index parted_replica_idx_1 + on only parted_replica_tab_1 using btree (id); +-- This triggers an update of pg_index.indisreplident for parted_replica_idx. +alter table only parted_replica_tab_1 replica identity + using index parted_replica_idx_1; +create unique index parted_replica_idx_11 on parted_replica_tab_11 USING btree (id); +select indexrelid::regclass, indisvalid, indisreplident, + indrelid::regclass, inhparent::regclass + from pg_index idx left join + pg_inherits inh on (idx.indexrelid = inh.inhrelid) + where indexrelid::regclass::text like 'parted_replica%' + order by indexrelid::regclass::text collate "C"; +-- parted_replica_idx is not valid yet here, because parted_replica_idx_1 +-- is not valid. +alter index parted_replica_idx ATTACH PARTITION parted_replica_idx_1; +select indexrelid::regclass, indisvalid, indisreplident, + indrelid::regclass, inhparent::regclass + from pg_index idx left join + pg_inherits inh on (idx.indexrelid = inh.inhrelid) + where indexrelid::regclass::text like 'parted_replica%' + order by indexrelid::regclass::text collate "C"; +-- parted_replica_idx becomes valid here. +alter index parted_replica_idx_1 ATTACH PARTITION parted_replica_idx_11; +alter table only parted_replica_tab_1 replica identity + using index parted_replica_idx_1; +commit; +select indexrelid::regclass, indisvalid, indisreplident, + indrelid::regclass, inhparent::regclass + from pg_index idx left join + pg_inherits inh on (idx.indexrelid = inh.inhrelid) + where indexrelid::regclass::text like 'parted_replica%' + order by indexrelid::regclass::text collate "C"; +drop table parted_replica_tab; diff --git a/src/test/regress/sql/inherit.sql b/src/test/regress/sql/inherit.sql index 215d58e80d398..572512cba011d 100644 --- a/src/test/regress/sql/inherit.sql +++ b/src/test/regress/sql/inherit.sql @@ -97,6 +97,25 @@ SELECT relname, d.* FROM ONLY d, pg_class where d.tableoid = pg_class.oid; CREATE TEMP TABLE z (b TEXT, PRIMARY KEY(aa, b)) inherits (a); INSERT INTO z VALUES (NULL, 'text'); -- should fail +-- Check inherited UPDATE with first child excluded +create table some_tab (f1 int, f2 int, f3 int, check (f1 < 10) no inherit); +create table some_tab_child () inherits(some_tab); +insert into some_tab_child select i, i+1, 0 from generate_series(1,1000) i; +create index on some_tab_child(f1, f2); +-- while at it, also check that statement-level triggers fire +create function some_tab_stmt_trig_func() returns trigger as +$$begin raise notice 'updating some_tab'; return NULL; end;$$ +language plpgsql; +create trigger some_tab_stmt_trig + before update on some_tab execute function some_tab_stmt_trig_func(); + +explain (costs off) +update some_tab set f3 = 11 where f1 = 12 and f2 = 13; +update some_tab set f3 = 11 where f1 = 12 and f2 = 13; + +drop table some_tab cascade; +drop function some_tab_stmt_trig_func(); + -- Check inherited UPDATE with all children excluded create table some_tab (a int, b int); create table some_tab_child () inherits (some_tab); @@ -353,6 +372,16 @@ ALTER TABLE inhts RENAME d TO dd; DROP TABLE inhts; +-- Test for adding a column to a parent table with complex inheritance +CREATE TABLE inhta (); +CREATE TABLE inhtb () INHERITS (inhta); +CREATE TABLE inhtc () INHERITS (inhtb); +CREATE TABLE inhtd () INHERITS (inhta, inhtb, inhtc); +ALTER TABLE inhta ADD COLUMN i int, ADD COLUMN j bigint DEFAULT 1; +\d+ inhta +\d+ inhtd +DROP TABLE inhta, inhtb, inhtc, inhtd; + -- Test for renaming in diamond inheritance CREATE TABLE inht2 (x int) INHERITS (inht1); CREATE TABLE inht3 (y int) INHERITS (inht1); @@ -443,6 +472,45 @@ order by 1, 2; drop table p1 cascade; +-- +-- Test DROP behavior of multiply-defined CHECK constraints +-- +create table p1(f1 int constraint f1_pos CHECK (f1 > 0)); +create table p1_c1 (f1 int constraint f1_pos CHECK (f1 > 0)) inherits (p1); +alter table p1_c1 drop constraint f1_pos; +alter table p1 drop constraint f1_pos; +\d p1_c1 +drop table p1 cascade; + +create table p1(f1 int constraint f1_pos CHECK (f1 > 0)); +create table p2(f1 int constraint f1_pos CHECK (f1 > 0)); +create table p1p2_c1 (f1 int) inherits (p1, p2); +create table p1p2_c2 (f1 int constraint f1_pos CHECK (f1 > 0)) inherits (p1, p2); +alter table p2 drop constraint f1_pos; +alter table p1 drop constraint f1_pos; +\d p1p2_c* +drop table p1, p2 cascade; + +create table p1(f1 int constraint f1_pos CHECK (f1 > 0)); +create table p1_c1() inherits (p1); +create table p1_c2() inherits (p1); +create table p1_c1c2() inherits (p1_c1, p1_c2); +\d p1_c1c2 +alter table p1 drop constraint f1_pos; +\d p1_c1c2 +drop table p1 cascade; + +create table p1(f1 int constraint f1_pos CHECK (f1 > 0)); +create table p1_c1() inherits (p1); +create table p1_c2(constraint f1_pos CHECK (f1 > 0)) inherits (p1); +create table p1_c1c2() inherits (p1_c1, p1_c2, p1); +alter table p1_c2 drop constraint f1_pos; +alter table p1 drop constraint f1_pos; +alter table p1_c1c2 drop constraint f1_pos; +alter table p1_c2 drop constraint f1_pos; +\d p1_c1c2 +drop table p1 cascade; + -- Test that a valid child can have not-valid parent, but not vice versa create table invalid_check_con(f1 int); create table invalid_check_con_child() inherits(invalid_check_con); @@ -534,6 +602,14 @@ select min(1-id) from matest0; reset enable_seqscan; reset enable_parallel_append; +explain (verbose, costs off) -- bug #18652 +select 1 - id as c from +(select id from matest3 t1 union all select id * 2 from matest3 t2) ss +order by c; +select 1 - id as c from +(select id from matest3 t1 union all select id * 2 from matest3 t2) ss +order by c; + drop table matest0 cascade; -- @@ -557,6 +633,19 @@ reset enable_nestloop; drop table matest0 cascade; +-- Test a MergeAppend plan where one child requires a sort +create table matest0(a int primary key); +create table matest1() inherits (matest0); +insert into matest0 select generate_series(1, 400); +insert into matest1 select generate_series(1, 200); +analyze matest0; +analyze matest1; + +explain (costs off) +select * from matest0 where a < 100 order by a; + +drop table matest0 cascade; + -- -- Test merge-append for UNION ALL append relations -- @@ -679,6 +768,27 @@ select * from cnullparent; select * from cnullparent where f1 = 2; drop table cnullparent cascade; +-- +-- Mixed ownership inheritance tree +-- +create role regress_alice; +create role regress_bob; +grant all on schema public to regress_alice, regress_bob; +grant regress_alice to regress_bob; +set session authorization regress_alice; +create table inh_parent (a int not null); +set session authorization regress_bob; +create table inh_child () inherits (inh_parent); +set session authorization regress_alice; +-- alice can't do this: she doesn't own inh_child +alter table inh_parent alter a drop not null; +set session authorization regress_bob; +alter table inh_parent alter a drop not null; +reset session authorization; +drop table inh_parent, inh_child; +revoke all on schema public from regress_alice, regress_bob; +drop role regress_alice, regress_bob; + -- -- Check use of temporary tables with inheritance trees -- diff --git a/src/test/regress/sql/insert.sql b/src/test/regress/sql/insert.sql index bdcffd03146cf..2b086eeb6d7c1 100644 --- a/src/test/regress/sql/insert.sql +++ b/src/test/regress/sql/insert.sql @@ -105,7 +105,84 @@ create rule irule3 as on insert to inserttest2 do also drop table inserttest2; drop table inserttest; -drop type insert_test_type; + +-- Make the same tests with domains over the array and composite fields + +create domain insert_pos_ints as int[] check (value[1] > 0); + +create domain insert_test_domain as insert_test_type + check ((value).if2[1] is not null); + +create table inserttesta (f1 int, f2 insert_pos_ints); +create table inserttestb (f3 insert_test_domain, f4 insert_test_domain[]); + +insert into inserttesta (f2[1], f2[2]) values (1,2); +insert into inserttesta (f2[1], f2[2]) values (3,4), (5,6); +insert into inserttesta (f2[1], f2[2]) select 7,8; +insert into inserttesta (f2[1], f2[2]) values (1,default); -- not supported +insert into inserttesta (f2[1], f2[2]) values (0,2); +insert into inserttesta (f2[1], f2[2]) values (3,4), (0,6); +insert into inserttesta (f2[1], f2[2]) select 0,8; + +insert into inserttestb (f3.if1, f3.if2) values (1,array['foo']); +insert into inserttestb (f3.if1, f3.if2) values (1,'{foo}'), (2,'{bar}'); +insert into inserttestb (f3.if1, f3.if2) select 3, '{baz,quux}'; +insert into inserttestb (f3.if1, f3.if2) values (1,default); -- not supported +insert into inserttestb (f3.if1, f3.if2) values (1,array[null]); +insert into inserttestb (f3.if1, f3.if2) values (1,'{null}'), (2,'{bar}'); +insert into inserttestb (f3.if1, f3.if2) select 3, '{null,quux}'; + +insert into inserttestb (f3.if2[1], f3.if2[2]) values ('foo', 'bar'); +insert into inserttestb (f3.if2[1], f3.if2[2]) values ('foo', 'bar'), ('baz', 'quux'); +insert into inserttestb (f3.if2[1], f3.if2[2]) select 'bear', 'beer'; + +insert into inserttestb (f3, f4[1].if2[1], f4[1].if2[2]) values (row(1,'{x}'), 'foo', 'bar'); +insert into inserttestb (f3, f4[1].if2[1], f4[1].if2[2]) values (row(1,'{x}'), 'foo', 'bar'), (row(2,'{y}'), 'baz', 'quux'); +insert into inserttestb (f3, f4[1].if2[1], f4[1].if2[2]) select row(1,'{x}')::insert_test_domain, 'bear', 'beer'; + +select * from inserttesta; +select * from inserttestb; + +-- also check reverse-listing +create table inserttest2 (f1 bigint, f2 text); +create rule irule1 as on insert to inserttest2 do also + insert into inserttestb (f3.if2[1], f3.if2[2]) + values (new.f1,new.f2); +create rule irule2 as on insert to inserttest2 do also + insert into inserttestb (f4[1].if1, f4[1].if2[2]) + values (1,'fool'),(new.f1,new.f2); +create rule irule3 as on insert to inserttest2 do also + insert into inserttestb (f4[1].if1, f4[1].if2[2]) + select new.f1, new.f2; +\d+ inserttest2 + +drop table inserttest2; +drop table inserttesta; +drop table inserttestb; +drop domain insert_pos_ints; +drop domain insert_test_domain; + +-- Verify that multiple inserts to subfields of a domain-over-container +-- check the domain constraints only on the finished value + +create domain insert_nnarray as int[] + check (value[1] is not null and value[2] is not null); + +create domain insert_test_domain as insert_test_type + check ((value).if1 is not null and (value).if2 is not null); + +create table inserttesta (f1 insert_nnarray); +insert into inserttesta (f1[1]) values (1); -- fail +insert into inserttesta (f1[1], f1[2]) values (1, 2); + +create table inserttestb (f1 insert_test_domain); +insert into inserttestb (f1.if1) values (1); -- fail +insert into inserttestb (f1.if1, f1.if2) values (1, '{foo}'); + +drop table inserttesta; +drop table inserttestb; +drop domain insert_nnarray; +drop type insert_test_type cascade; -- direct partition inserts should check partition bound constraint create table range_parted ( diff --git a/src/test/regress/sql/insert_conflict.sql b/src/test/regress/sql/insert_conflict.sql index 23d5778b821e0..549c46452ec09 100644 --- a/src/test/regress/sql/insert_conflict.sql +++ b/src/test/regress/sql/insert_conflict.sql @@ -3,6 +3,9 @@ -- create table insertconflicttest(key int4, fruit text); +-- These things should work through a view, as well +create view insertconflictview as select * from insertconflicttest; + -- -- Test unique index inference with operator class specifications and -- named collations @@ -20,6 +23,7 @@ explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on con explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key, fruit) do nothing; explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (fruit, key, fruit, key) do nothing; explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (lower(fruit), key, lower(fruit), key) do nothing; +explain (costs off) insert into insertconflictview values(0, 'Crowberry') on conflict (lower(fruit), key, lower(fruit), key) do nothing; explain (costs off) insert into insertconflicttest values(0, 'Crowberry') on conflict (key, fruit) do update set fruit = excluded.fruit where exists (select 1 from insertconflicttest ii where ii.key = excluded.key); -- Neither collation nor operator class specifications are required -- @@ -118,6 +122,9 @@ insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (ke insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = ict.fruit; -- ok, alias insert into insertconflicttest AS ict values (6, 'Passionfruit') on conflict (key) do update set fruit = insertconflicttest.fruit; -- error, references aliased away name +-- Check helpful hint when qualifying set column with target table +insert into insertconflicttest values (3, 'Kiwi') on conflict (key, fruit) do update set insertconflicttest.fruit = 'Mango'; + drop index key_index; -- @@ -215,6 +222,7 @@ create unique index partial_key_index on insertconflicttest(key) where fruit lik -- Succeeds insert into insertconflicttest values (23, 'Blackberry') on conflict (key) where fruit like '%berry' do update set fruit = excluded.fruit; insert into insertconflicttest as t values (23, 'Blackberry') on conflict (key) where fruit like '%berry' and t.fruit = 'inconsequential' do nothing; +insert into insertconflictview as t values (23, 'Blackberry') on conflict (key) where fruit like '%berry' and t.fruit = 'inconsequential' do nothing; -- fails insert into insertconflicttest values (23, 'Blackberry') on conflict (key) do update set fruit = excluded.fruit; @@ -247,6 +255,7 @@ explain (costs off) insert into insertconflicttest as i values (23, 'Avocado') o drop index plain; -- Cleanup +drop view insertconflictview; drop table insertconflicttest; diff --git a/src/test/regress/sql/int8.sql b/src/test/regress/sql/int8.sql index 33f664dd02c01..fffb28906a1e6 100644 --- a/src/test/regress/sql/int8.sql +++ b/src/test/regress/sql/int8.sql @@ -132,6 +132,7 @@ select '9223372036854775808'::int8; select -('-9223372036854775807'::int8); select -('-9223372036854775808'::int8); +select 0::int8 - '-9223372036854775808'::int8; select '9223372036854775800'::int8 + '9223372036854775800'::int8; select '-9223372036854775800'::int8 + '-9223372036854775800'::int8; diff --git a/src/test/regress/sql/interval.sql b/src/test/regress/sql/interval.sql index 56feda1a3d85f..fbf6e064d66bd 100644 --- a/src/test/regress/sql/interval.sql +++ b/src/test/regress/sql/interval.sql @@ -14,6 +14,8 @@ SELECT INTERVAL '-1 days +02:03' AS "22 hours ago..."; SELECT INTERVAL '1.5 weeks' AS "Ten days twelve hours"; SELECT INTERVAL '1.5 months' AS "One month 15 days"; SELECT INTERVAL '10 years -11 month -12 days +13:14' AS "9 years..."; +SELECT INTERVAL 'infinity' AS "eternity"; +SELECT INTERVAL '-infinity' AS "beginning of time"; CREATE TABLE INTERVAL_TBL (f1 interval); @@ -27,6 +29,8 @@ INSERT INTO INTERVAL_TBL (f1) VALUES ('1 day 2 hours 3 minutes 4 seconds'); INSERT INTO INTERVAL_TBL (f1) VALUES ('6 years'); INSERT INTO INTERVAL_TBL (f1) VALUES ('5 months'); INSERT INTO INTERVAL_TBL (f1) VALUES ('5 months 12 hours'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('infinity'); +INSERT INTO INTERVAL_TBL (f1) VALUES ('-infinity'); -- badly formatted interval INSERT INTO INTERVAL_TBL (f1) VALUES ('badly formatted interval'); @@ -66,6 +70,17 @@ SELECT r1.*, r2.* WHERE r1.f1 > r2.f1 ORDER BY r1.f1, r2.f1; +-- test unary minus + +SELECT f1, -f1 FROM INTERVAL_TBL; +SELECT -('-2147483648 months'::interval); -- should fail +SELECT -('-2147483647 months'::interval); -- ok +SELECT -('-2147483648 days'::interval); -- should fail +SELECT -('-2147483647 days'::interval); -- ok +SELECT -('-9223372036854775808 us'::interval); -- should fail +SELECT -('-9223372036854775807 us'::interval); -- ok +SELECT -('-2147483647 months -2147483647 days -9223372036854775807 us'::interval); -- should fail + -- Test intervals that are large enough to overflow 64 bits in comparisons CREATE TEMP TABLE INTERVAL_TBL_OF (f1 interval); INSERT INTO INTERVAL_TBL_OF (f1) VALUES @@ -95,6 +110,9 @@ SELECT f1 FROM INTERVAL_TBL_OF r1 ORDER BY f1; SELECT f1 FROM INTERVAL_TBL_OF r1 ORDER BY f1; RESET enable_seqscan; +-- subtracting about-to-overflow values should result in 0 +SELECT f1 - f1 FROM INTERVAL_TBL_OF; + DROP TABLE INTERVAL_TBL_OF; -- Test multiplication and division with intervals. @@ -136,11 +154,19 @@ SET IntervalStyle to postgres_verbose; SELECT * FROM INTERVAL_TBL; +-- multiplication and division overflow test cases +SELECT '3000000 months'::interval * 1000; +SELECT '3000000 months'::interval / 0.001; +SELECT '3000000 days'::interval * 1000; +SELECT '3000000 days'::interval / 0.001; +SELECT '1 month 2146410 days'::interval * 1000.5002; +SELECT '4611686018427387904 usec'::interval / 0.1; + -- test avg(interval), which is somewhat fragile since people have been -- known to change the allowed input syntax for type interval without -- updating pg_aggregate.agginitval -select avg(f1) from interval_tbl; +select avg(f1) from interval_tbl where isfinite(f1); -- test long interval input select '4 millenniums 5 centuries 4 decades 1 year 4 months 4 days 17 minutes 31 seconds'::interval; @@ -244,6 +270,8 @@ SELECT interval '1 2:03:04.5678' hour to second(2); SELECT interval '1 2.3456' minute to second(2); SELECT interval '1 2:03.5678' minute to second(2); SELECT interval '1 2:03:04.5678' minute to second(2); +SELECT interval '2562047788:00:54.775807' second(2); -- out of range +SELECT interval '-2562047788:00:54.775807' second(2); -- out of range -- test casting to restricted precision (bug #14479) SELECT f1, f1::INTERVAL DAY TO MINUTE AS "minutes", @@ -511,15 +539,30 @@ select interval '-2147483648 days ago'; select interval '-9223372036854775808 microseconds ago'; select interval '-2147483648 months -2147483648 days -9223372036854775808 microseconds ago'; +-- overflowing using make_interval +select make_interval(years := 178956971); +select make_interval(years := -178956971); +select make_interval(years := 1, months := 2147483647); +select make_interval(years := -1, months := -2147483648); +select make_interval(weeks := 306783379); +select make_interval(weeks := -306783379); +select make_interval(weeks := 1, days := 2147483647); +select make_interval(weeks := -1, days := -2147483648); +select make_interval(secs := 1e308); +select make_interval(secs := 1e18); +select make_interval(secs := -1e18); +select make_interval(mins := 1, secs := 9223372036800.0); +select make_interval(mins := -1, secs := -9223372036800.0); + -- test that INT_MIN number is formatted properly SET IntervalStyle to postgres; -select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; +select interval '-2147483647 months -2147483648 days -9223372036854775808 us'; SET IntervalStyle to sql_standard; -select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; +select interval '-2147483647 months -2147483648 days -9223372036854775808 us'; SET IntervalStyle to iso_8601; -select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; +select interval '-2147483647 months -2147483648 days -9223372036854775808 us'; SET IntervalStyle to postgres_verbose; -select interval '-2147483648 months -2147483648 days -9223372036854775808 us'; +select interval '-2147483647 months -2147483648 days -9223372036854775808 us'; -- check that '30 days' equals '1 month' according to the hash function select '30 days'::interval = '1 month'::interval as t; @@ -582,3 +625,176 @@ SELECT f1, -- internal overflow test case SELECT extract(epoch from interval '1000000000 days'); + +-- +-- test infinite intervals +-- + +-- largest finite intervals +SELECT interval '-2147483648 months -2147483648 days -9223372036854775807 us'; +SELECT interval '2147483647 months 2147483647 days 9223372036854775806 us'; + +-- infinite intervals +SELECT interval '-2147483648 months -2147483648 days -9223372036854775808 us'; +SELECT interval '2147483647 months 2147483647 days 9223372036854775807 us'; + +CREATE TABLE INFINITE_INTERVAL_TBL (i interval); +INSERT INTO INFINITE_INTERVAL_TBL VALUES ('infinity'), ('-infinity'), ('1 year 2 days 3 hours'); + +SELECT i, isfinite(i) FROM INFINITE_INTERVAL_TBL; + +-- test basic arithmetic +CREATE FUNCTION eval(expr text) +RETURNS text AS +$$ +DECLARE + result text; +BEGIN + EXECUTE 'select '||expr INTO result; + RETURN result; +EXCEPTION WHEN OTHERS THEN + RETURN SQLERRM; +END +$$ +LANGUAGE plpgsql; + +SELECT d AS date, i AS interval, + eval(format('date %L + interval %L', d, i)) AS plus, + eval(format('date %L - interval %L', d, i)) AS minus +FROM (VALUES (date '-infinity'), + (date '1995-08-06'), + (date 'infinity')) AS t1(d), + (VALUES (interval '-infinity'), + (interval 'infinity')) AS t2(i); + +SELECT i1 AS interval1, i2 AS interval2, + eval(format('interval %L + interval %L', i1, i2)) AS plus, + eval(format('interval %L - interval %L', i1, i2)) AS minus +FROM (VALUES (interval '-infinity'), + (interval '2 months'), + (interval 'infinity')) AS t1(i1), + (VALUES (interval '-infinity'), + (interval '10 days'), + (interval 'infinity')) AS t2(i2); + +SELECT interval '2147483646 months 2147483646 days 9223372036854775806 us' + interval '1 month 1 day 1 us'; +SELECT interval '-2147483647 months -2147483647 days -9223372036854775807 us' + interval '-1 month -1 day -1 us'; +SELECT interval '2147483646 months 2147483646 days 9223372036854775806 us' - interval '-1 month -1 day -1 us'; +SELECT interval '-2147483647 months -2147483647 days -9223372036854775807 us' - interval '1 month 1 day 1 us'; + +SELECT t AS timestamp, i AS interval, + eval(format('timestamp %L + interval %L', t, i)) AS plus, + eval(format('timestamp %L - interval %L', t, i)) AS minus +FROM (VALUES (timestamp '-infinity'), + (timestamp '1995-08-06 12:30:15'), + (timestamp 'infinity')) AS t1(t), + (VALUES (interval '-infinity'), + (interval 'infinity')) AS t2(i); + +SELECT t AT TIME ZONE 'GMT' AS timestamptz, i AS interval, + eval(format('timestamptz %L + interval %L', t, i)) AS plus, + eval(format('timestamptz %L - interval %L', t, i)) AS minus +FROM (VALUES (timestamptz '-infinity'), + (timestamptz '1995-08-06 12:30:15 GMT'), + (timestamptz 'infinity')) AS t1(t), + (VALUES (interval '-infinity'), + (interval 'infinity')) AS t2(i); + +-- time +/- infinite interval not supported +SELECT time '11:27:42' + interval 'infinity'; +SELECT time '11:27:42' + interval '-infinity'; +SELECT time '11:27:42' - interval 'infinity'; +SELECT time '11:27:42' - interval '-infinity'; +SELECT timetz '11:27:42' + interval 'infinity'; +SELECT timetz '11:27:42' + interval '-infinity'; +SELECT timetz '11:27:42' - interval 'infinity'; +SELECT timetz '11:27:42' - interval '-infinity'; + +SELECT lhst.i lhs, + rhst.i rhs, + lhst.i < rhst.i AS lt, + lhst.i <= rhst.i AS le, + lhst.i = rhst.i AS eq, + lhst.i > rhst.i AS gt, + lhst.i >= rhst.i AS ge, + lhst.i <> rhst.i AS ne + FROM INFINITE_INTERVAL_TBL lhst CROSS JOIN INFINITE_INTERVAL_TBL rhst + WHERE NOT isfinite(lhst.i); + +SELECT i AS interval, + -i AS um, + i * 2.0 AS mul, + i * -2.0 AS mul_neg, + i * 'infinity' AS mul_inf, + i * '-infinity' AS mul_inf_neg, + i / 3.0 AS div, + i / -3.0 AS div_neg + FROM INFINITE_INTERVAL_TBL + WHERE NOT isfinite(i); + +SELECT -interval '-2147483647 months -2147483647 days -9223372036854775807 us'; +SELECT interval 'infinity' * 'nan'; +SELECT interval '-infinity' * 'nan'; +SELECT interval '-1073741824 months -1073741824 days -4611686018427387904 us' * 2; +SELECT interval 'infinity' * 0; +SELECT interval '-infinity' * 0; +SELECT interval '0 days' * 'infinity'::float; +SELECT interval '0 days' * '-infinity'::float; +SELECT interval '5 days' * 'infinity'::float; +SELECT interval '5 days' * '-infinity'::float; + +SELECT interval 'infinity' / 'infinity'; +SELECT interval 'infinity' / '-infinity'; +SELECT interval 'infinity' / 'nan'; +SELECT interval '-infinity' / 'infinity'; +SELECT interval '-infinity' / '-infinity'; +SELECT interval '-infinity' / 'nan'; +SELECT interval '-1073741824 months -1073741824 days -4611686018427387904 us' / 0.5; + +SELECT date_bin('infinity', timestamp '2001-02-16 20:38:40', timestamp '2001-02-16 20:05:00'); +SELECT date_bin('-infinity', timestamp '2001-02-16 20:38:40', timestamp '2001-02-16 20:05:00'); + +SELECT i AS interval, date_trunc('hour', i) + FROM INFINITE_INTERVAL_TBL + WHERE NOT isfinite(i); + +SELECT i AS interval, justify_days(i), justify_hours(i), justify_interval(i) + FROM INFINITE_INTERVAL_TBL + WHERE NOT isfinite(i); + +SELECT timezone('infinity'::interval, '1995-08-06 12:12:12'::timestamp); +SELECT timezone('-infinity'::interval, '1995-08-06 12:12:12'::timestamp); +SELECT timezone('infinity'::interval, '1995-08-06 12:12:12'::timestamptz); +SELECT timezone('-infinity'::interval, '1995-08-06 12:12:12'::timestamptz); +SELECT timezone('infinity'::interval, '12:12:12'::time); +SELECT timezone('-infinity'::interval, '12:12:12'::time); +SELECT timezone('infinity'::interval, '12:12:12'::timetz); +SELECT timezone('-infinity'::interval, '12:12:12'::timetz); + +SELECT 'infinity'::interval::time; +SELECT '-infinity'::interval::time; + +SELECT to_char('infinity'::interval, 'YYYY'); +SELECT to_char('-infinity'::interval, 'YYYY'); + +-- "ago" can only appear once at the end of an interval. +SELECT INTERVAL '42 days 2 seconds ago ago'; +SELECT INTERVAL '2 minutes ago 5 days'; + +-- consecutive and dangling units are not allowed. +SELECT INTERVAL 'hour 5 months'; +SELECT INTERVAL '1 year months days 5 hours'; + +-- unacceptable reserved words in interval. Only "infinity", "+infinity" and +-- "-infinity" are allowed. +SELECT INTERVAL 'now'; +SELECT INTERVAL 'today'; +SELECT INTERVAL 'tomorrow'; +SELECT INTERVAL 'allballs'; +SELECT INTERVAL 'epoch'; +SELECT INTERVAL 'yesterday'; + +-- infinity specification should be the only thing +SELECT INTERVAL 'infinity years'; +SELECT INTERVAL 'infinity ago'; +SELECT INTERVAL '+infinity -infinity'; diff --git a/src/test/regress/sql/join.sql b/src/test/regress/sql/join.sql index 3e5032b04dd83..dcc94c0715d9c 100644 --- a/src/test/regress/sql/join.sql +++ b/src/test/regress/sql/join.sql @@ -693,6 +693,30 @@ select tt1.*, tt2.* from tt2 right join tt1 on tt1.joincol = tt2.joincol; reset enable_hashjoin; reset enable_nestloop; +-- +-- regression test for bug #18522 (merge-right-anti-join in inner_unique cases) +-- + +create temp table tbl_ra(a int unique, b int); +insert into tbl_ra select i, i%100 from generate_series(1,1000)i; +create index on tbl_ra (b); +analyze tbl_ra; + +set enable_hashjoin to off; +set enable_nestloop to off; + +-- ensure we get a merge right anti join +explain (costs off) +select * from tbl_ra t1 +where not exists (select 1 from tbl_ra t2 where t2.b = t1.a) and t1.b < 2; + +-- and check we get the expected results +select * from tbl_ra t1 +where not exists (select 1 from tbl_ra t2 where t2.b = t1.a) and t1.b < 2; + +reset enable_hashjoin; +reset enable_nestloop; + -- -- regression test for bug #13908 (hash join with skew tuples & nbatch increase) -- @@ -1381,6 +1405,18 @@ select * from mki4(42); drop function mki8(bigint, bigint); drop function mki4(int); +-- test const-folding of a whole-row Var into a per-field Var +-- (need to inline a function to reach this case, else parser does it) +create function f_field_select(t onek) returns int4 as +$$ select t.unique2; $$ language sql immutable; + +explain (verbose, costs off) +select (t2.*).unique1, f_field_select(t2) from tenk1 t1 + left join onek t2 on t1.unique1 = t2.unique1 + left join int8_tbl t3 on true; + +drop function f_field_select(t onek); + -- -- test extraction of restriction OR clauses from join OR clause -- (we used to only do this for indexable clauses) @@ -1852,11 +1888,11 @@ reset enable_nestloop; explain (costs off) select a.unique1, b.unique2 from onek a left join onek b on a.unique1 = b.unique2 - where b.unique2 = any (select q1 from int8_tbl c where c.q1 < b.unique1); + where (b.unique2, random() > 0) = any (select q1, random() > 0 from int8_tbl c where c.q1 < b.unique1); select a.unique1, b.unique2 from onek a left join onek b on a.unique1 = b.unique2 - where b.unique2 = any (select q1 from int8_tbl c where c.q1 < b.unique1); + where (b.unique2, random() > 0) = any (select q1, random() > 0 from int8_tbl c where c.q1 < b.unique1); -- -- test full-join strength reduction @@ -2510,6 +2546,18 @@ select * from ) on c.q2 = ss2.q1, lateral (select ss2.y offset 0) ss3; +-- another case requiring nested PlaceHolderVars +explain (verbose, costs off) +select * from + (select 0 as val0) as ss0 + left join (select 1 as val) as ss1 on true + left join lateral (select ss1.val as val_filtered where false) as ss2 on true; + +select * from + (select 0 as val0) as ss0 + left join (select 1 as val) as ss1 on true + left join lateral (select ss1.val as val_filtered where false) as ss2 on true; + -- case that breaks the old ph_may_need optimization explain (verbose, costs off) select c.*,a.*,ss1.q1,ss2.q1,ss3.* from @@ -2578,7 +2626,7 @@ select * from (values (0), (1)) v(id), lateral (select * from int8_tbl t1, lateral (select * from (select * from int8_tbl t2 - where q1 = any (select q2 from int8_tbl t3 + where (q1, random() > 0) = any (select q2, random() > 0 from int8_tbl t3 where q2 = (select greatest(t1.q1,t2.q2)) and (select v.id=0)) offset 0) ss2) ss where t1.q1 = ss.q2) ss0; @@ -2587,7 +2635,7 @@ select * from (values (0), (1)) v(id), lateral (select * from int8_tbl t1, lateral (select * from (select * from int8_tbl t2 - where q1 = any (select q2 from int8_tbl t3 + where (q1, random() > 0) = any (select q2, random() > 0 from int8_tbl t3 where q2 = (select greatest(t1.q1,t2.q2)) and (select v.id=0)) offset 0) ss2) ss where t1.q1 = ss.q2) ss0; @@ -2880,3 +2928,40 @@ where exists (select 1 from j3 and t1.unique1 < 1; drop table j3; + +-- Exercise the "skip fetch" Bitmap Heap Scan optimization when candidate +-- tuples are discarded. This may occur when: +-- 1. A join doesn't require all inner tuples to be scanned for each outer +-- tuple, and +-- 2. The inner side is scanned using a bitmap heap scan, and +-- 3. The bitmap heap scan is eligible for the "skip fetch" optimization. +-- This optimization is usable when no data from the underlying table is +-- needed. Use a temp table so it is only visible to this backend and +-- vacuum may reliably mark all blocks in the table all visible in the +-- visibility map. +CREATE TEMP TABLE skip_fetch (a INT, b INT) WITH (fillfactor=10); +INSERT INTO skip_fetch SELECT i % 3, i FROM generate_series(0,30) i; +CREATE INDEX ON skip_fetch(a); +VACUUM (ANALYZE) skip_fetch; + +SET enable_indexonlyscan = off; +SET enable_seqscan = off; +EXPLAIN (COSTS OFF) +SELECT t1.a FROM skip_fetch t1 LEFT JOIN skip_fetch t2 ON t2.a = 1 WHERE t2.a IS NULL; +SELECT t1.a FROM skip_fetch t1 LEFT JOIN skip_fetch t2 ON t2.a = 1 WHERE t2.a IS NULL; + +RESET enable_indexonlyscan; +RESET enable_seqscan; + +-- Test that we do not account for nullingrels when looking up statistics +CREATE TABLE group_tbl (a INT, b INT); +INSERT INTO group_tbl SELECT 1, 1; +CREATE STATISTICS group_tbl_stat (ndistinct) ON a, b FROM group_tbl; +ANALYZE group_tbl; + +EXPLAIN (COSTS OFF) +SELECT 1 FROM group_tbl t1 + LEFT JOIN (SELECT a c1, COALESCE(a) c2 FROM group_tbl t2) s ON TRUE +GROUP BY s.c1, s.c2; + +DROP TABLE group_tbl; diff --git a/src/test/regress/sql/json.sql b/src/test/regress/sql/json.sql index ec57dfe707077..50b4ed6743502 100644 --- a/src/test/regress/sql/json.sql +++ b/src/test/regress/sql/json.sql @@ -748,6 +748,8 @@ select json_object('{a,b,NULL,"d e f"}','{1,2,3,"a b c"}'); select json_object('{a,b,"","d e f"}','{1,2,3,"a b c"}'); +-- json_object_agg_unique requires unique keys +select json_object_agg_unique(mod(i,100), i) from generate_series(0, 199) i; -- json_to_record and json_to_recordset diff --git a/src/test/regress/sql/jsonb.sql b/src/test/regress/sql/jsonb.sql index e4b7cdf703d53..97bc2242a1333 100644 --- a/src/test/regress/sql/jsonb.sql +++ b/src/test/regress/sql/jsonb.sql @@ -413,6 +413,9 @@ SELECT jsonb_object_agg(name, type) FROM foo; INSERT INTO foo VALUES (999999, NULL, 'bar'); SELECT jsonb_object_agg(name, type) FROM foo; +-- edge case for parser +SELECT jsonb_object_agg(DISTINCT 'a', 'abc'); + -- jsonb_object -- empty object, one dimension @@ -676,6 +679,43 @@ SELECT rec FROM jsonb_populate_record( '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}' ) q; +-- Tests to check soft-error support for populate_record_field() + +-- populate_scalar() +create type jsb_char2 as (a char(2)); +select jsonb_populate_record_valid(NULL::jsb_char2, '{"a": "aaa"}'); +select * from jsonb_populate_record(NULL::jsb_char2, '{"a": "aaa"}') q; +select jsonb_populate_record_valid(NULL::jsb_char2, '{"a": "aa"}'); +select * from jsonb_populate_record(NULL::jsb_char2, '{"a": "aa"}') q; + +-- populate_array() +create type jsb_ia as (a int[]); +create type jsb_ia2 as (a int[][]); +select jsonb_populate_record_valid(NULL::jsb_ia, '{"a": 43.2}'); +select * from jsonb_populate_record(NULL::jsb_ia, '{"a": 43.2}') q; +select jsonb_populate_record_valid(NULL::jsb_ia, '{"a": [1, 2]}'); +select * from jsonb_populate_record(NULL::jsb_ia, '{"a": [1, 2]}') q; +select jsonb_populate_record_valid(NULL::jsb_ia2, '{"a": [[1], [2, 3]]}'); +select * from jsonb_populate_record(NULL::jsb_ia2, '{"a": [[1], [2, 3]]}') q; +select jsonb_populate_record_valid(NULL::jsb_ia2, '{"a": [[1, 0], [2, 3]]}'); +select * from jsonb_populate_record(NULL::jsb_ia2, '{"a": [[1, 0], [2, 3]]}') q; + +-- populate_domain() +create domain jsb_i_not_null as int not null; +create domain jsb_i_gt_1 as int check (value > 1); +create type jsb_i_not_null_rec as (a jsb_i_not_null); +create type jsb_i_gt_1_rec as (a jsb_i_gt_1); +select jsonb_populate_record_valid(NULL::jsb_i_not_null_rec, '{"a": null}'); +select * from jsonb_populate_record(NULL::jsb_i_not_null_rec, '{"a": null}') q; +select jsonb_populate_record_valid(NULL::jsb_i_not_null_rec, '{"a": 1}'); +select * from jsonb_populate_record(NULL::jsb_i_not_null_rec, '{"a": 1}') q; +select jsonb_populate_record_valid(NULL::jsb_i_gt_1_rec, '{"a": 1}'); +select * from jsonb_populate_record(NULL::jsb_i_gt_1_rec, '{"a": 1}') q; +select jsonb_populate_record_valid(NULL::jsb_i_gt_1_rec, '{"a": 2}'); +select * from jsonb_populate_record(NULL::jsb_i_gt_1_rec, '{"a": 2}') q; +drop type jsb_ia, jsb_ia2, jsb_char2, jsb_i_not_null_rec, jsb_i_gt_1_rec; +drop domain jsb_i_not_null, jsb_i_gt_1; + -- anonymous record type SELECT jsonb_populate_record(null::record, '{"x": 0, "y": 1}'); SELECT jsonb_populate_record(row(1,2), '{"f1": 0, "f2": 1}'); diff --git a/src/test/regress/sql/jsonb_jsonpath.sql b/src/test/regress/sql/jsonb_jsonpath.sql index e0ce509264a9a..acb508c0dd2f9 100644 --- a/src/test/regress/sql/jsonb_jsonpath.sql +++ b/src/test/regress/sql/jsonb_jsonpath.sql @@ -372,8 +372,364 @@ select jsonb_path_query('"10-03-2017T12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH2 select jsonb_path_query('"10-03-2017t12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); select jsonb_path_query('"10-03-2017 12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")'); +-- Test .bigint() +select jsonb_path_query('null', '$.bigint()'); +select jsonb_path_query('true', '$.bigint()'); +select jsonb_path_query('null', '$.bigint()', silent => true); +select jsonb_path_query('true', '$.bigint()', silent => true); +select jsonb_path_query('[]', '$.bigint()'); +select jsonb_path_query('[]', 'strict $.bigint()'); +select jsonb_path_query('{}', '$.bigint()'); +select jsonb_path_query('[]', 'strict $.bigint()', silent => true); +select jsonb_path_query('{}', '$.bigint()', silent => true); +select jsonb_path_query('"1.23"', '$.bigint()'); +select jsonb_path_query('"1.23aaa"', '$.bigint()'); +select jsonb_path_query('1e1000', '$.bigint()'); +select jsonb_path_query('"nan"', '$.bigint()'); +select jsonb_path_query('"NaN"', '$.bigint()'); +select jsonb_path_query('"inf"', '$.bigint()'); +select jsonb_path_query('"-inf"', '$.bigint()'); +select jsonb_path_query('"inf"', '$.bigint()', silent => true); +select jsonb_path_query('"-inf"', '$.bigint()', silent => true); +select jsonb_path_query('123', '$.bigint()'); +select jsonb_path_query('"123"', '$.bigint()'); +select jsonb_path_query('1.23', '$.bigint()'); +select jsonb_path_query('1.83', '$.bigint()'); +select jsonb_path_query('1234567890123', '$.bigint()'); +select jsonb_path_query('"1234567890123"', '$.bigint()'); +select jsonb_path_query('12345678901234567890', '$.bigint()'); +select jsonb_path_query('"12345678901234567890"', '$.bigint()'); +select jsonb_path_query('"+123"', '$.bigint()'); +select jsonb_path_query('-123', '$.bigint()'); +select jsonb_path_query('"-123"', '$.bigint()'); +select jsonb_path_query('123', '$.bigint() * 2'); + +-- Test .boolean() +select jsonb_path_query('null', '$.boolean()'); +select jsonb_path_query('null', '$.boolean()', silent => true); +select jsonb_path_query('[]', '$.boolean()'); +select jsonb_path_query('[]', 'strict $.boolean()'); +select jsonb_path_query('{}', '$.boolean()'); +select jsonb_path_query('[]', 'strict $.boolean()', silent => true); +select jsonb_path_query('{}', '$.boolean()', silent => true); +select jsonb_path_query('1.23', '$.boolean()'); +select jsonb_path_query('"1.23"', '$.boolean()'); +select jsonb_path_query('"1.23aaa"', '$.boolean()'); +select jsonb_path_query('1e1000', '$.boolean()'); +select jsonb_path_query('"nan"', '$.boolean()'); +select jsonb_path_query('"NaN"', '$.boolean()'); +select jsonb_path_query('"inf"', '$.boolean()'); +select jsonb_path_query('"-inf"', '$.boolean()'); +select jsonb_path_query('"inf"', '$.boolean()', silent => true); +select jsonb_path_query('"-inf"', '$.boolean()', silent => true); +select jsonb_path_query('"100"', '$.boolean()'); +select jsonb_path_query('true', '$.boolean()'); +select jsonb_path_query('false', '$.boolean()'); +select jsonb_path_query('1', '$.boolean()'); +select jsonb_path_query('0', '$.boolean()'); +select jsonb_path_query('-1', '$.boolean()'); +select jsonb_path_query('100', '$.boolean()'); +select jsonb_path_query('"1"', '$.boolean()'); +select jsonb_path_query('"0"', '$.boolean()'); +select jsonb_path_query('"true"', '$.boolean()'); +select jsonb_path_query('"false"', '$.boolean()'); +select jsonb_path_query('"TRUE"', '$.boolean()'); +select jsonb_path_query('"FALSE"', '$.boolean()'); +select jsonb_path_query('"yes"', '$.boolean()'); +select jsonb_path_query('"NO"', '$.boolean()'); +select jsonb_path_query('"T"', '$.boolean()'); +select jsonb_path_query('"f"', '$.boolean()'); +select jsonb_path_query('"y"', '$.boolean()'); +select jsonb_path_query('"N"', '$.boolean()'); +select jsonb_path_query('true', '$.boolean().type()'); +select jsonb_path_query('123', '$.boolean().type()'); +select jsonb_path_query('"Yes"', '$.boolean().type()'); +select jsonb_path_query_array('[1, "yes", false]', '$[*].boolean()'); + +-- Test .date() +select jsonb_path_query('null', '$.date()'); +select jsonb_path_query('true', '$.date()'); +select jsonb_path_query('1', '$.date()'); +select jsonb_path_query('[]', '$.date()'); +select jsonb_path_query('[]', 'strict $.date()'); +select jsonb_path_query('{}', '$.date()'); +select jsonb_path_query('"bogus"', '$.date()'); + +select jsonb '"2023-08-15"' @? '$.date()'; +select jsonb_path_query('"2023-08-15"', '$.date()'); +select jsonb_path_query('"2023-08-15"', '$.date().type()'); + +select jsonb_path_query('"12:34:56"', '$.date()'); +select jsonb_path_query('"12:34:56 +05:30"', '$.date()'); +select jsonb_path_query('"2023-08-15 12:34:56"', '$.date()'); +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.date()'); +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.date()'); -- should work + +select jsonb_path_query('"2023-08-15"', '$.date(2)'); + +-- Test .decimal() +select jsonb_path_query('null', '$.decimal()'); +select jsonb_path_query('true', '$.decimal()'); +select jsonb_path_query('null', '$.decimal()', silent => true); +select jsonb_path_query('true', '$.decimal()', silent => true); +select jsonb_path_query('[]', '$.decimal()'); +select jsonb_path_query('[]', 'strict $.decimal()'); +select jsonb_path_query('{}', '$.decimal()'); +select jsonb_path_query('[]', 'strict $.decimal()', silent => true); +select jsonb_path_query('{}', '$.decimal()', silent => true); +select jsonb_path_query('1.23', '$.decimal()'); +select jsonb_path_query('"1.23"', '$.decimal()'); +select jsonb_path_query('"1.23aaa"', '$.decimal()'); +select jsonb_path_query('1e1000', '$.decimal()'); +select jsonb_path_query('"nan"', '$.decimal()'); +select jsonb_path_query('"NaN"', '$.decimal()'); +select jsonb_path_query('"inf"', '$.decimal()'); +select jsonb_path_query('"-inf"', '$.decimal()'); +select jsonb_path_query('"inf"', '$.decimal()', silent => true); +select jsonb_path_query('"-inf"', '$.decimal()', silent => true); +select jsonb_path_query('123', '$.decimal()'); +select jsonb_path_query('"123"', '$.decimal()'); +select jsonb_path_query('12345678901234567890', '$.decimal()'); +select jsonb_path_query('"12345678901234567890"', '$.decimal()'); +select jsonb_path_query('"+12.3"', '$.decimal()'); +select jsonb_path_query('-12.3', '$.decimal()'); +select jsonb_path_query('"-12.3"', '$.decimal()'); +select jsonb_path_query('12.3', '$.decimal() * 2'); +select jsonb_path_query('12345.678', '$.decimal(6, 1)'); +select jsonb_path_query('12345.678', '$.decimal(6, 2)'); +select jsonb_path_query('1234.5678', '$.decimal(6, 2)'); +select jsonb_path_query('12345.678', '$.decimal(4, 6)'); +select jsonb_path_query('12345.678', '$.decimal(0, 6)'); +select jsonb_path_query('12345.678', '$.decimal(1001, 6)'); +select jsonb_path_query('1234.5678', '$.decimal(+6, +2)'); +select jsonb_path_query('1234.5678', '$.decimal(+6, -2)'); +select jsonb_path_query('1234.5678', '$.decimal(-6, +2)'); +select jsonb_path_query('1234.5678', '$.decimal(6, -1001)'); +select jsonb_path_query('1234.5678', '$.decimal(6, 1001)'); +select jsonb_path_query('-1234.5678', '$.decimal(+6, -2)'); +select jsonb_path_query('0.0123456', '$.decimal(1,2)'); +select jsonb_path_query('0.0012345', '$.decimal(2,4)'); +select jsonb_path_query('-0.00123456', '$.decimal(2,-4)'); +select jsonb_path_query('12.3', '$.decimal(12345678901,1)'); +select jsonb_path_query('12.3', '$.decimal(1,12345678901)'); + +-- Test .integer() +select jsonb_path_query('null', '$.integer()'); +select jsonb_path_query('true', '$.integer()'); +select jsonb_path_query('null', '$.integer()', silent => true); +select jsonb_path_query('true', '$.integer()', silent => true); +select jsonb_path_query('[]', '$.integer()'); +select jsonb_path_query('[]', 'strict $.integer()'); +select jsonb_path_query('{}', '$.integer()'); +select jsonb_path_query('[]', 'strict $.integer()', silent => true); +select jsonb_path_query('{}', '$.integer()', silent => true); +select jsonb_path_query('"1.23"', '$.integer()'); +select jsonb_path_query('"1.23aaa"', '$.integer()'); +select jsonb_path_query('1e1000', '$.integer()'); +select jsonb_path_query('"nan"', '$.integer()'); +select jsonb_path_query('"NaN"', '$.integer()'); +select jsonb_path_query('"inf"', '$.integer()'); +select jsonb_path_query('"-inf"', '$.integer()'); +select jsonb_path_query('"inf"', '$.integer()', silent => true); +select jsonb_path_query('"-inf"', '$.integer()', silent => true); +select jsonb_path_query('123', '$.integer()'); +select jsonb_path_query('"123"', '$.integer()'); +select jsonb_path_query('1.23', '$.integer()'); +select jsonb_path_query('1.83', '$.integer()'); +select jsonb_path_query('12345678901', '$.integer()'); +select jsonb_path_query('"12345678901"', '$.integer()'); +select jsonb_path_query('"+123"', '$.integer()'); +select jsonb_path_query('-123', '$.integer()'); +select jsonb_path_query('"-123"', '$.integer()'); +select jsonb_path_query('123', '$.integer() * 2'); + +-- Test .number() +select jsonb_path_query('null', '$.number()'); +select jsonb_path_query('true', '$.number()'); +select jsonb_path_query('null', '$.number()', silent => true); +select jsonb_path_query('true', '$.number()', silent => true); +select jsonb_path_query('[]', '$.number()'); +select jsonb_path_query('[]', 'strict $.number()'); +select jsonb_path_query('{}', '$.number()'); +select jsonb_path_query('[]', 'strict $.number()', silent => true); +select jsonb_path_query('{}', '$.number()', silent => true); +select jsonb_path_query('1.23', '$.number()'); +select jsonb_path_query('"1.23"', '$.number()'); +select jsonb_path_query('"1.23aaa"', '$.number()'); +select jsonb_path_query('1e1000', '$.number()'); +select jsonb_path_query('"nan"', '$.number()'); +select jsonb_path_query('"NaN"', '$.number()'); +select jsonb_path_query('"inf"', '$.number()'); +select jsonb_path_query('"-inf"', '$.number()'); +select jsonb_path_query('"inf"', '$.number()', silent => true); +select jsonb_path_query('"-inf"', '$.number()', silent => true); +select jsonb_path_query('123', '$.number()'); +select jsonb_path_query('"123"', '$.number()'); +select jsonb_path_query('12345678901234567890', '$.number()'); +select jsonb_path_query('"12345678901234567890"', '$.number()'); +select jsonb_path_query('"+12.3"', '$.number()'); +select jsonb_path_query('-12.3', '$.number()'); +select jsonb_path_query('"-12.3"', '$.number()'); +select jsonb_path_query('12.3', '$.number() * 2'); + +-- Test .string() +select jsonb_path_query('null', '$.string()'); +select jsonb_path_query('null', '$.string()', silent => true); +select jsonb_path_query('[]', '$.string()'); +select jsonb_path_query('[]', 'strict $.string()'); +select jsonb_path_query('{}', '$.string()'); +select jsonb_path_query('[]', 'strict $.string()', silent => true); +select jsonb_path_query('{}', '$.string()', silent => true); +select jsonb_path_query('1.23', '$.string()'); +select jsonb_path_query('"1.23"', '$.string()'); +select jsonb_path_query('"1.23aaa"', '$.string()'); +select jsonb_path_query('1234', '$.string()'); +select jsonb_path_query('true', '$.string()'); +select jsonb_path_query('1234', '$.string().type()'); +select jsonb_path_query('[2, true]', '$.string()'); +select jsonb_path_query_array('[1.23, "yes", false]', '$[*].string()'); +select jsonb_path_query_array('[1.23, "yes", false]', '$[*].string().type()'); +select jsonb_path_query('"2023-08-15 12:34:56 +5:30"', '$.timestamp().string()'); +select jsonb_path_query_tz('"2023-08-15 12:34:56 +5:30"', '$.timestamp().string()'); -- should work +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp_tz().string()'); +select jsonb_path_query_tz('"2023-08-15 12:34:56"', '$.timestamp_tz().string()'); -- should work +select jsonb_path_query('"2023-08-15 12:34:56 +5:30"', '$.timestamp_tz().string()'); +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp().string()'); +select jsonb_path_query('"12:34:56 +5:30"', '$.time_tz().string()'); +-- this timetz usage will absorb the UTC offset of the current timezone setting +begin; +set local timezone = 'UTC-10'; +select jsonb_path_query_tz('"12:34:56"', '$.time_tz().string()'); +rollback; +select jsonb_path_query('"12:34:56"', '$.time().string()'); +select jsonb_path_query('"2023-08-15"', '$.date().string()'); + +-- .string() does not react to timezone or datestyle +begin; +set local timezone = 'UTC'; +set local datestyle = 'German'; +select jsonb_path_query('"2023-08-15 12:34:56 +5:30"', '$.timestamp_tz().string()'); +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp().string()'); +rollback; + +-- Test .time() +select jsonb_path_query('null', '$.time()'); +select jsonb_path_query('true', '$.time()'); +select jsonb_path_query('1', '$.time()'); +select jsonb_path_query('[]', '$.time()'); +select jsonb_path_query('[]', 'strict $.time()'); +select jsonb_path_query('{}', '$.time()'); +select jsonb_path_query('"bogus"', '$.time()'); + +select jsonb '"12:34:56"' @? '$.time()'; +select jsonb_path_query('"12:34:56"', '$.time()'); +select jsonb_path_query('"12:34:56"', '$.time().type()'); + +select jsonb_path_query('"2023-08-15"', '$.time()'); +select jsonb_path_query('"12:34:56 +05:30"', '$.time()'); +select jsonb_path_query_tz('"12:34:56 +05:30"', '$.time()'); -- should work +select jsonb_path_query('"2023-08-15 12:34:56"', '$.time()'); + +select jsonb_path_query('"12:34:56.789"', '$.time(-1)'); +select jsonb_path_query('"12:34:56.789"', '$.time(2.0)'); +select jsonb_path_query('"12:34:56.789"', '$.time(12345678901)'); +select jsonb_path_query('"12:34:56.789"', '$.time(0)'); +select jsonb_path_query('"12:34:56.789"', '$.time(2)'); +select jsonb_path_query('"12:34:56.789"', '$.time(5)'); +select jsonb_path_query('"12:34:56.789"', '$.time(10)'); +select jsonb_path_query('"12:34:56.789012"', '$.time(8)'); + +-- Test .time_tz() +select jsonb_path_query('null', '$.time_tz()'); +select jsonb_path_query('true', '$.time_tz()'); +select jsonb_path_query('1', '$.time_tz()'); +select jsonb_path_query('[]', '$.time_tz()'); +select jsonb_path_query('[]', 'strict $.time_tz()'); +select jsonb_path_query('{}', '$.time_tz()'); +select jsonb_path_query('"bogus"', '$.time_tz()'); + +select jsonb '"12:34:56 +05:30"' @? '$.time_tz()'; +select jsonb_path_query('"12:34:56 +05:30"', '$.time_tz()'); +select jsonb_path_query('"12:34:56 +05:30"', '$.time_tz().type()'); + +select jsonb_path_query('"2023-08-15"', '$.time_tz()'); +select jsonb_path_query('"2023-08-15 12:34:56"', '$.time_tz()'); + +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(-1)'); +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(2.0)'); +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(12345678901)'); +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(0)'); +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(2)'); +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(5)'); +select jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(10)'); +select jsonb_path_query('"12:34:56.789012 +05:30"', '$.time_tz(8)'); + +-- Test .timestamp() +select jsonb_path_query('null', '$.timestamp()'); +select jsonb_path_query('true', '$.timestamp()'); +select jsonb_path_query('1', '$.timestamp()'); +select jsonb_path_query('[]', '$.timestamp()'); +select jsonb_path_query('[]', 'strict $.timestamp()'); +select jsonb_path_query('{}', '$.timestamp()'); +select jsonb_path_query('"bogus"', '$.timestamp()'); + +select jsonb '"2023-08-15 12:34:56"' @? '$.timestamp()'; +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp()'); +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp().type()'); + +select jsonb_path_query('"2023-08-15"', '$.timestamp()'); +select jsonb_path_query('"12:34:56"', '$.timestamp()'); +select jsonb_path_query('"12:34:56 +05:30"', '$.timestamp()'); + +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(-1)'); +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(2.0)'); +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(12345678901)'); +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(0)'); +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(2)'); +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(5)'); +select jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(10)'); +select jsonb_path_query('"2023-08-15 12:34:56.789012"', '$.timestamp(8)'); + +-- Test .timestamp_tz() +select jsonb_path_query('null', '$.timestamp_tz()'); +select jsonb_path_query('true', '$.timestamp_tz()'); +select jsonb_path_query('1', '$.timestamp_tz()'); +select jsonb_path_query('[]', '$.timestamp_tz()'); +select jsonb_path_query('[]', 'strict $.timestamp_tz()'); +select jsonb_path_query('{}', '$.timestamp_tz()'); +select jsonb_path_query('"bogus"', '$.timestamp_tz()'); + +select jsonb '"2023-08-15 12:34:56 +05:30"' @? '$.timestamp_tz()'; +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp_tz()'); +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp_tz().type()'); + +select jsonb_path_query('"2023-08-15"', '$.timestamp_tz()'); +select jsonb_path_query_tz('"2023-08-15"', '$.timestamp_tz()'); -- should work +select jsonb_path_query('"12:34:56"', '$.timestamp_tz()'); +select jsonb_path_query('"12:34:56 +05:30"', '$.timestamp_tz()'); + +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(-1)'); +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(2.0)'); +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(12345678901)'); +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(0)'); +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(2)'); +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(5)'); +select jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(10)'); +select jsonb_path_query('"2023-08-15 12:34:56.789012 +05:30"', '$.timestamp_tz(8)'); + + set time zone '+00'; +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.time()'); +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.time()'); -- should work +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.time_tz()'); +select jsonb_path_query('"12:34:56"', '$.time_tz()'); +select jsonb_path_query_tz('"12:34:56"', '$.time_tz()'); -- should work +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp()'); +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.timestamp()'); -- should work +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp_tz()'); +select jsonb_path_query_tz('"2023-08-15 12:34:56"', '$.timestamp_tz()'); -- should work + select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")'); select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); @@ -389,6 +745,15 @@ select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")'); set time zone '+10'; +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.time()'); +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.time()'); -- should work +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.time_tz()'); +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp()'); +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.timestamp()'); -- should work +select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp_tz()'); +select jsonb_path_query_tz('"2023-08-15 12:34:56"', '$.timestamp_tz()'); -- should work +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp_tz()'); + select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")'); select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")'); @@ -404,6 +769,13 @@ select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")'); set time zone default; +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.time()'); +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.time()'); -- should work +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.time_tz()'); +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp()'); +select jsonb_path_query_tz('"2023-08-15 12:34:56 +05:30"', '$.timestamp()'); -- should work +select jsonb_path_query('"2023-08-15 12:34:56 +05:30"', '$.timestamp_tz()'); + select jsonb_path_query('"2017-03-10"', '$.datetime().type()'); select jsonb_path_query('"2017-03-10"', '$.datetime()'); select jsonb_path_query('"2017-03-10 12:34:56"', '$.datetime().type()'); @@ -417,6 +789,8 @@ select jsonb_path_query('"2017-03-10t12:34:56+3:10"', '$.datetime()'); select jsonb_path_query('"2017-03-10 12:34:56.789+3:10"', '$.datetime()'); select jsonb_path_query('"2017-03-10T12:34:56.789+3:10"', '$.datetime()'); select jsonb_path_query('"2017-03-10t12:34:56.789+3:10"', '$.datetime()'); +select jsonb_path_query('"2017-03-10T12:34:56.789EST"', '$.datetime()'); +select jsonb_path_query('"2017-03-10T12:34:56.789Z"', '$.datetime()'); select jsonb_path_query('"12:34:56"', '$.datetime().type()'); select jsonb_path_query('"12:34:56"', '$.datetime()'); select jsonb_path_query('"12:34:56+3"', '$.datetime().type()'); @@ -446,6 +820,34 @@ select jsonb_path_query_tz( '["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', '$[*].datetime() ? (@ < "10.03.2017".datetime("dd.mm.yyyy"))'); +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ == "2017-03-10".date())'); +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ >= "2017-03-10".date())'); +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].datetime() ? (@ < "2017-03-10".date())'); +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].date() ? (@ == "2017-03-10".date())'); +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].date() ? (@ >= "2017-03-10".date())'); +select jsonb_path_query( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].date() ? (@ < "2017-03-10".date())'); +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].date() ? (@ == "2017-03-10".date())'); +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].date() ? (@ >= "2017-03-10".date())'); +select jsonb_path_query_tz( + '["2017-03-10", "2017-03-11", "2017-03-09", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]', + '$[*].date() ? (@ < "2017-03-10".date())'); + -- time comparison select jsonb_path_query( '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', @@ -466,6 +868,41 @@ select jsonb_path_query_tz( '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', '$[*].datetime() ? (@ < "12:35".datetime("HH24:MI"))'); +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ == "12:35:00".time())'); +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ >= "12:35:00".time())'); +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].datetime() ? (@ < "12:35:00".time())'); +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].time() ? (@ == "12:35:00".time())'); +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].time() ? (@ >= "12:35:00".time())'); +select jsonb_path_query( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].time() ? (@ < "12:35:00".time())'); +select jsonb_path_query( + '["12:34:00.123", "12:35:00.123", "12:36:00.1123", "12:35:00.1123+00", "12:35:00.123+01", "13:35:00.123+01", "2017-03-10 12:35:00.1", "2017-03-10 12:35:00.123+01"]', + '$[*].time(2) ? (@ >= "12:35:00.123".time(2))'); +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].time() ? (@ == "12:35:00".time())'); +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].time() ? (@ >= "12:35:00".time())'); +select jsonb_path_query_tz( + '["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]', + '$[*].time() ? (@ < "12:35:00".time())'); +select jsonb_path_query_tz( + '["12:34:00.123", "12:35:00.123", "12:36:00.1123", "12:35:00.1123+00", "12:35:00.123+01", "13:35:00.123+01", "2017-03-10 12:35:00.1", "2017-03-10 12:35:00.123+01"]', + '$[*].time(2) ? (@ >= "12:35:00.123".time(2))'); + + -- timetz comparison select jsonb_path_query( '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', @@ -486,6 +923,40 @@ select jsonb_path_query_tz( '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]', '$[*].datetime() ? (@ < "12:35 +1".datetime("HH24:MI TZH"))'); +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ == "12:35:00 +1".time_tz())'); +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ >= "12:35:00 +1".time_tz())'); +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].datetime() ? (@ < "12:35:00 +1".time_tz())'); +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].time_tz() ? (@ == "12:35:00 +1".time_tz())'); +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].time_tz() ? (@ >= "12:35:00 +1".time_tz())'); +select jsonb_path_query( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].time_tz() ? (@ < "12:35:00 +1".time_tz())'); +select jsonb_path_query( + '["12:34:00.123+01", "12:35:00.123+01", "12:36:00.1123+01", "12:35:00.1123+02", "12:35:00.123-02", "10:35:00.123", "11:35:00.1", "12:35:00.123", "2017-03-10 12:35:00.123 +1"]', + '$[*].time_tz(2) ? (@ >= "12:35:00.123 +1".time_tz(2))'); +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].time_tz() ? (@ == "12:35:00 +1".time_tz())'); +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].time_tz() ? (@ >= "12:35:00 +1".time_tz())'); +select jsonb_path_query_tz( + '["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10 12:35:00 +1"]', + '$[*].time_tz() ? (@ < "12:35:00 +1".time_tz())'); +select jsonb_path_query_tz( + '["12:34:00.123+01", "12:35:00.123+01", "12:36:00.1123+01", "12:35:00.1123+02", "12:35:00.123-02", "10:35:00.123", "11:35:00.1", "12:35:00.123", "2017-03-10 12:35:00.123 +1"]', + '$[*].time_tz(2) ? (@ >= "12:35:00.123 +1".time_tz(2))'); + -- timestamp comparison select jsonb_path_query( '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', @@ -506,6 +977,40 @@ select jsonb_path_query_tz( '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', '$[*].datetime() ? (@ < "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].datetime() ? (@ == "2017-03-10 12:35:00".timestamp())'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].datetime() ? (@ >= "2017-03-10 12:35:00".timestamp())'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].datetime() ? (@ < "2017-03-10 12:35:00".timestamp())'); +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp() ? (@ == "2017-03-10 12:35:00".timestamp())'); +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp() ? (@ >= "2017-03-10 12:35:00".timestamp())'); +select jsonb_path_query( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp() ? (@ < "2017-03-10 12:35:00".timestamp())'); +select jsonb_path_query( + '["2017-03-10 12:34:00.123", "2017-03-10 12:35:00.123", "2017-03-10 12:36:00.1123", "2017-03-10 12:35:00.1123+01", "2017-03-10 13:35:00.123+01", "2017-03-10 12:35:00.1-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp(2) ? (@ >= "2017-03-10 12:35:00.123".timestamp(2))'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp() ? (@ == "2017-03-10 12:35:00".timestamp())'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp() ? (@ >= "2017-03-10 12:35:00".timestamp())'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp() ? (@ < "2017-03-10 12:35:00".timestamp())'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00.123", "2017-03-10 12:35:00.123", "2017-03-10 12:36:00.1123", "2017-03-10 12:35:00.1123+01", "2017-03-10 13:35:00.123+01", "2017-03-10 12:35:00.1-01", "2017-03-10", "2017-03-11"]', + '$[*].timestamp(2) ? (@ >= "2017-03-10 12:35:00.123".timestamp(2))'); + -- timestamptz comparison select jsonb_path_query( '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', @@ -526,6 +1031,41 @@ select jsonb_path_query_tz( '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]', '$[*].datetime() ? (@ < "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].datetime() ? (@ == "2017-03-10 12:35:00 +1".timestamp_tz())'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].datetime() ? (@ >= "2017-03-10 12:35:00 +1".timestamp_tz())'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].datetime() ? (@ < "2017-03-10 12:35:00 +1".timestamp_tz())'); +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz() ? (@ == "2017-03-10 12:35:00 +1".timestamp_tz())'); +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz() ? (@ >= "2017-03-10 12:35:00 +1".timestamp_tz())'); +select jsonb_path_query( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz() ? (@ < "2017-03-10 12:35:00 +1".timestamp_tz())'); +select jsonb_path_query( + '["2017-03-10 12:34:00.123+01", "2017-03-10 12:35:00.123+01", "2017-03-10 12:36:00.1123+01", "2017-03-10 12:35:00.1123+02", "2017-03-10 12:35:00.123-02", "2017-03-10 10:35:00.123", "2017-03-10 11:35:00.1", "2017-03-10 12:35:00.123", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz(2) ? (@ >= "2017-03-10 12:35:00.123 +1".timestamp_tz(2))'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz() ? (@ == "2017-03-10 12:35:00 +1".timestamp_tz())'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz() ? (@ >= "2017-03-10 12:35:00 +1".timestamp_tz())'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz() ? (@ < "2017-03-10 12:35:00 +1".timestamp_tz())'); +select jsonb_path_query_tz( + '["2017-03-10 12:34:00.123+01", "2017-03-10 12:35:00.123+01", "2017-03-10 12:36:00.1123+01", "2017-03-10 12:35:00.1123+02", "2017-03-10 12:35:00.123-02", "2017-03-10 10:35:00.123", "2017-03-10 11:35:00.1", "2017-03-10 12:35:00.123", "2017-03-10", "2017-03-11"]', + '$[*].timestamp_tz(2) ? (@ >= "2017-03-10 12:35:00.123 +1".timestamp_tz(2))'); + + -- overflow during comparison select jsonb_path_query('"1000000-01-01"', '$.datetime() > "2020-01-01 12:00:00".datetime()'::jsonpath); diff --git a/src/test/regress/sql/jsonpath.sql b/src/test/regress/sql/jsonpath.sql index 56e0bef57fd3d..61a5270d4e8b0 100644 --- a/src/test/regress/sql/jsonpath.sql +++ b/src/test/regress/sql/jsonpath.sql @@ -73,6 +73,19 @@ select '$.double().floor().ceiling().abs()'::jsonpath; select '$.keyvalue().key'::jsonpath; select '$.datetime()'::jsonpath; select '$.datetime("datetime template")'::jsonpath; +select '$.bigint().integer().number().decimal()'::jsonpath; +select '$.boolean()'::jsonpath; +select '$.date()'::jsonpath; +select '$.decimal(4,2)'::jsonpath; +select '$.string()'::jsonpath; +select '$.time()'::jsonpath; +select '$.time(6)'::jsonpath; +select '$.time_tz()'::jsonpath; +select '$.time_tz(4)'::jsonpath; +select '$.timestamp()'::jsonpath; +select '$.timestamp(2)'::jsonpath; +select '$.timestamp_tz()'::jsonpath; +select '$.timestamp_tz(0)'::jsonpath; select '$ ? (@ starts with "abc")'::jsonpath; select '$ ? (@ starts with $var)'::jsonpath; diff --git a/src/test/regress/sql/largeobject.sql b/src/test/regress/sql/largeobject.sql index 800e4fcc6a2b2..a4aee02e3a4ea 100644 --- a/src/test/regress/sql/largeobject.sql +++ b/src/test/regress/sql/largeobject.sql @@ -9,13 +9,19 @@ -- ensure consistent test output regardless of the default bytea format SET bytea_output TO escape; --- Test ALTER LARGE OBJECT OWNER, GRANT, COMMENT +-- Test ALTER LARGE OBJECT OWNER CREATE ROLE regress_lo_user; SELECT lo_create(42); ALTER LARGE OBJECT 42 OWNER TO regress_lo_user; + +-- Test GRANT, COMMENT as non-superuser +SET SESSION AUTHORIZATION regress_lo_user; + GRANT SELECT ON LARGE OBJECT 42 TO public; COMMENT ON LARGE OBJECT 42 IS 'the ultimate answer'; +RESET SESSION AUTHORIZATION; + -- Test psql's \lo_list et al (we assume no other LOs exist yet) \lo_list \lo_list+ diff --git a/src/test/regress/sql/maintain_every.sql b/src/test/regress/sql/maintain_every.sql new file mode 100644 index 0000000000000..263e97272d596 --- /dev/null +++ b/src/test/regress/sql/maintain_every.sql @@ -0,0 +1,26 @@ +-- Test maintenance commands that visit every eligible relation. Run as a +-- non-superuser, to skip other users' tables. + +CREATE ROLE regress_maintain; +SET ROLE regress_maintain; + +-- Test database-wide ANALYZE ("use_own_xacts" mode) setting relhassubclass=f +-- for non-partitioning inheritance, w/ ON COMMIT DELETE ROWS building an +-- empty index. +CREATE TEMP TABLE past_inh_db_other (); -- need 2 tables for "use_own_xacts" +CREATE TEMP TABLE past_inh_db_parent () ON COMMIT DELETE ROWS; +CREATE TEMP TABLE past_inh_db_child () INHERITS (past_inh_db_parent); +CREATE INDEX ON past_inh_db_parent ((1)); +ANALYZE past_inh_db_parent; +SELECT reltuples, relhassubclass + FROM pg_class WHERE oid = 'past_inh_db_parent'::regclass; +DROP TABLE past_inh_db_child; +SET client_min_messages = error; -- hide WARNINGs for other users' tables +ANALYZE; +RESET client_min_messages; +SELECT reltuples, relhassubclass + FROM pg_class WHERE oid = 'past_inh_db_parent'::regclass; +DROP TABLE past_inh_db_parent, past_inh_db_other; + +RESET ROLE; +DROP ROLE regress_maintain; diff --git a/src/test/regress/sql/matview.sql b/src/test/regress/sql/matview.sql index acc4519d01659..b74ee305e0f6f 100644 --- a/src/test/regress/sql/matview.sql +++ b/src/test/regress/sql/matview.sql @@ -231,6 +231,25 @@ REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_foo; DROP OWNED BY regress_user_mvtest CASCADE; DROP ROLE regress_user_mvtest; +-- Concurrent refresh requires a unique index on the materialized +-- view. Test what happens if it's dropped during the refresh. +SET search_path = mvtest_mvschema, public; +CREATE OR REPLACE FUNCTION mvtest_drop_the_index() + RETURNS bool AS $$ +BEGIN + EXECUTE 'DROP INDEX IF EXISTS mvtest_mvschema.mvtest_drop_idx'; + RETURN true; +END; +$$ LANGUAGE plpgsql; + +CREATE MATERIALIZED VIEW drop_idx_matview AS + SELECT 1 as i WHERE mvtest_drop_the_index(); + +CREATE UNIQUE INDEX mvtest_drop_idx ON drop_idx_matview (i); +REFRESH MATERIALIZED VIEW CONCURRENTLY drop_idx_matview; +DROP MATERIALIZED VIEW drop_idx_matview; -- clean up +RESET search_path; + -- make sure that create WITH NO DATA works via SPI BEGIN; CREATE FUNCTION mvtest_func() diff --git a/src/test/regress/sql/memoize.sql b/src/test/regress/sql/memoize.sql index 29ab1ea62d39e..e00e1a94a8173 100644 --- a/src/test/regress/sql/memoize.sql +++ b/src/test/regress/sql/memoize.sql @@ -57,10 +57,48 @@ LATERAL (SELECT t2.unique1 FROM tenk1 t2 WHERE t1.twenty = t2.unique1 OFFSET 0) t2 WHERE t1.unique1 < 1000; +-- Try with LATERAL joins +SELECT explain_memoize(' +SELECT COUNT(*),AVG(t2.t1two) FROM tenk1 t1 LEFT JOIN +LATERAL ( + SELECT t1.two as t1two, * FROM tenk1 t2 WHERE t2.unique1 < 4 OFFSET 0 +) t2 +ON t1.two = t2.two +WHERE t1.unique1 < 10;', false); + +-- And check we get the expected results. +SELECT COUNT(*),AVG(t2.t1two) FROM tenk1 t1 LEFT JOIN +LATERAL ( + SELECT t1.two as t1two, * FROM tenk1 t2 WHERE t2.unique1 < 4 OFFSET 0 +) t2 +ON t1.two = t2.two +WHERE t1.unique1 < 10; + +SET enable_mergejoin TO off; + +-- Test for varlena datatype with expr evaluation +CREATE TABLE expr_key (x numeric, t text); +INSERT INTO expr_key (x, t) +SELECT d1::numeric, d1::text FROM ( + SELECT round((d / pi())::numeric, 7) AS d1 FROM generate_series(1, 20) AS d +) t; + +-- duplicate rows so we get some cache hits +INSERT INTO expr_key SELECT * FROM expr_key; + +CREATE INDEX expr_key_idx_x_t ON expr_key (x, t); +VACUUM ANALYZE expr_key; + +-- Ensure we get we get a cache miss and hit for each of the 20 distinct values +SELECT explain_memoize(' +SELECT * FROM expr_key t1 INNER JOIN expr_key t2 +ON t1.x = t2.t::numeric AND t1.t::numeric = t2.x;', false); + +DROP TABLE expr_key; + -- Reduce work_mem and hash_mem_multiplier so that we see some cache evictions SET work_mem TO '64kB'; SET hash_mem_multiplier TO 1.0; -SET enable_mergejoin TO off; -- Ensure we get some evictions. We're unable to validate the hits and misses -- here as the number of entries that fit in the cache at once will vary -- between different machines. diff --git a/src/test/regress/sql/merge.sql b/src/test/regress/sql/merge.sql index 4cf6db908b586..556777e4f4b51 100644 --- a/src/test/regress/sql/merge.sql +++ b/src/test/regress/sql/merge.sql @@ -4,6 +4,8 @@ CREATE USER regress_merge_privs; CREATE USER regress_merge_no_privs; +CREATE USER regress_merge_none; + DROP TABLE IF EXISTS target; DROP TABLE IF EXISTS source; CREATE TABLE target (tid integer, balance integer) @@ -51,6 +53,12 @@ USING source AS s ON t.tid = s.sid WHEN MATCHED THEN INSERT DEFAULT VALUES; +-- NOT MATCHED BY SOURCE/INSERT error +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED BY SOURCE THEN + INSERT DEFAULT VALUES; -- incorrectly specifying INTO target MERGE INTO target t USING source AS s @@ -75,6 +83,12 @@ USING source AS s ON t.tid = s.sid WHEN NOT MATCHED THEN UPDATE SET balance = 0; +-- NOT MATCHED BY TARGET/UPDATE +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED BY TARGET THEN + UPDATE SET balance = 0; -- UPDATE tablename MERGE INTO target t USING source AS s @@ -86,27 +100,18 @@ MERGE INTO target USING target ON tid = tid WHEN MATCHED THEN DO NOTHING; --- used in a CTE +-- used in a CTE without RETURNING WITH foo AS ( MERGE INTO target USING source ON (true) WHEN MATCHED THEN DELETE ) SELECT * FROM foo; --- used in COPY +-- used in COPY without RETURNING COPY ( MERGE INTO target USING source ON (true) WHEN MATCHED THEN DELETE ) TO stdout; -- unsupported relation types --- view -CREATE VIEW tv AS SELECT * FROM target; -MERGE INTO tv t -USING source s -ON t.tid = s.sid -WHEN NOT MATCHED THEN - INSERT DEFAULT VALUES; -DROP VIEW tv; - -- materialized view CREATE MATERIALIZED VIEW mv AS SELECT * FROM target; MERGE INTO mv t @@ -118,6 +123,14 @@ DROP MATERIALIZED VIEW mv; -- permissions +SET SESSION AUTHORIZATION regress_merge_none; +MERGE INTO target +USING (SELECT 1) +ON true +WHEN MATCHED THEN + DO NOTHING; + +SET SESSION AUTHORIZATION regress_merge_privs; MERGE INTO target USING source2 ON target.tid = source2.sid @@ -213,6 +226,19 @@ WHEN NOT MATCHED THEN SELECT * FROM target ORDER BY tid; ROLLBACK; +-- DELETE/INSERT not matched by source/target +BEGIN; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN NOT MATCHED BY SOURCE THEN + DELETE +WHEN NOT MATCHED BY TARGET THEN + INSERT VALUES (s.sid, s.delta) +RETURNING merge_action(), t.*; +SELECT * FROM target ORDER BY tid; +ROLLBACK; + -- index plans INSERT INTO target SELECT generate_series(1000,2500), 0; ALTER TABLE target ADD PRIMARY KEY (tid); @@ -497,6 +523,17 @@ WHEN NOT MATCHED AND s.balance = 100 THEN INSERT (tid) VALUES (s.sid); SELECT * FROM wq_target; +-- conditions in NOT MATCHED BY SOURCE clause can only refer to target columns +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED BY SOURCE AND s.balance = 100 THEN + DELETE; + +MERGE INTO wq_target t +USING wq_source s ON t.tid = s.sid +WHEN NOT MATCHED BY SOURCE AND t.balance = 100 THEN + DELETE; + -- conditions in MATCHED clause can refer to both source and target SELECT * FROM wq_source; MERGE INTO wq_target t @@ -624,6 +661,26 @@ WHEN NOT MATCHED THEN SELECT * FROM target ORDER BY tid; ROLLBACK; +-- UPSERT with UPDATE/DELETE when not matched by source +BEGIN; +DELETE FROM SOURCE WHERE sid = 2; +MERGE INTO target t +USING source AS s +ON t.tid = s.sid +WHEN MATCHED AND t.balance > s.delta THEN + UPDATE SET balance = t.balance - s.delta +WHEN MATCHED THEN + UPDATE SET balance = 0 +WHEN NOT MATCHED THEN + INSERT VALUES (s.sid, s.delta) +WHEN NOT MATCHED BY SOURCE AND tid = 1 THEN + UPDATE SET balance = 0 +WHEN NOT MATCHED BY SOURCE THEN + DELETE +RETURNING merge_action(), t.*; +SELECT * FROM target ORDER BY tid; +ROLLBACK; + -- Test behavior of triggers that turn UPDATE/DELETE into no-ops create or replace function skip_merge_op() returns trigger language plpgsql as @@ -816,7 +873,7 @@ BEGIN; MERGE INTO sq_target USING v ON tid = sid -WHEN MATCHED AND tid > 2 THEN +WHEN MATCHED AND tid >= 2 THEN UPDATE SET balance = balance + delta WHEN NOT MATCHED THEN INSERT (balance, tid) VALUES (balance + delta, sid) @@ -829,7 +886,7 @@ INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10); MERGE INTO sq_target t USING v ON tid = sid -WHEN MATCHED AND tid > 2 THEN +WHEN MATCHED AND tid >= 2 THEN UPDATE SET balance = t.balance + delta WHEN NOT MATCHED THEN INSERT (balance, tid) VALUES (balance + delta, sid) @@ -847,7 +904,7 @@ WITH targq AS ( MERGE INTO sq_target t USING v ON tid = sid -WHEN MATCHED AND tid > 2 THEN +WHEN MATCHED AND tid >= 2 THEN UPDATE SET balance = t.balance + delta WHEN NOT MATCHED THEN INSERT (balance, tid) VALUES (balance + delta, sid) @@ -856,18 +913,149 @@ WHEN MATCHED AND tid < 2 THEN ROLLBACK; -- RETURNING +SELECT * FROM sq_source ORDER BY sid; +SELECT * FROM sq_target ORDER BY tid; + BEGIN; -INSERT INTO sq_source (sid, balance, delta) VALUES (-1, -1, -10); +CREATE TABLE merge_actions(action text, abbrev text); +INSERT INTO merge_actions VALUES ('INSERT', 'ins'), ('UPDATE', 'upd'), ('DELETE', 'del'); MERGE INTO sq_target t -USING v +USING sq_source s ON tid = sid -WHEN MATCHED AND tid > 2 THEN +WHEN MATCHED AND tid >= 2 THEN UPDATE SET balance = t.balance + delta WHEN NOT MATCHED THEN - INSERT (balance, tid) VALUES (balance + delta, sid) + INSERT (balance, tid) VALUES (balance + delta, sid) WHEN MATCHED AND tid < 2 THEN - DELETE -RETURNING *; + DELETE +RETURNING (SELECT abbrev FROM merge_actions + WHERE action = merge_action()) AS action, + t.*, + CASE merge_action() + WHEN 'INSERT' THEN 'Inserted '||t + WHEN 'UPDATE' THEN 'Added '||delta||' to balance' + WHEN 'DELETE' THEN 'Removed '||t + END AS description; +ROLLBACK; + +-- error when using merge_action() outside MERGE +SELECT merge_action() FROM sq_target; +UPDATE sq_target SET balance = balance + 1 RETURNING merge_action(); + +-- RETURNING in CTEs +CREATE TABLE sq_target_merge_log (tid integer NOT NULL, last_change text); +INSERT INTO sq_target_merge_log VALUES (1, 'Original value'); +BEGIN; +WITH m AS ( + MERGE INTO sq_target t + USING sq_source s + ON tid = sid + WHEN MATCHED AND tid >= 2 THEN + UPDATE SET balance = t.balance + delta + WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) + WHEN MATCHED AND tid < 2 THEN + DELETE + RETURNING merge_action() AS action, t.*, + CASE merge_action() + WHEN 'INSERT' THEN 'Inserted '||t + WHEN 'UPDATE' THEN 'Added '||delta||' to balance' + WHEN 'DELETE' THEN 'Removed '||t + END AS description +), m2 AS ( + MERGE INTO sq_target_merge_log l + USING m + ON l.tid = m.tid + WHEN MATCHED THEN + UPDATE SET last_change = description + WHEN NOT MATCHED THEN + INSERT VALUES (m.tid, description) + RETURNING action, merge_action() AS log_action, l.* +) +SELECT * FROM m2; +SELECT * FROM sq_target_merge_log ORDER BY tid; +ROLLBACK; + +-- COPY (MERGE ... RETURNING) TO ... +BEGIN; +COPY ( + MERGE INTO sq_target t + USING sq_source s + ON tid = sid + WHEN MATCHED AND tid >= 2 THEN + UPDATE SET balance = t.balance + delta + WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) + WHEN MATCHED AND tid < 2 THEN + DELETE + RETURNING merge_action(), t.* +) TO stdout; +ROLLBACK; + +-- SQL function with MERGE ... RETURNING +BEGIN; +CREATE FUNCTION merge_into_sq_target(sid int, balance int, delta int, + OUT action text, OUT tid int, OUT new_balance int) +LANGUAGE sql AS +$$ + MERGE INTO sq_target t + USING (VALUES ($1, $2, $3)) AS v(sid, balance, delta) + ON tid = v.sid + WHEN MATCHED AND tid >= 2 THEN + UPDATE SET balance = t.balance + v.delta + WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (v.balance + v.delta, v.sid) + WHEN MATCHED AND tid < 2 THEN + DELETE + RETURNING merge_action(), t.*; +$$; +SELECT m.* +FROM (VALUES (1, 0, 0), (3, 0, 20), (4, 100, 10)) AS v(sid, balance, delta), +LATERAL (SELECT action, tid, new_balance FROM merge_into_sq_target(sid, balance, delta)) m; +ROLLBACK; + +-- SQL SRF with MERGE ... RETURNING +BEGIN; +CREATE FUNCTION merge_sq_source_into_sq_target() +RETURNS TABLE (action text, tid int, balance int) +LANGUAGE sql AS +$$ + MERGE INTO sq_target t + USING sq_source s + ON tid = sid + WHEN MATCHED AND tid >= 2 THEN + UPDATE SET balance = t.balance + delta + WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (balance + delta, sid) + WHEN MATCHED AND tid < 2 THEN + DELETE + RETURNING merge_action(), t.*; +$$; +SELECT * FROM merge_sq_source_into_sq_target(); +ROLLBACK; + +-- PL/pgSQL function with MERGE ... RETURNING ... INTO +BEGIN; +CREATE FUNCTION merge_into_sq_target(sid int, balance int, delta int, + OUT r_action text, OUT r_tid int, OUT r_balance int) +LANGUAGE plpgsql AS +$$ +BEGIN + MERGE INTO sq_target t + USING (VALUES ($1, $2, $3)) AS v(sid, balance, delta) + ON tid = v.sid + WHEN MATCHED AND tid >= 2 THEN + UPDATE SET balance = t.balance + v.delta + WHEN NOT MATCHED THEN + INSERT (balance, tid) VALUES (v.balance + v.delta, v.sid) + WHEN MATCHED AND tid < 2 THEN + DELETE + RETURNING merge_action(), t.* INTO r_action, r_tid, r_balance; +END; +$$; +SELECT m.* +FROM (VALUES (1, 0, 0), (3, 0, 20), (4, 100, 10)) AS v(sid, balance, delta), +LATERAL (SELECT r_action, r_tid, r_balance FROM merge_into_sq_target(sid, balance, delta)) m; ROLLBACK; -- EXPLAIN @@ -929,6 +1117,20 @@ WHEN MATCHED AND t.a >= 30 AND t.a <= 40 THEN WHEN NOT MATCHED AND s.a < 20 THEN INSERT VALUES (a, b)'); +-- not matched by source +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN NOT MATCHED BY SOURCE and t.a < 10 THEN + DELETE'); + +-- not matched by source and target +SELECT explain_merge(' +MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a +WHEN NOT MATCHED BY SOURCE AND t.a < 10 THEN + DELETE +WHEN NOT MATCHED BY TARGET AND s.a < 20 THEN + INSERT VALUES (a, b)'); + -- nothing SELECT explain_merge(' MERGE INTO ex_mtarget t USING ex_msource s ON t.a = s.a AND t.a < -1000 @@ -938,6 +1140,23 @@ WHEN MATCHED AND t.a < 10 THEN DROP TABLE ex_msource, ex_mtarget; DROP FUNCTION explain_merge(text); +-- EXPLAIN SubPlans and InitPlans +CREATE TABLE src (a int, b int, c int, d int); +CREATE TABLE tgt (a int, b int, c int, d int); +CREATE TABLE ref (ab int, cd int); + +EXPLAIN (verbose, costs off) +MERGE INTO tgt t +USING (SELECT *, (SELECT count(*) FROM ref r + WHERE r.ab = s.a + s.b + AND r.cd = s.c - s.d) cnt + FROM src s) s +ON t.a = s.a AND t.b < s.cnt +WHEN MATCHED AND t.c > s.cnt THEN + UPDATE SET (b, c) = (SELECT s.b, s.cnt); + +DROP TABLE src, tgt, ref; + -- Subqueries BEGIN; MERGE INTO sq_target t @@ -966,7 +1185,7 @@ WHEN MATCHED THEN SELECT * FROM sq_target WHERE tid = 1; ROLLBACK; -DROP TABLE sq_target, sq_source CASCADE; +DROP TABLE sq_target, sq_target_merge_log, sq_source CASCADE; CREATE TABLE pa_target (tid integer, balance float, val text) PARTITION BY LIST (tid); @@ -984,7 +1203,7 @@ CREATE TABLE pa_source (sid integer, delta float); -- insert many rows to the source table INSERT INTO pa_source SELECT id, id * 10 FROM generate_series(1,14) AS id; -- insert a few rows in the target table (odd numbered tid) -INSERT INTO pa_target SELECT id, id * 100, 'initial' FROM generate_series(1,14,2) AS id; +INSERT INTO pa_target SELECT id, id * 100, 'initial' FROM generate_series(1,15,2) AS id; -- try simple MERGE BEGIN; @@ -994,8 +1213,10 @@ MERGE INTO pa_target t WHEN MATCHED THEN UPDATE SET balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (sid, delta, 'inserted by merge'); -SELECT * FROM pa_target ORDER BY tid; + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET val = val || ' not matched by source'; +SELECT * FROM pa_target ORDER BY tid, val; ROLLBACK; -- same with a constant qual @@ -1006,8 +1227,10 @@ MERGE INTO pa_target t WHEN MATCHED THEN UPDATE SET balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (sid, delta, 'inserted by merge'); -SELECT * FROM pa_target ORDER BY tid; + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET val = val || ' not matched by source'; +SELECT * FROM pa_target ORDER BY tid, val; ROLLBACK; -- try updating the partition key column @@ -1022,7 +1245,9 @@ MERGE INTO pa_target t WHEN MATCHED THEN UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (sid, delta, 'inserted by merge'); + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET tid = 1, val = val || ' not matched by source'; IF FOUND THEN GET DIAGNOSTICS result := ROW_COUNT; END IF; @@ -1030,9 +1255,33 @@ RETURN result; END; $$; SELECT merge_func(); +SELECT * FROM pa_target ORDER BY tid, val; +ROLLBACK; + +-- update partition key to partition not initially scanned +BEGIN; +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid AND t.tid = 1 + WHEN MATCHED THEN + UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' + RETURNING merge_action(), t.*; SELECT * FROM pa_target ORDER BY tid; ROLLBACK; +-- bug #18871: ExecInitPartitionInfo()'s handling of DO NOTHING actions +BEGIN; +TRUNCATE pa_target; +MERGE INTO pa_target t + USING (VALUES (10, 100)) AS s(sid, delta) + ON t.tid = s.sid + WHEN NOT MATCHED THEN + INSERT VALUES (1, 10, 'inserted by merge') + WHEN MATCHED THEN + DO NOTHING; +SELECT * FROM pa_target ORDER BY tid, val; +ROLLBACK; + DROP TABLE pa_target CASCADE; -- The target table is partitioned in the same way, but this time by attaching @@ -1056,18 +1305,28 @@ ALTER TABLE pa_target ATTACH PARTITION part3 FOR VALUES IN (3,8,9); ALTER TABLE pa_target ATTACH PARTITION part4 DEFAULT; -- insert a few rows in the target table (odd numbered tid) -INSERT INTO pa_target SELECT id, id * 100, 'initial' FROM generate_series(1,14,2) AS id; +INSERT INTO pa_target SELECT id, id * 100, 'initial' FROM generate_series(1,15,2) AS id; -- try simple MERGE BEGIN; +DO $$ +DECLARE + result integer; +BEGIN MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid WHEN MATCHED THEN UPDATE SET balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (sid, delta, 'inserted by merge'); -SELECT * FROM pa_target ORDER BY tid; + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET val = val || ' not matched by source'; +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +SELECT * FROM pa_target ORDER BY tid, val; ROLLBACK; -- same with a constant qual @@ -1079,20 +1338,84 @@ MERGE INTO pa_target t WHEN MATCHED THEN UPDATE SET balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (sid, delta, 'inserted by merge'); -SELECT * FROM pa_target ORDER BY tid; + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET val = val || ' not matched by source'; +SELECT * FROM pa_target ORDER BY tid, val; ROLLBACK; -- try updating the partition key column BEGIN; +DO $$ +DECLARE + result integer; +BEGIN MERGE INTO pa_target t USING pa_source s ON t.tid = s.sid WHEN MATCHED THEN UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (sid, delta, 'inserted by merge'); -SELECT * FROM pa_target ORDER BY tid; + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET tid = 1, val = val || ' not matched by source'; +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +SELECT * FROM pa_target ORDER BY tid, val; +ROLLBACK; + +-- as above, but blocked by BEFORE DELETE ROW trigger +BEGIN; +CREATE FUNCTION trig_fn() RETURNS trigger LANGUAGE plpgsql AS + $$ BEGIN RETURN NULL; END; $$; +CREATE TRIGGER del_trig BEFORE DELETE ON pa_target + FOR EACH ROW EXECUTE PROCEDURE trig_fn(); +DO $$ +DECLARE + result integer; +BEGIN +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET val = val || ' not matched by source'; +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +SELECT * FROM pa_target ORDER BY tid, val; +ROLLBACK; + +-- as above, but blocked by BEFORE INSERT ROW trigger +BEGIN; +CREATE FUNCTION trig_fn() RETURNS trigger LANGUAGE plpgsql AS + $$ BEGIN RETURN NULL; END; $$; +CREATE TRIGGER ins_trig BEFORE INSERT ON pa_target + FOR EACH ROW EXECUTE PROCEDURE trig_fn(); +DO $$ +DECLARE + result integer; +BEGIN +MERGE INTO pa_target t + USING pa_source s + ON t.tid = s.sid + WHEN MATCHED THEN + UPDATE SET tid = tid + 1, balance = balance + delta, val = val || ' updated by merge' + WHEN NOT MATCHED THEN + INSERT VALUES (sid, delta, 'inserted by merge') + WHEN NOT MATCHED BY SOURCE THEN + UPDATE SET val = val || ' not matched by source'; +GET DIAGNOSTICS result := ROW_COUNT; +RAISE NOTICE 'ROW_COUNT = %', result; +END; +$$; +SELECT * FROM pa_target ORDER BY tid, val; ROLLBACK; -- test RLS enforcement @@ -1145,7 +1468,8 @@ MERGE INTO pa_target t WHEN MATCHED THEN UPDATE SET balance = balance + delta, val = val || ' updated by merge' WHEN NOT MATCHED THEN - INSERT VALUES (slogts::timestamp, sid, delta, 'inserted by merge'); + INSERT VALUES (slogts::timestamp, sid, delta, 'inserted by merge') + RETURNING merge_action(), t.*; SELECT * FROM pa_target ORDER BY tid; ROLLBACK; @@ -1399,11 +1723,68 @@ SELECT * FROM new_measurement ORDER BY city_id, logdate; DROP TABLE measurement, new_measurement CASCADE; DROP FUNCTION measurement_insert_trigger(); +-- +-- test non-strict join clause +-- +CREATE TABLE src (a int, b text); +INSERT INTO src VALUES (1, 'src row'); + +CREATE TABLE tgt (a int, b text); +INSERT INTO tgt VALUES (NULL, 'tgt row'); + +MERGE INTO tgt USING src ON tgt.a IS NOT DISTINCT FROM src.a + WHEN MATCHED THEN UPDATE SET a = src.a, b = src.b + WHEN NOT MATCHED BY SOURCE THEN DELETE + RETURNING merge_action(), src.*, tgt.*; + +SELECT * FROM tgt; + +DROP TABLE src, tgt; + +-- +-- test for bug #18634 (wrong varnullingrels error) +-- +CREATE TABLE bug18634t (a int, b int, c text); +INSERT INTO bug18634t VALUES(1, 10, 'tgt1'), (2, 20, 'tgt2'); +CREATE VIEW bug18634v AS + SELECT * FROM bug18634t WHERE EXISTS (SELECT 1 FROM bug18634t); + +CREATE TABLE bug18634s (a int, b int, c text); +INSERT INTO bug18634s VALUES (1, 2, 'src1'); + +MERGE INTO bug18634v t USING bug18634s s ON s.a = t.a + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED BY SOURCE THEN DELETE + RETURNING merge_action(), s.c, t.*; + +SELECT * FROM bug18634t; + +DROP TABLE bug18634t CASCADE; +DROP TABLE bug18634s; + -- prepare RESET SESSION AUTHORIZATION; + +-- try a system catalog +MERGE INTO pg_class c +USING (SELECT 'pg_depend'::regclass AS oid) AS j +ON j.oid = c.oid +WHEN MATCHED THEN + UPDATE SET reltuples = reltuples + 1 +RETURNING j.oid; + +CREATE VIEW classv AS SELECT * FROM pg_class; +MERGE INTO classv c +USING pg_namespace n +ON n.oid = c.relnamespace +WHEN MATCHED AND c.oid = 'pg_depend'::regclass THEN + UPDATE SET reltuples = reltuples - 1 +RETURNING c.oid; + DROP TABLE target, target2; DROP TABLE source, source2; DROP FUNCTION merge_trigfunc(); DROP USER regress_merge_privs; DROP USER regress_merge_no_privs; +DROP USER regress_merge_none; diff --git a/src/test/regress/sql/misc_functions.sql b/src/test/regress/sql/misc_functions.sql index b57f01f3e9591..76470fcb3f6f4 100644 --- a/src/test/regress/sql/misc_functions.sql +++ b/src/test/regress/sql/misc_functions.sql @@ -230,10 +230,46 @@ SELECT count(*) > 0 AS ok FROM pg_control_init(); SELECT count(*) > 0 AS ok FROM pg_control_recovery(); SELECT count(*) > 0 AS ok FROM pg_control_system(); --- pg_split_walfile_name +-- pg_split_walfile_name, pg_walfile_name & pg_walfile_name_offset SELECT * FROM pg_split_walfile_name(NULL); SELECT * FROM pg_split_walfile_name('invalid'); SELECT segment_number > 0 AS ok_segment_number, timeline_id FROM pg_split_walfile_name('000000010000000100000000'); SELECT segment_number > 0 AS ok_segment_number, timeline_id FROM pg_split_walfile_name('ffffffFF00000001000000af'); +SELECT setting::int8 AS segment_size +FROM pg_settings +WHERE name = 'wal_segment_size' +\gset +SELECT segment_number, file_offset +FROM pg_walfile_name_offset('0/0'::pg_lsn + :segment_size), + pg_split_walfile_name(file_name); +SELECT segment_number, file_offset +FROM pg_walfile_name_offset('0/0'::pg_lsn + :segment_size + 1), + pg_split_walfile_name(file_name); +SELECT segment_number, file_offset = :segment_size - 1 +FROM pg_walfile_name_offset('0/0'::pg_lsn + :segment_size - 1), + pg_split_walfile_name(file_name); + +-- pg_current_logfile +CREATE ROLE regress_current_logfile; +-- not available by default +SELECT has_function_privilege('regress_current_logfile', + 'pg_current_logfile()', 'EXECUTE'); +GRANT pg_monitor TO regress_current_logfile; +-- role has privileges of pg_monitor and can execute the function +SELECT has_function_privilege('regress_current_logfile', + 'pg_current_logfile()', 'EXECUTE'); +DROP ROLE regress_current_logfile; + +-- pg_column_toast_chunk_id +CREATE TABLE test_chunk_id (a TEXT, b TEXT STORAGE EXTERNAL); +INSERT INTO test_chunk_id VALUES ('x', repeat('x', 8192)); +SELECT t.relname AS toastrel FROM pg_class c + LEFT JOIN pg_class t ON c.reltoastrelid = t.oid + WHERE c.relname = 'test_chunk_id' +\gset +SELECT pg_column_toast_chunk_id(a) IS NULL, + pg_column_toast_chunk_id(b) IN (SELECT chunk_id FROM pg_toast.:toastrel) + FROM test_chunk_id; +DROP TABLE test_chunk_id; diff --git a/src/test/regress/sql/misc_sanity.sql b/src/test/regress/sql/misc_sanity.sql index 2c0f87a651f1e..cda760bd5ef99 100644 --- a/src/test/regress/sql/misc_sanity.sql +++ b/src/test/regress/sql/misc_sanity.sql @@ -30,7 +30,7 @@ SELECT * FROM pg_shdepend as d1 WHERE refclassid = 0 OR refobjid = 0 OR classid = 0 OR objid = 0 OR - deptype NOT IN ('a', 'o', 'r', 't'); + deptype NOT IN ('a', 'i', 'o', 'r', 't'); -- **************** pg_class **************** diff --git a/src/test/regress/sql/money.sql b/src/test/regress/sql/money.sql index 81c92dd960f4c..b888ec21c30c7 100644 --- a/src/test/regress/sql/money.sql +++ b/src/test/regress/sql/money.sql @@ -135,3 +135,14 @@ SELECT '12345678901234567'::money::numeric; SELECT '-12345678901234567'::money::numeric; SELECT '92233720368547758.07'::money::numeric; SELECT '-92233720368547758.08'::money::numeric; + +-- overflow checks +SELECT '92233720368547758.07'::money + '0.01'::money; +SELECT '-92233720368547758.08'::money - '0.01'::money; +SELECT '92233720368547758.07'::money * 2::float8; +SELECT '-1'::money / 1.175494e-38::float4; +SELECT '92233720368547758.07'::money * 2::int4; +SELECT '1'::money / 0::int2; +SELECT '42'::money * 'inf'::float8; +SELECT '42'::money * '-inf'::float8; +SELECT '42'::money * 'nan'::float4; diff --git a/src/test/regress/sql/multirangetypes.sql b/src/test/regress/sql/multirangetypes.sql index fefb4b4d422d3..41d5524285a39 100644 --- a/src/test/regress/sql/multirangetypes.sql +++ b/src/test/regress/sql/multirangetypes.sql @@ -700,6 +700,27 @@ select _textrange1(textrange2('a','z')) @> 'b'::text; drop type textrange1; drop type textrange2; +-- +-- Multiranges don't have their own ownership or permissions. +-- +create type textrange1 as range(subtype=text, multirange_type_name=multitextrange1, collation="C"); +create role regress_multirange_owner; + +alter type multitextrange1 owner to regress_multirange_owner; -- fail +alter type textrange1 owner to regress_multirange_owner; +set role regress_multirange_owner; +revoke usage on type multitextrange1 from public; -- fail +revoke usage on type textrange1 from public; +\dT+ *textrange1* +create temp table test1(f1 multitextrange1[]); +revoke usage on type textrange1 from regress_multirange_owner; +create temp table test2(f1 multitextrange1[]); -- fail + +drop table test1; +drop type textrange1; +reset role; +drop role regress_multirange_owner; + -- -- Test polymorphic type system -- @@ -802,7 +823,7 @@ drop type two_ints cascade; set enable_sort = off; -- try to make it pick a hash setop implementation -select '{(2,5)}'::cashmultirange except select '{(5,6)}'::cashmultirange; +select '{(01,10)}'::varbitmultirange except select '{(10,11)}'::varbitmultirange; reset enable_sort; diff --git a/src/test/regress/sql/namespace.sql b/src/test/regress/sql/namespace.sql index 3474f5ecf4215..306cdc2d8c6a1 100644 --- a/src/test/regress/sql/namespace.sql +++ b/src/test/regress/sql/namespace.sql @@ -66,3 +66,35 @@ DROP SCHEMA test_ns_schema_renamed CASCADE; -- verify that the objects were dropped SELECT COUNT(*) FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'test_ns_schema_renamed'); + +-- +-- Verify that search_path is set to a safe value during maintenance +-- commands. +-- + +CREATE SCHEMA test_maint_search_path; +SET search_path = test_maint_search_path; + +CREATE FUNCTION fn(INT) RETURNS INT IMMUTABLE LANGUAGE plpgsql AS $$ + BEGIN + RAISE NOTICE 'current search_path: %', current_setting('search_path'); + RETURN $1; + END; +$$; + +CREATE TABLE test_maint(i INT); +INSERT INTO test_maint VALUES (1), (2); +CREATE MATERIALIZED VIEW test_maint_mv AS SELECT fn(i) FROM test_maint; + +-- the following commands should see search_path as pg_catalog, pg_temp + +CREATE INDEX test_maint_idx ON test_maint_search_path.test_maint (fn(i)); +REINDEX TABLE test_maint_search_path.test_maint; +ANALYZE test_maint_search_path.test_maint; +VACUUM FULL test_maint_search_path.test_maint; +CLUSTER test_maint_search_path.test_maint USING test_maint_idx; +REFRESH MATERIALIZED VIEW test_maint_search_path.test_maint_mv; + +RESET search_path; + +DROP SCHEMA test_maint_search_path CASCADE; diff --git a/src/test/regress/sql/numeric.sql b/src/test/regress/sql/numeric.sql index 83fc386333be6..c86395209ab0c 100644 --- a/src/test/regress/sql/numeric.sql +++ b/src/test/regress/sql/numeric.sql @@ -833,6 +833,31 @@ SELECT i as pow, round((2.5 * 10 ^ i)::numeric, -i) FROM generate_series(-5,5) AS t(i); +-- Check limits of rounding before the decimal point +SELECT round(4.4e131071, -131071) = 4e131071; +SELECT round(4.5e131071, -131071) = 5e131071; +SELECT round(4.5e131071, -131072); -- loses all digits +SELECT round(5.5e131071, -131072); -- rounds up and overflows +SELECT round(5.5e131071, -131073); -- loses all digits +SELECT round(5.5e131071, -1000000); -- loses all digits + +-- Check limits of rounding after the decimal point +SELECT round(5e-16383, 1000000) = 5e-16383; +SELECT round(5e-16383, 16383) = 5e-16383; +SELECT round(5e-16383, 16382) = 1e-16382; +SELECT round(5e-16383, 16381) = 0; + +-- Check limits of trunc() before the decimal point +SELECT trunc(9.9e131071, -131071) = 9e131071; +SELECT trunc(9.9e131071, -131072); -- loses all digits +SELECT trunc(9.9e131071, -131073); -- loses all digits +SELECT trunc(9.9e131071, -1000000); -- loses all digits + +-- Check limits of trunc() after the decimal point +SELECT trunc(5e-16383, 1000000) = 5e-16383; +SELECT trunc(5e-16383, 16383) = 5e-16383; +SELECT trunc(5e-16383, 16382) = 0; + -- Testing for width_bucket(). For convenience, we test both the -- numeric and float8 versions of the function in this file. diff --git a/src/test/regress/sql/numerology.sql b/src/test/regress/sql/numerology.sql index 1941c58e681f4..372e7bf9bc87e 100644 --- a/src/test/regress/sql/numerology.sql +++ b/src/test/regress/sql/numerology.sql @@ -77,6 +77,15 @@ SELECT 1_000.; SELECT .000_005; SELECT 1_000.5e0_1; +DO $$ +DECLARE + i int; +BEGIN + FOR i IN 1_001..1_003 LOOP + RAISE NOTICE 'i = %', i; + END LOOP; +END $$; + -- error cases SELECT _100; SELECT 100_; @@ -88,6 +97,7 @@ SELECT 1_000._5; SELECT 1_000.5_; SELECT 1_000.5e_1; +PREPARE p1 AS SELECT $0_1; -- -- Test implicit type conversions diff --git a/src/test/regress/sql/opr_sanity.sql b/src/test/regress/sql/opr_sanity.sql index e2d2c70d70679..2fe7b6dcc4986 100644 --- a/src/test/regress/sql/opr_sanity.sql +++ b/src/test/regress/sql/opr_sanity.sql @@ -1223,7 +1223,7 @@ WHERE p1.oid = a1.amhandler AND a1.amtype = 'i' AND SELECT a1.oid, a1.amname, p1.oid, p1.proname FROM pg_am AS a1, pg_proc AS p1 -WHERE p1.oid = a1.amhandler AND a1.amtype = 's' AND +WHERE p1.oid = a1.amhandler AND a1.amtype = 't' AND (p1.prorettype != 'table_am_handler'::regtype OR p1.proretset OR p1.pronargs != 1 diff --git a/src/test/regress/sql/partition_join.sql b/src/test/regress/sql/partition_join.sql index 9e16f1ca550fa..afadefd50fd20 100644 --- a/src/test/regress/sql/partition_join.sql +++ b/src/test/regress/sql/partition_join.sql @@ -34,6 +34,15 @@ EXPLAIN (COSTS OFF) SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.b = 0 ORDER BY t1.a, t2.b; SELECT t1.a, t1.c, t2.b, t2.c FROM prt1 t1, prt2 t2 WHERE t1.a = t2.b AND t1.b = 0 ORDER BY t1.a, t2.b; +-- left outer join, 3-way +EXPLAIN (COSTS OFF) +SELECT COUNT(*) FROM prt1 t1 + LEFT JOIN prt1 t2 ON t1.a = t2.a + LEFT JOIN prt1 t3 ON t2.a = t3.a; +SELECT COUNT(*) FROM prt1 t1 + LEFT JOIN prt1 t2 ON t1.a = t2.a + LEFT JOIN prt1 t3 ON t2.a = t3.a; + -- left outer join, with whole-row reference; partitionwise join does not apply EXPLAIN (COSTS OFF) SELECT t1, t2 FROM prt1 t1 LEFT JOIN prt2 t2 ON t1.a = t2.b WHERE t1.b = 0 ORDER BY t1.a, t2.b; @@ -91,6 +100,29 @@ SELECT t1.a, ss.t2a, ss.t2c FROM prt1 t1 LEFT JOIN LATERAL (SELECT t2.a AS t2a, t3.a AS t3a, t2.b t2b, t2.c t2c, least(t1.a,t2.a,t3.a) FROM prt1 t2 JOIN prt2 t3 ON (t2.a = t3.b)) ss ON t1.c = ss.t2c WHERE (t1.b + coalesce(ss.t2b, 0)) = 0 ORDER BY t1.a; +-- lateral reference in sample scan +EXPLAIN (COSTS OFF) +SELECT * FROM prt1 t1 JOIN LATERAL + (SELECT * FROM prt1 t2 TABLESAMPLE SYSTEM (t1.a) REPEATABLE(t1.b)) s + ON t1.a = s.a; + +-- lateral reference in scan's restriction clauses +EXPLAIN (COSTS OFF) +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.a; +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.a; + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.b; +SELECT count(*) FROM prt1 t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2 t2) s + ON t1.a = s.b WHERE s.t1b = s.b; + -- bug with inadequate sort key representation SET enable_partitionwise_aggregate TO true; SET enable_hashjoin TO false; @@ -106,6 +138,10 @@ SELECT a, b FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) RESET enable_partitionwise_aggregate; RESET enable_hashjoin; +-- bug in freeing the SpecialJoinInfo of a child-join +EXPLAIN (COSTS OFF) +SELECT * FROM prt1 t1 JOIN prt1 t2 ON t1.a = t2.a WHERE t1.a IN (SELECT a FROM prt1 t3); + -- -- partitioned by expression -- @@ -378,6 +414,23 @@ SELECT * FROM prt1_l t1 LEFT JOIN LATERAL (SELECT t2.a AS t2a, t2.c AS t2c, t2.b AS t2b, t3.b AS t3b, least(t1.a,t2.a,t3.b) FROM prt1_l t2 JOIN prt2_l t3 ON (t2.a = t3.b AND t2.c = t3.c)) ss ON t1.a = ss.t2a AND t1.c = ss.t2c WHERE t1.b = 0 ORDER BY t1.a; +-- partitionwise join with lateral reference in sample scan +EXPLAIN (COSTS OFF) +SELECT * FROM prt1_l t1 JOIN LATERAL + (SELECT * FROM prt1_l t2 TABLESAMPLE SYSTEM (t1.a) REPEATABLE(t1.b)) s + ON t1.a = s.a AND t1.b = s.b AND t1.c = s.c; + +-- partitionwise join with lateral reference in scan's restriction clauses +EXPLAIN (COSTS OFF) +SELECT COUNT(*) FROM prt1_l t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2_l t2) s + ON t1.a = s.b AND t1.b = s.a AND t1.c = s.c + WHERE s.t1b = s.a; +SELECT COUNT(*) FROM prt1_l t1 LEFT JOIN LATERAL + (SELECT t1.b AS t1b, t2.* FROM prt2_l t2) s + ON t1.a = s.b AND t1.b = s.a AND t1.c = s.c + WHERE s.t1b = s.a; + -- join with one side empty EXPLAIN (COSTS OFF) SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1_l WHERE a = 1 AND a = 2) t1 RIGHT JOIN prt2_l t2 ON t1.a = t2.b AND t1.b = t2.a AND t1.c = t2.c; diff --git a/src/test/regress/sql/partition_prune.sql b/src/test/regress/sql/partition_prune.sql index d1c60b8fe9d27..63f1bb5de9b64 100644 --- a/src/test/regress/sql/partition_prune.sql +++ b/src/test/regress/sql/partition_prune.sql @@ -178,6 +178,26 @@ select * from boolpart where a is not true and a is not false; select * from boolpart where a is unknown; select * from boolpart where a is not unknown; +-- try some other permutations with a NULL partition instead of a DEFAULT +delete from boolpart where a is null; +create table boolpart_null partition of boolpart for values in (null); +insert into boolpart values(null); + +explain (costs off) select * from boolpart where a is not true; +explain (costs off) select * from boolpart where a is not true and a is not false; +explain (costs off) select * from boolpart where a is not false; +explain (costs off) select * from boolpart where a is not unknown; + +select * from boolpart where a is not true; +select * from boolpart where a is not true and a is not false; +select * from boolpart where a is not false; +select * from boolpart where a is not unknown; + +-- check that all partitions are pruned when faced with conflicting clauses +explain (costs off) select * from boolpart where a is not unknown and a is unknown; +explain (costs off) select * from boolpart where a is false and a is unknown; +explain (costs off) select * from boolpart where a is true and a is unknown; + -- inverse boolean partitioning - a seemingly unlikely design, but we've got -- code for it, so we'd better test it. create table iboolpart (a bool) partition by list ((not a)); @@ -204,15 +224,32 @@ select * from iboolpart where a is not true and a is not false; select * from iboolpart where a is unknown; select * from iboolpart where a is not unknown; +-- Try some other permutations with a NULL partition instead of a DEFAULT +delete from iboolpart where a is null; +create table iboolpart_null partition of iboolpart for values in (null); +insert into iboolpart values(null); + +-- Pruning shouldn't take place for these. Just check the result is correct +select * from iboolpart where a is not true; +select * from iboolpart where a is not true and a is not false; +select * from iboolpart where a is not false; + create table boolrangep (a bool, b bool, c int) partition by range (a,b,c); create table boolrangep_tf partition of boolrangep for values from ('true', 'false', 0) to ('true', 'false', 100); create table boolrangep_ft partition of boolrangep for values from ('false', 'true', 0) to ('false', 'true', 100); create table boolrangep_ff1 partition of boolrangep for values from ('false', 'false', 0) to ('false', 'false', 50); create table boolrangep_ff2 partition of boolrangep for values from ('false', 'false', 50) to ('false', 'false', 100); +create table boolrangep_null partition of boolrangep default; -- try a more complex case that's been known to trip up pruning in the past explain (costs off) select * from boolrangep where not a and not b and c = 25; +-- ensure we prune boolrangep_tf +explain (costs off) select * from boolrangep where a is not true and not b and c = 25; + +-- ensure we prune everything apart from boolrangep_tf and boolrangep_null +explain (costs off) select * from boolrangep where a is not false and not b and c = 25; + -- test scalar-to-array operators create table coercepart (a varchar) partition by list (a); create table coercepart_ab partition of coercepart for values in ('ab'); @@ -332,12 +369,27 @@ explain (costs off) select * from rparted_by_int2 where a > 100_000_000_000_000; drop table lp, coll_pruning, rlp, mc3p, mc2p, boolpart, iboolpart, boolrangep, rp, coll_pruning_multi, like_op_noprune, lparted_by_int2, rparted_by_int2; +-- check that AlternativeSubPlan within a pruning expression gets cleaned up + +create table asptab (id int primary key) partition by range (id); +create table asptab0 partition of asptab for values from (0) to (1); +create table asptab1 partition of asptab for values from (1) to (2); + +explain (costs off) +select * from + (select exists (select 1 from int4_tbl tinner where f1 = touter.f1) as b + from int4_tbl touter) ss, + asptab +where asptab.id > ss.b::int; + +drop table asptab; + -- -- Test Partition pruning for HASH partitioning -- -- Use hand-rolled hash functions and operator classes to get predictable -- result on different machines. See the definitions of --- part_part_test_int4_ops and part_test_text_ops in insert.sql. +-- part_test_int4_ops and part_test_text_ops in test_setup.sql. -- create table hp (a int, b text, c int) @@ -384,8 +436,6 @@ drop table hp2; explain (costs off) select * from hp where a = 1 and b = 'abcde' and (c = 2 or c = 3); -drop table hp; - -- -- Test runtime partition pruning -- @@ -436,6 +486,25 @@ select a from ab where b between $1 and $2 and a < (select 3); explain (analyze, costs off, summary off, timing off) execute ab_q3 (2, 2); +-- +-- Test runtime pruning with hash partitioned tables +-- + +-- recreate partitions dropped above +create table hp1 partition of hp for values with (modulus 4, remainder 1); +create table hp2 partition of hp for values with (modulus 4, remainder 2); +create table hp3 partition of hp for values with (modulus 4, remainder 3); + +-- Ensure we correctly prune unneeded partitions when there is an IS NULL qual +prepare hp_q1 (text) as +select * from hp where a is null and b = $1; + +explain (costs off) execute hp_q1('xxx'); + +deallocate hp_q1; + +drop table hp; + -- Test a backwards Append scan create table list_part (a int) partition by list (a); create table list_part1 partition of list_part for values in (1); @@ -1182,16 +1251,57 @@ explain (costs off) select * from rp_prefix_test3 where a >= 1 and b >= 1 and b -- that the caller arranges clauses in that prefix in the required order) explain (costs off) select * from rp_prefix_test3 where a >= 1 and b >= 1 and b = 2 and c = 2 and d >= 0; -create table hp_prefix_test (a int, b int, c int, d int) partition by hash (a part_test_int4_ops, b part_test_int4_ops, c part_test_int4_ops, d part_test_int4_ops); -create table hp_prefix_test_p1 partition of hp_prefix_test for values with (modulus 2, remainder 0); -create table hp_prefix_test_p2 partition of hp_prefix_test for values with (modulus 2, remainder 1); - --- Test that get_steps_using_prefix() handles non-NULL step_nullkeys -explain (costs off) select * from hp_prefix_test where a = 1 and b is null and c = 1 and d = 1; - drop table rp_prefix_test1; drop table rp_prefix_test2; drop table rp_prefix_test3; + +-- +-- Test that get_steps_using_prefix() handles IS NULL clauses correctly +-- +create table hp_prefix_test (a int, b int, c int, d int) + partition by hash (a part_test_int4_ops, b part_test_int4_ops, c part_test_int4_ops, d part_test_int4_ops); + +-- create 8 partitions +select 'create table hp_prefix_test_p' || x::text || ' partition of hp_prefix_test for values with (modulus 8, remainder ' || x::text || ');' +from generate_Series(0,7) x; +\gexec + +-- insert 16 rows, one row for each test to perform. +insert into hp_prefix_test +select + case a when 0 then null else 1 end, + case b when 0 then null else 2 end, + case c when 0 then null else 3 end, + case d when 0 then null else 4 end +from + generate_series(0,1) a, + generate_series(0,1) b, + generate_Series(0,1) c, + generate_Series(0,1) d; + +-- Ensure partition pruning works correctly for each combination of IS NULL +-- and equality quals. This may seem a little excessive, but there have been +-- a number of bugs in this area over the years. We make use of row only +-- output to reduce the size of the expected results. +\t on +select + 'explain (costs off) select tableoid::regclass,* from hp_prefix_test where ' || + string_agg(c.colname || case when g.s & (1 << c.colpos) = 0 then ' is null' else ' = ' || (colpos+1)::text end, ' and ' order by c.colpos) +from (values('a',0),('b',1),('c',2),('d',3)) c(colname, colpos), generate_Series(0,15) g(s) +group by g.s +order by g.s; +\gexec + +-- And ensure we get exactly 1 row from each. Again, all 16 possible combinations. +select + 'select tableoid::regclass,* from hp_prefix_test where ' || + string_agg(c.colname || case when g.s & (1 << c.colpos) = 0 then ' is null' else ' = ' || (colpos+1)::text end, ' and ' order by c.colpos) +from (values('a',0),('b',1),('c',2),('d',3)) c(colname, colpos), generate_Series(0,15) g(s) +group by g.s +order by g.s; +\gexec +\t off + drop table hp_prefix_test; -- diff --git a/src/test/regress/sql/password.sql b/src/test/regress/sql/password.sql index 53e86b0b6ce9e..bb82aa4aa244b 100644 --- a/src/test/regress/sql/password.sql +++ b/src/test/regress/sql/password.sql @@ -10,8 +10,10 @@ SET password_encryption = 'scram-sha-256'; -- ok -- consistency of password entries SET password_encryption = 'md5'; -CREATE ROLE regress_passwd1 PASSWORD 'role_pwd1'; -CREATE ROLE regress_passwd2 PASSWORD 'role_pwd2'; +CREATE ROLE regress_passwd1; +ALTER ROLE regress_passwd1 PASSWORD 'role_pwd1'; +CREATE ROLE regress_passwd2; +ALTER ROLE regress_passwd2 PASSWORD 'role_pwd2'; SET password_encryption = 'scram-sha-256'; CREATE ROLE regress_passwd3 PASSWORD 'role_pwd3'; CREATE ROLE regress_passwd4 PASSWORD NULL; diff --git a/src/test/regress/sql/plpgsql.sql b/src/test/regress/sql/plpgsql.sql index 924d524094648..18c91572ae140 100644 --- a/src/test/regress/sql/plpgsql.sql +++ b/src/test/regress/sql/plpgsql.sql @@ -2047,11 +2047,9 @@ begin end $$ language plpgsql; select namedparmcursor_test7(); --- check that line comments work correctly within the argument list (there --- is some special handling of this case in the code: the newline after the --- comment must be preserved when the argument-evaluating query is --- constructed, otherwise the comment effectively comments out the next --- argument, too) +-- check that line comments work correctly within the argument list +-- (this used to require a special hack in the code; it no longer does, +-- but let's keep the test anyway) create function namedparmcursor_test8() returns int4 as $$ declare c1 cursor (p1 int, p2 int) for @@ -3356,7 +3354,7 @@ declare v int := 0; begin return 10 / v; end; -$$ language plpgsql; +$$ language plpgsql parallel safe; create or replace function raise_test() returns void as $$ begin @@ -3417,9 +3415,29 @@ $$ language plpgsql; select stacked_diagnostics_test(); -drop function zero_divide(); drop function stacked_diagnostics_test(); +-- Test that an error recovery subtransaction is parallel safe + +create function error_trap_test() returns text as $$ +begin + perform zero_divide(); + return 'no error detected!'; +exception when division_by_zero then + return 'division_by_zero detected'; +end; +$$ language plpgsql parallel safe; + +set debug_parallel_query to on; + +explain (verbose, costs off) select error_trap_test(); +select error_trap_test(); + +reset debug_parallel_query; + +drop function error_trap_test(); +drop function zero_divide(); + -- check cases where implicit SQLSTATE variable could be confused with -- SQLSTATE as a keyword, cf bug #5524 create or replace function raise_test() returns void as $$ @@ -4734,12 +4752,12 @@ END; $$ LANGUAGE plpgsql; SELECT * FROM get_from_partitioned_table(1) AS t; CREATE OR REPLACE FUNCTION list_partitioned_table() -RETURNS SETOF partitioned_table.a%TYPE AS $$ +RETURNS SETOF public.partitioned_table.a%TYPE AS $$ DECLARE - row partitioned_table%ROWTYPE; - a_val partitioned_table.a%TYPE; + row public.partitioned_table%ROWTYPE; + a_val public.partitioned_table.a%TYPE; BEGIN - FOR row IN SELECT * FROM partitioned_table ORDER BY a LOOP + FOR row IN SELECT * FROM public.partitioned_table ORDER BY a LOOP a_val := row.a; RETURN NEXT a_val; END LOOP; diff --git a/src/test/regress/sql/predicate.sql b/src/test/regress/sql/predicate.sql new file mode 100644 index 0000000000000..9dcb81b1bc52f --- /dev/null +++ b/src/test/regress/sql/predicate.sql @@ -0,0 +1,185 @@ +-- +-- Tests for predicate handling +-- + +-- +-- Test that restrictions that are always true are ignored, and that are always +-- false are replaced with constant-FALSE +-- +-- Currently we only check for NullTest quals and OR clauses that include +-- NullTest quals. We may extend it in the future. +-- +CREATE TABLE pred_tab (a int NOT NULL, b int, c int NOT NULL); + +-- +-- Test restriction clauses +-- + +-- Ensure the IS_NOT_NULL qual is ignored when the column is non-nullable +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.a IS NOT NULL; + +-- Ensure the IS_NOT_NULL qual is not ignored on a nullable column +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.b IS NOT NULL; + +-- Ensure the IS_NULL qual is reduced to constant-FALSE for non-nullable +-- columns +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.a IS NULL; + +-- Ensure the IS_NULL qual is not reduced to constant-FALSE on nullable +-- columns +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.b IS NULL; + +-- +-- Tests for OR clauses in restriction clauses +-- + +-- Ensure the OR clause is ignored when an OR branch is always true +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.a IS NOT NULL OR t.b = 1; + +-- Ensure the OR clause is not ignored for NullTests that can't be proven +-- always true +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.b IS NOT NULL OR t.a = 1; + +-- Ensure the OR clause is reduced to constant-FALSE when all branches are +-- provably false +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.a IS NULL OR t.c IS NULL; + +-- Ensure the OR clause is not reduced to constant-FALSE when not all branches +-- are provably false +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t WHERE t.b IS NULL OR t.c IS NULL; + +-- +-- Test join clauses +-- + +-- Ensure the IS_NOT_NULL qual is ignored, since a) it's on a NOT NULL column, +-- and b) its Var is not nullable by any outer joins +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON t1.a IS NOT NULL; + +-- Ensure the IS_NOT_NULL qual is not ignored when columns are made nullable +-- by an outer join +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + FULL JOIN pred_tab t2 ON t1.a = t2.a + LEFT JOIN pred_tab t3 ON t2.a IS NOT NULL; + +-- Ensure the IS_NULL qual is reduced to constant-FALSE, since a) it's on a NOT +-- NULL column, and b) its Var is not nullable by any outer joins +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON t1.a IS NULL; + +-- Ensure the IS_NULL qual is not reduced to constant-FALSE when the column is +-- nullable by an outer join +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON t1.a = 1 + LEFT JOIN pred_tab t3 ON t2.a IS NULL; + +-- +-- Tests for OR clauses in join clauses +-- + +-- Ensure the OR clause is ignored when an OR branch is provably always true +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON t1.a IS NOT NULL OR t2.b = 1; + +-- Ensure the NullTest is not ignored when the column is nullable by an outer +-- join +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + FULL JOIN pred_tab t2 ON t1.a = t2.a + LEFT JOIN pred_tab t3 ON t2.a IS NOT NULL OR t2.b = 1; + +-- Ensure the OR clause is reduced to constant-FALSE when all OR branches are +-- provably false +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON (t1.a IS NULL OR t1.c IS NULL); + +-- Ensure the OR clause is not reduced to constant-FALSE when a column is +-- made nullable from an outer join +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON t1.a = 1 + LEFT JOIN pred_tab t3 ON t2.a IS NULL OR t2.c IS NULL; + +DROP TABLE pred_tab; + +-- Validate we handle IS NULL and IS NOT NULL quals correctly with inheritance +-- parents. +CREATE TABLE pred_parent (a int); +CREATE TABLE pred_child () INHERITS (pred_parent); +ALTER TABLE ONLY pred_parent ALTER a SET NOT NULL; + +-- Ensure that the scan on pred_child contains the IS NOT NULL qual. +EXPLAIN (COSTS OFF) +SELECT * FROM pred_parent WHERE a IS NOT NULL; + +-- Ensure we only scan pred_child and not pred_parent +EXPLAIN (COSTS OFF) +SELECT * FROM pred_parent WHERE a IS NULL; + +ALTER TABLE pred_parent ALTER a DROP NOT NULL; +ALTER TABLE pred_child ALTER a SET NOT NULL; + +-- Ensure the IS NOT NULL qual is removed from the pred_child scan. +EXPLAIN (COSTS OFF) +SELECT * FROM pred_parent WHERE a IS NOT NULL; + +-- Ensure we only scan pred_parent and not pred_child +EXPLAIN (COSTS OFF) +SELECT * FROM pred_parent WHERE a IS NULL; + +DROP TABLE pred_parent, pred_child; + +-- Validate we do not reduce a clone clause to a constant true or false +CREATE TABLE pred_tab (a int, b int); +CREATE TABLE pred_tab_notnull (a int, b int NOT NULL); + +INSERT INTO pred_tab VALUES (1, 1); +INSERT INTO pred_tab VALUES (2, 2); + +INSERT INTO pred_tab_notnull VALUES (2, 2); +INSERT INTO pred_tab_notnull VALUES (3, 3); + +ANALYZE pred_tab; +ANALYZE pred_tab_notnull; + +-- Ensure the IS_NOT_NULL qual is not reduced to constant true and removed +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON TRUE + LEFT JOIN pred_tab_notnull t3 ON t2.a = t3.a + LEFT JOIN pred_tab t4 ON t3.b IS NOT NULL; + +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON TRUE + LEFT JOIN pred_tab_notnull t3 ON t2.a = t3.a + LEFT JOIN pred_tab t4 ON t3.b IS NOT NULL; + +-- Ensure the IS_NULL qual is not reduced to constant false +EXPLAIN (COSTS OFF) +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON TRUE + LEFT JOIN pred_tab_notnull t3 ON t2.a = t3.a + LEFT JOIN pred_tab t4 ON t3.b IS NULL AND t3.a IS NOT NULL; + +SELECT * FROM pred_tab t1 + LEFT JOIN pred_tab t2 ON TRUE + LEFT JOIN pred_tab_notnull t3 ON t2.a = t3.a + LEFT JOIN pred_tab t4 ON t3.b IS NULL AND t3.a IS NOT NULL; + +DROP TABLE pred_tab; +DROP TABLE pred_tab_notnull; diff --git a/src/test/regress/sql/prepared_xacts.sql b/src/test/regress/sql/prepared_xacts.sql index 2f0bb55bb492c..ade3a2672a80a 100644 --- a/src/test/regress/sql/prepared_xacts.sql +++ b/src/test/regress/sql/prepared_xacts.sql @@ -17,30 +17,30 @@ INSERT INTO pxtest1 VALUES ('aaa'); BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; UPDATE pxtest1 SET foobar = 'bbb' WHERE foobar = 'aaa'; SELECT * FROM pxtest1; -PREPARE TRANSACTION 'foo1'; +PREPARE TRANSACTION 'regress_foo1'; SELECT * FROM pxtest1; -- Test pg_prepared_xacts system view -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; -- Test ROLLBACK PREPARED -ROLLBACK PREPARED 'foo1'; +ROLLBACK PREPARED 'regress_foo1'; SELECT * FROM pxtest1; -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; -- Test COMMIT PREPARED BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; INSERT INTO pxtest1 VALUES ('ddd'); SELECT * FROM pxtest1; -PREPARE TRANSACTION 'foo2'; +PREPARE TRANSACTION 'regress_foo2'; SELECT * FROM pxtest1; -COMMIT PREPARED 'foo2'; +COMMIT PREPARED 'regress_foo2'; SELECT * FROM pxtest1; @@ -48,19 +48,19 @@ SELECT * FROM pxtest1; BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd'; SELECT * FROM pxtest1; -PREPARE TRANSACTION 'foo3'; +PREPARE TRANSACTION 'regress_foo3'; -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; INSERT INTO pxtest1 VALUES ('fff'); -- This should fail, because the gid foo3 is already in use -PREPARE TRANSACTION 'foo3'; +PREPARE TRANSACTION 'regress_foo3'; SELECT * FROM pxtest1; -ROLLBACK PREPARED 'foo3'; +ROLLBACK PREPARED 'regress_foo3'; SELECT * FROM pxtest1; @@ -68,22 +68,22 @@ SELECT * FROM pxtest1; BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; UPDATE pxtest1 SET foobar = 'eee' WHERE foobar = 'ddd'; SELECT * FROM pxtest1; -PREPARE TRANSACTION 'foo4'; +PREPARE TRANSACTION 'regress_foo4'; -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; SELECT * FROM pxtest1; -- This should fail, because the two transactions have a write-skew anomaly INSERT INTO pxtest1 VALUES ('fff'); -PREPARE TRANSACTION 'foo5'; +PREPARE TRANSACTION 'regress_foo5'; -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; -ROLLBACK PREPARED 'foo4'; +ROLLBACK PREPARED 'regress_foo4'; -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; -- Clean up DROP TABLE pxtest1; @@ -92,7 +92,7 @@ DROP TABLE pxtest1; BEGIN; SELECT pg_advisory_lock(1); SELECT pg_advisory_xact_lock_shared(1); -PREPARE TRANSACTION 'foo6'; -- fails +PREPARE TRANSACTION 'regress_foo6'; -- fails -- Test subtransactions BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; @@ -103,7 +103,7 @@ BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; ROLLBACK TO a; SAVEPOINT b; INSERT INTO pxtest2 VALUES (3); -PREPARE TRANSACTION 'regress-one'; +PREPARE TRANSACTION 'regress_sub1'; CREATE TABLE pxtest3(fff int); @@ -116,7 +116,7 @@ BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; DECLARE foo CURSOR FOR SELECT * FROM pxtest4; -- Fetch 1 tuple, keeping the cursor open FETCH 1 FROM foo; -PREPARE TRANSACTION 'regress-two'; +PREPARE TRANSACTION 'regress_sub2'; -- No such cursor FETCH 1 FROM foo; @@ -125,7 +125,7 @@ FETCH 1 FROM foo; SELECT * FROM pxtest2; -- There should be two prepared transactions -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; -- pxtest3 should be locked because of the pending DROP begin; @@ -136,7 +136,7 @@ rollback; \c - -- There should still be two prepared transactions -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; -- pxtest3 should still be locked because of the pending DROP begin; @@ -144,19 +144,19 @@ lock table pxtest3 in access share mode nowait; rollback; -- Commit table creation -COMMIT PREPARED 'regress-one'; +COMMIT PREPARED 'regress_sub1'; \d pxtest2 SELECT * FROM pxtest2; -- There should be one prepared transaction -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; -- Commit table drop -COMMIT PREPARED 'regress-two'; +COMMIT PREPARED 'regress_sub2'; SELECT * FROM pxtest3; -- There should be no prepared transactions -SELECT gid FROM pg_prepared_xacts; +SELECT gid FROM pg_prepared_xacts WHERE gid ~ '^regress_' ORDER BY gid; -- Clean up DROP TABLE pxtest2; diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql index 134809e8cc559..b7e1cb6cdde9f 100644 --- a/src/test/regress/sql/privileges.sql +++ b/src/test/regress/sql/privileges.sql @@ -124,6 +124,39 @@ SET ROLE pg_read_all_stats; -- fail, granted without SET option RESET ROLE; RESET SESSION AUTHORIZATION; + +-- test interaction of SET SESSION AUTHORIZATION and SET ROLE, +-- as well as propagation of these settings to parallel workers +GRANT regress_priv_user9 TO regress_priv_user8; + +SET SESSION AUTHORIZATION regress_priv_user8; +SET ROLE regress_priv_user9; +SET debug_parallel_query = 0; +SELECT session_user, current_role, current_user, current_setting('role') as role; +SET debug_parallel_query = 1; +SELECT session_user, current_role, current_user, current_setting('role') as role; + +BEGIN; +SET SESSION AUTHORIZATION regress_priv_user10; +SET debug_parallel_query = 0; +SELECT session_user, current_role, current_user, current_setting('role') as role; +SET debug_parallel_query = 1; +SELECT session_user, current_role, current_user, current_setting('role') as role; +ROLLBACK; +SET debug_parallel_query = 0; +SELECT session_user, current_role, current_user, current_setting('role') as role; +SET debug_parallel_query = 1; +SELECT session_user, current_role, current_user, current_setting('role') as role; + +RESET SESSION AUTHORIZATION; +-- session_user at this point is installation-dependent +SET debug_parallel_query = 0; +SELECT session_user = current_role as c_r_ok, session_user = current_user as c_u_ok, current_setting('role') as role; +SET debug_parallel_query = 1; +SELECT session_user = current_role as c_r_ok, session_user = current_user as c_u_ok, current_setting('role') as role; + +RESET debug_parallel_query; + REVOKE pg_read_all_settings FROM regress_priv_user8; DROP USER regress_priv_user10; @@ -136,6 +169,9 @@ CREATE GROUP regress_priv_group2 WITH ADMIN regress_priv_user1 USER regress_priv ALTER GROUP regress_priv_group1 ADD USER regress_priv_user4; GRANT regress_priv_group2 TO regress_priv_user2 GRANTED BY regress_priv_user1; +SET SESSION AUTHORIZATION regress_priv_user3; +ALTER GROUP regress_priv_group2 ADD USER regress_priv_user2; -- fail +ALTER GROUP regress_priv_group2 DROP USER regress_priv_user2; -- fail SET SESSION AUTHORIZATION regress_priv_user1; ALTER GROUP regress_priv_group2 ADD USER regress_priv_user2; ALTER GROUP regress_priv_group2 ADD USER regress_priv_user2; -- duplicate @@ -1177,7 +1213,7 @@ SET SESSION AUTHORIZATION regress_sro_user; CREATE FUNCTION unwanted_grant() RETURNS void LANGUAGE sql AS 'GRANT regress_priv_group2 TO regress_sro_user'; CREATE FUNCTION mv_action() RETURNS bool LANGUAGE sql AS - 'DECLARE c CURSOR WITH HOLD FOR SELECT unwanted_grant(); SELECT true'; + 'DECLARE c CURSOR WITH HOLD FOR SELECT public.unwanted_grant(); SELECT true'; -- REFRESH of this MV will queue a GRANT at end of transaction CREATE MATERIALIZED VIEW sro_mv AS SELECT mv_action() WITH NO DATA; REFRESH MATERIALIZED VIEW sro_mv; @@ -1188,12 +1224,12 @@ SET SESSION AUTHORIZATION regress_sro_user; -- INSERT to this table will queue a GRANT at end of transaction CREATE TABLE sro_trojan_table (); CREATE FUNCTION sro_trojan() RETURNS trigger LANGUAGE plpgsql AS - 'BEGIN PERFORM unwanted_grant(); RETURN NULL; END'; + 'BEGIN PERFORM public.unwanted_grant(); RETURN NULL; END'; CREATE CONSTRAINT TRIGGER t AFTER INSERT ON sro_trojan_table INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE sro_trojan(); -- Now, REFRESH will issue such an INSERT, queueing the GRANT CREATE OR REPLACE FUNCTION mv_action() RETURNS bool LANGUAGE sql AS - 'INSERT INTO sro_trojan_table DEFAULT VALUES; SELECT true'; + 'INSERT INTO public.sro_trojan_table DEFAULT VALUES; SELECT true'; REFRESH MATERIALIZED VIEW sro_mv; \c - REFRESH MATERIALIZED VIEW sro_mv; @@ -1204,7 +1240,7 @@ SET SESSION AUTHORIZATION regress_sro_user; CREATE FUNCTION unwanted_grant_nofail(int) RETURNS int IMMUTABLE LANGUAGE plpgsql AS $$ BEGIN - PERFORM unwanted_grant(); + PERFORM public.unwanted_grant(); RAISE WARNING 'owned'; RETURN 1; EXCEPTION WHEN OTHERS THEN @@ -1349,6 +1385,21 @@ SELECT * FROM pg_largeobject LIMIT 0; SET SESSION AUTHORIZATION regress_priv_user1; SELECT * FROM pg_largeobject LIMIT 0; -- to be denied +-- pg_signal_backend can't signal superusers +RESET SESSION AUTHORIZATION; +BEGIN; +CREATE OR REPLACE FUNCTION terminate_nothrow(pid int) RETURNS bool + LANGUAGE plpgsql SECURITY DEFINER SET client_min_messages = error AS $$ +BEGIN + RETURN pg_terminate_backend($1); +EXCEPTION WHEN OTHERS THEN + RETURN false; +END$$; +ALTER FUNCTION terminate_nothrow OWNER TO pg_signal_backend; +SELECT backend_type FROM pg_stat_activity +WHERE CASE WHEN COALESCE(usesysid, 10) = 10 THEN terminate_nothrow(pid) END; +ROLLBACK; + -- test pg_database_owner RESET SESSION AUTHORIZATION; GRANT pg_database_owner TO regress_priv_user1; @@ -1881,7 +1932,6 @@ DROP ROLE regress_roleoption_recipient; CREATE ROLE regress_no_maintain; CREATE ROLE regress_maintain; CREATE ROLE regress_maintain_all IN ROLE pg_maintain; - CREATE TABLE maintain_test (a INT); CREATE INDEX ON maintain_test (a); GRANT MAINTAIN ON maintain_test TO regress_maintain; diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql index 965021fd84dc9..3b3c6f6e2944d 100644 --- a/src/test/regress/sql/psql.sql +++ b/src/test/regress/sql/psql.sql @@ -87,6 +87,10 @@ select 1 as var1, NULL as var2, 3 as var3 \gset select 10 as test01, 20 as test02 from generate_series(1,3) \gset select 10 as test01, 20 as test02 from generate_series(1,0) \gset +-- \gset returns no tuples +select a from generate_series(1, 10) as a where a = 11 \gset +\echo :ROW_COUNT + -- \gset should work in FETCH_COUNT mode too \set FETCH_COUNT 1 @@ -985,6 +989,7 @@ select \if false \\ (bogus \else \\ 42 \endif \\ forty_two; \echo `nosuchcommand` :foo :'foo' :"foo" \pset fieldsep | `nosuchcommand` :foo :'foo' :"foo" \a + SELECT $1 \bind 1 \g \C arg1 \c arg1 arg2 arg3 arg4 \cd arg1 @@ -1156,20 +1161,23 @@ SELECT 4 AS \gdesc \echo 'last error message:' :LAST_ERROR_MESSAGE \echo 'last error code:' :LAST_ERROR_SQLSTATE --- check row count for a cursor-fetched query +-- check row count for a query with chunked results \set FETCH_COUNT 10 select unique2 from tenk1 order by unique2 limit 19; \echo 'error:' :ERROR \echo 'error code:' :SQLSTATE \echo 'number of rows:' :ROW_COUNT --- cursor-fetched query with an error after the first group +-- chunked results with an error after the first chunk +-- (we must disable parallel query here, else the behavior is timing-dependent) +set debug_parallel_query = off; select 1/(15-unique2) from tenk1 order by unique2 limit 19; \echo 'error:' :ERROR \echo 'error code:' :SQLSTATE \echo 'number of rows:' :ROW_COUNT \echo 'last error message:' :LAST_ERROR_MESSAGE \echo 'last error code:' :LAST_ERROR_SQLSTATE +reset debug_parallel_query; \unset FETCH_COUNT @@ -1308,10 +1316,10 @@ rollback; drop role regress_psql_user; -- check \sf -\sf information_schema._pg_expandarray -\sf+ information_schema._pg_expandarray +\sf information_schema._pg_index_position +\sf+ information_schema._pg_index_position \sf+ interval_pl_time -\sf ts_debug(text) +\sf ts_debug(text); \sf+ ts_debug(text) -- AUTOCOMMIT @@ -1574,6 +1582,7 @@ COMMIT; SELECT COUNT(*) AS "#mum" FROM bla WHERE s = 'Mum' \; -- no mum here SELECT * FROM bla ORDER BY 1; +COMMIT; -- reset all \set AUTOCOMMIT on @@ -1823,3 +1832,60 @@ DROP FUNCTION psql_error; \dP "no.such.database"."no.such.schema"."no.such.partitioned.relation" \dT "no.such.database"."no.such.schema"."no.such.data.type" \dX "no.such.database"."no.such.schema"."no.such.extended.statistics" + +-- check \drg and \du +CREATE ROLE regress_du_role0; +CREATE ROLE regress_du_role1; +CREATE ROLE regress_du_role2; +CREATE ROLE regress_du_admin; + +GRANT regress_du_role0 TO regress_du_admin WITH ADMIN TRUE; +GRANT regress_du_role1 TO regress_du_admin WITH ADMIN TRUE; +GRANT regress_du_role2 TO regress_du_admin WITH ADMIN TRUE; + +GRANT regress_du_role0 TO regress_du_role1 WITH ADMIN TRUE, INHERIT TRUE, SET TRUE GRANTED BY regress_du_admin; +GRANT regress_du_role0 TO regress_du_role2 WITH ADMIN TRUE, INHERIT FALSE, SET FALSE GRANTED BY regress_du_admin; +GRANT regress_du_role1 TO regress_du_role2 WITH ADMIN TRUE , INHERIT FALSE, SET TRUE GRANTED BY regress_du_admin; +GRANT regress_du_role0 TO regress_du_role1 WITH ADMIN FALSE, INHERIT TRUE, SET FALSE GRANTED BY regress_du_role1; +GRANT regress_du_role0 TO regress_du_role2 WITH ADMIN FALSE, INHERIT TRUE , SET TRUE GRANTED BY regress_du_role1; +GRANT regress_du_role0 TO regress_du_role1 WITH ADMIN FALSE, INHERIT FALSE, SET TRUE GRANTED BY regress_du_role2; +GRANT regress_du_role0 TO regress_du_role2 WITH ADMIN FALSE, INHERIT FALSE, SET FALSE GRANTED BY regress_du_role2; + +\drg regress_du_role* +\du regress_du_role* + +DROP ROLE regress_du_role0; +DROP ROLE regress_du_role1; +DROP ROLE regress_du_role2; +DROP ROLE regress_du_admin; + +-- Test display of empty privileges. +BEGIN; +-- Create an owner for tested objects because output contains owner name. +CREATE ROLE regress_zeropriv_owner; +SET LOCAL ROLE regress_zeropriv_owner; + +CREATE DOMAIN regress_zeropriv_domain AS int; +REVOKE ALL ON DOMAIN regress_zeropriv_domain FROM CURRENT_USER, PUBLIC; +\dD+ regress_zeropriv_domain + +CREATE PROCEDURE regress_zeropriv_proc() LANGUAGE sql AS ''; +REVOKE ALL ON PROCEDURE regress_zeropriv_proc() FROM CURRENT_USER, PUBLIC; +\df+ regress_zeropriv_proc + +CREATE TABLE regress_zeropriv_tbl (a int); +REVOKE ALL ON TABLE regress_zeropriv_tbl FROM CURRENT_USER; +\dp regress_zeropriv_tbl + +CREATE TYPE regress_zeropriv_type AS (a int); +REVOKE ALL ON TYPE regress_zeropriv_type FROM CURRENT_USER, PUBLIC; +\dT+ regress_zeropriv_type + +ROLLBACK; + +-- Test display of default privileges with \pset null. +CREATE TABLE defprivs (a int); +\pset null '(default)' +\z defprivs +\pset null '' +DROP TABLE defprivs; diff --git a/src/test/regress/sql/publication.sql b/src/test/regress/sql/publication.sql index d5051a5e74604..479d4f3264472 100644 --- a/src/test/regress/sql/publication.sql +++ b/src/test/regress/sql/publication.sql @@ -444,6 +444,15 @@ RESET client_min_messages; ALTER PUBLICATION testpub_table_ins ADD TABLE testpub_tbl5 (a); -- ok \dRp+ testpub_table_ins +-- error: cannot work with deferrable primary keys +CREATE TABLE testpub_tbl5d (a int PRIMARY KEY DEFERRABLE); +ALTER PUBLICATION testpub_fortable ADD TABLE testpub_tbl5d; +UPDATE testpub_tbl5d SET a = 1; +/* but works fine with FULL replica identity */ +ALTER TABLE testpub_tbl5d REPLICA IDENTITY FULL; +UPDATE testpub_tbl5d SET a = 1; +DROP TABLE testpub_tbl5d; + -- tests with REPLICA IDENTITY FULL CREATE TABLE testpub_tbl6 (a int, b text, c text); ALTER TABLE testpub_tbl6 REPLICA IDENTITY FULL; @@ -594,10 +603,10 @@ ALTER TABLE rf_tbl_abcd_part_pk ATTACH PARTITION rf_tbl_abcd_part_pk_1 FOR VALUE SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub6 FOR TABLE rf_tbl_abcd_pk (a, b); RESET client_min_messages; --- ok - (a,b) coverts all PK cols +-- ok - (a,b) covers all PK cols UPDATE rf_tbl_abcd_pk SET a = 1; ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a, b, c); --- ok - (a,b,c) coverts all PK cols +-- ok - (a,b,c) covers all PK cols UPDATE rf_tbl_abcd_pk SET a = 1; ALTER PUBLICATION testpub6 SET TABLE rf_tbl_abcd_pk (a); -- fail - "b" is missing from the column list diff --git a/src/test/regress/sql/random.sql b/src/test/regress/sql/random.sql index 14cc76bc3c6f3..ebfa7539ede25 100644 --- a/src/test/regress/sql/random.sql +++ b/src/test/regress/sql/random.sql @@ -100,6 +100,161 @@ SELECT ks_test_normal_random() OR ks_test_normal_random() OR ks_test_normal_random() AS standard_normal; +-- Test random(min, max) + +-- invalid range bounds +SELECT random(1, 0); +SELECT random(1000000000001, 1000000000000); +SELECT random(-2.0, -3.0); +SELECT random('NaN'::numeric, 10); +SELECT random('-Inf'::numeric, 0); +SELECT random(0, 'NaN'::numeric); +SELECT random(0, 'Inf'::numeric); + +-- empty range is OK +SELECT random(101, 101); +SELECT random(1000000000001, 1000000000001); +SELECT random(3.14, 3.14); + +-- There should be no triple duplicates in 1000 full-range 32-bit random() +-- values. (Each of the C(1000, 3) choices of triplets from the 1000 values +-- has a probability of 1/(2^32)^2 of being a triple duplicate, so the +-- average number of triple duplicates is 1000 * 999 * 998 / 6 / 2^64, which +-- is roughly 9e-12.) +SELECT r, count(*) +FROM (SELECT random(-2147483648, 2147483647) r + FROM generate_series(1, 1000)) ss +GROUP BY r HAVING count(*) > 2; + +-- There should be no duplicates in 1000 full-range 64-bit random() values. +SELECT r, count(*) +FROM (SELECT random_normal(-9223372036854775808, 9223372036854775807) r + FROM generate_series(1, 1000)) ss +GROUP BY r HAVING count(*) > 1; + +-- There should be no duplicates in 1000 15-digit random() numeric values. +SELECT r, count(*) +FROM (SELECT random_normal(0, 1 - 1e-15) r + FROM generate_series(1, 1000)) ss +GROUP BY r HAVING count(*) > 1; + +-- Expect at least one out of 2000 random values to be in the lowest and +-- highest 1% of the range. +SELECT (count(*) FILTER (WHERE r < -2104533975)) > 0 AS has_small, + (count(*) FILTER (WHERE r > 2104533974)) > 0 AS has_large +FROM (SELECT random(-2147483648, 2147483647) r FROM generate_series(1, 2000)) ss; + +SELECT count(*) FILTER (WHERE r < -1500000000 OR r > 1500000000) AS out_of_range, + (count(*) FILTER (WHERE r < -1470000000)) > 0 AS has_small, + (count(*) FILTER (WHERE r > 1470000000)) > 0 AS has_large +FROM (SELECT random(-1500000000, 1500000000) r FROM generate_series(1, 2000)) ss; + +SELECT (count(*) FILTER (WHERE r < -9038904596117680292)) > 0 AS has_small, + (count(*) FILTER (WHERE r > 9038904596117680291)) > 0 AS has_large +FROM (SELECT random(-9223372036854775808, 9223372036854775807) r + FROM generate_series(1, 2000)) ss; + +SELECT count(*) FILTER (WHERE r < -1500000000000000 OR r > 1500000000000000) AS out_of_range, + (count(*) FILTER (WHERE r < -1470000000000000)) > 0 AS has_small, + (count(*) FILTER (WHERE r > 1470000000000000)) > 0 AS has_large +FROM (SELECT random(-1500000000000000, 1500000000000000) r + FROM generate_series(1, 2000)) ss; + +SELECT count(*) FILTER (WHERE r < -1.5 OR r > 1.5) AS out_of_range, + (count(*) FILTER (WHERE r < -1.47)) > 0 AS has_small, + (count(*) FILTER (WHERE r > 1.47)) > 0 AS has_large +FROM (SELECT random(-1.500000000000000, 1.500000000000000) r + FROM generate_series(1, 2000)) ss; + +-- Every possible value should occur at least once in 2500 random() values +-- chosen from a range with 100 distinct values. +SELECT min(r), max(r), count(r) FROM ( + SELECT DISTINCT random(-50, 49) r FROM generate_series(1, 2500)); + +SELECT min(r), max(r), count(r) FROM ( + SELECT DISTINCT random(123000000000, 123000000099) r + FROM generate_series(1, 2500)); + +SELECT min(r), max(r), count(r) FROM ( + SELECT DISTINCT random(-0.5, 0.49) r FROM generate_series(1, 2500)); + +-- Check for uniform distribution using the Kolmogorov-Smirnov test. + +CREATE FUNCTION ks_test_uniform_random_int_in_range() +RETURNS boolean AS +$$ +DECLARE + n int := 1000; -- Number of samples + c float8 := 1.94947; -- Critical value for 99.9% confidence + ok boolean; +BEGIN + ok := ( + WITH samples AS ( + SELECT random(0, 999999) / 1000000.0 r FROM generate_series(1, n) ORDER BY 1 + ), indexed_samples AS ( + SELECT (row_number() OVER())-1.0 i, r FROM samples + ) + SELECT max(abs(i/n-r)) < c / sqrt(n) FROM indexed_samples + ); + RETURN ok; +END +$$ +LANGUAGE plpgsql; + +SELECT ks_test_uniform_random_int_in_range() OR + ks_test_uniform_random_int_in_range() OR + ks_test_uniform_random_int_in_range() AS uniform_int; + +CREATE FUNCTION ks_test_uniform_random_bigint_in_range() +RETURNS boolean AS +$$ +DECLARE + n int := 1000; -- Number of samples + c float8 := 1.94947; -- Critical value for 99.9% confidence + ok boolean; +BEGIN + ok := ( + WITH samples AS ( + SELECT random(0, 999999999999) / 1000000000000.0 r FROM generate_series(1, n) ORDER BY 1 + ), indexed_samples AS ( + SELECT (row_number() OVER())-1.0 i, r FROM samples + ) + SELECT max(abs(i/n-r)) < c / sqrt(n) FROM indexed_samples + ); + RETURN ok; +END +$$ +LANGUAGE plpgsql; + +SELECT ks_test_uniform_random_bigint_in_range() OR + ks_test_uniform_random_bigint_in_range() OR + ks_test_uniform_random_bigint_in_range() AS uniform_bigint; + +CREATE FUNCTION ks_test_uniform_random_numeric_in_range() +RETURNS boolean AS +$$ +DECLARE + n int := 1000; -- Number of samples + c float8 := 1.94947; -- Critical value for 99.9% confidence + ok boolean; +BEGIN + ok := ( + WITH samples AS ( + SELECT random(0, 0.999999) r FROM generate_series(1, n) ORDER BY 1 + ), indexed_samples AS ( + SELECT (row_number() OVER())-1.0 i, r FROM samples + ) + SELECT max(abs(i/n-r)) < c / sqrt(n) FROM indexed_samples + ); + RETURN ok; +END +$$ +LANGUAGE plpgsql; + +SELECT ks_test_uniform_random_numeric_in_range() OR + ks_test_uniform_random_numeric_in_range() OR + ks_test_uniform_random_numeric_in_range() AS uniform_numeric; + -- setseed() should produce a reproducible series of random() values. SELECT setseed(0.5); @@ -113,3 +268,12 @@ SET extra_float_digits = -1; SELECT random_normal() FROM generate_series(1, 10); SELECT random_normal(mean => 1, stddev => 0.1) r FROM generate_series(1, 10); + +-- Reproducible random(min, max) values. +SELECT random(1, 6) FROM generate_series(1, 10); +SELECT random(-2147483648, 2147483647) FROM generate_series(1, 10); +SELECT random(-9223372036854775808, 9223372036854775807) FROM generate_series(1, 10); +SELECT random(-1e30, 1e30) FROM generate_series(1, 10); +SELECT random(-0.4, 0.4) FROM generate_series(1, 10); +SELECT random(0, 1 - 1e-30) FROM generate_series(1, 10); +SELECT n, random(0, trim_scale(abs(1 - 10.0^(-n)))) FROM generate_series(-20, 20) n; diff --git a/src/test/regress/sql/rangefuncs.sql b/src/test/regress/sql/rangefuncs.sql index 63351e1412d4b..3c47c98e1136d 100644 --- a/src/test/regress/sql/rangefuncs.sql +++ b/src/test/regress/sql/rangefuncs.sql @@ -815,3 +815,13 @@ select * from from unnest(array['{"lectures": [{"id": "1"}]}'::jsonb]) as unnested_modules(module)) as ss, jsonb_to_recordset(ss.lecture) as j (id text); + +-- check detection of mismatching record types with a const-folded expression + +with a(b) as (values (row(1,2,3))) +select * from a, coalesce(b) as c(d int, e int); -- fail +with a(b) as (values (row(1,2,3))) +select * from a, coalesce(b) as c(d int, e int, f int, g int); -- fail +with a(b) as (values (row(1,2,3))) +select * from a, coalesce(b) as c(d int, e int, f float); -- fail +select * from int8_tbl, coalesce(row(1)) as (a int, b int); -- fail diff --git a/src/test/regress/sql/rangetypes.sql b/src/test/regress/sql/rangetypes.sql index c23be928c323f..a5ecdf5372f5d 100644 --- a/src/test/regress/sql/rangetypes.sql +++ b/src/test/regress/sql/rangetypes.sql @@ -575,11 +575,11 @@ drop type two_ints cascade; -- Check behavior when subtype lacks a hash function -- -create type cashrange as range (subtype = money); +create type varbitrange as range (subtype = varbit); set enable_sort = off; -- try to make it pick a hash setop implementation -select '(2,5)'::cashrange except select '(5,6)'::cashrange; +select '(01,10)'::varbitrange except select '(10,11)'::varbitrange; reset enable_sort; @@ -629,3 +629,72 @@ create function inoutparam_fail(inout i anyelement, out r anyrange) --should fail create function table_fail(i anyelement) returns table(i anyelement, r anyrange) as $$ select $1, '[1,10]' $$ language sql; + +-- +-- Test support functions +-- + +-- empty range +explain (verbose, costs off) +select current_date <@ daterange 'empty'; + +-- unbounded range +explain (verbose, costs off) +select current_date <@ daterange(NULL, NULL); + +-- only lower bound present +explain (verbose, costs off) +select current_date <@ daterange('2000-01-01', NULL, '[)'); + +-- only upper bound present +explain (verbose, costs off) +select current_date <@ daterange(NULL, '2000-01-01', '(]'); + +-- lower range "-Infinity" excluded +explain (verbose, costs off) +select current_date <@ daterange('-Infinity', '1997-04-10'::date, '()'); + +-- lower range "-Infinity" included +explain (verbose, costs off) +select current_date <@ daterange('-Infinity', '1997-04-10'::date, '[)'); + +-- upper range "Infinity" excluded +explain (verbose, costs off) +select current_date <@ daterange('2002-09-25'::date, 'Infinity', '[)'); + +-- upper range "Infinity" included +explain (verbose, costs off) +select current_date <@ daterange('2002-09-25'::date, 'Infinity', '[]'); + +-- should also work if we use "@>" +explain (verbose, costs off) +select daterange('-Infinity', '1997-04-10'::date, '()') @> current_date; + +explain (verbose, costs off) +select daterange('2002-09-25'::date, 'Infinity', '[]') @> current_date; + +-- Check that volatile cases are not optimized +explain (verbose, costs off) +select now() <@ tstzrange('2024-01-20 00:00', '2024-01-21 00:00'); +explain (verbose, costs off) -- unsafe! +select clock_timestamp() <@ tstzrange('2024-01-20 00:00', '2024-01-21 00:00'); +explain (verbose, costs off) +select clock_timestamp() <@ tstzrange('2024-01-20 00:00', NULL); + +-- test a custom range type with a non-default operator class +create type textrange_supp as range ( + subtype = text, + subtype_opclass = text_pattern_ops +); + +create temp table text_support_test (t text collate "C"); + +insert into text_support_test values ('a'), ('c'), ('d'), ('ch'); + +explain (costs off) +select * from text_support_test where t <@ textrange_supp('a', 'd'); +select * from text_support_test where t <@ textrange_supp('a', 'd'); + +drop table text_support_test; + +drop type textrange_supp; diff --git a/src/test/regress/sql/regproc.sql b/src/test/regress/sql/regproc.sql index de2aa881a8dc0..232289ac39823 100644 --- a/src/test/regress/sql/regproc.sql +++ b/src/test/regress/sql/regproc.sql @@ -123,6 +123,14 @@ SELECT to_regnamespace('Nonexistent'); SELECT to_regnamespace('"Nonexistent"'); SELECT to_regnamespace('foo.bar'); +-- Test to_regtypemod +SELECT to_regtypemod('text'); +SELECT to_regtypemod('timestamp(4)'); +SELECT to_regtypemod('no_such_type(4)'); +SELECT format_type(to_regtype('varchar(32)'), to_regtypemod('varchar(32)')); +SELECT format_type(to_regtype('bit'), to_regtypemod('bit')); +SELECT format_type(to_regtype('"bit"'), to_regtypemod('"bit"')); + -- Test soft-error API SELECT * FROM pg_input_error_info('ng_catalog.pg_class', 'regclass'); diff --git a/src/test/regress/sql/reloptions.sql b/src/test/regress/sql/reloptions.sql index 4252b0202f4ce..24fbe0b478d96 100644 --- a/src/test/regress/sql/reloptions.sql +++ b/src/test/regress/sql/reloptions.sql @@ -52,6 +52,13 @@ SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass AND -- RESET fails if a value is specified ALTER TABLE reloptions_test RESET (fillfactor=12); +-- We can RESET an invalid option which for some reason is already set +UPDATE pg_class + SET reloptions = '{fillfactor=13,autovacuum_enabled=false,illegal_option=4}' + WHERE oid = 'reloptions_test'::regclass; +ALTER TABLE reloptions_test RESET (illegal_option); +SELECT reloptions FROM pg_class WHERE oid = 'reloptions_test'::regclass; + -- Test vacuum_truncate option DROP TABLE reloptions_test; diff --git a/src/test/regress/sql/replica_identity.sql b/src/test/regress/sql/replica_identity.sql index 14620b77130bd..039cca25e8c34 100644 --- a/src/test/regress/sql/replica_identity.sql +++ b/src/test/regress/sql/replica_identity.sql @@ -8,6 +8,7 @@ CREATE TABLE test_replica_identity ( ) ; CREATE TABLE test_replica_identity_othertable (id serial primary key); +CREATE TABLE test_replica_identity_t3 (id serial constraint pk primary key deferrable); CREATE INDEX test_replica_identity_keyab ON test_replica_identity (keya, keyb); CREATE UNIQUE INDEX test_replica_identity_keyab_key ON test_replica_identity (keya, keyb); @@ -40,6 +41,8 @@ ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_iden ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_othertable_pkey; -- fail, deferrable ALTER TABLE test_replica_identity REPLICA IDENTITY USING INDEX test_replica_identity_unique_defer; +-- fail, deferrable +ALTER TABLE test_replica_identity_t3 REPLICA IDENTITY USING INDEX pk; SELECT relreplident FROM pg_class WHERE oid = 'test_replica_identity'::regclass; @@ -122,3 +125,4 @@ DROP TABLE test_replica_identity2; DROP TABLE test_replica_identity3; DROP TABLE test_replica_identity4; DROP TABLE test_replica_identity_othertable; +DROP TABLE test_replica_identity_t3; diff --git a/src/test/regress/sql/returning.sql b/src/test/regress/sql/returning.sql index a460f82fb7c84..8a2a2a5861d03 100644 --- a/src/test/regress/sql/returning.sql +++ b/src/test/regress/sql/returning.sql @@ -132,6 +132,30 @@ DELETE FROM foo WHERE f2 = 'zit' RETURNING *; SELECT * FROM foo; SELECT * FROM voo; +-- Check use of a whole-row variable for an un-flattenable view +CREATE TEMP VIEW foo_v AS SELECT * FROM foo OFFSET 0; +UPDATE foo SET f2 = foo_v.f2 FROM foo_v WHERE foo_v.f1 = foo.f1 + RETURNING foo_v; +SELECT * FROM foo; + +-- Check use of a whole-row variable for an inlined set-returning function +CREATE FUNCTION foo_f() RETURNS SETOF foo AS + $$ SELECT * FROM foo OFFSET 0 $$ LANGUAGE sql STABLE; +UPDATE foo SET f2 = foo_f.f2 FROM foo_f() WHERE foo_f.f1 = foo.f1 + RETURNING foo_f; +SELECT * FROM foo; +DROP FUNCTION foo_f(); + +-- As above, but SRF is defined to return a composite type +CREATE TYPE foo_t AS (f1 int, f2 text, f3 int, f4 int8); +CREATE FUNCTION foo_f() RETURNS SETOF foo_t AS + $$ SELECT * FROM foo OFFSET 0 $$ LANGUAGE sql STABLE; +UPDATE foo SET f2 = foo_f.f2 FROM foo_f() WHERE foo_f.f1 = foo.f1 + RETURNING foo_f; +SELECT * FROM foo; +DROP FUNCTION foo_f(); +DROP TYPE foo_t; + -- Try a join case CREATE TEMP TABLE joinme (f2j text, other int); diff --git a/src/test/regress/sql/rowsecurity.sql b/src/test/regress/sql/rowsecurity.sql index 3d664538a6965..eab7d99003eec 100644 --- a/src/test/regress/sql/rowsecurity.sql +++ b/src/test/regress/sql/rowsecurity.sql @@ -821,10 +821,10 @@ ALTER TABLE document ADD COLUMN dnotes text DEFAULT ''; CREATE POLICY p1 ON document FOR SELECT USING (true); -- one may insert documents only authored by them CREATE POLICY p2 ON document FOR INSERT WITH CHECK (dauthor = current_user); --- one may only update documents in 'novel' category +-- one may only update documents in 'novel' category and new dlevel must be > 0 CREATE POLICY p3 ON document FOR UPDATE USING (cid = (SELECT cid from category WHERE cname = 'novel')) - WITH CHECK (dauthor = current_user); + WITH CHECK (dlevel > 0); -- one may only delete documents in 'manga' category CREATE POLICY p4 ON document FOR DELETE USING (cid = (SELECT cid from category WHERE cname = 'manga')); @@ -833,12 +833,12 @@ SELECT * FROM document; SET SESSION AUTHORIZATION regress_rls_bob; --- Fails, since update violates WITH CHECK qual on dauthor +-- Fails, since update violates WITH CHECK qual on dlevel MERGE INTO document d USING (SELECT 1 as sdid) s ON did = s.sdid WHEN MATCHED THEN - UPDATE SET dnotes = dnotes || ' notes added by merge1 ', dauthor = 'regress_rls_alice'; + UPDATE SET dnotes = dnotes || ' notes added by merge1 ', dlevel = 0; -- Should be OK since USING and WITH CHECK quals pass MERGE INTO document d @@ -847,12 +847,12 @@ ON did = s.sdid WHEN MATCHED THEN UPDATE SET dnotes = dnotes || ' notes added by merge2 '; --- Even when dauthor is updated explicitly, but to the existing value +-- Even when dlevel is updated explicitly, but to the existing value MERGE INTO document d USING (SELECT 1 as sdid) s ON did = s.sdid WHEN MATCHED THEN - UPDATE SET dnotes = dnotes || ' notes added by merge3 ', dauthor = 'regress_rls_bob'; + UPDATE SET dnotes = dnotes || ' notes added by merge3 ', dlevel = 1; -- There is a MATCH for did = 3, but UPDATE's USING qual does not allow -- updating an item in category 'science fiction' @@ -892,6 +892,15 @@ WHEN MATCHED AND dnotes <> '' THEN WHEN MATCHED THEN DELETE; +-- OK if DELETE is replaced with DO NOTHING +MERGE INTO document d +USING (SELECT 4 as sdid) s +ON did = s.sdid +WHEN MATCHED AND dnotes <> '' THEN + UPDATE SET dnotes = dnotes || ' notes added by merge ' +WHEN MATCHED THEN + DO NOTHING; + SELECT * FROM document WHERE did = 4; -- Switch to regress_rls_carol role and try the DELETE again. It should succeed @@ -941,24 +950,70 @@ WHEN NOT MATCHED THEN INSERT VALUES (12, 11, 1, 'regress_rls_bob', 'another novel'); -- drop and create a new SELECT policy which prevents us from reading --- any document except with category 'magna' +-- any document except with category 'novel' RESET SESSION AUTHORIZATION; DROP POLICY p1 ON document; CREATE POLICY p1 ON document FOR SELECT - USING (cid = (SELECT cid from category WHERE cname = 'manga')); + USING (cid = (SELECT cid from category WHERE cname = 'novel')); SET SESSION AUTHORIZATION regress_rls_bob; -- MERGE can no longer see the matching row and hence attempts the -- NOT MATCHED action, which results in unique key violation MERGE INTO document d -USING (SELECT 1 as sdid) s +USING (SELECT 7 as sdid) s ON did = s.sdid WHEN MATCHED THEN UPDATE SET dnotes = dnotes || ' notes added by merge5 ' WHEN NOT MATCHED THEN INSERT VALUES (12, 11, 1, 'regress_rls_bob', 'another novel'); +-- UPDATE action fails if new row is not visible +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge6 ', + cid = (SELECT cid from category WHERE cname = 'technology'); + +-- but OK if new row is visible +MERGE INTO document d +USING (SELECT 1 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge7 ', + cid = (SELECT cid from category WHERE cname = 'novel'); + +-- OK to insert a new row that is not visible +MERGE INTO document d +USING (SELECT 13 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge8 ' +WHEN NOT MATCHED THEN + INSERT VALUES (13, 44, 1, 'regress_rls_bob', 'new manga'); +SELECT * FROM document WHERE did = 13; + +-- but not OK if RETURNING is used +MERGE INTO document d +USING (SELECT 14 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge9 ' +WHEN NOT MATCHED THEN + INSERT VALUES (14, 44, 1, 'regress_rls_bob', 'new manga') +RETURNING *; + +-- but OK if new row is visible +MERGE INTO document d +USING (SELECT 14 as sdid) s +ON did = s.sdid +WHEN MATCHED THEN + UPDATE SET dnotes = dnotes || ' notes added by merge10 ' +WHEN NOT MATCHED THEN + INSERT VALUES (14, 11, 1, 'regress_rls_bob', 'new novel') +RETURNING *; + RESET SESSION AUTHORIZATION; -- drop the restrictive SELECT policy so that we can look at the -- final state of the table @@ -1671,6 +1726,25 @@ SELECT * FROM current_check; COMMIT; +-- Check that RLS filters that are tidquals don't override WHERE CURRENT OF +BEGIN; +CREATE TABLE current_check_2 (a int, b text); +INSERT INTO current_check_2 VALUES (1, 'Apple'); +ALTER TABLE current_check_2 ENABLE ROW LEVEL SECURITY; +ALTER TABLE current_check_2 FORCE ROW LEVEL SECURITY; +-- policy must accept ctid = (InvalidBlockNumber,0) since updates check it +-- before assigning a ctid to the new row +CREATE POLICY p1 ON current_check_2 AS PERMISSIVE + USING (ctid IN ('(0,1)', '(0,2)', '(4294967295,0)')); +SELECT ctid, * FROM current_check_2; +DECLARE current_check_cursor CURSOR FOR SELECT * FROM current_check_2; +FETCH FROM current_check_cursor; +EXPLAIN (COSTS OFF) +UPDATE current_check_2 SET b = 'Manzana' WHERE CURRENT OF current_check_cursor; +UPDATE current_check_2 SET b = 'Manzana' WHERE CURRENT OF current_check_cursor; +SELECT ctid, * FROM current_check_2; +ROLLBACK; + -- -- check pg_stats view filtering -- @@ -2143,8 +2217,66 @@ execute q; set role regress_rls_bob; execute q; +-- make sure RLS dependencies in CTEs are handled +reset role; +create or replace function rls_f() returns setof rls_t + stable language sql + as $$ with cte as (select * from rls_t) select * from cte $$; +prepare r as select current_user, * from rls_f(); +set role regress_rls_alice; +execute r; +set role regress_rls_bob; +execute r; + +-- make sure RLS dependencies in subqueries are handled +reset role; +create or replace function rls_f() returns setof rls_t + stable language sql + as $$ select * from (select * from rls_t) _ $$; +prepare s as select current_user, * from rls_f(); +set role regress_rls_alice; +execute s; +set role regress_rls_bob; +execute s; + +-- make sure RLS dependencies in sublinks are handled +reset role; +create or replace function rls_f() returns setof rls_t + stable language sql + as $$ select exists(select * from rls_t)::text $$; +prepare t as select current_user, * from rls_f(); +set role regress_rls_alice; +execute t; +set role regress_rls_bob; +execute t; + +-- make sure RLS dependencies are handled when coercion projections are inserted +reset role; +create or replace function rls_f() returns setof rls_t + stable language sql + as $$ select * from (select array_agg(c) as cs from rls_t) _ group by cs $$; +prepare u as select current_user, * from rls_f(); +set role regress_rls_alice; +execute u; +set role regress_rls_bob; +execute u; + +-- make sure RLS dependencies in security invoker views are handled +reset role; +create view rls_v with (security_invoker) as select * from rls_t; +grant select on rls_v to regress_rls_alice, regress_rls_bob; +create or replace function rls_f() returns setof rls_t + stable language sql + as $$ select * from rls_v $$; +prepare v as select current_user, * from rls_f(); +set role regress_rls_alice; +execute v; +set role regress_rls_bob; +execute v; + RESET ROLE; DROP FUNCTION rls_f(); +DROP VIEW rls_v; DROP TABLE rls_t; -- diff --git a/src/test/regress/sql/rowtypes.sql b/src/test/regress/sql/rowtypes.sql index 565e6249d5015..174b062144a2d 100644 --- a/src/test/regress/sql/rowtypes.sql +++ b/src/test/regress/sql/rowtypes.sql @@ -494,6 +494,52 @@ with r(a,b) as materialized (null,row(1,2)), (null,row(null,null)), (null,null) ) select r, r is null as isnull, r is not null as isnotnull from r; +-- +-- Check parsing of indirect references to composite values (bug #18077) +-- +explain (verbose, costs off) +with cte(c) as materialized (select row(1, 2)), + cte2(c) as (select * from cte) +select * from cte2 as t +where (select * from (select c as c1) s + where (select (c1).f1 > 0)) is not null; + +with cte(c) as materialized (select row(1, 2)), + cte2(c) as (select * from cte) +select * from cte2 as t +where (select * from (select c as c1) s + where (select (c1).f1 > 0)) is not null; + +-- Also check deparsing of such cases +create view composite_v as +with cte(c) as materialized (select row(1, 2)), + cte2(c) as (select * from cte) +select 1 as one from cte2 as t +where (select * from (select c as c1) s + where (select (c1).f1 > 0)) is not null; +select pg_get_viewdef('composite_v', true); +drop view composite_v; + +-- +-- Check cases where the composite comes from a proven-dummy rel (bug #18576) +-- +explain (verbose, costs off) +select (ss.a).x, (ss.a).n from + (select information_schema._pg_expandarray(array[1,2]) AS a) ss; +explain (verbose, costs off) +select (ss.a).x, (ss.a).n from + (select information_schema._pg_expandarray(array[1,2]) AS a) ss +where false; + +explain (verbose, costs off) +with cte(c) as materialized (select row(1, 2)), + cte2(c) as (select * from cte) +select (c).f1 from cte2 as t; +explain (verbose, costs off) +with cte(c) as materialized (select row(1, 2)), + cte2(c) as (select * from cte) +select (c).f1 from cte2 as t +where false; -- -- Tests for component access / FieldSelect diff --git a/src/test/regress/sql/rules.sql b/src/test/regress/sql/rules.sql index 8b7e255dcd22d..4a5fa50585573 100644 --- a/src/test/regress/sql/rules.sql +++ b/src/test/regress/sql/rules.sql @@ -57,9 +57,9 @@ create rule rtest_pers_del as on delete to rtest_person do also -- -- Tables and rules for the logging test -- -create table rtest_emp (ename char(20), salary money); -create table rtest_emplog (ename char(20), who name, action char(10), newsal money, oldsal money); -create table rtest_empmass (ename char(20), salary money); +create table rtest_emp (ename char(20), salary numeric); +create table rtest_emplog (ename char(20), who name, action char(10), newsal numeric, oldsal numeric); +create table rtest_empmass (ename char(20), salary numeric); create rule rtest_emp_ins as on insert to rtest_emp do insert into rtest_emplog values (new.ename, current_user, @@ -1277,11 +1277,24 @@ MERGE INTO rule_merge2 t USING (SELECT 1 AS a) s WHEN NOT MATCHED THEN INSERT VALUES (s.a, ''); +-- also ok if the rules are disabled +ALTER TABLE rule_merge1 DISABLE RULE rule1; +ALTER TABLE rule_merge1 DISABLE RULE rule2; +ALTER TABLE rule_merge1 DISABLE RULE rule3; +MERGE INTO rule_merge1 t USING (SELECT 1 AS a) s + ON t.a = s.a + WHEN MATCHED AND t.a < 2 THEN + UPDATE SET b = b || ' updated by merge' + WHEN MATCHED AND t.a > 2 THEN + DELETE + WHEN NOT MATCHED THEN + INSERT VALUES (s.a, ''); + -- test deparsing CREATE TABLE sf_target(id int, data text, filling int[]); CREATE FUNCTION merge_sf_test() - RETURNS void + RETURNS TABLE(action text, a int, b text, id int, data text, filling int[]) LANGUAGE sql BEGIN ATOMIC MERGE INTO sf_target t @@ -1318,12 +1331,33 @@ WHEN NOT MATCHED VALUES (s.a, s.b, DEFAULT) WHEN NOT MATCHED THEN INSERT (filling[1], id) - VALUES (s.a, s.a); + VALUES (s.a, s.a) +RETURNING + merge_action() AS action, *; END; \sf merge_sf_test +CREATE FUNCTION merge_sf_test2() + RETURNS void + LANGUAGE sql +BEGIN ATOMIC + MERGE INTO sf_target t + USING rule_merge1 s + ON (s.a = t.id) +WHEN NOT MATCHED + THEN INSERT (data, id) + VALUES (s.a, s.a) +WHEN MATCHED + THEN UPDATE SET data = s.b +WHEN NOT MATCHED BY SOURCE + THEN DELETE; +END; + +\sf merge_sf_test2 + DROP FUNCTION merge_sf_test; +DROP FUNCTION merge_sf_test2; DROP TABLE sf_target; -- diff --git a/src/test/regress/sql/sanity_check.sql b/src/test/regress/sql/sanity_check.sql index 7f338d191c677..162e5324b5d85 100644 --- a/src/test/regress/sql/sanity_check.sql +++ b/src/test/regress/sql/sanity_check.sql @@ -19,29 +19,3 @@ SELECT relname, relkind FROM pg_class WHERE relkind IN ('v', 'c', 'f', 'p', 'I') AND relfilenode <> 0; - --- --- When ALIGNOF_DOUBLE==4 (e.g. AIX), the C ABI may impose 8-byte alignment on --- some of the C types that correspond to TYPALIGN_DOUBLE SQL types. To ensure --- catalog C struct layout matches catalog tuple layout, arrange for the tuple --- offset of each fixed-width, attalign='d' catalog column to be divisible by 8 --- unconditionally. Keep such columns before the first NameData column of the --- catalog, since packagers can override NAMEDATALEN to an odd number. --- -WITH check_columns AS ( - SELECT relname, attname, - array( - SELECT t.oid - FROM pg_type t JOIN pg_attribute pa ON t.oid = pa.atttypid - WHERE pa.attrelid = a.attrelid AND - pa.attnum > 0 AND pa.attnum < a.attnum - ORDER BY pa.attnum) AS coltypes - FROM pg_attribute a JOIN pg_class c ON c.oid = attrelid - JOIN pg_namespace n ON c.relnamespace = n.oid - WHERE attalign = 'd' AND relkind = 'r' AND - attnotnull AND attlen <> -1 AND n.nspname = 'pg_catalog' -) -SELECT relname, attname, coltypes, get_columns_length(coltypes) - FROM check_columns - WHERE get_columns_length(coltypes) % 8 != 0 OR - 'name'::regtype::oid = ANY(coltypes); diff --git a/src/test/regress/sql/select_distinct.sql b/src/test/regress/sql/select_distinct.sql index 1643526d99180..da92c197aba5c 100644 --- a/src/test/regress/sql/select_distinct.sql +++ b/src/test/regress/sql/select_distinct.sql @@ -180,6 +180,19 @@ SELECT DISTINCT four,1,2,3 FROM tenk1 WHERE four = 0; -- Ensure we only get 1 row SELECT DISTINCT four,1,2,3 FROM tenk1 WHERE four = 0; +SET parallel_setup_cost=0; +SET min_parallel_table_scan_size=0; +SET max_parallel_workers_per_gather=2; + +-- Ensure we get a plan with a Limit 1 in both partial distinct and final +-- distinct +EXPLAIN (COSTS OFF) +SELECT DISTINCT four FROM tenk1 WHERE four = 10; + +RESET max_parallel_workers_per_gather; +RESET min_parallel_table_scan_size; +RESET parallel_setup_cost; + -- -- Also, some tests of IS DISTINCT FROM, which doesn't quite deserve its -- very own regression file. diff --git a/src/test/regress/sql/select_parallel.sql b/src/test/regress/sql/select_parallel.sql index 80c914dc02b0b..3e4bfcb71f09b 100644 --- a/src/test/regress/sql/select_parallel.sql +++ b/src/test/regress/sql/select_parallel.sql @@ -137,11 +137,19 @@ alter table tenk2 reset (parallel_workers); -- test parallel index scans. set enable_seqscan to off; set enable_bitmapscan to off; +set random_page_cost = 2; explain (costs off) select count((unique1)) from tenk1 where hundred > 1; select count((unique1)) from tenk1 where hundred > 1; +-- Parallel ScalarArrayOp index scan +explain (costs off) + select count((unique1)) from tenk1 + where hundred = any ((select array_agg(i) from generate_series(1, 100, 15) i)::int[]); +select count((unique1)) from tenk1 +where hundred = any ((select array_agg(i) from generate_series(1, 100, 15) i)::int[]); + -- test parallel index-only scans. explain (costs off) select count(*) from tenk1 where thousand > 95; @@ -343,6 +351,32 @@ select string4 from tenk1 order by string4 limit 5; reset parallel_leader_participation; reset max_parallel_workers; +create function parallel_safe_volatile(a int) returns int as + $$ begin return a; end; $$ parallel safe volatile language plpgsql; + +-- Test gather merge atop of a sort of a partial path +explain (costs off) +select * from tenk1 where four = 2 +order by four, hundred, parallel_safe_volatile(thousand); + +-- Test gather merge atop of an incremental sort a of partial path +set min_parallel_index_scan_size = 0; +set enable_seqscan = off; + +explain (costs off) +select * from tenk1 where four = 2 +order by four, hundred, parallel_safe_volatile(thousand); + +reset min_parallel_index_scan_size; +reset enable_seqscan; + +-- Test GROUP BY with a gather merge path atop of a sort of a partial path +explain (costs off) +select count(*) from tenk1 +group by twenty, parallel_safe_volatile(two); + +drop function parallel_safe_volatile(int); + SAVEPOINT settings; SET LOCAL debug_parallel_query = 1; explain (costs off) @@ -462,3 +496,57 @@ SELECT 1 FROM tenk1_vw_sec WHERE (SELECT sum(f1) FROM int4_tbl WHERE f1 < unique1) < 100; rollback; + +-- test that function option SET ROLE works in parallel workers. +create role regress_parallel_worker; + +create function set_and_report_role() returns text as + $$ select current_setting('role') $$ language sql parallel safe + set role = regress_parallel_worker; + +create function set_role_and_error(int) returns int as + $$ select 1 / $1 $$ language sql parallel safe + set role = regress_parallel_worker; + +set debug_parallel_query = 0; +select set_and_report_role(); +select set_role_and_error(0); +set debug_parallel_query = 1; +select set_and_report_role(); +select set_role_and_error(0); +reset debug_parallel_query; + +drop function set_and_report_role(); +drop function set_role_and_error(int); +drop role regress_parallel_worker; + +-- don't freeze in ParallelFinish while holding an LWLock +BEGIN; + +CREATE FUNCTION my_cmp (int4, int4) +RETURNS int LANGUAGE sql AS +$$ + SELECT + CASE WHEN $1 < $2 THEN -1 + WHEN $1 > $2 THEN 1 + ELSE 0 + END; +$$; + +CREATE TABLE parallel_hang (i int4); +INSERT INTO parallel_hang + (SELECT * FROM generate_series(1, 400) gs); + +CREATE OPERATOR CLASS int4_custom_ops FOR TYPE int4 USING btree AS + OPERATOR 1 < (int4, int4), OPERATOR 2 <= (int4, int4), + OPERATOR 3 = (int4, int4), OPERATOR 4 >= (int4, int4), + OPERATOR 5 > (int4, int4), FUNCTION 1 my_cmp(int4, int4); + +CREATE UNIQUE INDEX parallel_hang_idx + ON parallel_hang + USING btree (i int4_custom_ops); + +SET debug_parallel_query = on; +DELETE FROM parallel_hang WHERE 380 <= i AND i <= 420; + +ROLLBACK; diff --git a/src/test/regress/sql/sqljson.sql b/src/test/regress/sql/sqljson.sql index 4fd820fd5153a..343d344d2707f 100644 --- a/src/test/regress/sql/sqljson.sql +++ b/src/test/regress/sql/sqljson.sql @@ -1,3 +1,67 @@ +-- JSON() +SELECT JSON(); +SELECT JSON(NULL); +SELECT JSON('{ "a" : 1 } '); +SELECT JSON('{ "a" : 1 } ' FORMAT JSON); +SELECT JSON('{ "a" : 1 } ' FORMAT JSON ENCODING UTF8); +SELECT JSON('{ "a" : 1 } '::bytea FORMAT JSON ENCODING UTF8); +SELECT pg_typeof(JSON('{ "a" : 1 } ')); + +SELECT JSON(' 1 '::json); +SELECT JSON(' 1 '::jsonb); +SELECT JSON(' 1 '::json WITH UNIQUE KEYS); +SELECT JSON(123); + +SELECT JSON('{"a": 1, "a": 2}'); +SELECT JSON('{"a": 1, "a": 2}' WITH UNIQUE KEYS); +SELECT JSON('{"a": 1, "a": 2}' WITHOUT UNIQUE KEYS); + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' FORMAT JSON); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'::bytea FORMAT JSON); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'::bytea FORMAT JSON ENCODING UTF8); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' WITH UNIQUE KEYS); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123' WITHOUT UNIQUE KEYS); + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON('123'); +SELECT pg_typeof(JSON('123')); + +-- JSON_SCALAR() +SELECT JSON_SCALAR(); +SELECT JSON_SCALAR(NULL); +SELECT JSON_SCALAR(NULL::int); +SELECT JSON_SCALAR(123); +SELECT JSON_SCALAR(123.45); +SELECT JSON_SCALAR(123.45::numeric); +SELECT JSON_SCALAR(true); +SELECT JSON_SCALAR(false); +SELECT JSON_SCALAR(' 123.45'); +SELECT JSON_SCALAR('2020-06-07'::date); +SELECT JSON_SCALAR('2020-06-07 01:02:03'::timestamp); +SELECT JSON_SCALAR('{}'::json); +SELECT JSON_SCALAR('{}'::jsonb); + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR(123); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SCALAR('123'); + +-- JSON_SERIALIZE() +SELECT JSON_SERIALIZE(); +SELECT JSON_SERIALIZE(NULL); +SELECT JSON_SERIALIZE(JSON('{ "a" : 1 } ')); +SELECT JSON_SERIALIZE('{ "a" : 1 } '); +SELECT JSON_SERIALIZE('1'); +SELECT JSON_SERIALIZE('1' FORMAT JSON); +SELECT JSON_SERIALIZE('{ "a" : 1 } ' RETURNING bytea); +SELECT JSON_SERIALIZE('{ "a" : 1 } ' RETURNING varchar); +SELECT pg_typeof(JSON_SERIALIZE(NULL)); + +-- only string types or bytea allowed +SELECT JSON_SERIALIZE('{ "a" : 1 } ' RETURNING jsonb); + + +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SERIALIZE('{}'); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_SERIALIZE('{}' RETURNING bytea); + -- JSON_OBJECT() SELECT JSON_OBJECT(); SELECT JSON_OBJECT(RETURNING json); @@ -74,6 +138,8 @@ SELECT JSON_OBJECT('a': '1', 'b': NULL, 'c': 2); SELECT JSON_OBJECT('a': '1', 'b': NULL, 'c': 2 NULL ON NULL); SELECT JSON_OBJECT('a': '1', 'b': NULL, 'c': 2 ABSENT ON NULL); +SELECT JSON_OBJECT(1: 1, '2': NULL, '3': 1, repeat('x', 1000): 1, 2: repeat('a', 100) WITH UNIQUE); + SELECT JSON_OBJECT(1: 1, '1': NULL WITH UNIQUE); SELECT JSON_OBJECT(1: 1, '1': NULL ABSENT ON NULL WITH UNIQUE); SELECT JSON_OBJECT(1: 1, '1': NULL NULL ON NULL WITH UNIQUE RETURNING jsonb); @@ -86,6 +152,17 @@ SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITH UNIQUE RETURNING SELECT JSON_OBJECT(1: 1, '2': NULL, '1': 1 ABSENT ON NULL WITHOUT UNIQUE RETURNING jsonb); SELECT JSON_OBJECT(1: 1, '2': NULL, '3': 1, 4: NULL, '5': 'a' ABSENT ON NULL WITH UNIQUE RETURNING jsonb); +-- BUG: https://postgr.es/m/CADXhmgTJtJZK9A3Na_ry%2BXrq-ghjcejBRhcRMzWZvbd__QdgJA%40mail.gmail.com +-- datum_to_jsonb_internal() didn't catch keys that are casts instead of a simple scalar +CREATE TYPE mood AS ENUM ('happy', 'sad', 'neutral'); +CREATE FUNCTION mood_to_json(mood) RETURNS json AS $$ + SELECT to_json($1::text); +$$ LANGUAGE sql IMMUTABLE; +CREATE CAST (mood AS json) WITH FUNCTION mood_to_json(mood) AS IMPLICIT; +SELECT JSON_OBJECT('happy'::mood: '123'::jsonb); +DROP CAST (mood AS json); +DROP FUNCTION mood_to_json; +DROP TYPE mood; -- JSON_ARRAY() SELECT JSON_ARRAY(); @@ -122,6 +199,8 @@ SELECT JSON_ARRAY(SELECT i FROM (VALUES (NULL::int[]), ('{1,2}'), (NULL), (NULL) --SELECT JSON_ARRAY(SELECT i FROM (VALUES (NULL::int[]), ('{1,2}'), (NULL), (NULL), ('{3,4}'), (NULL)) foo(i) NULL ON NULL); --SELECT JSON_ARRAY(SELECT i FROM (VALUES (NULL::int[]), ('{1,2}'), (NULL), (NULL), ('{3,4}'), (NULL)) foo(i) NULL ON NULL RETURNING jsonb); SELECT JSON_ARRAY(SELECT i FROM (VALUES (3), (1), (NULL), (2)) foo(i) ORDER BY i); +SELECT JSON_ARRAY(WITH x AS (SELECT 1) VALUES (TRUE)); + -- Should fail SELECT JSON_ARRAY(SELECT FROM (VALUES (1)) foo(i)); SELECT JSON_ARRAY(SELECT i, i FROM (VALUES (1)) foo(i)); @@ -216,6 +295,12 @@ FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb) FROM (VALUES (1, 1), (1, NULL), (2, 2)) foo(k, v); +SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb) +FROM (VALUES (1, 1), (0, NULL),(4, null), (5, null),(6, null),(2, 2)) foo(k, v); + +SELECT JSON_OBJECTAGG(mod(i,100): (i)::text FORMAT JSON WITH UNIQUE) +FROM generate_series(0, 199) i; + -- Test JSON_OBJECT deparsing EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json); @@ -227,6 +312,24 @@ SELECT JSON_OBJECT('foo' : '1' FORMAT JSON, 'bar' : 'baz' RETURNING json); DROP VIEW json_object_view; +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v WITH UNIQUE KEYS) OVER (ORDER BY k) +FROM (VALUES (1,1), (2,2)) a(k,v); + +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v WITH UNIQUE KEYS) OVER (ORDER BY k) +FROM (VALUES (1,1), (1,2), (2,2)) a(k,v); + +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v ABSENT ON NULL WITH UNIQUE KEYS) + OVER (ORDER BY k) +FROM (VALUES (1,1), (1,null), (2,2)) a(k,v); + +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v ABSENT ON NULL) +OVER (ORDER BY k) +FROM (VALUES (1,1), (1,null), (2,2)) a(k,v); + +SELECT to_json(a) AS a, JSON_OBJECTAGG(k : v ABSENT ON NULL) +OVER (ORDER BY k RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) +FROM (VALUES (1,1), (1,null), (2,2)) a(k,v); + -- Test JSON_ARRAY deparsing EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_ARRAY('1' FORMAT JSON, 2 RETURNING json); @@ -378,3 +481,29 @@ SELECT '1' IS JSON AS "any", ('1' || i) IS JSON SCALAR AS "scalar", '[]' IS NOT \sv is_json_view DROP VIEW is_json_view; + +-- Test implicit coercion to a fixed-length type specified in RETURNING +SELECT JSON_SERIALIZE('{ "a" : 1 } ' RETURNING varchar(2)); +SELECT JSON_OBJECT('a': JSON_OBJECT('b': 1 RETURNING varchar(2))); +SELECT JSON_ARRAY(JSON_ARRAY('{ "a" : 123 }' RETURNING varchar(2))); +SELECT JSON_ARRAYAGG(('111' || i)::bytea FORMAT JSON NULL ON NULL RETURNING varchar(2)) FROM generate_series(1,1) i; +SELECT JSON_OBJECTAGG(i: ('111' || i)::bytea FORMAT JSON WITH UNIQUE RETURNING varchar(2)) FROM generate_series(1, 1) i; + +-- Now try domain over fixed-length type +CREATE DOMAIN sqljson_char2 AS char(2) CHECK (VALUE NOT IN ('12')); +SELECT JSON_SERIALIZE('123' RETURNING sqljson_char2); +SELECT JSON_SERIALIZE('12' RETURNING sqljson_char2); + +-- Bug #18657: JsonValueExpr.raw_expr was not initialized in ExecInitExprRec() +-- causing the Aggrefs contained in it to also not be initialized, which led +-- to a crash in ExecBuildAggTrans() as mentioned in the bug report: +-- https://postgr.es/m/18657-1b90ccce2b16bdb8@postgresql.org +CREATE FUNCTION volatile_one() RETURNS int AS $$ BEGIN RETURN 1; END; $$ LANGUAGE plpgsql VOLATILE; +CREATE FUNCTION stable_one() RETURNS int AS $$ BEGIN RETURN 1; END; $$ LANGUAGE plpgsql STABLE; +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': volatile_one() RETURNING text) FORMAT JSON); +SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': volatile_one() RETURNING text) FORMAT JSON); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': stable_one() RETURNING text) FORMAT JSON); +SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': stable_one() RETURNING text) FORMAT JSON); +EXPLAIN (VERBOSE, COSTS OFF) SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': 1 RETURNING text) FORMAT JSON); +SELECT JSON_OBJECT('a': JSON_OBJECTAGG('b': 1 RETURNING text) FORMAT JSON); +DROP FUNCTION volatile_one, stable_one; diff --git a/src/test/regress/sql/sqljson_jsontable.sql b/src/test/regress/sql/sqljson_jsontable.sql new file mode 100644 index 0000000000000..154eea79c768a --- /dev/null +++ b/src/test/regress/sql/sqljson_jsontable.sql @@ -0,0 +1,563 @@ +-- JSON_TABLE + +-- Should fail (JSON_TABLE can be used only in FROM clause) +SELECT JSON_TABLE('[]', '$'); + +-- Only allow EMPTY and ERROR for ON ERROR +SELECT * FROM JSON_TABLE('[]', 'strict $.a' COLUMNS (js2 int PATH '$') DEFAULT 1 ON ERROR); +SELECT * FROM JSON_TABLE('[]', 'strict $.a' COLUMNS (js2 int PATH '$') NULL ON ERROR); +SELECT * FROM JSON_TABLE('[]', 'strict $.a' COLUMNS (js2 int PATH '$') EMPTY ON ERROR); +SELECT * FROM JSON_TABLE('[]', 'strict $.a' COLUMNS (js2 int PATH '$') ERROR ON ERROR); + +-- Column and path names must be distinct +SELECT * FROM JSON_TABLE(jsonb'"1.23"', '$.a' as js2 COLUMNS (js2 int path '$')); + +-- Should fail (no columns) +SELECT * FROM JSON_TABLE(NULL, '$' COLUMNS ()); + +SELECT * FROM JSON_TABLE (NULL::jsonb, '$' COLUMNS (v1 timestamp)) AS f (v1, v2); + +--duplicated column name +SELECT * FROM JSON_TABLE(jsonb'"1.23"', '$.a' COLUMNS (js2 int path '$', js2 int path '$')); + +--return composite data type. +create type comp as (a int, b int); +SELECT * FROM JSON_TABLE(jsonb '{"rec": "(1,2)"}', '$' COLUMNS (id FOR ORDINALITY, comp comp path '$.rec' omit quotes)) jt; +drop type comp; + +-- NULL => empty table +SELECT * FROM JSON_TABLE(NULL::jsonb, '$' COLUMNS (foo int)) bar; +SELECT * FROM JSON_TABLE(jsonb'"1.23"', 'strict $.a' COLUMNS (js2 int PATH '$')); + +-- +SELECT * FROM JSON_TABLE(jsonb '123', '$' + COLUMNS (item int PATH '$', foo int)) bar; + +-- JSON_TABLE: basic functionality +CREATE DOMAIN jsonb_test_domain AS text CHECK (value <> 'foo'); +CREATE TEMP TABLE json_table_test (js) AS + (VALUES + ('1'), + ('[]'), + ('{}'), + ('[1, 1.23, "2", "aaaaaaa", "foo", null, false, true, {"aaa": 123}, "[1,2]", "\"str\""]') + ); + +-- Regular "unformatted" columns +SELECT * +FROM json_table_test vals + LEFT OUTER JOIN + JSON_TABLE( + vals.js::jsonb, 'lax $[*]' + COLUMNS ( + id FOR ORDINALITY, + "int" int PATH '$', + "text" text PATH '$', + "char(4)" char(4) PATH '$', + "bool" bool PATH '$', + "numeric" numeric PATH '$', + "domain" jsonb_test_domain PATH '$', + js json PATH '$', + jb jsonb PATH '$' + ) + ) jt + ON true; + +-- "formatted" columns +SELECT * +FROM json_table_test vals + LEFT OUTER JOIN + JSON_TABLE( + vals.js::jsonb, 'lax $[*]' + COLUMNS ( + id FOR ORDINALITY, + jst text FORMAT JSON PATH '$', + jsc char(4) FORMAT JSON PATH '$', + jsv varchar(4) FORMAT JSON PATH '$', + jsb jsonb FORMAT JSON PATH '$', + jsbq jsonb FORMAT JSON PATH '$' OMIT QUOTES + ) + ) jt + ON true; + +-- EXISTS columns +SELECT * +FROM json_table_test vals + LEFT OUTER JOIN + JSON_TABLE( + vals.js::jsonb, 'lax $[*]' + COLUMNS ( + id FOR ORDINALITY, + exists1 bool EXISTS PATH '$.aaa', + exists2 int EXISTS PATH '$.aaa', + exists3 int EXISTS PATH 'strict $.aaa' UNKNOWN ON ERROR, + exists4 text EXISTS PATH 'strict $.aaa' FALSE ON ERROR + ) + ) jt + ON true; + +-- Other miscellaneous checks +SELECT * +FROM json_table_test vals + LEFT OUTER JOIN + JSON_TABLE( + vals.js::jsonb, 'lax $[*]' + COLUMNS ( + id FOR ORDINALITY, + aaa int, -- "aaa" has implicit path '$."aaa"' + aaa1 int PATH '$.aaa', + js2 json PATH '$', + jsb2w jsonb PATH '$' WITH WRAPPER, + jsb2q jsonb PATH '$' OMIT QUOTES, + ia int[] PATH '$', + ta text[] PATH '$', + jba jsonb[] PATH '$' + ) + ) jt + ON true; + +-- Test using casts in DEFAULT .. ON ERROR expression +SELECT * FROM JSON_TABLE(jsonb '{"d1": "H"}', '$' + COLUMNS (js1 jsonb_test_domain PATH '$.a2' DEFAULT '"foo1"'::jsonb::text ON EMPTY)); + +SELECT * FROM JSON_TABLE(jsonb '{"d1": "H"}', '$' + COLUMNS (js1 jsonb_test_domain PATH '$.a2' DEFAULT 'foo'::jsonb_test_domain ON EMPTY)); + +SELECT * FROM JSON_TABLE(jsonb '{"d1": "H"}', '$' + COLUMNS (js1 jsonb_test_domain PATH '$.a2' DEFAULT 'foo1'::jsonb_test_domain ON EMPTY)); + +SELECT * FROM JSON_TABLE(jsonb '{"d1": "foo"}', '$' + COLUMNS (js1 jsonb_test_domain PATH '$.d1' DEFAULT 'foo2'::jsonb_test_domain ON ERROR)); + +SELECT * FROM JSON_TABLE(jsonb '{"d1": "foo"}', '$' + COLUMNS (js1 oid[] PATH '$.d2' DEFAULT '{1}'::int[]::oid[] ON EMPTY)); + +-- JSON_TABLE: Test backward parsing + +CREATE VIEW jsonb_table_view2 AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + "int" int PATH '$', + "text" text PATH '$', + "char(4)" char(4) PATH '$', + "bool" bool PATH '$', + "numeric" numeric PATH '$', + "domain" jsonb_test_domain PATH '$')); + +CREATE VIEW jsonb_table_view3 AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + js json PATH '$', + jb jsonb PATH '$', + jst text FORMAT JSON PATH '$', + jsc char(4) FORMAT JSON PATH '$', + jsv varchar(4) FORMAT JSON PATH '$')); + +CREATE VIEW jsonb_table_view4 AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + jsb jsonb FORMAT JSON PATH '$', + jsbq jsonb FORMAT JSON PATH '$' OMIT QUOTES, + aaa int, -- implicit path '$."aaa"', + aaa1 int PATH '$.aaa')); + +CREATE VIEW jsonb_table_view5 AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + exists1 bool EXISTS PATH '$.aaa', + exists2 int EXISTS PATH '$.aaa' TRUE ON ERROR, + exists3 text EXISTS PATH 'strict $.aaa' UNKNOWN ON ERROR)); + +CREATE VIEW jsonb_table_view6 AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + js2 json PATH '$', + jsb2w jsonb PATH '$' WITH WRAPPER, + jsb2q jsonb PATH '$' OMIT QUOTES, + ia int[] PATH '$', + ta text[] PATH '$', + jba jsonb[] PATH '$')); + +\sv jsonb_table_view2 +\sv jsonb_table_view3 +\sv jsonb_table_view4 +\sv jsonb_table_view5 +\sv jsonb_table_view6 + +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM jsonb_table_view2; +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM jsonb_table_view3; +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM jsonb_table_view4; +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM jsonb_table_view5; +EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM jsonb_table_view6; + +-- JSON_TABLE() with alias +EXPLAIN (COSTS OFF, VERBOSE) +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + id FOR ORDINALITY, + "int" int PATH '$', + "text" text PATH '$' + )) json_table_func; + +EXPLAIN (COSTS OFF, FORMAT JSON, VERBOSE) +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + id FOR ORDINALITY, + "int" int PATH '$', + "text" text PATH '$' + )) json_table_func; + +DROP VIEW jsonb_table_view2; +DROP VIEW jsonb_table_view3; +DROP VIEW jsonb_table_view4; +DROP VIEW jsonb_table_view5; +DROP VIEW jsonb_table_view6; +DROP DOMAIN jsonb_test_domain; + +-- JSON_TABLE: only one FOR ORDINALITY columns allowed +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (id FOR ORDINALITY, id2 FOR ORDINALITY, a int PATH '$.a' ERROR ON EMPTY)) jt; +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (id FOR ORDINALITY, a int PATH '$' ERROR ON EMPTY)) jt; + +-- JSON_TABLE: ON EMPTY/ON ERROR behavior +SELECT * +FROM + (VALUES ('1'), ('"err"')) vals(js), + JSON_TABLE(vals.js::jsonb, '$' COLUMNS (a int PATH '$')) jt; + +SELECT * +FROM + (VALUES ('1'), ('"err"')) vals(js) + LEFT OUTER JOIN + JSON_TABLE(vals.js::jsonb, '$' COLUMNS (a int PATH '$' ERROR ON ERROR)) jt + ON true; + +-- TABLE-level ERROR ON ERROR is not propagated to columns +SELECT * +FROM + (VALUES ('1'), ('"err"')) vals(js) + LEFT OUTER JOIN + JSON_TABLE(vals.js::jsonb, '$' COLUMNS (a int PATH '$' ERROR ON ERROR)) jt + ON true; + +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int PATH '$.a' ERROR ON EMPTY)) jt; +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int PATH 'strict $.a' ERROR ON ERROR) ERROR ON ERROR) jt; +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int PATH 'lax $.a' ERROR ON EMPTY) ERROR ON ERROR) jt; + +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int PATH '$' DEFAULT 1 ON EMPTY DEFAULT 2 ON ERROR)) jt; +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int PATH 'strict $.a' DEFAULT 1 ON EMPTY DEFAULT 2 ON ERROR)) jt; +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int PATH 'lax $.a' DEFAULT 1 ON EMPTY DEFAULT 2 ON ERROR)) jt; + +-- JSON_TABLE: EXISTS PATH types +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int4 EXISTS PATH '$.a' ERROR ON ERROR)); -- ok; can cast to int4 +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int4 EXISTS PATH '$' ERROR ON ERROR)); -- ok; can cast to int4 +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int2 EXISTS PATH '$.a')); +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a int8 EXISTS PATH '$.a')); +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a float4 EXISTS PATH '$.a')); +-- Default FALSE (ON ERROR) doesn't fit char(3) +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a char(3) EXISTS PATH '$.a')); +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a char(3) EXISTS PATH '$.a' ERROR ON ERROR)); +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a char(5) EXISTS PATH '$.a' ERROR ON ERROR)); +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a json EXISTS PATH '$.a')); +SELECT * FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a jsonb EXISTS PATH '$.a')); + +-- EXISTS PATH domain over int +CREATE DOMAIN dint4 AS int; +CREATE DOMAIN dint4_0 AS int CHECK (VALUE <> 0 ); +SELECT a, a::bool FROM JSON_TABLE(jsonb '"a"', '$' COLUMNS (a dint4 EXISTS PATH '$.a' )); +SELECT a, a::bool FROM JSON_TABLE(jsonb '{"a":1}', '$' COLUMNS (a dint4_0 EXISTS PATH '$.b')); +SELECT a, a::bool FROM JSON_TABLE(jsonb '{"a":1}', '$' COLUMNS (a dint4_0 EXISTS PATH '$.b' ERROR ON ERROR)); +SELECT a, a::bool FROM JSON_TABLE(jsonb '{"a":1}', '$' COLUMNS (a dint4_0 EXISTS PATH '$.b' FALSE ON ERROR)); +SELECT a, a::bool FROM JSON_TABLE(jsonb '{"a":1}', '$' COLUMNS (a dint4_0 EXISTS PATH '$.b' TRUE ON ERROR)); +DROP DOMAIN dint4, dint4_0; + +-- JSON_TABLE: WRAPPER/QUOTES clauses on scalar columns +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text PATH '$' KEEP QUOTES ON SCALAR STRING)); +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text PATH '$' OMIT QUOTES ON SCALAR STRING)); +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' KEEP QUOTES)); +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' OMIT QUOTES)); +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' WITHOUT WRAPPER KEEP QUOTES)); +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text PATH '$' WITHOUT WRAPPER OMIT QUOTES)); + +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' WITH WRAPPER)); + +-- Error: OMIT QUOTES should not be specified when WITH WRAPPER is present +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text PATH '$' WITH WRAPPER OMIT QUOTES)); +-- But KEEP QUOTES (the default) is fine +SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' WITH WRAPPER KEEP QUOTES)); + +-- Test PASSING args +SELECT * +FROM JSON_TABLE( + jsonb '[1,2,3]', + '$[*] ? (@ < $x)' + PASSING 3 AS x + COLUMNS (y text FORMAT JSON PATH '$') + ) jt; + +-- PASSING arguments are also passed to column paths +SELECT * +FROM JSON_TABLE( + jsonb '[1,2,3]', + '$[*] ? (@ < $x)' + PASSING 10 AS x, 3 AS y + COLUMNS (a text FORMAT JSON PATH '$ ? (@ < $y)') + ) jt; + +-- Should fail (not supported) +SELECT * FROM JSON_TABLE(jsonb '{"a": 123}', '$' || '.' || 'a' COLUMNS (foo int)); + +-- JsonPathQuery() error message mentioning column name +SELECT * FROM JSON_TABLE('{"a": [{"b": "1"}, {"b": "2"}]}', '$' COLUMNS (b json path '$.a[*].b' ERROR ON ERROR)); + +-- JSON_TABLE: nested paths + +-- Duplicate path names +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' AS a + COLUMNS ( + b int, + NESTED PATH '$' AS a + COLUMNS ( + c int + ) + ) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' AS a + COLUMNS ( + b int, + NESTED PATH '$' AS n_a + COLUMNS ( + c int + ) + ) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' + COLUMNS ( + b int, + NESTED PATH '$' AS b + COLUMNS ( + c int + ) + ) +) jt; + +SELECT * FROM JSON_TABLE( + jsonb '[]', '$' + COLUMNS ( + NESTED PATH '$' AS a + COLUMNS ( + b int + ), + NESTED PATH '$' + COLUMNS ( + NESTED PATH '$' AS a + COLUMNS ( + c int + ) + ) + ) +) jt; + + +-- JSON_TABLE: plan execution + +CREATE TEMP TABLE jsonb_table_test (js jsonb); + +INSERT INTO jsonb_table_test +VALUES ( + '[ + {"a": 1, "b": [], "c": []}, + {"a": 2, "b": [1, 2, 3], "c": [10, null, 20]}, + {"a": 3, "b": [1, 2], "c": []}, + {"x": "4", "b": [1, 2], "c": 123} + ]' +); + +select + jt.* +from + jsonb_table_test jtt, + json_table ( + jtt.js,'strict $[*]' as p + columns ( + n for ordinality, + a int path 'lax $.a' default -1 on empty, + nested path 'strict $.b[*]' as pb columns (b_id for ordinality, b int path '$' ), + nested path 'strict $.c[*]' as pc columns (c_id for ordinality, c int path '$' ) + ) + ) jt; + + +-- PASSING arguments are passed to nested paths and their columns' paths +SELECT * +FROM + generate_series(1, 3) x, + generate_series(1, 3) y, + JSON_TABLE(jsonb + '[[1,2,3],[2,3,4,5],[3,4,5,6]]', + 'strict $[*] ? (@[*] <= $x)' + PASSING x AS x, y AS y + COLUMNS ( + y text FORMAT JSON PATH '$', + NESTED PATH 'strict $[*] ? (@ == $y)' + COLUMNS ( + z int PATH '$' + ) + ) + ) jt; + +-- JSON_TABLE: Test backward parsing with nested paths + +CREATE VIEW jsonb_table_view_nested AS +SELECT * FROM + JSON_TABLE( + jsonb 'null', 'lax $[*]' PASSING 1 + 2 AS a, json '"foo"' AS "b c" + COLUMNS ( + id FOR ORDINALITY, + NESTED PATH '$[1]' AS p1 COLUMNS ( + a1 int, + NESTED PATH '$[*]' AS "p1 1" COLUMNS ( + a11 text + ), + b1 text + ), + NESTED PATH '$[2]' AS p2 COLUMNS ( + NESTED PATH '$[*]' AS "p2:1" COLUMNS ( + a21 text + ), + NESTED PATH '$[*]' AS p22 COLUMNS ( + a22 text + ) + ) + ) + ); + +\sv jsonb_table_view_nested +DROP VIEW jsonb_table_view_nested; + +CREATE TABLE s (js jsonb); +INSERT INTO s VALUES + ('{"a":{"za":[{"z1": [11,2222]},{"z21": [22, 234,2345]},{"z22": [32, 204,145]}]},"c": 3}'), + ('{"a":{"za":[{"z1": [21,4222]},{"z21": [32, 134,1345]}]},"c": 10}'); + +-- error +SELECT sub.* FROM s, + JSON_TABLE(js, '$' PASSING 32 AS x, 13 AS y COLUMNS ( + xx int path '$.c', + NESTED PATH '$.a.za[1]' columns (NESTED PATH '$.z21[*]' COLUMNS (z21 int path '$?(@ >= $"x")' ERROR ON ERROR)) + )) sub; + +-- Parent columns xx1, xx appear before NESTED ones +SELECT sub.* FROM s, + (VALUES (23)) x(x), generate_series(13, 13) y, + JSON_TABLE(js, '$' AS c1 PASSING x AS x, y AS y COLUMNS ( + NESTED PATH '$.a.za[2]' COLUMNS ( + NESTED PATH '$.z22[*]' as z22 COLUMNS (c int PATH '$')), + NESTED PATH '$.a.za[1]' columns (d int[] PATH '$.z21'), + NESTED PATH '$.a.za[0]' columns (NESTED PATH '$.z1[*]' as z1 COLUMNS (a int PATH '$')), + xx1 int PATH '$.c', + NESTED PATH '$.a.za[1]' columns (NESTED PATH '$.z21[*]' as z21 COLUMNS (b int PATH '$')), + xx int PATH '$.c' + )) sub; + +-- Test applying PASSING variables at different nesting levels +SELECT sub.* FROM s, + (VALUES (23)) x(x), generate_series(13, 13) y, + JSON_TABLE(js, '$' AS c1 PASSING x AS x, y AS y COLUMNS ( + xx1 int PATH '$.c', + NESTED PATH '$.a.za[0].z1[*]' COLUMNS (NESTED PATH '$ ?(@ >= ($"x" -2))' COLUMNS (a int PATH '$')), + NESTED PATH '$.a.za[0]' COLUMNS (NESTED PATH '$.z1[*] ? (@ >= ($"x" -2))' COLUMNS (b int PATH '$')) + )) sub; + +-- Test applying PASSING variable to paths all the levels +SELECT sub.* FROM s, + (VALUES (23)) x(x), + generate_series(13, 13) y, + JSON_TABLE(js, '$' AS c1 PASSING x AS x, y AS y + COLUMNS ( + xx1 int PATH '$.c', + NESTED PATH '$.a.za[1]' + COLUMNS (NESTED PATH '$.z21[*]' COLUMNS (b int PATH '$')), + NESTED PATH '$.a.za[1] ? (@.z21[*] >= ($"x"-1))' COLUMNS + (NESTED PATH '$.z21[*] ? (@ >= ($"y" + 3))' as z22 COLUMNS (a int PATH '$ ? (@ >= ($"y" + 12))')), + NESTED PATH '$.a.za[1]' COLUMNS + (NESTED PATH '$.z21[*] ? (@ >= ($"y" +121))' as z21 COLUMNS (c int PATH '$ ? (@ > ($"x" +111))')) + )) sub; + +----- test on empty behavior +SELECT sub.* FROM s, + (values(23)) x(x), + generate_series(13, 13) y, + JSON_TABLE(js, '$' AS c1 PASSING x AS x, y AS y + COLUMNS ( + xx1 int PATH '$.c', + NESTED PATH '$.a.za[2]' COLUMNS (NESTED PATH '$.z22[*]' as z22 COLUMNS (c int PATH '$')), + NESTED PATH '$.a.za[1]' COLUMNS (d json PATH '$ ? (@.z21[*] == ($"x" -1))'), + NESTED PATH '$.a.za[0]' COLUMNS (NESTED PATH '$.z1[*] ? (@ >= ($"x" -2))' as z1 COLUMNS (a int PATH '$')), + NESTED PATH '$.a.za[1]' COLUMNS + (NESTED PATH '$.z21[*] ? (@ >= ($"y" +121))' as z21 COLUMNS (b int PATH '$ ? (@ > ($"x" +111))' DEFAULT 0 ON EMPTY)) + )) sub; + +CREATE OR REPLACE VIEW jsonb_table_view7 AS +SELECT sub.* FROM s, + (values(23)) x(x), + generate_series(13, 13) y, + JSON_TABLE(js, '$' AS c1 PASSING x AS x, y AS y + COLUMNS ( + xx1 int PATH '$.c', + NESTED PATH '$.a.za[2]' COLUMNS (NESTED PATH '$.z22[*]' as z22 COLUMNS (c int PATH '$' WITHOUT WRAPPER OMIT QUOTES)), + NESTED PATH '$.a.za[1]' COLUMNS (d json PATH '$ ? (@.z21[*] == ($"x" -1))' WITH WRAPPER), + NESTED PATH '$.a.za[0]' COLUMNS (NESTED PATH '$.z1[*] ? (@ >= ($"x" -2))' as z1 COLUMNS (a int PATH '$' KEEP QUOTES)), + NESTED PATH '$.a.za[1]' COLUMNS + (NESTED PATH '$.z21[*] ? (@ >= ($"y" +121))' as z21 COLUMNS (b int PATH '$ ? (@ > ($"x" +111))' DEFAULT 0 ON EMPTY)) + )) sub; +\sv jsonb_table_view7 +DROP VIEW jsonb_table_view7; +DROP TABLE s; + +-- Prevent ON EMPTY specification on EXISTS columns +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty object on empty)); + +-- Test ON ERROR / EMPTY value validity for the function and column types; +-- all fail +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int) NULL ON ERROR); +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int true on empty)); +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int omit quotes true on error)); +SELECT * FROM JSON_TABLE(jsonb '1', '$' COLUMNS (a int exists empty object on error)); + +-- Test JSON_TABLE() column deparsing -- don't emit default ON ERROR / EMPTY +-- behavior +CREATE VIEW json_table_view8 AS SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$')); +\sv json_table_view8; + +CREATE VIEW json_table_view9 AS SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$') ERROR ON ERROR); +\sv json_table_view9; + +DROP VIEW json_table_view8, json_table_view9; + +-- Test JSON_TABLE() deparsing -- don't emit default ON ERROR behavior +CREATE VIEW json_table_view8 AS SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$') EMPTY ON ERROR); +\sv json_table_view8; + +CREATE VIEW json_table_view9 AS SELECT * from JSON_TABLE('"a"', '$' COLUMNS (a text PATH '$') EMPTY ARRAY ON ERROR); +\sv json_table_view9; + +DROP VIEW json_table_view8, json_table_view9; diff --git a/src/test/regress/sql/sqljson_queryfuncs.sql b/src/test/regress/sql/sqljson_queryfuncs.sql new file mode 100644 index 0000000000000..8d7b225b61217 --- /dev/null +++ b/src/test/regress/sql/sqljson_queryfuncs.sql @@ -0,0 +1,502 @@ +-- JSON_EXISTS +SELECT JSON_EXISTS(NULL::jsonb, '$'); +SELECT JSON_EXISTS(jsonb '[]', '$'); +SELECT JSON_EXISTS(JSON_OBJECT(RETURNING jsonb), '$'); + +SELECT JSON_EXISTS(jsonb '1', '$'); +SELECT JSON_EXISTS(jsonb 'null', '$'); +SELECT JSON_EXISTS(jsonb '[]', '$'); + +SELECT JSON_EXISTS(jsonb '1', '$.a'); +SELECT JSON_EXISTS(jsonb '1', 'strict $.a'); -- FALSE on error +SELECT JSON_EXISTS(jsonb '1', 'strict $.a' ERROR ON ERROR); +SELECT JSON_EXISTS(jsonb 'null', '$.a'); +SELECT JSON_EXISTS(jsonb '[]', '$.a'); +SELECT JSON_EXISTS(jsonb '[1, "aaa", {"a": 1}]', 'strict $.a'); -- FALSE on error +SELECT JSON_EXISTS(jsonb '[1, "aaa", {"a": 1}]', 'lax $.a'); +SELECT JSON_EXISTS(jsonb '{}', '$.a'); +SELECT JSON_EXISTS(jsonb '{"b": 1, "a": 2}', '$.a'); + +SELECT JSON_EXISTS(jsonb '1', '$.a.b'); +SELECT JSON_EXISTS(jsonb '{"a": {"b": 1}}', '$.a.b'); +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.a.b'); + +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x)' PASSING 1 AS x); +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x)' PASSING '1' AS x); +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x && @ < $y)' PASSING 0 AS x, 2 AS y); +SELECT JSON_EXISTS(jsonb '{"a": 1, "b": 2}', '$.* ? (@ > $x && @ < $y)' PASSING 0 AS x, 1 AS y); + +-- extension: boolean expressions +SELECT JSON_EXISTS(jsonb '1', '$ > 2'); +SELECT JSON_EXISTS(jsonb '1', '$.a > 2' ERROR ON ERROR); + +-- JSON_VALUE +SELECT JSON_VALUE(NULL::jsonb, '$'); + +SELECT JSON_VALUE(jsonb 'null', '$'); +SELECT JSON_VALUE(jsonb 'null', '$' RETURNING int); + +SELECT JSON_VALUE(jsonb 'true', '$'); +SELECT JSON_VALUE(jsonb 'true', '$' RETURNING bool); + +SELECT JSON_VALUE(jsonb '123', '$'); +SELECT JSON_VALUE(jsonb '123', '$' RETURNING int) + 234; +SELECT JSON_VALUE(jsonb '123', '$' RETURNING text); +/* jsonb bytea ??? */ +SELECT JSON_VALUE(jsonb '123', '$' RETURNING bytea ERROR ON ERROR); + +SELECT JSON_VALUE(jsonb '1.23', '$'); +SELECT JSON_VALUE(jsonb '1.23', '$' RETURNING int); +SELECT JSON_VALUE(jsonb '"1.23"', '$' RETURNING numeric); +SELECT JSON_VALUE(jsonb '"1.23"', '$' RETURNING int ERROR ON ERROR); + +SELECT JSON_VALUE(jsonb '"aaa"', '$'); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING text); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char(5)); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char(2) ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char(2)); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING char(3) ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING json); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING jsonb); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING json ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING jsonb ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '"\"aaa\""', '$' RETURNING json); +SELECT JSON_VALUE(jsonb '"\"aaa\""', '$' RETURNING jsonb); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING int); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING int ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '"aaa"', '$' RETURNING int DEFAULT 111 ON ERROR); +SELECT JSON_VALUE(jsonb '"123"', '$' RETURNING int) + 234; + +SELECT JSON_VALUE(jsonb '"2017-02-20"', '$' RETURNING date) + 9; + +-- Test NULL checks execution in domain types +CREATE DOMAIN sqljsonb_int_not_null AS int NOT NULL; +SELECT JSON_VALUE(jsonb 'null', '$' RETURNING sqljsonb_int_not_null); +SELECT JSON_VALUE(jsonb 'null', '$' RETURNING sqljsonb_int_not_null ERROR ON ERROR); +SELECT JSON_VALUE(jsonb 'null', '$' RETURNING sqljsonb_int_not_null DEFAULT 2 ON EMPTY ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '1', '$.a' RETURNING sqljsonb_int_not_null DEFAULT 2 ON EMPTY ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '1', '$.a' RETURNING sqljsonb_int_not_null DEFAULT NULL ON EMPTY ERROR ON ERROR); +CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple'); +CREATE DOMAIN rgb AS rainbow CHECK (VALUE IN ('red', 'green', 'blue')); +SELECT JSON_VALUE('"purple"'::jsonb, 'lax $[*]' RETURNING rgb); +SELECT JSON_VALUE('"purple"'::jsonb, 'lax $[*]' RETURNING rgb ERROR ON ERROR); + +SELECT JSON_VALUE(jsonb '[]', '$'); +SELECT JSON_VALUE(jsonb '[]', '$' ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '{}', '$'); +SELECT JSON_VALUE(jsonb '{}', '$' ERROR ON ERROR); + +SELECT JSON_VALUE(jsonb '1', '$.a'); +SELECT JSON_VALUE(jsonb '1', 'strict $.a' ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'strict $.a' DEFAULT 'error' ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'lax $.a' ERROR ON ERROR); -- NULL ON EMPTY +SELECT JSON_VALUE(jsonb '1', 'lax $.a' ERROR ON EMPTY ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'strict $.*' DEFAULT 2 ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'lax $.a' DEFAULT 2 ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'lax $.a' DEFAULT '2' ON EMPTY); +SELECT JSON_VALUE(jsonb '1', 'lax $.a' NULL ON EMPTY DEFAULT '2' ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'lax $.a' DEFAULT '2' ON EMPTY DEFAULT '3' ON ERROR); +SELECT JSON_VALUE(jsonb '1', 'lax $.a' ERROR ON EMPTY DEFAULT '3' ON ERROR); + +SELECT JSON_VALUE(jsonb '[1,2]', '$[*]' ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '[1,2]', '$[*]' DEFAULT '0' ON ERROR); +SELECT JSON_VALUE(jsonb '[" "]', '$[*]' RETURNING int ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '[" "]', '$[*]' RETURNING int DEFAULT 2 + 3 ON ERROR); +SELECT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING int DEFAULT 2 + 3 ON ERROR); +SELECT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING int FORMAT JSON); -- RETURNING FORMAT not allowed + +-- RETUGNING pseudo-types not allowed +SELECT JSON_VALUE(jsonb '["1"]', '$[*]' RETURNING record); + +SELECT + x, + JSON_VALUE( + jsonb '{"a": 1, "b": 2}', + '$.* ? (@ > $x)' PASSING x AS x + RETURNING int + DEFAULT -1 ON EMPTY + DEFAULT -2 ON ERROR + ) y +FROM + generate_series(0, 2) x; + +SELECT JSON_VALUE(jsonb 'null', '$a' PASSING point ' (1, 2 )' AS a); +SELECT JSON_VALUE(jsonb 'null', '$a' PASSING point ' (1, 2 )' AS a RETURNING point); +SELECT JSON_VALUE(jsonb 'null', '$a' PASSING point ' (1, 2 )' AS a RETURNING point ERROR ON ERROR); + +-- Test PASSING and RETURNING date/time types +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts); +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING timestamptz); +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING timestamp); +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING date '2018-02-21 12:34:56 +10' AS ts RETURNING date); +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING time '2018-02-21 12:34:56 +10' AS ts RETURNING time); +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timetz '2018-02-21 12:34:56 +10' AS ts RETURNING timetz); +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamp '2018-02-21 12:34:56 +10' AS ts RETURNING timestamp); + +-- Also test RETURNING json[b] +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING json); +SELECT JSON_VALUE(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING jsonb); + +-- Test that numeric JSON values are coerced uniformly +select json_value('{"a": 1.234}', '$.a' returning int error on error); +select json_value('{"a": "1.234"}', '$.a' returning int error on error); + +-- JSON_QUERY + +SELECT JSON_VALUE(NULL::jsonb, '$'); + +SELECT + JSON_QUERY(js, '$') AS "unspec", + JSON_QUERY(js, '$' WITHOUT WRAPPER) AS "without", + JSON_QUERY(js, '$' WITH CONDITIONAL WRAPPER) AS "with cond", + JSON_QUERY(js, '$' WITH UNCONDITIONAL ARRAY WRAPPER) AS "with uncond", + JSON_QUERY(js, '$' WITH ARRAY WRAPPER) AS "with" +FROM + (VALUES + (jsonb 'null'), + ('12.3'), + ('true'), + ('"aaa"'), + ('[1, null, "2"]'), + ('{"a": 1, "b": [2]}') + ) foo(js); + +SELECT + JSON_QUERY(js, 'strict $[*]') AS "unspec", + JSON_QUERY(js, 'strict $[*]' WITHOUT WRAPPER) AS "without", + JSON_QUERY(js, 'strict $[*]' WITH CONDITIONAL WRAPPER) AS "with cond", + JSON_QUERY(js, 'strict $[*]' WITH UNCONDITIONAL ARRAY WRAPPER) AS "with uncond", + JSON_QUERY(js, 'strict $[*]' WITH ARRAY WRAPPER) AS "with" +FROM + (VALUES + (jsonb '1'), + ('[]'), + ('[null]'), + ('[12.3]'), + ('[true]'), + ('["aaa"]'), + ('[[1, 2, 3]]'), + ('[{"a": 1, "b": [2]}]'), + ('[1, "2", null, [3]]') + ) foo(js); + +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text KEEP QUOTES); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text KEEP QUOTES ON SCALAR STRING); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text OMIT QUOTES); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING text OMIT QUOTES ON SCALAR STRING); +SELECT JSON_QUERY(jsonb '"aaa"', '$' OMIT QUOTES ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING json OMIT QUOTES ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING bytea FORMAT JSON OMIT QUOTES ERROR ON ERROR); + +-- Behavior when a RETURNING type has typmod != -1 +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING char(3) ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING char(3)); +SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING char(3) OMIT QUOTES ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '"aaa"', '$.a' RETURNING char(2) OMIT QUOTES DEFAULT 'bb' ON EMPTY); +SELECT JSON_QUERY(jsonb '"aaa"', '$.a' RETURNING char(2) OMIT QUOTES DEFAULT '"bb"'::jsonb ON EMPTY); + +-- OMIT QUOTES behavior should not be specified when WITH WRAPPER used: +-- Should fail +SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER OMIT QUOTES); +SELECT JSON_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER OMIT QUOTES); +-- Should succeed +SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITH CONDITIONAL WRAPPER KEEP QUOTES); +SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITH UNCONDITIONAL WRAPPER KEEP QUOTES); +SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITH WRAPPER KEEP QUOTES); +SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITHOUT WRAPPER OMIT QUOTES); +SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITHOUT WRAPPER KEEP QUOTES); + +-- test QUOTES behavior. +SELECT JSON_QUERY(jsonb'{"rec": "{1,2,3}"}', '$.rec' returning int[] omit quotes); +SELECT JSON_QUERY(jsonb'{"rec": "{1,2,3}"}', '$.rec' returning int[] keep quotes); +SELECT JSON_QUERY(jsonb'{"rec": "{1,2,3}"}', '$.rec' returning int[] keep quotes error on error); +SELECT JSON_QUERY(jsonb'{"rec": "[1,2]"}', '$.rec' returning int4range omit quotes); +SELECT JSON_QUERY(jsonb'{"rec": "[1,2]"}', '$.rec' returning int4range keep quotes); +SELECT JSON_QUERY(jsonb'{"rec": "[1,2]"}', '$.rec' returning int4range keep quotes error on error); +CREATE DOMAIN qf_char_domain AS char(1); +CREATE DOMAIN qf_jsonb_domain AS jsonb; +SELECT JSON_QUERY(jsonb '"1"', '$' RETURNING qf_char_domain OMIT QUOTES ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '"1"', '$' RETURNING qf_jsonb_domain OMIT QUOTES ERROR ON ERROR); +DROP DOMAIN qf_char_domain, qf_jsonb_domain; + +SELECT JSON_QUERY(jsonb '[]', '$[*]'); +SELECT JSON_QUERY(jsonb '[]', '$[*]' NULL ON EMPTY); +SELECT JSON_QUERY(jsonb '[]', '$[*]' EMPTY ON EMPTY); +SELECT JSON_QUERY(jsonb '[]', '$[*]' EMPTY ARRAY ON EMPTY); +SELECT JSON_QUERY(jsonb '[]', '$[*]' EMPTY OBJECT ON EMPTY); +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY); +SELECT JSON_QUERY(jsonb '[]', '$[*]' DEFAULT '"empty"' ON EMPTY); + +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY NULL ON ERROR); +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY EMPTY ARRAY ON ERROR); +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY EMPTY OBJECT ON ERROR); +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON EMPTY ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '[]', '$[*]' ERROR ON ERROR); -- NULL ON EMPTY + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' DEFAULT '"empty"' ON ERROR); + +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING json); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING json FORMAT JSON); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING jsonb); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING jsonb FORMAT JSON); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING text); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING char(10)); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING text FORMAT JSON); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING bytea); +SELECT JSON_QUERY(jsonb '[1,2]', '$' RETURNING bytea FORMAT JSON); + +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING bytea EMPTY OBJECT ON ERROR); +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING bytea FORMAT JSON EMPTY OBJECT ON ERROR); +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING json EMPTY OBJECT ON ERROR); +SELECT JSON_QUERY(jsonb '[1,2]', '$[*]' RETURNING jsonb EMPTY OBJECT ON ERROR); +SELECT JSON_QUERY(jsonb '[3,4]', '$[*]' RETURNING bigint[] EMPTY OBJECT ON ERROR); +SELECT JSON_QUERY(jsonb '"[3,4]"', '$[*]' RETURNING bigint[] EMPTY OBJECT ON ERROR); + +-- Coercion fails with quotes on +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING int2 error on error); +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING int4 error on error); +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING int8 error on error); +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING bool error on error); +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING numeric error on error); +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING real error on error); +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING float8 error on error); +-- Fine with OMIT QUOTES +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING int2 omit quotes error on error); +SELECT JSON_QUERY(jsonb '"123.1"', '$' RETURNING float8 omit quotes error on error); + +-- RETUGNING pseudo-types not allowed +SELECT JSON_QUERY(jsonb '[3,4]', '$[*]' RETURNING anyarray EMPTY OBJECT ON ERROR); + +SELECT + x, y, + JSON_QUERY( + jsonb '[1,2,3,4,5,null]', + '$[*] ? (@ >= $x && @ <= $y)' + PASSING x AS x, y AS y + WITH CONDITIONAL WRAPPER + EMPTY ARRAY ON EMPTY + ) list +FROM + generate_series(0, 4) x, + generate_series(0, 4) y; + +-- record type returning with quotes behavior. +CREATE TYPE comp_abc AS (a text, b int, c timestamp); +SELECT JSON_QUERY(jsonb'{"rec": "(abc,42,01.02.2003)"}', '$.rec' returning comp_abc omit quotes); +SELECT JSON_QUERY(jsonb'{"rec": "(abc,42,01.02.2003)"}', '$.rec' returning comp_abc keep quotes); +SELECT JSON_QUERY(jsonb'{"rec": "(abc,42,01.02.2003)"}', '$.rec' returning comp_abc keep quotes error on error); +DROP TYPE comp_abc; + +-- Extension: record types returning +CREATE TYPE sqljsonb_rec AS (a int, t text, js json, jb jsonb, jsa json[]); +CREATE TYPE sqljsonb_reca AS (reca sqljsonb_rec[]); + +SELECT JSON_QUERY(jsonb '[{"a": 1, "b": "foo", "t": "aaa", "js": [1, "2", {}], "jb": {"x": [1, "2", {}]}}, {"a": 2}]', '$[0]' RETURNING sqljsonb_rec); +SELECT JSON_QUERY(jsonb '[{"a": "a", "b": "foo", "t": "aaa", "js": [1, "2", {}], "jb": {"x": [1, "2", {}]}}, {"a": 2}]', '$[0]' RETURNING sqljsonb_rec ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '[{"a": "a", "b": "foo", "t": "aaa", "js": [1, "2", {}], "jb": {"x": [1, "2", {}]}}, {"a": 2}]', '$[0]' RETURNING sqljsonb_rec); +SELECT * FROM unnest((JSON_QUERY(jsonb '{"jsa": [{"a": 1, "b": ["foo"]}, {"a": 2, "c": {}}, 123]}', '$' RETURNING sqljsonb_rec)).jsa); +SELECT * FROM unnest((JSON_QUERY(jsonb '{"reca": [{"a": 1, "t": ["foo", []]}, {"a": 2, "jb": [{}, true]}]}', '$' RETURNING sqljsonb_reca)).reca); + +SELECT JSON_QUERY(jsonb '[{"a": 1, "b": "foo", "t": "aaa", "js": [1, "2", {}], "jb": {"x": [1, "2", {}]}}, {"a": 2}]', '$[0]' RETURNING jsonpath); +SELECT JSON_QUERY(jsonb '[{"a": 1, "b": "foo", "t": "aaa", "js": [1, "2", {}], "jb": {"x": [1, "2", {}]}}, {"a": 2}]', '$[0]' RETURNING jsonpath ERROR ON ERROR); + +-- Extension: array types returning +SELECT JSON_QUERY(jsonb '[1,2,null,"3"]', '$[*]' RETURNING int[] WITH WRAPPER); +SELECT JSON_QUERY(jsonb '[1,2,null,"a"]', '$[*]' RETURNING int[] WITH WRAPPER ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '[1,2,null,"a"]', '$[*]' RETURNING int[] WITH WRAPPER); +SELECT * FROM unnest(JSON_QUERY(jsonb '[{"a": 1, "t": ["foo", []]}, {"a": 2, "jb": [{}, true]}]', '$' RETURNING sqljsonb_rec[])); + +-- Extension: domain types returning +SELECT JSON_QUERY(jsonb '{"a": 1}', '$.a' RETURNING sqljsonb_int_not_null); +SELECT JSON_QUERY(jsonb '{"a": 1}', '$.b' RETURNING sqljsonb_int_not_null); +SELECT JSON_QUERY(jsonb '{"a": 1}', '$.b' RETURNING sqljsonb_int_not_null ERROR ON EMPTY ERROR ON ERROR); + +-- Test timestamptz passing and output +SELECT JSON_QUERY(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts); +SELECT JSON_QUERY(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING json); +SELECT JSON_QUERY(jsonb 'null', '$ts' PASSING timestamptz '2018-02-21 12:34:56 +10' AS ts RETURNING jsonb); + +-- Test constraints + +CREATE TABLE test_jsonb_constraints ( + js text, + i int, + x jsonb DEFAULT JSON_QUERY(jsonb '[1,2]', '$[*]' WITH WRAPPER) + CONSTRAINT test_jsonb_constraint1 + CHECK (js IS JSON) + CONSTRAINT test_jsonb_constraint2 + CHECK (JSON_EXISTS(js::jsonb, '$.a' PASSING i + 5 AS int, i::text AS "TXT", array[1,2,3] as arr)) + CONSTRAINT test_jsonb_constraint3 + CHECK (JSON_VALUE(js::jsonb, '$.a' RETURNING int DEFAULT '12' ON EMPTY ERROR ON ERROR) > i) + CONSTRAINT test_jsonb_constraint4 + CHECK (JSON_QUERY(js::jsonb, '$.a' WITH CONDITIONAL WRAPPER EMPTY OBJECT ON ERROR) = jsonb '[10]') + CONSTRAINT test_jsonb_constraint5 + CHECK (JSON_QUERY(js::jsonb, '$.a' RETURNING char(5) OMIT QUOTES EMPTY ARRAY ON EMPTY) > 'a' COLLATE "C") +); + +\d test_jsonb_constraints + +SELECT check_clause +FROM information_schema.check_constraints +WHERE constraint_name LIKE 'test_jsonb_constraint%' +ORDER BY 1; + +SELECT pg_get_expr(adbin, adrelid) +FROM pg_attrdef +WHERE adrelid = 'test_jsonb_constraints'::regclass +ORDER BY 1; + +INSERT INTO test_jsonb_constraints VALUES ('', 1); +INSERT INTO test_jsonb_constraints VALUES ('1', 1); +INSERT INTO test_jsonb_constraints VALUES ('[]'); +INSERT INTO test_jsonb_constraints VALUES ('{"b": 1}', 1); +INSERT INTO test_jsonb_constraints VALUES ('{"a": 1}', 1); +INSERT INTO test_jsonb_constraints VALUES ('{"a": 10}', 1); + +DROP TABLE test_jsonb_constraints; + +-- Test mutabilily of query functions +CREATE TABLE test_jsonb_mutability(js jsonb, b int); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a[0]')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.time()')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.date()')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.time_tz()')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.timestamp()')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.timestamp_tz()')); + +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.date() < $.time_tz())')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.date() < $.time())')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.time() < $.time())')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.time() < $.time_tz())')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp() < $.timestamp_tz())')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp_tz() < $.timestamp_tz())')); + +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.time() < $.datetime("HH:MI TZH"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.date() < $.datetime("HH:MI TZH"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp() < $.datetime("HH:MI TZH"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp() < $.datetime("HH:MI"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp_tz() < $.datetime("HH:MI TZH"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp_tz() < $.datetime("HH:MI"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.date() < $x' PASSING '12:34'::timetz AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.date() < $x' PASSING '1234'::int AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.timestamp(2) < $.timestamp(3))')); + +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime()')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@ < $.datetime())')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime() < $.datetime())')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime() < $.datetime("HH:MI TZH"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime("HH:MI TZH") < $.datetime("HH:MI TZH"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime("HH:MI") < $.datetime("YY-MM-DD HH:MI"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.a ? (@.datetime("HH:MI TZH") < $.datetime("YY-MM-DD HH:MI"))')); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime("HH:MI TZH") < $x' PASSING '12:34'::timetz AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime("HH:MI TZH") < $y' PASSING '12:34'::timetz AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime() < $x' PASSING '12:34'::timetz AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime() < $x' PASSING '1234'::int AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime() ? (@ == $x)' PASSING '12:34'::time AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$.datetime("YY-MM-DD") ? (@ == $x)' PASSING '2020-07-14'::date AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, $.a ? (@.datetime() == $x)]' PASSING '12:34'::time AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, 0 to $.a ? (@.datetime() == $x)]' PASSING '12:34'::time AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_QUERY(js, '$[1, $.a ? (@.datetime("HH:MI") == $x)]' PASSING '12:34'::time AS x)); +CREATE INDEX ON test_jsonb_mutability (JSON_VALUE(js, '$' DEFAULT random()::int ON ERROR)); + +-- DEFAULT expression +CREATE OR REPLACE FUNCTION ret_setint() RETURNS SETOF integer AS +$$ +BEGIN + RETURN QUERY EXECUTE 'select 1 union all select 1'; +END; +$$ +LANGUAGE plpgsql IMMUTABLE; +SELECT JSON_QUERY(js, '$' RETURNING int DEFAULT ret_setint() ON ERROR) FROM test_jsonb_mutability; +SELECT JSON_QUERY(js, '$' RETURNING int DEFAULT b + 1 ON ERROR) FROM test_jsonb_mutability; +SELECT JSON_QUERY(js, '$' RETURNING int DEFAULT sum(1) over() ON ERROR) FROM test_jsonb_mutability; +SELECT JSON_QUERY(js, '$' RETURNING int DEFAULT (SELECT 1) ON ERROR) FROM test_jsonb_mutability; +DROP TABLE test_jsonb_mutability; +DROP FUNCTION ret_setint; + +CREATE DOMAIN queryfuncs_test_domain AS text CHECK (value <> 'foo'); +SELECT JSON_VALUE(jsonb '{"d1": "H"}', '$.a2' RETURNING queryfuncs_test_domain DEFAULT 'foo'::queryfuncs_test_domain ON EMPTY); +SELECT JSON_VALUE(jsonb '{"d1": "H"}', '$.a2' RETURNING queryfuncs_test_domain DEFAULT 'foo1'::queryfuncs_test_domain ON EMPTY); +SELECT JSON_VALUE(jsonb '{"d1": "H"}', '$.a2' RETURNING queryfuncs_test_domain DEFAULT '"foo1"'::jsonb::text ON EMPTY); +SELECT JSON_VALUE(jsonb '{"d1": "foo"}', '$.a2' RETURNING queryfuncs_test_domain DEFAULT 'foo1'::queryfuncs_test_domain ON EMPTY); + +-- Check the cases where a coercion-related expression is masking an +-- unsupported expressions + +-- CoerceViaIO +SELECT JSON_QUERY('"a"', '$.a' RETURNING int DEFAULT (SELECT '"1"')::jsonb ON ERROR); +-- CoerceToDomain +SELECT JSON_QUERY('"a"', '$.a' RETURNING queryfuncs_test_domain DEFAULT (select '"1"')::queryfuncs_test_domain ON ERROR); +-- RelabelType +SELECT JSON_QUERY('"a"', '$.a' RETURNING int DEFAULT (SELECT 1)::oid::int ON ERROR); +-- ArrayCoerceExpr +SELECT JSON_QUERY('"a"', '$.a' RETURNING int[] DEFAULT (SELECT '{1}')::oid[]::int[] ON ERROR); +-- CollateExpr +SELECT JSON_QUERY('"a"', '$.a' RETURNING int[] DEFAULT (SELECT '{1}')::text COLLATE "C" ON ERROR); +-- ConvertRowtypeExpr +CREATE TABLE someparent (a int); +CREATE TABLE somechild () INHERITS (someparent); +SELECT JSON_QUERY('"a"', '$.a' RETURNING someparent DEFAULT (SELECT '(1)')::somechild::someparent ON ERROR); + +DROP DOMAIN queryfuncs_test_domain; +DROP TABLE someparent, somechild; + +-- Extension: non-constant JSON path +SELECT JSON_EXISTS(jsonb '{"a": 123}', '$' || '.' || 'a'); +SELECT JSON_VALUE(jsonb '{"a": 123}', '$' || '.' || 'a'); +SELECT JSON_VALUE(jsonb '{"a": 123}', '$' || '.' || 'b' DEFAULT 'foo' ON EMPTY); +SELECT JSON_QUERY(jsonb '{"a": 123}', '$' || '.' || 'a'); +SELECT JSON_QUERY(jsonb '{"a": 123}', '$' || '.' || 'a' WITH WRAPPER); +-- Should fail (invalid path) +SELECT JSON_QUERY(jsonb '{"a": 123}', 'error' || ' ' || 'error'); + +-- Non-jsonb inputs automatically coerced to jsonb +SELECT JSON_EXISTS(json '{"a": 123}', '$' || '.' || 'a'); +SELECT JSON_QUERY(NULL FORMAT JSON, '$'); + +-- Test non-const jsonpath +CREATE TEMP TABLE jsonpaths (path) AS SELECT '$'; +SELECT json_value('"aaa"', path RETURNING json) FROM jsonpaths; + +-- Test PASSING argument parsing +SELECT JSON_QUERY(jsonb 'null', '$xyz' PASSING 1 AS xy); +SELECT JSON_QUERY(jsonb 'null', '$xy' PASSING 1 AS xyz); +SELECT JSON_QUERY(jsonb 'null', '$xyz' PASSING 1 AS xyz); +SELECT JSON_QUERY(jsonb 'null', '$Xyz' PASSING 1 AS Xyz); +SELECT JSON_QUERY(jsonb 'null', '$Xyz' PASSING 1 AS "Xyz"); +SELECT JSON_QUERY(jsonb 'null', '$"Xyz"' PASSING 1 AS "Xyz"); + +-- Test ON ERROR / EMPTY value validity for the function; all fail. +SELECT JSON_EXISTS(jsonb '1', '$' DEFAULT 1 ON ERROR); +SELECT JSON_VALUE(jsonb '1', '$' EMPTY ON ERROR); +SELECT JSON_QUERY(jsonb '1', '$' TRUE ON ERROR); + +-- Test implicit coercion to a domain over fixed-length type specified in +-- RETURNING +CREATE DOMAIN queryfuncs_char2 AS char(2); +CREATE DOMAIN queryfuncs_char2_chk AS char(2) CHECK (VALUE NOT IN ('12')); +SELECT JSON_QUERY(jsonb '123', '$' RETURNING queryfuncs_char2 ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '123', '$' RETURNING queryfuncs_char2 DEFAULT '1' ON ERROR); +SELECT JSON_QUERY(jsonb '123', '$' RETURNING queryfuncs_char2_chk ERROR ON ERROR); +SELECT JSON_QUERY(jsonb '123', '$' RETURNING queryfuncs_char2_chk DEFAULT '1' ON ERROR); +SELECT JSON_VALUE(jsonb '123', '$' RETURNING queryfuncs_char2 ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '123', '$' RETURNING queryfuncs_char2 DEFAULT 1 ON ERROR); +SELECT JSON_VALUE(jsonb '123', '$' RETURNING queryfuncs_char2_chk ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '123', '$' RETURNING queryfuncs_char2_chk DEFAULT 1 ON ERROR); +DROP DOMAIN queryfuncs_char2, queryfuncs_char2_chk; + +-- Test coercion to domain over another fixed-length type of the ON ERROR / +-- EMPTY expressions. Ask user to cast the DEFAULT expression explicitly if +-- automatic casting cannot be done, for example, from int to bit(2). +CREATE DOMAIN queryfuncs_d_varbit3 AS varbit(3) CHECK (VALUE <> '01'); +SELECT JSON_VALUE(jsonb '1234', '$' RETURNING queryfuncs_d_varbit3 DEFAULT '111111' ON ERROR); +SELECT JSON_VALUE(jsonb '1234', '$' RETURNING queryfuncs_d_varbit3 DEFAULT '010' ON ERROR); +SELECT JSON_VALUE(jsonb '1234', '$' RETURNING queryfuncs_d_varbit3 DEFAULT '01' ON ERROR); +SELECT JSON_VALUE(jsonb '"111"', '$' RETURNING bit(2) ERROR ON ERROR); +SELECT JSON_VALUE(jsonb '1234', '$' RETURNING bit(3) DEFAULT 1 ON ERROR); +SELECT JSON_VALUE(jsonb '1234', '$' RETURNING bit(3) DEFAULT 1::bit(3) ON ERROR); +SELECT JSON_VALUE(jsonb '"111"', '$.a' RETURNING bit(3) DEFAULT '1111' ON EMPTY); +DROP DOMAIN queryfuncs_d_varbit3; diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index fddf5a8277d4a..ed0bc1ef0745b 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -376,6 +376,36 @@ COMMIT; SELECT seq_scan, :'test_last_seq' = last_seq_scan AS seq_ok, idx_scan, :'test_last_idx' < last_idx_scan AS idx_ok FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass; +----- +-- Test reset of some stats for shared table +----- + +-- This updates the comment of the database currently in use in +-- pg_shdescription with a fake value, then sets it back to its +-- original value. +SELECT shobj_description(d.oid, 'pg_database') as description_before + FROM pg_database d WHERE datname = current_database() \gset + +-- force some stats in pg_shdescription. +BEGIN; +SELECT current_database() as datname \gset +COMMENT ON DATABASE :"datname" IS 'This is a test comment'; +SELECT pg_stat_force_next_flush(); +COMMIT; + +-- check that the stats are reset. +SELECT (n_tup_ins + n_tup_upd) > 0 AS has_data FROM pg_stat_all_tables + WHERE relid = 'pg_shdescription'::regclass; +SELECT pg_stat_reset_single_table_counters('pg_shdescription'::regclass); +SELECT (n_tup_ins + n_tup_upd) > 0 AS has_data FROM pg_stat_all_tables + WHERE relid = 'pg_shdescription'::regclass; + +-- set back comment +\if :{?description_before} + COMMENT ON DATABASE :"datname" IS :'description_before'; +\else + COMMENT ON DATABASE :"datname" IS NULL; +\endif ----- -- Test that various stats views are being properly populated @@ -387,8 +417,8 @@ SELECT sessions AS db_stat_sessions FROM pg_stat_database WHERE datname = (SELEC SELECT pg_stat_force_next_flush(); SELECT sessions > :db_stat_sessions FROM pg_stat_database WHERE datname = (SELECT current_database()); --- Test pg_stat_bgwriter checkpointer-related stats, together with pg_stat_wal -SELECT checkpoints_req AS rqst_ckpts_before FROM pg_stat_bgwriter \gset +-- Test pg_stat_checkpointer checkpointer-related stats, together with pg_stat_wal +SELECT num_requested AS rqst_ckpts_before FROM pg_stat_checkpointer \gset -- Test pg_stat_wal (and make a temp table so our temp schema exists) SELECT wal_bytes AS wal_bytes_before FROM pg_stat_wal \gset @@ -402,7 +432,7 @@ DROP TABLE test_stats_temp; CHECKPOINT; CHECKPOINT; -SELECT checkpoints_req > :rqst_ckpts_before FROM pg_stat_bgwriter; +SELECT num_requested > :rqst_ckpts_before FROM pg_stat_checkpointer; SELECT wal_bytes > :wal_bytes_before FROM pg_stat_wal; -- Test pg_stat_get_backend_idset() and some allied functions. @@ -417,40 +447,49 @@ WHERE pg_stat_get_backend_pid(beid) = pg_backend_pid(); ----- -- Test that reset_slru with a specified SLRU works. -SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'CommitTs' \gset -SELECT stats_reset AS slru_notify_reset_ts FROM pg_stat_slru WHERE name = 'Notify' \gset -SELECT pg_stat_reset_slru('CommitTs'); -SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'CommitTs'; -SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'CommitTs' \gset +SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'commit_timestamp' \gset +SELECT stats_reset AS slru_notify_reset_ts FROM pg_stat_slru WHERE name = 'notify' \gset +SELECT pg_stat_reset_slru('commit_timestamp'); +SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'commit_timestamp'; +SELECT stats_reset AS slru_commit_ts_reset_ts FROM pg_stat_slru WHERE name = 'commit_timestamp' \gset -- Test that multiple SLRUs are reset when no specific SLRU provided to reset function -SELECT pg_stat_reset_slru(NULL); -SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'CommitTs'; -SELECT stats_reset > :'slru_notify_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'Notify'; +SELECT pg_stat_reset_slru(); +SELECT stats_reset > :'slru_commit_ts_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'commit_timestamp'; +SELECT stats_reset > :'slru_notify_reset_ts'::timestamptz FROM pg_stat_slru WHERE name = 'notify'; -- Test that reset_shared with archiver specified as the stats type works SELECT stats_reset AS archiver_reset_ts FROM pg_stat_archiver \gset SELECT pg_stat_reset_shared('archiver'); SELECT stats_reset > :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver; -SELECT stats_reset AS archiver_reset_ts FROM pg_stat_archiver \gset -- Test that reset_shared with bgwriter specified as the stats type works SELECT stats_reset AS bgwriter_reset_ts FROM pg_stat_bgwriter \gset SELECT pg_stat_reset_shared('bgwriter'); SELECT stats_reset > :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter; -SELECT stats_reset AS bgwriter_reset_ts FROM pg_stat_bgwriter \gset + +-- Test that reset_shared with checkpointer specified as the stats type works +SELECT stats_reset AS checkpointer_reset_ts FROM pg_stat_checkpointer \gset +SELECT pg_stat_reset_shared('checkpointer'); +SELECT stats_reset > :'checkpointer_reset_ts'::timestamptz FROM pg_stat_checkpointer; + +-- Test that reset_shared with recovery_prefetch specified as the stats type works +SELECT stats_reset AS recovery_prefetch_reset_ts FROM pg_stat_recovery_prefetch \gset +SELECT pg_stat_reset_shared('recovery_prefetch'); +SELECT stats_reset > :'recovery_prefetch_reset_ts'::timestamptz FROM pg_stat_recovery_prefetch; + +-- Test that reset_shared with slru specified as the stats type works +SELECT max(stats_reset) AS slru_reset_ts FROM pg_stat_slru \gset +SELECT pg_stat_reset_shared('slru'); +SELECT max(stats_reset) > :'slru_reset_ts'::timestamptz FROM pg_stat_slru; -- Test that reset_shared with wal specified as the stats type works SELECT stats_reset AS wal_reset_ts FROM pg_stat_wal \gset SELECT pg_stat_reset_shared('wal'); SELECT stats_reset > :'wal_reset_ts'::timestamptz FROM pg_stat_wal; -SELECT stats_reset AS wal_reset_ts FROM pg_stat_wal \gset --- Test that reset_shared with no specified stats type doesn't reset anything -SELECT pg_stat_reset_shared(NULL); -SELECT stats_reset = :'archiver_reset_ts'::timestamptz FROM pg_stat_archiver; -SELECT stats_reset = :'bgwriter_reset_ts'::timestamptz FROM pg_stat_bgwriter; -SELECT stats_reset = :'wal_reset_ts'::timestamptz FROM pg_stat_wal; +-- Test error case for reset_shared with unknown stats type +SELECT pg_stat_reset_shared('unknown'); -- Test that reset works for pg_stat_database @@ -678,7 +717,11 @@ SELECT :io_sum_local_new_tblspc_writes > :io_sum_local_after_writes; RESET temp_buffers; -- Test that reuse of strategy buffers and reads of blocks into these reused --- buffers while VACUUMing are tracked in pg_stat_io. +-- buffers while VACUUMing are tracked in pg_stat_io. If there is sufficient +-- demand for shared buffers from concurrent queries, some buffers may be +-- pinned by other backends before they can be reused. In such cases, the +-- backend will evict a buffer from outside the ring and add it to the +-- ring. This is considered an eviction and not a reuse. -- Set wal_skip_threshold smaller than the expected size of -- test_io_vac_strategy so that, even if wal_level is minimal, VACUUM FULL will @@ -687,21 +730,22 @@ RESET temp_buffers; -- shared buffers -- preventing us from testing BAS_VACUUM BufferAccessStrategy -- reads. SET wal_skip_threshold = '1 kB'; -SELECT sum(reuses) AS reuses, sum(reads) AS reads +SELECT sum(reuses) AS reuses, sum(reads) AS reads, sum(evictions) AS evictions FROM pg_stat_io WHERE context = 'vacuum' \gset io_sum_vac_strategy_before_ CREATE TABLE test_io_vac_strategy(a int, b int) WITH (autovacuum_enabled = 'false'); INSERT INTO test_io_vac_strategy SELECT i, i from generate_series(1, 4500)i; -- Ensure that the next VACUUM will need to perform IO by rewriting the table -- first with VACUUM (FULL). VACUUM (FULL) test_io_vac_strategy; --- Use the minimum BUFFER_USAGE_LIMIT to cause reuses with the smallest table --- possible. +-- Use the minimum BUFFER_USAGE_LIMIT to cause reuses or evictions with the +-- smallest table possible. VACUUM (PARALLEL 0, BUFFER_USAGE_LIMIT 128) test_io_vac_strategy; SELECT pg_stat_force_next_flush(); -SELECT sum(reuses) AS reuses, sum(reads) AS reads +SELECT sum(reuses) AS reuses, sum(reads) AS reads, sum(evictions) AS evictions FROM pg_stat_io WHERE context = 'vacuum' \gset io_sum_vac_strategy_after_ -SELECT :io_sum_vac_strategy_after_reads > :io_sum_vac_strategy_before_reads, - :io_sum_vac_strategy_after_reuses > :io_sum_vac_strategy_before_reuses; +SELECT :io_sum_vac_strategy_after_reads > :io_sum_vac_strategy_before_reads; +SELECT (:io_sum_vac_strategy_after_reuses + :io_sum_vac_strategy_after_evictions) > + (:io_sum_vac_strategy_before_reuses + :io_sum_vac_strategy_before_evictions); RESET wal_skip_threshold; -- Test that extends done by a CTAS, which uses a BAS_BULKWRITE @@ -805,4 +849,20 @@ DROP TABLE brin_hot_3; SET enable_seqscan = on; +-- Test that estimation of relation size works with tuples wider than the +-- relation fillfactor. We create a table with wide inline attributes and +-- low fillfactor, insert rows and then see how many rows EXPLAIN shows +-- before running analyze. We disable autovacuum so that it does not +-- interfere with the test. +CREATE TABLE table_fillfactor ( + n char(1000) +) with (fillfactor=10, autovacuum_enabled=off); + +INSERT INTO table_fillfactor +SELECT 'x' FROM generate_series(1,1000); + +SELECT * FROM check_estimated_rows('SELECT * FROM table_fillfactor'); + +DROP TABLE table_fillfactor; + -- End of Stats Test diff --git a/src/test/regress/sql/stats_ext.sql b/src/test/regress/sql/stats_ext.sql index 90b625a5a2016..0c08a6cc42e89 100644 --- a/src/test/regress/sql/stats_ext.sql +++ b/src/test/regress/sql/stats_ext.sql @@ -234,7 +234,7 @@ WITH (autovacuum_enabled = off); -- over-estimates when using only per-column statistics INSERT INTO ndistinct (a, b, c, filler1) - SELECT i/100, i/100, i/100, cash_words((i/100)::money) + SELECT i/100, i/100, i/100, (i/100) || ' dollars and zero cents' FROM generate_series(1,1000) s(i); ANALYZE ndistinct; @@ -299,7 +299,7 @@ TRUNCATE TABLE ndistinct; -- under-estimates when using only per-column statistics INSERT INTO ndistinct (a, b, c, filler1) SELECT mod(i,13), mod(i,17), mod(i,19), - cash_words(mod(i,23)::int::money) + mod(i,23) || ' dollars and zero cents' FROM generate_series(1,1000) s(i); ANALYZE ndistinct; @@ -1657,9 +1657,36 @@ SET SESSION AUTHORIZATION regress_stats_user1; SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak +-- privilege checks for pg_stats_ext and pg_stats_ext_exprs +RESET SESSION AUTHORIZATION; +CREATE TABLE stats_ext_tbl (id INT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, col TEXT); +INSERT INTO stats_ext_tbl (col) VALUES ('secret'), ('secret'), ('very secret'); +CREATE STATISTICS s_col ON id, col FROM stats_ext_tbl; +CREATE STATISTICS s_expr ON mod(id, 2), lower(col) FROM stats_ext_tbl; +ANALYZE stats_ext_tbl; + +-- unprivileged role should not have access +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT statistics_name, most_common_vals FROM pg_stats_ext x + WHERE tablename = 'stats_ext_tbl' ORDER BY ROW(x.*); +SELECT statistics_name, most_common_vals FROM pg_stats_ext_exprs x + WHERE tablename = 'stats_ext_tbl' ORDER BY ROW(x.*); + +-- give unprivileged role ownership of table +RESET SESSION AUTHORIZATION; +ALTER TABLE stats_ext_tbl OWNER TO regress_stats_user1; + +-- unprivileged role should now have access +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT statistics_name, most_common_vals FROM pg_stats_ext x + WHERE tablename = 'stats_ext_tbl' ORDER BY ROW(x.*); +SELECT statistics_name, most_common_vals FROM pg_stats_ext_exprs x + WHERE tablename = 'stats_ext_tbl' ORDER BY ROW(x.*); + -- Tidy up DROP OPERATOR <<< (int, int); DROP FUNCTION op_leak(int, int); RESET SESSION AUTHORIZATION; +DROP TABLE stats_ext_tbl; DROP SCHEMA tststats CASCADE; DROP USER regress_stats_user1; diff --git a/src/test/regress/sql/strings.sql b/src/test/regress/sql/strings.sql index ca32f6bba530a..395967899290b 100644 --- a/src/test/regress/sql/strings.sql +++ b/src/test/regress/sql/strings.sql @@ -685,10 +685,21 @@ select split_part('joeuser@mydatabase','@',-3) AS "empty string"; select split_part('@joeuser@mydatabase@','@',-2) AS "mydatabase"; -- --- test to_hex +-- test to_bin, to_oct, and to_hex -- -select to_hex(256*256*256 - 1) AS "ffffff"; +select to_bin(-1234) AS "11111111111111111111101100101110"; +select to_bin(-1234::bigint); +select to_bin(256*256*256 - 1) AS "111111111111111111111111"; +select to_bin(256::bigint*256::bigint*256::bigint*256::bigint - 1) AS "11111111111111111111111111111111"; + +select to_oct(-1234) AS "37777775456"; +select to_oct(-1234::bigint) AS "1777777777777777775456"; +select to_oct(256*256*256 - 1) AS "77777777"; +select to_oct(256::bigint*256::bigint*256::bigint*256::bigint - 1) AS "37777777777"; +select to_hex(-1234) AS "fffffb2e"; +select to_hex(-1234::bigint) AS "fffffffffffffb2e"; +select to_hex(256*256*256 - 1) AS "ffffff"; select to_hex(256::bigint*256::bigint*256::bigint*256::bigint - 1) AS "ffffffff"; -- diff --git a/src/test/regress/sql/subscription.sql b/src/test/regress/sql/subscription.sql index 55d7dbc9ab90b..3e5ba4cb8c6c3 100644 --- a/src/test/regress/sql/subscription.sql +++ b/src/test/regress/sql/subscription.sql @@ -94,9 +94,11 @@ ALTER SUBSCRIPTION regress_testsub SET PUBLICATION testpub2, testpub3 WITH (refr ALTER SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist2'; ALTER SUBSCRIPTION regress_testsub SET (slot_name = 'newname'); ALTER SUBSCRIPTION regress_testsub SET (password_required = false); +ALTER SUBSCRIPTION regress_testsub SET (run_as_owner = true); \dRs+ ALTER SUBSCRIPTION regress_testsub SET (password_required = true); +ALTER SUBSCRIPTION regress_testsub SET (run_as_owner = false); -- fail ALTER SUBSCRIPTION regress_testsub SET (slot_name = ''); @@ -330,6 +332,11 @@ REVOKE CREATE ON DATABASE REGRESSION FROM regress_subscription_user3; SET SESSION AUTHORIZATION regress_subscription_user3; ALTER SUBSCRIPTION regress_testsub RENAME TO regress_testsub2; +-- fail - cannot do ALTER SUBSCRIPTION SET (failover) inside transaction block +BEGIN; +ALTER SUBSCRIPTION regress_testsub SET (failover); +COMMIT; + -- ok, owning it is enough for this stuff ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); DROP SUBSCRIPTION regress_testsub; diff --git a/src/test/regress/sql/subselect.sql b/src/test/regress/sql/subselect.sql index 40276708c9926..e5a562c3f5d46 100644 --- a/src/test/regress/sql/subselect.sql +++ b/src/test/regress/sql/subselect.sql @@ -82,6 +82,20 @@ SELECT f1 AS "Correlated Field" WHERE (f1, f2) IN (SELECT f2, CAST(f3 AS int4) FROM SUBSELECT_TBL WHERE f3 IS NOT NULL); +-- Check ROWCOMPARE cases, both correlated and not + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT ROW(1, 2) = (SELECT f1, f2) AS eq FROM SUBSELECT_TBL; + +SELECT ROW(1, 2) = (SELECT f1, f2) AS eq FROM SUBSELECT_TBL; + +EXPLAIN (VERBOSE, COSTS OFF) +SELECT ROW(1, 2) = (SELECT 3, 4) AS eq FROM SUBSELECT_TBL; + +SELECT ROW(1, 2) = (SELECT 3, 4) AS eq FROM SUBSELECT_TBL; + +SELECT ROW(1, 2) = (SELECT f1, f2 FROM SUBSELECT_TBL); -- error + -- Subselects without aliases SELECT count FROM (SELECT COUNT(DISTINCT name) FROM road); @@ -876,6 +890,55 @@ fetch backward all in c1; commit; +-- +-- Verify that we correctly flatten cases involving a subquery output +-- expression that doesn't need to be wrapped in a PlaceHolderVar +-- + +explain (costs off) +select tname, attname from ( +select relname::information_schema.sql_identifier as tname, * from + (select * from pg_class c) ss1) ss2 + right join pg_attribute a on a.attrelid = ss2.oid +where tname = 'tenk1' and attnum = 1; + +select tname, attname from ( +select relname::information_schema.sql_identifier as tname, * from + (select * from pg_class c) ss1) ss2 + right join pg_attribute a on a.attrelid = ss2.oid +where tname = 'tenk1' and attnum = 1; + +-- Check behavior when there's a lateral reference in the output expression +explain (verbose, costs off) +select t1.ten, sum(x) from + tenk1 t1 left join lateral ( + select t1.ten + t2.ten as x, t2.fivethous from tenk1 t2 + ) ss on t1.unique1 = ss.fivethous +group by t1.ten +order by t1.ten; + +select t1.ten, sum(x) from + tenk1 t1 left join lateral ( + select t1.ten + t2.ten as x, t2.fivethous from tenk1 t2 + ) ss on t1.unique1 = ss.fivethous +group by t1.ten +order by t1.ten; + +explain (verbose, costs off) +select t1.q1, x from + int8_tbl t1 left join + (int8_tbl t2 left join + lateral (select t2.q1+t3.q1 as x, * from int8_tbl t3) t3 on t2.q2 = t3.q2) + on t1.q2 = t2.q2 +order by 1, 2; + +select t1.q1, x from + int8_tbl t1 left join + (int8_tbl t2 left join + lateral (select t2.q1+t3.q1 as x, * from int8_tbl t3) t3 on t2.q2 = t3.q2) + on t1.q2 = t2.q2 +order by 1, 2; + -- -- Tests for CTE inlining behavior -- @@ -958,7 +1021,7 @@ explain (verbose, costs off) with x as materialized (select * from int4_tbl) select * from (with y as (select * from x) select * from y) ss; --- Ensure that we inline the currect CTE when there are +-- Ensure that we inline the correct CTE when there are -- multiple CTEs with the same name explain (verbose, costs off) with x as (select 1 as y) @@ -968,3 +1031,41 @@ select * from (with x as (select 2 as y) select * from x) ss; explain (verbose, costs off) with x as (select * from subselect_tbl) select * from x for update; + +-- Pull up direct-correlated ANY_SUBLINKs +explain (costs off) +select * from tenk1 A where hundred in (select hundred from tenk2 B where B.odd = A.odd); + +explain (costs off) +select * from tenk1 A where exists +(select 1 from tenk2 B +where A.hundred in (select C.hundred FROM tenk2 C +WHERE c.odd = b.odd)); + +-- we should only try to pull up the sublink into RHS of a left join +-- but a.hundred is not available. +explain (costs off) +SELECT * FROM tenk1 A LEFT JOIN tenk2 B +ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd); + +-- we should only try to pull up the sublink into RHS of a left join +-- but a.odd is not available for this. +explain (costs off) +SELECT * FROM tenk1 A LEFT JOIN tenk2 B +ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = a.odd); + +-- should be able to pull up since all the references are available. +explain (costs off) +SELECT * FROM tenk1 A LEFT JOIN tenk2 B +ON B.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd); + +-- we can pull up the sublink into the inner JoinExpr. +explain (costs off) +SELECT * FROM tenk1 A INNER JOIN tenk2 B +ON A.hundred in (SELECT c.hundred FROM tenk2 C WHERE c.odd = b.odd) +WHERE a.thousand < 750; + +-- we can pull up the aggregate sublink into RHS of a left join. +explain (costs off) +SELECT * FROM tenk1 A LEFT JOIN tenk2 B +ON B.hundred in (SELECT min(c.hundred) FROM tenk2 C WHERE c.odd = b.odd); diff --git a/src/test/regress/sql/sysviews.sql b/src/test/regress/sql/sysviews.sql index 351e469c77bb7..b047fb55e708b 100644 --- a/src/test/regress/sql/sysviews.sql +++ b/src/test/regress/sql/sysviews.sql @@ -17,6 +17,21 @@ select count(*) >= 0 as ok from pg_available_extensions; select name, ident, parent, level, total_bytes >= free_bytes from pg_backend_memory_contexts where level = 0; +-- We can exercise some MemoryContext type stats functions. Most of the +-- column values are too platform-dependant to display. + +-- Ensure stats from the bump allocator look sane. Bump isn't a commonly +-- used context, but it is used in tuplesort.c, so open a cursor to keep +-- the tuplesort alive long enough for us to query the context stats. +begin; +declare cur cursor for select left(a,10), b + from (values(repeat('a', 512 * 1024),1),(repeat('b', 512),2)) v(a,b) + order by v.a desc; +fetch 1 from cur; +select name, parent, total_bytes > 0, total_nblocks, free_bytes > 0, free_chunks +from pg_backend_memory_contexts where name = 'Caller tuples'; +rollback; + -- At introduction, pg_config had 23 entries; it may grow select count(*) > 20 as ok from pg_config; @@ -55,6 +70,11 @@ select count(*) = 0 as ok from pg_stat_wal_receiver; -- a regression test run. select name, setting from pg_settings where name like 'enable%'; +-- There are always wait event descriptions for various types. InjectionPoint +-- may be present or absent, depending on history since last postmaster start. +select type, count(*) > 0 as ok FROM pg_wait_events + where type <> 'InjectionPoint' group by type order by type COLLATE "C"; + -- Test that the pg_timezone_names and pg_timezone_abbrevs views are -- more-or-less working. We can't test their contents in any great detail -- without the outputs changing anytime IANA updates the underlying data, diff --git a/src/test/regress/sql/tablespace.sql b/src/test/regress/sql/tablespace.sql index d274d9615efa7..0f9c136d3172e 100644 --- a/src/test/regress/sql/tablespace.sql +++ b/src/test/regress/sql/tablespace.sql @@ -396,6 +396,12 @@ ALTER INDEX testschema.part_a_idx SET TABLESPACE pg_default; -- Fail, not empty DROP TABLESPACE regress_tblspace; +-- Adequate cache initialization before GRANT +\c - +BEGIN; +GRANT ALL ON TABLESPACE regress_tblspace TO PUBLIC; +ROLLBACK; + CREATE ROLE regress_tablespace_user1 login; CREATE ROLE regress_tablespace_user2 login; GRANT USAGE ON SCHEMA testschema TO regress_tablespace_user2; diff --git a/src/test/regress/sql/temp.sql b/src/test/regress/sql/temp.sql index 424d12b2833f0..2a487a1ef7f43 100644 --- a/src/test/regress/sql/temp.sql +++ b/src/test/regress/sql/temp.sql @@ -101,6 +101,22 @@ COMMIT; SELECT * FROM temptest; +-- Test it with a CHECK condition that produces a toasted pg_constraint entry +BEGIN; +do $$ +begin + execute format($cmd$ + CREATE TEMP TABLE temptest (col text CHECK (col < %L)) ON COMMIT DROP + $cmd$, + (SELECT string_agg(g.i::text || ':' || random()::text, '|') + FROM generate_series(1, 100) g(i))); +end$$; + +SELECT * FROM temptest; +COMMIT; + +SELECT * FROM temptest; + -- ON COMMIT is only allowed for TEMP CREATE TABLE temptest(col int) ON COMMIT DELETE ROWS; diff --git a/src/test/regress/sql/test_setup.sql b/src/test/regress/sql/test_setup.sql index 1b2d434683b02..06b0e2121f895 100644 --- a/src/test/regress/sql/test_setup.sql +++ b/src/test/regress/sql/test_setup.sql @@ -257,11 +257,6 @@ CREATE FUNCTION ttdummy () AS :'regresslib' LANGUAGE C; -CREATE FUNCTION get_columns_length(oid[]) - RETURNS int - AS :'regresslib' - LANGUAGE C STRICT STABLE PARALLEL SAFE; - -- Use hand-rolled hash functions and operator classes to get predictable -- result on different machines. The hash function for int4 simply returns -- the sum of the values passed to it and the one for text returns the length diff --git a/src/test/regress/sql/timestamp.sql b/src/test/regress/sql/timestamp.sql index b9bcce9cfe35d..820ef7752ac7c 100644 --- a/src/test/regress/sql/timestamp.sql +++ b/src/test/regress/sql/timestamp.sql @@ -268,6 +268,9 @@ FROM ( -- shift bins using the origin parameter: SELECT date_bin('5 min'::interval, timestamp '2020-02-01 01:01:01', timestamp '2020-02-01 00:02:30'); +-- test roundoff edge case when source < origin +SELECT date_bin('30 minutes'::interval, timestamp '2024-02-01 15:00:00', timestamp '2024-02-01 17:00:00'); + -- disallow intervals with months or years SELECT date_bin('5 months'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); SELECT date_bin('5 years'::interval, timestamp '2020-02-01 01:01:01', timestamp '2001-01-01'); @@ -278,6 +281,11 @@ SELECT date_bin('0 days'::interval, timestamp '1970-01-01 01:00:00' , timestamp -- disallow negative intervals SELECT date_bin('-2 days'::interval, timestamp '1970-01-01 01:00:00' , timestamp '1970-01-01 00:00:00'); +-- test overflow cases +select date_bin('15 minutes'::interval, timestamp '294276-12-30', timestamp '4000-12-20 BC'); +select date_bin('200000000 days'::interval, '2024-02-01'::timestamp, '2024-01-01'::timestamp); +select date_bin('365000 days'::interval, '4400-01-01 BC'::timestamp, '4000-01-01 BC'::timestamp); + -- Test casting within a BETWEEN qualifier SELECT d1 - timestamp without time zone '1997-01-02' AS diff FROM TIMESTAMP_TBL @@ -397,3 +405,22 @@ select generate_series('2022-01-01 00:00'::timestamp, select * from generate_series('2020-01-01 00:00'::timestamp, '2020-01-02 03:00'::timestamp, '0 hour'::interval); +select generate_series(timestamp '1995-08-06 12:12:12', timestamp '1996-08-06 12:12:12', interval 'infinity'); +select generate_series(timestamp '1995-08-06 12:12:12', timestamp '1996-08-06 12:12:12', interval '-infinity'); + + +-- test arithmetic with infinite timestamps +select timestamp 'infinity' - timestamp 'infinity'; +select timestamp 'infinity' - timestamp '-infinity'; +select timestamp '-infinity' - timestamp 'infinity'; +select timestamp '-infinity' - timestamp '-infinity'; +select timestamp 'infinity' - timestamp '1995-08-06 12:12:12'; +select timestamp '-infinity' - timestamp '1995-08-06 12:12:12'; + +-- test age() with infinite timestamps +select age(timestamp 'infinity'); +select age(timestamp '-infinity'); +select age(timestamp 'infinity', timestamp 'infinity'); +select age(timestamp 'infinity', timestamp '-infinity'); +select age(timestamp '-infinity', timestamp 'infinity'); +select age(timestamp '-infinity', timestamp '-infinity'); diff --git a/src/test/regress/sql/timestamptz.sql b/src/test/regress/sql/timestamptz.sql index 69b36d04202e2..1aacf78edb1db 100644 --- a/src/test/regress/sql/timestamptz.sql +++ b/src/test/regress/sql/timestamptz.sql @@ -243,6 +243,9 @@ FROM ( -- shift bins using the origin parameter: SELECT date_bin('5 min'::interval, timestamptz '2020-02-01 01:01:01+00', timestamptz '2020-02-01 00:02:30+00'); +-- test roundoff edge case when source < origin +SELECT date_bin('30 minutes'::interval, timestamptz '2024-02-01 15:00:00', timestamptz '2024-02-01 17:00:00'); + -- disallow intervals with months or years SELECT date_bin('5 months'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); SELECT date_bin('5 years'::interval, timestamp with time zone '2020-02-01 01:01:01+00', timestamp with time zone '2001-01-01+00'); @@ -253,6 +256,11 @@ SELECT date_bin('0 days'::interval, timestamp with time zone '1970-01-01 01:00:0 -- disallow negative intervals SELECT date_bin('-2 days'::interval, timestamp with time zone '1970-01-01 01:00:00+00' , timestamp with time zone '1970-01-01 00:00:00+00'); +-- test overflow cases +select date_bin('15 minutes'::interval, timestamptz '294276-12-30', timestamptz '4000-12-20 BC'); +select date_bin('200000000 days'::interval, '2024-02-01'::timestamptz, '2024-01-01'::timestamptz); +select date_bin('365000 days'::interval, '4400-01-01 BC'::timestamptz, '4000-01-01 BC'::timestamptz); + -- Test casting within a BETWEEN qualifier SELECT d1 - timestamp with time zone '1997-01-02' AS diff FROM TIMESTAMPTZ_TBL @@ -434,14 +442,18 @@ SELECT make_timestamptz(1973, 07, 15, 08, 15, 55.33, '+2') = '1973-07-15 08:15:5 -- full timezone names SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') = timestamptz '2014-12-10 00:00:00 Europe/Prague'; SELECT make_timestamptz(2014, 12, 10, 0, 0, 0, 'Europe/Prague') AT TIME ZONE 'UTC'; -SELECT make_timestamptz(1846, 12, 10, 0, 0, 0, 'Asia/Manila') AT TIME ZONE 'UTC'; +SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Asia/Singapore') AT TIME ZONE 'UTC'; +SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Pacific/Honolulu') AT TIME ZONE 'UTC'; SELECT make_timestamptz(1881, 12, 10, 0, 0, 0, 'Europe/Paris') AT TIME ZONE 'UTC'; SELECT make_timestamptz(1910, 12, 24, 0, 0, 0, 'Nehwon/Lankhmar'); -- abbreviations SELECT make_timestamptz(2008, 12, 10, 10, 10, 10, 'EST'); SELECT make_timestamptz(2008, 12, 10, 10, 10, 10, 'EDT'); -SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, 'PST8PDT'); +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, 'FOO8BAR'); + +-- POSIX +SELECT make_timestamptz(2014, 12, 10, 10, 10, 10, 'PST8PDT,M3.2.0,M11.1.0'); RESET TimeZone; @@ -458,6 +470,8 @@ select generate_series('2022-01-01 00:00'::timestamptz, select * from generate_series('2020-01-01 00:00'::timestamptz, '2020-01-02 03:00'::timestamptz, '0 hour'::interval); +select generate_series(timestamptz '1995-08-06 12:12:12', timestamptz '1996-08-06 12:12:12', interval 'infinity'); +select generate_series(timestamptz '1995-08-06 12:12:12', timestamptz '1996-08-06 12:12:12', interval '-infinity'); -- Interval crossing time shift for Europe/Warsaw timezone (with DST) SET TimeZone to 'UTC'; @@ -611,6 +625,29 @@ SELECT '2014-10-25 22:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; SELECT '2014-10-25 22:00:01 UTC'::timestamptz AT TIME ZONE 'MSK'; SELECT '2014-10-25 23:00:00 UTC'::timestamptz AT TIME ZONE 'MSK'; +-- +-- Test LOCAL time zone +-- +BEGIN; +SET LOCAL TIME ZONE 'Europe/Paris'; +VALUES (CAST('1978-07-07 19:38 America/New_York' AS TIMESTAMP WITH TIME ZONE) AT LOCAL); +VALUES (TIMESTAMP '1978-07-07 19:38' AT LOCAL); +SET LOCAL TIME ZONE 'Australia/Sydney'; +VALUES (CAST('1978-07-07 19:38 America/New_York' AS TIMESTAMP WITH TIME ZONE) AT LOCAL); +VALUES (TIMESTAMP '1978-07-07 19:38' AT LOCAL); +SET LOCAL TimeZone TO 'UTC'; +CREATE VIEW timestamp_local_view AS + SELECT CAST('1978-07-07 19:38 America/New_York' AS TIMESTAMP WITH TIME ZONE) AT LOCAL AS ttz_at_local, + timezone(CAST('1978-07-07 19:38 America/New_York' AS TIMESTAMP WITH TIME ZONE)) AS ttz_func, + TIMESTAMP '1978-07-07 19:38' AT LOCAL AS t_at_local, + timezone(TIMESTAMP '1978-07-07 19:38') AS t_func; +SELECT pg_get_viewdef('timestamp_local_view', true); +\x +TABLE timestamp_local_view; +\x +DROP VIEW timestamp_local_view; +COMMIT; + -- -- Test that AT TIME ZONE isn't misoptimized when using an index (bug #14504) -- @@ -619,3 +656,19 @@ insert into tmptz values ('2017-01-18 00:00+00'); explain (costs off) select * from tmptz where f1 at time zone 'utc' = '2017-01-18 00:00'; select * from tmptz where f1 at time zone 'utc' = '2017-01-18 00:00'; + +-- test arithmetic with infinite timestamps +SELECT timestamptz 'infinity' - timestamptz 'infinity'; +SELECT timestamptz 'infinity' - timestamptz '-infinity'; +SELECT timestamptz '-infinity' - timestamptz 'infinity'; +SELECT timestamptz '-infinity' - timestamptz '-infinity'; +SELECT timestamptz 'infinity' - timestamptz '1995-08-06 12:12:12'; +SELECT timestamptz '-infinity' - timestamptz '1995-08-06 12:12:12'; + +-- test age() with infinite timestamps +SELECT age(timestamptz 'infinity'); +SELECT age(timestamptz '-infinity'); +SELECT age(timestamptz 'infinity', timestamptz 'infinity'); +SELECT age(timestamptz 'infinity', timestamptz '-infinity'); +SELECT age(timestamptz '-infinity', timestamptz 'infinity'); +SELECT age(timestamptz '-infinity', timestamptz '-infinity'); diff --git a/src/test/regress/sql/timetz.sql b/src/test/regress/sql/timetz.sql index 93c7bb142888c..d797f478f0db5 100644 --- a/src/test/regress/sql/timetz.sql +++ b/src/test/regress/sql/timetz.sql @@ -84,3 +84,25 @@ SELECT date_part('microsecond', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401- SELECT date_part('millisecond', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); SELECT date_part('second', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); SELECT date_part('epoch', TIME WITH TIME ZONE '2020-05-26 13:30:25.575401-04'); + +-- +-- Test timetz_zone, timetz_izone, AT LOCAL +-- +BEGIN; +SET LOCAL TimeZone TO 'UTC'; +CREATE VIEW timetz_local_view AS + SELECT f1 AS dat, + timezone(f1) AS dat_func, + f1 AT LOCAL AS dat_at_local, + f1 AT TIME ZONE current_setting('TimeZone') AS dat_at_tz, + f1 AT TIME ZONE INTERVAL '00:00' AS dat_at_int + FROM TIMETZ_TBL + ORDER BY f1; +SELECT pg_get_viewdef('timetz_local_view', true); +TABLE timetz_local_view; +SELECT f1 AS dat, + f1 AT TIME ZONE 'UTC+10' AS dat_at_tz, + f1 AT TIME ZONE INTERVAL '-10:00' AS dat_at_int + FROM TIMETZ_TBL + ORDER BY f1; +ROLLBACK; diff --git a/src/test/regress/sql/transactions.sql b/src/test/regress/sql/transactions.sql index 75ffe929d455d..51ae1b31b30bf 100644 --- a/src/test/regress/sql/transactions.sql +++ b/src/test/regress/sql/transactions.sql @@ -489,6 +489,17 @@ SHOW transaction_read_only; SHOW transaction_deferrable; COMMIT; +START TRANSACTION ISOLATION LEVEL READ COMMITTED, READ WRITE, DEFERRABLE; +SHOW transaction_isolation; +SHOW transaction_read_only; +SHOW transaction_deferrable; +SAVEPOINT x; +COMMIT AND CHAIN; -- TBLOCK_SUBCOMMIT +SHOW transaction_isolation; +SHOW transaction_read_only; +SHOW transaction_deferrable; +COMMIT; + -- different mix of options just for fun START TRANSACTION ISOLATION LEVEL SERIALIZABLE, READ WRITE, NOT DEFERRABLE; SHOW transaction_isolation; @@ -613,6 +624,15 @@ SELECT * FROM trans_abc ORDER BY 1; DROP TABLE trans_abc; +-- TRANSACTION SNAPSHOT +-- Incorrect identifier. +BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; +SET TRANSACTION SNAPSHOT 'Incorrect Identifier'; +ROLLBACK; +-- Correct identifier, missing file. +BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; +SET TRANSACTION SNAPSHOT 'FFF-FFF-F'; +ROLLBACK; -- Test for successful cleanup of an aborted transaction at session exit. -- THIS MUST BE THE LAST TEST IN THIS FILE. diff --git a/src/test/regress/sql/triggers.sql b/src/test/regress/sql/triggers.sql index d29e98d2ac944..a3c3115a6e721 100644 --- a/src/test/regress/sql/triggers.sql +++ b/src/test/regress/sql/triggers.sql @@ -1186,9 +1186,13 @@ insert into child values (10, 1, 'b'); select * from parent; select * from child; update parent set val1 = 'b' where aid = 1; -- should fail +merge into parent p using (values (1)) as v(id) on p.aid = v.id + when matched then update set val1 = 'b'; -- should fail select * from parent; select * from child; delete from parent where aid = 1; -- should fail +merge into parent p using (values (1)) as v(id) on p.aid = v.id + when matched then delete; -- should fail select * from parent; select * from child; -- replace the trigger function with one that restarts the deletion after @@ -1583,6 +1587,42 @@ create trigger qqq after insert on parted_trig_1_1 for each row execute procedur insert into parted_trig values (50), (1500); drop table parted_trig; +-- Verify that the correct triggers fire for cross-partition updates +create table parted_trig (a int) partition by list (a); +create table parted_trig1 partition of parted_trig for values in (1); +create table parted_trig2 partition of parted_trig for values in (2); +insert into parted_trig values (1); + +create or replace function trigger_notice() returns trigger as $$ + begin + raise notice 'trigger % on % % % for %', TG_NAME, TG_TABLE_NAME, TG_WHEN, TG_OP, TG_LEVEL; + if TG_LEVEL = 'ROW' then + if TG_OP = 'DELETE' then + return OLD; + else + return NEW; + end if; + end if; + return null; + end; + $$ language plpgsql; +create trigger parted_trig_before_stmt before insert or update or delete on parted_trig + for each statement execute procedure trigger_notice(); +create trigger parted_trig_before_row before insert or update or delete on parted_trig + for each row execute procedure trigger_notice(); +create trigger parted_trig_after_row after insert or update or delete on parted_trig + for each row execute procedure trigger_notice(); +create trigger parted_trig_after_stmt after insert or update or delete on parted_trig + for each statement execute procedure trigger_notice(); + +update parted_trig set a = 2 where a = 1; + +-- update action in merge should behave the same +merge into parted_trig using (select 1) as ss on true + when matched and a = 2 then update set a = 1; + +drop table parted_trig; + -- Verify propagation of trigger arguments to partitions create table parted_trig (a int) partition by list (a); create table parted_trig1 partition of parted_trig for values in (1); @@ -2147,6 +2187,52 @@ alter table parent attach partition child for values in ('AAA'); drop table child, parent; +-- +-- Verify access of transition tables with UPDATE triggers and tuples +-- moved across partitions. +-- +create or replace function dump_update_new() returns trigger language plpgsql as +$$ + begin + raise notice 'trigger = %, new table = %', TG_NAME, + (select string_agg(new_table::text, ', ' order by a) from new_table); + return null; + end; +$$; +create or replace function dump_update_old() returns trigger language plpgsql as +$$ + begin + raise notice 'trigger = %, old table = %', TG_NAME, + (select string_agg(old_table::text, ', ' order by a) from old_table); + return null; + end; +$$; +create table trans_tab_parent (a text) partition by list (a); +create table trans_tab_child1 partition of trans_tab_parent for values in ('AAA1', 'AAA2'); +create table trans_tab_child2 partition of trans_tab_parent for values in ('BBB1', 'BBB2'); +create trigger trans_tab_parent_update_trig + after update on trans_tab_parent referencing old table as old_table + for each statement execute procedure dump_update_old(); +create trigger trans_tab_parent_insert_trig + after insert on trans_tab_parent referencing new table as new_table + for each statement execute procedure dump_insert(); +create trigger trans_tab_parent_delete_trig + after delete on trans_tab_parent referencing old table as old_table + for each statement execute procedure dump_delete(); +insert into trans_tab_parent values ('AAA1'), ('BBB1'); +-- should not trigger access to new table when moving across partitions. +update trans_tab_parent set a = 'BBB2' where a = 'AAA1'; +drop trigger trans_tab_parent_update_trig on trans_tab_parent; +create trigger trans_tab_parent_update_trig + after update on trans_tab_parent referencing new table as new_table + for each statement execute procedure dump_update_new(); +-- should not trigger access to old table when moving across partitions. +update trans_tab_parent set a = 'AAA2' where a = 'BBB1'; +delete from trans_tab_parent; +-- clean up +drop table trans_tab_parent, trans_tab_child1, trans_tab_child2; +drop function dump_update_new, dump_update_old; + -- -- Verify behavior of statement triggers on (non-partition) -- inheritance hierarchy with transition tables; similar to the @@ -2438,6 +2524,20 @@ select * from trig_table; drop table refd_table, trig_table; +-- +-- Test that we can drop a not-yet-fired deferred trigger +-- + +create table refd_table (id int primary key); +create table trig_table (fk int references refd_table initially deferred); + +begin; +insert into trig_table values (1); +drop table refd_table cascade; +commit; + +drop table trig_table; + -- -- self-referential FKs are even more fun -- diff --git a/src/test/regress/sql/tsdicts.sql b/src/test/regress/sql/tsdicts.sql index ddc6c7f4453a3..cf08410bb2d2c 100644 --- a/src/test/regress/sql/tsdicts.sql +++ b/src/test/regress/sql/tsdicts.sql @@ -251,3 +251,33 @@ CREATE TEXT SEARCH DICTIONARY tsdict_case "DictFile" = ispell_sample, "AffFile" = ispell_sample ); + +-- Test grammar for configurations +CREATE TEXT SEARCH CONFIGURATION dummy_tst (COPY=english); +-- Overridden mapping change with duplicated tokens. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + ALTER MAPPING FOR word, word WITH ispell; +-- Not a token supported by the configuration's parser, fails. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING FOR not_a_token, not_a_token; +-- Not a token supported by the configuration's parser, fails even +-- with IF EXISTS. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING IF EXISTS FOR not_a_token, not_a_token; +-- Token supported by the configuration's parser, succeeds. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING FOR word, word; +-- No mapping for token supported by the configuration's parser, fails. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING FOR word; +-- Token supported by the configuration's parser, cannot be found, +-- succeeds with IF EXISTS. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + DROP MAPPING IF EXISTS FOR word, word; +-- Re-add mapping, with duplicated tokens supported by the parser. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + ADD MAPPING FOR word, word WITH ispell; +-- Not a token supported by the configuration's parser, fails. +ALTER TEXT SEARCH CONFIGURATION dummy_tst + ADD MAPPING FOR not_a_token WITH ispell; +DROP TEXT SEARCH CONFIGURATION dummy_tst; diff --git a/src/test/regress/sql/tsearch.sql b/src/test/regress/sql/tsearch.sql index db2e09be94c87..fbd26cdba459f 100644 --- a/src/test/regress/sql/tsearch.sql +++ b/src/test/regress/sql/tsearch.sql @@ -818,7 +818,10 @@ select websearch_to_tsquery('simple', ':'); select websearch_to_tsquery('simple', 'abc & def'); select websearch_to_tsquery('simple', 'abc | def'); select websearch_to_tsquery('simple', 'abc <-> def'); + +-- parens are ignored, too select websearch_to_tsquery('simple', 'abc (pg or class)'); +select websearch_to_tsquery('simple', '(foo bar) or (ding dong)'); -- NOT is ignored in quotes select websearch_to_tsquery('english', 'My brand new smartphone'); diff --git a/src/test/regress/sql/tuplesort.sql b/src/test/regress/sql/tuplesort.sql index 846484d5612fb..8476e594e6c15 100644 --- a/src/test/regress/sql/tuplesort.sql +++ b/src/test/regress/sql/tuplesort.sql @@ -146,6 +146,15 @@ FROM abbrev_abort_uuids ORDER BY ctid DESC LIMIT 5; ROLLBACK; +---- +-- test sorting of large datums VALUES +---- + +-- Ensure the order is correct and values look intact +SELECT LEFT(a,10),b FROM + (VALUES(REPEAT('a', 512 * 1024),1),(REPEAT('b', 512 * 1024),2)) v(a,b) +ORDER BY v.a DESC; + ---- -- test forward and backward scans for in-memory and disk based tuplesort ---- @@ -169,7 +178,7 @@ FETCH BACKWARD FROM c; FETCH BACKWARD FROM c; FETCH NEXT FROM c; --- scroll beyond end end +-- scroll beyond end FETCH LAST FROM c; FETCH BACKWARD FROM c; FETCH NEXT FROM c; @@ -200,7 +209,7 @@ FETCH BACKWARD FROM c; FETCH BACKWARD FROM c; FETCH NEXT FROM c; --- scroll beyond end end +-- scroll beyond end FETCH LAST FROM c; FETCH BACKWARD FROM c; FETCH NEXT FROM c; diff --git a/src/test/regress/sql/type_sanity.sql b/src/test/regress/sql/type_sanity.sql index 79ec410a6ca0d..e88d6cbe49d16 100644 --- a/src/test/regress/sql/type_sanity.sql +++ b/src/test/regress/sql/type_sanity.sql @@ -360,26 +360,28 @@ ORDER BY 1; SELECT c1.oid, c1.relname FROM pg_class as c1 -WHERE relkind NOT IN ('r', 'i', 'S', 't', 'v', 'm', 'c', 'f', 'p') OR +WHERE relkind NOT IN ('r', 'i', 'S', 't', 'v', 'm', 'c', 'f', 'p', 'I') OR relpersistence NOT IN ('p', 'u', 't') OR relreplident NOT IN ('d', 'n', 'f', 'i'); --- All tables and indexes should have an access method. +-- All tables, indexes, partitioned indexes and matviews should have an +-- access method. SELECT c1.oid, c1.relname FROM pg_class as c1 -WHERE c1.relkind NOT IN ('S', 'v', 'f', 'c') and +WHERE c1.relkind NOT IN ('S', 'v', 'f', 'c', 'p') and c1.relam = 0; --- Conversely, sequences, views, types shouldn't have them +-- Conversely, sequences, views, foreign tables, types and partitioned +-- tables shouldn't have them. SELECT c1.oid, c1.relname FROM pg_class as c1 -WHERE c1.relkind IN ('S', 'v', 'f', 'c') and +WHERE c1.relkind IN ('S', 'v', 'f', 'c', 'p') and c1.relam != 0; --- Indexes should have AMs of type 'i' +-- Indexes and partitioned indexes should have AMs of type 'i'. SELECT pc.oid, pc.relname, pa.amname, pa.amtype FROM pg_class as pc JOIN pg_am AS pa ON (pc.relam = pa.oid) -WHERE pc.relkind IN ('i') and +WHERE pc.relkind IN ('i', 'I') and pa.amtype != 'i'; -- Tables, matviews etc should have AMs of type 't' diff --git a/src/test/regress/sql/unicode.sql b/src/test/regress/sql/unicode.sql index 63cd523f85f79..e50adb68ed0d5 100644 --- a/src/test/regress/sql/unicode.sql +++ b/src/test/regress/sql/unicode.sql @@ -5,6 +5,10 @@ SELECT getdatabaseencoding() <> 'UTF8' AS skip_test \gset SELECT U&'\0061\0308bc' <> U&'\00E4bc' COLLATE "C" AS sanity_check; +SELECT unicode_version() IS NOT NULL; +SELECT unicode_assigned(U&'abc'); +SELECT unicode_assigned(U&'abc\+10FFFF'); + SELECT normalize(''); SELECT normalize(U&'\0061\0308\24D1c') = U&'\00E4\24D1c' COLLATE "C" AS test_default; SELECT normalize(U&'\0061\0308\24D1c', NFC) = U&'\00E4\24D1c' COLLATE "C" AS test_nfc; diff --git a/src/test/regress/sql/union.sql b/src/test/regress/sql/union.sql index ca8c9b4d1288e..f8826514e42a6 100644 --- a/src/test/regress/sql/union.sql +++ b/src/test/regress/sql/union.sql @@ -162,12 +162,12 @@ reset enable_hashagg; set enable_hashagg to on; explain (costs off) -select x from (values (100::money), (200::money)) _(x) union select x from (values (100::money), (300::money)) _(x); +select x from (values ('11'::varbit), ('10'::varbit)) _(x) union select x from (values ('11'::varbit), ('10'::varbit)) _(x); set enable_hashagg to off; explain (costs off) -select x from (values (100::money), (200::money)) _(x) union select x from (values (100::money), (300::money)) _(x); +select x from (values ('11'::varbit), ('10'::varbit)) _(x) union select x from (values ('11'::varbit), ('10'::varbit)) _(x); reset enable_hashagg; @@ -186,8 +186,8 @@ select x from (values (array[1, 2]), (array[1, 3])) _(x) except select x from (v -- non-hashable type explain (costs off) -select x from (values (array[100::money]), (array[200::money])) _(x) union select x from (values (array[100::money]), (array[300::money])) _(x); -select x from (values (array[100::money]), (array[200::money])) _(x) union select x from (values (array[100::money]), (array[300::money])) _(x); +select x from (values (array['10'::varbit]), (array['11'::varbit])) _(x) union select x from (values (array['10'::varbit]), (array['01'::varbit])) _(x); +select x from (values (array['10'::varbit]), (array['11'::varbit])) _(x) union select x from (values (array['10'::varbit]), (array['01'::varbit])) _(x); set enable_hashagg to off; @@ -221,15 +221,15 @@ select x from (values (row(1, 2)), (row(1, 3))) _(x) except select x from (value -- With an anonymous row type, the typcache does not report that the -- type is hashable. (Otherwise, this would fail at execution time.) explain (costs off) -select x from (values (row(100::money)), (row(200::money))) _(x) union select x from (values (row(100::money)), (row(300::money))) _(x); -select x from (values (row(100::money)), (row(200::money))) _(x) union select x from (values (row(100::money)), (row(300::money))) _(x); +select x from (values (row('10'::varbit)), (row('11'::varbit))) _(x) union select x from (values (row('10'::varbit)), (row('01'::varbit))) _(x); +select x from (values (row('10'::varbit)), (row('11'::varbit))) _(x) union select x from (values (row('10'::varbit)), (row('01'::varbit))) _(x); -- With a defined row type, the typcache can inspect the type's fields -- for hashability. -create type ct1 as (f1 money); +create type ct1 as (f1 varbit); explain (costs off) -select x from (values (row(100::money)::ct1), (row(200::money)::ct1)) _(x) union select x from (values (row(100::money)::ct1), (row(300::money)::ct1)) _(x); -select x from (values (row(100::money)::ct1), (row(200::money)::ct1)) _(x) union select x from (values (row(100::money)::ct1), (row(300::money)::ct1)) _(x); +select x from (values (row('10'::varbit)::ct1), (row('11'::varbit)::ct1)) _(x) union select x from (values (row('10'::varbit)::ct1), (row('01'::varbit)::ct1)) _(x); +select x from (values (row('10'::varbit)::ct1), (row('11'::varbit)::ct1)) _(x) union select x from (values (row('10'::varbit)::ct1), (row('01'::varbit)::ct1)) _(x); drop type ct1; set enable_hashagg to off; @@ -244,6 +244,12 @@ explain (costs off) select x from (values (row(1, 2)), (row(1, 3))) _(x) except select x from (values (row(1, 2)), (row(1, 4))) _(x); select x from (values (row(1, 2)), (row(1, 3))) _(x) except select x from (values (row(1, 2)), (row(1, 4))) _(x); +-- non-sortable type + +-- Ensure we get a HashAggregate plan. Keep enable_hashagg=off to ensure +-- there's no chance of a sort. +explain (costs off) select '123'::xid union select '123'::xid; + reset enable_hashagg; -- @@ -302,12 +308,12 @@ select except select; set enable_hashagg = true; set enable_sort = false; -explain (costs off) -select from generate_series(1,5) union select from generate_series(1,3); +-- We've no way to check hashed UNION as the empty pathkeys in the Append are +-- fine to make use of Unique, which is cheaper than HashAggregate and we've +-- no means to disable Unique. explain (costs off) select from generate_series(1,5) intersect select from generate_series(1,3); -select from generate_series(1,5) union select from generate_series(1,3); select from generate_series(1,5) union all select from generate_series(1,3); select from generate_series(1,5) intersect select from generate_series(1,3); select from generate_series(1,5) intersect all select from generate_series(1,3); @@ -330,6 +336,17 @@ select from generate_series(1,5) intersect all select from generate_series(1,3); select from generate_series(1,5) except select from generate_series(1,3); select from generate_series(1,5) except all select from generate_series(1,3); +-- Try a variation of the above but with a CTE which contains a column, again +-- with an empty final select list. + +-- Ensure we get the expected 1 row with 0 columns +with cte as materialized (select s from generate_series(1,5) s) +select from cte union select from cte; + +-- Ensure we get the same result as the above. +with cte as not materialized (select s from generate_series(1,5) s) +select from cte union select from cte; + reset enable_hashagg; reset enable_sort; @@ -361,6 +378,7 @@ INSERT INTO t2 VALUES ('ab'), ('xy'); set enable_seqscan = off; set enable_indexscan = on; set enable_bitmapscan = off; +set enable_sort = off; explain (costs off) SELECT * FROM @@ -407,6 +425,7 @@ explain (costs off) reset enable_seqscan; reset enable_indexscan; reset enable_bitmapscan; +reset enable_sort; -- This simpler variant of the above test has been observed to fail differently @@ -540,3 +559,21 @@ select * from union all select *, 1 as x from int8_tbl b) ss where (x = 0) or (q1 >= q2 and q1 <= q2); + +-- +-- Test the planner's ability to produce cheap startup plans with Append nodes +-- + +-- Ensure we get a Nested Loop join between tenk1 and tenk2 +explain (costs off) +select t1.unique1 from tenk1 t1 +inner join tenk2 t2 on t1.tenthous = t2.tenthous and t2.thousand = 0 + union all +(values(1)) limit 1; + +-- Ensure there is no problem if cheapest_startup_path is NULL +explain (costs off) +select * from tenk1 t1 +left join lateral + (select t1.tenthous from tenk2 t2 union all (values(1))) +on true limit 1; diff --git a/src/test/regress/sql/updatable_views.sql b/src/test/regress/sql/updatable_views.sql index eaee0b7e1d716..93b693ae83761 100644 --- a/src/test/regress/sql/updatable_views.sql +++ b/src/test/regress/sql/updatable_views.sql @@ -62,6 +62,18 @@ UPDATE ro_view10 SET a=a+1; UPDATE ro_view11 SET a=a+1; UPDATE ro_view12 SET a=a+1; INSERT INTO ro_view13 VALUES (3, 'Row 3'); +MERGE INTO ro_view13 AS t USING (VALUES (1, 'Row 1')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN DELETE; +MERGE INTO ro_view13 AS t USING (VALUES (2, 'Row 2')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = v.b; +MERGE INTO ro_view13 AS t USING (VALUES (3, 'Row 3')) AS v(a,b) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a, v.b); +MERGE INTO ro_view13 AS t USING (VALUES (2, 'Row 2')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN DO NOTHING + WHEN NOT MATCHED THEN DO NOTHING; -- should be OK to do nothing +MERGE INTO ro_view13 AS t USING (VALUES (3, 'Row 3')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN DO NOTHING + WHEN NOT MATCHED THEN DO NOTHING; -- should be OK to do nothing -- Partially updatable view INSERT INTO rw_view14 VALUES (null, 3, 'Row 3'); -- should fail INSERT INTO rw_view14 (a, b) VALUES (3, 'Row 3'); -- should be OK @@ -69,6 +81,20 @@ UPDATE rw_view14 SET ctid=null WHERE a=3; -- should fail UPDATE rw_view14 SET b='ROW 3' WHERE a=3; -- should be OK SELECT * FROM base_tbl; DELETE FROM rw_view14 WHERE a=3; -- should be OK +MERGE INTO rw_view14 AS t + USING (VALUES (2, 'Merged row 2'), (3, 'Merged row 3')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = v.b -- should be OK, except... + WHEN NOT MATCHED THEN INSERT VALUES (null, v.a, v.b); -- should fail +MERGE INTO rw_view14 AS t + USING (VALUES (2, 'Merged row 2'), (3, 'Merged row 3')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = v.b -- should be OK + WHEN NOT MATCHED THEN INSERT (a,b) VALUES (v.a, v.b); -- should be OK +SELECT * FROM base_tbl ORDER BY a; +MERGE INTO rw_view14 AS t + USING (VALUES (2, 'Row 2'), (3, 'Row 3')) AS v(a,b) ON t.a = v.a + WHEN MATCHED AND t.a = 2 THEN UPDATE SET b = v.b -- should be OK + WHEN MATCHED AND t.a = 3 THEN DELETE; -- should be OK +SELECT * FROM base_tbl ORDER BY a; -- Partially updatable view INSERT INTO rw_view15 VALUES (3, 'ROW 3'); -- should fail INSERT INTO rw_view15 (a) VALUES (3); -- should be OK @@ -98,6 +124,8 @@ DELETE FROM rw_view16 WHERE a=-3; -- should be OK -- Read-only views INSERT INTO ro_view17 VALUES (3, 'ROW 3'); DELETE FROM ro_view18; +MERGE INTO ro_view18 AS t USING (VALUES (1, 'Row 1')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN DO NOTHING; -- should be OK to do nothing UPDATE ro_view19 SET last_value=1000; UPDATE ro_view20 SET b=upper(b); @@ -114,6 +142,8 @@ CREATE RULE rw_view16_del_rule AS ON DELETE TO rw_view16 INSERT INTO rw_view16 (a, b) VALUES (3, 'Row 3'); -- should fail UPDATE rw_view16 SET b='ROW 2' WHERE a=2; -- should fail DELETE FROM rw_view16 WHERE a=2; -- should fail +MERGE INTO rw_view16 AS t USING (VALUES (3, 'Row 3')) AS v(a,b) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a, v.b); -- should fail DROP TABLE base_tbl CASCADE; DROP VIEW ro_view10, ro_view12, ro_view18; @@ -145,9 +175,47 @@ UPDATE rw_view1 SET a=5 WHERE a=4; DELETE FROM rw_view1 WHERE b='Row 2'; SELECT * FROM base_tbl; +MERGE INTO rw_view1 t + USING (VALUES (0, 'ROW 0'), (1, 'ROW 1'), + (2, 'ROW 2'), (3, 'ROW 3')) AS v(a,b) ON t.a = v.a + WHEN MATCHED AND t.a <= 1 THEN UPDATE SET b = v.b + WHEN MATCHED THEN DELETE + WHEN NOT MATCHED AND a > 0 THEN INSERT (a) VALUES (v.a) + RETURNING merge_action(), v.*, t.*; +SELECT * FROM base_tbl ORDER BY a; + +MERGE INTO rw_view1 t + USING (VALUES (0, 'R0'), (1, 'R1'), + (2, 'R2'), (3, 'R3')) AS v(a,b) ON t.a = v.a + WHEN MATCHED AND t.a <= 1 THEN UPDATE SET b = v.b + WHEN MATCHED THEN DELETE + WHEN NOT MATCHED BY SOURCE THEN DELETE + WHEN NOT MATCHED AND a > 0 THEN INSERT (a) VALUES (v.a) + RETURNING merge_action(), v.*, t.*; +SELECT * FROM base_tbl ORDER BY a; + EXPLAIN (costs off) UPDATE rw_view1 SET a=6 WHERE a=5; EXPLAIN (costs off) DELETE FROM rw_view1 WHERE a=5; +EXPLAIN (costs off) +MERGE INTO rw_view1 t USING (VALUES (5, 'X')) AS v(a,b) ON t.a = v.a + WHEN MATCHED THEN DELETE; + +EXPLAIN (costs off) +MERGE INTO rw_view1 t + USING (SELECT * FROM generate_series(1,5)) AS s(a) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = 'Updated'; + +EXPLAIN (costs off) +MERGE INTO rw_view1 t + USING (SELECT * FROM generate_series(1,5)) AS s(a) ON t.a = s.a + WHEN NOT MATCHED BY SOURCE THEN DELETE; + +EXPLAIN (costs off) +MERGE INTO rw_view1 t + USING (SELECT * FROM generate_series(1,5)) AS s(a) ON t.a = s.a + WHEN NOT MATCHED THEN INSERT (a) VALUES (s.a); + -- it's still updatable if we add a DO ALSO rule CREATE TABLE base_tbl_hist(ts timestamptz default now(), a int, b text); @@ -195,6 +263,23 @@ UPDATE rw_view2 SET bbb='Row 4' WHERE aaa=4; DELETE FROM rw_view2 WHERE aaa=2; SELECT * FROM rw_view2; +MERGE INTO rw_view2 t + USING (VALUES (3, 'R3'), (4, 'R4'), (5, 'R5')) AS v(a,b) ON aaa = v.a + WHEN MATCHED AND aaa = 3 THEN DELETE + WHEN MATCHED THEN UPDATE SET bbb = v.b + WHEN NOT MATCHED THEN INSERT (aaa) VALUES (v.a) + RETURNING merge_action(), v.*, t.*; +SELECT * FROM rw_view2 ORDER BY aaa; + +MERGE INTO rw_view2 t + USING (VALUES (4, 'r4'), (5, 'r5'), (6, 'r6')) AS v(a,b) ON aaa = v.a + WHEN MATCHED AND aaa = 4 THEN DELETE + WHEN MATCHED THEN UPDATE SET bbb = v.b + WHEN NOT MATCHED THEN INSERT (aaa) VALUES (v.a) + WHEN NOT MATCHED BY SOURCE THEN UPDATE SET bbb = 'Not matched by source' + RETURNING merge_action(), v.*, t.*; +SELECT * FROM rw_view2 ORDER BY aaa; + EXPLAIN (costs off) UPDATE rw_view2 SET aaa=5 WHERE aaa=4; EXPLAIN (costs off) DELETE FROM rw_view2 WHERE aaa=4; @@ -283,6 +368,9 @@ SELECT * FROM rw_view2; DELETE FROM rw_view2 WHERE a=3 RETURNING *; SELECT * FROM rw_view2; +MERGE INTO rw_view2 t USING (VALUES (3, 'Row 3')) AS v(a,b) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a, v.b); -- should fail + EXPLAIN (costs off) UPDATE rw_view2 SET a=3 WHERE a=2; EXPLAIN (costs off) DELETE FROM rw_view2 WHERE a=2; @@ -397,9 +485,65 @@ SELECT * FROM rw_view2; DELETE FROM rw_view2 WHERE a=3 RETURNING *; SELECT * FROM rw_view2; +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED AND t.a <= 1 THEN DELETE + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b) + RETURNING merge_action(), s.*, t.*; +SELECT * FROM base_tbl ORDER BY a; + +MERGE INTO rw_view2 t + USING (SELECT x, 'r'||x FROM generate_series(0,2) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b) + WHEN NOT MATCHED BY SOURCE THEN UPDATE SET b = 'Not matched by source' + RETURNING merge_action(), s.*, t.*; +SELECT * FROM base_tbl ORDER BY a; + EXPLAIN (costs off) UPDATE rw_view2 SET a=3 WHERE a=2; EXPLAIN (costs off) DELETE FROM rw_view2 WHERE a=2; +EXPLAIN (costs off) +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED AND t.a <= 1 THEN DELETE + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b); + +-- MERGE with incomplete set of INSTEAD OF triggers +DROP TRIGGER rw_view1_del_trig ON rw_view1; +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED AND t.a <= 1 THEN DELETE + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b); -- should fail +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b); -- ok + +DROP TRIGGER rw_view1_ins_trig ON rw_view1; +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b); -- should fail +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = s.b; -- ok + +-- MERGE with INSTEAD OF triggers on auto-updatable view +CREATE TRIGGER rw_view2_upd_trig INSTEAD OF UPDATE ON rw_view2 + FOR EACH ROW EXECUTE PROCEDURE rw_view1_trig_fn(); +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = s.b + WHEN NOT MATCHED AND s.a > 0 THEN INSERT VALUES (s.a, s.b); -- should fail +MERGE INTO rw_view2 t + USING (SELECT x, 'R'||x FROM generate_series(0,3) x) AS s(a,b) ON t.a = s.a + WHEN MATCHED THEN UPDATE SET b = s.b; -- ok +SELECT * FROM base_tbl ORDER BY a; + DROP TABLE base_tbl CASCADE; DROP FUNCTION rw_view1_trig_fn(); @@ -451,6 +595,13 @@ INSERT INTO base_tbl VALUES (3, 'Row 3', 3.0); -- not allowed INSERT INTO rw_view1 VALUES ('Row 3', 3.0, 3); -- not allowed INSERT INTO rw_view2 VALUES ('Row 3', 3.0, 3); -- not allowed +MERGE INTO rw_view1 t + USING (VALUES ('Row 3', 3.0, 3)) AS v(b,c,a) ON t.aa = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.b, v.c, v.a); -- not allowed +MERGE INTO rw_view2 t + USING (VALUES ('Row 3', 3.0, 3)) AS v(b,c,a) ON t.aa = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.b, v.c, v.a); -- not allowed + UPDATE base_tbl SET a=a, c=c; -- ok UPDATE base_tbl SET b=b; -- not allowed UPDATE rw_view1 SET bb=bb, cc=cc; -- ok @@ -458,6 +609,15 @@ UPDATE rw_view1 SET aa=aa; -- not allowed UPDATE rw_view2 SET aa=aa, cc=cc; -- ok UPDATE rw_view2 SET bb=bb; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET bb = bb, cc = cc; -- ok +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET aa = aa; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET aa = aa, cc = cc; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET bb = bb; -- not allowed + DELETE FROM base_tbl; -- not allowed DELETE FROM rw_view1; -- not allowed DELETE FROM rw_view2; -- not allowed @@ -474,6 +634,10 @@ INSERT INTO rw_view2 VALUES ('Row 4', 4.0, 4); -- ok DELETE FROM base_tbl WHERE a=1; -- ok DELETE FROM rw_view1 WHERE aa=2; -- not allowed DELETE FROM rw_view2 WHERE aa=2; -- ok +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED AND bb = 'xxx' THEN DELETE; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED AND bb = 'xxx' THEN DELETE; -- ok SELECT * FROM base_tbl; RESET SESSION AUTHORIZATION; @@ -489,6 +653,10 @@ INSERT INTO rw_view2 VALUES ('Row 6', 6.0, 6); -- not allowed DELETE FROM base_tbl WHERE a=3; -- not allowed DELETE FROM rw_view1 WHERE aa=3; -- ok DELETE FROM rw_view2 WHERE aa=4; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED AND bb = 'xxx' THEN DELETE; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED AND bb = 'xxx' THEN DELETE; -- not allowed SELECT * FROM base_tbl; RESET SESSION AUTHORIZATION; @@ -504,12 +672,16 @@ CREATE VIEW rw_view1 AS SELECT * FROM base_tbl; SELECT * FROM rw_view1; -- not allowed SELECT * FROM rw_view1 FOR UPDATE; -- not allowed UPDATE rw_view1 SET b = 'foo' WHERE a = 1; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed SET SESSION AUTHORIZATION regress_view_user2; CREATE VIEW rw_view2 AS SELECT * FROM rw_view1; SELECT * FROM rw_view2; -- not allowed SELECT * FROM rw_view2 FOR UPDATE; -- not allowed UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed RESET SESSION AUTHORIZATION; GRANT SELECT ON base_tbl TO regress_view_user1; @@ -518,11 +690,15 @@ SET SESSION AUTHORIZATION regress_view_user1; SELECT * FROM rw_view1; SELECT * FROM rw_view1 FOR UPDATE; -- not allowed UPDATE rw_view1 SET b = 'foo' WHERE a = 1; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed SET SESSION AUTHORIZATION regress_view_user2; SELECT * FROM rw_view2; -- not allowed SELECT * FROM rw_view2 FOR UPDATE; -- not allowed UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed SET SESSION AUTHORIZATION regress_view_user1; GRANT SELECT ON rw_view1 TO regress_view_user2; @@ -531,6 +707,8 @@ SET SESSION AUTHORIZATION regress_view_user2; SELECT * FROM rw_view2; SELECT * FROM rw_view2 FOR UPDATE; -- not allowed UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed RESET SESSION AUTHORIZATION; GRANT UPDATE ON base_tbl TO regress_view_user1; @@ -539,11 +717,15 @@ SET SESSION AUTHORIZATION regress_view_user1; SELECT * FROM rw_view1; SELECT * FROM rw_view1 FOR UPDATE; UPDATE rw_view1 SET b = 'foo' WHERE a = 1; +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; SET SESSION AUTHORIZATION regress_view_user2; SELECT * FROM rw_view2; SELECT * FROM rw_view2 FOR UPDATE; -- not allowed UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'bar'; -- not allowed SET SESSION AUTHORIZATION regress_view_user1; GRANT UPDATE ON rw_view1 TO regress_view_user2; @@ -552,6 +734,8 @@ SET SESSION AUTHORIZATION regress_view_user2; SELECT * FROM rw_view2; SELECT * FROM rw_view2 FOR UPDATE; UPDATE rw_view2 SET b = 'bar' WHERE a = 1; +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'fud'; RESET SESSION AUTHORIZATION; REVOKE UPDATE ON base_tbl FROM regress_view_user1; @@ -560,11 +744,15 @@ SET SESSION AUTHORIZATION regress_view_user1; SELECT * FROM rw_view1; SELECT * FROM rw_view1 FOR UPDATE; -- not allowed UPDATE rw_view1 SET b = 'foo' WHERE a = 1; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed SET SESSION AUTHORIZATION regress_view_user2; SELECT * FROM rw_view2; SELECT * FROM rw_view2 FOR UPDATE; -- not allowed UPDATE rw_view2 SET b = 'bar' WHERE a = 1; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET b = 'foo'; -- not allowed RESET SESSION AUTHORIZATION; @@ -588,8 +776,12 @@ INSERT INTO base_tbl VALUES (3, 'Row 3', 3.0); -- not allowed INSERT INTO rw_view1 VALUES ('Row 3', 3.0, 3); -- not allowed UPDATE base_tbl SET a=a; -- not allowed UPDATE rw_view1 SET bb=bb, cc=cc; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET bb = bb; -- not allowed DELETE FROM base_tbl; -- not allowed DELETE FROM rw_view1; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN DELETE; -- not allowed SET SESSION AUTHORIZATION regress_view_user1; GRANT SELECT ON base_tbl TO regress_view_user2; @@ -601,8 +793,14 @@ SELECT * FROM rw_view1; -- ok UPDATE base_tbl SET a=a, c=c; -- ok UPDATE base_tbl SET b=b; -- not allowed UPDATE rw_view1 SET cc=cc; -- ok +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET cc = cc; -- ok UPDATE rw_view1 SET aa=aa; -- not allowed UPDATE rw_view1 SET bb=bb; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET aa = aa; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET bb = bb; -- not allowed SET SESSION AUTHORIZATION regress_view_user1; GRANT INSERT, DELETE ON base_tbl TO regress_view_user2; @@ -612,6 +810,8 @@ INSERT INTO base_tbl VALUES (3, 'Row 3', 3.0); -- ok INSERT INTO rw_view1 VALUES ('Row 4', 4.0, 4); -- not allowed DELETE FROM base_tbl WHERE a=1; -- ok DELETE FROM rw_view1 WHERE aa=2; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN DELETE; -- not allowed SET SESSION AUTHORIZATION regress_view_user1; REVOKE INSERT, DELETE ON base_tbl FROM regress_view_user2; @@ -620,6 +820,8 @@ GRANT INSERT, DELETE ON rw_view1 TO regress_view_user2; SET SESSION AUTHORIZATION regress_view_user2; INSERT INTO rw_view1 VALUES ('Row 4', 4.0, 4); -- not allowed DELETE FROM rw_view1 WHERE aa=2; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN DELETE; -- not allowed SET SESSION AUTHORIZATION regress_view_user1; GRANT INSERT, DELETE ON base_tbl TO regress_view_user2; @@ -627,6 +829,8 @@ GRANT INSERT, DELETE ON base_tbl TO regress_view_user2; SET SESSION AUTHORIZATION regress_view_user2; INSERT INTO rw_view1 VALUES ('Row 4', 4.0, 4); -- ok DELETE FROM rw_view1 WHERE aa=2; -- ok +MERGE INTO rw_view1 t USING (VALUES (3)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN DELETE; -- ok SELECT * FROM base_tbl; -- ok RESET SESSION AUTHORIZATION; @@ -643,12 +847,16 @@ CREATE VIEW rw_view1 AS SELECT b AS bb, c AS cc, a AS aa FROM base_tbl; ALTER VIEW rw_view1 SET (security_invoker = true); SELECT * FROM rw_view1; -- not allowed UPDATE rw_view1 SET aa=aa; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (2, 'Row 2', 2.0)) AS v(a,b,c) ON t.aa = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.b, v.c, v.a); -- not allowed SET SESSION AUTHORIZATION regress_view_user2; CREATE VIEW rw_view2 AS SELECT cc AS ccc, aa AS aaa, bb AS bbb FROM rw_view1; GRANT SELECT, UPDATE ON rw_view2 TO regress_view_user3; SELECT * FROM rw_view2; -- not allowed UPDATE rw_view2 SET aaa=aaa; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (2, 'Row 2', 2.0)) AS v(a,b,c) ON t.aaa = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.c, v.a, v.b); -- not allowed RESET SESSION AUTHORIZATION; @@ -659,14 +867,22 @@ SET SESSION AUTHORIZATION regress_view_user1; SELECT * FROM rw_view1; -- ok UPDATE rw_view1 SET aa=aa, bb=bb; -- ok UPDATE rw_view1 SET cc=cc; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET aa = aa, bb = bb; -- ok +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET cc = cc; -- not allowed SET SESSION AUTHORIZATION regress_view_user2; SELECT * FROM rw_view2; -- not allowed UPDATE rw_view2 SET aaa=aaa; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed SET SESSION AUTHORIZATION regress_view_user3; SELECT * FROM rw_view2; -- not allowed UPDATE rw_view2 SET aaa=aaa; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed SET SESSION AUTHORIZATION regress_view_user1; GRANT SELECT ON rw_view1 TO regress_view_user2; @@ -675,10 +891,14 @@ GRANT UPDATE (bb, cc) ON rw_view1 TO regress_view_user2; SET SESSION AUTHORIZATION regress_view_user2; SELECT * FROM rw_view2; -- not allowed UPDATE rw_view2 SET bbb=bbb; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed SET SESSION AUTHORIZATION regress_view_user3; SELECT * FROM rw_view2; -- not allowed UPDATE rw_view2 SET bbb=bbb; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed RESET SESSION AUTHORIZATION; @@ -690,12 +910,24 @@ SELECT * FROM rw_view2; -- ok UPDATE rw_view2 SET aaa=aaa; -- not allowed UPDATE rw_view2 SET bbb=bbb; -- not allowed UPDATE rw_view2 SET ccc=ccc; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- ok SET SESSION AUTHORIZATION regress_view_user3; SELECT * FROM rw_view2; -- not allowed UPDATE rw_view2 SET aaa=aaa; -- not allowed UPDATE rw_view2 SET bbb=bbb; -- not allowed UPDATE rw_view2 SET ccc=ccc; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- not allowed RESET SESSION AUTHORIZATION; @@ -707,6 +939,12 @@ SELECT * FROM rw_view2; -- ok UPDATE rw_view2 SET aaa=aaa; -- not allowed UPDATE rw_view2 SET bbb=bbb; -- not allowed UPDATE rw_view2 SET ccc=ccc; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- ok RESET SESSION AUTHORIZATION; @@ -715,18 +953,32 @@ REVOKE SELECT, UPDATE ON base_tbl FROM regress_view_user1; SET SESSION AUTHORIZATION regress_view_user1; SELECT * FROM rw_view1; -- not allowed UPDATE rw_view1 SET aa=aa; -- not allowed +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.aa = v.a + WHEN MATCHED THEN UPDATE SET aa = aa; -- not allowed SET SESSION AUTHORIZATION regress_view_user2; SELECT * FROM rw_view2; -- ok UPDATE rw_view2 SET aaa=aaa; -- not allowed UPDATE rw_view2 SET bbb=bbb; -- not allowed UPDATE rw_view2 SET ccc=ccc; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- ok SET SESSION AUTHORIZATION regress_view_user3; SELECT * FROM rw_view2; -- ok UPDATE rw_view2 SET aaa=aaa; -- not allowed UPDATE rw_view2 SET bbb=bbb; -- not allowed UPDATE rw_view2 SET ccc=ccc; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- ok RESET SESSION AUTHORIZATION; @@ -737,12 +989,24 @@ SELECT * FROM rw_view2; -- not allowed UPDATE rw_view2 SET aaa=aaa; -- not allowed UPDATE rw_view2 SET bbb=bbb; -- not allowed UPDATE rw_view2 SET ccc=ccc; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- not allowed SET SESSION AUTHORIZATION regress_view_user3; SELECT * FROM rw_view2; -- ok UPDATE rw_view2 SET aaa=aaa; -- not allowed UPDATE rw_view2 SET bbb=bbb; -- not allowed UPDATE rw_view2 SET ccc=ccc; -- ok +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET aaa = aaa; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET bbb = bbb; -- not allowed +MERGE INTO rw_view2 t USING (VALUES (1)) AS v(a) ON t.aaa = v.a + WHEN MATCHED THEN UPDATE SET ccc = ccc; -- ok RESET SESSION AUTHORIZATION; @@ -764,6 +1028,8 @@ ALTER VIEW rw_view1 ALTER COLUMN bb SET DEFAULT 'View default'; INSERT INTO rw_view1 VALUES (4, 'Row 4'); INSERT INTO rw_view1 (aa) VALUES (5); +MERGE INTO rw_view1 t USING (VALUES (6)) AS v(a) ON t.aa = v.a + WHEN NOT MATCHED THEN INSERT (aa) VALUES (v.a); SELECT * FROM base_tbl; @@ -845,6 +1111,7 @@ CREATE VIEW rw_view1 AS INSERT INTO rw_view1 VALUES (null, null, 1.1, null); -- should fail INSERT INTO rw_view1 (s, c, a) VALUES (null, null, 1.1); -- should fail +INSERT INTO rw_view1 (s, c, a) VALUES (default, default, 1.1); -- should fail INSERT INTO rw_view1 (a) VALUES (1.1) RETURNING a, s, c; -- OK UPDATE rw_view1 SET s = s WHERE a = 1.1; -- should fail UPDATE rw_view1 SET a = 1.05 WHERE a = 1.1 RETURNING s; -- OK @@ -945,6 +1212,18 @@ DELETE FROM ONLY rw_view2 WHERE a IN (-8, 8); -- Should delete -8 only SELECT * FROM ONLY base_tbl_parent ORDER BY a; SELECT * FROM base_tbl_child ORDER BY a; +MERGE INTO rw_view1 t USING (VALUES (-200), (10)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a+1; -- Should produce -199 and 11 +MERGE INTO ONLY rw_view1 t USING (VALUES (-100), (20)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a+1; -- Should produce -99 and 21 +MERGE INTO rw_view2 t USING (VALUES (-40), (3)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a+1; -- Should produce -39 only +MERGE INTO ONLY rw_view2 t USING (VALUES (-30), (4)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a+1; -- Should produce -29 only + +SELECT * FROM ONLY base_tbl_parent ORDER BY a; +SELECT * FROM base_tbl_child ORDER BY a; + CREATE TABLE other_tbl_parent (id int); CREATE TABLE other_tbl_child () INHERITS (other_tbl_parent); INSERT INTO other_tbl_parent VALUES (7),(200); @@ -977,7 +1256,17 @@ UPDATE rw_view1 SET b = 5 WHERE a = 3; -- ok UPDATE rw_view1 SET b = -5 WHERE a = 3; -- should fail INSERT INTO rw_view1(a) VALUES (9); -- ok INSERT INTO rw_view1(a) VALUES (10); -- should fail -SELECT * FROM base_tbl; +SELECT * FROM base_tbl ORDER BY a, b; + +MERGE INTO rw_view1 t USING (VALUES (10)) AS v(a) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a, v.a + 1); -- ok +MERGE INTO rw_view1 t USING (VALUES (11)) AS v(a) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a, v.a - 1); -- should fail +MERGE INTO rw_view1 t USING (VALUES (1)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a - 1; -- ok +MERGE INTO rw_view1 t USING (VALUES (2)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a + 1; -- should fail +SELECT * FROM base_tbl ORDER BY a, b; DROP TABLE base_tbl CASCADE; @@ -1139,9 +1428,17 @@ CREATE VIEW rw_view2 AS SELECT * FROM rw_view1 WHERE a > 0 WITH LOCAL CHECK OPTION; INSERT INTO rw_view2 VALUES (-5); -- should fail +MERGE INTO rw_view2 t USING (VALUES (-5)) AS v(a) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a); -- should fail INSERT INTO rw_view2 VALUES (5); -- ok +MERGE INTO rw_view2 t USING (VALUES (6)) AS v(a) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a); -- ok INSERT INTO rw_view2 VALUES (50); -- ok, but not in view +MERGE INTO rw_view2 t USING (VALUES (60)) AS v(a) ON t.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a); -- ok, but not in view UPDATE rw_view2 SET a = a - 10; -- should fail +MERGE INTO rw_view2 t USING (VALUES (6)) AS v(a) ON t.a = v.a + WHEN MATCHED THEN UPDATE SET a = t.a - 10; -- should fail SELECT * FROM base_tbl; -- Check option won't cascade down to base view with INSTEAD OF triggers @@ -1229,10 +1526,17 @@ SELECT table_name, column_name, is_updatable SELECT * FROM rw_view1 WHERE snoop(person); UPDATE rw_view1 SET person=person WHERE snoop(person); DELETE FROM rw_view1 WHERE NOT snoop(person); +MERGE INTO rw_view1 t + USING (VALUES ('Tom'), ('Dick'), ('Harry')) AS v(person) ON t.person = v.person + WHEN MATCHED AND snoop(t.person) THEN UPDATE SET person = v.person; EXPLAIN (costs off) SELECT * FROM rw_view1 WHERE snoop(person); EXPLAIN (costs off) UPDATE rw_view1 SET person=person WHERE snoop(person); EXPLAIN (costs off) DELETE FROM rw_view1 WHERE NOT snoop(person); +EXPLAIN (costs off) +MERGE INTO rw_view1 t + USING (VALUES ('Tom'), ('Dick'), ('Harry')) AS v(person) ON t.person = v.person + WHEN MATCHED AND snoop(t.person) THEN UPDATE SET person = v.person; -- security barrier view on top of security barrier view @@ -1255,10 +1559,17 @@ SELECT table_name, column_name, is_updatable SELECT * FROM rw_view2 WHERE snoop(person); UPDATE rw_view2 SET person=person WHERE snoop(person); DELETE FROM rw_view2 WHERE NOT snoop(person); +MERGE INTO rw_view2 t + USING (VALUES ('Tom'), ('Dick'), ('Harry')) AS v(person) ON t.person = v.person + WHEN MATCHED AND snoop(t.person) THEN UPDATE SET person = v.person; EXPLAIN (costs off) SELECT * FROM rw_view2 WHERE snoop(person); EXPLAIN (costs off) UPDATE rw_view2 SET person=person WHERE snoop(person); EXPLAIN (costs off) DELETE FROM rw_view2 WHERE NOT snoop(person); +EXPLAIN (costs off) +MERGE INTO rw_view2 t + USING (VALUES ('Tom'), ('Dick'), ('Harry')) AS v(person) ON t.person = v.person + WHEN MATCHED AND snoop(t.person) THEN UPDATE SET person = v.person; DROP TABLE base_tbl CASCADE; @@ -1480,6 +1791,19 @@ insert into uv_ptv values (1, 2); select tableoid::regclass, * from uv_pt; create view uv_ptv_wco as select * from uv_pt where a = 0 with check option; insert into uv_ptv_wco values (1, 2); +merge into uv_ptv t + using (values (1,2), (1,4)) as v(a,b) on t.a = v.a -- fail: matches 2 src rows + when matched then update set b = t.b + 1 + when not matched then insert values (v.a, v.b + 1); +merge into uv_ptv t + using (values (1,2), (1,4)) as v(a,b) on t.a = v.a and t.b = v.b + when matched then update set b = t.b + 1 + when not matched then insert values (v.a, v.b + 1); -- fail: no partition for b=5 +merge into uv_ptv t + using (values (1,2), (1,3)) as v(a,b) on t.a = v.a and t.b = v.b + when matched then update set b = t.b + 1 + when not matched then insert values (v.a, v.b + 1); -- ok +select tableoid::regclass, * from uv_pt order by a, b; drop view uv_ptv, uv_ptv_wco; drop table uv_pt, uv_pt1, uv_pt11; diff --git a/src/test/regress/sql/update.sql b/src/test/regress/sql/update.sql index 7a7bee77b9260..8b4707eb9c337 100644 --- a/src/test/regress/sql/update.sql +++ b/src/test/regress/sql/update.sql @@ -31,6 +31,9 @@ UPDATE update_test t SET b = t.b + 10 WHERE t.a = 10; SELECT * FROM update_test; +-- error, you're not supposed to qualify the target column +UPDATE update_test t SET t.b = t.b + 10 WHERE t.a = 10; + -- -- Test VALUES in FROM -- diff --git a/src/test/regress/sql/uuid.sql b/src/test/regress/sql/uuid.sql index 9a8f437c7d291..c88f6d087a716 100644 --- a/src/test/regress/sql/uuid.sql +++ b/src/test/regress/sql/uuid.sql @@ -85,5 +85,19 @@ INSERT INTO guid1 (guid_field) VALUES (gen_random_uuid()); INSERT INTO guid1 (guid_field) VALUES (gen_random_uuid()); SELECT count(DISTINCT guid_field) FROM guid1; + +-- extract functions + +-- version +SELECT uuid_extract_version('11111111-1111-5111-8111-111111111111'); -- 5 +SELECT uuid_extract_version(gen_random_uuid()); -- 4 +SELECT uuid_extract_version('11111111-1111-1111-1111-111111111111'); -- null + +-- timestamp +SELECT uuid_extract_timestamp('C232AB00-9414-11EC-B3C8-9F6BDECED846') = 'Tuesday, February 22, 2022 2:22:22.00 PM GMT+05:00'; -- RFC 4122bis test vector +SELECT uuid_extract_timestamp(gen_random_uuid()); -- null +SELECT uuid_extract_timestamp('11111111-1111-1111-1111-111111111111'); -- null + + -- clean up DROP TABLE guid1, guid2 CASCADE; diff --git a/src/test/regress/sql/vacuum.sql b/src/test/regress/sql/vacuum.sql index 51d7b1fecc710..d272dd064eb55 100644 --- a/src/test/regress/sql/vacuum.sql +++ b/src/test/regress/sql/vacuum.sql @@ -49,7 +49,7 @@ CLUSTER vaccluster; CREATE FUNCTION do_analyze() RETURNS VOID VOLATILE LANGUAGE SQL AS 'ANALYZE pg_am'; CREATE FUNCTION wrap_do_analyze(c INT) RETURNS INT IMMUTABLE LANGUAGE SQL - AS 'SELECT $1 FROM do_analyze()'; + AS 'SELECT $1 FROM public.do_analyze()'; CREATE INDEX ON vaccluster(wrap_do_analyze(i)); INSERT INTO vaccluster VALUES (1), (2); ANALYZE vaccluster; @@ -67,6 +67,35 @@ DELETE FROM vactst WHERE i % 5 <> 0; -- delete a few rows inside ANALYZE vactst; COMMIT; +-- Test ANALYZE setting relhassubclass=f for non-partitioning inheritance +BEGIN; +CREATE TABLE past_inh_parent (); +CREATE TABLE past_inh_child () INHERITS (past_inh_parent); +INSERT INTO past_inh_child DEFAULT VALUES; +INSERT INTO past_inh_child DEFAULT VALUES; +ANALYZE past_inh_parent; +SELECT reltuples, relhassubclass + FROM pg_class WHERE oid = 'past_inh_parent'::regclass; +DROP TABLE past_inh_child; +ANALYZE past_inh_parent; +SELECT reltuples, relhassubclass + FROM pg_class WHERE oid = 'past_inh_parent'::regclass; +COMMIT; + +-- Test ANALYZE setting relhassubclass=f for partitioning +BEGIN; +CREATE TABLE past_parted (i int) PARTITION BY LIST(i); +CREATE TABLE past_part PARTITION OF past_parted FOR VALUES IN (1); +INSERT INTO past_parted VALUES (1),(1); +ANALYZE past_parted; +DROP TABLE past_part; +SELECT reltuples, relhassubclass + FROM pg_class WHERE oid = 'past_parted'::regclass; +ANALYZE past_parted; +SELECT reltuples, relhassubclass + FROM pg_class WHERE oid = 'past_parted'::regclass; +COMMIT; + VACUUM FULL pg_am; VACUUM FULL pg_class; VACUUM FULL pg_database; @@ -84,6 +113,10 @@ CREATE INDEX brin_pvactst ON pvactst USING brin (i); CREATE INDEX gin_pvactst ON pvactst USING gin (a); CREATE INDEX gist_pvactst ON pvactst USING gist (p); CREATE INDEX spgist_pvactst ON pvactst USING spgist (p); +CREATE TABLE pvactst2 (i INT) WITH (autovacuum_enabled = off); +INSERT INTO pvactst2 SELECT generate_series(1, 1000); +CREATE INDEX ON pvactst2 (i); +CREATE INDEX ON pvactst2 (i); -- VACUUM invokes parallel index cleanup SET min_parallel_index_scan_size to 0; @@ -101,6 +134,14 @@ VACUUM (PARALLEL 2, INDEX_CLEANUP FALSE) pvactst; VACUUM (PARALLEL 2, FULL TRUE) pvactst; -- error, cannot use both PARALLEL and FULL VACUUM (PARALLEL) pvactst; -- error, cannot use PARALLEL option without parallel degree +-- Test parallel vacuum using the minimum maintenance_work_mem with and without +-- dead tuples. +SET maintenance_work_mem TO 64; +VACUUM (PARALLEL 2) pvactst2; +DELETE FROM pvactst2 WHERE i < 1000; +VACUUM (PARALLEL 2) pvactst2; +RESET maintenance_work_mem; + -- Test different combinations of parallel and full options for temporary tables CREATE TEMPORARY TABLE tmp (a int PRIMARY KEY); CREATE INDEX tmp_idx1 ON tmp (a); @@ -108,6 +149,7 @@ VACUUM (PARALLEL 1, FULL FALSE) tmp; -- parallel vacuum disabled for temp tables VACUUM (PARALLEL 0, FULL TRUE) tmp; -- can specify parallel disabled (even though that's implied by FULL) RESET min_parallel_index_scan_size; DROP TABLE pvactst; +DROP TABLE pvactst2; -- INDEX_CLEANUP option CREATE TABLE no_index_cleanup (i INT PRIMARY KEY, t TEXT); diff --git a/src/test/regress/sql/window.sql b/src/test/regress/sql/window.sql index 3ab6ac715d04a..02f105f070e8b 100644 --- a/src/test/regress/sql/window.sql +++ b/src/test/regress/sql/window.sql @@ -673,6 +673,7 @@ create temp table datetimes( ); insert into datetimes values +(0, '10:00', '10:00 BST', '-infinity', '-infinity', '-infinity'), (1, '11:00', '11:00 BST', '1 year', '2000-10-19 10:23:54+01', '2000-10-19 10:23:54'), (2, '12:00', '12:00 BST', '2 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), (3, '13:00', '13:00 BST', '3 years', '2001-10-19 10:23:54+01', '2001-10-19 10:23:54'), @@ -682,7 +683,8 @@ insert into datetimes values (7, '17:00', '17:00 BST', '7 years', '2005-10-19 10:23:54+01', '2005-10-19 10:23:54'), (8, '18:00', '18:00 BST', '8 years', '2006-10-19 10:23:54+01', '2006-10-19 10:23:54'), (9, '19:00', '19:00 BST', '9 years', '2007-10-19 10:23:54+01', '2007-10-19 10:23:54'), -(10, '20:00', '20:00 BST', '10 years', '2008-10-19 10:23:54+01', '2008-10-19 10:23:54'); +(10, '20:00', '20:00 BST', '10 years', '2008-10-19 10:23:54+01', '2008-10-19 10:23:54'), +(11, '21:00', '21:00 BST', 'infinity', 'infinity', 'infinity'); select id, f_time, first_value(id) over w, last_value(id) over w from datetimes @@ -694,6 +696,32 @@ from datetimes window w as (order by f_time desc range between '70 min' preceding and '2 hours' following); +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time desc range between + '-70 min' preceding and '2 hours' following); -- error, negative offset disallowed + +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time range between + 'infinity'::interval preceding and 'infinity'::interval following); + +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time range between + 'infinity'::interval preceding and 'infinity'::interval preceding); + +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time range between + 'infinity'::interval following and 'infinity'::interval following); + +select id, f_time, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_time range between + '-infinity'::interval following and + 'infinity'::interval following); -- error, negative offset disallowed + select id, f_timetz, first_value(id) over w, last_value(id) over w from datetimes window w as (order by f_timetz range between @@ -704,6 +732,32 @@ from datetimes window w as (order by f_timetz desc range between '70 min' preceding and '2 hours' following); +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz desc range between + '70 min' preceding and '-2 hours' following); -- error, negative offset disallowed + +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz range between + 'infinity'::interval preceding and 'infinity'::interval following); + +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz range between + 'infinity'::interval preceding and 'infinity'::interval preceding); + +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz range between + 'infinity'::interval following and 'infinity'::interval following); + +select id, f_timetz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timetz range between + 'infinity'::interval following and + '-infinity'::interval following); -- error, negative offset disallowed + select id, f_interval, first_value(id) over w, last_value(id) over w from datetimes window w as (order by f_interval range between @@ -714,6 +768,32 @@ from datetimes window w as (order by f_interval desc range between '1 year' preceding and '1 year' following); +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval desc range between + '-1 year' preceding and '1 year' following); -- error, negative offset disallowed + +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval range between + 'infinity'::interval preceding and 'infinity'::interval following); + +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval range between + 'infinity'::interval preceding and 'infinity'::interval preceding); + +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval range between + 'infinity'::interval following and 'infinity'::interval following); + +select id, f_interval, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_interval range between + '-infinity'::interval following and + 'infinity'::interval following); -- error, negative offset disallowed + select id, f_timestamptz, first_value(id) over w, last_value(id) over w from datetimes window w as (order by f_timestamptz range between @@ -724,6 +804,32 @@ from datetimes window w as (order by f_timestamptz desc range between '1 year' preceding and '1 year' following); +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz desc range between + '1 year' preceding and '-1 year' following); -- error, negative offset disallowed + +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz range between + 'infinity'::interval preceding and 'infinity'::interval following); + +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz range between + 'infinity'::interval preceding and 'infinity'::interval preceding); + +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz range between + 'infinity'::interval following and 'infinity'::interval following); + +select id, f_timestamptz, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamptz range between + '-infinity'::interval following and + 'infinity'::interval following); -- error, negative offset disallowed + select id, f_timestamp, first_value(id) over w, last_value(id) over w from datetimes window w as (order by f_timestamp range between @@ -734,6 +840,32 @@ from datetimes window w as (order by f_timestamp desc range between '1 year' preceding and '1 year' following); +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp desc range between + '-1 year' preceding and '1 year' following); -- error, negative offset disallowed + +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp range between + 'infinity'::interval preceding and 'infinity'::interval following); + +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp range between + 'infinity'::interval preceding and 'infinity'::interval preceding); + +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp range between + 'infinity'::interval following and 'infinity'::interval following); + +select id, f_timestamp, first_value(id) over w, last_value(id) over w +from datetimes +window w as (order by f_timestamp range between + '-infinity'::interval following and + 'infinity'::interval following); -- error, negative offset disallowed + -- RANGE offset PRECEDING/FOLLOWING error cases select sum(salary) over (order by enroll_date, salary range between '1 year'::interval preceding and '2 years'::interval following exclude ties), salary, enroll_date from empsalary; @@ -1213,6 +1345,13 @@ SELECT * FROM FROM empsalary) emp WHERE c = 1; +-- Try another case with a WindowFunc with a byref return type +SELECT * FROM + (SELECT row_number() OVER (PARTITION BY salary) AS rn, + lead(depname) OVER (PARTITION BY salary) || ' Department' AS n_dep + FROM empsalary) emp +WHERE rn < 1; + -- Some more complex cases with multiple window clauses EXPLAIN (COSTS OFF) SELECT * FROM @@ -1236,6 +1375,23 @@ SELECT * FROM FROM empsalary ) e WHERE rn <= 1 AND c1 <= 3 AND nt < 2; +-- Ensure we remove references to reduced outer joins as nulling rels in run +-- conditions +EXPLAIN (COSTS OFF) +SELECT 1 FROM + (SELECT ntile(e2.salary) OVER (PARTITION BY e1.depname) AS c + FROM empsalary e1 LEFT JOIN empsalary e2 ON TRUE + WHERE e1.empno = e2.empno) s +WHERE s.c = 1; + +-- Ensure the run condition optimization is used in cases where the WindowFunc +-- has a Var from another query level +EXPLAIN (COSTS OFF) +SELECT 1 FROM + (SELECT ntile(s1.x) OVER () AS c + FROM (SELECT (SELECT 1) AS x) AS s1) s +WHERE s.c = 1; + -- Tests to ensure we don't push down the run condition when it's not valid to -- do so. @@ -1591,6 +1747,39 @@ SELECT i,AVG(v::numeric) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED SELECT i,AVG(v::interval) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM (VALUES(1,'1 sec'),(2,'2 sec'),(3,NULL),(4,NULL)) t(i,v); +-- moving aggregates over infinite intervals +SELECT x + ,avg(x) OVER(ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING ) as curr_next_avg + ,avg(x) OVER(ROWS BETWEEN 1 PRECEDING AND CURRENT ROW ) as prev_curr_avg + ,sum(x) OVER(ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING ) as curr_next_sum + ,sum(x) OVER(ROWS BETWEEN 1 PRECEDING AND CURRENT ROW ) as prev_curr_sum +FROM (VALUES (NULL::interval), + ('infinity'::interval), + ('-2147483648 days -2147483648 months -9223372036854775807 usecs'), -- extreme interval value + ('-infinity'::interval), + ('2147483647 days 2147483647 months 9223372036854775806 usecs'), -- extreme interval value + ('infinity'::interval), + ('6 days'::interval), + ('7 days'::interval), + (NULL::interval), + ('-infinity'::interval)) v(x); + +--should fail. +SELECT x, avg(x) OVER(ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) +FROM (VALUES (NULL::interval), + ('3 days'::interval), + ('infinity'::timestamptz - now()), + ('6 days'::interval), + ('-infinity'::interval)) v(x); + +--should fail. +SELECT x, sum(x) OVER(ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) +FROM (VALUES (NULL::interval), + ('3 days'::interval), + ('infinity'::timestamptz - now()), + ('6 days'::interval), + ('-infinity'::interval)) v(x); + SELECT i,SUM(v::smallint) OVER (ORDER BY i ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM (VALUES(1,1),(2,2),(3,NULL),(4,NULL)) t(i,v); @@ -1716,6 +1905,41 @@ SELECT i, b, bool_and(b) OVER w, bool_or(b) OVER w FROM (VALUES (1,true), (2,true), (3,false), (4,false), (5,true)) v(i,b) WINDOW w AS (ORDER BY i ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING); +-- +-- Test WindowAgg costing takes into account the number of rows that need to +-- be fetched before the first row can be output. +-- + +-- Ensure we get a cheap start up plan as the WindowAgg can output the first +-- row after reading 1 row from the join. +EXPLAIN (COSTS OFF) +SELECT COUNT(*) OVER (ORDER BY t1.unique1) +FROM tenk1 t1 INNER JOIN tenk1 t2 ON t1.unique1 = t2.tenthous +LIMIT 1; + +-- Ensure we get a cheap total plan. Lack of ORDER BY in the WindowClause +-- means that all rows must be read from the join, so a cheap startup plan +-- isn't a good choice. +EXPLAIN (COSTS OFF) +SELECT COUNT(*) OVER () +FROM tenk1 t1 INNER JOIN tenk1 t2 ON t1.unique1 = t2.tenthous +WHERE t2.two = 1 +LIMIT 1; + +-- Ensure we get a cheap total plan. This time use UNBOUNDED FOLLOWING, which +-- needs to read all join rows to output the first WindowAgg row. +EXPLAIN (COSTS OFF) +SELECT COUNT(*) OVER (ORDER BY t1.unique1 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) +FROM tenk1 t1 INNER JOIN tenk1 t2 ON t1.unique1 = t2.tenthous +LIMIT 1; + +-- Ensure we get a cheap total plan. This time use 10000 FOLLOWING so we need +-- to read all join rows. +EXPLAIN (COSTS OFF) +SELECT COUNT(*) OVER (ORDER BY t1.unique1 ROWS BETWEEN UNBOUNDED PRECEDING AND 10000 FOLLOWING) +FROM tenk1 t1 INNER JOIN tenk1 t2 ON t1.unique1 = t2.tenthous +LIMIT 1; + -- Tests for problems with failure to walk or mutate expressions -- within window frame clauses. diff --git a/src/test/regress/sql/with.sql b/src/test/regress/sql/with.sql index 582139df7bd83..6d55c7731a9f4 100644 --- a/src/test/regress/sql/with.sql +++ b/src/test/regress/sql/with.sql @@ -33,11 +33,11 @@ SELECT * FROM t; -- UNION DISTINCT requires hashable type WITH RECURSIVE t(n) AS ( - VALUES (1::money) + VALUES ('01'::varbit) UNION - SELECT n+1::money FROM t WHERE n < 100::money + SELECT n || '10'::varbit FROM t WHERE n < '100'::varbit ) -SELECT sum(n) FROM t; +SELECT n FROM t; -- recursive view CREATE RECURSIVE VIEW nums (n) AS @@ -347,6 +347,37 @@ UNION ALL SELECT t1.id, t2.path, t2 FROM t AS t1 JOIN t AS t2 ON (t1.id=t2.id); +CREATE TEMP TABLE duplicates (a INT NOT NULL); +INSERT INTO duplicates VALUES(1), (1); + +-- Try out a recursive UNION case where the non-recursive part's table slot +-- uses TTSOpsBufferHeapTuple and contains duplicate rows. +WITH RECURSIVE cte (a) as ( + SELECT a FROM duplicates + UNION + SELECT a FROM cte +) +SELECT a FROM cte; + +-- test that column statistics from a materialized CTE are available +-- to upper planner (otherwise, we'd get a stupider plan) +explain (costs off) +with x as materialized (select unique1 from tenk1 b) +select count(*) from tenk1 a + where unique1 in (select * from x); + +explain (costs off) +with x as materialized (insert into tenk1 default values returning unique1) +select count(*) from tenk1 a + where unique1 in (select * from x); + +-- test that pathkeys from a materialized CTE are propagated up to the +-- outer query +explain (costs off) +with x as materialized (select unique1 from tenk1 b order by unique1) +select count(*) from tenk1 a + where unique1 in (select * from x); + -- SEARCH clause create temp table graph0( f int, t int, label text ); @@ -889,6 +920,42 @@ WITH RECURSIVE x(n) AS (SELECT n FROM x) WITH RECURSIVE x(n) AS (SELECT n FROM x UNION ALL SELECT 1) SELECT * FROM x; +-- allow this, because we historically have +WITH RECURSIVE x(n) AS ( + WITH x1 AS (SELECT 1 AS n) + SELECT 0 + UNION + SELECT * FROM x1) + SELECT * FROM x; + +-- but this should be rejected +WITH RECURSIVE x(n) AS ( + WITH x1 AS (SELECT 1 FROM x) + SELECT 0 + UNION + SELECT * FROM x1) + SELECT * FROM x; + +-- and this too +WITH RECURSIVE x(n) AS ( + (WITH x1 AS (SELECT 1 FROM x) SELECT * FROM x1) + UNION + SELECT 0) + SELECT * FROM x; + +-- and this +WITH RECURSIVE x(n) AS ( + SELECT 0 UNION SELECT 1 + ORDER BY (SELECT n FROM x)) + SELECT * FROM x; + +-- and this +WITH RECURSIVE x(n) AS ( + WITH sub_cte AS (SELECT * FROM x) + DELETE FROM graph RETURNING f) + SELECT * FROM x; + + CREATE TEMPORARY TABLE y (a INTEGER); INSERT INTO y SELECT generate_series(1, 10); @@ -1579,6 +1646,14 @@ WITH t AS ( ) SELECT * FROM t; +-- RETURNING tries to return its own output +WITH RECURSIVE t(action, a) AS ( + MERGE INTO y USING (VALUES (11)) v(a) ON y.a = v.a + WHEN NOT MATCHED THEN INSERT VALUES (v.a) + RETURNING merge_action(), (SELECT a FROM t) +) +SELECT * FROM t; + -- data-modifying WITH allowed only at the top level SELECT * FROM ( WITH t AS (UPDATE y SET a=a+1 RETURNING *) diff --git a/src/test/regress/sql/xml.sql b/src/test/regress/sql/xml.sql index a591eea2e5d14..4c3520ce8980f 100644 --- a/src/test/regress/sql/xml.sql +++ b/src/test/regress/sql/xml.sql @@ -168,6 +168,9 @@ SELECT xmlserialize(CONTENT '' AS text INDENT); -- 'no indent' = not using 'no indent' SELECT xmlserialize(DOCUMENT '42' AS text) = xmlserialize(DOCUMENT '42' AS text NO INDENT); SELECT xmlserialize(CONTENT '42' AS text) = xmlserialize(CONTENT '42' AS text NO INDENT); +-- indent xml strings containing blank nodes +SELECT xmlserialize(DOCUMENT ' ' AS text INDENT); +SELECT xmlserialize(CONTENT 'text node ' AS text INDENT); SELECT xml 'bar' IS DOCUMENT; SELECT xml 'barfoo' IS DOCUMENT; @@ -216,6 +219,8 @@ CREATE VIEW xmlview6 AS SELECT xmlpi(name foo, 'bar'); CREATE VIEW xmlview7 AS SELECT xmlroot(xml '', version no value, standalone yes); CREATE VIEW xmlview8 AS SELECT xmlserialize(content 'good' as char(10)); CREATE VIEW xmlview9 AS SELECT xmlserialize(content 'good' as text); +CREATE VIEW xmlview10 AS SELECT xmlserialize(document '42' AS text indent); +CREATE VIEW xmlview11 AS SELECT xmlserialize(document '42' AS character varying no indent); SELECT table_name, view_definition FROM information_schema.views WHERE table_name LIKE 'xmlview%' ORDER BY 1; @@ -436,13 +441,15 @@ SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), PASSING '10' COLUMNS a int PATH 'zz:a'); -CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), - '/zz:rows/zz:row' +CREATE VIEW xmltableview2 AS SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS "Zz"), + '/Zz:rows/Zz:row' PASSING '10' - COLUMNS a int PATH 'zz:a'); + COLUMNS a int PATH 'Zz:a'); SELECT * FROM xmltableview2; +\sv xmltableview2 + SELECT * FROM XMLTABLE(XMLNAMESPACES(DEFAULT 'http://x.y'), '/rows/row' PASSING '10' @@ -505,7 +512,10 @@ SELECT xmltable.* SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; EXPLAIN (VERBOSE, COSTS OFF) -SELECT xmltable.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) WHERE "COUNTRY_NAME" = 'Japan'; +SELECT f.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) AS f WHERE "COUNTRY_NAME" = 'Japan'; + +EXPLAIN (VERBOSE, FORMAT JSON, COSTS OFF) +SELECT f.* FROM xmldata, LATERAL xmltable('/ROWS/ROW[COUNTRY_NAME="Japan" or COUNTRY_NAME="India"]' PASSING data COLUMNS "COUNTRY_NAME" text, "REGION_ID" int) AS f WHERE "COUNTRY_NAME" = 'Japan'; -- should to work with more data INSERT INTO xmldata VALUES(' @@ -660,3 +670,10 @@ SELECT * FROM XMLTABLE('*' PASSING 'pre"', b xml PATH '""'); + +SELECT xmltext(NULL); +SELECT xmltext(''); +SELECT xmltext(' '); +SELECT xmltext('foo `$_-+?=*^%!|/\()[]{}'); +SELECT xmltext('foo & <"bar">'); +SELECT xmltext('x'|| '

73

'::xml || .42 || true || 'j'::char); diff --git a/src/test/ssl/Makefile b/src/test/ssl/Makefile index af1e06e949088..6441a8047b1d0 100644 --- a/src/test/ssl/Makefile +++ b/src/test/ssl/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/test/ssl # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/test/ssl/Makefile @@ -23,7 +23,7 @@ export OPENSSL with_ssl sslfiles sslfiles-clean: $(MAKE) -f $(srcdir)/sslfiles.mk $@ -clean distclean maintainer-clean: +clean distclean: rm -rf tmp_check $(MAKE) -f $(srcdir)/sslfiles.mk $@ diff --git a/src/test/ssl/conf/cas.config b/src/test/ssl/conf/cas.config index 2c4851033a372..43bcf739bbbd4 100644 --- a/src/test/ssl/conf/cas.config +++ b/src/test/ssl/conf/cas.config @@ -38,7 +38,10 @@ crl = ./ssl/server.crl dir = ./ssl/ database = ./ssl/client_ca-certindex default_md = sha256 -default_days= 10000 +# Startdate and enddate are required for testing notBefore/notAfter with +# stable timestamps. +default_startdate = 20230629010101Z +default_enddate = 20500101010101Z default_crl_days= 10000 certificate = ./ssl/client_ca.crt private_key = ./ssl/client_ca.key diff --git a/src/test/ssl/conf/client_ca.config b/src/test/ssl/conf/client_ca.config index 5990f06000201..08365aac9558d 100644 --- a/src/test/ssl/conf/client_ca.config +++ b/src/test/ssl/conf/client_ca.config @@ -1,7 +1,9 @@ -# An OpenSSL format CSR config file for creating the client root certificate. -# This configuration file is also used when operating the CA. +# An OpenSSL format CSR config file for creating the client Intermediate +# Certificate Authority. This configuration file is also used when operating +# the CA. # -# This certificate is used to sign client certificates. It is self-signed. +# This certificate is used to sign client certificates. It is an Intermediate +# CA. [ req ] distinguished_name = req_distinguished_name diff --git a/src/test/ssl/conf/root_ca.config b/src/test/ssl/conf/root_ca.config index e193186f8bf80..6caa8a1ae631a 100644 --- a/src/test/ssl/conf/root_ca.config +++ b/src/test/ssl/conf/root_ca.config @@ -1,5 +1,5 @@ # A root certificate authority. The server and client CA's certificates -# are signed by this root CA. +# are signed by this root CA. This certificate is self-signed. [ req ] distinguished_name = req_distinguished_name diff --git a/src/test/ssl/conf/server_ca.config b/src/test/ssl/conf/server_ca.config index 496aaba29fbfc..15f8d1590fe9a 100644 --- a/src/test/ssl/conf/server_ca.config +++ b/src/test/ssl/conf/server_ca.config @@ -1,7 +1,9 @@ -# An OpenSSL format CSR config file for creating the server root certificate. -# This configuration file is also used when operating the CA. +# An OpenSSL format CSR config file for creating the server Intermediate +# Certificate Authority. This configuration file is also used when operating +# the CA. # -# This certificate is used to sign server certificates. It is self-signed. +# This certificate is used to sign server certificates. It is an Intermediate +# CA. [ req ] distinguished_name = req_distinguished_name diff --git a/src/test/ssl/meson.build b/src/test/ssl/meson.build index 4cda81f3bc27e..b3c5503f79219 100644 --- a/src/test/ssl/meson.build +++ b/src/test/ssl/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tests += { 'name': 'ssl', @@ -7,7 +7,7 @@ tests += { 'tap': { 'env': { 'with_ssl': ssl_library, - 'OPENSSL': openssl.path(), + 'OPENSSL': openssl.found() ? openssl.path() : '', }, 'tests': [ 't/001_ssltests.pl', diff --git a/src/test/ssl/ssl/both-cas-1.crt b/src/test/ssl/ssl/both-cas-1.crt index 4f4bc707d6a50..1584b4ba0ef5b 100644 --- a/src/test/ssl/ssl/both-cas-1.crt +++ b/src/test/ssl/ssl/both-cas-1.crt @@ -18,40 +18,46 @@ OCZhKLxVZiZmO71BBwsTgwtU58/G9e2ciGGdltI8ANlmVfdtwgRz3b7H9EUZat6s kubl/m5HWBsKJEWEzFWrWkQV3ipoTmorJ6KCGABBCeVYmg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDFDCCAfygAwIBAgIIICEDAxQSBwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +MIIDnjCCAoagAwIBAgIIICMHExY1IwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl -c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD -VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg -Y2xpZW50IGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu+ce -8rkNfoCvI9Wjug9pxsptsdjhZ4s7ZZ8eD5VlloryK2JccusQIX61XY8I3OZjLTgq -1SpZbHQvktRH6gmU7tfoBdEnRuXB7idkbYOKIrC0hdttb/5rDzjQGtXTmwoVrCcJ -nvO1Whay/gdsoqX1tT1MTPWu/6dfQkQXA0PizVvmBasAEQchxqtcH2rSc6TPE13v -lxJ0X1vSlz92uT6kenrxUDs43AH/kASdIQBHXVA4XWBAm7NRqwKX7BBwbsF2m3Qh -+NY9Bf9MnJHLcnVnwZdlW5nd7H7BTB43XvkiYascqusYki+fY58eGSprZ/VUjmGx -pgQnQXWCu0U3JyUL/QIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQC1syY2Rk02m5PGtfkMUIU7ZSe0mM+g0BgWAyCF/mFFYdfY0xHtqy0x -QWkW9OR0KBl4JpphDDolHoNL3TLydH3t4inX8SAOpaUdsjMcIPKqjT1htQm0Pk5r -vFYvKuVrxMnV0F+wMmZRuziKWrZlVDwBMfCAchzuVexDWfcjTmUQmhZxJuUzORw3 -swgh9HIpxjMkgdlHodbMAEpMIkkoeJnph3I9uTocXZbK/lAInggQdm0Q+on1ZT0A -ljO/6jisDZzIguE4ZAQ2DfYsGI8H3tz/+76uIwwBNOmu0woUDSWXVcPWiviq49Bi -GmH0KlUfWAphj86IfTWXT1HRay3eZQt3 +c3Qgc3VpdGUwIBcNMjMwNzEzMTQzNTIzWhgPMjA1MDExMjgxNDM1MjNaMEIxQDA+ +BgNVBAMMN1Rlc3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVz +dCBjbGllbnQgY2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7 +5x7yuQ1+gK8j1aO6D2nGym2x2OFniztlnx4PlWWWivIrYlxy6xAhfrVdjwjc5mMt +OCrVKllsdC+S1EfqCZTu1+gF0SdG5cHuJ2Rtg4oisLSF221v/msPONAa1dObChWs +Jwme87VaFrL+B2yipfW1PUxM9a7/p19CRBcDQ+LNW+YFqwARByHGq1wfatJzpM8T +Xe+XEnRfW9KXP3a5PqR6evFQOzjcAf+QBJ0hAEddUDhdYECbs1GrApfsEHBuwXab +dCH41j0F/0yckctydWfBl2Vbmd3sfsFMHjde+SJhqxyq6xiSL59jnx4ZKmtn9VSO +YbGmBCdBdYK7RTcnJQv9AgMBAAGjgZcwgZQwDAYDVR0TBAUwAwEB/zAdBgNVHQ4E +FgQUn6Tr0smZ3rADsDA0IoFhFUu9rTYwZQYDVR0jBF4wXKFEpEIwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGWCFBfnvJQgNLw9MyrcSA1T3Q2PyJIFMA0GCSqGSIb3DQEBCwUAA4IB +AQAbYUfwGvV4u5Gpbhv5yxdueC0faKVIEXYRnT4Dky01cV7pGkFSFndlA2mFsj1g +uuzkTFPMedcBefMoq2o2eX2B4ogrFHovxELI82i9pbv/MmsGNYwbMsp2lnUhNWon +QwxFqMGA5Y2p8vyEG7lrHKiFDdt7uPxcOeTiWo0ZpC8uThqiR4fUkPinQ3EHEFGQ ++zl+G3pb4VRUzsyqh2n9swudqQcwjsDlQlkQ2vzVb6IWWiUCwL3V7HGPGmlVbsFG +nQ1M44aBtWbBQtubfBRwYb5r+4sRN94LST6Phmhnd/AJccIKdCaheq+yLVVGiCJN +3nDTmgTVSSmOm/RRmSXNp7AH -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDFDCCAfygAwIBAgIIICEDAxQSBwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +MIIDnjCCAoagAwIBAgIIICMHExY1IwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGUwIBcNMjMwNzEzMTQzNTIzWhgPMjA1MDExMjgxNDM1MjNaMEIxQDA+ +BgNVBAMMN1Rlc3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVz +dCBzZXJ2ZXIgY2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDi +SnYZbmc9vpCtKu1sKV9l663JCceubhMw8Gg16kV0hXEFf/TgGC4zkiYNHN7+G45Y +D7Nq0kBCq3dHt2wPCc6c8pQoI64dfprVqPkvzoe1WBpZNetkUTk20v08jNeRa7Xd +RbRR6we1s9VG/prp8Hs2mmHqEfLuI9lvTT0Dz+VMmfFI8Lf278r+w+qOtVloAkX7 +AOyoLEJlNS0BQW9YWdH9N5ctaUXMG6lLV2OAjs+W1smpKfpIpMCA1lPGlElu70hy +non/nQQvBP77SfQpZVc0esM18jkZpr5LEKUCw+x6LaMsqmBHpAULfCffxn2r0uMB +W4L4VaGg3W6Fh6iuJwRfAgMBAAGjgZcwgZQwDAYDVR0TBAUwAwEB/zAdBgNVHQ4E +FgQU8o86ZkBQZEgi1y6C/1aewrPudAowZQYDVR0jBF4wXKFEpEIwQDE+MDwGA1UE Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl -c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD -VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg -c2VydmVyIGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4kp2 -GW5nPb6QrSrtbClfZeutyQnHrm4TMPBoNepFdIVxBX/04BguM5ImDRze/huOWA+z -atJAQqt3R7dsDwnOnPKUKCOuHX6a1aj5L86HtVgaWTXrZFE5NtL9PIzXkWu13UW0 -UesHtbPVRv6a6fB7Npph6hHy7iPZb009A8/lTJnxSPC39u/K/sPqjrVZaAJF+wDs -qCxCZTUtAUFvWFnR/TeXLWlFzBupS1djgI7PltbJqSn6SKTAgNZTxpRJbu9Icp6J -/50ELwT++0n0KWVXNHrDNfI5Gaa+SxClAsPsei2jLKpgR6QFC3wn38Z9q9LjAVuC -+FWhoN1uhYeoricEXwIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQCdCA/EoXrustoV4jJGbkdXDuOUkBurwggSNBAqUBSDvCohRoD77Ecb -QVuzPNxWKG+E4PwfUq2ha+2yPONEJ28ZgsbHq5qlJDMJ43wlcjn6wmmAJNeSpO8F -0V9d2X/4wNZty9/zbwTnw26KChgDHumQ0WIbCoBtdqy8KDswYOvpgws6dqc021I7 -UrFo6vZek7VoApbJgkDL6qYADa6ApfW43ThH4sViFITeYt/kSHgmy2Udhs34jMM8 -xsFP/uYpRi1b1glenwSIKiHjD4/C9vnWQt5K3gRBvYukEj2Bw9VkNRpBVCi0cOoA -OuwX3bwzNYNbZQv4K66oRpvuoEjCNeHg +c3Qgc3VpdGWCFBfnvJQgNLw9MyrcSA1T3Q2PyJIFMA0GCSqGSIb3DQEBCwUAA4IB +AQANlEDrM357a7o+WcKB0Ocll2UtBMq7PDms1Pjqm3fFu/wdKDUomG8W2/MgDmFl +CVeAPpofb6J0oaxiEZOR68pOhdccMznArtKix6t3RkDiXdm4d5UORMMR+s9CymXV +MUTWpQpAg3qP3mRI+3E9OrgfhvmVcuOa7/cdTS/sylGe8Db+nJQD0be9NHtnhO56 +IA+Li+8oWzD4UNsP3gAmhLkyToz5wlPHzEkgGxkEySNErEOKTOX5Xyk5z+QToRhz +adkt0mBw/dxoJk9DveCtIqxDelxJsDeJFtqoc5qVVE9yOp7rujGsqgWl2PcJeyKM +Crh9qsqNzJ2R29pq0g6Lfzh2 -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/both-cas-2.crt b/src/test/ssl/ssl/both-cas-2.crt index 01d0c4d6a4399..674d8e6a7e358 100644 --- a/src/test/ssl/ssl/both-cas-2.crt +++ b/src/test/ssl/ssl/both-cas-2.crt @@ -18,40 +18,46 @@ OCZhKLxVZiZmO71BBwsTgwtU58/G9e2ciGGdltI8ANlmVfdtwgRz3b7H9EUZat6s kubl/m5HWBsKJEWEzFWrWkQV3ipoTmorJ6KCGABBCeVYmg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDFDCCAfygAwIBAgIIICEDAxQSBwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +MIIDnjCCAoagAwIBAgIIICMHExY1IwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl -c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD -VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg -c2VydmVyIGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4kp2 -GW5nPb6QrSrtbClfZeutyQnHrm4TMPBoNepFdIVxBX/04BguM5ImDRze/huOWA+z -atJAQqt3R7dsDwnOnPKUKCOuHX6a1aj5L86HtVgaWTXrZFE5NtL9PIzXkWu13UW0 -UesHtbPVRv6a6fB7Npph6hHy7iPZb009A8/lTJnxSPC39u/K/sPqjrVZaAJF+wDs -qCxCZTUtAUFvWFnR/TeXLWlFzBupS1djgI7PltbJqSn6SKTAgNZTxpRJbu9Icp6J -/50ELwT++0n0KWVXNHrDNfI5Gaa+SxClAsPsei2jLKpgR6QFC3wn38Z9q9LjAVuC -+FWhoN1uhYeoricEXwIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQCdCA/EoXrustoV4jJGbkdXDuOUkBurwggSNBAqUBSDvCohRoD77Ecb -QVuzPNxWKG+E4PwfUq2ha+2yPONEJ28ZgsbHq5qlJDMJ43wlcjn6wmmAJNeSpO8F -0V9d2X/4wNZty9/zbwTnw26KChgDHumQ0WIbCoBtdqy8KDswYOvpgws6dqc021I7 -UrFo6vZek7VoApbJgkDL6qYADa6ApfW43ThH4sViFITeYt/kSHgmy2Udhs34jMM8 -xsFP/uYpRi1b1glenwSIKiHjD4/C9vnWQt5K3gRBvYukEj2Bw9VkNRpBVCi0cOoA -OuwX3bwzNYNbZQv4K66oRpvuoEjCNeHg +c3Qgc3VpdGUwIBcNMjMwNzEzMTQzNTIzWhgPMjA1MDExMjgxNDM1MjNaMEIxQDA+ +BgNVBAMMN1Rlc3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVz +dCBzZXJ2ZXIgY2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDi +SnYZbmc9vpCtKu1sKV9l663JCceubhMw8Gg16kV0hXEFf/TgGC4zkiYNHN7+G45Y +D7Nq0kBCq3dHt2wPCc6c8pQoI64dfprVqPkvzoe1WBpZNetkUTk20v08jNeRa7Xd +RbRR6we1s9VG/prp8Hs2mmHqEfLuI9lvTT0Dz+VMmfFI8Lf278r+w+qOtVloAkX7 +AOyoLEJlNS0BQW9YWdH9N5ctaUXMG6lLV2OAjs+W1smpKfpIpMCA1lPGlElu70hy +non/nQQvBP77SfQpZVc0esM18jkZpr5LEKUCw+x6LaMsqmBHpAULfCffxn2r0uMB +W4L4VaGg3W6Fh6iuJwRfAgMBAAGjgZcwgZQwDAYDVR0TBAUwAwEB/zAdBgNVHQ4E +FgQU8o86ZkBQZEgi1y6C/1aewrPudAowZQYDVR0jBF4wXKFEpEIwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGWCFBfnvJQgNLw9MyrcSA1T3Q2PyJIFMA0GCSqGSIb3DQEBCwUAA4IB +AQANlEDrM357a7o+WcKB0Ocll2UtBMq7PDms1Pjqm3fFu/wdKDUomG8W2/MgDmFl +CVeAPpofb6J0oaxiEZOR68pOhdccMznArtKix6t3RkDiXdm4d5UORMMR+s9CymXV +MUTWpQpAg3qP3mRI+3E9OrgfhvmVcuOa7/cdTS/sylGe8Db+nJQD0be9NHtnhO56 +IA+Li+8oWzD4UNsP3gAmhLkyToz5wlPHzEkgGxkEySNErEOKTOX5Xyk5z+QToRhz +adkt0mBw/dxoJk9DveCtIqxDelxJsDeJFtqoc5qVVE9yOp7rujGsqgWl2PcJeyKM +Crh9qsqNzJ2R29pq0g6Lfzh2 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDFDCCAfygAwIBAgIIICEDAxQSBwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +MIIDnjCCAoagAwIBAgIIICMHExY1IwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGUwIBcNMjMwNzEzMTQzNTIzWhgPMjA1MDExMjgxNDM1MjNaMEIxQDA+ +BgNVBAMMN1Rlc3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVz +dCBjbGllbnQgY2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7 +5x7yuQ1+gK8j1aO6D2nGym2x2OFniztlnx4PlWWWivIrYlxy6xAhfrVdjwjc5mMt +OCrVKllsdC+S1EfqCZTu1+gF0SdG5cHuJ2Rtg4oisLSF221v/msPONAa1dObChWs +Jwme87VaFrL+B2yipfW1PUxM9a7/p19CRBcDQ+LNW+YFqwARByHGq1wfatJzpM8T +Xe+XEnRfW9KXP3a5PqR6evFQOzjcAf+QBJ0hAEddUDhdYECbs1GrApfsEHBuwXab +dCH41j0F/0yckctydWfBl2Vbmd3sfsFMHjde+SJhqxyq6xiSL59jnx4ZKmtn9VSO +YbGmBCdBdYK7RTcnJQv9AgMBAAGjgZcwgZQwDAYDVR0TBAUwAwEB/zAdBgNVHQ4E +FgQUn6Tr0smZ3rADsDA0IoFhFUu9rTYwZQYDVR0jBF4wXKFEpEIwQDE+MDwGA1UE Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl -c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD -VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg -Y2xpZW50IGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu+ce -8rkNfoCvI9Wjug9pxsptsdjhZ4s7ZZ8eD5VlloryK2JccusQIX61XY8I3OZjLTgq -1SpZbHQvktRH6gmU7tfoBdEnRuXB7idkbYOKIrC0hdttb/5rDzjQGtXTmwoVrCcJ -nvO1Whay/gdsoqX1tT1MTPWu/6dfQkQXA0PizVvmBasAEQchxqtcH2rSc6TPE13v -lxJ0X1vSlz92uT6kenrxUDs43AH/kASdIQBHXVA4XWBAm7NRqwKX7BBwbsF2m3Qh -+NY9Bf9MnJHLcnVnwZdlW5nd7H7BTB43XvkiYascqusYki+fY58eGSprZ/VUjmGx -pgQnQXWCu0U3JyUL/QIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQC1syY2Rk02m5PGtfkMUIU7ZSe0mM+g0BgWAyCF/mFFYdfY0xHtqy0x -QWkW9OR0KBl4JpphDDolHoNL3TLydH3t4inX8SAOpaUdsjMcIPKqjT1htQm0Pk5r -vFYvKuVrxMnV0F+wMmZRuziKWrZlVDwBMfCAchzuVexDWfcjTmUQmhZxJuUzORw3 -swgh9HIpxjMkgdlHodbMAEpMIkkoeJnph3I9uTocXZbK/lAInggQdm0Q+on1ZT0A -ljO/6jisDZzIguE4ZAQ2DfYsGI8H3tz/+76uIwwBNOmu0woUDSWXVcPWiviq49Bi -GmH0KlUfWAphj86IfTWXT1HRay3eZQt3 +c3Qgc3VpdGWCFBfnvJQgNLw9MyrcSA1T3Q2PyJIFMA0GCSqGSIb3DQEBCwUAA4IB +AQAbYUfwGvV4u5Gpbhv5yxdueC0faKVIEXYRnT4Dky01cV7pGkFSFndlA2mFsj1g +uuzkTFPMedcBefMoq2o2eX2B4ogrFHovxELI82i9pbv/MmsGNYwbMsp2lnUhNWon +QwxFqMGA5Y2p8vyEG7lrHKiFDdt7uPxcOeTiWo0ZpC8uThqiR4fUkPinQ3EHEFGQ ++zl+G3pb4VRUzsyqh2n9swudqQcwjsDlQlkQ2vzVb6IWWiUCwL3V7HGPGmlVbsFG +nQ1M44aBtWbBQtubfBRwYb5r+4sRN94LST6Phmhnd/AJccIKdCaheq+yLVVGiCJN +3nDTmgTVSSmOm/RRmSXNp7AH -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/client+client_ca.crt b/src/test/ssl/ssl/client+client_ca.crt index 7fafa14de1b90..fe7719e14b882 100644 --- a/src/test/ssl/ssl/client+client_ca.crt +++ b/src/test/ssl/ssl/client+client_ca.crt @@ -1,37 +1,40 @@ -----BEGIN CERTIFICATE----- -MIIC0zCCAbsCCCAhAwMUEgcAMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +MIIC1TCCAb0CCCAjBxMWNSQAMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg -Y2VydHMwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjAWMRQwEgYDVQQD -DAtzc2x0ZXN0dXNlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALSL -oC6h8sBABL8kWRjFQJHZNcwmuRRWjzhBYR4gDKcBThCBIuEr5PZEkkXnJniXKHct -bCzaBarUwG+bWGg6BiFWX3PP5MZvLG7ExP9yTrDjdwjKozkJCNWSow0hdYLaxkpm -rYI6rDJ5T1CZBRLD4RYOjU39WVIxYkHlhJYtH0Cdv5PuzCOEtLdKQySSVq6heJen -koLvK7AaF1x8uDiwM+o9t69pORWbOh/6aCCPeYmvhPIRvEqyZjGvPJ2kXau4R1vN -NmepRIZ0VjQ/rQxo7dGWk38cfgsTeFI4G26DiYn08pFR47swUdfiMyx3MaGQiz9X -I2nUqjM+W84iUxrR82MCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEACSZo32raJHcB -rYHeomzynmzgMVBHSA4XsXZVQw4+zBUER+/ZdQbtw6F/qdeWRvTl8TJjwoydta7u -4gUkgAnQhYm2f8XEBe/+MUegH+y54Yk6rtmkdLxJLGKZ0IUfYkn20sg/NZrltbog -A8glWRGVD8cEOaxUaNSQ4Xqmqsqjd6Kh8snVfIIcWgKgnTNgyapM5ePBpS2IREhN -u9fjikQQf6F/dycsm22OP7aWsp1XPs3nqnoq9ZnhQrITMwsGcjbU7+v8La2GbiJV -8yAy136NSXUujIG/8eqhICWZPqj+KbdVZupOsUeVoeuSwLXJjm4GWY0xH92emqCI -ac+HriJv5w== +Y2VydHMwIBcNMjMwNjI5MDEwMTAxWhgPMjA1MDAxMDEwMTAxMDFaMBYxFDASBgNV +BAMMC3NzbHRlc3R1c2VyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +tIugLqHywEAEvyRZGMVAkdk1zCa5FFaPOEFhHiAMpwFOEIEi4Svk9kSSRecmeJco +dy1sLNoFqtTAb5tYaDoGIVZfc8/kxm8sbsTE/3JOsON3CMqjOQkI1ZKjDSF1gtrG +SmatgjqsMnlPUJkFEsPhFg6NTf1ZUjFiQeWEli0fQJ2/k+7MI4S0t0pDJJJWrqF4 +l6eSgu8rsBoXXHy4OLAz6j23r2k5FZs6H/poII95ia+E8hG8SrJmMa88naRdq7hH +W802Z6lEhnRWND+tDGjt0ZaTfxx+CxN4UjgbboOJifTykVHjuzBR1+IzLHcxoZCL +P1cjadSqMz5bziJTGtHzYwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAQnfs7UO2g +iilUgCQAfa9Vb0ZSivD7ryjnLsdwYRLIlb0YceME9qtSv2UYBfS9KpwG7+jONMQB +kvbe611/TaF0T7EC1GIWuTMs8jknJ2bgPbS8D8jiFWTci+SDDog4EVoakSLoirW6 +yB4398upjtanAdnjoNpE4REXPDHzDm2Dico2RCObJh1VAEK+q6gLJxQtGvdPyG3L +Fhjs7ky1lsxIvHlts8c1e4vhnVpxdS3I5r6N38qFXEJnc1tv/e+TH50mdrZlzRHF +TPgnZzWCGTHmT5YT3yoAldWG4uWzMsB+2eY/crRefM9byc0omjCxDTrk9nA6JWsf +0c6pBc6aKzdi -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDFDCCAfygAwIBAgIIICEDAxQSBwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +MIIDnjCCAoagAwIBAgIIICMHExY1IwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl -c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD -VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg -Y2xpZW50IGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu+ce -8rkNfoCvI9Wjug9pxsptsdjhZ4s7ZZ8eD5VlloryK2JccusQIX61XY8I3OZjLTgq -1SpZbHQvktRH6gmU7tfoBdEnRuXB7idkbYOKIrC0hdttb/5rDzjQGtXTmwoVrCcJ -nvO1Whay/gdsoqX1tT1MTPWu/6dfQkQXA0PizVvmBasAEQchxqtcH2rSc6TPE13v -lxJ0X1vSlz92uT6kenrxUDs43AH/kASdIQBHXVA4XWBAm7NRqwKX7BBwbsF2m3Qh -+NY9Bf9MnJHLcnVnwZdlW5nd7H7BTB43XvkiYascqusYki+fY58eGSprZ/VUjmGx -pgQnQXWCu0U3JyUL/QIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQC1syY2Rk02m5PGtfkMUIU7ZSe0mM+g0BgWAyCF/mFFYdfY0xHtqy0x -QWkW9OR0KBl4JpphDDolHoNL3TLydH3t4inX8SAOpaUdsjMcIPKqjT1htQm0Pk5r -vFYvKuVrxMnV0F+wMmZRuziKWrZlVDwBMfCAchzuVexDWfcjTmUQmhZxJuUzORw3 -swgh9HIpxjMkgdlHodbMAEpMIkkoeJnph3I9uTocXZbK/lAInggQdm0Q+on1ZT0A -ljO/6jisDZzIguE4ZAQ2DfYsGI8H3tz/+76uIwwBNOmu0woUDSWXVcPWiviq49Bi -GmH0KlUfWAphj86IfTWXT1HRay3eZQt3 +c3Qgc3VpdGUwIBcNMjMwNzEzMTQzNTIzWhgPMjA1MDExMjgxNDM1MjNaMEIxQDA+ +BgNVBAMMN1Rlc3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVz +dCBjbGllbnQgY2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7 +5x7yuQ1+gK8j1aO6D2nGym2x2OFniztlnx4PlWWWivIrYlxy6xAhfrVdjwjc5mMt +OCrVKllsdC+S1EfqCZTu1+gF0SdG5cHuJ2Rtg4oisLSF221v/msPONAa1dObChWs +Jwme87VaFrL+B2yipfW1PUxM9a7/p19CRBcDQ+LNW+YFqwARByHGq1wfatJzpM8T +Xe+XEnRfW9KXP3a5PqR6evFQOzjcAf+QBJ0hAEddUDhdYECbs1GrApfsEHBuwXab +dCH41j0F/0yckctydWfBl2Vbmd3sfsFMHjde+SJhqxyq6xiSL59jnx4ZKmtn9VSO +YbGmBCdBdYK7RTcnJQv9AgMBAAGjgZcwgZQwDAYDVR0TBAUwAwEB/zAdBgNVHQ4E +FgQUn6Tr0smZ3rADsDA0IoFhFUu9rTYwZQYDVR0jBF4wXKFEpEIwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGWCFBfnvJQgNLw9MyrcSA1T3Q2PyJIFMA0GCSqGSIb3DQEBCwUAA4IB +AQAbYUfwGvV4u5Gpbhv5yxdueC0faKVIEXYRnT4Dky01cV7pGkFSFndlA2mFsj1g +uuzkTFPMedcBefMoq2o2eX2B4ogrFHovxELI82i9pbv/MmsGNYwbMsp2lnUhNWon +QwxFqMGA5Y2p8vyEG7lrHKiFDdt7uPxcOeTiWo0ZpC8uThqiR4fUkPinQ3EHEFGQ ++zl+G3pb4VRUzsyqh2n9swudqQcwjsDlQlkQ2vzVb6IWWiUCwL3V7HGPGmlVbsFG +nQ1M44aBtWbBQtubfBRwYb5r+4sRN94LST6Phmhnd/AJccIKdCaheq+yLVVGiCJN +3nDTmgTVSSmOm/RRmSXNp7AH -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/client-crldir/9bb9e3c3.r0 b/src/test/ssl/ssl/client-crldir/9bb9e3c3.r0 index f75eb1c0bca42..202f9f44d096f 100644 --- a/src/test/ssl/ssl/client-crldir/9bb9e3c3.r0 +++ b/src/test/ssl/ssl/client-crldir/9bb9e3c3.r0 @@ -1,12 +1,12 @@ -----BEGIN X509 CRL----- -MIIBwDCBqTANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0yMjA3 -MTgyMjI4MTVaFw00OTEyMDMyMjI4MTVaMDYwGQIIICEDAxQSBwEXDTIyMDcxODIy -MjgxNVowGQIIICIHGBUoFQAXDTIyMDcxODIyMjgxNVowDQYJKoZIhvcNAQELBQAD -ggEBAFDH3m9AHpDjkEFjO6svnLJ2bTliGeKZaJW8/RAN4mWvWDhXDQfzqGcFHN2a -SIL57Xc4PdwTiXuU4QEP4RvWW90LYKdcrcT8uh0AN3i7ShMwcV7I7owzF5+CBuT7 -Ev0MU4QIz0PjXoybXP6b3wHhZbEjYTLYdnYdqjrsAchUpyDQn6fiC0C7FgjCi4HL -rNm2kMchFpzd6K9e41kxWVp7xCPXgqUK8OrxlW56ObkX8UpBIZzyU6RisJKOZJAn -/+lwT43yTtU739atdXdSMvGHT9Y7LsrSDz9zgp2/iMTmfctnPcp81J/6jQZEP8kx -OyPyZz4xy/EShWy+KUklfOoKRo8= +MIIBwjCBqzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0yMzA3 +MTMxNDM1MjRaGA8yMDUwMTEyODE0MzUyNFowNjAZAgggIwcTFjUkAhcNMjMwNzEz +MTQzNTI0WjAZAgggIwcTFjUkBRcNMjMwNzEzMTQzNTI0WjANBgkqhkiG9w0BAQsF +AAOCAQEAl2jqLuwUgUTtzIKdLyAqIGf+zG0jfJXD9KFIsPeR+zfYWyNVzlWav68e +zcLLhr9NWzHCXo0F5yiWVIO9pe2OF980Ez/24fTd6NPk3qG9AzLeLQ0jPhEgLaDw +KFSTuaTbEuAUBGHMTjdoe6aOGsypUOXxse/G5enyx93yCC7boFkrYscfnQT2kFZT +60Bhfr/4qkFdGJbp9ZIsTP8us4sktEDFn24Tq5f8sW7JyqIU83LRhjkIc8NALGCE +DE7FgaGVUyuH8jYkVw4XLMwYo9gAy95pBxrDFq/r0Zm4E1rIEr8x7Ji7smUcubrb +/MXu7OCXst4uzoRxFQctnP19AYIKZQ== -----END X509 CRL----- diff --git a/src/test/ssl/ssl/client-dn.crt b/src/test/ssl/ssl/client-dn.crt index 0db14e5977358..3f5c80580c3de 100644 --- a/src/test/ssl/ssl/client-dn.crt +++ b/src/test/ssl/ssl/client-dn.crt @@ -1,19 +1,19 @@ -----BEGIN CERTIFICATE----- -MIIDDTCCAfUCCCAhBikTA0IAMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +MIIDDzCCAfcCCCAjBxMWNSQBMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg -Y2VydHMwHhcNMjEwNjI5MjAwMzQyWhcNNDgxMTE0MjAwMzQyWjBQMQ0wCwYDVQQK -DARQR0RHMRQwEgYDVQQLDAtFbmdpbmVlcmluZzEQMA4GA1UECwwHVGVzdGluZzEX -MBUGA1UEAwwOc3NsdGVzdHVzZXItZG4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDES64qtkofPjeG4VbUVKfzABLC0CurvxqLTEpokq/St9WAWDrzc8PJ -YireEZp4ec5rHVyQVvHqzzaZFAMvbRUQgMdGKG4Vgkn8l96KxHa4Q6yxYoQOts10 -AuvU9LuGKT0lxndMggHDmREUOAkFYKp7IeypseUGkJ6sWs+DlTwK1hST+EUAU/5f -q/pAngJ+oar20m8WNxaAhJUKtBBecdRdqYy/h3Ab43iPhj+N9IFXiSV9EWhteBae -L/TEE+s7/4L74xwvJe2EiVETo3lMy2aVJ4/4pOMq7U+Gr/0wxk0jqRrOahAE6pOI -cQFBFsOkyUaC4dzqtjeSrsw5igQbJC19AgMBAAEwDQYJKoZIhvcNAQELBQADggEB -AECbQQ9rBzCexNI3VKDVA+CZa0ib48XbcJwXmva3spvjjCB5cGPToyF1B+4mVg1H -1uM/XRAoQmNRtB+xKEAceMSxJA02tBlwMOclXlO0oGLYyc+S61K+UEPSk6Kka4aC -NpeLSqN5ahC9z8C5uMJl36pFf13aU05uRkXKcI4gkn02I4jRc/a8gF7URdhdf920 -KmYSUh1V0B3pPAB6ArqJ60iHOqkCYIIIbi2EpVP53IKkoB9tr4ud8oMoN6ggIXU1 -2oHvnaKJ7RZaQNefS3WweyHxr4cCVtEour/ELph48OuW6Y5jqPT+5Ln3Qz0e6KW9 -o3thBx0aKSYlmt9gH254M9M= +Y2VydHMwIBcNMjMwNjI5MDEwMTAxWhgPMjA1MDAxMDEwMTAxMDFaMFAxDTALBgNV +BAoMBFBHREcxFDASBgNVBAsMC0VuZ2luZWVyaW5nMRAwDgYDVQQLDAdUZXN0aW5n +MRcwFQYDVQQDDA5zc2x0ZXN0dXNlci1kbjCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMRLriq2Sh8+N4bhVtRUp/MAEsLQK6u/GotMSmiSr9K31YBYOvNz +w8liKt4Rmnh5zmsdXJBW8erPNpkUAy9tFRCAx0YobhWCSfyX3orEdrhDrLFihA62 +zXQC69T0u4YpPSXGd0yCAcOZERQ4CQVgqnsh7Kmx5QaQnqxaz4OVPArWFJP4RQBT +/l+r+kCeAn6hqvbSbxY3FoCElQq0EF5x1F2pjL+HcBvjeI+GP430gVeJJX0RaG14 +Fp4v9MQT6zv/gvvjHC8l7YSJUROjeUzLZpUnj/ik4yrtT4av/TDGTSOpGs5qEATq +k4hxAUEWw6TJRoLh3Oq2N5KuzDmKBBskLX0CAwEAATANBgkqhkiG9w0BAQsFAAOC +AQEAYi8MtTEYoqqxjoy/QOYuuWIryNwvpHh9ty8q+r8gWPuySMaIb+qfWh7qK1OY +ng9HUXdXn+kpZIy6GMVtVSprPn5J3gLCZMsXqHxh5XtHf8DkSwmaQrVSFmu0Wkri +txnNl4OHwMIGbX0o6oN7rNdlgYxLyMtPzO+KfygjO4HX8Hm5Jz0DM2K3airnFkCc +IwYdMmaEMykRRl2W5wpSgHjYrReL3qopdWj97sKTY4H3ZuBR7i2V9ni6/mJFUD2u +8tLeUTB1vOhRk6JhtRagNIQHg7tsUX6Fx3QkdosGjSCWPePzv4UC4GYvEjbOvsxv +hIPtSVIjtS8eN6co3XJP+dTd4w== -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/client-encrypted-pem.key b/src/test/ssl/ssl/client-encrypted-pem.key index 1e7052a5bbb7a..58fe68ab41ef6 100644 --- a/src/test/ssl/ssl/client-encrypted-pem.key +++ b/src/test/ssl/ssl/client-encrypted-pem.key @@ -1,30 +1,30 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: AES-128-CBC,E619306A930B60F360BF805500BA5659 - -B9aYmIdIoF7hT9tJARMQWE7Ii7g+KDNaF4U0ljBsxgbtMyi9DQrlrFsbUO0Wy6iO -UY/h57UA1pk7yF+rwkTK0L2t0j/d+HZc3ddsN3cZ040PmX8+8QZJWRUs2ywTLa4O -JxPm2rUxLSeVa+FY9Nr1Cl6meQ2JS7MA7KBNuriBWNleGGgkbBMaH7zq98aOJmaz -l02J2wrJ5STP2UI8uEaT/UtAgLInlAljCSg5oe5cj4u9UyUkRN7fj4mexq1r5YNU -zTu7GrgcAdXrhsAhg9mAJol4frwsQuEiJbVIurAAvCrJk7Gm8xVjKCN1stDOASAY -aawO1huIdTzjbGXFHBtJ4YuRClXZr5ij6kN+KeQaS+JLjehsAb6762l9wUPP5Bxv -8c6CCxc+U4ndN0ZQPsx0UrJ/AYO1s12mebuKZvIdNoYdLIqJLfX/HSrzaXw6XA8b -gAvVOruKGq12v71OrIdahxSzRs7s6GODGynSayFprn3CK+GZJumwQ0EK+fBzrzB1 -8JTp98qwMYfSuDmGl8VbT9k8OZFZbDD4k5wj8fHx5R4zkdgfNqBNAKXPrwm5uRT8 -+0mnYdP3ZnihnZnAoZvGXOE77TcZ/N9fLvwkBpwPmtftbn10HwlwXQgmn1ijMj60 -ZOYo1fvKJMmvCr+NUtyJALIvUdLQmjWx0PoZetIb24KBkTkr2ciU1d1RDEwOfffZ -jwTfcJU/AXnxPBR6MBT9a+YkaMiOU0JF7vs/x0hG/o8GsXQJB/G7Vzakg0hxQ1WF -KU0jInXPf2uCiBMEwuWRPHh25wspLjsHgt5pD55vE/M9Q7LFOez/9/RQqmmjDjZH -sLJtdAjN57aaIhtzbYIYa7K7Eu5v0NrZ5++wP3h82aTy9PIlSmRGY8WiZSDDir0P -w+PBP7JN/3ifqXURUmSDGbfdArbyuuF79Say6N9ijFeBAZrCgauw3jBs1dhusGJ/ -T6wh8mjdGf8SRm9SQdGuIyK7M657z3P0WRlpHN4beeGpzgGVexqjiyvtwQNH8kps -3EDNwTe3HJMWf7G2FNjqtM0h3fnaB7d+prfzZIL5Y1Somgfiljp7zG/FfkYEybK6 -8OvW6O8byCSqJzugUa5HCv//iPYFrcALAXtva4KXtfauGhKmWpn3Wa5AW9/034H6 -QW/A8mcKSMKhGixZj5MZKGTMA9cRus3IRTAYnhCd5njJ1N/o67wwTGVuXVu6ExrM -wY/WjkRrDlRopqo0U3wodHjfZ8/837rINwmcqzXTxasu+ApWUVZFuuQh/q3i8aTv -BzFVOfLylxpIsoQHBQvNdM/u0HGXbw7wyjs6n+LCjeGwRuxKkoYlKf5cItNLDNvF -6LYwA44BJ3/XfUSVZRD8PAVp5haUgpesPym1G5QdvYN4rWE6lsAtGSZDatWvaCsI -S0qTwLFbw9BvclwkvJicvLwAmKiGMDyAwGNCPLnG7nZ48to4dXD93LmgC/mnENbp -7EgW7fUtMvz0Lt2Xcd26ZTlJdOkT3sdKPSDxhgqsQoI4dQSmB4Fz40HsFvFtTCuF -FXMFXjSkjiKrdfI+CQ1tJGXKpYAod8PcZ89vN3TjxehwhK6GxS0CiOJ+phh6q22i ------END RSA PRIVATE KEY----- +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIPkWPlqhlRUECAggA +MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBDZopec789nFFeEfB363dt4BIIE +0NVzp4OZvzXiE7eOKmJ3/GpB8PYOI2CzOlx4+n1AfE9631HkUWHQZO5ThsuCPCOl +JDmVdagwY3KNnA4ZiDytFEMPtekUBH8OuzeIqkO8ng2UPuJNKBSOkcFXypZw6BM/ +Fb3JrWFImvWjSEfJhx626vwanzvNxr+HrldX3OIS/ohbY2x5AfVgOsDUGtVEkH2h +gLqxeaXS00trNYz0xGqba6fYuMAEqHAkfLRHR3a3pXmEcR2sq+yxicUTAMtfN+FH +SwMcuu8w6GPOoFy+JRcOOL7lACRV18LxnNP+aBg4xjpU8X+OMqKLJ8oWkZYg8+z+ +o9iMAkcTbKL8FpsHa++GMkRWB382RJKhBGKxPKczBzNwVKet9xH681vKFCAcf+ZO +9UjckktgYfCjQGYYWtlxVen1oJPOFvKr4HaEvvHyjZPITn891d/2D7Ox4gaIcpnF +RHNfvjda6UpdX1C09qDF0BfQjA6YpNcvJfAWhSwhCQD+lLvVRJNeQdngb31Swr3E +xn8nVLG8wDJdtsHorkYZiDGvOQPT9J9GcnAMcSG1pgYGBQMax03ZUjGZgu7uI/h0 +H2+EKDWOhI7asuSrva0jXRkKOYmdqkE3UMUr1MAXFEjrbVvILkWzxvJElwd1XJwl +Sg/gTD8mZlHydSTEikkAiFfEj4AiNC5yrmZ9uLXgBAs75VDTLeF68Qirvy36rDW1 +7eUmULnyKqZ9evusbHlvipF2rUrsEzfrcSHxxuwHAwGxnxV2L5yq3pGYis97j93i +95lZ1p5lFqLCc4OFpn8mIPkUP8dzhYF+ttcfo0xwBD9kR053xqQoEBzEK++o/qlU +QT80f2Jv8utp9CpMM83ZVhxSTjd4Kh9IzlXVmVuT1CO6WrfUHt4lYo0WIyJxjstz +6lnuD+k9imENaGfsmYdFiDtWrNmlDyMrv0i3g6SLPyeSKHoktKsXq00y+hcut8wX +pSPaPGK9cPIwu964/YeHkm801mjHPMrSEVwLkIQWpucPyzIk+votBjbueO0Gr/EU +Xs90jAudv6BTjGl9FgdjAjL56gDs7UWxNQ6f4ZhdCkXZXaMEktJ8EzWRtezO93Vd +RKDAFanOd6+4Js4cJ6WP2tak6IArON9sKqtcOmAfuw+Cy2ff6wX3mvyD79MD1d9n +xqyQYQxkWa32V1AR8ZIgjl8+k8CZTL/1OFUNp/fThV5v1jk1DOQ5izs9ffpykSCm +Ecr/UqbJHHDnL+N4mkdSNkm2djlUXBlxSlb6zUUcyyUno0jEgfdYrXsl/ptQT9Jv +M7HzBa9EwMd22deVN8mW461zxwXn7+fv9ij3frG4zOtaMGysbRhK8MBPoOZBa2Q4 +jI5Nd9revJZ98ml4iBTgXJ5oqQUOdiZr2UYwRJuhT5fKgscpoqIxmy9YJt0GtR6L +1JUHF7vB/h54MhR/abcSvoxLv1Rfp6+5ufMXujzIodZp6BzGg69pGACtBjU9olZb +hzwr+gVICFI7Em6aOEQFjZa5we6mtQYyozyUUsVQgNAGs0T9ofQcRlzTNSecjDnf +9nb2m2UmWpCVfrgtuFmKpV512HMVfgkdAw21P9I300dxOELpdX3PzsFg3DeKH1zN +VmjdDNPwnZ5OZ8suAf5T+qUJJRS0ymoPG4igJ0P/IlBx +-----END ENCRYPTED PRIVATE KEY----- diff --git a/src/test/ssl/ssl/client-long.crt b/src/test/ssl/ssl/client-long.crt index a1db55b5c3e7c..2fec398e176bc 100644 --- a/src/test/ssl/ssl/client-long.crt +++ b/src/test/ssl/ssl/client-long.crt @@ -1,20 +1,20 @@ -----BEGIN CERTIFICATE----- -MIIDWjCCAkICCCAiBRIUREYAMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +MIIDXDCCAkQCCCAjBxMWNSQEMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg -Y2VydHMwHhcNMjIwNTEyMjE0NDQ3WhcNNDkwOTI3MjE0NDQ3WjCBnDEsMCoGA1UE -CgwjUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAxITAfBgNVBAsM -GFNvbWUgT3JnYW5pemF0aW9uYWwgVW5pdDFJMEcGA1UEAwxAc3NsLTEyMzQ1Njc4 -OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2 -Nzg5MDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANgxmeHiVRuBTwlG -Q1oM2M1ckQCI/o4hYcO9BYdxDYHiA7jy1WVenyj8BtUi5Aj9VDhpfiuewDarGQ5a -TggD1pMjkw0MorBKBr9+1u1xGH/8Q3lkgU+OQXrPglo4IrVcqaoZFQ0nuMaVbieX -0dDyTfsTaVQYYtqAtzhI/UGSIOhk2+lB9fP68jw9cLH0QYvR+qQ0IPG13I5zmSYP -Mj0VYwMn9TF9/2sBOSRVgTVAcrYgOQLk3s/fGe66tmVBIWYcq65ygqD1+weu+Pax -jPnwsefkdnf6JdYRG1F1Co7g52poPEYieAHfQOJ69sG0LYx0lBODC69qvSJ4WdCQ -0zKw288CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEArr5r1UxgUzPykmu5ZdL6y8TA -ZbSQ1yBY0nhsRwRkDd66iPK9U6T6K2+pL8Vc6ioov9WOtHQ6ohP3gSavd40cHRmF -auwIsZ4Wk0mjftpOuPFp1hyo8d/QYrbEm3qNe5qln5S9h8ipoYvFtf5zlK2KHJFz -9ehZMZ1zGAERNCVM8UUQKyUuZB5GyrZlbslf6P/9Bsc54YUWxP2pr5r/RJ6DeXfI -zAFfXT8AFVlClARA949gpX0LVrXryDN60CUJ88QJmYCQ3AtIgzYYeqcdYHTd8eS2 -9P5whDdU5NvROP+LjETeReJF4Bfyc2gM7zxZD2BDSf5exvnNqiy42/lR1b4szw== +Y2VydHMwIBcNMjMwNjI5MDEwMTAxWhgPMjA1MDAxMDEwMTAxMDFaMIGcMSwwKgYD +VQQKDCNQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cDEhMB8GA1UE +CwwYU29tZSBPcmdhbml6YXRpb25hbCBVbml0MUkwRwYDVQQDDEBzc2wtMTIzNDU2 +Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0 +NTY3ODkwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2DGZ4eJVG4FP +CUZDWgzYzVyRAIj+jiFhw70Fh3ENgeIDuPLVZV6fKPwG1SLkCP1UOGl+K57ANqsZ +DlpOCAPWkyOTDQyisEoGv37W7XEYf/xDeWSBT45Bes+CWjgitVypqhkVDSe4xpVu +J5fR0PJN+xNpVBhi2oC3OEj9QZIg6GTb6UH18/ryPD1wsfRBi9H6pDQg8bXcjnOZ +Jg8yPRVjAyf1MX3/awE5JFWBNUBytiA5AuTez98Z7rq2ZUEhZhyrrnKCoPX7B674 +9rGM+fCx5+R2d/ol1hEbUXUKjuDnamg8RiJ4Ad9A4nr2wbQtjHSUE4MLr2q9InhZ +0JDTMrDbzwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCUIOBu5ea3vSVpiqCGMphv +V26dDpEl1OMpvPIM5Ss1sp9ogOdBg7ahkDE51J0QaB3yN6mci3sN6yi77U3zXXUv +qI0hdR3nwjTLJSpW2p6ONW43PKPhKr42UdBH5iRVlNY7rto2x3xC0iuzvPAJjIJJ +OJMZYl/A43O8XZW68m9Z5kH3Vi/l0wtjElfnjqI0DAuQEL/TQTzK9qTIhdAqMAKG +deTGSqpz+ID2CfuN+TBV2NAseilZ4JC0xZxaJpoqmK3yTtgKBhJ3vQN//fc1TdPy +9+zvnSRIJZJque58ZKnqbMq3c3RRSo0eOZn7FZopcIRsn5hzDeIVTJcBJ68jcxrL -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/client-revoked-utf8.crt b/src/test/ssl/ssl/client-revoked-utf8.crt index de471d1e60aaf..4189c75de88e1 100644 --- a/src/test/ssl/ssl/client-revoked-utf8.crt +++ b/src/test/ssl/ssl/client-revoked-utf8.crt @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE----- -MIIC2DCCAcACCCAiBxgVKBUAMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +MIIC2jCCAcICCCAjBxMWNSQFMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg -Y2VydHMwHhcNMjIwNzE4MjIyODE1WhcNNDkxMjAzMjIyODE1WjAbMRkwFwYDVQQD -DBDOn860z4XPg8+Dzq3Osc+CMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvBiL1mVjTrzZ6sbrvfu746dzh+EEyuJNkCwPeJTtpva2wqqRUMYw05cV5kzi -YQ3UikMP5Yz0FXTeWoahSpJAWeR5XsFx3wOQvRzwi1KWm2CHr/rb7KbPvoZQdXuV -8UeKrQ6PrEvjoarHAUZuWyUC6EnEAGuiKl5yuax5mkTcK5F8pig2/SS/UonX5ar5 -58rOUEaIdyZmXtrO86cm5S5Oz3G2naQB3PPPOhtkoGBHikRHiqBPVRpX3w9TIpBL -BZbT4MIZ+fCjZ9wXj4aiDUzPglu6/Tfx9sNcxc6Ilz/XHfPuBVyyjgrny2SrW0W4 -KlhU09y+m5gKL358z8tj599DowIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAE47ns -wfceztieaRQtoF+gPcCuImOJqaB7jTE6cQ+aoW/q+sUlOh7AD0IZqhS4o0A4O+ny -MD7kHkpYP+ctHNomsSQRkFTDZ2ZJGcRgxbwMOSvsKcgNOTMGqpXQiP0x0m7QMBGl -EHeu5MqG/IK/ZlH9aOTvSnHegB6ztct/7wXMeFCflsWLp6wvnv9YpddaaXf95Oms -9kwbVYkI1wxaBsAO8VGbJw1YtdErgd65qKTJa45xndtm61i1Jeig5asSNQPwjfZ5 -aNHZ9GsSwsc31Q/6iiezbPwgdAi3ih//uB2hznkMhObnqzR3n8Sw9zgL7DdFr2y9 -2R7kJuGq6DvlWFYS +Y2VydHMwIBcNMjMwNjI5MDEwMTAxWhgPMjA1MDAxMDEwMTAxMDFaMBsxGTAXBgNV +BAMMEM6fzrTPhc+Dz4POrc6xz4IwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC8GIvWZWNOvNnqxuu9+7vjp3OH4QTK4k2QLA94lO2m9rbCqpFQxjDTlxXm +TOJhDdSKQw/ljPQVdN5ahqFKkkBZ5HlewXHfA5C9HPCLUpabYIev+tvsps++hlB1 +e5XxR4qtDo+sS+OhqscBRm5bJQLoScQAa6IqXnK5rHmaRNwrkXymKDb9JL9Sidfl +qvnnys5QRoh3JmZe2s7zpyblLk7PcbadpAHc8886G2SgYEeKREeKoE9VGlffD1Mi +kEsFltPgwhn58KNn3BePhqINTM+CW7r9N/H2w1zFzoiXP9cd8+4FXLKOCufLZKtb +RbgqWFTT3L6bmAovfnzPy2Pn30OjAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAASZ +M/4tx9qm7G9TEKHHg/Da7GOrGWnYwluWcO/jnIN4jCPyxwj6EmxZGEBKqFUhj3kY +hwL+249Y2YABOLqu9x/YJz1KtZUgkwTGh6yfT5xOSOCXij7ukpge1gXtodYtnBgP +FmJOdFygrXxWex3vr+F2Fnh93Isxd/nFof/Rwmi4JTJr6JjalyGuvNDGZc/N16/u +uR3AE0zGLfM093GbJe9E9j44DGMbNlwHvZ2NXojX34kNoRttonPHmXGKWSCyufUc +uG+STq5T/DFnr06Ugj2TPCMyEgDEA4unzP5uxAijXVRSkyOrAtZrFtzbab/wjTLt +0AGeljtaei/bMAh11Cs= -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/client-revoked.crt b/src/test/ssl/ssl/client-revoked.crt index 51ebe924a6432..2cc0c933cd674 100644 --- a/src/test/ssl/ssl/client-revoked.crt +++ b/src/test/ssl/ssl/client-revoked.crt @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE----- -MIIC0zCCAbsCCCAhAwMUEgcBMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +MIIC1TCCAb0CCCAjBxMWNSQCMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg -Y2VydHMwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjAWMRQwEgYDVQQD -DAtzc2x0ZXN0dXNlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKAX -JmNmfqmvpVAeWEmJxi7feku2sZKA7yMyyZMCboBqsNVO9gOpQFE8gD1Z7bJm4aDK -QxByuspYPFOBwty9YW4UqRa4kyEyd08x+PsHQx9SmWJTNpNIH6yq5LCcme37QMrg -b8wUZRWwXsaKUfVUI6oALjSgcibMJXTntCsD9J5m/07U/ZZALe1460rreTFHsxVZ -708Wm5u7UHIgxvvEKhNG/JR9zd1Tl1mVgnlz0a8G6Dt22gJnLnuFdtDdACwET/kG -TRJQWuyavpe+1TY53kZNO442hOzwhlZVnz4IKaWaLNQMtbG9iYStEvaWa8p0E/3J -N6oRuELiqXJp/wW3v/MCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAcVhPcu55HcSf -Mci38T/fOBaiDUvzWwG/XlQRzFxcS+ZY/vYMbgor6PliGlCFBF4Mca2qtTs7zXRz -8aLNVX53p98Cnnn97mW4aYNbNdM87R76IqJdj40brEolu1JNOyFJRYzoaebABf9r -R64FTt3YVM9qjJrHG/apYwKwgAMxVzZ/M+3ujahP/8mOYD/Utj+lYHnXJmuHAYE6 -EnTxTSb2J+IsK8KuPoGjUPNZRW8zIUE0luMpJahvtmFVW91Vue7dW0AOmHpjmGUB -J9Vwxe7KJRW5/4dz6kMD2pKY3D9sBgXeku/QDVz/hdyB5YT0WChFiZn20DZyhOtu -moHgw8OJzg== +Y2VydHMwIBcNMjMwNjI5MDEwMTAxWhgPMjA1MDAxMDEwMTAxMDFaMBYxFDASBgNV +BAMMC3NzbHRlc3R1c2VyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +oBcmY2Z+qa+lUB5YSYnGLt96S7axkoDvIzLJkwJugGqw1U72A6lAUTyAPVntsmbh +oMpDEHK6ylg8U4HC3L1hbhSpFriTITJ3TzH4+wdDH1KZYlM2k0gfrKrksJyZ7ftA +yuBvzBRlFbBexopR9VQjqgAuNKByJswldOe0KwP0nmb/TtT9lkAt7XjrSut5MUez +FVnvTxabm7tQciDG+8QqE0b8lH3N3VOXWZWCeXPRrwboO3baAmcue4V20N0ALARP ++QZNElBa7Jq+l77VNjneRk07jjaE7PCGVlWfPggppZos1Ay1sb2JhK0S9pZrynQT +/ck3qhG4QuKpcmn/Bbe/8wIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAtVsoTdoLZ +2PMVSDIEc3VRhjNS5+EuYcW+7h0se/7IpBauHoZhn+JD8YVtE04yz2YkglrnChmJ +iL8xc+f1PbQatxpU7HnSswn3JevC+jZWnGvAxqR2oR3cAioF7sK1vnYLnd2OPqcy +P9T+tzi90fiVOVOlrm00hjJBNcDIhofjY9td3wogA1SO8vXQteZ1gXNt0nzmfuNZ +vZvspk+A/vN8tbR6BTagUxPRxajiT0xoIJFD6Qx2ZPglgffJKDwQQ3kvYr7dLMgO ++TDcLL8GK2MAxglgOqvUlRwfwl0ZXu3ZsGjim8pF+dPJB1dUCm9KbG2sIscPNLUe +9p2w5FZaNk7p -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/client.crl b/src/test/ssl/ssl/client.crl index f75eb1c0bca42..202f9f44d096f 100644 --- a/src/test/ssl/ssl/client.crl +++ b/src/test/ssl/ssl/client.crl @@ -1,12 +1,12 @@ -----BEGIN X509 CRL----- -MIIBwDCBqTANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0yMjA3 -MTgyMjI4MTVaFw00OTEyMDMyMjI4MTVaMDYwGQIIICEDAxQSBwEXDTIyMDcxODIy -MjgxNVowGQIIICIHGBUoFQAXDTIyMDcxODIyMjgxNVowDQYJKoZIhvcNAQELBQAD -ggEBAFDH3m9AHpDjkEFjO6svnLJ2bTliGeKZaJW8/RAN4mWvWDhXDQfzqGcFHN2a -SIL57Xc4PdwTiXuU4QEP4RvWW90LYKdcrcT8uh0AN3i7ShMwcV7I7owzF5+CBuT7 -Ev0MU4QIz0PjXoybXP6b3wHhZbEjYTLYdnYdqjrsAchUpyDQn6fiC0C7FgjCi4HL -rNm2kMchFpzd6K9e41kxWVp7xCPXgqUK8OrxlW56ObkX8UpBIZzyU6RisJKOZJAn -/+lwT43yTtU739atdXdSMvGHT9Y7LsrSDz9zgp2/iMTmfctnPcp81J/6jQZEP8kx -OyPyZz4xy/EShWy+KUklfOoKRo8= +MIIBwjCBqzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0yMzA3 +MTMxNDM1MjRaGA8yMDUwMTEyODE0MzUyNFowNjAZAgggIwcTFjUkAhcNMjMwNzEz +MTQzNTI0WjAZAgggIwcTFjUkBRcNMjMwNzEzMTQzNTI0WjANBgkqhkiG9w0BAQsF +AAOCAQEAl2jqLuwUgUTtzIKdLyAqIGf+zG0jfJXD9KFIsPeR+zfYWyNVzlWav68e +zcLLhr9NWzHCXo0F5yiWVIO9pe2OF980Ez/24fTd6NPk3qG9AzLeLQ0jPhEgLaDw +KFSTuaTbEuAUBGHMTjdoe6aOGsypUOXxse/G5enyx93yCC7boFkrYscfnQT2kFZT +60Bhfr/4qkFdGJbp9ZIsTP8us4sktEDFn24Tq5f8sW7JyqIU83LRhjkIc8NALGCE +DE7FgaGVUyuH8jYkVw4XLMwYo9gAy95pBxrDFq/r0Zm4E1rIEr8x7Ji7smUcubrb +/MXu7OCXst4uzoRxFQctnP19AYIKZQ== -----END X509 CRL----- diff --git a/src/test/ssl/ssl/client.crt b/src/test/ssl/ssl/client.crt index 1f6ae05fe4c06..eaf8830192b1e 100644 --- a/src/test/ssl/ssl/client.crt +++ b/src/test/ssl/ssl/client.crt @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE----- -MIIC0zCCAbsCCCAhAwMUEgcAMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +MIIC1TCCAb0CCCAjBxMWNSQAMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBjbGllbnQg -Y2VydHMwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjAWMRQwEgYDVQQD -DAtzc2x0ZXN0dXNlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALSL -oC6h8sBABL8kWRjFQJHZNcwmuRRWjzhBYR4gDKcBThCBIuEr5PZEkkXnJniXKHct -bCzaBarUwG+bWGg6BiFWX3PP5MZvLG7ExP9yTrDjdwjKozkJCNWSow0hdYLaxkpm -rYI6rDJ5T1CZBRLD4RYOjU39WVIxYkHlhJYtH0Cdv5PuzCOEtLdKQySSVq6heJen -koLvK7AaF1x8uDiwM+o9t69pORWbOh/6aCCPeYmvhPIRvEqyZjGvPJ2kXau4R1vN -NmepRIZ0VjQ/rQxo7dGWk38cfgsTeFI4G26DiYn08pFR47swUdfiMyx3MaGQiz9X -I2nUqjM+W84iUxrR82MCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEACSZo32raJHcB -rYHeomzynmzgMVBHSA4XsXZVQw4+zBUER+/ZdQbtw6F/qdeWRvTl8TJjwoydta7u -4gUkgAnQhYm2f8XEBe/+MUegH+y54Yk6rtmkdLxJLGKZ0IUfYkn20sg/NZrltbog -A8glWRGVD8cEOaxUaNSQ4Xqmqsqjd6Kh8snVfIIcWgKgnTNgyapM5ePBpS2IREhN -u9fjikQQf6F/dycsm22OP7aWsp1XPs3nqnoq9ZnhQrITMwsGcjbU7+v8La2GbiJV -8yAy136NSXUujIG/8eqhICWZPqj+KbdVZupOsUeVoeuSwLXJjm4GWY0xH92emqCI -ac+HriJv5w== +Y2VydHMwIBcNMjMwNjI5MDEwMTAxWhgPMjA1MDAxMDEwMTAxMDFaMBYxFDASBgNV +BAMMC3NzbHRlc3R1c2VyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +tIugLqHywEAEvyRZGMVAkdk1zCa5FFaPOEFhHiAMpwFOEIEi4Svk9kSSRecmeJco +dy1sLNoFqtTAb5tYaDoGIVZfc8/kxm8sbsTE/3JOsON3CMqjOQkI1ZKjDSF1gtrG +SmatgjqsMnlPUJkFEsPhFg6NTf1ZUjFiQeWEli0fQJ2/k+7MI4S0t0pDJJJWrqF4 +l6eSgu8rsBoXXHy4OLAz6j23r2k5FZs6H/poII95ia+E8hG8SrJmMa88naRdq7hH +W802Z6lEhnRWND+tDGjt0ZaTfxx+CxN4UjgbboOJifTykVHjuzBR1+IzLHcxoZCL +P1cjadSqMz5bziJTGtHzYwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQAQnfs7UO2g +iilUgCQAfa9Vb0ZSivD7ryjnLsdwYRLIlb0YceME9qtSv2UYBfS9KpwG7+jONMQB +kvbe611/TaF0T7EC1GIWuTMs8jknJ2bgPbS8D8jiFWTci+SDDog4EVoakSLoirW6 +yB4398upjtanAdnjoNpE4REXPDHzDm2Dico2RCObJh1VAEK+q6gLJxQtGvdPyG3L +Fhjs7ky1lsxIvHlts8c1e4vhnVpxdS3I5r6N38qFXEJnc1tv/e+TH50mdrZlzRHF +TPgnZzWCGTHmT5YT3yoAldWG4uWzMsB+2eY/crRefM9byc0omjCxDTrk9nA6JWsf +0c6pBc6aKzdi -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/client_ca.crt b/src/test/ssl/ssl/client_ca.crt index ef48749f76ad8..31867bd0f47af 100644 --- a/src/test/ssl/ssl/client_ca.crt +++ b/src/test/ssl/ssl/client_ca.crt @@ -1,19 +1,22 @@ -----BEGIN CERTIFICATE----- -MIIDFDCCAfygAwIBAgIIICEDAxQSBwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +MIIDnjCCAoagAwIBAgIIICMHExY1IwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl -c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD -VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg -Y2xpZW50IGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu+ce -8rkNfoCvI9Wjug9pxsptsdjhZ4s7ZZ8eD5VlloryK2JccusQIX61XY8I3OZjLTgq -1SpZbHQvktRH6gmU7tfoBdEnRuXB7idkbYOKIrC0hdttb/5rDzjQGtXTmwoVrCcJ -nvO1Whay/gdsoqX1tT1MTPWu/6dfQkQXA0PizVvmBasAEQchxqtcH2rSc6TPE13v -lxJ0X1vSlz92uT6kenrxUDs43AH/kASdIQBHXVA4XWBAm7NRqwKX7BBwbsF2m3Qh -+NY9Bf9MnJHLcnVnwZdlW5nd7H7BTB43XvkiYascqusYki+fY58eGSprZ/VUjmGx -pgQnQXWCu0U3JyUL/QIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQC1syY2Rk02m5PGtfkMUIU7ZSe0mM+g0BgWAyCF/mFFYdfY0xHtqy0x -QWkW9OR0KBl4JpphDDolHoNL3TLydH3t4inX8SAOpaUdsjMcIPKqjT1htQm0Pk5r -vFYvKuVrxMnV0F+wMmZRuziKWrZlVDwBMfCAchzuVexDWfcjTmUQmhZxJuUzORw3 -swgh9HIpxjMkgdlHodbMAEpMIkkoeJnph3I9uTocXZbK/lAInggQdm0Q+on1ZT0A -ljO/6jisDZzIguE4ZAQ2DfYsGI8H3tz/+76uIwwBNOmu0woUDSWXVcPWiviq49Bi -GmH0KlUfWAphj86IfTWXT1HRay3eZQt3 +c3Qgc3VpdGUwIBcNMjMwNzEzMTQzNTIzWhgPMjA1MDExMjgxNDM1MjNaMEIxQDA+ +BgNVBAMMN1Rlc3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVz +dCBjbGllbnQgY2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7 +5x7yuQ1+gK8j1aO6D2nGym2x2OFniztlnx4PlWWWivIrYlxy6xAhfrVdjwjc5mMt +OCrVKllsdC+S1EfqCZTu1+gF0SdG5cHuJ2Rtg4oisLSF221v/msPONAa1dObChWs +Jwme87VaFrL+B2yipfW1PUxM9a7/p19CRBcDQ+LNW+YFqwARByHGq1wfatJzpM8T +Xe+XEnRfW9KXP3a5PqR6evFQOzjcAf+QBJ0hAEddUDhdYECbs1GrApfsEHBuwXab +dCH41j0F/0yckctydWfBl2Vbmd3sfsFMHjde+SJhqxyq6xiSL59jnx4ZKmtn9VSO +YbGmBCdBdYK7RTcnJQv9AgMBAAGjgZcwgZQwDAYDVR0TBAUwAwEB/zAdBgNVHQ4E +FgQUn6Tr0smZ3rADsDA0IoFhFUu9rTYwZQYDVR0jBF4wXKFEpEIwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGWCFBfnvJQgNLw9MyrcSA1T3Q2PyJIFMA0GCSqGSIb3DQEBCwUAA4IB +AQAbYUfwGvV4u5Gpbhv5yxdueC0faKVIEXYRnT4Dky01cV7pGkFSFndlA2mFsj1g +uuzkTFPMedcBefMoq2o2eX2B4ogrFHovxELI82i9pbv/MmsGNYwbMsp2lnUhNWon +QwxFqMGA5Y2p8vyEG7lrHKiFDdt7uPxcOeTiWo0ZpC8uThqiR4fUkPinQ3EHEFGQ ++zl+G3pb4VRUzsyqh2n9swudqQcwjsDlQlkQ2vzVb6IWWiUCwL3V7HGPGmlVbsFG +nQ1M44aBtWbBQtubfBRwYb5r+4sRN94LST6Phmhnd/AJccIKdCaheq+yLVVGiCJN +3nDTmgTVSSmOm/RRmSXNp7AH -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/client_ext.crt b/src/test/ssl/ssl/client_ext.crt index 9874ce49b9ec2..5204391e46943 100644 --- a/src/test/ssl/ssl/client_ext.crt +++ b/src/test/ssl/ssl/client_ext.crt @@ -1,21 +1,20 @@ -----BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIIICEREAQyQQAwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +MIIDQTCCAimgAwIBAgIIICMHExY1JAMwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IGNs -aWVudCBjZXJ0czAeFw0yMTExMTAwMzMyNDFaFw00OTAzMjgwMzMyNDFaMBYxFDAS -BgNVBAMMC3NzbHRlc3R1c2VyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArCHikkEQLFITbn3ZfO8X2RW3fELeaImgy8W4Pkkc4LxdHCWjdCML/vtE/ZVu -Op74qrQQWT0HKXFVUiZLbjAgV2PONS6VFHhc3sTFxuTaBnVdY+K98hoFnXskINt/ -wgwUhRcRZuKPcZvEHiqF6e3g3lQa99l1nVKPGPLOCvVhSgoV0Gwgxok0t7s25BCV -ZmpMAwSTxpeviLF0e2MsttuyClQ4nuD92EHZX3BuG0WNPLxiwikV96uMffpMRGsx -uiAHzD5ykYM7/b3eU0bjfi0J0qcfTSeytqFuRCNEukJpmtUmyYGqsFJ7HN7ejCY7 -ObAlBn8h+4bgwBRaeZDZLTMaYQIDAQABo4GgMIGdMAwGA1UdEwEB/wQCMAAwEwYD +aWVudCBjZXJ0czAgFw0yMzA2MjkwMTAxMDFaGA8yMDUwMDEwMTAxMDEwMVowFjEU +MBIGA1UEAwwLc3NsdGVzdHVzZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCsIeKSQRAsUhNufdl87xfZFbd8Qt5oiaDLxbg+SRzgvF0cJaN0Iwv++0T9 +lW46nviqtBBZPQcpcVVSJktuMCBXY841LpUUeFzexMXG5NoGdV1j4r3yGgWdeyQg +23/CDBSFFxFm4o9xm8QeKoXp7eDeVBr32XWdUo8Y8s4K9WFKChXQbCDGiTS3uzbk +EJVmakwDBJPGl6+IsXR7Yyy227IKVDie4P3YQdlfcG4bRY08vGLCKRX3q4x9+kxE +azG6IAfMPnKRgzv9vd5TRuN+LQnSpx9NJ7K2oW5EI0S6Qmma1SbJgaqwUnsc3t6M +Jjs5sCUGfyH7huDAFFp5kNktMxphAgMBAAGjZTBjMAwGA1UdEwEB/wQCMAAwEwYD VR0lBAwwCgYIKwYBBQUHAwIwHQYDVR0OBBYEFPPv1n7k1Vd9BBC4eoGWPZwVz2Lx -MFkGA1UdIwRSMFChRKRCMEAxPjA8BgNVBAMMNVRlc3Qgcm9vdCBDQSBmb3IgUG9z -dGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHN1aXRlggggIQMDFBIHATANBgkq -hkiG9w0BAQsFAAOCAQEAtqIeTmUhtHyCt5k2yx88F0dKshYq4Z+LQI+agyZ1fRE6 -Ux5p+SBGbzvc+NcUvc7yGG6w2G/nTVnGwSHN9NtQa2T2XbHJysJ/dwCfmRsachKz -4kCp0zAHEDrEmZua0sy5BLwwVCk5WNBR0lZ35WmIEuRA+5G/2lCywtrb9W4YnbAM -nH7BtZE8qPbK4OicB40I2NXz6KhG3755oKN03VC1IaX9JFQxf37ac7jVK5bsjfaF -0xCAeuDN6wDiVHZj6q1GhhmNLzaF5zmU2e/cI1nTI5tfGKnygavlZIz2VvAlcypt -YZdMDy69VbTWUa57UPCspghgvm5M2/Hjmz50CXGMvw== +MB8GA1UdIwQYMBaAFJ+k69LJmd6wA7AwNCKBYRVLva02MA0GCSqGSIb3DQEBCwUA +A4IBAQBsDUu6W6jXfgOkBGhZpwTtpThQ3fizEmBLXiy479Sa27YzdXCrLkql+XDv +Z0nh8t7gvSw5ZCl9eZ13yg9etAfGCkNtkI37EVh4rMMqP3NkjBT2qwdG+pfwcF/c ++vrSK3H47lVIE5AShJJAwlU0Thf1bfyjzTnoGxEj2+YBMMhAykp9XbAgtM14hCQV +07niaMv4kmmHDoUU72UH7GYnfnsCkUKhbisw7qOojd4MPX/kvU77+S3UURHJKKHy +Rag+GP03NeF+d1z3niVBOIXE6hzlfaxB0w0SW7fXgQFYRBujTUYdcSZ5ZuT9kHyH +9zHx+isaomV7U7yIQ9mGT/fDugki -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/root+client-crldir/9bb9e3c3.r0 b/src/test/ssl/ssl/root+client-crldir/9bb9e3c3.r0 index f75eb1c0bca42..202f9f44d096f 100644 --- a/src/test/ssl/ssl/root+client-crldir/9bb9e3c3.r0 +++ b/src/test/ssl/ssl/root+client-crldir/9bb9e3c3.r0 @@ -1,12 +1,12 @@ -----BEGIN X509 CRL----- -MIIBwDCBqTANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0yMjA3 -MTgyMjI4MTVaFw00OTEyMDMyMjI4MTVaMDYwGQIIICEDAxQSBwEXDTIyMDcxODIy -MjgxNVowGQIIICIHGBUoFQAXDTIyMDcxODIyMjgxNVowDQYJKoZIhvcNAQELBQAD -ggEBAFDH3m9AHpDjkEFjO6svnLJ2bTliGeKZaJW8/RAN4mWvWDhXDQfzqGcFHN2a -SIL57Xc4PdwTiXuU4QEP4RvWW90LYKdcrcT8uh0AN3i7ShMwcV7I7owzF5+CBuT7 -Ev0MU4QIz0PjXoybXP6b3wHhZbEjYTLYdnYdqjrsAchUpyDQn6fiC0C7FgjCi4HL -rNm2kMchFpzd6K9e41kxWVp7xCPXgqUK8OrxlW56ObkX8UpBIZzyU6RisJKOZJAn -/+lwT43yTtU739atdXdSMvGHT9Y7LsrSDz9zgp2/iMTmfctnPcp81J/6jQZEP8kx -OyPyZz4xy/EShWy+KUklfOoKRo8= +MIIBwjCBqzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0yMzA3 +MTMxNDM1MjRaGA8yMDUwMTEyODE0MzUyNFowNjAZAgggIwcTFjUkAhcNMjMwNzEz +MTQzNTI0WjAZAgggIwcTFjUkBRcNMjMwNzEzMTQzNTI0WjANBgkqhkiG9w0BAQsF +AAOCAQEAl2jqLuwUgUTtzIKdLyAqIGf+zG0jfJXD9KFIsPeR+zfYWyNVzlWav68e +zcLLhr9NWzHCXo0F5yiWVIO9pe2OF980Ez/24fTd6NPk3qG9AzLeLQ0jPhEgLaDw +KFSTuaTbEuAUBGHMTjdoe6aOGsypUOXxse/G5enyx93yCC7boFkrYscfnQT2kFZT +60Bhfr/4qkFdGJbp9ZIsTP8us4sktEDFn24Tq5f8sW7JyqIU83LRhjkIc8NALGCE +DE7FgaGVUyuH8jYkVw4XLMwYo9gAy95pBxrDFq/r0Zm4E1rIEr8x7Ji7smUcubrb +/MXu7OCXst4uzoRxFQctnP19AYIKZQ== -----END X509 CRL----- diff --git a/src/test/ssl/ssl/root+client.crl b/src/test/ssl/ssl/root+client.crl index 459f48da43baf..2e0616905c38c 100644 --- a/src/test/ssl/ssl/root+client.crl +++ b/src/test/ssl/ssl/root+client.crl @@ -10,14 +10,14 @@ SBNr2rpYp7Coc3GeCoWPcClgSrABD3Z5GY1YAdLGiXVKaH3CmdJTznhEPagE4z5R +GrJP3XxJ1OC -----END X509 CRL----- -----BEGIN X509 CRL----- -MIIBwDCBqTANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0yMjA3 -MTgyMjI4MTVaFw00OTEyMDMyMjI4MTVaMDYwGQIIICEDAxQSBwEXDTIyMDcxODIy -MjgxNVowGQIIICIHGBUoFQAXDTIyMDcxODIyMjgxNVowDQYJKoZIhvcNAQELBQAD -ggEBAFDH3m9AHpDjkEFjO6svnLJ2bTliGeKZaJW8/RAN4mWvWDhXDQfzqGcFHN2a -SIL57Xc4PdwTiXuU4QEP4RvWW90LYKdcrcT8uh0AN3i7ShMwcV7I7owzF5+CBuT7 -Ev0MU4QIz0PjXoybXP6b3wHhZbEjYTLYdnYdqjrsAchUpyDQn6fiC0C7FgjCi4HL -rNm2kMchFpzd6K9e41kxWVp7xCPXgqUK8OrxlW56ObkX8UpBIZzyU6RisJKOZJAn -/+lwT43yTtU739atdXdSMvGHT9Y7LsrSDz9zgp2/iMTmfctnPcp81J/6jQZEP8kx -OyPyZz4xy/EShWy+KUklfOoKRo8= +MIIBwjCBqzANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3QgY2xpZW50IGNlcnRzFw0yMzA3 +MTMxNDM1MjRaGA8yMDUwMTEyODE0MzUyNFowNjAZAgggIwcTFjUkAhcNMjMwNzEz +MTQzNTI0WjAZAgggIwcTFjUkBRcNMjMwNzEzMTQzNTI0WjANBgkqhkiG9w0BAQsF +AAOCAQEAl2jqLuwUgUTtzIKdLyAqIGf+zG0jfJXD9KFIsPeR+zfYWyNVzlWav68e +zcLLhr9NWzHCXo0F5yiWVIO9pe2OF980Ez/24fTd6NPk3qG9AzLeLQ0jPhEgLaDw +KFSTuaTbEuAUBGHMTjdoe6aOGsypUOXxse/G5enyx93yCC7boFkrYscfnQT2kFZT +60Bhfr/4qkFdGJbp9ZIsTP8us4sktEDFn24Tq5f8sW7JyqIU83LRhjkIc8NALGCE +DE7FgaGVUyuH8jYkVw4XLMwYo9gAy95pBxrDFq/r0Zm4E1rIEr8x7Ji7smUcubrb +/MXu7OCXst4uzoRxFQctnP19AYIKZQ== -----END X509 CRL----- diff --git a/src/test/ssl/ssl/root+client_ca.crt b/src/test/ssl/ssl/root+client_ca.crt index 7819c54828c1d..ff8281fba0338 100644 --- a/src/test/ssl/ssl/root+client_ca.crt +++ b/src/test/ssl/ssl/root+client_ca.crt @@ -18,21 +18,24 @@ OCZhKLxVZiZmO71BBwsTgwtU58/G9e2ciGGdltI8ANlmVfdtwgRz3b7H9EUZat6s kubl/m5HWBsKJEWEzFWrWkQV3ipoTmorJ6KCGABBCeVYmg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDFDCCAfygAwIBAgIIICEDAxQSBwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +MIIDnjCCAoagAwIBAgIIICMHExY1IwEwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl -c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD -VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg -Y2xpZW50IGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu+ce -8rkNfoCvI9Wjug9pxsptsdjhZ4s7ZZ8eD5VlloryK2JccusQIX61XY8I3OZjLTgq -1SpZbHQvktRH6gmU7tfoBdEnRuXB7idkbYOKIrC0hdttb/5rDzjQGtXTmwoVrCcJ -nvO1Whay/gdsoqX1tT1MTPWu/6dfQkQXA0PizVvmBasAEQchxqtcH2rSc6TPE13v -lxJ0X1vSlz92uT6kenrxUDs43AH/kASdIQBHXVA4XWBAm7NRqwKX7BBwbsF2m3Qh -+NY9Bf9MnJHLcnVnwZdlW5nd7H7BTB43XvkiYascqusYki+fY58eGSprZ/VUjmGx -pgQnQXWCu0U3JyUL/QIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQC1syY2Rk02m5PGtfkMUIU7ZSe0mM+g0BgWAyCF/mFFYdfY0xHtqy0x -QWkW9OR0KBl4JpphDDolHoNL3TLydH3t4inX8SAOpaUdsjMcIPKqjT1htQm0Pk5r -vFYvKuVrxMnV0F+wMmZRuziKWrZlVDwBMfCAchzuVexDWfcjTmUQmhZxJuUzORw3 -swgh9HIpxjMkgdlHodbMAEpMIkkoeJnph3I9uTocXZbK/lAInggQdm0Q+on1ZT0A -ljO/6jisDZzIguE4ZAQ2DfYsGI8H3tz/+76uIwwBNOmu0woUDSWXVcPWiviq49Bi -GmH0KlUfWAphj86IfTWXT1HRay3eZQt3 +c3Qgc3VpdGUwIBcNMjMwNzEzMTQzNTIzWhgPMjA1MDExMjgxNDM1MjNaMEIxQDA+ +BgNVBAMMN1Rlc3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVz +dCBjbGllbnQgY2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7 +5x7yuQ1+gK8j1aO6D2nGym2x2OFniztlnx4PlWWWivIrYlxy6xAhfrVdjwjc5mMt +OCrVKllsdC+S1EfqCZTu1+gF0SdG5cHuJ2Rtg4oisLSF221v/msPONAa1dObChWs +Jwme87VaFrL+B2yipfW1PUxM9a7/p19CRBcDQ+LNW+YFqwARByHGq1wfatJzpM8T +Xe+XEnRfW9KXP3a5PqR6evFQOzjcAf+QBJ0hAEddUDhdYECbs1GrApfsEHBuwXab +dCH41j0F/0yckctydWfBl2Vbmd3sfsFMHjde+SJhqxyq6xiSL59jnx4ZKmtn9VSO +YbGmBCdBdYK7RTcnJQv9AgMBAAGjgZcwgZQwDAYDVR0TBAUwAwEB/zAdBgNVHQ4E +FgQUn6Tr0smZ3rADsDA0IoFhFUu9rTYwZQYDVR0jBF4wXKFEpEIwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGWCFBfnvJQgNLw9MyrcSA1T3Q2PyJIFMA0GCSqGSIb3DQEBCwUAA4IB +AQAbYUfwGvV4u5Gpbhv5yxdueC0faKVIEXYRnT4Dky01cV7pGkFSFndlA2mFsj1g +uuzkTFPMedcBefMoq2o2eX2B4ogrFHovxELI82i9pbv/MmsGNYwbMsp2lnUhNWon +QwxFqMGA5Y2p8vyEG7lrHKiFDdt7uPxcOeTiWo0ZpC8uThqiR4fUkPinQ3EHEFGQ ++zl+G3pb4VRUzsyqh2n9swudqQcwjsDlQlkQ2vzVb6IWWiUCwL3V7HGPGmlVbsFG +nQ1M44aBtWbBQtubfBRwYb5r+4sRN94LST6Phmhnd/AJccIKdCaheq+yLVVGiCJN +3nDTmgTVSSmOm/RRmSXNp7AH -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/root+server-crldir/a836cc2d.r0 b/src/test/ssl/ssl/root+server-crldir/a836cc2d.r0 index 331a83cb62d40..7ed68e0220ae8 100644 --- a/src/test/ssl/ssl/root+server-crldir/a836cc2d.r0 +++ b/src/test/ssl/ssl/root+server-crldir/a836cc2d.r0 @@ -1,11 +1,11 @@ -----BEGIN X509 CRL----- -MIIBpTCBjjANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0yMTAz -MDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMBswGQIIICEDAxQSBwUXDTIxMDMwMzIy -MTIwN1owDQYJKoZIhvcNAQELBQADggEBAJxj0taZYIIxUsCuXR5CN2OymjMvRwmV -+10VOkyBQ3VkzHlXeJkmZsU2Dvmc205l9OYouh/faL0TfK2NyhmBo+MrTizL9TBo -4u2es/0oJGj2wyNMkRs0SlSJelakvGFBvSKfqoV0l2O1WDV7M4KtdC8ZVZipmL4R -ac4hBMK0ifHuTS5Od6o0C2RijEPCHMXaS/LkWpBqcStI2oirhjo+Th1wxTMGUVFy -imVvt6D6QqqHCUYrvcNEN0xBNFwJGq/0cgSy+w5szt/RRehmJKX8MbNeZxrznIIx -B18ch9rbBltz+Y4R63rCN9MdsnGXf6PQ6a6doZhSI1pnDrui12MOQrU= +MIIBpzCBkDANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0yMzA3 +MTMxNDM1MjRaGA8yMDUwMTEyODE0MzUyNFowGzAZAgggIwcTFjUjCxcNMjMwNzEz +MTQzNTI0WjANBgkqhkiG9w0BAQsFAAOCAQEADIkF8oS84O2PJw/C9BAzgrkd+EsO +QL6mXUGBgXwmujfpv0Z8YK91k4+xV9hQRMjWe/DkU01+gmFhYoDvAzweuNQzx8lZ +bYKu0dGTEpTd+OG1LbxYmt4f5xh096R5iLo7c7e2kMHvfNG7VwvKQrPeMqh7AcKy +Fukt8C0Xc7Tfv2l2toEQUAl5UDUKEAovN6iB0qycpvi0nboyiDo8mV0p1jlAn846 +EeXjwm8tyGXzTFq16ypPwnlBM9d5Ml/p5WTN69nDux18G+iSCr+UDzLDYvLF11p3 +lEqpSo5lQg9zYuOgMCvu3g5BtwJgORPSiW/yZ5BXUfWvPi0XRPrknxMByA== -----END X509 CRL----- diff --git a/src/test/ssl/ssl/root+server.crl b/src/test/ssl/ssl/root+server.crl index 8b0c716d639ca..93ffa5986e47f 100644 --- a/src/test/ssl/ssl/root+server.crl +++ b/src/test/ssl/ssl/root+server.crl @@ -10,13 +10,13 @@ SBNr2rpYp7Coc3GeCoWPcClgSrABD3Z5GY1YAdLGiXVKaH3CmdJTznhEPagE4z5R +GrJP3XxJ1OC -----END X509 CRL----- -----BEGIN X509 CRL----- -MIIBpTCBjjANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0yMTAz -MDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMBswGQIIICEDAxQSBwUXDTIxMDMwMzIy -MTIwN1owDQYJKoZIhvcNAQELBQADggEBAJxj0taZYIIxUsCuXR5CN2OymjMvRwmV -+10VOkyBQ3VkzHlXeJkmZsU2Dvmc205l9OYouh/faL0TfK2NyhmBo+MrTizL9TBo -4u2es/0oJGj2wyNMkRs0SlSJelakvGFBvSKfqoV0l2O1WDV7M4KtdC8ZVZipmL4R -ac4hBMK0ifHuTS5Od6o0C2RijEPCHMXaS/LkWpBqcStI2oirhjo+Th1wxTMGUVFy -imVvt6D6QqqHCUYrvcNEN0xBNFwJGq/0cgSy+w5szt/RRehmJKX8MbNeZxrznIIx -B18ch9rbBltz+Y4R63rCN9MdsnGXf6PQ6a6doZhSI1pnDrui12MOQrU= +MIIBpzCBkDANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0yMzA3 +MTMxNDM1MjRaGA8yMDUwMTEyODE0MzUyNFowGzAZAgggIwcTFjUjCxcNMjMwNzEz +MTQzNTI0WjANBgkqhkiG9w0BAQsFAAOCAQEADIkF8oS84O2PJw/C9BAzgrkd+EsO +QL6mXUGBgXwmujfpv0Z8YK91k4+xV9hQRMjWe/DkU01+gmFhYoDvAzweuNQzx8lZ +bYKu0dGTEpTd+OG1LbxYmt4f5xh096R5iLo7c7e2kMHvfNG7VwvKQrPeMqh7AcKy +Fukt8C0Xc7Tfv2l2toEQUAl5UDUKEAovN6iB0qycpvi0nboyiDo8mV0p1jlAn846 +EeXjwm8tyGXzTFq16ypPwnlBM9d5Ml/p5WTN69nDux18G+iSCr+UDzLDYvLF11p3 +lEqpSo5lQg9zYuOgMCvu3g5BtwJgORPSiW/yZ5BXUfWvPi0XRPrknxMByA== -----END X509 CRL----- diff --git a/src/test/ssl/ssl/root+server_ca.crt b/src/test/ssl/ssl/root+server_ca.crt index 5074f4fa9b8f7..a094886e0f663 100644 --- a/src/test/ssl/ssl/root+server_ca.crt +++ b/src/test/ssl/ssl/root+server_ca.crt @@ -18,21 +18,24 @@ OCZhKLxVZiZmO71BBwsTgwtU58/G9e2ciGGdltI8ANlmVfdtwgRz3b7H9EUZat6s kubl/m5HWBsKJEWEzFWrWkQV3ipoTmorJ6KCGABBCeVYmg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDFDCCAfygAwIBAgIIICEDAxQSBwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +MIIDnjCCAoagAwIBAgIIICMHExY1IwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl -c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD -VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg -c2VydmVyIGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4kp2 -GW5nPb6QrSrtbClfZeutyQnHrm4TMPBoNepFdIVxBX/04BguM5ImDRze/huOWA+z -atJAQqt3R7dsDwnOnPKUKCOuHX6a1aj5L86HtVgaWTXrZFE5NtL9PIzXkWu13UW0 -UesHtbPVRv6a6fB7Npph6hHy7iPZb009A8/lTJnxSPC39u/K/sPqjrVZaAJF+wDs -qCxCZTUtAUFvWFnR/TeXLWlFzBupS1djgI7PltbJqSn6SKTAgNZTxpRJbu9Icp6J -/50ELwT++0n0KWVXNHrDNfI5Gaa+SxClAsPsei2jLKpgR6QFC3wn38Z9q9LjAVuC -+FWhoN1uhYeoricEXwIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQCdCA/EoXrustoV4jJGbkdXDuOUkBurwggSNBAqUBSDvCohRoD77Ecb -QVuzPNxWKG+E4PwfUq2ha+2yPONEJ28ZgsbHq5qlJDMJ43wlcjn6wmmAJNeSpO8F -0V9d2X/4wNZty9/zbwTnw26KChgDHumQ0WIbCoBtdqy8KDswYOvpgws6dqc021I7 -UrFo6vZek7VoApbJgkDL6qYADa6ApfW43ThH4sViFITeYt/kSHgmy2Udhs34jMM8 -xsFP/uYpRi1b1glenwSIKiHjD4/C9vnWQt5K3gRBvYukEj2Bw9VkNRpBVCi0cOoA -OuwX3bwzNYNbZQv4K66oRpvuoEjCNeHg +c3Qgc3VpdGUwIBcNMjMwNzEzMTQzNTIzWhgPMjA1MDExMjgxNDM1MjNaMEIxQDA+ +BgNVBAMMN1Rlc3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVz +dCBzZXJ2ZXIgY2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDi +SnYZbmc9vpCtKu1sKV9l663JCceubhMw8Gg16kV0hXEFf/TgGC4zkiYNHN7+G45Y +D7Nq0kBCq3dHt2wPCc6c8pQoI64dfprVqPkvzoe1WBpZNetkUTk20v08jNeRa7Xd +RbRR6we1s9VG/prp8Hs2mmHqEfLuI9lvTT0Dz+VMmfFI8Lf278r+w+qOtVloAkX7 +AOyoLEJlNS0BQW9YWdH9N5ctaUXMG6lLV2OAjs+W1smpKfpIpMCA1lPGlElu70hy +non/nQQvBP77SfQpZVc0esM18jkZpr5LEKUCw+x6LaMsqmBHpAULfCffxn2r0uMB +W4L4VaGg3W6Fh6iuJwRfAgMBAAGjgZcwgZQwDAYDVR0TBAUwAwEB/zAdBgNVHQ4E +FgQU8o86ZkBQZEgi1y6C/1aewrPudAowZQYDVR0jBF4wXKFEpEIwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGWCFBfnvJQgNLw9MyrcSA1T3Q2PyJIFMA0GCSqGSIb3DQEBCwUAA4IB +AQANlEDrM357a7o+WcKB0Ocll2UtBMq7PDms1Pjqm3fFu/wdKDUomG8W2/MgDmFl +CVeAPpofb6J0oaxiEZOR68pOhdccMznArtKix6t3RkDiXdm4d5UORMMR+s9CymXV +MUTWpQpAg3qP3mRI+3E9OrgfhvmVcuOa7/cdTS/sylGe8Db+nJQD0be9NHtnhO56 +IA+Li+8oWzD4UNsP3gAmhLkyToz5wlPHzEkgGxkEySNErEOKTOX5Xyk5z+QToRhz +adkt0mBw/dxoJk9DveCtIqxDelxJsDeJFtqoc5qVVE9yOp7rujGsqgWl2PcJeyKM +Crh9qsqNzJ2R29pq0g6Lfzh2 -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-cn-and-alt-names.crt b/src/test/ssl/ssl/server-cn-and-alt-names.crt index 12d1ec363e7e2..982c02a514b1b 100644 --- a/src/test/ssl/ssl/server-cn-and-alt-names.crt +++ b/src/test/ssl/ssl/server-cn-and-alt-names.crt @@ -1,20 +1,22 @@ -----BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIIICEDAxQSBwAwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +MIIDmTCCAoGgAwIBAgIIICMHExY1IwAwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl -cnZlciBjZXJ0czAeFw0yMTAzMDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMEYxHjAc -BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTEkMCIGA1UEAwwbY29tbW9uLW5h -bWUucGctc3NsdGVzdC50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAwVES+mD1iY1UBGWNLsuBxGkyOGTI1X/sXcCUZ7aLOGkXHYatiUTcIrSNNAS5 -yCvbq/A/C1NuDw59nrU2TitcLBx5AIhz74EV+xv/u/GuX0gvJzDWh/6EeMzDIcJL -Iq7iEgO8ff5fuAzuwuNguZkX51JjBiXc2rtfgPI3CMU1lqCbb2vW9ZN4Pm7wRqvd -d/F/mySiFmLFsB4HLhCGZN89vO4cbslN4+YrGKEcHeXGWRaxv6gSXbpEgUYpefzz -+QB7AepU5aWntm3X+E1we5AHLSKckwUdBuT5uYgmZcYA/kCC4/9RS02jTlu4Vfrd -SemHwuo2UQ5ODJxzAhWrEl3F4QIDAQABo0swSTBHBgNVHREEQDA+gh1kbnMxLmFs -dC1uYW1lLnBnLXNzbHRlc3QudGVzdIIdZG5zMi5hbHQtbmFtZS5wZy1zc2x0ZXN0 -LnRlc3QwDQYJKoZIhvcNAQELBQADggEBAG3dFQ/DqjFbjzIOni079R3I94lAZqbc -cRUumDPSzihKwvCCnU5quqnYkOFISqBZsYmxR5fiHx4wT+jmWvLSltkaeS6gcGC1 -zuO8GFzL+PATUX63js8IfE3WYJE/bjmDVVzJOBArrbsExofdE2F2kkkLkjhk0ylg -/TrAKtyqpsob0b4ZjMloR5JFHQXGHN/922x6Do1vduHMXlGckmR0sX6Mg/fiChVh -vixUJje4W9ohft8G7lj3GnzI1gHEMp2PYKM+wqOug/gXEQuMIFlhjp2Mc6bAvFsD -grgdAgcYUvgKukF9efJHq2V5XjqBWrmGAOQkiH1y+9gxhiHUiw+vojY= +cnZlciBjZXJ0czAgFw0yMzA3MTMxNDM1MjNaGA8yMDUwMTEyODE0MzUyM1owRjEe +MBwGA1UECwwVUG9zdGdyZVNRTCB0ZXN0IHN1aXRlMSQwIgYDVQQDDBtjb21tb24t +bmFtZS5wZy1zc2x0ZXN0LnRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDBURL6YPWJjVQEZY0uy4HEaTI4ZMjVf+xdwJRntos4aRcdhq2JRNwitI00 +BLnIK9ur8D8LU24PDn2etTZOK1wsHHkAiHPvgRX7G/+78a5fSC8nMNaH/oR4zMMh +wksiruISA7x9/l+4DO7C42C5mRfnUmMGJdzau1+A8jcIxTWWoJtva9b1k3g+bvBG +q9138X+bJKIWYsWwHgcuEIZk3z287hxuyU3j5isYoRwd5cZZFrG/qBJdukSBRil5 +/PP5AHsB6lTlpae2bdf4TXB7kActIpyTBR0G5Pm5iCZlxgD+QILj/1FLTaNOW7hV ++t1J6YfC6jZRDk4MnHMCFasSXcXhAgMBAAGjgYwwgYkwRwYDVR0RBEAwPoIdZG5z +MS5hbHQtbmFtZS5wZy1zc2x0ZXN0LnRlc3SCHWRuczIuYWx0LW5hbWUucGctc3Ns +dGVzdC50ZXN0MB0GA1UdDgQWBBQnWI8n7O4aU6PooSwyIepyrEpsajAfBgNVHSME +GDAWgBTyjzpmQFBkSCLXLoL/Vp7Cs+50CjANBgkqhkiG9w0BAQsFAAOCAQEAQk/M +emDTPYUx/JrSdTyvVDeBaUMUjWQ78LO1j/2RqtBXh/tSnTvalOeuwBPqmz9+7HYR +H2gYQNq4W1Y6SgTdbpEivEXPvp1XyQXtLMpwDGO4rKq3QOCOPX2zZLDPrRqGSev3 +jN7oV8C3yVUyhhSxu+BZo4lZ55soiehCjHNKR5xfcbR/AtshLullVNNqoGQQyalS +9TNUKp7FqF52tIELvFMINoSf5aaLU1g7snxnVRbTFyne/oqeqFjW932M/vaFgAH7 +H8mfoJeAiG5GqVBKtf3kcakfBl1wjFCzpguvDd9Xi2AP1y3cPEotwFiKhCYMmGiA +EnzrdmAeNGKb2w3wlA== -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-cn-and-ip-alt-names.crt b/src/test/ssl/ssl/server-cn-and-ip-alt-names.crt index 4e58c85ccb81f..fea2703aafe30 100644 --- a/src/test/ssl/ssl/server-cn-and-ip-alt-names.crt +++ b/src/test/ssl/ssl/server-cn-and-ip-alt-names.crt @@ -1,20 +1,21 @@ -----BEGIN CERTIFICATE----- -MIIDLzCCAhegAwIBAgIIICERKRE1UQAwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +MIIDcTCCAlmgAwIBAgIIICMHExY1IwEwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl -cnZlciBjZXJ0czAeFw0yMTExMjkxOTM1NTFaFw00OTA0MTYxOTM1NTFaMEYxHjAc -BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTEkMCIGA1UEAwwbY29tbW9uLW5h -bWUucGctc3NsdGVzdC50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEA6+8IYKAFnZ7V+fDo1cyMpbGBLzCfJOQ/1o2jOGP4+GjpsZgv6S6UT2MheC8M -iiEFrYwdsSIZyYc3jEZrluy/UuR0bCGtqU92BCqa0iBLhvHOgjR588u253eLxQtQ -8iJn11QPrKMk35nMkmY8GfHt4sGFbvBL6+GpipHq7a6cde3Z+v4kCB5dKMYDUDtm -3mJmviuGNAu5wOqItk2Yi5dwJs1054007KNH0Il43urxiOfnkLS0cG5kehboPf86 -vxBt3iHByrU/9/DY5IvQCfSXVNa6rb5w5/pGja9aCei6Mv1jQY/V8SMQTga+MOsA -0WB9akxMi2NxwS2+BQ4k/McPlwIDAQABoyUwIzAhBgNVHREEGjAYhwTAAAIBhxAg -AQ24AAAAAAAAAAAAAAABMA0GCSqGSIb3DQEBCwUAA4IBAQAQLo2RzC07dG9p+J3A -W6C0p3Y+Os/YE2D9wfp4TIDTZxcRUQZ0S6ahF1N6sp8l9KHBJHPU1cUpRAU1oD+Y -SqmnP/VJRRDTTj9Ytdc/Vuo2jeLpSYhVKrCqtjqIrCwYJFoYRmMoxTtJGlwA0hSd -kwo3XYrALPUQWUErTYPvNfDNIuUwqUXNfS0CXuIOVN3LJ+shegg6Pwbh9B5T9NHx -kH+HswajhdpdnZIgh0FYTlTCPILDrB49aOWwqLa54AUA6WXa35hPsP8SoqL9Eucq -ifPhBYyadsjOb+70N8GbbAsDPN1jCX9L8RuNcEkxSCKCYx91cWXh7K5KMPuGlzB7 -j8xB +cnZlciBjZXJ0czAgFw0yMzA3MTMxNDM1MjNaGA8yMDUwMTEyODE0MzUyM1owRjEe +MBwGA1UECwwVUG9zdGdyZVNRTCB0ZXN0IHN1aXRlMSQwIgYDVQQDDBtjb21tb24t +bmFtZS5wZy1zc2x0ZXN0LnRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQDr7whgoAWdntX58OjVzIylsYEvMJ8k5D/WjaM4Y/j4aOmxmC/pLpRPYyF4 +LwyKIQWtjB2xIhnJhzeMRmuW7L9S5HRsIa2pT3YEKprSIEuG8c6CNHnzy7bnd4vF +C1DyImfXVA+soyTfmcySZjwZ8e3iwYVu8Evr4amKkertrpx17dn6/iQIHl0oxgNQ +O2beYma+K4Y0C7nA6oi2TZiLl3AmzXTnjTTso0fQiXje6vGI5+eQtLRwbmR6Fug9 +/zq/EG3eIcHKtT/38Njki9AJ9JdU1rqtvnDn+kaNr1oJ6Loy/WNBj9XxIxBOBr4w +6wDRYH1qTEyLY3HBLb4FDiT8xw+XAgMBAAGjZTBjMCEGA1UdEQQaMBiHBMAAAgGH +ECABDbgAAAAAAAAAAAAAAAEwHQYDVR0OBBYEFG+mujVw0u9XhfSYVs8/XJPwFCmF +MB8GA1UdIwQYMBaAFPKPOmZAUGRIItcugv9WnsKz7nQKMA0GCSqGSIb3DQEBCwUA +A4IBAQAm0M+VY4eZwfu47OPdiIJ4YxyGtcRCDDCuqZ8ACG7YH51Trhvm7SuHhGVQ +aJvphWDPrt4e0Exmga0T8RJ2Xd49F9u21/biz+vvzdjpzcr3yd9YGQ2IoU35b3ln +AVVB36i38eAOxYpSsv4CN01ilJYxhMdUQqRYjlagIYIp7dBwuQ7+uXUesBY6xgL/ +N0G+cUQuax8mokVB0HfNccbroXpJaz3fU1TSPiDgin7yMGkm9bTwj30pbesBOTID +MqdYNodA7RIZslnmHn7q1rsGIBVUHrxUyH7/4m9ZbhI1Zz0VkoWAPklkqCO7moIb +/oB/DmtwTndVB0urbGnEDzaoCntL -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-cn-only+server_ca.crt b/src/test/ssl/ssl/server-cn-only+server_ca.crt index 9870e8c17aaff..71ede03546cb2 100644 --- a/src/test/ssl/ssl/server-cn-only+server_ca.crt +++ b/src/test/ssl/ssl/server-cn-only+server_ca.crt @@ -1,38 +1,41 @@ -----BEGIN CERTIFICATE----- -MIIDAzCCAesCCCAhAwMUEgcBMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +MIIDBTCCAe0CCCAjBxMWNSMCMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzZXJ2ZXIg -Y2VydHMwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBGMR4wHAYDVQQL -DBVQb3N0Z3JlU1FMIHRlc3Qgc3VpdGUxJDAiBgNVBAMMG2NvbW1vbi1uYW1lLnBn -LXNzbHRlc3QudGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANWz -VPMk7i5f+W0eEadRE+TTAtsIK08CkLMUnjs7zJkxnnm6RGBXPx6vK3AkAIi+wG4Y -mXjYP3GuMiXaLjnWh2kzBSfIRQyNbTThnhSu3nDjAVkPexsSrPyiKimFuNgDfkGe -5dQKa9Ag2SuVU4vd9SYxOMAiIFIC4ts4MLWWJf5D/PehdSuc0e5Me+91Nnbz90nl -ds4lHvuDR+aKnZlTHmch3wfhXv7lNQImIBzfwl36Kd/bWB0fAEVFse3iZWmigaI/ -9FKh//WIq43TNLxn68OCQoyMe/HGjZDR/Xwo3rE6jg6/iAwSWib9yabfYPKbqq2G -oFy6aYmmEquaDgLuX7kCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA2AZrD9cTQXTW -4j2tT8N/TTc6WK2ncN4h22NTte6vK7MVwsZJCtw5ndYkmxcWkXAqiclzWyMdayds -WOa12CEH7jKAhivF4Hcw3oO3JHM5BA6KzLWBVz9uZksOM6mPqn29DTKvA/Y1V8tj -mxK/KUA68h/u6inu3mo4ywBpb/tqHxxg2cjyR0faCmM0pwRM0HBr/16fUMfO83nj -QG8g9J/bybu5sYso/aSoC5nUNp4XjmDMdVLdqg/nTe/ejS8IfFr0WQxBlqooqFgx -MSE+kX2e2fHsuOWSU/9eClt6FpQrwoC2C8F+/4g1Uz7Liqc4yMHPwjgeP9ewrrLO -iIhlNNPqpQ== +Y2VydHMwIBcNMjMwNzEzMTQzNTIzWhgPMjA1MDExMjgxNDM1MjNaMEYxHjAcBgNV +BAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTEkMCIGA1UEAwwbY29tbW9uLW5hbWUu +cGctc3NsdGVzdC50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +1bNU8yTuLl/5bR4Rp1ET5NMC2wgrTwKQsxSeOzvMmTGeebpEYFc/Hq8rcCQAiL7A +bhiZeNg/ca4yJdouOdaHaTMFJ8hFDI1tNOGeFK7ecOMBWQ97GxKs/KIqKYW42AN+ +QZ7l1Apr0CDZK5VTi931JjE4wCIgUgLi2zgwtZYl/kP896F1K5zR7kx773U2dvP3 +SeV2ziUe+4NH5oqdmVMeZyHfB+Fe/uU1AiYgHN/CXfop39tYHR8ARUWx7eJlaaKB +oj/0UqH/9YirjdM0vGfrw4JCjIx78caNkNH9fCjesTqODr+IDBJaJv3Jpt9g8puq +rYagXLppiaYSq5oOAu5fuQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCT3LdsDzwy +oKaXNuOgtENp4Pp4hLDXeZsepemYss75xfPsXyni9gWVTPIwwzq7NMawtP5q7zzB +zUMiDgsL9J3d1kDcL0qbJV7xciwCA5D0O1EFKSogJK9jgdupswQZKNrEtM2F68mN +SJ2aCJtIX/4lZb9KyRli4PDECrFjJM4vDQa9y05O5YY7lohvY5jubAAgexLT/n5r +oycpw3xNzwGIQ8dAtjvtgONFFKAogWomFaCjWSBPW3ZVz4NM7CryH6oyxkUv/v+q +/7vUykX0qBn7Vnk3nvVsqrqRRCbYXMz8qgMLeeXi5JjSeWDpYoiblIEfpf3FdtqS +FnIQVHtAuZHb -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- -MIIDFDCCAfygAwIBAgIIICEDAxQSBwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +MIIDnjCCAoagAwIBAgIIICMHExY1IwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl -c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD -VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg -c2VydmVyIGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4kp2 -GW5nPb6QrSrtbClfZeutyQnHrm4TMPBoNepFdIVxBX/04BguM5ImDRze/huOWA+z -atJAQqt3R7dsDwnOnPKUKCOuHX6a1aj5L86HtVgaWTXrZFE5NtL9PIzXkWu13UW0 -UesHtbPVRv6a6fB7Npph6hHy7iPZb009A8/lTJnxSPC39u/K/sPqjrVZaAJF+wDs -qCxCZTUtAUFvWFnR/TeXLWlFzBupS1djgI7PltbJqSn6SKTAgNZTxpRJbu9Icp6J -/50ELwT++0n0KWVXNHrDNfI5Gaa+SxClAsPsei2jLKpgR6QFC3wn38Z9q9LjAVuC -+FWhoN1uhYeoricEXwIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQCdCA/EoXrustoV4jJGbkdXDuOUkBurwggSNBAqUBSDvCohRoD77Ecb -QVuzPNxWKG+E4PwfUq2ha+2yPONEJ28ZgsbHq5qlJDMJ43wlcjn6wmmAJNeSpO8F -0V9d2X/4wNZty9/zbwTnw26KChgDHumQ0WIbCoBtdqy8KDswYOvpgws6dqc021I7 -UrFo6vZek7VoApbJgkDL6qYADa6ApfW43ThH4sViFITeYt/kSHgmy2Udhs34jMM8 -xsFP/uYpRi1b1glenwSIKiHjD4/C9vnWQt5K3gRBvYukEj2Bw9VkNRpBVCi0cOoA -OuwX3bwzNYNbZQv4K66oRpvuoEjCNeHg +c3Qgc3VpdGUwIBcNMjMwNzEzMTQzNTIzWhgPMjA1MDExMjgxNDM1MjNaMEIxQDA+ +BgNVBAMMN1Rlc3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVz +dCBzZXJ2ZXIgY2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDi +SnYZbmc9vpCtKu1sKV9l663JCceubhMw8Gg16kV0hXEFf/TgGC4zkiYNHN7+G45Y +D7Nq0kBCq3dHt2wPCc6c8pQoI64dfprVqPkvzoe1WBpZNetkUTk20v08jNeRa7Xd +RbRR6we1s9VG/prp8Hs2mmHqEfLuI9lvTT0Dz+VMmfFI8Lf278r+w+qOtVloAkX7 +AOyoLEJlNS0BQW9YWdH9N5ctaUXMG6lLV2OAjs+W1smpKfpIpMCA1lPGlElu70hy +non/nQQvBP77SfQpZVc0esM18jkZpr5LEKUCw+x6LaMsqmBHpAULfCffxn2r0uMB +W4L4VaGg3W6Fh6iuJwRfAgMBAAGjgZcwgZQwDAYDVR0TBAUwAwEB/zAdBgNVHQ4E +FgQU8o86ZkBQZEgi1y6C/1aewrPudAowZQYDVR0jBF4wXKFEpEIwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGWCFBfnvJQgNLw9MyrcSA1T3Q2PyJIFMA0GCSqGSIb3DQEBCwUAA4IB +AQANlEDrM357a7o+WcKB0Ocll2UtBMq7PDms1Pjqm3fFu/wdKDUomG8W2/MgDmFl +CVeAPpofb6J0oaxiEZOR68pOhdccMznArtKix6t3RkDiXdm4d5UORMMR+s9CymXV +MUTWpQpAg3qP3mRI+3E9OrgfhvmVcuOa7/cdTS/sylGe8Db+nJQD0be9NHtnhO56 +IA+Li+8oWzD4UNsP3gAmhLkyToz5wlPHzEkgGxkEySNErEOKTOX5Xyk5z+QToRhz +adkt0mBw/dxoJk9DveCtIqxDelxJsDeJFtqoc5qVVE9yOp7rujGsqgWl2PcJeyKM +Crh9qsqNzJ2R29pq0g6Lfzh2 -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-cn-only.crt b/src/test/ssl/ssl/server-cn-only.crt index acdf6f1a75fc4..6429529226608 100644 --- a/src/test/ssl/ssl/server-cn-only.crt +++ b/src/test/ssl/ssl/server-cn-only.crt @@ -1,19 +1,19 @@ -----BEGIN CERTIFICATE----- -MIIDAzCCAesCCCAhAwMUEgcBMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +MIIDBTCCAe0CCCAjBxMWNSMCMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzZXJ2ZXIg -Y2VydHMwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBGMR4wHAYDVQQL -DBVQb3N0Z3JlU1FMIHRlc3Qgc3VpdGUxJDAiBgNVBAMMG2NvbW1vbi1uYW1lLnBn -LXNzbHRlc3QudGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANWz -VPMk7i5f+W0eEadRE+TTAtsIK08CkLMUnjs7zJkxnnm6RGBXPx6vK3AkAIi+wG4Y -mXjYP3GuMiXaLjnWh2kzBSfIRQyNbTThnhSu3nDjAVkPexsSrPyiKimFuNgDfkGe -5dQKa9Ag2SuVU4vd9SYxOMAiIFIC4ts4MLWWJf5D/PehdSuc0e5Me+91Nnbz90nl -ds4lHvuDR+aKnZlTHmch3wfhXv7lNQImIBzfwl36Kd/bWB0fAEVFse3iZWmigaI/ -9FKh//WIq43TNLxn68OCQoyMe/HGjZDR/Xwo3rE6jg6/iAwSWib9yabfYPKbqq2G -oFy6aYmmEquaDgLuX7kCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA2AZrD9cTQXTW -4j2tT8N/TTc6WK2ncN4h22NTte6vK7MVwsZJCtw5ndYkmxcWkXAqiclzWyMdayds -WOa12CEH7jKAhivF4Hcw3oO3JHM5BA6KzLWBVz9uZksOM6mPqn29DTKvA/Y1V8tj -mxK/KUA68h/u6inu3mo4ywBpb/tqHxxg2cjyR0faCmM0pwRM0HBr/16fUMfO83nj -QG8g9J/bybu5sYso/aSoC5nUNp4XjmDMdVLdqg/nTe/ejS8IfFr0WQxBlqooqFgx -MSE+kX2e2fHsuOWSU/9eClt6FpQrwoC2C8F+/4g1Uz7Liqc4yMHPwjgeP9ewrrLO -iIhlNNPqpQ== +Y2VydHMwIBcNMjMwNzEzMTQzNTIzWhgPMjA1MDExMjgxNDM1MjNaMEYxHjAcBgNV +BAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTEkMCIGA1UEAwwbY29tbW9uLW5hbWUu +cGctc3NsdGVzdC50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +1bNU8yTuLl/5bR4Rp1ET5NMC2wgrTwKQsxSeOzvMmTGeebpEYFc/Hq8rcCQAiL7A +bhiZeNg/ca4yJdouOdaHaTMFJ8hFDI1tNOGeFK7ecOMBWQ97GxKs/KIqKYW42AN+ +QZ7l1Apr0CDZK5VTi931JjE4wCIgUgLi2zgwtZYl/kP896F1K5zR7kx773U2dvP3 +SeV2ziUe+4NH5oqdmVMeZyHfB+Fe/uU1AiYgHN/CXfop39tYHR8ARUWx7eJlaaKB +oj/0UqH/9YirjdM0vGfrw4JCjIx78caNkNH9fCjesTqODr+IDBJaJv3Jpt9g8puq +rYagXLppiaYSq5oOAu5fuQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQCT3LdsDzwy +oKaXNuOgtENp4Pp4hLDXeZsepemYss75xfPsXyni9gWVTPIwwzq7NMawtP5q7zzB +zUMiDgsL9J3d1kDcL0qbJV7xciwCA5D0O1EFKSogJK9jgdupswQZKNrEtM2F68mN +SJ2aCJtIX/4lZb9KyRli4PDECrFjJM4vDQa9y05O5YY7lohvY5jubAAgexLT/n5r +oycpw3xNzwGIQ8dAtjvtgONFFKAogWomFaCjWSBPW3ZVz4NM7CryH6oyxkUv/v+q +/7vUykX0qBn7Vnk3nvVsqrqRRCbYXMz8qgMLeeXi5JjSeWDpYoiblIEfpf3FdtqS +FnIQVHtAuZHb -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-crldir/a836cc2d.r0 b/src/test/ssl/ssl/server-crldir/a836cc2d.r0 index 331a83cb62d40..7ed68e0220ae8 100644 --- a/src/test/ssl/ssl/server-crldir/a836cc2d.r0 +++ b/src/test/ssl/ssl/server-crldir/a836cc2d.r0 @@ -1,11 +1,11 @@ -----BEGIN X509 CRL----- -MIIBpTCBjjANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0yMTAz -MDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMBswGQIIICEDAxQSBwUXDTIxMDMwMzIy -MTIwN1owDQYJKoZIhvcNAQELBQADggEBAJxj0taZYIIxUsCuXR5CN2OymjMvRwmV -+10VOkyBQ3VkzHlXeJkmZsU2Dvmc205l9OYouh/faL0TfK2NyhmBo+MrTizL9TBo -4u2es/0oJGj2wyNMkRs0SlSJelakvGFBvSKfqoV0l2O1WDV7M4KtdC8ZVZipmL4R -ac4hBMK0ifHuTS5Od6o0C2RijEPCHMXaS/LkWpBqcStI2oirhjo+Th1wxTMGUVFy -imVvt6D6QqqHCUYrvcNEN0xBNFwJGq/0cgSy+w5szt/RRehmJKX8MbNeZxrznIIx -B18ch9rbBltz+Y4R63rCN9MdsnGXf6PQ6a6doZhSI1pnDrui12MOQrU= +MIIBpzCBkDANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0yMzA3 +MTMxNDM1MjRaGA8yMDUwMTEyODE0MzUyNFowGzAZAgggIwcTFjUjCxcNMjMwNzEz +MTQzNTI0WjANBgkqhkiG9w0BAQsFAAOCAQEADIkF8oS84O2PJw/C9BAzgrkd+EsO +QL6mXUGBgXwmujfpv0Z8YK91k4+xV9hQRMjWe/DkU01+gmFhYoDvAzweuNQzx8lZ +bYKu0dGTEpTd+OG1LbxYmt4f5xh096R5iLo7c7e2kMHvfNG7VwvKQrPeMqh7AcKy +Fukt8C0Xc7Tfv2l2toEQUAl5UDUKEAovN6iB0qycpvi0nboyiDo8mV0p1jlAn846 +EeXjwm8tyGXzTFq16ypPwnlBM9d5Ml/p5WTN69nDux18G+iSCr+UDzLDYvLF11p3 +lEqpSo5lQg9zYuOgMCvu3g5BtwJgORPSiW/yZ5BXUfWvPi0XRPrknxMByA== -----END X509 CRL----- diff --git a/src/test/ssl/ssl/server-ip-alt-names.crt b/src/test/ssl/ssl/server-ip-alt-names.crt index 8a1bc620bb6a3..3f15775a3444a 100644 --- a/src/test/ssl/ssl/server-ip-alt-names.crt +++ b/src/test/ssl/ssl/server-ip-alt-names.crt @@ -1,19 +1,20 @@ -----BEGIN CERTIFICATE----- -MIIDCTCCAfGgAwIBAgIIICERKREEUAAwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +MIIDSzCCAjOgAwIBAgIIICMHExY1IwMwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl -cnZlciBjZXJ0czAeFw0yMTExMjkxOTA0NTBaFw00OTA0MTYxOTA0NTBaMCAxHjAc -BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAOM8yB6aVWb17ujr3ayU62mxHQoqn4CvG9yXlJvGOGv/ursW -Vs0UYJdc96LsNZN1szdm9ayNzCIw3eja+ULsjxCi6+3LM4pO76IORL/XFamlTPYb -BZ4pHdZVB0nnZAAnWCZPyXdnjOKQ5+8unVXkfibkjj8UELBJ2snehsOa+CTkOBez -zxYMqxAgbywLIYsW448brun7UXpWmqbGK+SsdGaIZ5Sb7Zezc5lt6CrLemTZTHHK -7l4WZFCCEi4t3sgO8o1vDELD/IE5G8lyXvIdgJg6t8ssper7iCw6S8x+okhjiSjT -vDLU2g4AanqZRZB49aPwTo0QUcJA2BCJxL9xLy8CAwEAAaMlMCMwIQYDVR0RBBow -GIcEwAACAYcQIAENuAAAAAAAAAAAAAAAATANBgkqhkiG9w0BAQsFAAOCAQEAwZJ+ -8KpABTlMEgKnHIYb35ItGhtFiTLQta9RkXx7vaeDwpOdPP/IvuvpjpQZkobRgBsk -bNM0KuJpd2mSTphQAt6eKQIdcPrkzvc/Yh9OK3YNLUAbu/ZhBUnBvFnUL4wn2f1U -mfO+m8P/LxybwqKx7r1mbaB+tP3RTxxLcIMvm9ECPQEoBntfEL325Wdoj+WuQH5Y -IvcM6FaCTkQsNIPbaBD5l5MhMLHRULZujbDjXqGSvRMQfns6np/biMjNdQA8NZ5z -STeUFvkQbCxoA0YYLgoSHL5KhZjXrg2g+T+2TUyCTR/91xf9OoOjBZdixR0S0DzJ -B1+5vnUjZaCfnSEA7A== +cnZlciBjZXJ0czAgFw0yMzA3MTMxNDM1MjNaGA8yMDUwMTEyODE0MzUyM1owIDEe +MBwGA1UECwwVUG9zdGdyZVNRTCB0ZXN0IHN1aXRlMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA4zzIHppVZvXu6OvdrJTrabEdCiqfgK8b3JeUm8Y4a/+6 +uxZWzRRgl1z3ouw1k3WzN2b1rI3MIjDd6Nr5QuyPEKLr7cszik7vog5Ev9cVqaVM +9hsFnikd1lUHSedkACdYJk/Jd2eM4pDn7y6dVeR+JuSOPxQQsEnayd6Gw5r4JOQ4 +F7PPFgyrECBvLAshixbjjxuu6ftRelaapsYr5Kx0ZohnlJvtl7NzmW3oKst6ZNlM +ccruXhZkUIISLi3eyA7yjW8MQsP8gTkbyXJe8h2AmDq3yyyl6vuILDpLzH6iSGOJ +KNO8MtTaDgBqeplFkHj1o/BOjRBRwkDYEInEv3EvLwIDAQABo2UwYzAhBgNVHREE +GjAYhwTAAAIBhxAgAQ24AAAAAAAAAAAAAAABMB0GA1UdDgQWBBSZsk0rfkcawCvx +XxCfQdMrWBIAVTAfBgNVHSMEGDAWgBTyjzpmQFBkSCLXLoL/Vp7Cs+50CjANBgkq +hkiG9w0BAQsFAAOCAQEAHtiw75o40lNQJPmdNJ0GijokFQ80AB9Cq1h3IAE7g9X4 +S5EQ+xukQoEcDwqi3PYN2axHayE3qgYpD4burydxboNFeDSl06Sv+g3KQ57Uv76y +ODFOElKwedkdfgxVrBNX2kVR1gacQHrMqGN7aBSwZ8wReLS4keYtDo/Bfd9cyaBF +g3CuPCa7u7ZB9S+g8bRE1L0rktQ9viynMI5G1hgFqm+aXMBpWrQj566z8qMRDN0a +qk6gHxfXFy9NJorUxfHOTcrrKA2YciGHFUdRZT6zX4Nt8RjTWK6Oxro4G6UqAH+2 +g65OIDeyMwi+UUnDzMQPJoI20jZpBms9670yrlZDqg== -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-ip-cn-and-alt-names.crt b/src/test/ssl/ssl/server-ip-cn-and-alt-names.crt index 2be02feb03f5d..cbf79b91127b3 100644 --- a/src/test/ssl/ssl/server-ip-cn-and-alt-names.crt +++ b/src/test/ssl/ssl/server-ip-cn-and-alt-names.crt @@ -1,19 +1,21 @@ -----BEGIN CERTIFICATE----- -MIIDHTCCAgWgAwIBAgIIICIBBBQ2MQAwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +MIIDXzCCAkegAwIBAgIIICMHExY1IwUwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl -cnZlciBjZXJ0czAeFw0yMjAxMDQyMjM2MzFaFw00OTA1MjIyMjM2MzFaMDQxHjAc -BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTESMBAGA1UEAwwJMTkyLjAuMi4x -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwmqTdQJfs2Ti9tPitYp2 -27I0HvL/kNSgA6egFr0foRo0BorwJNIzdbV0+EnsfiBNTWL5It26gqO7UP3ms8t2 -vHD5gkXfT+f6ts0lVJEcIOkUD/8ws4Ic9Y4uPqb4gN+pUKqcxtmLW1TYk84MBK59 -Xz4yPPS6N+G/DMMeFHTNkM9EQwn/+DC3fDsWdGYM2GRWDTJGg1A5tSUcF+seu7i1 -Vg7XajBfsvgAUAsrAxV+X/sLZh94HY+paD6wfaI99mY2OXVc/XW/z1r9WQznor65 -ZkonNCaPfavqPG5vqnab9AyQcqPqmX8hf/xrniASBAkqNCctbASrFCIYvCJfGfmX -EQIDAQABoyUwIzAhBgNVHREEGjAYhwTAAAIChxAgAQ24AAAAAAAAAAAAAAABMA0G -CSqGSIb3DQEBCwUAA4IBAQBf7kmYfRYfnWk1OUfY3N1kaNg9piBBlFr9g+OQn9KU -zirkN7s0ZQbCGxV1uJQBKS58NyE414Vorau77379emgYDcCBpDIYpkLiNujVrIOr -ggRFKsFRgxu4/mw0BSgCcV8RPe9SWHZ90Mos7TMCnW/PdxOCD1wD0YMkcs0rwB3l -0Kzc7jDnfOEvmgw/Ysm7v67ps+05Uq5VskQ6WrpSAw6kPD/QMuuBAX8ATPczIaox -zAMyncq1IiSIwG93f3EoQQThdQ70C6G9vLcu9TtL6JAsEMFEzR99gt1Wsqvmgl9W -kStzj1yjIWeo5gIsa4Jgcke1lZviWyrTxHDfyunYE5i5 +cnZlciBjZXJ0czAgFw0yMzA3MTMxNDM1MjRaGA8yMDUwMTEyODE0MzUyNFowNDEe +MBwGA1UECwwVUG9zdGdyZVNRTCB0ZXN0IHN1aXRlMRIwEAYDVQQDDAkxOTIuMC4y +LjEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDCapN1Al+zZOL20+K1 +inbbsjQe8v+Q1KADp6AWvR+hGjQGivAk0jN1tXT4Sex+IE1NYvki3bqCo7tQ/eaz +y3a8cPmCRd9P5/q2zSVUkRwg6RQP/zCzghz1ji4+pviA36lQqpzG2YtbVNiTzgwE +rn1fPjI89Lo34b8Mwx4UdM2Qz0RDCf/4MLd8OxZ0ZgzYZFYNMkaDUDm1JRwX6x67 +uLVWDtdqMF+y+ABQCysDFX5f+wtmH3gdj6loPrB9oj32ZjY5dVz9db/PWv1ZDOei +vrlmSic0Jo99q+o8bm+qdpv0DJByo+qZfyF//GueIBIECSo0Jy1sBKsUIhi8Il8Z ++ZcRAgMBAAGjZTBjMCEGA1UdEQQaMBiHBMAAAgKHECABDbgAAAAAAAAAAAAAAAEw +HQYDVR0OBBYEFGX9z+RX7x23a5ViEQbcj5XBGHaZMB8GA1UdIwQYMBaAFPKPOmZA +UGRIItcugv9WnsKz7nQKMA0GCSqGSIb3DQEBCwUAA4IBAQCQQ+5/h6r84jks/l5u +0G6w07hcgo/AfPEVSqGXDlEiJEdP8IownmxPB5siRwq6FNHqVMQ6usFeTlfYqtzE +OmQOagLyKAhYCQkVPUIpIKLj70o8DVqnwoxr1+kWZUi4xLPTYPawFHUem7cX6TuT +7TQe2yCXPHf8GaIMRjNI1LSpT5DUxHXZinw6UnsHr5EotFTSzmS/Yfko881+WDBq +Uv/AOReEwLUvaRBTbWmIxyN7y6S8BUzlDw6AvSZLVczuQ1qLbFAc/fjdkiyCos2J +r8FOq7UnBrvbs7/mT/1AtAcHjShPYGH3JFIgvHfixrJlsdS85f3GA9tJgJ9BV16d +qkjO -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.crt b/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.crt index 23c06da01c7fd..b51dab2963faa 100644 --- a/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.crt +++ b/src/test/ssl/ssl/server-ip-cn-and-dns-alt-names.crt @@ -1,20 +1,21 @@ -----BEGIN CERTIFICATE----- -MIIDQzCCAiugAwIBAgIIICIBBBQ2MQEwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +MIIDhzCCAm+gAwIBAgIIICMHExY1IwYwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl -cnZlciBjZXJ0czAeFw0yMjAxMDQyMjM2MzFaFw00OTA1MjIyMjM2MzFaMDQxHjAc -BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTESMBAGA1UEAwwJMTkyLjAuMi4x -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8xddbo/x2TOSIa/br8BN -o/URdTr9+l2R5YojiZKDuLxiQVkgC30PJ2/CNFKIh2nHhRrzknI6sETVtrxZ+9V2 -qRc1yShVu462u0DHPRMIZnZIOZg3hlNB0cRWbOglUKlttIARNEQUcTUyPOtyo4/v -+u0Ej5NTNcHFbFT01vdD9MjQiCO3jKdAwPIb14jTg4C71EpZ+LuelDo4DzF2/XgG -WqUTrgD/XnBU/60PU9Iy3G0nVpx21q6ppn9G7a9R+i8FjBcwW1T+cfsBDWhAv+bi -RmSAkENf8L8TwOlDQUwROkfz3Hz36vuJjdkreQJsiqL0HnrnH5T5G9UzJO86FvZQ -5wIDAQABo0swSTBHBgNVHREEQDA+gh1kbnMxLmFsdC1uYW1lLnBnLXNzbHRlc3Qu -dGVzdIIdZG5zMi5hbHQtbmFtZS5wZy1zc2x0ZXN0LnRlc3QwDQYJKoZIhvcNAQEL -BQADggEBAF+mfaw6iBPzpCgqq830pHRa3Yzm1aezt8SkeRohUYHNv/yCnDSRaqtj -xbENih3lJMSTBL3g0wtTOHfH8ViC/h+lvYELHzXKic7gkjV7H5XETKGr0ZsjBBT2 -4cZQKbD9e0x0HrENXMYgGpBf747qL6uTOVJdG0s15hwpLq47bY5WUjXathejbpxW -prmF8F+xaC52N9P/1VnqguQB909F4x1pyOK7D7tjFu+Y8Je7PHKbb6WY5K6xAv6t -R17CY0749/FotlphquElUR2bs5Zzv5YrjUHPTcbwKvcH5cdNi93/u6NJt2xNAoYf -aZERhX5TA9DYk4gC8OY0yGaYCIj3Dd4= +cnZlciBjZXJ0czAgFw0yMzA3MTMxNDM1MjRaGA8yMDUwMTEyODE0MzUyNFowNDEe +MBwGA1UECwwVUG9zdGdyZVNRTCB0ZXN0IHN1aXRlMRIwEAYDVQQDDAkxOTIuMC4y +LjEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDzF11uj/HZM5Ihr9uv +wE2j9RF1Ov36XZHliiOJkoO4vGJBWSALfQ8nb8I0UoiHaceFGvOScjqwRNW2vFn7 +1XapFzXJKFW7jra7QMc9Ewhmdkg5mDeGU0HRxFZs6CVQqW20gBE0RBRxNTI863Kj +j+/67QSPk1M1wcVsVPTW90P0yNCII7eMp0DA8hvXiNODgLvUSln4u56UOjgPMXb9 +eAZapROuAP9ecFT/rQ9T0jLcbSdWnHbWrqmmf0btr1H6LwWMFzBbVP5x+wENaEC/ +5uJGZICQQ1/wvxPA6UNBTBE6R/PcfPfq+4mN2St5AmyKovQeeucflPkb1TMk7zoW +9lDnAgMBAAGjgYwwgYkwRwYDVR0RBEAwPoIdZG5zMS5hbHQtbmFtZS5wZy1zc2x0 +ZXN0LnRlc3SCHWRuczIuYWx0LW5hbWUucGctc3NsdGVzdC50ZXN0MB0GA1UdDgQW +BBSAWxUeTAXIo1H+cmx5bW0UJrPWlDAfBgNVHSMEGDAWgBTyjzpmQFBkSCLXLoL/ +Vp7Cs+50CjANBgkqhkiG9w0BAQsFAAOCAQEAoFdBPGtQA1y8lVAK3aFMyczeFwmS +Bh+gIEyYpzWEUCgLManf6MnVpR1lG2nPasHawlHD0vmNBNuKHaKwtvXanNlnhK60 +mSyVx2tRVtygs+fCFykS3Oy0GlBWdoONyZWmwV97+Jpq7F2tb3fqCehy0HWFKruG +JfVFBfVtPOdEgrla6ExuVcitDGNjKe6O1Kvt5m2Ze5+tX/rBJcSL9vfh/pa/qM4B +lukCT9RwNNfUgNKIC0Tq13sNUeo7Fz3td46ZFOviBMv5ywH/7OE9eYNRvXwd/brH +xNiRiUwBiUMvae38Tm4E8bFT6N/pmRVXAk4v84Eo/hxFIogT531JNaQhYA== -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-ip-cn-only.crt b/src/test/ssl/ssl/server-ip-cn-only.crt index 9bf015cf18567..8b15358577bb2 100644 --- a/src/test/ssl/ssl/server-ip-cn-only.crt +++ b/src/test/ssl/ssl/server-ip-cn-only.crt @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE----- -MIIC8TCCAdkCCCAhESkRN1IAMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +MIIC8zCCAdsCCCAjBxMWNSMEMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzZXJ2ZXIg -Y2VydHMwHhcNMjExMTI5MTkzNzUyWhcNNDkwNDE2MTkzNzUyWjA0MR4wHAYDVQQL -DBVQb3N0Z3JlU1FMIHRlc3Qgc3VpdGUxEjAQBgNVBAMMCTE5Mi4wLjIuMTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANWs1uUL71nHYF9Zj6p+M3MpYDvx -32iCjVdtH5a2qpSWHXTg0rR8dLX0y92cvOYvMXHRajZT1avpHr8dooPYSVaXpGMK -NvF/Qi+WFYovRbP2vmd1yv1cgW/FggbwJFWVobizIz4seyA4d0B2j9fqoi2OFBNP -huW664SjF0u3p21tDy+43i2LNUMAKf6dnRR5Vqenath87LEU41tSLudu6NXgbFMk -jvfNkl4d0w7YCzeXmklmSI+uaX3PlJJ4NzQO2j8w5BvnKVhNVD0KjgrXZ6nB/8F7 -Pg3XY+d7rJlwRgXemU6resWQDJ7+UaC9u7I4EIP+9lzCR/nNBqUktpHRmHUCAwEA -ATANBgkqhkiG9w0BAQsFAAOCAQEAos1JncV8Yf4UaKl6h1GdYtcVtzFyJvBEnhRD -07ldL+TYnfZiX8wK2ssBtM3cg/C78y5bzdUa5XGS83ZKQJFFdhE7PSnrvyNqyIqY -ZgNBxto3gyvir+EjO1u9BAB0NP3r3gYoHRDZS1xOPPzt4WgjuUgTLM9k82GsqAbO -UrOTOdRnkIqC5xLpa05EnRyJPRsR1w1PRJC2XXKnHIuFjMb4v7UuPwyCcX1P5ioc -rQszQcORy/L+k0ezCkyweORg68htjYbBHuwOuiGfok6yKKDMzrTvD3lIslls6eX7 -4sI3XWqzkPmG9Vsxm9Vu9/Ma+PRO76VyCoIwBd+Ufg5vNXhMmw== +Y2VydHMwIBcNMjMwNzEzMTQzNTI0WhgPMjA1MDExMjgxNDM1MjRaMDQxHjAcBgNV +BAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTESMBAGA1UEAwwJMTkyLjAuMi4xMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1azW5QvvWcdgX1mPqn4zcylg +O/HfaIKNV20flraqlJYddODStHx0tfTL3Zy85i8xcdFqNlPVq+kevx2ig9hJVpek +Ywo28X9CL5YVii9Fs/a+Z3XK/VyBb8WCBvAkVZWhuLMjPix7IDh3QHaP1+qiLY4U +E0+G5brrhKMXS7enbW0PL7jeLYs1QwAp/p2dFHlWp6dq2HzssRTjW1Iu527o1eBs +UySO982SXh3TDtgLN5eaSWZIj65pfc+Ukng3NA7aPzDkG+cpWE1UPQqOCtdnqcH/ +wXs+Dddj53usmXBGBd6ZTqt6xZAMnv5RoL27sjgQg/72XMJH+c0GpSS2kdGYdQID +AQABMA0GCSqGSIb3DQEBCwUAA4IBAQB2VbIjlzU7ieisvO3ZCGMJmCmQtEDC8Xgo +umbbHtCdCYtPy8KSulAKBzLLBpVsQiOqq6T8t3KZrU64Wi2DEamULfYfgZCdatQw +EWzBmTOO+5guo3ntm57+3kR9pRbTDbLUgOrgJrKnu1THof+6gwX6e0D++91mfwpm +FLhn4bIuRyQtlqH7Ft0otsA4HezoHDLGTS76NDYpx+rDklFE6ZUk3RFgC7ScXPfW +rA+KJIATgnrDwBx+n8s1SeZ7S64QkZk27QVi/8exYbd6aJwWBTuoHXZswfn5nK/b +PFR7RK0LgucLvOKjUTzNPZUyhjS+b2dSnPZUuWNTFFu5KhnfoPEZ -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-ip-in-dnsname.crt b/src/test/ssl/ssl/server-ip-in-dnsname.crt index 78ad8d99c8c54..87009ebd2c3cd 100644 --- a/src/test/ssl/ssl/server-ip-in-dnsname.crt +++ b/src/test/ssl/ssl/server-ip-in-dnsname.crt @@ -1,18 +1,20 @@ -----BEGIN CERTIFICATE----- -MIIC/DCCAeSgAwIBAgIIICIDFRVYUgAwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +MIIDPjCCAiagAwIBAgIIICMHExY1IwcwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl -cnZlciBjZXJ0czAeFw0yMjAzMTUyMjU4NTJaFw00OTA3MzEyMjU4NTJaMCAxHjAc -BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMpn5bP1/OfBQR/yvOkOBzxArE1j1YShVa2pcj896+CVDEgV -N5Hluz7KHU/JYzNZCAHb5WAHuvXxKeoj4Ti5be1KsqO0mN1p+RMN7VlCpCpb0AWT -z4z+I8TUhSZnmgghHvfW4RfcZMCcHq1vevVTDxR/cAbDPYpgBCD5F/SZMRyMDw5B -7ILLmft0eqA1nCqavyqBCGZvx1ol8N5BfVdrDXp/rN5997khBWQRZ8g84FZyFZXf -pwp57eu0OGQDzZFXoEL2t4OVld67K5jcclWVxHY6FGcHjCvyqs48PCPOR84anZwj -GsqVOS6250/DWKBQO4KyhkTVf0AW/ICGSMOKkAkCAwEAAaMYMBYwFAYDVR0RBA0w -C4IJMTkyLjAuMi4xMA0GCSqGSIb3DQEBCwUAA4IBAQDIAAH0WJKEpbPN0QihN6SF -UA5WL4ixsBACo9OIAGkSnKeOeVEG5vvgOna0hjQcOcgtI1oCDLhULcjCuwxiIW6y -QntOazyo0sooJr0hEm2WfipvIpQs6W9E1OTcs624BAVfkAwr6WT2VwoIAPcQD2nR -tIQhSUIR9J7Q5WbzuQw7pthQhBfW/UPWw7vajel0r1dflbe0Cgp5WGNfp1kYy+Qf -XW/YjkstZEP1KFm+TF58uxrIDmYboS8EerUREGQixijbI0AfXjShxtiyS63rbdpo -3C0BPj9Yx2VtWi4U0qoef/iLJxJBCLvE/97+duPdKx0AkkOWA9VuenkWLp797UM8 +cnZlciBjZXJ0czAgFw0yMzA3MTMxNDM1MjRaGA8yMDUwMTEyODE0MzUyNFowIDEe +MBwGA1UECwwVUG9zdGdyZVNRTCB0ZXN0IHN1aXRlMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAymfls/X858FBH/K86Q4HPECsTWPVhKFVralyPz3r4JUM +SBU3keW7PsodT8ljM1kIAdvlYAe69fEp6iPhOLlt7Uqyo7SY3Wn5Ew3tWUKkKlvQ +BZPPjP4jxNSFJmeaCCEe99bhF9xkwJwerW969VMPFH9wBsM9imAEIPkX9JkxHIwP +DkHsgsuZ+3R6oDWcKpq/KoEIZm/HWiXw3kF9V2sNen+s3n33uSEFZBFnyDzgVnIV +ld+nCnnt67Q4ZAPNkVegQva3g5WV3rsrmNxyVZXEdjoUZweMK/Kqzjw8I85Hzhqd +nCMaypU5LrbnT8NYoFA7grKGRNV/QBb8gIZIw4qQCQIDAQABo1gwVjAUBgNVHREE +DTALggkxOTIuMC4yLjEwHQYDVR0OBBYEFDGGF+fm5mk/sd23jkLL3uVU0NjCMB8G +A1UdIwQYMBaAFPKPOmZAUGRIItcugv9WnsKz7nQKMA0GCSqGSIb3DQEBCwUAA4IB +AQCf8knuWhoBZ8psmq+NC/RZRxfQmFBRj+bKzJ6YaAHyNmE44nBtIAJal3m4FyTZ +vXAlYpfRLrF+R5PJVnvT8mfu/vfxJn3MPHV7R8vmJpRAx8uQKFuxQPQDUq84efqZ +BHG0zoNPml915nVfxgt1WqIVWQpomAOvjb1Ct31A1bZF5oMjhg86XdytqQNohl8I +NBNu027tO0izM/mX3xJzYEnBSiHwKPfZxSKtc0FSffwohWUlpEye1A4Q9d6tWF6d ++PagUG+hodSLsU5Bno4dc0RYJr9xJLW9QMcuCbMC9zXaUBWpkUwOWbMXpPhvawdu +oR2Tvhha37JD6a8NEUgSJOvL -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-multiple-alt-names.crt b/src/test/ssl/ssl/server-multiple-alt-names.crt index 58799e49f8022..85663b97af9cc 100644 --- a/src/test/ssl/ssl/server-multiple-alt-names.crt +++ b/src/test/ssl/ssl/server-multiple-alt-names.crt @@ -1,20 +1,22 @@ -----BEGIN CERTIFICATE----- -MIIDSzCCAjOgAwIBAgIIICEDAxQSBwMwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +MIIDjzCCAnegAwIBAgIIICMHExY1IwkwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl -cnZlciBjZXJ0czAeFw0yMTAzMDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMCAxHjAc -BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBANdIkKX1X+Jwqo5EXC1z/TjUKnYTDzHYx2rCqprBU8fN0mSy -lMyjDm+eo924PN7LahqCHeDCMbapwymkoNfpLHkNRwotHLvxN5RyxJD4m5fXclRo -V1ZzwwXTqXlECwrzzYGst/7muDM9DX+0vXIAvQGbvxBGI0CBM3ztHBADXlSFrYGX -zN/to9KZmeOgBGJRGSZJg09P5px5N2E49yOqkIa9+MGb6nK8KLmETeTYjlWCS6W+ -oD0qGpZvj2Fzioz+Pn1q9fB3WS687GuMT0WvV3LAzcn341r0E36bUf9rxSjfBX79 -11KsVMemr1QskSmvMQFEv6R1Rp8xUGPqKlkRJ9sCAwEAAaNnMGUwYwYDVR0RBFww -WoIdZG5zMS5hbHQtbmFtZS5wZy1zc2x0ZXN0LnRlc3SCHWRuczIuYWx0LW5hbWUu -cGctc3NsdGVzdC50ZXN0ghoqLndpbGRjYXJkLnBnLXNzbHRlc3QudGVzdDANBgkq -hkiG9w0BAQsFAAOCAQEAuRAyYBwAZLKERoYDy/kE9LKddJfLhledTJ7+cIWs6T9V -KBfWBHZYxfxmdBYwqVZfog8c5uHREfWiUPoF/aMq3ARay96aMh4xXJ+2a7HAmknF -9AJWRieoc3H/QkMzAuT8IDTmoEarsr8vsX1MGabobZte/B9tEjq/z5t3GfLrHMVX -5092U6Ka40ii4U1VwjR8YnRBwjm3UpLmZJAjvXjw13/XucNV5O8Plo1yvS+G0AMh -KdMxExiItVtjZteiA0pJf0YGAzTFyzvwBljTcs4NfZ2M0ta9i0r4BF7wQ8tDezN7 -VxdJVPc5xPqncp0cMdUAE2xDmYlKEqB0kuAHNwH5/Q== +cnZlciBjZXJ0czAgFw0yMzA3MTMxNDM1MjRaGA8yMDUwMTEyODE0MzUyNFowIDEe +MBwGA1UECwwVUG9zdGdyZVNRTCB0ZXN0IHN1aXRlMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA10iQpfVf4nCqjkRcLXP9ONQqdhMPMdjHasKqmsFTx83S +ZLKUzKMOb56j3bg83stqGoId4MIxtqnDKaSg1+kseQ1HCi0cu/E3lHLEkPibl9dy +VGhXVnPDBdOpeUQLCvPNgay3/ua4Mz0Nf7S9cgC9AZu/EEYjQIEzfO0cEANeVIWt +gZfM3+2j0pmZ46AEYlEZJkmDT0/mnHk3YTj3I6qQhr34wZvqcrwouYRN5NiOVYJL +pb6gPSoalm+PYXOKjP4+fWr18HdZLrzsa4xPRa9XcsDNyffjWvQTfptR/2vFKN8F +fv3XUqxUx6avVCyRKa8xAUS/pHVGnzFQY+oqWREn2wIDAQABo4GoMIGlMGMGA1Ud +EQRcMFqCHWRuczEuYWx0LW5hbWUucGctc3NsdGVzdC50ZXN0gh1kbnMyLmFsdC1u +YW1lLnBnLXNzbHRlc3QudGVzdIIaKi53aWxkY2FyZC5wZy1zc2x0ZXN0LnRlc3Qw +HQYDVR0OBBYEFNQECIqqAsJFZk9MZ3oygGNRbziXMB8GA1UdIwQYMBaAFPKPOmZA +UGRIItcugv9WnsKz7nQKMA0GCSqGSIb3DQEBCwUAA4IBAQDOljab+EBwmJA4qzN4 +nY3QVQWxoPG7RBrNFRp2hrP05amitsjWG4+GWiIlKT7aSpEgUghdZgAb25FG44VH +oUEo2aAJjTRGmssbeOUstDRXYCIOefaaxSleEgbZdrUb+zDkPwDw381EYuO/E+og +OcS9nsbrq1vo1B09xQdpcJ6pf9VmmM4OQHpD2/xPxhOPVxMKhbrFvVOlHDc23sue +kfaAnHFu3k5O2/fqGxWm7IQA8KNfhyWRDDZjwU3F+duqiHphGDyn0JH6bO+QNSEs +kj7tCGh9oziomt/mnD1zDPO+s9f5+i9itk8emRaBakLsv7SyngO777r79myiiM+E +LYJo -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-no-names.crt b/src/test/ssl/ssl/server-no-names.crt index b5d0589090f6e..45a434bcf1b4a 100644 --- a/src/test/ssl/ssl/server-no-names.crt +++ b/src/test/ssl/ssl/server-no-names.crt @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE----- -MIIC3TCCAcUCCCAhAwMUEgcEMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +MIIC3zCCAccCCCAjBxMWNSMKMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzZXJ2ZXIg -Y2VydHMwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjAgMR4wHAYDVQQL -DBVQb3N0Z3JlU1FMIHRlc3Qgc3VpdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCfOf74edog2QHkJlreO6NJEe1VZUSxn+LBeHH8T5fniFiM4Ym9X2o3 -XKhYsvNSwvrfWwMkajMkd3b3vURiuiAxYzB/9AwX97RUkZ8TfuU3UgISiCbJZrVH -TpfJEv7JhePgYpAoOdPWqtFPmnO/Xv6uNjsrx/V/3COovUj3eIcyQzAl+eC2U9Tn -//dJ0kF+hDnOR3I/3e6bAboJjAVvLl2ABryaateHuUaCu/Bf5mG1DarXNXPKYuP+ -KrkjHhH0KQ4Js3nu7bPEiG0E/JmCR452j72WKb+PiJHOxdMMyztZ3k6bGGlbw60j -CwQnUJAlPL4G9U+lpVYG6f7HxOaJEscfAgMBAAEwDQYJKoZIhvcNAQELBQADggEB -AJAwYwIL4oj3NisXCXkEp9zqDXiZvNW9yW3bY8lFFCpU7o5n92tCf2OFAkKaYhF1 -Eb2weyDULtW7W/wgdlOZL9npayYKzTusl6e8xfTQyjRCsoKWvnWOEkPH7VraZJ8c -Ko1KhaVWX98VLdlUh5giYAEkdhk0qPYKsQ32unBXXJu0pX63pnPDoaUBiZUWr/3l -CfkjgGY5YA8YxiDlHGNF1qlcX2fQKloDlvtH0L5Enwt25w2/IvWhTN6YxDR+rgdD -XYbQr6o6vsmnZTJ3zUZ6XFo98sZq5L9oy1pcC8roV7w0AUVxraTWYILyGfNgruG8 -xsok/hu1L2VnktveEW/qoVs= +Y2VydHMwIBcNMjMwNzEzMTQzNTI0WhgPMjA1MDExMjgxNDM1MjRaMCAxHjAcBgNV +BAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAJ85/vh52iDZAeQmWt47o0kR7VVlRLGf4sF4cfxPl+eIWIzhib1f +ajdcqFiy81LC+t9bAyRqMyR3dve9RGK6IDFjMH/0DBf3tFSRnxN+5TdSAhKIJslm +tUdOl8kS/smF4+BikCg509aq0U+ac79e/q42OyvH9X/cI6i9SPd4hzJDMCX54LZT +1Of/90nSQX6EOc5Hcj/d7psBugmMBW8uXYAGvJpq14e5RoK78F/mYbUNqtc1c8pi +4/4quSMeEfQpDgmzee7ts8SIbQT8mYJHjnaPvZYpv4+Ikc7F0wzLO1neTpsYaVvD +rSMLBCdQkCU8vgb1T6WlVgbp/sfE5okSxx8CAwEAATANBgkqhkiG9w0BAQsFAAOC +AQEA1w+EnZ8ef189KqulzF9vrKjdavlFyWon+otR0WAKFOojNMyIgAkbU69N0CHO +LnJPiIF3H3izWelNo+2Wv3BxylQXgRlr92gUCFoEQ/RKnZVjgKl36e2+l/AVud1Q +ke343xnYLup/jQ7LzKFIdyxmO090rrlHUO7Dg7bJAuHQ9bRbCO+orAg4nFZEoKd1 +kO/XQ7e18l95QJE6vOmRcbD0+kGRNYBA2v6K3DwX0PRUm7fyP1gLTbIt6jGukQiJ +/ZkcvVcHNkcJzEr+A8BGVYgTG6VhuBPSMWVnnZcui93vH2D/3hq7ILNlFWBycSW6 +HheriPQ4X+y96SmttrjQVwSDYA== -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-password.key b/src/test/ssl/ssl/server-password.key index a8e383a9498b2..bbe70789a0ad6 100644 --- a/src/test/ssl/ssl/server-password.key +++ b/src/test/ssl/ssl/server-password.key @@ -1,30 +1,30 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: AES-256-CBC,B335CBE53A05F4FC5805FC038BA80BA0 - -1U4+GwI8FGpcrk+9uzMlQU5UZ9xOJMOZb9xA3IYMw+2BLF7zVbAkYyyiqF2pKUmi -doOYFOGIXNV1VhVwlw674SMN+PIg72b2F7DDrqEYlicLCU4o7eeGhoiIKzTksRTU -YV3nYCCDZCEw7V+pFeGCUAc9fc+Y0BGMYIshLVdlTYgVjZScL5kHuD9t8xa6AaTS -mQp3jInRnHjEJbRSZnFQ9CR1LUtmGE02TOcWzoGshFdwCdtO/lJzBmmMxoL/qV1R -Cqc0PKSANsbgvTJMriZXYSFjpMYXmxBQXDYNuFfwq67bssAVIpTSvWu9SfcY/JwV -OqERcb1zPgDmprDvd/L7Vh/cdEWWWewOVoUo89cT7CrLvMINHqE6smM2x1xv91BB -AOpyoGJliPGAcLDVJINm9zC1ErEjSEcR/VumZKsgSTsBYgyYezTPQYAfe+h820rs -eC4GMu+zr31U2TVLYcb4j2t19fTgaQBj/LH3OBse9+0quoJhzmDjKelS3O3BaF05 -DM20tJRHANM+1WQ9+aFinXa1ozcGsrLSUa99oFqL4vKgL7jd0+wmCzwxaSp3rHB3 -AFHCdUOayDAdPhnGwathhAZ0AjyEJyWnA47pEpWDr7SytpbiMwOoPcW8/oKid10e -qBK7uGK1Zc7rtckjK3CrM1VFDbxzwGbF2aKHtFFyrJtUvJwfP0Y1V2DncOsiy5Nx -gJ3vxfi11gxnhd9VmcoY3JVvTHOsw48xYNFrZXve/X3o9eUDqb9VRs/vV3t5w+xR -RaUPdz9cdlp2AA4xW/IvIQ7XwuBWPaPVr/g9pUvI9iJ9Z4RdruvjqDAD+ICVx9MM -8SuN7X3gmg4mF5FEL0ct5ZdP16U8/EYvl7Np7vN3kYqbqucwCJH15R8LckAfbzIH -yYTXC1iik4GfyN9tTpQtZsZCvV2Uo+Fo3mxP/EzB6tNbfOi3LG/coverSwgZLQsA -Q6+Kta4PT671xXdaGLT9tEMIai9SiW5acqcdhjYvcaP69J8ZtKpNpP6HTL7IZD8p -SbMxE9jw+bYXILR3Ie0x98z4Z04Q28/bPbvPTbXK8nv6/YpjKgq4hrRG58psHdbX -ggS3RNzcJJMDArBka+zvbWL4jfWZhllMyGqc7q/FuoEqC5JlMTUBpru3NTNp6ZgQ -QXRV1Pc02ff8Dp1H8FP7B7bG3E2D9eTUqR60WvmGnuAqvXgA0+4rEaUKfxELH5qc -dZgu/yiuMttCha835wMLnOxsOJmHILwrc6/uQWydx3vNEWFx0tbV3FzVBIvqdpME -LA4iAAz5xqvLgA5ii23Hn18ycZGU7gTERK8RdiALRzPtBW6hPreQjiMTJnBaMhXA -Xq9opGsNmH/rZgXuk2VZ79bbl9pKN+z9ssRGzbHCVlEckfaxlrYfANwzk8PbOrZJ -6UW3Gf2PwRRNtiVEabf0upVng7V70KSRzjfC7KBHYwbRIL4nObgTG+vc1SjgNgrx -Ue/e8h9qiDBmgdH0Uvqfqb19HF+QzmUNoP9TVQFj+4+DuW5zN0D8weF4TuBgyHr6 -Y+Rbmq0WJlIlc8KMwX87nACesmFNSJkI0ftSLDHrLuvXRtB8f7s2cw3hd81i+scE ------END RSA PRIVATE KEY----- +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQINxoPgf5EIpICAggA +MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBDfIvFm0PjN6PZqYGX1sNXoBIIE +0OQEuDDHzFECSkTud0BLN3eFhCTXHz2pnqNyCa56D/Oc5w2vC8GuuiSiFrTUF4Di +HLfqjiejkiwl427CDb1iSrhlUcJFYVtQdo5195vLbNi/Js3Txg9F5MwEYKIAVskd +fpN7L873+c6eBtis5SxlUoK2cMkttGShkMbxIgAccUJdbAcBQfkE/TRuBRR1KUBk +B4ZlkQVv2AzunLpZ+f2AdqCa/VXSaYOtXulTUB+1KdCTHNeCvRruoc29Qfedamu9 +VekBPi+2jHtEe8PW45JY95RuvZd37FFRLxpJUOoh5sY3ltbDKIuw1PTXUZK0Czx4 +HaMhWdPD7N3KROmLPmwt9SDlBbfFoxAwsVluK1pJPdztc/YrgBcPcWv6RsEnhaM7 +jpk1jwjlyaCcImKA3nsqSKYNjvwc6FgDZFQRjdfHAByp+7ey/g0ftaWoDlmQ7ejW +bhRlpE+Sf/YjZlVlO+9OqDMmCzDi7QA63T7frdy4NuVm6IXPD14EKODP6UH+aImM +CbyPW8dECZWHbPN1NKFblKAYGzIL1zOKEK/XCwpgDQiPm5O4c6e6fVFspKYlyfwQ +FA+zW1zePA63wsnrgbNdNByfQ2A91tAFMTkc2hij64eZLWxxkFS+kW8u7Vy5HJE6 +tjsU8n33E4WzZhk95vaFyaQui5FYyqxohkexNhJ3jY4yLr692JHIKIZF1+KolaNI +ZDub6p+kLSJbsNDJL616MxMpgXCwPWi00rl+x31sDAYfTcpIdcmm1GfM0z4R3qpB +3io0PhbE8c9e0pxackYXrLnZs0+hsmNQaRfDBUirSVTjMPDZUC4q1CahG1TdVSlK +EmE3fbnM5L1o5twdny5EDl6/PZsbaFLctK/cCvHiclSl7ARJEbCPOKofhxHlXY93 +oBq8c6uG3lwjqFN3TVxtlu5g8PHy+9urlE/s9EqV6Ll0LcvPprUr8VKidMdsVT9N +RwN2SQ+6sCXCkBloTN9eIq5OihGHYOlvswoca0/7EBlSneGZyMYPRwtduq/iIvlk +4n0D2wfjCbf16SNVsAzEoApXVGr7BShzCAn8TQnldaBYh3LY2m1lU/2vi+RVtxI3 +l+DErH5JEeFcqAbgDzJ+W7SL5NDvRRGmb+9u7qZwPvu8tOGPd+sIonnkw+AAe1UI +sI/KD/3f/JOWj5MnGqbq/tSDbzNBDmIXJd+vERruBlBB+BClwzuO7s8+ZfGFi4fN +O0xS5mbp1UBQCIgvCPhn2gV8hdw1RoAixREhWWeUnu8MqiLe5fFE8SQIwUjtLedE +AYfrQ8Z28u3H4t/O62345NVP/GilbKQYFaugEj4rKvXeBG5PA9XQtJfo6JPLN1a9 +AtPRO+mrdTFNEdXK/MC7P7woI+DusjmraRH79CZhUT3csnBornPBtjHjjLZPlgtv +MyusmU9gaq+rB6YI2+9ZO0s9h70UHzD7vtMk6wXTtnFHv7OABtf2q3c9/q0ucUX5 +1Ox0nQJGHR8ACAD7QTNuGgnfczUOctBjuorfkymxthkjejU1nBC6WtJD1IzqzFTb +MJ+4G70yQ4lGs4szfT3d8FCACPdLv+d9MorbPKZn17STJywkK5NtbYhl1ChbrUWt +J097zL/4jB0JNOmymAdZqjmEOl5FJwJmHVLvM9OHkhMy +-----END ENCRYPTED PRIVATE KEY----- diff --git a/src/test/ssl/ssl/server-revoked.crt b/src/test/ssl/ssl/server-revoked.crt index 3bb0f164a64fe..ce4350dbc65fb 100644 --- a/src/test/ssl/ssl/server-revoked.crt +++ b/src/test/ssl/ssl/server-revoked.crt @@ -1,19 +1,19 @@ -----BEGIN CERTIFICATE----- -MIIDAzCCAesCCCAhAwMUEgcFMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl +MIIDBTCCAe0CCCAjBxMWNSMLMA0GCSqGSIb3DQEBCwUAMEIxQDA+BgNVBAMMN1Rl c3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVzdCBzZXJ2ZXIg -Y2VydHMwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBGMR4wHAYDVQQL -DBVQb3N0Z3JlU1FMIHRlc3Qgc3VpdGUxJDAiBgNVBAMMG2NvbW1vbi1uYW1lLnBn -LXNzbHRlc3QudGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKKD -zvJUs+N+KeDwWAW0zfI5C1t3BxKUwh+MrwtFeNIcxhJd9Bzy6fNnvpMa/kNPoHfN -n73OGLYeSDyiDc56dvBjLOfxPXFFN4TCuIxYSizIjniL3tzP/a8hyvO+KqTYyaEs -cT8+/rNnqlqBXNqcdChSGpk0y34uybvWj2/wDJWTbFJ20bI+30HOxCfK8Dp3s8Nl -suVSuLKF/qqbidDZuOAKc0/GJo2F/5AF9MkMYELmG6XAVq/XDkI3oLtxQKh6kYfc -nu3fI0Mwr9+FoP2q+K5KskA3KJLlgBOykG55Odbe6Js4TPHrMBTgC9aWrP/I1gb8 -tFY2FVN+D/Wl8T/Boh0CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAxVHoqX25W4Hx -pMNjv2AJzcB7D+c+dUXAmLLJ7jh6szWeL0M2E5qX4dLc8LzQKnXv5ZcT4i/akjDX -etdzuqh03kvDJvUkHclSWffmowmWMTG6GCA6S/2TQzSibIptkwqs74aIkayVJaC4 -jCBR+PVT8+cE2FMD6dAWu//fyEcpTg6XpZ/Upgu9OITGNaEQUGz8pSRkTgspfO0Q -AKPmql6dpywReIlr5mzy9liCzf/BbAVHGmP/pBGIkLn2AzvPLCQ/UFZYT6aH7l5J -nzmFhgRC3U5wPMdelHGrPMXg6OHCcyrQY0kEi7N/GQ5+jZkICoQuPJ7APKEZAUgO -XRwVulaWJQ== +Y2VydHMwIBcNMjMwNzEzMTQzNTI0WhgPMjA1MDExMjgxNDM1MjRaMEYxHjAcBgNV +BAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTEkMCIGA1UEAwwbY29tbW9uLW5hbWUu +cGctc3NsdGVzdC50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA +ooPO8lSz434p4PBYBbTN8jkLW3cHEpTCH4yvC0V40hzGEl30HPLp82e+kxr+Q0+g +d82fvc4Yth5IPKINznp28GMs5/E9cUU3hMK4jFhKLMiOeIve3M/9ryHK874qpNjJ +oSxxPz7+s2eqWoFc2px0KFIamTTLfi7Ju9aPb/AMlZNsUnbRsj7fQc7EJ8rwOnez +w2Wy5VK4soX+qpuJ0Nm44ApzT8YmjYX/kAX0yQxgQuYbpcBWr9cOQjegu3FAqHqR +h9ye7d8jQzCv34Wg/ar4rkqyQDcokuWAE7KQbnk51t7omzhM8eswFOAL1pas/8jW +Bvy0VjYVU34P9aXxP8GiHQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQDCJoMLMIl8 +yvxrXH+kD2z163bwsMEIdsJxsXGjewmI/tDMyDLdYVQGJm9YRa/Oebylir7T+ayr +NGj7b+Uo5KezgnRw9iQ9U8Xz6oKNxMNHB0mw5v7eR2cDFTzzNm1jYReIxWVryLOj +al4C5uWqoIOHUNYibSJZIjNpzR/Zu4d/Ijt3+oJz9OFRXlaXYuDqLrm8hsUkxBm8 +s6GS79Dvw75M689ZKrKQs/15ceFYqx1hTvePW7kK5tuhW//Hf2IX4pwwtn5x0t4A +M47qO71Zo3BxJFToNgALaw2+ixWNqy4kZ429NQjXArtq6eUI6IaOTU1ER2UAcOjN +OOC5mBDmmMZa -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server-single-alt-name.crt b/src/test/ssl/ssl/server-single-alt-name.crt index 7affdd68e783f..077a60a7adce0 100644 --- a/src/test/ssl/ssl/server-single-alt-name.crt +++ b/src/test/ssl/ssl/server-single-alt-name.crt @@ -1,19 +1,20 @@ -----BEGIN CERTIFICATE----- -MIIDEjCCAfqgAwIBAgIIICEDAxQSBwIwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE +MIIDVDCCAjygAwIBAgIIICMHExY1IwgwDQYJKoZIhvcNAQELBQAwQjFAMD4GA1UE Aww3VGVzdCBDQSBmb3IgUG9zdGdyZVNRTCBTU0wgcmVncmVzc2lvbiB0ZXN0IHNl -cnZlciBjZXJ0czAeFw0yMTAzMDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMCAxHjAc -BgNVBAsMFVBvc3RncmVTUUwgdGVzdCBzdWl0ZTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMWKHC1lrog7A8ye8C3NM38JBiQBMuIZR40wORl0hJxj5Tp8 -dX8Xo2Thi9Ry33+YfMwfkkF66ZRwnMMEa8VYBmOz+fZFzF19WpE8F1CR3PxKE7ai -zvunxy8oMxdXdIuTTzt8a5NcDLe22C4Yj21qaZVoh182ycvMH93V4MwsLcV3/GdV -Ko7QpwP2ZCf5D1rhyccx+Trwyb2bKvhW5Jd3GrRacFJQFfUyrAu/FvyuSPmn86ab -Jkr7CCgFlg6e4O9SFY7yXiOgLotsoQ5/YriTLinvUTGCMCSxaol97qx3I2gUpCZu -i7H+4Dt9L5FcCMshl0TU32dsjw6El1Wbzp6voCsCAwEAAaMuMCwwKgYDVR0RBCMw -IYIfc2luZ2xlLmFsdC1uYW1lLnBnLXNzbHRlc3QudGVzdDANBgkqhkiG9w0BAQsF -AAOCAQEAUIhBQLzQgd7wHlT9DARxcC7SZwQtnk2BVqMYTRBU4uIa0i2HVyetpe1P -rREthYq5sgaSqdonD9Splg8BLUlah9y3v9j6DBxkxNnz/3AZuA5oPaC/TZ+lwlX3 -QNWWFNaNZdcQbvjUvoPXIbJ6U9UDfByOJdoN4kJ6xe8Faj1Mp5Euqzr1ErrMtPWJ -XLnXLV4WyAx+iMAbofXNlCyUorPGA8lRudzQ7bKdrhMZDE66VYwlwsUejEiODt7M -NGTDs4aAZz9cBRjMeXhvX60cFQoykjAvWbieUKOgaFmJJyKemFj12cLeWyxvUodI -kYtgAdzftiCSrbDjl1pzPSM6RC/E/A== +cnZlciBjZXJ0czAgFw0yMzA3MTMxNDM1MjRaGA8yMDUwMTEyODE0MzUyNFowIDEe +MBwGA1UECwwVUG9zdGdyZVNRTCB0ZXN0IHN1aXRlMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAxYocLWWuiDsDzJ7wLc0zfwkGJAEy4hlHjTA5GXSEnGPl +Onx1fxejZOGL1HLff5h8zB+SQXrplHCcwwRrxVgGY7P59kXMXX1akTwXUJHc/EoT +tqLO+6fHLygzF1d0i5NPO3xrk1wMt7bYLhiPbWpplWiHXzbJy8wf3dXgzCwtxXf8 +Z1UqjtCnA/ZkJ/kPWuHJxzH5OvDJvZsq+Fbkl3catFpwUlAV9TKsC78W/K5I+afz +ppsmSvsIKAWWDp7g71IVjvJeI6Aui2yhDn9iuJMuKe9RMYIwJLFqiX3urHcjaBSk +Jm6Lsf7gO30vkVwIyyGXRNTfZ2yPDoSXVZvOnq+gKwIDAQABo24wbDAqBgNVHREE +IzAhgh9zaW5nbGUuYWx0LW5hbWUucGctc3NsdGVzdC50ZXN0MB0GA1UdDgQWBBRE +be2UnhcFV/bd5hEMML2w60NbbTAfBgNVHSMEGDAWgBTyjzpmQFBkSCLXLoL/Vp7C +s+50CjANBgkqhkiG9w0BAQsFAAOCAQEA1pyC1Vb1EOgMdcdMq+u0FI+7GHGkEeg7 +qWMcLvu7mbcbcyzLriBUk1vKDYw+6WspTc6vvqMGxNVdwchm/93rUM/JI4C6nrmr +3TJqE578C3EI+4YZxLLRnfYWBO0uyUfLkdjT3n0Tnu643wYYoKOgpZRV2WgfktK6 +KoRqWlkXkVoV/qZUS9O67XtNttvCFMrPiM4YbGmwQ7lUZ9qzojy4Fb0AWcZOVEIy +2b7FMOUrIzk9CgTRtEqeobSD98p3OXGtzVZf2hY9vLgA1hnbVjmB2Kt3QMhnicvt +/Z7o8o88cmcrs0PXMe90tt1JBssTFs6+ARCsgUkEwzCRnvVX+Yky9w== -----END CERTIFICATE----- diff --git a/src/test/ssl/ssl/server.crl b/src/test/ssl/ssl/server.crl index 331a83cb62d40..7ed68e0220ae8 100644 --- a/src/test/ssl/ssl/server.crl +++ b/src/test/ssl/ssl/server.crl @@ -1,11 +1,11 @@ -----BEGIN X509 CRL----- -MIIBpTCBjjANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ -b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0yMTAz -MDMyMjEyMDdaFw00ODA3MTkyMjEyMDdaMBswGQIIICEDAxQSBwUXDTIxMDMwMzIy -MTIwN1owDQYJKoZIhvcNAQELBQADggEBAJxj0taZYIIxUsCuXR5CN2OymjMvRwmV -+10VOkyBQ3VkzHlXeJkmZsU2Dvmc205l9OYouh/faL0TfK2NyhmBo+MrTizL9TBo -4u2es/0oJGj2wyNMkRs0SlSJelakvGFBvSKfqoV0l2O1WDV7M4KtdC8ZVZipmL4R -ac4hBMK0ifHuTS5Od6o0C2RijEPCHMXaS/LkWpBqcStI2oirhjo+Th1wxTMGUVFy -imVvt6D6QqqHCUYrvcNEN0xBNFwJGq/0cgSy+w5szt/RRehmJKX8MbNeZxrznIIx -B18ch9rbBltz+Y4R63rCN9MdsnGXf6PQ6a6doZhSI1pnDrui12MOQrU= +MIIBpzCBkDANBgkqhkiG9w0BAQsFADBCMUAwPgYDVQQDDDdUZXN0IENBIGZvciBQ +b3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qgc2VydmVyIGNlcnRzFw0yMzA3 +MTMxNDM1MjRaGA8yMDUwMTEyODE0MzUyNFowGzAZAgggIwcTFjUjCxcNMjMwNzEz +MTQzNTI0WjANBgkqhkiG9w0BAQsFAAOCAQEADIkF8oS84O2PJw/C9BAzgrkd+EsO +QL6mXUGBgXwmujfpv0Z8YK91k4+xV9hQRMjWe/DkU01+gmFhYoDvAzweuNQzx8lZ +bYKu0dGTEpTd+OG1LbxYmt4f5xh096R5iLo7c7e2kMHvfNG7VwvKQrPeMqh7AcKy +Fukt8C0Xc7Tfv2l2toEQUAl5UDUKEAovN6iB0qycpvi0nboyiDo8mV0p1jlAn846 +EeXjwm8tyGXzTFq16ypPwnlBM9d5Ml/p5WTN69nDux18G+iSCr+UDzLDYvLF11p3 +lEqpSo5lQg9zYuOgMCvu3g5BtwJgORPSiW/yZ5BXUfWvPi0XRPrknxMByA== -----END X509 CRL----- diff --git a/src/test/ssl/ssl/server_ca.crt b/src/test/ssl/ssl/server_ca.crt index 0d6d7a6f8284f..8b010e7ca48d0 100644 --- a/src/test/ssl/ssl/server_ca.crt +++ b/src/test/ssl/ssl/server_ca.crt @@ -1,19 +1,22 @@ -----BEGIN CERTIFICATE----- -MIIDFDCCAfygAwIBAgIIICEDAxQSBwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE +MIIDnjCCAoagAwIBAgIIICMHExY1IwAwDQYJKoZIhvcNAQELBQAwQDE+MDwGA1UE Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl -c3Qgc3VpdGUwHhcNMjEwMzAzMjIxMjA3WhcNNDgwNzE5MjIxMjA3WjBCMUAwPgYD -VQQDDDdUZXN0IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRlc3Qg -c2VydmVyIGNlcnRzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4kp2 -GW5nPb6QrSrtbClfZeutyQnHrm4TMPBoNepFdIVxBX/04BguM5ImDRze/huOWA+z -atJAQqt3R7dsDwnOnPKUKCOuHX6a1aj5L86HtVgaWTXrZFE5NtL9PIzXkWu13UW0 -UesHtbPVRv6a6fB7Npph6hHy7iPZb009A8/lTJnxSPC39u/K/sPqjrVZaAJF+wDs -qCxCZTUtAUFvWFnR/TeXLWlFzBupS1djgI7PltbJqSn6SKTAgNZTxpRJbu9Icp6J -/50ELwT++0n0KWVXNHrDNfI5Gaa+SxClAsPsei2jLKpgR6QFC3wn38Z9q9LjAVuC -+FWhoN1uhYeoricEXwIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQCdCA/EoXrustoV4jJGbkdXDuOUkBurwggSNBAqUBSDvCohRoD77Ecb -QVuzPNxWKG+E4PwfUq2ha+2yPONEJ28ZgsbHq5qlJDMJ43wlcjn6wmmAJNeSpO8F -0V9d2X/4wNZty9/zbwTnw26KChgDHumQ0WIbCoBtdqy8KDswYOvpgws6dqc021I7 -UrFo6vZek7VoApbJgkDL6qYADa6ApfW43ThH4sViFITeYt/kSHgmy2Udhs34jMM8 -xsFP/uYpRi1b1glenwSIKiHjD4/C9vnWQt5K3gRBvYukEj2Bw9VkNRpBVCi0cOoA -OuwX3bwzNYNbZQv4K66oRpvuoEjCNeHg +c3Qgc3VpdGUwIBcNMjMwNzEzMTQzNTIzWhgPMjA1MDExMjgxNDM1MjNaMEIxQDA+ +BgNVBAMMN1Rlc3QgQ0EgZm9yIFBvc3RncmVTUUwgU1NMIHJlZ3Jlc3Npb24gdGVz +dCBzZXJ2ZXIgY2VydHMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDi +SnYZbmc9vpCtKu1sKV9l663JCceubhMw8Gg16kV0hXEFf/TgGC4zkiYNHN7+G45Y +D7Nq0kBCq3dHt2wPCc6c8pQoI64dfprVqPkvzoe1WBpZNetkUTk20v08jNeRa7Xd +RbRR6we1s9VG/prp8Hs2mmHqEfLuI9lvTT0Dz+VMmfFI8Lf278r+w+qOtVloAkX7 +AOyoLEJlNS0BQW9YWdH9N5ctaUXMG6lLV2OAjs+W1smpKfpIpMCA1lPGlElu70hy +non/nQQvBP77SfQpZVc0esM18jkZpr5LEKUCw+x6LaMsqmBHpAULfCffxn2r0uMB +W4L4VaGg3W6Fh6iuJwRfAgMBAAGjgZcwgZQwDAYDVR0TBAUwAwEB/zAdBgNVHQ4E +FgQU8o86ZkBQZEgi1y6C/1aewrPudAowZQYDVR0jBF4wXKFEpEIwQDE+MDwGA1UE +Aww1VGVzdCByb290IENBIGZvciBQb3N0Z3JlU1FMIFNTTCByZWdyZXNzaW9uIHRl +c3Qgc3VpdGWCFBfnvJQgNLw9MyrcSA1T3Q2PyJIFMA0GCSqGSIb3DQEBCwUAA4IB +AQANlEDrM357a7o+WcKB0Ocll2UtBMq7PDms1Pjqm3fFu/wdKDUomG8W2/MgDmFl +CVeAPpofb6J0oaxiEZOR68pOhdccMznArtKix6t3RkDiXdm4d5UORMMR+s9CymXV +MUTWpQpAg3qP3mRI+3E9OrgfhvmVcuOa7/cdTS/sylGe8Db+nJQD0be9NHtnhO56 +IA+Li+8oWzD4UNsP3gAmhLkyToz5wlPHzEkgGxkEySNErEOKTOX5Xyk5z+QToRhz +adkt0mBw/dxoJk9DveCtIqxDelxJsDeJFtqoc5qVVE9yOp7rujGsqgWl2PcJeyKM +Crh9qsqNzJ2R29pq0g6Lfzh2 -----END CERTIFICATE----- diff --git a/src/test/ssl/sslfiles.mk b/src/test/ssl/sslfiles.mk index f7ababe42c923..88c93ec18d544 100644 --- a/src/test/ssl/sslfiles.mk +++ b/src/test/ssl/sslfiles.mk @@ -9,7 +9,7 @@ # The main Makefile in this directory defers to this helper file when # building the sslfiles-related targets. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/test/ssl/sslfiles.mk @@ -109,7 +109,7 @@ ssl/server-rsapss.crt: ssl/server-rsapss.key conf/server-rsapss.config # Password-protected version of server-cn-only.key ssl/server-password.key: ssl/server-cn-only.key - $(OPENSSL) rsa -aes256 -in $< -out $@ -passout 'pass:secret1' + $(OPENSSL) pkey -aes256 -in $< -out $@ -passout 'pass:secret1' # Key that uses the RSA-PSS algorithm ssl/server-rsapss.key: @@ -122,7 +122,7 @@ ssl/client-der.key: ssl/client.key # Convert client.key to encrypted PEM (X.509 text) and DER (X.509 ASN.1) # formats to test libpq's support for the sslpassword= option. ssl/client-encrypted-pem.key: ssl/client.key - $(OPENSSL) rsa -in $< -outform PEM -aes128 -passout 'pass:dUmmyP^#+' -out $@ + $(OPENSSL) pkey -in $< -outform PEM -aes128 -passout 'pass:dUmmyP^#+' -out $@ # TODO Explicitly choosing -aes128 generates a key unusable to PostgreSQL with # OpenSSL 3.0.0, so fall back on the default for now. ssl/client-encrypted-der.key: ssl/client.key @@ -269,6 +269,6 @@ sslfiles-clean: # clean targets will be run during a "standard" recursive clean run from the # main build tree. The sslfiles-clean target must be run explicitly from this # directory. -.PHONY: clean distclean maintainer-clean -clean distclean maintainer-clean: +.PHONY: clean distclean +clean distclean: rm -rf ssl/*.old ssl/new_certs_dir ssl/client*_tmp.key diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl index 76442de063f17..b8773270235ae 100644 --- a/src/test/ssl/t/001_ssltests.pl +++ b/src/test/ssl/t/001_ssltests.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use Config qw ( %Config ); use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; @@ -17,7 +17,7 @@ { plan skip_all => 'OpenSSL not supported by this build'; } -elsif ($ENV{PG_TEST_EXTRA} !~ /\bssl\b/) +elsif (!$ENV{PG_TEST_EXTRA} || $ENV{PG_TEST_EXTRA} !~ /\bssl\b/) { plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA'; @@ -85,10 +85,9 @@ sub switch_server_cert passphrase_cmd => 'echo wrongpassword', restart => 'no'); -command_fails( - [ 'pg_ctl', '-D', $node->data_dir, '-l', $node->logfile, 'restart' ], +$result = $node->restart(fail_ok => 1); +is($result, 0, 'restart fails with password-protected key file with wrong password'); -$node->_update_pid(0); switch_server_cert( $node, @@ -98,10 +97,8 @@ sub switch_server_cert passphrase_cmd => 'echo secret1', restart => 'no'); -command_ok( - [ 'pg_ctl', '-D', $node->data_dir, '-l', $node->logfile, 'restart' ], - 'restart succeeds with password-protected key file'); -$node->_update_pid(1); +$result = $node->restart(fail_ok => 1); +is($result, 1, 'restart succeeds with password-protected key file'); # Test compatibility of SSL protocols. # TLSv1.1 is lower than TLSv1.2, so it won't work. @@ -109,17 +106,16 @@ sub switch_server_cert 'postgresql.conf', qq{ssl_min_protocol_version='TLSv1.2' ssl_max_protocol_version='TLSv1.1'}); -command_fails( - [ 'pg_ctl', '-D', $node->data_dir, '-l', $node->logfile, 'restart' ], - 'restart fails with incorrect SSL protocol bounds'); +$result = $node->restart(fail_ok => 1); +is($result, 0, 'restart fails with incorrect SSL protocol bounds'); + # Go back to the defaults, this works. $node->append_conf( 'postgresql.conf', qq{ssl_min_protocol_version='TLSv1.2' ssl_max_protocol_version=''}); -command_ok( - [ 'pg_ctl', '-D', $node->data_dir, '-l', $node->logfile, 'restart' ], - 'restart succeeds with correct SSL protocol bounds'); +$result = $node->restart(fail_ok => 1); +is($result, 1, 'restart succeeds with correct SSL protocol bounds'); ### Run client-side tests. ### @@ -558,11 +554,11 @@ sub switch_server_cert $node->connect_fails( "$common_connstr sslrootcert=ssl/root+server_ca.crt sslmode=require ssl_min_protocol_version=incorrect_tls", "connection failure with an incorrect SSL protocol minimum bound", - expected_stderr => qr/invalid ssl_min_protocol_version value/); + expected_stderr => qr/invalid "ssl_min_protocol_version" value/); $node->connect_fails( "$common_connstr sslrootcert=ssl/root+server_ca.crt sslmode=require ssl_max_protocol_version=incorrect_tls", "connection failure with an incorrect SSL protocol maximum bound", - expected_stderr => qr/invalid ssl_max_protocol_version value/); + expected_stderr => qr/invalid "ssl_max_protocol_version" value/); ### Server-side tests. ### @@ -713,6 +709,8 @@ sub switch_server_cert # integer like how we do when grabbing the serial fails. if ($Config{ivsize} == 8) { + no warnings qw(portable); + $serialno =~ s/^serial=//; $serialno =~ s/\s+//g; $serialno = hex($serialno); @@ -781,7 +779,7 @@ sub switch_server_cert "$common_connstr user=ssltestuser sslcert=ssl/client-revoked.crt " . sslkey('client-revoked.key'), "certificate authorization fails with revoked client cert", - expected_stderr => qr/SSL error: sslv3 alert certificate revoked/, + expected_stderr => qr|SSL error: ssl[a-z0-9/]* alert certificate revoked|, # temporarily(?) skip this check due to timing issue # log_like => [ # qr{Client certificate verification failed at depth 0: certificate revoked}, @@ -800,8 +798,8 @@ sub switch_server_cert "$common_connstr user=ssltestuser sslcert=ssl/client.crt " . sslkey('client.key'), "auth_option clientcert=verify-full succeeds with matching username and Common Name", - # verify-full does not provide authentication - log_unlike => [qr/connection authenticated:/],); + log_like => + [qr/connection authenticated: user="ssltestuser" method=trust/],); $node->connect_fails( "$common_connstr user=anotheruser sslcert=ssl/client.crt " @@ -818,8 +816,8 @@ sub switch_server_cert "$common_connstr user=yetanotheruser sslcert=ssl/client.crt " . sslkey('client.key'), "auth_option clientcert=verify-ca succeeds with mismatching username and Common Name", - # verify-full does not provide authentication - log_unlike => [qr/connection authenticated:/],); + log_like => + [qr/connection authenticated: user="yetanotheruser" method=trust/],); # intermediate client_ca.crt is provided by client, and isn't in server's ssl_ca_file switch_server_cert($node, certfile => 'server-cn-only', cafile => 'root_ca'); @@ -886,7 +884,7 @@ sub switch_server_cert "$common_connstr user=ssltestuser sslcert=ssl/client-revoked.crt " . sslkey('client-revoked.key'), "certificate authorization fails with revoked client cert with server-side CRL directory", - expected_stderr => qr/SSL error: sslv3 alert certificate revoked/, + expected_stderr => qr|SSL error: ssl[a-z0-9/]* alert certificate revoked|, # temporarily(?) skip this check due to timing issue # log_like => [ # qr{Client certificate verification failed at depth 0: certificate revoked}, @@ -899,7 +897,7 @@ sub switch_server_cert "$common_connstr user=ssltestuser sslcert=ssl/client-revoked-utf8.crt " . sslkey('client-revoked-utf8.key'), "certificate authorization fails with revoked UTF-8 client cert with server-side CRL directory", - expected_stderr => qr/SSL error: sslv3 alert certificate revoked/, + expected_stderr => qr|SSL error: ssl[a-z0-9/]* alert certificate revoked|, # temporarily(?) skip this check due to timing issue # log_like => [ # qr{Client certificate verification failed at depth 0: certificate revoked}, diff --git a/src/test/ssl/t/002_scram.pl b/src/test/ssl/t/002_scram.pl index 28c54bdb09f43..dd9322412434f 100644 --- a/src/test/ssl/t/002_scram.pl +++ b/src/test/ssl/t/002_scram.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test SCRAM authentication and TLS channel binding types use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -20,7 +20,7 @@ { plan skip_all => 'OpenSSL not supported by this build'; } -elsif ($ENV{PG_TEST_EXTRA} !~ /\bssl\b/) +elsif (!$ENV{PG_TEST_EXTRA} || $ENV{PG_TEST_EXTRA} !~ /\bssl\b/) { plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA'; @@ -44,9 +44,6 @@ sub switch_server_cert # This is the pattern to use in pg_hba.conf to match incoming connections. my $SERVERHOSTCIDR = '127.0.0.1/32'; -# Determine whether build supports tls-server-end-point. -my $supports_tls_server_end_point = - check_pg_config("#define HAVE_X509_GET_SIGNATURE_NID 1"); # Determine whether build supports detection of hash algorithms for # RSA-PSS certificates. my $supports_rsapss_certs = @@ -67,6 +64,9 @@ sub switch_server_cert $ENV{PGPORT} = $node->port; $node->start; +# could fail in FIPS mode +my $md5_works = ($node->psql('postgres', "select md5('')") == 0); + # Configure server for SSL connections, with password handling. $ssl_server->configure_test_server_for_ssl( $node, $SERVERHOSTADDR, $SERVERHOSTCIDR, @@ -90,30 +90,21 @@ sub switch_server_cert expected_stderr => qr/invalid channel_binding value: "invalid_value"/); $node->connect_ok("$common_connstr user=ssltestuser channel_binding=disable", "SCRAM with SSL and channel_binding=disable"); -if ($supports_tls_server_end_point) -{ - $node->connect_ok( - "$common_connstr user=ssltestuser channel_binding=require", - "SCRAM with SSL and channel_binding=require"); -} -else +$node->connect_ok("$common_connstr user=ssltestuser channel_binding=require", + "SCRAM with SSL and channel_binding=require"); + +# Now test when the user has an MD5-encrypted password; should fail +SKIP: { + skip "MD5 not supported" unless $md5_works; $node->connect_fails( - "$common_connstr user=ssltestuser channel_binding=require", - "SCRAM with SSL and channel_binding=require", + "$common_connstr user=md5testuser channel_binding=require", + "MD5 with SSL and channel_binding=require", expected_stderr => - qr/channel binding is required, but server did not offer an authentication method that supports channel binding/ + qr/channel binding required but not supported by server's authentication request/ ); } -# Now test when the user has an MD5-encrypted password; should fail -$node->connect_fails( - "$common_connstr user=md5testuser channel_binding=require", - "MD5 with SSL and channel_binding=require", - expected_stderr => - qr/channel binding required but not supported by server's authentication request/ -); - # Now test with auth method 'cert' by connecting to 'certdb'. Should fail, # because channel binding is not performed. Note that ssl/client.key may # be used in a different test, so the name of this temporary client key @@ -146,28 +137,20 @@ sub switch_server_cert "$common_connstr user=ssltestuser channel_binding=disable require_auth=scram-sha-256", "SCRAM with SSL, channel_binding=disable, and require_auth=scram-sha-256" ); -$node->connect_fails( - "$common_connstr user=md5testuser require_auth=md5 channel_binding=require", - "channel_binding can fail even when require_auth succeeds", - expected_stderr => - qr/channel binding required but not supported by server's authentication request/ -); -if ($supports_tls_server_end_point) -{ - $node->connect_ok( - "$common_connstr user=ssltestuser channel_binding=require require_auth=scram-sha-256", - "SCRAM with SSL, channel_binding=require, and require_auth=scram-sha-256" - ); -} -else +SKIP: { + skip "MD5 not supported" unless $md5_works; $node->connect_fails( - "$common_connstr user=ssltestuser channel_binding=require require_auth=scram-sha-256", - "SCRAM with SSL, channel_binding=require, and require_auth=scram-sha-256", + "$common_connstr user=md5testuser require_auth=md5 channel_binding=require", + "channel_binding can fail even when require_auth succeeds", expected_stderr => - qr/channel binding is required, but server did not offer an authentication method that supports channel binding/ + qr/channel binding required but not supported by server's authentication request/ ); } +$node->connect_ok( + "$common_connstr user=ssltestuser channel_binding=require require_auth=scram-sha-256", + "SCRAM with SSL, channel_binding=require, and require_auth=scram-sha-256" +); # Now test with a server certificate that uses the RSA-PSS algorithm. # This checks that the certificate can be loaded and that channel binding diff --git a/src/test/ssl/t/003_sslinfo.pl b/src/test/ssl/t/003_sslinfo.pl index 5306aad8023d2..2ae5724846b1d 100644 --- a/src/test/ssl/t/003_sslinfo.pl +++ b/src/test/ssl/t/003_sslinfo.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -18,7 +18,7 @@ { plan skip_all => 'OpenSSL not supported by this build'; } -elsif ($ENV{PG_TEST_EXTRA} !~ /\bssl\b/) +elsif (!$ENV{PG_TEST_EXTRA} || $ENV{PG_TEST_EXTRA} !~ /\bssl\b/) { plan skip_all => 'Potentially unsafe test SSL not enabled in PG_TEST_EXTRA'; diff --git a/src/test/ssl/t/SSL/Backend/OpenSSL.pm b/src/test/ssl/t/SSL/Backend/OpenSSL.pm index a762f43634ffc..410b4b1a3f5a8 100644 --- a/src/test/ssl/t/SSL/Backend/OpenSSL.pm +++ b/src/test/ssl/t/SSL/Backend/OpenSSL.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group =pod @@ -25,7 +25,7 @@ for a PostgreSQL cluster compiled against OpenSSL. package SSL::Backend::OpenSSL; use strict; -use warnings; +use warnings FATAL => 'all'; use File::Basename; use File::Copy; diff --git a/src/test/ssl/t/SSL/Server.pm b/src/test/ssl/t/SSL/Server.pm index 2c5c0552227e8..021eec74abff0 100644 --- a/src/test/ssl/t/SSL/Server.pm +++ b/src/test/ssl/t/SSL/Server.pm @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group =pod @@ -64,12 +64,18 @@ specific infrastructure. Currently only OpenSSL is supported. package SSL::Server; use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; use SSL::Backend::OpenSSL; +# Force SSL tests nodes to begin in TCP mode. They won't work in Unix Socket +# mode and this way they will find a port to run on in a more robust way. +# Use an INIT block so it runs after the BEGIN block in Utils.pm. + +INIT { $PostgreSQL::Test::Utils::use_unix_sockets = 0; } + =pod =head1 METHODS @@ -191,7 +197,7 @@ sub configure_test_server_for_ssl } # enable logging etc. - open my $conf, '>>', "$pgdata/postgresql.conf"; + open my $conf, '>>', "$pgdata/postgresql.conf" or die $!; print $conf "fsync=off\n"; print $conf "log_connections=on\n"; print $conf "log_hostname=on\n"; @@ -204,7 +210,7 @@ sub configure_test_server_for_ssl close $conf; # SSL configuration will be placed here - open my $sslconf, '>', "$pgdata/sslconfig.conf"; + open my $sslconf, '>', "$pgdata/sslconfig.conf" or die $!; close $sslconf; # Perform backend specific configuration @@ -290,7 +296,7 @@ sub switch_server_cert my %params = @_; my $pgdata = $node->data_dir; - open my $sslconf, '>', "$pgdata/sslconfig.conf"; + open my $sslconf, '>', "$pgdata/sslconfig.conf" or die $!; print $sslconf "ssl=on\n"; print $sslconf $backend->set_server_cert(\%params); print $sslconf "ssl_passphrase_command='" @@ -315,7 +321,7 @@ sub _configure_hba_for_ssl # but seems best to keep it as narrow as possible for security reasons. # # When connecting to certdb, also check the client certificate. - open my $hba, '>', "$pgdata/pg_hba.conf"; + open my $hba, '>', "$pgdata/pg_hba.conf" or die $!; print $hba "# TYPE DATABASE USER ADDRESS METHOD OPTIONS\n"; print $hba @@ -337,7 +343,7 @@ sub _configure_hba_for_ssl close $hba; # Also set the ident maps. Note: fields with commas must be quoted - open my $map, ">", "$pgdata/pg_ident.conf"; + open my $map, ">", "$pgdata/pg_ident.conf" or die $!; print $map "# MAPNAME SYSTEM-USERNAME PG-USERNAME\n", "dn \"CN=ssltestuser-dn,OU=Testing,OU=Engineering,O=PGDG\" ssltestuser\n", diff --git a/src/test/subscription/Makefile b/src/test/subscription/Makefile index 99d1fe012d8e1..ce1ca4300957f 100644 --- a/src/test/subscription/Makefile +++ b/src/test/subscription/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/test/subscription # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/test/subscription/Makefile @@ -23,5 +23,5 @@ check: installcheck: $(prove_installcheck) -clean distclean maintainer-clean: +clean distclean: rm -rf tmp_check diff --git a/src/test/subscription/meson.build b/src/test/subscription/meson.build index bd673a9d68309..c591cd7d61991 100644 --- a/src/test/subscription/meson.build +++ b/src/test/subscription/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tests += { 'name': 'subscription', diff --git a/src/test/subscription/t/001_rep_changes.pl b/src/test/subscription/t/001_rep_changes.pl index 0a399cdb82b92..471e9819628f5 100644 --- a/src/test/subscription/t/001_rep_changes.pl +++ b/src/test/subscription/t/001_rep_changes.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Basic logical replication test use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -15,7 +15,7 @@ # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; # Create some preexisting content on publisher @@ -57,6 +57,11 @@ "CREATE INDEX idx_no_replidentity_index ON tab_no_replidentity_index(c1)" ); +# Replicate the changes without columns +$node_publisher->safe_psql('postgres', "CREATE TABLE tab_no_col()"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_no_col default VALUES"); + # Setup structure on subscriber $node_subscriber->safe_psql('postgres', "CREATE TABLE tab_notrep (a int)"); $node_subscriber->safe_psql('postgres', "CREATE TABLE tab_ins (a int)"); @@ -87,13 +92,16 @@ "CREATE INDEX idx_no_replidentity_index ON tab_no_replidentity_index(c1)" ); +# replication of the table without columns +$node_subscriber->safe_psql('postgres', "CREATE TABLE tab_no_col()"); + # Setup logical replication my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; $node_publisher->safe_psql('postgres', "CREATE PUBLICATION tap_pub"); $node_publisher->safe_psql('postgres', "CREATE PUBLICATION tap_pub_ins_only WITH (publish = insert)"); $node_publisher->safe_psql('postgres', - "ALTER PUBLICATION tap_pub ADD TABLE tab_rep, tab_full, tab_full2, tab_mixed, tab_include, tab_nothing, tab_full_pk, tab_no_replidentity_index" + "ALTER PUBLICATION tap_pub ADD TABLE tab_rep, tab_full, tab_full2, tab_mixed, tab_include, tab_nothing, tab_full_pk, tab_no_replidentity_index, tab_no_col" ); $node_publisher->safe_psql('postgres', "ALTER PUBLICATION tap_pub_ins_only ADD TABLE tab_ins"); @@ -141,6 +149,9 @@ $node_publisher->safe_psql('postgres', "INSERT INTO tab_no_replidentity_index VALUES(1)"); +$node_publisher->safe_psql('postgres', + "INSERT INTO tab_no_col default VALUES"); + $node_publisher->wait_for_catchup('tap_sub'); $result = $node_subscriber->safe_psql('postgres', @@ -169,6 +180,10 @@ 1, "value replicated to subscriber without replica identity index"); +$result = + $node_subscriber->safe_psql('postgres', "SELECT count(*) FROM tab_no_col"); +is($result, qq(2), 'check replicated changes for table having no columns'); + # insert some duplicate rows $node_publisher->safe_psql('postgres', "INSERT INTO tab_full SELECT generate_series(1,10)"); @@ -558,7 +573,7 @@ ROLLBACK; }); ok( $reterr =~ - m/WARNING: wal_level is insufficient to publish logical changes/, - 'CREATE PUBLICATION while wal_level=minimal'); + m/WARNING: "wal_level" is insufficient to publish logical changes/, + 'CREATE PUBLICATION while "wal_level=minimal"'); done_testing(); diff --git a/src/test/subscription/t/002_types.pl b/src/test/subscription/t/002_types.pl index 6b5853b80b667..08186e5246c48 100644 --- a/src/test/subscription/t/002_types.pl +++ b/src/test/subscription/t/002_types.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # This tests that more complex datatypes are replicated correctly # by logical replication use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -16,7 +16,7 @@ # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; # Create some preexisting content on publisher diff --git a/src/test/subscription/t/003_constraints.pl b/src/test/subscription/t/003_constraints.pl index 6e902360cc6bc..4f115eeaa3368 100644 --- a/src/test/subscription/t/003_constraints.pl +++ b/src/test/subscription/t/003_constraints.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # This test checks that constraints work on subscriber use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -15,7 +15,7 @@ # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; # Setup structure on publisher diff --git a/src/test/subscription/t/004_sync.pl b/src/test/subscription/t/004_sync.pl index aa7714c533b0c..a2d9462395ac7 100644 --- a/src/test/subscription/t/004_sync.pl +++ b/src/test/subscription/t/004_sync.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests for logical replication table syncing use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -15,7 +15,7 @@ # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->append_conf('postgresql.conf', "wal_retrieve_retry_interval = 1ms"); $node_subscriber->start; @@ -80,7 +80,7 @@ # wait for it to start $node_subscriber->poll_query_until('postgres', - "SELECT pid IS NOT NULL FROM pg_stat_subscription WHERE subname = 'tap_sub2' AND relid IS NULL" + "SELECT pid IS NOT NULL FROM pg_stat_subscription WHERE subname = 'tap_sub2' AND worker_type = 'apply'" ) or die "Timed out while waiting for subscriber to start"; # and drop both subscriptions @@ -156,7 +156,7 @@ "CREATE SUBSCRIPTION tap_sub CONNECTION '$publisher_connstr' PUBLICATION tap_pub" ); -$result = $node_subscriber->poll_query_until('postgres', $started_query) +$node_subscriber->poll_query_until('postgres', $started_query) or die "Timed out while waiting for subscriber to start sync"; # DROP SUBSCRIPTION must clean up slots on the publisher side when the @@ -165,7 +165,7 @@ # When DROP SUBSCRIPTION tries to drop the tablesync slot, the slot may not # have been created, which causes the slot to be created after the DROP -# SUSCRIPTION finishes. Such slots eventually get dropped at walsender exit +# SUBSCRIPTION finishes. Such slots eventually get dropped at walsender exit # time. So, to prevent being affected by such ephemeral tablesync slots, we # wait until all the slots have been cleaned. ok( $node_publisher->poll_query_until( diff --git a/src/test/subscription/t/005_encoding.pl b/src/test/subscription/t/005_encoding.pl index 2f0bf7730b96a..38e3e0f0bce43 100644 --- a/src/test/subscription/t/005_encoding.pl +++ b/src/test/subscription/t/005_encoding.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test replication between databases with different encodings use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -15,9 +15,7 @@ $node_publisher->start; my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init( - allows_streaming => 'logical', - extra => [ '--locale=C', '--encoding=LATIN1' ]); +$node_subscriber->init(extra => [ '--locale=C', '--encoding=LATIN1' ]); $node_subscriber->start; my $ddl = "CREATE TABLE test1 (a int, b text);"; diff --git a/src/test/subscription/t/006_rewrite.pl b/src/test/subscription/t/006_rewrite.pl index 8bc7e872d9b24..af464c306dd47 100644 --- a/src/test/subscription/t/006_rewrite.pl +++ b/src/test/subscription/t/006_rewrite.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test logical replication behavior with heap rewrites use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -13,7 +13,7 @@ $node_publisher->start; my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; my $ddl = "CREATE TABLE test1 (a int, b text);"; diff --git a/src/test/subscription/t/007_ddl.pl b/src/test/subscription/t/007_ddl.pl index cbdb5b66e469f..7ab51d6343dda 100644 --- a/src/test/subscription/t/007_ddl.pl +++ b/src/test/subscription/t/007_ddl.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test some logical replication DDL behavior use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -13,7 +13,7 @@ $node_publisher->start; my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; my $ddl = "CREATE TABLE test1 (a int, b text);"; diff --git a/src/test/subscription/t/008_diff_schema.pl b/src/test/subscription/t/008_diff_schema.pl index 67db1ebd3cdbf..cf04f85584aad 100644 --- a/src/test/subscription/t/008_diff_schema.pl +++ b/src/test/subscription/t/008_diff_schema.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test behavior with different schema on subscriber use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -15,7 +15,7 @@ # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; # Create some preexisting content on publisher @@ -48,7 +48,8 @@ # Update the rows on the publisher and check the additional columns on # subscriber didn't change -$node_publisher->safe_psql('postgres', "UPDATE test_tab SET b = md5(b)"); +$node_publisher->safe_psql('postgres', + "UPDATE test_tab SET b = encode(sha256(b::bytea), 'hex')"); $node_publisher->wait_for_catchup('tap_sub'); @@ -65,7 +66,7 @@ "UPDATE test_tab SET c = 'epoch'::timestamptz + 987654321 * interval '1s'" ); $node_publisher->safe_psql('postgres', - "UPDATE test_tab SET b = md5(a::text)"); + "UPDATE test_tab SET b = encode(sha256(a::text::bytea), 'hex')"); $node_publisher->wait_for_catchup('tap_sub'); diff --git a/src/test/subscription/t/009_matviews.pl b/src/test/subscription/t/009_matviews.pl index 38080b4313206..40f65d4f5d918 100644 --- a/src/test/subscription/t/009_matviews.pl +++ b/src/test/subscription/t/009_matviews.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test materialized views behavior use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -13,7 +13,7 @@ $node_publisher->start; my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; diff --git a/src/test/subscription/t/010_truncate.pl b/src/test/subscription/t/010_truncate.pl index a5b64453924bb..e41e1a8db7f26 100644 --- a/src/test/subscription/t/010_truncate.pl +++ b/src/test/subscription/t/010_truncate.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test TRUNCATE use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -15,7 +15,7 @@ $node_publisher->start; my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->append_conf('postgresql.conf', qq(max_logical_replication_workers = 6)); $node_subscriber->start; diff --git a/src/test/subscription/t/011_generated.pl b/src/test/subscription/t/011_generated.pl index 7711be295a0d5..8b2e5f4708eb2 100644 --- a/src/test/subscription/t/011_generated.pl +++ b/src/test/subscription/t/011_generated.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test generated columns use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -15,7 +15,7 @@ $node_publisher->start; my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; diff --git a/src/test/subscription/t/012_collation.pl b/src/test/subscription/t/012_collation.pl index 823550a31b530..fbfee3504c327 100644 --- a/src/test/subscription/t/012_collation.pl +++ b/src/test/subscription/t/012_collation.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test collations, in particular nondeterministic ones # (only works with ICU) use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -21,9 +21,7 @@ $node_publisher->start; my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init( - allows_streaming => 'logical', - extra => [ '--locale=C', '--encoding=UTF8' ]); +$node_subscriber->init(extra => [ '--locale=C', '--encoding=UTF8' ]); $node_subscriber->start; my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; diff --git a/src/test/subscription/t/013_partition.pl b/src/test/subscription/t/013_partition.pl index 275fb3b525721..db7a1604643b7 100644 --- a/src/test/subscription/t/013_partition.pl +++ b/src/test/subscription/t/013_partition.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test logical replication with partitioned tables use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -15,11 +15,11 @@ $node_publisher->start; my $node_subscriber1 = PostgreSQL::Test::Cluster->new('subscriber1'); -$node_subscriber1->init(allows_streaming => 'logical'); +$node_subscriber1->init; $node_subscriber1->start; my $node_subscriber2 = PostgreSQL::Test::Cluster->new('subscriber2'); -$node_subscriber2->init(allows_streaming => 'logical'); +$node_subscriber2->init; $node_subscriber2->start; my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; @@ -49,6 +49,10 @@ $node_subscriber1->safe_psql('postgres', "CREATE TABLE tab1 (c text, a int PRIMARY KEY, b text) PARTITION BY LIST (a)" ); +# make a BRIN index to test aminsertcleanup logic in subscriber +$node_subscriber1->safe_psql('postgres', + "CREATE INDEX tab1_c_brin_idx ON tab1 USING brin (c)" +); $node_subscriber1->safe_psql('postgres', "CREATE TABLE tab1_1 (b text, c text DEFAULT 'sub1_tab1', a int NOT NULL)" ); diff --git a/src/test/subscription/t/014_binary.pl b/src/test/subscription/t/014_binary.pl index e5ce849c191aa..a7598f12fb82c 100644 --- a/src/test/subscription/t/014_binary.pl +++ b/src/test/subscription/t/014_binary.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Binary mode logical replication test use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -16,7 +16,7 @@ # Create and initialize subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; # Create tables on both sides of the replication diff --git a/src/test/subscription/t/015_stream.pl b/src/test/subscription/t/015_stream.pl index 5c00711ef2d6e..5b9956681d63d 100644 --- a/src/test/subscription/t/015_stream.pl +++ b/src/test/subscription/t/015_stream.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test streaming of simple large transaction use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -38,15 +38,15 @@ sub test_streaming $h->query_safe( q{ BEGIN; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5000) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(3, 5000) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; }); $node_publisher->safe_psql( 'postgres', q{ BEGIN; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(5001, 9999) s(i); + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(5001, 9999) s(i); DELETE FROM test_tab WHERE a > 5000; COMMIT; }); @@ -76,8 +76,8 @@ sub test_streaming $node_publisher->safe_psql( 'postgres', q{ BEGIN; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(5001, 10000) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(5001, 10000) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; COMMIT; }); @@ -104,7 +104,7 @@ sub test_streaming $offset = -s $node_subscriber->logfile; $node_publisher->safe_psql('postgres', - "UPDATE test_tab SET b = md5(a::text)"); + "UPDATE test_tab SET b = sha256(a::text::bytea)"); $node_publisher->wait_for_catchup($appname); @@ -131,12 +131,12 @@ sub test_streaming # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; # Create some preexisting content on publisher $node_publisher->safe_psql('postgres', - "CREATE TABLE test_tab (a int primary key, b varchar)"); + "CREATE TABLE test_tab (a int primary key, b bytea)"); $node_publisher->safe_psql('postgres', "INSERT INTO test_tab VALUES (1, 'foo'), (2, 'bar')"); @@ -144,7 +144,7 @@ sub test_streaming # Setup structure on subscriber $node_subscriber->safe_psql('postgres', - "CREATE TABLE test_tab (a int primary key, b text, c timestamptz DEFAULT now(), d bigint DEFAULT 999)" + "CREATE TABLE test_tab (a int primary key, b bytea, c timestamptz DEFAULT now(), d bigint DEFAULT 999)" ); $node_subscriber->safe_psql('postgres', "CREATE TABLE test_tab_2 (a int)"); @@ -295,7 +295,7 @@ sub test_streaming # Test serializing changes to files and notify the parallel apply worker to # apply them at the end of the transaction. $node_subscriber->append_conf('postgresql.conf', - 'logical_replication_mode = immediate'); + 'debug_logical_replication_streaming = immediate'); # Reset the log_min_messages to default. $node_subscriber->append_conf('postgresql.conf', "log_min_messages = warning"); diff --git a/src/test/subscription/t/016_stream_subxact.pl b/src/test/subscription/t/016_stream_subxact.pl index d830f26e06f4b..edcf17aef380d 100644 --- a/src/test/subscription/t/016_stream_subxact.pl +++ b/src/test/subscription/t/016_stream_subxact.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test streaming of transaction containing subtransactions use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -36,24 +36,24 @@ sub test_streaming $node_publisher->safe_psql( 'postgres', q{ BEGIN; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(3, 5) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; SAVEPOINT s1; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(6, 8) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(6, 8) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; SAVEPOINT s2; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(9, 11) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(9, 11) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; SAVEPOINT s3; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(12, 14) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(12, 14) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; SAVEPOINT s4; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(15, 17) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(15, 17) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; COMMIT; }); @@ -79,23 +79,23 @@ sub test_streaming my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->append_conf('postgresql.conf', - 'logical_replication_mode = immediate'); + 'debug_logical_replication_streaming = immediate'); $node_publisher->start; # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; # Create some preexisting content on publisher $node_publisher->safe_psql('postgres', - "CREATE TABLE test_tab (a int primary key, b varchar)"); + "CREATE TABLE test_tab (a int primary key, b bytea)"); $node_publisher->safe_psql('postgres', "INSERT INTO test_tab VALUES (1, 'foo'), (2, 'bar')"); # Setup structure on subscriber $node_subscriber->safe_psql('postgres', - "CREATE TABLE test_tab (a int primary key, b text, c timestamptz DEFAULT now(), d bigint DEFAULT 999)" + "CREATE TABLE test_tab (a int primary key, b bytea, c timestamptz DEFAULT now(), d bigint DEFAULT 999)" ); # Setup logical replication diff --git a/src/test/subscription/t/017_stream_ddl.pl b/src/test/subscription/t/017_stream_ddl.pl index 626676a383b3a..e6571b26380ab 100644 --- a/src/test/subscription/t/017_stream_ddl.pl +++ b/src/test/subscription/t/017_stream_ddl.pl @@ -1,12 +1,12 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test streaming of large transaction with DDL and subtransactions # # This file is mainly to test the DDL/DML interaction of the publisher side, # so we didn't add a parallel apply version for the tests in this file. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -20,7 +20,7 @@ # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; # Create some preexisting content on publisher @@ -31,7 +31,7 @@ # Setup structure on subscriber $node_subscriber->safe_psql('postgres', - "CREATE TABLE test_tab (a int primary key, b text, c INT, d INT, e INT, f INT)" + "CREATE TABLE test_tab (a int primary key, b bytea, c INT, d INT, e INT, f INT)" ); # Setup logical replication @@ -56,10 +56,10 @@ $node_publisher->safe_psql( 'postgres', q{ BEGIN; -INSERT INTO test_tab VALUES (3, md5(3::text)); +INSERT INTO test_tab VALUES (3, sha256(3::text::bytea)); ALTER TABLE test_tab ADD COLUMN c INT; SAVEPOINT s1; -INSERT INTO test_tab VALUES (4, md5(4::text), -4); +INSERT INTO test_tab VALUES (4, sha256(4::text::bytea), -4); COMMIT; }); @@ -67,10 +67,10 @@ $node_publisher->safe_psql( 'postgres', q{ BEGIN; -INSERT INTO test_tab SELECT i, md5(i::text), -i FROM generate_series(5, 1000) s(i); +INSERT INTO test_tab SELECT i, sha256(i::text::bytea), -i FROM generate_series(5, 1000) s(i); ALTER TABLE test_tab ADD COLUMN d INT; SAVEPOINT s1; -INSERT INTO test_tab SELECT i, md5(i::text), -i, 2*i FROM generate_series(1001, 2000) s(i); +INSERT INTO test_tab SELECT i, sha256(i::text::bytea), -i, 2*i FROM generate_series(1001, 2000) s(i); COMMIT; }); @@ -78,10 +78,10 @@ $node_publisher->safe_psql( 'postgres', q{ BEGIN; -INSERT INTO test_tab VALUES (2001, md5(2001::text), -2001, 2*2001); +INSERT INTO test_tab VALUES (2001, sha256(2001::text::bytea), -2001, 2*2001); ALTER TABLE test_tab ADD COLUMN e INT; SAVEPOINT s1; -INSERT INTO test_tab VALUES (2002, md5(2002::text), -2002, 2*2002, -3*2002); +INSERT INTO test_tab VALUES (2002, sha256(2002::text::bytea), -2002, 2*2002, -3*2002); COMMIT; }); @@ -100,7 +100,7 @@ $node_publisher->safe_psql( 'postgres', q{ BEGIN; -INSERT INTO test_tab SELECT i, md5(i::text), -i, 2*i, -3*i FROM generate_series(2003,5000) s(i); +INSERT INTO test_tab SELECT i, sha256(i::text::bytea), -i, 2*i, -3*i FROM generate_series(2003,5000) s(i); ALTER TABLE test_tab ADD COLUMN f INT; COMMIT; }); @@ -110,7 +110,7 @@ $node_publisher->safe_psql( 'postgres', q{ BEGIN; -INSERT INTO test_tab SELECT i, md5(i::text), -i, 2*i, -3*i, 4*i FROM generate_series(5001,5005) s(i); +INSERT INTO test_tab SELECT i, sha256(i::text::bytea), -i, 2*i, -3*i, 4*i FROM generate_series(5001,5005) s(i); COMMIT; }); diff --git a/src/test/subscription/t/018_stream_subxact_abort.pl b/src/test/subscription/t/018_stream_subxact_abort.pl index 91d19ae672ad7..e38050b9e6ff9 100644 --- a/src/test/subscription/t/018_stream_subxact_abort.pl +++ b/src/test/subscription/t/018_stream_subxact_abort.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test streaming of transaction containing multiple subtransactions and rollbacks use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -36,21 +36,21 @@ sub test_streaming $node_publisher->safe_psql( 'postgres', q{ BEGIN; - INSERT INTO test_tab VALUES (3, md5(3::text)); + INSERT INTO test_tab VALUES (3, sha256(3::text::bytea)); SAVEPOINT s1; - INSERT INTO test_tab VALUES (4, md5(4::text)); + INSERT INTO test_tab VALUES (4, sha256(4::text::bytea)); SAVEPOINT s2; - INSERT INTO test_tab VALUES (5, md5(5::text)); + INSERT INTO test_tab VALUES (5, sha256(5::text::bytea)); SAVEPOINT s3; - INSERT INTO test_tab VALUES (6, md5(6::text)); + INSERT INTO test_tab VALUES (6, sha256(6::text::bytea)); ROLLBACK TO s2; - INSERT INTO test_tab VALUES (7, md5(7::text)); + INSERT INTO test_tab VALUES (7, sha256(7::text::bytea)); ROLLBACK TO s1; - INSERT INTO test_tab VALUES (8, md5(8::text)); + INSERT INTO test_tab VALUES (8, sha256(8::text::bytea)); SAVEPOINT s4; - INSERT INTO test_tab VALUES (9, md5(9::text)); + INSERT INTO test_tab VALUES (9, sha256(9::text::bytea)); SAVEPOINT s5; - INSERT INTO test_tab VALUES (10, md5(10::text)); + INSERT INTO test_tab VALUES (10, sha256(10::text::bytea)); COMMIT; }); @@ -73,15 +73,15 @@ sub test_streaming $node_publisher->safe_psql( 'postgres', q{ BEGIN; - INSERT INTO test_tab VALUES (11, md5(11::text)); + INSERT INTO test_tab VALUES (11, sha256(11::text::bytea)); SAVEPOINT s1; - INSERT INTO test_tab VALUES (12, md5(12::text)); + INSERT INTO test_tab VALUES (12, sha256(12::text::bytea)); SAVEPOINT s2; - INSERT INTO test_tab VALUES (13, md5(13::text)); + INSERT INTO test_tab VALUES (13, sha256(13::text::bytea)); SAVEPOINT s3; - INSERT INTO test_tab VALUES (14, md5(14::text)); + INSERT INTO test_tab VALUES (14, sha256(14::text::bytea)); RELEASE s2; - INSERT INTO test_tab VALUES (15, md5(15::text)); + INSERT INTO test_tab VALUES (15, sha256(15::text::bytea)); ROLLBACK TO s1; COMMIT; }); @@ -103,11 +103,11 @@ sub test_streaming $node_publisher->safe_psql( 'postgres', q{ BEGIN; - INSERT INTO test_tab VALUES (16, md5(16::text)); + INSERT INTO test_tab VALUES (16, sha256(16::text::bytea)); SAVEPOINT s1; - INSERT INTO test_tab VALUES (17, md5(17::text)); + INSERT INTO test_tab VALUES (17, sha256(17::text::bytea)); SAVEPOINT s2; - INSERT INTO test_tab VALUES (18, md5(18::text)); + INSERT INTO test_tab VALUES (18, sha256(18::text::bytea)); ROLLBACK; }); @@ -130,17 +130,17 @@ sub test_streaming my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->append_conf('postgresql.conf', - 'logical_replication_mode = immediate'); + 'debug_logical_replication_streaming = immediate'); $node_publisher->start; # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; # Create some preexisting content on publisher $node_publisher->safe_psql('postgres', - "CREATE TABLE test_tab (a int primary key, b varchar)"); + "CREATE TABLE test_tab (a int primary key, b bytea)"); $node_publisher->safe_psql('postgres', "INSERT INTO test_tab VALUES (1, 'foo'), (2, 'bar')"); $node_publisher->safe_psql('postgres', "CREATE TABLE test_tab_2 (a int)"); @@ -203,7 +203,7 @@ sub test_streaming # Test serializing changes to files and notify the parallel apply worker to # apply them at the end of the transaction. $node_subscriber->append_conf('postgresql.conf', - 'logical_replication_mode = immediate'); + 'debug_logical_replication_streaming = immediate'); # Reset the log_min_messages to default. $node_subscriber->append_conf('postgresql.conf', "log_min_messages = warning"); diff --git a/src/test/subscription/t/019_stream_subxact_ddl_abort.pl b/src/test/subscription/t/019_stream_subxact_ddl_abort.pl index d0e556c8b8307..84c0e5ca9ef0f 100644 --- a/src/test/subscription/t/019_stream_subxact_ddl_abort.pl +++ b/src/test/subscription/t/019_stream_subxact_ddl_abort.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test streaming of transaction with subtransactions, DDLs, DMLs, and # rollbacks @@ -7,7 +7,7 @@ # This file is mainly to test the DDL/DML interaction of the publisher side, # so we didn't add a parallel apply version for the tests in this file. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -16,23 +16,24 @@ my $node_publisher = PostgreSQL::Test::Cluster->new('publisher'); $node_publisher->init(allows_streaming => 'logical'); $node_publisher->append_conf('postgresql.conf', - 'logical_replication_mode = immediate'); + 'debug_logical_replication_streaming = immediate'); $node_publisher->start; # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; # Create some preexisting content on publisher $node_publisher->safe_psql('postgres', - "CREATE TABLE test_tab (a int primary key, b varchar)"); + "CREATE TABLE test_tab (a int primary key, b bytea)"); $node_publisher->safe_psql('postgres', "INSERT INTO test_tab VALUES (1, 'foo'), (2, 'bar')"); # Setup structure on subscriber $node_subscriber->safe_psql('postgres', - "CREATE TABLE test_tab (a int primary key, b text, c INT, d INT, e INT)"); + "CREATE TABLE test_tab (a int primary key, b bytea, c INT, d INT, e INT)" +); # Setup logical replication my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; @@ -56,19 +57,19 @@ $node_publisher->safe_psql( 'postgres', q{ BEGIN; -INSERT INTO test_tab VALUES (3, md5(3::text)); +INSERT INTO test_tab VALUES (3, sha256(3::text::bytea)); ALTER TABLE test_tab ADD COLUMN c INT; SAVEPOINT s1; -INSERT INTO test_tab VALUES (4, md5(4::text), -4); +INSERT INTO test_tab VALUES (4, sha256(4::text::bytea), -4); ALTER TABLE test_tab ADD COLUMN d INT; SAVEPOINT s2; -INSERT INTO test_tab VALUES (5, md5(5::text), -5, 5*2); +INSERT INTO test_tab VALUES (5, sha256(5::text::bytea), -5, 5*2); ALTER TABLE test_tab ADD COLUMN e INT; SAVEPOINT s3; -INSERT INTO test_tab VALUES (6, md5(6::text), -6, 6*2, -6*3); +INSERT INTO test_tab VALUES (6, sha256(6::text::bytea), -6, 6*2, -6*3); ALTER TABLE test_tab DROP COLUMN c; ROLLBACK TO s1; -INSERT INTO test_tab VALUES (4, md5(4::text), 4); +INSERT INTO test_tab VALUES (4, sha256(4::text::bytea), 4); COMMIT; }); diff --git a/src/test/subscription/t/020_messages.pl b/src/test/subscription/t/020_messages.pl index 826d39cd89a56..9736cb95b48dc 100644 --- a/src/test/subscription/t/020_messages.pl +++ b/src/test/subscription/t/020_messages.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests that logical decoding messages use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -16,7 +16,7 @@ # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; # Create some preexisting content on publisher diff --git a/src/test/subscription/t/021_twophase.pl b/src/test/subscription/t/021_twophase.pl index 8ce4cfc983ca4..e635be74c63f3 100644 --- a/src/test/subscription/t/021_twophase.pl +++ b/src/test/subscription/t/021_twophase.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # logical replication of 2PC test use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -21,9 +21,9 @@ # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->append_conf('postgresql.conf', - qq(max_prepared_transactions = 10)); + qq(max_prepared_transactions = 0)); $node_subscriber->start; # Create some pre-existing content on publisher @@ -67,12 +67,24 @@ # then COMMIT PREPARED ############################### +# Save the log location, to see the failure of the application +my $log_location = -s $node_subscriber->logfile; + $node_publisher->safe_psql( 'postgres', " BEGIN; INSERT INTO tab_full VALUES (11); PREPARE TRANSACTION 'test_prepared_tab_full';"); +# Confirm the ERROR is reported becasue max_prepared_transactions is zero +$node_subscriber->wait_for_log( + qr/ERROR: ( [A-Z0-9]+:)? prepared transactions are disabled/); + +# Set max_prepared_transactions to correct value to resume the replication +$node_subscriber->append_conf('postgresql.conf', + qq(max_prepared_transactions = 10)); +$node_subscriber->restart; + $node_publisher->wait_for_catchup($appname); # check that transaction is in prepared state on subscriber diff --git a/src/test/subscription/t/022_twophase_cascade.pl b/src/test/subscription/t/022_twophase_cascade.pl index e624ebe55c600..1acc79f17e5b0 100644 --- a/src/test/subscription/t/022_twophase_cascade.pl +++ b/src/test/subscription/t/022_twophase_cascade.pl @@ -1,5 +1,5 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test cascading logical replication of 2PC. # @@ -8,7 +8,7 @@ # Two-phase and parallel apply will be tested in 023_twophase_stream, so we # didn't add a parallel apply version for the tests in this file. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -39,7 +39,7 @@ $node_B->start; # node_C my $node_C = PostgreSQL::Test::Cluster->new('node_C'); -$node_C->init(allows_streaming => 'logical'); +$node_C->init; $node_C->append_conf( 'postgresql.conf', qq( max_prepared_transactions = 10 @@ -59,17 +59,17 @@ # Create some pre-existing content on node_A (for streaming tests) $node_A->safe_psql('postgres', - "CREATE TABLE test_tab (a int primary key, b varchar)"); + "CREATE TABLE test_tab (a int primary key, b bytea)"); $node_A->safe_psql('postgres', "INSERT INTO test_tab VALUES (1, 'foo'), (2, 'bar')"); # Create the same tables on node_B and node_C # columns a and b are compatible with same table name on node_A $node_B->safe_psql('postgres', - "CREATE TABLE test_tab (a int primary key, b text, c timestamptz DEFAULT now(), d bigint DEFAULT 999)" + "CREATE TABLE test_tab (a int primary key, b bytea, c timestamptz DEFAULT now(), d bigint DEFAULT 999)" ); $node_C->safe_psql('postgres', - "CREATE TABLE test_tab (a int primary key, b text, c timestamptz DEFAULT now(), d bigint DEFAULT 999)" + "CREATE TABLE test_tab (a int primary key, b bytea, c timestamptz DEFAULT now(), d bigint DEFAULT 999)" ); # Setup logical replication @@ -308,8 +308,8 @@ $node_A->safe_psql( 'postgres', q{ BEGIN; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5000) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(3, 5000) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; PREPARE TRANSACTION 'test_prepared_tab';}); @@ -371,8 +371,8 @@ BEGIN; INSERT INTO test_tab VALUES (9999, 'foobar'); SAVEPOINT sp_inner; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5000) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(3, 5000) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; ROLLBACK TO SAVEPOINT sp_inner; PREPARE TRANSACTION 'outer'; diff --git a/src/test/subscription/t/023_twophase_stream.pl b/src/test/subscription/t/023_twophase_stream.pl index fdcc4b359d2ae..23c762e8adf7a 100644 --- a/src/test/subscription/t/023_twophase_stream.pl +++ b/src/test/subscription/t/023_twophase_stream.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test logical replication of 2PC with streaming. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -45,8 +45,8 @@ sub test_streaming $node_publisher->safe_psql( 'postgres', q{ BEGIN; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(3, 5) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; PREPARE TRANSACTION 'test_prepared_tab';}); @@ -95,8 +95,8 @@ sub test_streaming $node_publisher->safe_psql( 'postgres', q{ BEGIN; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(3, 5) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; PREPARE TRANSACTION 'test_prepared_tab';}); @@ -142,8 +142,8 @@ sub test_streaming $node_publisher->safe_psql( 'postgres', q{ BEGIN; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(3, 5) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; PREPARE TRANSACTION 'test_prepared_tab';}); @@ -191,8 +191,8 @@ sub test_streaming $node_publisher->safe_psql( 'postgres', q{ BEGIN; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(3, 5) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; PREPARE TRANSACTION 'test_prepared_tab';}); @@ -249,8 +249,8 @@ sub test_streaming $node_publisher->safe_psql( 'postgres', q{ BEGIN; - INSERT INTO test_tab SELECT i, md5(i::text) FROM generate_series(3, 5) s(i); - UPDATE test_tab SET b = md5(b) WHERE mod(a,2) = 0; + INSERT INTO test_tab SELECT i, sha256(i::text::bytea) FROM generate_series(3, 5) s(i); + UPDATE test_tab SET b = sha256(b) WHERE mod(a,2) = 0; DELETE FROM test_tab WHERE mod(a,3) = 0; PREPARE TRANSACTION 'test_prepared_tab';}); @@ -301,13 +301,13 @@ sub test_streaming $node_publisher->append_conf( 'postgresql.conf', qq( max_prepared_transactions = 10 -logical_replication_mode = immediate +debug_logical_replication_streaming = immediate )); $node_publisher->start; # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->append_conf( 'postgresql.conf', qq( max_prepared_transactions = 10 @@ -316,14 +316,14 @@ sub test_streaming # Create some pre-existing content on publisher $node_publisher->safe_psql('postgres', - "CREATE TABLE test_tab (a int primary key, b varchar)"); + "CREATE TABLE test_tab (a int primary key, b bytea)"); $node_publisher->safe_psql('postgres', "INSERT INTO test_tab VALUES (1, 'foo'), (2, 'bar')"); $node_publisher->safe_psql('postgres', "CREATE TABLE test_tab_2 (a int)"); # Setup structure on subscriber (columns a and b are compatible with same table name on publisher) $node_subscriber->safe_psql('postgres', - "CREATE TABLE test_tab (a int primary key, b text, c timestamptz DEFAULT now(), d bigint DEFAULT 999)" + "CREATE TABLE test_tab (a int primary key, b bytea, c timestamptz DEFAULT now(), d bigint DEFAULT 999)" ); $node_subscriber->safe_psql('postgres', "CREATE TABLE test_tab_2 (a int)"); @@ -389,7 +389,7 @@ sub test_streaming # Test serializing changes to files and notify the parallel apply worker to # apply them at the end of the transaction. $node_subscriber->append_conf('postgresql.conf', - 'logical_replication_mode = immediate'); + 'debug_logical_replication_streaming = immediate'); # Reset the log_min_messages to default. $node_subscriber->append_conf('postgresql.conf', "log_min_messages = warning"); diff --git a/src/test/subscription/t/024_add_drop_pub.pl b/src/test/subscription/t/024_add_drop_pub.pl index 8614b1b5b34d4..c0d7ffcb6b8d5 100644 --- a/src/test/subscription/t/024_add_drop_pub.pl +++ b/src/test/subscription/t/024_add_drop_pub.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # This test checks behaviour of ALTER SUBSCRIPTION ... ADD/DROP PUBLICATION use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -15,7 +15,7 @@ # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; # Create table on publisher @@ -63,7 +63,7 @@ # Wait for initial table sync to finish $node_subscriber->wait_for_subscription_sync($node_publisher, 'tap_sub'); -# Check the initial data of tab_drop_refresh was copied to subscriber +# Check the initial data of tab_2 was copied to subscriber $result = $node_subscriber->safe_psql('postgres', "SELECT count(*), min(a), max(a) FROM tab_2"); is($result, qq(10|1|10), 'check initial data is copied to subscriber'); diff --git a/src/test/subscription/t/025_rep_changes_for_schema.pl b/src/test/subscription/t/025_rep_changes_for_schema.pl index 8543f52710ccd..2258fe96b1b81 100644 --- a/src/test/subscription/t/025_rep_changes_for_schema.pl +++ b/src/test/subscription/t/025_rep_changes_for_schema.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Logical replication tests for schema publications use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -15,7 +15,7 @@ # Create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; # Test replication with publications created using FOR TABLES IN SCHEMA diff --git a/src/test/subscription/t/026_stats.pl b/src/test/subscription/t/026_stats.pl index 45e51c5a52c6c..fb3e5629b3c43 100644 --- a/src/test/subscription/t/026_stats.pl +++ b/src/test/subscription/t/026_stats.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests for subscription stats. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -15,7 +15,7 @@ # Create subscriber node. my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; @@ -267,6 +267,33 @@ sub create_sub_pub_w_errors qq(f), qq(Subscription stats for subscription '$sub1_name' should be removed.)); +# Get subscription 2 oid +my $sub2_oid = $node_subscriber->safe_psql($db, + qq(SELECT oid FROM pg_subscription WHERE subname = '$sub2_name')); + +# Disassociate the subscription 2 from its replication slot and drop it +$node_subscriber->safe_psql( + $db, + qq( +ALTER SUBSCRIPTION $sub2_name DISABLE; +ALTER SUBSCRIPTION $sub2_name SET (slot_name = NONE); +DROP SUBSCRIPTION $sub2_name; + )); + +# Subscription stats for sub2 should be gone +is( $node_subscriber->safe_psql( + $db, qq(SELECT pg_stat_have_stats('subscription', 0, $sub2_oid))), + qq(f), + qq(Subscription stats for subscription '$sub2_name' should be removed.)); + +# Since disabling subscription doesn't wait for walsender to release the replication +# slot and exit, wait for the slot to become inactive. +$node_publisher->poll_query_until($db, + qq(SELECT EXISTS (SELECT 1 FROM pg_replication_slots WHERE slot_name = '$sub2_name' AND active_pid IS NULL)) +) or die "slot never became inactive"; + +$node_publisher->safe_psql($db, + qq(SELECT pg_drop_replication_slot('$sub2_name'))); $node_subscriber->stop('fast'); $node_publisher->stop('fast'); diff --git a/src/test/subscription/t/027_nosuperuser.pl b/src/test/subscription/t/027_nosuperuser.pl index d7a7e3ef5bbef..a4d7da36636ba 100644 --- a/src/test/subscription/t/027_nosuperuser.pl +++ b/src/test/subscription/t/027_nosuperuser.pl @@ -1,10 +1,11 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test that logical replication respects permissions use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; use Test::More; my ($node_publisher, $node_subscriber, $publisher_connstr, $result, $offset); @@ -104,6 +105,7 @@ sub grant_superuser CREATE ROLE regress_admin SUPERUSER LOGIN; CREATE ROLE regress_alice NOSUPERUSER LOGIN; GRANT CREATE ON DATABASE postgres TO regress_alice; + GRANT PG_CREATE_SUBSCRIPTION TO regress_alice; SET SESSION AUTHORIZATION regress_alice; CREATE SCHEMA alice; GRANT USAGE ON SCHEMA alice TO regress_admin; @@ -303,4 +305,117 @@ sub grant_superuser expect_replication("alice.unpartitioned", 3, 17, 21, "restoring SELECT permission permits replication to continue"); +# The apply worker should get restarted after the superuser privileges are +# revoked for subscription owner alice. +grant_superuser("regress_alice"); +$node_subscriber->safe_psql( + 'postgres', qq( +SET SESSION AUTHORIZATION regress_alice; +CREATE SUBSCRIPTION regression_sub CONNECTION '$publisher_connstr' PUBLICATION alice; +)); + +# Wait for initial sync to finish +$node_subscriber->wait_for_subscription_sync($node_publisher, + 'regression_sub'); + +# Check the subscriber log from now on. +$offset = -s $node_subscriber->logfile; + +revoke_superuser("regress_alice"); + +# After the user becomes non-superuser the apply worker should be restarted. +$node_subscriber->wait_for_log( + qr/LOG: ( [A-Z0-9]+:)? logical replication worker for subscription \"regression_sub\" will restart because the subscription owner's superuser privileges have been revoked/, + $offset); + +# If the subscription connection requires a password ('password_required' +# is true) then a non-superuser must specify that password in the connection +# string. +SKIP: +{ + skip + "subscription password_required test cannot run without Unix-domain sockets", + 3 + unless $use_unix_sockets; + + my $node_publisher1 = PostgreSQL::Test::Cluster->new('publisher1'); + my $node_subscriber1 = PostgreSQL::Test::Cluster->new('subscriber1'); + $node_publisher1->init(allows_streaming => 'logical'); + $node_subscriber1->init; + $node_publisher1->start; + $node_subscriber1->start; + my $publisher_connstr1 = + $node_publisher1->connstr . ' user=regress_test_user dbname=postgres'; + my $publisher_connstr2 = + $node_publisher1->connstr + . ' user=regress_test_user dbname=postgres password=secret'; + + for my $node ($node_publisher1, $node_subscriber1) + { + $node->safe_psql( + 'postgres', qq( + CREATE ROLE regress_test_user PASSWORD 'secret' LOGIN REPLICATION; + GRANT CREATE ON DATABASE postgres TO regress_test_user; + GRANT PG_CREATE_SUBSCRIPTION TO regress_test_user; + )); + } + + $node_publisher1->safe_psql( + 'postgres', qq( + SET SESSION AUTHORIZATION regress_test_user; + CREATE PUBLICATION regress_test_pub; + )); + $node_subscriber1->safe_psql( + 'postgres', qq( + CREATE SUBSCRIPTION regress_test_sub CONNECTION '$publisher_connstr1' PUBLICATION regress_test_pub; + )); + + # Wait for initial sync to finish + $node_subscriber1->wait_for_subscription_sync($node_publisher1, + 'regress_test_sub'); + + my $save_pgpassword = $ENV{"PGPASSWORD"}; + $ENV{"PGPASSWORD"} = 'secret'; + + # Setup pg_hba configuration so that logical replication connection without + # password is not allowed. + unlink($node_publisher1->data_dir . '/pg_hba.conf'); + $node_publisher1->append_conf('pg_hba.conf', + qq{local all regress_test_user md5}); + $node_publisher1->reload; + + # Change the subscription owner to a non-superuser + $node_subscriber1->safe_psql( + 'postgres', qq( + ALTER SUBSCRIPTION regress_test_sub OWNER TO regress_test_user; + )); + + # Non-superuser must specify password in the connection string + my ($ret, $stdout, $stderr) = $node_subscriber1->psql( + 'postgres', qq( + SET SESSION AUTHORIZATION regress_test_user; + ALTER SUBSCRIPTION regress_test_sub REFRESH PUBLICATION; + )); + isnt($ret, 0, + "non zero exit for subscription whose owner is a non-superuser must specify password parameter of the connection string" + ); + ok( $stderr =~ + m/DETAIL: Non-superusers must provide a password in the connection string./, + 'subscription whose owner is a non-superuser must specify password parameter of the connection string' + ); + + $ENV{"PGPASSWORD"} = $save_pgpassword; + + # It should succeed after including the password parameter of the connection + # string. + ($ret, $stdout, $stderr) = $node_subscriber1->psql( + 'postgres', qq( + SET SESSION AUTHORIZATION regress_test_user; + ALTER SUBSCRIPTION regress_test_sub CONNECTION '$publisher_connstr2'; + ALTER SUBSCRIPTION regress_test_sub REFRESH PUBLICATION; + )); + is($ret, 0, + "Non-superuser will be able to refresh the publication after specifying the password parameter of the connection string" + ); +} done_testing(); diff --git a/src/test/subscription/t/028_row_filter.pl b/src/test/subscription/t/028_row_filter.pl index aec483f785fee..2acd36d7a6f22 100644 --- a/src/test/subscription/t/028_row_filter.pl +++ b/src/test/subscription/t/028_row_filter.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test logical replication behavior with row filtering use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -14,7 +14,7 @@ # create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; diff --git a/src/test/subscription/t/029_on_error.pl b/src/test/subscription/t/029_on_error.pl index 7d6fb66985ae2..0ab57a4b5b0e4 100644 --- a/src/test/subscription/t/029_on_error.pl +++ b/src/test/subscription/t/029_on_error.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests for disable_on_error and SKIP transaction features. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -26,10 +26,11 @@ sub test_skip_lsn "SELECT subenabled = FALSE FROM pg_subscription WHERE subname = 'sub'" ); - # Get the finish LSN of the error transaction. + # Get the finish LSN of the error transaction, mapping the expected + # ERROR with its CONTEXT when retrieving this information. my $contents = slurp_file($node_subscriber->logfile, $offset); $contents =~ - qr/processing remote data for replication origin \"pg_\d+\" during message type "INSERT" for replication target relation "public.tbl" in transaction \d+, finished at ([[:xdigit:]]+\/[[:xdigit:]]+)/ + qr/duplicate key value violates unique constraint "tbl_pkey".*\n.*DETAIL:.*\n.*CONTEXT:.* for replication target relation "public.tbl" in transaction \d+, finished at ([[:xdigit:]]+\/[[:xdigit:]]+)/m or die "could not get error-LSN"; my $lsn = $1; @@ -91,13 +92,13 @@ sub test_skip_lsn $node_publisher->safe_psql( 'postgres', qq[ -CREATE TABLE tbl (i INT, t TEXT); +CREATE TABLE tbl (i INT, t BYTEA); INSERT INTO tbl VALUES (1, NULL); ]); $node_subscriber->safe_psql( 'postgres', qq[ -CREATE TABLE tbl (i INT PRIMARY KEY, t TEXT); +CREATE TABLE tbl (i INT PRIMARY KEY, t BYTEA); INSERT INTO tbl VALUES (1, NULL); ]); @@ -163,10 +164,11 @@ sub test_skip_lsn 'postgres', qq[ BEGIN; -INSERT INTO tbl SELECT i, md5(i::text) FROM generate_series(1, 10000) s(i); +INSERT INTO tbl SELECT i, sha256(i::text::bytea) FROM generate_series(1, 10000) s(i); COMMIT; ]); -test_skip_lsn($node_publisher, $node_subscriber, "(4, md5(4::text))", +test_skip_lsn($node_publisher, $node_subscriber, + "(4, sha256(4::text::bytea))", "4", "test skipping stream-commit"); $result = $node_subscriber->safe_psql('postgres', diff --git a/src/test/subscription/t/030_origin.pl b/src/test/subscription/t/030_origin.pl index 9ca1fa25d8f3a..c0c627ee83a99 100644 --- a/src/test/subscription/t/030_origin.pl +++ b/src/test/subscription/t/030_origin.pl @@ -1,10 +1,10 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test the CREATE SUBSCRIPTION 'origin' parameter and its interaction with # 'copy_data' parameter. use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -204,9 +204,123 @@ $node_B->wait_for_catchup($subname_AB2); # clear the operations done by this test -$node_A->safe_psql('postgres', "DROP TABLE tab_new"); -$node_B->safe_psql('postgres', "DROP TABLE tab_new"); -$node_A->safe_psql('postgres', "DROP SUBSCRIPTION $subname_AB2"); +$node_A->safe_psql( + 'postgres', qq( +DROP TABLE tab_new; +DROP SUBSCRIPTION $subname_AB2; +DROP SUBSCRIPTION $subname_AB; +DROP PUBLICATION tap_pub_A; +)); +$node_B->safe_psql( + 'postgres', qq( +DROP TABLE tab_new; +DROP SUBSCRIPTION $subname_BA; +DROP PUBLICATION tap_pub_B; +)); + +############################################################################### +# Specifying origin = NONE and copy_data = on must raise WARNING if we subscribe +# to a partitioned table and this table contains any remotely originated data. +# +# node_B +# __________________________ +# | tab_main | --------------> node_C (tab_main) +# |__________________________| +# | tab_part1 | tab_part2 | <-------------- node_A (tab_part2) +# |____________|_____________| +# | tab_part2_1 | +# |_____________| +# +# node_B +# __________________________ +# | tab_main | +# |__________________________| +# | tab_part1 | tab_part2 | <-------------- node_A (tab_part2) +# |____________|_____________| +# | tab_part2_1 | --------------> node_C (tab_part2_1) +# |_____________| +############################################################################### + +# create a table on node A which will act as a source for a partition on node B +$node_A->safe_psql( + 'postgres', qq( +CREATE TABLE tab_part2(a int); +CREATE PUBLICATION tap_pub_A FOR TABLE tab_part2; +)); + +# create a partition table on node B +$node_B->safe_psql( + 'postgres', qq( +CREATE TABLE tab_main(a int) PARTITION BY RANGE(a); +CREATE TABLE tab_part1 PARTITION OF tab_main FOR VALUES FROM (0) TO (5); +CREATE TABLE tab_part2(a int) PARTITION BY RANGE(a); +CREATE TABLE tab_part2_1 PARTITION OF tab_part2 FOR VALUES FROM (5) TO (10); +ALTER TABLE tab_main ATTACH PARTITION tab_part2 FOR VALUES FROM (5) to (10); +CREATE SUBSCRIPTION tap_sub_A_B CONNECTION '$node_A_connstr' PUBLICATION tap_pub_A; +)); + +# create a table on node C +$node_C->safe_psql( + 'postgres', qq( +CREATE TABLE tab_main(a int); +CREATE TABLE tab_part2_1(a int); +)); + +# create a logical replication setup between node B and node C with +# subscription on node C having origin = NONE and copy_data = on +$node_B->safe_psql( + 'postgres', qq( +CREATE PUBLICATION tap_pub_B FOR TABLE tab_main WITH (publish_via_partition_root); +CREATE PUBLICATION tap_pub_B_2 FOR TABLE tab_part2_1; +)); + +($result, $stdout, $stderr) = $node_C->psql( + 'postgres', " + CREATE SUBSCRIPTION tap_sub_B_C CONNECTION '$node_B_connstr' PUBLICATION tap_pub_B WITH (origin = none, copy_data = on); +"); + +# A warning must be logged as a partition 'tab_part2' in node B is subscribed to +# node A so partition 'tab_part2' can have remotely originated data +like( + $stderr, + qr/WARNING: ( [A-Z0-9]+:)? subscription "tap_sub_b_c" requested copy_data with origin = NONE but might copy data that had a different origin/, + "Create subscription with origin = none and copy_data when the publisher's partition is subscribing from different origin" +); +$node_C->safe_psql('postgres', "DROP SUBSCRIPTION tap_sub_B_C"); + +($result, $stdout, $stderr) = $node_C->psql( + 'postgres', " + CREATE SUBSCRIPTION tap_sub_B_C CONNECTION '$node_B_connstr' PUBLICATION tap_pub_B_2 WITH (origin = none, copy_data = on); +"); + +# A warning must be logged as ancestor of table 'tab_part2_1' in node B is +# subscribed to node A so table 'tab_part2_1' can have remotely originated +# data +like( + $stderr, + qr/WARNING: ( [A-Z0-9]+:)? subscription "tap_sub_b_c" requested copy_data with origin = NONE but might copy data that had a different origin/, + "Create subscription with origin = none and copy_data when the publisher's ancestor is subscribing from different origin" +); + +# clear the operations done by this test +$node_C->safe_psql( + 'postgres', qq( +DROP SUBSCRIPTION tap_sub_B_C; +DROP TABLE tab_main; +DROP TABLE tab_part2_1; +)); +$node_B->safe_psql( + 'postgres', qq( +DROP SUBSCRIPTION tap_sub_A_B; +DROP PUBLICATION tap_pub_B; +DROP PUBLICATION tap_pub_B_2; +DROP TABLE tab_main; +)); +$node_A->safe_psql( + 'postgres', qq( +DROP PUBLICATION tap_pub_A; +DROP TABLE tab_part2; +)); # shutdown $node_B->stop('fast'); diff --git a/src/test/subscription/t/031_column_list.pl b/src/test/subscription/t/031_column_list.pl index dbff806040255..9a97fa5020313 100644 --- a/src/test/subscription/t/031_column_list.pl +++ b/src/test/subscription/t/031_column_list.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # Test partial-column publication of tables use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -14,7 +14,7 @@ # create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->append_conf('postgresql.conf', qq(max_logical_replication_workers = 6)); $node_subscriber->start; @@ -370,7 +370,8 @@ $node_subscriber->safe_psql( 'postgres', qq( - ALTER SUBSCRIPTION sub1 SET PUBLICATION pub2, pub3 + DROP SUBSCRIPTION sub1; + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub2, pub3 )); $node_subscriber->wait_for_subscription_sync($node_publisher, 'sub1'); @@ -411,7 +412,8 @@ $node_subscriber->safe_psql( 'postgres', qq( - ALTER SUBSCRIPTION sub1 SET PUBLICATION pub4 + DROP SUBSCRIPTION sub1; + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub4 )); $node_subscriber->wait_for_subscription_sync; @@ -487,7 +489,8 @@ $node_subscriber->safe_psql( 'postgres', qq( - ALTER SUBSCRIPTION sub1 SET PUBLICATION pub5 + DROP SUBSCRIPTION sub1; + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub5 )); $node_subscriber->wait_for_subscription_sync; @@ -601,10 +604,12 @@ ALTER PUBLICATION pub6 ADD TABLE test_part_a_2 (b); )); -# add the publication to our subscription, wait for sync to complete +# create the subscription for the above publication, wait for sync to +# complete $node_subscriber->safe_psql( 'postgres', qq( - ALTER SUBSCRIPTION sub1 SET PUBLICATION pub6 + DROP SUBSCRIPTION sub1; + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub6 )); $node_subscriber->wait_for_subscription_sync; @@ -667,10 +672,12 @@ CREATE PUBLICATION pub7 FOR TABLE test_part_b (a, b) WITH (publish_via_partition_root = true); )); -# add the publication to our subscription, wait for sync to complete +# create the subscription for the above publication, wait for sync to +# complete $node_subscriber->safe_psql( 'postgres', qq( - ALTER SUBSCRIPTION sub1 SET PUBLICATION pub7 + DROP SUBSCRIPTION sub1; + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub7 )); $node_subscriber->wait_for_subscription_sync; @@ -737,7 +744,8 @@ ALTER PUBLICATION pub8 ADD TABLE test_part_c_2 (a,b); )); -# add the publication to our subscription, wait for sync to complete +# create the subscription for the above publication, wait for sync to +# complete $node_subscriber->safe_psql( 'postgres', qq( DROP SUBSCRIPTION sub1; @@ -835,10 +843,12 @@ CREATE PUBLICATION pub9 FOR TABLE test_part_d (a) WITH (publish_via_partition_root = true); )); -# add the publication to our subscription, wait for sync to complete +# create the subscription for the above publication, wait for sync to +# complete $node_subscriber->safe_psql( 'postgres', qq( - ALTER SUBSCRIPTION sub1 SET PUBLICATION pub9 + DROP SUBSCRIPTION sub1; + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub9 )); $node_subscriber->wait_for_subscription_sync; @@ -880,8 +890,8 @@ $node_subscriber->safe_psql( 'postgres', qq( CREATE TABLE test_mix_2 (a int PRIMARY KEY, b int, c int); - ALTER SUBSCRIPTION sub1 SET PUBLICATION pub_mix_3, pub_mix_4; - ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION; + DROP SUBSCRIPTION sub1; + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub_mix_3, pub_mix_4; )); $node_subscriber->wait_for_subscription_sync; @@ -1022,7 +1032,8 @@ CREATE TABLE s1.t (a int, b int, c int) PARTITION BY RANGE (a); CREATE TABLE t_1 PARTITION OF s1.t FOR VALUES FROM (1) TO (10); - ALTER SUBSCRIPTION sub1 SET PUBLICATION pub1, pub2; + DROP SUBSCRIPTION sub1; + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub1, pub2; )); $node_subscriber->wait_for_subscription_sync; @@ -1090,7 +1101,8 @@ PARTITION BY RANGE (a); CREATE TABLE t_2 PARTITION OF t_1 FOR VALUES FROM (1) TO (10); - ALTER SUBSCRIPTION sub1 SET PUBLICATION pub3; + DROP SUBSCRIPTION sub1; + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub3; )); $node_subscriber->wait_for_subscription_sync; @@ -1138,7 +1150,8 @@ PARTITION BY RANGE (a); CREATE TABLE t_2 PARTITION OF t_1 FOR VALUES FROM (1) TO (10); - ALTER SUBSCRIPTION sub1 SET PUBLICATION pub4; + DROP SUBSCRIPTION sub1; + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub4; )); $node_subscriber->wait_for_subscription_sync; diff --git a/src/test/subscription/t/032_subscribe_use_index.pl b/src/test/subscription/t/032_subscribe_use_index.pl index 576eec6a57811..cc999e33c3ac7 100644 --- a/src/test/subscription/t/032_subscribe_use_index.pl +++ b/src/test/subscription/t/032_subscribe_use_index.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # Test logical replication behavior with subscriber using available index use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -14,7 +14,7 @@ # create subscriber node my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; @@ -478,6 +478,75 @@ # data # ============================================================================= +# ============================================================================= +# Testcase start: Subscription can use hash index +# + +# create tables on pub and sub +$node_publisher->safe_psql('postgres', + "CREATE TABLE test_replica_id_full (x int, y text)"); +$node_publisher->safe_psql('postgres', + "ALTER TABLE test_replica_id_full REPLICA IDENTITY FULL"); +$node_subscriber->safe_psql('postgres', + "CREATE TABLE test_replica_id_full (x int, y text)"); +$node_subscriber->safe_psql('postgres', + "CREATE INDEX test_replica_id_full_idx ON test_replica_id_full USING HASH (x)" +); + +# insert some initial data +$node_publisher->safe_psql('postgres', + "INSERT INTO test_replica_id_full SELECT i, (i%10)::text FROM generate_series(0,10) i" +); + +# create pub/sub +$node_publisher->safe_psql('postgres', + "CREATE PUBLICATION tap_pub_rep_full FOR TABLE test_replica_id_full"); +$node_subscriber->safe_psql('postgres', + "CREATE SUBSCRIPTION tap_sub_rep_full CONNECTION '$publisher_connstr application_name=$appname' PUBLICATION tap_pub_rep_full" +); + +# wait for initial table synchronization to finish +$node_subscriber->wait_for_subscription_sync($node_publisher, $appname); + +# delete 2 rows +$node_publisher->safe_psql('postgres', + "DELETE FROM test_replica_id_full WHERE x IN (5, 6)"); + +# update 2 rows +$node_publisher->safe_psql('postgres', + "UPDATE test_replica_id_full SET x = 100, y = '200' WHERE x IN (1, 2)"); + +# wait until the index is used on the subscriber +$node_publisher->wait_for_catchup($appname); +$node_subscriber->poll_query_until('postgres', + q{select (idx_scan = 4) from pg_stat_all_indexes where indexrelname = 'test_replica_id_full_idx';} + ) + or die + "Timed out while waiting for check subscriber tap_sub_rep_full deletes 2 rows and updates 2 rows via index"; + +# make sure that the subscriber has the correct data after the UPDATE +$result = $node_subscriber->safe_psql('postgres', + "select count(*) from test_replica_id_full WHERE (x = 100 and y = '200')" +); +is($result, qq(2), + 'ensure subscriber has the correct data at the end of the test'); + +# make sure that the subscriber has the correct data after the first DELETE +$result = $node_subscriber->safe_psql('postgres', + "select count(*) from test_replica_id_full where x in (5, 6)"); +is($result, qq(0), + 'ensure subscriber has the correct data at the end of the test'); + +# cleanup pub +$node_publisher->safe_psql('postgres', "DROP PUBLICATION tap_pub_rep_full"); +$node_publisher->safe_psql('postgres', "DROP TABLE test_replica_id_full"); +# cleanup sub +$node_subscriber->safe_psql('postgres', "DROP SUBSCRIPTION tap_sub_rep_full"); +$node_subscriber->safe_psql('postgres', "DROP TABLE test_replica_id_full"); + +# Testcase end: Subscription can use hash index +# ============================================================================= + $node_subscriber->stop('fast'); $node_publisher->stop('fast'); diff --git a/src/test/subscription/t/033_run_as_table_owner.pl b/src/test/subscription/t/033_run_as_table_owner.pl index 9de3c04a0c214..b129fc3c38edb 100644 --- a/src/test/subscription/t/033_run_as_table_owner.pl +++ b/src/test/subscription/t/033_run_as_table_owner.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Test that logical replication respects permissions use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use Test::More; @@ -193,6 +193,34 @@ sub revoke_superuser expect_replication("alice.unpartitioned", 3, 7, 13, "with INHERIT but not SET ROLE can replicate"); +# Similar to the previous test, remove all privileges again and instead, +# give the ability to SET ROLE to regress_alice. +$node_subscriber->safe_psql( + 'postgres', qq( +SET SESSION AUTHORIZATION regress_alice; +REVOKE ALL PRIVILEGES ON alice.unpartitioned FROM regress_admin; +RESET SESSION AUTHORIZATION; +GRANT regress_alice TO regress_admin WITH INHERIT FALSE, SET TRUE; +)); + +# Because replication is running as the subscription owner in this test, +# the above grant doesn't help. +publish_insert("alice.unpartitioned", 14); +expect_failure( + "alice.unpartitioned", 3, 7, 13, + qr/ERROR: ( [A-Z0-9]+:)? permission denied for table unpartitioned/msi, + "with no privileges cannot replicate"); + +# Allow the replication to run as table owner and check that things start +# working. +$node_subscriber->safe_psql( + 'postgres', qq( +ALTER SUBSCRIPTION admin_sub SET (run_as_owner = false); +)); + +expect_replication("alice.unpartitioned", 4, 7, 14, + "can replicate after setting run_as_owner to false"); + # Remove the subscrition and truncate the table for the initial data sync # tests. $node_subscriber->safe_psql( @@ -222,7 +250,7 @@ sub revoke_superuser # Because the initial data sync is working as the table owner, all # data should be copied. $node_subscriber->wait_for_subscription_sync($node_publisher, 'admin_sub'); -expect_replication("alice.unpartitioned", 3, 7, 13, +expect_replication("alice.unpartitioned", 4, 7, 14, "table owner can do the initial data copy"); done_testing(); diff --git a/src/test/subscription/t/100_bugs.pl b/src/test/subscription/t/100_bugs.pl index 4fabc4416831e..3498a90e74160 100644 --- a/src/test/subscription/t/100_bugs.pl +++ b/src/test/subscription/t/100_bugs.pl @@ -1,9 +1,9 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # Tests for various bugs found over time use strict; -use warnings; +use warnings FATAL => 'all'; use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; @@ -24,7 +24,7 @@ $node_publisher->start; my $node_subscriber = PostgreSQL::Test::Cluster->new('subscriber'); -$node_subscriber->init(allows_streaming => 'logical'); +$node_subscriber->init; $node_subscriber->start; my $publisher_connstr = $node_publisher->connstr . ' dbname=postgres'; @@ -175,7 +175,7 @@ $node_pub_sub->start; my $node_sub = PostgreSQL::Test::Cluster->new('testsubscriber1'); -$node_sub->init(allows_streaming => 'logical'); +$node_sub->init; $node_sub->start; # Create the tables in all nodes. @@ -438,4 +438,133 @@ $node_publisher->stop('fast'); $node_subscriber->stop('fast'); +# The bug was that pgoutput was incorrectly replacing missing attributes in +# tuples with NULL. This could result in incorrect replication with +# `REPLICA IDENTITY FULL`. + +$node_publisher->rotate_logfile(); +$node_publisher->start(); + +$node_subscriber->rotate_logfile(); +$node_subscriber->start(); + +# Set up a table with schema `(a int, b bool)` where the `b` attribute is +# missing for one row due to the `ALTER TABLE ... ADD COLUMN ... DEFAULT` +# fast path. +$node_publisher->safe_psql( + 'postgres', qq( + CREATE TABLE tab_default (a int); + ALTER TABLE tab_default REPLICA IDENTITY FULL; + INSERT INTO tab_default VALUES (1); + ALTER TABLE tab_default ADD COLUMN b bool DEFAULT false NOT NULL; + INSERT INTO tab_default VALUES (2, true); + CREATE PUBLICATION pub1 FOR TABLE tab_default; +)); + +# Replicate to the subscriber. +$node_subscriber->safe_psql( + 'postgres', qq( + CREATE TABLE tab_default (a int, b bool); + CREATE SUBSCRIPTION sub1 CONNECTION '$publisher_connstr' PUBLICATION pub1; +)); + +$node_subscriber->wait_for_subscription_sync($node_publisher, 'sub1'); +$result = + $node_subscriber->safe_psql('postgres', "SELECT a, b FROM tab_default"); +is( $result, qq(1|f +2|t), 'check snapshot on subscriber'); + +# Update all rows in the table and ensure the rows with the missing `b` +# attribute replicate correctly. +$node_publisher->safe_psql('postgres', "UPDATE tab_default SET a = a + 1"); +$node_publisher->wait_for_catchup('sub1'); + +# When the bug is present, the `1|f` row will not be updated to `2|f` because +# the publisher incorrectly fills in `NULL` for `b` and publishes an update +# for `1|NULL`, which doesn't exist in the subscriber. +$result = + $node_subscriber->safe_psql('postgres', "SELECT a, b FROM tab_default"); +is( $result, qq(2|f +3|t), 'check replicated update on subscriber'); + +$node_publisher->stop('fast'); +$node_subscriber->stop('fast'); + +# The bug was that when an ERROR was caught and handled by a (PL/pgSQL) +# function, the apply worker reset the replication origin but continued +# processing subsequent changes. So, we fail to update the replication origin +# during further apply operations. This can lead to the apply worker requesting +# the changes that have been applied again after restarting. + +$node_publisher->rotate_logfile(); +$node_publisher->start(); + +$node_subscriber->rotate_logfile(); +$node_subscriber->start(); + +# Set up a publication with a table +$node_publisher->safe_psql( + 'postgres', qq( + CREATE TABLE t1 (a int); + CREATE PUBLICATION regress_pub FOR TABLE t1; +)); + +# Set up a subscription which subscribes the publication +$node_subscriber->safe_psql( + 'postgres', qq( + CREATE TABLE t1 (a int); + CREATE SUBSCRIPTION regress_sub CONNECTION '$publisher_connstr' PUBLICATION regress_pub; +)); + +$node_subscriber->wait_for_subscription_sync($node_publisher, 'regress_sub'); + +# Create an AFTER INSERT trigger on the table that raises and subsequently +# handles an exception. Subsequent insertions will trigger this exception, +# causing the apply worker to invoke its error callback with an ERROR. However, +# since the error is caught within the trigger, the apply worker will continue +# processing changes. +$node_subscriber->safe_psql( + 'postgres', q{ +CREATE FUNCTION handle_exception_trigger() +RETURNS TRIGGER AS $$ +BEGIN + BEGIN + -- Raise an exception + RAISE EXCEPTION 'This is a test exception'; + EXCEPTION + WHEN OTHERS THEN + RETURN NEW; + END; + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +CREATE TRIGGER silent_exception_trigger +AFTER INSERT OR UPDATE ON t1 +FOR EACH ROW +EXECUTE FUNCTION handle_exception_trigger(); + +ALTER TABLE t1 ENABLE ALWAYS TRIGGER silent_exception_trigger; +}); + +# Obtain current remote_lsn value to check its advancement later +my $remote_lsn = $node_subscriber->safe_psql('postgres', + "SELECT remote_lsn FROM pg_replication_origin_status os, pg_subscription s WHERE os.external_id = 'pg_' || s.oid AND s.subname = 'regress_sub'" +); + +# Insert a tuple to replicate changes +$node_publisher->safe_psql('postgres', "INSERT INTO t1 VALUES (1);"); +$node_publisher->wait_for_catchup('regress_sub'); + +# Confirms the origin can be advanced +$result = $node_subscriber->safe_psql('postgres', + "SELECT remote_lsn > '$remote_lsn' FROM pg_replication_origin_status os, pg_subscription s WHERE os.external_id = 'pg_' || s.oid AND s.subname = 'regress_sub'" +); +is($result, 't', + 'remote_lsn has advanced for apply worker raising an exception'); + +$node_publisher->stop('fast'); +$node_subscriber->stop('fast'); + done_testing(); diff --git a/src/timezone/Makefile b/src/timezone/Makefile index fbbaae4cc57cb..c85e831247a5a 100644 --- a/src/timezone/Makefile +++ b/src/timezone/Makefile @@ -75,5 +75,5 @@ ifeq (,$(with_system_tzdata)) endif $(MAKE) -C tznames $@ -clean distclean maintainer-clean: +clean distclean: rm -f zic$(X) $(ZICOBJS) abbrevs.txt diff --git a/src/timezone/data/tzdata.zi b/src/timezone/data/tzdata.zi index b522e39532677..a7fb52f1968f3 100644 --- a/src/timezone/data/tzdata.zi +++ b/src/timezone/data/tzdata.zi @@ -1,4 +1,4 @@ -# version 2023c +# version 2025b # This zic input file is in the public domain. R d 1916 o - Jun 14 23s 1 S R d 1916 1919 - O Su>=1 23s 0 - @@ -22,27 +22,6 @@ R d 1978 o - Mar 24 1 1 S R d 1978 o - S 22 3 0 - R d 1980 o - Ap 25 0 1 S R d 1980 o - O 31 2 0 - -Z Africa/Algiers 0:12:12 - LMT 1891 Mar 16 -0:9:21 - PMT 1911 Mar 11 -0 d WE%sT 1940 F 25 2 -1 d CE%sT 1946 O 7 -0 - WET 1956 Ja 29 -1 - CET 1963 Ap 14 -0 d WE%sT 1977 O 21 -1 d CE%sT 1979 O 26 -0 d WE%sT 1981 May -1 - CET -Z Atlantic/Cape_Verde -1:34:4 - LMT 1912 Ja 1 2u --2 - -02 1942 S --2 1 -01 1945 O 15 --2 - -02 1975 N 25 2 --1 - -01 -Z Africa/Ndjamena 1:0:12 - LMT 1912 -1 - WAT 1979 O 14 -1 1 WAST 1980 Mar 8 -1 - WAT -Z Africa/Abidjan -0:16:8 - LMT 1912 -0 - GMT R K 1940 o - Jul 15 0 1 S R K 1940 o - O 1 0 0 - R K 1941 o - Ap 15 0 1 S @@ -77,21 +56,6 @@ R K 2014 o - Jul 31 24 1 S R K 2014 o - S lastTh 24 0 - R K 2023 ma - Ap lastF 0 1 S R K 2023 ma - O lastTh 24 0 - -Z Africa/Cairo 2:5:9 - LMT 1900 O -2 K EE%sT -Z Africa/Bissau -1:2:20 - LMT 1912 Ja 1 1u --1 - -01 1975 -0 - GMT -Z Africa/Nairobi 2:27:16 - LMT 1908 May -2:30 - +0230 1928 Jun 30 24 -3 - EAT 1930 Ja 4 24 -2:30 - +0230 1936 D 31 24 -2:45 - +0245 1942 Jul 31 24 -3 - EAT -Z Africa/Monrovia -0:43:8 - LMT 1882 --0:43:8 - MMT 1919 Mar --0:44:30 - MMT 1972 Ja 7 -0 - GMT R L 1951 o - O 14 2 1 S R L 1952 o - Ja 1 0 0 - R L 1953 o - O 9 2 1 S @@ -109,21 +73,10 @@ R L 1997 o - Ap 4 0 1 S R L 1997 o - O 4 0 0 - R L 2013 o - Mar lastF 1 1 S R L 2013 o - O lastF 2 0 - -Z Africa/Tripoli 0:52:44 - LMT 1920 -1 L CE%sT 1959 -2 - EET 1982 -1 L CE%sT 1990 May 4 -2 - EET 1996 S 30 -1 L CE%sT 1997 O 4 -2 - EET 2012 N 10 2 -1 L CE%sT 2013 O 25 2 -2 - EET R MU 1982 o - O 10 0 1 - R MU 1983 o - Mar 21 0 0 - R MU 2008 o - O lastSu 2 1 - R MU 2009 o - Mar lastSu 2 0 - -Z Indian/Mauritius 3:50 - LMT 1907 -4 MU +04/+05 R M 1939 o - S 12 0 1 - R M 1939 o - N 19 0 0 - R M 1940 o - F 25 0 1 - @@ -307,53 +260,15 @@ R M 2086 o - Ap 14 3 -1 - R M 2086 o - May 19 2 0 - R M 2087 o - Mar 30 3 -1 - R M 2087 o - May 11 2 0 - -Z Africa/Casablanca -0:30:20 - LMT 1913 O 26 -0 M +00/+01 1984 Mar 16 -1 - +01 1986 -0 M +00/+01 2018 O 28 3 -1 M +01/+00 -Z Africa/El_Aaiun -0:52:48 - LMT 1934 --1 - -01 1976 Ap 14 -0 M +00/+01 2018 O 28 3 -1 M +01/+00 -Z Africa/Maputo 2:10:20 - LMT 1903 Mar -2 - CAT R NA 1994 o - Mar 21 0 -1 WAT R NA 1994 2017 - S Su>=1 2 0 CAT R NA 1995 2017 - Ap Su>=1 2 -1 WAT -Z Africa/Windhoek 1:8:24 - LMT 1892 F 8 -1:30 - +0130 1903 Mar -2 - SAST 1942 S 20 2 -2 1 SAST 1943 Mar 21 2 -2 - SAST 1990 Mar 21 -2 NA %s -Z Africa/Lagos 0:13:35 - LMT 1905 Jul -0 - GMT 1908 Jul -0:13:35 - LMT 1914 -0:30 - +0030 1919 S -1 - WAT -Z Africa/Sao_Tome 0:26:56 - LMT 1884 --0:36:45 - LMT 1912 Ja 1 0u -0 - GMT 2018 Ja 1 1 -1 - WAT 2019 Ja 1 2 -0 - GMT R SA 1942 1943 - S Su>=15 2 1 - R SA 1943 1944 - Mar Su>=15 2 0 - -Z Africa/Johannesburg 1:52 - LMT 1892 F 8 -1:30 - SAST 1903 Mar -2 SA SAST R SD 1970 o - May 1 0 1 S R SD 1970 1985 - O 15 0 0 - R SD 1971 o - Ap 30 0 1 S R SD 1972 1985 - Ap lastSu 0 1 S -Z Africa/Khartoum 2:10:8 - LMT 1931 -2 SD CA%sT 2000 Ja 15 12 -3 - EAT 2017 N -2 - CAT -Z Africa/Juba 2:6:28 - LMT 1931 -2 SD CA%sT 2000 Ja 15 12 -3 - EAT 2021 F -2 - CAT R n 1939 o - Ap 15 23s 1 S R n 1939 o - N 18 23s 0 - R n 1940 o - F 25 23s 1 S @@ -379,80 +294,14 @@ R n 2005 o - May 1 0s 1 S R n 2005 o - S 30 1s 0 - R n 2006 2008 - Mar lastSu 2s 1 S R n 2006 2008 - O lastSu 2s 0 - -Z Africa/Tunis 0:40:44 - LMT 1881 May 12 -0:9:21 - PMT 1911 Mar 11 -1 n CE%sT -Z Antarctica/Casey 0 - -00 1969 -8 - +08 2009 O 18 2 -11 - +11 2010 Mar 5 2 -8 - +08 2011 O 28 2 -11 - +11 2012 F 21 17u -8 - +08 2016 O 22 -11 - +11 2018 Mar 11 4 -8 - +08 2018 O 7 4 -11 - +11 2019 Mar 17 3 -8 - +08 2019 O 4 3 -11 - +11 2020 Mar 8 3 -8 - +08 2020 O 4 0:1 -11 - +11 -Z Antarctica/Davis 0 - -00 1957 Ja 13 -7 - +07 1964 N -0 - -00 1969 F -7 - +07 2009 O 18 2 -5 - +05 2010 Mar 10 20u -7 - +07 2011 O 28 2 -5 - +05 2012 F 21 20u -7 - +07 -Z Antarctica/Mawson 0 - -00 1954 F 13 -6 - +06 2009 O 18 2 -5 - +05 R Tr 2005 ma - Mar lastSu 1u 2 +02 R Tr 2004 ma - O lastSu 1u 0 +00 -Z Antarctica/Troll 0 - -00 2005 F 12 -0 Tr %s -Z Antarctica/Rothera 0 - -00 1976 D --3 - -03 -Z Asia/Kabul 4:36:48 - LMT 1890 -4 - +04 1945 -4:30 - +0430 R AM 2011 o - Mar lastSu 2s 1 - R AM 2011 o - O lastSu 2s 0 - -Z Asia/Yerevan 2:58 - LMT 1924 May 2 -3 - +03 1957 Mar -4 R +04/+05 1991 Mar 31 2s -3 R +03/+04 1995 S 24 2s -4 - +04 1997 -4 R +04/+05 2011 -4 AM +04/+05 R AZ 1997 2015 - Mar lastSu 4 1 - R AZ 1997 2015 - O lastSu 5 0 - -Z Asia/Baku 3:19:24 - LMT 1924 May 2 -3 - +03 1957 Mar -4 R +04/+05 1991 Mar 31 2s -3 R +03/+04 1992 S lastSu 2s -4 - +04 1996 -4 E +04/+05 1997 -4 AZ +04/+05 R BD 2009 o - Jun 19 23 1 - R BD 2009 o - D 31 24 0 - -Z Asia/Dhaka 6:1:40 - LMT 1890 -5:53:20 - HMT 1941 O -6:30 - +0630 1942 May 15 -5:30 - +0530 1942 S -6:30 - +0630 1951 S 30 -6 - +06 2009 -6 BD +06/+07 -Z Asia/Thimphu 5:58:36 - LMT 1947 Au 15 -5:30 - +0530 1987 O -6 - +06 -Z Indian/Chagos 4:49:40 - LMT 1907 -5 - +05 1996 -6 - +06 -Z Asia/Yangon 6:24:47 - LMT 1880 -6:24:47 - RMT 1920 -6:30 - +0630 1942 May -9 - +09 1945 May 3 -6:30 - +0630 R Sh 1919 o - Ap 12 24 1 D R Sh 1919 o - S 30 24 0 S R Sh 1940 o - Jun 1 0 1 D @@ -470,11 +319,6 @@ R Sh 1948 1949 - S 30 24 0 S R CN 1986 o - May 4 2 1 D R CN 1986 1991 - S Su>=11 2 0 S R CN 1987 1991 - Ap Su>=11 2 1 D -Z Asia/Shanghai 8:5:43 - LMT 1901 -8 Sh C%sT 1949 May 28 -8 CN C%sT -Z Asia/Urumqi 5:50:20 - LMT 1928 -6 - +06 R HK 1946 o - Ap 21 0 1 S R HK 1946 o - D 1 3:30s 0 - R HK 1947 o - Ap 13 3:30s 1 S @@ -489,12 +333,6 @@ R HK 1965 1976 - O Su>=16 3:30 0 - R HK 1973 o - D 30 3:30 1 S R HK 1979 o - May 13 3:30 1 S R HK 1979 o - O 21 3:30 0 - -Z Asia/Hong_Kong 7:36:42 - LMT 1904 O 29 17u -8 - HKT 1941 Jun 15 3 -8 1 HKST 1941 O 1 4 -8 0:30 HKWT 1941 D 25 -9 - JST 1945 N 18 2 -8 HK HK%sT R f 1946 o - May 15 0 1 D R f 1946 o - O 1 0 0 S R f 1947 o - Ap 15 0 1 D @@ -510,10 +348,6 @@ R f 1974 1975 - Ap 1 0 1 D R f 1974 1975 - O 1 0 0 S R f 1979 o - Jul 1 0 1 D R f 1979 o - O 1 0 0 S -Z Asia/Taipei 8:6 - LMT 1896 -8 - CST 1937 O -9 - JST 1945 S 21 1 -8 f C%sT R _ 1942 1943 - Ap 30 23 1 - R _ 1942 o - N 17 23 0 - R _ 1943 o - S 30 23 0 S @@ -541,10 +375,6 @@ R _ 1973 o - D 30 3:30 1 D R _ 1975 1976 - Ap Su>=16 3:30 1 D R _ 1979 o - May 13 3:30 1 D R _ 1979 o - O Su>=16 3:30 0 S -Z Asia/Macau 7:34:10 - LMT 1904 O 30 -8 - CST 1941 D 21 23 -9 _ +09/+10 1945 S 30 24 -8 _ C%sT R CY 1975 o - Ap 13 0 1 S R CY 1975 o - O 12 0 0 - R CY 1976 o - May 15 0 1 S @@ -554,65 +384,6 @@ R CY 1977 o - S 25 0 0 - R CY 1978 o - O 2 0 0 - R CY 1979 1997 - S lastSu 0 0 - R CY 1981 1998 - Mar lastSu 0 1 S -Z Asia/Nicosia 2:13:28 - LMT 1921 N 14 -2 CY EE%sT 1998 S -2 E EE%sT -Z Asia/Famagusta 2:15:48 - LMT 1921 N 14 -2 CY EE%sT 1998 S -2 E EE%sT 2016 S 8 -3 - +03 2017 O 29 1u -2 E EE%sT -Z Asia/Tbilisi 2:59:11 - LMT 1880 -2:59:11 - TBMT 1924 May 2 -3 - +03 1957 Mar -4 R +04/+05 1991 Mar 31 2s -3 R +03/+04 1992 -3 e +03/+04 1994 S lastSu -4 e +04/+05 1996 O lastSu -4 1 +05 1997 Mar lastSu -4 e +04/+05 2004 Jun 27 -3 R +03/+04 2005 Mar lastSu 2 -4 - +04 -Z Asia/Dili 8:22:20 - LMT 1912 -8 - +08 1942 F 21 23 -9 - +09 1976 May 3 -8 - +08 2000 S 17 -9 - +09 -Z Asia/Kolkata 5:53:28 - LMT 1854 Jun 28 -5:53:20 - HMT 1870 -5:21:10 - MMT 1906 -5:30 - IST 1941 O -5:30 1 +0630 1942 May 15 -5:30 - IST 1942 S -5:30 1 +0630 1945 O 15 -5:30 - IST -Z Asia/Jakarta 7:7:12 - LMT 1867 Au 10 -7:7:12 - BMT 1923 D 31 16:40u -7:20 - +0720 1932 N -7:30 - +0730 1942 Mar 23 -9 - +09 1945 S 23 -7:30 - +0730 1948 May -8 - +08 1950 May -7:30 - +0730 1964 -7 - WIB -Z Asia/Pontianak 7:17:20 - LMT 1908 May -7:17:20 - PMT 1932 N -7:30 - +0730 1942 Ja 29 -9 - +09 1945 S 23 -7:30 - +0730 1948 May -8 - +08 1950 May -7:30 - +0730 1964 -8 - WITA 1988 -7 - WIB -Z Asia/Makassar 7:57:36 - LMT 1920 -7:57:36 - MMT 1932 N -8 - +08 1942 F 9 -9 - +09 1945 S 23 -8 - WITA -Z Asia/Jayapura 9:22:48 - LMT 1932 N -9 - +09 1944 S -9:30 - +0930 1964 -9 - WIT R i 1910 o - Ja 1 0 0 - R i 1977 o - Mar 21 23 1 - R i 1977 o - O 20 24 0 - @@ -653,11 +424,6 @@ R i 2020 o - Mar 20 24 1 - R i 2020 o - S 20 24 0 - R i 2021 2022 - Mar 21 24 1 - R i 2021 2022 - S 21 24 0 - -Z Asia/Tehran 3:25:44 - LMT 1916 -3:25:44 - TMT 1935 Jun 13 -3:30 i +0330/+0430 1977 O 20 24 -4 i +04/+05 1979 -3:30 i +0330/+0430 R IQ 1982 o - May 1 0 1 - R IQ 1982 1984 - O 1 0 0 - R IQ 1983 o - Mar 31 0 1 - @@ -666,10 +432,6 @@ R IQ 1985 1990 - S lastSu 1s 0 - R IQ 1986 1990 - Mar lastSu 1s 1 - R IQ 1991 2007 - Ap 1 3s 1 - R IQ 1991 2007 - O 1 3s 0 - -Z Asia/Baghdad 2:57:40 - LMT 1890 -2:57:36 - BMT 1918 -3 - +03 1982 May -3 IQ +03/+04 R Z 1940 o - May 31 24u 1 D R Z 1940 o - S 30 24u 0 S R Z 1940 o - N 16 24u 1 D @@ -755,15 +517,10 @@ R Z 2011 o - O 2 2 0 S R Z 2012 o - S 23 2 0 S R Z 2013 ma - Mar F>=23 2 1 D R Z 2013 ma - O lastSu 2 0 S -Z Asia/Jerusalem 2:20:54 - LMT 1880 -2:20:40 - JMT 1918 -2 Z I%sT R JP 1948 o - May Sa>=1 24 1 D R JP 1948 1951 - S Sa>=8 25 0 S R JP 1949 o - Ap Sa>=1 24 1 D R JP 1950 1951 - May Sa>=1 24 1 D -Z Asia/Tokyo 9:18:59 - LMT 1887 D 31 15u -9 JP J%sT R J 1973 o - Jun 6 0 1 S R J 1973 1975 - O 1 0 0 - R J 1974 1977 - May 1 0 1 S @@ -796,83 +553,10 @@ R J 2013 o - D 20 0 0 - R J 2014 2021 - Mar lastTh 24 1 S R J 2014 2022 - O lastF 0s 0 - R J 2022 o - F lastTh 24 1 S -Z Asia/Amman 2:23:44 - LMT 1931 -2 J EE%sT 2022 O 28 0s -3 - +03 -Z Asia/Almaty 5:7:48 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 R +05/+06 1992 Ja 19 2s -6 R +06/+07 2004 O 31 2s -6 - +06 -Z Asia/Qyzylorda 4:21:52 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1991 S 29 2s -5 R +05/+06 1992 Ja 19 2s -6 R +06/+07 1992 Mar 29 2s -5 R +05/+06 2004 O 31 2s -6 - +06 2018 D 21 -5 - +05 -Z Asia/Qostanay 4:14:28 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 2004 O 31 2s -6 - +06 -Z Asia/Aqtobe 3:48:40 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 2004 O 31 2s -5 - +05 -Z Asia/Aqtau 3:21:4 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 1994 S 25 2s -4 R +04/+05 2004 O 31 2s -5 - +05 -Z Asia/Atyrau 3:27:44 - LMT 1924 May 2 -3 - +03 1930 Jun 21 -5 - +05 1981 O -6 - +06 1982 Ap -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 1999 Mar 28 2s -4 R +04/+05 2004 O 31 2s -5 - +05 -Z Asia/Oral 3:25:24 - LMT 1924 May 2 -3 - +03 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1989 Mar 26 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 1992 Mar 29 2s -4 R +04/+05 2004 O 31 2s -5 - +05 R KG 1992 1996 - Ap Su>=7 0s 1 - R KG 1992 1996 - S lastSu 0 0 - R KG 1997 2005 - Mar lastSu 2:30 1 - R KG 1997 2004 - O lastSu 2:30 0 - -Z Asia/Bishkek 4:58:24 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 R +05/+06 1991 Au 31 2 -5 KG +05/+06 2005 Au 12 -6 - +06 R KR 1948 o - Jun 1 0 1 D R KR 1948 o - S 12 24 0 S R KR 1949 o - Ap 3 0 1 D @@ -887,18 +571,6 @@ R KR 1957 1960 - May Su>=1 0 1 D R KR 1957 1960 - S Sa>=17 24 0 S R KR 1987 1988 - May Su>=8 2 1 D R KR 1987 1988 - O Su>=8 3 0 S -Z Asia/Seoul 8:27:52 - LMT 1908 Ap -8:30 - KST 1912 -9 - JST 1945 S 8 -9 KR K%sT 1954 Mar 21 -8:30 KR K%sT 1961 Au 10 -9 KR K%sT -Z Asia/Pyongyang 8:23 - LMT 1908 Ap -8:30 - KST 1912 -9 - JST 1945 Au 24 -9 - KST 2015 Au 15 -8:30 - KST 2018 May 4 23:30 -9 - KST R l 1920 o - Mar 28 0 1 S R l 1920 o - O 25 0 0 - R l 1921 o - Ap 3 0 1 S @@ -923,18 +595,8 @@ R l 1992 o - O 4 0 0 - R l 1993 ma - Mar lastSu 0 1 S R l 1993 1998 - S lastSu 0 0 - R l 1999 ma - O lastSu 0 0 - -Z Asia/Beirut 2:22 - LMT 1880 -2 l EE%sT R NB 1935 1941 - S 14 0 0:20 - R NB 1935 1941 - D 14 0 0 - -Z Asia/Kuching 7:21:20 - LMT 1926 Mar -7:30 - +0730 1933 -8 NB +08/+0820 1942 F 16 -9 - +09 1945 S 12 -8 - +08 -Z Indian/Maldives 4:54 - LMT 1880 -4:54 - MMT 1960 -5 - +05 R X 1983 1984 - Ap 1 0 1 - R X 1983 o - O 1 0 0 - R X 1985 1998 - Mar lastSu 0 1 - @@ -944,31 +606,11 @@ R X 2001 2006 - S lastSa 2 0 - R X 2002 2006 - Mar lastSa 2 1 - R X 2015 2016 - Mar lastSa 2 1 - R X 2015 2016 - S lastSa 0 0 - -Z Asia/Hovd 6:6:36 - LMT 1905 Au -6 - +06 1978 -7 X +07/+08 -Z Asia/Ulaanbaatar 7:7:32 - LMT 1905 Au -7 - +07 1978 -8 X +08/+09 -Z Asia/Choibalsan 7:38 - LMT 1905 Au -7 - +07 1978 -8 - +08 1983 Ap -9 X +09/+10 2008 Mar 31 -8 X +08/+09 -Z Asia/Kathmandu 5:41:16 - LMT 1920 -5:30 - +0530 1986 -5:45 - +0545 R PK 2002 o - Ap Su>=2 0 1 S R PK 2002 o - O Su>=2 0 0 - R PK 2008 o - Jun 1 0 1 S R PK 2008 2009 - N 1 0 0 - R PK 2009 o - Ap 15 0 1 S -Z Asia/Karachi 4:28:12 - LMT 1907 -5:30 - +0530 1942 S -5:30 1 +0630 1945 O 15 -5:30 - +0530 1951 S 30 -5 - +05 1971 Mar 26 -5 PK PK%sT R P 1999 2005 - Ap F>=15 0 1 S R P 1999 2003 - O F>=15 0 0 - R P 2004 o - O 1 1 0 - @@ -1001,136 +643,94 @@ R P 2021 o - O 29 1 0 - R P 2022 o - Mar 27 0 1 S R P 2022 2035 - O Sa<=30 2 0 - R P 2023 o - Ap 29 2 1 S -R P 2024 o - Ap 13 2 1 S -R P 2025 o - Ap 5 2 1 S +R P 2024 o - Ap 20 2 1 S +R P 2025 o - Ap 12 2 1 S R P 2026 2054 - Mar Sa<=30 2 1 S R P 2036 o - O 18 2 0 - R P 2037 o - O 10 2 0 - R P 2038 o - S 25 2 0 - R P 2039 o - S 17 2 0 - -R P 2039 o - O 22 2 1 S -R P 2039 2067 - O Sa<=30 2 0 - R P 2040 o - S 1 2 0 - -R P 2040 o - O 13 2 1 S +R P 2040 o - O 20 2 1 S +R P 2040 2067 - O Sa<=30 2 0 - R P 2041 o - Au 24 2 0 - -R P 2041 o - S 28 2 1 S +R P 2041 o - O 5 2 1 S R P 2042 o - Au 16 2 0 - -R P 2042 o - S 20 2 1 S +R P 2042 o - S 27 2 1 S R P 2043 o - Au 1 2 0 - -R P 2043 o - S 12 2 1 S +R P 2043 o - S 19 2 1 S R P 2044 o - Jul 23 2 0 - -R P 2044 o - Au 27 2 1 S +R P 2044 o - S 3 2 1 S R P 2045 o - Jul 15 2 0 - -R P 2045 o - Au 19 2 1 S +R P 2045 o - Au 26 2 1 S R P 2046 o - Jun 30 2 0 - -R P 2046 o - Au 11 2 1 S +R P 2046 o - Au 18 2 1 S R P 2047 o - Jun 22 2 0 - -R P 2047 o - Jul 27 2 1 S +R P 2047 o - Au 3 2 1 S R P 2048 o - Jun 6 2 0 - -R P 2048 o - Jul 18 2 1 S +R P 2048 o - Jul 25 2 1 S R P 2049 o - May 29 2 0 - -R P 2049 o - Jul 3 2 1 S +R P 2049 o - Jul 10 2 1 S R P 2050 o - May 21 2 0 - -R P 2050 o - Jun 25 2 1 S +R P 2050 o - Jul 2 2 1 S R P 2051 o - May 6 2 0 - -R P 2051 o - Jun 17 2 1 S +R P 2051 o - Jun 24 2 1 S R P 2052 o - Ap 27 2 0 - -R P 2052 o - Jun 1 2 1 S +R P 2052 o - Jun 8 2 1 S R P 2053 o - Ap 12 2 0 - -R P 2053 o - May 24 2 1 S +R P 2053 o - May 31 2 1 S R P 2054 o - Ap 4 2 0 - -R P 2054 o - May 16 2 1 S -R P 2055 o - May 1 2 1 S -R P 2056 o - Ap 22 2 1 S -R P 2057 o - Ap 7 2 1 S -R P 2058 ma - Mar Sa<=30 2 1 S +R P 2054 o - May 23 2 1 S +R P 2055 o - May 8 2 1 S +R P 2056 o - Ap 29 2 1 S +R P 2057 o - Ap 14 2 1 S +R P 2058 o - Ap 6 2 1 S +R P 2059 ma - Mar Sa<=30 2 1 S R P 2068 o - O 20 2 0 - R P 2069 o - O 12 2 0 - R P 2070 o - O 4 2 0 - R P 2071 o - S 19 2 0 - R P 2072 o - S 10 2 0 - -R P 2072 o - O 15 2 1 S +R P 2072 o - O 22 2 1 S +R P 2072 ma - O Sa<=30 2 0 - R P 2073 o - S 2 2 0 - -R P 2073 o - O 7 2 1 S +R P 2073 o - O 14 2 1 S R P 2074 o - Au 18 2 0 - -R P 2074 o - S 29 2 1 S +R P 2074 o - O 6 2 1 S R P 2075 o - Au 10 2 0 - -R P 2075 o - S 14 2 1 S -R P 2075 ma - O Sa<=30 2 0 - +R P 2075 o - S 21 2 1 S R P 2076 o - Jul 25 2 0 - -R P 2076 o - S 5 2 1 S +R P 2076 o - S 12 2 1 S R P 2077 o - Jul 17 2 0 - -R P 2077 o - Au 28 2 1 S +R P 2077 o - S 4 2 1 S R P 2078 o - Jul 9 2 0 - -R P 2078 o - Au 13 2 1 S +R P 2078 o - Au 20 2 1 S R P 2079 o - Jun 24 2 0 - -R P 2079 o - Au 5 2 1 S +R P 2079 o - Au 12 2 1 S R P 2080 o - Jun 15 2 0 - -R P 2080 o - Jul 20 2 1 S +R P 2080 o - Jul 27 2 1 S R P 2081 o - Jun 7 2 0 - -R P 2081 o - Jul 12 2 1 S +R P 2081 o - Jul 19 2 1 S R P 2082 o - May 23 2 0 - -R P 2082 o - Jul 4 2 1 S +R P 2082 o - Jul 11 2 1 S R P 2083 o - May 15 2 0 - -R P 2083 o - Jun 19 2 1 S +R P 2083 o - Jun 26 2 1 S R P 2084 o - Ap 29 2 0 - -R P 2084 o - Jun 10 2 1 S +R P 2084 o - Jun 17 2 1 S R P 2085 o - Ap 21 2 0 - -R P 2085 o - Jun 2 2 1 S +R P 2085 o - Jun 9 2 1 S R P 2086 o - Ap 13 2 0 - -R P 2086 o - May 18 2 1 S -Z Asia/Gaza 2:17:52 - LMT 1900 O -2 Z EET/EEST 1948 May 15 -2 K EE%sT 1967 Jun 5 -2 Z I%sT 1996 -2 J EE%sT 1999 -2 P EE%sT 2008 Au 29 -2 - EET 2008 S -2 P EE%sT 2010 -2 - EET 2010 Mar 27 0:1 -2 P EE%sT 2011 Au -2 - EET 2012 -2 P EE%sT -Z Asia/Hebron 2:20:23 - LMT 1900 O -2 Z EET/EEST 1948 May 15 -2 K EE%sT 1967 Jun 5 -2 Z I%sT 1996 -2 J EE%sT 1999 -2 P EE%sT -R PH 1936 o - N 1 0 1 D -R PH 1937 o - F 1 0 0 S -R PH 1954 o - Ap 12 0 1 D -R PH 1954 o - Jul 1 0 0 S -R PH 1978 o - Mar 22 0 1 D -R PH 1978 o - S 21 0 0 S -Z Asia/Manila -15:56 - LMT 1844 D 31 -8:4 - LMT 1899 May 11 -8 PH P%sT 1942 May -9 - JST 1944 N -8 PH P%sT -Z Asia/Qatar 3:26:8 - LMT 1920 -4 - +04 1972 Jun -3 - +03 -Z Asia/Riyadh 3:6:52 - LMT 1947 Mar 14 -3 - +03 -Z Asia/Singapore 6:55:25 - LMT 1901 -6:55:25 - SMT 1905 Jun -7 - +07 1933 -7 0:20 +0720 1936 -7:20 - +0720 1941 S -7:30 - +0730 1942 F 16 -9 - +09 1945 S 12 -7:30 - +0730 1981 D 31 16u -8 - +08 -Z Asia/Colombo 5:19:24 - LMT 1880 -5:19:32 - MMT 1906 -5:30 - +0530 1942 Ja 5 -5:30 0:30 +06 1942 S -5:30 1 +0630 1945 O 16 2 -5:30 - +0530 1996 May 25 -6:30 - +0630 1996 O 26 0:30 -6 - +06 2006 Ap 15 0:30 -5:30 - +0530 +R P 2086 o - May 25 2 1 S +R PH 1936 o - O 31 24 1 D +R PH 1937 o - Ja 15 24 0 S +R PH 1941 o - D 15 24 1 D +R PH 1945 o - N 30 24 0 S +R PH 1954 o - Ap 11 24 1 D +R PH 1954 o - Jun 4 24 0 S +R PH 1977 o - Mar 27 24 1 D +R PH 1977 o - S 21 24 0 S +R PH 1990 o - May 21 0 1 D +R PH 1990 o - Jul 28 24 0 S R S 1920 1923 - Ap Su>=15 2 1 S R S 1920 1923 - O Su>=1 2 0 - R S 1962 o - Ap 29 2 1 S @@ -1172,46 +772,6 @@ R S 2009 o - Mar lastF 0 1 S R S 2010 2011 - Ap F>=1 0 1 S R S 2012 2022 - Mar lastF 0 1 S R S 2009 2022 - O lastF 0 0 - -Z Asia/Damascus 2:25:12 - LMT 1920 -2 S EE%sT 2022 O 28 -3 - +03 -Z Asia/Dushanbe 4:35:12 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 1 +06 1991 S 9 2s -5 - +05 -Z Asia/Bangkok 6:42:4 - LMT 1880 -6:42:4 - BMT 1920 Ap -7 - +07 -Z Asia/Ashgabat 3:53:32 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 R +05/+06 1991 Mar 31 2 -4 R +04/+05 1992 Ja 19 2 -5 - +05 -Z Asia/Dubai 3:41:12 - LMT 1920 -4 - +04 -Z Asia/Samarkand 4:27:53 - LMT 1924 May 2 -4 - +04 1930 Jun 21 -5 - +05 1981 Ap -5 1 +06 1981 O -6 - +06 1982 Ap -5 R +05/+06 1992 -5 - +05 -Z Asia/Tashkent 4:37:11 - LMT 1924 May 2 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2 -5 R +05/+06 1992 -5 - +05 -Z Asia/Ho_Chi_Minh 7:6:30 - LMT 1906 Jul -7:6:30 - PLMT 1911 May -7 - +07 1942 D 31 23 -8 - +08 1945 Mar 14 23 -9 - +09 1945 S 2 -7 - +07 1947 Ap -8 - +08 1955 Jul -7 - +07 1959 D 31 23 -8 - +08 1975 Jun 13 -7 - +07 R AU 1917 o - Ja 1 2s 1 D R AU 1917 o - Mar lastSu 2s 0 S R AU 1942 o - Ja 1 2s 1 D @@ -1219,9 +779,6 @@ R AU 1942 o - Mar lastSu 2s 0 S R AU 1942 o - S 27 2s 1 D R AU 1943 1944 - Mar lastSu 2s 0 S R AU 1943 o - O 3 2s 1 D -Z Australia/Darwin 8:43:20 - LMT 1895 F -9 - ACST 1899 May -9:30 AU AC%sT R AW 1974 o - O lastSu 2s 1 D R AW 1975 o - Mar Su>=1 2s 0 S R AW 1983 o - O lastSu 2s 1 D @@ -1231,25 +788,12 @@ R AW 1992 o - Mar Su>=1 2s 0 S R AW 2006 o - D 3 2s 1 D R AW 2007 2009 - Mar lastSu 2s 0 S R AW 2007 2008 - O lastSu 2s 1 D -Z Australia/Perth 7:43:24 - LMT 1895 D -8 AU AW%sT 1943 Jul -8 AW AW%sT -Z Australia/Eucla 8:35:28 - LMT 1895 D -8:45 AU +0845/+0945 1943 Jul -8:45 AW +0845/+0945 R AQ 1971 o - O lastSu 2s 1 D R AQ 1972 o - F lastSu 2s 0 S R AQ 1989 1991 - O lastSu 2s 1 D R AQ 1990 1992 - Mar Su>=1 2s 0 S R Ho 1992 1993 - O lastSu 2s 1 D R Ho 1993 1994 - Mar Su>=1 2s 0 S -Z Australia/Brisbane 10:12:8 - LMT 1895 -10 AU AE%sT 1971 -10 AQ AE%sT -Z Australia/Lindeman 9:55:56 - LMT 1895 -10 AU AE%sT 1971 -10 AQ AE%sT 1992 Jul -10 Ho AE%sT R AS 1971 1985 - O lastSu 2s 1 D R AS 1986 o - O 19 2s 1 D R AS 1987 2007 - O lastSu 2s 1 D @@ -1265,10 +809,6 @@ R AS 2006 o - Ap 2 2s 0 S R AS 2007 o - Mar lastSu 2s 0 S R AS 2008 ma - Ap Su>=1 2s 0 S R AS 2008 ma - O Su>=1 2s 1 D -Z Australia/Adelaide 9:14:20 - LMT 1895 F -9 - ACST 1899 May -9:30 AU AC%sT 1971 -9:30 AS AC%sT R AT 1916 o - O Su>=1 2s 1 D R AT 1917 o - Mar lastSu 2s 0 S R AT 1917 1918 - O Su>=22 2s 1 D @@ -1292,10 +832,6 @@ R AT 2001 ma - O Su>=1 2s 1 D R AT 2006 o - Ap Su>=1 2s 0 S R AT 2007 o - Mar lastSu 2s 0 S R AT 2008 ma - Ap Su>=1 2s 0 S -Z Australia/Hobart 9:49:16 - LMT 1895 S -10 AT AE%sT 1919 O 24 -10 AU AE%sT 1967 -10 AT AE%sT R AV 1971 1985 - O lastSu 2s 1 D R AV 1972 o - F lastSu 2s 0 S R AV 1973 1985 - Mar Su>=1 2s 0 S @@ -1310,9 +846,6 @@ R AV 2006 o - Ap Su>=1 2s 0 S R AV 2007 o - Mar lastSu 2s 0 S R AV 2008 ma - Ap Su>=1 2s 0 S R AV 2008 ma - O Su>=1 2s 1 D -Z Australia/Melbourne 9:39:52 - LMT 1895 F -10 AU AE%sT 1971 -10 AV AE%sT R AN 1971 1985 - O lastSu 2s 1 D R AN 1972 o - F 27 2s 0 S R AN 1973 1981 - Mar Su>=1 2s 0 S @@ -1329,15 +862,6 @@ R AN 2006 o - Ap Su>=1 2s 0 S R AN 2007 o - Mar lastSu 2s 0 S R AN 2008 ma - Ap Su>=1 2s 0 S R AN 2008 ma - O Su>=1 2s 1 D -Z Australia/Sydney 10:4:52 - LMT 1895 F -10 AU AE%sT 1971 -10 AN AE%sT -Z Australia/Broken_Hill 9:25:48 - LMT 1895 F -10 - AEST 1896 Au 23 -9 - ACST 1899 May -9:30 AU AC%sT 1971 -9:30 AN AC%sT 2000 -9:30 AS AC%sT R LH 1981 1984 - O lastSu 2 1 - R LH 1982 1985 - Mar Su>=1 2 0 - R LH 1985 o - O lastSu 2 0:30 - @@ -1352,19 +876,6 @@ R LH 2006 o - Ap Su>=1 2 0 - R LH 2007 o - Mar lastSu 2 0 - R LH 2008 ma - Ap Su>=1 2 0 - R LH 2008 ma - O Su>=1 2 0:30 - -Z Australia/Lord_Howe 10:36:20 - LMT 1895 F -10 - AEST 1981 Mar -10:30 LH +1030/+1130 1985 Jul -10:30 LH +1030/+11 -Z Antarctica/Macquarie 0 - -00 1899 N -10 - AEST 1916 O 1 2 -10 1 AEDT 1917 F -10 AU AE%sT 1919 Ap 1 0s -0 - -00 1948 Mar 25 -10 AU AE%sT 1967 -10 AT AE%sT 2010 -10 1 AEDT 2011 -10 AT AE%sT R FJ 1998 1999 - N Su>=1 2 1 - R FJ 1999 2000 - F lastSu 3 0 - R FJ 2009 o - N 29 2 1 - @@ -1377,14 +888,6 @@ R FJ 2014 2018 - N Su>=1 2 1 - R FJ 2015 2021 - Ja Su>=12 3 0 - R FJ 2019 o - N Su>=8 2 1 - R FJ 2020 o - D 20 2 1 - -Z Pacific/Fiji 11:55:44 - LMT 1915 O 26 -12 FJ +12/+13 -Z Pacific/Gambier -8:59:48 - LMT 1912 O --9 - -09 -Z Pacific/Marquesas -9:18 - LMT 1912 O --9:30 - -0930 -Z Pacific/Tahiti -9:58:16 - LMT 1912 O --10 - -10 R Gu 1959 o - Jun 27 2 1 D R Gu 1961 o - Ja 29 2 0 S R Gu 1967 o - S 1 2 1 D @@ -1399,50 +902,10 @@ R Gu 1976 o - May 26 2 1 D R Gu 1976 o - Au 22 2:1 0 S R Gu 1977 o - Ap 24 2 1 D R Gu 1977 o - Au 28 2 0 S -Z Pacific/Guam -14:21 - LMT 1844 D 31 -9:39 - LMT 1901 -10 - GST 1941 D 10 -9 - +09 1944 Jul 31 -10 Gu G%sT 2000 D 23 -10 - ChST -Z Pacific/Tarawa 11:32:4 - LMT 1901 -12 - +12 -Z Pacific/Kanton 0 - -00 1937 Au 31 --12 - -12 1979 O --11 - -11 1994 D 31 -13 - +13 -Z Pacific/Kiritimati -10:29:20 - LMT 1901 --10:40 - -1040 1979 O --10 - -10 1994 D 31 -14 - +14 -Z Pacific/Kwajalein 11:9:20 - LMT 1901 -11 - +11 1937 -10 - +10 1941 Ap -9 - +09 1944 F 6 -11 - +11 1969 O --12 - -12 1993 Au 20 24 -12 - +12 -Z Pacific/Kosrae -13:8:4 - LMT 1844 D 31 -10:51:56 - LMT 1901 -11 - +11 1914 O -9 - +09 1919 F -11 - +11 1937 -10 - +10 1941 Ap -9 - +09 1945 Au -11 - +11 1969 O -12 - +12 1999 -11 - +11 -Z Pacific/Nauru 11:7:40 - LMT 1921 Ja 15 -11:30 - +1130 1942 Au 29 -9 - +09 1945 S 8 -11:30 - +1130 1979 F 10 2 -12 - +12 R NC 1977 1978 - D Su>=1 0 1 - R NC 1978 1979 - F 27 0 0 - R NC 1996 o - D 1 2s 1 - R NC 1997 o - Mar 2 2s 0 - -Z Pacific/Noumea 11:5:48 - LMT 1912 Ja 13 -11 NC +11/+12 R NZ 1927 o - N 6 2 1 S R NZ 1928 o - Mar 4 2 0 M R NZ 1928 1933 - O Su>=8 2 0:30 S @@ -1468,80 +931,26 @@ R NZ 2007 ma - S lastSu 2s 1 D R k 2007 ma - S lastSu 2:45s 1 - R NZ 2008 ma - Ap Su>=1 2s 0 S R k 2008 ma - Ap Su>=1 2:45s 0 - -Z Pacific/Auckland 11:39:4 - LMT 1868 N 2 -11:30 NZ NZ%sT 1946 -12 NZ NZ%sT -Z Pacific/Chatham 12:13:48 - LMT 1868 N 2 -12:15 - +1215 1946 -12:45 k +1245/+1345 R CK 1978 o - N 12 0 0:30 - R CK 1979 1991 - Mar Su>=1 0 0 - R CK 1979 1990 - O lastSu 0 0:30 - -Z Pacific/Rarotonga 13:20:56 - LMT 1899 D 26 --10:39:4 - LMT 1952 O 16 --10:30 - -1030 1978 N 12 --10 CK -10/-0930 -Z Pacific/Niue -11:19:40 - LMT 1952 O 16 --11:20 - -1120 1964 Jul --11 - -11 -Z Pacific/Norfolk 11:11:52 - LMT 1901 -11:12 - +1112 1951 -11:30 - +1130 1974 O 27 2s -11:30 1 +1230 1975 Mar 2 2s -11:30 - +1130 2015 O 4 2s -11 - +11 2019 Jul -11 AN +11/+12 -Z Pacific/Palau -15:2:4 - LMT 1844 D 31 -8:57:56 - LMT 1901 -9 - +09 -Z Pacific/Port_Moresby 9:48:40 - LMT 1880 -9:48:32 - PMMT 1895 -10 - +10 -Z Pacific/Bougainville 10:22:16 - LMT 1880 -9:48:32 - PMMT 1895 -10 - +10 1942 Jul -9 - +09 1945 Au 21 -10 - +10 2014 D 28 2 -11 - +11 -Z Pacific/Pitcairn -8:40:20 - LMT 1901 --8:30 - -0830 1998 Ap 27 --8 - -08 -Z Pacific/Pago_Pago 12:37:12 - LMT 1892 Jul 5 --11:22:48 - LMT 1911 --11 - SST R WS 2010 o - S lastSu 0 1 - R WS 2011 o - Ap Sa>=1 4 0 - R WS 2011 o - S lastSa 3 1 - R WS 2012 2021 - Ap Su>=1 4 0 - R WS 2012 2020 - S lastSu 3 1 - -Z Pacific/Apia 12:33:4 - LMT 1892 Jul 5 --11:26:56 - LMT 1911 --11:30 - -1130 1950 --11 WS -11/-10 2011 D 29 24 -13 WS +13/+14 -Z Pacific/Guadalcanal 10:39:48 - LMT 1912 O -11 - +11 -Z Pacific/Fakaofo -11:24:56 - LMT 1901 --11 - -11 2011 D 30 -13 - +13 R TO 1999 o - O 7 2s 1 - R TO 2000 o - Mar 19 2s 0 - R TO 2000 2001 - N Su>=1 2 1 - R TO 2001 2002 - Ja lastSu 2 0 - R TO 2016 o - N Su>=1 2 1 - R TO 2017 o - Ja Su>=15 3 0 - -Z Pacific/Tongatapu 12:19:12 - LMT 1945 S 10 -12:20 - +1220 1961 -13 - +13 1999 -13 TO +13/+14 R VU 1973 o - D 22 12u 1 - R VU 1974 o - Mar 30 12u 0 - R VU 1983 1991 - S Sa>=22 24 1 - R VU 1984 1991 - Mar Sa>=22 24 0 - R VU 1992 1993 - Ja Sa>=22 24 0 - R VU 1992 o - O Sa>=22 24 1 - -Z Pacific/Efate 11:13:16 - LMT 1912 Ja 13 -11 VU +11/+12 R G 1916 o - May 21 2s 1 BST R G 1916 o - O 1 2s 0 GMT R G 1917 o - Ap 8 2s 1 BST @@ -1607,11 +1016,6 @@ R G 1972 1980 - O Su>=23 2s 0 GMT R G 1981 1995 - Mar lastSu 1u 1 BST R G 1981 1989 - O Su>=23 1u 0 GMT R G 1990 1995 - O Su>=22 1u 0 GMT -Z Europe/London -0:1:15 - LMT 1847 D -0 G %s 1968 O 27 -1 - BST 1971 O 31 2u -0 G %s 1996 -0 E GMT/BST R IE 1971 o - O 31 2u -1 - R IE 1972 1980 - Mar Su>=16 2u 0 - R IE 1972 1980 - O Su>=23 2u -1 - @@ -1619,17 +1023,6 @@ R IE 1981 ma - Mar lastSu 1u 0 - R IE 1981 1989 - O Su>=23 1u -1 - R IE 1990 1995 - O Su>=22 1u -1 - R IE 1996 ma - O lastSu 1u -1 - -Z Europe/Dublin -0:25:21 - LMT 1880 Au 2 --0:25:21 - DMT 1916 May 21 2s --0:25:21 1 IST 1916 O 1 2s -0 G %s 1921 D 6 -0 G GMT/IST 1940 F 25 2s -0 1 IST 1946 O 6 2s -0 - GMT 1947 Mar 16 2s -0 1 IST 1947 N 2 2s -0 - GMT 1948 Ap 18 2s -0 G GMT/IST 1968 O 27 -1 IE IST/GMT R E 1977 1980 - Ap Su>=1 1u 1 S R E 1977 o - S lastSu 1u 0 - R E 1978 o - O 1 1u 0 - @@ -1681,10 +1074,6 @@ R R 1981 1983 - O 1 0 0 - R R 1984 1995 - S lastSu 2s 0 - R R 1985 2010 - Mar lastSu 2s 1 S R R 1996 2010 - O lastSu 2s 0 - -Z WET 0 E WE%sT -Z CET 1 c CE%sT -Z MET 1 c ME%sT -Z EET 2 E EE%sT R q 1940 o - Jun 16 0 1 S R q 1942 o - N 2 3 0 - R q 1943 o - Mar 29 2 1 S @@ -1710,14 +1099,6 @@ R q 1982 o - O 3 0 0 - R q 1983 o - Ap 18 0 1 S R q 1983 o - O 1 0 0 - R q 1984 o - Ap 1 0 1 S -Z Europe/Tirane 1:19:20 - LMT 1914 -1 - CET 1940 Jun 16 -1 q CE%sT 1984 Jul -1 E CE%sT -Z Europe/Andorra 0:6:4 - LMT 1901 -0 - WET 1946 S 30 -1 - CET 1985 Mar 31 2 -1 E CE%sT R a 1920 o - Ap 5 2s 1 S R a 1920 o - S 13 2s 0 - R a 1946 o - Ap 14 2s 1 S @@ -1727,23 +1108,6 @@ R a 1947 o - Ap 6 2s 1 S R a 1948 o - Ap 18 2s 1 S R a 1980 o - Ap 6 0 1 S R a 1980 o - S 28 0 0 - -Z Europe/Vienna 1:5:21 - LMT 1893 Ap -1 c CE%sT 1920 -1 a CE%sT 1940 Ap 1 2s -1 c CE%sT 1945 Ap 2 2s -1 1 CEST 1945 Ap 12 2s -1 - CET 1946 -1 a CE%sT 1981 -1 E CE%sT -Z Europe/Minsk 1:50:16 - LMT 1880 -1:50 - MMT 1924 May 2 -2 - EET 1930 Jun 21 -3 - MSK 1941 Jun 28 -1 c CE%sT 1944 Jul 3 -3 R MSK/MSD 1990 -3 - MSK 1991 Mar 31 2s -2 R EE%sT 2011 Mar 27 2s -3 - +03 R b 1918 o - Mar 9 0s 1 S R b 1918 1919 - O Sa>=1 23s 0 - R b 1919 o - Mar 1 23s 1 S @@ -1778,87 +1142,27 @@ R b 1945 o - Ap 2 2s 1 S R b 1945 o - S 16 2s 0 - R b 1946 o - May 19 2s 1 S R b 1946 o - O 7 2s 0 - -Z Europe/Brussels 0:17:30 - LMT 1880 -0:17:30 - BMT 1892 May 1 0:17:30 -0 - WET 1914 N 8 -1 - CET 1916 May -1 c CE%sT 1918 N 11 11u -0 b WE%sT 1940 May 20 2s -1 c CE%sT 1944 S 3 -1 b CE%sT 1977 -1 E CE%sT R BG 1979 o - Mar 31 23 1 S R BG 1979 o - O 1 1 0 - R BG 1980 1982 - Ap Sa>=1 23 1 S R BG 1980 o - S 29 1 0 - R BG 1981 o - S 27 2 0 - -Z Europe/Sofia 1:33:16 - LMT 1880 -1:56:56 - IMT 1894 N 30 -2 - EET 1942 N 2 3 -1 c CE%sT 1945 -1 - CET 1945 Ap 2 3 -2 - EET 1979 Mar 31 23 -2 BG EE%sT 1982 S 26 3 -2 c EE%sT 1991 -2 e EE%sT 1997 -2 E EE%sT R CZ 1945 o - Ap M>=1 2s 1 S R CZ 1945 o - O 1 2s 0 - R CZ 1946 o - May 6 2s 1 S R CZ 1946 1949 - O Su>=1 2s 0 - R CZ 1947 1948 - Ap Su>=15 2s 1 S R CZ 1949 o - Ap 9 2s 1 S -Z Europe/Prague 0:57:44 - LMT 1850 -0:57:44 - PMT 1891 O -1 c CE%sT 1945 May 9 -1 CZ CE%sT 1946 D 1 3 -1 -1 GMT 1947 F 23 2 -1 CZ CE%sT 1979 -1 E CE%sT -Z Atlantic/Faroe -0:27:4 - LMT 1908 Ja 11 -0 - WET 1981 -0 E WE%sT R Th 1991 1992 - Mar lastSu 2 1 D R Th 1991 1992 - S lastSu 2 0 S R Th 1993 2006 - Ap Su>=1 2 1 D R Th 1993 2006 - O lastSu 2 0 S R Th 2007 ma - Mar Su>=8 2 1 D R Th 2007 ma - N Su>=1 2 0 S -Z America/Danmarkshavn -1:14:40 - LMT 1916 Jul 28 --3 - -03 1980 Ap 6 2 --3 E -03/-02 1996 -0 - GMT -Z America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 --2 - -02 1980 Ap 6 2 --2 c -02/-01 1981 Mar 29 --1 E -01/+00 -Z America/Nuuk -3:26:56 - LMT 1916 Jul 28 --3 - -03 1980 Ap 6 2 --3 E -03/-02 2023 O 29 1u --2 E -02/-01 -Z America/Thule -4:35:8 - LMT 1916 Jul 28 --4 Th A%sT -Z Europe/Tallinn 1:39 - LMT 1880 -1:39 - TMT 1918 F -1 c CE%sT 1919 Jul -1:39 - TMT 1921 May -2 - EET 1940 Au 6 -3 - MSK 1941 S 15 -1 c CE%sT 1944 S 22 -3 R MSK/MSD 1989 Mar 26 2s -2 1 EEST 1989 S 24 2s -2 c EE%sT 1998 S 22 -2 E EE%sT 1999 O 31 4 -2 - EET 2002 F 21 -2 E EE%sT R FI 1942 o - Ap 2 24 1 S R FI 1942 o - O 4 1 0 - R FI 1981 1982 - Mar lastSu 2 1 S R FI 1981 1982 - S lastSu 3 0 - -Z Europe/Helsinki 1:39:49 - LMT 1878 May 31 -1:39:49 - HMT 1921 May -2 FI EE%sT 1983 -2 E EE%sT R F 1916 o - Jun 14 23s 1 S R F 1916 1919 - O Su>=1 23s 0 - R F 1917 o - Mar 24 23s 1 S @@ -1901,13 +1205,6 @@ R F 1945 o - Ap 2 2 2 M R F 1945 o - S 16 3 0 - R F 1976 o - Mar 28 1 1 S R F 1976 o - S 26 1 0 - -Z Europe/Paris 0:9:21 - LMT 1891 Mar 16 -0:9:21 - PMT 1911 Mar 11 -0 F WE%sT 1940 Jun 14 23 -1 c CE%sT 1944 Au 25 -0 F WE%sT 1945 S 16 3 -1 F CE%sT 1977 -1 E CE%sT R DE 1946 o - Ap 14 2s 1 S R DE 1946 o - O 7 2s 0 - R DE 1947 1949 - O Su>=1 2s 0 - @@ -1919,15 +1216,6 @@ R DE 1949 o - Ap 10 2s 1 S R So 1945 o - May 24 2 2 M R So 1945 o - S 24 3 1 S R So 1945 o - N 18 2s 0 - -Z Europe/Berlin 0:53:28 - LMT 1893 Ap -1 c CE%sT 1945 May 24 2 -1 So CE%sT 1946 -1 DE CE%sT 1980 -1 E CE%sT -Z Europe/Gibraltar -0:21:24 - LMT 1880 Au 2 -0 G %s 1957 Ap 14 2 -1 - CET 1982 -1 E CE%sT R g 1932 o - Jul 7 0 1 S R g 1932 o - S 1 0 0 - R g 1941 o - Ap 7 0 1 S @@ -1947,12 +1235,6 @@ R g 1979 o - Ap 1 9 1 S R g 1979 o - S 29 2 0 - R g 1980 o - Ap 1 0 1 S R g 1980 o - S 28 0 0 - -Z Europe/Athens 1:34:52 - LMT 1895 S 14 -1:34:52 - AMT 1916 Jul 28 0:1 -2 g EE%sT 1941 Ap 30 -1 g CE%sT 1944 Ap 4 -2 g EE%sT 1981 -2 E EE%sT R h 1918 1919 - Ap 15 2 1 S R h 1918 1920 - S M>=15 3 0 - R h 1920 o - Ap 5 2 1 S @@ -1972,12 +1254,6 @@ R h 1980 o - Ap 6 0 1 S R h 1980 o - S 28 1 0 - R h 1981 1983 - Mar lastSu 0 1 S R h 1981 1983 - S lastSu 1 0 - -Z Europe/Budapest 1:16:20 - LMT 1890 N -1 c CE%sT 1918 -1 h CE%sT 1941 Ap 7 23 -1 c CE%sT 1945 -1 h CE%sT 1984 -1 E CE%sT R I 1916 o - Jun 3 24 1 S R I 1916 1917 - S 30 24 0 - R I 1917 o - Mar 31 24 1 S @@ -2019,44 +1295,8 @@ R I 1976 o - May 30 0s 1 S R I 1977 1979 - May Su>=22 0s 1 S R I 1978 o - O 1 0s 0 - R I 1979 o - S 30 0s 0 - -Z Europe/Rome 0:49:56 - LMT 1866 D 12 -0:49:56 - RMT 1893 O 31 23u -1 I CE%sT 1943 S 10 -1 c CE%sT 1944 Jun 4 -1 I CE%sT 1980 -1 E CE%sT R LV 1989 1996 - Mar lastSu 2s 1 S R LV 1989 1996 - S lastSu 2s 0 - -Z Europe/Riga 1:36:34 - LMT 1880 -1:36:34 - RMT 1918 Ap 15 2 -1:36:34 1 LST 1918 S 16 3 -1:36:34 - RMT 1919 Ap 1 2 -1:36:34 1 LST 1919 May 22 3 -1:36:34 - RMT 1926 May 11 -2 - EET 1940 Au 5 -3 - MSK 1941 Jul -1 c CE%sT 1944 O 13 -3 R MSK/MSD 1989 Mar lastSu 2s -2 1 EEST 1989 S lastSu 2s -2 LV EE%sT 1997 Ja 21 -2 E EE%sT 2000 F 29 -2 - EET 2001 Ja 2 -2 E EE%sT -Z Europe/Vilnius 1:41:16 - LMT 1880 -1:24 - WMT 1917 -1:35:36 - KMT 1919 O 10 -1 - CET 1920 Jul 12 -2 - EET 1920 O 9 -1 - CET 1940 Au 3 -3 - MSK 1941 Jun 24 -1 c CE%sT 1944 Au -3 R MSK/MSD 1989 Mar 26 2s -2 R EE%sT 1991 S 29 2s -2 c EE%sT 1998 -2 - EET 1998 Mar 29 1u -1 E CE%sT 1999 O 31 1u -2 - EET 2003 -2 E EE%sT R MT 1973 o - Mar 31 0s 1 S R MT 1973 o - S 29 0s 0 - R MT 1974 o - Ap 21 0s 1 S @@ -2064,22 +1304,8 @@ R MT 1974 o - S 16 0s 0 - R MT 1975 1979 - Ap Su>=15 2 1 S R MT 1975 1980 - S Su>=15 2 0 - R MT 1980 o - Mar 31 2 1 S -Z Europe/Malta 0:58:4 - LMT 1893 N 2 -1 I CE%sT 1973 Mar 31 -1 MT CE%sT 1981 -1 E CE%sT R MD 1997 ma - Mar lastSu 2 1 S R MD 1997 ma - O lastSu 3 0 - -Z Europe/Chisinau 1:55:20 - LMT 1880 -1:55 - CMT 1918 F 15 -1:44:24 - BMT 1931 Jul 24 -2 z EE%sT 1940 Au 15 -2 1 EEST 1941 Jul 17 -1 c CE%sT 1944 Au 24 -3 R MSK/MSD 1990 May 6 2 -2 R EE%sT 1992 -2 e EE%sT 1997 -2 MD EE%sT R O 1918 1919 - S 16 2s 0 - R O 1919 o - Ap 15 2s 1 S R O 1944 o - Ap 3 2s 1 S @@ -2100,25 +1326,12 @@ R O 1959 1961 - O Su>=1 1s 0 - R O 1960 o - Ap 3 1s 1 S R O 1961 1964 - May lastSu 1s 1 S R O 1962 1964 - S lastSu 1s 0 - -Z Europe/Warsaw 1:24 - LMT 1880 -1:24 - WMT 1915 Au 5 -1 c CE%sT 1918 S 16 3 -2 O EE%sT 1922 Jun -1 O CE%sT 1940 Jun 23 2 -1 c CE%sT 1944 O -1 O CE%sT 1977 -1 W- CE%sT 1988 -1 E CE%sT R p 1916 o - Jun 17 23 1 S R p 1916 o - N 1 1 0 - -R p 1917 o - F 28 23s 1 S -R p 1917 1921 - O 14 23s 0 - -R p 1918 o - Mar 1 23s 1 S -R p 1919 o - F 28 23s 1 S -R p 1920 o - F 29 23s 1 S -R p 1921 o - F 28 23s 1 S +R p 1917 1921 - Mar 1 0 1 S +R p 1917 1921 - O 14 24 0 - R p 1924 o - Ap 16 23s 1 S -R p 1924 o - O 14 23s 0 - +R p 1924 o - O 4 23s 0 - R p 1926 o - Ap 17 23s 1 S R p 1926 1929 - O Sa>=1 23s 0 - R p 1927 o - Ap 9 23s 1 S @@ -2136,8 +1349,9 @@ R p 1938 o - Mar 26 23s 1 S R p 1939 o - Ap 15 23s 1 S R p 1939 o - N 18 23s 0 - R p 1940 o - F 24 23s 1 S -R p 1940 1941 - O 5 23s 0 - +R p 1940 o - O 7 23s 0 - R p 1941 o - Ap 5 23s 1 S +R p 1941 o - O 5 23s 0 - R p 1942 1945 - Mar Sa>=8 23s 1 S R p 1942 o - Ap 25 22s 2 M R p 1942 o - Au 15 22s 1 S @@ -2147,52 +1361,16 @@ R p 1943 1945 - Au Sa>=25 22s 1 S R p 1944 1945 - Ap Sa>=21 22s 2 M R p 1946 o - Ap Sa>=1 23s 1 S R p 1946 o - O Sa>=1 23s 0 - -R p 1947 1965 - Ap Su>=1 2s 1 S +R p 1947 1966 - Ap Su>=1 2s 1 S R p 1947 1965 - O Su>=1 2s 0 - -R p 1977 o - Mar 27 0s 1 S -R p 1977 o - S 25 0s 0 - -R p 1978 1979 - Ap Su>=1 0s 1 S -R p 1978 o - O 1 0s 0 - -R p 1979 1982 - S lastSu 1s 0 - -R p 1980 o - Mar lastSu 0s 1 S -R p 1981 1982 - Mar lastSu 1s 1 S -R p 1983 o - Mar lastSu 2s 1 S -Z Europe/Lisbon -0:36:45 - LMT 1884 --0:36:45 - LMT 1912 Ja 1 0u -0 p WE%sT 1966 Ap 3 2 -1 - CET 1976 S 26 1 -0 p WE%sT 1983 S 25 1s -0 W- WE%sT 1992 S 27 1s -1 E CE%sT 1996 Mar 31 1u -0 E WE%sT -Z Atlantic/Azores -1:42:40 - LMT 1884 --1:54:32 - HMT 1912 Ja 1 2u --2 p -02/-01 1942 Ap 25 22s --2 p +00 1942 Au 15 22s --2 p -02/-01 1943 Ap 17 22s --2 p +00 1943 Au 28 22s --2 p -02/-01 1944 Ap 22 22s --2 p +00 1944 Au 26 22s --2 p -02/-01 1945 Ap 21 22s --2 p +00 1945 Au 25 22s --2 p -02/-01 1966 Ap 3 2 --1 p -01/+00 1983 S 25 1s --1 W- -01/+00 1992 S 27 1s -0 E WE%sT 1993 Mar 28 1u --1 E -01/+00 -Z Atlantic/Madeira -1:7:36 - LMT 1884 --1:7:36 - FMT 1912 Ja 1 1u --1 p -01/+00 1942 Ap 25 22s --1 p +01 1942 Au 15 22s --1 p -01/+00 1943 Ap 17 22s --1 p +01 1943 Au 28 22s --1 p -01/+00 1944 Ap 22 22s --1 p +01 1944 Au 26 22s --1 p -01/+00 1945 Ap 21 22s --1 p +01 1945 Au 25 22s --1 p -01/+00 1966 Ap 3 2 -0 p WE%sT 1983 S 25 1s -0 E WE%sT +R p 1976 o - S lastSu 1 0 - +R p 1977 o - Mar lastSu 0s 1 S +R p 1977 o - S lastSu 0s 0 - +R p 1978 1980 - Ap Su>=1 1s 1 S +R p 1978 o - O 1 1s 0 - +R p 1979 1980 - S lastSu 1s 0 - +R p 1981 1986 - Mar lastSu 0s 1 S +R p 1981 1985 - S lastSu 0s 0 - R z 1932 o - May 21 0s 1 S R z 1932 1939 - O Su>=1 0s 0 - R z 1933 1939 - Ap Su>=2 0s 1 S @@ -2202,252 +1380,6 @@ R z 1980 o - Ap 5 23 1 S R z 1980 o - S lastSu 1 0 - R z 1991 1993 - Mar lastSu 0s 1 S R z 1991 1993 - S lastSu 0s 0 - -Z Europe/Bucharest 1:44:24 - LMT 1891 O -1:44:24 - BMT 1931 Jul 24 -2 z EE%sT 1981 Mar 29 2s -2 c EE%sT 1991 -2 z EE%sT 1994 -2 e EE%sT 1997 -2 E EE%sT -Z Europe/Kaliningrad 1:22 - LMT 1893 Ap -1 c CE%sT 1945 Ap 10 -2 O EE%sT 1946 Ap 7 -3 R MSK/MSD 1989 Mar 26 2s -2 R EE%sT 2011 Mar 27 2s -3 - +03 2014 O 26 2s -2 - EET -Z Europe/Moscow 2:30:17 - LMT 1880 -2:30:17 - MMT 1916 Jul 3 -2:31:19 R %s 1919 Jul 1 0u -3 R %s 1921 O -3 R MSK/MSD 1922 O -2 - EET 1930 Jun 21 -3 R MSK/MSD 1991 Mar 31 2s -2 R EE%sT 1992 Ja 19 2s -3 R MSK/MSD 2011 Mar 27 2s -4 - MSK 2014 O 26 2s -3 - MSK -Z Europe/Simferopol 2:16:24 - LMT 1880 -2:16 - SMT 1924 May 2 -2 - EET 1930 Jun 21 -3 - MSK 1941 N -1 c CE%sT 1944 Ap 13 -3 R MSK/MSD 1990 -3 - MSK 1990 Jul 1 2 -2 - EET 1992 Mar 20 -2 c EE%sT 1994 May -3 c MSK/MSD 1996 Mar 31 0s -3 1 MSD 1996 O 27 3s -3 - MSK 1997 Mar lastSu 1u -2 E EE%sT 2014 Mar 30 2 -4 - MSK 2014 O 26 2s -3 - MSK -Z Europe/Astrakhan 3:12:12 - LMT 1924 May -3 - +03 1930 Jun 21 -4 R +04/+05 1989 Mar 26 2s -3 R +03/+04 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 2014 O 26 2s -3 - +03 2016 Mar 27 2s -4 - +04 -Z Europe/Volgograd 2:57:40 - LMT 1920 Ja 3 -3 - +03 1930 Jun 21 -4 - +04 1961 N 11 -4 R +04/+05 1988 Mar 27 2s -3 R MSK/MSD 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s -3 R MSK/MSD 2011 Mar 27 2s -4 - MSK 2014 O 26 2s -3 - MSK 2018 O 28 2s -4 - +04 2020 D 27 2s -3 - MSK -Z Europe/Saratov 3:4:18 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 R +04/+05 1988 Mar 27 2s -3 R +03/+04 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 2014 O 26 2s -3 - +03 2016 D 4 2s -4 - +04 -Z Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 R +04/+05 1989 Mar 26 2s -3 R MSK/MSD 1991 Mar 31 2s -4 - +04 1992 Mar 29 2s -3 R MSK/MSD 2011 Mar 27 2s -4 - MSK 2014 O 26 2s -3 - MSK -Z Europe/Samara 3:20:20 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 - +04 1935 Ja 27 -4 R +04/+05 1989 Mar 26 2s -3 R +03/+04 1991 Mar 31 2s -2 R +02/+03 1991 S 29 2s -3 - +03 1991 O 20 3 -4 R +04/+05 2010 Mar 28 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 -Z Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0u -3 - +03 1930 Jun 21 -4 R +04/+05 1989 Mar 26 2s -3 R +03/+04 1991 Mar 31 2s -2 R +02/+03 1992 Ja 19 2s -3 R +03/+04 2011 Mar 27 2s -4 - +04 2014 O 26 2s -3 - +03 2016 Mar 27 2s -4 - +04 -Z Asia/Yekaterinburg 4:2:33 - LMT 1916 Jul 3 -3:45:5 - PMT 1919 Jul 15 4 -4 - +04 1930 Jun 21 -5 R +05/+06 1991 Mar 31 2s -4 R +04/+05 1992 Ja 19 2s -5 R +05/+06 2011 Mar 27 2s -6 - +06 2014 O 26 2s -5 - +05 -Z Asia/Omsk 4:53:30 - LMT 1919 N 14 -5 - +05 1930 Jun 21 -6 R +06/+07 1991 Mar 31 2s -5 R +05/+06 1992 Ja 19 2s -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 -Z Asia/Barnaul 5:35 - LMT 1919 D 10 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 1995 May 28 -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 2016 Mar 27 2s -7 - +07 -Z Asia/Novosibirsk 5:31:40 - LMT 1919 D 14 6 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 1993 May 23 -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 2016 Jul 24 2s -7 - +07 -Z Asia/Tomsk 5:39:51 - LMT 1919 D 22 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 2002 May 1 3 -6 R +06/+07 2011 Mar 27 2s -7 - +07 2014 O 26 2s -6 - +06 2016 May 29 2s -7 - +07 -Z Asia/Novokuznetsk 5:48:48 - LMT 1924 May -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 2010 Mar 28 2s -6 R +06/+07 2011 Mar 27 2s -7 - +07 -Z Asia/Krasnoyarsk 6:11:26 - LMT 1920 Ja 6 -6 - +06 1930 Jun 21 -7 R +07/+08 1991 Mar 31 2s -6 R +06/+07 1992 Ja 19 2s -7 R +07/+08 2011 Mar 27 2s -8 - +08 2014 O 26 2s -7 - +07 -Z Asia/Irkutsk 6:57:5 - LMT 1880 -6:57:5 - IMT 1920 Ja 25 -7 - +07 1930 Jun 21 -8 R +08/+09 1991 Mar 31 2s -7 R +07/+08 1992 Ja 19 2s -8 R +08/+09 2011 Mar 27 2s -9 - +09 2014 O 26 2s -8 - +08 -Z Asia/Chita 7:33:52 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1991 Mar 31 2s -8 R +08/+09 1992 Ja 19 2s -9 R +09/+10 2011 Mar 27 2s -10 - +10 2014 O 26 2s -8 - +08 2016 Mar 27 2 -9 - +09 -Z Asia/Yakutsk 8:38:58 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1991 Mar 31 2s -8 R +08/+09 1992 Ja 19 2s -9 R +09/+10 2011 Mar 27 2s -10 - +10 2014 O 26 2s -9 - +09 -Z Asia/Vladivostok 8:47:31 - LMT 1922 N 15 -9 - +09 1930 Jun 21 -10 R +10/+11 1991 Mar 31 2s -9 R +09/+10 1992 Ja 19 2s -10 R +10/+11 2011 Mar 27 2s -11 - +11 2014 O 26 2s -10 - +10 -Z Asia/Khandyga 9:2:13 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1991 Mar 31 2s -8 R +08/+09 1992 Ja 19 2s -9 R +09/+10 2004 -10 R +10/+11 2011 Mar 27 2s -11 - +11 2011 S 13 0s -10 - +10 2014 O 26 2s -9 - +09 -Z Asia/Sakhalin 9:30:48 - LMT 1905 Au 23 -9 - +09 1945 Au 25 -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 1997 Mar lastSu 2s -10 R +10/+11 2011 Mar 27 2s -11 - +11 2014 O 26 2s -10 - +10 2016 Mar 27 2s -11 - +11 -Z Asia/Magadan 10:3:12 - LMT 1924 May 2 -10 - +10 1930 Jun 21 -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 2014 O 26 2s -10 - +10 2016 Ap 24 2s -11 - +11 -Z Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2 -10 - +10 1930 Jun 21 -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 2014 O 26 2s -11 - +11 -Z Asia/Ust-Nera 9:32:54 - LMT 1919 D 15 -8 - +08 1930 Jun 21 -9 R +09/+10 1981 Ap -11 R +11/+12 1991 Mar 31 2s -10 R +10/+11 1992 Ja 19 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 2011 S 13 0s -11 - +11 2014 O 26 2s -10 - +10 -Z Asia/Kamchatka 10:34:36 - LMT 1922 N 10 -11 - +11 1930 Jun 21 -12 R +12/+13 1991 Mar 31 2s -11 R +11/+12 1992 Ja 19 2s -12 R +12/+13 2010 Mar 28 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 -Z Asia/Anadyr 11:49:56 - LMT 1924 May 2 -12 - +12 1930 Jun 21 -13 R +13/+14 1982 Ap 1 0s -12 R +12/+13 1991 Mar 31 2s -11 R +11/+12 1992 Ja 19 2s -12 R +12/+13 2010 Mar 28 2s -11 R +11/+12 2011 Mar 27 2s -12 - +12 -Z Europe/Belgrade 1:22 - LMT 1884 -1 - CET 1941 Ap 18 23 -1 c CE%sT 1945 -1 - CET 1945 May 8 2s -1 1 CEST 1945 S 16 2s -1 - CET 1982 N 27 -1 E CE%sT R s 1918 o - Ap 15 23 1 S R s 1918 1919 - O 6 24s 0 - R s 1919 o - Ap 6 23 1 S @@ -2487,30 +1419,8 @@ R Sp 1976 o - Au 1 0 0 - R Sp 1977 o - S 28 0 0 - R Sp 1978 o - Jun 1 0 1 S R Sp 1978 o - Au 4 0 0 - -Z Europe/Madrid -0:14:44 - LMT 1901 Ja 1 0u -0 s WE%sT 1940 Mar 16 23 -1 s CE%sT 1979 -1 E CE%sT -Z Africa/Ceuta -0:21:16 - LMT 1901 Ja 1 0u -0 - WET 1918 May 6 23 -0 1 WEST 1918 O 7 23 -0 - WET 1924 -0 s WE%sT 1929 -0 - WET 1967 -0 Sp WE%sT 1984 Mar 16 -1 - CET 1986 -1 E CE%sT -Z Atlantic/Canary -1:1:36 - LMT 1922 Mar --1 - -01 1946 S 30 1 -0 - WET 1980 Ap 6 0s -0 1 WEST 1980 S 28 1u -0 E WE%sT R CH 1941 1942 - May M>=1 1 1 S R CH 1941 1942 - O M>=1 2 0 - -Z Europe/Zurich 0:34:8 - LMT 1853 Jul 16 -0:29:46 - BMT 1894 Jun -1 CH CE%sT 1981 -1 E CE%sT R T 1916 o - May 1 0 1 S R T 1916 o - O 1 0 0 - R T 1920 o - Mar 28 0 1 S @@ -2556,28 +1466,6 @@ R T 1986 1995 - S lastSu 1s 0 - R T 1994 o - Mar 20 1s 1 S R T 1995 2006 - Mar lastSu 1s 1 S R T 1996 2006 - O lastSu 1s 0 - -Z Europe/Istanbul 1:55:52 - LMT 1880 -1:56:56 - IMT 1910 O -2 T EE%sT 1978 Jun 29 -3 T +03/+04 1984 N 1 2 -2 T EE%sT 2007 -2 E EE%sT 2011 Mar 27 1u -2 - EET 2011 Mar 28 1u -2 E EE%sT 2014 Mar 30 1u -2 - EET 2014 Mar 31 1u -2 E EE%sT 2015 O 25 1u -2 1 EEST 2015 N 8 1u -2 E EE%sT 2016 S 7 -3 - +03 -Z Europe/Kyiv 2:2:4 - LMT 1880 -2:2:4 - KMT 1924 May 2 -2 - EET 1930 Jun 21 -3 - MSK 1941 S 20 -1 c CE%sT 1943 N 6 -3 R MSK/MSD 1990 Jul 1 2 -2 1 EEST 1991 S 29 3 -2 c EE%sT 1996 May 13 -2 E EE%sT R u 1918 1919 - Mar lastSu 2 1 D R u 1918 1919 - O lastSu 2 0 S R u 1942 o - F 9 2 1 W @@ -2591,172 +1479,34 @@ R u 1976 1986 - Ap lastSu 2 1 D R u 1987 2006 - Ap Su>=1 2 1 D R u 2007 ma - Mar Su>=8 2 1 D R u 2007 ma - N Su>=1 2 0 S -Z EST -5 - EST -Z MST -7 - MST -Z HST -10 - HST -Z EST5EDT -5 u E%sT -Z CST6CDT -6 u C%sT -Z MST7MDT -7 u M%sT -Z PST8PDT -8 u P%sT R NY 1920 o - Mar lastSu 2 1 D R NY 1920 o - O lastSu 2 0 S R NY 1921 1966 - Ap lastSu 2 1 D R NY 1921 1954 - S lastSu 2 0 S R NY 1955 1966 - O lastSu 2 0 S -Z America/New_York -4:56:2 - LMT 1883 N 18 17u --5 u E%sT 1920 --5 NY E%sT 1942 --5 u E%sT 1946 --5 NY E%sT 1967 --5 u E%sT R Ch 1920 o - Jun 13 2 1 D R Ch 1920 1921 - O lastSu 2 0 S R Ch 1921 o - Mar lastSu 2 1 D R Ch 1922 1966 - Ap lastSu 2 1 D R Ch 1922 1954 - S lastSu 2 0 S R Ch 1955 1966 - O lastSu 2 0 S -Z America/Chicago -5:50:36 - LMT 1883 N 18 18u --6 u C%sT 1920 --6 Ch C%sT 1936 Mar 1 2 --5 - EST 1936 N 15 2 --6 Ch C%sT 1942 --6 u C%sT 1946 --6 Ch C%sT 1967 --6 u C%sT -Z America/North_Dakota/Center -6:45:12 - LMT 1883 N 18 19u --7 u M%sT 1992 O 25 2 --6 u C%sT -Z America/North_Dakota/New_Salem -6:45:39 - LMT 1883 N 18 19u --7 u M%sT 2003 O 26 2 --6 u C%sT -Z America/North_Dakota/Beulah -6:47:7 - LMT 1883 N 18 19u --7 u M%sT 2010 N 7 2 --6 u C%sT R De 1920 1921 - Mar lastSu 2 1 D R De 1920 o - O lastSu 2 0 S R De 1921 o - May 22 2 0 S R De 1965 1966 - Ap lastSu 2 1 D R De 1965 1966 - O lastSu 2 0 S -Z America/Denver -6:59:56 - LMT 1883 N 18 19u --7 u M%sT 1920 --7 De M%sT 1942 --7 u M%sT 1946 --7 De M%sT 1967 --7 u M%sT R CA 1948 o - Mar 14 2:1 1 D R CA 1949 o - Ja 1 2 0 S R CA 1950 1966 - Ap lastSu 1 1 D R CA 1950 1961 - S lastSu 2 0 S R CA 1962 1966 - O lastSu 2 0 S -Z America/Los_Angeles -7:52:58 - LMT 1883 N 18 20u --8 u P%sT 1946 --8 CA P%sT 1967 --8 u P%sT -Z America/Juneau 15:2:19 - LMT 1867 O 19 15:33:32 --8:57:41 - LMT 1900 Au 20 12 --8 - PST 1942 --8 u P%sT 1946 --8 - PST 1969 --8 u P%sT 1980 Ap 27 2 --9 u Y%sT 1980 O 26 2 --8 u P%sT 1983 O 30 2 --9 u Y%sT 1983 N 30 --9 u AK%sT -Z America/Sitka 14:58:47 - LMT 1867 O 19 15:30 --9:1:13 - LMT 1900 Au 20 12 --8 - PST 1942 --8 u P%sT 1946 --8 - PST 1969 --8 u P%sT 1983 O 30 2 --9 u Y%sT 1983 N 30 --9 u AK%sT -Z America/Metlakatla 15:13:42 - LMT 1867 O 19 15:44:55 --8:46:18 - LMT 1900 Au 20 12 --8 - PST 1942 --8 u P%sT 1946 --8 - PST 1969 --8 u P%sT 1983 O 30 2 --8 - PST 2015 N 1 2 --9 u AK%sT 2018 N 4 2 --8 - PST 2019 Ja 20 2 --9 u AK%sT -Z America/Yakutat 14:41:5 - LMT 1867 O 19 15:12:18 --9:18:55 - LMT 1900 Au 20 12 --9 - YST 1942 --9 u Y%sT 1946 --9 - YST 1969 --9 u Y%sT 1983 N 30 --9 u AK%sT -Z America/Anchorage 14:0:24 - LMT 1867 O 19 14:31:37 --9:59:36 - LMT 1900 Au 20 12 --10 - AST 1942 --10 u A%sT 1967 Ap --10 - AHST 1969 --10 u AH%sT 1983 O 30 2 --9 u Y%sT 1983 N 30 --9 u AK%sT -Z America/Nome 12:58:22 - LMT 1867 O 19 13:29:35 --11:1:38 - LMT 1900 Au 20 12 --11 - NST 1942 --11 u N%sT 1946 --11 - NST 1967 Ap --11 - BST 1969 --11 u B%sT 1983 O 30 2 --9 u Y%sT 1983 N 30 --9 u AK%sT -Z America/Adak 12:13:22 - LMT 1867 O 19 12:44:35 --11:46:38 - LMT 1900 Au 20 12 --11 - NST 1942 --11 u N%sT 1946 --11 - NST 1967 Ap --11 - BST 1969 --11 u B%sT 1983 O 30 2 --10 u AH%sT 1983 N 30 --10 u H%sT -Z Pacific/Honolulu -10:31:26 - LMT 1896 Ja 13 12 --10:30 - HST 1933 Ap 30 2 --10:30 1 HDT 1933 May 21 12 --10:30 u H%sT 1947 Jun 8 2 --10 - HST -Z America/Phoenix -7:28:18 - LMT 1883 N 18 19u --7 u M%sT 1944 Ja 1 0:1 --7 - MST 1944 Ap 1 0:1 --7 u M%sT 1944 O 1 0:1 --7 - MST 1967 --7 u M%sT 1968 Mar 21 --7 - MST -Z America/Boise -7:44:49 - LMT 1883 N 18 20u --8 u P%sT 1923 May 13 2 --7 u M%sT 1974 --7 - MST 1974 F 3 2 --7 u M%sT R In 1941 o - Jun 22 2 1 D R In 1941 1954 - S lastSu 2 0 S R In 1946 1954 - Ap lastSu 2 1 D -Z America/Indiana/Indianapolis -5:44:38 - LMT 1883 N 18 18u --6 u C%sT 1920 --6 In C%sT 1942 --6 u C%sT 1946 --6 In C%sT 1955 Ap 24 2 --5 - EST 1957 S 29 2 --6 - CST 1958 Ap 27 2 --5 - EST 1969 --5 u E%sT 1971 --5 - EST 2006 --5 u E%sT R Ma 1951 o - Ap lastSu 2 1 D R Ma 1951 o - S lastSu 2 0 S R Ma 1954 1960 - Ap lastSu 2 1 D R Ma 1954 1960 - S lastSu 2 0 S -Z America/Indiana/Marengo -5:45:23 - LMT 1883 N 18 18u --6 u C%sT 1951 --6 Ma C%sT 1961 Ap 30 2 --5 - EST 1969 --5 u E%sT 1974 Ja 6 2 --6 1 CDT 1974 O 27 2 --5 u E%sT 1976 --5 - EST 2006 --5 u E%sT R V 1946 o - Ap lastSu 2 1 D R V 1946 o - S lastSu 2 0 S R V 1953 1954 - Ap lastSu 2 1 D @@ -2766,68 +1516,23 @@ R V 1956 1963 - Ap lastSu 2 1 D R V 1960 o - O lastSu 2 0 S R V 1961 o - S lastSu 2 0 S R V 1962 1963 - O lastSu 2 0 S -Z America/Indiana/Vincennes -5:50:7 - LMT 1883 N 18 18u --6 u C%sT 1946 --6 V C%sT 1964 Ap 26 2 --5 - EST 1969 --5 u E%sT 1971 --5 - EST 2006 Ap 2 2 --6 u C%sT 2007 N 4 2 --5 u E%sT R Pe 1955 o - May 1 0 1 D R Pe 1955 1960 - S lastSu 2 0 S R Pe 1956 1963 - Ap lastSu 2 1 D R Pe 1961 1963 - O lastSu 2 0 S -Z America/Indiana/Tell_City -5:47:3 - LMT 1883 N 18 18u --6 u C%sT 1946 --6 Pe C%sT 1964 Ap 26 2 --5 - EST 1967 O 29 2 --6 u C%sT 1969 Ap 27 2 --5 u E%sT 1971 --5 - EST 2006 Ap 2 2 --6 u C%sT R Pi 1955 o - May 1 0 1 D R Pi 1955 1960 - S lastSu 2 0 S R Pi 1956 1964 - Ap lastSu 2 1 D R Pi 1961 1964 - O lastSu 2 0 S -Z America/Indiana/Petersburg -5:49:7 - LMT 1883 N 18 18u --6 u C%sT 1955 --6 Pi C%sT 1965 Ap 25 2 --5 - EST 1966 O 30 2 --6 u C%sT 1977 O 30 2 --5 - EST 2006 Ap 2 2 --6 u C%sT 2007 N 4 2 --5 u E%sT R St 1947 1961 - Ap lastSu 2 1 D R St 1947 1954 - S lastSu 2 0 S R St 1955 1956 - O lastSu 2 0 S R St 1957 1958 - S lastSu 2 0 S R St 1959 1961 - O lastSu 2 0 S -Z America/Indiana/Knox -5:46:30 - LMT 1883 N 18 18u --6 u C%sT 1947 --6 St C%sT 1962 Ap 29 2 --5 - EST 1963 O 27 2 --6 u C%sT 1991 O 27 2 --5 - EST 2006 Ap 2 2 --6 u C%sT R Pu 1946 1960 - Ap lastSu 2 1 D R Pu 1946 1954 - S lastSu 2 0 S R Pu 1955 1956 - O lastSu 2 0 S R Pu 1957 1960 - S lastSu 2 0 S -Z America/Indiana/Winamac -5:46:25 - LMT 1883 N 18 18u --6 u C%sT 1946 --6 Pu C%sT 1961 Ap 30 2 --5 - EST 1969 --5 u E%sT 1971 --5 - EST 2006 Ap 2 2 --6 u C%sT 2007 Mar 11 2 --5 u E%sT -Z America/Indiana/Vevay -5:40:16 - LMT 1883 N 18 18u --6 u C%sT 1954 Ap 25 2 --5 - EST 1969 --5 u E%sT 1973 --5 - EST 2006 --5 u E%sT R v 1921 o - May 1 2 1 D R v 1921 o - S 1 2 0 S R v 1941 o - Ap lastSu 2 1 D @@ -2837,41 +1542,12 @@ R v 1946 o - Jun 2 2 0 S R v 1950 1961 - Ap lastSu 2 1 D R v 1950 1955 - S lastSu 2 0 S R v 1956 1961 - O lastSu 2 0 S -Z America/Kentucky/Louisville -5:43:2 - LMT 1883 N 18 18u --6 u C%sT 1921 --6 v C%sT 1942 --6 u C%sT 1946 --6 v C%sT 1961 Jul 23 2 --5 - EST 1968 --5 u E%sT 1974 Ja 6 2 --6 1 CDT 1974 O 27 2 --5 u E%sT -Z America/Kentucky/Monticello -5:39:24 - LMT 1883 N 18 18u --6 u C%sT 1946 --6 - CST 1968 --6 u C%sT 2000 O 29 2 --5 u E%sT R Dt 1948 o - Ap lastSu 2 1 D R Dt 1948 o - S lastSu 2 0 S -Z America/Detroit -5:32:11 - LMT 1905 --6 - CST 1915 May 15 2 --5 - EST 1942 --5 u E%sT 1946 --5 Dt E%sT 1967 Jun 14 0:1 --5 u E%sT 1969 --5 - EST 1973 --5 u E%sT 1975 --5 - EST 1975 Ap 27 2 --5 u E%sT R Me 1946 o - Ap lastSu 2 1 D R Me 1946 o - S lastSu 2 0 S R Me 1966 o - Ap lastSu 2 1 D R Me 1966 o - O lastSu 2 0 S -Z America/Menominee -5:50:27 - LMT 1885 S 18 12 --6 u C%sT 1946 --6 Me C%sT 1969 Ap 27 2 --5 - EST 1973 Ap 29 2 --6 u C%sT R C 1918 o - Ap 14 2 1 D R C 1918 o - O 27 2 0 S R C 1942 o - F 9 2 1 W @@ -2901,24 +1577,6 @@ R j 1988 o - Ap Su>=1 0:1 2 DD R j 1989 2006 - Ap Su>=1 0:1 1 D R j 2007 2011 - Mar Su>=8 0:1 1 D R j 2007 2010 - N Su>=1 0:1 0 S -Z America/St_Johns -3:30:52 - LMT 1884 --3:30:52 j N%sT 1918 --3:30:52 C N%sT 1919 --3:30:52 j N%sT 1935 Mar 30 --3:30 j N%sT 1942 May 11 --3:30 C N%sT 1946 --3:30 j N%sT 2011 N --3:30 C N%sT -Z America/Goose_Bay -4:1:40 - LMT 1884 --3:30:52 - NST 1918 --3:30:52 C N%sT 1919 --3:30:52 - NST 1935 Mar 30 --3:30 - NST 1936 --3:30 j N%sT 1942 May 11 --3:30 C N%sT 1946 --3:30 j N%sT 1966 Mar 15 2 --4 j A%sT 2011 N --4 C A%sT R H 1916 o - Ap 1 0 1 D R H 1916 o - O 1 0 0 S R H 1920 o - May 9 0 1 D @@ -2960,19 +1618,6 @@ R H 1956 1959 - Ap lastSu 2 1 D R H 1956 1959 - S lastSu 2 0 S R H 1962 1973 - Ap lastSu 2 1 D R H 1962 1973 - O lastSu 2 0 S -Z America/Halifax -4:14:24 - LMT 1902 Jun 15 --4 H A%sT 1918 --4 C A%sT 1919 --4 H A%sT 1942 F 9 2s --4 C A%sT 1946 --4 H A%sT 1974 --4 C A%sT -Z America/Glace_Bay -3:59:48 - LMT 1902 Jun 15 --4 C A%sT 1953 --4 H A%sT 1954 --4 - AST 1972 --4 H A%sT 1974 --4 C A%sT R o 1933 1935 - Jun Su>=8 1 1 D R o 1933 1935 - S Su>=8 1 0 S R o 1936 1938 - Jun Su>=1 1 1 D @@ -2986,15 +1631,6 @@ R o 1946 1956 - S lastSu 2 0 S R o 1957 1972 - O lastSu 2 0 S R o 1993 2006 - Ap Su>=1 0:1 1 D R o 1993 2006 - O lastSu 0:1 0 S -Z America/Moncton -4:19:8 - LMT 1883 D 9 --5 - EST 1902 Jun 15 --4 C A%sT 1933 --4 o A%sT 1942 --4 C A%sT 1946 --4 o A%sT 1973 --4 C A%sT 1993 --4 o A%sT 2007 --4 C A%sT R t 1919 o - Mar 30 23:30 1 D R t 1919 o - O 26 0 0 S R t 1920 o - May 2 2 1 D @@ -3008,21 +1644,11 @@ R t 1927 1937 - S Su>=25 2 0 S R t 1928 1937 - Ap Su>=25 2 1 D R t 1938 1940 - Ap lastSu 2 1 D R t 1938 1939 - S lastSu 2 0 S -R t 1945 1946 - S lastSu 2 0 S -R t 1946 o - Ap lastSu 2 1 D -R t 1947 1949 - Ap lastSu 0 1 D -R t 1947 1948 - S lastSu 0 0 S -R t 1949 o - N lastSu 0 0 S -R t 1950 1973 - Ap lastSu 2 1 D -R t 1950 o - N lastSu 2 0 S +R t 1945 1948 - S lastSu 2 0 S +R t 1946 1973 - Ap lastSu 2 1 D +R t 1949 1950 - N lastSu 2 0 S R t 1951 1956 - S lastSu 2 0 S R t 1957 1973 - O lastSu 2 0 S -Z America/Toronto -5:17:32 - LMT 1895 --5 C E%sT 1919 --5 t E%sT 1942 F 9 2s --5 C E%sT 1946 --5 t E%sT 1974 --5 C E%sT R W 1916 o - Ap 23 0 1 D R W 1916 o - S 17 0 0 S R W 1918 o - Ap 14 2 1 D @@ -3047,9 +1673,6 @@ R W 1963 o - S 22 2 0 S R W 1966 1986 - Ap lastSu 2s 1 D R W 1966 2005 - O lastSu 2s 0 S R W 1987 2005 - Ap Su>=1 2s 1 D -Z America/Winnipeg -6:28:36 - LMT 1887 Jul 16 --6 W C%sT 2006 --6 C C%sT R r 1918 o - Ap 14 2 1 D R r 1918 o - O 27 2 0 S R r 1930 1934 - May Su>=1 0 1 D @@ -3072,14 +1695,6 @@ R Sw 1957 o - O lastSu 2 0 S R Sw 1959 1961 - Ap lastSu 2 1 D R Sw 1959 o - O lastSu 2 0 S R Sw 1960 1961 - S lastSu 2 0 S -Z America/Regina -6:58:36 - LMT 1905 S --7 r M%sT 1960 Ap lastSu 2 --6 - CST -Z America/Swift_Current -7:11:20 - LMT 1905 S --7 C M%sT 1946 Ap lastSu 2 --7 r M%sT 1950 --7 Sw M%sT 1972 Ap lastSu 2 --6 - CST R Ed 1918 1919 - Ap Su>=8 2 1 D R Ed 1918 o - O 27 2 0 S R Ed 1919 o - May 27 2 0 S @@ -3093,9 +1708,6 @@ R Ed 1947 o - Ap lastSu 2 1 D R Ed 1947 o - S lastSu 2 0 S R Ed 1972 1986 - Ap lastSu 2 1 D R Ed 1972 2006 - O lastSu 2 0 S -Z America/Edmonton -7:33:52 - LMT 1906 S --7 Ed M%sT 1987 --7 C M%sT R Va 1918 o - Ap 14 2 1 D R Va 1918 o - O 27 2 0 S R Va 1942 o - F 9 2 1 W @@ -3105,19 +1717,6 @@ R Va 1946 1986 - Ap lastSu 2 1 D R Va 1946 o - S 29 2 0 S R Va 1947 1961 - S lastSu 2 0 S R Va 1962 2006 - O lastSu 2 0 S -Z America/Vancouver -8:12:28 - LMT 1884 --8 Va P%sT 1987 --8 C P%sT -Z America/Dawson_Creek -8:0:56 - LMT 1884 --8 C P%sT 1947 --8 Va P%sT 1972 Au 30 2 --7 - MST -Z America/Fort_Nelson -8:10:47 - LMT 1884 --8 Va P%sT 1946 --8 - PST 1947 --8 Va P%sT 1987 --8 C P%sT 2015 Mar 8 2 --7 - MST R Y 1918 o - Ap 14 2 1 D R Y 1918 o - O 27 2 0 S R Y 1919 o - May 25 2 1 D @@ -3130,43 +1729,7 @@ R Y 1972 2006 - O lastSu 2 0 S R Y 1987 2006 - Ap Su>=1 2 1 D R Yu 1965 o - Ap lastSu 0 2 DD R Yu 1965 o - O lastSu 2 0 S -Z America/Iqaluit 0 - -00 1942 Au --5 Y E%sT 1999 O 31 2 --6 C C%sT 2000 O 29 2 --5 C E%sT -Z America/Resolute 0 - -00 1947 Au 31 --6 Y C%sT 2000 O 29 2 --5 - EST 2001 Ap 1 3 --6 C C%sT 2006 O 29 2 --5 - EST 2007 Mar 11 3 --6 C C%sT -Z America/Rankin_Inlet 0 - -00 1957 --6 Y C%sT 2000 O 29 2 --5 - EST 2001 Ap 1 3 --6 C C%sT -Z America/Cambridge_Bay 0 - -00 1920 --7 Y M%sT 1999 O 31 2 --6 C C%sT 2000 O 29 2 --5 - EST 2000 N 5 --6 - CST 2001 Ap 1 3 --7 C M%sT -Z America/Inuvik 0 - -00 1953 --8 Y P%sT 1979 Ap lastSu 2 --7 Y M%sT 1980 --7 C M%sT -Z America/Whitehorse -9:0:12 - LMT 1900 Au 20 --9 Y Y%sT 1965 --9 Yu Y%sT 1966 F 27 --8 - PST 1980 --8 C P%sT 2020 N --7 - MST -Z America/Dawson -9:17:40 - LMT 1900 Au 20 --9 Y Y%sT 1965 --9 Yu Y%sT 1973 O 28 --8 - PST 1980 --8 C P%sT 2020 N --7 - MST -R m 1931 o - May 1 23 1 D +R m 1931 o - Ap 30 0 1 D R m 1931 o - O 1 0 0 S R m 1939 o - F 5 0 1 D R m 1939 o - Jun 25 0 0 S @@ -3182,107 +1745,6 @@ R m 2001 o - May Su>=1 2 1 D R m 2001 o - S lastSu 2 0 S R m 2002 2022 - Ap Su>=1 2 1 D R m 2002 2022 - O lastSu 2 0 S -Z America/Cancun -5:47:4 - LMT 1922 Ja 1 6u --6 - CST 1981 D 23 --5 m E%sT 1998 Au 2 2 --6 m C%sT 2015 F 1 2 --5 - EST -Z America/Merida -5:58:28 - LMT 1922 Ja 1 6u --6 - CST 1981 D 23 --5 - EST 1982 D 2 --6 m C%sT -Z America/Matamoros -6:30 - LMT 1922 Ja 1 6u --6 - CST 1988 --6 u C%sT 1989 --6 m C%sT 2010 --6 u C%sT -Z America/Monterrey -6:41:16 - LMT 1922 Ja 1 6u --6 - CST 1988 --6 u C%sT 1989 --6 m C%sT -Z America/Mexico_City -6:36:36 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 m C%sT 2001 S 30 2 --6 - CST 2002 F 20 --6 m C%sT -Z America/Ciudad_Juarez -7:5:56 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 - CST 1996 --6 m C%sT 1998 --6 - CST 1998 Ap Su>=1 3 --7 m M%sT 2010 --7 u M%sT 2022 O 30 2 --6 - CST 2022 N 30 --7 u M%sT -Z America/Ojinaga -6:57:40 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 - CST 1996 --6 m C%sT 1998 --6 - CST 1998 Ap Su>=1 3 --7 m M%sT 2010 --7 u M%sT 2022 O 30 2 --6 - CST 2022 N 30 --6 u C%sT -Z America/Chihuahua -7:4:20 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 - CST 1996 --6 m C%sT 1998 --6 - CST 1998 Ap Su>=1 3 --7 m M%sT 2022 O 30 2 --6 - CST -Z America/Hermosillo -7:23:52 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 - CST 1942 Ap 24 --7 - MST 1949 Ja 14 --8 - PST 1970 --7 m M%sT 1999 --7 - MST -Z America/Mazatlan -7:5:40 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 - CST 1942 Ap 24 --7 - MST 1949 Ja 14 --8 - PST 1970 --7 m M%sT -Z America/Bahia_Banderas -7:1 - LMT 1922 Ja 1 7u --7 - MST 1927 Jun 10 23 --6 - CST 1930 N 15 --7 m M%sT 1932 Ap --6 - CST 1942 Ap 24 --7 - MST 1949 Ja 14 --8 - PST 1970 --7 m M%sT 2010 Ap 4 2 --6 m C%sT -Z America/Tijuana -7:48:4 - LMT 1922 Ja 1 7u --7 - MST 1924 --8 - PST 1927 Jun 10 23 --7 - MST 1930 N 15 --8 - PST 1931 Ap --8 1 PDT 1931 S 30 --8 - PST 1942 Ap 24 --8 1 PWT 1945 Au 14 23u --8 1 PPT 1945 N 12 --8 - PST 1948 Ap 5 --8 1 PDT 1949 Ja 14 --8 - PST 1954 --8 CA P%sT 1961 --8 - PST 1976 --8 u P%sT 1996 --8 m P%sT 2001 --8 u P%sT 2002 F 20 --8 m P%sT 2010 --8 u P%sT R BB 1942 o - Ap 19 5u 1 D R BB 1942 o - Au 31 6u 0 S R BB 1943 o - May 2 5u 1 D @@ -3294,10 +1756,6 @@ R BB 1977 1978 - O Su>=1 2 0 S R BB 1978 1980 - Ap Su>=15 2 1 D R BB 1979 o - S 30 2 0 S R BB 1980 o - S 25 2 0 S -Z America/Barbados -3:58:29 - LMT 1911 Au 28 --4 BB A%sT 1944 --4 BB AST/-0330 1945 --4 BB A%sT R BZ 1918 1941 - O Sa>=1 24 0:30 -0530 R BZ 1919 1942 - F Sa>=8 24 0 CST R BZ 1942 o - Jun 27 24 1 CWT @@ -3309,8 +1767,6 @@ R BZ 1973 o - D 5 0 1 CDT R BZ 1974 o - F 9 0 0 CST R BZ 1982 o - D 18 0 1 CDT R BZ 1983 o - F 12 0 0 CST -Z America/Belize -5:52:48 - LMT 1912 Ap --6 BZ %s R Be 1917 o - Ap 5 24 1 - R Be 1917 o - S 30 24 0 - R Be 1918 o - Ap 13 24 1 - @@ -3327,19 +1783,11 @@ R Be 1948 1952 - May Su>=22 2 1 D R Be 1948 1952 - S Su>=1 2 0 S R Be 1956 o - May Su>=22 2 1 D R Be 1956 o - O lastSu 2 0 S -Z Atlantic/Bermuda -4:19:18 - LMT 1890 --4:19:18 Be BMT/BST 1930 Ja 1 2 --4 Be A%sT 1974 Ap 28 2 --4 C A%sT 1976 --4 u A%sT R CR 1979 1980 - F lastSu 0 1 D R CR 1979 1980 - Jun Su>=1 0 0 S R CR 1991 1992 - Ja Sa>=15 0 1 D R CR 1991 o - Jul 1 0 0 S R CR 1992 o - Mar 15 0 0 S -Z America/Costa_Rica -5:36:13 - LMT 1890 --5:36:13 - SJMT 1921 Ja 15 --6 CR C%sT R Q 1928 o - Jun 10 0 1 D R Q 1928 o - O 10 0 0 S R Q 1940 1942 - Jun Su>=1 0 1 D @@ -3379,25 +1827,14 @@ R Q 2011 o - N 13 0s 0 S R Q 2012 o - Ap 1 0s 1 D R Q 2012 ma - N Su>=1 0s 0 S R Q 2013 ma - Mar Su>=8 0s 1 D -Z America/Havana -5:29:28 - LMT 1890 --5:29:36 - HMT 1925 Jul 19 12 --5 Q C%sT R DO 1966 o - O 30 0 1 EDT R DO 1967 o - F 28 0 0 EST R DO 1969 1973 - O lastSu 0 0:30 -0430 R DO 1970 o - F 21 0 0 EST R DO 1971 o - Ja 20 0 0 EST R DO 1972 1974 - Ja 21 0 0 EST -Z America/Santo_Domingo -4:39:36 - LMT 1890 --4:40 - SDMT 1933 Ap 1 12 --5 DO %s 1974 O 27 --4 - AST 2000 O 29 2 --5 u E%sT 2000 D 3 1 --4 - AST R SV 1987 1988 - May Su>=1 0 1 D R SV 1987 1988 - S lastSu 0 0 S -Z America/El_Salvador -5:56:48 - LMT 1921 --6 SV C%sT R GT 1973 o - N 25 0 1 D R GT 1974 o - F 24 0 0 S R GT 1983 o - May 21 0 1 D @@ -3406,8 +1843,6 @@ R GT 1991 o - Mar 23 0 1 D R GT 1991 o - S 7 0 0 S R GT 2006 o - Ap 30 0 1 D R GT 2006 o - O 1 0 0 S -Z America/Guatemala -6:2:4 - LMT 1918 O 5 --6 GT C%sT R HT 1983 o - May 8 0 1 D R HT 1984 1987 - Ap lastSu 0 1 D R HT 1983 1987 - O lastSu 0 0 S @@ -3419,57 +1854,16 @@ R HT 2012 2015 - Mar Su>=8 2 1 D R HT 2012 2015 - N Su>=1 2 0 S R HT 2017 ma - Mar Su>=8 2 1 D R HT 2017 ma - N Su>=1 2 0 S -Z America/Port-au-Prince -4:49:20 - LMT 1890 --4:49 - PPMT 1917 Ja 24 12 --5 HT E%sT R HN 1987 1988 - May Su>=1 0 1 D R HN 1987 1988 - S lastSu 0 0 S R HN 2006 o - May Su>=1 0 1 D R HN 2006 o - Au M>=1 0 0 S -Z America/Tegucigalpa -5:48:52 - LMT 1921 Ap --6 HN C%sT -Z America/Jamaica -5:7:10 - LMT 1890 --5:7:10 - KMT 1912 F --5 - EST 1974 --5 u E%sT 1984 --5 - EST -Z America/Martinique -4:4:20 - LMT 1890 --4:4:20 - FFMT 1911 May --4 - AST 1980 Ap 6 --4 1 ADT 1980 S 28 --4 - AST R NI 1979 1980 - Mar Su>=16 0 1 D R NI 1979 1980 - Jun M>=23 0 0 S R NI 2005 o - Ap 10 0 1 D R NI 2005 o - O Su>=1 0 0 S R NI 2006 o - Ap 30 2 1 D R NI 2006 o - O Su>=1 1 0 S -Z America/Managua -5:45:8 - LMT 1890 --5:45:12 - MMT 1934 Jun 23 --6 - CST 1973 May --5 - EST 1975 F 16 --6 NI C%sT 1992 Ja 1 4 --5 - EST 1992 S 24 --6 - CST 1993 --5 - EST 1997 --6 NI C%sT -Z America/Panama -5:18:8 - LMT 1890 --5:19:36 - CMT 1908 Ap 22 --5 - EST -Z America/Puerto_Rico -4:24:25 - LMT 1899 Mar 28 12 --4 - AST 1942 May 3 --4 u A%sT 1946 --4 - AST -Z America/Miquelon -3:44:40 - LMT 1911 May 15 --4 - AST 1980 May --3 - -03 1987 --3 C -03/-02 -Z America/Grand_Turk -4:44:32 - LMT 1890 --5:7:10 - KMT 1912 F --5 - EST 1979 --5 u E%sT 2015 Mar 8 2 --4 - AST 2018 Mar 11 3 --5 u E%sT R A 1930 o - D 1 0 1 - R A 1931 o - Ap 1 0 0 - R A 1931 o - O 15 0 1 - @@ -3499,150 +1893,8 @@ R A 2000 o - Mar 3 0 0 - R A 2007 o - D 30 0 1 - R A 2008 2009 - Mar Su>=15 0 0 - R A 2008 o - O Su>=15 0 1 - -Z America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 -Z America/Argentina/Cordoba -4:16:48 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 -Z America/Argentina/Salta -4:21:40 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/Argentina/Tucuman -4:20:52 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 13 --3 A -03/-02 -Z America/Argentina/La_Rioja -4:27:24 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar --4 - -04 1991 May 7 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/Argentina/San_Juan -4:34:4 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar --4 - -04 1991 May 7 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 May 31 --4 - -04 2004 Jul 25 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/Argentina/Jujuy -4:21:12 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1990 Mar 4 --4 - -04 1990 O 28 --4 1 -03 1991 Mar 17 --4 - -04 1991 O 6 --3 1 -02 1992 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/Argentina/Catamarca -4:23:8 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1991 Mar 3 --4 - -04 1991 O 20 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/Argentina/Mendoza -4:35:16 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1990 Mar 4 --4 - -04 1990 O 15 --4 1 -03 1991 Mar --4 - -04 1991 O 15 --4 1 -03 1992 Mar --4 - -04 1992 O 18 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 May 23 --4 - -04 2004 S 26 --3 A -03/-02 2008 O 18 --3 - -03 R Sa 2008 2009 - Mar Su>=8 0 0 - R Sa 2007 2008 - O Su>=8 0 1 - -Z America/Argentina/San_Luis -4:25:24 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1990 --3 1 -02 1990 Mar 14 --4 - -04 1990 O 15 --4 1 -03 1991 Mar --4 - -04 1991 Jun --3 - -03 1999 O 3 --4 1 -03 2000 Mar 3 --3 - -03 2004 May 31 --4 - -04 2004 Jul 25 --3 A -03/-02 2008 Ja 21 --4 Sa -04/-03 2009 O 11 --3 - -03 -Z America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 Jun --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/Argentina/Ushuaia -4:33:12 - LMT 1894 O 31 --4:16:48 - CMT 1920 May --4 - -04 1930 D --4 A -04/-03 1969 O 5 --3 A -03/-02 1999 O 3 --4 A -04/-03 2000 Mar 3 --3 - -03 2004 May 30 --4 - -04 2004 Jun 20 --3 A -03/-02 2008 O 18 --3 - -03 -Z America/La_Paz -4:32:36 - LMT 1890 --4:32:36 - CMT 1931 O 15 --4:32:36 1 BST 1932 Mar 21 --4 - -04 R B 1931 o - O 3 11 1 - R B 1932 1933 - Ap 1 0 0 - R B 1932 o - O 3 0 1 - @@ -3700,90 +1952,6 @@ R B 2013 2014 - F Su>=15 0 0 - R B 2015 o - F Su>=22 0 0 - R B 2016 2019 - F Su>=15 0 0 - R B 2018 o - N Su>=1 0 1 - -Z America/Noronha -2:9:40 - LMT 1914 --2 B -02/-01 1990 S 17 --2 - -02 1999 S 30 --2 B -02/-01 2000 O 15 --2 - -02 2001 S 13 --2 B -02/-01 2002 O --2 - -02 -Z America/Belem -3:13:56 - LMT 1914 --3 B -03/-02 1988 S 12 --3 - -03 -Z America/Santarem -3:38:48 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 2008 Jun 24 --3 - -03 -Z America/Fortaleza -2:34 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1999 S 30 --3 B -03/-02 2000 O 22 --3 - -03 2001 S 13 --3 B -03/-02 2002 O --3 - -03 -Z America/Recife -2:19:36 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1999 S 30 --3 B -03/-02 2000 O 15 --3 - -03 2001 S 13 --3 B -03/-02 2002 O --3 - -03 -Z America/Araguaina -3:12:48 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1995 S 14 --3 B -03/-02 2003 S 24 --3 - -03 2012 O 21 --3 B -03/-02 2013 S --3 - -03 -Z America/Maceio -2:22:52 - LMT 1914 --3 B -03/-02 1990 S 17 --3 - -03 1995 O 13 --3 B -03/-02 1996 S 4 --3 - -03 1999 S 30 --3 B -03/-02 2000 O 22 --3 - -03 2001 S 13 --3 B -03/-02 2002 O --3 - -03 -Z America/Bahia -2:34:4 - LMT 1914 --3 B -03/-02 2003 S 24 --3 - -03 2011 O 16 --3 B -03/-02 2012 O 21 --3 - -03 -Z America/Sao_Paulo -3:6:28 - LMT 1914 --3 B -03/-02 1963 O 23 --3 1 -02 1964 --3 B -03/-02 -Z America/Campo_Grande -3:38:28 - LMT 1914 --4 B -04/-03 -Z America/Cuiaba -3:44:20 - LMT 1914 --4 B -04/-03 2003 S 24 --4 - -04 2004 O --4 B -04/-03 -Z America/Porto_Velho -4:15:36 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 -Z America/Boa_Vista -4:2:40 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 1999 S 30 --4 B -04/-03 2000 O 15 --4 - -04 -Z America/Manaus -4:0:4 - LMT 1914 --4 B -04/-03 1988 S 12 --4 - -04 1993 S 28 --4 B -04/-03 1994 S 22 --4 - -04 -Z America/Eirunepe -4:39:28 - LMT 1914 --5 B -05/-04 1988 S 12 --5 - -05 1993 S 28 --5 B -05/-04 1994 S 22 --5 - -05 2008 Jun 24 --4 - -04 2013 N 10 --5 - -05 -Z America/Rio_Branco -4:31:12 - LMT 1914 --5 B -05/-04 1988 S 12 --5 - -05 2008 Jun 24 --4 - -04 2013 N 10 --5 - -05 R x 1927 1931 - S 1 0 1 - R x 1928 1932 - Ap 1 0 0 - R x 1968 o - N 3 4u 1 - @@ -3820,56 +1988,10 @@ R x 2019 ma - Ap Su>=2 3u 0 - R x 2019 2021 - S Su>=2 4u 1 - R x 2022 o - S Su>=9 4u 1 - R x 2023 ma - S Su>=2 4u 1 - -Z America/Santiago -4:42:45 - LMT 1890 --4:42:45 - SMT 1910 Ja 10 --5 - -05 1916 Jul --4:42:45 - SMT 1918 S 10 --4 - -04 1919 Jul --4:42:45 - SMT 1927 S --5 x -05/-04 1932 S --4 - -04 1942 Jun --5 - -05 1942 Au --4 - -04 1946 Jul 14 24 --4 1 -03 1946 Au 28 24 --5 1 -04 1947 Mar 31 24 --5 - -05 1947 May 21 23 --4 x -04/-03 -Z America/Punta_Arenas -4:43:40 - LMT 1890 --4:42:45 - SMT 1910 Ja 10 --5 - -05 1916 Jul --4:42:45 - SMT 1918 S 10 --4 - -04 1919 Jul --4:42:45 - SMT 1927 S --5 x -05/-04 1932 S --4 - -04 1942 Jun --5 - -05 1942 Au --4 - -04 1946 Au 28 24 --5 1 -04 1947 Mar 31 24 --5 - -05 1947 May 21 23 --4 x -04/-03 2016 D 4 --3 - -03 -Z Pacific/Easter -7:17:28 - LMT 1890 --7:17:28 - EMT 1932 S --7 x -07/-06 1982 Mar 14 3u --6 x -06/-05 -Z Antarctica/Palmer 0 - -00 1965 --4 A -04/-03 1969 O 5 --3 A -03/-02 1982 May --4 x -04/-03 2016 D 4 --3 - -03 R CO 1992 o - May 3 0 1 - R CO 1993 o - F 6 24 0 - -Z America/Bogota -4:56:16 - LMT 1884 Mar 13 --4:56:16 - BMT 1914 N 23 --5 CO -05/-04 R EC 1992 o - N 28 0 1 - R EC 1993 o - F 5 0 0 - -Z America/Guayaquil -5:19:20 - LMT 1890 --5:14 - QMT 1931 --5 EC -05/-04 -Z Pacific/Galapagos -5:58:24 - LMT 1931 --5 - -05 1986 --6 EC -06/-05 R FK 1937 1938 - S lastSu 0 1 - R FK 1938 1942 - Mar Su>=19 0 0 - R FK 1939 o - O 1 0 1 - @@ -3882,20 +2004,6 @@ R FK 1985 2000 - S Su>=9 0 1 - R FK 1986 2000 - Ap Su>=16 0 0 - R FK 2001 2010 - Ap Su>=15 2 0 - R FK 2001 2010 - S Su>=1 2 1 - -Z Atlantic/Stanley -3:51:24 - LMT 1890 --3:51:24 - SMT 1912 Mar 12 --4 FK -04/-03 1983 May --3 FK -03/-02 1985 S 15 --4 FK -04/-03 2010 S 5 2 --3 - -03 -Z America/Cayenne -3:29:20 - LMT 1911 Jul --4 - -04 1967 O --3 - -03 -Z America/Guyana -3:52:39 - LMT 1911 Au --4 - -04 1915 Mar --3:45 - -0345 1975 Au --3 - -03 1992 Mar 29 1 --4 - -04 R y 1975 1988 - O 1 0 1 - R y 1975 1978 - Mar 1 0 0 - R y 1979 1991 - Ap 1 0 0 - @@ -3915,14 +2023,9 @@ R y 2002 2004 - Ap Su>=1 0 0 - R y 2002 2003 - S Su>=1 0 1 - R y 2004 2009 - O Su>=15 0 1 - R y 2005 2009 - Mar Su>=8 0 0 - -R y 2010 ma - O Su>=1 0 1 - +R y 2010 2024 - O Su>=1 0 1 - R y 2010 2012 - Ap Su>=8 0 0 - -R y 2013 ma - Mar Su>=22 0 0 - -Z America/Asuncion -3:50:40 - LMT 1890 --3:50:40 - AMT 1931 O 10 --4 - -04 1972 O --3 - -03 1974 Ap --4 y -04/-03 +R y 2013 2024 - Mar Su>=22 0 0 - R PE 1938 o - Ja 1 0 1 - R PE 1938 o - Ap 1 0 0 - R PE 1938 1939 - S lastSu 0 1 - @@ -3933,16 +2036,6 @@ R PE 1990 o - Ja 1 0 1 - R PE 1990 o - Ap 1 0 0 - R PE 1994 o - Ja 1 0 1 - R PE 1994 o - Ap 1 0 0 - -Z America/Lima -5:8:12 - LMT 1890 --5:8:36 - LMT 1908 Jul 28 --5 PE -05/-04 -Z Atlantic/South_Georgia -2:26:8 - LMT 1890 --2 - -02 -Z America/Paramaribo -3:40:40 - LMT 1911 --3:40:52 - PMT 1935 --3:40:36 - PMT 1945 O --3:30 - -0330 1984 O --3 - -03 R U 1923 1925 - O 1 0 0:30 - R U 1924 1926 - Ap 1 0 0 - R U 1933 1938 - O lastSu 0 0:30 - @@ -3991,53 +2084,1964 @@ R U 2005 o - Mar 27 2 0 - R U 2005 o - O 9 2 1 - R U 2006 2015 - Mar Su>=8 2 0 - R U 2006 2014 - O Su>=1 2 1 - -Z America/Montevideo -3:44:51 - LMT 1908 Jun 10 --3:44:51 - MMT 1920 May --4 - -04 1923 O --3:30 U -0330/-03 1942 D 14 --3 U -03/-0230 1960 --3 U -03/-02 1968 --3 U -03/-0230 1970 --3 U -03/-02 1974 --3 U -03/-0130 1974 Mar 10 --3 U -03/-0230 1974 D 22 --3 U -03/-02 -Z America/Caracas -4:27:44 - LMT 1890 --4:27:40 - CMT 1912 F 12 --4:30 - -0430 1965 --4 - -04 2007 D 9 3 --4:30 - -0430 2016 May 1 2:30 --4 - -04 -Z Etc/UTC 0 - UTC -Z Etc/GMT 0 - GMT -L Etc/GMT GMT -Z Etc/GMT-14 14 - +14 -Z Etc/GMT-13 13 - +13 -Z Etc/GMT-12 12 - +12 -Z Etc/GMT-11 11 - +11 -Z Etc/GMT-10 10 - +10 -Z Etc/GMT-9 9 - +09 -Z Etc/GMT-8 8 - +08 -Z Etc/GMT-7 7 - +07 -Z Etc/GMT-6 6 - +06 -Z Etc/GMT-5 5 - +05 -Z Etc/GMT-4 4 - +04 -Z Etc/GMT-3 3 - +03 -Z Etc/GMT-2 2 - +02 -Z Etc/GMT-1 1 - +01 -Z Etc/GMT+1 -1 - -01 -Z Etc/GMT+2 -2 - -02 -Z Etc/GMT+3 -3 - -03 -Z Etc/GMT+4 -4 - -04 -Z Etc/GMT+5 -5 - -05 -Z Etc/GMT+6 -6 - -06 -Z Etc/GMT+7 -7 - -07 -Z Etc/GMT+8 -8 - -08 -Z Etc/GMT+9 -9 - -09 -Z Etc/GMT+10 -10 - -10 -Z Etc/GMT+11 -11 - -11 -Z Etc/GMT+12 -12 - -12 -Z Factory 0 - -00 +Z Africa/Abidjan -0:16:8 - LMT 1912 +0 - GMT +Z Africa/Algiers 0:12:12 - LMT 1891 Mar 16 +0:9:21 - PMT 1911 Mar 11 +0 d WE%sT 1940 F 25 2 +1 d CE%sT 1946 O 7 +0 - WET 1956 Ja 29 +1 - CET 1963 Ap 14 +0 d WE%sT 1977 O 21 +1 d CE%sT 1979 O 26 +0 d WE%sT 1981 May +1 - CET +Z Africa/Bissau -1:2:20 - LMT 1912 Ja 1 1u +-1 - %z 1975 +0 - GMT +Z Africa/Cairo 2:5:9 - LMT 1900 O +2 K EE%sT +Z Africa/Casablanca -0:30:20 - LMT 1913 O 26 +0 M %z 1984 Mar 16 +1 - %z 1986 +0 M %z 2018 O 28 3 +1 M %z +Z Africa/Ceuta -0:21:16 - LMT 1901 Ja 1 0u +0 - WET 1918 May 6 23 +0 1 WEST 1918 O 7 23 +0 - WET 1924 +0 s WE%sT 1929 +0 - WET 1967 +0 Sp WE%sT 1984 Mar 16 +1 - CET 1986 +1 E CE%sT +Z Africa/El_Aaiun -0:52:48 - LMT 1934 +-1 - %z 1976 Ap 14 +0 M %z 2018 O 28 3 +1 M %z +Z Africa/Johannesburg 1:52 - LMT 1892 F 8 +1:30 - SAST 1903 Mar +2 SA SAST +Z Africa/Juba 2:6:28 - LMT 1931 +2 SD CA%sT 2000 Ja 15 12 +3 - EAT 2021 F +2 - CAT +Z Africa/Khartoum 2:10:8 - LMT 1931 +2 SD CA%sT 2000 Ja 15 12 +3 - EAT 2017 N +2 - CAT +Z Africa/Lagos 0:13:35 - LMT 1905 Jul +0 - GMT 1908 Jul +0:13:35 - LMT 1914 +0:30 - %z 1919 S +1 - WAT +Z Africa/Maputo 2:10:18 - LMT 1909 +2 - CAT +Z Africa/Monrovia -0:43:8 - LMT 1882 +-0:43:8 - MMT 1919 Mar +-0:44:30 - MMT 1972 Ja 7 +0 - GMT +Z Africa/Nairobi 2:27:16 - LMT 1908 May +2:30 - %z 1928 Jun 30 24 +3 - EAT 1930 Ja 4 24 +2:30 - %z 1936 D 31 24 +2:45 - %z 1942 Jul 31 24 +3 - EAT +Z Africa/Ndjamena 1:0:12 - LMT 1912 +1 - WAT 1979 O 14 +1 1 WAST 1980 Mar 8 +1 - WAT +Z Africa/Sao_Tome 0:26:56 - LMT 1884 +-0:36:45 - LMT 1912 Ja 1 0u +0 - GMT 2018 Ja 1 1 +1 - WAT 2019 Ja 1 2 +0 - GMT +Z Africa/Tripoli 0:52:44 - LMT 1920 +1 L CE%sT 1959 +2 - EET 1982 +1 L CE%sT 1990 May 4 +2 - EET 1996 S 30 +1 L CE%sT 1997 O 4 +2 - EET 2012 N 10 2 +1 L CE%sT 2013 O 25 2 +2 - EET +Z Africa/Tunis 0:40:44 - LMT 1881 May 12 +0:9:21 - PMT 1911 Mar 11 +1 n CE%sT +Z Africa/Windhoek 1:8:24 - LMT 1892 F 8 +1:30 - %z 1903 Mar +2 - SAST 1942 S 20 2 +2 1 SAST 1943 Mar 21 2 +2 - SAST 1990 Mar 21 +2 NA %s +Z America/Adak 12:13:22 - LMT 1867 O 19 12:44:35 +-11:46:38 - LMT 1900 Au 20 12 +-11 - NST 1942 +-11 u N%sT 1946 +-11 - NST 1967 Ap +-11 - BST 1969 +-11 u B%sT 1983 O 30 2 +-10 u AH%sT 1983 N 30 +-10 u H%sT +Z America/Anchorage 14:0:24 - LMT 1867 O 19 14:31:37 +-9:59:36 - LMT 1900 Au 20 12 +-10 - AST 1942 +-10 u A%sT 1967 Ap +-10 - AHST 1969 +-10 u AH%sT 1983 O 30 2 +-9 u Y%sT 1983 N 30 +-9 u AK%sT +Z America/Araguaina -3:12:48 - LMT 1914 +-3 B %z 1990 S 17 +-3 - %z 1995 S 14 +-3 B %z 2003 S 24 +-3 - %z 2012 O 21 +-3 B %z 2013 S +-3 - %z +Z America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 A %z +Z America/Argentina/Catamarca -4:23:8 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar 3 +-4 - %z 1991 O 20 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 Jun +-4 - %z 2004 Jun 20 +-3 A %z 2008 O 18 +-3 - %z +Z America/Argentina/Cordoba -4:16:48 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar 3 +-4 - %z 1991 O 20 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 A %z +Z America/Argentina/Jujuy -4:21:12 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1990 Mar 4 +-4 - %z 1990 O 28 +-4 1 %z 1991 Mar 17 +-4 - %z 1991 O 6 +-3 1 %z 1992 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 A %z 2008 O 18 +-3 - %z +Z America/Argentina/La_Rioja -4:27:24 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar +-4 - %z 1991 May 7 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 Jun +-4 - %z 2004 Jun 20 +-3 A %z 2008 O 18 +-3 - %z +Z America/Argentina/Mendoza -4:35:16 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1990 Mar 4 +-4 - %z 1990 O 15 +-4 1 %z 1991 Mar +-4 - %z 1991 O 15 +-4 1 %z 1992 Mar +-4 - %z 1992 O 18 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 May 23 +-4 - %z 2004 S 26 +-3 A %z 2008 O 18 +-3 - %z +Z America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 Jun +-4 - %z 2004 Jun 20 +-3 A %z 2008 O 18 +-3 - %z +Z America/Argentina/Salta -4:21:40 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar 3 +-4 - %z 1991 O 20 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 A %z 2008 O 18 +-3 - %z +Z America/Argentina/San_Juan -4:34:4 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar +-4 - %z 1991 May 7 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 May 31 +-4 - %z 2004 Jul 25 +-3 A %z 2008 O 18 +-3 - %z +Z America/Argentina/San_Luis -4:25:24 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1990 +-3 1 %z 1990 Mar 14 +-4 - %z 1990 O 15 +-4 1 %z 1991 Mar +-4 - %z 1991 Jun +-3 - %z 1999 O 3 +-4 1 %z 2000 Mar 3 +-3 - %z 2004 May 31 +-4 - %z 2004 Jul 25 +-3 A %z 2008 Ja 21 +-4 Sa %z 2009 O 11 +-3 - %z +Z America/Argentina/Tucuman -4:20:52 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1991 Mar 3 +-4 - %z 1991 O 20 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 Jun +-4 - %z 2004 Jun 13 +-3 A %z +Z America/Argentina/Ushuaia -4:33:12 - LMT 1894 O 31 +-4:16:48 - CMT 1920 May +-4 - %z 1930 D +-4 A %z 1969 O 5 +-3 A %z 1999 O 3 +-4 A %z 2000 Mar 3 +-3 - %z 2004 May 30 +-4 - %z 2004 Jun 20 +-3 A %z 2008 O 18 +-3 - %z +Z America/Asuncion -3:50:40 - LMT 1890 +-3:50:40 - AMT 1931 O 10 +-4 - %z 1972 O +-3 - %z 1974 Ap +-4 y %z 2024 O 15 +-3 - %z +Z America/Bahia -2:34:4 - LMT 1914 +-3 B %z 2003 S 24 +-3 - %z 2011 O 16 +-3 B %z 2012 O 21 +-3 - %z +Z America/Bahia_Banderas -7:1 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 - CST 1942 Ap 24 +-7 - MST 1970 +-7 m M%sT 2010 Ap 4 2 +-6 m C%sT +Z America/Barbados -3:58:29 - LMT 1911 Au 28 +-4 BB A%sT 1944 +-4 BB AST/-0330 1945 +-4 BB A%sT +Z America/Belem -3:13:56 - LMT 1914 +-3 B %z 1988 S 12 +-3 - %z +Z America/Belize -5:52:48 - LMT 1912 Ap +-6 BZ %s +Z America/Boa_Vista -4:2:40 - LMT 1914 +-4 B %z 1988 S 12 +-4 - %z 1999 S 30 +-4 B %z 2000 O 15 +-4 - %z +Z America/Bogota -4:56:16 - LMT 1884 Mar 13 +-4:56:16 - BMT 1914 N 23 +-5 CO %z +Z America/Boise -7:44:49 - LMT 1883 N 18 20u +-8 u P%sT 1923 May 13 2 +-7 u M%sT 1974 +-7 - MST 1974 F 3 2 +-7 u M%sT +Z America/Cambridge_Bay 0 - -00 1920 +-7 Y M%sT 1999 O 31 2 +-6 C C%sT 2000 O 29 2 +-5 - EST 2000 N 5 +-6 - CST 2001 Ap 1 3 +-7 C M%sT +Z America/Campo_Grande -3:38:28 - LMT 1914 +-4 B %z +Z America/Cancun -5:47:4 - LMT 1922 Ja 1 6u +-6 - CST 1981 D 26 2 +-5 - EST 1983 Ja 4 +-6 m C%sT 1997 O 26 2 +-5 m E%sT 1998 Au 2 2 +-6 m C%sT 2015 F 1 2 +-5 - EST +Z America/Caracas -4:27:44 - LMT 1890 +-4:27:40 - CMT 1912 F 12 +-4:30 - %z 1965 +-4 - %z 2007 D 9 3 +-4:30 - %z 2016 May 1 2:30 +-4 - %z +Z America/Cayenne -3:29:20 - LMT 1911 Jul +-4 - %z 1967 O +-3 - %z +Z America/Chicago -5:50:36 - LMT 1883 N 18 18u +-6 u C%sT 1920 +-6 Ch C%sT 1936 Mar 1 2 +-5 - EST 1936 N 15 2 +-6 Ch C%sT 1942 +-6 u C%sT 1946 +-6 Ch C%sT 1967 +-6 u C%sT +Z America/Chihuahua -7:4:20 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 - CST 1996 +-6 m C%sT 1998 +-6 - CST 1998 Ap Su>=1 3 +-7 m M%sT 2022 O 30 2 +-6 - CST +Z America/Ciudad_Juarez -7:5:56 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 - CST 1996 +-6 m C%sT 1998 +-6 - CST 1998 Ap Su>=1 3 +-7 m M%sT 2010 +-7 u M%sT 2022 O 30 2 +-6 - CST 2022 N 30 +-7 u M%sT +Z America/Costa_Rica -5:36:13 - LMT 1890 +-5:36:13 - SJMT 1921 Ja 15 +-6 CR C%sT +Z America/Coyhaique -4:48:16 - LMT 1890 +-4:42:45 - SMT 1910 Ja 10 +-5 - %z 1916 Jul +-4:42:45 - SMT 1918 S 10 +-4 - %z 1919 Jul +-4:42:45 - SMT 1927 S +-5 x %z 1932 S +-4 - %z 1942 Jun +-5 - %z 1942 Au +-4 - %z 1946 Au 28 24 +-5 1 %z 1947 Mar 31 24 +-5 - %z 1947 May 21 23 +-4 x %z 2025 Mar 20 +-3 - %z +Z America/Cuiaba -3:44:20 - LMT 1914 +-4 B %z 2003 S 24 +-4 - %z 2004 O +-4 B %z +Z America/Danmarkshavn -1:14:40 - LMT 1916 Jul 28 +-3 - %z 1980 Ap 6 2 +-3 E %z 1996 +0 - GMT +Z America/Dawson -9:17:40 - LMT 1900 Au 20 +-9 Y Y%sT 1965 +-9 Yu Y%sT 1973 O 28 +-8 - PST 1980 +-8 C P%sT 2020 N +-7 - MST +Z America/Dawson_Creek -8:0:56 - LMT 1884 +-8 C P%sT 1947 +-8 Va P%sT 1972 Au 30 2 +-7 - MST +Z America/Denver -6:59:56 - LMT 1883 N 18 19u +-7 u M%sT 1920 +-7 De M%sT 1942 +-7 u M%sT 1946 +-7 De M%sT 1967 +-7 u M%sT +Z America/Detroit -5:32:11 - LMT 1905 +-6 - CST 1915 May 15 2 +-5 - EST 1942 +-5 u E%sT 1946 +-5 Dt E%sT 1967 Jun 14 0:1 +-5 u E%sT 1969 +-5 - EST 1973 +-5 u E%sT 1975 +-5 - EST 1975 Ap 27 2 +-5 u E%sT +Z America/Edmonton -7:33:52 - LMT 1906 S +-7 Ed M%sT 1987 +-7 C M%sT +Z America/Eirunepe -4:39:28 - LMT 1914 +-5 B %z 1988 S 12 +-5 - %z 1993 S 28 +-5 B %z 1994 S 22 +-5 - %z 2008 Jun 24 +-4 - %z 2013 N 10 +-5 - %z +Z America/El_Salvador -5:56:48 - LMT 1921 +-6 SV C%sT +Z America/Fort_Nelson -8:10:47 - LMT 1884 +-8 Va P%sT 1946 +-8 - PST 1947 +-8 Va P%sT 1987 +-8 C P%sT 2015 Mar 8 2 +-7 - MST +Z America/Fortaleza -2:34 - LMT 1914 +-3 B %z 1990 S 17 +-3 - %z 1999 S 30 +-3 B %z 2000 O 22 +-3 - %z 2001 S 13 +-3 B %z 2002 O +-3 - %z +Z America/Glace_Bay -3:59:48 - LMT 1902 Jun 15 +-4 C A%sT 1953 +-4 H A%sT 1954 +-4 - AST 1972 +-4 H A%sT 1974 +-4 C A%sT +Z America/Goose_Bay -4:1:40 - LMT 1884 +-3:30:52 - NST 1918 +-3:30:52 C N%sT 1919 +-3:30:52 - NST 1935 Mar 30 +-3:30 - NST 1936 +-3:30 j N%sT 1942 May 11 +-3:30 C N%sT 1946 +-3:30 j N%sT 1966 Mar 15 2 +-4 j A%sT 2011 N +-4 C A%sT +Z America/Grand_Turk -4:44:32 - LMT 1890 +-5:7:10 - KMT 1912 F +-5 - EST 1979 +-5 u E%sT 2015 Mar 8 2 +-4 - AST 2018 Mar 11 3 +-5 u E%sT +Z America/Guatemala -6:2:4 - LMT 1918 O 5 +-6 GT C%sT +Z America/Guayaquil -5:19:20 - LMT 1890 +-5:14 - QMT 1931 +-5 EC %z +Z America/Guyana -3:52:39 - LMT 1911 Au +-4 - %z 1915 Mar +-3:45 - %z 1975 Au +-3 - %z 1992 Mar 29 1 +-4 - %z +Z America/Halifax -4:14:24 - LMT 1902 Jun 15 +-4 H A%sT 1918 +-4 C A%sT 1919 +-4 H A%sT 1942 F 9 2s +-4 C A%sT 1946 +-4 H A%sT 1974 +-4 C A%sT +Z America/Havana -5:29:28 - LMT 1890 +-5:29:36 - HMT 1925 Jul 19 12 +-5 Q C%sT +Z America/Hermosillo -7:23:52 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 - CST 1942 Ap 24 +-7 - MST 1996 +-7 m M%sT 1999 +-7 - MST +Z America/Indiana/Indianapolis -5:44:38 - LMT 1883 N 18 18u +-6 u C%sT 1920 +-6 In C%sT 1942 +-6 u C%sT 1946 +-6 In C%sT 1955 Ap 24 2 +-5 - EST 1957 S 29 2 +-6 - CST 1958 Ap 27 2 +-5 - EST 1969 +-5 u E%sT 1971 +-5 - EST 2006 +-5 u E%sT +Z America/Indiana/Knox -5:46:30 - LMT 1883 N 18 18u +-6 u C%sT 1947 +-6 St C%sT 1962 Ap 29 2 +-5 - EST 1963 O 27 2 +-6 u C%sT 1991 O 27 2 +-5 - EST 2006 Ap 2 2 +-6 u C%sT +Z America/Indiana/Marengo -5:45:23 - LMT 1883 N 18 18u +-6 u C%sT 1951 +-6 Ma C%sT 1961 Ap 30 2 +-5 - EST 1969 +-5 u E%sT 1974 Ja 6 2 +-6 1 CDT 1974 O 27 2 +-5 u E%sT 1976 +-5 - EST 2006 +-5 u E%sT +Z America/Indiana/Petersburg -5:49:7 - LMT 1883 N 18 18u +-6 u C%sT 1955 +-6 Pi C%sT 1965 Ap 25 2 +-5 - EST 1966 O 30 2 +-6 u C%sT 1977 O 30 2 +-5 - EST 2006 Ap 2 2 +-6 u C%sT 2007 N 4 2 +-5 u E%sT +Z America/Indiana/Tell_City -5:47:3 - LMT 1883 N 18 18u +-6 u C%sT 1946 +-6 Pe C%sT 1964 Ap 26 2 +-5 - EST 1967 O 29 2 +-6 u C%sT 1969 Ap 27 2 +-5 u E%sT 1971 +-5 - EST 2006 Ap 2 2 +-6 u C%sT +Z America/Indiana/Vevay -5:40:16 - LMT 1883 N 18 18u +-6 u C%sT 1954 Ap 25 2 +-5 - EST 1969 +-5 u E%sT 1973 +-5 - EST 2006 +-5 u E%sT +Z America/Indiana/Vincennes -5:50:7 - LMT 1883 N 18 18u +-6 u C%sT 1946 +-6 V C%sT 1964 Ap 26 2 +-5 - EST 1969 +-5 u E%sT 1971 +-5 - EST 2006 Ap 2 2 +-6 u C%sT 2007 N 4 2 +-5 u E%sT +Z America/Indiana/Winamac -5:46:25 - LMT 1883 N 18 18u +-6 u C%sT 1946 +-6 Pu C%sT 1961 Ap 30 2 +-5 - EST 1969 +-5 u E%sT 1971 +-5 - EST 2006 Ap 2 2 +-6 u C%sT 2007 Mar 11 2 +-5 u E%sT +Z America/Inuvik 0 - -00 1953 +-8 Y P%sT 1979 Ap lastSu 2 +-7 Y M%sT 1980 +-7 C M%sT +Z America/Iqaluit 0 - -00 1942 Au +-5 Y E%sT 1999 O 31 2 +-6 C C%sT 2000 O 29 2 +-5 C E%sT +Z America/Jamaica -5:7:10 - LMT 1890 +-5:7:10 - KMT 1912 F +-5 - EST 1974 +-5 u E%sT 1984 +-5 - EST +Z America/Juneau 15:2:19 - LMT 1867 O 19 15:33:32 +-8:57:41 - LMT 1900 Au 20 12 +-8 - PST 1942 +-8 u P%sT 1946 +-8 - PST 1969 +-8 u P%sT 1980 Ap 27 2 +-9 u Y%sT 1980 O 26 2 +-8 u P%sT 1983 O 30 2 +-9 u Y%sT 1983 N 30 +-9 u AK%sT +Z America/Kentucky/Louisville -5:43:2 - LMT 1883 N 18 18u +-6 u C%sT 1921 +-6 v C%sT 1942 +-6 u C%sT 1946 +-6 v C%sT 1961 Jul 23 2 +-5 - EST 1968 +-5 u E%sT 1974 Ja 6 2 +-6 1 CDT 1974 O 27 2 +-5 u E%sT +Z America/Kentucky/Monticello -5:39:24 - LMT 1883 N 18 18u +-6 u C%sT 1946 +-6 - CST 1968 +-6 u C%sT 2000 O 29 2 +-5 u E%sT +Z America/La_Paz -4:32:36 - LMT 1890 +-4:32:36 - CMT 1931 O 15 +-4:32:36 1 BST 1932 Mar 21 +-4 - %z +Z America/Lima -5:8:12 - LMT 1890 +-5:8:36 - LMT 1908 Jul 28 +-5 PE %z +Z America/Los_Angeles -7:52:58 - LMT 1883 N 18 20u +-8 u P%sT 1946 +-8 CA P%sT 1967 +-8 u P%sT +Z America/Maceio -2:22:52 - LMT 1914 +-3 B %z 1990 S 17 +-3 - %z 1995 O 13 +-3 B %z 1996 S 4 +-3 - %z 1999 S 30 +-3 B %z 2000 O 22 +-3 - %z 2001 S 13 +-3 B %z 2002 O +-3 - %z +Z America/Managua -5:45:8 - LMT 1890 +-5:45:12 - MMT 1934 Jun 23 +-6 - CST 1973 May +-5 - EST 1975 F 16 +-6 NI C%sT 1992 Ja 1 4 +-5 - EST 1992 S 24 +-6 - CST 1993 +-5 - EST 1997 +-6 NI C%sT +Z America/Manaus -4:0:4 - LMT 1914 +-4 B %z 1988 S 12 +-4 - %z 1993 S 28 +-4 B %z 1994 S 22 +-4 - %z +Z America/Martinique -4:4:20 - LMT 1890 +-4:4:20 - FFMT 1911 May +-4 - AST 1980 Ap 6 +-4 1 ADT 1980 S 28 +-4 - AST +Z America/Matamoros -6:30 - LMT 1922 Ja 1 6u +-6 - CST 1988 +-6 u C%sT 1989 +-6 m C%sT 2010 +-6 u C%sT +Z America/Mazatlan -7:5:40 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 - CST 1942 Ap 24 +-7 - MST 1970 +-7 m M%sT +Z America/Menominee -5:50:27 - LMT 1885 S 18 12 +-6 u C%sT 1946 +-6 Me C%sT 1969 Ap 27 2 +-5 - EST 1973 Ap 29 2 +-6 u C%sT +Z America/Merida -5:58:28 - LMT 1922 Ja 1 6u +-6 - CST 1981 D 26 2 +-5 - EST 1982 N 2 2 +-6 m C%sT +Z America/Metlakatla 15:13:42 - LMT 1867 O 19 15:44:55 +-8:46:18 - LMT 1900 Au 20 12 +-8 - PST 1942 +-8 u P%sT 1946 +-8 - PST 1969 +-8 u P%sT 1983 O 30 2 +-8 - PST 2015 N 1 2 +-9 u AK%sT 2018 N 4 2 +-8 - PST 2019 Ja 20 2 +-9 u AK%sT +Z America/Mexico_City -6:36:36 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 m C%sT 2001 S 30 2 +-6 - CST 2002 F 20 +-6 m C%sT +Z America/Miquelon -3:44:40 - LMT 1911 Jun 15 +-4 - AST 1980 May +-3 - %z 1987 +-3 C %z +Z America/Moncton -4:19:8 - LMT 1883 D 9 +-5 - EST 1902 Jun 15 +-4 C A%sT 1933 +-4 o A%sT 1942 +-4 C A%sT 1946 +-4 o A%sT 1973 +-4 C A%sT 1993 +-4 o A%sT 2007 +-4 C A%sT +Z America/Monterrey -6:41:16 - LMT 1922 Ja 1 6u +-7 - MST 1927 Jun 10 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 - CST 1988 +-6 u C%sT 1989 +-6 m C%sT +Z America/Montevideo -3:44:51 - LMT 1908 Jun 10 +-3:44:51 - MMT 1920 May +-4 - %z 1923 O +-3:30 U %z 1942 D 14 +-3 U %z 1960 +-3 U %z 1968 +-3 U %z 1970 +-3 U %z 1974 +-3 U %z 1974 Mar 10 +-3 U %z 1974 D 22 +-3 U %z +Z America/New_York -4:56:2 - LMT 1883 N 18 17u +-5 u E%sT 1920 +-5 NY E%sT 1942 +-5 u E%sT 1946 +-5 NY E%sT 1967 +-5 u E%sT +Z America/Nome 12:58:22 - LMT 1867 O 19 13:29:35 +-11:1:38 - LMT 1900 Au 20 12 +-11 - NST 1942 +-11 u N%sT 1946 +-11 - NST 1967 Ap +-11 - BST 1969 +-11 u B%sT 1983 O 30 2 +-9 u Y%sT 1983 N 30 +-9 u AK%sT +Z America/Noronha -2:9:40 - LMT 1914 +-2 B %z 1990 S 17 +-2 - %z 1999 S 30 +-2 B %z 2000 O 15 +-2 - %z 2001 S 13 +-2 B %z 2002 O +-2 - %z +Z America/North_Dakota/Beulah -6:47:7 - LMT 1883 N 18 19u +-7 u M%sT 2010 N 7 2 +-6 u C%sT +Z America/North_Dakota/Center -6:45:12 - LMT 1883 N 18 19u +-7 u M%sT 1992 O 25 2 +-6 u C%sT +Z America/North_Dakota/New_Salem -6:45:39 - LMT 1883 N 18 19u +-7 u M%sT 2003 O 26 2 +-6 u C%sT +Z America/Nuuk -3:26:56 - LMT 1916 Jul 28 +-3 - %z 1980 Ap 6 2 +-3 E %z 2023 Mar 26 1u +-2 - %z 2023 O 29 1u +-2 E %z +Z America/Ojinaga -6:57:40 - LMT 1922 Ja 1 7u +-7 - MST 1927 Jun 10 +-6 - CST 1930 N 15 +-7 m M%sT 1932 Ap +-6 - CST 1996 +-6 m C%sT 1998 +-6 - CST 1998 Ap Su>=1 3 +-7 m M%sT 2010 +-7 u M%sT 2022 O 30 2 +-6 - CST 2022 N 30 +-6 u C%sT +Z America/Panama -5:18:8 - LMT 1890 +-5:19:36 - CMT 1908 Ap 22 +-5 - EST +Z America/Paramaribo -3:40:40 - LMT 1911 +-3:40:52 - PMT 1935 +-3:40:36 - PMT 1945 O +-3:30 - %z 1984 O +-3 - %z +Z America/Phoenix -7:28:18 - LMT 1883 N 18 19u +-7 u M%sT 1944 Ja 1 0:1 +-7 - MST 1944 Ap 1 0:1 +-7 u M%sT 1944 O 1 0:1 +-7 - MST 1967 +-7 u M%sT 1968 Mar 21 +-7 - MST +Z America/Port-au-Prince -4:49:20 - LMT 1890 +-4:49 - PPMT 1917 Ja 24 12 +-5 HT E%sT +Z America/Porto_Velho -4:15:36 - LMT 1914 +-4 B %z 1988 S 12 +-4 - %z +Z America/Puerto_Rico -4:24:25 - LMT 1899 Mar 28 12 +-4 - AST 1942 May 3 +-4 u A%sT 1946 +-4 - AST +Z America/Punta_Arenas -4:43:40 - LMT 1890 +-4:42:45 - SMT 1910 Ja 10 +-5 - %z 1916 Jul +-4:42:45 - SMT 1918 S 10 +-4 - %z 1919 Jul +-4:42:45 - SMT 1927 S +-5 x %z 1932 S +-4 - %z 1942 Jun +-5 - %z 1942 Au +-4 - %z 1946 Au 28 24 +-5 1 %z 1947 Mar 31 24 +-5 - %z 1947 May 21 23 +-4 x %z 2016 D 4 +-3 - %z +Z America/Rankin_Inlet 0 - -00 1957 +-6 Y C%sT 2000 O 29 2 +-5 - EST 2001 Ap 1 3 +-6 C C%sT +Z America/Recife -2:19:36 - LMT 1914 +-3 B %z 1990 S 17 +-3 - %z 1999 S 30 +-3 B %z 2000 O 15 +-3 - %z 2001 S 13 +-3 B %z 2002 O +-3 - %z +Z America/Regina -6:58:36 - LMT 1905 S +-7 r M%sT 1960 Ap lastSu 2 +-6 - CST +Z America/Resolute 0 - -00 1947 Au 31 +-6 Y C%sT 2000 O 29 2 +-5 - EST 2001 Ap 1 3 +-6 C C%sT 2006 O 29 2 +-5 - EST 2007 Mar 11 3 +-6 C C%sT +Z America/Rio_Branco -4:31:12 - LMT 1914 +-5 B %z 1988 S 12 +-5 - %z 2008 Jun 24 +-4 - %z 2013 N 10 +-5 - %z +Z America/Santarem -3:38:48 - LMT 1914 +-4 B %z 1988 S 12 +-4 - %z 2008 Jun 24 +-3 - %z +Z America/Santiago -4:42:45 - LMT 1890 +-4:42:45 - SMT 1910 Ja 10 +-5 - %z 1916 Jul +-4:42:45 - SMT 1918 S 10 +-4 - %z 1919 Jul +-4:42:45 - SMT 1927 S +-5 x %z 1932 S +-4 - %z 1942 Jun +-5 - %z 1942 Au +-4 - %z 1946 Jul 14 24 +-4 1 %z 1946 Au 28 24 +-5 1 %z 1947 Mar 31 24 +-5 - %z 1947 May 21 23 +-4 x %z +Z America/Santo_Domingo -4:39:36 - LMT 1890 +-4:40 - SDMT 1933 Ap 1 12 +-5 DO %s 1974 O 27 +-4 - AST 2000 O 29 2 +-5 u E%sT 2000 D 3 1 +-4 - AST +Z America/Sao_Paulo -3:6:28 - LMT 1914 +-3 B %z 1963 O 23 +-3 1 %z 1964 +-3 B %z +Z America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 +-2 - %z 1980 Ap 6 2 +-2 c %z 1981 Mar 29 +-1 E %z 2024 Mar 31 +-2 E %z +Z America/Sitka 14:58:47 - LMT 1867 O 19 15:30 +-9:1:13 - LMT 1900 Au 20 12 +-8 - PST 1942 +-8 u P%sT 1946 +-8 - PST 1969 +-8 u P%sT 1983 O 30 2 +-9 u Y%sT 1983 N 30 +-9 u AK%sT +Z America/St_Johns -3:30:52 - LMT 1884 +-3:30:52 j N%sT 1918 +-3:30:52 C N%sT 1919 +-3:30:52 j N%sT 1935 Mar 30 +-3:30 j N%sT 1942 May 11 +-3:30 C N%sT 1946 +-3:30 j N%sT 2011 N +-3:30 C N%sT +Z America/Swift_Current -7:11:20 - LMT 1905 S +-7 C M%sT 1946 Ap lastSu 2 +-7 r M%sT 1950 +-7 Sw M%sT 1972 Ap lastSu 2 +-6 - CST +Z America/Tegucigalpa -5:48:52 - LMT 1921 Ap +-6 HN C%sT +Z America/Thule -4:35:8 - LMT 1916 Jul 28 +-4 Th A%sT +Z America/Tijuana -7:48:4 - LMT 1922 Ja 1 7u +-7 - MST 1924 +-8 - PST 1927 Jun 10 +-7 - MST 1930 N 15 +-8 - PST 1931 Ap +-8 1 PDT 1931 S 30 +-8 - PST 1942 Ap 24 +-8 1 PWT 1945 Au 14 23u +-8 1 PPT 1945 N 15 +-8 - PST 1948 Ap 5 +-8 1 PDT 1949 Ja 14 +-8 - PST 1950 May +-8 1 PDT 1950 S 24 +-8 - PST 1951 Ap 29 2 +-8 1 PDT 1951 S 30 2 +-8 - PST 1952 Ap 27 2 +-8 1 PDT 1952 S 28 2 +-8 - PST 1954 +-8 CA P%sT 1961 +-8 - PST 1976 +-8 u P%sT 1996 +-8 m P%sT 2001 +-8 u P%sT 2002 F 20 +-8 m P%sT 2010 +-8 u P%sT +Z America/Toronto -5:17:32 - LMT 1895 +-5 C E%sT 1919 +-5 t E%sT 1942 F 9 2s +-5 C E%sT 1946 +-5 t E%sT 1974 +-5 C E%sT +Z America/Vancouver -8:12:28 - LMT 1884 +-8 Va P%sT 1987 +-8 C P%sT +Z America/Whitehorse -9:0:12 - LMT 1900 Au 20 +-9 Y Y%sT 1965 +-9 Yu Y%sT 1966 F 27 +-8 - PST 1980 +-8 C P%sT 2020 N +-7 - MST +Z America/Winnipeg -6:28:36 - LMT 1887 Jul 16 +-6 W C%sT 2006 +-6 C C%sT +Z America/Yakutat 14:41:5 - LMT 1867 O 19 15:12:18 +-9:18:55 - LMT 1900 Au 20 12 +-9 - YST 1942 +-9 u Y%sT 1946 +-9 - YST 1969 +-9 u Y%sT 1983 N 30 +-9 u AK%sT +Z Antarctica/Casey 0 - -00 1969 +8 - %z 2009 O 18 2 +11 - %z 2010 Mar 5 2 +8 - %z 2011 O 28 2 +11 - %z 2012 F 21 17u +8 - %z 2016 O 22 +11 - %z 2018 Mar 11 4 +8 - %z 2018 O 7 4 +11 - %z 2019 Mar 17 3 +8 - %z 2019 O 4 3 +11 - %z 2020 Mar 8 3 +8 - %z 2020 O 4 0:1 +11 - %z 2021 Mar 14 +8 - %z 2021 O 3 0:1 +11 - %z 2022 Mar 13 +8 - %z 2022 O 2 0:1 +11 - %z 2023 Mar 9 3 +8 - %z +Z Antarctica/Davis 0 - -00 1957 Ja 13 +7 - %z 1964 N +0 - -00 1969 F +7 - %z 2009 O 18 2 +5 - %z 2010 Mar 10 20u +7 - %z 2011 O 28 2 +5 - %z 2012 F 21 20u +7 - %z +Z Antarctica/Macquarie 0 - -00 1899 N +10 - AEST 1916 O 1 2 +10 1 AEDT 1917 F +10 AU AE%sT 1919 Ap 1 0s +0 - -00 1948 Mar 25 +10 AU AE%sT 1967 +10 AT AE%sT 2010 +10 1 AEDT 2011 +10 AT AE%sT +Z Antarctica/Mawson 0 - -00 1954 F 13 +6 - %z 2009 O 18 2 +5 - %z +Z Antarctica/Palmer 0 - -00 1965 +-4 A %z 1969 O 5 +-3 A %z 1982 May +-4 x %z 2016 D 4 +-3 - %z +Z Antarctica/Rothera 0 - -00 1976 D +-3 - %z +Z Antarctica/Troll 0 - -00 2005 F 12 +0 Tr %s +Z Antarctica/Vostok 0 - -00 1957 D 16 +7 - %z 1994 F +0 - -00 1994 N +7 - %z 2023 D 18 2 +5 - %z +Z Asia/Almaty 5:7:48 - LMT 1924 May 2 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2s +5 R %z 1992 Ja 19 2s +6 R %z 2004 O 31 2s +6 - %z 2024 Mar +5 - %z +Z Asia/Amman 2:23:44 - LMT 1931 +2 J EE%sT 2022 O 28 0s +3 - %z +Z Asia/Anadyr 11:49:56 - LMT 1924 May 2 +12 - %z 1930 Jun 21 +13 R %z 1982 Ap 1 0s +12 R %z 1991 Mar 31 2s +11 R %z 1992 Ja 19 2s +12 R %z 2010 Mar 28 2s +11 R %z 2011 Mar 27 2s +12 - %z +Z Asia/Aqtau 3:21:4 - LMT 1924 May 2 +4 - %z 1930 Jun 21 +5 - %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 1994 S 25 2s +4 R %z 2004 O 31 2s +5 - %z +Z Asia/Aqtobe 3:48:40 - LMT 1924 May 2 +4 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 2004 O 31 2s +5 - %z +Z Asia/Ashgabat 3:53:32 - LMT 1924 May 2 +4 - %z 1930 Jun 21 +5 R %z 1991 Mar 31 2 +4 R %z 1992 Ja 19 2 +5 - %z +Z Asia/Atyrau 3:27:44 - LMT 1924 May 2 +3 - %z 1930 Jun 21 +5 - %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 1999 Mar 28 2s +4 R %z 2004 O 31 2s +5 - %z +Z Asia/Baghdad 2:57:40 - LMT 1890 +2:57:36 - BMT 1918 +3 - %z 1982 May +3 IQ %z +Z Asia/Baku 3:19:24 - LMT 1924 May 2 +3 - %z 1957 Mar +4 R %z 1991 Mar 31 2s +3 R %z 1992 S lastSu 2s +4 - %z 1996 +4 E %z 1997 +4 AZ %z +Z Asia/Bangkok 6:42:4 - LMT 1880 +6:42:4 - BMT 1920 Ap +7 - %z +Z Asia/Barnaul 5:35 - LMT 1919 D 10 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 1995 May 28 +6 R %z 2011 Mar 27 2s +7 - %z 2014 O 26 2s +6 - %z 2016 Mar 27 2s +7 - %z +Z Asia/Beirut 2:22 - LMT 1880 +2 l EE%sT +Z Asia/Bishkek 4:58:24 - LMT 1924 May 2 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2s +5 R %z 1991 Au 31 2 +5 KG %z 2005 Au 12 +6 - %z +Z Asia/Chita 7:33:52 - LMT 1919 D 15 +8 - %z 1930 Jun 21 +9 R %z 1991 Mar 31 2s +8 R %z 1992 Ja 19 2s +9 R %z 2011 Mar 27 2s +10 - %z 2014 O 26 2s +8 - %z 2016 Mar 27 2 +9 - %z +Z Asia/Colombo 5:19:24 - LMT 1880 +5:19:32 - MMT 1906 +5:30 - %z 1942 Ja 5 +5:30 0:30 %z 1942 S +5:30 1 %z 1945 O 16 2 +5:30 - %z 1996 May 25 +6:30 - %z 1996 O 26 0:30 +6 - %z 2006 Ap 15 0:30 +5:30 - %z +Z Asia/Damascus 2:25:12 - LMT 1920 +2 S EE%sT 2022 O 28 +3 - %z +Z Asia/Dhaka 6:1:40 - LMT 1890 +5:53:20 - HMT 1941 O +6:30 - %z 1942 May 15 +5:30 - %z 1942 S +6:30 - %z 1951 S 30 +6 - %z 2009 +6 BD %z +Z Asia/Dili 8:22:20 - LMT 1911 D 31 16u +8 - %z 1942 F 21 23 +9 - %z 1976 May 3 +8 - %z 2000 S 17 +9 - %z +Z Asia/Dubai 3:41:12 - LMT 1920 +4 - %z +Z Asia/Dushanbe 4:35:12 - LMT 1924 May 2 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2s +5 1 %z 1991 S 9 2s +5 - %z +Z Asia/Famagusta 2:15:48 - LMT 1921 N 14 +2 CY EE%sT 1998 S +2 E EE%sT 2016 S 8 +3 - %z 2017 O 29 1u +2 E EE%sT +Z Asia/Gaza 2:17:52 - LMT 1900 O +2 Z EET/EEST 1948 May 15 +2 K EE%sT 1967 Jun 5 +2 Z I%sT 1996 +2 J EE%sT 1999 +2 P EE%sT 2008 Au 29 +2 - EET 2008 S +2 P EE%sT 2010 +2 - EET 2010 Mar 27 0:1 +2 P EE%sT 2011 Au +2 - EET 2012 +2 P EE%sT +Z Asia/Hebron 2:20:23 - LMT 1900 O +2 Z EET/EEST 1948 May 15 +2 K EE%sT 1967 Jun 5 +2 Z I%sT 1996 +2 J EE%sT 1999 +2 P EE%sT +Z Asia/Ho_Chi_Minh 7:6:30 - LMT 1906 Jul +7:6:30 - PLMT 1911 May +7 - %z 1942 D 31 23 +8 - %z 1945 Mar 14 23 +9 - %z 1945 S 1 24 +7 - %z 1947 Ap +8 - %z 1955 Jul 1 1 +7 - %z 1959 D 31 23 +8 - %z 1975 Jun 13 +7 - %z +Z Asia/Hong_Kong 7:36:42 - LMT 1904 O 29 17u +8 - HKT 1941 Jun 15 3 +8 1 HKST 1941 O 1 4 +8 0:30 HKWT 1941 D 25 +9 - JST 1945 N 18 2 +8 HK HK%sT +Z Asia/Hovd 6:6:36 - LMT 1905 Au +6 - %z 1978 +7 X %z +Z Asia/Irkutsk 6:57:5 - LMT 1880 +6:57:5 - IMT 1920 Ja 25 +7 - %z 1930 Jun 21 +8 R %z 1991 Mar 31 2s +7 R %z 1992 Ja 19 2s +8 R %z 2011 Mar 27 2s +9 - %z 2014 O 26 2s +8 - %z +Z Asia/Jakarta 7:7:12 - LMT 1867 Au 10 +7:7:12 - BMT 1923 D 31 16:40u +7:20 - %z 1932 N +7:30 - %z 1942 Mar 23 +9 - %z 1945 S 23 +7:30 - %z 1948 May +8 - %z 1950 May +7:30 - %z 1964 +7 - WIB +Z Asia/Jayapura 9:22:48 - LMT 1932 N +9 - %z 1944 S +9:30 - %z 1964 +9 - WIT +Z Asia/Jerusalem 2:20:54 - LMT 1880 +2:20:40 - JMT 1918 +2 Z I%sT +Z Asia/Kabul 4:36:48 - LMT 1890 +4 - %z 1945 +4:30 - %z +Z Asia/Kamchatka 10:34:36 - LMT 1922 N 10 +11 - %z 1930 Jun 21 +12 R %z 1991 Mar 31 2s +11 R %z 1992 Ja 19 2s +12 R %z 2010 Mar 28 2s +11 R %z 2011 Mar 27 2s +12 - %z +Z Asia/Karachi 4:28:12 - LMT 1907 +5:30 - %z 1942 S +5:30 1 %z 1945 O 15 +5:30 - %z 1951 S 30 +5 - %z 1971 Mar 26 +5 PK PK%sT +Z Asia/Kathmandu 5:41:16 - LMT 1920 +5:30 - %z 1986 +5:45 - %z +Z Asia/Khandyga 9:2:13 - LMT 1919 D 15 +8 - %z 1930 Jun 21 +9 R %z 1991 Mar 31 2s +8 R %z 1992 Ja 19 2s +9 R %z 2004 +10 R %z 2011 Mar 27 2s +11 - %z 2011 S 13 0s +10 - %z 2014 O 26 2s +9 - %z +Z Asia/Kolkata 5:53:28 - LMT 1854 Jun 28 +5:53:20 - HMT 1870 +5:21:10 - MMT 1906 +5:30 - IST 1941 O +5:30 1 %z 1942 May 15 +5:30 - IST 1942 S +5:30 1 %z 1945 O 15 +5:30 - IST +Z Asia/Krasnoyarsk 6:11:26 - LMT 1920 Ja 6 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 2011 Mar 27 2s +8 - %z 2014 O 26 2s +7 - %z +Z Asia/Kuching 7:21:20 - LMT 1926 Mar +7:30 - %z 1933 +8 NB %z 1942 F 16 +9 - %z 1945 S 12 +8 - %z +Z Asia/Macau 7:34:10 - LMT 1904 O 30 +8 - CST 1941 D 21 23 +9 _ %z 1945 S 30 24 +8 _ C%sT +Z Asia/Magadan 10:3:12 - LMT 1924 May 2 +10 - %z 1930 Jun 21 +11 R %z 1991 Mar 31 2s +10 R %z 1992 Ja 19 2s +11 R %z 2011 Mar 27 2s +12 - %z 2014 O 26 2s +10 - %z 2016 Ap 24 2s +11 - %z +Z Asia/Makassar 7:57:36 - LMT 1920 +7:57:36 - MMT 1932 N +8 - %z 1942 F 9 +9 - %z 1945 S 23 +8 - WITA +Z Asia/Manila -15:56:8 - LMT 1844 D 31 +8:3:52 - LMT 1899 S 6 4u +8 PH P%sT 1942 F 11 24 +9 - JST 1945 Mar 4 +8 PH P%sT +Z Asia/Nicosia 2:13:28 - LMT 1921 N 14 +2 CY EE%sT 1998 S +2 E EE%sT +Z Asia/Novokuznetsk 5:48:48 - LMT 1924 May +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 2010 Mar 28 2s +6 R %z 2011 Mar 27 2s +7 - %z +Z Asia/Novosibirsk 5:31:40 - LMT 1919 D 14 6 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 1993 May 23 +6 R %z 2011 Mar 27 2s +7 - %z 2014 O 26 2s +6 - %z 2016 Jul 24 2s +7 - %z +Z Asia/Omsk 4:53:30 - LMT 1919 N 14 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2s +5 R %z 1992 Ja 19 2s +6 R %z 2011 Mar 27 2s +7 - %z 2014 O 26 2s +6 - %z +Z Asia/Oral 3:25:24 - LMT 1924 May 2 +3 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1989 Mar 26 2s +4 R %z 1992 Ja 19 2s +5 R %z 1992 Mar 29 2s +4 R %z 2004 O 31 2s +5 - %z +Z Asia/Pontianak 7:17:20 - LMT 1908 May +7:17:20 - PMT 1932 N +7:30 - %z 1942 Ja 29 +9 - %z 1945 S 23 +7:30 - %z 1948 May +8 - %z 1950 May +7:30 - %z 1964 +8 - WITA 1988 +7 - WIB +Z Asia/Pyongyang 8:23 - LMT 1908 Ap +8:30 - KST 1912 +9 - JST 1945 Au 24 +9 - KST 2015 Au 15 +8:30 - KST 2018 May 4 23:30 +9 - KST +Z Asia/Qatar 3:26:8 - LMT 1920 +4 - %z 1972 Jun +3 - %z +Z Asia/Qostanay 4:14:28 - LMT 1924 May 2 +4 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 2004 O 31 2s +6 - %z 2024 Mar +5 - %z +Z Asia/Qyzylorda 4:21:52 - LMT 1924 May 2 +4 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1991 Mar 31 2s +4 R %z 1991 S 29 2s +5 R %z 1992 Ja 19 2s +6 R %z 1992 Mar 29 2s +5 R %z 2004 O 31 2s +6 - %z 2018 D 21 +5 - %z +Z Asia/Riyadh 3:6:52 - LMT 1947 Mar 14 +3 - %z +Z Asia/Sakhalin 9:30:48 - LMT 1905 Au 23 +9 - %z 1945 Au 25 +11 R %z 1991 Mar 31 2s +10 R %z 1992 Ja 19 2s +11 R %z 1997 Mar lastSu 2s +10 R %z 2011 Mar 27 2s +11 - %z 2014 O 26 2s +10 - %z 2016 Mar 27 2s +11 - %z +Z Asia/Samarkand 4:27:53 - LMT 1924 May 2 +4 - %z 1930 Jun 21 +5 - %z 1981 Ap +5 1 %z 1981 O +6 - %z 1982 Ap +5 R %z 1992 +5 - %z +Z Asia/Seoul 8:27:52 - LMT 1908 Ap +8:30 - KST 1912 +9 - JST 1945 S 8 +9 KR K%sT 1954 Mar 21 +8:30 KR K%sT 1961 Au 10 +9 KR K%sT +Z Asia/Shanghai 8:5:43 - LMT 1901 +8 Sh C%sT 1949 May 28 +8 CN C%sT +Z Asia/Singapore 6:55:25 - LMT 1901 +6:55:25 - SMT 1905 Jun +7 - %z 1933 +7 0:20 %z 1936 +7:20 - %z 1941 S +7:30 - %z 1942 F 16 +9 - %z 1945 S 12 +7:30 - %z 1981 D 31 16u +8 - %z +Z Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2 +10 - %z 1930 Jun 21 +11 R %z 1991 Mar 31 2s +10 R %z 1992 Ja 19 2s +11 R %z 2011 Mar 27 2s +12 - %z 2014 O 26 2s +11 - %z +Z Asia/Taipei 8:6 - LMT 1896 +8 - CST 1937 O +9 - JST 1945 S 21 1 +8 f C%sT +Z Asia/Tashkent 4:37:11 - LMT 1924 May 2 +5 - %z 1930 Jun 21 +6 R %z 1991 Mar 31 2 +5 R %z 1992 +5 - %z +Z Asia/Tbilisi 2:59:11 - LMT 1880 +2:59:11 - TBMT 1924 May 2 +3 - %z 1957 Mar +4 R %z 1991 Mar 31 2s +3 R %z 1992 +3 e %z 1994 S lastSu +4 e %z 1996 O lastSu +4 1 %z 1997 Mar lastSu +4 e %z 2004 Jun 27 +3 R %z 2005 Mar lastSu 2 +4 - %z +Z Asia/Tehran 3:25:44 - LMT 1916 +3:25:44 - TMT 1935 Jun 13 +3:30 i %z 1977 O 20 24 +4 i %z 1978 N 10 24 +3:30 i %z +Z Asia/Thimphu 5:58:36 - LMT 1947 Au 15 +5:30 - %z 1987 O +6 - %z +Z Asia/Tokyo 9:18:59 - LMT 1887 D 31 15u +9 JP J%sT +Z Asia/Tomsk 5:39:51 - LMT 1919 D 22 +6 - %z 1930 Jun 21 +7 R %z 1991 Mar 31 2s +6 R %z 1992 Ja 19 2s +7 R %z 2002 May 1 3 +6 R %z 2011 Mar 27 2s +7 - %z 2014 O 26 2s +6 - %z 2016 May 29 2s +7 - %z +Z Asia/Ulaanbaatar 7:7:32 - LMT 1905 Au +7 - %z 1978 +8 X %z +Z Asia/Urumqi 5:50:20 - LMT 1928 +6 - %z +Z Asia/Ust-Nera 9:32:54 - LMT 1919 D 15 +8 - %z 1930 Jun 21 +9 R %z 1981 Ap +11 R %z 1991 Mar 31 2s +10 R %z 1992 Ja 19 2s +11 R %z 2011 Mar 27 2s +12 - %z 2011 S 13 0s +11 - %z 2014 O 26 2s +10 - %z +Z Asia/Vladivostok 8:47:31 - LMT 1922 N 15 +9 - %z 1930 Jun 21 +10 R %z 1991 Mar 31 2s +9 R %z 1992 Ja 19 2s +10 R %z 2011 Mar 27 2s +11 - %z 2014 O 26 2s +10 - %z +Z Asia/Yakutsk 8:38:58 - LMT 1919 D 15 +8 - %z 1930 Jun 21 +9 R %z 1991 Mar 31 2s +8 R %z 1992 Ja 19 2s +9 R %z 2011 Mar 27 2s +10 - %z 2014 O 26 2s +9 - %z +Z Asia/Yangon 6:24:47 - LMT 1880 +6:24:47 - RMT 1920 +6:30 - %z 1942 May +9 - %z 1945 May 3 +6:30 - %z +Z Asia/Yekaterinburg 4:2:33 - LMT 1916 Jul 3 +3:45:5 - PMT 1919 Jul 15 4 +4 - %z 1930 Jun 21 +5 R %z 1991 Mar 31 2s +4 R %z 1992 Ja 19 2s +5 R %z 2011 Mar 27 2s +6 - %z 2014 O 26 2s +5 - %z +Z Asia/Yerevan 2:58 - LMT 1924 May 2 +3 - %z 1957 Mar +4 R %z 1991 Mar 31 2s +3 R %z 1995 S 24 2s +4 - %z 1997 +4 R %z 2011 +4 AM %z +Z Atlantic/Azores -1:42:40 - LMT 1884 +-1:54:32 - HMT 1912 Ja 1 2u +-2 p %z 1966 O 2 2s +-1 - %z 1982 Mar 28 0s +-1 p %z 1986 +-1 E %z 1992 D 27 1s +0 E WE%sT 1993 Jun 17 1u +-1 E %z +Z Atlantic/Bermuda -4:19:18 - LMT 1890 +-4:19:18 Be BMT/BST 1930 Ja 1 2 +-4 Be A%sT 1974 Ap 28 2 +-4 C A%sT 1976 +-4 u A%sT +Z Atlantic/Canary -1:1:36 - LMT 1922 Mar +-1 - %z 1946 S 30 1 +0 - WET 1980 Ap 6 0s +0 1 WEST 1980 S 28 1u +0 E WE%sT +Z Atlantic/Cape_Verde -1:34:4 - LMT 1912 Ja 1 2u +-2 - %z 1942 S +-2 1 %z 1945 O 15 +-2 - %z 1975 N 25 2 +-1 - %z +Z Atlantic/Faroe -0:27:4 - LMT 1908 Ja 11 +0 - WET 1981 +0 E WE%sT +Z Atlantic/Madeira -1:7:36 - LMT 1884 +-1:7:36 - FMT 1912 Ja 1 1u +-1 p %z 1966 O 2 2s +0 - WET 1982 Ap 4 +0 p WE%sT 1986 Jul 31 +0 E WE%sT +Z Atlantic/South_Georgia -2:26:8 - LMT 1890 +-2 - %z +Z Atlantic/Stanley -3:51:24 - LMT 1890 +-3:51:24 - SMT 1912 Mar 12 +-4 FK %z 1983 May +-3 FK %z 1985 S 15 +-4 FK %z 2010 S 5 2 +-3 - %z +Z Australia/Adelaide 9:14:20 - LMT 1895 F +9 - ACST 1899 May +9:30 AU AC%sT 1971 +9:30 AS AC%sT +Z Australia/Brisbane 10:12:8 - LMT 1895 +10 AU AE%sT 1971 +10 AQ AE%sT +Z Australia/Broken_Hill 9:25:48 - LMT 1895 F +10 - AEST 1896 Au 23 +9 - ACST 1899 May +9:30 AU AC%sT 1971 +9:30 AN AC%sT 2000 +9:30 AS AC%sT +Z Australia/Darwin 8:43:20 - LMT 1895 F +9 - ACST 1899 May +9:30 AU AC%sT +Z Australia/Eucla 8:35:28 - LMT 1895 D +8:45 AU %z 1943 Jul +8:45 AW %z +Z Australia/Hobart 9:49:16 - LMT 1895 S +10 AT AE%sT 1919 O 24 +10 AU AE%sT 1967 +10 AT AE%sT +Z Australia/Lindeman 9:55:56 - LMT 1895 +10 AU AE%sT 1971 +10 AQ AE%sT 1992 Jul +10 Ho AE%sT +Z Australia/Lord_Howe 10:36:20 - LMT 1895 F +10 - AEST 1981 Mar +10:30 LH %z 1985 Jul +10:30 LH %z +Z Australia/Melbourne 9:39:52 - LMT 1895 F +10 AU AE%sT 1971 +10 AV AE%sT +Z Australia/Perth 7:43:24 - LMT 1895 D +8 AU AW%sT 1943 Jul +8 AW AW%sT +Z Australia/Sydney 10:4:52 - LMT 1895 F +10 AU AE%sT 1971 +10 AN AE%sT +Z Etc/GMT 0 - GMT +Z Etc/GMT+1 -1 - %z +Z Etc/GMT+10 -10 - %z +Z Etc/GMT+11 -11 - %z +Z Etc/GMT+12 -12 - %z +Z Etc/GMT+2 -2 - %z +Z Etc/GMT+3 -3 - %z +Z Etc/GMT+4 -4 - %z +Z Etc/GMT+5 -5 - %z +Z Etc/GMT+6 -6 - %z +Z Etc/GMT+7 -7 - %z +Z Etc/GMT+8 -8 - %z +Z Etc/GMT+9 -9 - %z +Z Etc/GMT-1 1 - %z +Z Etc/GMT-10 10 - %z +Z Etc/GMT-11 11 - %z +Z Etc/GMT-12 12 - %z +Z Etc/GMT-13 13 - %z +Z Etc/GMT-14 14 - %z +Z Etc/GMT-2 2 - %z +Z Etc/GMT-3 3 - %z +Z Etc/GMT-4 4 - %z +Z Etc/GMT-5 5 - %z +Z Etc/GMT-6 6 - %z +Z Etc/GMT-7 7 - %z +Z Etc/GMT-8 8 - %z +Z Etc/GMT-9 9 - %z +Z Etc/UTC 0 - UTC +Z Europe/Andorra 0:6:4 - LMT 1901 +0 - WET 1946 S 30 +1 - CET 1985 Mar 31 2 +1 E CE%sT +Z Europe/Astrakhan 3:12:12 - LMT 1924 May +3 - %z 1930 Jun 21 +4 R %z 1989 Mar 26 2s +3 R %z 1991 Mar 31 2s +4 - %z 1992 Mar 29 2s +3 R %z 2011 Mar 27 2s +4 - %z 2014 O 26 2s +3 - %z 2016 Mar 27 2s +4 - %z +Z Europe/Athens 1:34:52 - LMT 1895 S 14 +1:34:52 - AMT 1916 Jul 28 0:1 +2 g EE%sT 1941 Ap 30 +1 g CE%sT 1944 Ap 4 +2 g EE%sT 1981 +2 E EE%sT +Z Europe/Belgrade 1:22 - LMT 1884 +1 - CET 1941 Ap 18 23 +1 c CE%sT 1945 +1 - CET 1945 May 8 2s +1 1 CEST 1945 S 16 2s +1 - CET 1982 N 27 +1 E CE%sT +Z Europe/Berlin 0:53:28 - LMT 1893 Ap +1 c CE%sT 1945 May 24 2 +1 So CE%sT 1946 +1 DE CE%sT 1980 +1 E CE%sT +Z Europe/Brussels 0:17:30 - LMT 1880 +0:17:30 - BMT 1892 May 1 0:17:30 +0 - WET 1914 N 8 +1 - CET 1916 May +1 c CE%sT 1918 N 11 11u +0 b WE%sT 1940 May 20 2s +1 c CE%sT 1944 S 3 +1 b CE%sT 1977 +1 E CE%sT +Z Europe/Bucharest 1:44:24 - LMT 1891 O +1:44:24 - BMT 1931 Jul 24 +2 z EE%sT 1981 Mar 29 2s +2 c EE%sT 1991 +2 z EE%sT 1994 +2 e EE%sT 1997 +2 E EE%sT +Z Europe/Budapest 1:16:20 - LMT 1890 N +1 c CE%sT 1918 +1 h CE%sT 1941 Ap 7 23 +1 c CE%sT 1945 +1 h CE%sT 1984 +1 E CE%sT +Z Europe/Chisinau 1:55:20 - LMT 1880 +1:55 - CMT 1918 F 15 +1:44:24 - BMT 1931 Jul 24 +2 z EE%sT 1940 Au 15 +2 1 EEST 1941 Jul 17 +1 c CE%sT 1944 Au 24 +3 R MSK/MSD 1990 May 6 2 +2 R EE%sT 1992 +2 e EE%sT 1997 +2 MD EE%sT +Z Europe/Dublin -0:25:21 - LMT 1880 Au 2 +-0:25:21 - DMT 1916 May 21 2s +-0:25:21 1 IST 1916 O 1 2s +0 G %s 1921 D 6 +0 G GMT/IST 1940 F 25 2s +0 1 IST 1946 O 6 2s +0 - GMT 1947 Mar 16 2s +0 1 IST 1947 N 2 2s +0 - GMT 1948 Ap 18 2s +0 G GMT/IST 1968 O 27 +1 IE IST/GMT +Z Europe/Gibraltar -0:21:24 - LMT 1880 Au 2 +0 G %s 1957 Ap 14 2 +1 - CET 1982 +1 E CE%sT +Z Europe/Helsinki 1:39:49 - LMT 1878 May 31 +1:39:49 - HMT 1921 May +2 FI EE%sT 1983 +2 E EE%sT +Z Europe/Istanbul 1:55:52 - LMT 1880 +1:56:56 - IMT 1910 O +2 T EE%sT 1978 Jun 29 +3 T %z 1984 N 1 2 +2 T EE%sT 2007 +2 E EE%sT 2011 Mar 27 1u +2 - EET 2011 Mar 28 1u +2 E EE%sT 2014 Mar 30 1u +2 - EET 2014 Mar 31 1u +2 E EE%sT 2015 O 25 1u +2 1 EEST 2015 N 8 1u +2 E EE%sT 2016 S 7 +3 - %z +Z Europe/Kaliningrad 1:22 - LMT 1893 Ap +1 c CE%sT 1945 Ap 10 +2 O EE%sT 1946 Ap 7 +3 R MSK/MSD 1989 Mar 26 2s +2 R EE%sT 2011 Mar 27 2s +3 - %z 2014 O 26 2s +2 - EET +Z Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0u +3 - %z 1930 Jun 21 +4 R %z 1989 Mar 26 2s +3 R MSK/MSD 1991 Mar 31 2s +4 - %z 1992 Mar 29 2s +3 R MSK/MSD 2011 Mar 27 2s +4 - MSK 2014 O 26 2s +3 - MSK +Z Europe/Kyiv 2:2:4 - LMT 1880 +2:2:4 - KMT 1924 May 2 +2 - EET 1930 Jun 21 +3 - MSK 1941 S 20 +1 c CE%sT 1943 N 6 +3 R MSK/MSD 1990 Jul 1 2 +2 1 EEST 1991 S 29 3 +2 c EE%sT 1996 May 13 +2 E EE%sT +Z Europe/Lisbon -0:36:45 - LMT 1884 +-0:36:45 - LMT 1912 Ja 1 0u +0 p WE%sT 1966 O 2 2s +1 - CET 1976 S 26 1 +0 p WE%sT 1986 +0 E WE%sT 1992 S 27 1u +1 E CE%sT 1996 Mar 31 1u +0 E WE%sT +Z Europe/London -0:1:15 - LMT 1847 D +0 G %s 1968 O 27 +1 - BST 1971 O 31 2u +0 G %s 1996 +0 E GMT/BST +Z Europe/Madrid -0:14:44 - LMT 1901 Ja 1 0u +0 s WE%sT 1940 Mar 16 23 +1 s CE%sT 1979 +1 E CE%sT +Z Europe/Malta 0:58:4 - LMT 1893 N 2 +1 I CE%sT 1973 Mar 31 +1 MT CE%sT 1981 +1 E CE%sT +Z Europe/Minsk 1:50:16 - LMT 1880 +1:50 - MMT 1924 May 2 +2 - EET 1930 Jun 21 +3 - MSK 1941 Jun 28 +1 c CE%sT 1944 Jul 3 +3 R MSK/MSD 1990 +3 - MSK 1991 Mar 31 2s +2 R EE%sT 2011 Mar 27 2s +3 - %z +Z Europe/Moscow 2:30:17 - LMT 1880 +2:30:17 - MMT 1916 Jul 3 +2:31:19 R %s 1919 Jul 1 0u +3 R %s 1921 O +3 R MSK/MSD 1922 O +2 - EET 1930 Jun 21 +3 R MSK/MSD 1991 Mar 31 2s +2 R EE%sT 1992 Ja 19 2s +3 R MSK/MSD 2011 Mar 27 2s +4 - MSK 2014 O 26 2s +3 - MSK +Z Europe/Paris 0:9:21 - LMT 1891 Mar 16 +0:9:21 - PMT 1911 Mar 11 +0 F WE%sT 1940 Jun 14 23 +1 c CE%sT 1944 Au 25 +0 F WE%sT 1945 S 16 3 +1 F CE%sT 1977 +1 E CE%sT +Z Europe/Prague 0:57:44 - LMT 1850 +0:57:44 - PMT 1891 O +1 c CE%sT 1945 May 9 +1 CZ CE%sT 1946 D 1 3 +1 -1 GMT 1947 F 23 2 +1 CZ CE%sT 1979 +1 E CE%sT +Z Europe/Riga 1:36:34 - LMT 1880 +1:36:34 - RMT 1918 Ap 15 2 +1:36:34 1 LST 1918 S 16 3 +1:36:34 - RMT 1919 Ap 1 2 +1:36:34 1 LST 1919 May 22 3 +1:36:34 - RMT 1926 May 11 +2 - EET 1940 Au 5 +3 - MSK 1941 Jul +1 c CE%sT 1944 O 13 +3 R MSK/MSD 1989 Mar lastSu 2s +2 1 EEST 1989 S lastSu 2s +2 LV EE%sT 1997 Ja 21 +2 E EE%sT 2000 F 29 +2 - EET 2001 Ja 2 +2 E EE%sT +Z Europe/Rome 0:49:56 - LMT 1866 D 12 +0:49:56 - RMT 1893 O 31 23u +1 I CE%sT 1943 S 10 +1 c CE%sT 1944 Jun 4 +1 I CE%sT 1980 +1 E CE%sT +Z Europe/Samara 3:20:20 - LMT 1919 Jul 1 0u +3 - %z 1930 Jun 21 +4 - %z 1935 Ja 27 +4 R %z 1989 Mar 26 2s +3 R %z 1991 Mar 31 2s +2 R %z 1991 S 29 2s +3 - %z 1991 O 20 3 +4 R %z 2010 Mar 28 2s +3 R %z 2011 Mar 27 2s +4 - %z +Z Europe/Saratov 3:4:18 - LMT 1919 Jul 1 0u +3 - %z 1930 Jun 21 +4 R %z 1988 Mar 27 2s +3 R %z 1991 Mar 31 2s +4 - %z 1992 Mar 29 2s +3 R %z 2011 Mar 27 2s +4 - %z 2014 O 26 2s +3 - %z 2016 D 4 2s +4 - %z +Z Europe/Simferopol 2:16:24 - LMT 1880 +2:16 - SMT 1924 May 2 +2 - EET 1930 Jun 21 +3 - MSK 1941 N +1 c CE%sT 1944 Ap 13 +3 R MSK/MSD 1990 +3 - MSK 1990 Jul 1 2 +2 - EET 1992 Mar 20 +2 c EE%sT 1994 May +3 c MSK/MSD 1996 Mar 31 0s +3 1 MSD 1996 O 27 3s +3 - MSK 1997 Mar lastSu 1u +2 E EE%sT 2014 Mar 30 2 +4 - MSK 2014 O 26 2s +3 - MSK +Z Europe/Sofia 1:33:16 - LMT 1880 +1:56:56 - IMT 1894 N 30 +2 - EET 1942 N 2 3 +1 c CE%sT 1945 +1 - CET 1945 Ap 2 3 +2 - EET 1979 Mar 31 23 +2 BG EE%sT 1982 S 26 3 +2 c EE%sT 1991 +2 e EE%sT 1997 +2 E EE%sT +Z Europe/Tallinn 1:39 - LMT 1880 +1:39 - TMT 1918 F +1 c CE%sT 1919 Jul +1:39 - TMT 1921 May +2 - EET 1940 Au 6 +3 - MSK 1941 S 15 +1 c CE%sT 1944 S 22 +3 R MSK/MSD 1989 Mar 26 2s +2 1 EEST 1989 S 24 2s +2 c EE%sT 1998 S 22 +2 E EE%sT 1999 O 31 4 +2 - EET 2002 F 21 +2 E EE%sT +Z Europe/Tirane 1:19:20 - LMT 1914 +1 - CET 1940 Jun 16 +1 q CE%sT 1984 Jul +1 E CE%sT +Z Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0u +3 - %z 1930 Jun 21 +4 R %z 1989 Mar 26 2s +3 R %z 1991 Mar 31 2s +2 R %z 1992 Ja 19 2s +3 R %z 2011 Mar 27 2s +4 - %z 2014 O 26 2s +3 - %z 2016 Mar 27 2s +4 - %z +Z Europe/Vienna 1:5:21 - LMT 1893 Ap +1 c CE%sT 1920 +1 a CE%sT 1940 Ap 1 2s +1 c CE%sT 1945 Ap 2 2s +1 1 CEST 1945 Ap 12 2s +1 - CET 1946 +1 a CE%sT 1981 +1 E CE%sT +Z Europe/Vilnius 1:41:16 - LMT 1880 +1:24 - WMT 1917 +1:35:36 - KMT 1919 O 10 +1 - CET 1920 Jul 12 +2 - EET 1920 O 9 +1 - CET 1940 Au 3 +3 - MSK 1941 Jun 24 +1 c CE%sT 1944 Au +3 R MSK/MSD 1989 Mar 26 2s +2 R EE%sT 1991 S 29 2s +2 c EE%sT 1998 +2 - EET 1998 Mar 29 1u +1 E CE%sT 1999 O 31 1u +2 - EET 2003 +2 E EE%sT +Z Europe/Volgograd 2:57:40 - LMT 1920 Ja 3 +3 - %z 1930 Jun 21 +4 - %z 1961 N 11 +4 R %z 1988 Mar 27 2s +3 R MSK/MSD 1991 Mar 31 2s +4 - %z 1992 Mar 29 2s +3 R MSK/MSD 2011 Mar 27 2s +4 - MSK 2014 O 26 2s +3 - MSK 2018 O 28 2s +4 - %z 2020 D 27 2s +3 - MSK +Z Europe/Warsaw 1:24 - LMT 1880 +1:24 - WMT 1915 Au 5 +1 c CE%sT 1918 S 16 3 +2 O EE%sT 1922 Jun +1 O CE%sT 1940 Jun 23 2 +1 c CE%sT 1944 O +1 O CE%sT 1977 +1 W- CE%sT 1988 +1 E CE%sT +Z Europe/Zurich 0:34:8 - LMT 1853 Jul 16 +0:29:46 - BMT 1894 Jun +1 CH CE%sT 1981 +1 E CE%sT +Z Factory 0 - -00 +Z Indian/Chagos 4:49:40 - LMT 1907 +5 - %z 1996 +6 - %z +Z Indian/Maldives 4:54 - LMT 1880 +4:54 - MMT 1960 +5 - %z +Z Indian/Mauritius 3:50 - LMT 1907 +4 MU %z +Z Pacific/Apia 12:33:4 - LMT 1892 Jul 5 +-11:26:56 - LMT 1911 +-11:30 - %z 1950 +-11 WS %z 2011 D 29 24 +13 WS %z +Z Pacific/Auckland 11:39:4 - LMT 1868 N 2 +11:30 NZ NZ%sT 1946 +12 NZ NZ%sT +Z Pacific/Bougainville 10:22:16 - LMT 1880 +9:48:32 - PMMT 1895 +10 - %z 1942 Jul +9 - %z 1945 Au 21 +10 - %z 2014 D 28 2 +11 - %z +Z Pacific/Chatham 12:13:48 - LMT 1868 N 2 +12:15 - %z 1946 +12:45 k %z +Z Pacific/Easter -7:17:28 - LMT 1890 +-7:17:28 - EMT 1932 S +-7 x %z 1982 Mar 14 3u +-6 x %z +Z Pacific/Efate 11:13:16 - LMT 1912 Ja 13 +11 VU %z +Z Pacific/Fakaofo -11:24:56 - LMT 1901 +-11 - %z 2011 D 30 +13 - %z +Z Pacific/Fiji 11:55:44 - LMT 1915 O 26 +12 FJ %z +Z Pacific/Galapagos -5:58:24 - LMT 1931 +-5 - %z 1986 +-6 EC %z +Z Pacific/Gambier -8:59:48 - LMT 1912 O +-9 - %z +Z Pacific/Guadalcanal 10:39:48 - LMT 1912 O +11 - %z +Z Pacific/Guam -14:21 - LMT 1844 D 31 +9:39 - LMT 1901 +10 - GST 1941 D 10 +9 - %z 1944 Jul 31 +10 Gu G%sT 2000 D 23 +10 - ChST +Z Pacific/Honolulu -10:31:26 - LMT 1896 Ja 13 12 +-10:30 - HST 1933 Ap 30 2 +-10:30 1 HDT 1933 May 21 12 +-10:30 u H%sT 1947 Jun 8 2 +-10 - HST +Z Pacific/Kanton 0 - -00 1937 Au 31 +-12 - %z 1979 O +-11 - %z 1994 D 31 +13 - %z +Z Pacific/Kiritimati -10:29:20 - LMT 1901 +-10:40 - %z 1979 O +-10 - %z 1994 D 31 +14 - %z +Z Pacific/Kosrae -13:8:4 - LMT 1844 D 31 +10:51:56 - LMT 1901 +11 - %z 1914 O +9 - %z 1919 F +11 - %z 1937 +10 - %z 1941 Ap +9 - %z 1945 Au +11 - %z 1969 O +12 - %z 1999 +11 - %z +Z Pacific/Kwajalein 11:9:20 - LMT 1901 +11 - %z 1937 +10 - %z 1941 Ap +9 - %z 1944 F 6 +11 - %z 1969 O +-12 - %z 1993 Au 20 24 +12 - %z +Z Pacific/Marquesas -9:18 - LMT 1912 O +-9:30 - %z +Z Pacific/Nauru 11:7:40 - LMT 1921 Ja 15 +11:30 - %z 1942 Au 29 +9 - %z 1945 S 8 +11:30 - %z 1979 F 10 2 +12 - %z +Z Pacific/Niue -11:19:40 - LMT 1952 O 16 +-11:20 - %z 1964 Jul +-11 - %z +Z Pacific/Norfolk 11:11:52 - LMT 1901 +11:12 - %z 1951 +11:30 - %z 1974 O 27 2s +11:30 1 %z 1975 Mar 2 2s +11:30 - %z 2015 O 4 2s +11 - %z 2019 Jul +11 AN %z +Z Pacific/Noumea 11:5:48 - LMT 1912 Ja 13 +11 NC %z +Z Pacific/Pago_Pago 12:37:12 - LMT 1892 Jul 5 +-11:22:48 - LMT 1911 +-11 - SST +Z Pacific/Palau -15:2:4 - LMT 1844 D 31 +8:57:56 - LMT 1901 +9 - %z +Z Pacific/Pitcairn -8:40:20 - LMT 1901 +-8:30 - %z 1998 Ap 27 +-8 - %z +Z Pacific/Port_Moresby 9:48:40 - LMT 1880 +9:48:32 - PMMT 1895 +10 - %z +Z Pacific/Rarotonga 13:20:56 - LMT 1899 D 26 +-10:39:4 - LMT 1952 O 16 +-10:30 - %z 1978 N 12 +-10 CK %z +Z Pacific/Tahiti -9:58:16 - LMT 1912 O +-10 - %z +Z Pacific/Tarawa 11:32:4 - LMT 1901 +12 - %z +Z Pacific/Tongatapu 12:19:12 - LMT 1945 S 10 +12:20 - %z 1961 +13 - %z 1999 +13 TO %z +L Etc/GMT GMT L Australia/Sydney Australia/ACT L Australia/Lord_Howe Australia/LHI L Australia/Sydney Australia/NSW @@ -4052,6 +4056,8 @@ L America/Rio_Branco Brazil/Acre L America/Noronha Brazil/DeNoronha L America/Sao_Paulo Brazil/East L America/Manaus Brazil/West +L Europe/Brussels CET +L America/Chicago CST6CDT L America/Halifax Canada/Atlantic L America/Winnipeg Canada/Central L America/Toronto Canada/Eastern @@ -4063,6 +4069,9 @@ L America/Whitehorse Canada/Yukon L America/Santiago Chile/Continental L Pacific/Easter Chile/EasterIsland L America/Havana Cuba +L Europe/Athens EET +L America/Panama EST +L America/New_York EST5EDT L Africa/Cairo Egypt L Europe/Dublin Eire L Etc/GMT Etc/GMT+0 @@ -4086,6 +4095,9 @@ L America/Jamaica Jamaica L Asia/Tokyo Japan L Pacific/Kwajalein Kwajalein L Africa/Tripoli Libya +L Europe/Brussels MET +L America/Phoenix MST +L America/Denver MST7MDT L America/Tijuana Mexico/BajaNorte L America/Mazatlan Mexico/BajaSur L America/Mexico_City Mexico/General @@ -4185,7 +4197,6 @@ L America/Puerto_Rico America/Tortola L Pacific/Port_Moresby Antarctica/DumontDUrville L Pacific/Auckland Antarctica/McMurdo L Asia/Riyadh Antarctica/Syowa -L Asia/Urumqi Antarctica/Vostok L Europe/Berlin Arctic/Longyearbyen L Asia/Riyadh Asia/Aden L Asia/Qatar Asia/Bahrain @@ -4250,6 +4261,7 @@ L America/Denver America/Shiprock L America/Toronto America/Thunder_Bay L America/Edmonton America/Yellowknife L Pacific/Auckland Antarctica/South_Pole +L Asia/Ulaanbaatar Asia/Choibalsan L Asia/Shanghai Asia/Chongqing L Asia/Shanghai Asia/Harbin L Asia/Urumqi Asia/Kashgar @@ -4264,6 +4276,7 @@ L Europe/Kyiv Europe/Zaporozhye L Pacific/Kanton Pacific/Enderbury L Pacific/Honolulu Pacific/Johnston L Pacific/Port_Moresby Pacific/Yap +L Europe/Lisbon WET L Africa/Nairobi Africa/Asmera L America/Nuuk America/Godthab L Asia/Ashgabat Asia/Ashkhabad @@ -4281,5 +4294,7 @@ L Asia/Ulaanbaatar Asia/Ulan_Bator L Atlantic/Faroe Atlantic/Faeroe L Europe/Kyiv Europe/Kiev L Asia/Nicosia Europe/Nicosia +L Pacific/Honolulu HST +L America/Los_Angeles PST8PDT L Pacific/Guadalcanal Pacific/Ponape L Pacific/Port_Moresby Pacific/Truk diff --git a/src/timezone/known_abbrevs.txt b/src/timezone/known_abbrevs.txt index d03fe0af1316a..efdf9092b160a 100644 --- a/src/timezone/known_abbrevs.txt +++ b/src/timezone/known_abbrevs.txt @@ -80,8 +80,6 @@ IST 7200 JST 32400 KST 32400 MDT -21600 D -MEST 7200 D -MET 3600 MSK 10800 MST -25200 NDT -9000 D diff --git a/src/timezone/localtime.c b/src/timezone/localtime.c index ad83c7ee5e09e..0bc160ea7d79f 100644 --- a/src/timezone/localtime.c +++ b/src/timezone/localtime.c @@ -66,7 +66,7 @@ enum r_type { JULIAN_DAY, /* Jn = Julian day */ DAY_OF_YEAR, /* n = day of year */ - MONTH_NTH_DAY_OF_WEEK /* Mm.n.d = month, week, day of week */ + MONTH_NTH_DAY_OF_WEEK, /* Mm.n.d = month, week, day of week */ }; struct rule diff --git a/src/timezone/meson.build b/src/timezone/meson.build index 7b85a01c6bd93..391150ba885df 100644 --- a/src/timezone/meson.build +++ b/src/timezone/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group # files to build into backend timezone_sources = files( diff --git a/src/timezone/pgtz.c b/src/timezone/pgtz.c index c03078f7c83e6..ce36023fb4166 100644 --- a/src/timezone/pgtz.c +++ b/src/timezone/pgtz.c @@ -3,7 +3,7 @@ * pgtz.c * Timezone Library Integration Functions * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/timezone/pgtz.c diff --git a/src/timezone/pgtz.h b/src/timezone/pgtz.h index a5169aa2aa95c..8be88fad7d4bd 100644 --- a/src/timezone/pgtz.h +++ b/src/timezone/pgtz.h @@ -6,7 +6,7 @@ * Note: this file contains only definitions that are private to the * timezone library. Public definitions are in pgtime.h. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * * IDENTIFICATION * src/timezone/pgtz.h diff --git a/src/timezone/tznames/Default b/src/timezone/tznames/Default index 8a4dc59f88621..5e692423b5a60 100644 --- a/src/timezone/tznames/Default +++ b/src/timezone/tznames/Default @@ -551,12 +551,10 @@ EETDST 10800 D # East-Egypt Summertime FET 10800 # Further-eastern European Time (obsolete) # (Europe/Kaliningrad) # (Europe/Minsk) -MEST 7200 D # Middle Europe Summer Time - # (MET) +MEST 7200 D # Middle Europe Summer Time (obsolete) MESZ 7200 D # Mitteleuropaeische Sommerzeit (German) # (attested in IANA comments though not their code) -MET 3600 # Middle Europe Time - # (MET) +MET 3600 # Middle Europe Time (obsolete) METDST 7200 D # Middle Europe Summer Time (not in IANA database) MEZ 3600 # Mitteleuropaeische Zeit (German) # (attested in IANA comments though not their code) @@ -618,7 +616,6 @@ NZST 43200 # New Zealand Standard Time # (Antarctica/McMurdo) # (Pacific/Auckland) PGT 36000 # Papua New Guinea Time (obsolete) -PHOT Pacific/Enderbury # Phoenix Islands Time (Kiribati) (obsolete) PONT 39600 # Ponape Time (Micronesia) (obsolete) PWT 32400 # Palau Time (obsolete) TAHT -36000 # Tahiti Time (obsolete) diff --git a/src/timezone/tznames/Europe.txt b/src/timezone/tznames/Europe.txt index 2e762b90700f6..7a7a8340456c4 100644 --- a/src/timezone/tznames/Europe.txt +++ b/src/timezone/tznames/Europe.txt @@ -183,12 +183,10 @@ GMT 0 # Greenwich Mean Time # - IST: Israel Standard Time (Asia) IST 3600 # Irish Standard Time # (Europe/Dublin) -MEST 7200 D # Middle Europe Summer Time - # (MET) +MEST 7200 D # Middle Europe Summer Time (obsolete) MESZ 7200 D # Mitteleuropaeische Sommerzeit (German) # (attested in IANA comments though not their code) -MET 3600 # Middle Europe Time - # (MET) +MET 3600 # Middle Europe Time (obsolete) METDST 7200 D # Middle Europe Summer Time (not in IANA database) MEZ 3600 # Mitteleuropaeische Zeit (German) # (attested in IANA comments though not their code) diff --git a/src/timezone/tznames/Pacific.txt b/src/timezone/tznames/Pacific.txt index c30008cb049fa..556a370af587f 100644 --- a/src/timezone/tznames/Pacific.txt +++ b/src/timezone/tznames/Pacific.txt @@ -50,7 +50,7 @@ NZST 43200 # New Zealand Standard Time # (Antarctica/McMurdo) # (Pacific/Auckland) PGT 36000 # Papua New Guinea Time (obsolete) -PHOT Pacific/Enderbury # Phoenix Islands Time (Kiribati) (obsolete) +PHOT Pacific/Kanton # Phoenix Islands Time (Kiribati) (obsolete) PONT 39600 # Ponape Time (Micronesia) (obsolete) # CONFLICT! PST is not unique # Other timezones: diff --git a/src/timezone/tznames/meson.build b/src/timezone/tznames/meson.build index 09f8e692e69f8..f4fb1316bca92 100644 --- a/src/timezone/tznames/meson.build +++ b/src/timezone/tznames/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group tznames = files( 'Africa.txt', diff --git a/src/tools/PerfectHash.pm b/src/tools/PerfectHash.pm index e54905a3ef858..448c5ed3ac833 100644 --- a/src/tools/PerfectHash.pm +++ b/src/tools/PerfectHash.pm @@ -20,7 +20,7 @@ # not in the set. # # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/tools/PerfectHash.pm @@ -30,7 +30,7 @@ package PerfectHash; use strict; -use warnings; +use warnings FATAL => 'all'; # At runtime, we'll compute two simple hash functions of the input key, diff --git a/src/tools/RELEASE_CHANGES b/src/tools/RELEASE_CHANGES index 73b02fa2a4007..94c5a0f3bfbb3 100644 --- a/src/tools/RELEASE_CHANGES +++ b/src/tools/RELEASE_CHANGES @@ -10,6 +10,7 @@ For All Releases (major, minor, beta, RC) o update doc/src/sgml/release-NN.sgml in relevant branches o run spellchecker on result o add SGML markup + o run src/tools/add_commit_links.pl * Update timezone data to match latest IANA timezone database and new Windows releases, if any (see src/timezone/README) @@ -107,6 +108,9 @@ Starting a New Development Cycle placeholder), "git rm" the previous one, and update release.sgml and filelist.sgml to match. +* In the newly-made branch, replace "devel" with the branch's major version + number in the URLs appearing in the top-level README and Makefile files. + * In the newly-made branch, change src/backend/nodes/gen_node_support.pl to enforce ABI stability of the NodeTag list (see "ARM ABI STABILITY CHECK HERE" therein). diff --git a/src/tools/add_commit_links.pl b/src/tools/add_commit_links.pl new file mode 100755 index 0000000000000..64a5783297220 --- /dev/null +++ b/src/tools/add_commit_links.pl @@ -0,0 +1,133 @@ +#! /usr/bin/perl + +################################################################# +# add_commit_links.pl -- add commit links to the release notes +# +# Copyright (c) 2024, PostgreSQL Global Development Group +# +# src/tools/add_commit_links.pl +################################################################# + +# +# This script adds commit links to the release notes. +# +# Usage: cd to top of source tree and issue +# src/tools/add_commit_links.pl release_notes_file +# +# The script can add links for release note items that lack them, and update +# those that have them. The script is sensitive to the release note file being +# in a specific format: +# +# * File name contains the major version number preceded by a dash +# and followed by a period +# * Commit text is generated by src/tools/git_changelog +# * SGML comments around commit text start in the first column +# * The commit item title ends with an attribution that ends with +# a closing parentheses +# * previously added URL link text is unmodified +# * a "" follows the commit item title +# +# The major version number is used to select the commit hash for minor +# releases. An error will be generated if valid commits are found but +# no proper location for the commit links is found. + +use strict; +use warnings FATAL => 'all'; + +sub process_file +{ + my $file = shift; + + my $in_comment = 0; + my $prev_line_ended_with_paren = 0; + my $prev_leading_space = ''; + my $lineno = 0; + + my @hashes = (); + + my $tmpfile = $file . '.tmp'; + + # Get major version number from the file name. + $file =~ m/-(\d+)\./; + my $major_version = $1; + + open(my $fh, '<', $file) || die "could not open file $file: $!\n"; + open(my $tfh, '>', $tmpfile) || die "could not open file $tmpfile: $!\n"; + + while (<$fh>) + { + $lineno++; + + $in_comment = 1 if (m/^/); + } + + close($fh); + close($tfh); + + rename($tmpfile, $file) || die "could not rename %s to %s: $!\n", + $tmpfile, + $file; + + return; +} + +if (@ARGV == 0) +{ + printf(STDERR "Usage: %s release_notes_file [...]\n", $0); + exit(1); +} + +for my $file (@ARGV) +{ + process_file($file); +} diff --git a/src/tools/check_bison_recursion.pl b/src/tools/check_bison_recursion.pl index 18f14ad127291..f217f931d0b2d 100755 --- a/src/tools/check_bison_recursion.pl +++ b/src/tools/check_bison_recursion.pl @@ -16,13 +16,13 @@ # To use: run bison with the -v switch, then feed the produced y.output # file to this script. # -# Copyright (c) 2011-2023, PostgreSQL Global Development Group +# Copyright (c) 2011-2024, PostgreSQL Global Development Group # # src/tools/check_bison_recursion.pl ################################################################# use strict; -use warnings; +use warnings FATAL => 'all'; my $debug = 0; diff --git a/src/tools/ci/README b/src/tools/ci/README index 80d01939e847f..30ddd200c9669 100644 --- a/src/tools/ci/README +++ b/src/tools/ci/README @@ -65,3 +65,20 @@ messages. Currently the following controls are available: Only runs CI on operating systems specified. This can be useful when addressing portability issues affecting only a subset of platforms. + + +Using custom compute resources for CI +===================================== + +When running a lot of tests in a repository, cirrus-ci's free credits do not +suffice. In those cases a repository can be configured to use other +infrastructure for running tests. To do so, the REPO_CI_CONFIG_GIT_URL +variable can be configured for the repository in the cirrus-ci web interface, +at https://cirrus-ci.com/github/. The file referenced +(see https://cirrus-ci.org/guide/programming-tasks/#fs) by the variable can +overwrite the default execution method for different operating systems, +defined in .cirrus.yml, by redefining the relevant yaml anchors. + +Custom compute resources can be provided using +- https://cirrus-ci.org/guide/supported-computing-services/ +- https://cirrus-ci.org/guide/persistent-workers/ diff --git a/src/tools/ci/ci_macports_packages.sh b/src/tools/ci/ci_macports_packages.sh new file mode 100755 index 0000000000000..63e97b37c7863 --- /dev/null +++ b/src/tools/ci/ci_macports_packages.sh @@ -0,0 +1,113 @@ +#!/bin/sh + +# Installs the passed in packages via macports. To make it fast enough +# for CI, cache the installation as a .dmg file. To avoid +# unnecessarily updating the cache, the cached image is only modified +# when packages are installed or removed. Any package this script is +# not instructed to install, will be removed again. +# +# This currently expects to be run in a macos cirrus-ci environment. + +set -e +# set -x + +packages="$@" + +macos_major_version="` sw_vers -productVersion | sed 's/\..*//' `" +echo "macOS major version: $macos_major_version" + +# Scan the available MacPorts releases to find one that matches the running +# macOS release. +macports_release_list_url="https://api.github.com/repos/macports/macports-base/releases" +macports_version_pattern="2\.10\.1" +macports_url="$( curl -s $macports_release_list_url | grep "\"https://github.com/macports/macports-base/releases/download/v$macports_version_pattern/MacPorts-$macports_version_pattern-$macos_major_version-[A-Za-z]*\.pkg\"" | sed 's/.*: "//;s/".*//' | head -1 )" +echo "MacPorts package URL: $macports_url" + +cache_dmg="macports.hfs.dmg" + +if [ "$CIRRUS_CI" != "true" ]; then + echo "expect to be called within cirrus-ci" 1>2 + exit 1 +fi + +sudo mkdir -p /opt/local +mkdir -p ${MACPORTS_CACHE}/ + +# If we are starting from clean cache, perform a fresh macports +# install. Otherwise decompress the .dmg we created previously. +# +# After this we have a working macports installation, with an unknown set of +# packages installed. +new_install=0 +update_cached_image=0 +if [ -e ${MACPORTS_CACHE}/${cache_dmg}.zstd ]; then + time zstd -T0 -d ${MACPORTS_CACHE}/${cache_dmg}.zstd -o ${cache_dmg} + time sudo hdiutil attach -kernel ${cache_dmg} -owners on -shadow ${cache_dmg}.shadow -mountpoint /opt/local +else + new_install=1 + curl -fsSL -o macports.pkg "$macports_url" + time sudo installer -pkg macports.pkg -target / + # this is a throwaway environment, and it'd be a few lines to gin + # up a correct user / group when using the cache. + echo macportsuser root | sudo tee -a /opt/local/etc/macports/macports.conf +fi +export PATH=/opt/local/sbin/:/opt/local/bin/:$PATH + +# mark all installed packages unrequested, that allows us to detect +# packages that aren't needed anymore +if [ -n "$(port -q installed installed)" ] ; then + sudo port unsetrequested installed +fi + +# If setting all the required packages as requested fails, we need +# to install at least one of them. Need to do so one-by-one as +# port setrequested only reports failures for the first package. +echo "checking if all required packages are installed" +for package in $packages ; do + if ! sudo port setrequested $package > /dev/null 2>&1 ; then + update_cached_image=1 + fi +done +echo "done" +if [ "$update_cached_image" -eq 1 ]; then + echo not all required packages installed, doing so now + # to keep the image small, we deleted the ports tree from the image... + sudo port selfupdate + # XXX likely we'll need some other way to force an upgrade at some + # point... + sudo port upgrade outdated + sudo port install -N $packages + sudo port setrequested $packages +fi + +# check if any ports should be uninstalled +if [ -n "$(port -q installed rleaves)" ] ; then + echo superfluous packages installed + update_cached_image=1 + sudo port uninstall --follow-dependencies rleaves + + # remove prior cache contents, don't want to increase size + rm -f ${MACPORTS_CACHE}/* +fi + +# Shrink installation if we created / modified it +if [ "$new_install" -eq 1 -o "$update_cached_image" -eq 1 ]; then + sudo /opt/local/bin/port clean --all installed + sudo rm -rf /opt/local/var/macports/{software,sources}/* +fi + +# If we're starting from a clean cache, start a new image. If we have +# an image, but the contents changed, update the image in the cache +# location. +if [ "$new_install" -eq 1 ]; then + # use a generous size, so additional software can be installed later + time sudo hdiutil create -fs HFS+ -format UDRO -size 10g -layout NONE -srcfolder /opt/local/ ${cache_dmg} + time zstd -T -10 -z ${cache_dmg} -o ${MACPORTS_CACHE}/${cache_dmg}.zstd +elif [ "$update_cached_image" -eq 1 ]; then + sudo hdiutil detach /opt/local/ + time hdiutil convert -format UDRO ${cache_dmg} -shadow ${cache_dmg}.shadow -o updated.hfs.dmg + rm ${cache_dmg}.shadow + mv updated.hfs.dmg ${cache_dmg} + time zstd --force -T -10 -z ${cache_dmg} -o ${MACPORTS_CACHE}/${cache_dmg}.zstd + time sudo hdiutil attach -kernel ${cache_dmg} -owners on -shadow ${cache_dmg}.shadow -mountpoint /opt/local +fi diff --git a/src/tools/ci/gcp_freebsd_repartition.sh b/src/tools/ci/gcp_freebsd_repartition.sh index 2d5e1738998e7..3adb8fb88eccf 100755 --- a/src/tools/ci/gcp_freebsd_repartition.sh +++ b/src/tools/ci/gcp_freebsd_repartition.sh @@ -3,26 +3,24 @@ set -e set -x -# The default filesystem on freebsd gcp images is very slow to run tests on, -# due to its 32KB block size -# -# XXX: It'd probably better to fix this in the image, using something like -# https://people.freebsd.org/~lidl/blog/re-root.html - # fix backup partition table after resize gpart recover da0 gpart show da0 -# kill swap, so we can delete a partition -swapoff -a || true -# (apparently we can only have 4!?) + +# delete and re-add swap partition with expanded size +swapoff -a gpart delete -i 3 da0 -gpart add -t freebsd-ufs -l data8k -a 4096 da0 +gpart add -t freebsd-swap -l swapfs -a 4096 da0 gpart show da0 -newfs -U -b 8192 /dev/da0p3 +swapon -a + +# create a file system on a memory disk backed by swap, to minimize I/O +mdconfig -a -t swap -s20g -u md1 +newfs -b 8192 -U /dev/md1 -# Migrate working directory +# migrate working directory du -hs $CIRRUS_WORKING_DIR mv $CIRRUS_WORKING_DIR $CIRRUS_WORKING_DIR.orig mkdir $CIRRUS_WORKING_DIR -mount -o noatime /dev/da0p3 $CIRRUS_WORKING_DIR -cp -r $CIRRUS_WORKING_DIR.orig/* $CIRRUS_WORKING_DIR/ +mount -o noatime /dev/md1 $CIRRUS_WORKING_DIR +cp -a $CIRRUS_WORKING_DIR.orig/ $CIRRUS_WORKING_DIR/ diff --git a/src/tools/ci/windows_build_config.pl b/src/tools/ci/windows_build_config.pl deleted file mode 100644 index b0d4360c7483a..0000000000000 --- a/src/tools/ci/windows_build_config.pl +++ /dev/null @@ -1,13 +0,0 @@ -use strict; -use warnings; - -our $config; - -$config->{"tap_tests"} = 1; -$config->{"asserts"} = 1; - -$config->{"openssl"} = "c:/openssl/1.1/"; -$config->{"perl"} = "c:/strawberry/$ENV{DEFAULT_PERL_VERSION}/perl/"; -$config->{"python"} = "c:/python/"; - -1; diff --git a/src/tools/copyright.pl b/src/tools/copyright.pl index 30c38c757b239..804537f26a4ea 100755 --- a/src/tools/copyright.pl +++ b/src/tools/copyright.pl @@ -2,7 +2,7 @@ ################################################################# # copyright.pl -- update copyright notices throughout the source tree, idempotently. # -# Copyright (c) 2011-2023, PostgreSQL Global Development Group +# Copyright (c) 2011-2024, PostgreSQL Global Development Group # # src/tools/copyright.pl # @@ -10,7 +10,7 @@ ################################################################# use strict; -use warnings; +use warnings FATAL => 'all'; use File::Find; use File::Basename; diff --git a/src/tools/fix-old-flex-code.pl b/src/tools/fix-old-flex-code.pl index d88e68b8b6ebb..a37a1f3d52256 100644 --- a/src/tools/fix-old-flex-code.pl +++ b/src/tools/fix-old-flex-code.pl @@ -8,7 +8,7 @@ # let's suppress it by inserting a dummy reference to the variable. # (That's exactly what 2.5.36 and later do ...) # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/tools/fix-old-flex-code.pl @@ -16,7 +16,7 @@ #---------------------------------------------------------------------- use strict; -use warnings; +use warnings FATAL => 'all'; # Get command line argument. usage() if $#ARGV != 0; diff --git a/src/tools/gen_export.pl b/src/tools/gen_export.pl index ed60abe956283..d9fdaaaf6d0f5 100644 --- a/src/tools/gen_export.pl +++ b/src/tools/gen_export.pl @@ -1,5 +1,8 @@ + +# Copyright (c) 2024, PostgreSQL Global Development Group + use strict; -use warnings; +use warnings FATAL => 'all'; use Getopt::Long; my $format; @@ -13,12 +16,11 @@ 'input:s' => \$input, 'output:s' => \$output) or die "wrong arguments"; -if (not( $format eq 'aix' - or $format eq 'darwin' +if (not( $format eq 'darwin' or $format eq 'gnu' or $format eq 'win')) { - die "$0: $format is not yet handled (only aix, darwin, gnu, win are)\n"; + die "$0: $format is not yet handled (only darwin, gnu, win are)\n"; } open(my $input_handle, '<', $input) @@ -53,11 +55,7 @@ } elsif (/^(\S+)\s+(\S+)/) { - if ($format eq 'aix') - { - print $output_handle "$1\n"; - } - elsif ($format eq 'darwin') + if ($format eq 'darwin') { print $output_handle "_$1\n"; } diff --git a/src/tools/gen_keywordlist.pl b/src/tools/gen_keywordlist.pl index 97a9ff1b30124..1b3bc2e9b47e9 100644 --- a/src/tools/gen_keywordlist.pl +++ b/src/tools/gen_keywordlist.pl @@ -21,7 +21,7 @@ # Note that case folding works correctly only for all-ASCII keywords! # # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/tools/gen_keywordlist.pl @@ -29,7 +29,7 @@ #---------------------------------------------------------------------- use strict; -use warnings; +use warnings FATAL => 'all'; use Getopt::Long; use FindBin; @@ -71,7 +71,7 @@ * %s.h * List of keywords represented as a ScanKeywordList. * - * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group + * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * * NOTES diff --git a/src/tools/git_changelog b/src/tools/git_changelog index 14b94720282e7..c9469b8bad1d7 100755 --- a/src/tools/git_changelog +++ b/src/tools/git_changelog @@ -1,6 +1,6 @@ #!/usr/bin/perl -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # # src/tools/git_changelog @@ -50,7 +50,7 @@ use strict; -use warnings; +use warnings FATAL => 'all'; require Time::Local; require Getopt::Long; require IPC::Open2; @@ -59,7 +59,7 @@ require IPC::Open2; # (We could get this from "git branches", but not worth the trouble.) # NB: master must be first! my @BRANCHES = qw(master - REL_15_STABLE REL_14_STABLE REL_13_STABLE + REL_16_STABLE REL_15_STABLE REL_14_STABLE REL_13_STABLE REL_12_STABLE REL_11_STABLE REL_10_STABLE REL9_6_STABLE REL9_5_STABLE REL9_4_STABLE REL9_3_STABLE REL9_2_STABLE REL9_1_STABLE REL9_0_STABLE REL8_4_STABLE REL8_3_STABLE REL8_2_STABLE REL8_1_STABLE REL8_0_STABLE diff --git a/src/tools/ifaddrs/Makefile b/src/tools/ifaddrs/Makefile index e74d7547698a1..e49547bb6ac72 100644 --- a/src/tools/ifaddrs/Makefile +++ b/src/tools/ifaddrs/Makefile @@ -2,7 +2,7 @@ # # Makefile for src/tools/ifaddrs # -# Copyright (c) 2003-2023, PostgreSQL Global Development Group +# Copyright (c) 2003-2024, PostgreSQL Global Development Group # # src/tools/ifaddrs/Makefile # @@ -24,5 +24,5 @@ all: test_ifaddrs test_ifaddrs: test_ifaddrs.o $(libpq_backend_dir)/ifaddr.o $(CC) $(CFLAGS) test_ifaddrs.o $(libpq_backend_dir)/ifaddr.o $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) -clean distclean maintainer-clean: +clean distclean: rm -f test_ifaddrs$(X) $(OBJS) diff --git a/src/tools/ifaddrs/test_ifaddrs.c b/src/tools/ifaddrs/test_ifaddrs.c index b9a1b7b5e84ec..a1037e1b571a9 100644 --- a/src/tools/ifaddrs/test_ifaddrs.c +++ b/src/tools/ifaddrs/test_ifaddrs.c @@ -66,6 +66,6 @@ main(int argc, char *argv[]) #endif if (pg_foreach_ifaddr(callback, NULL) < 0) - fprintf(stderr, "pg_foreach_ifaddr failed: %s\n", strerror(errno)); + fprintf(stderr, "pg_foreach_ifaddr failed: %m\n"); return 0; } diff --git a/src/tools/mark_pgdllimport.pl b/src/tools/mark_pgdllimport.pl index 45b4e73bff1ac..b838aeeb43192 100755 --- a/src/tools/mark_pgdllimport.pl +++ b/src/tools/mark_pgdllimport.pl @@ -15,7 +15,7 @@ # script modifies before committing. This script uses as arguments # a list of the header files to scan for the markings. # -# Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +# Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group # Portions Copyright (c) 1994, Regents of the University of California # # src/tools/mark_pgdllimport.pl @@ -23,7 +23,7 @@ #---------------------------------------------------------------------- use strict; -use warnings; +use warnings FATAL => 'all'; for my $include_file (@ARGV) { diff --git a/src/tools/msvc/.gitignore b/src/tools/msvc/.gitignore deleted file mode 100644 index 2470e7850d765..0000000000000 --- a/src/tools/msvc/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Custom configuration files for MSVC build -/config.pl -/buildenv.pl diff --git a/src/tools/msvc/Install.pm b/src/tools/msvc/Install.pm deleted file mode 100644 index 05548d7c0aab8..0000000000000 --- a/src/tools/msvc/Install.pm +++ /dev/null @@ -1,746 +0,0 @@ - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -package Install; - -# -# Package that provides 'make install' functionality for msvc builds -# -# src/tools/msvc/Install.pm -# -use strict; -use warnings; -use Carp; -use File::Basename; -use File::Copy; -use File::Find (); - -use Exporter; -our (@ISA, @EXPORT_OK); -@ISA = qw(Exporter); -@EXPORT_OK = qw(Install); - -my $insttype; -my @client_contribs = ('oid2name', 'pgbench', 'vacuumlo'); -my @client_program_files = ( - 'clusterdb', 'createdb', 'createuser', 'dropdb', - 'dropuser', 'ecpg', 'libecpg', 'libecpg_compat', - 'libpgtypes', 'libpq', 'pg_amcheck', 'pg_basebackup', - 'pg_config', 'pg_dump', 'pg_dumpall', 'pg_isready', - 'pg_receivewal', 'pg_recvlogical', 'pg_restore', 'psql', - 'reindexdb', 'vacuumdb', @client_contribs); - -sub lcopy -{ - my $src = shift; - my $target = shift; - - if (-f $target) - { - unlink $target || confess "Could not delete $target\n"; - } - - (my $retval = copy($src, $target)) - || confess "Could not copy $src to $target\n"; - - return $retval; -} - -sub Install -{ - $| = 1; - - my $target = shift; - $insttype = shift; - $insttype = "all" unless ($insttype); - - # if called from vcregress, the config will be passed to us - # so no need to re-include these - our $config = shift; - unless ($config) - { - - # suppress warning about harmless redeclaration of $config - no warnings 'misc'; - do "./config_default.pl"; - do "./config.pl" if (-f "config.pl"); - } - - # Move to the root path depending on the current location. - if (-f "../../../configure") - { - chdir("../../.."); - } - elsif (-f "../../../../configure") - { - chdir("../../../.."); - } - - my $conf = ""; - if (-d "debug") - { - $conf = "debug"; - } - if (-d "release") - { - $conf = "release"; - } - die "Could not find debug or release binaries" if ($conf eq ""); - my $majorver = DetermineMajorVersion(); - print "Installing version $majorver for $conf in $target\n"; - - my @client_dirs = ('bin', 'lib', 'share', 'symbols'); - my @all_dirs = ( - @client_dirs, 'doc', 'doc/contrib', 'doc/extension', 'share/contrib', - 'share/extension', 'share/timezonesets', 'share/tsearch_data'); - if ($insttype eq "client") - { - EnsureDirectories($target, @client_dirs); - } - else - { - EnsureDirectories($target, @all_dirs); - } - - CopySolutionOutput($conf, $target); - my $sample_files = []; - my @top_dir = ("src"); - @top_dir = ("src\\bin", "src\\interfaces") if ($insttype eq "client"); - File::Find::find( - { - wanted => sub { - /^.*\.sample\z/s - && push(@$sample_files, $File::Find::name); - - # Don't find files of in-tree temporary installations. - $_ eq 'share' and $File::Find::prune = 1; - } - }, - @top_dir); - CopySetOfFiles('config files', $sample_files, $target . '/share/'); - CopyFiles( - 'Import libraries', - $target . '/lib/', - "$conf\\", "postgres\\postgres.lib", "libpgcommon\\libpgcommon.lib", - "libpgport\\libpgport.lib"); - CopyContribFiles($config, $target); - CopyIncludeFiles($target); - - if ($insttype ne "client") - { - CopySetOfFiles( - 'timezone names', - [ glob('src\timezone\tznames\*.txt') ], - $target . '/share/timezonesets/'); - CopyFiles( - 'timezone sets', - $target . '/share/timezonesets/', - 'src/timezone/tznames/', 'Default', 'Australia', 'India'); - CopySetOfFiles( - 'BKI files', - [ glob("src\\backend\\catalog\\postgres.*") ], - $target . '/share/'); - CopySetOfFiles( - 'SQL files', - [ glob("src\\backend\\catalog\\*.sql") ], - $target . '/share/'); - CopyFiles( - 'Information schema data', $target . '/share/', - 'src/backend/catalog/', 'sql_features.txt'); - CopyFiles( - 'Error code data', $target . '/share/', - 'src/backend/utils/', 'errcodes.txt'); - GenerateTimezoneFiles($target, $conf); - GenerateTsearchFiles($target); - CopySetOfFiles( - 'Stopword files', - [ glob("src\\backend\\snowball\\stopwords\\*.stop") ], - $target . '/share/tsearch_data/'); - CopySetOfFiles( - 'Dictionaries sample files', - [ glob("src\\backend\\tsearch\\dicts\\*_sample*") ], - $target . '/share/tsearch_data/'); - - my $pl_extension_files = []; - my @pldirs = ('src/pl/plpgsql/src'); - push @pldirs, "src/pl/plperl" if $config->{perl}; - push @pldirs, "src/pl/plpython" if $config->{python}; - push @pldirs, "src/pl/tcl" if $config->{tcl}; - File::Find::find( - { - wanted => sub { - /^(.*--.*\.sql|.*\.control)\z/s - && push(@$pl_extension_files, $File::Find::name); - - # Don't find files of in-tree temporary installations. - $_ eq 'share' and $File::Find::prune = 1; - } - }, - @pldirs); - CopySetOfFiles('PL Extension files', - $pl_extension_files, $target . '/share/extension/'); - } - - GenerateNLSFiles($target, $config->{nls}, $majorver) if ($config->{nls}); - - print "Installation complete.\n"; - return; -} - -sub EnsureDirectories -{ - my $target = shift; - mkdir $target unless -d ($target); - while (my $d = shift) - { - mkdir $target . '/' . $d unless -d ($target . '/' . $d); - } - return; -} - -sub CopyFiles -{ - my $what = shift; - my $target = shift; - my $basedir = shift; - - print "Copying $what"; - while (my $f = shift) - { - print "."; - $f = $basedir . $f; - die "No file $f\n" if (!-f $f); - lcopy($f, $target . basename($f)) || croak "Could not copy $f: $!\n"; - } - print "\n"; - return; -} - -sub CopySetOfFiles -{ - my $what = shift; - my $flist = shift; - my $target = shift; - print "Copying $what" if $what; - foreach (@$flist) - { - my $tgt = $target . basename($_); - print "."; - lcopy($_, $tgt) || croak "Could not copy $_: $!\n"; - } - print "\n"; - return; -} - -sub CopySolutionOutput -{ - my $conf = shift; - my $target = shift; - my $rem = - qr{Project\("\{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942\}"\) = "([^"]+)"}; - - my $sln = read_file("pgsql.sln") || croak "Could not open pgsql.sln\n"; - - my $vcproj = 'vcproj'; - if ($sln =~ - /Microsoft Visual Studio Solution File, Format Version (\d+)\.\d+/ - && $1 >= 11) - { - $vcproj = 'vcxproj'; - } - - print "Copying build output files..."; - while ($sln =~ $rem) - { - my $pf = $1; - - # Hash-of-arrays listing where to install things. For each - # subdirectory there's a hash key, and the value is an array - # of file extensions to install in that subdirectory. Example: - # { 'bin' => [ 'dll', 'lib' ], - # 'lib' => [ 'lib' ] } - my %install_list; - my $is_sharedlib = 0; - - $sln =~ s/$rem//; - - next - if ($insttype eq "client" && !grep { $_ eq $pf } - @client_program_files); - - my $proj = read_file("$pf.$vcproj") - || croak "Could not open $pf.$vcproj\n"; - - # Check if this project uses a shared library by looking if - # SO_MAJOR_VERSION is defined in its Makefile, whose path - # can be found using the resource file of this project. - if (( $vcproj eq 'vcxproj' - && $proj =~ qr{ResourceCompile\s*Include="([^"]+)"}) - || ( $vcproj eq 'vcproj' - && $proj =~ qr{File\s*RelativePath="([^\"]+)\.rc"})) - { - my $projpath = dirname($1); - my $mfname = - -e "$projpath/GNUmakefile" - ? "$projpath/GNUmakefile" - : "$projpath/Makefile"; - my $mf = read_file($mfname) || croak "Could not open $mfname\n"; - - $is_sharedlib = 1 if ($mf =~ /^SO_MAJOR_VERSION\s*=\s*(.*)$/mg); - } - - if ($vcproj eq 'vcproj' && $proj =~ qr{ConfigurationType="([^"]+)"}) - { - if ($1 == 1) - { - push(@{ $install_list{'bin'} }, "exe"); - } - elsif ($1 == 2) - { - push(@{ $install_list{'lib'} }, "dll"); - if ($is_sharedlib) - { - push(@{ $install_list{'bin'} }, "dll"); - push(@{ $install_list{'lib'} }, "lib"); - } - } - else - { - - # Static libraries, such as libpgport, only used internally - # during build, don't install. - next; - } - } - elsif ($vcproj eq 'vcxproj' - && $proj =~ qr{(\w+)}) - { - if ($1 eq 'Application') - { - push(@{ $install_list{'bin'} }, "exe"); - } - elsif ($1 eq 'DynamicLibrary') - { - push(@{ $install_list{'lib'} }, "dll"); - if ($is_sharedlib) - { - push(@{ $install_list{'bin'} }, "dll"); - push(@{ $install_list{'lib'} }, "lib"); - } - } - else # 'StaticLibrary' - { - - # Static lib, such as libpgport, only used internally - # during build, don't install. - next; - } - } - else - { - croak "Could not parse $pf.$vcproj\n"; - } - - # Install each element - foreach my $dir (keys %install_list) - { - foreach my $ext (@{ $install_list{$dir} }) - { - lcopy("$conf\\$pf\\$pf.$ext", "$target\\$dir\\$pf.$ext") - || croak "Could not copy $pf.$ext\n"; - } - } - lcopy("$conf\\$pf\\$pf.pdb", "$target\\symbols\\$pf.pdb") - || croak "Could not copy $pf.pdb\n"; - print "."; - } - print "\n"; - return; -} - -sub GenerateTimezoneFiles -{ - my $target = shift; - my $conf = shift; - my $mf = read_file("src/timezone/Makefile"); - $mf =~ s{\\\r?\n}{}g; - - $mf =~ /^TZDATAFILES\s*:?=\s*(.*)$/m - || die "Could not find TZDATAFILES line in timezone makefile\n"; - my @tzfiles = split /\s+/, $1; - - print "Generating timezone files..."; - - my @args = ("$conf/zic/zic", '-d', "$target/share/timezone"); - foreach (@tzfiles) - { - my $tzfile = $_; - $tzfile =~ s|\$\(srcdir\)|src/timezone|; - push(@args, $tzfile); - } - - system(@args); - print "\n"; - return; -} - -sub GenerateTsearchFiles -{ - my $target = shift; - - print "Generating tsearch script..."; - system( - 'perl', 'src/backend/snowball/snowball_create.pl', - '--input', 'src/backend/snowball/', - '--outdir', "$target/share/"); - print "\n"; - return; -} - -sub CopyContribFiles -{ - my $config = shift; - my $target = shift; - - print "Copying contrib data files..."; - foreach my $subdir ('contrib', 'src/test/modules') - { - my $D; - opendir($D, $subdir) || croak "Could not opendir on $subdir!\n"; - while (my $d = readdir($D)) - { - # These configuration-based exclusions must match vcregress.pl - next if ($d eq "uuid-ossp" && !defined($config->{uuid})); - next if ($d eq "sslinfo" && !defined($config->{openssl})); - next if ($d eq "pgcrypto" && !defined($config->{openssl})); - next if ($d eq "xml2" && !defined($config->{xml})); - next if ($d =~ /_plperl$/ && !defined($config->{perl})); - next if ($d =~ /_plpython$/ && !defined($config->{python})); - next if ($d eq "sepgsql"); - - CopySubdirFiles($subdir, $d, $config, $target); - } - } - print "\n"; - return; -} - -sub CopySubdirFiles -{ - my $subdir = shift; - my $module = shift; - my $config = shift; - my $target = shift; - - return if ($module =~ /^\./); - return unless (-f "$subdir/$module/Makefile"); - return - if ($insttype eq "client" && !grep { $_ eq $module } @client_contribs); - - my $mf = read_file("$subdir/$module/Makefile"); - $mf =~ s{\\\r?\n}{}g; - - # Note: we currently don't support setting MODULEDIR in the makefile - my $moduledir = 'contrib'; - - my $flist = ''; - if ($mf =~ /^EXTENSION\s*=\s*(.*)$/m) { $flist .= $1 } - if ($flist ne '') - { - $moduledir = 'extension'; - $flist = ParseAndCleanRule($flist, $mf); - - foreach my $f (split /\s+/, $flist) - { - lcopy("$subdir/$module/$f.control", - "$target/share/extension/$f.control") - || croak("Could not copy file $f.control in contrib $module"); - print '.'; - } - } - - $flist = ''; - if ($mf =~ /^DATA_built\s*=\s*(.*)$/m) { $flist .= $1 } - if ($mf =~ /^DATA\s*=\s*(.*)$/m) { $flist .= " $1" } - $flist =~ s/^\s*//; # Remove leading spaces if we had only DATA_built - - if ($flist ne '') - { - $flist = ParseAndCleanRule($flist, $mf); - - foreach my $f (split /\s+/, $flist) - { - lcopy("$subdir/$module/$f", - "$target/share/$moduledir/" . basename($f)) - || croak("Could not copy file $f in contrib $module"); - print '.'; - } - } - - $flist = ''; - if ($mf =~ /^DATA_TSEARCH\s*=\s*(.*)$/m) { $flist .= $1 } - if ($flist ne '') - { - $flist = ParseAndCleanRule($flist, $mf); - - foreach my $f (split /\s+/, $flist) - { - lcopy("$subdir/$module/$f", - "$target/share/tsearch_data/" . basename($f)) - || croak("Could not copy file $f in $subdir $module"); - print '.'; - } - } - - { - $flist = ''; - if ($mf =~ /^HEADERS\s*=\s*(.*)$/m) { $flist .= $1 } - my @modlist = (); - my %fmodlist = (); - while ($mf =~ /^HEADERS_([^\s=]+)\s*=\s*(.*)$/mg) - { - $fmodlist{$1} .= $2; - } - - if ($mf =~ /^MODULE_big\s*=\s*(.*)$/m) - { - push @modlist, $1; - if ($flist ne '') - { - $fmodlist{$1} = $flist; - $flist = ''; - } - } - elsif ($mf =~ /^MODULES\s*=\s*(.*)$/m) - { - push @modlist, split /\s+/, $1; - } - - croak "HEADERS requires MODULE_big in $subdir $module" - if $flist ne ''; - - foreach my $mod (keys %fmodlist) - { - croak "HEADERS_$mod for unknown module in $subdir $module" - unless grep { $_ eq $mod } @modlist; - $flist = ParseAndCleanRule($fmodlist{$mod}, $mf); - EnsureDirectories($target, "include", "include/server", - "include/server/$moduledir", - "include/server/$moduledir/$mod"); - foreach my $f (split /\s+/, $flist) - { - lcopy("$subdir/$module/$f", - "$target/include/server/$moduledir/$mod/" . basename($f)) - || croak("Could not copy file $f in $subdir $module"); - print '.'; - } - } - } - - $flist = ''; - if ($mf =~ /^DOCS\s*=\s*(.*)$/mg) { $flist .= $1 } - if ($flist ne '') - { - $flist = ParseAndCleanRule($flist, $mf); - - # Special case for contrib/spi - $flist = - "autoinc.example insert_username.example moddatetime.example refint.example" - if ($module eq 'spi'); - foreach my $f (split /\s+/, $flist) - { - lcopy("$subdir/$module/$f", "$target/doc/$moduledir/$f") - || croak("Could not copy file $f in contrib $module"); - print '.'; - } - } - return; -} - -sub ParseAndCleanRule -{ - my $flist = shift; - my $mf = shift; - - # Strip out $(addsuffix) rules - if (index($flist, '$(addsuffix ') >= 0) - { - my $pcount = 0; - my $i; - for ( - $i = index($flist, '$(addsuffix ') + 12; - $i < length($flist); - $i++) - { - $pcount++ if (substr($flist, $i, 1) eq '('); - $pcount-- if (substr($flist, $i, 1) eq ')'); - last if ($pcount < 0); - } - $flist = - substr($flist, 0, index($flist, '$(addsuffix ')) - . substr($flist, $i + 1); - } - return $flist; -} - -sub CopyIncludeFiles -{ - my $target = shift; - - EnsureDirectories($target, 'include', 'include/libpq', 'include/internal', - 'include/internal/libpq', 'include/server', 'include/server/parser'); - - CopyFiles( - 'Public headers', $target . '/include/', - 'src/include/', 'postgres_ext.h', - 'pg_config.h', 'pg_config_ext.h', - 'pg_config_os.h', 'pg_config_manual.h'); - lcopy('src/include/libpq/libpq-fs.h', $target . '/include/libpq/') - || croak 'Could not copy libpq-fs.h'; - - CopyFiles( - 'Libpq headers', - $target . '/include/', - 'src/interfaces/libpq/', 'libpq-fe.h', 'libpq-events.h'); - CopyFiles( - 'Libpq internal headers', - $target . '/include/internal/', - 'src/interfaces/libpq/', 'libpq-int.h', 'fe-auth-sasl.h', - 'pqexpbuffer.h'); - - CopyFiles( - 'Internal headers', - $target . '/include/internal/', - 'src/include/', 'c.h', 'port.h', 'postgres_fe.h'); - lcopy('src/include/libpq/pqcomm.h', $target . '/include/internal/libpq/') - || croak 'Could not copy pqcomm.h'; - - CopyFiles( - 'Server headers', - $target . '/include/server/', - 'src/include/', 'pg_config.h', 'pg_config_ext.h', 'pg_config_os.h'); - CopySetOfFiles( - '', - [ glob("src\\include\\*.h") ], - $target . '/include/server/'); - my $D; - opendir($D, 'src/include') || croak "Could not opendir on src/include!\n"; - - CopyFiles( - 'PL/pgSQL header', - $target . '/include/server/', - 'src/pl/plpgsql/src/', 'plpgsql.h'); - - # some xcopy progs don't like mixed slash style paths - (my $ctarget = $target) =~ s!/!\\!g; - while (my $d = readdir($D)) - { - next if ($d =~ /^\./); - next if ($d eq '.git'); - next if ($d eq 'CVS'); - next unless (-d "src/include/$d"); - - EnsureDirectories("$target/include/server/$d"); - my @args = ( - 'xcopy', '/s', '/i', '/q', '/r', '/y', "src\\include\\$d\\*.h", - "$ctarget\\include\\server\\$d\\"); - system(@args) && croak("Failed to copy include directory $d\n"); - } - closedir($D); - - my $mf = read_file('src/interfaces/ecpg/include/Makefile'); - $mf =~ s{\\\r?\n}{}g; - $mf =~ /^ecpg_headers\s*=\s*(.*)$/m - || croak "Could not find ecpg_headers line\n"; - CopyFiles( - 'ECPG headers', - $target . '/include/', - 'src/interfaces/ecpg/include/', - 'ecpg_config.h', split /\s+/, $1); - $mf =~ /^informix_headers\s*=\s*(.*)$/m - || croak "Could not find informix_headers line\n"; - EnsureDirectories($target . '/include', 'informix', 'informix/esql'); - CopyFiles( - 'ECPG informix headers', - $target . '/include/informix/esql/', - 'src/interfaces/ecpg/include/', - split /\s+/, $1); - return; -} - -sub GenerateNLSFiles -{ - my $target = shift; - my $nlspath = shift; - my $majorver = shift; - - print "Installing NLS files..."; - EnsureDirectories($target, "share/locale"); - my @flist; - File::Find::find( - { - wanted => sub { - /^nls\.mk\z/s - && !push(@flist, $File::Find::name); - } - }, - "src"); - foreach (@flist) - { - my $prgm = DetermineCatalogName($_); - s/nls.mk/po/; - my $dir = $_; - next unless ($dir =~ /([^\/]+)\/po$/); - foreach (glob("$dir/*.po")) - { - my $lang; - next unless /([^\/]+)\.po/; - $lang = $1; - - EnsureDirectories($target, "share/locale/$lang", - "share/locale/$lang/LC_MESSAGES"); - my @args = ( - "$nlspath\\bin\\msgfmt", - '-o', - "$target\\share\\locale\\$lang\\LC_MESSAGES\\$prgm-$majorver.mo", - $_); - system(@args) && croak("Could not run msgfmt on $dir\\$_"); - print "."; - } - } - print "\n"; - return; -} - -sub DetermineMajorVersion -{ - my $f = read_file('src/include/pg_config.h') - || croak 'Could not open pg_config.h'; - $f =~ /^#define\s+PG_MAJORVERSION\s+"([^"]+)"/m - || croak 'Could not determine major version'; - return $1; -} - -sub DetermineCatalogName -{ - my $filename = shift; - - my $f = read_file($filename) || croak "Could not open $filename"; - $f =~ /CATALOG_NAME\s*\:?=\s*(\S+)/m - || croak "Could not determine catalog name in $filename"; - return $1; -} - -sub read_file -{ - my $filename = shift; - my $F; - local $/ = undef; - open($F, '<', $filename) || die "Could not open file $filename\n"; - my $txt = <$F>; - close($F); - - return $txt; -} - -1; diff --git a/src/tools/msvc/MSBuildProject.pm b/src/tools/msvc/MSBuildProject.pm deleted file mode 100644 index 62fec1fee5b7b..0000000000000 --- a/src/tools/msvc/MSBuildProject.pm +++ /dev/null @@ -1,508 +0,0 @@ - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -package MSBuildProject; - -# -# Package that encapsulates a MSBuild project file (Visual C++ 2015 or greater) -# -# src/tools/msvc/MSBuildProject.pm -# - -use Carp; -use strict; -use warnings; -use base qw(Project); - -no warnings qw(redefine); ## no critic - -sub _new -{ - my $classname = shift; - my $self = $classname->SUPER::_new(@_); - bless($self, $classname); - - $self->{filenameExtension} = '.vcxproj'; - $self->{ToolsVersion} = '4.0'; - - return $self; -} - -sub WriteHeader -{ - my ($self, $f) = @_; - - print $f < - - -EOF - $self->WriteConfigurationHeader($f, 'Debug'); - $self->WriteConfigurationHeader($f, 'Release'); - print $f < - - $self->{guid} -EOF - # Check whether WindowsSDKVersion env variable is present. - # Add WindowsTargetPlatformVersion node if so. - my $sdkVersion = $ENV{'WindowsSDKVersion'}; - if (defined($sdkVersion)) - { - # remove trailing backslash if necessary. - $sdkVersion =~ s/\\$//; - print $f <$sdkVersion -EOF - } - print $f < - -EOF - $self->WriteConfigurationPropertyGroup($f, 'Release', - { wholeopt => 'false' }); - $self->WriteConfigurationPropertyGroup($f, 'Debug', - { wholeopt => 'false' }); - print $f < - - -EOF - $self->WritePropertySheetsPropertyGroup($f, 'Release'); - $self->WritePropertySheetsPropertyGroup($f, 'Debug'); - print $f < - - <_ProjectFileVersion>10.0.30319.1 -EOF - $self->WriteAdditionalProperties($f, 'Debug'); - $self->WriteAdditionalProperties($f, 'Release'); - print $f < -EOF - - $self->WriteItemDefinitionGroup( - $f, 'Debug', - { - defs => "_DEBUG;DEBUG=1", - opt => 'Disabled', - strpool => 'false', - runtime => 'MultiThreadedDebugDLL' - }); - $self->WriteItemDefinitionGroup( - $f, - 'Release', - { - defs => "", - opt => 'Full', - strpool => 'true', - runtime => 'MultiThreadedDLL' - }); - return; -} - -sub AddDefine -{ - my ($self, $def) = @_; - - $self->{defines} .= $def . ';'; - return; -} - -sub WriteReferences -{ - my ($self, $f) = @_; - - my @references = @{ $self->{references} }; - - if (scalar(@references)) - { - print $f < -EOF - foreach my $ref (@references) - { - print $f < - $ref->{guid} - -EOF - } - print $f < -EOF - } - return; -} - -sub WriteFiles -{ - my ($self, $f) = @_; - print $f < -EOF - my @grammarFiles = (); - my @resourceFiles = (); - my %uniquefiles; - foreach my $fileNameWithPath (sort keys %{ $self->{files} }) - { - confess "Bad format filename '$fileNameWithPath'\n" - unless ($fileNameWithPath =~ m!^(.*)/([^/]+)\.(c|cpp|y|l|rc)$!); - my $dir = $1; - my $fileName = $2; - if ($fileNameWithPath =~ /\.y$/ or $fileNameWithPath =~ /\.l$/) - { - push @grammarFiles, $fileNameWithPath; - } - elsif ($fileNameWithPath =~ /\.rc$/) - { - push @resourceFiles, $fileNameWithPath; - } - elsif (defined($uniquefiles{$fileName})) - { - - # File already exists, so fake a new name - my $obj = $dir; - $obj =~ s!/!_!g; - - print $f < - .\\debug\\$self->{name}\\${obj}_$fileName.obj - .\\release\\$self->{name}\\${obj}_$fileName.obj - -EOF - } - else - { - $uniquefiles{$fileName} = 1; - print $f < -EOF - } - - } - print $f < -EOF - if (scalar(@grammarFiles)) - { - print $f < -EOF - foreach my $grammarFile (@grammarFiles) - { - (my $outputFile = $grammarFile) =~ s/\.(y|l)$/.c/; - if ($grammarFile =~ /\.y$/) - { - $outputFile =~ - s{^src\\pl\\plpgsql\\src\\gram.c$}{src\\pl\\plpgsql\\src\\pl_gram.c}; - print $f < - Running bison on $grammarFile - perl "src\\tools\\msvc\\pgbison.pl" "$grammarFile" - %(AdditionalInputs) - $outputFile;%(Outputs) - Running bison on $grammarFile - perl "src\\tools\\msvc\\pgbison.pl" "$grammarFile" - %(AdditionalInputs) - $outputFile;%(Outputs) - -EOF - } - else #if ($grammarFile =~ /\.l$/) - { - print $f < - Running flex on $grammarFile - perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" - %(AdditionalInputs) - $outputFile;%(Outputs) - Running flex on $grammarFile - perl "src\\tools\\msvc\\pgflex.pl" "$grammarFile" - %(AdditionalInputs) - $outputFile;%(Outputs) - -EOF - } - } - print $f < -EOF - } - if (scalar(@resourceFiles)) - { - print $f < -EOF - foreach my $rcFile (@resourceFiles) - { - print $f < -EOF - } - print $f < -EOF - } - return; -} - -sub WriteConfigurationHeader -{ - my ($self, $f, $cfgname) = @_; - print $f < - $cfgname - $self->{platform} - -EOF - return; -} - -sub WriteConfigurationPropertyGroup -{ - my ($self, $f, $cfgname, $p) = @_; - my $cfgtype = - ($self->{type} eq "exe") - ? 'Application' - : ($self->{type} eq "dll" ? 'DynamicLibrary' : 'StaticLibrary'); - - print $f < - $cfgtype - false - MultiByte - $p->{wholeopt} - $self->{PlatformToolset} - -EOF - return; -} - -sub WritePropertySheetsPropertyGroup -{ - my ($self, $f, $cfgname) = @_; - print $f < - - -EOF - return; -} - -sub WriteAdditionalProperties -{ - my ($self, $f, $cfgname) = @_; - print $f <.\\$cfgname\\$self->{name}\\ - .\\$cfgname\\$self->{name}\\ - false -EOF - return; -} - -sub WriteItemDefinitionGroup -{ - my ($self, $f, $cfgname, $p) = @_; - my $cfgtype = - ($self->{type} eq "exe") - ? 'Application' - : ($self->{type} eq "dll" ? 'DynamicLibrary' : 'StaticLibrary'); - my $libs = $self->GetAdditionalLinkerDependencies($cfgname, ';'); - - my $targetmachine = - $self->{platform} eq 'Win32' ? 'MachineX86' : 'MachineX64'; - my $arch = $self->{platform} eq 'Win32' ? 'x86' : 'x86_64'; - - my $includes = join ';', @{ $self->{includes} }, ""; - - print $f < - - $p->{opt} - $self->{prefixincludes}src/include;src/include/port/win32;src/include/port/win32_msvc;$includes\%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;__WINDOWS__;__WIN32__;WIN32_STACK_RLIMIT=4194304;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE$self->{defines}$p->{defs}\%(PreprocessorDefinitions) - $p->{strpool} - $p->{runtime} - $self->{disablewarnings};\%(DisableSpecificWarnings) - /MP \%(AdditionalOptions) - - - .\\$cfgname\\$self->{name}\\ - .\\$cfgname\\$self->{name}\\ - .\\$cfgname\\$self->{name}\\ - false - Level3 - true - ProgramDatabase - Default - - - .\\$cfgname\\$self->{name}\\$self->{name}.$self->{type} - $libs;\%(AdditionalDependencies) - true - \%(AdditionalLibraryDirectories) - libc;\%(IgnoreSpecificDefaultLibraries) - 4194304 - true - .\\$cfgname\\$self->{name}\\$self->{name}.pdb - false - .\\$cfgname\\$self->{name}\\$self->{name}.map - - - Console - $targetmachine -EOF - if ($self->{disablelinkerwarnings}) - { - print $f - " /ignore:$self->{disablelinkerwarnings} \%(AdditionalOptions)\n"; - } - if ($self->{implib}) - { - my $l = $self->{implib}; - $l =~ s/__CFGNAME__/$cfgname/g; - print $f " $l\n"; - } - if ($self->{def}) - { - my $d = $self->{def}; - $d =~ s/__CFGNAME__/$cfgname/g; - print $f " $d\n"; - } - print $f < - - src\\include;\%(AdditionalIncludeDirectories) - -EOF - if ($self->{builddef}) - { - print $f < - Generate DEF file - perl src\\tools\\msvc\\gendef.pl --arch $arch --deffile $cfgname\\$self->{name}\\$self->{name}.def --tempdir $cfgname\\$self->{name} $cfgname\\$self->{name} - -EOF - } - print $f < -EOF - return; -} - -sub Footer -{ - my ($self, $f) = @_; - $self->WriteReferences($f); - - print $f < - - - -EOF - return; -} - -package VC2015Project; - -# -# Package that encapsulates a Visual C++ 2015 project file -# - -use strict; -use warnings; -use base qw(MSBuildProject); - -no warnings qw(redefine); ## no critic - -sub new -{ - my $classname = shift; - my $self = $classname->SUPER::_new(@_); - bless($self, $classname); - - $self->{vcver} = '14.00'; - $self->{PlatformToolset} = 'v140'; - $self->{ToolsVersion} = '14.0'; - - return $self; -} - -package VC2017Project; - -# -# Package that encapsulates a Visual C++ 2017 project file -# - -use strict; -use warnings; -use base qw(MSBuildProject); - -no warnings qw(redefine); ## no critic - -sub new -{ - my $classname = shift; - my $self = $classname->SUPER::_new(@_); - bless($self, $classname); - - $self->{vcver} = '15.00'; - $self->{PlatformToolset} = 'v141'; - $self->{ToolsVersion} = '15.0'; - - return $self; -} - -package VC2019Project; - -# -# Package that encapsulates a Visual C++ 2019 project file -# - -use strict; -use warnings; -use base qw(MSBuildProject); - -no warnings qw(redefine); ## no critic - -sub new -{ - my $classname = shift; - my $self = $classname->SUPER::_new(@_); - bless($self, $classname); - - $self->{vcver} = '16.00'; - $self->{PlatformToolset} = 'v142'; - $self->{ToolsVersion} = '16.0'; - - return $self; -} - -package VC2022Project; - -# -# Package that encapsulates a Visual C++ 2022 project file -# - -use strict; -use warnings; -use base qw(MSBuildProject); - -no warnings qw(redefine); ## no critic - -sub new -{ - my $classname = shift; - my $self = $classname->SUPER::_new(@_); - bless($self, $classname); - - $self->{vcver} = '17.00'; - $self->{PlatformToolset} = 'v143'; - $self->{ToolsVersion} = '17.0'; - - return $self; -} - -1; diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm deleted file mode 100644 index 9e05eb91b1a81..0000000000000 --- a/src/tools/msvc/Mkvcbuild.pm +++ /dev/null @@ -1,1216 +0,0 @@ - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -package Mkvcbuild; - -# -# Package that generates build files for msvc build -# -# src/tools/msvc/Mkvcbuild.pm -# -use strict; -use warnings; - -use Carp; -use if ($^O eq "MSWin32"), 'Win32'; -use Project; -use Solution; -use Cwd; -use File::Copy; -use Config; -use VSObjectFactory; -use List::Util qw(first); - -use Exporter; -our (@ISA, @EXPORT_OK); -@ISA = qw(Exporter); -@EXPORT_OK = qw(Mkvcbuild); - -my $solution; -my $libpgport; -my $libpgcommon; -my $libpgfeutils; -my $postgres; -my $libpq; -my @unlink_on_exit; - -# Set of variables for modules in contrib/ and src/test/modules/ -my $contrib_defines = {}; -my @contrib_uselibpq = (); -my @contrib_uselibpgport = (); -my @contrib_uselibpgcommon = (); -my $contrib_extralibs = { 'libpq_pipeline' => ['ws2_32.lib'] }; -my $contrib_extraincludes = {}; -my $contrib_extrasource = {}; -my @contrib_excludes = ( - 'bool_plperl', 'commit_ts', - 'hstore_plperl', 'hstore_plpython', - 'intagg', 'jsonb_plperl', - 'jsonb_plpython', 'ltree_plpython', - 'sepgsql', 'brin', - 'test_extensions', 'test_misc', - 'test_pg_dump', 'snapshot_too_old', - 'unsafe_tests'); - -# Set of variables for frontend modules -my $frontend_defines = { 'pgbench' => 'FD_SETSIZE=1024' }; -my @frontend_uselibpq = - ('pg_amcheck', 'pg_ctl', 'pg_upgrade', 'pgbench', 'psql', 'initdb'); -my @frontend_uselibpgport = ( - 'pg_amcheck', 'pg_archivecleanup', - 'pg_test_fsync', 'pg_test_timing', - 'pg_upgrade', 'pg_waldump', - 'pgbench'); -my @frontend_uselibpgcommon = ( - 'pg_amcheck', 'pg_archivecleanup', - 'pg_test_fsync', 'pg_test_timing', - 'pg_upgrade', 'pg_waldump', - 'pgbench'); -my $frontend_extralibs = { - 'initdb' => ['ws2_32.lib'], - 'pg_amcheck' => ['ws2_32.lib'], - 'pg_restore' => ['ws2_32.lib'], - 'pgbench' => ['ws2_32.lib'], - 'psql' => ['ws2_32.lib'] -}; -my $frontend_extraincludes = { - 'initdb' => ['src/timezone'], - 'psql' => ['src/backend'] -}; -my $frontend_extrasource = { - 'psql' => ['src/bin/psql/psqlscanslash.l'], - 'pgbench' => - [ 'src/bin/pgbench/exprscan.l', 'src/bin/pgbench/exprparse.y' ] -}; -my @frontend_excludes = ( - 'pgevent', 'pg_basebackup', 'pg_rewind', 'pg_dump', - 'pg_waldump', 'scripts'); - -sub mkvcbuild -{ - our $config = shift; - - chdir('../../..') if (-d '../msvc' && -d '../../../src'); - die 'Must run from root or msvc directory' - unless (-d 'src/tools/msvc' && -d 'src'); - - my $vsVersion = DetermineVisualStudioVersion(); - - $solution = CreateSolution($vsVersion, $config); - - our @pgportfiles = qw( - chklocale.c explicit_bzero.c - getpeereid.c inet_aton.c - inet_net_ntop.c kill.c open.c - snprintf.c strlcat.c strlcpy.c dirmod.c noblock.c path.c - dirent.c getopt.c getopt_long.c - preadv.c pwritev.c pg_bitutils.c - pg_strong_random.c pgcheckdir.c pgmkdirp.c pgsleep.c pgstrcasecmp.c - pqsignal.c mkdtemp.c qsort.c qsort_arg.c bsearch_arg.c quotes.c system.c - strerror.c tar.c - win32common.c - win32dlopen.c - win32env.c win32error.c - win32fdatasync.c - win32fseek.c - win32getrusage.c - win32gettimeofday.c - win32link.c - win32pread.c - win32pwrite.c - win32ntdll.c - win32security.c win32setlocale.c win32stat.c); - - push(@pgportfiles, 'strtof.c') if ($vsVersion < '14.00'); - - if ($vsVersion >= '9.00') - { - push(@pgportfiles, 'pg_crc32c_sse42_choose.c'); - push(@pgportfiles, 'pg_crc32c_sse42.c'); - push(@pgportfiles, 'pg_crc32c_sb8.c'); - } - else - { - push(@pgportfiles, 'pg_crc32c_sb8.c'); - } - - our @pgcommonallfiles = qw( - archive.c base64.c checksum_helper.c compression.c - config_info.c controldata_utils.c d2s.c encnames.c exec.c - f2s.c file_perm.c file_utils.c hashfn.c ip.c jsonapi.c - keywords.c kwlookup.c link-canary.c md5_common.c percentrepl.c - pg_get_line.c pg_lzcompress.c pg_prng.c pgfnames.c psprintf.c relpath.c - rmtree.c saslprep.c scram-common.c string.c stringinfo.c unicode_norm.c - username.c wait_error.c wchar.c); - - if ($solution->{options}->{openssl}) - { - push(@pgcommonallfiles, 'cryptohash_openssl.c'); - push(@pgcommonallfiles, 'hmac_openssl.c'); - push(@pgcommonallfiles, 'protocol_openssl.c'); - } - else - { - push(@pgcommonallfiles, 'cryptohash.c'); - push(@pgcommonallfiles, 'hmac.c'); - push(@pgcommonallfiles, 'md5.c'); - push(@pgcommonallfiles, 'sha1.c'); - push(@pgcommonallfiles, 'sha2.c'); - } - - our @pgcommonfrontendfiles = ( - @pgcommonallfiles, qw(fe_memutils.c - logging.c restricted_token.c sprompt.c)); - - our @pgcommonbkndfiles = @pgcommonallfiles; - - our @pgfeutilsfiles = qw( - archive.c cancel.c conditional.c connect_utils.c mbprint.c option_utils.c - parallel_slot.c print.c psqlscan.l psqlscan.c query_utils.c simple_list.c - string_utils.c recovery_gen.c); - - $libpgport = $solution->AddProject('libpgport', 'lib', 'misc'); - $libpgport->AddDefine('FRONTEND'); - $libpgport->AddFiles('src/port', @pgportfiles); - - $libpgcommon = $solution->AddProject('libpgcommon', 'lib', 'misc'); - $libpgcommon->AddDefine('FRONTEND'); - $libpgcommon->AddFiles('src/common', @pgcommonfrontendfiles); - - $libpgfeutils = $solution->AddProject('libpgfeutils', 'lib', 'misc'); - $libpgfeutils->AddDefine('FRONTEND'); - $libpgfeutils->AddDefine('FD_SETSIZE=1024'); - $libpgfeutils->AddIncludeDir('src/interfaces/libpq'); - $libpgfeutils->AddFiles('src/fe_utils', @pgfeutilsfiles); - - $postgres = $solution->AddProject('postgres', 'exe', '', 'src/backend'); - $postgres->AddIncludeDir('src/backend'); - $postgres->AddDir('src/backend/port/win32'); - $postgres->AddFile('src/backend/utils/fmgrtab.c'); - $postgres->ReplaceFile('src/backend/port/pg_sema.c', - 'src/backend/port/win32_sema.c'); - $postgres->ReplaceFile('src/backend/port/pg_shmem.c', - 'src/backend/port/win32_shmem.c'); - $postgres->AddFiles('src/port', @pgportfiles); - $postgres->AddFiles('src/common', @pgcommonbkndfiles); - $postgres->AddDir('src/timezone'); - - # We need source files from src/timezone, but that directory's resource - # file pertains to "zic", not to the backend. - $postgres->RemoveFile('src/timezone/win32ver.rc'); - $postgres->AddFiles('src/backend/parser', 'scan.l', 'gram.y'); - $postgres->AddFiles('src/backend/bootstrap', 'bootscanner.l', - 'bootparse.y'); - $postgres->AddFiles('src/backend/utils/misc', 'guc-file.l'); - $postgres->AddFiles( - 'src/backend/replication', 'repl_scanner.l', - 'repl_gram.y', 'syncrep_scanner.l', - 'syncrep_gram.y'); - $postgres->AddFiles('src/backend/utils/adt', 'jsonpath_scan.l', - 'jsonpath_gram.y'); - $postgres->AddDefine('BUILDING_DLL'); - $postgres->AddLibrary('secur32.lib'); - $postgres->AddLibrary('ws2_32.lib'); - $postgres->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap}); - $postgres->FullExportDLL('postgres.lib'); - - # The OBJS scraper doesn't know about ifdefs, so remove appropriate files - # if building without OpenSSL. - if (!$solution->{options}->{openssl}) - { - $postgres->RemoveFile('src/backend/libpq/be-secure-common.c'); - $postgres->RemoveFile('src/backend/libpq/be-secure-openssl.c'); - } - if (!$solution->{options}->{gss}) - { - $postgres->RemoveFile('src/backend/libpq/be-gssapi-common.c'); - $postgres->RemoveFile('src/backend/libpq/be-secure-gssapi.c'); - } - - my $snowball = $solution->AddProject('dict_snowball', 'dll', '', - 'src/backend/snowball'); - - # This Makefile uses VPATH to find most source files in a subdirectory. - $snowball->RelocateFiles( - 'src/backend/snowball/libstemmer', - sub { - return shift !~ /(dict_snowball.c|win32ver.rc)$/; - }); - $snowball->AddIncludeDir('src/include/snowball'); - $snowball->AddReference($postgres); - - my $plpgsql = - $solution->AddProject('plpgsql', 'dll', 'PLs', 'src/pl/plpgsql/src'); - $plpgsql->AddFiles('src/pl/plpgsql/src', 'pl_gram.y'); - $plpgsql->AddReference($postgres); - - if ($solution->{options}->{tcl}) - { - my $found = 0; - my $pltcl = - $solution->AddProject('pltcl', 'dll', 'PLs', 'src/pl/tcl'); - $pltcl->AddIncludeDir($solution->{options}->{tcl} . '/include'); - $pltcl->AddReference($postgres); - - for my $tclver (qw(86t 86 85 84)) - { - my $tcllib = $solution->{options}->{tcl} . "/lib/tcl$tclver.lib"; - if (-e $tcllib) - { - $pltcl->AddLibrary($tcllib); - $found = 1; - last; - } - } - die "Unable to find $solution->{options}->{tcl}/lib/tcl.lib" - unless $found; - } - - $libpq = $solution->AddProject('libpq', 'dll', 'interfaces', - 'src/interfaces/libpq'); - $libpq->AddIncludeDir('src/port'); - $libpq->AddLibrary('secur32.lib'); - $libpq->AddLibrary('ws2_32.lib'); - $libpq->AddLibrary('wldap32.lib') if ($solution->{options}->{ldap}); - $libpq->UseDef('src/interfaces/libpq/libpqdll.def'); - $libpq->AddReference($libpgcommon, $libpgport); - - # The OBJS scraper doesn't know about ifdefs, so remove appropriate files - # if building without OpenSSL. - if (!$solution->{options}->{openssl}) - { - $libpq->RemoveFile('src/interfaces/libpq/fe-secure-common.c'); - $libpq->RemoveFile('src/interfaces/libpq/fe-secure-openssl.c'); - } - if (!$solution->{options}->{gss}) - { - $libpq->RemoveFile('src/interfaces/libpq/fe-gssapi-common.c'); - $libpq->RemoveFile('src/interfaces/libpq/fe-secure-gssapi.c'); - } - - my $libpqwalreceiver = - $solution->AddProject('libpqwalreceiver', 'dll', '', - 'src/backend/replication/libpqwalreceiver'); - $libpqwalreceiver->AddIncludeDir('src/interfaces/libpq'); - $libpqwalreceiver->AddReference($postgres, $libpq); - - my $libpq_testclient = - $solution->AddProject('libpq_testclient', 'exe', 'misc', - 'src/interfaces/libpq/test'); - $libpq_testclient->AddFile( - 'src/interfaces/libpq/test/libpq_testclient.c'); - $libpq_testclient->AddIncludeDir('src/interfaces/libpq'); - $libpq_testclient->AddReference($libpgport, $libpq); - $libpq_testclient->AddLibrary('ws2_32.lib'); - - my $libpq_uri_regress = - $solution->AddProject('libpq_uri_regress', 'exe', 'misc', - 'src/interfaces/libpq/test'); - $libpq_uri_regress->AddFile( - 'src/interfaces/libpq/test/libpq_uri_regress.c'); - $libpq_uri_regress->AddIncludeDir('src/interfaces/libpq'); - $libpq_uri_regress->AddReference($libpgport, $libpq); - $libpq_uri_regress->AddLibrary('ws2_32.lib'); - - my $pgoutput = $solution->AddProject('pgoutput', 'dll', '', - 'src/backend/replication/pgoutput'); - $pgoutput->AddReference($postgres); - - my $pgtypes = $solution->AddProject( - 'libpgtypes', 'dll', - 'interfaces', 'src/interfaces/ecpg/pgtypeslib'); - $pgtypes->AddReference($libpgcommon, $libpgport); - $pgtypes->UseDef('src/interfaces/ecpg/pgtypeslib/pgtypeslib.def'); - $pgtypes->AddIncludeDir('src/interfaces/ecpg/include'); - - my $libecpg = $solution->AddProject('libecpg', 'dll', 'interfaces', - 'src/interfaces/ecpg/ecpglib'); - $libecpg->AddIncludeDir('src/interfaces/ecpg/include'); - $libecpg->AddIncludeDir('src/interfaces/libpq'); - $libecpg->AddIncludeDir('src/port'); - $libecpg->UseDef('src/interfaces/ecpg/ecpglib/ecpglib.def'); - $libecpg->AddLibrary('ws2_32.lib'); - $libecpg->AddReference($libpq, $pgtypes, $libpgport); - - my $libecpgcompat = $solution->AddProject( - 'libecpg_compat', 'dll', - 'interfaces', 'src/interfaces/ecpg/compatlib'); - $libecpgcompat->AddIncludeDir('src/interfaces/ecpg/include'); - $libecpgcompat->AddIncludeDir('src/interfaces/libpq'); - $libecpgcompat->UseDef('src/interfaces/ecpg/compatlib/compatlib.def'); - $libecpgcompat->AddReference($pgtypes, $libecpg, $libpgport, - $libpgcommon); - - my $ecpg = $solution->AddProject('ecpg', 'exe', 'interfaces', - 'src/interfaces/ecpg/preproc'); - $ecpg->AddIncludeDir('src/interfaces/ecpg/include'); - $ecpg->AddIncludeDir('src/interfaces/ecpg/ecpglib'); - $ecpg->AddIncludeDir('src/interfaces/libpq'); - $ecpg->AddPrefixInclude('src/interfaces/ecpg/preproc'); - $ecpg->AddFiles('src/interfaces/ecpg/preproc', 'pgc.l', 'preproc.y'); - $ecpg->AddReference($libpgcommon, $libpgport); - - my $pgregress_ecpg = - $solution->AddProject('pg_regress_ecpg', 'exe', 'misc'); - $pgregress_ecpg->AddFile('src/interfaces/ecpg/test/pg_regress_ecpg.c'); - $pgregress_ecpg->AddFile('src/test/regress/pg_regress.c'); - $pgregress_ecpg->AddIncludeDir('src/port'); - $pgregress_ecpg->AddIncludeDir('src/test/regress'); - $pgregress_ecpg->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); - $pgregress_ecpg->AddLibrary('ws2_32.lib'); - $pgregress_ecpg->AddDirResourceFile('src/interfaces/ecpg/test'); - $pgregress_ecpg->AddReference($libpgcommon, $libpgport); - - my $isolation_tester = - $solution->AddProject('isolationtester', 'exe', 'misc'); - $isolation_tester->AddFile('src/test/isolation/isolationtester.c'); - $isolation_tester->AddFile('src/test/isolation/specparse.y'); - $isolation_tester->AddFile('src/test/isolation/specscanner.l'); - $isolation_tester->AddFile('src/test/isolation/specparse.c'); - $isolation_tester->AddFile('src/test/isolation/specscanner.c'); - $isolation_tester->AddIncludeDir('src/test/isolation'); - $isolation_tester->AddIncludeDir('src/port'); - $isolation_tester->AddIncludeDir('src/test/regress'); - $isolation_tester->AddIncludeDir('src/interfaces/libpq'); - $isolation_tester->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); - $isolation_tester->AddLibrary('ws2_32.lib'); - $isolation_tester->AddDirResourceFile('src/test/isolation'); - $isolation_tester->AddReference($libpq, $libpgcommon, $libpgport); - - my $pgregress_isolation = - $solution->AddProject('pg_isolation_regress', 'exe', 'misc'); - $pgregress_isolation->AddFile('src/test/isolation/isolation_main.c'); - $pgregress_isolation->AddFile('src/test/regress/pg_regress.c'); - $pgregress_isolation->AddIncludeDir('src/port'); - $pgregress_isolation->AddIncludeDir('src/test/regress'); - $pgregress_isolation->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); - $pgregress_isolation->AddLibrary('ws2_32.lib'); - $pgregress_isolation->AddDirResourceFile('src/test/isolation'); - $pgregress_isolation->AddReference($libpgcommon, $libpgport); - - # src/bin - my $D; - opendir($D, 'src/bin') || croak "Could not opendir on src/bin!\n"; - while (my $d = readdir($D)) - { - next if ($d =~ /^\./); - next unless (-f "src/bin/$d/Makefile"); - next if (grep { /^$d$/ } @frontend_excludes); - AddSimpleFrontend($d); - } - - my $pgbasebackup = AddSimpleFrontend('pg_basebackup', 1); - # This list of files has to match BBOBJS in pg_basebackup's Makefile. - $pgbasebackup->AddFile('src/bin/pg_basebackup/pg_basebackup.c'); - $pgbasebackup->AddFile('src/bin/pg_basebackup/bbstreamer_file.c'); - $pgbasebackup->AddFile('src/bin/pg_basebackup/bbstreamer_gzip.c'); - $pgbasebackup->AddFile('src/bin/pg_basebackup/bbstreamer_inject.c'); - $pgbasebackup->AddFile('src/bin/pg_basebackup/bbstreamer_lz4.c'); - $pgbasebackup->AddFile('src/bin/pg_basebackup/bbstreamer_tar.c'); - $pgbasebackup->AddFile('src/bin/pg_basebackup/bbstreamer_zstd.c'); - $pgbasebackup->AddLibrary('ws2_32.lib'); - - my $pgreceivewal = AddSimpleFrontend('pg_basebackup', 1); - $pgreceivewal->{name} = 'pg_receivewal'; - $pgreceivewal->AddFile('src/bin/pg_basebackup/pg_receivewal.c'); - $pgreceivewal->AddLibrary('ws2_32.lib'); - - my $pgrecvlogical = AddSimpleFrontend('pg_basebackup', 1); - $pgrecvlogical->{name} = 'pg_recvlogical'; - $pgrecvlogical->AddFile('src/bin/pg_basebackup/pg_recvlogical.c'); - $pgrecvlogical->AddLibrary('ws2_32.lib'); - - my $pgrewind = AddSimpleFrontend('pg_rewind', 1); - $pgrewind->{name} = 'pg_rewind'; - $pgrewind->AddFile('src/backend/access/transam/xlogreader.c'); - $pgrewind->AddLibrary('ws2_32.lib'); - $pgrewind->AddDefine('FRONTEND'); - - my $pgevent = $solution->AddProject('pgevent', 'dll', 'bin'); - $pgevent->AddFiles('src/bin/pgevent', 'pgevent.c', 'pgmsgevent.rc'); - $pgevent->AddResourceFile('src/bin/pgevent', 'Eventlog message formatter', - 'win32'); - $pgevent->UseDef('src/bin/pgevent/pgevent.def'); - $pgevent->DisableLinkerWarnings('4104'); - - my $pgdump = AddSimpleFrontend('pg_dump', 1); - $pgdump->AddIncludeDir('src/backend'); - $pgdump->AddFile('src/bin/pg_dump/pg_dump.c'); - $pgdump->AddFile('src/bin/pg_dump/common.c'); - $pgdump->AddFile('src/bin/pg_dump/pg_dump_sort.c'); - $pgdump->AddLibrary('ws2_32.lib'); - - my $pgdumpall = AddSimpleFrontend('pg_dump', 1); - - # pg_dumpall doesn't use the files in the Makefile's $(OBJS), unlike - # pg_dump and pg_restore. - # So remove their sources from the object, keeping the other setup that - # AddSimpleFrontend() has done. - my @nodumpall = grep { m!src/bin/pg_dump/.*\.c$! } - keys %{ $pgdumpall->{files} }; - delete @{ $pgdumpall->{files} }{@nodumpall}; - $pgdumpall->{name} = 'pg_dumpall'; - $pgdumpall->AddIncludeDir('src/backend'); - $pgdumpall->AddFile('src/bin/pg_dump/pg_dumpall.c'); - $pgdumpall->AddFile('src/bin/pg_dump/dumputils.c'); - $pgdumpall->AddLibrary('ws2_32.lib'); - - my $pgrestore = AddSimpleFrontend('pg_dump', 1); - $pgrestore->{name} = 'pg_restore'; - $pgrestore->AddIncludeDir('src/backend'); - $pgrestore->AddFile('src/bin/pg_dump/pg_restore.c'); - $pgrestore->AddLibrary('ws2_32.lib'); - - my $zic = $solution->AddProject('zic', 'exe', 'utils'); - $zic->AddFiles('src/timezone', 'zic.c'); - $zic->AddDirResourceFile('src/timezone'); - $zic->AddReference($libpgcommon, $libpgport); - - if (!$solution->{options}->{xml}) - { - push @contrib_excludes, 'xml2'; - } - - if (!$solution->{options}->{openssl}) - { - push @contrib_excludes, 'sslinfo', 'ssl_passphrase_callback', - 'pgcrypto'; - } - - if (!$solution->{options}->{ldap}) - { - push @contrib_excludes, 'ldap_password_func'; - } - - if (!$solution->{options}->{uuid}) - { - push @contrib_excludes, 'uuid-ossp'; - } - - foreach my $subdir ('contrib', 'src/test/modules') - { - opendir($D, $subdir) || croak "Could not opendir on $subdir!\n"; - while (my $d = readdir($D)) - { - next if ($d =~ /^\./); - next unless (-f "$subdir/$d/Makefile"); - next if (grep { /^$d$/ } @contrib_excludes); - AddContrib($subdir, $d); - } - closedir($D); - } - - # Build Perl and Python modules after contrib/ modules to satisfy some - # dependencies with transform contrib modules, like hstore_plpython - # ltree_plpython and hstore_plperl. - if ($solution->{options}->{python}) - { - - # Attempt to get python version and location. - # Assume python.exe in specified dir. - my $pythonprog = "import sys;print(sys.prefix);" - . "print(str(sys.version_info[0])+str(sys.version_info[1]))"; - my $prefixcmd = - qq("$solution->{options}->{python}\\python" -c "$pythonprog"); - my $pyout = `$prefixcmd`; - die "Could not query for python version!\n" if $?; - my ($pyprefix, $pyver) = split(/\r?\n/, $pyout); - - # Sometimes (always?) if python is not present, the execution - # appears to work, but gives no data... - die "Failed to query python for version information\n" - if (!(defined($pyprefix) && defined($pyver))); - - my $pymajorver = substr($pyver, 0, 1); - - die - "Python version $pyver is too old (version 3 or later is required)" - if int($pymajorver) < 3; - - my $plpython = $solution->AddProject('plpython' . $pymajorver, - 'dll', 'PLs', 'src/pl/plpython'); - $plpython->AddIncludeDir($pyprefix . '/include'); - $plpython->AddLibrary($pyprefix . "/Libs/python$pyver.lib"); - $plpython->AddReference($postgres); - - # Add transform modules dependent on plpython - my $hstore_plpython = AddTransformModule( - 'hstore_plpython' . $pymajorver, 'contrib/hstore_plpython', - 'plpython' . $pymajorver, 'src/pl/plpython', - 'hstore', 'contrib'); - $hstore_plpython->AddDefine( - 'PLPYTHON_LIBNAME="plpython' . $pymajorver . '"'); - my $jsonb_plpython = AddTransformModule( - 'jsonb_plpython' . $pymajorver, 'contrib/jsonb_plpython', - 'plpython' . $pymajorver, 'src/pl/plpython'); - $jsonb_plpython->AddDefine( - 'PLPYTHON_LIBNAME="plpython' . $pymajorver . '"'); - my $ltree_plpython = AddTransformModule( - 'ltree_plpython' . $pymajorver, 'contrib/ltree_plpython', - 'plpython' . $pymajorver, 'src/pl/plpython', - 'ltree', 'contrib'); - $ltree_plpython->AddDefine( - 'PLPYTHON_LIBNAME="plpython' . $pymajorver . '"'); - } - - if ($solution->{options}->{perl}) - { - my $plperlsrc = "src/pl/plperl/"; - my $plperl = - $solution->AddProject('plperl', 'dll', 'PLs', 'src/pl/plperl'); - $plperl->AddIncludeDir($solution->{options}->{perl} . '/lib/CORE'); - $plperl->AddReference($postgres); - - my $perl_path = $solution->{options}->{perl} . '\lib\CORE\*perl*'; - - # ActivePerl 5.16 provided perl516.lib; 5.18 provided libperl518.a - # Starting with ActivePerl 5.24, both perlnn.lib and libperlnn.a are provided. - # In this case, prefer .lib. - my @perl_libs = - reverse sort grep { /perl\d+\.lib$|libperl\d+\.a$/ } - glob($perl_path); - if (@perl_libs > 0) - { - $plperl->AddLibrary($perl_libs[0]); - } - else - { - die - "could not identify perl library version matching pattern $perl_path\n"; - } - - # Add defines from Perl's ccflags; see PGAC_CHECK_PERL_EMBED_CCFLAGS - my @perl_embed_ccflags; - foreach my $f (split(" ", $Config{ccflags})) - { - if ($f =~ /^-D[^_]/) - { - $f =~ s/\-D//; - push(@perl_embed_ccflags, $f); - } - } - - # hack to prevent duplicate definitions of uid_t/gid_t - push(@perl_embed_ccflags, 'PLPERL_HAVE_UID_GID'); - # prevent binary mismatch between MSVC built plperl and - # Strawberry or msys ucrt perl libraries - push(@perl_embed_ccflags, 'NO_THREAD_SAFE_LOCALE'); - - # Windows offers several 32-bit ABIs. Perl is sensitive to - # sizeof(time_t), one of the ABI dimensions. To get 32-bit time_t, - # use "cl -D_USE_32BIT_TIME_T" or plain "gcc". For 64-bit time_t, use - # "gcc -D__MINGW_USE_VC2005_COMPAT" or plain "cl". Before MSVC 2005, - # plain "cl" chose 32-bit time_t. PostgreSQL doesn't support building - # with pre-MSVC-2005 compilers, but it does support linking to Perl - # built with such a compiler. MSVC-built Perl 5.13.4 and later report - # -D_USE_32BIT_TIME_T in $Config{ccflags} if applicable, but - # MinGW-built Perl never reports -D_USE_32BIT_TIME_T despite typically - # needing it. Ignore the $Config{ccflags} opinion about - # -D_USE_32BIT_TIME_T, and use a runtime test to deduce the ABI Perl - # expects. Specifically, test use of PL_modglobal, which maps to a - # PerlInterpreter field whose position depends on sizeof(time_t). - if ($solution->{platform} eq 'Win32') - { - my $source_file = 'conftest.c'; - my $obj = 'conftest.obj'; - my $exe = 'conftest.exe'; - my @conftest = ($source_file, $obj, $exe); - push @unlink_on_exit, @conftest; - unlink $source_file; - open my $o, '>', $source_file - || croak "Could not write to $source_file"; - print $o ' - /* compare to plperl.h */ - #define __inline__ __inline - #define PERL_NO_GET_CONTEXT - #include - #include - - int - main(int argc, char **argv) - { - int dummy_argc = 1; - char *dummy_argv[1] = {""}; - char *dummy_env[1] = {NULL}; - static PerlInterpreter *interp; - - PERL_SYS_INIT3(&dummy_argc, (char ***) &dummy_argv, - (char ***) &dummy_env); - interp = perl_alloc(); - perl_construct(interp); - { - dTHX; - const char key[] = "dummy"; - - PL_exit_flags |= PERL_EXIT_DESTRUCT_END; - hv_store(PL_modglobal, key, sizeof(key) - 1, newSViv(1), 0); - return hv_fetch(PL_modglobal, key, sizeof(key) - 1, 0) == NULL; - } - } -'; - close $o; - - # Build $source_file with a given #define, and return a true value - # if a run of the resulting binary exits successfully. - my $try_define = sub { - my $define = shift; - - unlink $obj, $exe; - my @cmd = ( - 'cl', - '-I' . $solution->{options}->{perl} . '/lib/CORE', - (map { "-D$_" } @perl_embed_ccflags, $define || ()), - $source_file, - '/link', - $perl_libs[0]); - my $compile_output = `@cmd 2>&1`; - -f $exe || die "Failed to build Perl test:\n$compile_output"; - - { - - # Some builds exhibit runtime failure through Perl warning - # 'Can't spawn "conftest.exe"'; suppress that. - no warnings; - - no strict 'subs'; ## no critic (ProhibitNoStrict) - - # Disable error dialog boxes like we do in the postmaster. - # Here, we run code that triggers relevant errors. - use - if ($^O eq "MSWin32"), 'Win32API::File', - qw(SetErrorMode :SEM_); - my $oldmode = SetErrorMode( - SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); - system(".\\$exe"); - SetErrorMode($oldmode); - } - - return !($? >> 8); - }; - - my $define_32bit_time = '_USE_32BIT_TIME_T'; - my $ok_now = $try_define->(undef); - my $ok_32bit = $try_define->($define_32bit_time); - unlink @conftest; - if (!$ok_now && !$ok_32bit) - { - - # Unsupported configuration. Since we used %Config from the - # Perl running the build scripts, this is expected if - # attempting to link with some other Perl. - die "Perl test fails with or without -D$define_32bit_time"; - } - elsif ($ok_now && $ok_32bit) - { - - # Resulting build may work, but it's especially important to - # verify with "vcregress plcheck". A refined test may avoid - # this outcome. - warn "Perl test passes with or without -D$define_32bit_time"; - } - elsif ($ok_32bit) - { - push(@perl_embed_ccflags, $define_32bit_time); - } # else $ok_now, hence no flag required - } - - print "CFLAGS recommended by Perl: $Config{ccflags}\n"; - print "CFLAGS to compile embedded Perl: ", - (join ' ', map { "-D$_" } @perl_embed_ccflags), "\n"; - foreach my $f (@perl_embed_ccflags) - { - $plperl->AddDefine($f); - } - - foreach my $xs ('SPI.xs', 'Util.xs') - { - (my $xsc = $xs) =~ s/\.xs/.c/; - if (Solution::IsNewer("$plperlsrc$xsc", "$plperlsrc$xs")) - { - my $xsubppdir = first { -e "$_/ExtUtils/xsubpp" } (@INC); - print "Building $plperlsrc$xsc...\n"; - system( $solution->{options}->{perl} - . '/bin/perl ' - . "$xsubppdir/ExtUtils/xsubpp -typemap " - . $solution->{options}->{perl} - . '/lib/ExtUtils/typemap ' - . "$plperlsrc$xs " - . ">$plperlsrc$xsc"); - if ((!(-f "$plperlsrc$xsc")) || -z "$plperlsrc$xsc") - { - unlink("$plperlsrc$xsc"); # if zero size - die "Failed to create $xsc.\n"; - } - } - } - if (Solution::IsNewer( - 'src/pl/plperl/perlchunks.h', - 'src/pl/plperl/plc_perlboot.pl') - || Solution::IsNewer( - 'src/pl/plperl/perlchunks.h', - 'src/pl/plperl/plc_trusted.pl')) - { - print 'Building src/pl/plperl/perlchunks.h ...' . "\n"; - my $basedir = getcwd; - chdir 'src/pl/plperl'; - system( $solution->{options}->{perl} - . '/bin/perl ' - . 'text2macro.pl ' - . '--strip="^(\#.*|\s*)$$" ' - . 'plc_perlboot.pl plc_trusted.pl ' - . '>perlchunks.h'); - chdir $basedir; - if ((!(-f 'src/pl/plperl/perlchunks.h')) - || -z 'src/pl/plperl/perlchunks.h') - { - unlink('src/pl/plperl/perlchunks.h'); # if zero size - die 'Failed to create perlchunks.h' . "\n"; - } - } - if (Solution::IsNewer( - 'src/pl/plperl/plperl_opmask.h', - 'src/pl/plperl/plperl_opmask.pl')) - { - print 'Building src/pl/plperl/plperl_opmask.h ...' . "\n"; - my $basedir = getcwd; - chdir 'src/pl/plperl'; - system( $solution->{options}->{perl} - . '/bin/perl ' - . 'plperl_opmask.pl ' - . 'plperl_opmask.h'); - chdir $basedir; - if ((!(-f 'src/pl/plperl/plperl_opmask.h')) - || -z 'src/pl/plperl/plperl_opmask.h') - { - unlink('src/pl/plperl/plperl_opmask.h'); # if zero size - die 'Failed to create plperl_opmask.h' . "\n"; - } - } - - # Add transform modules dependent on plperl - my $bool_plperl = AddTransformModule( - 'bool_plperl', 'contrib/bool_plperl', - 'plperl', 'src/pl/plperl'); - my $hstore_plperl = AddTransformModule( - 'hstore_plperl', 'contrib/hstore_plperl', - 'plperl', 'src/pl/plperl', - 'hstore', 'contrib'); - my $jsonb_plperl = AddTransformModule( - 'jsonb_plperl', 'contrib/jsonb_plperl', - 'plperl', 'src/pl/plperl'); - - foreach my $f (@perl_embed_ccflags) - { - $bool_plperl->AddDefine($f); - $hstore_plperl->AddDefine($f); - $jsonb_plperl->AddDefine($f); - } - } - - my $mf = - Project::read_file('src/backend/utils/mb/conversion_procs/Makefile'); - $mf =~ s{\\\r?\n}{}g; - $mf =~ m{SUBDIRS\s*=\s*(.*)$}m - || die 'Could not match in conversion makefile' . "\n"; - foreach my $sub (split /\s+/, $1) - { - my $dir = 'src/backend/utils/mb/conversion_procs/' . $sub; - my $p = $solution->AddProject($sub, 'dll', 'conversion procs', $dir); - $p->AddFile("$dir/$sub.c"); # implicit source file - $p->AddReference($postgres); - } - - $mf = Project::read_file('src/bin/scripts/Makefile'); - $mf =~ s{\\\r?\n}{}g; - $mf =~ m{PROGRAMS\s*=\s*(.*)$}m - || die 'Could not match in bin/scripts/Makefile' . "\n"; - foreach my $prg (split /\s+/, $1) - { - my $proj = $solution->AddProject($prg, 'exe', 'bin'); - $mf =~ m{$prg\s*:\s*(.*)$}m - || die 'Could not find script define for $prg' . "\n"; - my @files = split /\s+/, $1; - foreach my $f (@files) - { - $f =~ s/\.o$/\.c/; - if ($f =~ /\.c$/) - { - $proj->AddFile('src/bin/scripts/' . $f); - } - } - $proj->AddIncludeDir('src/interfaces/libpq'); - $proj->AddReference($libpq, $libpgfeutils, $libpgcommon, $libpgport); - $proj->AddDirResourceFile('src/bin/scripts'); - $proj->AddLibrary('ws2_32.lib'); - } - - # Regression DLL and EXE - my $regress = $solution->AddProject('regress', 'dll', 'misc'); - $regress->AddFile('src/test/regress/regress.c'); - $regress->AddDirResourceFile('src/test/regress'); - $regress->AddReference($postgres); - - my $pgregress = $solution->AddProject('pg_regress', 'exe', 'misc'); - $pgregress->AddFile('src/test/regress/pg_regress.c'); - $pgregress->AddFile('src/test/regress/pg_regress_main.c'); - $pgregress->AddIncludeDir('src/port'); - $pgregress->AddDefine('HOST_TUPLE="i686-pc-win32vc"'); - $pgregress->AddLibrary('ws2_32.lib'); - $pgregress->AddDirResourceFile('src/test/regress'); - $pgregress->AddReference($libpgcommon, $libpgport); - - # fix up pg_waldump once it's been set up - # files symlinked on Unix are copied on windows - my $pg_waldump = AddSimpleFrontend('pg_waldump'); - $pg_waldump->AddDefine('FRONTEND'); - foreach my $xf (glob('src/backend/access/rmgrdesc/*desc*.c')) - { - $pg_waldump->AddFile($xf); - } - $pg_waldump->AddFile('src/backend/access/transam/xlogreader.c'); - - $solution->Save(); - return $solution->{vcver}; -} - -##################### -# Utility functions # -##################### - -# Add a simple frontend project (exe) -sub AddSimpleFrontend -{ - my $n = shift; - my $uselibpq = shift; - - my $p = $solution->AddProject($n, 'exe', 'bin'); - $p->AddDir('src/bin/' . $n); - $p->AddReference($libpgfeutils, $libpgcommon, $libpgport); - if ($uselibpq) - { - $p->AddIncludeDir('src/interfaces/libpq'); - $p->AddReference($libpq); - } - - # Adjust module definition using frontend variables - AdjustFrontendProj($p); - - return $p; -} - -# Add a simple transform module -sub AddTransformModule -{ - my $n = shift; - my $n_src = shift; - my $pl_proj_name = shift; - my $pl_src = shift; - my $type_name = shift; - my $type_src = shift; - - my $type_proj = undef; - if ($type_name) - { - foreach my $proj (@{ $solution->{projects}->{'contrib'} }) - { - if ($proj->{name} eq $type_name) - { - $type_proj = $proj; - last; - } - } - die "could not find base module $type_name for transform module $n" - if (!defined($type_proj)); - } - - my $pl_proj = undef; - foreach my $proj (@{ $solution->{projects}->{'PLs'} }) - { - if ($proj->{name} eq $pl_proj_name) - { - $pl_proj = $proj; - last; - } - } - die "could not find PL $pl_proj_name for transform module $n" - if (!defined($pl_proj)); - - my $p = $solution->AddProject($n, 'dll', 'contrib', $n_src); - for my $file (glob("$n_src/*.c")) - { - $p->AddFile($file); - } - $p->AddReference($postgres); - - # Add PL dependencies - $p->AddIncludeDir($pl_src); - $p->AddReference($pl_proj); - $p->AddIncludeDir($_) for @{ $pl_proj->{includes} }; - foreach my $pl_lib (@{ $pl_proj->{libraries} }) - { - $p->AddLibrary($pl_lib); - } - - # Add base module dependencies - if ($type_proj) - { - $p->AddIncludeDir($type_src); - $p->AddIncludeDir($_) for @{ $type_proj->{includes} }; - foreach my $type_lib (@{ $type_proj->{libraries} }) - { - $p->AddLibrary($type_lib); - } - $p->AddReference($type_proj); - } - - return $p; -} - -# Add a simple contrib project -sub AddContrib -{ - my $subdir = shift; - my $n = shift; - my $mf = Project::read_file("$subdir/$n/Makefile"); - my @projects = (); - - if ($mf =~ /^MODULE_big\s*=\s*(.*)$/mg) - { - my $dn = $1; - my $proj = $solution->AddProject($dn, 'dll', 'contrib', "$subdir/$n"); - $proj->AddReference($postgres); - AdjustContribProj($proj); - push @projects, $proj; - } - elsif ($mf =~ /^MODULES\s*=\s*(.*)$/mg) - { - foreach my $mod (split /\s+/, $1) - { - my $proj = - $solution->AddProject($mod, 'dll', 'contrib', "$subdir/$n"); - my $filename = $mod . '.c'; - $proj->AddFile("$subdir/$n/$filename"); - $proj->AddReference($postgres); - AdjustContribProj($proj); - push @projects, $proj; - } - } - elsif ($mf =~ /^PROGRAM\s*=\s*(.*)$/mg) - { - my $proj = $solution->AddProject($1, 'exe', 'contrib', "$subdir/$n"); - AdjustContribProj($proj); - push @projects, $proj; - } - else - { - croak "Could not determine contrib module type for $n\n"; - } - - # Process custom compiler flags - if ( $mf =~ /^PG_CPPFLAGS\s*=\s*(.*)$/mg - || $mf =~ /^override\s*CPPFLAGS\s*[+:]?=\s*(.*)$/mg) - { - foreach my $flag (split /\s+/, $1) - { - if ($flag =~ /^-D(.*)$/) - { - foreach my $proj (@projects) - { - $proj->AddDefine($1); - } - } - elsif ($flag =~ /^-I(.*)$/) - { - if ($1 eq '$(libpq_srcdir)') - { - foreach my $proj (@projects) - { - $proj->AddIncludeDir('src/interfaces/libpq'); - $proj->AddReference($libpq); - } - } - } - } - } - - if ($mf =~ /^SHLIB_LINK_INTERNAL\s*[+:]?=\s*(.*)$/mg) - { - foreach my $lib (split /\s+/, $1) - { - if ($lib eq '$(libpq)') - { - foreach my $proj (@projects) - { - $proj->AddIncludeDir('src/interfaces/libpq'); - $proj->AddReference($libpq); - } - } - } - } - - if ($mf =~ /^PG_LIBS_INTERNAL\s*[+:]?=\s*(.*)$/mg) - { - foreach my $lib (split /\s+/, $1) - { - if ($lib eq '$(libpq_pgport)') - { - foreach my $proj (@projects) - { - $proj->AddReference($libpgport); - $proj->AddReference($libpgcommon); - } - } - } - } - - foreach my $line (split /\n/, $mf) - { - if ($line =~ /^[A-Za-z0-9_]*\.o:\s(.*)/) - { - foreach my $file (split /\s+/, $1) - { - foreach my $proj (@projects) - { - $proj->AddDependantFiles("$subdir/$n/$file"); - } - } - } - } - - # Are there any output data files to build? - GenerateContribSqlFiles($n, $mf); - return; -} - -sub GenerateContribSqlFiles -{ - my $n = shift; - my $mf = shift; - $mf =~ s{\\\r?\n}{}g; - if ($mf =~ /^DATA_built\s*=\s*(.*)$/mg) - { - my $l = $1; - - # Strip out $(addsuffix) rules - if (index($l, '$(addsuffix ') >= 0) - { - my $pcount = 0; - my $i; - for ($i = index($l, '$(addsuffix ') + 12; $i < length($l); $i++) - { - $pcount++ if (substr($l, $i, 1) eq '('); - $pcount-- if (substr($l, $i, 1) eq ')'); - last if ($pcount < 0); - } - $l = - substr($l, 0, index($l, '$(addsuffix ')) . substr($l, $i + 1); - } - - foreach my $d (split /\s+/, $l) - { - my $in = "$d.in"; - my $out = "$d"; - - if (Solution::IsNewer("contrib/$n/$out", "contrib/$n/$in")) - { - print "Building $out from $in (contrib/$n)...\n"; - my $cont = Project::read_file("contrib/$n/$in"); - my $dn = $out; - $dn =~ s/\.sql$//; - $cont =~ s/MODULE_PATHNAME/\$libdir\/$dn/g; - my $o; - open($o, '>', "contrib/$n/$out") - || croak "Could not write to contrib/$n/$d"; - print $o $cont; - close($o); - } - } - } - return; -} - -sub AdjustContribProj -{ - my $proj = shift; - AdjustModule( - $proj, $contrib_defines, - \@contrib_uselibpq, \@contrib_uselibpgport, - \@contrib_uselibpgcommon, $contrib_extralibs, - $contrib_extrasource, $contrib_extraincludes); - return; -} - -sub AdjustFrontendProj -{ - my $proj = shift; - AdjustModule( - $proj, $frontend_defines, - \@frontend_uselibpq, \@frontend_uselibpgport, - \@frontend_uselibpgcommon, $frontend_extralibs, - $frontend_extrasource, $frontend_extraincludes); - return; -} - -sub AdjustModule -{ - my $proj = shift; - my $module_defines = shift; - my $module_uselibpq = shift; - my $module_uselibpgport = shift; - my $module_uselibpgcommon = shift; - my $module_extralibs = shift; - my $module_extrasource = shift; - my $module_extraincludes = shift; - my $n = $proj->{name}; - - if ($module_defines->{$n}) - { - foreach my $d ($module_defines->{$n}) - { - $proj->AddDefine($d); - } - } - if (grep { /^$n$/ } @{$module_uselibpq}) - { - $proj->AddIncludeDir('src\interfaces\libpq'); - $proj->AddReference($libpq); - } - if (grep { /^$n$/ } @{$module_uselibpgport}) - { - $proj->AddReference($libpgport); - } - if (grep { /^$n$/ } @{$module_uselibpgcommon}) - { - $proj->AddReference($libpgcommon); - } - if ($module_extralibs->{$n}) - { - foreach my $l (@{ $module_extralibs->{$n} }) - { - $proj->AddLibrary($l); - } - } - if ($module_extraincludes->{$n}) - { - foreach my $i (@{ $module_extraincludes->{$n} }) - { - $proj->AddIncludeDir($i); - } - } - if ($module_extrasource->{$n}) - { - foreach my $i (@{ $module_extrasource->{$n} }) - { - print "Files $i\n"; - $proj->AddFile($i); - } - } - return; -} - -END -{ - unlink @unlink_on_exit; -} - -1; diff --git a/src/tools/msvc/Project.pm b/src/tools/msvc/Project.pm deleted file mode 100644 index 0507ad08c5cee..0000000000000 --- a/src/tools/msvc/Project.pm +++ /dev/null @@ -1,482 +0,0 @@ - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -package Project; - -# -# Package that encapsulates a Visual C++ project file generation -# -# src/tools/msvc/Project.pm -# -use Carp; -use strict; -use warnings; -use File::Basename; - -sub _new -{ - my ($classname, $name, $type, $solution) = @_; - my $good_types = { - lib => 1, - exe => 1, - dll => 1, - }; - confess("Bad project type: $type\n") unless exists $good_types->{$type}; - my $self = { - name => $name, - type => $type, - guid => $^O eq "MSWin32" ? Win32::GuidGen() : 'FAKE', - files => {}, - references => [], - libraries => [], - suffixlib => [], - includes => [], - prefixincludes => '', - defines => ';', - solution => $solution, - disablewarnings => '4018;4244;4273;4101;4102;4090;4267', - disablelinkerwarnings => '', - platform => $solution->{platform}, - }; - - bless($self, $classname); - return $self; -} - -sub AddFile -{ - my ($self, $filename) = @_; - - $self->FindAndAddAdditionalFiles($filename); - $self->{files}->{$filename} = 1; - return; -} - -sub AddDependantFiles -{ - my ($self, $filename) = @_; - - $self->FindAndAddAdditionalFiles($filename); - return; -} - -sub AddFiles -{ - my $self = shift; - my $dir = shift; - - while (my $f = shift) - { - $self->AddFile($dir . "/" . $f, 1); - } - return; -} - -# Handle Makefile rules by searching for other files which exist with the same -# name but a different file extension and add those files too. -sub FindAndAddAdditionalFiles -{ - my $self = shift; - my $fname = shift; - $fname =~ /(.*)(\.[^.]+)$/; - my $filenoext = $1; - my $fileext = $2; - - # For .c files, check if either a .l or .y file of the same name - # exists and add that too. - if ($fileext eq ".c") - { - my $file = $filenoext . ".l"; - if (-e $file) - { - $self->AddFile($file); - } - - $file = $filenoext . ".y"; - if (-e $file) - { - $self->AddFile($file); - } - } -} - -sub ReplaceFile -{ - my ($self, $filename, $newname) = @_; - my $re = "\\/$filename\$"; - - foreach my $file (keys %{ $self->{files} }) - { - - # Match complete filename - if ($filename =~ m!/!) - { - if ($file eq $filename) - { - delete $self->{files}{$file}; - $self->AddFile($newname); - return; - } - } - elsif ($file =~ m/($re)/) - { - delete $self->{files}{$file}; - $self->AddFile("$newname/$filename"); - return; - } - } - confess("Could not find file $filename to replace\n"); -} - -sub RemoveFile -{ - my ($self, $filename) = @_; - my $orig = scalar keys %{ $self->{files} }; - delete $self->{files}->{$filename}; - if ($orig > scalar keys %{ $self->{files} }) - { - return; - } - confess("Could not find file $filename to remove\n"); -} - -sub RelocateFiles -{ - my ($self, $targetdir, $proc) = @_; - foreach my $f (keys %{ $self->{files} }) - { - my $r = &$proc($f); - if ($r) - { - $self->RemoveFile($f); - $self->AddFile($targetdir . '/' . basename($f)); - } - } - return; -} - -sub AddReference -{ - my $self = shift; - - while (my $ref = shift) - { - if (!grep { $_ eq $ref } @{ $self->{references} }) - { - push @{ $self->{references} }, $ref; - } - $self->AddLibrary( - "__CFGNAME__/" . $ref->{name} . "/" . $ref->{name} . ".lib"); - } - return; -} - -sub AddLibrary -{ - my ($self, $lib, $dbgsuffix) = @_; - - # quote lib name if it has spaces and isn't already quoted - if ($lib =~ m/\s/ && $lib !~ m/^[&]quot;/) - { - $lib = '"' . $lib . """; - } - - if (!grep { $_ eq $lib } @{ $self->{libraries} }) - { - push @{ $self->{libraries} }, $lib; - } - - if ($dbgsuffix) - { - push @{ $self->{suffixlib} }, $lib; - } - return; -} - -sub AddIncludeDir -{ - my ($self, $incstr) = @_; - - foreach my $inc (split(/;/, $incstr)) - { - if (!grep { $_ eq $inc } @{ $self->{includes} }) - { - push @{ $self->{includes} }, $inc; - } - } - return; -} - -sub AddPrefixInclude -{ - my ($self, $inc) = @_; - - $self->{prefixincludes} = $inc . ';' . $self->{prefixincludes}; - return; -} - -sub AddDefine -{ - my ($self, $def) = @_; - - $def =~ s/"/""/g; - $self->{defines} .= $def . ';'; - return; -} - -sub FullExportDLL -{ - my ($self, $libname) = @_; - - $self->{builddef} = 1; - $self->{def} = "./__CFGNAME__/$self->{name}/$self->{name}.def"; - $self->{implib} = "__CFGNAME__/$self->{name}/$libname"; - return; -} - -sub UseDef -{ - my ($self, $def) = @_; - - $self->{def} = $def; - return; -} - -sub AddDir -{ - my ($self, $reldir) = @_; - my $mf = read_makefile($reldir); - - $mf =~ s{\\\r?\n}{}g; - if ($mf =~ m{^(?:SUB)?DIRS[^=]*=\s*(.*)$}mg) - { - foreach my $subdir (split /\s+/, $1) - { - next - if $subdir eq "\$(top_builddir)/src/timezone" - ; #special case for non-standard include - next - if $reldir . "/" . $subdir eq "src/backend/port/darwin"; - - $self->AddDir($reldir . "/" . $subdir); - } - } - while ($mf =~ m{^(?:EXTRA_)?OBJS[^=]*=\s*(.*)$}m) - { - my $s = $1; - my $filter_re = qr{\$\(filter ([^,]+),\s+\$\(([^\)]+)\)\)}; - while ($s =~ /$filter_re/) - { - - # Process $(filter a b c, $(VAR)) expressions - my $list = $1; - my $filter = $2; - $list =~ s/\.o/\.c/g; - my @pieces = split /\s+/, $list; - my $matches = ""; - foreach my $p (@pieces) - { - - if ($filter eq "LIBOBJS") - { - no warnings qw(once); - if (grep(/$p/, @main::pgportfiles) == 1) - { - $p =~ s/\.c/\.o/; - $matches .= $p . " "; - } - } - else - { - confess "Unknown filter $filter\n"; - } - } - $s =~ s/$filter_re/$matches/; - } - foreach my $f (split /\s+/, $s) - { - next if $f =~ /^\s*$/; - next if $f eq "\\"; - next if $f =~ /\/SUBSYS.o$/; - $f =~ s/,$// - ; # Remove trailing comma that can show up from filter stuff - next unless $f =~ /.*\.o$/; - $f =~ s/\.o$/\.c/; - if ($f =~ /^\$\(top_builddir\)\/(.*)/) - { - $f = $1; - $self->AddFile($f); - } - else - { - $self->AddFile("$reldir/$f"); - } - } - $mf =~ s{OBJS[^=]*=\s*(.*)$}{}m; - } - - # Match rules that pull in source files from different directories, eg - # pgstrcasecmp.c rint.c snprintf.c: % : $(top_srcdir)/src/port/% - my $replace_re = - qr{^([^:\n\$]+\.c)\s*:\s*(?:%\s*: )?\$(\([^\)]+\))\/(.*)\/[^\/]+\n}m; - while ($mf =~ m{$replace_re}m) - { - my $match = $1; - my $top = $2; - my $target = $3; - my @pieces = split /\s+/, $match; - foreach my $fn (@pieces) - { - if ($top eq "(top_srcdir)") - { - eval { $self->ReplaceFile($fn, $target) }; - } - elsif ($top eq "(backend_src)") - { - eval { $self->ReplaceFile($fn, "src/backend/$target") }; - } - else - { - confess "Bad replacement top: $top, on line $_\n"; - } - } - $mf =~ s{$replace_re}{}m; - } - - $self->AddDirResourceFile($reldir); - return; -} - -# If the directory's Makefile bears a description string, add a resource file. -sub AddDirResourceFile -{ - my ($self, $reldir) = @_; - my $mf = read_makefile($reldir); - - if ($mf =~ /^PGFILEDESC\s*=\s*\"([^\"]+)\"/m) - { - my $desc = $1; - my $ico; - if ($mf =~ /^PGAPPICON\s*=\s*(.*)$/m) { $ico = $1; } - $self->AddResourceFile($reldir, $desc, $ico); - } - return; -} - -sub AddResourceFile -{ - my ($self, $dir, $desc, $ico) = @_; - - if (Solution::IsNewer("$dir/win32ver.rc", 'src/port/win32ver.rc')) - { - print "Generating win32ver.rc for $dir\n"; - open(my $i, '<', 'src/port/win32ver.rc') - || confess "Could not open win32ver.rc"; - open(my $o, '>', "$dir/win32ver.rc") - || confess "Could not write win32ver.rc"; - my $icostr = $ico ? "IDI_ICON ICON \"src/port/$ico.ico\"" : ""; - while (<$i>) - { - s/FILEDESC/"$desc"/gm; - s/_ICO_/$icostr/gm; - if ($self->{type} eq "dll") - { - s/VFT_APP/VFT_DLL/gm; - my $name = $self->{name}; - s/_INTERNAL_NAME_/"$name"/; - s/_ORIGINAL_NAME_/"$name.dll"/; - } - else - { - /_INTERNAL_NAME_/ && next; - /_ORIGINAL_NAME_/ && next; - } - print $o $_; - } - close($o); - close($i); - } - $self->AddFile("$dir/win32ver.rc"); - return; -} - -sub DisableLinkerWarnings -{ - my ($self, $warnings) = @_; - - $self->{disablelinkerwarnings} .= ',' - unless ($self->{disablelinkerwarnings} eq ''); - $self->{disablelinkerwarnings} .= $warnings; - return; -} - -sub Save -{ - my ($self) = @_; - - # Warning 4197 is about double exporting, disable this per - # http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=99193 - $self->DisableLinkerWarnings('4197') if ($self->{platform} eq 'x64'); - - # Dump the project - open(my $f, '>', "$self->{name}$self->{filenameExtension}") - || croak( - "Could not write to $self->{name}$self->{filenameExtension}\n"); - $self->WriteHeader($f); - $self->WriteFiles($f); - $self->Footer($f); - close($f); - return; -} - -sub GetAdditionalLinkerDependencies -{ - my ($self, $cfgname, $separator) = @_; - my $libcfg = (uc $cfgname eq "RELEASE") ? "MD" : "MDd"; - my $libs = ''; - foreach my $lib (@{ $self->{libraries} }) - { - my $xlib = $lib; - foreach my $slib (@{ $self->{suffixlib} }) - { - if ($slib eq $lib) - { - $xlib =~ s/\.lib$/$libcfg.lib/; - last; - } - } - $libs .= $xlib . $separator; - } - $libs =~ s/.$//; - $libs =~ s/__CFGNAME__/$cfgname/g; - return $libs; -} - -# Utility function that loads a complete file -sub read_file -{ - my $filename = shift; - my $F; - local $/ = undef; - open($F, '<', $filename) || croak "Could not open file $filename\n"; - my $txt = <$F>; - close($F); - - return $txt; -} - -sub read_makefile -{ - my $reldir = shift; - my $F; - local $/ = undef; - open($F, '<', "$reldir/GNUmakefile") - || open($F, '<', "$reldir/Makefile") - || confess "Could not open $reldir/Makefile\n"; - my $txt = <$F>; - close($F); - - return $txt; -} - -1; diff --git a/src/tools/msvc/README b/src/tools/msvc/README deleted file mode 100644 index 1c36925258e75..0000000000000 --- a/src/tools/msvc/README +++ /dev/null @@ -1,99 +0,0 @@ -src/tools/msvc/README - -MSVC build -========== - -This directory contains the tools required to build PostgreSQL using -Microsoft Visual Studio 2015 - 2022. This builds the whole backend, not just -the libpq frontend library. For more information, see the documentation -chapter "Installation on Windows" and the description below. - - -Notes about Visual Studio Express ---------------------------------- -To build PostgreSQL using Visual Studio Express, the Microsoft Windows SDK -has to be installed. Since this is not included in the product -originally, extra steps are needed to make it work. - -First, download and install a supported version of the Microsoft Windows SDK -from www.microsoft.com (v8.1a or greater). - -Locate the files vcprojectengine.dll.express.config and -vcprojectengine.dll.config in the vc\vcpackages directory of -the Visual C++ Express installation. In these files, add the paths -to the Platform SDK to the Include, Library and Path tags. Be sure -to add them to the beginning of the list. - -This should work for both GUI and commandline builds, but a restart -may be necessary. - -If you are using a recent version of the Microsoft Windows SDK that includes -the compilers and build tools you probably don't even need Visual Studio -Express to build PostgreSQL. - - -Structure of the build tools ----------------------------- -The tools for building PostgreSQL using Microsoft Visual Studio currently -consist of the following files: - -- Configuration files - -config_default.pl default configuration arguments - -A typical build environment has two more files, buildenv.pl and config.pl -that contain the user's build environment settings and configuration -arguments. - - -- User tools - -build.pl tool to build the binaries -clean.bat batch file for cleaning up generated files -install.pl tool to install the generated files -mkvcbuild.pl tool to generate the Visual Studio build files -vcregress.pl tool to run the regression tests - - -- Internal tools - -gendef.pl internal tool to generate .DEF files -pgbison.pl internal tool to process .y files using bison -pgflex.pl internal tool to process .l files using flex - -Many of those .pl files also have a corresponding .bat-wrapper that doesn't -contain any additional logic. - - -- Internal modules - -Install.pm module containing the install logic -Mkvcbuild.pm module containing the code to generate the Visual - Studio build (project/solution) files -MSBuildProject.pm module containing the code to generate MSBuild based - project files (Visual Studio 2015 or greater) -Project.pm module containing the common code to generate the - Visual Studio project files. Also provides the - common interface of all project file generators -Solution.pm module containing the code to generate the Visual - Studio solution files. -VSObjectFactory.pm factory module providing the code to create the - appropriate project/solution files for the current - environment - - -Description of the internals of the Visual Studio build process ---------------------------------------------------------------- -By typing 'build' the user starts the build.bat wrapper which simply passes -its arguments to build.pl. -In build.pl the user's buildenv.pl is used to set up the build environment -(i. e. path to bison and flex). In addition his config.pl file is merged into -config_default.pl to create the configuration arguments. -These configuration arguments are passed over to Mkvcbuild::mkvcbuild -(Mkvcbuild.pm) which creates the Visual Studio project and solution files. -It does this by using VSObjectFactory::CreateSolution to create an object -implementing the Solution interface (this could be either -VS2015Solution, VS2017Solution, VS2019Solution or VS2022Solution, all in -Solution.pm, depending on the user's build environment) and adding objects -implementing the corresponding Project interface ( -VC2015Project, VC2017Project, VC2019Project or VC2022Project from -MSBuildProject.pm) to it. When Solution::Save is called, the implementations -of Solution and Project save their content in the appropriate format. -The final step of starting the appropriate build program (msbuild) is -performed in build.pl again. diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm deleted file mode 100644 index b6d31c358356f..0000000000000 --- a/src/tools/msvc/Solution.pm +++ /dev/null @@ -1,1347 +0,0 @@ - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -package Solution; - -# -# Package that encapsulates a Visual C++ solution file generation -# -# src/tools/msvc/Solution.pm -# -use Carp; -use strict; -use warnings; -use VSObjectFactory; - -no warnings qw(redefine); ## no critic - -sub _new -{ - my $classname = shift; - my $options = shift; - my $self = { - projects => {}, - options => $options, - VisualStudioVersion => undef, - MinimumVisualStudioVersion => undef, - vcver => undef, - platform => undef, - }; - bless($self, $classname); - - $self->DeterminePlatform(); - - if ($options->{xslt} && !$options->{xml}) - { - die "XSLT requires XML\n"; - } - $options->{blocksize} = 8 - unless $options->{blocksize}; # undef or 0 means default - die "Bad blocksize $options->{blocksize}" - unless grep { $_ == $options->{blocksize} } (1, 2, 4, 8, 16, 32); - $options->{segsize} = 1 - unless $options->{segsize}; # undef or 0 means default - # only allow segsize 1 for now, as we can't do large files yet in windows - die "Bad segsize $options->{segsize}" - unless $options->{segsize} == 1; - $options->{wal_blocksize} = 8 - unless $options->{wal_blocksize}; # undef or 0 means default - die "Bad wal_blocksize $options->{wal_blocksize}" - unless grep { $_ == $options->{wal_blocksize} } - (1, 2, 4, 8, 16, 32, 64); - - return $self; -} - -sub GetAdditionalHeaders -{ - return ''; -} - -sub DeterminePlatform -{ - my $self = shift; - - if ($^O eq "MSWin32") - { - # Examine CL help output to determine if we are in 32 or 64-bit mode. - my $output = `cl /help 2>&1`; - $? >> 8 == 0 or die "cl command not found"; - $self->{platform} = - ($output =~ /^\/favor:<.+AMD64/m) ? 'x64' : 'Win32'; - } - else - { - $self->{platform} = 'FAKE'; - } - print "Detected hardware platform: $self->{platform}\n"; - return; -} - -# Return 1 if $oldfile is newer than $newfile, or if $newfile doesn't exist. -# Special case - if config.pl has changed, always return 1 -sub IsNewer -{ - my ($newfile, $oldfile) = @_; - -e $oldfile or warn "source file \"$oldfile\" does not exist"; - if ( $oldfile ne 'src/tools/msvc/config.pl' - && $oldfile ne 'src/tools/msvc/config_default.pl') - { - return 1 - if (-f 'src/tools/msvc/config.pl') - && IsNewer($newfile, 'src/tools/msvc/config.pl'); - return 1 - if (-f 'src/tools/msvc/config_default.pl') - && IsNewer($newfile, 'src/tools/msvc/config_default.pl'); - } - return 1 if (!(-e $newfile)); - my @nstat = stat($newfile); - my @ostat = stat($oldfile); - return 1 if ($nstat[9] < $ostat[9]); - return 0; -} - -# Copy a file, *not* preserving date. Only works for text files. -sub copyFile -{ - my ($src, $dest) = @_; - open(my $i, '<', $src) || croak "Could not open $src"; - open(my $o, '>', $dest) || croak "Could not open $dest"; - while (<$i>) - { - print $o $_; - } - close($i); - close($o); - return; -} - -# Fetch version of OpenSSL based on a parsing of the command shipped with -# the installer this build is linking to. This returns as result an array -# made of the three first digits of the OpenSSL version, which is enough -# to decide which options to apply depending on the version of OpenSSL -# linking with. -sub GetOpenSSLVersion -{ - my $self = shift; - - # Attempt to get OpenSSL version and location. This assumes that - # openssl.exe is in the specified directory. - # Quote the .exe name in case it has spaces - my $opensslcmd = - qq("$self->{options}->{openssl}\\bin\\openssl.exe" version 2>&1); - my $sslout = `$opensslcmd`; - - $? >> 8 == 0 - or croak - "Unable to determine OpenSSL version: The openssl.exe command wasn't found."; - - if ($sslout =~ /(\d+)\.(\d+)\.(\d+)(\D)/m) - { - return ($1, $2, $3); - } - - croak - "Unable to determine OpenSSL version: The openssl.exe version could not be determined."; -} - -sub GenerateFiles -{ - my $self = shift; - my $bits = $self->{platform} eq 'Win32' ? 32 : 64; - my $ac_init_found = 0; - my $package_name; - my $package_version; - my $package_bugreport; - my $package_url; - my ($majorver, $minorver); - my $ac_define_openssl_api_compat_found = 0; - my $openssl_api_compat; - - # Parse configure.ac to get version numbers - open(my $c, '<', "configure.ac") - || confess("Could not open configure.ac for reading\n"); - while (<$c>) - { - if (/^AC_INIT\(\[([^\]]+)\], \[([^\]]+)\], \[([^\]]+)\], \[([^\]]*)\], \[([^\]]+)\]/ - ) - { - $ac_init_found = 1; - - $package_name = $1; - $package_version = $2; - $package_bugreport = $3; - #$package_tarname = $4; - $package_url = $5; - - if ($package_version !~ /^(\d+)(?:\.(\d+))?/) - { - confess "Bad format of version: $package_version\n"; - } - $majorver = sprintf("%d", $1); - $minorver = sprintf("%d", $2 ? $2 : 0); - } - elsif (/\bAC_DEFINE\(OPENSSL_API_COMPAT, \[([0-9xL]+)\]/) - { - $ac_define_openssl_api_compat_found = 1; - $openssl_api_compat = $1; - } - } - close($c); - confess "Unable to parse configure.ac for all variables!" - unless $ac_init_found && $ac_define_openssl_api_compat_found; - - if (IsNewer("src/include/pg_config_os.h", "src/include/port/win32.h")) - { - print "Copying pg_config_os.h...\n"; - copyFile("src/include/port/win32.h", "src/include/pg_config_os.h"); - } - - print "Generating configuration headers...\n"; - my $extraver = $self->{options}->{extraver}; - $extraver = '' unless defined $extraver; - my $port = $self->{options}->{"--with-pgport"} || 5432; - - # Every symbol in pg_config.h.in must be accounted for here. Set - # to undef if the symbol should not be defined. - my %define = ( - ALIGNOF_DOUBLE => 8, - ALIGNOF_INT => 4, - ALIGNOF_LONG => 4, - ALIGNOF_LONG_LONG_INT => 8, - ALIGNOF_PG_INT128_TYPE => undef, - ALIGNOF_SHORT => 2, - AC_APPLE_UNIVERSAL_BUILD => undef, - BLCKSZ => 1024 * $self->{options}->{blocksize}, - CONFIGURE_ARGS => '"' . $self->GetFakeConfigure() . '"', - DEF_PGPORT => $port, - DEF_PGPORT_STR => qq{"$port"}, - DLSUFFIX => '".dll"', - ENABLE_GSS => $self->{options}->{gss} ? 1 : undef, - ENABLE_NLS => $self->{options}->{nls} ? 1 : undef, - ENABLE_THREAD_SAFETY => 1, - HAVE_APPEND_HISTORY => undef, - HAVE_ASN1_STRING_GET0_DATA => undef, - HAVE_ATOMICS => 1, - HAVE_ATOMIC_H => undef, - HAVE_BACKTRACE_SYMBOLS => undef, - HAVE_BIO_GET_DATA => undef, - HAVE_BIO_METH_NEW => undef, - HAVE_COMPUTED_GOTO => undef, - HAVE_COPYFILE => undef, - HAVE_COPYFILE_H => undef, - HAVE_CRTDEFS_H => undef, - HAVE_CRYPTO_LOCK => undef, - HAVE_DECL_FDATASYNC => 0, - HAVE_DECL_F_FULLFSYNC => 0, - HAVE_DECL_LLVMCREATEGDBREGISTRATIONLISTENER => 0, - HAVE_DECL_LLVMCREATEPERFJITEVENTLISTENER => 0, - HAVE_DECL_LLVMGETHOSTCPUNAME => 0, - HAVE_DECL_LLVMGETHOSTCPUFEATURES => 0, - HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN => 0, - HAVE_DECL_POSIX_FADVISE => 0, - HAVE_DECL_PREADV => 0, - HAVE_DECL_PWRITEV => 0, - HAVE_DECL_STRLCAT => 0, - HAVE_DECL_STRLCPY => 0, - HAVE_DECL_STRNLEN => 1, - HAVE_EDITLINE_HISTORY_H => undef, - HAVE_EDITLINE_READLINE_H => undef, - HAVE_EXECINFO_H => undef, - HAVE_EXPLICIT_BZERO => undef, - HAVE_FSEEKO => 1, - HAVE_GCC__ATOMIC_INT32_CAS => undef, - HAVE_GCC__ATOMIC_INT64_CAS => undef, - HAVE_GCC__SYNC_CHAR_TAS => undef, - HAVE_GCC__SYNC_INT32_CAS => undef, - HAVE_GCC__SYNC_INT32_TAS => undef, - HAVE_GCC__SYNC_INT64_CAS => undef, - HAVE_GETIFADDRS => undef, - HAVE_GETOPT => undef, - HAVE_GETOPT_H => undef, - HAVE_GETOPT_LONG => undef, - HAVE_GETPEEREID => undef, - HAVE_GETPEERUCRED => undef, - HAVE_GSSAPI_EXT_H => undef, - HAVE_GSSAPI_GSSAPI_EXT_H => undef, - HAVE_GSSAPI_GSSAPI_H => undef, - HAVE_GSSAPI_H => undef, - HAVE_HMAC_CTX_FREE => undef, - HAVE_HMAC_CTX_NEW => undef, - HAVE_HISTORY_H => undef, - HAVE_HISTORY_TRUNCATE_FILE => undef, - HAVE_IFADDRS_H => undef, - HAVE_INET_ATON => undef, - HAVE_INET_PTON => 1, - HAVE_INT_TIMEZONE => 1, - HAVE_INT64 => undef, - HAVE_INT8 => undef, - HAVE_INTTYPES_H => undef, - HAVE_INT_OPTERR => undef, - HAVE_INT_OPTRESET => undef, - HAVE_I_CONSTRAINT__BUILTIN_CONSTANT_P => undef, - HAVE_KQUEUE => undef, - HAVE_LANGINFO_H => undef, - HAVE_LDAP_INITIALIZE => undef, - HAVE_LIBCRYPTO => undef, - HAVE_LIBLDAP => undef, - HAVE_LIBLZ4 => undef, - HAVE_LIBM => undef, - HAVE_LIBPAM => undef, - HAVE_LIBREADLINE => undef, - HAVE_LIBSELINUX => undef, - HAVE_LIBSSL => undef, - HAVE_LIBWLDAP32 => undef, - HAVE_LIBXML2 => undef, - HAVE_LIBXSLT => undef, - HAVE_LIBZ => $self->{options}->{zlib} ? 1 : undef, - HAVE_LIBZSTD => undef, - HAVE_LOCALE_T => 1, - HAVE_LONG_INT_64 => undef, - HAVE_LONG_LONG_INT_64 => 1, - HAVE_MBARRIER_H => undef, - HAVE_MBSTOWCS_L => 1, - HAVE_MEMORY_H => 1, - HAVE_MEMSET_S => undef, - HAVE_MKDTEMP => undef, - HAVE_OPENSSL_INIT_SSL => undef, - HAVE_OSSP_UUID_H => undef, - HAVE_PAM_PAM_APPL_H => undef, - HAVE_POSIX_FADVISE => undef, - HAVE_POSIX_FALLOCATE => undef, - HAVE_PPOLL => undef, - HAVE_PTHREAD => undef, - HAVE_PTHREAD_BARRIER_WAIT => undef, - HAVE_PTHREAD_IS_THREADED_NP => undef, - HAVE_PTHREAD_PRIO_INHERIT => undef, - HAVE_READLINE_H => undef, - HAVE_READLINE_HISTORY_H => undef, - HAVE_READLINE_READLINE_H => undef, - HAVE_RL_COMPLETION_MATCHES => undef, - HAVE_RL_COMPLETION_SUPPRESS_QUOTE => undef, - HAVE_RL_FILENAME_COMPLETION_FUNCTION => undef, - HAVE_RL_FILENAME_QUOTE_CHARACTERS => undef, - HAVE_RL_FILENAME_QUOTING_FUNCTION => undef, - HAVE_RL_RESET_SCREEN_SIZE => undef, - HAVE_RL_VARIABLE_BIND => undef, - HAVE_SECURITY_PAM_APPL_H => undef, - HAVE_SETPROCTITLE => undef, - HAVE_SETPROCTITLE_FAST => undef, - HAVE_SOCKLEN_T => 1, - HAVE_SPINLOCKS => 1, - HAVE_SSL_CTX_SET_CERT_CB => undef, - HAVE_STDBOOL_H => 1, - HAVE_STDINT_H => 1, - HAVE_STDLIB_H => 1, - HAVE_STRCHRNUL => undef, - HAVE_STRERROR_R => undef, - HAVE_STRINGS_H => undef, - HAVE_STRING_H => 1, - HAVE_STRLCAT => undef, - HAVE_STRLCPY => undef, - HAVE_STRNLEN => 1, - HAVE_STRSIGNAL => undef, - HAVE_STRUCT_OPTION => undef, - HAVE_STRUCT_SOCKADDR_SA_LEN => undef, - HAVE_STRUCT_TM_TM_ZONE => undef, - HAVE_SYNC_FILE_RANGE => undef, - HAVE_SYNCFS => undef, - HAVE_SYSLOG => undef, - HAVE_SYS_EPOLL_H => undef, - HAVE_SYS_EVENT_H => undef, - HAVE_SYS_PERSONALITY_H => undef, - HAVE_SYS_PRCTL_H => undef, - HAVE_SYS_PROCCTL_H => undef, - HAVE_SYS_SIGNALFD_H => undef, - HAVE_SYS_STAT_H => 1, - HAVE_SYS_TYPES_H => 1, - HAVE_SYS_UCRED_H => undef, - HAVE_TERMIOS_H => undef, - HAVE_TYPEOF => undef, - HAVE_UCRED_H => undef, - HAVE_UINT64 => undef, - HAVE_UINT8 => undef, - HAVE_UNION_SEMUN => undef, - HAVE_UNISTD_H => 1, - HAVE_USELOCALE => undef, - HAVE_UUID_BSD => undef, - HAVE_UUID_E2FS => undef, - HAVE_UUID_OSSP => undef, - HAVE_UUID_H => undef, - HAVE_UUID_UUID_H => undef, - HAVE_WCSTOMBS_L => 1, - HAVE_VISIBILITY_ATTRIBUTE => undef, - HAVE_X509_GET_SIGNATURE_NID => 1, - HAVE_X509_GET_SIGNATURE_INFO => undef, - HAVE_X86_64_POPCNTQ => undef, - HAVE__BOOL => undef, - HAVE__BUILTIN_BSWAP16 => undef, - HAVE__BUILTIN_BSWAP32 => undef, - HAVE__BUILTIN_BSWAP64 => undef, - HAVE__BUILTIN_CLZ => undef, - HAVE__BUILTIN_CONSTANT_P => undef, - HAVE__BUILTIN_CTZ => undef, - HAVE__BUILTIN_FRAME_ADDRESS => undef, - HAVE__BUILTIN_OP_OVERFLOW => undef, - HAVE__BUILTIN_POPCOUNT => undef, - HAVE__BUILTIN_TYPES_COMPATIBLE_P => undef, - HAVE__BUILTIN_UNREACHABLE => undef, - HAVE__CONFIGTHREADLOCALE => 1, - HAVE__CPUID => 1, - HAVE__GET_CPUID => undef, - HAVE__STATIC_ASSERT => undef, - INT64_MODIFIER => qq{"ll"}, - LOCALE_T_IN_XLOCALE => undef, - MAXIMUM_ALIGNOF => 8, - MEMSET_LOOP_LIMIT => 1024, - OPENSSL_API_COMPAT => $openssl_api_compat, - PACKAGE_BUGREPORT => qq{"$package_bugreport"}, - PACKAGE_NAME => qq{"$package_name"}, - PACKAGE_STRING => qq{"$package_name $package_version"}, - PACKAGE_TARNAME => lc qq{"$package_name"}, - PACKAGE_URL => qq{"$package_url"}, - PACKAGE_VERSION => qq{"$package_version"}, - PG_INT128_TYPE => undef, - PG_INT64_TYPE => 'long long int', - PG_KRB_SRVNAM => qq{"postgres"}, - PG_MAJORVERSION => qq{"$majorver"}, - PG_MAJORVERSION_NUM => $majorver, - PG_MINORVERSION_NUM => $minorver, - PG_PRINTF_ATTRIBUTE => undef, - PG_USE_STDBOOL => 1, - PG_VERSION => qq{"$package_version$extraver"}, - PG_VERSION_NUM => sprintf("%d%04d", $majorver, $minorver), - PG_VERSION_STR => - qq{"PostgreSQL $package_version$extraver, compiled by Visual C++ build " CppAsString2(_MSC_VER) ", $bits-bit"}, - PROFILE_PID_DIR => undef, - PTHREAD_CREATE_JOINABLE => undef, - RELSEG_SIZE => (1024 / $self->{options}->{blocksize}) * - $self->{options}->{segsize} * 1024, - SIZEOF_BOOL => 1, - SIZEOF_LONG => 4, - SIZEOF_OFF_T => undef, - SIZEOF_SIZE_T => $bits / 8, - SIZEOF_VOID_P => $bits / 8, - STDC_HEADERS => 1, - STRERROR_R_INT => undef, - USE_ARMV8_CRC32C => undef, - USE_ARMV8_CRC32C_WITH_RUNTIME_CHECK => undef, - USE_ASSERT_CHECKING => $self->{options}->{asserts} ? 1 : undef, - USE_BONJOUR => undef, - USE_BSD_AUTH => undef, - USE_ICU => $self->{options}->{icu} ? 1 : undef, - USE_LIBXML => undef, - USE_LIBXSLT => undef, - USE_LZ4 => undef, - USE_LDAP => $self->{options}->{ldap} ? 1 : undef, - USE_LLVM => undef, - USE_NAMED_POSIX_SEMAPHORES => undef, - USE_OPENSSL => undef, - USE_PAM => undef, - USE_SLICING_BY_8_CRC32C => undef, - USE_SSE42_CRC32C => undef, - USE_SSE42_CRC32C_WITH_RUNTIME_CHECK => 1, - USE_SYSTEMD => undef, - USE_SYSV_SEMAPHORES => undef, - USE_SYSV_SHARED_MEMORY => undef, - USE_UNNAMED_POSIX_SEMAPHORES => undef, - USE_WIN32_SEMAPHORES => 1, - USE_WIN32_SHARED_MEMORY => 1, - USE_ZSTD => undef, - WCSTOMBS_L_IN_XLOCALE => undef, - WORDS_BIGENDIAN => undef, - XLOG_BLCKSZ => 1024 * $self->{options}->{wal_blocksize}, - _FILE_OFFSET_BITS => undef, - _LARGEFILE_SOURCE => undef, - _LARGE_FILES => undef, - inline => '__inline', - pg_restrict => '__restrict', - # not defined, because it'd conflict with __declspec(restrict) - restrict => undef, - typeof => undef,); - - if ($self->{options}->{uuid}) - { - $define{HAVE_UUID_OSSP} = 1; - $define{HAVE_UUID_H} = 1; - } - if ($self->{options}->{xml}) - { - $define{HAVE_LIBXML2} = 1; - $define{USE_LIBXML} = 1; - } - if ($self->{options}->{xslt}) - { - $define{HAVE_LIBXSLT} = 1; - $define{USE_LIBXSLT} = 1; - } - if ($self->{options}->{lz4}) - { - $define{HAVE_LIBLZ4} = 1; - $define{USE_LZ4} = 1; - } - if ($self->{options}->{zstd}) - { - $define{HAVE_LIBZSTD} = 1; - $define{USE_ZSTD} = 1; - } - if ($self->{options}->{openssl}) - { - $define{USE_OPENSSL} = 1; - - my ($digit1, $digit2, $digit3) = $self->GetOpenSSLVersion(); - - # Symbols needed with OpenSSL 1.1.1 and above. - if ( ($digit1 >= '3' && $digit2 >= '0' && $digit3 >= '0') - || ($digit1 >= '1' && $digit2 >= '1' && $digit3 >= '1')) - { - $define{HAVE_X509_GET_SIGNATURE_INFO} = 1; - } - - # Symbols needed with OpenSSL 1.1.0 and above. - if ( ($digit1 >= '3' && $digit2 >= '0' && $digit3 >= '0') - || ($digit1 >= '1' && $digit2 >= '1' && $digit3 >= '0')) - { - $define{HAVE_ASN1_STRING_GET0_DATA} = 1; - $define{HAVE_BIO_GET_DATA} = 1; - $define{HAVE_BIO_METH_NEW} = 1; - $define{HAVE_HMAC_CTX_FREE} = 1; - $define{HAVE_HMAC_CTX_NEW} = 1; - $define{HAVE_OPENSSL_INIT_SSL} = 1; - } - - # Symbols needed with OpenSSL 1.0.2 and above. - if ( ($digit1 >= '3' && $digit2 >= '0' && $digit3 >= '0') - || ($digit1 >= '1' && $digit2 >= '1' && $digit3 >= '0') - || ($digit1 >= '1' && $digit2 >= '0' && $digit3 >= '2')) - { - $define{HAVE_SSL_CTX_SET_CERT_CB} = 1; - } - } - - $self->GenerateConfigHeader('src/include/pg_config.h', \%define, 1); - $self->GenerateConfigHeader('src/include/pg_config_ext.h', \%define, 0); - $self->GenerateConfigHeader('src/interfaces/ecpg/include/ecpg_config.h', - \%define, 0); - - $self->GenerateDefFile( - "src/interfaces/libpq/libpqdll.def", - "src/interfaces/libpq/exports.txt", - "LIBPQ"); - $self->GenerateDefFile( - "src/interfaces/ecpg/ecpglib/ecpglib.def", - "src/interfaces/ecpg/ecpglib/exports.txt", - "LIBECPG"); - $self->GenerateDefFile( - "src/interfaces/ecpg/compatlib/compatlib.def", - "src/interfaces/ecpg/compatlib/exports.txt", - "LIBECPG_COMPAT"); - $self->GenerateDefFile( - "src/interfaces/ecpg/pgtypeslib/pgtypeslib.def", - "src/interfaces/ecpg/pgtypeslib/exports.txt", - "LIBPGTYPES"); - - chdir('src/backend/utils'); - my $pg_proc_dat = '../../../src/include/catalog/pg_proc.dat'; - if ( IsNewer('fmgr-stamp', 'Gen_fmgrtab.pl') - || IsNewer('fmgr-stamp', '../catalog/Catalog.pm') - || IsNewer('fmgr-stamp', $pg_proc_dat) - || IsNewer('fmgr-stamp', '../../../src/include/access/transam.h')) - { - system( - "perl -I ../catalog Gen_fmgrtab.pl --include-path ../../../src/include/ $pg_proc_dat" - ); - open(my $f, '>', 'fmgr-stamp') - || confess "Could not touch fmgr-stamp"; - close($f); - } - chdir('../../..'); - - if (IsNewer( - 'src/include/utils/fmgroids.h', - 'src/backend/utils/fmgroids.h')) - { - copyFile('src/backend/utils/fmgroids.h', - 'src/include/utils/fmgroids.h'); - } - - if (IsNewer( - 'src/include/utils/fmgrprotos.h', - 'src/backend/utils/fmgrprotos.h')) - { - copyFile( - 'src/backend/utils/fmgrprotos.h', - 'src/include/utils/fmgrprotos.h'); - } - - if (IsNewer( - 'src/include/storage/lwlocknames.h', - 'src/backend/storage/lmgr/lwlocknames.txt')) - { - print "Generating lwlocknames.c and lwlocknames.h...\n"; - my $lmgr = 'src/backend/storage/lmgr'; - system( - "perl $lmgr/generate-lwlocknames.pl --outdir $lmgr $lmgr/lwlocknames.txt" - ); - } - if (IsNewer( - 'src/include/storage/lwlocknames.h', - 'src/backend/storage/lmgr/lwlocknames.h')) - { - copyFile( - 'src/backend/storage/lmgr/lwlocknames.h', - 'src/include/storage/lwlocknames.h'); - } - - if (IsNewer('src/include/utils/probes.h', 'src/backend/utils/probes.d')) - { - print "Generating probes.h...\n"; - system( - 'perl src/backend/utils/Gen_dummy_probes.pl src/backend/utils/probes.d > src/include/utils/probes.h' - ); - } - - if ($self->{options}->{python} - && IsNewer( - 'src/pl/plpython/spiexceptions.h', - 'src/backend/utils/errcodes.txt')) - { - print "Generating spiexceptions.h...\n"; - system( - 'perl src/pl/plpython/generate-spiexceptions.pl src/backend/utils/errcodes.txt > src/pl/plpython/spiexceptions.h' - ); - } - - if (IsNewer( - 'src/include/utils/errcodes.h', - 'src/backend/utils/errcodes.txt')) - { - print "Generating errcodes.h...\n"; - system( - 'perl src/backend/utils/generate-errcodes.pl --outfile src/backend/utils/errcodes.h src/backend/utils/errcodes.txt' - ); - copyFile('src/backend/utils/errcodes.h', - 'src/include/utils/errcodes.h'); - } - - if (IsNewer( - 'src/pl/plpgsql/src/plerrcodes.h', - 'src/backend/utils/errcodes.txt')) - { - print "Generating plerrcodes.h...\n"; - system( - 'perl src/pl/plpgsql/src/generate-plerrcodes.pl src/backend/utils/errcodes.txt > src/pl/plpgsql/src/plerrcodes.h' - ); - } - - if ($self->{options}->{tcl} - && IsNewer( - 'src/pl/tcl/pltclerrcodes.h', 'src/backend/utils/errcodes.txt')) - { - print "Generating pltclerrcodes.h...\n"; - system( - 'perl src/pl/tcl/generate-pltclerrcodes.pl src/backend/utils/errcodes.txt > src/pl/tcl/pltclerrcodes.h' - ); - } - - if (IsNewer( - 'contrib/fuzzystrmatch/daitch_mokotoff.h', - 'contrib/fuzzystrmatch/daitch_mokotoff_header.pl')) - { - print "Generating daitch_mokotoff.h...\n"; - system( 'perl contrib/fuzzystrmatch/daitch_mokotoff_header.pl ' - . 'contrib/fuzzystrmatch/daitch_mokotoff.h'); - } - - if (IsNewer('src/bin/psql/sql_help.h', 'src/bin/psql/create_help.pl')) - { - print "Generating sql_help.h...\n"; - my $psql = 'src/bin/psql'; - system( - "perl $psql/create_help.pl --docdir doc/src/sgml/ref --outdir $psql --basename sql_help" - ); - } - - if (IsNewer('src/common/kwlist_d.h', 'src/include/parser/kwlist.h')) - { - print "Generating kwlist_d.h...\n"; - system( - 'perl -I src/tools src/tools/gen_keywordlist.pl --extern -o src/common src/include/parser/kwlist.h' - ); - } - - if (IsNewer( - 'src/pl/plpgsql/src/pl_reserved_kwlist_d.h', - 'src/pl/plpgsql/src/pl_reserved_kwlist.h') - || IsNewer( - 'src/pl/plpgsql/src/pl_unreserved_kwlist_d.h', - 'src/pl/plpgsql/src/pl_unreserved_kwlist.h')) - { - print - "Generating pl_reserved_kwlist_d.h and pl_unreserved_kwlist_d.h...\n"; - chdir('src/pl/plpgsql/src'); - system( - 'perl -I ../../../tools ../../../tools/gen_keywordlist.pl --varname ReservedPLKeywords pl_reserved_kwlist.h' - ); - system( - 'perl -I ../../../tools ../../../tools/gen_keywordlist.pl --varname UnreservedPLKeywords pl_unreserved_kwlist.h' - ); - chdir('../../../..'); - } - - if (IsNewer( - 'src/interfaces/ecpg/preproc/c_kwlist_d.h', - 'src/interfaces/ecpg/preproc/c_kwlist.h') - || IsNewer( - 'src/interfaces/ecpg/preproc/ecpg_kwlist_d.h', - 'src/interfaces/ecpg/preproc/ecpg_kwlist.h')) - { - print "Generating c_kwlist_d.h and ecpg_kwlist_d.h...\n"; - chdir('src/interfaces/ecpg/preproc'); - system( - 'perl -I ../../../tools ../../../tools/gen_keywordlist.pl --varname ScanCKeywords --no-case-fold c_kwlist.h' - ); - system( - 'perl -I ../../../tools ../../../tools/gen_keywordlist.pl --varname ScanECPGKeywords ecpg_kwlist.h' - ); - chdir('../../../..'); - } - - if (IsNewer( - 'src/interfaces/ecpg/preproc/preproc.y', - 'src/backend/parser/gram.y')) - { - print "Generating preproc.y...\n"; - my $ecpg = 'src/interfaces/ecpg'; - system( - "perl $ecpg/preproc/parse.pl --srcdir $ecpg/preproc --parser src/backend/parser/gram.y --output $ecpg/preproc/preproc.y" - ); - } - - unless (-f "src/port/pg_config_paths.h") - { - print "Generating pg_config_paths.h...\n"; - open(my $o, '>', 'src/port/pg_config_paths.h') - || confess "Could not open pg_config_paths.h"; - print $o <', 'bki-stamp') - || confess "Could not touch bki-stamp"; - close($f); - chdir('../../..'); - } - - if (IsNewer( - 'src/include/catalog/header-stamp', - 'src/backend/catalog/bki-stamp')) - { - # Copy generated headers to include directory. - opendir(my $dh, 'src/backend/catalog/') - || die "Can't opendir src/backend/catalog/ $!"; - my @def_headers = grep { /pg_\w+_d\.h$/ } readdir($dh); - closedir $dh; - foreach my $def_header (@def_headers) - { - copyFile( - "src/backend/catalog/$def_header", - "src/include/catalog/$def_header"); - } - copyFile( - 'src/backend/catalog/schemapg.h', - 'src/include/catalog/schemapg.h'); - copyFile( - 'src/backend/catalog/system_fk_info.h', - 'src/include/catalog/system_fk_info.h'); - open(my $chs, '>', 'src/include/catalog/header-stamp') - || confess "Could not touch header-stamp"; - close($chs); - } - - my $nmf = Project::read_file('src/backend/nodes/Makefile'); - $nmf =~ s{\\\r?\n}{}g; - $nmf =~ /^node_headers\s*:?=(.*)$/gm - || croak "Could not find node_headers in Makefile\n"; - my @node_headers = split /\s+/, $1; - @node_headers = grep { $_ ne '' } @node_headers; - my @node_files = map { "src/include/$_" } @node_headers; - - my $need_node_support = 0; - foreach my $nodefile (@node_files) - { - if (IsNewer('src/backend/nodes/node-support-stamp', $nodefile)) - { - $need_node_support = 1; - last; - } - } - $need_node_support = 1 - if IsNewer( - 'src/backend/nodes/node-support-stamp', - 'src/backend/nodes/gen_node_support.pl'); - - if ($need_node_support) - { - system( - "perl src/backend/nodes/gen_node_support.pl --outdir src/backend/nodes @node_files" - ); - open(my $f, '>', 'src/backend/nodes/node-support-stamp') - || confess "Could not touch node-support-stamp"; - close($f); - } - - if (IsNewer( - 'src/include/nodes/nodetags.h', - 'src/backend/nodes/nodetags.h')) - { - copyFile('src/backend/nodes/nodetags.h', - 'src/include/nodes/nodetags.h'); - } - - open(my $o, '>', "doc/src/sgml/version.sgml") - || croak "Could not write to version.sgml\n"; - print $o < - -EOF - close($o); - return; -} - -# Read lines from input file and substitute symbols using the same -# logic that config.status uses. There should be one call of this for -# each AC_CONFIG_HEADERS call in configure.ac. -# -# If the "required" argument is true, we also keep track which of our -# defines have been found and error out if any are left unused at the -# end. That way we avoid accumulating defines in this file that are -# no longer used by configure. -sub GenerateConfigHeader -{ - my ($self, $config_header, $defines, $required) = @_; - - my $config_header_in = $config_header . '.in'; - - if ( IsNewer($config_header, $config_header_in) - || IsNewer($config_header, __FILE__)) - { - my %defines_copy = %$defines; - - open(my $i, '<', $config_header_in) - || confess "Could not open $config_header_in\n"; - open(my $o, '>', $config_header) - || confess "Could not write to $config_header\n"; - - print $o - "/* $config_header. Generated from $config_header_in by src/tools/msvc/Solution.pm. */\n"; - - while (<$i>) - { - if (m/^#(\s*)undef\s+(\w+)/) - { - my $ws = $1; - my $macro = $2; - if (exists $defines->{$macro}) - { - if (defined $defines->{$macro}) - { - print $o "#${ws}define $macro ", $defines->{$macro}, - "\n"; - } - else - { - print $o "/* #${ws}undef $macro */\n"; - } - delete $defines_copy{$macro}; - } - else - { - croak - "undefined symbol: $macro at $config_header line $."; - } - } - else - { - print $o $_; - } - } - close($o); - close($i); - - if ($required && scalar(keys %defines_copy) > 0) - { - croak "unused defines: " . join(' ', keys %defines_copy); - } - } -} - -sub GenerateDefFile -{ - my ($self, $deffile, $txtfile, $libname) = @_; - - if (IsNewer($deffile, $txtfile)) - { - print "Generating $deffile...\n"; - open(my $if, '<', $txtfile) || confess("Could not open $txtfile\n"); - open(my $of, '>', $deffile) || confess("Could not open $deffile\n"); - print $of "LIBRARY $libname\nEXPORTS\n"; - while (<$if>) - { - next if (/^#/); - next if (/^\s*$/); - my ($f, $o) = split; - print $of " $f @ $o\n"; - } - close($of); - close($if); - } - return; -} - -sub AddProject -{ - my ($self, $name, $type, $folder, $initialdir) = @_; - - my $proj = - VSObjectFactory::CreateProject($self->{vcver}, $name, $type, $self); - push @{ $self->{projects}->{$folder} }, $proj; - $proj->AddDir($initialdir) if ($initialdir); - if ($self->{options}->{zlib}) - { - $proj->AddIncludeDir($self->{options}->{zlib} . '\include'); - $proj->AddLibrary($self->{options}->{zlib} . '\lib\zdll.lib'); - } - if ($self->{options}->{openssl}) - { - $proj->AddIncludeDir($self->{options}->{openssl} . '\include'); - my ($digit1, $digit2, $digit3) = $self->GetOpenSSLVersion(); - - # Starting at version 1.1.0 the OpenSSL installers have - # changed their library names from: - # - libeay to libcrypto - # - ssleay to libssl - if ( ($digit1 >= '3' && $digit2 >= '0' && $digit3 >= '0') - || ($digit1 >= '1' && $digit2 >= '1' && $digit3 >= '0')) - { - my $dbgsuffix; - my $libsslpath; - my $libcryptopath; - - # The format name of the libraries is slightly - # different between the Win32 and Win64 platform, so - # adapt. - if (-e "$self->{options}->{openssl}/lib/VC/sslcrypto32MD.lib") - { - # Win32 here, with a debugging library set. - $dbgsuffix = 1; - $libsslpath = '\lib\VC\libssl32.lib'; - $libcryptopath = '\lib\VC\libcrypto32.lib'; - } - elsif (-e "$self->{options}->{openssl}/lib/VC/sslcrypto64MD.lib") - { - # Win64 here, with a debugging library set. - $dbgsuffix = 1; - $libsslpath = '\lib\VC\libssl64.lib'; - $libcryptopath = '\lib\VC\libcrypto64.lib'; - } - else - { - # On both Win32 and Win64 the same library - # names are used without a debugging context. - $dbgsuffix = 0; - $libsslpath = '\lib\libssl.lib'; - $libcryptopath = '\lib\libcrypto.lib'; - } - - $proj->AddLibrary($self->{options}->{openssl} . $libsslpath, - $dbgsuffix); - $proj->AddLibrary($self->{options}->{openssl} . $libcryptopath, - $dbgsuffix); - } - else - { - # Choose which set of libraries to use depending on if - # debugging libraries are in place in the installer. - if (-e "$self->{options}->{openssl}/lib/VC/ssleay32MD.lib") - { - $proj->AddLibrary( - $self->{options}->{openssl} . '\lib\VC\ssleay32.lib', 1); - $proj->AddLibrary( - $self->{options}->{openssl} . '\lib\VC\libeay32.lib', 1); - } - else - { - # We don't expect the config-specific library - # to be here, so don't ask for it in last - # parameter. - $proj->AddLibrary( - $self->{options}->{openssl} . '\lib\ssleay32.lib', 0); - $proj->AddLibrary( - $self->{options}->{openssl} . '\lib\libeay32.lib', 0); - } - } - } - if ($self->{options}->{nls}) - { - $proj->AddIncludeDir($self->{options}->{nls} . '\include'); - $proj->AddLibrary($self->{options}->{nls} . '\lib\libintl.lib'); - } - if ($self->{options}->{gss}) - { - $proj->AddIncludeDir($self->{options}->{gss} . '\include'); - $proj->AddIncludeDir($self->{options}->{gss} . '\include\krb5'); - if ($self->{platform} eq 'Win32') - { - $proj->AddLibrary( - $self->{options}->{gss} . '\lib\i386\krb5_32.lib'); - $proj->AddLibrary( - $self->{options}->{gss} . '\lib\i386\comerr32.lib'); - $proj->AddLibrary( - $self->{options}->{gss} . '\lib\i386\gssapi32.lib'); - } - else - { - $proj->AddLibrary( - $self->{options}->{gss} . '\lib\amd64\krb5_64.lib'); - $proj->AddLibrary( - $self->{options}->{gss} . '\lib\amd64\comerr64.lib'); - $proj->AddLibrary( - $self->{options}->{gss} . '\lib\amd64\gssapi64.lib'); - } - } - if ($self->{options}->{iconv}) - { - $proj->AddIncludeDir($self->{options}->{iconv} . '\include'); - $proj->AddLibrary($self->{options}->{iconv} . '\lib\iconv.lib'); - } - if ($self->{options}->{icu}) - { - $proj->AddIncludeDir($self->{options}->{icu} . '\include'); - if ($self->{platform} eq 'Win32') - { - $proj->AddLibrary($self->{options}->{icu} . '\lib\icuin.lib'); - $proj->AddLibrary($self->{options}->{icu} . '\lib\icuuc.lib'); - $proj->AddLibrary($self->{options}->{icu} . '\lib\icudt.lib'); - } - else - { - $proj->AddLibrary($self->{options}->{icu} . '\lib64\icuin.lib'); - $proj->AddLibrary($self->{options}->{icu} . '\lib64\icuuc.lib'); - $proj->AddLibrary($self->{options}->{icu} . '\lib64\icudt.lib'); - } - } - if ($self->{options}->{xml}) - { - $proj->AddIncludeDir($self->{options}->{xml} . '\include'); - $proj->AddIncludeDir($self->{options}->{xml} . '\include\libxml2'); - $proj->AddLibrary($self->{options}->{xml} . '\lib\libxml2.lib'); - } - if ($self->{options}->{xslt}) - { - $proj->AddIncludeDir($self->{options}->{xslt} . '\include'); - $proj->AddLibrary($self->{options}->{xslt} . '\lib\libxslt.lib'); - } - if ($self->{options}->{lz4}) - { - $proj->AddIncludeDir($self->{options}->{lz4} . '\include'); - $proj->AddLibrary($self->{options}->{lz4} . '\lib\liblz4.lib'); - } - if ($self->{options}->{zstd}) - { - $proj->AddIncludeDir($self->{options}->{zstd} . '\include'); - $proj->AddLibrary($self->{options}->{zstd} . '\lib\libzstd.lib'); - } - if ($self->{options}->{uuid}) - { - $proj->AddIncludeDir($self->{options}->{uuid} . '\include'); - $proj->AddLibrary($self->{options}->{uuid} . '\lib\uuid.lib'); - } - return $proj; -} - -sub Save -{ - my ($self) = @_; - my %flduid; - - $self->GenerateFiles(); - foreach my $fld (keys %{ $self->{projects} }) - { - foreach my $proj (@{ $self->{projects}->{$fld} }) - { - $proj->Save(); - } - } - - open(my $sln, '>', "pgsql.sln") || croak "Could not write to pgsql.sln\n"; - print $sln <{solutionFileVersion} -# $self->{visualStudioName} -EOF - - print $sln $self->GetAdditionalHeaders(); - - foreach my $fld (keys %{ $self->{projects} }) - { - foreach my $proj (@{ $self->{projects}->{$fld} }) - { - print $sln <{name}$proj->{filenameExtension}", "$proj->{guid}" -EndProject -EOF - } - if ($fld ne "") - { - $flduid{$fld} = $^O eq "MSWin32" ? Win32::GuidGen() : 'FAKE'; - print $sln <{platform}= Debug|$self->{platform} - Release|$self->{platform} = Release|$self->{platform} - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution -EOF - - foreach my $fld (keys %{ $self->{projects} }) - { - foreach my $proj (@{ $self->{projects}->{$fld} }) - { - print $sln <{guid}.Debug|$self->{platform}.ActiveCfg = Debug|$self->{platform} - $proj->{guid}.Debug|$self->{platform}.Build.0 = Debug|$self->{platform} - $proj->{guid}.Release|$self->{platform}.ActiveCfg = Release|$self->{platform} - $proj->{guid}.Release|$self->{platform}.Build.0 = Release|$self->{platform} -EOF - } - } - - print $sln <{projects} }) - { - next if ($fld eq ""); - foreach my $proj (@{ $self->{projects}->{$fld} }) - { - print $sln "\t\t$proj->{guid} = $flduid{$fld}\n"; - } - } - - print $sln <{options}->{asserts}); - $cfg .= ' --enable-nls' if ($self->{options}->{nls}); - $cfg .= ' --enable-tap-tests' if ($self->{options}->{tap_tests}); - $cfg .= ' --with-ldap' if ($self->{options}->{ldap}); - $cfg .= ' --without-zlib' unless ($self->{options}->{zlib}); - $cfg .= ' --with-extra-version' if ($self->{options}->{extraver}); - $cfg .= ' --with-ssl=openssl' if ($self->{options}->{openssl}); - $cfg .= ' --with-uuid' if ($self->{options}->{uuid}); - $cfg .= ' --with-libxml' if ($self->{options}->{xml}); - $cfg .= ' --with-libxslt' if ($self->{options}->{xslt}); - $cfg .= ' --with-lz4' if ($self->{options}->{lz4}); - $cfg .= ' --with-zstd' if ($self->{options}->{zstd}); - $cfg .= ' --with-gssapi' if ($self->{options}->{gss}); - $cfg .= ' --with-icu' if ($self->{options}->{icu}); - $cfg .= ' --with-tcl' if ($self->{options}->{tcl}); - $cfg .= ' --with-perl' if ($self->{options}->{perl}); - $cfg .= ' --with-python' if ($self->{options}->{python}); - my $port = $self->{options}->{'--with-pgport'}; - $cfg .= " --with-pgport=$port" if defined($port); - - return $cfg; -} - -package VS2015Solution; - -# -# Package that encapsulates a Visual Studio 2015 solution file -# - -use Carp; -use strict; -use warnings; -use base qw(Solution); - -no warnings qw(redefine); ## no critic - -sub new -{ - my $classname = shift; - my $self = $classname->SUPER::_new(@_); - bless($self, $classname); - - $self->{solutionFileVersion} = '12.00'; - $self->{vcver} = '14.00'; - $self->{visualStudioName} = 'Visual Studio 2015'; - $self->{VisualStudioVersion} = '14.0.24730.2'; - $self->{MinimumVisualStudioVersion} = '10.0.40219.1'; - - return $self; -} - -package VS2017Solution; - -# -# Package that encapsulates a Visual Studio 2017 solution file -# - -use Carp; -use strict; -use warnings; -use base qw(Solution); - -no warnings qw(redefine); ## no critic - -sub new -{ - my $classname = shift; - my $self = $classname->SUPER::_new(@_); - bless($self, $classname); - - $self->{solutionFileVersion} = '12.00'; - $self->{vcver} = '15.00'; - $self->{visualStudioName} = 'Visual Studio 2017'; - $self->{VisualStudioVersion} = '15.0.26730.3'; - $self->{MinimumVisualStudioVersion} = '10.0.40219.1'; - - return $self; -} - -package VS2019Solution; - -# -# Package that encapsulates a Visual Studio 2019 solution file -# - -use Carp; -use strict; -use warnings; -use base qw(Solution); - -no warnings qw(redefine); ## no critic - -sub new -{ - my $classname = shift; - my $self = $classname->SUPER::_new(@_); - bless($self, $classname); - - $self->{solutionFileVersion} = '12.00'; - $self->{vcver} = '16.00'; - $self->{visualStudioName} = 'Visual Studio 2019'; - $self->{VisualStudioVersion} = '16.0.28729.10'; - $self->{MinimumVisualStudioVersion} = '10.0.40219.1'; - - return $self; -} - -package VS2022Solution; - -# -# Package that encapsulates a Visual Studio 2022 solution file -# - -use Carp; -use strict; -use warnings; -use base qw(Solution); - -no warnings qw(redefine); ## no critic - -sub new -{ - my $classname = shift; - my $self = $classname->SUPER::_new(@_); - bless($self, $classname); - - $self->{solutionFileVersion} = '12.00'; - $self->{vcver} = '17.00'; - $self->{visualStudioName} = 'Visual Studio 2022'; - $self->{VisualStudioVersion} = '17.0.31903.59'; - $self->{MinimumVisualStudioVersion} = '10.0.40219.1'; - - return $self; -} - -sub GetAdditionalHeaders -{ - my ($self, $f) = @_; - - return qq|VisualStudioVersion = $self->{VisualStudioVersion} -MinimumVisualStudioVersion = $self->{MinimumVisualStudioVersion} -|; -} - -1; diff --git a/src/tools/msvc/VSObjectFactory.pm b/src/tools/msvc/VSObjectFactory.pm deleted file mode 100644 index 9df2ab4282ae4..0000000000000 --- a/src/tools/msvc/VSObjectFactory.pm +++ /dev/null @@ -1,174 +0,0 @@ - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -package VSObjectFactory; - -# -# Package that creates Visual Studio wrapper objects for msvc build -# -# src/tools/msvc/VSObjectFactory.pm -# - -use Carp; -use strict; -use warnings; - -use Exporter; -use Project; -use Solution; -use MSBuildProject; - -our (@ISA, @EXPORT); -@ISA = qw(Exporter); -@EXPORT = qw(CreateSolution CreateProject DetermineVisualStudioVersion); - -no warnings qw(redefine); ## no critic - -sub CreateSolution -{ - my $visualStudioVersion = shift; - - if (!defined($visualStudioVersion)) - { - $visualStudioVersion = DetermineVisualStudioVersion(); - } - - if ($visualStudioVersion eq '14.00') - { - return new VS2015Solution(@_); - } - - # The version of nmake bundled in Visual Studio 2017 is greater - # than 14.10 and less than 14.20. And the version number is - # actually 15.00. - elsif ( - ($visualStudioVersion ge '14.10' && $visualStudioVersion lt '14.20') - || $visualStudioVersion eq '15.00') - { - return new VS2017Solution(@_); - } - - # The version of nmake bundled in Visual Studio 2019 is greater - # than 14.20 and less than 14.30. And the version number is - # actually 16.00. - elsif ( - ($visualStudioVersion ge '14.20' && $visualStudioVersion lt '14.30') - || $visualStudioVersion eq '16.00') - { - return new VS2019Solution(@_); - } - - # The version of nmake bundled in Visual Studio 2022 is greater - # than 14.30 and less than 14.40. And the version number is - # actually 17.00. - elsif ( - ($visualStudioVersion ge '14.30' && $visualStudioVersion lt '14.40') - || $visualStudioVersion eq '17.00') - { - return new VS2022Solution(@_); - } - else - { - croak - "The requested Visual Studio version $visualStudioVersion is not supported."; - } -} - -sub CreateProject -{ - my $visualStudioVersion = shift; - - if (!defined($visualStudioVersion)) - { - $visualStudioVersion = DetermineVisualStudioVersion(); - } - - if ($visualStudioVersion eq '14.00') - { - return new VC2015Project(@_); - } - - # The version of nmake bundled in Visual Studio 2017 is greater - # than 14.10 and less than 14.20. And the version number is - # actually 15.00. - elsif ( - ($visualStudioVersion ge '14.10' && $visualStudioVersion lt '14.20') - || $visualStudioVersion eq '15.00') - { - return new VC2017Project(@_); - } - - # The version of nmake bundled in Visual Studio 2019 is greater - # than 14.20 and less than 14.30. And the version number is - # actually 16.00. - elsif ( - ($visualStudioVersion ge '14.20' && $visualStudioVersion lt '14.30') - || $visualStudioVersion eq '16.00') - { - return new VC2019Project(@_); - } - - # The version of nmake bundled in Visual Studio 2022 is greater - # than 14.30 and less than 14.40. And the version number is - # actually 17.00. - elsif ( - ($visualStudioVersion ge '14.30' && $visualStudioVersion lt '14.40') - || $visualStudioVersion eq '17.00') - { - return new VC2022Project(@_); - } - else - { - croak - "The requested Visual Studio version $visualStudioVersion is not supported."; - } -} - -sub DetermineVisualStudioVersion -{ - if ($^O eq "MSWin32") - { - # To determine version of Visual Studio we use nmake as it has - # existed for a long time and still exists in current Visual - # Studio versions. - my $output = `nmake /? 2>&1`; - $? >> 8 == 0 - or croak - "Unable to determine Visual Studio version: The nmake command wasn't found."; - if ($output =~ /(\d+)\.(\d+)\.\d+(\.\d+)?/) - { - return _GetVisualStudioVersion($1, $2); - } - - croak - "Unable to determine Visual Studio version: The nmake version could not be determined."; - } - else - { - # fake version - return '17.00'; - } -} - -sub _GetVisualStudioVersion -{ - my ($major, $minor) = @_; - - # The major visual studio that is supported has nmake - # version <= 14.40, so stick with it as the latest version - # if bumping on something even newer. - if ($major >= 14 && $minor >= 40) - { - carp - "The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead."; - return '14.30'; - } - elsif ($major < 12) - { - croak - "Unable to determine Visual Studio version: Visual Studio versions before 12.0 aren't supported."; - } - return "$major.$minor"; -} - -1; diff --git a/src/tools/msvc/build.bat b/src/tools/msvc/build.bat deleted file mode 100755 index 171f7498e2f12..0000000000000 --- a/src/tools/msvc/build.bat +++ /dev/null @@ -1,6 +0,0 @@ -@echo off -REM src/tools/msvc/build.bat -REM all the logic for this now belongs in build.pl. This file really -REM only exists so you don't have to type "perl build.pl" -REM Resist any temptation to add any logic here. -@perl %~dp0/build.pl %* diff --git a/src/tools/msvc/build.pl b/src/tools/msvc/build.pl deleted file mode 100644 index 9853e5c3d83ad..0000000000000 --- a/src/tools/msvc/build.pl +++ /dev/null @@ -1,92 +0,0 @@ -# -*-perl-*- hey - emacs - this is a perl file - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -# -# Script that provides 'make' functionality for msvc builds. -# -# src/tools/msvc/build.pl -# -use strict; -use warnings; - -use FindBin; -use lib $FindBin::RealBin; - -use Cwd; - -use Mkvcbuild; - -sub usage -{ - die( "Usage: build.pl [ [ ] ]\n" - . "Options are case-insensitive.\n" - . " configuration: Release | Debug. This sets the configuration\n" - . " to build. Default is Release.\n" - . " component: name of component to build. An empty value means\n" - . " to build all components.\n"); -} - -chdir('../../..') if (-d '../msvc' && -d '../../../src'); -die 'Must run from root or msvc directory' - unless (-d 'src/tools/msvc' && -d 'src'); - -usage() unless scalar(@ARGV) <= 2; - -# buildenv.pl is for specifying the build environment settings -# it should contain lines like: -# $ENV{PATH} = "c:/path/to/bison/bin;$ENV{PATH}"; - -if (-e "src/tools/msvc/buildenv.pl") -{ - do "./src/tools/msvc/buildenv.pl"; -} -elsif (-e "./buildenv.pl") -{ - do "./buildenv.pl"; -} - -# set up the project -our $config; -do "./src/tools/msvc/config_default.pl"; -do "./src/tools/msvc/config.pl" if (-f "src/tools/msvc/config.pl"); - -my $vcver = Mkvcbuild::mkvcbuild($config); - -# check what sort of build we are doing -my $bconf = $ENV{CONFIG} || "Release"; -my $msbflags = $ENV{MSBFLAGS} || ""; -my $buildwhat = $ARGV[1] || ""; - -if (defined($ARGV[0])) -{ - if (uc($ARGV[0]) eq 'DEBUG') - { - $bconf = "Debug"; - } - elsif (uc($ARGV[0]) ne "RELEASE") - { - $buildwhat = $ARGV[0] || ""; - } -} - -# ... and do it - -if ($buildwhat) -{ - system( - "msbuild $buildwhat.vcxproj /verbosity:normal $msbflags /p:Configuration=$bconf" - ); -} -else -{ - system( - "msbuild pgsql.sln /verbosity:normal $msbflags /p:Configuration=$bconf" - ); -} - -# report status - -my $status = $? >> 8; - -exit $status; diff --git a/src/tools/msvc/clean.bat b/src/tools/msvc/clean.bat deleted file mode 100755 index cf3576460456d..0000000000000 --- a/src/tools/msvc/clean.bat +++ /dev/null @@ -1,156 +0,0 @@ -@echo off -REM src/tools/msvc/clean.bat - -set DIST=0 -if "%1"=="dist" set DIST=1 - -setlocal - -cd "%~dp0\..\..\.." - -if exist debug rd /s /q debug -if exist release rd /s /q release -for %%f in (*.vcproj) do del %%f -for %%f in (*.vcxproj) do del %%f -for %%f in (*.vcxproj.user) do del %%f -if exist pgsql.sln del /q pgsql.sln -if exist pgsql.sln.cache del /q pgsql.sln.cache -if exist pgsql.sdf del /q pgsql.sdf -if exist pgsql.suo del /q /a:H pgsql.suo -del /s /q src\bin\win32ver.rc 2> NUL -del /s /q src\interfaces\win32ver.rc 2> NUL -if exist src\backend\win32ver.rc del /q src\backend\win32ver.rc -if exist src\backend\replication\libpqwalreceiver\win32ver.rc del /q src\backend\replication\libpqwalreceiver\win32ver.rc -if exist src\backend\replication\pgoutput\win32ver.rc del /q src\backend\replication\pgoutput\win32ver.rc -if exist src\backend\snowball\win32ver.rc del /q src\backend\snowball\win32ver.rc -if exist src\interfaces\ecpg\test\win32ver.rc del /q src\interfaces\ecpg\test\win32ver.rc -if exist src\pl\plperl\win32ver.rc del /q src\pl\plperl\win32ver.rc -if exist src\pl\plpgsql\src\win32ver.rc del /q src\pl\plpgsql\src\win32ver.rc -if exist src\pl\plpython\win32ver.rc del /q src\pl\plpython\win32ver.rc -if exist src\pl\tcl\win32ver.rc del /q src\pl\tcl\win32ver.rc -if exist src\test\isolation\win32ver.rc del /q src\test\isolation\win32ver.rc -if exist src\test\regress\win32ver.rc del /q src\test\regress\win32ver.rc -if exist src\timezone\win32ver.rc del /q src\timezone\win32ver.rc - -for /d %%f in (src\interfaces\ecpg\*) do if exist %%f\win32ver.rc del /q %%f\win32ver.rc -for /d %%f in (contrib\*) do if exist %%f\win32ver.rc del /q %%f\win32ver.rc -for /d %%f in (src\backend\utils\mb\conversion_procs\*) do if exist %%f\win32ver.rc del /q %%f\win32ver.rc -for /d %%f in (src\test\modules\*) do if exist %%f\win32ver.rc del /q %%f\win32ver.rc - -REM Delete files created with GenerateFiles() in Solution.pm -if exist src\include\pg_config.h del /q src\include\pg_config.h -if exist src\include\pg_config_ext.h del /q src\include\pg_config_ext.h -if exist src\include\pg_config_os.h del /q src\include\pg_config_os.h -if exist src\include\nodes\nodetags.h del /q src\include\nodes\nodetags.h -if exist src\include\utils\errcodes.h del /q src\include\utils\errcodes.h -if exist src\include\utils\fmgroids.h del /q src\include\utils\fmgroids.h -if exist src\include\utils\fmgrprotos.h del /q src\include\utils\fmgrprotos.h -if exist src\include\storage\lwlocknames.h del /q src\include\storage\lwlocknames.h -if exist src\include\utils\probes.h del /q src\include\utils\probes.h -if exist src\include\catalog\schemapg.h del /q src\include\catalog\schemapg.h -if exist src\include\catalog\system_fk_info.h del /q src\include\catalog\system_fk_info.h -if exist src\include\catalog\pg_*_d.h del /q src\include\catalog\pg_*_d.h -if exist src\include\catalog\header-stamp del /q src\include\catalog\header-stamp -if exist doc\src\sgml\version.sgml del /q doc\src\sgml\version.sgml - -if %DIST%==1 if exist src\backend\utils\fmgroids.h del /q src\backend\utils\fmgroids.h -if %DIST%==1 if exist src\backend\utils\fmgrprotos.h del /q src\backend\utils\fmgrprotos.h -if %DIST%==1 if exist src\backend\utils\fmgrtab.c del /q src\backend\utils\fmgrtab.c -if %DIST%==1 if exist src\backend\utils\fmgr-stamp del /q src\backend\utils\fmgr-stamp -if %DIST%==1 if exist src\backend\utils\errcodes.h del /q src\backend\utils\errcodes.h -if %DIST%==1 if exist src\backend\nodes\node-support-stamp del /q src\backend\nodes\node-support-stamp -if %DIST%==1 for %%F IN (copy equal out queryjumble read) do if exist src\backend\nodes\%%Ffuncs.funcs.c del /q src\backend\nodes\%%Ffuncs.funcs.c -if %DIST%==1 for %%F IN (copy equal out queryjumble read) do if exist src\backend\nodes\%%Ffuncs.switch.c del /q src\backend\nodes\%%Ffuncs.switch.c -if %DIST%==1 if exist src\backend\nodes\nodetags.h del /q src\backend\nodes\nodetags.h -if %DIST%==1 if exist src\backend\storage\lmgr\lwlocknames.c del /q src\backend\storage\lmgr\lwlocknames.c -if %DIST%==1 if exist src\backend\storage\lmgr\lwlocknames.h del /q src\backend\storage\lmgr\lwlocknames.h -if %DIST%==1 if exist src\pl\plpython\spiexceptions.h del /q src\pl\plpython\spiexceptions.h -if %DIST%==1 if exist src\pl\plpgsql\src\plerrcodes.h del /q src\pl\plpgsql\src\plerrcodes.h -if %DIST%==1 if exist src\pl\tcl\pltclerrcodes.h del /q src\pl\tcl\pltclerrcodes.h -if %DIST%==1 if exist src\bin\psql\sql_help.c del /q src\bin\psql\sql_help.c -if %DIST%==1 if exist src\bin\psql\sql_help.h del /q src\bin\psql\sql_help.h -if %DIST%==1 if exist src\common\kwlist_d.h del /q src\common\kwlist_d.h -if %DIST%==1 if exist src\pl\plpgsql\src\pl_reserved_kwlist_d.h del /q src\pl\plpgsql\src\pl_reserved_kwlist_d.h -if %DIST%==1 if exist src\pl\plpgsql\src\pl_unreserved_kwlist_d.h del /q src\pl\plpgsql\src\pl_unreserved_kwlist_d.h -if %DIST%==1 if exist src\interfaces\ecpg\preproc\c_kwlist_d.h del /q src\interfaces\ecpg\preproc\c_kwlist_d.h -if %DIST%==1 if exist src\interfaces\ecpg\preproc\ecpg_kwlist_d.h del /q src\interfaces\ecpg\preproc\ecpg_kwlist_d.h -if %DIST%==1 if exist src\interfaces\ecpg\preproc\preproc.y del /q src\interfaces\ecpg\preproc\preproc.y -if %DIST%==1 if exist src\backend\catalog\postgres.bki del /q src\backend\catalog\postgres.bki -if %DIST%==1 if exist src\backend\catalog\system_constraints.sql del /q src\backend\catalog\system_constraints.sql -if %DIST%==1 if exist src\backend\catalog\schemapg.h del /q src\backend\catalog\schemapg.h -if %DIST%==1 if exist src\backend\catalog\system_fk_info.h del /q src\backend\catalog\system_fk_info.h -if %DIST%==1 if exist src\backend\catalog\pg_*_d.h del /q src\backend\catalog\pg_*_d.h -if %DIST%==1 if exist src\backend\catalog\bki-stamp del /q src\backend\catalog\bki-stamp -if %DIST%==1 if exist src\backend\parser\scan.c del /q src\backend\parser\scan.c -if %DIST%==1 if exist src\backend\parser\gram.c del /q src\backend\parser\gram.c -if %DIST%==1 if exist src\backend\parser\gram.h del /q src\backend\parser\gram.h -if %DIST%==1 if exist src\backend\bootstrap\bootscanner.c del /q src\backend\bootstrap\bootscanner.c -if %DIST%==1 if exist src\backend\bootstrap\bootparse.c del /q src\backend\bootstrap\bootparse.c -if %DIST%==1 if exist src\backend\bootstrap\bootparse.h del /q src\backend\bootstrap\bootparse.h -if %DIST%==1 if exist src\backend\utils\adt\jsonpath_gram.c del /q src\backend\utils\adt\jsonpath_gram.c -if %DIST%==1 if exist src\backend\utils\adt\jsonpath_gram.h del /q src\backend\utils\adt\jsonpath_gram.h -if %DIST%==1 if exist src\backend\utils\adt\jsonpath_scan.c del /q src\backend\utils\adt\jsonpath_scan.c -if %DIST%==1 if exist src\backend\utils\misc\guc-file.c del /q src\backend\utils\misc\guc-file.c -if %DIST%==1 if exist src\backend\replication\repl_scanner.c del /q src\backend\replication\repl_scanner.c -if %DIST%==1 if exist src\backend\replication\repl_gram.c del /q src\backend\replication\repl_gram.c -if %DIST%==1 if exist src\backend\replication\repl_gram.h del /q src\backend\replication\repl_gram.h -if %DIST%==1 if exist src\backend\replication\syncrep_scanner.c del /q src\backend\replication\syncrep_scanner.c -if %DIST%==1 if exist src\backend\replication\syncrep_gram.c del /q src\backend\replication\syncrep_gram.c -if %DIST%==1 if exist src\backend\replication\syncrep_gram.h del /q src\backend\replication\syncrep_gram.h - - -if exist src\interfaces\libpq\libpqdll.def del /q src\interfaces\libpq\libpqdll.def -if exist src\interfaces\ecpg\compatlib\compatlib.def del /q src\interfaces\ecpg\compatlib\compatlib.def -if exist src\interfaces\ecpg\ecpglib\ecpglib.def del /q src\interfaces\ecpg\ecpglib\ecpglib.def -if exist src\interfaces\ecpg\include\ecpg_config.h del /q src\interfaces\ecpg\include\ecpg_config.h -if exist src\interfaces\ecpg\pgtypeslib\pgtypeslib.def del /q src\interfaces\ecpg\pgtypeslib\pgtypeslib.def -if %DIST%==1 if exist src\interfaces\ecpg\preproc\pgc.c del /q src\interfaces\ecpg\preproc\pgc.c -if %DIST%==1 if exist src\interfaces\ecpg\preproc\preproc.c del /q src\interfaces\ecpg\preproc\preproc.c -if %DIST%==1 if exist src\interfaces\ecpg\preproc\preproc.h del /q src\interfaces\ecpg\preproc\preproc.h - -if exist src\port\pg_config_paths.h del /q src\port\pg_config_paths.h - -if exist src\pl\plperl\SPI.c del /q src\pl\plperl\SPI.c -if exist src\pl\plperl\Util.c del /q src\pl\plperl\Util.c -if exist src\pl\plperl\perlchunks.h del /q src\pl\plperl\perlchunks.h -if exist src\pl\plperl\plperl_opmask.h del /q src\pl\plperl\plperl_opmask.h -if %DIST%==1 if exist src\pl\plpgsql\src\pl_gram.c del /q src\pl\plpgsql\src\pl_gram.c -if %DIST%==1 if exist src\pl\plpgsql\src\pl_gram.h del /q src\pl\plpgsql\src\pl_gram.h - -if %DIST%==1 if exist src\fe_utils\psqlscan.c del /q src\fe_utils\psqlscan.c -if %DIST%==1 if exist src\bin\psql\psqlscanslash.c del /q src\bin\psql\psqlscanslash.c -if %DIST%==1 if exist src\bin\pgbench\exprscan.c del /q src\bin\pgbench\exprscan.c -if %DIST%==1 if exist src\bin\pgbench\exprparse.c del /q src\bin\pgbench\exprparse.c -if %DIST%==1 if exist src\bin\pgbench\exprparse.h del /q src\bin\pgbench\exprparse.h - -if %DIST%==1 if exist contrib\cube\cubescan.c del /q contrib\cube\cubescan.c -if %DIST%==1 if exist contrib\cube\cubeparse.c del /q contrib\cube\cubeparse.c -if %DIST%==1 if exist contrib\cube\cubeparse.h del /q contrib\cube\cubeparse.h -if %DIST%==1 if exist contrib\fuzzystrmatch\daitch_mokotoff.h del /q contrib\fuzzystrmatch\daitch_mokotoff.h -if %DIST%==1 if exist contrib\seg\segscan.c del /q contrib\seg\segscan.c -if %DIST%==1 if exist contrib\seg\segparse.c del /q contrib\seg\segparse.c -if %DIST%==1 if exist contrib\seg\segparse.h del /q contrib\seg\segparse.h - -if exist src\test\regress\tmp_check rd /s /q src\test\regress\tmp_check -if exist contrib\spi\refint.dll del /q contrib\spi\refint.dll -if exist contrib\spi\autoinc.dll del /q contrib\spi\autoinc.dll -if exist src\test\regress\regress.dll del /q src\test\regress\regress.dll -if exist src\test\regress\refint.dll del /q src\test\regress\refint.dll -if exist src\test\regress\autoinc.dll del /q src\test\regress\autoinc.dll -if %DIST%==1 if exist src\test\isolation\specscanner.c del /q src\test\isolation\specscanner.c -if %DIST%==1 if exist src\test\isolation\specparse.c del /q src\test\isolation\specparse.c -if %DIST%==1 if exist src\test\isolation\specparse.h del /q src\test\isolation\specparse.h - -for /d %%f in (contrib\* src\bin\* src\test\* src\test\modules\* - ) do if exist %%f\tmp_check rd /s /q %%f\tmp_check - -REM Clean up datafiles built with contrib -REM cd contrib -REM for /r %%f in (*.sql) do if exist %%f.in del %%f - -cd "%~dp0" - -REM Clean up ecpg regression test files -msbuild ecpg_regression.proj /NoLogo /v:q %MSBFLAGS% /t:clean - -goto :eof diff --git a/src/tools/msvc/config_default.pl b/src/tools/msvc/config_default.pl deleted file mode 100644 index 8945e772c2eb1..0000000000000 --- a/src/tools/msvc/config_default.pl +++ /dev/null @@ -1,32 +0,0 @@ - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -# Configuration arguments for vcbuild. -use strict; -use warnings; - -our $config = { - asserts => 0, # --enable-cassert - - # blocksize => 8, # --with-blocksize, 8kB by default - # wal_blocksize => 8, # --with-wal-blocksize, 8kB by default - ldap => 1, # --with-ldap - extraver => undef, # --with-extra-version= - gss => undef, # --with-gssapi= - icu => undef, # --with-icu= - lz4 => undef, # --with-lz4= - zstd => undef, # --with-zstd= - nls => undef, # --enable-nls= - tap_tests => undef, # --enable-tap-tests - tcl => undef, # --with-tcl= - perl => undef, # --with-perl= - python => undef, # --with-python= - openssl => undef, # --with-ssl=openssl with - uuid => undef, # --with-uuid= - xml => undef, # --with-libxml= - xslt => undef, # --with-libxslt= - iconv => undef, # (not in configure, path to iconv) - zlib => undef # --with-zlib= -}; - -1; diff --git a/src/tools/msvc/dummylib/README b/src/tools/msvc/dummylib/README deleted file mode 100644 index 7b63d0ed43545..0000000000000 --- a/src/tools/msvc/dummylib/README +++ /dev/null @@ -1,13 +0,0 @@ - -src/tools/msvc/dummylib - -This directory contains just enough of a dummy library to allow checking of -the programs in src/tools/msvc and src/tools/win32tzlist.pl with -perl -cw, even on machines that lack the Win32 perl infrastructure. - -invoke via: - -PERL5LIB=src/tools/msvc/dummylib perl -cw $file - -This is the only use that should be made of this directory. Attempting actually -running of any programs using this library will result in a lot of grief. diff --git a/src/tools/msvc/dummylib/Win32.pm b/src/tools/msvc/dummylib/Win32.pm deleted file mode 100644 index df2d7a2929cf5..0000000000000 --- a/src/tools/msvc/dummylib/Win32.pm +++ /dev/null @@ -1,7 +0,0 @@ - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -package Win32; -use strict; -use warnings; -1; diff --git a/src/tools/msvc/dummylib/Win32/Registry.pm b/src/tools/msvc/dummylib/Win32/Registry.pm deleted file mode 100644 index e14636eb317d3..0000000000000 --- a/src/tools/msvc/dummylib/Win32/Registry.pm +++ /dev/null @@ -1,16 +0,0 @@ - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -package Win32::Registry; - -use strict; -use warnings; - -use vars qw($HKEY_LOCAL_MACHINE); - -use Exporter (); -our (@EXPORT, @ISA); -@ISA = qw(Exporter); -@EXPORT = qw($HKEY_LOCAL_MACHINE); - -1; diff --git a/src/tools/msvc/dummylib/Win32API/File.pm b/src/tools/msvc/dummylib/Win32API/File.pm deleted file mode 100644 index 7baf34c4e52c6..0000000000000 --- a/src/tools/msvc/dummylib/Win32API/File.pm +++ /dev/null @@ -1,17 +0,0 @@ - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -package Win32API::File; - -use strict; -use warnings; - -use constant { SEM_FAILCRITICALERRORS => 1, SEM_NOGPFAULTERRORBOX => 2 }; -sub SetErrormode { } -use Exporter; -our (@ISA, @EXPORT_OK, %EXPORT_TAGS); -@ISA = qw(Exporter); -@EXPORT_OK = qw(SetErrorMode SEM_FAILCRITICALERRORS SEM_NOGPFAULTERRORBOX); -%EXPORT_TAGS = (SEM_ => [qw(SEM_FAILCRITICALERRORS SEM_NOGPFAULTERRORBOX)]); - -1; diff --git a/src/tools/msvc/ecpg_regression.proj b/src/tools/msvc/ecpg_regression.proj deleted file mode 100644 index ec2760b1f6d16..0000000000000 --- a/src/tools/msvc/ecpg_regression.proj +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - ..\..\interfaces\ecpg\test - Debug - ..\..\..\..\..\$(CONFIG)\ - - - - d - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/tools/msvc/install.bat b/src/tools/msvc/install.bat deleted file mode 100644 index d02b80826b772..0000000000000 --- a/src/tools/msvc/install.bat +++ /dev/null @@ -1,6 +0,0 @@ -@echo off -REM src/tools/msvc/install.bat -REM all the logic for this now belongs in install.pl. This file really -REM only exists so you don't have to type "perl install.pl" -REM Resist any temptation to add any logic here. -@perl %~dp0/install.pl %* diff --git a/src/tools/msvc/install.pl b/src/tools/msvc/install.pl deleted file mode 100755 index 8de7cee90fd05..0000000000000 --- a/src/tools/msvc/install.pl +++ /dev/null @@ -1,39 +0,0 @@ - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -# -# Script that provides 'make install' functionality for msvc builds -# -# src/tools/msvc/install.pl -# -use strict; -use warnings; - -use FindBin; -use lib $FindBin::RealBin; - -use Install qw(Install); - -# buildenv.pl is for specifying the build environment settings -# it should contain lines like: -# $ENV{PATH} = "c:/path/to/bison/bin;$ENV{PATH}"; - -if (-e "src/tools/msvc/buildenv.pl") -{ - do "./src/tools/msvc/buildenv.pl"; -} -elsif (-e "./buildenv.pl") -{ - do "./buildenv.pl"; -} - -my $target = shift || Usage(); -my $insttype = shift; -Install($target, $insttype); - -sub Usage -{ - print "Usage: install.pl [installtype]\n"; - print "installtype: client\n"; - exit(1); -} diff --git a/src/tools/msvc/mkvcbuild.pl b/src/tools/msvc/mkvcbuild.pl deleted file mode 100644 index 7f94b1a6c9236..0000000000000 --- a/src/tools/msvc/mkvcbuild.pl +++ /dev/null @@ -1,31 +0,0 @@ - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -# -# Script that parses Unix style build environment and generates build files -# for building with Visual Studio. -# -# src/tools/msvc/mkvcbuild.pl -# -use strict; -use warnings; - -use FindBin; -use lib $FindBin::RealBin; - -use Mkvcbuild; - -chdir('../../..') if (-d '../msvc' && -d '../../../src'); -die 'Must run from root or msvc directory' - unless (-d 'src/tools/msvc' && -d 'src'); - -die 'Could not find config_default.pl' - unless (-f 'src/tools/msvc/config_default.pl'); -print "Warning: no config.pl found, using default.\n" - unless (-f 'src/tools/msvc/config.pl'); - -our $config; -do './src/tools/msvc/config_default.pl'; -do './src/tools/msvc/config.pl' if (-f 'src/tools/msvc/config.pl'); - -Mkvcbuild::mkvcbuild($config); diff --git a/src/tools/msvc/pgbison.bat b/src/tools/msvc/pgbison.bat deleted file mode 100755 index dc8ac4a2cf2fb..0000000000000 --- a/src/tools/msvc/pgbison.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off - -REM src/tools/msvc/pgbison.bat -REM all the logic for this now belongs in pgbison.pl. This file really -REM only exists so you don't have to type "perl src/tools/msvc/pgbison.pl" -REM Resist any temptation to add any logic here. -@perl %~dp0/pgbison.pl %* diff --git a/src/tools/msvc/pgbison.pl b/src/tools/msvc/pgbison.pl deleted file mode 100644 index 25df6699b5e7e..0000000000000 --- a/src/tools/msvc/pgbison.pl +++ /dev/null @@ -1,55 +0,0 @@ -# -*-perl-*- hey - emacs - this is a perl file - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -# src/tools/msvc/pgbison.pl - -use strict; -use warnings; - -use File::Basename; - -# assume we are in the postgres source root - -do './src/tools/msvc/buildenv.pl' if -e 'src/tools/msvc/buildenv.pl'; - -my ($bisonver) = `bison -V`; # grab first line -$bisonver = (split(/\s+/, $bisonver))[3]; # grab version number - -unless ($bisonver ge '2.3') -{ - print "WARNING! Bison install not found, or unsupported Bison version.\n"; - print "echo Attempting to build without.\n"; - exit 0; -} - -my $input = shift; -if ($input !~ /\.y$/) -{ - print "Input must be a .y file\n"; - exit 1; -} -elsif (!-e $input) -{ - print "Input file $input not found\n"; - exit 1; -} - -(my $output = $input) =~ s/\.y$/.c/; - -# plpgsql just has to be different -$output =~ s/gram\.c$/pl_gram.c/ if $input =~ /src.pl.plpgsql.src.gram\.y$/; - -my $makefile = dirname($input) . "/Makefile"; -my ($mf, $make); -open($mf, '<', $makefile); -local $/ = undef; -$make = <$mf>; -close($mf); -my $basetarg = basename($output); -my $headerflag = ($make =~ /^$basetarg:\s+BISONFLAGS\b.*-d/m ? '-d' : ''); - -my $nodep = $bisonver ge '3.0' ? "-Wno-deprecated" : ""; - -system("bison $nodep $headerflag $input -o $output"); -exit $? >> 8; diff --git a/src/tools/msvc/pgflex.bat b/src/tools/msvc/pgflex.bat deleted file mode 100755 index f20834ba9b118..0000000000000 --- a/src/tools/msvc/pgflex.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off - -REM src/tools/msvc/pgflex.bat -REM all the logic for this now belongs in pgflex.pl. This file really -REM only exists so you don't have to type "perl src/tools/msvc/pgflex.pl" -REM Resist any temptation to add any logic here. -@perl %~dp0/pgflex.pl %* diff --git a/src/tools/msvc/pgflex.pl b/src/tools/msvc/pgflex.pl deleted file mode 100644 index c308a08b55f37..0000000000000 --- a/src/tools/msvc/pgflex.pl +++ /dev/null @@ -1,108 +0,0 @@ -# -*-perl-*- hey - emacs - this is a perl file - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -# src/tools/msvc/pgflex.pl - -use strict; -use warnings; - -use File::Basename; - -# silence flex bleatings about file path style -$ENV{CYGWIN} = 'nodosfilewarning'; - -# assume we are in the postgres source root - -do './src/tools/msvc/buildenv.pl' if -e 'src/tools/msvc/buildenv.pl'; - -my ($flexver) = `flex -V`; # grab first line -$flexver = (split(/\s+/, $flexver))[1]; -$flexver =~ s/[^0-9.]//g; -my @verparts = split(/\./, $flexver); -unless ($verparts[0] == 2 - && ($verparts[1] > 5 || ($verparts[1] == 5 && $verparts[2] >= 35))) -{ - print "WARNING! Flex install not found, or unsupported Flex version.\n"; - print "echo Attempting to build without.\n"; - exit 0; -} - -my $input = shift; -if ($input !~ /\.l$/) -{ - print "Input must be a .l file\n"; - exit 1; -} -elsif (!-e $input) -{ - print "Input file $input not found\n"; - exit 1; -} - -(my $output = $input) =~ s/\.l$/.c/; - -# get flex flags from make file -my $makefile = dirname($input) . "/Makefile"; -my ($mf, $make); -open($mf, '<', $makefile); -local $/ = undef; -$make = <$mf>; -close($mf); -my $basetarg = basename($output); -my $flexflags = ($make =~ /^$basetarg:\s*FLEXFLAGS\s*=\s*(\S.*)/m ? $1 : ''); - -system("flex $flexflags -o$output $input"); -if ($? == 0) -{ - - # Check for "%option reentrant" in .l file. - my $lfile; - open($lfile, '<', $input) || die "opening $input for reading: $!"; - my $lcode = <$lfile>; - close($lfile); - if ($lcode =~ /\%option\sreentrant/) - { - - # Reentrant scanners usually need a fix to prevent - # "unused variable" warnings with older flex versions. - system("perl src\\tools\\fix-old-flex-code.pl $output"); - } - else - { - - # For non-reentrant scanners we need to fix up the yywrap - # macro definition to keep the MS compiler happy. - # For reentrant scanners (like the core scanner) we do not - # need to (and must not) change the yywrap definition. - my $cfile; - open($cfile, '<', $output) || die "opening $output for reading: $!"; - my $ccode = <$cfile>; - close($cfile); - $ccode =~ s/yywrap\(n\)/yywrap()/; - open($cfile, '>', $output) || die "opening $output for writing: $!"; - print $cfile $ccode; - close($cfile); - } - if ($flexflags =~ /\s-b\s/) - { - my $lexback = "lex.backup"; - open($lfile, '<', $lexback) || die "opening $lexback for reading: $!"; - my $lexbacklines = <$lfile>; - close($lfile); - my $linecount = $lexbacklines =~ tr /\n/\n/; - if ($linecount != 1) - { - print "Scanner requires backup, see lex.backup.\n"; - exit 1; - } - unlink $lexback; - } - - exit 0; - -} -else -{ - exit $? >> 8; -} diff --git a/src/tools/msvc/vcregress.bat b/src/tools/msvc/vcregress.bat deleted file mode 100644 index 7fba45c1e77c5..0000000000000 --- a/src/tools/msvc/vcregress.bat +++ /dev/null @@ -1,6 +0,0 @@ -@echo off -REM src/tools/msvc/vcregress.bat -REM all the logic for this now belongs in vcregress.pl. This file really -REM only exists so you don't have to type "perl vcregress.pl" -REM Resist any temptation to add any logic here. -@perl %~dp0/vcregress.pl %* diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl deleted file mode 100644 index 78170d105d2c9..0000000000000 --- a/src/tools/msvc/vcregress.pl +++ /dev/null @@ -1,664 +0,0 @@ -# -*-perl-*- hey - emacs - this is a perl file - -# Copyright (c) 2021-2023, PostgreSQL Global Development Group - -# src/tools/msvc/vcregress.pl - -use strict; -use warnings; - -our $config; - -use Cwd; -use File::Basename; -use File::Copy; -use File::Find (); -use File::Path qw(rmtree); -use File::Spec qw(devnull); - -use FindBin; -use lib $FindBin::RealBin; - -use Install qw(Install); - -my $startdir = getcwd(); - -chdir "../../.." if (-d "../../../src/tools/msvc"); - -my $topdir = getcwd(); -my $tmp_installdir = "$topdir/tmp_install"; - -do './src/tools/msvc/config_default.pl'; -do './src/tools/msvc/config.pl' if (-f 'src/tools/msvc/config.pl'); - -my $devnull = File::Spec->devnull; - -# These values are defaults that can be overridden by the calling environment -# (see buildenv.pl processing below). We assume that the ones listed here -# always exist by default. Other values may optionally be set for bincheck -# or taptest, see set_command_env() below. -# c.f. src/Makefile.global.in and configure.ac -$ENV{TAR} ||= 'tar'; - -# buildenv.pl is for specifying the build environment settings -# it should contain lines like: -# $ENV{PATH} = "c:/path/to/bison/bin;$ENV{PATH}"; - -if (-e "src/tools/msvc/buildenv.pl") -{ - do "./src/tools/msvc/buildenv.pl"; -} - -my $what = shift || ""; -if ($what =~ - /^(check|installcheck|plcheck|contribcheck|modulescheck|ecpgcheck|isolationcheck|upgradecheck|bincheck|recoverycheck|taptest)$/i - ) -{ - $what = uc $what; -} -else -{ - usage(); -} - -# use a capital C here because config.pl has $config -my $Config = -e "release/postgres/postgres.exe" ? "Release" : "Debug"; - -copy("$Config/refint/refint.dll", "src/test/regress"); -copy("$Config/autoinc/autoinc.dll", "src/test/regress"); -copy("$Config/regress/regress.dll", "src/test/regress"); -copy("$Config/dummy_seclabel/dummy_seclabel.dll", "src/test/regress"); - -# Configuration settings used by TAP tests -$ENV{with_ssl} = $config->{openssl} ? 'openssl' : 'no'; -$ENV{with_ldap} = $config->{ldap} ? 'yes' : 'no'; -$ENV{with_icu} = $config->{icu} ? 'yes' : 'no'; -$ENV{with_gssapi} = $config->{gss} ? 'yes' : 'no'; -$ENV{with_krb_srvnam} = $config->{krb_srvnam} || 'postgres'; -$ENV{with_readline} = 'no'; - -$ENV{PATH} = "$topdir/$Config/libpq;$ENV{PATH}"; - -if ($ENV{PERL5LIB}) -{ - $ENV{PERL5LIB} = "$topdir/src/tools/msvc;$ENV{PERL5LIB}"; -} -else -{ - $ENV{PERL5LIB} = "$topdir/src/tools/msvc"; -} - -my $maxconn = ""; -$maxconn = "--max-connections=$ENV{MAX_CONNECTIONS}" - if $ENV{MAX_CONNECTIONS}; - -my $temp_config = ""; -$temp_config = "--temp-config=\"$ENV{TEMP_CONFIG}\"" - if $ENV{TEMP_CONFIG}; - -chdir "src/test/regress"; - -my %command = ( - CHECK => \&check, - PLCHECK => \&plcheck, - INSTALLCHECK => \&installcheck, - ECPGCHECK => \&ecpgcheck, - CONTRIBCHECK => \&contribcheck, - MODULESCHECK => \&modulescheck, - ISOLATIONCHECK => \&isolationcheck, - BINCHECK => \&bincheck, - RECOVERYCHECK => \&recoverycheck, - UPGRADECHECK => \&upgradecheck, # no-op - TAPTEST => \&taptest,); - -my $proc = $command{$what}; - -exit 3 unless $proc; - -&$proc(@ARGV); - -exit 0; - -######################################################################## - -# Helper function for set_command_env, to set one environment command. -sub set_single_env -{ - my $envname = shift; - my $envdefault = shift; - - # If a command is defined by the environment, just use it. - return if (defined($ENV{$envname})); - - # Nothing is defined, so attempt to assign a default. The command - # may not be in the current environment, hence check if it can be - # executed. - my $rc = system("$envdefault --version >$devnull 2>&1"); - - # Set the environment to the default if it exists, else leave it. - $ENV{$envname} = $envdefault if $rc == 0; - return; -} - -# Set environment values for various command types. These can be used -# in the TAP tests. -sub set_command_env -{ - set_single_env('GZIP_PROGRAM', 'gzip'); - set_single_env('LZ4', 'lz4'); - set_single_env('OPENSSL', 'openssl'); - set_single_env('ZSTD', 'zstd'); -} - -sub installcheck_internal -{ - my ($schedule, @EXTRA_REGRESS_OPTS) = @_; - # for backwards compatibility, "serial" runs the tests in - # parallel_schedule one by one. - my $maxconn = $maxconn; - $maxconn = "--max-connections=1" if $schedule eq 'serial'; - $schedule = 'parallel' if $schedule eq 'serial'; - - my @args = ( - "../../../$Config/pg_regress/pg_regress", - "--dlpath=.", - "--bindir=../../../$Config/psql", - "--schedule=${schedule}_schedule", - "--max-concurrent-tests=20"); - push(@args, $maxconn) if $maxconn; - push(@args, @EXTRA_REGRESS_OPTS); - system(@args); - my $status = $? >> 8; - exit $status if $status; - return; -} - -sub installcheck -{ - my $schedule = shift || 'serial'; - installcheck_internal($schedule); - return; -} - -sub check -{ - my $schedule = shift || 'parallel'; - my $encoding = $ENV{ENCODING} || "SQL_ASCII"; - # for backwards compatibility, "serial" runs the tests in - # parallel_schedule one by one. - my $maxconn = $maxconn; - $maxconn = "--max-connections=1" if $schedule eq 'serial'; - $schedule = 'parallel' if $schedule eq 'serial'; - - InstallTemp(); - chdir "${topdir}/src/test/regress"; - my @args = ( - "../../../$Config/pg_regress/pg_regress", - "--dlpath=.", - "--bindir=", - "--schedule=${schedule}_schedule", - "--max-concurrent-tests=20", - "--encoding=${encoding}", - "--no-locale", - "--temp-instance=./tmp_check"); - push(@args, $maxconn) if $maxconn; - push(@args, $temp_config) if $temp_config; - system(@args); - my $status = $? >> 8; - exit $status if $status; - return; -} - -sub ecpgcheck -{ - my $msbflags = $ENV{MSBFLAGS} || ""; - chdir $startdir; - system("msbuild ecpg_regression.proj $msbflags /p:config=$Config"); - my $status = $? >> 8; - exit $status if $status; - InstallTemp(); - chdir "$topdir/src/interfaces/ecpg/test"; - my $schedule = "ecpg"; - my @args = ( - "../../../../$Config/pg_regress_ecpg/pg_regress_ecpg", - "--bindir=", - "--dbname=ecpg1_regression,ecpg2_regression", - "--create-role=regress_ecpg_user1,regress_ecpg_user2", - "--schedule=${schedule}_schedule", - "--encoding=SQL_ASCII", - "--no-locale", - "--temp-instance=./tmp_chk"); - push(@args, $maxconn) if $maxconn; - system(@args); - $status = $? >> 8; - exit $status if $status; - return; -} - -sub isolationcheck -{ - chdir "../isolation"; - copy("../../../$Config/isolationtester/isolationtester.exe", - "../../../$Config/pg_isolation_regress"); - my @args = ( - "../../../$Config/pg_isolation_regress/pg_isolation_regress", - "--bindir=../../../$Config/psql", - "--inputdir=.", - "--schedule=./isolation_schedule"); - push(@args, $maxconn) if $maxconn; - system(@args); - my $status = $? >> 8; - exit $status if $status; - return; -} - -sub tap_check -{ - die "Tap tests not enabled in configuration" - unless $config->{tap_tests}; - - my @flags; - foreach my $arg (0 .. scalar(@_) - 1) - { - next unless $_[$arg] =~ /^PROVE_FLAGS=(.*)/; - @flags = split(/\s+/, $1); - splice(@_, $arg, 1); - last; - } - - my $dir = shift; - chdir $dir; - - # Fetch and adjust PROVE_TESTS, applying glob() to each element - # defined to build a list of all the tests matching patterns. - my $prove_tests_val = $ENV{PROVE_TESTS} || "t/*.pl"; - my @prove_tests_array = split(/\s+/, $prove_tests_val); - my @prove_tests = (); - foreach (@prove_tests_array) - { - push(@prove_tests, glob($_)); - } - - # Fetch and adjust PROVE_FLAGS, handling multiple arguments. - my $prove_flags_val = $ENV{PROVE_FLAGS} || ""; - my @prove_flags = split(/\s+/, $prove_flags_val); - - my @args = ("prove", @flags, @prove_tests, @prove_flags); - - # adjust the environment for just this test - local %ENV = %ENV; - $ENV{PERL5LIB} = "$topdir/src/test/perl;$ENV{PERL5LIB}"; - $ENV{PG_REGRESS} = "$topdir/$Config/pg_regress/pg_regress"; - $ENV{REGRESS_SHLIB} = "$topdir/src/test/regress/regress.dll"; - - $ENV{TESTDATADIR} = "$dir/tmp_check"; - $ENV{TESTLOGDIR} = "$dir/tmp_check/log"; - - my $module = basename $dir; - # add the module build dir as the second element in the PATH - $ENV{PATH} =~ s!;!;$topdir/$Config/$module;!; - - rmtree('tmp_check'); - system(@args); - my $status = $? >> 8; - return $status; -} - -sub bincheck -{ - InstallTemp(); - - set_command_env(); - - my $mstat = 0; - - # Find out all the existing TAP tests by looking for t/ directories - # in the tree. - my @bin_dirs = glob("$topdir/src/bin/*"); - - # Process each test - foreach my $dir (@bin_dirs) - { - next unless -d "$dir/t"; - - my $status = tap_check($dir); - $mstat ||= $status; - } - exit $mstat if $mstat; - return; -} - -sub taptest -{ - my $dir = shift; - my @args; - - if ($dir =~ /^PROVE_FLAGS=/) - { - push(@args, $dir); - $dir = shift; - } - - die "no tests found!" unless -d "$topdir/$dir/t"; - - push(@args, "$topdir/$dir"); - - InstallTemp(); - - set_command_env(); - - my $status = tap_check(@args); - exit $status if $status; - return; -} - -sub plcheck -{ - chdir "$topdir/src/pl"; - - foreach my $dir (glob("*/src *")) - { - next unless -d "$dir/sql" && -d "$dir/expected"; - my $lang; - if ($dir eq 'plpgsql/src') - { - $lang = 'plpgsql'; - } - elsif ($dir eq 'tcl') - { - $lang = 'pltcl'; - } - else - { - $lang = $dir; - } - if ($lang eq 'plpython') - { - next - unless -d "$topdir/$Config/plpython3"; - $lang = 'plpythonu'; - } - else - { - next unless -d "$topdir/$Config/$lang"; - } - my @lang_args = ("--load-extension=$lang"); - chdir $dir; - my @tests = fetchTests(); - if ($lang eq 'plperl') - { - - # plperl tests will install the extensions themselves - @lang_args = (); - - # assume we're using this perl to built postgres - # test if we can run two interpreters in one backend, and if so - # run the trusted/untrusted interaction tests - use Config; - if ($Config{usemultiplicity} eq 'define') - { - push(@tests, 'plperl_plperlu'); - } - } - elsif ($lang eq 'plpythonu' && -d "$topdir/$Config/plpython3") - { - @lang_args = (); - } - - # Move on if no tests are listed. - next if (scalar @tests == 0); - - print - "============================================================\n"; - print "Checking $lang\n"; - my @args = ( - "$topdir/$Config/pg_regress/pg_regress", - "--bindir=$topdir/$Config/psql", - "--dbname=pl_regression", @lang_args, @tests); - system(@args); - my $status = $? >> 8; - exit $status if $status; - chdir "$topdir/src/pl"; - } - - chdir "$topdir"; - return; -} - -sub subdircheck -{ - my $module = shift; - - if ( !-d "$module/sql" - || !-d "$module/expected" - || (!-f "$module/GNUmakefile" && !-f "$module/Makefile")) - { - return; - } - - chdir $module; - my @tests = fetchTests(); - - # Leave if no tests are listed in the module. - if (scalar @tests == 0) - { - chdir ".."; - return; - } - - my @opts = fetchRegressOpts(); - - print "============================================================\n"; - print "Checking $module\n"; - my @args = ( - "$topdir/$Config/pg_regress/pg_regress", - "--bindir=${topdir}/${Config}/psql", - "--dbname=contrib_regression", @opts, @tests); - print join(' ', @args), "\n"; - system(@args); - chdir ".."; - return; -} - -sub contribcheck -{ - chdir "../../../contrib"; - my $mstat = 0; - foreach my $module (glob("*")) - { - # these configuration-based exclusions must match Install.pm - next if ($module eq "uuid-ossp" && !defined($config->{uuid})); - next if ($module eq "sslinfo" && !defined($config->{openssl})); - next if ($module eq "pgcrypto" && !defined($config->{openssl})); - next if ($module eq "xml2" && !defined($config->{xml})); - next if ($module =~ /_plperl$/ && !defined($config->{perl})); - next if ($module =~ /_plpython$/ && !defined($config->{python})); - next if ($module eq "sepgsql"); - - subdircheck($module); - my $status = $? >> 8; - $mstat ||= $status; - } - exit $mstat if $mstat; - return; -} - -sub modulescheck -{ - chdir "../../../src/test/modules"; - my $mstat = 0; - foreach my $module (glob("*")) - { - subdircheck($module); - my $status = $? >> 8; - $mstat ||= $status; - } - exit $mstat if $mstat; - return; -} - -sub recoverycheck -{ - InstallTemp(); - - my $dir = "$topdir/src/test/recovery"; - my $status = tap_check($dir); - exit $status if $status; - return; -} - -# Run "initdb", then reconfigure authentication. -sub standard_initdb -{ - return ( - system('initdb', '-N') == 0 and system( - "$topdir/$Config/pg_regress/pg_regress", '--config-auth', - $ENV{PGDATA}) == 0); -} - -# This is similar to appendShellString(). Perl system(@args) bypasses -# cmd.exe, so omit the caret escape layer. -sub quote_system_arg -{ - my $arg = shift; - - # Change N >= 0 backslashes before a double quote to 2N+1 backslashes. - $arg =~ s/(\\*)"/${\($1 . $1)}\\"/gs; - - # Change N >= 1 backslashes at end of argument to 2N backslashes. - $arg =~ s/(\\+)$/${\($1 . $1)}/gs; - - # Wrap the whole thing in unescaped double quotes. - return "\"$arg\""; -} - -sub upgradecheck -{ - # pg_upgrade is now handled by bincheck, but keep this target for - # backward compatibility. - print "upgradecheck is a no-op, use bincheck instead.\n"; - return; -} - -sub fetchRegressOpts -{ - my $handle; - open($handle, '<', "GNUmakefile") - || open($handle, '<', "Makefile") - || die "Could not open Makefile"; - local ($/) = undef; - my $m = <$handle>; - close($handle); - my @opts; - - $m =~ s{\\\r?\n}{}g; - if ($m =~ /^\s*REGRESS_OPTS\s*\+?=(.*)/m) - { - - # Substitute known Makefile variables, then ignore options that retain - # an unhandled variable reference. Ignore anything that isn't an - # option starting with "--". - @opts = grep { !/\$\(/ && /^--/ } - map { (my $x = $_) =~ s/\Q$(top_builddir)\E/\"$topdir\"/; $x; } - split(/\s+/, $1); - } - if ($m =~ /^\s*ENCODING\s*=\s*(\S+)/m) - { - push @opts, "--encoding=$1"; - } - if ($m =~ /^\s*NO_LOCALE\s*=\s*\S+/m) - { - push @opts, "--no-locale"; - } - return @opts; -} - -# Fetch the list of tests by parsing a module's Makefile. An empty -# list is returned if the module does not need to run anything. -sub fetchTests -{ - my $handle; - open($handle, '<', "GNUmakefile") - || open($handle, '<', "Makefile") - || die "Could not open Makefile"; - local ($/) = undef; - my $m = <$handle>; - close($handle); - my $t = ""; - - $m =~ s{\\\r?\n}{}g; - - # A module specifying NO_INSTALLCHECK does not support installcheck, - # so bypass its run by returning an empty set of tests. - if ($m =~ /^\s*NO_INSTALLCHECK\s*=\s*\S+/m) - { - return (); - } - - if ($m =~ /^REGRESS\s*=\s*(.*)$/gm) - { - $t = $1; - $t =~ s/\s+/ /g; - - if ($m =~ /contrib\/pgcrypto/) - { - - # pgcrypto is special since some tests depend on the - # configuration of the build - - my $pgptests = - $config->{zlib} - ? GetTests("ZLIB_TST", $m) - : GetTests("ZLIB_OFF_TST", $m); - $t =~ s/\$\(CF_PGP_TESTS\)/$pgptests/; - } - } - - return split(/\s+/, $t); -} - -sub GetTests -{ - my $testname = shift; - my $m = shift; - if ($m =~ /^$testname\s*=\s*(.*)$/gm) - { - return $1; - } - return ""; -} - -sub InstallTemp -{ - unless ($ENV{NO_TEMP_INSTALL}) - { - print "Setting up temp install\n\n"; - Install("$tmp_installdir", "all", $config); - } - $ENV{PATH} = "$tmp_installdir/bin;$ENV{PATH}"; - return; -} - -sub usage -{ - print STDERR - "Usage: vcregress.pl []\n\n", - "Options for :\n", - " bincheck run tests of utilities in src/bin/\n", - " check deploy instance and run regression tests on it\n", - " contribcheck run tests of modules in contrib/\n", - " ecpgcheck run regression tests of ECPG\n", - " installcheck run regression tests on existing instance\n", - " isolationcheck run isolation tests\n", - " modulescheck run tests of modules in src/test/modules/\n", - " plcheck run tests of PL languages\n", - " recoverycheck run recovery test suite\n", - " taptest run an arbitrary TAP test set\n", - " upgradecheck run tests of pg_upgrade (no-op)\n", - "\nOptions for : (used by check and installcheck)\n", - " serial serial mode\n", - " parallel parallel mode\n", - "\nOption for : for taptest\n", - " TEST_DIR (required) directory where tests reside\n"; - exit(1); -} diff --git a/src/tools/msvc/gendef.pl b/src/tools/msvc_gendef.pl similarity index 94% rename from src/tools/msvc/gendef.pl rename to src/tools/msvc_gendef.pl index cf83d7d056e06..404076dbbc39f 100644 --- a/src/tools/msvc/gendef.pl +++ b/src/tools/msvc_gendef.pl @@ -1,8 +1,8 @@ -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use List::Util qw(min); use Getopt::Long; @@ -11,7 +11,7 @@ # # Script that generates a .DEF file for all objects in a directory # -# src/tools/msvc/gendef.pl +# src/tools/msvc_gendef.pl # # Given a symbol file path, loops over its contents @@ -142,7 +142,7 @@ sub writedef sub usage { - die("Usage: gendef.pl --arch --deffile --tempdir files-or-directories\n" + die("Usage: msvc_gendef.pl --arch --deffile --tempdir files-or-directories\n" . " arch: x86 | x86_64\n" . " deffile: path of the generated file\n" . " tempdir: directory for temporary files\n" @@ -195,8 +195,8 @@ sub usage my $cmd = "dumpbin /nologo /symbols /out:$tmpfile " . join(' ', @files); -system($cmd) && die "Could not call dumpbin"; -rename($tmpfile, $symfile); +system($cmd) == 0 or die "Could not call dumpbin"; +rename($tmpfile, $symfile) or die $!; extract_syms($symfile, \%def); print "\n"; diff --git a/src/tools/perlcheck/perlcriticrc b/src/tools/perlcheck/perlcriticrc index 49ac9ee52b5cd..4739e9f4f1810 100644 --- a/src/tools/perlcheck/perlcriticrc +++ b/src/tools/perlcheck/perlcriticrc @@ -29,3 +29,11 @@ severity = 5 [BuiltinFunctions::ProhibitVoidMap] severity = 5 + +# Require checking return value of system calls. The excluded ones +# are currently consistently checked, but more checking could be +# added. +[InputOutput::RequireCheckedSyscalls] +severity = 5 +functions = :builtins +exclude_functions = binmode chdir close closedir kill mkdir print rmdir setsockopt sleep truncate umask unlink waitpid diff --git a/src/tools/perlcheck/pgperlsyncheck b/src/tools/perlcheck/pgperlsyncheck index da59c9727c07b..657d2afcc026d 100755 --- a/src/tools/perlcheck/pgperlsyncheck +++ b/src/tools/perlcheck/pgperlsyncheck @@ -2,7 +2,7 @@ # script to detect compile time errors and warnings in all perl files -INCLUDES="-I src/tools/msvc -I src/tools/msvc/dummylib -I src/backend/catalog" +INCLUDES="-I src/backend/catalog" INCLUDES="-I src/test/perl -I src/backend/utils/mb/Unicode $INCLUDES" INCLUDES="-I src/bin/pg_rewind -I src/test/ssl/t $INCLUDES" diff --git a/src/tools/pg_bsd_indent/Makefile b/src/tools/pg_bsd_indent/Makefile index d176ceb326e52..d922013e40bb5 100644 --- a/src/tools/pg_bsd_indent/Makefile +++ b/src/tools/pg_bsd_indent/Makefile @@ -2,7 +2,7 @@ # # src/tools/pg_bsd_indent/Makefile # -# Copyright (c) 2017-2023, PostgreSQL Global Development Group +# Copyright (c) 2017-2024, PostgreSQL Global Development Group # #------------------------------------------------------------------------- @@ -39,7 +39,7 @@ installdirs: uninstall: rm -f '$(DESTDIR)$(bindir)/pg_bsd_indent$(X)' -clean distclean maintainer-clean: +clean distclean: rm -f pg_bsd_indent$(X) $(OBJS) rm -rf log/ tmp_check/ diff --git a/src/tools/pg_bsd_indent/args.c b/src/tools/pg_bsd_indent/args.c index 38eaa5a5bf28c..5fa7e6b038cc7 100644 --- a/src/tools/pg_bsd_indent/args.c +++ b/src/tools/pg_bsd_indent/args.c @@ -68,7 +68,7 @@ static char sccsid[] = "@(#)args.c 8.1 (Berkeley) 6/6/93"; #define STDIN 3 /* use stdin */ #define KEY 4 /* type (keyword) */ -static void scan_profile(FILE *); +static void scan_profile(FILE *f); #define KEY_FILE 5 /* only used for args */ #define VERSION 6 /* only used for args */ diff --git a/src/tools/pg_bsd_indent/indent.c b/src/tools/pg_bsd_indent/indent.c index 2fd8771083432..2622cc6227af0 100644 --- a/src/tools/pg_bsd_indent/indent.c +++ b/src/tools/pg_bsd_indent/indent.c @@ -54,7 +54,7 @@ static char sccsid[] = "@(#)indent.c 5.17 (Berkeley) 6/7/93"; #include "indent.h" static void bakcopy(void); -static void indent_declaration(int, int); +static void indent_declaration(int cur_dec_ind, int tabs_to_var); const char *in_name = "Standard Input"; /* will always point to name of input * file */ @@ -608,7 +608,7 @@ main(int argc, char **argv) parse(hd_type); /* let parser worry about if, or whatever */ } - ps.search_brace = btype_2; /* this should insure that constructs + ps.search_brace = btype_2; /* this should ensure that constructs * such as main(){...} and int[]{...} * have their braces put in the right * place */ diff --git a/src/tools/pg_bsd_indent/meson.build b/src/tools/pg_bsd_indent/meson.build index 5545c097bf69c..4387c47740ea6 100644 --- a/src/tools/pg_bsd_indent/meson.build +++ b/src/tools/pg_bsd_indent/meson.build @@ -1,4 +1,4 @@ -# Copyright (c) 2022-2023, PostgreSQL Global Development Group +# Copyright (c) 2022-2024, PostgreSQL Global Development Group pg_bsd_indent_sources = files( 'args.c', diff --git a/src/tools/pg_bsd_indent/t/001_pg_bsd_indent.pl b/src/tools/pg_bsd_indent/t/001_pg_bsd_indent.pl index 0032fdd753496..d23722a0e008a 100644 --- a/src/tools/pg_bsd_indent/t/001_pg_bsd_indent.pl +++ b/src/tools/pg_bsd_indent/t/001_pg_bsd_indent.pl @@ -1,10 +1,10 @@ # pg_bsd_indent: some simple tests # The test cases come from FreeBSD upstream, but this test scaffolding is ours. -# Copyright (c) 2017-2023, PostgreSQL Global Development Group +# Copyright (c) 2017-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use Cwd qw(getcwd); use File::Copy "cp"; @@ -24,7 +24,11 @@ # Run pg_bsd_indent on pre-fab test cases. # Any diffs in the generated files will be accumulated here. -my $diff_file = "tests.diff"; +my $diffs_file = "test.diffs"; + +# options used with diff (see pg_regress.c's pretty_diff_opts) +my @diffopts = ("-U3"); +push(@diffopts, "--strip-trailing-cr") if $windows_os; # Copy support files to current dir, so *.pro files don't need to know path. while (my $file = glob("$src_dir/tests/*.list")) @@ -44,9 +48,9 @@ "$test.out", "-P$src_dir/tests/$test.pro" ], "pg_bsd_indent succeeds on $test"); - # check result matches, adding any diff to $diff_file - my $result = run_log([ 'diff', '-upd', "$test_src.stdout", "$test.out" ], - '>>', $diff_file); + # check result matches, adding any diff to $diffs_file + my $result = run_log([ 'diff', @diffopts, "$test_src.stdout", "$test.out" ], + '>>', $diffs_file); ok($result, "pg_bsd_indent output matches for $test"); } diff --git a/src/tools/pg_bsd_indent/tests/comments.pro b/src/tools/pg_bsd_indent/tests/comments.pro index 0959711b3d2b6..ce818772931d4 100644 --- a/src/tools/pg_bsd_indent/tests/comments.pro +++ b/src/tools/pg_bsd_indent/tests/comments.pro @@ -1 +1 @@ --bbb \ No newline at end of file +-bbb diff --git a/src/tools/pg_bsd_indent/tests/elsecomment.pro b/src/tools/pg_bsd_indent/tests/elsecomment.pro index 115c4768e790d..84cf83a1ea27f 100644 --- a/src/tools/pg_bsd_indent/tests/elsecomment.pro +++ b/src/tools/pg_bsd_indent/tests/elsecomment.pro @@ -1 +1 @@ --bl \ No newline at end of file +-bl diff --git a/src/tools/pg_bsd_indent/tests/label.pro b/src/tools/pg_bsd_indent/tests/label.pro index 75d1fe1a12d8d..09d814950dfa7 100644 --- a/src/tools/pg_bsd_indent/tests/label.pro +++ b/src/tools/pg_bsd_indent/tests/label.pro @@ -1 +1 @@ --nut \ No newline at end of file +-nut diff --git a/src/tools/pg_bsd_indent/tests/nsac.pro b/src/tools/pg_bsd_indent/tests/nsac.pro index 6bcbd2b1ffaae..5008f470c9096 100644 --- a/src/tools/pg_bsd_indent/tests/nsac.pro +++ b/src/tools/pg_bsd_indent/tests/nsac.pro @@ -1 +1 @@ --nsac \ No newline at end of file +-nsac diff --git a/src/tools/pg_bsd_indent/tests/sac.pro b/src/tools/pg_bsd_indent/tests/sac.pro index 2b21505c72039..c4182ed13949d 100644 --- a/src/tools/pg_bsd_indent/tests/sac.pro +++ b/src/tools/pg_bsd_indent/tests/sac.pro @@ -1 +1 @@ --sac \ No newline at end of file +-sac diff --git a/src/tools/pg_bsd_indent/tests/surplusbad.pro b/src/tools/pg_bsd_indent/tests/surplusbad.pro index e828c8191c01d..b3fe0943ec66a 100644 --- a/src/tools/pg_bsd_indent/tests/surplusbad.pro +++ b/src/tools/pg_bsd_indent/tests/surplusbad.pro @@ -1 +1 @@ --bad \ No newline at end of file +-bad diff --git a/src/tools/pg_bsd_indent/tests/types_from_file.list b/src/tools/pg_bsd_indent/tests/types_from_file.list index 5f733616b1b48..0e1677a9785e5 100644 --- a/src/tools/pg_bsd_indent/tests/types_from_file.list +++ b/src/tools/pg_bsd_indent/tests/types_from_file.list @@ -1,2 +1,2 @@ b -a \ No newline at end of file +a diff --git a/src/tools/pg_bsd_indent/tests/types_from_file.pro b/src/tools/pg_bsd_indent/tests/types_from_file.pro index 39eb911980d9c..16c84ac6d05b1 100644 --- a/src/tools/pg_bsd_indent/tests/types_from_file.pro +++ b/src/tools/pg_bsd_indent/tests/types_from_file.pro @@ -1 +1 @@ --Utypes_from_file.list \ No newline at end of file +-Utypes_from_file.list diff --git a/src/tools/pginclude/README b/src/tools/pginclude/README index 712eca76fb33c..a685940da952c 100644 --- a/src/tools/pginclude/README +++ b/src/tools/pginclude/README @@ -1,10 +1,11 @@ src/tools/pginclude/README -NOTE: headerscheck and cpluspluscheck are in current use, and any -problems they find should generally get fixed. The other scripts -in this directory have not been used in some time, and have issues. -pgrminclude in particular has a history of creating more problems -than it fixes. Be very wary of applying their results blindly. +NOTE: headerscheck and headerscheck --cplusplus are in current use, +and any problems they find should generally get fixed. The other +scripts in this directory have not been used in some time, and have +issues. pgrminclude in particular has a history of creating more +problems than it fixes. Be very wary of applying their results +blindly. pginclude @@ -84,16 +85,17 @@ prerequisite, even if postgres_fe.h or c.h would be more appropriate. Also note that the contents of macros are not checked; this is intentional. -cpluspluscheck -============== +headerscheck --cplusplus +======================== -This script can be run to verify that all Postgres include files meet -the project convention that they will compile as C++ code. Although -the project's coding language is C, some people write extensions in C++, -so it's helpful for include files to be C++-clean. +The headerscheck in --cplusplus mode can be run to verify that all +Postgres include files meet the project convention that they will +compile as C++ code. Although the project's coding language is C, +some people write extensions in C++, so it's helpful for include files +to be C++-clean. A small number of header files are exempted from this requirement, -and are skipped by the cpluspluscheck script. +and are skipped by the script in the --cplusplus mode. The easy way to run the script is to say "make -s cpluspluscheck" in the top-level build directory after completing a build. You should diff --git a/src/tools/pginclude/cpluspluscheck b/src/tools/pginclude/cpluspluscheck deleted file mode 100755 index 4e09c4686b30b..0000000000000 --- a/src/tools/pginclude/cpluspluscheck +++ /dev/null @@ -1,222 +0,0 @@ -#!/bin/sh - -# Check (almost) all PostgreSQL include files for C++ compatibility. -# -# Argument 1 is the top-level source directory, argument 2 the -# top-level build directory (they might be the same). If not set, they -# default to the current directory. -# -# Needs to be run after configuring and creating all generated headers. -# It's advisable to configure --with-perl --with-python, else you're -# likely to get errors from associated headers. -# -# No output if everything is OK, else compiler errors. -# -# src/tools/pginclude/cpluspluscheck -# Copyright (c) 2009-2023, PostgreSQL Global Development Group - -if [ -z "$1" ]; then - srcdir="." -else - srcdir="$1" -fi - -if [ -z "$2" ]; then - builddir="." -else - builddir="$2" -fi - -me=`basename $0` - -# These switches are g++ specific, you may override if necessary. -CXXFLAGS=${CXXFLAGS:- -fsyntax-only -Wall} - -# Pull some info from configure's results. -MGLOB="$builddir/src/Makefile.global" -CPPFLAGS=`sed -n 's/^CPPFLAGS[ ]*=[ ]*//p' "$MGLOB"` -CXX=`sed -n 's/^CXX[ ]*=[ ]*//p' "$MGLOB"` -perl_includespec=`sed -n 's/^perl_includespec[ ]*=[ ]*//p' "$MGLOB"` -python_includespec=`sed -n 's/^python_includespec[ ]*=[ ]*//p' "$MGLOB"` - -# Extract any -I and -D switches from CPPFLAGS. -# (If necessary, user can pass more switches by presetting EXTRAFLAGS.) -for flag in $CPPFLAGS; do - case $flag in - -I*|-D*) EXTRAFLAGS="$EXTRAFLAGS $flag";; - esac -done - -# Create temp directory. -tmp=`mktemp -d /tmp/$me.XXXXXX` - -trap "ret=$?; rm -rf $tmp; exit $ret" 0 1 2 3 15 - -exit_status=0 - -# Scan all of src/ and contrib/ for header files. -for f in `cd "$srcdir" && find src contrib -name '*.h' -print` -do - # Ignore files that are unportable or intentionally not standalone. - - # These files are platform-specific, and c.h will include the - # one that's relevant for our current platform anyway. - test "$f" = src/include/port/aix.h && continue - test "$f" = src/include/port/cygwin.h && continue - test "$f" = src/include/port/darwin.h && continue - test "$f" = src/include/port/freebsd.h && continue - test "$f" = src/include/port/linux.h && continue - test "$f" = src/include/port/netbsd.h && continue - test "$f" = src/include/port/openbsd.h && continue - test "$f" = src/include/port/solaris.h && continue - test "$f" = src/include/port/win32.h && continue - - # Additional Windows-specific headers. - test "$f" = src/include/port/win32_port.h && continue - test "$f" = src/include/port/win32/netdb.h && continue - test "$f" = src/include/port/win32/sys/resource.h && continue - test "$f" = src/include/port/win32/sys/socket.h && continue - test "$f" = src/include/port/win32_msvc/dirent.h && continue - test "$f" = src/include/port/win32_msvc/utime.h && continue - test "$f" = src/include/port/win32ntdll.h && continue - test "$f" = src/port/pthread-win32.h && continue - - # Likewise, these files are platform-specific, and the one - # relevant to our platform will be included by atomics.h. - test "$f" = src/include/port/atomics/arch-arm.h && continue - test "$f" = src/include/port/atomics/arch-hppa.h && continue - test "$f" = src/include/port/atomics/arch-ppc.h && continue - test "$f" = src/include/port/atomics/arch-x86.h && continue - test "$f" = src/include/port/atomics/fallback.h && continue - test "$f" = src/include/port/atomics/generic.h && continue - test "$f" = src/include/port/atomics/generic-acc.h && continue - test "$f" = src/include/port/atomics/generic-gcc.h && continue - test "$f" = src/include/port/atomics/generic-msvc.h && continue - test "$f" = src/include/port/atomics/generic-sunpro.h && continue - - # sepgsql.h depends on headers that aren't there on most platforms. - test "$f" = contrib/sepgsql/sepgsql.h && continue - - # nodetags.h cannot be included standalone: it's just a code fragment. - test "$f" = src/include/nodes/nodetags.h && continue - test "$f" = src/backend/nodes/nodetags.h && continue - - # These files are not meant to be included standalone, because - # they contain lists that might have multiple use-cases. - test "$f" = src/include/access/rmgrlist.h && continue - test "$f" = src/include/parser/kwlist.h && continue - test "$f" = src/pl/plpgsql/src/pl_reserved_kwlist.h && continue - test "$f" = src/pl/plpgsql/src/pl_unreserved_kwlist.h && continue - test "$f" = src/interfaces/ecpg/preproc/c_kwlist.h && continue - test "$f" = src/interfaces/ecpg/preproc/ecpg_kwlist.h && continue - test "$f" = src/include/regex/regerrs.h && continue - test "$f" = src/include/tcop/cmdtaglist.h && continue - test "$f" = src/pl/plpgsql/src/plerrcodes.h && continue - test "$f" = src/pl/plpython/spiexceptions.h && continue - test "$f" = src/pl/tcl/pltclerrcodes.h && continue - - # Also not meant to be included standalone. - test "$f" = src/include/common/unicode_nonspacing_table.h && continue - test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue - - # We can't make these Bison output files compilable standalone - # without using "%code require", which old Bison versions lack. - # parser/gram.h will be included by parser/gramparse.h anyway. - test "$f" = contrib/cube/cubeparse.h && continue - test "$f" = contrib/seg/segparse.h && continue - test "$f" = src/backend/bootstrap/bootparse.h && continue - test "$f" = src/backend/parser/gram.h && continue - test "$f" = src/backend/replication/repl_gram.h && continue - test "$f" = src/backend/replication/syncrep_gram.h && continue - test "$f" = src/backend/utils/adt/jsonpath_gram.h && continue - test "$f" = src/bin/pgbench/exprparse.h && continue - test "$f" = src/pl/plpgsql/src/pl_gram.h && continue - test "$f" = src/interfaces/ecpg/preproc/preproc.h && continue - test "$f" = src/test/isolation/specparse.h && continue - - # ppport.h is not under our control, so we can't make it standalone. - test "$f" = src/pl/plperl/ppport.h && continue - - # regression.h is not actually C, but ECPG code. - test "$f" = src/interfaces/ecpg/test/regression.h && continue - # printf_hack.h produces "unused function" warnings. - test "$f" = src/interfaces/ecpg/test/printf_hack.h && continue - - # pg_trace.h and utils/probes.h can include sys/sdt.h from SystemTap, - # which itself contains C++ code and so won't compile with a C++ - # compiler under extern "C" linkage. - test "$f" = src/include/pg_trace.h && continue - test "$f" = src/include/utils/probes.h && continue - - # pg_dump is not C++-clean because it uses "public" and "namespace" - # as field names, which is unfortunate but we won't change it now. - test "$f" = src/bin/pg_dump/compress_gzip.h && continue - test "$f" = src/bin/pg_dump/compress_io.h && continue - test "$f" = src/bin/pg_dump/compress_lz4.h && continue - test "$f" = src/bin/pg_dump/compress_none.h && continue - test "$f" = src/bin/pg_dump/compress_zstd.h && continue - test "$f" = src/bin/pg_dump/parallel.h && continue - test "$f" = src/bin/pg_dump/pg_backup_archiver.h && continue - test "$f" = src/bin/pg_dump/pg_dump.h && continue - - # OK, create .c file to include this .h file. - { - echo 'extern "C" {' - # Ideally we'd pre-include only the appropriate one of - # postgres.h, postgres_fe.h, or c.h. We don't always have enough - # info to guess which, but in some subdirectories there's a - # reasonable choice to make, and otherwise we use postgres.h. - # Also, those three files should compile with no pre-include, as - # should src/interfaces headers meant to be exposed to clients. - case "$f" in - src/include/postgres.h) ;; - src/include/postgres_fe.h) ;; - src/include/c.h) ;; - src/interfaces/libpq/libpq-fe.h) ;; - src/interfaces/libpq/libpq-events.h) ;; - src/interfaces/ecpg/ecpglib/ecpglib_extern.h) - echo '#include "postgres_fe.h"' ;; - src/interfaces/ecpg/ecpglib/*) ;; - src/interfaces/*) - echo '#include "postgres_fe.h"' ;; - src/bin/*) - echo '#include "postgres_fe.h"' ;; - src/fe_utils/*) - echo '#include "postgres_fe.h"' ;; - src/port/*) ;; - src/common/*) - echo '#include "c.h"' ;; - *) - echo '#include "postgres.h"' ;; - esac - echo "#include \"$f\"" - echo '};' - } >$tmp/test.cpp - - # Some subdirectories need extra -I switches. - case "$f" in - src/pl/plperl/*) - EXTRAINCLUDES="$perl_includespec" ;; - src/pl/plpython/*) - EXTRAINCLUDES="$python_includespec" ;; - src/interfaces/ecpg/*) - EXTRAINCLUDES="-I $builddir/src/interfaces/ecpg/include -I $srcdir/src/interfaces/ecpg/include" ;; - src/backend/parser/*) - EXTRAINCLUDES="-I $builddir/src/backend/parser/" ;; - src/backend/utils/adt/*) - EXTRAINCLUDES="-I $builddir/src/backend/utils/adt/" ;; - *) - EXTRAINCLUDES="" ;; - esac - - # Run the test. - if ! ${CXX:-g++} -I $builddir -I $srcdir \ - -I $builddir/src/include -I $srcdir/src/include \ - -I $builddir/src/interfaces/libpq -I $srcdir/src/interfaces/libpq \ - $EXTRAINCLUDES $EXTRAFLAGS $CXXFLAGS -c $tmp/test.cpp - then - exit_status=1 - fi -done - -exit $exit_status diff --git a/src/tools/pginclude/headerscheck b/src/tools/pginclude/headerscheck index 8dee1b56709d0..e40ad6a538627 100755 --- a/src/tools/pginclude/headerscheck +++ b/src/tools/pginclude/headerscheck @@ -13,7 +13,15 @@ # No output if everything is OK, else compiler errors. # # src/tools/pginclude/headerscheck -# Copyright (c) 2009-2023, PostgreSQL Global Development Group +# Copyright (c) 2009-2024, PostgreSQL Global Development Group + +# option to check for C++ compatibility +if [ "$1" = "--cplusplus" ]; then + cplusplus=true + shift +else + cplusplus=false +fi if [ -z "$1" ]; then srcdir="." @@ -29,11 +37,15 @@ fi me=`basename $0` +# These switches are g++ specific, you may override if necessary. +CXXFLAGS=${CXXFLAGS:- -fsyntax-only -Wall} + # Pull some info from configure's results. MGLOB="$builddir/src/Makefile.global" CPPFLAGS=`sed -n 's/^CPPFLAGS[ ]*=[ ]*//p' "$MGLOB"` CFLAGS=`sed -n 's/^CFLAGS[ ]*=[ ]*//p' "$MGLOB"` CC=`sed -n 's/^CC[ ]*=[ ]*//p' "$MGLOB"` +CXX=`sed -n 's/^CXX[ ]*=[ ]*//p' "$MGLOB"` PG_SYSROOT=`sed -n 's/^PG_SYSROOT[ ]*=[ ]*//p' "$MGLOB"` perl_includespec=`sed -n 's/^perl_includespec[ ]*=[ ]*//p' "$MGLOB"` python_includespec=`sed -n 's/^python_includespec[ ]*=[ ]*//p' "$MGLOB"` @@ -43,6 +55,22 @@ CPPFLAGS=`echo "$CPPFLAGS" | sed "s|\\\$(PG_SYSROOT)|$PG_SYSROOT|g"` # (EXTRAFLAGS is not set here, but user can pass it in if need be.) +if $cplusplus; then + ext=cpp + COMPILER=${CXX:-g++} + # Extract any -I and -D switches from CPPFLAGS. + for flag in $CPPFLAGS; do + case $flag in + -I*|-D*) CXXPPFLAGS="$CXXPPFLAGS $flag";; + esac + done + COMPILER_FLAGS="$CXXPPFLAGS $CXXFLAGS" +else + ext=c + COMPILER=${CC:-gcc} + COMPILER_FLAGS="$CPPFLAGS $CFLAGS" +fi + # Create temp directory. tmp=`mktemp -d /tmp/$me.XXXXXX` @@ -57,7 +85,6 @@ do # These files are platform-specific, and c.h will include the # one that's relevant for our current platform anyway. - test "$f" = src/include/port/aix.h && continue test "$f" = src/include/port/cygwin.h && continue test "$f" = src/include/port/darwin.h && continue test "$f" = src/include/port/freebsd.h && continue @@ -70,6 +97,7 @@ do # Additional Windows-specific headers. test "$f" = src/include/port/win32_port.h && continue test "$f" = src/include/port/win32/netdb.h && continue + $cplusplus && test "$f" = src/include/port/win32/sys/resource.h && continue test "$f" = src/include/port/win32/sys/socket.h && continue test "$f" = src/include/port/win32_msvc/dirent.h && continue test "$f" = src/include/port/win32_msvc/utime.h && continue @@ -105,6 +133,7 @@ do test "$f" = src/interfaces/ecpg/preproc/c_kwlist.h && continue test "$f" = src/interfaces/ecpg/preproc/ecpg_kwlist.h && continue test "$f" = src/include/regex/regerrs.h && continue + test "$f" = src/include/storage/lwlocklist.h && continue test "$f" = src/include/tcop/cmdtaglist.h && continue test "$f" = src/pl/plpgsql/src/plerrcodes.h && continue test "$f" = src/pl/plpython/spiexceptions.h && continue @@ -114,6 +143,9 @@ do test "$f" = src/include/common/unicode_nonspacing_table.h && continue test "$f" = src/include/common/unicode_east_asian_fw_table.h && continue + test "$f" = src/include/catalog/syscache_ids.h && continue + test "$f" = src/include/catalog/syscache_info.h && continue + # We can't make these Bison output files compilable standalone # without using "%code require", which old Bison versions lack. # parser/gram.h will be included by parser/gramparse.h anyway. @@ -130,7 +162,10 @@ do test "$f" = src/test/isolation/specparse.h && continue # This produces a "no previous prototype" warning. - test "$f" = src/include/storage/checksum_impl.h && continue + ! $cplusplus && test "$f" = src/include/storage/checksum_impl.h && continue + + # SectionMemoryManager.h is C++ + test "$f" = src/include/jit/SectionMemoryManager.h && continue # ppport.h is not under our control, so we can't make it standalone. test "$f" = src/pl/plperl/ppport.h && continue @@ -140,8 +175,28 @@ do # printf_hack.h produces "unused function" warnings. test "$f" = src/interfaces/ecpg/test/printf_hack.h && continue + if $cplusplus; then + # pg_trace.h and utils/probes.h can include sys/sdt.h from SystemTap, + # which itself contains C++ code and so won't compile with a C++ + # compiler under extern "C" linkage. + test "$f" = src/include/pg_trace.h && continue + test "$f" = src/include/utils/probes.h && continue + + # pg_dump is not C++-clean because it uses "public" and "namespace" + # as field names, which is unfortunate but we won't change it now. + test "$f" = src/bin/pg_dump/compress_gzip.h && continue + test "$f" = src/bin/pg_dump/compress_io.h && continue + test "$f" = src/bin/pg_dump/compress_lz4.h && continue + test "$f" = src/bin/pg_dump/compress_none.h && continue + test "$f" = src/bin/pg_dump/compress_zstd.h && continue + test "$f" = src/bin/pg_dump/parallel.h && continue + test "$f" = src/bin/pg_dump/pg_backup_archiver.h && continue + test "$f" = src/bin/pg_dump/pg_dump.h && continue + fi + # OK, create .c file to include this .h file. { + $cplusplus && echo 'extern "C" {' # Ideally we'd pre-include only the appropriate one of # postgres.h, postgres_fe.h, or c.h. We don't always have enough # info to guess which, but in some subdirectories there's a @@ -170,7 +225,8 @@ do echo '#include "postgres.h"' ;; esac echo "#include \"$f\"" - } >$tmp/test.c + $cplusplus && echo '};' + } >$tmp/test.$ext # Some subdirectories need extra -I switches. case "$f" in @@ -189,10 +245,10 @@ do esac # Run the test. - if ! ${CC:-gcc} $CPPFLAGS $CFLAGS -I $builddir -I $srcdir \ + if ! $COMPILER $COMPILER_FLAGS -I $builddir -I $srcdir \ -I $builddir/src/include -I $srcdir/src/include \ -I $builddir/src/interfaces/libpq -I $srcdir/src/interfaces/libpq \ - $EXTRAINCLUDES $EXTRAFLAGS -c $tmp/test.c -o $tmp/test.o + $EXTRAINCLUDES $EXTRAFLAGS -c $tmp/test.$ext -o $tmp/test.o then exit_status=1 fi diff --git a/src/tools/pginclude/pgcheckdefines b/src/tools/pginclude/pgcheckdefines index a9fe79ebe5854..096bbbe876798 100755 --- a/src/tools/pginclude/pgcheckdefines +++ b/src/tools/pginclude/pgcheckdefines @@ -1,6 +1,6 @@ #! /usr/bin/perl -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group # # This script looks for symbols that are referenced in #ifdef or defined() @@ -23,7 +23,7 @@ # use strict; -use warnings; +use warnings FATAL => 'all'; use Cwd; use File::Basename; diff --git a/src/tools/pgindent/README b/src/tools/pgindent/README index f5fdfc5d2ff10..b6cd4c6f6b768 100644 --- a/src/tools/pgindent/README +++ b/src/tools/pgindent/README @@ -1,8 +1,9 @@ pgindent'ing the PostgreSQL source tree ======================================= -We run this process at least once in each development cycle, -to maintain uniform layout style in our C and Perl code. +pgindent is used to maintain uniform layout style in our C and Perl code, +and should be run for every commit. There are additional code beautification +tasks which should be performed at least once per release cycle. You might find this blog post interesting: http://adpgtech.blogspot.com/2015/05/running-pgindent-on-non-core-code-or.html @@ -25,45 +26,31 @@ PREREQUISITES: Or if you have cpanm installed, you can just use: cpanm https://cpan.metacpan.org/authors/id/S/SH/SHANCOCK/Perl-Tidy-20230309.tar.gz -DOING THE INDENT RUN: -1) Change directory to the top of the source tree. - -2) Download the latest typedef file from the buildfarm: +DOING THE INDENT RUN BEFORE A NORMAL COMMIT: - wget -O src/tools/pgindent/typedefs.list https://buildfarm.postgresql.org/cgi-bin/typedefs.pl - - (See https://buildfarm.postgresql.org/cgi-bin/typedefs.pl?show_list for a full - list of typedef files, if you want to indent some back branch.) +1) Change directory to the top of the source tree. -3) Run pgindent on the C files: +2) Run pgindent on the C files: src/tools/pgindent/pgindent . If any files generate errors, restore their original versions with "git checkout", and see below for cleanup ideas. -4) Indent the Perl code using perltidy: - - src/tools/pgindent/pgperltidy . - - If you want to use some perltidy version that's not in your PATH, - first set the PERLTIDY environment variable to point to it. - -5) Reformat the bootstrap catalog data files: - - ./configure # "make" will not work in an unconfigured tree - cd src/include/catalog - make reformat-dat-files - cd ../../.. - -VALIDATION: - -1) Check for any newly-created files using "git status"; there shouldn't +3) Check for any newly-created files using "git status"; there shouldn't be any. (pgindent leaves *.BAK files behind if it has trouble, while perltidy leaves *.LOG files behind.) -2) Do a full test build: +4) If pgindent wants to change anything your commit wasn't touching, + stop and figure out why. If it is making ugly whitespace changes + around typedefs your commit adds, you need to add those typedefs + to src/tools/pgindent/typedefs.list. + +5) If you have the patience, it's worth eyeballing the "git diff" output + for any egregiously ugly changes. See below for cleanup ideas. + +6) Do a full test build: make -s clean make -s all # look for unexpected warnings, and errors of course @@ -75,14 +62,38 @@ VALIDATION: header files that get copied into ecpg output; if so, adjust the expected-files to match. -3) If you have the patience, it's worth eyeballing the "git diff" output - for any egregiously ugly changes. See below for cleanup ideas. +AT LEAST ONCE PER RELEASE CYCLE: + +1) Download the latest typedef file from the buildfarm: + + wget -O src/tools/pgindent/typedefs.list https://buildfarm.postgresql.org/cgi-bin/typedefs.pl + + This step resolves any differences between the incrementally updated + version of the file and a clean, autogenerated one. + (See https://buildfarm.postgresql.org/cgi-bin/typedefs.pl?show_list for + a full list of typedef files, if you want to indent some back branch.) + +2) Run pgindent as above. + +3) Indent the Perl code using perltidy: + + src/tools/pgindent/pgperltidy . + + If you want to use some perltidy version that's not in your PATH, + first set the PERLTIDY environment variable to point to it. + +4) Reformat the bootstrap catalog data files: + + ./configure # "make" will not work in an unconfigured tree + cd src/include/catalog + make reformat-dat-files + cd ../../.. -When you're done, "git commit" everything including the typedefs.list file -you used. +5) When you're done, "git commit" everything including the typedefs.list file + you used. -4) Add the newly created commits to the .git-blame-ignore-revs file so +6) Add the newly created commit(s) to the .git-blame-ignore-revs file so that "git blame" ignores the commits (for anybody that has opted-in to using the ignore file). Follow the instructions that appear at the top of the .git-blame-ignore-revs file. @@ -104,7 +115,6 @@ the comment block with some dashes: /*---------- * Text here will not be touched by pgindent. - *---------- */ Odd spacing around typedef names might indicate an incomplete typedefs list. diff --git a/src/tools/pgindent/exclude_file_patterns b/src/tools/pgindent/exclude_file_patterns index 6405a005118ab..4976a373f9e53 100644 --- a/src/tools/pgindent/exclude_file_patterns +++ b/src/tools/pgindent/exclude_file_patterns @@ -4,14 +4,21 @@ src/include/storage/s_lock\.h$ src/include/port/atomics/ # -# This contains C++ constructs that confuse pgindent. +# These contain C++ constructs that confuse pgindent. src/include/jit/llvmjit\.h$ +src/include/jit/SectionMemoryManager\.h$ # # These are generated files with incomplete code fragments that # confuse pgindent. src/backend/nodes/\w+\.funcs\.c$ src/backend/nodes/\w+\.switch\.c$ # +# These are generated by generate-wait_event_types.pl, whose format +# looks worse with pgindent. +src/backend/utils/activity/pgstat_wait_event\.c$ +src/backend/utils/activity/wait_event_funcs_data\.c$ +src/backend/utils/activity/wait_event_types\.h$ +# # This confuses pgindent, and it's a derived file anyway. src/backend/utils/fmgrtab\.c$ # diff --git a/src/tools/pgindent/pgindent b/src/tools/pgindent/pgindent index bce63d95daf62..028d057ea44f0 100755 --- a/src/tools/pgindent/pgindent +++ b/src/tools/pgindent/pgindent @@ -1,13 +1,13 @@ #!/usr/bin/perl -# Copyright (c) 2021-2023, PostgreSQL Global Development Group +# Copyright (c) 2021-2024, PostgreSQL Global Development Group use strict; -use warnings; +use warnings FATAL => 'all'; use Cwd qw(abs_path getcwd); use File::Find; -use File::Spec qw(devnull); +use File::Spec; use File::Temp; use IO::Handle; use Getopt::Long; @@ -22,8 +22,8 @@ my $indent_opts = my $devnull = File::Spec->devnull; my ($typedefs_file, $typedef_str, @excludes, - $indent, $build, $show_diff, - $silent_diff, $help, @commits,); + $indent, $build, $diff, + $check, $help, @commits,); $help = 0; @@ -34,15 +34,12 @@ my %options = ( "list-of-typedefs=s" => \$typedef_str, "excludes=s" => \@excludes, "indent=s" => \$indent, - "show-diff" => \$show_diff, - "silent-diff" => \$silent_diff,); + "diff" => \$diff, + "check" => \$check,); GetOptions(%options) || usage("bad command line argument"); usage() if $help; -usage("Cannot have both --silent-diff and --show-diff") - if $silent_diff && $show_diff; - usage("Cannot use --commit with command line file list") if (@commits && @ARGV); @@ -83,12 +80,14 @@ my $filtered_typedefs_fh; sub check_indent { - system("$indent -? < $devnull > $devnull 2>&1"); - if ($? >> 8 != 1) + if (system("$indent -? < $devnull > $devnull 2>&1") != 0) { - print STDERR - "You do not appear to have $indent installed on your system.\n"; - exit 1; + if ($? >> 8 != 1) + { + print STDERR + "You do not appear to have $indent installed on your system.\n"; + exit 1; + } } if (`$indent --version` !~ m/ $INDENT_VERSION /) @@ -98,8 +97,7 @@ sub check_indent exit 1; } - system("$indent -gnu < $devnull > $devnull 2>&1"); - if ($? == 0) + if (system("$indent -gnu < $devnull > $devnull 2>&1") == 0) { print STDERR "You appear to have GNU indent rather than BSD indent.\n"; @@ -286,7 +284,7 @@ sub run_indent unlink "$filename.BAK"; - open(my $src_out, '<', $filename); + open(my $src_out, '<', $filename) || die $!; local ($/) = undef; $source = <$src_out>; close($src_out); @@ -294,7 +292,7 @@ sub run_indent return $source; } -sub show_diff +sub diff { my $indented = shift; my $source_filename = shift; @@ -323,8 +321,8 @@ Options: --list-of-typedefs=STR string containing typedefs, space separated --excludes=PATH file containing list of filename patterns to ignore --indent=PATH path to pg_bsd_indent program - --show-diff show the changes that would be made - --silent-diff exit with status 2 if any changes would be made + --diff show the changes that would be made + --check exit with status 2 if any changes would be made The --excludes and --commit options can be given more than once. EOF if ($help) @@ -375,6 +373,7 @@ warn "No files to process" unless @files; process_exclude(); my %processed; +my $status = 0; foreach my $source_filename (@files) { @@ -417,19 +416,24 @@ foreach my $source_filename (@files) if ($source ne $orig_source) { - if ($silent_diff) + if (!$diff && !$check) { - exit 2; - } - elsif ($show_diff) - { - print show_diff($source, $source_filename); + write_source($source, $source_filename); } else { - write_source($source, $source_filename); + if ($diff) + { + print diff($source, $source_filename); + } + + if ($check) + { + $status = 2; + last unless $diff; + } } } } -exit 0; +exit $status; diff --git a/src/tools/pgindent/pgindent.man b/src/tools/pgindent/pgindent.man index fe411ee699c1f..caab5cde91407 100644 --- a/src/tools/pgindent/pgindent.man +++ b/src/tools/pgindent/pgindent.man @@ -31,13 +31,13 @@ find the file src/tools/pgindent/exclude_file_patterns. The --excludes option can be used more than once to specify multiple files containing exclusion patterns. -There are also two non-destructive modes of pgindent. If given the --show-diff +There are also two non-destructive modes of pgindent. If given the --diff option pgindent will show the changes it would make, but doesn't actually make -them. If given instead the --silent-diff option, pgindent will exit with a -status of 2 if it finds any indent changes are required, but will not -make the changes or give any other information. This mode is intended for -possible use in a git pre-commit hook. An example of its use in a git hook -can be seen at https://wiki.postgresql.org/wiki/Working_with_Git#Using_git_hooks +them. If given instead the --check option, pgindent will exit with a status of +2 if it finds any indent changes are required, but will not make the changes. +This mode is intended for possible use in a git pre-commit hook. The --check +and --diff options can be combined. An example of its use in a git hook can be +seen at https://wiki.postgresql.org/wiki/Working_with_Git#Using_git_hooks Any non-option arguments are taken as the names of files to be indented. In this case only these files will be changed, and nothing else will be touched. diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 260854747b4a3..72e6d3a9865ab 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -85,6 +85,7 @@ AlterOwnerStmt AlterPolicyStmt AlterPublicationAction AlterPublicationStmt +AlterReplicationSlotCmd AlterRoleSetStmt AlterRoleStmt AlterSeqStmt @@ -97,6 +98,7 @@ AlterTSConfigurationStmt AlterTSDictionaryStmt AlterTableCmd AlterTableMoveAllStmt +AlterTablePass AlterTableSpaceOptionsStmt AlterTableStmt AlterTableType @@ -148,8 +150,8 @@ ArrayIOData ArrayIterator ArrayMapState ArrayMetaState -ArrayParseState ArraySubWorkspace +ArrayToken ArrayType AsyncQueueControl AsyncQueueEntry @@ -171,7 +173,6 @@ AutoVacOpts AutoVacuumShmemStruct AutoVacuumWorkItem AutoVacuumWorkItemType -AuxProcType BF_ctx BF_key BF_word @@ -207,8 +208,10 @@ BTPageStat BTPageState BTParallelScanDesc BTPendingFSM +BTReadPageState BTScanInsert BTScanInsertData +BTScanKeyPreproc BTScanOpaque BTScanOpaqueData BTScanPos @@ -228,8 +231,8 @@ BUF_MEM BYTE BY_HANDLE_FILE_INFORMATION Backend -BackendId BackendParameters +BackendStartupData BackendState BackendType BackgroundWorker @@ -241,7 +244,6 @@ Barrier BaseBackupCmd BaseBackupTargetHandle BaseBackupTargetType -BasicArchiveData BeginDirectModify_function BeginForeignInsert_function BeginForeignModify_function @@ -271,10 +273,19 @@ BlockId BlockIdData BlockInfoRecord BlockNumber +BlockRefTable +BlockRefTableBuffer +BlockRefTableChunk +BlockRefTableEntry +BlockRefTableKey +BlockRefTableReader +BlockRefTableSerializedEntry +BlockRefTableWriter BlockSampler BlockSamplerData BlockedProcData BlockedProcsData +BlocktableEntry BloomBuildState BloomFilter BloomMetaPageData @@ -296,17 +307,22 @@ BooleanTest BpChar BrinBuildState BrinDesc +BrinInsertState +BrinLeader BrinMemTuple BrinMetaPageData BrinOpaque BrinOpcInfo BrinOptions BrinRevmap +BrinShared +BrinSortTuple BrinSpecialSpace BrinStatsData BrinTuple BrinValues BtreeCheckState +BtreeLastVisibleEntry BtreeLevel Bucket BufFile @@ -319,6 +335,7 @@ BufferDesc BufferDescPadded BufferHeapTupleTableSlot BufferLookupEnt +BufferManagerRelation BufferStrategyControl BufferTag BufferUsage @@ -326,6 +343,10 @@ BuildAccumulator BuiltinScript BulkInsertState BulkInsertStateData +BulkWriteBuffer +BulkWriteState +BumpBlock +BumpContext CACHESIGN CAC_state CCFastEqualFN @@ -354,10 +375,12 @@ CallStmt CancelRequestPacket Cardinality CaseExpr +CaseKind CaseTestExpr CaseWhen Cash CastInfo +CatCInProgress CatCList CatCTup CatCache @@ -379,6 +402,7 @@ ClientCertMode ClientCertName ClientConnectionInfo ClientData +ClientSocket ClonePtrType ClosePortalStmt ClosePtrType @@ -469,8 +493,11 @@ CopyFromState CopyFromStateData CopyHeaderChoice CopyInsertMethod +CopyLogVerbosityChoice +CopyMethod CopyMultiInsertBuffer CopyMultiInsertInfo +CopyOnErrorChoice CopySource CopyStmt CopyToState @@ -543,9 +570,14 @@ DR_intorel DR_printtup DR_sqlfunction DR_transientrel +DSMRegistryCtxStruct +DSMRegistryEntry DWORD +DataDirSyncMethod DataDumperPtr DataPageDeleteStack +DataTypesUsageChecks +DataTypesUsageVersionCheck DatabaseInfo DateADT DateTimeErrorExtra @@ -586,6 +618,7 @@ DiscardMode DiscardStmt DistanceValue DistinctExpr +DoState DoStmt DocRepresentation DomainConstraintCache @@ -697,6 +730,7 @@ ExplainForeignModify_function ExplainForeignScan_function ExplainFormat ExplainOneQuery_hook_type +ExplainSerializeOption ExplainState ExplainStmt ExplainWorkersState @@ -713,7 +747,6 @@ ExprEvalStep ExprSetupInfo ExprState ExprStateEvalFunc -ExtendBufferedWhat ExtensibleNode ExtensibleNodeEntry ExtensibleNodeMethods @@ -737,11 +770,15 @@ FetchStmt FieldSelect FieldStore File +FileBackupMethod FileFdwExecutionState FileFdwPlanState FileNameMap FileSet FileTag +FilterCommandType +FilterObjectType +FilterStateData FinalPathExtraData FindColsContext FindSplitData @@ -834,6 +871,7 @@ FormData_pg_ts_parser FormData_pg_ts_template FormData_pg_type FormData_pg_user_mapping +FormExtraData_pg_attribute Form_pg_aggregate Form_pg_am Form_pg_amop @@ -1019,6 +1057,7 @@ GrantRoleStmt GrantStmt GrantTargetType Group +GroupByOrdering GroupClause GroupPath GroupPathExtraData @@ -1140,9 +1179,11 @@ ImportForeignSchemaType ImportForeignSchema_function ImportQual InProgressEnt +InProgressIO IncludeWal InclusionOpaque IncrementVarSublevelsUp_context +IncrementalBackupInfo IncrementalSort IncrementalSortExecutionStatus IncrementalSortGroupInfo @@ -1192,6 +1233,13 @@ InheritableSocket InitSampleScan_function InitializeDSMForeignScan_function InitializeWorkerForeignScan_function +InjectionPointCacheEntry +InjectionPointCallback +InjectionPointCondition +InjectionPointConditionType +InjectionPointEntry +InjectionPointsCtl +InjectionPointSharedState InlineCodeBlock InsertStmt Instrumentation @@ -1203,6 +1251,7 @@ IntegerSet InternalDefaultACL InternalGrant Interval +IntervalAggState IntoClause InvalMessageArray InvalidationMsgsGroup @@ -1217,6 +1266,7 @@ IsForeignScanParallelSafe_function IsoConnInfo IspellDict Item +ItemArray ItemId ItemIdData ItemPointer @@ -1250,17 +1300,25 @@ JsObject JsValue JsonAggConstructor JsonAggState +JsonArgument JsonArrayAgg JsonArrayConstructor JsonArrayQueryConstructor JsonBaseObjectInfo +JsonBehavior +JsonBehaviorType JsonConstructorExpr JsonConstructorExprState JsonConstructorType JsonEncoding +JsonExpr +JsonExprOp +JsonExprState JsonFormat JsonFormatType +JsonFuncExpr JsonHashEntry +JsonIncrementalState JsonIsPredicate JsonIterateStringValuesAction JsonKeyValue @@ -1268,6 +1326,7 @@ JsonLexContext JsonLikeRegexContext JsonManifestFileField JsonManifestParseContext +JsonManifestParseIncrementalState JsonManifestParseState JsonManifestSemanticState JsonManifestWALRangeField @@ -1276,10 +1335,14 @@ JsonObjectConstructor JsonOutput JsonParseContext JsonParseErrorType +JsonParseExpr +JsonParserStack JsonPath JsonPathBool +JsonPathCountVarsCallback JsonPathExecContext JsonPathExecResult +JsonPathGetVarCallback JsonPathGinAddPathItemFunc JsonPathGinContext JsonPathGinExtractNodesFunc @@ -1294,8 +1357,24 @@ JsonPathParseItem JsonPathParseResult JsonPathPredicateCallback JsonPathString +JsonPathVariable +JsonQuotes JsonReturning +JsonScalarExpr JsonSemAction +JsonSerializeExpr +JsonTable +JsonTableColumn +JsonTableColumnType +JsonTableExecContext +JsonTableParseContext +JsonTablePath +JsonTablePathScan +JsonTablePathSpec +JsonTablePlan +JsonTablePlanRowSource +JsonTablePlanState +JsonTableSiblingJoin JsonTokenType JsonTransformStringValuesAction JsonTypeCategory @@ -1308,6 +1387,7 @@ JsonValueExpr JsonValueList JsonValueListIterator JsonValueType +JsonWrapper Jsonb JsonbAggState JsonbContainer @@ -1318,7 +1398,6 @@ JsonbIteratorToken JsonbPair JsonbParseState JsonbSubWorkspace -JsonbTypeCategory JsonbValue JumbleState JunkFilter @@ -1337,6 +1416,7 @@ LINE LLVMAttributeRef LLVMBasicBlockRef LLVMBuilderRef +LLVMContextRef LLVMErrorRef LLVMIntPredicate LLVMJITEventListenerRef @@ -1392,7 +1472,6 @@ LPVOID LPWSTR LSEG LUID -LVPagePruneState LVRelState LVSavedErrInfo LWLock @@ -1498,7 +1577,10 @@ LogicalRepStreamAbortData LogicalRepTupleData LogicalRepTyp LogicalRepWorker +LogicalRepWorkerType LogicalRewriteMappingData +LogicalSlotInfo +LogicalSlotInfoArr LogicalTape LogicalTapeSet LsnReadQueue @@ -1520,6 +1602,8 @@ MVDependencies MVDependency MVNDistinct MVNDistinctItem +ManyTestResource +ManyTestResourceKind Material MaterialPath MaterialState @@ -1548,9 +1632,11 @@ MergeAppendState MergeJoin MergeJoinClause MergeJoinState +MergeMatchKind MergePath MergeScanSelCache MergeStmt +MergeSupportFunc MergeWhenClause MetaCommand MinMaxAggInfo @@ -1611,7 +1697,6 @@ Node NodeTag NonEmptyRange Notification -NotificationHash NotificationList NotifyStmt Nsrt @@ -1646,7 +1731,6 @@ ObjectAddressAndFlags ObjectAddressExtra ObjectAddressStack ObjectAddresses -ObjectClass ObjectPropertyType ObjectType ObjectWithArgs @@ -1656,8 +1740,6 @@ OffsetVarNodes_context Oid OidOptions OkeysState -OldSnapshotControlData -OldSnapshotTimeMapping OldToNewMapping OldToNewMappingData OnCommitAction @@ -1684,8 +1766,6 @@ OuterJoinClauseInfo OutputPluginCallbacks OutputPluginOptions OutputPluginOutputType -OverrideSearchPath -OverrideStackEntry OverridingKind PACE_HEADER PACL @@ -1741,6 +1821,7 @@ PG_Locale_Strategy PG_Lock_Status PG_init_t PGcancel +PGcancelConn PGcmdQueueEntry PGconn PGdataValue @@ -1913,7 +1994,6 @@ ParallelHashJoinBatch ParallelHashJoinBatchAccessor ParallelHashJoinState ParallelIndexScanDesc -ParallelReadyList ParallelSlot ParallelSlotArray ParallelSlotResultHandler @@ -1937,6 +2017,7 @@ ParamsErrorCbData ParentMapEntry ParseCallbackState ParseExprKind +ParseLoc ParseNamespaceColumn ParseNamespaceItem ParseParamRefHook @@ -1999,6 +2080,7 @@ PendingFsyncEntry PendingRelDelete PendingRelSync PendingUnlinkEntry +PendingWrite PendingWriteback PerLockTagEntry PerlInterpreter @@ -2133,6 +2215,7 @@ PrivTarget PrivateRefCountEntry ProcArrayStruct ProcLangInfo +ProcNumber ProcSignalBarrierType ProcSignalHeader ProcSignalReason @@ -2151,6 +2234,8 @@ ProjectionPath PromptInterruptContext ProtocolVersion PrsStorage +PruneFreezeResult +PruneReason PruneState PruneStepResult PsqlScanCallbacks @@ -2244,13 +2329,17 @@ ReInitializeDSMForeignScan_function ReScanForeignScan_function ReadBufPtrType ReadBufferMode +ReadBuffersOperation ReadBytePtrType ReadExtraTocPtrType ReadFunc ReadLocalXLogPageNoWaitPrivate ReadReplicationSlotCmd +ReadStream +ReadStreamBlockNumberCB ReassignOwnedStmt RecheckForeignScan_function +RecordCacheArrayEntry RecordCacheEntry RecordCompareData RecordIOData @@ -2304,6 +2393,7 @@ RelocationBufferInfo RelptrFreePageBtree RelptrFreePageManager RelptrFreePageSpanLeader +RemoteSlot RenameStmt ReopenPtrType ReorderBuffer @@ -2331,7 +2421,6 @@ ReorderBufferStreamTruncateCB ReorderBufferTXN ReorderBufferTXNByIdEnt ReorderBufferToastEnt -ReorderBufferTupleBuf ReorderBufferTupleCidEnt ReorderBufferTupleCidKey ReorderBufferUpdateProgressTxnCB @@ -2354,11 +2443,13 @@ ReplicationStateOnDisk ResTarget ReservoirState ReservoirStateData -ResourceArray +ResourceElem ResourceOwner +ResourceOwnerDesc ResourceReleaseCallback ResourceReleaseCallbackItem ResourceReleasePhase +ResourceReleasePriority RestoreOptions RestorePass RestrictInfo @@ -2397,6 +2488,7 @@ RuleLock RuleStmt RunningTransactions RunningTransactionsData +SASLStatus SC_HANDLE SECURITY_ATTRIBUTES SECURITY_STATUS @@ -2462,6 +2554,9 @@ ScanState ScanTypeControl ScannerCallbackState SchemaQuery +SearchPathCacheEntry +SearchPathCacheKey +SearchPathMatcher SecBuffer SecBufferDesc SecLabelItem @@ -2480,6 +2575,8 @@ SerCommitSeqNo SerialControl SerialIOData SerializableXactHandle +SerializeDestReceiver +SerializeMetrics SerializedActiveRelMaps SerializedClientConnectionInfo SerializedRanges @@ -2558,6 +2655,7 @@ SlabBlock SlabContext SlabSlot SlotNumber +SlotSyncCtxStruct SlruCtl SlruCtlData SlruErrorCause @@ -2614,10 +2712,10 @@ SpecialJoinInfo SpinDelayStatus SplitInterval SplitLR +SplitPageLayout SplitPoint SplitTextOutputData SplitVar -SplitedPageLayout StackElem StartDataPtrType StartLOPtrType @@ -2639,6 +2737,7 @@ Step StopList StrategyNumber StreamCtl +StreamStopReason String StringInfo StringInfoData @@ -2648,6 +2747,7 @@ SubLinkType SubOpts SubPlan SubPlanState +SubRelInfo SubRemoveRels SubTransactionId SubXactCallback @@ -2667,6 +2767,7 @@ SubscriptingRefState Subscription SubscriptionInfo SubscriptionRelState +SummarizerReadLocalXLogPrivate SupportRequestCost SupportRequestIndexCondition SupportRequestOptimizeWindowClause @@ -2680,9 +2781,12 @@ SyncRepConfigData SyncRepStandbyData SyncRequestHandler SyncRequestType +SyncStandbySlotsConfigData +SyncingTablesState SysFKRelationship SysScanDesc SyscacheCallbackFunction +SysloggerStartupData SystemRowsSamplerData SystemSamplerData SystemTimeSamplerData @@ -2730,6 +2834,7 @@ TSQuerySign TSReadPointer TSTemplateInfo TSTernaryValue +TSTokenTypeItem TSTokenTypeStorage TSVector TSVectorBuildState @@ -2751,6 +2856,7 @@ TableFunc TableFuncRoutine TableFuncScan TableFuncScanState +TableFuncType TableInfo TableLikeClause TableSampleClause @@ -2775,9 +2881,11 @@ Tcl_NotifierProcs Tcl_Obj Tcl_Time TempNamespaceStatus +TestDSMRegistryStruct TestDecodingData TestDecodingTxnData TestSpec +TestValueType TextFreq TextPositionState TheLexeme @@ -2792,6 +2900,9 @@ TidRangeScan TidRangeScanState TidScan TidScanState +TidStore +TidStoreIter +TidStoreIterResult TimeADT TimeLineHistoryCmd TimeLineHistoryEntry @@ -2822,6 +2933,7 @@ TransactionState TransactionStateData TransactionStmt TransactionStmtKind +TransamVariablesData TransformInfo TransformJsonStringValuesState TransitionCaptureState @@ -2917,6 +3029,7 @@ UnresolvedTup UnresolvedTupData UpdateContext UpdateStmt +UploadManifestCmd UpperRelationKind UpperUniquePath UserAuth @@ -2925,7 +3038,7 @@ UserMapping UserOpts VacAttrStats VacAttrStatsP -VacDeadItems +VacDeadItemsInfo VacErrPhase VacObjFilter VacOptValue @@ -2944,8 +3057,6 @@ VarString VarStringSortSupport Variable VariableAssignHook -VariableCache -VariableCacheData VariableSetKind VariableSetStmt VariableShowStmt @@ -2986,7 +3097,11 @@ WSANETWORKEVENTS WSAPROTOCOL_INFO WaitEvent WaitEventActivity +WaitEventBufferPin WaitEventClient +WaitEventCustomCounterData +WaitEventCustomEntryByInfo +WaitEventCustomEntryByName WaitEventIO WaitEventIPC WaitEventSet @@ -2994,6 +3109,7 @@ WaitEventTimeout WaitPMResult WalCloseMethod WalCompression +WalInsertClass WalLevel WalRcvData WalRcvExecResult @@ -3007,6 +3123,9 @@ WalSnd WalSndCtlData WalSndSendDataCallback WalSndState +WalSummarizerData +WalSummaryFile +WalSummaryIO WalTimeSample WalUsage WalWriteMethod @@ -3022,6 +3141,7 @@ WindowDef WindowFunc WindowFuncExprState WindowFuncLists +WindowFuncRunCondition WindowObject WindowObjectData WindowStatePerAgg @@ -3029,6 +3149,7 @@ WindowStatePerAggData WindowStatePerFunc WithCheckOption WithClause +WordBoundaryNext WordEntry WordEntryIN WordEntryPos @@ -3119,14 +3240,18 @@ ZstdCompressorState _SPI_connection _SPI_plan __m128i +__m512i +__mmask64 __time64_t _dev_t _ino_t _locale_t _resultmap _stringlist +access_vector_t acquireLocksOnSubLinks_context add_nulling_relids_context +addFkConstraintSides adjust_appendrel_attrs_context allocfunc amadjustmembers_function @@ -3143,6 +3268,7 @@ amgetbitmap_function amgettuple_function aminitparallelscan_function aminsert_function +aminsertcleanup_function ammarkpos_function amoptions_function amparallelrescan_function @@ -3157,13 +3283,17 @@ assign_collations_context auth_password_hook_typ autovac_table av_relation +avc_cache avl_dbase avl_node avl_tree avw_dbase backslashResult +backup_file_entry +backup_file_hash backup_manifest_info backup_manifest_option +backup_wal_range base_yy_extra_type basebackup_options bbsink @@ -3190,12 +3320,15 @@ bbstreamer_tar_archiver bbstreamer_tar_parser bbstreamer_zstd_frame bgworker_main_type +bh_node_type binaryheap binaryheap_comparator bitmapword bits16 bits32 bits8 +blockreftable_hash +blockreftable_iterator bloom_filter boolKEY brin_column_state @@ -3205,12 +3338,17 @@ cached_re_str canonicalize_state cashKEY catalogid_hash +cb_cleanup_dir +cb_options +cb_tablespace +cb_tablespace_mapping check_agg_arguments_context check_function_callback check_network_data check_object_relabel_type check_password_hook_type check_ungrouped_columns_context +child_process_kind chr cmpEntriesArg codes_t @@ -3218,6 +3356,7 @@ collation_cache_entry color colormaprange compare_context +config_handle config_var_value contain_aggs_of_level_context contain_placeholder_references_context @@ -3269,6 +3408,7 @@ dsa_segment_header dsa_segment_index dsa_segment_map dshash_compare_function +dshash_copy_function dshash_hash dshash_hash_function dshash_parameters @@ -3294,8 +3434,10 @@ emit_log_hook_type eval_const_expressions_context exec_thread_arg execution_state +exit_function explain_get_index_name_hook_type f_smgr +fasthash_state fd_set fe_scram_state fe_scram_state_enum @@ -3310,6 +3452,7 @@ fill_string_relopt finalize_primnode_context find_dependent_phvs_context find_expr_references_context +fireRIRonSubLink_context fix_join_expr_context fix_scan_expr_context fix_upper_expr_context @@ -3391,6 +3534,7 @@ indexed_tlist inet inetKEY inet_struct +initRowMethod init_function inline_cte_walker_context inline_error_callback_arg @@ -3406,12 +3550,14 @@ int32_t int64 int64KEY int8 +int8x16_t internalPQconninfoOption intptr_t intset_internal_node intset_leaf_node intset_node intvKEY +io_callback_fn io_stat_col itemIdCompact itemIdCompactData @@ -3420,11 +3566,15 @@ jmp_buf join_search_hook_type json_aelem_action json_manifest_error_callback -json_manifest_perfile_callback -json_manifest_perwalrange_callback +json_manifest_per_file_callback +json_manifest_per_wal_range_callback +json_manifest_system_identifier_callback +json_manifest_version_callback json_ofield_action json_scalar_action json_struct_action +keepwal_entry +keepwal_hash keyEntryData key_t lclContext @@ -3438,6 +3588,8 @@ list_sort_comparator local_relopt local_relopts local_source +local_ts_iter +local_ts_radix_tree locale_t locate_agg_of_level_context locate_var_of_level_context @@ -3456,10 +3608,12 @@ macKEY macaddr macaddr8 macaddr_sortsupport_state +manifest_data manifest_file manifest_files_hash manifest_files_iterator manifest_wal_range +manifest_writer map_variable_attnos_context max_parallel_hazard_context mb2wchar_with_len_converter @@ -3471,6 +3625,7 @@ mbstr_verifier memoize_hash memoize_iterator metastring +missing_cache_key mix_data_t mixedStruct mode_t @@ -3483,7 +3638,9 @@ needs_fmgr_hook_type network_sortsupport_state nodeitem normal_rand_fctx +nsphash_hash ntile_context +nullingrel_info numeric object_access_hook_type object_access_hook_type_str @@ -3504,14 +3661,19 @@ pairingheap_node pam_handle_t parallel_worker_main_type parse_error_callback_arg -parser_context partition_method_t +pe_test_config +pe_test_escape_func +pe_test_vector pendingPosition +pending_label pgParameterStatus pg_atomic_flag pg_atomic_uint32 pg_atomic_uint64 pg_be_sasl_mech +pg_case_map +pg_category_range pg_checksum_context pg_checksum_raw_context pg_checksum_type @@ -3527,7 +3689,6 @@ pg_cryptohash_errno pg_cryptohash_type pg_ctype_cache pg_enc -pg_enc2gettext pg_enc2name pg_encname pg_fe_sasl_mech @@ -3543,6 +3704,9 @@ pg_md5_ctx pg_on_exit_callback pg_prng_state pg_re_flags +pg_regex_t +pg_regmatch_t +pg_regoff_t pg_saslprep_rc pg_sha1_ctx pg_sha224_ctx @@ -3556,11 +3720,15 @@ pg_time_usec_t pg_tz pg_tz_cache pg_tzenum +pg_unicode_category pg_unicode_decompinfo pg_unicode_decomposition pg_unicode_norminfo pg_unicode_normprops +pg_unicode_properties +pg_unicode_range pg_unicode_recompinfo +pg_usec_time_t pg_utf_to_local_combined pg_uuid_t pg_wc_probefunc @@ -3685,23 +3853,32 @@ remove_nulling_relids_context rendezvousHashEntry replace_rte_variables_callback replace_rte_variables_context +report_error_fn ret_type rewind_source rewrite_event rf_context +rfile rm_detail_t role_auth_extra rolename_hash row_security_policy_hook_type rsv_callback +rt_iter +rt_node_class_test_elem +rt_radix_tree saophash_hash save_buffer scram_state scram_state_enum +security_class_t sem_t +sepgsql_context_info_t sequence_magic set_join_pathlist_hook_type set_rel_pathlist_hook_type +shared_ts_iter +shared_ts_radix_tree shm_mq shm_mq_handle shm_mq_iovec @@ -3765,8 +3942,10 @@ string substitute_actual_parameters_context substitute_actual_srf_parameters_context substitute_phv_relids_context +subxids_array_status symbol tablespaceinfo +td_entry teSection temp_tablespaces_extra test_re_flags @@ -3808,6 +3987,7 @@ uid_t uint128 uint16 uint16_t +uint16x8_t uint32 uint32_t uint32x4_t @@ -3838,6 +4018,7 @@ varattrib_1b_e varattrib_4b vbits verifier_context +walrcv_alter_slot_fn walrcv_check_conninfo_fn walrcv_connect_fn walrcv_create_slot_fn @@ -3846,6 +4027,7 @@ walrcv_endstreaming_fn walrcv_exec_fn walrcv_get_backend_pid_fn walrcv_get_conninfo_fn +walrcv_get_dbname_from_conninfo_fn walrcv_get_senderinfo_fn walrcv_identify_system_fn walrcv_readtimelinehistoryfile_fn @@ -3860,6 +4042,8 @@ wint_t worker_state worktable wrap +ws_file_info +ws_options xl_brin_createidx xl_brin_desummarize xl_brin_insert @@ -3896,8 +4080,6 @@ xl_hash_update_meta_page xl_hash_vacuum_one_page xl_heap_confirm xl_heap_delete -xl_heap_freeze_page -xl_heap_freeze_plan xl_heap_header xl_heap_inplace xl_heap_insert @@ -3909,7 +4091,6 @@ xl_heap_prune xl_heap_rewrite_mapping xl_heap_truncate xl_heap_update -xl_heap_vacuum xl_heap_visible xl_invalid_page xl_invalid_page_key @@ -3949,10 +4130,14 @@ xl_xact_stats_items xl_xact_subxacts xl_xact_twophase xl_xact_xinfo +xlhp_freeze_plan +xlhp_freeze_plans +xlhp_prune_items xmlBuffer xmlBufferPtr xmlChar xmlDocPtr +xmlError xmlErrorPtr xmlExternalEntityLoader xmlGenericErrorFunc diff --git a/src/tools/pgtest b/src/tools/pgtest index fa665ff8172f5..080cf6ae761ef 100755 --- a/src/tools/pgtest +++ b/src/tools/pgtest @@ -18,9 +18,9 @@ trap "ret=$?; rm -rf /tmp/$$; exit $ret" 0 1 2 3 15 mkdir /tmp/$$ TMP="/tmp/$$" -if [ "X$1" != "X-n" ] +if [ "$1" != "-n" ] then CLEAN="Y" -else CLEAN="" +else CLEAN="N" shift fi @@ -29,22 +29,22 @@ rm -f tmp_install/log/install.log # Run "make check" and store return code in $TMP/ret. # Display output but also capture it in $TMP/0. ( - if [ "$CLEAN" ] + if [ "$CLEAN" = 'Y' ] then $MAKE "$@" clean 2>&1 - echo "$?" > $TMP/ret + echo "$?" > "$TMP"/ret fi - if [ $(cat $TMP/ret) -eq 0 ] + if [ "$(cat "$TMP"/ret)" -eq 0 ] then $MAKE "$@" 2>&1 && $MAKE "$@" check 2>&1 - echo "$?" > $TMP/ret + echo "$?" > "$TMP"/ret fi -) | tee $TMP/0 +) | tee "$TMP"/0 # Grab possible warnings from install.log -[ -e tmp_install/log/install.log ] && cat tmp_install/log/install.log >> $TMP/0 +[ -e tmp_install/log/install.log ] && cat tmp_install/log/install.log >> "$TMP"/0 # If success, display warnings -if [ $(cat $TMP/ret) -eq 0 ] -then cat $TMP/0 | +if [ "$(cat "$TMP"/ret)" -eq 0 ] +then cat "$TMP"/0 | # The following grep's have to be adjusted for your setup because # certain warnings are acceptable. grep -i warning | @@ -54,4 +54,4 @@ then cat $TMP/0 | fi # return original make error code -exit `cat $TMP/ret` +exit "$(cat "$TMP"/ret)" diff --git a/src/tools/testint128.c b/src/tools/testint128.c index 7f6680c642b46..4613ef0a50d45 100644 --- a/src/tools/testint128.c +++ b/src/tools/testint128.c @@ -6,7 +6,7 @@ * This is a standalone test program that compares the behavior of an * implementation in int128.h to an (assumed correct) int128 native type. * - * Copyright (c) 2017-2023, PostgreSQL Global Development Group + * Copyright (c) 2017-2024, PostgreSQL Global Development Group * * * IDENTIFICATION diff --git a/src/tools/testwrap b/src/tools/testwrap index 7a64fe76a2d79..9d4a878354034 100755 --- a/src/tools/testwrap +++ b/src/tools/testwrap @@ -12,6 +12,7 @@ parser.add_argument('--srcdir', help='source directory of test', type=str) parser.add_argument('--basedir', help='base directory of test', type=str) parser.add_argument('--testgroup', help='test group', type=str) parser.add_argument('--testname', help='test name', type=str) +parser.add_argument('--skip', help='skip test (with reason)', type=str) parser.add_argument('test_command', nargs='*') args = parser.parse_args() @@ -23,6 +24,10 @@ print('# executing test in {} group {} test {}'.format( testdir, args.testgroup, args.testname)) sys.stdout.flush() +if args.skip is not None: + print('1..0 # Skipped: ' + args.skip) + sys.exit(0) + if os.path.exists(testdir) and os.path.isdir(testdir): shutil.rmtree(testdir) os.makedirs(testdir) @@ -36,12 +41,23 @@ env_dict = {**os.environ, 'TESTDATADIR': os.path.join(testdir, 'data'), 'TESTLOGDIR': os.path.join(testdir, 'log')} -sp = subprocess.run(args.test_command, env=env_dict) - -if sp.returncode == 0: +sp = subprocess.Popen(args.test_command, env=env_dict, stdout=subprocess.PIPE) +# Meson categorizes a passing TODO test point as bad +# (https://github.com/mesonbuild/meson/issues/13183). Remove the TODO +# directive, so Meson computes the file result like Perl does. This could +# have the side effect of delaying stdout lines relative to stderr. That +# doesn't affect the log file, and the TAP protocol uses stdout only. +for line in sp.stdout: + if line.startswith(b'ok '): + line = line.replace(b' # TODO ', b' # testwrap-overridden-TODO ', 1) + sys.stdout.buffer.write(line) + sys.stdout.flush() +returncode = sp.wait() + +if returncode == 0: print('# test succeeded') open(os.path.join(testdir, 'test.success'), 'x') else: print('# test failed') open(os.path.join(testdir, 'test.fail'), 'x') -sys.exit(sp.returncode) +sys.exit(returncode) diff --git a/src/tools/version_stamp.pl b/src/tools/version_stamp.pl index 326da374be834..6f94aa02c024b 100755 --- a/src/tools/version_stamp.pl +++ b/src/tools/version_stamp.pl @@ -3,7 +3,7 @@ ################################################################# # version_stamp.pl -- update version stamps throughout the source tree # -# Copyright (c) 2008-2023, PostgreSQL Global Development Group +# Copyright (c) 2008-2024, PostgreSQL Global Development Group # # src/tools/version_stamp.pl ################################################################# @@ -21,11 +21,11 @@ # use strict; -use warnings; +use warnings FATAL => 'all'; # Major version is hard-wired into the script. We update it when we branch # a new development version. -my $majorversion = 16; +my $majorversion = 17; # Validate argument and compute derived variables my $minor = shift; diff --git a/src/tools/win32tzlist.pl b/src/tools/win32tzlist.pl index 657f7d4879c00..17d45b957058c 100755 --- a/src/tools/win32tzlist.pl +++ b/src/tools/win32tzlist.pl @@ -2,7 +2,7 @@ # # win32tzlist.pl -- compare Windows timezone information # -# Copyright (c) 2008-2023, PostgreSQL Global Development Group +# Copyright (c) 2008-2024, PostgreSQL Global Development Group # # src/tools/win32tzlist.pl ################################################################# @@ -16,9 +16,20 @@ # use strict; -use warnings; +use warnings FATAL => 'all'; -use Win32::Registry; +use Config; + +our $HKEY_LOCAL_MACHINE; + +BEGIN +{ + if ($Config{osname} eq 'MSWin32' || $Config{osname} eq 'msys') + { + require Win32::Registry; + Win32::Registry->import; + } +} my $tzfile = 'src/bin/initdb/findtimezone.c'; diff --git a/src/tutorial/complex.source b/src/tutorial/complex.source index cf1f93444372f..8dcff724d45f3 100644 --- a/src/tutorial/complex.source +++ b/src/tutorial/complex.source @@ -5,7 +5,7 @@ -- use this new type. -- -- --- Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +-- Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group -- Portions Copyright (c) 1994, Regents of the University of California -- -- src/tutorial/complex.source diff --git a/src/tutorial/syscat.source b/src/tutorial/syscat.source index 0e7bc7bde6c52..44d8602c72d09 100644 --- a/src/tutorial/syscat.source +++ b/src/tutorial/syscat.source @@ -4,7 +4,7 @@ -- sample queries to the system catalogs -- -- --- Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group +-- Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group -- Portions Copyright (c) 1994, Regents of the University of California -- -- src/tutorial/syscat.source